ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDIwZjMKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTE0IEBACisjIEFuZHJvaWQgbWFrZWZpbGUgZm9yIHRoZSBXTEFOIE1vZHVsZQorCisjIEFzc3VtZSBubyB0YXJnZXRzIHdpbGwgYmUgc3VwcG9ydGVkCitXTEFOX0NISVBTRVQgOj0KKworaWZlcSAoJChCT0FSRF9IQVNfUUNPTV9XTEFOKSwgdHJ1ZSkKKworIyBCdWlsZC9QYWNrYWdlIG9wdGlvbnMgZm9yIDgwODQvODA5Mi84OTYwLzg5OTIvODk5NCB0YXJnZXQKK2lmZXEgKCQoY2FsbCBpcy1ib2FyZC1wbGF0Zm9ybS1pbi1saXN0LCBhcHE4MDg0IG1wcTgwOTIgbXNtODk2MCBtc204OTkyIG1zbTg5OTQgbXNtODk5NiBtc204OTk4KSx0cnVlKQorCVdMQU5fQ0hJUFNFVCA6PSBxY2FfY2xkCisJV0xBTl9TRUxFQ1QgIDo9IENPTkZJR19RQ0FfQ0xEX1dMQU49bQorZW5kaWYgIyBwbGF0Zm9ybQorCisjIEJ1aWxkL1BhY2thZ2Ugb25seSBpbiBjYXNlIG9mIHN1cHBvcnRlZCB0YXJnZXQKK2lmbmVxICgkKFdMQU5fQ0hJUFNFVCksKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMgVGhpcyBtYWtlZmlsZSBpcyBvbmx5IGZvciBETEtNCitpZm5lcSAoJChmaW5kc3RyaW5nIHZlbmRvciwkKExPQ0FMX1BBVEgpKSwpCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgb3BlbnNvdXJjZSwkKExPQ0FMX1BBVEgpKSwpCisgICAgV0xBTl9QUk9QUklFVEFSWSA6PSAwCisgICAgV0xBTl9CTERfRElSIDo9IHZlbmRvci9xY29tL29wZW5zb3VyY2Uvd2xhbgorZWxzZQorICAgIFdMQU5fUFJPUFJJRVRBUlkgOj0gMQorICAgIFdMQU5fQkxEX0RJUiA6PSB2ZW5kb3IvcWNvbS9wcm9wcmlldGFyeS93bGFuLW5vc2hpcAorZW5kaWYgIyBvcGVuc291cmNlCisKKyMgRExLTV9ESVIgd2FzIG1vdmVkIGZvciBKRUxMWV9CRUFOIChQTEFURk9STV9TREsgMTYpCitpZmVxICgkKGNhbGwgaXMtcGxhdGZvcm0tc2RrLXZlcnNpb24tYXQtbGVhc3QsMTYpLHRydWUpCisgICAgICAgRExLTV9ESVIgOj0gJChUT1ApL2RldmljZS9xY29tL2NvbW1vbi9kbGttCitlbHNlCisgICAgICAgRExLTV9ESVIgOj0gYnVpbGQvZGxrbQorZW5kaWYgIyBwbGF0Zm9ybS1zZGstdmVyc2lvbgorCisjIENvcHkgV0NOU1NfY2ZnLmRhdCBhbmQgV0NOU1NfcWNvbV9jZmcuaW5pIGZpbGUgZnJvbSBmaXJtd2FyZV9iaW4vIGZvbGRlciB0byB0YXJnZXQgb3V0IGRpcmVjdG9yeS4KK2lmZXEgKCQoY2FsbCBpcy1ib2FyZC1wbGF0Zm9ybS1pbi1saXN0LCBtc204OTYwKSx0cnVlKQorJChzaGVsbCBybSAtZiAkKFRBUkdFVF9PVVRfRVRDKS9maXJtd2FyZS93bGFuL3FjYV9jbGQvV0NOU1NfY2ZnLmRhdCkKKyQoc2hlbGwgcm0gLWYgJChUQVJHRVRfT1VUX0VUQykvZmlybXdhcmUvd2xhbi9xY2FfY2xkL1dDTlNTX3Fjb21fY2ZnLmluaSkKKyQoc2hlbGwgY3AgJChMT0NBTF9QQVRIKS9maXJtd2FyZV9iaW4vV0NOU1NfY2ZnLmRhdCAkKFRBUkdFVF9PVVRfRVRDKS9maXJtd2FyZS93bGFuL3FjYV9jbGQpCiskKHNoZWxsIGNwICQoTE9DQUxfUEFUSCkvZmlybXdhcmVfYmluL1dDTlNTX3Fjb21fY2ZnLmluaSAkKFRBUkdFVF9PVVRfRVRDKS9maXJtd2FyZS93bGFuL3FjYV9jbGQpCitlbmRpZgorCisjIEJ1aWxkIHdsYW4ua28gYXMgJChXTEFOX0NISVBTRVQpX3dsYW4ua28KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgaXMgc2V0IG9uY2UgcGVyIExPQ0FMX1BBVEgsIG5vdCBwZXIgKGtlcm5lbCkgbW9kdWxlCitpZmVxICgkKFdMQU5fUFJPUFJJRVRBUlkpLDEpCisJS0JVSUxEX09QVElPTlMgOj0gV0xBTl9ST09UPS4uLyQoV0xBTl9CTERfRElSKS9xY2FjbGQtbmV3CitlbHNlCisJS0JVSUxEX09QVElPTlMgOj0gV0xBTl9ST09UPS4uLyQoV0xBTl9CTERfRElSKS9xY2FjbGQtMy4wCitlbmRpZiAjIFdMQU5fUFJPUFJJRVRBUlkKKyMgV2UgYXJlIGFjdHVhbGx5IGJ1aWxkaW5nIHdsYW4ua28gaGVyZSwgYXMgcGVyIHRoZQorIyByZXF1aXJlbWVudCB3ZSBhcmUgc3BlY2lmeWluZyA8Y2hpcHNldD5fd2xhbi5rbyBhcyBMT0NBTF9NT0RVTEUuCisjIFRoaXMgbWVhbnMgd2UgbmVlZCB0byByZW5hbWUgdGhlIG1vZHVsZSB0byA8Y2hpcHNldD5fd2xhbi5rbworIyBhZnRlciB3bGFuLmtvIGlzIGJ1aWx0LgorS0JVSUxEX09QVElPTlMgKz0gTU9ETkFNRT13bGFuCitLQlVJTERfT1BUSU9OUyArPSBCT0FSRF9QTEFURk9STT0kKFRBUkdFVF9CT0FSRF9QTEFURk9STSkKK0tCVUlMRF9PUFRJT05TICs9ICQoV0xBTl9TRUxFQ1QpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQoraWZlcSAoJChXTEFOX1BST1BSSUVUQVJZKSwxKQorCUxPQ0FMX01PRFVMRSAgICAgICAgICAgICAgOj0gcHJvcHJpZXRhcnlfJChXTEFOX0NISVBTRVQpX3dsYW4ua28KK2Vsc2UKKwlMT0NBTF9NT0RVTEUgICAgICAgICAgICAgIDo9ICQoV0xBTl9DSElQU0VUKV93bGFuLmtvCitlbmRpZiAjIFdMQU5fUFJPUFJJRVRBUlkKK0xPQ0FMX01PRFVMRV9LQlVJTERfTkFNRSAgOj0gd2xhbi5rbworTE9DQUxfTU9EVUxFX1RBR1MgICAgICAgICA6PSBkZWJ1ZworTE9DQUxfTU9EVUxFX0RFQlVHX0VOQUJMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUEFUSCAgICAgICAgIDo9ICQoVEFSR0VUX09VVCkvbGliL21vZHVsZXMvJChXTEFOX0NISVBTRVQpCitpbmNsdWRlICQoRExLTV9ESVIpL0FuZHJvaWRLZXJuZWxNb2R1bGUubWsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ3JlYXRlIFN5bWJvbGljIGxpbmsKK2lmZXEgKCQoV0xBTl9QUk9QUklFVEFSWSksMSkKKyQoc2hlbGwgbWtkaXIgLXAgJChUQVJHRVRfT1VUKS9saWIvbW9kdWxlczsgXAorICAgICAgICBsbiAtc2YgL3N5c3RlbS9saWIvbW9kdWxlcy8kKFdMQU5fQ0hJUFNFVCkvJChMT0NBTF9NT0RVTEUpIFwKKyAgICAgICAgICAgICAgICQoVEFSR0VUX09VVCkvbGliL21vZHVsZXMvd2xhbi5rbykKK2VuZGlmCiskKHNoZWxsIGxuIC1zZiAvcGVyc2lzdC93bGFuX21hYy5iaW4gJChUQVJHRVRfT1VUX0VUQykvZmlybXdhcmUvd2xhbi9xY2FfY2xkL3dsYW5fbWFjLmJpbikKKworaWZlcSAoJChjYWxsIGlzLWJvYXJkLXBsYXRmb3JtLWluLWxpc3QsIG1zbTg5NjApLHRydWUpCiskKHNoZWxsIGxuIC1zZiAvZmlybXdhcmUvaW1hZ2UvYmR3bGFuMjAuYmluICQoVEFSR0VUX09VVF9FVEMpL2Zpcm13YXJlL2Zha2Vib2FyLmJpbikKKyQoc2hlbGwgbG4gLXNmIC9maXJtd2FyZS9pbWFnZS9vdHAyMC5iaW4gJChUQVJHRVRfT1VUX0VUQykvZmlybXdhcmUvb3RwLmJpbikKKyQoc2hlbGwgbG4gLXNmIC9maXJtd2FyZS9pbWFnZS91dGYyMC5iaW4gJChUQVJHRVRfT1VUX0VUQykvZmlybXdhcmUvdXRmLmJpbikKKyQoc2hlbGwgbG4gLXNmIC9maXJtd2FyZS9pbWFnZS9xd2xhbjIwLmJpbiAkKFRBUkdFVF9PVVRfRVRDKS9maXJtd2FyZS9hdGh3bGFuLmJpbikKKworJChzaGVsbCBsbiAtc2YgL2Zpcm13YXJlL2ltYWdlL2Jkd2xhbjIwLmJpbiAkKFRBUkdFVF9PVVRfRVRDKS9maXJtd2FyZS9iZHdsYW4yMC5iaW4pCiskKHNoZWxsIGxuIC1zZiAvZmlybXdhcmUvaW1hZ2Uvb3RwMjAuYmluICQoVEFSR0VUX09VVF9FVEMpL2Zpcm13YXJlL290cDIwLmJpbikKKyQoc2hlbGwgbG4gLXNmIC9maXJtd2FyZS9pbWFnZS91dGYyMC5iaW4gJChUQVJHRVRfT1VUX0VUQykvZmlybXdhcmUvdXRmMjAuYmluKQorJChzaGVsbCBsbiAtc2YgL2Zpcm13YXJlL2ltYWdlL3F3bGFuMjAuYmluICQoVEFSR0VUX09VVF9FVEMpL2Zpcm13YXJlL3F3bGFuMjAuYmluKQorCiskKHNoZWxsIGxuIC1zZiAvZmlybXdhcmUvaW1hZ2UvYmR3bGFuMzAuYmluICQoVEFSR0VUX09VVF9FVEMpL2Zpcm13YXJlL2Jkd2xhbjMwLmJpbikKKyQoc2hlbGwgbG4gLXNmIC9maXJtd2FyZS9pbWFnZS9vdHAzMC5iaW4gJChUQVJHRVRfT1VUX0VUQykvZmlybXdhcmUvb3RwMzAuYmluKQorJChzaGVsbCBsbiAtc2YgL2Zpcm13YXJlL2ltYWdlL3V0ZjMwLmJpbiAkKFRBUkdFVF9PVVRfRVRDKS9maXJtd2FyZS91dGYzMC5iaW4pCiskKHNoZWxsIGxuIC1zZiAvZmlybXdhcmUvaW1hZ2UvcXdsYW4zMC5iaW4gJChUQVJHRVRfT1VUX0VUQykvZmlybXdhcmUvcXdsYW4zMC5iaW4pCitlbmRpZgorCisjIENvcHkgY29uZmlnIGluaSBmaWxlcyB0byB0YXJnZXQKKyNpZmVxICgkKGNhbGwgaXMtYm9hcmQtcGxhdGZvcm0taW4tbGlzdCwgbXNtODk5MiBtc204OTk0KSxmYWxzZSkKK2lmZXEgKCQoV0xBTl9QUk9QUklFVEFSWSksMSkKKyQoc2hlbGwgbWtkaXIgLXAgJChUQVJHRVRfT1VUKS9ldGMvZmlybXdhcmUvd2xhbi8kKFdMQU5fQ0hJUFNFVCkpCiskKHNoZWxsIG1rZGlyIC1wICQoVEFSR0VUX09VVCkvZXRjL3dpZmkpCiskKHNoZWxsIHJtIC1mICQoVEFSR0VUX09VVCkvZXRjL3dpZmkvV0NOU1NfcWNvbV9jZmcuaW5pKQorJChzaGVsbCBybSAtZiAkKFRBUkdFVF9PVVQpL2V0Yy9maXJtd2FyZS93bGFuLyQoV0xBTl9TSElQU0VUKS9XQ05TU19jZmcuZGF0KQorJChzaGVsbCBjcCAkKExPQ0FMX1BBVEgpL2NvbmZpZy9XQ05TU19xY29tX2NmZy5pbmkgJChUQVJHRVRfT1VUKS9ldGMvd2lmaSkKKyQoc2hlbGwgY3AgJChMT0NBTF9QQVRIKS9maXJtd2FyZV9iaW4vV0NOU1NfY2ZnLmRhdCAkKFRBUkdFVF9PVVQpL2V0Yy9maXJtd2FyZS93bGFuLyQoV0xBTl9DSElQU0VUKSkKK2VuZGlmCisjZW5kaWYKKworZW5kaWYgIyBETEtNIGNoZWNrCisKK2VuZGlmICMgc3VwcG9ydGVkIHRhcmdldCBjaGVjaworZW5kaWYgIyBXTEFOIGVuYWJsZWQgY2hlY2sKZGlmZiAtLWdpdCBhL0tidWlsZCBiL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQwNWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvS2J1aWxkCkBAIC0wLDAgKzEsMTMzMSBAQAorIyBXZSBjYW4gYnVpbGQgZWl0aGVyIGFzIHBhcnQgb2YgYSBzdGFuZGFsb25lIEtlcm5lbCBidWlsZCBvciBhcworIyBhbiBleHRlcm5hbCBtb2R1bGUuICBEZXRlcm1pbmUgd2hpY2ggbWVjaGFuaXNtIGlzIGJlaW5nIHVzZWQKK2lmZXEgKCQoTU9ETkFNRSksKQorCUtFUk5FTF9CVUlMRCA6PSAxCitlbHNlCisJS0VSTkVMX0JVSUxEIDo9IDAKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0NOU1MpLCB5KQoraWZuZGVmIENPTkZJR19ST01FX0lGCisJI3VzZSBwY2kgYXMgZGVmYXVsdCBpbnRlcmZhY2UKKwlDT05GSUdfUk9NRV9JRiA9IHBjaQorZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoS0VSTkVMX0JVSUxEKSwxKQorCSMgVGhlc2UgYXJlIHByb3ZpZGVkIGluIGV4dGVybmFsIG1vZHVsZSBiYXNlZCBidWlsZHMKKwkjIE5lZWQgdG8gZXhwbGljaXRseSBkZWZpbmUgZm9yIEtlcm5lbC1iYXNlZCBidWlsZHMKKwlNT0ROQU1FIDo9IHdsYW4KKwlXTEFOX1JPT1QgOj0gZHJpdmVycy9zdGFnaW5nL3FjYWNsZC0zLjAKK2VuZGlmCisKKyMgTWFrZSBXTEFOIGFzIG9wZW4tc291cmNlIGRyaXZlciBieSBkZWZhdWx0CitXTEFOX09QRU5fU09VUkNFIDo9IDEKKworaWZlcSAoJChLRVJORUxfQlVJTEQpLCAwKQorCSMgVGhlc2UgYXJlIGNvbmZpZ3VyYWJsZSB2aWEgS2NvbmZpZyBmb3Iga2VybmVsLWJhc2VkIGJ1aWxkcworCSMgTmVlZCB0byBleHBsaWNpdGx5IGNvbmZpZ3VyZSBmb3IgQW5kcm9pZC1iYXNlZCBidWlsZHMKKworCWlmZXEgKCQoQ09ORklHX0FSQ0hfTURNOTYzMCksIHkpCisJQ09ORklHX01PQklMRV9ST1VURVIgOj0geQorCWVuZGlmCisKKwlpZmVxICgkKENPTkZJR19BUkNIX01ETTk2NDApLCB5KQorCUNPTkZJR19NT0JJTEVfUk9VVEVSIDo9IHkKKwllbmRpZgorCisJI0ZsYWcgdG8gZW5hYmxlIExlZ2FjeSBGYXN0IFJvYW1pbmczKExGUjMpCisJQ09ORklHX1FDQUNMRF9XTEFOX0xGUjMgOj0geQorCisJI0pCIGtlcm5lbCBoYXMgUE1LU0EgcGF0Y2hlcywgaGVuY2UgZW5hYmxpbmcgdGhpcyBmbGFnCisJQ09ORklHX1BSSU1BX1dMQU5fT0tDIDo9IHkKKworCSMgSkIga2VybmVsIGhhcyBDUFUgZW5hYmxlbWVudCBwYXRjaGVzLCBzbyBlbmFibGUKKwlpZmVxICgkKENPTkZJR19ST01FX0lGKSxwY2kpCisJCUNPTkZJR19QUklNQV9XTEFOXzExQUNfSElHSF9UUCA6PSB5CisJZW5kaWYKKwlpZmVxICgkKENPTkZJR19ST01FX0lGKSx1c2IpCisJCUNPTkZJR19QUklNQV9XTEFOXzExQUNfSElHSF9UUCA6PSBuCisJZW5kaWYKKwlpZmVxICgkKENPTkZJR19ST01FX0lGKSxzZGlvKQorCQlDT05GSUdfUFJJTUFfV0xBTl8xMUFDX0hJR0hfVFAgOj0gbgorCWVuZGlmCisKKwlpZm5lcSAoJChDT05GSUdfTU9CSUxFX1JPVVRFUiksIHkpCisJI0ZsYWcgdG8gZW5hYmxlIFRETFMgZmVhdHVyZQorCUNPTkZJR19RQ09NX1RETFMgOj0geQorCWVuZGlmCisKKwlpZmVxICgkKENPTkZJR19NT0JJTEVfUk9VVEVSKSwgeSkKKwlDT05GSUdfUUNBQ0xEX0ZFQVRVUkVfR1JFRU5fQVAgOj0geQorCWVuZGlmCisKKwkjRmxhZyB0byBlbmFibGUgRmFzdCBUcmFuc2l0aW9uICgxMXIpIGZlYXR1cmUKKwlDT05GSUdfUUNPTV9WT1dJRklfMTFSIDo9IHkKKworCWlmbmVxICgkKENPTkZJR19RQ0FfQ0xEX1dMQU4pLCkKKwkgICAgICAgIGlmZXEgKCQoQ09ORklHX0NOU1MpLHkpCisJCSNGbGFnIHRvIGVuYWJsZSBQcm90ZWN0ZWQgTWFuYWdtZW50IEZyYW1lcyAoMTF3KSBmZWF0dXJlCisJCUNPTkZJR19XTEFOX0ZFQVRVUkVfMTFXIDo9IHkKKwkJI0ZsYWcgdG8gZW5hYmxlIExURSBDb0V4IGZlYXR1cmUKKwkJQ09ORklHX1FDT01fTFRFX0NPRVggOj0geQorCQkJaWZuZXEgKCQoQ09ORklHX01PQklMRV9ST1VURVIpLCB5KQorCQkJI0ZsYWcgdG8gZW5hYmxlIExQU1MgZmVhdHVyZQorCQkJQ09ORklHX1dMQU5fRkVBVFVSRV9MUFNTIDo9IHkKKwkJCWVuZGlmCisJCWVuZGlmCisJZW5kaWYKKworCisgICAgICAgICNGbGFnIHRvIGVuYWJsZSBQcm90ZWN0ZWQgTWFuYWdtZW50IEZyYW1lcyAoMTF3KSBmZWF0dXJlCisgICAgICAgIGlmZXEgKCQoQ09ORklHX1JPTUVfSUYpLHVzYikKKyAgICAgICAgICAgICAgICBDT05GSUdfV0xBTl9GRUFUVVJFXzExVyA6PSB5CisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgKCQoQ09ORklHX1JPTUVfSUYpLHNkaW8pCisgICAgICAgICAgICAgICAgQ09ORklHX1dMQU5fRkVBVFVSRV8xMVcgOj0geQorICAgICAgICBlbmRpZgorCisJaWZuZXEgKCQoQ09ORklHX01PQklMRV9ST1VURVIpLCB5KQorCQkjRmxhZyB0byBlbmFibGUgTkFOCisJCUNPTkZJR19RQ0FDTERfRkVBVFVSRV9OQU4gOj0geQorCWVuZGlmCisKKyAgICAgICAgI0ZsYWcgdG8gZW5hYmxlIExpbnV4IFFDTUJSIGZlYXR1cmUgYXMgZGVmYXVsdCBmZWF0dXJlCisgICAgICAgIGlmZXEgKCQoQ09ORklHX1JPTUVfSUYpLHVzYikKKyAgICAgICAgICAgICAgICBDT05GSUdfTElOVVhfUUNNQlIgOj15CisgICAgICAgIGVuZGlmCisKKyAgICAgICAgaWZlcSAoJChDT05GSUdfQ05TU19FT1MpLHkpCisgICAgICAgIENPTkZJR19GRUFUVVJFX0JNSV8yIDo9eQorICAgICAgICBlbmRpZgorCisJQ09ORklHX01QQ19VVF9GUkFNRVdPUksgOj0geQorCisJI0ZsYWcgdG8gZW5hYmxlIG9mZmxvYWQgcGFja2V0cyBmZWF0dXJlCisJQ09ORklHX1dMQU5fT0ZGTE9BRF9QQUNLRVRTIDo9IHkKKworCSNGbGFnIHRvIGVuYWJsZSBtZW1kdW1wIGZlYXR1cmUKKwlDT05GSUdfV0xBTl9GRUFUVVJFX01FTURVTVAgOj0geQorCisJI0ZsYWcgdG8gZW5hYmxlIEZhc3QgUGF0aCBmZWF0dXJlCisJQ09ORklHX1dMQU5fRkFTVFBBVEggOj0geQorCisJIyBGbGFnIHRvIGVuYWJsZSBOQVBJCisJQ09ORklHX1dMQU5fTkFQSSA6PSB5CisJQ09ORklHX1dMQU5fTkFQSV9ERUJVRyA6PSBuCisKKwkjIEZsYWcgdG8gZW5hYmxlIEZXIGJhc2VkIFRYIEZsb3cgY29udHJvbAorCUNPTkZJR19XTEFOX1RYX0ZMT1dfQ09OVFJPTF9WMiA6PSBuCisKKwkjIEZsYWcgdG8gZW5hYmxlIExSTyAoTGFyZ2UgUmVjZWl2ZSBPZmZsb2FkKQorCWlmZXEgKCQoQ09ORklHX0NOU1NfRU9TKSwgeSkKKwkJaWZlcSAoJChDT05GSUdfSU5FVF9MUk8pLCB5KQorCQkJQ09ORklHX1dMQU5fTFJPIDo9IHkKKwkJZWxzZQorCQkJQ09ORklHX1dMQU5fTFJPIDo9IG4KKwkJZW5kaWYKKwllbmRpZgorZW5kaWYKKworaWZuZXEgKCQoQ09ORklHX01PQklMRV9ST1VURVIpLCB5KQorIyBUbyBlbmFibGUgRVNFIHVwbG9hZCwgZGVwZW5kZW50IGNvbmZpZworIyBDT05GSUdfUUNPTV9FU0UgbXVzdCBiZSBlbmFibGVkLgorQ09ORklHX1FDT01fRVNFIDo9IHkKK0NPTkZJR19RQ09NX0VTRV9VUExPQUQgOj0geQorZW5kaWYKKworIyBGZWF0dXJlIGZsYWdzIHdoaWNoIGFyZSBub3QgKGN1cnJlbnRseSkgY29uZmlndXJhYmxlIHZpYSBLY29uZmlnCisKKyNXaGV0aGVyIHRvIGJ1aWxkIGRlYnVnIHZlcnNpb24KK0JVSUxEX0RFQlVHX1ZFUlNJT04gOj0gMQorCisjRW5hYmxlIHRoaXMgZmxhZyB0byBidWlsZCBkcml2ZXIgaW4gZGlhZyB2ZXJzaW9uCitCVUlMRF9ESUFHX1ZFUlNJT04gOj0gMQorCisjRG8gd2UgcGFuaWMgb24gYnVnPyAgZGVmYXVsdCBpcyB0byB3YXJuCitQQU5JQ19PTl9CVUcgOj0gMQorCisjRW5hYmxlIE9MIGRlYnVnIGFuZCB3bWkgdW5pZmllZCBmdW5jdGlvbnMKK0NPTkZJR19BVEhfUEVSRl9QV1JfT0ZGTE9BRCA6PSAxCisKKyNEaXNhYmxlIHBhY2tldCBsb2cKK0NPTkZJR19SRU1PVkVfUEtUX0xPRyA6PSAwCisKKyNFbmFibGUgMTFBQyBUWAoraWZlcSAoJChDT05GSUdfUk9NRV9JRikscGNpKQorCUNPTkZJR19BVEhfMTFBQ19UWENPTVBBQ1QgOj0gMQorZW5kaWYKK2lmZXEgKCQoQ09ORklHX1JPTUVfSUYpLHVzYikKKwlDT05GSUdfQVRIXzExQUNfVFhDT01QQUNUIDo9IDAKK2VuZGlmCisKKyNFbmFibGUgcGVyIHZkZXYgVHggZGVzYyBwb29sCitpZmVxICgkKENPTkZJR19ST01FX0lGKSxwY2kpCisJQ09ORklHX1BFUl9WREVWX1RYX0RFU0NfUE9PTCA6PSAwCitlbmRpZgoraWZlcSAoJChDT05GSUdfUk9NRV9JRiksdXNiKQorCUNPTkZJR19QRVJfVkRFVl9UWF9ERVNDX1BPT0wgOj0gMQorZW5kaWYKKworCisjRW5hYmxlIE9TIHNwZWNpZmljIElSUSBhYnN0cmFjdGlvbgorQ09ORklHX0FUSF9TVVBQT1JUX1NIQVJFRF9JUlEgOj0gMQorCisjRW5hYmxlIG1lc3NhZ2UgYmFzZWQgSElGIGluc3RlYWQgb2YgUkFXIGFjY2VzcyBpbiBCTUkKK2lmZXEgKCQoQ09ORklHX1FDQV9XSUZJX1NESU8pLCAxKQorQ09ORklHX0hJRl9NRVNTQUdFX0JBU0VEIDo9IDAKK2Vsc2UKK0NPTkZJR19ISUZfTUVTU0FHRV9CQVNFRCA6PSAxCitlbmRpZgorCisjRW5hYmxlIFBDSSBzcGVjaWZpYyBBUElTIChkbWEsIGV0YykKK2lmZXEgKCQoQ09ORklHX1JPTUVfSUYpLHBjaSkKKwlDT05GSUdfSElGX1BDSSA6PSAxCitlbmRpZgorCisjRW5hYmxlIHBjaSByZWFkL3dyaXRlIGNvbmZpZyBmdW5jdGlvbnMKK2lmZXEgKCQoQ09ORklHX1JPTUVfSUYpLHBjaSkKKwlDT05GSUdfQVRIX1BDSSA6PSAxCitlbmRpZgoraWZlcSAoJChDT05GSUdfUk9NRV9JRiksdXNiKQorI0NPTkZJR19BVEhfUENJIDo9IDEKK2VuZGlmCisKK2lmbmVxICgkKENPTkZJR19NT0JJTEVfUk9VVEVSKSwgeSkKKyNFbmFibGUgSUJTUyBzdXBwb3J0IG9uIENMRAorQ09ORklHX1FDQV9JQlNTX1NVUFBPUlQgOj0gMQorZW5kaWYKKworI0VuYWJsZSBwb3dlciBtYW5hZ2VtZW50IHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uYWxpdHkgdG8gUENJCitDT05GSUdfQVRIX0JVU19QTSA6PSAxCisKKyNFbmFibGUgRkxPV01BQyBtb2R1bGUgc3VwcG9ydAorQ09ORklHX0FUSF9TVVBQT1JUX0ZMT1dNQUNfTU9EVUxFIDo9IDAKKworI0VuYWJsZSBzcGVjdHJhbCBzdXBwb3J0CitDT05GSUdfQVRIX1NVUFBPUlRfU1BFQ1RSQUwgOj0gMAorCisjRW5hYmxlIEhPU1Qgc3RhdGlzdGljcyBzdXBwb3J0CitDT05GSUdfU1VQUE9SVF9IT1NUX1NUQVRJU1RJQ1MgOj0gMAorCisjRW5hYmxlIFdESSBFdmVudCBzdXBwb3J0CitDT05GSUdfV0RJX0VWRU5UX0VOQUJMRSA6PSAxCisKKyNFbmRpYW5lc3Mgc2VsZWN0aW9uCitDT05GSUdfTElUVExFX0VORElBTiA6PSAxCisKKyNFbmFibGUgVFggcmVjbGFpbSBzdXBwb3J0CitDT05GSUdfVFhfQ1JFRElUX1JFQ0xBSU1fU1VQUE9SVCA6PSAwCisKKyNFbmFibGUgRlRNIHN1cHBvcnQKK0NPTkZJR19RQ0FfV0lGSV9GVE0gOj0gMQorCisjRW5hYmxlIENoZWNrc3VtIE9mZmxvYWQKK0NPTkZJR19DSEVDS1NVTV9PRkZMT0FEIDo9IDEKKworI0VuYWJsZSBHVEsgb2ZmbG9hZAorQ09ORklHX0dUS19PRkZMT0FEIDo9IDEKKworI0VuYWJsZSBFWFQgV09XCitpZmVxICgkKENPTkZJR19ST01FX0lGKSxwY2kpCisJQ09ORklHX0VYVF9XT1cgOj0gMQorZW5kaWYKKworI1NldCB0aGlzIHRvIDEgdG8gY2F0Y2ggZXJyb25lb3VzIFRhcmdldCBhY2Nlc3NlcyBkdXJpbmcgZGVidWcuCitDT05GSUdfQVRIX1BDSUVfQUNDRVNTX0RFQlVHIDo9IDAKKworI0VuYWJsZSBJUEEgb2ZmbG9hZAoraWZlcSAoJChDT05GSUdfSVBBKSwgeSkKK0NPTkZJR19JUEFfT0ZGTE9BRCA6PSAxCitlbmRpZgorCisjRW5hYmxlIFNpZ25lZCBmaXJtd2FyZSBzdXBwb3J0IGZvciBzcGxpdCBiaW5hcnkgZm9ybWF0CitDT05GSUdfUUNBX1NJR05FRF9TUExJVF9CSU5BUllfU1VQUE9SVCA6PSAwCisKKyNFbmFibGUgc2luZ2xlIGZpcm13YXJlIGJpbmFyeSBmb3JtYXQKK0NPTkZJR19RQ0FfU0lOR0xFX0JJTkFSWV9TVVBQT1JUIDo9IDAKKworI0VuYWJsZSBjb2xsZWN0aW5nIHRhcmdldCBSQU0gZHVtcCBhZnRlciBrZXJuZWwgcGFuaWMKK0NPTkZJR19UQVJHRVRfUkFNRFVNUF9BRlRFUl9LRVJORUxfUEFOSUMgOj0gMQorCisjRmxhZyB0byBlbmFibGUvZGlzYWJsZSBzZWN1cmUgZmlybXdhcmUgZmVhdHVyZQorQ09ORklHX0ZFQVRVUkVfU0VDVVJFX0ZJUk1XQVJFIDo9IDAKKworI0ZsYWcgdG8gZW5hYmxlIFN0YXRzIEV4dCBpbXBsZW1lbnRhdGlvbgorQ09ORklHX0ZFQVRVUkVfU1RBVFNfRVhUIDo9IDEKKworI0ZsYWcgdG8gZm9yY2UgdGhlIGluY2x1c2lvbiBvZiB0aGUgODAyLjExcCBjaGFubmVscyBiZWNhdXNlIHN1cHBvcnQKKyNmb3IgdGhlc2UgY2hhbm5lbHMgaGFzIG5vdCB5ZXQgYmVlbiBhZGRlZCB0byB0aGUga2VybmVsLgorQ09ORklHX1NUQVRJQ0FMTFlfQUREXzExUF9DSEFOTkVMUyA6PSBuCisKK2lmZXEgKCQoQ09ORklHX0NGRzgwMjExKSx5KQorSEFWRV9DRkc4MDIxMSA6PSAxCitlbHNlCitpZmVxICgkKENPTkZJR19DRkc4MDIxMSksbSkKK0hBVkVfQ0ZHODAyMTEgOj0gMQorZWxzZQorSEFWRV9DRkc4MDIxMSA6PSAwCitlbmRpZgorZW5kaWYKKworIyMjIyMjIyMjIyMjIFVBUEkgIyMjIyMjIyMjIyMjCitVQVBJX0RJUiA6PQl1YXBpCitVQVBJX0lOQyA6PQktSSQoV0xBTl9ST09UKS8kKFVBUElfRElSKS9saW51eAorCisjIyMjIyMjIyMjIyMgQ09NTU9OICMjIyMjIyMjIyMjIworQ09NTU9OX0RJUiA6PQljb3JlL2NvbW1vbgorQ09NTU9OX0lOQyA6PQktSSQoV0xBTl9ST09UKS8kKENPTU1PTl9ESVIpCisKKyMjIyMjIyMjIyMjIyBIREQgIyMjIyMjIyMjIyMjCitIRERfRElSIDo9CWNvcmUvaGRkCitIRERfSU5DX0RJUiA6PQkkKEhERF9ESVIpL2luYworSEREX1NSQ19ESVIgOj0JJChIRERfRElSKS9zcmMKKworSEREX0lOQyA6PSAJLUkkKFdMQU5fUk9PVCkvJChIRERfSU5DX0RJUikgXAorCQktSSQoV0xBTl9ST09UKS8kKEhERF9TUkNfRElSKQorCitIRERfT0JKUyA6PSAJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfYXNzb2MubyBcCisJCSQoSEREX1NSQ19ESVIpL3dsYW5faGRkX2NmZy5vIFwKKwkJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfZGVidWdmcy5vIFwKKwkJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfZHJpdmVyX29wcy5vIFwKKwkJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfZnRtLm8gXAorCQkkKEhERF9TUkNfRElSKS93bGFuX2hkZF9ob3N0YXBkLm8gXAorCQkkKEhERF9TUkNfRElSKS93bGFuX2hkZF9pb2N0bC5vIFwKKwkJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfbWFpbi5vIFwKKwkJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfb2NiLm8gXAorCQkkKEhERF9TUkNfRElSKS93bGFuX2hkZF9vZW1kYXRhLm8gXAorCQkkKEhERF9TUkNfRElSKS93bGFuX2hkZF9wb3dlci5vIFwKKwkJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfc2Nhbi5vIFwKKwkJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfc29mdGFwX3R4X3J4Lm8gXAorCQkkKEhERF9TUkNfRElSKS93bGFuX2hkZF90eF9yeC5vIFwKKwkJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfdHJhY2UubyBcCisJCSQoSEREX1NSQ19ESVIpL3dsYW5faGRkX3dleHQubyBcCisJCSQoSEREX1NSQ19ESVIpL3dsYW5faGRkX3dtbS5vIFwKKwkJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfd293bC5vCisKK2lmZXEgKCQoQ09ORklHX1dMQU5fTFJPKSwgeSkKK0hERF9PQkpTICs9ICAgICAkKEhERF9TUkNfRElSKS93bGFuX2hkZF9scm8ubworZW5kaWYKKworaWZlcSAoJChDT05GSUdfV0xBTl9OQVBJKSwgeSkKK0hERF9PQkpTICs9ICAgICAkKEhERF9TUkNfRElSKS93bGFuX2hkZF9uYXBpLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0lQQV9PRkZMT0FEKSwgMSkKK0hERF9PQkpTICs9CSQoSEREX1NSQ19ESVIpL3dsYW5faGRkX2lwYS5vCitlbmRpZgorCitpZmVxICgkKEhBVkVfQ0ZHODAyMTEpLDEpCitIRERfT0JKUyArPQkkKEhERF9TUkNfRElSKS93bGFuX2hkZF9jZmc4MDIxMS5vIFwKKwkJJChIRERfU1JDX0RJUikvd2xhbl9oZGRfZXh0X3NjYW4ubyBcCisJCSQoSEREX1NSQ19ESVIpL3dsYW5faGRkX3N0YXRzLm8gXAorCQkkKEhERF9TUkNfRElSKS93bGFuX2hkZF9wMnAubworZW5kaWYKKworaWZlcSAoJChDT05GSUdfUUNBQ0xEX0ZFQVRVUkVfR1JFRU5fQVApLHkpCitIRERfT0JKUyArPQkkKEhERF9TUkNfRElSKS93bGFuX2hkZF9ncmVlbl9hcC5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19RQ0FDTERfRkVBVFVSRV9OQU4pLHkpCitIRERfT0JKUyArPQkkKEhERF9TUkNfRElSKS93bGFuX2hkZF9uYW4ubworZW5kaWYKKworaWZlcSAoJChDT05GSUdfUUNPTV9URExTKSx5KQorSEREX09CSlMgKz0JJChIRERfU1JDX0RJUikvd2xhbl9oZGRfdGRscy5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19NUENfVVRfRlJBTUVXT1JLKSx5KQorSEREX09CSlMgKz0JJChIRERfU1JDX0RJUikvd2xhbl9oZGRfY29uY191dC5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19XTEFOX0ZFQVRVUkVfTUVNRFVNUCkseSkKK0hERF9PQkpTICs9ICQoSEREX1NSQ19ESVIpL3dsYW5faGRkX21lbWR1bXAubworZW5kaWYKKworIyMjIyMjIyMjIyMgSE9TVCBESUFHIExPRyAjIyMjIyMjIyMjIworSE9TVF9ESUFHX0xPR19ESVIgOj0JY29yZS91dGlscy9ob3N0X2RpYWdfbG9nCisKK0hPU1RfRElBR19MT0dfSU5DX0RJUiA6PQkkKEhPU1RfRElBR19MT0dfRElSKS9pbmMKK0hPU1RfRElBR19MT0dfU1JDX0RJUiA6PQkkKEhPU1RfRElBR19MT0dfRElSKS9zcmMKKworSE9TVF9ESUFHX0xPR19JTkMgOj0JLUkkKFdMQU5fUk9PVCkvJChIT1NUX0RJQUdfTE9HX0lOQ19ESVIpIFwKKwkJCS1JJChXTEFOX1JPT1QpLyQoSE9TVF9ESUFHX0xPR19TUkNfRElSKQorCitIT1NUX0RJQUdfTE9HX09CSlMgKz0JJChIT1NUX0RJQUdfTE9HX1NSQ19ESVIpL2hvc3RfZGlhZ19sb2cubworCisjIyMjIyMjIyMjIyMgRVBQSU5HICMjIyMjIyMjIyMjIworRVBQSU5HX0RJUiA6PQljb3JlL3V0aWxzL2VwcGluZworRVBQSU5HX0lOQ19ESVIgOj0JJChFUFBJTkdfRElSKS9pbmMKK0VQUElOR19TUkNfRElSIDo9CSQoRVBQSU5HX0RJUikvc3JjCisKK0VQUElOR19JTkMgOj0gCS1JJChXTEFOX1JPT1QpLyQoRVBQSU5HX0lOQ19ESVIpCisKK0VQUElOR19PQkpTIDo9ICQoRVBQSU5HX1NSQ19ESVIpL2VwcGluZ19tYWluLm8gXAorCQkkKEVQUElOR19TUkNfRElSKS9lcHBpbmdfdHhyeC5vIFwKKwkJJChFUFBJTkdfU1JDX0RJUikvZXBwaW5nX3R4Lm8gXAorCQkkKEVQUElOR19TUkNfRElSKS9lcHBpbmdfcngubyBcCisJCSQoRVBQSU5HX1NSQ19ESVIpL2VwcGluZ19oZWxwZXIubyBcCisKKworIyMjIyMjIyMjIyMjIE1BQyAjIyMjIyMjIyMjIyMKK01BQ19ESVIgOj0JY29yZS9tYWMKK01BQ19JTkNfRElSIDo9CSQoTUFDX0RJUikvaW5jCitNQUNfU1JDX0RJUiA6PQkkKE1BQ19ESVIpL3NyYworCitNQUNfSU5DIDo9IAktSSQoV0xBTl9ST09UKS8kKE1BQ19JTkNfRElSKSBcCisJCS1JJChXTEFOX1JPT1QpLyQoTUFDX1NSQ19ESVIpL2RwaCBcCisJCS1JJChXTEFOX1JPT1QpLyQoTUFDX1NSQ19ESVIpL2luY2x1ZGUgXAorCQktSSQoV0xBTl9ST09UKS8kKE1BQ19TUkNfRElSKS9wZS9pbmNsdWRlIFwKKwkJLUkkKFdMQU5fUk9PVCkvJChNQUNfU1JDX0RJUikvcGUvbGltCisKK01BQ19DRkdfT0JKUyA6PSAkKE1BQ19TUkNfRElSKS9jZmcvY2ZnX2FwaS5vIFwKKwkJJChNQUNfU1JDX0RJUikvY2ZnL2NmZ19kZWJ1Zy5vIFwKKwkJJChNQUNfU1JDX0RJUikvY2ZnL2NmZ19wYXJhbV9uYW1lLm8gXAorCQkkKE1BQ19TUkNfRElSKS9jZmcvY2ZnX3Byb2NfbXNnLm8gXAorCQkkKE1BQ19TUkNfRElSKS9jZmcvY2ZnX3NlbmRfbXNnLm8KKworTUFDX0RQSF9PQkpTIDo9CSQoTUFDX1NSQ19ESVIpL2RwaC9kcGhfaGFzaF90YWJsZS5vCisKK01BQ19MSU1fT0JKUyA6PSAkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX2FpZF9tZ210Lm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX2FkbWl0X2NvbnRyb2wubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL2xpbS9saW1fYXBpLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX2Fzc29jX3V0aWxzLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX2RlYnVnLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX2Z0Lm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX2lic3NfcGVlcl9tZ210Lm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX2xpbmtfbW9uaXRvcmluZ19hbGdvLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX3AycC5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9wcm9jZXNzX2FjdGlvbl9mcmFtZS5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9wcm9jZXNzX2Fzc29jX3JlcV9mcmFtZS5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9wcm9jZXNzX2Fzc29jX3JzcF9mcmFtZS5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9wcm9jZXNzX2F1dGhfZnJhbWUubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL2xpbS9saW1fcHJvY2Vzc19iZWFjb25fZnJhbWUubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL2xpbS9saW1fcHJvY2Vzc19jZmdfdXBkYXRlcy5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9wcm9jZXNzX2RlYXV0aF9mcmFtZS5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9wcm9jZXNzX2Rpc2Fzc29jX2ZyYW1lLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX3Byb2Nlc3NfbWVzc2FnZV9xdWV1ZS5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9wcm9jZXNzX21sbV9yZXFfbWVzc2FnZXMubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL2xpbS9saW1fcHJvY2Vzc19tbG1fcnNwX21lc3NhZ2VzLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX3Byb2Nlc3NfcHJvYmVfcmVxX2ZyYW1lLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX3Byb2Nlc3NfcHJvYmVfcnNwX2ZyYW1lLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX3Byb2Nlc3Nfc21lX3JlcV9tZXNzYWdlcy5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9wcm9wX2V4dHNfdXRpbHMubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL2xpbS9saW1fc2Nhbl9yZXN1bHRfdXRpbHMubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL2xpbS9saW1fc2VjdXJpdHlfdXRpbHMubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL2xpbS9saW1fc2VuZF9tYW5hZ2VtZW50X2ZyYW1lcy5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9zZW5kX21lc3NhZ2VzLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX3NlbmRfc21lX3JzcF9tZXNzYWdlcy5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9zZXJfZGVzX3V0aWxzLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX3Nlc3Npb24ubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL2xpbS9saW1fc2Vzc2lvbl91dGlscy5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9zbWVfcmVxX3V0aWxzLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltX3N0YV9oYXNoX2FwaS5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV90aW1lcl91dGlscy5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV90cmFjZS5vIFwKKwkJJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV91dGlscy5vCisKK2lmZXEgKCQoQ09ORklHX1FDT01fRVNFKSx5KQoraWZuZXEgKCQoQ09ORklHX1FDT01fRVNFX1VQTE9BRCkseSkKK01BQ19MSU1fT0JKUyArPSAkKE1BQ19TUkNfRElSKS9wZS9saW0vbGltUHJvY2Vzc0VzZUZyYW1lLm8KK2VuZGlmCitlbmRpZgorCitpZmVxICgkKENPTkZJR19RQ09NX1RETFMpLHkpCitNQUNfTElNX09CSlMgKz0gJChNQUNfU1JDX0RJUikvcGUvbGltL2xpbV9wcm9jZXNzX3RkbHMubworZW5kaWYKKworTUFDX1NDSF9PQkpTIDo9ICQoTUFDX1NSQ19ESVIpL3BlL3NjaC9zY2hfYXBpLm8gXAorCQkkKE1BQ19TUkNfRElSKS9wZS9zY2gvc2NoX2JlYWNvbl9nZW4ubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL3NjaC9zY2hfYmVhY29uX3Byb2Nlc3MubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL3NjaC9zY2hfZGVidWcubyBcCisJCSQoTUFDX1NSQ19ESVIpL3BlL3NjaC9zY2hfbWVzc2FnZS5vCisKK01BQ19SUk1fT0JKUyA6PQkkKE1BQ19TUkNfRElSKS9wZS9ycm0vcnJtX2FwaS5vCisKK01BQ19PQkpTIDo9IAkkKE1BQ19DRkdfT0JKUykgXAorCQkkKE1BQ19EUEhfT0JKUykgXAorCQkkKE1BQ19MSU1fT0JKUykgXAorCQkkKE1BQ19TQ0hfT0JKUykgXAorCQkkKE1BQ19SUk1fT0JKUykKKworIyMjIyMjIyMjIyMjIFNBUCAjIyMjIyMjIyMjIyMKK1NBUF9ESVIgOj0JY29yZS9zYXAKK1NBUF9JTkNfRElSIDo9CSQoU0FQX0RJUikvaW5jCitTQVBfU1JDX0RJUiA6PQkkKFNBUF9ESVIpL3NyYworCitTQVBfSU5DIDo9IAktSSQoV0xBTl9ST09UKS8kKFNBUF9JTkNfRElSKSBcCisJCS1JJChXTEFOX1JPT1QpLyQoU0FQX1NSQ19ESVIpCisKK1NBUF9PQkpTIDo9CSQoU0FQX1NSQ19ESVIpL3NhcF9hcGlfbGlua19jbnRsLm8gXAorCQkkKFNBUF9TUkNfRElSKS9zYXBfY2hfc2VsZWN0Lm8gXAorCQkkKFNBUF9TUkNfRElSKS9zYXBfZnNtLm8gXAorCQkkKFNBUF9TUkNfRElSKS9zYXBfbW9kdWxlLm8KKworIyMjIyMjIyMjIyMjIERGUyAjIyMjIyMjIyMjIyMgMzUwCitERlNfRElSIDo9CSQoU0FQX0RJUikvZGZzCitERlNfSU5DX0RJUiA6PQkkKERGU19ESVIpL2luYworREZTX1NSQ19ESVIgOj0JJChERlNfRElSKS9zcmMKKworREZTX0lOQyA6PQktSSQoV0xBTl9ST09UKS8kKERGU19JTkNfRElSKSBcCisJCS1JJChXTEFOX1JPT1QpLyQoREZTX1NSQ19ESVIpCisKK0RGU19PQkpTIDo9CSQoREZTX1NSQ19ESVIpL2Rmc19iaW5kZXRlY3RzLm8gXAorCQkkKERGU19TUkNfRElSKS9kZnMubyBcCisJCSQoREZTX1NSQ19ESVIpL2Rmc19kZWJ1Zy5vXAorCQkkKERGU19TUkNfRElSKS9kZnNfZmNjX2JpbjUub1wKKwkJJChERlNfU1JDX0RJUikvZGZzX2luaXQub1wKKwkJJChERlNfU1JDX0RJUikvZGZzX21pc2Mub1wKKwkJJChERlNfU1JDX0RJUikvZGZzX25vbC5vXAorCQkkKERGU19TUkNfRElSKS9kZnNfcGh5ZXJyX3Rsdi5vXAorCQkkKERGU19TUkNfRElSKS9kZnNfcHJvY2Vzc19waHllcnIub1wKKwkJJChERlNfU1JDX0RJUikvZGZzX3Byb2Nlc3NfcmFkYXJldmVudC5vXAorCQkkKERGU19TUkNfRElSKS9kZnNfc3RhZ2dlcmVkLm8KKworIyMjIyMjIyMjIyMjIFNNRSAjIyMjIyMjIyMjIyMKK1NNRV9ESVIgOj0JY29yZS9zbWUKK1NNRV9JTkNfRElSIDo9CSQoU01FX0RJUikvaW5jCitTTUVfU1JDX0RJUiA6PQkkKFNNRV9ESVIpL3NyYworCitTTUVfSU5DIDo9IAktSSQoV0xBTl9ST09UKS8kKFNNRV9JTkNfRElSKSBcCisJCS1JJChXTEFOX1JPT1QpLyQoU01FX1NSQ19ESVIpL2NzcgorCitTTUVfQ1NSX09CSlMgOj0gJChTTUVfU1JDX0RJUikvY3NyL2Nzcl9hcGlfcm9hbS5vIFwKKwkJJChTTUVfU1JDX0RJUikvY3NyL2Nzcl9hcGlfc2Nhbi5vIFwKKwkJJChTTUVfU1JDX0RJUikvY3NyL2Nzcl9jbWRfcHJvY2Vzcy5vIFwKKwkJJChTTUVfU1JDX0RJUikvY3NyL2Nzcl9saW5rX2xpc3QubyBcCisJCSQoU01FX1NSQ19ESVIpL2Nzci9jc3JfbmVpZ2hib3Jfcm9hbS5vIFwKKwkJJChTTUVfU1JDX0RJUikvY3NyL2Nzcl91dGlsLm8KKworaWZlcSAoJChDT05GSUdfUUNPTV9FU0UpLHkpCitpZm5lcSAoJChDT05GSUdfUUNPTV9FU0VfVVBMT0FEKSx5KQorU01FX0NTUl9PQkpTICs9ICQoU01FX1NSQ19ESVIpL2Nzci9jc3JFc2UubworZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1FDT01fVERMUykseSkKK1NNRV9DU1JfT0JKUyArPSAkKFNNRV9TUkNfRElSKS9jc3IvY3NyX3RkbHNfcHJvY2Vzcy5vCitlbmRpZgorCitTTUVfUU9TX09CSlMgOj0gJChTTUVfU1JDX0RJUikvcW9zL3NtZV9xb3MubworCitTTUVfQ01OX09CSlMgOj0gJChTTUVfU1JDX0RJUikvY29tbW9uL3NtZV9hcGkubyBcCisJCSQoU01FX1NSQ19ESVIpL2NvbW1vbi9zbWVfZnRfYXBpLm8gXAorCQkkKFNNRV9TUkNfRElSKS9jb21tb24vc21lX3Bvd2VyX3NhdmUubyBcCisJCSQoU01FX1NSQ19ESVIpL2NvbW1vbi9zbWVfdHJhY2UubworCitTTUVfT0VNX0RBVEFfT0JKUyA6PSAkKFNNRV9TUkNfRElSKS9vZW1fZGF0YS9vZW1fZGF0YV9hcGkubworCitTTUVfUDJQX09CSlMgPSAkKFNNRV9TUkNfRElSKS9wMnAvcDJwX2FwaS5vCisKK1NNRV9SUk1fT0JKUyA6PSAkKFNNRV9TUkNfRElSKS9ycm0vc21lX3JybS5vCisKK2lmZXEgKCQoQ09ORklHX1FDQUNMRF9GRUFUVVJFX05BTikseSkKK1NNRV9OQU5fT0JKUyA9ICQoU01FX1NSQ19ESVIpL25hbi9uYW5fYXBpLm8KK2VuZGlmCisKK1NNRV9PQkpTIDo9CSQoU01FX0NNTl9PQkpTKSBcCisJCSQoU01FX0NTUl9PQkpTKSBcCisJCSQoU01FX09FTV9EQVRBX09CSlMpIFwKKwkJJChTTUVfUDJQX09CSlMpIFwKKwkJJChTTUVfUU9TX09CSlMpIFwKKwkJJChTTUVfUlJNX09CSlMpIFwKKwkJJChTTUVfTkFOX09CSlMpCisKKyMjIyMjIyMjIyMjIyBOTElOSyAjIyMjIyMjIyMjIyMKK05MSU5LX0RJUiAgICAgOj0JY29yZS91dGlscy9ubGluaworTkxJTktfSU5DX0RJUiA6PQkkKE5MSU5LX0RJUikvaW5jCitOTElOS19TUkNfRElSIDo9CSQoTkxJTktfRElSKS9zcmMKKworTkxJTktfSU5DICAgICA6PSAJLUkkKFdMQU5fUk9PVCkvJChOTElOS19JTkNfRElSKQorTkxJTktfT0JKUyAgICA6PQkkKE5MSU5LX1NSQ19ESVIpL3dsYW5fbmxpbmtfc3J2Lm8KKworIyMjIyMjIyMjIyMjIFBUVCAjIyMjIyMjIyMjIyMKK1BUVF9ESVIgICAgIDo9CWNvcmUvdXRpbHMvcHR0CitQVFRfSU5DX0RJUiA6PQkkKFBUVF9ESVIpL2luYworUFRUX1NSQ19ESVIgOj0JJChQVFRfRElSKS9zcmMKKworUFRUX0lOQyAgICAgOj0gCS1JJChXTEFOX1JPT1QpLyQoUFRUX0lOQ19ESVIpCitQVFRfT0JKUyAgICA6PQkkKFBUVF9TUkNfRElSKS93bGFuX3B0dF9zb2NrX3N2Yy5vCisKKyMjIyMjIyMjIyMjIyBXTEFOX0xPR0dJTkcgIyMjIyMjIyMjIyMjCitXTEFOX0xPR0dJTkdfRElSICAgICA6PQljb3JlL3V0aWxzL2xvZ2dpbmcKK1dMQU5fTE9HR0lOR19JTkNfRElSIDo9CSQoV0xBTl9MT0dHSU5HX0RJUikvaW5jCitXTEFOX0xPR0dJTkdfU1JDX0RJUiA6PQkkKFdMQU5fTE9HR0lOR19ESVIpL3NyYworCitXTEFOX0xPR0dJTkdfSU5DICAgICA6PSAtSSQoV0xBTl9ST09UKS8kKFdMQU5fTE9HR0lOR19JTkNfRElSKQorV0xBTl9MT0dHSU5HX09CSlMgICAgOj0gJChXTEFOX0xPR0dJTkdfU1JDX0RJUikvd2xhbl9sb2dnaW5nX3NvY2tfc3ZjLm8KKworIyMjIyMjIyMjIyMjIFNZUyAjIyMjIyMjIyMjIyMKK1NZU19ESVIgOj0JY29yZS9tYWMvc3JjL3N5cworCitTWVNfSU5DIDo9IAktSSQoV0xBTl9ST09UKS8kKFNZU19ESVIpL2NvbW1vbi9pbmMgXAorCQktSSQoV0xBTl9ST09UKS8kKFNZU19ESVIpL2xlZ2FjeS9zcmMvcGxhdGZvcm0vaW5jIFwKKwkJLUkkKFdMQU5fUk9PVCkvJChTWVNfRElSKS9sZWdhY3kvc3JjL3N5c3RlbS9pbmMgXAorCQktSSQoV0xBTl9ST09UKS8kKFNZU19ESVIpL2xlZ2FjeS9zcmMvdXRpbHMvaW5jCisKK1NZU19DT01NT05fU1JDX0RJUiA6PSAkKFNZU19ESVIpL2NvbW1vbi9zcmMKK1NZU19MRUdBQ1lfU1JDX0RJUiA6PSAkKFNZU19ESVIpL2xlZ2FjeS9zcmMKK1NZU19PQkpTIDo9CSQoU1lTX0NPTU1PTl9TUkNfRElSKS93bGFuX3FjdF9zeXMubyBcCisJCSQoU1lTX0xFR0FDWV9TUkNfRElSKS9wbGF0Zm9ybS9zcmMvc3lzX3dyYXBwZXIubyBcCisJCSQoU1lTX0xFR0FDWV9TUkNfRElSKS9zeXN0ZW0vc3JjL21hY19pbml0X2FwaS5vIFwKKwkJJChTWVNfTEVHQUNZX1NSQ19ESVIpL3N5c3RlbS9zcmMvc3lzX2VudHJ5X2Z1bmMubyBcCisJCSQoU1lTX0xFR0FDWV9TUkNfRElSKS91dGlscy9zcmMvZG90MTFmLm8gXAorCQkkKFNZU19MRUdBQ1lfU1JDX0RJUikvdXRpbHMvc3JjL2xvZ19hcGkubyBcCisJCSQoU1lTX0xFR0FDWV9TUkNfRElSKS91dGlscy9zcmMvbWFjX3RyYWNlLm8gXAorCQkkKFNZU19MRUdBQ1lfU1JDX0RJUikvdXRpbHMvc3JjL3BhcnNlcl9hcGkubyBcCisJCSQoU1lTX0xFR0FDWV9TUkNfRElSKS91dGlscy9zcmMvdXRpbHNfYXBpLm8gXAorCQkkKFNZU19MRUdBQ1lfU1JDX0RJUikvdXRpbHMvc3JjL3V0aWxzX3BhcnNlci5vCisKKyMjIyMjIyMjIyMjIyBDREYgKENvbm5lY3Rpdml0eSBkcml2ZXIgZnJhbWV3b3JrKSAjIyMjIyMjIyMjIyMKK0NERl9ESVIgOj0JY29yZS9jZGYKK0NERl9JTkNfRElSIDo9CSQoQ0RGX0RJUikvaW5jCitDREZfU1JDX0RJUiA6PQkkKENERl9ESVIpL3NyYworCitDREZfSU5DIDo9IAktSSQoV0xBTl9ST09UKS8kKENERl9JTkNfRElSKSBcCisJCS1JJChXTEFOX1JPT1QpLyQoQ0RGX1NSQ19ESVIpCisKK0NERl9PQkpTIDo9CSQoQ0RGX1NSQ19ESVIpL2NkZl9ldmVudC5vIFwKKwkJJChDREZfU1JDX0RJUikvY2RmX2xpc3QubyBcCisJCSQoQ0RGX1NSQ19ESVIpL2NkZl9sb2NrLm8gXAorCQkkKENERl9TUkNfRElSKS9jZGZfbWVtb3J5Lm8gXAorCQkkKENERl9TUkNfRElSKS9jZGZfdGhyZWFkcy5vIFwKKwkJJChDREZfU1JDX0RJUikvY2RmX21jX3RpbWVyLm8gXAorCQkkKENERl9TUkNfRElSKS9jZGZfdHJhY2UubyBcCisJCSQoQ0RGX1NSQ19ESVIpL2NkZl9uYnVmLm8gXAorCQkkKENERl9TUkNfRElSKS9jZGZfZGVmZXIubworCisjIyMjIyMjIyMjIyMgQ0RTIChDb25uZWN0aXZpdHkgZHJpdmVyIHNlcnZpY2VzKSAjIyMjIyMjIyMjIyMKK0NEU19ESVIgOj0JY29yZS9jZHMKK0NEU19JTkNfRElSIDo9CSQoQ0RTX0RJUikvaW5jCitDRFNfU1JDX0RJUiA6PQkkKENEU19ESVIpL3NyYworCitDRFNfSU5DIDo9IAktSSQoV0xBTl9ST09UKS8kKENEU19JTkNfRElSKSBcCisJCS1JJChXTEFOX1JPT1QpLyQoQ0RTX1NSQ19ESVIpCisKK0NEU19PQkpTIDo9CSQoQ0RTX1NSQ19ESVIpL2Nkc19hcGkubyBcCisJCSQoQ0RTX1NSQ19ESVIpL2Nkc19nZXRfYmluLm8gXAorCQkkKENEU19TUkNfRElSKS9jZHNfcmVnX3NlcnZpY2UubyBcCisJCSQoQ0RTX1NSQ19ESVIpL2Nkc19tcS5vIFwKKwkJJChDRFNfU1JDX0RJUikvY2RzX3BhY2tldC5vIFwKKwkJJChDRFNfU1JDX0RJUikvY2RzX3JlZ2RvbWFpbi5vIFwKKwkJJChDRFNfU1JDX0RJUikvY2RzX3NjaGVkLm8gXAorCQkkKENEU19TUkNfRElSKS9jZHNfY29uY3VycmVuY3kubyBcCisJCSQoQ0RTX1NSQ19ESVIpL2Nkc191dGlscy5vCisKKworIyMjIyMjIyMjIyMgQk1JICMjIyMjIyMjIyMjCitCTUlfRElSIDo9IGNvcmUvYm1pCisKK0JNSV9JTkMgOj0gLUkkKFdMQU5fUk9PVCkvJChCTUlfRElSKS9pbmMKKworaWZuZXEgKCQoQ09ORklHX0lDTlNTKSwgeSkKK0JNSV9PQkpTIDo9ICQoQk1JX0RJUikvc3JjL2JtaS5vIFwKKyAgICAgICAgICAgICQoQk1JX0RJUikvc3JjL29sX2Z3Lm8KK2lmZXEgKCQoQ09ORklHX0ZFQVRVUkVfQk1JXzIpLCB5KQorQk1JX09CSlMgKz0gJChCTUlfRElSKS9zcmMvYm1pXzIubworZWxzZQorQk1JX09CSlMgKz0gJChCTUlfRElSKS9zcmMvYm1pXzEubworZW5kaWYKK2VuZGlmCisjIyMjIyMjIyMjIyBXTUkgIyMjIyMjIyMjIyMKK1dNSV9ESVIgOj0gY29yZS93bWkKKworV01JX0lOQyA6PSAtSSQoV0xBTl9ST09UKS8kKFdNSV9ESVIpCisKK1dNSV9PQkpTIDo9ICQoV01JX0RJUikvd21pX3VuaWZpZWQubyBcCisJICAgICQoV01JX0RJUikvd21pX3Rsdl9oZWxwZXIubworCisjIyMjIyMjIyMjIyBGV0xPRyAjIyMjIyMjIyMjIworRldMT0dfRElSIDo9IGNvcmUvdXRpbHMvZndsb2cKKworRldMT0dfSU5DIDo9IC1JJChXTEFOX1JPT1QpLyQoRldMT0dfRElSKQorCitGV0xPR19PQkpTIDo9ICQoRldMT0dfRElSKS9kYmdsb2dfaG9zdC5vCisKKyMjIyMjIyMjIyMjIyBUWFJYICMjIyMjIyMjIyMjIworVFhSWF9ESVIgOj0gICAgIGNvcmUvZHAvdHhyeAorVFhSWF9JTkMgOj0gICAgIC1JJChXTEFOX1JPT1QpLyQoVFhSWF9ESVIpCisKK1RYUlhfT0JKUyA6PSAkKFRYUlhfRElSKS9vbF90eHJ4Lm8gXAorICAgICAgICAgICAgICAgICQoVFhSWF9ESVIpL29sX2NmZy5vIFwKKyAgICAgICAgICAgICAgICAkKFRYUlhfRElSKS9vbF9yeC5vIFwKKyAgICAgICAgICAgICAgICAkKFRYUlhfRElSKS9vbF9yeF9md2QubyBcCisgICAgICAgICAgICAgICAgJChUWFJYX0RJUikvb2xfdHhyeC5vIFwKKyAgICAgICAgICAgICAgICAkKFRYUlhfRElSKS9vbF9yeF9kZWZyYWcubyBcCisgICAgICAgICAgICAgICAgJChUWFJYX0RJUikvb2xfdHhfZGVzYy5vIFwKKyAgICAgICAgICAgICAgICAkKFRYUlhfRElSKS9vbF90eC5vIFwKKyAgICAgICAgICAgICAgICAkKFRYUlhfRElSKS9vbF9yeF9yZW9yZGVyX3RpbWVvdXQubyBcCisgICAgICAgICAgICAgICAgJChUWFJYX0RJUikvb2xfcnhfcmVvcmRlci5vIFwKKyAgICAgICAgICAgICAgICAkKFRYUlhfRElSKS9vbF9yeF9wbi5vIFwKKyAgICAgICAgICAgICAgICAkKFRYUlhfRElSKS9vbF90eF9xdWV1ZS5vIFwKKyAgICAgICAgICAgICAgICAkKFRYUlhfRElSKS9vbF90eHJ4X3BlZXJfZmluZC5vIFwKKyAgICAgICAgICAgICAgICAkKFRYUlhfRElSKS9vbF90eHJ4X2V2ZW50Lm8gXAorICAgICAgICAgICAgICAgICQoVFhSWF9ESVIpL29sX3R4cnhfZW5jYXAubyBcCisgICAgICAgICAgICAgICAgJChUWFJYX0RJUikvb2xfdHhfc2VuZC5vCisKK2lmZXEgKCQoQ09ORklHX1dMQU5fVFhfRkxPV19DT05UUk9MX1YyKSwgeSkKK1RYUlhfT0JKUyArPSAgICAgJChUWFJYX0RJUikvb2xfdHhyeF9mbG93X2NvbnRyb2wubworZW5kaWYKKworIyMjIyMjIyMjIyMjIE9MICMjIyMjIyMjIyMjIworT0xfRElSIDo9ICAgICBjb3JlL2RwL29sCitPTF9JTkMgOj0gICAgIC1JJChXTEFOX1JPT1QpLyQoT0xfRElSKS9pbmMKKworIyMjIyMjIyMjIyMjIFBLVExPRyAjIyMjIyMjIyMjIyMKK1BLVExPR19ESVIgOj0gICAgICBjb3JlL3V0aWxzL3BrdGxvZworUEtUTE9HX0lOQyA6PSAgICAgIC1JJChXTEFOX1JPT1QpLyQoUEtUTE9HX0RJUikvaW5jbHVkZQorCitQS1RMT0dfT0JKUyA6PQkkKFBLVExPR19ESVIpL3BrdGxvZ19hYy5vIFwKKwkJJChQS1RMT0dfRElSKS9wa3Rsb2dfaW50ZXJuYWwubyBcCisJCSQoUEtUTE9HX0RJUikvbGludXhfYWMubworCisjIyMjIyMjIyMjIyMgSFRUICMjIyMjIyMjIyMjIworSFRUX0RJUiA6PSAgICAgIGNvcmUvZHAvaHR0CitIVFRfSU5DIDo9ICAgICAgLUkkKFdMQU5fUk9PVCkvJChIVFRfRElSKQorCitIVFRfT0JKUyA6PSAkKEhUVF9ESVIpL2h0dF90eC5vIFwKKyAgICAgICAgICAgICQoSFRUX0RJUikvaHR0Lm8gXAorICAgICAgICAgICAgJChIVFRfRElSKS9odHRfdDJoLm8gXAorICAgICAgICAgICAgJChIVFRfRElSKS9odHRfaDJ0Lm8gXAorICAgICAgICAgICAgJChIVFRfRElSKS9odHRfZndfc3RhdHMubyBcCisgICAgICAgICAgICAkKEhUVF9ESVIpL2h0dF9yeC5vCisKKyMjIyMjIyMjIyMjIyMjIEhUQyAjIyMjIyMjIyMjCitIVENfRElSIDo9IGNvcmUvaHRjCitIVENfSU5DIDo9IC1JJChXTEFOX1JPT1QpLyQoSFRDX0RJUikKKworSFRDX09CSlMgOj0gJChIVENfRElSKS9odGMubyBcCisgICAgICAgICAgICAkKEhUQ19ESVIpL2h0Y19zZW5kLm8gXAorICAgICAgICAgICAgJChIVENfRElSKS9odGNfcmVjdi5vIFwKKyAgICAgICAgICAgICQoSFRDX0RJUikvaHRjX3NlcnZpY2VzLm8KKworIyMjIyMjIyMjIyMgSElGICMjIyMjIyMjIyMjCitISUZfRElSIDo9IGNvcmUvaGlmCitISUZfQ0VfRElSIDo9ICQoSElGX0RJUikvc3JjL2NlCitISUZfQ05TU19TVFVCX0RJUiA6PSAkKEhJRl9ESVIpL3NyYy9pY25zc19zdHViCisKK2lmZXEgKCQoQ09ORklHX0hJRl9QQ0kpLCAxKQorSElGX1BDSUVfRElSIDo9ICQoSElGX0RJUikvc3JjL3BjaWUKK2Vsc2UKK0hJRl9TTk9DX0RJUiA6PSAkKEhJRl9ESVIpL3NyYy9zbm9jCitlbmRpZgorCitISUZfSU5DIDo9IC1JJChXTEFOX1JPT1QpLyQoSElGX0RJUikvaW5jIFwKKwkJCQktSSQoV0xBTl9ST09UKS8kKEhJRl9ESVIpL3NyYyBcCisJCQkJLUkkKFdMQU5fUk9PVCkvJChISUZfQ0VfRElSKSBcCisJCQkJLUkkKFdMQU5fUk9PVCkvJChISUZfQ05TU19TVFVCX0RJUikKKworaWZlcSAoJChDT05GSUdfSElGX1BDSSksIDEpCitISUZfSU5DICs9IC1JJChXTEFOX1JPT1QpLyQoSElGX1BDSUVfRElSKQorZWxzZQorSElGX0lOQyArPSAtSSQoV0xBTl9ST09UKS8kKEhJRl9TTk9DX0RJUikKK2VuZGlmCisKK0hJRl9PQkpTIDo9ICQoSElGX0RJUikvc3JjL2F0aF9wcm9jZnMubyBcCisJCSQoSElGX0NFX0RJUikvY2VfZGlhZy5vIFwKKwkJJChISUZfQ0VfRElSKS9jZV9tYWluLm8gXAorCQkkKEhJRl9DRV9ESVIpL2NlX3NlcnZpY2UubyBcCisJCSQoSElGX0NFX0RJUikvY2VfdGFza2xldC5vIFwKKwkJJChISUZfRElSKS9zcmMvaGlmX21haW4ubyBcCisJCSQoSElGX0RJUikvc3JjL21wX2Rldi5vIFwKKwkJJChISUZfRElSKS9zcmMvcmVndGFibGUubworCitpZmVxICgkKENPTkZJR19DTlNTKSwgeSkKK0hJRl9PQkpTICs9ICQoSElGX0NOU1NfU1RVQl9ESVIpL2ljbnNzX3N0dWIubyBcCisJCSQoSElGX0NFX0RJUikvY2VfYm1pLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1dMQU5fTkFQSSksIHkpCitISUZfT0JKUyArPSAkKEhJRl9ESVIpL3NyYy9oaWZfbmFwaS5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19ISUZfUENJKSwgMSkKK0hJRl9QQ0lFX09CSlMgOj0gJChISUZfUENJRV9ESVIpL2lmX3BjaS5vCisKK0hJRl9PQkpTICs9ICQoSElGX1BDSUVfT0JKUykKK2Vsc2UKK0hJRl9TTk9DX09CSlMgOj0gJChISUZfU05PQ19ESVIpL2lmX3Nub2MubworCitISUZfT0JKUyArPSAkKEhJRl9TTk9DX09CSlMpCitlbmRpZgorCisjIyMjIyMjIyMjIyMgV01BICMjIyMjIyMjIyMjIworV01BX0RJUiA6PQljb3JlL3dtYQorCitXTUFfSU5DX0RJUiA6PSAgJChXTUFfRElSKS9pbmMKK1dNQV9TUkNfRElSIDo9ICAkKFdNQV9ESVIpL3NyYworCitXTUFfSU5DIDo9CS1JJChXTEFOX1JPT1QpLyQoV01BX0lOQ19ESVIpIFwKKwkJLUkkKFdMQU5fUk9PVCkvJChXTUFfU1JDX0RJUikKKworV01BX09CSlMgOj0JJChXTUFfU1JDX0RJUikvd21hX21haW4ubyBcCisJCSQoV01BX1NSQ19ESVIpL3dtYV9zY2FuX3JvYW0ubyBcCisJCSQoV01BX1NSQ19ESVIpL3dtYV9kZXZfaWYubyBcCisJCSQoV01BX1NSQ19ESVIpL3dtYV9tZ210Lm8gXAorCQkkKFdNQV9TUkNfRElSKS93bWFfcG93ZXIubyBcCisJCSQoV01BX1NSQ19ESVIpL3dtYV9kYXRhLm8gXAorCQkkKFdNQV9TUkNfRElSKS93bWFfdXRpbHMubyBcCisJCSQoV01BX1NSQ19ESVIpL3dtYV9mZWF0dXJlcy5vIFwKKwkJJChXTUFfU1JDX0RJUikvd21hX2Rmc19pbnRlcmZhY2UubyBcCisJCSQoV01BX1NSQ19ESVIpL3dtYV9vY2IubyBcCisJCSQoV01BX1NSQ19ESVIpL3dsYW5fcWN0X3dtYV9sZWdhY3kubworCitpZmVxICgkKENPTkZJR19NUENfVVRfRlJBTUVXT1JLKSx5KQorV01BX09CSlMgKz0JJChXTUFfU1JDX0RJUikvd21hX3V0aWxzX3V0Lm8KK2VuZGlmCisKK1RBUkdFVF9JTkMgOj0JLUkkKFdMQU5fUk9PVCkvdGFyZ2V0L2luYworCitMSU5VWF9JTkMgOj0JLUlpbmNsdWRlL2xpbnV4CisKK0lOQ1MgOj0JCSQoSEREX0lOQykgXAorCQkkKEVQUElOR19JTkMpIFwKKwkJJChMSU5VWF9JTkMpIFwKKwkJJChNQUNfSU5DKSBcCisJCSQoU0FQX0lOQykgXAorCQkkKFNNRV9JTkMpIFwKKwkJJChTWVNfSU5DKSBcCisJCSQoQ0RGX0lOQykgXAorCQkkKENEU19JTkMpIFwKKwkJJChERlNfSU5DKQorCitJTkNTICs9CQkkKFdNQV9JTkMpIFwKKwkJJChVQVBJX0lOQykgXAorCQkkKENPTU1PTl9JTkMpIFwKKwkJJChXTUlfSU5DKSBcCisJCSQoRldMT0dfSU5DKSBcCisJCSQoVFhSWF9JTkMpIFwKKwkJJChPTF9JTkMpIFwKKwkJJChQS1RMT0dfSU5DKSBcCisJCSQoSFRUX0lOQykgXAorCQkkKEhUQ19JTkMpIFwKKwkJJChERlNfSU5DKQorCitJTkNTICs9CQkkKEhJRl9JTkMpIFwKKwkJJChCTUlfSU5DKQorCitJTkNTICs9CQkkKFRBUkdFVF9JTkMpCisKK0lOQ1MgKz0JCSQoTkxJTktfSU5DKSBcCisJCSQoUFRUX0lOQykgXAorCQkkKFdMQU5fTE9HR0lOR19JTkMpCisKK2lmZXEgKCQoQ09ORklHX1JFTU9WRV9QS1RfTE9HKSwgMCkKK0lOQ1MgKz0JCSQoUEtUTE9HX0lOQykKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfRElBR19WRVJTSU9OKSwgMSkKK0lOQ1MgKz0JCSQoSE9TVF9ESUFHX0xPR19JTkMpCitlbmRpZgorCitPQkpTIDo9CQkkKEhERF9PQkpTKSBcCisJCSQoRVBQSU5HX09CSlMpIFwKKwkJJChNQUNfT0JKUykgXAorCQkkKFNBUF9PQkpTKSBcCisJCSQoU01FX09CSlMpIFwKKwkJJChTWVNfT0JKUykgXAorCQkkKENERl9PQkpTKSBcCisJCSQoQ0RTX09CSlMpIFwKKwkJJChERlNfT0JKUykKKworT0JKUyArPQkJJChXTUFfT0JKUykgXAorCQkkKFRYUlhfT0JKUykgXAorCQkkKFdNSV9PQkpTKSBcCisJCSQoRldMT0dfT0JKUykgXAorCQkkKEhUQ19PQkpTKSBcCisJCSQoREZTX09CSlMpCisKK09CSlMgKz0JCSQoSElGX09CSlMpIFwKKwkJJChCTUlfT0JKUykgXAorCQkkKEhUVF9PQkpTKQorCitPQkpTICs9CQkkKFdMQU5fTE9HR0lOR19PQkpTKQorT0JKUyArPQkJJChOTElOS19PQkpTKQorT0JKUyArPQkJJChQVFRfT0JKUykKKworaWZlcSAoJChDT05GSUdfUkVNT1ZFX1BLVF9MT0cpLCAwKQorT0JKUyArPQkJJChQS1RMT0dfT0JKUykKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfRElBR19WRVJTSU9OKSwgMSkKK09CSlMgKz0JCSQoSE9TVF9ESUFHX0xPR19PQkpTKQorZW5kaWYKKworCitFWFRSQV9DRkxBR1MgKz0gJChJTkNTKQorCitDREVGSU5FUyA6PQktREFOSV9MSVRUTEVfQllURV9FTkRJQU4gXAorCQktREFOSV9MSVRUTEVfQklUX0VORElBTiBcCisJCS1EUUNfV0xBTl9DSElQU0VUX1FDQV9DTEQgXAorCQktRERPVDExRl9MSVRUTEVfRU5ESUFOX0hPU1QgXAorCQktREFOSV9DT01QSUxFUl9UWVBFX0dDQyBcCisJCS1EQU5JX09TX1RZUEVfQU5EUk9JRD02IFwKKwkJLURXTEFOX1BFUkYgXAorCQktRFBUVF9TT0NLX1NWQ19FTkFCTEUgXAorCQktV2FsbFwKKwkJLVdlcnJvclwKKwkJLURfX2xpbnV4X18gXAorCQktREhBTF9TRUxGX1NUQV9QRVJfQlNTPTEgXAorCQktRFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSIFwKKwkJLURXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORyBcCisJCS1EV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkdfREVCVUcgXAorCQktRFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHIFwKKwkJLURGRUFUVVJFX1dMQU5fV0FQSSBcCisJCS1ERkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUXAorCQktRFNPRlRBUF9DSEFOTkVMX1JBTkdFIFwKKwkJLURXTEFOX0FQX1NUQV9DT05DVVJSRU5DWSBcCisJCS1ERkVBVFVSRV9XTEFOX1NDQU5fUE5PIFwKKwkJLURXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORyBcCisJCS1EV0xBTl9GRUFUVVJFX1ZPV0lGSSBcCisJCS1EV0xBTl9GRUFUVVJFXzExQUMgXAorCQktRFdMQU5fRkVBVFVSRV9QMlBfREVCVUcgXAorCQktRFdMQU5fRU5BQkxFX0FHRUlFX09OX1NDQU5fUkVTVUxUUyBcCisJCS1EV0xBTlRMX0RFQlVHXAorCQktRFdMQU5fTlNfT0ZGTE9BRCBcCisJCS1EV0xBTl9TT0ZUQVBfVlNUQV9GRUFUVVJFIFwKKwkJLURXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQgXAorCQktRFdMQU5fV0FLRVVQX0VWRU5UUyBcCisJCS1ERkVBVFVSRV9XTEFOX1JBX0ZJTFRFUklOR1wKKwkgICAgICAgIC1EV0xBTl9LRF9SRUFEWV9OT1RJRklFUiBcCisJCS1EV0xBTl9OTDgwMjExX1RFU1RNT0RFIFwKKwkJLURGRUFUVVJFX1dMQU5fTFBIQiBcCisJCS1ERkVBVFVSRV9XTEFOX1BBTF9USU1FUl9ESVNBQkxFIFwKKwkJLURGRUFUVVJFX1dMQU5fUEFMX01FTV9ESVNBQkxFIFwKKwkJLURRQ0FfU1VQUE9SVF9UWF9USFJPVFRMRSBcCisJCS1EV01JX0lOVEVSRkFDRV9FVkVOVF9MT0dHSU5HIFwKKwkJLURBVEhfU1VQUE9SVF9XQVBJIFwKKwkJLURXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUyBcCisJCS1EV0xBTl9MT0dHSU5HX1NPQ0tfU1ZDX0VOQUJMRSBcCisJCS1ERkVBVFVSRV9XTEFOX0VYVFNDQU4gXAorCQktREZFQVRVUkVfV0xBTl9MRlIgXAorCQktRFdMQU5fRkVBVFVSRV9NQlNTSUQgXAorCQktRENPTkZJR18xNjBNSFpfU1VQUE9SVAorCitpZmVxICh5LCQoZmlsdGVyIHksJChDT05GSUdfQ05TU19FT1MpICQoQ09ORklHX0lDTlNTKSkpCitDREVGSU5FUyArPSAtRFFDQV9XSUZJXzNfMAorQ0RFRklORVMgKz0gLURRQ0FfV0lGSV8zXzBfRU1VCitlbmRpZgorCitpZmVxICh5LCQoZmlsdGVyIHksJChDT05GSUdfQ05TU19BRFJBU1RFQSkgJChDT05GSUdfSUNOU1MpKSkKK0NERUZJTkVTICs9IC1EUUNBX1dJRklfM18wX0FEUkFTVEVBCitDREVGSU5FUyArPSAtREFEUkFTVEVBX1NIQURPV19SRUdJU1RFUlMKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1dMQU5fRkFTVFBBVEgpLCB5KQorQ0RFRklORVMgKz0JLURXTEFOX0ZFQVRVUkVfRkFTVFBBVEgKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1dMQU5fTkFQSSksIHkpCitDREVGSU5FUyArPSAtREZFQVRVUkVfTkFQSQoraWZlcSAoJChDT05GSUdfV0xBTl9OQVBJX0RFQlVHKSwgeSkKK0NERUZJTkVTICs9IC1ERkVBVFVSRV9OQVBJX0RFQlVHCitlbmRpZgorZW5kaWYKKworaWZlcSAoJChDT05GSUdfRkVBVFVSRV9CTUlfMiksIHkpCitDREVGSU5FUyArPSAtREZFQVRVUkVfQk1JXzIKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0FSQ0hfTVNNKSwgeSkKK0NERUZJTkVTICs9IC1ETVNNX1BMQVRGT1JNCitlbmRpZgorCitDREVGSU5FUyArPQktRFFDQV9TVVBQT1JUX1RYUlhfTE9DQUxfUEVFUl9JRAorCitpZmVxICgkKENPTkZJR19XTEFOX1RYX0ZMT1dfQ09OVFJPTF9WMiksIHkpCitDREVGSU5FUyArPQktRFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKK0NERUZJTkVTICs9CS1EUUNBX0xMX1RYX0ZMT1dfR0xPQkFMX01HTVRfUE9PTAorZWxzZQoraWZlcSAoJChDT05GSUdfUk9NRV9JRikscGNpKQorQ0RFRklORVMgKz0JLURRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTAorZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0RFQlVHX0xMKSx5KQorQ0RFRklORVMgKz0gICAgCS1EUUNBX1BLVF9QUk9UT19UUkFDRQorZW5kaWYKKworaWZuZXEgKCQoQ09ORklHX1FDQV9DTERfV0xBTiksKQorQ0RFRklORVMgKz0gLURXQ05fUFJPTlRPCitDREVGSU5FUyArPSAtRFdDTl9QUk9OVE9fVjEKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfREVCVUdfVkVSU0lPTiksMSkKK0NERUZJTkVTICs9CS1EV0xBTl9ERUJVRyBcCisJCS1EVFJBQ0VfUkVDT1JEIFwKKwkJLURMSU1fVFJBQ0VfUkVDT1JEIFwKKwkJLURTTUVfVFJBQ0VfUkVDT1JEIFwKKwkJLURIRERfVFJBQ0VfUkVDT1JEIFwKKwkJLURQRV9ERUJVR19MT0dXIFwKKwkJLURQRV9ERUJVR19MT0dFIFwKKwkJLURERUJVRworZW5kaWYKKworaWZlcSAoJChDT05GSUdfU0xVQl9ERUJVR19PTikseSkKK0NERUZJTkVTICs9IC1EVElNRVJfTUFOQUdFUgorQ0RFRklORVMgKz0gLURNRU1PUllfREVCVUcKK2VuZGlmCisKK2lmZXEgKCQoSEFWRV9DRkc4MDIxMSksMSkKK0NERUZJTkVTICs9IC1EV0xBTl9GRUFUVVJFX1AyUAorQ0RFRklORVMgKz0gLURXTEFOX0ZFQVRVUkVfV0ZECitpZmVxICgkKENPTkZJR19RQ09NX1ZPV0lGSV8xMVIpLHkpCitDREVGSU5FUyArPSAtREtFUk5FTF9TVVBQT1JUXzExUl9DRkc4MDIxMQorQ0RFRklORVMgKz0gLURVU0VfODAyMTFfV01NVFNQRUNfRk9SX1JJQworZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1FDT01fRVNFKSx5KQorQ0RFRklORVMgKz0gLURGRUFUVVJFX1dMQU5fRVNFCitDREVGSU5FUyArPSAtRFFDQV9DT01QVVRFX1RYX0RFTEFZCitDREVGSU5FUyArPSAtRFFDQV9DT01QVVRFX1RYX0RFTEFZX1BFUl9USUQKK2lmZXEgKCQoQ09ORklHX1FDT01fRVNFX1VQTE9BRCkseSkKK0NERUZJTkVTICs9IC1ERkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKK2VuZGlmCitlbmRpZgorCisjbm9ybWFsbHksIFRETFMgbmVnYXRpdmUgYmVoYXZpb3IgaXMgbm90IG5lZWRlZAoraWZlcSAoJChDT05GSUdfUUNPTV9URExTKSx5KQorQ0RFRklORVMgKz0gLURGRUFUVVJFX1dMQU5fVERMUworZW5kaWYKKworaWZlcSAoJChDT05GSUdfUUNBQ0xEX1dMQU5fTEZSMykseSkKK0NERUZJTkVTICs9IC1EV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorZW5kaWYKKworaWZlcSAoJChDT05GSUdfUFJJTUFfV0xBTl9PS0MpLHkpCitDREVGSU5FUyArPSAtREZFQVRVUkVfV0xBTl9PS0MKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1BSSU1BX1dMQU5fMTFBQ19ISUdIX1RQKSx5KQorQ0RFRklORVMgKz0gLURXTEFOX0ZFQVRVUkVfMTFBQ19ISUdIX1RQCitlbmRpZgorCitpZmVxICgkKEJVSUxEX0RJQUdfVkVSU0lPTiksMSkKK0NERUZJTkVTICs9IC1ERkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorQ0RFRklORVMgKz0gLURGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorQ0RFRklORVMgKz0gLURGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTQoraWZlcSAoJChDT05GSUdfSElGX1BDSSksIDEpCitDREVGSU5FUyArPSAtRENPTkZJR19BVEhfUFJPQ0ZTX0RJQUdfU1VQUE9SVAorZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0hJRl9VU0IpLCAxKQorQ0RFRklORVMgKz0gLURDT05GSUdfQVRIX1BST0NGU19ESUFHX1NVUFBPUlQKK0NERUZJTkVTICs9IC1EUUNBX1NVUFBPUlRfT0xfUlhfUkVPUkRFUl9USU1FT1VUCitDREVGSU5FUyArPSAtRENPTkZJR19BVEhfUENJRV9NQVhfUEVSRj0wIC1EQ09ORklHX0FUSF9QQ0lFX0FXQUtFX1dISUxFX0RSSVZFUl9MT0FEPTAgLURDT05GSUdfRElTQUJMRV9DRENfTUFYX1BFUkZfV0FSPTAKK0NERUZJTkVTICs9IC1EUUNBX1RYX0hUVDJfU1VQUE9SVAorZW5kaWYKKworIyBlbmFibGUgdGhlIE1BQyBBZGRyZXNzIGF1dG8tZ2VuZXJhdGlvbiBmZWF0dXJlCitDREVGSU5FUyArPSAtRFdMQU5fQVVUT0dFTl9NQUNBRERSX0ZFQVRVUkUKKworaWZlcSAoJChDT05GSUdfV0xBTl9GRUFUVVJFXzExVykseSkKK0NERUZJTkVTICs9IC1EV0xBTl9GRUFUVVJFXzExVworZW5kaWYKKworaWZlcSAoJChDT05GSUdfUUNPTV9MVEVfQ09FWCkseSkKK0NERUZJTkVTICs9IC1ERkVBVFVSRV9XTEFOX0NIX0FWT0lECitlbmRpZgorCitpZmVxICgkKENPTkZJR19XTEFOX0ZFQVRVUkVfTFBTUykseSkKK0NERUZJTkVTICs9IC1EV0xBTl9GRUFUVVJFX0xQU1MKK2VuZGlmCisKK2lmZXEgKCQoUEFOSUNfT05fQlVHKSwxKQorQ0RFRklORVMgKz0gLURQQU5JQ19PTl9CVUcKK2VuZGlmCisKK2lmZXEgKCQoV0xBTl9PUEVOX1NPVVJDRSksIDEpCitDREVGSU5FUyArPSAtRFdMQU5fT1BFTl9TT1VSQ0UKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0ZFQVRVUkVfU1RBVFNfRVhUKSwgMSkKK0NERUZJTkVTICs9IC1EV0xBTl9GRUFUVVJFX1NUQVRTX0VYVAorZW5kaWYKKworaWZlcSAoJChDT05GSUdfUUNBQ0xEX0ZFQVRVUkVfTkFOKSx5KQorQ0RFRklORVMgKz0gLURXTEFOX0ZFQVRVUkVfTkFOCitlbmRpZgorCitpZmVxICgkKENPTkZJR19RQ0FfSUJTU19TVVBQT1JUKSwgMSkKK0NERUZJTkVTICs9IC1EUUNBX0lCU1NfU1VQUE9SVAorZW5kaWYKKworI0VuYWJsZSBPTCBkZWJ1ZyBhbmQgd21pIHVuaWZpZWQgZnVuY3Rpb25zCitpZmVxICgkKENPTkZJR19BVEhfUEVSRl9QV1JfT0ZGTE9BRCksIDEpCitDREVGSU5FUyArPSAtREFUSF9QRVJGX1BXUl9PRkZMT0FECitlbmRpZgorCisjRGlzYWJsZSBwYWNrZXQgbG9nCitpZmVxICgkKENPTkZJR19SRU1PVkVfUEtUX0xPRyksIDEpCitDREVGSU5FUyArPSAtRFJFTU9WRV9QS1RfTE9HCitlbmRpZgorCisjRW5hYmxlIDExQUMgVFgKK2lmZXEgKCQoQ09ORklHX0FUSF8xMUFDX1RYQ09NUEFDVCksIDEpCitDREVGSU5FUyArPSAtREFUSF8xMUFDX1RYQ09NUEFDVAorZW5kaWYKKworI0VuYWJsZSBwZXIgdmRldiBUeCBkZXNjIHBvb2wKK2lmZXEgKCQoQ09ORklHX1BFUl9WREVWX1RYX0RFU0NfUE9PTCksIDEpCitDREVGSU5FUyArPSAtRENPTkZJR19QRVJfVkRFVl9UWF9ERVNDX1BPT0wKK2VuZGlmCisKKyNFbmFibGUgT1Mgc3BlY2lmaWMgSVJRIGFic3RyYWN0aW9uCitpZmVxICgkKENPTkZJR19BVEhfU1VQUE9SVF9TSEFSRURfSVJRKSwgMSkKK0NERUZJTkVTICs9IC1EQVRIX1NVUFBPUlRfU0hBUkVEX0lSUQorZW5kaWYKKworI0VuYWJsZSBtZXNzYWdlIGJhc2VkIEhJRiBpbnN0ZWFkIG9mIFJBVyBhY2Nlc3MgaW4gQk1JCitpZmVxICgkKENPTkZJR19ISUZfTUVTU0FHRV9CQVNFRCksIDEpCitDREVGSU5FUyArPSAtREhJRl9NRVNTQUdFX0JBU0VECitlbmRpZgorCisjRW5hYmxlIFBDSSBzcGVjaWZpYyBBUElTIChkbWEsIGV0YykKK2lmZXEgKCQoQ09ORklHX0hJRl9QQ0kpLCAxKQorQ0RFRklORVMgKz0gLURISUZfUENJCitlbmRpZgorCisjRW5hYmxlIFVTQiBzcGVjaWZpYyBBUElTCitpZmVxICgkKENPTkZJR19ISUZfVVNCKSwgMSkKK0NERUZJTkVTICs9IC1ESElGX1VTQgorQ0RFRklORVMgKz0gLURDT05GSUdfSExfU1VQUE9SVAorZW5kaWYKKworI0VuYWJsZSBGVyBsb2dzIHRocm91Z2ggaW5pCitDREVGSU5FUyArPSAtRENPTkZJR19GV19MT0dTX0JBU0VEX09OX0lOSQorCisjRW5hYmxlIHBjaSByZWFkL3dyaXRlIGNvbmZpZyBmdW5jdGlvbnMKK2lmZXEgKCQoQ09ORklHX0FUSF9QQ0kpLCAxKQorQ0RFRklORVMgKz0gLURBVEhfUENJCitlbmRpZgorCisjRW5hYmxlIHBvd2VyIG1hbmFnZW1lbnQgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb25hbGl0eQoraWZlcSAoJChDT05GSUdfQVRIX0JVU19QTSksIDEpCitDREVGSU5FUyArPSAtREFUSF9CVVNfUE0KK2VuZGlmCisKKyNFbmFibGUgRkxPV01BQyBtb2R1bGUgc3VwcG9ydAoraWZlcSAoJChDT05GSUdfQVRIX1NVUFBPUlRfRkxPV01BQ19NT0RVTEUpLCAxKQorQ0RFRklORVMgKz0gLURBVEhfU1VQUE9SVF9GTE9XTUFDX01PRFVMRQorZW5kaWYKKworI0VuYWJsZSBzcGVjdHJhbCBzdXBwb3J0CitpZmVxICgkKENPTkZJR19BVEhfU1VQUE9SVF9TUEVDVFJBTCksIDEpCitDREVGSU5FUyArPSAtREFUSF9TVVBQT1JUX1NQRUNUUkFMCitlbmRpZgorCisjRW5hYmxlIFdESSBFdmVudCBzdXBwb3J0CitpZmVxICgkKENPTkZJR19XRElfRVZFTlRfRU5BQkxFKSwgMSkKK0NERUZJTkVTICs9IC1EV0RJX0VWRU5UX0VOQUJMRQorZW5kaWYKKworI0VuZGlhbmVzcyBzZWxlY3Rpb24KK2lmZXEgKCQoQ09ORklHX0xJVFRMRV9FTkRJQU4pLCAxKQorQUhfTElUVExFX0VORElBTj0xMjM0CitDREVGSU5FUyArPSAtREFIX0JZVEVfT1JERVI9JChBSF9MSVRUTEVfRU5ESUFOKQorZWxzZQorQUhfQklHX0VORElBTj00MzIxCitDREVGSU5FUyArPSAtREFIX0JZVEVfT1JERVI9JChBSF9CSUdfRU5ESUFOKQorQ0RFRklORVMgKz0gLURCSUdfRU5ESUFOX0hPU1QKK2VuZGlmCisKKyNFbmFibGUgVFggcmVjbGFpbSBzdXBwb3J0CitpZmVxICgkKENPTkZJR19UWF9DUkVESVRfUkVDTEFJTV9TVVBQT1JUKSwgMSkKK0NERUZJTkVTICs9IC1EVFhfQ1JFRElUX1JFQ0xBSU1fU1VQUE9SVAorZW5kaWYKKworI0VuYWJsZSBGVE0gc3VwcG9ydAoraWZlcSAoJChDT05GSUdfUUNBX1dJRklfRlRNKSwgMSkKK0NERUZJTkVTICs9IC1EUUNBX1dJRklfRlRNCitlbmRpZgorCisjRW5hYmxlIENoZWNrc3VtIE9mZmxvYWQgc3VwcG9ydAoraWZlcSAoJChDT05GSUdfQ0hFQ0tTVU1fT0ZGTE9BRCksIDEpCitDREVGSU5FUyArPSAtRENIRUNLU1VNX09GRkxPQUQKK2VuZGlmCisKKyNFbmFibGUgQ2hlY2tzdW0gT2ZmbG9hZCBzdXBwb3J0CitpZmVxICgkKENPTkZJR19JUEFfT0ZGTE9BRCksIDEpCitDREVGSU5FUyArPSAtRElQQV9PRkZMT0FECitlbmRpZgorCitpZm5lcSAoJChDT05GSUdfQVJDSF9NRE05NjMwKSwgeSkKK2lmZXEgKCQoQ09ORklHX0FSQ0hfTURNOTY0MCksIHkpCitDREVGSU5FUyArPSAtRFFDQV9DT05GSUdfU01QCitlbmRpZgorZW5kaWYKKworI0VuYWJsZSBHVEsgT2ZmbG9hZAoraWZlcSAoJChDT05GSUdfR1RLX09GRkxPQUQpLCAxKQorQ0RFRklORVMgKz0gLURXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKK0NERUZJTkVTICs9IC1ESUdUS19PRkZMT0FECitlbmRpZgorCisjRW5hYmxlIEdUSyBPZmZsb2FkCitpZmVxICgkKENPTkZJR19FWFRfV09XKSwgMSkKK0NERUZJTkVTICs9IC1EV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCitlbmRpZgorCisjTWFyayBpdCBhcyBTTVAgS2VybmVsCitpZmVxICgkKENPTkZJR19TTVApLHkpCitDREVGSU5FUyArPSAtRFFDQV9DT05GSUdfU01QCitlbmRpZgorCitpZmVxICgkKENPTkZJR19XTEFOX0ZFQVRVUkVfUlhfV0FLRUxPQ0spLCB5KQorQ0RFRklORVMgKz0gLURXTEFOX0ZFQVRVUkVfSE9MRF9SWF9XQUtFTE9DSworZW5kaWYKKworI0VuYWJsZSBDaGFubmVsIE1hdHJpeCByZXN0cmljdGlvbiBmb3IgYWxsIHRhcmdldHMKK0NERUZJTkVTICs9IC1EV0xBTl9FTkFCTEVfQ0hOTF9NQVRSSVhfUkVTVFJJQ1RJT04KKworI2ZlYXR1cmVzIHNwZWNpZmljIHRvIG1vYmlsZSByb3V0ZXIgdXNlIGNhc2UKK2lmZXEgKCQoQ09ORklHX01PQklMRV9ST1VURVIpLCB5KQorCisjZW5hYmxlIE1DQyBUTyBTQ0Mgc3dpdGNoCitDREVGSU5FUyArPSAtREZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCisjZW5hYmxlIHdsYW4gYXV0byBzaHV0ZG93biBmZWF0dXJlCitDREVGSU5FUyArPSAtREZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOCisKKyNlbmFibGUgZm9yIE1CU1NJRAorQ0RFRklORVMgKz0gLURXTEFOX0ZFQVRVUkVfTUJTU0lECisKKyNlbmFibGUgQVAtQVAgQUNTIE9wdGltaXphdGlvbgorQ0RFRklORVMgKz0gLURGRUFUVVJFX1dMQU5fQVBfQVBfQUNTX09QVElNSVpFCisKKyNFbmFibGUgNGFkZHJlc3Mgc2NoZW1lCitDREVGSU5FUyArPSAtREZFQVRVUkVfV0xBTl9TVEFfNEFERFJfU0NIRU1FCisKKyNEaXNhYmxlIFNUQS1BUCBNb2RlIERGUyBzdXBwb3J0CitDREVGSU5FUyArPSAtREZFQVRVUkVfV0xBTl9TVEFfQVBfTU9ERV9ERlNfRElTQUJMRQorCisjRW5hYmxlIE9CU1MgZmVhdHVyZQorQ0RFRklORVMgKz0gLURRQ0FfSFRfMjA0MF9DT0VYCisKKyNEaXNhYmxlIEhUNDAgaW4gMi40R0haIFNUQSBtb2RlCitDREVGSU5FUyArPSAtRFFDQV9IVF8yMF8yNEdfU1RBX09OTFkKKworZWxzZSAjQ09ORklHX01PQklMRV9ST1VURVIKKworI09wZW4gUDJQIGRldmljZSBpbnRlcmZhY2Ugb25seSBmb3Igbm9uLU1vYmlsZSByb3V0ZXIgdXNlIGNhc2VzCitDREVGSU5FUyArPSAtRFdMQU5fT1BFTl9QMlBfSU5URVJGQUNFCisKKyNFbmFibGUgMi40IEdIeiBzb2NpYWwgY2hhbm5lbHMgaW4gNSBHSHogb25seSBtb2RlIGZvciBwMnAgdXNhZ2UKK0NERUZJTkVTICs9IC1EV0xBTl9FTkFCTEVfU09DSUFMX0NIQU5ORUxTXzVHX09OTFkKKworZW5kaWYgI0NPTkZJR19NT0JJTEVfUk9VVEVSCisKKyNHcmVlbiBBUCBmZWF0dXJlCitpZmVxICgkKENPTkZJR19RQ0FDTERfRkVBVFVSRV9HUkVFTl9BUCkseSkKK0NERUZJTkVTICs9IC1ERkVBVFVSRV9HUkVFTl9BUAorZW5kaWYKKworI0VuYWJsZSBSWCBGdWxsIHJlLW9yZGVyIE9MIGZlYXR1cmUgb25seSAiTEwgYW5kIE5PTi1NRE05NjMwIHBsYXRmb3JtIgoraWZuZXEgKCQoQ09ORklHX0FSQ0hfTURNOTYzMCksIHkpCitpZmVxICgkKENPTkZJR19ISUZfUENJKSwgMSkKK0NERUZJTkVTICs9IC1EV0xBTl9GRUFUVVJFX1JYX0ZVTExfUkVPUkRFUl9PTAorZW5kaWYKK2VuZGlmCisKKyNFbmFibGUgU2lnbmVkIGZpcm13YXJlIHN1cHBvcnQgZm9yIHNwbGl0IGJpbmFyeSBmb3JtYXQKK2lmZXEgKCQoQ09ORklHX1FDQV9TSUdORURfU1BMSVRfQklOQVJZX1NVUFBPUlQpLCAxKQorQ0RFRklORVMgKz0gLURRQ0FfU0lHTkVEX1NQTElUX0JJTkFSWV9TVVBQT1JUCitlbmRpZgorCisjRW5hYmxlIHNpbmdsZSBmaXJtd2FyZSBiaW5hcnkgZm9ybWF0CitpZmVxICgkKENPTkZJR19RQ0FfU0lOR0xFX0JJTkFSWV9TVVBQT1JUKSwgMSkKK0NERUZJTkVTICs9IC1EUUNBX1NJTkdMRV9CSU5BUllfU1VQUE9SVAorZW5kaWYKKworI0VuYWJsZSBjb2xsZWN0aW5nIHRhcmdldCBSQU0gZHVtcCBhZnRlciBrZXJuZWwgcGFuaWMKK2lmZXEgKCQoQ09ORklHX1RBUkdFVF9SQU1EVU1QX0FGVEVSX0tFUk5FTF9QQU5JQyksIDEpCitDREVGSU5FUyArPSAtRFRBUkdFVF9SQU1EVU1QX0FGVEVSX0tFUk5FTF9QQU5JQworZW5kaWYKKworI0VuYWJsZS9kaXNhYmxlIHNlY3VyZSBmaXJtd2FyZSBmZWF0dXJlCitpZmVxICgkKENPTkZJR19GRUFUVVJFX1NFQ1VSRV9GSVJNV0FSRSksIDEpCitDREVGSU5FUyArPSAtREZFQVRVUkVfU0VDVVJFX0ZJUk1XQVJFCitlbmRpZgorCitpZmVxICgkKENPTkZJR19BVEhfUENJRV9BQ0NFU1NfREVCVUcpLCAxKQorQ0RFRklORVMgKz0gLURDT05GSUdfQVRIX1BDSUVfQUNDRVNTX0RFQlVHCitlbmRpZgorCisjIFNvbWUga2VybmVsIGluY2x1ZGUgZmlsZXMgYXJlIGJlaW5nIG1vdmVkLiAgQ2hlY2sgdG8gc2VlIGlmCisjIHRoZSBvbGQgdmVyc2lvbiBvZiB0aGUgZmlsZXMgYXJlIHByZXNlbnQKKworaWZuZXEgKCQod2lsZGNhcmQgJChzcmN0cmVlKS9hcmNoLyQoU1JDQVJDSCkvbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9zbWQuaCksKQorQ0RFRklORVMgKz0gLURFWElTVFNfTVNNX1NNRAorZW5kaWYKKworaWZuZXEgKCQod2lsZGNhcmQgJChzcmN0cmVlKS9hcmNoLyQoU1JDQVJDSCkvbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9zbXNtLmgpLCkKK0NERUZJTkVTICs9IC1ERVhJU1RTX01TTV9TTVNNCitlbmRpZgorCisjIEVuYWJsZSBmZWF0dXJlIHN1cHBvcnQgZm8gTGludXggdmVyc2lvbiBRQ01CUgoraWZlcSAoJChDT05GSUdfTElOVVhfUUNNQlIpLHkpCitDREVGSU5FUyArPSAtRExJTlVYX1FDTUJSCitlbmRpZgorCisjIE5PVEU6IENPTkZJR182NEJJVF9QQUREUiByZXF1aXJlcyBDT05GSUdfSEVMSVVNUExVUworaWZlcSAoeSwkKGZpbHRlciB5LCQoQ09ORklHX0NOU1NfRU9TKSAkKENPTkZJR19JQ05TUykpKQorQ09ORklHX0hFTElVTVBMVVMgOj0geQorQ09ORklHXzY0QklUX1BBRERSIDo9IHkKK0NPTkZJR19GRUFUVVJFX1RTTyA6PSB5CitDT05GSUdfRkVBVFVSRV9UU09fREVCVUcgOj0geQoraWZlcSAoJChDT05GSUdfSEVMSVVNUExVUykseSkKK0NERUZJTkVTICs9IC1ESEVMSVVNUExVU19QQUREUjY0CitDREVGSU5FUyArPSAtREhFTElVTVBMVVMKK2lmZXEgKCQoQ09ORklHXzY0QklUX1BBRERSKSx5KQorQ0RFRklORVMgKz0gLURIVFRfUEFERFI2NAorZW5kaWYKK2VuZGlmCitlbmRpZgorCitpZmVxICgkKENPTkZJR19GRUFUVVJFX1RTTykseSkKK0NERUZJTkVTICs9IC1ERkVBVFVSRV9UU08KK2VuZGlmCitpZmVxICgkKENPTkZJR19GRUFUVVJFX1RTT19ERUJVRykseSkKK0NERUZJTkVTICs9IC1ERkVBVFVSRV9UU09fREVCVUcKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1dMQU5fTFJPKSwgeSkKK0NERUZJTkVTICs9IC1ERkVBVFVSRV9MUk8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX01PQklMRV9ST1VURVIpLCB5KQorQ0RFRklORVMgKz0gLURGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX01QQ19VVF9GUkFNRVdPUkspLCB5KQorQ0RFRklORVMgKz0gLURNUENfVVRfRlJBTUVXT1JLCitlbmRpZgorCitpZmVxICgkKENPTkZJR19XTEFOX09GRkxPQURfUEFDS0VUUykseSkKK0NERUZJTkVTICs9IC1EV0xBTl9GRUFUVVJFX09GRkxPQURfUEFDS0VUUworZW5kaWYKKworaWZlcSAoJChDT05GSUdfV0xBTl9GRUFUVVJFX01FTURVTVApLHkpCitDREVGSU5FUyArPSAtRFdMQU5fRkVBVFVSRV9NRU1EVU1QCitlbmRpZgorCitpZmVxICgkKENPTkZJR19TVEFUSUNBTExZX0FERF8xMVBfQ0hBTk5FTFMpLHkpCitDREVGSU5FUyArPSAtREZFQVRVUkVfU1RBVElDQUxMWV9BRERfMTFQX0NIQU5ORUxTCitlbmRpZgorCitLQlVJTERfQ1BQRkxBR1MgKz0gJChDREVGSU5FUykKKworIyBDdXJyZW50bHksIGZvciB2ZXJzaW9ucyBvZiBnY2Mgd2hpY2ggc3VwcG9ydCBpdCwgdGhlIGtlcm5lbCBNYWtlZmlsZQorIyBpcyBkaXNhYmxpbmcgdGhlIG1heWJlLXVuaW5pdGlhbGl6ZWQgd2FybmluZy4gIFJlLWVuYWJsZSBpdCBmb3IgdGhlCisjIFdMQU4gZHJpdmVyLiAgTm90ZSB0aGF0IHdlIG11c3QgdXNlIEVYVFJBX0NGTEFHUyBoZXJlIHNvIHRoYXQgaXQKKyMgd2lsbCBvdmVycmlkZSB0aGUga2VybmVsIHNldHRpbmdzLgoraWZlcSAoJChjYWxsIGNjLW9wdGlvbi15biwgLVdtYXliZS11bmluaXRpYWxpemVkKSx5KQorRVhUUkFfQ0ZMQUdTICs9IC1XbWF5YmUtdW5pbml0aWFsaXplZAorZW5kaWYKKworIyBNb2R1bGUgaW5mb3JtYXRpb24gdXNlZCBieSBLQnVpbGQgZnJhbWV3b3JrCitvYmotJChDT05GSUdfUUNBX0NMRF9XTEFOKSArPSAkKE1PRE5BTUUpLm8KKyQoTU9ETkFNRSkteSA6PSAkKE9CSlMpCmRpZmYgLS1naXQgYS9LY29uZmlnIGIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Y4ZTFkCi0tLSAvZGV2L251bGwKKysrIGIvS2NvbmZpZwpAQCAtMCwwICsxLDExMCBAQAorY29tbWVudCAiUXVhbGNvbW0gQXRoZXJvcyBDTEQgV0xBTiBtb2R1bGUiCisKK2NvbmZpZyBRQ0FfQ0xEX1dMQU4KKworCXRyaXN0YXRlICJRdWFsY29tbSBBdGhlcm9zIENMRCBXTEFOIG1vZHVsZSIKKwlkZWZhdWx0IG4KKwloZWxwCisJQWRkIHN1cHBvcnQgZm9yIHRoZSBRdWFsY29tbSBBdGhlcm9zIENMRCBXTEFOIG1vZHVsZQorCitpZiBRQ0FfQ0xEX1dMQU4gIT0gbgorCitjb25maWcgUUNBQ0xEX1dMQU5fTEZSMworCWJvb2wgIkVuYWJsZSB0aGUgV0xBTiBMZWdhY3kgRmFzdCBSb2FtaW5nIGZlYXR1cmUgVmVyc2lvbiAzIgorCWRlZmF1bHQgbgorCitjb25maWcgUFJJTUFfV0xBTl9PS0MKKwlib29sICJFbmFibGUgdGhlIFByaW1hIFdMQU4gT3Bwb3J0dW5pc3RpYyBLZXkgQ2FjaGluZyBmZWF0dXJlIgorCWRlZmF1bHQgbgorCitjb25maWcgUFJJTUFfV0xBTl8xMUFDX0hJR0hfVFAKKwlib29sICJFbmFibGUgdGhlIFByaW1hIFdMQU4gODAyLjExYWMgSGlnaCBUaHJvdWdocHV0IG9wdGlvbiAoZGVwZW5kcyB1cG9uIGtlcm5lbCBzdXBwb3J0KSIKKwlkZWZhdWx0IG4KKworY29uZmlnIFdMQU5fRkVBVFVSRV8xMVcKKwlib29sICJFbmFibGUgdGhlIFdMQU4gODAyLjExdyBQcm90ZWN0ZWQgTWFuYWdlbWVudCBGcmFtZXMgZmVhdHVyZSIKKwlkZWZhdWx0IG4KKworY29uZmlnIFdMQU5fRkVBVFVSRV9MUFNTCisJYm9vbCAiRW5hYmxlIHRoZSBXTEFOIExQU1MgZmVhdHVyZSIKKwlkZWZhdWx0IG4KKworY29uZmlnIFFDT01fVk9XSUZJXzExUgorCWJvb2wgIkVuYWJsZSBGYXN0IFRyYW5zaXRpb24gKDExcikgZmVhdHVyZSIKKwlkZWZhdWx0IG4KKworY29uZmlnIFFDQUNMRF9GRUFUVVJFX05BTgorCWJvb2wgIkVuYWJsZSBOQU4gZmVhdHVyZSIKKwlkZWZhdWx0IG4KKworY29uZmlnIFFDQUNMRF9GRUFUVVJFX0dSRUVOX0FQCisJYm9vbCAiRW5hYmxlIEdyZWVuIEFQIGZlYXR1cmUiCisJZGVmYXVsdCBuCisKK2NvbmZpZyBIRUxJVU1QTFVTCisJYm9vbCAiRW5hYmxlIEJlZWxpbmVyIGJhc2VkIGRlc2NyaXB0b3Igc3RydWN0dXJlcyBmb3IgSGVsaXVtIgorCWRlZmF1bHQgbgorCitjb25maWcgNjRCSVRfUEFERFIKKwlib29sICJFbmFibGUgMzctYml0IHBoeXNpY2FsL2J1cyBhZGRyZXNzZXMiCisJZGVwZW5kcyBvbiBIRUxJVU1QTFVTCisJZGVmYXVsdCBuCisKK2NvbmZpZyBRQ09NX1RETFMKKwlib29sICJFbmFibGUgVERMUyBmZWF0dXJlIgorCWRlZmF1bHQgbgorCitjb25maWcgUUNPTV9MVEVfQ09FWAorCWJvb2wgIkVuYWJsZSBRQ09NIExURSBDb2V4IGZlYXR1cmUiCisJZGVmYXVsdCBuCisKK2NvbmZpZyBNUENfVVRfRlJBTUVXT1JLCisJYm9vbCAiRW5hYmxlIFVuaXQgdGVzdCBmcmFtZXdvcmsgZm9yIG11bHRpcG9ydCBjb25jdXJyZW5jeSIKKwlkZWZhdWx0IG4KKworY29uZmlnIFdMQU5fT0ZGTE9BRF9QQUNLRVRTCisJYm9vbCAiRW5hYmxlIG9mZmxvYWQgcGFja2V0cyBmZWF0dXJlIgorCWRlZmF1bHQgbgorCitjb25maWcgV0xBTl9GRUFUVVJFX01FTURVTVAKKwlib29sICJFbmFibGUgTUVNRFVNUCBmZWF0dXJlIgorCWRlZmF1bHQgbgorCitjb25maWcgRkVBVFVSRV9UU08KKwlib29sICJFbmFibGUgVENQIFNlZ21lbnRhdGlvbiBPZmZsb2FkIgorCWRlcGVuZHMgb24gSEVMSVVNUExVUworCWRlZmF1bHQgbgorCitjb25maWcgRkVBVFVSRV9UU09fREVCVUcKKwlib29sICJFbmFibGUgVENQIFNlZ21lbnRhdGlvbiBPZmZsb2FkIHdpdGggZGVidWciCisJZGVwZW5kcyBvbiBGRUFUVVJFX1RTTworCWRlZmF1bHQgbgorCitjb25maWcgV0xBTl9GQVNUUEFUSAorCWJvb2wgIkVuYWJsZSBmYXN0cGF0aCBmb3IgZGF0YXBhY2tldHMiCisJZGVmYXVsdCBuCisKK2NvbmZpZyBXTEFOX05BUEkKKwlib29sICJFbmFibGUgTkFQSSAtIGRhdGFwYXRoIHJ4IgorCWRlZmF1bHQgbgorCitjb25maWcgV0xBTl9OQVBJX0RFQlVHCisgICAgICAgYm9vbCAiRW5hYmxlIGRlYnVnIGxvZ2dpbmcgb24gTkFQSSIKKyAgICAgICBkZXBlbmRzIG9uIFdMQU5fTkFQSQorICAgICAgIGRlZmF1bHQgbgorCitjb25maWcgV0xBTl9UWF9GTE9XX0NPTlRST0xfVjIKKwlib29sICJFbmFibGUgdHggZmxvdyBjb250cm9sIHZlcnNpb246MiIKKwlkZWZhdWx0IG4KKworY29uZmlnIFdMQU5fTFJPCisJYm9vbCAiRW5hYmxlIExhcmdlIFJlY2VpdmUgT2ZmbG9hZCIKKwlkZXBlbmRzIG9uIEhFTElVTVBMVVMKKwlkZXBlbmRzIG9uIENPTkZJR19JTkVUX0xSTworCWRlZmF1bHQgbgorCitjb25maWcgV0xBTl9GRUFUVVJFX1JYX1dBS0VMT0NLCisJYm9vbCAiRW5hYmxlIFJYIHdha2UgbG9jayBmZWF0dXJlIgorCWRlZmF1bHQgbgorCitlbmRpZiAjIFFDQV9DTERfV0xBTgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQxOTgzCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorS0VSTkVMX1NSQyA/PSAvbGliL21vZHVsZXMvJChzaGVsbCB1bmFtZSAtcikvYnVpbGQKKworS0JVSUxEX09QVElPTlMgOj0gV0xBTl9ST09UPSQoUFdEKQorS0JVSUxEX09QVElPTlMgKz0gTU9ETkFNRT13bGFuCisKKyNCeSBkZWZhdWx0IGJ1aWxkIGZvciBDTEQKK1dMQU5fU0VMRUNUIDo9IENPTkZJR19RQ0FfQ0xEX1dMQU49bQorS0JVSUxEX09QVElPTlMgKz0gQ09ORklHX1FDQV9XSUZJX0lTT0M9MAorS0JVSUxEX09QVElPTlMgKz0gQ09ORklHX1FDQV9XSUZJXzJfMD0xCitLQlVJTERfT1BUSU9OUyArPSAkKFdMQU5fU0VMRUNUKQorS0JVSUxEX09QVElPTlMgKz0gJChLQlVJTERfRVhUUkEpICMgRXh0cmEgY29uZmlnIGlmIGFueQorCithbGw6CisJJChNQUtFKSAtQyAkKEtFUk5FTF9TUkMpIE09JChzaGVsbCBwd2QpIG1vZHVsZXMgJChLQlVJTERfT1BUSU9OUykKKworbW9kdWxlc19pbnN0YWxsOgorCSQoTUFLRSkgSU5TVEFMTF9NT0RfU1RSSVA9MSAtQyAkKEtFUk5FTF9TUkMpIE09JChzaGVsbCBwd2QpIG1vZHVsZXNfaW5zdGFsbAorCitjbGVhbjoKKwkkKE1BS0UpIC1DICQoS0VSTkVMX1NSQykgTT0kKFBXRCkgY2xlYW4KZGlmZiAtLWdpdCBhL2NvbmZpZy9XQ05TU19xY29tX2NmZy5pbmkgYi9jb25maWcvV0NOU1NfcWNvbV9jZmcuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZWRkZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvV0NOU1NfcWNvbV9jZmcuaW5pCkBAIC0wLDAgKzEsNTkxIEBACisjIFRoaXMgZmlsZSBhbGxvd3MgdXNlciB0byBvdmVycmlkZSB0aGUgZmFjdG9yeQorCisjIGRlZmF1bHRzIGZvciB0aGUgV0xBTiBEcml2ZXIKKworCisjIEVuYWJsZSBJTVBTIG9yIG5vdAorZ0VuYWJsZUltcHM9MQorCisjIEVuYWJsZS9EaXNhYmxlIElkbGUgU2NhbgorCitnRW5hYmxlSWRsZVNjYW49MAorCisKKyMgSW5jcmVhc2Ugc2xlZXAgZHVyYXRpb24gKHNlY29uZHMpIGR1cmluZyBJTVBTCisjIDAgaW1wbGllcyBubyBwZXJpb2RpYyB3YWtlIHVwIGZyb20gSU1QUy4gUGVyaW9kaWMgd2FrZXVwIGlzCisjIHVubmVjZXNzYXJ5IGlmIElkbGUgU2NhbiBpcyBkaXNhYmxlZC4KK2dJbXBzTW9kU2xlZXBUaW1lPTAKKworCisjIEVuYWJsZSBCTVBTIG9yIG5vdAorZ0VuYWJsZUJtcHM9MQorCisjIEVuYWJsZSBzdXNwZW5kIG9yIG5vdAorCisjIDE6IEVuYWJsZSBzdGFuZGJ5LCAyOiBFbmFibGUgRGVlcCBzbGVlcCwgMzogRW5hYmxlIE1jYXN0L0JjYXN0IEZpbHRlcgorCitnRW5hYmxlU3VzcGVuZD0zCisKKworIyBQaHkgTW9kZSAoYXV0bywgYiwgZywgbiwgZXRjKQorIyBWYWxpZCB2YWx1ZXMgYXJlIDAtOSwgd2l0aCAwID0gQXV0bywgNCA9IDExbiwgOSA9IDExYWMKKyMgMSA9IDExYWJnLCAyID0gMTFiLCAzID0gMTFnLCA1ID0gMTFnIG9ubHksIDYgPSAxMW4gb25seQorIyA3ID0gMTFiIG9ubHkgOCA9IDExYWMgb25seS4KK2dEb3QxMU1vZGU9MAorCisKKyMgQ1NSIFJvYW1pbmcgRW5hYmxlKDEpIERpc2FibGUoMCkKKworZ1JvYW1pbmdUaW1lPTAKKworCisjIEFzc2lnbmVkIE1BQyBBZGRyZXNzZXMgLSBUaGlzIHdpbGwgYmUgdXNlZCB1bnRpbCBOViBpdGVtcyBhcmUgaW4gcGxhY2UKKworIyBFYWNoIGJ5dGUgb2YgTUFDIGFkZHJlc3MgaXMgcmVwcmVzZW50ZWQgaW4gSGV4IGZvcm1hdCBhcyBYWAorCitJbnRmME1hY0FkZHJlc3M9MDAwQUY1ODk4OUZGCitJbnRmMU1hY0FkZHJlc3M9MDAwQUY1ODk4OUZFCitJbnRmMk1hY0FkZHJlc3M9MDAwQUY1ODk4OUZECisKK0ludGYzTWFjQWRkcmVzcz0wMDBBRjU4OTg5RkMKKworCisjIFVBUFNEIHNlcnZpY2UgaW50ZXJ2YWwgZm9yIFZPLFZJLCBCRSwgQksgdHJhZmZpYworCitJbmZyYVVhcHNkVm9TcnZJbnR2PTAKKworSW5mcmFVYXBzZFZpU3J2SW50dj0wCisKK0luZnJhVWFwc2RCZVNydkludHY9MAorCitJbmZyYVVhcHNkQmtTcnZJbnR2PTAKKworIyBGbGFnIHRvIGFsbG93IFNUQSBzZW5kIEFkZFRzcGVjIGV2ZW4gd2hlbiBBQ00gaXMgT2ZmCitnQWRkVFNXaGVuQUNNSXNPZmY9MQorCisjIE1ha2UgMXgxIHRoZSBkZWZhdWx0IGFudGVubmEgY29uZmlndXJhdGlvbgorCitnTnVtUnhBbnQ9MQorCisKKyMgQmVhY29uIGZpbHRlcmluZyBmcmVxdWVuY3kgKHVuaXQgaW4gYmVhY29uIGludGVydmFscykKKworZ050aEJlYWNvbkZpbHRlcj01MAorCisKKyMgRW5hYmxlIFdBUEkgb3Igbm90CisKKyMgV0FQSUlzRW5hYmxlZD0wCisKKworIyBGbGFncyB0byBmaWx0ZXIgTWNhc3QgYWJkIEJjYXN0IFJYIHBhY2tldHMuCisKKyMgVmFsdWUgMDogTm8gZmlsdGVyaW5nLCAxOiBGaWx0ZXIgYWxsIE11bHRpY2FzdC4KKworIyAyOiBGaWx0ZXIgYWxsIEJyb2FkY2FzdC4gMzogRmlsdGVyIGFsbCBNY2FzdCBhYmQgQmNhc3QKKworTWNhc3RCY2FzdEZpbHRlcj0zCisKKworI0ZsYWcgdG8gZW5hYmxlIEhvc3RBUlBPZmZsb2FkIGZlYXR1cmUgb3Igbm90CisKK2hvc3RBcnBPZmZsb2FkPTEKKworI0ZsYWcgdG8gZW5hYmxlIEhvc3ROU09mZmxvYWQgZmVhdHVyZSBvciBub3QKKworaG9zdE5TT2ZmbG9hZD0xCisKKyMgVGhpcyBmbGFnIGVuYWJsZXMgSVAsIFRDUCBhbmQgVURQIGNoZWNrc3VtIG9mZmxvYWQKK2dFbmFibGVJcFRjcFVkcENoZWNrc3VtT2ZmbG9hZD0xCisKKyNTb2Z0QVAgUmVsYXRlZCBQYXJhbWV0ZXJzCisKKyMgQVAgTUFjIGFkZHIKKworZ0FQTWFjQWRkcj0wMDBBRjU4OWRjYWIKKworCisjIDgwMi4xMW4gUHJvdGVjdGlvbiBmbGFnCisKK2dFbmFibGVBcFByb3Q9MQorCisKKyNFbmFibGUgT0JTUyBwcm90ZWN0aW9uCisKK2dFbmFibGVBcE9CU1NQcm90PTEKKworCisjRW5hYmxlL0Rpc2FibGUgVUFQU0QgZm9yIFNvZnRBUAorCitnRW5hYmxlQXBVYXBzZD0xCisKKworIyBGaXhlZCBSYXRlCisKK2dGaXhlZFJhdGU9MAorCisKKyMgTWF4aW11bSBUeCBwb3dlcgorCisjIGdUeFBvd2VyQ2FwPTMwCisKKworIyBGcmFnbWVudGF0aW9uIFRocmVzaG9sZAorCisjIGdGcmFnbWVudGF0aW9uVGhyZXNob2xkPTIzNDYKKworCisjIFJUUyB0aHJlc2hvbGQKKworUlRTVGhyZXNob2xkPTEwNDg1NzYKKworCisjIEludHJhLUJTUyBmb3J3YXJkCisKK2dEaXNhYmxlSW50cmFCc3NGd2Q9MAorCisKKyMgV01NIEVuYWJsZS9EaXNhYmxlCisKK1dtbUlzRW5hYmxlZD0wCisKKworIyA4MDIuMTFkIHN1cHBvcnQKKworZzExZFN1cHBvcnRFbmFibGVkPTEKKworIyA4MDIuMTFoIHN1cHBvcnQKKworZzExaFN1cHBvcnRFbmFibGVkPTEKKworIyBERlMgTWFzdGVyIENhcGFiaWxpdHkKK2dFbmFibGVERlNNYXN0ZXJDYXA9MQorCisjIEVTRSBTdXBwb3J0IGFuZCBmYXN0IHRyYW5zaXRpb24KK0VzZUVuYWJsZWQ9MQorSW1wbGljaXRRb3NJc0VuYWJsZWQ9MAorZ05laWdoYm9yU2NhblRpbWVyUGVyaW9kPTIwMAorCitnTmVpZ2hib3JMb29rdXBUaHJlc2hvbGQ9NzYKK2dOZWlnaGJvclJlYXNzb2NUaHJlc2hvbGQ9ODEKKworZ05laWdoYm9yU2NhbkNoYW5uZWxNaW5UaW1lPTIwCitnTmVpZ2hib3JTY2FuQ2hhbm5lbE1heFRpbWU9MzAKK2dNYXhOZWlnaGJvclJlcVRyaWVzPTMKKworIyBMZWdhY3kgKG5vbi1FU0UsIG5vbi04MDIuMTFyKSBGYXN0IFJvYW1pbmcgU3VwcG9ydAorIyBUbyBlbmFibGUsIHNldCBGYXN0Um9hbUVuYWJsZWQ9MQorIyBUbyBkaXNhYmxlLCBzZXQgRmFzdFJvYW1FbmFibGVkPTAKK0Zhc3RSb2FtRW5hYmxlZD0xCisKKyNDaGVjayBpZiB0aGUgQVAgdG8gd2hpY2ggd2UgYXJlIHJvYW1pbmcgaXMgYmV0dGVyIHRoYW4gY3VycmVudCBBUCBpbiB0ZXJtcyBvZiBSU1NJLgorI0NoZWNraW5nIGlzIGRpc2FibGVkIGlmIHNldCB0byBaZXJvLk90aGVyd2lzZSBpdCB3aWxsIHVzZSB0aGlzIHZhbHVlIGFzIHRvIGhvdyBiZXR0ZXIKKyN0aGUgUlNTSSBvZiB0aGUgbmV3L3JvYW1hYmxlIEFQIHNob3VsZCBiZSBmb3Igcm9hbWluZworUm9hbVJzc2lEaWZmPTMKKworIyBJZiB0aGUgUlNTSSBvZiBhbnkgYXZhaWxhYmxlIGNhbmRpZGF0ZSBpcyBiZXR0ZXIgdGhhbiBjdXJyZW50bHkgYXNzb2NpYXRlZAorIyBBUCBieSBhdCBsZWFzdCBnSW1tZWRpYXRlUm9hbVJzc2lEaWZmLCB0aGVuIGJlaW5nIHRvIHJvYW0gaW1tZWRpYXRlbHkgKHdpdGhvdXQKKyMgcmVnaXN0ZXJpbmcgZm9yIHJlYXNzb2MgdGhyZXNob2xkKS4KKyMgTk9URTogVmFsdWUgb2YgMCBtZWFucyB0aGF0IHdlIHdvdWxkIHJlZ2lzdGVyIGZvciByZWFzc29jIHRocmVzaG9sZC4KK2dJbW1lZGlhdGVSb2FtUnNzaURpZmY9MTAKKworIyBUbyBlbmFibGUsIHNldCBnUm9hbUludHJhQmFuZD0xIChSb2FtaW5nIHdpdGhpbiBiYW5kKQorIyBUbyBkaXNhYmxlLCBzZXQgZ1JvYW1JbnRyYUJhbmQ9MCAoUm9hbWluZyBhY3Jvc3MgYmFuZCkKK2dSb2FtSW50cmFCYW5kPTAKKworI1Nob3J0IEd1YXJkIEludGVydmFsIEVuYWJsZS9kaXNhYmxlCisKK2dTaG9ydEdJMjBNaHo9MQorCitnU2hvcnRHSTQwTWh6PTEKKworCisjQXV0byBTaHV0ZG93biAgVmFsdWUgaW4gc2Vjb25kcy4gQSB2YWx1ZSBvZiAwIG1lYW5zIEF1dG8gc2h1dG9mZiBpcyBkaXNhYmxlZAorCitnQVBBdXRvU2h1dE9mZj0wCisKKyNBdXRvIFNodXRkb3duIHdsYW4gOiBWYWx1ZSBpbiBTZWNvbmRzLiAwIG1lYW5zIGRpc2FibGVkLiBNYXggMSBkYXkgPSA4NjQwMCBzZWMKK2dXbGFuQXV0b1NodXRkb3duID0gMAorCisjIE5vdCB1c2VkLgorZ0FwQXV0b0NoYW5uZWxTZWxlY3Rpb249MAorCisKKyMgTGlzdGVuIEVuZXJneSBEZXRlY3QgTW9kZSBDb25maWd1cmF0aW9uCisKKyMgVmFsaWQgdmFsdWVzIDAtMTI4CisKKyMgMTI4IG1lYW5zIGRpc2FibGUgRW5lcmd5IERldGVjdCBmZWF0dXJlCisKKyMgMC05IGFyZSB0aHJlc2hvbGQgY29kZSBhbmQgNyBpcyByZWNvbW1lbmRlZCB2YWx1ZSBmcm9tIHN5c3RlbSBpZiBmZWF0dXJlIGlzIHRvIGJlIGVuYWJsZWQuCisKKyMgMTAtMTI4IGFyZSByZXNlcnZlZC4KKworIyBUaGUgRURFVCB0aHJlc2hvbGQgbWFwcGluZyBpcyBhcyBmb2xsb3dzIGluIDNkQiBzdGVwOgorCisjIDAgPSAtNjAgZEJtCisKKyMgMSA9IC02MyBkQm0KKworIyAyID0gLTY2IGRCbQorCisjIC4uLgorCisjIDcgPSAtODEgZEJtCisKKyMgOCA9IC04NCBkQm0KKworIyA5ID0gLTg3IGRCbQorCisjIE5vdGU6IEFueSBvZiB0aGVzZSBzZXR0aW5ncyBhcmUgdmFsaWQuIFNldHRpbmcgMCB3b3VsZCB5aWVsZCB0aGUgaGlnaGVzdCBwb3dlciBzYXZpbmcgKGluIGEgbm9pc3kgZW52aXJvbm1lbnQpIGF0IHRoZSBjb3N0IG9mIG1vcmUgcmFuZ2UuIFRoZSByYW5nZSBpbXBhY3QgaXMgYXBwcm94aW1hdGVseSAjY2FsY3VsYXRlZCBhczoKKworIworCisjICBSYW5nZSBMb3NzICAoZEIpICA9ICBFREVUIHRocmVzaG9sZCBsZXZlbCAoZEJtKSArIDk3IGRCbS4KKworIworCitnRW5hYmxlUGh5QWdjTGlzdGVuTW9kZT0xMjgKKworCisjUHJlZmVycmVkIGJhbmQgKGJvdGggb3IgMi40IG9ubHkgb3IgNSBvbmx5KQorCitCYW5kQ2FwYWJpbGl0eT0wCisKKworI0JlYWNvbiBFYXJseSBUZXJtaW5hdGlvbiAoMSA9IGVuYWJsZSB0aGUgQkVUIGZlYXR1cmUsIDAgPSBkaXNhYmxlKQorCitlbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uPTAKKworYmVhY29uRWFybHlUZXJtaW5hdGlvbldha2VJbnRlcnZhbD0zCisKKworI0NoYW5uZWwgQm9uZGluZworZ0NoYW5uZWxCb25kaW5nTW9kZTVHSHo9MQorCisKKyNFbmFibGUgS2VlcCBhbGl2ZSB3aXRoIG5vbi16ZXJvIHBlcmlvZCB2YWx1ZQorCitnU3RhS2VlcEFsaXZlUGVyaW9kID0gMzAKKworI1NheSBnR29LZWVwQWxpdmVQZXJpb2QoNSBzZWNvbmRzKSBhbmQgZ0dvTGlua01vbml0b3JQZXJpb2QoMTAgc2Vjb25kcykuCisjRm9yIGV2ZXJ5IDEwIHNlY29uZHMgRFVUIHNlbmQgUW9zIE51bGwgZnJhbWUoaS5lLiwgS2VlcCBBbGl2ZSBmcmFtZSBpZiBsaW5rIGlzIGlkbGUgZm9yIGxhc3QgMTAgc2Vjb25kcy4pCisjRm9yIGJvdGggYWN0aXZlIGFuZCBwb3dlciBzYXZlIGNsaWVudHMuCisKKyNQb3dlciBzYXZlIGNsaWVudHM6IERVVCBzZXQgVElNIGJpdCBmcm9tIDEwdGggc2Vjb25kIG9ud2FyZHMgYW5kIHRpbGwgY2xpZW50IGhvbm9ycyBUSU0gYml0LgorI0lmIGRvZXNuJ3QgaG9ub3IgZm9yIDUgc2Vjb25kcyB0aGVuIERVVCByZW1vdmUgY2xpZW50LgorCisjQWN0aXZlIGNsaWVudHM6IERVVCBzZW5kIFFvcyBOdWxsIGZyYW1lIGZvciAxMHRoIHNlY29uZHMgb253YXJkcyBpZiBpdCBpcyBub3Qgc3VjY2VzcyBzdGlsbCB3ZSB0cnkgb24KKyMxMXRoIHNlY29uZCBpZiBub3QgdHJpZXMgb24gMTJ0aCBhbmQgc28gb24gdGlsbCAxNXRoIHNlY29uZC4gSGVuY2UgYmVmb3JlIGRpc2Nvbm5lY3Rpb24gRFVUIHdpbGwgc2VuZCA1IE5VTEwgZnJhbWVzLgorI0hlbmNlIGluIGFueSBjYXNlIERVVCB3aWxsIGRldGVjdCBjbGllbnQgZ290IHJlbW92ZWQgaW4gKDEwKzUpIHNlY29uZHMuIGkuZS4sIChnR29LZWVwQWxpdmVQZXJpb2QgKyBnR29MaW5rTW9uaXRvclBlcmlvZCkuLgorCisjZ0dvTGlua01vbml0b3JQZXJpb2QvIGdBcExpbmtNb25pdG9yUGVyaW9kIGlzIHBlcmlvZCB3aGVyZSBsaW5rIGlzIGlkbGUgYW5kIGl0IGlzIHBlcmlvZAorI3doZXJlIHdlIHNlbmQgTlVMTCBmcmFtZS4KKworI2dBcExpbmtNb25pdG9yUGVyaW9kID0gMTAKKworI2dHb0xpbmtNb25pdG9yUGVyaW9kID0gMTAKKworI2dHb0tlZXBBbGl2ZVBlcmlvZC9nQXBLZWVwQWxpdmVQZXJpb2QgaXMgdGltZSB0byBzcGVuZCB0byBjaGVjayB3aGV0aGVyIGZyYW1lIGFyZSBzdWNjZWVkIHRvIHNlbmQgb3Igbm90LgorI0hlbmNlIHRvdGFsIGVmZmVjdGl2ZSBkZXRlY3Rpb24gdGltZSBpcyBnR29MaW5rTW9uaXRvclBlcmlvZCsgZ0dvS2VlcEFsaXZlUGVyaW9kL2dBcExpbmtNb25pdG9yUGVyaW9kKyBnQXBLZWVwQWxpdmVQZXJpb2QuCisKKworZ0dvS2VlcEFsaXZlUGVyaW9kID0gMjAKKworZ0FwS2VlcEFsaXZlUGVyaW9kID0gMjAKKworCisjSWYgc2V0IHdpbGwgc3RhcnQgd2l0aCBhY3RpdmUgc2NhbiBhZnRlciBkcml2ZXIgbG9hZCwgb3RoZXJ3aXNlIHdpbGwgc3RhcnQgd2l0aAorCisjcGFzc2l2ZSBzY2FuIHRvIGZpbmQgb3V0IHRoZSBkb21haW4KKworZ0VuYWJsZUJ5cGFzczExZD0xCisKKworI0lmIHNldCB0byAwLCB3aWxsIG5vdCBzY2FuIERGUyBjaGFubmVscworCitnRW5hYmxlREZTQ2hubFNjYW49MQorCisjIEVuYWJsZSBERlMgY2hhbm5lbCByb2FtCisjIDA6IERJU0FCTEUsIDE6IEVOQUJMRURfTk9STUFMLCAyOiBFTkFCTEVEX0FDVElWRQorZ0FsbG93REZTQ2hhbm5lbFJvYW09MQorCitnVmh0Q2hhbm5lbFdpZHRoPTIKK2dFbmFibGVMb2dwPTEKKworCisjIEVuYWJsZSBBdXRvbWF0aWMgVHggUG93ZXIgY29udHJvbAorCitnRW5hYmxlQXV0b21hdGljVHhQb3dlckNvbnRyb2w9MQorCisjIDAgZm9yIE9MUEMgMSBmb3IgQ0xQQyBhbmQgU0NQQworZ0VuYWJsZUNsb3NlTG9vcD0xCisKKyNEYXRhIEluYWN0aXZpdHkgVGltZW91dCB3aGVuIGluIHBvd2Vyc2F2ZSAoaW4gbXMpCitnRGF0YUluYWN0aXZpdHlUaW1lb3V0PTIwMAorCisjIFZIVCBUeC9SeCBNQ1MgdmFsdWVzCisjIFZhbGlkIHZhbHVlcyBhcmUgMCwxLDIuIElmIGNvbW1lbnRlZCBvdXQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuCisjIDA9TUNTMC03LCAxPU1DUzAtOCwgMj1NQ1MwLTkKK2dWaHRSeE1DUz0yCitnVmh0VHhNQ1M9MgorCisjIFZIVCBUeC9SeCBNQ1MgdmFsdWVzIGZvciAyeDIKKyMgVmFsaWQgdmFsdWVzIGFyZSAwLDEsMi4gSWYgY29tbWVudGVkIG91dCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyMgMD1NQ1MwLTcsIDE9TUNTMC04LCAyPU1DUzAtOQorZ0VuYWJsZTJ4Mj0xCitnVmh0UnhNQ1MyeDI9MgorZ1ZodFR4TUNTMngyPTIKKworIyBTZXQgdHhjaGFpbm1hc2sgYW5kIHJ4Y2hhaW5tYXNrCisjIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHVzZWQgb25seSBpZiBnRW5hYmxlMngyIGlzIDAKKyMgVmFsaWQgdmFsdWVzIGFyZSAxLDIKKyMgU2V0IGdTZXRUeENoYWlubWFzazF4MT0xIG9yIGdTZXRSeENoYWlubWFzazF4MT0xIHRvIHNlbGVjdCBjaGFpbjAuCisjIFNldCBnU2V0VHhDaGFpbm1hc2sxeDE9MiBvciBnU2V0UnhDaGFpbm1hc2sxeDE9MiB0byBzZWxlY3QgY2hhaW4xLgorZ1NldFR4Q2hhaW5tYXNrMXgxPTEKK2dTZXRSeENoYWlubWFzazF4MT0xCisKKyMgU2NhbiBUaW1pbmcgUGFyYW1ldGVycworIyBnUGFzc2l2ZU1heENoYW5uZWxUaW1lPTExMAorIyBnUGFzc2l2ZU1pbkNoYW5uZWxUaW1lPTYwCitnQWN0aXZlTWF4Q2hhbm5lbFRpbWU9NDAKK2dBY3RpdmVNaW5DaGFubmVsVGltZT0yMAorCisjSWYgc2V0IHRvIDAsIE1DQyBpcyBub3QgYWxsb3dlZC4KK2dFbmFibGVNQ0NNb2RlPTEKKworIyBNQ0MgdG8gU0NDIFN3aXRjaCBtb2RlOiAwLURpc2FibGUgMS1FbmFibGUgMi1Gb3JjZSBTQ0MgaWYgc2FtZSBiYW5kCitnV2xhbk1jY1RvU2NjU3dpdGNoTW9kZSA9IDAKKworIyAxPWVuYWJsZSBTVEJDOyAwPWRpc2FibGUgU1RCQworZ0VuYWJsZVJYU1RCQz0xCisKKyMgMT1lbmFibGUgdHggU1RCQzsgMD1kaXNhYmxlCitnRW5hYmxlVFhTVEJDPTEKKworIyAxPWVuYWJsZSByeCBMRFBDOyAwPWRpc2FibGUKK2dFbmFibGVSWExEUEM9MQorCisjRW5hYmxlL0Rpc2FibGUgVHggYmVhbWZvcm1pbmcKK2dUeEJGRW5hYmxlPTEKKworIyBFbmFibGUgVHggYmVhbWZvcm1pbmcgaW4gVkhUMjBNSHoKKyMgVmFsaWQgdmFsdWVzIGFyZSAwLDEuIElmIGNvbW1lbnRlZCBvdXQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuCisjIDA9ZGlzYWJsZSwgMT1lbmFibGUKK2dFbmFibGVUeEJGaW4yME1Iej0xCisKKyNFbmFibGUvRGlzYWJsZSBTVSBUeCBiZWFtZm9ybWVyIHN1cHBvcnQuCitnRW5hYmxlVHhTVUJlYW1mb3JtZXI9MQorCisjRW5hYmxlIFNjYW4gUmVzdWx0cyBBZ2luZyBiYXNlZCBvbiB0aW1lcgorI1RpbWVyIHZhbHVlIGlzIGluIHNlY29uZHMKKyNJZiBTZXQgdG8gMCBpdCB3aWxsIG5vdCBlbmFibGUgdGhlIGZlYXR1cmUKK2dTY2FuQWdpbmdUaW1lPTMwCisKKyNFbmFibGUgU2NhbiBSZXN1bHRzIEFnaW5nIGJhc2VkIG9uIG51bWJlciBvZiBzY2FucworZ1NjYW5SZXN1bHRBZ2VDb3VudD0xCisKKyNFbmFibGUgUG93ZXIgc2F2aW5nIG1lY2hhbmlzbSBCYXNlZCBvbiBBbmRyb2lkIEZyYW1ld29yaworI0lmIHNldCB0byAwIERyaXZlciBpbnRlcm5hbGx5IGNvbnRyb2wgdGhlIFBvd2VyIHNhdmluZyBtZWNoYW5pc20KKyNJZiBzZXQgdG8gMSBBbmRyb2lkIEZyYW13cm9rIGNvbnRyb2wgdGhlIFBvd2VyIHNhdmluZyBtZWNoYW5pc20KK2lzQW5kcm9pZFBzRW49MAorCisjRW5hYmxlIHRoZXJtYWwgbWl0aWdhdGlvbgorZ1RoZXJtYWxNaXRpZ2F0aW9uRW5hYmxlPTAKKworZ0VuYWJsZUZhc3RSb2FtSW5Db25jdXJyZW5jeT0xCisKKyNNYXhpdW0gQ2hhbm5lbCB0aW1lIGluIG1zZWMKK2dNYXhNZWRpdW1UaW1lID0gNjAwMAorCisjIDgwMi4xMUsgc3VwcG9ydAorZ1JybUVuYWJsZT0xCitnUnJtT3BlckNoYW5NYXg9OAorZ1JybU5vbk9wZXJDaGFuTWF4PTgKK2dScm1SYW5kSW50dmw9MTAwCisKKyNTY2FuIG9mZmxvYWQKK2dFbmFibGVEaXJlY3RlZFNjYW5PZmZsb2FkPTEKKworI0ZsZXhDb25uZWN0IFBvd2VyIEZhY3RvcgorI0RlZmF1bHQgaXMgc2V0IHRvIDAgKGRpc2FibGUpCitnRmxleENvbm5lY3RQb3dlckZhY3Rvcj0wCisKKyNEaXNhYmxlIHNwbGl0IHNjYW4sIHRoZSBGVyB3aWxsIHRha2UgY2FyZSBvZiBpdAorZ051bUNoYW5Db21iaW5lZENvbmM9NjAKKworI0VuYWJsZSBQb3dlciBTYXZlIG9mZmxvYWQKK2dFbmFibGVQb3dlclNhdmVPZmZsb2FkPTIKKworI0VuYWJsZSBmaXJtd2FyZSB1YXJ0IHByaW50CitnRW5hYmxlZndwcmludD0wCisKKyNFbmFibGUgZmlybXdhcmUgbG9nCitnRW5hYmxlZndsb2c9MQorCisjSVBBIGNvbmZpZworZ0lQQUNvbmZpZz0wCitnSVBBRGVzY1NpemU9ODAwCitnSVBBUHJlRmlsdGVyRW5hYmxlPTEKK2dJUEFSTUVuYWJsZT0xCitnSVBBSVB2NkVuYWJsZT0xCisKK0lwYVVjT2ZmbG9hZEVuYWJsZWQ9MAorZ0lwYVVjU3RhT2ZmbG9hZD0wCisKKyNQMlAgTGlzdGVuIG9mZmxvYWQKK2dFbmFibGVQMnBMaXN0ZW5PZmZsb2FkPTEKKworIyBNYXhpbXVtIFJlY2VpdmUgQU1QRFUgc2l6ZSAoVkhUIG9ubHkuIFZhbGlkIHZhbHVlczogMC0+OGsgMS0+MTZrIDItPjMyayAzLT42NGsgNC0+MTI4aykKK2dWaHRBbXBkdUxlbkV4cG9uZW50PTcKKworIyBNYXhpbXVtIE1QRFUgbGVuZ3RoIChWSFQgb25seS4gVmFsaWQgdmFsdWVzOiAwLT4zODk1IG9jdGV0cywgMS0+Nzk5MSBvY3RldHMsIDItPjExNDU0IG9jdGV0cykKK2dWaHRNcGR1TGVuPTIKKworIyBNYXhpbXVtIG51bWJlciBvZiB3b3cgZmlsdGVycyByZXF1aXJlZAorI2dNYXhXb1dGaWx0ZXJzPTIyCisKKyMgV09XIEVuYWJsZS9EaXNhYmxlLgorIyAwIC0gRGlzYWJsZSBib3RoIG1hZ2ljIHBhdHRlcm4gbWF0Y2ggYW5kIHBhdHRlcm4gYnl0ZSBtYXRjaC4KKyMgMSAtIEVuYWJsZSBtYWdpYyBwYXR0ZXJuIG1hdGNoIG9uIGFsbCBpbnRlcmZhY2VzLgorIyAyIC0gRW5hYmxlIHBhdHRlcm4gYnl0ZSBtYXRjaCBvbiBhbGwgaW50ZXJmYWNlcy4KKyMgMyAtIEVuYWJsZSBib3RoIG1hZ2ljIHBhdHRlciBhbmQgcGF0dGVybiBieXRlIG1hdGNoIG9uIGFsbCBpbnRlcmZhY2VzLgorIyBEZWZhdWx0IHZhbHVlIG9mIGdFbmFibGVXb1cgaXMgMy4KKyMgZ0VuYWJsZVdvVz0wCisKKyMgRW5hYmxlIG9yIERpc2FibGUgTUNDIEFkYXB0aXZlIFNjaGVkdWxlciBhdCB0aGUgRlcKKyMgMT1FbmFibGUgKGRlZmF1bHQpLCAwPURpc2FibGUKK2dFbmFibGVNQ0NBZGFwdGl2ZVNjaGVkdWxlcj0xCisKKyNFbmFibGUgb3IgRGlzYWJsZSBwMnAgZGV2aWNlIGFkZHJlc3MgYWRtaW5pc3RlcmVkCitpc1AycERldmljZUFkZHJBZG1pbmlzdHJhdGVkPTAKKworI0VuYWJsZSBSeCB0aHJlYWQKK2dFbmFibGVSeFRocmVhZD0xCisKKyNFbmFibGUgTkFQSQorZ0VuYWJsZU5BUEk9MAorCisjIFNldCBUaGVybWFsIFBvd2VyIGxpbWl0CitUeFBvd2VyMmc9MTAKK1R4UG93ZXI1Zz0xMAorCisjIFJlbW92ZSBPdmVybGFwIGNoYW5uZWwgcmVzdHJpY3Rpb24KK2dFbmFibGVPdmVyTGFwQ2g9MAorCisjRW5hYmxlIFZIVCBvbiAyLjRHaHoKK2dFbmFibGVWaHRGb3IyNEdIekJhbmQ9MQorCisjRW5hYmxlIG9yIERpc2FibGUgNUcgZWFybHkgYmVhY29uIHRlcm1pbmF0aW9uCitnRW5hYmxlNWdFQlQ9MQorCisjTWF4aW11bSBudW1iZXIgb2Ygb2ZmbG9hZCBwZWVycyBzdXBwb3J0ZWQKKyMgZ01heE9mZmxvYWRQZWVycz0yCisKKyMgY29udHJvbGxpbmcgdGhlIGZvbGxvd2luZyBvZmZsb2FkIHBhdHRlcm5zCisjIHRocm91Z2ggaW5pIHBhcmFtZXRlci4gRGVmYXVsdCB2YWx1ZSBpcyAxCisjIHRvIGRpc2FibGUgc2V0IGl0IHRvIHplcm8uIHNzZHAgPSAwCisjIFNldHVwIG11bHRpY2FzdCBwYXR0ZXJuIGZvciBtRE5TIDIyNC4wLjAuMjUxLAorIyBTU0RQIDIzOS4yNTUuMjU1LjI1MCBhbmQgTExNTlIgMjI0LjAuMC4yNTIKK3NzZHAgPSAwCisKKyNFbmFibGUgTWVtb3J5IERlZXAgU2xlZXAKK2dFbmFibGVNZW1EZWVwU2xlZXA9MQorCisjIEJ1cyBiYW5kd2lkdGggdGhyZXNob2xkIHZhbHVlcyBpbiB0ZXJtcyBvZiBudW1iZXIgb2YgcGFja2V0cworZ0J1c0JhbmR3aWR0aEhpZ2hUaHJlc2hvbGQ9MjAwMAorZ0J1c0JhbmR3aWR0aE1lZGl1bVRocmVzaG9sZD01MDAKK2dCdXNCYW5kd2lkdGhMb3dUaHJlc2hvbGQ9MTUwCisKKyMgQnVzIGJhbmR3aWR0aCBjb21wdXRlIHRpbWVvdXQgdmFsdWUgaW4gbXMKK2dCdXNCYW5kd2lkdGhDb21wdXRlSW50ZXJ2YWw9MTAwCisKKyMgUmVndWxhdG9yeSBTZXR0aW5nOyAwPVNUUklDVDsgMT1DVVNUT00KK2dSZWd1bGF0b3J5Q2hhbmdlQ291bnRyeT0xCisjIFJBIGZpbHRlcmluZyByYXRlIGxpbWl0IHBhcmFtLCB0aGUgY3VycmVudCB2YWx1ZSB3b3VsZCBub3QKKyMgaGVscCBpZiB0aGUgbGlmZXRpbWUgaW4gUkEgaXMgbGVzcyB0aGFuIDMqNjA9M21pbi4gVGhlbgorIyB3ZSBuZWVkIHRvIGNoYW5nZSBpdCwgdGhvdWdoIGl0IGlzIHVuY29tbW9uLgorIyBnUkFGaWx0ZXJFbmFibGU9MAorZ1JBcmF0ZUxpbWl0SW50ZXJ2YWw9NjAwCisKKyMgTWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBjb25uZWN0aW9ucworZ01heENvbmN1cnJlbnRBY3RpdmVTZXNzaW9ucz0yCisKKyMgRGlzYWJsZS9FbmFibGUgR3JlZW5BUAorIyAwIHRvIGRpc2FibGUsIDEgdG8gZW5hYmxlLCBkZWZhdWx0OiAxCitnRW5hYmxlR3JlZW5BcD0xCisKKyMgUmFkYXIgUFJJIG11bHRpcGxpZXIKK2dERlNyYWRhck1hcHBpbmdQcmlNdWx0aXBsaWVyPTQKKworZ1BOT1NjYW5TdXBwb3J0PTEKKworIyBFbmFibGUvRGlzYWJsZSBSWCBmdWxsIHJlb3JkZXIgb2ZmbG9hZAorZ1Jlb3JkZXJPZmZsb2FkU3VwcG9ydGVkPTEKKworI0VuYWJsZS9EaXNhYmxlIExQQVNTIHN1cHBvcnQKKyMgMCB0byBkaXNhYmxlLCAxIHRvIGVuYWJsZQorZ0VuYWJsZUxwYXNzU3VwcG9ydD0wCisKKyMgV2hldGhlciB1c2Vyc3BhY2UgY291bnRyeSBjb2RlIHNldHRpbmcgc2hsZCBoYXZlIHByaW9yaXR5CitnQ291bnRyeUNvZGVQcmlvcml0eT0xCisKKyMgRW5hYmxlKDEpL0Rpc2FibGUoMCkgU0lGUyBidXJzdAorZ0VuYWJsZVNpZnNCdXJzdD0xCisKKyMgRW5hYmxlIG9yIERpc2FibGUgTXVsdGktdXNlciBNSU1PCisjIDE9RW5hYmxlIChkZWZhdWx0KSwgMD1EaXNhYmxlCitnRW5hYmxlTXVCZm9ybWVlPTEKKworIyBFbmFibGUvRGlzYWJsZSBjaGFubmVsIGF2b2lkYW5jZSBmb3IgU0FQIGluIFNDQyBzY2VuYXJpbworIyAwIC0gZGlzYWJsZQorIyAxIC0gZW5hYmxlCitnU2FwU2NjQ2hhbkF2b2lkYW5jZT0wCisKKyMgSW5hY3Rpdml0eSB0aW1lIChpbiBtcykgdG8gZW5kIFRYIFNlcnZpY2UgUGVyaW9kIHdoaWxlIGluIElCU1MgcG93ZXIgc2F2ZSBtb2RlCitnSWJzc1R4U3BFbmRJbmFjdGl2aXR5VGltZT0xMAorCisjIEVuYWJsZS9EaXNhYmxlIFJvYW1pbmcgT2ZmbG9hZCBTdXBwb3J0IChhLmsuYSBLZXkgTWFuYWdlbWVudCBPZmZsb2FkKQorIyAwIHRvIGRpc2FibGUsIDEgdG8gZW5hYmxlCitnUm9hbU9mZmxvYWRFbmFibGVkPTAKKworIyBFbmFibGUgc3VwcG9ydCBmb3IgVERMUworIyAgMCAtIGRpc2FibGUKKyMgIDEgLSBlbmFibGUKK2dFbmFibGVURExTU3VwcG9ydD0xCisKKyMgRW5hYmxlIHN1cHBvcnQgZm9yIEltcGxpY2l0IFRyaWdnZXIgb2YgVERMUy4gVGhhdCBpcywgd2xhbiBkcml2ZXIgc2hhbGwKKyMgaW5pdGlhdGUgVERMUyBEaXNjb3ZlcnkgdG93YXJkcyBhIHBlZXIgd2hlbmV2ZXIgc2V0dXAgY3JpdGVyaWEgKHRocm91Z2hwdXQKKyMgYW5kIFJTU0kpIGlzIG1ldCBhbmQgdGhlbiB3aWxsIGluaXRpYXRlIHRlYXJkb3duIHdoZW4gdGVhcmRvd24gY3JpdGVyaWEKKyMgKGlkbGUgcGFja2V0IGNvdW50IGFuZCBSU1NJKSBpcyBtZXQuCisjICAwIC0gZGlzYWJsZQorIyAgMSAtIGVuYWJsZQorZ0VuYWJsZVRETFNJbXBsaWNpdFRyaWdnZXI9MQorCisjIEVuYWJsZSBURExTIEV4dGVybmFsIENvbnRyb2wuIFRoYXQgaXMsIHVzZXIgc3BhY2UgYXBwbGljYXRpb24gaGFzIHRvCisjIGZpcnN0IGNvbmZpZ3VyZSBhIHBlZXIgTUFDIGluIHdsYW4gZHJpdmVyIHRvd2FyZHMgd2hpY2ggVERMUyBpcyBkZXNpcmVkLgorIyBEZXZpY2Ugd2lsbCBlc3RhYmxpc2ggVERMUyBvbmx5IHRvd2FyZHMgdGhvc2UgY29uZmlndXJlZCBwZWVycyB3aGVuZXZlcgorIyBURExTIGNyaXRlcmlhICh0aHJvdWdocHV0IGFuZCBSU1NJIHRocmVzaG9sZCkgaXMgbWV0IGFuZCB0ZWFyZG93biBURExTCisjIHdoZW4gdGVhcmRvd24gY3JpdGVyaWEgKGlkbGUgcGFja2V0IGNvdW50IGFuZCBSU1NJKSBpcyBtZXQuIEhvd2V2ZXIsCisjIGRldmljZSB3aWxsIGFjY2VwdCBURExTIGNvbm5lY3Rpb24gaWYgaXQgaXMgaW5pdGlhdGVkIGZyb20gYW55IG90aGVyIHBlZXIsCisjIGV2ZW4gaWYgdGhhdCBwZWVyIGlzIG5vdCBjb25maWd1cmVkLgorIyAgMCAtIGRpc2FibGUKKyMgIDEgLSBlbmFibGUKKyMgRm9yIFRETFMgRXh0ZXJuYWwgQ29udHJvbCwgSW1wbGljaXQgVHJpZ2dlciBtdXN0IGFsc28gYmUgZW5hYmxlZC4KK2dURExTRXh0ZXJuYWxDb250cm9sPTEKKworIyBFbmFibGUgc3VwcG9ydCBmb3IgVERMUyBvZmYtY2hhbm5lbCBvcGVyYXRpb24KKyMgIDAgLSBkaXNhYmxlCisjICAxIC0gZW5hYmxlCisjIFRETFMgb2ZmLWNoYW5uZWwgb3BlcmF0aW9uIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZXJlIGlzIG9ubHkgb25lCisjIFRETFMgY29ubmVjdGlvbi4KK2dFbmFibGVURExTT2ZmQ2hhbm5lbD0xCisKKyMgRW5hYmxlIG9yIERpc2FibGUgUmFuZG9tIE1BQyAoU3Bvb2ZpbmcpCisjIDE9RW5hYmxlLCAwPURpc2FibGUgKGRlZmF1bHQpCitnRW5hYmxlTWFjQWRkclNwb29mPTAKKworRU5ECisKKyMgTm90ZTogQ29uZmlndXJhdGlvbiBwYXJzZXIgd291bGQgbm90IHJlYWQgYW55dGhpbmcgcGFzdCB0aGUgRU5EIG1hcmtlcgorCmRpZmYgLS1naXQgYS9jb3JlL2JtaS9pbmMvYm1pLmggYi9jb3JlL2JtaS9pbmMvYm1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0OGZkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvYm1pL2luYy9ibWkuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBCTUkgZGVjbGFyYXRpb25zIGFuZCBwcm90b3R5cGVzICovCisvKiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmbmRlZiBfQk1JX0hfCisjZGVmaW5lIF9CTUlfSF8KKyNpbmNsdWRlICJibWlfbXNnLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAib2xfaWZfYXRodmFyLmgiCisjaW5jbHVkZSAiaGlmLmgiCisKKyNpZmRlZiBISUZfUENJCit2b2lkIGJtaV9jbGVhbnVwKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK0NERl9TVEFUVVMgYm1pX2RvbmUoc3RydWN0IG9sX3NvZnRjICpzY24pOworQ0RGX1NUQVRVUyBibWlfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IG9sX3NvZnRjICpzY24pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBibWlfY2xlYW51cChzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgQ0RGX1NUQVRVUyBibWlfZG9uZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMgYm1pX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBfQk1JX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2JtaS9pbmMvb2xfZncuaCBiL2NvcmUvYm1pL2luYy9vbF9mdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OTE4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2JtaS9pbmMvb2xfZncuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfT0xfRldfSF8KKyNkZWZpbmUgX09MX0ZXX0hfCisKKyNpZmRlZiBRQ0FfV0lGSV9GVE0KKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNlbmRpZgorI2luY2x1ZGUgImhpZi5oIgorCisjZGVmaW5lIEFSNjAwNF9WRVJTSU9OX1JFVjFfMyAgICAgICAgMHgzMWM4MDg4YQorCisjZGVmaW5lIEFSOTg4OF9SRVYyX1ZFUlNJT04gICAgICAgICAgMHg0MTAwMDE2YworI2RlZmluZSBBUjYzMjBfUkVWMV9WRVJTSU9OICAgICAgICAgIDB4NTAwMDAwMAorI2RlZmluZSBBUjYzMjBfUkVWMV8xX1ZFUlNJT04gICAgICAgIDB4NTAwMDAwMQorI2RlZmluZSBBUjYzMjBfUkVWMV9WRVJTSU9OXzEgICAgICAgIEFSNjMyMF9SRVYxXzFfVkVSU0lPTgorI2RlZmluZSBBUjYzMjBfUkVWMV8zX1ZFUlNJT04gICAgICAgIDB4NTAwMDAwMworI2RlZmluZSBBUjYzMjBfUkVWMl9WRVJTSU9OICAgICAgICAgIEFSNjMyMF9SRVYxXzFfVkVSU0lPTgorI2RlZmluZSBBUjYzMjBfUkVWMl8xX1ZFUlNJT04gICAgICAgIDB4NTAxMDAwMAorI2RlZmluZSBBUjYzMjBfUkVWM19WRVJTSU9OICAgICAgICAgIDB4NTAyMDAwMAorI2RlZmluZSBBUjYzMjBfUkVWM18yX1ZFUlNJT04gICAgICAgIDB4NTAzMDAwMAorI2RlZmluZSBBUjYzMjBfUkVWNF9WRVJTSU9OICAgICAgICAgIEFSNjMyMF9SRVYyXzFfVkVSU0lPTgorI2RlZmluZSBBUjYzMjBfREVWX1ZFUlNJT04gICAgICAgICAgIDB4MTAwMDAwMAorCisjaWZkZWYgSElGX1BDSQordm9pZCBvbF90YXJnZXRfZmFpbHVyZSh2b2lkICppbnN0YW5jZSwgQ0RGX1NUQVRVUyBzdGF0dXMpOwordWludDhfdCBvbF9nZXRfbnVtYmVyX29mX3BlZXJzX3N1cHBvcnRlZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9sX3RhcmdldF9mYWlsdXJlKHZvaWQgKmluc3RhbmNlLCBDREZfU1RBVFVTIHN0YXR1cykKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBvbF9nZXRfbnVtYmVyX29mX3BlZXJzX3N1cHBvcnRlZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9PTF9GV19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9ibWkvaW5jL29sX2lmX2F0aHZhci5oIGIvY29yZS9ibWkvaW5jL29sX2lmX2F0aHZhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MjBjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2JtaS9pbmMvb2xfaWZfYXRodmFyLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBEZWZpbnRpb25zIGZvciB0aGUgQXRoZXJvcyBXaXJlbGVzcyBMQU4gY29udHJvbGxlciBkcml2ZXIuCisgKi8KKyNpZm5kZWYgX0RFVl9PTF9BVEhfQVRIVkFSX0gKKyNkZWZpbmUgX0RFVl9PTF9BVEhfQVRIVkFSX0gKKworI2luY2x1ZGUgPG9zYXBpX2xpbnV4Lmg+CisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX2xvY2suaCIKKyNpbmNsdWRlICJ3bWlfdW5pZmllZF9hcGkuaCIKKyNpbmNsdWRlICJodGNfYXBpLmgiCisjaW5jbHVkZSAiYm1pX21zZy5oIgorI2luY2x1ZGUgIm9sX3R4cnhfYXBpLmgiCisjaW5jbHVkZSAib2xfdHhyeF9jdHJsX2FwaS5oIgorI2luY2x1ZGUgIm9sX3R4cnhfb3NpZl9hcGkuaCIKKyNpbmNsdWRlICJvbF9wYXJhbXMuaCIKKyNpbmNsdWRlIDx3ZGlfZXZlbnRfYXBpLmg+CisKKyNpZmRlZiBDT05GSUdfQ05TUworI2luY2x1ZGUgPG5ldC9jbnNzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm9sX2N0cmxfYWRkYmFfYXBpLmgiCit0eXBlZGVmIHZvaWQgKmhpZl9oYW5kbGVfdDsKKworc3RydWN0IG9sX3ZlcnNpb24geworCXVpbnQzMl90IGhvc3RfdmVyOworCXVpbnQzMl90IHRhcmdldF92ZXI7CisJdWludDMyX3Qgd2xhbl92ZXI7CisJdWludDMyX3Qgd2xhbl92ZXJfMTsKKwl1aW50MzJfdCBhYmlfdmVyOworfTsKKwordHlwZWRlZiBlbnVtIF9vbF90YXJnZXRfc3RhdHVzIHsKKwlPTF9UUkdFVF9TVEFUVVNfQ09OTkVDVEVEID0gMCwgIC8qIHRhcmdldCBjb25uZWN0ZWQgKi8KKwlPTF9UUkdFVF9TVEFUVVNfUkVTRVQsICAvKiB0YXJnZXQgZ290IHJlc2V0ICovCisJT0xfVFJHRVRfU1RBVFVTX0VKRUNULCAgLyogdGFyZ2V0IGdvdCBlamVjdGVkICovCisJT0xfVFJHRVRfU1RBVFVTX1NVU1BFTkQgLyp0YXJnZXQgZ290IHN1c3BlbmQgKi8KK30gb2xfdGFyZ2V0X3N0YXR1czsKKworZW51bSBvbF9hdGhfdHhfZWNvZGVzIHsKKwlUWF9JTl9QS1RfSU5DUiA9IDAsCisJVFhfT1VUX0hEUl9DT01QTCwKKwlUWF9PVVRfUEtUX0NPTVBMLAorCVBLVF9FTkNBUF9GQUlMLAorCVRYX1BLVF9CQUQsCisJUlhfUkNWX01TR19SWF9JTkQsCisJUlhfUkNWX01TR19QRUVSX01BUCwKKwlSWF9SQ1ZfTVNHX1RZUEVfVEVTVAorfTsKKworLyoKKyAqIHN0cnVjdHVyZSB0byBob2xkIHRoZSBwYWNrZXQgZXJyb3IgY291bnQgZm9yIENFIGFuZCBoaWYgbGF5ZXIKKyAqLworc3RydWN0IG9sX2F0aF9zdGF0cyB7CisJaW50IGhpZl9waXBlX25vX3Jlc3JjX2NvdW50OworCWludCBjZV9yaW5nX2RlbHRhX2ZhaWxfY291bnQ7Cit9OworCisjZW5kaWYgLyogX0RFVl9PTF9BVEhfQVRIVkFSX0ggICovCmRpZmYgLS1naXQgYS9jb3JlL2JtaS9zcmMvYm1pLmMgYi9jb3JlL2JtaS9zcmMvYm1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNDYxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvYm1pL3NyYy9ibWkuYwpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgImlfYm1pLmgiCisKKy8qIEFQSXMgdmlzaWJsZSB0byB0aGUgZHJpdmVyICovCisKKy8qIEJNSV8xIHJlZmVycyBRQ0E2MTc0IHRhcmdldDsgdGhlIEFERFIgaXMgQVhJIGFkZHIgKi8KKyNkZWZpbmUgQk1JXzFfVEVTVF9BRERSCSgweGEwMDAwKQorLyogQk1JXzIgOyAqLworI2RlZmluZSBCTUlfMl9URVNUX0FERFIJKDB4NkUwMDAwKQorLyogRW5hYmxlIEJNSV9URVNUIENPTU1BTkRzOyBUaGUgVmFsdWUgMHgwOSBpcyByYW5kb21seSBjaG9vc2VuICovCisjZGVmaW5lIEJNSV9URVNUX0VOQUJMRSAoMHgwOSkKKworc3RhdGljIENERl9TVEFUVVMKK2JtaV9jb21tYW5kX3Rlc3QodWludDMyX3QgY29tbWFuZCwgdWludDMyX3QgYWRkcmVzcywgdWludDhfdCAqZGF0YSwKKwkJCQl1aW50MzJfdCBsZW5ndGgsIHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgQk1JX05PX0NPTU1BTkQ6CisJCXJldHVybiBibWlfbm9fY29tbWFuZChzY24pOworCWNhc2UgQk1JX1dSSVRFX01FTU9SWToKKwkJcmV0dXJuIGJtaV93cml0ZV9tZW1vcnkoYWRkcmVzcywgZGF0YSwgbGVuZ3RoLCBzY24pOworCWNhc2UgQk1JX1JFQURfTUVNT1JZOgorCQlyZXR1cm4gYm1pX3JlYWRfbWVtb3J5KGFkZHJlc3MsIGRhdGEsIGxlbmd0aCwgc2NuKTsKKwljYXNlIEJNSV9FWEVDVVRFOgorCQlyZXR1cm4gYm1pX2V4ZWN1dGUoYWRkcmVzcywgKHVpbnQzMl90ICopZGF0YSwgc2NuKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBibWlfaW5pdChzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlpZiAoIXNjbikgeworCQlCTUlfRVJSKCJJbnZhbGlkIHNjbiBDb250ZXh0Iik7CisJCWJtaV9hc3NlcnQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX05PVF9JTklUSUFMSVpFRDsKKwl9CisJc2NuLT5ibWlfZG9uZSA9IGZhbHNlOworCisJaWYgKCFzY24tPmJtaV9jbWRfYnVmZikgeworCQlzY24tPmJtaV9jbWRfYnVmZiA9IGNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudChzY24tPmNkZl9kZXYsCisJCQkJCU1BWF9CTUlfQ01EQlVGX1NaLCAmc2NuLT5ibWlfY21kX2RhLCAwKTsKKwkJaWYgKCFzY24tPmJtaV9jbWRfYnVmZikgeworCQkJQk1JX0VSUigiTm8gTWVtb3J5IGZvciBCTUkgQ29tbWFuZCIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCX0KKworCWlmICghc2NuLT5ibWlfcnNwX2J1ZmYpIHsKKwkJc2NuLT5ibWlfcnNwX2J1ZmYgPSBjZGZfb3NfbWVtX2FsbG9jX2NvbnNpc3RlbnQoc2NuLT5jZGZfZGV2LAorCQkJCQlNQVhfQk1JX0NNREJVRl9TWiwgJnNjbi0+Ym1pX3JzcF9kYSwgMCk7CisJCWlmICghc2NuLT5ibWlfcnNwX2J1ZmYpIHsKKwkJCUJNSV9FUlIoIk5vIE1lbW9yeSBmb3IgQk1JIFJlc3BvbnNlIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworZW5kOgorCWNkZl9vc19tZW1fZnJlZV9jb25zaXN0ZW50KHNjbi0+Y2RmX2RldiwgTUFYX0JNSV9DTURCVUZfU1osCisJCQkJIHNjbi0+Ym1pX2NtZF9idWZmLCBzY24tPmJtaV9jbWRfZGEsIDApOworCXNjbi0+Ym1pX2NtZF9idWZmID0gTlVMTDsKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworfQorCit2b2lkIGJtaV9jbGVhbnVwKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCWlmIChzY24tPmJtaV9jbWRfYnVmZikgeworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudChzY24tPmNkZl9kZXYsIE1BWF9CTUlfQ01EQlVGX1NaLAorCQkJCSAgICBzY24tPmJtaV9jbWRfYnVmZiwgc2NuLT5ibWlfY21kX2RhLCAwKTsKKwkJc2NuLT5ibWlfY21kX2J1ZmYgPSBOVUxMOworCQlzY24tPmJtaV9jbWRfZGEgPSAwOworCX0KKworCWlmIChzY24tPmJtaV9yc3BfYnVmZikgeworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudChzY24tPmNkZl9kZXYsIE1BWF9CTUlfQ01EQlVGX1NaLAorCQkJCSAgICBzY24tPmJtaV9yc3BfYnVmZiwgc2NuLT5ibWlfcnNwX2RhLCAwKTsKKwkJc2NuLT5ibWlfcnNwX2J1ZmYgPSBOVUxMOworCQlzY24tPmJtaV9yc3BfZGEgPSAwOworCX0KK30KKworCitDREZfU1RBVFVTIGJtaV9kb25lKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWhpZl9jbGFpbV9kZXZpY2Uoc2NuLCBzY24pOworCisJaWYgKElIRUxJVU1fTk9fQk1JKQorCQlyZXR1cm4gc3RhdHVzOworCisJc3RhdHVzID0gYm1pX2RvbmVfbG9jYWwoc2NuKTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQlCTUlfRVJSKCJCTUlfRE9ORSBGYWlsZWQgc3RhdHVzOiVkIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTCitibWlfZ2V0X3RhcmdldF9pbmZvKHN0cnVjdCBibWlfdGFyZ2V0X2luZm8gKnRhcmdfaW5mbywKKwkJCQkJCXN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCWludCBzdGF0dXMgPSAwOworCXVpbnQ4X3QgKmJtaV9jbWRfYnVmZiA9IHNjbi0+Ym1pX2NtZF9idWZmOworCXVpbnQ4X3QgKmJtaV9yc3BfYnVmZiA9IHNjbi0+Ym1pX3JzcF9idWZmOworCXVpbnQzMl90IGNpZCwgbGVuZ3RoOworCisJaWYgKHNjbi0+Ym1pX2RvbmUpIHsKKwkJQk1JX0VSUigiQk1JIFBoYXNlIGlzIEFscmVhZHkgRG9uZSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1BFUk07CisJfQorCisJaWYgKCFibWlfY21kX2J1ZmYgfHwgIWJtaV9yc3BfYnVmZikgeworCQlCTUlfRVJSKCIlczpCTUkgQ01EL1JTUCBCdWZmZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfTk9UX0lOSVRJQUxJWkVEOworCX0KKwljaWQgPSBCTUlfR0VUX1RBUkdFVF9JTkZPOworCisJY2RmX21lbV9jb3B5KGJtaV9jbWRfYnVmZiwgJmNpZCwgc2l6ZW9mKGNpZCkpOworCWxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYm1pX3RhcmdldF9pbmZvKTsKKworCXN0YXR1cyA9IGhpZl9leGNoYW5nZV9ibWlfbXNnKHNjbiwgYm1pX2NtZF9idWZmLCBzaXplb2YoY2lkKSwKKwkJCQkJKHVpbnQ4X3QgKilibWlfcnNwX2J1ZmYsICZsZW5ndGgsCisJCQkJCUJNSV9FWENIQU5HRV9USU1FT1VUX01TKTsKKwlpZiAoc3RhdHVzKSB7CisJCUJNSV9FUlIoIkZhaWxlZCB0byB0YXJnZXQgaW5mbzogc3RhdHVzOiVkIiwgc3RhdHVzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNkZl9tZW1fY29weSh0YXJnX2luZm8sIGJtaV9yc3BfYnVmZiwgbGVuZ3RoKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgRkVBVFVSRV9CTUlfMgorc3RhdGljIGlubGluZSB1aW50MzJfdCBibWlfZ2V0X3Rlc3RfYWRkcih2b2lkKQoreworCXJldHVybiBCTUlfMl9URVNUX0FERFI7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB1aW50MzJfdCBibWlfZ2V0X3Rlc3RfYWRkcih2b2lkKQoreworCXJldHVybiBCTUlfMV9URVNUX0FERFI7Cit9CisjZW5kaWYKKworQ0RGX1NUQVRVUyBibWlfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDhfdCBkYXRhWzEwXSwgb3V0WzEwXTsKKwl1aW50MzJfdCBhZGRyZXNzOworCWludDMyX3QgcmV0OworCisJaWYgKElIRUxJVU1fTk9fQk1JKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOyAvKiBubyBCTUkgZm9yIFE2IGJyaW5nIHVwICovCisKKwlpZiAoIXNjbikgeworCQlCTUlfRVJSKCJJbnZhbGlkIHNjbiBjb250ZXh0Iik7CisJCWJtaV9hc3NlcnQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX05PVF9JTklUSUFMSVpFRDsKKwl9CisjaWZkZWYgQ09ORklHX0NOU1MKKwlpZiAoQk1JX1RFU1RfRU5BQkxFID09IGNuc3NfZ2V0X2JtaV9zZXR1cCgpKSB7CisJCXJldCA9IHNucHJpbnRmKGRhdGEsIDEwLCAiQUJDREVGR0hJIik7CisJCUJNSV9EQkcoInJldDolZCB3cml0aW5nIGRhdGE6JXNcbiIsIHJldCwgZGF0YSk7CisJCWFkZHJlc3MgPSBibWlfZ2V0X3Rlc3RfYWRkcigpOworCisJCWlmIChibWlfaW5pdChzY24pICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJQk1JX1dBUk4oIkJNSV9JTklUIEZhaWxlZDsgTm8gTWVtb3J5ISIpOworCQkJZ290byBlbmQ7CisJCX0KKwkJYm1pX2NvbW1hbmRfdGVzdChCTUlfTk9fQ09NTUFORCwgYWRkcmVzcywgZGF0YSwgOSwgc2NuKTsKKwkJYm1pX2NvbW1hbmRfdGVzdChCTUlfV1JJVEVfTUVNT1JZLCBhZGRyZXNzLCBkYXRhLCA5LCBzY24pOworCQlibWlfY29tbWFuZF90ZXN0KEJNSV9SRUFEX01FTU9SWSwgYWRkcmVzcywgb3V0LCA5LCBzY24pOworCQlCTUlfREJHKCJPdXRwdXQ6JXMiLCBvdXQpOworCX0KKyNlbmRpZgorZW5kOgorCXJldHVybiBibWlfZmlybXdhcmVfZG93bmxvYWQoc2NuKTsKK30KKworQ0RGX1NUQVRVUworYm1pX3JlYWRfc29jX3JlZ2lzdGVyKHVpbnQzMl90IGFkZHJlc3MsIHVpbnQzMl90ICpwYXJhbSwgc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDMyX3QgY2lkOworCWludCBzdGF0dXM7CisJdWludDMyX3Qgb2Zmc2V0LCBwYXJhbV9sZW47CisJdWludDhfdCAqYm1pX2NtZF9idWZmID0gc2NuLT5ibWlfY21kX2J1ZmY7CisJdWludDhfdCAqYm1pX3JzcF9idWZmID0gc2NuLT5ibWlfcnNwX2J1ZmY7CisKKwlibWlfYXNzZXJ0KEJNSV9DT01NQU5EX0ZJVFMoc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcmVzcykpKTsKKwljZGZfbWVtX3NldChibWlfY21kX2J1ZmYsIDAsIHNpemVvZihjaWQpICsgc2l6ZW9mKGFkZHJlc3MpKTsKKwljZGZfbWVtX3NldChibWlfcnNwX2J1ZmYsIDAsIHNpemVvZihjaWQpICsgc2l6ZW9mKGFkZHJlc3MpKTsKKworCWlmIChzY24tPmJtaV9kb25lKSB7CisJCUJNSV9EQkcoIkNvbW1hbmQgZGlzYWxsb3dlZCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1BFUk07CisJfQorCisJQk1JX0RCRygiQk1JIFJlYWQgU09DIFJlZ2lzdGVyOmRldmljZTogMHglcCwgYWRkcmVzczogMHgleCIsCisJCQkgc2NuLCBhZGRyZXNzKTsKKworCWNpZCA9IEJNSV9SRUFEX1NPQ19SRUdJU1RFUjsKKworCW9mZnNldCA9IDA7CisJY2RmX21lbV9jb3B5KCYoYm1pX2NtZF9idWZmW29mZnNldF0pLCAmY2lkLCBzaXplb2YoY2lkKSk7CisJb2Zmc2V0ICs9IHNpemVvZihjaWQpOworCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSk7CisJb2Zmc2V0ICs9IHNpemVvZihhZGRyZXNzKTsKKwlwYXJhbV9sZW4gPSBzaXplb2YoKnBhcmFtKTsKKwlzdGF0dXMgPSBoaWZfZXhjaGFuZ2VfYm1pX21zZyhzY24sIGJtaV9jbWRfYnVmZiwgb2Zmc2V0LAorCQkJYm1pX3JzcF9idWZmLCAmcGFyYW1fbGVuLCBCTUlfRVhDSEFOR0VfVElNRU9VVF9NUyk7CisJaWYgKHN0YXR1cykgeworCQlCTUlfREJHKCJVbmFibGUgdG8gcmVhZCBmcm9tIHRoZSBkZXZpY2U7IHN0YXR1czolZCIsIHN0YXR1cyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJY2RmX21lbV9jb3B5KHBhcmFtLCBibWlfcnNwX2J1ZmYsIHNpemVvZigqcGFyYW0pKTsKKworCUJNSV9EQkcoIkJNSSBSZWFkIFNPQyBSZWdpc3RlcjogRXhpdCB2YWx1ZTogJWQiLCAqcGFyYW0pOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMKK2JtaV93cml0ZV9zb2NfcmVnaXN0ZXIodWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgcGFyYW0sIHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXVpbnQzMl90IGNpZDsKKwlpbnQgc3RhdHVzOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50OF90ICpibWlfY21kX2J1ZmYgPSBzY24tPmJtaV9jbWRfYnVmZjsKKwl1aW50MzJfdCBzaXplID0gc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcmVzcykgKyBzaXplb2YocGFyYW0pOworCWJtaV9hc3NlcnQoQk1JX0NPTU1BTkRfRklUUyhzaXplKSk7CisJY2RmX21lbV9zZXQoYm1pX2NtZF9idWZmLCAwLCBzaXplKTsKKworCWlmIChzY24tPmJtaV9kb25lKSB7CisJCUJNSV9EQkcoIkNvbW1hbmQgZGlzYWxsb3dlZCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJQk1JX0RCRygiU09DIFJlZ2lzdGVyIFdyaXRlOmRldmljZToweCVwLCBhZGRyOjB4JXgsIHBhcmFtOiVkIiwKKwkJCQkJCXNjbiwgYWRkcmVzcywgcGFyYW0pOworCisJY2lkID0gQk1JX1dSSVRFX1NPQ19SRUdJU1RFUjsKKworCW9mZnNldCA9IDA7CisJY2RmX21lbV9jb3B5KCYoYm1pX2NtZF9idWZmW29mZnNldF0pLCAmY2lkLCBzaXplb2YoY2lkKSk7CisJb2Zmc2V0ICs9IHNpemVvZihjaWQpOworCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSk7CisJb2Zmc2V0ICs9IHNpemVvZihhZGRyZXNzKTsKKwljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisJb2Zmc2V0ICs9IHNpemVvZihwYXJhbSk7CisJc3RhdHVzID0gaGlmX2V4Y2hhbmdlX2JtaV9tc2coc2NuLCBibWlfY21kX2J1ZmYsIG9mZnNldCwKKwkJCQkJCU5VTEwsIE5VTEwsIDApOworCWlmIChzdGF0dXMpIHsKKwkJQk1JX0VSUigiVW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2U6IHN0YXR1czolZCIsIHN0YXR1cyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlCTUlfREJHKCJCTUkgUmVhZCBTT0MgUmVnaXN0ZXI6IEV4aXQiKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitDREZfU1RBVFVTCitibWlsel9kYXRhKHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoLCBzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwl1aW50MzJfdCBjaWQ7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCBvZmZzZXQ7CisJdWludDMyX3QgcmVtYWluaW5nLCB0eGxlbjsKKwljb25zdCB1aW50MzJfdCBoZWFkZXIgPSBzaXplb2YoY2lkKSArIHNpemVvZihsZW5ndGgpOworCXVpbnQ4X3QgKmJtaV9jbWRfYnVmZiA9IHNjbi0+Ym1pX2NtZF9idWZmOworCisJYm1pX2Fzc2VydChCTUlfQ09NTUFORF9GSVRTKEJNSV9EQVRBU1pfTUFYICsgaGVhZGVyKSk7CisJY2RmX21lbV9zZXQoYm1pX2NtZF9idWZmLCAwLCBCTUlfREFUQVNaX01BWCArIGhlYWRlcik7CisKKwlpZiAoc2NuLT5ibWlfZG9uZSkgeworCQlCTUlfRVJSKCJDb21tYW5kIGRpc2FsbG93ZWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9QRVJNOworCX0KKworCUJNSV9EQkcoIkJNSSBTZW5kIExaIERhdGE6IGRldmljZTogMHglcCwgbGVuZ3RoOiAlZCIsCisJCQkJCQlzY24sIGxlbmd0aCk7CisKKwljaWQgPSBCTUlfTFpfREFUQTsKKworCXJlbWFpbmluZyA9IGxlbmd0aDsKKwl3aGlsZSAocmVtYWluaW5nKSB7CisJCXR4bGVuID0gKHJlbWFpbmluZyA8IChCTUlfREFUQVNaX01BWCAtIGhlYWRlcikpID8KKwkJCXJlbWFpbmluZyA6IChCTUlfREFUQVNaX01BWCAtIGhlYWRlcik7CisJCW9mZnNldCA9IDA7CisJCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmNpZCwgc2l6ZW9mKGNpZCkpOworCQlvZmZzZXQgKz0gc2l6ZW9mKGNpZCk7CisJCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJnR4bGVuLCBzaXplb2YodHhsZW4pKTsKKwkJb2Zmc2V0ICs9IHNpemVvZih0eGxlbik7CisJCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwKKwkJCSZidWZmZXJbbGVuZ3RoIC0gcmVtYWluaW5nXSwgdHhsZW4pOworCQlvZmZzZXQgKz0gdHhsZW47CisJCXN0YXR1cyA9IGhpZl9leGNoYW5nZV9ibWlfbXNnKHNjbiwgYm1pX2NtZF9idWZmLCBvZmZzZXQsCisJCQkJCU5VTEwsIE5VTEwsIDApOworCQlpZiAoc3RhdHVzKSB7CisJCQlCTUlfRVJSKCJGYWlsZWQgdG8gd3JpdGUgdG8gdGhlIGRldmljZTogc3RhdHVzOiVkIiwKKwkJCQkJCQkJc3RhdHVzKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlyZW1haW5pbmcgLT0gdHhsZW47CisJfQorCisJQk1JX0RCRygiQk1JIExaIERhdGE6IEV4aXQiKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMKK2JtaV9zaWduX3N0cmVhbV9zdGFydCh1aW50MzJfdCBhZGRyZXNzLAorCQkgICAgICB1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCwgc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDMyX3QgY2lkOworCWludCBzdGF0dXM7CisJdWludDMyX3Qgb2Zmc2V0OworCWNvbnN0IHVpbnQzMl90IGhlYWRlciA9IHNpemVvZihjaWQpICsgc2l6ZW9mKGFkZHJlc3MpICsgc2l6ZW9mKGxlbmd0aCk7CisJdWludDhfdCBhbGlnbmVkX2J1ZltCTUlfREFUQVNaX01BWCArIDRdOworCXVpbnQ4X3QgKnNyYzsKKwl1aW50OF90ICpibWlfY21kX2J1ZmYgPSBzY24tPmJtaV9jbWRfYnVmZjsKKwl1aW50MzJfdCByZW1haW5pbmcsIHR4bGVuOworCisJYm1pX2Fzc2VydChCTUlfQ09NTUFORF9GSVRTKEJNSV9EQVRBU1pfTUFYICsgaGVhZGVyKSk7CisJY2RmX21lbV9zZXQoYm1pX2NtZF9idWZmLCAwLCBCTUlfREFUQVNaX01BWCArIGhlYWRlcik7CisKKwlpZiAoc2NuLT5ibWlfZG9uZSkgeworCQlCTUlfRVJSKCJDb21tYW5kIGRpc2FsbG93ZWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9QRVJNOworCX0KKworCUJNSV9FUlIoIlNpZ24gU3RyZWFtIHN0YXJ0OmRldmljZToweCVwLCBhZGRyOjB4JXgsIGxlbmd0aDolZCIsCisJCQkJCQlzY24sIGFkZHJlc3MsIGxlbmd0aCk7CisKKwljaWQgPSBCTUlfU0lHTl9TVFJFQU1fU1RBUlQ7CisJcmVtYWluaW5nID0gbGVuZ3RoOworCXdoaWxlIChyZW1haW5pbmcpIHsKKwkJc3JjID0gJmJ1ZmZlcltsZW5ndGggLSByZW1haW5pbmddOworCQlpZiAocmVtYWluaW5nIDwgKEJNSV9EQVRBU1pfTUFYIC0gaGVhZGVyKSkgeworCQkJaWYgKHJlbWFpbmluZyAmIDB4MykgeworCQkJCXJlbWFpbmluZyA9IHJlbWFpbmluZyArICg0IC0gKHJlbWFpbmluZyAmIDB4MykpOworCQkJCW1lbWNweShhbGlnbmVkX2J1Ziwgc3JjLCByZW1haW5pbmcpOworCQkJCXNyYyA9IGFsaWduZWRfYnVmOworCQkJfQorCQkJdHhsZW4gPSByZW1haW5pbmc7CisJCX0gZWxzZSB7CisJCQl0eGxlbiA9IChCTUlfREFUQVNaX01BWCAtIGhlYWRlcik7CisJCX0KKworCQlvZmZzZXQgPSAwOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksICZjaWQsIHNpemVvZihjaWQpKTsKKwkJb2Zmc2V0ICs9IHNpemVvZihjaWQpOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksICZhZGRyZXNzLAorCQkJCQkJc2l6ZW9mKGFkZHJlc3MpKTsKKwkJb2Zmc2V0ICs9IHNpemVvZihvZmZzZXQpOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksICZ0eGxlbiwgc2l6ZW9mKHR4bGVuKSk7CisJCW9mZnNldCArPSBzaXplb2YodHhsZW4pOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksIHNyYywgdHhsZW4pOworCQlvZmZzZXQgKz0gdHhsZW47CisJCXN0YXR1cyA9IGhpZl9leGNoYW5nZV9ibWlfbXNnKHNjbiwKKwkJCQkJYm1pX2NtZF9idWZmLCBvZmZzZXQsCisJCQkJCU5VTEwsIE5VTEwsIEJNSV9FWENIQU5HRV9USU1FT1VUX01TKTsKKwkJaWYgKHN0YXR1cykgeworCQkJQk1JX0VSUigiVW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2U6IHN0YXR1czolZCIsCisJCQkJCQkJCXN0YXR1cyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJcmVtYWluaW5nIC09IHR4bGVuOworCX0KKwlCTUlfREJHKCJCTUkgU0lHTiBTdHJlYW0gU3RhcnQ6IEV4aXQiKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMKK2JtaWx6X3N0cmVhbV9zdGFydCh1aW50MzJfdCBhZGRyZXNzLCBzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwl1aW50MzJfdCBjaWQ7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCBvZmZzZXQ7CisJdWludDhfdCAqYm1pX2NtZF9idWZmID0gc2NuLT5ibWlfY21kX2J1ZmY7CisKKwlibWlfYXNzZXJ0KEJNSV9DT01NQU5EX0ZJVFMoc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcmVzcykpKTsKKwljZGZfbWVtX3NldChibWlfY21kX2J1ZmYsIDAsIHNpemVvZihjaWQpICsgc2l6ZW9mKGFkZHJlc3MpKTsKKworCWlmIChzY24tPmJtaV9kb25lKSB7CisJCUJNSV9EQkcoIkNvbW1hbmQgZGlzYWxsb3dlZCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1BFUk07CisJfQorCUJNSV9EQkcoIkJNSSBMWiBTdHJlYW0gU3RhcnQ6IChkZXZpY2U6IDB4JXAsIGFkZHJlc3M6IDB4JXgpIiwKKwkJCQkJCXNjbiwgYWRkcmVzcyk7CisKKwljaWQgPSBCTUlfTFpfU1RSRUFNX1NUQVJUOworCW9mZnNldCA9IDA7CisJY2RmX21lbV9jb3B5KCYoYm1pX2NtZF9idWZmW29mZnNldF0pLCAmY2lkLCBzaXplb2YoY2lkKSk7CisJb2Zmc2V0ICs9IHNpemVvZihjaWQpOworCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSk7CisJb2Zmc2V0ICs9IHNpemVvZihhZGRyZXNzKTsKKwlzdGF0dXMgPSBoaWZfZXhjaGFuZ2VfYm1pX21zZyhzY24sIGJtaV9jbWRfYnVmZiwgb2Zmc2V0LAorCQkJCQkJTlVMTCwgTlVMTCwgMCk7CisJaWYgKHN0YXR1cykgeworCQlCTUlfRVJSKCJVbmFibGUgdG8gU3RhcnQgTFogU3RyZWFtIHRvIHRoZSBkZXZpY2Ugc3RhdHVzOiVkIiwKKwkJCQkJCQkJc3RhdHVzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlCTUlfREJHKCJCTUkgTFogU3RyZWFtOiBFeGl0Iik7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUworYm1pX2Zhc3RfZG93bmxvYWQodWludDMyX3QgYWRkcmVzcywgdWludDhfdCAqYnVmZmVyLAorCQkgIHVpbnQzMl90IGxlbmd0aCwgc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl1aW50MzJfdCBsYXN0X3dvcmQgPSAwOworCXVpbnQzMl90IGxhc3Rfd29yZF9vZmZzZXQgPSBsZW5ndGggJiB+MHgzOworCXVpbnQzMl90IHVuYWxpZ25lZF9ieXRlcyA9IGxlbmd0aCAmIDB4MzsKKworCXN0YXR1cyA9IGJtaWx6X3N0cmVhbV9zdGFydChhZGRyZXNzLCBzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVuZDsKKworCS8qIGNvcHkgdGhlIGxhc3Qgd29yZCBpbnRvIGEgemVybyBwYWRkZWQgYnVmZmVyICovCisJaWYgKHVuYWxpZ25lZF9ieXRlcykKKwkJY2RmX21lbV9jb3B5KCZsYXN0X3dvcmQsICZidWZmZXJbbGFzdF93b3JkX29mZnNldF0sCisJCQkJCQl1bmFsaWduZWRfYnl0ZXMpOworCisJc3RhdHVzID0gYm1pbHpfZGF0YShidWZmZXIsIGxhc3Rfd29yZF9vZmZzZXQsIHNjbik7CisKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlbmQ7CisKKwlpZiAodW5hbGlnbmVkX2J5dGVzKQorCQlzdGF0dXMgPSBibWlsel9kYXRhKCh1aW50OF90ICopICZsYXN0X3dvcmQsIDQsIHNjbik7CisKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJLyoKKwkJICogQ2xvc2UgY29tcHJlc3NlZCBzdHJlYW0gYW5kIG9wZW4gYSBuZXcgKGZha2UpIG9uZS4KKwkJICogVGhpcyBzZXJ2ZXMgbWFpbmx5IHRvIGZsdXNoIFRhcmdldCBjYWNoZXMuCisJCSAqLworCQlzdGF0dXMgPSBibWlsel9zdHJlYW1fc3RhcnQoMHgwMCwgc2NuKTsKK2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCmRpZmYgLS1naXQgYS9jb3JlL2JtaS9zcmMvYm1pXzEuYyBiL2NvcmUvYm1pL3NyYy9ibWlfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMDc4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2JtaS9zcmMvYm1pXzEuYwpAQCAtMCwwICsxLDMyMSBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgImlfYm1pLmgiCisKKy8qIEFQSXMgdmlzaWJsZSB0byB0aGUgZHJpdmVyICovCisKK0NERl9TVEFUVVMKK2JtaV9yZWFkX21lbW9yeSh1aW50MzJfdCBhZGRyZXNzLAorCQl1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCwgc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDMyX3QgY2lkOworCWludCBzdGF0dXM7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IHJlbWFpbmluZywgcnhsZW47CisJdWludDhfdCAqYm1pX2NtZF9idWZmID0gc2NuLT5ibWlfY21kX2J1ZmY7CisJdWludDhfdCAqYm1pX3JzcF9idWZmID0gc2NuLT5ibWlfcnNwX2J1ZmY7CisJdWludDMyX3QgYWxpZ247CisKKwlpZiAoc2NuLT5ibWlfZG9uZSkgeworCQlCTUlfREJHKCJjb21tYW5kIGRpc2FsbG93ZWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9QRVJNOworCX0KKworCWlmICghc2NuLT5ibWlfY21kX2J1ZmYgfHwgIXNjbi0+Ym1pX3JzcF9idWZmKSB7CisJCUJNSV9FUlIoIkJNSSBJbml0aWFsaXphdGlvbiBoYXNuJ3QgZG9uZSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19OT1RfSU5JVElBTElaRUQ7CisJfQorCisJYm1pX2Fzc2VydChCTUlfQ09NTUFORF9GSVRTKEJNSV9EQVRBU1pfTUFYICsgc2l6ZW9mKGNpZCkgKworCQkJc2l6ZW9mKGFkZHJlc3MpICsgc2l6ZW9mKGxlbmd0aCkpKTsKKwljZGZfbWVtX3NldChibWlfY21kX2J1ZmYsIDAsIEJNSV9EQVRBU1pfTUFYICsgc2l6ZW9mKGNpZCkgKworCQkJc2l6ZW9mKGFkZHJlc3MpICsgc2l6ZW9mKGxlbmd0aCkpOworCWNkZl9tZW1fc2V0KGJtaV9yc3BfYnVmZiwgMCwgQk1JX0RBVEFTWl9NQVggKyBzaXplb2YoY2lkKSArCisJCQlzaXplb2YoYWRkcmVzcykgKyBzaXplb2YobGVuZ3RoKSk7CisKKwlCTUlfREJHKCJCTUkgUmVhZDogZGV2aWNlOiAweCVwLCBhZGRyZXNzOiAweCV4LCBsZW5ndGg6ICVkIiwKKwkJCQkJCXNjbiwgYWRkcmVzcywgbGVuZ3RoKTsKKworCWNpZCA9IEJNSV9SRUFEX01FTU9SWTsKKwlhbGlnbiA9IDA7CisJcmVtYWluaW5nID0gbGVuZ3RoOworCisJd2hpbGUgKHJlbWFpbmluZykgeworCQlyeGxlbiA9IChyZW1haW5pbmcgPCBCTUlfREFUQVNaX01BWCkgPworCQkJCXJlbWFpbmluZyA6IEJNSV9EQVRBU1pfTUFYOworCQlvZmZzZXQgPSAwOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksICZjaWQsIHNpemVvZihjaWQpKTsKKwkJb2Zmc2V0ICs9IHNpemVvZihjaWQpOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksICZhZGRyZXNzLAorCQkJCQkJc2l6ZW9mKGFkZHJlc3MpKTsKKwkJb2Zmc2V0ICs9IHNpemVvZihhZGRyZXNzKTsKKwkJY2RmX21lbV9jb3B5KCYoYm1pX2NtZF9idWZmW29mZnNldF0pLCAmcnhsZW4sIHNpemVvZihyeGxlbikpOworCQlvZmZzZXQgKz0gc2l6ZW9mKGxlbmd0aCk7CisKKwkJLyogbm90ZSB3ZSByZXVzZSB0aGUgc2FtZSBidWZmZXIgdG8gcmVjZWl2ZSBvbiAqLworCQlzdGF0dXMgPSBoaWZfZXhjaGFuZ2VfYm1pX21zZyhzY24sIGJtaV9jbWRfYnVmZiwgb2Zmc2V0LAorCQkJCWJtaV9yc3BfYnVmZiwgJnJ4bGVuLCBCTUlfRVhDSEFOR0VfVElNRU9VVF9NUyk7CisJCWlmIChzdGF0dXMpIHsKKwkJCUJNSV9FUlIoIlVuYWJsZSB0byByZWFkIGZyb20gdGhlIGRldmljZSIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCWlmIChyZW1haW5pbmcgPT0gcnhsZW4pIHsKKwkJCWNkZl9tZW1fY29weSgmYnVmZmVyW2xlbmd0aCAtIHJlbWFpbmluZyArIGFsaWduXSwKKwkJCQkJYm1pX3JzcF9idWZmLCByeGxlbiAtIGFsaWduKTsKKwkJCS8qIGxhc3QgYWxpZ24gYnl0ZXMgYXJlIGludmFsaWQgKi8KKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fY29weSgmYnVmZmVyW2xlbmd0aCAtIHJlbWFpbmluZyArIGFsaWduXSwKKwkJCQkgYm1pX3JzcF9idWZmLCByeGxlbik7CisJCX0KKwkJcmVtYWluaW5nIC09IHJ4bGVuOworCQlhZGRyZXNzICs9IHJ4bGVuOworCX0KKworCUJNSV9EQkcoIkJNSSBSZWFkIE1lbW9yeTogRXhpdCIpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMKK2JtaV93cml0ZV9tZW1vcnkodWludDMyX3QgYWRkcmVzcywKKwkJIHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoLCBzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwl1aW50MzJfdCBjaWQ7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCBvZmZzZXQ7CisJdWludDMyX3QgcmVtYWluaW5nLCB0eGxlbjsKKwljb25zdCB1aW50MzJfdCBoZWFkZXIgPSBzaXplb2YoY2lkKSArIHNpemVvZihhZGRyZXNzKSArIHNpemVvZihsZW5ndGgpOworCXVpbnQ4X3QgYWxpZ25lZF9idWZmZXJbQk1JX0RBVEFTWl9NQVhdOworCXVpbnQ4X3QgKnNyYzsKKwl1aW50OF90ICpibWlfY21kX2J1ZmYgPSBzY24tPmJtaV9jbWRfYnVmZjsKKworCWlmIChzY24tPmJtaV9kb25lKSB7CisJCUJNSV9FUlIoIkNvbW1hbmQgZGlzYWxsb3dlZCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1BFUk07CisJfQorCisJaWYgKCFibWlfY21kX2J1ZmYpIHsKKwkJQk1JX0VSUigiQk1JIGluaXRpYWxpemF0aW9uIGhhc24ndCBkb25lIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUEVSTTsKKwl9CisKKwlibWlfYXNzZXJ0KEJNSV9DT01NQU5EX0ZJVFMoQk1JX0RBVEFTWl9NQVggKyBoZWFkZXIpKTsKKwljZGZfbWVtX3NldChibWlfY21kX2J1ZmYsIDAsIEJNSV9EQVRBU1pfTUFYICsgaGVhZGVyKTsKKworCUJNSV9EQkcoIkJNSSBXcml0ZSBNZW1vcnk6ZGV2aWNlOiAweCVwLCBhZGRyZXNzOiAweCV4LCBsZW5ndGg6ICVkIiwKKwkJCQkJCXNjbiwgYWRkcmVzcywgbGVuZ3RoKTsKKworCWNpZCA9IEJNSV9XUklURV9NRU1PUlk7CisKKwlyZW1haW5pbmcgPSBsZW5ndGg7CisJd2hpbGUgKHJlbWFpbmluZykgeworCQlzcmMgPSAmYnVmZmVyW2xlbmd0aCAtIHJlbWFpbmluZ107CisJCWlmIChyZW1haW5pbmcgPCAoQk1JX0RBVEFTWl9NQVggLSBoZWFkZXIpKSB7CisJCQlpZiAocmVtYWluaW5nICYgMykgeworCQkJCS8qIGFsaWduIGl0IHdpdGggNCBieXRlcyAqLworCQkJCXJlbWFpbmluZyA9IHJlbWFpbmluZyArICg0IC0gKHJlbWFpbmluZyAmIDMpKTsKKwkJCQltZW1jcHkoYWxpZ25lZF9idWZmZXIsIHNyYywgcmVtYWluaW5nKTsKKwkJCQlzcmMgPSBhbGlnbmVkX2J1ZmZlcjsKKwkJCX0KKwkJCXR4bGVuID0gcmVtYWluaW5nOworCQl9IGVsc2UgeworCQkJdHhsZW4gPSAoQk1JX0RBVEFTWl9NQVggLSBoZWFkZXIpOworCQl9CisJCW9mZnNldCA9IDA7CisJCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmNpZCwgc2l6ZW9mKGNpZCkpOworCQlvZmZzZXQgKz0gc2l6ZW9mKGNpZCk7CisJCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmFkZHJlc3MsCisJCQkJCQlzaXplb2YoYWRkcmVzcykpOworCQlvZmZzZXQgKz0gc2l6ZW9mKGFkZHJlc3MpOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksICZ0eGxlbiwgc2l6ZW9mKHR4bGVuKSk7CisJCW9mZnNldCArPSBzaXplb2YodHhsZW4pOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksIHNyYywgdHhsZW4pOworCQlvZmZzZXQgKz0gdHhsZW47CisJCXN0YXR1cyA9IGhpZl9leGNoYW5nZV9ibWlfbXNnKHNjbiwgYm1pX2NtZF9idWZmLCBvZmZzZXQsCisJCQkJCU5VTEwsIE5VTEwsIEJNSV9FWENIQU5HRV9USU1FT1VUX01TKTsKKwkJaWYgKHN0YXR1cykgeworCQkJQk1JX0VSUigiVW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2U7IHN0YXR1czolZCIsCisJCQkJCQkJCXN0YXR1cyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJcmVtYWluaW5nIC09IHR4bGVuOworCQlhZGRyZXNzICs9IHR4bGVuOworCX0KKworCUJNSV9EQkcoIkJNSSBXcml0ZSBNZW1vcnk6IEV4aXQiKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMKK2JtaV9leGVjdXRlKHVpbnQzMl90IGFkZHJlc3MsIEFfVUlOVDMyICpwYXJhbSwgc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDMyX3QgY2lkOworCWludCBzdGF0dXM7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IHBhcmFtX2xlbjsKKwl1aW50OF90ICpibWlfY21kX2J1ZmYgPSBzY24tPmJtaV9jbWRfYnVmZjsKKwl1aW50OF90ICpibWlfcnNwX2J1ZmYgPSBzY24tPmJtaV9yc3BfYnVmZjsKKwl1aW50MzJfdCBzaXplID0gc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcmVzcykgKyBzaXplb2YocGFyYW0pOworCisJaWYgKHNjbi0+Ym1pX2RvbmUpIHsKKwkJQk1JX0VSUigiQ29tbWFuZCBkaXNhbGxvd2VkIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUEVSTTsKKwl9CisKKwlpZiAoIWJtaV9jbWRfYnVmZiB8fCAhYm1pX3JzcF9idWZmKSB7CisJCUJNSV9FUlIoIiVzOkJNSSBDTUQvUlNQIEJ1ZmZlciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19OT1RfSU5JVElBTElaRUQ7CisJfQorCisJYm1pX2Fzc2VydChCTUlfQ09NTUFORF9GSVRTKHNpemUpKTsKKwljZGZfbWVtX3NldChibWlfY21kX2J1ZmYsIDAsIHNpemUpOworCWNkZl9tZW1fc2V0KGJtaV9yc3BfYnVmZiwgMCwgc2l6ZSk7CisKKworCUJNSV9EQkcoIkJNSSBFeGVjdXRlOiBkZXZpY2U6IDB4JXAsIGFkZHJlc3M6IDB4JXgsIHBhcmFtOiAlZCIsCisJCQkJCQlzY24sIGFkZHJlc3MsICpwYXJhbSk7CisKKwljaWQgPSBCTUlfRVhFQ1VURTsKKworCW9mZnNldCA9IDA7CisJY2RmX21lbV9jb3B5KCYoYm1pX2NtZF9idWZmW29mZnNldF0pLCAmY2lkLCBzaXplb2YoY2lkKSk7CisJb2Zmc2V0ICs9IHNpemVvZihjaWQpOworCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSk7CisJb2Zmc2V0ICs9IHNpemVvZihhZGRyZXNzKTsKKwljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksIHBhcmFtLCBzaXplb2YoKnBhcmFtKSk7CisJb2Zmc2V0ICs9IHNpemVvZigqcGFyYW0pOworCXBhcmFtX2xlbiA9IHNpemVvZigqcGFyYW0pOworCXN0YXR1cyA9IGhpZl9leGNoYW5nZV9ibWlfbXNnKHNjbiwgYm1pX2NtZF9idWZmLCBvZmZzZXQsCisJCQkJCWJtaV9yc3BfYnVmZiwgJnBhcmFtX2xlbiwgMCk7CisJaWYgKHN0YXR1cykgeworCQlCTUlfRVJSKCJVbmFibGUgdG8gcmVhZCBmcm9tIHRoZSBkZXZpY2Ugc3RhdHVzOiVkIiwgc3RhdHVzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNkZl9tZW1fY29weShwYXJhbSwgYm1pX3JzcF9idWZmLCBzaXplb2YoKnBhcmFtKSk7CisKKwlCTUlfREJHKCJCTUkgRXhlY3V0ZTogRXhpdCAocGFyYW06ICVkKSIsICpwYXJhbSk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworaW5saW5lIENERl9TVEFUVVMKK2JtaV9ub19jb21tYW5kKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMKK2JtaV9maXJtd2FyZV9kb3dubG9hZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlzdHJ1Y3QgYm1pX3RhcmdldF9pbmZvIHRhcmdfaW5mbzsKKwljZGZfbWVtX3plcm8oJnRhcmdfaW5mbywgc2l6ZW9mKHRhcmdfaW5mbykpOworCisJLyogSW5pdGlhbGl6ZSBCTUkgKi8KKwlzdGF0dXMgPSBibWlfaW5pdChzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkJNSSBJbml0aWFsaXphdGlvbiBGYWlsZWQgZXJyOiVkIiwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBHZXQgdGFyZ2V0IGluZm9ybWF0aW9uICovCisJc3RhdHVzID0gYm1pX2dldF90YXJnZXRfaW5mbygmdGFyZ19pbmZvLCBzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkJNSSBUYXJnZXQgSW5mbyBnZXQgZmFpbGVkOiBzdGF0dXM6JWQiLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXNjbi0+dGFyZ2V0X3R5cGUgPSB0YXJnX2luZm8udGFyZ2V0X3R5cGU7CisJc2NuLT50YXJnZXRfdmVyc2lvbiA9IHRhcmdfaW5mby50YXJnZXRfdmVyOworCisJLyogQ29uZmlndXJlIHRhcmdldCAqLworCXN0YXR1cyA9IG9sX2NvbmZpZ3VyZV90YXJnZXQoc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJCTUkgQ29uZmlndXJlIFRhcmdldCBGYWlsZWQgc3RhdHVzOiVkIiwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBvbF9kb3dubG9hZF9maXJtd2FyZShzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQlCTUlfRVJSKCJCTUkgRG93bmxvYWQgRmlybXdhcmUgRmFpbGVkIFN0YXR1czolZCIsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGJtaV9kb25lX2xvY2FsKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCWludCBzdGF0dXM7CisJdWludDMyX3QgY2lkOworCisJaWYgKCFzY24pIHsKKwkJQk1JX0VSUigiSW52YWxpZCBzY24gY29udGV4dCIpOworCQlibWlfYXNzZXJ0KDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19OT1RfSU5JVElBTElaRUQ7CisJfQorCisJaWYgKHNjbi0+Ym1pX2RvbmUpIHsKKwkJQk1JX0RCRygiYm1pX2RvbmVfbG9jYWwgc2tpcHBlZCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1BFUk07CisJfQorCisJQk1JX0RCRygiQk1JIERvbmU6IEVudGVyIChkZXZpY2U6IDB4JXApIiwgc2NuKTsKKworCXNjbi0+Ym1pX2RvbmUgPSB0cnVlOworCWNpZCA9IEJNSV9ET05FOworCisJaWYgKCFzY24tPmJtaV9jbWRfYnVmZikgeworCQlCTUlfRVJSKCJJbnZhbGlkIHNjbiBCTUlDbWRCdWZmIik7CisJCWJtaV9hc3NlcnQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX05PVF9JTklUSUFMSVpFRDsKKwl9CisKKwljZGZfbWVtX2NvcHkoc2NuLT5ibWlfY21kX2J1ZmYsICZjaWQsIHNpemVvZihjaWQpKTsKKworCXN0YXR1cyA9IGhpZl9leGNoYW5nZV9ibWlfbXNnKHNjbiwgc2NuLT5ibWlfY21kX2J1ZmYsCisJCQkJc2l6ZW9mKGNpZCksIE5VTEwsIE5VTEwsIDApOworCWlmIChzdGF0dXMpIHsKKwkJQk1JX0VSUigiRmFpbGVkIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2U7IHN0YXR1czolZCIsIHN0YXR1cyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoc2NuLT5ibWlfY21kX2J1ZmYpIHsKKwkJY2RmX29zX21lbV9mcmVlX2NvbnNpc3RlbnQoc2NuLT5jZGZfZGV2LCBNQVhfQk1JX0NNREJVRl9TWiwKKwkJCQkgICAgc2NuLT5ibWlfY21kX2J1ZmYsIHNjbi0+Ym1pX2NtZF9kYSwgMCk7CisJCXNjbi0+Ym1pX2NtZF9idWZmID0gTlVMTDsKKwkJc2NuLT5ibWlfY21kX2RhID0gMDsKKwl9CisKKwlpZiAoc2NuLT5ibWlfcnNwX2J1ZmYpIHsKKwkJY2RmX29zX21lbV9mcmVlX2NvbnNpc3RlbnQoc2NuLT5jZGZfZGV2LCBNQVhfQk1JX0NNREJVRl9TWiwKKwkJCQkgICAgc2NuLT5ibWlfcnNwX2J1ZmYsIHNjbi0+Ym1pX3JzcF9kYSwgMCk7CisJCXNjbi0+Ym1pX3JzcF9idWZmID0gTlVMTDsKKwkJc2NuLT5ibWlfcnNwX2RhID0gMDsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29yZS9ibWkvc3JjL2JtaV8yLmMgYi9jb3JlL2JtaS9zcmMvYm1pXzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhjZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9ibWkvc3JjL2JtaV8yLmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSAiaV9ibWkuaCIKKy8qIFRoaXMgbmVlZCB0byBkZWZpbmVkIGluIGZpcm13YXJlIGludGVyZmFjZSBmaWxlcy4KKyAqIERlZmluaW5nIGhlcmUgdG8gYWRkcmVzcyBjb21waWxhdGlvbiBpc3N1ZXMuCisgKiBXaWxsIGJlIGRlbGV0ZWQgb25jZSBmaXJtd2FyZSBpbnRlcmZhY2UgZmlsZXMgZm9yCisgKiB0YXJnZXQgYXJlIG1lcmdlZAorICovCisjZGVmaW5lIEJNSV9MT0FEX0lNQUdFICAgICAgICAgICAgICAxOAorCitDREZfU1RBVFVTCitibWlfbm9fY29tbWFuZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwl1aW50MzJfdCBjaWQ7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCBsZW5ndGg7CisJdWludDhfdCByZXQgPSAwOworCXVpbnQ4X3QgKmJtaV9jbWRfYnVmZiA9IHNjbi0+Ym1pX2NtZF9idWZmOworCXVpbnQ4X3QgKmJtaV9yc3BfYnVmZiA9IHNjbi0+Ym1pX3JzcF9idWZmOworCisJaWYgKHNjbi0+Ym1pX2RvbmUpIHsKKwkJQk1JX0VSUigiQ29tbWFuZCBkaXNhbGxvd2VkOiBCTUkgRE9ORSBBTFJFQURZIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUEVSTTsKKwl9CisKKwlpZiAoIWJtaV9jbWRfYnVmZiB8fCAhYm1pX3JzcF9idWZmKSB7CisJCUJNSV9FUlIoIk5vIE1lbW9yeSBBbGxvY2F0ZWQgZm9yIEJNSSBDTUQvUlNQIEJ1ZmZlciIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19OT1RfSU5JVElBTElaRUQ7CisJfQorCWNpZCA9IEJNSV9OT19DT01NQU5EOworCisJY2RmX21lbV9jb3B5KGJtaV9jbWRfYnVmZiwgJmNpZCwgc2l6ZW9mKGNpZCkpOworCWxlbmd0aCA9IHNpemVvZihyZXQpOworCisJc3RhdHVzID0gaGlmX2V4Y2hhbmdlX2JtaV9tc2coc2NuLCBibWlfY21kX2J1ZmYsIHNpemVvZihjaWQpLAorCQkJYm1pX3JzcF9idWZmLCAmbGVuZ3RoLCBCTUlfRVhDSEFOR0VfVElNRU9VVF9NUyk7CisKKwlpZiAoc3RhdHVzKSB7CisJCUJNSV9FUlIoIkZhaWxlZCB0byB3cml0ZSBibWkgbm8gY29tbWFuZCBzdGF0dXM6JWQiLCBzdGF0dXMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY2RmX21lbV9jb3B5KCZyZXQsIGJtaV9yc3BfYnVmZiwgbGVuZ3RoKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJQk1JX0VSUigiYm1pIG5vIGNvbW1hbmQgcmVzcG9uc2UgZXJyb3IgcmV0IDB4JXgiLCByZXQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMKK2JtaV9kb25lX2xvY2FsKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXVpbnQzMl90IGNpZDsKKwlpbnQgc3RhdHVzOworCXVpbnQzMl90IGxlbmd0aDsKKwl1aW50OF90IHJldCA9IDA7CisJdWludDhfdCAqYm1pX2NtZF9idWZmID0gc2NuLT5ibWlfY21kX2J1ZmY7CisJdWludDhfdCAqYm1pX3JzcF9idWZmID0gc2NuLT5ibWlfcnNwX2J1ZmY7CisKKwlpZiAoc2NuLT5ibWlfZG9uZSkgeworCQlCTUlfRVJSKCJDb21tYW5kIGRpc2FsbG93ZWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9QRVJNOworCX0KKworCWlmICghYm1pX2NtZF9idWZmIHx8ICFibWlfcnNwX2J1ZmYpIHsKKwkJQk1JX0VSUigiTm8gTWVtb3J5IEFsbG9jYXRlZCBmb3IgQk1JIENNRC9SU1AgQnVmZmVyIik7CisJCXJldHVybiBDREZfU1RBVFVTX05PVF9JTklUSUFMSVpFRDsKKwl9CisJY2lkID0gQk1JX0RPTkU7CisKKwljZGZfbWVtX2NvcHkoYm1pX2NtZF9idWZmLCAmY2lkLCBzaXplb2YoY2lkKSk7CisJbGVuZ3RoID0gc2l6ZW9mKHJldCk7CisKKwlzdGF0dXMgPSBoaWZfZXhjaGFuZ2VfYm1pX21zZyhzY24sIGJtaV9jbWRfYnVmZiwgc2l6ZW9mKGNpZCksCisJCSAgIGJtaV9yc3BfYnVmZiwgJmxlbmd0aCwgQk1JX0VYQ0hBTkdFX1RJTUVPVVRfTVMpOworCisJaWYgKHN0YXR1cykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gY2xvc2UgQk1JIG9uIHRhcmdldCBzdGF0dXM6JWQiLCBzdGF0dXMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWNkZl9tZW1fY29weSgmcmV0LCBibWlfcnNwX2J1ZmYsIGxlbmd0aCk7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJQk1JX0VSUigiQk1JIERPTkUgcmVzcG9uc2UgZmFpbGVkOiVkIiwgcmV0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChzY24tPmJtaV9jbWRfYnVmZikgeworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudChzY24tPmNkZl9kZXYsIE1BWF9CTUlfQ01EQlVGX1NaLAorCQkJCSAgICBzY24tPmJtaV9jbWRfYnVmZiwgc2NuLT5ibWlfY21kX2RhLCAwKTsKKwkJc2NuLT5ibWlfY21kX2J1ZmYgPSBOVUxMOworCQlzY24tPmJtaV9jbWRfZGEgPSAwOworCX0KKworCWlmIChzY24tPmJtaV9yc3BfYnVmZikgeworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudChzY24tPmNkZl9kZXYsIE1BWF9CTUlfQ01EQlVGX1NaLAorCQkJCSAgICBzY24tPmJtaV9yc3BfYnVmZiwgc2NuLT5ibWlfcnNwX2RhLCAwKTsKKwkJc2NuLT5ibWlfcnNwX2J1ZmYgPSBOVUxMOworCQlzY24tPmJtaV9yc3BfZGEgPSAwOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMKK2JtaV93cml0ZV9tZW1vcnkodWludDMyX3QgYWRkcmVzcywKKwkJdWludDhfdCAqYnVmZmVyLAorCQl1aW50MzJfdCBsZW5ndGgsCisJCXN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXVpbnQzMl90IGNpZDsKKwlpbnQgc3RhdHVzOworCXVpbnQzMl90IHJzcF9sZW47CisJdWludDhfdCByZXQgPSAwOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCByZW1haW5pbmcsIHR4bGVuOworCWNvbnN0IHVpbnQzMl90IGhlYWRlciA9IHNpemVvZihjaWQpICsgc2l6ZW9mKGFkZHJlc3MpICsgc2l6ZW9mKGxlbmd0aCk7CisJdWludDhfdCBhbGlnbmVkX2J1ZmZlcltCTUlfREFUQVNaX01BWF07CisJdWludDhfdCAqc3JjOworCXVpbnQ4X3QgKmJtaV9jbWRfYnVmZiA9IHNjbi0+Ym1pX2NtZF9idWZmOworCXVpbnQ4X3QgKmJtaV9yc3BfYnVmZiA9IHNjbi0+Ym1pX3JzcF9idWZmOworCisJaWYgKHNjbi0+Ym1pX2RvbmUpIHsKKwkJQk1JX0VSUigiQ29tbWFuZCBkaXNhbGxvd2VkIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUEVSTTsKKwl9CisKKwlpZiAoIWJtaV9jbWRfYnVmZiB8fCAhYm1pX3JzcF9idWZmKSB7CisJCUJNSV9FUlIoIkJNSSBJbml0aWFsaXphdGlvbiBpcyBub3QgaGFwcGVuZWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfTk9UX0lOSVRJQUxJWkVEOworCX0KKworCWJtaV9hc3NlcnQoQk1JX0NPTU1BTkRfRklUUyhCTUlfREFUQVNaX01BWCArIGhlYWRlcikpOworCWNkZl9tZW1fc2V0KGJtaV9jbWRfYnVmZiwgMCwgQk1JX0RBVEFTWl9NQVggKyBoZWFkZXIpOworCisJY2lkID0gQk1JX1dSSVRFX01FTU9SWTsKKwlyc3BfbGVuID0gc2l6ZW9mKHJldCk7CisKKwlyZW1haW5pbmcgPSBsZW5ndGg7CisJd2hpbGUgKHJlbWFpbmluZykgeworCQlzcmMgPSAmYnVmZmVyW2xlbmd0aCAtIHJlbWFpbmluZ107CisJCWlmIChyZW1haW5pbmcgPCAoQk1JX0RBVEFTWl9NQVggLSBoZWFkZXIpKSB7CisJCQlpZiAocmVtYWluaW5nICYgMykgeworCQkJCS8qIGFsaWduIGl0IHdpdGggNCBieXRlcyAqLworCQkJCXJlbWFpbmluZyA9IHJlbWFpbmluZyArICg0IC0gKHJlbWFpbmluZyAmIDMpKTsKKwkJCQltZW1jcHkoYWxpZ25lZF9idWZmZXIsIHNyYywgcmVtYWluaW5nKTsKKwkJCQlzcmMgPSBhbGlnbmVkX2J1ZmZlcjsKKwkJCX0KKwkJCXR4bGVuID0gcmVtYWluaW5nOworCQl9IGVsc2UgeworCQkJdHhsZW4gPSAoQk1JX0RBVEFTWl9NQVggLSBoZWFkZXIpOworCQl9CisJCW9mZnNldCA9IDA7CisJCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmNpZCwgc2l6ZW9mKGNpZCkpOworCQlvZmZzZXQgKz0gc2l6ZW9mKGNpZCk7CisJCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmFkZHJlc3MsCisJCQkJCQlzaXplb2YoYWRkcmVzcykpOworCQlvZmZzZXQgKz0gc2l6ZW9mKGFkZHJlc3MpOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksICZ0eGxlbiwgc2l6ZW9mKHR4bGVuKSk7CisJCW9mZnNldCArPSBzaXplb2YodHhsZW4pOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksIHNyYywgdHhsZW4pOworCQlvZmZzZXQgKz0gdHhsZW47CisJCXN0YXR1cyA9IGhpZl9leGNoYW5nZV9ibWlfbXNnKHNjbiwgYm1pX2NtZF9idWZmLCBvZmZzZXQsCisJCQlibWlfcnNwX2J1ZmYsICZyc3BfbGVuLCBCTUlfRVhDSEFOR0VfVElNRU9VVF9NUyk7CisJCWlmIChzdGF0dXMpIHsKKwkJCUJNSV9FUlIoIkJNSSBXcml0ZSBNZW1vcnkgRmFpbGVkIHN0YXR1czolZCIsIHN0YXR1cyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJY2RmX21lbV9jb3B5KCZyZXQsIGJtaV9yc3BfYnVmZiwgcnNwX2xlbik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJQk1JX0VSUigiQk1JIFdyaXRlIG1lbW9yeSByZXNwb25zZSBmYWlsOiAleCIsIHJldCk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJcmVtYWluaW5nIC09IHR4bGVuOyBhZGRyZXNzICs9IHR4bGVuOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMKK2JtaV9yZWFkX21lbW9yeSh1aW50MzJfdCBhZGRyZXNzLCB1aW50OF90ICpidWZmZXIsCisJCXVpbnQzMl90IGxlbmd0aCwgc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDMyX3QgY2lkOworCWludCBzdGF0dXM7CisJdWludDhfdCByZXQgPSAwOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCByZW1haW5pbmcsIHJ4bGVuLCByc3BfbGVuLCB0b3RhbF9sZW47CisJdWludDhfdCAqYm1pX2NtZF9idWZmID0gc2NuLT5ibWlfY21kX2J1ZmY7CisJLyogbm90ZSB3ZSByZXVzZSB0aGUgc2FtZSBidWZmZXIgdG8gcmVjZWl2ZSBvbiAqLworCXVpbnQ4X3QgKmJtaV9yc3BfYnVmZiA9IHNjbi0+Ym1pX3JzcF9idWZmOworCXVpbnQzMl90IHNpemUgPSBzaXplb2YoY2lkKSArIHNpemVvZihhZGRyZXNzKSArIHNpemVvZihsZW5ndGgpOworCisJaWYgKHNjbi0+Ym1pX2RvbmUpIHsKKwkJQk1JX0VSUigiQ29tbWFuZCBkaXNhbGxvd2VkIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUEVSTTsKKwl9CisJaWYgKCFibWlfY21kX2J1ZmYgfHwgIWJtaV9yc3BfYnVmZikgeworCQlCTUlfRVJSKCJCTUkgSW5pdGlhbGl6YXRpb24gaXMgbm90IGRvbmUiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfTk9UX0lOSVRJQUxJWkVEOworCX0KKworCWJtaV9hc3NlcnQoQk1JX0NPTU1BTkRfRklUUyhCTUlfREFUQVNaX01BWCArIHNpemUpKTsKKwljZGZfbWVtX3NldChibWlfY21kX2J1ZmYsIDAsIEJNSV9EQVRBU1pfTUFYICsgc2l6ZSk7CisJY2RmX21lbV9zZXQoYm1pX3JzcF9idWZmLCAwLCBCTUlfREFUQVNaX01BWCArIHNpemUpOworCisJY2lkID0gQk1JX1JFQURfTUVNT1JZOworCXJzcF9sZW4gPSBzaXplb2YocmV0KTsKKwlyZW1haW5pbmcgPSBsZW5ndGg7CisKKwl3aGlsZSAocmVtYWluaW5nKSB7CisJCXJ4bGVuID0gKHJlbWFpbmluZyA8IEJNSV9EQVRBU1pfTUFYIC0gcnNwX2xlbikgPyByZW1haW5pbmcgOgorCQkJCQkJKEJNSV9EQVRBU1pfTUFYIC0gcnNwX2xlbik7CisJCW9mZnNldCA9IDA7CisJCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmNpZCwgc2l6ZW9mKGNpZCkpOworCQlvZmZzZXQgKz0gc2l6ZW9mKGNpZCk7CisJCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmFkZHJlc3MsCisJCQkJCQlzaXplb2YoYWRkcmVzcykpOworCQlvZmZzZXQgKz0gc2l6ZW9mKGFkZHJlc3MpOworCQljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksICZyeGxlbiwgc2l6ZW9mKHJ4bGVuKSk7CisJCW9mZnNldCArPSBzaXplb2YobGVuZ3RoKTsKKworCQl0b3RhbF9sZW4gPSByeGxlbiArIHJzcF9sZW47CisKKwkJc3RhdHVzID0gaGlmX2V4Y2hhbmdlX2JtaV9tc2coc2NuLAorCQkJCQkgICBibWlfY21kX2J1ZmYsCisJCQkJCSAgIG9mZnNldCwKKwkJCQkJICAgYm1pX3JzcF9idWZmLAorCQkJCQkgICAmdG90YWxfbGVuLAorCQkJCQkgICBCTUlfRVhDSEFOR0VfVElNRU9VVF9NUyk7CisKKwkJaWYgKHN0YXR1cykgeworCQkJQk1JX0VSUigiQk1JIFJlYWQgbWVtb3J5IGZhaWxlZCBzdGF0dXM6JWQiLCBzdGF0dXMpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisKKwkJY2RmX21lbV9jb3B5KCZyZXQsIGJtaV9yc3BfYnVmZiwgcnNwX2xlbik7CisKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlCTUlfRVJSKCJibWkgcmVhZCBtZW1vcnkgcmVzcG9uc2UgZmFpbCAleCIsIHJldCk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKworCQljZGZfbWVtX2NvcHkoJmJ1ZmZlcltsZW5ndGggLSByZW1haW5pbmddLAorCQkJCSh1aW50OF90ICopYm1pX3JzcF9idWZmCSsgcnNwX2xlbiwgcnhsZW4pOworCQlyZW1haW5pbmcgLT0gcnhsZW47IGFkZHJlc3MgKz0gcnhsZW47CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUworYm1pX2V4ZWN1dGUodWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgKnBhcmFtLAorCQkJCQlzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwl1aW50MzJfdCBjaWQ7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCBsZW5ndGg7CisJdWludDhfdCByZXQgPSAwOworCXVpbnQ4X3QgKmJtaV9jbWRfYnVmZiA9IHNjbi0+Ym1pX2NtZF9idWZmOworCXVpbnQ4X3QgKmJtaV9yc3BfYnVmZiA9IHNjbi0+Ym1pX3JzcF9idWZmOworCisJaWYgKHNjbi0+Ym1pX2RvbmUpIHsKKwkJQk1JX0VSUigiQ29tbWFuZCBkaXNhbGxvd2VkIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUEVSTTsKKwl9CisKKwlpZiAoIWJtaV9jbWRfYnVmZiB8fCAhYm1pX3JzcF9idWZmKSB7CisJCUJNSV9FUlIoIk5vIE1lbW9yeSBBbGxvY2F0ZWQgZm9yIGJtaSBidWZmZXJzIik7CisJCXJldHVybiBDREZfU1RBVFVTX05PVF9JTklUSUFMSVpFRDsKKwl9CisKKwljaWQgPSBCTUlfRVhFQ1VURTsKKworCWNkZl9tZW1fY29weShibWlfY21kX2J1ZmYsICZjaWQsIHNpemVvZihjaWQpKTsKKwlsZW5ndGggPSBzaXplb2YocmV0KTsKKworCXN0YXR1cyA9IGhpZl9leGNoYW5nZV9ibWlfbXNnKHNjbiwgYm1pX2NtZF9idWZmLCBzaXplb2YoY2lkKSwKKwkJICAgYm1pX3JzcF9idWZmLCAmbGVuZ3RoLCBCTUlfRVhDSEFOR0VfVElNRU9VVF9NUyk7CisKKwlpZiAoc3RhdHVzKSB7CisJCUJNSV9FUlIoIkZhaWxlZCB0byBkbyBCTUlfRVhFQ1VURSBzdGF0dXM6JWQiLCBzdGF0dXMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY2RmX21lbV9jb3B5KCZyZXQsIGJtaV9yc3BfYnVmZiwgbGVuZ3RoKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlCTUlfRVJSKCIlczogcmV0IDB4JXgiLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgQ0RGX1NUQVRVUworYm1pX2xvYWRfaW1hZ2UoZG1hX2FkZHJfdCBhZGRyZXNzLAorCQl1aW50MzJfdCBzaXplLCBzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwl1aW50MzJfdCBjaWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IGxlbmd0aDsKKwl1aW50OF90IHJldCA9IDA7CisJdWludDhfdCAqYm1pX2NtZF9idWZmID0gc2NuLT5ibWlfY21kX2J1ZmY7CisJdWludDhfdCAqYm1pX3JzcF9idWZmID0gc2NuLT5ibWlfcnNwX2J1ZmY7CisJdWludDMyX3QgYWRkcl9oLCBhZGRyX2w7CisKKwlpZiAoc2NuLT5ibWlfZG9uZSkgeworCQlCTUlfRVJSKCJDb21tYW5kIGRpc2FsbG93ZWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9QRVJNOworCX0KKworCWlmICghYm1pX2NtZF9idWZmIHx8ICFibWlfcnNwX2J1ZmYpIHsKKwkJQk1JX0VSUigiTm8gTWVtb3J5IEFsbG9jYXRlZCBmb3IgQk1JIENNRC9SU1AgQnVmZmVyIik7CisJCXJldHVybiBDREZfU1RBVFVTX05PVF9JTklUSUFMSVpFRDsKKwl9CisKKwlibWlfYXNzZXJ0KEJNSV9DT01NQU5EX0ZJVFMoc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcmVzcykpKTsKKwljZGZfbWVtX3NldChibWlfY21kX2J1ZmYsIDAsIHNpemVvZihjaWQpICsgc2l6ZW9mKGFkZHJlc3MpKTsKKworCisJQk1JX0RCRygiJXM6IEVudGVyIGRldmljZTogMHglcCwgc2l6ZSAlZCIsIF9fZnVuY19fLCBzY24sIHNpemUpOworCisJY2lkID0gQk1JX0xPQURfSU1BR0U7CisKKwlvZmZzZXQgPSAwOworCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmNpZCwgc2l6ZW9mKGNpZCkpOworCW9mZnNldCArPSBzaXplb2YoY2lkKTsKKwlhZGRyX2wgPSBhZGRyZXNzICYgMHhmZmZmZmZmZjsKKwlhZGRyX2ggPSAweDAwOworCWNkZl9tZW1fY29weSgmKGJtaV9jbWRfYnVmZltvZmZzZXRdKSwgJmFkZHJfbCwgc2l6ZW9mKGFkZHJfbCkpOworCW9mZnNldCArPSBzaXplb2YoYWRkcl9sKTsKKwljZGZfbWVtX2NvcHkoJihibWlfY21kX2J1ZmZbb2Zmc2V0XSksICZhZGRyX2gsIHNpemVvZihhZGRyX2gpKTsKKwlvZmZzZXQgKz0gc2l6ZW9mKGFkZHJfaCk7CisJY2RmX21lbV9jb3B5KCYoYm1pX2NtZF9idWZmW29mZnNldF0pLCAmc2l6ZSwgc2l6ZW9mKHNpemUpKTsKKwlvZmZzZXQgKz0gc2l6ZW9mKHNpemUpOworCWxlbmd0aCA9IHNpemVvZihyZXQpOworCisJc3RhdHVzID0gaGlmX2V4Y2hhbmdlX2JtaV9tc2coc2NuLCBibWlfY21kX2J1ZmYsIG9mZnNldCwKKwkJICAgYm1pX3JzcF9idWZmLCAmbGVuZ3RoLCBCTUlfRVhDSEFOR0VfVElNRU9VVF9NUyk7CisKKwlpZiAoc3RhdHVzKSB7CisJCUJNSV9FUlIoIkJNSSBMb2FkIEltYWdlIEZhaWxlZDsgc3RhdHVzOiVkIiwgc3RhdHVzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNkZl9tZW1fY29weSgmcmV0LCBibWlfcnNwX2J1ZmYsIGxlbmd0aCk7CisJaWYgKHJldCAhPSAwKSB7CisJCUJNSV9FUlIoIiVzOiByZXQgMHgleCIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTIGJtaV9lbmFibGUoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJc3RydWN0IGJtaV90YXJnZXRfaW5mbyB0YXJnX2luZm87CisJc3RydWN0IGltYWdlX2Rlc2NfaW5mbyBpbWFnZV9kZXNjX2luZm87CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlpZiAoIXNjbikgeworCQlCTUlfRVJSKCJJbnZhbGlkIHNjbiBjb250ZXh0Iik7CisJCWJtaV9hc3NlcnQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX05PVF9JTklUSUFMSVpFRDsKKwl9CisKKwlpZiAoc2NuLT5ibWlfY21kX2J1ZmYgPT0gTlVMTCB8fCBzY24tPmJtaV9yc3BfYnVmZiA9PSBOVUxMKSB7CisJCUJNSV9FUlIoImJtaV9vcGVuIGZhaWxlZCEiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfTk9UX0lOSVRJQUxJWkVEOworCX0KKworCXN0YXR1cyA9IGJtaV9nZXRfdGFyZ2V0X2luZm8oJnRhcmdfaW5mbywgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwlCTUlfREJHKCIlczogdGFyZ2V0IHR5cGUgMHgleCwgdGFyZ2V0IHZlciAweCV4IiwgX19mdW5jX18sCisJICAgICAgIHRhcmdfaW5mby50YXJnZXRfdHlwZSwgdGFyZ19pbmZvLnRhcmdldF92ZXIpOworCXNjbi0+dGFyZ2V0X3R5cGUgPSB0YXJnX2luZm8udGFyZ2V0X3R5cGU7CisJc2NuLT50YXJnZXRfdmVyc2lvbiA9IHRhcmdfaW5mby50YXJnZXRfdmVyOworCisJaWYgKGNuc3NfZ2V0X2Z3X2ltYWdlKCZpbWFnZV9kZXNjX2luZm8pICE9IDApIHsKKwkJQk1JX0VSUigiRmFpbGVkIHRvIGdldCBmdyBpbWFnZSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJc3RhdHVzID0gYm1pX2xvYWRfaW1hZ2UoaW1hZ2VfZGVzY19pbmZvLmJkYXRhX2FkZHIsCisJCQkJaW1hZ2VfZGVzY19pbmZvLmJkYXRhX3NpemUsCisJCQkJc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJMb2FkIGJvYXJkIGRhdGEgZmFpbGVkISBzdGF0dXM6JWQiLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGJtaV9sb2FkX2ltYWdlKGltYWdlX2Rlc2NfaW5mby5md19hZGRyLAorCQkJCWltYWdlX2Rlc2NfaW5mby5md19zaXplLAorCQkJCXNjbik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCUJNSV9FUlIoIkxvYWQgZncgaW1hZ2UgZmFpbGVkISBzdGF0dXM6JWQiLCBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBibWlfZmlybXdhcmVfZG93bmxvYWQoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlpZiAoSUhFTElVTV9OT19CTUkpCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlzdGF0dXMgPSBibWlfaW5pdChzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkJNSV9JTklUIEZhaWxlZCBzdGF0dXM6JWQiLCBzdGF0dXMpOworCQlnb3RvIGVuZDsKKwl9CisKKwlzdGF0dXMgPSBibWlfZW5hYmxlKHNjbik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiQk1JX0VOQUJMRSBmYWlsZWQgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOworCQlnb3RvIGVycl9ibWlfZW5hYmxlOworCX0KKworCXJldHVybiBzdGF0dXM7CitlcnJfYm1pX2VuYWJsZToKKwlibWlfY2xlYW51cChzY24pOworZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2JtaS9zcmMvaV9hcjYzMjB2Ml9yZWd0YWJsZS5oIGIvY29yZS9ibWkvc3JjL2lfYXI2MzIwdjJfcmVndGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDIyZTEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9ibWkvc3JjL2lfYXI2MzIwdjJfcmVndGFibGUuaApAQCAtMCwwICsxLDYwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0FSNjMyMFYyX0RCR19SRUdUQUJMRV9IXworI2RlZmluZSBfQVI2MzIwVjJfREJHX1JFR1RBQkxFX0hfCisKKyNpbmNsdWRlICJyZWd0YWJsZS5oIgorCisjZGVmaW5lIEFSNjMyMF9SRVYyXzFfUkVHX1NJWkUgMHgwMDA3RjgyMAorI2RlZmluZSBBUjYzMjBfUkVWM19SRUdfU0laRSAgIDB4MDAwN0Y4MjAKKworI2lmZGVmIEhJRl9QQ0kKKy8qCisgKiBSZWRlZmluZSB0aGUgcmVnaXN0ZXIgbGlzdC4gVG8gbWluaW1pemUgdGhlIHNpemUgb2YgdGhlIGFycmF5LCB0aGUgbGlzdCBtdXN0CisgKiBvYmV5IHRoZSBiZWxvdyBmb3JtYXQuIHtzdGFydDAsIGVuZDB9LCB7c3RhcnQxLCBlbmQxfSwge3N0YXJ0MiwgZW5kMn0uLi4uLi4uCisgKiBUaGUgdmFsdWUgYmVsb3cgbXVzdCBvYmV5IHRvICJzdGFydDAgPCBlbmQwIDwgc3RhcnQxIDwgZW5kMSA8IHN0YXJ0MiA8IC4uLiIsCisgKiBvdGhlcndpc2Ugd2UgbWF5IGVuY291dGVyIGVycm9yIGluIHRoZSBkdW1wIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIGNvbnN0IHRndF9yZWdfc2VjdGlvbiBhcjYzMjB2Ml9yZWdfdGFibGVbXSA9IHsKKwl7MHg4MDAsIDB4ODEwfSwKKwl7MHg4MjAsIDB4ODJDfSwKKwl7MHg4MzAsIDB4OEY0fSwKKwl7MHg5MEMsIDB4OTFDfSwKKwl7MHhBMTQsIDB4QTE4fSwKKwl7MHhBODQsIDB4QTk0fSwKKwl7MHhBQTgsIDB4QUQ0fSwKKwl7MHhBREMsIDB4QjQwfSwKKwl7MHgxMDAwLCAweDEwQTR9LAorCXsweDEwQkMsIDB4MTExQ30sCisJezB4MTEzNCwgMHgxMTM4fSwKKwl7MHgxMTQ0LCAweDExNEN9LAorCXsweDExNTAsIDB4MTE1Q30sCisJezB4MTE2MCwgMHgxMTc4fSwKKwl7MHgxMjQwLCAweDEyNjB9LAorCXsweDIwMDAsIDB4MjA3Q30sCisJezB4MzAwMCwgMHgzMDE0fSwKKwl7MHg0MDAwLCAweDQwMTR9LAorCXsweDUwMDAsIDB4NTEyNH0sCisJezB4NjAwMCwgMHg2MDQwfSwKKwl7MHg2MDgwLCAweDYwQ0N9LAorCXsweDYxMDAsIDB4NjExQ30sCisJezB4NjE0MCwgMHg2MUQ4fSwKKwl7MHg2MjAwLCAweDYyMzh9LAorCXsweDYyNDAsIDB4NjI4Q30sCisJezB4NjJDMCwgMHg2MkVDfSwKKwl7MHg2MzgwLCAweDYzRTh9LAorCXsweDY0MDAsIDB4NjQ0MH0sCisJezB4NjQ4MCwgMHg2NENDfSwKKwl7MHg2NTAwLCAweDY1MUN9LAorCXsweDY1NDAsIDB4NjU4MH0sCisJezB4NjYwMCwgMHg2NjM4fSwKKwl7MHg2NjQwLCAweDY2OEN9LAorCXsweDY2QzAsIDB4NjZFQ30sCisJezB4Njc4MCwgMHg2N0U4fSwKKwl7MHg3MDgwLCAweDcwOEN9LAorCXsweDcwQzAsIDB4NzBDOH0sCisJezB4NzQwMCwgMHg3NDFDfSwKKwl7MHg3NDQwLCAweDc0NTR9LAorCXsweDc4MDAsIDB4NzgxOH0sCisJezB4ODAwMCwgMHg4MDA0fSwKKwl7MHg4MDEwLCAweDgwNjR9LAorCXsweDgwODAsIDB4ODA4NH0sCisJezB4ODBBMCwgMHg4MEE0fSwKKwl7MHg4MEMwLCAweDgwQzR9LAorCXsweDgwRTAsIDB4ODBGNH0sCisJezB4ODEwMCwgMHg4MTA0fSwKKwl7MHg4MTEwLCAweDgxMkN9LAorCXsweDkwMDAsIDB4OTAwNH0sCisJezB4OTgwMCwgMHg5ODJDfSwKKwl7MHg5ODMwLCAweDk4Mzh9LAorCXsweDk4NDAsIDB4OTg2Q30sCisJezB4OTg3MCwgMHg5ODk4fSwKKwl7MHg5QTAwLCAweDlDMDB9LAorCXsweEQ1ODAsIDB4RDU5Q30sCisJezB4RjAwMCwgMHhGMEUwfSwKKwl7MHhGMTQwLCAweEYxOTB9LAorCXsweEYyNTAsIDB4RjI1Q30sCisJezB4RjI2MCwgMHhGMjY4fSwKKwl7MHhGMjZDLCAweEYyQTh9LAorCXsweDEwMDA4LCAweDEwMDBDfSwKKwl7MHgxMDAxNCwgMHgxMDAxOH0sCisJezB4MTAwMUMsIDB4MTAwMjB9LAorCXsweDEwMDI0LCAweDEwMDI4fSwKKwl7MHgxMDAzMCwgMHgxMDAzNH0sCisJezB4MTAwNDAsIDB4MTAwNTR9LAorCXsweDEwMDU4LCAweDEwMDdDfSwKKwl7MHgxMDA4MCwgMHgxMDBDNH0sCisJezB4MTAwQzgsIDB4MTAxMTR9LAorCXsweDEwMTJDLCAweDEwMTMwfSwKKwl7MHgxMDEzOCwgMHgxMDE0NH0sCisJezB4MTAyMDAsIDB4MTAyMjB9LAorCXsweDEwMjMwLCAweDEwMjUwfSwKKwl7MHgxMDI2MCwgMHgxMDI4MH0sCisJezB4MTAyOTAsIDB4MTAyQjB9LAorCXsweDEwMkMwLCAweDEwMkRDfSwKKwl7MHgxMDJFMCwgMHgxMDJGNH0sCisJezB4MTAyRkMsIDB4MTAzN0N9LAorCXsweDEwMzgwLCAweDEwMzkwfSwKKwl7MHgxMDgwMCwgMHgxMDgyOH0sCisJezB4MTA4NDAsIDB4MTA4NDR9LAorCXsweDEwODgwLCAweDEwODg0fSwKKwl7MHgxMDhDMCwgMHgxMDhFOH0sCisJezB4MTA5MDAsIDB4MTA5Mjh9LAorCXsweDEwOTQwLCAweDEwOTQ0fSwKKwl7MHgxMDk4MCwgMHgxMDk4NH0sCisJezB4MTA5QzAsIDB4MTA5RTh9LAorCXsweDEwQTAwLCAweDEwQTI4fSwKKwl7MHgxMEE0MCwgMHgxMEE1MH0sCisJezB4MTEwMDAsIDB4MTEwMjh9LAorCXsweDExMDMwLCAweDExMDM0fSwKKwl7MHgxMTAzOCwgMHgxMTA2OH0sCisJezB4MTEwNzAsIDB4MTEwNzR9LAorCXsweDExMDc4LCAweDExMEE4fSwKKwl7MHgxMTBCMCwgMHgxMTBCNH0sCisJezB4MTEwQjgsIDB4MTEwRTh9LAorCXsweDExMEYwLCAweDExMEY0fSwKKwl7MHgxMTBGOCwgMHgxMTEyOH0sCisJezB4MTExMzgsIDB4MTExNDR9LAorCXsweDExMTc4LCAweDExMTgwfSwKKwl7MHgxMTFCOCwgMHgxMTFDMH0sCisJezB4MTExRjgsIDB4MTEyMDB9LAorCXsweDExMjM4LCAweDExMjNDfSwKKwl7MHgxMTI3MCwgMHgxMTI3NH0sCisJezB4MTEyNzgsIDB4MTEyN0N9LAorCXsweDExMkIwLCAweDExMkI0fSwKKwl7MHgxMTJCOCwgMHgxMTJCQ30sCisJezB4MTEyRjAsIDB4MTEyRjR9LAorCXsweDExMkY4LCAweDExMkZDfSwKKwl7MHgxMTMzOCwgMHgxMTMzQ30sCisJezB4MTEzNzgsIDB4MTEzN0N9LAorCXsweDExM0I4LCAweDExM0JDfSwKKwl7MHgxMTNGOCwgMHgxMTNGQ30sCisJezB4MTE0MzgsIDB4MTE0NDB9LAorCXsweDExNDc4LCAweDExNDgwfSwKKwl7MHgxMTRCOCwgMHgxMTRCQ30sCisJezB4MTE0RjgsIDB4MTE0RkN9LAorCXsweDExNTM4LCAweDExNTNDfSwKKwl7MHgxMTU3OCwgMHgxMTU3Q30sCisJezB4MTE1QjgsIDB4MTE1QkN9LAorCXsweDExNUY4LCAweDExNUZDfSwKKwl7MHgxMTYzOCwgMHgxMTYzQ30sCisJezB4MTE2NzgsIDB4MTE2N0N9LAorCXsweDExNkI4LCAweDExNkJDfSwKKwl7MHgxMTZGOCwgMHgxMTZGQ30sCisJezB4MTE3MzgsIDB4MTE3M0N9LAorCXsweDExNzc4LCAweDExNzdDfSwKKwl7MHgxMTdCOCwgMHgxMTdCQ30sCisJezB4MTE3RjgsIDB4MTE3RkN9LAorCXsweDE3MDAwLCAweDE3MDFDfSwKKwl7MHgxNzAyMCwgMHgxNzBBQ30sCisJezB4MTgwMDAsIDB4MTgwNTB9LAorCXsweDE4MDU0LCAweDE4MDc0fSwKKwl7MHgxODA4MCwgMHgxODBENH0sCisJezB4MTgwREMsIDB4MTgxMDR9LAorCXsweDE4MTA4LCAweDE4MTNDfSwKKwl7MHgxODE0NCwgMHgxODE0OH0sCisJezB4MTgxNjgsIDB4MTgxNzR9LAorCXsweDE4MTc4LCAweDE4MTgwfSwKKwl7MHgxODFDOCwgMHgxODFFMH0sCisJezB4MTgxRTQsIDB4MTgxRTh9LAorCXsweDE4MUVDLCAweDE4MjBDfSwKKwl7MHgxODI1QywgMHgxODI4MH0sCisJezB4MTgyODQsIDB4MTgyOTB9LAorCXsweDE4Mjk0LCAweDE4MkEwfSwKKwl7MHgxODMwMCwgMHgxODMwNH0sCisJezB4MTgzMTQsIDB4MTgzMjB9LAorCXsweDE4MzI4LCAweDE4MzUwfSwKKwl7MHgxODM1QywgMHgxODM2Q30sCisJezB4MTgzNzAsIDB4MTgzOTB9LAorCXsweDE4Mzk4LCAweDE4M0FDfSwKKwl7MHgxODNCQywgMHgxODNEOH0sCisJezB4MTgzREMsIDB4MTgzRjR9LAorCXsweDE4NDAwLCAweDE4NkY0fSwKKwl7MHgxODZGOCwgMHgxODcxQ30sCisJezB4MTg3MjAsIDB4MTg3OTB9LAorCXsweDE5ODAwLCAweDE5ODMwfSwKKwl7MHgxOTgzNCwgMHgxOTg0MH0sCisJezB4MTk4ODAsIDB4MTk4OUN9LAorCXsweDE5OEE0LCAweDE5OEIwfSwKKwl7MHgxOThCQywgMHgxOTkwMH0sCisJezB4MTlDMDAsIDB4MTlDODh9LAorCXsweDE5RDAwLCAweDE5RDIwfSwKKwl7MHgxOUUwMCwgMHgxOUU3Q30sCisJezB4MTlFODAsIDB4MTlFOTR9LAorCXsweDE5RTk4LCAweDE5RUFDfSwKKwl7MHgxOUVCMCwgMHgxOUVCQ30sCisJezB4MTlGNzAsIDB4MTlGNzR9LAorCXsweDE5RjgwLCAweDE5RjhDfSwKKwl7MHgxOUZBMCwgMHgxOUZCNH0sCisJezB4MTlGQzAsIDB4MTlGRDh9LAorCXsweDFBMDAwLCAweDFBMjAwfSwKKwl7MHgxQTIwNCwgMHgxQTIxMH0sCisJezB4MUEyMjgsIDB4MUEyMkN9LAorCXsweDFBMjMwLCAweDFBMjQ4fSwKKwl7MHgxQTI1MCwgMHgxQTI3MH0sCisJezB4MUEyODAsIDB4MUEyOTB9LAorCXsweDFBMkEwLCAweDFBMkE0fSwKKwl7MHgxQTJDMCwgMHgxQTJFQ30sCisJezB4MUEzMDAsIDB4MUEzQkN9LAorCXsweDFBM0YwLCAweDFBM0Y0fSwKKwl7MHgxQTNGOCwgMHgxQTQzNH0sCisJezB4MUE0MzgsIDB4MUE0NDR9LAorCXsweDFBNDQ4LCAweDFBNDY4fSwKKwl7MHgxQTU4MCwgMHgxQTU4Q30sCisJezB4MUE2NDQsIDB4MUE2NTR9LAorCXsweDFBNjcwLCAweDFBNjk4fSwKKwl7MHgxQTZBQywgMHgxQTZCMH0sCisJezB4MUE2RDAsIDB4MUE2RDR9LAorCXsweDFBNkVDLCAweDFBNzBDfSwKKwl7MHgxQTcxMCwgMHgxQTczOH0sCisJezB4MUE3QzAsIDB4MUE3RDB9LAorCXsweDFBN0Q0LCAweDFBN0Q4fSwKKwl7MHgxQTdEQywgMHgxQTdFNH0sCisJezB4MUE3RjAsIDB4MUE3Rjh9LAorCXsweDFBODg4LCAweDFBODlDfSwKKwl7MHgxQThBOCwgMHgxQThBQ30sCisJezB4MUE4QzAsIDB4MUE4REN9LAorCXsweDFBOEYwLCAweDFBOEZDfSwKKwl7MHgxQUUwNCwgMHgxQUUwOH0sCisJezB4MUFFMTgsIDB4MUFFMjR9LAorCXsweDFBRjgwLCAweDFBRjhDfSwKKwl7MHgxQUZBMCwgMHgxQUZCNH0sCisJezB4MUIwMDAsIDB4MUIyMDB9LAorCXsweDFCMjg0LCAweDFCMjg4fSwKKwl7MHgxQjJEMCwgMHgxQjJEOH0sCisJezB4MUIyREMsIDB4MUIyRUN9LAorCXsweDFCMzAwLCAweDFCMzQwfSwKKwl7MHgxQjM3NCwgMHgxQjM3OH0sCisJezB4MUIzODAsIDB4MUIzODR9LAorCXsweDFCMzg4LCAweDFCMzhDfSwKKwl7MHgxQjQwNCwgMHgxQjQwOH0sCisJezB4MUI0MjAsIDB4MUI0Mjh9LAorCXsweDFCNDQwLCAweDFCNDQ0fSwKKwl7MHgxQjQ0OCwgMHgxQjQ0Q30sCisJezB4MUI0NTAsIDB4MUI0NTh9LAorCXsweDFCNDVDLCAweDFCNDY4fSwKKwl7MHgxQjU4NCwgMHgxQjU4Q30sCisJezB4MUI2OEMsIDB4MUI2OTB9LAorCXsweDFCNkFDLCAweDFCNkIwfSwKKwl7MHgxQjdGMCwgMHgxQjdGOH0sCisJezB4MUM4MDAsIDB4MUNDMDB9LAorCXsweDFDRTAwLCAweDFDRTA0fSwKKwl7MHgxQ0Y4MCwgMHgxQ0Y4NH0sCisJezB4MUQyMDAsIDB4MUQ4MDB9LAorCXsweDFFMDAwLCAweDIwMDE0fSwKKwl7MHgyMDEwMCwgMHgyMDEyNH0sCisJezB4MjE0MDAsIDB4MjE3QTh9LAorCXsweDIxODAwLCAweDIxQkE4fSwKKwl7MHgyMUMwMCwgMHgyMUZBOH0sCisJezB4MjIwMDAsIDB4MjIzQTh9LAorCXsweDIyNDAwLCAweDIyN0E4fSwKKwl7MHgyMjgwMCwgMHgyMkJBOH0sCisJezB4MjJDMDAsIDB4MjJGQTh9LAorCXsweDIzMDAwLCAweDIzM0E4fSwKKwl7MHgyNDAwMCwgMHgyNDAzNH0sCisKKwkvKgorCSAqIEVGVVNFMCwxLDIgaXMgZGlzYWJsZWQgaGVyZQorCSAqIGJlY2F1c2UgaXQncyBzdGF0ZSBtYXkgYmUgcmVzZXQKKwkgKgorCSAqIHsweDI0ODAwLCAweDI0ODA0fSwKKwkgKiB7MHgyNTAwMCwgMHgyNTAwNH0sCisJICogezB4MjU4MDAsIDB4MjU4MDR9LAorCSAqLworCisJezB4MjYwMDAsIDB4MjYwNjR9LAorCXsweDI3MDAwLCAweDI3MDI0fSwKKwl7MHgzNDAwMCwgMHgzNDAwQ30sCisJezB4MzQ0MDAsIDB4MzQ0NUN9LAorCXsweDM0ODAwLCAweDM0ODVDfSwKKwl7MHgzNEMwMCwgMHgzNEM1Q30sCisJezB4MzUwMDAsIDB4MzUwNUN9LAorCXsweDM1NDAwLCAweDM1NDVDfSwKKwl7MHgzNTgwMCwgMHgzNTg1Q30sCisJezB4MzVDMDAsIDB4MzVDNUN9LAorCXsweDM2MDAwLCAweDM2MDVDfSwKKwl7MHgzODAwMCwgMHgzODA2NH0sCisJezB4MzgwNzAsIDB4MzgwRTB9LAorCXsweDNBMDAwLCAweDNBMDY0fSwKKworCS8qIERCSSB3aW5kb3dzIGlzIHNraXBwZWQgaGVyZSwgaXQgY2FuIGJlIG9ubHkgYWNjZXNzZWQgd2hlbiBwY2llCisJICogaXMgYWN0aXZlIChub3QgaW4gcmVzZXQpIGFuZCBDT1JFX0NUUkxfUENJRV9MVFNTTV9FTiA9IDAgJiYKKwkgKiBQQ0lFX0NUUkxfQVBQX0xUU1NNX0VOQUxCRT0wLgorCSAqIHsweDNDMDAwICwgMHgzQzAwNH0sCisJICovCisKKwl7MHg0MDAwMCwgMHg0MDBBNH0sCisKKwkvKgorCSAqIFNJIHJlZ2lzdGVyIGlzIHNraXBlZCBoZXJlLgorCSAqIEJlY2F1c2UgaXQgd2lsbCBjYXVzZSBidXMgaGFuZworCSAqCisJICogezB4NTAwMDAsIDB4NTAwMTh9LAorCSAqLworCisJezB4ODAwMDAsIDB4ODAwMEN9LAorCXsweDgwMDEwLCAweDgwMDIwfSwKK307CisKK3N0YXRpYyBjb25zdCB0Z3RfcmVnX3NlY3Rpb24gYXI2MzIwdjNfcmVnX3RhYmxlW10gPSB7CisJezB4ODAwLCAweDgxMH0sCisJezB4ODIwLCAweDgyQ30sCisJezB4ODMwLCAweDhGNH0sCisJezB4OTBDLCAweDkxQ30sCisJezB4QTE0LCAweEExOH0sCisJezB4QTg0LCAweEE5NH0sCisJezB4QUE4LCAweEFENH0sCisJezB4QURDLCAweEI0MH0sCisJezB4MTAwMCwgMHgxMEE0fSwKKwl7MHgxMEJDLCAweDExMUN9LAorCXsweDExMzQsIDB4MTEzOH0sCisJezB4MTE0NCwgMHgxMTRDfSwKKwl7MHgxMTUwLCAweDExNUN9LAorCXsweDExNjAsIDB4MTE3OH0sCisJezB4MTI0MCwgMHgxMjYwfSwKKwl7MHgyMDAwLCAweDIwN0N9LAorCXsweDMwMDAsIDB4MzAxNH0sCisJezB4NDAwMCwgMHg0MDE0fSwKKwl7MHg1MDAwLCAweDUxMjR9LAorCXsweDYwMDAsIDB4NjA0MH0sCisJezB4NjA4MCwgMHg2MENDfSwKKwl7MHg2MTAwLCAweDYxMUN9LAorCXsweDYxNDAsIDB4NjFEOH0sCisJezB4NjIwMCwgMHg2MjM4fSwKKwl7MHg2MjQwLCAweDYyOEN9LAorCXsweDYyQzAsIDB4NjJFQ30sCisJezB4NjM4MCwgMHg2M0U4fSwKKwl7MHg2NDAwLCAweDY0NDB9LAorCXsweDY0ODAsIDB4NjRDQ30sCisJezB4NjUwMCwgMHg2NTFDfSwKKwl7MHg2NTQwLCAweDY1ODB9LAorCXsweDY2MDAsIDB4NjYzOH0sCisJezB4NjY0MCwgMHg2NjhDfSwKKwl7MHg2NkMwLCAweDY2RUN9LAorCXsweDY3ODAsIDB4NjdFOH0sCisJezB4NzA4MCwgMHg3MDhDfSwKKwl7MHg3MEMwLCAweDcwQzh9LAorCXsweDc0MDAsIDB4NzQxQ30sCisJezB4NzQ0MCwgMHg3NDU0fSwKKwl7MHg3ODAwLCAweDc4MTh9LAorCXsweDgwMDAsIDB4ODAwNH0sCisJezB4ODAxMCwgMHg4MDY0fSwKKwl7MHg4MDgwLCAweDgwODR9LAorCXsweDgwQTAsIDB4ODBBNH0sCisJezB4ODBDMCwgMHg4MEM0fSwKKwl7MHg4MEUwLCAweDgwRjR9LAorCXsweDgxMDAsIDB4ODEwNH0sCisJezB4ODExMCwgMHg4MTJDfSwKKwl7MHg5MDAwLCAweDkwMDR9LAorCXsweDk4MDAsIDB4OTgyQ30sCisJezB4OTgzMCwgMHg5ODM4fSwKKwl7MHg5ODQwLCAweDk4NkN9LAorCXsweDk4NzAsIDB4OTg5OH0sCisJezB4OUEwMCwgMHg5QzAwfSwKKwl7MHhENTgwLCAweEQ1OUN9LAorCXsweEYwMDAsIDB4RjBFMH0sCisJezB4RjE0MCwgMHhGMTkwfSwKKwl7MHhGMjUwLCAweEYyNUN9LAorCXsweEYyNjAsIDB4RjI2OH0sCisJezB4RjI2QywgMHhGMkE4fSwKKwl7MHgxMDAwOCwgMHgxMDAwQ30sCisJezB4MTAwMTQsIDB4MTAwMTh9LAorCXsweDEwMDFDLCAweDEwMDIwfSwKKwl7MHgxMDAyNCwgMHgxMDAyOH0sCisJezB4MTAwMzAsIDB4MTAwMzR9LAorCXsweDEwMDQwLCAweDEwMDU0fSwKKwl7MHgxMDA1OCwgMHgxMDA3Q30sCisJezB4MTAwODAsIDB4MTAwQzR9LAorCXsweDEwMEM4LCAweDEwMTE0fSwKKwl7MHgxMDEyQywgMHgxMDEzMH0sCisJezB4MTAxMzgsIDB4MTAxNDR9LAorCXsweDEwMjAwLCAweDEwMjIwfSwKKwl7MHgxMDIzMCwgMHgxMDI1MH0sCisJezB4MTAyNjAsIDB4MTAyODB9LAorCXsweDEwMjkwLCAweDEwMkIwfSwKKwl7MHgxMDJDMCwgMHgxMDJEQ30sCisJezB4MTAyRTAsIDB4MTAyRjR9LAorCXsweDEwMkZDLCAweDEwMzdDfSwKKwl7MHgxMDM4MCwgMHgxMDM5MH0sCisJezB4MTA4MDAsIDB4MTA4Mjh9LAorCXsweDEwODQwLCAweDEwODQ0fSwKKwl7MHgxMDg4MCwgMHgxMDg4NH0sCisJezB4MTA4QzAsIDB4MTA4RTh9LAorCXsweDEwOTAwLCAweDEwOTI4fSwKKwl7MHgxMDk0MCwgMHgxMDk0NH0sCisJezB4MTA5ODAsIDB4MTA5ODR9LAorCXsweDEwOUMwLCAweDEwOUU4fSwKKwl7MHgxMEEwMCwgMHgxMEEyOH0sCisJezB4MTBBNDAsIDB4MTBBNTB9LAorCXsweDExMDAwLCAweDExMDI4fSwKKwl7MHgxMTAzMCwgMHgxMTAzNH0sCisJezB4MTEwMzgsIDB4MTEwNjh9LAorCXsweDExMDcwLCAweDExMDc0fSwKKwl7MHgxMTA3OCwgMHgxMTBBOH0sCisJezB4MTEwQjAsIDB4MTEwQjR9LAorCXsweDExMEI4LCAweDExMEU4fSwKKwl7MHgxMTBGMCwgMHgxMTBGNH0sCisJezB4MTEwRjgsIDB4MTExMjh9LAorCXsweDExMTM4LCAweDExMTQ0fSwKKwl7MHgxMTE3OCwgMHgxMTE4MH0sCisJezB4MTExQjgsIDB4MTExQzB9LAorCXsweDExMUY4LCAweDExMjAwfSwKKwl7MHgxMTIzOCwgMHgxMTIzQ30sCisJezB4MTEyNzAsIDB4MTEyNzR9LAorCXsweDExMjc4LCAweDExMjdDfSwKKwl7MHgxMTJCMCwgMHgxMTJCNH0sCisJezB4MTEyQjgsIDB4MTEyQkN9LAorCXsweDExMkYwLCAweDExMkY0fSwKKwl7MHgxMTJGOCwgMHgxMTJGQ30sCisJezB4MTEzMzgsIDB4MTEzM0N9LAorCXsweDExMzc4LCAweDExMzdDfSwKKwl7MHgxMTNCOCwgMHgxMTNCQ30sCisJezB4MTEzRjgsIDB4MTEzRkN9LAorCXsweDExNDM4LCAweDExNDQwfSwKKwl7MHgxMTQ3OCwgMHgxMTQ4MH0sCisJezB4MTE0QjgsIDB4MTE0QkN9LAorCXsweDExNEY4LCAweDExNEZDfSwKKwl7MHgxMTUzOCwgMHgxMTUzQ30sCisJezB4MTE1NzgsIDB4MTE1N0N9LAorCXsweDExNUI4LCAweDExNUJDfSwKKwl7MHgxMTVGOCwgMHgxMTVGQ30sCisJezB4MTE2MzgsIDB4MTE2M0N9LAorCXsweDExNjc4LCAweDExNjdDfSwKKwl7MHgxMTZCOCwgMHgxMTZCQ30sCisJezB4MTE2RjgsIDB4MTE2RkN9LAorCXsweDExNzM4LCAweDExNzNDfSwKKwl7MHgxMTc3OCwgMHgxMTc3Q30sCisJezB4MTE3QjgsIDB4MTE3QkN9LAorCXsweDExN0Y4LCAweDExN0ZDfSwKKwl7MHgxNzAwMCwgMHgxNzAxQ30sCisJezB4MTcwMjAsIDB4MTcwQUN9LAorCXsweDE4MDAwLCAweDE4MDUwfSwKKwl7MHgxODA1NCwgMHgxODA3NH0sCisJezB4MTgwODAsIDB4MTgwRDR9LAorCXsweDE4MERDLCAweDE4MTA0fSwKKwl7MHgxODEwOCwgMHgxODEzQ30sCisJezB4MTgxNDQsIDB4MTgxNDh9LAorCXsweDE4MTY4LCAweDE4MTc0fSwKKwl7MHgxODE3OCwgMHgxODE4MH0sCisJezB4MTgxQzgsIDB4MTgxRTB9LAorCXsweDE4MUU0LCAweDE4MUU4fSwKKwl7MHgxODFFQywgMHgxODIwQ30sCisJezB4MTgyNUMsIDB4MTgyODB9LAorCXsweDE4Mjg0LCAweDE4MjkwfSwKKwl7MHgxODI5NCwgMHgxODJBMH0sCisJezB4MTgzMDAsIDB4MTgzMDR9LAorCXsweDE4MzE0LCAweDE4MzIwfSwKKwl7MHgxODMyOCwgMHgxODM1MH0sCisJezB4MTgzNUMsIDB4MTgzNkN9LAorCXsweDE4MzcwLCAweDE4MzkwfSwKKwl7MHgxODM5OCwgMHgxODNBQ30sCisJezB4MTgzQkMsIDB4MTgzRDh9LAorCXsweDE4M0RDLCAweDE4M0Y0fSwKKwl7MHgxODQwMCwgMHgxODZGNH0sCisJezB4MTg2RjgsIDB4MTg3MUN9LAorCXsweDE4NzIwLCAweDE4NzkwfSwKKwl7MHgxOTgwMCwgMHgxOTgzMH0sCisJezB4MTk4MzQsIDB4MTk4NDB9LAorCXsweDE5ODgwLCAweDE5ODlDfSwKKwl7MHgxOThBNCwgMHgxOThCMH0sCisJezB4MTk4QkMsIDB4MTk5MDB9LAorCXsweDE5QzAwLCAweDE5Qzg4fSwKKwl7MHgxOUQwMCwgMHgxOUQyMH0sCisJezB4MTlFMDAsIDB4MTlFN0N9LAorCXsweDE5RTgwLCAweDE5RTk0fSwKKwl7MHgxOUU5OCwgMHgxOUVBQ30sCisJezB4MTlFQjAsIDB4MTlFQkN9LAorCXsweDE5RjcwLCAweDE5Rjc0fSwKKwl7MHgxOUY4MCwgMHgxOUY4Q30sCisJezB4MTlGQTAsIDB4MTlGQjR9LAorCXsweDE5RkMwLCAweDE5RkQ4fSwKKwl7MHgxQTAwMCwgMHgxQTIwMH0sCisJezB4MUEyMDQsIDB4MUEyMTB9LAorCXsweDFBMjI4LCAweDFBMjJDfSwKKwl7MHgxQTIzMCwgMHgxQTI0OH0sCisJezB4MUEyNTAsIDB4MUEyNzB9LAorCXsweDFBMjgwLCAweDFBMjkwfSwKKwl7MHgxQTJBMCwgMHgxQTJBNH0sCisJezB4MUEyQzAsIDB4MUEyRUN9LAorCXsweDFBMzAwLCAweDFBM0JDfSwKKwl7MHgxQTNGMCwgMHgxQTNGNH0sCisJezB4MUEzRjgsIDB4MUE0MzR9LAorCXsweDFBNDM4LCAweDFBNDQ0fSwKKwl7MHgxQTQ0OCwgMHgxQTQ2OH0sCisJezB4MUE1ODAsIDB4MUE1OEN9LAorCXsweDFBNjQ0LCAweDFBNjU0fSwKKwl7MHgxQTY3MCwgMHgxQTY5OH0sCisJezB4MUE2QUMsIDB4MUE2QjB9LAorCXsweDFBNkQwLCAweDFBNkQ0fSwKKwl7MHgxQTZFQywgMHgxQTcwQ30sCisJezB4MUE3MTAsIDB4MUE3Mzh9LAorCXsweDFBN0MwLCAweDFBN0QwfSwKKwl7MHgxQTdENCwgMHgxQTdEOH0sCisJezB4MUE3REMsIDB4MUE3RTR9LAorCXsweDFBN0YwLCAweDFBN0Y4fSwKKwl7MHgxQTg4OCwgMHgxQTg5Q30sCisJezB4MUE4QTgsIDB4MUE4QUN9LAorCXsweDFBOEMwLCAweDFBOERDfSwKKwl7MHgxQThGMCwgMHgxQThGQ30sCisJezB4MUFFMDQsIDB4MUFFMDh9LAorCXsweDFBRTE4LCAweDFBRTI0fSwKKwl7MHgxQUY4MCwgMHgxQUY4Q30sCisJezB4MUFGQTAsIDB4MUFGQjR9LAorCXsweDFCMDAwLCAweDFCMjAwfSwKKwl7MHgxQjI4NCwgMHgxQjI4OH0sCisJezB4MUIyRDAsIDB4MUIyRDh9LAorCXsweDFCMkRDLCAweDFCMkVDfSwKKwl7MHgxQjMwMCwgMHgxQjM0MH0sCisJezB4MUIzNzQsIDB4MUIzNzh9LAorCXsweDFCMzgwLCAweDFCMzg0fSwKKwl7MHgxQjM4OCwgMHgxQjM4Q30sCisJezB4MUI0MDQsIDB4MUI0MDh9LAorCXsweDFCNDIwLCAweDFCNDI4fSwKKwl7MHgxQjQ0MCwgMHgxQjQ0NH0sCisJezB4MUI0NDgsIDB4MUI0NEN9LAorCXsweDFCNDUwLCAweDFCNDU4fSwKKwl7MHgxQjQ1QywgMHgxQjQ2OH0sCisJezB4MUI1ODQsIDB4MUI1OEN9LAorCXsweDFCNjhDLCAweDFCNjkwfSwKKwl7MHgxQjZBQywgMHgxQjZCMH0sCisJezB4MUI3RjAsIDB4MUI3Rjh9LAorCXsweDFDODAwLCAweDFDQzAwfSwKKwl7MHgxQ0UwMCwgMHgxQ0UwNH0sCisJezB4MUNGODAsIDB4MUNGODR9LAorCXsweDFEMjAwLCAweDFEODAwfSwKKwl7MHgxRTAwMCwgMHgyMDAxNH0sCisJezB4MjAxMDAsIDB4MjAxMjR9LAorCXsweDIxNDAwLCAweDIxN0E4fSwKKwl7MHgyMTgwMCwgMHgyMUJBOH0sCisJezB4MjFDMDAsIDB4MjFGQTh9LAorCXsweDIyMDAwLCAweDIyM0E4fSwKKwl7MHgyMjQwMCwgMHgyMjdBOH0sCisJezB4MjI4MDAsIDB4MjJCQTh9LAorCXsweDIyQzAwLCAweDIyRkE4fSwKKwl7MHgyMzAwMCwgMHgyMzNBOH0sCisJezB4MjQwMDAsIDB4MjQwMzR9LAorCisJLyoKKwkgKiBFRlVTRTAsMSwyIGlzIGRpc2FibGVkIGhlcmUKKwkgKiBiZWNhdXNlIGl0J3Mgc3RhdGUgbWF5IGJlIHJlc2V0CisJICoKKwkgKiB7MHgyNDgwMCwgMHgyNDgwNH0sCisJICogezB4MjUwMDAsIDB4MjUwMDR9LAorCSAqIHsweDI1ODAwLCAweDI1ODA0fSwKKwkgKi8KKworCXsweDI2MDAwLCAweDI2MDY0fSwKKwl7MHgyNzAwMCwgMHgyNzAyNH0sCisJezB4MzQwMDAsIDB4MzQwMEN9LAorCXsweDM0NDAwLCAweDM0NDVDfSwKKwl7MHgzNDgwMCwgMHgzNDg1Q30sCisJezB4MzRDMDAsIDB4MzRDNUN9LAorCXsweDM1MDAwLCAweDM1MDVDfSwKKwl7MHgzNTQwMCwgMHgzNTQ1Q30sCisJezB4MzU4MDAsIDB4MzU4NUN9LAorCXsweDM1QzAwLCAweDM1QzVDfSwKKwl7MHgzNjAwMCwgMHgzNjA1Q30sCisJezB4MzgwMDAsIDB4MzgwNjR9LAorCXsweDM4MDcwLCAweDM4MEUwfSwKKwl7MHgzQTAwMCwgMHgzQTA3NH0sCisKKwkvKgorCSAqIERCSSB3aW5kb3dzIGlzIHNraXBwZWQgaGVyZSwgaXQgY2FuIGJlIG9ubHkgYWNjZXNzZWQgd2hlbiBwY2llCisJICogaXMgYWN0aXZlIChub3QgaW4gcmVzZXQpIGFuZCBDT1JFX0NUUkxfUENJRV9MVFNTTV9FTiA9IDAgJiYKKwkgKiBQQ0lFX0NUUkxfQVBQX0xUU1NNX0VOQUxCRT0wLgorCSAqIHsweDNDMDAwICwgMHgzQzAwNH0sCisJICovCisKKwl7MHg0MDAwMCwgMHg0MDBBNH0sCisKKwkvKgorCSAqIFNJIHJlZ2lzdGVyIGlzIHNraXBlZCBoZXJlLgorCSAqIEJlY2F1c2UgaXQgd2lsbCBjYXVzZSBidXMgaGFuZworCSAqCisJICogezB4NTAwMDAsIDB4NTAwMTh9LAorCSAqLworCisJezB4ODAwMDAsIDB4ODAwMEN9LAorCXsweDgwMDEwLCAweDgwMDIwfSwKK307CisjZW5kaWYKKyNlbmRpZiAvKiAjaWZuZGVmIF9BUjYzMjBWMl9EQkdfUkVHVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvYm1pL3NyYy9pX2JtaS5oIGIvY29yZS9ibWkvc3JjL2lfYm1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmMDk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvYm1pL3NyYy9pX2JtaS5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW50ZXJuYWwgQk1JIEhlYWRlciBGaWxlCisgKi8KKworI2lmbmRlZiBfSV9CTUlfSF8KKyNkZWZpbmUgX0lfQk1JX0hfCisKKyNpZmRlZiBDT05GSUdfQ05TUworI2luY2x1ZGUgPG5ldC9jbnNzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImhpZi5oIgorI2luY2x1ZGUgImJtaV9tc2cuaCIKKyNpbmNsdWRlICJibWkuaCIKKyNpbmNsdWRlICJvbF9mdy5oIgorCisjZGVmaW5lIFFDQV9GSVJNV0FSRV9GSUxFICAgICAgICAgICAgImF0aHdsYW4uYmluIgorI2RlZmluZSBRQ0FfVVRGX0ZJUk1XQVJFX0ZJTEUgICAgICAgICJ1dGYuYmluIgorI2RlZmluZSBRQ0FfQk9BUkRfREFUQV9GSUxFICAgICAgICAgICJmYWtlYm9hci5iaW4iCisjZGVmaW5lIFFDQV9PVFBfRklMRSAgICAgICAgICAgICAgICAgIm90cC5iaW4iCisjZGVmaW5lIFFDQV9TRVRVUF9GSUxFICAgICAgICAgICAgICAgImF0aHNldHVwLmJpbiIKKyNkZWZpbmUgUUNBX0ZJUk1XQVJFX0VQUElOR19GSUxFICAgICAiZXBwaW5nLmJpbiIKKy8qCisgKiBOb3RlIHRoYXQgbm90IGFsbCB0aGUgcmVnaXN0ZXIgbG9jYXRpb25zIGFyZSBhY2Nlc3NpYmxlLgorICogQSBsaXN0IG9mIGFjY2Vzc2libGUgdGFyZ2V0IHJlZ2lzdGVycyBhcmUgc3BlY2lmaWVkIHdpdGgKKyAqIHRoZWlyIHN0YXJ0IGFuZCBlbmQgYWRkcmVzc2VzIGluIGEgdGFibGUgZm9yIGdpdmVuIHRhcmdldAorICogdmVyc2lvbi4gV2Ugc2hvdWxkIE5PVCBhY2Nlc3Mgb3RoZXIgbG9jYXRpb25zIGFzIGVpdGhlcgorICogdGhleSBhcmUgaW52YWxpZCBsb2NhdGlvbnMgb3IgaG9zdCBkb2VzIG5vdCBoYXZlIHJlYWQKKyAqIGFjY2VzcyB0byBpdCBvciB0aGUgdmFsdWUgb2YgdGhlIHBhcnRpY3VsYXIgcmVnaXN0ZXIKKyAqIHJlYWQgbWlnaHQgY2hhbmdlCisgKi8KKyNkZWZpbmUgUkVHSVNURVJfTE9DQVRJT04gICAgICAgMHgwMDAwMDgwMAorCisjZGVmaW5lIERSQU1fTE9DQVRJT04gICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgRFJBTV9TSVpFICAgICAgICAgICAgICAgMHgwMDBhODAwMAorLyogVGhlIGxvY2FsIGJhc2UgYWRkciBpcyB1c2VkIHRvIHJlYWQgdGhlIHRhcmdldCBkdW1wIHVzaW5nIHBjaWUgSS9PIHJlYWRzICovCisjZGVmaW5lIERSQU1fTE9DQUxfQkFTRV9BRERSICAgICgweDEwMDAwMCkKKworI2RlZmluZSBJUkFNX0xPQ0FUSU9OICAgICAgICAgICAweDAwOTgwMDAwCisjZGVmaW5lIElSQU1fU0laRSAgICAgICAgICAgICAgIDB4MDAwMzgwMDAKKworI2RlZmluZSBBWElfTE9DQVRJT04gICAgICAgICAgICAweDAwMGEwMDAwCisjZGVmaW5lIEFYSV9TSVpFICAgICAgICAgICAgICAgIDB4MDAwMTgwMDAKKworI2RlZmluZSBDRV9PRkZTRVQgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIENFX1VTRUZVTF9TSVpFICAgICAgICAgIDB4MDAwMDAwNTgKKworI2RlZmluZSBUT1RBTF9EVU1QX1NJWkUgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFBDSUVfUkVBRF9MSU1JVCAgICAgICAgIDB4MDAwMDUwMDAKKworI2RlZmluZSBTSEEyNTZfRElHRVNUX1NJWkUgICAgICAzMgorCisvKiBCTUkgTE9HR0lORyBXUkFQUEVSUyAqLworCisjZGVmaW5lIEJNSV9MT0cobGV2ZWwsIGFyZ3MuLi4pIENERl9UUkFDRShDREZfTU9EVUxFX0lEX0JNSSwgXAorCQkJCQlsZXZlbCwgIyNhcmdzKQorI2RlZmluZSBCTUlfRVJSKGFyZ3MgLi4uKQlCTUlfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgYXJncykKKyNkZWZpbmUgQk1JX0RCRyhhcmdzIC4uLikJQk1JX0xPRyhDREZfVFJBQ0VfTEVWRUxfREVCVUcsIGFyZ3MpCisjZGVmaW5lIEJNSV9XQVJOKGFyZ3MgLi4uKQlCTUlfTE9HKENERl9UUkFDRV9MRVZFTF9XQVJOLCBhcmdzKQorI2RlZmluZSBCTUlfSU5GTyhhcmdzIC4uLikJQk1JX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgYXJncykKKy8qIEVuZCBvZiBCTUkgTG9nZ2luZyBXcmFwcGVycyAqLworCisvKiBCTUkgQXNzZXJ0IFdyYXBwZXJzICovCisjZGVmaW5lIGJtaV9hc3NlcnQgQ0RGX0JVRworLyoKKyAqIEFsdGhvdWdoIHdlIGhhZCBlbnZpc2lvbmVkIEJNSSB0byBydW4gb24gdG9wIG9mIEhUQywgdGhpcyBpcyBub3QgaG93IHRoZQorICogZmluYWwgaW1wbGVtZW50YXRpb24gZW5kZWQgdXAuIE9uIHRoZSBUYXJnZXQgc2lkZSwgQk1JIGlzIGEgcGFydCBvZiB0aGUgQlNQCisgKiBhbmQgZG9lcyBub3QgdXNlIHRoZSBIVEMgcHJvdG9jb2wgbm9yIGV2ZW4gRE1BIC0tIGl0IGlzIGludGVudGlvbmFsbHkga2VwdAorICogdmVyeSBzaW1wbGUuCisgKi8KKworI2RlZmluZSBNQVhfQk1JX0NNREJVRl9TWiAoQk1JX0RBVEFTWl9NQVggKyBcCisJCQlzaXplb2YodWludDMyX3QpIC8qIGNtZCAqLyArIFwKKwkJCXNpemVvZih1aW50MzJfdCkgLyogYWRkciAqLyArIFwKKwkJCXNpemVvZih1aW50MzJfdCkpICAgIC8qIGxlbmd0aCAqLworI2RlZmluZSBCTUlfQ09NTUFORF9GSVRTKHN6KSAoKHN6KSA8PSBNQVhfQk1JX0NNREJVRl9TWikKKyNkZWZpbmUgQk1JX0VYQ0hBTkdFX1RJTUVPVVRfTVMgIDEwMDAKKworc3RydWN0IGhhc2hfZncgeworCXU4IHF3bGFuW1NIQTI1Nl9ESUdFU1RfU0laRV07CisJdTggb3RwW1NIQTI1Nl9ESUdFU1RfU0laRV07CisJdTggYmR3bGFuW1NIQTI1Nl9ESUdFU1RfU0laRV07CisJdTggdXRmW1NIQTI1Nl9ESUdFU1RfU0laRV07Cit9OworCit0eXBlZGVmIGVudW0gX0FUSF9CSU5fRklMRSB7CisJQVRIX09UUF9GSUxFLAorCUFUSF9GSVJNV0FSRV9GSUxFLAorCUFUSF9QQVRDSF9GSUxFLAorCUFUSF9CT0FSRF9EQVRBX0ZJTEUsCisJQVRIX0ZMQVNIX0ZJTEUsCisJQVRIX1NFVFVQX0ZJTEUsCit9IEFUSF9CSU5fRklMRTsKKworI2lmIGRlZmluZWQoUUNBX1dJRklfM18wX0lIRUxJVU0pIHx8IGRlZmluZWQoUUNBX1dJRklfM18wX0FEUkFTVEVBKQorI2RlZmluZSBJSEVMSVVNX05PX0JNSSAxCisjZWxzZQorI2RlZmluZSBJSEVMSVVNX05PX0JNSSAwCisjZW5kaWYKKworQ0RGX1NUQVRVUyBibWlfZXhlY3V0ZSh1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJfdCAqcGFyYW0sCisJCQkJCQlzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CitDREZfU1RBVFVTIGJtaV9pbml0KHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK0NERl9TVEFUVVMgYm1pX25vX2NvbW1hbmQoc3RydWN0IG9sX3NvZnRjICpzY24pOworQ0RGX1NUQVRVUyBibWlfcmVhZF9tZW1vcnkodWludDMyX3QgYWRkcmVzcywKKwkJdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgsIHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK0NERl9TVEFUVVMgYm1pX3dyaXRlX21lbW9yeSh1aW50MzJfdCBhZGRyZXNzLAorCQl1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCwgc3RydWN0IG9sX3NvZnRjICpzY24pOworQ0RGX1NUQVRVUyBibWlfZmFzdF9kb3dubG9hZCh1aW50MzJfdCBhZGRyZXNzLAorCQl1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCwgc3RydWN0IG9sX3NvZnRjICpzY24pOworQ0RGX1NUQVRVUyBibWlfcmVhZF9zb2NfcmVnaXN0ZXIodWludDMyX3QgYWRkcmVzcywKKwkJCQl1aW50MzJfdCAqcGFyYW0sIHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK0NERl9TVEFUVVMgYm1pX3dyaXRlX3NvY19yZWdpc3Rlcih1aW50MzJfdCBhZGRyZXNzLAorCQkJCXVpbnQzMl90IHBhcmFtLCBzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CitDREZfU1RBVFVTIGJtaV9nZXRfdGFyZ2V0X2luZm8oCisJCXN0cnVjdCBibWlfdGFyZ2V0X2luZm8gKnRhcmdfaW5mbywgc3RydWN0IG9sX3NvZnRjICpzY24pOworCitDREZfU1RBVFVTIGJtaV9maXJtd2FyZV9kb3dubG9hZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CitDREZfU1RBVFVTIGJtaV9kb25lX2xvY2FsKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKKworQ0RGX1NUQVRVUyBvbF9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CitDREZfU1RBVFVTIG9sX2NvbmZpZ3VyZV90YXJnZXQoc3RydWN0IG9sX3NvZnRjICpzY24pOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2JtaS9zcmMvb2xfZncuYyBiL2NvcmUvYm1pL3NyYy9vbF9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDg4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2JtaS9zcmMvb2xfZncuYwpAQCAtMCwwICsxLDE2MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgIm9sX2lmX2F0aHZhci5oIgorI2luY2x1ZGUgInRhcmdhZGRycy5oIgorI2luY2x1ZGUgIm9sX2NmZy5oIgorI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJ3bWFfYXBpLmgiCisjaW5jbHVkZSAid21hLmgiCisjaW5jbHVkZSAiYmluX3NpZy5oIgorI2luY2x1ZGUgImlfYXI2MzIwdjJfcmVndGFibGUuaCIKKyNpbmNsdWRlICJlcHBpbmdfbWFpbi5oIgorI2luY2x1ZGUgImNlX3JlZy5oIgorI2lmICBkZWZpbmVkKENPTkZJR19DTlNTKQorI2luY2x1ZGUgPG5ldC9jbnNzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImlfYm1pLmgiCisjaW5jbHVkZSAicXdsYW5fdmVyc2lvbi5oIgorCisjaWZkZWYgRkVBVFVSRV9TRUNVUkVfRklSTVdBUkUKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9mdyBmd19oYXNoOworI2VuZGlmCisKK3N0YXRpYyB1aW50MzJfdCByZWZjbGtfc3BlZWRfdG9faHpbXSA9IHsKKwk0ODAwMDAwMCwgICAgICAgICAgICAgICAvKiBTT0NfUkVGQ0xLXzQ4X01IWiAqLworCTE5MjAwMDAwLCAgICAgICAgICAgICAgIC8qIFNPQ19SRUZDTEtfMTlfMl9NSFogKi8KKwkyNDAwMDAwMCwgICAgICAgICAgICAgICAvKiBTT0NfUkVGQ0xLXzI0X01IWiAqLworCTI2MDAwMDAwLCAgICAgICAgICAgICAgIC8qIFNPQ19SRUZDTEtfMjZfTUhaICovCisJMzc0MDAwMDAsICAgICAgICAgICAgICAgLyogU09DX1JFRkNMS18zN180X01IWiAqLworCTM4NDAwMDAwLCAgICAgICAgICAgICAgIC8qIFNPQ19SRUZDTEtfMzhfNF9NSFogKi8KKwk0MDAwMDAwMCwgICAgICAgICAgICAgICAvKiBTT0NfUkVGQ0xLXzQwX01IWiAqLworCTUyMDAwMDAwLCAgICAgICAgICAgICAgIC8qIFNPQ19SRUZDTEtfNTJfTUhaICovCit9OworCitzdGF0aWMgaW50IG9sX3RhcmdldF9jb3JlZHVtcCh2b2lkICppbnN0LCB2b2lkICptZW1vcnlfYmxvY2ssCisJCQkJCXVpbnQzMl90IGJsb2NrX2xlbik7CisjaWZkZWYgRkVBVFVSRV9TRUNVUkVfRklSTVdBUkUKK3N0YXRpYyBpbnQgb2xfY2hlY2tfZndfaGFzaChjb25zdCB1OCAqZGF0YSwgdTMyIGZ3X3NpemUsIEFUSF9CSU5fRklMRSBmaWxlKQoreworCXU4ICpoYXNoID0gTlVMTDsKKyNpZmRlZiBDT05GSUdfQ05TUworCXU4ICpmd19tZW0gPSBOVUxMOworCXU4IGRpZ2VzdFtTSEEyNTZfRElHRVNUX1NJWkVdOworI2VuZGlmCisJdTggdGVtcFtTSEEyNTZfRElHRVNUX1NJWkVdID0geyB9OworCWludCByZXQgPSAwOworCisJc3dpdGNoIChmaWxlKSB7CisJY2FzZSBBVEhfQk9BUkRfREFUQV9GSUxFOgorCQloYXNoID0gZndfaGFzaC5iZHdsYW47CisJCWJyZWFrOworCWNhc2UgQVRIX09UUF9GSUxFOgorCQloYXNoID0gZndfaGFzaC5vdHA7CisJCWJyZWFrOworCWNhc2UgQVRIX0ZJUk1XQVJFX0ZJTEU6CisjaWZkZWYgUUNBX1dJRklfRlRNCisJCWlmIChjZHNfZ2V0X2NvbnBhcmFtKCkgPT0gQ0RGX0ZUTV9NT0RFKSB7CisJCQloYXNoID0gZndfaGFzaC51dGY7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWhhc2ggPSBmd19oYXNoLnF3bGFuOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmICghaGFzaCkgeworCQlCTUlfSU5GTygiTm8gZW50cnkgZm9yIGZpbGU6JWQgRG93bmxvYWQgRlcgaW4gbm9uLXNlY3VyZSBtb2RlIiwKKwkJCQkJCQkJCWZpbGUpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoIWNkZl9tZW1fY29tcGFyZShoYXNoLCB0ZW1wLCBTSEEyNTZfRElHRVNUX1NJWkUpKSB7CisJCUJNSV9JTkZPKCJEb3dubG9hZCBGVyBpbiBub24tc2VjdXJlIG1vZGU6JWQiLCBmaWxlKTsKKwkJZ290byBlbmQ7CisJfQorCisjaWZkZWYgQ09ORklHX0NOU1MKKwlmd19tZW0gPSAodTggKiljbnNzX2dldF9md19wdHIoKTsKKwlpZiAoIWZ3X21lbSB8fCAoZndfc2l6ZSA+IE1BWF9GSVJNV0FSRV9TSVpFKSkgeworCQlCTUlfRVJSKCJObyBNZW1vcnkgdG8gY29weSBGVyBkYXRhIik7CisJCXJldCA9IC0xOworCQlnb3RvIGVuZDsKKwl9CisJY2RmX21lbV9jb3B5KGZ3X21lbSwgZGF0YSwgZndfc2l6ZSk7CisKKwlyZXQgPSBjbnNzX2dldF9zaGFfaGFzaChmd19tZW0sIGZ3X3NpemUsICJzaGEyNTYiLCBkaWdlc3QpOworCisJaWYgKHJldCkgeworCQlCTUlfRVJSKCJTaGEyNTYgSGFzaCBjb21wdXRhdGlvbiBmYWlsZWQgZXJyOiVkIiwgcmV0KTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKGNkZl9tZW1fY29tcGFyZShoYXNoLCBkaWdlc3QsIFNIQTI1Nl9ESUdFU1RfU0laRSkgIT0gMCkgeworCQlCTUlfRVJSKCJIYXNoIE1pc21hdGNoIik7CisJCWNkZl90cmFjZV9oZXhfZHVtcChDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCSAgIGRpZ2VzdCwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKKwkJY2RmX3RyYWNlX2hleF9kdW1wKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkJICAgaGFzaCwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKKwkJcmV0ID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorI2VuZGlmCitlbmQ6CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9fb2xfdHJhbnNmZXJfYmluX2ZpbGUoc3RydWN0IG9sX3NvZnRjICpzY24sIEFUSF9CSU5fRklMRSBmaWxlLAorCQkJCSAgdWludDMyX3QgYWRkcmVzcywgYm9vbCBjb21wcmVzc2VkKQoreworCWludCBzdGF0dXMgPSBFT0s7CisJY29uc3QgY2hhciAqZmlsZW5hbWUgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7CisJdWludDMyX3QgZndfZW50cnlfc2l6ZTsKKwl1aW50OF90ICp0ZW1wX2VlcHJvbTsKKwl1aW50MzJfdCBib2FyZF9kYXRhX3NpemU7CisjaWZkZWYgUUNBX1NJR05FRF9TUExJVF9CSU5BUllfU1VQUE9SVAorCWJvb2wgYmluX3NpZ24gPSBmYWxzZTsKKwlpbnQgYmluX29mZiwgYmluX2xlbjsKKwlTSUdOX0hFQURFUl9UICpzaWduX2hlYWRlcjsKKyNlbmRpZgorCisJc3dpdGNoIChmaWxlKSB7CisJZGVmYXVsdDoKKwkJQk1JX0VSUigiJXM6IFVua25vd24gZmlsZSB0eXBlIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJY2FzZSBBVEhfT1RQX0ZJTEU6CisjaWYgZGVmaW5lZChDT05GSUdfQ05TUykKKwkJZmlsZW5hbWUgPSBzY24tPmZ3X2ZpbGVzLm90cF9kYXRhOworI2Vsc2UKKwkJZmlsZW5hbWUgPSBRQ0FfT1RQX0ZJTEU7CisjZW5kaWYKKyNpZmRlZiBRQ0FfU0lHTkVEX1NQTElUX0JJTkFSWV9TVVBQT1JUCisJCWJpbl9zaWduID0gdHJ1ZTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEFUSF9GSVJNV0FSRV9GSUxFOgorCQlpZiAoV0xBTl9JU19FUFBJTkdfRU5BQkxFRChjZHNfZ2V0X2NvbnBhcmFtKCkpKSB7CisjaWYgZGVmaW5lZChDT05GSUdfQ05TUykKKwkJCWZpbGVuYW1lID0gc2NuLT5md19maWxlcy5lcHBpbmdfZmlsZTsKKyNlbHNlCisJCQlmaWxlbmFtZSA9IFFDQV9GSVJNV0FSRV9FUFBJTkdfRklMRTsKKyNlbmRpZgorCQkJQk1JX0lORk8oIiVzOiBMb2FkaW5nIGVwcGluZyBmaXJtd2FyZSBmaWxlICVzIiwKKwkJCQkJCV9fZnVuY19fLCBmaWxlbmFtZSk7CisJCQlicmVhazsKKwkJfQorI2lmZGVmIFFDQV9XSUZJX0ZUTQorCQlpZiAoY2RzX2dldF9jb25wYXJhbSgpID09IENERl9GVE1fTU9ERSkgeworI2lmIGRlZmluZWQoQ09ORklHX0NOU1MpCisJCQlmaWxlbmFtZSA9IHNjbi0+ZndfZmlsZXMudXRmX2ZpbGU7CisjZWxzZQorCQkJZmlsZW5hbWUgPSBRQ0FfVVRGX0ZJUk1XQVJFX0ZJTEU7CisjZW5kaWYKKyNpZmRlZiBRQ0FfU0lHTkVEX1NQTElUX0JJTkFSWV9TVVBQT1JUCisJCQliaW5fc2lnbiA9IHRydWU7CisjZW5kaWYKKwkJCUJNSV9JTkZPKCIlczogTG9hZGluZyBmaXJtd2FyZSBmaWxlICVzIiwKKwkJCQkJCV9fZnVuY19fLCBmaWxlbmFtZSk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ05TUykKKwkJZmlsZW5hbWUgPSBzY24tPmZ3X2ZpbGVzLmltYWdlX2ZpbGU7CisjZWxzZQorCQlmaWxlbmFtZSA9IFFDQV9GSVJNV0FSRV9GSUxFOworI2VuZGlmCisjaWZkZWYgUUNBX1NJR05FRF9TUExJVF9CSU5BUllfU1VQUE9SVAorCQliaW5fc2lnbiA9IHRydWU7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBBVEhfUEFUQ0hfRklMRToKKwkJQk1JX0lORk8oIiVzOiBubyBQYXRjaCBmaWxlIGRlZmluZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCWNhc2UgQVRIX0JPQVJEX0RBVEFfRklMRToKKyNpZmRlZiBRQ0FfV0lGSV9GVE0KKwkJaWYgKGNkc19nZXRfY29ucGFyYW0oKSA9PSBDREZfRlRNX01PREUpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19DTlNTKQorCQkJZmlsZW5hbWUgPSBzY24tPmZ3X2ZpbGVzLnV0Zl9ib2FyZF9kYXRhOworI2Vsc2UKKwkJCWZpbGVuYW1lID0gUUNBX0JPQVJEX0RBVEFfRklMRTsKKyNlbmRpZgorI2lmZGVmIFFDQV9TSUdORURfU1BMSVRfQklOQVJZX1NVUFBPUlQKKwkJCWJpbl9zaWduID0gdHJ1ZTsKKyNlbmRpZgorCQkJQk1JX0lORk8oIiVzOiBMb2FkaW5nIGJvYXJkIGRhdGEgZmlsZSAlcyIsCisJCQkJCQlfX2Z1bmNfXywgZmlsZW5hbWUpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvKiBRQ0FfV0lGSV9GVE0gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTlNTKQorCQlmaWxlbmFtZSA9IHNjbi0+ZndfZmlsZXMuYm9hcmRfZGF0YTsKKyNlbHNlCisJCWZpbGVuYW1lID0gUUNBX0JPQVJEX0RBVEFfRklMRTsKKyNlbmRpZgorI2lmZGVmIFFDQV9TSUdORURfU1BMSVRfQklOQVJZX1NVUFBPUlQKKwkJYmluX3NpZ24gPSBmYWxzZTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEFUSF9TRVRVUF9GSUxFOgorCQlpZiAoY2RzX2dldF9jb25wYXJhbSgpICE9IENERl9GVE1fTU9ERSAmJgorCQkgICAgIVdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoY2RzX2dldF9jb25wYXJhbSgpKSkgeworI2lmZGVmIENPTkZJR19DTlNTCisJCQlCTUlfSU5GTygiJXM6IG5vIFNldHVwIGZpbGUgZGVmaW5lZCIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKyNlbHNlCisJCQlmaWxlbmFtZSA9IFFDQV9TRVRVUF9GSUxFOworI2lmZGVmIFFDQV9TSUdORURfU1BMSVRfQklOQVJZX1NVUFBPUlQKKwkJCWJpbl9zaWduID0gdHJ1ZTsKKyNlbmRpZgorCQkJQk1JX0lORk8oIiVzOiBMb2FkaW5nIHNldHVwIGZpbGUgJXMiLAorCQkJICAgICAgIF9fZnVuY19fLCBmaWxlbmFtZSk7CisjZW5kaWYgLyogQ09ORklHX0NOU1MgKi8KKwkJfSBlbHNlIHsKKwkJCUJNSV9JTkZPKCIlczogbm8gU2V0dXAgZmlsZSBuZWVkZWQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBmaWxlbmFtZSwgc2NuLT5hcHNfb3NkZXYuZGV2aWNlKSAhPSAwKSB7CisJCUJNSV9FUlIoIiVzOiBGYWlsZWQgdG8gZ2V0ICVzIiwgX19mdW5jX18sIGZpbGVuYW1lKTsKKworCQlpZiAoZmlsZSA9PSBBVEhfT1RQX0ZJTEUpCisJCQlyZXR1cm4gLUVOT0VOVDsKKworI2lmIGRlZmluZWQoUUNBX1dJRklfRlRNKSAmJiBkZWZpbmVkKENPTkZJR19DTlNTKQorCQkvKiBUcnkgZGVmYXVsdCBib2FyZCBkYXRhIGZpbGUgaWYgRlRNIHNwZWNpZmljCisJCSAqIGJvYXJkIGRhdGEgZmlsZSBpcyBub3QgcHJlc2VudC4gKi8KKwkJaWYgKGZpbGVuYW1lID09IHNjbi0+ZndfZmlsZXMudXRmX2JvYXJkX2RhdGEpIHsKKwkJCWZpbGVuYW1lID0gc2NuLT5md19maWxlcy5ib2FyZF9kYXRhOworCQkJQk1JX0lORk8oIiVzOiBUcnlpbmcgdG8gbG9hZCBkZWZhdWx0ICVzIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgZmlsZW5hbWUpOworCQkJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBmaWxlbmFtZSwKKwkJCQkJICAgICBzY24tPmFwc19vc2Rldi5kZXZpY2UpICE9IDApIHsKKwkJCQlCTUlfRVJSKCIlczogRmFpbGVkIHRvIGdldCAlcyIsCisJCQkJICAgICAgIF9fZnVuY19fLCBmaWxlbmFtZSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIC0xOworCQl9CisjZWxzZQorCQlyZXR1cm4gLTE7CisjZW5kaWYKKwl9CisKKwlpZiAoIWZ3X2VudHJ5IHx8ICFmd19lbnRyeS0+ZGF0YSkgeworCQlCTUlfRVJSKCJJbnZhbGlkIGZ3X2VudHJpZXMiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWZ3X2VudHJ5X3NpemUgPSBmd19lbnRyeS0+c2l6ZTsKKwl0ZW1wX2VlcHJvbSA9IE5VTEw7CisKKyNpZmRlZiBGRUFUVVJFX1NFQ1VSRV9GSVJNV0FSRQorCisJaWYgKG9sX2NoZWNrX2Z3X2hhc2goZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5X3NpemUsIGZpbGUpKSB7CisJCUJNSV9FUlIoIkhhc2ggQ2hlY2sgZmFpbGVkIGZvciBmaWxlOiVzIiwgZmlsZW5hbWUpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlbmQ7CisJfQorI2VuZGlmCisKKwlpZiAoZmlsZSA9PSBBVEhfQk9BUkRfREFUQV9GSUxFKSB7CisJCXVpbnQzMl90IGJvYXJkX2V4dF9hZGRyZXNzOworCQlpbnQzMl90IGJvYXJkX2V4dF9kYXRhX3NpemU7CisKKwkJdGVtcF9lZXByb20gPSBjZGZfbWVtX21hbGxvYyhmd19lbnRyeV9zaXplKTsKKwkJaWYgKCF0ZW1wX2VlcHJvbSkgeworCQkJQk1JX0VSUigiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCisJCWNkZl9tZW1fY29weSh0ZW1wX2VlcHJvbSwgKHVpbnQ4X3QgKikgZndfZW50cnktPmRhdGEsCisJCQkgIGZ3X2VudHJ5X3NpemUpOworCisJCXN3aXRjaCAoc2NuLT50YXJnZXRfdHlwZSkgeworCQlkZWZhdWx0OgorCQkJYm9hcmRfZGF0YV9zaXplID0gMDsKKwkJCWJvYXJkX2V4dF9kYXRhX3NpemUgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgVEFSR0VUX1RZUEVfQVI2MDA0OgorCQkJYm9hcmRfZGF0YV9zaXplID0gQVI2MDA0X0JPQVJEX0RBVEFfU1o7CisJCQlib2FyZF9leHRfZGF0YV9zaXplID0gQVI2MDA0X0JPQVJEX0VYVF9EQVRBX1NaOworCQljYXNlIFRBUkdFVF9UWVBFX0FSOTg4ODoKKwkJCWJvYXJkX2RhdGFfc2l6ZSA9IEFSOTg4OF9CT0FSRF9EQVRBX1NaOworCQkJYm9hcmRfZXh0X2RhdGFfc2l6ZSA9IEFSOTg4OF9CT0FSRF9FWFRfREFUQV9TWjsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogRGV0ZXJtaW5lIHdoZXJlIGluIFRhcmdldCBSQU0gdG8gd3JpdGUgQm9hcmQgRGF0YSAqLworCQlibWlfcmVhZF9tZW1vcnkoSE9TVF9JTlRFUkVTVF9JVEVNX0FERFJFU1Moc2NuLT50YXJnZXRfdHlwZSwKKwkJCQkJCQkgICBoaV9ib2FyZF9leHRfZGF0YSksCisJCQkJKHVpbnQ4X3QgKikgJmJvYXJkX2V4dF9hZGRyZXNzLCA0LCBzY24pOworCQlCTUlfSU5GTygiQm9hcmQgZXh0ZW5kZWQgRGF0YSBkb3dubG9hZCBhZGRyZXNzOiAweCV4IiwKKwkJICAgICAgIGJvYXJkX2V4dF9hZGRyZXNzKTsKKworCQkvKiBDaGVjayB3aGV0aGVyIHRoZSB0YXJnZXQgaGFzIGFsbG9jYXRlZCBtZW1vcnkgZm9yIGV4dGVuZGVkCisJCSAqIGJvYXJkIGRhdGEgYW5kIGZpbGUgY29udGFpbnMgZXh0ZW5kZWQgYm9hcmQgZGF0YQorCQkgKi8KKworCQlpZiAoKGJvYXJkX2V4dF9hZGRyZXNzKQorCQkgICAgJiYgKGZ3X2VudHJ5X3NpemUgPT0KKwkJCShib2FyZF9kYXRhX3NpemUgKyBib2FyZF9leHRfZGF0YV9zaXplKSkpIHsKKwkJCXVpbnQzMl90IHBhcmFtOworCisJCQlzdGF0dXMgPSBibWlfd3JpdGVfbWVtb3J5KGJvYXJkX2V4dF9hZGRyZXNzLAorCQkJCQkodWludDhfdCAqKSh0ZW1wX2VlcHJvbSArCisJCQkJCWJvYXJkX2RhdGFfc2l6ZSksCisJCQkJCWJvYXJkX2V4dF9kYXRhX3NpemUsIHNjbik7CisKKwkJCWlmIChzdGF0dXMgIT0gRU9LKQorCQkJCWdvdG8gZW5kOworCisJCQkvKiBSZWNvcmQgZXh0ZW5kZWQgYm9hcmQgRGF0YSBpbml0aWFsaXplZCAqLworCQkJcGFyYW0gPSAoYm9hcmRfZXh0X2RhdGFfc2l6ZSA8PCAxNikgfCAxOworCQkJYm1pX3dyaXRlX21lbW9yeSgKKwkJCQlIT1NUX0lOVEVSRVNUX0lURU1fQUREUkVTUyhzY24tPnRhcmdldF90eXBlLAorCQkJCQloaV9ib2FyZF9leHRfZGF0YV9jb25maWcpLAorCQkJCQkodWludDhfdCAqKSZwYXJhbSwgNCwgc2NuKTsKKworCQkJZndfZW50cnlfc2l6ZSA9IGJvYXJkX2RhdGFfc2l6ZTsKKwkJfQorCX0KKyNpZmRlZiBRQ0FfU0lHTkVEX1NQTElUX0JJTkFSWV9TVVBQT1JUCisJaWYgKGJpbl9zaWduKSB7CisJCXVpbnQzMl90IGNoaXBfaWQ7CisKKwkJaWYgKGZ3X2VudHJ5X3NpemUgPCBzaXplb2YoU0lHTl9IRUFERVJfVCkpIHsKKwkJCUJNSV9FUlIoIkludmFsaWQgYmluYXJ5IHNpemUgJWQiLCBmd19lbnRyeV9zaXplKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJZ290byBlbmQ7CisJCX0KKworCQlzaWduX2hlYWRlciA9IChTSUdOX0hFQURFUl9UICopIGZ3X2VudHJ5LT5kYXRhOworCQljaGlwX2lkID0gY3B1X3RvX2xlMzIoc2lnbl9oZWFkZXItPnByb2R1Y3RfaWQpOworCQlpZiAoc2lnbl9oZWFkZXItPm1hZ2ljX251bSA9PSBTSUdOX0hFQURFUl9NQUdJQworCQkgICAgJiYgKGNoaXBfaWQgPT0gQVI2MzIwX1JFVjFfMV9WRVJTSU9OCisJCQl8fCBjaGlwX2lkID09IEFSNjMyMF9SRVYxXzNfVkVSU0lPTgorCQkJfHwgY2hpcF9pZCA9PSBBUjYzMjBfUkVWMl8xX1ZFUlNJT04pKSB7CisKKwkJCXN0YXR1cyA9IGJtaV9zaWduX3N0cmVhbV9zdGFydChhZGRyZXNzLAorCQkJCQkJKHVpbnQ4X3QgKilmd19lbnRyeS0+ZGF0YSwKKwkJCQkJCXNpemVvZihTSUdOX0hFQURFUl9UKSwgc2NuKTsKKwkJCWlmIChzdGF0dXMgIT0gRU9LKSB7CisJCQkJQk1JX0VSUigidW5hYmxlIHRvIHN0YXJ0IHNpZ24gc3RyZWFtIik7CisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQkJZ290byBlbmQ7CisJCQl9CisKKwkJCWJpbl9vZmYgPSBzaXplb2YoU0lHTl9IRUFERVJfVCk7CisJCQliaW5fbGVuID0gc2lnbl9oZWFkZXItPnJhbXBhdGNoX2xlbgorCQkJCSAgLSBzaXplb2YoU0lHTl9IRUFERVJfVCk7CisJCX0gZWxzZSB7CisJCQliaW5fc2lnbiA9IGZhbHNlOworCQkJYmluX29mZiA9IDA7CisJCQliaW5fbGVuID0gZndfZW50cnlfc2l6ZTsKKwkJfQorCX0gZWxzZSB7CisJCWJpbl9sZW4gPSBmd19lbnRyeV9zaXplOworCQliaW5fb2ZmID0gMDsKKwl9CisKKwlpZiAoY29tcHJlc3NlZCkgeworCQlzdGF0dXMgPSBibWlfZmFzdF9kb3dubG9hZChhZGRyZXNzLAorCQkJCQkgICAodWludDhfdCAqKSBmd19lbnRyeS0+ZGF0YSArIGJpbl9vZmYsCisJCQkJCSAgIGJpbl9sZW4sIHNjbik7CisJfSBlbHNlIHsKKwkJaWYgKGZpbGUgPT0gQVRIX0JPQVJEX0RBVEFfRklMRSAmJiBmd19lbnRyeS0+ZGF0YSkgeworCQkJc3RhdHVzID0gYm1pX3dyaXRlX21lbW9yeShhZGRyZXNzLAorCQkJCQkJICAodWludDhfdCAqKSB0ZW1wX2VlcHJvbSwKKwkJCQkJCSAgZndfZW50cnlfc2l6ZSwgc2NuKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IGJtaV93cml0ZV9tZW1vcnkoYWRkcmVzcywKKwkJCQkJCSAgKHVpbnQ4X3QgKikgZndfZW50cnktPmRhdGEKKwkJCQkJCSAgKyBiaW5fb2ZmLCBiaW5fbGVuLCBzY24pOworCQl9CisJfQorCisJaWYgKGJpbl9zaWduKSB7CisJCWJpbl9vZmYgKz0gYmluX2xlbjsKKwkJYmluX2xlbiA9IHNpZ25faGVhZGVyLT50b3RhbF9sZW4gLSBzaWduX2hlYWRlci0+cmFtcGF0Y2hfbGVuOworCisJCWlmIChiaW5fbGVuID4gMCkgeworCQkJc3RhdHVzID0gYm1pX3NpZ25fc3RyZWFtX3N0YXJ0KDAsCisJCQkJCSh1aW50OF90ICopZndfZW50cnktPmRhdGEgKworCQkJCQliaW5fb2ZmLCBiaW5fbGVuLCBzY24pOworCQkJaWYgKHN0YXR1cyAhPSBFT0spCisJCQkJQk1JX0VSUigic2lnbiBzdHJlYW0gZXJyb3IiKTsKKwkJfQorCX0KKyNlbHNlCisJaWYgKGNvbXByZXNzZWQpIHsKKwkJc3RhdHVzID0gYm1pX2Zhc3RfZG93bmxvYWQoYWRkcmVzcywKKwkJCQkJICAgKHVpbnQ4X3QgKikgZndfZW50cnktPmRhdGEsCisJCQkJCSAgIGZ3X2VudHJ5X3NpemUsIHNjbik7CisJfSBlbHNlIHsKKwkJaWYgKGZpbGUgPT0gQVRIX0JPQVJEX0RBVEFfRklMRSAmJiBmd19lbnRyeS0+ZGF0YSkgeworCQkJc3RhdHVzID0gYm1pX3dyaXRlX21lbW9yeShhZGRyZXNzLAorCQkJCQkJICAodWludDhfdCAqKSB0ZW1wX2VlcHJvbSwKKwkJCQkJCSAgZndfZW50cnlfc2l6ZSwgc2NuKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IGJtaV93cml0ZV9tZW1vcnkoYWRkcmVzcywKKwkJCQkJCSAgKHVpbnQ4X3QgKikgZndfZW50cnktPmRhdGEsCisJCQkJCQkgIGZ3X2VudHJ5X3NpemUsIHNjbik7CisJCX0KKwl9CisjZW5kaWYgLyogUUNBX1NJR05FRF9TUExJVF9CSU5BUllfU1VQUE9SVCAqLworCitlbmQ6CisJaWYgKHRlbXBfZWVwcm9tKQorCQljZGZfbWVtX2ZyZWUodGVtcF9lZXByb20pOworCisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJQk1JX0VSUigiJXMsIEJNSSBvcGVyYXRpb24gZmFpbGVkOiAlZCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisKKwlCTUlfSU5GTygidHJhbnNmZXJyaW5nIGZpbGU6ICVzIHNpemUgJWQgYnl0ZXMgZG9uZSEiLAorCQkoZmlsZW5hbWUgIT0gTlVMTCkgPyBmaWxlbmFtZSA6ICIgIiwgZndfZW50cnlfc2l6ZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG9sX3RyYW5zZmVyX2Jpbl9maWxlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBBVEhfQklOX0ZJTEUgZmlsZSwKKwkJCQl1aW50MzJfdCBhZGRyZXNzLCBib29sIGNvbXByZXNzZWQpCit7CisJaW50IHJldDsKKworI2lmZGVmIENPTkZJR19DTlNTCisJLyogV2FpdCB1bnRpbCBzdXNwZW5kIGFuZCByZXN1bWUgYXJlIGNvbXBsZXRlZCBiZWZvcmUgbG9hZGluZyBGVyAqLworCWNuc3NfbG9ja19wbV9zZW0oKTsKKyNlbmRpZgorCisJcmV0ID0gX19vbF90cmFuc2Zlcl9iaW5fZmlsZShzY24sIGZpbGUsIGFkZHJlc3MsIGNvbXByZXNzZWQpOworCisjaWZkZWYgQ09ORklHX0NOU1MKKwljbnNzX3JlbGVhc2VfcG1fc2VtKCk7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBkdW1wX2NlX3JlZ2lzdGVyKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXVpbnQzMl90IGNlX3JlZ19hZGRyZXNzID0gQ0UwX0JBU0VfQUREUkVTUzsKKwl1aW50MzJfdCBjZV9yZWdfdmFsdWVzWzhdW0NFX1VTRUZVTF9TSVpFID4+IDJdOworCXVpbnQzMl90IGNlX3JlZ193b3JkX3NpemUgPSBDRV9VU0VGVUxfU0laRSA+PiAyOworCXVpbnQxNl90IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBjZV9yZWdfYWRkcmVzcyArPSBDRV9PRkZTRVQpIHsKKwkJaWYgKGhpZl9kaWFnX3JlYWRfbWVtKHNjbiwgY2VfcmVnX2FkZHJlc3MsCisJCQkodWludDhfdCAqKSAmY2VfcmVnX3ZhbHVlc1tpXVswXSwgY2VfcmVnX3dvcmRfc2l6ZSAqCisJCQlzaXplb2YodWludDMyX3QpKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJNSV9FUlIoIkR1bXBpbmcgQ0UgcmVnaXN0ZXIgZmFpbGVkISIpOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCUJNSV9FUlIoIkNFJWQgUmVnaXN0ZXJzOiIsIGkpOworCQlmb3IgKGogPSAwOyBqIDwgY2VfcmVnX3dvcmRfc2l6ZTsgaisrKSB7CisJCQlCTUlfRVJSKCIweCUwOHggIiwgY2VfcmVnX3ZhbHVlc1tpXVtqXSk7CisJCQlpZiAoISgoaiArIDEpICUgNSkgfHwgKGNlX3JlZ193b3JkX3NpemUgLSAxKSA9PSBqKQorCQkJCUJNSV9FUlIoIiAiKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjaWYgIGRlZmluZWQoQ09ORklHX0NOU1MpCisKK3N0YXRpYyBzdHJ1Y3Qgb2xfc29mdGMgKnJhbWR1bXBfc2NuOworCitpbnQgb2xfY29weV9yYW1kdW1wKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCWludCByZXQ7CisKKwlpZiAoIXNjbi0+cmFtZHVtcF9iYXNlIHx8ICFzY24tPnJhbWR1bXBfc2l6ZSkgeworCQlCTUlfRVJSKCIlczpyYW1kdW1wIGNvbGxlY3Rpb24gZmFpbCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVBQ0NFUzsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2xfdGFyZ2V0X2NvcmVkdW1wKHNjbiwgc2NuLT5yYW1kdW1wX2Jhc2UsIHNjbi0+cmFtZHVtcF9zaXplKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJhbWR1bXBfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqcmFtZHVtcCkKK3sKKwlpbnQgcmV0OworCXVpbnQzMl90IGhvc3RfaW50ZXJlc3RfYWRkcmVzczsKKwl1aW50MzJfdCBkcmFtX2R1bXBfdmFsdWVzWzRdOworCisJaWYgKCFyYW1kdW1wX3NjbikgeworCQlCTUlfRVJSKCIlczpSYW1kdW1wX3NjbiBpcyBudWxsOiIsIF9fZnVuY19fKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisjaWZkZWYgREVCVUcKKwlyZXQgPSBoaWZfY2hlY2tfc29jX3N0YXR1cyhyYW1kdW1wX3Njbik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZmFpbDsKKworCXJldCA9IGR1bXBfY2VfcmVnaXN0ZXIocmFtZHVtcF9zY24pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwlkdW1wX2NlX2RlYnVnX3JlZ2lzdGVyKHJhbWR1bXBfc2NuKTsKKyNlbmRpZgorCisJaWYgKGhpZl9kaWFnX3JlYWRfbWVtKHJhbWR1bXBfc2NuLAorCQkJaGlmX2hpYV9pdGVtX2FkZHJlc3MocmFtZHVtcF9zY24tPnRhcmdldF90eXBlLAorCQkJb2Zmc2V0b2Yoc3RydWN0IGhvc3RfaW50ZXJlc3RfcywgaGlfZmFpbHVyZV9zdGF0ZSkpLAorCQkJKHVpbnQ4X3QgKikmaG9zdF9pbnRlcmVzdF9hZGRyZXNzLAorCQkJc2l6ZW9mKHVpbnQzMl90KSkgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkhpZkRpYWdSZWFkaU1lbSBGVyBEdW1wIEFyZWEgUG9pbnRlciBmYWlsZWQhIik7CisJCW9sX2NvcHlfcmFtZHVtcChyYW1kdW1wX3Njbik7CisJCWNuc3NfZGV2aWNlX2NyYXNoZWQoKTsKKwkJcmV0dXJuOworCX0KKworCUJNSV9FUlIoIkhvc3QgaW50ZXJlc3QgaXRlbSBhZGRyZXNzOiAweCUwOHgiLCBob3N0X2ludGVyZXN0X2FkZHJlc3MpOworCisJaWYgKGhpZl9kaWFnX3JlYWRfbWVtKHJhbWR1bXBfc2NuLCBob3N0X2ludGVyZXN0X2FkZHJlc3MsCisJCQkgICAgICAodWludDhfdCAqKSAmZHJhbV9kdW1wX3ZhbHVlc1swXSwKKwkJCSAgICAgIDQgKiBzaXplb2YodWludDMyX3QpKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiSGlmRGlhZ1JlYWRpTWVtIEZXIER1bXAgQXJlYSBmYWlsZWQhIik7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCUJNSV9FUlIoIkZXIEFzc2VydGlvbiBhdCBQQzogMHglMDh4IEJhZFZBOiAweCUwOHggVGFyZ2V0SUQ6IDB4JTA4eCIsCisJICAgICAgIGRyYW1fZHVtcF92YWx1ZXNbMl0sIGRyYW1fZHVtcF92YWx1ZXNbM10sIGRyYW1fZHVtcF92YWx1ZXNbMF0pOworCisJaWYgKG9sX2NvcHlfcmFtZHVtcChyYW1kdW1wX3NjbikpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwlCTUlfRVJSKCIlczogUkFNIGR1bXAgY29sbGVjdGluZyBjb21wbGV0ZWQhIiwgX19mdW5jX18pOworCS8qIG5vdGlmeSBTU1IgZnJhbWV3b3JrIHRoZSB0YXJnZXQgaGFzIGNyYXNoZWQuICovCisJY25zc19kZXZpY2VfY3Jhc2hlZCgpOworCXJldHVybjsKKworb3V0X2ZhaWw6CisJLyogU2lsZW50IFNTUiBvbiBkdW1wIGZhaWx1cmUgKi8KKyNpZmRlZiBDTlNTX1NFTEZfUkVDT1ZFUlkKKwljbnNzX2RldmljZV9zZWxmX3JlY292ZXJ5KCk7CisjZWxzZQorCWNuc3NfZGV2aWNlX2NyYXNoZWQoKTsKKyNlbmRpZgorCXJldHVybjsKK30KKworc3RhdGljIERFQ0xBUkVfV09SSyhyYW1kdW1wX3dvcmssIHJhbWR1bXBfd29ya19oYW5kbGVyKTsKKwordm9pZCBvbF9zY2hlZHVsZV9yYW1kdW1wX3dvcmsoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJcmFtZHVtcF9zY24gPSBzY247CisJc2NoZWR1bGVfd29yaygmcmFtZHVtcF93b3JrKTsKK30KKworc3RhdGljIHZvaWQgZndfaW5kaWNhdGlvbl93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICpmd19pbmRpY2F0aW9uKQoreworCWNuc3NfZGV2aWNlX3NlbGZfcmVjb3ZlcnkoKTsKK30KKworc3RhdGljIERFQ0xBUkVfV09SSyhmd19pbmRpY2F0aW9uX3dvcmssIGZ3X2luZGljYXRpb25fd29ya19oYW5kbGVyKTsKKwordm9pZCBvbF9zY2hlZHVsZV9md19pbmRpY2F0aW9uX3dvcmsoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJc2NoZWR1bGVfd29yaygmZndfaW5kaWNhdGlvbl93b3JrKTsKK30KKyNlbmRpZgorCit2b2lkIG9sX3RhcmdldF9mYWlsdXJlKHZvaWQgKmluc3RhbmNlLCBDREZfU1RBVFVTIHN0YXR1cykKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IChzdHJ1Y3Qgb2xfc29mdGMgKilpbnN0YW5jZTsKKwl0cF93bWFfaGFuZGxlIHdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaW50IHJldDsKKworCWNkZl9ldmVudF9zZXQoJndtYS0+cmVjb3ZlcnlfZXZlbnQpOworCisJaWYgKE9MX1RSR0VUX1NUQVRVU19SRVNFVCA9PSBzY24tPnRhcmdldF9zdGF0dXMpIHsKKwkJQk1JX0VSUigiVGFyZ2V0IGlzIGFscmVhZHkgYXNzZXJ0ZWQsIGlnbm9yZSEiKTsKKwkJcmV0dXJuOworCX0KKwlzY24tPnRhcmdldF9zdGF0dXMgPSBPTF9UUkdFVF9TVEFUVVNfUkVTRVQ7CisKKwlpZiAoY2RzX2lzX2xvZ3BfaW5fcHJvZ3Jlc3MoKSkgeworCQlCTUlfRVJSKCIlczogTE9HUCBpcyBpbiBwcm9ncmVzcywgaWdub3JlIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKGNkc19pc19sb2FkX3VubG9hZF9pbl9wcm9ncmVzcygpKSB7CisJCUJNSV9FUlIoIiVzOiBMb2FkaW5nL1VubG9hZGluZyBpcyBpbiBwcm9ncmVzcywgaWdub3JlISIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJY2RzX3NldF9sb2dwX2luX3Byb2dyZXNzKHRydWUpOworCisjaWZkZWYgQ09ORklHX0NOU1MKKwlyZXQgPSBoaWZfY2hlY2tfZndfcmVnKHNjbik7CisJaWYgKDAgPT0gcmV0KSB7CisJCWlmIChzY24tPmVuYWJsZV9zZWxmX3JlY292ZXJ5KSB7CisJCQlvbF9zY2hlZHVsZV9md19pbmRpY2F0aW9uX3dvcmsoc2NuKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSBpZiAoLTEgPT0gcmV0KSB7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCUJNSV9FUlIoIlhYWCBUQVJHRVQgQVNTRVJURUQgWFhYIik7CisKKyNpZiAgZGVmaW5lZChDT05GSUdfQ05TUykKKwkvKiBDb2xsZWN0IHRoZSBSQU0gZHVtcCB0aHJvdWdoIGEgd29ya3F1ZXVlICovCisJaWYgKHNjbi0+ZW5hYmxlX3JhbWR1bXBfY29sbGVjdGlvbikKKwkJb2xfc2NoZWR1bGVfcmFtZHVtcF93b3JrKHNjbik7CisJZWxzZQorCQlwcl9kZWJ1ZygiJXM6IGF0aGRpYWcgcmVhZCBmb3IgdGFyZ2V0IHJlZ1xuIiwgX19mdW5jX18pOworI2VuZGlmCisKKwlyZXR1cm47Cit9CisKK0NERl9TVEFUVVMgb2xfY29uZmlndXJlX3RhcmdldChzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwl1aW50MzJfdCBwYXJhbTsKKyNpZmRlZiBDT05GSUdfQ05TUworCXN0cnVjdCBjbnNzX3BsYXRmb3JtX2NhcCBjYXA7CisJaW50IHJldDsKKyNlbmRpZgorCisJLyogVGVsbCB0YXJnZXQgd2hpY2ggSFRDIHZlcnNpb24gaXQgaXMgdXNlZCAqLworCXBhcmFtID0gSFRDX1BST1RPQ09MX1ZFUlNJT047CisJaWYgKGJtaV93cml0ZV9tZW1vcnkoCisJCWhpZl9oaWFfaXRlbV9hZGRyZXNzKHNjbi0+dGFyZ2V0X3R5cGUsCisJCW9mZnNldG9mKHN0cnVjdCBob3N0X2ludGVyZXN0X3MsIGhpX2FwcF9ob3N0X2ludGVyZXN0KSksCisJCSh1aW50OF90ICopICZwYXJhbSwgNCwgc2NuKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiYm1pX3dyaXRlX21lbW9yeSBmb3IgaHRjIHZlcnNpb24gZmFpbGVkIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwkvKiBzZXQgdGhlIGZpcm13YXJlIG1vZGUgdG8gU1RBL0lCU1MvQVAgKi8KKwl7CisJCWlmIChibWlfcmVhZF9tZW1vcnkoaGlmX2hpYV9pdGVtX2FkZHJlc3Moc2NuLT50YXJnZXRfdHlwZSwKKwkJCW9mZnNldG9mKHN0cnVjdCBob3N0X2ludGVyZXN0X3MsIGhpX29wdGlvbl9mbGFnKSksCisJCQkodWludDhfdCAqKSZwYXJhbSwgNCwgc2NuKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJNSV9FUlIoImJtaV9yZWFkX21lbW9yeSBmb3Igc2V0dGluZyBmd21vZGUgZmFpbGVkIik7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKworCQkvKiBUT0RPIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG5lZWQgdG8gYmUgcmUtdmlzaXRlZC4gKi8KKwkJcGFyYW0gfD0gKDEgPDwgSElfT1BUSU9OX05VTV9ERVZfU0hJRlQpOyAvKiBudW1fZGV2aWNlICovCisJCS8qIEZpcm13YXJlIG1vZGUgPz8gKi8KKwkJcGFyYW0gfD0gKEhJX09QVElPTl9GV19NT0RFX0FQIDw8IEhJX09QVElPTl9GV19NT0RFX1NISUZUKTsKKwkJLyogbWFjX2FkZHJfbWV0aG9kICovCisJCXBhcmFtIHw9ICgxIDw8IEhJX09QVElPTl9NQUNfQUREUl9NRVRIT0RfU0hJRlQpOworCQkvKiBmaXJtd2FyZV9icmlkZ2UgKi8KKwkJcGFyYW0gfD0gKDAgPDwgSElfT1BUSU9OX0ZXX0JSSURHRV9TSElGVCk7CisJCS8qIGZ3c3VibW9kZSAqLworCQlwYXJhbSB8PSAoMCA8PCBISV9PUFRJT05fRldfU1VCTU9ERV9TSElGVCk7CisKKwkJQk1JX0lORk8oIk5VTV9ERVY9JWQgRldNT0RFPTB4JXggRldTVUJNT0RFPTB4JXggRldCUl9CVUYgJWQiLAorCQkgICAgICAgMSwgSElfT1BUSU9OX0ZXX01PREVfQVAsIDAsIDApOworCisJCWlmIChibWlfd3JpdGVfbWVtb3J5KAorCQkJaGlmX2hpYV9pdGVtX2FkZHJlc3Moc2NuLT50YXJnZXRfdHlwZSwKKwkJCW9mZnNldG9mKHN0cnVjdCBob3N0X2ludGVyZXN0X3MsIGhpX29wdGlvbl9mbGFnKSksCisJCQkodWludDhfdCAqKSZwYXJhbSwgNCwgc2NuKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJNSV9FUlIoIkJNSSBXUklURSBmb3Igc2V0dGluZyBmd21vZGUgZmFpbGVkIik7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwl9CisKKyNpZiAoQ09ORklHX0RJU0FCTEVfQ0RDX01BWF9QRVJGX1dBUikKKwl7CisJCS8qIHNldCB0aGUgZmlybXdhcmUgdG8gZGlzYWJsZSBDREMgbWF4IHBlcmYgV0FSICovCisJCWlmIChibWlfcmVhZF9tZW1vcnkoaGlmX2hpYV9pdGVtX2FkZHJlc3Moc2NuLT50YXJnZXRfdHlwZSwKKwkJCW9mZnNldG9mKHN0cnVjdCBob3N0X2ludGVyZXN0X3MsIGhpX29wdGlvbl9mbGFnMikpLAorCQkJKHVpbnQ4X3QgKikgJnBhcmFtLCA0LCBzY24pICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJQk1JX0VSUigiQk1JIFJFQUQgZm9yIHNldHRpbmcgY2RjIG1heCBwZXJmIGZhaWxlZCIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisKKwkJcGFyYW0gfD0gSElfT1BUSU9OX0RJU0FCTEVfQ0RDX01BWF9QRVJGX1dBUjsKKwkJaWYgKGJtaV93cml0ZV9tZW1vcnkoCisJCQloaWZfaGlhX2l0ZW1fYWRkcmVzcyhzY24tPnRhcmdldF90eXBlLAorCQkJb2Zmc2V0b2Yoc3RydWN0IGhvc3RfaW50ZXJlc3RfcywgaGlfb3B0aW9uX2ZsYWcyKSksCisJCQkodWludDhfdCAqKSZwYXJhbSwgNCwgc2NuKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJNSV9FUlIoInNldHRpbmcgY2RjIG1heCBwZXJmIGZhaWxlZCIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19DRENfTUFYX1BFUkZfV0FSICovCisKKyNpZmRlZiBDT05GSUdfQ05TUworCisJcmV0ID0gY25zc19nZXRfcGxhdGZvcm1fY2FwKCZjYXApOworCWlmIChyZXQpCisJCUJNSV9FUlIoInBsYXRmb3JtIGNhcGFiaWxpdHkgaW5mbyBmcm9tIENOU1Mgbm90IGF2YWlsYWJsZSIpOworCisJaWYgKCFyZXQgJiYgY2FwLmNhcF9mbGFnICYgQ05TU19IQVNfRVhURVJOQUxfU1dSRUcpIHsKKwkJaWYgKGJtaV9yZWFkX21lbW9yeShoaWZfaGlhX2l0ZW1fYWRkcmVzcyhzY24tPnRhcmdldF90eXBlLAorCQkJb2Zmc2V0b2Yoc3RydWN0IGhvc3RfaW50ZXJlc3RfcywgaGlfb3B0aW9uX2ZsYWcyKSksCisJCQkodWludDhfdCAqKSZwYXJhbSwgNCwgc2NuKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJNSV9FUlIoImJtaV9yZWFkX21lbW9yeSBmb3Igc2V0dGluZyIKKwkJCQkiZXh0ZXJuYWwgU1dSRUcgZmFpbGVkIik7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKworCQlwYXJhbSB8PSBISV9PUFRJT05fVVNFX0VYVF9MRE87CisJCWlmIChibWlfd3JpdGVfbWVtb3J5KAorCQkJaGlmX2hpYV9pdGVtX2FkZHJlc3Moc2NuLT50YXJnZXRfdHlwZSwKKwkJCW9mZnNldG9mKHN0cnVjdCBob3N0X2ludGVyZXN0X3MsIGhpX29wdGlvbl9mbGFnMikpLAorCQkJKHVpbnQ4X3QgKikmcGFyYW0sIDQsIHNjbikgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlCTUlfRVJSKCJCTUkgV1JJVEUgZm9yIHNldHRpbmcgZXh0ZXJuYWwgU1dSRUcgZmFpbCIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTFBTUworCWlmIChzY24tPmVuYWJsZWxwYXNzc3VwcG9ydCkgeworCQlpZiAoYm1pX3JlYWRfbWVtb3J5KGhpZl9oaWFfaXRlbV9hZGRyZXNzKHNjbi0+dGFyZ2V0X3R5cGUsCisJCQlvZmZzZXRvZihzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zLCBoaV9vcHRpb25fZmxhZzIpKSwKKwkJCSh1aW50OF90ICopICZwYXJhbSwgNCwgc2NuKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJNSV9FUlIoIkJNSSBSRUFEOlNldHRpbmcgTFBBU1MgU3VwcG9ydCBmYWlsZWQiKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCisJCXBhcmFtIHw9IEhJX09QVElPTl9EQlVBUlRfU1VQUE9SVDsKKwkJaWYgKGJtaV93cml0ZV9tZW1vcnkoCisJCQloaWZfaGlhX2l0ZW1fYWRkcmVzcyhzY24tPnRhcmdldF90eXBlLAorCQkJb2Zmc2V0b2Yoc3RydWN0IGhvc3RfaW50ZXJlc3RfcywgaGlfb3B0aW9uX2ZsYWcyKSksCisJCQkodWludDhfdCAqKSZwYXJhbSwgNCwgc2NuKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJNSV9FUlIoIkJNSV9SRUFEIGZvciBzZXR0aW5nIExQQVNTIFN1cHBvcnQgZmFpbCIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBJZiBob3N0IGlzIHJ1bm5pbmcgb24gYSBCRSBDUFUsIHNldCB0aGUgaG9zdCBpbnRlcmVzdCBhcmVhICovCisJeworI2lmZGVmIEJJR19FTkRJQU5fSE9TVAorCQlwYXJhbSA9IDE7CisjZWxzZQorCQlwYXJhbSA9IDA7CisjZW5kaWYKKwkJaWYgKGJtaV93cml0ZV9tZW1vcnkoCisJCQloaWZfaGlhX2l0ZW1fYWRkcmVzcyhzY24tPnRhcmdldF90eXBlLAorCQkJb2Zmc2V0b2Yoc3RydWN0IGhvc3RfaW50ZXJlc3RfcywgaGlfYmUpKSwKKwkJCSh1aW50OF90ICopICZwYXJhbSwgNCwgc2NuKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJNSV9FUlIoInNldHRpbmcgaG9zdCBDUFUgQkUgbW9kZSBmYWlsZWQiKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCX0KKworCS8qIEZXIGRlc2NyaXB0b3IvRGF0YSBzd2FwIGZsYWdzICovCisJcGFyYW0gPSAwOworCWlmIChibWlfd3JpdGVfbWVtb3J5KAorCQloaWZfaGlhX2l0ZW1fYWRkcmVzcyhzY24tPnRhcmdldF90eXBlLAorCQlvZmZzZXRvZihzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zLCBoaV9md19zd2FwKSksCisJCSh1aW50OF90ICopICZwYXJhbSwgNCwgc2NuKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiQk1JIFdSSVRFIGZhaWxlZCBzZXR0aW5nIEZXIGRhdGEvZGVzYyBzd2FwIGZsYWdzIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG9sX2NoZWNrX2RhdGFzZXRfcGF0Y2goc3RydWN0IG9sX3NvZnRjICpzY24sIHVpbnQzMl90ICphZGRyZXNzKQoreworCS8qIENoZWNrIGlmIHBhdGNoIGZpbGUgbmVlZGVkIGZvciB0aGlzIHRhcmdldCB0eXBlL3ZlcnNpb24uICovCisJcmV0dXJuIDA7Cit9CisKKworQ0RGX1NUQVRVUyBvbF9md19wb3B1bGF0ZV9jbGtfc2V0dGluZ3MoQV9yZWZjbGtfc3BlZWRfdCByZWZjbGssCisJCQkJICAgICBzdHJ1Y3QgY21ub3NfY2xvY2tfcyAqY2xvY2tfcykKK3sKKwlpZiAoIWNsb2NrX3MpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCXN3aXRjaCAocmVmY2xrKSB7CisJY2FzZSBTT0NfUkVGQ0xLXzQ4X01IWjoKKwkJY2xvY2tfcy0+d2xhbl9wbGwuZGl2ID0gMHhFOworCQljbG9ja19zLT53bGFuX3BsbC5ybmZyYWMgPSAweDJBQUE4OworCQljbG9ja19zLT5wbGxfc2V0dGxpbmdfdGltZSA9IDI0MDA7CisJCWJyZWFrOworCWNhc2UgU09DX1JFRkNMS18xOV8yX01IWjoKKwkJY2xvY2tfcy0+d2xhbl9wbGwuZGl2ID0gMHgyNDsKKwkJY2xvY2tfcy0+d2xhbl9wbGwucm5mcmFjID0gMHgyQUFBODsKKwkJY2xvY2tfcy0+cGxsX3NldHRsaW5nX3RpbWUgPSA5NjA7CisJCWJyZWFrOworCWNhc2UgU09DX1JFRkNMS18yNF9NSFo6CisJCWNsb2NrX3MtPndsYW5fcGxsLmRpdiA9IDB4MUQ7CisJCWNsb2NrX3MtPndsYW5fcGxsLnJuZnJhYyA9IDB4MTU1NTE7CisJCWNsb2NrX3MtPnBsbF9zZXR0bGluZ190aW1lID0gMTIwMDsKKwkJYnJlYWs7CisJY2FzZSBTT0NfUkVGQ0xLXzI2X01IWjoKKwkJY2xvY2tfcy0+d2xhbl9wbGwuZGl2ID0gMHgxQjsKKwkJY2xvY2tfcy0+d2xhbl9wbGwucm5mcmFjID0gMHg0RUM0OworCQljbG9ja19zLT5wbGxfc2V0dGxpbmdfdGltZSA9IDEzMDA7CisJCWJyZWFrOworCWNhc2UgU09DX1JFRkNMS18zN180X01IWjoKKwkJY2xvY2tfcy0+d2xhbl9wbGwuZGl2ID0gMHgxMjsKKwkJY2xvY2tfcy0+d2xhbl9wbGwucm5mcmFjID0gMHgzNEI0OTsKKwkJY2xvY2tfcy0+cGxsX3NldHRsaW5nX3RpbWUgPSAxODcwOworCQlicmVhazsKKwljYXNlIFNPQ19SRUZDTEtfMzhfNF9NSFo6CisJCWNsb2NrX3MtPndsYW5fcGxsLmRpdiA9IDB4MTI7CisJCWNsb2NrX3MtPndsYW5fcGxsLnJuZnJhYyA9IDB4MTU1NTE7CisJCWNsb2NrX3MtPnBsbF9zZXR0bGluZ190aW1lID0gMTkyMDsKKwkJYnJlYWs7CisJY2FzZSBTT0NfUkVGQ0xLXzQwX01IWjoKKwkJY2xvY2tfcy0+d2xhbl9wbGwuZGl2ID0gMHgxMTsKKwkJY2xvY2tfcy0+d2xhbl9wbGwucm5mcmFjID0gMHgyNjY2NTsKKwkJY2xvY2tfcy0+cGxsX3NldHRsaW5nX3RpbWUgPSAyMDAwOworCQlicmVhazsKKwljYXNlIFNPQ19SRUZDTEtfNTJfTUhaOgorCQljbG9ja19zLT53bGFuX3BsbC5kaXYgPSAweDFCOworCQljbG9ja19zLT53bGFuX3BsbC5ybmZyYWMgPSAweDRFQzQ7CisJCWNsb2NrX3MtPnBsbF9zZXR0bGluZ190aW1lID0gMjYwMDsKKwkJYnJlYWs7CisJY2FzZSBTT0NfUkVGQ0xLX1VOS05PV046CisJCWNsb2NrX3MtPndsYW5fcGxsLnJlZmRpdiA9IDA7CisJCWNsb2NrX3MtPndsYW5fcGxsLmRpdiA9IDA7CisJCWNsb2NrX3MtPndsYW5fcGxsLnJuZnJhYyA9IDA7CisJCWNsb2NrX3MtPndsYW5fcGxsLm91dGRpdiA9IDA7CisJCWNsb2NrX3MtPnBsbF9zZXR0bGluZ190aW1lID0gMTAyNDsKKwkJY2xvY2tfcy0+cmVmY2xrX2h6ID0gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY2xvY2tfcy0+cmVmY2xrX2h6ID0gcmVmY2xrX3NwZWVkX3RvX2h6W3JlZmNsa107CisJY2xvY2tfcy0+d2xhbl9wbGwucmVmZGl2ID0gMDsKKwljbG9ja19zLT53bGFuX3BsbC5vdXRkaXYgPSAxOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBvbF9wYXRjaF9wbGxfc3dpdGNoKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVpbnQzMl90IGFkZHIgPSAwOworCXVpbnQzMl90IHJlZ192YWwgPSAwOworCXVpbnQzMl90IG1lbV92YWwgPSAwOworCXN0cnVjdCBjbW5vc19jbG9ja19zIGNsb2NrX3M7CisJdWludDMyX3QgY21ub3NfY29yZV9jbGtfZGl2X2FkZHIgPSAwOworCXVpbnQzMl90IGNtbm9zX2NwdV9wbGxfaW5pdF9kb25lX2FkZHIgPSAwOworCXVpbnQzMl90IGNtbm9zX2NwdV9zcGVlZF9hZGRyID0gMDsKKworCXN3aXRjaCAoc2NuLT50YXJnZXRfdmVyc2lvbikgeworCWNhc2UgQVI2MzIwX1JFVjFfMV9WRVJTSU9OOgorCQljbW5vc19jb3JlX2Nsa19kaXZfYWRkciA9IEFSNjMyMF9DT1JFX0NMS19ESVZfQUREUjsKKwkJY21ub3NfY3B1X3BsbF9pbml0X2RvbmVfYWRkciA9IEFSNjMyMF9DUFVfUExMX0lOSVRfRE9ORV9BRERSOworCQljbW5vc19jcHVfc3BlZWRfYWRkciA9IEFSNjMyMF9DUFVfU1BFRURfQUREUjsKKwkJYnJlYWs7CisJY2FzZSBBUjYzMjBfUkVWMV8zX1ZFUlNJT046CisJY2FzZSBBUjYzMjBfUkVWMl8xX1ZFUlNJT046CisJCWNtbm9zX2NvcmVfY2xrX2Rpdl9hZGRyID0gQVI2MzIwVjJfQ09SRV9DTEtfRElWX0FERFI7CisJCWNtbm9zX2NwdV9wbGxfaW5pdF9kb25lX2FkZHIgPSBBUjYzMjBWMl9DUFVfUExMX0lOSVRfRE9ORV9BRERSOworCQljbW5vc19jcHVfc3BlZWRfYWRkciA9IEFSNjMyMFYyX0NQVV9TUEVFRF9BRERSOworCQlicmVhazsKKwljYXNlIEFSNjMyMF9SRVYzX1ZFUlNJT046CisJY2FzZSBBUjYzMjBfUkVWM18yX1ZFUlNJT046CisJCWNtbm9zX2NvcmVfY2xrX2Rpdl9hZGRyID0gQVI2MzIwVjNfQ09SRV9DTEtfRElWX0FERFI7CisJCWNtbm9zX2NwdV9wbGxfaW5pdF9kb25lX2FkZHIgPSBBUjYzMjBWM19DUFVfUExMX0lOSVRfRE9ORV9BRERSOworCQljbW5vc19jcHVfc3BlZWRfYWRkciA9IEFSNjMyMFYzX0NQVV9TUEVFRF9BRERSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCTUlfRVJSKCIlczogVW5zdXBwb3J0ZWQgdGFyZ2V0IHZlcnNpb24gJXgiLCBfX2Z1bmNfXywKKwkJICAgICAgIHNjbi0+dGFyZ2V0X3ZlcnNpb24pOworCQlnb3RvIGVuZDsKKwl9CisKKwlhZGRyID0gKFJUQ19TT0NfQkFTRV9BRERSRVNTIHwgRUZVU0VfT0ZGU0VUKTsKKwlzdGF0dXMgPSBibWlfcmVhZF9zb2NfcmVnaXN0ZXIoYWRkciwgJnJlZ192YWwsIHNjbik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiRmFpbGVkIHRvIHJlYWQgRUZVU0UgQWRkciIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlzdGF0dXMgPSBvbF9md19wb3B1bGF0ZV9jbGtfc2V0dGluZ3MoRUZVU0VfWFRBTF9TRUxfR0VUKHJlZ192YWwpLAorCQkJCQkgICAgICZjbG9ja19zKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gc2V0IGNsb2NrIHNldHRpbmdzIik7CisJCWdvdG8gZW5kOworCX0KKwlCTUlfREJHKCJjcnlzdGFsX2ZyZXE6ICVkSHoiLCBjbG9ja19zLnJlZmNsa19oeik7CisKKwkvKiAtLS0tLS1TdGVwIDEtLS0tICovCisJcmVnX3ZhbCA9IDA7CisJYWRkciA9IChSVENfU09DX0JBU0VfQUREUkVTUyB8IEJCX1BMTF9DT05GSUdfT0ZGU0VUKTsKKwlzdGF0dXMgPSBibWlfcmVhZF9zb2NfcmVnaXN0ZXIoYWRkciwgJnJlZ192YWwsIHNjbik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiRmFpbGVkIHRvIHJlYWQgUExMX0NPTkZJRyBBZGRyIik7CisJCWdvdG8gZW5kOworCX0KKwlCTUlfREJHKCJTdGVwIDFhOiAlOFgiLCByZWdfdmFsKTsKKworCXJlZ192YWwgJj0gfihCQl9QTExfQ09ORklHX0ZSQUNfTUFTSyB8IEJCX1BMTF9DT05GSUdfT1VURElWX01BU0spOworCXJlZ192YWwgfD0gKEJCX1BMTF9DT05GSUdfRlJBQ19TRVQoY2xvY2tfcy53bGFuX3BsbC5ybmZyYWMpIHwKKwkJICAgIEJCX1BMTF9DT05GSUdfT1VURElWX1NFVChjbG9ja19zLndsYW5fcGxsLm91dGRpdikpOworCXN0YXR1cyA9IGJtaV93cml0ZV9zb2NfcmVnaXN0ZXIoYWRkciwgcmVnX3ZhbCwgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gd3JpdGUgUExMX0NPTkZJRyBBZGRyIik7CisJCWdvdG8gZW5kOworCX0KKworCXJlZ192YWwgPSAwOworCXN0YXR1cyA9IGJtaV9yZWFkX3NvY19yZWdpc3RlcihhZGRyLCAmcmVnX3ZhbCwgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gcmVhZCBiYWNrIFBMTF9DT05GSUcgQWRkciIpOworCQlnb3RvIGVuZDsKKwl9CisJQk1JX0RCRygiU3RlcCAxYjogJThYIiwgcmVnX3ZhbCk7CisKKwkvKiAtLS0tLS1TdGVwIDItLS0tICovCisJcmVnX3ZhbCA9IDA7CisJYWRkciA9IChSVENfV01BQ19CQVNFX0FERFJFU1MgfCBXTEFOX1BMTF9TRVRUTEVfT0ZGU0VUKTsKKwlzdGF0dXMgPSBibWlfcmVhZF9zb2NfcmVnaXN0ZXIoYWRkciwgJnJlZ192YWwsIHNjbik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiRmFpbGVkIHRvIHJlYWQgUExMX1NFVFRMRSBBZGRyIik7CisJCWdvdG8gZW5kOworCX0KKwlCTUlfREJHKCJTdGVwIDJhOiAlOFgiLCByZWdfdmFsKTsKKworCXJlZ192YWwgJj0gfldMQU5fUExMX1NFVFRMRV9USU1FX01BU0s7CisJcmVnX3ZhbCB8PSBXTEFOX1BMTF9TRVRUTEVfVElNRV9TRVQoY2xvY2tfcy5wbGxfc2V0dGxpbmdfdGltZSk7CisJc3RhdHVzID0gYm1pX3dyaXRlX3NvY19yZWdpc3RlcihhZGRyLCByZWdfdmFsLCBzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkZhaWxlZCB0byB3cml0ZSBQTExfU0VUVExFIEFkZHIiKTsKKwkJZ290byBlbmQ7CisJfQorCisJcmVnX3ZhbCA9IDA7CisJc3RhdHVzID0gYm1pX3JlYWRfc29jX3JlZ2lzdGVyKGFkZHIsICZyZWdfdmFsLCBzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkZhaWxlZCB0byByZWFkIGJhY2sgUExMX1NFVFRMRSBBZGRyIik7CisJCWdvdG8gZW5kOworCX0KKwlCTUlfREJHKCJTdGVwIDJiOiAlOFgiLCByZWdfdmFsKTsKKworCS8qIC0tLS0tLVN0ZXAgMy0tLS0gKi8KKwlyZWdfdmFsID0gMDsKKwlhZGRyID0gKFJUQ19TT0NfQkFTRV9BRERSRVNTIHwgU09DX0NPUkVfQ0xLX0NUUkxfT0ZGU0VUKTsKKwlzdGF0dXMgPSBibWlfcmVhZF9zb2NfcmVnaXN0ZXIoYWRkciwgJnJlZ192YWwsIHNjbik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiRmFpbGVkIHRvIHJlYWQgQ0xLX0NUUkwgQWRkciIpOworCQlnb3RvIGVuZDsKKwl9CisJQk1JX0RCRygiU3RlcCAzYTogJThYIiwgcmVnX3ZhbCk7CisKKwlyZWdfdmFsICY9IH5TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTUFTSzsKKwlyZWdfdmFsIHw9IFNPQ19DT1JFX0NMS19DVFJMX0RJVl9TRVQoMSk7CisJc3RhdHVzID0gYm1pX3dyaXRlX3NvY19yZWdpc3RlcihhZGRyLCByZWdfdmFsLCBzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkZhaWxlZCB0byB3cml0ZSBDTEtfQ1RSTCBBZGRyIik7CisJCWdvdG8gZW5kOworCX0KKworCXJlZ192YWwgPSAwOworCXN0YXR1cyA9IGJtaV9yZWFkX3NvY19yZWdpc3RlcihhZGRyLCAmcmVnX3ZhbCwgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gcmVhZCBiYWNrIENMS19DVFJMIEFkZHIiKTsKKwkJZ290byBlbmQ7CisJfQorCUJNSV9EQkcoIlN0ZXAgM2I6ICU4WCIsIHJlZ192YWwpOworCisJLyogLS0tLS0tU3RlcCA0LS0tLS0gKi8KKwltZW1fdmFsID0gMTsKKwlzdGF0dXMgPSBibWlfd3JpdGVfbWVtb3J5KGNtbm9zX2NvcmVfY2xrX2Rpdl9hZGRyLAorCQkJCSAgKHVpbnQ4X3QgKikgJm1lbV92YWwsIDQsIHNjbik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiRmFpbGVkIHRvIHdyaXRlIENMS19ESVYgQWRkciIpOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiAtLS0tLS1TdGVwIDUtLS0tLSAqLworCXJlZ192YWwgPSAwOworCWFkZHIgPSAoUlRDX1dNQUNfQkFTRV9BRERSRVNTIHwgV0xBTl9QTExfQ09OVFJPTF9PRkZTRVQpOworCXN0YXR1cyA9IGJtaV9yZWFkX3NvY19yZWdpc3RlcihhZGRyLCAmcmVnX3ZhbCwgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gcmVhZCBQTExfQ1RSTCBBZGRyIik7CisJCWdvdG8gZW5kOworCX0KKwlCTUlfREJHKCJTdGVwIDVhOiAlOFgiLCByZWdfdmFsKTsKKworCXJlZ192YWwgJj0gfihXTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NQVNLIHwgV0xBTl9QTExfQ09OVFJPTF9ESVZfTUFTSyB8CisJCSAgICAgV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NQVNLKTsKKwlyZWdfdmFsIHw9IChXTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9TRVQoY2xvY2tfcy53bGFuX3BsbC5yZWZkaXYpIHwKKwkJICAgIFdMQU5fUExMX0NPTlRST0xfRElWX1NFVChjbG9ja19zLndsYW5fcGxsLmRpdikgfAorCQkgICAgV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9TRVQoMSkpOworCXN0YXR1cyA9IGJtaV93cml0ZV9zb2NfcmVnaXN0ZXIoYWRkciwgcmVnX3ZhbCwgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gd3JpdGUgUExMX0NUUkwgQWRkciIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlyZWdfdmFsID0gMDsKKwlzdGF0dXMgPSBibWlfcmVhZF9zb2NfcmVnaXN0ZXIoYWRkciwgJnJlZ192YWwsIHNjbik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiRmFpbGVkIHRvIHJlYWQgYmFjayBQTExfQ1RSTCBBZGRyIik7CisJCWdvdG8gZW5kOworCX0KKwlPU19ERUxBWSgxMDApOworCUJNSV9EQkcoIlN0ZXAgNWI6ICU4WCIsIHJlZ192YWwpOworCisJLyogLS0tLS0tU3RlcCA2LS0tLS0tLSAqLworCWRvIHsKKwkJcmVnX3ZhbCA9IDA7CisJCXN0YXR1cyA9IGJtaV9yZWFkX3NvY19yZWdpc3RlcigoUlRDX1dNQUNfQkFTRV9BRERSRVNTIHwKKwkJCQlSVENfU1lOQ19TVEFUVVNfT0ZGU0VUKSwgJnJlZ192YWwsIHNjbik7CisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlCTUlfRVJSKCJGYWlsZWQgdG8gcmVhZCBSVENfU1lOQ19TVEFUVVMgQWRkciIpOworCQkJZ290byBlbmQ7CisJCX0KKwl9IHdoaWxlIChSVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX0dFVChyZWdfdmFsKSk7CisKKwkvKiAtLS0tLS1TdGVwIDctLS0tLS0tICovCisJcmVnX3ZhbCA9IDA7CisJYWRkciA9IChSVENfV01BQ19CQVNFX0FERFJFU1MgfCBXTEFOX1BMTF9DT05UUk9MX09GRlNFVCk7CisJc3RhdHVzID0gYm1pX3JlYWRfc29jX3JlZ2lzdGVyKGFkZHIsICZyZWdfdmFsLCBzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkZhaWxlZCB0byByZWFkIFBMTF9DVFJMIEFkZHIgZm9yIENUUkxfQllQQVNTIik7CisJCWdvdG8gZW5kOworCX0KKwlCTUlfREJHKCJTdGVwIDdhOiAlOFgiLCByZWdfdmFsKTsKKworCXJlZ192YWwgJj0gfldMQU5fUExMX0NPTlRST0xfQllQQVNTX01BU0s7CisJcmVnX3ZhbCB8PSBXTEFOX1BMTF9DT05UUk9MX0JZUEFTU19TRVQoMCk7CisJc3RhdHVzID0gYm1pX3dyaXRlX3NvY19yZWdpc3RlcihhZGRyLCByZWdfdmFsLCBzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkZhaWxlZCB0byB3cml0ZSBQTExfQ1RSTCBBZGRyIGZvciBDVFJMX0JZUEFTUyIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlyZWdfdmFsID0gMDsKKwlzdGF0dXMgPSBibWlfcmVhZF9zb2NfcmVnaXN0ZXIoYWRkciwgJnJlZ192YWwsIHNjbik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiRmFpbGVkIHRvIHJlYWQgYmFjayBQTExfQ1RSTCBBZGRyIGZvciBDVFJMX0JZUEFTUyIpOworCQlnb3RvIGVuZDsKKwl9CisJQk1JX0RCRygiU3RlcCA3YjogJThYIiwgcmVnX3ZhbCk7CisKKwkvKiAtLS0tLS1TdGVwIDgtLS0tLS0tLSAqLworCWRvIHsKKwkJcmVnX3ZhbCA9IDA7CisJCXN0YXR1cyA9IGJtaV9yZWFkX3NvY19yZWdpc3RlcigoUlRDX1dNQUNfQkFTRV9BRERSRVNTIHwKKwkJCQlSVENfU1lOQ19TVEFUVVNfT0ZGU0VUKSwgJnJlZ192YWwsIHNjbik7CisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlCTUlfRVJSKCJGYWlsZWQgdG8gcmVhZCBTWU5DX1NUQVRVUyBBZGRyIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0gd2hpbGUgKFJUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfR0VUKHJlZ192YWwpKTsKKworCS8qIC0tLS0tLVN0ZXAgOS0tLS0tLS0tICovCisJcmVnX3ZhbCA9IDA7CisJYWRkciA9IChSVENfU09DX0JBU0VfQUREUkVTUyB8IFNPQ19DUFVfQ0xPQ0tfT0ZGU0VUKTsKKwlzdGF0dXMgPSBibWlfcmVhZF9zb2NfcmVnaXN0ZXIoYWRkciwgJnJlZ192YWwsIHNjbik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQk1JX0VSUigiRmFpbGVkIHRvIHJlYWQgQ1BVX0NMSyBBZGRyIik7CisJCWdvdG8gZW5kOworCX0KKwlCTUlfREJHKCJTdGVwIDlhOiAlOFgiLCByZWdfdmFsKTsKKworCXJlZ192YWwgJj0gflNPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSzsKKwlyZWdfdmFsIHw9IFNPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfU0VUKDEpOworCXN0YXR1cyA9IGJtaV93cml0ZV9zb2NfcmVnaXN0ZXIoYWRkciwgcmVnX3ZhbCwgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gd3JpdGUgQ1BVX0NMSyBBZGRyIik7CisJCWdvdG8gZW5kOworCX0KKworCXJlZ192YWwgPSAwOworCXN0YXR1cyA9IGJtaV9yZWFkX3NvY19yZWdpc3RlcihhZGRyLCAmcmVnX3ZhbCwgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gcmVhZCBiYWNrIENQVV9DTEsgQWRkciIpOworCQlnb3RvIGVuZDsKKwl9CisJQk1JX0RCRygiU3RlcCA5YjogJThYIiwgcmVnX3ZhbCk7CisKKwkvKiAtLS0tLS1TdGVwIDEwLS0tLS0tLSAqLworCXJlZ192YWwgPSAwOworCWFkZHIgPSAoUlRDX1dNQUNfQkFTRV9BRERSRVNTIHwgV0xBTl9QTExfQ09OVFJPTF9PRkZTRVQpOworCXN0YXR1cyA9IGJtaV9yZWFkX3NvY19yZWdpc3RlcihhZGRyLCAmcmVnX3ZhbCwgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gcmVhZCBQTExfQ1RSTCBBZGRyIGZvciBOT1BXRCIpOworCQlnb3RvIGVuZDsKKwl9CisJQk1JX0RCRygiU3RlcCAxMGE6ICU4WCIsIHJlZ192YWwpOworCisJcmVnX3ZhbCAmPSB+V0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NQVNLOworCXN0YXR1cyA9IGJtaV93cml0ZV9zb2NfcmVnaXN0ZXIoYWRkciwgcmVnX3ZhbCwgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gd3JpdGUgUExMX0NUUkwgQWRkciBmb3IgTk9QV0QiKTsKKwkJZ290byBlbmQ7CisJfQorCXJlZ192YWwgPSAwOworCXN0YXR1cyA9IGJtaV9yZWFkX3NvY19yZWdpc3RlcihhZGRyLCAmcmVnX3ZhbCwgc2NuKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gcmVhZCBiYWNrIFBMTF9DVFJMIEFkZHIgZm9yIE5PUFdEIik7CisJCWdvdG8gZW5kOworCX0KKwlCTUlfREJHKCJTdGVwIDEwYjogJThYIiwgcmVnX3ZhbCk7CisKKwkvKiAtLS0tLS1TdGVwIDExLS0tLS0tLSAqLworCW1lbV92YWwgPSAxOworCXN0YXR1cyA9IGJtaV93cml0ZV9tZW1vcnkoY21ub3NfY3B1X3BsbF9pbml0X2RvbmVfYWRkciwKKwkJCQkgICh1aW50OF90ICopICZtZW1fdmFsLCA0LCBzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkZhaWxlZCB0byB3cml0ZSBQTExfSU5JVCBBZGRyIik7CisJCWdvdG8gZW5kOworCX0KKworCW1lbV92YWwgPSBUQVJHRVRfQ1BVX0ZSRVE7CisJc3RhdHVzID0gYm1pX3dyaXRlX21lbW9yeShjbW5vc19jcHVfc3BlZWRfYWRkciwKKwkJCQkgICh1aW50OF90ICopICZtZW1fdmFsLCA0LCBzY24pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUJNSV9FUlIoIkZhaWxlZCB0byB3cml0ZSBDUFVfU1BFRUQgQWRkciIpOworCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgQ09ORklHX0NOU1MKKy8qIEFYSSBTdGFydCBBZGRyZXNzICovCisjZGVmaW5lIFRBUkdFVF9BRERSICgweGEwMDAwKQorCit2b2lkIG9sX3RyYW5zZmVyX2NvZGVzd2FwX3N0cnVjdChzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlzdHJ1Y3QgY29kZXN3YXBfY29kZXNlZ19pbmZvIHdsYW5fY29kZXN3YXA7CisJQ0RGX1NUQVRVUyBydjsKKworCWlmICghc2NuKSB7CisJCUJNSV9FUlIoIiVzOiBvbF9zb2Z0YyBpcyBudWxsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWlmIChjbnNzX2dldF9jb2Rlc3dhcF9zdHJ1Y3QoJndsYW5fY29kZXN3YXApKSB7CisJCUJNSV9FUlIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVzd2FwIHN0cnVjdHVyZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXJ2ID0gYm1pX3dyaXRlX21lbW9yeShUQVJHRVRfQUREUiwKKwkJCSAgICAgICh1aW50OF90ICopICZ3bGFuX2NvZGVzd2FwLCBzaXplb2Yod2xhbl9jb2Rlc3dhcCksCisJCQkgICAgICBzY24pOworCisJaWYgKHJ2ICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJGYWlsZWQgdG8gV3JpdGUgMHhhMDAwMCB0byBUYXJnZXQiKTsKKwkJcmV0dXJuOworCX0KKwlCTUlfSU5GTygiY29kZXN3YXAgc3RydWN0dXJlIGlzIHN1Y2Nlc3NmdWxseSBkb3dubG9hZGVkIik7Cit9CisjZW5kaWYKKworQ0RGX1NUQVRVUyBvbF9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwl1aW50MzJfdCBwYXJhbSwgYWRkcmVzcyA9IDA7CisJaW50IHN0YXR1cyA9ICFFT0s7CisJQ0RGX1NUQVRVUyByZXQ7CisKKyNpZmRlZiBDT05GSUdfQ05TUworCWlmICgwICE9IGNuc3NfZ2V0X2Z3X2ZpbGVzX2Zvcl90YXJnZXQoJnNjbi0+ZndfZmlsZXMsCisJCQkJCSAgICAgIHNjbi0+dGFyZ2V0X3R5cGUsCisJCQkJCSAgICAgIHNjbi0+dGFyZ2V0X3ZlcnNpb24pKSB7CisJCUJNSV9FUlIoIiVzOiBObyBGVyBmaWxlcyBmcm9tIENOU1MgZHJpdmVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorI2VuZGlmCisJLyogVHJhbnNmZXIgQm9hcmQgRGF0YSBmcm9tIFRhcmdldCBFRVBST00gdG8gVGFyZ2V0IFJBTSAqLworCS8qIERldGVybWluZSB3aGVyZSBpbiBUYXJnZXQgUkFNIHRvIHdyaXRlIEJvYXJkIERhdGEgKi8KKwlibWlfcmVhZF9tZW1vcnkoaGlmX2hpYV9pdGVtX2FkZHJlc3Moc2NuLT50YXJnZXRfdHlwZSwKKwkJCW9mZnNldG9mKHN0cnVjdCBob3N0X2ludGVyZXN0X3MsIGhpX2JvYXJkX2RhdGEpKSwKKwkJCSh1aW50OF90ICopJmFkZHJlc3MsIDQsIHNjbik7CisKKwlpZiAoIWFkZHJlc3MpIHsKKwkJYWRkcmVzcyA9IEFSNjAwNF9SRVY1X0JPQVJEX0RBVEFfQUREUkVTUzsKKwkJQk1JX0RCRygiJXM6IFRhcmdldCBhZGRyZXNzIG5vdCBrbm93biEgVXNpbmcgMHgleCIsCisJCQkJCQlfX2Z1bmNfXywgYWRkcmVzcyk7CisJfQorCXJldCA9IG9sX3BhdGNoX3BsbF9zd2l0Y2goc2NuKTsKKwlpZiAocmV0ICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlCTUlfRVJSKCJwbGwgc3dpdGNoIGZhaWxlZC4gc3RhdHVzICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHNjbi0+Y2FsX2luX2ZsYXNoKSB7CisJCS8qIFdyaXRlIEVFUFJPTSBvciBGbGFzaCBkYXRhIHRvIFRhcmdldCBSQU0gKi8KKwkJc3RhdHVzID0gb2xfdHJhbnNmZXJfYmluX2ZpbGUoc2NuLCBBVEhfRkxBU0hfRklMRSwKKwkJCQkJCWFkZHJlc3MsIGZhbHNlKTsKKwl9CisKKwlpZiAoc3RhdHVzID09IEVPSykgeworCQkvKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBCb2FyZCBEYXRhIGlzIGluaXRpYWxpemVkICovCisJCXBhcmFtID0gMTsKKwkJYm1pX3dyaXRlX21lbW9yeSgKKwkJCWhpZl9oaWFfaXRlbV9hZGRyZXNzKHNjbi0+dGFyZ2V0X3R5cGUsCisJCQlvZmZzZXRvZihzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zLAorCQkJCWhpX2JvYXJkX2RhdGFfaW5pdGlhbGl6ZWQpKSwKKwkJCQkodWludDhfdCAqKSAmcGFyYW0sIDQsIHNjbik7CisJfSBlbHNlIHsKKwkJLyogRmxhc2ggaXMgZWl0aGVyIG5vdCBhdmFpbGFibGUgb3IgaW52YWxpZCAqLworCQlpZiAob2xfdHJhbnNmZXJfYmluX2ZpbGUKKwkJCSAgICAoc2NuLCBBVEhfQk9BUkRfREFUQV9GSUxFLCBhZGRyZXNzLCBmYWxzZSkgIT0gRU9LKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBCb2FyZCBEYXRhIGlzIGluaXRpYWxpemVkICovCisJCXBhcmFtID0gMTsKKwkJYm1pX3dyaXRlX21lbW9yeSgKKwkJCWhpZl9oaWFfaXRlbV9hZGRyZXNzKHNjbi0+dGFyZ2V0X3R5cGUsCisJCQlvZmZzZXRvZihzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zLAorCQkJCWhpX2JvYXJkX2RhdGFfaW5pdGlhbGl6ZWQpKSwKKwkJCQkodWludDhfdCAqKSAmcGFyYW0sIDQsIHNjbik7CisKKwkJLyogVHJhbnNmZXIgT25lIFRpbWUgUHJvZ3JhbW1hYmxlIGRhdGEgKi8KKwkJYWRkcmVzcyA9IEJNSV9TRUdNRU5URURfV1JJVEVfQUREUjsKKwkJQk1JX0lORk8oIiVzOiBVc2luZyAweCV4IGZvciB0aGUgcmVtYWluZGVyIG9mIGluaXQiLAorCQkJCV9fZnVuY19fLCBhZGRyZXNzKTsKKworI2lmZGVmIENPTkZJR19DTlNTCisJCW9sX3RyYW5zZmVyX2NvZGVzd2FwX3N0cnVjdChzY24pOworI2VuZGlmCisJCXN0YXR1cyA9IG9sX3RyYW5zZmVyX2Jpbl9maWxlKHNjbiwgQVRIX09UUF9GSUxFLAorCQkJCQkJYWRkcmVzcywgdHJ1ZSk7CisJCS8qIEV4ZWN1dGUgdGhlIE9UUCBjb2RlIG9ubHkgaWYgZW50cnkgZm91bmQgYW5kIGRvd25sb2FkZWQgKi8KKwkJaWYgKHN0YXR1cyA9PSBFT0spIHsKKwkJCXBhcmFtID0gMDsKKyNpZm5kZWYgRkVBVFVSRV9CTUlfMgorCQkJYm1pX2V4ZWN1dGUoYWRkcmVzcywgJnBhcmFtLCBzY24pOworI2VuZGlmCisJCX0gZWxzZSBpZiAoc3RhdHVzIDwgMCkgeworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCWlmIChvbF90cmFuc2Zlcl9iaW5fZmlsZShzY24sIEFUSF9TRVRVUF9GSUxFLAorCQlCTUlfU0VHTUVOVEVEX1dSSVRFX0FERFIsIHRydWUpID09IEVPSykgeworCQlwYXJhbSA9IDA7CisjaWZuZGVmIEZFQVRVUkVfQk1JXzIKKwkJYm1pX2V4ZWN1dGUoYWRkcmVzcywgJnBhcmFtLCBzY24pOworI2VuZGlmCisJfQorCisJLyogRG93bmxvYWQgVGFyZ2V0IGZpcm13YXJlCisJICogVE9ETyBwb2ludCB0byB0YXJnZXQgc3BlY2lmaWMgZmlsZXMgaW4gcnVudGltZQorCSAqLworCWFkZHJlc3MgPSBCTUlfU0VHTUVOVEVEX1dSSVRFX0FERFI7CisJaWYgKG9sX3RyYW5zZmVyX2Jpbl9maWxlKHNjbiwgQVRIX0ZJUk1XQVJFX0ZJTEUsCisJCQkJYWRkcmVzcywgdHJ1ZSkgIT0gRU9LKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBBcHBseSB0aGUgcGF0Y2hlcyAqLworCWlmIChvbF9jaGVja19kYXRhc2V0X3BhdGNoKHNjbiwgJmFkZHJlc3MpKSB7CisJCWlmICgob2xfdHJhbnNmZXJfYmluX2ZpbGUoc2NuLCBBVEhfUEFUQ0hfRklMRSwgYWRkcmVzcywgZmFsc2UpKQorCQkgICAgIT0gRU9LKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYm1pX3dyaXRlX21lbW9yeShoaWZfaGlhX2l0ZW1fYWRkcmVzcyhzY24tPnRhcmdldF90eXBlLAorCQkJb2Zmc2V0b2Yoc3RydWN0IGhvc3RfaW50ZXJlc3RfcywgaGlfZHNldF9saXN0X2hlYWQpKSwKKwkJCSh1aW50OF90ICopICZhZGRyZXNzLCA0LCBzY24pOworCX0KKworCWlmIChzY24tPmVuYWJsZXVhcnRwcmludCB8fAorCSAgICAoV0xBTl9JU19FUFBJTkdfRU5BQkxFRChjZHNfZ2V0X2NvbnBhcmFtKCkpICYmCisJICAgICBXTEFOX0lTX0VQUElOR19GV19VQVJUKGNkc19nZXRfY29ucGFyYW0oKSkpKSB7CisJCXN3aXRjaCAoc2NuLT50YXJnZXRfdmVyc2lvbikgeworCQljYXNlIEFSNjAwNF9WRVJTSU9OX1JFVjFfMzoKKwkJCXBhcmFtID0gMTE7CisJCQlicmVhazsKKwkJY2FzZSBBUjYzMjBfUkVWMV9WRVJTSU9OOgorCQljYXNlIEFSNjMyMF9SRVYyX1ZFUlNJT046CisJCWNhc2UgQVI2MzIwX1JFVjNfVkVSU0lPTjoKKwkJY2FzZSBBUjYzMjBfUkVWM18yX1ZFUlNJT046CisJCWNhc2UgQVI2MzIwX1JFVjRfVkVSU0lPTjoKKwkJY2FzZSBBUjYzMjBfREVWX1ZFUlNJT046CisJCQlwYXJhbSA9IDY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIENvbmZpZ3VyZSBHUElPIEFSOTg4OCBVQVJUICovCisJCQlwYXJhbSA9IDc7CisJCX0KKworCQlibWlfd3JpdGVfbWVtb3J5KGhpZl9oaWFfaXRlbV9hZGRyZXNzKHNjbi0+dGFyZ2V0X3R5cGUsCisJCQlvZmZzZXRvZihzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zLCBoaV9kYmdfdWFydF90eHBpbikpLAorCQkJKHVpbnQ4X3QgKikmcGFyYW0sIDQsIHNjbik7CisJCXBhcmFtID0gMTsKKwkJYm1pX3dyaXRlX21lbW9yeShoaWZfaGlhX2l0ZW1fYWRkcmVzcyhzY24tPnRhcmdldF90eXBlLAorCQkJb2Zmc2V0b2Yoc3RydWN0IGhvc3RfaW50ZXJlc3RfcywgaGlfc2VyaWFsX2VuYWJsZSkpLAorCQkJKHVpbnQ4X3QgKikmcGFyYW0sIDQsIHNjbik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRXhwbGljaXRseSBzZXR0aW5nIFVBUlQgcHJpbnRzIHRvIHplcm8gYXMgdGFyZ2V0IHR1cm5zIGl0IG9uCisJCSAqIGJhc2VkIG9uIHNjcmF0Y2ggcmVnaXN0ZXJzLgorCQkgKi8KKwkJcGFyYW0gPSAwOworCQlibWlfd3JpdGVfbWVtb3J5KGhpZl9oaWFfaXRlbV9hZGRyZXNzKHNjbi0+dGFyZ2V0X3R5cGUsCisJCQlvZmZzZXRvZihzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zLCBoaV9zZXJpYWxfZW5hYmxlKSksCisJCQkodWludDhfdCAqKSZwYXJhbSwgNCwgc2NuKTsKKwl9CisKKwlpZiAoc2NuLT5lbmFibGVmd2xvZykgeworCQlibWlfcmVhZF9tZW1vcnkoaGlmX2hpYV9pdGVtX2FkZHJlc3Moc2NuLT50YXJnZXRfdHlwZSwKKwkJCW9mZnNldG9mKHN0cnVjdCBob3N0X2ludGVyZXN0X3MsIGhpX29wdGlvbl9mbGFnKSksCisJCQkodWludDhfdCAqKSZwYXJhbSwgNCwgc2NuKTsKKworCQlwYXJhbSAmPSB+KEhJX09QVElPTl9ESVNBQkxFX0RCR0xPRyk7CisJCWJtaV93cml0ZV9tZW1vcnkoaGlmX2hpYV9pdGVtX2FkZHJlc3Moc2NuLT50YXJnZXRfdHlwZSwKKwkJCW9mZnNldG9mKHN0cnVjdCBob3N0X2ludGVyZXN0X3MsIGhpX29wdGlvbl9mbGFnKSksCisJCQkodWludDhfdCAqKSZwYXJhbSwgNCwgc2NuKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBFeHBsaWNpdGx5IHNldHRpbmcgZndsb2cgcHJpbnRzIHRvIHplcm8gYXMgdGFyZ2V0IHR1cm5zIGl0IG9uCisJCSAqIGJhc2VkIG9uIHNjcmF0Y2ggcmVnaXN0ZXJzLgorCQkgKi8KKwkJYm1pX3JlYWRfbWVtb3J5KGhpZl9oaWFfaXRlbV9hZGRyZXNzKHNjbi0+dGFyZ2V0X3R5cGUsCisJCQlvZmZzZXRvZihzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zLCBoaV9vcHRpb25fZmxhZykpLAorCQkJKHVpbnQ4X3QgKikmcGFyYW0sIDQsIHNjbik7CisKKwkJcGFyYW0gfD0gSElfT1BUSU9OX0RJU0FCTEVfREJHTE9HOworCQlibWlfd3JpdGVfbWVtb3J5KGhpZl9oaWFfaXRlbV9hZGRyZXNzKHNjbi0+dGFyZ2V0X3R5cGUsCisJCQlvZmZzZXRvZihzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zLCBoaV9vcHRpb25fZmxhZykpLAorCQkJKHVpbnQ4X3QgKikgJnBhcmFtLCA0LCBzY24pOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBvbF9kaWFnX3JlYWQoc3RydWN0IG9sX3NvZnRjICpzY24sIHVpbnQ4X3QgKmJ1ZmZlciwKKwkJIHVpbnQzMl90IHBvcywgc2l6ZV90IGNvdW50KQoreworCWludCByZXN1bHQgPSAwOworCisJaWYgKCg0ID09IGNvdW50KSAmJiAoKHBvcyAmIDMpID09IDApKSB7CisJCXJlc3VsdCA9IGhpZl9kaWFnX3JlYWRfYWNjZXNzKHNjbiwgcG9zLAorCQkJCQkgICAgICAodWludDMyX3QgKikgYnVmZmVyKTsKKwl9IGVsc2UgeworCQlzaXplX3QgYW1vdW50X3JlYWQgPSAwOworCQlzaXplX3QgcmVhZFNpemUgPSBQQ0lFX1JFQURfTElNSVQ7CisJCXNpemVfdCByZW1haW5kZXIgPSAwOworCQlpZiAoY291bnQgPiBQQ0lFX1JFQURfTElNSVQpIHsKKwkJCXdoaWxlICgoYW1vdW50X3JlYWQgPCBjb3VudCkgJiYgKDAgPT0gcmVzdWx0KSkgeworCQkJCXJlc3VsdCA9IGhpZl9kaWFnX3JlYWRfbWVtKHNjbiwgcG9zLAorCQkJCQkJCSAgIGJ1ZmZlciwgcmVhZFNpemUpOworCQkJCWlmICgwID09IHJlc3VsdCkgeworCQkJCQlidWZmZXIgKz0gcmVhZFNpemU7CisJCQkJCXBvcyArPSByZWFkU2l6ZTsKKwkJCQkJYW1vdW50X3JlYWQgKz0gcmVhZFNpemU7CisJCQkJCXJlbWFpbmRlciA9IGNvdW50IC0gYW1vdW50X3JlYWQ7CisJCQkJCWlmIChyZW1haW5kZXIgPCBQQ0lFX1JFQURfTElNSVQpCisJCQkJCQlyZWFkU2l6ZSA9IHJlbWFpbmRlcjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCXJlc3VsdCA9IGhpZl9kaWFnX3JlYWRfbWVtKHNjbiwgcG9zLAorCQkJCQkgICBidWZmZXIsIGNvdW50KTsKKwkJfQorCX0KKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gY291bnQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBvbF9hdGhfZ2V0X3JlZ190YWJsZSh1aW50MzJfdCB0YXJnZXRfdmVyc2lvbiwKKwkJCQl0Z3RfcmVnX3RhYmxlICpyZWdfdGFibGUpCit7CisJaW50IHNlY3Rpb25fbGVuID0gMDsKKworCWlmICghcmVnX3RhYmxlKSB7CisJCWNkZl9hc3NlcnQoMCk7CisJCXJldHVybiBzZWN0aW9uX2xlbjsKKwl9CisKKwlzd2l0Y2ggKHRhcmdldF92ZXJzaW9uKSB7CisJY2FzZSBBUjYzMjBfUkVWMl8xX1ZFUlNJT046CisJCXJlZ190YWJsZS0+c2VjdGlvbiA9CisJCQkodGd0X3JlZ19zZWN0aW9uICopICZhcjYzMjB2Ml9yZWdfdGFibGVbMF07CisJCXJlZ190YWJsZS0+c2VjdGlvbl9zaXplID0gc2l6ZW9mKGFyNjMyMHYyX3JlZ190YWJsZSkKKwkJCQkJICAvIHNpemVvZihhcjYzMjB2Ml9yZWdfdGFibGVbMF0pOworCQlzZWN0aW9uX2xlbiA9IEFSNjMyMF9SRVYyXzFfUkVHX1NJWkU7CisJCWJyZWFrOworCWNhc2UgQVI2MzIwX1JFVjNfVkVSU0lPTjoKKwljYXNlIEFSNjMyMF9SRVYzXzJfVkVSU0lPTjoKKwkJcmVnX3RhYmxlLT5zZWN0aW9uID0KKwkJCSh0Z3RfcmVnX3NlY3Rpb24gKikgJmFyNjMyMHYzX3JlZ190YWJsZVswXTsKKwkJcmVnX3RhYmxlLT5zZWN0aW9uX3NpemUgPSBzaXplb2YoYXI2MzIwdjNfcmVnX3RhYmxlKQorCQkJCQkgIC8gc2l6ZW9mKGFyNjMyMHYzX3JlZ190YWJsZVswXSk7CisJCXNlY3Rpb25fbGVuID0gQVI2MzIwX1JFVjNfUkVHX1NJWkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlZ190YWJsZS0+c2VjdGlvbiA9ICh2b2lkICopTlVMTDsKKwkJcmVnX3RhYmxlLT5zZWN0aW9uX3NpemUgPSAwOworCQlzZWN0aW9uX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIHNlY3Rpb25fbGVuOworfQorCitzdGF0aWMgaW50IG9sX2RpYWdfcmVhZF9yZWdfbG9jKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB1aW50OF90ICpidWZmZXIsCisJCQkJdWludDMyX3QgYnVmZmVyX2xlbikKK3sKKwlpbnQgaSwgbGVuLCBzZWN0aW9uX2xlbiwgZmlsbF9sZW47CisJaW50IGR1bXBfbGVuLCByZXN1bHQgPSAwOworCXRndF9yZWdfdGFibGUgcmVnX3RhYmxlOworCXRndF9yZWdfc2VjdGlvbiAqY3Vycl9zZWMsICpuZXh0X3NlYzsKKworCXNlY3Rpb25fbGVuID0gb2xfYXRoX2dldF9yZWdfdGFibGUoc2NuLT50YXJnZXRfdmVyc2lvbiwgJnJlZ190YWJsZSk7CisKKwlpZiAoIXJlZ190YWJsZS5zZWN0aW9uIHx8ICFyZWdfdGFibGUuc2VjdGlvbl9zaXplIHx8ICFzZWN0aW9uX2xlbikgeworCQlCTUlfRVJSKCIlczogZmFpbGVkIHRvIGdldCByZWcgdGFibGUiLCBfX2Z1bmNfXyk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWN1cnJfc2VjID0gcmVnX3RhYmxlLnNlY3Rpb247CisJZm9yIChpID0gMDsgaSA8IHJlZ190YWJsZS5zZWN0aW9uX3NpemU7IGkrKykgeworCisJCWR1bXBfbGVuID0gY3Vycl9zZWMtPmVuZF9hZGRyIC0gY3Vycl9zZWMtPnN0YXJ0X2FkZHI7CisKKwkJaWYgKChidWZmZXJfbGVuIC0gcmVzdWx0KSA8IGR1bXBfbGVuKSB7CisJCQlCTUlfRVJSKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBkdW1wIHRoZSByZWdpc3RlcnM6IgorCQkJICAgICAgICIgJWQ6IDB4JTA4eC0weCUwOHgiLCBpLAorCQkJICAgICAgIGN1cnJfc2VjLT5zdGFydF9hZGRyLCBjdXJyX3NlYy0+ZW5kX2FkZHIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlsZW4gPSBvbF9kaWFnX3JlYWQoc2NuLCBidWZmZXIsIGN1cnJfc2VjLT5zdGFydF9hZGRyLCBkdW1wX2xlbik7CisKKwkJaWYgKGxlbiAhPSAtRUlPKSB7CisJCQlidWZmZXIgKz0gbGVuOworCQkJcmVzdWx0ICs9IGxlbjsKKwkJfSBlbHNlIHsKKwkJCUJNSV9FUlIoIiVzOiBjYW4ndCByZWFkIHJlZyAweCUwOHggbGVuID0gJWQiLAorCQkJCV9fZnVuY19fLCBjdXJyX3NlYy0+c3RhcnRfYWRkciwgZHVtcF9sZW4pOworCQkJcmVzdWx0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHJlc3VsdCA8IHNlY3Rpb25fbGVuKSB7CisJCQluZXh0X3NlYyA9ICh0Z3RfcmVnX3NlY3Rpb24gKikgKCh1aW50OF90ICopIGN1cnJfc2VjCisJCQkJCQkJKyBzaXplb2YoKmN1cnJfc2VjKSk7CisJCQlmaWxsX2xlbiA9IG5leHRfc2VjLT5zdGFydF9hZGRyIC0gY3Vycl9zZWMtPmVuZF9hZGRyOworCQkJaWYgKChidWZmZXJfbGVuIC0gcmVzdWx0KSA8IGZpbGxfbGVuKSB7CisJCQkJQk1JX0VSUigiTm90IGVub3VnaCBtZW1vcnkgdG8gZmlsbCByZWdpc3RlcnM6IgorCQkJCSAgICAgICAiICVkOiAweCUwOHgtMHglMDh4IiwgaSwKKwkJCQkgICAgICAgY3Vycl9zZWMtPmVuZF9hZGRyLAorCQkJCSAgICAgICBuZXh0X3NlYy0+c3RhcnRfYWRkcik7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWlmIChmaWxsX2xlbikgeworCQkJCWJ1ZmZlciArPSBmaWxsX2xlbjsKKwkJCQlyZXN1bHQgKz0gZmlsbF9sZW47CisJCQl9CisJCX0KKwkJY3Vycl9zZWMrKzsKKwl9CisKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIG9sX2R1bXBfdGFyZ2V0X21lbW9yeShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdm9pZCAqbWVtb3J5X2Jsb2NrKQoreworCWNoYXIgKmJ1ZmZlcl9sb2MgPSBtZW1vcnlfYmxvY2s7CisJdV9pbnQzMl90IHNlY3Rpb25fY291bnQgPSAwOworCXVfaW50MzJfdCBhZGRyZXNzID0gMDsKKwl1X2ludDMyX3Qgc2l6ZSA9IDA7CisKKwlmb3IgKDsgc2VjdGlvbl9jb3VudCA8IDI7IHNlY3Rpb25fY291bnQrKykgeworCQlzd2l0Y2ggKHNlY3Rpb25fY291bnQpIHsKKwkJY2FzZSAwOgorCQkJYWRkcmVzcyA9IERSQU1fTE9DQUxfQkFTRV9BRERSOworCQkJc2l6ZSA9IERSQU1fU0laRTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlhZGRyZXNzID0gQVhJX0xPQ0FUSU9OOworCQkJc2l6ZSA9IEFYSV9TSVpFOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJaGlmX2R1bXBfdGFyZ2V0X21lbW9yeShzY24sIGJ1ZmZlcl9sb2MsIGFkZHJlc3MsIHNpemUpOworCQlidWZmZXJfbG9jICs9IHNpemU7CisJfQorfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogICBcYnJpZWYgIG9sX3RhcmdldF9jb3JlZHVtcAorKgorKiAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gY29yZSBkdW1wIGZvciB0aGUgdGFyZ2V0CisqCisqICAgXHBhcmFtOiAgIHNjbiAtIG9sX3NvZnRjIGhhbmRsZXIKKyogICAgICAgICAgICAgbWVtb3J5X2Jsb2NrIC0gbm9uLU5VTEwgcmVzZXJ2ZWQgbWVtb3J5IGxvY2F0aW9uCisqICAgICAgICAgICAgIGJsb2NrX2xlbiAtIHNpemUgb2YgdGhlIGR1bXAgdG8gY29sbGVjdAorKgorKiAgIFxyZXR1cm46ICBOb25lCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgb2xfdGFyZ2V0X2NvcmVkdW1wKHZvaWQgKmluc3QsIHZvaWQgKm1lbW9yeV9ibG9jaywKKwkJCQkJdWludDMyX3QgYmxvY2tfbGVuKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gKHN0cnVjdCBvbF9zb2Z0YyAqKWluc3Q7CisJaW50OF90ICpidWZmZXJfbG9jID0gbWVtb3J5X2Jsb2NrOworCWludCByZXN1bHQgPSAwOworCWludCByZXQgPSAwOworCXVpbnQzMl90IGFtb3VudF9yZWFkID0gMDsKKwl1aW50MzJfdCBzZWN0aW9uX2NvdW50ID0gMDsKKwl1aW50MzJfdCBwb3MgPSAwOworCXVpbnQzMl90IHJlYWRfbGVuID0gMDsKKworCS8qCisJICogU0VDVElPTiA9IERSQU0KKwkgKiBTVEFSVCAgID0gMHgwMDQwMDAwMAorCSAqIExFTkdUSCAgPSAweDAwMGE4MDAwCisJICoKKwkgKiBTRUNUSU9OID0gQVhJCisJICogU1RBUlQgICA9IDB4MDAwYTAwMDAKKwkgKiBMRU5HVEggID0gMHgwMDAxODAwMAorCSAqCisJICogU0VDVElPTiA9IFJFRworCSAqIFNUQVJUICAgPSAweDAwMDAwODAwCisJICogTEVOR1RIICA9IDB4MDAwN0Y4MjAKKwkgKi8KKworCXdoaWxlICgoc2VjdGlvbl9jb3VudCA8IDMpICYmIChhbW91bnRfcmVhZCA8IGJsb2NrX2xlbikpIHsKKwkJc3dpdGNoIChzZWN0aW9uX2NvdW50KSB7CisJCWNhc2UgMDoKKwkJCS8qIERSQU0gU0VDVElPTiAqLworCQkJcG9zID0gRFJBTV9MT0NBVElPTjsKKwkJCXJlYWRfbGVuID0gRFJBTV9TSVpFOworCQkJQk1JX0VSUigiJXM6IER1bXBpbmcgRFJBTSBzZWN0aW9uLi4uIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCS8qIEFYSSBTRUNUSU9OICovCisJCQlwb3MgPSBBWElfTE9DQVRJT047CisJCQlyZWFkX2xlbiA9IEFYSV9TSVpFOworCQkJQk1JX0VSUigiJXM6IER1bXBpbmcgQVhJIHNlY3Rpb24uLi4iLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJLyogUkVHIFNFQ1RJT04gKi8KKwkJCXBvcyA9IFJFR0lTVEVSX0xPQ0FUSU9OOworCQkJLyogb2xfZGlhZ19yZWFkX3JlZ19sb2MgY2hlY2tzIGZvciBidWZmZXIgb3ZlcnJ1biAqLworCQkJcmVhZF9sZW4gPSAwOworCQkJQk1JX0VSUigiJXM6IER1bXBpbmcgUmVnaXN0ZXIgc2VjdGlvbi4uLiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChibG9ja19sZW4gLSBhbW91bnRfcmVhZCkgPj0gcmVhZF9sZW4pIHsKKwkJCWlmIChwb3MgPT0gUkVHSVNURVJfTE9DQVRJT04pCisJCQkJcmVzdWx0ID0gb2xfZGlhZ19yZWFkX3JlZ19sb2Moc2NuLCBidWZmZXJfbG9jLAorCQkJCQkJCSAgICAgIGJsb2NrX2xlbiAtCisJCQkJCQkJICAgICAgYW1vdW50X3JlYWQpOworCQkJZWxzZQorCQkJCXJlc3VsdCA9IG9sX2RpYWdfcmVhZChzY24sIGJ1ZmZlcl9sb2MsCisJCQkJCSAgICAgIHBvcywgcmVhZF9sZW4pOworCQkJaWYgKHJlc3VsdCAhPSAtRUlPKSB7CisJCQkJYW1vdW50X3JlYWQgKz0gcmVzdWx0OworCQkJCWJ1ZmZlcl9sb2MgKz0gcmVzdWx0OworCQkJCXNlY3Rpb25fY291bnQrKzsKKwkJCX0gZWxzZSB7CisJCQkJQk1JX0VSUigiQ291bGQgbm90IHJlYWQgZHVtcCBzZWN0aW9uISIpOworCQkJCWR1bXBfY2VfcmVnaXN0ZXIoc2NuKTsKKwkJCQlkdW1wX2NlX2RlYnVnX3JlZ2lzdGVyKHNjbik7CisJCQkJb2xfZHVtcF90YXJnZXRfbWVtb3J5KHNjbiwgbWVtb3J5X2Jsb2NrKTsKKwkJCQlyZXQgPSAtRUFDQ0VTOworCQkJCWJyZWFrOyAgLyogQ291bGQgbm90IHJlYWQgdGhlIHNlY3Rpb24gKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUJNSV9FUlIoIkluc3VmZmljaWVudCByb29tIGluIGR1bXAgYnVmZmVyISIpOworCQkJYnJlYWs7ICAvKiBJbnN1ZmZpY2llbnQgcm9vbSBpbiBidWZmZXIgKi8KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIE1BWF9TVVBQT1JURURfUEVFUlNfUkVWMV8xIDE0CisjZGVmaW5lIE1BWF9TVVBQT1JURURfUEVFUlNfUkVWMV8zIDMyCisKK3VpbnQ4X3Qgb2xfZ2V0X251bWJlcl9vZl9wZWVyc19zdXBwb3J0ZWQoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDhfdCBtYXhfbm9fb2ZfcGVlcnMgPSAwOworCisJc3dpdGNoIChzY24tPnRhcmdldF92ZXJzaW9uKSB7CisJY2FzZSBBUjYzMjBfUkVWMV8xX1ZFUlNJT046CisJCWlmIChzY24tPm1heF9ub19vZl9wZWVycyA+IE1BWF9TVVBQT1JURURfUEVFUlNfUkVWMV8xKQorCQkJbWF4X25vX29mX3BlZXJzID0gTUFYX1NVUFBPUlRFRF9QRUVSU19SRVYxXzE7CisJCWVsc2UKKwkJCW1heF9ub19vZl9wZWVycyA9IHNjbi0+bWF4X25vX29mX3BlZXJzOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmIChzY24tPm1heF9ub19vZl9wZWVycyA+IE1BWF9TVVBQT1JURURfUEVFUlNfUkVWMV8zKQorCQkJbWF4X25vX29mX3BlZXJzID0gTUFYX1NVUFBPUlRFRF9QRUVSU19SRVYxXzM7CisJCWVsc2UKKwkJCW1heF9ub19vZl9wZWVycyA9IHNjbi0+bWF4X25vX29mX3BlZXJzOworCQlicmVhazsKKworCX0KKwlyZXR1cm4gbWF4X25vX29mX3BlZXJzOworfQpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvaW5jL2NkZl9hdG9taWMuaCBiL2NvcmUvY2RmL2luYy9jZGZfYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwZDRlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL2luYy9jZGZfYXRvbWljLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiBjZGZfYXRvbWljLmgKKyAqIFRoaXMgZmlsZSBhYnN0cmFjdHMgYW4gYXRvbWljIGNvdW50ZXIuCisgKi8KKworI2lmbmRlZiBfQ0RGX0FUT01JQ19ICisjZGVmaW5lIF9DREZfQVRPTUlDX0gKKworI2luY2x1ZGUgPGlfY2RmX2F0b21pYy5oPgorCisvKioKKyAqIGNkZl9hdG9taWNfdCAtIGF0b21pYyB0eXBlIG9mIHZhcmlhYmxlCisgKgorICogVXNlIHRoaXMgd2hlbiB5b3Ugd2FudCBhIHNpbXBsZSByZXNvdXJjZSBjb3VudGVyIGV0Yy4gd2hpY2ggaXMgYXRvbWljCisgKiBhY3Jvc3MgbXVsdGlwbGUgQ1BVJ3MuIFRoZXNlIG1heWJlIHNsb3dlciB0aGFuIHVzdWFsIGNvdW50ZXJzIG9uIHNvbWUKKyAqIHBsYXRmb3Jtcy9PUydlcywgc28gdXNlIHRoZW0gd2l0aCBjYXV0aW9uLgorICovCisKK3R5cGVkZWYgX19jZGZfYXRvbWljX3QgY2RmX2F0b21pY190OworCisvKioKKyAqIGNkZl9hdG9taWNfaW5pdCgpIC0gaW5pdGlhbGl6ZSBhbiBhdG9taWMgdHlwZSB2YXJpYWJsZQorICogQHY6CUEgcG9pbnRlciB0byBhbiBvcGFxdWUgYXRvbWljIHZhcmlhYmxlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfYXRvbWljX2luaXQoY2RmX2F0b21pY190ICp2KQoreworCV9fY2RmX2F0b21pY19pbml0KHYpOworfQorCisvKioKKyAqIGNkZl9hdG9taWNfcmVhZCgpIC0gcmVhZCB0aGUgdmFsdWUgb2YgYW4gYXRvbWljIHZhcmlhYmxlCisgKiBAdjoJQSBwb2ludGVyIHRvIGFuIG9wYXF1ZSBhdG9taWMgdmFyaWFibGUKKyAqCisgKiBSZXR1cm46IFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSB2YXJpYWJsZQorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNkZl9hdG9taWNfcmVhZChjZGZfYXRvbWljX3QgKnYpCit7CisJcmV0dXJuIF9fY2RmX2F0b21pY19yZWFkKHYpOworfQorCisvKioKKyAqIGNkZl9hdG9taWNfaW5jKCkgLSBpbmNyZW1lbnQgdGhlIHZhbHVlIG9mIGFuIGF0b21pYyB2YXJpYWJsZQorICogQHY6CUEgcG9pbnRlciB0byBhbiBvcGFxdWUgYXRvbWljIHZhcmlhYmxlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfYXRvbWljX2luYyhjZGZfYXRvbWljX3QgKnYpCit7CisJX19jZGZfYXRvbWljX2luYyh2KTsKK30KKworLyoqCisgKiBjZGZfYXRvbWljX2RlYygpIC0gZGVjcmVtZW50IHRoZSB2YWx1ZSBvZiBhbiBhdG9taWMgdmFyaWFibGUKKyAqIEB2OglBIHBvaW50ZXIgdG8gYW4gb3BhcXVlIGF0b21pYyB2YXJpYWJsZQorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX2F0b21pY19kZWMoY2RmX2F0b21pY190ICp2KQoreworCV9fY2RmX2F0b21pY19kZWModik7Cit9CisKKy8qKgorICogY2RmX2F0b21pY19hZGQoKSAtIGFkZCBhIHZhbHVlIHRvIHRoZSB2YWx1ZSBvZiBhbiBhdG9taWMgdmFyaWFibGUKKyAqIEB2OglBIHBvaW50ZXIgdG8gYW4gb3BhcXVlIGF0b21pYyB2YXJpYWJsZQorICogQGk6CVRoZSBhbW91bnQgYnkgd2hpY2ggdG8gaW5jcmVhc2UgdGhlIGF0b21pYyBjb3VudGVyCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfYXRvbWljX2FkZChpbnQgaSwgY2RmX2F0b21pY190ICp2KQoreworCV9fY2RmX2F0b21pY19hZGQoaSwgdik7Cit9CisKKy8qKgorICogY2RmX2F0b21pY19kZWNfYW5kX3Rlc3QoKSAtIGRlY3JlbWVudCBhbiBhdG9taWMgdmFyaWFibGUgYW5kIGNoZWNrIGlmIHRoZQorICoJCQkJbmV3IHZhbHVlIGlzIHplcm8KKyAqIEB2OiBBIHBvaW50ZXIgdG8gYW4gb3BhcXVlIGF0b21pYyB2YXJpYWJsZQorICoKKyAqIFJldHVybjoKKyAqICAgIHRydWUgKG5vbi16ZXJvKSBpZiB0aGUgbmV3IHZhbHVlIGlzIHplcm8sCisgKiAgICBvciBmYWxzZSAoMCkgaWYgdGhlIG5ldyB2YWx1ZSBpcyBub24temVybworICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNkZl9hdG9taWNfZGVjX2FuZF90ZXN0KGNkZl9hdG9taWNfdCAqdikKK3sKKwlyZXR1cm4gX19jZGZfYXRvbWljX2RlY19hbmRfdGVzdCh2KTsKK30KKworLyoqCisgKiBjZGZfYXRvbWljX3NldCgpIC0gc2V0IGEgdmFsdWUgdG8gdGhlIHZhbHVlIG9mIGFuIGF0b21pYyB2YXJpYWJsZQorICogQHY6IEEgcG9pbnRlciB0byBhbiBvcGFxdWUgYXRvbWljIHZhcmlhYmxlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfYXRvbWljX3NldChjZGZfYXRvbWljX3QgKnYsIGludCBpKQoreworCV9fY2RmX2F0b21pY19zZXQodiwgaSk7Cit9CisKKy8qKgorICogY2RmX2F0b21pY19pbmNfcmV0dXJuKCkgLSByZXR1cm4gdGhlIGluY3JlbWVudGVkIHZhbHVlIG9mIGFuIGF0b21pYyB2YXJpYWJsZQorICogQHY6IEEgcG9pbnRlciB0byBhbiBvcGFxdWUgYXRvbWljIHZhcmlhYmxlCisgKgorICogUmV0dXJuOiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdmFyaWFibGUKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBjZGZfYXRvbWljX2luY19yZXR1cm4oY2RmX2F0b21pY190ICp2KQoreworCXJldHVybiBfX2NkZl9hdG9taWNfaW5jX3JldHVybih2KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9pbmMvY2RmX2RlZmVyLmggYi9jb3JlL2NkZi9pbmMvY2RmX2RlZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1MjdmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL2luYy9jZGZfZGVmZXIuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiBjZGZfZGVmZXIuaAorICogVGhpcyBmaWxlIGFic3RyYWN0cyBkZWZlcnJlZCBleGVjdXRpb24gY29udGV4dHMuCisgKi8KKworI2lmbmRlZiBfX0NERl9ERUZFUl9ICisjZGVmaW5lIF9fQ0RGX0RFRkVSX0gKKworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGlfY2RmX2RlZmVyLmg+CisKKy8qKgorICogVGhpcyBpbXBsZW1lbnRzIHdvcmsgcXVldWVzICh3b3JrZXIgdGhyZWFkcywga2VybmVsIHRocmVhZHMgZXRjLikuCisgKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gY2FuY2VsIG9uIGEgc2NoZWR1bGVkIHdvcmsuIFlvdSBjYW5ub3QgZnJlZSBhIHdvcmsKKyAqIGl0ZW0gaWYgaXRzIHF1ZXVlZC4gWW91IGNhbm5vdCBrbm93IGlmIGEgd29yayBpdGVtIGlzIHF1ZXVlZCBvciBub3QgdW5sZXNzCisgKiBpdHMgcnVubmluZywgd2hlbmNlIHlvdSBrbm93IGl0cyBub3QgcXVldWVkLgorICoKKyAqIHNvIGlmLCBzYXksIGEgbW9kdWxlIGlzIGFza2VkIHRvIHVubG9hZCBpdHNlbGYsIGhvdyBleGFjdGx5IHdpbGwgaXQgbWFrZQorICogc3VyZSB0aGF0IHRoZSB3b3JrJ3Mgbm90IHF1ZXVlZCwgZm9yIE9TJ2VzIHRoYXQgZG9udCBwcm92aWRlIHN1Y2ggYQorICogbWVjaGFuaXNtPz8KKyAqLworCisvKiBjZGZfd29ya190IC0gcmVwcmVzZW50YXRpb24gb2YgYSB3b3JrIHF1ZXVlICovCit0eXBlZGVmIF9fY2RmX3dvcmtfdCBjZGZfd29ya190OworCisvKiBjZGZfd29ya190IC0gcmVwcmVzZW50YXRpb24gb2YgYSBib3R0b20gaGFsZiAqLwordHlwZWRlZiBfX2NkZl9iaF90IGNkZl9iaF90OworCisvKioKKyAqIGNkZl9jcmVhdGVfYmgoKSAtIHRoaXMgY3JlYXRlcyB0aGUgQm90dG9tIGhhbGYgZGVmZXJyZWQgaGFuZGxlcgorICogQGhkbDogICBPUyBoYW5kbGUKKyAqIEBiaDogICAgQm90dG9tIGluc3RhbmNlCisgKiBAZnVuYzogIEZ1bmMgZGVmZXJyZWQgZnVuY3Rpb24gdG8gcnVuIGF0IGJvdHRvbSBoYWxmIGludGVycnVwdAorICogICAgICAgICBjb250ZXh0CisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjZGZfY3JlYXRlX2JoKGNkZl9oYW5kbGVfdCBoZGwsIGNkZl9iaF90ICpiaCwgY2RmX2RlZmVyX2ZuX3QgZnVuYywgdm9pZCAqYXJnKQoreworCV9fY2RmX2luaXRfYmgoaGRsLCBiaCwgZnVuYywgYXJnKTsKK30KKworLyoqCisgKiBjZGZfc2NoZWRfYmgoKSAtIHNjaGVkdWxlIGEgYm90dG9tIGhhbGYgKERQQykKKyAqIEBoZGw6CU9TIGhhbmRsZQorICogQGJoOgkJQm90dG9tIGluc3RhbmNlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfc2NoZWRfYmgoY2RmX2hhbmRsZV90IGhkbCwgY2RmX2JoX3QgKmJoKQoreworCV9fY2RmX3NjaGVkX2JoKGhkbCwgYmgpOworfQorCisvKioKKyAqIGNkZl9kZXN0cm95X2JoKCkgLSBkZXN0cm95IGEgYm90dG9tIGhhbGYgKERQQykKKyAqIEBoZGw6CU9TIGhhbmRsZQorICogQGJoOgkJQm90dG9tIGluc3RhbmNlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfZGVzdHJveV9iaChjZGZfaGFuZGxlX3QgaGRsLCBjZGZfYmhfdCAqYmgpCit7CisJX19jZGZfZGlzYWJsZV9iaChoZGwsIGJoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKk5vbi1JbnRlcnJ1cHQgQ29udGV4dCBkZWZlcnJlZCBFeGVjdXRpb24qKioqKioqKioqKioqKiovCisKKy8qKgorICogY2RmX2NyZWF0ZV93b3JrKCkgLSBjcmVhdGUgYSB3b3JrL3Rhc2sgcXVldWUsIFRoaXMgcnVucyBpbiBub24taW50ZXJydXB0CisgKgkJICAgICAgIGNvbnRleHQsIHNvIGNhbiBiZSBwcmVlbXB0ZWQgYnkgSC9XICYgUy9XIGludHIKKyAqIEBoZGw6CU9TIGhhbmRsZQorICogQHdvcms6CVdvcmsgaW5zdGFuY2UKKyAqIEBmdW5jOglEZWZlcnJlZCBmdW5jdGlvbiB0byBydW4gYXQgYm90dG9tIGhhbGYgbm9uLWludGVycnVwdAorICoJCWNvbnRleHQKKyAqIEBhcmc6CUFyZ3VtZW50IGZvciB0aGUgZGVmZXJyZWQgZnVuY3Rpb24KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjZGZfY3JlYXRlX3dvcmsoY2RmX2hhbmRsZV90IGhkbCwgY2RmX3dvcmtfdCAqd29yaywKKwkJY2RmX2RlZmVyX2ZuX3QgZnVuYywgdm9pZCAqYXJnKQoreworCV9fY2RmX2luaXRfd29yayhoZGwsIHdvcmssIGZ1bmMsIGFyZyk7Cit9CisKKy8qKgorICogY2RmX3NjaGVkX3dvcmsoKSAtIHNjaGVkdWxlIGEgZGVmZXJyZWQgdGFzayBvbiBub24taW50ZXJydXB0IGNvbnRleHQKKyAqIEBoZGw6CU9TIGhhbmRsZQorICogQHdvcms6CVdvcmsgaW5zdGFuY2UKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNkZl9zY2hlZF93b3JrKGNkZl9oYW5kbGVfdCBoZGwsIGNkZl93b3JrX3QgKndvcmspCit7CisJX19jZGZfc2NoZWRfd29yayhoZGwsIHdvcmspOworfQorCisvKioKKyAqIGNkZl9kZXN0cm95X3dvcmsoKSAtICBkZXN0cm95IHRoZSBkZWZlcnJlZCB0YXNrIChzeW5jaHJvbm91cykKKyAqIEBoZGw6CU9TIGhhbmRsZQorICogQHdvcms6CVdvcmsgaW5zdGFuY2UKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNkZl9kZXN0cm95X3dvcmsoY2RmX2hhbmRsZV90IGhkbCwgY2RmX3dvcmtfdCAqd29yaykKK3sKKwlfX2NkZl9kaXNhYmxlX3dvcmsoaGRsLCB3b3JrKTsKK30KKworI2VuZGlmIC8qX19DREZfREVGRVJfSCovCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9pbmMvY2RmX2V2ZW50LmggYi9jb3JlL2NkZi9pbmMvY2RmX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4NTg4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL2luYy9jZGZfZXZlbnQuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKF9fQ0RGX0VWRU5UX0gpCisjZGVmaW5lIF9fQ0RGX0VWRU5UX0gKKworLyoqCisgKiBET0M6IGNkZl9ldmVudC5oCisgKgorICogQ29ubmVjdGl2aXR5IGRyaXZlciBmcmFtZXdvcmsgKENERikgZXZlbnRzIEFQSQorICoKKyAqKi8KKworLyogSW5jbHVkZSBGaWxlcyAqLworI2luY2x1ZGUgImNkZl9zdGF0dXMuaCIKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJpX2NkZl9ldmVudC5oIgorCisvKiBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbiAqLworCisvKioKKyAqIGNkZl9ldmVudF9pbml0KCkgLSBpbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGV2ZW50CisgKgorICogQGV2ZW50OglQb2ludGVyIHRvIENERiBldmVudCBvYmplY3QgdG8gaW5pdGlhbGl6ZQorICoKKyAqIEluaXRpYWxpemVzIHRoZSBzcGVjaWZpZWQgZXZlbnQuIFVwb24gc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbiB0aGUgc3RhdGUKKyAqIG9mIHRoZSBldmVudCBiZWNvbWVzIGluaXRpYWxpemVkIGFuZCBub3Qgc2lnbmFsZWQuCisgKgorICogUmV0dXJuOgorICogICAgQ0RGX1NUQVRVU19TVUNDRVNTIC0gRXZlbnQgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQgaXMgcmVhZHkgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQKKyAqICAgIE90aGVyd2lzZSBmYWlsdXJlIENERiByZWFzb24gY29kZQorICovCisKK0NERl9TVEFUVVMgY2RmX2V2ZW50X2luaXQoY2RmX2V2ZW50X3QgKmV2ZW50KTsKKworLyoqCisgKiBjZGZfZXZlbnRfc2V0KCkgLSAgc2V0IGEgQ0RGIGV2ZW50CisgKgorICogQGV2ZW50OglQb2ludGVyIG9mIENERiBldmVudCB0byBzZXQgdG8gdGhlIHNpZ25hbGxlZCBzdGF0ZQorICoKKyAqIFRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50IGlzIHNldCB0byAnc2lnbmFsbGVkIGJ5IGNhbGxpbmcKKyAqIGNkZl9ldmVudF9zZXQoKS4gIFRoZSBzdGF0ZSBvZiB0aGUgZXZlbnQgcmVtYWlucyBzaWduYWxsZWQgdW50aWwgYW4KKyAqIGV4cGxpY2l0IGNhbGwgdG8gY2RmX2V2ZW50X3Jlc2V0KCkuCisgKgorICogQW55IHRocmVhZHMgd2FpdGluZyBvbiB0aGUgZXZlbnQgYXMgYSByZXN1bHQgb2YgYSBjZGZfZXZlbnRfd2FpdCgpIHdpbGwKKyAqIGJlIHVuYmxvY2tlZCBhbmQgYXZhaWxhYmxlIHRvIGJlIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uIHdoZW4gdGhlIGV2ZW50CisgKiBpcyBzaWduYWxlZCBieSBhIGNhbGwgdG8gY2RmX2V2ZW50X3NldCgpLgorICoKKyAqIFJldHVybjoKKyAqICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTIC0gRXZlbnQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQKKyAqICAgICAgT3RoZXJ3aXNlIGZhaWx1cmUgQ0RGIHJlYXNvbiBjb2RlCisgKi8KK0NERl9TVEFUVVMgY2RmX2V2ZW50X3NldChjZGZfZXZlbnRfdCAqZXZlbnQpOworCisvKioKKyAqIGNkZl9ldmVudF9yZXNldCgpIC0gIHJlc2V0IGEgQ0RGIGV2ZW50CisgKgorICogQGV2ZW50OglQb2ludGVyIG9mIENERiBldmVudCB0byByZXNldAorICoKKyAqIFRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50IGlzIHNldCB0byAnTk9UIHNpZ25hbGxlZCcgYnkgY2FsbGluZworICogY2RmX2V2ZW50X3Jlc2V0KCkuICBUaGUgc3RhdGUgb2YgdGhlIGV2ZW50IHJlbWFpbnMgTk9UIHNpZ25hbGxlZCB1bnRpbCBhbgorICogZXhwbGljaXQgY2FsbCB0byBjZGZfZXZlbnRfc2V0KCkuCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBldmVudCB0byBhIE5PVCBzaWduYWxsZWQgc3RhdGUgZXZlbiBpZiB0aGUgZXZlbnQgd2FzCisgKiBzaWduYWxsZWQgbXVsdGlwbGUgdGltZXMgYmVmb3JlIGJlaW5nIHNpZ25hbGVkLgorICoKKyAqIFJldHVybjoKKyAqICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTIC0gRXZlbnQgd2FzIHN1Y2Nlc3NmdWxseSByZXNldAorICogICAgICBPdGhlcndpc2UgZmFpbHVyZSBDREYgcmVhc29uIGNvZGUKKyAqLworQ0RGX1NUQVRVUyBjZGZfZXZlbnRfcmVzZXQoY2RmX2V2ZW50X3QgKmV2ZW50KTsKKworLyoqCisgKiBjZGZfZXZlbnRfZGVzdHJveSgpIC0gIGRlc3Ryb3kgYSBDREYgZXZlbnQKKyAqCisgKiBAZXZlbnQ6CVBvaW50ZXIgb2YgQ0RGIGV2ZW50IHRvIGRlc3Ryb3kKKyAqCisgKiBUaGUgZnVuY3Rpb24gZGVzdHJveXMgdGhlIGV2ZW50IG9iamVjdCByZWZlcmVuY2VkIGJ5IGV2ZW50LgorICogQWZ0ZXIgYSBzdWNjZXNzZnVsIHJldHVybiBmcm9tIGNkZl9ldmVudF9kZXN0cm95KCkgdGhlIGV2ZW50IG9iamVjdCBiZWNvbWVzLAorICogaW4gZWZmZWN0LCB1bmluaXRpYWxpemVkLgorICoKKyAqIEEgZGVzdHJveWVkIGV2ZW50IG9iamVjdCBjYW4gYmUgcmVpbml0aWFsaXplZCB1c2luZyBjZGZfZXZlbnRfaW5pdCgpOworICogdGhlIHJlc3VsdHMgb2Ygb3RoZXJ3aXNlIHJlZmVyZW5jaW5nIHRoZSBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVzdHJveWVkCisgKiBhcmUgdW5kZWZpbmVkLiAgQ2FsbHMgdG8gQ0RGIGV2ZW50IGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHRoZSBsb2NrIHN1Y2gKKyAqIGFzIGNkZl9ldmVudF9zZXQoKSB3aWxsIGZhaWwgaWYgdGhlIGV2ZW50IGlzIGRlc3Ryb3llZC4gIFRoZXJlZm9yZSwKKyAqIGRvbid0IHVzZSB0aGUgZXZlbnQgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVzdHJveWVkIHVudGlsIGl0IGhhcworICogYmVlbiByZS1pbml0aWFsaXplZC4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgIENERl9TVEFUVVNfU1VDQ0VTUyAtIEV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgZGVzdHJveWVkCisgKiAgICAgIE90aGVyd2lzZSBmYWlsdXJlIENERiByZWFzb24gY29kZQorICovCitDREZfU1RBVFVTIGNkZl9ldmVudF9kZXN0cm95KGNkZl9ldmVudF90ICpldmVudCk7CisKKy8qKgorICogY2RmX3dhaXRfc2luZ2xlX2V2ZW50KCkgLSAgd2FpdCBmb3IgYSBzaW5nbGUgaW5wdXQgQ0RGIGV2ZW50IHRvIGJlIHNldAorICoKKyAqIEBldmVudDoJUG9pbnRlciBvZiBDREYgZXZlbnQgdG8gd2FpdCBvbgorICogQHRpbWVvdXQ6CVRpbWVvdXQgdmFsdWUgaW4gbWlsbGkgc2Vjb25kcworICoKKyAqIFRoaXMgQVBJIHdhaXRzIGZvciB0aGUgZXZlbnQgdG8gYmUgc2V0LiBUaGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIGlmIHRoaXMgaW50ZXJ2YWwgZWxhcHNlcywgcmVnYXJkbGVzcyBpZiBhbnkgb2YgdGhlIGV2ZW50cyBoYXZlCisgKiBiZWVuIHNldC4gIEFuIGlucHV0IHZhbHVlIG9mIDAgZm9yIHRoaXMgdGltZW91dCBwYXJhbWV0ZXIgbWVhbnMKKyAqIHRvIHdhaXQgaW5maW5pdGVseSwgbWVhbmluZyBhIHRpbWVvdXQgd2lsbCBuZXZlciBvY2N1ci4KKyAqCisgKgorICogUmV0dXJuOgorICogICAgQ0RGX1NUQVRVU19TVUNDRVNTIC0gdGhlIHdhaXQgd2FzIHNhdGlzaWZlZCBieSB0aGUgZXZlbnQgYmVpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4KKyAqCisgKiAgICBDREZfU1RBVFVTX0VfVElNRU9VVCAtIHRoZSB0aW1lb3V0IGludGVydmFsIGVsYXBzZWQgYmVmb3JlIHRoZQorICogICAgZXZlbnQgd2FzIHNldC4KKyAqCisgKiAgICBDREZfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IGV2ZW50IGlzIGludmFsaWQuCisgKi8KK0NERl9TVEFUVVMgY2RmX3dhaXRfc2luZ2xlX2V2ZW50KGNkZl9ldmVudF90ICpwRXZlbnQsCisJCQkJIHVpbnQzMl90IHRpbWVvdXQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworI2VuZGlmIC8qIF9fQ0RGX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RmL2luYy9jZGZfbGlzdC5oIGIvY29yZS9jZGYvaW5jL2NkZl9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiNzkzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL2luYy9jZGZfbGlzdC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoX19DREZfTElTVF9IKQorI2RlZmluZSBfX0NERl9MSVNUX0gKKworLyoqCisgKiAgRE9DOiBjZGZfbGlzdC5oCisgKgorICogIENvbm5lY3Rpdml0eSBkcml2ZXIgZnJhbWV3b3JrIChDREYpIGxpc3QgQVBJcworICoKKyAqICBEZWZpbml0aW9ucyBmb3IgQ0RGIExpbmtlZCBMaXN0cyBBUEkKKyAqCisgKiAgTGlzdHMgYXJlIGltcGxlbWVudGVkIGFzIGEgZG91Ymx5IGxpbmtlZCBsaXN0LiBBbiBpdGVtIGluIGEgbGlzdCBjYW4KKyAqICBiZSBvZiBhbnkgdHlwZSBhcyBsb25nIGFzIHRoZSBkYXRhdHlwZSBjb250YWlucyBhIGZpZWxkIG9mIHR5cGUKKyAqICBjZGZfbGlua190LgorICoKKyAqICBJbiBnZW5lcmFsLCBhIGxpc3QgaXMgYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgaXRlbXMgd2l0aCBhIHBvaW50ZXIKKyAqICB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgYW5kIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgVGhlCisgKiAgbGlzdCBpdGVtcyBjb250YWluIGEgZm9yd2FyZCBhbmQgYmFjayBsaW5rLgorICoKKyAqICBDREYgbGlua2VkIGxpc3QgQVBJcyBhcmUgTk9UIHRocmVhZCBzYWZlIHNvIG1ha2Ugc3VyZSB0byB1c2UgYXBwcm9wcmlhdGUKKyAqICBsb2NraW5nIG1lY2hhbmlzbXMgdG8gYXNzdXJlIG9wZXJhdGlvbnMgb24gdGhlIGxpc3QgYXJlIHRocmVhZCBzYWZlLgorICovCisKKy8qIEluY2x1ZGUgRmlsZXMgKi8KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpbmNsdWRlIDxjZGZfc3RhdHVzLmg+CisjaW5jbHVkZSA8Y2RmX3RyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisvKiBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cyAqLworCisvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCit0eXBlZGVmIHN0cnVjdCBsaXN0X2hlYWQgY2RmX2xpc3Rfbm9kZV90OworCit0eXBlZGVmIHN0cnVjdCBjZGZfbGlzdF9zIHsKKwljZGZfbGlzdF9ub2RlX3QgYW5jaG9yOworCXVpbnQzMl90IGNvdW50OworCXVpbnQzMl90IG1heF9zaXplOworfSBjZGZfbGlzdF90OworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKworQ0RGX0lOTElORV9GTiB2b2lkIGNkZl9saXN0X2luaXQoY2RmX2xpc3RfdCAqcF9saXN0LCB1aW50MzJfdCBtYXhfc2l6ZSkKK3sKKwlJTklUX0xJU1RfSEVBRCgmcF9saXN0LT5hbmNob3IpOworCXBfbGlzdC0+Y291bnQgPSAwOworCXBfbGlzdC0+bWF4X3NpemUgPSBtYXhfc2l6ZTsKK30KKworQ0RGX0lOTElORV9GTiB2b2lkIGNkZl9saXN0X2Rlc3Ryb3koY2RmX2xpc3RfdCAqcF9saXN0KQoreworCWlmIChwX2xpc3QtPmNvdW50ICE9IDApIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogbGlzdCBsZW5ndGggbm90IGVxdWFsIHRvIHplcm8iLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJfQorfQorCitDREZfSU5MSU5FX0ZOIHZvaWQgY2RmX2xpc3Rfc2l6ZShjZGZfbGlzdF90ICpwX2xpc3QsIHVpbnQzMl90ICpwX3NpemUpCit7CisJKnBfc2l6ZSA9IHBfbGlzdC0+Y291bnQ7Cit9CisKK0NERl9TVEFUVVMgY2RmX2xpc3RfaW5zZXJ0X2Zyb250KGNkZl9saXN0X3QgKnBfbGlzdCwgY2RmX2xpc3Rfbm9kZV90ICpwX25vZGUpOworCitDREZfU1RBVFVTIGNkZl9saXN0X2luc2VydF9iYWNrKGNkZl9saXN0X3QgKnBfbGlzdCwgY2RmX2xpc3Rfbm9kZV90ICpwX25vZGUpOworCitDREZfU1RBVFVTIGNkZl9saXN0X2luc2VydF9iYWNrX3NpemUoY2RmX2xpc3RfdCAqcF9saXN0LAorCQkJCSAgICAgY2RmX2xpc3Rfbm9kZV90ICpwX25vZGUsIHVpbnQzMl90ICpwX3NpemUpOworCitDREZfU1RBVFVTIGNkZl9saXN0X3JlbW92ZV9mcm9udChjZGZfbGlzdF90ICpwX2xpc3QsIGNkZl9saXN0X25vZGVfdCAqKnBwX25vZGUpOworCitDREZfU1RBVFVTIGNkZl9saXN0X3JlbW92ZV9iYWNrKGNkZl9saXN0X3QgKnBfbGlzdCwgY2RmX2xpc3Rfbm9kZV90ICoqcHBfbm9kZSk7CisKK0NERl9TVEFUVVMgY2RmX2xpc3RfcGVla19mcm9udChjZGZfbGlzdF90ICpwX2xpc3QsIGNkZl9saXN0X25vZGVfdCAqKnBwX25vZGUpOworCitDREZfU1RBVFVTIGNkZl9saXN0X3BlZWtfbmV4dChjZGZfbGlzdF90ICpwX2xpc3QsIGNkZl9saXN0X25vZGVfdCAqcF9ub2RlLAorCQkJICAgICAgY2RmX2xpc3Rfbm9kZV90ICoqcHBfbm9kZSk7CisKK0NERl9TVEFUVVMgY2RmX2xpc3RfcmVtb3ZlX25vZGUoY2RmX2xpc3RfdCAqcF9saXN0LAorCQkJCWNkZl9saXN0X25vZGVfdCAqcF9ub2RlX3RvX3JlbW92ZSk7CisKKyNlbmRpZiAvKiBfX0NERl9MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RmL2luYy9jZGZfbG9jay5oIGIvY29yZS9jZGYvaW5jL2NkZl9sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmZDE2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL2luYy9jZGZfbG9jay5oCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoX19DREZfTE9DS19IKQorI2RlZmluZSBfX0NERl9MT0NLX0gKKworLyoqCisgKgorICogQGZpbGUgIGNkZl9sb2NrLmgKKyAqCisgKiBAYnJpZWYgQ29ubmVjdGl2aXR5IGRyaXZlciBmcmFtZXdvcmsgKENERikgbG9jayBBUElzCisgKgorICogRGVmaW5pdGlvbnMgZm9yIENERiBsb2NrcworICoKKyAqLworCisvKiBJbmNsdWRlIEZpbGVzICovCisjaW5jbHVkZSAiY2RmX3N0YXR1cy5oIgorI2luY2x1ZGUgImlfY2RmX2xvY2suaCIKKworLyogUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMgKi8KKworLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKy8qKgorICogQGJyaWVmIFBsYXRmb3JtIHNwaW5sb2NrIG9iamVjdAorICovCit0eXBlZGVmIF9fY2RmX3NwaW5sb2NrX3QgY2RmX3NwaW5sb2NrX3Q7CisvKioKKyAqIEBicmllZiBQbGF0Zm9ybSBtdXRleCBvYmplY3QKKyAqLwordHlwZWRlZiBfX2NkZl9zZW1hcGhvcmVfdCBjZGZfc2VtYXBob3JlX3Q7CisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uICovCisKKy8qKgorICogY2RmX3NlbWFwaG9yZV9pbml0KCkgLSBpbml0aWFsaXplIGEgc2VtYXBob3JlCisgKiBAbTogIFNlbWFwaG9yZSB0byBpbml0aWFsaXplCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGNkZl9zZW1hcGhvcmVfaW5pdChjZGZfc2VtYXBob3JlX3QgKm0pCit7CisJX19jZGZfc2VtYXBob3JlX2luaXQobSk7Cit9CisKKy8qKgorICogY2RmX3NlbWFwaG9yZV9hY3F1aXJlKCkgLSB0YWtlIHRoZSBzZW1hcGhvcmUKKyAqIEBtOiAgU2VtYXBob3JlIHRvIHRha2UKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIGlubGluZSBpbnQgY2RmX3NlbWFwaG9yZV9hY3F1aXJlKGNkZl9kZXZpY2VfdCBvc2RldiwgY2RmX3NlbWFwaG9yZV90ICptKQoreworCXJldHVybiBfX2NkZl9zZW1hcGhvcmVfYWNxdWlyZShvc2RldiwgbSk7Cit9CisKKy8qKgorICogY2RmX3NlbWFwaG9yZV9yZWxlYXNlICgpIC0gZ2l2ZSB0aGUgc2VtYXBob3JlCisgKiBAbTogIFNlbWFwaG9yZSB0byBnaXZlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorY2RmX3NlbWFwaG9yZV9yZWxlYXNlKGNkZl9kZXZpY2VfdCBvc2RldiwgY2RmX3NlbWFwaG9yZV90ICptKQoreworCV9fY2RmX3NlbWFwaG9yZV9yZWxlYXNlKG9zZGV2LCBtKTsKK30KKworLyoqCisgKiBjZGZfbXV0ZXhfaW5pdCgpIC0gaW5pdGlhbGl6ZSBhIENERiBsb2NrCisgKiBAbG9jazoJIFBvaW50ZXIgdG8gdGhlIG9wYXF1ZSBsb2NrIG9iamVjdCB0byBpbml0aWFsaXplCisgKgorICogY2RmX211dGV4X2luaXQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGxvY2suIFVwb24KKyAqIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24sIHRoZSBzdGF0ZSBvZiB0aGUgbG9jayBiZWNvbWVzIGluaXRpYWxpemVkCisgKiBhbmQgdW5sb2NrZWQuCisgKgorICogQSBsb2NrIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBjZGZfbXV0ZXhfaW5pdCgpIGJlZm9yZSBpdAorICogbWF5IGJlIHVzZWQgaW4gYW55IG90aGVyIGxvY2sgZnVuY3Rpb25zLgorICoKKyAqIEF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSBhbiBhbHJlYWR5IGluaXRpYWxpemVkIGxvY2sgcmVzdWx0cyBpbgorICogYSBmYWlsdXJlLgorICoKKyAqIFJldHVybjoKKyAqCUNERl9TVEFUVVNfU1VDQ0VTUzoJbG9jayB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkCisgKglDREYgZmFpbHVyZSByZWFzb24gY29kZXM6IGxvY2sgaXMgbm90IGluaXRpYWxpemVkIGFuZCBjYW4ndCBiZSB1c2VkCisgKi8KK0NERl9TVEFUVVMgY2RmX211dGV4X2luaXQoY2RmX211dGV4X3QgKmxvY2spOworCisvKioKKyAqIGNkZl9tdXRleF9hY3F1aXJlICgpIC0gYWNxdWlyZSBhIENERiBsb2NrCisgKiBAbG9jazoJIFBvaW50ZXIgdG8gdGhlIG9wYXF1ZSBsb2NrIG9iamVjdCB0byBhY3F1aXJlCisgKgorICogQSBsb2NrIG9iamVjdCBpcyBhY3F1aXJlZCBieSBjYWxsaW5nIGNkZl9tdXRleF9hY3F1aXJlKCkuICBJZiB0aGUgbG9jaworICogaXMgYWxyZWFkeSBsb2NrZWQsIHRoZSBjYWxsaW5nIHRocmVhZCBzaGFsbCBibG9jayB1bnRpbCB0aGUgbG9jayBiZWNvbWVzCisgKiBhdmFpbGFibGUuIFRoaXMgb3BlcmF0aW9uIHNoYWxsIHJldHVybiB3aXRoIHRoZSBsb2NrIG9iamVjdCByZWZlcmVuY2VkIGJ5CisgKiBsb2NrIGluIHRoZSBsb2NrZWQgc3RhdGUgd2l0aCB0aGUgY2FsbGluZyB0aHJlYWQgYXMgaXRzIG93bmVyLgorICoKKyAqIFJldHVybjoKKyAqCUNERl9TVEFUVVNfU1VDQ0VTUzoJbG9jayB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkCisgKglDREYgZmFpbHVyZSByZWFzb24gY29kZXM6IGxvY2sgaXMgbm90IGluaXRpYWxpemVkIGFuZCBjYW4ndCBiZSB1c2VkCisgKi8KK0NERl9TVEFUVVMgY2RmX211dGV4X2FjcXVpcmUoY2RmX211dGV4X3QgKmxvY2spOworCisvKioKKyAqIGNkZl9tdXRleF9yZWxlYXNlKCkgLSByZWxlYXNlIGEgQ0RGIGxvY2sKKyAqIEBsb2NrOgkgUG9pbnRlciB0byB0aGUgb3BhcXVlIGxvY2sgb2JqZWN0IHRvIGJlIHJlbGVhc2VkCisgKgorICogY2RmX211dGV4X3JlbGVhc2UoKSBmdW5jdGlvbiBzaGFsbCByZWxlYXNlIHRoZSBsb2NrIG9iamVjdAorICogcmVmZXJlbmNlZCBieSAnbG9jaycuCisgKgorICogSWYgYSB0aHJlYWQgYXR0ZW1wdHMgdG8gcmVsZWFzZSBhIGxvY2sgdGhhdCBpdCB1bmxvY2tlZCBvciBpcyBub3QKKyAqIGluaXRpYWxpemVkLCBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAqCisgKiBSZXR1cm46CisgKglDREZfU1RBVFVTX1NVQ0NFU1M6CWxvY2sgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZAorICoJQ0RGIGZhaWx1cmUgcmVhc29uIGNvZGVzOiBsb2NrIGlzIG5vdCBpbml0aWFsaXplZCBhbmQgY2FuJ3QgYmUgdXNlZAorICovCitDREZfU1RBVFVTIGNkZl9tdXRleF9yZWxlYXNlKGNkZl9tdXRleF90ICpsb2NrKTsKKworLyoqCisgKiBjZGZfbXV0ZXhfZGVzdHJveSgpIC0gZGVzdHJveSBhIENERiBsb2NrCisgKiBAbG9jazoJIFBvaW50ZXIgdG8gdGhlIG9wYXF1ZSBsb2NrIG9iamVjdCB0byBiZSBkZXN0cm95ZWQKKyAqCisgKiBjZGZfbXV0ZXhfZGVzdHJveSgpIGZ1bmN0aW9uIHNoYWxsIGRlc3Ryb3kgdGhlIGxvY2sgb2JqZWN0CisgKiByZWZlcmVuY2VkIGJ5IGxvY2suICBBZnRlciBhIHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gXGEgY2RmX211dGV4X2Rlc3Ryb3koKQorICogdGhlIGxvY2sgb2JqZWN0IGJlY29tZXMsIGluIGVmZmVjdCwgdW5pbml0aWFsaXplZC4KKyAqCisgKiBBIGRlc3Ryb3llZCBsb2NrIG9iamVjdCBjYW4gYmUgcmVpbml0aWFsaXplZCB1c2luZyBjZGZfbXV0ZXhfaW5pdCgpOworICogdGhlIHJlc3VsdHMgb2Ygb3RoZXJ3aXNlIHJlZmVyZW5jaW5nIHRoZSBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVzdHJveWVkCisgKiBhcmUgdW5kZWZpbmVkLiAgQ2FsbHMgdG8gQ0RGIGxvY2sgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdGhlIGxvY2sgc3VjaAorICogYXMgY2RmX211dGV4X2FjcXVpcmUoKSB3aWxsIGZhaWwgaWYgdGhlIGxvY2sgaXMgZGVzdHJveWVkLiAgVGhlcmVmb3JlLAorICogZG9uJ3QgdXNlIHRoZSBsb2NrIGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCB1bnRpbCBpdCBoYXMKKyAqIGJlZW4gcmUtaW5pdGlhbGl6ZWQuCisgKgorICogUmV0dXJuOgorICoJQ0RGX1NUQVRVU19TVUNDRVNTOglsb2NrIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQKKyAqCUNERiBmYWlsdXJlIHJlYXNvbiBjb2RlczogbG9jayBpcyBub3QgaW5pdGlhbGl6ZWQgYW5kIGNhbid0IGJlIHVzZWQKKyAqLworQ0RGX1NUQVRVUyBjZGZfbXV0ZXhfZGVzdHJveShjZGZfbXV0ZXhfdCAqbG9jayk7CisKKy8qKgorICogY2RmX3NwaW5sb2NrX2luaXQoKSAtIGluaXRpYWxpemUgYSBzcGlubG9jaworICogQGxvY2s6IFNwaW5sb2NrIG9iamVjdCBwb2ludGVyCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfc3BpbmxvY2tfaW5pdChjZGZfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlfX2NkZl9zcGlubG9ja19pbml0KGxvY2spOworfQorCisvKioKKyAqIGNkZl9zcGlubG9ja19kZXN0cm95KCkgLSBkZWxldGUgYSBzcGlubG9jaworICogQGxvY2s6IFNwaW5sb2NrIG9iamVjdCBwb2ludGVyCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfc3BpbmxvY2tfZGVzdHJveShjZGZfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlfX2NkZl9zcGlubG9ja19kZXN0cm95KGxvY2spOworfQorCisvKioKKyAqIGNkZl9zcGluX2xvY2tfYmgoKSAtIGxvY2tzIHRoZSBzcGlubG9jayBzZW1hcGhvcmUgaW4gc29mdCBpcnEgY29udGV4dAorICogQGxvY2s6IFNwaW5sb2NrIG9iamVjdCBwb2ludGVyCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfc3Bpbl9sb2NrX2JoKGNkZl9zcGlubG9ja190ICpsb2NrKQoreworCV9fY2RmX3NwaW5fbG9ja19iaChsb2NrKTsKK30KKworLyoqCisgKiBjZGZfc3Bpbl9sb2NrX2JoKCkgLSB1bmxvY2tzIHRoZSBzcGlubG9jayBzZW1hcGhvcmUgaW4gc29mdCBpcnEgY29udGV4dAorICogQGxvY2s6IFNwaW5sb2NrIG9iamVjdCBwb2ludGVyCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfc3Bpbl91bmxvY2tfYmgoY2RmX3NwaW5sb2NrX3QgKmxvY2spCit7CisJX19jZGZfc3Bpbl91bmxvY2tfYmgobG9jayk7Cit9CisKKy8qKgorICogY2RmX3dha2VfbG9ja19pbml0KCkgLSBpbml0aWFsaXplcyBhIENERiB3YWtlIGxvY2sKKyAqIEBsb2NrOiBUaGUgd2FrZSBsb2NrIHRvIGluaXRpYWxpemUKKyAqIEBuYW1lOiBOYW1lIG9mIHdha2UgbG9jaworICoKKyAqIFJldHVybjoKKyAqICAgIENERiBzdGF0dXMgc3VjY2VzcyA6IGlmIHdha2UgbG9jayBpcyBpbml0aWFsaXplZAorICogICAgQ0RGIHN0YXR1cyBmaWFsdXJlIDogaWYgd2FrZSBsb2NrIHdhcyBub3QgaW5pdGlhbGl6ZWQKKyAqLworQ0RGX1NUQVRVUyBjZGZfd2FrZV9sb2NrX2luaXQoY2RmX3dha2VfbG9ja190ICpsb2NrLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBjZGZfd2FrZV9sb2NrX2FjcXVpcmUoKSAtIGFjcXVpcmVzIGEgd2FrZSBsb2NrCisgKiBAbG9jazoJVGhlIHdha2UgbG9jayB0byBhY3F1aXJlCisgKiBAcmVhc29uOglSZWFzb24gZm9yIHRha2luZyB3YWtlbG9jaworICoKKyAqIFJldHVybjoKKyAqICAgIENERiBzdGF0dXMgc3VjY2VzcyA6IGlmIHdha2UgbG9jayBpcyBhY3F1aXJlZAorICogICAgQ0RGIHN0YXR1cyBmaWFsdXJlIDogaWYgd2FrZSBsb2NrIHdhcyBub3QgYWNxdWlyZWQKKyAqLworQ0RGX1NUQVRVUyBjZGZfd2FrZV9sb2NrX2FjcXVpcmUoY2RmX3dha2VfbG9ja190ICpwTG9jaywgdWludDMyX3QgcmVhc29uKTsKKworLyoqCisgKiBjZGZfd2FrZV9sb2NrX3RpbWVvdXRfYWNxdWlyZSgpIC0gYWNxdWlyZXMgYSB3YWtlIGxvY2sgd2l0aCBhIHRpbWVvdXQKKyAqIEBsb2NrOglUaGUgd2FrZSBsb2NrIHRvIGFjcXVpcmUKKyAqIEByZWFzb246CVJlYXNvbiBmb3IgdGFraW5nIHdha2Vsb2NrCisgKgorICogUmV0dXJuOgorICogICBDREYgc3RhdHVzIHN1Y2Nlc3MgOiBpZiB3YWtlIGxvY2sgaXMgYWNxdWlyZWQKKyAqICAgQ0RGIHN0YXR1cyBmaWFsdXJlIDogaWYgd2FrZSBsb2NrIHdhcyBub3QgYWNxdWlyZWQKKyAqLworQ0RGX1NUQVRVUyBjZGZfd2FrZV9sb2NrX3RpbWVvdXRfYWNxdWlyZShjZGZfd2FrZV9sb2NrX3QgKnBMb2NrLAorCQkJCQkgdWludDMyX3QgbXNlYywgdWludDMyX3QgcmVhc29uKTsKKworLyoqCisgKiBjZGZfd2FrZV9sb2NrX3JlbGVhc2UoKSAtIHJlbGVhc2VzIGEgd2FrZSBsb2NrCisgKiBAbG9jazoJdGhlIHdha2UgbG9jayB0byByZWxlYXNlCisgKiBAQHJlYXNvbjoJUmVhc29uIGZvciB0YWtpbmcgd2FrZWxvY2sKKyAqCisgKiBSZXR1cm46CisgKiAgICBDREYgc3RhdHVzIHN1Y2Nlc3MgOiBpZiB3YWtlIGxvY2sgaXMgYWNxdWlyZWQKKyAqICAgIENERiBzdGF0dXMgZmlhbHVyZSA6IGlmIHdha2UgbG9jayB3YXMgbm90IGFjcXVpcmVkCisgKi8KK0NERl9TVEFUVVMgY2RmX3dha2VfbG9ja19yZWxlYXNlKGNkZl93YWtlX2xvY2tfdCAqcExvY2ssIHVpbnQzMl90IHJlYXNvbik7CisKKy8qKgorICogY2RmX3dha2VfbG9ja19kZXN0cm95KCkgLSBkZXN0cm95cyBhIHdha2UgbG9jaworICogQGxvY2s6CVRoZSB3YWtlIGxvY2sgdG8gZGVzdHJveQorICoKKyAqIFJldHVybjoKKyAqIENERiBzdGF0dXMgc3VjY2VzcyA6CWlmIHdha2UgbG9jayBpcyBhY3F1aXJlZAorICogQ0RGIHN0YXR1cyBmaWFsdXJlIDoJaWYgd2FrZSBsb2NrIHdhcyBub3QgYWNxdWlyZWQKKyAqLworQ0RGX1NUQVRVUyBjZGZfd2FrZV9sb2NrX2Rlc3Ryb3koY2RmX3dha2VfbG9ja190ICpwTG9jayk7CisKKy8qKgorICogY2RmX3NwaW5sb2NrX2FjcXVpcmUoKSAtIGFjcXVpcmVzIGEgc3BpbiBsb2NrCisgKiBAbG9jazoJU3BpbiBsb2NrIHRvIGFjcXVpcmUKKyAqCisgKiBSZXR1cm46CisgKiAgICBDREYgc3RhdHVzIHN1Y2Nlc3MgOiBpZiB3YWtlIGxvY2sgaXMgYWNxdWlyZWQKKyAqICAgIENERiBzdGF0dXMgZmlhbHVyZSA6IGlmIHdha2UgbG9jayB3YXMgbm90IGFjcXVpcmVkCisgKi8KK0NERl9TVEFUVVMgY2RmX3NwaW5sb2NrX2FjcXVpcmUoY2RmX3NwaW5sb2NrX3QgKnBMb2NrKTsKKworLyoqCisgKiBjZGZfc3BpbmxvY2tfcmVsZWFzZSgpIC0gcmVsZWFzZSBhIHNwaW4gbG9jaworICogQGxvY2s6CVNwaW4gbG9jayB0byByZWxlYXNlCisgKgorICogUmV0dXJuOgorICogQ0RGIHN0YXR1cyBzdWNjZXNzIDoJaWYgd2FrZSBsb2NrIGlzIGFjcXVpcmVkCisgKiBDREYgc3RhdHVzIGZpYWx1cmUgOglpZiB3YWtlIGxvY2sgd2FzIG5vdCBhY3F1aXJlZAorICovCitDREZfU1RBVFVTIGNkZl9zcGlubG9ja19yZWxlYXNlKGNkZl9zcGlubG9ja190ICpwTG9jayk7CisKKyNkZWZpbmUgY2RmX3NwaW5fbG9jayhfbG9jaykgX19jZGZfc3Bpbl9sb2NrKF9sb2NrKQorI2RlZmluZSBjZGZfc3Bpbl91bmxvY2soX2xvY2spIF9fY2RmX3NwaW5fdW5sb2NrKF9sb2NrKQorI2RlZmluZSBjZGZfc3Bpbl9sb2NrX2lycXNhdmUoX2xvY2spIF9fY2RmX3NwaW5fbG9ja19pcnFzYXZlKF9sb2NrKQorI2RlZmluZSBjZGZfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShfbG9jaykgXAorCV9fY2RmX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoX2xvY2spCisjZGVmaW5lIGNkZl9zcGluX2xvY2tfaXJxKF9wTG9jaywgX2ZsYWdzKSAgIF9fY2RmX3NwaW5fbG9ja19pcnEoX3BMb2NrLCBfZmxhZ3MpCisjZGVmaW5lIGNkZl9zcGluX3VubG9ja19pcnEoX3BMb2NrLCBfZmxhZ3MpIFwKKwlfX2NkZl9zcGluX3VubG9ja19pcnEoX3BMb2NrLCBfZmxhZ3MpCisKKyNkZWZpbmUgY2RmX2luX3NvZnRpcnEoKSBfX2NkZl9pbl9zb2Z0aXJxKCkKKworI2VuZGlmIC8qIF9fQ0RGX0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvaW5jL2NkZl9tY190aW1lci5oIGIvY29yZS9jZGYvaW5jL2NkZl9tY190aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzQwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9pbmMvY2RmX21jX3RpbWVyLmgKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChfX0NERl9NQ19USU1FUl9IKQorI2RlZmluZSBfX0NERl9NQ19USU1FUl9ICisKKy8qKgorICogRE9DOiBjZGZfbWNfdGltZXIKKyAqCisgKiBDb25uZWN0aXZpdHkgZHJpdmVyIGZyYW1ld29yayB0aW1lciBBUElzIHNlcmlhbGl6ZWQgdG8gTUMgdGhyZWFkCisgKi8KKworLyogSW5jbHVkZSBGaWxlcyAqLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGNkZl9zdGF0dXMuaD4KKyNpbmNsdWRlIDxjZGZfbG9jay5oPgorI2luY2x1ZGUgPGlfY2RmX21jX3RpbWVyLmg+CisKKyNpZmRlZiBUSU1FUl9NQU5BR0VSCisjaW5jbHVkZSA8Y2RmX2xpc3QuaD4KKyNlbmRpZgorCisvKiBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cyAqLworI2RlZmluZSBDREZfVElNRVJfU1RBVEVfQ09PS0lFICgweDEyKQorI2RlZmluZSBDREZfTUNfVElNRVJfVE9fTVNfVU5JVCAgICgxMDAwKQorI2RlZmluZSBDREZfTUNfVElNRVJfVE9fU0VDX1VOSVQgICgxMDAwMDAwKQorCisvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworLyogY2RmIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3RvdHlwZSAod2VsbCwgYWN0dWFsbHkgYSBwcm90b3R5cGUgZm9yCisgICBhIHBvaW50ZXIgdG8gdGhpcyBjYWxsYmFjayBmdW5jdGlvbikgKi8KK3R5cGVkZWYgdm9pZCAoKmNkZl9tY190aW1lcl9jYWxsYmFja190KSh2b2lkICp1c2VyRGF0YSk7CisKK3R5cGVkZWYgZW51bSB7CisJQ0RGX1RJTUVSX1NUQVRFX1VOVVNFRCA9IENERl9USU1FUl9TVEFURV9DT09LSUUsCisJQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQsCisJQ0RGX1RJTUVSX1NUQVRFX1NUQVJUSU5HLAorCUNERl9USU1FUl9TVEFURV9SVU5OSU5HLAorfSBDREZfVElNRVJfU1RBVEU7CisKKyNpZmRlZiBUSU1FUl9NQU5BR0VSCitzdHJ1Y3QgY2RmX21jX3RpbWVyX3M7Cit0eXBlZGVmIHN0cnVjdCBjZGZfbWNfdGltZXJfbm9kZV9zIHsKKwljZGZfbGlzdF9ub2RlX3QgcE5vZGU7CisJY2hhciAqZmlsZU5hbWU7CisJdW5zaWduZWQgaW50IGxpbmVOdW07CisJc3RydWN0IGNkZl9tY190aW1lcl9zICpjZGZfdGltZXI7Cit9IGNkZl9tY190aW1lcl9ub2RlX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgY2RmX21jX3RpbWVyX3MgeworI2lmZGVmIFRJTUVSX01BTkFHRVIKKwljZGZfbWNfdGltZXJfbm9kZV90ICpwdGltZXJOb2RlOworI2VuZGlmCisKKwljZGZfbWNfdGltZXJfcGxhdGZvcm1fdCBwbGF0Zm9ybUluZm87CisJY2RmX21jX3RpbWVyX2NhbGxiYWNrX3QgY2FsbGJhY2s7CisJdm9pZCAqdXNlckRhdGE7CisJY2RmX211dGV4X3QgbG9jazsKKwlDREZfVElNRVJfVFlQRSB0eXBlOworCUNERl9USU1FUl9TVEFURSBzdGF0ZTsKK30gY2RmX21jX3RpbWVyX3Q7CisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uICovCisjaWZkZWYgVElNRVJfTUFOQUdFUgordm9pZCBjZGZfbWNfdGltZXJfbWFuYWdlcl9pbml0KHZvaWQpOwordm9pZCBjZGZfbWNfdGltZXJfZXhpdCh2b2lkKTsKKyNlbHNlCisvKioKKyAqIGNkZl9tY190aW1lcl9tYW5hZ2VyX2luaXQoKSAtIGluaXRpYWxpemUgQ0RGIGRlYnVnIHRpbWVyIG1hbmFnZXIKKyAqCisgKiBUaGlzIEFQSSBpbml0aWFsaXplcyBDREYgdGltZXIgZGVidWcgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNkZl9tY190aW1lcl9tYW5hZ2VyX2luaXQodm9pZCkKK3sKK30KKworLyoqCisgKiBjZGZfbWNfdGltZXJfZXhpdCgpIC0gZXhpdCBDREYgdGltZXIgZGVidWcgZnVuY3Rpb25hbGl0eQorICoKKyAqIFRoaXMgQVBJIGV4aXN0cyBDREYgdGltZXIgZGVidWcgZnVuY3Rpb25hbGl0eQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX21jX3RpbWVyX2V4aXQodm9pZCkKK3sKK30KKyNlbmRpZgorLyoqCisgKiBjZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoKSAtIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdGltZXIKKyAqIEBwVGltZXI6ICBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICoKKyAqIFJldHVybjoKKyAqCUNERl9USU1FUl9TVEFURSAtIGNkZiB0aW1lciBzdGF0ZQorICovCisKK0NERl9USU1FUl9TVEFURSBjZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoY2RmX21jX3RpbWVyX3QgKnBUaW1lcik7CisKKy8qKgorICogY2RmX21jX3RpbWVyX2luaXQoKSAtIGluaXRpYWxpemUgYSBDREYgdGltZXIKKyAqIEBwVGltZXI6CVBvaW50ZXIgdG8gdGltZXIgb2JqZWN0CisgKiBAdGltZXJUeXBlOglUeXBlIG9mIHRpbWVyCisgKiBAY2FsbGJhY2s6CUNhbGxiYWNrIHRvIGJlIGNhbGxlZCBhZnRlciB0aW1lciBleHBpcnkKKyAqIEBzZXJEYXRhOglVc2VyIGRhdGEgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBUaGlzIEFQSSBpbml0aWFsaXplcyBhIENERiBUaW1lciBvYmplY3QuCisgKgorICogY2RmX21jX3RpbWVyX2luaXQoKSBpbml0aWFsaXplcyBhIENERiBUaW1lciBvYmplY3QuICBBIHRpbWVyIG11c3QgYmUKKyAqIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgY2RmX21jX3RpbWVyX2luaXRpYWxpemUoKSBiZWZvcmUgaXQgbWF5IGJlIHVzZWQgaW4KKyAqIGFueSBvdGhlciB0aW1lciBmdW5jdGlvbnMuCisgKgorICogQXR0ZW1wdGluZyB0byBpbml0aWFsaXplIHRpbWVyIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCByZXN1bHRzIGluCisgKiBhIGZhaWx1cmUuIEEgZGVzdHJveWVkIHRpbWVyIG9iamVjdCBjYW4gYmUgcmUtaW5pdGlhbGl6ZWQgd2l0aCBhIGNhbGwgdG8KKyAqIGNkZl9tY190aW1lcl9pbml0KCkuICBUaGUgcmVzdWx0cyBvZiBvdGhlcndpc2UgcmVmZXJlbmNpbmcgdGhlIG9iamVjdAorICogYWZ0ZXIgaXQgaGFzIGJlZW4gZGVzdHJveWVkIGFyZSB1bmRlZmluZWQuCisgKgorICogIENhbGxzIHRvIENERiB0aW1lciBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgdGltZXIgc3VjaAorICogIGFzIGNkZl9tY190aW1lcl9zZXQoKSB3aWxsIGZhaWwgaWYgdGhlIHRpbWVyIGlzIG5vdCBpbml0aWFsaXplZCBvciBoYXMKKyAqICBiZWVuIGRlc3Ryb3llZC4gIFRoZXJlZm9yZSwgZG9uJ3QgdXNlIHRoZSB0aW1lciBhZnRlciBpdCBoYXMgYmVlbgorICogIGRlc3Ryb3llZCB1bnRpbCBpdCBoYXMgYmVlbiByZS1pbml0aWFsaXplZC4KKyAqCisgKiAgQWxsIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2l0aGluIHRoZSBDRFMgbWFpbiB0aHJlYWQgdW5sZXNzIGl0IGlzCisgKiAgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgVHggdGhyZWFkIGZsb3csIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBleGVjdXRlZAorICogIHdpdGhpbiB0aGUgdHggdGhyZWFkIGZsb3cuCisgKgorICogUmV0dXJuOgorICoJQ0RGX1NUQVRVU19TVUNDRVNTIC0gVGltZXIgaXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5CisgKglDREYgZmFpbHVyZSBzdGF0dXMgLSBUaW1lciBpbml0aWFsaXphdGlvbiBmYWlsZWQKKyAqLworI2lmZGVmIFRJTUVSX01BTkFHRVIKKyNkZWZpbmUgY2RmX21jX3RpbWVyX2luaXQodGltZXIsIHRpbWVyVHlwZSwgY2FsbGJhY2ssIHVzZXJkYXRhKQlcCisJY2RmX21jX3RpbWVyX2luaXRfZGVidWcodGltZXIsIHRpbWVyVHlwZSwgY2FsbGJhY2ssIHVzZXJkYXRhLCBcCisJCV9fRklMRV9fLCBfX0xJTkVfXykKKworQ0RGX1NUQVRVUyBjZGZfbWNfdGltZXJfaW5pdF9kZWJ1ZyhjZGZfbWNfdGltZXJfdCAqdGltZXIsCisJCQkJICAgQ0RGX1RJTUVSX1RZUEUgdGltZXJUeXBlLAorCQkJCSAgIGNkZl9tY190aW1lcl9jYWxsYmFja190IGNhbGxiYWNrLAorCQkJCSAgIHZvaWQgKnVzZXJEYXRhLCBjaGFyICpmaWxlTmFtZSwKKwkJCQkgICB1aW50MzJfdCBsaW5lTnVtKTsKKyNlbHNlCitDREZfU1RBVFVTIGNkZl9tY190aW1lcl9pbml0KGNkZl9tY190aW1lcl90ICp0aW1lciwgQ0RGX1RJTUVSX1RZUEUgdGltZXJUeXBlLAorCQkJICAgICBjZGZfbWNfdGltZXJfY2FsbGJhY2tfdCBjYWxsYmFjaywKKwkJCSAgICAgdm9pZCAqdXNlckRhdGEpOworI2VuZGlmCisKKy8qKgorICogY2RmX21jX3RpbWVyX2Rlc3Ryb3koKSAtIGRlc3Ryb3kgQ0RGIHRpbWVyCisgKiBAdGltZXI6CVBvaW50ZXIgdG8gdGltZXIgb2JqZWN0CisgKgorICogY2RmX21jX3RpbWVyX2Rlc3Ryb3koKSBmdW5jdGlvbiBzaGFsbCBkZXN0cm95IHRoZSB0aW1lciBvYmplY3QuCisgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gXGEgY2RmX21jX3RpbWVyX2Rlc3Ryb3koKSB0aGUgdGltZXIKKyAqIG9iamVjdCBiZWNvbWVzLCBpbiBlZmZlY3QsIHVuaW5pdGlhbGl6ZWQuCisgKgorICogQSBkZXN0cm95ZWQgdGltZXIgb2JqZWN0IGNhbiBiZSByZS1pbml0aWFsaXplZCBieSBjYWxsaW5nCisgKiBjZGZfbWNfdGltZXJfaW5pdCgpLiAgVGhlIHJlc3VsdHMgb2Ygb3RoZXJ3aXNlIHJlZmVyZW5jaW5nIHRoZSBvYmplY3QKKyAqIGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCBhcmUgdW5kZWZpbmVkLgorICoKKyAqIENhbGxzIHRvIENERiB0aW1lciBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgdGltZXIsIHN1Y2gKKyAqIGFzIGNkZl9tY190aW1lcl9zZXQoKSB3aWxsIGZhaWwgaWYgdGhlIGxvY2sgaXMgZGVzdHJveWVkLiAgVGhlcmVmb3JlLAorICogZG9uJ3QgdXNlIHRoZSB0aW1lciBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgdW50aWwgaXQgaGFzCisgKiBiZWVuIHJlLWluaXRpYWxpemVkLgorICoKKyAqIFJldHVybjoKKyAqCUNERl9TVEFUVVNfU1VDQ0VTUyAtIFRpbWVyIGlzIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseQorICoJQ0RGIGZhaWx1cmUgc3RhdHVzIC0gVGltZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkCisgKi8KK0NERl9TVEFUVVMgY2RmX21jX3RpbWVyX2Rlc3Ryb3koY2RmX21jX3RpbWVyX3QgKnRpbWVyKTsKKworLyoqCisgKiBjZGZfbWNfdGltZXJfc3RhcnQoKSAtIHN0YXJ0IGEgQ0RGIFRpbWVyIG9iamVjdAorICogQHRpbWVyOglQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICogQGV4cGlyYXRpb25UaW1lOglUaW1lIHRvIGV4cGlyZQorICoKKyAqIGNkZl9tY190aW1lcl9zdGFydCgpIGZ1bmN0aW9uIHN0YXJ0cyBhIHRpbWVyIHRvIGV4cGlyZSBhZnRlciB0aGUKKyAqIHNwZWNpZmllZCBpbnRlcnZhbCwgdGh1cyBydW5uaW5nIHRoZSB0aW1lciBjYWxsYmFjayBmdW5jdGlvbiB3aGVuCisgKiB0aGUgaW50ZXJ2YWwgZXhwaXJlcy4KKyAqCisgKiBBIHRpbWVyIG9ubHkgcnVucyBvbmNlIChhIG9uZS1zaG90IHRpbWVyKS4gIFRvIHJlLXN0YXJ0IHRoZQorICogdGltZXIsIGNkZl9tY190aW1lcl9zdGFydCgpIGhhcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHRpbWVyIHJ1bnMKKyAqIG9yIGhhcyBiZWVuIGNhbmNlbGxlZC4KKyAqCisgKiBSZXR1cm46CisgKglDREZfU1RBVFVTX1NVQ0NFU1MgLSBUaW1lciBpcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkKKyAqCUNERiBmYWlsdXJlIHN0YXR1cyAtIFRpbWVyIGluaXRpYWxpemF0aW9uIGZhaWxlZAorICovCitDREZfU1RBVFVTIGNkZl9tY190aW1lcl9zdGFydChjZGZfbWNfdGltZXJfdCAqdGltZXIsIHVpbnQzMl90IGV4cGlyYXRpb25UaW1lKTsKKworLyoqCisgKiBjZGZfbWNfdGltZXJfc3RvcCgpIC0gc3RvcCBhIENERiBUaW1lcgorICogQHRpbWVyOglQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICogY2RmX21jX3RpbWVyX3N0b3AoKSBmdW5jdGlvbiBzdG9wcyBhIHRpbWVyIHRoYXQgaGFzIGJlZW4gc3RhcnRlZCBidXQKKyAqIGhhcyBub3QgZXhwaXJlZCwgZXNzZW50aWFsbHkgY2FuY2VsbGluZyB0aGUgJ3N0YXJ0JyByZXF1ZXN0LgorICoKKyAqIEFmdGVyIGEgdGltZXIgaXMgc3RvcHBlZCwgaXQgZ29lcyBiYWNrIHRvIHRoZSBzdGF0ZSBpdCB3YXMgaW4gYWZ0ZXIgaXQKKyAqIHdhcyBjcmVhdGVkIGFuZCBjYW4gYmUgc3RhcnRlZCBhZ2FpbiB2aWEgYSBjYWxsIHRvIGNkZl9tY190aW1lcl9zdGFydCgpLgorICoKKyAqIFJldHVybjoKKyAqCUNERl9TVEFUVVNfU1VDQ0VTUyAtIFRpbWVyIGlzIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseQorICoJQ0RGIGZhaWx1cmUgc3RhdHVzIC0gVGltZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkCisgKi8KK0NERl9TVEFUVVMgY2RmX21jX3RpbWVyX3N0b3AoY2RmX21jX3RpbWVyX3QgKnRpbWVyKTsKKworLyoqCisgKiBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpIC0gZ2V0IHRoZSBzeXN0ZW0gdGltZSBpbiAxMG1zIHRpY2tzCisKKyAqIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VycmVudCBudW1iZXIKKyAqIG9mIHRpbWVyIHRpY2tzIGluIDEwbXNlYyBpbnRlcnZhbHMuICBUaGlzIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIHRpbWVzdGFtcGluZworICogYW5kIGNhbGN1bGF0aW5nIHRpbWUgaW50ZXJ2YWxzIGJ5IGNhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvCisgKiB0aW1lc3RhbXBzLgorICoKKyAqIFJldHVybjoKKyAqCVRoZSBjdXJyZW50IHN5c3RlbSB0aWNrIGNvdW50IChpbiAxMG1zZWMgaW50ZXJ2YWxzKS4gIFRoaXMKKyAqCWZ1bmN0aW9uIGNhbm5vdCBmYWlsLgorICovCit2X1RJTUVfdCBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcyh2b2lkKTsKKworLyoqCisgKiBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCkgLSBHZXQgdGhlIHN5c3RlbSB0aW1lIGluIG1pbGxpc2Vjb25kcworICoKKyAqIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCisgKiB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgc3lzdGVtIHdhcyBzdGFydGVkCisgKgorICogUmV0dXJuOgorICoJVGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgKi8KK3ZfVElNRV90IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUodm9pZCk7CisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQgX19DREZfTUNfVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvaW5jL2NkZl9tZW1vcnkuaCBiL2NvcmUvY2RmL2luYy9jZGZfbWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4MDA4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL2luYy9jZGZfbWVtb3J5LmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChfX0NERl9NRU1PUllfSCkKKyNkZWZpbmUgX19DREZfTUVNT1JZX0gKKworLyoqCisgKiBET0M6IGNkZl9tZW1vcnkKKyAqCisgKiBDb25uZWN0aXZpdHkgZHJpdmVyIGZyYW1ld29yayAoQ0RGKSBtZW1vcnkgbWFuYWdlbWVudCBBUElzCisgKi8KKworLyogSW5jbHVkZSBGaWxlcyAqLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorCisvKiBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cyAqLworCisjaWZkZWYgTUVNT1JZX0RFQlVHCit2b2lkIGNkZl9tZW1fY2xlYW4odm9pZCk7Cit2b2lkIGNkZl9tZW1faW5pdCh2b2lkKTsKK3ZvaWQgY2RmX21lbV9leGl0KHZvaWQpOworI2Vsc2UKKy8qKgorICogY2RmX21lbV9pbml0KCkgLSBpbml0aWFsaXplIGNkZiBtZW1vcnkgZGVidWcgZnVuY3Rpb25hbGl0eQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX21lbV9pbml0KHZvaWQpCit7Cit9CisKKy8qKgorICogY2RmX21lbV9leGl0KCkgLSBleGl0IGNkZiBtZW1vcnkgZGVidWcgZnVuY3Rpb25hbGl0eQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX21lbV9leGl0KHZvaWQpCit7Cit9CisjZW5kaWYKKy8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uICovCisKKy8qKgorICogY2RmX21lbV9tYWxsb2MoKSAtIGFsbG9jYXRpb24gQ0RGIG1lbW9yeQorICogQHNpemU6CU51bWJlciBvZiBieXRlcyBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR5bmFtaWNhbGxseSBhbGxvY2F0ZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBvZgorICogbWVtb3J5LgorICoKKyAqCisgKiBSZXR1cm46CisgKglVcG9uIHN1Y2Nlc3NmdWwgYWxsb2NhdGUsIHJldHVybnMgYSBub24tTlVMTCBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQKKyAqCW1lbW9yeS4gIElmIHRoaXMgZnVuY3Rpb24gaXMgdW5hYmxlIHRvIGFsbG9jYXRlIHRoZSBhbW91bnQgb2YgbWVtb3J5CisgKglzcGVjaWZpZWQgKGZvciBhbnkgcmVhc29uKSBpdCByZXR1cm5zICVOVUxMLgorICoKKyAqLworI2lmZGVmIE1FTU9SWV9ERUJVRworI2RlZmluZSBjZGZfbWVtX21hbGxvYyhzaXplKSBjZGZfbWVtX21hbGxvY19kZWJ1ZyhzaXplLCBfX0ZJTEVfXywgX19MSU5FX18pCit2b2lkICpjZGZfbWVtX21hbGxvY19kZWJ1ZyhzaXplX3Qgc2l6ZSwgY2hhciAqZmlsZU5hbWUsIHVpbnQzMl90IGxpbmVOdW0pOworI2Vsc2UKK3ZvaWQgKmNkZl9tZW1fbWFsbG9jKHNpemVfdCBzaXplKTsKKyNlbmRpZgorCisvKioKKyAqICBjZGZfbWVtX2ZyZWUoKSAtIGZyZWUgQ0RGIG1lbW9yeQorICogIEBwdHI6CVBvaW50ZXIgdG8gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBiZSBmcmVlJ2QuCisgKgorICogIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSAncHRyJy4KKyAqCisgKiAgUmV0dXJuOgorICoJIE5vdGhpbmcKKyAqCisgKi8KK3ZvaWQgY2RmX21lbV9mcmVlKHZvaWQgKnB0cik7CisKKy8qKgorICogY2RmX21lbV9zZXQoKSAtIHNldCAoZmlsbCkgbWVtb3J5IHdpdGggYSBzcGVjaWZpZWQgYnl0ZSB2YWx1ZS4KKyAqIEBwTWVtb3J5OglQb2ludGVyIHRvIG1lbW9yeSB0aGF0IHdpbGwgYmUgc2V0CisgKiBAbnVtQnl0ZXM6CU51bWJlciBvZiBieXRlcyB0byBiZSBzZXQKKyAqIEB2YWx1ZToJQnl0ZSBzZXQgaW4gbWVtb3J5CisgKgorICogUmV0dXJuOgorICogICAgTm90aGluZworICoKKyAqLwordm9pZCBjZGZfbWVtX3NldCh2b2lkICpwdHIsIHVpbnQzMl90IG51bUJ5dGVzLCB1aW50MzJfdCB2YWx1ZSk7CisKKy8qKgorICogY2RmX21lbV96ZXJvKCkgLSB6ZXJvIG91dCBtZW1vcnkKKyAqIEBwTWVtb3J5Oglwb2ludGVyIHRvIG1lbW9yeSB0aGF0IHdpbGwgYmUgc2V0IHRvIHplcm8KKyAqIEBudW1CeXRlczoJbnVtYmVyIG9mIGJ5dGVzIHplcm8KKyAqIEB2YWx1ZToJYnl0ZSBzZXQgaW4gbWVtb3J5CisgKgorICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgbWVtb3J5IGxvY2F0aW9uIHRvIGFsbCB6ZXJvcywgZXNzZW50aWFsbHkgY2xlYXJpbmcKKyAqICB0aGUgbWVtb3J5LgorICoKKyAqIFJldHVybjoKKyAqCU5vdGhpbmcKKyAqCisgKi8KK3ZvaWQgY2RmX21lbV96ZXJvKHZvaWQgKnB0ciwgdWludDMyX3QgbnVtQnl0ZXMpOworCisvKioKKyAqIGNkZl9tZW1fY29weSgpIC0gY29weSBtZW1vcnkKKyAqIEBwRHN0OglQb2ludGVyIHRvIGRlc3RpbmF0aW9uIG1lbW9yeSBsb2NhdGlvbiAodG8gY29weSB0bykKKyAqIEBwU3JjOglQb2ludGVyIHRvIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHRvIGNvcHkgZnJvbSkKKyAqIEBudW1CeXRlczoJTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKgorICogQ29weSBob3N0IG1lbW9yeSBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyLCBzaW1pbGFyIHRvIG1lbWNweSBpbgorICogc3RhbmRhcmQgQy4gIE5vdGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlIG92ZXJsYXBwaW5nCisgKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1lbW9yeSBsb2NhdGlvbnMuICBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aAorICogb3ZlcmxhcHBpbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtZW1vcnkgbG9jYXRpb25zIHdpbGwgcmVzdWx0IGluCisgKiB1bnByZWRpY3RhYmxlIHJlc3VsdHMuICBVc2UgY2RmX21lbV9tb3ZlKCkgaWYgdGhlIG1lbW9yeSBsb2NhdGlvbnMKKyAqIGZvciB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgb3ZlcmxhcHBpbmcgKG9yIGNvdWxkIGJlIG92ZXJsYXBwaW5nISkKKyAqCisgKiBSZXR1cm46CisgKiAgICBOb3RoaW5nCisgKgorICovCit2b2lkIGNkZl9tZW1fY29weSh2b2lkICpwRHN0LCBjb25zdCB2b2lkICpwU3JjLCB1aW50MzJfdCBudW1CeXRlcyk7CisKKy8qKgorICogY2RmX21lbV9tb3ZlKCkgLSBtb3ZlIG1lbW9yeQorICogQHBEc3Q6CXBvaW50ZXIgdG8gZGVzdGluYXRpb24gbWVtb3J5IGxvY2F0aW9uICh0byBtb3ZlIHRvKQorICogQHBTcmM6CXBvaW50ZXIgdG8gc291cmNlIG1lbW9yeSBsb2NhdGlvbiAodG8gbW92ZSBmcm9tKQorICogQG51bUJ5dGVzOgludW1iZXIgb2YgYnl0ZXMgdG8gbW92ZS4KKyAqCisgKiBNb3ZlIGhvc3QgbWVtb3J5IGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIsIHNpbWlsYXIgdG8gbWVtbW92ZSBpbgorICogc3RhbmRhcmQgQy4gIE5vdGUgdGhpcyBmdW5jdGlvbiAqZG9lcyogaGFuZGxlIG92ZXJsYXBwaW5nCisgKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1lbW9yeSBsb2NhdGlvbnMuCisKKyAqIFJldHVybjoKKyAqCU5vdGhpbmcKKyAqLwordm9pZCBjZGZfbWVtX21vdmUodm9pZCAqcERzdCwgY29uc3Qgdm9pZCAqcFNyYywgdWludDMyX3QgbnVtQnl0ZXMpOworCisvKioKKyAqIGNkZl9tZW1fY29tcGFyZSgpIC0gbWVtb3J5IGNvbXBhcmUKKyAqIEBwTWVtb3J5MToJcG9pbnRlciB0byBvbmUgbG9jYXRpb24gaW4gbWVtb3J5IHRvIGNvbXBhcmUuCisgKiBAcE1lbW9yeTI6CXBvaW50ZXIgdG8gc2Vjb25kIGxvY2F0aW9uIGluIG1lbW9yeSB0byBjb21wYXJlLgorICogQG51bUJ5dGVzOgl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUuCisgKgorICogRnVuY3Rpb24gdG8gY29tcGFyZSB0d28gcGllY2VzIG9mIG1lbW9yeSwgc2ltaWxhciB0byBtZW1jbXAgZnVuY3Rpb24KKyAqIGluIHN0YW5kYXJkIEMuCisgKgorICogUmV0dXJuOgorICoJYm9vbCAtIHJldHVybnMgYSBib29sIHZhbHVlIHRoYXQgdGVsbHMgaWYgdGhlIG1lbW9yeSBsb2NhdGlvbnMKKyAqCWFyZSBlcXVhbCBvciBub3QgZXF1YWwuCisgKgorICovCitib29sIGNkZl9tZW1fY29tcGFyZShjb25zdCB2b2lkICpwTWVtb3J5MSwgY29uc3Qgdm9pZCAqcE1lbW9yeTIsCisJCSAgICAgdWludDMyX3QgbnVtQnl0ZXMpOworCisvKioKKyAqIGNkZl9tZW1fY29tcGFyZTIoKSAtIG1lbW9yeSBjb21wYXJlCisgKiBAcE1lbW9yeTE6IHBvaW50ZXIgdG8gb25lIGxvY2F0aW9uIGluIG1lbW9yeSB0byBjb21wYXJlLgorICogQHBNZW1vcnkyOglwb2ludGVyIHRvIHNlY29uZCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gY29tcGFyZS4KKyAqIEBudW1CeXRlczoJdGhlIG51bWJlciBvZiBieXRlcyB0byBjb21wYXJlLgorICoKKyAqIEZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIHBpZWNlcyBvZiBtZW1vcnksIHNpbWlsYXIgdG8gbWVtY21wIGZ1bmN0aW9uCisgKiBpbiBzdGFuZGFyZCBDLgorICogUmV0dXJuOgorICoJIGludDMyX3QgLSByZXR1cm5zIGEgYm9vbCB2YWx1ZSB0aGF0IHRlbGxzIGlmIHRoZSBtZW1vcnkKKyAqCSBsb2NhdGlvbnMgYXJlIGVxdWFsIG9yIG5vdCBlcXVhbC4KKyAqCSAwIC0tIGVxdWFsCisgKgkgPCAwIC0tICpwTWVtb3J5MSBpcyBsZXNzIHRoYW4gKnBNZW1vcnkyCisgKgkgPiAwIC0tICpwTWVtb3J5MSBpcyBiaWdnZXIgdGhhbiAqcE1lbW9yeTIKKyAqLworaW50MzJfdCBjZGZfbWVtX2NvbXBhcmUyKGNvbnN0IHZvaWQgKnBNZW1vcnkxLCBjb25zdCB2b2lkICpwTWVtb3J5MiwKKwkJCSB1aW50MzJfdCBudW1CeXRlcyk7CisKK3ZvaWQgKmNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudChjZGZfZGV2aWNlX3Qgb3NkZXYsIGNkZl9zaXplX3Qgc2l6ZSwKKwkJCQkgIGNkZl9kbWFfYWRkcl90ICpwYWRkciwKKwkJCQkgIGNkZl9kbWFfY29udGV4dF90IG1jdHgpOwordm9pZAorY2RmX29zX21lbV9mcmVlX2NvbnNpc3RlbnQoY2RmX2RldmljZV90IG9zZGV2LAorCQkJICAgY2RmX3NpemVfdCBzaXplLAorCQkJICAgdm9pZCAqdmFkZHIsCisJCQkgICBjZGZfZG1hX2FkZHJfdCBwYWRkciwgY2RmX2RtYV9jb250ZXh0X3QgbWVtY3R4KTsKKwordm9pZAorY2RmX29zX21lbV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjZGZfZGV2aWNlX3Qgb3NkZXYsCisJCQkJICAgICAgY2RmX2RtYV9hZGRyX3QgYnVzX2FkZHIsCisJCQkJICAgICAgY2RmX3NpemVfdCBzaXplLAorCQkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKKy8qKgorICogY2RmX3N0cl9sZW4oKSAtIHJldHVybnMgdGhlIGxlbmd0aCBvZiBhIHN0cmluZworICogQHN0cjoJaW5wdXQgc3RyaW5nCisgKgorICogUmV0dXJuOgorICoJbGVuZ3RoIG9mIHN0cmluZworICovCitzdGF0aWMgaW5saW5lIGludDMyX3QgY2RmX3N0cl9sZW4oY29uc3QgY2hhciAqc3RyKQoreworCXJldHVybiBzdHJsZW4oc3RyKTsKK30KKworI2VuZGlmIC8qIF9fQ0RGX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9pbmMvY2RmX25idWYuaCBiL2NvcmUvY2RmL2luYy9jZGZfbmJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTgxODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9pbmMvY2RmX25idWYuaApAQCAtMCwwICsxLDEwNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiBjZGZfbmJ1Zl9wdWJsaWMgbmV0d29yayBidWZmZXIgQVBJCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgbmV0d29yayBidWZmZXIgYWJzdHJhY3Rpb24uCisgKi8KKworI2lmbmRlZiBfQ0RGX05CVUZfSAorI2RlZmluZSBfQ0RGX05CVUZfSAorI2luY2x1ZGUgPGNkZl91dGlsLmg+CisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8Y2RmX25ldF90eXBlcy5oPgorI2luY2x1ZGUgPGNkZl9sb2NrLmg+CisjaW5jbHVkZSA8aV9jZGZfbmJ1Zi5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKyNkZWZpbmUgSVBBX05CVUZfT1dORVJfSUQgMHhhYTU1YWE1NQorI2RlZmluZSBOQlVGX1BLVF9UUkFDX1RZUEVfRUFQT0wgICAweDAyCisjZGVmaW5lIE5CVUZfUEtUX1RSQUNfVFlQRV9ESENQICAgIDB4MDQKKyNkZWZpbmUgTkJVRl9QS1RfVFJBQ19UWVBFX01HTVRfQUNUSU9OICAgIDB4MDgKKyNkZWZpbmUgTkJVRl9QS1RfVFJBQ19NQVhfU1RSSU5HICAgMTIKKyNkZWZpbmUgTkJVRl9QS1RfVFJBQ19QUk9UT19TVFJJTkcgNAorI2RlZmluZSBOQlVGX1BLVF9FUlJPUiAgMQorCisvKiBUcmFja2VkIFBhY2tldCB0eXBlcyAqLworI2RlZmluZSBOQlVGX1RYX1BLVF9JTlZBTElEICAgICAgICAgICAgICAwCisjZGVmaW5lIE5CVUZfVFhfUEtUX0RBVEFfVFJBQ0sgICAgICAgICAgIDEKKyNkZWZpbmUgTkJVRl9UWF9QS1RfTUdNVF9UUkFDSyAgICAgICAgICAgMgorCisvKiBEaWZmZXJlbnQgUGFja2V0IHN0YXRlcyAqLworI2RlZmluZSBOQlVGX1RYX1BLVF9IREQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5CVUZfVFhfUEtUX1RYUlhfRU5RVUVVRSAgICAgICAgIDIKKyNkZWZpbmUgTkJVRl9UWF9QS1RfVFhSWF9ERVFVRVVFICAgICAgICAgMworI2RlZmluZSBOQlVGX1RYX1BLVF9UWFJYICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5CVUZfVFhfUEtUX0hUVCAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTkJVRl9UWF9QS1RfSFRDICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBOQlVGX1RYX1BLVF9ISUYgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIE5CVUZfVFhfUEtUX0NFICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTkJVRl9UWF9QS1RfRlJFRSAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBOQlVGX1RYX1BLVF9TVEFURV9NQVggICAgICAgICAgICAxMAorCisKKy8qKgorICogQGNkZl9uYnVmX3QgLSBQbGF0Zm9ybSBpbmRlcGVkZW50IHBhY2tldCBhYnN0cmFjdGlvbgorICovCit0eXBlZGVmIF9fY2RmX25idWZfdCBjZGZfbmJ1Zl90OworCisvKioKKyAqIEBjZGZfZG1hX21hcF9jYl90IC0gRG1hIG1hcCBjYWxsYmFjayBwcm90b3R5cGUKKyAqLwordHlwZWRlZiB2b2lkICgqY2RmX2RtYV9tYXBfY2JfdCkodm9pZCAqYXJnLCBjZGZfbmJ1Zl90IGJ1ZiwKKwkJCQkgY2RmX2RtYV9tYXBfdCBkbWFwKTsKKworLyoqCisgKiBAX19DREZfTkJVRl9OVUxMIC0gaW52YWxpZCBoYW5kbGUKKyAqLworI2RlZmluZSBDREZfTkJVRl9OVUxMICAgX19DREZfTkJVRl9OVUxMCisvKioKKyAqIEBjZGZfbmJ1Zl9xdWV1ZV90IC0gUGxhdGZvcm0gaW5kZXBlbmRlbnQgcGFja2V0IHF1ZXVlIGFic3RyYWN0aW9uCisgKi8KK3R5cGVkZWYgX19jZGZfbmJ1Zl9xdWV1ZV90IGNkZl9uYnVmX3F1ZXVlX3Q7CisKKy8qIEJVUy9ETUEgbWFwcGluZyByb3V0aW5lcyAqLworCisvKioKKyAqIGNkZl9uYnVmX21hcCgpIC0gbWFwIGEgYnVmZmVyIHRvIGxvY2FsIGJ1cyBhZGRyZXNzIHNwYWNlCisgKiBAb3NkZXY6IE9TIGRldmljZQorICogQGJ1ZjogQnVmIHRvIGJlIG1hcHBlZCAobWFwcGluZyBpbmZvIGlzIHN0b3JlZCBpbiB0aGUgYnVmJ3MgbWV0YS1kYXRhIGFyZWEpCisgKiBAZGlyOiBETUEgZGlyZWN0aW9uCisgKgorICogUmV0dXJuOiBTdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgorICovCitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMKK2NkZl9uYnVmX21hcChjZGZfZGV2aWNlX3Qgb3NkZXYsIGNkZl9uYnVmX3QgYnVmLCBjZGZfZG1hX2Rpcl90IGRpcikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9tYXAob3NkZXYsIGJ1ZiwgZGlyKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl91bm1hcCgpIC0gdW5tYXAgYSBwcmV2aW91c2x5IG1hcHBlZCBidWYKKyAqIEBvc2RldjogT1MgZGV2aWNlCisgKiBAYnVmOiBCdWYgdG8gYmUgdW5tYXBwZWQgKG1hcHBpbmcgaW5mbyBpcyBzdG9yZWQgaW4gdGhlIGJ1ZidzIG1ldGEtZGF0YSBhcmVhKQorICogQGRpcjogRE1BIGRpcmVjdGlvbgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2NkZl9uYnVmX3VubWFwKGNkZl9kZXZpY2VfdCBvc2RldiwgY2RmX25idWZfdCBidWYsIGNkZl9kbWFfZGlyX3QgZGlyKQoreworCV9fY2RmX25idWZfdW5tYXAob3NkZXYsIGJ1ZiwgZGlyKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9tYXBfc2luZ2xlKCkgLSBtYXAgYSBzaW5nbGUgYnVmZmVyIHRvIGxvY2FsIGJ1cyBhZGRyZXNzIHNwYWNlCisgKiBAb3NkZXY6IE9TIGRldmljZQorICogQGJ1ZjogQnVmIHRvIGJlIG1hcHBlZCAobWFwcGluZyBpbmZvIGlzIHN0b3JlZCBpbiB0aGUgYnVmJ3MgbWV0YS1kYXRhIGFyZWEpCisgKiBAZGlyOiBETUEgZGlyZWN0aW9uCisgKgorICogUmV0dXJuOiBTdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgorICovCitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMKK2NkZl9uYnVmX21hcF9zaW5nbGUoY2RmX2RldmljZV90IG9zZGV2LCBjZGZfbmJ1Zl90IGJ1ZiwgY2RmX2RtYV9kaXJfdCBkaXIpCit7CisJcmV0dXJuIF9fY2RmX25idWZfbWFwX3NpbmdsZShvc2RldiwgYnVmLCBkaXIpOworfQorCisvKioKKyAqIGNkZl9uYnVmX3VubWFwX3NpbmdsZSgpIC0gdW5tYXAgYSBwcmV2aW91c2x5IG1hcHBlZCBidWYKKyAqIEBvc2RldjogT1MgZGV2aWNlCisgKiBAYnVmOiBCdWYgdG8gYmUgdW5tYXBwZWQgKG1hcHBpbmcgaW5mbyBpcyBzdG9yZWQgaW4gdGhlIGJ1ZidzIG1ldGEtZGF0YSBhcmVhKQorICogQGRpcjogRE1BIGRpcmVjdGlvbgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2NkZl9uYnVmX3VubWFwX3NpbmdsZShjZGZfZGV2aWNlX3Qgb3NkZXYsIGNkZl9uYnVmX3QgYnVmLCBjZGZfZG1hX2Rpcl90IGRpcikKK3sKKwlfX2NkZl9uYnVmX3VubWFwX3NpbmdsZShvc2RldiwgYnVmLCBkaXIpOworfQorCisvKioKKyAqIGNkZl9uYnVmX2dldF9udW1fZnJhZ3MoKSAtIGdldCBudW1iZXIgb2YgZnJhZ21lbnRzCisgKiBAYnVmOiBOZXR3b3JrIGJ1ZmZlcgorICoKKyAqIFJldHVybjogTnVtYmVyIG9mIGZyYWdtZW50cworICovCitzdGF0aWMgaW5saW5lIGludCBjZGZfbmJ1Zl9nZXRfbnVtX2ZyYWdzKGNkZl9uYnVmX3QgYnVmKQoreworCXJldHVybiBfX2NkZl9uYnVmX2dldF9udW1fZnJhZ3MoYnVmKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9nZXRfZnJhZ19sZW4oKSAtIGdldCBmcmFnbWVudCBsZW5ndGgKKyAqIEBidWY6IE5ldHdvcmsgYnVmZmVyCisgKiBAZnJhZ19udW06IEZyYWdtZW50IG51bWJlcgorICoKKyAqIFJldHVybjogRnJhZ21lbnQgbGVuZ3RoCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNkZl9uYnVmX2dldF9mcmFnX2xlbihjZGZfbmJ1Zl90IGJ1ZiwgaW50IGZyYWdfbnVtKQoreworCXJldHVybiBfX2NkZl9uYnVmX2dldF9mcmFnX2xlbihidWYsIGZyYWdfbnVtKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9nZXRfZnJhZ192YWRkcigpIC0gZ2V0IGZyYWdtZW50IHZpcnR1YWwgYWRkcmVzcworICogQGJ1ZjogTmV0d29yayBidWZmZXIKKyAqIEBmcmFnX251bTogRnJhZ21lbnQgbnVtYmVyCisgKgorICogUmV0dXJuOiBGcmFnbWVudCB2aXJ0dWFsIGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpjZGZfbmJ1Zl9nZXRfZnJhZ192YWRkcihjZGZfbmJ1Zl90IGJ1ZiwKKwkJCQkJCSAgICAgaW50IGZyYWdfbnVtKQoreworCXJldHVybiBfX2NkZl9uYnVmX2dldF9mcmFnX3ZhZGRyKGJ1ZiwgZnJhZ19udW0pOworfQorCisvKioKKyAqIGNkZl9uYnVmX2dldF9mcmFnX3BhZGRyX2xvKCkgLSBnZXQgZnJhZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyBsb3cgb3JkZXIgYnl0ZXMKKyAqIEBidWY6IE5ldHdvcmsgYnVmZmVyCisgKiBAZnJhZ19udW06IEZyYWdtZW50IG51bWJlcgorICoKKyAqIFJldHVybjogRnJhZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyBsbworICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNkZl9uYnVmX2dldF9mcmFnX3BhZGRyX2xvKGNkZl9uYnVmX3QgYnVmLCBpbnQgZnJhZ19udW0pCit7CisJcmV0dXJuIF9fY2RmX25idWZfZ2V0X2ZyYWdfcGFkZHJfbG8oYnVmLCBmcmFnX251bSk7Cit9CisKKy8qKgorICogY2RmX25idWZfZ2V0X2ZyYWdfaXNfd29yZHN0cmVhbSgpIC0gaXMgZnJhZ21lbnQgd29yZHN0cmVhbQorICogQGJ1ZjogTmV0d29yayBidWZmZXIKKyAqIEBmcmFnX251bTogRnJhZ21lbnQgbnVtYmVyCisgKgorICogUmV0dXJuOiBGcmFnbWVudCB3b3Jkc3RyZWFtIG9yIG5vdAorICovCitzdGF0aWMgaW5saW5lIGludCBjZGZfbmJ1Zl9nZXRfZnJhZ19pc193b3Jkc3RyZWFtKGNkZl9uYnVmX3QgYnVmLCBpbnQgZnJhZ19udW0pCit7CisJcmV0dXJuIF9fY2RmX25idWZfZ2V0X2ZyYWdfaXNfd29yZHN0cmVhbShidWYsIGZyYWdfbnVtKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9zZXRfZnJhZ19pc193b3Jkc3RyZWFtKCkgLSBzZXQgZnJhZ21lbnQgd29yZHN0cmVhbQorICogQGJ1ZjogTmV0d29yayBidWZmZXIKKyAqIEBmcmFnX251bTogRnJhZ21lbnQgbnVtYmVyCisgKiBAaXNfd29yZHN0cmVhbTogV29yZHN0cmVhbQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2NkZl9uYnVmX3NldF9mcmFnX2lzX3dvcmRzdHJlYW0oY2RmX25idWZfdCBidWYsIGludCBmcmFnX251bSwgaW50IGlzX3dvcmRzdHJlYW0pCit7CisJX19jZGZfbmJ1Zl9zZXRfZnJhZ19pc193b3Jkc3RyZWFtKGJ1ZiwgZnJhZ19udW0sIGlzX3dvcmRzdHJlYW0pOworfQorCisvKioKKyAqIGNkZl9uYnVmX2ZyYWdfcHVzaF9oZWFkKCkgLSBwdXNoIGZyYWdtZW50IGhlYWQKKyAqIEBidWY6IE5ldHdvcmsgYnVmZmVyCisgKiBAZnJhZ19sZW46IEZyYWdtZW50IGxlbmd0aAorICogQGZyYWdfdmFkZHI6IEZyYWdtZW50IHZpcnR1YWwgYWRkcmVzcworICogQGZyYWdfcGFkZHJfbG86IEZyYWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgbG8KKyAqIEBmcmFnX3BhZGRyX2hpOiBGcmFnbWVudCBwaHlzaWNhbCBhZGRyZXNzIGhpCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorY2RmX25idWZfZnJhZ19wdXNoX2hlYWQoY2RmX25idWZfdCBidWYsCisJCQlpbnQgZnJhZ19sZW4sCisJCQljaGFyICpmcmFnX3ZhZGRyLAorCQkJdWludDMyX3QgZnJhZ19wYWRkcl9sbywgdWludDMyX3QgZnJhZ19wYWRkcl9oaSkKK3sKKwlfX2NkZl9uYnVmX2ZyYWdfcHVzaF9oZWFkKGJ1ZiwgZnJhZ19sZW4sIGZyYWdfdmFkZHIsIGZyYWdfcGFkZHJfbG8sCisJCQkJICBmcmFnX3BhZGRyX2hpKTsKK30KKworI2lmZGVmIE1FTU9SWV9ERUJVRwordm9pZCBjZGZfbmV0X2J1Zl9kZWJ1Z19pbml0KHZvaWQpOwordm9pZCBjZGZfbmV0X2J1Zl9kZWJ1Z19leGl0KHZvaWQpOwordm9pZCBjZGZfbmV0X2J1Zl9kZWJ1Z19jbGVhbih2b2lkKTsKK3ZvaWQgY2RmX25ldF9idWZfZGVidWdfYWRkX25vZGUoY2RmX25idWZfdCBuZXRfYnVmLCBzaXplX3Qgc2l6ZSwKKwkJCQl1aW50OF90ICpmaWxlX25hbWUsIHVpbnQzMl90IGxpbmVfbnVtKTsKK3ZvaWQgY2RmX25ldF9idWZfZGVidWdfZGVsZXRlX25vZGUoY2RmX25idWZfdCBuZXRfYnVmKTsKK3ZvaWQgY2RmX25ldF9idWZfZGVidWdfcmVsZWFzZV9za2IoY2RmX25idWZfdCBuZXRfYnVmKTsKKworLyogbmJ1ZiBhbGxvY2F0aW9uIHJvdWluZXMgKi8KKworLyoqCisgKiBjZGZfbmJ1Zl9hbGxvYygpIC0gQWxsb2NhdGUgY2RmX25idWYKKyAqIEBoZGw6IFBsYXRmb3JtIGRldmljZSBvYmplY3QKKyAqIEBzaXplOiBEYXRhIGJ1ZmZlciBzaXplIGZvciB0aGlzIGNkZl9uYnVmIGluY2x1ZGluZyBtYXggaGVhZGVyCisgKgkgIHNpemUKKyAqIEByZXNlcnZlOiBIZWFkcm9vbSB0byBzdGFydCB3aXRoLgorICogQGFsaWduOiBBbGlnbm1lbnQgZm9yIHRoZSBzdGFydCBidWZmZXIuCisgKiBAcHJpbzogSW5kaWNhdGUgaWYgdGhlIG5idWYgaXMgaGlnaCBwcmlvcml0eSAoc29tZSBPU2VzIGUuZyBkYXJ3aW4KKyAqCSAgIHBvbGxzIGZldyB0aW1lcyBpZiBhbGxvY2F0aW9uIGZhaWxzIGFuZCBwcmlvcml0eSBpcyB0cnVlKQorICoKKyAqIFRoZSBuYnVmIGNyZWF0ZWQgaXMgZ3VhcmVudGVlZCB0byBoYXZlIG9ubHkgMSBwaHlzaWNhbCBzZWdtZW50CisgKgorICogUmV0dXJuOiBUaGUgbmV3IGNkZl9uYnVmIGluc3RhbmNlIG9yIE5VTEwgaWYgdGhlcmUncyBub3QgZW5vdWdoIG1lbW9yeS4KKyAqLworCisjZGVmaW5lIGNkZl9uYnVmX2FsbG9jKGQsIHMsIHIsIGEsIHApCQkJXAorCWNkZl9uYnVmX2FsbG9jX2RlYnVnKGQsIHMsIHIsIGEsIHAsIF9fRklMRV9fLCBfX0xJTkVfXykKK3N0YXRpYyBpbmxpbmUgY2RmX25idWZfdAorY2RmX25idWZfYWxsb2NfZGVidWcoY2RmX2RldmljZV90IG9zZGV2LCBjZGZfc2l6ZV90IHNpemUsIGludCByZXNlcnZlLAorCQkgICAgIGludCBhbGlnbiwgaW50IHByaW8sIHVpbnQ4X3QgKmZpbGVfbmFtZSwKKwkJICAgICB1aW50MzJfdCBsaW5lX251bSkKK3sKKwljZGZfbmJ1Zl90IG5ldF9idWY7CisJbmV0X2J1ZiA9IF9fY2RmX25idWZfYWxsb2Mob3NkZXYsIHNpemUsIHJlc2VydmUsIGFsaWduLCBwcmlvKTsKKworCS8qIFN0b3JlIFNLQiBpbiBpbnRlcm5hbCBDREYgdHJhY2tpbmcgdGFibGUgKi8KKwlpZiAoY2RmX2xpa2VseShuZXRfYnVmKSkKKwkJY2RmX25ldF9idWZfZGVidWdfYWRkX25vZGUobmV0X2J1Ziwgc2l6ZSwgZmlsZV9uYW1lLCBsaW5lX251bSk7CisKKwlyZXR1cm4gbmV0X2J1ZjsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9mcmVlKCkgLSBmcmVlIGNkZl9uYnVmCisgKiBAbmV0X2J1ZjogTmV0d29yayBidWZmZXIgdG8gZnJlZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX25idWZfZnJlZShjZGZfbmJ1Zl90IG5ldF9idWYpCit7CisJLyogUmVtb3ZlIFNLQiBmcm9tIGludGVybmFsIENERiB0cmFja2luZyB0YWJsZSAqLworCWlmIChjZGZfbGlrZWx5KG5ldF9idWYpKQorCQljZGZfbmV0X2J1Zl9kZWJ1Z19kZWxldGVfbm9kZShuZXRfYnVmKTsKKworCV9fY2RmX25idWZfZnJlZShuZXRfYnVmKTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIGNkZl9uZXRfYnVmX2RlYnVnX3JlbGVhc2Vfc2tiKGNkZl9uYnVmX3QgbmV0X2J1ZikKK3sKKwlyZXR1cm47Cit9CisKKy8qIE5idWYgYWxsb2NhdGlvbiByb3VpbmVzICovCisKKy8qKgorICogY2RmX25idWZfYWxsb2MoKSAtIGFsbG9jYXRlIGNkZl9uYnVmCisgKiBAaGRsOiBQbGF0Zm9ybSBkZXZpY2Ugb2JqZWN0CisgKiBAc2l6ZTogRGF0YSBidWZmZXIgc2l6ZSBmb3IgdGhpcyBjZGZfbmJ1ZiBpbmNsdWRpbmcgbWF4IGhlYWRlcgorICoJICBzaXplCisgKiBAcmVzZXJ2ZTogSGVhZHJvb20gdG8gc3RhcnQgd2l0aC4KKyAqIEBhbGlnbjogQWxpZ25tZW50IGZvciB0aGUgc3RhcnQgYnVmZmVyLgorICogQHByaW86IEluZGljYXRlIGlmIHRoZSBuYnVmIGlzIGhpZ2ggcHJpb3JpdHkgKHNvbWUgT1NlcyBlLmcgZGFyd2luCisgKgkgIHBvbGxzIGZldyB0aW1lcyBpZiBhbGxvY2F0aW9uIGZhaWxzIGFuZCBwcmlvcml0eSBpcyAgdHJ1ZSkKKyAqCisgKiBUaGUgbmJ1ZiBjcmVhdGVkIGlzIGd1YXJlbnRlZWQgdG8gaGF2ZSBvbmx5IDEgcGh5c2ljYWwgc2VnbWVudAorICoKKyAqIFJldHVybjogbmV3IGNkZl9uYnVmIGluc3RhbmNlIG9yIE5VTEwgaWYgdGhlcmUncyBub3QgZW5vdWdoIG1lbW9yeS4KKyAqLworc3RhdGljIGlubGluZSBjZGZfbmJ1Zl90CitjZGZfbmJ1Zl9hbGxvYyhjZGZfZGV2aWNlX3Qgb3NkZXYsCisJICAgICAgIGNkZl9zaXplX3Qgc2l6ZSwgaW50IHJlc2VydmUsIGludCBhbGlnbiwgaW50IHByaW8pCit7CisJcmV0dXJuIF9fY2RmX25idWZfYWxsb2Mob3NkZXYsIHNpemUsIHJlc2VydmUsIGFsaWduLCBwcmlvKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9mcmVlKCkgLSBmcmVlIGNkZl9uYnVmCisgKiBAYnVmOiBOZXR3b3JrIGJ1ZmZlciB0byBmcmVlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfbmJ1Zl9mcmVlKGNkZl9uYnVmX3QgYnVmKQoreworCV9fY2RmX25idWZfZnJlZShidWYpOworfQorCisjZW5kaWYKKworLyoqCisgKiBjZGZfbmJ1Zl90eF9mcmVlKCkgLSBmcmVlIGEgbGlzdCBvZiBjZGZfbmJ1ZnMgYW5kIHRlbGwgdGhlIE9TIHRoZWlyIHR4CisgKgkJCXN0YXR1cyAoaWYgcmVxJ2QpCisgKiBAYnVmczogTGlzdCBvZiBuZXRidWZzIHRvIGZyZWUKKyAqIEB0eF9lcnI6IFdoZXRoZXIgdGhlIHR4IGZyYW1lcyB3ZXJlIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX25idWZfdHhfZnJlZShjZGZfbmJ1Zl90IGJ1Zl9saXN0LCBpbnQgdHhfZXJyKQoreworCV9fY2RmX25idWZfdHhfZnJlZShidWZfbGlzdCwgdHhfZXJyKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9jb3B5KCkgLSBjb3B5IHNyYyBidWZmZXIgaW50byBkc3QuCisgKiBAYnVmOiBzb3VyY2UgbmJ1ZiB0byBjb3B5IGZyb20KKyAqCisgKiBUaGlzIEFQSSBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCBiZWNhdXNlIG1vc3QgbmF0aXZlIGJ1ZmZlciBwcm92aWRlIGEgd2F5IHRvCisgKiBjb3B5IGEgY2hhaW4gaW50byBhIHNpbmdsZSBidWZmZXIuIFRoZXJlZm9yZSBhcyBhIHNpZGUgZWZmZWN0LCBpdCBhbHNvCisgKiAibGluZWFyaXplcyIgYSBidWZmZXIgKHdoaWNoIGlzIHBlcmhhcHMgd2h5IHlvdSdsbCB1c2UgaXQgbW9zdGx5KS4gSXQKKyAqIGNyZWF0ZXMgYSB3cml0ZWFibGUgY29weS4KKyAqCisgKgorICogUmV0dXJuOiBuZXcgbmJ1ZgorICovCitzdGF0aWMgaW5saW5lIGNkZl9uYnVmX3QgY2RmX25idWZfY29weShjZGZfbmJ1Zl90IGJ1ZikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9jb3B5KGJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfY2F0KCkgLSBsaW5rIHR3byBuYnVmcywgdGhlIG5ldyBidWYgaXMgcGlnZ3liYWNrZWQgaW50byBvbGRlciBvbmUKKyAqIEBkc3Q6IEJ1ZmZlciB0byBwaWdneWJhY2sgaW50bworICogQHNyYzogQnVmZmVyIHRvIHB1dAorICoKKyAqIFJldHVybjogU3RhdHVzIG9mIHRoZSBjYWxsIC0gMCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgQ0RGX1NUQVRVUyBjZGZfbmJ1Zl9jYXQoY2RmX25idWZfdCBkc3QsIGNkZl9uYnVmX3Qgc3JjKQoreworCXJldHVybiBfX2NkZl9uYnVmX2NhdChkc3QsIHNyYyk7Cit9CisKKy8qKgorICogQGNkZl9uYnVmX2NvcHlfYml0cygpIC0gcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvcHkgYml0cyBmb3Igc2tiCisgKiBAc2tiOiBTS0IgcG9pbnRlcgorICogQG9mZnNldDogb2Zmc2V0CisgKiBAbGVuOiBMZW5ndGgKKyAqIEB0bzogVG8KKyAqCisgKiBSZXR1cm46IGludDMyX3QKKyAqLworc3RhdGljIGlubGluZSBpbnQzMl90CitjZGZfbmJ1Zl9jb3B5X2JpdHMoY2RmX25idWZfdCBuYnVmLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGxlbiwgdm9pZCAqdG8pCit7CisJcmV0dXJuIF9fY2RmX25idWZfY29weV9iaXRzKG5idWYsIG9mZnNldCwgbGVuLCB0byk7Cit9CisKKy8qKgorICogY2RmX25idWZfY2xvbmUoKSAtIGNsb25lIHRoZSBuYnVmIChjb3B5IGlzIHJlYWRvbmx5KQorICogQGJ1ZjogbmJ1ZiB0byBjbG9uZSBmcm9tCisgKgorICogUmV0dXJuOiBjbG9uZWQgYnVmZmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgY2RmX25idWZfdCBjZGZfbmJ1Zl9jbG9uZShjZGZfbmJ1Zl90IGJ1ZikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9jbG9uZShidWYpOworfQorCisvKiBuYnVmIG1hbmlwdWxhdGlvbiByb3V0aW5lcyAqLworCisvKioKKyAqIEBjZGZfbmJ1Zl9oZWFkKCkgLSByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYW4gbmJ1ZidzIGJ1ZmZlcgorICogQGJ1ZjogbmV0YnVmCisgKgorICogUmV0dXJuOiBoZWFkIGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSB1aW50OF90ICpjZGZfbmJ1Zl9oZWFkKGNkZl9uYnVmX3QgYnVmKQoreworCXJldHVybiBfX2NkZl9uYnVmX2hlYWQoYnVmKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9kYXRhKCkgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIGRhdGEgd2l0aGluIGFuIG5idWYKKyAqIEBidWY6IE5ldHdvcmsgYnVmZmVyCisgKgorICogUmV0dXJuOiBEYXRhIGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSB1aW50OF90ICpjZGZfbmJ1Zl9kYXRhKGNkZl9uYnVmX3QgYnVmKQoreworCXJldHVybiBfX2NkZl9uYnVmX2RhdGEoYnVmKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9oZWFkcm9vbSgpIC0gYW1vdW50IG9mIGhlYWRyb29tIGludCB0aGUgY3VycmVudCBuYnVmCisgKiBAYnVmOiBOZXR3b3JrIGJ1ZmZlcgorICoKKyAqIFJldHVybjogQW1vdW50IG9mIGhlYWQgcm9vbQorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNkZl9uYnVmX2hlYWRyb29tKGNkZl9uYnVmX3QgYnVmKQoreworCXJldHVybiBfX2NkZl9uYnVmX2hlYWRyb29tKGJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfdGFpbHJvb20oKSAtIGFtb3VudCBvZiB0YWlsIHNwYWNlIGF2YWlsYWJsZQorICogQGJ1ZjogTmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IGFtb3VudCBvZiB0YWlsIHJvb20KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBjZGZfbmJ1Zl90YWlscm9vbShjZGZfbmJ1Zl90IGJ1ZikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl90YWlscm9vbShidWYpOworfQorCisvKioKKyAqIGNkZl9uYnVmX3B1c2hfaGVhZCgpIC0gcHVzaCBkYXRhIGluIHRoZSBmcm9udAorICogQGJ1ZjogTmV0d29yayBidWYgaW5zdGFuY2UKKyAqIEBzaXplOiBTaXplIHRvIGJlIHB1c2hlZAorICoKKyAqIFJldHVybjogTmV3IGRhdGEgcG9pbnRlciBvZiB0aGlzIGJ1ZiBhZnRlciBkYXRhIGhhcyBiZWVuIHB1c2hlZCwKKyAqCSAgIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGluIHRoaXMgYnVmLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKmNkZl9uYnVmX3B1c2hfaGVhZChjZGZfbmJ1Zl90IGJ1ZiwgY2RmX3NpemVfdCBzaXplKQoreworCXJldHVybiBfX2NkZl9uYnVmX3B1c2hfaGVhZChidWYsIHNpemUpOworfQorCisvKioKKyAqIGNkZl9uYnVmX3B1dF90YWlsKCkgLSBwdXRzIGRhdGEgaW4gdGhlIGVuZAorICogQGJ1ZjogTmV0d29yayBidWYgaW5zdGFuY2UKKyAqIEBzaXplOiBTaXplIHRvIGJlIHB1c2hlZAorICoKKyAqIFJldHVybjogRGF0YSBwb2ludGVyIG9mIHRoaXMgYnVmIHdoZXJlIG5ldyBkYXRhIGhhcyB0byBiZQorICoJICAgcHV0LCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGlzIGJ1Zi4KKyAqLworc3RhdGljIGlubGluZSB1aW50OF90ICpjZGZfbmJ1Zl9wdXRfdGFpbChjZGZfbmJ1Zl90IGJ1ZiwgY2RmX3NpemVfdCBzaXplKQoreworCXJldHVybiBfX2NkZl9uYnVmX3B1dF90YWlsKGJ1Ziwgc2l6ZSk7Cit9CisKKy8qKgorICogY2RmX25idWZfcHVsbF9oZWFkKCkgLSBwdWxsIGRhdGEgb3V0IGZyb20gdGhlIGZyb250CisgKiBAYnVmOiBOZXR3b3JrIGJ1ZiBpbnN0YW5jZQorICogQHNpemU6IFNpemUgdG8gYmUgcG9wcGVkCisgKgorICogUmV0dXJuOiBOZXcgZGF0YSBwb2ludGVyIG9mIHRoaXMgYnVmIGFmdGVyIGRhdGEgaGFzIGJlZW4gcG9wcGVkLAorICoJICAgb3IgTlVMTCBpZiB0aGVyZSBpcyBub3Qgc3VmZmljaWVudCBkYXRhIHRvIHB1bGwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqY2RmX25idWZfcHVsbF9oZWFkKGNkZl9uYnVmX3QgYnVmLCBjZGZfc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIF9fY2RmX25idWZfcHVsbF9oZWFkKGJ1Ziwgc2l6ZSk7Cit9CisKKy8qKgorICogY2RmX25idWZfdHJpbV90YWlsKCkgLSB0cmltIGRhdGEgb3V0IGZyb20gdGhlIGVuZAorICogQGJ1ZjogTmV0d29yayBidWYgaW5zdGFuY2UKKyAqIEBzaXplOiBTaXplIHRvIGJlIHBvcHBlZAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX25idWZfdHJpbV90YWlsKGNkZl9uYnVmX3QgYnVmLCBjZGZfc2l6ZV90IHNpemUpCit7CisJX19jZGZfbmJ1Zl90cmltX3RhaWwoYnVmLCBzaXplKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9sZW4oKSAtIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBidWYKKyAqIEBidWY6IE5ldHdvcmsgYnVmIGluc3RhbmNlCisgKgorICogUmV0dXJuOiB0b3RhbCBsZW5ndGggb2YgdGhpcyBidWYuCisgKi8KK3N0YXRpYyBpbmxpbmUgY2RmX3NpemVfdCBjZGZfbmJ1Zl9sZW4oY2RmX25idWZfdCBidWYpCit7CisJcmV0dXJuIF9fY2RmX25idWZfbGVuKGJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfc2V0X3BrdGxlbigpIC0gc2V0IHRoZSBsZW5ndGggb2YgdGhlIGJ1ZgorICogQGJ1ZjogTmV0d29yayBidWYgaW5zdGFuY2UKKyAqIEBzaXplOiBTaXplIHRvIGJlIHNldAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX25idWZfc2V0X3BrdGxlbihjZGZfbmJ1Zl90IGJ1ZiwgdWludDMyX3QgbGVuKQoreworCV9fY2RmX25idWZfc2V0X3BrdGxlbihidWYsIGxlbik7Cit9CisKKy8qKgorICogY2RmX25idWZfcmVzZXJ2ZSgpIC0gdHJpbSBkYXRhIG91dCBmcm9tIHRoZSBlbmQKKyAqIEBidWY6IE5ldHdvcmsgYnVmIGluc3RhbmNlCisgKiBAc2l6ZTogU2l6ZSB0byBiZSBwb3BwZWQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNkZl9uYnVmX3Jlc2VydmUoY2RmX25idWZfdCBidWYsIGNkZl9zaXplX3Qgc2l6ZSkKK3sKKwlfX2NkZl9uYnVmX3Jlc2VydmUoYnVmLCBzaXplKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9wZWVrX2hlYWRlcigpIC0gcmV0dXJuIHRoZSBkYXRhIHBvaW50ZXIgJiBsZW5ndGggb2YgdGhlIGhlYWRlcgorICogQGJ1ZjogTmV0d29yayBuYnVmCisgKiBAYWRkcjogRGF0YSBwb2ludGVyCisgKiBAbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjZGZfbmJ1Zl9wZWVrX2hlYWRlcihjZGZfbmJ1Zl90IGJ1ZiwgdWludDhfdCAqKmFkZHIsIHVpbnQzMl90ICpsZW4pCit7CisJX19jZGZfbmJ1Zl9wZWVrX2hlYWRlcihidWYsIGFkZHIsIGxlbik7Cit9CisKKy8qIG5idWYgcHJpdmF0ZSBjb250ZXh0IHJvdXRpbmVzICovCisKKy8qIG5idWYgcXVldWUgcm91dGluZXMgKi8KKworLyoqCisgKiBjZGZfbmJ1Zl9xdWV1ZV9pbml0KCkgLSBpbml0aWFsaXplIGJ1ZiBxdWV1ZQorICogQGhlYWQ6IE5ldHdvcmsgYnVmIHF1ZXVlIGhlYWQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNkZl9uYnVmX3F1ZXVlX2luaXQoY2RmX25idWZfcXVldWVfdCAqaGVhZCkKK3sKKwlfX2NkZl9uYnVmX3F1ZXVlX2luaXQoaGVhZCk7Cit9CisKKy8qKgorICogY2RmX25idWZfcXVldWVfYWRkKCkgLSBhcHBlbmQgYSBuYnVmIHRvIHRoZSB0YWlsIG9mIHRoZSBidWYgcXVldWUKKyAqIEBoZWFkOiBOZXR3b3JrIGJ1ZiBxdWV1ZSBoZWFkCisgKiBAYnVmOiBOZXR3b3JrIGJ1ZgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX25idWZfcXVldWVfYWRkKGNkZl9uYnVmX3F1ZXVlX3QgKmhlYWQsIGNkZl9uYnVmX3QgYnVmKQoreworCV9fY2RmX25idWZfcXVldWVfYWRkKGhlYWQsIGJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfcXVldWVfaW5zZXJ0X2hlYWQoKSAtIGluc2VydCBuYnVmIGF0IHRoZSBoZWFkIG9mIHF1ZXVlCisgKiBAaGVhZDogTmV0d29yayBidWYgcXVldWUgaGVhZAorICogQGJ1ZjogTmV0d29yayBidWYKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjZGZfbmJ1Zl9xdWV1ZV9pbnNlcnRfaGVhZChjZGZfbmJ1Zl9xdWV1ZV90ICpoZWFkLCBjZGZfbmJ1Zl90IGJ1ZikKK3sKKwlfX2NkZl9uYnVmX3F1ZXVlX2luc2VydF9oZWFkKGhlYWQsIGJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfcXVldWVfcmVtb3ZlKCkgLSByZXRyaWV2ZSBhIGJ1ZiBmcm9tIHRoZSBoZWFkIG9mIHRoZSBidWYgcXVldWUKKyAqIEBoZWFkOiBOZXR3b3JrIGJ1ZiBxdWV1ZSBoZWFkCisgKgorICogUmV0dXJuOiBUaGUgaGVhZCBidWYgaW4gdGhlIGJ1ZiBxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSBjZGZfbmJ1Zl90IGNkZl9uYnVmX3F1ZXVlX3JlbW92ZShjZGZfbmJ1Zl9xdWV1ZV90ICpoZWFkKQoreworCXJldHVybiBfX2NkZl9uYnVmX3F1ZXVlX3JlbW92ZShoZWFkKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9xdWV1ZV9sZW4oKSAtIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBxdWV1ZQorICogQGhlYWQ6IE5ldHdvcmsgYnVmIHF1ZXVlIGhlYWQKKyAqCisgKiBSZXR1cm46IGxlbmd0aCBvZiB0aGUgcXVldWUKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBjZGZfbmJ1Zl9xdWV1ZV9sZW4oY2RmX25idWZfcXVldWVfdCAqaGVhZCkKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9xdWV1ZV9sZW4oaGVhZCk7Cit9CisKKy8qKgorICogY2RmX25idWZfcXVldWVfbmV4dCgpIC0gZ2V0IHRoZSBuZXh0IGd1eS9wYWNrZXQgb2YgdGhlIGdpdmVuIGJ1ZmZlcgorICogQGJ1ZjogTmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IG5leHQgYnVmZmVyL3BhY2tldAorICovCitzdGF0aWMgaW5saW5lIGNkZl9uYnVmX3QgY2RmX25idWZfcXVldWVfbmV4dChjZGZfbmJ1Zl90IGJ1ZikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9xdWV1ZV9uZXh0KGJ1Zik7Cit9CisKKy8qKgorICogQGNkZl9uYnVmX2lzX3F1ZXVlX2VtcHR5KCkgLSBjaGVjayBpZiB0aGUgYnVmIHF1ZXVlIGlzIGVtcHR5CisgKiBAbmJxOiBOZXR3b3JrIGJ1ZiBxdWV1ZSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IHRydWUgIGlmIHF1ZXVlIGlzIGVtcHR5CisgKgkgICBmYWxzZSBpZiBxdWV1ZSBpcyBub3QgZW10eQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgY2RmX25idWZfaXNfcXVldWVfZW1wdHkoY2RmX25idWZfcXVldWVfdCAqbmJxKQoreworCXJldHVybiBfX2NkZl9uYnVmX2lzX3F1ZXVlX2VtcHR5KG5icSk7Cit9CisKKy8qKgorICogY2RmX25idWZfbmV4dCgpIC0gZ2V0IHRoZSBuZXh0IHBhY2tldCBpbiB0aGUgbGlua2VkIGxpc3QKKyAqIEBidWY6IE5ldHdvcmsgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aGVuIG5idWZzIGFyZSBkaXJlY3RseSBsaW5rZWQgaW50byBhIGxpc3QsCisgKiByYXRoZXIgdGhhbiB1c2luZyBhIHNlcGFyYXRlIG5ldHdvcmsgYnVmZmVyIHF1ZXVlIG9iamVjdC4KKyAqCisgKiBSZXR1cm46IG5leHQgbmV0d29yayBidWZmZXIgaW4gdGhlIGxpbmtlZCBsaXN0CisgKi8KK3N0YXRpYyBpbmxpbmUgY2RmX25idWZfdCBjZGZfbmJ1Zl9uZXh0KGNkZl9uYnVmX3QgYnVmKQoreworCXJldHVybiBfX2NkZl9uYnVmX25leHQoYnVmKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9nZXRfcHJvdG9jb2woKSAtIHJldHVybiB0aGUgcHJvdG9jb2wgdmFsdWUgb2YgdGhlIHNrYgorICogQHNrYjogUG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlcgorICoKKyAqIFJldHVybjogc2tiIHByb3RvY29sCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgY2RmX25idWZfZ2V0X3Byb3RvY29sKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIF9fY2RmX25idWZfZ2V0X3Byb3RvY29sKHNrYik7Cit9CisKKy8qKgorICogY2RmX25idWZfZ2V0X2lwX3N1bW1lZCgpIC0gcmV0dXJuIHRoZSBpcCBjaGVja3N1bSB2YWx1ZSBvZiB0aGUgc2tiCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKgorICogUmV0dXJuOiBza2IgaXBfc3VtbWVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBjZGZfbmJ1Zl9nZXRfaXBfc3VtbWVkKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIF9fY2RmX25idWZfZ2V0X2lwX3N1bW1lZChza2IpOworfQorCisvKioKKyAqIGNkZl9uYnVmX3NldF9pcF9zdW1tZWQoKSAtIHNldHMgdGhlIGlwX3N1bW1lZCB2YWx1ZSBvZiB0aGUgc2tiCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKiBAaXBfc3VtbWVkOiBpcCBjaGVja3N1bQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX25idWZfc2V0X2lwX3N1bW1lZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1aW50OF90IGlwX3N1bW1lZCkKK3sKKwlfX2NkZl9uYnVmX3NldF9pcF9zdW1tZWQoc2tiLCBpcF9zdW1tZWQpOworfQorCisvKioKKyAqIGNkZl9uYnVmX3NldF9uZXh0KCkgLSBhZGQgYSBwYWNrZXQgdG8gYSBsaW5rZWQgbGlzdAorICogQHRoaXNfYnVmOiBQcmVkZWNlc3NvciBidWZmZXIKKyAqIEBuZXh0X2J1ZjogU3VjY2Vzc29yIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZGlyZWN0bHkgbGluayBuYnVmcywgcmF0aGVyIHRoYW4gdXNpbmcKKyAqIGEgc2VwYXJhdGUgbmV0d29yayBidWZmZXIgcXVldWUgb2JqZWN0LgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX25idWZfc2V0X25leHQoY2RmX25idWZfdCB0aGlzX2J1ZiwgY2RmX25idWZfdCBuZXh0X2J1ZikKK3sKKwlfX2NkZl9uYnVmX3NldF9uZXh0KHRoaXNfYnVmLCBuZXh0X2J1Zik7Cit9CisKKy8qIG5idWYgZXh0ZW5zaW9uIHJvdXRpbmVzICovCisKKy8qKgorICogY2RmX25idWZfc2V0X25leHRfZXh0KCkgLSBsaW5rIGV4dGVuc2lvbiBvZiB0aGlzIHBhY2tldCBjb250YWluZWQgaW4gYSBuZXcKKyAqCQkJICAgICBuYnVmCisgKiBAdGhpc19idWY6IHByZWRlY2Vzc29yIGJ1ZmZlcgorICogQG5leHRfYnVmOiBzdWNjZXNzb3IgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxpbmsgdXAgbWFueSBuYnVmcyBjb250YWluaW5nIGEgc2luZ2xlIGxvZ2ljYWwKKyAqIHBhY2tldCAtIG5vdCBhIGNvbGxlY3Rpb24gb2YgcGFja2V0cy4gRG8gbm90IHVzZSBmb3IgbGlua2luZyB0aGUgZmlyc3QKKyAqIGV4dGVuc2lvbiB0byB0aGUgaGVhZAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2NkZl9uYnVmX3NldF9uZXh0X2V4dChjZGZfbmJ1Zl90IHRoaXNfYnVmLCBjZGZfbmJ1Zl90IG5leHRfYnVmKQoreworCV9fY2RmX25idWZfc2V0X25leHRfZXh0KHRoaXNfYnVmLCBuZXh0X2J1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfbmV4dF9leHQoKSAtIGdldCB0aGUgbmV4dCBwYWNrZXQgZXh0ZW5zaW9uIGluIHRoZSBsaW5rZWQgbGlzdAorICogQGJ1ZjogTmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IE5leHQgbmV0d29yayBidWZmZXIgaW4gdGhlIGxpbmtlZCBsaXN0CisgKi8KK3N0YXRpYyBpbmxpbmUgY2RmX25idWZfdCBjZGZfbmJ1Zl9uZXh0X2V4dChjZGZfbmJ1Zl90IGJ1ZikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9uZXh0X2V4dChidWYpOworfQorCisvKioKKyAqIGNkZl9uYnVmX2FwcGVuZF9leHRfbGlzdCgpIC0gbGluayBsaXN0IG9mIHBhY2tldCBleHRlbnNpb25zIHRvIHRoZSBoZWFkCisgKgkJCQlzZWdtZW50CisgKiBAaGVhZF9idWY6IE5ldHdvcmsgYnVmIGhvbGRpbmcgaGVhZCBzZWdtZW50IChzaW5nbGUpCisgKiBAZXh0X2xpc3Q6IE5ldHdvcmsgYnVmIGxpc3QgaG9sZGluZyBsaW5rZWQgZXh0ZW5zaW9ucyB0byB0aGUgaGVhZAorICogQGV4dF9sZW46IFRvdGFsIGxlbmd0aCBvZiBhbGwgYnVmZmVycyBpbiB0aGUgZXh0ZW5zaW9uIGxpc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbGluayB1cCBhIGxpc3Qgb2YgcGFja2V0IGV4dGVuc2lvbnMgKHNlZzEsIDIsCisgKiAuLi4pIHRvIHRoZSBuYnVmIGhvbGRpbmcgdGhlIGhlYWQgc2VnbWVudCAoc2VnMCkKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjZGZfbmJ1Zl9hcHBlbmRfZXh0X2xpc3QoY2RmX25idWZfdCBoZWFkX2J1ZiwgY2RmX25idWZfdCBleHRfbGlzdCwKKwkJCSBjZGZfc2l6ZV90IGV4dF9sZW4pCit7CisJX19jZGZfbmJ1Zl9hcHBlbmRfZXh0X2xpc3QoaGVhZF9idWYsIGV4dF9saXN0LCBleHRfbGVuKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9nZXRfdHhfY2tzdW0oKSAtIGdldHMgdGhlIHR4IGNoZWNrc3VtIG9mZmxvYWQgZGVtYW5kCisgKiBAYnVmOiBOZXR3b3JrIGJ1ZmZlcgorICoKKyAqIFJldHVybjogY2RmX25idWZfdHhfY2tzdW1fdCBjaGVja3N1bSBvZmZsb2FkIGRlbWFuZCBmb3IgdGhlIGZyYW1lCisgKi8KK3N0YXRpYyBpbmxpbmUgY2RmX25idWZfdHhfY2tzdW1fdCBjZGZfbmJ1Zl9nZXRfdHhfY2tzdW0oY2RmX25idWZfdCBidWYpCit7CisJcmV0dXJuIF9fY2RmX25idWZfZ2V0X3R4X2Nrc3VtKGJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfc2V0X3J4X2Nrc3VtKCkgLSBkcml2ZXJzIHRoYXQgc3VwcG9ydCBodyBjaGVja3N1bW1pbmcgdXNlIHRoaXMgdG8KKyAqCQkJICAgICBpbmRpY2F0ZSBjaGVja3N1bSBpbmZvIHRvIHRoZSBzdGFjay4KKyAqIEBidWY6IE5ldHdvcmsgYnVmZmVyCisgKiBAY2tzdW06IENoZWNrc3VtCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorY2RmX25idWZfc2V0X3J4X2Nrc3VtKGNkZl9uYnVmX3QgYnVmLCBjZGZfbmJ1Zl9yeF9ja3N1bV90ICpja3N1bSkKK3sKKwlfX2NkZl9uYnVmX3NldF9yeF9ja3N1bShidWYsIGNrc3VtKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9nZXRfdGlkKCkgLSB0aGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHRoZSBUSUQgdmFsdWUgZnJvbSBuYnVmCisgKiBAYnVmOiBOZXR3b3JrIGJ1ZmZlcgorICoKKyAqIFJldHVybjogVElEIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBjZGZfbmJ1Zl9nZXRfdGlkKGNkZl9uYnVmX3QgYnVmKQoreworCXJldHVybiBfX2NkZl9uYnVmX2dldF90aWQoYnVmKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9zZXRfdGlkKCkgLSB0aGlzIGZ1bmN0aW9uIHNldHMgdGhlIFRJRCB2YWx1ZSBpbiBuYnVmCisgKiBAYnVmOiBOZXR3b3JrIGJ1ZmZlcgorICogQHRpZDogVElEIHZhbHVlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfbmJ1Zl9zZXRfdGlkKGNkZl9uYnVmX3QgYnVmLCB1aW50OF90IHRpZCkKK3sKKwlfX2NkZl9uYnVmX3NldF90aWQoYnVmLCB0aWQpOworfQorCisvKioKKyAqIGNkZl9uYnVmX2dldF9leGVtcHRpb25fdHlwZSgpIC0gdGhpcyBmdW5jdGlvbiBleHRyYWN0cyB0aGUgZXhlbXB0aW9uIHR5cGUKKyAqCQkJCSAgIGZyb20gbmJ1ZgorICogQGJ1ZjogTmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IEV4ZW1wdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBjZGZfbmJ1Zl9nZXRfZXhlbXB0aW9uX3R5cGUoY2RmX25idWZfdCBidWYpCit7CisJcmV0dXJuIF9fY2RmX25idWZfZ2V0X2V4ZW1wdGlvbl90eXBlKGJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfc2V0X3Byb3RvY29sKCkgLSB0aGlzIGZ1bmN0aW9uIHBlZWtzIGRhdGEgaW50byB0aGUgYnVmZmVyIGF0IGdpdmVuCisgKgkJCSAgICAgb2Zmc2V0CisgKiBAYnVmOiBOZXR3b3JrIGJ1ZmZlcgorICogQHByb3RvOiBQcm90b2NvbAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX25idWZfc2V0X3Byb3RvY29sKGNkZl9uYnVmX3QgYnVmLCB1aW50MTZfdCBwcm90bykKK3sKKwlfX2NkZl9uYnVmX3NldF9wcm90b2NvbChidWYsIHByb3RvKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl90cmFjZV9nZXRfcHJvdG9fdHlwZSgpIC0gdGhpcyBmdW5jdGlvbiByZXR1cm4gcGFja2V0IHByb3RvIHR5cGUKKyAqIEBidWY6IE5ldHdvcmsgYnVmZmVyCisgKgorICogUmV0dXJuOiBQYWNrZXQgcHJvdG9jb2wgdHlwZQorICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgY2RmX25idWZfdHJhY2VfZ2V0X3Byb3RvX3R5cGUoY2RmX25idWZfdCBidWYpCit7CisJcmV0dXJuIF9fY2RmX25idWZfdHJhY2VfZ2V0X3Byb3RvX3R5cGUoYnVmKTsKK30KKworI2lmZGVmIFFDQV9QS1RfUFJPVE9fVFJBQ0UKKy8qKgorICogY2RmX25idWZfdHJhY2Vfc2V0X3Byb3RvX3R5cGUoKSAtIHRoaXMgZnVuY3Rpb24gdXBkYXRlcyBwYWNrZXQgcHJvdG8gdHlwZQorICogQGJ1ZjogTmV0d29yayBidWZmZXIKKyAqIEBwcm90b190eXBlOiBQcm90b2NvbCB0eXBlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorY2RmX25idWZfdHJhY2Vfc2V0X3Byb3RvX3R5cGUoY2RmX25idWZfdCBidWYsIHVpbnQ4X3QgcHJvdG9fdHlwZSkKK3sKKwlfX2NkZl9uYnVmX3RyYWNlX3NldF9wcm90b190eXBlKGJ1ZiwgcHJvdG9fdHlwZSk7Cit9CisjZWxzZQorI2RlZmluZSBjZGZfbmJ1Zl90cmFjZV9zZXRfcHJvdG9fdHlwZShidWYsIHByb3RvX3R5cGUpIC8qTk8gT1AqLworI2VuZGlmCisKKy8qKgorICogY2RmX25idWZfcmVnX3RyYWNlX2NiKCkgLSB0aGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBwcm90b2NvbCB0cmFjZSBjYWxsYmFjaworICogQGNiX2Z1bmNfcHRyOiBDYWxsYmFjayBwb2ludGVyCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZGZfbmJ1Zl9yZWdfdHJhY2VfY2IoY2RmX25idWZfdHJhY2VfdXBkYXRlX3QgY2JfZnVuY19wdHIpCit7CisJX19jZGZfbmJ1Zl9yZWdfdHJhY2VfY2IoY2JfZnVuY19wdHIpOworfQorCisvKioKKyAqIGNkZl9uYnVmX3RyYWNlX3VwZGF0ZSgpIC0gdGhpcyBmdW5jdGlvbiB1cGRhdGVzIHByb3RvY29sIGV2ZW50CisgKiBAYnVmOiBOZXR3b3JrIGJ1ZmZlcgorICogQGV2ZW50X3N0cmluZzogRXZlbnQgc3RyaW5nIHBvaW50ZXIKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNkZl9uYnVmX3RyYWNlX3VwZGF0ZShjZGZfbmJ1Zl90IGJ1ZiwgY2hhciAqZXZlbnRfc3RyaW5nKQoreworCV9fY2RmX25idWZfdHJhY2VfdXBkYXRlKGJ1ZiwgZXZlbnRfc3RyaW5nKTsKK30KKworLyoqCisgKiBjZGZfbmJ1Zl9zZXRfdHhfcGFyYWxsZWxfZG5sb2FkX2ZybSgpIC0gc2V0IHR4IHBhcmFsbGVsIGRvd25sb2FkCisgKiBAYnVmOiBOZXR3b3JrIGJ1ZmZlcgorICogQGNhbmRpOiBDYW5kaWRhdGUgb2YgcGFyYWxsZWwgZG93bmxvYWQgZnJhbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHN0b3JlcyBhIGZsYWcgc3BlY2lmeWluZyB0aGlzIFRYIGZyYW1lIGlzIHN1aXRhYmxlIGZvcgorICogZG93bmxvYWRpbmcgdGhvdWdoIGEgMm5kIFRYIGRhdGEgcGlwZSB0aGF0IGlzIHVzZWQgZm9yIHNob3J0IGZyYW1lcyBmb3IKKyAqIHByb3RvY29scyB0aGF0IGNhbiBhY2NlcHQgb3V0LW9mLW9yZGVyIGRlbGl2ZXJ5LgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2NkZl9uYnVmX3NldF90eF9wYXJhbGxlbF9kbmxvYWRfZnJtKGNkZl9uYnVmX3QgYnVmLCB1aW50OF90IGNhbmRpKQoreworCV9fY2RmX25idWZfc2V0X3R4X2h0dDJfZnJtKGJ1ZiwgY2FuZGkpOworfQorCisvKioKKyAqIGNkZl9uYnVmX2dldF90eF9wYXJhbGxlbF9kbmxvYWRfZnJtKCkgLSBnZXQgdHggcGFyYWxsZWwgZG93bmxvYWQKKyAqIEBidWY6IE5ldHdvcmsgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm4gd2hldGhlciB0aGlzIFRYIGZyYW1lIGlzIGFsbG93IHRvIGRvd25sb2FkIHRob3VnaCBhIDJuZAorICogVFggZGF0YSBwaXBlIG9yIG5vdC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB1aW50OF90IGNkZl9uYnVmX2dldF90eF9wYXJhbGxlbF9kbmxvYWRfZnJtKGNkZl9uYnVmX3QgYnVmKQoreworCXJldHVybiBfX2NkZl9uYnVmX2dldF90eF9odHQyX2ZybShidWYpOworfQorCisvKioKKyAqIGNkZl9pbnZhbGlkYXRlX3JhbmdlKCkgLSBpbnZhbGlkYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2Ugc3BlY2lmaWVkIGJ5CisgKgkJCSAgICBzdGFydCBhbmQgZW5kIGFkZHJlc3Nlcy4KKyAqIE5vdGU6IFRoaXMgZG9lcyBub3Qgd3JpdGUgYmFjayB0aGUgY2FjaGUgZW50cmllcy4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNkZl9pbnZhbGlkYXRlX3JhbmdlKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpCit7CisjaWZkZWYgTVNNX1BMQVRGT1JNCisJZG1hY19pbnZfcmFuZ2Uoc3RhcnQsIGVuZCk7CisjZWxzZQorCS8qIFRPRE8gZmlndXJlIG91dCBob3cgdG8gaW52YWxpZGF0ZSBjYWNoZSBvbiB4ODYgYW5kIG90aGVyCisJICAgbm9uLU1TTSBwbGF0Zm9ybSAqLworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICJDYWNoZSBpbnZhbGlkYXRlIG5vdCB5ZXQgaW1wbGVtbmV0ZWQgZm9yIG5vbi1NU00gcGxhdGZvcm0iKTsKKwlyZXR1cm47CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoRkVBVFVSRV9UU08pCisvKioKKyAqIGNkZl9uYnVmX2RlY19udW1fZnJhZ3MoKSAtIGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIGZyYWdtZW50cworICogQGJ1ZjogTmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IE51bWJlciBvZiBmcmFnbWVudHMKKyAqLworc3RhdGljIGlubGluZSBpbnQgY2RmX25idWZfZGVjX251bV9mcmFncyhjZGZfbmJ1Zl90IGJ1ZikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9kZWNfbnVtX2ZyYWdzKGJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfaXNfdHNvKCkgLSBpcyB0aGUgbmV0d29yayBidWZmZXIgYSBqdW1ibyBwYWNrZXQ/CisgKiBAYnVmOiBOZXR3b3JrIGJ1ZmZlcgorICoKKyAqIFJldHVybjogMSAtIHRoaXMgaXMgYSBqdW1ibyBwYWNrZXQgMCAtIG5vdCBhIGp1bWJvIHBhY2tldAorICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgY2RmX25idWZfaXNfdHNvKGNkZl9uYnVmX3QgbmJ1ZikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9pc190c28obmJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfZ2V0X3Rzb19pbmZvKCkgLSBmdW5jdGlvbiB0byBkaXZpZGUgYSBqdW1ibyBUU08KKyAqIG5ldHdvcmsgYnVmZmVyIGludG8gc2VnbWVudHMKKyAqIEBuYnVmOiAgIG5ldHdvcmsgYnVmZmVyIHRvIGJlIHNlZ21lbnRlZAorICogQHRzb19pbmZvOiAgVGhpcyBpcyB0aGUgb3V0cHV0LiBUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiAgICAgIFRTTyBzZWdtZW50cyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoaW4gdGhpcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZyYWdtZW50cyBhIFRDUCBqdW1ibyBwYWNrZXQgaW50byBzbWFsbGVyCisgKiBzZWdtZW50cyB0byBiZSB0cmFuc21pdHRlZCBieSB0aGUgZHJpdmVyLiBJdCBjaGFpbnMgdGhlIFRTTworICogc2VnbWVudHMgY3JlYXRlZCBpbnRvIGEgbGlzdC4KKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBUU08gc2VnbWVudHMKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBjZGZfbmJ1Zl9nZXRfdHNvX2luZm8oY2RmX2RldmljZV90IG9zZGV2LAorCQkgY2RmX25idWZfdCBuYnVmLCBzdHJ1Y3QgY2RmX3Rzb19pbmZvX3QgKnRzb19pbmZvKQoreworCXJldHVybiBfX2NkZl9uYnVmX2dldF90c29faW5mbyhvc2RldiwgbmJ1ZiwgdHNvX2luZm8pOworfQorCisvKioKKyAqIGNkZl9uYnVmX2dldF90c29fbnVtX3NlZygpIC0gZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIKKyAqIG9mIFRDUCBzZWdtZW50cyB3aXRoaW4gdGhlIFRTTyBqdW1ibyBwYWNrZXQKKyAqIEBuYnVmOiAgIFRTTyBqdW1ibyBuZXR3b3JrIGJ1ZmZlciB0byBiZSBzZWdtZW50ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBUQ1Agc2VnbWVudHMgdGhhdCB0aGUKKyAgIG5ldHdvcmsgYnVmZmVyIGNhbiBiZSBkaXZpZGVkIGludG8uCisgKgorICogUmV0dXJuOiBudW1iZXIgb2YgVENQIHNlZ21lbnRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY2RmX25idWZfZ2V0X3Rzb19udW1fc2VnKGNkZl9uYnVmX3QgbmJ1ZikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9nZXRfdHNvX251bV9zZWcobmJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfaW5jX3VzZXJzKCkgLSBmdW5jdGlvbiB0byBpbmNyZW1lbnQgdGhlIG51bWJlciBvZgorICogdXNlcnMgcmVmZXJlbmNpbmcgdGhpcyBuZXR3b3JrIGJ1ZmZlcgorICoKKyAqIEBuYnVmOiAgIG5ldHdvcmsgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgdXNlcnMgcmVmZXJlbmNpbmcgdGhpcworICogbmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IHRoZSBuZXR3b3JrIGJ1ZmZlcgorICovCitzdGF0aWMgaW5saW5lIGNkZl9uYnVmX3QgY2RmX25idWZfaW5jX3VzZXJzKGNkZl9uYnVmX3QgbmJ1ZikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9pbmNfdXNlcnMobmJ1Zik7Cit9CisjZW5kaWYgLypUU08qLworCisvKioKKyAqIGNkZl9uYnVmX2RhdGFfYXR0cl9nZXQoKSAtIEdldCBkYXRhX2F0dHIgZmllbGQgZnJvbSBjdmdfbmJ1Zl9jYgorICoKKyAqIEBuYnVmOiBOZXR3b3JrIGJ1ZmZlciAoc2tiIG9uIGxpbnV4KQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWVzIG9mIGRhdGFfYXR0ciBmaWVsZAorICogaW4gc3RydWN0IGN2Z19uYnVmX2Nie30sIHRvIHdoaWNoIHNrYi0+Y2IgaXMgdHlwZWNhc3QuCisgKiBUaGlzIHZhbHVlIGlzIGFjdHVhbGx5IHRoZSB2YWx1ZSBwcm9ncmFtbWVkIGluIENFIGRlc2NyaXB0b3IuCisgKgorICogUmV0dXJuOiBWYWx1ZSBvZiBkYXRhX2F0dHIKKyAqLworc3RhdGljIGlubGluZQordWludDMyX3QgY2RmX25idWZfZGF0YV9hdHRyX2dldChjZGZfbmJ1Zl90IGJ1ZikKK3sKKwlyZXR1cm4gX19jZGZfbmJ1Zl9kYXRhX2F0dHJfZ2V0KGJ1Zik7Cit9CisKKy8qKgorICogY2RmX25idWZfZGF0YV9hdHRyX3NldCgpIC0gU2V0cyBkYXRhX2F0dHIgZmllbGQgaW4gY3ZnX25idWZfY2IKKyAqCisgKiBAbmJ1ZjogTmV0d29yayBidWZmZXIgKHNrYiBvbiBsaW51eCkKKyAqIEBkYXRhX2F0dHI6IFZhbHVlIHRvIGJlIHN0b3JlZCBjdmdfbmJ1Zl9jYi0+ZGF0YV9hdHRyCisgKgorICogVGhpcyBmdW5jdGlvbiBzdG9yZXMgdGhlIHZhbHVlIHRvIGJlIHByb2dyYW1tZWQgaW4gQ0UKKyAqIGRlc2NyaXB0b3IgYXMgcGFydCBza2ItPmNiIHdoaWNoIGlzIHR5cGVjYXN0IHRvIHN0cnVjdCBjdmdfbmJ1Zl9jYnt9CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgY2RmX25idWZfZGF0YV9hdHRyX3NldChjZGZfbmJ1Zl90IGJ1ZiwgdWludDMyX3QgZGF0YV9hdHRyKQoreworCV9fY2RmX25idWZfZGF0YV9hdHRyX3NldChidWYsIGRhdGFfYXR0cik7Cit9CisKKy8qKgorICogY2RmX25idWZfdHhfaW5mb19nZXQoKSAtIFBhcnNlIHNrYiBhbmQgZ2V0IFR4IG1ldGFkYXRhCisgKgorICogQG5idWY6IE5ldHdvcmsgYnVmZmVyIChza2Igb24gbGludXgpCisgKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIHBheWxvYWQgdG8gZmlndXJlIG91dCByZWxldmFudAorICogVHggbWV0YS1kYXRhIGUuZy4gd2hldGhlciB0byBlbmFibGUgdHhfY2xhc3NpZnkgYml0CisgKiBpbiBDRS4KKyAqCisgKiBSZXR1cm46CXZvaWQKKyAqLworI2RlZmluZSBjZGZfbmJ1Zl90eF9pbmZvX2dldCBfX2NkZl9uYnVmX3R4X2luZm9fZ2V0CisKK3ZvaWQgY2RmX25idWZfc2V0X3N0YXRlKGNkZl9uYnVmX3QgbmJ1ZiwgdWludDhfdCBjdXJyZW50X3N0YXRlKTsKK3ZvaWQgY2RmX25idWZfdHhfZGVzY19jb3VudF9kaXNwbGF5KHZvaWQpOwordm9pZCBjZGZfbmJ1Zl90eF9kZXNjX2NvdW50X2NsZWFyKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvY2RmL2luYy9jZGZfbmV0X3R5cGVzLmggYi9jb3JlL2NkZi9pbmMvY2RmX25ldF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzBjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9pbmMvY2RmX25ldF90eXBlcy5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBET0M6IGNkZl9uZXRfdHlwZXMKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHR5cGVzIHVzZWQgaW4gdGhlIG5ldHdvcmtpbmcgc3RhY2sgYWJzdHJhY3Rpb24uCisgKi8KKworI2lmbmRlZiBfQ0RGX05FVF9UWVBFU19ICisjZGVmaW5lIF9DREZfTkVUX1RZUEVTX0gKKworI2luY2x1ZGUgPGNkZl90eXBlcy5oPiAgICAgICAgICAvKiB1aW50OF90LCBldGMuICovCisKKyNkZWZpbmUgQURGX05FVF9NQUNfQUREUl9NQVhfTEVOIDYKKyNkZWZpbmUgQURGX05FVF9JRl9OQU1FX1NJWkUgICAgNjQKKyNkZWZpbmUgQURGX05FVF9FVEhfTEVOICAgICAgICAgQURGX05FVF9NQUNfQUREUl9NQVhfTEVOCisjZGVmaW5lIEFERl9ORVRfTUFYX01DQVNUX0FERFIgIDY0CisKKy8qIEV4dGVuZGVkIFRyYWZmaWMgSUQgIHBhc3NlZCB0byB0YXJnZXQgaWYgdGhlIFRJRCBpcyB1bmtub3duICovCisjZGVmaW5lIEFERl9OQlVGX1RYX0VYVF9USURfSU5WQUxJRCAgICAgMHgxZgorCisvKioKKyAqIGNkZl9uYnVmX2V4ZW1wdGlvbl90eXBlIC0gQ0RGIG5ldCBidWYgZXhlbXB0aW9uIHR5cGVzIGZvciBlbmNyeXB0aW9uCisgKiBAQ0RGX05CVUZfRVhFTVBUX05PX0VYRU1QVElPTjogTm8gZXhlbXB0aW9uCisgKiBAQ0RGX05CVUZfRVhFTVBUX0FMV0FZUzogRXhlbXB0IGFsd2F5cworICogQENERl9OQlVGX0VYRU1QVF9PTl9LRVlfTUFQUElOR19LRVlfVU5BVkFJTEFCTEU6IEV4ZW1wdCBvbiBrZXkgbWFwcGluZworICovCitlbnVtIGNkZl9uYnVmX2V4ZW1wdGlvbl90eXBlIHsKKwlDREZfTkJVRl9FWEVNUFRfTk9fRVhFTVBUSU9OID0gMCwKKwlDREZfTkJVRl9FWEVNUFRfQUxXQVlTLAorCUNERl9OQlVGX0VYRU1QVF9PTl9LRVlfTUFQUElOR19LRVlfVU5BVkFJTEFCTEUKK307CisKKy8qKgorICogdHlwZWRlZiBjZGZfbmJ1Zl90eF9ja3N1bV90IC0gdHJhbnNtaXQgY2hlY2tzdW0gb2ZmbG9hZCB0eXBlcworICogQENERl9OQlVGX1RYX0NLU1VNX05PTkU6IE5vIGNoZWNrc3VtIG9mZmxvYWQKKyAqIEBDREZfTkJVRl9UWF9DS1NVTV9JUDogSVAgaGVhZGVyIGNoZWNrc3VtIG9mZmxvYWQKKyAqIEBDREZfTkJVRl9UWF9DS1NVTV9UQ1BfVURQOiBUQ1AvVURQIGNoZWNrc3VtIG9mZmxvYWQKKyAqIEBDREZfTkJVRl9UWF9DS1NVTV9UQ1BfVURQX0lQOiBUQ1AvVURQIGFuZCBJUCBoZWFkZXIgY2hlY2tzdW0gb2ZmbG9hZAorICovCisKK3R5cGVkZWYgZW51bSB7CisJQ0RGX05CVUZfVFhfQ0tTVU1fTk9ORSwKKwlDREZfTkJVRl9UWF9DS1NVTV9JUCwKKwlDREZfTkJVRl9UWF9DS1NVTV9UQ1BfVURQLAorCUNERl9OQlVGX1RYX0NLU1VNX1RDUF9VRFBfSVAsCisKK30gY2RmX25idWZfdHhfY2tzdW1fdDsKKworLyoqCisgKiB0eXBlZGVmIGNkZl9uYnVmX2w0X3J4X2Nrc3VtX3R5cGVfdCAtIHJlY2VpdmUgY2hlY2tzdW0gQVBJIHR5cGVzCisgKiBAQ0RGX05CVUZfUlhfQ0tTVU1fVENQOiBSeCBjaGVja3N1bSBUQ1AKKyAqIEBDREZfTkJVRl9SWF9DS1NVTV9VRFA6IFJ4IGNoZWNrc3VtIFVEUAorICogQENERl9OQlVGX1JYX0NLU1VNX1RDUElQVjY6IFJ4IGNoZWNrc3VtIFRDUCBJUFY2CisgKiBAQ0RGX05CVUZfUlhfQ0tTVU1fVURQSVBWNjogUnggY2hlY2tzdW0gVURQIElQVjYKKyAqIEBDREZfTkJVRl9SWF9DS1NVTV9UQ1BfTk9QU0VVRE9IRUFERVI6IFJ4IGNoZWNrc3VtIFRDUCBubyBwc2V1ZG8gaGVhZGVyCisgKiBAQ0RGX05CVUZfUlhfQ0tTVU1fVURQX05PUFNFVURPSEVBREVSOiBSeCBjaGVja3N1bSBVRFAgbm8gcHNldWRvIGhlYWRlcgorICogQENERl9OQlVGX1JYX0NLU1VNX1RDUFNVTTE2OiBSeCBjaGVja3N1bSBUQ1AgU1VNMTYKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlDREZfTkJVRl9SWF9DS1NVTV9UQ1AgPSAweDAwMDEsCisJQ0RGX05CVUZfUlhfQ0tTVU1fVURQID0gMHgwMDAyLAorCUNERl9OQlVGX1JYX0NLU1VNX1RDUElQVjYgPSAweDAwMTAsCisJQ0RGX05CVUZfUlhfQ0tTVU1fVURQSVBWNiA9IDB4MDAyMCwKKwlDREZfTkJVRl9SWF9DS1NVTV9UQ1BfTk9QU0VVRE9IRUFERVIgPSAweDAxMDAsCisJQ0RGX05CVUZfUlhfQ0tTVU1fVURQX05PUFNFVURPSEVBREVSID0gMHgwMjAwLAorCUNERl9OQlVGX1JYX0NLU1VNX1RDUFNVTTE2ID0gMHgxMDAwLAorfSBjZGZfbmJ1Zl9sNF9yeF9ja3N1bV90eXBlX3Q7CisKKy8qKgorICogdHlwZWRlZiBjZGZfbmJ1Zl9sNF9yeF9ja3N1bV9yZXN1bHRfdCAtIHJlY2VpdmUgY2hlY2tzdW0gc3RhdHVzIHR5cGVzCisgKiBAQ0RGX05CVUZfUlhfQ0tTVU1fTk9ORTogRGV2aWNlIGZhaWxlZCB0byBjaGVja3N1bQorICogQENERl9OQlVGX1JYX0NLU1VNX1RDUF9VRFBfSFc6IFRDUC9VRFAgY2tzdW0gc3VjY2Vzc2Z1bCBhbmQgdmFsdWUgcmV0dXJuZWQKKyAqIEBDREZfTkJVRl9SWF9DS1NVTV9UQ1BfVURQX1VOTkVDRVNTQVJZOiBUQ1AvVURQIGNrc3VtIHN1Y2Nlc3NmdWwsIG5vIHZhbHVlCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQ0RGX05CVUZfUlhfQ0tTVU1fTk9ORSA9IDB4MDAwMCwKKwlDREZfTkJVRl9SWF9DS1NVTV9UQ1BfVURQX0hXID0gMHgwMDEwLAorCUNERl9OQlVGX1JYX0NLU1VNX1RDUF9VRFBfVU5ORUNFU1NBUlkgPSAweDAwMjAsCit9IGNkZl9uYnVmX2w0X3J4X2Nrc3VtX3Jlc3VsdF90OworCisvKioKKyAqIHR5cGVkZWYgY2RmX25idWZfcnhfY2tzdW1fdCAtIHJlY2VpdmUgY2hlY2tzdW0gdHlwZQorICogQGw0X3R5cGU6IEw0IHR5cGUKKyAqIEBsNF9yZXN1bHQ6IEw0IHJlc3VsdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2RmX25idWZfbDRfcnhfY2tzdW1fdHlwZV90IGw0X3R5cGU7CisJY2RmX25idWZfbDRfcnhfY2tzdW1fcmVzdWx0X3QgbDRfcmVzdWx0OworCXVpbnQzMl90IHZhbDsKK30gY2RmX25idWZfcnhfY2tzdW1fdDsKKworI2VuZGlmIC8qX0NERl9ORVRfVFlQRVNfSCovCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9pbmMvY2RmX3NvZnRpcnFfdGltZXIuaCBiL2NvcmUvY2RmL2luYy9jZGZfc29mdGlycV90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNWE5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9pbmMvY2RmX3NvZnRpcnFfdGltZXIuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBET0M6IGNkZl9zb2Z0aXJxX3RpbWVyCisgKiBUaGlzIGZpbGUgYWJzdHJhY3RzIE9TIHRpbWVycyBydW5uaW5nIGluIHNvZnQgSVJRIGNvbnRleHQuCisgKi8KKworI2lmbmRlZiBfQ0RGX1NPRlRJUlFfVElNRVJfSAorI2RlZmluZSBfQ0RGX1NPRlRJUlFfVElNRVJfSAorCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8aV9jZGZfc29mdGlycV90aW1lci5oPgorCisvKiBQbGF0Zm9ybSB0aW1lciBvYmplY3QgKi8KK3R5cGVkZWYgX19jZGZfc29mdGlycV90aW1lcl90IGNkZl9zb2Z0aXJxX3RpbWVyX3Q7CisKKy8qKgorICogY2RmX3NvZnRpcnFfdGltZXJfaW5pdCgpIC0gaW5pdGlhbGl6ZSBhIHNvZnRpcnEgdGltZXIKKyAqIEBoZGw6IE9TIGhhbmRsZQorICogQHRpbWVyOiBUaW1lciBvYmplY3QgcG9pbnRlcgorICogQGZ1bmM6IFRpbWVyIGZ1bmN0aW9uCisgKiBAYXJnOiBBcmd1ZW1lbnQgb2YgdGltZXIgZnVuY3Rpb24KKyAqIEB0eXBlOiBkZWZlcnJhYmxlIG9yIG5vbiBkZWZlcnJhYmxlIHRpbWVyIHR5cGUKKyAqCisgKiBUaW1lciB0eXBlIENERl9USU1FUl9UWVBFX1NXIG1lYW5zIGl0cyBhIGRlZmVycmFibGUgc3cgdGltZXIgd2hpY2ggd2lsbAorICogbm90IGNhdXNlIENQVSB3YWtlIHVwb24gZXhwaXJ5CisgKiBUaW1lciB0eXBlIENERl9USU1FUl9UWVBFX1dBS0VfQVBQUyBtZWFucyBpdHMgYSBub24tZGVmZXJyYWJsZSB0aW1lciB3aGljaAorICogd2lsbCBjYXVzZSBDUFUgd2FrZSB1cCBvbiBleHBpcnkKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjZGZfc29mdGlycV90aW1lcl9pbml0KGNkZl9oYW5kbGVfdCBoZGwsCisJCQljZGZfc29mdGlycV90aW1lcl90ICp0aW1lciwKKwkJCWNkZl9zb2Z0aXJxX3RpbWVyX2Z1bmNfdCBmdW5jLCB2b2lkICphcmcsCisJCQlDREZfVElNRVJfVFlQRSB0eXBlKQoreworCV9fY2RmX3NvZnRpcnFfdGltZXJfaW5pdChoZGwsIHRpbWVyLCBmdW5jLCBhcmcsIHR5cGUpOworfQorCisvKioKKyAqIGNkZl9zb2Z0aXJxX3RpbWVyX3N0YXJ0KCkgLSBzdGFydCBhIG9uZS1zaG90IHNvZnRpcnEgdGltZXIKKyAqIEB0aW1lcjogVGltZXIgb2JqZWN0IHBvaW50ZXIKKyAqIEBtc2VjOiBFeHBpcmF0aW9uIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjZGZfc29mdGlycV90aW1lcl9zdGFydChjZGZfc29mdGlycV90aW1lcl90ICp0aW1lciwgaW50IG1zZWMpCit7CisJX19jZGZfc29mdGlycV90aW1lcl9zdGFydCh0aW1lciwgbXNlYyk7Cit9CisKKy8qKgorICogY2RmX3NvZnRpcnFfdGltZXJfbW9kKCkgLSBtb2RpZnkgZXhpc3RpbmcgdGltZXIgdG8gbmV3IHRpbWVvdXQgdmFsdWUKKyAqIEB0aW1lcjogVGltZXIgb2JqZWN0IHBvaW50ZXIKKyAqIEBtc2VjOiBFeHBpcmF0aW9uIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNkZl9zb2Z0aXJxX3RpbWVyX21vZChjZGZfc29mdGlycV90aW1lcl90ICp0aW1lciwgaW50IG1zZWMpCit7CisJX19jZGZfc29mdGlycV90aW1lcl9tb2QodGltZXIsIG1zZWMpOworfQorCisvKioKKyAqIGNkZl9zb2Z0aXJxX3RpbWVyX2NhbmNlbCgpIC0gY2FuY2VsIGNkZiBzb2Z0aXJxIHRpbWVyCisgKiBAdGltZXI6IFRpbWVyIG9iamVjdCBwb2ludGVyCisgKiBAcmV0dmFsOiBUaW1lciB3YXMgY2FuY2VsbGVkIGFuZCBkZWFjdGl2ZWQKKyAqIEByZXR2YWw6IFRpbWVyIHdhcyBjYW5jZWxsZWQgYnV0IGFscmVhZHkgZ290IGZpcmVkLgorICoKKyAqIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhZnRlciBhbnkgcnVubmluZyB0aW1lciBjb21wbGV0ZXMuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBjZGZfc29mdGlycV90aW1lcl9jYW5jZWwoY2RmX3NvZnRpcnFfdGltZXJfdCAqdGltZXIpCit7CisJcmV0dXJuIF9fY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKHRpbWVyKTsKK30KKworLyoqCisgKiBjZGZfc29mdGlycV90aW1lcl9mcmVlKCkgLSBmcmVlIGNkZiBzb2Z0aXJxIHRpbWVyCisgKiBAdGltZXI6IFRpbWVyIG9iamVjdCBwb2ludGVyCisgKgorICogVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFmdGVyIGFueSBydW5uaW5nIHRpbWVyIGNvbXBsZXRlcy4KKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX3NvZnRpcnFfdGltZXJfZnJlZShjZGZfc29mdGlycV90aW1lcl90ICp0aW1lcikKK3sKKwlfX2NkZl9zb2Z0aXJxX3RpbWVyX2ZyZWUodGltZXIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvY2RmL2luYy9jZGZfc3RhdHVzLmggYi9jb3JlL2NkZi9pbmMvY2RmX3N0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNWI0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9pbmMvY2RmX3N0YXR1cy5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoX19DREZfU1RBVFVTX0gpCisjZGVmaW5lIF9fQ0RGX1NUQVRVU19ICisKKy8qKgorICogRE9DOiAgY2RmX3N0YXR1cworICoKKyAqIENvbm5lY3Rpdml0eSBkcml2ZXIgZnJhbWV3b3JrIChDREYpIHN0YXR1cyBjb2RlcworICoKKyAqIEJhc2ljIHN0YXR1cyBjb2Rlcy9kZWZpbml0aW9ucyB1c2VkIGJ5IENERgorICovCisKKy8qKgorICogdHlwZWRlZiBDREZfU1RBVFVTIC0gQ0RGIGVycm9yIGNvZGVzCisgKiBAQ0RGX1NUQVRVU19TVUNDRVNTOiBzdWNjZXNzCisgKiBAQ0RGX1NUQVRVU19FX1JFU09VUkNFUzogc3lzdGVtIHJlc291cmNlKG90aGVyIHRoYW4gbWVtb3J5KSBub3QgYXZhaWxhYmxlCisgKiBAQ0RGX1NUQVRVU19FX05PTUVNOiBub3QgZW5vdWdoIG1lbW9yeQorICogQENERl9TVEFUVVNfRV9BR0FJTjogdHJ5IGFnYWluCisgKiBAQ0RGX1NUQVRVU19FX0lOVkFMOiBpbnZhbGlkIHJlcXVlc3QKKyAqIEBDREZfU1RBVFVTX0VfRkFVTFQ6IHN5c3RlbSBmYXVsdAorICogQENERl9TVEFUVVNfRV9BTFJFQURZOiBhbm90aGVyIHJlcXVlc3QgYWxyZWFkeSBpbiBwcm9ncmVzcworICogQENERl9TVEFUVVNfRV9CQURNU0c6IGJhZCBtZXNzYWdlCisgKiBAQ0RGX1NUQVRVU19FX0JVU1k6IGRldmljZSBvciByZXNvdXJjZSBidXN5CisgKiBAQ0RGX1NUQVRVU19FX0NBTkNFTEVEOiByZXF1ZXN0IGNhbmNlbGxlZAorICogQENERl9TVEFUVVNfRV9BQk9SVEVEOiByZXF1ZXN0IGFib3J0ZWQKKyAqIEBDREZfU1RBVFVTX0VfTk9TVVBQT1JUOiByZXF1ZXN0IG5vdCBzdXBwb3J0ZWQKKyAqIEBDREZfU1RBVFVTX0VfUEVSTTogb3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQKKyAqIEBDREZfU1RBVFVTX0VfRU1QVFk6IGVtcHR5IGNvbmRpdGlvbgorICogQENERl9TVEFUVVNfRV9FWElTVFM6IGV4aXN0ZW5jZSBmYWlsdXJlCisgKiBAQ0RGX1NUQVRVU19FX1RJTUVPVVQ6IG9wZXJhdGlvbiB0aW1lb3V0CisgKiBAQ0RGX1NUQVRVU19FX0ZBSUxVUkU6IHVua25vd24gcmVhc29uIGRvIG5vdCB1c2UgdW5sZXNzIG5vdGhpZ24gZWxzZSBhcHBsaWVzCisgKiBAQ0RGX1NUQVRVU19OT1RfSU5JVElBTElaRUQ6IHJlc291cmNlIG5vdCBpbml0aWFsaXplZAorICogQENERl9TVEFUVVNfRV9OVUxMX1ZBTFVFOiByZXF1ZXN0IGlzIG51bGwKKyAqIEBDREZfU1RBVFVTX1BNQ19QRU5ESU5HOiByZXF1ZXN0IHBlbmRpZ24gaW4gcG1jCisgKiBAQ0RGX1NUQVRVU19QTUNfRElTQUJMRUQ6IHBtYyBpcyBkaXNhYmxlZAorICogQENERl9TVEFUVVNfUE1DX05PVF9OT1c6IHBtYyBub3QgcmVhZHkgbm93CisgKiBAQ0RGX1NUQVRVU19QTUNfQUNfUE9XRVI6IHBtYyBhYyBwb3dlcgorICogQENERl9TVEFUVVNfUE1DX1NZU19FUlJPUjogcG1jIHN5c3RlbSBlcnJvcgorICogQENERl9TVEFUVVNfSEVBUlRCRUFUX1RNT1VUOiBoZWFyYmVhdCB0aW1lb3V0IGVycm9yCisgKiBAQ0RGX1NUQVRVU19OVEhfQkVBQ09OX0RFTElWRVJZOiBOdGggYmVhY29uIGRlbGl2ZXJ5CisgKiBAQ0RGX1NUQVRVU19DU1JfV1JPTkdfU1RBVEU6IGNzciBpbiB3cm9uZyBzdGF0ZQorICogQENERl9TVEFUVVNfRlRfUFJFQVVUSF9LRVlfU1VDQ0VTUzogZnQgcHJlYXV0aCBrZXkgc3VjY2VzcworICogQENERl9TVEFUVVNfRlRfUFJFQVVUSF9LRVlfRkFJTEVEOiBmdCBwcmVhdXRoIGtleSBmYWlsZWQKKyAqIEBDREZfU1RBVFVTX0NNRF9OT1RfUVVFVUVEOiBjb21tYW5kIG5vdCBxdWV1ZWQKKyAqIEBDREZfU1RBVFVTX0ZXX01TR19USU1FRE9VVDogdGFyZ2V0IG1lc3NhZ2UgdGltZW91dAorICogQENERl9TVEFUVVNfTUFYOiBub3QgYSByZWFseSB2YWx1ZSBqdXN0IGEgcGxhY2UgaG9sZGVyIGZvciBtYXgKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlDREZfU1RBVFVTX1NVQ0NFU1MsCisJQ0RGX1NUQVRVU19FX1JFU09VUkNFUywKKwlDREZfU1RBVFVTX0VfTk9NRU0sCisJQ0RGX1NUQVRVU19FX0FHQUlOLAorCUNERl9TVEFUVVNfRV9JTlZBTCwKKwlDREZfU1RBVFVTX0VfRkFVTFQsCisJQ0RGX1NUQVRVU19FX0FMUkVBRFksCisJQ0RGX1NUQVRVU19FX0JBRE1TRywKKwlDREZfU1RBVFVTX0VfQlVTWSwKKwlDREZfU1RBVFVTX0VfQ0FOQ0VMRUQsCisJQ0RGX1NUQVRVU19FX0FCT1JURUQsCisJQ0RGX1NUQVRVU19FX05PU1VQUE9SVCwKKwlDREZfU1RBVFVTX0VfUEVSTSwKKwlDREZfU1RBVFVTX0VfRU1QVFksCisJQ0RGX1NUQVRVU19FX0VYSVNUUywKKwlDREZfU1RBVFVTX0VfVElNRU9VVCwKKwlDREZfU1RBVFVTX0VfRkFJTFVSRSwKKwlDREZfU1RBVFVTX05PVF9JTklUSUFMSVpFRCwKKwlDREZfU1RBVFVTX0VfTlVMTF9WQUxVRSwKKwlDREZfU1RBVFVTX1BNQ19QRU5ESU5HLAorCUNERl9TVEFUVVNfUE1DX0RJU0FCTEVELAorCUNERl9TVEFUVVNfUE1DX05PVF9OT1csCisJQ0RGX1NUQVRVU19QTUNfQUNfUE9XRVIsCisJQ0RGX1NUQVRVU19QTUNfU1lTX0VSUk9SLAorCUNERl9TVEFUVVNfSEVBUlRCRUFUX1RNT1VULAorCUNERl9TVEFUVVNfTlRIX0JFQUNPTl9ERUxJVkVSWSwKKwlDREZfU1RBVFVTX0NTUl9XUk9OR19TVEFURSwKKwlDREZfU1RBVFVTX0ZUX1BSRUFVVEhfS0VZX1NVQ0NFU1MsCisJQ0RGX1NUQVRVU19GVF9QUkVBVVRIX0tFWV9GQUlMRUQsCisJQ0RGX1NUQVRVU19DTURfTk9UX1FVRVVFRCwKKwlDREZfU1RBVFVTX0ZXX01TR19USU1FRE9VVCwKKwlDREZfU1RBVFVTX01BWAorfSBDREZfU1RBVFVTOworCisjZGVmaW5lIENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gKHN0YXR1cykpCisKKyNlbmRpZiAvKiBpZiAhZGVmaW5lZCBfX0NERl9TVEFUVVNfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvaW5jL2NkZl90aHJlYWRzLmggYi9jb3JlL2NkZi9pbmMvY2RmX3RocmVhZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWEzMjBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZGYvaW5jL2NkZl90aHJlYWRzLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKF9fQ0RGX1RIUkVBRFNfSCkKKyNkZWZpbmUgX19DREZfVEhSRUFEU19ICisKKy8qKgorICogRE9DOiAgY2RmX3RocmVhZHMKKyAqCisgKiBDb25uZWN0aXZpdHkgZHJpdmVyIGZyYW1ld29yayAoQ0RGKSB0aHJlYWQgcmVsYXRlZCBBUElzCisgKgorICovCisKKy8qIEluY2x1ZGUgRmlsZXMgKi8KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKworLyogUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMgKi8KKworLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24gKi8KKworLyoqCisgKiAgY2RmX3NsZWVwKCkgLSBzbGVlcAorICogIEBtc0ludGVydmFsIDogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZC4KKyAqICBBIHZhbHVlIG9mIDAgbWF5IG9yIG1heSBub3QgY2F1c2UgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHlpZWxkLgorICoKKyAqICBUaGlzIGZ1bmN0aW9uIHN1c3BlbmRzIHRoZSBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgdGhyZWFkCisgKiAgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lIG91dCBpbnRlcnZhbCBlbGFwc2VzLgorICoKKyAqICBSZXR1cm46IG5vdGhpbmcKKyAqLwordm9pZCBjZGZfc2xlZXAodWludDMyX3QgbXNJbnRlcnZhbCk7CisKKy8qKgorICogIGNkZl9zbGVlcF91cygpIC0gc2xlZXAKKyAqICBAdXNJbnRlcnZhbCA6IE51bWJlciBvZiBtaWNyb3NlY29uZHMgdG8gc3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQuCisgKiAgQSB2YWx1ZSBvZiAwIG1heSBvciBtYXkgbm90IGNhdXNlIHRoZSBjdXJyZW50IHRocmVhZCB0byB5aWVsZC4KKyAqCisgKiAgVGhpcyBmdW5jdGlvbiBzdXNwZW5kcyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjdXJyZW50IHRocmVhZAorICogIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZSBvdXQgaW50ZXJ2YWwgZWxhcHNlcy4KKyAqCisgKiAgUmV0dXJuIDogbm90aGluZworICovCit2b2lkIGNkZl9zbGVlcF91cyh1aW50MzJfdCB1c0ludGVydmFsKTsKKworLyoqCisgKiAgY2RmX2J1c3lfd2FpdCgpIC0gYnVzeSB3YWl0CisgKiAgQHVzSW50ZXJ2YWwgOiBOdW1iZXIgb2YgbWljcm9zZWNvbmRzIHRvIGJ1c3kgd2FpdC4KKyAqCisgKiAgVGhpcyBmdW5jdGlvbiBwbGFjZXMgdGhlIGN1cnJlbnQgdGhyZWFkIGluIGJ1c3kgd2FpdCB1bnRpbCB0aGUgc3BlY2lmaWVkCisgKiAgdGltZSBvdXQgaW50ZXJ2YWwgZWxhcHNlcy4gSWYgdGhlIGludGVydmFsIGlzIGdyZWF0ZXIgdGhhbiA1MHVzIG9uIFdNLCB0aGUKKyAqICBiZWhhdmlvdXIgaXMgdW5kZWZpbmVkLgorICoKKyAqICBSZXR1cm4gOiBub3RoaW5nCisgKi8KK3ZvaWQgY2RmX2J1c3lfd2FpdCh1aW50MzJfdCB1c0ludGVydmFsKTsKKworI2VuZGlmIC8qIF9fQ0RGX1RIUkVBRFNfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvaW5jL2NkZl90aW1lLmggYi9jb3JlL2NkZi9pbmMvY2RmX3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjVkMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZGYvaW5jL2NkZl90aW1lLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiBjZGZfdGltZQorICogVGhpcyBmaWxlIGFic3RyYWN0cyB0aW1lIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS4KKyAqLworCisjaWZuZGVmIF9DREZfT1NfVElNRV9ICisjZGVmaW5lIF9DREZfT1NfVElNRV9ICisKKyNpbmNsdWRlIDxpX2NkZl90aW1lLmg+CisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2VuZGlmCisKK3R5cGVkZWYgX19jZGZfdGltZV90IGNkZl90aW1lX3Q7CisKKy8qKgorICogY2RmX3N5c3RlbV90aWNrcygpIC0gQ291bnQgdGhlIG51bWJlciBvZiB0aWNrcyBlbGFwc2VkIGZyb20gdGhlIHRpbWUgd2hlbgorICoJCQl0aGUgc3lzdGVtIGJvb3RlZAorICoKKyAqIFJldHVybjogdGlja3MKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNkZl9zeXN0ZW1fdGlja3Modm9pZCkKK3sKKwlyZXR1cm4gX19jZGZfc3lzdGVtX3RpY2tzKCk7Cit9CisKKy8qKgorICogY2RmX3N5c3RlbV90aWNrc190b19tc2VjcygpIC0gY29udmVydCB0aWNrcyB0byBtaWxsaXNlY29uZHMKKyAqIEBjbG9ja190aWNrczogTnVtYmVyIG9mIHRpY2tzCisgKgorICogUmV0dXJuOiBUaW1lIGluIG1pbGxpc2Vjb25kcworICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNkZl9zeXN0ZW1fdGlja3NfdG9fbXNlY3ModW5zaWduZWQgbG9uZyBjbG9ja190aWNrcykKK3sKKwlyZXR1cm4gX19jZGZfc3lzdGVtX3RpY2tzX3RvX21zZWNzKGNsb2NrX3RpY2tzKTsKK30KKworLyoqCisgKiBjZGZfc3lzdGVtX21zZWNzX3RvX3RpY2tzKCkgLSBjb252ZXJ0IG1pbGxpc2Vjb25kcyB0byB0aWNrcworICogQG1zZWM6IFRpbWUgaW4gbWlsbGlzZWNvbmRzCisgKgorICogUmV0dXJuOiBudW1iZXIgb2YgdGlja3MKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNkZl9zeXN0ZW1fbXNlY3NfdG9fdGlja3ModWludDMyX3QgbXNlY3MpCit7CisJcmV0dXJuIF9fY2RmX3N5c3RlbV9tc2Vjc190b190aWNrcyhtc2Vjcyk7Cit9CisKKy8qKgorICogY2RmX2dldF9zeXN0ZW1fdXB0aW1lKCkgLSBSZXR1cm4gYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdGltZS4KKyAqIFRoaXMgaW5jcmVtZW50cyBvbmNlIHBlciBIWiB0aWNrcworICoKKyAqIFJldHVybjogc3lzdGVtIHVwIHRpbWUKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNkZl9nZXRfc3lzdGVtX3VwdGltZSh2b2lkKQoreworCXJldHVybiBfX2NkZl9nZXRfc3lzdGVtX3VwdGltZSgpOworfQorCisvKioKKyAqIGNkZl9nZXRfc3lzdGVtX3RpbWVzdGFtcCgpIC0gYnJpZWYgUmV0dXJuIGN1cnJlbnQgdGltZXN0YW1wCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjZGZfZ2V0X3N5c3RlbV90aW1lc3RhbXAodm9pZCkKK3sKKwlyZXR1cm4gX19jZGZfZ2V0X3N5c3RlbV90aW1lc3RhbXAoKTsKK30KKworLyoqCisgKiBjZGZfdWRlbGF5KCkgLSBkZWxheSBpbiBtaWNyb3NlY29uZHMKKyAqIEB1c2VjczogTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyB0byBkZWxheQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX3VkZWxheShpbnQgdXNlY3MpCit7CisJX19jZGZfdWRlbGF5KHVzZWNzKTsKK30KKworLyoqCisgKiBjZGZfbWRlbGF5KCkgLSBEZWxheSBpbiBtaWxsaXNlY29uZHMuCisgKiBAbXNlYzogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX21kZWxheShpbnQgbXNlY3MpCit7CisJX19jZGZfbWRlbGF5KG1zZWNzKTsKK30KKworLyogQ2hlY2sgaWYgX2EgaXMgbGF0ZXIgdGhhbiBfYiAqLworI2RlZmluZSBjZGZfc3lzdGVtX3RpbWVfYWZ0ZXIoX2EsIF9iKSAgICAgICBfX2NkZl9zeXN0ZW1fdGltZV9hZnRlcihfYSwgX2IpCisKKy8qIENoZWNrIGlmIF9hIGlzIHByaW9yIHRvIF9iICovCisjZGVmaW5lIGNkZl9zeXN0ZW1fdGltZV9iZWZvcmUoX2EsIF9iKSAgICAgIF9fY2RmX3N5c3RlbV90aW1lX2JlZm9yZShfYSwgX2IpCisKKy8qIENoZWNrIGlmIF9hIGF0bGVhc3QgYXMgcmVjZW50IGFzIF9iLCBpZiBub3QgbGF0ZXIgKi8KKyNkZWZpbmUgY2RmX3N5c3RlbV90aW1lX2FmdGVyX2VxKF9hLCBfYikgICAgX19jZGZfc3lzdGVtX3RpbWVfYWZ0ZXJfZXEoX2EsIF9iKQorCisjaWZkZWYgUUNBX1dJRklfM18wX0FEUkFTVEVBCisvKioKKyAqIGNkZl9nZXRfbG9nX3RpbWVzdGFtcCgpIC0gZ2V0IHRpbWUgc3RhbXAgZm9yIGxvZ2dpbmcKKyAqCisgKiBGb3IgYWRyYXN0ZWEgdGhpcyBBUEkgcmV0dXJucyBRVElNRVIgdGljayB3aGljaCBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUKKyAqIGhvc3QgYW5kIGZ3IGxvZyB0aW1lc3RhbXBzCisgKgorICogRm9yIFJPTUUgYW5kIG90aGVyIGRpc2NyZXRlIHNvbHV0aW9uIHRoaXMgQVBJIHJldHVybnMgc3lzdGVtIGJvb3QgdGltZSBzdGFtcAorICoKKyAqIFJldHVybjoKKyAqCVFUSU1FUiB0aWNrcygxOS4yTUh6KSBmb3IgYWRyYXN0ZWEKKyAqCVN5c3RlbSB0aWNrIGZvciByb21lIGFuZCBvdGhlciBmdXR1cmUgZGlzY3JldGUgc29sdXRpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgY2RmX2dldF9sb2dfdGltZXN0YW1wKHZvaWQpCit7CisJcmV0dXJuIF9fY2RmX2dldF9xdGltZXJfdGlja3MoKTsKK30KKyNlbHNlCisvKioKKyAqIGNkZl9nZXRfbG9nX3RpbWVzdGFtcCgpIC0gZ2V0IHRpbWUgc3RhbXAgZm9yIGxvZ2dpbmcKKyAqCisgKiBGb3IgYWRyYXN0ZWEgdGhpcyBBUEkgcmV0dXJucyBRVElNRVIgdGljayB3aGljaCBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUKKyAqIGhvc3QgYW5kIGZ3IGxvZyB0aW1lc3RhbXBzCisgKgorICogRm9yIFJPTUUgYW5kIG90aGVyIGRpc2NyZXRlIHNvbHV0aW9uIHRoaXMgQVBJIHJldHVybnMgc3lzdGVtIGJvb3QgdGltZSBzdGFtcAorICoKKyAqIFJldHVybjoKKyAqCVFUSU1FUiB0aWNrcygxOS4yTUh6KSBmb3IgYWRyYXN0ZWEKKyAqCVN5c3RlbSB0aWNrIGZvciByb21lIGFuZCBvdGhlciBmdXR1cmUgZGlzY3JldGUgc29sdXRpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgY2RmX2dldF9sb2dfdGltZXN0YW1wKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NOU1MKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwljbnNzX2dldF9ib290dGltZSgmdHMpOworCisJcmV0dXJuICgodWludDY0X3QpIHRzLnR2X3NlYyAqIDEwMDAwMDApICsgKHRzLnR2X25zZWMgLyAxMDAwKTsKKyNlbHNlCisJcmV0dXJuIGNkZl9zeXN0ZW1fdGlja3NfdG9fbXNlY3MoY2RmX3N5c3RlbV90aWNrcygpKSAqIDEwMDA7CisjZW5kaWYgLyogQ09ORklHX0NOU1MgKi8KK30KKyNlbmRpZiAvKiBRQ0FfV0lGSV8zXzBfQURSQVNURUEgKi8KKworLyoqCisgKiBjZGZfZ2V0X21vbm90b25pY19ib290dGltZSgpIC0gZ2V0IG1vbm90b25pYyBrZXJuZWwgYm9vdCB0aW1lCisgKiBUaGlzIEFQSSBpcyBzaW1pbGFyIHRvIGNkZl9nZXRfc3lzdGVtX2Jvb3R0aW1lIGJ1dCBpdCBpbmNsdWRlcworICogdGltZSBzcGVudCBpbiBzdXNwZW5kLgorICoKKyAqIFJldHVybjogVGltZSBpbiBtaWNyb3NlY29uZHMKKyAqLworc3RhdGljIGlubGluZSB1aW50NjRfdCBjZGZfZ2V0X21vbm90b25pY19ib290dGltZSh2b2lkKQoreworCXJldHVybiBfX2NkZl9nZXRfbW9ub3RvbmljX2Jvb3R0aW1lKCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvaW5jL2NkZl90cmFjZS5oIGIvY29yZS9jZGYvaW5jL2NkZl90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjc4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9pbmMvY2RmX3RyYWNlLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChfX0NERl9UUkFDRV9IKQorI2RlZmluZSBfX0NERl9UUkFDRV9ICisKKy8qKgorICogIERPQzogIGNkZl90cmFjZQorICoKKyAqICBDb25uZWN0aXZpdHkgZHJpdmVyIGZyYW1ld29yayB0cmFjZSBBUElzCisgKgorICogIFRyYWNlLCBsb2dnaW5nLCBhbmQgZGVidWdnaW5nIGRlZmluaXRpb25zIGFuZCBBUElzCisgKgorICovCisKKy8qIEluY2x1ZGUgRmlsZXMgKi8KKyNpbmNsdWRlICA8Y2RmX3R5cGVzLmg+ICAgICAgICAgLyogRm9yIENERl9NT0RVTEVfSUQuLi4gKi8KKyNpbmNsdWRlICA8c3RkYXJnLmg+ICAgICAgICAgICAgLyogRm9yIHZhX2xpc3QuLi4gKi8KKyNpbmNsdWRlICA8Y2RmX3N0YXR1cy5oPgorI2luY2x1ZGUgIDxjZGZfbmJ1Zi5oPgorI2luY2x1ZGUgIDxjZHNfcGFja2V0Lmg+CisjaW5jbHVkZSAgPGlfY2RmX3R5cGVzLmg+CisKKy8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKK3R5cGVkZWYgZW51bSB7CisJLyogTk9ORSBtZWFucyBOTyB0cmFjZXMgd2lsbCBiZSBsb2dnZWQuICBUaGlzIHZhbHVlIGlzIGluIHBsYWNlCisJICogZm9yIHRoZSBjZGZfdHJhY2Vfc2V0bGV2ZWwoKSB0byBhbGxvdyB0aGUgdXNlciB0byB0dXJuIG9mZgorCSAqIGFsbCB0cmFjZXMKKwkgKi8KKwlDREZfVFJBQ0VfTEVWRUxfTk9ORSA9IDAsCisKKwkvKiBGb2xsb3dpbmcgdHJhY2UgbGV2ZWxzIGFyZSB0aGUgb25lcyB0aGF0ICdjYWxsZXJzJyBvZiBDREZfVFJBQ0UoKQorCSAqIGNhbiBzcGVjaWZ5IGluIGZvciB0aGUgQ0RGX1RSQUNFX0xFVkVMIHBhcmFtZXRlci4gIFRyYWNlcyBhcmUKKwkgKiBjbGFzc2lmaWVkIGJ5IHNldmVyaXR5LiBGQVRBTCBiZWluZyBtb3JlIHNlcmlvdXMgdGhhbiBJTkZPIGZvcgorCSAqIGV4YW1wbGUKKwkgKi8KKwlDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCUNERl9UUkFDRV9MRVZFTF9XQVJOLAorCUNERl9UUkFDRV9MRVZFTF9JTkZPLAorCUNERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCUNERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwlDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisKKwkvKiBBbGwgbWVhbnMgYWxsIHRyYWNlIGxldmVscyB3aWxsIGJlIGFjdGl2ZS4gIFRoaXMgdmFsdWUgaXMgaW4gcGxhY2UKKwkgKiBmb3IgdGhlIGNkZl90cmFjZV9zZXRsZXZlbCgpIHRvIGFsbG93IHRoZSB1c2VyIHRvIHR1cm4gT04gYWxsIHRyYWNlcworCSAqLworCUNERl9UUkFDRV9MRVZFTF9BTEwsCisKKwkvKiBOb3QgYSByZWFsIGxldmVsLiAgVXNlZCB0byBpZGVudGlmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YKKwkgKiBDREZfVFJBQ0VfTEVWRUxzIGRlZmluZWQKKwkgKi8KKwlDREZfVFJBQ0VfTEVWRUxfTUFYCit9IENERl9UUkFDRV9MRVZFTDsKKworLyogQnkgZGVmYXVsdCBEYXRhIFBhdGggbW9kdWxlIHdpbGwgaGF2ZSBhbGwgbG9nIGxldmVscyBlbmFibGVkLCBleGNlcHQgZGVidWcKKyAqIGxvZyBsZXZlbC4gRGVidWcgbGV2ZWwgd2lsbCBiZSBsZWZ0IHVwIHRvIHRoZSBmcmFtZXdvcmsgb3IgdXNlciBzcGFjZSBtb2R1bGVzCisgKiB0byBiZSBlbmFibGVkIHdoZW4gaXNzdWUgaXMgZGV0ZWN0ZWQKKyAqLworI2RlZmluZSBDREZfREFUQV9QQVRIX1RSQUNFX0xFVkVMIFwKKwkoKDEgPDwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMKSB8ICgxIDw8IENERl9UUkFDRV9MRVZFTF9FUlJPUikgfCBcCisJKDEgPDwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4pIHwgKDEgPDwgQ0RGX1RSQUNFX0xFVkVMX0lORk8pIHwgXAorCSgxIDw8IENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gpIHwgKDEgPDwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVEKSB8IFwKKwkoMSA8PCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1cpKQorCisvKiBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cyAqLworI2RlZmluZSBBU1NFUlRfQlVGRkVSX1NJWkUgKDUxMikKKworI2RlZmluZSBDREZfRU5BQkxFX1RSQUNJTkcKKyNkZWZpbmUgTUFYX0NERl9UUkFDRV9SRUNPUkRTIDQwMDAKKyNkZWZpbmUgSU5WQUxJRF9DREZfVFJBQ0VfQUREUiAweGZmZmZmZmZmCisjZGVmaW5lIERFRkFVTFRfQ0RGX1RSQUNFX0RVTVBfQ09VTlQgMAorCisjaW5jbHVkZSAgPGlfY2RmX3RyYWNlLmg+CisKKyNpZmRlZiBUUkFDRV9SRUNPUkQKKworI2RlZmluZSBNVFJBQ0UocCkgcAorI2RlZmluZSBOT19TRVNTSU9OIDB4RkYKKworI2Vsc2UKKyNkZWZpbmUgTVRSQUNFKHApIHsgIH0KKworI2VuZGlmCisKKy8qIFN0cnVjdHVyZSBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdCBjZGZfdHJhY2VfcmVjb3JkX3MgeworCXVpbnQ2NF90IHRpbWU7CisJdWludDhfdCBtb2R1bGU7CisJdWludDhfdCBjb2RlOworCXVpbnQxNl90IHNlc3Npb247CisJdWludDMyX3QgZGF0YTsKKwl1aW50MzJfdCBwaWQ7Cit9IGNkZl90cmFjZV9yZWNvcmRfdCwgKnRwX2NkZl90cmFjZV9yZWNvcmQ7CisKK3R5cGVkZWYgc3RydWN0IHNfY2RmX3RyYWNlX2RhdGEgeworCS8qIE1UUkFDRSBsb2dzIGFyZSBzdG9yZWQgaW4gcmluZyBidWZmZXIgd2hlcmUgaGVhZCByZXByZXNlbnRzIHRoZQorCSAqIHBvc2l0aW9uIG9mIGZpcnN0IHJlY29yZCwgdGFpbCByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiBsYXN0IHJlY29yZAorCSAqIGFkZGVkIHRpbGwgbm93IGFuZCBudW0gaXMgdGhlIGNvdW50IG9mIHRvdGFsIHJlY29yZCBhZGRlZAorCSAqLworCXVpbnQzMl90IGhlYWQ7CisJdWludDMyX3QgdGFpbDsKKwl1aW50MzJfdCBudW07CisJdWludDE2X3QgbnVtU2luY2VMYXN0RHVtcDsKKworCS8qIGNvbmZpZyBmb3IgY29udHJvbGxpbmcgdGhlIHRyYWNlICovCisJdWludDhfdCBlbmFibGU7CisJLyogRHVtcCBhZnRlciBudW1iZXIgb2YgcmVjb3JkcyByZWFjaCB0aGlzIG51bWJlciAqLworCXVpbnQxNl90IGR1bXBDb3VudDsKK30gdF9jZGZfdHJhY2VfZGF0YTsKKworI2RlZmluZSBDQVNFX1JFVFVSTl9TVFJJTkcoc3RyKSBjYXNlICgoc3RyKSk6IHJldHVybiAodWludDhfdCAqKSgjIHN0cik7CisKKy8qIERQIFRyYWNlIEltcGxlbWVudGF0aW9uICovCisjZGVmaW5lIERQVFJBQ0UocCkgcAorCisjZGVmaW5lIE1BWF9DREZfRFBfVFJBQ0VfUkVDT1JEUyAgICAgICA0MDAwCisjZGVmaW5lIENERl9EUF9UUkFDRV9SRUNPUkRfU0laRSAgICAgICAxNgorI2RlZmluZSBJTlZBTElEX0NERl9EUF9UUkFDRV9BRERSICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBDREZfRFBfVFJBQ0VfVkVSQk9TSVRZX0hJR0ggICAgMworI2RlZmluZSBDREZfRFBfVFJBQ0VfVkVSQk9TSVRZX01FRElVTSAgMgorI2RlZmluZSBDREZfRFBfVFJBQ0VfVkVSQk9TSVRZX0xPVyAgICAgMQorI2RlZmluZSBDREZfRFBfVFJBQ0VfVkVSQk9TSVRZX0RFRkFVTFQgMAorCisvKioKKyAqIGVudW0gQ0RGX0RQX1RSQUNFX0lEIC0gR2VuZXJpYyBJRCB0byBpZGVudGlmeSB2YXJpb3VzIGV2ZW50cyBpbiBkYXRhIHBhdGgKKyAqIEBDREZfRFBfVFJBQ0VfSU5WQUxJRDogSW52YWxpZCBJRAorICogQENERl9EUF9UUkFDRV9EUk9QX1BBQ0tFVF9SRUNPUkQ6IERyb3BwZWQgcGFja2V0IHN0b3JlZCB3aXRoIHRoaXMgaWQKKyAqIEBDREZfRFBfVFJBQ0VfSEREX1BBQ0tFVF9QVFJfUkVDT1JEOiBuYnVmLT5kYXRhIHB0ciBvZiBIREQKKyAqIEBDREZfRFBfVFJBQ0VfSEREX1BBQ0tFVF9SRUNPUkQ6IG5idWYtPmRhdGEgc3RvcmVkIHdpdGggdGhpcyBpZAorICogQENERl9EUF9UUkFDRV9DRV9QQUNLRVRfUFRSX1JFQ09SRDogbmJ1Zi0+ZGF0YSBwdHIgb2YgQ0UKKyAqIEBDREZfRFBfVFJBQ0VfQ0VfUEFDS0VUX1JFQ09SRDogbmJ1Zi0+ZGF0YSBzdG9yZWQgd2l0aCB0aGlzIGlkCisgKiBAQ0RGX0RQX1RSQUNFX1RYUlhfUVVFVUVfUEFDS0VUX1BUUl9SRUNPUkQ6IG5idWYtPmRhdGEgcHRyIG9mIHR4cnggcXVldWUKKyAqIEBDREZfRFBfVFJBQ0VfVFhSWF9QQUNLRVRfUFRSX1JFQ09SRDogbmJ1Zi0+ZGF0YSBwdHIgb2YgdHhyeAorICogQENERl9EUF9UUkFDRV9IVFRfUEFDS0VUX1BUUl9SRUNPUkQ6IG5idWYtPmRhdGEgcHRyIG9mIGh0dAorICogQENERl9EUF9UUkFDRV9IVENfUEFDS0VUX1BUUl9SRUNPUkQ6IG5idWYtPmRhdGEgcHRyIG9mIGh0YworICogQENERl9EUF9UUkFDRV9ISUZfUEFDS0VUX1BUUl9SRUNPUkQ6IG5idWYtPmRhdGEgcHRyIG9mIGhpZgorICogQENERl9EUF9UUkFDRV9IRERfVFhfVElNRU9VVDogaGRkIHR4IHRpbWVvdXQgZXZlbnQKKyAqIEBDREZfRFBfVFJBQ0VfSEREX1NPRlRBUF9UWF9USU1FT1VUOiBoZGQgdHggc29mdGFwIHRpbWVvdXQgZXZlbnQKKyAqIEBDREZfRFBfVFJBQ0VfVkRFVl9QQVVTRTogdmRldiBwYXVzZSBldmVudAorICogQENERl9EUF9UUkFDRV9WREVWX1VOUEFVU0U6IHZkZXYgdW5wYXVzZSBldmVudAorICoKKyAqLworZW51bSAgQ0RGX0RQX1RSQUNFX0lEIHsKKwlDREZfRFBfVFJBQ0VfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKwlDREZfRFBfVFJBQ0VfRFJPUF9QQUNLRVRfUkVDT1JEICAgICAgICAgICAgICAgID0gMSwKKwlDREZfRFBfVFJBQ0VfSEREX1BBQ0tFVF9QVFJfUkVDT1JEICAgICAgICAgICAgID0gMiwKKwlDREZfRFBfVFJBQ0VfSEREX1BBQ0tFVF9SRUNPUkQgICAgICAgICAgICAgICAgID0gMywKKwlDREZfRFBfVFJBQ0VfQ0VfUEFDS0VUX1BUUl9SRUNPUkQgICAgICAgICAgICAgID0gNCwKKwlDREZfRFBfVFJBQ0VfQ0VfUEFDS0VUX1JFQ09SRCAgICAgICAgICAgICAgICAgID0gNSwKKwlDREZfRFBfVFJBQ0VfVFhSWF9RVUVVRV9QQUNLRVRfUFRSX1JFQ09SRCAgICAgID0gNiwKKwlDREZfRFBfVFJBQ0VfVFhSWF9QQUNLRVRfUFRSX1JFQ09SRCAgICAgICAgICAgID0gNywKKwlDREZfRFBfVFJBQ0VfSFRUX1BBQ0tFVF9QVFJfUkVDT1JEICAgICAgICAgICAgID0gOCwKKwlDREZfRFBfVFJBQ0VfSFRDX1BBQ0tFVF9QVFJfUkVDT1JEICAgICAgICAgICAgID0gOSwKKwlDREZfRFBfVFJBQ0VfSElGX1BBQ0tFVF9QVFJfUkVDT1JEICAgICAgICAgICAgID0gMTAsCisJQ0RGX0RQX1RSQUNFX0hERF9UWF9USU1FT1VUICAgICAgICAgICAgICAgICAgICA9IDExLAorCUNERl9EUF9UUkFDRV9IRERfU09GVEFQX1RYX1RJTUVPVVQgICAgICAgICAgICAgPSAxMiwKKwlDREZfRFBfVFJBQ0VfVkRFVl9QQVVTRSAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsCisJQ0RGX0RQX1RSQUNFX1ZERVZfVU5QQVVTRSAgICAgICAgICAgICAgICAgICAgICA9IDE0LAorCUNERl9EUF9UUkFDRV9NQVgKKworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2RmX2RwX3RyYWNlX3JlY29yZF9zIC0gRGVzY3JpYmVzIGEgcmVjb3JkIGluIERQIHRyYWNlCisgKiBAdGltZTogdGltZSB3aGVuIGl0IGdvdCBzdG9yZWQKKyAqIEBjb2RlOiBEZXNjcmliZXMgdGhlIHBhcnRpY3VsYXIgZXZlbnQKKyAqIEBkYXRhOiBidWZmZXIgdG8gc3RvcmUgZGF0YQorICogQHNpemU6IExlbmd0aCBvZiB0aGUgdmFsaWQgZGF0YSBzdG9yZWQgaW4gdGhpcyByZWNvcmQKKyAqIEBwaWQgOiBwcm9jZXNzIGlkIHdoaWNoIHN0b3JlZCB0aGUgZGF0YSBpbiB0aGlzIHJlY29yZAorICovCitzdHJ1Y3QgY2RmX2RwX3RyYWNlX3JlY29yZF9zIHsKKwl1aW50NjRfdCB0aW1lOworCXVpbnQ4X3QgY29kZTsKKwl1aW50OF90IGRhdGFbQ0RGX0RQX1RSQUNFX1JFQ09SRF9TSVpFXTsKKwl1aW50OF90IHNpemU7CisJdWludDMyX3QgcGlkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2RmX2RwX3RyYWNlX2RhdGEgLSBQYXJhbWV0ZXJzIHRvIGNvbmZpZ3VyZS9jb250cm9sIERQIHRyYWNlCisgKiBAaGVhZDogUG9zaXRpb24gb2YgZmlyc3QgcmVjb3JkCisgKiBAdGFpbDogUG9zaXRpb24gb2YgbGFzdCByZWNvcmQKKyAqIEBudW06ICBDdXJyZW50IGluZGV4CisgKiBAcHJvdG9fYml0bWFwOiBkZWZpbmVzIHdoaWNoIHByb3RvY29sIHRvIGJlIHRyYWNlZAorICogQG5vX29mX3JlY29yZDogZGVmaW5lcyBldmVyeSBudGggcGFja2V0IHRvIGJlIHRyYWNlZAorICogQHZlcmJvc2l0eSA6IGRlZmluZXMgdmVyYm9zaXR5IGxldmVsCisgKiBAZW5hYmxlOiBlbmFibGUvZGlzYWJsZSBEUCB0cmFjZQorICogQGNvdW50OiBjdXJyZW50IHBhY2tldCBudW1iZXIKKyAqLworc3RydWN0IHNfY2RmX2RwX3RyYWNlX2RhdGEgeworCXVpbnQzMl90IGhlYWQ7CisJdWludDMyX3QgdGFpbDsKKwl1aW50MzJfdCBudW07CisKKwkvKiBjb25maWcgZm9yIGNvbnRyb2xsaW5nIHRoZSB0cmFjZSAqLworCXVpbnQ4X3QgcHJvdG9fYml0bWFwOworCXVpbnQ4X3Qgbm9fb2ZfcmVjb3JkOworCXVpbnQ4X3QgdmVyYm9zaXR5OworCWJvb2wgZW5hYmxlOworCXVpbnQzMl90IGNvdW50OworfTsKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uICovCisKKy8qKgorICogY2RmX3RyYWNlX3NldF9sZXZlbCgpIC0gU2V0IHRoZSB0cmFjZSBsZXZlbCBmb3IgYSBwYXJ0aWN1bGFyIG1vZHVsZQorICogQGxldmVsIDogdHJhY2UgbGV2ZWwKKyAqCisgKiBUcmFjZSBsZXZlbCBpcyBhIG1lbWJlciBvZiB0aGUgQ0RGX1RSQUNFX0xFVkVMIGVudW1lcmF0aW9uIGluZGljYXRpbmcKKyAqIHRoZSBzZXZlcml0eSBvZiB0aGUgY29uZGl0aW9uIGNhdXNpbmcgdGhlIHRyYWNlIG1lc3NhZ2UgdG8gYmUgaXNzdWVkLgorICogTW9yZSBzZXZlcmUgY29uZGl0aW9ucyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgbG9nZ2VkLgorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZXJuYWwgQVBJIHRoYXQgYWxsb3dzIHRyYWNlIGxldmVscyB0byBiZSBzZXQgZm9yIGVhY2ggbW9kdWxlLgorICoKKyAqIFJldHVybjogIG5vdGhpbmcKKyAqLwordm9pZCBjZGZfdHJhY2Vfc2V0X2xldmVsKENERl9NT0RVTEVfSUQgbW9kdWxlLCBDREZfVFJBQ0VfTEVWRUwgbGV2ZWwpOworCisvKioKKyAqIGNkZl90cmFjZV9nZXRfbGV2ZWwoKSAtIGdldCB0aGUgdHJhY2UgbGV2ZWwKKyAqIEBsZXZlbCA6IHRyYWNlIGxldmVsCisgKgorICogVGhpcyBpcyBhbiBleHRlcm5hbCBBUEkgdGhhdCByZXR1cm5zIGEgYm9vbCB2YWx1ZSB0byBzaWduaWZ5IGlmIGEKKyAqIHBhcnRpY3VsYXIgdHJhY2UgbGV2ZWwgaXMgc2V0IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4KKyAqIEEgbWVtYmVyIG9mIHRoZSBDREZfVFJBQ0VfTEVWRUwgZW51bWVyYXRpb24gaW5kaWNhdGluZyB0aGUgc2V2ZXJpdHkKKyAqIG9mIHRoZSBjb25kaXRpb24gY2F1c2luZyB0aGUgdHJhY2UgbWVzc2FnZSB0byBiZSBpc3N1ZWQuCisgKgorICogTm90ZSB0aGF0IGluZGl2aWR1YWwgdHJhY2UgbGV2ZWxzIGFyZSB0aGUgb25seSB2YWxpZCB2YWx1ZXMKKyAqIGZvciB0aGlzIEFQSS4gIENERl9UUkFDRV9MRVZFTF9OT05FIGFuZCBDREZfVFJBQ0VfTEVWRUxfQUxMCisgKiBhcmUgbm90IHZhbGlkIGlucHV0IGFuZCB3aWxsIHJldHVybiBmYWxzZQorICoKKyAqIFJldHVybjoKKyAqICBmYWxzZSAtIHRoZSBzcGVjaWZpZWQgdHJhY2UgbGV2ZWwgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlIGlzIE9GRgorICogIHRydWUgLSB0aGUgc3BlY2lmaWVkIHRyYWNlIGxldmVsIGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZSBpcyBPTgorICovCitib29sIGNkZl90cmFjZV9nZXRfbGV2ZWwoQ0RGX01PRFVMRV9JRCBtb2R1bGUsIENERl9UUkFDRV9MRVZFTCBsZXZlbCk7CisKK3R5cGVkZWYgdm9pZCAoKnRwX2NkZl90cmFjZV9jYikodm9pZCAqcE1hYywgdHBfY2RmX3RyYWNlX3JlY29yZCwgdWludDE2X3QpOwordm9pZCBjZGZfdHJhY2UodWludDhfdCBtb2R1bGUsIHVpbnQ4X3QgY29kZSwgdWludDE2X3Qgc2Vzc2lvbiwgdWludDMyX3QgZGF0YSk7Cit2b2lkIGNkZl90cmFjZV9yZWdpc3RlcihDREZfTU9EVUxFX0lELCB0cF9jZGZfdHJhY2VfY2IpOworQ0RGX1NUQVRVUyBjZGZfdHJhY2Vfc3Bpbl9sb2NrX2luaXQodm9pZCk7Cit2b2lkIGNkZl90cmFjZV9pbml0KHZvaWQpOwordm9pZCBjZGZfdHJhY2VfZW5hYmxlKHVpbnQzMl90LCB1aW50OF90IGVuYWJsZSk7Cit2b2lkIGNkZl90cmFjZV9kdW1wX2FsbCh2b2lkICosIHVpbnQ4X3QsIHVpbnQ4X3QsIHVpbnQzMl90LCB1aW50MzJfdCk7CisKK3ZvaWQgY2RmX2RwX3RyYWNlX3NwaW5fbG9ja19pbml0KHZvaWQpOwordm9pZCBjZGZfZHBfdHJhY2VfaW5pdCh2b2lkKTsKK3ZvaWQgY2RmX2RwX3RyYWNlX3NldF92YWx1ZSh1aW50OF90IHByb3RvX2JpdG1hcCwgdWludDhfdCBub19vZl9yZWNvcmRzLAorCQkJIHVpbnQ4X3QgdmVyYm9zaXR5KTsKK3ZvaWQgY2RmX2RwX3RyYWNlX3NldF90cmFjayhjZGZfbmJ1Zl90IG5idWYpOwordm9pZCBjZGZfZHBfdHJhY2UoY2RmX25idWZfdCBuYnVmLCBlbnVtIENERl9EUF9UUkFDRV9JRCBjb2RlLAorCQkJdWludDhfdCAqZGF0YSwgdWludDhfdCBzaXplKTsKK3ZvaWQgY2RmX2RwX3RyYWNlX2R1bXBfYWxsKHVpbnQzMl90IGNvdW50KTsKK3R5cGVkZWYgdm9pZCAoKnRwX2NkZl9kcF90cmFjZV9jYikoc3RydWN0IGNkZl9kcF90cmFjZV9yZWNvcmRfcyogLCB1aW50MTZfdCk7Cit2b2lkIGNkZl9kcF9kaXNwbGF5X3JlY29yZChzdHJ1Y3QgY2RmX2RwX3RyYWNlX3JlY29yZF9zICpyZWNvcmQsCisJCQkJCQkJdWludDE2X3QgaW5kZXgpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9pbmMvY2RmX3R5cGVzLmggYi9jb3JlL2NkZi9pbmMvY2RmX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwOTk0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL2luYy9jZGZfdHlwZXMuaApAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKF9fQ0RGX1RZUEVTX0gpCisjZGVmaW5lIF9fQ0RGX1RZUEVTX0gKKy8qKgorICogRE9DOiBjZGZfdHlwZXMuaAorICoKKyAqIENvbm5lY3Rpdml0eSBkcml2ZXIgZnJhbWV3b3JrIChDREYpIGJhc2ljIHR5cGUgZGVmaW5pdGlvbnMKKyAqLworCisvKiBJbmNsdWRlIEZpbGVzICovCisjaW5jbHVkZSAiaV9jZGZfdHlwZXMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMgKi8KKworLyoqCisgKiBDREZfTUFYIC0gZ2V0IG1heGltdW0gb2YgdHdvIHZhbHVlcworICogQF94OiAxc3QgYXJndWVtZW50CisgKiBAX3k6IDJuZCBhcmd1ZW1lbnQKKyAqLworI2RlZmluZSBDREZfTUFYKF94LCBfeSkgKCgoX3gpID4gKF95KSkgPyAoX3gpIDogKF95KSkKKworLyoqCisgKiBDREZfTUlOIC0gZ2V0IG1pbmltdW0gb2YgdHdvIHZhbHVlcworICogQF94OiAxc3QgYXJndWVtZW50CisgKiBAX3k6IDJuZCBhcmd1ZW1lbnQKKyAqLworI2RlZmluZSBDREZfTUlOKF94LCBfeSkgKCgoX3gpIDwgKF95KSkgPyAoX3gpIDogKF95KSkKKworLyoqCisgKiBDREZfU1dBUF9VMTYgLSBzd2FwIGlucHV0IHUxNiB2YWx1ZQorICogQF94OiB2YXJpYWJsZSB0byBzd2FwCisgKi8KKyNkZWZpbmUgQ0RGX1NXQVBfVTE2KF94KSBcCisJKCgoKF94KSA8PCA4KSAmIDB4RkYwMCkgfCAoKChfeCkgPj4gOCkgJiAweDAwRkYpKQorCisvKioKKyAqIENERl9TV0FQX1UzMiAtIHN3YXAgaW5wdXQgdTMyIHZhbHVlCisgKiBAX3g6IHZhcmlhYmxlIHRvIHN3YXAKKyAqLworI2RlZmluZSBDREZfU1dBUF9VMzIoX3gpIFwKKwkoKCgoKF94KSA8PCAyNCkgJiAweEZGMDAwMDAwKSB8ICgoKF94KSA+PiAyNCkgJiAweDAwMDAwMEZGKSkgfCBcCisJICgoKChfeCkgPDwgOCkgJiAweDAwRkYwMDAwKSB8ICgoKF94KSA+PiA4KSAmIDB4MDAwMEZGMDApKSkKKworI2RlZmluZSBDREZfVElDS1NfUEVSX1NFQ09ORCAgICAgICAgKDEwMDApCisKKy8qKgorICogQ0RGX0FSUkFZX1NJWkUgLSBnZXQgYXJyYXkgc2l6ZQorICogQF9hcnI6IGFycmF5IHZhcmlhYmxlIG5hbWUKKyAqLworI2RlZmluZSBDREZfQVJSQVlfU0laRShfYXJyKSAoc2l6ZW9mKF9hcnIpIC8gc2l6ZW9mKChfYXJyKVswXSkpCisKKy8qIGVuZGlhbiBvcGVyYXRpb25zIGZvciBCaWcgRW5kaWFuIGFuZCBTbWFsbCBFbmRpYW4gbW9kZXMgKi8KKyNpZmRlZiBBTklfTElUVExFX0JZVEVfRU5ESUFOCisKKyNkZWZpbmUgY2RmX2JlMTZfdG9fY3B1KF94KSBDREZfU1dBUF9VMTYoX3gpCisKKyNlbmRpZgorCisjaWZkZWYgQU5JX0JJR19CWVRFX0VORElBTgorCisjZGVmaW5lIGNkZl9iZTE2X3RvX2NwdShfeCkgKF94KQorCisjZW5kaWYKKworI2lmbmRlZiBfX2FoZGVjbAorI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIF9fYWhkZWNsICAgX19hdHRyaWJ1dGVfXygocmVncGFybSgwKSkpCisjZWxzZQorI2RlZmluZSBfX2FoZGVjbAorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBDREZfT1NfTUFYX1NDQVRURVIgIF9fQ0RGX09TX01BWF9TQ0FUVEVSCisKKy8qKgorICogQGJyaWVmIGRlbm90ZXMgc3RydWN0dXJlIGlzIHBhY2tlZC4KKyAqLworI2RlZmluZSBjZGZfcGFja2VkIF9fY2RmX3BhY2tlZAorCisvKioKKyAqIHR5cGVkZWYgY2RmX2hhbmRsZV90IC0gaGFuZGxlcyBvcGFxdWUgdG8gZWFjaCBvdGhlcgorICovCit0eXBlZGVmIHZvaWQgKmNkZl9oYW5kbGVfdDsKKworLyoqCisgKiB0eXBlZGVmIGNkZl9kZXZpY2VfdCAtIFBsYXRmb3JtL2J1cyBnZW5lcmljIGhhbmRsZS4KKyAqCQkJICBVc2VkIGZvciBidXMgc3BlY2lmaWMgZnVuY3Rpb25zLgorICovCit0eXBlZGVmIF9fY2RmX2RldmljZV90IGNkZl9kZXZpY2VfdDsKKworLyoqCisgKiB0eXBlZGVmIGNkZl9zaXplX3QgLSBzaXplIG9mIGFuIG9iamVjdAorICovCit0eXBlZGVmIF9fY2RmX3NpemVfdCBjZGZfc2l6ZV90OworCisvKioKKyAqIHR5cGVkZWYgY2RmX2RtYV9tYXBfdCAtIERNQSBtYXBwaW5nIG9iamVjdC4KKyAqLwordHlwZWRlZiBfX2NkZl9kbWFfbWFwX3QgY2RmX2RtYV9tYXBfdDsKKworLyoqCisgKiB0eWVwZGVmIGNkZl9kbWFfYWRkcl90IC0gRE1BIGFkZHJlc3MuCisgKi8KK3R5cGVkZWYgX19jZGZfZG1hX2FkZHJfdCBjZGZfZG1hX2FkZHJfdDsKKworLyoqCisgKiB0eWVwZGVmIGNkZl9kbWFfY29udGV4dF90IC0gRE1BIGNvbnRleHQuCisgKi8KK3R5cGVkZWYgX19jZGZfZG1hX2NvbnRleHRfdCBjZGZfZG1hX2NvbnRleHRfdDsKKworCisjZGVmaW5lIGNkZl9pb21lbV90ICAgX19jZGZfaW9tZW1fdDsKKy8qKgorICogdHlwZWRlZiBlbnVtIENERl9USU1FUl9UWVBFIC0gQ0RGIHRpbWVyIHR5cGUKKyAqIEBDREZfVElNRVJfVFlQRV9TVzogRGVmZXJyYWJsZSBTVyB0aW1lciBpdCB3aWxsIG5vdCBjYXVzZSBDUFUgdG8gd2FrZSB1cAorICoJCQlvbiBleHBpcnkKKyAqIEBDREZfVElNRVJfVFlQRV9XQUtFX0FQUFM6ICBOb24gZGVmZXJyYWJsZSB0aW1lciB3aGljaCB3aWxsIGNhdXNlIENQVSB0bworICoJCQkJd2FrZSB1cCBvbiBleHBpcnkKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlDREZfVElNRVJfVFlQRV9TVywKKwlDREZfVElNRVJfVFlQRV9XQUtFX0FQUFMKK30gQ0RGX1RJTUVSX1RZUEU7CisKKy8qKgorICogdHllcGRlZiBjZGZfcmVzb3VyY2VfdHlwZV90IC0gaHcgcmVzb3VyY2VzCisgKgorICogQENERl9SRVNPVVJDRV9UWVBFX01FTTogbWVtb3J5IHJlc291cmNlCisgKiBAQ0RGX1JFU09VUkNFX1RZUEVfSU86IGlvIHJlc291cmNlCisgKgorICogRGVmaW5lIHRoZSBodyByZXNvdXJjZXMgdGhlIE9TIGhhcyBhbGxvY2F0ZWQgZm9yIHRoZSBkZXZpY2UKKyAqIE5vdGUgdGhhdCBzdGFydCBkZWZpbmVzIGEgbWFwcGVkIGFyZWEuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQ0RGX1JFU09VUkNFX1RZUEVfTUVNLAorCUNERl9SRVNPVVJDRV9UWVBFX0lPLAorfSBjZGZfcmVzb3VyY2VfdHlwZV90OworCisvKioKKyAqIHR5ZXBkZWYgY2RmX3Jlc291cmNlX3QgLSByZXByZXNlbnRhdGlvbiBvZiBhIGgvdyByZXNvdXJjZS4KKyAqCisgKiBAc3RhcnQ6IHN0YXJ0CisgKiBAZW5kOiBlbmQKKyAqIEB0eXBlOiByZXNvdXJjZSB0eXBlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50NjRfdCBzdGFydDsKKwl1aW50NjRfdCBlbmQ7CisJY2RmX3Jlc291cmNlX3R5cGVfdCB0eXBlOworfSBjZGZfcmVzb3VyY2VfdDsKKworLyoqCisgKiB0eXBlZGVmIGNkZl9kbWFfZGlyX3QgLSBETUEgZGlyZWN0aW9ucworICoKKyAqIEBDREZfRE1BX0JJRElSRUNUSU9OQUw6IGJpZGlyZWN0aW9uYWwgZGF0YQorICogQENERl9ETUFfVE9fREVWSUNFOiBkYXRhIGdvaW5nIGZyb20gZGV2aWNlIHRvIG1lbW9yeQorICogQENERl9ETUFfRlJPTV9ERVZJQ0U6IGRhdGEgZ29pbmcgZnJvbSBtZW1vcnkgdG8gZGV2aWNlCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQ0RGX0RNQV9CSURJUkVDVElPTkFMID0gX19DREZfRE1BX0JJRElSRUNUSU9OQUwsCisJQ0RGX0RNQV9UT19ERVZJQ0UgPSBfX0NERl9ETUFfVE9fREVWSUNFLAorCUNERl9ETUFfRlJPTV9ERVZJQ0UgPSBfX0NERl9ETUFfRlJPTV9ERVZJQ0UsCit9IGNkZl9kbWFfZGlyX3Q7CisKKy8qIHdvcmsgcXVldWUoa2VybmVsIHRocmVhZCkvRFBDIGZ1bmN0aW9uIGNhbGxiYWNrICovCit0eXBlZGVmIHZvaWQgKCpjZGZfZGVmZXJfZm5fdCkodm9pZCAqKTsKKworLyogUHJvdG90eXBlIG9mIHRoZSBjcml0aWNhbCByZWdpb24gZnVuY3Rpb24gdGhhdCBpcyB0byBiZQorICogZXhlY3V0ZWQgd2l0aCBzcGlubG9jayBoZWxkIGFuZCBpbnRlcnJ1cHQgZGlzYWxiZWQKKyAqLwordHlwZWRlZiBib29sICgqY2RmX2lycWxvY2tlZF9mdW5jX3QpKHZvaWQgKik7CisKKy8qIFByb3RvdHlwZSBvZiB0aW1lciBmdW5jdGlvbiAqLwordHlwZWRlZiB2b2lkICgqY2RmX3NvZnRpcnFfdGltZXJfZnVuY190KSh2b2lkICopOworCisjZGVmaW5lIGNkZl9wcmludCAgICAgICAgIF9fY2RmX3ByaW50CisjZGVmaW5lIGNkZl92cHJpbnQgICAgICAgIF9fY2RmX3ZwcmludAorI2RlZmluZSBjZGZfc25wcmludCAgICAgICBfX2NkZl9zbnByaW50CisKKyNkZWZpbmUgY2RmX29mZnNldG9mKHR5cGUsIGZpZWxkKSBvZmZzZXRvZih0eXBlLCBmaWVsZCkKKworLyoqCisgKiB0eXBlZGVmIENERl9NT0RVTEVfSUQgLSBDREYgTW9kdWxlIElEcworICoKKyAqIEBDREZfTU9EVUxFX0lEX1RMU0hJTTogVExTSElNIG1vZHVsZSBJRAorICogQENERl9NT0RVTEVfSURfV01JOiBXTUkgbW9kdWxlIElECisgKiBAQ0RGX01PRFVMRV9JRF9IVFQ6IEhUVCBtb2R1bGUgSUQKKyAqIEBDREZfTU9EVUxFX0lEX1JTVjQ6IFJlc2VydmVkCisgKiBAQ0RGX01PRFVMRV9JRF9IREQ6IEhERCBtb2R1bGUgSUQKKyAqIEBDREZfTU9EVUxFX0lEX1NNRTogU01FIG1vZHVsZSBJRAorICogQENERl9NT0RVTEVfSURfUEU6IFBFIG1vZHVsZSBJRAorICogQENERl9NT0RVTEVfSURfV01BOiBXTUEgbW9kdWxlIElECisgKiBAQ0RGX01PRFVMRV9JRF9TWVM6IFNZUyBtb2R1bGUgSUQKKyAqIEBDREZfTU9EVUxFX0lEX0NERjogQ0RGIG1vZHVsZSBJRAorICogQENERl9NT0RVTEVfSURfU0FQOiBTQVAgbW9kdWxlIElECisgKiBAQ0RGX01PRFVMRV9JRF9IRERfU09GVEFQOiBIREQgU0FQIG1vZHVsZSBJRAorICogQENERl9NT0RVTEVfSURfSEREX0RBVEE6IEhERCBEQVRBIG1vZHVsZSBJRAorICogQENERl9NT0RVTEVfSURfSEREX1NBUF9EQVRBOiBIREQgU0FQIERBVEEgbW9kdWxlIElECisgKiBAQ0RGX01PRFVMRV9JRF9ISUY6IEhJRiBtb2R1bGUgSUQKKyAqIEBDREZfTU9EVUxFX0lEX0hUQzogSFRDIG1vZHVsZSBJRAorICogQENERl9NT0RVTEVfSURfVFhSWDogVFhSWCBtb2R1bGUgSUQKKyAqIEBDREZfTU9EVUxFX0lEX0NERl9ERVZJQ0U6IENERiBERVZJQ0UgbW9kdWxlIElECisgKiBAQ0RGX01PRFVMRV9JRF9DRkc6IENGRyBtb2R1bGUgSUQKKyAqIEBDREZfTU9EVUxFX0lEX0JNSTogQk1JIG1vZHVsZSBJRAorICogQENERl9NT0RVTEVfSURfRVBQSU5HOiBFUFBJTkcgbW9kdWxlIElECisgKiBAQ0RGX01PRFVMRV9JRF9NQVg6IE1heCBwbGFjZSBob2xkZXIgbW9kdWxlIElECisgKgorICogVGhlc2UgYXJlIGdlbmVyaWMgSURzIHRoYXQgaWRlbnRpZnkgdGhlIHZhcmlvdXMgbW9kdWxlcyBpbiB0aGUgc29mdHdhcmUKKyAqIHN5c3RlbQorICogMCBpcyB1bnVzZWQgZm9yIGhpc3RvcmljYWwgcHVycG9zZXMKKyAqIDMgJiA0IGFyZSB1bnVzZWQgZm9yIGhpc3RvcmljYWwgcHVycG9zZXMKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlDREZfTU9EVUxFX0lEX1RMU0hJTSA9IDEsCisJQ0RGX01PRFVMRV9JRF9XTUkgPSAyLAorCUNERl9NT0RVTEVfSURfSFRUID0gMywKKwlDREZfTU9EVUxFX0lEX1JTVjQgPSA0LAorCUNERl9NT0RVTEVfSURfSEREID0gNSwKKwlDREZfTU9EVUxFX0lEX1NNRSA9IDYsCisJQ0RGX01PRFVMRV9JRF9QRSA9IDcsCisJQ0RGX01PRFVMRV9JRF9XTUEgPSA4LAorCUNERl9NT0RVTEVfSURfU1lTID0gOSwKKwlDREZfTU9EVUxFX0lEX0NERiA9IDEwLAorCUNERl9NT0RVTEVfSURfU0FQID0gMTEsCisJQ0RGX01PRFVMRV9JRF9IRERfU09GVEFQID0gMTIsCisJQ0RGX01PRFVMRV9JRF9IRERfREFUQSA9IDE0LAorCUNERl9NT0RVTEVfSURfSEREX1NBUF9EQVRBID0gMTUsCisKKwlDREZfTU9EVUxFX0lEX0hJRiA9IDE2LAorCUNERl9NT0RVTEVfSURfSFRDID0gMTcsCisJQ0RGX01PRFVMRV9JRF9UWFJYID0gMTgsCisJQ0RGX01PRFVMRV9JRF9DREZfREVWSUNFID0gMTksCisJQ0RGX01PRFVMRV9JRF9DRkcgPSAyMCwKKwlDREZfTU9EVUxFX0lEX0JNSSA9IDIxLAorCUNERl9NT0RVTEVfSURfRVBQSU5HID0gMjIsCisKKwlDREZfTU9EVUxFX0lEX01BWAorfSBDREZfTU9EVUxFX0lEOworCisvKioKKyAqIHR5cGVkZWYgZW51bSB0Q0RGX0NPTl9NT0RFIC0gQ29uY3VycmVuY3kgcm9sZS4KKyAqCisgKiBAQ0RGX1NUQV9NT0RFOiBTVEEgbW9kZQorICogQENERl9TQVBfTU9ERTogU0FQIG1vZGUKKyAqIEBDREZfUDJQX0NMSUVOVF9NT0RFOiBQMlAgY2xpZW50IG1vZGUKKyAqIEBDREZfUDJQX0dPX01PREU6IFAyUCBHTyBtb2RlCisgKiBAQ0RGX0ZUTV9NT0RFOiBGVE0gbW9kZQorICogQENERl9JQlNTX01PREU6IElCU1MgbW9kZQorICogQENERl9QMlBfREVWSUNFX01PREU6IFAyUCBkZXZpY2UgbW9kZQorICogQENERl9FUFBJTkdfTU9ERTogRVBQSU5HIGRldmljZSBtb2RlCisgKiBAQ0RGX09DQl9NT0RFOiBPQ0IgZGV2aWNlIG1vZGUKKyAqIEBDREZfTUFYX05PX09GX01PREU6IE1heCBwbGFjZSBob2xkZXIKKyAqCisgKiBUaGVzZSBhcmUgZ2VuZXJpYyBJRHMgdGhhdCBpZGVudGlmeSB0aGUgdmFyaW91cyByb2xlcworICogaW4gdGhlIHNvZnR3YXJlIHN5c3RlbQorICovCit0eXBlZGVmIGVudW0geworCUNERl9TVEFfTU9ERSA9IDAsCisJQ0RGX1NBUF9NT0RFID0gMSwKKwlDREZfUDJQX0NMSUVOVF9NT0RFLAorCUNERl9QMlBfR09fTU9ERSwKKwlDREZfRlRNX01PREUgPSA1LAorCUNERl9JQlNTX01PREUsCisJQ0RGX1AyUF9ERVZJQ0VfTU9ERSwKKwlDREZfRVBQSU5HX01PREUsCisJQ0RGX09DQl9NT0RFLAorCUNERl9NQVhfTk9fT0ZfTU9ERQorfSB0Q0RGX0NPTl9NT0RFOworCisjaWZkZWYgV0xBTl9PUEVOX1AyUF9JTlRFUkZBQ0UKKy8qIFRoaXMgc2hvdWxkIG1hdGNoIHdpdGggV0xBTl9NQVhfSU5URVJGQUNFUyAqLworI2RlZmluZSBDREZfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkEgICAgKDQpCisjZWxzZQorI2RlZmluZSBDREZfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkEgICAgKDMpCisjZW5kaWYKKworI2RlZmluZSBDREZfU1RBX01BU0sgKDEgPDwgQ0RGX1NUQV9NT0RFKQorI2RlZmluZSBDREZfU0FQX01BU0sgKDEgPDwgQ0RGX1NBUF9NT0RFKQorI2RlZmluZSBDREZfUDJQX0NMSUVOVF9NQVNLICgxIDw8IENERl9QMlBfQ0xJRU5UX01PREUpCisjZGVmaW5lIENERl9QMlBfR09fTUFTSyAoMSA8PCBDREZfUDJQX0dPX01PREUpCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKK3R5cGVkZWYgZW51bSB7CisJQ0RGX01DQ19UT19TQ0NfU1dJVENIX0RJU0FCTEUgPSAwLAorCUNERl9NQ0NfVE9fU0NDX1NXSVRDSF9FTkFCTEUsCisJQ0RGX01DQ19UT19TQ0NfU1dJVENIX0ZPUkNFLAorCUNERl9NQ0NfVE9fU0NDX1NXSVRDSF9NQVgKK30gdENERl9NQ0NfVE9fU0NDX1NXSVRDSF9NT0RFOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChOVUxMKQorI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIE5VTEwgICAgMAorI2Vsc2UKKyNkZWZpbmUgTlVMTCAgICAoKHZvaWQgKikwKQorI2VuZGlmCisjZW5kaWYKKworLyogJ1RpbWUnIHR5cGUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB2X1RJTUVfdDsKKworLyogdHlwZWRlZiBmb3IgQ0RGIENvbnRleHQuLi4gKi8KK3R5cGVkZWYgdm9pZCAqdl9DT05URVhUX3Q7CisKKyNkZWZpbmUgQ0RGX01BQ19BRERSX1NJWkUgKDYpCisKKy8qKgorICogc3RydWN0IGNkZl9tYWNfYWRkciAtIG1hYyBhZGRyZXNzIGFycmF5CisgKiBAYnl0ZXM6IE1BQyBhZGRyZXNzIGJ5dGVzCisgKi8KK3N0cnVjdCBjZGZfbWFjX2FkZHIgeworCXVpbnQ4X3QgYnl0ZXNbQ0RGX01BQ19BRERSX1NJWkVdOworfTsKKworLyogVGhpcyBtYWNybyBpcyB1c2VkIHRvIGluaXRpYWxpemUgYSBDREYgTWFjQWRkcmVzcyB0byB0aGUgYnJvYWRjYXN0CisgKiBNYWNBZGRyZXNzLiAgSXQgaXMgdXNlZCBsaWtlIHRoaXMuLi4KKyAqIHN0cnVjdCBjZGZfbWFjX2FkZHIgbWFjQWRkcmVzcyA9IENERl9NQUNfQUREUl9CUk9BRENBU1RfSU5JVElBTElaRVIKKyAqLworI2RlZmluZSBDREZfTUFDX0FERFJfQlJPQURDQVNUX0lOSVRJQUxJWkVSIHsgeyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH0gfQorCisvKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIENERiBNYWNBZGRyZXNzIHRvIHplcm8KKyAqIEl0IGlzIHVzZWQgbGlrZSB0aGlzLi4uCisgKiBzdHJ1Y3QgY2RmX21hY19hZGRyIG1hY0FkZHJlc3MgPSBDREZfTUFDX0FERFJfWkVST19JTklUSUFMSVpFUgorICovCisjZGVmaW5lIENERl9NQUNfQUREUl9aRVJPX0lOSVRJQUxJWkVSIHsgeyAwLCAwLCAwLCAwLCAwLCAwIH0gfQorCisjZGVmaW5lIENERl9JUFY0X0FERFJfU0laRSAoNCkKKworLyoqCisgKiBzdHJ1Y3QgY2RmX3Rzb19mcmFnX3QgLSBmcmFnbWVudHMgb2YgYSBzaW5nbGUgVENQIHNlZ21lbnQKKyAqIEBwYWRkcl9sb3dfMzI6CUxvd2VyIDMyIGJpdHMgb2YgdGhlIGJ1ZmZlciBwb2ludGVyCisgKiBAcGFkZHJfdXBwZXJfMTY6CXVwcGVyIDE2IGJpdHMgb2YgdGhlIGJ1ZmZlciBwb2ludGVyCisgKiBAbGVuZ3RoOglsZW5ndGggb2YgdGhlIGJ1ZmZlcgorICogQHZhZGRyOgl2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgZnJhZ21lbnRzIG9mIGEgc2luZ2xlIFRDUCBzZWdtZW50IG9mIGEKKyAqIGdpdmVuIGp1bWJvIFRTTyBuZXR3b3JrIGJ1ZmZlcgorICovCitzdHJ1Y3QgY2RmX3Rzb19mcmFnX3QgeworCXVpbnQzMl90IHBhZGRyX2xvd18zMjsKKwl1aW50MzJfdCBwYWRkcl91cHBlcl8xNjoxNiwKKwkJICAgICBsZW5ndGg6MTY7CisJdW5zaWduZWQgY2hhciAqdmFkZHI7Cit9OworCisjZGVmaW5lIEZSQUdfTlVNX01BWCA2CisKKy8qKgorICogc3RydWN0IGNkZl90c29fZmxhZ3NfdCAtIFRTTyBzcGVjaWZpYyBmbGFncworICogQHRzb19lbmFibGU6IEVuYWJsZSB0cmFuc21pdCBzZWdtZW50YXRpb24gb2ZmbG9hZAorICogQHRjcF9mbGFnc19tYXNrOiBUY3BfZmxhZyBpcyBpbnNlcnRlZCBpbnRvIHRoZSBoZWFkZXIgYmFzZWQKKyAqIG9uIHRoZSBtYXNrCisgKiBAbDJfbGVuOiBMMiBsZW5ndGggZm9yIHRoZSBtc2R1CisgKiBAaXBfbGVuOiBJUCBsZW5ndGggZm9yIHRoZSBtc2R1CisgKiBAdGNwX3NlcV9udW06IFRDUCBzZXF1ZW5jZSBudW1iZXIKKyAqIEBpcF9pZDogSVAgaWRlbnRpZmljYXRpb24gbnVtYmVyCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgdGhlIFRTTyBzcGVjaWZpYyBmbGFncyBleHRyYWN0ZWQgZnJvbSB0aGUgVFNPIG5ldHdvcmsKKyAqIGJ1ZmZlciBmb3IgYSBnaXZlbiBUQ1Agc2VnbWVudAorICovCitzdHJ1Y3QgY2RmX3Rzb19mbGFnc190IHsKKwl1X2ludDMyX3QgdHNvX2VuYWJsZToxLAorCQkJcmVzZXJ2ZWRfMGE6NiwKKwkJCWZpbjoxLAorCQkJc3luOjEsCisJCQlyc3Q6MSwKKwkJCXBzaDoxLAorCQkJYWNrOjEsCisJCQl1cmc6MSwKKwkJCWVjZToxLAorCQkJY3dyOjEsCisJCQluczoxLAorCQkJdGNwX2ZsYWdzX21hc2s6OSwKKwkJCXJlc2VydmVkXzBiOjc7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwl1X2ludDMyX3QgbDJfbGVuOjE2LAorCQkJaXBfbGVuOjE2OworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJdV9pbnQzMl90IHRjcF9zZXFfbnVtOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJdV9pbnQzMl90IGlwX2lkOjE2LAorCQkJaXB2NF9jaGVja3N1bV9lbjoxLAorCQkJdWRwX2lwdjRfY2hlY2tzdW1fZW46MSwKKwkJCXVkcF9pcHY2X2NoZWNrc3VtX2VuOjEsCisJCQl0Y3BfaXB2NF9jaGVja3N1bV9lbjoxLAorCQkJdGNwX2lwdjZfY2hlY2tzdW1fZW46MSwKKwkJCXBhcnRpYWxfY2hlY2tzdW1fZW46MSwKKwkJCXJlc2VydmVkXzNhOjEwOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJdV9pbnQzMl90IGNoZWNrc3VtX29mZnNldDoxNCwKKwkJCXJlc2VydmVkXzRhOjIsCisJCQlwYXlsb2FkX3N0YXJ0X29mZnNldDoxNCwKKwkJCXJlc2VydmVkXzRiOjI7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwl1X2ludDMyX3QgcGF5bG9hZF9lbmRfb2Zmc2V0OjE0LAorCQkJcmVzZXJ2ZWRfNToxODsKK307CisKKy8qKgorICogc3RydWN0IGNkZl90c29fc2VnX3QgLSBzaW5nbGUgVFNPIHNlZ21lbnQKKyAqIEB0c29fZmxhZ3M6CVRTTyBmbGFncworICogQG51bV9mcmFnczoJbnVtYmVyIG9mIGZyYWdtZW50cworICogQHRzb19mcmFnczoJYXJyYXkgaG9sZGluZyB0aGUgZnJhZ21lbnRzCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIGEgc2luZ2xlIFRTTyBzZWdtZW50IG9mIGEganVtYm8KKyAqIFRTTyBuZXR3b3JrIGJ1ZmZlcgorICovCitzdHJ1Y3QgY2RmX3Rzb19zZWdfdCB7CisJc3RydWN0IGNkZl90c29fZmxhZ3NfdCB0c29fZmxhZ3M7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJdWludDMyX3QgbnVtX2ZyYWdzOworCXN0cnVjdCBjZGZfdHNvX2ZyYWdfdCB0c29fZnJhZ3NbRlJBR19OVU1fTUFYXTsKK307CisKK3N0cnVjdCBjZGZfdHNvX3NlZ19lbGVtX3QgeworCXN0cnVjdCBjZGZfdHNvX3NlZ190IHNlZzsKKwlzdHJ1Y3QgY2RmX3Rzb19zZWdfZWxlbV90ICpuZXh0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2RmX3Rzb19pbmZvX3QgLSBUU08gaW5mb3JtYXRpb24gZXh0cmFjdGVkCisgKiBAaXNfdHNvOiBpcyB0aGlzIGlzIGEgVFNPIGZyYW1lCisgKiBAbnVtX3NlZ3M6IG51bWJlciBvZiBzZWdtZW50cworICogQHRvdGFsX2xlbjogdG90YWwgbGVuZ3RoIG9mIHRoZSBwYWNrZXQKKyAqIEB0c29fc2VnX2xpc3Q6IGxpc3Qgb2YgVFNPIHNlZ21lbnRzIGZvciB0aGlzIGp1bWJvIHBhY2tldAorICogQGN1cnJfc2VnOiBzZWdtZW50IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZAorICoKKyAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIHRoZSBUU08gaW5mb3JtYXRpb24gZXh0cmFjdGVkIGFmdGVyIHBhcnNpbmcgdGhlIFRTTworICoganVtYm8gbmV0d29yayBidWZmZXIuIEl0IGNvbnRhaW5zIGEgY2hhaW4gb2YgdGhlIFRTTyBzZWdtZW50cyBiZWxvbmdpbmcgdG8KKyAqIHRoZSBqdW1ibyBwYWNrZXQKKyAqLworc3RydWN0IGNkZl90c29faW5mb190IHsKKwl1aW50OF90IGlzX3RzbzsKKwl1aW50MzJfdCBudW1fc2VnczsKKwl1aW50MzJfdCB0b3RhbF9sZW47CisJc3RydWN0IGNkZl90c29fc2VnX2VsZW1fdCAqdHNvX3NlZ19saXN0OworCXN0cnVjdCBjZGZfdHNvX3NlZ19lbGVtX3QgKmN1cnJfc2VnOworfTsKKworLyoqCisgKiBVc2VkIHRvIHNldCBjbGFzc2lmeSBiaXQgaW4gQ0UgZGVzYy4KKyAqLworI2RlZmluZSBDREZfQ0VfVFhfQ0xBU1NJRllfQklUX1MJNQorCisvKioKKyAqIDIgYml0cyBzdGFydGluZyBhdCBiaXQgNiBpbiBDRSBkZXNjLgorICovCisjZGVmaW5lIENERl9DRV9UWF9QS1RfVFlQRV9CSVRfUwk2CisKKy8qKgorICogMTIgYml0cyAtLT4gMTYtMjcsIGluIHRoZSBDRSBkZXNjaXB0b3IsIHRoZSBsZW5ndGggb2YgSFRUL0hUQyBkZXNjcmlwdG9yCisgKi8KKyNkZWZpbmUgQ0RGX0NFX1RYX1BLVF9PRkZTRVRfQklUX1MJMTYKKworLyoqCisgKiBNYXNrIGZvciBwYWNrZXQgb2Zmc2V0IGluIHRoZSBDRSBkZXNjcmlwdG9yLgorICovCisjZGVmaW5lIENERl9DRV9UWF9QS1RfT0ZGU0VUX0JJVF9NCTB4MGZmZjAwMDAKKworI2VuZGlmIC8qIGlmICFkZWZpbmVkIF9fQ0RGX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RmL2luYy9jZGZfdXRpbC5oIGIvY29yZS9jZGYvaW5jL2NkZl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwYWM1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL2luYy9jZGZfdXRpbC5oCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogY2RmX3V0aWwuaAorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHV0aWxpdHkgZnVuY3Rpb25zLgorICovCisKKyNpZm5kZWYgX0NERl9VVElMX0gKKyNkZWZpbmUgX0NERl9VVElMX0gKKworI2luY2x1ZGUgPGlfY2RmX3V0aWwuaD4KKworLyoqCisgKiBjZGZfdW5saWtlbHkgLSBDb21waWxlci1kZXBlbmRlbnQgbWFjcm8gZGVub3RpbmcgY29kZSBsaWtlbHkgdG8gZXhlY3V0ZQorICogQF9leHByOiBleHByZXNzaW9uIHRvIGJlIGNoZWNrZWQKKyAqLworI2RlZmluZSBjZGZfdW5saWtlbHkoX2V4cHIpICAgICBfX2NkZl91bmxpa2VseShfZXhwcikKKworLyoqCisgKiBjZGZfbGlrZWx5IC0gQ29tcGlsZXItZGVwZW5kZW50IG1hY3JvIGRlbm90aW5nIGNvZGUgdW5saWtlbHkgdG8gZXhlY3V0ZQorICogQF9leHByOiBleHByZXNzaW9uIHRvIGJlIGNoZWNrZWQKKyAqLworI2RlZmluZSBjZGZfbGlrZWx5KF9leHByKSAgICAgICBfX2NkZl9saWtlbHkoX2V4cHIpCisKK0NERl9JTkxJTkVfRk4gaW50IGNkZl9zdGF0dXNfdG9fb3NfcmV0dXJuKENERl9TVEFUVVMgc3RhdHVzKQoreworCXJldHVybiBfX2NkZl9zdGF0dXNfdG9fb3NfcmV0dXJuKHN0YXR1cyk7Cit9CisKKy8qKgorICogY2RmX2Fzc2VydCAtIGFzc2VydCAiZXhwciIgZXZhbHVhdGVzIHRvIGZhbHNlCisgKiBAZXhwcjogYXNzZXJ0IGV4cHJlc3Npb24KKyAqLworI2lmZGVmIENERl9PU19ERUJVRworI2RlZmluZSBjZGZfYXNzZXJ0KGV4cHIpICAgICAgICAgX19jZGZfYXNzZXJ0KGV4cHIpCisjZWxzZQorI2RlZmluZSBjZGZfYXNzZXJ0KGV4cHIpCisjZW5kaWYgLyogQ0RGX09TX0RFQlVHICovCisKKy8qKgorICogQGNkZl9hc3NlcnRfYWx3YXlzLSBhbHdheSBhc3NlcnQgImV4cHIiIGV2YWx1YXRlcyB0byBmYWxzZQorICogQGV4cHI6IGFzc2VydCBleHByZXNzaW9uCisgKi8KKyNkZWZpbmUgY2RmX2Fzc2VydF9hbHdheXMoZXhwcikgIF9fY2RmX2Fzc2VydChleHByKQorCisvKioKKyAqIGNkZl9vc19jcHVfdG9fbGU2NCAtIENvbnZlcnQgYSA2NC1iaXQgdmFsdWUgZnJvbSBDUFUgYnl0ZSBvcmRlciB0bworICoJCQlsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIKKyAqIEB4OiB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqLworI2RlZmluZSBjZGZfb3NfY3B1X3RvX2xlNjQoeCkgICAgICAgICAgICAgICAgICAgX19jZGZfb3NfY3B1X3RvX2xlNjQoeCkKKworLyoqCisgKiBjZGZfbGUxNl90b19jcHUgLSBDb252ZXJ0IGEgMTYtYml0IHZhbHVlIGZyb20gbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyCisgKgkJCXRvIENQVSBieXRlIG9yZGVyCisgKiBAeDogdmFsdWUgdG8gYmUgY29udmVydGVkCisgKi8KKyNkZWZpbmUgY2RmX2xlMTZfdG9fY3B1KHgpICAgICAgICAgICAgICAgICAgIF9fY2RmX2xlMTZfdG9fY3B1KHgpCisKKy8qKgorICogY2RmX2xlMzJfdG9fY3B1IC0gQ29udmVydCBhIDMyLWJpdCB2YWx1ZSBmcm9tIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlciB0bworICoJCQlDUFUgYnl0ZSBvcmRlcgorICogQHg6IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICovCisjZGVmaW5lIGNkZl9sZTMyX3RvX2NwdSh4KSAgICAgICAgICAgICAgICAgICBfX2NkZl9sZTMyX3RvX2NwdSh4KQorCisvKioKKyAqIGNkZl9pbl9pbnRlcnJ1cHQgLSByZXR1cm5zIHRydWUgaWYgaW4gaW50ZXJydXB0IGNvbnRleHQKKyAqLworI2RlZmluZSBjZGZfaW5faW50ZXJydXB0ICAgICAgICAgIGluX2ludGVycnVwdAorCisvKioKKyAqIGNkZl9jb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZworICogICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZQorICogQHB0cjogICAgICAgIHRoZSBwb2ludGVyIHRvIHRoZSBtZW1iZXIuCisgKiBAdHlwZTogICAgICAgdGhlIHR5cGUgb2YgdGhlIGNvbnRhaW5lciBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6ICAgICB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqLworI2RlZmluZSBjZGZfY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJIF9fY2RmX2NvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikKKworLyoqCisgKiBjZGZfaXNfbWFjYWRkcl9lcXVhbCgpIC0gY29tcGFyZSB0d28gQ0RGIE1hY0FkZHJlc3MKKyAqIEBwTWFjQWRkcjE6IFBvaW50ZXIgdG8gb25lIGNkZiBNYWNBZGRyZXNzIHRvIGNvbXBhcmUKKyAqIEBwTWFjQWRkcjI6IFBvaW50ZXIgdG8gdGhlIG90aGVyIGNkZiBNYWNBZGRyZXNzIHRvIGNvbXBhcmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBib29sIHRoYXQgdGVsbHMgaWYgYSB0d28gQ0RGIE1hY0FkZHJlc3MnCisgKiBhcmUgZXF1aXZhbGVudC4KKyAqCisgKiBSZXR1cm46IHRydWUgaWYgdGhlIE1hY0FkZHJlc3MncyBhcmUgZXF1YWwKKyAqCW5vdCB0cnVlIGlmIHRoZSBNYWNBZGRyZXNzJ3MgYXJlIG5vdCBlcXVhbAorICovCitDREZfSU5MSU5FX0ZOIGJvb2wgY2RmX2lzX21hY2FkZHJfZXF1YWwoc3RydWN0IGNkZl9tYWNfYWRkciAqcE1hY0FkZHIxLAorCQkJCQlzdHJ1Y3QgY2RmX21hY19hZGRyICpwTWFjQWRkcjIpCit7CisJcmV0dXJuIDAgPT0gbWVtY21wKHBNYWNBZGRyMSwgcE1hY0FkZHIyLCBDREZfTUFDX0FERFJfU0laRSk7Cit9CisKKy8qKgorICogY2RmX2lzX21hY2FkZHJfemVybygpIC0gY2hlY2sgZm9yIGEgTWFjQWRkcmVzcyBvZiBhbGwgemVyb3MuCisgKiBAcE1hY0FkZHIgLSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgY2RmX21hY19hZGRyIHRvIGNoZWNrLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2wgdGhhdCB0ZWxscyBpZiBhIE1hY0FkZHJlc3MgaXMgbWFkZSB1cCBvZgorICogYWxsIHplcm9zLgorICoKKyAqCisgKiBSZXR1cm46ICB0cnVlIGlmIHRoZSBNYWNBZGRyZXNzIGlzIGFsbCBaZXJvcworICoJZmxhc2UgaWYgdGhlIE1hY0FkZHJlc3MgaXMgbm90IGFsbCBaZXJvcy4KKyAqCisgKi8KK0NERl9JTkxJTkVfRk4gYm9vbCBjZGZfaXNfbWFjYWRkcl96ZXJvKHN0cnVjdCBjZGZfbWFjX2FkZHIgKnBNYWNBZGRyKQoreworCXN0cnVjdCBjZGZfbWFjX2FkZHIgemVyb01hY0FkZHIgPSBDREZfTUFDX0FERFJfWkVST19JTklUSUFMSVpFUjsKKworCXJldHVybiBjZGZfaXNfbWFjYWRkcl9lcXVhbChwTWFjQWRkciwgJnplcm9NYWNBZGRyKTsKK30KKworLyoqCisgKiBjZGZfemVyb19tYWNhZGRyKCkgLSB6ZXJvIG91dCBhIE1hY0FkZHJlc3MKKyAqIEBwTWFjQWRkcjogcG9pbnRlciB0byB0aGUgc3RydWN0IGNkZl9tYWNfYWRkciB0byB6ZXJvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gemVyb3Mgb3V0IGEgQ0RGIE1hY0FkZHJlc3MgdHlwZS4KKyAqCisgKiBSZXR1cm46IG5vdGhpbmcKKyAqLworQ0RGX0lOTElORV9GTiB2b2lkIGNkZl96ZXJvX21hY2FkZHIoc3RydWN0IGNkZl9tYWNfYWRkciAqcE1hY0FkZHIpCit7CisJbWVtc2V0KHBNYWNBZGRyLCAwLCBDREZfTUFDX0FERFJfU0laRSk7Cit9CisKKy8qKgorICogY2RmX2lzX21hY2FkZHJfZ3JvdXAoKSAtIGNoZWNrIGZvciBhIE1hY0FkZHJlc3MgaXMgYSAnZ3JvdXAnIGFkZHJlc3MKKyAqIEBwTWFjQWRkcjE6IHBvaW50ZXIgdG8gdGhlIGNkZiBNYWNBZGRyZXNzIHRvIGNoZWNrCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbCB0aGF0IHRlbGxzIGlmIGEgdGhlIGlucHV0IENERiBNYWNBZGRyZXNzCisgKiBpcyBhICJncm91cCIgYWRkcmVzcy4gIEdyb3VwIGFkZHJlc3NlcyBoYXZlIHRoZSAnZ3JvdXAgYWRkcmVzcyBiaXQnIHR1cm5lZAorICogb24gaW4gdGhlIE1hY0FkZHJlc3MuICBHcm91cCBhZGRyZXNzZXMgYXJlIG1hZGUgdXAgb2YgQnJvYWRjYXN0IGFuZAorICogTXVsdGljYXN0IGFkZHJlc3Nlcy4KKyAqCisgKiBSZXR1cm46ICB0cnVlIGlmIHRoZSBpbnB1dCBNYWNBZGRyZXNzIGlzIGEgR3JvdXAgYWRkcmVzcworICoJZmFsc2UgaWYgdGhlIGlucHV0IE1hY0FkZHJlc3MgaXMgbm90IGEgR3JvdXAgYWRkcmVzcworICovCitDREZfSU5MSU5FX0ZOIGJvb2wgY2RmX2lzX21hY2FkZHJfZ3JvdXAoc3RydWN0IGNkZl9tYWNfYWRkciAqcE1hY0FkZHIpCit7CisJcmV0dXJuIHBNYWNBZGRyLT5ieXRlc1swXSAmIDB4MDE7Cit9CisKKy8qKgorICogY2RmX2lzX21hY2FkZHJfYnJvYWRjYXN0KCkgLSBjaGVjayBmb3IgYSBNYWNBZGRyZXNzIGlzIGEgYnJvYWRjYXN0IGFkZHJlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBib29sIHRoYXQgdGVsbHMgaWYgYSB0aGUgaW5wdXQgQ0RGIE1hY0FkZHJlc3MKKyAqIGlzIGEgImJyb2FkY2FzdCIgYWRkcmVzcy4KKyAqCisgKiBAcE1hY0FkZHI6IFBvaW50ZXIgdG8gdGhlIGNkZiBNYWNBZGRyZXNzIHRvIGNoZWNrCisgKgorICogUmV0dXJuOiAgdHJ1ZSBpZiB0aGUgaW5wdXQgTWFjQWRkcmVzcyBpcyBhIGJyb2FkY2FzdCBhZGRyZXNzCisgKglmbGFzZSBpZiB0aGUgaW5wdXQgTWFjQWRkcmVzcyBpcyBub3QgYSBicm9hZGNhc3QgYWRkcmVzcworICovCitDREZfSU5MSU5FX0ZOIGJvb2wgY2RmX2lzX21hY2FkZHJfYnJvYWRjYXN0KHN0cnVjdCBjZGZfbWFjX2FkZHIgKnBNYWNBZGRyKQoreworCXN0cnVjdCBjZGZfbWFjX2FkZHIgYnJvYWRjYXN0TWFjQWRkciA9CisJCQkJCUNERl9NQUNfQUREUl9CUk9BRENBU1RfSU5JVElBTElaRVI7CisKKwlyZXR1cm4gY2RmX2lzX21hY2FkZHJfZXF1YWwocE1hY0FkZHIsICZicm9hZGNhc3RNYWNBZGRyKTsKK30KKworLyoqCisgKiBjZGZfY29weV9tYWNhZGRyKCkgLSBjb3B5IGEgQ0RGIE1hY0FkZHJlc3MKKyAqIEBwRHN0IC0gcG9pbnRlciB0byB0aGUgY2RmIE1hY0FkZHJlc3MgdG8gY29weSBUTyAodGhlIGRlc3RpbmF0aW9uKQorICogQHBTcmMgLSBwb2ludGVyIHRvIHRoZSBjZGYgTWFjQWRkcmVzcyB0byBjb3B5IEZST00gKHRoZSBzb3VyY2UpCisgKgorICogVGhpcyBmdW5jdGlvbiBjb3BpZXMgYSBDREYgTWFjQWRkcmVzcyBpbnRvIGFub3RoZXIgQ0RGIE1hY0FkZHJlc3MuCisgKgorICoKKyAqIFJldHVybjogbm90aGluZworICovCitDREZfSU5MSU5FX0ZOIHZvaWQgY2RmX2NvcHlfbWFjYWRkcihzdHJ1Y3QgY2RmX21hY19hZGRyICpwRHN0LAorCQkJCSAgICBzdHJ1Y3QgY2RmX21hY19hZGRyICpwU3JjKQoreworCSpwRHN0ID0gKnBTcmM7Cit9CisKKy8qKgorICogY2RmX3NldF9tYWNhZGRyX2Jyb2FkY2FzdCgpIC0gc2V0IGEgQ0RGIE1hY0FkZHJlc3MgdG8gdGhlICdicm9hZGNhc3QnCisgKiBAcE1hY0FkZHI6IHBvaW50ZXIgdG8gdGhlIGNkZiBNYWNBZGRyZXNzIHRvIHNldCB0byBicm9hZGNhc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgYSBDREYgTWFjQWRkcmVzcyB0byB0aGUgJ2Jyb2FkY2FzdCcgTWFjQWRkcmVzcy4gQnJvYWRjYXN0CisgKiBNYWNBZGRyZXNzIGNvbnRhaW5zIGFsbCAweEZGIGJ5dGVzLgorICoKKyAqIFJldHVybjogbm90aGluZworICovCitDREZfSU5MSU5FX0ZOIHZvaWQgY2RmX3NldF9tYWNhZGRyX2Jyb2FkY2FzdChzdHJ1Y3QgY2RmX21hY19hZGRyICpwTWFjQWRkcikKK3sKKwltZW1zZXQocE1hY0FkZHIsIDB4ZmYsIENERl9NQUNfQUREUl9TSVpFKTsKK30KKworI2lmIGRlZmluZWQoQU5JX0xJVFRMRV9CWVRFX0VORElBTikKKworLyoqCisgKiBpX2NkZl9odG9ubCgpIC0gY29udmVydCBmcm9tIGhvc3QgYnl0ZSBvcmRlciB0byBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAqIEB1bDogaW5wdXQgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuOiBjb252ZXJ0ZWQgbmV0d29yayBieXRlIG9yZGVyCisgKi8KK0NERl9JTkxJTkVfRk4gdW5zaWduZWQgbG9uZyBpX2NkZl9odG9ubCh1bnNpZ25lZCBsb25nIHVsKQoreworCXJldHVybiAoKHVsICYgMHgwMDAwMDBmZikgPDwgMjQpIHwKKwkJKCh1bCAmIDB4MDAwMGZmMDApIDw8IDgpIHwKKwkJKCh1bCAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCh1bCAmIDB4ZmYwMDAwMDApID4+IDI0KTsKK30KKworLyoqCisgKiBpX2NkZl9udG9obCgpIC0gY29udmVydCBuZXR3b3JrIGJ5dGUgb3JkZXIgdG8gaG9zdCBieXRlIG9yZGVyCisgKiBAdWw6IGlucHV0IHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybjogY29udmVydGVkIGhvc3QgYnl0ZSBvcmRlcgorICovCitDREZfSU5MSU5FX0ZOIHVuc2lnbmVkIGxvbmcgaV9jZGZfbnRvaGwodW5zaWduZWQgbG9uZyB1bCkKK3sKKwlyZXR1cm4gaV9jZGZfaHRvbmwodWwpOworfQorCisjZW5kaWYKKworLyoqCisgKiBjZGZfc2V0X3UxNigpIC0gQXNzaWduIDE2LWJpdCB1bnNpZ25lZCB2YWx1ZSB0byBhIGJ5dGUgYXJyYXkgYmFzZSBvbiBDUFUncworICoJCQllbmRpYW5uZXNzLgorICogQHB0cjogU3RhcnRpbmcgYWRkcmVzcyBvZiBhIGJ5dGUgYXJyYXkKKyAqIEB2YWx1ZTogVGhlIHZhbHVlIHRvIGFzc2lnbiB0byB0aGUgYnl0ZSBhcnJheQorICoKKyAqIENhbGxlciBtdXN0IHZhbGlkYXRlIHRoZSBieXRlIGFycmF5IGhhcyBlbm91Z2ggc3BhY2UgdG8gaG9sZCB0aGUgdmxhdWUKKyAqCisgKiBSZXR1cm46IFRoZSBhZGRyZXNzIHRvIHRoZSBieXRlIGFmdGVyIHRoZSBhc3NpZ25tZW50LiBUaGlzIG1heSBvciBtYXkgbm90CisgKgliZSB2YWxpZC4gQ2FsbGVyIHRvIHZlcmlmeS4KKyAqLworQ0RGX0lOTElORV9GTiB1aW50OF90ICpjZGZfc2V0X3UxNih1aW50OF90ICpwdHIsIHVpbnQxNl90IHZhbHVlKQoreworI2lmIGRlZmluZWQoQU5JX0JJR19CWVRFX0VORElBTikKKwkqKHB0cikgPSAodWludDhfdCkgKHZhbHVlID4+IDgpOworCSoocHRyICsgMSkgPSAodWludDhfdCkgKHZhbHVlKTsKKyNlbHNlCisJKihwdHIgKyAxKSA9ICh1aW50OF90KSAodmFsdWUgPj4gOCk7CisJKihwdHIpID0gKHVpbnQ4X3QpICh2YWx1ZSk7CisjZW5kaWYKKworCXJldHVybiBwdHIgKyAyOworfQorCisvKioKKyAqIGNkZl9nZXRfdTE2KCkgLSBSZXRyaWV2ZSBhIDE2LWJpdCB1bnNpZ25lZCB2YWx1ZSBmcm9tIGEgYnl0ZSBhcnJheSBiYXNlIG9uCisgKgkJCUNQVSdzIGVuZGlhbm5lc3MuCisgKiBAcHRyOiBTdGFydGluZyBhZGRyZXNzIG9mIGEgYnl0ZSBhcnJheQorICogQHBWYWx1ZTogUG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIGZvciAxNiBiaXQgdmFsdWUuIFZhbHVlIGlzIHRvCisgKgkJYXNzaWduIHRvIHRoaXMgbG9jYXRpb24uCisgKgorICogQ2FsbGVyIG11c3QgdmFsaWRhdGUgdGhlIGJ5dGUgYXJyYXkgaGFzIGVub3VnaCBzcGFjZSB0byBob2xkIHRoZSB2bGF1ZQorICoKKyAqIFJldHVybjogVGhlIGFkZHJlc3MgdG8gdGhlIGJ5dGUgYWZ0ZXIgdGhlIGFzc2lnbm1lbnQuIFRoaXMgbWF5IG9yIG1heSBub3QKKyAqCWJlIHZhbGlkLiBDYWxsZXIgdG8gdmVyaWZ5LgorICovCitDREZfSU5MSU5FX0ZOIHVpbnQ4X3QgKmNkZl9nZXRfdTE2KHVpbnQ4X3QgKnB0ciwgdWludDE2X3QgKnBWYWx1ZSkKK3sKKyNpZiBkZWZpbmVkKEFOSV9CSUdfQllURV9FTkRJQU4pCisJKnBWYWx1ZSA9ICgoKHVpbnQxNl90KSAoKnB0ciA8PCA4KSkgfCAoKHVpbnQxNl90KSAoKihwdHIgKyAxKSkpKTsKKyNlbHNlCisJKnBWYWx1ZSA9ICgoKHVpbnQxNl90KSAoKihwdHIgKyAxKSA8PCA4KSkgfCAoKHVpbnQxNl90KSAoKnB0cikpKTsKKyNlbmRpZgorCisJcmV0dXJuIHB0ciArIDI7Cit9CisKKy8qKgorICogY2RmX2dldF91MzIoKSAtIHJldHJpZXZlIGEgMzItYml0IHVuc2lnbmVkIHZhbHVlIGZyb20gYSBieXRlIGFycmF5IGJhc2Ugb24KKyAqCQkJQ1BVJ3MgZW5kaWFubmVzcy4KKyAqIEBwdHI6IFN0YXJ0aW5nIGFkZHJlc3Mgb2YgYSBieXRlIGFycmF5CisgKiBAcFZhbHVlOiBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgZm9yIDMyIGJpdCB2YWx1ZS4gVmFsdWUgaXMgdG8KKyAqCQlhc3NpZ24gdG8gdGhpcyBsb2NhdGlvbi4KKyAqCisgKiBDYWxsZXIgbXVzdCB2YWxpZGF0ZSB0aGUgYnl0ZSBhcnJheSBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQgdGhlIHZsYXVlCisgKgorICogUmV0dXJuOiBUaGUgYWRkcmVzcyB0byB0aGUgYnl0ZSBhZnRlciB0aGUgYXNzaWdubWVudC4gVGhpcyBtYXkgb3IgbWF5IG5vdAorICoJCWJlIHZhbGlkLiBDYWxsZXIgdG8gdmVyaWZ5LgorICovCitDREZfSU5MSU5FX0ZOIHVpbnQ4X3QgKmNkZl9nZXRfdTMyKHVpbnQ4X3QgKnB0ciwgdWludDMyX3QgKnBWYWx1ZSkKK3sKKyNpZiBkZWZpbmVkKEFOSV9CSUdfQllURV9FTkRJQU4pCisJKnBWYWx1ZSA9ICgodWludDMyX3QpICgqKHB0cikgPDwgMjQpIHwKKwkJICAgKHVpbnQzMl90KSAoKihwdHIgKyAxKSA8PCAxNikgfAorCQkgICAodWludDMyX3QpICgqKHB0ciArIDIpIDw8IDgpIHwgKHVpbnQzMl90KSAoKihwdHIgKyAzKSkpOworI2Vsc2UKKwkqcFZhbHVlID0gKCh1aW50MzJfdCkgKCoocHRyICsgMykgPDwgMjQpIHwKKwkJICAgKHVpbnQzMl90KSAoKihwdHIgKyAyKSA8PCAxNikgfAorCQkgICAodWludDMyX3QpICgqKHB0ciArIDEpIDw8IDgpIHwgKHVpbnQzMl90KSAoKihwdHIpKSk7CisjZW5kaWYKKwlyZXR1cm4gcHRyICsgNDsKK30KKworI2VuZGlmIC8qX0NERl9VVElMX0gqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvaW5jL29zZGVwLmggYi9jb3JlL2NkZi9pbmMvb3NkZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTRhNjUzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZGYvaW5jL29zZGVwLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX09TREVQX0gKKyNkZWZpbmUgX09TREVQX0gKKworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4KKyNpbmNsdWRlIDxjZGZfbG9jay5oPgorI2luY2x1ZGUgPGNkZl90aW1lLmg+CisjaW5jbHVkZSA8Y2RmX3NvZnRpcnFfdGltZXIuaD4KKyNpbmNsdWRlIDxjZGZfZGVmZXIuaD4KKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPgorI2luY2x1ZGUgPGNkc19pZl91cHBlcnByb3RvLmg+CisKKyNpbmNsdWRlIDxjZHNfcXVldWUuaD4KKworLyoqCisgKiBlbnVtIGF0aF9oYWxfYnVzX3R5cGUgLSBTdXBwb3J0ZWQgQnVzIHR5cGVzCisgKiBASEFMX0JVU19UWVBFX1BDSTogUENJIEJ1cworICogQEhBTF9CVVNfVFlQRV9BSEI6IEFIQiBCdXMKKyAqIEBIQUxfQlVTX1RZUEVfU05PQzogU05PQyBCdXMKKyAqIEBIQUxfQlVTX1RZUEVfU0lNOiBTaW11bGF0b3IKKyAqLworZW51bSBhdGhfaGFsX2J1c190eXBlIHsKKwlIQUxfQlVTX1RZUEVfUENJLAorCUhBTF9CVVNfVFlQRV9BSEIsCisJSEFMX0JVU19UWVBFX1NOT0MsCisJSEFMX0JVU19UWVBFX1NJTQorfTsKKworLyoqCisgKiBzdHVyY3QgaGFsX2J1c19jb250ZXh0IC0gQnVzIHRvIGhhbCBjb250ZXh0IGhhbmRvZmYKKyAqIEBiY190YWc6ICAgICBidXMgY29udGV4dCB0YWcKKyAqIEBiY19oYW5kbGU6ICBidXMgY29udGV4dCBoYW5kbGUKKyAqIEBiY19idXN0eXBlOiBidXMgdHlwZQorICovCit0eXBlZGVmIHN0cnVjdCBoYWxfYnVzX2NvbnRleHQgeworICAgICAgICBpbnQgYmNfdGFnOworICAgICAgICBjaGFyICpiY19oYW5kbGU7CisgICAgICAgIGVudW0gYXRoX2hhbF9idXNfdHlwZSBiY19idXN0eXBlOworfSBIQUxfQlVTX0NPTlRFWFQ7CisKKyNkZWZpbmUgSU5MSU5FICAgaW5saW5lCisKKy8qIEFUSF9ERUJVRyAtCisgKiBDb250cm9sIHdoZXRoZXIgZGVidWcgZmVhdHVyZXMgKHByaW50b3V0cywgYXNzZXJ0aW9ucykgYXJlIGNvbXBpbGVkCisgKiBpbnRvIHRoZSBkcml2ZXIuCisgKi8KKyNpZm5kZWYgQVRIX0RFQlVHCisjZGVmaW5lIEFUSF9ERUJVRyAxICAgICAgICAgICAgIC8qIGRlZmF1bHQ6IGluY2x1ZGUgZGVidWcgY29kZSAqLworI2VuZGlmCisKKyNpZiBBVEhfREVCVUcKKyNpZm5kZWYgQVNTRVJUCisjZGVmaW5lIEFTU0VSVChleHByKSAgY2RmX2Fzc2VydChleHByKQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBBU1NFUlQoZXhwcikKKyNlbmRpZiAvKiBBVEhfREVCVUcgKi8KKworLyoKKyAqIE5lZWQgdG8gZGVmaW5lIGJ5dGUgb3JkZXIgYmFzZWQgb24gdGhlIENQVSBjb25maWd1cmF0aW9uLgorICovCisjaWZuZGVmIF9MSVRUTEVfRU5ESUFOCisjZGVmaW5lIF9MSVRUTEVfRU5ESUFOICAxMjM0CisjZW5kaWYKKyNpZm5kZWYgX0JJR19FTkRJQU4KKyNkZWZpbmUgX0JJR19FTkRJQU4gNDMyMQorI2VuZGlmCisjaWZkZWYgX19CSUdfRU5ESUFOCisjZGVmaW5lIF9CWVRFX09SREVSICAgIF9CSUdfRU5ESUFOCisjZWxzZQorI2RlZmluZSBfQllURV9PUkRFUiAgICBfTElUVExFX0VORElBTgorI2VuZGlmCisKKy8qCisgKiBEZWR1Y2UgaWYgdGFza2xldHMgYXJlIGF2YWlsYWJsZS4gIElmIG5vdCB0aGVuCisgKiBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIGltbWVkaWF0ZSB3b3JrIHF1ZXVlLgorICovCisjZGVmaW5lIGF0aF9zeXNjdGxfZGVjbChmLCBjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpIFwKKwlmKHN0cnVjdCBjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCB2b2lkICpidWZmZXIsCQkgICAgIFwKKwkgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQorI2RlZmluZSBBVEhfU1lTQ1RMX1BST0NfRE9JTlRWRUMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKSBcCisJcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpCisjZGVmaW5lIEFUSF9TWVNDVExfUFJPQ19ET1NUUklORyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpIFwKKwlwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcykKKworLyoKKyAqIEJ5dGUgT3JkZXIgc3R1ZmYKKyAqLworI2RlZmluZSAgICBsZTE2dG9oKF94KSAgICBsZTE2X3RvX2NwdShfeCkKKyNkZWZpbmUgICAgaHRvbGUxNihfeCkgICAgY3B1X3RvX2xlMTYoX3gpCisjZGVmaW5lICAgIGh0b2JlMTYoX3gpICAgIGNwdV90b19iZTE2KF94KQorI2RlZmluZSAgICBsZTMydG9oKF94KSAgICBsZTMyX3RvX2NwdShfeCkKKyNkZWZpbmUgICAgaHRvbGUzMihfeCkgICAgY3B1X3RvX2xlMzIoX3gpCisjZGVmaW5lICAgIGJlMTZ0b2goX3gpICAgIGJlMTZfdG9fY3B1KF94KQorI2RlZmluZSAgICBiZTMydG9oKF94KSAgICBiZTMyX3RvX2NwdShfeCkKKyNkZWZpbmUgICAgaHRvYmUzMihfeCkgICAgY3B1X3RvX2JlMzIoX3gpCisKKyNkZWZpbmUgRU9LICAgICgwKQorCisjaWZuZGVmIGZhbHNlCisjZGVmaW5lIGZhbHNlIDAKKyNlbmRpZgorI2lmbmRlZiB0cnVlCisjZGVmaW5lIHRydWUgIDEKKyNlbmRpZgorCisjaWZuZGVmIEFSUEhSRF9JRUVFODAyMTEKKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxMSA4MDEgICAgLyogSUVFRSA4MDIuMTEuICAqLworI2VuZGlmCisKKy8qCisgKiBOb3JtYWwgRGVsYXkgZnVuY3Rpb25zLiBUaW1lIHNwZWNpZmllZCBpbiBtaWNyb3NlY29uZHMuCisgKi8KKyNkZWZpbmUgT1NfREVMQVkoX3VzKSAgICAgICAgICAgICAgICAgICAgIGNkZl91ZGVsYXkoX3VzKQorCisvKgorICogbWVtb3J5IGRhdGEgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBPU19NRU1DUFkoX2RzdCwgX3NyYywgX2xlbikgICAgICAgY2RmX21lbV9jb3B5KF9kc3QsIF9zcmMsIF9sZW4pCisjZGVmaW5lIE9TX01FTU1PVkUoX2RzdCwgX3NyYywgX2xlbikgICAgICBjZGZfbWVtX21vdmUoX2RzdCwgX3NyYywgX2xlbikKKyNkZWZpbmUgT1NfTUVNWkVSTyhfYnVmLCBfbGVuKSAgICAgICAgICAgIGNkZl9tZW1femVybyhfYnVmLCBfbGVuKQorI2RlZmluZSBPU19NRU1TRVQoX2J1ZiwgX2NoLCBfbGVuKSAgICAgICAgY2RmX21lbV9zZXQoX2J1ZiwgX2xlbiwgX2NoKQorI2RlZmluZSBPU19NRU1DTVAoX21lbTEsIF9tZW0yLCBfbGVuKSAgICAgY2RmX21lbV9jb21wYXJlKF9tZW0xLCBfbWVtMiwgX2xlbikKKworI2lmZGVmIENPTkZJR19TTVAKKy8qIFVuZG8gdGhlIG9uZSBwcm92aWRlZCBieSB0aGUga2VybmVsIHRvIGRlYnVnIHNwaW4gbG9ja3MgKi8KKyN1bmRlZiBzcGluX2xvY2sKKyN1bmRlZiBzcGluX3VubG9jaworI3VuZGVmIHNwaW5fdHJ5bG9jaworCisjZGVmaW5lIHNwaW5fbG9jayh4KSBcCisJZG8geyBcCisJCXNwaW5fbG9ja19iaCh4KTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgc3Bpbl91bmxvY2soeCkgXAorCWRvIHsgXAorCQlpZiAoIXNwaW5faXNfbG9ja2VkKHgpKSB7IFwKKwkJCVdBUk5fT04oMSk7IFwKKwkJCXByaW50ayhLRVJOX0VNRVJHICIgJXM6JWQgdW5sb2NrIGFkZHI9JXAsICVzIFxuIiwgX19mdW5jX18sIF9fTElORV9fLCB4LCBcCisJCQkgICAgICAgIXNwaW5faXNfbG9ja2VkKHgpID8gIk5vdCBsb2NrZWQiIDogIiIpOwlcCisJCX0gXAorCQlzcGluX3VubG9ja19iaCh4KTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgc3Bpbl90cnlsb2NrKHgpIHNwaW5fdHJ5bG9ja19iaCh4KQorCisjZGVmaW5lIE9TX1NVUFBPUlRfQVNZTkNfUSAxICAgIC8qIHN1cHBvcnQgZm9yIGhhbmRsaW5nIGFzeW4gZnVuY3Rpb24gY2FsbHMgKi8KKworI2Vsc2UKKyNkZWZpbmUgT1NfU1VQUE9SVF9BU1lOQ19RIDAKKyNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU01QICovCisKKworLyoKKyAqIFN5c3RlbSB0aW1lIGludGVyZmFjZQorICovCit0eXBlZGVmIGNkZl90aW1lX3Qgc3lzdGltZV90OwordHlwZWRlZiBjZGZfdGltZV90IHN5c3RpY2tfdDsKKworc3RhdGljIElOTElORSBjZGZfdGltZV90IG9zX2dldF90aW1lc3RhbXAodm9pZCkKK3sKKwlyZXR1cm4gY2RmX3N5c3RlbV90aWNrcygpOyAgICAgIC8qIEZpeCBkb3VibGUgY29udmVyc2lvbiBmcm9tIGppZmZpZXMgdG8gbXMgKi8KK30KKworc3RydWN0IF9OSUNfREVWOworCit0eXBlZGVmIHN0cnVjdCBfTklDX0RFViAqb3NkZXZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdCBvc190aW1lcl90OworCit0eXBlZGVmIHN0cnVjdCBfb3NfbWVzZ190IHsKKwlTVEFJTFFfRU5UUlkoX29zX21lc2dfdCkgbWVzZ19uZXh0OworCXVpbnQxNl90IG1lc2dfdHlwZTsKKwl1aW50MTZfdCBtZXNnX2xlbjsKKwkvKiBmb2xsb3dlZCBieSBtZXNnX2xlbiBieXRlcyAqLworfSBvc19tZXNnX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm9zX21lc2dfaGFuZGxlcl90KSh2b2lkICpjdHgsCisJCQkJICB1aW50MTZfdCBtZXNnX3R5cGUsCisJCQkJICB1aW50MTZfdCBtZXNnX2xlbiwgdm9pZCAqbWVzZyk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlvc2Rldl90IGRldl9oYW5kbGU7CisJaW50MzJfdCBudW1fcXVldWVkOworCWludDMyX3QgbWVzZ19sZW47CisJdWludDhfdCAqbWVzZ19xdWV1ZV9idWY7CisJU1RBSUxRX0hFQUQoLCBfb3NfbWVzZ190KSBtZXNnX2hlYWQ7ICAgIC8qIHF1ZXVlZCBtZXNnIGJ1ZmZlcnMgKi8KKwlTVEFJTFFfSEVBRCgsIF9vc19tZXNnX3QpIG1lc2dfZnJlZV9oZWFkOyAgICAgICAvKiBmcmVlIG1lc2cgYnVmZmVycyAgKi8KKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCBldl9oYW5kbGVyX2xvY2s7CisjaWZkZWYgVVNFX1NPRlRJTlRSCisJdm9pZCAqX3Rhc2s7CisjZWxzZQorCW9zX3RpbWVyX3QgX3RpbWVyOworI2VuZGlmCisJb3NfbWVzZ19oYW5kbGVyX3QgaGFuZGxlcjsKKwl2b2lkICpjdHg7CisJdWludDhfdCBpc19zeW5jaHJvbm91cyA6IDE7Cit9IG9zX21lc2dfcXVldWVfdDsKKworLyoKKyAqIERlZmluaXRpb24gb2YgT1MtZGVwZW5kZW50IGRldmljZSBzdHJ1Y3R1cmUuCisgKiBJdCdsbCBiZSBvcGFxdWUgdG8gdGhlIGFjdHVhbCBBVEggbGF5ZXIuCisgKi8KK3N0cnVjdCBfTklDX0RFViB7CisJdm9pZCAqYmRldjsgICAgICAgICAgICAgLyogYnVzIGRldmljZSBoYW5kbGUgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAgIC8qIG5ldCBkZXZpY2UgaGFuZGxlICh3aWZpJWQpICovCisJY2RmX2JoX3QgaW50cl90cTsgICAgICAgLyogdGFza2xldCAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIGRldnN0YXRzOyAgICAgICAvKiBuZXQgZGV2aWNlIHN0YXRpc2l0aWNzICovCisJSEFMX0JVU19DT05URVhUIGJjOworI2lmZGVmIEFUSF9QRVJGX1BXUl9PRkZMT0FECisJc3RydWN0IGRldmljZSAqZGV2aWNlOyAgLyogZ2VuZXJpYyBkZXZpY2UgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF9xdWV1ZTsKKyNlbmRpZiAvKiBQRVJGX1BXUl9PRkZMT0FEICovCisjaWYgT1NfU1VQUE9SVF9BU1lOQ19RCisJb3NfbWVzZ19xdWV1ZV90IGFzeW5jX3E7ICAgICAgICAvKiBtZXNncSB0byBoYW5kbGUgYXN5bmMgY2FsbHMgKi8KKyNlbmRpZgorI2lmZGVmIEFUSF9CVVNfUE0KKwl1aW50OF90IGlzRGV2aWNlQXNsZWVwOworI2VuZGlmIC8qIEFUSF9CVVNfUE0gKi8KK307CisKK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgY2hhciAqb3NfbWFsbG9jKG9zZGV2X3QgcE5pY0RldiwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bFNpemVJbkJ5dGVzLCBpbnQgZ2ZwKQoreworCXJldHVybiBjZGZfbWVtX21hbGxvYyh1bFNpemVJbkJ5dGVzKTsKK30KKworI2RlZmluZSBPU19GUkVFKF9wKSAgICAgICAgICAgICAgICAgICAgIGNkZl9tZW1fZnJlZShfcCkKKworI2RlZmluZSBPU19ETUFfTUVNX0NPTlRFWFQoY29udGV4dCkJICAgIFwKKwlkbWFfYWRkcl90IGNvbnRleHQ7CisKKyNkZWZpbmUgT1NfR0VUX0RNQV9NRU1fQ09OVEVYVCh2YXIsIGZpZWxkKSAgXAorCSYodmFyLT5maWVsZCkKKworI2RlZmluZSBPU19DT1BZX0RNQV9NRU1fQ09OVEVYVChkc3QsIHNyYykgICBcCisJKmRzdCA9ICpzcmMKKworI2RlZmluZSBPU19aRVJPX0RNQV9NRU1fQ09OVEVYVChjb250ZXh0KSAgIFwKKwkqY29udGV4dCA9IDAKKworLyoKKyAqIFRpbWVyIEludGVyZmFjZXMuIFVzZSB0aGVzZSBtYWNyb3MgdG8gZGVjbGFyZSB0aW1lcgorICogYW5kIHJldHJpZXZlIHRpbWVyIGFyZ3VtZW50LiBUaGlzIGlzIG1haW5seSBmb3IgcmVzb2x2aW5nCisgKiBkaWZmZXJlbnQgYXJndW1lbnQgdHlwZXMgZm9yIHRpbWVyIGZ1bmN0aW9uIGluIGRpZmZlcmVudCBPUy4KKyAqLworI2RlZmluZSBPU19ERUNMQVJFX1RJTUVSKF9mbikgICAgICAgICAgICAgICAgICB2b2lkIF9mbih2b2lkICopCisKKyNkZWZpbmUgb3NfdGltZXJfZnVuYyhfZm4pCQkgICAgICAgXAorCXZvaWQgX2ZuKHZvaWQgKnRpbWVyX2FyZykKKworI2RlZmluZSBPU19HRVRfVElNRVJfQVJHKF9hcmcsIF90eXBlKQkgICAgICAgXAorCShfYXJnKSA9IChfdHlwZSkodGltZXJfYXJnKQorCisjZGVmaW5lIE9TX0lOSVRfVElNRVIoX29zZGV2LCBfdGltZXIsIF9mbiwgX2N0eCwgdHlwZSkgIFwKKwkJY2RmX3NvZnRpcnFfdGltZXJfaW5pdChfb3NkZXYsIF90aW1lciwgX2ZuLCBfY3R4LCB0eXBlKQorCisjZGVmaW5lIE9TX1NFVF9USU1FUihfdGltZXIsIF9tcykgICAgICBjZGZfc29mdGlycV90aW1lcl9tb2QoX3RpbWVyLCBfbXMpCisKKyNkZWZpbmUgT1NfQ0FOQ0VMX1RJTUVSKF90aW1lcikgICAgICAgIGNkZl9zb2Z0aXJxX3RpbWVyX2NhbmNlbChfdGltZXIpCisKKyNkZWZpbmUgT1NfRlJFRV9USU1FUihfdGltZXIpICAgICAgICAgIGNkZl9zb2Z0aXJxX3RpbWVyX2NhbmNlbChfdGltZXIpCisKKy8qCisgKiBUaGVzZSBhcmUgcmVxdWlyZWQgZm9yIG5ldHdvcmsgbWFuYWdlciBzdXBwb3J0CisgKi8KKyNpZm5kZWYgU0VUX05FVERFVl9ERVYKKyNkZWZpbmUgICAgU0VUX05FVERFVl9ERVYobmRldiwgcGRldikKKyNlbmRpZgorCisjZW5kaWYgLyogZW5kIG9mIF9PU0RFUF9IICovCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9zcmMvY2RmX2RlZmVyLmMgYi9jb3JlL2NkZi9zcmMvY2RmX2RlZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZjNjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL3NyYy9jZGZfZGVmZXIuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSAiaV9jZGZfZGVmZXIuaCIKKworLyoqCisgKiBfX2NkZl9kZWZlcl9mdW5jKCkgLSBkZWZlciB3b3JrIGhhbmRsZXIKKyAqIEB3b3JrOiBQb2ludGVyIHRvIGRlZmVyIHdvcmsKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBfX2NkZl9kZWZlcl9mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlfX2NkZl93b3JrX3QgKmN0eCA9IGNvbnRhaW5lcl9vZih3b3JrLCBfX2NkZl93b3JrX3QsIHdvcmspOworCWlmIChjdHgtPmZuID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiTm8gY2FsbGJhY2sgcmVnaXN0ZXJlZCAhISIpOworCQlyZXR1cm47CisJfQorCWN0eC0+Zm4oY3R4LT5hcmcpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvc3JjL2NkZl9ldmVudC5jIGIvY29yZS9jZGYvc3JjL2NkZl9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzliNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvY2RmX2V2ZW50LmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiBjZGZfZXZlbnQuYworICoKKyAqIFRoaXMgc291cmNlIGZpbGUgY29udGFpbnMgbGludXggc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIENERiBldmVudCBBUElzCisgKiBUaGUgQVBJcyBtZW50aW9uZWQgaW4gdGhpcyBmaWxlIGFyZSB1c2VkIGZvciBpbml0aWFsaXppbmcsIHNldHRpbmcsCisgKiByZXNldHRpbmcsIGRlc3Ryb3lpbmcgYW4gZXZlbnQgYW5kIHdhaXRpbmcgb24gYW4gb2NjdXJhbmNlIG9mIGFuIGV2ZW50CisgKiBhbW9uZyBtdWx0aXBsZSBldmVudHMuCisgKi8KKworLyogSW5jbHVkZSBGaWxlcyAqLworI2luY2x1ZGUgImNkZl9ldmVudC5oIgorI2luY2x1ZGUgImNkZl90cmFjZS5oIgorCisvKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cyAqLworCisvKiBUeXBlIERlY2xhcmF0aW9ucyAqLworCisvKiBHbG9iYWwgRGF0YSBEZWZpbml0aW9ucyAqLworCisvKiBTdGF0aWMgVmFyaWFibGUgRGVmaW5pdGlvbnMgKi8KKworLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgYW5kIERvY3VtZW50YXRpb24gKi8KKworLyoqCisgKiBjZGZfZXZlbnRfaW5pdCgpIC0gaW5pdGlhbGl6ZXMgYSBDREYgZXZlbnQKKyAqIEBldmVudDogUG9pbnRlciB0byB0aGUgb3BhcXVlIGV2ZW50IG9iamVjdCB0byBpbml0aWFsaXplCisgKgorICogVGhlIGNkZl9ldmVudF9pbml0KCkgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHNwZWNpZmllZCBldmVudC4gVXBvbgorICogc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbiwgdGhlIHN0YXRlIG9mIHRoZSBldmVudCBiZWNvbWVzIGluaXRpYWxpemVkCisgKiBhbmQgbm90IHNpZ25hbGVkLgorICoKKyAqIEFuIGV2ZW50IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IG1heSBiZSB1c2VkIGluIGFueSBvdGhlciBldmVudAorICogZnVuY3Rpb25zLgorICoKKyAqIEF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSBhbiBhbHJlYWR5IGluaXRpYWxpemVkIGV2ZW50IHJlc3VsdHMgaW4KKyAqIGEgZmFpbHVyZS4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZGZfZXZlbnRfaW5pdChjZGZfZXZlbnRfdCAqZXZlbnQpCit7CisJLyogY2hlY2sgZm9yIG51bGwgcG9pbnRlciAqLworCWlmIChOVUxMID09IGV2ZW50KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiTlVMTCBldmVudCBwYXNzZWQgaW50byAlcyIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwkvKiBjaGVjayBmb3IgJ2FscmVhZHkgaW5pdGlhbGl6ZWQnIGV2ZW50ICovCisJaWYgKExJTlVYX0VWRU5UX0NPT0tJRSA9PSBldmVudC0+Y29va2llKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiSW5pdGlhbGl6ZWQgZXZlbnQgcGFzc2VkIGludG8gJXMiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfQlVTWTsKKwl9CisKKwkvKiBpbml0aWFsaXplIG5ldyBldmVudCAqLworCWluaXRfY29tcGxldGlvbigmZXZlbnQtPmNvbXBsZXRlKTsKKwlldmVudC0+Y29va2llID0gTElOVVhfRVZFTlRfQ09PS0lFOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfZXZlbnRfc2V0KCkgLSBzZXRzIGEgQ0RGIGV2ZW50CisgKiBAZXZlbnQ6IFRoZSBldmVudCB0byBzZXQgdG8gdGhlIHNpZ25hbGxlZCBzdGF0ZQorICoKKyAqIFRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50IGlzIHNldCB0byBzaWduYWxsZWQgYnkgY2FsbGluZworICogY2RmX2V2ZW50X3NldCgpLgorICoKKyAqIEFueSB0aHJlYWRzIHdhaXRpbmcgb24gdGhlIGV2ZW50IGFzIGEgcmVzdWx0IG9mIGEgY2RmX2V2ZW50X3dhaXQoKSB3aWxsCisgKiBiZSB1bmJsb2NrZWQgYW5kIGF2YWlsYWJsZSB0byBiZSBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlvbiB3aGVuIHRoZSBldmVudAorICogaXMgc2lnbmFsZWQgYnkgYSBjYWxsIHRvIGNkZl9ldmVudF9zZXQoKS4KKyAqCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KKworQ0RGX1NUQVRVUyBjZGZfZXZlbnRfc2V0KGNkZl9ldmVudF90ICpldmVudCkKK3sKKwkvKiBjaGVjayBmb3IgbnVsbCBwb2ludGVyICovCisJaWYgKE5VTEwgPT0gZXZlbnQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICJOVUxMIGV2ZW50IHBhc3NlZCBpbnRvICVzIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCS8qIGNoZWNrIGlmIGV2ZW50IHJlZmVycyB0byBhbiBpbml0aWFsaXplZCBvYmplY3QgKi8KKwlpZiAoTElOVVhfRVZFTlRfQ09PS0lFICE9IGV2ZW50LT5jb29raWUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICJVbmluaXRpYWxpemVkIGV2ZW50IHBhc3NlZCBpbnRvICVzIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWNvbXBsZXRlKCZldmVudC0+Y29tcGxldGUpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfZXZlbnRfcmVzZXQoKSAtIHJlc2V0cyBhIENERiBldmVudAorICogQGV2ZW50OiBUaGUgZXZlbnQgdG8gc2V0IHRvIHRoZSBOT1Qgc2lnbmFsbGVkIHN0YXRlCisgKgorICogVGhpcyBmdW5jdGlvbiBpc24ndCByZXF1aXJlZCBmb3IgTGludXguIFRoZXJlZm9yZSwgaXQgZG9lc24ndCBkbyBtdWNoLgorICoKKyAqIFRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50IGlzIHNldCB0byAnTk9UIHNpZ25hbGxlZCcgYnkgY2FsbGluZworICogY2RmX2V2ZW50X3Jlc2V0KCkuICBUaGUgc3RhdGUgb2YgdGhlIGV2ZW50IHJlbWFpbnMgTk9UIHNpZ25hbGxlZCB1bnRpbCBhbgorICogZXhwbGljaXQgY2FsbCB0byBjZGZfZXZlbnRfc2V0KCkuCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBldmVudCB0byBhIE5PVCBzaWduYWxsZWQgc3RhdGUgZXZlbiBpZiB0aGUgZXZlbnQgd2FzCisgKiBzaWduYWxsZWQgbXVsdGlwbGUgdGltZXMgYmVmb3JlIGJlaW5nIHNpZ25hbGVkLgorICoKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZGZfZXZlbnRfcmVzZXQoY2RmX2V2ZW50X3QgKmV2ZW50KQoreworCS8qIGNoZWNrIGZvciBudWxsIHBvaW50ZXIgKi8KKwlpZiAoTlVMTCA9PSBldmVudCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIk5VTEwgZXZlbnQgcGFzc2VkIGludG8gJXMiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJLyogY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIGFuICdhbHJlYWR5IGluaXRpYWxpemVkJyBldmVudCAqLworCWlmIChMSU5VWF9FVkVOVF9DT09LSUUgIT0gZXZlbnQtPmNvb2tpZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIlVuaW5pdGlhbGl6ZWQgZXZlbnQgcGFzc2VkIGludG8gJXMiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJLyogKHJlKWluaXRpYWxpemUgZXZlbnQgKi8KKwlJTklUX0NPTVBMRVRJT04oZXZlbnQtPmNvbXBsZXRlKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkZl9ldmVudF9kZXN0cm95KCkgLSBEZXN0cm95cyBhIENERiBldmVudAorICogQGV2ZW50OiBUaGUgZXZlbnQgb2JqZWN0IHRvIGJlIGRlc3Ryb3llZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gbXVjaCBpbiBMaW51eC4gVGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhlIGNhbGxlcgorICogdG8gZXhwbGljaXRseSBkZXN0cm95IGFuIGV2ZW50IGFmdGVyIHVzZS4KKyAqCisgKiBUaGUgb3NfZXZlbnRfZGVzdHJveSgpIGZ1bmN0aW9uIHNoYWxsIGRlc3Ryb3kgdGhlIGV2ZW50IG9iamVjdAorICogcmVmZXJlbmNlZCBieSBldmVudC4gIEFmdGVyIGEgc3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBjZGZfZXZlbnRfZGVzdHJveSgpCisgKiB0aGUgZXZlbnQgb2JqZWN0IGJlY29tZXMsIGluIGVmZmVjdCwgdW5pbml0aWFsaXplZC4KKyAqCisgKiBBIGRlc3Ryb3llZCBldmVudCBvYmplY3QgY2FuIGJlIHJlaW5pdGlhbGl6ZWQgdXNpbmcgY2RmX2V2ZW50X2luaXQoKTsKKyAqIHRoZSByZXN1bHRzIG9mIG90aGVyd2lzZSByZWZlcmVuY2luZyB0aGUgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZAorICogYXJlIHVuZGVmaW5lZC4gIENhbGxzIHRvIENERiBldmVudCBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgbG9jayBzdWNoCisgKiBhcyBjZGZfZXZlbnRfc2V0KCkgd2lsbCBmYWlsIGlmIHRoZSBldmVudCBpcyBkZXN0cm95ZWQuICBUaGVyZWZvcmUsCisgKiBkb24ndCB1c2UgdGhlIGV2ZW50IGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCB1bnRpbCBpdCBoYXMKKyAqIGJlZW4gcmUtaW5pdGlhbGl6ZWQuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KKworQ0RGX1NUQVRVUyBjZGZfZXZlbnRfZGVzdHJveShjZGZfZXZlbnRfdCAqZXZlbnQpCit7CisJLyogY2hlY2sgZm9yIG51bGwgcG9pbnRlciAqLworCWlmIChOVUxMID09IGV2ZW50KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiTlVMTCBldmVudCBwYXNzZWQgaW50byAlcyIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwkvKiBjaGVjayB0byBtYWtlIHN1cmUgaXQgaXMgYW4gJ2FscmVhZHkgaW5pdGlhbGl6ZWQnIGV2ZW50ICovCisJaWYgKExJTlVYX0VWRU5UX0NPT0tJRSAhPSBldmVudC0+Y29va2llKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiVW5pbml0aWFsaXplZCBldmVudCBwYXNzZWQgaW50byAlcyIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwkvKiBtYWtlIHN1cmUgbm9ib2R5IGlzIHdhaXRpbmcgb24gdGhlIGV2ZW50ICovCisJY29tcGxldGVfYWxsKCZldmVudC0+Y29tcGxldGUpOworCisJLyogZGVzdHJveSB0aGUgZXZlbnQgKi8KKwltZW1zZXQoZXZlbnQsIDAsIHNpemVvZihjZGZfZXZlbnRfdCkpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfd2FpdF9zaW5nbGVfZXZlbnQoKSAtIFdhaXRzIGZvciBhIHNpbmdsZSBldmVudCB0byBiZSBzZXQuCisgKgorICogVGhpcyBBUEkgd2FpdHMgZm9yIHRoZSBldmVudCB0byBiZSBzZXQuCisgKgorICogQHBFdmVudDogUG9pbnRlciB0byBhbiBldmVudCB0byB3YWl0IG9uLgorICogQHRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUgKGluIG1pbGxpc2Vjb25kcykuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqCWlmIHRoaXMgaW50ZXJ2YWwgZWxhcHNlcywgcmVnYXJkbGVzcyBpZiBhbnkgb2YgdGhlIGV2ZW50cyBoYXZlCisgKgliZWVuIHNldC4gIEFuIGlucHV0IHZhbHVlIG9mIDAgZm9yIHRoaXMgdGltZW91dCBwYXJhbWV0ZXIgbWVhbnMKKyAqCXRvIHdhaXQgaW5maW5pdGVseSwgbWVhbmluZyBhIHRpbWVvdXQgd2lsbCBuZXZlciBvY2N1ci4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZGZfd2FpdF9zaW5nbGVfZXZlbnQoY2RmX2V2ZW50X3QgKmV2ZW50LCB1aW50MzJfdCB0aW1lb3V0KQoreworCWlmIChpbl9pbnRlcnJ1cHQoKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCEhISIsCisJCQkgIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwkvKiBjaGVjayBmb3IgbnVsbCBwb2ludGVyICovCisJaWYgKE5VTEwgPT0gZXZlbnQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICJOVUxMIGV2ZW50IHBhc3NlZCBpbnRvICVzIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCS8qIGNoZWNrIGlmIGNvb2tpZSBpcyBzYW1lIGFzIHRoYXQgb2YgaW5pdGlhbGl6ZWQgZXZlbnQgKi8KKwlpZiAoTElOVVhfRVZFTlRfQ09PS0lFICE9IGV2ZW50LT5jb29raWUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICJVbmluaXRpYWxpemVkIGV2ZW50IHBhc3NlZCBpbnRvICVzIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWlmICh0aW1lb3V0KSB7CisJCWxvbmcgcmV0OworCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmV2ZW50LT5jb21wbGV0ZSwKKwkJCQkJCSAgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7CisJCWlmICgwID49IHJldCkKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfVElNRU9VVDsKKwl9IGVsc2UgeworCQlDREZfQVNTRVJUKDApOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIlplcm8gdGltZW91dCB2YWx1ZSBwYXNzZWQgaW50byAlcyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvc3JjL2NkZl9saXN0LmMgYi9jb3JlL2NkZi9zcmMvY2RmX2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDYwZjllCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZGYvc3JjL2NkZl9saXN0LmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiBjZGZfbGlzdC5jCisgKgorICogQ29ubmVjdGl2aXR5IGRyaXZlciBmcmFtZXdvcmsgbGlzdCBtYW5pcHVsYXRpb24gQVBJcy4gQ0RGIGxpbmtlZCBsaXN0CisgKiBBUElzIGFyZSBOT1QgdGhyZWFkIHNhZmUgc28gbWFrZSBzdXJlIHRvIHVzZSBhcHByb3ByaWF0ZSBsb2NraW5nIG1lY2hhbmlzbXMKKyAqIHRvIGFzc3VyZSBvcGVyYXRpb25zIG9uIHRoZSBsaXN0IGFyZSB0aHJlYWQgc2FmZS4KKyAqLworCisvKiBJbmNsdWRlIGZpbGVzICovCisjaW5jbHVkZSA8Y2RmX2xpc3QuaD4KKyNpbmNsdWRlIDxjZGZfdHJhY2UuaD4KKworLyogUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMgKi8KKworLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24gKi8KKworLyoqCisgKiBjZGZfbGlzdF9pbnNlcnRfZnJvbnQoKSAtIGluc2VydCBpbnB1dCBub2RlIGF0IGZyb250IG9mIHRoZSBsaXN0CisgKiBAcExpc3Q6IFBvaW50ZXIgdG8gbGlzdAorICogQHBOb2RlOiBQb2ludGVyIHRvIGlucHV0IG5vZGUKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZGZfbGlzdF9pbnNlcnRfZnJvbnQoY2RmX2xpc3RfdCAqcExpc3QsIGNkZl9saXN0X25vZGVfdCAqcE5vZGUpCit7CisJbGlzdF9hZGQocE5vZGUsICZwTGlzdC0+YW5jaG9yKTsKKwlwTGlzdC0+Y291bnQrKzsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkZl9saXN0X2luc2VydF9iYWNrKCkgLSBpbnNlcnQgaW5wdXQgbm9kZSBhdCBiYWNrIG9mIHRoZSBsaXN0CisgKiBAcExpc3Q6IFBvaW50ZXIgdG8gbGlzdAorICogQHBOb2RlOiBQb2ludGVyIHRvIGlucHV0IG5vZGUKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZGZfbGlzdF9pbnNlcnRfYmFjayhjZGZfbGlzdF90ICpwTGlzdCwgY2RmX2xpc3Rfbm9kZV90ICpwTm9kZSkKK3sKKwlsaXN0X2FkZF90YWlsKHBOb2RlLCAmcExpc3QtPmFuY2hvcik7CisJcExpc3QtPmNvdW50Kys7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfbGlzdF9pbnNlcnRfYmFja19zaXplKCkgLSBpbnNlcnQgaW5wdXQgbm9kZSBhdCBiYWNrIG9mIGxpc3QgYW5kIHNhdmUKKyAqCQkJCSBsaXN0IHNpemUKKyAqIEBwTGlzdDogUG9pbnRlciB0byBsaXN0CisgKiBAcE5vZGU6IFBvaW50ZXIgdG8gaW5wdXQgbm9kZQorICogQHBTaXplOiBQb2ludGVyIHRvIHN0b3JlIGxpc3Qgc2l6ZQorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIGNkZl9saXN0X2luc2VydF9iYWNrX3NpemUoY2RmX2xpc3RfdCAqcExpc3QsCisJCQkJICAgICBjZGZfbGlzdF9ub2RlX3QgKnBOb2RlLCB1aW50MzJfdCAqcFNpemUpCit7CisJbGlzdF9hZGRfdGFpbChwTm9kZSwgJnBMaXN0LT5hbmNob3IpOworCXBMaXN0LT5jb3VudCsrOworCSpwU2l6ZSA9IHBMaXN0LT5jb3VudDsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkZl9saXN0X3JlbW92ZV9mcm9udCgpIC0gcmVtb3ZlIG5vZGUgZnJvbSBmcm9udCBvZiB0aGUgbGlzdAorICogQHBMaXN0OiBQb2ludGVyIHRvIGxpc3QKKyAqIEBwcE5vZGU6IERvdWJsZSBwb2ludGVyIHRvIHN0b3JlIHRoZSBub2RlIHdoaWNoIGlzIHJlbW92ZWQgZnJvbSBsaXN0CisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgY2RmX2xpc3RfcmVtb3ZlX2Zyb250KGNkZl9saXN0X3QgKnBMaXN0LCBjZGZfbGlzdF9ub2RlX3QgKipwcE5vZGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdHB0cjsKKworCWlmIChsaXN0X2VtcHR5KCZwTGlzdC0+YW5jaG9yKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9FTVBUWTsKKworCWxpc3RwdHIgPSBwTGlzdC0+YW5jaG9yLm5leHQ7CisJKnBwTm9kZSA9IGxpc3RwdHI7CisJbGlzdF9kZWwocExpc3QtPmFuY2hvci5uZXh0KTsKKwlwTGlzdC0+Y291bnQtLTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RmX2xpc3RfcmVtb3ZlX2JhY2soKSAtIHJlbW92ZSBub2RlIGZyb20gZW5kIG9mIHRoZSBsaXN0CisgKiBAcExpc3Q6IFBvaW50ZXIgdG8gbGlzdAorICogQHBwTm9kZTogRG91YmxlIHBvaW50ZXIgdG8gc3RvcmUgbm9kZSB3aGljaCBpcyByZW1vdmVkIGZyb20gbGlzdAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIGNkZl9saXN0X3JlbW92ZV9iYWNrKGNkZl9saXN0X3QgKnBMaXN0LCBjZGZfbGlzdF9ub2RlX3QgKipwcE5vZGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdHB0cjsKKworCWlmIChsaXN0X2VtcHR5KCZwTGlzdC0+YW5jaG9yKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9FTVBUWTsKKworCWxpc3RwdHIgPSBwTGlzdC0+YW5jaG9yLnByZXY7CisJKnBwTm9kZSA9IGxpc3RwdHI7CisJbGlzdF9kZWwocExpc3QtPmFuY2hvci5wcmV2KTsKKwlwTGlzdC0+Y291bnQtLTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RmX2xpc3RfcmVtb3ZlX25vZGUoKSAtIHJlbW92ZSBpbnB1dCBub2RlIGZyb20gbGlzdAorICogQHBMaXN0OiBQb2ludGVyIHRvIGxpc3QKKyAqIEBwTm9kZVRvUmVtb3ZlOiBQb2ludGVyIHRvIG5vZGUgd2hpY2ggbmVlZHMgdG8gYmUgcmVtb3ZlZAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIGNkZl9saXN0X3JlbW92ZV9ub2RlKGNkZl9saXN0X3QgKnBMaXN0LAorCQkJCWNkZl9saXN0X25vZGVfdCAqcE5vZGVUb1JlbW92ZSkKK3sKKwljZGZfbGlzdF9ub2RlX3QgKnRtcDsKKwlpbnQgZm91bmQgPSAwOworCisJaWYgKGxpc3RfZW1wdHkoJnBMaXN0LT5hbmNob3IpKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0VNUFRZOworCisJLyogdmVyaWZ5IHRoYXQgcE5vZGVUb1JlbW92ZSBpcyBpbmRlZWQgcGFydCBvZiBsaXN0IHBMaXN0ICovCisJbGlzdF9mb3JfZWFjaCh0bXAsICZwTGlzdC0+YW5jaG9yKSB7CisJCWlmICh0bXAgPT0gcE5vZGVUb1JlbW92ZSkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGZvdW5kID09IDApCisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisKKwlsaXN0X2RlbChwTm9kZVRvUmVtb3ZlKTsKKwlwTGlzdC0+Y291bnQtLTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RmX2xpc3RfcGVla19mcm9udCgpIC0gcGVlayBmcm9udCBub2RlIGZyb20gbGlzdAorICogQHBMaXN0OiBQb2ludGVyIHRvIGxpc3QKKyAqIEBwcE5vZGU6IERvdWJsZSBwb2ludGVyIHRvIHN0b3JlIHBlZWtlZCBub2RlIHBvaW50ZXIKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZGZfbGlzdF9wZWVrX2Zyb250KGNkZl9saXN0X3QgKnBMaXN0LCBjZGZfbGlzdF9ub2RlX3QgKipwcE5vZGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdHB0cjsKKwlpZiAobGlzdF9lbXB0eSgmcExpc3QtPmFuY2hvcikpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRU1QVFk7CisKKwlsaXN0cHRyID0gcExpc3QtPmFuY2hvci5uZXh0OworCSpwcE5vZGUgPSBsaXN0cHRyOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RmX2xpc3RfcGVla19uZXh0KCkgLSBwZWVrIG5leHQgbm9kZSBvZiBpbnB1dCBub2RlIGluIHRoZSBsaXN0CisgKiBAcExpc3Q6IFBvaW50ZXIgdG8gbGlzdAorICogQHBOb2RlOiBQb2ludGVyIHRvIGlucHV0IG5vZGUKKyAqIEBwcE5vZGU6IERvdWJsZSBwb2ludGVyIHRvIHN0b3JlIHBlZWtlZCBub2RlIHBvaW50ZXIKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZGZfbGlzdF9wZWVrX25leHQoY2RmX2xpc3RfdCAqcExpc3QsIGNkZl9saXN0X25vZGVfdCAqcE5vZGUsCisJCQkgICAgICBjZGZfbGlzdF9ub2RlX3QgKipwcE5vZGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdHB0cjsKKwlpbnQgZm91bmQgPSAwOworCWNkZl9saXN0X25vZGVfdCAqdG1wOworCisJaWYgKChwTGlzdCA9PSBOVUxMKSB8fCAocE5vZGUgPT0gTlVMTCkgfHwgKHBwTm9kZSA9PSBOVUxMKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKworCWlmIChsaXN0X2VtcHR5KCZwTGlzdC0+YW5jaG9yKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9FTVBUWTsKKworCS8qIHZlcmlmeSB0aGF0IHBOb2RlIGlzIGluZGVlZCBwYXJ0IG9mIGxpc3QgcExpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJnBMaXN0LT5hbmNob3IpIHsKKwkJaWYgKHRtcCA9PSBwTm9kZSkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZm91bmQgPT0gMCkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKworCWxpc3RwdHIgPSBwTm9kZS0+bmV4dDsKKwlpZiAobGlzdHB0ciA9PSAmcExpc3QtPmFuY2hvcikKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9FTVBUWTsKKworCSpwcE5vZGUgPSBsaXN0cHRyOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmUvY2RmL3NyYy9jZGZfbG9jay5jIGIvY29yZS9jZGYvc3JjL2NkZl9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzY2Q1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL3NyYy9jZGZfbG9jay5jCkBAIC0wLDAgKzEsNDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogY2RmX2xvY2suYworICoKKyAqIE9WRVJWSUVXOiBUaGlzIHNvdXJjZSBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciBDREYgbG9jayBBUElzCisgKgkgICAgIFRoZSBmb3VyIEFQSXMgbWVudGlvbmVkIGluIHRoaXMgZmlsZSBhcmUgdXNlZCBmb3IKKyAqCSAgICAgaW5pdGlhbGl6aW5nLCBhY3F1aXJpbmcsIHJlbGVhc2luZyBhbmQgZGVzdHJveWluZyBhIGxvY2suCisgKgkgICAgIHRoZSBsb2NrIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBjcml0aWNhbCBzZWN0aW9ucworICovCisKKy8qIEluY2x1ZGUgRmlsZXMgKi8KKworI2luY2x1ZGUgImNkZl9sb2NrLmgiCisjaW5jbHVkZSAiY2RmX21lbW9yeS5oIgorI2luY2x1ZGUgImNkZl90cmFjZS5oIgorI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2lmZGVmIENPTkZJR19DTlNTCisjaW5jbHVkZSA8bmV0L2Nuc3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgImlfaG9zdF9kaWFnX2NvcmVfZXZlbnQuaCIKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorCisvKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cyAqLworI2RlZmluZSBMSU5VWF9MT0NLX0NPT0tJRSAweDEyMzQ1Njc4CisKKyNkZWZpbmUgV0lGSV9QT1dFUl9FVkVOVF9ERUZBVUxUX1dBS0VMT0NLX1RJTUVPVVQgMAorI2RlZmluZSBXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1RBS0VOIDAKKyNkZWZpbmUgV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19SRUxFQVNFRCAxCisKKy8qIFR5cGUgRGVjbGFyYXRpb25zICovCisKK2VudW0geworCUxPQ0tfUkVMRUFTRUQgPSAweDExMjIzMzQ0LAorCUxPQ0tfQUNRVUlSRUQsCisJTE9DS19ERVNUUk9ZRUQKK307CisKKy8qIEdsb2JhbCBEYXRhIERlZmluaXRpb25zICovCisKKy8qIEZ1bmN0aW9uIERlZmluaXRpb25zIGFuZCBEb2N1bWVudGF0aW9uICovCisKKy8qKgorICogY2RmX211dGV4X2luaXQoKSAtIGluaXRpYWxpemUgYSBDREYgbG9jaworICogQGxvY2s6ICAgICAgICBQb2ludGVyIHRvIHRoZSBvcGFxdWUgbG9jayBvYmplY3QgdG8gaW5pdGlhbGl6ZQorICoKKyAqIGNkZl9tdXRleF9pbml0KCkgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHNwZWNpZmllZCBsb2NrLiBVcG9uCisgKiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLCB0aGUgc3RhdGUgb2YgdGhlIGxvY2sgYmVjb21lcyBpbml0aWFsaXplZAorICogYW5kIHVubG9ja2VkLgorICoKKyAqIEEgbG9jayBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgY2RmX211dGV4X2luaXQoKSBiZWZvcmUgaXQKKyAqIG1heSBiZSB1c2VkIGluIGFueSBvdGhlciBsb2NrIGZ1bmN0aW9ucy4KKyAqCisgKiBBdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgYW4gYWxyZWFkeSBpbml0aWFsaXplZCBsb2NrIHJlc3VsdHMgaW4KKyAqIGEgZmFpbHVyZS4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogICAgIGxvY2sgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZAorICogICAgICBDREYgZmFpbHVyZSByZWFzb24gY29kZXM6IGxvY2sgaXMgbm90IGluaXRpYWxpemVkIGFuZCBjYW4ndCBiZSB1c2VkCisgKi8KK0NERl9TVEFUVVMgY2RmX211dGV4X2luaXQoY2RmX211dGV4X3QgKmxvY2spCit7CisJLyogY2hlY2sgZm9yIGludmFsaWQgcG9pbnRlciAqLworCWlmIChsb2NrID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisJLyogY2hlY2sgZm9yICdhbHJlYWR5IGluaXRpYWxpemVkJyBsb2NrICovCisJaWYgKExJTlVYX0xPQ0tfQ09PS0lFID09IGxvY2stPmNvb2tpZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBhbHJlYWR5IGluaXRpYWxpemVkIGxvY2siLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfQlVTWTsKKwl9CisKKwlpZiAoaW5faW50ZXJydXB0KCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQhISEiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJLyogaW5pdGlhbGl6ZSBuZXcgbG9jayAqLworCW11dGV4X2luaXQoJmxvY2stPm1fbG9jayk7CisJbG9jay0+Y29va2llID0gTElOVVhfTE9DS19DT09LSUU7CisJbG9jay0+c3RhdGUgPSBMT0NLX1JFTEVBU0VEOworCWxvY2stPnByb2Nlc3NJRCA9IDA7CisJbG9jay0+cmVmY291bnQgPSAwOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfbXV0ZXhfYWNxdWlyZSgpIC0gYWNxdWlyZSBhIENERiBsb2NrCisgKiBAbG9jazogICAgICAgIFBvaW50ZXIgdG8gdGhlIG9wYXF1ZSBsb2NrIG9iamVjdCB0byBhY3F1aXJlCisgKgorICogQSBsb2NrIG9iamVjdCBpcyBhY3F1aXJlZCBieSBjYWxsaW5nIGNkZl9tdXRleF9hY3F1aXJlKCkuICBJZiB0aGUgbG9jaworICogaXMgYWxyZWFkeSBsb2NrZWQsIHRoZSBjYWxsaW5nIHRocmVhZCBzaGFsbCBibG9jayB1bnRpbCB0aGUgbG9jayBiZWNvbWVzCisgKiBhdmFpbGFibGUuIFRoaXMgb3BlcmF0aW9uIHNoYWxsIHJldHVybiB3aXRoIHRoZSBsb2NrIG9iamVjdCByZWZlcmVuY2VkIGJ5CisgKiBsb2NrIGluIHRoZSBsb2NrZWQgc3RhdGUgd2l0aCB0aGUgY2FsbGluZyB0aHJlYWQgYXMgaXRzIG93bmVyLgorICoKKyAqIFJldHVybjoKKyAqICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgICAgbG9jayB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkCisgKiAgICAgIENERiBmYWlsdXJlIHJlYXNvbiBjb2RlczogbG9jayBpcyBub3QgaW5pdGlhbGl6ZWQgYW5kIGNhbid0IGJlIHVzZWQKKyAqLworQ0RGX1NUQVRVUyBjZGZfbXV0ZXhfYWNxdWlyZShjZGZfbXV0ZXhfdCAqbG9jaykKK3sKKwlpbnQgcmM7CisJLyogY2hlY2sgZm9yIGludmFsaWQgcG9pbnRlciAqLworCWlmIChsb2NrID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisJLyogY2hlY2sgaWYgbG9jayByZWZlcnMgdG8gYW4gaW5pdGlhbGl6ZWQgb2JqZWN0ICovCisJaWYgKExJTlVYX0xPQ0tfQ09PS0lFICE9IGxvY2stPmNvb2tpZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiB1bmluaXRpYWxpemVkIGxvY2siLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJaWYgKGluX2ludGVycnVwdCgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0ISEhIiwKKwkJCSAgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKwlpZiAoKGxvY2stPnByb2Nlc3NJRCA9PSBjdXJyZW50LT5waWQpICYmCisJCShsb2NrLT5zdGF0ZSA9PSBMT0NLX0FDUVVJUkVEKSkgeworCQlsb2NrLT5yZWZjb3VudCsrOworI2lmZGVmIENERl9ORVNURURfTE9DS19ERUJVRworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6ICV4ICVkICVkIiwgX19mdW5jX18sIGxvY2ssIGN1cnJlbnQtPnBpZCwKKwkJCSAgbG9jay0+cmVmY291bnQpOworI2VuZGlmCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCS8qIGFjcXVpcmUgYSBMb2NrICovCisJbXV0ZXhfbG9jaygmbG9jay0+bV9sb2NrKTsKKwlyYyA9IG11dGV4X2lzX2xvY2tlZCgmbG9jay0+bV9sb2NrKTsKKwlpZiAocmMgPT0gMCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiB1bmFibGUgdG8gbG9jayBtdXRleCAocmMgPSAlZCkiLCBfX2Z1bmNfXywgcmMpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorI2lmZGVmIENERl9ORVNURURfTE9DS19ERUJVRworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiAleCAlZCIsIF9fZnVuY19fLCBsb2NrLCBjdXJyZW50LT5waWQpOworI2VuZGlmCisJaWYgKExPQ0tfREVTVFJPWUVEICE9IGxvY2stPnN0YXRlKSB7CisJCWxvY2stPnByb2Nlc3NJRCA9IGN1cnJlbnQtPnBpZDsKKwkJbG9jay0+cmVmY291bnQrKzsKKwkJbG9jay0+c3RhdGUgPSBMT0NLX0FDUVVJUkVEOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0gZWxzZSB7CisJCS8qIGxvY2sgaXMgYWxyZWFkeSBkZXN0cm95ZWQgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTG9jayBpcyBhbHJlYWR5IGRlc3Ryb3llZCIsIF9fZnVuY19fKTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NrLT5tX2xvY2spOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorfQorCisvKioKKyAqIGNkZl9tdXRleF9yZWxlYXNlKCkgLSByZWxlYXNlIGEgQ0RGIGxvY2sKKyAqIEBsb2NrOiAgICAgICAgUG9pbnRlciB0byB0aGUgb3BhcXVlIGxvY2sgb2JqZWN0IHRvIGJlIHJlbGVhc2VkCisgKgorICogY2RmX211dGV4X3JlbGVhc2UoKSBmdW5jdGlvbiBzaGFsbCByZWxlYXNlIHRoZSBsb2NrIG9iamVjdAorICogcmVmZXJlbmNlZCBieSAnbG9jaycuCisgKgorICogSWYgYSB0aHJlYWQgYXR0ZW1wdHMgdG8gcmVsZWFzZSBhIGxvY2sgdGhhdCBpdCB1bmxvY2tlZCBvciBpcyBub3QKKyAqIGluaXRpYWxpemVkLCBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogICAgIGxvY2sgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZAorICogICAgICBDREYgZmFpbHVyZSByZWFzb24gY29kZXM6IGxvY2sgaXMgbm90IGluaXRpYWxpemVkIGFuZCBjYW4ndCBiZSB1c2VkCisgKi8KK0NERl9TVEFUVVMgY2RmX211dGV4X3JlbGVhc2UoY2RmX211dGV4X3QgKmxvY2spCit7CisJLyogY2hlY2sgZm9yIGludmFsaWQgcG9pbnRlciAqLworCWlmIChsb2NrID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwkvKiBjaGVjayBpZiBsb2NrIHJlZmVycyB0byBhbiB1bmluaXRpYWxpemVkIG9iamVjdCAqLworCWlmIChMSU5VWF9MT0NLX0NPT0tJRSAhPSBsb2NrLT5jb29raWUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogdW5pbml0aWFsaXplZCBsb2NrIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWlmIChpbl9pbnRlcnJ1cHQoKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCEhISIsCisJCQkgIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwkvKiBDdXJyZW50VGhyZWFkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisJICogQ2hlY2sgdGhyZWFkIElEIG9mIGNhbGxlciBhZ2FpbnN0IHRocmVhZCBJRAorCSAqIG9mIHRoZSB0aHJlYWQgd2hpY2ggYWNxdWlyZSB0aGUgbG9jaworCSAqLworCWlmIChsb2NrLT5wcm9jZXNzSUQgIT0gY3VycmVudC0+cGlkKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGN1cnJlbnQgdGFzayBwaWQgZG9lcyBub3QgbWF0Y2ggb3JpZ2luYWwgdGFzayBwaWQhISIsCisJCQkgIF9fZnVuY19fKTsKKyNpZmRlZiBDREZfTkVTVEVEX0xPQ0tfREVCVUcKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzOiBMb2NrIGhlbGQgYnk9JWQgYmVpbmcgcmVsZWFzZWQgYnk9JWQiLAorCQkJICBfX2Z1bmNfXywgbG9jay0+cHJvY2Vzc0lELCBjdXJyZW50LT5waWQpOworI2VuZGlmCisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUEVSTTsKKwl9CisJaWYgKChsb2NrLT5wcm9jZXNzSUQgPT0gY3VycmVudC0+cGlkKSAmJgorCQkobG9jay0+c3RhdGUgPT0gTE9DS19BQ1FVSVJFRCkpIHsKKwkJaWYgKGxvY2stPnJlZmNvdW50ID4gMCkKKwkJCWxvY2stPnJlZmNvdW50LS07CisJfQorI2lmZGVmIENERl9ORVNURURfTE9DS19ERUJVRworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiAleCAlZCAlZCIsIF9fZnVuY19fLCBsb2NrLCBsb2NrLT5wcm9jZXNzSUQsCisJCSAgbG9jay0+cmVmY291bnQpOworI2VuZGlmCisJaWYgKGxvY2stPnJlZmNvdW50KQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJbG9jay0+cHJvY2Vzc0lEID0gMDsKKwlsb2NrLT5yZWZjb3VudCA9IDA7CisJbG9jay0+c3RhdGUgPSBMT0NLX1JFTEVBU0VEOworCS8qIHJlbGVhc2UgYSBMb2NrICovCisJbXV0ZXhfdW5sb2NrKCZsb2NrLT5tX2xvY2spOworI2lmZGVmIENERl9ORVNURURfTE9DS19ERUJVRworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBGcmVlaW5nIGxvY2sgJXggJWQgJWQiLCBsb2NrLCBsb2NrLT5wcm9jZXNzSUQsCisJCSAgbG9jay0+cmVmY291bnQpOworI2VuZGlmCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfbXV0ZXhfZGVzdHJveSgpIC0gZGVzdHJveSBhIENERiBsb2NrCisgKiBAbG9jazogICAgICAgIFBvaW50ZXIgdG8gdGhlIG9wYXF1ZSBsb2NrIG9iamVjdCB0byBiZSBkZXN0cm95ZWQKKyAqCisgKiBjZGZfbXV0ZXhfZGVzdHJveSgpIGZ1bmN0aW9uIHNoYWxsIGRlc3Ryb3kgdGhlIGxvY2sgb2JqZWN0CisgKiByZWZlcmVuY2VkIGJ5IGxvY2suICBBZnRlciBhIHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gY2RmX211dGV4X2Rlc3Ryb3koKQorICogdGhlIGxvY2sgb2JqZWN0IGJlY29tZXMsIGluIGVmZmVjdCwgdW5pbml0aWFsaXplZC4KKyAqCisgKiBBIGRlc3Ryb3llZCBsb2NrIG9iamVjdCBjYW4gYmUgcmVpbml0aWFsaXplZCB1c2luZyBjZGZfbXV0ZXhfaW5pdCgpOworICogdGhlIHJlc3VsdHMgb2Ygb3RoZXJ3aXNlIHJlZmVyZW5jaW5nIHRoZSBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVzdHJveWVkCisgKiBhcmUgdW5kZWZpbmVkLiAgQ2FsbHMgdG8gQ0RGIGxvY2sgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdGhlIGxvY2sgc3VjaAorICogYXMgY2RmX211dGV4X2FjcXVpcmUoKSB3aWxsIGZhaWwgaWYgdGhlIGxvY2sgaXMgZGVzdHJveWVkLiAgVGhlcmVmb3JlLAorICogZG9uJ3QgdXNlIHRoZSBsb2NrIGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCB1bnRpbCBpdCBoYXMKKyAqIGJlZW4gcmUtaW5pdGlhbGl6ZWQuCisgKgorICogUmV0dXJuOgorICogICAgICBDREZfU1RBVFVTX1NVQ0NFU1M6ICAgICBsb2NrIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQKKyAqICAgICAgQ0RGIGZhaWx1cmUgcmVhc29uIGNvZGVzOiBsb2NrIGlzIG5vdCBpbml0aWFsaXplZCBhbmQgY2FuJ3QgYmUgdXNlZAorICovCitDREZfU1RBVFVTIGNkZl9tdXRleF9kZXN0cm95KGNkZl9tdXRleF90ICpsb2NrKQoreworCS8qIGNoZWNrIGZvciBpbnZhbGlkIHBvaW50ZXIgKi8KKwlpZiAoTlVMTCA9PSBsb2NrKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE5VTEwgcG9pbnRlciBwYXNzZWQgaW4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJaWYgKExJTlVYX0xPQ0tfQ09PS0lFICE9IGxvY2stPmNvb2tpZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiB1bmluaXRpYWxpemVkIGxvY2siLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJaWYgKGluX2ludGVycnVwdCgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0ISEhIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCS8qIGNoZWNrIGlmIGxvY2sgaXMgcmVsZWFzZWQgKi8KKwlpZiAoIW11dGV4X3RyeWxvY2soJmxvY2stPm1fbG9jaykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogbG9jayBpcyBub3QgcmVsZWFzZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfQlVTWTsKKwl9CisJbG9jay0+Y29va2llID0gMDsKKwlsb2NrLT5zdGF0ZSA9IExPQ0tfREVTVFJPWUVEOworCWxvY2stPnByb2Nlc3NJRCA9IDA7CisJbG9jay0+cmVmY291bnQgPSAwOworCisJbXV0ZXhfdW5sb2NrKCZsb2NrLT5tX2xvY2spOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfc3BpbmxvY2tfYWNxdWlyZSgpIC0gYWNxdWlyZXMgYSBzcGluIGxvY2sKKyAqIEBwTG9jazogICAgICAgU3BpbiBsb2NrIHRvIGFjcXVpcmUKKyAqCisgKiBSZXR1cm46CisgKiAgICBDREYgc3RhdHVzIHN1Y2Nlc3MgOiBpZiB3YWtlIGxvY2sgaXMgYWNxdWlyZWQKKyAqICAgIENERiBzdGF0dXMgZmFpbHVyZSA6IGlmIHdha2UgbG9jayB3YXMgbm90IGFjcXVpcmVkCisgKi8KK0NERl9TVEFUVVMgY2RmX3NwaW5sb2NrX2FjcXVpcmUoY2RmX3NwaW5sb2NrX3QgKnBMb2NrKQoreworCXNwaW5fbG9jaygmcExvY2stPnNwaW5sb2NrKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkZl9zcGlubG9ja19yZWxlYXNlKCkgLSByZWxlYXNlIGEgc3BpbiBsb2NrCisgKiBAcExvY2s6ICAgICAgIFNwaW4gbG9jayB0byByZWxlYXNlCisgKgorICogUmV0dXJuOgorICogQ0RGIHN0YXR1cyBzdWNjZXNzIDogaWYgd2FrZSBsb2NrIGlzIGFjcXVpcmVkCisgKiBDREYgc3RhdHVzIGZhaWx1cmUgOiBpZiB3YWtlIGxvY2sgd2FzIG5vdCBhY3F1aXJlZAorICovCitDREZfU1RBVFVTIGNkZl9zcGlubG9ja19yZWxlYXNlKGNkZl9zcGlubG9ja190ICpwTG9jaykKK3sKKwlzcGluX3VubG9jaygmcExvY2stPnNwaW5sb2NrKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkZl93YWtlX2xvY2tfbmFtZSgpIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB3YWtlbG9jaworICogQHBMb2NrOiBQb2ludGVyIHRvIHRoZSB3YWtlbG9jaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2FrZWxvY2sKKyAqCisgKiBSZXR1cm46IFBvaW50ZXIgdG8gdGhlIG5hbWUgaWYgaXQgaXMgdmFsaWQgb3IgYSBkZWZhdWx0IHN0cmluZworICoKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNkZl93YWtlX2xvY2tfbmFtZShjZGZfd2FrZV9sb2NrX3QgKnBMb2NrKQoreworI2lmIGRlZmluZWQgQ09ORklHX0NOU1MKKwlpZiAocExvY2stPm5hbWUpCisJCXJldHVybiBwTG9jay0+bmFtZTsKKyNlbGlmIGRlZmluZWQoV0xBTl9PUEVOX1NPVVJDRSkgJiYgZGVmaW5lZChDT05GSUdfSEFTX1dBS0VMT0NLKQorCWlmIChwTG9jay0+d3MubmFtZSkKKwkJcmV0dXJuIHBMb2NrLT53cy5uYW1lOworI2VuZGlmCisJcmV0dXJuICJVTk5BTUVEX1dBS0VMT0NLIjsKK30KKworLyoqCisgKiBjZGZfd2FrZV9sb2NrX2luaXQoKSAtIGluaXRpYWxpemVzIGEgQ0RGIHdha2UgbG9jaworICogQHBMb2NrOiBUaGUgd2FrZSBsb2NrIHRvIGluaXRpYWxpemUKKyAqIEBuYW1lOiBOYW1lIG9mIHdha2UgbG9jaworICoKKyAqIFJldHVybjoKKyAqICAgIENERiBzdGF0dXMgc3VjY2VzcyA6IGlmIHdha2UgbG9jayBpcyBpbml0aWFsaXplZAorICogICAgQ0RGIHN0YXR1cyBmYWlsdXJlIDogaWYgd2FrZSBsb2NrIHdhcyBub3QgaW5pdGlhbGl6ZWQKKyAqLworQ0RGX1NUQVRVUyBjZGZfd2FrZV9sb2NrX2luaXQoY2RmX3dha2VfbG9ja190ICpwTG9jaywgY29uc3QgY2hhciAqbmFtZSkKK3sKKyNpZiBkZWZpbmVkIENPTkZJR19DTlNTCisJY25zc19wbV93YWtlX2xvY2tfaW5pdChwTG9jaywgbmFtZSk7CisjZWxpZiBkZWZpbmVkKFdMQU5fT1BFTl9TT1VSQ0UpICYmIGRlZmluZWQoQ09ORklHX0hBU19XQUtFTE9DSykKKwl3YWtlX2xvY2tfaW5pdChwTG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsIG5hbWUpOworI2VuZGlmCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfd2FrZV9sb2NrX2FjcXVpcmUoKSAtIGFjcXVpcmVzIGEgd2FrZSBsb2NrCisgKiBAcExvY2s6ICAgICAgIFRoZSB3YWtlIGxvY2sgdG8gYWNxdWlyZQorICogQHJlYXNvbjogICAgICBSZWFzb24gZm9yIHdha2Vsb2NrCisgKgorICogUmV0dXJuOgorICogICAgQ0RGIHN0YXR1cyBzdWNjZXNzIDogaWYgd2FrZSBsb2NrIGlzIGFjcXVpcmVkCisgKiAgICBDREYgc3RhdHVzIGZhaWx1cmUgOiBpZiB3YWtlIGxvY2sgd2FzIG5vdCBhY3F1aXJlZAorICovCitDREZfU1RBVFVTIGNkZl93YWtlX2xvY2tfYWNxdWlyZShjZGZfd2FrZV9sb2NrX3QgKnBMb2NrLCB1aW50MzJfdCByZWFzb24pCit7CisJaG9zdF9kaWFnX2xvZ193bG9jayhyZWFzb24sIGNkZl93YWtlX2xvY2tfbmFtZShwTG9jayksCisJCQlXSUZJX1BPV0VSX0VWRU5UX0RFRkFVTFRfV0FLRUxPQ0tfVElNRU9VVCwKKwkJCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfVEFLRU4pOworI2lmIGRlZmluZWQgQ09ORklHX0NOU1MKKwljbnNzX3BtX3dha2VfbG9jayhwTG9jayk7CisjZWxpZiBkZWZpbmVkKFdMQU5fT1BFTl9TT1VSQ0UpICYmIGRlZmluZWQoQ09ORklHX0hBU19XQUtFTE9DSykKKwl3YWtlX2xvY2socExvY2spOworI2VuZGlmCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfd2FrZV9sb2NrX3RpbWVvdXRfYWNxdWlyZSgpIC0gYWNxdWlyZXMgYSB3YWtlIGxvY2sgd2l0aCBhIHRpbWVvdXQKKyAqIEBwTG9jazogICAgICAgVGhlIHdha2UgbG9jayB0byBhY3F1aXJlCisgKiBAcmVhc29uOiAgICAgIFJlYXNvbiBmb3Igd2FrZWxvY2sKKyAqCisgKiBSZXR1cm46CisgKiAgIENERiBzdGF0dXMgc3VjY2VzcyA6IGlmIHdha2UgbG9jayBpcyBhY3F1aXJlZAorICogICBDREYgc3RhdHVzIGZhaWx1cmUgOiBpZiB3YWtlIGxvY2sgd2FzIG5vdCBhY3F1aXJlZAorICovCitDREZfU1RBVFVTIGNkZl93YWtlX2xvY2tfdGltZW91dF9hY3F1aXJlKGNkZl93YWtlX2xvY2tfdCAqcExvY2ssIHVpbnQzMl90IG1zZWMsCisJCQkJCSB1aW50MzJfdCByZWFzb24pCit7CisJLyogV2FrZWxvY2sgZm9yIFJ4IGlzIGZyZXF1ZW50LgorCSAqIEl0IGlzIHJlcG9ydGVkIG9ubHkgZHVyaW5nIGFjdGl2ZSBkZWJ1ZworCSAqLworCWlmICgoKGNkc19nZXRfcmluZ19sb2dfbGV2ZWwoUklOR19JRF9XQUtFTE9DSykgPj0gV0xBTl9MT0dfTEVWRUxfQUNUSVZFKQorCQkJJiYgKFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfSE9MRF9SWCA9PSByZWFzb24pKSB8fAorCQkJKFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfSE9MRF9SWCAhPSByZWFzb24pKSB7CisJCWhvc3RfZGlhZ19sb2dfd2xvY2socmVhc29uLCBjZGZfd2FrZV9sb2NrX25hbWUocExvY2spLCBtc2VjLAorCQkJCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfVEFLRU4pOworCX0KKyNpZiBkZWZpbmVkIENPTkZJR19DTlNTCisJY25zc19wbV93YWtlX2xvY2tfdGltZW91dChwTG9jaywgbXNlYyk7CisjZWxpZiBkZWZpbmVkKFdMQU5fT1BFTl9TT1VSQ0UpICYmIGRlZmluZWQoQ09ORklHX0hBU19XQUtFTE9DSykKKwl3YWtlX2xvY2tfdGltZW91dChwTG9jaywgbXNlY3NfdG9famlmZmllcyhtc2VjKSk7CisjZW5kaWYKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkZl93YWtlX2xvY2tfcmVsZWFzZSgpIC0gcmVsZWFzZXMgYSB3YWtlIGxvY2sKKyAqIEBwTG9jazogICAgICAgdGhlIHdha2UgbG9jayB0byByZWxlYXNlCisgKiBAcmVhc29uOiAgICAgIFJlYXNvbiBmb3Igd2FrZWxvY2sKKyAqCisgKiBSZXR1cm46CisgKiAgICBDREYgc3RhdHVzIHN1Y2Nlc3MgOiBpZiB3YWtlIGxvY2sgaXMgYWNxdWlyZWQKKyAqICAgIENERiBzdGF0dXMgZmFpbHVyZSA6IGlmIHdha2UgbG9jayB3YXMgbm90IGFjcXVpcmVkCisgKi8KK0NERl9TVEFUVVMgY2RmX3dha2VfbG9ja19yZWxlYXNlKGNkZl93YWtlX2xvY2tfdCAqcExvY2ssIHVpbnQzMl90IHJlYXNvbikKK3sKKwlob3N0X2RpYWdfbG9nX3dsb2NrKHJlYXNvbiwgY2RmX3dha2VfbG9ja19uYW1lKHBMb2NrKSwKKwkJCVdJRklfUE9XRVJfRVZFTlRfREVGQVVMVF9XQUtFTE9DS19USU1FT1VULAorCQkJV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19SRUxFQVNFRCk7CisjaWYgZGVmaW5lZCBDT05GSUdfQ05TUworCWNuc3NfcG1fd2FrZV9sb2NrX3JlbGVhc2UocExvY2spOworI2VsaWYgZGVmaW5lZChXTEFOX09QRU5fU09VUkNFKSAmJiBkZWZpbmVkKENPTkZJR19IQVNfV0FLRUxPQ0spCisJd2FrZV91bmxvY2socExvY2spOworI2VuZGlmCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfd2FrZV9sb2NrX2Rlc3Ryb3koKSAtIGRlc3Ryb3lzIGEgd2FrZSBsb2NrCisgKiBAcExvY2s6ICAgICAgIFRoZSB3YWtlIGxvY2sgdG8gZGVzdHJveQorICoKKyAqIFJldHVybjoKKyAqIENERiBzdGF0dXMgc3VjY2VzcyA6IGlmIHdha2UgbG9jayBpcyBhY3F1aXJlZAorICogQ0RGIHN0YXR1cyBmYWlsdXJlIDogaWYgd2FrZSBsb2NrIHdhcyBub3QgYWNxdWlyZWQKKyAqLworQ0RGX1NUQVRVUyBjZGZfd2FrZV9sb2NrX2Rlc3Ryb3koY2RmX3dha2VfbG9ja190ICpwTG9jaykKK3sKKyNpZiBkZWZpbmVkIENPTkZJR19DTlNTCisJY25zc19wbV93YWtlX2xvY2tfZGVzdHJveShwTG9jayk7CisjZWxpZiBkZWZpbmVkKFdMQU5fT1BFTl9TT1VSQ0UpICYmIGRlZmluZWQoQ09ORklHX0hBU19XQUtFTE9DSykKKwl3YWtlX2xvY2tfZGVzdHJveShwTG9jayk7CisjZW5kaWYKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvc3JjL2NkZl9tY190aW1lci5jIGIvY29yZS9jZGYvc3JjL2NkZl9tY190aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZmRmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvY2RmX21jX3RpbWVyLmMKQEAgLTAsMCArMSw4MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogIERPQzogY2RmX21jX3RpbWVyCisgKgorICogIENvbm5lY3Rpdml0eSBkcml2ZXIgZnJhbWV3b3JrIHRpbWVyIEFQSXMgc2VyaWFsaXplZCB0byBNQyB0aHJlYWQKKyAqLworCisvKiBJbmNsdWRlIEZpbGVzICovCisjaW5jbHVkZSA8Y2RmX21jX3RpbWVyLmg+CisjaW5jbHVkZSA8Y2RmX2xvY2suaD4KKyNpbmNsdWRlIDxjZHNfYXBpLmg+CisjaW5jbHVkZSAid2xhbl9xY3Rfc3lzLmgiCisjaW5jbHVkZSAiY2RzX3NjaGVkLmgiCisKKy8qIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzICovCisKKyNkZWZpbmUgTElOVVhfVElNRVJfQ09PS0lFIDB4MTIzNDEyMzQKKyNkZWZpbmUgTElOVVhfSU5WQUxJRF9USU1FUl9DT09LSUUgMHhmZWVkZmFjZQorI2RlZmluZSBUTVJfSU5WQUxJRF9JRCAoMCkKKworLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworLyogU3RhdGljIFZhcmlhYmxlIERlZmluaXRpb25zICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBlcnNpc3RlbnRfdGltZXJfY291bnQ7CitzdGF0aWMgY2RmX211dGV4X3QgcGVyc2lzdGVudF90aW1lcl9jb3VudF9sb2NrOworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbiAqLworCisvKioKKyAqIHRyeV9hbGxvd2luZ19zbGVlcCgpIC0gY2xlYW4gdXAgdGltZXIgc3RhdGVzIGFmdGVyIGl0IGhhcyBiZWVuIGRlYWN0aXZhdGVkCisgKiBAdHlwZTogVGltZXIgdHlwZQorICoKKyAqIENsZWFuIHVwIHRpbWVyIHN0YXRlcyBhZnRlciBpdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCBjaGVjayBhbmQgdHJ5IHRvIGFsbG93CisgKiBzbGVlcCBhZnRlciBhIHRpbWVyIGhhcyBiZWVuIHN0b3BwZWQgb3IgZXhwaXJlZC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgdHJ5X2FsbG93aW5nX3NsZWVwKENERl9USU1FUl9UWVBFIHR5cGUpCit7CisJaWYgKENERl9USU1FUl9UWVBFX1dBS0VfQVBQUyA9PSB0eXBlKSB7CisJCS8qIGNkZl9tdXRleF9hY3F1aXJlKCZwZXJzaXN0ZW50X3RpbWVyX2NvdW50X2xvY2spOyAqLworCQlwZXJzaXN0ZW50X3RpbWVyX2NvdW50LS07CisJCWlmICgwID09IHBlcnNpc3RlbnRfdGltZXJfY291bnQpIHsKKwkJCS8qIHNpbmNlIHRoZSBudW1iZXIgb2YgcGVyc2lzdGVudCB0aW1lcnMgaGFzCisJCQkgICBkZWNyZWFzZWQgZnJvbSAxIHRvIDAsIHRoZSB0aW1lciBzaG91bGQgYWxsb3cKKwkJCSAgIHNsZWVwIHNsZWVwX2Fzc2VydF9va3RzKCBzbGVlcENsaWVudEhhbmRsZSApOyAqLworCQl9CisJCS8qIGNkZl9tdXRleF9yZWxlYXNlKCZwZXJzaXN0ZW50X3RpbWVyX2NvdW50X2xvY2spOyAqLworCX0KK30KKworLyoqCisgKiBjZGZfbGludXhfdGltZXJfY2FsbGJhY2soKSAtIGludGVybmFsIGNkZiBlbnRyeSBwb2ludCB3aGljaCBpcworICoJCQkJY2FsbGVkIHdoZW4gdGhlIHRpbWVyIGludGVydmFsIGV4cGlyZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSB0aW1lciBjb250cm9sIGJsb2NrIHdoaWNoIGRlc2NyaWJlcyB0aGUKKyAqCXRpbWVyIHRoYXQgZXhwaXJlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW4gdHVybiBjYWxscyB0aGUgQ0RGIGNsaWVudCBjYWxsYmFjayBhbmQgY2hhbmdlcyB0aGUKKyAqIHN0YXRlIG9mIHRoZSB0aW1lciBmcm9tIHJ1bm5pbmcgKEFDVElWRSkgdG8gZXhwaXJlZCAoSU5JVCkuCisgKgorICogTm90ZTogZnVuY3Rpb24gc2lnbmF0dXJlIGlzIGRlZmluZWQgYnkgdGhlIExpbnV4IGtlcm5lbC4gIFRoZSBmYWN0CisgKiB0aGF0IHRoZSBhcmd1bWVudCBpcyAidW5zaWduZWQgbG9uZyIgaW5zdGVhZCBvZiAidm9pZCAqIiBpcworICogdW5mb3J0dW5hdGVseSBpbXBvc2VkIHVwb24gdXMuICBCdXQgd2UgY2FuIHNhZmVseSBwYXNzIGEgcG9pbnRlciB2aWEKKyAqIHRoaXMgcGFyYW1ldGVyIGZvciBMUDMyIGFuZCBMUDY0IGFyY2hpdGVjdHVyZXMuCisgKgorICogIFJldHVybjogbm90aGluZworICovCisKK3N0YXRpYyB2b2lkIGNkZl9saW51eF90aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJY2RmX21jX3RpbWVyX3QgKnRpbWVyID0gKGNkZl9tY190aW1lcl90ICopIGRhdGE7CisJY2RzX21zZ190IG1zZzsKKwlDREZfU1RBVFVTIHZTdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNkZl9tY190aW1lcl9jYWxsYmFja190IGNhbGxiYWNrID0gTlVMTDsKKwl2b2lkICp1c2VyRGF0YSA9IE5VTEw7CisJaW50IHRocmVhZElkOworCUNERl9USU1FUl9UWVBFIHR5cGUgPSBDREZfVElNRVJfVFlQRV9TVzsKKworCUNERl9BU1NFUlQodGltZXIpOworCisJaWYgKHRpbWVyID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlcyBOdWxsIHBvaW50ZXIgcGFzc2VkIGluISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXRocmVhZElkID0gdGltZXItPnBsYXRmb3JtSW5mby50aHJlYWRJRDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZXItPnBsYXRmb3JtSW5mby5zcGlubG9jaywgZmxhZ3MpOworCisJc3dpdGNoICh0aW1lci0+c3RhdGUpIHsKKwljYXNlIENERl9USU1FUl9TVEFURV9TVEFSVElORzoKKwkJLyogd2UgYXJlIGluIHRoaXMgc3RhdGUgYmVjYXVzZSBzb21lb25lIGp1c3Qgc3RhcnRlZCB0aGUgdGltZXIsCisJCSAqIE1DIHRpbWVyIGdvdCBzdGFydGVkIGFuZCBleHBpcmVkLCBidXQgdGhlIHRpbWUgY29udGVudCBoYXZlCisJCSAqIG5vdCBiZWVuIHVwZGF0ZWQgdGhpcyBpcyBhIHJhcmUgcmFjZSBjb25kaXRpb24hCisJCSAqLworCQl0aW1lci0+c3RhdGUgPSBDREZfVElNRVJfU1RBVEVfU1RPUFBFRDsKKwkJdlN0YXR1cyA9IENERl9TVEFUVVNfRV9BTFJFQURZOworCQlicmVhazsKKworCWNhc2UgQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQ6CisJCXZTdGF0dXMgPSBDREZfU1RBVFVTX0VfQUxSRUFEWTsKKwkJYnJlYWs7CisKKwljYXNlIENERl9USU1FUl9TVEFURV9VTlVTRUQ6CisJCXZTdGF0dXMgPSBDREZfU1RBVFVTX0VfRVhJU1RTOworCQlicmVhazsKKworCWNhc2UgQ0RGX1RJTUVSX1NUQVRFX1JVTk5JTkc6CisJCS8qIG5lZWQgdG8gZ28gdG8gc3RvcCBzdGF0ZSBoZXJlIGJlY2F1c2UgdGhlIGNhbGwtYmFjayBmdW5jdGlvbgorCQkgKiBtYXkgcmVzdGFydCB0aW1lciAodG8gZW11bGF0ZSBwZXJpb2RpYyB0aW1lcikKKwkJICovCisJCXRpbWVyLT5zdGF0ZSA9IENERl9USU1FUl9TVEFURV9TVE9QUEVEOworCQkvKiBjb3B5IHRoZSByZWxldmFudCB0aW1lciBpbmZvcm1hdGlvbiB0byBsb2NhbCB2YXJpYWJsZXM7CisJCSAqIG9uY2Ugd2UgZXhpc3QgZnJvbSB0aGlzIGNyaXRpY2FsIHNlY3Rpb24sIHRoZSB0aW1lciBjb250ZW50CisJCSAqIG1heSBiZSBtb2RpZmllZCBieSBvdGhlciB0YXNrcworCQkgKi8KKwkJY2FsbGJhY2sgPSB0aW1lci0+Y2FsbGJhY2s7CisJCXVzZXJEYXRhID0gdGltZXItPnVzZXJEYXRhOworCQl0aHJlYWRJZCA9IHRpbWVyLT5wbGF0Zm9ybUluZm8udGhyZWFkSUQ7CisJCXR5cGUgPSB0aW1lci0+dHlwZTsKKwkJdlN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlDREZfQVNTRVJUKDApOworCQl2U3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHZTdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJUSU1FUiBjYWxsYmFjayBjYWxsZWQgaW4gYSB3cm9uZyBzdGF0ZT0lZCIsCisJCQkgIHRpbWVyLT5zdGF0ZSk7CisJCXJldHVybjsKKwl9CisKKwl0cnlfYWxsb3dpbmdfc2xlZXAodHlwZSk7CisKKwlpZiAoY2FsbGJhY2sgPT0gTlVMTCkgeworCQlDREZfQVNTRVJUKDApOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBObyBUSU1FUiBjYWxsYmFjaywgQ291bGQgbm90IGVucXVldWUgdGltZXIgdG8gYW55IHF1ZXVlIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIlRJTUVSIGNhbGxiYWNrOiBydW5uaW5nIG9uIE1DIHRocmVhZCIpOworCisJLyogc2VyaWFsaXplIHRvIHRoZSBNQyB0aHJlYWQgKi8KKwlzeXNfYnVpbGRfbWVzc2FnZV9oZWFkZXIoU1lTX01TR19JRF9NQ19USU1FUiwgJm1zZyk7CisJbXNnLmNhbGxiYWNrID0gY2FsbGJhY2s7CisJbXNnLmJvZHlwdHIgPSB1c2VyRGF0YTsKKwltc2cuYm9keXZhbCA9IDA7CisKKwlpZiAoY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfU1lTLCAmbXNnKSA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybjsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICIlczogQ291bGQgbm90IGVucXVldWUgdGltZXIgdG8gYW55IHF1ZXVlIiwgX19mdW5jX18pOworCUNERl9BU1NFUlQoMCk7Cit9CisKKy8qKgorICogY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKCkgLSBnZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRpbWVyCisgKiBAcFRpbWVyOiBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICoKKyAqIFJldHVybjoKKyAqCUNERl9USU1FUl9TVEFURSAtIGNkZiB0aW1lciBzdGF0ZQorICovCitDREZfVElNRVJfU1RBVEUgY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKGNkZl9tY190aW1lcl90ICpwVGltZXIpCit7CisJaWYgKE5VTEwgPT0gcFRpbWVyKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfVElNRVJfU1RBVEVfVU5VU0VEOworCX0KKworCXN3aXRjaCAocFRpbWVyLT5zdGF0ZSkgeworCWNhc2UgQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQ6CisJY2FzZSBDREZfVElNRVJfU1RBVEVfU1RBUlRJTkc6CisJY2FzZSBDREZfVElNRVJfU1RBVEVfUlVOTklORzoKKwljYXNlIENERl9USU1FUl9TVEFURV9VTlVTRUQ6CisJCXJldHVybiBwVGltZXItPnN0YXRlOworCWRlZmF1bHQ6CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfVElNRVJfU1RBVEVfVU5VU0VEOworCX0KK30KKworLyoqCisgKiBjZGZfdGltZXJfbW9kdWxlX2luaXQoKSAtIGluaXRpYWxpemVzIGEgQ0RGIHRpbWVyIG1vZHVsZS4KKyAqCisgKiBUaGlzIEFQSSBpbml0aWFsaXplcyB0aGUgQ0RGIHRpbWVyIG1vZHVsZS4gVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQKKyAqIGV4YWN0bHkgb25jZSBwcmlvciB0byB1c2luZyBhbnkgQ0RGIHRpbWVycy4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBjZGZfdGltZXJfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICJJbml0aWFsaXppbmcgdGhlIENERiB0aW1lciBtb2R1bGUiKTsKKwljZGZfbXV0ZXhfaW5pdCgmcGVyc2lzdGVudF90aW1lcl9jb3VudF9sb2NrKTsKK30KKworI2lmZGVmIFRJTUVSX01BTkFHRVIKKworY2RmX2xpc3RfdCBjZGZfdGltZXJfbGlzdDsKK2NkZl9zcGlubG9ja190IGNkZl90aW1lcl9saXN0X2xvY2s7CisKK3N0YXRpYyB2b2lkIGNkZl90aW1lcl9jbGVhbih2b2lkKTsKKworLyoqCisgKiBjZGZfbWNfdGltZXJfbWFuYWdlcl9pbml0KCkgLSBpbml0aWFsaXplIENERiBkZWJ1ZyB0aW1lciBtYW5hZ2VyCisgKgorICogVGhpcyBBUEkgaW5pdGlhbGl6ZXMgQ0RGIHRpbWVyIGRlYnVnIGZ1bmN0aW9uYWxpdHkuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RmX21jX3RpbWVyX21hbmFnZXJfaW5pdCh2b2lkKQoreworCS8qIEluaXRhbGl6aW5nIHRoZSBsaXN0IHdpdGggbWF4aW11bSBzaXplIG9mIDYwMDAwICovCisJY2RmX2xpc3RfaW5pdCgmY2RmX3RpbWVyX2xpc3QsIDEwMDApOworCWNkZl9zcGlubG9ja19pbml0KCZjZGZfdGltZXJfbGlzdF9sb2NrKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogY2RmX3RpbWVyX2NsZWFuKCkgLSBjbGVhbiB1cCBDREYgdGltZXIgZGVidWcgZnVuY3Rpb25hbGl0eQorICoKKyAqIFRoaXMgQVBJIGNsZWFucyB1cCBDREYgdGltZXIgZGVidWcgZnVuY3Rpb25hbGl0eSBhbmQgcHJpbnRzIHdoaWNoIENERiB0aW1lcnMKKyAqIGFyZSBsZWFrZWQuIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBkcml2ZXIgdW5sb2FkLgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBjZGZfdGltZXJfY2xlYW4odm9pZCkKK3sKKwl1aW50MzJfdCBsaXN0U2l6ZTsKKworCWNkZl9saXN0X3NpemUoJmNkZl90aW1lcl9saXN0LCAmbGlzdFNpemUpOworCisJaWYgKGxpc3RTaXplKSB7CisJCWNkZl9saXN0X25vZGVfdCAqcE5vZGU7CisJCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKworCQljZGZfbWNfdGltZXJfbm9kZV90ICpwdGltZXJOb2RlOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBMaXN0IGlzIG5vdCBFbXB0eS4gbGlzdFNpemUgJWQgIiwKKwkJCSAgX19mdW5jX18sIChpbnQpbGlzdFNpemUpOworCisJCWRvIHsKKwkJCWNkZl9zcGluX2xvY2tfaXJxc2F2ZSgmY2RmX3RpbWVyX2xpc3RfbG9jayk7CisJCQljZGZfc3RhdHVzID0KKwkJCQljZGZfbGlzdF9yZW1vdmVfZnJvbnQoJmNkZl90aW1lcl9saXN0LCAmcE5vZGUpOworCQkJY2RmX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNkZl90aW1lcl9saXN0X2xvY2spOworCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfc3RhdHVzKSB7CisJCQkJcHRpbWVyTm9kZSA9IChjZGZfbWNfdGltZXJfbm9kZV90ICopIHBOb2RlOworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkJCSAgIlRpbWVyIExlYWtAIEZpbGUgJXMsIEBMaW5lICVkIiwKKwkJCQkJICBwdGltZXJOb2RlLT5maWxlTmFtZSwKKwkJCQkJICAoaW50KXB0aW1lck5vZGUtPmxpbmVOdW0pOworCQkJCWNkZl9tZW1fZnJlZShwdGltZXJOb2RlKTsKKwkJCX0KKwkJfSB3aGlsZSAoY2RmX3N0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpOworCX0KK30KKworLyoqCisgKiBjZGZfbWNfdGltZXJfZXhpdCgpIC0gZXhpdCBDREYgdGltZXIgZGVidWcgZnVuY3Rpb25hbGl0eQorICoKKyAqIFRoaXMgQVBJIGV4aXN0cyBDREYgdGltZXIgZGVidWcgZnVuY3Rpb25hbGl0eQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNkZl9tY190aW1lcl9leGl0KHZvaWQpCit7CisJY2RmX3RpbWVyX2NsZWFuKCk7CisJY2RmX2xpc3RfZGVzdHJveSgmY2RmX3RpbWVyX2xpc3QpOworfQorI2VuZGlmCisKKy8qKgorICogY2RmX21jX3RpbWVyX2luaXQoKSAtIGluaXRpYWxpemUgYSBDREYgdGltZXIKKyAqIEBwVGltZXI6ICAgICBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICogQHRpbWVyVHlwZTogIFR5cGUgb2YgdGltZXIKKyAqIEBjYWxsYmFjazogICBDYWxsYmFjayB0byBiZSBjYWxsZWQgYWZ0ZXIgdGltZXIgZXhwaXJ5CisgKiBAc2VyRGF0YTogICAgVXNlciBkYXRhIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogVGhpcyBBUEkgaW5pdGlhbGl6ZXMgYSBDREYgVGltZXIgb2JqZWN0LgorICoKKyAqIGNkZl9tY190aW1lcl9pbml0KCkgaW5pdGlhbGl6ZXMgYSBDREYgVGltZXIgb2JqZWN0LiAgQSB0aW1lciBtdXN0IGJlCisgKiBpbml0aWFsaXplZCBieSBjYWxsaW5nIGNkZl9tY190aW1lcl9pbml0aWFsaXplKCkgYmVmb3JlIGl0IG1heSBiZSB1c2VkIGluCisgKiBhbnkgb3RoZXIgdGltZXIgZnVuY3Rpb25zLgorICoKKyAqIEF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSB0aW1lciB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgcmVzdWx0cyBpbgorICogYSBmYWlsdXJlLiBBIGRlc3Ryb3llZCB0aW1lciBvYmplY3QgY2FuIGJlIHJlLWluaXRpYWxpemVkIHdpdGggYSBjYWxsIHRvCisgKiBjZGZfbWNfdGltZXJfaW5pdCgpLiAgVGhlIHJlc3VsdHMgb2Ygb3RoZXJ3aXNlIHJlZmVyZW5jaW5nIHRoZSBvYmplY3QKKyAqIGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCBhcmUgdW5kZWZpbmVkLgorICoKKyAqICBDYWxscyB0byBDREYgdGltZXIgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdGhlIHRpbWVyIHN1Y2gKKyAqICBhcyBjZGZfbWNfdGltZXJfc2V0KCkgd2lsbCBmYWlsIGlmIHRoZSB0aW1lciBpcyBub3QgaW5pdGlhbGl6ZWQgb3IgaGFzCisgKiAgYmVlbiBkZXN0cm95ZWQuICBUaGVyZWZvcmUsIGRvbid0IHVzZSB0aGUgdGltZXIgYWZ0ZXIgaXQgaGFzIGJlZW4KKyAqICBkZXN0cm95ZWQgdW50aWwgaXQgaGFzIGJlZW4gcmUtaW5pdGlhbGl6ZWQuCisgKgorICogIEFsbCBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdpdGhpbiB0aGUgQ0RTIG1haW4gdGhyZWFkIHVubGVzcyBpdCBpcworICogIGluaXRpYWxpemVkIGZyb20gdGhlIFR4IHRocmVhZCBmbG93LCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmUgZXhlY3V0ZWQKKyAqICB3aXRoaW4gdGhlIHR4IHRocmVhZCBmbG93LgorICoKKyAqIFJldHVybjoKKyAqCUNERl9TVEFUVVNfU1VDQ0VTUyAtIFRpbWVyIGlzIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseQorICoJQ0RGIGZhaWx1cmUgc3RhdHVzIC0gVGltZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkCisgKi8KKyNpZmRlZiBUSU1FUl9NQU5BR0VSCitDREZfU1RBVFVTIGNkZl9tY190aW1lcl9pbml0X2RlYnVnKGNkZl9tY190aW1lcl90ICp0aW1lciwKKwkJCQkgICBDREZfVElNRVJfVFlQRSB0aW1lclR5cGUsCisJCQkJICAgY2RmX21jX3RpbWVyX2NhbGxiYWNrX3QgY2FsbGJhY2ssCisJCQkJICAgdm9pZCAqdXNlckRhdGEsIGNoYXIgKmZpbGVOYW1lLAorCQkJCSAgIHVpbnQzMl90IGxpbmVOdW0pCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCisJLyogY2hlY2sgZm9yIGludmFsaWQgcG9pbnRlciAqLworCWlmICgodGltZXIgPT0gTlVMTCkgfHwgKGNhbGxiYWNrID09IE5VTEwpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE51bGwgcGFyYW1zIGJlaW5nIHBhc3NlZCIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwl0aW1lci0+cHRpbWVyTm9kZSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZihjZGZfbWNfdGltZXJfbm9kZV90KSk7CisKKwlpZiAodGltZXItPnB0aW1lck5vZGUgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRpbWVOb2RlIiwKKwkJCSAgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1fc2V0KHRpbWVyLT5wdGltZXJOb2RlLCBzaXplb2YoY2RmX21jX3RpbWVyX25vZGVfdCksIDApOworCisJdGltZXItPnB0aW1lck5vZGUtPmZpbGVOYW1lID0gZmlsZU5hbWU7CisJdGltZXItPnB0aW1lck5vZGUtPmxpbmVOdW0gPSBsaW5lTnVtOworCXRpbWVyLT5wdGltZXJOb2RlLT5jZGZfdGltZXIgPSB0aW1lcjsKKworCWNkZl9zcGluX2xvY2tfaXJxc2F2ZSgmY2RmX3RpbWVyX2xpc3RfbG9jayk7CisJY2RmX3N0YXR1cyA9IGNkZl9saXN0X2luc2VydF9mcm9udCgmY2RmX3RpbWVyX2xpc3QsCisJCQkJCSAgICZ0aW1lci0+cHRpbWVyTm9kZS0+cE5vZGUpOworCWNkZl9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjZGZfdGltZXJfbGlzdF9sb2NrKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogVW5hYmxlIHRvIGluc2VydCBub2RlIGludG8gTGlzdCBjZGZfc3RhdHVzICVkIiwKKwkJCSAgX19mdW5jX18sIGNkZl9zdGF0dXMpOworCX0KKworCS8qIHNldCB0aGUgdmFyaW91cyBtZW1iZXJzIG9mIHRoZSB0aW1lciBzdHJ1Y3R1cmUKKwkgKiB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgb3Igd2l0aCBkZWZhdWx0IHZhbHVlcworCSAqLworCXNwaW5fbG9ja19pbml0KCZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrKTsKKwlpZiAoQ0RGX1RJTUVSX1RZUEVfU1cgPT0gdGltZXJUeXBlKQorCQlpbml0X3RpbWVyX2RlZmVycmFibGUoJih0aW1lci0+cGxhdGZvcm1JbmZvLlRpbWVyKSk7CisJZWxzZQorCQlpbml0X3RpbWVyKCYodGltZXItPnBsYXRmb3JtSW5mby5UaW1lcikpOworCXRpbWVyLT5wbGF0Zm9ybUluZm8uVGltZXIuZnVuY3Rpb24gPSBjZGZfbGludXhfdGltZXJfY2FsbGJhY2s7CisJdGltZXItPnBsYXRmb3JtSW5mby5UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpdGltZXI7CisJdGltZXItPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJdGltZXItPnVzZXJEYXRhID0gdXNlckRhdGE7CisJdGltZXItPnR5cGUgPSB0aW1lclR5cGU7CisJdGltZXItPnBsYXRmb3JtSW5mby5jb29raWUgPSBMSU5VWF9USU1FUl9DT09LSUU7CisJdGltZXItPnBsYXRmb3JtSW5mby50aHJlYWRJRCA9IDA7CisJdGltZXItPnN0YXRlID0gQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQ7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2Vsc2UKK0NERl9TVEFUVVMgY2RmX21jX3RpbWVyX2luaXQoY2RmX21jX3RpbWVyX3QgKnRpbWVyLCBDREZfVElNRVJfVFlQRSB0aW1lclR5cGUsCisJCQkgICAgIGNkZl9tY190aW1lcl9jYWxsYmFja190IGNhbGxiYWNrLAorCQkJICAgICB2b2lkICp1c2VyRGF0YSkKK3sKKwkvKiBjaGVjayBmb3IgaW52YWxpZCBwb2ludGVyICovCisJaWYgKCh0aW1lciA9PSBOVUxMKSB8fCAoY2FsbGJhY2sgPT0gTlVMTCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTnVsbCBwYXJhbXMgYmVpbmcgcGFzc2VkIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCS8qIHNldCB0aGUgdmFyaW91cyBtZW1iZXJzIG9mIHRoZSB0aW1lciBzdHJ1Y3R1cmUKKwkgKiB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgb3Igd2l0aCBkZWZhdWx0IHZhbHVlcworCSAqLworCXNwaW5fbG9ja19pbml0KCZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrKTsKKwlpZiAoQ0RGX1RJTUVSX1RZUEVfU1cgPT0gdGltZXJUeXBlKQorCQlpbml0X3RpbWVyX2RlZmVycmFibGUoJih0aW1lci0+cGxhdGZvcm1JbmZvLlRpbWVyKSk7CisJZWxzZQorCQlpbml0X3RpbWVyKCYodGltZXItPnBsYXRmb3JtSW5mby5UaW1lcikpOworCXRpbWVyLT5wbGF0Zm9ybUluZm8uVGltZXIuZnVuY3Rpb24gPSBjZGZfbGludXhfdGltZXJfY2FsbGJhY2s7CisJdGltZXItPnBsYXRmb3JtSW5mby5UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpdGltZXI7CisJdGltZXItPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJdGltZXItPnVzZXJEYXRhID0gdXNlckRhdGE7CisJdGltZXItPnR5cGUgPSB0aW1lclR5cGU7CisJdGltZXItPnBsYXRmb3JtSW5mby5jb29raWUgPSBMSU5VWF9USU1FUl9DT09LSUU7CisJdGltZXItPnBsYXRmb3JtSW5mby50aHJlYWRJRCA9IDA7CisJdGltZXItPnN0YXRlID0gQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQ7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmCisKKy8qKgorICogY2RmX21jX3RpbWVyX2Rlc3Ryb3koKSAtIGRlc3Ryb3kgQ0RGIHRpbWVyCisgKiBAdGltZXI6IFBvaW50ZXIgdG8gdGltZXIgb2JqZWN0CisgKgorICogY2RmX21jX3RpbWVyX2Rlc3Ryb3koKSBmdW5jdGlvbiBzaGFsbCBkZXN0cm95IHRoZSB0aW1lciBvYmplY3QuCisgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gXGEgY2RmX21jX3RpbWVyX2Rlc3Ryb3koKSB0aGUgdGltZXIKKyAqIG9iamVjdCBiZWNvbWVzLCBpbiBlZmZlY3QsIHVuaW5pdGlhbGl6ZWQuCisgKgorICogQSBkZXN0cm95ZWQgdGltZXIgb2JqZWN0IGNhbiBiZSByZS1pbml0aWFsaXplZCBieSBjYWxsaW5nCisgKiBjZGZfbWNfdGltZXJfaW5pdCgpLiAgVGhlIHJlc3VsdHMgb2Ygb3RoZXJ3aXNlIHJlZmVyZW5jaW5nIHRoZSBvYmplY3QKKyAqIGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCBhcmUgdW5kZWZpbmVkLgorICoKKyAqIENhbGxzIHRvIENERiB0aW1lciBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgdGltZXIsIHN1Y2gKKyAqIGFzIGNkZl9tY190aW1lcl9zZXQoKSB3aWxsIGZhaWwgaWYgdGhlIGxvY2sgaXMgZGVzdHJveWVkLiAgVGhlcmVmb3JlLAorICogZG9uJ3QgdXNlIHRoZSB0aW1lciBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgdW50aWwgaXQgaGFzCisgKiBiZWVuIHJlLWluaXRpYWxpemVkLgorICoKKyAqIFJldHVybjoKKyAqCUNERl9TVEFUVVNfU1VDQ0VTUyAtIFRpbWVyIGlzIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseQorICoJQ0RGIGZhaWx1cmUgc3RhdHVzIC0gVGltZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkCisgKi8KKyNpZmRlZiBUSU1FUl9NQU5BR0VSCitDREZfU1RBVFVTIGNkZl9tY190aW1lcl9kZXN0cm95KGNkZl9tY190aW1lcl90ICp0aW1lcikKK3sKKwlDREZfU1RBVFVTIHZTdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGNoZWNrIGZvciBpbnZhbGlkIHBvaW50ZXIgKi8KKwlpZiAoTlVMTCA9PSB0aW1lcikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOdWxsIHRpbWVyIHBvaW50ZXIgYmVpbmcgcGFzc2VkIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCS8qIENoZWNrIGlmIHRpbWVyIHJlZmVycyB0byBhbiB1bmluaXRpYWxpemVkIG9iamVjdCAqLworCWlmIChMSU5VWF9USU1FUl9DT09LSUUgIT0gdGltZXItPnBsYXRmb3JtSW5mby5jb29raWUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogQ2Fubm90IGRlc3Ryb3kgdW5pbml0aWFsaXplZCB0aW1lciIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwljZGZfc3Bpbl9sb2NrX2lycXNhdmUoJmNkZl90aW1lcl9saXN0X2xvY2spOworCXZTdGF0dXMgPSBjZGZfbGlzdF9yZW1vdmVfbm9kZSgmY2RmX3RpbWVyX2xpc3QsCisJCQkJICAgICAgICZ0aW1lci0+cHRpbWVyTm9kZS0+cE5vZGUpOworCWNkZl9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjZGZfdGltZXJfbGlzdF9sb2NrKTsKKwlpZiAodlN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJY2RmX21lbV9mcmVlKHRpbWVyLT5wdGltZXJOb2RlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKHRpbWVyLT5zdGF0ZSkgeworCisJY2FzZSBDREZfVElNRVJfU1RBVEVfU1RBUlRJTkc6CisJCXZTdGF0dXMgPSBDREZfU1RBVFVTX0VfQlVTWTsKKwkJYnJlYWs7CisKKwljYXNlIENERl9USU1FUl9TVEFURV9SVU5OSU5HOgorCQkvKiBTdG9wIHRoZSB0aW1lciBmaXJzdCAqLworCQlkZWxfdGltZXIoJih0aW1lci0+cGxhdGZvcm1JbmZvLlRpbWVyKSk7CisJCXZTdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCWNhc2UgQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQ6CisJCXZTdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCisJY2FzZSBDREZfVElNRVJfU1RBVEVfVU5VU0VEOgorCQl2U3RhdHVzID0gQ0RGX1NUQVRVU19FX0FMUkVBRFk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJdlN0YXR1cyA9IENERl9TVEFUVVNfRV9GQVVMVDsKKwkJYnJlYWs7CisJfQorCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSB2U3RhdHVzKSB7CisJCXRpbWVyLT5wbGF0Zm9ybUluZm8uY29va2llID0gTElOVVhfSU5WQUxJRF9USU1FUl9DT09LSUU7CisJCXRpbWVyLT5zdGF0ZSA9IENERl9USU1FUl9TVEFURV9VTlVTRUQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5wbGF0Zm9ybUluZm8uc3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHZTdGF0dXM7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXItPnBsYXRmb3JtSW5mby5zcGlubG9jaywgZmxhZ3MpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIiVzOiBDYW5ub3QgZGVzdHJveSB0aW1lciBpbiBzdGF0ZSA9ICVkIiwgX19mdW5jX18sCisJCSAgdGltZXItPnN0YXRlKTsKKwlDREZfQVNTRVJUKDApOworCisJcmV0dXJuIHZTdGF0dXM7Cit9CisKKyNlbHNlCisKKy8qKgorICogY2RmX21jX3RpbWVyX2Rlc3Ryb3koKSAtIGRlc3Ryb3kgQ0RGIHRpbWVyCisgKiBAdGltZXI6IFBvaW50ZXIgdG8gdGltZXIgb2JqZWN0CisgKgorICogY2RmX21jX3RpbWVyX2Rlc3Ryb3koKSBmdW5jdGlvbiBzaGFsbCBkZXN0cm95IHRoZSB0aW1lciBvYmplY3QuCisgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gXGEgY2RmX21jX3RpbWVyX2Rlc3Ryb3koKSB0aGUgdGltZXIKKyAqIG9iamVjdCBiZWNvbWVzLCBpbiBlZmZlY3QsIHVuaW5pdGlhbGl6ZWQuCisgKgorICogQSBkZXN0cm95ZWQgdGltZXIgb2JqZWN0IGNhbiBiZSByZS1pbml0aWFsaXplZCBieSBjYWxsaW5nCisgKiBjZGZfbWNfdGltZXJfaW5pdCgpLiAgVGhlIHJlc3VsdHMgb2Ygb3RoZXJ3aXNlIHJlZmVyZW5jaW5nIHRoZSBvYmplY3QKKyAqIGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCBhcmUgdW5kZWZpbmVkLgorICoKKyAqIENhbGxzIHRvIENERiB0aW1lciBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgdGltZXIsIHN1Y2gKKyAqIGFzIGNkZl9tY190aW1lcl9zZXQoKSB3aWxsIGZhaWwgaWYgdGhlIGxvY2sgaXMgZGVzdHJveWVkLiAgVGhlcmVmb3JlLAorICogZG9uJ3QgdXNlIHRoZSB0aW1lciBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgdW50aWwgaXQgaGFzCisgKiBiZWVuIHJlLWluaXRpYWxpemVkLgorICoKKyAqIFJldHVybjoKKyAqICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTIC0gVGltZXIgaXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5CisgKiAgICAgIENERiBmYWlsdXJlIHN0YXR1cyAtIFRpbWVyIGluaXRpYWxpemF0aW9uIGZhaWxlZAorICovCitDREZfU1RBVFVTIGNkZl9tY190aW1lcl9kZXN0cm95KGNkZl9tY190aW1lcl90ICp0aW1lcikKK3sKKwlDREZfU1RBVFVTIHZTdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGNoZWNrIGZvciBpbnZhbGlkIHBvaW50ZXIgKi8KKwlpZiAoTlVMTCA9PSB0aW1lcikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOdWxsIHRpbWVyIHBvaW50ZXIgYmVpbmcgcGFzc2VkIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCS8qIGNoZWNrIGlmIHRpbWVyIHJlZmVycyB0byBhbiB1bmluaXRpYWxpemVkIG9iamVjdCAqLworCWlmIChMSU5VWF9USU1FUl9DT09LSUUgIT0gdGltZXItPnBsYXRmb3JtSW5mby5jb29raWUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogQ2Fubm90IGRlc3Ryb3kgdW5pbml0aWFsaXplZCB0aW1lciIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVyLT5wbGF0Zm9ybUluZm8uc3BpbmxvY2ssIGZsYWdzKTsKKworCXN3aXRjaCAodGltZXItPnN0YXRlKSB7CisKKwljYXNlIENERl9USU1FUl9TVEFURV9TVEFSVElORzoKKwkJdlN0YXR1cyA9IENERl9TVEFUVVNfRV9CVVNZOworCQlicmVhazsKKworCWNhc2UgQ0RGX1RJTUVSX1NUQVRFX1JVTk5JTkc6CisJCS8qIFN0b3AgdGhlIHRpbWVyIGZpcnN0ICovCisJCWRlbF90aW1lcigmKHRpbWVyLT5wbGF0Zm9ybUluZm8uVGltZXIpKTsKKwkJdlN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisKKwljYXNlIENERl9USU1FUl9TVEFURV9TVE9QUEVEOgorCQl2U3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlicmVhazsKKworCWNhc2UgQ0RGX1RJTUVSX1NUQVRFX1VOVVNFRDoKKwkJdlN0YXR1cyA9IENERl9TVEFUVVNfRV9BTFJFQURZOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXZTdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCWJyZWFrOworCX0KKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gdlN0YXR1cykgeworCQl0aW1lci0+cGxhdGZvcm1JbmZvLmNvb2tpZSA9IExJTlVYX0lOVkFMSURfVElNRVJfQ09PS0lFOworCQl0aW1lci0+c3RhdGUgPSBDREZfVElNRVJfU1RBVEVfVU5VU0VEOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybiB2U3RhdHVzOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5wbGF0Zm9ybUluZm8uc3BpbmxvY2ssIGZsYWdzKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICIlczogQ2Fubm90IGRlc3Ryb3kgdGltZXIgaW4gc3RhdGUgPSAlZCIsIF9fZnVuY19fLAorCQkgIHRpbWVyLT5zdGF0ZSk7CisJQ0RGX0FTU0VSVCgwKTsKKworCXJldHVybiB2U3RhdHVzOworfQorI2VuZGlmCisKKy8qKgorICogY2RmX21jX3RpbWVyX3N0YXJ0KCkgLSBzdGFydCBhIENERiBUaW1lciBvYmplY3QKKyAqIEB0aW1lcjogICAgICBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICogQGV4cGlyYXRpb25UaW1lOiAgICAgVGltZSB0byBleHBpcmUKKyAqCisgKiBjZGZfbWNfdGltZXJfc3RhcnQoKSBmdW5jdGlvbiBzdGFydHMgYSB0aW1lciB0byBleHBpcmUgYWZ0ZXIgdGhlCisgKiBzcGVjaWZpZWQgaW50ZXJ2YWwsIHRodXMgcnVubmluZyB0aGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbgorICogdGhlIGludGVydmFsIGV4cGlyZXMuCisgKgorICogQSB0aW1lciBvbmx5IHJ1bnMgb25jZSAoYSBvbmUtc2hvdCB0aW1lcikuICBUbyByZS1zdGFydCB0aGUKKyAqIHRpbWVyLCBjZGZfbWNfdGltZXJfc3RhcnQoKSBoYXMgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSB0aW1lciBydW5zCisgKiBvciBoYXMgYmVlbiBjYW5jZWxsZWQuCisgKgorICogUmV0dXJuOgorICoJQ0RGX1NUQVRVU19TVUNDRVNTIC0gVGltZXIgaXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5CisgKglDREYgZmFpbHVyZSBzdGF0dXMgLSBUaW1lciBpbml0aWFsaXphdGlvbiBmYWlsZWQKKyAqLworQ0RGX1NUQVRVUyBjZGZfbWNfdGltZXJfc3RhcnQoY2RmX21jX3RpbWVyX3QgKnRpbWVyLCB1aW50MzJfdCBleHBpcmF0aW9uVGltZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJUaW1lciBBZGRyIGluc2lkZSBjZHNfZW5hYmxlIDogMHglcCAiLCB0aW1lcik7CisKKwkvKiBjaGVjayBmb3IgaW52YWxpZCBwb2ludGVyICovCisJaWYgKE5VTEwgPT0gdGltZXIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlcyBOdWxsIHRpbWVyIHBvaW50ZXIgYmVpbmcgcGFzc2VkIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCS8qIGNoZWNrIGlmIHRpbWVyIHJlZmVycyB0byBhbiB1bmluaXRpYWxpemVkIG9iamVjdCAqLworCWlmIChMSU5VWF9USU1FUl9DT09LSUUgIT0gdGltZXItPnBsYXRmb3JtSW5mby5jb29raWUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogQ2Fubm90IHN0YXJ0IHVuaW5pdGlhbGl6ZWQgdGltZXIiLCBfX2Z1bmNfXyk7CisJCWlmIChMSU5VWF9JTlZBTElEX1RJTUVSX0NPT0tJRSAhPSB0aW1lci0+cGxhdGZvcm1JbmZvLmNvb2tpZSkKKwkJCUNERl9BU1NFUlQoMCk7CisKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwkvKiBjaGVjayBpZiB0aW1lciBoYXMgZXhwaXJhdGlvbiB0aW1lIGxlc3MgdGhhbiAxMCBtcyAqLworCWlmIChleHBpcmF0aW9uVGltZSA8IDEwKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IENhbm5vdCBzdGFydCBhIHRpbWVyIHdpdGggZXhwaXJhdGlvbiBsZXNzIHRoYW4gMTAgbXMiLAorCQkJICBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJLyogbWFrZSBzdXJlIHRoZSByZW1haW5lciBvZiB0aGUgbG9naWMgaXNuJ3QgaW50ZXJydXB0ZWQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZXItPnBsYXRmb3JtSW5mby5zcGlubG9jaywgZmxhZ3MpOworCisJLyogZW5zdXJlIGlmIHRoZSB0aW1lciBjYW4gYmUgc3RhcnRlZCAqLworCWlmIChDREZfVElNRVJfU1RBVEVfU1RPUFBFRCAhPSB0aW1lci0+c3RhdGUpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXItPnBsYXRmb3JtSW5mby5zcGlubG9jaywgZmxhZ3MpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogQ2Fubm90IHN0YXJ0IHRpbWVyIGluIHN0YXRlID0gJWQgIiwgX19mdW5jX18sCisJCQkgIHRpbWVyLT5zdGF0ZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfQUxSRUFEWTsKKwl9CisKKwkvKiBzdGFydCB0aGUgdGltZXIgKi8KKwltb2RfdGltZXIoJih0aW1lci0+cGxhdGZvcm1JbmZvLlRpbWVyKSwKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhleHBpcmF0aW9uVGltZSkpOworCisJdGltZXItPnN0YXRlID0gQ0RGX1RJTUVSX1NUQVRFX1JVTk5JTkc7CisKKwkvKiBnZXQgdGhlIHRocmVhZCBJRCBvbiB3aGljaCB0aGUgdGltZXIgaXMgYmVpbmcgc3RhcnRlZCAqLworCXRpbWVyLT5wbGF0Zm9ybUluZm8udGhyZWFkSUQgPSBjdXJyZW50LT5waWQ7CisKKwlpZiAoQ0RGX1RJTUVSX1RZUEVfV0FLRV9BUFBTID09IHRpbWVyLT50eXBlKSB7CisJCXBlcnNpc3RlbnRfdGltZXJfY291bnQrKzsKKwkJaWYgKDEgPT0gcGVyc2lzdGVudF90aW1lcl9jb3VudCkgeworCQkJLyogc2luY2Ugd2Ugbm93IGhhdmUgb25lIHBlcnNpc3RlbnQgdGltZXIsCisJCQkgKiB3ZSBuZWVkIHRvIGRpc2FsbG93IHNsZWVwCisJCQkgKiBzbGVlcF9uZWdhdGVfb2t0cyhzbGVlcENsaWVudEhhbmRsZSk7CisJCQkgKi8KKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5wbGF0Zm9ybUluZm8uc3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RmX21jX3RpbWVyX3N0b3AoKSAtIHN0b3AgYSBDREYgVGltZXIKKyAqIEB0aW1lcjogICAgICBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICogY2RmX21jX3RpbWVyX3N0b3AoKSBmdW5jdGlvbiBzdG9wcyBhIHRpbWVyIHRoYXQgaGFzIGJlZW4gc3RhcnRlZCBidXQKKyAqIGhhcyBub3QgZXhwaXJlZCwgZXNzZW50aWFsbHkgY2FuY2VsbGluZyB0aGUgJ3N0YXJ0JyByZXF1ZXN0LgorICoKKyAqIEFmdGVyIGEgdGltZXIgaXMgc3RvcHBlZCwgaXQgZ29lcyBiYWNrIHRvIHRoZSBzdGF0ZSBpdCB3YXMgaW4gYWZ0ZXIgaXQKKyAqIHdhcyBjcmVhdGVkIGFuZCBjYW4gYmUgc3RhcnRlZCBhZ2FpbiB2aWEgYSBjYWxsIHRvIGNkZl9tY190aW1lcl9zdGFydCgpLgorICoKKyAqIFJldHVybjoKKyAqCUNERl9TVEFUVVNfU1VDQ0VTUyAtIFRpbWVyIGlzIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseQorICoJQ0RGIGZhaWx1cmUgc3RhdHVzIC0gVGltZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkCisgKi8KK0NERl9TVEFUVVMgY2RmX21jX3RpbWVyX3N0b3AoY2RmX21jX3RpbWVyX3QgKnRpbWVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBUaW1lciBBZGRyIGluc2lkZSBjZHNfZGlzYWJsZSA6IDB4JXAiLCBfX2Z1bmNfXywgdGltZXIpOworCisJLyogY2hlY2sgZm9yIGludmFsaWQgcG9pbnRlciAqLworCWlmIChOVUxMID09IHRpbWVyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMgTnVsbCB0aW1lciBwb2ludGVyIGJlaW5nIHBhc3NlZCIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwkvKiBjaGVjayBpZiB0aW1lciByZWZlcnMgdG8gYW4gdW5pbml0aWFsaXplZCBvYmplY3QgKi8KKwlpZiAoTElOVVhfVElNRVJfQ09PS0lFICE9IHRpbWVyLT5wbGF0Zm9ybUluZm8uY29va2llKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IENhbm5vdCBzdG9wIHVuaW5pdGlhbGl6ZWQgdGltZXIiLCBfX2Z1bmNfXyk7CisJCWlmIChMSU5VWF9JTlZBTElEX1RJTUVSX0NPT0tJRSAhPSB0aW1lci0+cGxhdGZvcm1JbmZvLmNvb2tpZSkKKwkJCUNERl9BU1NFUlQoMCk7CisKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwkvKiBlbnN1cmUgdGhlIHRpbWVyIHN0YXRlIGlzIGNvcnJlY3QgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZXItPnBsYXRmb3JtSW5mby5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKENERl9USU1FUl9TVEFURV9SVU5OSU5HICE9IHRpbWVyLT5zdGF0ZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrLCBmbGFncyk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIiVzOiBDYW5ub3Qgc3RvcCB0aW1lciBpbiBzdGF0ZSA9ICVkIiwKKwkJCSAgX19mdW5jX18sIHRpbWVyLT5zdGF0ZSk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJdGltZXItPnN0YXRlID0gQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQ7CisKKwlkZWxfdGltZXIoJih0aW1lci0+cGxhdGZvcm1JbmZvLlRpbWVyKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrLCBmbGFncyk7CisKKwl0cnlfYWxsb3dpbmdfc2xlZXAodGltZXItPnR5cGUpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpIC0gZ2V0IHRoZSBzeXN0ZW0gdGltZSBpbiAxMG1zIHRpY2tzCisKKyAqIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VycmVudCBudW1iZXIKKyAqIG9mIHRpbWVyIHRpY2tzIGluIDEwbXNlYyBpbnRlcnZhbHMuIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgdGltZXN0YW1waW5nCisgKiBhbmQgY2FsY3VsYXRpbmcgdGltZSBpbnRlcnZhbHMgYnkgY2FsY3VsYXRpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28KKyAqIHRpbWVzdGFtcHMuCisgKgorICogUmV0dXJuOgorICoJVGhlIGN1cnJlbnQgc3lzdGVtIHRpY2sgY291bnQgKGluIDEwbXNlYyBpbnRlcnZhbHMpLiAgVGhpcworICoJZnVuY3Rpb24gY2Fubm90IGZhaWwuCisgKi8KK3ZfVElNRV90IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKHZvaWQpCit7CisJcmV0dXJuIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcykgLyAxMDsKK30KKworLyoqCisgKiBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCkgLSBHZXQgdGhlIHN5c3RlbSB0aW1lIGluIG1pbGxpc2Vjb25kcworICoKKyAqIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCisgKiB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgc3lzdGVtIHdhcyBzdGFydGVkCisgKgorICogUmV0dXJuOgorICoJVGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgKi8KK3ZfVElNRV90IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwlyZXR1cm4gdHYudHZfc2VjICogMTAwMCArIHR2LnR2X3VzZWMgLyAxMDAwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvc3JjL2NkZl9tZW1vcnkuYyBiL2NvcmUvY2RmL3NyYy9jZGZfbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyZDFlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL3NyYy9jZGZfbWVtb3J5LmMKQEAgLTAsMCArMSw2MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiAgY2RmX21lbW9yeQorICoKKyAqIENvbm5lY3Rpdml0eSBkcml2ZXIgZnJhbWV3b3JrIChDREYpIG1lbW9yeSBtYW5hZ2VtZW50IEFQSXMKKyAqLworCisvKiBJbmNsdWRlIEZpbGVzICovCisjaW5jbHVkZSAiY2RmX21lbW9yeS5oIgorI2luY2x1ZGUgImNkZl9uYnVmLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RmX2xvY2suaCIKKworI2lmIGRlZmluZWQoQ09ORklHX0NOU1MpCisjaW5jbHVkZSA8bmV0L2Nuc3MuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1dDTlNTX01FTV9QUkVfQUxMT0MKKyNpbmNsdWRlIDxuZXQvY25zc19wcmVhbGxvYy5oPgorI2VuZGlmCisKKyNpZmRlZiBNRU1PUllfREVCVUcKKyNpbmNsdWRlIDxjZGZfbGlzdC5oPgorCitjZGZfbGlzdF90IGNkZl9tZW1fbGlzdDsKK2NkZl9zcGlubG9ja190IGNkZl9tZW1fbGlzdF9sb2NrOworCitzdGF0aWMgdWludDhfdCBXTEFOX01FTV9IRUFERVJbXSA9IHsgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwKKwkJCQkJMHg2NywgMHg2OCB9Oworc3RhdGljIHVpbnQ4X3QgV0xBTl9NRU1fVEFJTFtdID0geyAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LAorCQkJCQkweDg2LCAweDg3IH07CisKK3N0cnVjdCBzX2NkZl9tZW1fc3RydWN0IHsKKwljZGZfbGlzdF9ub2RlX3QgcE5vZGU7CisJY2hhciAqZmlsZU5hbWU7CisJdW5zaWduZWQgaW50IGxpbmVOdW07CisJdW5zaWduZWQgaW50IHNpemU7CisJdWludDhfdCBoZWFkZXJbOF07Cit9OworI2VuZGlmCisKKy8qIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzICovCisKKy8qIFR5cGUgRGVjbGFyYXRpb25zICovCisKKy8qIERhdGEgZGVmaW5pdGlvbnMgKi8KKworLyogRXh0ZXJuYWwgRnVuY3Rpb24gaW1wbGVtZW50YXRpb24gKi8KKyNpZmRlZiBNRU1PUllfREVCVUcKKworLyoqCisgKiBjZGZfbWVtX2luaXQoKSAtIGluaXRpYWxpemUgY2RmIG1lbW9yeSBkZWJ1ZyBmdW5jdGlvbmFsaXR5CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RmX21lbV9pbml0KHZvaWQpCit7CisJLyogSW5pdGFsaXppbmcgdGhlIGxpc3Qgd2l0aCBtYXhpbXVtIHNpemUgb2YgNjAwMDAgKi8KKwljZGZfbGlzdF9pbml0KCZjZGZfbWVtX2xpc3QsIDYwMDAwKTsKKwljZGZfc3BpbmxvY2tfaW5pdCgmY2RmX21lbV9saXN0X2xvY2spOworCWNkZl9uZXRfYnVmX2RlYnVnX2luaXQoKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogY2RmX21lbV9jbGVhbigpIC0gZGlzcGxheSBtZW1vcnkgbGVhayBkZWJ1ZyBpbmZvIGFuZCBmcmVlIGxlYWtlZCBwb2ludGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNkZl9tZW1fY2xlYW4odm9pZCkKK3sKKwl1aW50MzJfdCBsaXN0U2l6ZTsKKwljZGZfbGlzdF9zaXplKCZjZGZfbWVtX2xpc3QsICZsaXN0U2l6ZSk7CisKKwljZGZfbmV0X2J1Zl9kZWJ1Z19jbGVhbigpOworCisJaWYgKGxpc3RTaXplKSB7CisJCWNkZl9saXN0X25vZGVfdCAqcE5vZGU7CisJCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKworCQlzdHJ1Y3Qgc19jZGZfbWVtX3N0cnVjdCAqbWVtU3RydWN0OworCQljaGFyICpwcmV2X21sZWFrX2ZpbGUgPSAiIjsKKwkJdW5zaWduZWQgaW50IHByZXZfbWxlYWtfbGluZU51bSA9IDA7CisJCXVuc2lnbmVkIGludCBwcmV2X21sZWFrX3N6ID0gMDsKKwkJdW5zaWduZWQgaW50IG1sZWFrX2NudCA9IDA7CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTGlzdCBpcyBub3QgRW1wdHkuIGxpc3RTaXplICVkICIsCisJCQkgIF9fZnVuY19fLCAoaW50KWxpc3RTaXplKTsKKworCQlkbyB7CisJCQljZGZfc3Bpbl9sb2NrKCZjZGZfbWVtX2xpc3RfbG9jayk7CisJCQljZGZfc3RhdHVzID0KKwkJCQljZGZfbGlzdF9yZW1vdmVfZnJvbnQoJmNkZl9tZW1fbGlzdCwgJnBOb2RlKTsKKwkJCWNkZl9zcGluX3VubG9jaygmY2RmX21lbV9saXN0X2xvY2spOworCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfc3RhdHVzKSB7CisJCQkJbWVtU3RydWN0ID0gKHN0cnVjdCBzX2NkZl9tZW1fc3RydWN0ICopcE5vZGU7CisJCQkJLyogVGFrZSBjYXJlIHRvIGxvZyBvbmx5IG9uY2UgbXVsdGlwbGUgbWVtb3J5CisJCQkJICAgbGVha3MgZnJvbSB0aGUgc2FtZSBwbGFjZSAqLworCQkJCWlmIChzdHJjbXAocHJldl9tbGVha19maWxlLCBtZW1TdHJ1Y3QtPmZpbGVOYW1lKQorCQkJCSAgICB8fCAocHJldl9tbGVha19saW5lTnVtICE9CisJCQkJCW1lbVN0cnVjdC0+bGluZU51bSkKKwkJCQkgICAgfHwgKHByZXZfbWxlYWtfc3ogIT0gbWVtU3RydWN0LT5zaXplKSkgeworCQkJCQlpZiAobWxlYWtfY250ICE9IDApIHsKKwkJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwKKwkJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCQkJCQkgICIlZCBUaW1lIE1lbW9yeSBMZWFrQCBGaWxlICVzLCBATGluZSAlZCwgc2l6ZSAlZCIsCisJCQkJCQkJICBtbGVha19jbnQsCisJCQkJCQkJICBwcmV2X21sZWFrX2ZpbGUsCisJCQkJCQkJICBwcmV2X21sZWFrX2xpbmVOdW0sCisJCQkJCQkJICBwcmV2X21sZWFrX3N6KTsKKwkJCQkJfQorCQkJCQlwcmV2X21sZWFrX2ZpbGUgPSBtZW1TdHJ1Y3QtPmZpbGVOYW1lOworCQkJCQlwcmV2X21sZWFrX2xpbmVOdW0gPSBtZW1TdHJ1Y3QtPmxpbmVOdW07CisJCQkJCXByZXZfbWxlYWtfc3ogPSBtZW1TdHJ1Y3QtPnNpemU7CisJCQkJCW1sZWFrX2NudCA9IDA7CisJCQkJfQorCQkJCW1sZWFrX2NudCsrOworCQkJCWtmcmVlKCh2b2lkICopbWVtU3RydWN0KTsKKwkJCX0KKwkJfSB3aGlsZSAoY2RmX3N0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpOworCisJCS8qIFByaW50IGxhc3QgbWVtb3J5IGxlYWsgZnJvbSB0aGUgbW9kdWxlICovCisJCWlmIChtbGVha19jbnQpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCSAgIiVkIFRpbWUgbWVtb3J5IExlYWtAIEZpbGUgJXMsIEBMaW5lICVkLCBzaXplICVkIiwKKwkJCQkgIG1sZWFrX2NudCwgcHJldl9tbGVha19maWxlLAorCQkJCSAgcHJldl9tbGVha19saW5lTnVtLCBwcmV2X21sZWFrX3N6KTsKKwkJfQorI2lmZGVmIENPTkZJR19IQUxUX0tNRU1MRUFLCisJCUJVR19PTigwKTsKKyNlbmRpZgorCX0KK30KKworLyoqCisgKiBjZGZfbWVtX2V4aXQoKSAtIGV4aXQgY2RmIG1lbW9yeSBkZWJ1ZyBmdW5jdGlvbmFsaXR5CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RmX21lbV9leGl0KHZvaWQpCit7CisJY2RmX25ldF9idWZfZGVidWdfZXhpdCgpOworCWNkZl9tZW1fY2xlYW4oKTsKKwljZGZfbGlzdF9kZXN0cm95KCZjZGZfbWVtX2xpc3QpOworfQorCisvKioKKyAqIGNkZl9tZW1fbWFsbG9jX2RlYnVnKCkgLSBkZWJ1ZyB2ZXJzaW9uIG9mIENERiBtZW1vcnkgYWxsb2NhdGlvbiBBUEkKKyAqIEBzaXplOiBOdW1iZXIgb2YgYnl0ZXMgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgorICogQGZpbGVOYW1lOiBGaWxlIG5hbWUgZnJvbSB3aGljaCBtZW1vcnkgYWxsb2NhdGlvbiBpcyBjYWxsZWQKKyAqIEBsaW5lTnVtOiBMaW5lIG51bWJlciBmcm9tIHdoaWNoIG1lbW9yeSBhbGxvY2F0aW9uIGlzIGNhbGxlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkeW5hbWljYWxsbHkgYWxsb2NhdGUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgb2YKKyAqIG1lbW9yeSBhbmQgYWQgaXQgaW4gY2RmIHRyYWNraW5nIGxpc3QgdG8gY2hlY2sgYWdhaW5zdCBtZW1vcnkgbGVha3MgYW5kCisgKiBjb3JydXB0aW9ucworICoKKyAqCisgKiBSZXR1cm46CisgKiAgICAgIFVwb24gc3VjY2Vzc2Z1bCBhbGxvY2F0ZSwgcmV0dXJucyBhIG5vbi1OVUxMIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZAorICogICAgICBtZW1vcnkuICBJZiB0aGlzIGZ1bmN0aW9uIGlzIHVuYWJsZSB0byBhbGxvY2F0ZSB0aGUgYW1vdW50IG9mIG1lbW9yeQorICogICAgICBzcGVjaWZpZWQgKGZvciBhbnkgcmVhc29uKSBpdCByZXR1cm5zICVOVUxMLgorICoKKyAqLwordm9pZCAqY2RmX21lbV9tYWxsb2NfZGVidWcoc2l6ZV90IHNpemUsIGNoYXIgKmZpbGVOYW1lLCB1aW50MzJfdCBsaW5lTnVtKQoreworCXN0cnVjdCBzX2NkZl9tZW1fc3RydWN0ICptZW1TdHJ1Y3Q7CisJdm9pZCAqbWVtUHRyID0gTlVMTDsKKwl1aW50MzJfdCBuZXdfc2l6ZTsKKwlpbnQgZmxhZ3MgPSBHRlBfS0VSTkVMOworCisJaWYgKHNpemUgPiAoMTAyNCAqIDEwMjQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGNhbGxlZCB3aXRoIGFyZyA+IDEwMjRLOyBwYXNzZWQgaW4gJXp1ICEhISIsCisJCQkgIF9fZnVuY19fLCBzaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ05TUykgJiYgZGVmaW5lZChDT05GSUdfV0NOU1NfTUVNX1BSRV9BTExPQykKKwlpZiAoc2l6ZSA+IFdDTlNTX1BSRV9BTExPQ19HRVRfVEhSRVNIT0xEKSB7CisJCXZvaWQgKnBtZW07CisJCXBtZW0gPSB3Y25zc19wcmVhbGxvY19nZXQoc2l6ZSk7CisJCWlmIChOVUxMICE9IHBtZW0pIHsKKwkJCW1lbXNldChwbWVtLCAwLCBzaXplKTsKKwkJCXJldHVybiBwbWVtOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoaW5faW50ZXJydXB0KCkgfHwgaXJxc19kaXNhYmxlZCgpIHx8IGluX2F0b21pYygpKQorCQlmbGFncyA9IEdGUF9BVE9NSUM7CisKKwluZXdfc2l6ZSA9IHNpemUgKyBzaXplb2Yoc3RydWN0IHNfY2RmX21lbV9zdHJ1Y3QpICsgODsKKworCW1lbVN0cnVjdCA9IChzdHJ1Y3Qgc19jZGZfbWVtX3N0cnVjdCAqKWt6YWxsb2MobmV3X3NpemUsIGZsYWdzKTsKKworCWlmIChtZW1TdHJ1Y3QgIT0gTlVMTCkgeworCQlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisKKwkJbWVtU3RydWN0LT5maWxlTmFtZSA9IGZpbGVOYW1lOworCQltZW1TdHJ1Y3QtPmxpbmVOdW0gPSBsaW5lTnVtOworCQltZW1TdHJ1Y3QtPnNpemUgPSBzaXplOworCisJCWNkZl9tZW1fY29weSgmbWVtU3RydWN0LT5oZWFkZXJbMF0sCisJCQkgICAgICZXTEFOX01FTV9IRUFERVJbMF0sIHNpemVvZihXTEFOX01FTV9IRUFERVIpKTsKKworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgKG1lbVN0cnVjdCArIDEpICsgc2l6ZSwKKwkJCSAgICAgJldMQU5fTUVNX1RBSUxbMF0sIHNpemVvZihXTEFOX01FTV9UQUlMKSk7CisKKwkJY2RmX3NwaW5fbG9ja19pcnFzYXZlKCZjZGZfbWVtX2xpc3RfbG9jayk7CisJCWNkZl9zdGF0dXMgPSBjZGZfbGlzdF9pbnNlcnRfZnJvbnQoJmNkZl9tZW1fbGlzdCwKKwkJCQkJCSAgICZtZW1TdHJ1Y3QtPnBOb2RlKTsKKwkJY2RmX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNkZl9tZW1fbGlzdF9sb2NrKTsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfc3RhdHVzKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogVW5hYmxlIHRvIGluc2VydCBub2RlIGludG8gTGlzdCBjZGZfc3RhdHVzICVkIiwKKwkJCQkgIF9fZnVuY19fLCBjZGZfc3RhdHVzKTsKKwkJfQorCisJCW1lbVB0ciA9ICh2b2lkICopKG1lbVN0cnVjdCArIDEpOworCX0KKwlyZXR1cm4gbWVtUHRyOworfQorCisvKioKKyAqICBjZGZfbWVtX2ZyZWUoKSAtIGRlYnVnIHZlcnNpb24gb2YgQ0RGIG1lbW9yeSBmcmVlIEFQSQorICogIEBwdHI6IFBvaW50ZXIgdG8gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBiZSBmcmVlJ2QuCisgKgorICogIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSAncHRyJy4gSXQgYWxzbyBjaGVja3MKKyAqICBpcyBtZW1vcnkgaXMgY29ycnVwdGVkIG9yIGdldHRpbmcgZG91YmxlIGZyZWVkIGFuZCBwYW5pYy4KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgTm90aGluZworICovCit2b2lkIGNkZl9tZW1fZnJlZSh2b2lkICpwdHIpCit7CisJaWYgKHB0ciAhPSBOVUxMKSB7CisJCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwkJc3RydWN0IHNfY2RmX21lbV9zdHJ1Y3QgKm1lbVN0cnVjdCA9CisJCQkoKHN0cnVjdCBzX2NkZl9tZW1fc3RydWN0ICopcHRyKSAtIDE7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTlNTKSAmJiBkZWZpbmVkKENPTkZJR19XQ05TU19NRU1fUFJFX0FMTE9DKQorCQlpZiAod2Nuc3NfcHJlYWxsb2NfcHV0KHB0cikpCisJCQlyZXR1cm47CisjZW5kaWYKKworCQljZGZfc3Bpbl9sb2NrX2lycXNhdmUoJmNkZl9tZW1fbGlzdF9sb2NrKTsKKwkJY2RmX3N0YXR1cyA9CisJCQljZGZfbGlzdF9yZW1vdmVfbm9kZSgmY2RmX21lbV9saXN0LCAmbWVtU3RydWN0LT5wTm9kZSk7CisJCWNkZl9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjZGZfbWVtX2xpc3RfbG9jayk7CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfc3RhdHVzKSB7CisJCQlpZiAoMCA9PSBjZGZfbWVtX2NvbXBhcmUobWVtU3RydWN0LT5oZWFkZXIsCisJCQkJCQkgJldMQU5fTUVNX0hFQURFUlswXSwKKwkJCQkJCSBzaXplb2YoV0xBTl9NRU1fSEVBREVSKSkpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCQkgICJNZW1vcnkgSGVhZGVyIGlzIGNvcnJ1cHRlZC4gTWVtSW5mbzogRmlsZW5hbWUgJXMsIExpbmVOdW0gJWQiLAorCQkJCQkgIG1lbVN0cnVjdC0+ZmlsZU5hbWUsCisJCQkJCSAgKGludCltZW1TdHJ1Y3QtPmxpbmVOdW0pOworCQkJCUNERl9CVUcoMCk7CisJCQl9CisJCQlpZiAoMCA9PQorCQkJICAgIGNkZl9tZW1fY29tcGFyZSgodWludDhfdCAqKSBwdHIgKyBtZW1TdHJ1Y3QtPnNpemUsCisJCQkJCSAgICAmV0xBTl9NRU1fVEFJTFswXSwKKwkJCQkJICAgIHNpemVvZihXTEFOX01FTV9UQUlMKSkpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCQkgICJNZW1vcnkgVHJhaWxlciBpcyBjb3JydXB0ZWQuIE1lbUluZm86IEZpbGVuYW1lICVzLCBMaW5lTnVtICVkIiwKKwkJCQkJICBtZW1TdHJ1Y3QtPmZpbGVOYW1lLAorCQkJCQkgIChpbnQpbWVtU3RydWN0LT5saW5lTnVtKTsKKwkJCQlDREZfQlVHKDApOworCQkJfQorCQkJa2ZyZWUoKHZvaWQgKiltZW1TdHJ1Y3QpOworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkJICAiJXM6IFVuYWxsb2NhdGVkIG1lbW9yeSAoZG91YmxlIGZyZWU/KSIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlDREZfQlVHKDApOworCQl9CisJfQorfQorI2Vsc2UKKy8qKgorICogY2RmX21lbV9tYWxsb2MoKSAtIGFsbG9jYXRpb24gQ0RGIG1lbW9yeQorICogQHNpemU6IE51bWJlciBvZiBieXRlcyBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR5bmFtaWNhbGxseSBhbGxvY2F0ZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBvZgorICogbWVtb3J5LgorICoKKyAqCisgKiBSZXR1cm46CisgKglVcG9uIHN1Y2Nlc3NmdWwgYWxsb2NhdGUsIHJldHVybnMgYSBub24tTlVMTCBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQKKyAqCW1lbW9yeS4gIElmIHRoaXMgZnVuY3Rpb24gaXMgdW5hYmxlIHRvIGFsbG9jYXRlIHRoZSBhbW91bnQgb2YgbWVtb3J5CisgKglzcGVjaWZpZWQgKGZvciBhbnkgcmVhc29uKSBpdCByZXR1cm5zICVOVUxMLgorICoKKyAqLwordm9pZCAqY2RmX21lbV9tYWxsb2Moc2l6ZV90IHNpemUpCit7CisJaW50IGZsYWdzID0gR0ZQX0tFUk5FTDsKKyNpZmRlZiBDT05GSUdfV0NOU1NfTUVNX1BSRV9BTExPQworCXZvaWQgKnBtZW07CisjZW5kaWYKKwlpZiAoc2l6ZSA+ICgxMDI0ICogMTAyNCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogY2FsbGVkIHdpdGggYXJnID4gMTAyNEs7IHBhc3NlZCBpbiAlenUgISEiLAorCQkJICBfX2Z1bmNfXywgc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX0NOU1MpICYmIGRlZmluZWQoQ09ORklHX1dDTlNTX01FTV9QUkVfQUxMT0MpCisJaWYgKHNpemUgPiBXQ05TU19QUkVfQUxMT0NfR0VUX1RIUkVTSE9MRCkgeworCQlwbWVtID0gd2Nuc3NfcHJlYWxsb2NfZ2V0KHNpemUpOworCQlpZiAoTlVMTCAhPSBwbWVtKSB7CisJCQltZW1zZXQocG1lbSwgMCwgc2l6ZSk7CisJCQlyZXR1cm4gcG1lbTsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKGluX2ludGVycnVwdCgpIHx8IGlycXNfZGlzYWJsZWQoKSB8fCBpbl9hdG9taWMoKSkKKwkJZmxhZ3MgPSBHRlBfQVRPTUlDOworCisJcmV0dXJuIGt6YWxsb2Moc2l6ZSwgZmxhZ3MpOworfQorCisvKioKKyAqIGNkZl9tZW1fZnJlZSgpIC0gZnJlZSBDREYgbWVtb3J5CisgKiBAcHRyOiBQb2ludGVyIHRvIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgdG8gYmUgZnJlZSdkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSAncHRyJy4KKyAqCisgKiBSZXR1cm46CisgKglOb3RoaW5nCisgKgorICovCit2b2lkIGNkZl9tZW1fZnJlZSh2b2lkICpwdHIpCit7CisJaWYgKHB0ciA9PSBOVUxMKQorCQlyZXR1cm47CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTlNTKSAmJiBkZWZpbmVkKENPTkZJR19XQ05TU19NRU1fUFJFX0FMTE9DKQorCWlmICh3Y25zc19wcmVhbGxvY19wdXQocHRyKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlrZnJlZShwdHIpOworfQorI2VuZGlmCisKKy8qKgorICogY2RmX21lbV9zZXQoKSAtIHNldCAoZmlsbCkgbWVtb3J5IHdpdGggYSBzcGVjaWZpZWQgYnl0ZSB2YWx1ZS4KKyAqIEBwTWVtb3J5OiAgICBQb2ludGVyIHRvIG1lbW9yeSB0aGF0IHdpbGwgYmUgc2V0CisgKiBAbnVtQnl0ZXM6ICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHNldAorICogQHZhbHVlOiAgICAgIEJ5dGUgc2V0IGluIG1lbW9yeQorICoKKyAqIFJldHVybjoKKyAqICAgIE5vdGhpbmcKKyAqCisgKi8KK3ZvaWQgY2RmX21lbV9zZXQodm9pZCAqcHRyLCB1aW50MzJfdCBudW1CeXRlcywgdWludDMyX3QgdmFsdWUpCit7CisJaWYgKHB0ciA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMgY2FsbGVkIHdpdGggTlVMTCBwYXJhbWV0ZXIgcHRyIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCW1lbXNldChwdHIsIHZhbHVlLCBudW1CeXRlcyk7Cit9CisKKy8qKgorICogY2RmX21lbV96ZXJvKCkgLSB6ZXJvIG91dCBtZW1vcnkKKyAqIEBwTWVtb3J5OiAgICBwb2ludGVyIHRvIG1lbW9yeSB0aGF0IHdpbGwgYmUgc2V0IHRvIHplcm8KKyAqIEBudW1CeXRlczogICBudW1iZXIgb2YgYnl0ZXMgemVybworICogQHZhbHVlOiAgICAgIGJ5dGUgc2V0IGluIG1lbW9yeQorICoKKyAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIG1lbW9yeSBsb2NhdGlvbiB0byBhbGwgemVyb3MsIGVzc2VudGlhbGx5IGNsZWFyaW5nCisgKiAgdGhlIG1lbW9yeS4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgIE5vdGhpbmcKKyAqCisgKi8KK3ZvaWQgY2RmX21lbV96ZXJvKHZvaWQgKnB0ciwgdWludDMyX3QgbnVtQnl0ZXMpCit7CisJaWYgKDAgPT0gbnVtQnl0ZXMpIHsKKwkJLyogc3BlY2lhbCBjYXNlIHdoZXJlIHB0ciBjYW4gYmUgTlVMTCAqLworCQlyZXR1cm47CisJfQorCisJaWYgKHB0ciA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMgY2FsbGVkIHdpdGggTlVMTCBwYXJhbWV0ZXIgcHRyIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCW1lbXNldChwdHIsIDAsIG51bUJ5dGVzKTsKK30KKworLyoqCisgKiBjZGZfbWVtX2NvcHkoKSAtIGNvcHkgbWVtb3J5CisgKiBAcERzdDogICAgICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbiBtZW1vcnkgbG9jYXRpb24gKHRvIGNvcHkgdG8pCisgKiBAcFNyYzogICAgICAgUG9pbnRlciB0byBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uICh0byBjb3B5IGZyb20pCisgKiBAbnVtQnl0ZXM6ICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKgorICogQ29weSBob3N0IG1lbW9yeSBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyLCBzaW1pbGFyIHRvIG1lbWNweSBpbgorICogc3RhbmRhcmQgQy4gIE5vdGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlIG92ZXJsYXBwaW5nCisgKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1lbW9yeSBsb2NhdGlvbnMuICBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aAorICogb3ZlcmxhcHBpbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtZW1vcnkgbG9jYXRpb25zIHdpbGwgcmVzdWx0IGluCisgKiB1bnByZWRpY3RhYmxlIHJlc3VsdHMuICBVc2UgY2RmX21lbV9tb3ZlKCkgaWYgdGhlIG1lbW9yeSBsb2NhdGlvbnMKKyAqIGZvciB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgb3ZlcmxhcHBpbmcgKG9yIGNvdWxkIGJlIG92ZXJsYXBwaW5nISkKKyAqCisgKiBSZXR1cm46CisgKiAgICBOb3RoaW5nCisgKgorICovCit2b2lkIGNkZl9tZW1fY29weSh2b2lkICpwRHN0LCBjb25zdCB2b2lkICpwU3JjLCB1aW50MzJfdCBudW1CeXRlcykKK3sKKwlpZiAoMCA9PSBudW1CeXRlcykgeworCQkvKiBzcGVjaWFsIGNhc2Ugd2hlcmUgcERzdCBvciBwU3JjIGNhbiBiZSBOVUxMICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoKHBEc3QgPT0gTlVMTCkgfHwgKHBTcmMgPT0gTlVMTCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlcyBjYWxsZWQgd2l0aCBOVUxMIHBhcmFtZXRlciwgc291cmNlOiVwIGRlc3RpbmF0aW9uOiVwIiwKKwkJCSAgX19mdW5jX18sIHBTcmMsIHBEc3QpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm47CisJfQorCW1lbWNweShwRHN0LCBwU3JjLCBudW1CeXRlcyk7Cit9CisKKy8qKgorICogY2RmX21lbV9tb3ZlKCkgLSBtb3ZlIG1lbW9yeQorICogQHBEc3Q6ICAgICAgIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gbWVtb3J5IGxvY2F0aW9uICh0byBtb3ZlIHRvKQorICogQHBTcmM6ICAgICAgIHBvaW50ZXIgdG8gc291cmNlIG1lbW9yeSBsb2NhdGlvbiAodG8gbW92ZSBmcm9tKQorICogQG51bUJ5dGVzOiAgIG51bWJlciBvZiBieXRlcyB0byBtb3ZlLgorICoKKyAqIE1vdmUgaG9zdCBtZW1vcnkgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5vdGhlciwgc2ltaWxhciB0byBtZW1tb3ZlIGluCisgKiBzdGFuZGFyZCBDLiAgTm90ZSB0aGlzIGZ1bmN0aW9uICpkb2VzKiBoYW5kbGUgb3ZlcmxhcHBpbmcKKyAqIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWVtb3J5IGxvY2F0aW9ucy4KKworICogUmV0dXJuOgorICogICAgICBOb3RoaW5nCisgKi8KK3ZvaWQgY2RmX21lbV9tb3ZlKHZvaWQgKnBEc3QsIGNvbnN0IHZvaWQgKnBTcmMsIHVpbnQzMl90IG51bUJ5dGVzKQoreworCWlmICgwID09IG51bUJ5dGVzKSB7CisJCS8qIHNwZWNpYWwgY2FzZSB3aGVyZSBwRHN0IG9yIHBTcmMgY2FuIGJlIE5VTEwgKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgocERzdCA9PSBOVUxMKSB8fCAocFNyYyA9PSBOVUxMKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzIGNhbGxlZCB3aXRoIE5VTEwgcGFyYW1ldGVyLCBzb3VyY2U6JXAgZGVzdGluYXRpb246JXAiLAorCQkJICBfX2Z1bmNfXywgcFNyYywgcERzdCk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybjsKKwl9CisJbWVtbW92ZShwRHN0LCBwU3JjLCBudW1CeXRlcyk7Cit9CisKKy8qKgorICogY2RmX21lbV9jb21wYXJlKCkgLSBtZW1vcnkgY29tcGFyZQorICogQHBNZW1vcnkxOiAgIHBvaW50ZXIgdG8gb25lIGxvY2F0aW9uIGluIG1lbW9yeSB0byBjb21wYXJlLgorICogQHBNZW1vcnkyOiAgIHBvaW50ZXIgdG8gc2Vjb25kIGxvY2F0aW9uIGluIG1lbW9yeSB0byBjb21wYXJlLgorICogQG51bUJ5dGVzOiAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZS4KKyAqCisgKiBGdW5jdGlvbiB0byBjb21wYXJlIHR3byBwaWVjZXMgb2YgbWVtb3J5LCBzaW1pbGFyIHRvIG1lbWNtcCBmdW5jdGlvbgorICogaW4gc3RhbmRhcmQgQy4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgIGJvb2wgLSByZXR1cm5zIGEgYm9vbCB2YWx1ZSB0aGF0IHRlbGxzIGlmIHRoZSBtZW1vcnkgbG9jYXRpb25zCisgKiAgICAgIGFyZSBlcXVhbCBvciBub3QgZXF1YWwuCisgKgorICovCitib29sIGNkZl9tZW1fY29tcGFyZShjb25zdCB2b2lkICpwTWVtb3J5MSwgY29uc3Qgdm9pZCAqcE1lbW9yeTIsCisJCSAgICAgdWludDMyX3QgbnVtQnl0ZXMpCit7CisJaWYgKDAgPT0gbnVtQnl0ZXMpIHsKKwkJLyogc3BlY2lhbCBjYXNlIHdoZXJlIHBNZW1vcnkxIG9yIHBNZW1vcnkyIGNhbiBiZSBOVUxMICovCisJCXJldHVybiB0cnVlOworCX0KKworCWlmICgocE1lbW9yeTEgPT0gTlVMTCkgfHwgKHBNZW1vcnkyID09IE5VTEwpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMgY2FsbGVkIHdpdGggTlVMTCBwYXJhbWV0ZXIsIHAxOiVwIHAyOiVwIiwKKwkJCSAgX19mdW5jX18sIHBNZW1vcnkxLCBwTWVtb3J5Mik7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIG1lbWNtcChwTWVtb3J5MSwgcE1lbW9yeTIsIG51bUJ5dGVzKSA/IGZhbHNlIDogdHJ1ZTsKK30KKworLyoqCisgKiBjZGZfbWVtX2NvbXBhcmUyKCkgLSBtZW1vcnkgY29tcGFyZQorICogQHBNZW1vcnkxOiBwb2ludGVyIHRvIG9uZSBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gY29tcGFyZS4KKyAqIEBwTWVtb3J5MjogICBwb2ludGVyIHRvIHNlY29uZCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gY29tcGFyZS4KKyAqIEBudW1CeXRlczogICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUuCisgKgorICogRnVuY3Rpb24gdG8gY29tcGFyZSB0d28gcGllY2VzIG9mIG1lbW9yeSwgc2ltaWxhciB0byBtZW1jbXAgZnVuY3Rpb24KKyAqIGluIHN0YW5kYXJkIEMuCisgKiBSZXR1cm46CisgKiAgICAgICBpbnQzMl90IC0gcmV0dXJucyBhIGJvb2wgdmFsdWUgdGhhdCB0ZWxscyBpZiB0aGUgbWVtb3J5CisgKiAgICAgICBsb2NhdGlvbnMgYXJlIGVxdWFsIG9yIG5vdCBlcXVhbC4KKyAqICAgICAgIDAgLS0gZXF1YWwKKyAqICAgICAgIDwgMCAtLSAqcE1lbW9yeTEgaXMgbGVzcyB0aGFuICpwTWVtb3J5MgorICogICAgICAgPiAwIC0tICpwTWVtb3J5MSBpcyBiaWdnZXIgdGhhbiAqcE1lbW9yeTIKKyAqLworaW50MzJfdCBjZGZfbWVtX2NvbXBhcmUyKGNvbnN0IHZvaWQgKnBNZW1vcnkxLCBjb25zdCB2b2lkICpwTWVtb3J5MiwKKwkJCSB1aW50MzJfdCBudW1CeXRlcykKK3sKKwlyZXR1cm4gKGludDMyX3QpIG1lbWNtcChwTWVtb3J5MSwgcE1lbW9yeTIsIG51bUJ5dGVzKTsKK30KKworLyoqCisgKiBjZGZfb3NfbWVtX2FsbG9jX2NvbnNpc3RlbnQoKSAtIGFsbG9jYXRlcyBjb25zaXN0ZW50IGNkZiBtZW1vcnkKKyAqIEBvc2RldjogT1MgZGV2aWNlIGhhbmRsZQorICogQHNpemU6IFNpemUgdG8gYmUgYWxsb2NhdGVkCisgKiBAcGFkZHI6IFBoeXNpY2FsIGFkZHJlc3MKKyAqIEBtY3R4OiBQb2ludGVyIHRvIERNQSBjb250ZXh0CisgKgorICogUmV0dXJuOiBwb2ludGVyIG9mIGFsbG9jYXRlZCBtZW1vcnkgb3IgbnVsbCBpZiBtZW1vcnkgYWxsb2MgZmFpbHMKKyAqLworaW5saW5lIHZvaWQgKmNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudChjZGZfZGV2aWNlX3Qgb3NkZXYsIGNkZl9zaXplX3Qgc2l6ZSwKKwkJCQkJIGNkZl9kbWFfYWRkcl90ICpwYWRkciwKKwkJCQkJIGNkZl9kbWFfY29udGV4dF90IG1lbWN0eCkKK3sKKyNpZiBkZWZpbmVkKEFfU0lNT1NfREVWSE9TVCkKKwlzdGF0aWMgaW50IGZpcnN0ID0gMTsKKwl2b2lkICp2YWRkcjsKKworCWlmIChmaXJzdCkgeworCQlmaXJzdCA9IDA7CisJCXByX2VycigiV2FybmluZzogYnlwYXNzaW5nICVzXG4iLCBfX2Z1bmNfXyk7CisJfQorCXZhZGRyID0gY2RmX21lbV9tYWxsb2Moc2l6ZSk7CisJKnBhZGRyID0gKChjZGZfZG1hX2FkZHJfdCkgdmFkZHIpOworCXJldHVybiB2YWRkcjsKKyNlbHNlCisJaW50IGZsYWdzID0gR0ZQX0tFUk5FTDsKKwl2b2lkICphbGxvY19tZW0gPSBOVUxMOworCisJaWYgKGluX2ludGVycnVwdCgpIHx8IGlycXNfZGlzYWJsZWQoKSB8fCBpbl9hdG9taWMoKSkKKwkJZmxhZ3MgPSBHRlBfQVRPTUlDOworCisJYWxsb2NfbWVtID0gZG1hX2FsbG9jX2NvaGVyZW50KG9zZGV2LT5kZXYsIHNpemUsIHBhZGRyLCBmbGFncyk7CisJaWYgKGFsbG9jX21lbSA9PSBOVUxMKQorCQlwcl9lcnIoIiVzIFdhcm5pbmc6IHVuYWJsZSB0byBhbGxvYyBjb25zaXN0ZW50IG1lbW9yeSBvZiBzaXplICV6dSFcbiIsCisJCQlfX2Z1bmNfXywgc2l6ZSk7CisJcmV0dXJuIGFsbG9jX21lbTsKKyNlbmRpZgorfQorCisvKioKKyAqIGNkZl9vc19tZW1fZnJlZV9jb25zaXN0ZW50KCkgLSBmcmVlIGNvbnNpc3RlbnQgY2RmIG1lbW9yeQorICogQG9zZGV2OiBPUyBkZXZpY2UgaGFuZGxlCisgKiBAc2l6ZTogU2l6ZSB0byBiZSBhbGxvY2F0ZWQKKyAqIEBwYWRkcjogUGh5c2ljYWwgYWRkcmVzcworICogQG1jdHg6IFBvaW50ZXIgdG8gRE1BIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworaW5saW5lIHZvaWQKK2NkZl9vc19tZW1fZnJlZV9jb25zaXN0ZW50KGNkZl9kZXZpY2VfdCBvc2RldiwKKwkJCSAgIGNkZl9zaXplX3Qgc2l6ZSwKKwkJCSAgIHZvaWQgKnZhZGRyLAorCQkJICAgY2RmX2RtYV9hZGRyX3QgcGFkZHIsIGNkZl9kbWFfY29udGV4dF90IG1lbWN0eCkKK3sKKyNpZiBkZWZpbmVkKEFfU0lNT1NfREVWSE9TVCkKKwlzdGF0aWMgaW50IGZpcnN0ID0gMTsKKworCWlmIChmaXJzdCkgeworCQlmaXJzdCA9IDA7CisJCXByX2VycigiV2FybmluZzogYnlwYXNzaW5nICVzXG4iLCBfX2Z1bmNfXyk7CisJfQorCWNkZl9tZW1fZnJlZSh2YWRkcik7CisJcmV0dXJuOworI2Vsc2UKKwlkbWFfZnJlZV9jb2hlcmVudChvc2Rldi0+ZGV2LCBzaXplLCB2YWRkciwgcGFkZHIpOworI2VuZGlmCit9CisKKworLyoqCisgKiBjZGZfb3NfbWVtX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKCkgLSBhc3NpZ24gbWVtb3J5IHRvIGRldmljZQorICogQG9zZGV2OiBPUyBkZXZpY2UgaGFuZGxlCisgKiBAYnVzX2FkZHI6IGRtYSBhZGRyZXNzIHRvIGdpdmUgdG8gdGhlIGRldmljZQorICogQHNpemU6IFNpemUgb2YgdGhlIG1lbW9yeSBibG9jaworICogQGRpcmVjdGlvbjogZGlyZWN0aW9uIGRhdGEgd2lsbCBiZSBkbWEnZWQKKyAqCisgKiBBc3NnaW4gbWVtb3J5IHRvIHRoZSByZW1vdGUgZGV2aWNlLgorICogVGhlIGNhY2hlIGxpbmVzIGFyZSBmbHVzaGVkIHRvIHJhbSBvciBpbnZhbGlkYXRlZCBhcyBuZWVkZWQuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KKworaW5saW5lIHZvaWQKK2NkZl9vc19tZW1fZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoY2RmX2RldmljZV90IG9zZGV2LAorCQkJCSAgICAgIGNkZl9kbWFfYWRkcl90IGJ1c19hZGRyLAorCQkJCSAgICAgIGNkZl9zaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uob3NkZXYtPmRldiwgYnVzX2FkZHIsICBzaXplLCBkaXJlY3Rpb24pOworfQpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvc3JjL2NkZl9uYnVmLmMgYi9jb3JlL2NkZi9zcmMvY2RmX25idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJmZjJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZGYvc3JjL2NkZl9uYnVmLmMKQEAgLTAsMCArMSwxMDE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogY2RmX25idWYuYworICoKKyAqIENvbm5lY3Rpdml0eSBkcml2ZXIgZnJhbWV3b3JrKENERikgbmV0d29yayBidWZmZXIgbWFuYWdlbWVudCBBUElzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPgorI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4KKyNpbmNsdWRlIDxjZGZfdHJhY2UuaD4KKyNpbmNsdWRlIDxjZGZfc3RhdHVzLmg+CisjaW5jbHVkZSA8Y2RmX2xvY2suaD4KKworI2lmIGRlZmluZWQoRkVBVFVSRV9UU08pCisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjZW5kaWYgLyogRkVBVFVSRV9UU08gKi8KKworLyogUGFja2V0IENvdW50ZXIgKi8KK3N0YXRpYyB1aW50MzJfdCBuYnVmX3R4X21nbXRbTkJVRl9UWF9QS1RfU1RBVEVfTUFYXTsKK3N0YXRpYyB1aW50MzJfdCBuYnVmX3R4X2RhdGFbTkJVRl9UWF9QS1RfU1RBVEVfTUFYXTsKKworLyoqCisgKiBjZGZfbmJ1Zl90eF9kZXNjX2NvdW50X2Rpc3BsYXkoKSAtIERpc3BsYXlzIHRoZSBwYWNrZXQgY291bnRlcgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNkZl9uYnVmX3R4X2Rlc2NfY291bnRfZGlzcGxheSh2b2lkKQoreworCWNkZl9wcmludCgiQ3VycmVudCBTbmFwc2hvdCBvZiB0aGUgRHJpdmVyOlxuIik7CisJY2RmX3ByaW50KCJEYXRhIFBhY2tldHM6XG4iKTsKKwljZGZfcHJpbnQoIkhERCAlZCBUWFJYX1EgJWQgVFhSWCAlZCBIVFQgJWQiLAorCQluYnVmX3R4X2RhdGFbTkJVRl9UWF9QS1RfSEREXSAtCisJCShuYnVmX3R4X2RhdGFbTkJVRl9UWF9QS1RfVFhSWF0gKworCQluYnVmX3R4X2RhdGFbTkJVRl9UWF9QS1RfVFhSWF9FTlFVRVVFXSAtCisJCW5idWZfdHhfZGF0YVtOQlVGX1RYX1BLVF9UWFJYX0RFUVVFVUVdKSwKKwkJbmJ1Zl90eF9kYXRhW05CVUZfVFhfUEtUX1RYUlhfRU5RVUVVRV0gLQorCQluYnVmX3R4X2RhdGFbTkJVRl9UWF9QS1RfVFhSWF9ERVFVRVVFXSwKKwkJbmJ1Zl90eF9kYXRhW05CVUZfVFhfUEtUX1RYUlhdIC0gbmJ1Zl90eF9kYXRhW05CVUZfVFhfUEtUX0hUVF0sCisJCW5idWZfdHhfZGF0YVtOQlVGX1RYX1BLVF9IVFRdICAtIG5idWZfdHhfZGF0YVtOQlVGX1RYX1BLVF9IVENdKTsKKwljZGZfcHJpbnQoIiBIVEMgJWQgIEhJRiAlZCBDRSAlZCBUWF9DT01QICVkXG4iLAorCQluYnVmX3R4X2RhdGFbTkJVRl9UWF9QS1RfSFRDXSAgLSBuYnVmX3R4X2RhdGFbTkJVRl9UWF9QS1RfSElGXSwKKwkJbmJ1Zl90eF9kYXRhW05CVUZfVFhfUEtUX0hJRl0gIC0gbmJ1Zl90eF9kYXRhW05CVUZfVFhfUEtUX0NFXSwKKwkJbmJ1Zl90eF9kYXRhW05CVUZfVFhfUEtUX0NFXSAgIC0gbmJ1Zl90eF9kYXRhW05CVUZfVFhfUEtUX0ZSRUVdLAorCQluYnVmX3R4X2RhdGFbTkJVRl9UWF9QS1RfRlJFRV0pOworCWNkZl9wcmludCgiTWdtdCBQYWNrZXRzOlxuIik7CisJY2RmX3ByaW50KCJUWFJYX1EgJWQgVFhSWCAlZCBIVFQgJWQgSFRDICVkIEhJRiAlZCBDRSAlZCBUWF9DT01QICVkXG4iLAorCQluYnVmX3R4X21nbXRbTkJVRl9UWF9QS1RfVFhSWF9FTlFVRVVFXSAtCisJCW5idWZfdHhfbWdtdFtOQlVGX1RYX1BLVF9UWFJYX0RFUVVFVUVdLAorCQluYnVmX3R4X21nbXRbTkJVRl9UWF9QS1RfVFhSWF0gLSBuYnVmX3R4X21nbXRbTkJVRl9UWF9QS1RfSFRUXSwKKwkJbmJ1Zl90eF9tZ210W05CVUZfVFhfUEtUX0hUVF0gIC0gbmJ1Zl90eF9tZ210W05CVUZfVFhfUEtUX0hUQ10sCisJCW5idWZfdHhfbWdtdFtOQlVGX1RYX1BLVF9IVENdICAtIG5idWZfdHhfbWdtdFtOQlVGX1RYX1BLVF9ISUZdLAorCQluYnVmX3R4X21nbXRbTkJVRl9UWF9QS1RfSElGXSAgLSBuYnVmX3R4X21nbXRbTkJVRl9UWF9QS1RfQ0VdLAorCQluYnVmX3R4X21nbXRbTkJVRl9UWF9QS1RfQ0VdICAgLSBuYnVmX3R4X21nbXRbTkJVRl9UWF9QS1RfRlJFRV0sCisJCW5idWZfdHhfbWdtdFtOQlVGX1RYX1BLVF9GUkVFXSk7Cit9CisKKy8qKgorICogY2RmX25idWZfdHhfZGVzY19jb3VudF91cGRhdGUoKSAtIFVwZGF0ZXMgdGhlIGxheWVyIHBhY2tldCBjb3VudGVyCisgKiBAcGFja2V0X3R5cGUgICA6IHBhY2tldCB0eXBlIGVpdGhlciBtZ210L2RhdGEKKyAqIEBjdXJyZW50X3N0YXRlIDogbGF5ZXIgYXQgd2hpY2ggdGhlIHBhY2tldCBjdXJyZW50bHkgcHJlc2VudAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX25idWZfdHhfZGVzY19jb3VudF91cGRhdGUodWludDhfdCBwYWNrZXRfdHlwZSwKKwkJCQkJCQl1aW50OF90IGN1cnJlbnRfc3RhdGUpCit7CisJc3dpdGNoIChwYWNrZXRfdHlwZSkgeworCWNhc2UgTkJVRl9UWF9QS1RfTUdNVF9UUkFDSzoKKwkJbmJ1Zl90eF9tZ210W2N1cnJlbnRfc3RhdGVdKys7CisJCWJyZWFrOworCWNhc2UgTkJVRl9UWF9QS1RfREFUQV9UUkFDSzoKKwkJbmJ1Zl90eF9kYXRhW2N1cnJlbnRfc3RhdGVdKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBjZGZfbmJ1Zl90eF9kZXNjX2NvdW50X2NsZWFyKCkgLSBDbGVhcnMgcGFja2V0IGNvdW50ZXIgZm9yIGJvdGggZGF0YSwgbWdtdAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNkZl9uYnVmX3R4X2Rlc2NfY291bnRfY2xlYXIodm9pZCkKK3sKKwltZW1zZXQobmJ1Zl90eF9tZ210LCAwLCBzaXplb2YobmJ1Zl90eF9tZ210KSk7CisJbWVtc2V0KG5idWZfdHhfZGF0YSwgMCwgc2l6ZW9mKG5idWZfdHhfZGF0YSkpOworfQorCisvKioKKyAqIGNkZl9uYnVmX3NldF9zdGF0ZSgpIC0gVXBkYXRlcyB0aGUgcGFja2V0IHN0YXRlCisgKiBAbmJ1ZjogICAgICAgICAgICBuZXR3b3JrIGJ1ZmZlcgorICogQGN1cnJlbnRfc3RhdGUgOiAgbGF5ZXIgYXQgd2hpY2ggdGhlIHBhY2tldCBjdXJyZW50bHkgaXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHBhY2tldCBzdGF0ZSB0byB0aGUgbGF5ZXIgYXQgd2hpY2ggdGhlIHBhY2tldAorICogY3VycmVudGx5IGlzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RmX25idWZfc2V0X3N0YXRlKGNkZl9uYnVmX3QgbmJ1ZiwgdWludDhfdCBjdXJyZW50X3N0YXRlKQoreworCS8qCisJICogT25seSBNZ210LCBEYXRhIFBhY2tldHMgYXJlIHRyYWNrZWQuIFdNSSBtZXNzYWdlcworCSAqIHN1Y2ggYXMgc2NhbiBjb21tYW5kcyBhcmUgbm90IHRyYWNrZWQKKwkgKi8KKwl1aW50OF90IHBhY2tldF90eXBlOworCXBhY2tldF90eXBlID0gTkJVRl9HRVRfUEFDS0VUX1RSQUNLKG5idWYpOworCisJaWYgKChwYWNrZXRfdHlwZSAhPSBOQlVGX1RYX1BLVF9EQVRBX1RSQUNLKSAmJgorCQkocGFja2V0X3R5cGUgIT0gTkJVRl9UWF9QS1RfTUdNVF9UUkFDSykpIHsKKwkJcmV0dXJuOworCX0KKwlOQlVGX1NFVF9QQUNLRVRfU1RBVEUobmJ1ZiwgY3VycmVudF9zdGF0ZSk7CisJY2RmX25idWZfdHhfZGVzY19jb3VudF91cGRhdGUocGFja2V0X3R5cGUsCisJCQkJCWN1cnJlbnRfc3RhdGUpOworfQorCitjZGZfbmJ1Zl90cmFjZV91cGRhdGVfdCB0cmFjZV91cGRhdGVfY2IgPSBOVUxMOworCisvKioKKyAqIF9fY2RmX25idWZfYWxsb2MoKSAtIEFsbG9jYXRlIG5idWYKKyAqIEBoZGw6IERldmljZSBoYW5kbGUKKyAqIEBzaXplOiBOZXRidWYgcmVxdWVzdGVkIHNpemUKKyAqIEByZXNlcnZlOiBSZXNlcnZlCisgKiBAYWxpZ246IEFsaWduCisgKiBAcHJpbzogUHJpb3JpdHkKKyAqCisgKiBUaGlzIGFsbG9jYXRlcyBhbiBuYnVmIGFsaWducyBpZiBuZWVkZWQgYW5kIHJlc2VydmVzIHNvbWUgc3BhY2UgaW4gdGhlIGZyb250LAorICogc2luY2UgdGhlIHJlc2VydmUgaXMgZG9uZSBhZnRlciBhbGlnbm1lbnQgdGhlIHJlc2VydmUgdmFsdWUgaWYgYmVpbmcKKyAqIHVuYWxpZ25lZCB3aWxsIHJlc3VsdCBpbiBhbiB1bmFsaWduZWQgYWRkcmVzcy4KKyAqCisgKiBSZXR1cm46IG5idWYgb3IgJU5VTEwgaWYgbm8gbWVtb3J5CisgKi8KK3N0cnVjdCBza19idWZmICpfX2NkZl9uYnVmX2FsbG9jKGNkZl9kZXZpY2VfdCBvc2Rldiwgc2l6ZV90IHNpemUsIGludCByZXNlcnZlLAorCQkJCSBpbnQgYWxpZ24sIGludCBwcmlvKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlpZiAoYWxpZ24pCisJCXNpemUgKz0gKGFsaWduIC0gMSk7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOworCisJaWYgKCFza2IpIHsKKwkJcHJfZXJyKCJFUlJPUjpOQlVGIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoc2tiLT5jYiwgMHgwLCBzaXplb2Yoc2tiLT5jYikpOworCisJLyoKKwkgKiBUaGUgZGVmYXVsdCBpcyBmb3IgbmV0YnVmIGZyYWdtZW50cyB0byBiZSBpbnRlcnByZXRlZAorCSAqIGFzIHdvcmRzdHJlYW1zIHJhdGhlciB0aGFuIGJ5dGVzdHJlYW1zLgorCSAqIFNldCB0aGUgQ1ZHX05CVUZfTUFYX0VYVFJBX0ZSQUdTKzEgd29yZHN0cmVhbV9mbGFncyBiaXRzLAorCSAqIHRvIHByb3ZpZGUgdGhpcyBkZWZhdWx0LgorCSAqLworCU5CVUZfRVhUUkFfRlJBR19XT1JEU1RSRUFNX0ZMQUdTKHNrYikgPQorCQkoMSA8PCAoQ1ZHX05CVUZfTUFYX0VYVFJBX0ZSQUdTICsgMSkpIC0gMTsKKworCS8qCisJICogWFhYOmhvdyBhYm91dCB3ZSByZXNlcnZlIGZpcnN0IHRoZW4gYWxpZ24KKwkgKiBBbGlnbiAmIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWlsICYgZGF0YSBhcmUgYWRqdXN0ZWQgcHJvcGVybHkKKwkgKi8KKworCWlmIChhbGlnbikgeworCQlvZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhKSAlIGFsaWduOworCQlpZiAob2Zmc2V0KQorCQkJc2tiX3Jlc2VydmUoc2tiLCBhbGlnbiAtIG9mZnNldCk7CisJfQorCisJLyoKKwkgKiBOT1RFOmFsbG9jIGRvZXNuJ3QgdGFrZSByZXNwb25zaWJpbGl0eSBpZiByZXNlcnZlIHVuYWxpZ25zIHRoZSBkYXRhCisJICogcG9pbnRlcgorCSAqLworCXNrYl9yZXNlcnZlKHNrYiwgcmVzZXJ2ZSk7CisKKwlyZXR1cm4gc2tiOworfQorCisvKioKKyAqIF9fY2RmX25idWZfZnJlZSgpIC0gZnJlZSB0aGUgbmJ1ZiBpdHMgaW50ZXJydXB0IHNhZmUKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBfX2NkZl9uYnVmX2ZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoKE5CVUZfT1dORVJfSUQoc2tiKSA9PSBJUEFfTkJVRl9PV05FUl9JRCkgJiYgTkJVRl9DQUxMQkFDS19GTihza2IpKQorCQlOQlVGX0NBTExCQUNLX0ZOX0VYRUMoc2tiKTsKKwllbHNlCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9tYXAoKSAtIGdldCB0aGUgZG1hIG1hcCBvZiB0aGUgbmJ1ZgorICogQG9zZGV2OiBPUyBkZXZpY2UKKyAqIEBibWFwOiBCaXRtYXAKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqIEBkaXI6IERpcmVjdGlvbgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTCitfX2NkZl9uYnVmX21hcChjZGZfZGV2aWNlX3Qgb3NkZXYsIHN0cnVjdCBza19idWZmICpza2IsIGNkZl9kbWFfZGlyX3QgZGlyKQoreworI2lmZGVmIENERl9PU19ERUJVRworCXN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNoID0gc2tiX3NoaW5mbyhza2IpOworI2VuZGlmCisJY2RmX2Fzc2VydCgoZGlyID09IENERl9ETUFfVE9fREVWSUNFKQorCQkgICB8fCAoZGlyID09IENERl9ETUFfRlJPTV9ERVZJQ0UpKTsKKworCS8qCisJICogQXNzdW1lIHRoZXJlJ3Mgb25seSBhIHNpbmdsZSBmcmFnbWVudC4KKwkgKiBUbyBzdXBwb3J0IG11bHRpcGxlIGZyYWdtZW50cywgaXQgd291bGQgYmUgbmVjZXNzYXJ5IHRvIGNoYW5nZQorCSAqIGNkZl9uYnVmX3QgdG8gYmUgYSBzZXBhcmF0ZSBvYmplY3QgdGhhdCBzdG9yZXMgbWV0YS1pbmZvCisJICogKGluY2x1ZGluZyB0aGUgYnVzIGFkZHJlc3MgZm9yIGVhY2ggZnJhZ21lbnQpIGFuZCBhIHBvaW50ZXIKKwkgKiB0byB0aGUgdW5kZXJseWluZyBza19idWZmLgorCSAqLworCWNkZl9hc3NlcnQoc2gtPm5yX2ZyYWdzID09IDApOworCisJcmV0dXJuIF9fY2RmX25idWZfbWFwX3NpbmdsZShvc2Rldiwgc2tiLCBkaXIpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX3VubWFwKCkgLSB0byB1bm1hcCBhIHByZXZpb3VzbHkgbWFwcGVkIGJ1ZgorICogQG9zZGV2OiBPUyBkZXZpY2UKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqIEBkaXI6IERpcmVjdGlvbgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkCitfX2NkZl9uYnVmX3VubWFwKGNkZl9kZXZpY2VfdCBvc2Rldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2RmX2RtYV9kaXJfdCBkaXIpCit7CisJY2RmX2Fzc2VydCgoZGlyID09IENERl9ETUFfVE9fREVWSUNFKQorCQkgICB8fCAoZGlyID09IENERl9ETUFfRlJPTV9ERVZJQ0UpKTsKKworCWNkZl9hc3NlcnQoKChkaXIgPT0gQ0RGX0RNQV9UT19ERVZJQ0UpCisJCSAgICB8fCAoZGlyID09IENERl9ETUFfRlJPTV9ERVZJQ0UpKSk7CisJLyoKKwkgKiBBc3N1bWUgdGhlcmUncyBhIHNpbmdsZSBmcmFnbWVudC4KKwkgKiBJZiB0aGlzIGlzIG5vdCB0cnVlLCB0aGUgYXNzZXJ0aW9uIGluIF9fY2RmX25idWZfbWFwIHdpbGwgY2F0Y2ggaXQuCisJICovCisJX19jZGZfbmJ1Zl91bm1hcF9zaW5nbGUob3NkZXYsIHNrYiwgZGlyKTsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX21hcF9zaW5nbGUoKSAtIGRtYSBtYXAgb2YgdGhlIG5idWYKKyAqIEBvc2RldjogT1MgZGV2aWNlCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKiBAZGlyOiBEaXJlY3Rpb24KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUworX19jZGZfbmJ1Zl9tYXBfc2luZ2xlKGNkZl9kZXZpY2VfdCBvc2RldiwgY2RmX25idWZfdCBidWYsIGNkZl9kbWFfZGlyX3QgZGlyKQoreworCXVpbnQzMl90IHBhZGRyX2xvOworCisvKiB0ZW1wb3J5IGhhY2sgZm9yIHNpbXVsYXRpb24gKi8KKyNpZmRlZiBBX1NJTU9TX0RFVkhPU1QKKwlOQlVGX01BUFBFRF9QQUREUl9MTyhidWYpID0gcGFkZHJfbG8gPSAodWludDMyX3QpIGJ1Zi0+ZGF0YTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworI2Vsc2UKKwkvKiBhc3N1bWUgdGhhdCB0aGUgT1Mgb25seSBwcm92aWRlcyBhIHNpbmdsZSBmcmFnbWVudCAqLworCU5CVUZfTUFQUEVEX1BBRERSX0xPKGJ1ZikgPSBwYWRkcl9sbyA9CisJCQkJCWRtYV9tYXBfc2luZ2xlKG9zZGV2LT5kZXYsIGJ1Zi0+ZGF0YSwKKwkJCQkJc2tiX2VuZF9wb2ludGVyKGJ1ZikgLSBidWYtPmRhdGEsIGRpcik7CisJcmV0dXJuIGRtYV9tYXBwaW5nX2Vycm9yKG9zZGV2LT5kZXYsIHBhZGRyX2xvKSA/CisJICAgICAgIENERl9TVEFUVVNfRV9GQUlMVVJFIDogQ0RGX1NUQVRVU19TVUNDRVNTOworI2VuZGlmIC8qICNpZmRlZiBBX1NJTU9TX0RFVkhPU1QgKi8KK30KKworLyoqCisgKiBfX2NkZl9uYnVmX3VubWFwX3NpbmdsZSgpIC0gZG1hIHVubWFwIG5idWYKKyAqIEBvc2RldjogT1MgZGV2aWNlCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKiBAZGlyOiBEaXJlY3Rpb24KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZAorX19jZGZfbmJ1Zl91bm1hcF9zaW5nbGUoY2RmX2RldmljZV90IG9zZGV2LCBjZGZfbmJ1Zl90IGJ1ZiwgY2RmX2RtYV9kaXJfdCBkaXIpCit7CisjaWYgIWRlZmluZWQoQV9TSU1PU19ERVZIT1NUKQorCWRtYV91bm1hcF9zaW5nbGUob3NkZXYtPmRldiwgTkJVRl9NQVBQRURfUEFERFJfTE8oYnVmKSwKKwkJCSBza2JfZW5kX3BvaW50ZXIoYnVmKSAtIGJ1Zi0+ZGF0YSwgZGlyKTsKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoQV9TSU1PU19ERVZIT1NUKSAqLworfQorCisvKioKKyAqIF9fY2RmX25idWZfc2V0X3J4X2Nrc3VtKCkgLSBzZXQgcnggY2hlY2tzdW0KKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqIEBja3N1bTogUG9pbnRlciB0byBjaGVja3N1bSB2YWx1ZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTCitfX2NkZl9uYnVmX3NldF9yeF9ja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjZGZfbmJ1Zl9yeF9ja3N1bV90ICpja3N1bSkKK3sKKwlzd2l0Y2ggKGNrc3VtLT5sNF9yZXN1bHQpIHsKKwljYXNlIENERl9OQlVGX1JYX0NLU1VNX05PTkU6CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJYnJlYWs7CisJY2FzZSBDREZfTkJVRl9SWF9DS1NVTV9UQ1BfVURQX1VOTkVDRVNTQVJZOgorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQlicmVhazsKKwljYXNlIENERl9OQlVGX1JYX0NLU1VNX1RDUF9VRFBfSFc6CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKKwkJc2tiLT5jc3VtID0gY2tzdW0tPnZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJBREZfTkVUOlVua25vd24gY2hlY2tzdW0gdHlwZVxuIik7CisJCWNkZl9hc3NlcnQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9TVVBQT1JUOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIF9fY2RmX25idWZfZ2V0X3R4X2Nrc3VtKCkgLSBnZXQgdHggY2hlY2tzdW0KKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IFRYIGNoZWNrc3VtIHZhbHVlCisgKi8KK2NkZl9uYnVmX3R4X2Nrc3VtX3QgX19jZGZfbmJ1Zl9nZXRfdHhfY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CisJY2FzZSBDSEVDS1NVTV9OT05FOgorCQlyZXR1cm4gQ0RGX05CVUZfVFhfQ0tTVU1fTk9ORTsKKwljYXNlIENIRUNLU1VNX1BBUlRJQUw6CisJCS8qIFhYWCBBREYgYW5kIExpbnV4IGNoZWNrc3VtIGRvbid0IG1hcCB3aXRoIDEtdG8tMS4gVGhpcyBpcworCQkgKiBub3QgMTAwJSBjb3JyZWN0ICovCisJCXJldHVybiBDREZfTkJVRl9UWF9DS1NVTV9UQ1BfVURQOworCWNhc2UgQ0hFQ0tTVU1fQ09NUExFVEU6CisJCXJldHVybiBDREZfTkJVRl9UWF9DS1NVTV9UQ1BfVURQX0lQOworCWRlZmF1bHQ6CisJCXJldHVybiBDREZfTkJVRl9UWF9DS1NVTV9OT05FOworCX0KK30KKworLyoqCisgKiBfX2NkZl9uYnVmX2dldF90aWQoKSAtIGdldCB0aWQKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IHRpZAorICovCit1aW50OF90IF9fY2RmX25idWZfZ2V0X3RpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPnByaW9yaXR5OworfQorCisvKioKKyAqIF9fY2RmX25idWZfc2V0X3RpZCgpIC0gc2V0IHRpZAorICogQHNrYjogUG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlcgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIF9fY2RmX25idWZfc2V0X3RpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1aW50OF90IHRpZCkKK3sKKwlza2ItPnByaW9yaXR5ID0gdGlkOworfQorCisvKioKKyAqIF9fY2RmX25idWZfc2V0X3RpZCgpIC0gc2V0IHRpZAorICogQHNrYjogUG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlcgorICoKKyAqIFJldHVybjogbm9uZQorICovCit1aW50OF90IF9fY2RmX25idWZfZ2V0X2V4ZW1wdGlvbl90eXBlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIENERl9OQlVGX0VYRU1QVF9OT19FWEVNUFRJT047Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9yZWdfdHJhY2VfY2IoKSAtIHJlZ2lzdGVyIHRyYWNlIGNhbGxiYWNrCisgKiBAY2JfZnVuY19wdHI6IFBvaW50ZXIgdG8gdHJhY2UgY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBfX2NkZl9uYnVmX3JlZ190cmFjZV9jYihjZGZfbmJ1Zl90cmFjZV91cGRhdGVfdCBjYl9mdW5jX3B0cikKK3sKKwl0cmFjZV91cGRhdGVfY2IgPSBjYl9mdW5jX3B0cjsKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisvKioKKyAqIF9fY2RmX25idWZfdHJhY2VfdXBkYXRlKCkgLSB1cGRhdGUgdHJhY2UgZXZlbnQKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqIEBldmVudF9zdHJpbmc6IFBvaW50ZXIgdG8gdHJhY2UgY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBfX2NkZl9uYnVmX3RyYWNlX3VwZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCBjaGFyICpldmVudF9zdHJpbmcpCit7CisJY2hhciBzdHJpbmdfYnVmW05CVUZfUEtUX1RSQUNfTUFYX1NUUklOR107CisKKwlpZiAoKCF0cmFjZV91cGRhdGVfY2IpIHx8ICghZXZlbnRfc3RyaW5nKSkKKwkJcmV0dXJuOworCisJaWYgKCFjZGZfbmJ1Zl90cmFjZV9nZXRfcHJvdG9fdHlwZShidWYpKQorCQlyZXR1cm47CisKKwkvKiBCdWZmZXIgb3ZlciBmbG93ICovCisJaWYgKE5CVUZfUEtUX1RSQUNfTUFYX1NUUklORyA8PQorCSAgICAoY2RmX3N0cl9sZW4oZXZlbnRfc3RyaW5nKSArIE5CVUZfUEtUX1RSQUNfUFJPVE9fU1RSSU5HKSkgeworCQlyZXR1cm47CisJfQorCisJY2RmX21lbV96ZXJvKHN0cmluZ19idWYsIE5CVUZfUEtUX1RSQUNfTUFYX1NUUklORyk7CisJY2RmX21lbV9jb3B5KHN0cmluZ19idWYsIGV2ZW50X3N0cmluZywgY2RmX3N0cl9sZW4oZXZlbnRfc3RyaW5nKSk7CisJaWYgKE5CVUZfUEtUX1RSQUNfVFlQRV9FQVBPTCAmIGNkZl9uYnVmX3RyYWNlX2dldF9wcm90b190eXBlKGJ1ZikpIHsKKwkJY2RmX21lbV9jb3B5KHN0cmluZ19idWYgKyBjZGZfc3RyX2xlbihldmVudF9zdHJpbmcpLAorCQkJICAgICAiRVBMIiwgTkJVRl9QS1RfVFJBQ19QUk9UT19TVFJJTkcpOworCX0gZWxzZSBpZiAoTkJVRl9QS1RfVFJBQ19UWVBFX0RIQ1AgJiBjZGZfbmJ1Zl90cmFjZV9nZXRfcHJvdG9fdHlwZShidWYpKSB7CisJCWNkZl9tZW1fY29weShzdHJpbmdfYnVmICsgY2RmX3N0cl9sZW4oZXZlbnRfc3RyaW5nKSwKKwkJCSAgICAgIkRIQyIsIE5CVUZfUEtUX1RSQUNfUFJPVE9fU1RSSU5HKTsKKwl9IGVsc2UgaWYgKE5CVUZfUEtUX1RSQUNfVFlQRV9NR01UX0FDVElPTiAmCisJCSAgIGNkZl9uYnVmX3RyYWNlX2dldF9wcm90b190eXBlKGJ1ZikpIHsKKwkJY2RmX21lbV9jb3B5KHN0cmluZ19idWYgKyBjZGZfc3RyX2xlbihldmVudF9zdHJpbmcpLAorCQkJICAgICAiTUFDVCIsIE5CVUZfUEtUX1RSQUNfUFJPVE9fU1RSSU5HKTsKKwl9CisKKwl0cmFjZV91cGRhdGVfY2Ioc3RyaW5nX2J1Zik7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworI2lmZGVmIE1FTU9SWV9ERUJVRworI2RlZmluZSBDREZfTkVUX0JVRl9UUkFDS19NQVhfU0laRSAgICAoMTAyNCkKKworLyoqCisgKiBzdHJ1Y3QgY2RmX25idWZfdHJhY2tfdCAtIE5ldHdvcmsgYnVmZmVyIHRyYWNrIHN0cnVjdHVyZQorICoKKyAqIEBwX25leHQ6IFBvaW50ZXIgdG8gbmV4dAorICogQG5ldF9idWY6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqIEBmaWxlX25hbWU6IEZpbGUgbmFtZQorICogQGxpbmVfbnVtOiBMaW5lIG51bWJlcgorICogQHNpemU6IFNpemUKKyAqLworc3RydWN0IGNkZl9uYnVmX3RyYWNrX3QgeworCXN0cnVjdCBjZGZfbmJ1Zl90cmFja190ICpwX25leHQ7CisJY2RmX25idWZfdCBuZXRfYnVmOworCXVpbnQ4X3QgKmZpbGVfbmFtZTsKKwl1aW50MzJfdCBsaW5lX251bTsKKwlzaXplX3Qgc2l6ZTsKK307CisKK3NwaW5sb2NrX3QgZ19jZGZfbmV0X2J1Zl90cmFja19sb2NrOwordHlwZWRlZiBzdHJ1Y3QgY2RmX25idWZfdHJhY2tfdCBDREZfTkJVRl9UUkFDSzsKKworQ0RGX05CVUZfVFJBQ0sgKmdwX2NkZl9uZXRfYnVmX3RyYWNrX3RibFtDREZfTkVUX0JVRl9UUkFDS19NQVhfU0laRV07CisKKy8qKgorICogY2RmX25ldF9idWZfZGVidWdfaW5pdCgpIC0gaW5pdGlhbGl6ZSBuZXR3b3JrIGJ1ZmZlciBkZWJ1ZyBmdW5jdGlvbmFsaXR5CisgKgorICogQ0RGIG5ldHdvcmsgYnVmZmVyIGRlYnVnIGZlYXR1cmUgdHJhY2tzIGFsbCBTS0JzIGFsbG9jYXRlZCBieSBXTEFOIGRyaXZlcgorICogaW4gYSBoYXNoIHRhYmxlIGFuZCB3aGVuIGRyaXZlciBpcyB1bmxvYWRlZCBpdCByZXBvcnRzIGFib3V0IGxlYWtlZCBTS0JzLgorICogV0xBTiBkcml2ZXIgbW9kdWxlIHdob3NlIGFsbG9jYXRlZCBTS0IgaXMgZnJlZWQgYnkgbmV0d29yayBzdGFjayBhcmUKKyAqIHN1cHBvc2UgdG8gY2FsbCBjZGZfbmV0X2J1Zl9kZWJ1Z19yZWxlYXNlX3NrYigpIHN1Y2ggdGhhdCB0aGUgU0tCIGlzIG5vdAorICogcmVwb3J0ZWQgYXMgbWVtb3J5IGxlYWsuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RmX25ldF9idWZfZGVidWdfaW5pdCh2b2lkKQoreworCXVpbnQzMl90IGk7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZzsKKworCXNwaW5fbG9ja19pbml0KCZnX2NkZl9uZXRfYnVmX3RyYWNrX2xvY2spOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdfY2RmX25ldF9idWZfdHJhY2tfbG9jaywgaXJxX2ZsYWcpOworCisJZm9yIChpID0gMDsgaSA8IENERl9ORVRfQlVGX1RSQUNLX01BWF9TSVpFOyBpKyspCisJCWdwX2NkZl9uZXRfYnVmX3RyYWNrX3RibFtpXSA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NkZl9uZXRfYnVmX3RyYWNrX2xvY2ssIGlycV9mbGFnKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBjZGZfbmV0X2J1Zl9kZWJ1Z19pbml0KCkgLSBleGl0IG5ldHdvcmsgYnVmZmVyIGRlYnVnIGZ1bmN0aW9uYWxpdHkKKyAqCisgKiBFeGl0IG5ldHdvcmsgYnVmZmVyIHRyYWNraW5nIGRlYnVnIGZ1bmN0aW9uYWxpdHkgYW5kIGxvZyBTS0IgbWVtb3J5IGxlYWtzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RmX25ldF9idWZfZGVidWdfZXhpdCh2b2lkKQoreworCXVpbnQzMl90IGk7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZzsKKwlDREZfTkJVRl9UUkFDSyAqcF9ub2RlOworCUNERl9OQlVGX1RSQUNLICpwX3ByZXY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ19jZGZfbmV0X2J1Zl90cmFja19sb2NrLCBpcnFfZmxhZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0RGX05FVF9CVUZfVFJBQ0tfTUFYX1NJWkU7IGkrKykgeworCQlwX25vZGUgPSBncF9jZGZfbmV0X2J1Zl90cmFja190YmxbaV07CisJCXdoaWxlIChwX25vZGUpIHsKKwkJCXBfcHJldiA9IHBfbm9kZTsKKwkJCXBfbm9kZSA9IHBfbm9kZS0+cF9uZXh0OworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkJICAiU0tCIGJ1ZiBtZW1vcnkgTGVha0AgRmlsZSAlcywgQExpbmUgJWQsIHNpemUgJXp1XG4iLAorCQkJCSAgcF9wcmV2LT5maWxlX25hbWUsIHBfcHJldi0+bGluZV9udW0sCisJCQkJICBwX3ByZXYtPnNpemUpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jZGZfbmV0X2J1Zl90cmFja19sb2NrLCBpcnFfZmxhZyk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogY2RmX25ldF9idWZfZGVidWdfY2xlYW4oKSAtIGNsZWFuIHVwIG5ldHdvcmsgYnVmZmVyIGRlYnVnIGZ1bmN0aW9uYWxpdHkKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBjZGZfbmV0X2J1Zl9kZWJ1Z19jbGVhbih2b2lkKQoreworCXVpbnQzMl90IGk7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZzsKKwlDREZfTkJVRl9UUkFDSyAqcF9ub2RlOworCUNERl9OQlVGX1RSQUNLICpwX3ByZXY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ19jZGZfbmV0X2J1Zl90cmFja19sb2NrLCBpcnFfZmxhZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0RGX05FVF9CVUZfVFJBQ0tfTUFYX1NJWkU7IGkrKykgeworCQlwX25vZGUgPSBncF9jZGZfbmV0X2J1Zl90cmFja190YmxbaV07CisJCXdoaWxlIChwX25vZGUpIHsKKwkJCXBfcHJldiA9IHBfbm9kZTsKKwkJCXBfbm9kZSA9IHBfbm9kZS0+cF9uZXh0OworCQkJY2RmX21lbV9mcmVlKHBfcHJldik7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NkZl9uZXRfYnVmX3RyYWNrX2xvY2ssIGlycV9mbGFnKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBjZGZfbmV0X2J1Zl9kZWJ1Z19oYXNoKCkgLSBoYXNoIG5ldHdvcmsgYnVmZmVyIHBvaW50ZXIKKyAqCisgKiBSZXR1cm46IGhhc2ggdmFsdWUKKyAqLwordWludDMyX3QgY2RmX25ldF9idWZfZGVidWdfaGFzaChjZGZfbmJ1Zl90IG5ldF9idWYpCit7CisJdWludDMyX3QgaTsKKworCWkgPSAodWludDMyX3QpICgodWludHB0cl90KSBuZXRfYnVmICYgKENERl9ORVRfQlVGX1RSQUNLX01BWF9TSVpFIC0gMSkpOworCisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogY2RmX25ldF9idWZfZGVidWdfbG9va191cCgpIC0gbG9vayB1cCBuZXR3b3JrIGJ1ZmZlciBpbiBkZWJ1ZyBoYXNoIHRhYmxlCisgKgorICogUmV0dXJuOiBJZiBza2IgaXMgZm91bmQgaW4gaGFzaCB0YWJsZSB0aGVuIHJldHVybiBwb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKgllbHNlIHJldHVybiAlTlVMTAorICovCitDREZfTkJVRl9UUkFDSyAqY2RmX25ldF9idWZfZGVidWdfbG9va191cChjZGZfbmJ1Zl90IG5ldF9idWYpCit7CisJdWludDMyX3QgaTsKKwlDREZfTkJVRl9UUkFDSyAqcF9ub2RlOworCisJaSA9IGNkZl9uZXRfYnVmX2RlYnVnX2hhc2gobmV0X2J1Zik7CisJcF9ub2RlID0gZ3BfY2RmX25ldF9idWZfdHJhY2tfdGJsW2ldOworCisJd2hpbGUgKHBfbm9kZSkgeworCQlpZiAocF9ub2RlLT5uZXRfYnVmID09IG5ldF9idWYpCisJCQlyZXR1cm4gcF9ub2RlOworCQlwX25vZGUgPSBwX25vZGUtPnBfbmV4dDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKKworfQorCisvKioKKyAqIGNkZl9uZXRfYnVmX2RlYnVnX2FkZF9ub2RlKCkgLSBzdG9yZSBza2IgaW4gZGVidWcgaGFzaCB0YWJsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNkZl9uZXRfYnVmX2RlYnVnX2FkZF9ub2RlKGNkZl9uYnVmX3QgbmV0X2J1Ziwgc2l6ZV90IHNpemUsCisJCQkJdWludDhfdCAqZmlsZV9uYW1lLCB1aW50MzJfdCBsaW5lX251bSkKK3sKKwl1aW50MzJfdCBpOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWc7CisJQ0RGX05CVUZfVFJBQ0sgKnBfbm9kZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnX2NkZl9uZXRfYnVmX3RyYWNrX2xvY2ssIGlycV9mbGFnKTsKKworCWkgPSBjZGZfbmV0X2J1Zl9kZWJ1Z19oYXNoKG5ldF9idWYpOworCXBfbm9kZSA9IGNkZl9uZXRfYnVmX2RlYnVnX2xvb2tfdXAobmV0X2J1Zik7CisKKwlpZiAocF9ub2RlKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiRG91YmxlIGFsbG9jYXRpb24gb2Ygc2tiICEgQWxyZWFkeSBhbGxvY2F0ZWQgZnJvbSAlcyAlZCIsCisJCQkgIHBfbm9kZS0+ZmlsZV9uYW1lLCBwX25vZGUtPmxpbmVfbnVtKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJZ290byBkb25lOworCX0gZWxzZSB7CisJCXBfbm9kZSA9IChDREZfTkJVRl9UUkFDSyAqKSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnBfbm9kZSkpOworCQlpZiAocF9ub2RlKSB7CisJCQlwX25vZGUtPm5ldF9idWYgPSBuZXRfYnVmOworCQkJcF9ub2RlLT5maWxlX25hbWUgPSBmaWxlX25hbWU7CisJCQlwX25vZGUtPmxpbmVfbnVtID0gbGluZV9udW07CisJCQlwX25vZGUtPnNpemUgPSBzaXplOworCQkJcF9ub2RlLT5wX25leHQgPSBncF9jZGZfbmV0X2J1Zl90cmFja190YmxbaV07CisJCQlncF9jZGZfbmV0X2J1Zl90cmFja190YmxbaV0gPSBwX25vZGU7CisJCX0gZWxzZSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJNZW0gYWxsb2MgZmFpbGVkICEgQ291bGQgbm90IHRyYWNrIHNrYiBmcm9tICVzICVkIG9mIHNpemUgJXp1IiwKKwkJCQkgIGZpbGVfbmFtZSwgbGluZV9udW0sIHNpemUpOworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJfQorCX0KKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NkZl9uZXRfYnVmX3RyYWNrX2xvY2ssIGlycV9mbGFnKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBjZGZfbmV0X2J1Zl9kZWJ1Z19kZWxldGVfbm9kZSgpIC0gcmVtb3ZlIHNrYiBmcm9tIGRlYnVnIGhhc2ggdGFibGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBjZGZfbmV0X2J1Zl9kZWJ1Z19kZWxldGVfbm9kZShjZGZfbmJ1Zl90IG5ldF9idWYpCit7CisJdWludDMyX3QgaTsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJQ0RGX05CVUZfVFJBQ0sgKnBfaGVhZDsKKwlDREZfTkJVRl9UUkFDSyAqcF9ub2RlOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWc7CisJQ0RGX05CVUZfVFJBQ0sgKnBfcHJldjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnX2NkZl9uZXRfYnVmX3RyYWNrX2xvY2ssIGlycV9mbGFnKTsKKworCWkgPSBjZGZfbmV0X2J1Zl9kZWJ1Z19oYXNoKG5ldF9idWYpOworCXBfaGVhZCA9IGdwX2NkZl9uZXRfYnVmX3RyYWNrX3RibFtpXTsKKworCS8qIFVuYWxsb2NhdGVkIFNLQiAqLworCWlmICghcF9oZWFkKQorCQlnb3RvIGRvbmU7CisKKwlwX25vZGUgPSBwX2hlYWQ7CisJLyogRm91bmQgYXQgaGVhZCBvZiB0aGUgdGFibGUgKi8KKwlpZiAocF9oZWFkLT5uZXRfYnVmID09IG5ldF9idWYpIHsKKwkJZ3BfY2RmX25ldF9idWZfdHJhY2tfdGJsW2ldID0gcF9ub2RlLT5wX25leHQ7CisJCWNkZl9tZW1fZnJlZSgodm9pZCAqKXBfbm9kZSk7CisJCWZvdW5kID0gdHJ1ZTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFNlYXJjaCBpbiBjb2xsaXNpb24gbGlzdCAqLworCXdoaWxlIChwX25vZGUpIHsKKwkJcF9wcmV2ID0gcF9ub2RlOworCQlwX25vZGUgPSBwX25vZGUtPnBfbmV4dDsKKwkJaWYgKChOVUxMICE9IHBfbm9kZSkgJiYgKHBfbm9kZS0+bmV0X2J1ZiA9PSBuZXRfYnVmKSkgeworCQkJcF9wcmV2LT5wX25leHQgPSBwX25vZGUtPnBfbmV4dDsKKwkJCWNkZl9tZW1fZnJlZSgodm9pZCAqKXBfbm9kZSk7CisJCQlmb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworZG9uZToKKwlpZiAoIWZvdW5kKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiVW5hbGxvY2F0ZWQgYnVmZmVyICEgRG91YmxlIGZyZWUgb2YgbmV0X2J1ZiAlcCA/IiwKKwkJCSAgbmV0X2J1Zik7CisJCUNERl9BU1NFUlQoMCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jZGZfbmV0X2J1Zl90cmFja19sb2NrLCBpcnFfZmxhZyk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogY2RmX25ldF9idWZfZGVidWdfcmVsZWFzZV9za2IoKSAtIHJlbGVhc2Ugc2tiIHRvIGF2b2lkIG1lbW9yeSBsZWFrCisgKgorICogV0xBTiBkcml2ZXIgbW9kdWxlIHdob3NlIGFsbG9jYXRlZCBTS0IgaXMgZnJlZWQgYnkgbmV0d29yayBzdGFjayBhcmUKKyAqIHN1cHBvc2UgdG8gY2FsbCB0aGlzIEFQSSBiZWZvcmUgcmV0dXJuaW5nIFNLQiB0byBuZXR3b3JrIHN0YWNrIHN1Y2gKKyAqIHRoYXQgdGhlIFNLQiBpcyBub3QgcmVwb3J0ZWQgYXMgbWVtb3J5IGxlYWsuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RmX25ldF9idWZfZGVidWdfcmVsZWFzZV9za2IoY2RmX25idWZfdCBuZXRfYnVmKQoreworCWNkZl9uZXRfYnVmX2RlYnVnX2RlbGV0ZV9ub2RlKG5ldF9idWYpOworfQorCisjZW5kaWYgLypNRU1PUllfREVCVUcgKi8KKyNpZiBkZWZpbmVkKEZFQVRVUkVfVFNPKQorCitzdHJ1Y3QgY2RmX3Rzb19jbW5fc2VnX2luZm9fdCB7CisJdWludDE2X3QgZXRocHJvdG87CisJdWludDE2X3QgaXBfdGNwX2hkcl9sZW47CisJdWludDE2X3QgbDJfbGVuOworCXVuc2lnbmVkIGNoYXIgKmVpdF9oZHI7CisJdW5zaWduZWQgaW50IGVpdF9oZHJfbGVuOworCXN0cnVjdCB0Y3BoZHIgKnRjcGhkcjsKKwl1aW50MTZfdCBpcHY0X2NzdW1fZW47CisJdWludDE2X3QgdGNwX2lwdjRfY3N1bV9lbjsKKwl1aW50MTZfdCB0Y3BfaXB2Nl9jc3VtX2VuOworCXVpbnQxNl90IGlwX2lkOworCXVpbnQzMl90IHRjcF9zZXFfbnVtOworfTsKKworLyoqCisgKiBfX2NkZl9uYnVmX2dldF90c29fY21uX3NlZ19pbmZvKCkgLSBnZXQgVFNPIGNvbW1vbgorICogaW5mb3JtYXRpb24KKyAqCisgKiBHZXQgdGhlIFRTTyBpbmZvcm1hdGlvbiB0aGF0IGlzIGNvbW1vbiBhY3Jvc3MgYWxsIHRoZSBUQ1AKKyAqIHNlZ21lbnRzIG9mIHRoZSBqdW1ibyBwYWNrZXQKKyAqCisgKiBSZXR1cm46IDAgLSBzdWNjZXNzIDEgLSBmYWlsdXJlCisgKi8KK3VpbnQ4X3QgX19jZGZfbmJ1Zl9nZXRfdHNvX2Ntbl9zZWdfaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCXN0cnVjdCBjZGZfdHNvX2Ntbl9zZWdfaW5mb190ICp0c29faW5mbykKK3sKKwkvKiBHZXQgZXRoZXJuZXQgdHlwZSBhbmQgZXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAqLworCXRzb19pbmZvLT5ldGhwcm90byA9IHZsYW5fZ2V0X3Byb3RvY29sKHNrYik7CisKKwkvKiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGFuIElQdjQgb3IgSVB2NiBwYWNrZXQgKi8KKwlpZiAodHNvX2luZm8tPmV0aHByb3RvID09IGh0b25zKEVUSF9QX0lQKSkgeyAvKiBJUHY0ICovCisJCS8qIGZvciBJUHY0LCBnZXQgdGhlIElQIElEIGFuZCBlbmFibGUgVENQIGFuZCBJUCBjc3VtICovCisJCXN0cnVjdCBpcGhkciAqaXB2NF9oZHIgPSBpcF9oZHIoc2tiKTsKKwkJdHNvX2luZm8tPmlwX2lkID0gbnRvaHMoaXB2NF9oZHItPmlkKTsKKwkJdHNvX2luZm8tPmlwdjRfY3N1bV9lbiA9IDE7CisJCXRzb19pbmZvLT50Y3BfaXB2NF9jc3VtX2VuID0gMTsKKwkJaWYgKGNkZl91bmxpa2VseShpcHY0X2hkci0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApKSB7CisJCQljZGZfcHJpbnQoIlRTTyBJUFY0IHByb3RvIDB4JXggbm90IFRDUFxuIiwKKwkJCQkgaXB2NF9oZHItPnByb3RvY29sKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIGlmICh0c29faW5mby0+ZXRocHJvdG8gPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsgLyogSVB2NiAqLworCQkvKiBmb3IgSVB2NiwgZW5hYmxlIFRDUCBjc3VtLiBObyBJUCBJRCBvciBJUCBjc3VtICovCisJCXRzb19pbmZvLT50Y3BfaXB2Nl9jc3VtX2VuID0gMTsKKwl9IGVsc2UgeworCQljZGZfcHJpbnQoIlRTTzogZXRoZXJ0eXBlIDB4JXggaXMgbm90IHN1cHBvcnRlZCFcbiIsCisJCQkgdHNvX2luZm8tPmV0aHByb3RvKTsKKwkJcmV0dXJuIDE7CisJfQorCisJdHNvX2luZm8tPmwyX2xlbiA9IChza2JfbmV0d29ya19oZWFkZXIoc2tiKSAtIHNrYl9tYWNfaGVhZGVyKHNrYikpOworCXRzb19pbmZvLT50Y3BoZHIgPSB0Y3BfaGRyKHNrYik7CisJdHNvX2luZm8tPnRjcF9zZXFfbnVtID0gbnRvaGwodGNwX2hkcihza2IpLT5zZXEpOworCS8qIGdldCBwb2ludGVyIHRvIHRoZSBldGhlcm5ldCArIElQICsgVENQIGhlYWRlciBhbmQgdGhlaXIgbGVuZ3RoICovCisJdHNvX2luZm8tPmVpdF9oZHIgPSBza2ItPmRhdGE7CisJdHNvX2luZm8tPmVpdF9oZHJfbGVuID0gKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikKKwkJIC0gc2tiX21hY19oZWFkZXIoc2tiKSkgKyB0Y3BfaGRybGVuKHNrYik7CisJdHNvX2luZm8tPmlwX3RjcF9oZHJfbGVuID0gdHNvX2luZm8tPmVpdF9oZHJfbGVuIC0gdHNvX2luZm8tPmwyX2xlbjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX2dldF90c29faW5mbygpIC0gZnVuY3Rpb24gdG8gZGl2aWRlIGEgVFNPIG5idWYKKyAqIGludG8gc2VnbWVudHMKKyAqIEBuYnVmOiAgIG5ldHdvcmsgYnVmZmVyIHRvIGJlIHNlZ21lbnRlZAorICogQHRzb19pbmZvOiAgVGhpcyBpcyB0aGUgb3V0cHV0LiBUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiAgICAgIFRTTyBzZWdtZW50cyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoaW4gdGhpcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZyYWdtZW50cyBhIFRDUCBqdW1ibyBwYWNrZXQgaW50byBzbWFsbGVyCisgKiBzZWdtZW50cyB0byBiZSB0cmFuc21pdHRlZCBieSB0aGUgZHJpdmVyLiBJdCBjaGFpbnMgdGhlIFRTTworICogc2VnbWVudHMgY3JlYXRlZCBpbnRvIGEgbGlzdC4KKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBUU08gc2VnbWVudHMKKyAqLwordWludDMyX3QgX19jZGZfbmJ1Zl9nZXRfdHNvX2luZm8oY2RmX2RldmljZV90IG9zZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlzdHJ1Y3QgY2RmX3Rzb19pbmZvX3QgKnRzb19pbmZvKQoreworCS8qIGNvbW1vbiBhY2Nyb3NzIGFsbCBzZWdtZW50cyAqLworCXN0cnVjdCBjZGZfdHNvX2Ntbl9zZWdfaW5mb190IHRzb19jbW5faW5mbzsKKworCS8qIHNlZ21lbnQgc3BlY2lmaWMgKi8KKwljaGFyICp0c29fZnJhZ192YWRkcjsKKwl1aW50MzJfdCB0c29fZnJhZ19wYWRkcl8zMiA9IDA7CisJdWludDMyX3QgbnVtX3NlZyA9IDA7CisJc3RydWN0IGNkZl90c29fc2VnX2VsZW1fdCAqY3Vycl9zZWc7CisJY29uc3Qgc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZyA9IE5VTEw7CisJdWludDMyX3QgdHNvX2ZyYWdfbGVuID0gMDsgLyogdHNvIHNlZ21lbnQncyBmcmFnbWVudCBsZW5ndGgqLworCXVpbnQzMl90IHNrYl9mcmFnX2xlbiA9IDA7IC8qIHNrYidzIGZyYWdtZW50IGxlbmd0aCAoY29udGlub3VzIG1lbW9yeSkqLworCXVpbnQzMl90IGZvZmZzZXQgPSAwOyAvKiBvZmZzZXQgaW50byB0aGUgc2tiJ3MgZnJhZ21lbnQgKi8KKwl1aW50MzJfdCBza2JfcHJvYyA9IDA7IC8qIGJ5dGVzIG9mIHRoZSBza2IgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkKi8KKwl1aW50MzJfdCB0c29fc2VnX3NpemUgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCisJbWVtc2V0KCZ0c29fY21uX2luZm8sIDB4MCwgc2l6ZW9mKHRzb19jbW5faW5mbykpOworCisJaWYgKGNkZl91bmxpa2VseShfX2NkZl9uYnVmX2dldF90c29fY21uX3NlZ19pbmZvKHNrYiwgJnRzb19jbW5faW5mbykpKSB7CisJCWNkZl9wcmludCgiVFNPOiBlcnJvciBnZXR0aW5nIGNvbW1vbiBzZWdtZW50IGluZm9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJY3Vycl9zZWcgPSB0c29faW5mby0+dHNvX3NlZ19saXN0OworCisJLyogbGVuZ3RoIG9mIHRoZSBmaXJzdCBjaHVuayBvZiBkYXRhIGluIHRoZSBza2IgKi8KKwlza2JfcHJvYyA9IHNrYl9mcmFnX2xlbiA9IHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbjsKKworCS8qIHRoZSAwdGggdHNvIHNlZ21lbnQncyAwdGggZnJhZ21lbnQgYWx3YXlzIGNvbnRhaW5zIHRoZSBFSVQgaGVhZGVyICovCisJLyogdXBkYXRlIHRoZSByZW1haW5pbmcgc2tiIGZyYWdtZW50IGxlbmd0aCBhbmQgVFNPIHNlZ21lbnQgbGVuZ3RoICovCisJc2tiX2ZyYWdfbGVuIC09IHRzb19jbW5faW5mby5laXRfaGRyX2xlbjsKKwlza2JfcHJvYyAtPSB0c29fY21uX2luZm8uZWl0X2hkcl9sZW47CisKKwkvKiBnZXQgdGhlIGFkZHJlc3MgdG8gdGhlIG5leHQgdHNvIGZyYWdtZW50ICovCisJdHNvX2ZyYWdfdmFkZHIgPSBza2ItPmRhdGEgKyB0c29fY21uX2luZm8uZWl0X2hkcl9sZW47CisJLyogZ2V0IHRoZSBsZW5ndGggb2YgdGhlIG5leHQgdHNvIGZyYWdtZW50ICovCisJdHNvX2ZyYWdfbGVuID0gbWluKHNrYl9mcmFnX2xlbiwgdHNvX3NlZ19zaXplKTsKKwl0c29fZnJhZ19wYWRkcl8zMiA9IGRtYV9tYXBfc2luZ2xlKG9zZGV2LT5kZXYsCisJCSB0c29fZnJhZ192YWRkciwgdHNvX2ZyYWdfbGVuLCBETUFfVE9fREVWSUNFKTsKKworCW51bV9zZWcgPSB0c29faW5mby0+bnVtX3NlZ3M7CisJdHNvX2luZm8tPm51bV9zZWdzID0gMDsKKwl0c29faW5mby0+aXNfdHNvID0gMTsKKworCXdoaWxlIChudW1fc2VnICYmIGN1cnJfc2VnKSB7CisJCWludCBpID0gMTsgLyogdHNvIGZyYWdtZW50IGluZGV4ICovCisJCWludCBqID0gMDsgLyogc2tiIGZyYWdtZW50IGluZGV4ICovCisJCXVpbnQ4X3QgbW9yZV90c29fZnJhZ3MgPSAxOworCQl1aW50OF90IGZyb21fZnJhZ190YWJsZSA9IDA7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgZmxhZ3MgdG8gMCAqLworCQltZW1zZXQoJmN1cnJfc2VnLT5zZWcsIDB4MCwgc2l6ZW9mKGN1cnJfc2VnLT5zZWcpKTsKKwkJdHNvX2luZm8tPm51bV9zZWdzKys7CisKKwkJLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgcmVtYWluIHRoZSBzYW1lIGFjcm9zcyBhbGwgc2VnbWVudHMgb2YKKwkJIGEganVtYm8gcGFja2V0ICovCisJCWN1cnJfc2VnLT5zZWcudHNvX2ZsYWdzLnRzb19lbmFibGUgPSAxOworCQljdXJyX3NlZy0+c2VnLnRzb19mbGFncy5wYXJ0aWFsX2NoZWNrc3VtX2VuID0gMDsKKwkJY3Vycl9zZWctPnNlZy50c29fZmxhZ3MuaXB2NF9jaGVja3N1bV9lbiA9CisJCQl0c29fY21uX2luZm8uaXB2NF9jc3VtX2VuOworCQljdXJyX3NlZy0+c2VnLnRzb19mbGFncy50Y3BfaXB2Nl9jaGVja3N1bV9lbiA9CisJCQl0c29fY21uX2luZm8udGNwX2lwdjZfY3N1bV9lbjsKKwkJY3Vycl9zZWctPnNlZy50c29fZmxhZ3MudGNwX2lwdjRfY2hlY2tzdW1fZW4gPQorCQkJdHNvX2Ntbl9pbmZvLnRjcF9pcHY0X2NzdW1fZW47CisJCWN1cnJfc2VnLT5zZWcudHNvX2ZsYWdzLmwyX2xlbiA9IDA7CisJCWN1cnJfc2VnLT5zZWcudHNvX2ZsYWdzLnRjcF9mbGFnc19tYXNrID0gMHgxRkY7CisJCWN1cnJfc2VnLT5zZWcubnVtX2ZyYWdzID0gMDsKKworCQkvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBjaGFuZ2UgZm9yIHRoZSBzZWdtZW50cyAqLworCQljdXJyX3NlZy0+c2VnLnRzb19mbGFncy5pcF9pZCA9IHRzb19jbW5faW5mby5pcF9pZDsKKwkJdHNvX2Ntbl9pbmZvLmlwX2lkKys7CisKKwkJY3Vycl9zZWctPnNlZy50c29fZmxhZ3Muc3luID0gdHNvX2Ntbl9pbmZvLnRjcGhkci0+c3luOworCQljdXJyX3NlZy0+c2VnLnRzb19mbGFncy5yc3QgPSB0c29fY21uX2luZm8udGNwaGRyLT5yc3Q7CisJCWN1cnJfc2VnLT5zZWcudHNvX2ZsYWdzLnBzaCA9IHRzb19jbW5faW5mby50Y3BoZHItPnBzaDsKKwkJY3Vycl9zZWctPnNlZy50c29fZmxhZ3MuYWNrID0gdHNvX2Ntbl9pbmZvLnRjcGhkci0+YWNrOworCQljdXJyX3NlZy0+c2VnLnRzb19mbGFncy51cmcgPSB0c29fY21uX2luZm8udGNwaGRyLT51cmc7CisJCWN1cnJfc2VnLT5zZWcudHNvX2ZsYWdzLmVjZSA9IHRzb19jbW5faW5mby50Y3BoZHItPmVjZTsKKwkJY3Vycl9zZWctPnNlZy50c29fZmxhZ3MuY3dyID0gdHNvX2Ntbl9pbmZvLnRjcGhkci0+Y3dyOworCisJCWN1cnJfc2VnLT5zZWcudHNvX2ZsYWdzLnRjcF9zZXFfbnVtID0gdHNvX2Ntbl9pbmZvLnRjcF9zZXFfbnVtOworCisJCS8qIEZpcnN0IGZyYWdtZW50IGZvciBlYWNoIHNlZ21lbnQgYWx3YXlzIGNvbnRhaW5zIHRoZSBldGhlcm5ldCwKKwkJSVAgYW5kIFRDUCBoZWFkZXIgKi8KKwkJY3Vycl9zZWctPnNlZy50c29fZnJhZ3NbMF0udmFkZHIgPSB0c29fY21uX2luZm8uZWl0X2hkcjsKKwkJY3Vycl9zZWctPnNlZy50c29fZnJhZ3NbMF0ubGVuZ3RoID0gdHNvX2Ntbl9pbmZvLmVpdF9oZHJfbGVuOworCQl0c29faW5mby0+dG90YWxfbGVuID0gY3Vycl9zZWctPnNlZy50c29fZnJhZ3NbMF0ubGVuZ3RoOworCQljdXJyX3NlZy0+c2VnLnRzb19mcmFnc1swXS5wYWRkcl9sb3dfMzIgPQorCQkJIGRtYV9tYXBfc2luZ2xlKG9zZGV2LT5kZXYsIHRzb19jbW5faW5mby5laXRfaGRyLAorCQkJCXRzb19jbW5faW5mby5laXRfaGRyX2xlbiwgRE1BX1RPX0RFVklDRSk7CisJCWN1cnJfc2VnLT5zZWcudHNvX2ZsYWdzLmlwX2xlbiA9IHRzb19jbW5faW5mby5pcF90Y3BfaGRyX2xlbjsKKwkJY3Vycl9zZWctPnNlZy5udW1fZnJhZ3MrKzsKKworCQl3aGlsZSAobW9yZV90c29fZnJhZ3MpIHsKKwkJCWN1cnJfc2VnLT5zZWcudHNvX2ZyYWdzW2ldLnZhZGRyID0gdHNvX2ZyYWdfdmFkZHI7CisJCQljdXJyX3NlZy0+c2VnLnRzb19mcmFnc1tpXS5sZW5ndGggPSB0c29fZnJhZ19sZW47CisJCQl0c29faW5mby0+dG90YWxfbGVuICs9CisJCQkJIGN1cnJfc2VnLT5zZWcudHNvX2ZyYWdzW2ldLmxlbmd0aDsKKwkJCWN1cnJfc2VnLT5zZWcudHNvX2ZsYWdzLmlwX2xlbiArPQorCQkJCSBjdXJyX3NlZy0+c2VnLnRzb19mcmFnc1tpXS5sZW5ndGg7CisJCQljdXJyX3NlZy0+c2VnLm51bV9mcmFncysrOworCQkJc2tiX3Byb2MgPSBza2JfcHJvYyAtIGN1cnJfc2VnLT5zZWcudHNvX2ZyYWdzW2ldLmxlbmd0aDsKKworCQkJLyogaW5jcmVtZW50IHRoZSBUQ1Agc2VxdWVuY2UgbnVtYmVyICovCisJCQl0c29fY21uX2luZm8udGNwX3NlcV9udW0gKz0gdHNvX2ZyYWdfbGVuOworCQkJY3Vycl9zZWctPnNlZy50c29fZnJhZ3NbaV0ucGFkZHJfdXBwZXJfMTYgPSAwOworCQkJY3Vycl9zZWctPnNlZy50c29fZnJhZ3NbaV0ucGFkZHJfbG93XzMyID0KKwkJCQkgdHNvX2ZyYWdfcGFkZHJfMzI7CisKKwkJCS8qIGlmIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSBsZWZ0IGluIHRoZSBza2IgKi8KKwkJCWlmICghc2tiX3Byb2MpCisJCQkJcmV0dXJuIHRzb19pbmZvLT5udW1fc2VnczsKKworCQkJLyogZ2V0IHRoZSBuZXh0IHBheWxvYWQgZnJhZ21lbnQgaW5mb3JtYXRpb24gKi8KKwkJCS8qIGNoZWNrIGlmIHRoZXJlIGFyZSBtb3JlIGZyYWdtZW50cyBpbiB0aGlzIHNlZ21lbnQgKi8KKwkJCWlmICgodHNvX3NlZ19zaXplIC0gdHNvX2ZyYWdfbGVuKSkgeworCQkJCW1vcmVfdHNvX2ZyYWdzID0gMTsKKwkJCQlpKys7CisJCQl9IGVsc2UgeworCQkJCW1vcmVfdHNvX2ZyYWdzID0gMDsKKwkJCQkvKiByZXNldCBpIGFuZCB0aGUgdHNvIHBheWxvYWQgc2l6ZSAqLworCQkJCWkgPSAxOworCQkJCXRzb19zZWdfc2l6ZSA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CisJCQl9CisKKwkJCS8qIGlmIHRoZSBuZXh0IGZyYWdtZW50IGlzIGNvbnRpZ3VvdXMgKi8KKwkJCWlmICh0c29fZnJhZ19sZW4gPCBza2JfZnJhZ19sZW4pIHsKKwkJCQlza2JfZnJhZ19sZW4gPSBza2JfZnJhZ19sZW4gLSB0c29fZnJhZ19sZW47CisJCQkJdHNvX2ZyYWdfbGVuID0gbWluKHNrYl9mcmFnX2xlbiwgdHNvX3NlZ19zaXplKTsKKwkJCQl0c29fZnJhZ192YWRkciA9IHRzb19mcmFnX3ZhZGRyICsgdHNvX2ZyYWdfbGVuOworCQkJCWlmIChmcm9tX2ZyYWdfdGFibGUpIHsKKwkJCQkJdHNvX2ZyYWdfcGFkZHJfMzIgPQorCQkJCQkJIHNrYl9mcmFnX2RtYV9tYXAob3NkZXYtPmRldiwKKwkJCQkJCQkgZnJhZywgZm9mZnNldCwKKwkJCQkJCQkgdHNvX2ZyYWdfbGVuLAorCQkJCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0c29fZnJhZ19wYWRkcl8zMiA9CisJCQkJCQkgZG1hX21hcF9zaW5nbGUob3NkZXYtPmRldiwKKwkJCQkJCQkgdHNvX2ZyYWdfdmFkZHIsCisJCQkJCQkJIHRzb19mcmFnX2xlbiwKKwkJCQkJCQkgRE1BX1RPX0RFVklDRSk7CisJCQkJfQorCQkJfSBlbHNlIHsgLyogdGhlIG5leHQgZnJhZ21lbnQgaXMgbm90IGNvbnRpZ3VvdXMgKi8KKwkJCQl0c29fZnJhZ19sZW4gPSBtaW4oc2tiX2ZyYWdfbGVuLCB0c29fc2VnX3NpemUpOworCQkJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tqXTsKKwkJCQlza2JfZnJhZ19sZW4gPSBza2JfZnJhZ19zaXplKGZyYWcpOworCisJCQkJdHNvX2ZyYWdfdmFkZHIgPSBza2JfZnJhZ19hZGRyZXNzKGZyYWcpOworCQkJCXRzb19mcmFnX3BhZGRyXzMyID0gc2tiX2ZyYWdfZG1hX21hcChvc2Rldi0+ZGV2LAorCQkJCQkgZnJhZywgMCwgdHNvX2ZyYWdfbGVuLAorCQkJCQkgRE1BX1RPX0RFVklDRSk7CisJCQkJZm9mZnNldCArPSB0c29fZnJhZ19sZW47CisJCQkJZnJvbV9mcmFnX3RhYmxlID0gMTsKKwkJCQlqKys7CisJCQl9CisJCX0KKwkJbnVtX3NlZy0tOworCQkvKiBpZiBUQ1AgRklOIGZsYWcgd2FzIHNldCwgc2V0IGl0IGluIHRoZSBsYXN0IHNlZ21lbnQgKi8KKwkJaWYgKCFudW1fc2VnKQorCQkJY3Vycl9zZWctPnNlZy50c29fZmxhZ3MuZmluID0gdHNvX2Ntbl9pbmZvLnRjcGhkci0+ZmluOworCisJCWN1cnJfc2VnID0gY3Vycl9zZWctPm5leHQ7CisJfQorCXJldHVybiB0c29faW5mby0+bnVtX3NlZ3M7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9nZXRfdHNvX251bV9zZWcoKSAtIGZ1bmN0aW9uIHRvIGRpdmlkZSBhIFRTTyBuYnVmCisgKiBpbnRvIHNlZ21lbnRzCisgKiBAbmJ1ZjogICBuZXR3b3JrIGJ1ZmZlciB0byBiZSBzZWdtZW50ZWQKKyAqIEB0c29faW5mbzogIFRoaXMgaXMgdGhlIG91dHB1dC4gVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogICAgICBUU08gc2VnbWVudHMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aGluIHRoaXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBmcmFnbWVudHMgYSBUQ1AganVtYm8gcGFja2V0IGludG8gc21hbGxlcgorICogc2VnbWVudHMgdG8gYmUgdHJhbnNtaXR0ZWQgYnkgdGhlIGRyaXZlci4gSXQgY2hhaW5zIHRoZSBUU08KKyAqIHNlZ21lbnRzIGNyZWF0ZWQgaW50byBhIGxpc3QuCisgKgorICogUmV0dXJuOiAwIC0gc3VjY2VzcywgMSAtIGZhaWx1cmUKKyAqLwordWludDMyX3QgX19jZGZfbmJ1Zl9nZXRfdHNvX251bV9zZWcoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1aW50MzJfdCBnc29fc2l6ZSwgdG1wX2xlbiwgbnVtX3NlZ3MgPSAwOworCisJZ3NvX3NpemUgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCXRtcF9sZW4gPSBza2ItPmxlbiAtICgoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtIHNrYl9tYWNfaGVhZGVyKHNrYikpCisJCSsgdGNwX2hkcmxlbihza2IpKTsKKwl3aGlsZSAodG1wX2xlbikgeworCQludW1fc2VncysrOworCQlpZiAodG1wX2xlbiA+IGdzb19zaXplKQorCQkJdG1wX2xlbiAtPSBnc29fc2l6ZTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCXJldHVybiBudW1fc2VnczsKK30KKworc3RydWN0IHNrX2J1ZmYgKl9fY2RmX25idWZfaW5jX3VzZXJzKHN0cnVjdCBza19idWZmICpza2IpCit7CisJYXRvbWljX2luYygmc2tiLT51c2Vycyk7CisJcmV0dXJuIHNrYjsKK30KKworI2VuZGlmIC8qIEZFQVRVUkVfVFNPICovCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9zcmMvY2RmX3RocmVhZHMuYyBiL2NvcmUvY2RmL3NyYy9jZGZfdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNDA4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvY2RmX3RocmVhZHMuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiAgY2RmX3RocmVhZHMKKyAqCisgKiBDb25uZWN0aXZpdHkgZHJpdmVyIGZyYW1ld29yayAoQ0RGKSB0aHJlYWQgQVBJcworICoKKyAqLworCisvKiBJbmNsdWRlIEZpbGVzICovCisjaW5jbHVkZSA8Y2RmX3RocmVhZHMuaD4KKyNpbmNsdWRlIDxjZGZfdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisvKiBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cyAqLworCisvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbiAqLworCisvKioKKyAqICBjZGZfc2xlZXAoKSAtIHNsZWVwCisgKiAgQG1zSW50ZXJ2YWwgOiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkLgorICogIEEgdmFsdWUgb2YgMCBtYXkgb3IgbWF5IG5vdCBjYXVzZSB0aGUgY3VycmVudCB0aHJlYWQgdG8geWllbGQuCisgKgorICogIFRoaXMgZnVuY3Rpb24gc3VzcGVuZHMgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY3VycmVudCB0aHJlYWQKKyAqICB1bnRpbCB0aGUgc3BlY2lmaWVkIHRpbWUgb3V0IGludGVydmFsIGVsYXBzZXMuCisgKgorICogIFJldHVybjogbm90aGluZworICovCit2b2lkIGNkZl9zbGVlcCh1aW50MzJfdCBtc0ludGVydmFsKQoreworCWlmIChpbl9pbnRlcnJ1cHQoKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCEhISIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwltc2xlZXBfaW50ZXJydXB0aWJsZShtc0ludGVydmFsKTsKK30KKworLyoqCisgKiAgY2RmX3NsZWVwX3VzKCkgLSBzbGVlcAorICogIEB1c0ludGVydmFsIDogTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyB0byBzdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZC4KKyAqICBBIHZhbHVlIG9mIDAgbWF5IG9yIG1heSBub3QgY2F1c2UgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHlpZWxkLgorICoKKyAqICBUaGlzIGZ1bmN0aW9uIHN1c3BlbmRzIHRoZSBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgdGhyZWFkCisgKiAgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lIG91dCBpbnRlcnZhbCBlbGFwc2VzLgorICoKKyAqICBSZXR1cm4gOiBub3RoaW5nCisgKi8KK3ZvaWQgY2RmX3NsZWVwX3VzKHVpbnQzMl90IHVzSW50ZXJ2YWwpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gdXNlY3NfdG9famlmZmllcyh1c0ludGVydmFsKSArIDE7CisJaWYgKGluX2ludGVycnVwdCgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0ISEhIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKHRpbWVvdXQgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVvdXQpOworfQorCisvKioKKyAqICBjZGZfYnVzeV93YWl0KCkgLSBidXN5IHdhaXQKKyAqICBAdXNJbnRlcnZhbCA6IE51bWJlciBvZiBtaWNyb3NlY29uZHMgdG8gYnVzeSB3YWl0LgorICoKKyAqICBUaGlzIGZ1bmN0aW9uIHBsYWNlcyB0aGUgY3VycmVudCB0aHJlYWQgaW4gYnVzeSB3YWl0IHVudGlsIHRoZSBzcGVjaWZpZWQKKyAqICB0aW1lIG91dCBpbnRlcnZhbCBlbGFwc2VzLiBJZiB0aGUgaW50ZXJ2YWwgaXMgZ3JlYXRlciB0aGFuIDUwdXMgb24gV00sIHRoZQorICogIGJlaGF2aW91ciBpcyB1bmRlZmluZWQuCisgKgorICogIFJldHVybiA6IG5vdGhpbmcKKyAqLwordm9pZCBjZGZfYnVzeV93YWl0KHVpbnQzMl90IHVzSW50ZXJ2YWwpCit7CisJdWRlbGF5KHVzSW50ZXJ2YWwpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvc3JjL2NkZl90cmFjZS5jIGIvY29yZS9jZGYvc3JjL2NkZl90cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTljNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvY2RmX3RyYWNlLmMKQEAgLTAsMCArMSwxMDE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqICBET0M6ICBjZGZfdHJhY2UKKyAqCisgKiAgQ29ubmVjdGl2aXR5IGRyaXZlciBmcmFtZXdvcmsgKENERikgdHJhY2UgQVBJcworICoKKyAqICBUcmFjZSwgbG9nZ2luZywgYW5kIGRlYnVnZ2luZyBkZWZpbml0aW9ucyBhbmQgQVBJcworICoKKyAqLworCisvKiBJbmNsdWRlIEZpbGVzICovCisjaW5jbHVkZSA8Y2RmX3RyYWNlLmg+CisjaW5jbHVkZSA8YW5pX2dsb2JhbC5oPgorI2luY2x1ZGUgPHdsYW5fbG9nZ2luZ19zb2NrX3N2Yy5oPgorI2luY2x1ZGUgImNkZl90aW1lLmgiCisvKiBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cyAqLworCisjZGVmaW5lIENERl9UUkFDRV9CVUZGRVJfU0laRSAoNTEyKQorCisvKiBtYWNybyB0byBtYXAgY2RmIHRyYWNlIGxldmVscyBpbnRvIHRoZSBiaXRtYXNrICovCisjZGVmaW5lIENERl9UUkFDRV9MRVZFTF9UT19NT0RVTEVfQklUTUFTSyhfbGV2ZWwpICgoMSA8PCAoX2xldmVsKSkpCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUcmFjZSBsZXZlbCBmb3IgYSBtb2R1bGUsIGFzIGEgYml0bWFzay4gIFRoZSBiaXRzIGluIHRoaXMgbWFzaworCSAqIGFyZSBvcmRlcmVkIGJ5IENERl9UUkFDRV9MRVZFTC4gIEZvciBleGFtcGxlLCBlYWNoIGJpdCByZXByZXNlbnRzCisJICogb25lIG9mIHRoZSBiaXRzIGluIENERl9UUkFDRV9MRVZFTCB0aGF0IG1heSBiZSB0dXJuZWQgb24gdG8gaGF2ZQorCSAqIHRyYWNlcyBhdCB0aGF0IGxldmVsIGxvZ2dlZCwgaS5lLiBpZiBDREZfVFJBQ0VfTEVWRUxfRVJST1IgaXMKKwkgKiA9PSAyLCB0aGVuIGlmIGJpdCAyIChsb3cgb3JkZXIpIGlzIHR1cm5lZCBPTiwgdGhlbiBFUlJPUiB0cmFjZXMKKwkgKiB3aWxsIGJlIHByaW50ZWQgdG8gdGhlIHRyYWNlIGxvZy4KKwkgKiBOb3RlIHRoYXQgYWxsIGJpdHMgdHVybmVkIE9GRiBtZWFucyBubyB0cmFjZXMKKwkgKi8KKwl1aW50MTZfdCBtb2R1bGVUcmFjZUxldmVsOworCisJLyogMyBjaGFyYWN0ZXIgc3RyaW5nIG5hbWUgZm9yIHRoZSBtb2R1bGUgKi8KKwl1bnNpZ25lZCBjaGFyIG1vZHVsZU5hbWVTdHJbNF07IC8qIDMgY2hhcnMgcGx1cyB0aGUgTlVMTCAqLworfSBtb2R1bGVUcmFjZUluZm87CisKKyNkZWZpbmUgQ0RGX0RFRkFVTFRfVFJBQ0VfTEVWRUwJXAorCSgoMSA8PCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwpIHwgKDEgPDwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SKSkKKworLyogQXJyYXkgb2Ygc3RhdGljIGRhdGEgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIHBlciBtb2R1bGUgdHJhY2UKKyAqIGluZm9ybWF0aW9uLiAgVGhpcyBpbmNsdWRlcyB0aGUgdHJhY2UgbGV2ZWwgZm9yIHRoZSBtb2R1bGUgYW5kCisgKiB0aGUgMyBjaGFyYWN0ZXIgJ25hbWUnIG9mIHRoZSBtb2R1bGUgZm9yIG1hcmtpbmcgdGhlIHRyYWNlIGxvZ3MKKyAqLworbW9kdWxlVHJhY2VJbmZvIGdfY2RmX3RyYWNlX2luZm9bQ0RGX01PRFVMRV9JRF9NQVhdID0geworCVtDREZfTU9EVUxFX0lEX1RMU0hJTV0gPSB7Q0RGX0RFRkFVTFRfVFJBQ0VfTEVWRUwsICJEUCJ9LAorCVtDREZfTU9EVUxFX0lEX1dNSV0gPSB7Q0RGX0RFRkFVTFRfVFJBQ0VfTEVWRUwsICJXTUkifSwKKwlbQ0RGX01PRFVMRV9JRF9IRERdID0ge0NERl9ERUZBVUxUX1RSQUNFX0xFVkVMLCAiSEREIn0sCisJW0NERl9NT0RVTEVfSURfU01FXSA9IHtDREZfREVGQVVMVF9UUkFDRV9MRVZFTCwgIlNNRSJ9LAorCVtDREZfTU9EVUxFX0lEX1BFXSA9IHtDREZfREVGQVVMVF9UUkFDRV9MRVZFTCwgIlBFICJ9LAorCVtDREZfTU9EVUxFX0lEX1dNQV0gPSB7Q0RGX0RFRkFVTFRfVFJBQ0VfTEVWRUwsICJXTUEifSwKKwlbQ0RGX01PRFVMRV9JRF9TWVNdID0ge0NERl9ERUZBVUxUX1RSQUNFX0xFVkVMLCAiU1lTIn0sCisJW0NERl9NT0RVTEVfSURfQ0RGXSA9IHtDREZfREVGQVVMVF9UUkFDRV9MRVZFTCwgIkNERiJ9LAorCVtDREZfTU9EVUxFX0lEX1NBUF0gPSB7Q0RGX0RFRkFVTFRfVFJBQ0VfTEVWRUwsICJTQVAifSwKKwlbQ0RGX01PRFVMRV9JRF9IRERfU09GVEFQXSA9IHtDREZfREVGQVVMVF9UUkFDRV9MRVZFTCwgIkhTUCJ9LAorCVtDREZfTU9EVUxFX0lEX0hERF9EQVRBXSA9IHtDREZfREVGQVVMVF9UUkFDRV9MRVZFTCwgIkhEUCJ9LAorCVtDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQV0gPSB7Q0RGX0RFRkFVTFRfVFJBQ0VfTEVWRUwsICJTRFAifSwKKwlbQ0RGX01PRFVMRV9JRF9CTUldID0ge0NERl9ERUZBVUxUX1RSQUNFX0xFVkVMLCAiQk1JIn0sCisJW0NERl9NT0RVTEVfSURfSElGXSA9IHtDREZfREVGQVVMVF9UUkFDRV9MRVZFTCwgIkhJRiJ9LAorCVtDREZfTU9EVUxFX0lEX1RYUlhdID0ge0NERl9ERUZBVUxUX1RSQUNFX0xFVkVMLCAiVFJYIn0sCisJW0NERl9NT0RVTEVfSURfSFRUXSA9IHtDREZfREVGQVVMVF9UUkFDRV9MRVZFTCwgIkhUVCJ9LAorfTsKKworLyogU3RhdGljIGFuZCBHbG9iYWwgdmFyaWFibGVzICovCitzdGF0aWMgc3BpbmxvY2tfdCBsdHJhY2VfbG9jazsKKworc3RhdGljIGNkZl90cmFjZV9yZWNvcmRfdCBnX2NkZl90cmFjZV90YmxbTUFYX0NERl9UUkFDRV9SRUNPUkRTXTsKKy8qIGdsb2JhbCBjZGYgdHJhY2UgZGF0YSAqLworc3RhdGljIHRfY2RmX3RyYWNlX2RhdGEgZ19jZGZfdHJhY2VfZGF0YTsKKy8qCisgKiBhbGwgdGhlIGNhbGwgYmFjayBmdW5jdGlvbnMgZm9yIGR1bXBpbmcgTVRSQUNFIG1lc3NhZ2VzIGZyb20gcmluZyBidWZmZXIKKyAqIGFyZSBzdG9yZWQgaW4gY2RmX3RyYWNlX2NiX3RhYmxlLHRoZXNlIGNhbGxiYWNrcyBhcmUgaW5pdGlhbGl6ZWQgZHVyaW5nIGluaXQKKyAqIG9ubHkgc28sIHdlIHdpbGwgbWFrZSBhIGNvcHkgb2YgdGhlc2UgY2FsbCBiYWNrIGZ1bmN0aW9ucyBhbmQgbWFpbnRhaW4gaW4gdG8KKyAqIGNkZl90cmFjZV9yZXN0b3JlX2NiX3RhYmxlLiBJbmNhc2UgaWYgd2UgbWFrZSBtb2RpZmljYXRpb25zIHRvCisgKiBjZGZfdHJhY2VfY2JfdGFibGUsIHdlIGNhbiBjZXJ0YWlubHkgcmV0cmlldmUgYWxsIHRoZSBjYWxsIGJhY2sgZnVuY3Rpb25zCisgKiBiYWNrIGZyb20gUmVzdG9yZSBUYWJsZQorICovCitzdGF0aWMgdHBfY2RmX3RyYWNlX2NiIGNkZl90cmFjZV9jYl90YWJsZVtDREZfTU9EVUxFX0lEX01BWF07CitzdGF0aWMgdHBfY2RmX3RyYWNlX2NiIGNkZl90cmFjZV9yZXN0b3JlX2NiX3RhYmxlW0NERl9NT0RVTEVfSURfTUFYXTsKKworLyogU3RhdGljIGFuZCBHbG9iYWwgdmFyaWFibGVzICovCitzdGF0aWMgc3BpbmxvY2tfdCBsX2RwX3RyYWNlX2xvY2s7CisKK3N0YXRpYyBzdHJ1Y3QgY2RmX2RwX3RyYWNlX3JlY29yZF9zCisJCQlnX2NkZl9kcF90cmFjZV90YmxbTUFYX0NERl9EUF9UUkFDRV9SRUNPUkRTXTsKKworLyoKKyAqIGFsbCB0aGUgb3B0aW9ucyB0byBjb25maWd1cmUvY29udHJvbCBEUCB0cmFjZSBhcmUKKyAqIGRlZmluZWQgaW4gdGhpcyBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHN0cnVjdCBzX2NkZl9kcF90cmFjZV9kYXRhIGdfY2RmX2RwX3RyYWNlX2RhdGE7CisvKgorICogYWxsIHRoZSBjYWxsIGJhY2sgZnVuY3Rpb25zIGZvciBkdW1waW5nIERQVFJBQ0UgbWVzc2FnZXMgZnJvbSByaW5nIGJ1ZmZlcgorICogYXJlIHN0b3JlZCBpbiBjZGZfZHBfdHJhY2VfY2JfdGFibGUsIGNhbGxiYWNrcyBhcmUgaW5pdGlhbGl6ZWQgZHVyaW5nIGluaXQKKyAqLworc3RhdGljIHRwX2NkZl9kcF90cmFjZV9jYiBjZGZfZHBfdHJhY2VfY2JfdGFibGVbQ0RGX0RQX1RSQUNFX01BWF07CisKKy8qKgorICogY2RmX3RyYWNlX3NldF9sZXZlbCgpIC0gU2V0IHRoZSB0cmFjZSBsZXZlbCBmb3IgYSBwYXJ0aWN1bGFyIG1vZHVsZQorICogQGxldmVsIDogdHJhY2UgbGV2ZWwKKyAqCisgKiBUcmFjZSBsZXZlbCBpcyBhIG1lbWJlciBvZiB0aGUgQ0RGX1RSQUNFX0xFVkVMIGVudW1lcmF0aW9uIGluZGljYXRpbmcKKyAqIHRoZSBzZXZlcml0eSBvZiB0aGUgY29uZGl0aW9uIGNhdXNpbmcgdGhlIHRyYWNlIG1lc3NhZ2UgdG8gYmUgaXNzdWVkLgorICogTW9yZSBzZXZlcmUgY29uZGl0aW9ucyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgbG9nZ2VkLgorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZXJuYWwgQVBJIHRoYXQgYWxsb3dzIHRyYWNlIGxldmVscyB0byBiZSBzZXQgZm9yIGVhY2ggbW9kdWxlLgorICoKKyAqIFJldHVybjogIG5vdGhpbmcKKyAqLwordm9pZCBjZGZfdHJhY2Vfc2V0X2xldmVsKENERl9NT0RVTEVfSUQgbW9kdWxlLCBDREZfVFJBQ0VfTEVWRUwgbGV2ZWwpCit7CisJLyogbWFrZSBzdXJlIHRoZSBjYWxsZXIgaXMgcGFzc2luZyBpbiBhIHZhbGlkIExFVkVMICovCisJaWYgKGxldmVsID49IENERl9UUkFDRV9MRVZFTF9NQVgpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCB0cmFjZSBsZXZlbCAlZCBwYXNzZWQgaW4hXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIGxldmVsKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRyZWF0ICdub25lJyBkaWZmZXJlbnRseS4gIE5PTkUgbWVhbnMgd2UgaGF2ZSB0byBydW4gb2ZmIGFsbAorCSAqIHRoZSBiaXRzIGluIHRoZSBiaXQgbWFzayBzbyBub25lIG9mIHRoZSB0cmFjZXMgYXBwZWFyLiBBbnl0aGluZworCSAqIG90aGVyIHRoYW4gJ25vbmUnIG1lYW5zIHdlIG5lZWQgdG8gdHVybiBPTiBhIGJpdCBpbiB0aGUgYml0bWFzaworCSAqLworCWlmIChDREZfVFJBQ0VfTEVWRUxfTk9ORSA9PSBsZXZlbCkKKwkJZ19jZGZfdHJhY2VfaW5mb1ttb2R1bGVdLm1vZHVsZVRyYWNlTGV2ZWwgPQorCQkJQ0RGX1RSQUNFX0xFVkVMX05PTkU7CisJZWxzZQorCQkvKiBzZXQgdGhlIGRlc2lyZWQgYml0IGluIHRoZSBiaXQgbWFzayBmb3IgdGhlIG1vZHVsZSB0cmFjZQorCQkgKiBsZXZlbCAqLworCQlnX2NkZl90cmFjZV9pbmZvW21vZHVsZV0ubW9kdWxlVHJhY2VMZXZlbCB8PQorCQkJQ0RGX1RSQUNFX0xFVkVMX1RPX01PRFVMRV9CSVRNQVNLKGxldmVsKTsKK30KKworLyoqCisgKiBjZGZfdHJhY2Vfc2V0X21vZHVsZV90cmFjZV9sZXZlbCgpIC0gU2V0IG1vZHVsZSB0cmFjZSBsZXZlbAorICogQG1vZHVsZTogTW9kdWxlIGlkCisgKiBAbGV2ZWw6IFRyYWNlIGxldmVsIGZvciBhIG1vZHVsZSwgYXMgYSBiaXRtYXNrIGFzIHBlciAnbW9kdWxlVHJhY2VJbmZvJworICoKKyAqIFNldHMgdGhlIG1vZHVsZSB0cmFjZSBsZXZlbCB3aGVyZSB0aGUgdHJhY2UgbGV2ZWwgaXMgZ2l2ZW4gYXMgYSBiaXQgbWFzaworICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNkZl90cmFjZV9zZXRfbW9kdWxlX3RyYWNlX2xldmVsKENERl9NT0RVTEVfSUQgbW9kdWxlLCB1aW50MzJfdCBsZXZlbCkKK3sKKwlpZiAobW9kdWxlIDwgMCB8fCBtb2R1bGUgPj0gQ0RGX01PRFVMRV9JRF9NQVgpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBtb2R1bGUgaWQgJWQgcGFzc2VkXG4iLCBfX2Z1bmNfXywgbW9kdWxlKTsKKwkJcmV0dXJuOworCX0KKwlnX2NkZl90cmFjZV9pbmZvW21vZHVsZV0ubW9kdWxlVHJhY2VMZXZlbCA9IGxldmVsOworfQorCit2b2lkIGNkZl90cmFjZV9zZXRfdmFsdWUoQ0RGX01PRFVMRV9JRCBtb2R1bGUsIENERl9UUkFDRV9MRVZFTCBsZXZlbCwKKwkJCSB1aW50OF90IG9uKQoreworCS8qIG1ha2Ugc3VyZSB0aGUgY2FsbGVyIGlzIHBhc3NpbmcgaW4gYSB2YWxpZCBMRVZFTCAqLworCWlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPj0gQ0RGX1RSQUNFX0xFVkVMX01BWCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHRyYWNlIGxldmVsICVkIHBhc3NlZCBpbiFcbiIsIF9fZnVuY19fLAorCQkgICAgICAgbGV2ZWwpOworCQlyZXR1cm47CisJfQorCisJLyogbWFrZSBzdXJlIHRoZSBjYWxsZXIgaXMgcGFzc2luZyBpbiBhIHZhbGlkIG1vZHVsZSAqLworCWlmIChtb2R1bGUgPCAwIHx8IG1vZHVsZSA+PSBDREZfTU9EVUxFX0lEX01BWCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIG1vZHVsZSBpZCAlZCBwYXNzZWQgaW4hXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIG1vZHVsZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUcmVhdCAnbm9uZScgZGlmZmVyZW50bHkuICBOT05FIG1lYW5zIHdlIGhhdmUgdG8gdHVybiBvZmYgYWxsCisJICAgdGhlIGJpdHMgaW4gdGhlIGJpdCBtYXNrIHNvIG5vbmUgb2YgdGhlIHRyYWNlcyBhcHBlYXIgKi8KKwlpZiAoQ0RGX1RSQUNFX0xFVkVMX05PTkUgPT0gbGV2ZWwpIHsKKwkJZ19jZGZfdHJhY2VfaW5mb1ttb2R1bGVdLm1vZHVsZVRyYWNlTGV2ZWwgPQorCQkJQ0RGX1RSQUNFX0xFVkVMX05PTkU7CisJfQorCS8qIFRyZWF0ICdBbGwnIGRpZmZlcmVudGx5LiAgQWxsIG1lYW5zIHdlIGhhdmUgdG8gdHVybiBvbiBhbGwKKwkgICB0aGUgYml0cyBpbiB0aGUgYml0IG1hc2sgc28gYWxsIG9mIHRoZSB0cmFjZXMgYXBwZWFyICovCisJZWxzZSBpZiAoQ0RGX1RSQUNFX0xFVkVMX0FMTCA9PSBsZXZlbCkgeworCQlnX2NkZl90cmFjZV9pbmZvW21vZHVsZV0ubW9kdWxlVHJhY2VMZXZlbCA9IDB4RkZGRjsKKwl9IGVsc2UgeworCQlpZiAob24pCisJCQkvKiBzZXQgdGhlIGRlc2lyZWQgYml0IGluIHRoZSBiaXQgbWFzayBmb3IgdGhlIG1vZHVsZQorCQkJICAgdHJhY2UgbGV2ZWwgKi8KKwkJCWdfY2RmX3RyYWNlX2luZm9bbW9kdWxlXS5tb2R1bGVUcmFjZUxldmVsIHw9CisJCQkJQ0RGX1RSQUNFX0xFVkVMX1RPX01PRFVMRV9CSVRNQVNLKGxldmVsKTsKKwkJZWxzZQorCQkJLyogY2xlYXIgdGhlIGRlc2lyZWQgYml0IGluIHRoZSBiaXQgbWFzayBmb3IgdGhlIG1vZHVsZQorCQkJICAgdHJhY2UgbGV2ZWwgKi8KKwkJCWdfY2RmX3RyYWNlX2luZm9bbW9kdWxlXS5tb2R1bGVUcmFjZUxldmVsICY9CisJCQkJfihDREZfVFJBQ0VfTEVWRUxfVE9fTU9EVUxFX0JJVE1BU0sobGV2ZWwpKTsKKwl9Cit9CisKKy8qKgorICogY2RmX3RyYWNlX2dldF9sZXZlbCgpIC0gZ2V0IHRoZSB0cmFjZSBsZXZlbAorICogQGxldmVsIDogdHJhY2UgbGV2ZWwKKyAqCisgKiBUaGlzIGlzIGFuIGV4dGVybmFsIEFQSSB0aGF0IHJldHVybnMgYSBib29sIHZhbHVlIHRvIHNpZ25pZnkgaWYgYQorICogcGFydGljdWxhciB0cmFjZSBsZXZlbCBpcyBzZXQgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLgorICogQSBtZW1iZXIgb2YgdGhlIENERl9UUkFDRV9MRVZFTCBlbnVtZXJhdGlvbiBpbmRpY2F0aW5nIHRoZSBzZXZlcml0eQorICogb2YgdGhlIGNvbmRpdGlvbiBjYXVzaW5nIHRoZSB0cmFjZSBtZXNzYWdlIHRvIGJlIGlzc3VlZC4KKyAqCisgKiBOb3RlIHRoYXQgaW5kaXZpZHVhbCB0cmFjZSBsZXZlbHMgYXJlIHRoZSBvbmx5IHZhbGlkIHZhbHVlcworICogZm9yIHRoaXMgQVBJLiAgQ0RGX1RSQUNFX0xFVkVMX05PTkUgYW5kIENERl9UUkFDRV9MRVZFTF9BTEwKKyAqIGFyZSBub3QgdmFsaWQgaW5wdXQgYW5kIHdpbGwgcmV0dXJuIGZhbHNlCisgKgorICogUmV0dXJuOgorICogICAgICBmYWxzZSAtIHRoZSBzcGVjaWZpZWQgdHJhY2UgbGV2ZWwgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlIGlzIE9GRgorICogICAgICB0cnVlIC0gdGhlIHNwZWNpZmllZCB0cmFjZSBsZXZlbCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUgaXMgT04KKyAqLworYm9vbCBjZGZfdHJhY2VfZ2V0X2xldmVsKENERl9NT0RVTEVfSUQgbW9kdWxlLCBDREZfVFJBQ0VfTEVWRUwgbGV2ZWwpCit7CisJYm9vbCB0cmFjZU9uID0gZmFsc2U7CisKKwlpZiAoKENERl9UUkFDRV9MRVZFTF9OT05FID09IGxldmVsKSB8fAorCSAgICAoQ0RGX1RSQUNFX0xFVkVMX0FMTCA9PSBsZXZlbCkgfHwgKGxldmVsID49IENERl9UUkFDRV9MRVZFTF9NQVgpKSB7CisJCXRyYWNlT24gPSBmYWxzZTsKKwl9IGVsc2UgeworCQl0cmFjZU9uID0gKGxldmVsICYgZ19jZGZfdHJhY2VfaW5mb1ttb2R1bGVdLm1vZHVsZVRyYWNlTGV2ZWwpCisJCQkgID8gdHJ1ZSA6IGZhbHNlOworCX0KKworCXJldHVybiB0cmFjZU9uOworfQorCit2b2lkIGNkZl9zbnByaW50ZihjaGFyICpzdHJCdWZmZXIsIHVuc2lnbmVkIGludCBzaXplLCBjaGFyICpzdHJGb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IHZhbDsKKworCXZhX3N0YXJ0KHZhbCwgc3RyRm9ybWF0KTsKKwlzbnByaW50ZihzdHJCdWZmZXIsIHNpemUsIHN0ckZvcm1hdCwgdmFsKTsKKwl2YV9lbmQodmFsKTsKK30KKworI2lmZGVmIENERl9FTkFCTEVfVFJBQ0lORworCisvKioKKyAqIGNkZl90cmFjZV9tc2coKSAtIGV4dGVybmFsbHkgY2FsbGVkIHRyYWNlIGZ1bmN0aW9uCisgKiBAbW9kdWxlIDogTW9kdWxlIGlkZW50aWZpZXIgYSBtZW1iZXIgb2YgdGhlIENERl9NT0RVTEVfSUQKKyAqCWVudW1lcmF0aW9uIHRoYXQgaWRlbnRpZmllcyB0aGUgbW9kdWxlIGlzc3VpbmcgdGhlIHRyYWNlIG1lc3NhZ2UuCisgKiBAbGV2ZWwgOiBUcmFjZSBsZXZlbCBhIG1lbWJlciBvZiB0aGUgQ0RGX1RSQUNFX0xFVkVMIGVudW1lcmF0aW9uCisgKglpbmRpY2F0aW5nIHRoZSBzZXZlcml0eSBvZiB0aGUgY29uZGl0aW9uIGNhdXNpbmcgdGhlIHRyYWNlIG1lc3NhZ2UKKyAqCXRvIGJlIGlzc3VlZC4gICBNb3JlIHNldmVyZSBjb25kaXRpb25zIGFyZSBtb3JlIGxpa2VseSB0byBiZSBsb2dnZWQuCisgKiBAc3RyRm9ybWF0IDogRm9ybWF0IHN0cmluZyAgaW4gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLiAgVGhpcyBmb3JtYXQKKyAqCXN0cmluZyBjb250YWlucyBwcmludGYtbGlrZSByZXBsYWNlbWVudCBwYXJhbWV0ZXJzLCB3aGljaCBmb2xsb3cKKyAqCXRoaXMgcGFyYW1ldGVyIGluIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0LgorICoKKyAqICBDaGVja3MgdGhlIGxldmVsIG9mIHNldmVyaXR5IGFuZCBhY2NvcmRpbmdseSBwcmludHMgdGhlIHRyYWNlIG1lc3NhZ2VzCisgKgorICogIFJldHVybjogIG5vdGhpbmcKKyAqCisgKi8KK3ZvaWQgY2RmX3RyYWNlX21zZyhDREZfTU9EVUxFX0lEIG1vZHVsZSwgQ0RGX1RSQUNFX0xFVkVMIGxldmVsLAorCQkgICBjaGFyICpzdHJGb3JtYXQsIC4uLikKK3sKKwljaGFyIHN0ckJ1ZmZlcltDREZfVFJBQ0VfQlVGRkVSX1NJWkVdOworCWludCBuOworCisJLyogUHJpbnQgdGhlIHRyYWNlIG1lc3NhZ2Ugd2hlbiB0aGUgZGVzaXJlZCBsZXZlbCBiaXQgaXMgc2V0IGluCisJICAgdGhlIG1vZHVsZSB0cmFjZWwgbGV2ZWwgbWFzayAqLworCWlmIChnX2NkZl90cmFjZV9pbmZvW21vZHVsZV0ubW9kdWxlVHJhY2VMZXZlbCAmCisJICAgIENERl9UUkFDRV9MRVZFTF9UT19NT0RVTEVfQklUTUFTSyhsZXZlbCkpIHsKKwkJLyogdGhlIHRyYWNlIGxldmVsIHN0cmluZ3MgaW4gYW4gYXJyYXkuICB0aGVzZSBhcmUgb3JkZXJlZCBpbgorCQkgKiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgdHJhY2UgbGV2ZWxzIGFyZSBkZWZpbmVkIGluIHRoZSBlbnVtCisJCSAqIChzZWUgQ0RGX1RSQUNFX0xFVkVMKSBzbyB3ZSBjYW4gaW5kZXggaW50byB0aGlzIGFycmF5IHdpdGgKKwkJICogdGhlIGxldmVsIGFuZCBnZXQgdGhlIHJpZ2h0IHN0cmluZy4gVGhlIGNkZiB0cmFjZSBsZXZlbHMKKwkJICogYXJlLi4uIG5vbmUsIEZhdGFsLCBFcnJvciwgV2FybmluZywgSW5mbywgSW5mb0hpZ2gsIEluZm9NZWQsCisJCSAqIEluZm9Mb3csIERlYnVnCisJCSAqLworCQlzdGF0aWMgY29uc3QgY2hhciAqVFJBQ0VfTEVWRUxfU1RSW10gPSB7ICIgICIsICJGICIsICJFICIsICJXICIsCisJCQkJCQkiSSAiLCAiSUgiLCAiSU0iLCAiSUwiLCAiRCIgfTsKKwkJdmFfbGlzdCB2YWw7CisJCXZhX3N0YXJ0KHZhbCwgc3RyRm9ybWF0KTsKKworCQkvKiBwcmludCB0aGUgcHJlZml4IHN0cmluZyBpbnRvIHRoZSBzdHJpbmcgYnVmZmVyLi4uICovCisJCW4gPSBzbnByaW50ZihzdHJCdWZmZXIsIENERl9UUkFDRV9CVUZGRVJfU0laRSwKKwkJCSAgICAgIndsYW46IFslZDolMnM6JTNzXSAiLAorCQkJICAgICBpbl9pbnRlcnJ1cHQoKSA/IDAgOiBjdXJyZW50LT5waWQsCisJCQkgICAgIChjaGFyICopVFJBQ0VfTEVWRUxfU1RSW2xldmVsXSwKKwkJCSAgICAgKGNoYXIgKilnX2NkZl90cmFjZV9pbmZvW21vZHVsZV0ubW9kdWxlTmFtZVN0cik7CisKKwkJLyogcHJpbnQgdGhlIGZvcm1hdHRlZCBsb2cgbWVzc2FnZSBhZnRlciB0aGUgcHJlZml4IHN0cmluZyAqLworCQlpZiAoKG4gPj0gMCkgJiYgKG4gPCBDREZfVFJBQ0VfQlVGRkVSX1NJWkUpKSB7CisJCQl2c25wcmludGYoc3RyQnVmZmVyICsgbiwgQ0RGX1RSQUNFX0JVRkZFUl9TSVpFIC0gbiwKKwkJCQkgIHN0ckZvcm1hdCwgdmFsKTsKKyNpZiBkZWZpbmVkKFdMQU5fTE9HR0lOR19TT0NLX1NWQ19FTkFCTEUpCisJCQl3bGFuX2xvZ190b191c2VyKGxldmVsLCAoY2hhciAqKXN0ckJ1ZmZlciwKKwkJCQkJIHN0cmxlbihzdHJCdWZmZXIpKTsKKyNlbHNlCisJCQlwcl9lcnIoIiVzXG4iLCBzdHJCdWZmZXIpOworI2VuZGlmCisJCX0KKwkJdmFfZW5kKHZhbCk7CisJfQorfQorCit2b2lkIGNkZl90cmFjZV9kaXNwbGF5KHZvaWQpCit7CisJQ0RGX01PRFVMRV9JRCBtb2R1bGVJZDsKKworCXByX2VycgorCQkoIiAgICAgMSlGQVRBTCAgMilFUlJPUiAgMylXQVJOICA0KUlORk8gIDUpSU5GT19IICA2KUlORk9fTSAgNylJTkZPX0wgOClERUJVR1xuIik7CisJZm9yIChtb2R1bGVJZCA9IDA7IG1vZHVsZUlkIDwgQ0RGX01PRFVMRV9JRF9NQVg7ICsrbW9kdWxlSWQpIHsKKwkJcHJfZXJyCisJCQkoIiUyZCklcyAgICAlcyAgICAgICAgJXMgICAgICAgJXMgICAgICAgJXMgICAgICAgICVzICAgICAgICAgJXMgICAgICAgICAlcyAgICAgICAgJXNcbiIsCisJCQkoaW50KW1vZHVsZUlkLCBnX2NkZl90cmFjZV9pbmZvW21vZHVsZUlkXS5tb2R1bGVOYW1lU3RyLAorCQkJKGdfY2RmX3RyYWNlX2luZm9bbW9kdWxlSWRdLgorCQkJIG1vZHVsZVRyYWNlTGV2ZWwgJiAoMSA8PCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwpKSA/ICJYIiA6CisJCQkiICIsCisJCQkoZ19jZGZfdHJhY2VfaW5mb1ttb2R1bGVJZF0uCisJCQkgbW9kdWxlVHJhY2VMZXZlbCAmICgxIDw8IENERl9UUkFDRV9MRVZFTF9FUlJPUikpID8gIlgiIDoKKwkJCSIgIiwKKwkJCShnX2NkZl90cmFjZV9pbmZvW21vZHVsZUlkXS4KKwkJCSBtb2R1bGVUcmFjZUxldmVsICYgKDEgPDwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4pKSA/ICJYIiA6CisJCQkiICIsCisJCQkoZ19jZGZfdHJhY2VfaW5mb1ttb2R1bGVJZF0uCisJCQkgbW9kdWxlVHJhY2VMZXZlbCAmICgxIDw8IENERl9UUkFDRV9MRVZFTF9JTkZPKSkgPyAiWCIgOgorCQkJIiAiLAorCQkJKGdfY2RmX3RyYWNlX2luZm9bbW9kdWxlSWRdLgorCQkJIG1vZHVsZVRyYWNlTGV2ZWwgJiAoMSA8PCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdIKSkgPyAiWCIKKwkJCTogIiAiLAorCQkJKGdfY2RmX3RyYWNlX2luZm9bbW9kdWxlSWRdLgorCQkJIG1vZHVsZVRyYWNlTGV2ZWwgJiAoMSA8PCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQpKSA/ICJYIgorCQkJOiAiICIsCisJCQkoZ19jZGZfdHJhY2VfaW5mb1ttb2R1bGVJZF0uCisJCQkgbW9kdWxlVHJhY2VMZXZlbCAmICgxIDw8IENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVykpID8gIlgiCisJCQk6ICIgIiwKKwkJCShnX2NkZl90cmFjZV9pbmZvW21vZHVsZUlkXS4KKwkJCSBtb2R1bGVUcmFjZUxldmVsICYgKDEgPDwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHKSkgPyAiWCIgOgorCQkJIiAiKTsKKwl9Cit9CisKKy8qKgorICogY2RmX3RyYWNlX2hleF9kdW1wKCkgLSBleHRlcm5hbGx5IGNhbGxlZCBoZXggZHVtcCBmdW5jdGlvbgorICogQG1vZHVsZSA6IE1vZHVsZSBpZGVudGlmaWVyIGEgbWVtYmVyIG9mIHRoZSBDREZfTU9EVUxFX0lEIGVudW1lcmF0aW9uIHRoYXQKKyAqCSAgICAgaWRlbnRpZmllcyB0aGUgbW9kdWxlIGlzc3VpbmcgdGhlIHRyYWNlIG1lc3NhZ2UuCisgKiBAbGV2ZWwgOiBUcmFjZSBsZXZlbCBhIG1lbWJlciBvZiB0aGUgQ0RGX1RSQUNFX0xFVkVMIGVudW1lcmF0aW9uIGluZGljYXRpbmcKKyAqCSAgICB0aGUgc2V2ZXJpdHkgb2YgdGhlIGNvbmRpdGlvbiBjYXVzaW5nIHRoZSB0cmFjZSBtZXNzYWdlIHRvIGJlCisgKgkgICAgaXNzdWVkLiBNb3JlIHNldmVyZSBjb25kaXRpb25zIGFyZSBtb3JlIGxpa2VseSB0byBiZSBsb2dnZWQuCisgKiBAZGF0YSA6IFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBiZSBsb2dnZWQuCisgKiBAYnVmX2xlbiA6IFRoZSBzaXplIG9mIHRoZSBidWZmZXIgdG8gYmUgbG9nZ2VkLgorICoKKyAqICBDaGVja3MgdGhlIGxldmVsIG9mIHNldmVyaXR5IGFuZCBhY2NvcmRpbmdseSBwcmludHMgdGhlIHRyYWNlIG1lc3NhZ2VzCisgKgorICogIFJldHVybiA6ICBub3RoaW5nCisgKi8KK3ZvaWQgY2RmX3RyYWNlX2hleF9kdW1wKENERl9NT0RVTEVfSUQgbW9kdWxlLCBDREZfVFJBQ0VfTEVWRUwgbGV2ZWwsCisJCQl2b2lkICpkYXRhLCBpbnQgYnVmX2xlbikKK3sKKwljaGFyICpidWYgPSAoY2hhciAqKWRhdGE7CisJaW50IGk7CisKKwlpZiAoIShnX2NkZl90cmFjZV9pbmZvW21vZHVsZV0ubW9kdWxlVHJhY2VMZXZlbCAmCisJICAgICAgQ0RGX1RSQUNFX0xFVkVMX1RPX01PRFVMRV9CSVRNQVNLKGxldmVsKSkpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IChpICsgMTUpIDwgYnVmX2xlbjsgaSArPSAxNikgeworCQljZGZfdHJhY2VfbXNnKG1vZHVsZSwgbGV2ZWwsCisJCQkgICAgICAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCIsCisJCQkgICAgICBidWZbaV0sCisJCQkgICAgICBidWZbaSArIDFdLAorCQkJICAgICAgYnVmW2kgKyAyXSwKKwkJCSAgICAgIGJ1ZltpICsgM10sCisJCQkgICAgICBidWZbaSArIDRdLAorCQkJICAgICAgYnVmW2kgKyA1XSwKKwkJCSAgICAgIGJ1ZltpICsgNl0sCisJCQkgICAgICBidWZbaSArIDddLAorCQkJICAgICAgYnVmW2kgKyA4XSwKKwkJCSAgICAgIGJ1ZltpICsgOV0sCisJCQkgICAgICBidWZbaSArIDEwXSwKKwkJCSAgICAgIGJ1ZltpICsgMTFdLAorCQkJICAgICAgYnVmW2kgKyAxMl0sCisJCQkgICAgICBidWZbaSArIDEzXSwgYnVmW2kgKyAxNF0sIGJ1ZltpICsgMTVdKTsKKwl9CisKKwkvKiBEdW1wIHRoZSBieXRlcyBpbiB0aGUgbGFzdCBsaW5lICovCisJZm9yICg7IGkgPCBidWZfbGVuOyBpKyspCisJCWNkZl90cmFjZV9tc2cobW9kdWxlLCBsZXZlbCwgIiUwMnggIiwgYnVmW2ldKTsKK30KKworI2VuZGlmCisKKy8qKgorICogY2RmX3RyYWNlX2VuYWJsZSgpIC0gRW5hYmxlIE1UUkFDRSBmb3Igc3BlY2lmaWMgbW9kdWxlcworICogQGJpdG1hc2tfb2ZfbW9kdWxlSWQgOiBCaXRtYXNrIGFjY29yZGluZyB0byBlbnVtIG9mIHRoZSBtb2R1bGVzLgorICogIDMyIFtkZWNdICA9IDAwMTAgMDAwMCBbYmluXSA8ZW51bSBvZiBIREQgaXMgNT4KKyAqICA2NCBbZGVjXSAgPSAwMTAwIDAwMDAgW2Jpbl0gPGVudW0gb2YgU01FIGlzIDY+CisgKiAgMTI4IFtkZWNdID0gMTAwMCAwMDAwIFtiaW5dIDxlbnVtIG9mIFBFIGlzIDc+CisgKiBAZW5hYmxlIDogY2FuIGJlIHRydWUgb3IgZmFsc2UgdHJ1ZSBpbXBsaWVzIGVuYWJsaW5nIE1UUkFDRSBmYWxzZSBpbXBsaWVzCisgKgkJZGlzYWJsaW5nIE1UUkFDRS4KKyAqCisgKiBFbmFibGUgTVRSQUNFIGZvciBzcGVjaWZpYyBtb2R1bGVzIHdob3NlIGJpdHMgYXJlIHNldCBpbiBiaXRtYXNrIGFuZCBlbmFibGUKKyAqIGlzIHRydWUuIGlmIGVuYWJsZSBpcyBmYWxzZSBpdCBkaXNhYmxlcyBNVFJBQ0UgZm9yIHRoYXQgbW9kdWxlLiBzZXQgdGhlCisgKiBiaXRtYXNrIGFjY29yZGluZyB0byBlbnVtIHZhbHVlIG9mIHRoZSBtb2R1bGVzLgorICogVGhpcyBmdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgd2hlbiB5b3UgaXNzdWUgaW9jdGwgYXMgbWVudGlvbmVkIGZvbGxvd2luZworICogW2l3cHJpdiB3bGFuMCBzZXRkdW1wbG9nIDx2YWx1ZT4gPGVuYWJsZT5dLgorICogPHZhbHVlPiAtIERlY2ltYWwgbnVtYmVyLCBpLmUuIDY0IGRlY2ltYWwgdmFsdWUgc2hvd3Mgb25seSBTTUUgbW9kdWxlLAorICogMTI4IGRlY2ltYWwgdmFsdWUgc2hvd3Mgb25seSBQRSBtb2R1bGUsIDE5MiBkZWNpbWFsIHZhbHVlIHNob3dzIFBFIGFuZCBTTUUuCisgKgorICoKKyAqIFJldHVybiA6IG5vdGhpbmcKKyAqLwordm9pZCBjZGZfdHJhY2VfZW5hYmxlKHVpbnQzMl90IGJpdG1hc2tfb2ZfbW9kdWxlSWQsIHVpbnQ4X3QgZW5hYmxlKQoreworCWludCBpOworCWlmIChiaXRtYXNrX29mX21vZHVsZUlkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBDREZfTU9EVUxFX0lEX01BWDsgaSsrKSB7CisJCQlpZiAoKChiaXRtYXNrX29mX21vZHVsZUlkID4+IGkpICYgMSkpIHsKKwkJCQlpZiAoZW5hYmxlKSB7CisJCQkJCWlmIChOVUxMICE9CisJCQkJCSAgICBjZGZfdHJhY2VfcmVzdG9yZV9jYl90YWJsZVtpXSkgeworCQkJCQkJY2RmX3RyYWNlX2NiX3RhYmxlW2ldID0KKwkJCQkJCWNkZl90cmFjZV9yZXN0b3JlX2NiX3RhYmxlW2ldOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJY2RmX3RyYWNlX3Jlc3RvcmVfY2JfdGFibGVbaV0gPQorCQkJCQkJY2RmX3RyYWNlX2NiX3RhYmxlW2ldOworCQkJCQljZGZfdHJhY2VfY2JfdGFibGVbaV0gPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChlbmFibGUpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBDREZfTU9EVUxFX0lEX01BWDsgaSsrKSB7CisJCQkJaWYgKE5VTEwgIT0gY2RmX3RyYWNlX3Jlc3RvcmVfY2JfdGFibGVbaV0pIHsKKwkJCQkJY2RmX3RyYWNlX2NiX3RhYmxlW2ldID0KKwkJCQkJCWNkZl90cmFjZV9yZXN0b3JlX2NiX3RhYmxlW2ldOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBDREZfTU9EVUxFX0lEX01BWDsgaSsrKSB7CisJCQkJY2RmX3RyYWNlX3Jlc3RvcmVfY2JfdGFibGVbaV0gPQorCQkJCQljZGZfdHJhY2VfY2JfdGFibGVbaV07CisJCQkJY2RmX3RyYWNlX2NiX3RhYmxlW2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBjZGZfdHJhY2VfaW5pdCgpIC0gaW5pdGlhbGl6ZXMgY2RmIHRyYWNlIHN0cnVjdHVyZXMgYW5kIHZhcmlhYmxlcworICoKKyAqIENhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBjZHNfcHJlb3Blbiwgc28gdGhhdCB3ZSBjYW4gc3RhcnQgcmVjb3JkaW5nIEhERAorICogZXZlbnRzIEFTQVAuCisgKgorICogUmV0dXJuIDogbm90aGluZworICovCit2b2lkIGNkZl90cmFjZV9pbml0KHZvaWQpCit7CisJdWludDhfdCBpOworCWdfY2RmX3RyYWNlX2RhdGEuaGVhZCA9IElOVkFMSURfQ0RGX1RSQUNFX0FERFI7CisJZ19jZGZfdHJhY2VfZGF0YS50YWlsID0gSU5WQUxJRF9DREZfVFJBQ0VfQUREUjsKKwlnX2NkZl90cmFjZV9kYXRhLm51bSA9IDA7CisJZ19jZGZfdHJhY2VfZGF0YS5lbmFibGUgPSB0cnVlOworCWdfY2RmX3RyYWNlX2RhdGEuZHVtcENvdW50ID0gREVGQVVMVF9DREZfVFJBQ0VfRFVNUF9DT1VOVDsKKwlnX2NkZl90cmFjZV9kYXRhLm51bVNpbmNlTGFzdER1bXAgPSAwOworCisJZm9yIChpID0gMDsgaSA8IENERl9NT0RVTEVfSURfTUFYOyBpKyspIHsKKwkJY2RmX3RyYWNlX2NiX3RhYmxlW2ldID0gTlVMTDsKKwkJY2RmX3RyYWNlX3Jlc3RvcmVfY2JfdGFibGVbaV0gPSBOVUxMOworCX0KK30KKworLyoqCisgKiBjZGZfdHJhY2UoKSAtIHB1dHMgdGhlIG1lc3NhZ2VzIGluIHRvIHJpbmctYnVmZmVyCisgKiBAbW9kdWxlIDogRW51bSBvZiBtb2R1bGUsIGJhc2ljYWxseSBtb2R1bGUgaWQuCisgKiBAcGFyYW0gOiBDb2RlIHRvIGJlIHJlY29yZGVkCisgKiBAc2Vzc2lvbiA6IFNlc3Npb24gSUQgb2YgdGhlIGxvZworICogQGRhdGEgOiBBY3R1YWwgbWVzc2FnZSBjb250ZW50cworICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZnJvbSBlYWNoIG1vZHVsZSB3aG8gd2FudHMgcmVjb3JkIHRoZSBtZXNzYWdlcworICogaW4gY2lyY3VsYXIgcXVldWUuIEJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb25zIG1ha2Ugc3VyZSB5b3UgaGF2ZQorICogcmVnaXN0ZXJlZCB5b3VyIG1vZHVsZSB3aXRoIGNkZiB0aHJvdWdoIGNkZl90cmFjZV9yZWdpc3RlciBmdW5jdGlvbi4KKyAqCisgKgorICogUmV0dXJuIDogbm90aGluZworICovCit2b2lkIGNkZl90cmFjZSh1aW50OF90IG1vZHVsZSwgdWludDhfdCBjb2RlLCB1aW50MTZfdCBzZXNzaW9uLCB1aW50MzJfdCBkYXRhKQoreworCXRwX2NkZl90cmFjZV9yZWNvcmQgcmVjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFnX2NkZl90cmFjZV9kYXRhLmVuYWJsZSkKKwkJcmV0dXJuOworCisJLyogaWYgbW9kdWxlIGlzIG5vdCByZWdpc3RlcmVkLCBkb24ndCByZWNvcmQgZm9yIHRoYXQgbW9kdWxlICovCisJaWYgKE5VTEwgPT0gY2RmX3RyYWNlX2NiX3RhYmxlW21vZHVsZV0pCisJCXJldHVybjsKKworCS8qIEFxdWlyZSB0aGUgbG9jayBzbyB0aGF0IG9ubHkgb25lIHRocmVhZCBhdCBhIHRpbWUgY2FuIGZpbGwgdGhlIHJpbmcKKwkgKiBidWZmZXIKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHRyYWNlX2xvY2ssIGZsYWdzKTsKKworCWdfY2RmX3RyYWNlX2RhdGEubnVtKys7CisKKwlpZiAoZ19jZGZfdHJhY2VfZGF0YS5udW0gPiBNQVhfQ0RGX1RSQUNFX1JFQ09SRFMpCisJCWdfY2RmX3RyYWNlX2RhdGEubnVtID0gTUFYX0NERl9UUkFDRV9SRUNPUkRTOworCisJaWYgKElOVkFMSURfQ0RGX1RSQUNFX0FERFIgPT0gZ19jZGZfdHJhY2VfZGF0YS5oZWFkKSB7CisJCS8qIGZpcnN0IHJlY29yZCAqLworCQlnX2NkZl90cmFjZV9kYXRhLmhlYWQgPSAwOworCQlnX2NkZl90cmFjZV9kYXRhLnRhaWwgPSAwOworCX0gZWxzZSB7CisJCS8qIHF1ZXVlIGlzIG5vdCBlbXB0eSAqLworCQl1aW50MzJfdCB0YWlsID0gZ19jZGZfdHJhY2VfZGF0YS50YWlsICsgMTsKKworCQlpZiAoTUFYX0NERl9UUkFDRV9SRUNPUkRTID09IHRhaWwpCisJCQl0YWlsID0gMDsKKworCQlpZiAoZ19jZGZfdHJhY2VfZGF0YS5oZWFkID09IHRhaWwpIHsKKwkJCS8qIGZ1bGwgKi8KKwkJCWlmIChNQVhfQ0RGX1RSQUNFX1JFQ09SRFMgPT0gKytnX2NkZl90cmFjZV9kYXRhLmhlYWQpCisJCQkJZ19jZGZfdHJhY2VfZGF0YS5oZWFkID0gMDsKKwkJfQorCQlnX2NkZl90cmFjZV9kYXRhLnRhaWwgPSB0YWlsOworCX0KKworCXJlYyA9ICZnX2NkZl90cmFjZV90YmxbZ19jZGZfdHJhY2VfZGF0YS50YWlsXTsKKwlyZWMtPmNvZGUgPSBjb2RlOworCXJlYy0+c2Vzc2lvbiA9IHNlc3Npb247CisJcmVjLT5kYXRhID0gZGF0YTsKKwlyZWMtPnRpbWUgPSBjZGZfZ2V0X2xvZ190aW1lc3RhbXAoKTsKKwlyZWMtPm1vZHVsZSA9IG1vZHVsZTsKKwlyZWMtPnBpZCA9IChpbl9pbnRlcnJ1cHQoKSA/IDAgOiBjdXJyZW50LT5waWQpOworCWdfY2RmX3RyYWNlX2RhdGEubnVtU2luY2VMYXN0RHVtcCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx0cmFjZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogY2RmX3RyYWNlX3NwaW5fbG9ja19pbml0KCkgLSBpbml0aWFsaXplcyB0aGUgbG9jayB2YXJpYWJsZSBiZWZvcmUgdXNlCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmcm9tIGNkc19hbGxvY19nbG9iYWxfY29udGV4dCwgd2Ugd2lsbCBoYXZlIGxvY2sKKyAqIGF2YWlsYWJsZSB0byB1c2UgQVNBUAorICoKKyAqIFJldHVybiA6IG5vdGhpbmcKKyAqLworQ0RGX1NUQVRVUyBjZGZfdHJhY2Vfc3Bpbl9sb2NrX2luaXQodm9pZCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmbHRyYWNlX2xvY2spOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZGZfdHJhY2VfcmVnaXN0ZXIoKSAtIHJlZ2lzdGVycyB0aGUgY2FsbCBiYWNrIGZ1bmN0aW9ucworICogQG1vZHVsZUlEIC0gZW51bSB2YWx1ZSBvZiBtb2R1bGUKKyAqIEBjZGZfdHJhY2VfY2FsbGJhY2sgLSBjYWxsIGJhY2sgZnVuY3Rpb25zIHRvIGRpc3BsYXkgdGhlIG1lc3NhZ2VzIGluCisgKiAgcGFydGljdWxhciBmb3JtYXQuCisgKgorICogUmVnaXN0ZXJzIHRoZSBjYWxsIGJhY2sgZnVuY3Rpb25zIHRvIGRpc3BsYXkgdGhlIG1lc3NhZ2VzIGluIHBhcnRpY3VsYXIKKyAqIGZvcm1hdCBtZW50aW9uZWQgaW4gdGhlc2UgY2FsbCBiYWNrIGZ1bmN0aW9ucy4gVGhpcyBmdW5jdGlvbnMgc2hvdWxkIGJlCisgKiBjYWxsZWQgYnkgaW50ZXJlc3RlZCBtb2R1bGUgaW4gdGhlaXIgaW5pdCBwYXJ0IGFzIHdlIHdpbGwgYmUgcmVhZHkgdG8KKyAqIHJlZ2lzdGVyIGFzIHNvb24gYXMgbW9kdWxlcyBhcmUgdXAuCisgKgorICogUmV0dXJuIDogbm90aGluZworICovCit2b2lkIGNkZl90cmFjZV9yZWdpc3RlcihDREZfTU9EVUxFX0lEIG1vZHVsZUlELAorCQkJdHBfY2RmX3RyYWNlX2NiIGNkZl90cmFjZV9jYWxsYmFjaykKK3sKKwljZGZfdHJhY2VfY2JfdGFibGVbbW9kdWxlSURdID0gY2RmX3RyYWNlX2NhbGxiYWNrOworfQorCisvKioKKyAqIGNkZl90cmFjZV9kdW1wX2FsbCgpIC0gRHVtcCBkYXRhIGZyb20gcmluZyBidWZmZXIgdmlhIGNhbGwgYmFjayBmdW5jdGlvbnMKKyAqCQkJICByZWdpc3RlcmVkIHdpdGggQ0RGCisgKiBAcE1hYyA6IENvbnRleHQgb2YgcGFydGljdWxhciBtb2R1bGUKKyAqIEBjb2RlIDogUmVhc29uIGNvZGUKKyAqIEBzZXNzaW9uIDogU2Vzc2lvbiBpZCBvZiBsb2cKKyAqIEBjb3VudCA6IE51bWJlciBvZiBsaW5lcyB0byBkdW1wIHN0YXJ0aW5nIGZyb20gdGFpbCB0byBoZWFkCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB1cCBvbiBpc3N1ZWluZyBpb2N0bCBjYWxsIGFzIG1lbnRpb25lZCBmb2xsb3dpbmcKKyAqIFtpd3ByaXYgd2xhbjAgZHVtcGxvZyAwIDAgPG4+IDxiaXRtYXNrX29mX21vZHVsZT5dCisgKgorICogIDxuPiAtIG51bWJlciBsaW5lcyB0byBkdW1wIHN0YXJ0aW5nIGZyb20gdGFpbCB0byBoZWFkLgorICoKKyAqICA8Yml0bWFza19vZl9tb2R1bGU+IC0gaWYgYW55Ym9keSB3YW50cyB0byBrbm93IGhvdyBtYW55IG1lc3NhZ2VzIHdlcmUKKyAqICByZWNvcmRlZCBmb3IgcGFydGljdWxhciBtb2R1bGUvcyBtZW50aW9uZWQgYnkgc2V0Yml0IGluIGJpdG1hc2sgZnJvbSBsYXN0CisgKiAgPG4+IG1lc3NhZ2VzLiBJdCBpcyBvcHRpb25hbCwgaWYgeW91IGRvbid0IHByb3ZpZGUgdGhlbiBpdCB3aWxsIGR1bXAKKyAqICBldmVyeXRoaW5nIGZyb20gYnVmZmVyLgorICoKKyAqIFJldHVybiA6IG5vdGhpbmcKKyAqLwordm9pZCBjZGZfdHJhY2VfZHVtcF9hbGwodm9pZCAqcE1hYywgdWludDhfdCBjb2RlLCB1aW50OF90IHNlc3Npb24sCisJCQl1aW50MzJfdCBjb3VudCwgdWludDMyX3QgYml0bWFza19vZl9tb2R1bGUpCit7CisJY2RmX3RyYWNlX3JlY29yZF90IHBSZWNvcmQ7CisJaW50MzJfdCBpLCB0YWlsOworCisJaWYgKCFnX2NkZl90cmFjZV9kYXRhLmVuYWJsZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIlRyYWNpbmcgRGlzYWJsZWQiKTsKKwkJcmV0dXJuOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICJUb3RhbCBSZWNvcmRzOiAlZCwgSGVhZDogJWQsIFRhaWw6ICVkIiwKKwkJICBnX2NkZl90cmFjZV9kYXRhLm51bSwgZ19jZGZfdHJhY2VfZGF0YS5oZWFkLAorCQkgIGdfY2RmX3RyYWNlX2RhdGEudGFpbCk7CisKKwkvKiBhcXVpcmUgdGhlIGxvY2sgc28gdGhhdCBvbmx5IG9uZSB0aHJlYWQgYXQgYSB0aW1lIGNhbiByZWFkCisJICogdGhlIHJpbmcgYnVmZmVyCisJICovCisJc3Bpbl9sb2NrKCZsdHJhY2VfbG9jayk7CisKKwlpZiAoZ19jZGZfdHJhY2VfZGF0YS5oZWFkICE9IElOVkFMSURfQ0RGX1RSQUNFX0FERFIpIHsKKwkJaSA9IGdfY2RmX3RyYWNlX2RhdGEuaGVhZDsKKwkJdGFpbCA9IGdfY2RmX3RyYWNlX2RhdGEudGFpbDsKKworCQlpZiAoY291bnQpIHsKKwkJCWlmIChjb3VudCA+IGdfY2RmX3RyYWNlX2RhdGEubnVtKQorCQkJCWNvdW50ID0gZ19jZGZfdHJhY2VfZGF0YS5udW07CisJCQlpZiAodGFpbCA+PSAoY291bnQgLSAxKSkKKwkJCQlpID0gdGFpbCAtIGNvdW50ICsgMTsKKwkJCWVsc2UgaWYgKGNvdW50ICE9IE1BWF9DREZfVFJBQ0VfUkVDT1JEUykKKwkJCQlpID0gTUFYX0NERl9UUkFDRV9SRUNPUkRTIC0gKChjb3VudCAtIDEpIC0KKwkJCQkJCQkgICAgIHRhaWwpOworCQl9CisKKwkJcFJlY29yZCA9IGdfY2RmX3RyYWNlX3RibFtpXTsKKwkJLyogcmlnaHQgbm93IHdlIGFyZSBub3QgdXNpbmcgbnVtU2luY2VMYXN0RHVtcCBtZW1iZXIgYnV0CisJCSAqIGluIGZ1dHVyZSB3ZSBtaWdodCByZS12aXNpdCBhbmQgdXNlIHRoaXMgbWVtYmVyIHRvIHRyYWNrCisJCSAqIGhvdyBtYW55IGxhdGVzdCBtZXNzYWdlcyBnb3QgYWRkZWQgd2hpbGUgd2Ugd2VyZSBkdW1waW5nCisJCSAqIGZyb20gcmluZyBidWZmZXIKKwkJICovCisJCWdfY2RmX3RyYWNlX2RhdGEubnVtU2luY2VMYXN0RHVtcCA9IDA7CisJCXNwaW5fdW5sb2NrKCZsdHJhY2VfbG9jayk7CisJCWZvciAoOzsgKSB7CisJCQlpZiAoKGNvZGUgPT0gMCB8fCAoY29kZSA9PSBwUmVjb3JkLmNvZGUpKSAmJgorCQkJICAgIChjZGZfdHJhY2VfY2JfdGFibGVbcFJlY29yZC5tb2R1bGVdICE9IE5VTEwpKSB7CisJCQkJaWYgKDAgPT0gYml0bWFza19vZl9tb2R1bGUpIHsKKwkJCQkJY2RmX3RyYWNlX2NiX3RhYmxlW3BSZWNvcmQuCisJCQkJCQkJICAgbW9kdWxlXSAocE1hYywKKwkJCQkJCQkJICAgICZwUmVjb3JkLAorCQkJCQkJCQkgICAgKHVpbnQxNl90KQorCQkJCQkJCQkgICAgaSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGJpdG1hc2tfb2ZfbW9kdWxlICYKKwkJCQkJICAgICgxIDw8IHBSZWNvcmQubW9kdWxlKSkgeworCQkJCQkJY2RmX3RyYWNlX2NiX3RhYmxlW3BSZWNvcmQuCisJCQkJCQkJCSAgIG1vZHVsZV0KKwkJCQkJCQkocE1hYywgJnBSZWNvcmQsCisJCQkJCQkJKHVpbnQxNl90KSBpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKGkgPT0gdGFpbCkKKwkJCQlicmVhazsKKwkJCWkgKz0gMTsKKworCQkJc3Bpbl9sb2NrKCZsdHJhY2VfbG9jayk7CisJCQlpZiAoTUFYX0NERl9UUkFDRV9SRUNPUkRTID09IGkpIHsKKwkJCQlpID0gMDsKKwkJCQlwUmVjb3JkID0gZ19jZGZfdHJhY2VfdGJsWzBdOworCQkJfSBlbHNlIHsKKwkJCQlwUmVjb3JkID0gZ19jZGZfdHJhY2VfdGJsW2ldOworCQkJfQorCQkJc3Bpbl91bmxvY2soJmx0cmFjZV9sb2NrKTsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZsdHJhY2VfbG9jayk7CisJfQorfQorCisvKioKKyAqIGNkZl9kcF90cmFjZV9pbml0KCkgLSBlbmFibGVzIHRoZSBEUCB0cmFjZQorICogQ2FsbGVkIGR1cmluZyBkcml2ZXIgbG9hZCBhbmQgaXQgZW5hYmxlcyBEUCB0cmFjZQorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNkZl9kcF90cmFjZV9pbml0KHZvaWQpCit7CisJdWludDhfdCBpOworCisJY2RmX2RwX3RyYWNlX3NwaW5fbG9ja19pbml0KCk7CisJZ19jZGZfZHBfdHJhY2VfZGF0YS5oZWFkID0gSU5WQUxJRF9DREZfRFBfVFJBQ0VfQUREUjsKKwlnX2NkZl9kcF90cmFjZV9kYXRhLnRhaWwgPSBJTlZBTElEX0NERl9EUF9UUkFDRV9BRERSOworCWdfY2RmX2RwX3RyYWNlX2RhdGEubnVtID0gMDsKKwlnX2NkZl9kcF90cmFjZV9kYXRhLnByb3RvX2JpdG1hcCA9IDA7CisJZ19jZGZfZHBfdHJhY2VfZGF0YS5ub19vZl9yZWNvcmQgPSAwOworCWdfY2RmX2RwX3RyYWNlX2RhdGEudmVyYm9zaXR5ICAgID0gQ0RGX0RQX1RSQUNFX1ZFUkJPU0lUWV9ERUZBVUxUOworCWdfY2RmX2RwX3RyYWNlX2RhdGEuZW5hYmxlID0gdHJ1ZTsKKworCWZvciAoaSA9IDA7IGkgPCBDREZfRFBfVFJBQ0VfTUFYOyBpKyspCisJCWNkZl9kcF90cmFjZV9jYl90YWJsZVtpXSA9IGNkZl9kcF9kaXNwbGF5X3JlY29yZDsKK30KKworLyoqCisgKiBjZGZfZHBfdHJhY2Vfc2V0X3ZhbHVlKCkgLSBDb25maWd1cmUgdGhlIHZhbHVlIHRvIGNvbnRyb2wgRFAgdHJhY2UKKyAqIEBwcm90b19iaXRtYXAgIDogZGVmaW5lcyB0aGUgcHJvdG9jb2wgdG8gYmUgdHJhY2tlZAorICogQG5vX29mX3JlY29yZHMgOiBkZWZpbmVzIHRoZSBudGggcGFja2V0IHdoaWNoIGlzIHRyYWNlZAorICogQHZlcmJvc2l0eSAgICAgOiBkZWZpbmVzIHRoZSB2ZXJib3NpdHkgbGV2ZWwKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZGZfZHBfdHJhY2Vfc2V0X3ZhbHVlKHVpbnQ4X3QgcHJvdG9fYml0bWFwLCB1aW50OF90IG5vX29mX3JlY29yZCwKKwkJCSB1aW50OF90IHZlcmJvc2l0eSkKK3sKKwlnX2NkZl9kcF90cmFjZV9kYXRhLnByb3RvX2JpdG1hcCA9IHByb3RvX2JpdG1hcDsKKwlnX2NkZl9kcF90cmFjZV9kYXRhLm5vX29mX3JlY29yZCA9IG5vX29mX3JlY29yZDsKKwlnX2NkZl9kcF90cmFjZV9kYXRhLnZlcmJvc2l0eSAgICA9IHZlcmJvc2l0eTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogY2RmX2RwX3RyYWNlX2VuYWJsZV90cmFjaygpIC0gZW5hYmxlIHRoZSB0cmFjaW5nIGZvciBuZXRidWYKKyAqIEBjb2RlIDogZGVmaW5lcyB0aGUgZXZlbnQKKyAqCisgKiBSZXR1cm46IHRydWUgb3IgZmFsc2UgZGVwZW5kcyBvbiB3aGV0aGVyIHRyYWNpbmcgZW5hYmxlZAorICovCitzdGF0aWMgYm9vbCBjZGZfZHBfdHJhY2VfZW5hYmxlX3RyYWNrKGVudW0gQ0RGX0RQX1RSQUNFX0lEIGNvZGUpCit7CisJaWYgKGdfY2RmX2RwX3RyYWNlX2RhdGEudmVyYm9zaXR5ID09IENERl9EUF9UUkFDRV9WRVJCT1NJVFlfSElHSCkKKwkJcmV0dXJuIHRydWU7CisJaWYgKGdfY2RmX2RwX3RyYWNlX2RhdGEudmVyYm9zaXR5ID09IENERl9EUF9UUkFDRV9WRVJCT1NJVFlfTUVESVVNCisJCSYmIChjb2RlIDw9IENERl9EUF9UUkFDRV9ISUZfUEFDS0VUX1BUUl9SRUNPUkQpKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoZ19jZGZfZHBfdHJhY2VfZGF0YS52ZXJib3NpdHkgPT0gQ0RGX0RQX1RSQUNFX1ZFUkJPU0lUWV9MT1cKKwkJJiYgKGNvZGUgPD0gQ0RGX0RQX1RSQUNFX0NFX1BBQ0tFVF9SRUNPUkQpKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoZ19jZGZfZHBfdHJhY2VfZGF0YS52ZXJib3NpdHkgPT0gQ0RGX0RQX1RSQUNFX1ZFUkJPU0lUWV9ERUZBVUxUCisJCSYmIChjb2RlID09IENERl9EUF9UUkFDRV9EUk9QX1BBQ0tFVF9SRUNPUkQpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogY2RmX2RwX3RyYWNlX3NldF90cmFjaygpIC0gTWFya3Mgd2hldGhlciB0aGUgcGFja2V0IG5lZWRzIHRvIGJlIHRyYWNlZAorICogQG5idWYgIDogZGVmaW5lcyB0aGUgbmV0YnVmCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgY2RmX2RwX3RyYWNlX3NldF90cmFjayhjZGZfbmJ1Zl90IG5idWYpCit7CisJc3Bpbl9sb2NrX2JoKCZsX2RwX3RyYWNlX2xvY2spOworCWdfY2RmX2RwX3RyYWNlX2RhdGEuY291bnQrKzsKKwlpZiAoZ19jZGZfZHBfdHJhY2VfZGF0YS5wcm90b19iaXRtYXAgIT0gMCkgeworCQlpZiAoY2RzX3BrdF9nZXRfcHJvdG9fdHlwZShuYnVmLAorCQkJZ19jZGZfZHBfdHJhY2VfZGF0YS5wcm90b19iaXRtYXAsIDApKSB7CisJCQlDREZfTkJVRl9TRVRfRFBfVFJBQ0UobmJ1ZiwgMSk7CisJCX0KKwl9CisJaWYgKChnX2NkZl9kcF90cmFjZV9kYXRhLm5vX29mX3JlY29yZCAhPSAwKSAmJgorCQkoZ19jZGZfZHBfdHJhY2VfZGF0YS5jb3VudCAlCisJCQlnX2NkZl9kcF90cmFjZV9kYXRhLm5vX29mX3JlY29yZCA9PSAwKSkgeworCQlDREZfTkJVRl9TRVRfRFBfVFJBQ0UobmJ1ZiwgMSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZsX2RwX3RyYWNlX2xvY2spOworCXJldHVybjsKK30KKworLyoqCisgKiBkdW1wX2hleF90cmFjZSgpIC0gRGlzcGxheSB0aGUgZGF0YSBpbiBidWZmZXIKKyAqIEBidWY6ICAgICBidWZmZXIgd2hpY2ggY29udGFpbnMgZGF0YSB0byBiZSBkaXNwbGF5ZWQKKyAqIEBidWZfbGVuOiBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIGJlIGRpc3BsYXllZAorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBkdW1wX2hleF90cmFjZSh1aW50OF90ICpidWYsIHVpbnQ4X3QgYnVmX2xlbikKK3sKKwl1aW50OF90IGkgPSAwOworCS8qIER1bXAgdGhlIGJ5dGVzIGluIHRoZSBsYXN0IGxpbmUgKi8KKwljZGZfcHJpbnQoIkRBVEE6ICIpOworCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuOyBpKyspCisJCWNkZl9wcmludCgiJTAyeCAiLCBidWZbaV0pOworCWNkZl9wcmludCgiXG4iKTsKK30KKworLyoqCisgKiBjZGZfZHBfZGlzcGxheV90cmFjZSgpIC0gRGlzcGxheXMgYSByZWNvcmQgaW4gRFAgdHJhY2UKKyAqIEBwUmVjb3JkICA6IHBvaW50ZXIgdG8gYSByZWNvcmQgaW4gRFAgdHJhY2UKKyAqIEByZWNJbmRleCA6IHJlY29yZCBpbmRleAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNkZl9kcF9kaXNwbGF5X3JlY29yZChzdHJ1Y3QgY2RmX2RwX3RyYWNlX3JlY29yZF9zICpwUmVjb3JkICwKKwkJCQl1aW50MTZfdCByZWNJbmRleCkKK3sKKwljZGZfcHJpbnQoIklOREVYOiAlMDRkIFRJTUU6ICUwMTJsbHUgQ09ERTogJTAyZFxuIiwgcmVjSW5kZXgsCisJCQkJCQlwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5jb2RlKTsKKwlzd2l0Y2ggKHBSZWNvcmQtPmNvZGUpIHsKKwljYXNlICBDREZfRFBfVFJBQ0VfSEREX1RYX1RJTUVPVVQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJIkhERCBUWCBUaW1lb3V0XG4iKTsKKwkJYnJlYWs7CisJY2FzZSAgQ0RGX0RQX1RSQUNFX0hERF9TT0ZUQVBfVFhfVElNRU9VVDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkiSEREIFNvZnRBUCBUWCBUaW1lb3V0XG4iKTsKKwkJYnJlYWs7CisJY2FzZSAgQ0RGX0RQX1RSQUNFX1ZERVZfUEFVU0U6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJIlZERVYgUGF1c2VcbiIpOworCQlicmVhazsKKwljYXNlICBDREZfRFBfVFJBQ0VfVkRFVl9VTlBBVVNFOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJCSJWREVWIFVuUGF1c2VcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkdW1wX2hleF90cmFjZShwUmVjb3JkLT5kYXRhLCBwUmVjb3JkLT5zaXplKTsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIGNkZl9kcF90cmFjZSgpIC0gU3RvcmVzIHRoZSBkYXRhIGluIGJ1ZmZlcgorICogQG5idWYgIDogZGVmaW5lcyB0aGUgbmV0YnVmCisgKiBAY29kZSA6IGRlZmluZXMgdGhlIGV2ZW50CisgKiBAZGF0YSA6IGRlZmluZXMgdGhlIGRhdGEgdG8gYmUgc3RvcmVkCisgKiBAc2l6ZSA6IGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIGRhdGEgcmVjb3JkCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgY2RmX2RwX3RyYWNlKGNkZl9uYnVmX3QgbmJ1ZiwgZW51bSBDREZfRFBfVFJBQ0VfSUQgY29kZSwKKwkJCXVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgY2RmX2RwX3RyYWNlX3JlY29yZF9zICpyZWMgPSBOVUxMOworCisJLyogUmV0dXJuIHdoZW4gRHAgdHJhY2UgaXMgbm90IGVuYWJsZWQgKi8KKwlpZiAoIWdfY2RmX2RwX3RyYWNlX2RhdGEuZW5hYmxlKQorCQlyZXR1cm47CisKKwkvKiBJZiBuYnVmIGlzIE5VTEwsIGNoZWNrIGZvciBWREVWIFBBVVNFLCBVTlBBVVNFLCBUSU1FT1VUICovCisJaWYgKCFuYnVmKSB7CisJCXN3aXRjaCAoY29kZSkgeworCQljYXNlIENERl9EUF9UUkFDRV9IRERfVFhfVElNRU9VVDoKKwkJY2FzZSBDREZfRFBfVFJBQ0VfSEREX1NPRlRBUF9UWF9USU1FT1VUOgorCQljYXNlIENERl9EUF9UUkFDRV9WREVWX1BBVVNFOgorCQljYXNlIENERl9EUF9UUkFDRV9WREVWX1VOUEFVU0U6CisJCQlpZiAoY2RmX2RwX3RyYWNlX2VuYWJsZV90cmFjayhjb2RlKSkKKwkJCQlnb3RvICByZWdpc3Rlcl9yZWNvcmQ7CisJCQllbHNlCisJCQkJcmV0dXJuOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBSZXR1cm4gd2hlbiB0aGUgcGFja2V0IGlzIG5vdCBhIGRhdGEgcGFja2V0ICovCisJaWYgKE5CVUZfR0VUX1BBQ0tFVF9UUkFDSyhuYnVmKSAhPSBOQlVGX1RYX1BLVF9EQVRBX1RSQUNLKQorCQlyZXR1cm47CisKKwkvKiBSZXR1cm4gd2hlbiBuYnVmIGlzIG5vdCBtYXJrZWQgZm9yIGRwIHRyYWNpbmcgb3IKKwkgKiB2ZXJib3NpdHkgZG9lcyBub3QgYWxsb3cKKwkgKi8KKwlpZiAoY2RmX2RwX3RyYWNlX2VuYWJsZV90cmFjayhjb2RlKSA9PSBmYWxzZSB8fAorCQkJIUNERl9OQlVGX0dFVF9EUF9UUkFDRShuYnVmKSkKKwkJcmV0dXJuOworCisJLyogQWNxdWlyZSB0aGUgbG9jayBzbyB0aGF0IG9ubHkgb25lIHRocmVhZCBhdCBhIHRpbWUgY2FuIGZpbGwgdGhlIHJpbmcKKwkgKiBidWZmZXIKKwkgKi8KKworcmVnaXN0ZXJfcmVjb3JkOgorCisJc3Bpbl9sb2NrX2JoKCZsX2RwX3RyYWNlX2xvY2spOworCisJZ19jZGZfZHBfdHJhY2VfZGF0YS5udW0rKzsKKworCWlmIChnX2NkZl9kcF90cmFjZV9kYXRhLm51bSA+IE1BWF9DREZfRFBfVFJBQ0VfUkVDT1JEUykKKwkJZ19jZGZfZHBfdHJhY2VfZGF0YS5udW0gPSBNQVhfQ0RGX0RQX1RSQUNFX1JFQ09SRFM7CisKKwlpZiAoSU5WQUxJRF9DREZfRFBfVFJBQ0VfQUREUiA9PSBnX2NkZl9kcF90cmFjZV9kYXRhLmhlYWQpIHsKKwkJLyogZmlyc3QgcmVjb3JkICovCisJCWdfY2RmX2RwX3RyYWNlX2RhdGEuaGVhZCA9IDA7CisJCWdfY2RmX2RwX3RyYWNlX2RhdGEudGFpbCA9IDA7CisJfSBlbHNlIHsKKwkJLyogcXVldWUgaXMgbm90IGVtcHR5ICovCisJCWdfY2RmX2RwX3RyYWNlX2RhdGEudGFpbCsrOworCisJCWlmIChNQVhfQ0RGX0RQX1RSQUNFX1JFQ09SRFMgPT0gZ19jZGZfZHBfdHJhY2VfZGF0YS50YWlsKQorCQkJZ19jZGZfZHBfdHJhY2VfZGF0YS50YWlsID0gMDsKKworCQlpZiAoZ19jZGZfZHBfdHJhY2VfZGF0YS5oZWFkID09IGdfY2RmX2RwX3RyYWNlX2RhdGEudGFpbCkgeworCQkJLyogZnVsbCAqLworCQkJaWYgKE1BWF9DREZfRFBfVFJBQ0VfUkVDT1JEUyA9PQorCQkJCSsrZ19jZGZfZHBfdHJhY2VfZGF0YS5oZWFkKQorCQkJCWdfY2RmX2RwX3RyYWNlX2RhdGEuaGVhZCA9IDA7CisJCX0KKwl9CisKKwlyZWMgPSAmZ19jZGZfZHBfdHJhY2VfdGJsW2dfY2RmX2RwX3RyYWNlX2RhdGEudGFpbF07CisJcmVjLT5jb2RlID0gY29kZTsKKwlyZWMtPnNpemUgPSAwOworCWlmIChkYXRhICE9IE5VTEwgJiYgc2l6ZSA+IDApIHsKKwkJaWYgKHNpemUgPiBDREZfRFBfVFJBQ0VfUkVDT1JEX1NJWkUpCisJCQlzaXplID0gQ0RGX0RQX1RSQUNFX1JFQ09SRF9TSVpFOworCisJCXJlYy0+c2l6ZSA9IHNpemU7CisJCXN3aXRjaCAoY29kZSkgeworCQljYXNlIENERl9EUF9UUkFDRV9IRERfUEFDS0VUX1BUUl9SRUNPUkQ6CisJCWNhc2UgQ0RGX0RQX1RSQUNFX0NFX1BBQ0tFVF9QVFJfUkVDT1JEOgorCQljYXNlIENERl9EUF9UUkFDRV9UWFJYX1FVRVVFX1BBQ0tFVF9QVFJfUkVDT1JEOgorCQljYXNlIENERl9EUF9UUkFDRV9UWFJYX1BBQ0tFVF9QVFJfUkVDT1JEOgorCQljYXNlIENERl9EUF9UUkFDRV9IVFRfUEFDS0VUX1BUUl9SRUNPUkQ6CisJCWNhc2UgQ0RGX0RQX1RSQUNFX0hUQ19QQUNLRVRfUFRSX1JFQ09SRDoKKwkJY2FzZSBDREZfRFBfVFJBQ0VfSElGX1BBQ0tFVF9QVFJfUkVDT1JEOgorCQkJY2RmX21lbV9jb3B5KHJlYy0+ZGF0YSwgKHVpbnQ4X3QgKikoJmRhdGEpLCBzaXplKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ0RGX0RQX1RSQUNFX0RST1BfUEFDS0VUX1JFQ09SRDoKKwkJY2FzZSBDREZfRFBfVFJBQ0VfSEREX1BBQ0tFVF9SRUNPUkQ6CisJCWNhc2UgQ0RGX0RQX1RSQUNFX0NFX1BBQ0tFVF9SRUNPUkQ6CisJCQljZGZfbWVtX2NvcHkocmVjLT5kYXRhLCBkYXRhLCBzaXplKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJcmVjLT50aW1lID0gY2RmX2dldF9sb2dfdGltZXN0YW1wKCk7CisJcmVjLT5waWQgPSAoaW5faW50ZXJydXB0KCkgPyAwIDogY3VycmVudC0+cGlkKTsKKwlzcGluX3VubG9ja19iaCgmbF9kcF90cmFjZV9sb2NrKTsKK30KKworLyoqCisgKiBjZGZfZHBfdHJhY2Vfc3Bpbl9sb2NrX2luaXQoKSAtIGluaXRpYWxpemVzIHRoZSBsb2NrIHZhcmlhYmxlIGJlZm9yZSB1c2UKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZnJvbSBjZHNfYWxsb2NfZ2xvYmFsX2NvbnRleHQsIHdlIHdpbGwgaGF2ZSBsb2NrCisgKiBhdmFpbGFibGUgdG8gdXNlIEFTQVAKKyAqCisgKiBSZXR1cm4gOiBub3RoaW5nCisgKi8KK3ZvaWQgY2RmX2RwX3RyYWNlX3NwaW5fbG9ja19pbml0KHZvaWQpCit7CisJc3Bpbl9sb2NrX2luaXQoJmxfZHBfdHJhY2VfbG9jayk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogY2RmX2RwX3RyYWNlX2R1bXBfYWxsKCkgLSBEdW1wIGRhdGEgZnJvbSByaW5nIGJ1ZmZlciB2aWEgY2FsbCBiYWNrIGZ1bmN0aW9ucworICoJCQkgIHJlZ2lzdGVyZWQgd2l0aCBDREYKKyAqIEBjb2RlIDogUmVhc29uIGNvZGUKKyAqIEBjb3VudCA6IE51bWJlciBvZiBsaW5lcyB0byBkdW1wIHN0YXJ0aW5nIGZyb20gdGFpbCB0byBoZWFkCisgKgorICogUmV0dXJuIDogbm90aGluZworICovCit2b2lkIGNkZl9kcF90cmFjZV9kdW1wX2FsbCh1aW50MzJfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2RmX2RwX3RyYWNlX3JlY29yZF9zIHBSZWNvcmQ7CisJaW50MzJfdCBpLCB0YWlsOworCisJaWYgKCFnX2NkZl9kcF90cmFjZV9kYXRhLmVuYWJsZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIlRyYWNpbmcgRGlzYWJsZWQiKTsKKwkJcmV0dXJuOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICJUb3RhbCBSZWNvcmRzOiAlZCwgSGVhZDogJWQsIFRhaWw6ICVkIiwKKwkJICBnX2NkZl9kcF90cmFjZV9kYXRhLm51bSwgZ19jZGZfZHBfdHJhY2VfZGF0YS5oZWFkLAorCQkgIGdfY2RmX2RwX3RyYWNlX2RhdGEudGFpbCk7CisKKwkvKiBhcXVpcmUgdGhlIGxvY2sgc28gdGhhdCBvbmx5IG9uZSB0aHJlYWQgYXQgYSB0aW1lIGNhbiByZWFkCisJICogdGhlIHJpbmcgYnVmZmVyCisJICovCisJc3Bpbl9sb2NrX2JoKCZsX2RwX3RyYWNlX2xvY2spOworCisJaWYgKGdfY2RmX2RwX3RyYWNlX2RhdGEuaGVhZCAhPSBJTlZBTElEX0NERl9EUF9UUkFDRV9BRERSKSB7CisJCWkgPSBnX2NkZl9kcF90cmFjZV9kYXRhLmhlYWQ7CisJCXRhaWwgPSBnX2NkZl9kcF90cmFjZV9kYXRhLnRhaWw7CisKKwkJaWYgKGNvdW50KSB7CisJCQlpZiAoY291bnQgPiBnX2NkZl9kcF90cmFjZV9kYXRhLm51bSkKKwkJCQljb3VudCA9IGdfY2RmX2RwX3RyYWNlX2RhdGEubnVtOworCQkJaWYgKHRhaWwgPj0gKGNvdW50IC0gMSkpCisJCQkJaSA9IHRhaWwgLSBjb3VudCArIDE7CisJCQllbHNlIGlmIChjb3VudCAhPSBNQVhfQ0RGX0RQX1RSQUNFX1JFQ09SRFMpCisJCQkJaSA9IE1BWF9DREZfRFBfVFJBQ0VfUkVDT1JEUyAtICgoY291bnQgLSAxKSAtCisJCQkJCQkJICAgICB0YWlsKTsKKwkJfQorCisJCXBSZWNvcmQgPSBnX2NkZl9kcF90cmFjZV90YmxbaV07CisJCXNwaW5fdW5sb2NrX2JoKCZsX2RwX3RyYWNlX2xvY2spOworCQlmb3IgKDs7ICkgeworCisJCQljZGZfZHBfdHJhY2VfY2JfdGFibGVbcFJlY29yZC4KKwkJCQkJICAgY29kZV0gKCZwUmVjb3JkLCAodWludDE2X3QpaSk7CisJCQlpZiAoaSA9PSB0YWlsKQorCQkJCWJyZWFrOworCQkJaSArPSAxOworCisJCQlzcGluX2xvY2tfYmgoJmxfZHBfdHJhY2VfbG9jayk7CisJCQlpZiAoTUFYX0NERl9EUF9UUkFDRV9SRUNPUkRTID09IGkpCisJCQkJaSA9IDA7CisKKwkJCXBSZWNvcmQgPSBnX2NkZl9kcF90cmFjZV90YmxbaV07CisJCQlzcGluX3VubG9ja19iaCgmbF9kcF90cmFjZV9sb2NrKTsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2JoKCZsX2RwX3RyYWNlX2xvY2spOworCX0KK30KZGlmZiAtLWdpdCBhL2NvcmUvY2RmL3NyYy9pX2NkZl9hdG9taWMuaCBiL2NvcmUvY2RmL3NyYy9pX2NkZl9hdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzRiN2RmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZGYvc3JjL2lfY2RmX2F0b21pYy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIElfQ0RGX0FUT01JQ19ICisjZGVmaW5lIElfQ0RGX0FUT01JQ19ICisKKyNpbmNsdWRlIDxjZGZfc3RhdHVzLmg+ICAgICAgICAgLyogQ0RGX1NUQVRVUyAqLworCisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisKK3R5cGVkZWYgYXRvbWljX3QgX19jZGZfYXRvbWljX3Q7CisKK3N0YXRpYyBpbmxpbmUgQ0RGX1NUQVRVUyBfX2NkZl9hdG9taWNfaW5pdChfX2NkZl9hdG9taWNfdCAqdikKK3sKKwlhdG9taWNfc2V0KHYsIDApOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBfX2NkZl9hdG9taWNfcmVhZChfX2NkZl9hdG9taWNfdCAqdikKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQodik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NkZl9hdG9taWNfaW5jKF9fY2RmX2F0b21pY190ICp2KQoreworCWF0b21pY19pbmModik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NkZl9hdG9taWNfZGVjKF9fY2RmX2F0b21pY190ICp2KQoreworCWF0b21pY19kZWModik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NkZl9hdG9taWNfYWRkKGludCBpLCBfX2NkZl9hdG9taWNfdCAqdikKK3sKKwlhdG9taWNfYWRkKGksIHYpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fY2RmX2F0b21pY19kZWNfYW5kX3Rlc3QoX19jZGZfYXRvbWljX3QgKnYpCit7CisJcmV0dXJuIGF0b21pY19kZWNfYW5kX3Rlc3Qodik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NkZl9hdG9taWNfc2V0KF9fY2RmX2F0b21pY190ICp2LCBpbnQgaSkKK3sKKwlhdG9taWNfc2V0KHYsIGkpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fY2RmX2F0b21pY19pbmNfcmV0dXJuKF9fY2RmX2F0b21pY190ICp2KQoreworCXJldHVybiBhdG9taWNfaW5jX3JldHVybih2KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9zcmMvaV9jZGZfZGVmZXIuaCBiL2NvcmUvY2RmL3NyYy9pX2NkZl9kZWZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOWJkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvaV9jZGZfZGVmZXIuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfSV9DREZfREVGRVJfSAorI2RlZmluZSBfSV9DREZfREVGRVJfSAorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2lmZGVmIENPTkZJR19DTlNTCisjaW5jbHVkZSA8bmV0L2Nuc3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGNkZl9zdGF0dXMuaD4KKyNpbmNsdWRlIDxjZGZfdHJhY2UuaD4KKwordHlwZWRlZiBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgX19jZGZfYmhfdDsKKwordHlwZWRlZiB2b2lkICgqX19jZGZfYmhfZm5fdCkodW5zaWduZWQgbG9uZyBhcmcpOworCisvKiB3cmFwcGVyIGFyb3VuZCB0aGUgcmVhbCB0YXNrIGZ1bmMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwljZGZfZGVmZXJfZm5fdCBmbjsKKwl2b2lkICphcmc7Cit9IF9fY2RmX3dvcmtfdDsKKworZXh0ZXJuIHZvaWQgX19jZGZfZGVmZXJfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMKK19fY2RmX2luaXRfd29yayhjZGZfaGFuZGxlX3QgaGRsLAorCQlfX2NkZl93b3JrX3QgKndvcmssIGNkZl9kZWZlcl9mbl90IGZ1bmMsIHZvaWQgKmFyZykKK3sKKwkvKkluaXRpbGl6ZSBmdW5jIGFuZCBhcmd1bWVudCBpbiB3b3JrIHN0cnVjdCAqLworCXdvcmstPmZuID0gZnVuYzsKKwl3b3JrLT5hcmcgPSBhcmc7CisjaWZkZWYgQ09ORklHX0NOU1MKKwljbnNzX2luaXRfd29yaygmd29yay0+d29yaywgX19jZGZfZGVmZXJfZnVuYyk7CisjZWxzZQorCUlOSVRfV09SSygmd29yay0+d29yaywgX19jZGZfZGVmZXJfZnVuYyk7CisjZW5kaWYKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMgX19jZGZfc2NoZWRfd29yayhjZGZfaGFuZGxlX3QgaGRsLCBfX2NkZl93b3JrX3QgKndvcmspCit7CisJc2NoZWR1bGVfd29yaygmd29yay0+d29yayk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGlubGluZSBDREZfU1RBVFVTCitfX2NkZl9kaXNhYmxlX3dvcmsoY2RmX2hhbmRsZV90IGhkbCwgX19jZGZfd29ya190ICp3b3JrKQoreworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgQ0RGX1NUQVRVUyBfX2NkZl9pbml0X2JoKGNkZl9oYW5kbGVfdCBoZGwsCisJCQkJICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqYmgsCisJCQkJICAgICAgIGNkZl9kZWZlcl9mbl90IGZ1bmMsIHZvaWQgKmFyZykKK3sKKwl0YXNrbGV0X2luaXQoYmgsIChfX2NkZl9iaF9mbl90KSBmdW5jLCAodW5zaWduZWQgbG9uZylhcmcpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGlubGluZSBDREZfU1RBVFVTCitfX2NkZl9zY2hlZF9iaChjZGZfaGFuZGxlX3QgaGRsLCBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKmJoKQoreworCXRhc2tsZXRfc2NoZWR1bGUoYmgpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGlubGluZSBDREZfU1RBVFVTCitfX2NkZl9kaXNhYmxlX2JoKGNkZl9oYW5kbGVfdCBoZGwsIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqYmgpCit7CisJdGFza2xldF9raWxsKGJoKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAvKl9JX0NERl9ERUZFUl9IKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RmL3NyYy9pX2NkZl9ldmVudC5oIGIvY29yZS9jZGYvc3JjL2lfY2RmX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhYzVkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL3NyYy9pX2NkZl9ldmVudC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChfX0lfQ0RGX0VWRU5UX0gpCisjZGVmaW5lIF9fSV9DREZfRVZFTlRfSAorCisvKioKKyAqIERPQzogaV9jZGZfZXZlbnQuaAorICoKKyAqIExpbnV4LXNwZWNpZmljIGRlZmluaXRpb25zIGZvciBDREYgRXZlbnRzCisgKi8KKworLyogSW5jbHVkZSBGaWxlcyAqLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworLyogUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMgKi8KKyNkZWZpbmUgTElOVVhfRVZFTlRfQ09PS0lFIDB4MTIzNDEyMzQKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTQsIDApKQorI2RlZmluZSBJTklUX0NPTVBMRVRJT04oZXZlbnQpIHJlaW5pdF9jb21wbGV0aW9uKCZldmVudCkKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKK3R5cGVkZWYgc3RydWN0IGV2dCB7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CisJdWludDMyX3QgY29va2llOworfSBjZGZfZXZlbnRfdDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKyNlbmRpZiAvKiBfX0lfQ0RGX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RmL3NyYy9pX2NkZl9sb2NrLmggYi9jb3JlL2NkZi9zcmMvaV9jZGZfbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNDcyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvaV9jZGZfbG9jay5oCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoX19JX0NERl9MT0NLX0gpCisjZGVmaW5lIF9fSV9DREZfTE9DS19ICisKKy8qKgorICogRE9DOiBpX2NkZl9sb2NrLmgKKyAqCisgKiBMaW51eC1zcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgQ0RGIExvY2tzCisgKgorICovCisKKy8qIEluY2x1ZGUgRmlsZXMgKi8KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpZiBkZWZpbmVkKFdMQU5fT1BFTl9TT1VSQ0UpICYmIGRlZmluZWQoQ09ORklHX0hBU19XQUtFTE9DSykKKyNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgorI2VuZGlmCisKKy8qIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzICovCisKKy8qIGRlZmluZSBmb3IgZmxhZyAqLworI2RlZmluZSBBREZfT1NfTElOVVhfVU5MT0NLX0JIICAxCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqCisgKiB0eXBlZGVmIHN0cnVjdCAtIGNkZl9tdXRleF90CisgKiBAbV9sb2NrOiBNdXRleCBsb2NrCisgKiBAY29va2llOiBMb2NrIGNvb2tpZQorICogQHByb2Nlc3NJRDogUHJvY2VzcyBJRCB0byB0cmFjayBsb2NrCisgKiBAc3RhdGU6IExvY2sgc3RhdHVzCisgKiBAcmVmY291bnQ6IFJlZmVyZW5jZSBjb3VudCBmb3IgcmVjdXJzaXZlIGxvY2sKKyAqLwordHlwZWRlZiBzdHJ1Y3QgY2RmX2xvY2tfcyB7CisJc3RydWN0IG11dGV4IG1fbG9jazsKKwl1aW50MzJfdCBjb29raWU7CisJaW50IHByb2Nlc3NJRDsKKwl1aW50MzJfdCBzdGF0ZTsKKwl1aW50OF90IHJlZmNvdW50OworfSBjZGZfbXV0ZXhfdDsKKworLyoqCisgKiB0eXBlZGVmIHN0cnVjdCAtIGNkZl9zcGlubG9ja190CisgKiBAc3BpbmxvY2s6IFNwaW4gbG9jaworICogQGZsYWdzOiBMb2NrIGZsYWcKKyAqIEBfZmxhZ3M6IEludGVybmFsIGxvY2sgZmxhZworICovCit0eXBlZGVmIHN0cnVjdCBfX2NkZl9zcGlubG9jayB7CisJc3BpbmxvY2tfdCBzcGlubG9jazsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBfZmxhZ3M7Cit9IGNkZl9zcGlubG9ja190OworCit0eXBlZGVmIGNkZl9zcGlubG9ja190IF9fY2RmX3NwaW5sb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCBzZW1hcGhvcmUgX19jZGZfc2VtYXBob3JlX3Q7CisKKyNpZiBkZWZpbmVkIENPTkZJR19DTlNTCit0eXBlZGVmIHN0cnVjdCB3YWtldXBfc291cmNlIGNkZl93YWtlX2xvY2tfdDsKKyNlbGlmIGRlZmluZWQoV0xBTl9PUEVOX1NPVVJDRSkgJiYgZGVmaW5lZChDT05GSUdfSEFTX1dBS0VMT0NLKQordHlwZWRlZiBzdHJ1Y3Qgd2FrZV9sb2NrIGNkZl93YWtlX2xvY2tfdDsKKyNlbHNlCit0eXBlZGVmIGludCBjZGZfd2FrZV9sb2NrX3Q7CisjZW5kaWYKKworLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24gKi8KKworLyoqCisgKiBfX2NkZl9zZW1hcGhvcmVfaW5pdCgpIC0gaW5pdGlhbGl6ZSB0aGUgc2VtYXBob3JlCisgKiBAbTogU2VtYXBob3JlIG9iamVjdAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTCisgKi8KK3N0YXRpYyBpbmxpbmUgQ0RGX1NUQVRVUyBfX2NkZl9zZW1hcGhvcmVfaW5pdChzdHJ1Y3Qgc2VtYXBob3JlICptKQoreworCXNlbWFfaW5pdChtLCAxKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIF9fY2RmX3NlbWFwaG9yZV9hY3F1aXJlKCkgLSBhY3F1aXJlIHNlbWFwaG9yZQorICogQG06IFNlbWFwaG9yZSBvYmplY3QKKyAqCisgKiBSZXR1cm46IDAKKyAqLworc3RhdGljIGlubGluZSBpbnQKK19fY2RmX3NlbWFwaG9yZV9hY3F1aXJlKGNkZl9kZXZpY2VfdCBvc2Rldiwgc3RydWN0IHNlbWFwaG9yZSAqbSkKK3sKKwlkb3duKG0pOworCXJldHVybiAwOworfQorCisvKioKKyAqIF9fY2RmX3NlbWFwaG9yZV9yZWxlYXNlKCkgLSByZWxlYXNlIHNlbWFwaG9yZQorICogQG06IFNlbWFwaG9yZSBvYmplY3QKKyAqCisgKiBSZXR1cm46IHJlc3VsdCBvZiBVUCBvcGVyYXRpb24gaW4gaW50ZWdlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fY2RmX3NlbWFwaG9yZV9yZWxlYXNlKGNkZl9kZXZpY2VfdCBvc2Rldiwgc3RydWN0IHNlbWFwaG9yZSAqbSkKK3sKKwl1cChtKTsKK30KKworLyoqCisgKiBfX2NkZl9zcGlubG9ja19pbml0KCkgLSBpbml0aWFsaXplIHNwaW4gbG9jaworICogQGxvY2s6IFNwaW4gbG9jayBvYmplY3QKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUworICovCitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMgX19jZGZfc3BpbmxvY2tfaW5pdChfX2NkZl9zcGlubG9ja190ICpsb2NrKQoreworCXNwaW5fbG9ja19pbml0KCZsb2NrLT5zcGlubG9jayk7CisJbG9jay0+ZmxhZ3MgPSAwOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworI2RlZmluZSBfX2NkZl9zcGlubG9ja19kZXN0cm95KGxvY2spCisvKioKKyAqIF9fY2RmX3NwaW5fbG9jaygpIC0gQWNxdWlyZSBhIFNwaW5sb2NrKFNNUCkgJiBkaXNhYmxlIFByZWVtcHRpb24gKFByZWVtcHRpdmUpCisgKiBAbG9jazogTG9jayBvYmplY3QKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2NkZl9zcGluX2xvY2soX19jZGZfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlzcGluX2xvY2soJmxvY2stPnNwaW5sb2NrKTsKK30KKworLyoqCisgKiBfX2NkZl9zcGluX3VubG9jaygpIC0gVW5sb2NrIHRoZSBzcGlubG9jayBhbmQgZW5hYmxlcyB0aGUgUHJlZW1wdGlvbgorICogQGxvY2s6IExvY2sgb2JqZWN0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19jZGZfc3Bpbl91bmxvY2soX19jZGZfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlzcGluX3VubG9jaygmbG9jay0+c3BpbmxvY2spOworfQorCisvKioKKyAqIF9fY2RmX3NwaW5fbG9ja19pcnFzYXZlKCkgLSBBY3F1aXJlIGEgU3BpbmxvY2sgKFNNUCkgJiBkaXNhYmxlIFByZWVtcHRpb24KKyAqCQkJCShQcmVlbXB0aXZlKSBhbmQgZGlzYWJsZSBJUlFzCisgKiBAbG9jazogTG9jayBvYmplY3QKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2NkZl9zcGluX2xvY2tfaXJxc2F2ZShfX2NkZl9zcGlubG9ja190ICpsb2NrKQoreworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLT5zcGlubG9jaywgbG9jay0+X2ZsYWdzKTsKK30KKy8qKgorICogX19jZGZfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgpIC0gVW5sb2NrIHRoZSBzcGlubG9jayBhbmQgZW5hYmxlcyB0aGUKKyAqCQkJCQlQcmVlbXB0aW9uIGFuZCBlbmFibGUgSVJRCisgKiBAbG9jazogTG9jayBvYmplY3QKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2NkZl9zcGluX3VubG9ja19pcnFyZXN0b3JlKF9fY2RmX3NwaW5sb2NrX3QgKmxvY2spCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jay0+c3BpbmxvY2ssIGxvY2stPl9mbGFncyk7Cit9CisKKy8qCisgKiBTeW5jaHJvbm91cyB2ZXJzaW9ucyAtIG9ubHkgZm9yIE9TJyB0aGF0IGhhdmUgaW50ZXJydXB0IGRpc2FibGUKKyAqLworI2RlZmluZSBfX2NkZl9zcGluX2xvY2tfaXJxKF9wTG9jaywgX2ZsYWdzKSAgICBzcGluX2xvY2tfaXJxc2F2ZShfcExvY2ssIF9mbGFncykKKyNkZWZpbmUgX19jZGZfc3Bpbl91bmxvY2tfaXJxKF9wTG9jaywgX2ZsYWdzKSAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShfcExvY2ssIF9mbGFncykKKworLyoqCisgKiBfX2NkZl9zcGluX2xvY2tfYmgoKSAtIEFjcXVpcmUgdGhlIHNwaW5sb2NrIGFuZCBkaXNhYmxlIGJvdHRvbSBoYWx2ZXMKKyAqIEBsb2NrOiBMb2NrIG9iamVjdAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fY2RmX3NwaW5fbG9ja19iaChfX2NkZl9zcGlubG9ja190ICpsb2NrKQoreworCWlmIChsaWtlbHkoaXJxc19kaXNhYmxlZCgpIHx8IGluX3NvZnRpcnEoKSkpIHsKKwkJc3Bpbl9sb2NrKCZsb2NrLT5zcGlubG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2JoKCZsb2NrLT5zcGlubG9jayk7CisJCWxvY2stPmZsYWdzIHw9IEFERl9PU19MSU5VWF9VTkxPQ0tfQkg7CisJfQorCit9CisKKy8qKgorICogX19jZGZfc3Bpbl91bmxvY2tfYmgoKSAtIFJlbGVhc2UgdGhlIHNwaW5sb2NrIGFuZCBlbmFibGUgYm90dG9tIGhhbHZlcworICogQGxvY2s6IExvY2sgb2JqZWN0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19jZGZfc3Bpbl91bmxvY2tfYmgoX19jZGZfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlpZiAodW5saWtlbHkobG9jay0+ZmxhZ3MgJiBBREZfT1NfTElOVVhfVU5MT0NLX0JIKSkgeworCQlsb2NrLT5mbGFncyAmPSB+QURGX09TX0xJTlVYX1VOTE9DS19CSDsKKwkJc3Bpbl91bmxvY2tfYmgoJmxvY2stPnNwaW5sb2NrKTsKKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2soJmxvY2stPnNwaW5sb2NrKTsKK30KKworLyoqCisgKiBfX2NkZl9pbl9zb2Z0aXJxKCkgLSBpbiBzb2Z0IGlycSBjb250ZXh0CisgKgorICogUmV0dXJuOiB0cnVlIGlmIGluIHNvZnRpcnMgY29udGV4dCBlbHNlIGZhbHNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2NkZl9pbl9zb2Z0aXJxKHZvaWQpCit7CisJcmV0dXJuIGluX3NvZnRpcnEoKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9fSV9DREZfTE9DS19IICovCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9zcmMvaV9jZGZfbWNfdGltZXIuaCBiL2NvcmUvY2RmL3NyYy9pX2NkZl9tY190aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjM0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvaV9jZGZfbWNfdGltZXIuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoX19JX0NERl9NQ19USU1FUl9IKQorI2RlZmluZSBfX0lfQ0RGX01DX1RJTUVSX0gKKworLyoqCisgKiBET0M6IGlfY2RmX21jX3RpbWVyLmgKKyAqCisgKiBMaW51eC1zcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgQ0RGIHRpbWVycyBzZXJpYWxpemVkIHRvIE1DIHRocmVhZAorICovCisKKy8qIEluY2x1ZGUgRmlsZXMgKi8KKyNpbmNsdWRlIDxjZGZfbWNfdGltZXIuaD4KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisKKy8qIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKy8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKK3R5cGVkZWYgc3RydWN0IGNkZl9tY190aW1lcl9wbGF0Zm9ybV9zIHsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBUaW1lcjsKKwlpbnQgdGhyZWFkSUQ7CisJdWludDMyX3QgY29va2llOworCXNwaW5sb2NrX3Qgc3BpbmxvY2s7Cit9IGNkZl9tY190aW1lcl9wbGF0Zm9ybV90OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworI2VuZGlmIC8qIF9fSV9DREZfTUNfVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvc3JjL2lfY2RmX25idWYuaCBiL2NvcmUvY2RmL3NyYy9pX2NkZl9uYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1MzZmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL3NyYy9pX2NkZl9uYnVmLmgKQEAgLTAsMCArMSwxMDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogaV9jZGZfbmJ1Zi5oCisgKgorICogTGludXggaW1wbGVtZW50YXRpb24gb2Ygc2tidWYKKyAqLworI2lmbmRlZiBfSV9DREZfTkVUX0JVRl9ICisjZGVmaW5lIF9JX0NERl9ORVRfQlVGX0gKKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8Y2RmX3N0YXR1cy5oPgorCisjZGVmaW5lIF9fQ0RGX05CVUZfTlVMTCAgIE5VTEwKKworCisvKgorICogVXNlIHNvY2tldCBidWZmZXIgYXMgdGhlIHVuZGVybHlpbmcgaW1wbGVudGF0aW9uIGFzIHNrYnVmIC4KKyAqIExpbnV4IHVzZSBza19idWZmIHRvIHJlcHJlc2VudCBib3RoIHBhY2tldCBhbmQgZGF0YSwKKyAqIHNvIHdlIHVzZSBza19idWZmZXIgdG8gcmVwcmVzZW50IGJvdGggc2tidWYgLgorICovCit0eXBlZGVmIHN0cnVjdCBza19idWZmICpfX2NkZl9uYnVmX3Q7CisKK3R5cGVkZWYgdm9pZCAoKl9fY2RmX25idWZfY2FsbGJhY2tfZm4pKHN0cnVjdCBza19idWZmICpza2IpOworI2RlZmluZSBPU0RFUF9FQVBPTF9USUQgNiAgICAgICAvKiBzZW5kIGl0IG9uIFZPIHF1ZXVlICovCisKKy8qIENWR19OQlVGX01BWF9PU19GUkFHUyAtCisgKiBtYXggdHggZnJhZ21lbnRzIHByb3ZpZGVkIGJ5IHRoZSBPUworICovCisjZGVmaW5lIENWR19OQlVGX01BWF9PU19GUkFHUyAxCisKKy8qIENWR19OQlVGX01BWF9FWFRSQV9GUkFHUyAtCisgKiBtYXggdHggZnJhZ21lbnRzIGFkZGVkIGJ5IHRoZSBkcml2ZXIKKyAqIFRoZSBkcml2ZXIgd2lsbCBhbHdheXMgYWRkIG9uZSB0eCBmcmFnbWVudCAodGhlIHR4IGRlc2NyaXB0b3IpIGFuZCBtYXkKKyAqIGFkZCBhIHNlY29uZCB0eCBmcmFnbWVudCAoZS5nLiBhIFRTTyBzZWdtZW50J3MgbW9kaWZpZWQgSVAgaGVhZGVyKS4KKyAqLworI2RlZmluZSBDVkdfTkJVRl9NQVhfRVhUUkFfRlJBR1MgMgorCit0eXBlZGVmIHZvaWQgKCpjZGZfbmJ1Zl90cmFjZV91cGRhdGVfdCkoY2hhciAqKTsKKworLyoqCisgKiBzdHJ1Y3QgY3ZnX25idWZfY2IgLSBuZXR3b3JrIGJ1ZmZlciBjb250cm9sIGJsb2NrCisgKiBAZGF0YV9hdHRyOiBWYWx1ZSB0aGF0IGlzIHByb2dyYW1tZWQgaW4gQ0UgZGVzY3JpcHRvciwgY29udGFpbnM6CisgKgkJMSkgQ0UgY2xhc3NpZmljYXRpb24gZW5hYmxlbWVudCBiaXQKKyAqCQkyKSBQa3QgdHlwZSAoODAyLjMgb3IgRXRoZXJuZXQgVHlwZSBJSSkKKyAqCQkzKSBQa3QgT2Zmc2V0IChVc3VhbGx5IHRoZSBsZW5ndGggb2YgSFRUL0hUQyBkZXNjLikKKyAqIEB0cmFjZTogaW5mbyBmb3IgRFAgdHJhY2luZworICogQG1hcHBlZF9wYWRkcl9sbzogRE1BIG1hcHBpbmcgaW5mbworICogQGV4dHJhX2ZyYWdzOiBFeHRyYSB0eCBmcmFnbWVudHMKKyAqIEBvd25lcl9pZDogT3duZXIgaWQKKyAqIEBjZGZfbmJ1Zl9jYWxsYmFja19mbjogQ2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBwcml2X2RhdGE6IElQQSBzcGVjaWZpYyBwcml2IGRhdGEKKyAqIEBwcm90b190eXBlOiBQcm90b2NvbCB0eXBlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHR4X2h0dDJfZnJtOiBIVFQgMiBmcmFtZQorICogQHR4X2h0dDJfcmVzZXJ2ZWQ6IEhUVCAyIHJlc2VydmVkIGJpdHMKKyAqLworc3RydWN0IGN2Z19uYnVmX2NiIHsKKwl1aW50MzJfdCBkYXRhX2F0dHI7CisJLyoKKwkgKiBTdG9yZSBpbmZvIGZvciBkYXRhIHBhdGggdHJhY2luZworCSAqLworCXN0cnVjdCB7CisJCXVpbnQ4X3QgcGFja2V0X3N0YXRlOworCQl1aW50OF90IHBhY2tldF90cmFjazsKKwkJdWludDhfdCBkcF90cmFjZTsKKwl9IHRyYWNlOworCisJLyoKKwkgKiBTdG9yZSB0aGUgRE1BIG1hcHBpbmcgaW5mbyBmb3IgdGhlIG5ldHdvcmsgYnVmZmVyIGZyYWdtZW50cworCSAqIHByb3ZpZGVkIGJ5IHRoZSBPUy4KKwkgKi8KKwl1aW50MzJfdCBtYXBwZWRfcGFkZHJfbG9bQ1ZHX05CVUZfTUFYX09TX0ZSQUdTXTsKKworCS8qIHN0b3JlIGV4dHJhIHR4IGZyYWdtZW50cyBwcm92aWRlZCBieSB0aGUgZHJpdmVyICovCisJc3RydWN0IHsKKwkJLyogdmFkZHIgLQorCQkgKiBDUFUgYWRkcmVzcyAoYS5rLmEuIHZpcnR1YWwgYWRkcmVzcykgb2YgdGhlIHR4IGZyYWdtZW50cworCQkgKiBhZGRlZCBieSB0aGUgZHJpdmVyCisJCSAqLworCQl1bnNpZ25lZCBjaGFyICp2YWRkcltDVkdfTkJVRl9NQVhfRVhUUkFfRlJBR1NdOworCQkvKiBwYWRkcl9sbyAtCisJCSAqIGJ1cyBhZGRyZXNzIChhLmsuYS4gcGh5c2ljYWwgYWRkcmVzcykgb2YgdGhlIHR4IGZyYWdtZW50cworCQkgKiBhZGRlZCBieSB0aGUgZHJpdmVyCisJCSAqLworCQl1aW50MzJfdCBwYWRkcl9sb1tDVkdfTkJVRl9NQVhfRVhUUkFfRlJBR1NdOworCQl1aW50MTZfdCBsZW5bQ1ZHX05CVUZfTUFYX0VYVFJBX0ZSQUdTXTsKKwkJdWludDhfdCBudW07ICAgIC8qIGhvdyBtYW55IGV4dHJhIGZyYWdzIGhhcyB0aGUgZHJpdmVyIGFkZGVkICovCisJCXVpbnQ4X3QKKwkJLyoKKwkJICogU3RvcmUgYSB3b3Jkc3RyZWFtIHZzLiBieXRlc3RyZWFtIGZsYWcgZm9yIGVhY2ggZXh0cmEKKwkJICogZnJhZ21lbnQsIHBsdXMgb25lIG1vcmUgZmxhZyBmb3IgdGhlIG9yaWdpbmFsIGZyYWdtZW50KHMpCisJCSAqIG9mIHRoZSBuZXRidWYuCisJCSAqLword29yZHN0cmVhbV9mbGFnczpDVkdfTkJVRl9NQVhfRVhUUkFfRlJBR1MgKyAxOworCX0gZXh0cmFfZnJhZ3M7CisJdWludDMyX3Qgb3duZXJfaWQ7CisJX19jZGZfbmJ1Zl9jYWxsYmFja19mbiBjZGZfbmJ1Zl9jYWxsYmFja19mbjsKKwl1bnNpZ25lZCBsb25nIHByaXZfZGF0YTsKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisJdW5zaWduZWQgY2hhciBwcm90b190eXBlOworCXVuc2lnbmVkIGNoYXIgdmRldl9pZDsKKyNlbmRpZiAvKiBRQ0FfUEtUX1BST1RPX1RSQUNFICovCisjaWZkZWYgUUNBX1RYX0hUVDJfU1VQUE9SVAorCXVuc2lnbmVkIGNoYXIgdHhfaHR0Ml9mcm06MTsKKwl1bnNpZ25lZCBjaGFyIHR4X2h0dDJfcmVzZXJ2ZWQ6NzsKKyNlbmRpZiAvKiBRQ0FfVFhfSFRUMl9TVVBQT1JUICovCit9OworI2RlZmluZSBOQlVGX09XTkVSX0lEKHNrYikgXAorCSgoKHN0cnVjdCBjdmdfbmJ1Zl9jYiAqKSgoc2tiKS0+Y2IpKS0+b3duZXJfaWQpCisjZGVmaW5lIE5CVUZfT1dORVJfUFJJVl9EQVRBKHNrYikgXAorCSgoKHN0cnVjdCBjdmdfbmJ1Zl9jYiAqKSgoc2tiKS0+Y2IpKS0+cHJpdl9kYXRhKQorI2RlZmluZSBOQlVGX0NBTExCQUNLX0ZOKHNrYikgXAorCSgoKHN0cnVjdCBjdmdfbmJ1Zl9jYiAqKSgoc2tiKS0+Y2IpKS0+Y2RmX25idWZfY2FsbGJhY2tfZm4pCisjZGVmaW5lIE5CVUZfQ0FMTEJBQ0tfRk5fRVhFQyhza2IpIFwKKwkoKChzdHJ1Y3QgY3ZnX25idWZfY2IgKikoKHNrYiktPmNiKSktPmNkZl9uYnVmX2NhbGxiYWNrX2ZuKShza2IpCisjZGVmaW5lIE5CVUZfTUFQUEVEX1BBRERSX0xPKHNrYikgXAorCSgoKHN0cnVjdCBjdmdfbmJ1Zl9jYiAqKSgoc2tiKS0+Y2IpKS0+bWFwcGVkX3BhZGRyX2xvWzBdKQorI2RlZmluZSBOQlVGX05VTV9FWFRSQV9GUkFHUyhza2IpIFwKKwkoKChzdHJ1Y3QgY3ZnX25idWZfY2IgKikoKHNrYiktPmNiKSktPmV4dHJhX2ZyYWdzLm51bSkKKyNkZWZpbmUgTkJVRl9FWFRSQV9GUkFHX1ZBRERSKHNrYiwgZnJhZ19udW0pIFwKKwkoKChzdHJ1Y3QgY3ZnX25idWZfY2IgKikoKHNrYiktPmNiKSktPmV4dHJhX2ZyYWdzLnZhZGRyWyhmcmFnX251bSldKQorI2RlZmluZSBOQlVGX0VYVFJBX0ZSQUdfUEFERFJfTE8oc2tiLCBmcmFnX251bSkJXAorCSgoKHN0cnVjdCBjdmdfbmJ1Zl9jYiAqKSgoc2tiKS0+Y2IpKS0+ZXh0cmFfZnJhZ3MucGFkZHJfbG9bKGZyYWdfbnVtKV0pCisjZGVmaW5lIE5CVUZfRVhUUkFfRlJBR19MRU4oc2tiLCBmcmFnX251bSkgXAorCSgoKHN0cnVjdCBjdmdfbmJ1Zl9jYiAqKSgoc2tiKS0+Y2IpKS0+ZXh0cmFfZnJhZ3MubGVuWyhmcmFnX251bSldKQorI2RlZmluZSBOQlVGX0VYVFJBX0ZSQUdfV09SRFNUUkVBTV9GTEFHUyhza2IpIFwKKwkoKChzdHJ1Y3QgY3ZnX25idWZfY2IgKikoKHNrYiktPmNiKSktPmV4dHJhX2ZyYWdzLndvcmRzdHJlYW1fZmxhZ3MpCisKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisjZGVmaW5lIE5CVUZfU0VUX1BST1RPX1RZUEUoc2tiLCBwcm90b190eXBlKSBcCisJKCgoc3RydWN0IGN2Z19uYnVmX2NiICopKChza2IpLT5jYikpLT5wcm90b190eXBlID0gcHJvdG9fdHlwZSkKKyNkZWZpbmUgTkJVRl9HRVRfUFJPVE9fVFlQRShza2IpIFwKKwkoKChzdHJ1Y3QgY3ZnX25idWZfY2IgKikoKHNrYiktPmNiKSktPnByb3RvX3R5cGUpCisjZWxzZQorI2RlZmluZSBOQlVGX1NFVF9QUk9UT19UWVBFKHNrYiwgcHJvdG9fdHlwZSk7CisjZGVmaW5lIE5CVUZfR0VUX1BST1RPX1RZUEUoc2tiKSAwOworI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworI2lmZGVmIFFDQV9UWF9IVFQyX1NVUFBPUlQKKyNkZWZpbmUgTkJVRl9TRVRfVFhfSFRUMl9GUk0oc2tiLCBjYW5kaSkgXAorCSgoKHN0cnVjdCBjdmdfbmJ1Zl9jYiAqKSgoc2tiKS0+Y2IpKS0+dHhfaHR0Ml9mcm0gPSBjYW5kaSkKKyNkZWZpbmUgTkJVRl9HRVRfVFhfSFRUMl9GUk0oc2tiKSBcCisJKCgoc3RydWN0IGN2Z19uYnVmX2NiICopKChza2IpLT5jYikpLT50eF9odHQyX2ZybSkKKyNlbHNlCisjZGVmaW5lIE5CVUZfU0VUX1RYX0hUVDJfRlJNKHNrYiwgY2FuZGkpCisjZGVmaW5lIE5CVUZfR0VUX1RYX0hUVDJfRlJNKHNrYikgMAorI2VuZGlmIC8qIFFDQV9UWF9IVFQyX1NVUFBPUlQgKi8KKworI2RlZmluZSBOQlVGX0RBVEFfQVRUUl9TRVQoc2tiLCBkYXRhX2F0dHIpCVwKKwkoKChzdHJ1Y3QgY3ZnX25idWZfY2IgKikoKHNrYiktPmNiKSktPmRhdGFfYXR0ciA9IGRhdGFfYXR0cikKKworI2RlZmluZSBOQlVGX0RBVEFfQVRUUl9HRVQoc2tiKSBcCisJKCgoc3RydWN0IGN2Z19uYnVmX2NiICopKChza2IpLT5jYikpLT5kYXRhX2F0dHIpCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfTFJPKQorLyoqCisgKiBzdHJ1Y3QgbmJ1Zl9yeF9jYiAtIG5ldHdvcmsgYnVmZmVyIGNvbnRyb2wgYmxvY2sKKyAqIG9uIHRoZSByZWNlaXZlIHBhdGggb2YgdGhlIHNrYgorICogQGxyb19lbGlnaWJsZTogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1zZHUgaXMgTFJPIGVsaWdpYmxlCisgKiBAdGNwX3Byb3RvOiBpbmRpY2F0ZXMgaWYgdGhpcyBpcyBhIFRDUCBwYWNrZXQKKyAqIEBpcHY2X3Byb3RvOiBpbmRpY2F0ZXMgaWYgdGhpcyBpcyBhbiBJUHY2IHBhY2tldAorICogQGlwX29mZnNldDogb2Zmc2V0IHRvIHRoZSBJUCBoZWFkZXIKKyAqIEB0Y3Bfb2Zmc2V0OiBvZmZzZXQgdG8gdGhlIFRDUCBoZWFkZXIKKyAqIEB0Y3BfdWRwX2Noa3N1bTogVENQIHBheWxvYWQgY2hlY2tzdW0KKyAqIEB0Y3Bfc2VxX251bTogVENQIHNlcXVlbmNlIG51bWJlcgorICogQHRjcF9hY2tfbnVtOiBUQ1AgYWNrbm93bGVkZ2VtZW50IG51bWJlcgorICogQGZsb3dfaWRfdG9lcGxpdHo6IDMyIGJpdCA1LXR1cGxlIGZsb3cgaWQgdG9lcGxpdHogaGFzaAorICovCitzdHJ1Y3QgbmJ1Zl9yeF9jYiB7CisJdWludDMyX3QgbHJvX2VsaWdpYmxlOjEsCisJCXRjcF9wcm90bzoxLAorCQl0Y3BfcHVyZV9hY2s6MSwKKwkJaXB2Nl9wcm90bzoxLAorCQlpcF9vZmZzZXQ6NywKKwkJdGNwX29mZnNldDo3OworCXVpbnQzMl90IHRjcF91ZHBfY2hrc3VtOjE2LAorCQl0Y3Bfd2luOjE2OworCXVpbnQzMl90IHRjcF9zZXFfbnVtOworCXVpbnQzMl90IHRjcF9hY2tfbnVtOworCXVpbnQzMl90IGZsb3dfaWRfdG9lcGxpdHo7Cit9OworCisjZGVmaW5lIE5CVUZfTFJPX0VMSUdJQkxFKHNrYikgXAorCSgoKHN0cnVjdCBuYnVmX3J4X2NiICopKChza2IpLT5jYikpLT5scm9fZWxpZ2libGUpCisjZGVmaW5lIE5CVUZfVENQX1BST1RPKHNrYikgXAorCSgoKHN0cnVjdCBuYnVmX3J4X2NiICopKChza2IpLT5jYikpLT50Y3BfcHJvdG8pCisjZGVmaW5lIE5CVUZfVENQX1BVUkVfQUNLKHNrYikgXAorCSgoKHN0cnVjdCBuYnVmX3J4X2NiICopKChza2IpLT5jYikpLT50Y3BfcHVyZV9hY2spCisjZGVmaW5lIE5CVUZfSVBWNl9QUk9UTyhza2IpIFwKKwkoKChzdHJ1Y3QgbmJ1Zl9yeF9jYiAqKSgoc2tiKS0+Y2IpKS0+aXB2Nl9wcm90bykKKyNkZWZpbmUgTkJVRl9JUF9PRkZTRVQoc2tiKSBcCisJKCgoc3RydWN0IG5idWZfcnhfY2IgKikoKHNrYiktPmNiKSktPmlwX29mZnNldCkKKyNkZWZpbmUgTkJVRl9UQ1BfT0ZGU0VUKHNrYikgXAorCSgoKHN0cnVjdCBuYnVmX3J4X2NiICopKChza2IpLT5jYikpLT50Y3Bfb2Zmc2V0KQorI2RlZmluZSBOQlVGX1RDUF9DSEtTVU0oc2tiKSBcCisJKCgoc3RydWN0IG5idWZfcnhfY2IgKikoKHNrYiktPmNiKSktPnRjcF91ZHBfY2hrc3VtKQorI2RlZmluZSBOQlVGX1RDUF9TRVFfTlVNKHNrYikgXAorCSgoKHN0cnVjdCBuYnVmX3J4X2NiICopKChza2IpLT5jYikpLT50Y3Bfc2VxX251bSkKKyNkZWZpbmUgTkJVRl9UQ1BfQUNLX05VTShza2IpIFwKKwkoKChzdHJ1Y3QgbmJ1Zl9yeF9jYiAqKSgoc2tiKS0+Y2IpKS0+dGNwX2Fja19udW0pCisjZGVmaW5lIE5CVUZfVENQX1dJTihza2IpIFwKKwkoKChzdHJ1Y3QgbmJ1Zl9yeF9jYiAqKSgoc2tiKS0+Y2IpKS0+dGNwX3dpbikKKyNkZWZpbmUgTkJVRl9GTE9XX0lEX1RPRVBMSVRaKHNrYikJXAorCSgoKHN0cnVjdCBuYnVmX3J4X2NiICopKChza2IpLT5jYikpLT5mbG93X2lkX3RvZXBsaXR6KQorCisvKioKKyAqIGNkZl9wcmludF9scm9faW5mbygpIC0gcHJpbnRzIHRoZSBMUk8gaW5mb3JtYXRpb24KKyAqIEBza2IgOiBuZXR3b3JrIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCB0aGUgTFJPIHJlbGF0ZWQgZmllbGRzIGluIHRoZSByeAorICogZGVzY3JpcHRvcgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2RmX3ByaW50X2xyb19pbmZvKHN0cnVjdCBza19idWZmICpza2IpCit7CisJY2RmX3ByaW50KCJOQlVGX0xST19FTElHSUJMRSAweCV4XG4iCisJCSAiTkJVRl9UQ1BfUFJPVE8gMHgleFxuIgorCQkgIk5CVUZfVENQX1BVUkVfQUNLIDB4JXhcbiIKKwkJICJOQlVGX1RDUF9DSEtTVU0gMHgleFxuIgorCQkgIk5CVUZfSVBWNl9QUk9UTyAweCV4XG4iCisJCSAiTkJVRl9JUF9PRkZTRVQgMHgleFxuIgorCQkgIk5CVUZfVENQX09GRlNFVCAweCV4XG4iCisJCSAiTkJVRl9UQ1BfU0VRX05VTSAweCV4XG4iCisJCSAiTkJVRl9UQ1BfQUNLX05VTSAweCV4XG4iCisJCSAiTkJVRl9UQ1BfV0lOIDB4JXhcbiIKKwkJICJOQlVGX0ZMT1dfSURfVE9FUExJVFogMHgleFxuIiwKKwkJIE5CVUZfTFJPX0VMSUdJQkxFKHNrYiksCisJCSBOQlVGX1RDUF9QUk9UTyhza2IpLAorCQkgTkJVRl9UQ1BfUFVSRV9BQ0soc2tiKSwKKwkJIE5CVUZfVENQX0NIS1NVTShza2IpLAorCQkgTkJVRl9JUFY2X1BST1RPKHNrYiksCisJCSBOQlVGX0lQX09GRlNFVChza2IpLAorCQkgTkJVRl9UQ1BfT0ZGU0VUKHNrYiksCisJCSBOQlVGX1RDUF9TRVFfTlVNKHNrYiksCisJCSBOQlVGX1RDUF9BQ0tfTlVNKHNrYiksCisJCSBOQlVGX1RDUF9XSU4oc2tiKSwKKwkJIE5CVUZfRkxPV19JRF9UT0VQTElUWihza2IpKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0xSTyAqLworCisjZGVmaW5lIE5CVUZfU0VUX1BBQ0tFVF9TVEFURShza2IsIHBrdF9zdGF0ZSkgXAorCSgoKHN0cnVjdCBjdmdfbmJ1Zl9jYiAqKSgoc2tiKS0+Y2IpKS0+dHJhY2UucGFja2V0X3N0YXRlID0gXAorCQkJCQkJCQlwa3Rfc3RhdGUpCisjZGVmaW5lIE5CVUZfR0VUX1BBQ0tFVF9TVEFURShza2IpIFwKKwkoKChzdHJ1Y3QgY3ZnX25idWZfY2IgKikoKHNrYiktPmNiKSktPnRyYWNlLnBhY2tldF9zdGF0ZSkKKworI2RlZmluZSBOQlVGX1NFVF9QQUNLRVRfVFJBQ0soc2tiLCBwa3RfdHJhY2spIFwKKwkoKChzdHJ1Y3QgY3ZnX25idWZfY2IgKikoKHNrYiktPmNiKSktPnRyYWNlLnBhY2tldF90cmFjayA9IFwKKwkJCQkJCQkJcGt0X3RyYWNrKQorI2RlZmluZSBOQlVGX0dFVF9QQUNLRVRfVFJBQ0soc2tiKSBcCisJKCgoc3RydWN0IGN2Z19uYnVmX2NiICopKChza2IpLT5jYikpLT50cmFjZS5wYWNrZXRfdHJhY2spCisKKyNkZWZpbmUgTkJVRl9VUERBVEVfVFhfUEtUX0NPVU5UKHNrYiwgUEFDS0VUX1NUQVRFKSBcCisJY2RmX25idWZfc2V0X3N0YXRlKHNrYiwgUEFDS0VUX1NUQVRFKQorCisjZGVmaW5lIENERl9OQlVGX1NFVF9EUF9UUkFDRShza2IsIGVuYWJsZSkgXAorCSgoKHN0cnVjdCBjdmdfbmJ1Zl9jYiAqKSgoc2tiKS0+Y2IpKS0+dHJhY2UuZHBfdHJhY2UgXAorCQkJCQkJCQk9IGVuYWJsZSkKKyNkZWZpbmUgQ0RGX05CVUZfR0VUX0RQX1RSQUNFKHNrYikgXAorCSgoKHN0cnVjdCBjdmdfbmJ1Zl9jYiAqKSgoc2tiKS0+Y2IpKS0+dHJhY2UuZHBfdHJhY2UpCisKKyNkZWZpbmUgX19jZGZfbmJ1Zl9nZXRfbnVtX2ZyYWdzKHNrYikJCSAgIFwKKwkvKiBhc3N1bWUgdGhlIE9TIHByb3ZpZGVzIGEgc2luZ2xlIGZyYWdtZW50ICovIFwKKwkoTkJVRl9OVU1fRVhUUkFfRlJBR1Moc2tiKSArIDEpCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfVFNPKQorI2RlZmluZSBfX2NkZl9uYnVmX2RlY19udW1fZnJhZ3Moc2tiKQkJICAgXAorCShOQlVGX05VTV9FWFRSQV9GUkFHUyhza2IpLS0pCisjZW5kaWYKKworI2RlZmluZSBfX2NkZl9uYnVmX2ZyYWdfcHVzaF9oZWFkKCBcCisJCXNrYiwgZnJhZ19sZW4sIGZyYWdfdmFkZHIsIGZyYWdfcGFkZHJfbG8sIGZyYWdfcGFkZHJfaGkpIFwKKwlkbyB7IFwKKwkJaW50IGZyYWdfbnVtID0gTkJVRl9OVU1fRVhUUkFfRlJBR1Moc2tiKSsrOyBcCisJCU5CVUZfRVhUUkFfRlJBR19WQUREUihza2IsIGZyYWdfbnVtKSA9IGZyYWdfdmFkZHI7IFwKKwkJTkJVRl9FWFRSQV9GUkFHX1BBRERSX0xPKHNrYiwgZnJhZ19udW0pID0gZnJhZ19wYWRkcl9sbzsgXAorCQlOQlVGX0VYVFJBX0ZSQUdfTEVOKHNrYiwgZnJhZ19udW0pID0gZnJhZ19sZW47IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fY2RmX25idWZfZ2V0X2ZyYWdfbGVuKHNrYiwgZnJhZ19udW0pCQkgXAorCSgoZnJhZ19udW0gPCBOQlVGX05VTV9FWFRSQV9GUkFHUyhza2IpKSA/CSAgICAgXAorCSBOQlVGX0VYVFJBX0ZSQUdfTEVOKHNrYiwgZnJhZ19udW0pIDogKHNrYiktPmxlbikKKworI2RlZmluZSBfX2NkZl9uYnVmX2dldF9mcmFnX3ZhZGRyKHNrYiwgZnJhZ19udW0pCSAgICAgIFwKKwkoKGZyYWdfbnVtIDwgTkJVRl9OVU1fRVhUUkFfRlJBR1Moc2tiKSkgPwkJICBcCisJIE5CVUZfRVhUUkFfRlJBR19WQUREUihza2IsIGZyYWdfbnVtKSA6ICgoc2tiKS0+ZGF0YSkpCisKKyNkZWZpbmUgX19jZGZfbmJ1Zl9nZXRfZnJhZ19wYWRkcl9sbyhza2IsIGZyYWdfbnVtKQkJIFwKKwkoKGZyYWdfbnVtIDwgTkJVRl9OVU1fRVhUUkFfRlJBR1Moc2tiKSkgPwkJICAgICBcCisJIE5CVUZfRVhUUkFfRlJBR19QQUREUl9MTyhza2IsIGZyYWdfbnVtKSA6CQkgIFwKKwkvKiBhc3N1bWUgdGhhdCB0aGUgT1Mgb25seSBwcm92aWRlcyBhIHNpbmdsZSBmcmFnbWVudCAqLyBcCisJIE5CVUZfTUFQUEVEX1BBRERSX0xPKHNrYikpCisKKyNkZWZpbmUgX19jZGZfbmJ1Zl9nZXRfZnJhZ19pc193b3Jkc3RyZWFtKHNrYiwgZnJhZ19udW0pIFwKKwkoKGZyYWdfbnVtIDwgTkJVRl9OVU1fRVhUUkFfRlJBR1Moc2tiKSkgPwkgICAgIFwKKwkgKE5CVUZfRVhUUkFfRlJBR19XT1JEU1RSRUFNX0ZMQUdTKHNrYikgPj4JICBcCisJICAoZnJhZ19udW0pKSAmIDB4MSA6CQkJICAgICAgIFwKKwkgKE5CVUZfRVhUUkFfRlJBR19XT1JEU1RSRUFNX0ZMQUdTKHNrYikgPj4JICBcCisJICAoQ1ZHX05CVUZfTUFYX0VYVFJBX0ZSQUdTKSkgJiAweDEpCisKKyNkZWZpbmUgX19jZGZfbmJ1Zl9zZXRfZnJhZ19pc193b3Jkc3RyZWFtKHNrYiwgZnJhZ19udW0sIGlzX3dvcmRzdHJlYW0pCVwKKwlkbyB7CQkJCQkJCQkgICAgXAorCQlpZiAoZnJhZ19udW0gPj0gTkJVRl9OVU1fRVhUUkFfRlJBR1Moc2tiKSkgewkJCVwKKwkJCWZyYWdfbnVtID0gQ1ZHX05CVUZfTUFYX0VYVFJBX0ZSQUdTOwkJCSAgICBcCisJCX0JCQkJCQkJCVwKKwkJLyogY2xlYXIgdGhlIG9sZCB2YWx1ZSAqLwkJCQkJXAorCQlOQlVGX0VYVFJBX0ZSQUdfV09SRFNUUkVBTV9GTEFHUyhza2IpICY9IH4oMSA8PCBmcmFnX251bSk7CVwKKwkJLyogc2V0IHRoZSBuZXcgdmFsdWUgKi8JCQkJCQlcCisJCU5CVUZfRVhUUkFfRlJBR19XT1JEU1RSRUFNX0ZMQUdTKHNrYikgfD0JCQlcCisJCQkoKGlzX3dvcmRzdHJlYW0pIDw8IGZyYWdfbnVtKTsJCQkJICAgIFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fY2RmX25idWZfdHJhY2Vfc2V0X3Byb3RvX3R5cGUoc2tiLCBwcm90b190eXBlKSBcCisJTkJVRl9TRVRfUFJPVE9fVFlQRShza2IsIHByb3RvX3R5cGUpCisjZGVmaW5lIF9fY2RmX25idWZfdHJhY2VfZ2V0X3Byb3RvX3R5cGUoc2tiKSBcCisJTkJVRl9HRVRfUFJPVE9fVFlQRShza2IpOworCisvKioKKyAqIF9fY2RmX25idWZfZGF0YV9hdHRyX2dldCgpIC0gIFJldHJpZXZlcyB0aGUgZGF0YV9hdHRyIHZhbHVlCisgKgkJCQkgZnJvbSBjdmdfbmJ1Zl9jYiAoc2tiLT5jYikKKyAqIEBza2I6IFBvaW50ZXIgdG8gc3RydWN0IHNrX2J1ZmYKKyAqCisgKiBSZXR1cm46IGRhdGFfYXR0cgorICovCisjZGVmaW5lIF9fY2RmX25idWZfZGF0YV9hdHRyX2dldChza2IpCQlcCisJTkJVRl9EQVRBX0FUVFJfR0VUKHNrYikKKworLyoqCisgKiBfX2NkZl9uYnVmX2RhdGFfYXR0cl9zZXQoKSAgLSAgU2V0cyB0aGUgZGF0YV9hdHRyIHZhbHVlCisgKgkJCQkgIGluIGN2Z19uYnVmX2NiIChza2ItPmNiKQorICogQHNrYjogUG9pbnRlciB0byBzdHJ1Y3Qgc2tfYnVmZgorICogQGRhdGFfYXR0cjogcGFja2V0IHR5cGUgZnJvbSB0aGUgZW51bSBjZGZfdHhyeF9wa3RfdHlwZQorICoKKyAqIFJldHVybjoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2NkZl9uYnVmX2RhdGFfYXR0cl9zZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgdWludDMyX3QgZGF0YV9hdHRyKQoreworCU5CVUZfREFUQV9BVFRSX1NFVChza2IsIGRhdGFfYXR0cik7Cit9CisKKy8qKgorICogdHlwZWRlZiBzdHJ1Y3QgX19jZGZfbmJ1Zl9xdWV1ZV90IC0gIG5ldHdvcmsgYnVmZmVyIHF1ZXVlCisgKiBAaGVhZDogSGVhZCBwb2ludGVyCisgKiBAdGFpbDogVGFpbCBwb2ludGVyCisgKiBAcWxlbjogUXVldWUgbGVuZ3RoCisgKi8KK3R5cGVkZWYgc3RydWN0IF9fY2RmX25idWZfcWhlYWQgeworCXN0cnVjdCBza19idWZmICpoZWFkOworCXN0cnVjdCBza19idWZmICp0YWlsOworCXVuc2lnbmVkIGludCBxbGVuOworfSBfX2NkZl9uYnVmX3F1ZXVlX3Q7CisKKy8qCisgKiBVc2Ugc2tfYnVmZl9oZWFkIGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjZGZfbmJ1Zl9xdWV1ZV90LgorICogQmVjYXVzZSB0aGUgcXVldWUgaGVhZCB3aWxsIG1vc3QgbGlrZWx5IHB1dCBpbiBzb21lIHN0cnVjdHVyZSwKKyAqIHdlIGRvbid0IHVzZSBwb2ludGVyIHR5cGUgYXMgdGhlIGRlZmluaXRpb24uCisgKi8KKworLyoKKyAqIHByb3RvdHlwZXMuIEltcGxlbWVudGVkIGluIGNkZl9uYnVmLmMKKyAqLworX19jZGZfbmJ1Zl90IF9fY2RmX25idWZfYWxsb2MoX19jZGZfZGV2aWNlX3Qgb3NkZXYsIHNpemVfdCBzaXplLCBpbnQgcmVzZXJ2ZSwKKwkJCSAgICAgIGludCBhbGlnbiwgaW50IHByaW8pOwordm9pZCBfX2NkZl9uYnVmX2ZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitDREZfU1RBVFVTIF9fY2RmX25idWZfbWFwKF9fY2RmX2RldmljZV90IG9zZGV2LAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjZGZfZG1hX2Rpcl90IGRpcik7Cit2b2lkIF9fY2RmX25idWZfdW5tYXAoX19jZGZfZGV2aWNlX3Qgb3NkZXYsCisJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGNkZl9kbWFfZGlyX3QgZGlyKTsKK0NERl9TVEFUVVMgX19jZGZfbmJ1Zl9tYXBfc2luZ2xlKF9fY2RmX2RldmljZV90IG9zZGV2LAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjZGZfZG1hX2Rpcl90IGRpcik7Cit2b2lkIF9fY2RmX25idWZfdW5tYXBfc2luZ2xlKF9fY2RmX2RldmljZV90IG9zZGV2LAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjZGZfZG1hX2Rpcl90IGRpcik7Cit2b2lkIF9fY2RmX25idWZfcmVnX3RyYWNlX2NiKGNkZl9uYnVmX3RyYWNlX3VwZGF0ZV90IGNiX2Z1bmNfcHRyKTsKKworI2lmZGVmIFFDQV9QS1RfUFJPVE9fVFJBQ0UKK3ZvaWQgX19jZGZfbmJ1Zl90cmFjZV91cGRhdGUoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgY2hhciAqZXZlbnRfc3RyaW5nKTsKKyNlbHNlCisjZGVmaW5lIF9fY2RmX25idWZfdHJhY2VfdXBkYXRlKHNrYiwgZXZlbnRfc3RyaW5nKQorI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworLyoqCisgKiBfX2NkZl9vc190b19zdGF0dXMoKSAtIE9TIHRvIENERiBzdGF0dXMgY29udmVyc2lvbgorICogQGVycm9yIDogT1MgZXJyb3IKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworc3RhdGljIGlubGluZSBDREZfU1RBVFVTIF9fY2RmX29zX3RvX3N0YXR1cyhzaWduZWQgaW50IGVycm9yKQoreworCXN3aXRjaCAoZXJyb3IpIHsKKwljYXNlIDA6CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJY2FzZSBFTk9NRU06CisJY2FzZSAtRU5PTUVNOgorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCWRlZmF1bHQ6CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9TVVBQT1JUOworCX0KK30KKworLyoqCisgKiBfX2NkZl9uYnVmX2xlbigpIC0gcmV0dXJuIHRoZSBhbW91bnQgb2YgdmFsaWQgZGF0YSBpbiB0aGUgc2tiCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKgorICogVGhpcyBBUEkgcmV0dXJucyB0aGUgYW1vdW50IG9mIHZhbGlkIGRhdGEgaW4gdGhlIHNrYiwgSWYgdGhlcmUgYXJlIGZyYWdzCisgKiB0aGVuIGl0IHJldHVybnMgdG90YWwgbGVuZ3RoLgorICoKKyAqIFJldHVybjogbmV0d29yayBidWZmZXIgbGVuZ3RoCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IF9fY2RmX25idWZfbGVuKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGksIGV4dHJhX2ZyYWdfbGVuID0gMDsKKworCWkgPSBOQlVGX05VTV9FWFRSQV9GUkFHUyhza2IpOworCXdoaWxlIChpLS0gPiAwKQorCQlleHRyYV9mcmFnX2xlbiArPSBOQlVGX0VYVFJBX0ZSQUdfTEVOKHNrYiwgaSk7CisKKwlyZXR1cm4gZXh0cmFfZnJhZ19sZW4gKyBza2ItPmxlbjsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX2NhdCgpIC0gbGluayB0d28gbmJ1ZnMKKyAqIEBkc3Q6IEJ1ZmZlciB0byBwaWdneWJhY2sgaW50bworICogQHNyYzogQnVmZmVyIHRvIHB1dAorICoKKyAqIExpbmsgdG93IG5idWZzIHRoZSBuZXcgYnVmIGlzIHBpZ2d5YmFja2VkIGludG8gdGhlIG9sZGVyIG9uZS4gVGhlIG9sZGVyCisgKiAoc3JjKSBza2IgaXMgcmVsZWFzZWQuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIChzdGF0dXMgb2YgdGhlIGNhbGwpIGlmIGZhaWxlZCB0aGUgc3JjIHNrYgorICoJICAgaXMgcmVsZWFzZWQKKyAqLworc3RhdGljIGlubGluZSBDREZfU1RBVFVTCitfX2NkZl9uYnVmX2NhdChzdHJ1Y3Qgc2tfYnVmZiAqZHN0LCBzdHJ1Y3Qgc2tfYnVmZiAqc3JjKQoreworCUNERl9TVEFUVVMgZXJyb3IgPSAwOworCisJY2RmX2Fzc2VydChkc3QgJiYgc3JjKTsKKworCS8qCisJICogU2luY2UgcHNrYl9leHBhbmRfaGVhZCB1bmNvbmRpdGlvbmFsbHkgcmVhbGxvY2F0ZXMgdGhlIHNrYi0+aGVhZAorCSAqIGJ1ZmZlciwgZmlyc3QgY2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBidWZmZXIgaXMgYWxyZWFkeSBsYXJnZQorCSAqIGVub3VnaC4KKwkgKi8KKwlpZiAoc2tiX3RhaWxyb29tKGRzdCkgPCBzcmMtPmxlbikgeworCQllcnJvciA9IHBza2JfZXhwYW5kX2hlYWQoZHN0LCAwLCBzcmMtPmxlbiwgR0ZQX0FUT01JQyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBfX2NkZl9vc190b19zdGF0dXMoZXJyb3IpOworCX0KKwltZW1jcHkoc2tiX3RhaWxfcG9pbnRlcihkc3QpLCBzcmMtPmRhdGEsIHNyYy0+bGVuKTsKKworCXNrYl9wdXQoZHN0LCBzcmMtPmxlbik7CisJZGV2X2tmcmVlX3NrYl9hbnkoc3JjKTsKKworCXJldHVybiBfX2NkZl9vc190b19zdGF0dXMoZXJyb3IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKipuYnVmIG1hbmlwdWxhdGlvbiByb3V0aW5lcyoqKioqKioqKioqKioqKioqLworCisvKioKKyAqIF9fY2RmX25idWZfaGVhZHJvb20oKSAtIHJldHVybiB0aGUgYW1vdW50IG9mIHRhaWwgc3BhY2UgYXZhaWxhYmxlCisgKiBAYnVmOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKgorICogUmV0dXJuOiBhbW91bnQgb2YgdGFpbCByb29tCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fY2RmX25idWZfaGVhZHJvb20oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiX2hlYWRyb29tKHNrYik7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl90YWlscm9vbSgpIC0gcmV0dXJuIHRoZSBhbW91bnQgb2YgdGFpbCBzcGFjZSBhdmFpbGFibGUKKyAqIEBidWY6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IGFtb3VudCBvZiB0YWlsIHJvb20KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBfX2NkZl9uYnVmX3RhaWxyb29tKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYl90YWlscm9vbShza2IpOworfQorCisvKioKKyAqIF9fY2RmX25idWZfcHVzaF9oZWFkKCkgLSBQdXNoIGRhdGEgaW4gdGhlIGZyb250CisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKiBAc2l6ZTogc2l6ZSB0byBiZSBwdXNoZWQKKyAqCisgKiBSZXR1cm46IE5ldyBkYXRhIHBvaW50ZXIgb2YgdGhpcyBidWYgYWZ0ZXIgZGF0YSBoYXMgYmVlbiBwdXNoZWQsCisgKgkgICBvciBOVUxMIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGlzIGJ1Zi4KKyAqLworc3RhdGljIGlubGluZSB1aW50OF90ICpfX2NkZl9uYnVmX3B1c2hfaGVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoTkJVRl9NQVBQRURfUEFERFJfTE8oc2tiKSkKKwkJTkJVRl9NQVBQRURfUEFERFJfTE8oc2tiKSAtPSBzaXplOworCisJcmV0dXJuIHNrYl9wdXNoKHNrYiwgc2l6ZSk7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9wdXRfdGFpbCgpIC0gUHV0cyBkYXRhIGluIHRoZSBlbmQKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqIEBzaXplOiBzaXplIHRvIGJlIHB1c2hlZAorICoKKyAqIFJldHVybjogZGF0YSBwb2ludGVyIG9mIHRoaXMgYnVmIHdoZXJlIG5ldyBkYXRhIGhhcyB0byBiZQorICoJICAgcHV0LCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGlzIGJ1Zi4KKyAqLworc3RhdGljIGlubGluZSB1aW50OF90ICpfX2NkZl9uYnVmX3B1dF90YWlsKHN0cnVjdCBza19idWZmICpza2IsIHNpemVfdCBzaXplKQoreworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IHNpemUpIHsKKwkJaWYgKHVubGlrZWx5KHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLAorCQkJc2l6ZSAtIHNrYl90YWlscm9vbShza2IpLCBHRlBfQVRPTUlDKSkpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gc2tiX3B1dChza2IsIHNpemUpOworfQorCisvKioKKyAqIF9fY2RmX25idWZfcHVsbF9oZWFkKCkgLSBwdWxsIGRhdGEgb3V0IGZyb20gdGhlIGZyb250CisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKiBAc2l6ZTogc2l6ZSB0byBiZSBwb3BwZWQKKyAqCisgKiBSZXR1cm46IE5ldyBkYXRhIHBvaW50ZXIgb2YgdGhpcyBidWYgYWZ0ZXIgZGF0YSBoYXMgYmVlbiBwb3BwZWQsCisgKgkgICBvciBOVUxMIGlmIHRoZXJlIGlzIG5vdCBzdWZmaWNpZW50IGRhdGEgdG8gcHVsbC4KKyAqLworc3RhdGljIGlubGluZSB1aW50OF90ICpfX2NkZl9uYnVmX3B1bGxfaGVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoTkJVRl9NQVBQRURfUEFERFJfTE8oc2tiKSkKKwkJTkJVRl9NQVBQRURfUEFERFJfTE8oc2tiKSArPSBzaXplOworCisJcmV0dXJuIHNrYl9wdWxsKHNrYiwgc2l6ZSk7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl90cmltX3RhaWwoKSAtIHRyaW0gZGF0YSBvdXQgZnJvbSB0aGUgZW5kCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKiBAc2l6ZTogc2l6ZSB0byBiZSBwb3BwZWQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fY2RmX25idWZfdHJpbV90YWlsKHN0cnVjdCBza19idWZmICpza2IsIHNpemVfdCBzaXplKQoreworCXJldHVybiBza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gc2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKipuYnVmIHByaXZhdGUgYnVmZmVyIHJvdXRpbmVzKioqKioqKioqKioqKi8KKworLyoqCisgKiBfX2NkZl9uYnVmX3BlZWtfaGVhZGVyKCkgLSByZXR1cm4gdGhlIGhlYWRlcidzIGFkZHIgJiBtX2xlbgorICogQHNrYjogUG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlcgorICogQGFkZHI6IFBvaW50ZXIgdG8gc3RvcmUgaGVhZGVyJ3MgYWRkcgorICogQG1fbGVuOiBuZXR3b3JrIGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2NkZl9uYnVmX3BlZWtfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHVpbnQ4X3QgKiphZGRyLCB1aW50MzJfdCAqbGVuKQoreworCSphZGRyID0gc2tiLT5kYXRhOworCSpsZW4gPSBza2ItPmxlbjsKK30KKworLyoqKioqKioqKioqKioqKioqKkN1c3RvbSBxdWV1ZSoqKioqKioqKioqKiovCisKKy8qKgorICogX19jZGZfbmJ1Zl9xdWV1ZV9pbml0KCkgLSBpbml0aWFsbGl6ZSB0aGUgcXVldWUgaGVhZAorICogQHFoZWFkOiBRdWV1ZSBoZWFkCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK3N0YXRpYyBpbmxpbmUgQ0RGX1NUQVRVUyBfX2NkZl9uYnVmX3F1ZXVlX2luaXQoX19jZGZfbmJ1Zl9xdWV1ZV90ICpxaGVhZCkKK3sKKwltZW1zZXQocWhlYWQsIDAsIHNpemVvZihzdHJ1Y3QgX19jZGZfbmJ1Zl9xaGVhZCkpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9xdWV1ZV9hZGQoKSAtIGFkZCBhbiBza2IgaW4gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlCisgKiBAcWhlYWQ6IFF1ZXVlIGhlYWQKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqCisgKiBUaGlzIGlzIGEgbG9ja2xlc3MgdmVyc2lvbiwgZHJpdmVyIG11c3QgYWNxdWlyZSBsb2NrcyBpZiBpdAorICogbmVlZHMgdG8gc3luY2hyb25pemUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2NkZl9uYnVmX3F1ZXVlX2FkZChfX2NkZl9uYnVmX3F1ZXVlX3QgKnFoZWFkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+bmV4dCA9IE5VTEw7ICAgICAgIC8qTnVsbGlmeSB0aGUgbmV4dCBwdHIgKi8KKworCWlmICghcWhlYWQtPmhlYWQpCisJCXFoZWFkLT5oZWFkID0gc2tiOworCWVsc2UKKwkJcWhlYWQtPnRhaWwtPm5leHQgPSBza2I7CisKKwlxaGVhZC0+dGFpbCA9IHNrYjsKKwlxaGVhZC0+cWxlbisrOworfQorCisvKioKKyAqIF9fY2RmX25idWZfcXVldWVfaW5zZXJ0X2hlYWQoKSAtIGFkZCBhbiBza2IgYXQgIHRoZSBoZWFkICBvZiB0aGUgcXVldWUKKyAqIEBxaGVhZDogUXVldWUgaGVhZAorICogQHNrYjogUG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlcgorICoKKyAqIFRoaXMgaXMgYSBsb2NrbGVzcyB2ZXJzaW9uLCBkcml2ZXIgbXVzdCBhY3F1aXJlIGxvY2tzIGlmIGl0IG5lZWRzIHRvCisgKiBzeW5jaHJvbml6ZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fY2RmX25idWZfcXVldWVfaW5zZXJ0X2hlYWQoX19jZGZfbmJ1Zl9xdWV1ZV90ICpxaGVhZCwgX19jZGZfbmJ1Zl90IHNrYikKK3sKKwlpZiAoIXFoZWFkLT5oZWFkKSB7CisJCS8qRW1wdHkgcXVldWUgVGFpbCBwb2ludGVyIE11c3QgYmUgdXBkYXRlZCAqLworCQlxaGVhZC0+dGFpbCA9IHNrYjsKKwl9CisJc2tiLT5uZXh0ID0gcWhlYWQtPmhlYWQ7CisJcWhlYWQtPmhlYWQgPSBza2I7CisJcWhlYWQtPnFsZW4rKzsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX3F1ZXVlX3JlbW92ZSgpIC0gcmVtb3ZlIGEgc2tiIGZyb20gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlCisgKiBAcWhlYWQ6IFF1ZXVlIGhlYWQKKyAqCisgKiBUaGlzIGlzIGEgbG9ja2xlc3MgdmVyc2lvbi4gRHJpdmVyIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhlIGxvY2tzCisgKgorICogUmV0dXJuOiBza2Igb3IgTlVMTAorICovCitzdGF0aWMgaW5saW5lCitzdHJ1Y3Qgc2tfYnVmZiAqX19jZGZfbmJ1Zl9xdWV1ZV9yZW1vdmUoX19jZGZfbmJ1Zl9xdWV1ZV90ICpxaGVhZCkKK3sKKwlfX2NkZl9uYnVmX3QgdG1wID0gTlVMTDsKKworCWlmIChxaGVhZC0+aGVhZCkgeworCQlxaGVhZC0+cWxlbi0tOworCQl0bXAgPSBxaGVhZC0+aGVhZDsKKwkJaWYgKHFoZWFkLT5oZWFkID09IHFoZWFkLT50YWlsKSB7CisJCQlxaGVhZC0+aGVhZCA9IE5VTEw7CisJCQlxaGVhZC0+dGFpbCA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlxaGVhZC0+aGVhZCA9IHRtcC0+bmV4dDsKKwkJfQorCQl0bXAtPm5leHQgPSBOVUxMOworCX0KKwlyZXR1cm4gdG1wOworfQorCisvKioKKyAqIF9fY2RmX25idWZfcXVldWVfbGVuKCkgLSByZXR1cm4gdGhlIHF1ZXVlIGxlbmd0aAorICogQHFoZWFkOiBRdWV1ZSBoZWFkCisgKgorICogUmV0dXJuOiBRdWV1ZSBsZW5ndGgKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBfX2NkZl9uYnVmX3F1ZXVlX2xlbihfX2NkZl9uYnVmX3F1ZXVlX3QgKnFoZWFkKQoreworCXJldHVybiBxaGVhZC0+cWxlbjsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX3F1ZXVlX25leHQoKSAtIHJldHVybiB0aGUgbmV4dCBza2IgZnJvbSBwYWNrZXQgY2hhaW4KKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqCisgKiBUaGlzIEFQSSByZXR1cm5zIHRoZSBuZXh0IHNrYiBmcm9tIHBhY2tldCBjaGFpbiwgcmVtZW1iZXIgdGhlIHNrYiBpcworICogc3RpbGwgaW4gdGhlIHF1ZXVlCisgKgorICogUmV0dXJuOiBOVUxMIGlmIG5vIHBhY2tldHMgYXJlIHRoZXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fY2RmX25idWZfcXVldWVfbmV4dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPm5leHQ7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9pc19xdWV1ZV9lbXB0eSgpIC0gY2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5IG9yIG5vdAorICogQHFoZWFkOiBRdWV1ZSBoZWFkCisgKgorICogUmV0dXJuOiB0cnVlIGlmIGxlbmd0aCBpcyAwIGVsc2UgZmFsc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIF9fY2RmX25idWZfaXNfcXVldWVfZW1wdHkoX19jZGZfbmJ1Zl9xdWV1ZV90ICpxaGVhZCkKK3sKKwlyZXR1cm4gcWhlYWQtPnFsZW4gPT0gMDsKK30KKworLyoKKyAqIFVzZSBza19idWZmX2hlYWQgYXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGNkZl9uYnVmX3F1ZXVlX3QuCisgKiBCZWNhdXNlIHRoZSBxdWV1ZSBoZWFkIHdpbGwgbW9zdCBsaWtlbHkgcHV0IGluIHNvbWUgc3RydWN0dXJlLAorICogd2UgZG9uJ3QgdXNlIHBvaW50ZXIgdHlwZSBhcyB0aGUgZGVmaW5pdGlvbi4KKyAqLworCisvKgorICogcHJvdG90eXBlcy4gSW1wbGVtZW50ZWQgaW4gY2RmX25idWYuYworICovCitjZGZfbmJ1Zl90eF9ja3N1bV90IF9fY2RmX25idWZfZ2V0X3R4X2Nrc3VtKHN0cnVjdCBza19idWZmICpza2IpOworQ0RGX1NUQVRVUyBfX2NkZl9uYnVmX3NldF9yeF9ja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIGNkZl9uYnVmX3J4X2Nrc3VtX3QgKmNrc3VtKTsKK3VpbnQ4X3QgX19jZGZfbmJ1Zl9nZXRfdGlkKHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBfX2NkZl9uYnVmX3NldF90aWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDhfdCB0aWQpOwordWludDhfdCBfX2NkZl9uYnVmX2dldF9leGVtcHRpb25fdHlwZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworLyoKKyAqIGNkZl9uYnVmX3Bvb2xfZGVsZXRlKCkgaW1wbGVtZW50YXRpb24gLSBkbyBub3RoaW5nIGluIGxpbnV4CisgKi8KKyNkZWZpbmUgX19jZGZfbmJ1Zl9wb29sX2RlbGV0ZShvc2RldikKKworLyoqCisgKiBfX2NkZl9uYnVmX2Nsb25lKCkgLSBjbG9uZSB0aGUgbmJ1ZiAoY29weSBpcyByZWFkb25seSkKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqCisgKiBpZiBHRlBfQVRPTUlDIGlzIG92ZXJraWxsIHRoZW4gd2UgY2FuIGNoZWNrIHdoZXRoZXIgaXRzCisgKiBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCBhbmQgdGhlbiBkbyBpdCBvciBlbHNlIGluCisgKiBub3JtYWwgY2FzZSB1c2UgR0ZQX0tFUk5FTAorICoKKyAqIGV4YW1wbGUgICAgIHVzZSAiaW5faXJxKCkgfHwgaXJxc19kaXNhYmxlZCgpIgorICoKKyAqIFJldHVybjogY2xvbmVkIHNrYgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpfX2NkZl9uYnVmX2Nsb25lKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworfQorCisvKioKKyAqIF9fY2RmX25idWZfY29weSgpIC0gcmV0dXJucyBhIHByaXZhdGUgY29weSBvZiB0aGUgc2tiCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKgorICogVGhpcyBBUEkgcmV0dXJucyBhIHByaXZhdGUgY29weSBvZiB0aGUgc2tiLCB0aGUgc2tiIHJldHVybmVkIGlzIGNvbXBsZXRlbHkKKyAqICBtb2RpZmlhYmxlIGJ5IGNhbGxlcnMKKyAqCisgKiBSZXR1cm46IHNrYiBvciBOVUxMCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fY2RmX25idWZfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworfQorCisjZGVmaW5lIF9fY2RmX25idWZfcmVzZXJ2ZSAgICAgIHNrYl9yZXNlcnZlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKlhYWDogbWlzYyBhcGkncyoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBfX2NkZl9uYnVmX2hlYWQoKSAtIHJldHVybiB0aGUgcG9pbnRlciB0aGUgc2tiJ3MgaGVhZCBwb2ludGVyCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKgorICogUmV0dXJuOiBQb2ludGVyIHRvIGhlYWQgYnVmZmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqX19jZGZfbmJ1Zl9oZWFkKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+aGVhZDsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX2RhdGEoKSAtIHJldHVybiB0aGUgcG9pbnRlciB0byBkYXRhIGhlYWRlciBpbiB0aGUgc2tiCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKgorICogUmV0dXJuOiBQb2ludGVyIHRvIHNrYiBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqX19jZGZfbmJ1Zl9kYXRhKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+ZGF0YTsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX2dldF9wcm90b2NvbCgpIC0gcmV0dXJuIHRoZSBwcm90b2NvbCB2YWx1ZSBvZiB0aGUgc2tiCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKgorICogUmV0dXJuOiBza2IgcHJvdG9jb2wKKyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdCBfX2NkZl9uYnVmX2dldF9wcm90b2NvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPnByb3RvY29sOworfQorCisvKioKKyAqIF9fY2RmX25idWZfZ2V0X2lwX3N1bW1lZCgpIC0gcmV0dXJuIHRoZSBpcCBjaGVja3N1bSB2YWx1ZSBvZiB0aGUgc2tiCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKgorICogUmV0dXJuOiBza2IgaXBfc3VtbWVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBfX2NkZl9uYnVmX2dldF9pcF9zdW1tZWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5pcF9zdW1tZWQ7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9zZXRfaXBfc3VtbWVkKCkgLSBzZXRzIHRoZSBpcF9zdW1tZWQgdmFsdWUgb2YgdGhlIHNrYgorICogQHNrYjogUG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlcgorICogQGlwX3N1bW1lZDogaXAgY2hlY2tzdW0KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fY2RmX25idWZfc2V0X2lwX3N1bW1lZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1aW50OF90IGlwX3N1bW1lZCkKK3sKKwlza2ItPmlwX3N1bW1lZCA9IGlwX3N1bW1lZDsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX2dldF9wcmlvcml0eSgpIC0gcmV0dXJuIHRoZSBwcmlvcml0eSB2YWx1ZSBvZiB0aGUgc2tiCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKgorICogUmV0dXJuOiBza2IgcHJpb3JpdHkKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBfX2NkZl9uYnVmX2dldF9wcmlvcml0eShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPnByaW9yaXR5OworfQorCisvKioKKyAqIF9fY2RmX25idWZfc2V0X3ByaW9yaXR5KCkgLSBzZXRzIHRoZSBwcmlvcml0eSB2YWx1ZSBvZiB0aGUgc2tiCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKiBAcDogcHJpb3JpdHkKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fY2RmX25idWZfc2V0X3ByaW9yaXR5KHN0cnVjdCBza19idWZmICpza2IsIHVpbnQzMl90IHApCit7CisJc2tiLT5wcmlvcml0eSA9IHA7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9zZXRfbmV4dCgpIC0gc2V0cyB0aGUgbmV4dCBza2IgcG9pbnRlciBvZiB0aGUgY3VycmVudCBza2IKKyAqIEBza2I6IEN1cnJlbnQgc2tiCisgKiBAbmV4dF9za2I6IE5leHQgc2tiCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19jZGZfbmJ1Zl9zZXRfbmV4dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX25leHQpCit7CisJc2tiLT5uZXh0ID0gc2tiX25leHQ7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9uZXh0KCkgLSByZXR1cm4gdGhlIG5leHQgc2tiIHBvaW50ZXIgb2YgdGhlIGN1cnJlbnQgc2tiCisgKiBAc2tiOiBDdXJyZW50IHNrYgorICoKKyAqIFJldHVybjogdGhlIG5leHQgc2tiIHBvaW50ZWQgdG8gYnkgdGhlIGN1cnJlbnQgc2tiCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fY2RmX25idWZfbmV4dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPm5leHQ7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9zZXRfbmV4dF9leHQoKSAtIHNldHMgdGhlIG5leHQgc2tiIHBvaW50ZXIgb2YgdGhlIGN1cnJlbnQgc2tiCisgKiBAc2tiOiBDdXJyZW50IHNrYgorICogQG5leHRfc2tiOiBOZXh0IHNrYgorICoKKyAqIFRoaXMgZm4gaXMgdXNlZCB0byBsaW5rIHVwIGV4dGVuc2lvbnMgdG8gdGhlIGhlYWQgc2tiLiBEb2VzIG5vdCBoYW5kbGUKKyAqIGxpbmtpbmcgdG8gdGhlIGhlYWQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2NkZl9uYnVmX3NldF9uZXh0X2V4dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX25leHQpCit7CisJc2tiLT5uZXh0ID0gc2tiX25leHQ7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9uZXh0X2V4dCgpIC0gcmV0dXJuIHRoZSBuZXh0IHNrYiBwb2ludGVyIG9mIHRoZSBjdXJyZW50IHNrYgorICogQHNrYjogQ3VycmVudCBza2IKKyAqCisgKiBSZXR1cm46IHRoZSBuZXh0IHNrYiBwb2ludGVkIHRvIGJ5IHRoZSBjdXJyZW50IHNrYgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpfX2NkZl9uYnVmX25leHRfZXh0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bmV4dDsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX2FwcGVuZF9leHRfbGlzdCgpIC0gbGluayBsaXN0IG9mIHBhY2tldCBleHRlbnNpb25zIHRvIHRoZSBoZWFkCisgKiBAc2tiX2hlYWQ6IGhlYWRfYnVmIG5idWYgaG9sZGluZyBoZWFkIHNlZ21lbnQgKHNpbmdsZSkKKyAqIEBleHRfbGlzdDogbmJ1ZiBsaXN0IGhvbGRpbmcgbGlua2VkIGV4dGVuc2lvbnMgdG8gdGhlIGhlYWQKKyAqIEBleHRfbGVuOiBUb3RhbCBsZW5ndGggb2YgYWxsIGJ1ZmZlcnMgaW4gdGhlIGV4dGVuc2lvbiBsaXN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxpbmsgdXAgYSBsaXN0IG9mIHBhY2tldCBleHRlbnNpb25zIChzZWcxLCAyLCogIC4uLikKKyAqIHRvIHRoZSBuYnVmIGhvbGRpbmcgdGhlIGhlYWQgc2VnbWVudCAoc2VnMCkKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2NkZl9uYnVmX2FwcGVuZF9leHRfbGlzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2hlYWQsCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqZXh0X2xpc3QsIHNpemVfdCBleHRfbGVuKQoreworCXNrYl9zaGluZm8oc2tiX2hlYWQpLT5mcmFnX2xpc3QgPSBleHRfbGlzdDsKKwlza2JfaGVhZC0+ZGF0YV9sZW4gPSBleHRfbGVuOworCXNrYl9oZWFkLT5sZW4gKz0gc2tiX2hlYWQtPmRhdGFfbGVuOworfQorCisvKioKKyAqIF9fY2RmX25idWZfdHhfZnJlZSgpIC0gZnJlZSBza2IgbGlzdAorICogQHNrYjogUG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlcgorICogQHR4X2VycjogVFggZXJyb3IKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fY2RmX25idWZfdHhfZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqYnVmcywgaW50IHR4X2VycikKK3sKKwl3aGlsZSAoYnVmcykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IF9fY2RmX25idWZfbmV4dChidWZzKTsKKwkJX19jZGZfbmJ1Zl9mcmVlKGJ1ZnMpOworCQlidWZzID0gbmV4dDsKKwl9Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9nZXRfYWdlKCkgLSByZXR1cm4gdGhlIGNoZWNrc3VtIHZhbHVlIG9mIHRoZSBza2IKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqCisgKiBSZXR1cm46IGNoZWNrc3VtIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgX19jZGZfbmJ1Zl9nZXRfYWdlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+Y3N1bTsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX3NldF9hZ2UoKSAtIHNldHMgdGhlIGNoZWNrc3VtIHZhbHVlIG9mIHRoZSBza2IKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqIEB2OiBWYWx1ZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19jZGZfbmJ1Zl9zZXRfYWdlKHN0cnVjdCBza19idWZmICpza2IsIHVpbnQzMl90IHYpCit7CisJc2tiLT5jc3VtID0gdjsKK30KKworLyoqCisgKiBfX2NkZl9uYnVmX2Fkal9hZ2UoKSAtIGFkanVzdHMgdGhlIGNoZWNrc3VtL2FnZSB2YWx1ZSBvZiB0aGUgc2tiCisgKiBAc2tiOiBQb2ludGVyIHRvIG5ldHdvcmsgYnVmZmVyCisgKiBAYWRqOiBBZGp1c3RtZW50IHZhbHVlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NkZl9uYnVmX2Fkal9hZ2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDMyX3QgYWRqKQoreworCXNrYi0+Y3N1bSAtPSBhZGo7Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9jb3B5X2JpdHMoKSAtIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb3B5IGJpdHMgZm9yIHNrYgorICogQHNrYjogUG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlcgorICogQG9mZnNldDogT2Zmc2V0IHZhbHVlCisgKiBAbGVuOiBMZW5ndGgKKyAqIEB0bzogRGVzdGluYXRpb24gcG9pbnRlcgorICoKKyAqIFJldHVybjogbGVuZ3RoIG9mIHRoZSBjb3B5IGJpdHMgZm9yIHNrYgorICovCitzdGF0aWMgaW5saW5lIGludDMyX3QKK19fY2RmX25idWZfY29weV9iaXRzKHN0cnVjdCBza19idWZmICpza2IsIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGxlbiwgdm9pZCAqdG8pCit7CisJcmV0dXJuIHNrYl9jb3B5X2JpdHMoc2tiLCBvZmZzZXQsIHRvLCBsZW4pOworfQorCisvKioKKyAqIF9fY2RmX25idWZfc2V0X3BrdGxlbigpIC0gc2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBza2IgYW5kIGFkanVzdCB0aGUgdGFpbAorICogQHNrYjogUG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlcgorICogQGxlbjogIFBhY2tldCBsZW5ndGgKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fY2RmX25idWZfc2V0X3BrdGxlbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1aW50MzJfdCBsZW4pCit7CisJaWYgKHNrYi0+bGVuID4gbGVuKSB7CisJCXNrYl90cmltKHNrYiwgbGVuKTsKKwl9IGVsc2UgeworCQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBsZW4gLSBza2ItPmxlbikgeworCQkJaWYgKHVubGlrZWx5KHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLAorCQkJCWxlbiAtIHNrYi0+bGVuIC0gc2tiX3RhaWxyb29tKHNrYiksCisJCQkJR0ZQX0FUT01JQykpKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQljZGZfYXNzZXJ0KDApOworCQkJfQorCQl9CisJCXNrYl9wdXQoc2tiLCAobGVuIC0gc2tiLT5sZW4pKTsKKwl9Cit9CisKKy8qKgorICogX19jZGZfbmJ1Zl9zZXRfcHJvdG9jb2woKSAtIHNldHMgdGhlIHByb3RvY29sIHZhbHVlIG9mIHRoZSBza2IKKyAqIEBza2I6IFBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIKKyAqIEBwcm90b2NvbDogUHJvdG9jb2wgdHlwZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fY2RmX25idWZfc2V0X3Byb3RvY29sKHN0cnVjdCBza19idWZmICpza2IsIHVpbnQxNl90IHByb3RvY29sKQoreworCXNrYi0+cHJvdG9jb2wgPSBwcm90b2NvbDsKK30KKworI2RlZmluZSBfX2NkZl9uYnVmX3NldF90eF9odHQyX2ZybShza2IsIGNhbmRpKSBcCisJTkJVRl9TRVRfVFhfSFRUMl9GUk0oc2tiLCBjYW5kaSkKKyNkZWZpbmUgX19jZGZfbmJ1Zl9nZXRfdHhfaHR0Ml9mcm0oc2tiKQlcCisJTkJVRl9HRVRfVFhfSFRUMl9GUk0oc2tiKQorCisjaWYgZGVmaW5lZChGRUFUVVJFX1RTTykKK3VpbnQzMl90IF9fY2RmX25idWZfZ2V0X3Rzb19pbmZvKGNkZl9kZXZpY2VfdCBvc2Rldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwlzdHJ1Y3QgY2RmX3Rzb19pbmZvX3QgKnRzb19pbmZvKTsKKwordWludDMyX3QgX19jZGZfbmJ1Zl9nZXRfdHNvX251bV9zZWcoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBfX2NkZl9uYnVmX2lzX3RzbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2JfaXNfZ3NvKHNrYik7Cit9CisKK3N0cnVjdCBza19idWZmICpfX2NkZl9uYnVmX2luY191c2VycyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKyNlbmRpZiAvKiBUU08gKi8KKworLyoqCisgKiBfX2NkZl9uYnVmX3R4X2luZm9fZ2V0KCkgLSBNb2RpZnkgcGt0X3R5cGUsIHNldCBwa3Rfc3VidHlwZSwKKyAqCQkJICAgICAgYW5kIGdldCBod19jbGFzc2lmeSBieSBwZWVraW5nCisgKgkJCSAgICAgIGludG8gcGFja2V0CisgKiBAbmJ1ZjoJCU5ldHdvcmsgYnVmZmVyIChza2Igb24gTGludXgpCisgKiBAcGt0X3R5cGU6CQlQa3QgdHlwZSAoZnJvbSBlbnVtIGh0dF9wa3RfdHlwZSkKKyAqIEBwa3Rfc3VidHlwZToJQml0IDQgb2YgdGhpcyBmaWVsZCBpbiBIVFQgZGVzY3JpcHRvcgorICoJCQluZWVkcyB0byBiZSBzZXQgaW4gY2FzZSBvZiBDRSBjbGFzc2lmaWNhdGlvbiBzdXBwb3J0CisgKgkJCUlzIHNldCBieSB0aGlzIG1hY3JvLgorICogQGh3X2NsYXNzaWZ5OglUaGlzIGlzIGEgZmxhZyB3aGljaCBpcyBzZXQgdG8gaW5kaWNhdGUKKyAqCQkJQ0UgY2xhc3NpZmljYXRpb24gaXMgZW5hYmxlZC4KKyAqCQkJRG8gbm90IHNldCB0aGlzIGJpdCBmb3IgVkxBTiBwYWNrZXRzCisgKgkJCU9SIGZvciBtY2FzdCAvIGJjYXN0IGZyYW1lcy4KKyAqCisgKiBUaGlzIG1hY3JvIHBhcnNlcyB0aGUgcGF5bG9hZCB0byBmaWd1cmUgb3V0IHJlbGV2YW50IFR4IG1ldGEtZGF0YSBlLmcuCisgKiB3aGV0aGVyIHRvIGVuYWJsZSB0eF9jbGFzc2lmeSBiaXQgaW4gQ0UuCisgKgorICogT3ZlcnJpZGVzIHBrdF90eXBlIG9ubHkgaWYgcmVxdWlyZWQgZm9yIDgwMi4zIGZyYW1lcyAob3JpZ2luYWwgZXRoZXJuZXQpCisgKiBJZiBwcm90b2NvbCBpcyBsZXNzIHRoYW4gRVRIX1BfODAyXzNfTUlOICgweDYwMCksIHRoZW4KKyAqIGl0IGlzIHRoZSBsZW5ndGggYW5kIGEgODAyLjMgZnJhbWUgZWxzZSBpdCBpcyBFdGhlcm5ldCBUeXBlIElJCisgKiAoUkZDIDg5NCkuCisgKiBCaXQgNCBpbiBwa3Rfc3VidHlwZSBpcyB0aGUgdHhfY2xhc3NpZnkgYml0CisgKgorICogUmV0dXJuOgl2b2lkCisgKi8KKyNkZWZpbmUgX19jZGZfbmJ1Zl90eF9pbmZvX2dldChza2IsIHBrdF90eXBlLAkJCVwKKwkJCQlwa3Rfc3VidHlwZSwgaHdfY2xhc3NpZnkpCVwKK2RvIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgZXRoaGRyICplaCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwkJXAorCXVpbnQxNl90IGV0aGVyX3R5cGUgPSBudG9ocyhlaC0+aF9wcm90byk7CQlcCisJYm9vbCBpc19tY19iYzsJCQkJCQlcCisJCQkJCQkJCVwKKwlpc19tY19iYyA9IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKCh1aW50OF90ICopZWgpIHx8CVwKKwkJICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoKHVpbnQ4X3QgKillaCk7CVwKKwkJCQkJCQkJXAorCWlmIChsaWtlbHkoKGV0aGVyX3R5cGUgIT0gRVRIX1BfODAyMVEpICYmICFpc19tY19iYykpIHsJXAorCQlod19jbGFzc2lmeSA9IDE7CQkJCVwKKwkJcGt0X3N1YnR5cGUgPSAweDAxIDw8CQkJCVwKKwkJCUhUVF9UWF9DTEFTU0lGWV9CSVRfUzsJCQlcCisJfQkJCQkJCQlcCisJCQkJCQkJCVwKKwlpZiAodW5saWtlbHkoZXRoZXJfdHlwZSA8IEVUSF9QXzgwMl8zX01JTikpCQlcCisJCXBrdF90eXBlID0gaHR0X3BrdF90eXBlX2V0aGVybmV0OwkJXAorCQkJCQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmIC8qX0lfQ0RGX05FVF9CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZGYvc3JjL2lfY2RmX3NvZnRpcnFfdGltZXIuaCBiL2NvcmUvY2RmL3NyYy9pX2NkZl9zb2Z0aXJxX3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjYmQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RmL3NyYy9pX2NkZl9zb2Z0aXJxX3RpbWVyLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0lfQ0RGX1NPRlRJUlFfVElNRVJfSAorI2RlZmluZSBfSV9DREZfU09GVElSUV9USU1FUl9ICisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKworLyogdGltZXIgZGF0YSB0eXBlICovCit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0IF9fY2RmX3NvZnRpcnFfdGltZXJfdDsKKworLyogdWdseSAtIGJ1dCBldmVyeSBvdGhlciBPUyB0YWtlcywgc2FuZWx5LCBhIHZvaWQgKi8KKwordHlwZWRlZiB2b2lkICgqY2RmX2R1bW15X3RpbWVyX2Z1bmNfdCkodW5zaWduZWQgbG9uZyBhcmcpOworCisvKioKKyAqIF9fY2RmX3NvZnRpcnFfdGltZXJfaW5pdCgpIC0gaW5pdGlhbGl6ZSBhIHNvZnRpcnEgdGltZXIKKyAqIEBoZGw6IE9TIGhhbmRsZQorICogQHRpbWVyOiBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICogQGZ1bmM6IEZ1bmN0aW9uIHBvaW50ZXIKKyAqIEBhcmc6IEFyZ3VlbWVudAorICogQHR5cGU6IGRlZmVycmFibGUgb3Igbm9uIGRlZmVycmFibGUgdGltZXIgdHlwZQorICoKKyAqIFRpbWVyIHR5cGUgQ0RGX1RJTUVSX1RZUEVfU1cgbWVhbnMgaXRzIGEgZGVmZXJyYWJsZSBzdyB0aW1lciB3aGljaCB3aWxsCisgKiBub3QgY2F1c2UgQ1BVIHdha2UgdXBvbiBleHBpcnkKKyAqIFRpbWVyIHR5cGUgQ0RGX1RJTUVSX1RZUEVfV0FLRV9BUFBTIG1lYW5zIGl0cyBhIG5vbi1kZWZlcnJhYmxlIHRpbWVyIHdoaWNoCisgKiB3aWxsIGNhdXNlIENQVSB3YWtlIHVwIG9uIGV4cGlyeQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMKK19fY2RmX3NvZnRpcnFfdGltZXJfaW5pdChjZGZfaGFuZGxlX3QgaGRsLAorCQkJIHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwKKwkJCSBjZGZfc29mdGlycV90aW1lcl9mdW5jX3QgZnVuYywgdm9pZCAqYXJnLAorCQkJIENERl9USU1FUl9UWVBFIHR5cGUpCit7CisJaWYgKENERl9USU1FUl9UWVBFX1NXID09IHR5cGUpCisJCWluaXRfdGltZXJfZGVmZXJyYWJsZSh0aW1lcik7CisJZWxzZQorCQlpbml0X3RpbWVyKHRpbWVyKTsKKwl0aW1lci0+ZnVuY3Rpb24gPSAoY2RmX2R1bW15X3RpbWVyX2Z1bmNfdCkgZnVuYzsKKwl0aW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWFyZzsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogX19jZGZfc29mdGlycV90aW1lcl9zdGFydCgpIC0gc3RhcnQgYSBjZGYgc29mdGlycSB0aW1lcgorICogQHRpbWVyOiBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICogQGRlbGF5OiBEZWxheSBpbiBtaWxsaSBzZWNvbmRzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgQ0RGX1NUQVRVUworX19jZGZfc29mdGlycV90aW1lcl9zdGFydChzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsIHVpbnQzMl90IGRlbGF5KQoreworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpOworCWFkZF90aW1lcih0aW1lcik7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIF9fY2RmX3NvZnRpcnFfdGltZXJfbW9kKCkgLSBtb2RpZnkgYSB0aW1lcgorICogQHRpbWVyOiBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICogQGRlbGF5OiBEZWxheSBpbiBtaWxsaSBzZWNvbmRzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgQ0RGX1NUQVRVUworX19jZGZfc29mdGlycV90aW1lcl9tb2Qoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCB1aW50MzJfdCBkZWxheSkKK3sKKwltb2RfdGltZXIodGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIF9fY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKCkgLSBjYW5jZWwgYSB0aW1lcgorICogQHRpbWVyOiBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICoKKyAqIFJldHVybjogdHJ1ZSBpZiB0aW1lciB3YXMgY2FuY2VsbGVkIGFuZCBkZWFjdGl2ZWQsCisgKglmYWxzZSBpZiB0aW1lciB3YXMgY2FuY2VsbGVkIGJ1dCBhbHJlYWR5IGdvdCBmaXJlZC4KKyAqLworc3RhdGljIGlubGluZSBib29sIF9fY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlpZiAobGlrZWx5KGRlbF90aW1lcih0aW1lcikpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKioKKyAqIF9fY2RmX3NvZnRpcnFfdGltZXJfZnJlZSgpIC0gZnJlZSBhIGNkZiB0aW1lcgorICogQHRpbWVyOiBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICoKKyAqIFJldHVybjogdHJ1ZSBpZiB0aW1lciB3YXMgY2FuY2VsbGVkIGFuZCBkZWFjdGl2ZWQsCisgKglmYWxzZSBpZiB0aW1lciB3YXMgY2FuY2VsbGVkIGJ1dCBhbHJlYWR5IGdvdCBmaXJlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fY2RmX3NvZnRpcnFfdGltZXJfZnJlZShzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJZGVsX3RpbWVyX3N5bmModGltZXIpOworfQorCisvKioKKyAqIF9fY2RmX3Nvc3RpcnFfdGltZXJfc3luY19jYW5jZWwoKSAtIFN5bmNocm9ub3VzbHkgY2FuZWwgYSB0aW1lcgorICogQHRpbWVyOiBQb2ludGVyIHRvIHRpbWVyIG9iamVjdAorICoKKyAqIFN5bmNocm9uaXphdGlvbiBSdWxlczoKKyAqIDEuIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0aW1lciBmdW5jdGlvbiB3aWxsIG5vdCB1c2UKKyAqICAgIGNkZl9zb2Z0aXJxX3NldF90aW1lciB0byBhZGQgaXRlc2VsZiBhZ2Fpbi4KKyAqIDIuIGNhbGxlciBtdXN0IG5vdCBob2xkIGFueSBsb2NrIHRoYXQgdGltZXIgZnVuY3Rpb24KKyAqICAgIGlzIGxpa2VseSB0byBob2xkIGFzIHdlbGwuCisgKiAzLiBJdCBjYW4ndCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqCisgKiBSZXR1cm46IHRydWUgaWYgdGltZXIgd2FzIGNhbmNlbGxlZCBhbmQgZGVhY3RpdmVkLAorICoJZmFsc2UgaWYgdGltZXIgd2FzIGNhbmNlbGxlZCBidXQgYWxyZWFkeSBnb3QgZmlyZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2NkZl9zb3N0aXJxX3RpbWVyX3N5bmNfY2FuY2VsKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlyZXR1cm4gZGVsX3RpbWVyX3N5bmModGltZXIpOworfQorCisjZW5kaWYgLypfQURGX09TX1RJTUVSX1BWVF9IKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RmL3NyYy9pX2NkZl90aW1lLmggYi9jb3JlL2NkZi9zcmMvaV9jZGZfdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Y2Y1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvaV9jZGZfdGltZS5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogaV9jZGZfdGltZS5oCisgKgorICogTGludXggc3BlY2lmaWMgQ0RGIHRpbWluZyBBUElzIGltcGxlbWVudGF0aW9uCisgKi8KKworI2lmbmRlZiBfSV9DREZfVElNRV9ICisjZGVmaW5lIF9JX0NERl9USU1FX0gKKworI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX3RpbWVyLmg+CisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBfX2NkZl90aW1lX3Q7CisKKy8qKgorICogX19jZGZfc3lzdGVtX3RpY2tzKCkgLSBnZXQgc3lzdGVtIHRpY2tzCisgKgorICogUmV0dXJuOiBzeXN0ZW0gdGljayBpbiBqaWZmaWVzCisgKi8KK3N0YXRpYyBpbmxpbmUgX19jZGZfdGltZV90IF9fY2RmX3N5c3RlbV90aWNrcyh2b2lkKQoreworCXJldHVybiBqaWZmaWVzOworfQorCisvKioKKyAqIF9fY2RmX3N5c3RlbV90aWNrc190b19tc2VjcygpIC0gY29udmVydCBzeXN0ZW0gdGlja3MgaW50byBtaWxsaSBzZWNvbmRzCisgKiBAdGlja3M6IFN5c3RlbSB0aWNrcworICoKKyAqIFJldHVybjogc3lzdGVtIHRpY2sgY29udmVydGVkIGludG8gbWlsbGkgc2Vjb25kcworICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fY2RmX3N5c3RlbV90aWNrc190b19tc2Vjcyh1bnNpZ25lZCBsb25nIHRpY2tzKQoreworCXJldHVybiBqaWZmaWVzX3RvX21zZWNzKHRpY2tzKTsKK30KKworLyoqCisgKiBfX2NkZl9zeXN0ZW1fbXNlY3NfdG9fdGlja3MoKSAtIGNvbnZlcnQgbWlsbGkgc2Vjb25kcyBpbnRvIHN5c3RlbSB0aWNrcworICogQG1zZWNzOiBNaWxsaSBzZWNvbmRzCisgKgorICogUmV0dXJuOiBtaWxsaSBzZWNvbmRzIGNvbnZlcnRlZCBpbnRvIHN5c3RlbSB0aWNrcworICovCitzdGF0aWMgaW5saW5lIF9fY2RmX3RpbWVfdCBfX2NkZl9zeXN0ZW1fbXNlY3NfdG9fdGlja3ModWludDMyX3QgbXNlY3MpCit7CisJcmV0dXJuIG1zZWNzX3RvX2ppZmZpZXMobXNlY3MpOworfQorCisvKioKKyAqIF9fY2RmX2dldF9zeXN0ZW1fdXB0aW1lKCkgLSBnZXQgc3lzdGVtIHVwdGltZQorICoKKyAqIFJldHVybjogc3lzdGVtIHVwdGltZSBpbiBqaWZmaWVzCisgKi8KK3N0YXRpYyBpbmxpbmUgX19jZGZfdGltZV90IF9fY2RmX2dldF9zeXN0ZW1fdXB0aW1lKHZvaWQpCit7CisJcmV0dXJuIGppZmZpZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19jZGZfdGltZV90IF9fY2RmX2dldF9zeXN0ZW1fdGltZXN0YW1wKHZvaWQpCit7CisJcmV0dXJuIChqaWZmaWVzIC8gSFopICogMTAwMCArIChqaWZmaWVzICUgSFopICogKDEwMDAgLyBIWik7Cit9CisKKy8qKgorICogX19jZGZfdWRlbGF5KCkgLSBkZWxheSBleGVjdXRpb24gZm9yIGdpdmVuIG1pY3Jvc2Vjb25kcworICogQHVzZWNzOiBNaWNybyBzZWNvbmRzIHRvIGRlbGF5CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NkZl91ZGVsYXkodWludDMyX3QgdXNlY3MpCit7CisjaWZkZWYgQ09ORklHX0FSTQorCS8qCisJICogVGhpcyBpcyBpbiBzdXBwb3J0IG9mIFhTY2FsZSBidWlsZC4gIFRoZXkgaGF2ZSBhIGxpbWl0IG9uIHRoZSB1ZGVsYXkKKwkgKiB2YWx1ZSwgc28gd2UgaGF2ZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgYXBwcm9hY2ggdGhlIGxpbWl0CisJICovCisKKwl1aW50MzJfdCBtdGlja3M7CisJdWludDMyX3QgbGVmdG92ZXI7CisJaW50IGk7CisKKwkvKiBzbGljZSBpbnRvIDEwMjQgdXNlYyBjaHVua3MgKHNpbXBsaWZpZXMgY2FsY3VsYXRpb24pICovCisKKwltdGlja3MgPSB1c2VjcyA+PiAxMDsKKwlsZWZ0b3ZlciA9IHVzZWNzIC0gKG10aWNrcyA8PCAxMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXRpY2tzOyBpKyspCisJCXVkZWxheSgxMDI0KTsKKworCXVkZWxheShsZWZ0b3Zlcik7CisKKyNlbHNlCisJLyogTm9ybWFsIERlbGF5IGZ1bmN0aW9ucy4gVGltZSBzcGVjaWZpZWQgaW4gbWljcm9zZWNvbmRzICovCisJdWRlbGF5KHVzZWNzKTsKKworI2VuZGlmCit9CisKKy8qKgorICogX19jZGZfbWRlbGF5KCkgLSBkZWxheSBleGVjdXRpb24gZm9yIGdpdmVuIG1pbGxpIHNlY29uZHMKKyAqIEB1c2VjczogTWlsbGkgc2Vjb25kcyB0byBkZWxheQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19jZGZfbWRlbGF5KHVpbnQzMl90IG1zZWNzKQoreworCW1kZWxheShtc2Vjcyk7Cit9CisKKy8qKgorICogX19jZGZfc3lzdGVtX3RpbWVfYWZ0ZXIoKSAtIENoZWNrIGlmIGEgaXMgbGF0ZXIgdGhhbiBiCisgKiBAYTogVGltZSBzdGFtcCB2YWx1ZSBhCisgKiBAYjogVGltZSBzdGFtcCB2YWx1ZSBiCisgKgorICogUmV0dXJuOgorICoJdHJ1ZSBpZiBhIDwgYiBlbHNlIGZhbHNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2NkZl9zeXN0ZW1fdGltZV9hZnRlcihfX2NkZl90aW1lX3QgYSwgX19jZGZfdGltZV90IGIpCit7CisJcmV0dXJuIChsb25nKShiKSAtIChsb25nKShhKSA8IDA7Cit9CisKKy8qKgorICogX19jZGZfc3lzdGVtX3RpbWVfYmVmb3JlKCkgLSBDaGVjayBpZiBhIGlzIGJlZm9yZSBiCisgKiBAYTogVGltZSBzdGFtcCB2YWx1ZSBhCisgKiBAYjogVGltZSBzdGFtcCB2YWx1ZSBiCisgKgorICogUmV0dXJuOgorICoJdHJ1ZSBpZiBhIGlzIGJlZm9yZSBiIGVsc2UgZmFsc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIF9fY2RmX3N5c3RlbV90aW1lX2JlZm9yZShfX2NkZl90aW1lX3QgYSwgX19jZGZfdGltZV90IGIpCit7CisJcmV0dXJuIF9fY2RmX3N5c3RlbV90aW1lX2FmdGVyKGIsIGEpOworfQorCisvKioKKyAqIF9fY2RmX3N5c3RlbV90aW1lX2JlZm9yZSgpIC0gQ2hlY2sgaWYgYSBhdGxlYXN0IGFzIHJlY2VudCBhcyBiLCBpZiBub3QKKyAqCQkJCWxhdGVyCisgKiBAYTogVGltZSBzdGFtcCB2YWx1ZSBhCisgKiBAYjogVGltZSBzdGFtcCB2YWx1ZSBiCisgKgorICogUmV0dXJuOgorICoJdHJ1ZSBpZiBhID49IGIgZWxzZSBmYWxzZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgX19jZGZfc3lzdGVtX3RpbWVfYWZ0ZXJfZXEoX19jZGZfdGltZV90IGEsIF9fY2RmX3RpbWVfdCBiKQoreworCXJldHVybiAobG9uZykoYSkgLSAobG9uZykoYikgPj0gMDsKK30KKworLyoqCisgKiBfX2NkZl9nZXRfbW9ub3RvbmljX2Jvb3R0aW1lKCkgLSBnZXQgbW9ub3RvbmljIGtlcm5lbCBib290IHRpbWUKKyAqIFRoaXMgQVBJIGlzIHNpbWlsYXIgdG8gY2RmX2dldF9zeXN0ZW1fYm9vdHRpbWUgYnV0IGl0IGluY2x1ZGVzCisgKiB0aW1lIHNwZW50IGluIHN1c3BlbmQuCisgKgorICogUmV0dXJuOiBUaW1lIGluIG1pY3Jvc2Vjb25kcworICovCisjaWZkZWYgQ09ORklHX0NOU1MKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgX19jZGZfZ2V0X21vbm90b25pY19ib290dGltZSh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCWNuc3NfZ2V0X21vbm90b25pY19ib290dGltZSgmdHMpOworCisJcmV0dXJuICgodWludDY0X3QpIHRzLnR2X3NlYyAqIDEwMDAwMDApICsgKHRzLnR2X25zZWMgLyAxMDAwKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IF9fY2RmX2dldF9tb25vdG9uaWNfYm9vdHRpbWUodm9pZCkKK3sKKwlyZXR1cm4gX19jZGZfc3lzdGVtX3RpY2tzX3RvX21zZWNzKF9fY2RmX3N5c3RlbV90aWNrcygpKSAqIDEwMDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0NOU1MgKi8KKworI2lmZGVmIFFDQV9XSUZJXzNfMF9BRFJBU1RFQQorLyoqCisgKiBfX2NkZl9nZXRfcXRpbWVyX3RpY2tzKCkgLSBnZXQgUVRJTUVSIHRpY2tzCisgKgorICogUmV0dXJucyBRVElNRVIoMTkuMiBNSHopIGNsb2NrIHRpY2tzLiBUbyBjb252ZXJ0IGl0IGludG8gc2Vjb25kcworICogZGl2aWRlIGl0IGJ5IDE5MjAwLgorICoKKyAqIFJldHVybjogUVRJTUVSKDE5LjIgTUh6KSBjbG9jayB0aWNrcworICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IF9fY2RmX2dldF9xdGltZXJfdGlja3Modm9pZCkKK3sKKwlyZXR1cm4gYXJjaF9jb3VudGVyX2dldF9jbnRwY3QoKTsKK30KKyNlbmRpZiAvKiBRQ0FfV0lGSV8zXzBfQURSQVNURUEgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9zcmMvaV9jZGZfdHJhY2UuaCBiL2NvcmUvY2RmL3NyYy9pX2NkZl90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjM2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvaV9jZGZfdHJhY2UuaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKF9fSV9DREZfVFJBQ0VfSCkKKyNkZWZpbmUgX19JX0NERl9UUkFDRV9ICisKKyNpZiAhZGVmaW5lZChfX3ByaW50ZikKKyNkZWZpbmUgX19wcmludGYoYSwgYikKKyNlbmRpZgorCisvKioKKyAqIERPQzogaV9jZGZfdHJhY2UuaAorICoKKyAqIExpbnV4LXNwZWNpZmljIGRlZmluaXRpb25zIGZvciBDREYgdHJhY2UKKyAqCisgKi8KKworLyogSW5jbHVkZSBGaWxlcyAqLworCisvKioKKyAqIGNkZl90cmFjZV9tc2coKS0gbG9nZ2luZyBBUEkKKyAqIEBtb2R1bGU6IE1vZHVsZSBpZGVudGlmaWVyLiBBIG1lbWJlciBvZiB0aGUgQ0RGX01PRFVMRV9JRCBlbnVtZXJhdGlvbiB0aGF0CisgKgkgICAgaWRlbnRpZmllcyB0aGUgbW9kdWxlIGlzc3VpbmcgdGhlIHRyYWNlIG1lc3NhZ2UuCisgKiBAbGV2ZWw6IFRyYWNlIGxldmVsLiBBIG1lbWJlciBvZiB0aGUgQ0RGX1RSQUNFX0xFVkVMIGVudW1lcmF0aW9uIGluZGljYXRpbmcKKyAqCSAgIHRoZSBzZXZlcml0eSBvZiB0aGUgY29uZGl0aW9uIGNhdXNpbmcgdGhlIHRyYWNlIG1lc3NhZ2UgdG8gYmUgaXNzdWVkLgorICoJICAgTW9yZSBzZXZlcmUgY29uZGl0aW9ucyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgbG9nZ2VkLgorICogQHN0ckZvcm1hdDogRm9ybWF0IHN0cmluZy4gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLiBUaGlzIGZvcm1hdCBzdHJpbmcKKyAqCSAgICAgICBjb250YWlucyBwcmludGYtbGlrZSByZXBsYWNlbWVudCBwYXJhbWV0ZXJzLCB3aGljaCBmb2xsb3cgdGhpcworICoJICAgICAgIHBhcmFtZXRlciBpbiB0aGUgdmFyaWFibGUgYXJndW1lbnQgbGlzdC4KKyAqCisgKiBVc2VycyB3aXNoaW5nIHRvIGFkZCB0cmFjaW5nIGluZm9ybWF0aW9uIHRvIHRoZWlyIGNvZGUgc2hvdWxkIHVzZQorICogQ0RGX1RSQUNFLiAgQ0RGX1RSQUNFKCkgd2lsbCBjb21waWxlIGludG8gYSBjYWxsIHRvIGNkZl90cmFjZV9tc2coKSB3aGVuCisgKiB0cmFjaW5nIGlzIGVuYWJsZWQuCisgKgorICogUmV0dXJuOiBub3RoaW5nCisgKgorICovCit2b2lkIF9fcHJpbnRmKDMsIDQpIGNkZl90cmFjZV9tc2coQ0RGX01PRFVMRV9JRCBtb2R1bGUsIENERl9UUkFDRV9MRVZFTCBsZXZlbCwKKwkJCQkgIGNoYXIgKnN0ckZvcm1hdCwgLi4uKTsKKwordm9pZCBjZGZfdHJhY2VfaGV4X2R1bXAoQ0RGX01PRFVMRV9JRCBtb2R1bGUsIENERl9UUkFDRV9MRVZFTCBsZXZlbCwKKwkJCXZvaWQgKmRhdGEsIGludCBidWZfbGVuKTsKKwordm9pZCBjZGZfdHJhY2VfZGlzcGxheSh2b2lkKTsKKwordm9pZCBjZGZfdHJhY2Vfc2V0X3ZhbHVlKENERl9NT0RVTEVfSUQgbW9kdWxlLCBDREZfVFJBQ0VfTEVWRUwgbGV2ZWwsCisJCQkgdWludDhfdCBvbik7CisKK3ZvaWQgY2RmX3RyYWNlX3NldF9tb2R1bGVfdHJhY2VfbGV2ZWwoQ0RGX01PRFVMRV9JRCBtb2R1bGUsIHVpbnQzMl90IGxldmVsKTsKKworLyogQ0RGX1RSQUNFIGlzIHRoZSBtYWNybyBpbnZva2VkIHRvIGFkZCB0cmFjZSBtZXNzYWdlcyB0byBjb2RlLiAgU2VlIHRoZQorICogZG9jdW1lbmF0aW9uIGZvciBjZGZfdHJhY2VfbXNnKCkgZm9yIHRoZSBwYXJhbWV0ZXJzIGV0Yy4gZm9yIHRoaXMgZnVuY3Rpb24uCisgKgorICogTk9URTogIENvZGUgQ0RGX1RSQUNFKCkgbWFjcm9zIGludG8gdGhlIHNvdXJjZSBjb2RlLiAgRG8gbm90IGNvZGUgZGlyZWN0bHkKKyAqIHRvIHRoZSBjZGZfdHJhY2VfbXNnKCkgZnVuY3Rpb24uCisgKgorICogTk9URSAyOiAgY2RmIHRyYWNpbmcgaXMgdG90YWxseSB0dXJuZWQgb2ZmIGlmIFdMQU5fREVCVUcgaXMgKm5vdCogZGVmaW5lZC4KKyAqIFRoaXMgYWxsb3dzIHVzIHRvIGJ1aWxkICdwZXJmb3JtYW5jZScgYnVpbGRzIHdoZXJlIHdlIGNhbiBtZWFzdXJlIHBlcmZvcm1hbmNlCisgKiB3aXRob3V0IGJlaW5nIGJvZ2dlZCBkb3duIGJ5IGFsbCB0aGUgdHJhY2luZyBpbiB0aGUgY29kZQorICovCisKKyNpZiBkZWZpbmVkKFdMQU5fREVCVUcpCisjZGVmaW5lIENERl9UUkFDRSBjZGZfdHJhY2VfbXNnCisjZGVmaW5lIENERl9UUkFDRV9IRVhfRFVNUCBjZGZfdHJhY2VfaGV4X2R1bXAKKyNlbHNlCisjZGVmaW5lIENERl9UUkFDRShhcmcgLi4uKQorI2RlZmluZSBDREZfVFJBQ0VfSEVYX0RVTVAoYXJnIC4uLikKKyNlbmRpZgorCit2b2lkIF9fcHJpbnRmKDMsIDQpIGNkZl9zbnByaW50ZihjaGFyICpzdHJCdWZmZXIsIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSBjaGFyICpzdHJGb3JtYXQsIC4uLik7CisjZGVmaW5lIENERl9TTlBSSU5URiBjZGZfc25wcmludGYKKworI2lmZGVmIENERl9FTkFCTEVfVFJBQ0lORworCisjZGVmaW5lIENERl9BU1NFUlQoX2NvbmRpdGlvbikgXAorCWRvIHsgXAorCQlpZiAoIShfY29uZGl0aW9uKSkgeyBcCisJCQlwcl9lcnIoIkNERiBBU1NFUlQgaW4gJXMgTGluZSAlZFxuIiwgXAorCQkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXyk7IFwKKwkJCVdBUk5fT04oMSk7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworI2Vsc2UKKworLyogVGhpcyBjb2RlIHdpbGwgYmUgdXNlZCBmb3IgY29tcGlsYXRpb24gaWYgdHJhY2luZyBpcyB0byBiZSBjb21waWxlZCBvdXQgKi8KKy8qIG9mIHRoZSBjb2RlIHNvIHRoZXNlIGZ1bmN0aW9ucy9tYWNyb3MgYXJlICdkbyBub3RoaW5nJyAqLworQ0RGX0lOTElORV9GTiB2b2lkIGNkZl90cmFjZV9tc2coQ0RGX01PRFVMRV9JRCBtb2R1bGUsIC4uLikKK3sKK30KKworI2RlZmluZSBDREZfQVNTRVJUKF9jb25kaXRpb24pCisKKyNlbmRpZgorCisjaWZkZWYgUEFOSUNfT05fQlVHCisKKyNkZWZpbmUgQ0RGX0JVRyhfY29uZGl0aW9uKSBcCisJZG8geyBcCisJCWlmICghKF9jb25kaXRpb24pKSB7IFwKKwkJCXByX2VycigiQ0RGIEJVRyBpbiAlcyBMaW5lICVkXG4iLCBcCisJCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fKTsgXAorCQkJQlVHX09OKDEpOyBcCisJCX0gXAorCX0gd2hpbGUgKDApCisKKyNlbHNlCisKKyNkZWZpbmUgQ0RGX0JVRyhfY29uZGl0aW9uKSBcCisJZG8geyBcCisJCWlmICghKF9jb25kaXRpb24pKSB7IFwKKwkJCXByX2VycigiQ0RGIEJVRyBpbiAlcyBMaW5lICVkXG4iLCBcCisJCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fKTsgXAorCQkJV0FSTl9PTigxKTsgXAorCQl9IFwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2NkZi9zcmMvaV9jZGZfdHlwZXMuaCBiL2NvcmUvY2RmL3NyYy9pX2NkZl90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYmJhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvaV9jZGZfdHlwZXMuaApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBET0M6IGlfY2RmX3R5cGVzLmgKKyAqCisgKiBDb25uZWN0aXZpdHkgZHJpdmVyIGZyYW1ld29yayAoQ0RGKSB0eXBlcworICovCisKKyNpZiAhZGVmaW5lZChfX0lfQ0RGX1RZUEVTX0gpCisjZGVmaW5lIF9fSV9DREZfVFlQRVNfSAorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIF9faW9tZW0KKyNlbmRpZgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8Z2VuZXJhdGVkL2F1dG9jb25mLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNlbHNlCisKKy8qCisgKiBIYWNrIC0gY29leGlzdCB3aXRoIHByaW9yIGRlZnMgb2YgZG1hX2FkZHJfdC4KKyAqIEV2ZW50dWFsbHkgYWxsIG90aGVyIGRlZnMgb2YgZG1hX2FkZHJfdCBzaG91bGQgYmUgcmVtb3ZlZC4KKyAqIEF0IHRoYXQgcG9pbnQsIHRoZSAiYWxyZWFkeV9kZWZpbmVkIiB3cmFwcGVyIGNhbiBiZSByZW1vdmVkLgorICovCisjaWZuZGVmIF9fZG1hX2FkZHJfdF9hbHJlYWR5X2RlZmluZWRfXworI2RlZmluZSBfX2RtYV9hZGRyX3RfYWxyZWFkeV9kZWZpbmVkX18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkbWFfYWRkcl90OworI2VuZGlmCisKKyNkZWZpbmUgU0lPQ0dJV0FQICAgICAgIDAKKyNkZWZpbmUgSVdFVkNVU1RPTSAgICAgIDAKKyNkZWZpbmUgSVdFVlJFR0lTVEVSRUQgIDAKKyNkZWZpbmUgSVdFVkVYUElSRUQgICAgIDAKKyNkZWZpbmUgU0lPQ0dJV1NDQU4gICAgIDAKKyNkZWZpbmUgRE1BX1RPX0RFVklDRSAgIDAKKyNkZWZpbmUgRE1BX0ZST01fREVWSUNFIDAKKyNkZWZpbmUgX19pb21lbQorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworLyoqCisgKiBtYXggc2cgdGhhdCB3ZSBzdXBwb3J0CisgKi8KKyNkZWZpbmUgX19DREZfT1NfTUFYX1NDQVRURVIgICAgICAgIDEKKworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorI2RlZmluZSBDREZfTElUVExFX0VORElBTl9NQUNISU5FCisjZWxpZiBkZWZpbmVkIChfX0JJR19FTkRJQU5fQklURklFTEQpCisjZGVmaW5lIENERl9CSUdfRU5ESUFOX01BQ0hJTkUKKyNlbHNlCisjZXJyb3IgICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisKKyNkZWZpbmUgX19jZGZfcGFja2VkICAgICAgICAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCit0eXBlZGVmIGludCAoKl9fY2RmX29zX2ludHIpKHZvaWQgKik7CisvKioKKyAqIFByaXZhdGUgZGVmaW5pdGlvbnMgb2YgZ2VuZXJhbCBkYXRhIHR5cGVzCisgKi8KK3R5cGVkZWYgZG1hX2FkZHJfdCBfX2NkZl9kbWFfYWRkcl90OwordHlwZWRlZiBkbWFfYWRkcl90IF9fY2RmX2RtYV9jb250ZXh0X3Q7CisKKyNkZWZpbmUgY2RmX2RtYV9tZW1fY29udGV4dChjb250ZXh0KSBkbWFfYWRkcl90IGNvbnRleHQKKyNkZWZpbmUgY2RmX2dldF9kbWFfbWVtX2NvbnRleHQodmFyLCBmaWVsZCkgICAoKGNkZl9kbWFfY29udGV4dF90KSh2YXItPmZpZWxkKSkKKworLyoqCisgKiB0eXBlZGVmIHN0cnVjdCBfX2NkZl9yZXNvdXJjZV90IC0gY2RmIHJlc291cmNlIHR5cGUKKyAqIEBwYWRkcjogUGh5c2ljYWwgYWRkcmVzcworICogQHBhZGRyOiBWaXJ0dWFsIGFkZHJlc3MKKyAqIEBsZW46IExlbmd0aAorICovCit0eXBlZGVmIHN0cnVjdCBfX2NkZl9vc19yZXNvdXJjZSB7CisJdW5zaWduZWQgbG9uZyBwYWRkcjsKKwl2b2lkIF9faW9tZW0gKnZhZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworfSBfX2NkZl9yZXNvdXJjZV90OworCisvKioKKyAqIHN0cnVjdCBfX2NkZl9kZXZpY2UgLSBnZW5lcmljIGNkZiBkZXZpY2UgdHlwZQorICogQGRydjogUG9pbnRlciB0byBkcml2ZXIKKyAqIEBkcnZfaGRsOiBQb2ludGVyIHRvIGRyaXZlciBoYW5kbGUKKyAqIEBkcnZfbmFtZTogUG9pbnRlciB0byBkcml2ZXIgbmFtZQorICogQGlycTogSVJRCisgKiBAZGV2OiBQb2ludGVyIHRvIGRldmljZQorICogQHJlczogQ0RGIHJlc291cmNlCisgKiBAZnVuYzogSW50ZXJydXB0IGhhbmRsZXIKKyAqLworc3RydWN0IF9fY2RmX2RldmljZSB7CisJdm9pZCAqZHJ2OworCXZvaWQgKmRydl9oZGw7CisJY2hhciAqZHJ2X25hbWU7CisJaW50IGlycTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJX19jZGZfcmVzb3VyY2VfdCByZXM7CisJX19jZGZfb3NfaW50ciBmdW5jOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19jZGZfZGV2aWNlICpfX2NkZl9kZXZpY2VfdDsKKwordHlwZWRlZiBzaXplX3QgX19jZGZfc2l6ZV90OwordHlwZWRlZiB1aW50OF90IF9faW9tZW0gKl9fY2RmX2lvbWVtX3Q7CisKKy8qKgorICogdHlwZWRlZiBzdHJ1Y3QgX19jZGZfc2VnbWVudF90IC0gY2RmIHNlZ21lbnQKKyAqIEBkYWRkcjogRE1BIGFkZHJlc3MKKyAqIEBsZW46IExlbmd0aAorICovCit0eXBlZGVmIHN0cnVjdCBfX2NkZl9zZWdtZW50IHsKKwlkbWFfYWRkcl90IGRhZGRyOworCXVpbnQzMl90IGxlbjsKK30gX19jZGZfc2VnbWVudF90OworCisvKioKKyAqIHN0cnVjdCBfX2NkZl9kbWFfbWFwIC0gZG1hIG1hcAorICogQG1hcHBlZDogZG1hIGlzIG1hcHBlZCBvciBub3QKKyAqIEBuc2VnczogTnVtYmVyIG9mIHNlZ21lbnRzCisgKiBAY29oZXJlbnQ6IENvaGVyZW50CisgKiBAc2VnOiBTZWdtZW50IGFycmF5CisgKi8KK3N0cnVjdCBfX2NkZl9kbWFfbWFwIHsKKwl1aW50MzJfdCBtYXBwZWQ7CisJdWludDMyX3QgbnNlZ3M7CisJdWludDMyX3QgY29oZXJlbnQ7CisJX19jZGZfc2VnbWVudF90IHNlZ1tfX0NERl9PU19NQVhfU0NBVFRFUl07Cit9OwordHlwZWRlZiBzdHJ1Y3QgX19jZGZfZG1hX21hcCAqX19jZGZfZG1hX21hcF90OwordHlwZWRlZiB1aW50MzJfdCBhdGhfZG1hX2FkZHJfdDsKKworI2RlZmluZSBfX2NkZl9wcmludCAgICAgICAgICAgICAgIHByaW50aworI2RlZmluZSBfX2NkZl92cHJpbnQgICAgICAgICAgICAgIHZwcmludGsKKyNkZWZpbmUgX19jZGZfc25wcmludCAgICAgICAgICAgICBzbnByaW50ZgorI2RlZmluZSBfX2NkZl92c25wcmludCAgICAgICAgICAgIHZzbnByaW50ZgorCisjZGVmaW5lIF9fQ0RGX0RNQV9CSURJUkVDVElPTkFMICBETUFfQklESVJFQ1RJT05BTAorI2RlZmluZSBfX0NERl9ETUFfVE9fREVWSUNFICAgICAgRE1BX1RPX0RFVklDRQorI2RlZmluZSBfX0NERl9ETUFfRlJPTV9ERVZJQ0UgICAgRE1BX0ZST01fREVWSUNFCisjZGVmaW5lIF9fY2RmX2lubGluZSAgICAgICAgICAgICBpbmxpbmUKKworLyoKKyAqIDEuIEdOVSBDL0MrKyBDb21waWxlcgorICoKKyAqIEhvdyB0byBkZXRlY3QgZ2NjIDogX19HTlVDX18KKyAqIEhvdyB0byBkZXRlY3QgZ2NjIHZlcnNpb24gOgorICogICBtYWpvciB2ZXJzaW9uIDogX19HTlVDX18gKDIgPSAyLngsIDMgPSAzLngsIDQgPSA0LngpCisgKiAgIG1pbm9yIHZlcnNpb24gOiBfX0dOVUNfTUlOT1JfXworICoKKyAqIDIuIE1pY3Jvc29mdCBDL0MrKyBDb21waWxlcgorICoKKyAqIEhvdyB0byBkZXRlY3QgbXNjIDogX01TQ19WRVIKKyAqIEhvdyB0byBkZXRlY3QgbXNjIHZlcnNpb24gOgorICogICBfTVNDX1ZFUiAoMTIwMCA9IE1TVkMgNi4wLCAxMzAwID0gTVNWQyA3LjAsIC4uLikKKyAqCisgKi8KKworLyogTUFDUk9zIHRvIGhlbHAgd2l0aCBjb21waWxlciBhbmQgT1Mgc3BlY2lmaWNzLiBNYXkgbmVlZCB0byBnZXQgYSBsaXR0bGUKKyAqIG1vcmUgc29waGlzdGljYXRlZCB0aGFuIHRoaXMgYW5kIGRlZmluZSB0aGVzZSB0byBzcGVjaWZpYyAnVkVSU0lPTlMnIG9mCisgKiB0aGUgY29tcGlsZXIgYW5kIE9TLiAgVW50aWwgd2UgaGF2ZSBhIG5lZWQgZm9yIHRoYXQsIGxldHMgZ28gd2l0aCB0aGlzCisgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorCisjZGVmaW5lIENERl9DT01QSUxFUl9NU0MKKy8qIGFzc3VtaW5nIHRoYXQgaWYgd2UgYnVpbGQgd2l0aCBNU0MsIE9TIGlzIFdpbk1vYmlsZSAqLworI2RlZmluZSBDREZfT1NfV0lOTU9CSUxFCisKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisKKyNkZWZpbmUgQ0RGX0NPTVBJTEVSX0dOVUMKKyNkZWZpbmUgQ0RGX09TX0xJTlVYIC8qIGFzc3VtaW5nIGlmIGJ1aWxkaW5nIHdpdGggR05VQywgT1MgaXMgTGludXggKi8KKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENERl9DT01QSUxFUl9NU0MpCisKKyNkZWZpbmUgQ0RGX0lOTElORV9GTiAgX19pbmxpbmUKKworLyogRG9lcyBub3RoaW5nIG9uIFdpbmRvd3MuICBwYWNraW5nIGluZGl2aWR1YWwgc3RydWN0cyBpcyBub3QKKyAqIHN1cHBvcnRlZCBvbiB0aGUgV2luZG93cyBjb21waWxlcgorICovCisjZGVmaW5lIENERl9QQUNLX1NUUlVDVF8xCisjZGVmaW5lIENERl9QQUNLX1NUUlVDVF8yCisjZGVmaW5lIENERl9QQUNLX1NUUlVDVF80CisjZGVmaW5lIENERl9QQUNLX1NUUlVDVF84CisjZGVmaW5lIENERl9QQUNLX1NUUlVDVF8xNgorCisjZWxpZiBkZWZpbmVkKENERl9DT01QSUxFUl9HTlVDKQorCisjZGVmaW5lIENERl9JTkxJTkVfRk4gIHN0YXRpYyBpbmxpbmUKKworI2Vsc2UKKyNlcnJvciAiQ29tcGlsaW5nIHdpdGggYW4gdW5rbm93biBjb21waWxlciEhIgorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0lfQ0RGX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RmL3NyYy9pX2NkZl91dGlsLmggYi9jb3JlL2NkZi9zcmMvaV9jZGZfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMmYxMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NkZi9zcmMvaV9jZGZfdXRpbC5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9JX0NERl9VVElMX0gKKyNkZWZpbmUgX0lfQ0RGX1VUSUxfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGNkZl9zdGF0dXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisvKgorICogR2VuZXJpYyBjb21waWxlci1kZXBlbmRlbnQgbWFjcm9zIGlmIGRlZmluZWQgYnkgdGhlIE9TCisgKi8KKworI2RlZmluZSBfX2NkZl91bmxpa2VseShfZXhwcikgICB1bmxpa2VseShfZXhwcikKKyNkZWZpbmUgX19jZGZfbGlrZWx5KF9leHByKSAgICAgbGlrZWx5KF9leHByKQorCisvKioKKyAqIGNkZl9zdGF0dXNfdG9fb3NfcmV0dXJuKCk6IHRyYW5zbGF0ZXMgY2RmX3N0YXR1cyB0eXBlcyB0byBsaW51eCByZXR1cm4gdHlwZXMKKyAqIEBzdGF0dXM6IHN0YXR1cyB0byB0cmFuc2xhdGUKKyAqCisgKiBUcmFuc2xhdGVzIGVycm9yIHR5cGVzIHRoYXQgbGludXggbWF5IHdhbnQgdG8gaGFuZGxlIHNwZWNpYWxseS4KKyAqCisgKiByZXR1cm46IDAgb3IgdGhlIGxpbnV4IGVycm9yIGNvZGUgdGhhdCBtb3N0IGNsb3NlbHkgbWF0Y2hlcyB0aGUgQ0RGX1NUQVRVUy4KKyAqCWRlZmF1bHRzIHRvIC0xIChFUEVSTSkKKyAqLworc3RhdGljIGlubGluZSBpbnQgX19jZGZfc3RhdHVzX3RvX29zX3JldHVybihDREZfU1RBVFVTIHN0YXR1cykKK3sKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgQ0RGX1NUQVRVU19TVUNDRVNTOgorCQlyZXR1cm4gMDsKKwljYXNlIENERl9TVEFUVVNfRV9OVUxMX1ZBTFVFOgorCWNhc2UgQ0RGX1NUQVRVU19FX0ZBVUxUOgorCQlyZXR1cm4gLUVGQVVMVDsKKwljYXNlIENERl9TVEFUVVNfRV9USU1FT1VUOgorCWNhc2UgQ0RGX1NUQVRVU19FX0JVU1k6CisJCXJldHVybiAtRUJVU1k7CisJY2FzZSBDREZfU1RBVFVTX05PVF9JTklUSUFMSVpFRDoKKwljYXNlIENERl9TVEFUVVNfRV9BR0FJTjoKKwkJcmV0dXJuIC1FQUdBSU47CisJY2FzZSBDREZfU1RBVFVTX0VfTk9TVVBQT1JUOgorCQlyZXR1cm4gLUVOT1NZUzsKKwljYXNlIENERl9TVEFUVVNfRV9BTFJFQURZOgorCQlyZXR1cm4gLUVBTFJFQURZOworCWNhc2UgQ0RGX1NUQVRVU19FX05PTUVNOgorCQlyZXR1cm4gLUVOT01FTTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVQRVJNOworCX0KK30KKworCisvKioKKyAqIEBicmllZiBtZW1vcnkgYmFycmllcnMuCisgKi8KKworI2RlZmluZSBfX2NkZl9taW4oX2EsIF9iKSAgICAgICAgICgoX2EpIDwgKF9iKSA/IF9hIDogX2IpCisjZGVmaW5lIF9fY2RmX21heChfYSwgX2IpICAgICAgICAgKChfYSkgPiAoX2IpID8gX2EgOiBfYikKKworLyoqCisgKiBAYnJpZWYgQXNzZXJ0CisgKi8KKyNkZWZpbmUgX19jZGZfYXNzZXJ0KGV4cHIpICBkbyB7ICAgIFwKKwkJaWYgKHVubGlrZWx5KCEoZXhwcikpKSB7CQkJCVwKKwkJCXByX2VycigiQXNzZXJ0aW9uIGZhaWxlZCEgJXM6JXMgJXM6JWRcbiIsICAgXAorCQkJICAgICAgICMgZXhwciwgX19mdW5jX18sIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAgICAgXAorCQkJZHVtcF9zdGFjaygpOwkJCQkJICAgXAorCQkJcGFuaWMoIlRha2UgY2FyZSBvZiB0aGUgYXNzZXJ0IGZpcnN0XG4iKTsJICAgXAorCQl9ICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fY2RmX29zX2NwdV90b19sZTY0ICAgICAgICAgICAgICAgIGNwdV90b19sZTY0CisjZGVmaW5lIF9fY2RmX2xlMTZfdG9fY3B1ICAgICAgICAgICAgICAgIGxlMTZfdG9fY3B1CisjZGVmaW5lIF9fY2RmX2xlMzJfdG9fY3B1ICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1CisjZGVmaW5lIF9fY2RmX2NvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKQorCisjZW5kaWYgLypfSV9DREZfVVRJTF9IKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RzL2luYy9jZHNfYXBpLmggYi9jb3JlL2Nkcy9pbmMvY2RzX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjE4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9pbmMvY2RzX2FwaS5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworI2lmICFkZWZpbmVkKF9fQ0RTX0FQSV9IKQorI2RlZmluZSBfX0NEU19BUElfSAorCisvKioKKyAqIERPQzogIGNkc19hcGkuaAorICoKKyAqIENvbm5lY3Rpdml0eSBkcml2ZXIgc2VydmljZXMgcHVibGljIEFQSQorICoKKyAqLworCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8Y2RmX3N0YXR1cy5oPgorI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4KKyNpbmNsdWRlIDxjZGZfbGlzdC5oPgorI2luY2x1ZGUgPGNkc19nZXRfYmluLmg+CisjaW5jbHVkZSA8Y2RmX3RyYWNlLmg+CisjaW5jbHVkZSA8Y2RmX2V2ZW50Lmg+CisjaW5jbHVkZSA8Y2RmX2xvY2suaD4KKyNpbmNsdWRlIDxjZHNfcmVnX3NlcnZpY2UuaD4KKyNpbmNsdWRlIDxjZHNfbXEuaD4KKyNpbmNsdWRlIDxjZHNfcGFja2V0Lmg+CisjaW5jbHVkZSA8Y2RzX3NjaGVkLmg+CisjaW5jbHVkZSA8Y2RmX3RocmVhZHMuaD4KKyNpbmNsdWRlIDxjZGZfbWNfdGltZXIuaD4KKyNpbmNsdWRlIDxjZHNfcGFja19hbGlnbi5oPgorCisvKiBBbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBXTUEgdG8gcGVyZm9ybSBhbiBhc3luY2hyb25vdXMgYWN0aXZpdHkuCisgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSBsYXJnZXIgdGhhbiB0aGUgdGltZW91dCB1c2VkIGJ5IFdNSSB0byB3YWl0IGZvcgorICogYSByZXNwb25zZSBmcm9tIHRhcmdldAorICovCisjZGVmaW5lIENEU19XTUFfVElNRU9VVCAgKDE1MDAwKQorCitDREZfU1RBVFVTIGNkc19hbGxvY19nbG9iYWxfY29udGV4dCh2X0NPTlRFWFRfdCAqcF9jZHNfY29udGV4dCk7CisKK0NERl9TVEFUVVMgY2RzX2ZyZWVfZ2xvYmFsX2NvbnRleHQodl9DT05URVhUX3QgKnBfY2RzX2NvbnRleHQpOworCitDREZfU1RBVFVTIGNkc19wcmVfZW5hYmxlKHZfQ09OVEVYVF90IGNkc19jb250ZXh0KTsKKworQ0RGX1NUQVRVUyBjZHNfb3Blbih2X0NPTlRFWFRfdCAqcF9jZHNfY29udGV4dCwgdWludDMyX3QgaGRkQ29udGV4dFNpemUpOworCitDREZfU1RBVFVTIGNkc19lbmFibGUodl9DT05URVhUX3QgY2RzX2NvbnRleHQpOworCitDREZfU1RBVFVTIGNkc19kaXNhYmxlKHZfQ09OVEVYVF90IGNkc19jb250ZXh0KTsKKworQ0RGX1NUQVRVUyBjZHNfY2xvc2Uodl9DT05URVhUX3QgY2RzX2NvbnRleHQpOworCitDREZfU1RBVFVTIGNkc19zaHV0ZG93bih2X0NPTlRFWFRfdCBjZHNfY29udGV4dCk7CisKK3ZvaWQgY2RzX2NvcmVfcmV0dXJuX21zZyh2b2lkICpwVkNvbnRleHQsIHBfY2RzX21zZ193cmFwcGVyIHBNc2dXcmFwcGVyKTsKKwordm9pZCAqY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSUQgbW9kdWxlSWQpOworCit2X0NPTlRFWFRfdCBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KHZvaWQpOworCit1aW50OF90IGNkc19pc19sb2dwX2luX3Byb2dyZXNzKHZvaWQpOwordm9pZCBjZHNfc2V0X2xvZ3BfaW5fcHJvZ3Jlc3ModWludDhfdCB2YWx1ZSk7CisKK3VpbnQ4X3QgY2RzX2lzX2xvYWRfdW5sb2FkX2luX3Byb2dyZXNzKHZvaWQpOwordm9pZCBjZHNfc2V0X2xvYWRfdW5sb2FkX2luX3Byb2dyZXNzKHVpbnQ4X3QgdmFsdWUpOworCitDREZfU1RBVFVTIGNkc19hbGxvY19jb250ZXh0KHZvaWQgKnBfY2RzX2NvbnRleHQsIENERl9NT0RVTEVfSUQgbW9kdWxlSUQsCisJCQkgICAgIHZvaWQgKipwcE1vZHVsZUNvbnRleHQsIHVpbnQzMl90IHNpemUpOworCitDREZfU1RBVFVTIGNkc19mcmVlX2NvbnRleHQodm9pZCAqcF9jZHNfY29udGV4dCwgQ0RGX01PRFVMRV9JRCBtb2R1bGVJRCwKKwkJCSAgICB2b2lkICpwTW9kdWxlQ29udGV4dCk7CisKK0NERl9TVEFUVVMgY2RzX2dldF92ZGV2X3R5cGVzKHRDREZfQ09OX01PREUgbW9kZSwgdWludDMyX3QgKnR5cGUsCisJCQkgICAgICB1aW50MzJfdCAqc3ViVHlwZSk7CisKK3ZvaWQgY2RzX2ZsdXNoX3dvcmsodm9pZCAqd29yayk7Cit2b2lkIGNkc19mbHVzaF9kZWxheWVkX3dvcmsodm9pZCAqZHdvcmspOworCitib29sIGNkc19pc19wYWNrZXRfbG9nX2VuYWJsZWQodm9pZCk7CisKK3VpbnQ2NF90IGNkc19nZXRfbW9ub3RvbmljX2Jvb3R0aW1lKHZvaWQpOworCit2b2lkIGNkc190cmlnZ2VyX3JlY292ZXJ5KHZvaWQpOworCit2b2lkIGNkc19zZXRfd2FrZWxvY2tfbG9nZ2luZyhib29sIHZhbHVlKTsKK2Jvb2wgY2RzX2lzX3dha2Vsb2NrX2VuYWJsZWQodm9pZCk7Cit2b2lkIGNkc19zZXRfcmluZ19sb2dfbGV2ZWwodWludDMyX3QgcmluZ19pZCwgdWludDMyX3QgbG9nX2xldmVsKTsKK2VudW0gd2lmaV9kcml2ZXJfbG9nX2xldmVsIGNkc19nZXRfcmluZ19sb2dfbGV2ZWwodWludDMyX3QgcmluZ19pZCk7Cit2b2lkIGNkc19zZXRfbXVsdGljYXN0X2xvZ2dpbmcodWludDhfdCB2YWx1ZSk7Cit1aW50OF90IGNkc19pc19tdWx0aWNhc3RfbG9nZ2luZyh2b2lkKTsKK0NERl9TVEFUVVMgY2RzX3NldF9sb2dfY29tcGxldGlvbih1aW50MzJfdCBpc19mYXRhbCwKKwkJdWludDMyX3QgdHlwZSwKKwkJdWludDMyX3Qgc3ViX3R5cGUpOwordm9pZCBjZHNfZ2V0X2xvZ19jb21wbGV0aW9uKHVpbnQzMl90ICppc19mYXRhbCwKKwkJdWludDMyX3QgKnR5cGUsCisJCXVpbnQzMl90ICpzdWJfdHlwZSk7Citib29sIGNkc19pc19sb2dfcmVwb3J0X2luX3Byb2dyZXNzKHZvaWQpOwordm9pZCBjZHNfaW5pdF9sb2dfY29tcGxldGlvbih2b2lkKTsKK3ZvaWQgY2RzX2RlaW5pdF9sb2dfY29tcGxldGlvbih2b2lkKTsKK0NERl9TVEFUVVMgY2RzX2ZsdXNoX2xvZ3ModWludDMyX3QgaXNfZmF0YWwsCisJCXVpbnQzMl90IGluZGljYXRvciwKKwkJdWludDMyX3QgcmVhc29uX2NvZGUpOwordm9pZCBjZHNfbG9nZ2luZ19zZXRfZndfZmx1c2hfY29tcGxldGUodm9pZCk7CisjZW5kaWYgLyogaWYgIWRlZmluZWQgX19DRFNfQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RzL2luYy9jZHNfY29uY3VycmVuY3kuaCBiL2NvcmUvY2RzL2luYy9jZHNfY29uY3VycmVuY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzI5NDFjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZHMvaW5jL2Nkc19jb25jdXJyZW5jeS5oCkBAIC0wLDAgKzEsNzMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQ0RTX0NPTkNVUlJFTkNZX0gKKyNkZWZpbmUgX19DRFNfQ09OQ1VSUkVOQ1lfSAorCisvKioKKyAqIERPQzogY2RzX2NvbmN1cnJlbmN5LmgKKyAqCisgKiBDRFMgQ29uY3VycmVuY3QgQ29ubmVjdGlvbiBNYW5hZ2VtZW50IGVudGl0eQorICovCisKKy8qIEluY2x1ZGUgZmlsZXMgKi8KKworI2luY2x1ZGUgIndsYW5faGRkX21haW4uaCIKKworI2RlZmluZSBNQVhfTlVNQkVSX09GX0NPTkNfQ09OTkVDVElPTlMgMworI2RlZmluZSBNQVhfTlVNX0NIQU4gICAgMTI4CisjZGVmaW5lIERCU19PUFBPUlRVTklTVElDX1RJTUUgICAgMTAKKworLyoqCisgKiBlbnVtIGNkc19jaGFpbl9tb2RlIC0gQ2hhaW4gTWFzayB0eCAmIHJ4IGNvbWJpbmF0aW9uLgorICoKKyAqIEBDRFNfT05FX09ORTogT25lIGZvciBUeCwgT25lIGZvciBSeAorICogQENEU19UV09fVFdPOiBUd28gZm9yIFR4LCBUd28gZm9yIFJ4CisgKiBAQ0RTX01BWF9OT19PRl9DSEFJTl9NT0RFOiBNYXggcGxhY2UgaG9sZGVyCisgKgorICogVGhlc2UgYXJlIGdlbmVyaWMgSURzIHRoYXQgaWRlbnRpZnkgdGhlIHZhcmlvdXMgcm9sZXMKKyAqIGluIHRoZSBzb2Z0d2FyZSBzeXN0ZW0KKyAqLworZW51bSBjZHNfY2hhaW5fbW9kZSB7CisJQ0RTX09ORV9PTkUgPSAwLAorCUNEU19UV09fVFdPLAorCUNEU19NQVhfTk9fT0ZfQ0hBSU5fTU9ERQorfTsKKworLyoqCisgKiBlbnVtIGNkc19jb25jX3ByaW9yaXR5X21vZGUgLSB0L3AsIHBvd2Vyc2F2ZSwgbGF0ZW5jeS4KKyAqCisgKiBAQ0RTX1RIUk9VR0hQVVQ6IHQvcCBpcyB0aGUgcHJpb3JpdHkKKyAqIEBDRFNfUE9XRVJTQVZFOiBwb3dlcnNhdmUgaXMgdGhlIHByaW9yaXR5CisgKiBAQ0RTX0xBVEVOQ1k6IGxhdGVuY3kgaXMgdGhlIHByaW9yaXR5CisgKiBAQ0RTX01BWF9DT05DX1BSSU9SSVRZX01PREU6IE1heCBwbGFjZSBob2xkZXIKKyAqCisgKiBUaGVzZSBhcmUgZ2VuZXJpYyBJRHMgdGhhdCBpZGVudGlmeSB0aGUgdmFyaW91cyByb2xlcworICogaW4gdGhlIHNvZnR3YXJlIHN5c3RlbQorICovCitlbnVtIGNkc19jb25jX3ByaW9yaXR5X21vZGUgeworCUNEU19USFJPVUdIUFVUID0gMCwKKwlDRFNfUE9XRVJTQVZFLAorCUNEU19MQVRFTkNZLAorCUNEU19NQVhfQ09OQ19QUklPUklUWV9NT0RFCit9OworCisvKioKKyAqIGVudW0gY2RzX2Nvbl9tb2RlIC0gY29uY3VycmVuY3kgbW9kZSBmb3IgUENMIHRhYmxlCisgKgorICogQENEU19TVEFfTU9ERTogc3RhdGlvbiBtb2RlCisgKiBAQ0RTX1NBUF9NT0RFOiBTQVAgbW9kZQorICogQENEU19QMlBfQ0xJRU5UX01PREU6IFAyUCBjbGllbnQgbW9kZQorICogQENEU19QMlBfR09fTU9ERTogUDJQIEdvIG1vZGUKKyAqIEBDRFNfSUJTU19NT0RFOiBJQlNTIG1vZGUKKyAqIEBDRFNfTUFYX05VTV9PRl9NT0RFOiBtYXggdmFsdWUgcGxhY2UgaG9sZGVyCisgKi8KK2VudW0gY2RzX2Nvbl9tb2RlIHsKKwlDRFNfU1RBX01PREUgPSAwLAorCUNEU19TQVBfTU9ERSwKKwlDRFNfUDJQX0NMSUVOVF9NT0RFLAorCUNEU19QMlBfR09fTU9ERSwKKwlDRFNfSUJTU19NT0RFLAorCUNEU19NQVhfTlVNX09GX01PREUKK307CisKKy8qKgorICogZW51bSBjZHNfcGNsX3R5cGUgLSBWYXJpb3VzIHR5cGVzIG9mIFByZWZlcnJlZCBjaGFubmVsIGxpc3QgKFBDTCkuCisgKgorICogQENEU19OT05FOiBObyBjaGFubmVsIHByZWZlcmVuY2UKKyAqIEBDRFNfMjRHOiAyLjQgR2h6IGNoYW5uZWxzIG9ubHkKKyAqIEBDRFNfNUc6IDUgR2h6IGNoYW5uZWxzIG9ubHkKKyAqIEBDRFNfU0NDX0NIOiBTQ0MgY2hhbm5lbCBvbmx5CisgKiBAQ0RTX01DQ19DSDogTUNDIGNoYW5uZWxzIG9ubHkKKyAqIEBDRFNfU0NDX0NIXzI0RzogU0NDIGNoYW5uZWwgJiAyLjQgR2h6IGNoYW5uZWxzCisgKiBAQ0RTX1NDQ19DSF81RzogU0NDIGNoYW5uZWwgJiA1IEdoeiBjaGFubmVscworICogQENEU18yNEdfU0NDX0NIOiAyLjQgR2h6IGNoYW5uZWxzICYgU0NDIGNoYW5uZWwKKyAqIEBDRFNfNUdfU0NDX0NIOiA1IEdoeiBjaGFubmVscyAmIFNDQyBjaGFubmVsCisgKiBAQ0RTX1NDQ19PTl81X1NDQ19PTl8yNF8yNEc6IFNDQyBjaGFubmVsIG9uIDUgR2h6LCBTQ0MKKyAqCWNoYW5uZWwgb24gMi40IEdoeiAmIDIuNCBHaHogY2hhbm5lbHMKKyAqIEBDRFNfU0NDX09OXzVfU0NDX09OXzI0XzVHOiBTQ0MgY2hhbm5lbCBvbiA1IEdoeiwgU0NDIGNoYW5uZWwKKyAqCW9uIDIuNCBHaHogJiA1IEdoeiBjaGFubmVscworICogQENEU19TQ0NfT05fMjRfU0NDX09OXzVfMjRHOiBTQ0MgY2hhbm5lbCBvbiAyLjQgR2h6LCBTQ0MKKyAqCWNoYW5uZWwgb24gNSBHaHogJiAyLjQgR2h6IGNoYW5uZWxzCisgKiBAQ0RTX1NDQ19PTl8yNF9TQ0NfT05fNV81RzogU0NDIGNoYW5uZWwgb24gMi40IEdoeiwgU0NDCisgKgljaGFubmVsIG9uIDUgR2h6ICYgNSBHaHogY2hhbm5lbHMKKyAqIEBDRFNfU0NDX09OXzVfU0NDX09OXzI0OiBTQ0MgY2hhbm5lbCBvbiA1IEdoeiwgU0NDIGNoYW5uZWwgb24KKyAqCTIuNCBHaHoKKyAqIEBDRFNfU0NDX09OXzI0X1NDQ19PTl81OiBTQ0MgY2hhbm5lbCBvbiAyLjQgR2h6LCBTQ0MgY2hhbm5lbAorICoJb24gNSBHaHoKKyAqIEBDRFNfTUNDX0NIXzI0RzogTUNDIGNoYW5uZWxzICYgMi40IEdoeiBjaGFubmVscworICogQENEU19NQ0NfQ0hfNUc6ICBNQ0MgY2hhbm5lbHMgJiA1IEdoeiBjaGFubmVscworICogQENEU18yNEdfTUNDX0NIOiAyLjQgR2h6IGNoYW5uZWxzICYgTUNDIGNoYW5uZWxzCisgKiBAQ0RTXzVHX01DQ19DSDogNSBHaHogY2hhbm5lbHMgJiBNQ0MgY2hhbm5lbHMKKyAqIEBDRFNfTUFYX1BDTF9UWVBFOiBNYXggcGxhY2UgaG9sZGVyCisgKgorICogVGhlc2UgYXJlIGdlbmVyaWMgSURzIHRoYXQgaWRlbnRpZnkgdGhlIHZhcmlvdXMgcm9sZXMKKyAqIGluIHRoZSBzb2Z0d2FyZSBzeXN0ZW0KKyAqLworZW51bSBjZHNfcGNsX3R5cGUgeworCUNEU19OT05FID0gMCwKKwlDRFNfMjRHLAorCUNEU181RywKKwlDRFNfU0NDX0NILAorCUNEU19NQ0NfQ0gsCisJQ0RTX1NDQ19DSF8yNEcsCisJQ0RTX1NDQ19DSF81RywKKwlDRFNfMjRHX1NDQ19DSCwKKwlDRFNfNUdfU0NDX0NILAorCUNEU19TQ0NfT05fNV9TQ0NfT05fMjRfMjRHLAorCUNEU19TQ0NfT05fNV9TQ0NfT05fMjRfNUcsCisJQ0RTX1NDQ19PTl8yNF9TQ0NfT05fNV8yNEcsCisJQ0RTX1NDQ19PTl8yNF9TQ0NfT05fNV81RywKKwlDRFNfU0NDX09OXzVfU0NDX09OXzI0LAorCUNEU19TQ0NfT05fMjRfU0NDX09OXzUsCisJQ0RTX01DQ19DSF8yNEcsCisJQ0RTX01DQ19DSF81RywKKwlDRFNfMjRHX01DQ19DSCwKKwlDRFNfNUdfTUNDX0NILAorCisJQ0RTX01BWF9QQ0xfVFlQRQorfTsKKworLyoqCisgKiBlbnVtIGNkc19vbmVfY29ubmVjdGlvbl9tb2RlIC0gQ29tYmluYXRpb24gb2YgZmlyc3QgY29ubmVjdGlvbgorICogdHlwZSwgYmFuZCAmIHNwYXRpYWwgc3RyZWFtIHVzZWQuCisgKgorICogQENEU19TVEFfMjRfMXgxOiBTVEEgY29ubmVjdGlvbiB1c2luZyAxeDFAMi40IEdoegorICogQENEU19TVEFfMjRfMngyOiBTVEEgY29ubmVjdGlvbiB1c2luZyAyeDJAMi40IEdoegorICogQENEU19TVEFfNV8xeDE6IFNUQSBjb25uZWN0aW9uIHVzaW5nIDF4MUA1IEdoegorICogQENEU19TVEFfNV8yeDI6IFNUQSBjb25uZWN0aW9uIHVzaW5nIDJ4MkA1IEdoegorICogQENEU19QMlBfQ0xJXzI0XzF4MTogUDJQIENsaWVudCBjb25uZWN0aW9uIHVzaW5nIDF4MUAyLjQgR2h6CisgKiBAQ0RTX1AyUF9DTElfMjRfMngyOiBQMlAgQ2xpZW50IGNvbm5lY3Rpb24gdXNpbmcgMngyQDIuNCBHaHoKKyAqIEBDRFNfUDJQX0NMSV81XzF4MTogUDJQIENsaWVudCBjb25uZWN0aW9uIHVzaW5nIDF4MUA1IEdoegorICogQENEU19QMlBfQ0xJXzVfMngyOiBQMlAgQ2xpZW50IGNvbm5lY3Rpb24gdXNpbmcgMngyQDUgR2h6CisgKiBAQ0RTX1AyUF9HT18yNF8xeDE6IFAyUCBHTyBjb25uZWN0aW9uIHVzaW5nIDF4MUAyLjQgR2h6CisgKiBAQ0RTX1AyUF9HT18yNF8yeDI6IFAyUCBHTyBjb25uZWN0aW9uIHVzaW5nIDJ4MkAyLjQgR2h6CisgKiBAQ0RTX1AyUF9HT181XzF4MTogUDJQIEdPIGNvbm5lY3Rpb24gdXNpbmcgMXgxQDUgR2h6CisgKiBAQ0RTX1AyUF9HT181XzJ4MjogUDJQIEdPIGNvbm5lY3Rpb24gdXNpbmcgMngyQDUgR2h6CisgKiBAQ0RTX1NBUF8yNF8xeDE6IFNBUCBjb25uZWN0aW9uIHVzaW5nIDF4MUAyLjQgR2h6CisgKiBAQ0RTX1NBUF8yNF8yeDI6IFNBUCBjb25uZWN0aW9uIHVzaW5nIDJ4MkAyLjQgR2h6CisgKiBAQ0RTX1NBUF81XzF4MTogU0FQIGNvbm5lY3Rpb24gdXNpbmcgMXgxQDUgR2h6CisgKiBAQ0RTX1NBUF81XzF4MTogU0FQIGNvbm5lY3Rpb24gdXNpbmcgMngyQDUgR2h6CisgKiBAQ0RTX0lCU1NfMjRfMXgxOiAgSUJTUyBjb25uZWN0aW9uIHVzaW5nIDF4MUAyLjQgR2h6CisgKiBAQ0RTX0lCU1NfMjRfMngyOiAgSUJTUyBjb25uZWN0aW9uIHVzaW5nIDJ4MkAyLjQgR2h6CisgKiBAQ0RTX0lCU1NfNV8xeDE6ICBJQlNTIGNvbm5lY3Rpb24gdXNpbmcgMXgxQDUgR2h6CisgKiBAQ0RTX0lCU1NfNV8yeDI6ICBJQlNTIGNvbm5lY3Rpb24gdXNpbmcgMngyQDUgR2h6CisgKiBAQ0RTX01BWF9PTkVfQ09OTkVDVElPTl9NT0RFOiBNYXggcGxhY2UgaG9sZGVyCisgKgorICogVGhlc2UgYXJlIGdlbmVyaWMgSURzIHRoYXQgaWRlbnRpZnkgdGhlIHZhcmlvdXMgcm9sZXMKKyAqIGluIHRoZSBzb2Z0d2FyZSBzeXN0ZW0KKyAqLworZW51bSBjZHNfb25lX2Nvbm5lY3Rpb25fbW9kZSB7CisJQ0RTX1NUQV8yNF8xeDEgPSAwLAorCUNEU19TVEFfMjRfMngyLAorCUNEU19TVEFfNV8xeDEsCisJQ0RTX1NUQV81XzJ4MiwKKwlDRFNfUDJQX0NMSV8yNF8xeDEsCisJQ0RTX1AyUF9DTElfMjRfMngyLAorCUNEU19QMlBfQ0xJXzVfMXgxLAorCUNEU19QMlBfQ0xJXzVfMngyLAorCUNEU19QMlBfR09fMjRfMXgxLAorCUNEU19QMlBfR09fMjRfMngyLAorCUNEU19QMlBfR09fNV8xeDEsCisJQ0RTX1AyUF9HT181XzJ4MiwKKwlDRFNfU0FQXzI0XzF4MSwKKwlDRFNfU0FQXzI0XzJ4MiwKKwlDRFNfU0FQXzVfMXgxLAorCUNEU19TQVBfNV8yeDIsCisJQ0RTX0lCU1NfMjRfMXgxLAorCUNEU19JQlNTXzI0XzJ4MiwKKwlDRFNfSUJTU181XzF4MSwKKwlDRFNfSUJTU181XzJ4MiwKKworCUNEU19NQVhfT05FX0NPTk5FQ1RJT05fTU9ERQorfTsKKworLyoqCisgKiBlbnVtIGNkc190d29fY29ubmVjdGlvbl9tb2RlIC0gQ29tYmluYXRpb24gb2YgZmlyc3QgdHdvCisgKiBjb25uZWN0aW9ucyB0eXBlLCBjb25jdXJyZW5jeSBzdGF0ZSwgYmFuZCAmIHNwYXRpYWwgc3RyZWFtCisgKiB1c2VkLgorICoKKyAqIEBDRFNfU1RBX1NBUF9TQ0NfMjRfMXgxOiBTVEEgJiBTQVAgY29ubmVjdGlvbiBvbiBTQ0MgdXNpbmcKKyAqCQkJMXgxQDIuNCBHaHoKKyAqIEBDRFNfU1RBX1NBUF9TQ0NfMjRfMngyOiBTVEEgJiBTQVAgY29ubmVjdGlvbiBvbiBTQ0MgdXNpbmcKKyAqCQkJMngyQDIuNCBHaHoKKyAqIEBDRFNfU1RBX1NBUF9NQ0NfMjRfMXgxOiBTVEEgJiBTQVAgY29ubmVjdGlvbiBvbiBNQ0MgdXNpbmcKKyAqCQkJMXgxQDIuNCBHaHoKKyAqIEBDRFNfU1RBX1NBUF9NQ0NfMjRfMngyOiBTVEEgJiBTQVAgY29ubmVjdGlvbiBvbiBNQ0MgdXNpbmcKKyAqCQkJMngyQDIuNCBHaHoKKyAqIEBDRFNfU1RBX1NBUF9TQ0NfNV8xeDE6IFNUQSAmIFNBUCBjb25uZWN0aW9uIG9uIFNDQyB1c2luZworICoJCQkxeDFANSBHaHoKKyAqIEBDRFNfU1RBX1NBUF9TQ0NfNV8yeDI6IFNUQSAmIFNBUCBjb25uZWN0aW9uIG9uIFNDQyB1c2luZworICoJCQkyeDJANSBHaHoKKyAqIEBDRFNfU1RBX1NBUF9NQ0NfNV8xeDE6IFNUQSAmIFNBUCBjb25uZWN0aW9uIG9uIE1DQyB1c2luZworICoJCQkxeDFANSBHaHoKKyAqIEBDRFNfU1RBX1NBUF9NQ0NfNV8yeDI6IFNUQSAmIFNBUCBjb25uZWN0aW9uIG9uIE1DQyB1c2luZworICoJCQkyeDJANSBHaHoKKyAqIEBDRFNfU1RBX1NBUF9EQlNfMXgxLDogU1RBICYgU0FQIGNvbm5lY3Rpb24gb24gREJTIHVzaW5nIDF4MQorICogQENEU19TVEFfUDJQX0dPX1NDQ18yNF8xeDE6IFNUQSAmIFAyUCBHTyBjb25uZWN0aW9uIG9uIFNDQworICoJCQl1c2luZyAxeDFAMi40IEdoegorICogQENEU19TVEFfUDJQX0dPX1NDQ18yNF8yeDI6IFNUQSAmIFAyUCBHTyBjb25uZWN0aW9uIG9uIFNDQworICoJCQl1c2luZyAyeDJAMi40IEdoegorICogQENEU19TVEFfUDJQX0dPX01DQ18yNF8xeDE6IFNUQSAmIFAyUCBHTyBjb25uZWN0aW9uIG9uIE1DQworICoJCQl1c2luZyAxeDFAMi40IEdoegorICogQENEU19TVEFfUDJQX0dPX01DQ18yNF8yeDI6IFNUQSAmIFAyUCBHTyBjb25uZWN0aW9uIG9uIE1DQworICoJCQl1c2luZyAyeDJAMi40IEdoegorICogQENEU19TVEFfUDJQX0dPX1NDQ181XzF4MTogU1RBICYgUDJQIEdPIGNvbm5lY3Rpb24gb24gU0NDCisgKgkJCXVzaW5nIDF4MUA1IEdoegorICogQENEU19TVEFfUDJQX0dPX1NDQ181XzJ4MjogU1RBICYgUDJQIEdPIGNvbm5lY3Rpb24gb24gU0NDCisgKgkJCXVzaW5nIDJ4MkA1IEdoegorICogQENEU19TVEFfUDJQX0dPX01DQ181XzF4MTogU1RBICYgUDJQIEdPIGNvbm5lY3Rpb24gb24gTUNDCisgKgkJCXVzaW5nIDF4MUA1IEdoegorICogQENEU19TVEFfUDJQX0dPX01DQ181XzJ4MjogU1RBICYgUDJQIEdPIGNvbm5lY3Rpb24gb24gTUNDCisgKgkJCXVzaW5nIDJ4MkA1IEdoegorICogQENEU19TVEFfUDJQX0dPX0RCU18xeDE6IFNUQSAmIFAyUCBHTyBjb25uZWN0aW9uIG9uIERCUyB1c2luZworICoJCQkxeDEKKyAqIEBDRFNfU1RBX1AyUF9DTElfU0NDXzI0XzF4MTogU1RBICYgUDJQIENMSSBjb25uZWN0aW9uIG9uIFNDQworICoJCQl1c2luZyAxeDFAMi40IEdoegorICogQENEU19TVEFfUDJQX0NMSV9TQ0NfMjRfMngyOiBTVEEgJiBQMlAgQ0xJIGNvbm5lY3Rpb24gb24gU0NDCisgKgkJCXVzaW5nIDJ4MkAyLjQgR2h6CisgKiBAQ0RTX1NUQV9QMlBfQ0xJX01DQ18yNF8xeDE6IFNUQSAmIFAyUCBDTEkgY29ubmVjdGlvbiBvbiBNQ0MKKyAqCQkJdXNpbmcgMXgxQDIuNCBHaHoKKyAqIEBDRFNfU1RBX1AyUF9DTElfTUNDXzI0XzJ4MjogU1RBICYgUDJQIENMSSBjb25uZWN0aW9uIG9uIE1DQworICoJCQl1c2luZyAyeDJAMi40IEdoegorICogQENEU19TVEFfUDJQX0NMSV9TQ0NfNV8xeDE6IFNUQSAmIFAyUCBDTEkgY29ubmVjdGlvbiBvbiBTQ0MKKyAqCQkJdXNpbmcgMXgxQDUgR2h6CisgKiBAQ0RTX1NUQV9QMlBfQ0xJX1NDQ181XzJ4MjogU1RBICYgUDJQIENMSSBjb25uZWN0aW9uIG9uIFNDQworICoJCQl1c2luZyAyeDJANSBHaHoKKyAqIEBDRFNfU1RBX1AyUF9DTElfTUNDXzVfMXgxOiBTVEEgJiBQMlAgQ0xJIGNvbm5lY3Rpb24gb24gTUNDCisgKgkJCXVzaW5nIDF4MUA1IEdoegorICogQENEU19TVEFfUDJQX0NMSV9NQ0NfNV8yeDI6IFNUQSAmIFAyUCBDTEkgY29ubmVjdGlvbiBvbiBNQ0MKKyAqCQkJdXNpbmcgMngyQDUgR2h6CisgKiBAQ0RTX1NUQV9QMlBfQ0xJX0RCU18xeDE6IFNUQSAmIFAyUCBDTEkgY29ubmVjdGlvbiBvbiBEQlMKKyAqCQkJdXNpbmcgMXgxCisgKiBAQ0RTX1AyUF9HT19QMlBfQ0xJX1NDQ18yNF8xeDE6IFAyUCBHTyAmIENMSSBjb25uZWN0aW9uIG9uCisgKgkJCVNDQyB1c2luZyAxeDFAMi40IEdoegorICogQENEU19QMlBfR09fUDJQX0NMSV9TQ0NfMjRfMngyOiBQMlAgR08gJiBDTEkgY29ubmVjdGlvbiBvbgorICoJCQlTQ0MgdXNpbmcgMngyQDIuNCBHaHoKKyAqIEBDRFNfUDJQX0dPX1AyUF9DTElfTUNDXzI0XzF4MTogUDJQIEdPICYgQ0xJIGNvbm5lY3Rpb24gb24KKyAqCQkJTUNDIHVzaW5nIDF4MUAyLjQgR2h6CisgKiBAQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ18yNF8yeDI6IFAyUCBHTyAmIENMSSBjb25uZWN0aW9uIG9uCisgKgkJCU1DQyB1c2luZyAyeDJAMi40IEdoegorICogQENEU19QMlBfR09fUDJQX0NMSV9TQ0NfNV8xeDE6IFAyUCBHTyAmIENMSSBjb25uZWN0aW9uIG9uCisgKgkJCVNDQyB1c2luZyAxeDFANSBHaHoKKyAqIEBDRFNfUDJQX0dPX1AyUF9DTElfU0NDXzVfMngyOiBQMlAgR08gJiBDTEkgY29ubmVjdGlvbiBvbgorICoJCQlTQ0MgdXNpbmcgMngyQDUgR2h6CisgKiBAQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ181XzF4MTogUDJQIEdPICYgQ0xJIGNvbm5lY3Rpb24gb24KKyAqCQkJTUNDIHVzaW5nIDF4MUA1IEdoegorICogQENEU19QMlBfR09fUDJQX0NMSV9NQ0NfNV8yeDI6IFAyUCBHTyAmIENMSSBjb25uZWN0aW9uIG9uCisgKgkJCU1DQyB1c2luZyAyeDJANSBHaHoKKyAqIEBDRFNfUDJQX0dPX1AyUF9DTElfREJTXzF4MTogUDJQIEdPICYgQ0xJIGNvbm5lY3Rpb24gb24gREJTCisgKgkJCXVzaW5nIDF4MQorICogQENEU19QMlBfR09fU0FQX1NDQ18yNF8xeDE6IFAyUCBHTyAmIFNBUCBjb25uZWN0aW9uIG9uCisgKgkJCVNDQyB1c2luZyAxeDFAMi40IEdoegorICogQENEU19QMlBfR09fU0FQX1NDQ18yNF8yeDI6IFAyUCBHTyAmIFNBUCBjb25uZWN0aW9uIG9uCisgKgkJCVNDQyB1c2luZyAyeDJAMi40IEdoegorICogQENEU19QMlBfR09fU0FQX01DQ18yNF8xeDE6IFAyUCBHTyAmIFNBUCBjb25uZWN0aW9uIG9uCisgKgkJCU1DQyB1c2luZyAxeDFAMi40IEdoegorICogQENEU19QMlBfR09fU0FQX01DQ18yNF8yeDI6IFAyUCBHTyAmIFNBUCBjb25uZWN0aW9uIG9uCisgKgkJCU1DQyB1c2luZyAyeDJAMi40IEdoegorICogQENEU19QMlBfR09fU0FQX1NDQ181XzF4MTogUDJQIEdPICYgU0FQIGNvbm5lY3Rpb24gb24KKyAqCQkJU0NDIHVzaW5nIDF4MUA1IEdoegorICogQENEU19QMlBfR09fU0FQX1NDQ181XzJ4MjogUDJQIEdPICYgU0FQIGNvbm5lY3Rpb24gb24KKyAqCQkJU0NDIHVzaW5nIDJ4MkA1IEdoegorICogQENEU19QMlBfR09fU0FQX01DQ181XzF4MTogUDJQIEdPICYgU0FQIGNvbm5lY3Rpb24gb24KKyAqCQkJTUNDIHVzaW5nIDF4MUA1IEdoegorICogQENEU19QMlBfR09fU0FQX01DQ181XzJ4MjogUDJQIEdPICYgU0FQIGNvbm5lY3Rpb24gb24KKyAqCQkJTUNDIHVzaW5nIDJ4MkA1IEdoegorICogQENEU19QMlBfR09fU0FQX0RCU18xeDE6IFAyUCBHTyAmIFNBUCBjb25uZWN0aW9uIG9uIERCUyB1c2luZworICoJCQkxeDEKKyAqIEBDRFNfTUFYX1RXT19DT05ORUNUSU9OX01PREU6IE1heCBwbGFjZSBob2xkZXIKKyAqCisgKiBUaGVzZSBhcmUgZ2VuZXJpYyBJRHMgdGhhdCBpZGVudGlmeSB0aGUgdmFyaW91cyByb2xlcworICogaW4gdGhlIHNvZnR3YXJlIHN5c3RlbQorICovCitlbnVtIGNkc190d29fY29ubmVjdGlvbl9tb2RlIHsKKwlDRFNfU1RBX1NBUF9TQ0NfMjRfMXgxID0gMCwKKwlDRFNfU1RBX1NBUF9TQ0NfMjRfMngyLAorCUNEU19TVEFfU0FQX01DQ18yNF8xeDEsCisJQ0RTX1NUQV9TQVBfTUNDXzI0XzJ4MiwKKwlDRFNfU1RBX1NBUF9TQ0NfNV8xeDEsCisJQ0RTX1NUQV9TQVBfU0NDXzVfMngyLAorCUNEU19TVEFfU0FQX01DQ181XzF4MSwKKwlDRFNfU1RBX1NBUF9NQ0NfNV8yeDIsCisJQ0RTX1NUQV9TQVBfTUNDXzI0XzVfMXgxLAorCUNEU19TVEFfU0FQX01DQ18yNF81XzJ4MiwKKwlDRFNfU1RBX1NBUF9EQlNfMXgxLAorCUNEU19TVEFfUDJQX0dPX1NDQ18yNF8xeDEsCisJQ0RTX1NUQV9QMlBfR09fU0NDXzI0XzJ4MiwKKwlDRFNfU1RBX1AyUF9HT19NQ0NfMjRfMXgxLAorCUNEU19TVEFfUDJQX0dPX01DQ18yNF8yeDIsCisJQ0RTX1NUQV9QMlBfR09fU0NDXzVfMXgxLAorCUNEU19TVEFfUDJQX0dPX1NDQ181XzJ4MiwKKwlDRFNfU1RBX1AyUF9HT19NQ0NfNV8xeDEsCisJQ0RTX1NUQV9QMlBfR09fTUNDXzVfMngyLAorCUNEU19TVEFfUDJQX0dPX01DQ18yNF81XzF4MSwKKwlDRFNfU1RBX1AyUF9HT19NQ0NfMjRfNV8yeDIsCisJQ0RTX1NUQV9QMlBfR09fREJTXzF4MSwKKwlDRFNfU1RBX1AyUF9DTElfU0NDXzI0XzF4MSwKKwlDRFNfU1RBX1AyUF9DTElfU0NDXzI0XzJ4MiwKKwlDRFNfU1RBX1AyUF9DTElfTUNDXzI0XzF4MSwKKwlDRFNfU1RBX1AyUF9DTElfTUNDXzI0XzJ4MiwKKwlDRFNfU1RBX1AyUF9DTElfU0NDXzVfMXgxLAorCUNEU19TVEFfUDJQX0NMSV9TQ0NfNV8yeDIsCisJQ0RTX1NUQV9QMlBfQ0xJX01DQ181XzF4MSwKKwlDRFNfU1RBX1AyUF9DTElfTUNDXzVfMngyLAorCUNEU19TVEFfUDJQX0NMSV9NQ0NfMjRfNV8xeDEsCisJQ0RTX1NUQV9QMlBfQ0xJX01DQ18yNF81XzJ4MiwKKwlDRFNfU1RBX1AyUF9DTElfREJTXzF4MSwKKwlDRFNfUDJQX0dPX1AyUF9DTElfU0NDXzI0XzF4MSwKKwlDRFNfUDJQX0dPX1AyUF9DTElfU0NDXzI0XzJ4MiwKKwlDRFNfUDJQX0dPX1AyUF9DTElfTUNDXzI0XzF4MSwKKwlDRFNfUDJQX0dPX1AyUF9DTElfTUNDXzI0XzJ4MiwKKwlDRFNfUDJQX0dPX1AyUF9DTElfU0NDXzVfMXgxLAorCUNEU19QMlBfR09fUDJQX0NMSV9TQ0NfNV8yeDIsCisJQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ181XzF4MSwKKwlDRFNfUDJQX0dPX1AyUF9DTElfTUNDXzVfMngyLAorCUNEU19QMlBfR09fUDJQX0NMSV9NQ0NfMjRfNV8xeDEsCisJQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ18yNF81XzJ4MiwKKwlDRFNfUDJQX0dPX1AyUF9DTElfREJTXzF4MSwKKwlDRFNfUDJQX0dPX1NBUF9TQ0NfMjRfMXgxLAorCUNEU19QMlBfR09fU0FQX1NDQ18yNF8yeDIsCisJQ0RTX1AyUF9HT19TQVBfTUNDXzI0XzF4MSwKKwlDRFNfUDJQX0dPX1NBUF9NQ0NfMjRfMngyLAorCUNEU19QMlBfR09fU0FQX1NDQ181XzF4MSwKKwlDRFNfUDJQX0dPX1NBUF9TQ0NfNV8yeDIsCisJQ0RTX1AyUF9HT19TQVBfTUNDXzVfMXgxLAorCUNEU19QMlBfR09fU0FQX01DQ181XzJ4MiwKKwlDRFNfUDJQX0dPX1NBUF9NQ0NfMjRfNV8xeDEsCisJQ0RTX1AyUF9HT19TQVBfTUNDXzI0XzVfMngyLAorCUNEU19QMlBfR09fU0FQX0RCU18xeDEsCisKKwlDRFNfTUFYX1RXT19DT05ORUNUSU9OX01PREUKK307CisKKy8qKgorICogZW51bSBjZHNfY29uY19uZXh0X2FjdGlvbiAtIGFjdGlvbnMgdG8gYmUgdGFrZW4gb24gb2xkCisgKiBjb25uZWN0aW9ucy4KKyAqCisgKiBAQ0RTX05PUDogTm8gYWN0aW9uCisgKiBAQ0RTX0RCUzogc3dpdGNoIHRvIERCUyBtb2RlCisgKiBAQ0RTX0RCU19ET1dOR1JBREU6IHN3aXRjaCB0byBEQlMgbW9kZSAmIGRvd25ncmFkZSB0byAxeDEKKyAqIEBDRFNfTUNDOiBzd2l0Y2ggdG8gTUNDL1NDQyBtb2RlCisgKiBAQ0RTX01DQ19VUEdSQURFOiBzd2l0Y2ggdG8gTUNDL1NDQyBtb2RlICYgdXBncmFkZSB0byAyeDIKKyAqIEBDRFNfTUFYX0NPTkNfUFJJT1JJVFlfTU9ERTogTWF4IHBsYWNlIGhvbGRlcgorICoKKyAqIFRoZXNlIGFyZSBnZW5lcmljIElEcyB0aGF0IGlkZW50aWZ5IHRoZSB2YXJpb3VzIHJvbGVzCisgKiBpbiB0aGUgc29mdHdhcmUgc3lzdGVtCisgKi8KK2VudW0gY2RzX2NvbmNfbmV4dF9hY3Rpb24geworCUNEU19OT1AgPSAwLAorCUNEU19EQlMsCisJQ0RTX0RCU19ET1dOR1JBREUsCisJQ0RTX01DQywKKwlDRFNfTUNDX1VQR1JBREUsCisJQ0RTX01BWF9DT05DX05FWFRfQUNUSU9OCit9OworCisvKioKKyAqIGVudW0gY2RzX2JhbmQgLSB3aWZpIGJhbmQuCisgKgorICogQENEU19CQU5EXzI0OiAyLjQgR2h6IGJhbmQKKyAqIEBDRFNfQkFORF81OiA1IEdoeiBiYW5kCisgKiBAQ0RTX01BWF9CQU5EOiBNYXggcGxhY2UgaG9sZGVyCisgKgorICogVGhlc2UgYXJlIGdlbmVyaWMgSURzIHRoYXQgaWRlbnRpZnkgdGhlIHZhcmlvdXMgcm9sZXMKKyAqIGluIHRoZSBzb2Z0d2FyZSBzeXN0ZW0KKyAqLworZW51bSBjZHNfYmFuZCB7CisJQ0RTX0JBTkRfMjQgPSAwLAorCUNEU19CQU5EXzUsCisJQ0RTX01BWF9CQU5ECit9OworCisvKioKKyAqIHN0cnVjdCBjZHNfY29uY19jb25uZWN0aW9uX2luZm8gLSBpbmZvcm1hdGlvbiBvZiBhbGwgZXhpc3RpbmcKKyAqIGNvbm5lY3Rpb25zIGluIHRoZSB3bGFuIHN5c3RlbQorICoKKyAqIEBtb2RlOiBjb25uZWN0aW9uIHR5cGUKKyAqIEBjaGFuOiBjaGFubmVsIG9mIHRoZSBjb25uZWN0aW9uCisgKiBAbWFjOiBUaGUgSFcgbWFjIGl0IGlzIHJ1bm5pbmcKKyAqIEB0eF9zcGF0aWFsX3N0cmVhbTogVHggc3BhdGlhbCBzdHJlYW0gdXNlZCBieSB0aGUgY29ubmVjdGlvbgorICogQHJ4X3NwYXRpYWxfc3RyZWFtOiBUeCBzcGF0aWFsIHN0cmVhbSB1c2VkIGJ5IHRoZSBjb25uZWN0aW9uCisgKiBAb3JpZ2luYWxfbnNzOiBuc3MgbmVnb3RpYXRlZCBhdCBjb25uZWN0aW9uIHRpbWUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkIG9mIHRoZSBjb25uZWN0aW9uCisgKiBAaW5fdXNlOiBpZiB0aGUgdGFibGUgZW50cnkgaXMgYWN0aXZlCisgKi8KK3N0cnVjdCBjZHNfY29uY19jb25uZWN0aW9uX2luZm8geworCWVudW0gY2RzX2Nvbl9tb2RlIG1vZGU7CisJdWludDhfdCAgICAgICBjaGFuOworCXVpbnQ4X3QgICAgICAgbWFjOworCWVudW0gY2RzX2NoYWluX21vZGUgY2hhaW5fbWFzazsKKwl1aW50OF90ICAgICAgIHR4X3NwYXRpYWxfc3RyZWFtOworCXVpbnQ4X3QgICAgICAgcnhfc3BhdGlhbF9zdHJlYW07CisJdWludDMyX3QgICAgICBvcmlnaW5hbF9uc3M7CisJdWludDMyX3QgICAgICB2ZGV2X2lkOworCWJvb2wgICAgICAgICAgaW5fdXNlOworfTsKKworYm9vbCBjZHNfaXNfY29ubmVjdGlvbl9pbl9wcm9ncmVzcyhoZGRfY29udGV4dF90ICpoZGRfY3R4KTsKK3ZvaWQgY2RzX2R1bXBfY29uY3VycmVuY3lfaW5mbyhoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK3ZvaWQgY2RzX3NldF9jb25jdXJyZW5jeV9tb2RlKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIHRDREZfQ09OX01PREUgbW9kZSk7Cit2b2lkIGNkc19jbGVhcl9jb25jdXJyZW5jeV9tb2RlKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJICAgICB0Q0RGX0NPTl9NT0RFIG1vZGUpOwordWludDMyX3QgY2RzX2dldF9jb25uZWN0aW9uX2NvdW50KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworLyoqCisgKiBjZHNfaXNfc3RhX2Nvbm5lY3Rpb25fcGVuZGluZygpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIHN0YSBjb25uZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcGVuZGluZyBvciBub3QuCisgKiBAaGRkX2N0eDogcG9pbnRlciB0byBoZGQgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHN0YXR1cyBvZiBmbGFnIGlzX3N0YV9jb25uZWN0aW9uX3BlbmRpbmcKKyAqCisgKiBSZXR1cm46IHRydWUgb3IgZmFsc2UKKyAqLworc3RhdGljIGlubGluZSBib29sCitjZHNfaXNfc3RhX2Nvbm5lY3Rpb25fcGVuZGluZyhoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCWJvb2wgc3RhdHVzOworCXNwaW5fbG9jaygmaGRkX2N0eC0+c3RhX3VwZGF0ZV9pbmZvX2xvY2spOworCXN0YXR1cyA9IGhkZF9jdHgtPmlzX3N0YV9jb25uZWN0aW9uX3BlbmRpbmc7CisJc3Bpbl91bmxvY2soJmhkZF9jdHgtPnN0YV91cGRhdGVfaW5mb19sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNkc19jaGFuZ2Vfc3RhX2Nvbm5fcGVuZGluZ19zdGF0dXMoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBpc19zdGFfY29ubmVjdGlvbl9wZW5kaW5nCisgKiBAaGRkX2N0eDogcG9pbnRlciB0byBoZGQgY29udGV4dAorICogQHZhbHVlOiB2YWx1ZSB0byBzZXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZiBpc19zdGFfY29ubmVjdGlvbl9wZW5kaW5nCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorY2RzX2NoYW5nZV9zdGFfY29ubl9wZW5kaW5nX3N0YXR1cyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQlib29sIHZhbHVlKQoreworCXNwaW5fbG9jaygmaGRkX2N0eC0+c3RhX3VwZGF0ZV9pbmZvX2xvY2spOworCWhkZF9jdHgtPmlzX3N0YV9jb25uZWN0aW9uX3BlbmRpbmcgPSB2YWx1ZTsKKwlzcGluX3VubG9jaygmaGRkX2N0eC0+c3RhX3VwZGF0ZV9pbmZvX2xvY2spOworfQorCisvKioKKyAqIGNkc19pc19zYXBfcmVzdGFydF9yZXF1aXJlZCgpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIHNhcCByZXN0YXJ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHBlbmRpbmcgb3Igbm90LgorICogQGhkZF9jdHg6IHBvaW50ZXIgdG8gaGRkIGNvbnRleHQuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgc3RhdHVzIG9mIGZsYWcgaXNfc2FwX3Jlc3RhcnRfcmVxdWlyZWQuCisgKgorICogUmV0dXJuOiB0cnVlIG9yIGZhbHNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAorY2RzX2lzX3NhcF9yZXN0YXJ0X3JlcXVpcmVkKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJYm9vbCBzdGF0dXM7CisJc3Bpbl9sb2NrKCZoZGRfY3R4LT5zYXBfdXBkYXRlX2luZm9fbG9jayk7CisJc3RhdHVzID0gaGRkX2N0eC0+aXNfc2FwX3Jlc3RhcnRfcmVxdWlyZWQ7CisJc3Bpbl91bmxvY2soJmhkZF9jdHgtPnNhcF91cGRhdGVfaW5mb19sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNkc19jaGFuZ2Vfc2FwX3Jlc3RhcnRfcmVxdWlyZWRfc3RhdHVzKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIGlzX3NhcF9yZXN0YXJ0X3JlcXVpcmVkCisgKiBAaGRkX2N0eDogcG9pbnRlciB0byBoZGQgY29udGV4dAorICogQHZhbHVlOiB2YWx1ZSB0byBzZXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZiBpc19zYXBfcmVzdGFydF9yZXF1aXJlZAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2Nkc19jaGFuZ2Vfc2FwX3Jlc3RhcnRfcmVxdWlyZWRfc3RhdHVzKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCWJvb2wgdmFsdWUpCit7CisJc3Bpbl9sb2NrKCZoZGRfY3R4LT5zYXBfdXBkYXRlX2luZm9fbG9jayk7CisJaGRkX2N0eC0+aXNfc2FwX3Jlc3RhcnRfcmVxdWlyZWQgPSB2YWx1ZTsKKwlzcGluX3VubG9jaygmaGRkX2N0eC0+c2FwX3VwZGF0ZV9pbmZvX2xvY2spOworfQorCisvKioKKyAqIGNkc19zZXRfY29ubmVjdGlvbl9pbl9wcm9ncmVzcygpIC0gdG8gc2V0IHRoZSBjb25uZWN0aW9uIGluIHByb2dyZXNzIGZsYWcKKyAqIEBoZGRfY3R4OiBwb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKiBAdmFsdWU6IHZhbHVlIHRvIHNldAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIHBhc3NlZCB2YWx1ZSB0byBjb25uZWN0aW9uIGluIHByb2dyZXNzIGZsYWcuCisgKiBJZiB2YWx1ZSBpcyBwcmV2aW91c2x5IGJlaW5nIHNldCB0byB0cnVlIHRoZW4gbm8gbmVlZCB0byBzZXQgaXQgYWdhaW4uCisgKgorICogUmV0dXJuOiB0cnVlIGlmIHZhbHVlIGlzIGJlaW5nIHNldCBjb3JyZWN0bHkgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBib29sCitjZHNfc2V0X2Nvbm5lY3Rpb25faW5fcHJvZ3Jlc3MoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJYm9vbCB2YWx1ZSkKK3sKKwlib29sIHN0YXR1cyA9IHRydWU7CisJc3Bpbl9sb2NrKCZoZGRfY3R4LT5jb25uZWN0aW9uX3N0YXR1c19sb2NrKTsKKwkvKgorCSAqIGlmIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSBwcmV2aW91c2x5IGFuZCBpZiBzb21lb25lIGlzCisJICogdHJ5aW5nIHRvIG1ha2UgaXQgdHJ1ZSBhZ2FpbiB0aGVuIGl0IGNvdWxkIGJlIHNvbWUgcmFjZQorCSAqIGNvbmRpdGlvbiBiZWluZyB0cmlnZ2VyZWQuIEF2b2lkIHRoaXMgc2l0dWF0aW9uIGJ5IHJldHVybmluZworCSAqIGZhbHNlCisJICovCisJaWYgKGhkZF9jdHgtPmNvbm5lY3Rpb25faW5fcHJvZ3Jlc3MgJiYgdmFsdWUpCisJCXN0YXR1cyA9IGZhbHNlOworCWVsc2UKKwkJaGRkX2N0eC0+Y29ubmVjdGlvbl9pbl9wcm9ncmVzcyA9IHZhbHVlOworCXNwaW5fdW5sb2NrKCZoZGRfY3R4LT5jb25uZWN0aW9uX3N0YXR1c19sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK2ludCBjZHNfY2ZnODAyMTFfZ2V0X2NvbmN1cnJlbmN5X21hdHJpeChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCWNvbnN0IHZvaWQgKmRhdGEsCisJCQlpbnQgZGF0YV9sZW4pOwordWludDMyX3QgY2RzX2dldF9jb25jdXJyZW5jeV9tb2RlKHZvaWQpOworQ0RGX1NUQVRVUyBjZHNfY2hlY2tfYW5kX3Jlc3RhcnRfc2FwKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCWVDc3JSb2FtUmVzdWx0IHJvYW1fcmVzdWx0LAorCQloZGRfc3RhdGlvbl9jdHhfdCAqaGRkX3N0YV9jdHgpOwordm9pZCBjZHNfaGFuZGxlX2NvbmNfcnVsZTEoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJdENzclJvYW1Qcm9maWxlICpyb2FtX3Byb2ZpbGUpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAorYm9vbCBjZHNfaGFuZGxlX2NvbmNfcnVsZTIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJdENzclJvYW1Qcm9maWxlICpyb2FtX3Byb2ZpbGUsCisJCXVpbnQzMl90ICpyb2FtX2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGJvb2wgY2RzX2hhbmRsZV9jb25jX3J1bGUyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCXRDc3JSb2FtUHJvZmlsZSAqcm9hbV9wcm9maWxlLAorCQl1aW50MzJfdCAqcm9hbV9pZCkKK3sKKwkJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NIX0FWT0lEICovCitib29sIGNkc19oYW5kbGVfY29uY19tdWx0aXBvcnQodWludDhfdCBzZXNzaW9uX2lkLCB1aW50OF90IGNoYW5uZWwpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MKK3ZvaWQgY2RzX2ZvcmNlX3NhcF9vbl9zY2MoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgZUNzclJvYW1SZXN1bHQgcm9hbV9yZXN1bHQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZHNfZm9yY2Vfc2FwX29uX3NjYyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQllQ3NyUm9hbVJlc3VsdCByb2FtX3Jlc3VsdCkKK3sKKworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9GT1JDRV9TQVBfU0NDICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKK3ZvaWQgY2RzX2NoZWNrX2NvbmN1cnJlbnRfaW50Zl9hbmRfcmVzdGFydF9zYXAoCisJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCWhkZF9zdGF0aW9uX2N0eF90ICpoZGRfc3RhX2N0eCwKKwkJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNkc19jaGVja19jb25jdXJyZW50X2ludGZfYW5kX3Jlc3RhcnRfc2FwKAorCQloZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQloZGRfc3RhdGlvbl9jdHhfdCAqaGRkX3N0YV9jdHgsCisJCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0ggKi8KK3VpbnQ4X3QgY2RzX2lzX21jY19pbl8yNEcoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCk7CitpbnQzMl90IGNkc19zZXRfbWFzKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIHVpbnQ4X3QgbWFzX3ZhbHVlKTsKK2ludCBjZHNfc2V0X21jY19wMnBfcXVvdGEoaGRkX2FkYXB0ZXJfdCAqaG9zdGFwZF9hZGFwdGVyLAorCQl1aW50MzJfdCBzZXRfdmFsdWUpOworQ0RGX1NUQVRVUyBjZHNfY2hhbmdlX21jY19nb19iZWFjb25faW50ZXJ2YWwoaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyKTsKK2ludCBjZHNfZ29fc2V0X21jY19wMnBfcXVvdGEoaGRkX2FkYXB0ZXJfdCAqaG9zdGFwZF9hZGFwdGVyLAorCQl1aW50MzJfdCBzZXRfdmFsdWUpOwordm9pZCBjZHNfc2V0X21jY19sYXRlbmN5KGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBzZXRfdmFsdWUpOworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENIKSB8fCBcCisJCWRlZmluZWQoRkVBVFVSRV9XTEFOX1NUQV9BUF9NT0RFX0RGU19ESVNBQkxFKQordm9pZCBjZHNfcmVzdGFydF9zYXAoaGRkX2FkYXB0ZXJfdCAqYXBfYWRhcHRlcik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNkc19yZXN0YXJ0X3NhcChoZGRfYWRhcHRlcl90ICphcF9hZGFwdGVyKQoreworCit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENIIHx8CisJKiBGRUFUVVJFX1dMQU5fU1RBX0FQX01PREVfREZTX0RJU0FCTEUKKwkqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NUQV9BUF9NT0RFX0RGU19ESVNBQkxFCit2b2lkIGNkc19jaGVja19hbmRfcmVzdGFydF9zYXBfd2l0aF9ub25fZGZzX2FjcyhoZGRfY29udGV4dF90ICpoZGRfY3R4KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY2RzX2NoZWNrX2FuZF9yZXN0YXJ0X3NhcF93aXRoX25vbl9kZnNfYWNzKAorCQkJCQkJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU1RBX0FQX01PREVfREZTX0RJU0FCTEUgKi8KK3ZvaWQgY2RzX2luY3JfYWN0aXZlX3Nlc3Npb24oaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdENERl9DT05fTU9ERSBtb2RlLAorCQkJCXVpbnQ4X3Qgc2Vzc2lvbklkKTsKK3ZvaWQgY2RzX2RlY3JfYWN0aXZlX3Nlc3Npb24oaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdENERl9DT05fTU9ERSBtb2RlLAorCQkJCXVpbnQ4X3Qgc2Vzc2lvbklkKTsKK3ZvaWQgY2RzX2RlY3Jfc2Vzc2lvbl9zZXRfcGNsKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCXRDREZfQ09OX01PREUgbW9kZSwKKwkJdWludDhfdCBzZXNzaW9uX2lkKTsKK0NERl9TVEFUVVMgY2RzX2luaXRfcG9saWN5X21ncihoZGRfY29udGV4dF90ICpoZGRfY3R4KTsKK0NERl9TVEFUVVMgY2RzX2dldF9wY2woaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgZW51bSBjZHNfY29uX21vZGUgbW9kZSwKKwkJCQl1aW50OF90ICpwY2xfQ2hhbm5lbHMsIHVpbnQzMl90ICpsZW4pOworYm9vbCBjZHNfYWxsb3dfY29uY3VycmVuY3koaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgZW51bSBjZHNfY29uX21vZGUgbW9kZSwKKwkJCQl1aW50OF90IGNoYW5uZWwsIGVudW0gaHdfbW9kZV9iYW5kd2lkdGggYncpOworZW51bSBjZHNfY29uY19wcmlvcml0eV9tb2RlIGNkc19nZXRfZmlyc3RfY29ubmVjdGlvbl9wY2xfdGFibGVfaW5kZXgoCisJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCk7CitlbnVtIGNkc19vbmVfY29ubmVjdGlvbl9tb2RlIGNkc19nZXRfc2Vjb25kX2Nvbm5lY3Rpb25fcGNsX3RhYmxlX2luZGV4KAorCQkJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworZW51bSBjZHNfdHdvX2Nvbm5lY3Rpb25fbW9kZSBjZHNfZ2V0X3RoaXJkX2Nvbm5lY3Rpb25fcGNsX3RhYmxlX2luZGV4KAorCQkJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworQ0RGX1NUQVRVUyBjZHNfbW9kZV9zd2l0Y2hfZGJzX3RvX21jYyhoZGRfY29udGV4dF90ICpoZGRfY3R4KTsKK0NERl9TVEFUVVMgY2RzX21vZGVfc3dpdGNoX21jY190b19kYnMoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCk7CitDREZfU1RBVFVTIGNkc19pbmNyX2Nvbm5lY3Rpb25fY291bnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJICB1aW50MzJfdCB2ZGV2X2lkKTsKK0NERl9TVEFUVVMgY2RzX3VwZGF0ZV9jb25uZWN0aW9uX2luZm8oaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJICAgdWludDMyX3QgdmRldl9pZCk7CitDREZfU1RBVFVTIGNkc19kZWNyX2Nvbm5lY3Rpb25fY291bnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJICB1aW50MzJfdCB2ZGV2X2lkKTsKK0NERl9TVEFUVVMgY2RzX2N1cnJlbnRfY29ubmVjdGlvbnNfdXBkYXRlKAorCQkJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIHVpbnQ4X3QgY2hhbm5lbCk7CisjaWZkZWYgTVBDX1VUX0ZSQU1FV09SSworQ0RGX1NUQVRVUyBjZHNfaW5jcl9jb25uZWN0aW9uX2NvdW50X3V0ZncoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJdWludDMyX3QgdmRldl9pZCwgdWludDMyX3QgdHhfc3RyZWFtcywgdWludDMyX3Qgcnhfc3RyZWFtcywKKwkJdWludDMyX3QgY2hhaW5fbWFzaywgdWludDMyX3QgdHlwZSwgdWludDMyX3Qgc3ViX3R5cGUsCisJCXVpbnQzMl90IGNoYW5uZWxpZCwgdWludDMyX3QgbWFjX2lkKTsKK0NERl9TVEFUVVMgY2RzX3VwZGF0ZV9jb25uZWN0aW9uX2luZm9fdXRmdyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQl1aW50MzJfdCB2ZGV2X2lkLCB1aW50MzJfdCB0eF9zdHJlYW1zLCB1aW50MzJfdCByeF9zdHJlYW1zLAorCQl1aW50MzJfdCBjaGFpbl9tYXNrLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzdWJfdHlwZSwKKwkJdWludDMyX3QgY2hhbm5lbGlkLCB1aW50MzJfdCBtYWNfaWQpOworQ0RGX1NUQVRVUyBjZHNfZGVjcl9jb25uZWN0aW9uX2NvdW50X3V0ZncoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJdWludDMyX3QgZGVsX2FsbCwgdWludDMyX3QgdmRldl9pZCk7CitzdHJ1Y3QgY2RzX2NvbmNfY29ubmVjdGlvbl9pbmZvICpjZHNfZ2V0X2Nvbm5faW5mbyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCXVpbnQzMl90ICpsZW4pOworZW51bSBjZHNfcGNsX3R5cGUgZ2V0X3BjbF9mcm9tX2ZpcnN0X2Nvbm5fdGFibGUoCisJCWVudW0gY2RzX2Nvbl9tb2RlIHR5cGUsCisJCWVudW0gY2RzX2NvbmNfcHJpb3JpdHlfbW9kZSBzeXNfcHJlZik7CitlbnVtIGNkc19wY2xfdHlwZSBnZXRfcGNsX2Zyb21fc2Vjb25kX2Nvbm5fdGFibGUoCisJZW51bSBjZHNfb25lX2Nvbm5lY3Rpb25fbW9kZSBpZHgsIGVudW0gY2RzX2Nvbl9tb2RlIHR5cGUsCisJZW51bSBjZHNfY29uY19wcmlvcml0eV9tb2RlIHN5c19wcmVmLCB1aW50OF90IGRic19jYXBhYmxlKTsKK2VudW0gY2RzX3BjbF90eXBlIGdldF9wY2xfZnJvbV90aGlyZF9jb25uX3RhYmxlKAorCWVudW0gY2RzX3R3b19jb25uZWN0aW9uX21vZGUgaWR4LCBlbnVtIGNkc19jb25fbW9kZSB0eXBlLAorCWVudW0gY2RzX2NvbmNfcHJpb3JpdHlfbW9kZSBzeXNfcHJlZiwgdWludDhfdCBkYnNfY2FwYWJsZSk7CisjZWxzZQorc3RhdGljIGlubGluZSBDREZfU1RBVFVTIGNkc19pbmNyX2Nvbm5lY3Rpb25fY291bnRfdXRmdygKKwkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgdWludDMyX3QgdmRldl9pZCwKKwkJdWludDMyX3QgdHhfc3RyZWFtcywgdWludDMyX3Qgcnhfc3RyZWFtcywKKwkJdWludDMyX3QgY2hhaW5fbWFzaywgdWludDMyX3QgdHlwZSwgdWludDMyX3Qgc3ViX3R5cGUsCisJCXVpbnQzMl90IGNoYW5uZWxpZCwgdWludDMyX3QgbWFjX2lkKQoreworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMgY2RzX3VwZGF0ZV9jb25uZWN0aW9uX2luZm9fdXRmdygKKwkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgdWludDMyX3QgdmRldl9pZCwKKwkJdWludDMyX3QgdHhfc3RyZWFtcywgdWludDMyX3Qgcnhfc3RyZWFtcywKKwkJdWludDMyX3QgY2hhaW5fbWFzaywgdWludDMyX3QgdHlwZSwgdWludDMyX3Qgc3ViX3R5cGUsCisJCXVpbnQzMl90IGNoYW5uZWxpZCwgdWludDMyX3QgbWFjX2lkKQoreworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMgY2RzX2RlY3JfY29ubmVjdGlvbl9jb3VudF91dGZ3KAorCQloZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQl1aW50MzJfdCBkZWxfYWxsLCB1aW50MzJfdCB2ZGV2X2lkKQoreworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBjZHNfY29uY19jb25uZWN0aW9uX2luZm8gKmNkc19nZXRfY29ubl9pbmZvKAorCQloZGRfY29udGV4dF90ICpoZGRfY3R4LCB1aW50MzJfdCAqbGVuKQoreworCXJldHVybiBOVUxMOworfQorI2VuZGlmCitlbnVtIGNkc19jb25fbW9kZSBjZHNfY29udmVydF9kZXZpY2VfbW9kZV90b19oZGRfdHlwZSgKKwkJCQlkZXZpY2VfbW9kZV90IGRldmljZV9tb2RlKTsKK3VpbnQzMl90IGNkc19nZXRfY29ubmVjdGlvbl9jb3VudChoZGRfY29udGV4dF90ICpoZGRfY3R4KTsKK0NERl9TVEFUVVMgY2RzX3NvY19zZXRfaHdfbW9kZShoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQllbnVtIGh3X21vZGVfc3NfY29uZmlnIG1hYzBfc3MsCisJCWVudW0gaHdfbW9kZV9iYW5kd2lkdGggbWFjMF9idywKKwkJZW51bSBod19tb2RlX3NzX2NvbmZpZyBtYWMxX3NzLAorCQllbnVtIGh3X21vZGVfYmFuZHdpZHRoIG1hYzFfYncsCisJCWVudW0gaHdfbW9kZV9kYnNfY2FwYWIgZGJzLAorCQllbnVtIGh3X21vZGVfYWdpbGVfZGZzX2NhcGFiIGRmcyk7CitlbnVtIGNkc19jb25jX25leHRfYWN0aW9uIGNkc19uZWVkX29wcG9ydHVuaXN0aWNfdXBncmFkZSgKKwkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCk7CitDREZfU1RBVFVTIGNkc19uZXh0X2FjdGlvbnMoCisJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGVudW0gY2RzX2NvbmNfbmV4dF9hY3Rpb24gYWN0aW9uKTsKK3ZvaWQgY2RzX3NldF9kdWFsX21hY19zY2FuX2NvbmZpZyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQl1aW50OF90IGRic192YWwsCisJCXVpbnQ4X3QgZGJzX3BsdXNfYWdpbGVfc2Nhbl92YWwsCisJCXVpbnQ4X3Qgc2luZ2xlX21hY19zY2FuX3dpdGhfZGJzX3ZhbCk7Cit2b2lkIGNkc19zZXRfZHVhbF9tYWNfZndfbW9kZV9jb25maWcoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJdWludDhfdCBkYnMsCisJCXVpbnQ4X3QgZGZzKTsKK3ZvaWQgY2RzX3NvY19zZXRfZHVhbF9tYWNfY2ZnX2NiKGVudW0gc2V0X2h3X21vZGVfc3RhdHVzIHN0YXR1cywKKwkJdWludDMyX3Qgc2Nhbl9jb25maWcsCisJCXVpbnQzMl90IGZ3X21vZGVfY29uZmlnKTsKK2Jvb2wgY2RzX21hcF9jb25jdXJyZW5jeV9tb2RlKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCXRDREZfQ09OX01PREUgKm9sZF9tb2RlLCBlbnVtIGNkc19jb25fbW9kZSAqbmV3X21vZGUpOworQ0RGX1NUQVRVUyBjZHNfZ2V0X2NoYW5uZWxfZnJvbV9zY2FuX3Jlc3VsdChoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQl0Q3NyUm9hbVByb2ZpbGUgKnJvYW1fcHJvZmlsZSwgdWludDhfdCAqY2hhbm5lbCk7CisjZW5kaWYgLyogX19DRFNfQ09OQ1VSUkVOQ1lfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZHMvaW5jL2Nkc19jcnlwdG8uaCBiL2NvcmUvY2RzL2luYy9jZHNfY3J5cHRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmM2I3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RzL2luYy9jZHNfY3J5cHRvLmgKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisjaWYgIWRlZmluZWQoX19DRFNfQ1JZUFRPX0gpCisjZGVmaW5lIF9fQ0RTX0NSWVBUT19ICisKKy8qKgorICogRE9DOiAgY2RzX2NyeXB0by5oCisgKgorICogQ3J5cHRvIEFQSXMKKyAqCisgKi8KKworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGNkZl9zdGF0dXMuaD4KKyNpbmNsdWRlIDxjZGZfbWVtb3J5Lmg+CisjaW5jbHVkZSA8Y2RmX2xpc3QuaD4KKyNpbmNsdWRlIDxjZHNfZ2V0X2Jpbi5oPgorI2luY2x1ZGUgPGNkZl90cmFjZS5oPgorI2luY2x1ZGUgPGNkZl9ldmVudC5oPgorI2luY2x1ZGUgPGNkZl9sb2NrLmg+CisjaW5jbHVkZSA8Y2RzX3JlZ19zZXJ2aWNlLmg+CisjaW5jbHVkZSA8Y2RzX21xLmg+CisjaW5jbHVkZSA8Y2RzX3BhY2tldC5oPgorI2luY2x1ZGUgPGNkc19zY2hlZC5oPgorI2luY2x1ZGUgPGNkZl90aHJlYWRzLmg+CisjaW5jbHVkZSA8Y2RmX21jX3RpbWVyLmg+CisjaW5jbHVkZSA8Y2RzX3BhY2tfYWxpZ24uaD4KKyNpbmNsdWRlIDxjcnlwdG8vYWVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNpZmRlZiBDT05GSUdfQ05TUworI2luY2x1ZGUgPG5ldC9jbnNzLmg+CisjaW5jbHVkZSA8bGludXgvcWNvbXdsYW5fc2VjaWYuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NOU1MKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19haGFzaCAqY2RzX2NyeXB0b19hbGxvY19haGFzaChjb25zdCBjaGFyICphbGdfbmFtZSwKKwl1MzIgdHlwZSwgdTMyIG1hc2spCit7CisJcmV0dXJuIHdjbnNzX3dsYW5fY3J5cHRvX2FsbG9jX2FoYXNoKGFsZ19uYW1lLCB0eXBlLCBtYXNrKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fYWhhc2ggKmNkc19jcnlwdG9fYWxsb2NfYWhhc2goY29uc3QgY2hhciAqYWxnX25hbWUsCisJdTMyIHR5cGUsIHUzMiBtYXNrKQoreworCXJldHVybiBjcnlwdG9fYWxsb2NfYWhhc2goYWxnX25hbWUsIHR5cGUsIG1hc2spOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ05TUworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqCitjZHNfY3J5cHRvX2FsbG9jX2NpcGhlcihjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKQoreworCXJldHVybiB3Y25zc193bGFuX2NyeXB0b19hbGxvY19jaXBoZXIoYWxnX25hbWUsIHR5cGUsIG1hc2spOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19jaXBoZXIgKgorY2RzX2NyeXB0b19hbGxvY19jaXBoZXIoY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKK3sKKwlyZXR1cm4gY3J5cHRvX2FsbG9jX2NpcGhlcihhbGdfbmFtZSwgdHlwZSwgbWFzayk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DTlNTCitzdGF0aWMgaW5saW5lIHZvaWQgY2RzX2NtYWNfY2FsY19taWMoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwgdTggKm0sCisJCXUxNiBsZW5ndGgsIHU4ICptYWMpCit7CisJd2Nuc3Nfd2xhbl9jbWFjX2NhbGNfbWljKHRmbSwgbSwgbGVuZ3RoLCBtYWMpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ05TUworc3RhdGljIGlubGluZSB2b2lkIGNkc19jcnlwdG9fZnJlZV9jaXBoZXIoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKK3sKKwl3Y25zc193bGFuX2NyeXB0b19mcmVlX2NpcGhlcih0Zm0pOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZHNfY3J5cHRvX2ZyZWVfY2lwaGVyKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0pCit7CisJY3J5cHRvX2ZyZWVfY2lwaGVyKHRmbSk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DTlNTCitzdGF0aWMgaW5saW5lIHZvaWQgY2RzX2NyeXB0b19mcmVlX2FoYXNoKHN0cnVjdCBjcnlwdG9fYWhhc2ggKnRmbSkKK3sKKwl3Y25zc193bGFuX2NyeXB0b19mcmVlX2FoYXNoKHRmbSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNkc19jcnlwdG9fZnJlZV9haGFzaChzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0pCit7CisJY3J5cHRvX2ZyZWVfYWhhc2godGZtKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NOU1MKK3N0YXRpYyBpbmxpbmUgaW50IGNkc19jcnlwdG9fYWhhc2hfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWhhc2ggKnRmbSwKKwljb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXJldHVybiB3Y25zc193bGFuX2NyeXB0b19haGFzaF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgY2RzX2NyeXB0b19haGFzaF9zZXRrZXkoc3RydWN0IGNyeXB0b19haGFzaCAqdGZtLAorCWNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJcmV0dXJuIGNyeXB0b19haGFzaF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DTlNTCitzdGF0aWMgaW5saW5lIGludCBjZHNfY3J5cHRvX2FoYXNoX2RpZ2VzdChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXJldHVybiB3Y25zc193bGFuX2NyeXB0b19haGFzaF9kaWdlc3QocmVxKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjZHNfY3J5cHRvX2FoYXNoX2RpZ2VzdChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXJldHVybiBjcnlwdG9fYWhhc2hfZGlnZXN0KHJlcSk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DTlNTCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqCitjZHNfY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIoY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKK3sKKwlyZXR1cm4gd2Nuc3Nfd2xhbl9jcnlwdG9fYWxsb2NfYWJsa2NpcGhlcihhbGdfbmFtZSwgdHlwZSwgbWFzayk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKgorY2RzX2NyeXB0b19hbGxvY19hYmxrY2lwaGVyKGNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCit7CisJcmV0dXJuIGNyeXB0b19hbGxvY19hYmxrY2lwaGVyKGFsZ19uYW1lLCB0eXBlLCBtYXNrKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NOU1MKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZHNfYWJsa2NpcGhlcl9yZXF1ZXN0X2ZyZWUoc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxKQoreworCXdjbnNzX3dsYW5fYWJsa2NpcGhlcl9yZXF1ZXN0X2ZyZWUocmVxKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY2RzX2FibGtjaXBoZXJfcmVxdWVzdF9mcmVlKHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcSkKK3sKKwlhYmxrY2lwaGVyX3JlcXVlc3RfZnJlZShyZXEpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ05TUworc3RhdGljIGlubGluZSB2b2lkIGNkc19jcnlwdG9fZnJlZV9hYmxrY2lwaGVyKHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtKQoreworCXdjbnNzX3dsYW5fY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcih0Zm0pOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZHNfY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcihzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbSkKK3sKKwljcnlwdG9fZnJlZV9hYmxrY2lwaGVyKHRmbSk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIGlmICFkZWZpbmVkIF9fQ0RTX0NSWVBUT19IICovCmRpZmYgLS1naXQgYS9jb3JlL2Nkcy9pbmMvY2RzX2dldF9iaW4uaCBiL2NvcmUvY2RzL2luYy9jZHNfZ2V0X2Jpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjFlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9pbmMvY2RzX2dldF9iaW4uaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKCBfX0NEU19HRVRCSU5fSCApCisjZGVmaW5lIF9fQ0RTX0dFVEJJTl9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIGNkc19nZXRCaW4uaAorCisgICBcYnJpZWYgQ29ubmVjdGl2aXR5IGRyaXZlciBzZXJ2aWNlcyAoQ0RTKSBiaW5hcnkgQVBJcworCisgICBCaW5hcnkgcmV0cmlldmFsIGRlZmluaXRpb25zIGFuZCBBUElzLgorCisgICBUaGVzZSBBUElzIGFsbG93IGNvbXBvbmVudHMgdG8gcmV0cmlldmUgYmluYXJ5IGNvbnRlbnRzIChmaXJtd2FyZSwKKyAgIGNvbmZpZ3VyYXRpb24gZGF0YSwgZXRjLikgZnJvbSBhIHN0b3JhZ2UgbWVkaXVtIG9uIHRoZSBwbGF0Zm9ybS4KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBGaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpbmNsdWRlIDxjZGZfc3RhdHVzLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUeXBlIGRlY2xhcmF0aW9ucworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIGNkc19nZXRfY29ucGFyYW0oKS0gZnVuY3Rpb24gdG8gcmVhZCB0aGUgaW5zbW9kIHBhcmFtZXRlcnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RDREZfQ09OX01PREUgY2RzX2dldF9jb25wYXJhbSh2b2lkKTsKK2Jvb2wgY2RzX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKHZvaWQpOworYm9vbCBjZHNfbWF4X2NvbmN1cnJlbnRfY29ubmVjdGlvbnNfcmVhY2hlZCh2b2lkKTsKK3ZvaWQgY2RzX2NsZWFyX2NvbmN1cnJlbnRfc2Vzc2lvbl9jb3VudCh2b2lkKTsKK2Jvb2wgY2RzX2lzX211bHRpcGxlX2FjdGl2ZV9zdGFfc2Vzc2lvbnModm9pZCk7Citib29sIGNkc19pc19zdGFfYWN0aXZlX2Nvbm5lY3Rpb25fZXhpc3RzKHZvaWQpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorYm9vbCBjZHNfY29uY3VycmVudF9iZWFjb25pbmdfc2Vzc2lvbnNfcnVubmluZyh2b2lkKTsKKyNlbmRpZgorI2VuZGlmIC8qICFkZWZpbmVkIF9fQ0RTX0dFVEJJTl9IICovCmRpZmYgLS1naXQgYS9jb3JlL2Nkcy9pbmMvY2RzX2llZWU4MDIxMV9jb21tb24uaCBiL2NvcmUvY2RzL2luYy9jZHNfaWVlZTgwMjExX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOGZhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9pbmMvY2RzX2llZWU4MDIxMV9jb21tb24uaApAQCAtMCwwICsxLDIxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBFWFRFUk5BTF9VU0VfT05MWQorI2luY2x1ZGUgIm9zZGVwLmgiCisjZW5kaWYgLyogRVhURVJOQUxfVVNFX09OTFkgKi8KKyNpbmNsdWRlICJjZHNfaWVlZTgwMjExX2NvbW1vbl9pLmgiCisKKyNpZm5kZWYgQ0RTX0NPTU1PTl9JRUVFODAyMTFfSF8KKyNkZWZpbmUgQ0RTX0NPTU1PTl9JRUVFODAyMTFfSF8KKworLyoKKyAqIDgwMi4xMSBwcm90b2NvbCBkZWZpbml0aW9ucy4KKyAqLworCisvKiBpcyA4MDIuMTEgYWRkcmVzcyBtdWx0aWNhc3QvYnJvYWRjYXN0PyAqLworI2RlZmluZSBJRUVFODAyMTFfSVNfTVVMVElDQVNUKF9hKSAgKCooX2EpICYgMHgwMSkKKworI2RlZmluZSBJRUVFODAyMTFfSVNfSVBWNF9NVUxUSUNBU1QoX2EpICAoKihfYSkgPT0gMHgwMSkKKworI2RlZmluZSBJRUVFODAyMTFfSVNfSVBWNl9NVUxUSUNBU1QoX2EpCQlcCisJKChfYSlbMF0gPT0gMHgzMyAmJgkJCSAgICBcCisJIChfYSlbMV0gPT0gMHgzMykKKworI2RlZmluZSBJRUVFODAyMTFfSVNfQlJPQURDQVNUKF9hKQkJXAorCSgoX2EpWzBdID09IDB4ZmYgJiYJCQkgICAgXAorCSAoX2EpWzFdID09IDB4ZmYgJiYJCQkgICAgXAorCSAoX2EpWzJdID09IDB4ZmYgJiYJCQkgICAgXAorCSAoX2EpWzNdID09IDB4ZmYgJiYJCQkgICAgXAorCSAoX2EpWzRdID09IDB4ZmYgJiYJCQkgICAgXAorCSAoX2EpWzVdID09IDB4ZmYpCisKKy8qIElFRUUgODAyLjExIFBMQ1AgaGVhZGVyICovCitzdHJ1Y3QgaWVlZTgwMjExX3BsY3BfaGRyIHsKKwl1aW50MTZfdCBpX3NmZDsKKwl1aW50OF90IGlfc2lnbmFsOworCXVpbnQ4X3QgaV9zZXJ2aWNlOworCXVpbnQxNl90IGlfbGVuZ3RoOworCXVpbnQxNl90IGlfY3JjOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBJRUVFODAyMTFfUExDUF9TRkQgICAgICAweEYzQTAKKyNkZWZpbmUgSUVFRTgwMjExX1BMQ1BfU0VSVklDRSAgMHgwMAorCisvKgorICogZ2VuZXJpYyBkZWZpbml0aW9ucyBmb3IgSUVFRSA4MDIuMTEgZnJhbWVzCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfZnJhbWUgeworCXVpbnQ4X3QgaV9mY1syXTsKKwl1aW50OF90IGlfZHVyWzJdOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgaV9hZGRyMVtJRUVFODAyMTFfQUREUl9MRU5dOworCQkJdWludDhfdCBpX2FkZHIyW0lFRUU4MDIxMV9BRERSX0xFTl07CisJCQl1aW50OF90IGlfYWRkcjNbSUVFRTgwMjExX0FERFJfTEVOXTsKKwkJfTsKKwkJdWludDhfdCBpX2FkZHJfYWxsWzMgKiBJRUVFODAyMTFfQUREUl9MRU5dOworCX07CisJdWludDhfdCBpX3NlcVsyXTsKKwkvKiBwb3NzaWJseSBmb2xsb3dlZCBieSBhZGRyNFtJRUVFODAyMTFfQUREUl9MRU5dOyAqLworCS8qIHNlZSBiZWxvdyAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGllZWU4MDIxMV9xb3NmcmFtZSB7CisJdWludDhfdCBpX2ZjWzJdOworCXVpbnQ4X3QgaV9kdXJbMl07CisJdWludDhfdCBpX2FkZHIxW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBpX2FkZHIyW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBpX2FkZHIzW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBpX3NlcVsyXTsKKwl1aW50OF90IGlfcW9zWzJdOworCS8qIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGFkZHI0W0lFRUU4MDIxMV9BRERSX0xFTl07ICovCisJLyogc2VlIGJlbG93ICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWVlZTgwMjExX3Fvc2NudGwgeworCXVpbnQ4X3QgaV9xb3NbMl07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX2FkZHI0IHsKKwl1aW50OF90IGlfZmNbMl07CisJdWludDhfdCBpX2R1clsyXTsKKwl1aW50OF90IGlfYWRkcjFbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfYWRkcjJbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfYWRkcjNbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfc2VxWzJdOworCXVpbnQ4X3QgaV9hZGRyNFtJRUVFODAyMTFfQUREUl9MRU5dOworfSBfX3BhY2tlZDsKKworc3RydWN0IGllZWU4MDIxMV9xb3NmcmFtZV9hZGRyNCB7CisJdWludDhfdCBpX2ZjWzJdOworCXVpbnQ4X3QgaV9kdXJbMl07CisJdWludDhfdCBpX2FkZHIxW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBpX2FkZHIyW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBpX2FkZHIzW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBpX3NlcVsyXTsKKwl1aW50OF90IGlfYWRkcjRbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfcW9zWzJdOworfSBfX3BhY2tlZDsKKworLyogSFRDIGZyYW1lIGZvciBUeEJGKi8KKy8qIGZvciBUeEJGIFJDICovCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX21pbl9vbmUgeworCXVpbnQ4X3QgaV9mY1syXTsKKwl1aW50OF90IGlfZHVyWzJdOworCXVpbnQ4X3QgaV9hZGRyMVtJRUVFODAyMTFfQUREUl9MRU5dOworCit9IF9fcGFja2VkOyAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBUeEJGIFJDICovCisKK3N0cnVjdCBpZWVlODAyMTFfcW9zZnJhbWVfaHRjIHsKKwl1aW50OF90IGlfZmNbMl07CisJdWludDhfdCBpX2R1clsyXTsKKwl1aW50OF90IGlfYWRkcjFbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfYWRkcjJbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfYWRkcjNbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfc2VxWzJdOworCXVpbnQ4X3QgaV9xb3NbMl07CisJdWludDhfdCBpX2h0Y1s0XTsKKwkvKiBwb3NzaWJseSBmb2xsb3dlZCBieSBhZGRyNFtJRUVFODAyMTFfQUREUl9MRU5dOyAqLworCS8qIHNlZSBiZWxvdyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBpZWVlODAyMTFfcW9zZnJhbWVfaHRjX2FkZHI0IHsKKwl1aW50OF90IGlfZmNbMl07CisJdWludDhfdCBpX2R1clsyXTsKKwl1aW50OF90IGlfYWRkcjFbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfYWRkcjJbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfYWRkcjNbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfc2VxWzJdOworCXVpbnQ4X3QgaV9hZGRyNFtJRUVFODAyMTFfQUREUl9MRU5dOworCXVpbnQ4X3QgaV9xb3NbMl07CisJdWludDhfdCBpX2h0Y1s0XTsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgaWVlZTgwMjExX2h0YyB7CisJdWludDhfdCBpX2h0Y1s0XTsKK307CisvKkhUQyBmcmFtZSBmb3IgVHhCRiovCisKK3N0cnVjdCBpZWVlODAyMTFfY3RsZnJhbWVfYWRkcjIgeworCXVpbnQ4X3QgaV9mY1syXTsKKwl1aW50OF90IGlfYWlkb3JkdXJbMl07ICAvKiBBSUQgb3IgZHVyYXRpb24gKi8KKwl1aW50OF90IGlfYWRkcjFbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfYWRkcjJbSUVFRTgwMjExX0FERFJfTEVOXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSUVFRTgwMjExX1dIUSh3aCkgICAgICAgICAgICAgICAoKHN0cnVjdCBpZWVlODAyMTFfcW9zZnJhbWUgKikod2gpKQorI2RlZmluZSBJRUVFODAyMTFfV0g0KHdoKSAgICAgICAgICAgICAgICgoc3RydWN0IGllZWU4MDIxMV9mcmFtZV9hZGRyNCAqKSh3aCkpCisjZGVmaW5lIElFRUU4MDIxMV9XSFE0KHdoKSAgICAgICAgICAgICAgKChzdHJ1Y3QgaWVlZTgwMjExX3Fvc2ZyYW1lX2FkZHI0ICopKHdoKSkKKworI2RlZmluZSBJRUVFODAyMTFfRkMwX1ZFUlNJT05fTUFTSyAgICAgICAgICAweDAzCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVkVSU0lPTl9TSElGVCAgICAgICAgIDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9WRVJTSU9OXzAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyAgICAgICAgICAgICAweDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVFlQRV9TSElGVCAgICAgICAgICAgIDIKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX01HVCAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBICAgICAgICAgICAgIDB4MDgKKworI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSyAgICAgICAgICAweGYwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9TSElGVCAgICAgICAgIDQKKy8qIGZvciBUWVBFX01HVCAqLworI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVNTT0NfUkVRICAgICAweDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9BU1NPQ19SRVNQICAgIDB4MTAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1JFQVNTT0NfUkVRICAgMHgyMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVNQICAweDMwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9QUk9CRV9SRVEgICAgIDB4NDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BST0JFX1JFU1AgICAgMHg1MAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQkVBQ09OICAgICAgICAweDgwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9BVElNICAgICAgICAgIDB4OTAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RJU0FTU09DICAgICAgMHhhMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVVUSCAgICAgICAgICAweGIwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9ERUFVVEggICAgICAgIDB4YzAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FDVElPTiAgICAgICAgMHhkMAorI2RlZmluZSBJRUVFODAyMTFfRkNPX1NVQlRZUEVfQUNUSU9OX05PX0FDSyAweGUwCisvKiBmb3IgVFlQRV9DVEwgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDT19TVUJUWVBFX0NvbnRyb2xfV3JhcHBlciAgIDB4NzAgICAgLyogRm9yIFR4QkYgUkMgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0JBUiAgICAgICAgICAgMHg4MAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUFNfUE9MTCAgICAgICAweGEwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9SVFMgICAgICAgICAgIDB4YjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NUUyAgICAgICAgICAgMHhjMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQUNLICAgICAgICAgICAweGQwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9FTkQgICAgICAgIDB4ZTAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGX0VORF9BQ0sgICAgMHhmMAorLyogZm9yIFRZUEVfREFUQSAoYml0IGNvbWJpbmF0aW9uKSAqLworI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfREFUQSAgICAgICAgICAweDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9BQ0sgICAgICAgIDB4MTAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGX1BPTEwgICAgICAgMHgyMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfQUNQTCAgICAgICAweDMwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEEgICAgICAgIDB4NDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGQUNLICAgICAgICAgMHg1MAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZQT0xMICAgICAgICAweDYwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9BQ0tfQ0ZfQUNLIDB4NzAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUyAgICAgICAgICAgMHg4MAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TX05VTEwgICAgICAweGMwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMV9ESVJfTUFTSyAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBJRUVFODAyMTFfRkMxX0RJUl9OT0RTICAgICAgICAgICAgICAweDAwICAgICAgICAvKiBTVEEtPlNUQSAqLworI2RlZmluZSBJRUVFODAyMTFfRkMxX0RJUl9UT0RTICAgICAgICAgICAgICAweDAxICAgICAgICAvKiBTVEEtPkFQICAqLworI2RlZmluZSBJRUVFODAyMTFfRkMxX0RJUl9GUk9NRFMgICAgICAgICAgICAweDAyICAgICAgICAvKiBBUCAtPlNUQSAqLworI2RlZmluZSBJRUVFODAyMTFfRkMxX0RJUl9EU1RPRFMgICAgICAgICAgICAweDAzICAgICAgICAvKiBBUCAtPkFQICAqLworCisjZGVmaW5lIElFRUU4MDIxMV9GQzFfTU9SRV9GUkFHICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMV9SRVRSWSAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBJRUVFODAyMTFfRkMxX1BXUl9NR1QgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIElFRUU4MDIxMV9GQzFfTU9SRV9EQVRBICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMV9XRVAgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBJRUVFODAyMTFfRkMxX09SREVSICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgSUVFRTgwMjExX1NFUV9GUkFHX01BU0sgICAgICAgICAgICAgMHgwMDBmCisjZGVmaW5lIElFRUU4MDIxMV9TRVFfRlJBR19TSElGVCAgICAgICAgICAgIDAKKyNkZWZpbmUgSUVFRTgwMjExX1NFUV9TRVFfTUFTSyAgICAgICAgICAgICAgMHhmZmYwCisjZGVmaW5lIElFRUU4MDIxMV9TRVFfU0VRX1NISUZUICAgICAgICAgICAgIDQKKyNkZWZpbmUgSUVFRTgwMjExX1NFUV9NQVggICAgICAgICAgICAgICAgICAgNDA5NgorCisjZGVmaW5lIElFRUU4MDIxMV9TRVFfTEVRKGEsYikgICgoaW50KSgoYSktKGIpKSA8PSAwKQorCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfVFhPUCAgICAgICAgICAgICAgICAgIDB4MDBmZgorCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfQU1TRFUgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19BTVNEVV9TICAgICAgICAgICAgICAgNworI2RlZmluZSBJRUVFODAyMTFfUU9TX0FDS1BPTElDWSAgICAgICAgICAgICAweDYwCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfQUNLUE9MSUNZX1MgICAgICAgICAgIDUKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19FT1NQICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBJRUVFODAyMTFfUU9TX0VPU1BfUyAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9RT1NfVElEICAgICAgICAgICAgICAgICAgIDB4MGYKKyNkZWZpbmUgSUVFRTgwMjExX01GUF9USUQgICAgICAgICAgICAgICAgICAgMHhmZgorCisjZGVmaW5lIElFRUU4MDIxMV9IVEMwX1RSUSAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSUVFRTgwMjExX0hUQzJfQ2FsUG9zICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBJRUVFODAyMTFfSFRDMl9DYWxTZXEgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIElFRUU4MDIxMV9IVEMyX0NTSV9OT05DT01QX0JGICAgICAgIDB4ODAKKyNkZWZpbmUgSUVFRTgwMjExX0hUQzJfQ1NJX0NPTVBfQkYgICAgICAgICAgMHhjMAorCisvKiBTZXQgYml0cyAxNCBhbmQgMTUgdG8gMSB3aGVuIGR1cmF0aW9uIGZpZWxkIGNhcnJpZXMgQXNzb2NpYXRpb24gSUQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZJRUxEX1RZUEVfQUlEICAgICAgICAgICAgMHhDMDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0JFQUNPTihfZnJhbWUpICAgICgoKChfZnJhbWUpLT5pX2ZjWzBdICYgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0spID09IElFRUU4MDIxMV9GQzBfVFlQRV9NR1QpICYmIFwKKwkJCQkJKCgoX2ZyYW1lKS0+aV9mY1swXSAmIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKSA9PSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQkVBQ09OKSkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0RBVEEoX2ZyYW1lKSAgICAgICgoKF9mcmFtZSktPmlfZmNbMF0gJiBJRUVFODAyMTFfRkMwX1RZUEVfTUFTSykgPT0gSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0lTX01GUF9GUkFNRShfZnJhbWUpICgoKChfZnJhbWUpLT5pX2ZjWzBdICYgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0spID09IElFRUU4MDIxMV9GQzBfVFlQRV9NR1QpICYmIFwKKwkJCQkJKChfZnJhbWUpLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9XRVApICYmIFwKKwkJCQkJKCgoKF9mcmFtZSktPmlfZmNbMF0gJiBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSykgPT0gSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RFQVVUSCkgfHwgXAorCQkJCQkgKCgoX2ZyYW1lKS0+aV9mY1swXSAmIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKSA9PSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfRElTQVNTT0MpIHx8IFwKKwkJCQkJICgoKF9mcmFtZSktPmlfZmNbMF0gJiBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSykgPT0gSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FDVElPTikpKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQVVUSChfZnJhbWUpICAgICAgKCgoKF9mcmFtZSktPmlfZmNbMF0gJiBJRUVFODAyMTFfRkMwX1RZUEVfTUFTSykgPT0gSUVFRTgwMjExX0ZDMF9UWVBFX01HVCkgJiYgXAorCQkJCQkoKChfZnJhbWUpLT5pX2ZjWzBdICYgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spID09IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9BVVRIKSkKKworLyogTUNTIFNldCAqLworI2RlZmluZSBJRUVFODAyMTFfUlhfTUNTXzFfU1RSRUFNX0JZVEVfT0ZGU0VUIDAKKyNkZWZpbmUgSUVFRTgwMjExX1JYX01DU18yX1NUUkVBTV9CWVRFX09GRlNFVCAxCisjZGVmaW5lIElFRUU4MDIxMV9SWF9NQ1NfM19TVFJFQU1fQllURV9PRkZTRVQgMgorI2RlZmluZSBJRUVFODAyMTFfUlhfTUNTX0FMTF9OU1RSRUFNX1JBVEVTIDB4ZmYKKyNkZWZpbmUgSUVFRTgwMjExX1RYX01DU19PRkZTRVQgMTIKKworI2RlZmluZSBJRUVFODAyMTFfVFhfTUNTX1NFVF9ERUZJTkVEIDB4ODAKKyNkZWZpbmUgSUVFRTgwMjExX1RYX1JYX01DU19TRVRfTk9UX0VRVUFMIDB4NDAKKyNkZWZpbmUgSUVFRTgwMjExX1RYXzFfU1BBVElBTF9TVFJFQU1TIDB4MAorI2RlZmluZSBJRUVFODAyMTFfVFhfMl9TUEFUSUFMX1NUUkVBTVMgMHgxMAorI2RlZmluZSBJRUVFODAyMTFfVFhfM19TUEFUSUFMX1NUUkVBTVMgMHgyMAorI2RlZmluZSBJRUVFODAyMTFfVFhfNF9TUEFUSUFMX1NUUkVBTVMgMHgzMAorCisjZGVmaW5lIElFRUU4MDIxMV9UWF9NQ1NfU0VUIDB4ZjgKKworLyoKKyAqIFN1YnR5cGUgZGF0YTogSWYgYml0IDYgaXMgc2V0IHRoZW4gdGhlIGRhdGEgZnJhbWUgY29udGFpbnMgbm8gYWN0dWFsIGRhdGEuCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX05PX0RBVEFfTUFTSyAgMHg0MAorI2RlZmluZSBJRUVFODAyMTFfQ09OVEFJTl9EQVRBKF9zdWJ0eXBlKSBcCisJKCEoKF9zdWJ0eXBlKSAmIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT19EQVRBX01BU0spKQorCisjZGVmaW5lIElFRUU4MDIzX01BWF9MRU4gMHg2MDAgIC8qIDE1MzYgLSBsYXJnZXIgaXMgRXRoZXJuZXQgSUkgKi8KKyNkZWZpbmUgUkZDMTA0Ml9TTkFQX09SR0NPREVfMCAweDAwCisjZGVmaW5lIFJGQzEwNDJfU05BUF9PUkdDT0RFXzEgMHgwMAorI2RlZmluZSBSRkMxMDQyX1NOQVBfT1JHQ09ERV8yIDB4MDAKKworI2RlZmluZSBCVEVQX1NOQVBfT1JHQ09ERV8wIDB4MDAKKyNkZWZpbmUgQlRFUF9TTkFQX09SR0NPREVfMSAweDAwCisjZGVmaW5lIEJURVBfU05BUF9PUkdDT0RFXzIgMHhmOAorCisvKiBCVCAzLjAgKi8KKyNkZWZpbmUgQlRBTVBfU05BUF9PUkdDT0RFXzAgMHgwMAorI2RlZmluZSBCVEFNUF9TTkFQX09SR0NPREVfMSAweDE5CisjZGVmaW5lIEJUQU1QX1NOQVBfT1JHQ09ERV8yIDB4NTgKKworLyogQWlyb25ldCBPVUkgQ29kZXMgKi8KKyNkZWZpbmUgQUlST05FVF9TTkFQX0NPREVfMCAgMHgwMAorI2RlZmluZSBBSVJPTkVUX1NOQVBfQ09ERV8xICAweDQwCisjZGVmaW5lIEFJUk9ORVRfU05BUF9DT0RFXzIgIDB4OTYKKworI2RlZmluZSBJRUVFODAyMTFfTFNJR19MRU4gIDMKKyNkZWZpbmUgSUVFRTgwMjExX0hUU0lHX0xFTiA2CisjZGVmaW5lIElFRUU4MDIxMV9TQl9MRU4gICAgMgorCisvKgorICogSW5mb3JtYXRpb24gZWxlbWVudCBoZWFkZXIgZm9ybWF0CisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfaGVhZGVyIHsKKwl1aW50OF90IGVsZW1lbnRfaWQ7ICAgICAvKiBFbGVtZW50IElkICovCisJdWludDhfdCBsZW5ndGg7ICAgICAgICAgLyogSUUgTGVuZ3RoICovCit9IF9fcGFja2VkOworCisvKgorICogQ291bnRyeSBpbmZvcm1hdGlvbiBlbGVtZW50LgorICovCisjZGVmaW5lIElFRUU4MDIxMV9DT1VOVFJZX01BWF9UUklQTEVUUyAoODMpCitzdHJ1Y3QgaWVlZTgwMjExX2llX2NvdW50cnkgeworCXVpbnQ4X3QgY291bnRyeV9pZDsKKwl1aW50OF90IGNvdW50cnlfbGVuOworCXVpbnQ4X3QgY291bnRyeV9zdHJbM107CisJdWludDhfdCBjb3VudHJ5X3RyaXBsZXRbSUVFRTgwMjExX0NPVU5UUllfTUFYX1RSSVBMRVRTICogM107Cit9IF9fcGFja2VkOworCisvKiBkb2VzIGZyYW1lIGhhdmUgUW9TIHNlcXVlbmNlIGNvbnRyb2wgZGF0YSAqLworI2RlZmluZSBJRUVFODAyMTFfUU9TX0hBU19TRVEod2gpIFwKKwkoKCh3aCktPmlfZmNbMF0gJiBcCisJICAoSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TKSkgPT0gXAorCSAoSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TKSkKKworI2RlZmluZSBXTUVfUU9TSU5GT19VQVBTRCAgIDB4ODAgICAgICAgIC8qIE1hc2sgZm9yIFUtQVBTRCBmaWVsZCAqLworI2RlZmluZSBXTUVfUU9TSU5GT19DT1VOVCAgIDB4MGYgICAgICAgIC8qIE1hc2sgZm9yIFBhcmFtIFNldCBDb3VudCBmaWVsZCAqLworLyoKKyAqIFdNRS84MDIuMTFlIGluZm9ybWF0aW9uIGVsZW1lbnQuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfd21lIHsKKwl1aW50OF90IHdtZV9pZDsgICAgICAgICAvKiBJRUVFODAyMTFfRUxFTUlEX1ZFTkRPUiAqLworCXVpbnQ4X3Qgd21lX2xlbjsgICAgICAgIC8qIGxlbmd0aCBpbiBieXRlcyAqLworCXVpbnQ4X3Qgd21lX291aVszXTsgICAgIC8qIDB4MDAsIDB4NTAsIDB4ZjIgKi8KKwl1aW50OF90IHdtZV90eXBlOyAgICAgICAvKiBPVUkgdHlwZSAqLworCXVpbnQ4X3Qgd21lX3N1YnR5cGU7ICAgIC8qIE9VSSBzdWJ0eXBlICovCisJdWludDhfdCB3bWVfdmVyc2lvbjsgICAgLyogc3BlYyByZXZpc2lvbiAqLworCXVpbnQ4X3Qgd21lX2luZm87ICAgICAgIC8qIFFvUyBpbmZvICovCit9IF9fcGFja2VkOworCisvKgorICogVFMgSU5GTyBwYXJ0IG9mIHRoZSB0c3BlYyBlbGVtZW50IGlzIGEgY29sbGVjdGlvbiBvZiBiaXQgZmxhZ3MKKyAqLworI2lmIF9CWVRFX09SREVSID09IF9CSUdfRU5ESUFOCitzdHJ1Y3QgaWVlZTgwMjExX3RzaW5mb19iaXRtYXAgeworCXVpbnQ4X3Qgb25lIDogMSwgZGlyZWN0aW9uIDogMiwgdGlkIDogNCwgcmVzZXJ2ZWQxIDogMTsKKwl1aW50OF90IHJlc2VydmVkMiA6IDIsIGRvdDFEdGFnIDogMywgcHNiIDogMSwgcmVzZXJ2ZWQzIDogMSwgemVybyA6IDE7CisJdWludDhfdCByZXNlcnZlZDUgOiA3LCByZXNlcnZlZDQgOiAxOworfSBfX3BhY2tlZDsKKyNlbHNlCitzdHJ1Y3QgaWVlZTgwMjExX3RzaW5mb19iaXRtYXAgeworCXVpbnQ4X3QgcmVzZXJ2ZWQxIDogMSwgdGlkIDogNCwgZGlyZWN0aW9uIDogMiwgb25lIDogMTsKKwl1aW50OF90IHplcm8gOiAxLCByZXNlcnZlZDMgOiAxLCBwc2IgOiAxLCBkb3QxRHRhZyA6IDMsIHJlc2VydmVkMiA6IDI7CisJdWludDhfdCByZXNlcnZlZDQgOiAxLCByZXNlcnZlZDUgOiA3OworfSBfX3BhY2tlZDsKKyNlbmRpZgorCisvKgorICogV01FLzgwMi4xMWUgVHNwZWMgRWxlbWVudAorICovCitzdHJ1Y3QgaWVlZTgwMjExX3dtZV90c3BlYyB7CisJdWludDhfdCB0c19pZDsKKwl1aW50OF90IHRzX2xlbjsKKwl1aW50OF90IHRzX291aVszXTsKKwl1aW50OF90IHRzX291aV90eXBlOworCXVpbnQ4X3QgdHNfb3VpX3N1YnR5cGU7CisJdWludDhfdCB0c192ZXJzaW9uOworCXVpbnQ4X3QgdHNfdHNpbmZvWzNdOworCXVpbnQ4X3QgdHNfbm9tX21zZHVbMl07CisJdWludDhfdCB0c19tYXhfbXNkdVsyXTsKKwl1aW50OF90IHRzX21pbl9zdmNbNF07CisJdWludDhfdCB0c19tYXhfc3ZjWzRdOworCXVpbnQ4X3QgdHNfaW5hY3R2X2ludHZbNF07CisJdWludDhfdCB0c19zdXNwX2ludHZbNF07CisJdWludDhfdCB0c19zdGFydF9zdmNbNF07CisJdWludDhfdCB0c19taW5fcmF0ZVs0XTsKKwl1aW50OF90IHRzX21lYW5fcmF0ZVs0XTsKKwl1aW50OF90IHRzX3BlYWtfcmF0ZVs0XTsKKwl1aW50OF90IHRzX21heF9idXJzdFs0XTsKKwl1aW50OF90IHRzX2RlbGF5WzRdOworCXVpbnQ4X3QgdHNfbWluX3BoeVs0XTsKKwl1aW50OF90IHRzX3N1cnBsdXNbMl07CisJdWludDhfdCB0c19tZWRpdW1fdGltZVsyXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBXTUUgQUMgcGFyYW1ldGVyIGZpZWxkCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfd21lX2FjcGFyYW1zIHsKKwl1aW50OF90IGFjcF9hY2lfYWlmc247CisJdWludDhfdCBhY3BfbG9nY3dtaW5tYXg7CisJdWludDE2X3QgYWNwX3R4b3A7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIElFRUU4MDIxMV9XTUVfUEFSQU1fTEVOIDI0CisjZGVmaW5lIFdNRV9OVU1fQUMgICAgICAgICAgICAgIDQgICAgICAgLyogNCBBQyBjYXRlZ29yaWVzICovCisKKyNkZWZpbmUgV01FX1BBUkFNX0FDSSAgICAgICAgICAgMHg2MCAgICAvKiBNYXNrIGZvciBBQ0kgZmllbGQgKi8KKyNkZWZpbmUgV01FX1BBUkFNX0FDSV9TICAgICAgICAgNSAgICAgICAvKiBTaGlmdCBmb3IgQUNJIGZpZWxkICovCisjZGVmaW5lIFdNRV9QQVJBTV9BQ00gICAgICAgICAgIDB4MTAgICAgLyogTWFzayBmb3IgQUNNIGJpdCAqLworI2RlZmluZSBXTUVfUEFSQU1fQUNNX1MgICAgICAgICA0ICAgICAgIC8qIFNoaWZ0IGZvciBBQ00gYml0ICovCisjZGVmaW5lIFdNRV9QQVJBTV9BSUZTTiAgICAgICAgIDB4MGYgICAgLyogTWFzayBmb3IgYWlmc24gZmllbGQgKi8KKyNkZWZpbmUgV01FX1BBUkFNX0FJRlNOX1MgICAgICAgMCAgICAgICAvKiBTaGlmdCBmb3IgYWlmc24gZmllbGQgKi8KKyNkZWZpbmUgV01FX1BBUkFNX0xPR0NXTUlOICAgICAgMHgwZiAgICAvKiBNYXNrIGZvciBDd01pbiBmaWVsZCAoaW4gbG9nKSAqLworI2RlZmluZSBXTUVfUEFSQU1fTE9HQ1dNSU5fUyAgICAwICAgICAgIC8qIFNoaWZ0IGZvciBDd01pbiBmaWVsZCAqLworI2RlZmluZSBXTUVfUEFSQU1fTE9HQ1dNQVggICAgICAweGYwICAgIC8qIE1hc2sgZm9yIEN3TWF4IGZpZWxkIChpbiBsb2cpICovCisjZGVmaW5lIFdNRV9QQVJBTV9MT0dDV01BWF9TICAgIDQgICAgICAgLyogU2hpZnQgZm9yIEN3TWF4IGZpZWxkICovCisKKyNkZWZpbmUgV01FX0FDX1RPX1RJRChfYWMpICgJICAgXAorCQkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCisJCSgoX2FjKSA9PSBXTUVfQUNfVkkpID8gNSA6IFwKKwkJKChfYWMpID09IFdNRV9BQ19CSykgPyAxIDogXAorCQkwKQorCisjZGVmaW5lIFRJRF9UT19XTUVfQUMoX3RpZCkgKAkgICBcCisJCSgoKF90aWQpID09IDApIHx8ICgoX3RpZCkgPT0gMykpID8gV01FX0FDX0JFIDogXAorCQkoKChfdGlkKSA9PSAxKSB8fCAoKF90aWQpID09IDIpKSA/IFdNRV9BQ19CSyA6IFwKKwkJKCgoX3RpZCkgPT0gNCkgfHwgKChfdGlkKSA9PSA1KSkgPyBXTUVfQUNfVkkgOiBcCisJCVdNRV9BQ19WTykKKworLyoKKyAqIFdNRSBQYXJhbWV0ZXIgRWxlbWVudAorICovCitzdHJ1Y3QgaWVlZTgwMjExX3dtZV9wYXJhbSB7CisJdWludDhfdCBwYXJhbV9pZDsKKwl1aW50OF90IHBhcmFtX2xlbjsKKwl1aW50OF90IHBhcmFtX291aVszXTsKKwl1aW50OF90IHBhcmFtX291aV90eXBlOworCXVpbnQ4X3QgcGFyYW1fb3VpX3N5YnR5cGU7CisJdWludDhfdCBwYXJhbV92ZXJzaW9uOworCXVpbnQ4X3QgcGFyYW1fcW9zSW5mbzsKKwl1aW50OF90IHBhcmFtX3Jlc2VydmVkOworCXN0cnVjdCBpZWVlODAyMTFfd21lX2FjcGFyYW1zIHBhcmFtc19hY1BhcmFtc1tXTUVfTlVNX0FDXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBXTUUgVS1BUFNEIHFvcyBpbmZvIGZpZWxkIGRlZmluZXMKKyAqLworI2RlZmluZSBXTUVfQ0FQSU5GT19VQVBTRF9FTiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBXTUVfQ0FQSU5GT19VQVBTRF9WTyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBXTUVfQ0FQSU5GT19VQVBTRF9WSSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBXTUVfQ0FQSU5GT19VQVBTRF9CSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBXTUVfQ0FQSU5GT19VQVBTRF9CRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBXTUVfQ0FQSU5GT19VQVBTRF9BQ0ZMQUdTX1NISUZUICAgICAgICAgMAorI2RlZmluZSBXTUVfQ0FQSU5GT19VQVBTRF9BQ0ZMQUdTX01BU0sgICAgICAgICAgMHhGCisjZGVmaW5lIFdNRV9DQVBJTkZPX1VBUFNEX01BWFNQX1NISUZUICAgICAgICAgICA1CisjZGVmaW5lIFdNRV9DQVBJTkZPX1VBUFNEX01BWFNQX01BU0sgICAgICAgICAgICAweDMKKyNkZWZpbmUgV01FX0NBUElORk9fSUVfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV01FX1VBUFNEX01BWFNQKF9xb3NpbmZvKSAoKChfcW9zaW5mbykgPj4gV01FX0NBUElORk9fVUFQU0RfTUFYU1BfU0hJRlQpICYgV01FX0NBUElORk9fVUFQU0RfTUFYU1BfTUFTSykKKyNkZWZpbmUgV01FX1VBUFNEX0FDX0VOQUJMRUQoX2FjLCBfcW9zaW5mbykgKCAoMTw8KDMgLSAoX2FjKSkpICYgICBcCisJCQkJCSAgICAgICgoKF9xb3NpbmZvKSA+PiBXTUVfQ0FQSU5GT19VQVBTRF9BQ0ZMQUdTX1NISUZUKSAmIFdNRV9DQVBJTkZPX1VBUFNEX0FDRkxBR1NfTUFTSykgKQorCisvKiBNYXNrIHVzZWQgdG8gZGV0ZXJtaW5lZCB3aGV0aGVyIGFsbCBxdWV1ZXMgYXJlIFVBUFNELWVuYWJsZWQgKi8KKyNkZWZpbmUgV01FX0NBUElORk9fVUFQU0RfQUxMICAgICAgICAgICAgICAgICAgIChXTUVfQ0FQSU5GT19VQVBTRF9WTyB8CVwKKwkJCQkJCSBXTUVfQ0FQSU5GT19VQVBTRF9WSSB8CVwKKwkJCQkJCSBXTUVfQ0FQSU5GT19VQVBTRF9CSyB8CVwKKwkJCQkJCSBXTUVfQ0FQSU5GT19VQVBTRF9CRSkKKyNkZWZpbmUgV01FX0NBUElORk9fVUFQU0RfTk9ORSAgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBXTUVfVUFQU0RfQUNfTUFYX1ZBTCAgICAgICAgICAgIDEKKyNkZWZpbmUgV01FX1VBUFNEX0FDX0lOVkFMICAgICAgICAgICAgICAgICAgICAgIFdNRV9VQVBTRF9BQ19NQVhfVkFMKzEKKworLyoKKyAqIEF0aGVyb3MgQWR2YW5jZWQgQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBlbGVtZW50LgorICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX2F0aEFkdkNhcCB7CisJdWludDhfdCBhdGhBZHZDYXBfaWQ7ICAgLyogSUVFRTgwMjExX0VMRU1JRF9WRU5ET1IgKi8KKwl1aW50OF90IGF0aEFkdkNhcF9sZW47ICAvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1aW50OF90IGF0aEFkdkNhcF9vdWlbM107ICAgICAgIC8qIDB4MDAsIDB4MDMsIDB4N2YgKi8KKwl1aW50OF90IGF0aEFkdkNhcF90eXBlOyAvKiBPVUkgdHlwZSAqLworCXVpbnQxNl90IGF0aEFkdkNhcF92ZXJzaW9uOyAgICAgLyogc3BlYyByZXZpc2lvbiAqLworCXVpbnQ4X3QgYXRoQWR2Q2FwX2NhcGFiaWxpdHk7ICAgLyogQ2FwYWJpbGl0eSBpbmZvICovCisJdWludDE2X3QgYXRoQWR2Q2FwX2RlZktleUluZGV4OworfSBfX3BhY2tlZDsKKworLyoKKyAqIEF0aGVyb3MgRXh0ZW5kZWQgQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBlbGVtZW50LgorICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX2F0aF9leHRjYXAgeworCXVpbnQ4X3QgYXRoX2V4dGNhcF9pZDsgIC8qIElFRUU4MDIxMV9FTEVNSURfVkVORE9SICovCisJdWludDhfdCBhdGhfZXh0Y2FwX2xlbjsgLyogbGVuZ3RoIGluIGJ5dGVzICovCisJdWludDhfdCBhdGhfZXh0Y2FwX291aVszXTsgICAgICAvKiAweDAwLCAweDAzLCAweDdmICovCisJdWludDhfdCBhdGhfZXh0Y2FwX3R5cGU7ICAgICAgICAvKiBPVUkgdHlwZSAqLworCXVpbnQ4X3QgYXRoX2V4dGNhcF9zdWJ0eXBlOyAgICAgLyogT1VJIHN1YnR5cGUgKi8KKwl1aW50OF90IGF0aF9leHRjYXBfdmVyc2lvbjsgICAgIC8qIHNwZWMgcmV2aXNpb24gKi8KKwl1aW50MzJfdCBhdGhfZXh0Y2FwX2V4dGNhcCA6IDE2LCAgLyogQjAtMTUgIGV4dGVuZGVkIGNhcGFiaWxpdGllcyAqLworCQkgYXRoX2V4dGNhcF93ZXB0a2lwYWdncl9yeGRlbGltIDogOCwgLyogQjE2LTIzIG51bSBkZWxpbWl0ZXJzIGZvciByZWNlaXZpbmcgV0VQL1RLSVAgYWdncmVnYXRlcyAqLworCQkgYXRoX2V4dGNhcF9yZXNlcnZlZCA6IDg7IC8qIEIyNC0zMSByZXNlcnZlZCAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIEF0aGVyb3MgWFIgaW5mb3JtYXRpb24gZWxlbWVudC4KKyAqLworc3RydWN0IGllZWU4MDIxMV94cl9wYXJhbSB7CisJdWludDhfdCBwYXJhbV9pZDsKKwl1aW50OF90IHBhcmFtX2xlbjsKKwl1aW50OF90IHBhcmFtX291aVszXTsKKwl1aW50OF90IHBhcmFtX291aV90eXBlOworCXVpbnQ4X3QgcGFyYW1fb3VpX3N5YnR5cGU7CisJdWludDhfdCBwYXJhbV92ZXJzaW9uOworCXVpbnQ4X3QgcGFyYW1fSW5mbzsKKwl1aW50OF90IHBhcmFtX2Jhc2VfYnNzaWRbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IHBhcmFtX3hyX2Jzc2lkW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDE2X3QgcGFyYW1feHJfYmVhY29uX2ludGVydmFsOworCXVpbnQ4X3QgcGFyYW1fYmFzZV9hdGhfY2FwYWJpbGl0eTsKKwl1aW50OF90IHBhcmFtX3hyX2F0aF9jYXBhYmlsaXR5OworfSBfX3BhY2tlZDsKKworLyoKKyAqIFNGQSBpbmZvcm1hdGlvbiBlbGVtZW50LgorICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX3NmYSB7CisJdWludDhfdCBzZmFfaWQ7ICAgICAgICAgLyogSUVFRTgwMjExX0VMRU1JRF9WRU5ET1IgKi8KKwl1aW50OF90IHNmYV9sZW47ICAgICAgICAvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1aW50OF90IHNmYV9vdWlbM107ICAgICAvKiAweDAwLCAweDQwLCAweDk2ICovCisJdWludDhfdCBzZmFfdHlwZTsgICAgICAgLyogT1VJIHR5cGUgKi8KKwl1aW50OF90IHNmYV9jYXBzOyAgICAgICAvKiBDYXBhYmlsaXRpZXMgKi8KK30gX19wYWNrZWQ7CisKKy8qIEF0aGVyb3MgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIElFRUU4MDIxMV9BVEhDX1RVUkJPUCAgIDB4MDAwMSAgLyogVHVyYm8gUHJpbWUgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FUSENfQ09NUCAgICAgMHgwMDAyICAvKiBDb21wcmVzc2lvbiAqLworI2RlZmluZSBJRUVFODAyMTFfQVRIQ19GRiAgICAgICAweDAwMDQgIC8qIEZhc3QgRnJhbWVzICovCisjZGVmaW5lIElFRUU4MDIxMV9BVEhDX1hSICAgICAgIDB4MDAwOCAgLyogWHRlbmRlZCBSYW5nZSBzdXBwb3J0ICovCisjZGVmaW5lIElFRUU4MDIxMV9BVEhDX0FSICAgICAgIDB4MDAxMCAgLyogQWR2YW5jZWQgUmFkYXIgc3VwcG9ydCAqLworI2RlZmluZSBJRUVFODAyMTFfQVRIQ19CVVJTVCAgICAweDAwMjAgIC8qIEJ1cnN0aW5nIC0gbm90IG5lZ290aWF0ZWQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FUSENfV01FICAgICAgMHgwMDQwICAvKiBDV01pbiB0dW5pbmcgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FUSENfQk9PU1QgICAgMHgwMDgwICAvKiBCb29zdCAqLworI2RlZmluZSBJRUVFODAyMTFfQVRIQ19URExTICAgICAweDAxMDAgIC8qIFRETFMgKi8KKworLyogQXRoZXJvcyBleHRlbmRlZCBjYXBhYmlsaXRpZXMgKi8KKy8qIE9XTCBkZXZpY2UgY2FwYWJsZSBvZiBXRFMgd29ya2Fyb3VuZCAqLworI2RlZmluZSBJRUVFODAyMTFfQVRIRUNfT1dMV0RTV0FSICAgICAgICAweDAwMDEKKyNkZWZpbmUgSUVFRTgwMjExX0FUSEVDX1dFUFRLSVBBR0dSICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBJRUVFODAyMTFfQVRIRUNfRVhUUkFERUxJTVdBUiAgICAweDAwMDQKKy8qCisgKiBNYW5hZ2VtZW50IEZyYW1lcworICovCisKKy8qCisgKiAqKiogUGxhdGZvcm0tc3BlY2lmaWMgY29kZT8/ICoqKgorICogSW4gVmlzdGEgb25lIG11c3QgdXNlIGJpdCBmaWVsZHMgb2YgdHlwZSAodW5zaWduZWQgc2hvcnQgPSB1aW50MTZfdCkgdG8KKyAqIGVuc3VyZSBkYXRhIHN0cnVjdHVyZSBpcyBvZiB0aGUgY29ycmVjdCBzaXplLiBBTlNJIEMgdXNlZCB0byBzcGVjaWZ5IG9ubHkKKyAqICJpbnQiIGJpdCBmaWVsZHMsIHdoaWNoIGxlZCB0byBhIGxhcmdlciBzdHJ1Y3R1cmUgc2l6ZSBpbiBXaW5kb3dzICgzMiBiaXRzKS4KKyAqCisgKiBXZSBtdXN0IG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdGlvbiBpcyB2YWxpZCBpbiBhbGwgT1Mncy4KKyAqLwordW5pb24gaWVlZTgwMjExX2NhcGFiaWxpdHkgeworCXN0cnVjdCB7CisJCXVpbnQxNl90IGVzcyA6IDE7CisJCXVpbnQxNl90IGlic3MgOiAxOworCQl1aW50MTZfdCBjZl9wb2xsYWJsZSA6IDE7CisJCXVpbnQxNl90IGNmX3BvbGxfcmVxdWVzdCA6IDE7CisJCXVpbnQxNl90IHByaXZhY3kgOiAxOworCQl1aW50MTZfdCBzaG9ydF9wcmVhbWJsZSA6IDE7CisJCXVpbnQxNl90IHBiY2MgOiAxOworCQl1aW50MTZfdCBjaGFubmVsX2FnaWxpdHkgOiAxOworCQl1aW50MTZfdCBzcGVjdHJ1bV9tYW5hZ2VtZW50IDogMTsKKwkJdWludDE2X3QgcW9zIDogMTsKKwkJdWludDE2X3Qgc2hvcnRfc2xvdF90aW1lIDogMTsKKwkJdWludDE2X3QgYXBzZCA6IDE7CisJCXVpbnQxNl90IHJlc2VydmVkMiA6IDE7CisJCXVpbnQxNl90IGRzc3Nfb2ZkbSA6IDE7CisJCXVpbnQxNl90IGRlbF9ibG9ja19hY2sgOiAxOworCQl1aW50MTZfdCBpbW1lZF9ibG9ja19hY2sgOiAxOworCX07CisKKwl1aW50MTZfdCB2YWx1ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpZWVlODAyMTFfYmVhY29uX2ZyYW1lIHsKKwl1aW50OF90IHRpbWVzdGFtcFs4XTsgICAvKiB0aGUgdmFsdWUgb2Ygc2VuZGVyJ3MgVFNGVElNRVIgKi8KKwl1aW50MTZfdCBiZWFjb25faW50ZXJ2YWw7ICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZSB1bml0cyBiZXR3ZWVuIHRhcmdldCBiZWFjb24gdHJhbnNtaXNzaW9uIHRpbWVzICovCisJdW5pb24gaWVlZTgwMjExX2NhcGFiaWxpdHkgY2FwYWJpbGl0eTsKKy8qIFZhbHVlIG9mIGNhcGFiaWxpdHkgZm9yIGV2ZXJ5IGJpdAorICAgI2RlZmluZSBJRUVFODAyMTFfQ0FQSU5GT19FU1MgICAgICAgICAgICAgICAweDAwMDEKKyAgICNkZWZpbmUgSUVFRTgwMjExX0NBUElORk9fSUJTUyAgICAgICAgICAgICAgMHgwMDAyCisgICAjZGVmaW5lIElFRUU4MDIxMV9DQVBJTkZPX0NGX1BPTExBQkxFICAgICAgIDB4MDAwNAorICAgI2RlZmluZSBJRUVFODAyMTFfQ0FQSU5GT19DRl9QT0xMUkVRICAgICAgICAweDAwMDgKKyAgICNkZWZpbmUgSUVFRTgwMjExX0NBUElORk9fUFJJVkFDWSAgICAgICAgICAgMHgwMDEwCisgICAjZGVmaW5lIElFRUU4MDIxMV9DQVBJTkZPX1NIT1JUX1BSRUFNQkxFICAgIDB4MDAyMAorICAgI2RlZmluZSBJRUVFODAyMTFfQ0FQSU5GT19QQkNDICAgICAgICAgICAgICAweDAwNDAKKyAgICNkZWZpbmUgSUVFRTgwMjExX0NBUElORk9fQ0hOTF9BR0lMSVRZICAgICAgMHgwMDgwCisgICAjZGVmaW5lIElFRUU4MDIxMV9DQVBJTkZPX1NQRUNUUlVNX01HTVQgICAgIDB4MDEwMAorICAgI2RlZmluZSBJRUVFODAyMTFfQ0FQSU5GT19RT1MgICAgICAgICAgICAgICAweDAyMDAKKyAgICNkZWZpbmUgSUVFRTgwMjExX0NBUElORk9fU0hPUlRfU0xPVFRJTUUgICAgMHgwNDAwCisgICAjZGVmaW5lIElFRUU4MDIxMV9DQVBJTkZPX0FQU0QgICAgICAgICAgICAgIDB4MDgwMAorICAgI2RlZmluZSBJRUVFODAyMTFfQ0FQSU5GT19SQURJT01FQVMgICAgICAgICAweDEwMDAKKyAgICNkZWZpbmUgSUVFRTgwMjExX0NBUElORk9fRFNTU09GRE0gICAgICAgICAgMHgyMDAwCisgICBiaXRzIDE0LTE1IGFyZSByZXNlcnZlZAorICovCisJc3RydWN0IGllZWU4MDIxMV9pZV9oZWFkZXIgaW5mb19lbGVtZW50czsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBNYW5hZ2VtZW50IEFjdGlvbiBGcmFtZXMKKyAqLworCisvKiBnZW5lcmljIGZyYW1lIGZvcm1hdCAqLworc3RydWN0IGllZWU4MDIxMV9hY3Rpb24geworCXVpbnQ4X3QgaWFfY2F0ZWdvcnk7CisJdWludDhfdCBpYV9hY3Rpb247Cit9IF9fcGFja2VkOworCisvKiBzcGVjdHJ1bSBhY3Rpb24gZnJhbWUgaGVhZGVyICovCitzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbl9tZWFzcmVwX2hlYWRlciB7CisJc3RydWN0IGllZWU4MDIxMV9hY3Rpb24gYWN0aW9uX2hlYWRlcjsKKwl1aW50OF90IGRpYWxvZ190b2tlbjsKK30gX19wYWNrZWQ7CisKKy8qIGNhdGVnb3JpZXMgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FDVElPTl9DQVRfU1BFQ1RSVU0gICAgICAgMCAgIC8qIFNwZWN0cnVtIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FDVElPTl9DQVRfUU9TICAgICAgICAgICAgMSAgIC8qIElFRUUgUW9TICAqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0NBVF9ETFMgICAgICAgICAgICAyICAgLyogRExTICovCisjZGVmaW5lIElFRUU4MDIxMV9BQ1RJT05fQ0FUX0JBICAgICAgICAgICAgIDMgICAvKiBCQSAqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0NBVF9QVUJMSUMgICAgICAgICA0ICAgLyogUHVibGljIEFjdGlvbiBGcmFtZSAqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0NBVF9IVCAgICAgICAgICAgICA3ICAgLyogSFQgcGVyIElFRUU4MDIuMTFuLUQxLjA2ICovCisjZGVmaW5lIElFRUU4MDIxMV9BQ1RJT05fQ0FUX1NBX1FVRVJZICAgICAgIDggICAvKiBTQSBRdWVyeSBwZXIgSUVFRTgwMi4xMXcsIFBNRiAqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0NBVF9XTU1fUU9TICAgICAgIDE3ICAgLyogUW9TIGZyb20gV01NIHNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FDVElPTl9DQVRfVkhUICAgICAgICAgICAyMSAgIC8qIFZIVCBBY3Rpb24gKi8KKworLyogU3BlY3RydW0gTWFuYWdlbWVudCBhY3Rpb25zICovCisjZGVmaW5lIElFRUU4MDIxMV9BQ1RJT05fTUVBU19SRVFVRVNUICAgICAgIDAgICAvKiBNZWFzdXJlIGNoYW5uZWxzICovCisjZGVmaW5lIElFRUU4MDIxMV9BQ1RJT05fTUVBU19SRVBPUlQgICAgICAgIDEKKyNkZWZpbmUgSUVFRTgwMjExX0FDVElPTl9UUENfUkVRVUVTVCAgICAgICAgMiAgIC8qIFRyYW5zbWl0IFBvd2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FDVElPTl9UUENfUkVQT1JUICAgICAgICAgMworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0NIQU5fU1dJVENIICAgICAgICA0ICAgLyogODAyLjExaCBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgKi8KKworLyogSFQgYWN0aW9ucyAqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0hUX1RYQ0hXSURUSCAgICAgICAwICAgLyogcmVjb21tZW5kZWQgdHJhbnNtaXNzaW9uIGNoYW5uZWwgd2lkdGggKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FDVElPTl9IVF9TTVBPV0VSU0FWRSAgICAgMSAgIC8qIFNwYXRpYWwgTXVsdGlwbGV4aW5nIChTTSkgUG93ZXIgU2F2ZSAqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0hUX0NTSSAgICAgICAgICAgICA0ICAgLyogQ1NJIEZyYW1lICovCisjZGVmaW5lIElFRUU4MDIxMV9BQ1RJT05fSFRfTk9OQ09NUF9CRiAgICAgIDUgICAvKiBOb24tY29tcHJlc3NlZCBCZWFtZm9ybWluZyAqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0hUX0NPTVBfQkYgICAgICAgICA2ICAgLyogQ29tcHJlc3NlZCBCZWFtZm9ybWluZyAqLworCisvKiBWSFQgYWN0aW9ucyAqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX1ZIVF9PUE1PREUgICAgICAgICAyICAgLyogT3BlcmF0aW5nICBtb2RlIG5vdGlmaWNhdGlvbiAqLworCisvKiBTcGVjdHJ1bSBjaGFubmVsIHN3aXRjaCBhY3Rpb24gZnJhbWUgYWZ0ZXIgSUUqLworLyogUHVibGljIEFjdGlvbnMqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX1RETFNfRElTQ1JFU1AgIDE0ICAgICAgLyogVERMUyBEaXNjb3ZlcnkgUmVzcG9uc2UgZnJhbWUgKi8KKworLyogSFQgLSByZWNvbW1lbmRlZCB0cmFuc21pc3Npb24gY2hhbm5lbCB3aWR0aCAqLworc3RydWN0IGllZWU4MDIxMV9hY3Rpb25faHRfdHhjaHdpZHRoIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbiBhdF9oZWFkZXI7CisJdWludDhfdCBhdF9jaHdpZHRoOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBJRUVFODAyMTFfQV9IVF9UWENIV0lEVEhfMjAgICAgICAgICAwCisjZGVmaW5lIElFRUU4MDIxMV9BX0hUX1RYQ0hXSURUSF8yMDQwICAgICAgIDEKKworLyogSFQgLSBTcGF0aWFsIE11bHRpcGxleGluZyAoU00pIFBvd2VyIFNhdmUgKi8KK3N0cnVjdCBpZWVlODAyMTFfYWN0aW9uX2h0X3NtcG93ZXJzYXZlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbiBhc19oZWFkZXI7CisJdWludDhfdCBhc19jb250cm9sOworfSBfX3BhY2tlZDsKKworLypIVCAtIENTSSBGcmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBUeEJGIFJDICovCisjZGVmaW5lIE1JTU9fQ09OVFJPTF9MRU4gNgorc3RydWN0IGllZWU4MDIxMV9hY3Rpb25faHRfQ1NJIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbiBhc19oZWFkZXI7CisJdWludDhfdCBtaW1vX2NvbnRyb2xbTUlNT19DT05UUk9MX0xFTl07Cit9IF9fcGFja2VkOworCisvKkhUIC0gVi9DViByZXBvcnQgZnJhbWUqLworc3RydWN0IGllZWU4MDIxMV9hY3Rpb25faHRfdHhiZl9ycHQgeworCXN0cnVjdCBpZWVlODAyMTFfYWN0aW9uIGFzX2hlYWRlcjsKKwl1aW50OF90IG1pbW9fY29udHJvbFtNSU1PX0NPTlRST0xfTEVOXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiA4MDIuMTFhYyBPcGVyYXRpbmcgTW9kZSAgTm90aWZpY2F0aW9uCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfb3BfbW9kZSB7CisjaWYgX0JZVEVfT1JERVIgPT0gX0JJR19FTkRJQU4KKwl1aW50OF90IHJ4X25zc190eXBlIDogMSwgcnhfbnNzIDogMywgcmVzZXJ2ZWQgOiAyLCBjaF93aWR0aCA6IDI7CisjZWxzZQorCXVpbnQ4X3QgY2hfd2lkdGggOiAyLCByZXNlcnZlZCA6IDIsIHJ4X25zcyA6IDMsIHJ4X25zc190eXBlIDogMTsKKyNlbmRpZgorfSBfX3BhY2tlZDsKKworc3RydWN0IGllZWU4MDIxMV9pZV9vcF9tb2RlX250ZnkgeworCXVpbnQ4X3QgZWxlbV9pZDsKKwl1aW50OF90IGVsZW1fbGVuOworCXN0cnVjdCBpZWVlODAyMTFfaWVfb3BfbW9kZSBvcG1vZGU7Cit9IF9fcGFja2VkOworCisvKiBWSFQgLSByZWNvbW1lbmRlZCBDaGFubmVsIHdpZHRoIGFuZCBOc3MgKi8KK3N0cnVjdCBpZWVlODAyMTFfYWN0aW9uX3ZodF9vcG1vZGUgeworCXN0cnVjdCBpZWVlODAyMTFfYWN0aW9uIGF0X2hlYWRlcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2llX29wX21vZGUgYXRfb3BfbW9kZTsKK30gX19wYWNrZWQ7CisKKy8qIHZhbHVlcyBkZWZpbmVkIGZvciAnYXNfY29udHJvbCcgZmllbGQgcGVyIDgwMi4xMW4tRDEuMDYgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FfSFRfU01QT1dFUlNBVkVfRElTQUJMRUQgICAgIDB4MDAgICAgLyogU00gUG93ZXIgU2F2ZSBEaXNhYmxlZCwgU00gcGFja2V0cyBvayAgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FfSFRfU01QT1dFUlNBVkVfRU5BQkxFRCAgICAgIDB4MDEgICAgLyogU00gUG93ZXIgU2F2ZSBFbmFibGVkIGJpdCAgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FfSFRfU01QT1dFUlNBVkVfTU9ERSAgICAgICAgIDB4MDIgICAgLyogU00gUG93ZXIgU2F2ZSBNb2RlIGJpdCAqLworI2RlZmluZSBJRUVFODAyMTFfQV9IVF9TTVBPV0VSU0FWRV9SRVNFUlZFRCAgICAgMHhGQyAgICAvKiBTTSBQb3dlciBTYXZlIFJlc2VydmVkIGJpdHMgKi8KKworLyogdmFsdWVzIGRlZmluZWQgZm9yIFNNIFBvd2VyIFNhdmUgTW9kZSBiaXQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FfSFRfU01QT1dFUlNBVkVfU1RBVElDICAgICAgIDB4MDAgICAgLyogU3RhdGljLCBTTSBwYWNrZXRzIG5vdCBvayAqLworI2RlZmluZSBJRUVFODAyMTFfQV9IVF9TTVBPV0VSU0FWRV9EWU5BTUlDICAgICAgMHgwMiAgICAvKiBEeW5hbWljLCBTTSBwYWNrZXRzIG9rIGlmIHByZWNlZGVkIGJ5IFJUUyAqLworCisvKiBETFMgYWN0aW9ucyAqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0RMU19SRVFVRVNUICAgICAgICAgICAgMAorI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0RMU19SRVNQT05TRSAgICAgICAgICAgMQorI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0RMU19URUFSRE9XTiAgICAgICAgICAgMgorCitzdHJ1Y3QgaWVlZTgwMjExX2Rsc19yZXF1ZXN0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbiBoZHI7CisJdWludDhfdCBkc3RfYWRkcltJRUVFODAyMTFfQUREUl9MRU5dOworCXVpbnQ4X3Qgc3JjX2FkZHJbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50MTZfdCBjYXBhX2luZm87CisJdWludDE2X3QgdGltZW91dDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpZWVlODAyMTFfZGxzX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbiBoZHI7CisJdWludDE2X3Qgc3RhdHVzY29kZTsKKwl1aW50OF90IGRzdF9hZGRyW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBzcmNfYWRkcltJRUVFODAyMTFfQUREUl9MRU5dOworfSBfX3BhY2tlZDsKKworLyogQkEgYWN0aW9ucyAqLworI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0JBX0FEREJBX1JFUVVFU1QgICAgICAgMCAgICAgICAvKiBBRERCQSByZXF1ZXN0ICovCisjZGVmaW5lIElFRUU4MDIxMV9BQ1RJT05fQkFfQUREQkFfUkVTUE9OU0UgICAgICAxICAgICAgIC8qIEFEREJBIHJlc3BvbnNlICovCisjZGVmaW5lIElFRUU4MDIxMV9BQ1RJT05fQkFfREVMQkEgICAgICAgICAgICAgICAyICAgICAgIC8qIERFTEJBICovCisKK3N0cnVjdCBpZWVlODAyMTFfYmFfcGFyYW1ldGVyc2V0IHsKKyNpZiBfQllURV9PUkRFUiA9PSBfQklHX0VORElBTgorCXVpbnQxNl90IGJ1ZmZlcnNpemUgOiAxMCwgLyogQjYtMTUgIGJ1ZmZlciBzaXplICovCisJCSB0aWQgOiA0LCAgICAgICAvKiBCMi01ICAgVElEICovCisJCSBiYXBvbGljeSA6IDEsICAvKiBCMSAgIGJsb2NrIGFjayBwb2xpY3kgKi8KKwkJIGFtc2R1c3VwcG9ydGVkIDogMTsgLyogQjAgICBhbXNkdSBzdXBwb3J0ZWQgKi8KKyNlbHNlCisJdWludDE2X3QgYW1zZHVzdXBwb3J0ZWQgOiAxLCAgICAgIC8qIEIwICAgYW1zZHUgc3VwcG9ydGVkICovCisJCSBiYXBvbGljeSA6IDEsICAvKiBCMSAgIGJsb2NrIGFjayBwb2xpY3kgKi8KKwkJIHRpZCA6IDQsICAgICAgIC8qIEIyLTUgICBUSUQgKi8KKwkJIGJ1ZmZlcnNpemUgOiAxMDsgLyogQjYtMTUgIGJ1ZmZlciBzaXplICovCisjZW5kaWYKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgIElFRUU4MDIxMV9CQV9QT0xJQ1lfREVMQVlFRCAgICAgIDAKKyNkZWZpbmUgIElFRUU4MDIxMV9CQV9QT0xJQ1lfSU1NRURJQVRFICAgIDEKKyNkZWZpbmUgIElFRUU4MDIxMV9CQV9BTVNEVV9TVVBQT1JURUQgICAgIDEKKworc3RydWN0IGllZWU4MDIxMV9iYV9zZXFjdHJsIHsKKyNpZiBfQllURV9PUkRFUiA9PSBfQklHX0VORElBTgorCXVpbnQxNl90IHN0YXJ0c2VxbnVtIDogMTIsICAgICAgICAvKiBCNC0xNSAgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyICovCisJCSBmcmFnbnVtIDogNDsgICAvKiBCMC0zICBmcmFnbWVudCBudW1iZXIgKi8KKyNlbHNlCisJdWludDE2X3QgZnJhZ251bSA6IDQsICAgICAvKiBCMC0zICBmcmFnbWVudCBudW1iZXIgKi8KKwkJIHN0YXJ0c2VxbnVtIDogMTI7IC8qIEI0LTE1ICBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgKi8KKyNlbmRpZgorfSBfX3BhY2tlZDsKKworc3RydWN0IGllZWU4MDIxMV9kZWxiYV9wYXJhbWV0ZXJzZXQgeworI2lmIF9CWVRFX09SREVSID09IF9CSUdfRU5ESUFOCisJdWludDE2X3QgdGlkIDogNCwgICAgICAgICAvKiBCMTItMTUgIHRpZCAqLworCQkgaW5pdGlhdG9yIDogMSwgLyogQjExICAgICBpbml0aWF0b3IgKi8KKwkJIHJlc2VydmVkMCA6IDExOyAvKiBCMC0xMCAgIHJlc2VydmVkICovCisjZWxzZQorCXVpbnQxNl90IHJlc2VydmVkMCA6IDExLCAgLyogQjAtMTAgICByZXNlcnZlZCAqLworCQkgaW5pdGlhdG9yIDogMSwgLyogQjExICAgICBpbml0aWF0b3IgKi8KKwkJIHRpZCA6IDQ7ICAgICAgIC8qIEIxMi0xNSAgdGlkICovCisjZW5kaWYKK30gX19wYWNrZWQ7CisKKy8qIEJBIC0gQUREQkEgcmVxdWVzdCAqLworc3RydWN0IGllZWU4MDIxMV9hY3Rpb25fYmFfYWRkYmFyZXF1ZXN0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbiBycV9oZWFkZXI7CisJdWludDhfdCBycV9kaWFsb2d0b2tlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2JhX3BhcmFtZXRlcnNldCBycV9iYXBhcmFtc2V0OworCXVpbnQxNl90IHJxX2JhdGltZW91dDsgIC8qIGluIFRVcyAqLworCXN0cnVjdCBpZWVlODAyMTFfYmFfc2VxY3RybCBycV9iYXNlcXVlbmNlY3RybDsKK30gX19wYWNrZWQ7CisKKy8qIEJBIC0gQUREQkEgcmVzcG9uc2UgKi8KK3N0cnVjdCBpZWVlODAyMTFfYWN0aW9uX2JhX2FkZGJhcmVzcG9uc2UgeworCXN0cnVjdCBpZWVlODAyMTFfYWN0aW9uIHJzX2hlYWRlcjsKKwl1aW50OF90IHJzX2RpYWxvZ3Rva2VuOworCXVpbnQxNl90IHJzX3N0YXR1c2NvZGU7CisJc3RydWN0IGllZWU4MDIxMV9iYV9wYXJhbWV0ZXJzZXQgcnNfYmFwYXJhbXNldDsKKwl1aW50MTZfdCByc19iYXRpbWVvdXQ7ICAvKiBpbiBUVXMgKi8KK30gX19wYWNrZWQ7CisKKy8qIEJBIC0gREVMQkEgKi8KK3N0cnVjdCBpZWVlODAyMTFfYWN0aW9uX2JhX2RlbGJhIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbiBkbF9oZWFkZXI7CisJc3RydWN0IGllZWU4MDIxMV9kZWxiYV9wYXJhbWV0ZXJzZXQgZGxfZGVsYmFwYXJhbXNldDsKKwl1aW50MTZfdCBkbF9yZWFzb25jb2RlOworfSBfX3BhY2tlZDsKKworLyogTUdUIE5vdGlmIGFjdGlvbnMgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1dNTV9RT1NfQUNUSU9OX1NFVFVQX1JFUSAgICAwCisjZGVmaW5lIElFRUU4MDIxMV9XTU1fUU9TX0FDVElPTl9TRVRVUF9SRVNQICAgMQorI2RlZmluZSBJRUVFODAyMTFfV01NX1FPU19BQ1RJT05fVEVBUkRPV04gICAgIDIKKworI2RlZmluZSBJRUVFODAyMTFfV01NX1FPU19ESUFMT0dfVEVBUkRPV04gICAgIDAKKyNkZWZpbmUgSUVFRTgwMjExX1dNTV9RT1NfRElBTE9HX1NFVFVQICAgICAgICAxCisKKyNkZWZpbmUgSUVFRTgwMjExX1dNTV9RT1NfVFNJRF9EQVRBX1RTUEVDICAgICA2CisjZGVmaW5lIElFRUU4MDIxMV9XTU1fUU9TX1RTSURfU0lHX1RTUEVDICAgICAgNworCitzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbl93bW1fcW9zIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbiB0c19oZWFkZXI7CisJdWludDhfdCB0c19kaWFsb2d0b2tlbjsKKwl1aW50OF90IHRzX3N0YXR1c2NvZGU7CisJc3RydWN0IGllZWU4MDIxMV93bWVfdHNwZWMgdHNfdHNwZWNpZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBDb250cm9sIGZyYW1lcy4KKyAqLworc3RydWN0IGllZWU4MDIxMV9mcmFtZV9taW4geworCXVpbnQ4X3QgaV9mY1syXTsKKwl1aW50OF90IGlfZHVyWzJdOworCXVpbnQ4X3QgaV9hZGRyMVtJRUVFODAyMTFfQUREUl9MRU5dOworCXVpbnQ4X3QgaV9hZGRyMltJRUVFODAyMTFfQUREUl9MRU5dOworCS8qIEZDUyAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIEJBUiBmcmFtZSBmb3JtYXQKKyAqLworI2RlZmluZSBJRUVFODAyMTFfQkFSX0NUTF9USURfTSAgICAgMHhGMDAwICAgICAgLyogdGlkIG1hc2sgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0JBUl9DVExfVElEX1MgICAgICAgICAxMiAgICAgIC8qIHRpZCBzaGlmdCAgICAgICAgICAgICovCisjZGVmaW5lIElFRUU4MDIxMV9CQVJfQ1RMX05PQUNLICAgICAweDAwMDEgICAgICAvKiBuby1hY2sgcG9saWN5ICAgICAgICAqLworI2RlZmluZSBJRUVFODAyMTFfQkFSX0NUTF9DT01CQSAgICAgMHgwMDA0ICAgICAgLyogY29tcHJlc3NlZCBibG9jay1hY2sgKi8KKworLyoKKyAqIFNBIFF1ZXJ5IEFjdGlvbiBtZ210IEZyYW1lCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfYWN0aW9uX3NhX3F1ZXJ5IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbiBzYV9oZWFkZXI7CisJdWludDE2X3Qgc2FfdHJhbnNJZDsKK307CisKK3R5cGVkZWYgZW51bSBpZWVlODAyMTFfYWN0aW9uX3NhX3F1ZXJ5X3R5cGUgeworCUlFRUU4MDIxMV9BQ1RJT05fU0FfUVVFUllfUkVRVUVTVCwKKwlJRUVFODAyMTFfQUNUSU9OX1NBX1FVRVJZX1JFU1BPTlNFCit9IGllZWU4MDIxMV9hY3Rpb25fc2FfcXVlcnlfdHlwZV90OworCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX2JhciB7CisJdWludDhfdCBpX2ZjWzJdOworCXVpbnQ4X3QgaV9kdXJbMl07CisJdWludDhfdCBpX3JhW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBpX3RhW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDE2X3QgaV9jdGw7CisJdWludDE2X3QgaV9zZXE7CisJLyogRkNTICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX3J0cyB7CisJdWludDhfdCBpX2ZjWzJdOworCXVpbnQ4X3QgaV9kdXJbMl07CisJdWludDhfdCBpX3JhW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBpX3RhW0lFRUU4MDIxMV9BRERSX0xFTl07CisJLyogRkNTICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX2N0cyB7CisJdWludDhfdCBpX2ZjWzJdOworCXVpbnQ4X3QgaV9kdXJbMl07CisJdWludDhfdCBpX3JhW0lFRUU4MDIxMV9BRERSX0xFTl07CisJLyogRkNTICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX2FjayB7CisJdWludDhfdCBpX2ZjWzJdOworCXVpbnQ4X3QgaV9kdXJbMl07CisJdWludDhfdCBpX3JhW0lFRUU4MDIxMV9BRERSX0xFTl07CisJLyogRkNTICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX3BzcG9sbCB7CisJdWludDhfdCBpX2ZjWzJdOworCXVpbnQ4X3QgaV9haWRbMl07CisJdWludDhfdCBpX2Jzc2lkW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBpX3RhW0lFRUU4MDIxMV9BRERSX0xFTl07CisJLyogRkNTICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX2NmZW5kIHsgIC8qIE5COiBhbHNvIENGLUVuZCtDRi1BY2sgKi8KKwl1aW50OF90IGlfZmNbMl07CisJdWludDhfdCBpX2R1clsyXTsgICAgICAgLyogc2hvdWxkIGJlIHplcm8gKi8KKwl1aW50OF90IGlfcmFbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGlfYnNzaWRbSUVFRTgwMjExX0FERFJfTEVOXTsKKwkvKiBGQ1MgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBCRUFDT04gbWFuYWdlbWVudCBwYWNrZXRzCisgKgorICogIG9jdGV0IHRpbWVzdGFtcFs4XQorICogIG9jdGV0IGJlYWNvbiBpbnRlcnZhbFsyXQorICogIG9jdGV0IGNhcGFiaWxpdHkgaW5mb3JtYXRpb25bMl0KKyAqICBpbmZvcm1hdGlvbiBlbGVtZW50CisgKiAgICAgIG9jdGV0IGVsZW1pZAorICogICAgICBvY3RldCBsZW5ndGgKKyAqICAgICAgb2N0ZXQgaW5mb3JtYXRpb25bbGVuZ3RoXQorICovCisKK3R5cGVkZWYgdWludDhfdCAqaWVlZTgwMjExX21ndF9iZWFjb25fdDsKKworI2RlZmluZSBJRUVFODAyMTFfQkVBQ09OX0lOVEVSVkFMKGJlYWNvbikgXAorCSgoYmVhY29uKVs4XSB8ICgoYmVhY29uKVs5XSA8PCA4KSkKKyNkZWZpbmUgSUVFRTgwMjExX0JFQUNPTl9DQVBBQklMSVRZKGJlYWNvbikgXAorCSgoYmVhY29uKVsxMF0gfCAoKGJlYWNvbilbMTFdIDw8IDgpKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQVBJTkZPX0VTUyAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBJRUVFODAyMTFfQ0FQSU5GT19JQlNTICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSUVFRTgwMjExX0NBUElORk9fQ0ZfUE9MTEFCTEUgICAgICAgMHgwMDA0CisjZGVmaW5lIElFRUU4MDIxMV9DQVBJTkZPX0NGX1BPTExSRVEgICAgICAgIDB4MDAwOAorI2RlZmluZSBJRUVFODAyMTFfQ0FQSU5GT19QUklWQUNZICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX0NBUElORk9fU0hPUlRfUFJFQU1CTEUgICAgMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9DQVBJTkZPX1BCQ0MgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfQ0FQSU5GT19DSE5MX0FHSUxJVFkgICAgICAweDAwODAKKyNkZWZpbmUgSUVFRTgwMjExX0NBUElORk9fU1BFQ1RSVU1fTUdNVCAgICAgMHgwMTAwCisjZGVmaW5lIElFRUU4MDIxMV9DQVBJTkZPX1FPUyAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBJRUVFODAyMTFfQ0FQSU5GT19TSE9SVF9TTE9UVElNRSAgICAweDA0MDAKKyNkZWZpbmUgSUVFRTgwMjExX0NBUElORk9fQVBTRCAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIElFRUU4MDIxMV9DQVBJTkZPX1JBRElPTUVBUyAgICAgICAgIDB4MTAwMAorI2RlZmluZSBJRUVFODAyMTFfQ0FQSU5GT19EU1NTT0ZETSAgICAgICAgICAweDIwMDAKKy8qIGJpdHMgMTQtMTUgYXJlIHJlc2VydmVkICovCisKKy8qCisgKiA4MDIuMTFpL1dQQSBpbmZvcm1hdGlvbiBlbGVtZW50IChtYXhpbWFsbHkgc2l6ZWQpLgorICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX3dwYSB7CisJdWludDhfdCB3cGFfaWQ7ICAgICAgICAgLyogSUVFRTgwMjExX0VMRU1JRF9WRU5ET1IgKi8KKwl1aW50OF90IHdwYV9sZW47ICAgICAgICAvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1aW50OF90IHdwYV9vdWlbM107ICAgICAvKiAweDAwLCAweDUwLCAweGYyICovCisJdWludDhfdCB3cGFfdHlwZTsgICAgICAgLyogT1VJIHR5cGUgKi8KKwl1aW50MTZfdCB3cGFfdmVyc2lvbjsgICAvKiBzcGVjIHJldmlzaW9uICovCisJdWludDMyX3Qgd3BhX21jaXBoZXJbMV07ICAgICAgICAvKiBtdWx0aWNhc3QvZ3JvdXAga2V5IGNpcGhlciAqLworCXVpbnQxNl90IHdwYV91Y2lwaGVyY250OyAgICAgICAgLyogIyBwYWlyd2lzZSBrZXkgY2lwaGVycyAqLworCXVpbnQzMl90IHdwYV91Y2lwaGVyc1s4XTsgICAgICAgLyogY2lwaGVycyAqLworCXVpbnQxNl90IHdwYV9hdXRoc2VsY250OyAgICAgICAgLyogYXV0aGVudGljYXRpb24gc2VsZWN0b3IgY250ICovCisJdWludDMyX3Qgd3BhX2F1dGhzZWxzWzhdOyAgICAgICAvKiBzZWxlY3RvcnMgKi8KKwl1aW50MTZfdCB3cGFfY2FwczsgICAgICAvKiA4MDIuMTFpIGNhcGFiaWxpdGllcyAqLworCXVpbnQxNl90IHdwYV9wbWtpZGNudDsgIC8qIDgwMi4xMWkgcG1raWQgY291bnQgKi8KKwl1aW50MTZfdCB3cGFfcG1raWRzWzhdOyAvKiA4MDIuMTFpIHBta2lkcyAqLworfSBfX3BhY2tlZDsKKworI2lmbmRlZiBfQllURV9PUkRFUgorI2Vycm9yICJEb24ndCBrbm93IG5hdGl2ZSBieXRlIG9yZGVyIgorI2VuZGlmCisKKyNpZm5kZWYgSUVFRTgwMjExTl9JRQorLyogVGVtcG9yYXJ5IHZlbmRvciBzcGVjaWZpYyBJRSBmb3IgMTFuIHByZS1zdGFuZGFyZCBpbnRlcm9wZXJhYmlsaXR5ICovCisjZGVmaW5lIFZFTkRPUl9IVF9PVUkgICAgICAgMHgwMDkwNGMKKyNkZWZpbmUgVkVORE9SX0hUX0NBUF9JRCAgICA1MQorI2RlZmluZSBWRU5ET1JfSFRfSU5GT19JRCAgIDUyCisjZW5kaWYKKworI2lmZGVmIEFUSF9TVVBQT1JUX1R4QkYKK3VuaW9uIGllZWU4MDIxMV9oY190eGJmIHsKKwlzdHJ1Y3QgeworI2lmIF9CWVRFX09SREVSID09IF9CSUdfRU5ESUFOCisJCXVpbnQzMl90IHJlc2VydmVkIDogMywKKwkJCSBjaGFubmVsX2VzdGltYXRpb25fY2FwIDogMiwKKwkJCSBjc2lfbWF4X3Jvd3NfYmZlciA6IDIsCisJCQkgY29tcF9iZmVyX2FudGVubmFzIDogMiwKKwkJCSBub25jb21wX2JmZXJfYW50ZW5uYXMgOiAyLAorCQkJIGNzaV9iZmVyX2FudGVubmFzIDogMiwKKwkJCSBtaW5pbWFsX2dyb3VwaW5nIDogMiwKKwkJCSBleHBsaWNpdF9jb21wX2JmIDogMiwKKwkJCSBleHBsaWNpdF9ub25jb21wX2JmIDogMiwKKwkJCSBleHBsaWNpdF9jc2lfZmVlZGJhY2sgOiAyLAorCQkJIGV4cGxpY2l0X2NvbXBfc3RlZXJpbmcgOiAxLAorCQkJIGV4cGxpY2l0X25vbmNvbXBfc3RlZXJpbmcgOiAxLAorCQkJIGV4cGxpY2l0X2NzaV90eGJmX2NhcGFibGUgOiAxLAorCQkJIGNhbGlicmF0aW9uIDogMiwKKwkJCSBpbXBsaWNpdF90eGJmX2NhcGFibGUgOiAxLAorCQkJIHR4X25kcF9jYXBhYmxlIDogMSwKKwkJCSByeF9uZHBfY2FwYWJsZSA6IDEsCisJCQkgdHhfc3RhZ2dlcmVkX3NvdW5kaW5nIDogMSwKKwkJCSByeF9zdGFnZ2VyZWRfc291bmRpbmcgOiAxLCBpbXBsaWNpdF9yeF9jYXBhYmxlIDogMTsKKyNlbHNlCisJCXVpbnQzMl90IGltcGxpY2l0X3J4X2NhcGFibGUgOiAxLAorCQkJIHJ4X3N0YWdnZXJlZF9zb3VuZGluZyA6IDEsCisJCQkgdHhfc3RhZ2dlcmVkX3NvdW5kaW5nIDogMSwKKwkJCSByeF9uZHBfY2FwYWJsZSA6IDEsCisJCQkgdHhfbmRwX2NhcGFibGUgOiAxLAorCQkJIGltcGxpY2l0X3R4YmZfY2FwYWJsZSA6IDEsCisJCQkgY2FsaWJyYXRpb24gOiAyLAorCQkJIGV4cGxpY2l0X2NzaV90eGJmX2NhcGFibGUgOiAxLAorCQkJIGV4cGxpY2l0X25vbmNvbXBfc3RlZXJpbmcgOiAxLAorCQkJIGV4cGxpY2l0X2NvbXBfc3RlZXJpbmcgOiAxLAorCQkJIGV4cGxpY2l0X2NzaV9mZWVkYmFjayA6IDIsCisJCQkgZXhwbGljaXRfbm9uY29tcF9iZiA6IDIsCisJCQkgZXhwbGljaXRfY29tcF9iZiA6IDIsCisJCQkgbWluaW1hbF9ncm91cGluZyA6IDIsCisJCQkgY3NpX2JmZXJfYW50ZW5uYXMgOiAyLAorCQkJIG5vbmNvbXBfYmZlcl9hbnRlbm5hcyA6IDIsCisJCQkgY29tcF9iZmVyX2FudGVubmFzIDogMiwKKwkJCSBjc2lfbWF4X3Jvd3NfYmZlciA6IDIsIGNoYW5uZWxfZXN0aW1hdGlvbl9jYXAgOiAyLCByZXNlcnZlZCA6IDM7CisjZW5kaWYKKwl9OworCisJdWludDMyX3QgdmFsdWU7Cit9IF9fcGFja2VkOworI2VuZGlmCisKK3N0cnVjdCBpZWVlODAyMTFfaWVfaHRjYXBfY21uIHsKKwl1aW50MTZfdCBoY19jYXA7ICAgICAgICAvKiBIVCBjYXBhYmlsaXRpZXMgKi8KKyNpZiBfQllURV9PUkRFUiA9PSBfQklHX0VORElBTgorCXVpbnQ4X3QgaGNfcmVzZXJ2ZWQgOiAzLCAgLyogQjUtNyByZXNlcnZlZCAqLworCQloY19tcGR1ZGVuc2l0eSA6IDMsIC8qIEIyLTQgTVBEVSBkZW5zaXR5IChha2EgTWluaW11bSBNUERVIFN0YXJ0IFNwYWNpbmcpICovCisJCWhjX21heGFtcGR1IDogMjsgLyogQjAtMSBtYXhpbXVtIHJ4IEEtTVBEVSBmYWN0b3IgKi8KKyNlbHNlCisJdWludDhfdCBoY19tYXhhbXBkdSA6IDIsICAvKiBCMC0xIG1heGltdW0gcnggQS1NUERVIGZhY3RvciAqLworCQloY19tcGR1ZGVuc2l0eSA6IDMsIC8qIEIyLTQgTVBEVSBkZW5zaXR5IChha2EgTWluaW11bSBNUERVIFN0YXJ0IFNwYWNpbmcpICovCisJCWhjX3Jlc2VydmVkIDogMzsgLyogQjUtNyByZXNlcnZlZCAqLworI2VuZGlmCisJdWludDhfdCBoY19tY3NzZXRbMTZdOyAgLyogc3VwcG9ydGVkIE1DUyBzZXQgKi8KKwl1aW50MTZfdCBoY19leHRjYXA7ICAgICAvKiBleHRlbmRlZCBIVCBjYXBhYmlsaXRpZXMgKi8KKyNpZmRlZiBBVEhfU1VQUE9SVF9UeEJGCisJdW5pb24gaWVlZTgwMjExX2hjX3R4YmYgaGNfdHhiZjsgICAgICAgIC8qIHR4YmYgY2FwYWJpbGl0aWVzICovCisjZWxzZQorCXVpbnQzMl90IGhjX3R4YmY7ICAgICAgIC8qIHR4YmYgY2FwYWJpbGl0aWVzICovCisjZW5kaWYKKwl1aW50OF90IGhjX2FudGVubmE7ICAgICAvKiBhbnRlbm5hIGNhcGFiaWxpdGllcyAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIDgwMi4xMW4gSFQgQ2FwYWJpbGl0eSBJRQorICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX2h0Y2FwIHsKKwl1aW50OF90IGhjX2lkOyAgICAgICAgICAvKiBlbGVtZW50IElEICovCisJdWludDhfdCBoY19sZW47ICAgICAgICAgLyogbGVuZ3RoIGluIGJ5dGVzICovCisJc3RydWN0IGllZWU4MDIxMV9pZV9odGNhcF9jbW4gaGNfaWU7Cit9IF9fcGFja2VkOworCisvKgorICogVGVtcG9yYXJ5IHZlbmRvciBwcml2YXRlIEhUIENhcGFiaWxpdHkgSUUKKyAqLworc3RydWN0IHZlbmRvcl9pZV9odGNhcCB7CisJdWludDhfdCBoY19pZDsgICAgICAgICAgLyogZWxlbWVudCBJRCAqLworCXVpbnQ4X3QgaGNfbGVuOyAgICAgICAgIC8qIGxlbmd0aCBpbiBieXRlcyAqLworCXVpbnQ4X3QgaGNfb3VpWzNdOworCXVpbnQ4X3QgaGNfb3VpdHlwZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2llX2h0Y2FwX2NtbiBoY19pZTsKK30gX19wYWNrZWQ7CisKKy8qIEhUIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0hUQ0FQX0NfQURWQ09ESU5HICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBJRUVFODAyMTFfSFRDQVBfQ19DSFdJRFRINDAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9DX1NNUE9XRVJTQVZFX1NUQVRJQyAgICAweDAwMDAgIC8qIENhcGFibGUgb2YgU00gUG93ZXIgU2F2ZSAoU3RhdGljKSAqLworI2RlZmluZSBJRUVFODAyMTFfSFRDQVBfQ19TTVBPV0VSU0FWRV9EWU5BTUlDICAgMHgwMDA0ICAvKiBDYXBhYmxlIG9mIFNNIFBvd2VyIFNhdmUgKER5bmFtaWMpICovCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9DX1NNX1JFU0VSVkVEICAgICAgICAgICAweDAwMDggIC8qIFJlc2VydmVkICovCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9DX1NNX0VOQUJMRUQgICAgICAgICAgICAweDAwMGMgIC8qIFNNIGVuYWJsZWQsIG5vIFNNIFBvd2VyIFNhdmUgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0hUQ0FQX0NfR1JFRU5GSUVMRCAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfSFRDQVBfQ19TSE9SVEdJMjAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9DX1NIT1JUR0k0MCAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgSUVFRTgwMjExX0hUQ0FQX0NfVFhTVEJDICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBJRUVFODAyMTFfSFRDQVBfQ19UWFNUQkNfUyAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9DX1JYU1RCQyAgICAgICAgICAgICAgICAweDAzMDAgIC8qIDIgYml0cyAqLworI2RlZmluZSBJRUVFODAyMTFfSFRDQVBfQ19SWFNUQkNfUyAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9DX0RFTEFZRURCTEtBQ0sgICAgICAgICAweDA0MDAKKyNkZWZpbmUgSUVFRTgwMjExX0hUQ0FQX0NfTUFYQU1TRFVTSVpFICAgICAgICAgIDB4MDgwMCAgLyogMSA9IDhLLCAwID0gMzgzOUIgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0hUQ0FQX0NfRFNTU0NDSzQwICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBJRUVFODAyMTFfSFRDQVBfQ19QU01QICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9DX0lOVE9MRVJBTlQ0MCAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0hUQ0FQX0NfTFNJR1RYT1BQUk9UICAgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9DX1NNX01BU0sgICAgICAgICAgICAgICAweDAwMGMgIC8qIFNwYXRpYWwgTXVsdGlwbGV4aW5nIChTTSkgY2FwYWJpdGxpdHkgYml0bWFzayAqLworCisvKiBCMC0xIG1heGltdW0gcnggQS1NUERVIGZhY3RvciAyXigxMytNYXggUnggQS1NUERVIEZhY3RvcikgKi8KK2VudW0geworCUlFRUU4MDIxMV9IVENBUF9NQVhSWEFNUERVXzgxOTIsICAgICAgICAvKiAyIF4gMTMgKi8KKwlJRUVFODAyMTFfSFRDQVBfTUFYUlhBTVBEVV8xNjM4NCwgICAgICAgLyogMiBeIDE0ICovCisJSUVFRTgwMjExX0hUQ0FQX01BWFJYQU1QRFVfMzI3NjgsICAgICAgIC8qIDIgXiAxNSAqLworCUlFRUU4MDIxMV9IVENBUF9NQVhSWEFNUERVXzY1NTM2LCAgICAgICAvKiAyIF4gMTYgKi8KK307CisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9NQVhSWEFNUERVX0ZBQ1RPUiAgIDEzCisKKy8qIEIyLTQgTVBEVSBkZW5zaXR5ICh1c2VjKSAqLworZW51bSB7CisJSUVFRTgwMjExX0hUQ0FQX01QRFVERU5TSVRZX05BLCAvKiBObyB0aW1lIHJlc3RyaWN0aW9uICovCisJSUVFRTgwMjExX0hUQ0FQX01QRFVERU5TSVRZXzBfMjUsICAgICAgIC8qIDEvNCB1c2VjICovCisJSUVFRTgwMjExX0hUQ0FQX01QRFVERU5TSVRZXzBfNSwgICAgICAgIC8qIDEvMiB1c2VjICovCisJSUVFRTgwMjExX0hUQ0FQX01QRFVERU5TSVRZXzEsICAvKiAxIHVzZWMgKi8KKwlJRUVFODAyMTFfSFRDQVBfTVBEVURFTlNJVFlfMiwgIC8qIDIgdXNlYyAqLworCUlFRUU4MDIxMV9IVENBUF9NUERVREVOU0lUWV80LCAgLyogNCB1c2VjICovCisJSUVFRTgwMjExX0hUQ0FQX01QRFVERU5TSVRZXzgsICAvKiA4IHVzZWMgKi8KKwlJRUVFODAyMTFfSFRDQVBfTVBEVURFTlNJVFlfMTYsIC8qIDE2IHVzZWMgKi8KK307CisKKy8qIEhUIGV4dGVuZGVkIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0hUQ0FQX0VYVENfUENPICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBJRUVFODAyMTFfSFRDQVBfRVhUQ19UUkFOU19USU1FX1JTVkQgICAgMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9FWFRDX1RSQU5TX1RJTUVfNDAwICAgICAweDAwMDIgIC8qIDIwLTQwIHN3aXRjaCB0aW1lICovCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9FWFRDX1RSQU5TX1RJTUVfMTUwMCAgICAweDAwMDQgIC8qIGluIHVzICAgICAgICAgICAgICovCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9FWFRDX1RSQU5TX1RJTUVfNTAwMCAgICAweDAwMDYKKyNkZWZpbmUgSUVFRTgwMjExX0hUQ0FQX0VYVENfUlNWRF8xICAgICAgICAgICAgIDB4MDBmOAorI2RlZmluZSBJRUVFODAyMTFfSFRDQVBfRVhUQ19NQ1NfRkVFREJBQ0tfTk9ORSAgMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9FWFRDX01DU19GRUVEQkFDS19SU1ZEICAweDAxMDAKKyNkZWZpbmUgSUVFRTgwMjExX0hUQ0FQX0VYVENfTUNTX0ZFRURCQUNLX1VOU09MIDB4MDIwMAorI2RlZmluZSBJRUVFODAyMTFfSFRDQVBfRVhUQ19NQ1NfRkVFREJBQ0tfRlVMTCAgMHgwMzAwCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9FWFRDX1JTVkRfMiAgICAgICAgICAgICAweGZjMDAKKyNpZmRlZiBBVEhfU1VQUE9SVF9UeEJGCisjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9FWFRDX0hUQ19TVVBQT1JUICAgICAgICAweDA0MDAKKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX2llX2h0aW5mb19jbW4geworCXVpbnQ4X3QgaGlfY3RybGNoYW5uZWw7IC8qIGNvbnRyb2wgY2hhbm5lbCAqLworI2lmIF9CWVRFX09SREVSID09IF9CSUdfRU5ESUFOCisJdWludDhfdCBoaV9zZXJ2aWNlaW50ZXJ2YWwgOiAzLCAgIC8qIEI1LTcgc3ZjIGludGVydmFsIGdyYW51bGFyaXR5ICovCisJCWhpX2N0cmxhY2Nlc3MgOiAxLCAvKiBCNCAgIGNvbnRyb2xsZWQgYWNjZXNzIG9ubHkgKi8KKwkJaGlfcmlmc21vZGUgOiAxLCAvKiBCMyAgIHJpZnMgbW9kZSAqLworCQloaV90eGNod2lkdGggOiAxLCAvKiBCMiAgIHJlY29tbWVuZGVkIHhtaXNzIHdpZHRoIHNldCAqLworCQloaV9leHRjaG9mZiA6IDI7IC8qIEIwLTEgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0ICovCisKKy8qCisKKyAqIFRoZSBmb2xsb3dpbmcgMiBjb25zZWN1dGl2ZSBieXRlcyBhcmUgZGVmaW5lZCBpbiB3b3JkIGluIDgwMjExbiBzcGVjLgorCisgKiBTb21lIHByb2Nlc3NvcnMgc3RvcmUgTVNCIGJ5dGUgaW50byBsb3dlciBtZW1vcnkgYWRkcmVzcyB3aGljaCBjYXVzZXMgd3JvbmcKKworICogd3JvbmcgYnl0ZSBzZXF1ZW5jZSBpbiBiZWFjb24uIFRodXMgd2UgYnJlYWsgaW50byBieXRlIGRlZmluaXRpb24gd2hpY2ggc2hvdWxkCisKKyAqIGF2b2lkIHRoZSBwcm9ibGVtIGZvciBhbGwgcHJvY2Vzc29ycworCisgKi8KKworCXVpbnQ4X3QgaGlfcmVzZXJ2ZWQzIDogMywgLyogQjUtNyByZXNlcnZlZCAqLworCQloaV9vYnNzbm9uaHRwcmVzZW50IDogMSwgLyogQjQgICBPQlNTIG5vbi1IVCBTVEEgcHJlc2VudCAqLworCQloaV90eGJ1cnN0bGltaXQgOiAxLCAvKiBCMyAgIHRyYW5zbWl0IGJ1cnN0IGxpbWl0ICovCisJCWhpX25vbmdmcHJlc2VudCA6IDEsIC8qIEIyICAgbm9uIGdyZWVuZmllbGQgZGV2aWNlcyBwcmVzZW50ICovCisJCWhpX29wbW9kZSA6IDI7ICAvKiBCMC0xIG9wZXJhdGluZyBtb2RlICovCisKKwl1aW50OF90IGhpX3Jlc2VydmVkMDsgICAvKiBCMC03IChCOC0xNSBpbiAxMW4pIHJlc2VydmVkICovCisKKy8qIFRoZSBmb2xsb3dpbmcgMiBjb25zZWN1dGl2ZSBieXRlcyBhcmUgZGVmaW5lZCBpbiB3b3JkIGluIDgwMjExbiBzcGVjLiAqLworCisJdWludDhfdCBoaV9kdWFsY3RzcHJvdCA6IDEsICAgICAgIC8qIEI3ICAgZHVhbCBDVFMgcHJvdGVjdGlvbiAqLworCQloaV9kdWFsYmVhY29uIDogMSwgLyogQjYgICBkdWFsIGJlYWNvbiAqLworCQloaV9yZXNlcnZlZDIgOiA2OyAvKiBCMC01IHJlc2VydmVkICovCisJdWludDhfdCBoaV9yZXNlcnZlZDEgOiA0LCAvKiBCNC03IChCMTItMTUgaW4gMTFuKSByZXNlcnZlZCAqLworCQloaV9wY29waGFzZSA6IDEsIC8qIEIzICAgKEIxMSBpbiAxMW4pICBwY28gcGhhc2UgKi8KKwkJaGlfcGNvYWN0aXZlIDogMSwgLyogQjIgICAoQjEwIGluIDExbikgIHBjbyBhY3RpdmUgKi8KKwkJaGlfbHNpZ3R4b3Bwcm90IDogMSwgLyogQjEgICAoQjkgaW4gMTFuKSAgIGwtc2lnIHR4b3AgcHJvdGVjdGlvbiBmdWxsIHN1cHBvcnQgKi8KKwkJaGlfc3RiY2JlYWNvbiA6IDE7IC8qIEIwICAgKEI4IGluIDExbikgICBTVEJDIGJlYWNvbiAqLworI2Vsc2UKKwl1aW50OF90IGhpX2V4dGNob2ZmIDogMiwgIC8qIEIwLTEgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0ICovCisJCWhpX3R4Y2h3aWR0aCA6IDEsIC8qIEIyICAgcmVjb21tZW5kZWQgeG1pc3Mgd2lkdGggc2V0ICovCisJCWhpX3JpZnNtb2RlIDogMSwgLyogQjMgICByaWZzIG1vZGUgKi8KKwkJaGlfY3RybGFjY2VzcyA6IDEsIC8qIEI0ICAgY29udHJvbGxlZCBhY2Nlc3Mgb25seSAqLworCQloaV9zZXJ2aWNlaW50ZXJ2YWwgOiAzOyAvKiBCNS03IHN2YyBpbnRlcnZhbCBncmFudWxhcml0eSAqLworCXVpbnQxNl90IGhpX29wbW9kZSA6IDIsICAgLyogQjAtMSBvcGVyYXRpbmcgbW9kZSAqLworCQkgaGlfbm9uZ2ZwcmVzZW50IDogMSwgLyogQjIgICBub24gZ3JlZW5maWVsZCBkZXZpY2VzIHByZXNlbnQgKi8KKwkJIGhpX3R4YnVyc3RsaW1pdCA6IDEsIC8qIEIzICAgdHJhbnNtaXQgYnVyc3QgbGltaXQgKi8KKwkJIGhpX29ic3Nub25odHByZXNlbnQgOiAxLCAvKiBCNCAgIE9CU1Mgbm9uLUhUIFNUQSBwcmVzZW50ICovCisJCSBoaV9yZXNlcnZlZDAgOiAxMTsgLyogQjUtMTUgcmVzZXJ2ZWQgKi8KKwl1aW50MTZfdCBoaV9yZXNlcnZlZDIgOiA2LCAgICAgICAgLyogQjAtNSByZXNlcnZlZCAqLworCQkgaGlfZHVhbGJlYWNvbiA6IDEsIC8qIEI2ICAgZHVhbCBiZWFjb24gKi8KKwkJIGhpX2R1YWxjdHNwcm90IDogMSwgLyogQjcgICBkdWFsIENUUyBwcm90ZWN0aW9uICovCisJCSBoaV9zdGJjYmVhY29uIDogMSwgLyogQjggICBTVEJDIGJlYWNvbiAqLworCQkgaGlfbHNpZ3R4b3Bwcm90IDogMSwgLyogQjkgICBsLXNpZyB0eG9wIHByb3RlY3Rpb24gZnVsbCBzdXBwb3J0ICovCisJCSBoaV9wY29hY3RpdmUgOiAxLCAvKiBCMTAgIHBjbyBhY3RpdmUgKi8KKwkJIGhpX3Bjb3BoYXNlIDogMSwgLyogQjExICBwY28gcGhhc2UgKi8KKwkJIGhpX3Jlc2VydmVkMSA6IDQ7IC8qIEIxMi0xNSByZXNlcnZlZCAqLworI2VuZGlmCisJdWludDhfdCBoaV9iYXNpY21jc3NldFsxNl07ICAgICAvKiBiYXNpYyBNQ1Mgc2V0ICovCit9IF9fcGFja2VkOworCisvKgorICogODAyLjExbiBIVCBJbmZvcm1hdGlvbiBJRQorICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX2h0aW5mbyB7CisJdWludDhfdCBoaV9pZDsgICAgICAgICAgLyogZWxlbWVudCBJRCAqLworCXVpbnQ4X3QgaGlfbGVuOyAgICAgICAgIC8qIGxlbmd0aCBpbiBieXRlcyAqLworCXN0cnVjdCBpZWVlODAyMTFfaWVfaHRpbmZvX2NtbiBoaV9pZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBUZW1wb3JhcnkgdmVuZG9yIHByaXZhdGUgSFQgSW5mb3JtYXRpb24gSUUKKyAqLworc3RydWN0IHZlbmRvcl9pZV9odGluZm8geworCXVpbnQ4X3QgaGlfaWQ7ICAgICAgICAgIC8qIGVsZW1lbnQgSUQgKi8KKwl1aW50OF90IGhpX2xlbjsgICAgICAgICAvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1aW50OF90IGhpX291aVszXTsKKwl1aW50OF90IGhpX291aXR5cGU7CisJc3RydWN0IGllZWU4MDIxMV9pZV9odGluZm9fY21uIGhpX2llOworfSBfX3BhY2tlZDsKKworLyogZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0ICgyIGJpdCBzaWduZWQgbnVtYmVyKSAqLworZW51bSB7CisJSUVFRTgwMjExX0hUSU5GT19FWFRPRkZTRVRfTkEgPSAwLCAgICAgIC8qIDAgIG5vIGV4dGVuc2lvbiBjaGFubmVsIGlzIHByZXNlbnQgKi8KKwlJRUVFODAyMTFfSFRJTkZPX0VYVE9GRlNFVF9BQk9WRSA9IDEsICAgLyogKzEgZXh0ZW5zaW9uIGNoYW5uZWwgYWJvdmUgY29udHJvbCBjaGFubmVsICovCisJSUVFRTgwMjExX0hUSU5GT19FWFRPRkZTRVRfVU5ERUYgPSAyLCAgIC8qIC0yIHVuZGVmaW5lZCAqLworCUlFRUU4MDIxMV9IVElORk9fRVhUT0ZGU0VUX0JFTE9XID0gMyAgICAvKiAtMSBleHRlbnNpb24gY2hhbm5lbCBiZWxvdyBjb250cm9sIGNoYW5uZWwgKi8KK307CisKKy8qIHJlY29tbWVuZGVkIHRyYW5zbWlzc2lvbiB3aWR0aCBzZXQgKi8KK2VudW0geworCUlFRUU4MDIxMV9IVElORk9fVFhXSURUSF8yMCwKKwlJRUVFODAyMTFfSFRJTkZPX1RYV0lEVEhfMjA0MAorfTsKKworLyogb3BlcmF0aW5nIGZsYWdzICovCisjZGVmaW5lIElFRUU4MDIxMV9IVElORk9fT1BNT0RFX1BVUkUgICAgICAgICAgICAgICAgMHgwMCAgICAgICAgLyogbm8gcHJvdGVjdGlvbiAqLworI2RlZmluZSBJRUVFODAyMTFfSFRJTkZPX09QTU9ERV9NSVhFRF9QUk9UX09QVCAgICAgIDB4MDEgICAgICAgIC8qIHByb3Qgb3B0aW9uYWwgKGxlZ2FjeSBkZXZpY2UgbWF5YmUgcHJlc2VudCkgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0hUSU5GT19PUE1PREVfTUlYRURfUFJPVF80MCAgICAgICAweDAyICAgICAgICAvKiBwcm90IHJlcXVpcmVkICgyMCBNSHopICovCisjZGVmaW5lIElFRUU4MDIxMV9IVElORk9fT1BNT0RFX01JWEVEX1BST1RfQUxMICAgICAgMHgwMyAgICAgICAgLyogcHJvdCByZXF1aXJlZCAobGVnYWN5IGRldmljZXMgcHJlc2VudCkgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0hUSU5GT19PUE1PREVfTk9OX0dGX1BSRVNFTlQgICAgICAweDA0ICAgICAgICAvKiBub24tZ3JlZW5maWVsZCBkZXZpY2VzIHByZXNlbnQgKi8KKworI2RlZmluZSBJRUVFODAyMTFfSFRJTkZPX09QTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MDMgICAgICAgIC8qIEZvciBwcm90ZWN0aW9uIDB4MDAtMHgwMyAqLworCisvKiBOb24tZ3JlZW5maWVsZCBTVEFzIHByZXNlbnQgKi8KK2VudW0geworCUlFRUU4MDIxMV9IVElORk9fTk9OX0dGX05PVF9QUkVTRU5ULCAgICAvKiBOb24tZ3JlZW5maWVsZCBTVEFzIG5vdCBwcmVzZW50ICovCisJSUVFRTgwMjExX0hUSU5GT19OT05fR0ZfUFJFU0VOVCwgICAgICAgIC8qIE5vbi1ncmVlbmZpZWxkIFNUQXMgcHJlc2VudCAqLworfTsKKworLyogVHJhbnNtaXQgQnVyc3QgTGltaXQgKi8KK2VudW0geworCUlFRUU4MDIxMV9IVElORk9fVFhCVVJTVF9VTkxJTUlURUQsICAgICAvKiBUcmFuc21pdCBCdXJzdCBpcyB1bmxpbWl0ZWQgKi8KKwlJRUVFODAyMTFfSFRJTkZPX1RYQlVSU1RfTElNSVRFRCwgICAgICAgLyogVHJhbnNtaXQgQnVyc3QgaXMgbGltaXRlZCAqLworfTsKKworLyogT0JTUyBOb24tSFQgU1RBcyBwcmVzZW50ICovCitlbnVtIHsKKwlJRUVFODAyMTFfSFRJTkZPX09CU1NfTk9OSFRfTk9UX1BSRVNFTlQsICAgICAgICAvKiBPQlNTIE5vbi1IVCBTVEFzIG5vdCBwcmVzZW50ICovCisJSUVFRTgwMjExX0hUSU5GT19PQlNTX05PTkhUX1BSRVNFTlQsICAgIC8qIE9CU1MgTm9uLUhUIFNUQXMgcHJlc2VudCAqLworfTsKKworLyogbWlzYyBmbGFncyAqLworI2RlZmluZSBJRUVFODAyMTFfSFRJTkZPX0RVQUxCRUFDT04gICAgICAgICAgICAgICAweDAwNDAgICAgICAgIC8qIEI2ICAgZHVhbCBiZWFjb24gKi8KKyNkZWZpbmUgSUVFRTgwMjExX0hUSU5GT19EVUFMQ1RTUFJPVCAgICAgICAgICAgICAgMHgwMDgwICAgICAgICAvKiBCNyAgIGR1YWwgc3RiYyBwcm90ZWN0aW9uICovCisjZGVmaW5lIElFRUU4MDIxMV9IVElORk9fU1RCQ0JFQUNPTiAgICAgICAgICAgICAgIDB4MDEwMCAgICAgICAgLyogQjggICBzZWNvbmRhcnkgYmVhY29uICovCisjZGVmaW5lIElFRUU4MDIxMV9IVElORk9fTFNJR1RYT1BQUk9UICAgICAgICAgICAgIDB4MDIwMCAgICAgICAgLyogQjkgICBsc2lnIHR4b3AgcHJvdCBmdWxsIHN1cHBvcnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0hUSU5GT19QQ09BQ1RJVkUgICAgICAgICAgICAgICAgMHgwNDAwICAgICAgICAvKiBCMTAgIHBjbyBhY3RpdmUgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0hUSU5GT19QQ09QSEFTRSAgICAgICAgICAgICAgICAgMHgwODAwICAgICAgICAvKiBCMTEgIHBjbyBwaGFzZSAqLworCisvKiBTZWNvbmRhcnkgQ2hhbm5lbCBvZmZzZXQgZm9yIGZvciA0ME1IeiBkaXJlY3QgbGluayAqLworI2RlZmluZSBJRUVFODAyMTFfU0VDT05EQVJZX0NIQU5ORUxfQUJPVkUgICAgICAgICAxCisjZGVmaW5lIElFRUU4MDIxMV9TRUNPTkRBUllfQ0hBTk5FTF9CRUxPVyAgICAgICAgIDMKKworI2RlZmluZSBJRUVFODAyMTFfVERMU19DSEFOX1NYX1BST0hJQklUICAgICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIGJpdC0yIFRETFMgQ2hhbm5lbCBTd2l0Y2ggUHJvaGliaXQgKi8KKworLyogUklGUyBtb2RlICovCitlbnVtIHsKKwlJRUVFODAyMTFfSFRJTkZPX1JJRlNNT0RFX1BST0hJQklURUQsICAgLyogdXNlIG9mIHJpZnMgcHJvaGliaXRlZCAqLworCUlFRUU4MDIxMV9IVElORk9fUklGU01PREVfQUxMT1dFRCwgICAgICAvKiB1c2Ugb2YgcmlmcyBwZXJtaXR0ZWQgKi8KK307CisKKy8qCisgKiBNYW5hZ2VtZW50IGluZm9ybWF0aW9uIGVsZW1lbnQgcGF5bG9hZHMuCisgKi8KK2VudW0geworCUlFRUU4MDIxMV9FTEVNSURfU1NJRCA9IDAsCisJSUVFRTgwMjExX0VMRU1JRF9SQVRFUyA9IDEsCisJSUVFRTgwMjExX0VMRU1JRF9GSFBBUk1TID0gMiwKKwlJRUVFODAyMTFfRUxFTUlEX0RTUEFSTVMgPSAzLAorCUlFRUU4MDIxMV9FTEVNSURfQ0ZQQVJNUyA9IDQsCisJSUVFRTgwMjExX0VMRU1JRF9USU0gPSA1LAorCUlFRUU4MDIxMV9FTEVNSURfSUJTU1BBUk1TID0gNiwKKwlJRUVFODAyMTFfRUxFTUlEX0NPVU5UUlkgPSA3LAorCUlFRUU4MDIxMV9FTEVNSURfUkVRSU5GTyA9IDEwLAorCUlFRUU4MDIxMV9FTEVNSURfUUJTU19MT0FEID0gMTEsCisJSUVFRTgwMjExX0VMRU1JRF9UQ0xBUyA9IDE0LAorCUlFRUU4MDIxMV9FTEVNSURfQ0hBTExFTkdFID0gMTYsCisJLyogMTctMzEgcmVzZXJ2ZWQgZm9yIGNoYWxsZW5nZSB0ZXh0IGV4dGVuc2lvbiAqLworCUlFRUU4MDIxMV9FTEVNSURfUFdSQ05TVFIgPSAzMiwKKwlJRUVFODAyMTFfRUxFTUlEX1BXUkNBUCA9IDMzLAorCUlFRUU4MDIxMV9FTEVNSURfVFBDUkVRID0gMzQsCisJSUVFRTgwMjExX0VMRU1JRF9UUENSRVAgPSAzNSwKKwlJRUVFODAyMTFfRUxFTUlEX1NVUFBDSEFOID0gMzYsCisJSUVFRTgwMjExX0VMRU1JRF9DSEFOU1dJVENIQU5OID0gMzcsCisJSUVFRTgwMjExX0VMRU1JRF9NRUFTUkVRID0gMzgsCisJSUVFRTgwMjExX0VMRU1JRF9NRUFTUkVQID0gMzksCisJSUVFRTgwMjExX0VMRU1JRF9RVUlFVCA9IDQwLAorCUlFRUU4MDIxMV9FTEVNSURfSUJTU0RGUyA9IDQxLAorCUlFRUU4MDIxMV9FTEVNSURfRVJQID0gNDIsCisJSUVFRTgwMjExX0VMRU1JRF9UQ0xBU19QUk9DRVNTID0gNDQsCisJSUVFRTgwMjExX0VMRU1JRF9IVENBUF9BTkEgPSA0NSwKKwlJRUVFODAyMTFfRUxFTUlEX1JFU0VSVkVEXzQ3ID0gNDcsCisJSUVFRTgwMjExX0VMRU1JRF9SU04gPSA0OCwKKwlJRUVFODAyMTFfRUxFTUlEX1hSQVRFUyA9IDUwLAorCUlFRUU4MDIxMV9FTEVNSURfSFRDQVAgPSA1MSwKKwlJRUVFODAyMTFfRUxFTUlEX0hUSU5GTyA9IDUyLAorCUlFRUU4MDIxMV9FTEVNSURfTU9CSUxJVFlfRE9NQUlOID0gNTQsCisJSUVFRTgwMjExX0VMRU1JRF9GVCA9IDU1LAorCUlFRUU4MDIxMV9FTEVNSURfVElNRU9VVF9JTlRFUlZBTCA9IDU2LAorCUlFRUU4MDIxMV9FTEVNSURfRVhUQ0hBTlNXSVRDSEFOTiA9IDYwLAorCUlFRUU4MDIxMV9FTEVNSURfSFRJTkZPX0FOQSA9IDYxLAorCUlFRUU4MDIxMV9FTEVNSURfU0VDQ0hBTk9GRlNFVCA9IDYyLAorCUlFRUU4MDIxMV9FTEVNSURfV0FQSSA9IDY4LCAgICAgLypJRSBmb3IgV0FQSSAqLworCUlFRUU4MDIxMV9FTEVNSURfVElNRV9BRFZFUlRJU0VNRU5UID0gNjksCisJSUVFRTgwMjExX0VMRU1JRF9SUk0gPSA3MCwgICAgICAvKiBSYWRpbyByZXNvdXJjZSBtZWFzdXJlbWVudCAqLworCUlFRUU4MDIxMV9FTEVNSURfMjA0MF9DT0VYVCA9IDcyLAorCUlFRUU4MDIxMV9FTEVNSURfMjA0MF9JTlRPTCA9IDczLAorCUlFRUU4MDIxMV9FTEVNSURfT0JTU19TQ0FOID0gNzQsCisJSUVFRTgwMjExX0VMRU1JRF9NTUlFID0gNzYsICAgICAvKiA4MDIuMTF3IE1hbmFnZW1lbnQgTUlDIElFICovCisJSUVFRTgwMjExX0VMRU1JRF9GTVNfREVTQ1JJUFRPUiA9IDg2LCAgIC8qIDgwMi4xMXYgRk1TIGRlc2NyaXB0b3IgSUUgKi8KKwlJRUVFODAyMTFfRUxFTUlEX0ZNU19SRVFVRVNUID0gODcsICAgICAgLyogODAyLjExdiBGTVMgcmVxdWVzdCBJRSAqLworCUlFRUU4MDIxMV9FTEVNSURfRk1TX1JFU1BPTlNFID0gODgsICAgICAvKiA4MDIuMTF2IEZNUyByZXNwb25zZSBJRSAqLworCUlFRUU4MDIxMV9FTEVNSURfQlNTTUFYX0lETEVfUEVSSU9EID0gOTAsICAgICAgIC8qIEJTUyBNQVggSURMRSBQRVJJT0QgKi8KKwlJRUVFODAyMTFfRUxFTUlEX1RGU19SRVFVRVNUID0gOTEsCisJSUVFRTgwMjExX0VMRU1JRF9URlNfUkVTUE9OU0UgPSA5MiwKKwlJRUVFODAyMTFfRUxFTUlEX1RJTV9CQ0FTVF9SRVFVRVNUID0gOTQsCisJSUVFRTgwMjExX0VMRU1JRF9USU1fQkNBU1RfUkVTUE9OU0UgPSA5NSwKKwlJRUVFODAyMTFfRUxFTUlEX0lOVEVSV09SS0lORyA9IDEwNywKKwlJRUVFODAyMTFfRUxFTUlEX1hDQVBTID0gMTI3LAorCUlFRUU4MDIxMV9FTEVNSURfUkVTRVJWRURfMTMzID0gMTMzLAorCUlFRUU4MDIxMV9FTEVNSURfVFBDID0gMTUwLAorCUlFRUU4MDIxMV9FTEVNSURfQ0NLTSA9IDE1NiwKKwlJRUVFODAyMTFfRUxFTUlEX1ZIVENBUCA9IDE5MSwgIC8qIFZIVCBDYXBhYmlsaXRpZXMgKi8KKwlJRUVFODAyMTFfRUxFTUlEX1ZIVE9QID0gMTkyLCAgIC8qIFZIVCBPcGVyYXRpb24gKi8KKwlJRUVFODAyMTFfRUxFTUlEX0VYVF9CU1NfTE9BRCA9IDE5MywgICAgLyogRXh0ZW5kZWQgQlNTIExvYWQgKi8KKwlJRUVFODAyMTFfRUxFTUlEX1dJREVfQkFORF9DSEFOX1NXSVRDSCA9IDE5NCwgICAvKiBXaWRlIEJhbmQgQ2hhbm5lbCBTd2l0Y2ggKi8KKwlJRUVFODAyMTFfRUxFTUlEX1ZIVF9UWF9QV1JfRU5WTFAgPSAxOTUsICAgICAgICAvKiBWSFQgVHJhbnNtaXQgUG93ZXIgRW52ZWxvcGUgKi8KKwlJRUVFODAyMTFfRUxFTUlEX0NIQU5fU1dJVENIX1dSQVAgPSAxOTYsICAgICAgICAvKiBDaGFubmVsIFN3aXRjaCBXcmFwcGVyICovCisJSUVFRTgwMjExX0VMRU1JRF9BSUQgPSAxOTcsICAgICAvKiBBSUQgKi8KKwlJRUVFODAyMTFfRUxFTUlEX1FVSUVUX0NIQU5ORUwgPSAxOTgsICAgLyogUXVpZXQgQ2hhbm5lbCAqLworCUlFRUU4MDIxMV9FTEVNSURfT1BfTU9ERV9OT1RJRlkgPSAxOTksICAvKiBPcGVyYXRpbmcgTW9kZSBOb3RpZmljYXRpb24gKi8KKwlJRUVFODAyMTFfRUxFTUlEX1ZFTkRPUiA9IDIyMSwgIC8qIHZlbmRvciBwcml2YXRlICovCit9OworCisjZGVmaW5lIElFRUU4MDIxMV9NQVhfSUVfTEVOICAgICAgICAgICAgICAgIDI1NQorI2RlZmluZSBJRUVFODAyMTFfUlNOX0lFX0xFTiAgICAgICAgICAgICAgICAyMgorCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOU1dJVENIQU5OX0JZVEVTICAgICAgICA1CisjZGVmaW5lIElFRUU4MDIxMV9FWFRDSEFOU1dJVENIQU5OX0JZVEVTICAgICA2CisKKy8qIFRPRE8gLT4gTmVlZCB0byBDaGVjayBSZWRlZmluaXRpb24gRXJyb3IgdXNlZCBpbiBvbmx5IFVNQUMgKi8KKyNpZiAwCitzdHJ1Y3QgaWVlZTgwMjExX3RpbV9pZSB7CisJdWludDhfdCB0aW1faWU7ICAgICAgICAgLyogSUVFRTgwMjExX0VMRU1JRF9USU0gKi8KKwl1aW50OF90IHRpbV9sZW47CisJdWludDhfdCB0aW1fY291bnQ7ICAgICAgLyogRFRJTSBjb3VudCAqLworCXVpbnQ4X3QgdGltX3BlcmlvZDsgICAgIC8qIERUSU0gcGVyaW9kICovCisJdWludDhfdCB0aW1fYml0Y3RsOyAgICAgLyogYml0bWFwIGNvbnRyb2wgKi8KKwl1aW50OF90IHRpbV9iaXRtYXBbMV07ICAvKiB2YXJpYWJsZS1sZW5ndGggYml0bWFwICovCit9IF9fcGFja2VkOworI2VuZGlmCisKKy8qIENvdW50cnkgSUUgY2hhbm5lbCB0cmlwbGV0ICovCitzdHJ1Y3QgY291bnRyeV9pZV90cmlwbGV0IHsKKwl1bmlvbiB7CisJCXVpbnQ4X3Qgc2NoYW47ICAvKiBzdGFydGluZyBjaGFubmVsICovCisJCXVpbnQ4X3QgcmVnZXh0aWQ7ICAgICAgIC8qIFJlZ3VsYXRvcnkgRXh0ZW5zaW9uIElkZW50aWZpZXIgKi8KKwl9OworCXVuaW9uIHsKKwkJdWludDhfdCBuY2hhbjsgIC8qIG51bWJlciBvZiBjaGFubmVscyAqLworCQl1aW50OF90IHJlZ2NsYXNzOyAgICAgICAvKiBSZWd1bGF0b3J5IENsYXNzICovCisJfTsKKwl1bmlvbiB7CisJCXVpbnQ4X3QgbWF4dHhwd3I7ICAgICAgIC8qIHR4IHBvd2VyICAqLworCQl1aW50OF90IGNvdmVyYWdlY2xhc3M7ICAvKiBDb3ZlcmFnZSBDbGFzcyAqLworCX07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWVlZTgwMjExX2NvdW50cnlfaWUgeworCXVpbnQ4X3QgaWU7ICAgICAgICAgICAgIC8qIElFRUU4MDIxMV9FTEVNSURfQ09VTlRSWSAqLworCXVpbnQ4X3QgbGVuOworCXVpbnQ4X3QgY2NbM107ICAgICAgICAgIC8qIElTTyBDQysoSSluZG9vci8oTyl1dGRvb3IgKi8KKwlzdHJ1Y3QgY291bnRyeV9pZV90cmlwbGV0IHRyaXBsZXRbMV07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWVlZTgwMjExX2ZoX2llIHsKKwl1aW50OF90IGllOyAgICAgICAgICAgICAvKiBJRUVFODAyMTFfRUxFTUlEX0ZIUEFSTVMgKi8KKwl1aW50OF90IGxlbjsKKwl1aW50MTZfdCBkd2VsbF90aW1lOyAgICAvKiBlbmRpYW5lc3M/PyAqLworCXVpbnQ4X3QgaG9wX3NldDsKKwl1aW50OF90IGhvcF9wYXR0ZXJuOworCXVpbnQ4X3QgaG9wX2luZGV4OworfSBfX3BhY2tlZDsKKworc3RydWN0IGllZWU4MDIxMV9kc19pZSB7CisJdWludDhfdCBpZTsgICAgICAgICAgICAgLyogSUVFRTgwMjExX0VMRU1JRF9EU1BBUk1TICovCisJdWludDhfdCBsZW47CisJdWludDhfdCBjdXJyZW50X2NoYW5uZWw7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWVlZTgwMjExX2VycF9pZSB7CisJdWludDhfdCBpZTsgICAgICAgICAgICAgLyogSUVFRTgwMjExX0VMRU1JRF9FUlAgKi8KKwl1aW50OF90IGxlbjsKKwl1aW50OF90IHZhbHVlOworfSBfX3BhY2tlZDsKKworLyogVE9ETyAtPiBOZWVkIHRvIENoZWNrIFJlZGVmaW5pdGlvbiBFcnJvciB1c2VkIGluIG9ubHkgVU1BQyAqLworI2lmIDAKK3N0cnVjdCBpZWVlODAyMTFfcXVpZXRfaWUgeworCXVpbnQ4X3QgaWU7ICAgICAgICAgICAgIC8qIElFRUU4MDIxMV9FTEVNSURfUVVJRVQgKi8KKwl1aW50OF90IGxlbjsKKwl1aW50OF90IHRidHRjb3VudDsgICAgICAvKiBxdWlldCBzdGFydCAqLworCXVpbnQ4X3QgcGVyaW9kOyAgICAgICAgIC8qIGJlYWNvbiBpbnRlcnZhbHMgYmV0d2VlbiBxdWlldHMgKi8KKwl1aW50MTZfdCBkdXJhdGlvbjsgICAgICAvKiBUVXMgb2YgZWFjaCBxdWlldCAqLworCXVpbnQxNl90IG9mZnNldDsgICAgICAgIC8qIFRVcyBvZiBmcm9tIFRCVFQgb2YgcXVpZXQgc3RhcnQgKi8KK30gX19wYWNrZWQ7CisjZW5kaWYKKworc3RydWN0IGllZWU4MDIxMV9jaGFubmVsc3dpdGNoX2llIHsKKwl1aW50OF90IGllOyAgICAgICAgICAgICAvKiBJRUVFODAyMTFfRUxFTUlEX0NIQU5TV0lUQ0hBTk4gKi8KKwl1aW50OF90IGxlbjsKKwl1aW50OF90IHN3aXRjaG1vZGU7CisJdWludDhfdCBuZXdjaGFubmVsOworCXVpbnQ4X3QgdGJ0dGNvdW50OworfSBfX3BhY2tlZDsKKworLyogY2hhbm5lbCBzd2l0Y2ggYWN0aW9uIGZyYW1lIGZvcm1hdCBkZWZpbml0aW9uICovCitzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbl9zcGVjdHJ1bV9jaGFubmVsX3N3aXRjaCB7CisJc3RydWN0IGllZWU4MDIxMV9hY3Rpb24gY3NhX2hlYWRlcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxzd2l0Y2hfaWUgY3NhX2VsZW1lbnQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWVlZTgwMjExX2V4dGVuZGVkY2hhbm5lbHN3aXRjaF9pZSB7CisJdWludDhfdCBpZTsgICAgICAgICAgICAgLyogSUVFRTgwMjExX0VMRU1JRF9FWFRDSEFOU1dJVENIQU5OICovCisJdWludDhfdCBsZW47CisJdWludDhfdCBzd2l0Y2htb2RlOworCXVpbnQ4X3QgbmV3Q2xhc3M7CisJdWludDhfdCBuZXdjaGFubmVsOworCXVpbnQ4X3QgdGJ0dGNvdW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IGllZWU4MDIxMV90cGNfaWUgeworCXVpbnQ4X3QgaWU7CisJdWludDhfdCBsZW47CisJdWludDhfdCBwd3JsaW1pdDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBNSERSSUUgaW5jbHVkZWQgaW4gVEtJUCBNRlAgcHJvdGVjdGVkIG1hbmFnZW1lbnQgZnJhbWVzCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfZXNlX21oZHJfaWUgeworCXVpbnQ4X3QgbWhkcl9pZDsKKwl1aW50OF90IG1oZHJfbGVuOworCXVpbnQ4X3QgbWhkcl9vdWlbM107CisJdWludDhfdCBtaGRyX291aV90eXBlOworCXVpbnQ4X3QgbWhkcl9mY1syXTsKKwl1aW50OF90IG1oZHJfYnNzaWRbSUVFRTgwMjExX0FERFJfTEVOXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBTU0lEIElFCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfc3NpZCB7CisJdWludDhfdCBzc2lkX2lkOworCXVpbnQ4X3Qgc3NpZF9sZW47CisJdWludDhfdCBzc2lkWzMyXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBTdXBwb3J0ZWQgcmF0ZXMKKyAqLworI2RlZmluZSBJRUVFODAyMTFfTUFYX1NVUFBPUlRFRF9SQVRFUyAgICAgIDgKKworc3RydWN0IGllZWU4MDIxMV9pZV9yYXRlcyB7CisJdWludDhfdCByYXRlX2lkOyAgICAgICAgLyogRWxlbWVudCBJZCAqLworCXVpbnQ4X3QgcmF0ZV9sZW47ICAgICAgIC8qIElFIExlbmd0aCAqLworCXVpbnQ4X3QgcmF0ZVtJRUVFODAyMTFfTUFYX1NVUFBPUlRFRF9SQVRFU107ICAgIC8qIElFIExlbmd0aCAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIEV4dGVuZGVkIHJhdGVzCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX01BWF9FWFRFTkRFRF9SQVRFUyAgICAgMjU2CisKK3N0cnVjdCBpZWVlODAyMTFfaWVfeHJhdGVzIHsKKwl1aW50OF90IHhyYXRlX2lkOyAgICAgICAvKiBFbGVtZW50IElkICovCisJdWludDhfdCB4cmF0ZV9sZW47ICAgICAgLyogSUUgTGVuZ3RoICovCisJdWludDhfdCB4cmF0ZVtJRUVFODAyMTFfTUFYX0VYVEVOREVEX1JBVEVTXTsgICAgLyogSUUgTGVuZ3RoICovCit9IF9fcGFja2VkOworCisvKgorICogV1BTIFNTSUQgbGlzdCBpbmZvcm1hdGlvbiBlbGVtZW50IChtYXhpbWFsbHkgc2l6ZWQpLgorICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX3NzaWRsIHsKKwl1aW50OF90IHNzaWRsX2lkOyAgICAgICAvKiBJRUVFODAyMTFfRUxFTUlEX1ZFTkRPUiAqLworCXVpbnQ4X3Qgc3NpZGxfbGVuOyAgICAgIC8qIGxlbmd0aCBpbiBieXRlcyAqLworCXVpbnQ4X3Qgc3NpZGxfb3VpWzNdOyAgIC8qIDB4MDAsIDB4NTAsIDB4ZjIgKi8KKwl1aW50OF90IHNzaWRsX3R5cGU7ICAgICAvKiBPVUkgdHlwZSAqLworCXVpbnQ4X3Qgc3NpZGxfcHJpbV9jYXA7IC8qIFByaW1hcnkgY2FwYWJpbGl0aWVzICovCisJdWludDhfdCBzc2lkbF9jb3VudDsgICAgLyogIyBvZiBzZWNvbmRhcnkgU1NJRHMgKi8KKwl1aW50MTZfdCBzc2lkbF92YWx1ZVsyNDhdOworfSBfX3BhY2tlZDsKKworI2lmIF9CWVRFX09SREVSID09IF9CSUdfRU5ESUFOCitzdHJ1Y3QgaWVlZTgwMjExX3NlY19zc2lkX2NhcCB7CisJdWludDMyX3QgcmVzZXJ2ZWQwIDogMSwKKwkJIGFrbWxpc3QgOiA2LCByZXNlcnZlZDEgOiA0LCByZWVzZXJ2ZWQyIDogMiwgdWNpcGhlciA6IDE1LCBtY2lwaGVyIDogNDsKK307CisjZWxzZQorc3RydWN0IGllZWU4MDIxMV9zZWNfc3NpZF9jYXAgeworCXVpbnQzMl90IG1jaXBoZXIgOiA0LAorCQkgdWNpcGhlciA6IDE1LCByZXNlcnZlZDIgOiAyLCByZXNlcnZlZDEgOiA0LCBha21saXN0IDogNiwgcmVzZXJ2ZWQwIDogMTsKK307CisjZW5kaWYKKworc3RydWN0IGllZWU4MDIxMV9pZV9xYnNzbG9hZCB7CisJdWludDhfdCBlbGVtX2lkOyAgICAgICAgLyogSUVFRTgwMjExX0VMRU1JRF9RQlNTX0xPQUQgKi8KKwl1aW50OF90IGxlbmd0aDsgICAgICAgICAvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1aW50MTZfdCBzdGF0aW9uX2NvdW50OyAvKiBudW1iZXIgb2Ygc3RhdGlvbiBhc3NvY2lhdGVkICovCisJdWludDhfdCBjaGFubmVsX3V0aWxpemF0aW9uOyAgICAvKiBjaGFubmVsIGJ1c3kgdGltZSBpbiAwLTI1NSBzY2FsZSAqLworCXVpbnQxNl90IGFhYzsgICAgICAgICAgIC8qIGF2YWlsYWJsZSBhZG1pc3Npb24gY2FwYWNpdHkgKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgU0VDX1NTSURfSEVBREVSX0xFTiAgNgorI2RlZmluZSBTU0lETF9JRV9IRUFERVJfTEVOICA2CisKK3N0cnVjdCBpZWVlODAyMTFfc2VjX3NzaWQgeworCXVpbnQ4X3Qgc2VjX2V4dF9jYXA7CisJc3RydWN0IGllZWU4MDIxMV9zZWNfc3NpZF9jYXAgc2VjX2NhcDsKKwl1aW50OF90IHNlY19zc2lkX2xlbjsKKwl1aW50OF90IHNlY19zc2lkWzMyXTsKK30gX19wYWNrZWQ7CisKKy8qIERlZmluaXRpb25zIG9mIFNTSURMIElFICovCitlbnVtIHsKKwlDQVBfTUNJUEhFUl9FTlVNX05PTkUgPSAwLAorCUNBUF9NQ0lQSEVSX0VOVU1fV0VQNDAsCisJQ0FQX01DSVBIRVJfRU5VTV9XRVAxMDQsCisJQ0FQX01DSVBIRVJfRU5VTV9US0lQLAorCUNBUF9NQ0lQSEVSX0VOVU1fQ0NNUCwKKwlDQVBfTUNJUEhFUl9FTlVNX0NLSVBfQ01JQywKKwlDQVBfTUNJUEhFUl9FTlVNX0NLSVAsCisJQ0FQX01DSVBIRVJfRU5VTV9DTUlDCit9OworCisjZGVmaW5lIENBUF9VQ0lQSEVSX0JJVF9OT05FICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ0FQX1VDSVBIRVJfQklUX1dFUDQwICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBDQVBfVUNJUEhFUl9CSVRfV0VQMTA0ICAgICAgICAgMHgwMDA0CisjZGVmaW5lIENBUF9VQ0lQSEVSX0JJVF9US0lQICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgQ0FQX1VDSVBIRVJfQklUX0NDTVAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBDQVBfVUNJUEhFUl9CSVRfQ0tJUF9DTUlDICAgICAgMHgwMDIwCisjZGVmaW5lIENBUF9VQ0lQSEVSX0JJVF9DS0lQICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgQ0FQX1VDSVBIRVJfQklUX0NNSUMgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBDQVBfVUNJUEhFUl9CSVRfV1BBMl9XRVA0MCAgICAgMHgwMTAwCisjZGVmaW5lIENBUF9VQ0lQSEVSX0JJVF9XUEEyX1dFUDEwNCAgICAweDAyMDAKKyNkZWZpbmUgQ0FQX1VDSVBIRVJfQklUX1dQQTJfVEtJUCAgICAgIDB4MDQwMAorI2RlZmluZSBDQVBfVUNJUEhFUl9CSVRfV1BBMl9DQ01QICAgICAgMHgwODAwCisjZGVmaW5lIENBUF9VQ0lQSEVSX0JJVF9XUEEyX0NLSVBfQ01JQyAweDEwMDAKKyNkZWZpbmUgQ0FQX1VDSVBIRVJfQklUX1dQQTJfQ0tJUCAgICAgIDB4MjAwMAorI2RlZmluZSBDQVBfVUNJUEhFUl9CSVRfV1BBMl9DTUlDICAgICAgMHg0MDAwCisKKyNkZWZpbmUgQ0FQX0FLTV9CSVRfV1BBMV8xWCAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ0FQX0FLTV9CSVRfV1BBMV9QU0sgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ0FQX0FLTV9CSVRfV1BBMl8xWCAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0FQX0FLTV9CSVRfV1BBMl9QU0sgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQ0FQX0FLTV9CSVRfV1BBMV9DQ0tNICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQ0FQX0FLTV9CSVRfV1BBMl9DQ0tNICAgICAgICAgIDB4MjAKKworI2RlZmluZSBJRUVFODAyMTFfQ0hBTExFTkdFX0xFTiAgICAgICAgIDEyOAorCisjZGVmaW5lIElFRUU4MDIxMV9TVVBQQ0hBTl9MRU4gICAgICAgICAgMjYKKworI2RlZmluZSBJRUVFODAyMTFfUkFURV9CQVNJQyAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSUVFRTgwMjExX1JBVEVfVkFMICAgICAgICAgICAgICAweDdmCisKKy8qIEVQUiBpbmZvcm1hdGlvbiBlbGVtZW50IGZsYWdzICovCisjZGVmaW5lIElFRUU4MDIxMV9FUlBfTk9OX0VSUF9QUkVTRU5UICAgMHgwMQorI2RlZmluZSBJRUVFODAyMTFfRVJQX1VTRV9QUk9URUNUSU9OICAgIDB4MDIKKyNkZWZpbmUgSUVFRTgwMjExX0VSUF9MT05HX1BSRUFNQkxFICAgICAweDA0CisKKy8qIEF0aGVyb3MgcHJpdmF0ZSBhZHZhbmNlZCBjYXBhYmlsaXRpZXMgaW5mbyAqLworI2RlZmluZSBBVEhFUk9TX0NBUF9UVVJCT19QUklNRSAgICAgICAgIDB4MDEKKyNkZWZpbmUgQVRIRVJPU19DQVBfQ09NUFJFU1NJT04gICAgICAgICAweDAyCisjZGVmaW5lIEFUSEVST1NfQ0FQX0ZBU1RfRlJBTUUgICAgICAgICAgMHgwNAorLyogYml0cyAzLTYgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQVRIRVJPU19DQVBfQk9PU1QgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgQVRIX09VSSAgICAgICAgICAgICAgICAgICAgIDB4N2YwMzAwICAgIC8qIEF0aGVyb3MgT1VJICovCisjZGVmaW5lIEFUSF9PVUlfVFlQRSAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBVEhfT1VJX1NVQlRZUEUgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQVRIX09VSV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFUSF9PVUlfVFlQRV9YUiAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBBVEhfT1VJX1ZFUl9YUiAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQVRIX09VSV9FWFRDQVBfVFlQRSAgICAgICAgICAgICAweDA0ICAgIC8qIEF0aGVyb3MgRXh0ZW5kZWQgQ2FwIFR5cGUgKi8KKyNkZWZpbmUgQVRIX09VSV9FWFRDQVBfU1VCVFlQRSAgICAgICAgICAweDAxICAgIC8qIEF0aGVyb3MgRXh0ZW5kZWQgQ2FwIFN1Yi10eXBlICovCisjZGVmaW5lIEFUSF9PVUlfRVhUQ0FQX1ZFUlNJT04gICAgICAgICAgMHgwMCAgICAvKiBBdGhlcm9zIEV4dGVuZGVkIENhcCBWZXJzaW9uICovCisKKyNkZWZpbmUgV1BBX09VSSAgICAgICAgICAgICAgICAgICAgIDB4ZjI1MDAwCisjZGVmaW5lIFdQQV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAvKiBjdXJyZW50IHN1cHBvcnRlZCB2ZXJzaW9uICovCisjZGVmaW5lIENTQ09fT1VJICAgICAgICAgICAgICAgICAgICAweDk2NDAwMCAgICAvKiBDaXNjbyBPVUkgKi8KKyNkZWZpbmUgQU9XX09VSSAgICAgICAgICAgICAgICAgICAgIDB4NGEwMTAwICAgIC8qIEFvVyBPVUksIHdvcmthcm91bmQgKi8KKyNkZWZpbmUgQU9XX09VSV9UWVBFICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFPV19PVUlfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIFdTQ19PVUkgICAgICAgICAgICAgICAgICAgMHgwMDUwZjIwNAorCisjZGVmaW5lIFdQQV9DU0VfTlVMTCAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBXUEFfQ1NFX1dFUDQwICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgV1BBX0NTRV9US0lQICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFdQQV9DU0VfQ0NNUCAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBXUEFfQ1NFX1dFUDEwNCAgICAgICAgICAgICAgICAgIDB4MDUKKworI2RlZmluZSBXUEFfQVNFX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgV1BBX0FTRV84MDIxWF9VTlNQRUMgICAgICAgICAgICAweDAxCisjZGVmaW5lIFdQQV9BU0VfODAyMVhfUFNLICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBXUEFfQVNFX0ZUX0lFRUU4MDIxWCAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgV1BBX0FTRV9GVF9QU0sgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFdQQV9BU0VfU0hBMjU2X0lFRUU4MDIxWCAgICAgICAgMHg4MAorI2RlZmluZSBXUEFfQVNFX1NIQTI1Nl9QU0sgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIFdQQV9BU0VfV1BTICAgICAgICAgICAgICAgICAgICAgMHgyMDAKKworI2RlZmluZSBSU05fT1VJICAgICAgICAgICAgICAgICAgICAgMHhhYzBmMDAKKyNkZWZpbmUgUlNOX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAxICAgIC8qIGN1cnJlbnQgc3VwcG9ydGVkIHZlcnNpb24gKi8KKworI2RlZmluZSBSU05fQ1NFX05VTEwgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUlNOX0NTRV9XRVA0MCAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJTTl9DU0VfVEtJUCAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBSU05fQ1NFX1dSQVAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgUlNOX0NTRV9DQ01QICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFJTTl9DU0VfV0VQMTA0ICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBSU05fQ1NFX0FFU19DTUFDICAgICAgICAgICAgICAgIDB4MDYKKworI2RlZmluZSBSU05fQVNFX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUlNOX0FTRV84MDIxWF9VTlNQRUMgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJTTl9BU0VfODAyMVhfUFNLICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBSU05fQVNFX0ZUX0lFRUU4MDIxWCAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgUlNOX0FTRV9GVF9QU0sgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFJTTl9BU0VfU0hBMjU2X0lFRUU4MDIxWCAgICAgICAgMHg4MAorI2RlZmluZSBSU05fQVNFX1NIQTI1Nl9QU0sgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIFJTTl9BU0VfV1BTICAgICAgICAgICAgICAgICAgICAgMHgyMDAKKworI2RlZmluZSBBS01fU1VJVEVfVFlQRV9JRUVFODAyMVggICAgICAgIDB4MDEKKyNkZWZpbmUgQUtNX1NVSVRFX1RZUEVfUFNLICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFLTV9TVUlURV9UWVBFX0ZUX0lFRUU4MDIxWCAgICAgMHgwMworI2RlZmluZSBBS01fU1VJVEVfVFlQRV9GVF9QU0sgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQUtNX1NVSVRFX1RZUEVfU0hBMjU2X0lFRUU4MDIxWCAweDA1CisjZGVmaW5lIEFLTV9TVUlURV9UWVBFX1NIQTI1Nl9QU0sgICAgICAgMHgwNgorCisjZGVmaW5lIFJTTl9DQVBfUFJFQVVUSCAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSU05fQ0FQX1BUS1NBX1JFUExBWUNPVU5URVIgICAgMHgwYworI2RlZmluZSBSU05fQ0FQX0dUS1NBX1JFUExBWUNPVU5URVIgICAgMHgzMAorI2RlZmluZSBSU05fQ0FQX01GUF9SRVFVSVJFRCAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgUlNOX0NBUF9NRlBfRU5BQkxFRCAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgQ0NLTV9PVUkgICAgICAgICAgICAgICAgICAgIDB4OTY0MDAwCisjZGVmaW5lIENDS01fQVNFX1VOU1BFQyAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXUEFfQ0NLTV9BS00gICAgICAgICAgICAgIDB4MDA5NjQwMDAKKyNkZWZpbmUgUlNOX0NDS01fQUtNICAgICAgICAgICAgICAweDAwOTY0MDAwCisKKyNkZWZpbmUgV01FX09VSSAgICAgICAgICAgICAgICAgICAgIDB4ZjI1MDAwCisjZGVmaW5lIFdNRV9PVUlfVFlQRSAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBXTUVfSU5GT19PVUlfU1VCVFlQRSAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgV01FX1BBUkFNX09VSV9TVUJUWVBFICAgICAgICAgICAweDAxCisjZGVmaW5lIFdNRV9UU1BFQ19PVUlfU1VCVFlQRSAgICAgICAgICAgMHgwMgorCisjZGVmaW5lIFdNRV9QQVJBTV9PVUlfVkVSU0lPTiAgICAgICAgICAgICAgMQorI2RlZmluZSBXTUVfVFNQRUNfT1VJX1ZFUlNJT04gICAgICAgICAgICAgIDEKKyNkZWZpbmUgV01FX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIFdNRSBzdHJlYW0gY2xhc3NlcyAqLworI2RlZmluZSBXTUVfQUNfQkUgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgLyogYmVzdCBlZmZvcnQgKi8KKyNkZWZpbmUgV01FX0FDX0JLICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgIC8qIGJhY2tncm91bmQgKi8KKyNkZWZpbmUgV01FX0FDX1ZJICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgIC8qIHZpZGVvICovCisjZGVmaW5lIFdNRV9BQ19WTyAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAvKiB2b2ljZSAqLworCisvKiBXQ04gSUUgKi8KKyNkZWZpbmUgV0NOX09VSSAgICAgICAgICAgICAgICAgICAgIDB4ZjI1MDAwICAgIC8qIE1pY3Jvc29mdCBPVUkgKi8KKyNkZWZpbmUgV0NOX09VSV9UWVBFICAgICAgICAgICAgICAgICAgICAweDA0ICAgIC8qIFdDTiAqLworCisvKiBBdGhlcm9zIGh0b3VpICBmb3IgaHQgdmVuZGVyIGllOyB1c2UgRXBpZ3JhbSBPVUkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUxMW4gZGV2aWNlcyAqLworI2RlZmluZSBBVEhfSFRPVUkgICAgICAgICAgICAgICAgICAgMHgwMDkwNGMKKworI2RlZmluZSBTRkFfT1VJICAgICAgICAgICAgICAgICAgICAgMHg5NjQwMDAKKyNkZWZpbmUgU0ZBX09VSV9UWVBFICAgICAgICAgICAgICAgICAgICAweDE0CisjZGVmaW5lIFNGQV9JRV9DQVBfTUZQICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTRkFfSUVfQ0FQX0RJQUdfQ0hBTk5FTCAgICAgICAgIDB4MDIKKyNkZWZpbmUgU0ZBX0lFX0NBUF9MT0NBVElPTl9TVkNTICAgICAgICAweDA0CisjZGVmaW5lIFNGQV9JRV9DQVBfRVhQX0JBTkRXSURUSCAgICAgICAgMHgwOAorCisjZGVmaW5lIFdQQV9PVUlfQllURVMgICAgICAgMHgwMCwgMHg1MCwgMHhmMgorI2RlZmluZSBSU05fT1VJX0JZVEVTICAgICAgIDB4MDAsIDB4MGYsIDB4YWMKKyNkZWZpbmUgV01FX09VSV9CWVRFUyAgICAgICAweDAwLCAweDUwLCAweGYyCisjZGVmaW5lIEFUSF9PVUlfQllURVMgICAgICAgMHgwMCwgMHgwMywgMHg3ZgorI2RlZmluZSBTRkFfT1VJX0JZVEVTICAgICAgIDB4MDAsIDB4NDAsIDB4OTYKKyNkZWZpbmUgQ0NLTV9PVUlfQllURVMgICAgICAweDAwLCAweDQwLCAweDk2CisjZGVmaW5lIFdQQV9TRUwoeCkgICAgICAgICAgKCgoeCk8PDI0KXxXUEFfT1VJKQorI2RlZmluZSBSU05fU0VMKHgpICAgICAgICAgICgoKHgpPDwyNCl8UlNOX09VSSkKKyNkZWZpbmUgU0ZBX1NFTCh4KSAgICAgICAgICAoKCh4KTw8MjQpfFNGQV9PVUkpCisjZGVmaW5lIENDS01fU0VMKHgpICAgICAgICAgKCgoeCk8PDI0KXxDQ0tNX09VSSkKKworI2RlZmluZSBJRUVFODAyMTFfUlYodikgICAgICgodikgJiBJRUVFODAyMTFfUkFURV9WQUwpCisKKy8qCisgKiBBVVRIIG1hbmFnZW1lbnQgcGFja2V0cworICoKKyAqICBvY3RldCBhbGdvWzJdCisgKiAgb2N0ZXQgc2VxWzJdCisgKiAgb2N0ZXQgc3RhdHVzWzJdCisgKiAgb2N0ZXQgY2hhbC5pZAorICogIG9jdGV0IGNoYWwubGVuZ3RoCisgKiAgb2N0ZXQgY2hhbC50ZXh0WzI1M10KKyAqLworCit0eXBlZGVmIHVpbnQ4X3QgKmllZWU4MDIxMV9tZ3RfYXV0aF90OworCisjZGVmaW5lIElFRUU4MDIxMV9BVVRIX0FMR09SSVRITShhdXRoKSBcCisJKChhdXRoKVswXSB8ICgoYXV0aClbMV0gPDwgOCkpCisjZGVmaW5lIElFRUU4MDIxMV9BVVRIX1RSQU5TQUNUSU9OKGF1dGgpIFwKKwkoKGF1dGgpWzJdIHwgKChhdXRoKVszXSA8PCA4KSkKKyNkZWZpbmUgSUVFRTgwMjExX0FVVEhfU1RBVFVTKGF1dGgpIFwKKwkoKGF1dGgpWzRdIHwgKChhdXRoKVs1XSA8PCA4KSkKKworI2RlZmluZSBJRUVFODAyMTFfQVVUSF9BTEdfT1BFTiAgICAgMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9BVVRIX0FMR19TSEFSRUQgICAweDAwMDEKKyNkZWZpbmUgSUVFRTgwMjExX0FVVEhfQUxHX0ZUICAgICAgIDB4MDAwMgorI2RlZmluZSBJRUVFODAyMTFfQVVUSF9BTEdfTEVBUCAgICAgMHgwMDgwCisKK2VudW0geworCUlFRUU4MDIxMV9BVVRIX09QRU5fUkVRVUVTVCA9IDEsCisJSUVFRTgwMjExX0FVVEhfT1BFTl9SRVNQT05TRSA9IDIsCit9OworCitlbnVtIHsKKwlJRUVFODAyMTFfQVVUSF9TSEFSRURfUkVRVUVTVCA9IDEsCisJSUVFRTgwMjExX0FVVEhfU0hBUkVEX0NIQUxMRU5HRSA9IDIsCisJSUVFRTgwMjExX0FVVEhfU0hBUkVEX1JFU1BPTlNFID0gMywKKwlJRUVFODAyMTFfQVVUSF9TSEFSRURfUEFTUyA9IDQsCit9OworCisvKgorICogUmVhc29uIGNvZGVzCisgKgorICogVW5saXN0ZWQgY29kZXMgYXJlIHJlc2VydmVkCisgKi8KKworZW51bSB7CisJSUVFRTgwMjExX1JFQVNPTl9VTlNQRUNJRklFRCA9IDEsCisJSUVFRTgwMjExX1JFQVNPTl9BVVRIX0VYUElSRSA9IDIsCisJSUVFRTgwMjExX1JFQVNPTl9BVVRIX0xFQVZFID0gMywKKwlJRUVFODAyMTFfUkVBU09OX0FTU09DX0VYUElSRSA9IDQsCisJSUVFRTgwMjExX1JFQVNPTl9BU1NPQ19UT09NQU5ZID0gNSwKKwlJRUVFODAyMTFfUkVBU09OX05PVF9BVVRIRUQgPSA2LAorCUlFRUU4MDIxMV9SRUFTT05fTk9UX0FTU09DRUQgPSA3LAorCUlFRUU4MDIxMV9SRUFTT05fQVNTT0NfTEVBVkUgPSA4LAorCUlFRUU4MDIxMV9SRUFTT05fQVNTT0NfTk9UX0FVVEhFRCA9IDksCisKKwlJRUVFODAyMTFfUkVBU09OX1JTTl9SRVFVSVJFRCA9IDExLAorCUlFRUU4MDIxMV9SRUFTT05fUlNOX0lOQ09OU0lTVEVOVCA9IDEyLAorCUlFRUU4MDIxMV9SRUFTT05fSUVfSU5WQUxJRCA9IDEzLAorCUlFRUU4MDIxMV9SRUFTT05fTUlDX0ZBSUxVUkUgPSAxNCwKKworCUlFRUU4MDIxMV9SRUFTT05fUU9TID0gMzIsCisJSUVFRTgwMjExX1JFQVNPTl9RT1NfQkFORFdJVERIID0gMzMsCisJSUVFRTgwMjExX1JFQVNPTl9RT1NfQ0hfQ09ORElUSU9OUyA9IDM0LAorCUlFRUU4MDIxMV9SRUFTT05fUU9TX1RYT1AgPSAzNSwKKwlJRUVFODAyMTFfUkVBU09OX1FPU19MRUFWRSA9IDM2LAorCUlFRUU4MDIxMV9SRUFTT05fUU9TX0RFQ0xJTkVEID0gMzcsCisJSUVFRTgwMjExX1JFQVNPTl9RT1NfU0VUVVBfUkVRVUlSRUQgPSAzOCwKKwlJRUVFODAyMTFfUkVBU09OX1FPU19USU1FT1VUID0gMzksCisJSUVFRTgwMjExX1JFQVNPTl9RT1NfQ0lQSEVSID0gNDUsCisKKwlJRUVFODAyMTFfU1RBVFVTX1NVQ0NFU1MgPSAwLAorCUlFRUU4MDIxMV9TVEFUVVNfVU5TUEVDSUZJRUQgPSAxLAorCUlFRUU4MDIxMV9TVEFUVVNfQ0FQSU5GTyA9IDEwLAorCUlFRUU4MDIxMV9TVEFUVVNfTk9UX0FTU09DRUQgPSAxMSwKKwlJRUVFODAyMTFfU1RBVFVTX09USEVSID0gMTIsCisJSUVFRTgwMjExX1NUQVRVU19BTEcgPSAxMywKKwlJRUVFODAyMTFfU1RBVFVTX1NFUVVFTkNFID0gMTQsCisJSUVFRTgwMjExX1NUQVRVU19DSEFMTEVOR0UgPSAxNSwKKwlJRUVFODAyMTFfU1RBVFVTX1RJTUVPVVQgPSAxNiwKKwlJRUVFODAyMTFfU1RBVFVTX1RPT01BTlkgPSAxNywKKwlJRUVFODAyMTFfU1RBVFVTX0JBU0lDX1JBVEUgPSAxOCwKKwlJRUVFODAyMTFfU1RBVFVTX1NQX1JFUVVJUkVEID0gMTksCisJSUVFRTgwMjExX1NUQVRVU19QQkNDX1JFUVVJUkVEID0gMjAsCisJSUVFRTgwMjExX1NUQVRVU19DQV9SRVFVSVJFRCA9IDIxLAorCUlFRUU4MDIxMV9TVEFUVVNfVE9PX01BTllfU1RBVElPTlMgPSAyMiwKKwlJRUVFODAyMTFfU1RBVFVTX1JBVEVTID0gMjMsCisJSUVFRTgwMjExX1NUQVRVU19TSE9SVFNMT1RfUkVRVUlSRUQgPSAyNSwKKwlJRUVFODAyMTFfU1RBVFVTX0RTU1NPRkRNX1JFUVVJUkVEID0gMjYsCisJSUVFRTgwMjExX1NUQVRVU19OT19IVCA9IDI3LAorCUlFRUU4MDIxMV9TVEFUVVNfUkVKRUNUX1RFTVAgPSAzMCwKKwlJRUVFODAyMTFfU1RBVFVTX01GUF9WSU9MQVRJT04gPSAzMSwKKwlJRUVFODAyMTFfU1RBVFVTX1JFRlVTRUQgPSAzNywKKwlJRUVFODAyMTFfU1RBVFVTX0lOVkFMSURfUEFSQU0gPSAzOCwKKworCUlFRUU4MDIxMV9TVEFUVVNfRExTX05PVF9BTExPV0VEID0gNDgsCit9OworCisvKiBwcml2YXRlIElFRUU4MDIxMV9TVEFUVVMgKi8KKyNkZWZpbmUgICAgSUVFRTgwMjExX1NUQVRVU19DQU5DRUwgICAgICAgICAgICAgLTEKKyNkZWZpbmUgICAgSUVFRTgwMjExX1NUQVRVU19JTlZBTElEX0lFICAgICAgICAgLTIKKyNkZWZpbmUgICAgSUVFRTgwMjExX1NUQVRVU19JTlZBTElEX0NIQU5ORUwgICAgLTMKKworI2RlZmluZSBJRUVFODAyMTFfV0VQX0tFWUxFTiAgICAgICAgNSAgIC8qIDQwYml0ICovCisjZGVmaW5lIElFRUU4MDIxMV9XRVBfSVZMRU4gICAgICAgICAzICAgLyogMjRiaXQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1dFUF9LSURMRU4gICAgICAgIDEgICAvKiAxIG9jdGV0ICovCisjZGVmaW5lIElFRUU4MDIxMV9XRVBfQ1JDTEVOICAgICAgICA0ICAgLyogQ1JDLTMyICovCisjZGVmaW5lIElFRUU4MDIxMV9XRVBfTktJRCAgICAgICAgICA0ICAgLyogbnVtYmVyIG9mIGtleSBpZHMgKi8KKworLyoKKyAqIDgwMi4xMWkgZGVmaW5lcyBhbiBleHRlbmRlZCBJViBmb3IgdXNlIHdpdGggbm9uLVdFUCBjaXBoZXJzLgorICogV2hlbiB0aGUgRVhUSVYgYml0IGlzIHNldCBpbiB0aGUga2V5IGlkIGJ5dGUgYW4gYWRkaXRpb25hbAorICogNCBieXRlcyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIElWIGZvciBUS0lQLiAgRm9yIENDTVAgdGhlCisgKiBFWFRJViBiaXQgaXMgbGlrZXdpc2Ugc2V0IGJ1dCB0aGUgOCBieXRlcyByZXByZXNlbnQgdGhlCisgKiBDQ01QIGhlYWRlciByYXRoZXIgdGhhbiBJVitleHRlbmRlZC1JVi4KKyAqLworI2RlZmluZSBJRUVFODAyMTFfV0VQX0VYVElWICAgICAgMHgyMAorI2RlZmluZSBJRUVFODAyMTFfV0VQX0VYVElWTEVOICAgICAgNCAgIC8qIGV4dGVuZGVkIElWIGxlbmd0aCAqLworI2RlZmluZSBJRUVFODAyMTFfV0VQX01JQ0xFTiAgICAgICAgOCAgIC8qIHRyYWlsaW5nIE1JQyAqLworCisjZGVmaW5lIElFRUU4MDIxMV9DQ01QX0hFQURFUkxFTiAgICA4CisjZGVmaW5lIElFRUU4MDIxMV9DQ01QX01JQ0xFTiAgICAgICA4CisKKy8qCisgKiA4MDIuMTF3IGRlZmluZXMgYSBNTUlFIGNodW5rIHRvIGJlIGF0dGFjaGVkIGF0IHRoZSBlbmQgb2YKKyAqIGFueSBvdXRnb2luZyBicm9hZGNhc3Qgb3IgbXVsdGljYXN0IHJvYnVzdCBtYW5hZ2VtZW50IGZyYW1lLgorICogTU1JRSBmaWVsZCBpcyB0b3RhbCAxOCBieXRlcyBpbiBzaXplLiBGb2xsb3dpbmcgdGhlIGRpYWdyYW0gb2YgTU1JRQorICoKKyAqICAgICAgICA8LS0tLS0tLS0tLS0tIDE4IEJ5dGVzIE1NSUUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgKiAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tKworICogICAgICAgIHxFbGVtZW50IHwgTGVuZ3RoICB8IEtleSBpZCAgfCAgIElQTiAgICAgfCAgTUlDICAgIHwKKyAqICAgICAgICB8ICBpZCAgICB8ICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8CisgKiAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tKworICogYnl0ZXMgICAgICAxICAgICAgICAgMSAgICAgICAgIDIgICAgICAgICA2ICAgICAgICAgICAgOAorICoKKyAqLworI2RlZmluZSBJRUVFODAyMTFfTU1JRV9MRU4gICAgICAgICAgMTgKKyNkZWZpbmUgSUVFRTgwMjExX01NSUVfRUxFTUVOVElETEVOIDEKKyNkZWZpbmUgSUVFRTgwMjExX01NSUVfTEVOR1RITEVOICAgIDEKKyNkZWZpbmUgSUVFRTgwMjExX01NSUVfS0VZSURMRU4gICAgIDIKKyNkZWZpbmUgSUVFRTgwMjExX01NSUVfSVBOTEVOICAgICAgIDYKKyNkZWZpbmUgSUVFRTgwMjExX01NSUVfTUlDTEVOICAgICAgIDgKKworI2RlZmluZSBJRUVFODAyMTFfQ1JDX0xFTiAgICAgICAgICAgNAorCisjZGVmaW5lIElFRUU4MDIxMV84MDIxUV9IRUFERVJfTEVOICA0CisvKgorICogTWF4aW11bSBhY2NlcHRhYmxlIE1UVSBpczoKKyAqICBJRUVFODAyMTFfTUFYX0xFTiAtIFdFUCBvdmVyaGVhZCAtIENSQyAtCisgKiAgICAgIFFvUyBvdmVyaGVhZCAtIFJTTi9XUEEgb3ZlcmhlYWQKKyAqIE1pbiBpcyBhcmJpdHJhcmlseSBjaG9zZW4gPiBJRUVFODAyMTFfTUlOX0xFTi4gIFRoZSBkZWZhdWx0CisgKiBtdHUgaXMgRXRoZXJuZXQtY29tcGF0aWJsZTsgaXQncyBzZXQgYnkgZXRoZXJfaWZhdHRhY2guCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX01UVV9NQVggICAgICAgMjI5MAorI2RlZmluZSBJRUVFODAyMTFfTVRVX01JTiAgICAgICAzMgorCisvKiBSYXRoZXIgdGhhbiB1c2luZyB0aGlzIGRlZmF1bHQgdmFsdWUsIGN1c3RvbWVyIHBsYXRmb3JtcyBjYW4gcHJvdmlkZSBhIGN1c3RvbSB2YWx1ZSBmb3IgdGhpcyBjb25zdGFudC4KKyAgIENvdXN0b21lciBwbGF0Zm9ybSB3aWxsIHVzZSB0aGUgZGlmZmVyZW50IGRlZmluZSB2YWx1ZSBieSB0aGVtc2VsZiAqLworI2lmbmRlZiBJRUVFODAyMTFfTUFYX01QRFVfTEVOCisjZGVmaW5lIElFRUU4MDIxMV9NQVhfTVBEVV9MRU4gICAgICAoMzg0MCArIElFRUU4MDIxMV9DUkNfTEVOICsJXAorCQkJCSAgICAgKElFRUU4MDIxMV9XRVBfSVZMRU4gKyBJRUVFODAyMTFfV0VQX0tJRExFTiArIElFRUU4MDIxMV9XRVBfQ1JDTEVOKSkKKyNlbmRpZgorI2RlZmluZSBJRUVFODAyMTFfQUNLX0xFTiBcCisJKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX2FjaykgKyBJRUVFODAyMTFfQ1JDX0xFTikKKyNkZWZpbmUgSUVFRTgwMjExX01JTl9MRU4gXAorCShzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9mcmFtZV9taW4pICsgSUVFRTgwMjExX0NSQ19MRU4pCisKKy8qIEFuIDgwMi4xMSBkYXRhIGZyYW1lIGNhbiBiZSBvbmUgb2YgdGhyZWUgdHlwZXM6CisgICAxLiBBbiB1bmFnZ3JlZ2F0ZWQgZnJhbWU6IFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbiB1bmFnZ3JlZ2F0ZWQgZGF0YSBmcmFtZSBpcyAyMzI0IGJ5dGVzICsgaGVhZGVycy4KKyAgIDIuIEEgZGF0YSBmcmFtZSB0aGF0IGlzIHBhcnQgb2YgYW4gQU1QRFU6IFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbiBBTVBEVSBtYXkgYmUgdXB0byA2NTUzNSBieXRlcywgYnV0IGRhdGEgZnJhbWUgaXMgbGltaXRlZCB0byAyMzI0IGJ5dGVzICsgaGVhZGVyLgorICAgMy4gQW4gQU1TRFU6IFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbiBBTVNEVSBpcyBlaWh0aGVyIDM4Mzkgb3IgNzA5NSBieXRlcy4KKyAgIFRoZSBtYXhpbXVtIGZyYW1lIGxlbmd0aCBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUgaXMgNDA5NSBieXRlcy4KKyAgIEEgbGVuZ3RoIG9mIDM4MzkgYnl0ZXMgaXMgY2hvc2VuIGhlcmUgdG8gc3VwcG9ydCB1bmFnZ3JlZ2F0ZWQgZGF0YSBmcmFtZXMsIGFueSBzaXplIEFNUERVcyBhbmQgMzgzOSBieXRlIEFNU0RVcy4KKyAqLworI2RlZmluZSBJRUVFODAyMTFOX01BWF9GUkFNRUxFTiAgMzgzOQorI2RlZmluZSBJRUVFODAyMTFOX01BWF9MRU4gKElFRUU4MDIxMU5fTUFYX0ZSQU1FTEVOICsgSUVFRTgwMjExX0NSQ19MRU4gKyBcCisJCQkgICAgKElFRUU4MDIxMV9XRVBfSVZMRU4gKyBJRUVFODAyMTFfV0VQX0tJRExFTiArIElFRUU4MDIxMV9XRVBfQ1JDTEVOKSkKKworI2RlZmluZSBJRUVFODAyMTFfVFhfQ0hBSU5NQVNLX01JTiAgMQorI2RlZmluZSBJRUVFODAyMTFfVFhfQ0hBSU5NQVNLX01BWCAgNworCisjZGVmaW5lIElFRUU4MDIxMV9SWF9DSEFJTk1BU0tfTUlOICAxCisjZGVmaW5lIElFRUU4MDIxMV9SWF9DSEFJTk1BU0tfTUFYICA3CisKKy8qCisgKiBUaGUgODAyLjExIHNwZWMgc2F5cyBhdCBtb3N0IDIwMDcgc3RhdGlvbnMgbWF5IGJlCisgKiBhc3NvY2lhdGVkIGF0IG9uY2UuICBGb3IgbW9zdCBBUCdzIHRoaXMgaXMgd2F5IG1vcmUKKyAqIHRoYW4gaXMgZmVhc2libGUgc28gd2UgdXNlIGEgZGVmYXVsdCBvZiAxMjguICBUaGlzCisgKiBudW1iZXIgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGRyaXZlciBhbmQvb3IgYnkKKyAqIHVzZXIgY29uZmlndXJhdGlvbi4KKyAqLworI2RlZmluZSBJRUVFODAyMTFfQUlEX01BWCAgICAgICAyMDA3CisjZGVmaW5lIElFRUU4MDIxMV9BSURfREVGICAgICAgIDEyOAorCisjZGVmaW5lIElFRUU4MDIxMV9BSUQoYikgICAgKChiKSAmfjB4YzAwMCkKKworLyoKKyAqIFJUUyBmcmFtZSBsZW5ndGggcGFyYW1ldGVycy4gIFRoZSBkZWZhdWx0IGlzIHNwZWNpZmllZCBpbgorICogdGhlIDgwMi4xMSBzcGVjLiAgVGhlIG1heCBtYXkgYmUgd3JvbmcgZm9yIGp1bWJvIGZyYW1lcy4KKyAqLworI2RlZmluZSBJRUVFODAyMTFfUlRTX0RFRkFVTFQgICAgICAgNTEyCisjZGVmaW5lIElFRUU4MDIxMV9SVFNfTUlOICAgICAgICAgICAwCisjZGVmaW5lIElFRUU4MDIxMV9SVFNfTUFYICAgICAgICAgICAyMzQ3CisKKy8qCisgKiBGcmFnbWVudGF0aW9uIGxpbWl0cworICovCisjZGVmaW5lIElFRUU4MDIxMV9GUkFHTVRfVEhSRVNIT0xEX01JTiAgICAgICAgNTQwICAgICAgIC8qIG1pbiBmcmFnIHRocmVzaG9sZCAqLworI2RlZmluZSBJRUVFODAyMTFfRlJBR01UX1RIUkVTSE9MRF9NQVggICAgICAgMjM0NiAgICAgICAvKiBtYXggZnJhZyB0aHJlc2hvbGQgKi8KKworLyoKKyAqIFJlZ3VsYXRvcnkgZXh0ZW50aW9uIGlkZW50aWZpZXIgZm9yIGNvdW50cnkgSUUuCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1JFR19FWFRfSUQgICAgICAgIDIwMQorCisvKgorICogb3ZlcmxhcHBpbmcgQlNTCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX09CU1NfU0NBTl9QQVNTSVZFX0RXRUxMX0RFRiAgMjAKKyNkZWZpbmUgSUVFRTgwMjExX09CU1NfU0NBTl9BQ1RJVkVfRFdFTExfREVGICAgMTAKKyNkZWZpbmUgSUVFRTgwMjExX09CU1NfU0NBTl9JTlRFUlZBTF9ERUYgICAgICAgMzAwCisjZGVmaW5lIElFRUU4MDIxMV9PQlNTX1NDQU5fUEFTU0lWRV9UT1RBTF9ERUYgIDIwMAorI2RlZmluZSBJRUVFODAyMTFfT0JTU19TQ0FOX0FDVElWRV9UT1RBTF9ERUYgICAyMAorI2RlZmluZSBJRUVFODAyMTFfT0JTU19TQ0FOX1RIUkVTSF9ERUYgICAyNQorI2RlZmluZSBJRUVFODAyMTFfT0JTU19TQ0FOX0RFTEFZX0RFRiAgIDUKKworLyoKKyAqIG92ZXJsYXBwaW5nIEJTUyBzY2FuIGllCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfb2Jzc19zY2FuIHsKKwl1aW50OF90IGVsZW1faWQ7CisJdWludDhfdCBlbGVtX2xlbjsKKwl1aW50MTZfdCBzY2FuX3Bhc3NpdmVfZHdlbGw7CisJdWludDE2X3Qgc2Nhbl9hY3RpdmVfZHdlbGw7CisJdWludDE2X3Qgc2Nhbl9pbnRlcnZhbDsKKwl1aW50MTZfdCBzY2FuX3Bhc3NpdmVfdG90YWw7CisJdWludDE2X3Qgc2Nhbl9hY3RpdmVfdG90YWw7CisJdWludDE2X3Qgc2Nhbl9kZWxheTsKKwl1aW50MTZfdCBzY2FuX3RocmVzaDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBFeHRlbmRlZCBjYXBhYmlsaXR5IGllCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfZXh0X2NhcCB7CisJdWludDhfdCBlbGVtX2lkOworCXVpbnQ4X3QgZWxlbV9sZW47CisJdWludDMyX3QgZXh0X2NhcGZsYWdzOworCXVpbnQzMl90IGV4dF9jYXBmbGFnczI7Cit9IF9fcGFja2VkOworCisvKiBFeHRlbmRlZCBjYXBhYmlsaXR5IElFIGZsYWdzICovCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV8yMDQwQ09FWFRNR01UICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9URlMgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9GTVMgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9XTk1TTEVFUE1PREUgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9USU1CUk9BRENBU1QgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9QUk9YWUFSUCAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9CU1NUUkFOU0lUSU9OICAgICAgICAweDAwMDgwMDAwCisvKiBUdW5uZWxlZCBEaXJlY3QgTGluayBTZXR1cCAoVERMUykgZXh0ZW5kZWQgY2FwYWJpbGl0eSBiaXRzICovCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9QRUVSX1VBUFNEX0JVRl9TVEEgICAweDEwMDAwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9URExTX1BFRVJfUFNNICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9URExTX0NIQU5fU1ggICAgICAgICAweDQwMDAwMDAwCisvKiAybmQgRXh0ZW5kZWQgY2FwYWJpbGl0eSBJRSBmbGFncyBiaXQzMi1iaXQ2MyovCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9URExTU1VQUE9SVCAgICAgIDB4MDAwMDAwMjAgIC8qIGJpdC0zNyBURExTIFN1cHBvcnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0VYVENBUElFX1RETFNQUk9ISUJJVCAgICAgMHgwMDAwMDA0MCAgLyogYml0LTM4IFRETFMgUHJvaGliaXQgU3VwcG9ydCAqLworI2RlZmluZSBJRUVFODAyMTFfRVhUQ0FQSUVfVERMU0NIQU5TWFBST0hJQklUICAgMHgwMDAwMDA4MCAgICAgIC8qIGJpdC0zOSBURExTIENoYW5uZWwgU3dpdGNoIFByb2hpYml0ICovCisjZGVmaW5lIElFRUU4MDIxMV9FWFRDQVBJRV9URExTX1dJREVfQkFORCAgIDB4MjAwMDAwODAgIC8qIGJpdC02MSBURExTIFdpZGUgQmFuZHdpZHRoIHN1cHBvcnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0VYVENBUElFX09QX01PREVfTk9USUZZICAgMHg0MDAwMDAwMCAgLyogYml0LTYyIE9wZXJhdGluZyBNb2RlIG5vdGlmaWNhdGlvbiAqLworCisvKgorICogVGhlc2UgY2FwcyBhcmUgcG9wdWxhdGVkIHdoZW4gd2UgcmVjaWV2ZSBiZWFjb24vcHJvYmUgcmVzcG9uc2UKKyAqIFRoaXMgaXMgdXNlZCB0byBtYWludGFpbiBsb2NhbCBURExTIGNhcCBiaXQgbWFza3MKKyAqLworCisjZGVmaW5lIElFRUU4MDIxMV9URExTX1BST0hJQklUICAgICAweDAwMDAwMDAxICAvKiBiaXQtMSBURExTIFByb2hpYml0IFN1cHBvcnQgKi8KKworLyoKKyAqIDIwLzQwIEJTUyBjb2V4aXN0ZW5jZSBpZQorICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX2Jzc19jb2V4IHsKKwl1aW50OF90IGVsZW1faWQ7CisJdWludDhfdCBlbGVtX2xlbjsKKyNpZiBfQllURV9PUkRFUiA9PSBfQklHX0VORElBTgorCXVpbnQ4X3QgcmVzZXJ2ZWQxIDogMSwKKwkJcmVzZXJ2ZWQyIDogMSwKKwkJcmVzZXJ2ZWQzIDogMSwKKwkJb2Jzc19leGVtcHRfZ3JhbnQgOiAxLAorCQlvYnNzX2V4ZW1wdF9yZXEgOiAxLAorCQlodDIwX3dpZHRoX3JlcSA6IDEsIGh0NDBfaW50b2xlcmFudCA6IDEsIGluZl9yZXF1ZXN0IDogMTsKKyNlbHNlCisJdWludDhfdCBpbmZfcmVxdWVzdCA6IDEsCisJCWh0NDBfaW50b2xlcmFudCA6IDEsCisJCWh0MjBfd2lkdGhfcmVxIDogMSwKKwkJb2Jzc19leGVtcHRfcmVxIDogMSwKKwkJb2Jzc19leGVtcHRfZ3JhbnQgOiAxLCByZXNlcnZlZDMgOiAxLCByZXNlcnZlZDIgOiAxLCByZXNlcnZlZDEgOiAxOworI2VuZGlmCit9IF9fcGFja2VkOworCisvKgorICogMjAvNDAgQlNTIGludG9sZXJhbnQgY2hhbm5lbCByZXBvcnQgaWUKKyAqLworc3RydWN0IGllZWU4MDIxMV9pZV9pbnRvbGVyYW50X3JlcG9ydCB7CisJdWludDhfdCBlbGVtX2lkOworCXVpbnQ4X3QgZWxlbV9sZW47CisJdWludDhfdCByZWdfY2xhc3M7CisJdWludDhfdCBjaGFuX2xpc3RbMV07ICAgLyogdmFyaWFibGUtbGVuZ3RoIGNoYW5uZWwgbGlzdCAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIDIwLzQwIGNvZXh0IG1hbmFnZW1lbnQgYWN0aW9uIGZyYW1lCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfYWN0aW9uX2Jzc19jb2V4X2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2FjdGlvbiBhY19oZWFkZXI7CisJc3RydWN0IGllZWU4MDIxMV9pZV9ic3NfY29leCBjb2V4OworCXN0cnVjdCBpZWVlODAyMTFfaWVfaW50b2xlcmFudF9yZXBvcnQgY2hhbl9yZXBvcnQ7Cit9IF9fcGFja2VkOworCit0eXBlZGVmIGVudW0gaWVlZTgwMjExX3RpZV9pbnRlcnZhbF90eXBlIHsKKwlJRUVFODAyMTFfVElFX0lOVEVSVkFMX1RZUEVfUkVTRVJWRUQgPSAwLAorCUlFRUU4MDIxMV9USUVfSU5URVJWQUxfVFlQRV9SRUFTU09DX0RFQURMSU5FX0lOVEVSVkFMID0gMSwKKwlJRUVFODAyMTFfVElFX0lOVEVSVkFMX1RZUEVfS0VZX0xJRkVUSU1FX0lOVEVSVkFMID0gMiwKKwlJRUVFODAyMTFfVElFX0lOVEVSVkFMX1RZUEVfQVNTT0NfQ09NRUJBQ0tfVElNRSA9IDMsCit9IGllZWU4MDIxMV90aWVfaW50ZXJ2YWxfdHlwZV90OworCitzdHJ1Y3QgaWVlZTgwMjExX2llX3RpbWVvdXRfaW50ZXJ2YWwgeworCXVpbnQ4X3QgZWxlbV9pZDsKKwl1aW50OF90IGVsZW1fbGVuOworCXVpbnQ4X3QgaW50ZXJ2YWxfdHlwZTsKKwl1aW50MzJfdCB2YWx1ZTsKK30gX19wYWNrZWQ7CisKKy8qIFRPRE8gLT4gTmVlZCB0byBDaGVjayBSZWRlZmluaXRpb24gRXJyb3IgdXNlZCBpbiBvbmx5IFVNQUMgKi8KKyNpZiAwCisvKiBNYW5hZ2VtZW50IE1JQyBpbmZvcm1hdGlvbiBlbGVtZW50IChJRUVFIDgwMi4xMXcpICovCitzdHJ1Y3QgaWVlZTgwMjExX21taWUgeworCXVpbnQ4X3QgZWxlbWVudF9pZDsKKwl1aW50OF90IGxlbmd0aDsKKwl1aW50MTZfdCBrZXlfaWQ7CisJdWludDhfdCBzZXF1ZW5jZV9udW1iZXJbNl07CisJdWludDhfdCBtaWNbOF07Cit9IF9fcGFja2VkOworI2VuZGlmCisKKy8qCisgKiA4MDIuMTFuIFNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBlbGVtZW50CisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NFQ19DSEFOX09GRlNFVF9TQ04gICAgICAgICAgICAgICAwICAgLyogbm8gc2Vjb25kYXJ5IGNoYW5uZWwgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NFQ19DSEFOX09GRlNFVF9TQ0EgICAgICAgICAgICAgICAxICAgLyogc2Vjb25kYXJ5IGNoYW5uZWwgYWJvdmUgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NFQ19DSEFOX09GRlNFVF9TQ0IgICAgICAgICAgICAgICAzICAgLyogc2Vjb25kYXJ5IGNoYW5uZWwgYmVsb3cgKi8KKworc3RydWN0IGllZWU4MDIxMV9pZV9zZWNfY2hhbl9vZmZzZXQgeworCXVpbnQ4X3QgZWxlbV9pZDsKKwl1aW50OF90IGxlbjsKKwl1aW50OF90IHNlY19jaGFuX29mZnNldDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiA4MDIuMTFhYyBUcmFuc21pdCBQb3dlciBFbnZlbG9wZSBlbGVtZW50CisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1ZIVF9UWFBXUl9JU19TVUJfRUxFTUVOVCAgICAgICAgICAxICAgLyogSXQgY2hlY2tzIHdoZXRoZXIgaXRzICBzdWIgZWxlbWVudCAqLworI2RlZmluZSBJRUVFODAyMTFfVkhUX1RYUFdSX01BWF9QT1dFUl9DT1VOVCAgICAgICAgIDQgICAvKiBNYXggVFggcG93ZXIgZWxlbWVudHMgdmFsaWQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1ZIVF9UWFBXUl9OVU1fUE9XRVJfU1VQUE9SVEVEICAgICAzICAgLyogTWF4IFRYIHBvd2VyIGVsZW1lbnRzIHN1cHBvcnRlZCAqLworI2RlZmluZSBJRUVFODAyMTFfVkhUX1RYUFdSX0xDTF9NQVhfUFdSX1VOSVRTX1NIRlQgIDMgICAvKiBCMy1CNSBMb2NhbCBNYXggdHJhbnNtaXQgcG93ZXIgdW5pdHMgKi8KKworc3RydWN0IGllZWU4MDIxMV9pZV92aHRfdHhwd3JfZW52IHsKKwl1aW50OF90IGVsZW1faWQ7CisJdWludDhfdCBlbGVtX2xlbjsKKwl1aW50OF90IHR4cHdyX2luZm87ICAgICAvKiBUcmFuc21pdCBQb3dlciBJbmZvcm1hdGlvbiAqLworCXVpbnQ4X3QgbG9jYWxfbWF4X3R4cHdyWzRdOyAgICAgLyogTG9jYWwgTWF4IFR4UG93ZXIgZm9yIDIwLDQwLDgwLDE2ME1IeiAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIDgwMi4xMWFjIFdpZGUgQmFuZHdpZHRoIENoYW5uZWwgU3dpdGNoIEVsZW1lbnQKKyAqLworCisjZGVmaW5lIElFRUU4MDIxMV9WSFRfRVhUQ0hfU1dJVENIICAgICAgICAgICAgIDEgICAgICAgIC8qIEZvciBleHRlbnNpb24gY2hhbm5lbCBzd2l0Y2ggKi8KKyNkZWZpbmUgQ0hXSURUSF9WSFQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgICAgICAgLyogQ2hhbm5lbCB3aWR0aCAyMCAqLworI2RlZmluZSBDSFdJRFRIX1ZIVDQwICAgICAgICAgICAgICAgICAgICAgICAgICA0MCAgICAgICAvKiBDaGFubmVsIHdpZHRoIDQwICovCisjZGVmaW5lIENIV0lEVEhfVkhUODAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwICAgICAgIC8qIENoYW5uZWwgd2lkdGggODAgKi8KKyNkZWZpbmUgQ0hXSURUSF9WSFQxNjAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwICAgICAgLyogQ2hhbm5lbCB3aWR0aCAxNjAgKi8KKworc3RydWN0IGllZWU4MDIxMV9pZV93aWRlX2J3X3N3aXRjaCB7CisJdWludDhfdCBlbGVtX2lkOworCXVpbnQ4X3QgZWxlbV9sZW47CisJdWludDhfdCBuZXdfY2hfd2lkdGg7ICAgLyogTmV3IGNoYW5uZWwgd2lkdGggKi8KKwl1aW50OF90IG5ld19jaF9mcmVxX3NlZzE7ICAgICAgIC8qIENoYW5uZWwgQ2VudGVyIGZyZXF1ZW5jeSAxICovCisJdWludDhfdCBuZXdfY2hfZnJlcV9zZWcyOyAgICAgICAvKiBDaGFubmVsIENlbnRlciBmcmVxdWVuY3kgMiAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBJRUVFODAyMTFfUlNTSV9SWCAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIElFRUU4MDIxMV9SU1NJX1RYICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSUVFRTgwMjExX1JTU0lfRVhUQ0hBTiAgMHgwMDAwMDAwNAorI2RlZmluZSBJRUVFODAyMTFfUlNTSV9CRUFDT04gICAweDAwMDAwMDA4CisjZGVmaW5lIElFRUU4MDIxMV9SU1NJX1JYREFUQSAgIDB4MDAwMDAwMTAKKworI2RlZmluZSBJRUVFODAyMTFfUkFURV9UWCAwCisjZGVmaW5lIElFRUU4MDIxMV9SQVRFX1JYIDEKKyNkZWZpbmUgSUVFRTgwMjExX0xBU1RSQVRFX1RYIDIKKyNkZWZpbmUgSUVFRTgwMjExX0xBU1RSQVRFX1JYIDMKKyNkZWZpbmUgSUVFRTgwMjExX1JBVEVDT0RFX1RYIDQKKyNkZWZpbmUgSUVFRTgwMjExX1JBVEVDT0RFX1JYIDUKKworI2RlZmluZSBJRUVFODAyMTFfTUFYX1JBVEVfUEVSX0NMSUVOVCA4CisvKiBEZWZpbmUgZm9yIHRoZSBQMlAgV2lsZGNhcmQgU1NJRCAqLworI2RlZmluZSBJRUVFODAyMTFfUDJQX1dJTERDQVJEX1NTSUQgICAgICAgICAiRElSRUNULSIKKworI2RlZmluZSBJRUVFODAyMTFfUDJQX1dJTERDQVJEX1NTSURfTEVOICAgICAoc2l6ZW9mKElFRUU4MDIxMV9QMlBfV0lMRENBUkRfU1NJRCkgLSAxKQorCisjZW5kaWYgLyogQ0RTX0NPTU1PTl9JRUVFODAyMTFfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RzL2luYy9jZHNfaWVlZTgwMjExX2RlZmluZXMuaCBiL2NvcmUvY2RzL2luYy9jZHNfaWVlZTgwMjExX2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzdhZDQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZHMvaW5jL2Nkc19pZWVlODAyMTFfZGVmaW5lcy5oCkBAIC0wLDAgKzEsMTM3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBDRFNfSUVFRTgwMjExX0RFRklORVNfSF8KKyNkZWZpbmUgQ0RTX0lFRUU4MDIxMV9ERUZJTkVTX0hfCisKKyNpbmNsdWRlICJjZHNfaWVlZTgwMjExX2NvbW1vbi5oIgorCisvKgorICogUHVibGljIGRlZmluZXMgZm9yIEF0aGVyb3MgVXBwZXIgTUFDIExheWVyCisgKi8KKworLyoqCisgKiBAYnJpZWYgT3BhcXVlIGhhbmRsZSBvZiA4MDIuMTEgcHJvdG9jYWwgbGF5ZXIuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFjb207Cit0eXBlZGVmIHN0cnVjdCBpZWVlODAyMTFjb20gKndsYW5fZGV2X3Q7CisKKy8qKgorICogQGJyaWVmIE9wYXF1ZSBoYW5kbGUgdG8gQXBwIElFIG1vZHVsZS4KKyAqLworc3RydWN0IHdsYW5fbWxtZV9hcHBfaWU7Cit0eXBlZGVmIHN0cnVjdCB3bGFuX21sbWVfYXBwX2llICp3bGFuX21sbWVfYXBwX2llX3Q7CisKKy8qKgorICogQGJyaWVmIE9wYXF1ZSBoYW5kbGUgb2YgbmV0d29yayBpbnN0YW5jZSAodmFwKSBpbiA4MDIuMTEgcHJvdG9jYWwgbGF5ZXIuCisgKi8KK3N0cnVjdCBpZWVlODAyMTF2YXA7Cit0eXBlZGVmIHN0cnVjdCBpZWVlODAyMTF2YXAgKndsYW5faWZfdDsKKworc3RydWN0IGllZWU4MDIxMXZhcHByb2ZpbGU7Cit0eXBlZGVmIHN0cnVjdCBpZWVlODAyMTF2YXBwcm9maWxlICp3bGFuX2lmX2luZm9fdDsKKworLyoqCisgKiBAYnJpZWYgT3BhcXVlIGhhbmRsZSBvZiBhIG5vZGUgaW4gdGhlIHdpZmkgbmV0d29yay4KKyAqLworc3RydWN0IGllZWU4MDIxMV9ub2RlOwordHlwZWRlZiBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKndsYW5fbm9kZV90OworCisvKioKKyAqIEBicmllZiBPcGFxdWUgaGFuZGxlIG9mIE9TIGludGVyZmFjZSAoaWZwIGluIHRoZSBjYXNlIG9mIHVuaXggKS4KKyAqLworc3RydWN0IF9vc19pZl90OwordHlwZWRlZiBzdHJ1Y3QgX29zX2lmX3QgKm9zX2lmX3Q7CisKKy8qKgorICoKKyAqIEBicmllZiBPcGFxdWUgaGFuZGxlLgorICovCit0eXBlZGVmIHZvaWQgKm9zX2hhbmRsZV90OworCisvKioKKyAqIEBicmllZiBPcGFxdWUgaGFuZGxlIG9mIGEgY2hhbm5lbC4KKyAqLworc3RydWN0IGllZWU4MDIxMV9jaGFubmVsOwordHlwZWRlZiBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKndsYW5fY2hhbl90OworCisvKioKKyAqIEBicmllZiBPcGFxdWUgaGFuZGxlIHNjYW5fZW50cnkuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfc2Nhbl9lbnRyeTsKK3R5cGVkZWYgc3RydWN0IGllZWU4MDIxMV9zY2FuX2VudHJ5ICp3bGFuX3NjYW5fZW50cnlfdDsKKworLyogQW9XIHJlbGF0ZWQgZGVmaW5lcyAqLworI2RlZmluZSBBT1dfTUFYX1JFQ0VJVkVSX0NPVU5UICAxMAorCisjZGVmaW5lIElFRUU4MDIxMV9OV0lEX0xFTiAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIElFRUU4MDIxMV9JU09fQ09VTlRSWV9MRU5HVEggICAgICAgIDMgICAvKiBsZW5ndGggb2YgMTFkIElTTyBjb3VudHJ5IHN0cmluZyAqLworCit0eXBlZGVmIHN0cnVjdCBfaWVlZTgwMjExX3NzaWQgeworCWludCBsZW47CisJdWludDhfdCBzc2lkW0lFRUU4MDIxMV9OV0lEX0xFTl07Cit9IGllZWU4MDIxMV9zc2lkOworCit0eXBlZGVmIHN0cnVjdCBpZWVlODAyMTFfdHhfc3RhdHVzIHsKKwlpbnQgdHNfZmxhZ3M7CisjZGVmaW5lIElFRUU4MDIxMV9UWF9FUlJPUiAgICAgICAgICAweDAxCisjZGVmaW5lIElFRUU4MDIxMV9UWF9YUkVUUlkgICAgICAgICAweDAyCisKKwlpbnQgdHNfcmV0cmllczsgICAgICAgICAvKiBudW1iZXIgb2YgcmV0cmllcyB0byBzdWNjZXNzZnVsbHkgdHJhbnNtaXQgdGhpcyBmcmFtZSAqLworI2lmZGVmIEFUSF9TVVBQT1JUX1R4QkYKKwl1aW50OF90IHRzX3R4YmZzdGF0dXM7CisjZGVmaW5lIEFSX0JXX01pc21hdGNoICAgICAgMHgxCisjZGVmaW5lIEFSX1N0cmVhbV9NaXNzICAgICAgMHgyCisjZGVmaW5lIEFSX0NWX01pc3NlZCAgICAgICAgMHg0CisjZGVmaW5lIEFSX0Rlc3RfTWlzcyAgICAgICAgMHg4CisjZGVmaW5lIEFSX0V4cGlyZWQgICAgICAgICAgMHgxMAorI2RlZmluZSBBUl9UeEJGX1ZhbGlkX0hXX1N0YXR1cyAgICAoQVJfQldfTWlzbWF0Y2h8QVJfU3RyZWFtX01pc3N8QVJfQ1ZfTWlzc2VkfEFSX0Rlc3RfTWlzc3xBUl9FeHBpcmVkKQorI2RlZmluZSBUeEJGX1NUQVRVU19Tb3VuZGluZ19Db21wbGV0ZSAgIDB4MjAKKyNkZWZpbmUgVHhCRl9TVEFUVVNfU291bmRpbmdfUmVxdWVzdCAgICAweDQwCisjZGVmaW5lIFR4QkZfVmFsaWRfU1dfU3RhdHVzICAoVHhCRl9TVEFUVVNfU291bmRpbmdfQ29tcGxldGUgfCBUeEJGX1NUQVRVU19Tb3VuZGluZ19SZXF1ZXN0KQorI2RlZmluZSBUeEJGX1ZhbGlkX1N0YXR1cyAgKEFSX1R4QkZfVmFsaWRfSFdfU3RhdHVzIHwgVHhCRl9WYWxpZF9TV19TdGF0dXMpCisJdWludDMyX3QgdHNfdHN0YW1wOyAgICAgLyogdHggdGltZSBzdGFtcCAqLworI2VuZGlmCisjaWZkZWYgQVRIX1NVUFBPUlRfRkxPV01BQ19NT0RVTEUKKwl1aW50OF90IHRzX2Zsb3dtYWNfZmxhZ3M7CisjZGVmaW5lIElFRUU4MDIxMV9UWF9GTE9XTUFDX0RPTkUgICAgICAgICAgIDB4MDEKKyNlbmRpZgorCXVpbnQzMl90IHRzX3JhdGVLYnBzOworfSBpZWVlODAyMTFfeG1pdF9zdGF0dXM7CisKKyNpZm5kZWYgRVhURVJOQUxfVVNFX09OTFkKK3R5cGVkZWYgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgeworCWludCByc19udW1jaGFpbnM7CisJaW50IHJzX2ZsYWdzOworI2RlZmluZSBJRUVFODAyMTFfUlhfRkNTX0VSUk9SICAgICAgMHgwMQorI2RlZmluZSBJRUVFODAyMTFfUlhfTUlDX0VSUk9SICAgICAgMHgwMgorI2RlZmluZSBJRUVFODAyMTFfUlhfREVDUllQVF9FUlJPUiAgMHgwNAorLyogaG9sZXMgaW4gZmxhZ3MgaGVyZSBiZXR3ZWVuLCBBVEhfUlhfWFhYWCB0byBJRUVFODAyMTFfUlhfWFhYICovCisjZGVmaW5lIElFRUU4MDIxMV9SWF9LRVlNSVNTICAgICAgICAweDIwMAorCWludCByc19yc3NpOyAgICAgICAgICAgIC8qIFJTU0kgKG5vaXNlIGZsb29yIGFqdXN0ZWQpICovCisJaW50IHJzX2Fic19yc3NpOyAgICAgICAgLyogYWJzb2x1dGUgUlNTSSAqLworCWludCByc19kYXRhcmF0ZTsgICAgICAgIC8qIGRhdGEgcmF0ZSByZWNlaXZlZCAqLworCWludCByc19yYXRlaWVlZTsKKwlpbnQgcnNfcmF0ZXBoeTsKKworI2RlZmluZSBJRUVFODAyMTFfTUFYX0FOVEVOTkEgICAgICAgMyAgIC8qIEtlZXAgdGhlIHNhbWUgYXMgQVRIX01BWF9BTlRFTk5BICovCisJdWludDhfdCByc19yc3NpY3RsW0lFRUU4MDIxMV9NQVhfQU5URU5OQV07ICAgICAgLyogUlNTSSAobm9pc2UgZmxvb3IgYWp1c3RlZCkgKi8KKwl1aW50OF90IHJzX3Jzc2lleHRuW0lFRUU4MDIxMV9NQVhfQU5URU5OQV07ICAgICAvKiBSU1NJIChub2lzZSBmbG9vciBhanVzdGVkKSAqLworCXVpbnQ4X3QgcnNfaXN2YWxpZHJzc2k7IC8qIHJzX3Jzc2kgaXMgdmFsaWQgb3Igbm90ICovCisKKwllbnVtIGllZWU4MDIxMV9waHltb2RlIHJzX3BoeW1vZGU7CisJaW50IHJzX2ZyZXE7CisKKwl1bmlvbiB7CisJCXVpbnQ4X3QgZGF0YVs4XTsKKwkJdWludDY0X3QgdHNmOworCX0gcnNfdHN0YW1wOworCisJLyoKKwkgKiBEZXRhaWwgY2hhbm5lbCBzdHJ1Y3R1cmUgb2YgcmVjdiBmcmFtZS4KKwkgKiBJdCBjb3VsZCBiZSBOVUxMIGlmIG5vdCBhdmFpbGFibGUKKwkgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKnJzX2Z1bGxfY2hhbjsKKworCXVpbnQ4X3QgcnNfaXNhZ2dyOworCXVpbnQ4X3QgcnNfaXNhcHNkOworCWludDE2X3QgcnNfbm9pc2VmbG9vcjsKKwl1aW50MTZfdCByc19jaGFubmVsOworI2lmZGVmIEFUSF9TVVBQT1JUX1R4QkYKKwl1aW50MzJfdCByc19ycHR0c3RhbXA7ICAvKiB0eGJmIHJlcG9ydCB0aW1lIHN0YW1wICovCisjZW5kaWYKKworCS8qIFRoZSBmb2xsb3dpbmcgY291bnRzIGFyZSBtZWFudCB0byBhc3Npc3QgaW4gc3RhdHMgY2FsY3VsYXRpb24uCisJICAgVGhlc2UgdmFyaWFibGVzIGFyZSBpbmNyZW1lbnRlZCBvbmx5IGluIHNwZWNpZmljIHNpdHVhdGlvbnMsIGFuZAorCSAgIHNob3VsZCBub3QgYmUgcmVsaWVkIHVwb24gZm9yIGFueSBwdXJwb3NlIG90aGVyIHRoYW4gdGhlIG9yaWdpbmFsCisJICAgc3RhdHMgcmVsYXRlZCBwdXJwb3NlIHRoZXkgaGF2ZSBiZWVuIGludHJvZHVjZWQgZm9yLiAqLworCisJdWludDE2X3QgcnNfY3J5cHRvZGVjYXBjb3VudDsgICAvKiBDcnlwdG8gYnl0ZXMgZGVjYXBwZWQvZGVtaWMnZWQuICovCisJdWludDhfdCByc19wYWRzcGFjZTsgICAgLyogTm8uIG9mIHBhZGRpbmcgYnl0ZXMgcHJlc2VudCBhZnRlciBoZWFkZXIKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB3YnVmLiAqLworCXVpbnQ4X3QgcnNfcW9zZGVjYXBjb3VudDsgICAgICAgLyogUW9TL0hUQyBieXRlcyBkZWNhcHBlZC4gKi8KKworCS8qIEVuZCBvZiBzdGF0cyBjYWxjdWxhdGlvbiByZWxhdGVkIGNvdW50cy4gKi8KKworCXVpbnQ4X3QgcnNfbHNpZ1tJRUVFODAyMTFfTFNJR19MRU5dOworCXVpbnQ4X3QgcnNfaHRzaWdbSUVFRTgwMjExX0hUU0lHX0xFTl07CisJdWludDhfdCByc19zZXJ2aWNlYnl0ZXNbSUVFRTgwMjExX1NCX0xFTl07CisKK30gaWVlZTgwMjExX3JlY3Zfc3RhdHVzOworI2VuZGlmIC8qIEVYVEVSTkFMX1VTRV9PTkxZICovCisKKy8qCisgKiBmbGFncyB0byBiZSBwYXNzZWQgdG8gaWVlZTgwMjExX3ZhcF9jcmVhdGUgZnVuY3Rpb24gLgorICovCisjZGVmaW5lIElFRUU4MDIxMV9DTE9ORV9CU1NJRCAgICAgICAgICAgMHgwMDAxICAvKiBhbGxvY2F0ZSB1bmlxdWUgbWFjL2Jzc2lkICovCisjZGVmaW5lIElFRUU4MDIxMV9DTE9ORV9OT0JFQUNPTlMgICAgICAgMHgwMDAyICAvKiBkb24ndCBzZXR1cCBiZWFjb24gdGltZXJzICovCisjZGVmaW5lIElFRUU4MDIxMV9DTE9ORV9XRFMgICAgICAgICAgICAgMHgwMDA0ICAvKiBlbmFibGUgV0RTIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NMT05FX1dEU0xFR0FDWSAgICAgICAweDAwMDggIC8qIGxlZ2FjeSBXRFMgb3BlcmF0aW9uICovCisjZGVmaW5lIElFRUU4MDIxMV9QUklNQVJZX1ZBUCAgICAgICAgICAgMHgwMDEwICAvKiBwcmltYXJ5IHZhcCAqLworI2RlZmluZSBJRUVFODAyMTFfUDJQREVWX1ZBUCAgICAgICAgICAgIDB4MDAyMCAgLyogcDJwZGV2IHZhcCAqLworI2RlZmluZSBJRUVFODAyMTFfUDJQR09fVkFQICAgICAgICAgICAgIDB4MDA0MCAgLyogcDJwLWdvIHZhcCAqLworI2RlZmluZSBJRUVFODAyMTFfUDJQQ0xJX1ZBUCAgICAgICAgICAgIDB4MDA4MCAgLyogcDJwLWNsaWVudCB2YXAgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NMT05FX01BQ0FERFIgICAgICAgICAweDAxMDAgIC8qIGNyZWF0ZSB2YXAgdy8gc3BlY2lmaWVkIG1hYy9ic3NpZCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0xPTkVfTUFUQUREUiAgICAgICAgIDB4MDIwMCAgLyogY3JlYXRlIHZhcCB3LyBzcGVjaWZpZWQgTUFUIGFkZHIgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1dSQVBfVkFQICAgICAgICAgICAgICAweDA0MDAgIC8qIHdpcmVsZXNzIHJlcGVhdGVyIGFwIHZhcCAqLworCisvKgorICogRm9yIHRoZSBuZXcgbXVsdGktdmFwIHNjYW4gZmVhdHVyZSwgdGhlcmUgaXMgYSBzZXQgb2YgZGVmYXVsdCBwcmlvcml0eSB0YWJsZXMKKyAqIGZvciBlYWNoIE9wTW9kZS4KKyAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBkZWZhdWx0IGxpc3Qgb2YgdGhlIFZBUCBTY2FuIFByaW9yaXR5IE1hcHBpbmcgYmFzZWQgb24gT3BNb2Rlcy4KKyAqIE5PVEU6IHRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgdXNlZCB3aGVuICIjaWYgQVRIX1NVUFBPUlRfTVVMVElQTEVfU0NBTlMiIGlzIHRydWUuCisgKi8KKy8qIEZvciBJQlNTIG9wbW9kZSAqLworI2RlZmluZSBERUZfVkFQX1NDQU5fUFJJX01BUF9PUE1PREVfSUJTU19CQVNFICAgICAgICAgICAgICAgMAorLyogRm9yIFNUQSBvcG1vZGUgKi8KKyNkZWZpbmUgREVGX1ZBUF9TQ0FOX1BSSV9NQVBfT1BNT0RFX1NUQV9CQVNFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGX1ZBUF9TQ0FOX1BSSV9NQVBfT1BNT0RFX1NUQV9QMlBfQ0xJRU5UICAgICAgICAgIDEKKy8qIEZvciBIb3N0QXAgb3Btb2RlICovCisjZGVmaW5lIERFRl9WQVBfU0NBTl9QUklfTUFQX09QTU9ERV9BUF9CQVNFICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFRl9WQVBfU0NBTl9QUklfTUFQX09QTU9ERV9BUF9QMlBfR08gICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRl9WQVBfU0NBTl9QUklfTUFQX09QTU9ERV9BUF9QMlBfREVWSUNFICAgICAgICAgICAyCisvKiBGb3IgQlRBbXAgb3Btb2RlICovCisjZGVmaW5lIERFRl9WQVBfU0NBTl9QUklfTUFQX09QTU9ERV9CVEFNUF9CQVNFICAgICAgICAgICAgICAwCisKK3R5cGVkZWYgZW51bSBfaWVlZTgwMjExX2Rldl92YXBfZXZlbnQgeworCUlFRUU4MDIxMV9WQVBfQ1JFQVRFRCA9IDEsCisJSUVFRTgwMjExX1ZBUF9TVE9QUEVELAorCUlFRUU4MDIxMV9WQVBfREVMRVRFRAorfSBpZWVlODAyMTFfZGV2X3ZhcF9ldmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX3dsYW5fZGV2X2V2ZW50X2hhbmRsZXJfdGFibGUgeworCXZvaWQgKCp3bGFuX2Rldl92YXBfZXZlbnQpKHZvaWQgKmV2ZW50X2FyZywgd2xhbl9kZXZfdCwgb3NfaWZfdCwgaWVlZTgwMjExX2Rldl92YXBfZXZlbnQpOyAgICAgIC8qIGNhbGxiYWNrIHRvIHJlY2VpdmUgdmFwIGV2ZW50cyAqLworI2lmZGVmIEFUSF9TVVBQT1JUX1NQRUNUUkFMCisJdm9pZCAoKndsYW5fZGV2X3NwZWN0cmFsX2luZGljYXRlKSh2b2lkICosIHZvaWQgKiwgdWludDMyX3QpOworI2VuZGlmCit9IHdsYW5fZGV2X2V2ZW50X2hhbmRsZXJfdGFibGU7CisKK3R5cGVkZWYgZW51bSBfaWVlZTgwMjExX2FwX3N0b3BwZWRfcmVhc29uIHsKKwlJRUVFODAyMTFfQVBfU1RPUFBFRF9SRUFTT05fRFVNTVkgPSAwLCAgLyogRHVtbXkgcGxhY2Vob2xkZXIuIFNob3VsZCBub3QgdXNlICovCisJSUVFRTgwMjExX0FQX1NUT1BQRURfUkVBU09OX0NIQU5ORUxfREZTID0gMSwKK30gaWVlZTgwMjExX2FwX3N0b3BwZWRfcmVhc29uOworCit0eXBlZGVmIGludCBJRUVFODAyMTFfUkVBU09OX0NPREU7Cit0eXBlZGVmIGludCBJRUVFODAyMTFfU1RBVFVTOworCisvKgorICogc2NhbiBBUEkgcmVsYXRlZCBzdHJ1Y3RzLgorICovCit0eXBlZGVmIGVudW0gX2llZWU4MDIxMV9zY2FuX3R5cGUgeworCUlFRUU4MDIxMV9TQ0FOX0JBQ0tHUk9VTkQsCisJSUVFRTgwMjExX1NDQU5fRk9SRUdST1VORCwKKwlJRUVFODAyMTFfU0NBTl9TUEVDVFJBTCwKKwlJRUVFODAyMTFfU0NBTl9SRVBFQVRFUl9CQUNLR1JPVU5ELAorCUlFRUU4MDIxMV9TQ0FOX1JFUEVBVEVSX0VYVF9CQUNLR1JPVU5ELAorCUlFRUU4MDIxMV9TQ0FOX1JBRElPX01FQVNVUkVNRU5UUywKK30gaWVlZTgwMjExX3NjYW5fdHlwZTsKKworLyoKKyAqIFByaW9yaXR5IG51bWJlcnMgbXVzdCBiZSBzZXF1ZW50aWFsLCBzdGFydGluZyB3aXRoIDAuCisgKi8KK3R5cGVkZWYgZW51bSBpZWVlODAyMTFfc2Nhbl9wcmlvcml0eV90IHsKKwlJRUVFODAyMTFfU0NBTl9QUklPUklUWV9WRVJZX0xPVyA9IDAsCisJSUVFRTgwMjExX1NDQU5fUFJJT1JJVFlfTE9XLAorCUlFRUU4MDIxMV9TQ0FOX1BSSU9SSVRZX01FRElVTSwKKwlJRUVFODAyMTFfU0NBTl9QUklPUklUWV9ISUdILAorCUlFRUU4MDIxMV9TQ0FOX1BSSU9SSVRZX1ZFUllfSElHSCwKKworCUlFRUU4MDIxMV9TQ0FOX1BSSU9SSVRZX0NPVU5UICAgLyogbnVtYmVyIG9mIHByaW9yaXRpZXMgc3VwcG9ydGVkICovCit9IElFRUU4MDIxMV9TQ0FOX1BSSU9SSVRZOworCit0eXBlZGVmIHVpbnQxNl90IElFRUU4MDIxMV9TQ0FOX1JFUVVFU1RPUjsKK3R5cGVkZWYgdWludDMyX3QgSUVFRTgwMjExX1NDQU5fSUQ7CisKKyNkZWZpbmUgSUVFRTgwMjExX1NDQU5fSURfTk9ORSAgICAgICAgICAgICAgICAgICAgMAorCisvKiBBbGwgUDJQIHNjYW5zIGN1cnJlbnRseSB1c2UgbWVkaXVtIHByaW9yaXR5ICovCisjZGVmaW5lIElFRUU4MDIxMV9QMlBfREVGQVVMVF9TQ0FOX1BSSU9SSVRZICAgICAgIElFRUU4MDIxMV9TQ0FOX1BSSU9SSVRZX01FRElVTQorI2RlZmluZSBJRUVFODAyMTFfUDJQX1NDQU5fUFJJT1JJVFlfSElHSCAgICAgICAgICBJRUVFODAyMTFfU0NBTl9QUklPUklUWV9ISUdICisKKy8qIE1hc2tzIGlkZW50aWZ5aW5nIHR5cGVzL0lEIG9mIHNjYW5zICovCisjZGVmaW5lIElFRUU4MDIxMV9TUEVDSUZJQ19TQ0FOICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1ZBUF9TQ0FOICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBJRUVFODAyMTFfQUxMX1NDQU5TICAgICAgICAgICAweDA0MDAwMDAwCisKKy8qKgorICogaG9zdCBzY2FuIGJpdC4gb25seSByZWxldmFudCBmb3IgaG9zdC90YXJnZXQgYXJjaGl0ZWN0dXJlLgorICogZG8gbm90IHJldXNlIHRoaXMgYml0IGRlZmluaXRpb24uIHRhcmdldCB1c2VzIHRoaXMgLgorICoKKyAqLworI2RlZmluZSBJRUVFODAyMTFfSE9TVF9TQ0FOICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TQ0FOX0NMQVNTX01BU0sgICAgIDB4RkYwMDAwMDAKKworI2RlZmluZSBJRUVFODAyMTFfU0NBTl9QQVNTSVZFICAgICAgICAgICAgMHgwMDAxICAgICAgICAvKiBwYXNzaXZlbHkgc2NhbiBhbGwgdGhlIGNoYW5uZWxzICovCisjZGVmaW5lIElFRUU4MDIxMV9TQ0FOX0FDVElWRSAgICAgICAgICAgICAweDAwMDIgICAgICAgIC8qIGFjdGl2ZWx5ICBzY2FuIGFsbCB0aGUgY2hhbm5lbHMgKHJlZ2RvbWFpbiBydWxlcyBzdGlsbCBhcHBseSkgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NDQU5fMkdIWiAgICAgICAgICAgICAgIDB4MDAwNCAgICAgICAgLyogc2NhbiAyR0h6IGJhbmQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NDQU5fNUdIWiAgICAgICAgICAgICAgIDB4MDAwOCAgICAgICAgLyogc2NhbiA1R0h6IGJhbmQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NDQU5fQUxMQkFORFMgICAgICAgICAgIChJRUVFODAyMTFfU0NBTl81R0haIHwgSUVFRTgwMjExX1NDQU5fMkdIWikKKyNkZWZpbmUgSUVFRTgwMjExX1NDQU5fQ09OVElOVU9VUyAgICAgICAgIDB4MDAxMCAgICAgICAgLyoga2VlcCBzY2FubmluZyB1bnRpbCBtYXhzY2FudGltZSBleHBpcmVzICovCisjZGVmaW5lIElFRUU4MDIxMV9TQ0FOX0ZPUkNFRCAgICAgICAgICAgICAweDAwMjAgICAgICAgIC8qIGZvcmNlZCBzY2FuIChPUyByZXF1ZXN0KSAtIHNob3VsZCBwcm9jZWVkIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIGRhdGEgdHJhZmZpYyAqLworI2RlZmluZSBJRUVFODAyMTFfU0NBTl9OT1cgICAgICAgICAgICAgICAgMHgwMDQwICAgICAgICAvKiBzY2FuIG5vdyAoVXNlciByZXF1ZXN0KSAgLSBzaG91bGQgcHJvY2VlZCBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiBkYXRhIHRyYWZmaWMgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NDQU5fQUREX0JDQVNUX1BST0JFICAgIDB4MDA4MCAgICAgICAgLyogYWRkIHdpbGRjYXJkIHNzaWQgYW5kIGJyb2FkY2FzdCBwcm9iZSByZXF1ZXN0IGlmIHRoZXJlIGlzIG5vbmUgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NDQU5fRVhURVJOQUwgICAgICAgICAgIDB4MDEwMCAgICAgICAgLyogc2NhbiByZXF1ZXN0ZWQgYnkgT1MgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NDQU5fQlVSU1QgICAgICAgICAgICAgIDB4MDIwMCAgICAgICAgLyogc2NhbiBtdWx0aXBsZSBjaGFubmVscyBiZWZvcmUgcmV0dXJuaW5nIHRvIEJTUyBjaGFubmVsICovCisjZGVmaW5lIElFRUU4MDIxMV9TQ0FOX0NIQU5fRVZFTlQgICAgICAgICAweDA0MDAgICAgICAgIC8qIHNjYW4gY2hhbiBldmVudCBmb3IgIG9mZmxvYWQgYXJjaGl0ZWN0dXJlcyAqLworI2RlZmluZSBJRUVFODAyMTFfU0NBTl9GSUxURVJfUFJPQkVfUkVRICAgMHgwODAwICAgICAgICAvKiBGaWx0ZXIgcHJvYmUgcmVxdWVzdHMtIGFwcGxpY2FibGUgb25seSBmb3Igb2ZmbG9hZCBhcmNoaXRlY3R1cmVzICovCisKKyNkZWZpbmUgSUVFRTgwMjExX1NDQU5fUEFSQU1TX01BWF9TU0lEICAgICAxMAorI2RlZmluZSBJRUVFODAyMTFfU0NBTl9QQVJBTVNfTUFYX0JTU0lEICAgIDEwCisKKy8qIGZsYWcgZGVmaW5pdGlvbnMgcGFzc2VkIHRvIHNjYW5fY2FuY2VsIEFQSSAqLworCisjZGVmaW5lIElFRUU4MDIxMV9TQ0FOX0NBTkNFTF9BU1lOQyAweDAgLyogYXN5bmNocm9ub3VseSB3YWl0IGZvciBzY2FuIFNNIHRvIGNvbXBsZXRlIGNhbmNlbCAqLworI2RlZmluZSBJRUVFODAyMTFfU0NBTl9DQU5DRUxfV0FJVCAgMHgxIC8qIHdhaXQgZm9yIHNjYW4gU00gdG8gY29tcGxldGUgY2FuY2VsICovCisjZGVmaW5lIElFRUU4MDIxMV9TQ0FOX0NBTkNFTF9TWU5DICAweDIgLyogc3luY2hyb25vdXNseSBleGVjdXRlIGNhbmNlbCBzY2FuICovCisKKyNpZm5kZWYgRVhURVJOQUxfVVNFX09OTFkKK3R5cGVkZWYgYm9vbCAoKmllZWU4MDIxMV9zY2FuX3Rlcm1pbmF0aW9uX2NoZWNrKSh2b2lkICphcmcpOworCit0eXBlZGVmIHN0cnVjdCBfaWVlZTgwMjExX3NjYW5fcGFyYW1zIHsKKwlpZWVlODAyMTFfc2Nhbl90eXBlIHR5cGU7CisJaW50IG1pbl9kd2VsbF90aW1lX2FjdGl2ZTsgICAgICAvKiBtaW4gdGltZSBpbiBtc2VjIG9uIGFjdGl2ZSBjaGFubmVscyAqLworCWludCBtYXhfZHdlbGxfdGltZV9hY3RpdmU7ICAgICAgLyogbWF4IHRpbWUgaW4gbXNlYyBvbiBhY3RpdmUgY2hhbm5lbHMgKGlmIG5vIHJlc3BvbnNlKSAqLworCWludCBtaW5fZHdlbGxfdGltZV9wYXNzaXZlOyAgICAgLyogbWluIHRpbWUgaW4gbXNlYyBvbiBwYXNzaXZlIGNoYW5uZWxzICovCisJaW50IG1heF9kd2VsbF90aW1lX3Bhc3NpdmU7ICAgICAvKiBtYXggdGltZSBpbiBtc2VjIG9uIHBhc3NpdmUgY2hhbm5lbHMgKGlmIG5vIHJlc3BvbnNlKSAqLworCWludCBtaW5fcmVzdF90aW1lOyAgICAgIC8qIG1pbiB0aW1lIGluIG1zZWMgb24gdGhlIEJTUyBjaGFubmVsLCBvbmx5IHZhbGlkIGZvciBCRyBzY2FuICovCisJaW50IG1heF9yZXN0X3RpbWU7ICAgICAgLyogbWF4IHRpbWUgaW4gbXNlYyBvbiB0aGUgQlNTIGNoYW5uZWwsIG9ubHkgdmFsaWQgZm9yIEJHIHNjYW4gKi8KKwlpbnQgbWF4X29mZmNoYW5uZWxfdGltZTsgICAgICAgIC8qIG1heCB0aW1lIGF3YXkgZnJvbSBCU1MgY2hhbm5lbCwgaW4gbXMgKi8KKwlpbnQgcmVwZWF0X3Byb2JlX3RpbWU7ICAvKiB0aW1lIGJlZm9yZSBzZW5kaW5nIHNlY29uZCBwcm9iZSByZXF1ZXN0ICovCisJaW50IGlkbGVfdGltZTsgICAgICAgICAgLyogdGltZSBpbiBtc2VjIG9uIGJzcyBjaGFubmVsIGJlZm9yZSBzd2l0Y2hpbmcgY2hhbm5lbCAqLworCWludCBtYXhfc2Nhbl90aW1lOyAgICAgIC8qIG1heGltdW0gdGltZSBpbiBtc2VjIGFsbG93ZWQgZm9yIHNjYW4gICovCisJaW50IHByb2JlX2RlbGF5OyAgICAgICAgLyogZGVsYXkgaW4gbXNlYyBiZWZvcmUgc2VuZGluZyBwcm9iZSByZXF1ZXN0ICovCisJaW50IG9mZmNoYW5fcmV0cnlfZGVsYXk7ICAgICAgICAvKiBkZWxheSBpbiBtc2VjIGJlZm9yZSByZXRyeWluZyBvZmYtY2hhbm5lbCBzd2l0Y2ggKi8KKwlpbnQgbWluX2JlYWNvbl9jb3VudDsgICAvKiBudW1iZXIgb2YgaG9tZSBBUCBiZWFjb25zIHRvIHJlY2VpdmUgYmVmb3JlIGxlYXZpbmcgdGhlIGhvbWUgY2hhbm5lbCAqLworCWludCBtYXhfb2ZmY2hhbl9yZXRyaWVzOyAgICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgb2ZmLWNoYW5uZWwgc3dpdGNoICovCisJaW50IGJlYWNvbl90aW1lb3V0OyAgICAgLyogbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGJlYWNvbnMgKi8KKwlpbnQgZmxhZ3M7ICAgICAgICAgICAgICAvKiBzY2FuIGZsYWdzICovCisJaW50IG51bV9jaGFubmVsczsgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4gKi8KKwlib29sIG11bHRpcGxlX3BvcnRzX2FjdGl2ZTsgICAgIC8qIGRyaXZlciBoYXMgbXVsdGlwbGUgcG9ydHMgYWN0aXZlIGluIHRoZSBob21lIGNoYW5uZWwgKi8KKwlib29sIHJlc3RyaWN0ZWRfc2NhbjsgICAvKiBQZXJmb3JtIHJlc3RyaWN0ZWQgc2NhbiAqLworCWJvb2wgY2hhbl9saXN0X2FsbG9jYXRlZDsKKwlJRUVFODAyMTFfU0NBTl9QUklPUklUWSBwMnBfc2Nhbl9wcmlvcml0eTsgICAgICAvKiBpbmRpY2F0ZXMgdGhlIHNjYW4gcHJpb3JpdHkgaWYgdGhpcyBpcyBhIFAyUC1yZWxhdGVkIHNjYW4gKi8KKwl1aW50MzJfdCAqY2hhbl9saXN0OyAgICAvKiBhcnJheSBvZiBpZWVlIGNoYW5uZWxzIChvcikgZnJlcXVlbmNpZXMgdG8gc2NhbiAqLworCWludCBudW1fc3NpZDsgICAgICAgICAgIC8qIG51bWJlciBvZiBkZXNpcmVkIHNzaWRzICovCisJaWVlZTgwMjExX3NzaWQgc3NpZF9saXN0W0lFRUU4MDIxMV9TQ0FOX1BBUkFNU19NQVhfU1NJRF07CisJaW50IG51bV9ic3NpZDsgICAgICAgICAgLyogbnVtYmVyIG9mIGRlc2lyZWQgYnNzaWRzICovCisJdWludDhfdCBic3NpZF9saXN0W0lFRUU4MDIxMV9TQ0FOX1BBUkFNU19NQVhfQlNTSURdW0lFRUU4MDIxMV9BRERSX0xFTl07CisJc3RydWN0IGllZWU4MDIxMV9ub2RlICpic3Nfbm9kZTsgICAgICAgIC8qIEJTUyBub2RlICovCisJaW50IGllX2xlbjsgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSBpZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHByb2JlIHJlcSAqLworCXVpbnQ4X3QgKmllX2RhdGE7ICAgICAgIC8qIHBvaW50ZXIgdG8gaWUgZGF0YSAqLworCWllZWU4MDIxMV9zY2FuX3Rlcm1pbmF0aW9uX2NoZWNrIGNoZWNrX3Rlcm1pbmF0aW9uX2Z1bmN0aW9uOyAgICAvKiBmdW5jdGlvbiBjaGVja2luZyBmb3IgdGVybWluYXRpb24gY29uZGl0aW9uICovCisJdm9pZCAqY2hlY2tfdGVybWluYXRpb25fY29udGV4dDsgICAgICAgIC8qIGNvbnRleHQgcGFzc2VkIHRvIGZ1bmN0aW9uIGFib3ZlICovCit9IGllZWU4MDIxMV9zY2FuX3BhcmFtczsKKworLyogRGF0YSB0eXBlcyB1c2VkIHRvIHNwZWNpZnkgc2NhbiBwcmlvcml0aWVzICovCit0eXBlZGVmIHVpbnQzMl90IElFRUU4MDIxMV9QUklPUklUWV9NQVBQSU5HW0lFRUU4MDIxMV9TQ0FOX1BSSU9SSVRZX0NPVU5UXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDYWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcm9hbS4gIE1vZGlmaWVzIHRoZSByc3NpQWRkZXIgb2YgYSBCU1MKKyAqIGJhc2VkIG9uIHRoZSBwcmVmZXJyZWQgc3RhdHVzIG9mIGEgQlNTLgorICoKKyAqIEFjY29yZGluZyB0byBDQ1ggc3BlYywgQVAgaW4gdGhlIG5laWdoYm9yIGxpc3QgaXMgbm90IG1lYW50IGZvciBnaXZpbmcgZXh0cmEKKyAqIHdlaWdodGFnZSBpbiByb2FtaW5nLiBCeSBkb2luZyBzbywgcm9hbWluZyBiZWNvbWVzIHN0aWNreS4gU2VlIGJ1ZyAyMTIyMC4KKyAqIENoYW5nZSB0aGUgd2VpZ2h0YWdlIHRvIDAuIENpc2NvIG1heSBhc2sgaW4gZnV0dXJlIGZvciBhIHVzZXIgY29udHJvbCBvZgorICogdGhpcyB3ZWlnaHRhZ2UuCisgKi8KKyNkZWZpbmUgUFJFRkVSUkVEX0JTU19SQU5LICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIE5FSUdIQk9SX0JTU19SQU5LICAgICAgICAgICAgICAgICAgMCAgICAvKiBtdXN0IGJlIGxlc3MgdGhhbiBwcmVmZXJyZWQgQlNTIHJhbmsgKi8KKworLyoKKyAqIFRoZSB1dGlsaXR5IG9mIHRoZSBCU1MgaXMgdGhlIG1ldHJpYyB1c2VkIGluIHRoZSBzZWxlY3Rpb24KKyAqIG9mIGEgQlNTLiBUaGUgVXRpbGl0eSBvZiB0aGUgQlNTIGlzIHJlZHVjZWQgaWYgd2UganVzdCBsZWZ0IHRoZSBCU1MuCisgKiBUaGUgVXRpbGl0eSBvZiB0aGUgQlNTIGlzIG5vdCByZWR1Y2VkIGlmIHdlIGhhdmUgbGVmdCB0aGUKKyAqIEJTUyBmb3IgOCBzZWNvbmRzICg4MDAwbXMpIG9yIG1vcmUuCisgKiAyXjEzIG1pbGxpc2Vjb25kcyBpcyBhIGNsb3NlIGFwcHJveGltYXRpb24gdG8gYXZvaWQgZXhwZW5zaXZlIGRpdmlzaW9uCisgKi8KKyNkZWZpbmUgTEFTVF9BU1NPQ19USU1FX0RFTFRBX1JFUVVJUkVNRU5UICgxIDw8IDEzKSAgICAgLyogODE5MiAqLworCisjZGVmaW5lIFFCU1NfU0NBTEVfTUFYICAgICAgICAgICAgICAgICAgIDI1NSAgICAvKiBRYnNzIGNoYW5uZWwgbG9hZCBNYXggdmFsdWUgKi8KKyNkZWZpbmUgUUJTU19TQ0FMRV9ET1dOX0ZBQ1RPUiAgICAgICAgICAgICAyICAgIC8qIHNjYWxlIGZhY3RvciB0byByZWR1Y2UgUWJzcyBjaGFubmVsIGxvYWQgKi8KKyNkZWZpbmUgUUJTU19IWVNUX0FESiAgICAgICAgICAgICAgICAgICAgIDYwICAgIC8qIFFic3MgV2VpZ2h0YWdlIGZhY3RvciBmb3IgdGhlIGN1cnJlbnQgQVAgKi8KKworLyoKKyAqIEZsYWdzIHVzZWQgdG8gc2V0IGZpZWxkIEFQU3RhdGUKKyAqLworI2RlZmluZSBBUF9TVEFURV9HT09EICAgIDB4MDAKKyNkZWZpbmUgQVBfU1RBVEVfQkFEICAgICAweDAxCisjZGVmaW5lIEFQX1NUQVRFX1JFVFJZICAgMHgxMAorI2RlZmluZSBCQURfQVBfVElNRU9VVCAgIDYwMDAgICAvKiBJbiBtaWxsaSBzZWNvbmRzICovCisvKgorICogVG8gZGlzYWJsZSBCQURfQVAgc3RhdHVzIGNoZWNrIG9uIGFueSBzY2FuIGVudHJ5CisgKi8KKyNkZWZpbmUgQkFEX0FQX1RJTUVPVVRfRElTQUJMRUQgICAgICAgICAgICAgMAorCisvKgorICogQkFEX0FQIHRpbWVvdXQgc3BlY2lmaWVkIGluIHNlY29uZHMKKyAqLworI2RlZmluZSBCQURfQVBfVElNRU9VVF9JTl9TRUNPTkRTICAgICAgICAgICAxMAorCisvKgorICogU3RhdGUgdmFsdWVzIHVzZWQgdG8gcmVwcmVzZW50IG91ciBhc3NvY19zdGF0ZSB3aXRoIGFwIChkaXNjcmV0ZSwgbm90IGJpdG1hc2tzKQorICovCisjZGVmaW5lIEFQX0FTU09DX1NUQVRFX05PTkUgICAgIDAKKyNkZWZpbmUgQVBfQVNTT0NfU1RBVEVfQVVUSCAgICAgMQorI2RlZmluZSBBUF9BU1NPQ19TVEFURV9BU1NPQyAgICAyCisKKy8qCisgKiBFbnRyaWVzIGluIHRoZSBzY2FuIGxpc3QgYXJlIGNvbnNpZGVyZWQgb2Jzb2xldGUgYWZ0ZXIgNzUgc2Vjb25kcy4KKyAqLworI2RlZmluZSBJRUVFODAyMTFfU0NBTl9FTlRSWV9FWFBJUkVfVElNRSAgICAgICAgICAgNzUwMDAKKworLyoKKyAqIGlkbGUgdGltZSBpcyBvbmx5IHZhbGlkIGZvciBzY2FuIHR5cGUgSUVFRTgwMjExX1NDQU5fQkFDS0dST1VORC4KKyAqIGlmIGlkbGUgdGltZSBpcyBzZXQgdGhlbiB0aGUgc2Nhbm5lciB3b3VsZCBjaGFuZ2UgY2hhbm5lbCBmcm9tIEJTUworICogY2hhbm5lbCB0byBmb3JlaWduIGNoYW5uZWwgb25seSBpZiBib3RoIHJlc3R0aW1lIGlzIGV4cGlyZWQgYW5kCisgKiB0aGUgdGhlcmVzIHdhcyBub3QgdHJhZmZpYyBmb3IgaWRsZXRpbWUgbXNlYyBvbiB0aGUgYnNzIGNoYW5uZWwuCisgKiB2YWx1ZSBvZiAwIGZvciBpZGxldGltZSB3b3VsZCBjYXVzZSB0aGUgY2hhbm5lbCB0byBzd2l0Y2ggZnJvbSBCU1MKKyAqIGNoYW5uZWwgdG8gZm9yZWlnbiBjaGFubmVsIGFzIHNvb24gIGFzIHRoZSByZXN0dGltZSBpcyBleHBpcmVkLgorICoKKyAqIGlmIG1heHNjYW50aW1lIGlzIG5vbnplcm8gYW5kIGlmIHRoZSBzY2FubmVyIGNhbiBub3QgY29tcGxldGUgdGhlCisgKiBzY2FuIGluIG1heHNjYW50aW1lIG1zZWMgdGhlbiB0aGUgc2Nhbm5lciB3aWxsIGNhbmNlbCB0aGUgc2NhbiBhbmQKKyAqIHBvc3QgSUVFRTgwMjExX1NDQU5fQ09NUExFVEVEIGV2ZW50IHdpdGggcmVhc29uIFNDQU5fVElNRURPVVQuCisgKgorICovCisKKy8qCisgKiBjaGFubGlzdCBjYW4gYmUgZWl0aGVyIGllZWUgY2hhbm5lbHMgKG9yKSBmcmVxdWVuY2llcy4KKyAqIGlmIGEgdmFsdWUgaXMgbGVzcyB0aGFuIDEwMDAgaW1wbGVtZW50YXRpb24gYXNzdW1lcyBpdAorICogYXMgaWVlZSBjaGFubmVsICMgb3RoZXJ3aXNlIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgaXQKKyAqIGFzIGZyZXF1ZW5jeSBpbiBNaHouCisgKi8KKwordHlwZWRlZiBlbnVtIF9pZWVlODAyMTFfc2Nhbl9ldmVudF90eXBlIHsKKwlJRUVFODAyMTFfU0NBTl9TVEFSVEVELAorCUlFRUU4MDIxMV9TQ0FOX0NPTVBMRVRFRCwKKwlJRUVFODAyMTFfU0NBTl9SQURJT19NRUFTVVJFTUVOVF9TVEFSVCwKKwlJRUVFODAyMTFfU0NBTl9SQURJT19NRUFTVVJFTUVOVF9FTkQsCisJSUVFRTgwMjExX1NDQU5fUkVTVEFSVEVELAorCUlFRUU4MDIxMV9TQ0FOX0hPTUVfQ0hBTk5FTCwKKwlJRUVFODAyMTFfU0NBTl9GT1JFSUdOX0NIQU5ORUwsCisJSUVFRTgwMjExX1NDQU5fQlNTSURfTUFUQ0gsCisJSUVFRTgwMjExX1NDQU5fRk9SRUlHTl9DSEFOTkVMX0dFVF9ORiwKKwlJRUVFODAyMTFfU0NBTl9ERVFVRVVFRCwKKwlJRUVFODAyMTFfU0NBTl9QUkVFTVBURUQsCisKKwlJRUVFODAyMTFfU0NBTl9FVkVOVF9DT1VOVAorfSBpZWVlODAyMTFfc2Nhbl9ldmVudF90eXBlOworCit0eXBlZGVmIGVudW0gaWVlZTgwMjExX3NjYW5fY29tcGxldGlvbl9yZWFzb24geworCUlFRUU4MDIxMV9SRUFTT05fTk9ORSwKKwlJRUVFODAyMTFfUkVBU09OX0NPTVBMRVRFRCwKKwlJRUVFODAyMTFfUkVBU09OX0NBTkNFTExFRCwKKwlJRUVFODAyMTFfUkVBU09OX1RJTUVET1VULAorCUlFRUU4MDIxMV9SRUFTT05fVEVSTUlOQVRJT05fRlVOQ1RJT04sCisJSUVFRTgwMjExX1JFQVNPTl9NQVhfT0ZGQ0hBTl9SRVRSSUVTLAorCUlFRUU4MDIxMV9SRUFTT05fUFJFRU1QVEVELAorCUlFRUU4MDIxMV9SRUFTT05fUlVOX0ZBSUxFRCwKKwlJRUVFODAyMTFfUkVBU09OX0lOVEVSTkFMX1NUT1AsCisKKwlJRUVFODAyMTFfUkVBU09OX0NPVU5UCit9IGllZWU4MDIxMV9zY2FuX2NvbXBsZXRpb25fcmVhc29uOworCit0eXBlZGVmIHN0cnVjdCBfaWVlZTgwMjExX3NjYW5fZXZlbnQgeworCWllZWU4MDIxMV9zY2FuX2V2ZW50X3R5cGUgdHlwZTsKKwlpZWVlODAyMTFfc2Nhbl9jb21wbGV0aW9uX3JlYXNvbiByZWFzb247CisJd2xhbl9jaGFuX3QgY2hhbjsKKwlJRUVFODAyMTFfU0NBTl9SRVFVRVNUT1IgcmVxdWVzdG9yOyAgICAgLyogUmVxdWVzdG9yIElEIHBhc3NlZCB0byB0aGUgc2Nhbl9zdGFydCBmdW5jdGlvbiAqLworCUlFRUU4MDIxMV9TQ0FOX0lEIHNjYW5faWQ7ICAgICAgLyogU3BlY2lmaWMgSUQgb2YgdGhlIHNjYW4gcmVwb3J0aW5nIHRoZSBldmVudCAqLworfSBpZWVlODAyMTFfc2Nhbl9ldmVudDsKKwordHlwZWRlZiBlbnVtIF9pZWVlODAyMTFfc2Nhbl9yZXF1ZXN0X3N0YXR1cyB7CisJSUVFRTgwMjExX1NDQU5fU1RBVFVTX1FVRVVFRCwKKwlJRUVFODAyMTFfU0NBTl9TVEFUVVNfUlVOTklORywKKwlJRUVFODAyMTFfU0NBTl9TVEFUVVNfUFJFRU1QVEVELAorCUlFRUU4MDIxMV9TQ0FOX1NUQVRVU19DT01QTEVURUQKK30gaWVlZTgwMjExX3NjYW5fcmVxdWVzdF9zdGF0dXM7CisKKy8qCisgKiB0aGUgc2VudHJ5IGZpZWxkIG9mIHRodCBpZWVlODAyMTFfc2Nhbl9ldmVudCBpcyBvbmx5IHZhbGlkIGlmIHRoZQorICogZXZlbnQgdHlwZSBpcyBJRUVFODAyMTFfU0NBTl9CU1NJRF9NQVRDSC4KKyAqLworCit0eXBlZGVmIHZvaWQgKCppZWVlODAyMTFfc2Nhbl9ldmVudF9oYW5kbGVyKSh3bGFuX2lmX3QgdmFwaGFuZGxlLAorCQkJCQkgICAgIGllZWU4MDIxMV9zY2FuX2V2ZW50ICpldmVudCwKKwkJCQkJICAgICB2b2lkICphcmcpOworCit0eXBlZGVmIHN0cnVjdCBfaWVlZTgwMjExX3NjYW5faW5mbyB7CisJaWVlZTgwMjExX3NjYW5fdHlwZSB0eXBlOworCUlFRUU4MDIxMV9TQ0FOX1JFUVVFU1RPUiByZXF1ZXN0b3I7ICAgICAvKiBPcmlnaW5hdG9yIElEIHBhc3NlZCB0byB0aGUgc2Nhbl9zdGFydCBmdW5jdGlvbiAqLworCUlFRUU4MDIxMV9TQ0FOX0lEIHNjYW5faWQ7ICAgICAgLyogU3BlY2lmaWMgSUQgb2YgdGhlIHNjYW4gcmVwb3J0aW5nIHRoZSBldmVudCAqLworCUlFRUU4MDIxMV9TQ0FOX1BSSU9SSVRZIHByaW9yaXR5OyAgICAgICAvKiBSZXF1ZXN0ZWQgcHJpb3JpdHkgbGV2ZWwgKGxvdy9tZWRpdW0vaGlnaCkgKi8KKwlpZWVlODAyMTFfc2Nhbl9yZXF1ZXN0X3N0YXR1cyBzY2hlZHVsaW5nX3N0YXR1czsgICAgICAgIC8qIFF1ZXVlZC9ydW5uaW5nL3ByZWVtcHRlZC9jb21wbGV0ZWQgKi8KKwlpbnQgbWluX2R3ZWxsX3RpbWVfYWN0aXZlOyAgICAgIC8qIG1pbiB0aW1lIGluIG1zZWMgb24gYWN0aXZlIGNoYW5uZWxzICovCisJaW50IG1heF9kd2VsbF90aW1lX2FjdGl2ZTsgICAgICAvKiBtYXggdGltZSBpbiBtc2VjIG9uIGFjdGl2ZSBjaGFubmVsIChpZiBubyByZXNwb25zZSkgKi8KKwlpbnQgbWluX2R3ZWxsX3RpbWVfcGFzc2l2ZTsgICAgIC8qIG1pbiB0aW1lIGluIG1zZWMgb24gcGFzc2l2ZSBjaGFubmVscyAqLworCWludCBtYXhfZHdlbGxfdGltZV9wYXNzaXZlOyAgICAgLyogbWF4IHRpbWUgaW4gbXNlYyBvbiBwYXNzaXZlIGNoYW5uZWwgKi8KKwlpbnQgbWluX3Jlc3RfdGltZTsgICAgICAvKiBtaW4gdGltZSBpbiBtc2VjIG9uIHRoZSBCU1MgY2hhbm5lbCwgb25seSB2YWxpZCBmb3IgQkcgc2NhbiAqLworCWludCBtYXhfcmVzdF90aW1lOyAgICAgIC8qIG1heCB0aW1lIGluIG1zZWMgb24gdGhlIEJTUyBjaGFubmVsLCBvbmx5IHZhbGlkIGZvciBCRyBzY2FuICovCisJaW50IG1heF9vZmZjaGFubmVsX3RpbWU7ICAgICAgICAvKiBtYXggdGltZSBhd2F5IGZyb20gQlNTIGNoYW5uZWwsIGluIG1zICovCisJaW50IHJlcGVhdF9wcm9iZV90aW1lOyAgLyogdGltZSBiZWZvcmUgc2VuZGluZyBzZWNvbmQgcHJvYmUgcmVxdWVzdCAqLworCWludCBtaW5fYmVhY29uX2NvdW50OyAgIC8qIG51bWJlciBvZiBob21lIEFQIGJlYWNvbnMgdG8gcmVjZWl2ZSBiZWZvcmUgbGVhdmluZyB0aGUgaG9tZSBjaGFubmVsICovCisJaW50IGZsYWdzOyAgICAgICAgICAgICAgLyogc2NhbiBmbGFncyAqLworCXN5c3RpbWVfdCBzY2FuX3N0YXJ0X3RpbWU7ICAgICAgLyogc3lzdGVtIHRpbWUgd2hlbiBsYXN0IHNjYW5pIHN0YXJ0ZWQgKi8KKwlpbnQgc2Nhbm5lZF9jaGFubmVsczsgICAvKiBudW1iZXIgb2Ygc2Nhbm5lZCBjaGFubmVscyAqLworCWludCBkZWZhdWx0X2NoYW5uZWxfbGlzdF9sZW5ndGg7ICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRlZmF1bHQgY2hhbm5lbCBsaXN0ICovCisJaW50IGNoYW5uZWxfbGlzdF9sZW5ndGg7ICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGNoYW5uZWwgbGlzdCB1c2VkIGZvciB0aGUgY3VycmVudCBzY2FuICovCisJdWludDhfdCBpbl9wcm9ncmVzcyA6IDEsICAvKiBpZiB0aGUgc2NhbiBpcyBpbiBwcm9ncmVzcyAqLworCQljYW5jZWxsZWQgOiAxLCAgLyogaWYgdGhlIHNjYW4gaXMgY2FuY2VsbGVkICovCisJCXByZWVtcHRlZCA6IDEsICAvKiBpZiB0aGUgc2NhbiBpcyBwcmVlbXB0ZWQgKi8KKwkJcmVzdHJpY3RlZCA6IDE7IC8qIGlmIHRoZSBzY2FuIGlzIHJlc3RyaWN0ZWQgKi8KK30gaWVlZTgwMjExX3NjYW5faW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX2llZWU4MDIxMV9zY2FuX3JlcXVlc3RfaW5mbyB7CisJd2xhbl9pZl90IHZhcGhhbmRsZTsKKwlJRUVFODAyMTFfU0NBTl9SRVFVRVNUT1IgcmVxdWVzdG9yOworCUlFRUU4MDIxMV9TQ0FOX1BSSU9SSVRZIHJlcXVlc3RlZF9wcmlvcml0eTsKKwlJRUVFODAyMTFfU0NBTl9QUklPUklUWSBhYnNvbHV0ZV9wcmlvcml0eTsKKwlJRUVFODAyMTFfU0NBTl9JRCBzY2FuX2lkOworCWllZWU4MDIxMV9zY2FuX3JlcXVlc3Rfc3RhdHVzIHNjaGVkdWxpbmdfc3RhdHVzOworCWllZWU4MDIxMV9zY2FuX3BhcmFtcyBwYXJhbXM7CisJc3lzdGltZV90IHJlcXVlc3RfdGltZXN0YW1wOworCXVpbnQzMl90IG1heGltdW1fZHVyYXRpb247Cit9IGllZWU4MDIxMV9zY2FuX3JlcXVlc3RfaW5mbzsKKworI2VuZGlmIC8qIEVYVEVSTkFMX1VTRV9PTkxZICovCisKKyNpZm5kZWYgRVhURVJOQUxfVVNFX09OTFkKK3R5cGVkZWYgdm9pZCAoKmllZWU4MDIxMV9hY3NfZXZlbnRfaGFuZGxlcikodm9pZCAqYXJnLCB3bGFuX2NoYW5fdCBjaGFubmVsKTsKKyNlbmRpZiAvKiBFWFRFUk5BTF9VU0VfT05MWSAqLworCisjZGVmaW5lIE1BWF9DSEFJTlMgMworCit0eXBlZGVmIHN0cnVjdCBfd2xhbl9yc3NpX2luZm8geworCWludDhfdCBhdmdfcnNzaTsgICAgICAgIC8qIGF2ZXJhZ2UgcnNzaSAqLworCXVpbnQ4X3QgdmFsaWRfbWFzazsgICAgIC8qIGJpdG1hcCBvZiB2YWxpZCBlbGVtZW50cyBpbiByc3NpX2N0cmwvZXh0IGFycmF5ICovCisJaW50OF90IHJzc2lfY3RybFtNQVhfQ0hBSU5TXTsKKwlpbnQ4X3QgcnNzaV9leHRbTUFYX0NIQUlOU107Cit9IHdsYW5fcnNzaV9pbmZvOworCit0eXBlZGVmIGVudW0gX3dsYW5fcnNzaV90eXBlIHsKKwlXTEFOX1JTU0lfVFgsCisJV0xBTl9SU1NJX1JYLAorCVdMQU5fUlNTSV9CRUFDT04sICAgICAgIC8qIHJzc2kgb2YgdGhlIGJlYWNvbiwgb25seSB2YWxpZCBmb3IgU1RBL0lCU1MgdmFwICovCisJV0xBTl9SU1NJX1JYX0RBVEEKK30gd2xhbl9yc3NpX3R5cGU7CisKK3R5cGVkZWYgZW51bSBfaWVlZTgwMjExX3JhdGVfdHlwZSB7CisJSUVFRTgwMjExX1JBVEVfVFlQRV9MRUdBQ1ksCisJSUVFRTgwMjExX1JBVEVfVFlQRV9NQ1MsCit9IGllZWU4MDIxMV9yYXRlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9pZWVlODAyMTFfcmF0ZV9pbmZvIHsKKwlpZWVlODAyMTFfcmF0ZV90eXBlIHR5cGU7CisJdWludDMyX3QgcmF0ZTsgICAgICAgICAgLyogYXZlcmFnZSByYXRlIGluIGticHMgKi8KKwl1aW50MzJfdCBsYXN0cmF0ZTsgICAgICAvKiBsYXN0IHBhY2tldCByYXRlIGluIGticHMgKi8KKwl1aW50OF90IG1jczsgICAgICAgICAgICAvKiBtY3MgaW5kZXggLiBpcyB2YWxpZCBpZiByYXRlIHR5cGUgaXMgTUNTMjAgb3IgTUNTNDAgKi8KKwl1aW50OF90IG1heHJhdGVfcGVyX2NsaWVudDsKK30gaWVlZTgwMjExX3JhdGVfaW5mbzsKKwordHlwZWRlZiBlbnVtIF9pZWVlODAyMTFfbm9kZV9wYXJhbV90eXBlIHsKKwlJRUVFODAyMTFfTk9ERV9QQVJBTV9UWF9QT1dFUiwKKwlJRUVFODAyMTFfTk9ERV9QQVJBTV9BU1NPQ0lELAorCUlFRUU4MDIxMV9OT0RFX1BBUkFNX0lOQUNULCAgICAgLyogaW5hY3Rpdml0eSB0aW1lciB2YWx1ZSAqLworCUlFRUU4MDIxMV9OT0RFX1BBUkFNX0FVVEhfTU9ERSwgLyogYXV0aCBtb2RlICovCisJSUVFRTgwMjExX05PREVfUEFSQU1fQ0FQX0lORk8sICAvKiBhdXRoIG1vZGUgKi8KK30gaWVlZTgwMjExX25vZGVfcGFyYW1fdHlwZTsKKworLyoKKyAqIFBlci9ub2RlIChzdGF0aW9uKSBzdGF0aXN0aWNzIGF2YWlsYWJsZSB3aGVuIG9wZXJhdGluZyBhcyBhbiBBUC4KKyAqLworc3RydWN0IGllZWU4MDIxMV9ub2Rlc3RhdHMgeworCXVpbnQzMl90IG5zX3J4X2RhdGE7ICAgIC8qIHJ4IGRhdGEgZnJhbWVzICovCisJdWludDMyX3QgbnNfcnhfbWdtdDsgICAgLyogcnggbWFuYWdlbWVudCBmcmFtZXMgKi8KKwl1aW50MzJfdCBuc19yeF9jdHJsOyAgICAvKiByeCBjb250cm9sIGZyYW1lcyAqLworCXVpbnQzMl90IG5zX3J4X3VjYXN0OyAgIC8qIHJ4IHVuaWNhc3QgZnJhbWVzICovCisJdWludDMyX3QgbnNfcnhfbWNhc3Q7ICAgLyogcnggbXVsdGkvYnJvYWRjYXN0IGZyYW1lcyAqLworCXVpbnQ2NF90IG5zX3J4X2J5dGVzOyAgIC8qIHJ4IGRhdGEgY291bnQgKGJ5dGVzKSAqLworCXVpbnQ2NF90IG5zX3J4X2JlYWNvbnM7IC8qIHJ4IGJlYWNvbiBmcmFtZXMgKi8KKwl1aW50MzJfdCBuc19yeF9wcm9iZXJlc3A7ICAgICAgIC8qIHJ4IHByb2JlIHJlc3BvbnNlIGZyYW1lcyAqLworCisJdWludDMyX3QgbnNfcnhfZHVwOyAgICAgLyogcnggZGlzY2FyZCAnY3V6IGR1cCAqLworCXVpbnQzMl90IG5zX3J4X25vcHJpdmFjeTsgICAgICAgLyogcnggdy8gd2VwIGJ1dCBwcml2YWN5IG9mZiAqLworCXVpbnQzMl90IG5zX3J4X3dlcGZhaWw7IC8qIHJ4IHdlcCBwcm9jZXNzaW5nIGZhaWxlZCAqLworCXVpbnQzMl90IG5zX3J4X2RlbWljZmFpbDsgICAgICAgLyogcnggZGVtaWMgZmFpbGVkICovCisKKwkvKiBXZSBsb2cgTUlDIGFuZCBkZWNyeXB0aW9uIGZhaWx1cmVzIGFnYWluc3QgVHJhbnNtaXR0ZXIgU1RBIHN0YXRzLgorCSAgIFRob3VnaCB0aGUgZnJhbWVzIG1heSBub3QgYWN0dWFsbHkgYmUgc2VudCBieSBTVEFzIGNvcnJlc3BvbmRpbmcKKwkgICB0byBUQSwgdGhlIHN0YXRzIGFyZSBzdGlsbCB2YWx1YWJsZSBmb3Igc29tZSBjdXN0b21lcnMgYXMgYSBzb3J0CisJICAgb2Ygcm91Z2ggaW5kaWNhdGlvbi4KKwkgICBBbHNvIG5vdGUgdGhhdCB0aGUgbWFwcGluZyBmcm9tIFRBIHRvIFNUQSBtYXkgZmFpbCBzb21ldGltZXMuICovCisJdWludDMyX3QgbnNfcnhfdGtpcG1pYzsgLyogcnggVEtJUCBNSUMgZmFpbHVyZSAqLworCXVpbnQzMl90IG5zX3J4X2NjbXBtaWM7IC8qIHJ4IENDTVAgTUlDIGZhaWx1cmUgKi8KKwl1aW50MzJfdCBuc19yeF93cGltaWM7ICAvKiByeCBXQVBJIE1JQyBmYWlsdXJlICovCisJdWludDMyX3QgbnNfcnhfdGtpcGljdjsgLyogcnggSUNWIGNoZWNrIGZhaWxlZCAoVEtJUCkgKi8KKwl1aW50MzJfdCBuc19yeF9kZWNhcDsgICAvKiByeCBkZWNhcHN1bGF0aW9uIGZhaWxlZCAqLworCXVpbnQzMl90IG5zX3J4X2RlZnJhZzsgIC8qIHJ4IGRlZnJhZ21lbnRhdGlvbiBmYWlsZWQgKi8KKwl1aW50MzJfdCBuc19yeF9kaXNhc3NvYzsgICAgICAgIC8qIHJ4IGRpc2Fzc29jaWF0aW9uICovCisJdWludDMyX3QgbnNfcnhfZGVhdXRoOyAgLyogcnggZGVhdXRoZW50aWNhdGlvbiAqLworCXVpbnQzMl90IG5zX3J4X2FjdGlvbjsgIC8qIHJ4IGFjdGlvbiAqLworCXVpbnQzMl90IG5zX3J4X2RlY3J5cHRjcmM7ICAgICAgLyogcnggZGVjcnlwdCBmYWlsZWQgb24gY3JjICovCisJdWludDMyX3QgbnNfcnhfdW5hdXRoOyAgLyogcnggb24gdW5hdXRob3JpemVkIHBvcnQgKi8KKwl1aW50MzJfdCBuc19yeF91bmVuY3J5cHRlZDsgICAgIC8qIHJ4IHVuZWNyeXB0ZWQgdy8gcHJpdmFjeSAqLworCisJdWludDMyX3QgbnNfdHhfZGF0YTsgICAgLyogdHggZGF0YSBmcmFtZXMgKi8KKwl1aW50MzJfdCBuc190eF9kYXRhX3N1Y2Nlc3M7ICAgIC8qIHR4IGRhdGEgZnJhbWVzIHN1Y2Nlc3NmdWxseQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZWQgKHVuaWNhc3Qgb25seSkgKi8KKwl1aW50MzJfdCBuc190eF9tZ210OyAgICAvKiB0eCBtYW5hZ2VtZW50IGZyYW1lcyAqLworCXVpbnQzMl90IG5zX3R4X3VjYXN0OyAgIC8qIHR4IHVuaWNhc3QgZnJhbWVzICovCisJdWludDMyX3QgbnNfdHhfbWNhc3Q7ICAgLyogdHggbXVsdGkvYnJvYWRjYXN0IGZyYW1lcyAqLworCXVpbnQ2NF90IG5zX3R4X2J5dGVzOyAgIC8qIHR4IGRhdGEgY291bnQgKGJ5dGVzKSAqLworCXVpbnQ2NF90IG5zX3R4X2J5dGVzX3N1Y2Nlc3M7ICAgLyogdHggc3VjY2VzcyBkYXRhIGNvdW50IC0gdW5pY2FzdCBvbmx5CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZXMpICovCisJdWludDMyX3QgbnNfdHhfcHJvYmVyZXE7ICAgICAgICAvKiB0eCBwcm9iZSByZXF1ZXN0IGZyYW1lcyAqLworCXVpbnQzMl90IG5zX3R4X3VhcHNkOyAgIC8qIHR4IG9uIHVhcHNkIHF1ZXVlICovCisJdWludDMyX3QgbnNfdHhfZGlzY2FyZDsgLyogdHggZHJvcHBlZCBieSBOSUMgKi8KKworCXVpbnQzMl90IG5zX3R4X25vdmxhbnRhZzsgICAgICAgLyogdHggZGlzY2FyZCAnY3V6IG5vIHRhZyAqLworCXVpbnQzMl90IG5zX3R4X3ZsYW5taXNtYXRjaDsgICAgLyogdHggZGlzY2FyZCAnY3V6IGJhZCB0YWcgKi8KKworCXVpbnQzMl90IG5zX3R4X2Vvc3Bsb3N0OyAgICAgICAgLyogdWFwc2QgRU9TUCByZXRyaWVkIG91dCAqLworCisJdWludDMyX3QgbnNfcHNfZGlzY2FyZDsgLyogcHMgZGlzY2FyZCAnY3V6IG9mIGFnZSAqLworCisJdWludDMyX3QgbnNfdWFwc2RfdHJpZ2dlcnM7ICAgICAvKiB1YXBzZCB0cmlnZ2VycyAqLworCXVpbnQzMl90IG5zX3VhcHNkX2R1cHRyaWdnZXJzOyAgLyogdWFwc2QgZHVwbGljYXRlIHRyaWdnZXJzICovCisJdWludDMyX3QgbnNfdWFwc2RfaWdub3JldHJpZ2dlcnM7ICAgICAgIC8qIHVhcHNkIGR1cGxpY2F0ZSB0cmlnZ2VycyAqLworCXVpbnQzMl90IG5zX3VhcHNkX2FjdGl2ZTsgICAgICAgLyogdWFwc2QgZHVwbGljYXRlIHRyaWdnZXJzICovCisJdWludDMyX3QgbnNfdWFwc2RfdHJpZ2dlcmVuYWJsZWQ7ICAgICAgIC8qIHVhcHNkIGR1cGxpY2F0ZSB0cmlnZ2VycyAqLworCisJLyogTUlCLXJlbGF0ZWQgc3RhdGUgKi8KKwl1aW50MzJfdCBuc190eF9hc3NvYzsgICAvKiBbcmVdYXNzb2NpYXRpb25zICovCisJdWludDMyX3QgbnNfdHhfYXNzb2NfZmFpbDsgICAgICAvKiBbcmVdYXNzb2NpYXRpb24gZmFpbHVyZXMgKi8KKwl1aW50MzJfdCBuc190eF9hdXRoOyAgICAvKiBbcmVdYXV0aGVudGljYXRpb25zICovCisJdWludDMyX3QgbnNfdHhfYXV0aF9mYWlsOyAgICAgICAvKiBbcmVdYXV0aGVudGljYXRpb24gZmFpbHVyZXMgKi8KKwl1aW50MzJfdCBuc190eF9kZWF1dGg7ICAvKiBkZWF1dGhlbnRpY2F0aW9ucyAqLworCXVpbnQzMl90IG5zX3R4X2RlYXV0aF9jb2RlOyAgICAgLyogbGFzdCBkZWF1dGggcmVhc29uICovCisJdWludDMyX3QgbnNfdHhfZGlzYXNzb2M7ICAgICAgICAvKiBkaXNhc3NvY2lhdGlvbnMgKi8KKwl1aW50MzJfdCBuc190eF9kaXNhc3NvY19jb2RlOyAgIC8qIGxhc3QgZGlzYXNzb2NpYXRpb24gcmVhc29uICovCisJdWludDMyX3QgbnNfcHNxX2Ryb3BzOyAgLyogcG93ZXIgc2F2ZSBxdWV1ZSBkcm9wcyAqLworfTsKKworLyoKKyAqIHN0YXRpb24gcG93ZXIgc2F2ZSBtb2RlLgorICovCit0eXBlZGVmIGVudW0gaWVlZTgwMjExX3BzbW9kZSB7CisJSUVFRTgwMjExX1BXUlNBVkVfTk9ORSA9IDAsICAgICAvKiBubyBwb3dlciBzYXZlICovCisJSUVFRTgwMjExX1BXUlNBVkVfTE9XLAorCUlFRUU4MDIxMV9QV1JTQVZFX05PUk1BTCwKKwlJRUVFODAyMTFfUFdSU0FWRV9NQVhJTVVNLAorCUlFRUU4MDIxMV9QV1JTQVZFX1dOTSAgIC8qIFdOTS1TbGVlcCBNb2RlICovCit9IGllZWU4MDIxMV9wd3JzYXZlX21vZGU7CisKKy8qIHN0YXRpb24gcG93ZXIgc2F2ZSBwc3BvbGwgaGFuZGxpbmcgKi8KK3R5cGVkZWYgZW51bSB7CisJSUVFRTgwMjExX0NPTlRJTlVFX1BTUE9MTF9GT1JfTU9SRV9EQVRBLAorCUlFRUU4MDIxMV9XQUtFVVBfRk9SX01PUkVfREFUQSwKK30gaWVlZTgwMjExX3BzcG9sbF9tb3JlZGF0YV9oYW5kbGluZzsKKworLyoKKyAqIGFwcHMgcG93ZXIgc2F2ZSBzdGF0ZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBUFBTX0FXQUtFID0gMCwKKwlBUFBTX1BFTkRJTkdfU0xFRVAsCisJQVBQU19TTEVFUCwKKwlBUFBTX0ZBS0VfU0xFRVAsICAgICAgICAvKiBQZW5kaW5nIGJsb2NraW5nIHNsZWVwICovCisJQVBQU19GQUtJTkdfU0xFRVAsICAgICAgLyogQmxvY2tpbmcgc2xlZXAgKi8KKwlBUFBTX1VOS05PV05fUFdSU0FWRSwKK30gaWVlZTgwMjExX2FwcHNfcHdyc2F2ZV9zdGF0ZTsKKwordHlwZWRlZiBlbnVtIF9pZWU4MDIxMV9taW1vX3Bvd2Vyc2F2ZV9tb2RlIHsKKwlJRUVFODAyMTFfTUlNT19QT1dFUlNBVkVfTk9ORSwgIC8qIG5vIG1pbW8gcG93ZXIgc2F2ZSAqLworCUlFRUU4MDIxMV9NSU1PX1BPV0VSU0FWRV9TVEFUSUMsICAgICAgICAvKiBzdGF0aWMgbWltbyBwb3dlciBzYXZlICovCisJSUVFRTgwMjExX01JTU9fUE9XRVJTQVZFX0RZTkFNSUMgICAgICAgIC8qIGR5bmFtaWMgbWltbyBwb3dlcnNhdmUgKi8KK30gaWVlZTgwMjExX21pbW9fcG93ZXJzYXZlX21vZGU7CisKKyNpZmRlZiBBVEhfQ09BTEVTQ0lORwordHlwZWRlZiBlbnVtIF9pZWVlODAyMTFfY29hbGVzY2luZ19zdGF0ZSB7CisJSUVFRTgwMjExX0NPQUxFU0NJTkdfRElTQUJMRUQgPSAwLCAgICAgIC8qIENvYWxlc2NpbmcgaXMgZGlzYWJsZWQgKi8KKwlJRUVFODAyMTFfQ09BTEVTQ0lOR19EWU5BTUlDID0gMSwgICAgICAgLyogRHluYW1pY2FsbHkgbW92ZSB0byBFbmFibGVkIHN0YXRlIGJhc2VkIG9uIFVydW5zICovCisJSUVFRTgwMjExX0NPQUxFU0NJTkdfRU5BQkxFRCA9IDIsICAgICAgIC8qIENvYWxlc2NpbmcgaXMgZW5hYmxlZCAqLworfSBpZWVlODAyMTFfY29hbGVzY2luZ19zdGF0ZTsKKworI2RlZmluZSBJRUVFODAyMTFfVFhfQ09BTEVTQ0lOR19USFJFU0hPTEQgICAgIDUgLyogTnVtYmVyIG9mIHVuZGVycnVuIGVycm9ycyB0byB0cmlnZ2VyIGNvYWxlc2NpbmcgKi8KKyNlbmRpZgorCit0eXBlZGVmIGVudW0gX2llZWU4MDIxMV9jYXAgeworCUlFRUU4MDIxMV9DQVBfU0hTTE9ULCAgIC8qIENBUEFCSUxJVFk6IHNob3J0IHNsb3QgKi8KKwlJRUVFODAyMTFfQ0FQX1NIUFJFQU1CTEUsICAgICAgIC8qIENBUEFCSUxJVFk6IHNob3J0IHByZW1hYmxlICovCisJSUVFRTgwMjExX0NBUF9NVUxUSV9ET01BSU4sICAgICAvKiBDQVBBQklMSVRZOiBtdWx0aXBsZSBkb21haW4gKi8KKwlJRUVFODAyMTFfQ0FQX1dNTSwgICAgICAvKiBDQVBBQklMSVRZOiBXTU0gKi8KKwlJRUVFODAyMTFfQ0FQX0hULCAgICAgICAvKiBDQVBBQklMSVRZOiBIVCAqLworCUlFRUU4MDIxMV9DQVBfUEVSRl9QV1JfT0ZMRCwgICAgLyogQ0FQQUJJTElUWTogcG93ZXIgcGVyZm9ybWFuY2Ugb2ZmbG9hZCBzdXBwb3J0ICovCisJSUVFRTgwMjExX0NBUF8xMUFDLCAgICAgLyogQ0FQQUJJTElUWTogMTFhYyBzdXBwb3J0ICovCit9IGllZWU4MDIxMV9jYXA7CisKK3R5cGVkZWYgZW51bSBfaWVlZTgwMjExX2RldmljZV9wYXJhbSB7CisJSUVFRTgwMjExX0RFVklDRV9SU1NJX0NUTCwKKwlJRUVFODAyMTFfREVWSUNFX05VTV9UWF9DSEFJTiwKKwlJRUVFODAyMTFfREVWSUNFX05VTV9SWF9DSEFJTiwKKwlJRUVFODAyMTFfREVWSUNFX1RYX0NIQUlOX01BU0ssCisJSUVFRTgwMjExX0RFVklDRV9SWF9DSEFJTl9NQVNLLAorCUlFRUU4MDIxMV9ERVZJQ0VfVFhfQ0hBSU5fTUFTS19MRUdBQ1ksCisJSUVFRTgwMjExX0RFVklDRV9SWF9DSEFJTl9NQVNLX0xFR0FDWSwKKwlJRUVFODAyMTFfREVWSUNFX0JNSVNTX0xJTUlULCAgIC8qICMgb2YgYmVhY29uIG1pc3NlcyBmb3IgSFcgdG8gZ2VuZXJhdGUgQk1JU1MgaW50ciAqLworCUlFRUU4MDIxMV9ERVZJQ0VfUFJPVEVDVElPTl9NT0RFLCAgICAgICAvKiBwcm90ZWN0aW9uIG1vZGUgKi8KKwlJRUVFODAyMTFfREVWSUNFX0JMS0RGU0NIQU4sICAgIC8qIGJsb2NrIHRoZSB1c2Ugb2YgREZTIGNoYW5uZWxzICovCisJSUVFRTgwMjExX0RFVklDRV9HUkVFTl9BUF9QU19FTkFCTEUsCisJSUVFRTgwMjExX0RFVklDRV9HUkVFTl9BUF9QU19USU1FT1VULAorCUlFRUU4MDIxMV9ERVZJQ0VfR1JFRU5fQVBfUFNfT05fVElNRSwKKwlJRUVFODAyMTFfREVWSUNFX0NXTV9FWFRQUk9UTU9ERSwKKwlJRUVFODAyMTFfREVWSUNFX0NXTV9FWFRQUk9UU1BBQ0lORywKKwlJRUVFODAyMTFfREVWSUNFX0NXTV9FTkFCTEUsCisJSUVFRTgwMjExX0RFVklDRV9DV01fRVhUQlVTWVRIUkVTSE9MRCwKKwlJRUVFODAyMTFfREVWSUNFX0RPVEgsCisJSUVFRTgwMjExX0RFVklDRV9BRERCQV9NT0RFLAorCUlFRUU4MDIxMV9ERVZJQ0VfQ09VTlRSWUNPREUsCisJSUVFRTgwMjExX0RFVklDRV9NVUxUSV9DSEFOTkVMLCAvKiB0dXJuIG9uL29mZiBvZmYgY2hhbm5lbCBzdXBwb3J0ICovCisJSUVFRTgwMjExX0RFVklDRV9NQVhfQU1TRFVfU0laRSwgICAgICAgIC8qIFNpemUgb2YgQU1TRFUgdG8gYmUgc2VudCBvbiB0aGUgYWlyICovCisJSUVFRTgwMjExX0RFVklDRV9QMlAsICAgLyogRW5hYmxlIG9yIERpc2FibGUgUDJQICovCisJSUVFRTgwMjExX0RFVklDRV9PVkVSUklERV9TQ0FOX1BST0JFUkVTUE9OU0VfSUUsICAgICAgICAvKiBPdmVycmlkZSBzY2FuIFByb2JlIHJlc3BvbnNlIElFLCAwOiBEb24ndCBvdmVyLXJpZGUgKi8KKwlJRUVFODAyMTFfREVWSUNFXzJHX0NTQSwKKwlJRUVFODAyMTFfREVWSUNFX1BXUlRBUkdFVCwKKwlJRUVFODAyMTFfREVWSUNFX09GRl9DSEFOTkVMX1NVUFBPUlQsCit9IGllZWU4MDIxMV9kZXZpY2VfcGFyYW07CisKK3R5cGVkZWYgZW51bSBfaWVlZTgwMjExX3BhcmFtIHsKKwlJRUVFODAyMTFfQkVBQ09OX0lOVFZBTCwgICAgICAgIC8qIGluIFRVcyAqLworCUlFRUU4MDIxMV9MSVNURU5fSU5UVkFMLCAgICAgICAgLyogbnVtYmVyIG9mIGJlYWNvbnMgKi8KKwlJRUVFODAyMTFfRFRJTV9JTlRWQUwsICAvKiBudW1iZXIgb2YgYmVhY29ucyAqLworCUlFRUU4MDIxMV9CTUlTU19DT1VOVF9SRVNFVCwgICAgLyogbnVtYmVyIG9mIGJlYWNvbiBtaXNzIGludHJzIGJlZm9yZSByZXNldCAqLworCUlFRUU4MDIxMV9CTUlTU19DT1VOVF9NQVgsICAgICAgLyogbnVtYmVyIG9mIGJlYWNvbiBtaXNzIGludHJzIGZvciBibWlzcyBub3RpZmljYXRpb25zdCAqLworCUlFRUU4MDIxMV9BVElNX1dJTkRPVywgIC8qIEFUSU0gd2luZG93ICovCisJSUVFRTgwMjExX1NIT1JUX1NMT1QsICAgLyogc2hvcnQgc2xvdCBvbi9vZmYgKi8KKwlJRUVFODAyMTFfU0hPUlRfUFJFQU1CTEUsICAgICAgIC8qIHNob3J0IHByZWFtYmxlIG9uL29mZiAqLworCUlFRUU4MDIxMV9SVFNfVEhSRVNIT0xELCAgICAgICAgLyogcnRzIHRocmVzaG9sZCwgMCBtZWFucyBubyBydHMgdGhyZXNob2xkICAqLworCUlFRUU4MDIxMV9GUkFHX1RIUkVTSE9MRCwgICAgICAgLyogZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQsIDAgbWVhbnMgbm8gcnRzIHRocmVzaG9sZCAgKi8KKwlJRUVFODAyMTFfRklYRURfUkFURSwgICAvKgorCSAgICAgICAgICAgICAgICAgICAgICAgICAqIHJhdGUgY29kZSBzZXJpZXMoMDogYXV0byByYXRlLCAzMiBiaXQgdmFsdWU6ICByYXRlCisJICAgICAgICAgICAgICAgICAgICAgICAgICogY29kZXMgZm9yIDQgcmF0ZSBzZXJpZXMuIGVhY2ggYnl0ZSBmb3Igb25lIHJhdGUgc2VyaWVzKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCUlFRUU4MDIxMV9NQ0FTVF9SQVRFLCAgIC8qIHJhdGUgaW4gS2JwcyAqLworCUlFRUU4MDIxMV9UWFBPV0VSLCAgICAgIC8qIGluIDAuNWRiIHVuaXRzICovCisJSUVFRTgwMjExX0FNUERVX0RFTkNJVFksICAgICAgICAvKiBBTVBEVSBkZW5jaXR5ICovCisJSUVFRTgwMjExX0FNUERVX0xJTUlULCAgLyogQU1QRFUgbGltaXQgKi8KKwlJRUVFODAyMTFfTUFYX0FNUERVLCAgICAvKiBNYXggQU1QRFUgRXhwICovCisJSUVFRTgwMjExX1ZIVF9NQVhfQU1QRFUsICAgICAgICAvKiBWSFQgTWF4IEFNUERVIEV4cCAqLworCUlFRUU4MDIxMV9XUFNfTU9ERSwgICAgIC8qIFdQUyBtb2RlICovCisJSUVFRTgwMjExX1RTTl9NT0RFLCAgICAgLyogVFNOIG1vZGUgKi8KKwlJRUVFODAyMTFfTVVMVElfRE9NQUlOLCAvKiBNdWx0aXBsZSBkb21haW4gKi8KKwlJRUVFODAyMTFfU0FGRV9NT0RFLCAgICAvKiBTYWZlIG1vZGUgKi8KKwlJRUVFODAyMTFfTk9CUklER0VfTU9ERSwgICAgICAgIC8qIE5vIGJyaWRnaW5nIGRvbmUsIGFsbCBmcmFtZXMgc2VudCB1cCB0aGUgc3RhY2sgKi8KKwlJRUVFODAyMTFfUEVSU1RBX0tFWVRBQkxFX1NJWkUsIC8qIElCU1Mtb25seSwgcmVhZC1vbmx5OiBwZXJzdGEga2V5IHRhYmxlIHNpemUgKi8KKwlJRUVFODAyMTFfUkVDRUlWRV84MDIxMSwgICAgICAgIC8qIGRlbGl2ZXIgc3RkIDgwMi4xMSBmcmFtZXMgODAyLjExIGluc3RlYWQgb2YgZXRoZXJuZXQgZnJhbWVzIG9uIHRoZSByeCAqLworCUlFRUU4MDIxMV9TRU5EXzgwMjExLCAgIC8qIE9TIHNlbmRzIHN0ZCA4MDIuMTEgZnJhbWVzIDgwMi4xMSBpbnN0ZWFkIG9mIGV0aGVybmV0IGZyYW1lcyBvbiB0eCBzaWRlICovCisJSUVFRTgwMjExX01JTl9CRUFDT05fQ09VTlQsICAgICAvKiBtaW51bXVtIG51bWJlciBiZWFjb25zIHRvIHR4L3J4IGJlZm9yZSB2YXAgY2FuIHBhdXNlICovCisJSUVFRTgwMjExX0lETEVfVElNRSwgICAgLyogbWluaW11biBubyBhY3Rpdml0eSB0aW1lIGJlZm9yZSB2YXAgY2FuIHBhdXNlICovCisJSUVFRTgwMjExX01JTl9GUkFNRVNJWkUsICAgICAgICAvKiBzbWFsbGVzdCBmcmFtZSBzaXplIHdlIGFyZSBhbGxvd2VkIHRvIHJlY2VpdmUgKi8KKwkvKiBmZWF0dXJlcy4gMDpmZWF0dXJlIGlzIG9mZi4gMTpmZWF0dXJlIGlzIG9uLiAqLworCUlFRUU4MDIxMV9GRUFUVVJFX1dNTSwgIC8qIFdNTSAqLworCUlFRUU4MDIxMV9GRUFUVVJFX1dNTV9QV1JTQVZFLCAgLyogV01NIFBvd2VyIFNhdmUgKi8KKwlJRUVFODAyMTFfRkVBVFVSRV9VQVBTRCwgICAgICAgIC8qIFVBUFNEIHNldHRpbmcgKEJFL0JLL1ZJL1ZPKSAqLworCUlFRUU4MDIxMV9GRUFUVVJFX1dEUywgIC8qIGR5bmFtaWMgV0RTIGZlYXR1cmUgKi8KKwlJRUVFODAyMTFfRkVBVFVSRV9QUklWQUNZLCAgICAgIC8qIGVuY3J5cHRpb24gKi8KKwlJRUVFODAyMTFfRkVBVFVSRV9EUk9QX1VORU5DLCAgIC8qIGRyb3AgdW4gZW5jcnlwdGVkIGZyYW1lcyAqLworCUlFRUU4MDIxMV9GRUFUVVJFX0NPVU5URVJfTUVBU1VSRVMsICAgICAvKiB0dXJuIG9uIGNvdXRlciBtZWFzdXJlcyAqLworCUlFRUU4MDIxMV9GRUFUVVJFX0hJREVfU1NJRCwgICAgLyogdHVybiBvbiBoaWRlIHNzaWQgZmVhdHVyZSAqLworCUlFRUU4MDIxMV9GRUFUVVJFX0FQQlJJREdFLCAgICAgLyogdHVybiBvbiBpbnRlcm5hbCBtY2FzdCB0cmFmZmljIGJyaWRnaW5nIGZvciBBUCAqLworCUlFRUU4MDIxMV9GRUFUVVJFX1BVUkVCLCAgICAgICAgLyogdHVybiBvbiBwdXJlIEIgbW9kZSBmb3IgQVAgKi8KKwlJRUVFODAyMTFfRkVBVFVSRV9QVVJFRywgICAgICAgIC8qIHR1cm4gb24gcHVyZSBHIG1vZGUgZm9yIEFQICovCisJSUVFRTgwMjExX0ZFQVRVUkVfUkVHQ0xBU1MsICAgICAvKiBhZGQgcmVndWxhdG9yeSBjbGFzcyBJRSBpbiBBUCAqLworCUlFRUU4MDIxMV9GRUFUVVJFX0NPVU5UUllfSUUsICAgLyogYWRkIGNvdW50cnkgSUUgZm9yIHZhcCBpbiBBUCAqLworCUlFRUU4MDIxMV9GRUFUVVJFX0lDX0NPVU5UUllfSUUsICAgICAgICAvKiBhZGQgY291bnRyeSBJRSBmb3IgaWMgaW4gQVAgKi8KKwlJRUVFODAyMTFfRkVBVFVSRV9ET1RILCAvKiBlbmFibGUgODAyLjExaCAqLworCUlFRUU4MDIxMV9GRUFUVVJFX1BVUkUxMU4sICAgICAgLyogZW5hYmxlIHB1cmUgMTFuICBtb2RlICovCisJSUVFRTgwMjExX0ZFQVRVUkVfUFJJVkFURV9SU05JRSwgICAgICAgIC8qIGVuYWJsZSBPUyBzaGltIHRvIHNldHVwIFJTTiBJRSAqLworCUlFRUU4MDIxMV9GRUFUVVJFX0NPUFlfQkVBQ09OLCAgLyoga2VlcCBhIGNvcHkgb2YgYmVhY29uICovCisJSUVFRTgwMjExX0ZFQVRVUkVfUFNQT0xMLCAgICAgICAvKiBlbmFibGUvZGlzYWJsZSBwc3BvbGwgbW9kZSBpbiBwb3dlciBzYXZlIFNNICovCisJSUVFRTgwMjExX0ZFQVRVUkVfQ09OVElOVUVfUFNQT0xMX0ZPUl9NT1JFREFUQSwgLyogZW5hYmxlL2Rpc2FibGUgb3B0aW9uIHRvIGNvbnR1bnVlIHNlbmRpbmcgcHMgcG9sbHMgd2hlbiB0aGVyZSBpcyBtb3JlIGRhdGEgKi8KKwlJRUVFODAyMTFfRkVBVFVSRV9BTVBEVSwgICAgICAgIC8qIEVuYWJsZSBvciBEaXNhYmxlIEFnZ3JlZ2F0aW9uICovCisjaWZkZWYgQVRIX0NPQUxFU0NJTkcKKwlJRUVFODAyMTFfRkVBVFVSRV9UWF9DT0FMRVNDSU5HLCAgICAgICAgLyogZW5hYmxlIHR4IGNvYWxlc2NpbmcgKi8KKyNlbmRpZgorCUlFRUU4MDIxMV9GRUFUVVJFX1ZBUF9JTkQsICAgICAgLyogUmVwZWF0ZXIgaW5kZXBlbmRhbnQgVkFQICovCisJSUVFRTgwMjExX0ZJWEVEX1JFVFJJRVMsICAgICAgICAvKiBmaXhlZCByZXRyaWVzICAwLTQgKi8KKwlJRUVFODAyMTFfU0hPUlRfR0ksICAgICAvKiBzaG9ydCBnaSBvbi9vZmYgKi8KKwlJRUVFODAyMTFfSFQ0MF9JTlRPTEVSQU5ULAorCUlFRUU4MDIxMV9DSFdJRFRILAorCUlFRUU4MDIxMV9DSEVYVE9GRlNFVCwKKwlJRUVFODAyMTFfRElTQUJMRV8yMDQwQ09FWElTVCwKKwlJRUVFODAyMTFfRElTQUJMRV9IVFBST1RFQ1RJT04sCisJSUVFRTgwMjExX1NUQV9RVUlDS0tJQ0tPVVQsCisJSUVFRTgwMjExX0NIU0NBTklOSVQsCisJSUVFRTgwMjExX0ZFQVRVUkVfU1RBRldELCAgICAgICAvKiBkeW5hbWljIEFQIENsaWVudCAgZmVhdHVyZSAqLworCUlFRUU4MDIxMV9EUklWRVJfQ0FQUywKKwlJRUVFODAyMTFfVUFQU0RfTUFYU1AsICAvKiBVQVBTRCBzZXJ2aWNlIHBlcmlvZCBzZXR0aW5nICgwOnVubGltaXRlZCwgMiw0LDYpICovCisJSUVFRTgwMjExX1dFUF9NQlNTSUQsCisJSUVFRTgwMjExX01HTVRfUkFURSwgICAgLyogaWVlZSByYXRlIHRvIGJlIHVzZWQgZm9yIG1hbmFnZW1lbnQgKi8KKwlJRUVFODAyMTFfUkVTTUdSX1ZBUF9BSVJfVElNRV9MSU1JVCwgICAgLyogV2hlbiBtdWx0aS1jaGFubmVsIGVuYWJsZWQsIHJlc3RyaWN0IGFpci10aW1lIGFsbG9jYXRlZCB0byBhIFZBUCAqLworCUlFRUU4MDIxMV9URExTX01BQ0FERFIxLCAgICAgICAgLyogVXBwZXIgNCBieXRlcyBvZiBkZXZpY2UncyBNQUMgYWRkcmVzcyAqLworCUlFRUU4MDIxMV9URExTX01BQ0FERFIyLCAgICAgICAgLyogTG93ZXIgMiBieXRlcyBvZiBkZXZpY2UncyBNQUMgYWRkcmVzcyAqLworCUlFRUU4MDIxMV9URExTX0FDVElPTiwgIC8qIFRETFMgYWN0aW9uIHJlcXVlc3RlZCAgICAgICAgICAgICAgICAgKi8KKwlJRUVFODAyMTFfQVVUT19BU1NPQywKKwlJRUVFODAyMTFfUFJPVEVDVElPTl9NT0RFLCAgICAgIC8qIHBlciBWQVAgcHJvdGVjdGlvbiBtb2RlICovCisJSUVFRTgwMjExX0FVVEhfSU5BQ1RfVElNRU9VVCwgICAvKiBpbmFjdGl2aXR5IHRpbWUgd2hpbGUgd2FpdGluZyBmb3IgODAyLjExeCBhdXRoIHRvIGNvbXBsZXRlICovCisJSUVFRTgwMjExX0lOSVRfSU5BQ1RfVElNRU9VVCwgICAvKiBpbmFjdGl2aXR5IHRpbWUgd2hpbGUgd2FpdGluZyBmb3IgODAyLjExIGF1dGgvYXNzb2MgdG8gY29tcGxldGUgKi8KKwlJRUVFODAyMTFfUlVOX0lOQUNUX1RJTUVPVVQsICAgIC8qIGluYWN0aXZpdHkgdGltZSB3aGVuIGZ1bGx5IGF1dGhlZCAqLworCUlFRUU4MDIxMV9QUk9CRV9JTkFDVF9USU1FT1VULCAgLyogaW5hY3Rpdml0eSBjb3VudGVyIHZhbHVlIGJlbG93IHdoaWNoIHN0YXJ0cyBwcm9iaW5nICovCisJSUVFRTgwMjExX1FCU1NfTE9BRCwKKwlJRUVFODAyMTFfV05NX0NBUCwKKwlJRUVFODAyMTFfV05NX0JTU19DQVAsCisJSUVFRTgwMjExX1dOTV9URlNfQ0FQLAorCUlFRUU4MDIxMV9XTk1fVElNX0NBUCwKKwlJRUVFODAyMTFfV05NX1NMRUVQX0NBUCwKKwlJRUVFODAyMTFfV05NX0ZNU19DQVAsCisJSUVFRTgwMjExX0FQX1JFSkVDVF9ERlNfQ0hBTiwgICAvKiBBUCB0byByZWplY3QgcmVzdW1pbmcgb24gREZTIENoYW5uZWwgKi8KKwlJRUVFODAyMTFfQUJPTFQsCisJSUVFRTgwMjExX0NPTVAsCisJSUVFRTgwMjExX0ZGLAorCUlFRUU4MDIxMV9UVVJCTywKKwlJRUVFODAyMTFfQlVSU1QsCisJSUVFRTgwMjExX0FSLAorCUlFRUU4MDIxMV9TTEVFUCwKKwlJRUVFODAyMTFfRU9TUERST1AsCisJSUVFRTgwMjExX01BUktERlMsCisJSUVFRTgwMjExX1dEU19BVVRPREVURUNULAorCUlFRUU4MDIxMV9XRVBfVEtJUF9IVCwKKwlJRUVFODAyMTFfQVRIX1JBRElPLAorCUlFRUU4MDIxMV9JR05PUkVfMTFEQkVBQ09OLAorCS8qIFZpZGVvIGRlYnVnIGZlYXR1cmUgKi8KKwlJRUVFODAyMTFfVklfREJHX0NGRywgICAvKiBWaWRlbyBkZWJ1ZyBjb25maWd1cmF0aW9uIC0gQml0MC0gZW5hYmxlIGRiZywgQml0MSAtIGVuYWJsZSBzdGF0cyBsb2cgKi8KKwlJRUVFODAyMTFfVklfREJHX05VTV9TVFJFQU1TLCAgIC8qIFRvdGFsIG51bWJlciBvZiByZWNlaXZlIHN0cmVhbXMgKi8KKwlJRUVFODAyMTFfVklfU1RSRUFNX05VTSwgICAgICAgIC8qIHRoZSBzdHJlYW0gbnVtYmVyIHdob3NlIG1hcmtlciBwYXJhbWV0ZXJzIGFyZSBiZWluZyBzZXQgKi8KKwlJRUVFODAyMTFfVklfREJHX05VTV9NQVJLRVJTLCAgIC8qIHRvdGFsIG51bWJlciBvZiBtYXJrZXJzIHVzZWQgdG8gZmlsdGVyIHBrdHMgKi8KKwlJRUVFODAyMTFfVklfTUFSS0VSX05VTSwgICAgICAgIC8qIHRoZSBtYXJrZXIgbnVtYmVyIHdob3NlIHBhcmFtZXRlcnMgKG9mZnNldCwgc2l6ZSAmIG1hdGNoKSBhcmUgYmVpbmcgc2V0ICovCisJSUVFRTgwMjExX1ZJX01BUktFUl9PRkZTRVRfU0laRSwgICAgICAgIC8qIGJ5dGUgb2Zmc2V0IGZyb20gc2tiIHN0YXJ0ICh1cHBlciAxNiBiaXRzKSAmIHNpemUgaW4gYnl0ZXMobG93ZXIgMTYgYml0cykgKi8KKwlJRUVFODAyMTFfVklfTUFSS0VSX01BVENILCAgICAgIC8qIG1hcmtlciBwYXR0ZXJuIG1hdGNoIHVzZWQgaW4gZmlsdGVyaW5nICovCisJSUVFRTgwMjExX1ZJX1JYU0VRX09GRlNFVF9TSVpFLCAvKiBSeCBTZXEgbnVtIG9mZnNldCBza2Igc3RhcnQgKHVwcGVyIDE2IGJpdHMpICYgc2l6ZSBpbiBieXRlcyhsb3dlciAxNiBiaXRzKSAqLworCUlFRUU4MDIxMV9WSV9SWF9TRVFfUlNISUZULCAgICAgLyogcmlnaHQtc2hpZnQgdmFsdWUgaW4gY2FzZSBmaWVsZCBpcyBub3Qgd29yZCBhbGlnbmVkICovCisJSUVFRTgwMjExX1ZJX1JYX1NFUV9NQVgsICAgICAgICAvKiBtYXhpbXVtIFJ4IFNlcSBudW1iZXIgKHRvIGNoZWNrIHdyYXAgYXJvdW5kKSAqLworCUlFRUU4MDIxMV9WSV9SWF9TRVFfRFJPUCwgICAgICAgLyogSW5kaWNhdG9yIHRvIHRoZSBkZWJ1ZyBhcHAgdGhhdCBhIHBhcnRpY3VsYXIgc2VxIG51bSBoYXMgYmVlbiBkcm9wcGVkICovCisJSUVFRTgwMjExX1ZJX1RJTUVfT0ZGU0VUX1NJWkUsICAvKiBUaW1lc3RhbXAgb2Zmc2V0IHNrYiBzdGFydCAodXBwZXIgMTYgYml0cykgJiBzaXplIGluIGJ5dGVzKGxvd2VyIDE2IGJpdHMpICovCisJSUVFRTgwMjExX1ZJX1JFU1RBUlQsICAgLyogSWYgc2V0IHRvIDEgcmVzZXRzIGFsbCBpbnRlcm5hbCB2YXJpYWJsZXMvY291bnRlcnMgJiByZXN0YXJ0cyBkZWJ1ZyB0b29sICovCisJSUVFRTgwMjExX1ZJX1JYRFJPUF9TVEFUVVMsICAgICAvKiBUb3RhbCBSWCBkcm9wcyBpbiB3aXJlbGVzcyAqLworCUlFRUU4MDIxMV9UUklHR0VSX01MTUVfUkVTUCwgICAgLyogT3B0aW9uIGZvciBBcHAgdG8gdHJpZ2dlciBtbG1lIHJlc3BvbnNlICovCisjaWZkZWYgQVRIX1NVUFBPUlRfVHhCRgorCUlFRUU4MDIxMV9UWEJGX0FVVE9fQ1ZVUERBVEUsICAgLyogYXV0byBDViB1cGRhdGUgZW5hYmxlICovCisJSUVFRTgwMjExX1RYQkZfQ1ZVUERBVEVfUEVSLCAgICAvKiBwZXIgdGhyZXNob2xkIHRvIGluaXRpYWwgQ1YgdXBkYXRlICovCisjZW5kaWYKKwlJRUVFODAyMTFfTUFYX0NMSUVOVF9OVU1CRVJTLAorCUlFRUU4MDIxMV9TTUFSVE5FVCwKKwlJRUVFODAyMTFfRkVBVFVSRV9NRlBfVEVTVCwgICAgIC8qIE1GUCB0ZXN0ICovCisJSUVFRTgwMjExX1dFQVRIRVJfUkFEQVIsICAgICAgICAvKiB3ZWF0aGVyIHJhZGFyIGNoYW5uZWwgc2tpcCAqLworCUlFRUU4MDIxMV9XRVBfS0VZQ0FDSEUsIC8qIFdFUCBLRVlDQUNIRSBpcyBlbmFibGUgKi8KKwlJRUVFODAyMTFfU0VORF9ERUFVVEgsICAvKiBzZW5kIGRlYXV0aCBpbnN0ZWFkIG9mIGRpc2Fzc29jIHdoaWxlIGRvaW5nIGludGVyZmFjZSBkb3duICAqLworCUlFRUU4MDIxMV9TRVRfVFhQV1JBREpVU1QsCisJSUVFRTgwMjExX1JSTV9DQVAsCisJSUVFRTgwMjExX1JSTV9ERUJVRywKKwlJRUVFODAyMTFfUlJNX1NUQVRTLAorCUlFRUU4MDIxMV9SUk1fU0xXSU5ET1csCisJSUVFRTgwMjExX0ZFQVRVUkVfT0ZGX0NIQU5ORUxfU1VQUE9SVCwKKwlJRUVFODAyMTFfRklYRURfVkhUX01DUywgICAgICAgIC8qIFZIVCBtY3MgaW5kZXggKi8KKwlJRUVFODAyMTFfRklYRURfTlNTLCAgICAvKiBTcGF0aWFsIFN0cmVhbXMgY291bnQgKi8KKwlJRUVFODAyMTFfU1VQUE9SVF9MRFBDLCAvKiBMRFBDIFN1cHBvcnQgKi8KKwlJRUVFODAyMTFfU1VQUE9SVF9UWF9TVEJDLCAgICAgIC8qIFRYIFNUQkMgZW5hYmxlL2Rpc2FibGUgKi8KKwlJRUVFODAyMTFfU1VQUE9SVF9SWF9TVEJDLCAgICAgIC8qIFJYIFNUQkMgZW5hYmxlL2Rpc2FibGUgKi8KKwlJRUVFODAyMTFfREVGQVVMVF9LRVlJRCwgICAgICAgIC8qIFhNSVQgZGVmYXVsdCBrZXkgKi8KKwlJRUVFODAyMTFfT1BNT0RFX05PVElGWV9FTkFCTEUsIC8qIE9wIG1vZGUgbm90aWZpY2F0aW9uIGVuYWJsZS9kaXNhYmxlICovCisJSUVFRTgwMjExX0VOQUJMRV9SVFNDVFMsICAgICAgICAvKiBFbmFibGUvRGlzYWJsZSBSVFMtQ1RTICovCisJSUVFRTgwMjExX1ZIVF9NQ1NNQVAsICAgLyogVkhUIE1DUyBNYXAgKi8KKwlJRUVFODAyMTFfR0VUX0FDU19TVEFURSwgICAgICAgIC8qIGdldCBhY3Mgc3RhdGUgKi8KKwlJRUVFODAyMTFfR0VUX0NBQ19TVEFURSwgICAgICAgIC8qIGdldCBjYWMgc3RhdGUgKi8KK30gaWVlZTgwMjExX3BhcmFtOworCisjZGVmaW5lICBJRUVFODAyMTFfUFJPVEVDVElPTl9OT05FICAgICAgICAgMAorI2RlZmluZSAgSUVFRTgwMjExX1BST1RFQ1RJT05fQ1RTVE9TRUxGICAgIDEKKyNkZWZpbmUgIElFRUU4MDIxMV9QUk9URUNUSU9OX1JUU19DVFMgICAgICAyCisKK3R5cGVkZWYgZW51bSBfaWVlZTgwMjExX3ByaXZhY3lfZmlsdGVyIHsKKwlJRUVFODAyMTFfUFJJVkFDWV9GSUxURVJfQUxMV0FZUywKKwlJRUVFODAyMTFfUFJJVkFDWV9GSUxURVJfS0VZX1VOQVZBSUxBQkxFLAorfSBpZWVlODAyMTFfcHJpdmFjeV9maWx0ZXI7CisKK3R5cGVkZWYgZW51bSBfaWVlZTgwMjExX3ByaXZhY3lfZmlsdGVyX3BhY2tldF90eXBlIHsKKwlJRUVFODAyMTFfUFJJVkFDWV9GSUxURVJfUEFDS0VUX1VOSUNBU1QsCisJSUVFRTgwMjExX1BSSVZBQ1lfRklMVEVSX1BBQ0tFVF9NVUxUSUNBU1QsCisJSUVFRTgwMjExX1BSSVZBQ1lfRklMVEVSX1BBQ0tFVF9CT1RICit9IGllZWU4MDIxMV9wcml2YWN5X2ZpbHRlcl9wYWNrZXRfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2llZWU4MDIxMV9wcml2YWN5X2V4Y2VtcHRpb25fZmlsdGVyIHsKKwl1aW50MTZfdCBldGhlcl90eXBlOyAgICAvKiB0eXBlIG9mIGV0aGVybmV0IHRvIGFwcGx5IHRoaXMgZmlsdGVyLCBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KKwlpZWVlODAyMTFfcHJpdmFjeV9maWx0ZXIgZmlsdGVyX3R5cGU7CisJaWVlZTgwMjExX3ByaXZhY3lfZmlsdGVyX3BhY2tldF90eXBlIHBhY2tldF90eXBlOworfSBpZWVlODAyMTFfcHJpdmFjeV9leGVtcHRpb247CisKKy8qCisgKiBBdXRoZW50aWNhdGlvbiBtb2RlLgorICogTkI6IHRoZSB1c2FnZSBvZiBhdXRoIG1vZGVzIE5PTkUsIEFVVE8gYXJlIGRlcHJlY2F0ZWQsCisgKiB0aGV5IGFyZSBpbXBsZW1lbnRlZCB0aHJvdWdoIGNvbWJpbmF0aW9ucyBvZiBvdGhlciBhdXRoIG1vZGVzCisgKiBhbmQgY2lwaGVyIHR5cGVzLiBUaGUgZGVwcmVjYXRlZCB2YWx1ZXMgYXJlIHByZXNlcnZlZCBoZXJlIHRvCisgKiBtYWludGFpbiBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGFwcGxpY2F0aW9ucyBsaWtlCisgKiB3cGFfc3VwcGxpY2FudCBhbmQgaG9zdGFwZC4KKyAqLwordHlwZWRlZiBlbnVtIF9pZWVlODAyMTFfYXV0aF9tb2RlIHsKKwlJRUVFODAyMTFfQVVUSF9OT05FID0gMCwgICAgICAgIC8qIGRlcHJlY2F0ZWQgKi8KKwlJRUVFODAyMTFfQVVUSF9PUEVOID0gMSwgICAgICAgIC8qIG9wZW4gKi8KKwlJRUVFODAyMTFfQVVUSF9TSEFSRUQgPSAyLCAgICAgIC8qIHNoYXJlZC1rZXkgKi8KKwlJRUVFODAyMTFfQVVUSF84MDIxWCA9IDMsICAgICAgIC8qIDgwMi4xeCAqLworCUlFRUU4MDIxMV9BVVRIX0FVVE8gPSA0LCAgICAgICAgLyogZGVwcmVjYXRlZCAqLworCUlFRUU4MDIxMV9BVVRIX1dQQSA9IDUsIC8qIFdQQSAqLworCUlFRUU4MDIxMV9BVVRIX1JTTkEgPSA2LCAgICAgICAgLyogV1BBMi9SU05BICovCisJSUVFRTgwMjExX0FVVEhfQ0NLTSA9IDcsICAgICAgICAvKiBDQ0sgKi8KKwlJRUVFODAyMTFfQVVUSF9XQVBJID0gOCwgICAgICAgIC8qIFdBUEkgKi8KK30gaWVlZTgwMjExX2F1dGhfbW9kZTsKKworI2RlZmluZSBJRUVFODAyMTFfQVVUSF9NQVggICAgICAoSUVFRTgwMjExX0FVVEhfV0FQSSsxKQorCisvKgorICogQ2lwaGVyIHR5cGVzLgorICogTkI6IFRoZSB2YWx1ZXMgYXJlIHByZXNlcnZlZCBoZXJlIHRvIG1haW50YWluIGJpbmFyeSBjb21wYXRpYmlsaXR5CisgKiB3aXRoIGFwcGxpY2F0aW9ucyBsaWtlIHdwYV9zdXBwbGljYW50IGFuZCBob3N0YXBkLgorICovCit0eXBlZGVmIGVudW0gX2llZWU4MDIxMV9jaXBoZXJfdHlwZSB7CisJSUVFRTgwMjExX0NJUEhFUl9XRVAgPSAwLAorCUlFRUU4MDIxMV9DSVBIRVJfVEtJUCA9IDEsCisJSUVFRTgwMjExX0NJUEhFUl9BRVNfT0NCID0gMiwKKwlJRUVFODAyMTFfQ0lQSEVSX0FFU19DQ00gPSAzLAorCUlFRUU4MDIxMV9DSVBIRVJfV0FQSSA9IDQsCisJSUVFRTgwMjExX0NJUEhFUl9DS0lQID0gNSwKKwlJRUVFODAyMTFfQ0lQSEVSX0FFU19DTUFDID0gNiwKKwlJRUVFODAyMTFfQ0lQSEVSX05PTkUgPSA3LAorfSBpZWVlODAyMTFfY2lwaGVyX3R5cGU7CisKKyNkZWZpbmUgSUVFRTgwMjExX0NJUEhFUl9NQVggICAgKElFRUU4MDIxMV9DSVBIRVJfTk9ORSsxKQorCisvKiBrZXkgZGlyZWN0aW9uICovCit0eXBlZGVmIGVudW0gX2llZWU4MDIxMV9rZXlfZGlyZWN0aW9uIHsKKwlJRUVFODAyMTFfS0VZX0RJUl9UWCwKKwlJRUVFODAyMTFfS0VZX0RJUl9SWCwKKwlJRUVFODAyMTFfS0VZX0RJUl9CT1RICit9IGllZWU4MDIxMV9rZXlfZGlyZWN0aW9uOworCisjZGVmaW5lIElFRUU4MDIxMV9LRVlJWF9OT05FICAgICgodWludDE2X3QpIC0xKQorCit0eXBlZGVmIHN0cnVjdCBfaWVlZTgwMjExX2tleXZhbCB7CisJaWVlZTgwMjExX2NpcGhlcl90eXBlIGtleXR5cGU7CisJaWVlZTgwMjExX2tleV9kaXJlY3Rpb24ga2V5ZGlyOworCXVfaW50IHBlcnNpc3RlbnQgOiAxLCAgICAgLyogcGVyc2lzdGVudCBrZXkgKi8KKwkgICAgICBtZnAgOiAxOyAgICAgICAgICAvKiBtYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gKi8KKwl1aW50MTZfdCBrZXlsZW47ICAgICAgICAvKiBsZW5ndGggb2YgdGhlIGtleSBkYXRhIGZpZWxkcyAqLworCXVpbnQ4X3QgKm1hY2FkZHI7ICAgICAgIC8qIG1hYyBhZGRyZXNzIG9mIGxlbmd0aCBJRUVFODAyMTFfQUREUl9MRU4gLiBhbGwgYnl0ZXMgYXJlIDB4ZmYgZm9yIG11bHRpY2FzdCBrZXkgKi8KKwl1aW50NjRfdCBrZXlyc2M7CisJdWludDY0X3Qga2V5dHNjOworCXVpbnQxNl90IHR4bWljX29mZnNldDsgIC8qIFRLSVAvU01TNCBvbmx5OiBvZmZzZXQgdG8gdHggbWljIGtleSAqLworCXVpbnQxNl90IHJ4bWljX29mZnNldDsgIC8qIFRLSVAvU01TNCBvbmx5OiBvZmZzZXQgdG8gcnggbWljIGtleSAqLworCXVpbnQ4X3QgKmtleWRhdGE7CisjaWZkZWYgQVRIX1NVUFBPUlRfV0FQSQorCXVpbnQ4X3Qga2V5X3VzZWQ7ICAgICAgIC8qaW5kZXggZm9yIFdBUEkgcmVrZXkgbGFiZWxpbmcgKi8KKyNlbmRpZgorfSBpZWVlODAyMTFfa2V5dmFsOworCisjZGVmaW5lIElFRUU4MDIxMV9BRVNfQ01BQ19MRU4gICAgIDEyOAordHlwZWRlZiBlbnVtIF9pZWVlODAyMTFfcnNuX3BhcmFtIHsKKwlJRUVFODAyMTFfVUNBU1RfQ0lQSEVSX0xFTiwKKwlJRUVFODAyMTFfTUNBU1RfQ0lQSEVSX0xFTiwKKwlJRUVFODAyMTFfTUNBU1RNR01UX0NJUEhFUl9MRU4sCisJSUVFRTgwMjExX0tFWU1HVF9BTEdTLAorCUlFRUU4MDIxMV9SU05fQ0FQUworfSBpZWVlODAyMTFfcnNuX3BhcmFtOworCisjZGVmaW5lIElFRUU4MDIxMV9QTUtJRF9MRU4gICAgIDE2CisKK3R5cGVkZWYgc3RydWN0IF9pZWVlODAyMTFfcG1raWRfZW50cnkgeworCXVpbnQ4X3QgYnNzaWRbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IHBta2lkW0lFRUU4MDIxMV9QTUtJRF9MRU5dOworfSBpZWVlODAyMTFfcG1raWRfZW50cnk7CisKK3R5cGVkZWYgZW51bSBfd2xhbl93bWVfcGFyYW0geworCVdMQU5fV01FX0NXTUlOLAorCVdMQU5fV01FX0NXTUFYLAorCVdMQU5fV01FX0FJRlMsCisJV0xBTl9XTUVfVFhPUExJTUlULAorCVdMQU5fV01FX0FDTSwgICAgICAgICAgIC8qYnNzIG9ubHkgKi8KKwlXTEFOX1dNRV9BQ0tQT0xJQ1kgICAgICAvKmJzcyBvbmx5ICovCit9IHdsYW5fd21lX3BhcmFtOworCit0eXBlZGVmIGVudW0gX2llZWU4MDIxMV9mcmFtZV90eXBlIHsKKwlJRUVFODAyMTFfRlJBTUVfVFlQRV9QUk9CRVJFUSwKKwlJRUVFODAyMTFfRlJBTUVfVFlQRV9CRUFDT04sCisJSUVFRTgwMjExX0ZSQU1FX1RZUEVfUFJPQkVSRVNQLAorCUlFRUU4MDIxMV9GUkFNRV9UWVBFX0FTU09DUkVRLAorCUlFRUU4MDIxMV9GUkFNRV9UWVBFX0FTU09DUkVTUCwKKwlJRUVFODAyMTFfRlJBTUVfVFlQRV9BVVRICit9IGllZWU4MDIxMV9mcmFtZV90eXBlOworCisjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9UWVBFX01BWCAgICAoSUVFRTgwMjExX0ZSQU1FX1RZUEVfQVVUSCsxKQorCit0eXBlZGVmIGVudW0gX2llZWU4MDIxMV9hbXBkdV9tb2RlIHsKKwlJRUVFODAyMTFfQU1QRFVfTU9ERV9PRkYsICAgICAgIC8qIGRpc2FibGUgQU1QRFUgKi8KKwlJRUVFODAyMTFfQU1QRFVfTU9ERV9PTiwgICAgICAgIC8qIGVuYWJsZSBBTVBEVSAqLworCUlFRUU4MDIxMV9BTVBEVV9NT0RFX1dEU1ZBUiAgICAgLyogZW5hYmxlIEFNUERVIHdpdGggNGFkZHIgV0FSICovCit9IGllZWU4MDIxMV9hbXBkdV9tb2RlOworCit0eXBlZGVmIGVudW0gX2llZWU4MDIxMV9yZXNldF90eXBlIHsKKwlJRUVFODAyMTFfUkVTRVRfVFlQRV9ERVZJQ0UgPSAwLCAgICAgICAgLyogZGV2aWNlIHJlc2V0IG9uIGVycm9yOiB0eCB0aW1lb3V0IGFuZCBldGMuICovCisJSUVFRTgwMjExX1JFU0VUX1RZUEVfRE9UMTFfSU5URiwgICAgICAgIC8qIGRvdDExIHJlc2V0OiBvbmx5IHJlc2V0IG9uZSBuZXR3b3JrIGludGVyZmFjZSAodmFwKSAqLworCUlFRUU4MDIxMV9SRVNFVF9UWVBFX0lOVEVSTkFMLCAgLyogaW50ZXJuYWwgcmVzZXQgKi8KK30gaWVlZTgwMjExX3Jlc2V0X3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9pZWVlODAyMTFfcmVzZXRfcmVxdWVzdCB7CisJaWVlZTgwMjExX3Jlc2V0X3R5cGUgdHlwZTsKKworCXVfaW50IHJlc2V0X2h3IDogMSwgICAgICAgLyogcmVzZXQgdGhlIGFjdHVhbCBIL1cgKi8KKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IHZhbGlkIGZvciBET1QxMSByZXNldCwgaS5lLiwKKwkgKiBJRUVFODAyMTFfUkVTRVRfVFlQRV9ET1QxMV9JTlRGCisJICovCisJICAgICAgcmVzZXRfcGh5IDogMSwgICAgLyogcmVzZXQgUEhZICovCisJICAgICAgcmVzZXRfbWFjIDogMSwgICAgLyogcmVzZXQgTUFDICovCisJICAgICAgc2V0X2RlZmF1bHRfbWliIDogMSwgLyogc2V0IGRlZmF1bHQgTUlCIHZhcmlhYmxlcyAqLworCSAgICAgIG5vX2ZsdXNoIDogMTsKKwl1aW50OF90IG1hY2FkZHJbSUVFRTgwMjExX0FERFJfTEVOXTsKKwllbnVtIGllZWU4MDIxMV9waHltb2RlIHBoeV9tb2RlOworfSBpZWVlODAyMTFfcmVzZXRfcmVxdWVzdDsKKworI2RlZmluZSBJRUVFODAyMTFfTVNHX01BWCA2MworI2RlZmluZSBJRUVFODAyMTFfTVNHX1NNQVJUQU5UIDcgICAgICAgIC8qIEJpdCA3ICgweDgwKWZvciBTbWFydCBBbnRlbm5hIGRlYnVnICovCitlbnVtIHsKKwkvKiBJRUVFODAyMTFfUEFSQU1fREJHX0xWTCAqLworCUlFRUU4MDIxMV9NU0dfVERMUyA9IDAsIC8qIFRETFMgKi8KKwlJRUVFODAyMTFfTVNHX0FDUywgICAgICAvKiBhdXRvIGNoYW5uZWwgc2VsZWN0aW9uICovCisJSUVFRTgwMjExX01TR19TQ0FOX1NNLCAgLyogc2NhbiBzdGF0ZSBtYWNoaW5lICovCisJSUVFRTgwMjExX01TR19TQ0FORU5UUlksICAgICAgICAvKiBzY2FuIGVudHJ5ICovCisJSUVFRTgwMjExX01TR19XRFMsICAgICAgLyogV0RTIGhhbmRsaW5nICovCisJSUVFRTgwMjExX01TR19BQ1RJT04sICAgLyogYWN0aW9uIG1hbmFnZW1lbnQgZnJhbWVzICovCisJSUVFRTgwMjExX01TR19ST0FNLCAgICAgLyogc3RhLW1vZGUgcm9hbWluZyAqLworCUlFRUU4MDIxMV9NU0dfSU5BQ1QsICAgIC8qIGluYWN0aXZpdHkgaGFuZGxpbmcgKi8KKwlJRUVFODAyMTFfTVNHX0RPVEggPSA4LCAvKiAxMS5oICovCisJSUVFRTgwMjExX01TR19JUVVFLCAgICAgLyogSVFVRSBmZWF0dXJlcyAqLworCUlFRUU4MDIxMV9NU0dfV01FLCAgICAgIC8qIFdNRSBwcm90b2NvbCAqLworCUlFRUU4MDIxMV9NU0dfQUNMLCAgICAgIC8qIEFDTCBoYW5kbGluZyAqLworCUlFRUU4MDIxMV9NU0dfV1BBLCAgICAgIC8qIFdQQS9SU04gcHJvdG9jb2wgKi8KKwlJRUVFODAyMTFfTVNHX1JBREtFWVMsICAvKiBkdW1wIDgwMi4xeCBrZXlzICovCisJSUVFRTgwMjExX01TR19SQUREVU1QLCAgLyogZHVtcCA4MDIuMXggcmFkaXVzIHBhY2tldHMgKi8KKwlJRUVFODAyMTFfTVNHX1JBRElVUywgICAvKiA4MDIuMXggcmFkaXVzIGNsaWVudCAqLworCUlFRUU4MDIxMV9NU0dfRE9UMVhTTSA9IDE2LCAgICAgLyogODAyLjF4IHN0YXRlIG1hY2hpbmUgKi8KKwlJRUVFODAyMTFfTVNHX0RPVDFYLCAgICAvKiA4MDIuMXggYXV0aGVudGljYXRvciAqLworCUlFRUU4MDIxMV9NU0dfUE9XRVIsICAgIC8qIHBvd2VyIHNhdmUgaGFuZGxpbmcgKi8KKwlJRUVFODAyMTFfTVNHX1NUQVRFLCAgICAvKiBzdGF0ZSBtYWNoaW5lICovCisJSUVFRTgwMjExX01TR19PVVRQVVQsICAgLyogb3V0cHV0IGhhbmRsaW5nICovCisJSUVFRTgwMjExX01TR19TQ0FOLCAgICAgLyogc2Nhbm5pbmcgKi8KKwlJRUVFODAyMTFfTVNHX0FVVEgsICAgICAvKiBhdXRoZW50aWNhdGlvbiBoYW5kbGluZyAqLworCUlFRUU4MDIxMV9NU0dfQVNTT0MsICAgIC8qIGFzc29jaWF0aW9uIGhhbmRsaW5nICovCisJSUVFRTgwMjExX01TR19OT0RFID0gMjQsICAgICAgICAvKiBub2RlIGhhbmRsaW5nICovCisJSUVFRTgwMjExX01TR19FTEVNSUQsICAgLyogZWxlbWVudCBpZCBwYXJzaW5nICovCisJSUVFRTgwMjExX01TR19YUkFURSwgICAgLyogcmF0ZSBzZXQgaGFuZGxpbmcgKi8KKwlJRUVFODAyMTFfTVNHX0lOUFVULCAgICAvKiBpbnB1dCBoYW5kbGluZyAqLworCUlFRUU4MDIxMV9NU0dfQ1JZUFRPLCAgIC8qIGNyeXB0byB3b3JrICovCisJSUVFRTgwMjExX01TR19EVU1QUEtUUywgLyogSUZGX0xJTksyIGVxdWl2YWxhbnQgKi8KKwlJRUVFODAyMTFfTVNHX0RFQlVHLCAgICAvKiBJRkZfREVCVUcgZXF1aXZhbGVudCAqLworCUlFRUU4MDIxMV9NU0dfTUxNRSwgICAgIC8qIE1MTUUgKi8KKwkvKiBJRUVFODAyMTFfUEFSQU1fREJHX0xWTF9ISUdIICovCisJSUVFRTgwMjExX01TR19SUk0gPSAzMiwgLyogUmFkaW8gcmVzb3VyY2UgbWVhc3VyZW1lbnQgKi8KKwlJRUVFODAyMTFfTVNHX1dOTSwgICAgICAvKiBXaXJlbGVzcyBOZXR3b3JrIE1hbmFnZW1lbnQgKi8KKwlJRUVFODAyMTFfTVNHX1AyUF9QUk9ULCAvKiBQMlAgUHJvdG9jb2wgZHJpdmVyICovCisJSUVFRTgwMjExX01TR19QUk9YWUFSUCwgLyogMTF2IFByb3h5IEFSUCAqLworCUlFRUU4MDIxMV9NU0dfTDJUSUYsICAgIC8qIEhvdHNwb3QgMi4wIEwyIFRJRiAqLworCUlFRUU4MDIxMV9NU0dfV0lGSVBPUywgIC8qIFdpZmlQb3NpdGlvbmluZyBGZWF0dXJlICovCisJSUVFRTgwMjExX01TR19XUkFQLCAgICAgLyogV1JBUCBvciBXaXJlbGVzcyBQcm94eVNUQSAqLworCUlFRUU4MDIxMV9NU0dfREZTLCAgICAgIC8qIERGUyBkZWJ1ZyBtZXNnICovCisKKwlJRUVFODAyMTFfTVNHX05VTV9DQVRFR09SSUVTLCAgIC8qIHRvdGFsIGllZWU4MDIxMSBtZXNzYWdlcyAqLworCUlFRUU4MDIxMV9NU0dfVU5NQVNLQUJMRSA9IElFRUU4MDIxMV9NU0dfTUFYLCAgIC8qIGFueXRoaW5nICovCisJSUVFRTgwMjExX01TR19BTlkgPSBJRUVFODAyMTFfTVNHX01BWCwgIC8qIGFueXRoaW5nICovCit9OworCisvKiB2ZXJib3NpdHkgbGV2ZWxzICovCisjZGVmaW5lICAgICBJRUVFODAyMTFfVkVSQk9TRV9PRkYgICAgICAgICAgICAgICAgICAxMDAKKyNkZWZpbmUgICAgIElFRUU4MDIxMV9WRVJCT1NFX0ZPUkNFICAgICAgICAgICAgICAgMQorI2RlZmluZSAgICAgSUVFRTgwMjExX1ZFUkJPU0VfU0VSSU9VUyAgICAgICAgICAgICAyCisjZGVmaW5lICAgICBJRUVFODAyMTFfVkVSQk9TRV9OT1JNQUwgICAgICAgICAgICAgIDMKKyNkZWZpbmUgICAgIElFRUU4MDIxMV9WRVJCT1NFX0xPVUQgICAgICAgICAgICAgICAgNAorI2RlZmluZSAgICAgSUVFRTgwMjExX1ZFUkJPU0VfREVUQUlMRUQgICAgICAgICAgICA1CisjZGVmaW5lICAgICBJRUVFODAyMTFfVkVSQk9TRV9DT01QTEVYICAgICAgICAgICAgIDYKKyNkZWZpbmUgICAgIElFRUU4MDIxMV9WRVJCT1NFX0ZVTkNUSU9OICAgICAgICAgICAgNworI2RlZmluZSAgICAgSUVFRTgwMjExX1ZFUkJPU0VfVFJBQ0UgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0RFRkFVTFQgSUVFRTgwMjExX01TR19ERUJVRworCisvKgorICogdGhlIGxvd2VyIDQgYml0cyBvZiB0aGUgbXNnIGZsYWdzIGFyZSB1c2VkIGZvciBleHRlbmRpbmcgdGhlCisgKiBkZWJ1ZyBmbGFncy4KKyAqLworCisvKgorICogZmxhZyBkZWZpbnRpb25zIGZvciB3bGFuX21sbWVfc3RvcF9ic3ModmFwKSBBUEkuCisgKi8KKyNkZWZpbmUgV0xBTl9NTE1FX1NUT1BfQlNTX0ZfU0VORF9ERUFVVEggICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTEFOX01MTUVfU1RPUF9CU1NfRl9DTEVBUl9BU1NPQ19TVEFURSAgICAgICAgICAweDAyCisjZGVmaW5lIFdMQU5fTUxNRV9TVE9QX0JTU19GX0ZPUkNFX1NUT1BfUkVTRVQgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgV0xBTl9NTE1FX1NUT1BfQlNTX0ZfV0FJVF9SWF9ET05FICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBXTEFOX01MTUVfU1RPUF9CU1NfRl9OT19SRVNFVCAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFdMQU5fTUxNRV9TVE9QX0JTU19GX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgIDB4MjAKKworLyoKKyAqIFdBUEkgY29tbWFuZHMgdG8gYXV0aGVudGljYXRvcgorICovCisjZGVmaW5lIFdBUElfV0FJX1JFUVVFU1QgICAgICAgICAgICAodWludDE2X3QpMHgwMEYxCisjZGVmaW5lIFdBUElfVU5JQ0FTVF9SRUtFWSAgICAgICAgICAodWludDE2X3QpMHgwMEYyCisjZGVmaW5lIFdBUElfU1RBX0FHSU5HICAgICAgICAgICAgICAodWludDE2X3QpMHgwMEYzCisjZGVmaW5lIFdBUElfTVVMVElfUkVLRVkgICAgICAgICAgICAodWludDE2X3QpMHgwMEY0CisjZGVmaW5lIFdBUElfU1RBX1NUQVRTICAgICAgICAgICAgICAodWludDE2X3QpMHgwMEY1CisKKy8qCisgKiBJRUVFODAyMTEgUEhZIFN0YXRpc3RpY3MuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfcGh5X3N0YXRzIHsKKwl1aW50NjRfdCBpcHNfdHhfcGFja2V0czsgICAgICAgIC8qIGZyYW1lcyBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgKi8KKwl1aW50NjRfdCBpcHNfdHhfbXVsdGljYXN0OyAgICAgIC8qIG11bHRpY2FzdC9icm9hZGNhc3QgZnJhbWVzIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCAqLworCXVpbnQ2NF90IGlwc190eF9mcmFnbWVudHM7ICAgICAgLyogZnJhZ21lbnRzIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCAqLworCXVpbnQ2NF90IGlwc190eF94cmV0cmllczsgICAgICAgLyogZnJhbWVzIHRoYXQgYXJlIHhyZXRyaWVkLiBOQjogbm90IG51bWJlciBvZiByZXRyaWVzICovCisJdWludDY0X3QgaXBzX3R4X3JldHJpZXM7ICAgICAgICAvKiBmcmFtZXMgdHJhbnNtaXR0ZWQgYWZ0ZXIgcmV0cmllcy4gTkI6IG5vdCBudW1iZXIgb2YgcmV0cmllcyAqLworCXVpbnQ2NF90IGlwc190eF9tdWx0aXJldHJpZXM7ICAgLyogZnJhbWVzIHRyYW5zbWl0dGVkIGFmdGVyIG1vcmUgdGhhbiBvbmUgcmV0cnkuICovCisJdWludDY0X3QgaXBzX3R4X3RpbWVvdXQ7ICAgICAgICAvKiBmcmFtZXMgdGhhdCBleHBpcmUgdGhlIGRvdDExTWF4VHJhbnNtaXRNU0RVTGlmZXRpbWUgKi8KKwl1aW50NjRfdCBpcHNfcnhfcGFja2V0czsgICAgICAgIC8qIGZyYW1lcyBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgKi8KKwl1aW50NjRfdCBpcHNfcnhfbXVsdGljYXN0OyAgICAgIC8qIG11bHRpY2FzdC9icm9hZGNhc3QgZnJhbWVzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCAqLworCXVpbnQ2NF90IGlwc19yeF9mcmFnbWVudHM7ICAgICAgLyogZnJhZ21lbnRzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCAqLworCXVpbnQ2NF90IGlwc19yeF90aW1lb3V0OyAgICAgICAgLyogZnJtYWVzIHRoYXQgZXhwaXJlZCB0aGUgZG90MTFNYXhSZWNlaXZlTGlmZXRpbWUgKi8KKwl1aW50NjRfdCBpcHNfcnhfZHVwOyAgICAvKiBkdXBsaWNhdGVkIGZyYWdtZW50cyAqLworCXVpbnQ2NF90IGlwc19yeF9tZHVwOyAgIC8qIG11bHRpcGxlIGR1cGxpY2F0ZWQgZnJhZ21lbnRzICovCisJdWludDY0X3QgaXBzX3J4X3Byb21pc2N1b3VzOyAgICAvKiBmcmFtZXMgdGhhdCBhcmUgcmVjZWl2ZWQgb25seSBiZWNhdXNlIHByb21pc2N1b3VzIGZpbHRlciBpcyBvbiAqLworCXVpbnQ2NF90IGlwc19yeF9wcm9taXNjdW91c19mcmFnbWVudHM7ICAvKiBmcmFnbWVudHMgdGhhdCBhcmUgcmVjZWl2ZWQgb25seSBiZWNhdXNlIHByb21pc2N1b3VzIGZpbHRlciBpcyBvbiAqLworCXVpbnQ2NF90IGlwc190eF9ydHM7ICAgIC8qIFJUUyBzdWNjZXNzIGNvdW50ICovCisJdWludDY0X3QgaXBzX3R4X3Nob3J0cmV0cnk7ICAgICAvKiB0eCBvbi1jaGlwIHJldHJpZXMgKHNob3J0KS4gUlRTRmFpbENudCAqLworCXVpbnQ2NF90IGlwc190eF9sb25ncmV0cnk7ICAgICAgLyogdHggb24tY2hpcCByZXRyaWVzIChsb25nKS4gRGF0YUZhaWxDbnQgKi8KKwl1aW50NjRfdCBpcHNfcnhfY3JjZXJyOyAvKiByeCBmYWlsZWQgJ2N1eiBvZiBiYWQgQ1JDICovCisJdWludDY0X3QgaXBzX3J4X2ZpZm9lcnI7ICAgICAgICAvKiByeCBmYWlsZWQgJ2N1eiBvZiBGSUZPIG92ZXJydW4gKi8KKwl1aW50NjRfdCBpcHNfcnhfZGVjcnlwdGVycjsgICAgIC8qIHJ4IGRlY3J5cHRpb24gZXJyb3IgKi8KK307CisKK3N0cnVjdCBpZWVlODAyMTFfY2hhbl9zdGF0cyB7CisJdWludDMyX3QgY2hhbl9jbHJfY250OworCXVpbnQzMl90IGN5Y2xlX2NudDsKKwl1aW50MzJfdCBwaHlfZXJyX2NudDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfbWFjX3N0YXRzIHsKKwl1aW50NjRfdCBpbXNfdHhfcGFja2V0czsgICAgICAgIC8qIGZyYW1lcyBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgKi8KKwl1aW50NjRfdCBpbXNfcnhfcGFja2V0czsgICAgICAgIC8qIGZyYW1lcyBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgKi8KKwl1aW50NjRfdCBpbXNfdHhfYnl0ZXM7ICAvKiBieXRlcyBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgKi8KKwl1aW50NjRfdCBpbXNfcnhfYnl0ZXM7ICAvKiBieXRlcyBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgKi8KKworCS8qIFRPRE86IEZvciB0aGUgYnl0ZSBjb3VudHMgYmVsb3csIHdlIG5lZWQgdG8gaGFuZGxlIHNvbWUgc2NlbmFyaW9zCisJICAgc3VjaCBhcyBlbmNyeXB0aW9uIHJlbGF0ZWQgZGVjYXBzLCBldGMgKi8KKwl1aW50NjRfdCBpbXNfdHhfZGF0YV9wYWNrZXRzOyAgIC8qIGRhdGEgZnJhbWVzIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCAqLworCXVpbnQ2NF90IGltc19yeF9kYXRhX3BhY2tldHM7ICAgLyogZGF0YSBmcmFtZXMgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkICovCisJdWludDY0X3QgaW1zX3R4X2RhdGFfYnl0ZXM7ICAgICAvKiBkYXRhIGJ5dGVzIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSBvZiBGQ1MuICovCisJdWludDY0X3QgaW1zX3J4X2RhdGFfYnl0ZXM7ICAgICAvKiBkYXRhIGJ5dGVzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSBvZiBGQ1MuICovCisKKwl1aW50NjRfdCBpbXNfdHhfZGF0YXB5bGRfYnl0ZXM7IC8qIGRhdGEgcGF5bG9hZCBieXRlcyBzdWNjZXNzZnVsbHkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVkICovCisJdWludDY0X3QgaW1zX3J4X2RhdGFweWxkX2J5dGVzOyAvKiBkYXRhIHBheWxvYWQgc3VjY2Vzc2Z1bGx5CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZCAqLworCisJLyogRGVjcnlwdGlvbiBlcnJvcnMgKi8KKwl1aW50NjRfdCBpbXNfcnhfdW5lbmNyeXB0ZWQ7ICAgIC8qIHJ4IHcvbyB3ZXAgYW5kIHByaXZhY3kgb24gKi8KKwl1aW50NjRfdCBpbXNfcnhfYmFka2V5aWQ7ICAgICAgIC8qIHJ4IHcvIGluY29ycmVjdCBrZXlpZCAqLworCXVpbnQ2NF90IGltc19yeF9kZWNyeXB0b2s7ICAgICAgLyogcnggZGVjcnlwdCBva2F5ICovCisJdWludDY0X3QgaW1zX3J4X2RlY3J5cHRjcmM7ICAgICAvKiByeCBkZWNyeXB0IGZhaWxlZCBvbiBjcmMgKi8KKwl1aW50NjRfdCBpbXNfcnhfd2VwZmFpbDsgICAgICAgIC8qIHJ4IHdlcCBwcm9jZXNzaW5nIGZhaWxlZCAqLworCXVpbnQ2NF90IGltc19yeF90a2lwcmVwbGF5OyAgICAgLyogcnggc2VxIyB2aW9sYXRpb24gKFRLSVApICovCisJdWludDY0X3QgaW1zX3J4X3RraXBmb3JtYXQ7ICAgICAvKiByeCBmb3JtYXQgYmFkIChUS0lQKSAqLworCXVpbnQ2NF90IGltc19yeF90a2lwbWljOyAgICAgICAgLyogcnggTUlDIGNoZWNrIGZhaWxlZCAoVEtJUCkgKi8KKwl1aW50NjRfdCBpbXNfcnhfdGtpcGljdjsgICAgICAgIC8qIHJ4IElDViBjaGVjayBmYWlsZWQgKFRLSVApICovCisJdWludDY0X3QgaW1zX3J4X2NjbXByZXBsYXk7ICAgICAvKiByeCBzZXEjIHZpb2xhdGlvbiAoQ0NNUCkgKi8KKwl1aW50NjRfdCBpbXNfcnhfY2NtcGZvcm1hdDsgICAgIC8qIHJ4IGZvcm1hdCBiYWQgKENDTVApICovCisJdWludDY0X3QgaW1zX3J4X2NjbXBtaWM7ICAgICAgICAvKiByeCBNSUMgY2hlY2sgZmFpbGVkIChDQ01QKSAqLworLyp0aGlzIGZpbGUgY2FuIGJlIGluY2x1ZGVkIGJ5IGFwcGxpY2F0aW9ucyBhcyA4MDIxMXN0YXRzIHRoYXQgaGFzIG5vIHN1Y2ggTUFDUk8gZGVmaW5pdGlvbiovCisvKiAjaWYgQVRIX1NVUFBPUlRfV0FQSSAqLworCXVpbnQ2NF90IGltc19yeF93cGlyZXBsYXk7ICAgICAgLyogcnggc2VxIyB2aW9sYXRpb24gKFdQSSkgKi8KKwl1aW50NjRfdCBpbXNfcnhfd3BpbWljOyAvKiByeCBNSUMgY2hlY2sgZmFpbGVkIChXUEkpICovCisvKiAjZW5kaWYgKi8KKwkvKiBPdGhlciBUeC9SeCBlcnJvcnMgKi8KKwl1aW50NjRfdCBpbXNfdHhfZGlzY2FyZDsgICAgICAgIC8qIHR4IGRyb3BwZWQgYnkgTklDICovCisJdWludDY0X3QgaW1zX3J4X2Rpc2NhcmQ7ICAgICAgICAvKiByeCBkcm9wcGVkIGJ5IE5JQyAqLworCisJdWludDY0X3QgaW1zX3J4X2NvdW50ZXJtZWFzdXJlOyAvKiByeCBUS0lQIGNvdW50ZXJtZWFzdXJlIGFjdGl2YXRpb24gY291bnQgKi8KK307CisKKy8qCisgKiBTdW1tYXJ5IHN0YXRpc3RpY3MuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfc3RhdHMgeworCXVpbnQzMl90IGlzX3J4X2JhZHZlcnNpb247ICAgICAgLyogcnggZnJhbWUgd2l0aCBiYWQgdmVyc2lvbiAqLworCXVpbnQzMl90IGlzX3J4X3Rvb3Nob3J0OyAgICAgICAgLyogcnggZnJhbWUgdG9vIHNob3J0ICovCisJdWludDMyX3QgaXNfcnhfd3Jvbmdic3M7ICAgICAgICAvKiByeCBmcm9tIHdyb25nIGJzc2lkICovCisJdWludDMyX3QgaXNfcnhfd3JvbmdkaXI7ICAgICAgICAvKiByeCB3LyB3cm9uZyBkaXJlY3Rpb24gKi8KKwl1aW50MzJfdCBpc19yeF9tY2FzdGVjaG87ICAgICAgIC8qIHJ4IGRpc2NhcmQgJ2N1eiBtY2FzdCBlY2hvICovCisJdWludDMyX3QgaXNfcnhfbm90YXNzb2M7ICAgICAgICAvKiByeCBkaXNjYXJkICdjdXogc3RhICFhc3NvYyAqLworCXVpbnQzMl90IGlzX3J4X25vcHJpdmFjeTsgICAgICAgLyogcnggdy8gd2VwIGJ1dCBwcml2YWN5IG9mZiAqLworCXVpbnQzMl90IGlzX3J4X2RlY2FwOyAgIC8qIHJ4IGRlY2Fwc3VsYXRpb24gZmFpbGVkICovCisJdWludDMyX3QgaXNfcnhfbWd0ZGlzY2FyZDsgICAgICAvKiByeCBkaXNjYXJkIG1ndCBmcmFtZXMgKi8KKwl1aW50MzJfdCBpc19yeF9jdGw7ICAgICAvKiByeCBkaXNjYXJkIGN0cmwgZnJhbWVzICovCisJdWludDMyX3QgaXNfcnhfYmVhY29uOyAgLyogcnggYmVhY29uIGZyYW1lcyAqLworCXVpbnQzMl90IGlzX3J4X3JzdG9vYmlnOyAgICAgICAgLyogcnggcmF0ZSBzZXQgdHJ1bmNhdGVkICovCisJdWludDMyX3QgaXNfcnhfZWxlbV9taXNzaW5nOyAgICAvKiByeCByZXF1aXJlZCBlbGVtZW50IG1pc3NpbmcgKi8KKwl1aW50MzJfdCBpc19yeF9lbGVtX3Rvb2JpZzsgICAgIC8qIHJ4IGVsZW1lbnQgdG9vIGJpZyAqLworCXVpbnQzMl90IGlzX3J4X2VsZW1fdG9vc21hbGw7ICAgLyogcnggZWxlbWVudCB0b28gc21hbGwgKi8KKwl1aW50MzJfdCBpc19yeF9lbGVtX3Vua25vd247ICAgIC8qIHJ4IGVsZW1lbnQgdW5rbm93biAqLworCXVpbnQzMl90IGlzX3J4X2JhZGNoYW47IC8qIHJ4IGZyYW1lIHcvIGludmFsaWQgY2hhbiAqLworCXVpbnQzMl90IGlzX3J4X2NoYW5taXNtYXRjaDsgICAgLyogcnggZnJhbWUgY2hhbiBtaXNtYXRjaCAqLworCXVpbnQzMl90IGlzX3J4X25vZGVhbGxvYzsgICAgICAgLyogcnggZnJhbWUgZHJvcHBlZCAqLworCXVpbnQzMl90IGlzX3J4X3NzaWRtaXNtYXRjaDsgICAgLyogcnggZnJhbWUgc3NpZCBtaXNtYXRjaCAgKi8KKwl1aW50MzJfdCBpc19yeF9hdXRoX3Vuc3VwcG9ydGVkOyAgICAgICAgLyogcnggdy8gdW5zdXBwb3J0ZWQgYXV0aCBhbGcgKi8KKwl1aW50MzJfdCBpc19yeF9hdXRoX2ZhaWw7ICAgICAgIC8qIHJ4IHN0YSBhdXRoIGZhaWx1cmUgKi8KKwl1aW50MzJfdCBpc19yeF9hdXRoX2NvdW50ZXJtZWFzdXJlczsgICAgLyogcnggYXV0aCBkaXNjYXJkICdjdXogQ00gKi8KKwl1aW50MzJfdCBpc19yeF9hc3NvY19ic3M7ICAgICAgIC8qIHJ4IGFzc29jIGZyb20gd3JvbmcgYnNzaWQgKi8KKwl1aW50MzJfdCBpc19yeF9hc3NvY19ub3RhdXRoOyAgIC8qIHJ4IGFzc29jIHcvbyBhdXRoICovCisJdWludDMyX3QgaXNfcnhfYXNzb2NfY2FwbWlzbWF0Y2g7ICAgICAgIC8qIHJ4IGFzc29jIHcvIGNhcCBtaXNtYXRjaCAqLworCXVpbnQzMl90IGlzX3J4X2Fzc29jX25vcmF0ZTsgICAgLyogcnggYXNzb2Mgdy8gbm8gcmF0ZSBtYXRjaCAqLworCXVpbnQzMl90IGlzX3J4X2Fzc29jX2JhZHdwYWllOyAgLyogcnggYXNzb2Mgdy8gYmFkIFdQQSBJRSAqLworCXVpbnQzMl90IGlzX3J4X2RlYXV0aDsgIC8qIHJ4IGRlYXV0aGVudGljYXRpb24gKi8KKwl1aW50MzJfdCBpc19yeF9kaXNhc3NvYzsgICAgICAgIC8qIHJ4IGRpc2Fzc29jaWF0aW9uICovCisJdWludDMyX3QgaXNfcnhfYWN0aW9uOyAgLyogcnggYWN0aW9uIG1ndCAqLworCXVpbnQzMl90IGlzX3J4X2JhZHN1YnR5cGU7ICAgICAgLyogcnggZnJhbWUgdy8gdW5rbm93biBzdWJ0eXBlICovCisJdWludDMyX3QgaXNfcnhfbm9idWY7ICAgLyogcnggZmFpbGVkIGZvciBsYWNrIG9mIGJ1ZiAqLworCXVpbnQzMl90IGlzX3J4X2FoZGVtb19tZ3Q7ICAgICAgLyogcnggZGlzY2FyZCBhaGRlbW8gbWd0IGZyYW1lICovCisJdWludDMyX3QgaXNfcnhfYmFkX2F1dGg7ICAgICAgICAvKiByeCBiYWQgYXV0aCByZXF1ZXN0ICovCisJdWludDMyX3QgaXNfcnhfdW5hdXRoOyAgLyogcnggb24gdW5hdXRob3JpemVkIHBvcnQgKi8KKwl1aW50MzJfdCBpc19yeF9iYWRjaXBoZXI7ICAgICAgIC8qIHJ4IGZhaWxlZCAnY3V6IGtleSB0eXBlICovCisJdWludDMyX3QgaXNfdHhfbm9kZWZrZXk7ICAgICAgICAvKiB0eCBmYWlsZWQgJ2N1eiBubyBkZWZrZXkgKi8KKwl1aW50MzJfdCBpc190eF9ub2hlYWRyb29tOyAgICAgIC8qIHR4IGZhaWxlZCAnY3V6IG5vIHNwYWNlICovCisJdWludDMyX3QgaXNfcnhfbm9jaXBoZXJjdHg7ICAgICAvKiByeCBmYWlsZWQgJ2N1eiBrZXkgIXNldHVwICovCisJdWludDMyX3QgaXNfcnhfYWNsOyAgICAgLyogcnggZGlzY2FyZCAnY3V6IGFjbCBwb2xpY3kgKi8KKwl1aW50MzJfdCBpc19yeF9mZmNudDsgICAvKiByeCBmYXN0IGZyYW1lcyAqLworCXVpbnQzMl90IGlzX3J4X2JhZGF0aHRubDsgICAgICAgLyogZHJpdmVyIGtleSBhbGxvYyBmYWlsZWQgKi8KKwl1aW50MzJfdCBpc19yeF9ub3dkczsgICAvKiA0LWFkZHIgcGFja2V0cyByZWNlaXZlZCB3aXRoIG5vIHdkcyBlbmFibGVkICovCisJdWludDMyX3QgaXNfdHhfbm9idWY7ICAgLyogdHggZmFpbGVkIGZvciBsYWNrIG9mIGJ1ZiAqLworCXVpbnQzMl90IGlzX3R4X25vbm9kZTsgIC8qIHR4IGZhaWxlZCBmb3Igbm8gbm9kZSAqLworCXVpbnQzMl90IGlzX3R4X3Vua25vd25tZ3Q7ICAgICAgLyogdHggb2YgdW5rbm93biBtZ3QgZnJhbWUgKi8KKwl1aW50MzJfdCBpc190eF9iYWRjaXBoZXI7ICAgICAgIC8qIHR4IGZhaWxlZCAnY3V6IGtleSB0eXBlICovCisJdWludDMyX3QgaXNfdHhfZmZva2NudDsgLyogdHggZmFzdCBmcmFtZXMgc2VudCBzdWNjZXNzICovCisJdWludDMyX3QgaXNfdHhfZmZlcnJjbnQ7ICAgICAgICAvKiB0eCBmYXN0IGZyYW1lcyBzZW50IHN1Y2Nlc3MgKi8KKwl1aW50MzJfdCBpc19zY2FuX2FjdGl2ZTsgICAgICAgIC8qIGFjdGl2ZSBzY2FucyBzdGFydGVkICovCisJdWludDMyX3QgaXNfc2Nhbl9wYXNzaXZlOyAgICAgICAvKiBwYXNzaXZlIHNjYW5zIHN0YXJ0ZWQgKi8KKwl1aW50MzJfdCBpc19ub2RlX3RpbWVvdXQ7ICAgICAgIC8qIG5vZGVzIHRpbWVkIG91dCBpbmFjdGl2aXR5ICovCisJdWludDMyX3QgaXNfY3J5cHRvX25vbWVtOyAgICAgICAvKiBubyBtZW1vcnkgZm9yIGNyeXB0byBjdHggKi8KKwl1aW50MzJfdCBpc19jcnlwdG9fdGtpcDsgICAgICAgIC8qIHRraXAgY3J5cHRvIGRvbmUgaW4gcy93ICovCisJdWludDMyX3QgaXNfY3J5cHRvX3RraXBlbm1pYzsgICAvKiB0a2lwIGVuLU1JQyBkb25lIGluIHMvdyAqLworCXVpbnQzMl90IGlzX2NyeXB0b190a2lwZGVtaWM7ICAgLyogdGtpcCBkZS1NSUMgZG9uZSBpbiBzL3cgKi8KKwl1aW50MzJfdCBpc19jcnlwdG9fdGtpcGNtOyAgICAgIC8qIHRraXAgY291bnRlciBtZWFzdXJlcyAqLworCXVpbnQzMl90IGlzX2NyeXB0b19jY21wOyAgICAgICAgLyogY2NtcCBjcnlwdG8gZG9uZSBpbiBzL3cgKi8KKwl1aW50MzJfdCBpc19jcnlwdG9fd2VwOyAvKiB3ZXAgY3J5cHRvIGRvbmUgaW4gcy93ICovCisJdWludDMyX3QgaXNfY3J5cHRvX3NldGtleV9jaXBoZXI7ICAgICAgIC8qIGNpcGhlciByZWplY3RlZCBrZXkgKi8KKwl1aW50MzJfdCBpc19jcnlwdG9fc2V0a2V5X25va2V5OyAgICAgICAgLyogbm8ga2V5IGluZGV4IGZvciBzZXRrZXkgKi8KKwl1aW50MzJfdCBpc19jcnlwdG9fZGVsa2V5OyAgICAgIC8qIGRyaXZlciBrZXkgZGVsZXRlIGZhaWxlZCAqLworCXVpbnQzMl90IGlzX2NyeXB0b19iYWRjaXBoZXI7ICAgLyogdW5rbm93biBjaXBoZXIgKi8KKwl1aW50MzJfdCBpc19jcnlwdG9fbm9jaXBoZXI7ICAgIC8qIGNpcGhlciBub3QgYXZhaWxhYmxlICovCisJdWludDMyX3QgaXNfY3J5cHRvX2F0dGFjaGZhaWw7ICAvKiBjaXBoZXIgYXR0YWNoIGZhaWxlZCAqLworCXVpbnQzMl90IGlzX2NyeXB0b19zd2ZhbGxiYWNrOyAgLyogY2lwaGVyIGZhbGxiYWNrIHRvIHMvdyAqLworCXVpbnQzMl90IGlzX2NyeXB0b19rZXlmYWlsOyAgICAgLyogZHJpdmVyIGtleSBhbGxvYyBmYWlsZWQgKi8KKwl1aW50MzJfdCBpc19jcnlwdG9fZW5taWNmYWlsOyAgIC8qIGVuLU1JQyBmYWlsZWQgKi8KKwl1aW50MzJfdCBpc19pYnNzX2NhcG1pc21hdGNoOyAgIC8qIG1lcmdlIGZhaWxlZC1jYXAgbWlzbWF0Y2ggKi8KKwl1aW50MzJfdCBpc19pYnNzX25vcmF0ZTsgICAgICAgIC8qIG1lcmdlIGZhaWxlZC1yYXRlIG1pc21hdGNoICovCisJdWludDMyX3QgaXNfcHNfdW5hc3NvYzsgLyogcHMtcG9sbCBmb3IgdW5hc3NvYy4gc3RhICovCisJdWludDMyX3QgaXNfcHNfYmFkYWlkOyAgLyogcHMtcG9sbCB3LyBpbmNvcnJlY3QgYWlkICovCisJdWludDMyX3QgaXNfcHNfcWVtcHR5OyAgLyogcHMtcG9sbCB3LyBub3RoaW5nIHRvIHNlbmQgKi8KK307CisKK3R5cGVkZWYgZW51bSBfaWVlZTgwMjExX3NlbmRfZnJhbWVfdHlwZSB7CisJSUVFRTgwMjExX1NFTkRfTlVMTCwKKwlJRUVFODAyMTFfU0VORF9RT1NOVUxMLAorfSBpZWVlODAyMTFfc2VuZF9mcmFtZV90eXBlOworCit0eXBlZGVmIHN0cnVjdCBfaWVlZTgwMjExX3RzcGVjX2luZm8geworCXVpbnQ4X3QgdHJhZmZpY190eXBlOworCXVpbnQ4X3QgZGlyZWN0aW9uOworCXVpbnQ4X3QgZG90MUR0YWc7CisJdWludDhfdCB0aWQ7CisJdWludDhfdCBhY2NfcG9saWN5X2VkY2E7CisJdWludDhfdCBhY2NfcG9saWN5X2hjY2E7CisJdWludDhfdCBhZ2dyZWdhdGlvbjsKKwl1aW50OF90IHBzYjsKKwl1aW50OF90IGFja19wb2xpY3k7CisJdWludDE2X3Qgbm9ybWluYWxfbXNkdV9zaXplOworCXVpbnQxNl90IG1heF9tc2R1X3NpemU7CisJdWludDMyX3QgbWluX3Nydl9pbnRlcnZhbDsKKwl1aW50MzJfdCBtYXhfc3J2X2ludGVydmFsOworCXVpbnQzMl90IGluYWN0aXZpdHlfaW50ZXJ2YWw7CisJdWludDMyX3Qgc3VzcGVuc2lvbl9pbnRlcnZhbDsKKwl1aW50MzJfdCBzcnZfc3RhcnRfdGltZTsKKwl1aW50MzJfdCBtaW5fZGF0YV9yYXRlOworCXVpbnQzMl90IG1lYW5fZGF0YV9yYXRlOworCXVpbnQzMl90IHBlYWtfZGF0YV9yYXRlOworCXVpbnQzMl90IG1heF9idXJzdF9zaXplOworCXVpbnQzMl90IGRlbGF5X2JvdW5kOworCXVpbnQzMl90IG1pbl9waHlfcmF0ZTsKKwl1aW50MTZfdCBzdXJwbHVzX2J3OworCXVpbnQxNl90IG1lZGl1bV90aW1lOworfSBpZWVlODAyMTFfdHNwZWNfaW5mbzsKKworI2lmbmRlZiBFWFRFUk5BTF9VU0VfT05MWQorLyoKKyAqIE1hbnVhbCBBRERCQSBzdXBwb3J0CisgKi8KK2VudW0geworCUFEREJBX1NFTkQgPSAwLAorCUFEREJBX1NUQVRVUyA9IDEsCisJREVMQkFfU0VORCA9IDIsCisJQUREQkFfUkVTUCA9IDMsCisJQUREQkFfQ0xSX1JFU1AgPSA0LAorCVNJTkdMRV9BTVNEVSA9IDUsCit9OworCitlbnVtIHsKKwlBRERCQV9NT0RFX0FVVE8gPSAwLAorCUFEREJBX01PREVfTUFOVUFMID0gMSwKK307CisKK3N0cnVjdCBpZWVlODAyMTFfYWRkYmFfZGVsYmFfcmVxdWVzdCB7CisJd2xhbl9kZXZfdCBpYzsKKwl1aW50OF90IGFjdGlvbjsKKwl1aW50OF90IHRpZDsKKwl1aW50MTZfdCBzdGF0dXM7CisJdWludDE2X3QgYWlkOworCXVpbnQzMl90IGFyZzE7CisJdWludDMyX3QgYXJnMjsKK307CisjZW5kaWYgLyogRVhURVJOQUxfVVNFX09OTFkgKi8KKworI2lmZGVmIEFUSF9CVF9DT0VYCit0eXBlZGVmIGVudW0gX2llZWU4MDIxMV9idF9jb2V4X2luZm9fdHlwZSB7CisJSUVFRTgwMjExX0JUX0NPRVhfSU5GT19TQ0hFTUUgPSAwLAorCUlFRUU4MDIxMV9CVF9DT0VYX0lORk9fQlRCVVNZID0gMSwKK30gaWVlZTgwMjExX2J0X2NvZXhfaW5mb190eXBlOworI2VuZGlmCisKK3N0cnVjdCB0a2lwX2NvdW50ZXJtZWFzdXJlIHsKKwl1aW50MTZfdCBtaWNfY291bnRfaW5fNjBzOworCXVpbnQzMl90IHRpbWVzdGFtcDsKK307CisKK2VudW0gX2llZWU4MDIxMV9xb3NfZnJhbWVfZGlyZWN0aW9uIHsKKwlJRUVFODAyMTFfUlhfUU9TX0ZSQU1FID0gMCwKKwlJRUVFODAyMTFfVFhfUU9TX0ZSQU1FID0gMSwKKwlJRUVFODAyMTFfVFhfQ09NUExFVEVfUU9TX0ZSQU1FID0gMgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgaWVlZTgwMjExX3ZhcF9vcG1vZGVfY291bnQgeworCWludCB0b3RhbF92YXBzOworCWludCBpYnNzX2NvdW50OworCWludCBzdGFfY291bnQ7CisJaW50IHdkc19jb3VudDsKKwlpbnQgYWhkZW1vX2NvdW50OworCWludCBhcF9jb3VudDsKKwlpbnQgbW9uaXRvcl9jb3VudDsKKwlpbnQgYnRhbXBfY291bnQ7CisJaW50IHVua25vd25fY291bnQ7Cit9IGllZWU4MDIxMV92YXBfb3Btb2RlX2NvdW50OworCitzdHJ1Y3QgaWVlZTgwMjExX2FwcF9pZV90IHsKKwl1aW50MzJfdCBsZW5ndGg7CisJdWludDhfdCAqaWU7Cit9OworCisvKgorICogTUFDIEFDTCBvcGVyYXRpb25zLgorICovCitlbnVtIHsKKwlJRUVFODAyMTFfTUFDQ01EX1BPTElDWV9PUEVOID0gMCwgICAgICAgLyogc2V0IHBvbGljeTogbm8gQUNMJ3MgKi8KKwlJRUVFODAyMTFfTUFDQ01EX1BPTElDWV9BTExPVyA9IDEsICAgICAgLyogc2V0IHBvbGljeTogYWxsb3cgdHJhZmZpYyAqLworCUlFRUU4MDIxMV9NQUNDTURfUE9MSUNZX0RFTlkgPSAyLCAgICAgICAvKiBzZXQgcG9saWN5OiBkZW55IHRyYWZmaWMgKi8KKwlJRUVFODAyMTFfTUFDQ01EX0ZMVVNIID0gMywgICAgIC8qIGZsdXNoIEFDTCBkYXRhYmFzZSAqLworCUlFRUU4MDIxMV9NQUNDTURfREVUQUNIID0gNCwgICAgLyogZGV0YWNoIEFDTCBwb2xpY3kgKi8KKwlJRUVFODAyMTFfTUFDQ01EX1BPTElDWV9SQURJVVMgPSA1LCAgICAgLyogc2V0IHBvbGljeTogUkFESVVTIG1hbmFnZWQgQUNMcyAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2Nkcy9pbmMvY2RzX2lmX3VwcGVycHJvdG8uaCBiL2NvcmUvY2RzL2luYy9jZHNfaWZfdXBwZXJwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MmM2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9pbmMvY2RzX2lmX3VwcGVycHJvdG8uaApAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qICNpZm5kZWYgX05FVF9JRl9FVEhFUlNVQlJfSF8gKi8KKy8qICNkZWZpbmUgX05FVF9JRl9FVEhFUlNVQlJfSF8gKi8KKyNpZm5kZWYgX05FVF9JRl9VUFBFUlBST1RPX0hfCisjZGVmaW5lIF9ORVRfSUZfVVBQRVJQUk9UT19IXworCisjZGVmaW5lIEVUSEVSX0FERFJfTEVOICAgIDYgICAgIC8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCisjZGVmaW5lIEVUSEVSX1RZUEVfTEVOICAgIDIgICAgIC8qIGxlbmd0aCBvZiB0aGUgRXRoZXJuZXQgdHlwZSBmaWVsZCAqLworI2RlZmluZSBFVEhFUl9DUkNfTEVOICAgICA0ICAgICAvKiBsZW5ndGggb2YgdGhlIEV0aGVybmV0IENSQyAqLworI2RlZmluZSBFVEhFUl9IRFJfTEVOICAgICAoRVRIRVJfQUREUl9MRU4qMitFVEhFUl9UWVBFX0xFTikKKyNkZWZpbmUgRVRIRVJfTUFYX0xFTiAgICAgMTUxOAorCisjZGVmaW5lIEVUSEVSTVRVICAgICAgICAgIChFVEhFUl9NQVhfTEVOLUVUSEVSX0hEUl9MRU4tRVRIRVJfQ1JDX0xFTikKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIDEwTWIvcyBFdGhlcm5ldCBoZWFkZXIuCisgKi8KKyNpZm5kZWYgX05FVF9FVEhFUk5FVF9IXworc3RydWN0IGV0aGVyX2hlYWRlciB7CisJdWludDhfdCBldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdWludDhfdCBldGhlcl9zaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdWludDE2X3QgZXRoZXJfdHlwZTsKK30gX19wYWNrZWQ7CisjZW5kaWYKKworI2lmbmRlZiBFVEhFUlRZUEVfUEFFCisjZGVmaW5lIEVUSEVSVFlQRV9QQUUgICAgMHg4ODhlIC8qIEVBUE9MIFBBRS84MDIuMXggKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSVAKKyNkZWZpbmUgRVRIRVJUWVBFX0lQICAgICAweDA4MDAgLyogSVAgcHJvdG9jb2wgKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfQUFSUAorI2RlZmluZSBFVEhFUlRZUEVfQUFSUCAgMHg4MGYzICAvKiBBcHBsZXRhbGsgQUFSUCBwcm90b2NvbCAqLworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9JUFgKKyNkZWZpbmUgRVRIRVJUWVBFX0lQWCAgICAweDgxMzcgLyogSVBYIG92ZXIgRElYIHByb3RvY29sICovCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0FSUAorI2RlZmluZSBFVEhFUlRZUEVfQVJQICAgIDB4MDgwNiAvKiBBUlAgcHJvdG9jb2wgKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSVBWNgorI2RlZmluZSBFVEhFUlRZUEVfSVBWNiAgIDB4ODZkZCAvKiBJUHY2ICovCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFXzgwMjFRCisjZGVmaW5lIEVUSEVSVFlQRV84MDIxUSAweDgxMDAgIC8qIDgwMi4xUSB2bGFuIHByb3RvY29sICovCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX1ZMQU4KKyNkZWZpbmUgRVRIRVJUWVBFX1ZMQU4gIDB4ODEwMCAgLyogVkxBTiBUQUcgcHJvdG9jb2wgKi8KKyNlbmRpZgorI2lmbmRlZiBUWF9RVUVVRV9GT1JfRUFQT0xfRlJBTUUKKyNkZWZpbmUgVFhfUVVFVUVfRk9SX0VBUE9MX0ZSQU1FICAweDcgICAvKiBxdWV1ZSBlYXBvbCBmcmFtZSB0byBxdWV1ZSA3IHRvIGF2b2lkIGFnZ3JlZ2F0aW9uIGRpc29yZGVyICovCisjZW5kaWYKKworLyoKKyAqIGRlZmluZSBXQUkgZXRoZXJ0eXBlCisgKi8KKyNpZm5kZWYgRVRIRVJUWVBFX1dBSQorI2RlZmluZSBFVEhFUlRZUEVfV0FJICAgIDB4ODhiNCAvKiBXQUkvV0FQSSAqLworI2VuZGlmCisKKyNkZWZpbmUgRVRIRVJUWVBFX09DQl9UWCAgIDB4ODE1MQorI2RlZmluZSBFVEhFUlRZUEVfT0NCX1JYICAgMHg4MTUyCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSA0OC1iaXQgRXRoZXJuZXQgYWRkcmVzcy4KKyAqLworI2lmIDAKKyNpZm5kZWYgX05FVF9FVEhFUk5FVF9IXworc3RydWN0IGV0aGVyX2FkZHIgeworCXVpbnQ4X3Qgb2N0ZXRbRVRIRVJfQUREUl9MRU5dOworfSBfX3BhY2tlZDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgRVRIRVJfSVNfTVVMVElDQVNUKGFkZHIpICgqKGFkZHIpICYgMHgwMSkgICAgICAgLyogaXMgYWRkcmVzcyBtY2FzdC9iY2FzdD8gKi8KKworI2RlZmluZSBWTEFOX1BSSV9TSElGVCAgMTMgICAgICAvKiBTaGlmdCB0byBmaW5kIFZMQU4gdXNlciBwcmlvcml0eSAqLworI2RlZmluZSBWTEFOX1BSSV9NQVNLICAgIDcgICAgICAvKiBNYXNrIGZvciB1c2VyIHByaW9yaXR5IGJpdHMgaW4gVkxBTiAqLworCisvKgorICogU3RydWN0dXJlIG9mIHRoZSBJUCBmcmFtZQorICovCitzdHJ1Y3QgaXBfaGVhZGVyIHsKKwl1aW50OF90IHZlcnNpb25faWhsOworCXVpbnQ4X3QgdG9zOworCXVpbnQxNl90IHRvdF9sZW47CisJdWludDE2X3QgaWQ7CisJdWludDE2X3QgZnJhZ19vZmY7CisJdWludDhfdCB0dGw7CisJdWludDhfdCBwcm90b2NvbDsKKwl1aW50MTZfdCBjaGVjazsKKwl1aW50MzJfdCBzYWRkcjsKKwl1aW50MzJfdCBkYWRkcjsKKwkvKlRoZSBvcHRpb25zIHN0YXJ0IGhlcmUuICovCit9OworI2lmbmRlZiBJUF9QUk9UT19UQ1AKKyNkZWZpbmUgSVBfUFJPVE9fVENQICAgIDB4NiAgICAgLyogVENQIHByb3RvY29sICovCisjZW5kaWYKKyNpZm5kZWYgSVBfUFJPVE9fVURQCisjZGVmaW5lIElQX1BST1RPX1VEUCAxNworI2VuZGlmCisKKy8qCisgKiAgIElHTVAgcHJvdG9jb2wgc3RydWN0dXJlcworICovCisKKy8qIElHTVAgcmVjb3JkIHR5cGUgKi8KKyNkZWZpbmUgSUdNUF9RVUVSWV9UWVBFICAgICAgIDB4MTEKKyNkZWZpbmUgSUdNUFYxX1JFUE9SVF9UWVBFICAgIDB4MTIKKyNkZWZpbmUgSUdNUFYyX1JFUE9SVF9UWVBFICAgIDB4MTYKKyNkZWZpbmUgSUdNUFYyX0xFQVZFX1RZUEUgICAgIDB4MTcKKyNkZWZpbmUgSUdNUFYzX1JFUE9SVF9UWVBFICAgIDB4MjIKKworLyogSXMgcGFja2V0IHR5cGUgaXMgZWl0aGVyIGxlYXZlIG9yIHJlcG9ydCAqLworI2RlZmluZSBJU19JR01QX1JFUE9SVF9MRUFWRV9QQUNLRVQodHlwZSkgKCBcCisJCShJR01QVjFfUkVQT1JUX1RZUEUgPT0gdHlwZSkgXAorCQl8fCAoSUdNUFYyX1JFUE9SVF9UWVBFID09IHR5cGUpCVwKKwkJfHwgKElHTVBWMl9MRUFWRV9UWVBFICA9PSB0eXBlKQlcCisJCXx8IChJR01QVjNfUkVQT1JUX1RZUEUgPT0gdHlwZSkJXAorCQkpCisvKgorICogICAgSGVhZGVyIGluIG9uIGNhYmxlIGZvcm1hdAorICovCisKK3N0cnVjdCBpZ21wX2hlYWRlciB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgY29kZTsgICAgICAgICAgIC8qIEZvciBuZXdlciBJR01QICovCisJdWludDE2X3QgY3N1bTsKKwl1aW50MzJfdCBncm91cDsKK307CisKKy8qIFYzIGdyb3VwIHJlY29yZCB0eXBlcyBbZ3JlY190eXBlXSAqLworI2RlZmluZSBJR01QVjNfTU9ERV9JU19JTkNMVURFICAgICAgICAxCisjZGVmaW5lIElHTVBWM19NT0RFX0lTX0VYQ0xVREUgICAgICAgIDIKKyNkZWZpbmUgSUdNUFYzX0NIQU5HRV9UT19JTkNMVURFICAgICAgMworI2RlZmluZSBJR01QVjNfQ0hBTkdFX1RPX0VYQ0xVREUgICAgICA0CisjZGVmaW5lIElHTVBWM19BTExPV19ORVdfU09VUkNFUyAgICAgIDUKKyNkZWZpbmUgSUdNUFYzX0JMT0NLX09MRF9TT1VSQ0VTICAgICAgNgorCisvKiAgR3JvdXAgcmVjb3JkIGZvcm1hdAorICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyB8ICBSZWNvcmQgVHlwZSAgfCAgQXV4IERhdGEgTGVuIHwgICAgIE51bWJlciBvZiBTb3VyY2VzIChOKSAgICAgfAorIHx8Ky0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyB8ICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3QgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgfAorIHx8Ky0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyB8ICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgQWRkcmVzcyBbMV0gICAgICAgICAgICAgICAgICAgICAgfAorIHx8Ky0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSsKKyB8ICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgQWRkcmVzcyBbMl0gICAgICAgICAgICAgICAgICAgICAgfAorIHx8Ky0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSsKKyAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyB8fCstICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0rCisgfCAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIEFkZHJlc3MgW05dICAgICAgICAgICAgICAgICAgICAgIHwKKyB8fCstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgIEF1eGlsaWFyeSBEYXRhICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHx8Ky0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworc3RydWN0IGlnbXBfdjNfZ3JlYyB7CisJdWludDhfdCBncmVjX3R5cGU7CisJdWludDhfdCBncmVjX2F1eHdvcmRzOworCXVpbnQxNl90IGdyZWNfbnNyY3M7CisJdWludDMyX3QgZ3JlY19tY2E7Cit9OworCisvKiBJR01QdjMgcmVwb3J0IGZvcm1hdAorICAgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgfCAgVHlwZSA9IDB4MjIgIHwgICAgUmVzZXJ2ZWQgICB8ICAgICAgICAgICBDaGVja3N1bSAgICAgICAgICAgIHwKKyB8fCstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgfCAgICAgICAgICAgUmVzZXJ2ZWQgICAgICAgICAgICB8ICBOdW1iZXIgb2YgR3JvdXAgUmVjb3JkcyAoTSkgIHwKKyB8fCstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgUmVjb3JkIFsxXSAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHx8Ky0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICBHcm91cCBSZWNvcmQgWzJdICAgICAgICAgICAgICAgICAgICAgICAuCisgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfHwrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfHwrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIFJlY29yZCBbTV0gICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8fCstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KK3N0cnVjdCBpZ21wX3YzX3JlcG9ydCB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgcmVzdjE7CisJdWludDE2X3QgY3N1bTsKKwl1aW50MTZfdCByZXN2MjsKKwl1aW50MTZfdCBuZ3JlYzsKK307CisKKy8qIENhbGN1bGF0ZSB0aGUgZ3JvdXAgcmVjb3JkIGxlbmd0aCovCisjZGVmaW5lIElHTVBWM19HUlBfUkVDX0xFTih4KSAoOCArICg0ICogeC0+Z3JlY19uc3JjcykgKyAoNCAqIHgtPmdyZWNfYXV4d29yZHMpICkKKworI2VuZGlmIC8qIF9ORVRfSUZfRVRIRVJTVUJSX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2Nkcy9pbmMvY2RzX21xLmggYi9jb3JlL2Nkcy9pbmMvY2RzX21xLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3NmJlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RzL2luYy9jZHNfbXEuaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZCggX19DRFNfTVFfSCApCisjZGVmaW5lIF9fQ0RTX01RX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgY2RzX21xLmgKKworICAgXGJyaWVmIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWNlcyAoQ0RGKSBtZXNzYWdlIHF1ZXVlIEFQSXMKKworICAgTWVzc2FnZSBRdWV1ZSBEZWZpbml0aW9ucyBhbmQgQVBJCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8Y2RmX3N0YXR1cy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGNkcyBNZXNzYWdlIFR5cGUuCisgICBUaGlzIHJlcHJlc25ldHMgYSBtZXNzYWdlIHRoYXQgY2FuIGJlIHBvc3RlZCB0byBhbm90aGVyIG1vZHVsZSB0aHJvdWdoCisgICB0aGUgY2RzIE1lc3NhZ2UgUXVldWVzLgorICAgXG5vdGUgVGhpcyBpcyBtYXBwZWQgZGlyZWN0bHkgdG8gdGhlIHRTaXJNc2dRIGZvciBiYWNrd2FyZAorICAgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBsZWdhY3kgTUFDIGNvZGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY2RzX21zZ19zIHsKKwl1aW50MTZfdCB0eXBlOworCS8qCisJICogVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCBhcyBzZXF1ZW5jZSBudW1iZXIvZGlhbG9nIHRva2VuIGZvciBtYXRjaGluZworCSAqIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCisJICovCisJdWludDE2X3QgcmVzZXJ2ZWQ7CisJLyoqCisJICogQmFzZWQgb24gdGhlIHR5cGUgZWl0aGVyIGEgYm9keXB0ciBwb2ludGVyIGludG8KKwkgKiBtZW1vcnkgb3IgYm9keXZhbCBhcyBhIDMyIGJpdCBkYXRhIGlzIHVzZWQuCisJICogYm9keXB0cjogaXMgYWx3YXlzIGEgZnJlZWFibGUgcG9pbnRlciwgb25lIHNob3VsZCBhbHdheXMKKwkgKiBtYWtlIHN1cmUgdGhhdCBib2R5cHRyIGlzIGFsd2F5cyBmcmVlYWJsZS4KKwkgKgorCSAqIE1lc3NhZ2VzIHNob3VsZCB1c2UgZWl0aGVyIGJvZHlwdHIgb3IgYm9keXZhbDsgbm90IGJvdGggISEhLgorCSAqLworCXZvaWQgKmJvZHlwdHI7CisKKwl1aW50MzJfdCBib2R5dmFsOworCisJLyoKKwkgKiBTb21lIG1lc3NhZ2VzIHByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbi4gIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUKKwkgKiBtdXN0IGJlIGFncmVlZCB1cG9uIGJldHdlZW4gdGhlIHR3byBlbnRpdGllcyBleGNoYW5naW5nIHRoZSBtZXNzYWdlCisJICovCisJdm9pZCAqY2FsbGJhY2s7CisKK30gY2RzX21zZ190OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBNZXNzYWdlIFF1ZXVlIElEcyAqLwordHlwZWRlZiBlbnVtIHsKKwkvKiBNZXNzYWdlIFF1ZXVlIElEIGZvciBtZXNzYWdlcyBib3VuZCBmb3IgU01FICovCisJQ0RTX01RX0lEX1NNRSA9IENERl9NT0RVTEVfSURfU01FLAorCisJLyogTWVzc2FnZSBRdWV1ZSBJRCBmb3IgbWVzc2FnZXMgYm91bmQgZm9yIFBFICovCisJQ0RTX01RX0lEX1BFID0gQ0RGX01PRFVMRV9JRF9QRSwKKworCS8qIE1lc3NhZ2UgUXVldWUgSUQgZm9yIG1lc3NhZ2VzIGJvdW5kIGZvciBXTUEgKi8KKwlDRFNfTVFfSURfV01BID0gQ0RGX01PRFVMRV9JRF9XTUEsCisKKwkvKiBNZXNzYWdlIFF1ZXVlIElEIGZvciBtZXNzYWdlcyBib3VuZCBmb3IgdGhlIFNZUyBtb2R1bGUgKi8KKwlDRFNfTVFfSURfU1lTID0gQ0RGX01PRFVMRV9JRF9TWVMsCisKK30gQ0RTX01RX0lEOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIGNkc19tcV9wb3N0X21lc3NhZ2UoKSAtIHBvc3QgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBxdWV1ZQorCisgICBUaGlzIEFQSSBhbGxvd3MgbWVzc2FnZXMgdG8gYmUgcG9zdGVkIHRvIGEgc3BlY2lmaWMgbWVzc2FnZSBxdWV1ZS4gIE1lc3NhZ2VzCisgICBjYW4gYmUgcG9zdGVkIHRvIHRoZSBmb2xsb3dpbmcgbWVzc2FnZSBxdWV1ZXM6CisKKyAgIDx1bD4KKyAgICA8bGk+IFNNRQorICAgIDxsaT4gUEUKKyAgICA8bGk+IEhBTAorICAgIDxsaT4gVEwKKyAgIDwvdWw+CisKKyAgIFxwYXJhbSBtc2dRdWV1ZUlkIC0gaWRlbnRpZmllcyB0aGUgbWVzc2FnZSBxdWV1ZSB1cG9uIHdoaWNoIHRoZSBtZXNzYWdlCisgICAgICAgICB3aWxsIGJlIHBvc3RlZC4KKworICAgXHBhcmFtIG1lc3NhZ2UgLSBhIHBvaW50ZXIgdG8gYSBtZXNzYWdlIGJ1ZmZlci4gIE1lbW9yeSBmb3IgdGhpcyBtZXNzYWdlCisgICAgICAgICBidWZmZXIgaXMgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIgYW5kIGZyZWUnZCBieSB0aGUgQ0RGIGFmdGVyIHRoZQorICAgICAgICAgbWVzc2FnZSBpcyBwb3N0ZWQgdG8gdGhlIG1lc3NhZ2UgcXVldWUuICBJZiB0aGUgY29uc3VtZXIgb2YgdGhlCisgICAgICAgICBtZXNzYWdlIG5lZWRzIGFueXRoaW5nIGluIHRoaXMgbWVzc2FnZSwgaXQgbmVlZHMgdG8gY29weSB0aGUgY29udGVudHMKKyAgICAgICAgIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgbWVzc2FnZSBxdWV1ZSBoYW5kbGVyLgorCisgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwb3N0ZWQKKyAgICAgICAgICB0byB0aGUgbWVzc2FnZSBxdWV1ZS4KKworICAgICAgICAgIENERl9TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgbXNnUXVldWVJZCBkb2VzIG5vdAorICAgICAgICAgIHJlZmVyIHRvIGEgdmFsaWQgTWVzc2FnZSBRdWV1ZSBJZC4KKworICAgICAgICAgIENERl9TVEFUVVNfRV9GQVVMVCAgLSBtZXNzYWdlIGlzIGFuIGludmFsaWQgcG9pbnRlci4KKworICAgICAgICAgIENERl9TVEFUVVNfRV9GQUlMVVJFIC0gdGhlIG1lc3NhZ2UgcXVldWUgaGFuZGxlciBoYXMgcmVwb3J0ZWQKKyAgICAgICAgICBhbiB1bmtub3duIGZhaWx1cmUuCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEIG1zZ1F1ZXVlSWQsIGNkc19tc2dfdCAqbWVzc2FnZSk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMoKSAtIHBvc3QgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBxdWV1ZQorCisgICBccGFyYW0gcEJ1ZiBpcyBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgY2FsbGVyLiBUaGUgYWN0dWFsIHN0cnVjdHVyZSB2YXJpZXMKKyAgICAgICAgIGJhc2Ugb24gbWVzc2FnZSB0eXBlCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gdGhlIG1lc3NhZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHBvc3RlZAorICAgICAgICAgIHRvIHRoZSBtZXNzYWdlIHF1ZXVlLgorCisgICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgLSB0aGUgbWVzc2FnZSBxdWV1ZSBoYW5kbGVyIGhhcyByZXBvcnRlZAorICAgICAgICAgIGFuIHVua25vd24gZmFpbHVyZS4KKworICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NERl9TVEFUVVMgY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWModm9pZCAqcEJ1Zik7CisKKyNlbmRpZiAvKiBpZiAhZGVmaW5lZCBfX0NEU19NUV9IICovCmRpZmYgLS1naXQgYS9jb3JlL2Nkcy9pbmMvY2RzX3BhY2tfYWxpZ24uaCBiL2NvcmUvY2RzL2luYy9jZHNfcGFja19hbGlnbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTMxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9pbmMvY2RzX3BhY2tfYWxpZ24uaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZCggX19DRFNfUEFDS19BTElHTl9IICkKKyNkZWZpbmUgX19DRFNfUEFDS19BTElHTl9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIGNkc19wYWNrX2FsaWduLmgKKworICAgXGJyaWVmIENvbm5lY3Rpdml0eSBkcml2ZXIgc2VydmljZXMgKENEUykgcGFjayBhbmQgYWxpZ24gcHJpbWl0aXZlcworCisgICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWVhbnMgb2YgcGFja2luZyBhbmQgYWxpZ25pbmcKKyAgIGRhdGEgc3RydWN0dXJlcworCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorCisgICBQbGFjZSB0aGUgbWFjcm8gQ0RTX1BBQ0tfU1RBUlQgYWJvdmUgYSBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24gdG8gcGFjay4gV2UKKyAgIGFyZSBub3QgZ29pbmcgdG8gYWxsb3cgbW9kaWZ5aW5nIHRoZSBwYWNrIHNpemUgYmVjYXVzZSBwYWNrIHNpemUgY2Fubm90IGJlCisgICBzcGVjaWZpZWQgaW4gQU1TUyBhbmQgR05VLiBQbGFjZSB0aGUgbWFjcm8gQ0RTX1BBQ0tfRU5EIGJlbG93IGEgc3RydWN0dXJlCisgICBkZWNsYXJhdGlvbiB0byBzdG9wIHRoZSBwYWNrLiBUaGlzIHJlcXVpcmVtZW50IGlzIG5lY2Vzc2l0YXRlZCBieSBXaW5kb3dzCisgICB3aGljaCBuZWVkIHByYWdtYSBiYXNlZCBwcm9sb2cgYW5kIGVwaWxvZy4KKworICAgUGFjay1zaXplID4gMS1ieXRlIGlzIG5vdCBzdXBwb3J0ZWQgc2luY2UgZ2NjIGFuZCBhcm0gZG8gbm90IHN1cHBvcnQgdGhhdC4KKworICAgSGVyZSBhcmUgc29tZSBleGFtcGxlcworCisgICAxLiBQYWNrLXNpemUgMS1ieXRlIGZvb190IGFjcm9zcyBhbGwgcGxhdGZvcm1zCisKKyAgIENEU19QQUNLX1NUQVJUCisgICB0eXBlZGVmIENEU19QQUNLX1BSRSBzdHJ1Y3QgZm9vX3MgeyAuLi4gfSBDRFNfUEFDS19QT1NUIGZvb190OworICAgQ0RTX1BBQ0tfRU5ECisKKyAgIDIuIDItYnl0ZSBhbGlnbm1lbnQgZm9yIGZvb190IGFjcm9zcyBhbGwgcGxhdGZvcm1zCisKKyAgIHR5cGVkZWYgQ0RTX0FMSUdOX1BSRSgyKSBzdHJ1Y3QgZm9vX3MgeyAuLi4gfSBDRFNfQUxJR05fUE9TVCgyKSBmb29fdDsKKworICAgMy4gUGFjay1zaXplIDEtYnl0ZSBhbmQgMi1ieXRlIGFsaWdubWVudCBmb3IgZm9vX3QgYWNyb3NzIGFsbCBwbGF0Zm9ybXMKKworICAgQ0RTX1BBQ0tfU1RBUlQKKyAgIHR5cGVkZWYgQ0RTX1BBQ0tfUFJFIENEU19BTElHTl9QUkUoMikgc3RydWN0IGZvb19zIHsgLi4uIH0gQ0RTX0FMSUdOX1BPU1QoMikgQ0RTX1BBQ0tfUE9TVCBmb29fdDsKKyAgIENEU19QQUNLX0VORAorCisgKi8KKworI2lmIGRlZmluZWQgX19HTlVDX18KKworI2RlZmluZSBDRFNfUEFDS19TVEFSVAorI2RlZmluZSBDRFNfUEFDS19FTkQKKworI2RlZmluZSBDRFNfUEFDS19QUkUKKyNkZWZpbmUgQ0RTX1BBQ0tfUE9TVCAgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpCisKKyNkZWZpbmUgQ0RTX0FMSUdOX1BSRShfX3ZhbHVlKQorI2RlZmluZSBDRFNfQUxJR05fUE9TVChfX3ZhbHVlKSAgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oX192YWx1ZSkpKQorCisjZWxpZiBkZWZpbmVkIF9fYXJtCisKKyNkZWZpbmUgQ0RTX1BBQ0tfU1RBUlQKKyNkZWZpbmUgQ0RTX1BBQ0tfRU5ECisKKyNkZWZpbmUgQ0RTX1BBQ0tfUFJFICBfX3BhY2tlZAorI2RlZmluZSBDRFNfUEFDS19QT1NUCisKKyNkZWZpbmUgQ0RTX0FMSUdOX1BSRShfX3ZhbHVlKSAgX19hbGlnbihfX3ZhbHVlKQorI2RlZmluZSBDRFNfQUxJR05fUE9TVChfX3ZhbHVlKQorCisjZWxpZiBkZWZpbmVkIF9NU0NfVkVSCisKKyNkZWZpbmUgQ0RTX1BBQ0tfU1RBUlQgIF9fcHJhZ21hKHBhY2socHVzaCwxKSkKKyNkZWZpbmUgQ0RTX1BBQ0tfRU5EICBfX3ByYWdtYShwYWNrKHBvcCkpCisKKyNkZWZpbmUgQ0RTX1BBQ0tfUFJFCisjZGVmaW5lIENEU19QQUNLX1BPU1QKKworI2RlZmluZSBDRFNfQUxJR05fUFJFKF9fdmFsdWUpICBfX2RlY2xzcGVjKGFsaWduKF9fdmFsdWUpKQorI2RlZmluZSBDRFNfQUxJR05fUE9TVChfX3ZhbHVlKQorCisjZWxzZQorCisjZXJyb3IgVW5zdXBwb3J0ZWQgY29tcGlsZXIhISEKKworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0NEU19QQUNLX0FMSUdOX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RzL2luYy9jZHNfcGFja2V0LmggYi9jb3JlL2Nkcy9pbmMvY2RzX3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYTg3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9pbmMvY2RzX3BhY2tldC5oCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fQ0RTX1BLVF9IICkKKyNkZWZpbmUgX19DRFNfUEtUX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgICAgICAgY2RzX3BhY2tldC5oCisKKyAgIFxicmllZiAgICAgICBDb25uZWN0aXZpdHkgZHJpdmVyIHNlcnZpY2VzIChDRFMpIG5ldHdvcmsgUGFja2V0IEFQSXMKKworICAgTmV0d29yayBQcm90b2NvbCBwYWNrZXQvYnVmZmVyIHN1cHBvcnQgaW50ZXJmYWNlcworCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBJbmNsdWRlIEZpbGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGNkZl9zdGF0dXMuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFR5cGUgZGVjbGFyYXRpb25zCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IGNkc19wa3RfdDsKK3R5cGVkZWYgc3RydWN0IGNkc19wa3RfdCBjZHNfcGt0X3Q7CisKKyNpbmNsdWRlICJjZGZfbmJ1Zi5oIgorCisjZGVmaW5lIENEU19QS1RfVFJBQ19UWVBFX0VBUE9MICAgTkJVRl9QS1RfVFJBQ19UWVBFX0VBUE9MCisjZGVmaW5lIENEU19QS1RfVFJBQ19UWVBFX0RIQ1AgICAgTkJVRl9QS1RfVFJBQ19UWVBFX0RIQ1AKKyNkZWZpbmUgQ0RTX1BLVF9UUkFDX1RZUEVfTUdNVF9BQ1RJT04gICAgTkJVRl9QS1RfVFJBQ19UWVBFX01HTVRfQUNUSU9OIC8qIE1hbmFnbWVudCBhY3Rpb24gZnJhbWUgKi8KKworI2RlZmluZSBDRFNfUEtUX1RSQUNfRFVNUF9DTUQgICAgIDk5OTkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBicmllZiBjZHNfcGt0X2dldF9wcm90b190eXBlKCkgLQorICAgICAgRmluZCBwcm90b2NvIHR5cGUgZnJvbSBwYWNrZXQgY29udGVudHMKKworKiBza2IgUGFja2V0IFBvaW50ZXIKKyogdHJhY2tpbmdfbWFwIHBhY2tldCB0eXBlIHdhbnQgdG8gdHJhY2sKKyogZG90MTFfdHlwZSwgZnJhbWUgdHlwZSB3aGVuIHRoZSBmcmFtZSBpcyBpbiBkb3QxMSBmb3JtYXQKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQ4X3QgY2RzX3BrdF9nZXRfcHJvdG9fdHlwZQorCShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1aW50OF90IHRyYWNraW5nX21hcCwgdWludDhfdCBkb3QxMV90eXBlKTsKKworI2lmZGVmIFFDQV9QS1RfUFJPVE9fVFJBQ0UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogYnJpZWYgY2RzX3BrdF90cmFjZV9idWZfdXBkYXRlKCkgLQorICAgICAgVXBkYXRlIHN0b3JhZ2UgYnVmZmVyIHdpdGggaW50ZXJlc3QgZXZlbnQgc3RyaW5nCisKKyogZXZlbnRfc3RyaW5nIEV2ZW50IFN0cmluZyBtYXkgcGFja2V0IHR5cGUgb3Igb3V0c3RhbmRpbmcgZXZlbnQKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY2RzX3BrdF90cmFjZV9idWZfdXBkYXRlKGNoYXIgKmV2ZW50X3N0cmluZyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogYnJpZWYgY2RzX3BrdF90cmFjZV9idWZfZHVtcCgpIC0KKyAgICAgIER1bXAgc3RvcmVkIGluZm9ybWF0aW9uIGludG8ga2VybmVsIGxvZworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjZHNfcGt0X3RyYWNlX2J1Zl9kdW1wKHZvaWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIGJyaWVmIGNkc19wa3RfcHJvdG9fdHJhY2VfaW5pdCgpIC0KKyAgICAgIEluaXRpYWxpemUgcHJvdG9jb2wgdHJhY2UgZnVuY3Rpb25hbGl0eSwgYWxsb2NhdGUgcmVxdWlyZWQgcmVzb3VyY2UKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY2RzX3BrdF9wcm90b190cmFjZV9pbml0KHZvaWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIGJyaWVmIGNkc19wa3RfcHJvdG9fdHJhY2VfY2xvc2UoKSAtCisgICAgICBGcmVlIHJlcXVpcmVkIHJlc291cmNlCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNkc19wa3RfcHJvdG9fdHJhY2VfY2xvc2Uodm9pZCk7CisjZW5kaWYgLyogUUNBX1BLVF9QUk9UT19UUkFDRSAqLworCisvKioKKyAqIGNkc19wa3RfcmV0dXJuX3BhY2tldCAgRnJlZSB0aGUgY2RzIFBhY2tldAorICogQCBjZHMgUGFja2V0CisgKi8KK0NERl9TVEFUVVMgY2RzX3BrdF9yZXR1cm5fcGFja2V0KGNkc19wa3RfdCAqcGFja2V0KTsKKworLyoqCisgKiBjZHNfcGt0X2dldF9wYWNrZXRfbGVuZ3RoICBSZXR1cm5zIHRoZSBwYWNrZXQgbGVuZ3RoCisgKiBAIGNkcyBQYWNrZXQKKyAqLworQ0RGX1NUQVRVUyBjZHNfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKGNkc19wa3RfdCAqcFBhY2tldCwKKwkJCQkgICAgIHVpbnQxNl90ICpwUGFja2V0U2l6ZSk7CisKKy8qCisgKiBUT0RPOiBSZW1vdmUgbGF0ZXIKKyAqIEFsbCB0aGUgYmVsb3cgZGlmaW5pdGlvbnMgYXJlIG5vdAorICogcmVxdWlyZWQgZm9yIEhvc3QgRHJpdmVyIDIuMAorICogb25jZSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZXMgYXJlIHJlbW92ZWQKKyAqIGZyb20gSEREIGFuZCBvdGhlciBsYXllcnMKKyAqIGJlbG93IGNvZGUgd2lsbCBiZSByZW1vdmVkCisgKi8KKy8qIFRoZSBzaXplIG9mIEFNU0RVIGZyYW1lIHBlciBzcGVjIGNhbiBiZSBhIG1heCBvZiAzODM5IGJ5dGVzCisgICBpbiBCRC9QRFVzIHRoYXQgbWVhbnMgMzAgKG9uZSBCRCA9IDEyOCBieXRlcykKKyAgIHdlIG11c3QgYWRkIHRoZSBzaXplIG9mIHRoZSA4MDIuMTEgaGVhZGVyIHRvIHRoYXQgKi8KKyNkZWZpbmUgQ0RTX1BLVF9TSVpFX0JVRkZFUiAgKCgzMCAqIDEyOCkgKyAzMikKKworLyogY2RzIFBhY2tldCBUeXBlcyAqLwordHlwZWRlZiBlbnVtIHsKKwkvKiBjZHMgUGFja2V0IGlzIHVzZWQgdG8gdHJhbnNtaXQgODAyLjExIE1hbmFnZW1lbnQgZnJhbWVzLiAqLworCUNEU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCwKKworCS8qIGNkcyBQYWNrZXQgaXMgdXNlZCB0byB0cmFuc21pdCA4MDIuMTEgRGF0YSBmcmFtZXMuICovCisJQ0RTX1BLVF9UWVBFX1RYXzgwMl8xMV9EQVRBLAorCisJLyogY2RzIFBhY2tldCBpcyB1c2VkIHRvIHRyYW5zbWl0IDgwMi4zIERhdGEgZnJhbWVzLiAqLworCUNEU19QS1RfVFlQRV9UWF84MDJfM19EQVRBLAorCisJLyogY2RzIFBhY2tldCBjb250YWlucyBSZWNlaXZlZCBkYXRhIG9mIGFuIHVua25vd24gZnJhbWUgdHlwZSAqLworCUNEU19QS1RfVFlQRV9SWF9SQVcsCisKKwkvKiBJbnZhbGlkIHNlbnRpbmVsIHZhbHVlICovCisJQ0RTX1BLVF9UWVBFX01BWElNVU0KK30gQ0RTX1BLVF9UWVBFOworCisvKiB1c2VyIElEcy4gICBUaGVzZSBJRHMgYXJlIG5lZWRlZCBvbiB0aGUgY2RzX3BrdF9nZXQvc2V0X3VzZXJfZGF0YV9wdHIoKQorICAgdG8gaWRlbnRpZnkgdGhlIHVzZXIgYXJlYSBpbiB0aGUgY2RzIFBhY2tldC4gKi8KK3R5cGVkZWYgZW51bSB7CisJQ0RTX1BLVF9VU0VSX0RBVEFfSURfVEwgPSAwLAorCUNEU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwKKwlDRFNfUEtUX1VTRVJfREFUQV9JRF9XTUEsCisJQ0RTX1BLVF9VU0VSX0RBVEFfSURfSERELAorCUNEU19QS1RfVVNFUl9EQVRBX0lEX0JTTCwKKworCUNEU19QS1RfVVNFUl9EQVRBX0lEX01BWAorfSBDRFNfUEtUX1VTRVJfREFUQV9JRDsKKworI2lmZGVmIE1FTU9SWV9ERUJVRworI2RlZmluZSBjZHNfcGFja2V0X2FsbG9jKHMsIGQsIHApCVwKKwljZHNfcGFja2V0X2FsbG9jX2RlYnVnKHMsIGQsIHAsIF9fRklMRV9fLCBfX0xJTkVfXykKKworQ0RGX1NUQVRVUyBjZHNfcGFja2V0X2FsbG9jX2RlYnVnKHVpbnQxNl90IHNpemUsIHZvaWQgKipkYXRhLCB2b2lkICoqcHBQYWNrZXQsCisJCQkJICB1aW50OF90ICpmaWxlX25hbWUsIHVpbnQzMl90IGxpbmVfbnVtKTsKKyNlbHNlCitDREZfU1RBVFVTIGNkc19wYWNrZXRfYWxsb2ModWludDE2X3Qgc2l6ZSwgdm9pZCAqKmRhdGEsIHZvaWQgKipwcFBhY2tldCk7CisjZW5kaWYKKwordm9pZCBjZHNfcGFja2V0X2ZyZWUodm9pZCAqcFBhY2tldCk7CisKK3R5cGVkZWYgQ0RGX1NUQVRVUyAoKmNkc19wa3RfZ2V0X3BhY2tldF9jYWxsYmFjaykoY2RzX3BrdF90ICpwUGFja2V0LAorCQkJCQkJICB2b2lkICp1c2VyRGF0YSk7CisKKyNlbmRpZiAvKiAhZGVmaW5lZCggX19DRFNfUEtUX0ggKSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZHMvaW5jL2Nkc19xdWV1ZS5oIGIvY29yZS9jZHMvaW5jL2Nkc19xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMGZmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9pbmMvY2RzX3F1ZXVlLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQ0RTX1FVRVVFX0gKKyNkZWZpbmUgX0NEU19RVUVVRV9ICisKKyNpbmNsdWRlIDxxdWV1ZS5oPiAvKiBpbmNsdWRlIEJTRCBxdWV1ZSAqLworCisjZW5kaWYgLyogZW5kIG9mIF9DRFNfUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZHMvaW5jL2Nkc19yZWdfc2VydmljZS5oIGIvY29yZS9jZHMvaW5jL2Nkc19yZWdfc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYTY5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9pbmMvY2RzX3JlZ19zZXJ2aWNlLmgKQEAgLTAsMCArMSwzMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZCBfX0NEU19SRUdfU0VSVklDRV9ICisjZGVmaW5lIF9fQ0RTX1JFR19TRVJWSUNFX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgY2RzX3JlZ19zZXJ2aWNlLmgKKworICAgXGJyaWVmIENvbm5lY3Rpdml0eSBkcml2ZXIgc2VydmljZXMgKENEUyk6IE5vbi1Wb2xhdGlsZSBzdG9yYWdlIEFQSQorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAiY2RmX3N0YXR1cy5oIgorCisjZGVmaW5lIENEU19DT1VOVFJZX0NPREVfTEVOICAyCisjZGVmaW5lIENEU19NQUNfQUREUkVTU19MRU4gICA2CisKK3R5cGVkZWYgZW51bSB7CisJUkVHRE9NQUlOX0ZDQywKKwlSRUdET01BSU5fRVRTSSwKKwlSRUdET01BSU5fSkFQQU4sCisJUkVHRE9NQUlOX1dPUkxELAorCVJFR0RPTUFJTl9DT1VOVAorfSB2X1JFR0RPTUFJTl90OworCit0eXBlZGVmIGVudW0geworCS8qIDIuNEdIeiBCYW5kICovCisJUkZfQ0hBTl8xID0gMCwKKwlSRl9DSEFOXzIsCisJUkZfQ0hBTl8zLAorCVJGX0NIQU5fNCwKKwlSRl9DSEFOXzUsCisJUkZfQ0hBTl82LAorCVJGX0NIQU5fNywKKwlSRl9DSEFOXzgsCisJUkZfQ0hBTl85LAorCVJGX0NIQU5fMTAsCisJUkZfQ0hBTl8xMSwKKwlSRl9DSEFOXzEyLAorCVJGX0NIQU5fMTMsCisJUkZfQ0hBTl8xNCwKKworCS8qIDQuOUdIeiBCYW5kICovCisJUkZfQ0hBTl8yNDAsCisJUkZfQ0hBTl8yNDQsCisJUkZfQ0hBTl8yNDgsCisJUkZfQ0hBTl8yNTIsCisJUkZfQ0hBTl8yMDgsCisJUkZfQ0hBTl8yMTIsCisJUkZfQ0hBTl8yMTYsCisKKwkvKiA1R0h6IExvdyAmIE1pZCBVLU5JSSBCYW5kICovCisJUkZfQ0hBTl8zNiwKKwlSRl9DSEFOXzQwLAorCVJGX0NIQU5fNDQsCisJUkZfQ0hBTl80OCwKKwlSRl9DSEFOXzUyLAorCVJGX0NIQU5fNTYsCisJUkZfQ0hBTl82MCwKKwlSRl9DSEFOXzY0LAorCisJLyogNUdIeiBNaWQgQmFuZCAtIEVUU0kgJiBGQ0MgKi8KKwlSRl9DSEFOXzEwMCwKKwlSRl9DSEFOXzEwNCwKKwlSRl9DSEFOXzEwOCwKKwlSRl9DSEFOXzExMiwKKwlSRl9DSEFOXzExNiwKKwlSRl9DSEFOXzEyMCwKKwlSRl9DSEFOXzEyNCwKKwlSRl9DSEFOXzEyOCwKKwlSRl9DSEFOXzEzMiwKKwlSRl9DSEFOXzEzNiwKKwlSRl9DSEFOXzE0MCwKKworCVJGX0NIQU5fMTQ0LAorCisJLyogNUdIeiBIaWdoIFUtTklJIEJhbmQgKi8KKwlSRl9DSEFOXzE0OSwKKwlSRl9DSEFOXzE1MywKKwlSRl9DSEFOXzE1NywKKwlSRl9DSEFOXzE2MSwKKwlSRl9DSEFOXzE2NSwKKworCS8qIDgwMi4xMXAgKi8KKwlSRl9DSEFOXzE3MCwKKwlSRl9DSEFOXzE3MSwKKwlSRl9DSEFOXzE3MiwKKwlSRl9DSEFOXzE3MywKKwlSRl9DSEFOXzE3NCwKKwlSRl9DSEFOXzE3NSwKKwlSRl9DSEFOXzE3NiwKKwlSRl9DSEFOXzE3NywKKwlSRl9DSEFOXzE3OCwKKwlSRl9DSEFOXzE3OSwKKwlSRl9DSEFOXzE4MCwKKwlSRl9DSEFOXzE4MSwKKwlSRl9DSEFOXzE4MiwKKwlSRl9DSEFOXzE4MywKKwlSRl9DSEFOXzE4NCwKKworCS8qIENIQU5ORUwgQk9OREVEIENIQU5ORUxTICovCisJUkZfQ0hBTl9CT05EXzMsCisJUkZfQ0hBTl9CT05EXzQsCisJUkZfQ0hBTl9CT05EXzUsCisJUkZfQ0hBTl9CT05EXzYsCisJUkZfQ0hBTl9CT05EXzcsCisJUkZfQ0hBTl9CT05EXzgsCisJUkZfQ0hBTl9CT05EXzksCisJUkZfQ0hBTl9CT05EXzEwLAorCVJGX0NIQU5fQk9ORF8xMSwKKwlSRl9DSEFOX0JPTkRfMjQyLCAgICAgICAvKiA0LjlHSHogQmFuZCAqLworCVJGX0NIQU5fQk9ORF8yNDYsCisJUkZfQ0hBTl9CT05EXzI1MCwKKwlSRl9DSEFOX0JPTkRfMjEwLAorCVJGX0NIQU5fQk9ORF8yMTQsCisJUkZfQ0hBTl9CT05EXzM4LCAgICAgICAgLyogNUdIeiBMb3cgJiBNaWQgVS1OSUkgQmFuZCAqLworCVJGX0NIQU5fQk9ORF80MiwKKwlSRl9DSEFOX0JPTkRfNDYsCisJUkZfQ0hBTl9CT05EXzUwLAorCVJGX0NIQU5fQk9ORF81NCwKKwlSRl9DSEFOX0JPTkRfNTgsCisJUkZfQ0hBTl9CT05EXzYyLAorCVJGX0NIQU5fQk9ORF8xMDIsICAgICAgIC8qIDVHSHogTWlkIEJhbmQgLSBFVFNJICYgRkNDICovCisJUkZfQ0hBTl9CT05EXzEwNiwKKwlSRl9DSEFOX0JPTkRfMTEwLAorCVJGX0NIQU5fQk9ORF8xMTQsCisJUkZfQ0hBTl9CT05EXzExOCwKKwlSRl9DSEFOX0JPTkRfMTIyLAorCVJGX0NIQU5fQk9ORF8xMjYsCisJUkZfQ0hBTl9CT05EXzEzMCwKKwlSRl9DSEFOX0JPTkRfMTM0LAorCVJGX0NIQU5fQk9ORF8xMzgsCisKKwlSRl9DSEFOX0JPTkRfMTQyLAorCisJUkZfQ0hBTl9CT05EXzE1MSwgICAgICAgLyogNUdIeiBIaWdoIFUtTklJIEJhbmQgKi8KKwlSRl9DSEFOX0JPTkRfMTU1LAorCVJGX0NIQU5fQk9ORF8xNTksCisJUkZfQ0hBTl9CT05EXzE2MywKKworCU5VTV9SRl9DSEFOTkVMUywKKworCU1JTl8yXzRHSFpfQ0hBTk5FTCA9IFJGX0NIQU5fMSwKKwlNQVhfMl80R0haX0NIQU5ORUwgPSBSRl9DSEFOXzE0LAorCU5VTV8yNEdIWl9DSEFOTkVMUyA9IChNQVhfMl80R0haX0NIQU5ORUwgLSBNSU5fMl80R0haX0NIQU5ORUwgKyAxKSwKKworCU1JTl81R0haX0NIQU5ORUwgPSBSRl9DSEFOXzI0MCwKKwlNQVhfNUdIWl9DSEFOTkVMID0gUkZfQ0hBTl8xODQsCisJTlVNXzVHSFpfQ0hBTk5FTFMgPSAoTUFYXzVHSFpfQ0hBTk5FTCAtIE1JTl81R0haX0NIQU5ORUwgKyAxKSwKKworCU1JTl8yME1IWl9SRl9DSEFOTkVMID0gUkZfQ0hBTl8xLAorCU1BWF8yME1IWl9SRl9DSEFOTkVMID0gUkZfQ0hBTl8xODQsCisJTlVNXzIwTUhaX1JGX0NIQU5ORUxTID0KKwkJKE1BWF8yME1IWl9SRl9DSEFOTkVMIC0gTUlOXzIwTUhaX1JGX0NIQU5ORUwgKyAxKSwKKworCU1JTl80ME1IWl9SRl9DSEFOTkVMID0gUkZfQ0hBTl9CT05EXzMsCisJTUFYXzQwTUhaX1JGX0NIQU5ORUwgPSBSRl9DSEFOX0JPTkRfMTYzLAorCU5VTV80ME1IWl9SRl9DSEFOTkVMUyA9CisJCShNQVhfNDBNSFpfUkZfQ0hBTk5FTCAtIE1JTl80ME1IWl9SRl9DSEFOTkVMICsgMSksCisKKwlNSU5fNV85R0haX0NIQU5ORUwgPSBSRl9DSEFOXzE3MCwKKwlNQVhfNV85R0haX0NIQU5ORUwgPSBSRl9DSEFOXzE4NCwKKworCUlOVkFMSURfUkZfQ0hBTk5FTCA9IDB4QkFELAorCVJGX0NIQU5ORUxfSU5WQUxJRF9NQVhfRklFTEQgPSAweDdGRkZGRkZGCit9IGVSZkNoYW5uZWxzOworCit0eXBlZGVmIGVudW0geworCUNIQU5ORUxfU1RBVEVfRElTQUJMRSwKKwlDSEFOTkVMX1NUQVRFX0VOQUJMRSwKKwlDSEFOTkVMX1NUQVRFX0RGUywKKwlDSEFOTkVMX1NUQVRFX0lOVkFMSUQKK30gQ0hBTk5FTF9TVEFURTsKKwordHlwZWRlZiBpbnQ4X3QgdFBvd2VyZEJtOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgZW5hYmxlZDo0OworCXVpbnQzMl90IGZsYWdzOjI4OworCXRQb3dlcmRCbSBwd3JMaW1pdDsKK30gc1JlZ3VsYXRvcnlDaGFubmVsOworCit0eXBlZGVmIHN0cnVjdCB7CisJc1JlZ3VsYXRvcnlDaGFubmVsIGNoYW5uZWxzW05VTV9SRl9DSEFOTkVMU107Cit9IHNSZWd1bGF0b3J5RG9tYWluOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgdGFyZ2V0RnJlcTsKKwl1aW50MTZfdCBjaGFubmVsTnVtOworfSB0UmZDaGFubmVsUHJvcHM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGNoYW5JZDsKKwl0UG93ZXJkQm0gcHdyOworfSB0Q2hhbm5lbExpc3RXaXRoUG93ZXI7CisKK3R5cGVkZWYgZW51bSB7CisJQ09VTlRSWV9JTklULAorCUNPVU5UUllfSUUsCisJQ09VTlRSWV9VU0VSLAorCUNPVU5UUllfUVVFUlksCisJQ09VTlRSWV9NQVggPSBDT1VOVFJZX1FVRVJZCit9IHZfQ291bnRyeUluZm9Tb3VyY2VfdDsKKworLyoqCisgKiBlbnVtIGNoYW5fd2lkdGg6IGNoYW5uZWwgd2lkdGgKKyAqCisgKiBAQ0hBTl9XSURUSF8wTUhaOiBjaGFubmVsIGRpc2FibGVkIG9yIGludmFsaWQKKyAqIEBDSEFOX1dJRFRIXzVNSFo6IGNoYW5uZWwgd2lkdGggNSBNSFoKKyAqIEBDSEFOX1dJRFRIXzEwTUhaOiBjaGFubmVsIHdpZHRoIDEwIE1IWgorICogQENIQU5fV0lEVEhfMjBNSFo6IGNoYW5uZWwgd2lkdGggMjAgTUhaCisgKiBAQ0hBTl9XSURUSF80ME1IWjogY2hhbm5lbCB3aWR0aCA0MCBNSFoKKyAqIEBDSEFOX1dJRFRIXzgwTUhaOiBjaGFubmVsIHdpZHRoIDgwTUhaCisgKiBAQ0hBTl9XSURUSF8xNjBNSFo6IGNoYW5uZWwgd2lkdGggMTYwIE1IWgorICovCitlbnVtIGNoYW5uZWxfd2lkdGggeworCUNIQU5fV0lEVEhfME1IWiwKKwlDSEFOX1dJRFRIXzVNSFosCisJQ0hBTl9XSURUSF8xME1IWiwKKwlDSEFOX1dJRFRIXzIwTUhaLAorCUNIQU5fV0lEVEhfNDBNSFosCisJQ0hBTl9XSURUSF84ME1IWiwKKwlDSEFOX1dJRFRIXzE2ME1IWgorfTsKKworLyoqCisgKiBAY291bnRyeV9jb2RlX3QgOiB0eXBlZGVmIGZvciBjb3VudHJ5IGNvZGUuIE9uZSBleHRyYQorICogY2hhciBmb3IgaG9sZGluZyBudWxsIGNoYXJhY3RlcgorICovCit0eXBlZGVmIHVpbnQ4X3QgY291bnRyeV9jb2RlX3RbQ0RTX0NPVU5UUllfQ09ERV9MRU4gKyAxXTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXNSZWd1bGF0b3J5RG9tYWluIHJlZ0RvbWFpbnNbUkVHRE9NQUlOX0NPVU5UXTsKKwljb3VudHJ5X2NvZGVfdCBkZWZhdWx0X2NvdW50cnk7Cit9IHRfcmVnX3RhYmxlOworCisKK0NERl9TVEFUVVMgY2RzX2dldF9yZWdfZG9tYWluX2Zyb21fY291bnRyeV9jb2RlKHZfUkVHRE9NQUlOX3QgKnBSZWdEb21haW4sCisJCQkJCQljb25zdCBjb3VudHJ5X2NvZGVfdCBjb3VudHJ5Q29kZSwKKwkJCQkJCXZfQ291bnRyeUluZm9Tb3VyY2VfdCBzb3VyY2UpOworCitDREZfU1RBVFVTIGNkc19yZWFkX2RlZmF1bHRfY291bnRyeShjb3VudHJ5X2NvZGVfdCBkZWZhdWx0X2NvdW50cnkpOworCitDREZfU1RBVFVTIGNkc19nZXRfY2hhbm5lbF9saXN0X3dpdGhfcG93ZXIodENoYW5uZWxMaXN0V2l0aFBvd2VyCisJCQkJCSAgICpwQ2hhbm5lbHMyME1IeiwKKwkJCQkJICAgdWludDhfdCAqcE51bTIwTUh6Q2hhbm5lbHNGb3VuZCwKKwkJCQkJICAgdENoYW5uZWxMaXN0V2l0aFBvd2VyCisJCQkJCSAgICpwQ2hhbm5lbHM0ME1IeiwKKwkJCQkJICAgdWludDhfdCAqcE51bTQwTUh6Q2hhbm5lbHNGb3VuZCk7CisKK0NERl9TVEFUVVMgY2RzX3NldF9yZWdfZG9tYWluKHZvaWQgKmNsaWVudEN0eHQsIHZfUkVHRE9NQUlOX3QgcmVnSWQpOworCitDSEFOTkVMX1NUQVRFIGNkc19nZXRfY2hhbm5lbF9zdGF0ZSh1aW50MzJfdCByZkNoYW5uZWwpOworCisjZGVmaW5lIENEU19JU19ERlNfQ0goY2hhbm5lbCkgKGNkc19nZXRfY2hhbm5lbF9zdGF0ZSgoY2hhbm5lbCkpID09IFwKKwkJCQlDSEFOTkVMX1NUQVRFX0RGUykKKworI2RlZmluZSBDRFNfSVNfUEFTU0lWRV9PUl9ESVNBQkxFX0NIKGNoYW5uZWwpIFwKKyAgICAoY2RzX2dldF9jaGFubmVsX3N0YXRlKChjaGFubmVsKSkgIT0gQ0hBTk5FTF9TVEFURV9FTkFCTEUpCisKKyNkZWZpbmUgQ0RTX01BWF8yNEdIel9DSEFOTkVMX05VTUJFUiBcCisgICAgKHJmX2NoYW5uZWxzW01BWF8yXzRHSFpfQ0hBTk5FTF0uY2hhbm5lbE51bSkKKyNkZWZpbmUgQ0RTX01JTl81R0h6X0NIQU5ORUxfTlVNQkVSICAocmZfY2hhbm5lbHNbUkZfQ0hBTl8zNl0uY2hhbm5lbE51bSkKKyNkZWZpbmUgQ0RTX01BWF81R0h6X0NIQU5ORUxfTlVNQkVSICAocmZfY2hhbm5lbHNbTUFYXzVHSFpfQ0hBTk5FTF0uY2hhbm5lbE51bSkKKworI2RlZmluZSBDRFNfSVNfQ0hBTk5FTF81R0haKGNobk51bSkgXAorCSgoKGNobk51bSkgPj0gQ0RTX01JTl81R0h6X0NIQU5ORUxfTlVNQkVSKSAmJiAoKGNobk51bSkgPD0gQ0RTX01BWF81R0h6X0NIQU5ORUxfTlVNQkVSKSkKKworI2RlZmluZSBDRFNfSVNfQ0hBTk5FTF8yNEdIWihjaG5OdW0pIFwKKwkoKChjaG5OdW0pID4gMCkgJiYgKChjaG5OdW0pIDw9IENEU19NQVhfMjRHSHpfQ0hBTk5FTF9OVU1CRVIpKQorCisjZGVmaW5lIENEU19JU19TQU1FX0JBTkRfQ0hBTk5FTFMoY2gxLCBjaDIpIFwKKwkoY2gxICYmIGNoMiAmJiBcCisJKENEU19JU19DSEFOTkVMXzVHSFooY2gxKSA9PSBDRFNfSVNfQ0hBTk5FTF81R0haKGNoMikpKQorCitDREZfU1RBVFVTIGNkc19yZWd1bGF0b3J5X2luaXQodm9pZCk7CitDREZfU1RBVFVTIGNkc19nZXRfZGZzX3JlZ2lvbih1aW50OF90ICpkZnNfcmVnaW9uKTsKK0NERl9TVEFUVVMgY2RzX3NldF9kZnNfcmVnaW9uKHVpbnQ4X3QgZGZzX3JlZ2lvbik7Citib29sIGNkc19pc19kc3JjX2NoYW5uZWwodWludDE2X3QpOworQ0hBTk5FTF9TVEFURSBjZHNfZ2V0X2JvbmRlZF9jaGFubmVsX3N0YXRlKHVpbnQzMl90IGNoYW5fbnVtLAorCQkJCQkgICBlbnVtIGNoYW5uZWxfd2lkdGggY2hfd2lkdGgpOworZW51bSBjaGFubmVsX3dpZHRoIGNkc19nZXRfbWF4X2NoYW5uZWxfYncodWludDMyX3QgY2hhbl9udW0pOworCisjZW5kaWYgLyogX19DRFNfUkVHX1NFUlZJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZHMvaW5jL2Nkc19yZWdkb21haW4uaCBiL2NvcmUvY2RzL2luYy9jZHNfcmVnZG9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyNjc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RzL2luYy9jZHNfcmVnZG9tYWluLmgKQEAgLTAsMCArMSwxMDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIE5vdGlmaWNhdGlvbnMgYW5kIGxpY2Vuc2VzIGFyZSByZXRhaW5lZCBmb3IgYXR0cmlidXRpb24gcHVycG9zZXMgb25seS4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA2IFNhbSBMZWZmbGVyLCBFcnJubyBDb25zdWx0aW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqIDEuIFRoZSBtYXRlcmlhbHMgY29udGFpbmVkIGhlcmVpbiBhcmUgdW5tb2RpZmllZCBhbmQgYXJlIHVzZWQKKyAqICAgIHVubW9kaWZpZWQuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBOTworICogICAgJydXQVJSQU5UWScnIGRpc2NsYWltZXIgYmVsb3cgKCcnRGlzY2xhaW1lcicnKSwgd2l0aG91dAorICogICAgbW9kaWZpY2F0aW9uLgorICogMy4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYQorICogICAgZGlzY2xhaW1lciBzaW1pbGFyIHRvIHRoZSBEaXNjbGFpbWVyIGJlbG93IGFuZCBhbnkgcmVkaXN0cmlidXRpb24KKyAqICAgIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbiBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIKKyAqICAgIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdCBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICcnQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OSU5GUklOR0VNRU5ULAorICogTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0VTLgorICoKKyAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSByZWd1bGF0b3J5IGRvbWFpbiBwcml2YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAuCisgKgorICovCisKKyNpZm5kZWYgUkVHVUxBVE9SWV9ICisjZGVmaW5lIFJFR1VMQVRPUllfSAorCitlbnVtIHsKKwlDVFJZX0RFQlVHID0gMHgxZmYsICAgICAvKiBkZWJ1ZyBjb3VudHJ5IGNvZGUgKi8KKwlDVFJZX0RFRkFVTFQgPSAwICAgICAgICAvKiBkZWZhdWx0IGNvdW50cnkgY29kZSAqLworfTsKKworI2RlZmluZSBCTUxFTiAyICAgICAgICAgICAgICAgICAvKiBVc2UgMiA2NCBiaXQgdWludCBmb3IgY2hhbm5lbCBiaXRtYXNrICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIHRoZSBtYXN0ZXIgbGlzdCBmb3IgYWxsIGRpZmZlcmVudCBmcmVxZXVuY3kKKyAqIGJhbmRzIHdpdGggdGhlIGNvbXBsZXRlIG1hdHJpeCBvZiBhbGwgcG9zc2libGUgZmxhZ3MgYW5kIHNldHRpbmdzCisgKiBmb3IgZWFjaCBiYW5kIGlmIGl0IGlzIHVzZWQgaW4gQU5ZIHJlZyBkb21haW4uCisgKi8KKworI2RlZmluZSBERUZfUkVHRE1OICAgICAgICAgICAgICBGQ0MzX0ZDQ0EKKyNkZWZpbmUgICAgREVGX0RNTl81ICAgICAgICAgICAgRkNDMQorI2RlZmluZSAgICBERUZfRE1OXzIgICAgICAgICAgICBGQ0NBCisjZGVmaW5lICAgIENPVU5UUllfRVJEX0ZMQUcgICAgIDB4ODAwMAorI2RlZmluZSBXT1JMRFdJREVfUk9BTUlOR19GTEFHICAweDQwMDAKKyNkZWZpbmUgICAgU1VQRVJfRE9NQUlOX01BU0sgICAgMHgwZmZmCisjZGVmaW5lICAgIENPVU5UUllfQ09ERV9NQVNLICAgIDB4M2ZmZgorI2RlZmluZSBDRl9JTlRFUkZFUkVOQ0UgICAgICAgICAoQ0hBTk5FTF9DV19JTlQgfCBDSEFOTkVMX1JBREFSX0lOVCkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVzY3JpYmUgdGhlIGJpdCBtYXNrcyBmb3IgZGlmZmVyZW50IHBhc3NpdmUgc2NhbgorICogY2FwYWJpbGl0eS9yZXF1aXJlbWVudHMgcGVyIHJlZ2RvbWFpbi4KKyAqLworI2RlZmluZSBOT19QU0NBTiAgICAweDBVTEwKKyNkZWZpbmUgUFNDQU5fRkNDICAgMHgwMDAwMDAwMDAwMDAwMDAxVUxMCisjZGVmaW5lIFBTQ0FOX0ZDQ19UIDB4MDAwMDAwMDAwMDAwMDAwMlVMTAorI2RlZmluZSBQU0NBTl9FVFNJICAweDAwMDAwMDAwMDAwMDAwMDRVTEwKKyNkZWZpbmUgUFNDQU5fTUtLMSAgMHgwMDAwMDAwMDAwMDAwMDA4VUxMCisjZGVmaW5lIFBTQ0FOX01LSzIgIDB4MDAwMDAwMDAwMDAwMDAxMFVMTAorI2RlZmluZSBQU0NBTl9NS0tBICAweDAwMDAwMDAwMDAwMDAwMjBVTEwKKyNkZWZpbmUgUFNDQU5fTUtLQV9HICAgIDB4MDAwMDAwMDAwMDAwMDA0MFVMTAorI2RlZmluZSBQU0NBTl9FVFNJQSAweDAwMDAwMDAwMDAwMDAwODBVTEwKKyNkZWZpbmUgUFNDQU5fRVRTSUIgMHgwMDAwMDAwMDAwMDAwMTAwVUxMCisjZGVmaW5lIFBTQ0FOX0VUU0lDIDB4MDAwMDAwMDAwMDAwMDIwMFVMTAorI2RlZmluZSBQU0NBTl9XV1IgICAweDAwMDAwMDAwMDAwMDA0MDBVTEwKKyNkZWZpbmUgUFNDQU5fTUtLQTEgMHgwMDAwMDAwMDAwMDAwODAwVUxMCisjZGVmaW5lIFBTQ0FOX01LS0ExX0cgICAweDAwMDAwMDAwMDAwMDEwMDBVTEwKKyNkZWZpbmUgUFNDQU5fTUtLQTIgMHgwMDAwMDAwMDAwMDAyMDAwVUxMCisjZGVmaW5lIFBTQ0FOX01LS0EyX0cgICAweDAwMDAwMDAwMDAwMDQwMDBVTEwKKyNkZWZpbmUgUFNDQU5fTUtLMyAgMHgwMDAwMDAwMDAwMDA4MDAwVUxMCisjZGVmaW5lIFBTQ0FOX0VYVF9DSEFOICAweDAwMDAwMDAwMDAwMTAwMDBVTEwKKyNkZWZpbmUgUFNDQU5fREVGRVIgMHg3RkZGRkZGRkZGRkZGRkZGVUxMCisjZGVmaW5lIElTX0VDTV9DSEFOIDB4ODAwMDAwMDAwMDAwMDAwMFVMTAorCisvKiBkZWZpbmUgaW4gYWhfZWVwcm9tLmggKi8KKyNkZWZpbmUgU0RfTk9fQ1RMICAgICAgIDB4ZjAKKyNkZWZpbmUgTk9fQ1RMICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgQ1RMX01PREVfTSAgICAgIDB4MGYKKyNkZWZpbmUgQ1RMXzExQSAgICAgICAgIDAKKyNkZWZpbmUgQ1RMXzExQiAgICAgICAgIDEKKyNkZWZpbmUgQ1RMXzExRyAgICAgICAgIDIKKyNkZWZpbmUgQ1RMX1RVUkJPICAgICAgIDMKKyNkZWZpbmUgQ1RMXzEwOEcgICAgICAgIDQKKyNkZWZpbmUgQ1RMXzJHSFQyMCAgICAgIDUKKyNkZWZpbmUgQ1RMXzVHSFQyMCAgICAgIDYKKyNkZWZpbmUgQ1RMXzJHSFQ0MCAgICAgIDcKKyNkZWZpbmUgQ1RMXzVHSFQ0MCAgICAgIDgKKyNkZWZpbmUgQ1RMXzVHVkhUODAgICAgIDkKKworI2lmbmRlZiBBVEhfTk9fNUdfU1VQUE9SVAorI2RlZmluZSBSRUdETU5fTU9ERV8xMUFfVFVSQk8gICAgUkVHRE1OX01PREVfMTA4QQorI2RlZmluZSBDSEFOXzExQV9CTVpFUk8gQk1aRVJPLAorI2RlZmluZSBDSEFOXzExQV9CTShfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pLCBfaiwgX2ssIF9sKSBcCisJQk0oX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaSwgX2osIF9rLCBfbCksCisjZWxzZQorLyogcmVtb3ZlIDExYSBjaGFubmVsIGluZm8gaWYgMTFhIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQ0hBTl8xMUFfQk1aRVJPCisjZGVmaW5lIENIQU5fMTFBX0JNKF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2ksIF9qLCBfaywgX2wpCisjZW5kaWYKKyNpZm5kZWYgQVRIX1JFTU9WRV8yR19UVVJCT19SRF9UQUJMRQorI2RlZmluZSBSRUdETU5fTU9ERV8xMUdfVFVSQk8gICAgUkVHRE1OX01PREVfMTA4RworI2RlZmluZSBDSEFOX1RVUkJPX0dfQk1aRVJPIEJNWkVSTywKKyNkZWZpbmUgQ0hBTl9UVVJCT19HX0JNKF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2ksIF9qLCBfaywgX2wpCVwKKwlCTShfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pLCBfaiwgX2ssIF9sKSwKKyNlbHNlCisvKiByZW1vdmUgdHVyYm8tZyBjaGFubmVsIGluZm8gaWYgdHVyYm8tZyBpcyBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIENIQU5fVFVSQk9fRyhhLCBiKQorI2RlZmluZSBDSEFOX1RVUkJPX0dfQk1aRVJPCisjZGVmaW5lIENIQU5fVFVSQk9fR19CTShfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pLCBfaiwgX2ssIF9sKQorI2VuZGlmCisKKyNkZWZpbmUgQk1MRU4gMiAgICAgICAgICAgICAgICAgLyogVXNlIDIgNjQgYml0IHVpbnQgZm9yIGNoYW5uZWwgYml0bWFzaworCSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5COiBNdXN0IGFncmVlIHdpdGggbWFjcm8gYmVsb3cgKEJNKSAqLworI2RlZmluZSBCTVpFUk8geyh1aW50NjRfdCkgMCwgKHVpbnQ2NF90KSAwfSAvKiBCTUxFTiB6ZXJvcyAqLworCisjaWZuZGVmIFNVUFBSRVNTX1NISUZUX1dBUk5JTkcKKyNkZWZpbmUgU1VQUFJFU1NfU0hJRlRfV0FSTklORworI2VuZGlmCisKKy8qIFN1cHByZXNzIE1TIHdhcm5pbmcgIkM0MjkzOiAnb3BlcmF0b3InIDogc2hpZnQgY291bnQgbmVnYXRpdmUgb3IgdG9vIGJpZywKKyAqIHVuZGVmaW5lZCBiZWhhdmlvciIKKyAqIFRoaXMgaXMgc2FmZSBiZWxvdyBiZWNhdXNlIHRoZSB0aGUgb3BlcmFuZCBpcyBwcm9wZXJseSByYW5nZS1jaGVja2VkLCBidXQKKyAqIHRoZSBjb21waWxlciBjYW4ndCByZWFzb24gdGhhdCBvdXQgYmVmb3JlIGl0IHNwaXRzIHRoZSB3YXJuaW5nLgorICogVXNpbmcgc3VwcHJlc3MsIHNvIHRoZSB3YXJuaW5nIGNhbiBzdGlsbCBiZSBlbmFibGVkIGdsb2JhbGx5IHRvIGNhdGNoIG90aGVyCisgKiBpbmNvcnJlY3QgdXNlcy4KKyAqLworI2RlZmluZSBCTShfZmEsIF9mYiwgX2ZjLCBfZmQsIF9mZSwgX2ZmLCBfZmcsIF9maCwgX2ZpLCBfZmosIF9maywgX2ZsKSBcCisJU1VQUFJFU1NfU0hJRlRfV0FSTklORyBcCisJeygoKChfZmEgPj0gMCkgJiYgKF9mYSA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZhKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmIgPj0gMCkgJiYgKF9mYiA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZiKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmMgPj0gMCkgJiYgKF9mYyA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZjKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmQgPj0gMCkgJiYgKF9mZCA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZkKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmUgPj0gMCkgJiYgKF9mZSA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZlKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmYgPj0gMCkgJiYgKF9mZiA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZmKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmcgPj0gMCkgJiYgKF9mZyA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZnKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmggPj0gMCkgJiYgKF9maCA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZoKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmkgPj0gMCkgJiYgKF9maSA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZpKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmogPj0gMCkgJiYgKF9maiA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZqKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmsgPj0gMCkgJiYgKF9mayA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZrKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAoKChfZmwgPj0gMCkgJiYgKF9mbCA8IDY0KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgX2ZsKSA6ICh1aW50NjRfdCkgMCkgKSBcCisJICwoKCgoKF9mYSA+IDYzKSAmJiAoX2ZhIDwgMTI4KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgKF9mYSAtIDY0KSkgOiAodWludDY0X3QpIDApIHwgXAorCSAgICAoKChfZmIgPiA2MykgJiYgKF9mYiA8IDEyOCkpID8gKCgodWludDY0X3QpIDEpIDw8IChfZmIgLSA2NCkpIDogKHVpbnQ2NF90KSAwKSB8IFwKKwkgICAgKCgoX2ZjID4gNjMpICYmIChfZmMgPCAxMjgpKSA/ICgoKHVpbnQ2NF90KSAxKSA8PCAoX2ZjIC0gNjQpKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAgICgoKF9mZCA+IDYzKSAmJiAoX2ZkIDwgMTI4KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgKF9mZCAtIDY0KSkgOiAodWludDY0X3QpIDApIHwgXAorCSAgICAoKChfZmUgPiA2MykgJiYgKF9mZSA8IDEyOCkpID8gKCgodWludDY0X3QpIDEpIDw8IChfZmUgLSA2NCkpIDogKHVpbnQ2NF90KSAwKSB8IFwKKwkgICAgKCgoX2ZmID4gNjMpICYmIChfZmYgPCAxMjgpKSA/ICgoKHVpbnQ2NF90KSAxKSA8PCAoX2ZmIC0gNjQpKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAgICgoKF9mZyA+IDYzKSAmJiAoX2ZnIDwgMTI4KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgKF9mZyAtIDY0KSkgOiAodWludDY0X3QpIDApIHwgXAorCSAgICAoKChfZmggPiA2MykgJiYgKF9maCA8IDEyOCkpID8gKCgodWludDY0X3QpIDEpIDw8IChfZmggLSA2NCkpIDogKHVpbnQ2NF90KSAwKSB8IFwKKwkgICAgKCgoX2ZpID4gNjMpICYmIChfZmkgPCAxMjgpKSA/ICgoKHVpbnQ2NF90KSAxKSA8PCAoX2ZpIC0gNjQpKSA6ICh1aW50NjRfdCkgMCkgfCBcCisJICAgICgoKF9maiA+IDYzKSAmJiAoX2ZqIDwgMTI4KSkgPyAoKCh1aW50NjRfdCkgMSkgPDwgKF9maiAtIDY0KSkgOiAodWludDY0X3QpIDApIHwgXAorCSAgICAoKChfZmsgPiA2MykgJiYgKF9mayA8IDEyOCkpID8gKCgodWludDY0X3QpIDEpIDw8IChfZmsgLSA2NCkpIDogKHVpbnQ2NF90KSAwKSB8IFwKKwkgICAgKCgoX2ZsID4gNjMpICYmIChfZmwgPCAxMjgpKSA/ICgoKHVpbnQ2NF90KSAxKSA8PCAoX2ZsIC0gNjQpKSA6ICh1aW50NjRfdCkgMCkpKX0KKworLyoKKyAqIFRIRSBmb2xsb3dpbmcgdGFibGUgaXMgdGhlIG1hcHBpbmcgb2YgcmVnZG9tYWluIHBhaXJzIHNwZWNpZmllZCBieQorICogYW4gOCBiaXQgcmVnZG9tYWluIHZhbHVlIHRvIHRoZSBpbmRpdmlkdWFsIHVuaXRhcnkgcmVnIGRvbWFpbnMKKyAqLworCit0eXBlZGVmIHN0cnVjdCByZWdfZG1uX3BhaXJfbWFwcGluZyB7CisJdWludDE2X3QgcmVnRG1uRW51bTsgICAgLyogMTYgYml0IHJlZyBkb21haW4gcGFpciAqLworCXVpbnQxNl90IHJlZ0RtbjVHSHo7ICAgIC8qIDVHSHogcmVnIGRvbWFpbiAqLworCXVpbnQxNl90IHJlZ0RtbjJHSHo7ICAgIC8qIDJHSHogcmVnIGRvbWFpbiAqLworCXVpbnQzMl90IGZsYWdzNUdIejsgICAgIC8qIFJlcXVpcmVtZW50cyBmbGFncyAoQWRIb2MKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdywgbm9pc2UgZmxvb3IgY2FsIG5lZWRlZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBldGMpICovCisJdWludDMyX3QgZmxhZ3MyR0h6OyAgICAgLyogUmVxdWlyZW1lbnRzIGZsYWdzIChBZEhvYworCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93LCBub2lzZSBmbG9vciBjYWwgbmVlZGVkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YykgKi8KKwl1aW50NjRfdCBwc2Nhbk1hc2s7ICAgICAvKiBQYXNzaXZlIFNjYW4gZmxhZ3Mgd2hpY2gKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gb3ZlcnJpZGUgdW5pdGFyeSBkb21haW4KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzaXZlIHNjYW4gZmxhZ3MuICBUaGlzCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgdXNlZCBhcyBhIG1hc2sgb24KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdW5pdGFyeSBmbGFncyAqLworCXVpbnQxNl90IHNpbmdsZUNDOyAgICAgIC8qIENvdW50cnkgY29kZSBvZiBzaW5nbGUgY291bnRyeSBpZgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgb25lLW9uLW9uZSBtYXBwaW5nIGV4aXN0cyAqLworfSBSRUdfRE1OX1BBSVJfTUFQUElORzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IGNvdW50cnlDb2RlOworCXVpbnQxNl90IHJlZ0RtbkVudW07CisJY29uc3QgY2hhciAqaXNvTmFtZTsKKwljb25zdCBjaGFyICpuYW1lOworCXVpbnQxNl90IGFsbG93MTFnIDogMSwgYWxsb3cxMWFUdXJibyA6IDEsIGFsbG93MTFnVHVyYm8gOiAxLCBhbGxvdzExbmcyMCA6IDEsIC8qIEhULTIwIGFsbG93ZWQgaW4gMkdIej8gKi8KKwkJIGFsbG93MTFuZzQwIDogMSwgLyogSFQtNDAgYWxsb3dlZCBpbiAyR0h6PyAqLworCQkgYWxsb3cxMW5hMjAgOiAxLCAvKiBIVC0yMCBhbGxvd2VkIGluIDVHSHo/ICovCisJCSBhbGxvdzExbmE0MCA6IDEsIC8qIEhULTQwIFZIVC00MCBhbGxvd2VkIGluIDVHSHo/ICovCisJCSBhbGxvdzExbmE4MCA6IDE7IC8qIFZIVC04MCBhbGxvd2VkIGluIDVHSHogKi8KKwl1aW50MTZfdCBvdXRkb29yQ2hhblN0YXJ0OworfSBDT1VOVFJZX0NPREVfVE9fRU5VTV9SRDsKKwordHlwZWRlZiBzdHJ1Y3QgUmVnRG1uRnJlcUJhbmQgeworCXVpbnQxNl90IGxvd0NoYW5uZWw7ICAgIC8qIExvdyBjaGFubmVsIGNlbnRlciBpbiBNSHogKi8KKwl1aW50MTZfdCBoaWdoQ2hhbm5lbDsgICAvKiBIaWdoIENoYW5uZWwgY2VudGVyIGluIE1IeiAqLworCXVpbnQ4X3QgcG93ZXJEZnM7ICAgICAgIC8qIE1heCBwb3dlciAoZEJtKSBmb3IgY2hhbm5lbAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIHdoZW4gdXNpbmcgREZTICovCisJdWludDhfdCBhbnRlbm5hTWF4OyAgICAgLyogTWF4IGFsbG93ZWQgYW50ZW5uYSBnYWluICovCisJdWludDhfdCBjaGFubmVsQlc7ICAgICAgLyogQmFuZHdpZHRoIG9mIHRoZSBjaGFubmVsICovCisJdWludDhfdCBjaGFubmVsU2VwOyAgICAgLyogQ2hhbm5lbCBzZXBhcmF0aW9uIHdpdGhpbgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYW5kICovCisJdWludDY0X3QgdXNlRGZzOyAgICAgICAgLyogVXNlIERGUyBpbiB0aGUgUmVnRG9tYWluCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29ycmVzcG9uZGluZyBiaXQgaXMgc2V0ICovCisJdWludDY0X3QgdXNlUGFzc1NjYW47ICAgLyogVXNlIFBhc3NpdmUgU2NhbiBpbiB0aGUgUmVnRG9tYWluCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29ycmVzcG9uZGluZyBiaXQgaXMgc2V0ICovCisJdWludDhfdCByZWdDbGFzc0lkOyAgICAgLyogUmVndWxhdG9yeSBjbGFzcyBpZCAqLworfSBSRUdfRE1OX0ZSRVFfQkFORDsKKwordHlwZWRlZiBzdHJ1Y3QgcmVnX2RvbWFpbiB7CisJdWludDE2X3QgcmVnRG1uRW51bTsgICAgLyogdmFsdWUgZnJvbSBFbnVtUmQgdGFibGUgKi8KKwl1aW50OF90IGNvbmZvcm1hbmNlX3Rlc3RfbGltaXQ7CisJdWludDY0X3QgZGZzTWFzazsgICAgICAgLyogREZTIGJpdG1hc2sgZm9yIDVHaHogdGFibGVzICovCisJdWludDY0X3QgcHNjYW47ICAgICAgICAgLyogQml0bWFzayBmb3IgcGFzc2l2ZSBzY2FuICovCisJdWludDMyX3QgZmxhZ3M7ICAgICAgICAgLyogUmVxdWlyZW1lbnQgZmxhZ3MgKEFkSG9jIGRpc2FsbG93LCBub2lzZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yIGNhbCBuZWVkZWQsIGV0YykgKi8KKwl1aW50NjRfdCBjaGFuMTFhW0JNTEVOXTsgICAgICAgIC8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kIHNlbGVjdGlvbiAqLworCXVpbnQ2NF90IGNoYW4xMWFfdHVyYm9bQk1MRU5dOyAgLyogMTI4IGJpdCBiaXRtYXNrIGZvciBjaGFubmVsL2JhbmQgc2VsZWN0ICovCisJdWludDY0X3QgY2hhbjExYV9keW5fdHVyYm9bQk1MRU5dOyAgICAgIC8qIDEyOCBiaXQgbWFzayBmb3IgY2hhbi9iYW5kIHNlbGVjdCAqLworCisJdWludDY0X3QgY2hhbjExYltCTUxFTl07ICAgICAgICAvKiAxMjggYml0IGJpdG1hc2sgZm9yIGNoYW5uZWwvYmFuZCBzZWxlY3Rpb24gKi8KKwl1aW50NjRfdCBjaGFuMTFnW0JNTEVOXTsgICAgICAgIC8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kIHNlbGVjdGlvbiAqLworCXVpbnQ2NF90IGNoYW4xMWdfdHVyYm9bQk1MRU5dOworfSBSRUdfRE9NQUlOOworCitzdHJ1Y3QgY21vZGUgeworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3QgZmxhZ3M7Cit9OworCisjZGVmaW5lICAgIFlFUyAgICB0cnVlCisjZGVmaW5lICAgIE5PICAgIGZhbHNlCisKKy8qIG1hcHBpbmcgb2Ygb2xkIHNrdXMgdG8gbmV3IHNrdXMgZm9yIEphcGFuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgZG9tYWluOworCXVpbnQxNl90IG5ld2RvbWFpbl9wcmU1MzsgICAgICAgLyogcHJlIGVlcHJvbSB2ZXJzaW9uIDUuMyAqLworCXVpbnQxNl90IG5ld2RvbWFpbl9wb3N0NTM7ICAgICAgLyogcG9zdCBlZXByb20gdmVyc2lvbiA1LjMgKi8KK30gSkFQQU5fU0tVTUFQOworCisvKiBtYXBwaW5nIG9mIGNvdW50cnljb2RlIHRvIG5ldyBza3VzIGZvciBKYXBhbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IGNjb2RlOworCXVpbnQxNl90IG5ld2RvbWFpbl9wcmU1MzsgICAgICAgLyogcHJlIGVlcHJvbSB2ZXJzaW9uIDUuMyAqLworCXVpbnQxNl90IG5ld2RvbWFpbl9wb3N0NTM7ICAgICAgLyogcG9zdCBlZXByb20gdmVyc2lvbiA1LjMgKi8KK30gSkFQQU5fQ09VTlRSWU1BUDsKKworLyogY2hlY2sgcmQgZmxhZ3MgaW4gZWVwcm9tIGZvciBqYXBhbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IGZyZXFiYW5kYml0OworCXVpbnQzMl90IGVlcHJvbWZsYWd0b2NoZWNrOworfSBKQVBBTl9CQU5EQ0hFQ0s7CisKKy8qIENvbW1vbiBtb2RlIHBvd2VyIHRhYmxlIGZvciA1R2h6ICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgbGNoYW47CisJdWludDE2X3QgaGNoYW47CisJdWludDhfdCBwd3Jsdmw7Cit9IENPTU1PTl9NT0RFX1BPV0VSOworCit0eXBlZGVmIGVudW0geworCUNPVU5UUllfQ09ERV9TRVRfQllfQ09SRSwKKwlDT1VOVFJZX0NPREVfU0VUX0JZX0RSSVZFUiwKKwlDT1VOVFJZX0NPREVfU0VUX0JZX1VTRVIKK30gQ09VTlRSWV9DT0RFX1NPVVJDRTsKKworc3RydWN0IHJlZ3VsYXRvcnkgeworCXVpbnQzMl90IHJlZ19kb21haW47CisJdWludDMyX3QgZWVwcm9tX3JkX2V4dDsKKwl1aW50MTZfdCBjb3VudHJ5X2NvZGU7CisJdWludDhfdCBhbHBoYTJbM107CisJdWludDhfdCBkZnNfcmVnaW9uOworCXVpbnQ4X3QgY3RsXzJnOworCXVpbnQ4X3QgY3RsXzVnOworCWNvbnN0IHZvaWQgKnJlZ3BhaXI7CisJQ09VTlRSWV9DT0RFX1NPVVJDRSBjY19zcmM7CisJdWludDMyX3QgcmVnX2ZsYWdzOworfTsKKy8qIE11bHRpLURldmljZSBSZWdEb21haW4gU3VwcG9ydCAqLwordHlwZWRlZiBzdHJ1Y3QgYXRoX2hhbF9yZWdfZG1uX3RhYmxlcyB7CisJLyogcmVnRG9tYWluUGFpcnM6IE1hcCBvZiA4LWJpdCByZWdkb21haW4gdmFsdWVzIHRvIHVuaXRhcnkgcmVnIGRvbWFpbiAqLworCWNvbnN0IFJFR19ETU5fUEFJUl9NQVBQSU5HICpyZWdEb21haW5QYWlyczsKKwkvKiBhbGxDb3VudHJpZXM6IE1hc3RlciBsaXN0IG9mIGZyZXEuIGJhbmRzIChmbGFncywgc2V0dGluZ3MpICovCisJY29uc3QgQ09VTlRSWV9DT0RFX1RPX0VOVU1fUkQgKmFsbENvdW50cmllczsKKwkvKiByZWdEb21haW5zOiBBcnJheSBvZiBzdXBwb3J0ZWQgcmVnIGRvbWFpbnMgKi8KKwljb25zdCBSRUdfRE9NQUlOICpyZWdEb21haW5zOworCisJdWludDE2X3QgcmVnRG9tYWluUGFpcnNDdDsgICAgICAvKiBOdW0gcmVnIGRvbWFpbiBwYWlyIGVudHJpZXMgKi8KKwl1aW50MTZfdCBhbGxDb3VudHJpZXNDdDsgICAgICAgIC8qIE51bSBjb3VudHJ5IGVudHJpZXMgKi8KKwl1aW50MTZfdCByZWdEb21haW5zQ3Q7ICAvKiBOdW0gcmVnIGRvbWFpbiBlbnRyaWVzICovCit9IEhBTF9SRUdfRE1OX1RBQkxFUzsKKworLyoKKyAqIENvdW50cnkvUmVnaW9uIENvZGVzIGZyb20gTVMgV0lOTkxTLkgKKyAqIE51bWJlcmluZyBmcm9tIElTTyAzMTY2CisgKi8KKy8qKiAgICAgQGJyaWVmIGNvdW50cnkgY29kZSBkZWZpbml0aW9ucworICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0RFQlVHCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IERCCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0RFRkFVTFQKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogTkEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQUxCQU5JQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBBTAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9BTEdFUklBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IERaCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMTIKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9BUkdFTlRJTkEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogQVIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAzMgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0FSTUVOSUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogQU0KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA1MQorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0FVU1RSQUxJQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBBVQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDM2CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQVVTVFJBTElBMgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBBVTIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA1MDAwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQVVTVFJJQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBBVAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQVpFUkJBSUpBTgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBBWgorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDMxCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQkFIQU1BUworICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBCUworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQ0CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQkFIUkFJTgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBCSAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQ4CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQkVMQVJVUworICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBCWQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDExMgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0JFTEdJVU0KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogQkUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA1NgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0JFTElaRQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBCWgorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDg0CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQkVSTVVEQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBCTQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDYwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQk9MSVZJQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBCTworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDY4CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQk9TTklBX0hFUlpFR09XSU5BCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IDcwCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogQkEKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9CUkFaSUwKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogQlIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA3NgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0JSVU5FSV9EQVJVU1NBTEFNCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEJOCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogOTYKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9CVUxHQVJJQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBCRworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDEwMAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0NBTkFEQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBDQQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDEyNAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0NBTkFEQTIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogQ0EyCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNTAwMQorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0NISUxFCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IENMCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMTUyCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQ0hJTkEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogQ04KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAxNTIKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9DT0xPTUJJQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBDTworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDE3MAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0NPU1RBX1JJQ0EKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogQ1IKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAxOTEKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9DUk9BVElBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEhSCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMTkxCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQ1lQUlVTCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IENZCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMTk2CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfQ1pFQ0gKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogQ1oKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAyMDMKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9ERU5NQVJLCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IERLCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMjA4CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfRE9NSU5JQ0FOX1JFUFVCTElDCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IERPCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMjE0CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfRUNVQURPUgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBFQworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDIxOAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0VHWVBUCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEVHCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogODE4CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfRUxfU0FMVkFET1IKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogU1YKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAyMjIKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9FU1RPTklBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEVFCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMjMzCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfRkFFUk9FX0lTTEFORFMKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogRk8KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAyMzQKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9GSU5MQU5ECisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEZJCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMjQ2CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfRlJBTkNFCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEZSCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMjUwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfRlJBTkNFMgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBGMgorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDI1NQorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0dFT1JHSUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogR0UKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAyNjgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9HRVJNQU5ZCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IERFCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMjc2CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfR1JFRUNFCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEdSCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMzAwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfR1VBVEVNQUxBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEdUCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMzIwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSE9ORFVSQVMKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSE4KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAzNDAKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9IT05HX0tPTkcKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSEsKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAzNDQKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9IVU5HQVJZCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEhVCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMzQ4CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSUNFTEFORAorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBJUworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDM1MgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0lORElBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IElOCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMzU2CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSU5ET05FU0lBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IElECisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMzYwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSVJBTgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBJUgorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDM2NAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0lSQVEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSVEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAzNjgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9JUkVMQU5ECisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IElFCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMzcyCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSVNSQUVMCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IElMCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMzc2CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSVRBTFkKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSVQKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAzODAKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQU1BSUNBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpNCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMzg4CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAzOTIKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAxCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMzkzCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4yCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMgorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDM5NAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMworICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDMKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAzOTUKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjQKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlA0CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMzk2CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU41CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQNQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDM5NworICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFONgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDYKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAzOTkKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjcKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlA3CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAwNworICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOOAorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDgKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDA4CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU45CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQOQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMDkKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjEwCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMTAKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDEwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4xMQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDExCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAxMQorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMTIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAxMgorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMTIKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjEzCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMTMKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDEzCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4xNAorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDE0CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAxNAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMTUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAxNQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMTUKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjE2CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMTYKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDE2CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4xNworICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDE3CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAxNworICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMTgKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAxOAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMTgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjE5CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMTkKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDE5CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4yMAorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDIwCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAyMAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMjEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAyMQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMjEKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjIyCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMjIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDIyCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4yMworICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDIzCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAyMworICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMjQKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAyNAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMjQKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjI1CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMjUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDI1CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4yNgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDI2CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAyNgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMjcKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAyNworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMjcKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjI4CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMjgKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDI4CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4yOQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDI5CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAyOQorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMzAKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAzMAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMzAKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjMxCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMzEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDMxCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4zMgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDMyCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAzMgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMzMKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAzMworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMzMKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjM0CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMzQKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDM0CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4zNQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDM1CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAzNQorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMzYKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAzNgorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMzYKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjM3CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQMzcKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDM3CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU4zOAorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDM4CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDAzOAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFOMzkKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlAzOQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMzkKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjQwCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQNDAKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDQwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU40MQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDQxCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDA0MQorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFONDIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlA0MgorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwNDIKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjQzCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQNDMKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDQzCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU40NAorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDQ0CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDA0NAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFONDUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlA0NQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwNDUKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjQ2CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQNDYKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDQ2CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU40NworICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDQ3CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDA0NworICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFONDgKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlA0OAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwNDgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjQ5CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQNDkKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDQ5CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU41MAorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDUwCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDA1MAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFONTEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlA1MQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwNTEKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjUyCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQNTIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDUyCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU41MworICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDUzCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDA1MworICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pBUEFONTQKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogSlA1NAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwNTQKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9KQVBBTjU1CisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEpQNTUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MDU1CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfSkFQQU41NgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKUDU2CisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDA1NgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0pPUkRBTgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBKTworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwMAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0tBWkFLSFNUQU4KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogS1oKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiAzOTgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9LRU5ZQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBLRQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQwNAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0tPUkVBX05PUlRICisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEtQCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDA4CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfS09SRUFfUk9DCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEtSCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDEwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfS09SRUFfUk9DMgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBLUjIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MTEKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9LT1JFQV9ST0MzCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEtSMworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQxMgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0tVV0FJVAorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBLVworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQxNAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0xBVFZJQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBMVgorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQyOAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0xFQkFOT04KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogTEIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MjIKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9MSUJZQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBMWQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQzNAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX0xJRUNIVEVOU1RFSU4KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogTEkKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0MzgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9MSVRIVUFOSUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogTFQKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0NDAKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9MVVhFTUJPVVJHCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IExVCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDQyCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfTUFDQVUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogTU8KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA0NDYKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9NQUNFRE9OSUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogTUsKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA4MDcKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9NQUxBWVNJQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBNWQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDQ1OAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX01BTFRBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IE1UCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDcwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfTUFVUklUSVVTCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IE1VCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDgwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfTUVYSUNPCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IE1YCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDg0CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfTU9OQUNPCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IE1DCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDkyCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfTU9ST0NDTworICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBNQQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDUwNAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX05FVEhFUkxBTkRTCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IE5MCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNTI4CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfTkVXX1pFQUxBTkQKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogTloKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA1NTQKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9OSUNBUkFHVUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogTkkKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA1NTgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9OT1JXQVkKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogTk8KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA1NzgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9PTUFOCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IE9NCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNTEyCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfUEFLSVNUQU4KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogUEsKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA1ODYKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9QQU5BTUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogUEEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA1OTEKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9QQVJBR1VBWQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBQWQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDYwMAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1BFUlUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogUEUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA2MDQKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9QSElMSVBQSU5FUworICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBQSAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDYwOAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1BPTEFORAorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBQTAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDYxNgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1BPUlRVR0FMCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IFBUCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNjIwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfUFVFUlRPX1JJQ08KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogUFIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA2MzAKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9RQVRBUgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBRQQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDYzNAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1JPTUFOSUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogUk8KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA2NDIKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9SVVNTSUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogUlUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA2NDMKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9TQVVESV9BUkFCSUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogU0EKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA2ODIKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9TRVJCSUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogUlMKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA2ODgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9NT05URU5FR1JPCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IE1FCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNDk5CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfU0lOR0FQT1JFCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IFNHCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNzAyCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfU0xPVkFLSUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogU0sKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA3MDMKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9TTE9WRU5JQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBTSQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDcwNQorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1NPVVRIX0FGUklDQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBaQQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDcxMAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1NQQUlOCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IEVTCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNzI0CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfU1JJX0xBTktBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IExLCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogMTQ0CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfU1dFREVOCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IFNFCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNzUyCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfU1dJVFpFUkxBTkQKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogQ0gKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA3NTYKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9TWVJJQQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBTWQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDc2MAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1RBSVdBTgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBUVworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDE1OAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1RBTlpBTklBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IFRaCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogODM0CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfVEhBSUxBTkQKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogVEgKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA3NjQKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9UUklOSURBRF9ZX1RPQkFHTworICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBUVAorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDc4MAorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1RVTklTSUEKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogVE4KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA3ODgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9UVVJLRVkKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogVFIKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA3OTIKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9VQUUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogQUUKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA3ODQKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9VS1JBSU5FCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IFVBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogODA0CisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfVU5JVEVEX0tJTkdET00KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogR0IKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA4MjYKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9VTklURURfU1RBVEVTCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IFVTCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogODQwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfVU5JVEVEX1NUQVRFU19GQ0M0OQorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBVUworICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDg0MgorICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1VSVUdVQVkKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogVVkKKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA4NTgKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9VWkJFS0lTVEFOCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IFVaCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogODYwCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfVkVORVpVRUxBCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IFZFCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogODYyCisgKiAgICAgICAgLSBjb3VudHJ5IGRlZmluaXRpb246IENUUllfVklFVF9OQU0KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IHN0cmluZzogVk4KKyAqICAgICAgICAgICAgLSBjb3VudHJ5IElEOiA3MDQKKyAqICAgICAgICAtIGNvdW50cnkgZGVmaW5pdGlvbjogQ1RSWV9ZRU1FTgorICogICAgICAgICAgICAtIGNvdW50cnkgc3RyaW5nOiBZRQorICogICAgICAgICAgICAtIGNvdW50cnkgSUQ6IDg4NworICogICAgICAgIC0gY291bnRyeSBkZWZpbml0aW9uOiBDVFJZX1pJTUJBQldFCisgKiAgICAgICAgICAgIC0gY291bnRyeSBzdHJpbmc6IFpXCisgKiAgICAgICAgICAgIC0gY291bnRyeSBJRDogNzE2CisgKi8KK2VudW0gQ291bnRyeUNvZGUgeworCUNUUllfQUxCQU5JQSA9IDgsICAgICAgIC8qIEFsYmFuaWEgKi8KKwlDVFJZX0FMR0VSSUEgPSAxMiwgICAgICAvKiBBbGdlcmlhICovCisJQ1RSWV9BUkdFTlRJTkEgPSAzMiwgICAgLyogQXJnZW50aW5hICovCisJQ1RSWV9BUk1FTklBID0gNTEsICAgICAgLyogQXJtZW5pYSAqLworCUNUUllfQVVTVFJBTElBID0gMzYsICAgIC8qIEF1c3RyYWxpYSAqLworCUNUUllfQVVTVFJJQSA9IDQwLCAgICAgIC8qIEF1c3RyaWEgKi8KKwlDVFJZX0FaRVJCQUlKQU4gPSAzMSwgICAvKiBBemVyYmFpamFuICovCisJQ1RSWV9CQUhBTUFTID0gNDQsICAgICAgLyogQmFoYW1hcyAqLworCUNUUllfQkFIUkFJTiA9IDQ4LCAgICAgIC8qIEJhaHJhaW4gKi8KKwlDVFJZX0JBTkdMQURFU0ggPSA1MCwgICAvKiBCYW5nbGFkZXNoICovCisJQ1RSWV9CQVJCQURPUyA9IDUyLCAgICAgLyogQmFyYmFkb3MgKi8KKwlDVFJZX0JFTEFSVVMgPSAxMTIsICAgICAvKiBCZWxhcnVzICovCisJQ1RSWV9CRUxHSVVNID0gNTYsICAgICAgLyogQmVsZ2l1bSAqLworCUNUUllfQkVMSVpFID0gODQsICAgICAgIC8qIEJlbGl6ZSAqLworCUNUUllfQkVSTVVEQSA9IDYwLCAgICAgIC8qIEJlcnVtdWRhICovCisJQ1RSWV9CT0xJVklBID0gNjgsICAgICAgLyogQm9saXZpYSAqLworCUNUUllfQk9TTklBX0hFUlogPSA3MCwgIC8qIEJvc25pYSBhbmQgSGVyemVnb3dpbmEgKi8KKwlDVFJZX0JSQVpJTCA9IDc2LCAgICAgICAvKiBCcmF6aWwgKi8KKwlDVFJZX0JSVU5FSV9EQVJVU1NBTEFNID0gOTYsICAgIC8qIEJydW5laSBEYXJ1c3NhbGFtICovCisJQ1RSWV9CVUxHQVJJQSA9IDEwMCwgICAgLyogQnVsZ2FyaWEgKi8KKwlDVFJZX0NBTUJPRElBID0gMTE2LCAgICAvKiBDYW1ib2RpYSAqLworCUNUUllfQ0FOQURBID0gMTI0LCAgICAgIC8qIENhbmFkYSAqLworCUNUUllfQ0hJTEUgPSAxNTIsICAgICAgIC8qIENoaWxlICovCisJQ1RSWV9DSElOQSA9IDE1NiwgICAgICAgLyogUGVvcGxlJ3MgUmVwdWJsaWMgb2YgQ2hpbmEgKi8KKwlDVFJZX0NPTE9NQklBID0gMTcwLCAgICAvKiBDb2xvbWJpYSAqLworCUNUUllfQ09TVEFfUklDQSA9IDE4OCwgIC8qIENvc3RhIFJpY2EgKi8KKwlDVFJZX0NST0FUSUEgPSAxOTEsICAgICAvKiBDcm9hdGlhICovCisJQ1RSWV9DWVBSVVMgPSAxOTYsCisJQ1RSWV9DWkVDSCA9IDIwMywgICAgICAgLyogQ3plY2ggUmVwdWJsaWMgKi8KKwlDVFJZX0RFTk1BUksgPSAyMDgsICAgICAvKiBEZW5tYXJrICovCisJQ1RSWV9ET01JTklDQU5fUkVQVUJMSUMgPSAyMTQsICAvKiBEb21pbmljYW4gUmVwdWJsaWMgKi8KKwlDVFJZX0VDVUFET1IgPSAyMTgsICAgICAvKiBFY3VhZG9yICovCisJQ1RSWV9FR1lQVCA9IDgxOCwgICAgICAgLyogRWd5cHQgKi8KKwlDVFJZX0VMX1NBTFZBRE9SID0gMjIyLCAvKiBFbCBTYWx2YWRvciAqLworCUNUUllfRVNUT05JQSA9IDIzMywgICAgIC8qIEVzdG9uaWEgKi8KKwlDVFJZX0ZBRVJPRV9JU0xBTkRTID0gMjM0LCAgICAgIC8qIEZhZXJvZSBJc2xhbmRzICovCisJQ1RSWV9GSU5MQU5EID0gMjQ2LCAgICAgLyogRmlubGFuZCAqLworCUNUUllfRlJBTkNFID0gMjUwLCAgICAgIC8qIEZyYW5jZSAqLworCUNUUllfR0VPUkdJQSA9IDI2OCwgICAgIC8qIEdlb3JnaWEgKi8KKwlDVFJZX0dFUk1BTlkgPSAyNzYsICAgICAvKiBHZXJtYW55ICovCisJQ1RSWV9HUkVFQ0UgPSAzMDAsICAgICAgLyogR3JlZWNlICovCisJQ1RSWV9HUkVFTkxBTkQgPSAzMDQsICAgLyogR3JlZW5sYW5kICovCisJQ1RSWV9HUkVOQURBID0gMzA4LCAgICAgLyogR3JlbmFkYSAqLworCUNUUllfR1VBTSA9IDMxNiwgICAgICAgIC8qIEd1YW0gKi8KKwlDVFJZX0dVQVRFTUFMQSA9IDMyMCwgICAvKiBHdWF0ZW1hbGEgKi8KKwlDVFJZX0hBSVRJID0gMzMyLCAgICAgICAvKiBIYWl0aSAqLworCUNUUllfSE9ORFVSQVMgPSAzNDAsICAgIC8qIEhvbmR1cmFzICovCisJQ1RSWV9IT05HX0tPTkcgPSAzNDQsICAgLyogSG9uZyBLb25nIFMuQS5SLiwgUC5SLkMuICovCisJQ1RSWV9IVU5HQVJZID0gMzQ4LCAgICAgLyogSHVuZ2FyeSAqLworCUNUUllfSUNFTEFORCA9IDM1MiwgICAgIC8qIEljZWxhbmQgKi8KKwlDVFJZX0lORElBID0gMzU2LCAgICAgICAvKiBJbmRpYSAqLworCUNUUllfSU5ET05FU0lBID0gMzYwLCAgIC8qIEluZG9uZXNpYSAqLworCUNUUllfSVJBTiA9IDM2NCwgICAgICAgIC8qIElyYW4gKi8KKwlDVFJZX0lSQVEgPSAzNjgsICAgICAgICAvKiBJcmFxICovCisJQ1RSWV9JUkVMQU5EID0gMzcyLCAgICAgLyogSXJlbGFuZCAqLworCUNUUllfSVNSQUVMID0gMzc2LCAgICAgIC8qIElzcmFlbCAqLworCUNUUllfSVRBTFkgPSAzODAsICAgICAgIC8qIEl0YWx5ICovCisJQ1RSWV9KQU1BSUNBID0gMzg4LCAgICAgLyogSmFtYWljYSAqLworCUNUUllfSkFQQU4gPSAzOTIsICAgICAgIC8qIEphcGFuICovCisJQ1RSWV9KT1JEQU4gPSA0MDAsICAgICAgLyogSm9yZGFuICovCisJQ1RSWV9LQVpBS0hTVEFOID0gMzk4LCAgLyogS2F6YWtoc3RhbiAqLworCUNUUllfS0VOWUEgPSA0MDQsICAgICAgIC8qIEtlbnlhICovCisJQ1RSWV9LT1JFQV9OT1JUSCA9IDQwOCwgLyogTm9ydGggS29yZWEgKi8KKwlDVFJZX0tPUkVBX1JPQyA9IDQxMCwgICAvKiBTb3V0aCBLb3JlYSAqLworCUNUUllfS09SRUFfUk9DMyA9IDQxMiwgIC8qIFNvdXRoIEtvcmVhICovCisJQ1RSWV9LVVdBSVQgPSA0MTQsICAgICAgLyogS3V3YWl0ICovCisJQ1RSWV9MQVRWSUEgPSA0MjgsICAgICAgLyogTGF0dmlhICovCisJQ1RSWV9MRUJBTk9OID0gNDIyLCAgICAgLyogTGViYW5vbiAqLworCUNUUllfTElCWUEgPSA0MzQsICAgICAgIC8qIExpYnlhICovCisJQ1RSWV9MSUVDSFRFTlNURUlOID0gNDM4LCAgICAgICAvKiBMaWVjaHRlbnN0ZWluICovCisJQ1RSWV9MSVRIVUFOSUEgPSA0NDAsICAgLyogTGl0aHVhbmlhICovCisJQ1RSWV9MVVhFTUJPVVJHID0gNDQyLCAgLyogTHV4ZW1ib3VyZyAqLworCUNUUllfTUFDQVUgPSA0NDYsICAgICAgIC8qIE1hY2F1IFNBUiAqLworCUNUUllfTUFDRURPTklBID0gODA3LCAgIC8qIHRoZSBGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhICovCisJQ1RSWV9NQUxBWVNJQSA9IDQ1OCwgICAgLyogTWFsYXlzaWEgKi8KKwlDVFJZX01BTERJVkVTID0gNDYyLCAgICAvKiBNYWxkaXZlcyAqLworCUNUUllfTUFMVEEgPSA0NzAsICAgICAgIC8qIE1hbHRhICovCisJQ1RSWV9NQVVSSVRJVVMgPSA0ODAsICAgLyogTWF1cml0aXVzICovCisJQ1RSWV9NRVhJQ08gPSA0ODQsICAgICAgLyogTWV4aWNvICovCisJQ1RSWV9NT05BQ08gPSA0OTIsICAgICAgLyogUHJpbmNpcGFsaXR5IG9mIE1vbmFjbyAqLworCUNUUllfTU9ST0NDTyA9IDUwNCwgICAgIC8qIE1vcm9jY28gKi8KKwlDVFJZX05FUEFMID0gNTI0LCAgICAgICAvKiBOZXBhbCAqLworCUNUUllfTkVUSEVSTEFORFMgPSA1MjgsIC8qIE5ldGhlcmxhbmRzICovCisJQ1RSWV9ORVRIRVJMQU5EU19BTlRJTExFUyA9IDUzMCwgICAgICAgIC8qIE5ldGhlcmxhbmRzLUFudGlsbGVzICovCisJQ1RSWV9BUlVCQSA9IDUzMywgICAgICAgLyogQXJ1YmEgKi8KKwlDVFJZX05FV19aRUFMQU5EID0gNTU0LCAvKiBOZXcgWmVhbGFuZCAqLworCUNUUllfTklDQVJBR1VBID0gNTU4LCAgIC8qIE5pY2FyYWd1YSAqLworCUNUUllfTk9SV0FZID0gNTc4LCAgICAgIC8qIE5vcndheSAqLworCUNUUllfT01BTiA9IDUxMiwgICAgICAgIC8qIE9tYW4gKi8KKwlDVFJZX1BBS0lTVEFOID0gNTg2LCAgICAvKiBJc2xhbWljIFJlcHVibGljIG9mIFBha2lzdGFuICovCisJQ1RSWV9QQU5BTUEgPSA1OTEsICAgICAgLyogUGFuYW1hICovCisJQ1RSWV9QQVBVQV9ORVdfR1VJTkVBID0gNTk4LCAgICAvKiBQYXB1YSBOZXcgR3VpbmVhICovCisJQ1RSWV9QQVJBR1VBWSA9IDYwMCwgICAgLyogUGFyYWd1YXkgKi8KKwlDVFJZX1BFUlUgPSA2MDQsICAgICAgICAvKiBQZXJ1ICovCisJQ1RSWV9QSElMSVBQSU5FUyA9IDYwOCwgLyogUmVwdWJsaWMgb2YgdGhlIFBoaWxpcHBpbmVzICovCisJQ1RSWV9QT0xBTkQgPSA2MTYsICAgICAgLyogUG9sYW5kICovCisJQ1RSWV9QT1JUVUdBTCA9IDYyMCwgICAgLyogUG9ydHVnYWwgKi8KKwlDVFJZX1BVRVJUT19SSUNPID0gNjMwLCAvKiBQdWVydG8gUmljbyAqLworCUNUUllfUUFUQVIgPSA2MzQsICAgICAgIC8qIFFhdGFyICovCisJQ1RSWV9ST01BTklBID0gNjQyLCAgICAgLyogUm9tYW5pYSAqLworCUNUUllfUlVTU0lBID0gNjQzLCAgICAgIC8qIFJ1c3NpYSAqLworCUNUUllfUldBTkRBID0gNjQ2LCAgICAgIC8qIFJ3YW5kYSAqLworCUNUUllfU0FVRElfQVJBQklBID0gNjgyLCAgICAgICAgLyogU2F1ZGkgQXJhYmlhICovCisJQ1RSWV9TRVJCSUEgPSA2ODgsICAgICAgLyogUmVwdWJsaWMgb2YgU2VyYmlhICovCisJQ1RSWV9NT05URU5FR1JPID0gNDk5LCAgLyogTW9udGVuZWdybyAqLworCUNUUllfU0lOR0FQT1JFID0gNzAyLCAgIC8qIFNpbmdhcG9yZSAqLworCUNUUllfU0xPVkFLSUEgPSA3MDMsICAgIC8qIFNsb3ZhayBSZXB1YmxpYyAqLworCUNUUllfU0xPVkVOSUEgPSA3MDUsICAgIC8qIFNsb3ZlbmlhICovCisJQ1RSWV9TT1VUSF9BRlJJQ0EgPSA3MTAsICAgICAgICAvKiBTb3V0aCBBZnJpY2EgKi8KKwlDVFJZX1NQQUlOID0gNzI0LCAgICAgICAvKiBTcGFpbiAqLworCUNUUllfU1JJX0xBTktBID0gMTQ0LCAgIC8qIFNyaSBMYW5rYSAqLworCUNUUllfU1dFREVOID0gNzUyLCAgICAgIC8qIFN3ZWRlbiAqLworCUNUUllfU1dJVFpFUkxBTkQgPSA3NTYsIC8qIFN3aXR6ZXJsYW5kICovCisJQ1RSWV9TWVJJQSA9IDc2MCwgICAgICAgLyogU3lyaWEgKi8KKwlDVFJZX1RBSVdBTiA9IDE1OCwgICAgICAvKiBUYWl3YW4gKi8KKwlDVFJZX1RBTlpBTklBID0gODM0LCAgICAvKiBUYW56YW5pYSAqLworCUNUUllfVEhBSUxBTkQgPSA3NjQsICAgIC8qIFRoYWlsYW5kICovCisJQ1RSWV9UUklOSURBRF9ZX1RPQkFHTyA9IDc4MCwgICAvKiBUcmluaWRhZCB5IFRvYmFnbyAqLworCUNUUllfVFVOSVNJQSA9IDc4OCwgICAgIC8qIFR1bmlzaWEgKi8KKwlDVFJZX1RVUktFWSA9IDc5MiwgICAgICAvKiBUdXJrZXkgKi8KKwlDVFJZX1VBRSA9IDc4NCwgICAgICAgICAvKiBVLkEuRS4gKi8KKwlDVFJZX1VHQU5EQSA9IDgwMCwgICAgICAvKiBVZ2FuZGEgKi8KKwlDVFJZX1VLUkFJTkUgPSA4MDQsICAgICAvKiBVa3JhaW5lICovCisJQ1RSWV9VTklURURfS0lOR0RPTSA9IDgyNiwgICAgICAvKiBVbml0ZWQgS2luZ2RvbSAqLworCUNUUllfVU5JVEVEX1NUQVRFUyA9IDg0MCwgICAgICAgLyogVW5pdGVkIFN0YXRlcyAqLworCUNUUllfVU5JVEVEX1NUQVRFUzIgPSA4NDEsICAgICAgLyogVW5pdGVkIFN0YXRlcyBmb3IgQVAgKi8KKwlDVFJZX1VOSVRFRF9TVEFURVNfRkNDNDkgPSA4NDIsIC8qIFVuaXRlZCBTdGF0ZXMgKFB1YmxpYyBTYWZldHkpICovCisJQ1RSWV9VUlVHVUFZID0gODU4LCAgICAgLyogVXJ1Z3VheSAqLworCUNUUllfVVpCRUtJU1RBTiA9IDg2MCwgIC8qIFV6YmVraXN0YW4gKi8KKwlDVFJZX1ZFTkVaVUVMQSA9IDg2MiwgICAvKiBWZW5lenVlbGEgKi8KKwlDVFJZX1ZJRVRfTkFNID0gNzA0LCAgICAvKiBWaWV0IE5hbSAqLworCUNUUllfWUVNRU4gPSA4ODcsICAgICAgIC8qIFllbWVuICovCisJQ1RSWV9aSU1CQUJXRSA9IDcxNiwgICAgLyogWmltYmFid2UgKi8KKworCS8qCisJKiogSmFwYW4gc3BlY2lhbCBjb2Rlcy4gIEJveSwgZG8gdGhleSBoYXZlIGEgbG90CisJKi8KKworCUNUUllfSkFQQU4xID0gMzkzLCAgICAgIC8qIEphcGFuIChKUDEpICovCisJQ1RSWV9KQVBBTjIgPSAzOTQsICAgICAgLyogSmFwYW4gKEpQMCkgKi8KKwlDVFJZX0pBUEFOMyA9IDM5NSwgICAgICAvKiBKYXBhbiAoSlAxLTEpICovCisJQ1RSWV9KQVBBTjQgPSAzOTYsICAgICAgLyogSmFwYW4gKEpFMSkgKi8KKwlDVFJZX0pBUEFONSA9IDM5NywgICAgICAvKiBKYXBhbiAoSkUyKSAqLworCUNUUllfSkFQQU42ID0gNDAwNiwgICAgIC8qIEphcGFuIChKUDYpICovCisJQ1RSWV9KQVBBTjcgPSA0MDA3LCAgICAgLyogSmFwYW4gKEo3KSAqLworCUNUUllfSkFQQU44ID0gNDAwOCwgICAgIC8qIEphcGFuIChKOCkgKi8KKwlDVFJZX0pBUEFOOSA9IDQwMDksICAgICAvKiBKYXBhbiAoSjkpICovCisJQ1RSWV9KQVBBTjEwID0gNDAxMCwgICAgLyogSmFwYW4gKEoxMCkgKi8KKwlDVFJZX0pBUEFOMTEgPSA0MDExLCAgICAvKiBKYXBhbiAoSjExKSAqLworCUNUUllfSkFQQU4xMiA9IDQwMTIsICAgIC8qIEphcGFuIChKMTIpICovCisJQ1RSWV9KQVBBTjEzID0gNDAxMywgICAgLyogSmFwYW4gKEoxMykgKi8KKwlDVFJZX0pBUEFOMTQgPSA0MDE0LCAgICAvKiBKYXBhbiAoSjE0KSAqLworCUNUUllfSkFQQU4xNSA9IDQwMTUsICAgIC8qIEphcGFuIChKMTUpICovCisJQ1RSWV9KQVBBTjE2ID0gNDAxNiwgICAgLyogSmFwYW4gKEoxNikgKi8KKwlDVFJZX0pBUEFOMTcgPSA0MDE3LCAgICAvKiBKYXBhbiAoSjE3KSAqLworCUNUUllfSkFQQU4xOCA9IDQwMTgsICAgIC8qIEphcGFuIChKMTgpICovCisJQ1RSWV9KQVBBTjE5ID0gNDAxOSwgICAgLyogSmFwYW4gKEoxOSkgKi8KKwlDVFJZX0pBUEFOMjAgPSA0MDIwLCAgICAvKiBKYXBhbiAoSjIwKSAqLworCUNUUllfSkFQQU4yMSA9IDQwMjEsICAgIC8qIEphcGFuIChKMjEpICovCisJQ1RSWV9KQVBBTjIyID0gNDAyMiwgICAgLyogSmFwYW4gKEoyMikgKi8KKwlDVFJZX0pBUEFOMjMgPSA0MDIzLCAgICAvKiBKYXBhbiAoSjIzKSAqLworCUNUUllfSkFQQU4yNCA9IDQwMjQsICAgIC8qIEphcGFuIChKMjQpICovCisJQ1RSWV9KQVBBTjI1ID0gNDAyNSwgICAgLyogSmFwYW4gKEoyNSkgKi8KKwlDVFJZX0pBUEFOMjYgPSA0MDI2LCAgICAvKiBKYXBhbiAoSjI2KSAqLworCUNUUllfSkFQQU4yNyA9IDQwMjcsICAgIC8qIEphcGFuIChKMjcpICovCisJQ1RSWV9KQVBBTjI4ID0gNDAyOCwgICAgLyogSmFwYW4gKEoyOCkgKi8KKwlDVFJZX0pBUEFOMjkgPSA0MDI5LCAgICAvKiBKYXBhbiAoSjI5KSAqLworCUNUUllfSkFQQU4zMCA9IDQwMzAsICAgIC8qIEphcGFuIChKMzApICovCisJQ1RSWV9KQVBBTjMxID0gNDAzMSwgICAgLyogSmFwYW4gKEozMSkgKi8KKwlDVFJZX0pBUEFOMzIgPSA0MDMyLCAgICAvKiBKYXBhbiAoSjMyKSAqLworCUNUUllfSkFQQU4zMyA9IDQwMzMsICAgIC8qIEphcGFuIChKMzMpICovCisJQ1RSWV9KQVBBTjM0ID0gNDAzNCwgICAgLyogSmFwYW4gKEozNCkgKi8KKwlDVFJZX0pBUEFOMzUgPSA0MDM1LCAgICAvKiBKYXBhbiAoSjM1KSAqLworCUNUUllfSkFQQU4zNiA9IDQwMzYsICAgIC8qIEphcGFuIChKMzYpICovCisJQ1RSWV9KQVBBTjM3ID0gNDAzNywgICAgLyogSmFwYW4gKEozNykgKi8KKwlDVFJZX0pBUEFOMzggPSA0MDM4LCAgICAvKiBKYXBhbiAoSjM4KSAqLworCUNUUllfSkFQQU4zOSA9IDQwMzksICAgIC8qIEphcGFuIChKMzkpICovCisJQ1RSWV9KQVBBTjQwID0gNDA0MCwgICAgLyogSmFwYW4gKEo0MCkgKi8KKwlDVFJZX0pBUEFONDEgPSA0MDQxLCAgICAvKiBKYXBhbiAoSjQxKSAqLworCUNUUllfSkFQQU40MiA9IDQwNDIsICAgIC8qIEphcGFuIChKNDIpICovCisJQ1RSWV9KQVBBTjQzID0gNDA0MywgICAgLyogSmFwYW4gKEo0MykgKi8KKwlDVFJZX0pBUEFONDQgPSA0MDQ0LCAgICAvKiBKYXBhbiAoSjQ0KSAqLworCUNUUllfSkFQQU40NSA9IDQwNDUsICAgIC8qIEphcGFuIChKNDUpICovCisJQ1RSWV9KQVBBTjQ2ID0gNDA0NiwgICAgLyogSmFwYW4gKEo0NikgKi8KKwlDVFJZX0pBUEFONDcgPSA0MDQ3LCAgICAvKiBKYXBhbiAoSjQ3KSAqLworCUNUUllfSkFQQU40OCA9IDQwNDgsICAgIC8qIEphcGFuIChKNDgpICovCisJQ1RSWV9KQVBBTjQ5ID0gNDA0OSwgICAgLyogSmFwYW4gKEo0OSkgKi8KKwlDVFJZX0pBUEFONTAgPSA0MDUwLCAgICAvKiBKYXBhbiAoSjUwKSAqLworCUNUUllfSkFQQU41MSA9IDQwNTEsICAgIC8qIEphcGFuIChKNTEpICovCisJQ1RSWV9KQVBBTjUyID0gNDA1MiwgICAgLyogSmFwYW4gKEo1MikgKi8KKwlDVFJZX0pBUEFONTMgPSA0MDUzLCAgICAvKiBKYXBhbiAoSjUzKSAqLworCUNUUllfSkFQQU41NCA9IDQwNTQsICAgIC8qIEphcGFuIChKNTQpICovCisJQ1RSWV9KQVBBTjU1ID0gNDA1NSwgICAgLyogSmFwYW4gKEo1NSkgKi8KKwlDVFJZX0pBUEFONTYgPSA0MDU2LCAgICAvKiBKYXBhbiAoSjU2KSAqLworCUNUUllfSkFQQU41NyA9IDQwNTcsICAgIC8qIEphcGFuIChKNTcpICovCisJQ1RSWV9KQVBBTjU4ID0gNDA1OCwgICAgLyogSmFwYW4gKEo1OCkgKi8KKwlDVFJZX0pBUEFONTkgPSA0MDU5LCAgICAvKiBKYXBhbiAoSjU5KSAqLworCisJLyoKKwkqKiAiU3BlY2lhbCIgY29kZXMgZm9yIG11bHRpcGx5IGRlZmluZWQgY291bnRyaWVzLCB3aXRoIHRoZSBleGNlcHRpb24KKwkqKiBvZiBKYXBhbiBhbmQgVVMuCisJKi8KKworCUNUUllfQVVTVFJBTElBMiA9IDUwMDAsIC8qIEF1c3RyYWxpYSBmb3IgQVAgb25seSAqLworCUNUUllfQ0FOQURBMiA9IDUwMDEsICAgIC8qIENhbmFkYSBmb3IgQVAgb25seSAqLworCUNUUllfQkVMR0lVTTIgPSA1MDAyICAgIC8qIEJlbGdpdW0vQ2lzY28gaW1wbGVtZW50YXRpb24gKi8KK307CisKK2ludDMyX3QgY2RzX2ZpbGxfc29tZV9yZWd1bGF0b3J5X2luZm8oc3RydWN0IHJlZ3VsYXRvcnkgKnJlZyk7Cit2b2lkIGNkc19maWxsX2FuZF9zZW5kX2N0bF90b19mdyhzdHJ1Y3QgcmVndWxhdG9yeSAqcmVnKTsKK2ludDMyX3QgY2RzX2dldF9jb3VudHJ5X2Zyb21fYWxwaGEyKHVpbnQ4X3QgKmFscGhhMik7Cit2b2lkIGNkc19maWxsX3NlbmRfY3RsX2luZm9fdG9fZncoc3RydWN0IHJlZ3VsYXRvcnkgKnJlZywgdWludDMyX3QgbW9kZXNBdmFpbCwKKwkJCQkgIHVpbnQzMl90IG1vZGVTZWxlY3QpOwordm9pZCBjZHNfc2V0X3dtYV9kZnNfcmVnaW9uKHN0cnVjdCByZWd1bGF0b3J5ICpyZWcpOworCisjZW5kaWYgLyogUkVHVUxBVE9SWV9IICovCmRpZmYgLS1naXQgYS9jb3JlL2Nkcy9pbmMvY2RzX3JlZ2RvbWFpbl9jb21tb24uaCBiL2NvcmUvY2RzL2luYy9jZHNfcmVnZG9tYWluX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZWFmNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9pbmMvY2RzX3JlZ2RvbWFpbl9jb21tb24uaApAQCAtMCwwICsxLDIyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwOSBTYW0gTGVmZmxlciwgRXJybm8gQ29uc3VsdGluZworICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKiAkRnJlZUJTRDogcmVsZWFzZS85LjAuMC9zeXMvZGV2L2F0aC9hdGhfaGFsL2FoX3JlZ2RvbWFpbi9haF9yZF9yZWdlbnVtLmggMjI0MjI2IDIwMTEtMDctMjAgMTI6NDY6NThaIGFkcmlhbiAkCisgKi8KKy8qCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgY29tbW9uIHJlZ3VsYXRvcnkgZG9tYWluIGRhdGFiYXNlIHRhYmxlczoKKyAqCisgKiAgICAgLSByZWcgZG9tYWluIGVudW0gY29uc3RhbnRzCisgKiAgICAgLSByZWcgZG9tYWluIGVudW0gdG8gcmVnIGRvbWFpbiBwYWlyIG1hcHBpbmdzCisgKiAgICAgLSBjb3VudHJ5IHRvIHJlZ2RvbWFpbiBtYXBwaW5ncworICogICAgIC0gY2hhbm5lbCB0YWcgZW51bXMgYW5kIHRoZSBmcmVxdWVuY3ktdG8tZnJlcXVlbmN5IGJhbmQgbWFwcGluZ3MKKyAqICAgICAgIGZvciBhbGwgdGhlIG1vZGVzCisgKgorICogIlRoZSBjb3VudHJ5IHRhYmxlIGFuZCByZXNwZWN0aXZlIFJlZ3VsYXRvcnkgRG9tYWluIGNoYW5uZWwgYW5kIHBvd2VyCisgKiBzZXR0aW5ncyBhcmUgYmFzZWQgb24gYXZhaWxhYmxlIGtub3dsZWRnZSBhcyBvZiBzb2Z0d2FyZSByZWxlYXNlLiBUaGUKKyAqIHVuZGVybHlpbmcgZ2xvYmFsIHJlZ3VsYXRvcnkgYW5kIHNwZWN0cnVtIHJ1bGVzIGNoYW5nZSBvbiBhIHJlZ3VsYXIgYmFzaXMsCisgKiB0aGVyZWZvcmUsIG5vIHdhcnJhbnR5IGlzIGdpdmVuIHRoYXQgdGhlIGNoYW5uZWwgYW5kIHBvd2VyIGluZm9ybWF0aW9uCisgKiBoZXJlaW4gaXMgY29tcGxldGUsIGFjY3VyYXRlIG9yIHVwIHRvIGRhdGUuICBEZXZlbG9wZXJzIGFyZSByZXNwb25zaWJsZQorICogZm9yIHJlZ3VsYXRvcnkgY29tcGxpYW5jZSBvZiBlbmQtcHJvZHVjdHMgZGV2ZWxvcGVkIHVzaW5nIHRoZSBlbmNsb3NlZAorICogZGF0YSBwZXIgYWxsIGFwcGxpY2FibGUgbmF0aW9uYWwgcmVxdWlyZW1lbnRzLiAgRnVydGhlcm1vcmUsIGRhdGEgaW4gdGhpcworICogdGFibGUgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgc3BlY3RydW0gaXMgYXZhaWxhYmxlIGFuZCB0aGF0IHJlZ3VsYXRvcnkKKyAqIGFwcHJvdmFsIGlzIHBvc3NpYmxlIGluIGV2ZXJ5IGNhc2UuIEtub3dsZGVnYWJsZSByZWd1bGF0b3J5IGNvbXBsaWFuY2UKKyAqIG9yIGdvdmVybm1lbnQgY29udGFjdHMgc2hvdWxkIGJlIGNvbnN1bHRlZCBieSB0aGUgbWFudWZhY3R1cmVyIHRvIGVuc3VyZQorICogdGhhdCB0aGUgbW9zdCBjdXJyZW50IGFuZCBhY2N1cmF0ZSBzZXR0aW5ncyBhcmUgdXNlZCBpbiBlYWNoIGVuZC1wcm9kdWN0LgorICogVGhpcyB0YWJsZSB3YXMgZGVzaWduZWQgc28gdGhhdCBkZXZlbG9wZXJzIGFyZSBhYmxlIHRvIHVwZGF0ZSB0aGUgY291bnRyeQorICogdGFibGUgbWFwcGluZ3MgYXMgd2VsbCBhcyB0aGUgUmVndWxhdG9yeSBEb21haW4gZGVmaW5pdGlvbnMgaW4gb3JkZXIgdG8KKyAqIGluY29ycG9yYXRlIHRoZSBtb3N0IGN1cnJlbnQgY2hhbm5lbCBhbmQgcG93ZXIgc2V0dGluZ3MgaW4gdGhlIGVuZC1wcm9kdWN0LiIKKyAqCisgKi8KKworLyogRW51bWVyYXRlZCBSZWd1bGF0b3J5IERvbWFpbiBJbmZvcm1hdGlvbiA4IGJpdCB2YWx1ZXMgaW5kaWNhdGUgdGhhdAorICogdGhlIHJlZ2RvbWFpbiBpcyByZWFsbHkgYSBwYWlyIG9mIHVuaXRhcnkgcmVnZG9tYWlucy4gIDEyIGJpdCB2YWx1ZXMKKyAqIGFyZSB0aGUgcmVhbCB1bml0YXJ5IHJlZ2RvbWFpbnMgYW5kIGFyZSB0aGUgb25seSBvbmVzIHdoaWNoIGhhdmUgdGhlCisgKiBmcmVxdWVuY3kgYml0bWFza3MgYW5kIGZsYWdzIHNldC4KKyAqLworCisjaW5jbHVkZSAiY2RzX2llZWU4MDIxMV9jb21tb24uaCIKKyNpbmNsdWRlIDxhX3R5cGVzLmg+CisjaW5jbHVkZSAid2xhbl9kZWZzLmgiCisKKyNkZWZpbmUgTUFYX0NIQU5ORUxTX1BFUl9PUEVSQVRJTkdfQ0xBU1MgIDI1CisKK2VudW0gRW51bVJkIHsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgcmVndWxhdG9yeSBkb21haW4gZGVmaW5pdGlvbnMgYXJlCisJICogZm91bmQgaW4gdGhlIEVFUFJPTS4gRWFjaCByZWd1bGF0b3J5IGRvbWFpbgorCSAqIGNhbiBvcGVyYXRlIGluIGVpdGhlciBhIDVHSHogb3IgMi40R0h6IHdpcmVsZXNzIG1vZGUgb3IKKwkgKiBib3RoIDVHSHogYW5kIDIuNEdIeiB3aXJlbGVzcyBtb2Rlcy4KKwkgKiBJbiBnZW5lcmFsLCB0aGUgdmFsdWUgaG9sZHMgbm8gc3BlY2lhbAorCSAqIG1lYW5pbmcgYW5kIGlzIHVzZWQgdG8gZGVjb2RlIGludG8gZWl0aGVyIHNwZWNpZmljCisJICogMi40R0h6IG9yIDVHSHogd2lyZWxlc3MgbW9kZSBmb3IgdGhhdCBwYXJ0aWN1bGFyCisJICogcmVndWxhdG9yeSBkb21haW4uCisJICovCisJTk9fRU5VTVJEID0gMHgwMCwKKwlOVUxMMV9XT1JMRCA9IDB4MDMsICAgICAvKiBGb3IgMTFiLW9ubHkgY291bnRyaWVzIChubyAxMWEgYWxsb3dlZCkgKi8KKwlOVUxMMV9FVFNJQiA9IDB4MDcsICAgICAvKiBJc3JhZWwgKi8KKwlOVUxMMV9FVFNJQyA9IDB4MDgsCisJRkNDMV9GQ0NBID0gMHgxMCwgICAgICAgLyogVVNBICovCisJRkNDMV9XT1JMRCA9IDB4MTEsICAgICAgLyogSG9uZyBLb25nICovCisJRkNDNF9GQ0NBID0gMHgxMiwgICAgICAgLyogVVNBIC0gUHVibGljIFNhZmV0eSAqLworCUZDQzVfRkNDQSA9IDB4MTMsICAgICAgIC8qIFVTIHdpdGggbm8gREZTIChVTklJLTEgKyBVTklJLTMgT25seSkgKi8KKwlGQ0M2X0ZDQ0EgPSAweDE0LCAgICAgICAvKiBDYW5hZGEgZm9yIEFQIG9ubHkgKi8KKworCUZDQzJfRkNDQSA9IDB4MjAsICAgICAgIC8qIENhbmFkYSAqLworCUZDQzJfV09STEQgPSAweDIxLCAgICAgIC8qIEF1c3RyYWxpYSAmIEhLICovCisJRkNDMl9FVFNJQyA9IDB4MjIsCisJRkNDNl9XT1JMRCA9IDB4MjMsICAgICAgLyogQXVzdHJhbGlhIGZvciBBUCBvbmx5ICovCisJRlJBTkNFX1JFUyA9IDB4MzEsICAgICAgLyogTGVnYWN5IEZyYW5jZSBmb3IgT0VNICovCisJRkNDM19GQ0NBID0gMHgzQSwgICAgICAgLyogVVNBICYgQ2FuYWRhIHcvNTQ3MCBiYW5kLCAxMWgsIERGUyBlbmFibGVkICovCisJRkNDM19XT1JMRCA9IDB4M0IsICAgICAgLyogVVNBICYgQ2FuYWRhIHcvNTQ3MCBiYW5kLCAxMWgsIERGUyBlbmFibGVkICovCisJRkNDM19FVFNJQyA9IDB4M0YsICAgICAgLyogTmV3IFplYWxhbmQsIERGUyBlbmFibGVkICovCisKKwlFVFNJMV9XT1JMRCA9IDB4MzcsCisJRVRTSTNfRVRTSUEgPSAweDMyLCAgICAgLyogRnJhbmNlIChvcHRpb25hbCkgKi8KKwlFVFNJMl9XT1JMRCA9IDB4MzUsICAgICAvKiBIdW5nYXJ5ICYgb3RoZXJzICovCisJRVRTSTNfV09STEQgPSAweDM2LCAgICAgLyogRnJhbmNlICYgb3RoZXJzICovCisJRVRTSTRfV09STEQgPSAweDMwLAorCUVUU0k0X0VUU0lDID0gMHgzOCwKKwlFVFNJNV9XT1JMRCA9IDB4MzksCisJRVRTSTZfV09STEQgPSAweDM0LCAgICAgLyogQnVsZ2FyaWEgKi8KKwlFVFNJOF9XT1JMRCA9IDB4M0QsICAgICAvKiBSdXNzaWEgKi8KKwlFVFNJOV9XT1JMRCA9IDB4M0UsICAgICAvKiBVa3JhaW5lICovCisJRVRTSV9SRVNFUlZFRCA9IDB4MzMsICAgLyogUmVzZXJ2ZWQgKERvIG5vdCB1c2VkKSAqLworCisJTUtLMV9NS0tBID0gMHg0MCwgICAgICAgLyogSmFwYW4gKEpQMSkgKi8KKwlNS0sxX01LS0IgPSAweDQxLCAgICAgICAvKiBKYXBhbiAoSlAwKSAqLworCUFQTDRfV09STEQgPSAweDQyLCAgICAgIC8qIFNpbmdhcG9yZSBhbmQgTW9yb2NjbyAqLworCU1LSzJfTUtLQSA9IDB4NDMsICAgICAgIC8qIEphcGFuIHdpdGggNC45RyBjaGFubmVscyAqLworCUFQTF9SRVNFUlZFRCA9IDB4NDQsICAgIC8qIFJlc2VydmVkIChEbyBub3QgdXNlZCkgICovCisJQVBMMl9XT1JMRCA9IDB4NDUsICAgICAgLyogS29yZWEgKi8KKwlBUEwyX0FQTEMgPSAweDQ2LAorCUFQTDNfV09STEQgPSAweDQ3LAorCU1LSzFfRkNDQSA9IDB4NDgsICAgICAgIC8qIEphcGFuIChKUDEtMSkgKi8KKwlBUEwyX0FQTEQgPSAweDQ5LCAgICAgICAvKiBLb3JlYSB3aXRoIDIuM0cgY2hhbm5lbHMgKi8KKwlNS0sxX01LS0ExID0gMHg0QSwgICAgICAvKiBKYXBhbiAoSkUxKSAqLworCU1LSzFfTUtLQTIgPSAweDRCLCAgICAgIC8qIEphcGFuIChKRTIpICovCisJTUtLMV9NS0tDID0gMHg0QywgICAgICAgLyogSmFwYW4gKE1LSzFfTUtLQSxleGNlcHQgQ2gxNCkgKi8KKwlBUEwyX0ZDQ0EgPSAweDRELCAgICAgICAvKiBNb2JpbGUgY3VzdG9tZXIgKi8KKwlBUEwxMV9GQ0NBID0gMHg0RiwgICAgICAvKiBTcGVjaWZpYyBBUCBDdXN0b21lciA1R0h6LCBGb3IgQVBzIE9ubHkgKi8KKworCUFQTDNfRkNDQSA9IDB4NTAsCisJQVBMMTJfV09STEQgPSAweDUxLAorCUFQTDFfV09STEQgPSAweDUyLCAgICAgIC8qIExhdGluIEFtZXJpY2EgKi8KKwlBUEwxX0ZDQ0EgPSAweDUzLAorCUFQTDFfQVBMQSA9IDB4NTQsCisJQVBMMV9FVFNJQyA9IDB4NTUsCisJQVBMMl9FVFNJQyA9IDB4NTYsICAgICAgLyogVmVuZXp1ZWxhICovCisJQVBMNV9XT1JMRCA9IDB4NTgsICAgICAgLyogQ2hpbGUgKi8KKwlBUEwxM19XT1JMRCA9IDB4NUEsICAgICAvKiBBbGdlcmlhICovCisJQVBMNl9XT1JMRCA9IDB4NUIsICAgICAgLyogU2luZ2Fwb3JlICovCisJQVBMN19GQ0NBID0gMHg1QywgICAgICAgLyogVGFpd2FuIDUuNDcgQmFuZCAqLworCUFQTDhfV09STEQgPSAweDVELCAgICAgIC8qIE1hbGF5c2lhIDVHSHogKi8KKwlBUEw5X01LS0MgPSAweDVFLCAgICAgIC8qIEtvcmVhIDVHSHosIEJlZm9yZSAxMS8yMDA3LiBOb3cgdXNlZCBvbmx5IGJ5IEFQcyAqLworCUFQTDEwX01LS0MgPSAweDVGLCAgICAgLyogS29yZWEgNUdIeiwgQWZ0ZXIgMTEvMjAwNy4gRm9yIFNUQXMgb25seSAqLworCisJLyoKKwkgKiBXb3JsZCBtb2RlIFNLVXMKKwkgKi8KKwlXT1IwX1dPUkxEID0gMHg2MCwgICAgICAvKiBXb3JsZDAgKFdPMCBTS1UpICovCisJV09SMV9XT1JMRCA9IDB4NjEsICAgICAgLyogV29ybGQxIChXTzEgU0tVKSAqLworCVdPUjJfV09STEQgPSAweDYyLCAgICAgIC8qIFdvcmxkMiAoV08yIFNLVSkgKi8KKwlXT1IzX1dPUkxEID0gMHg2MywgICAgICAvKiBXb3JsZDMgKFdPMyBTS1UpICovCisJV09SNF9XT1JMRCA9IDB4NjQsICAgICAgLyogV29ybGQ0IChXTzQgU0tVKSAqLworCVdPUjVfRVRTSUMgPSAweDY1LCAgICAgIC8qIFdvcmxkNSAoV081IFNLVSkgKi8KKworCVdPUjAxX1dPUkxEID0gMHg2NiwgICAgIC8qIFdvcmxkMC0xIChXVzAtMSBTS1UpICovCisJV09SMDJfV09STEQgPSAweDY3LCAgICAgLyogV29ybGQwLTIgKFdXMC0yIFNLVSkgKi8KKwlFVTFfV09STEQgPSAweDY4LCAgICAgICAvKiBTYW1lIGFzIFdvcmxkMC0yIChXVzAtMiBTS1UpLCBleGNlcHQgYWN0aXZlIHNjYW4gY2gxLTEzLiBObyBjaDE0ICovCisKKwlXT1I5X1dPUkxEID0gMHg2OSwgICAgICAvKiBXb3JsZDkgKFdPOSBTS1UpICovCisJV09SQV9XT1JMRCA9IDB4NkEsICAgICAgLyogV29ybGRBIChXT0EgU0tVKSAqLworCVdPUkJfV09STEQgPSAweDZCLCAgICAgIC8qIFdvcmxkQiAoV09CIFNLVSkgKi8KKwlXT1JDX1dPUkxEID0gMHg2QywgICAgICAvKiBXb3JsZEMgKFdPQyBTS1UpICovCisKKwlNS0szX01LS0IgPSAweDgwLCAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgTUtLQiAqLworCU1LSzNfTUtLQTIgPSAweDgxLCAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBNS0tBMiAqLworCU1LSzNfTUtLQyA9IDB4ODIsICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBNS0tDICovCisKKwlNS0s0X01LS0IgPSAweDgzLCAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNS0tCICovCisJTUtLNF9NS0tBMiA9IDB4ODQsICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTUtLQTIgKi8KKwlNS0s0X01LS0MgPSAweDg1LCAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNS0tDICovCisKKwlNS0s1X01LS0IgPSAweDg2LCAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0IgKi8KKwlNS0s1X01LS0EyID0gMHg4NywgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0EyICovCisJTUtLNV9NS0tDID0gMHg4OCwgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKyBNS0tDICovCisJTUtLNV9GQ0NBID0gMHg5QSwKKworCU1LSzZfTUtLQiA9IDB4ODksICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgTUtLQiAqLworCU1LSzZfTUtLQTIgPSAweDhBLCAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBNS0tBMiAqLworCU1LSzZfTUtLQyA9IDB4OEIsICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBNS0tDICovCisKKwlNS0s3X01LS0IgPSAweDhDLCAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tCICovCisJTUtLN19NS0tBMiA9IDB4OEQsICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTUtLQTIgKi8KKwlNS0s3X01LS0MgPSAweDhFLCAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tDICovCisKKwlNS0s4X01LS0IgPSAweDhGLCAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0IgKi8KKwlNS0s4X01LS0EyID0gMHg5MCwgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0EyICovCisJTUtLOF9NS0tDID0gMHg5MSwgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgbWlkLWJhbmQgKyBNS0tDICovCisKKwlNS0sxNF9NS0tBMSA9IDB4OTIsICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgNC45R0h6ICsgTUtLQTEgKi8KKwlNS0sxNV9NS0tBMSA9IDB4OTMsICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyA0LjlHSHogKyBNS0tBMSAqLworCisJTUtLMTBfRkNDQSA9IDB4RDAsICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgNC45R0h6ICsgRkNDQSAqLworCU1LSzEwX01LS0ExID0gMHhEMSwgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOUdIeiArIE1LS0ExICovCisJTUtLMTBfTUtLQyA9IDB4RDIsICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgNC45R0h6ICsgTUtLQyAqLworCU1LSzEwX01LS0EyID0gMHhEMywgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOUdIeiArIE1LS0EyICovCisKKwlNS0sxMV9NS0tBID0gMHhENCwgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIDQuOUdIeiArIE1LS0EgKi8KKwlNS0sxMV9GQ0NBID0gMHhENSwgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIDQuOUdIeiArIEZDQ0EgKi8KKwlNS0sxMV9NS0tBMSA9IDB4RDYsICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIDQuOUdIeiArIE1LS0ExICovCisJTUtLMTFfTUtLQyA9IDB4RDcsICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKyA0LjlHSHogKyBNS0tDICovCisJTUtLMTFfTUtLQTIgPSAweEQ4LCAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKyA0LjlHSHogKyBNS0tBMiAqLworCisJTUtLMTJfTUtLQSA9IDB4RDksICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgbWlkLWJhbmQgKyA0LjlHSHogKyBNS0tBICovCisJTUtLMTJfRkNDQSA9IDB4REEsICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgbWlkLWJhbmQgKyA0LjlHSHogKyBGQ0NBICovCisJTUtLMTJfTUtLQTEgPSAweERCLCAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgbWlkLWJhbmQgKyA0LjlHSHogKyBNS0tBMSAqLworCU1LSzEyX01LS0MgPSAweERDLCAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIG1pZC1iYW5kICsgNC45R0h6ICsgTUtLQyAqLworCU1LSzEyX01LS0EyID0gMHhERCwgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIG1pZC1iYW5kICsgNC45R0h6ICsgTUtLQTIgKi8KKworCU1LSzEzX01LS0IgPSAweERFLCAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIG1pZC1iYW5kICsgTUtLQiArIEFsbCBwYXNzaXZlICsgbm8gYWRob2MgKi8KKworCS8qIEZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgdXNlZCBvbmx5IGJ5IHMvdyB0byBtYXAgb2xkCisJICogSmFwYW4gU0tVcy4KKwkgKi8KKwlNS0szX01LS0EgPSAweEYwLCAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgTUtLQSAqLworCU1LSzNfTUtLQTEgPSAweEYxLCAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBNS0tBMSAqLworCU1LSzNfRkNDQSA9IDB4RjIsICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBGQ0NBICovCisJTUtLNF9NS0tBID0gMHhGMywgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTUtLQSAqLworCU1LSzRfTUtLQTEgPSAweEY0LCAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1LS0ExICovCisJTUtLNF9GQ0NBID0gMHhGNSwgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgRkNDQSAqLworCU1LSzlfTUtLQSA9IDB4RjYsICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKi8KKwlNS0sxMF9NS0tBID0gMHhGNywgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjlHSHogKi8KKwlNS0s2X01LS0ExID0gMHhGOCwgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tBMSAqLworCU1LSzZfRkNDQSA9IDB4RjksICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIEZDQ0EgKi8KKwlNS0s3X01LS0ExID0gMHhGQSwgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tBMSAqLworCU1LSzdfRkNDQSA9IDB4RkIsICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIEZDQ0EgKi8KKwlNS0s5X0ZDQ0EgPSAweEZDLCAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgNC45R0h6ICsgRkNDQSAqLworCU1LSzlfTUtLQTEgPSAweEZELCAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKyBNS0tBMSAqLworCU1LSzlfTUtLQyA9IDB4RkUsICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKyBNS0tDICovCisJTUtLOV9NS0tBMiA9IDB4RkYsICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIDQuOUdIeiArIE1LS0EyICovCisKKwkvKgorCSAqIFJlZ3VsYXRvciBkb21haW5zIGVuZGluZyBpbiBhIG51bWJlciAoZS5nLiBBUEwxLAorCSAqIE1LMSwgRVRTSTQsIGV0YykgYXBwbHkgdG8gNUdIeiBjaGFubmVsIGFuZCBwb3dlcgorCSAqIGluZm9ybWF0aW9uLiAgUmVndWxhdG9yIGRvbWFpbnMgZW5kaW5nIGluIGEgbGV0dGVyCisJICogKGUuZy4gQVBMQSwgRkNDQSwgZXRjKSBhcHBseSB0byAyLjRHSHogY2hhbm5lbCBhbmQKKwkgKiBwb3dlciBpbmZvcm1hdGlvbi4KKwkgKi8KKwlBUEwxID0gMHgwMTUwLCAgICAgICAgICAvKiBMQVQgJiBBc2lhICovCisJQVBMMiA9IDB4MDI1MCwgICAgICAgICAgLyogTEFUICYgQXNpYSAqLworCUFQTDMgPSAweDAzNTAsICAgICAgICAgIC8qIFRhaXdhbiAqLworCUFQTDQgPSAweDA0NTAsICAgICAgICAgIC8qIEpvcmRhbiAqLworCUFQTDUgPSAweDA1NTAsICAgICAgICAgIC8qIENoaWxlICovCisJQVBMNiA9IDB4MDY1MCwgICAgICAgICAgLyogU2luZ2Fwb3JlICovCisJQVBMNyA9IDB4MDc1MCwgICAgICAgICAgLyogVGFpd2FuLCBkaXNhYmxlIGNoNTIgKi8KKwlBUEw4ID0gMHgwODUwLCAgICAgICAgICAvKiBNYWxheXNpYSAqLworCUFQTDkgPSAweDA5NTAsICAgICAgICAgIC8qIEtvcmVhLiBCZWZvcmUgMTEvMjAwNy4gTm93IHVzZWQgb25seSBieSBBUHMgKi8KKwlBUEwxMCA9IDB4MTA1MCwgICAgICAgICAvKiBLb3JlYS4gQWZ0ZXIgMTEvMjAwNy4gRm9yIFNUQXMgb25seSAqLworCUFQTDExID0gMHgxMTUwLCAgICAgICAgIC8qIFNwZWNpZmljIEFQIEN1c3RvbWVyIDVHSHosIEZvciBBUHMgT25seSAqLworCUFQTDEyID0gMHgxMTYwLCAgICAgICAgIC8qIEtlbnlhICovCisKKwlFVFNJMSA9IDB4MDEzMCwgICAgICAgICAvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJMiA9IDB4MDIzMCwgICAgICAgICAvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJMyA9IDB4MDMzMCwgICAgICAgICAvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJNCA9IDB4MDQzMCwgICAgICAgICAvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJNSA9IDB4MDUzMCwgICAgICAgICAvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJNiA9IDB4MDYzMCwgICAgICAgICAvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJOCA9IDB4MDgzMCwgICAgICAgICAvKiBSdXNzaWEgKi8KKwlFVFNJOSA9IDB4MDkzMCwgICAgICAgICAvKiBVa3JhaW5lICovCisJRVRTSUEgPSAweDBBMzAsICAgICAgICAgLyogRnJhbmNlICovCisJRVRTSUIgPSAweDBCMzAsICAgICAgICAgLyogSXNyYWVsICovCisJRVRTSUMgPSAweDBDMzAsICAgICAgICAgLyogTGF0aW4gQW1lcmljYSAqLworCisJRkNDMSA9IDB4MDExMCwgICAgICAgICAgLyogVVMgJiBvdGhlcnMgKi8KKwlGQ0MyID0gMHgwMTIwLCAgICAgICAgICAvKiBDYW5hZGEsIEF1c3RyYWxpYSAmIE5ldyBaZWFsYW5kICovCisJRkNDMyA9IDB4MDE2MCwgICAgICAgICAgLyogVVMgdy9uZXcgbWlkZGxlIGJhbmQgJiBERlMgKi8KKwlGQ0M0ID0gMHgwMTY1LCAgICAgICAgICAvKiBVUyBQdWJsaWMgU2FmZXR5ICovCisJRkNDNSA9IDB4MDUxMCwKKwlGQ0M2ID0gMHgwNjEwLCAgICAgICAgICAvKiBDYW5hZGEgJiBBdXN0cmFsaWEgKi8KKwlGQ0NBID0gMHgwQTEwLAorCisJQVBMRCA9IDB4MEQ1MCwgICAgICAgICAgLyogU291dGggS29yZWEgKi8KKworCU1LSzEgPSAweDAxNDAsICAgICAgICAgIC8qIEphcGFuIChVTkktMSBvZGQpICovCisJTUtLMiA9IDB4MDI0MCwgICAgICAgICAgLyogSmFwYW4gKDQuOSBHSHogKyBVTkktMSBvZGQpICovCisJTUtLMyA9IDB4MDM0MCwgICAgICAgICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4pICovCisJTUtLNCA9IDB4MDQ0MCwgICAgICAgICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMikgKi8KKwlNS0s1ID0gMHgwNTQwLCAgICAgICAgICAvKiBKYXBhbiAoVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQpICovCisJTUtLNiA9IDB4MDY0MCwgICAgICAgICAgLyogSmFwYW4gKFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4pICovCisJTUtLNyA9IDB4MDc0MCwgICAgICAgICAgLyogSmFwYW4gKFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4gKyBVTkktMiAqLworCU1LSzggPSAweDA4NDAsICAgICAgICAgIC8qIEphcGFuIChVTkktMSBvZGQgKyBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCkgKi8KKwlNS0s5ID0gMHgwOTQwLCAgICAgICAgICAvKiBKYXBhbiAoVU5JLTEgZXZlbiArIDQuOSBHSFopICovCisJTUtLMTAgPSAweDBCNDAsICAgICAgICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOSBHSFopICovCisJTUtLMTEgPSAweDExNDAsICAgICAgICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOSBHSFopICovCisJTUtLMTIgPSAweDEyNDAsICAgICAgICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOSBHSFopICovCisJTUtLMTMgPSAweDBDNDAsICAgICAgICAgLyogU2FtZSBhcyBNS0s4IGJ1dCBhbGwgcGFzc2l2ZSBhbmQgbm8gYWRob2MgMTFhICovCisJTUtLMTQgPSAweDE0NDAsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIDQuOUdIeiAqLworCU1LSzE1ID0gMHgxNTQwLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIDQuOUdIeiAqLworCU1LS0EgPSAweDBBNDAsICAgICAgICAgIC8qIEphcGFuICovCisJTUtLQyA9IDB4MEE1MCwKKworCU5VTEwxID0gMHgwMTk4LAorCVdPUkxEID0gMHgwMTk5LAorCURFQlVHX1JFR19ETU4gPSAweDAxZmYsCit9OworCitlbnVtIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbmZvcm1hbmNlIHRlc3QgbGltaXRzICovCisJRkNDID0gMHgxMCwKKwlNS0sgPSAweDQwLAorCUVUU0kgPSAweDMwLAorfTsKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFyZSBmbGFncyBmb3IgZGlmZmVyZW50IHJlcXVpcmVtZW50cyBwZXIgcmVnIGRvbWFpbi4KKyAqIFRoZXNlIHJlcXVpcmVtZW50cyBhcmUgZWl0aGVyIGluaGVyZXRlZCBmcm9tIHRoZSByZWcgZG9tYWluIHBhaXIgb3IKKyAqIGZyb20gdGhlIHVuaXRhcnkgcmVnIGRvbWFpbiBpZiB0aGUgcmVnIGRvbWFpbiBwYWlyIGZsYWdzIHZhbHVlIGlzCisgKiAwCisgKi8KKworZW51bSB7CisJTk9fUkVRID0gMHgwMDAwMDAwMCwKKwlESVNBTExPV19BREhPQ18xMUEgPSAweDAwMDAwMDAxLAorCURJU0FMTE9XX0FESE9DXzExQV9UVVJCID0gMHgwMDAwMDAwMiwKKwlORUVEX05GQyA9IDB4MDAwMDAwMDQsCisKKwlBREhPQ19QRVJfMTFEID0gMHgwMDAwMDAwOCwgICAgIC8qIFN0YXJ0IEFkLUhvYyBtb2RlICovCisJQURIT0NfTk9fMTFBID0gMHgwMDAwMDAxMCwKKworCVBVQkxJQ19TQUZFVFlfRE9NQUlOID0gMHgwMDAwMDAyMCwgICAgICAvKiBwdWJsaWMgc2FmZXR5IGRvbWFpbiAqLworCUxJTUlUX0ZSQU1FXzRNUyA9IDB4MDAwMDAwNDAsICAgLyogNG1zZWMgbGltaXQgb24gdGhlIGZyYW1lIGxlbmd0aCAqLworCisJTk9fSE9TVEFQID0gMHgwMDAwMDA4MCwgLyogTm8gSE9TVEFQIG1vZGUgb3BlcmVhdGlvbiAqLworCisJUkVRX01BU0sgPSAweDAwMDAwMEZGLCAgLyogUmVxdWlyZW1lbnRzIGJpdCBtYXNrICovCit9OworCitzdGF0aWMgY29uc3QgUkVHX0RNTl9QQUlSX01BUFBJTkcgYWhfY21uX3JlZ19kb21haW5fcGFpcnNbXSA9IHsKKwl7Tk9fRU5VTVJELCBERUJVR19SRUdfRE1OLCBERUJVR19SRUdfRE1OLCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsCisJIDB9LAorCXtOVUxMMV9XT1JMRCwgTlVMTDEsIFdPUkxELCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtOVUxMMV9FVFNJQiwgTlVMTDEsIEVUU0lCLCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtOVUxMMV9FVFNJQywgTlVMTDEsIEVUU0lDLCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCisJe0ZDQzJfRkNDQSwgRkNDMiwgRkNDQSwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7RkNDMl9XT1JMRCwgRkNDMiwgV09STEQsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0ZDQzJfRVRTSUMsIEZDQzIsIEVUU0lDLCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtGQ0MzX0ZDQ0EsIEZDQzMsIEZDQ0EsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0ZDQzNfV09STEQsIEZDQzMsIFdPUkxELCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtGQ0MzX0VUU0lDLCBGQ0MzLCBFVFNJQywgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7RkNDNF9GQ0NBLCBGQ0M0LCBGQ0NBLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0ZDQzVfRkNDQSwgRkNDNSwgRkNDQSwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7RkNDNl9GQ0NBLCBGQ0M2LCBGQ0NBLCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtGQ0M2X1dPUkxELCBGQ0M2LCBXT1JMRCwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKworCXtFVFNJMV9XT1JMRCwgRVRTSTEsIFdPUkxELAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0VUU0kyX1dPUkxELCBFVFNJMiwgV09STEQsCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7RVRTSTNfV09STEQsIEVUU0kzLCBXT1JMRCwKKwkgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtFVFNJNF9XT1JMRCwgRVRTSTQsIFdPUkxELAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0VUU0k1X1dPUkxELCBFVFNJNSwgV09STEQsCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7RVRTSTZfV09STEQsIEVUU0k2LCBXT1JMRCwKKwkgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtFVFNJOF9XT1JMRCwgRVRTSTgsIFdPUkxELAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0VUU0k5X1dPUkxELCBFVFNJOSwgV09STEQsCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKworCXtFVFNJM19FVFNJQSwgRVRTSTMsIFdPUkxELAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0ZSQU5DRV9SRVMsIEVUU0kzLCBXT1JMRCwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKworCXtGQ0MxX1dPUkxELCBGQ0MxLCBXT1JMRCwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7RkNDMV9GQ0NBLCBGQ0MxLCBGQ0NBLCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtBUEwxX1dPUkxELCBBUEwxLCBXT1JMRCwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7QVBMMl9XT1JMRCwgQVBMMiwgV09STEQsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0FQTDJfRkNDQSwgQVBMMiwgRkNDQSwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7QVBMM19XT1JMRCwgQVBMMywgV09STEQsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0FQTDRfV09STEQsIEFQTDQsIFdPUkxELCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtBUEw1X1dPUkxELCBBUEw1LCBXT1JMRCwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7QVBMNl9XT1JMRCwgQVBMNiwgV09STEQsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0FQTDdfRkNDQSwgQVBMNywgRkNDQSwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7QVBMOF9XT1JMRCwgQVBMOCwgV09STEQsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0FQTDlfTUtLQywgQVBMOSwgTUtLQywgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7QVBMMTBfTUtLQywgQVBMMTAsIE1LS0MsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0FQTDNfRkNDQSwgQVBMMywgRkNDQSwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7QVBMMV9FVFNJQywgQVBMMSwgRVRTSUMsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0FQTDJfRVRTSUMsIEFQTDIsIEVUU0lDLCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCisJe01LSzFfTUtLQSwgTUtLMSwgTUtLQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0tBLCBDVFJZX0pBUEFOfSwKKwl7TUtLMV9NS0tCLCBNS0sxLCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwKKwkgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csCisJIENUUllfSkFQQU4xfSwKKwl7TUtLMV9GQ0NBLCBNS0sxLCBGQ0NBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSwgQ1RSWV9KQVBBTjJ9LAorCXtNS0sxX01LS0ExLCBNS0sxLCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjR9LAorCXtNS0sxX01LS0EyLCBNS0sxLCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjV9LAorCXtNS0sxX01LS0MsIE1LSzEsIE1LS0MsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0sxLCBDVFJZX0pBUEFONn0sCisKKwkvKiBNS0syICovCisJe01LSzJfTUtLQSwgTUtLMiwgTUtLQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8CisJIExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsIFBTQ0FOX01LSzIgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLAorCSBDVFJZX0pBUEFOM30sCisKKwkvKiBNS0szICovCisJe01LSzNfTUtLQSwgTUtLMywgTUtLQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LS0EsIENUUllfSkFQQU4yNX0sCisJe01LSzNfTUtLQiwgTUtLMywgTUtLQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8CisJIExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsIFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU43fSwKKwl7TUtLM19NS0tBMSwgTUtLMywgTUtLQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjI2fSwKKwl7TUtLM19NS0tBMiwgTUtLMywgTUtLQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjh9LAorCXtNS0szX01LS0MsIE1LSzMsIE1LS0MsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBOT19QU0NBTiwgQ1RSWV9KQVBBTjl9LAorCXtNS0szX0ZDQ0EsIE1LSzMsIEZDQ0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBOT19QU0NBTiwgQ1RSWV9KQVBBTjI3fSwKKworCS8qIE1LSzQgKi8KKwl7TUtLNF9NS0tBLCBNS0s0LCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjM2fSwKKwl7TUtLNF9NS0tCLCBNS0s0LCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwKKwkgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csCisJIENUUllfSkFQQU4xMH0sCisJe01LSzRfTUtLQTEsIE1LSzQsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFOMjh9LAorCXtNS0s0X01LS0EyLCBNS0s0LCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjExfSwKKwl7TUtLNF9NS0tDLCBNS0s0LCBNS0tDLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjEyfSwKKwl7TUtLNF9GQ0NBLCBNS0s0LCBGQ0NBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjI5fSwKKworCS8qIE1LSzUgKi8KKy8qCXtNS0s1X01LS0EsICAgICBNS0s1LCAgICAgICAgICAgTUtLQSwgICAgICAgICAgIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLCBQU0NBTl9NS0szLCBDVFJZX0pBUEFONTYgfSwqLworCXtNS0s1X01LS0IsIE1LSzUsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfAorCSBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRywKKwkgQ1RSWV9KQVBBTjEzfSwKKwl7TUtLNV9NS0tBMiwgTUtLNSwgTUtLQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU4xNH0sCisJe01LSzVfTUtLQywgTUtLNSwgTUtLQywKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LSzMsIENUUllfSkFQQU4xNX0sCisJe01LSzVfRkNDQSwgICAgIE1LSzUsICAgICAgIEZDQ0EsICAgICAgIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLCBQU0NBTl9NS0szLCBDVFJZX0pBUEFONTYgfSwKKworCS8qIE1LSzYgKi8KKwl7TUtLNl9NS0tCLCBNS0s2LCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4xNn0sCisJe01LSzZfTUtLQTEsIE1LSzYsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFOMzB9LAorCXtNS0s2X01LS0EyLCBNS0s2LCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjE3fSwKKwl7TUtLNl9NS0tDLCBNS0s2LCBNS0tDLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSwgQ1RSWV9KQVBBTjE4fSwKKwl7TUtLNl9GQ0NBLCBNS0s2LCBGQ0NBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSwgQ1RSWV9KQVBBTjMxfSwKKworCS8qIE1LSzcgKi8KKwl7TUtLN19NS0tCLCBNS0s3LCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMTl9LAorCXtNS0s3X01LS0ExLCBNS0s3LCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU4zMn0sCisJe01LSzdfTUtLQTIsIE1LSzcsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjIwfSwKKwl7TUtLN19NS0tDLCBNS0s3LCBNS0tDLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMsIENUUllfSkFQQU4yMX0sCisJe01LSzdfRkNDQSwgTUtLNywgRkNDQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szLCBDVFJZX0pBUEFOMzN9LAorCisJLyogTUtLOCAqLworCXtNS0s4X01LS0IsIE1LSzgsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4yMn0sCisJe01LSzhfTUtLQTIsIE1LSzgsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjIzfSwKKwl7TUtLOF9NS0tDLCBNS0s4LCBNS0tDLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMsIENUUllfSkFQQU4yNH0sCisKKwl7TUtLOV9NS0tBLCBNS0s5LCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwKKwkgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjM0fSwKKwl7TUtLOV9GQ0NBLCBNS0s5LCBGQ0NBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgTk9fUFNDQU4sIENUUllfSkFQQU4zN30sCisJe01LSzlfTUtLQTEsIE1LSzksIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU4zOH0sCisJe01LSzlfTUtLQTIsIE1LSzksIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU40MH0sCisJe01LSzlfTUtLQywgTUtLOSwgTUtLQywKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMzl9LAorCisJe01LSzEwX01LS0EsIE1LSzEwLCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwKKwkgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjM1fSwKKwl7TUtLMTBfRkNDQSwgTUtLMTAsIEZDQ0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0szLCBDVFJZX0pBUEFONDF9LAorCXtNS0sxMF9NS0tBMSwgTUtLMTAsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFONDJ9LAorCXtNS0sxMF9NS0tBMiwgTUtLMTAsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFONDR9LAorCXtNS0sxMF9NS0tDLCBNS0sxMCwgTUtLQywKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LSzMsIENUUllfSkFQQU40M30sCisKKwl7TUtLMTFfTUtLQSwgTUtLMTEsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0szLCBDVFJZX0pBUEFONDV9LAorCXtNS0sxMV9GQ0NBLCBNS0sxMSwgRkNDQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LSzMsIENUUllfSkFQQU40Nn0sCisJe01LSzExX01LS0ExLCBNS0sxMSwgTUtLQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU40N30sCisJe01LSzExX01LS0EyLCBNS0sxMSwgTUtLQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU40OX0sCisJe01LSzExX01LS0MsIE1LSzExLCBNS0tDLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjQ4fSwKKworCXtNS0sxMl9NS0tBLCBNS0sxMiwgTUtLQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szLCBDVFJZX0pBUEFONTB9LAorCXtNS0sxMl9GQ0NBLCBNS0sxMiwgRkNDQSwKKwkgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUywgTkVFRF9ORkMsCisJIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szLCBDVFJZX0pBUEFONTF9LAorCXtNS0sxMl9NS0tBMSwgTUtLMTIsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjUyfSwKKwl7TUtLMTJfTUtLQTIsIE1LSzEyLCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU41NH0sCisJe01LSzEyX01LS0MsIE1LSzEyLCBNS0tDLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMsIENUUllfSkFQQU41M30sCisKKwl7TUtLMTNfTUtLQiwgTUtLMTMsIE1LS0EsCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfAorCSBMSU1JVF9GUkFNRV80TVMsIE5FRURfTkZDLAorCSBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU41N30sCisKKwl7TUtLMTRfTUtLQTEsIE1LSzE0LCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjU4fSwKKwl7TUtLMTVfTUtLQTEsIE1LSzE1LCBNS0tBLAorCSBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TLCBORUVEX05GQywKKwkgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU41OX0sCisKKwkvKiBUaGVzZSBhcmUgc3VwZXIgZG9tYWlucyAqLworCXtXT1IwX1dPUkxELCBXT1IwX1dPUkxELCBXT1IwX1dPUkxELCBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtXT1IxX1dPUkxELCBXT1IxX1dPUkxELCBXT1IxX1dPUkxELAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe1dPUjJfV09STEQsIFdPUjJfV09STEQsIFdPUjJfV09STEQsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsCisJIFBTQ0FOX0RFRkVSLCAwfSwKKwl7V09SM19XT1JMRCwgV09SM19XT1JMRCwgV09SM19XT1JMRCwgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7V09SNF9XT1JMRCwgV09SNF9XT1JMRCwgV09SNF9XT1JMRCwKKwkgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtXT1I1X0VUU0lDLCBXT1I1X0VUU0lDLCBXT1I1X0VUU0lDLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe1dPUjAxX1dPUkxELCBXT1IwMV9XT1JMRCwgV09SMDFfV09STEQsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe1dPUjAyX1dPUkxELCBXT1IwMl9XT1JMRCwgV09SMDJfV09STEQsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0VVMV9XT1JMRCwgRVUxX1dPUkxELCBFVTFfV09STEQsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe1dPUjlfV09STEQsIFdPUjlfV09STEQsIFdPUjlfV09STEQsCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7V09SQV9XT1JMRCwgV09SQV9XT1JMRCwgV09SQV9XT1JMRCwKKwkgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtXT1JCX1dPUkxELCBXT1JCX1dPUkxELCBXT1JCX1dPUkxELAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe1dPUkNfV09STEQsIFdPUkNfV09STEQsIFdPUkNfV09STEQsIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCit9OworCitzdGF0aWMgY29uc3QgQ09VTlRSWV9DT0RFX1RPX0VOVU1fUkQgYWhfY21uX2FsbF9jb3VudHJpZXNbXSA9IHsKKwl7Q1RSWV9ERUJVRywgTk9fRU5VTVJELCAiREIiLCAiREVCVUciLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfREVGQVVMVCwgREVGX1JFR0RNTiwgIk5BIiwgIk5PX0NPVU5UUllfU0VUIiwgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0FMQkFOSUEsIE5VTEwxX1dPUkxELCAiQUwiLCAiQUxCQU5JQSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIE5PLAorCSBOTywgTk8sIDcwMDB9LAorCXtDVFJZX0FMR0VSSUEsIE5VTEwxX1dPUkxELCAiRFoiLCAiQUxHRVJJQSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIE5PLAorCSBOTywgTk8sIDcwMDB9LAorCXtDVFJZX0FSR0VOVElOQSwgRkNDM19XT1JMRCwgIkFSIiwgIkFSR0VOVElOQSIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfQVJNRU5JQSwgRVRTSTRfV09STEQsICJBTSIsICJBUk1FTklBIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgTk8sIDcwMDB9LAorCXtDVFJZX0FSVUJBLCBFVFNJMV9XT1JMRCwgIkFXIiwgIkFSVUJBIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfQVVTVFJBTElBLCBGQ0MzX1dPUkxELCAiQVUiLCAiQVVTVFJBTElBIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0FVU1RSQUxJQTIsIEZDQzZfV09STEQsICJBVSIsICJBVVNUUkFMSUEyIiwgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0FVU1RSSUEsIEVUU0kxX1dPUkxELCAiQVQiLCAiQVVTVFJJQSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0FaRVJCQUlKQU4sIEVUU0k0X1dPUkxELCAiQVoiLCAiQVpFUkJBSUpBTiIsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9CQUhBTUFTLCBGQ0MzX1dPUkxELCAiQlMiLCAiQkFIQU1BUyIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9CQUhSQUlOLCBBUEw2X1dPUkxELCAiQkgiLCAiQkFIUkFJTiIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgTk8sIE5PLCA3MDAwfSwKKwl7Q1RSWV9CQU5HTEFERVNILCBOVUxMMV9XT1JMRCwgIkJEIiwgIkJBTkdMQURFU0giLCBZRVMsIE5PLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgTk8sIE5PLCA3MDAwfSwKKwl7Q1RSWV9CQVJCQURPUywgRkNDMl9XT1JMRCwgIkJCIiwgIkJBUkJBRE9TIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfQkVMQVJVUywgRVRTSTFfV09STEQsICJCWSIsICJCRUxBUlVTIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfQkVMR0lVTSwgRVRTSTFfV09STEQsICJCRSIsICJCRUxHSVVNIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfQkVMR0lVTTIsIEVUU0k0X1dPUkxELCAiQkUiLCAiQkVMR0lVTTIiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9CRUxJWkUsIEFQTDFfRVRTSUMsICJCWiIsICJCRUxJWkUiLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfQkVSTVVEQSwgRkNDM19GQ0NBLCAiQk0iLCAiQkVSTVVEQSIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9CT0xJVklBLCBBUEwxX0VUU0lDLCAiQk8iLCAiQk9MSVZJQSIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9CT1NOSUFfSEVSWiwgRVRTSTFfV09STEQsICJCQSIsICJCT1NOSUEgQU5EIEhFUlpFR09WSU5BIiwgWUVTLCBOTywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfQlJBWklMLCBGQ0MzX1dPUkxELCAiQlIiLCAiQlJBWklMIiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9CUlVORUlfREFSVVNTQUxBTSwgQVBMNl9XT1JMRCwgIkJOIiwgIkJSVU5FSSBEQVJVU1NBTEFNIiwgWUVTLAorCSBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0JVTEdBUklBLCBFVFNJMV9XT1JMRCwgIkJHIiwgIkJVTEdBUklBIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfQ0FNQk9ESUEsIEVUU0kxX1dPUkxELCAiS0giLCAiQ0FNQk9ESUEiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9DQU5BREEsIEZDQzNfRkNDQSwgIkNBIiwgIkNBTkFEQSIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9DQU5BREEyLCBGQ0M2X0ZDQ0EsICJDQSIsICJDQU5BREEyIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0NISUxFLCBBUEw2X1dPUkxELCAiQ0wiLCAiQ0hJTEUiLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfQ0hJTkEsIEFQTDFfV09STEQsICJDTiIsICJDSElOQSIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9DT0xPTUJJQSwgRkNDMV9GQ0NBLCAiQ08iLCAiQ09MT01CSUEiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9DT1NUQV9SSUNBLCBGQ0MxX1dPUkxELCAiQ1IiLCAiQ09TVEEgUklDQSIsIFlFUywgTk8sIFlFUywgWUVTLAorCSBZRVMsIFlFUywgTk8sIE5PLCA3MDAwfSwKKwl7Q1RSWV9DUk9BVElBLCBFVFNJMV9XT1JMRCwgIkhSIiwgIkNST0FUSUEiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9DWVBSVVMsIEVUU0kxX1dPUkxELCAiQ1kiLCAiQ1lQUlVTIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0NaRUNILCBFVFNJMV9XT1JMRCwgIkNaIiwgIkNaRUNIIFJFUFVCTElDIiwgWUVTLCBOTywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfREVOTUFSSywgRVRTSTFfV09STEQsICJESyIsICJERU5NQVJLIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfRE9NSU5JQ0FOX1JFUFVCTElDLCBGQ0MxX0ZDQ0EsICJETyIsICJET01JTklDQU4gUkVQVUJMSUMiLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfRUNVQURPUiwgRkNDMV9XT1JMRCwgIkVDIiwgIkVDVUFET1IiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgTk8sIE5PLCA3MDAwfSwKKwl7Q1RSWV9FR1lQVCwgRVRTSTNfV09STEQsICJFRyIsICJFR1lQVCIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgTk8sIE5PLCA3MDAwfSwKKwl7Q1RSWV9FTF9TQUxWQURPUiwgRkNDMV9XT1JMRCwgIlNWIiwgIkVMIFNBTFZBRE9SIiwgWUVTLCBOTywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBOTywgTk8sIDcwMDB9LAorCXtDVFJZX0VTVE9OSUEsIEVUU0kxX1dPUkxELCAiRUUiLCAiRVNUT05JQSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0ZJTkxBTkQsIEVUU0kxX1dPUkxELCAiRkkiLCAiRklOTEFORCIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0ZSQU5DRSwgRVRTSTFfV09STEQsICJGUiIsICJGUkFOQ0UiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9HRU9SR0lBLCBFVFNJNF9XT1JMRCwgIkdFIiwgIkdFT1JHSUEiLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfR0VSTUFOWSwgRVRTSTFfV09STEQsICJERSIsICJHRVJNQU5ZIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfR1JFRUNFLCBFVFNJMV9XT1JMRCwgIkdSIiwgIkdSRUVDRSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0dSRUVOTEFORCwgRVRTSTFfV09STEQsICJHTCIsICJHUkVFTkxBTkQiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCBOTywgNzAwMH0sCisJe0NUUllfR1JFTkFEQSwgRkNDM19GQ0NBLCAiR0QiLCAiR1JFTkFEQSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0dVQU0sIEZDQzFfRkNDQSwgIkdVIiwgIkdVQU0iLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsIE5PLAorCSBOTywgNzAwMH0sCisJe0NUUllfR1VBVEVNQUxBLCBGQ0MxX0ZDQ0EsICJHVCIsICJHVUFURU1BTEEiLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfSEFJVEksIEVUU0kxX1dPUkxELCAiSFQiLCAiSEFJVEkiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9IT05EVVJBUywgRkNDM19XT1JMRCwgIkhOIiwgIkhPTkRVUkFTIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfSE9OR19LT05HLCBGQ0MzX1dPUkxELCAiSEsiLCAiSE9ORyBLT05HIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0hVTkdBUlksIEVUU0kxX1dPUkxELCAiSFUiLCAiSFVOR0FSWSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0lDRUxBTkQsIEVUU0kxX1dPUkxELCAiSVMiLCAiSUNFTEFORCIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0lORElBLCBBUEw2X1dPUkxELCAiSU4iLCAiSU5ESUEiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9JTkRPTkVTSUEsIEFQTDJfV09STEQsICJJRCIsICJJTkRPTkVTSUEiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCBOTywgNzAwMH0sCisJe0NUUllfSVJBTiwgQVBMMV9XT1JMRCwgIklSIiwgIklSQU4iLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgNzAwMH0sCisJe0NUUllfSVJFTEFORCwgRVRTSTFfV09STEQsICJJRSIsICJJUkVMQU5EIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfSVNSQUVMLCBFVFNJM19XT1JMRCwgIklMIiwgIklTUkFFTCIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0lUQUxZLCBFVFNJMV9XT1JMRCwgIklUIiwgIklUQUxZIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfSkFNQUlDQSwgRkNDM19XT1JMRCwgIkpNIiwgIkpBTUFJQ0EiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTiwgTUtLNV9NS0tBMiwgIkpQIiwgIkpBUEFOIiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsIE5PLAorCSBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4xLCBNS0sxX01LS0IsICJKUCIsICJKQVBBTjEiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywgTk8sCisJIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjIsIE1LSzFfRkNDQSwgIkpQIiwgIkpBUEFOMiIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLCBOTywKKwkgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFOMywgTUtLMl9NS0tBLCAiSlAiLCAiSkFQQU4zIiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsIE5PLAorCSBOTywgNzAwMH0sCisJe0NUUllfSkFQQU40LCBNS0sxX01LS0ExLCAiSlAiLCAiSkFQQU40IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIE5PLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU41LCBNS0sxX01LS0EyLCAiSlAiLCAiSkFQQU41IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIE5PLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU42LCBNS0sxX01LS0MsICJKUCIsICJKQVBBTjYiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywgTk8sCisJIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjcsIE1LSzNfTUtLQiwgIkpQIiwgIkpBUEFONyIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjgsIE1LSzNfTUtLQTIsICJKUCIsICJKQVBBTjgiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU45LCBNS0szX01LS0MsICJKUCIsICJKQVBBTjkiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4xMCwgTUtLNF9NS0tCLCAiSlAiLCAiSkFQQU4xMCIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjExLCBNS0s0X01LS0EyLCAiSlAiLCAiSkFQQU4xMSIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjEyLCBNS0s0X01LS0MsICJKUCIsICJKQVBBTjEyIiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFOMTMsIE1LSzVfTUtLQiwgIkpQIiwgIkpBUEFOMTMiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4xNCwgTUtLNV9NS0tBMiwgIkpQIiwgIkpBUEFOMTQiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4xNSwgTUtLNV9NS0tDLCAiSlAiLCAiSkFQQU4xNSIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjE2LCBNS0s2X01LS0IsICJKUCIsICJKQVBBTjE2IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFOMTcsIE1LSzZfTUtLQTIsICJKUCIsICJKQVBBTjE3IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFOMTgsIE1LSzZfTUtLQywgIkpQIiwgIkpBUEFOMTgiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4xOSwgTUtLN19NS0tCLCAiSlAiLCAiSkFQQU4xOSIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjIwLCBNS0s3X01LS0EyLCAiSlAiLCAiSkFQQU4yMCIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjIxLCBNS0s3X01LS0MsICJKUCIsICJKQVBBTjIxIiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFOMjIsIE1LSzhfTUtLQiwgIkpQIiwgIkpBUEFOMjIiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4yMywgTUtLOF9NS0tBMiwgIkpQIiwgIkpBUEFOMjMiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4yNCwgTUtLOF9NS0tDLCAiSlAiLCAiSkFQQU4yNCIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjI1LCBNS0szX01LS0EsICJKUCIsICJKQVBBTjI1IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFOMjYsIE1LSzNfTUtLQTEsICJKUCIsICJKQVBBTjI2IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFOMjcsIE1LSzNfRkNDQSwgIkpQIiwgIkpBUEFOMjciLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4yOCwgTUtLNF9NS0tBMSwgIkpQIiwgIkpBUEFOMjgiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4yOSwgTUtLNF9GQ0NBLCAiSlAiLCAiSkFQQU4yOSIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjMwLCBNS0s2X01LS0ExLCAiSlAiLCAiSkFQQU4zMCIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjMxLCBNS0s2X0ZDQ0EsICJKUCIsICJKQVBBTjMxIiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFOMzIsIE1LSzdfTUtLQTEsICJKUCIsICJKQVBBTjMyIiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFOMzMsIE1LSzdfRkNDQSwgIkpQIiwgIkpBUEFOMzMiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4zNCwgTUtLOV9NS0tBLCAiSlAiLCAiSkFQQU4zNCIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjM1LCBNS0sxMF9NS0tBLCAiSlAiLCAiSkFQQU4zNSIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjM2LCBNS0s0X01LS0EsICJKUCIsICJKQVBBTjM2IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFOMzcsIE1LSzlfRkNDQSwgIkpQIiwgIkpBUEFOMzciLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4zOCwgTUtLOV9NS0tBMSwgIkpQIiwgIkpBUEFOMzgiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU4zOSwgTUtLOV9NS0tDLCAiSlAiLCAiSkFQQU4zOSIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjQwLCBNS0s5X01LS0EyLCAiSlAiLCAiSkFQQU40MCIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjQxLCBNS0sxMF9GQ0NBLCAiSlAiLCAiSkFQQU40MSIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjQyLCBNS0sxMF9NS0tBMSwgIkpQIiwgIkpBUEFONDIiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU40MywgTUtLMTBfTUtLQywgIkpQIiwgIkpBUEFONDMiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU40NCwgTUtLMTBfTUtLQTIsICJKUCIsICJKQVBBTjQ0IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFONDUsIE1LSzExX01LS0EsICJKUCIsICJKQVBBTjQ1IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFONDYsIE1LSzExX0ZDQ0EsICJKUCIsICJKQVBBTjQ2IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFONDcsIE1LSzExX01LS0ExLCAiSlAiLCAiSkFQQU40NyIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjQ4LCBNS0sxMV9NS0tDLCAiSlAiLCAiSkFQQU40OCIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjQ5LCBNS0sxMV9NS0tBMiwgIkpQIiwgIkpBUEFONDkiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU41MCwgTUtLMTJfTUtLQSwgIkpQIiwgIkpBUEFONTAiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU41MSwgTUtLMTJfRkNDQSwgIkpQIiwgIkpBUEFONTEiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSkFQQU41MiwgTUtLMTJfTUtLQTEsICJKUCIsICJKQVBBTjUyIiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFONTMsIE1LSzEyX01LS0MsICJKUCIsICJKQVBBTjUzIiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFONTQsIE1LSzEyX01LS0EyLCAiSlAiLCAiSkFQQU41NCIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKy8qICAgIHtDVFJZX0pBUEFONTUsICAgICBNS0s1X01LS0EsICAgICAiSlAiLCAiSkFQQU41NSIsICAgICAgICBZRVMsICBOTywgIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsIE5PLCA3MDAwIH0sKi8KKwl7Q1RSWV9KQVBBTjU2LCAgICAgTUtLNV9GQ0NBLCAgICAgIkpQIiwgIkpBUEFONTYiLCAgICAgICAgWUVTLCAgTk8sICBOTywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCBOTywgNzAwMCB9LAorCXtDVFJZX0pBUEFONTcsIE1LSzEzX01LS0IsICJKUCIsICJKQVBBTjU3IiwgWUVTLCBOTywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgTk8sIDcwMDB9LAorCXtDVFJZX0pBUEFONTgsIE1LSzE0X01LS0ExLCAiSlAiLCAiSkFQQU41OCIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9KQVBBTjU5LCBNS0sxNV9NS0tBMSwgIkpQIiwgIkpBUEFONTkiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBOTywgNzAwMH0sCisJe0NUUllfSk9SREFOLCBFVFNJMl9XT1JMRCwgIkpPIiwgIkpPUkRBTiIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX0tBWkFLSFNUQU4sIE5VTEwxX1dPUkxELCAiS1oiLCAiS0FaQUtIU1RBTiIsIFlFUywgTk8sIFlFUywgWUVTLAorCSBZRVMsIE5PLCBOTywgTk8sIDcwMDB9LAorCXtDVFJZX0tFTllBLCBBUEwxX1dPUkxELCAiS0UiLCAiS0VOWUEiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9LT1JFQV9OT1JUSCwgQVBMOV9NS0tDLCAiS1AiLCAiTk9SVEggS09SRUEiLCBZRVMsIE5PLCBOTywgWUVTLAorCSBOTywgWUVTLCBOTywgTk8sIDcwMDB9LAorCXtDVFJZX0tPUkVBX1JPQywgQVBMMTBfTUtLQywgIktSIiwgIktPUkVBIFJFUFVCTElDIiwgWUVTLCBOTywgTk8sIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9LT1JFQV9ST0MzLCBBUEw5X01LS0MsICJLUiIsICJLT1JFQSBSRVBVQkxJQzMiLCBZRVMsIE5PLCBOTywgWUVTLAorCSBOTywgWUVTLCBOTywgTk8sIDcwMDB9LAorCXtDVFJZX0tVV0FJVCwgRVRTSTNfV09STEQsICJLVyIsICJLVVdBSVQiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9MQVRWSUEsIEVUU0kxX1dPUkxELCAiTFYiLCAiTEFUVklBIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfTEVCQU5PTiwgQVBMMV9XT1JMRCwgIkxCIiwgIkxFQkFOT04iLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9MSUVDSFRFTlNURUlOLCBFVFNJMV9XT1JMRCwgIkxJIiwgIkxJRUNIVEVOU1RFSU4iLCBZRVMsIE5PLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9MSVRIVUFOSUEsIEVUU0kxX1dPUkxELCAiTFQiLCAiTElUSFVBTklBIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfTFVYRU1CT1VSRywgRVRTSTFfV09STEQsICJMVSIsICJMVVhFTUJPVVJHIiwgWUVTLCBOTywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfTUFDQVUsIEZDQzJfV09STEQsICJNTyIsICJNQUNBVSBTQVIiLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfTUFDRURPTklBLCBFVFNJMV9XT1JMRCwgIk1LIiwgIk1BQ0VET05JQSwgRllSTyIsIFlFUywgTk8sIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX01BTEFZU0lBLCBGQ0MxX1dPUkxELCAiTVkiLCAiTUFMQVlTSUEiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX01BTFRBLCBFVFNJMV9XT1JMRCwgIk1UIiwgIk1BTFRBIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfTUFVUklUSVVTLCBFVFNJMV9XT1JMRCwgIk1VIiwgIk1BVVJJVElVUyIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX01FWElDTywgRkNDMV9XT1JMRCwgIk1YIiwgIk1FWElDTyIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9NT05BQ08sIEVUU0k0X1dPUkxELCAiTUMiLCAiTU9OQUNPIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX01PUk9DQ08sIEFQTDRfV09STEQsICJNQSIsICJNT1JPQ0NPIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfTkVQQUwsIEFQTDFfV09STEQsICJOUCIsICJORVBBTCIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX05FVEhFUkxBTkRTLCBFVFNJMV9XT1JMRCwgIk5MIiwgIk5FVEhFUkxBTkRTIiwgWUVTLCBOTywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfTkVUSEVSTEFORFNfQU5USUxMRVMsIEVUU0kxX1dPUkxELCAiQU4iLCAiTkVUSEVSTEFORFMgQU5USUxMRVMiLAorCSBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9ORVdfWkVBTEFORCwgRkNDM19FVFNJQywgIk5aIiwgIk5FVyBaRUFMQU5EIiwgWUVTLCBOTywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfTklDQVJBR1VBLCBGQ0MzX0ZDQ0EsICJOSSIsICJOSUNBUkFHVUEiLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfTk9SV0FZLCBFVFNJMV9XT1JMRCwgIk5PIiwgIk5PUldBWSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX09NQU4sIEZDQzNfV09STEQsICJPTSIsICJPTUFOIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgNzAwMH0sCisJe0NUUllfUEFLSVNUQU4sIEFQTDFfV09STEQsICJQSyIsICJQQUtJU1RBTiIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1BBTkFNQSwgRkNDMV9GQ0NBLCAiUEEiLCAiUEFOQU1BIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1BBUFVBX05FV19HVUlORUEsIEZDQzFfV09STEQsICJQRyIsICJQQVBVQSBORVcgR1VJTkVBIiwgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1BBUkFHVUFZLCBGQ0MzX1dPUkxELCAiUFkiLCAiUEFSQUdVQVkiLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfUEVSVSwgRkNDM19XT1JMRCwgIlBFIiwgIlBFUlUiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCA3MDAwfSwKKwl7Q1RSWV9QSElMSVBQSU5FUywgRkNDM19XT1JMRCwgIlBIIiwgIlBISUxJUFBJTkVTIiwgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1BPTEFORCwgRVRTSTFfV09STEQsICJQTCIsICJQT0xBTkQiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9QT1JUVUdBTCwgRVRTSTFfV09STEQsICJQVCIsICJQT1JUVUdBTCIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1BVRVJUT19SSUNPLCBGQ0MxX0ZDQ0EsICJQUiIsICJQVUVSVE8gUklDTyIsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9RQVRBUiwgQVBMMV9XT1JMRCwgIlFBIiwgIlFBVEFSIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfUk9NQU5JQSwgRVRTSTFfV09STEQsICJSTyIsICJST01BTklBIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfUlVTU0lBLCBFVFNJOF9XT1JMRCwgIlJVIiwgIlJVU1NJQSIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9SV0FOREEsIEFQTDFfV09STEQsICJSVyIsICJSV0FOREEiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9TQVVESV9BUkFCSUEsIEZDQzJfV09STEQsICJTQSIsICJTQVVESSBBUkFCSUEiLCBZRVMsIE5PLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIE5PLCBOTywgNzAwMH0sCisJe0NUUllfU0VSQklBLCBFVFNJMV9XT1JMRCwgIlJTIiwgIlJFUFVCTElDIE9GIFNFUkJJQSIsIFlFUywgTk8sIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX01PTlRFTkVHUk8sIEVUU0kxX1dPUkxELCAiTUUiLCAiTU9OVEVORUdSTyIsIFlFUywgTk8sIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1NJTkdBUE9SRSwgRkNDM19XT1JMRCwgIlNHIiwgIlNJTkdBUE9SRSIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9TTE9WQUtJQSwgRVRTSTFfV09STEQsICJTSyIsICJTTE9WQUtJQSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1NMT1ZFTklBLCBFVFNJMV9XT1JMRCwgIlNJIiwgIlNMT1ZFTklBIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfU09VVEhfQUZSSUNBLCBGQ0MzX1dPUkxELCAiWkEiLCAiU09VVEggQUZSSUNBIiwgWUVTLCBOTywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfU1BBSU4sIEVUU0kxX1dPUkxELCAiRVMiLCAiU1BBSU4iLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9TUklfTEFOS0EsIEZDQzNfV09STEQsICJMSyIsICJTUkkgTEFOS0EiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCBOTywgNzAwMH0sCisJe0NUUllfU1dFREVOLCBFVFNJMV9XT1JMRCwgIlNFIiwgIlNXRURFTiIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1NXSVRaRVJMQU5ELCBFVFNJMV9XT1JMRCwgIkNIIiwgIlNXSVRaRVJMQU5EIiwgWUVTLCBOTywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfU1lSSUEsIE5VTEwxX1dPUkxELCAiU1kiLCAiU1lSSUFOIEFSQUIgUkVQVUJMSUMiLCBZRVMsIE5PLCBZRVMsCisJIFlFUywgWUVTLCBOTywgTk8sIE5PLCA3MDAwfSwKKwl7Q1RSWV9UQUlXQU4sIEFQTDdfRkNDQSwgIlRXIiwgIlRBSVdBTiIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9UQU5aQU5JQSwgQVBMMV9XT1JMRCwgIlRaIiwgIlRBTlpBTklBIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1RIQUlMQU5ELCBGQ0MzX1dPUkxELCAiVEgiLCAiVEhBSUxBTkQiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9UUklOSURBRF9ZX1RPQkFHTywgRkNDM19XT1JMRCwgIlRUIiwgIlRSSU5JREFEIEFORCBUT0JBR08iLCBZRVMsCisJIE5PLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9UVU5JU0lBLCBFVFNJM19XT1JMRCwgIlROIiwgIlRVTklTSUEiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCBOTywgNzAwMH0sCisJe0NUUllfVFVSS0VZLCBFVFNJM19XT1JMRCwgIlRSIiwgIlRVUktFWSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgTk8sIE5PLCA3MDAwfSwKKwl7Q1RSWV9VR0FOREEsIEZDQzNfV09STEQsICJVRyIsICJVR0FOREEiLCBZRVMsIE5PLCBOTywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1VLUkFJTkUsIEVUU0k5X1dPUkxELCAiVUEiLCAiVUtSQUlORSIsIFlFUywgTk8sIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIE5PLCA3MDAwfSwKKwl7Q1RSWV9VQUUsIEVUU0kxX1dPUkxELCAiQUUiLCAiVU5JVEVEIEFSQUIgRU1JUkFURVMiLCBZRVMsIE5PLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9VTklURURfS0lOR0RPTSwgRVRTSTFfV09STEQsICJHQiIsICJVTklURUQgS0lOR0RPTSIsIFlFUywgTk8sIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1VOSVRFRF9TVEFURVMsIEZDQzNfRkNDQSwgIlVTIiwgIlVOSVRFRCBTVEFURVMiLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNTgyNX0sCisJe0NUUllfVU5JVEVEX1NUQVRFUzIsIEZDQzZfRkNDQSwgIlVTIiwgIlVOSVRFRCBTVEFURVMyIiwgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1VOSVRFRF9TVEFURVNfRkNDNDksIEZDQzRfRkNDQSwgIlBTIiwKKwkgIlVOSVRFRCBTVEFURVMgKFBVQkxJQyBTQUZFVFkpIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIDcwMDB9LAorCXtDVFJZX1VSVUdVQVksIEZDQzNfV09STEQsICJVWSIsICJVUlVHVUFZIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgNzAwMH0sCisJe0NUUllfVVpCRUtJU1RBTiwgRkNDM19GQ0NBLCAiVVoiLCAiVVpCRUtJU1RBTiIsIFlFUywgWUVTLCBZRVMsIFlFUywKKwkgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9WRU5FWlVFTEEsIEZDQzFfV09STEQsICJWRSIsICJWRU5FWlVFTEEiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBZRVMsIFlFUywgWUVTLCA3MDAwfSwKKwl7Q1RSWV9WSUVUX05BTSwgRVRTSTNfV09STEQsICJWTiIsICJWSUVUIE5BTSIsIFlFUywgTk8sIFlFUywgWUVTLCBZRVMsCisJIFlFUywgWUVTLCBZRVMsIDcwMDB9LAorCXtDVFJZX1lFTUVOLCBOVUxMMV9XT1JMRCwgIllFIiwgIllFTUVOIiwgWUVTLCBOTywgWUVTLCBZRVMsIFlFUywgTk8sIE5PLAorCSBOTywgNzAwMH0sCisJe0NUUllfWklNQkFCV0UsIE5VTEwxX1dPUkxELCAiWlciLCAiWklNQkFCV0UiLCBZRVMsIE5PLCBZRVMsIFlFUywgWUVTLAorCSBOTywgTk8sIE5PLCA3MDAwfQorfTsKKworLyogQml0IG1hc2tzIGZvciBERlMgcGVyIHJlZ2RvbWFpbiAqLworCitlbnVtIHsKKwlOT19ERlMgPSAweDAwMDAwMDAwMDAwMDAwMDBVTEwsCisJREZTX0ZDQzMgPSAweDAwMDAwMDAwMDAwMDAwMDFVTEwsCisJREZTX0VUU0kgPSAweDAwMDAwMDAwMDAwMDAwMDJVTEwsCisJREZTX01LSzQgPSAweDAwMDAwMDAwMDAwMDAwMDRVTEwsCit9OworCisvKiBUaGUgdGFibGUgb2YgZnJlcXVlbmN5IGJhbmRzIGlzIGluZGV4ZWQgYnkgYSBiaXRtYXNrLiAgVGhlIG9yZGVyaW5nCisgKiBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZW51bSBiZWxvdy4gIFdoZW4gYWRkaW5nIGEgbmV3CisgKiBmcmVxdWVuY3kgYmFuZCwgYmUgc3VyZSB0byBtYXRjaCB0aGUgbG9jYXRpb24gaW4gdGhlIGVudW0gd2l0aCB0aGUKKyAqIGNvbW1lbnRzCisgKi8KKworLyoKKyAqIDVHSHogMTFBIGNoYW5uZWwgdGFncworICovCitlbnVtIHsKKwlGMV80OTEyXzQ5NDcsCisJRjFfNDkxNV80OTI1LAorCUYyXzQ5MTVfNDkyNSwKKwlGMV80OTM1XzQ5NDUsCisJRjJfNDkzNV80OTQ1LAorCUYxXzQ5MjBfNDk4MCwKKwlGMl80OTIwXzQ5ODAsCisJRjFfNDk0Ml80OTg3LAorCUYxXzQ5NDVfNDk4NSwKKwlGMV80OTUwXzQ5ODAsCisJRjFfNTAzMl81MDU3LAorCUYxXzUwMzVfNTA0MCwKKwlGMl81MDM1XzUwNDAsCisJRjFfNTAzNV81MDQ1LAorCUYxXzUwNDBfNTA0MCwKKwlGMV81MDQwXzUwODAsCisJRjJfNTA0MF81MDgwLAorCUYxXzUwNTVfNTA1NSwKKwlGMl81MDU1XzUwNTUsCisKKwlGMV81MTIwXzUyNDAsCisKKwlGMV81MTcwXzUyMzAsCisJRjJfNTE3MF81MjMwLAorCisJRjFfNTE4MF81MjQwLAorCUYyXzUxODBfNTI0MCwKKwlGM181MTgwXzUyNDAsCisJRjRfNTE4MF81MjQwLAorCUY1XzUxODBfNTI0MCwKKwlGNl81MTgwXzUyNDAsCisJRjdfNTE4MF81MjQwLAorCUY4XzUxODBfNTI0MCwKKwlGOV81MTgwXzUyNDAsCisJRjEwXzUxODBfNTI0MCwKKworCUYxXzUyNDBfNTI4MCwKKworCUYxXzUyNjBfNTI4MCwKKworCUYxXzUyNjBfNTMyMCwKKwlGMl81MjYwXzUzMjAsCisJRjNfNTI2MF81MzIwLAorCUY0XzUyNjBfNTMyMCwKKwlGNV81MjYwXzUzMjAsCisJRjZfNTI2MF81MzIwLAorCUY3XzUyNjBfNTMyMCwKKworCUYxXzUyNjBfNTcwMCwKKworCUYxXzUyODBfNTMyMCwKKwlGMl81MjgwXzUzMjAsCisJRjFfNTUwMF81NTYwLAorCisJRjFfNTUwMF81NTgwLAorCUYyXzU1MDBfNTU4MCwKKworCUYxXzU1MDBfNTYyMCwKKworCUYxXzU1MDBfNTY2MCwKKworCUYxXzU1MDBfNTcyMCwKKwlGMl81NTAwXzU3MDAsCisJRjNfNTUwMF81NzAwLAorCUY0XzU1MDBfNTcwMCwKKwlGNV81NTAwXzU3MDAsCisJRjZfNTUwMF81NzAwLAorCisJRjFfNTY2MF81NzAwLAorCUYyXzU2NjBfNTcyMCwKKwlGM181NjYwXzU3MjAsCisKKwlGMV81NzQ1XzU3NjUsCisKKwlGMV81NzQ1XzU4MDUsCisJRjJfNTc0NV81ODA1LAorCUYzXzU3NDVfNTgwNSwKKwlGNF81NzQ1XzU4MDUsCisKKwlGMV81NzQ1XzU4MjUsCisJRjJfNTc0NV81ODI1LAorCUYzXzU3NDVfNTgyNSwKKwlGNF81NzQ1XzU4MjUsCisJRjVfNTc0NV81ODI1LAorCUY2XzU3NDVfNTgyNSwKKwlGN181NzQ1XzU4MjUsCisJRjhfNTc0NV81ODI1LAorCUY5XzU3NDVfNTgyNSwKKworCUYxXzU4NDVfNTg2NSwKKworCVcxXzQ5MjBfNDk4MCwKKwlXMV81MDQwXzUwODAsCisJVzFfNTE3MF81MjMwLAorCVcxXzUxODBfNTI0MCwKKwlXMV81MjYwXzUzMjAsCisJVzFfNTc0NV81ODI1LAorCVcxXzU1MDBfNTcwMCwKKwlBX0RFTU9fQUxMX0NIQU5ORUxTCit9OworCitzdGF0aWMgY29uc3QgUkVHX0RNTl9GUkVRX0JBTkQgcmVnX2RtbjVfZ2h6X2ZyZXFbXSA9IHsKKwl7NDkxNSwgNDkyNSwgMjAsIDAsIDEwLCA1LCBOT19ERlMsIFBTQ0FOX01LSzIsIDE2fSwgICAgIC8qIEYxXzQ5MTVfNDkyNSAqLworCXs0OTE1LCA0OTI1LCAyMywgMCwgMTAsIDUsIE5PX0RGUywgUFNDQU5fTUtLMiwgMTZ9LCAgICAgLyogRjJfNDkxNV80OTI1ICovCisJezQ5MzUsIDQ5NDUsIDIwLCAwLCAxMCwgNSwgTk9fREZTLCBQU0NBTl9NS0syLCAxNn0sICAgICAvKiBGMV80OTM1XzQ5NDUgKi8KKwl7NDkzNSwgNDk0NSwgMjMsIDAsIDEwLCA1LCBOT19ERlMsIFBTQ0FOX01LSzIsIDE2fSwgICAgIC8qIEYyXzQ5MzVfNDk0NSAqLworCXs0OTIwLCA0OTgwLCAyMywgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX01LSzIsIDd9LCAgICAgLyogRjFfNDkyMF80OTgwICovCisJezQ5MjAsIDQ5ODAsIDIwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fTUtLMiwgN30sICAgICAvKiBGMl80OTIwXzQ5ODAgKi8KKwl7NDk0MiwgNDk4NywgMjcsIDYsIDUsIDUsIE5PX0RGUywgUFNDQU5fRkNDLCAwfSwgICAgICAgIC8qIEYxXzQ5NDJfNDk4NyAqLworCXs0OTQ1LCA0OTg1LCAzMCwgNiwgMTAsIDUsIE5PX0RGUywgUFNDQU5fRkNDLCAwfSwgICAgICAgLyogRjFfNDk0NV80OTg1ICovCisJezQ5NTAsIDQ5ODAsIDMzLCA2LCAyMCwgNSwgTk9fREZTLCBQU0NBTl9GQ0MsIDB9LCAgICAgICAvKiBGMV80OTUwXzQ5ODAgKi8KKwl7NTAzNSwgNTA0MCwgMjMsIDAsIDEwLCA1LCBOT19ERlMsIFBTQ0FOX01LSzIsIDEyfSwgICAgIC8qIEYxXzUwMzVfNTA0MCAqLworCXs1MDM1LCA1MDQwLCAyMywgMCwgMTAsIDUsIE5PX0RGUywgUFNDQU5fTUtLMiwgMTJ9LCAgICAgLyogRjJfNTAzNV81MDQwICovCisJezUwNDAsIDUwNDAsIDIwLCAwLCAxMCwgNSwgTk9fREZTLCBQU0NBTl9NS0syLCAxMn0sICAgICAvKiBGMV81MDQwXzUwNDAgKi8KKwl7NTA0MCwgNTA4MCwgMjMsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9NS0syLCAyfSwgICAgIC8qIEYxXzUwNDBfNTA4MCAqLworCXs1MDQwLCA1MDgwLCAyMCwgMCwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCA2fSwgICAgICAgLyogRjJfNTA0MF81MDgwICovCisJezUwNTUsIDUwNTUsIDIwLCAwLCAxMCwgNSwgTk9fREZTLCBQU0NBTl9NS0syLCAxMn0sICAgICAvKiBGMV81MDU1XzUwNTUgKi8KKwl7NTA1NSwgNTA1NSwgMjMsIDAsIDEwLCA1LCBOT19ERlMsIFBTQ0FOX01LSzIsIDEyfSwgICAgIC8qIEYyXzUwNTVfNTA1NSAqLworCisJezUxMjAsIDUyNDAsIDUsIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMH0sICAgICAgICAvKiBGMV81MTIwXzUyNDAgKi8KKworCXs1MTcwLCA1MjMwLCAyMywgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0syLCAxfSwgICAgICAgIC8qIEYxXzUxNzBfNTIzMCAqLworCXs1MTcwLCA1MjMwLCAyMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0syLCAxfSwgICAgICAgIC8qIEYyXzUxNzBfNTIzMCAqLworCisJezUxODAsIDUyNDAsIDE1LCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMX0sIC8qIEYxXzUxODBfNTI0MCAqLworCXs1MTgwLCA1MjQwLCAxNywgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAxfSwgICAgICAgLyogRjJfNTE4MF81MjQwICovCisJezUxODAsIDUyNDAsIDE4LCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMX0sIC8qIEYzXzUxODBfNTI0MCAqLworCXs1MTgwLCA1MjQwLCAyMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDF9LCAvKiBGNF81MTgwXzUyNDAgKi8KKwl7NTE4MCwgNTI0MCwgMjMsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAxfSwgLyogRjVfNTE4MF81MjQwICovCisJezUxODAsIDUyNDAsIDIzLCA2LCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRkNDLCAxfSwgICAgICAvKiBGNl81MTgwXzUyNDAgKi8KKwl7NTE4MCwgNTI0MCwgMjAsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMywgMH0sICAgICAgICAvKiBGN181MTgwXzUyNDAgKi8KKwl7NTE4MCwgNTI0MCwgMjMsIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMX0sICAgICAgIC8qIEY4XzUxODBfNTI0MCAqLworCXs1MTgwLCA1MjQwLCAyMCwgNiwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0VUU0ksIDB9LCAgICAgLyogRjlfNTE4MF81MjQwICovCisJezUxODAsIDUyNDAsIDIzLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMX0sIC8qIEYxMF81MTgwXzUyNDAgKi8KKworCXs1MjQwLCA1MjgwLCAyMywgMCwgMjAsIDIwLCBERlNfRkNDMywgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMH0sICAgICAgIC8qIEYxXzUyNDBfNTI4MCAqLworCisJezUyNjAsIDUyODAsIDIzLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDJ9LCAgICAvKiBGMV81MjYwXzUyODAgKi8KKworCXs1MjYwLCA1MzIwLCAxOCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAyfSwgICAgLyogRjFfNTI2MF81MzIwICovCisKKwl7NTI2MCwgNTMyMCwgMjAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSB8IERGU19NS0s0LAorCSBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJIHwgUFNDQU5fTUtLMywgMH0sCisJLyogRjJfNTI2MF81MzIwICovCisKKwl7NTI2MCwgNTMyMCwgMjQsIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMn0sICAgIC8qIEYzXzUyNjBfNTMyMCAqLworCXs1MjYwLCA1MzIwLCAyMywgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MsIDJ9LCAvKiBGNF81MjYwXzUzMjAgKi8KKwl7NTI2MCwgNTMyMCwgMjMsIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDLCAyfSwgLyogRjVfNTI2MF81MzIwICovCisJezUyNjAsIDUzMjAsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDJ9LCAgICAgICAvKiBGNl81MjYwXzUzMjAgKi8KKwl7NTI2MCwgNTMyMCwgMjMsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSB8IERGU19NS0s0LAorCSBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJIHwgUFNDQU5fTUtLMywgMH0sCisJLyogRjdfNTI2MF81MzIwICovCisKKwl7NTI2MCwgNTcwMCwgNSwgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBOT19QU0NBTiwgMH0sICAgLyogRjFfNTI2MF81NzAwICovCisKKwl7NTI4MCwgNTMyMCwgMTcsIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDLCAyfSwgLyogRjFfNTI4MF81MzIwICovCisKKwl7NTUwMCwgNTU4MCwgMjMsIDYsIDIwLCAyMCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgNH0sICAgIC8qIEYxXzU1MDBfNTU4MCAqLworCXs1NTAwLCA1NTgwLCAzMCwgNiwgMjAsIDIwLCBERlNfRkNDMywgUFNDQU5fRkNDLCA0fSwgICAgLyogRjJfNTUwMF81NTgwICovCisKKwl7NTUwMCwgNTYyMCwgMzAsIDYsIDIwLCAyMCwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIDN9LCAgIC8qIEYxXzU1MDBfNTYyMCAqLworCisJezU1MDAsIDU2NjAsIDIwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDB9LCAgICAvKiBGMV81NTAwXzU2NjAgKi8KKworCXs1NTAwLCA1NzIwLCAyNCwgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MsIDR9LCAvKiBGMV81NTAwXzU3MjAgKi8KKwl7NTUwMCwgNTcwMCwgMjcsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgM30sICAgIC8qIEYyXzU1MDBfNTcwMCAqLworCXs1NTAwLCA1NzAwLCAzMCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAzfSwgICAgLyogRjNfNTUwMF81NzAwICovCisJezU1MDAsIDU3MDAsIDIzLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0kgfCBERlNfTUtLNCwgUFNDQU5fTUtLMyB8IFBTQ0FOX0ZDQywgMH0sIC8qIEY0XzU1MDBfNTcwMCAqLworCXs1NTAwLCA1NzAwLCAzMCwgNiwgMjAsIDIwLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgMH0sICAgLyogRjVfNTUwMF81NzAwICovCisJezU1MDAsIDU3MDAsIDIwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0kgfCBERlNfTUtLNCwgUFNDQU5fTUtLMyB8IFBTQ0FOX0ZDQywgMH0sIC8qIEY2XzU1MDBfNTcwMCAqLworCisJezU2NjAsIDU3MDAsIDIwLCA2LCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDR9LCAgICAvKiBGMV81NjYwXzU3MDAgKi8KKwl7NTY2MCwgNTcwMCwgMjMsIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgNH0sICAgIC8qIEYyXzU2NjBfNTcwMCAqLworCXs1NjYwLCA1NzAwLCAzMCwgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCA0fSwgICAgLyogRjNfNTY2MF81NzAwICovCisKKwl7NTc0NSwgNTgwNSwgMjMsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgM30sICAgICAgIC8qIEYxXzU3NDVfNTgwNSAqLworCXs1NzQ1LCA1ODA1LCAzMCwgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAzfSwgICAgICAgLyogRjJfNTc0NV81ODA1ICovCisJezU3NDUsIDU4MDUsIDMwLCA2LCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRVRTSSwgMH0sICAgICAvKiBGM181NzQ1XzU4MDUgKi8KKwl7NTc0NSwgNTgwNSwgMjAsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMH0sICAgICAgIC8qIEY0XzU3NDVfNTgwNSAqLworCisJezU3NDUsIDU4MjUsIDUsIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgNX0sICAgICAgICAvKiBGMV81NzQ1XzU4MjUgKi8KKwl7NTc0NSwgNTgyNSwgMTcsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgNX0sICAgICAgIC8qIEYyXzU3NDVfNTgyNSAqLworCXs1NzQ1LCA1ODI1LCAyMCwgMCwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwfSwgICAgICAgLyogRjNfNTc0NV81ODI1ICovCisJezU3NDUsIDU4MjUsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAgICAgICAvKiBGNF81NzQ1XzU4MjUgKi8KKwl7NTc0NSwgNTgyNSwgMzAsIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgNX0sICAgICAgIC8qIEY1XzU3NDVfNTgyNSAqLworCXs1NzQ1LCA1ODI1LCAzMCwgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCA1fSwgICAgICAgLyogRjZfNTc0NV81ODI1ICovCisJezU3NDUsIDU4MjUsIDMwLCA2LCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRVRTSSwgMH0sICAgICAvKiBGN181NzQ1XzU4MjUgKi8KKwl7NTc0NSwgNTgyNSwgMjAsIDYsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9FVFNJLCAwfSwgICAgIC8qIEY4XzU3NDVfNTgyNSAqLworCisJLyoKKwkgKiBCZWxvdyBhcmUgdGhlIHdvcmxkIHJvYW1pbmcgY2hhbm5lbHMKKwkgKiBBbGwgV1dSIGRvbWFpbnMgaGF2ZSBubyBwb3dlciBsaW1pdCwgaW5zdGVhZCB1c2UgdGhlIGNhcmQncyBDVEwKKwkgKiBvciBtYXggcG93ZXIgc2V0dGluZ3MuCisJICovCisJezQ5MjAsIDQ5ODAsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fV1dSLCAwfSwgICAgICAvKiBXMV80OTIwXzQ5ODAgKi8KKwl7NTA0MCwgNTA4MCwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9XV1IsIDB9LCAgICAgIC8qIFcxXzUwNDBfNTA4MCAqLworCXs1MTcwLCA1MjMwLCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX1dXUiwgMH0sICAgICAgLyogVzFfNTE3MF81MjMwICovCisJezUxODAsIDUyNDAsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fV1dSLCAwfSwgICAgICAvKiBXMV81MTgwXzUyNDAgKi8KKwl7NTI2MCwgNTMyMCwgMzAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCAwfSwgLyogVzFfNTI2MF81MzIwICovCisJezU3NDUsIDU4MjUsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fV1dSLCAwfSwgICAgICAvKiBXMV81NzQ1XzU4MjUgKi8KKwl7NTUwMCwgNTcwMCwgMzAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCAwfSwgLyogVzFfNTUwMF81NzAwICovCisJezQ5MjAsIDYxMDAsIDMwLCA2LCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAgICAgICAvKiBBX0RFTU9fQUxMX0NIQU5ORUxTICovCit9OworCisvKgorICogMkdIeiAxMWIgY2hhbm5lbCB0YWdzCisgKi8KK2VudW0geworCUYxXzIzMTJfMjM3MiwKKwlGMl8yMzEyXzIzNzIsCisKKwlGMV8yNDEyXzI0NzIsCisJRjJfMjQxMl8yNDcyLAorCUYzXzI0MTJfMjQ3MiwKKwlGNF8yNDEyXzI0NzIsCisKKwlGMV8yNDEyXzI0NjIsCisJRjJfMjQxMl8yNDYyLAorCisJRjFfMjQzMl8yNDQyLAorCisJRjFfMjQ1N18yNDcyLAorCisJRjFfMjQ2N18yNDcyLAorCisJRjFfMjQ4NF8yNDg0LAorCUYyXzI0ODRfMjQ4NCwKKworCUYxXzI1MTJfMjczMiwKKworCVcxXzIzMTJfMjM3MiwKKwlXMV8yNDEyXzI0MTIsCisJVzFfMjQxN18yNDMyLAorCVcxXzI0MzdfMjQ0MiwKKwlXMV8yNDQ3XzI0NTcsCisJVzFfMjQ2Ml8yNDYyLAorCVcxXzI0NjdfMjQ2NywKKwlXMl8yNDY3XzI0NjcsCisJVzFfMjQ3Ml8yNDcyLAorCVcyXzI0NzJfMjQ3MiwKKwlXMV8yNDg0XzI0ODQsCisJVzJfMjQ4NF8yNDg0LAorfTsKKworc3RhdGljIGNvbnN0IFJFR19ETU5fRlJFUV9CQU5EIHJlZ19kbW4yX2doel9mcmVxW10gPSB7CisJezIzMTIsIDIzNzIsIDUsIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwfSwgLyogRjFfMjMxMl8yMzcyICovCisJezIzMTIsIDIzNzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMH0sICAgICAgICAvKiBGMl8yMzEyXzIzNzIgKi8KKworCXsyNDEyLCAyNDcyLCA1LCA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMH0sIC8qIEYxXzI0MTJfMjQ3MiAqLworCXsyNDEyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQSwgMzB9LCAgICAgLyogRjJfMjQxMl8yNDcyICovCisJezI0MTIsIDI0NzIsIDMwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgNH0sICAgICAgICAvKiBGM18yNDEyXzI0NzIgKi8KKwl7MjQxMiwgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX01LS0EsIDB9LCAgICAgIC8qIEY0XzI0MTJfMjQ3MiAqLworCisJezI0MTIsIDI0NjIsIDMwLCA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMTJ9LCAgICAgICAvKiBGMV8yNDEyXzI0NjIgKi8KKwl7MjQxMiwgMjQ2MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX01LS0EsIDMwfSwgICAgIC8qIEYyXzI0MTJfMjQ2MiAqLworCisJezI0MzIsIDI0NDIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgNH0sICAgICAgICAvKiBGMV8yNDMyXzI0NDIgKi8KKworCXsyNDU3LCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAgICAgICAgLyogRjFfMjQ1N18yNDcyICovCisKKwl7MjQ2NywgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQSwgMzB9LCAgICAgICAvKiBGMV8yNDY3XzI0NzIgKi8KKworCXsyNDg0LCAyNDg0LCA1LCA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMH0sIC8qIEYxXzI0ODRfMjQ4NCAqLworCXsyNDg0LCAyNDg0LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTIsIDMxfSwgLyogRjJfMjQ4NF8yNDg0ICovCisKKwl7MjUxMiwgMjczMiwgNSwgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAvKiBGMV8yNTEyXzI3MzIgKi8KKworCS8qCisJICogV1dSIGhhdmUgcG93ZXJzIG9wZW5lZCB1cCB0byAyMGRCbS4gIExpbWl0cyBzaG91bGQgb2Z0ZW4gY29tZSBmcm9tIENUTC9NYXggcG93ZXJzCisJICovCisKKwl7MjMxMiwgMjM3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwfSwgICAgICAgIC8qIFcxXzIzMTJfMjM3MiAqLworCXsyNDEyLCAyNDEyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAgICAgICAgLyogVzFfMjQxMl8yNDEyICovCisJezI0MTcsIDI0MzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMH0sICAgICAgICAvKiBXMV8yNDE3XzI0MzIgKi8KKwl7MjQzNywgMjQ0MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwfSwgICAgICAgIC8qIFcxXzI0MzdfMjQ0MiAqLworCXsyNDQ3LCAyNDU3LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAgICAgICAgLyogVzFfMjQ0N18yNDU3ICovCisJezI0NjIsIDI0NjIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMH0sICAgICAgICAvKiBXMV8yNDYyXzI0NjIgKi8KKwl7MjQ2NywgMjQ2NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX1dXUiB8IElTX0VDTV9DSEFOLCAwfSwgLyogVzFfMjQ2N18yNDY3ICovCisJezI0NjcsIDI0NjcsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiB8IElTX0VDTV9DSEFOLCAwfSwgIC8qIFcyXzI0NjdfMjQ2NyAqLworCXsyNDcyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fV1dSIHwgSVNfRUNNX0NIQU4sIDB9LCAvKiBXMV8yNDcyXzI0NzIgKi8KKwl7MjQ3MiwgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOIHwgSVNfRUNNX0NIQU4sIDB9LCAgLyogVzJfMjQ3Ml8yNDcyICovCisJezI0ODQsIDI0ODQsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9XV1IgfCBJU19FQ01fQ0hBTiwgMH0sIC8qIFcxXzI0ODRfMjQ4NCAqLworCXsyNDg0LCAyNDg0LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4gfCBJU19FQ01fQ0hBTiwgMH0sICAvKiBXMl8yNDg0XzI0ODQgKi8KK307CisKKy8qCisgKiAyR0h6IDExZyBjaGFubmVsIHRhZ3MKKyAqLworCitlbnVtIHsKKwlHMV8yMzEyXzIzNzIsCisJRzJfMjMxMl8yMzcyLAorCisJRzFfMjQxMl8yNDcyLAorCUcyXzI0MTJfMjQ3MiwKKwlHM18yNDEyXzI0NzIsCisJRzRfMjQxMl8yNDcyLAorCisJRzFfMjQxMl8yNDYyLAorCUcyXzI0MTJfMjQ2MiwKKworCUcxXzI0MzJfMjQ0MiwKKworCUcxXzI0NTdfMjQ3MiwKKworCUcxXzI1MTJfMjczMiwKKworCUcxXzI0NjdfMjQ3MiwKKwlHMl8yNDY3XzI0NzIsCisKKwlHMV8yNDg0XzI0ODQsCisKKwlXRzFfMjMxMl8yMzcyLAorCVdHMV8yNDEyXzI0NjIsCisJV0cxXzI0MTJfMjQ3MiwKKwlXRzJfMjQxMl8yNDcyLAorCUdfREVNT19BTE1PU1RfQUxMX0NIQU5ORUxTLAorCUdfREVNT19BTExfQ0hBTk5FTFMsCit9OworCitzdGF0aWMgY29uc3QgUkVHX0RNTl9GUkVRX0JBTkQgcmVnX2RtbjJfZ2h6MTFnX2ZyZXFbXSA9IHsKKwl7MjMxMiwgMjM3MiwgNSwgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAvKiBHMV8yMzEyXzIzNzIgKi8KKwl7MjMxMiwgMjM3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwfSwgICAgICAgIC8qIEcyXzIzMTJfMjM3MiAqLworCisJezI0MTIsIDI0NzIsIDUsIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwfSwgLyogRzFfMjQxMl8yNDcyICovCisJezI0MTIsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9NS0tBX0cgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EgfCBQU0NBTl9FWFRfQ0hBTiwgMzB9LCAgICAgICAvKiBHMl8yNDEyXzI0NzIgKi8KKwl7MjQxMiwgMjQ3MiwgMzAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCA0fSwgICAgICAgIC8qIEczXzI0MTJfMjQ3MiAqLworCXsyNDEyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQV9HIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBIHwgUFNDQU5fRVhUX0NIQU4sIDB9LCAgICAgICAgLyogRzRfMjQxMl8yNDcyICovCisKKwl7MjQxMiwgMjQ2MiwgMzAsIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAxMn0sICAgICAgIC8qIEcxXzI0MTJfMjQ2MiAqLworCXsyNDEyLCAyNDYyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQV9HLCAzMH0sICAgLyogRzJfMjQxMl8yNDYyICovCisKKwl7MjQzMiwgMjQ0MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCA0fSwgICAgICAgIC8qIEcxXzI0MzJfMjQ0MiAqLworCisJezI0NTcsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMH0sICAgICAgICAvKiBHMV8yNDU3XzI0NzIgKi8KKworCXsyNTEyLCAyNzMyLCA1LCA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMH0sIC8qIEcxXzI1MTJfMjczMiAqLworCisJezI0NjcsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EsIDMwfSwgICAgICAgLyogRzFfMjQ2N18yNDcyICovCisJezI0NjcsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9NS0tBX0cgfCBQU0NBTl9NS0tBMiwgMH0sICAgICAgLyogRzJfMjQ2N18yNDcyICovCisKKwl7MjQ4NCwgMjQ4NCwgNSwgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAvKiBHMV8yNDg0XzI0ODQgKi8KKwkvKgorCSAqIFdXUiBvcGVuIHVwIHRoZSBwb3dlciB0byAyMGRCbQorCSAqLworCisJezIzMTIsIDIzNzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMH0sICAgICAgICAvKiBXRzFfMjMxMl8yMzcyICovCisJezI0MTIsIDI0NjIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMH0sICAgICAgICAvKiBXRzFfMjQxMl8yNDYyICovCisJezI0MTIsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9XV1IgfCBJU19FQ01fQ0hBTiB8IFBTQ0FOX0VYVF9DSEFOLCAwfSwgICAgICAgIC8qIFdHMV8yNDEyXzI0NzIgKi8KKwl7MjQxMiwgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOIHwgSVNfRUNNX0NIQU4sIDB9LCAgLyogV0cyXzI0MTJfMjQ3MiAqLworCXsyMzEyLCAyNTMyLCAyNywgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAgICAgICAgLyogR19ERU1PX0FMTU9TVF9BTExfQ0hBTk5FTFMgKi8KKwl7MjMxMiwgMjczMiwgMjcsIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwfSwgICAgICAgIC8qIEdfREVNT19BTExfQ0hBTk5FTFMgKi8KK307CisKKy8qIHJlZ3VsYXRvcnkgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFJFR0RNTl9FRVBST01fRUVSRUdDQVBfRU5fS0tfVTFfRVZFTiAgICAweDAwODAKKyNkZWZpbmUgUkVHRE1OX0VFUFJPTV9FRVJFR0NBUF9FTl9LS19VMiAgICAgICAgIDB4MDEwMAorI2RlZmluZSBSRUdETU5fRUVQUk9NX0VFUkVHQ0FQX0VOX0tLX01JREJBTkQgICAgMHgwMjAwCisjZGVmaW5lIFJFR0RNTl9FRVBST01fRUVSRUdDQVBfRU5fS0tfVTFfT0REICAgICAweDA0MDAKKworc3RhdGljIGNvbnN0IEpBUEFOX0JBTkRDSEVDSyBqX2JhbmRjaGVja1tdID0geworCXtGMV81MTcwXzUyMzAsIFJFR0RNTl9FRVBST01fRUVSRUdDQVBfRU5fS0tfVTFfT0REfSwKKwl7RjRfNTE4MF81MjQwLCBSRUdETU5fRUVQUk9NX0VFUkVHQ0FQX0VOX0tLX1UxX0VWRU59LAorCXtGMl81MjYwXzUzMjAsIFJFR0RNTl9FRVBST01fRUVSRUdDQVBfRU5fS0tfVTJ9LAorCXtGNF81NTAwXzU3MDAsIFJFR0RNTl9FRVBST01fRUVSRUdDQVBfRU5fS0tfTUlEQkFORH0KK307CisKK3N0YXRpYyBjb25zdCBDT01NT05fTU9ERV9QT1dFUiBjb21tb25fbW9kZV9wd3J0YmxbXSA9IHsKKwl7NDkwMCwgNTAwMCwgMTd9LAorCXs1MDAwLCA1MTAwLCAxN30sCisJezUxNTAsIDUyNTAsIDE3fSwgICAgICAgLyogRVRTSSAmIE1LSyAqLworCXs1MjUwLCA1MzUwLCAxOH0sICAgICAgIC8qIEVUU0kgKi8KKwl7NTQ3MCwgNTcyNSwgMjB9LCAgICAgICAvKiBFVFNJICovCisJezU3MjUsIDU4MjUsIDIwfSwgICAgICAgLyogU2luZ2Fwb3JlICovCisJezU4MjUsIDU4NTAsIDIzfSAvKiBLb3JlYSAqLworfTsKKworLyoKKyAqIDVHSHogVHVyYm8gKGR5bmFtaWMgJiBzdGF0aWMpIHRhZ3MKKyAqLworCitlbnVtIHsKKwlUMV81MTMwXzU2NTAsCisJVDFfNTE1MF81NjcwLAorCisJVDFfNTIwMF81MjAwLAorCVQyXzUyMDBfNTIwMCwKKwlUM181MjAwXzUyMDAsCisJVDRfNTIwMF81MjAwLAorCVQ1XzUyMDBfNTIwMCwKKwlUNl81MjAwXzUyMDAsCisJVDdfNTIwMF81MjAwLAorCVQ4XzUyMDBfNTIwMCwKKworCVQxXzUyMDBfNTI4MCwKKwlUMl81MjAwXzUyODAsCisJVDNfNTIwMF81MjgwLAorCVQ0XzUyMDBfNTI4MCwKKwlUNV81MjAwXzUyODAsCisJVDZfNTIwMF81MjgwLAorCisJVDFfNTIwMF81MjQwLAorCVQxXzUyMTBfNTIxMCwKKwlUMl81MjEwXzUyMTAsCisJVDNfNTIxMF81MjEwLAorCVQ0XzUyMTBfNTIxMCwKKwlUNV81MjEwXzUyMTAsCisJVDZfNTIxMF81MjEwLAorCVQ3XzUyMTBfNTIxMCwKKwlUOF81MjEwXzUyMTAsCisJVDlfNTIxMF81MjEwLAorCVQxMF81MjEwXzUyMTAsCisJVDFfNTI0MF81MjQwLAorCisJVDFfNTIxMF81MjUwLAorCVQxXzUyMTBfNTI5MCwKKwlUMl81MjEwXzUyOTAsCisJVDNfNTIxMF81MjkwLAorCisJVDFfNTI4MF81MjgwLAorCVQyXzUyODBfNTI4MCwKKwlUMV81MjkwXzUyOTAsCisJVDJfNTI5MF81MjkwLAorCVQzXzUyOTBfNTI5MCwKKwlUMV81MjUwXzUyOTAsCisJVDJfNTI1MF81MjkwLAorCVQzXzUyNTBfNTI5MCwKKwlUNF81MjUwXzUyOTAsCisKKwlUMV81NTQwXzU2NjAsCisJVDJfNTU0MF81NjYwLAorCVQzXzU1NDBfNTY2MCwKKwlUMV81NzYwXzU4MDAsCisJVDJfNTc2MF81ODAwLAorCVQzXzU3NjBfNTgwMCwKKwlUNF81NzYwXzU4MDAsCisJVDVfNTc2MF81ODAwLAorCVQ2XzU3NjBfNTgwMCwKKwlUN181NzYwXzU4MDAsCisKKwlUMV81NzY1XzU4MDUsCisJVDJfNTc2NV81ODA1LAorCVQzXzU3NjVfNTgwNSwKKwlUNF81NzY1XzU4MDUsCisJVDVfNTc2NV81ODA1LAorCVQ2XzU3NjVfNTgwNSwKKwlUN181NzY1XzU4MDUsCisJVDhfNTc2NV81ODA1LAorCVQ5XzU3NjVfNTgwNSwKKworCVdUMV81MjEwXzUyNTAsCisJV1QxXzUyOTBfNTI5MCwKKwlXVDFfNTU0MF81NjYwLAorCVdUMV81NzYwXzU4MDAsCit9OworCisvKgorICogMkdIeiBEeW5hbWljIHR1cmJvIHRhZ3MKKyAqLworI2lmbmRlZiBBVEhfUkVNT1ZFXzJHX1RVUkJPX1JEX1RBQkxFCitlbnVtIHsKKwlUMV8yMzEyXzIzNzIsCisJVDFfMjQzN18yNDM3LAorCVQyXzI0MzdfMjQzNywKKwlUM18yNDM3XzI0MzcsCisJVDFfMjUxMl8yNzMyCit9OworCitzdGF0aWMgY29uc3QgUkVHX0RNTl9GUkVRX0JBTkQgcmVnX2RtbjJfZ2h6MTFnX3R1cmJvX2ZyZXFbXSA9IHsKKwl7MjMxMiwgMjM3MiwgNSwgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwfSwgICAgICAgIC8qIFQxXzIzMTJfMjM3MiAqLworCXsyNDM3LCAyNDM3LCA1LCA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAgICAgICAgLyogVDFfMjQzN18yNDM3ICovCisJezI0MzcsIDI0MzcsIDIwLCA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAgICAgICAvKiBUMl8yNDM3XzI0MzcgKi8KKwl7MjQzNywgMjQzNywgMTgsIDYsIDQwLCA0MCwgTk9fREZTLCBQU0NBTl9XV1IsIDB9LCAgICAgIC8qIFQzXzI0MzdfMjQzNyAqLworCXsyNTEyLCAyNzMyLCA1LCA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDB9LCAgICAgICAgLyogVDFfMjUxMl8yNzMyICovCit9OworI2VuZGlmIC8qIEFUSF9SRU1PVkVfMkdfVFVSQk9fUkRfVEFCTEUgKi8KKworc3RhdGljIGNvbnN0IFJFR19ET01BSU4gYWhfY21uX3JlZ19kb21haW5zW10gPSB7CisKKwl7REVCVUdfUkVHX0RNTiwgRkNDLCBERlNfRkNDMywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQ0hBTl8xMUFfQk0oQV9ERU1PX0FMTF9DSEFOTkVMUywgRjZfNTc0NV81ODI1LAorCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKQorCSBDSEFOXzExQV9CTShUMV81MTMwXzU2NTAsIFQxXzUxNTBfNTY3MCwgRjZfNTc0NV81ODI1LAorCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpCisJIENIQU5fMTFBX0JNKFQxXzUyMDBfNTI0MCwgVDFfNTI4MF81MjgwLCBUMV81NTQwXzU2NjAsIFQxXzU3NjVfNTgwNSwKKwkJICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpCisJIEJNKEYxXzIzMTJfMjM3MiwgRjFfMjQxMl8yNDcyLCBGMV8yNDg0XzI0ODQsIEYxXzI1MTJfMjczMiwKKwkgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oR19ERU1PX0FMTU9TVF9BTExfQ0hBTk5FTFMsCisJICAgIEcxXzI0ODRfMjQ4NCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBDSEFOX1RVUkJPX0dfQk0oVDFfMjMxMl8yMzcyLCBUMV8yNDM3XzI0MzcsIFQxXzI1MTJfMjczMiwKKwkJCSAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMMSwgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEY0XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCXtBUEwyLCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjFfNTc0NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJe0FQTDMsIEZDQywgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgTk9fUkVRLAorCSBCTShGMV81MjgwXzUzMjAsIEY2XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MjkwXzUyOTAsIFQxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCXtBUEw0LCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjVfNTE4MF81MjQwLCBGOV81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIxMF81MjEwLCBUM181NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIwMF81MjAwLCBUM181NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJe0FQTDUsIEZDQywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGMl81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQ0XzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDRfNTc2NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwl7QVBMNiwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0ZDQ19UIHwgUFNDQU5fRkNDLCBOT19SRVEsCisJIEJNKEY5XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGM181NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJICAgIC0xLCAtMSwgLTEpLAorCSBCTShUMl81MjEwXzUyMTAsIFQxXzUyNTBfNTI5MCwgVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIwMF81MjgwLCBUNV81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJe0FQTDcsIEZDQywgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgTk9fUkVRLAorCSBCTShGMl81MjgwXzUzMjAsIEYyXzU1MDBfNTU4MCwgRjNfNTY2MF81NzIwLCBGN181NzQ1XzU4MjUsIC0xLCAtMSwgLTEsCisJICAgIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzUyOTBfNTI5MCwgVDVfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzU1NDBfNTY2MCwgVDZfNTc2NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCXtBUEw4LCBFVFNJLCBOT19ERlMsIE5PX1BTQ0FOLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjZfNTI2MF81MzIwLCBGNF81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfNTI5MF81MjkwLCBUMl81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTI4MF81MjgwLCBUMV81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJe0FQTDksIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjlfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEYxXzU1MDBfNTYyMCwgRjNfNTc0NV81ODA1LCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM181MjkwXzUyOTAsIFQ1XzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81NTQwXzU2NjAsIFQ2XzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwl7QVBMMTAsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjlfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEY1XzU1MDBfNTcwMCwgRjNfNTc0NV81ODA1LCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM181MjkwXzUyOTAsIFQ1XzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81NTQwXzU2NjAsIFQ2XzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwl7QVBMMTEsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjlfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEY1XzU1MDBfNTcwMCwgRjdfNTc0NV81ODI1LAorCSAgICBGMV81ODQ1XzU4NjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfNTI5MF81MjkwLCBUNV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTU0MF81NjYwLCBUNl81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJe0FQTDEyLCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwKKwkgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEY1XzUxODBfNTI0MCwgRjFfNTUwMF81NTYwLCBGMV81NzQ1XzU3NjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJICAgIC0xLCAtMSwgLTEpLAorCSBCTShUMl81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJe0VUU0kxLCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwKKwkgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYyXzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGMl81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJICAgIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MjEwXzUyOTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzUyMDBfNTI4MCwgVDJfNTU0MF81NjYwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCXtFVFNJMiwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGM181MTgwXzUyNDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzUyMTBfNTIxMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfNTIwMF81MjAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwl7RVRTSTMsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIxMF81MjkwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl81MjAwXzUyODAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCXtFVFNJNCwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGM181MTgwXzUyNDAsIEYxXzUyNjBfNTMyMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl81MjEwXzUyOTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzUyMDBfNTI4MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJe0VUU0k1LCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwKKwkgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzUxODBfNTI0MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDRfNTIxMF81MjEwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM181MjAwXzUyMDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCXtFVFNJNiwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGNV81MTgwXzUyNDAsIEYxXzUyNjBfNTI4MCwgRjNfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIxMF81MjUwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUNF81MjAwXzUyODAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCXtFVFNJOCwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgRjFfNTY2MF81NzAwLCBGNF81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsCisJICAgIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMTBfNTI5MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfNTIwMF81MjgwLCBUMl81NTQwXzU2NjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7RVRTSTksIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEYxXzU1MDBfNTY2MCwgRjhfNTc0NV81ODI1LCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MjEwXzUyOTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzUyMDBfNTI4MCwgVDJfNTU0MF81NjYwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe0ZDQzEsIEZDQywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGMl81MTgwXzUyNDAsIEY0XzUyNjBfNTMyMCwgRjVfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xKSwKKwkgQk0oVDZfNTIxMF81MjEwLCBUMl81MjUwXzUyOTAsIFQ2XzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkgICAgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMDBfNTI0MCwgVDJfNTI4MF81MjgwLCBUN181NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJICAgIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwl7RkNDMiwgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEY2XzUxODBfNTI0MCwgRjVfNTI2MF81MzIwLCBGNl81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJICAgIC0xLCAtMSwgLTEpLAorCSBCTShUN181MjEwXzUyMTAsIFQzXzUyNTBfNTI5MCwgVDJfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xKSwKKwkgQk0oVDdfNTIwMF81MjAwLCBUMV81MjQwXzUyNDAsIFQyXzUyODBfNTI4MCwgVDFfNTc2NV81ODA1LCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwl7RkNDMywgRkNDLCBERlNfRkNDMywgUFNDQU5fRkNDIHwgUFNDQU5fRkNDX1QsIE5PX1JFUSwKKwkgQk0oRjJfNTE4MF81MjQwLCBGM181MjYwXzUzMjAsIEYxXzU1MDBfNTcyMCwgRjVfNTc0NV81ODI1LCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUNl81MjEwXzUyMTAsIFQyXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUNF81MjAwXzUyMDAsIFQ4XzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisJLyoKKworCSAgIEJ1ZyBGaXg6IEVWIDk4NTgzIFB1YmxpYyBTYWZldHkgY2hhbm5lbAorCSAgIEV4Y2x1ZGUgdGhlIGZvbGxvd2luZyBjaGFubmVsIGluIEZDQyBQdWJsaWMgc2FmZXR5IGRvbWFpbgorCSAgIFVuaS0xOiA1MTgwLCA1MjAwLCA1MjIwLCA1MjQwCisJICAgVW5pLTI6IDUyNjAsIDUyODAsIDUzMDAsIDUzMjAKKwkgICBVbmktMzogNTc0NSwgNTc2NSwgNTc4NSwgNTgwNSwgNTgyNQorCSAqLworCXtGQ0M0LCBGQ0MsIERGU19GQ0MzLCBQU0NBTl9GQ0MgfCBQU0NBTl9GQ0NfVCwgTk9fUkVRLAorCSBCTShGMV80OTQyXzQ5ODcsIEYxXzQ5NDVfNDk4NSwgRjFfNDk1MF80OTgwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xKSwKKwkgQk0oVDhfNTIxMF81MjEwLCBUNF81MjUwXzUyOTAsIFQ3XzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkgICAgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMDBfNTI0MCwgVDFfNTI4MF81MjgwLCBUOV81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJICAgIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwl7RkNDNSwgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEYyXzUxODBfNTI0MCwgRjZfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQ2XzUyMTBfNTIxMCwgVDJfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQ4XzUyMDBfNTIwMCwgVDdfNTc2NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCXtGQ0M2LCBGQ0MsIERGU19GQ0MzLCBQU0NBTl9GQ0MsIE5PX1JFUSwKKwkgQk0oRjhfNTE4MF81MjQwLCBGNV81MjYwXzUzMjAsIEYxXzU1MDBfNTU4MCwgRjJfNTY2MF81NzIwLAorCSAgICBGNl81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDdfNTIxMF81MjEwLCBUM181MjUwXzUyOTAsIFQyXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkgICAgLTEsIC0xLCAtMSksCisJIEJNKFQ3XzUyMDBfNTIwMCwgVDFfNTI0MF81MjQwLCBUMl81MjgwXzUyODAsIFQxXzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwKKwkgICAgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJe01LSzEsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNTE3MF81MjMwLCBGMTBfNTE4MF81MjQwLCBGN181MjYwXzUzMjAsIEY0XzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwKKwkgICAgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDdfNTIxMF81MjEwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUNV81MjAwXzUyMDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCXtNS0syLCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0syIHwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYyXzQ5MTVfNDkyNSwgRjJfNDkzNV80OTQ1LCBGMV80OTIwXzQ5ODAsIEYxXzUwMzVfNTA0MCwKKwkgICAgRjJfNTA1NV81MDU1LCBGMV81MDQwXzUwODAsIEYxXzUxNzBfNTIzMCwgRjEwXzUxODBfNTI0MCwgLTEsIC0xLCAtMSwKKwkgICAgLTEpLAorCSBCTShUN181MjEwXzUyMTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQ1XzUyMDBfNTIwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJLyogVU5JLTEgZXZlbiAqLworCXtNS0szLCBNS0ssIE5PX0RGUywgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEY0XzUxODBfNTI0MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDlfNTIxMF81MjEwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MjAwXzUyMDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCS8qIFVOSS0xIGV2ZW4gKyBVTkktMiAqLworCXtNS0s0LCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0szLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDEwXzUyMTBfNTIxMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDZfNTIwMF81MjAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwkvKiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCAqLworCXtNS0s1LCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0szLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEY2XzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkgICAgLTEsIC0xLCAtMSksCisJIEJNKFQzXzUyMTBfNTI5MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDVfNTIwMF81MjgwLCBUM181NTQwXzU2NjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJLyogVU5JLTEgb2RkICsgZXZlbiAqLworCXtNS0s2LCBNS0ssIE5PX0RGUywgUFNDQU5fTUtLMSwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYyXzUxNzBfNTIzMCwgRjRfNTE4MF81MjQwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzUyMTBfNTIxMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDZfNTIwMF81MjAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwkvKiBVTkktMSBvZGQgKyBVTkktMSBldmVuICsgVU5JLTIgKi8KKwl7TUtLNywgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMl81MTcwXzUyMzAsIEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfNTIxMF81MjkwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUNV81MjAwXzUyODAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCS8qIFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kICovCisJe01LSzgsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjJfNTE3MF81MjMwLCBGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgRjZfNTUwMF81NzAwLCAtMSwgLTEsIC0xLAorCSAgICAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM181MjEwXzUyOTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQ1XzUyMDBfNTI4MCwgVDNfNTU0MF81NjYwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCS8qIFVOSS0xIGV2ZW4gKyA0LjkgR0haICovCisJe01LSzksIE1LSywgTk9fREZTLCBQU0NBTl9NS0syIHwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzQ5MTJfNDk0NywgRjFfNTAzMl81MDU3LCBGMV80OTE1XzQ5MjUsIEYxXzQ5MzVfNDk0NSwKKwkgICAgRjJfNDkyMF80OTgwLCBGMV81MDM1XzUwNDUsIEYxXzUwNTVfNTA1NSwgRjJfNTA0MF81MDgwLAorCSAgICBGNF81MTgwXzUyNDAsIC0xLCAtMSwgLTEpLAorCSBCTShUOV81MjEwXzUyMTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMDBfNTIwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJLyogVU5JLTEgZXZlbiArIFVOSS0yICsgNC45IEdIWiAqLworCXtNS0sxMCwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMiB8IFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV80OTEyXzQ5NDcsIEYxXzUwMzJfNTA1NywgRjFfNDkxNV80OTI1LCBGMV80OTM1XzQ5NDUsCisJICAgIEYyXzQ5MjBfNDk4MCwgRjFfNTAzNV81MDQ1LCBGMV81MDU1XzUwNTUsIEYyXzUwNDBfNTA4MCwKKwkgICAgRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIC0xLCAtMSksCisJIEJNKFQzXzUyMTBfNTI5MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIwMF81MjgwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIDQuOUdIeiAqLworCXtNS0sxMSwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzQ5MTJfNDk0NywgRjFfNTAzMl81MDU3LCBGMV80OTE1XzQ5MjUsIEYxXzQ5MzVfNDk0NSwKKwkgICAgRjJfNDkyMF80OTgwLCBGMV81MDM1XzUwNDUsIEYxXzUwNTVfNTA1NSwgRjJfNTA0MF81MDgwLAorCSAgICBGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgRjZfNTUwMF81NzAwLCAtMSksCisJIEJNKFQzXzUyMTBfNTI5MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIwMF81MjgwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBtaWQtYmFuZCArIDQuOUdIeiAqLworCXtNS0sxMiwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV80OTE1XzQ5MjUsIEYxXzQ5MzVfNDk0NSwgRjJfNDkyMF80OTgwLCBGMV81MDQwXzUwNDAsCisJICAgIEYxXzUwNTVfNTA1NSwgRjJfNTA0MF81MDgwLCBGMl81MTcwXzUyMzAsIEY0XzUxODBfNTI0MCwKKwkgICAgRjJfNTI2MF81MzIwLCBGNl81NTAwXzU3MDAsIC0xLCAtMSksCisJIEJNKFQzXzUyMTBfNTI5MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIwMF81MjgwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwkvKiBVTkktMSBvZGQgKyBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCAqLworCXtNS0sxMywgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMsCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMl81MTcwXzUyMzAsIEY3XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGNl81NTAwXzU3MDAsIC0xLCAtMSwgLTEsCisJICAgIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQ0hBTl9UVVJCT19HX0JNWkVST30sCisKKwkvKiBVTkktMSBvZGQgKyBVTkktMSBldmVuICsgNC45R0h6ICovCisJe01LSzE0LCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0sxLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNDkxNV80OTI1LCBGMV80OTM1XzQ5NDUsIEYyXzQ5MjBfNDk4MCwgRjFfNTA0MF81MDQwLAorCSAgICBGMl81MDQwXzUwODAsIEYxXzUwNTVfNTA1NSwgRjJfNTE3MF81MjMwLCBGNF81MTgwXzUyNDAsIC0xLCAtMSwgLTEsCisJICAgIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCS8qIFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOUdIeiAqLworCXtNS0sxNSwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV80OTE1XzQ5MjUsIEYxXzQ5MzVfNDk0NSwgRjJfNDkyMF80OTgwLCBGMV81MDQwXzUwNDAsCisJICAgIEYyXzUwNDBfNTA4MCwgRjFfNTA1NV81MDU1LCBGMl81MTcwXzUyMzAsIEY0XzUxODBfNTI0MCwKKwkgICAgRjJfNTI2MF81MzIwLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKKworCS8qPT09IDIgR0h6ID09PSovCisKKwkvKiBEZWZpbmVkIGhlcmUgdG8gdXNlIHdoZW4gMkcgY2hhbm5lbHMgYXJlIGF1dGhvcmlzZWQgZm9yIGNvdW50cnkgSzIgKi8KKwl7QVBMRCwgTk9fQ1RMLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIENIQU5fMTFBX0JNWkVSTworCSBDSEFOXzExQV9CTVpFUk8KKwkgQ0hBTl8xMUFfQk1aRVJPCisJIEJNKEYyXzIzMTJfMjM3MiwgRjRfMjQxMl8yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcyXzIzMTJfMjM3MiwgRzRfMjQxMl8yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIENIQU5fVFVSQk9fR19CTVpFUk99LAorCisJe0VUU0lBLCBOT19DVEwsIE5PX0RGUywgUFNDQU5fRVRTSUEsCisJIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBDSEFOXzExQV9CTVpFUk8gQ0hBTl8xMUFfQk1aRVJPIENIQU5fMTFBX0JNWkVSTyBCTShGMV8yNDU3XzI0NzIsIC0xLAorCQkJCQkJCSAgICAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJCQkJICAgIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcxXzI0NTdfMjQ3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQ0hBTl9UVVJCT19HX0JNKFQyXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkgLTEpfSwKKworCXtFVFNJQiwgRVRTSSwgTk9fREZTLCBQU0NBTl9FVFNJQiwKKwkgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIENIQU5fMTFBX0JNWkVSTyBDSEFOXzExQV9CTVpFUk8gQ0hBTl8xMUFfQk1aRVJPIEJNKEYxXzI0MzJfMjQ0MiwgLTEsCisJCQkJCQkJICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCQkgICAgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzFfMjQzMl8yNDQyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBDSEFOX1RVUkJPX0dfQk0oVDJfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCSAtMSl9LAorCisJe0VUU0lDLCBFVFNJLCBOT19ERlMsIFBTQ0FOX0VUU0lDLAorCSBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQ0hBTl8xMUFfQk1aRVJPIENIQU5fMTFBX0JNWkVSTyBDSEFOXzExQV9CTVpFUk8gQk0oRjNfMjQxMl8yNDcyLCAtMSwKKwkJCQkJCQkgICAgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJCSAgICAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHM18yNDEyXzI0NzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIENIQU5fVFVSQk9fR19CTShUMl8yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJIC0xKX0sCisKKwl7RkNDQSwgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIENIQU5fMTFBX0JNWkVSTworCSBDSEFOXzExQV9CTVpFUk8KKwkgQ0hBTl8xMUFfQk1aRVJPCisJIEJNKEYxXzI0MTJfMjQ2MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzFfMjQxMl8yNDYyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBDSEFOX1RVUkJPX0dfQk0oVDJfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCSAtMSl9LAorCisJe01LS0EsIE1LSywgTk9fREZTLAorCSBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HIHwgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HIHwgUFNDQU5fTUtLQTIgfAorCSBQU0NBTl9NS0tBMl9HLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQ0hBTl8xMUFfQk1aRVJPIENIQU5fMTFBX0JNWkVSTyBDSEFOXzExQV9CTVpFUk8gQk0oRjJfMjQxMl8yNDYyLAorCQkJCQkJCSAgICBGMV8yNDY3XzI0NzIsCisJCQkJCQkJICAgIEYyXzI0ODRfMjQ4NCwKKwkJCQkJCQkgICAgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJCSAgICAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcyXzI0MTJfMjQ3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQ0hBTl9UVVJCT19HX0JNKFQyXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkgLTEpfSwKKworCXtNS0tDLCBNS0ssIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQ0hBTl8xMUFfQk1aRVJPCisJIENIQU5fMTFBX0JNWkVSTworCSBDSEFOXzExQV9CTVpFUk8KKwkgQk0oRjJfMjQxMl8yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMl8yNDEyXzI0NzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIENIQU5fVFVSQk9fR19CTShUMl8yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJIC0xKX0sCisKKwl7V09STEQsIEVUU0ksIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQ0hBTl8xMUFfQk1aRVJPCisJIENIQU5fMTFBX0JNWkVSTworCSBDSEFOXzExQV9CTVpFUk8KKwkgQk0oRjRfMjQxMl8yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHNF8yNDEyXzI0NzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIENIQU5fVFVSQk9fR19CTShUMl8yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJIC0xKX0sCisKKwl7V09SMF9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX1BFUl8xMUQsCisJIENIQU5fMTFBX0JNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81NzQ1XzU4MjUsIFcxXzU1MDBfNTcwMCwKKwkJICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpCisJIENIQU5fMTFBX0JNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsCisJCSAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSkKKwkgQ0hBTl8xMUFfQk1aRVJPCisJIEJNKFcxXzI0MTJfMjQxMiwgVzFfMjQzN18yNDQyLCBXMV8yNDYyXzI0NjIsIFcxXzI0NzJfMjQ3MiwKKwkgICAgVzFfMjQxN18yNDMyLAorCSAgICBXMV8yNDQ3XzI0NTcsIFcxXzI0NjdfMjQ2NywgVzFfMjQ4NF8yNDg0LCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0NzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIENIQU5fVFVSQk9fR19CTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJIC0xKX0sCisKKwl7V09SMDFfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19QRVJfMTFELAorCSBDSEFOXzExQV9CTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTE3MF81MjMwLCBXMV81NzQ1XzU4MjUsCisJCSAgICAgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSkKKwkgQ0hBTl8xMUFfQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwKKwkJICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKQorCSBDSEFOXzExQV9CTVpFUk8KKwkgQk0oVzFfMjQxMl8yNDEyLCBXMV8yNDM3XzI0NDIsIFcxXzI0NjJfMjQ2MiwgVzFfMjQxN18yNDMyLAorCSAgICBXMV8yNDQ3XzI0NTcsCisJICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQ2MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQ0hBTl9UVVJCT19HX0JNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkgLTEpfSwKKworCXtXT1IwMl9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX1BFUl8xMUQsCisJIENIQU5fMTFBX0JNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwKKwkJICAgICBXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKQorCSBDSEFOXzExQV9CTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLAorCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpCisJIENIQU5fMTFBX0JNWkVSTworCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDcyXzI0NzIsCisJICAgIFcxXzI0MTdfMjQzMiwKKwkgICAgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0NzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIENIQU5fVFVSQk9fR19CTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJIC0xKX0sCisKKwl7RVUxX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfUEVSXzExRCwKKwkgQ0hBTl8xMUFfQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsIFcxXzUxNzBfNTIzMCwgVzFfNTc0NV81ODI1LAorCQkgICAgIFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpCisJIENIQU5fMTFBX0JNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsCisJCSAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSkKKwkgQ0hBTl8xMUFfQk1aRVJPCisJIEJNKFcxXzI0MTJfMjQxMiwgVzFfMjQzN18yNDQyLCBXMV8yNDYyXzI0NjIsIFcyXzI0NzJfMjQ3MiwKKwkgICAgVzFfMjQxN18yNDMyLAorCSAgICBXMV8yNDQ3XzI0NTcsIFcyXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cyXzI0MTJfMjQ3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQ0hBTl9UVVJCT19HX0JNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkgLTEpfSwKKworCXtXT1IxX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfTk9fMTFBLAorCSBDSEFOXzExQV9CTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTE3MF81MjMwLCBXMV81NzQ1XzU4MjUsCisJCSAgICAgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSkKKwkgQ0hBTl8xMUFfQk1aRVJPCisJIENIQU5fMTFBX0JNWkVSTworCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDcyXzI0NzIsCisJICAgIFcxXzI0MTdfMjQzMiwKKwkgICAgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIFcxXzI0ODRfMjQ4NCwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBDSEFOX1RVUkJPX0dfQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCSAtMSl9LAorCisJe1dPUjJfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIENIQU5fMTFBX0JNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwKKwkJICAgICBXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKQorCSBDSEFOXzExQV9CTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLAorCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpCisJIENIQU5fMTFBX0JNWkVSTworCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDcyXzI0NzIsCisJICAgIFcxXzI0MTdfMjQzMiwKKwkgICAgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIFcxXzI0ODRfMjQ4NCwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBDSEFOX1RVUkJPX0dfQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCSAtMSl9LAorCisJe1dPUjNfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19QRVJfMTFELAorCSBDSEFOXzExQV9CTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTE3MF81MjMwLCBXMV81NzQ1XzU4MjUsCisJCSAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKQorCSBDSEFOXzExQV9CTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLAorCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpCisJIENIQU5fMTFBX0JNWkVSTworCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDcyXzI0NzIsCisJICAgIFcxXzI0MTdfMjQzMiwKKwkgICAgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0NzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIENIQU5fVFVSQk9fR19CTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJIC0xKX0sCisKKwl7V09SNF9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX05PXzExQSwKKwkgQ0hBTl8xMUFfQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsIFcxXzU3NDVfNTgyNSwKKwkJICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKQorCSBDSEFOXzExQV9CTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLAorCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpCisJIENIQU5fMTFBX0JNWkVSTworCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDE3XzI0MzIsCisJICAgIFcxXzI0NDdfMjQ1NywKKwkgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDYyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBDSEFOX1RVUkJPX0dfQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCSAtMSl9LAorCisJe1dPUjVfRVRTSUMsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIENIQU5fMTFBX0JNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81NzQ1XzU4MjUsCisJCSAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSkKKwkgQ0hBTl8xMUFfQk1aRVJPCisJIENIQU5fMTFBX0JNWkVSTworCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDcyXzI0NzIsCisJICAgIFcxXzI0MTdfMjQzMiwKKwkgICAgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0NzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIENIQU5fVFVSQk9fR19CTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJIC0xKX0sCisKKwl7V09SOV9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX05PXzExQSwKKwkgQ0hBTl8xMUFfQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsIFcxXzU3NDVfNTgyNSwgVzFfNTUwMF81NzAwLAorCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSkKKwkgQ0hBTl8xMUFfQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwKKwkJICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKQorCSBDSEFOXzExQV9CTVpFUk8KKwkgQk0oVzFfMjQxMl8yNDEyLCBXMV8yNDM3XzI0NDIsIFcxXzI0NjJfMjQ2MiwgVzFfMjQxN18yNDMyLAorCSAgICBXMV8yNDQ3XzI0NTcsCisJICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQ2MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQ0hBTl9UVVJCT19HX0JNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkgLTEpfSwKKworCXtXT1JBX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfTk9fMTFBLAorCSBDSEFOXzExQV9CTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTc0NV81ODI1LCBXMV81NTAwXzU3MDAsCisJCSAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKQorCSBDSEFOXzExQV9CTVpFUk8KKwkgQ0hBTl8xMUFfQk1aRVJPCisJIEJNKFcxXzI0MTJfMjQxMiwgVzFfMjQzN18yNDQyLCBXMV8yNDYyXzI0NjIsIFcxXzI0NzJfMjQ3MiwKKwkgICAgVzFfMjQxN18yNDMyLAorCSAgICBXMV8yNDQ3XzI0NTcsIFcxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQ3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQ0hBTl9UVVJCT19HX0JNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkgLTEpfSwKKworCXtXT1JCX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfTk9fMTFBLAorCSBDSEFOXzExQV9CTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTUwMF81NzAwLAorCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpCisJIENIQU5fMTFBX0JNWkVSTworCSBDSEFOXzExQV9CTVpFUk8KKwkgQk0oVzFfMjQxMl8yNDEyLCBXMV8yNDM3XzI0NDIsIFcxXzI0NjJfMjQ2MiwgVzFfMjQ3Ml8yNDcyLAorCSAgICBXMV8yNDE3XzI0MzIsCisJICAgIFcxXzI0NDdfMjQ1NywgVzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBDSEFOX1RVUkJPX0dfQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCSAtMSl9LAorCisJe1dPUkNfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19QRVJfMTFELAorCSBDSEFOXzExQV9CTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTUwMF81NzAwLCBXMV81NzQ1XzU4MjUsCisJCSAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKQorCSBDSEFOXzExQV9CTVpFUk8KKwkgQ0hBTl8xMUFfQk1aRVJPCisJIEJNKFcxXzI0MTJfMjQxMiwgVzFfMjQzN18yNDQyLCBXMV8yNDYyXzI0NjIsIFcxXzI0NzJfMjQ3MiwKKwkgICAgVzFfMjQxN18yNDMyLAorCSAgICBXMV8yNDQ3XzI0NTcsIFcxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQ3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQ0hBTl9UVVJCT19HX0JNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkgLTEpfSwKKworCXtOVUxMMSwgTk9fQ1RMLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIENIQU5fMTFBX0JNWkVSTyBDSEFOXzExQV9CTVpFUk8gQ0hBTl8xMUFfQk1aRVJPIEJNWkVSTywKKwkgQk1aRVJPLAorCSBDSEFOX1RVUkJPX0dfQk1aRVJPfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY21vZGUgbW9kZXNbXSA9IHsKKwl7UkVHRE1OX01PREVfVFVSQk8sIElFRUU4MDIxMV9DSEFOX1NUfSwgLyogVFVSQk8gbWVhbnMgMTFhIFN0YXRpYyBUdXJibyAqLworCXtSRUdETU5fTU9ERV8xMUEsIElFRUU4MDIxMV9DSEFOX0F9LAorCXtSRUdETU5fTU9ERV8xMUIsIElFRUU4MDIxMV9DSEFOX0J9LAorCXtSRUdETU5fTU9ERV8xMUcsIElFRUU4MDIxMV9DSEFOX1BVUkVHfSwKKwl7UkVHRE1OX01PREVfMTFHX1RVUkJPLCBJRUVFODAyMTFfQ0hBTl8xMDhHfSwKKwl7UkVHRE1OX01PREVfMTFBX1RVUkJPLCBJRUVFODAyMTFfQ0hBTl8xMDhBfSwKKwl7UkVHRE1OX01PREVfMTFOR19IVDIwLCBJRUVFODAyMTFfQ0hBTl8xMU5HX0hUMjB9LAorCXtSRUdETU5fTU9ERV8xMU5HX0hUNDBQTFVTLCBJRUVFODAyMTFfQ0hBTl8xMU5HX0hUNDBQTFVTfSwKKwl7UkVHRE1OX01PREVfMTFOR19IVDQwTUlOVVMsIElFRUU4MDIxMV9DSEFOXzExTkdfSFQ0ME1JTlVTfSwKKwl7UkVHRE1OX01PREVfMTFOQV9IVDIwLCBJRUVFODAyMTFfQ0hBTl8xMU5BX0hUMjB9LAorCXtSRUdETU5fTU9ERV8xMU5BX0hUNDBQTFVTLCBJRUVFODAyMTFfQ0hBTl8xMU5BX0hUNDBQTFVTfSwKKwl7UkVHRE1OX01PREVfMTFOQV9IVDQwTUlOVVMsIElFRUU4MDIxMV9DSEFOXzExTkFfSFQ0ME1JTlVTfSwKKwl7UkVHRE1OX01PREVfMTFBQ19WSFQyMCwgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQyMH0sCisJe1JFR0RNTl9NT0RFXzExQUNfVkhUNDBQTFVTLCBJRUVFODAyMTFfQ0hBTl8xMUFDX1ZIVDQwUExVU30sCisJe1JFR0RNTl9NT0RFXzExQUNfVkhUNDBNSU5VUywgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQ0ME1JTlVTfSwKKwl7UkVHRE1OX01PREVfMTFBQ19WSFQ4MCwgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQ4MH0sCisJe1JFR0RNTl9NT0RFXzExQUNfVkhUMjBfMkcsIElFRUU4MDIxMV9DSEFOXzExQUNfVkhUMjBfMkd9LAorCXtSRUdETU5fTU9ERV8xMUFDX1ZIVDQwXzJHLCBJRUVFODAyMTFfQ0hBTl8xMUFDX1ZIVDQwXzJHfSwKKwl7UkVHRE1OX01PREVfMTFBQ19WSFQ4MF8yRywgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQ4MF8yR30sCit9OworCit0eXBlZGVmIGVudW0gb2Zmc2V0IHsKKwlCVzIwID0gMCwKKwlCVzQwX0xPV19QUklNQVJZID0gMSwKKwlCVzQwX0hJR0hfUFJJTUFSWSA9IDMsCisJQlc4MCwKKwlCV0FMTAorfSBvZmZzZXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX3JlZ2RtX29wX2NsYXNzX21hcCB7CisJdWludDhfdCBvcF9jbGFzczsKKwl1aW50OF90IGNoX3NwYWNpbmc7CisJb2Zmc2V0X3Qgb2Zmc2V0OworCXVpbnQ4X3QgY2hhbm5lbHNbTUFYX0NIQU5ORUxTX1BFUl9PUEVSQVRJTkdfQ0xBU1NdOworfSByZWdkbV9vcF9jbGFzc19tYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX3JlZ2RtX3N1cHBfb3BfY2xhc3NlcyB7CisJdWludDhfdCBudW1fY2xhc3NlczsKKwl1aW50OF90IGNsYXNzZXNbU0lSX01BQ19NQVhfU1VQUF9PUEVSX0NMQVNTRVNdOworfSByZWdkbV9zdXBwX29wX2NsYXNzZXM7CisKK3VpbnQxNl90IGNkc19yZWdkbV9nZXRfb3BjbGFzc19mcm9tX2NoYW5uZWwodWludDhfdCAqY291bnRyeSwgdWludDhfdCBjaGFubmVsLAorCQkJCQkgICAgdWludDhfdCBvZmZzZXQpOwordWludDE2X3QgY2RzX3JlZ2RtX3NldF9jdXJyX29wY2xhc3Nlcyh1aW50OF90IG51bV9jbGFzc2VzLCB1aW50OF90ICpjbGFzcyk7Cit1aW50MTZfdCBjZHNfcmVnZG1fZ2V0X2N1cnJfb3BjbGFzc2VzKHVpbnQ4X3QgKm51bV9jbGFzc2VzLCB1aW50OF90ICpjbGFzcyk7CmRpZmYgLS1naXQgYS9jb3JlL2Nkcy9pbmMvY2RzX3NjaGVkLmggYi9jb3JlL2Nkcy9pbmMvY2RzX3NjaGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhY2JkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RzL2luYy9jZHNfc2NoZWQuaApAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKCBfX0NEU19TQ0hFRF9IICkKKyNkZWZpbmUgX19DRFNfU0NIRURfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICBjZHNfc2NoZWQuaAorCisgICBcYnJpZWYgQ29ubmVjdGl2aXR5IGRyaXZlciBzZXJ2aWNlcyBzY2hlZHVsZXIKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBGaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxjZGZfZXZlbnQuaD4KKyNpbmNsdWRlICJpX2NkZl90eXBlcy5oIgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpZiBkZWZpbmVkKFdMQU5fT1BFTl9TT1VSQ0UpICYmIGRlZmluZWQoQ09ORklHX0hBU19XQUtFTE9DSykKKyNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y2RzX21xLmg+CisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSAiY2RmX2xvY2suaCIKKworI2RlZmluZSBUWF9QT1NUX0VWRU5UX01BU0sgICAgICAgICAgICAgICAweDAwMQorI2RlZmluZSBUWF9TVVNQRU5EX0VWRU5UX01BU0sgICAgICAgICAgICAweDAwMgorI2RlZmluZSBNQ19QT1NUX0VWRU5UX01BU0sgICAgICAgICAgICAgICAweDAwMQorI2RlZmluZSBNQ19TVVNQRU5EX0VWRU5UX01BU0sgICAgICAgICAgICAweDAwMgorI2RlZmluZSBSWF9QT1NUX0VWRU5UX01BU0sgICAgICAgICAgICAgICAweDAwMQorI2RlZmluZSBSWF9TVVNQRU5EX0VWRU5UX01BU0sgICAgICAgICAgICAweDAwMgorI2RlZmluZSBUWF9TSFVURE9XTl9FVkVOVF9NQVNLICAgICAgICAgICAweDAxMAorI2RlZmluZSBNQ19TSFVURE9XTl9FVkVOVF9NQVNLICAgICAgICAgICAweDAxMAorI2RlZmluZSBSWF9TSFVURE9XTl9FVkVOVF9NQVNLICAgICAgICAgICAweDAxMAorI2RlZmluZSBXRF9QT1NUX0VWRU5UX01BU0sgICAgICAgICAgICAgICAweDAwMQorI2RlZmluZSBXRF9TSFVURE9XTl9FVkVOVF9NQVNLICAgICAgICAgICAweDAwMgorI2RlZmluZSBXRF9DSElQX1JFU0VUX0VWRU5UX01BU0sgICAgICAgICAweDAwNAorI2RlZmluZSBXRF9XTEFOX1NIVVRET1dOX0VWRU5UX01BU0sgICAgICAweDAwOAorI2RlZmluZSBXRF9XTEFOX1JFSU5JVF9FVkVOVF9NQVNLICAgICAgICAweDAxMAorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgaW4gdGhlIHN5c3RlbQorICogVGhlc2UgYXJlIGJ1ZmZlcnMgdG8gYWNjb3VudCBmb3IgYWxsIGN1cnJlbnQgbWVzc2FnZXMKKyAqIHdpdGggc29tZSBhY2NvdW50aW5nIG9mIHdoYXQgd2UgdGhpbmsgaXMgYQorICogd29yc3QtY2FzZSBzY2VuYXJpby4gIE11c3QgYmUgYWJsZSB0byBoYW5kbGUgYWxsCisgKiBpbmNvbWluZyBmcmFtZXMsIGFzIHdlbGwgYXMgb3ZlcmhlYWQgZm9yIGludGVybmFsCisgKiBtZXNzYWdpbmcKKyAqCisgKiBJbmNyZWFzZWQgdG8gODAwMCB0byBoYW5kbGUgbW9yZSBSWCBmcmFtZXMKKyAqLworI2RlZmluZSBDRFNfQ09SRV9NQVhfTUVTU0FHRVMgODAwMAorCisjaWZkZWYgUUNBX0NPTkZJR19TTVAKKy8qCisqKiBNYXhpbXVtIG51bWJlciBvZiBjZHMgbWVzc2FnZXMgdG8gYmUgYWxsb2NhdGVkIGZvcgorKiogT0wgUnggdGhyZWFkLgorKi8KKyNkZWZpbmUgQ0RTX01BWF9PTF9SWF9QS1QgNDAwMAorCit0eXBlZGVmIHZvaWQgKCpjZHNfb2xfcnhfdGhyZWFkX2NiKSh2b2lkICpjb250ZXh0LCB2b2lkICpyeHBrdCwgdWludDE2X3Qgc3RhaWQpOworI2VuZGlmCisKKy8qCisqKiBDREYgTWVzc2FnZSBxdWV1ZSBkZWZpbml0aW9uLgorKi8KK3R5cGVkZWYgc3RydWN0IF9jZHNfbXFfdHlwZSB7CisJLyogTG9jayB1c2UgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoaXMgbWVzc2FnZSBxdWV1ZSAqLworCXNwaW5sb2NrX3QgbXFMb2NrOworCisJLyogTGlzdCBvZiB2T1MgTWVzc2FnZXMgd2FpdGluZyBvbiB0aGlzIHF1ZXVlICovCisJc3RydWN0IGxpc3RfaGVhZCBtcUxpc3Q7CisKK30gY2RzX21xX3R5cGUsICpwX2Nkc19tcV90eXBlOworCisjaWZkZWYgUUNBX0NPTkZJR19TTVAKKy8qCisqKiBDRFMgbWVzc2FnZSB3cmFwcGVyIGZvciBkYXRhIHJ4IGZyb20gVFhSWAorKi8KK3N0cnVjdCBjZHNfb2xfcnhfcGt0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdm9pZCAqY29udGV4dDsKKworCS8qIFJ4IHNrYiAqLworCXZvaWQgKlJ4cGt0OworCisJLyogU3RhdGlvbiBpZCB0byB3aGljaCB0aGlzIHBhY2tldCBpcyBkZXN0aW5lZCAqLworCXVpbnQxNl90IHN0YUlkOworCisJLyogQ2FsbCBiYWNrIHRvIGZ1cnRoZXIgc2VuZCB0aGlzIHBhY2tldCB0byB0eHJ4IGxheWVyICovCisJY2RzX29sX3J4X3RocmVhZF9jYiBjYWxsYmFjazsKKworfTsKKyNlbmRpZgorCisvKgorKiogQ0RTIFNjaGVkdWxlciBjb250ZXh0CisqKiBUaGUgc2NoZWR1bGVyIGNvbnRleHQgY29udGFpbnMgdGhlIGZvbGxvd2luZzoKKyoqICAgKiogdGhlIG1lc3NhZ2VzIHF1ZXVlcworKiogICAqKiB0aGUgaGFuZGxlIHRvIHRoZSB0cmVhZAorKiogICAqKiBwb2ludGVyIHRvIHRoZSBldmVudHMgdGhhdCBncmFjZWZ1bGx5IHNodXRkb3duIHRoZSBNQyBhbmQgVHggdGhyZWFkcworKioKKyovCit0eXBlZGVmIHN0cnVjdCBfY2RzX3NjaGVkX2NvbnRleHQgeworCS8qIFBsYWNlIGhvbGRlciB0byB0aGUgQ0RTIENvbnRleHQgKi8KKwl2b2lkICpwVkNvbnRleHQ7CisJLyogV01BIE1lc3NhZ2UgcXVldWUgb24gdGhlIE1haW4gdGhyZWFkICovCisJY2RzX21xX3R5cGUgd21hTWNNcTsKKworCS8qIFBFIE1lc3NhZ2UgcXVldWUgb24gdGhlIE1haW4gdGhyZWFkICovCisJY2RzX21xX3R5cGUgcGVNY01xOworCisJLyogU01FIE1lc3NhZ2UgcXVldWUgb24gdGhlIE1haW4gdGhyZWFkICovCisJY2RzX21xX3R5cGUgc21lTWNNcTsKKworCS8qIFNZUyBNZXNzYWdlIHF1ZXVlIG9uIHRoZSBNYWluIHRocmVhZCAqLworCWNkc19tcV90eXBlIHN5c01jTXE7CisKKwkvKiBIYW5kbGUgb2YgRXZlbnQgZm9yIE1DIHRocmVhZCB0byBzaWduYWwgc3RhcnR1cCAqLworCXN0cnVjdCBjb21wbGV0aW9uIE1jU3RhcnRFdmVudDsKKworCXN0cnVjdCB0YXNrX3N0cnVjdCAqTWNUaHJlYWQ7CisKKwkvKiBjb21wbGV0aW9uIG9iamVjdCBmb3IgTUMgdGhyZWFkIHNodXRkb3duICovCisJc3RydWN0IGNvbXBsZXRpb24gTWNTaHV0ZG93bjsKKworCS8qIFdhaXQgcXVldWUgZm9yIE1DIHRocmVhZCAqLworCXdhaXRfcXVldWVfaGVhZF90IG1jV2FpdFF1ZXVlOworCisJdW5zaWduZWQgbG9uZyBtY0V2ZW50RmxhZzsKKworCS8qIENvbXBsZXRpb24gb2JqZWN0IHRvIHJlc3VtZSBNYyB0aHJlYWQgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBSZXN1bWVNY0V2ZW50OworCisJLyogbG9jayB0byBtYWtlIHN1cmUgdGhhdCBNY1RocmVhZCBzdXNwZW5kL3Jlc3VtZSBtZWNoYW5pc20gaXMgaW4gc3luYyAqLworCXNwaW5sb2NrX3QgTWNUaHJlYWRMb2NrOworI2lmZGVmIFFDQV9DT05GSUdfU01QCisJc3BpbmxvY2tfdCBvbF9yeF90aHJlYWRfbG9jazsKKworCS8qIE9MIFJ4IHRocmVhZCBoYW5kbGUgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9sX3J4X3RocmVhZDsKKworCS8qIEhhbmRsZSBvZiBFdmVudCBmb3IgUnggdGhyZWFkIHRvIHNpZ25hbCBzdGFydHVwICovCisJc3RydWN0IGNvbXBsZXRpb24gb2xfcnhfc3RhcnRfZXZlbnQ7CisKKwkvKiBDb21wbGV0aW9uIG9iamVjdCB0byBzdXNwZW5kIE9MIHJ4IHRocmVhZCAqLworCXN0cnVjdCBjb21wbGV0aW9uIG9sX3N1c3BlbmRfcnhfZXZlbnQ7CisKKwkvKiBDb21wbGV0aW9uIG9iamV4dCB0byByZXN1bWUgT0wgcnggdGhyZWFkICovCisJc3RydWN0IGNvbXBsZXRpb24gb2xfcmVzdW1lX3J4X2V2ZW50OworCisJLyogQ29tcGxldGlvbiBvYmplY3QgZm9yIE9MIFJ4dGhyZWFkIHNodXRkb3duICovCisJc3RydWN0IGNvbXBsZXRpb24gb2xfcnhfc2h1dGRvd247CisKKwkvKiBXYWl0cSBmb3IgT0wgUnggdGhyZWFkICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgb2xfcnhfd2FpdF9xdWV1ZTsKKworCXVuc2lnbmVkIGxvbmcgb2xfcnhfZXZlbnRfZmxhZzsKKworCS8qIFJ4IGJ1ZmZlciBxdWV1ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgb2xfcnhfdGhyZWFkX3F1ZXVlOworCisJLyogU3BpbmxvY2sgdG8gc3luY2hyb25pemUgYmV0d2VlbiB0YXNrbGV0IGFuZCB0aHJlYWQgKi8KKwlzcGlubG9ja190IG9sX3J4X3F1ZXVlX2xvY2s7CisKKwkvKiBSeCBxdWV1ZSBsZW5ndGggKi8KKwl1bnNpZ25lZCBpbnQgb2xfcnhfcXVldWVfbGVuOworCisJLyogTG9jayB0byBzeW5jaHJvbml6ZSBmcmVlIGJ1ZmZlciBxdWV1ZSBhY2Nlc3MgKi8KKwlzcGlubG9ja190IGNkc19vbF9yeF9wa3RfZnJlZXFfbG9jazsKKworCS8qIEZyZWUgbWVzc2FnZSBxdWV1ZSBmb3IgT0wgUnggcHJvY2Vzc2luZyAqLworCXN0cnVjdCBsaXN0X2hlYWQgY2RzX29sX3J4X3BrdF9mcmVlcTsKKworCS8qIGNwdSBob3RwbHVnIG5vdGlmaWVyICovCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpjcHVfaG90X3BsdWdfbm90aWZpZXI7CisjZW5kaWYKK30gY2RzX3NjaGVkX2NvbnRleHQsICpwX2Nkc19zY2hlZF9jb250ZXh0OworCisvKioKKyAqIHN0cnVjdCBjZHNfbG9nX2NvbXBsZXRlIC0gTG9nIGNvbXBsZXRpb24gaW50ZXJuYWwgc3RydWN0dXJlCisgKiBAaXNfZmF0YWw6IFR5cGUgaXMgZmF0YWwgb3Igbm90CisgKiBAaW5kaWNhdG9yOiBTb3VyY2Ugb2YgYnVnIHJlcG9ydAorICogQHJlYXNvbl9jb2RlOiBSZWFzb24gY29kZSBmb3IgYnVnIHJlcG9ydAorICogQGlzX3JlcG9ydF9pbl9wcm9ncmVzczogSWYgYnVnIHJlcG9ydCBpcyBpbiBwcm9ncmVzcworICoKKyAqIFRoaXMgc3RydWN0dXJlIGludGVybmFsbHkgc3RvcmVzIHRoZSBsb2cgcmVsYXRlZCBwYXJhbXMKKyAqLworc3RydWN0IGNkc19sb2dfY29tcGxldGUgeworCXVpbnQzMl90IGlzX2ZhdGFsOworCXVpbnQzMl90IGluZGljYXRvcjsKKwl1aW50MzJfdCByZWFzb25fY29kZTsKKwlib29sIGlzX3JlcG9ydF9pbl9wcm9ncmVzczsKK307CisKKy8qCisqKiBDRFMgU2NoZWQgTXNnIFdyYXBwZXIKKyoqIFdyYXBwZXIgbWVzc2FnZXMgc28gdGhhdCB0aGV5IGNhbiBiZSBjaGFpbmVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgcXVldWUKKyoqIGluIHRoZSBzY2hlZHVsZXIuCisqLwordHlwZWRlZiBzdHJ1Y3QgX2Nkc19tc2dfd3JhcHBlciB7CisJLyogTWVzc2FnZSBub2RlICovCisJc3RydWN0IGxpc3RfaGVhZCBtc2dOb2RlOworCisJLyogdGhlIFZvcyBtZXNzYWdlIGl0IGlzIGFzc29jaWF0ZWQgdG8gKi8KKwljZHNfbXNnX3QgKnBWb3NNc2c7CisKK30gY2RzX21zZ193cmFwcGVyLCAqcF9jZHNfbXNnX3dyYXBwZXI7CisKK3R5cGVkZWYgc3RydWN0IF9jZHNfY29udGV4dF90eXBlIHsKKwkvKiBNZXNzYWdlcyBidWZmZXJzICovCisJY2RzX21zZ190IGFNc2dCdWZmZXJzW0NEU19DT1JFX01BWF9NRVNTQUdFU107CisKKwljZHNfbXNnX3dyYXBwZXIgYU1zZ1dyYXBwZXJzW0NEU19DT1JFX01BWF9NRVNTQUdFU107CisKKwkvKiBGcmVlIE1lc3NhZ2UgcXVldWUgKi8KKwljZHNfbXFfdHlwZSBmcmVlVm9zTXE7CisKKwkvKiBTY2hlZHVsZXIgQ29udGV4dCAqLworCWNkc19zY2hlZF9jb250ZXh0IGNkZl9zY2hlZDsKKworCS8qIEhERCBNb2R1bGUgQ29udGV4dCAgKi8KKwl2b2lkICpwSEREQ29udGV4dDsKKworCS8qIE1BQyBNb2R1bGUgQ29udGV4dCAgKi8KKwl2b2lkICpwTUFDQ29udGV4dDsKKworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJLyogU0FQIENvbnRleHQgKi8KKwl2b2lkICpwU0FQQ29udGV4dDsKKyNlbmRpZgorCisJY2RmX2V2ZW50X3QgUHJvYmVFdmVudDsKKworCXZvbGF0aWxlIHVpbnQ4X3QgaXNMb2dwSW5Qcm9ncmVzczsKKworCWNkZl9ldmVudF90IHdtYUNvbXBsZXRlRXZlbnQ7CisKKwkvKiBXTUEgQ29udGV4dCAqLworCXZvaWQgKnBXTUFDb250ZXh0OworCisJdm9pZCAqcEhJRkNvbnRleHQ7CisKKwl2b2lkICpodGNfY3R4OworCisJdm9pZCAqZXBwaW5nX2N0eDsKKwkvKgorCSAqIGNkZl9jdHggd2lsbCBiZSB1c2VkIGJ5IGNkZgorCSAqIHdoaWxlIGFsbG9jYXRpbmcgZG1hIG1lbW9yeQorCSAqIHRvIGFjY2VzcyBkZXYgaW5mb3JtYXRpb24uCisJICovCisJY2RmX2RldmljZV90IGNkZl9jdHg7CisKKwl2b2lkICpwZGV2X3R4cnhfY3R4OworCisJLyogQ29uZmlndXJhdGlvbiBoYW5kbGUgdXNlZCB0byBnZXQgc3lzdGVtIGNvbmZpZ3VyYXRpb24gKi8KKwl2b2lkICpjZmdfY3R4OworCisJdm9sYXRpbGUgdWludDhfdCBpc0xvYWRVbmxvYWRJblByb2dyZXNzOworCisJYm9vbCBpc193YWtlbG9ja19sb2dfZW5hYmxlZDsKKwl1aW50MzJfdCB3YWtlbG9ja19sb2dfbGV2ZWw7CisJdWludDMyX3QgY29ubmVjdGl2aXR5X2xvZ19sZXZlbDsKKwl1aW50MzJfdCBwYWNrZXRfc3RhdHNfbG9nX2xldmVsOworCXVpbnQzMl90IGRyaXZlcl9kZWJ1Z19sb2dfbGV2ZWw7CisJdWludDMyX3QgZndfZGVidWdfbG9nX2xldmVsOworCXN0cnVjdCBjZHNfbG9nX2NvbXBsZXRlIGxvZ19jb21wbGV0ZTsKKwljZGZfc3BpbmxvY2tfdCBidWdfcmVwb3J0X2xvY2s7CisJY2RmX2V2ZW50X3QgY29ubmVjdGlvbl91cGRhdGVfZG9uZV9ldnQ7CisKK30gY2RzX2NvbnRleHRfdHlwZSwgKnBfY2RzX2NvbnRleHRUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBRQ0FfQ09ORklHX1NNUAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBjZHNfZHJvcF9yeHBrdF9ieV9zdGFpZCgpIC0gQVBJIHRvIGRyb3AgcGVuZGluZyBSeCBwYWNrZXRzIGZvciBhIHN0YQorICAgVGhlIFxhIGNkc19kcm9wX3J4cGt0X2J5X3N0YWlkKCkgZHJvcHMgcXVldWVkIHBhY2tldHMgZm9yIGEgc3RhdGlvbiwgdG8gZHJvcAorICAgYWxsIHRoZSBwZW5kaW5nIHBhY2tldHMgdGhlIGNhbGxlciBoYXMgdG8gc2VuZCBXTEFOX01BWF9TVEFfQ09VTlQgYXMgc3RhSWQuCisgICBccGFyYW0gIHBTY2hlZENvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgQ0RTIFNjaGVkIENvbnRleHQKKyAgIFxwYXJhbSBzdGFJZCAtIFN0YXRpb24gSWQKKworICAgXHJldHVybiBOb3RoaW5nCisgICBcc2EgY2RzX2Ryb3Bfcnhwa3RfYnlfc3RhaWQoKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNkc19kcm9wX3J4cGt0X2J5X3N0YWlkKHBfY2RzX3NjaGVkX2NvbnRleHQgcFNjaGVkQ29udGV4dCwgdWludDE2X3Qgc3RhSWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIGNkc19pbmRpY2F0ZV9yeHBrdCgpIC0gQVBJIHRvIEluZGljYXRlIHJ4IGRhdGEgcGFja2V0CisgICBUaGUgXGEgY2RzX2luZGljYXRlX3J4cGt0KCkgZW5xdWV1ZXMgdGhlIHJ4IHBhY2tldCBvbnRvIG9sX3J4X3RocmVhZF9xdWV1ZQorICAgYW5kIG5vdGlmaWVzIGNkc19vbF9yeF90aHJlYWQoKS4KKyAgIFxwYXJhbSAgQXJnIC0gcG9pbnRlciB0byB0aGUgZ2xvYmFsIENEUyBTY2hlZCBDb250ZXh0CisgICBccGFyYW0gcGt0IC0gVm9zIGRhdGEgbWVzc2FnZSBidWZmZXIKKworICAgXHJldHVybiBOb3RoaW5nCisgICBcc2EgY2RzX2luZGljYXRlX3J4cGt0KCkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjZHNfaW5kaWNhdGVfcnhwa3QocF9jZHNfc2NoZWRfY29udGV4dCBwU2NoZWRDb250ZXh0LAorCQkJc3RydWN0IGNkc19vbF9yeF9wa3QgKnBrdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgY2RzX2FsbG9jX29sX3J4X3BrdCgpIC0gQVBJIHRvIHJldHVybiBuZXh0IGF2YWlsYWJsZSBjZHMgbWVzc2FnZQorICAgVGhlIFxhIGNkc19hbGxvY19vbF9yeF9wa3QoKSByZXR1cm5zIG5leHQgYXZhaWxhYmxlIGNkcyBtZXNzYWdlIGJ1ZmZlcgorICAgdXNlZCBmb3IgUnggRGF0YSBwcm9jZXNzaW5nLgorICAgXHBhcmFtIHBTY2hlZENvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgQ0RTIFNjaGVkIENvbnRleHQKKworICAgXHJldHVybiBwb2ludGVyIHRvIGNkcyBtZXNzYWdlIGJ1ZmZlcgorICAgXHNhIGNkc19hbGxvY19vbF9yeF9wa3QoKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdHJ1Y3QgY2RzX29sX3J4X3BrdCAqY2RzX2FsbG9jX29sX3J4X3BrdChwX2Nkc19zY2hlZF9jb250ZXh0IHBTY2hlZENvbnRleHQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIGNkc19mcmVlX29sX3J4X3BrdCgpIC0gQVBJIHRvIHJlbGVhc2UgY2RzIG1lc3NhZ2UgdG8gdGhlIGZyZWVxCisgICBUaGUgXGEgY2RzX2ZyZWVfb2xfcnhfcGt0KCkgcmV0dXJucyB0aGUgY2RzIG1lc3NhZ2UgdXNlZCBmb3IgUnggZGF0YQorICAgdG8gdGhlIGZyZWUgcXVldWUuCisgICBccGFyYW0gIHBTY2hlZENvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgQ0RTIFNjaGVkIENvbnRleHQKKyAgIFxwYXJhbSAgcGt0IC0gVm9zIG1lc3NhZ2UgYnVmZmVyIHRvIGJlIHJldHVybmVkIHRvIGZyZWUgcXVldWUuCisKKyAgIFxyZXR1cm4gTm90aGluZworICAgXHNhIGNkc19mcmVlX29sX3J4X3BrdCgpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY2RzX2ZyZWVfb2xfcnhfcGt0KHBfY2RzX3NjaGVkX2NvbnRleHQgcFNjaGVkQ29udGV4dCwKKwkJCSBzdHJ1Y3QgY2RzX29sX3J4X3BrdCAqcGt0KTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgY2RzX2ZyZWVfb2xfcnhfcGt0X2ZyZWVxKCkgLSBGcmVlIGNkc3MgYnVmZmVyIGZyZWUgcXVldWUKKyAgIFRoZSBcYSBjZHNfZnJlZV9vbF9yeF9wa3RfZnJlZXEoKSBkb2VzIG1lbSBmcmVlIG9mIHRoZSBidWZmZXJzCisgICBhdmFpbGFibGUgaW4gZnJlZSBjZHMgYnVmZmVyIHF1ZXVlIHdoaWNoIGlzIHVzZWQgZm9yIERhdGEgcnggcHJvY2Vzc2luZworICAgZnJvbSBUbHNoaW0uCisgICBccGFyYW0gcFNjaGVkQ29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBDRFMgU2NoZWQgQ29udGV4dAorCisgICBccmV0dXJuIE5vdGhpbmcKKyAgIFxzYSBjZHNfZnJlZV9vbF9yeF9wa3RfZnJlZXEoKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNkc19mcmVlX29sX3J4X3BrdF9mcmVlcShwX2Nkc19zY2hlZF9jb250ZXh0IHBTY2hlZENvbnRleHQpOworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBjZHNfc2NoZWRfb3BlbigpIC0gaW5pdGlhbGl6ZSB0aGUgQ0RTIFNjaGVkdWxlcgorCisgICBUaGUgXGEgY2RzX3NjaGVkX29wZW4oKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgQ0RTIFNjaGVkdWxlcgorICAgVXBvbiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uOgorCisgICAgIC0gQWxsIHRoZSBtZXNzYWdlIHF1ZXVlcyBhcmUgaW5pdGlhbGl6ZWQKKworICAgICAtIFRoZSBNYWluIENvbnRyb2xsZXIgdGhyZWFkIGlzIGNyZWF0ZWQgYW5kIHJlYWR5IHRvIHJlY2VpdmUgYW5kCisgICAgICAgZGlzcGF0Y2ggbWVzc2FnZXMuCisKKyAgICAgLSBUaGUgVHggdGhyZWFkIGlzIGNyZWF0ZWQgYW5kIHJlYWR5IHRvIHJlY2VpdmUgYW5kIGRpc3BhdGNoIG1lc3NhZ2VzCisKKyAgIFxwYXJhbSAgcF9jZHNfY29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBDREYgQ29udGV4dAorCisgICBccGFyYW0gIHBfY2RzX3NjaGVkX2NvbnRleHQgLSBwb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVyIGJpZworICAgICAgICAgIGVub3VnaCB0byBob2xkIGEgc2NoZWR1bGVyIGNvbnRleHQuCisgXAorCisgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIFNjaGVkdWxlciB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZAorICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisKKyAgICAgICAgICBDREZfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpCisgICAgICAgICAgYXJlIHVuYXZhaWxhYmxlIHRvIGluaXRpbGl6ZSB0aGUgc2NoZWR1bGVyCisKKyAgICAgICAgICBDREZfU1RBVFVTX0VfTk9NRU0gLSBpbnN1ZmZpY2llbnQgbWVtb3J5IGV4aXN0cyB0byBpbml0aWFsaXplCisgICAgICAgICAgdGhlIHNjaGVkdWxlcgorCisgICAgICAgICAgQ0RGX1NUQVRVU19FX0lOVkFMIC0gSW52YWxpZCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBzY2hlZHVsZXIgT3BlbgorICAgICAgICAgIGZ1bmN0aW9uCisKKyAgICAgICAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgc2NoZWR1bGVyLworCisgICBcc2EgY2RzX3NjaGVkX29wZW4oKQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY2RzX3NjaGVkX29wZW4odm9pZCAqcF9jZHNfY29udGV4dCwKKwkJCSAgcF9jZHNfc2NoZWRfY29udGV4dCBwU2NoZWRDeHQsIHVpbnQzMl90IFNjaGVkQ3R4U2l6ZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBjZHNfc2NoZWRfY2xvc2UoKSAtIENsb3NlIHRoZSBDRFMgU2NoZWR1bGVyCisKKyAgIFRoZSBcYSBjZHNfc2NoZWRfY2xvc2VzKCkgZnVuY3Rpb24gY2xvc2VzIHRoZSBDRFMgU2NoZWR1bGVyCisgICBVcG9uIHN1Y2Nlc3NmdWwgY2xvc2luZzoKKworICAgICAtIEFsbCB0aGUgbWVzc2FnZSBxdWV1ZXMgYXJlIGZsdXNoZWQKKworICAgICAtIFRoZSBNYWluIENvbnRyb2xsZXIgdGhyZWFkIGlzIGNsb3NlZAorCisgICAgIC0gVGhlIFR4IHRocmVhZCBpcyBjbG9zZWQKKworICAgXHBhcmFtICBwX2Nkc19jb250ZXh0IC0gcG9pbnRlciB0byB0aGUgZ2xvYmFsIENERiBDb250ZXh0CisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU2NoZWR1bGVyIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kCisgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKworICAgICAgICAgIENERl9TVEFUVVNfRV9JTlZBTCAtIEludmFsaWQgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgc2NoZWR1bGVyIE9wZW4KKyAgICAgICAgICBmdW5jdGlvbgorCisgICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgLSBGYWlsdXJlIHRvIGluaXRpYWxpemUgdGhlIHNjaGVkdWxlci8KKworICAgXHNhIGNkc19zY2hlZF9jbG9zZSgpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNkc19zY2hlZF9jbG9zZSh2b2lkICpwX2Nkc19jb250ZXh0KTsKKworLyogSGVscGVyIHJvdXRpbmVzIHByb3ZpZGVkIHRvIG90aGVyIENEUyBBUEkncyAqLworQ0RGX1NUQVRVUyBjZHNfbXFfaW5pdChwX2Nkc19tcV90eXBlIHBNcSk7Cit2b2lkIGNkc19tcV9kZWluaXQocF9jZHNfbXFfdHlwZSBwTXEpOwordm9pZCBjZHNfbXFfcHV0KHBfY2RzX21xX3R5cGUgcE1xLCBwX2Nkc19tc2dfd3JhcHBlciBwTXNnV3JhcHBlcik7CitwX2Nkc19tc2dfd3JhcHBlciBjZHNfbXFfZ2V0KHBfY2RzX21xX3R5cGUgcE1xKTsKK2Jvb2wgY2RzX2lzX21xX2VtcHR5KHBfY2RzX21xX3R5cGUgcE1xKTsKK3BfY2RzX3NjaGVkX2NvbnRleHQgZ2V0X2Nkc19zY2hlZF9jdHh0KHZvaWQpOworQ0RGX1NUQVRVUyBjZHNfc2NoZWRfaW5pdF9tcXMocF9jZHNfc2NoZWRfY29udGV4dCBwU2NoZWRDb250ZXh0KTsKK3ZvaWQgY2RzX3NjaGVkX2RlaW5pdF9tcXMocF9jZHNfc2NoZWRfY29udGV4dCBwU2NoZWRDb250ZXh0KTsKK3ZvaWQgY2RzX3NjaGVkX2ZsdXNoX21jX21xcyhwX2Nkc19zY2hlZF9jb250ZXh0IHBTY2hlZENvbnRleHQpOworCit2b2lkIGNkZl90aW1lcl9tb2R1bGVfaW5pdCh2b2lkKTsKK3ZvaWQgY2RzX3Nzcl9wcm90ZWN0X2luaXQodm9pZCk7Cit2b2lkIGNkc19zc3JfcHJvdGVjdChjb25zdCBjaGFyICpjYWxsZXJfZnVuYyk7Cit2b2lkIGNkc19zc3JfdW5wcm90ZWN0KGNvbnN0IGNoYXIgKmNhbGxlcl9mdW5jKTsKK2Jvb2wgY2RzX2lzX3Nzcl9yZWFkeShjb25zdCBjaGFyICpjYWxsZXJfZnVuYyk7CisKKyNkZWZpbmUgY2RzX3dhaXRfZm9yX3dvcmtfdGhyZWFkX2NvbXBsZXRpb24oZnVuYykgY2RzX2lzX3Nzcl9yZWFkeShmdW5jKQorCisjZW5kaWYgLyogI2lmICFkZWZpbmVkIF9fQ0RTX1NDSEVEX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvY2RzL2luYy9jZHNfdXRpbHMuaCBiL2NvcmUvY2RzL2luYy9jZHNfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTRiMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZHMvaW5jL2Nkc191dGlscy5oCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fQ0RTX1VUSUxTX0ggKQorI2RlZmluZSBfX0NEU19VVElMU19ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIGNkc191dGlscy5oCisKKyAgIFxicmllZiBDb25uZWN0aXZpdHkgZHJpdmVyIHNlcnZpY2VzIChDRFMpIHV0aWxpdHkgQVBJcworCisgICBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8Y2RmX3N0YXR1cy5oPgorI2luY2x1ZGUgPGNkZl9ldmVudC5oPgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENEU19ESUdFU1RfU0hBMV9TSVpFICAgICgyMCkKKyNkZWZpbmUgQ0RTX0RJR0VTVF9NRDVfU0laRSAgICAgKDE2KQorI2RlZmluZSBDRFNfQkFORF8yR0haICAgICAgICAgICgxKQorI2RlZmluZSBDRFNfQkFORF81R0haICAgICAgICAgICgyKQorCisjZGVmaW5lIENEU18yNF9HSFpfQkFTRV9GUkVRICAgKDI0MDcpCisjZGVmaW5lIENEU181X0dIWl9CQVNFX0ZSRVEgICAgKDUwMDApCisjZGVmaW5lIENEU18yNF9HSFpfQ0hBTk5FTF8xNCAgKDE0KQorI2RlZmluZSBDRFNfMjRfR0haX0NIQU5ORUxfMTUgICgxNSkKKyNkZWZpbmUgQ0RTXzI0X0dIWl9DSEFOTkVMXzI3ICAoMjcpCisjZGVmaW5lIENEU181X0dIWl9DSEFOTkVMXzE3MCAgKDE3MCkKKyNkZWZpbmUgQ0RTX0NIQU5fU1BBQ0lOR181TUhaICAoNSkKKyNkZWZpbmUgQ0RTX0NIQU5fU1BBQ0lOR18yME1IWiAoMjApCisjZGVmaW5lIENEU19DSEFOXzE0X0ZSRVEgICAgICAgKDI0ODQpCisjZGVmaW5lIENEU19DSEFOXzE1X0ZSRVEgICAgICAgKDI1MTIpCisjZGVmaW5lIENEU19DSEFOXzE3MF9GUkVRICAgICAgKDU4NTIpCisKKyNkZWZpbmUgY2RzX2xvZyhsZXZlbCwgYXJncy4uLikgQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBsZXZlbCwgIyMgYXJncykKKyNkZWZpbmUgY2RzX2xvZ2ZsKGxldmVsLCBmb3JtYXQsIGFyZ3MuLi4pIGNkc19sb2cobGV2ZWwsIEZMKGZvcm1hdCksICMjIGFyZ3MpCisKKyNkZWZpbmUgY2RzX2FsZXJ0KGZvcm1hdCwgYXJncy4uLikgXAorCQljZHNfbG9nZmwoQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIGNkc19lcnIoZm9ybWF0LCBhcmdzLi4uKSBcCisJCWNkc19sb2dmbChDREZfVFJBQ0VfTEVWRUxfRVJST1IsIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgY2RzX3dhcm4oZm9ybWF0LCBhcmdzLi4uKSBcCisJCWNkc19sb2dmbChDREZfVFJBQ0VfTEVWRUxfV0FSTiwgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSBjZHNfbm90aWNlKGZvcm1hdCwgYXJncy4uLikgXAorCQljZHNfbG9nZmwoQ0RGX1RSQUNFX0xFVkVMX0lORk8sIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgY2RzX2luZm8oZm9ybWF0LCBhcmdzLi4uKSBcCisJCWNkc19sb2dmbChDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIGNkc19kZWJ1Zyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwkJY2RzX2xvZ2ZsKENERl9UUkFDRV9MRVZFTF9ERUJVRywgZm9ybWF0LCAjIyBhcmdzKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NERl9TVEFUVVMgY2RzX2NyeXB0b19pbml0KHVpbnQzMl90ICpwaENyeXB0UHJvdik7CisKK0NERl9TVEFUVVMgY2RzX2NyeXB0b19kZWluaXQodWludDMyX3QgaENyeXB0UHJvdik7CisKKy8qKgorICogY2RzX3JhbmRfZ2V0X2J5dGVzCisKKyAqIEZVTkNUSU9OOgorICogUmV0dXJucyBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcHNldWRvLXJhbmRvbSBieXRlcy4KKyAqCisgKgorICogQHBhcmFtIHBiQnVmIC0gdGhlIGNhbGxlciBhbGxvY2F0ZWQgbG9jYXRpb24gd2hlcmUgdGhlIGJ5dGVzIHNob3VsZCBiZSBjb3BpZWQKKyAqIEBwYXJhbSBudW1CeXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCBhbmQKKyAqIGNvcGllZAorICoKKyAqIEByZXR1cm4gQ0RGX1NUQVRVU19TVUNDU1MgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitDREZfU1RBVFVTIGNkc19yYW5kX2dldF9ieXRlcyh1aW50MzJfdCBoYW5kbGUsIHVpbnQ4X3QgKnBiQnVmLAorCQkJICAgICAgdWludDMyX3QgbnVtQnl0ZXMpOworCisvKioKKyAqIGNkc19zaGExX2htYWNfc3RyCisgKgorICogRlVOQ1RJT046CisgKiBHZW5lcmF0ZSB0aGUgSE1BQy1TSEExIG9mIGEgc3RyaW5nIGdpdmVuIGEga2V5LgorICoKKyAqIExPR0lDOgorICogU3RhbmRhcmQgSE1BQyBwcm9jZXNzaW5nIGZyb20gUkZDIDIxMDQuIFRoZSBjb2RlIGlzIHByb3ZpZGVkIGluIHRoZQorICogYXBwZW5kaXggb2YgdGhlIFJGQy4KKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIFRoZSBSRkMgaXMgY29ycmVjdC4KKyAqCisgKiBAcGFyYW0gdGV4dCB0ZXh0IHRvIGJlIGhhc2hlZAorICogQHBhcmFtIHRleHRMZW4gbGVuZ3RoIG9mIHRleHQKKyAqIEBwYXJhbSBrZXkga2V5IHRvIHVzZSBmb3IgSE1BQworICogQHBhcmFtIGtleUxlbiBsZW5ndGggb2Yga2V5CisgKiBAcGFyYW0gZGlnZXN0IGhvbGRzIHJlc3VsdGFudCBTSEExIEhNQUMgKDIwQikKKyAqCisgKiBAcmV0dXJuIENERl9TVEFUVVNfU1VDQ1NTIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqCisgKi8KK0NERl9TVEFUVVMgY2RzX3NoYTFfaG1hY19zdHIodWludDMyX3QgY3J5cHRIYW5kbGUsICAgICAgLyogSGFuZGxlICovCisJCQkgICAgIHVpbnQ4X3QgKiB0ZXh0LCAgICAvKiBwb2ludGVyIHRvIGRhdGEgc3RyZWFtICovCisJCQkgICAgIHVpbnQzMl90IHRleHRMZW4sICAvKiBsZW5ndGggb2YgZGF0YSBzdHJlYW0gKi8KKwkJCSAgICAgdWludDhfdCAqIGtleSwgICAgIC8qIHBvaW50ZXIgdG8gYXV0aGVudGljYXRpb24ga2V5ICovCisJCQkgICAgIHVpbnQzMl90IGtleUxlbiwgICAvKiBsZW5ndGggb2YgYXV0aGVudGljYXRpb24ga2V5ICovCisJCQkgICAgIHVpbnQ4X3QgZGlnZXN0W0NEU19ESUdFU1RfU0hBMV9TSVpFXSk7ICAgICAvKiBjYWxsZXIgZGlnZXN0IHRvIGJlIGZpbGxlZCBpbiAqLworCisvKioKKyAqIGNkc19tZDVfaG1hY19zdHIKKyAqCisgKiBGVU5DVElPTjoKKyAqIEdlbmVyYXRlIHRoZSBITUFDLU1ENSBvZiBhIHN0cmluZyBnaXZlbiBhIGtleS4KKyAqCisgKiBMT0dJQzoKKyAqIFN0YW5kYXJkIEhNQUMgcHJvY2Vzc2luZyBmcm9tIFJGQyAyMTA0LiBUaGUgY29kZSBpcyBwcm92aWRlZCBpbiB0aGUKKyAqIGFwcGVuZGl4IG9mIHRoZSBSRkMuCisgKgorICogQVNTVU1QVElPTlM6CisgKiBUaGUgUkZDIGlzIGNvcnJlY3QuCisgKgorICogQHBhcmFtIHRleHQgdGV4dCB0byBiZSBoYXNoZWQKKyAqIEBwYXJhbSB0ZXh0TGVuIGxlbmd0aCBvZiB0ZXh0CisgKiBAcGFyYW0ga2V5IGtleSB0byB1c2UgZm9yIEhNQUMKKyAqIEBwYXJhbSBrZXlMZW4gbGVuZ3RoIG9mIGtleQorICogQHBhcmFtIGRpZ2VzdCBob2xkcyByZXN1bHRhbnQgTUQ1IEhNQUMgKDE2QikKKyAqCisgKiBAcmV0dXJuIENERl9TVEFUVVNfU1VDQ1NTIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqCisgKi8KK0NERl9TVEFUVVMgY2RzX21kNV9obWFjX3N0cih1aW50MzJfdCBjcnlwdEhhbmRsZSwgICAgICAgLyogSGFuZGxlICovCisJCQkgICAgdWludDhfdCAqIHRleHQsICAgICAvKiBwb2ludGVyIHRvIGRhdGEgc3RyZWFtICovCisJCQkgICAgdWludDMyX3QgdGV4dExlbiwgICAvKiBsZW5ndGggb2YgZGF0YSBzdHJlYW0gKi8KKwkJCSAgICB1aW50OF90ICoga2V5LCAgICAgIC8qIHBvaW50ZXIgdG8gYXV0aGVudGljYXRpb24ga2V5ICovCisJCQkgICAgdWludDMyX3Qga2V5TGVuLCAgICAvKiBsZW5ndGggb2YgYXV0aGVudGljYXRpb24ga2V5ICovCisJCQkgICAgdWludDhfdCBkaWdlc3RbQ0RTX0RJR0VTVF9NRDVfU0laRV0pOyAgICAgICAvKiBjYWxsZXIgZGlnZXN0IHRvIGJlIGZpbGxlZCBpbiAqLworCitDREZfU1RBVFVTIGNkc19lbmNyeXB0X2Flcyh1aW50MzJfdCBjcnlwdEhhbmRsZSwgICAgICAgIC8qIEhhbmRsZSAqLworCQkJICAgdWludDhfdCAqcFRleHQsICAgICAgLyogcG9pbnRlciB0byBkYXRhIHN0cmVhbSAqLworCQkJICAgdWludDhfdCAqRW5jcnlwdGVkLCB1aW50OF90ICpwS2V5KTsgICAgICAgICAgLyogcG9pbnRlciB0byBhdXRoZW50aWNhdGlvbiBrZXkgKi8KKworQ0RGX1NUQVRVUyBjZHNfZGVjcnlwdF9hZXModWludDMyX3QgY3J5cHRIYW5kbGUsICAgICAgICAvKiBIYW5kbGUgKi8KKwkJCSAgIHVpbnQ4X3QgKnBUZXh0LCAgICAgIC8qIHBvaW50ZXIgdG8gZGF0YSBzdHJlYW0gKi8KKwkJCSAgIHVpbnQ4X3QgKnBEZWNyeXB0ZWQsIHVpbnQ4X3QgKnBLZXkpOyAgICAgICAgIC8qIHBvaW50ZXIgdG8gYXV0aGVudGljYXRpb24ga2V5ICovCisKK3VpbnQzMl90IGNkc19jaGFuX3RvX2ZyZXEodWludDhfdCBjaGFuKTsKK3VpbnQ4X3QgY2RzX2ZyZXFfdG9fY2hhbih1aW50MzJfdCBmcmVxKTsKK3VpbnQ4X3QgY2RzX2NoYW5fdG9fYmFuZCh1aW50MzJfdCBjaGFuKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCitib29sIGNkc19pc19tbWllX3ZhbGlkKHVpbnQ4X3QgKmtleSwgdWludDhfdCAqaXBuLAorCQkgICAgICAgdWludDhfdCAqZnJtLCB1aW50OF90ICplZnJtKTsKK2Jvb2wgY2RzX2F0dGFjaF9tbWllKHVpbnQ4X3QgKmlndGssIHVpbnQ4X3QgKmlwbiwgdWludDE2X3Qga2V5X2lkLAorCQkgICAgIHVpbnQ4X3QgKmZybSwgdWludDhfdCAqZWZybSwgdWludDE2X3QgZnJtTGVuKTsKK3VpbnQ4X3QgY2RzX2dldF9tbWllX3NpemUodm9pZCk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExVyAqLworQ0RGX1NUQVRVUyBzbWVfc2VuZF9mbHVzaF9sb2dzX2NtZF90b19mdyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQgX19DRFNfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZHMvc3JjL2Nkc19hcGkuYyBiL2NvcmUvY2RzL3NyYy9jZHNfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjYjVlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RzL3NyYy9jZHNfYXBpLmMKQEAgLTAsMCArMSwyMDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogY2RzX2FwaS5jCisgKgorICogQ29ubmVjdGl2aXR5IGRyaXZlciBzZXJ2aWNlcyBBUElzCisgKi8KKworI2luY2x1ZGUgPGNkc19tcS5oPgorI2luY2x1ZGUgImNkc19zY2hlZC5oIgorI2luY2x1ZGUgPGNkc19hcGkuaD4KKyNpbmNsdWRlICJzaXJfdHlwZXMuaCIKKyNpbmNsdWRlICJzaXJfYXBpLmgiCisjaW5jbHVkZSAic2lyX21hY19wcm90X2RlZi5oIgorI2luY2x1ZGUgInNtZV9hcGkuaCIKKyNpbmNsdWRlICJtYWNfaW5pdF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9zeXMuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9taXNjLmgiCisjaW5jbHVkZSAiaV9jZHNfcGFja2V0LmgiCisjaW5jbHVkZSAiY2RzX3JlZ19zZXJ2aWNlLmgiCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpZmRlZiBDT05GSUdfQ05TUworI2luY2x1ZGUgPG5ldC9jbnNzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNhcF9hcGkuaCIKKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKyNpbmNsdWRlICJibWkuaCIKKyNpbmNsdWRlICJvbF9mdy5oIgorI2luY2x1ZGUgIm9sX2lmX2F0aHZhci5oIgorI2luY2x1ZGUgImhpZi5oIgorCisjaW5jbHVkZSAiY2RzX3V0aWxzLmgiCisjaW5jbHVkZSAid2xhbl9sb2dnaW5nX3NvY2tfc3ZjLmgiCisjaW5jbHVkZSAid21hLmgiCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9pcGEuaCIKKy8qIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGNkcyBtZXNzYWdlIHF1ZXVlIGdldCB3cmFwcGVyIGZhaWx1cmVzIHRvIGNhdXNlIHBhbmljICovCisjZGVmaW5lIENEU19XUkFQUEVSX01BWF9GQUlMX0NPVU5UIChDRFNfQ09SRV9NQVhfTUVTU0FHRVMgKiAzKQorCisjaWZkZWYgSVBBX09GRkxPQUQKKyNkZWZpbmUgQ0RTX0lQQV9DRV9TUl9CQVNFX1BBRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKCYoKGhkZF9jb250ZXh0X3QgKikoZ3BfY2RzX2NvbnRleHQtPnBIRERDb250ZXh0KSktPmNlX3NyX2Jhc2VfcGFkZHIpCisjZGVmaW5lIENEU19JUEFfQ0VfUklOR19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgmKChoZGRfY29udGV4dF90ICopKGdwX2Nkc19jb250ZXh0LT5wSEREQ29udGV4dCkpLT5jZV9zcl9yaW5nX3NpemUpCisjZGVmaW5lIENEU19JUEFfQ0VfUkVHX1BBRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgmKChoZGRfY29udGV4dF90ICopKGdwX2Nkc19jb250ZXh0LT5wSEREQ29udGV4dCkpLT5jZV9yZWdfcGFkZHIpCisjZGVmaW5lIENEU19JUEFfVFhfQ09NUF9CQVNFX1BBRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgmKChoZGRfY29udGV4dF90ICopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoZ3BfY2RzX2NvbnRleHQtPnBIRERDb250ZXh0KSktPnR4X2NvbXBfcmluZ19iYXNlX3BhZGRyKQorI2RlZmluZSBDRFNfSVBBX1RYX0NPTVBfUklOR19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoJigoaGRkX2NvbnRleHRfdCAqKShncF9jZHNfY29udGV4dC0+cEhERENvbnRleHQpKS0+dHhfY29tcF9yaW5nX3NpemUpCisjZGVmaW5lIENEU19JUEFfVFhfTlVNX0JVRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgmKChoZGRfY29udGV4dF90ICopKGdwX2Nkc19jb250ZXh0LT5wSEREQ29udGV4dCkpLT50eF9udW1fYWxsb2NfYnVmZmVyKQorI2RlZmluZSBDRFNfSVBBX1JYX1JEWV9SSU5HX0JBU0VfUEFERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoJigoaGRkX2NvbnRleHRfdCAqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKGdwX2Nkc19jb250ZXh0LT5wSEREQ29udGV4dCkpLT5yeF9yZHlfcmluZ19iYXNlX3BhZGRyKQorI2RlZmluZSBDRFNfSVBBX1JYX1JEWV9SSU5HX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoJigoaGRkX2NvbnRleHRfdCAqKShncF9jZHNfY29udGV4dC0+cEhERENvbnRleHQpKS0+cnhfcmR5X3Jpbmdfc2l6ZSkKKyNkZWZpbmUgQ0RTX0lQQV9SWF9QUk9DX0RPTkVfSURYX1BBRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKCYoKGhkZF9jb250ZXh0X3QgKikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCShncF9jZHNfY29udGV4dC0+cEhERENvbnRleHQpKS0+cnhfcHJvY19kb25lX2lkeF9wYWRkcikKKyNlbHNlCisjZGVmaW5lIENEU19JUEFfQ0VfU1JfQkFTRV9QQUREUiAgICAgICAoTlVMTCkKKyNkZWZpbmUgQ0RTX0lQQV9DRV9SSU5HX1NJWkUgICAgICAgICAgIChOVUxMKQorI2RlZmluZSBDRFNfSVBBX0NFX1JFR19QQUREUiAgICAgICAgICAgKE5VTEwpCisjZGVmaW5lIENEU19JUEFfVFhfQ09NUF9CQVNFX1BBRERSICAgICAoTlVMTCkKKyNkZWZpbmUgQ0RTX0lQQV9UWF9DT01QX1JJTkdfU0laRSAgICAgIChOVUxMKQorI2RlZmluZSBDRFNfSVBBX1RYX05VTV9CVUZGICAgICAgICAgICAgKE5VTEwpCisjZGVmaW5lIENEU19JUEFfUlhfUkRZX1JJTkdfQkFTRV9QQUREUiAoTlVMTCkKKyNkZWZpbmUgQ0RTX0lQQV9SWF9SRFlfUklOR19TSVpFICAgICAgIChOVUxMKQorI2RlZmluZSBDRFNfSVBBX1JYX1BST0NfRE9ORV9JRFhfUEFERFIgKE5VTEwpCisjZW5kaWYgLyogSVBBX09GRkxPQUQgKi8KKworLyogRGF0YSBkZWZpbml0aW9ucyAqLworc3RhdGljIGNkc19jb250ZXh0X3R5cGUgZ19jZHNfY29udGV4dDsKK3N0YXRpYyBwX2Nkc19jb250ZXh0VHlwZSBncF9jZHNfY29udGV4dDsKK3N0YXRpYyBzdHJ1Y3QgX19jZGZfZGV2aWNlIGdfY2RmX2N0eDsKKworLyogRGVidWcgdmFyaWFibGUgdG8gZGV0ZWN0IE1DIHRocmVhZCBzdHVjayAqLworc3RhdGljIGF0b21pY190IGNkc193cmFwcGVyX2VtcHR5X2NvdW50OworCitzdGF0aWMgdWludDhfdCBjZHNfbXVsdGljYXN0X2xvZ2dpbmc7CisKK3ZvaWQgY2RzX3N5c19wcm9iZV90aHJlYWRfY2JhY2sodm9pZCAqcFVzZXJEYXRhKTsKKworLyoqCisgKiBjZHNfYWxsb2NfZ2xvYmFsX2NvbnRleHQoKSAtIGFsbG9jYXRlIENEUyBnbG9iYWwgY29udGV4dAorICogQHBfY2RzX2NvbnRleHQ6IEEgcG9pbnRlciB0byB3aGVyZSB0byBzdG9yZSB0aGUgQ0RTIENvbnRleHQKKyAqCisgKiBjZHNfYWxsb2NfZ2xvYmFsX2NvbnRleHQoKSBmdW5jdGlvbiBhbGxvY2F0ZXMgdGhlIENEUyBnbG9iYWwgQ29udGV4dCwKKyAqIGJ1dCBkb2VzIG5vdCBpbml0aWFsaXplIGFsbCB0aGUgbWVtYmVycy4gVGhpcyBvdmVyYWwgaW5pdGlhbGl6YXRpb24gd2lsbAorICogaGFwcGVuIGF0IGNkc19vcGVuKCkuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgY2RzX2FsbG9jX2dsb2JhbF9jb250ZXh0KHZfQ09OVEVYVF90ICpwX2Nkc19jb250ZXh0KQoreworCWlmIChwX2Nkc19jb250ZXh0ID09IE5VTEwpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCS8qIGFsbG9jYXRlIHRoZSBDRFMgQ29udGV4dCAqLworCSpwX2Nkc19jb250ZXh0ID0gTlVMTDsKKwlncF9jZHNfY29udGV4dCA9ICZnX2Nkc19jb250ZXh0OworCisJY2RmX21lbV96ZXJvKGdwX2Nkc19jb250ZXh0LCBzaXplb2YoY2RzX2NvbnRleHRfdHlwZSkpOworCSpwX2Nkc19jb250ZXh0ID0gZ3BfY2RzX2NvbnRleHQ7CisKKwlncF9jZHNfY29udGV4dC0+Y2RmX2N0eCA9ICZnX2NkZl9jdHg7CisJY2RmX21lbV96ZXJvKCZnX2NkZl9jdHgsIHNpemVvZihnX2NkZl9jdHgpKTsKKworCS8qIGluaXRpYWxpemUgdGhlIHNwaW5sb2NrICovCisJY2RmX3RyYWNlX3NwaW5fbG9ja19pbml0KCk7CisJLyogaXQgaXMgdGhlIHJpZ2h0IHRpbWUgdG8gaW5pdGlhbGl6ZSBNVFJBQ0Ugc3RydWN0dXJlcyAqLworI2lmIGRlZmluZWQoVFJBQ0VfUkVDT1JEKQorCWNkZl90cmFjZV9pbml0KCk7CisjZW5kaWYKKworCWNkZl9kcF90cmFjZV9pbml0KCk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30gLyogY2RzX2FsbG9jX2dsb2JhbF9jb250ZXh0KCkgKi8KKworLyoqCisgKiBjZHNfZnJlZV9nbG9iYWxfY29udGV4dCgpIC0gZnJlZSBDRFMgZ2xvYmFsIGNvbnRleHQKKyAqIEBwX2Nkc19jb250ZXh0OiBBIHBvaW50ZXIgdG8gd2hlcmUgdGhlIENEUyBDb250ZXh0IHdhcyBzdG9yZWQKKyAqCisgKiBjZHNfZnJlZV9nbG9iYWxfY29udGV4dCgpIGZ1bmN0aW9uIGZyZWVzIHRoZSBDRFMgQ29udGV4dC4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZHNfZnJlZV9nbG9iYWxfY29udGV4dCh2X0NPTlRFWFRfdCAqcF9jZHNfY29udGV4dCkKK3sKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogRGUtYWxsb2NhdGluZyB0aGUgQ0RTIENvbnRleHQiLCBfX2Z1bmNfXyk7CisKKwlpZiAoKHBfY2RzX2NvbnRleHQgPT0gTlVMTCkgfHwgKCpwX2Nkc19jb250ZXh0ID09IE5VTEwpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHZPUyBDb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoZ3BfY2RzX2NvbnRleHQgIT0gKnBfY2RzX2NvbnRleHQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogQ29udGV4dCBtaXNtYXRjaCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlncF9jZHNfY29udGV4dC0+Y2RmX2N0eCA9IE5VTEw7CisJKnBfY2RzX2NvbnRleHQgPSBncF9jZHNfY29udGV4dCA9IE5VTEw7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfSAvKiBjZHNfZnJlZV9nbG9iYWxfY29udGV4dCgpICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkFOCisvKioKKyAqIGNkc19zZXRfbmFuX2VuYWJsZSgpIC0gc2V0IG5hbiBlbmFibGUgZmxhZyBpbiBtYWMgb3BlbiBwYXJhbQorICogQHdtYV9oYW5kbGU6IFBvaW50ZXIgdG8gbWFjIG9wZW4gcGFyYW0KKyAqIEBoZGRfY3R4OiBQb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIGNkc19zZXRfbmFuX2VuYWJsZSh0TWFjT3BlblBhcmFtZXRlcnMgKnBhcmFtLAorCQkJCQloZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXBhcmFtLT5pc19uYW5fZW5hYmxlZCA9IGhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlX25hbl9zdXBwb3J0OworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGNkc19zZXRfbmFuX2VuYWJsZSh0TWFjT3BlblBhcmFtZXRlcnMgKnBhcmFtLAorCQkJCQloZGRfY29udGV4dF90ICpwSGRkQ3R4KQoreworfQorI2VuZGlmCisKKy8qKgorICogY2RzX29wZW4oKSAtIG9wZW4gdGhlIENEUyBNb2R1bGUKKyAqIEBwX2Nkc19jb250ZXh0OiBBIHBvaW50ZXIgdG8gd2hlcmUgdGhlIENEUyBDb250ZXh0IHdhcyBzdG9yZWQKKyAqIEBoZGRDb250ZXh0U2l6ZTogU2l6ZSBvZiB0aGUgSEREIGNvbnRleHQgdG8gYWxsb2NhdGUuCisgKgorICogY2RzX29wZW4oKSBmdW5jdGlvbiBvcGVucyB0aGUgQ0RTIFNjaGVkdWxlcgorICogVXBvbiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uOgorICogLSBBbGwgQ0RTIHN1Ym1vZHVsZXMgc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZAorICoKKyAqIC0gVGhlIENEUyBzY2hlZHVsZXIgc2hvdWxkIGhhdmUgb3BlbmVkCisgKgorICogLSBBbGwgdGhlIFdMQU4gU1cgY29tcG9uZW50cyBzaG91bGQgaGF2ZSBiZWVuIG9wZW5lZC4gVGhpcyBpbmNsdWRlcworICogU1lTLCBNQUMsIFNNRSwgV01BIGFuZCBUTC4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZHNfb3Blbih2X0NPTlRFWFRfdCAqcF9jZHNfY29udGV4dCwgdWludDMyX3QgaGRkQ29udGV4dFNpemUpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWludCBpdGVyID0gMDsKKwl0U2lyUmV0U3RhdHVzIHNpclN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKwl0TWFjT3BlblBhcmFtZXRlcnMgbWFjX29wZW5QYXJtczsKKwljZGZfZGV2aWNlX3QgY2RmX2N0eDsKKwlIVENfSU5JVF9JTkZPIGh0Y0luZm87CisJc3RydWN0IG9sX3NvZnRjICpzY247CisJdm9pZCAqSFRDSGFuZGxlOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBPcGVuaW5nIENEUyIsIF9fZnVuY19fKTsKKworCWlmIChOVUxMID09IGdwX2Nkc19jb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IFRyeWluZyB0byBvcGVuIENEUyB3aXRob3V0IGEgUHJlT3BlbiIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHRpbWVyIG1vZHVsZSAqLworCWNkZl90aW1lcl9tb2R1bGVfaW5pdCgpOworCisJLyogSW5pdGlhbGl6ZSBidWcgcmVwb3J0aW5nIHN0cnVjdHVyZSAqLworCWNkc19pbml0X2xvZ19jb21wbGV0aW9uKCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwcm9iZSBldmVudCAqLworCWlmIChjZGZfZXZlbnRfaW5pdCgmZ3BfY2RzX2NvbnRleHQtPlByb2JlRXZlbnQpICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBVbmFibGUgdG8gaW5pdCBwcm9iZUV2ZW50IiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmIChjZGZfZXZlbnRfaW5pdCgmKGdwX2Nkc19jb250ZXh0LT53bWFDb21wbGV0ZUV2ZW50KSkgIT0KKwkgICAgQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IFVuYWJsZSB0byBpbml0IHdtYUNvbXBsZXRlRXZlbnQiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCWdvdG8gZXJyX3Byb2JlX2V2ZW50OworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGZyZWUgbWVzc2FnZSBxdWV1ZSAqLworCWNkZl9zdGF0dXMgPSBjZHNfbXFfaW5pdCgmZ3BfY2RzX2NvbnRleHQtPmZyZWVWb3NNcSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJLyogQ3JpdGljYWwgRXJyb3IgLi4uICBDYW5ub3QgcHJvY2VlZCBmdXJ0aGVyICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIENEUyBmcmVlIG1lc3NhZ2UgcXVldWUiLAorCQkJICBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCWdvdG8gZXJyX3dtYV9jb21wbGV0ZV9ldmVudDsKKwl9CisKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgQ0RTX0NPUkVfTUFYX01FU1NBR0VTOyBpdGVyKyspIHsKKwkJKGdwX2Nkc19jb250ZXh0LT5hTXNnV3JhcHBlcnNbaXRlcl0pLnBWb3NNc2cgPQorCQkJJihncF9jZHNfY29udGV4dC0+YU1zZ0J1ZmZlcnNbaXRlcl0pOworCQlJTklUX0xJU1RfSEVBRCgmZ3BfY2RzX2NvbnRleHQtPmFNc2dXcmFwcGVyc1tpdGVyXS5tc2dOb2RlKTsKKwkJY2RzX21xX3B1dCgmZ3BfY2RzX2NvbnRleHQtPmZyZWVWb3NNcSwKKwkJCSAgICYoZ3BfY2RzX2NvbnRleHQtPmFNc2dXcmFwcGVyc1tpdGVyXSkpOworCX0KKworCS8qIE5vdyBPcGVuIHRoZSBDRFMgU2NoZWR1bGVyICovCisJY2RmX3N0YXR1cyA9IGNkc19zY2hlZF9vcGVuKGdwX2Nkc19jb250ZXh0LCAmZ3BfY2RzX2NvbnRleHQtPmNkZl9zY2hlZCwKKwkJCQkgICAgc2l6ZW9mKGNkc19zY2hlZF9jb250ZXh0KSk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRmFpbGVkIHRvIG9wZW4gQ0RTIFNjaGVkdWxlciIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJZ290byBlcnJfbXNnX3F1ZXVlOworCX0KKworCXBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKSAoZ3BfY2RzX2NvbnRleHQtPnBIRERDb250ZXh0KTsKKwlpZiAoKE5VTEwgPT0gcEhkZEN0eCkgfHwgKE5VTEwgPT0gcEhkZEN0eC0+Y29uZmlnKSkgeworCQkvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogSGRkIENvbnRleHQgaXMgTnVsbCIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJZ290byBlcnJfc2NoZWRfY2xvc2U7CisJfQorCisJc2NuID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKwlpZiAoIXNjbikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBzY24gaXMgbnVsbCEiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3NjaGVkX2Nsb3NlOworCX0KKwlzY24tPmVuYWJsZXVhcnRwcmludCA9IHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlZndwcmludDsKKwlzY24tPmVuYWJsZWZ3bG9nID0gcEhkZEN0eC0+Y29uZmlnLT5lbmFibGVmd2xvZzsKKwlzY24tPm1heF9ub19vZl9wZWVycyA9IHBIZGRDdHgtPmNvbmZpZy0+bWF4TnVtYmVyT2ZQZWVyczsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTFBTUworCXNjbi0+ZW5hYmxlbHBhc3NzdXBwb3J0ID0gcEhkZEN0eC0+Y29uZmlnLT5lbmFibGVscGFzc3N1cHBvcnQ7CisjZW5kaWYKKwlzY24tPmVuYWJsZV9yYW1kdW1wX2NvbGxlY3Rpb24gPQorCQkJCXBIZGRDdHgtPmNvbmZpZy0+aXNfcmFtZHVtcF9lbmFibGVkOworCXNjbi0+ZW5hYmxlX3NlbGZfcmVjb3ZlcnkgPSBwSGRkQ3R4LT5jb25maWctPmVuYWJsZVNlbGZSZWNvdmVyeTsKKworCS8qIEluaXRpYWxpemUgQk1JIGFuZCBEb3dubG9hZCBmaXJtd2FyZSAqLworCWNkZl9zdGF0dXMgPSBibWlfZG93bmxvYWRfZmlybXdhcmUoc2NuKTsKKwlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICJCTUkgRklBTEVEIHN0YXR1czolZCIsIGNkZl9zdGF0dXMpOworCQlnb3RvIGVycl9ibWlfY2xvc2U7CisJfQorCisJaHRjSW5mby5wQ29udGV4dCA9IGdwX2Nkc19jb250ZXh0LT5wSElGQ29udGV4dDsKKwlodGNJbmZvLlRhcmdldEZhaWx1cmUgPSBvbF90YXJnZXRfZmFpbHVyZTsKKwlodGNJbmZvLlRhcmdldFNlbmRTdXNwZW5kQ29tcGxldGUgPSB3bWFfdGFyZ2V0X3N1c3BlbmRfYWNrbm93bGVkZ2U7CisJY2RmX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0NERl9ERVZJQ0UpOworCisJLyogQ3JlYXRlIEhUQyAqLworCWdwX2Nkc19jb250ZXh0LT5odGNfY3R4ID0KKwkJaHRjX2NyZWF0ZShodGNJbmZvLnBDb250ZXh0LCAmaHRjSW5mbywgY2RmX2N0eCk7CisJaWYgKCFncF9jZHNfY29udGV4dC0+aHRjX2N0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gQ3JlYXRlIEhUQyIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfYm1pX2Nsb3NlOworCX0KKworCWlmIChibWlfZG9uZShzY24pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEZhaWxlZCB0byBjb21wbGV0ZSBCTUkgcGhhc2UiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2h0Y19jbG9zZTsKKwl9CisKKwkvKgorCSoqIE5lZWQgdG8gb3BlbiBXTUEgZmlyc3QgYmVjYXVzZSBpdCBjYWxscyBXRElfSW5pdCwgd2hpY2ggY2FsbHMgd3BhbE9wZW4KKwkqKiBUaGUgcmVhc29uIHRoYXQgaXMgbmVlZGVkIGJlY2FzdWUgY2RzX3BhY2tldF9vcGVuIG5lZWQgdG8gdXNlIFBBTCBBUElzCisJKi8KKworCS8qT3BlbiB0aGUgV01BIG1vZHVsZSAqLworCWNkZl9tZW1fc2V0KCZtYWNfb3BlblBhcm1zLCBzaXplb2YobWFjX29wZW5QYXJtcyksIDApOworCS8qIFVNQSBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUgZm9yIHBlcmZvcm1pbmcgdGhlCisJKiogZnJhbWUgdHJhbnNsYXRpb24gODAyLjExIDwtPiA4MDIuMworCSovCisJbWFjX29wZW5QYXJtcy5mcmFtZVRyYW5zUmVxdWlyZWQgPSAxOworCW1hY19vcGVuUGFybXMuZHJpdmVyVHlwZSA9IGVEUklWRVJfVFlQRV9QUk9EVUNUSU9OOworCW1hY19vcGVuUGFybXMucG93ZXJzYXZlT2ZmbG9hZEVuYWJsZWQgPQorCQlwSGRkQ3R4LT5jb25maWctPmVuYWJsZVBvd2Vyc2F2ZU9mZmxvYWQ7CisJbWFjX29wZW5QYXJtcy5zdGFEeW5hbWljRHRpbSA9IHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlRHluYW1pY0RUSU07CisJbWFjX29wZW5QYXJtcy5zdGFNb2REdGltID0gcEhkZEN0eC0+Y29uZmlnLT5lbmFibGVNb2R1bGF0ZWREVElNOworCW1hY19vcGVuUGFybXMuc3RhTWF4TElNb2REdGltID0gcEhkZEN0eC0+Y29uZmlnLT5mTWF4TElNb2R1bGF0ZWREVElNOworCW1hY19vcGVuUGFybXMud293RW5hYmxlID0gcEhkZEN0eC0+Y29uZmlnLT53b3dFbmFibGU7CisJbWFjX29wZW5QYXJtcy5tYXhXb1dGaWx0ZXJzID0gcEhkZEN0eC0+Y29uZmlnLT5tYXhXb1dGaWx0ZXJzOworCS8qIEhlcmUgb2xJbmlJbmZvIGlzIHVzZWQgdG8gc3RvcmUgaW5pIHN0YXR1cyBvZiBhcnAgb2ZmbG9hZAorCSAqIG5zIG9mZmxvYWQgYW5kIG90aGVycy4gQ3VycmVudGx5IDFzdCBiaXQgaXMgdXNlZCBmb3IgYXJwCisJICogb2ZmIGxvYWQgYW5kIDJuZCBiaXQgZm9yIG5zIG9mZmxvYWQgY3VycmVudGx5LCByZXN0IGJpdHMgYXJlIHVudXNlZAorCSAqLworCWlmIChwSGRkQ3R4LT5jb25maWctPmZob3N0QXJwT2ZmbG9hZCkKKwkJbWFjX29wZW5QYXJtcy5vbEluaUluZm8gPSBtYWNfb3BlblBhcm1zLm9sSW5pSW5mbyB8IDB4MTsKKwlpZiAocEhkZEN0eC0+Y29uZmlnLT5maG9zdE5TT2ZmbG9hZCkKKwkJbWFjX29wZW5QYXJtcy5vbEluaUluZm8gPSBtYWNfb3BlblBhcm1zLm9sSW5pSW5mbyB8IDB4MjsKKwkvKgorCSAqIENvcHkgdGhlIERGUyBQaHllcnIgRmlsdGVyaW5nIE9mZmxvYWQgc3RhdHVzLgorCSAqIFRoaXMgcGFyYW1ldGVyIHJlZmxlY3RzIHRoZSB2YWx1ZSBvZiB0aGUKKwkgKiBkZnNQaHllcnJGaWx0ZXJPZmZsb2FkIGZsYWcgIGFzIHNldCBpbiB0aGUgaW5pLgorCSAqLworCW1hY19vcGVuUGFybXMuZGZzUGh5ZXJyRmlsdGVyT2ZmbG9hZCA9CisJCXBIZGRDdHgtPmNvbmZpZy0+ZkRmc1BoeWVyckZpbHRlck9mZmxvYWQ7CisJaWYgKHBIZGRDdHgtPmNvbmZpZy0+c3NkcCkKKwkJbWFjX29wZW5QYXJtcy5zc2RwID0gcEhkZEN0eC0+Y29uZmlnLT5zc2RwOworI2lmZGVmIEZFQVRVUkVfV0xBTl9SQV9GSUxURVJJTkcKKwltYWNfb3BlblBhcm1zLlJBcmF0ZUxpbWl0SW50ZXJ2YWwgPQorCQlwSGRkQ3R4LT5jb25maWctPlJBcmF0ZUxpbWl0SW50ZXJ2YWw7CisJbWFjX29wZW5QYXJtcy5Jc1JBcmF0ZUxpbWl0RW5hYmxlZCA9CisJCXBIZGRDdHgtPmNvbmZpZy0+SXNSQXJhdGVMaW1pdEVuYWJsZWQ7CisjZW5kaWYKKworCW1hY19vcGVuUGFybXMuYXBNYXhPZmZsb2FkUGVlcnMgPSBwSGRkQ3R4LT5jb25maWctPmFwTWF4T2ZmbG9hZFBlZXJzOworCisJbWFjX29wZW5QYXJtcy5hcE1heE9mZmxvYWRSZW9yZGVyQnVmZnMgPQorCQlwSGRkQ3R4LT5jb25maWctPmFwTWF4T2ZmbG9hZFJlb3JkZXJCdWZmczsKKworCW1hY19vcGVuUGFybXMuYXBEaXNhYmxlSW50cmFCc3NGd2QgPQorCQlwSGRkQ3R4LT5jb25maWctPmFwRGlzYWJsZUludHJhQnNzRndkOworCisJbWFjX29wZW5QYXJtcy5kZnNSYWRhclByaU11bHRpcGxpZXIgPQorCQlwSGRkQ3R4LT5jb25maWctPmRmc1JhZGFyUHJpTXVsdGlwbGllcjsKKwltYWNfb3BlblBhcm1zLnJlb3JkZXJPZmZsb2FkID0gcEhkZEN0eC0+Y29uZmlnLT5yZW9yZGVyT2ZmbG9hZFN1cHBvcnQ7CisKKwkvKiBJUEEgbWljcm8gY29udHJvbGxlciBkYXRhIHBhdGggb2ZmbG9hZCByZXNvdXJjZSBjb25maWcgaXRlbSAqLworCW1hY19vcGVuUGFybXMudWNPZmZsb2FkRW5hYmxlZCA9IGhkZF9pcGFfdWNfaXNfZW5hYmxlZChwSGRkQ3R4KTsKKwltYWNfb3BlblBhcm1zLnVjVHhCdWZDb3VudCA9IHBIZGRDdHgtPmNvbmZpZy0+SXBhVWNUeEJ1ZkNvdW50OworCW1hY19vcGVuUGFybXMudWNUeEJ1ZlNpemUgPSBwSGRkQ3R4LT5jb25maWctPklwYVVjVHhCdWZTaXplOworCW1hY19vcGVuUGFybXMudWNSeEluZFJpbmdDb3VudCA9IHBIZGRDdHgtPmNvbmZpZy0+SXBhVWNSeEluZFJpbmdDb3VudDsKKwltYWNfb3BlblBhcm1zLnVjVHhQYXJ0aXRpb25CYXNlID0gcEhkZEN0eC0+Y29uZmlnLT5JcGFVY1R4UGFydGl0aW9uQmFzZTsKKwltYWNfb3BlblBhcm1zLm1heF9zY2FuID0gcEhkZEN0eC0+Y29uZmlnLT5tYXhfc2Nhbl9jb3VudDsKKworCW1hY19vcGVuUGFybXMuaXBfdGNwX3VkcF9jaGVja3N1bV9vZmZsb2FkID0KKwkJCXBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlX2lwX3RjcF91ZHBfY2hlY2tzdW1fb2ZmbG9hZDsKKwltYWNfb3BlblBhcm1zLmVuYWJsZV9yeHRocmVhZCA9IHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlUnhUaHJlYWQ7CisJbWFjX29wZW5QYXJtcy5jZV9jbGFzc2lmeV9lbmFibGVkID0KKwkJCQlwSGRkQ3R4LT5jb25maWctPmNlX2NsYXNzaWZ5X2VuYWJsZWQ7CisKKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyCisJbWFjX29wZW5QYXJtcy50eF9mbG93X3N0b3BfcXVldWVfdGggPQorCQkJCXBIZGRDdHgtPmNvbmZpZy0+VHhGbG93U3RvcFF1ZXVlVGhyZXNob2xkOworCW1hY19vcGVuUGFybXMudHhfZmxvd19zdGFydF9xdWV1ZV9vZmZzZXQgPQorCQkJCXBIZGRDdHgtPmNvbmZpZy0+VHhGbG93U3RhcnRRdWV1ZU9mZnNldDsKKyNlbmRpZgorCWNkc19zZXRfbmFuX2VuYWJsZSgmbWFjX29wZW5QYXJtcywgcEhkZEN0eCk7CisKKwltYWNfb3BlblBhcm1zLnR4X2NoYWluX21hc2tfY2NrID0gcEhkZEN0eC0+Y29uZmlnLT50eF9jaGFpbl9tYXNrX2NjazsKKwltYWNfb3BlblBhcm1zLnNlbGZfZ2VuX2ZybV9wd3IgPSBwSGRkQ3R4LT5jb25maWctPnNlbGZfZ2VuX2ZybV9wd3I7CisKKwljZGZfc3RhdHVzID0gd21hX29wZW4oZ3BfY2RzX2NvbnRleHQsCisJCQkgICAgICBoZGRfdXBkYXRlX3RndF9jZmcsCisJCQkgICAgICBoZGRfZGZzX2luZGljYXRlX3JhZGFyLCAmbWFjX29wZW5QYXJtcyk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRmFpbGVkIHRvIG9wZW4gV01BIG1vZHVsZSIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJZ290byBlcnJfaHRjX2Nsb3NlOworCX0KKworCS8qIE51bWJlciBvZiBwZWVycyBsaW1pdCBkaWZmZXJzIGluIGVhY2ggY2hpcCB2ZXJzaW9uLiBJZiBwZWVyIG1heAorCSAqIGxpbWl0IGNvbmZpZ3VyZWQgaW4gaW5pIGV4Y2VlZHMgbW9yZSB0aGFuIHN1cHBvcnRlZCwgV01BIGFkanVzdHMKKwkgKiBhbmQga2VlcHMgY29ycmVjdCBsaW1pdCBpbiBtYWNfb3BlblBhcm1zLm1heFN0YXRpb24uIFNvLCBtYWtlIHN1cmUKKwkgKiBjb25maWcgZW50cnkgcEhkZEN0eC0+Y29uZmlnLT5tYXhOdW1iZXJPZlBlZXJzIGhhcyBhZGp1c3RlZCB2YWx1ZQorCSAqLworCXBIZGRDdHgtPmNvbmZpZy0+bWF4TnVtYmVyT2ZQZWVycyA9IG1hY19vcGVuUGFybXMubWF4U3RhdGlvbjsKKwlIVENIYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9IVEMpOworCWlmICghSFRDSGFuZGxlKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEhUQ0hhbmRsZSBpcyBudWxsISIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfd21hX2Nsb3NlOworCX0KKwlpZiAoaHRjX3dhaXRfdGFyZ2V0KEhUQ0hhbmRsZSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRmFpbGVkIHRvIGNvbXBsZXRlIEJNSSBwaGFzZSIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfd21hX2Nsb3NlOworCX0KKworCS8qIE5vdyBwcm9jZWVkIHRvIG9wZW4gdGhlIE1BQyAqLworCisJLyogVU1BIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZSBmb3IgcGVyZm9ybWluZyB0aGUKKwkgKiBmcmFtZSB0cmFuc2xhdGlvbiA4MDIuMTEgPC0+IDgwMi4zCisJICovCisJbWFjX29wZW5QYXJtcy5mcmFtZVRyYW5zUmVxdWlyZWQgPSAxOworCisJc2lyU3RhdHVzID0KKwkJbWFjX29wZW4oJihncF9jZHNfY29udGV4dC0+cE1BQ0NvbnRleHQpLCBncF9jZHNfY29udGV4dC0+cEhERENvbnRleHQsCisJCQkgJm1hY19vcGVuUGFybXMpOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBzaXJTdGF0dXMpIHsKKwkJLyogQ3JpdGljYWwgRXJyb3IgLi4uICBDYW5ub3QgcHJvY2VlZCBmdXJ0aGVyICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEZhaWxlZCB0byBvcGVuIE1BQyIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJZ290byBlcnJfd21hX2Nsb3NlOworCX0KKworCS8qIE5vdyBwcm9jZWVkIHRvIG9wZW4gdGhlIFNNRSAqLworCWNkZl9zdGF0dXMgPSBzbWVfb3BlbihncF9jZHNfY29udGV4dC0+cE1BQ0NvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCS8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gb3BlbiBTTUUiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCWdvdG8gZXJyX21hY19jbG9zZTsKKwl9CisKKwlncF9jZHNfY29udGV4dC0+cGRldl90eHJ4X2N0eCA9CisJCW9sX3R4cnhfcGRldl9hbGxvYyhncF9jZHNfY29udGV4dC0+Y2ZnX2N0eCwKKwkJCQkgICAgZ3BfY2RzX2NvbnRleHQtPmh0Y19jdHgsCisJCQkJICAgIGdwX2Nkc19jb250ZXh0LT5jZGZfY3R4KTsKKwlpZiAoIWdwX2Nkc19jb250ZXh0LT5wZGV2X3R4cnhfY3R4KSB7CisJCS8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gb3BlbiBUWFJYIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlnb3RvIGVycl9zbWVfY2xvc2U7CisJfQorCisJb2xfdHhyeF9pcGFfdWNfZ2V0X3Jlc291cmNlKGdwX2Nkc19jb250ZXh0LT5wZGV2X3R4cnhfY3R4LAorCQkJCUNEU19JUEFfQ0VfU1JfQkFTRV9QQUREUiwKKwkJCQlDRFNfSVBBX0NFX1JJTkdfU0laRSwKKwkJCQlDRFNfSVBBX0NFX1JFR19QQUREUiwKKwkJCQlDRFNfSVBBX1RYX0NPTVBfQkFTRV9QQUREUiwKKwkJCQlDRFNfSVBBX1RYX0NPTVBfUklOR19TSVpFLAorCQkJCUNEU19JUEFfVFhfTlVNX0JVRkYsCisJCQkJQ0RTX0lQQV9SWF9SRFlfUklOR19CQVNFX1BBRERSLAorCQkJCUNEU19JUEFfUlhfUkRZX1JJTkdfU0laRSwKKwkJCQlDRFNfSVBBX1JYX1BST0NfRE9ORV9JRFhfUEFERFIpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogQ0RTIHN1Y2Nlc3NmdWxseSBPcGVuZWQiLCBfX2Z1bmNfXyk7CisKKwkqcF9jZHNfY29udGV4dCA9IGdwX2Nkc19jb250ZXh0OworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworZXJyX3NtZV9jbG9zZToKKwlzbWVfY2xvc2UoZ3BfY2RzX2NvbnRleHQtPnBNQUNDb250ZXh0KTsKKworZXJyX21hY19jbG9zZToKKwltYWNfY2xvc2UoZ3BfY2RzX2NvbnRleHQtPnBNQUNDb250ZXh0KTsKKworZXJyX3dtYV9jbG9zZToKKwl3bWFfY2xvc2UoZ3BfY2RzX2NvbnRleHQpOworCisJd21hX3dtaV9zZXJ2aWNlX2Nsb3NlKGdwX2Nkc19jb250ZXh0KTsKKworZXJyX2h0Y19jbG9zZToKKwlpZiAoZ3BfY2RzX2NvbnRleHQtPmh0Y19jdHgpIHsKKwkJaHRjX2Rlc3Ryb3koZ3BfY2RzX2NvbnRleHQtPmh0Y19jdHgpOworCQlncF9jZHNfY29udGV4dC0+aHRjX2N0eCA9IE5VTEw7CisJfQorCitlcnJfYm1pX2Nsb3NlOgorCWJtaV9jbGVhbnVwKHNjbik7CisKK2Vycl9zY2hlZF9jbG9zZToKKwljZHNfc2NoZWRfY2xvc2UoZ3BfY2RzX2NvbnRleHQpOworCitlcnJfbXNnX3F1ZXVlOgorCWNkc19tcV9kZWluaXQoJmdwX2Nkc19jb250ZXh0LT5mcmVlVm9zTXEpOworCitlcnJfd21hX2NvbXBsZXRlX2V2ZW50OgorCWNkZl9ldmVudF9kZXN0cm95KCZncF9jZHNfY29udGV4dC0+d21hQ29tcGxldGVFdmVudCk7CisKK2Vycl9wcm9iZV9ldmVudDoKKwljZGZfZXZlbnRfZGVzdHJveSgmZ3BfY2RzX2NvbnRleHQtPlByb2JlRXZlbnQpOworCisJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworfSAvKiBjZHNfb3BlbigpICovCisKKy8qKgorICogY2RzX3ByZV9lbmFibGUoKSAtIHByZSBlbmFibGUgY2RzCisgKiBAY2RzX2NvbnRleHQ6IENEUyBjb250ZXh0CisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgY2RzX3ByZV9lbmFibGUodl9DT05URVhUX3QgY2RzX2NvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXBfY2RzX2NvbnRleHRUeXBlIHBfY2RzX2NvbnRleHQgPSAocF9jZHNfY29udGV4dFR5cGUpIGNkc19jb250ZXh0OworCXZvaWQgKnNjbjsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9JTkZPLCAiY2RzIHByZXN0YXJ0Iik7CisKKwlpZiAoZ3BfY2RzX2NvbnRleHQgIT0gcF9jZHNfY29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBDb250ZXh0IG1pc21hdGNoIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWlmIChwX2Nkc19jb250ZXh0LT5wTUFDQ29udGV4dCA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE1BQyBOVUxMIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJaWYgKHBfY2RzX2NvbnRleHQtPnBXTUFDb250ZXh0ID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogV01BIE5VTEwgY29udGV4dCIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwlzY24gPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCWlmICghc2NuKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IHNjbiBpcyBudWxsISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIFJlc2V0IHdtYSB3YWl0IGV2ZW50ICovCisJY2RmX2V2ZW50X3Jlc2V0KCZncF9jZHNfY29udGV4dC0+d21hQ29tcGxldGVFdmVudCk7CisKKwkvKmNhbGwgV01BIHByZSBzdGFydCAqLworCWNkZl9zdGF0dXMgPSB3bWFfcHJlX3N0YXJ0KGdwX2Nkc19jb250ZXh0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIkZhaWxlZCB0byBXTUEgcHJlc3RhcnQiKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIE5lZWQgdG8gdXBkYXRlIHRpbWUgb3V0IG9mIGNvbXBsZXRlICovCisJY2RmX3N0YXR1cyA9IGNkZl93YWl0X3NpbmdsZV9ldmVudCgmZ3BfY2RzX2NvbnRleHQtPndtYUNvbXBsZXRlRXZlbnQsCisJCQkJCSAgIENEU19XTUFfVElNRU9VVCk7CisJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWlmIChjZGZfc3RhdHVzID09IENERl9TVEFUVVNfRV9USU1FT1VUKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogVGltZW91dCBvY2N1cnJlZCBiZWZvcmUgV01BIGNvbXBsZXRlIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJfSBlbHNlIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiB3bWFfcHJlX3N0YXJ0IHJlcG9ydGluZyBvdGhlciBlcnJvciIsCisJCQkJICBfX2Z1bmNfXyk7CisJCX0KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogVGVzdCBNQyB0aHJlYWQgYnkgcG9zdGluZyBhIHByb2JlIG1lc3NhZ2UgdG8gU1lTIiwKKwkJCSAgX19mdW5jX18pOworCQl3bGFuX3N5c19wcm9iZSgpOworCisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZGZfc3RhdHVzID0gaHRjX3N0YXJ0KGdwX2Nkc19jb250ZXh0LT5odGNfY3R4KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIkZhaWxlZCB0byBTdGFydCBIVEMiKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwljZGZfc3RhdHVzID0gd21hX3dhaXRfZm9yX3JlYWR5X2V2ZW50KGdwX2Nkc19jb250ZXh0LT5wV01BQ29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICJGYWlsZWQgdG8gZ2V0IHJlYWR5IGV2ZW50IGZyb20gdGFyZ2V0IGZpcm13YXJlIik7CisJCWh0Y19zZXRfdGFyZ2V0X3RvX3NsZWVwKHNjbik7CisJCWh0Y19zdG9wKGdwX2Nkc19jb250ZXh0LT5odGNfY3R4KTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChvbF90eHJ4X3BkZXZfYXR0YWNoKGdwX2Nkc19jb250ZXh0LT5wZGV2X3R4cnhfY3R4KSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSJGYWlsZWQgdG8gYXR0YWNoIHBkZXYiKTsKKwkJaHRjX3NldF90YXJnZXRfdG9fc2xlZXAoc2NuKTsKKwkJaHRjX3N0b3AoZ3BfY2RzX2NvbnRleHQtPmh0Y19jdHgpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaHRjX3NldF90YXJnZXRfdG9fc2xlZXAoc2NuKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RzX2VuYWJsZSgpIC0gc3RhcnQvZW5hYmxlIGNkcyBtb2R1bGUKKyAqIEBjZHNfY29udGV4dDogQ0RTIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZHNfZW5hYmxlKHZfQ09OVEVYVF90IGNkc19jb250ZXh0KQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U2lyUmV0U3RhdHVzIHNpclN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKwlwX2Nkc19jb250ZXh0VHlwZSBwX2Nkc19jb250ZXh0ID0gKHBfY2RzX2NvbnRleHRUeXBlKSBjZHNfY29udGV4dDsKKwl0SGFsTWFjU3RhcnRQYXJhbWV0ZXJzIGhhbFN0YXJ0UGFyYW1zOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFN0YXJ0aW5nIExpYnJhIFNXIiwgX19mdW5jX18pOworCisJLyogV2Ugc3VwcG9ydCBvbmx5IG9uZSBpbnN0YW5jZSBmb3Igbm93IC4uLiAqLworCWlmIChncF9jZHNfY29udGV4dCAhPSBwX2Nkc19jb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IG1pc21hdGNoIGluIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoKHBfY2RzX2NvbnRleHQtPnBXTUFDb250ZXh0ID09IE5VTEwpIHx8CisJICAgIChwX2Nkc19jb250ZXh0LT5wTUFDQ29udGV4dCA9PSBOVUxMKSkgeworCQlpZiAocF9jZHNfY29udGV4dC0+cFdNQUNvbnRleHQgPT0gTlVMTCkKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBXTUEgTlVMTCBjb250ZXh0IiwgX19mdW5jX18pOworCQllbHNlCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogTUFDIE5VTEwgY29udGV4dCIsIF9fZnVuY19fKTsKKworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyogU3RhcnQgdGhlIHdtYSAqLworCWNkZl9zdGF0dXMgPSB3bWFfc3RhcnQocF9jZHNfY29udGV4dCk7CisJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBzdGFydCB3bWEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IHdtYSBjb3JyZWN0bHkgc3RhcnRlZCIsIF9fZnVuY19fKTsKKworCS8qIFN0YXJ0IHRoZSBNQUMgKi8KKwljZGZfbWVtX3plcm8oJmhhbFN0YXJ0UGFyYW1zLAorCQkgICAgIHNpemVvZih0SGFsTWFjU3RhcnRQYXJhbWV0ZXJzKSk7CisKKwkvKiBTdGFydCB0aGUgTUFDICovCisJc2lyU3RhdHVzID0KKwkJbWFjX3N0YXJ0KHBfY2RzX2NvbnRleHQtPnBNQUNDb250ZXh0LCAmaGFsU3RhcnRQYXJhbXMpOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBzaXJTdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRmFpbGVkIHRvIHN0YXJ0IE1BQyIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfd21hX3N0b3A7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IE1BQyBjb3JyZWN0bHkgc3RhcnRlZCIsIF9fZnVuY19fKTsKKworCS8qIFNUQVJUIFNNRSAqLworCWNkZl9zdGF0dXMgPSBzbWVfc3RhcnQocF9jZHNfY29udGV4dC0+cE1BQ0NvbnRleHQpOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRmFpbGVkIHRvIHN0YXJ0IFNNRSIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfbWFjX3N0b3A7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFNNRSBjb3JyZWN0bHkgc3RhcnRlZCIsIF9fZnVuY19fKTsKKworCWlmIChvbF90eHJ4X3BkZXZfYXR0YWNoX3RhcmdldAorCQkgICAgICAgKHBfY2RzX2NvbnRleHQtPnBkZXZfdHhyeF9jdHgpICE9IEFfT0spIHsKKwkgICBDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCQkiJXM6IEZhaWxlZCBhdHRhY2ggdGFyZ2V0IiwgX19mdW5jX18pOworCSAgIGdvdG8gZXJyX3NtZV9zdG9wOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIlRMIGNvcnJlY3RseSBzdGFydGVkIik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IENEUyBTdGFydCBpcyBzdWNjZXNzZnVsISEiLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCitlcnJfc21lX3N0b3A6CisJc21lX3N0b3AocF9jZHNfY29udGV4dC0+cE1BQ0NvbnRleHQsIEhBTF9TVE9QX1RZUEVfU1lTX1JFU0VUKTsKKworZXJyX21hY19zdG9wOgorCW1hY19zdG9wKHBfY2RzX2NvbnRleHQtPnBNQUNDb250ZXh0LCBIQUxfU1RPUF9UWVBFX1NZU19SRVNFVCk7CisKK2Vycl93bWFfc3RvcDoKKwljZGZfZXZlbnRfcmVzZXQoJihncF9jZHNfY29udGV4dC0+d21hQ29tcGxldGVFdmVudCkpOworCWNkZl9zdGF0dXMgPSB3bWFfc3RvcChwX2Nkc19jb250ZXh0LCBIQUxfU1RPUF9UWVBFX1JGX0tJTEwpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBzdG9wIHdtYSIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCQl3bWFfc2V0bmVlZHNodXRkb3duKGNkc19jb250ZXh0KTsKKwl9IGVsc2UgeworCQljZGZfc3RhdHVzID0KKwkJCWNkZl93YWl0X3NpbmdsZV9ldmVudCgmKGdwX2Nkc19jb250ZXh0LT53bWFDb21wbGV0ZUV2ZW50KSwKKwkJCQkJICAgICAgQ0RTX1dNQV9USU1FT1VUKTsKKwkJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlpZiAoY2RmX3N0YXR1cyA9PSBDREZfU1RBVFVTX0VfVElNRU9VVCkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkJCSAgIiVzOiBUaW1lb3V0IG9jY3VycmVkIGJlZm9yZSBXTUFfc3RvcCBjb21wbGV0ZSIsCisJCQkJCSAgX19mdW5jX18pOworCQkJfSBlbHNlIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCQkgICIlczogV01BX3N0b3AgcmVwb3J0aW5nIG90aGVyIGVycm9yIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQl9CisJCQlDREZfQVNTRVJUKDApOworCQkJd21hX3NldG5lZWRzaHV0ZG93bihjZHNfY29udGV4dCk7CisJCX0KKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7Cit9IC8qIGNkc19lbmFibGUoKSAqLworCisvKioKKyAqIGNkc19kaXNhYmxlKCkgLSBzdG9wL2Rpc2FibGUgY2RzIG1vZHVsZQorICogQGNkc19jb250ZXh0OiBDRFMgY29udGV4dAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIGNkc19kaXNhYmxlKHZfQ09OVEVYVF90IGNkc19jb250ZXh0KQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKworCS8qIHdtYV9zdG9wIGlzIGNhbGxlZCBiZWZvcmUgdGhlIFNZUyBzbyB0aGF0IHRoZSBwcm9jZXNzaW5nIG9mIHRhcmdldAorCSAqIHBlbmRpbmcgcmVzcG9uc2VzIHdpbGwgbm90IGJlIGhhbmRsZWQgZHVyaW5nIHVuaW5pdGlhbGl6YXRpb24gb2YKKwkgKiBXTEFOIGRyaXZlcgorCSAqLworCWNkZl9ldmVudF9yZXNldCgmKGdwX2Nkc19jb250ZXh0LT53bWFDb21wbGV0ZUV2ZW50KSk7CisKKwljZGZfc3RhdHVzID0gd21hX3N0b3AoY2RzX2NvbnRleHQsIEhBTF9TVE9QX1RZUEVfUkZfS0lMTCk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gc3RvcCB3bWEiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKwkJd21hX3NldG5lZWRzaHV0ZG93bihjZHNfY29udGV4dCk7CisJfQorCisJaGlmX2Rpc2FibGVfaXNyKCgoY2RzX2NvbnRleHRfdHlwZSAqKSBjZHNfY29udGV4dCktPnBISUZDb250ZXh0KTsKKwloaWZfcmVzZXRfc29jKCgoY2RzX2NvbnRleHRfdHlwZSAqKSBjZHNfY29udGV4dCktPnBISUZDb250ZXh0KTsKKworCS8qIFNZUyBTVE9QIHdpbGwgc3RvcCBTTUUgYW5kIE1BQyAqLworCWNkZl9zdGF0dXMgPSBzeXNfc3RvcChjZHNfY29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIHN0b3AgU1lTIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSk7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZHNfY2xvc2UoKSAtIGNsb3NlIGNkcyBtb2R1bGUKKyAqIEBjZHNfY29udGV4dDogQ0RTIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZHNfY2xvc2Uodl9DT05URVhUX3QgY2RzX2NvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCisJaWYgKGdwX2Nkc19jb250ZXh0LT5odGNfY3R4KSB7CisJCWh0Y19zdG9wKGdwX2Nkc19jb250ZXh0LT5odGNfY3R4KTsKKwkJaHRjX2Rlc3Ryb3koZ3BfY2RzX2NvbnRleHQtPmh0Y19jdHgpOworCQlncF9jZHNfY29udGV4dC0+aHRjX2N0eCA9IE5VTEw7CisJfQorCisJb2xfdHhyeF9wZGV2X2RldGFjaChncF9jZHNfY29udGV4dC0+cGRldl90eHJ4X2N0eCwgMSk7CisJY2RzX2ZyZWVfY29udGV4dChjZHNfY29udGV4dCwgQ0RGX01PRFVMRV9JRF9UWFJYLAorCQkJIGdwX2Nkc19jb250ZXh0LT5wZGV2X3R4cnhfY3R4KTsKKworCWNkZl9zdGF0dXMgPSBzbWVfY2xvc2UoKChwX2Nkc19jb250ZXh0VHlwZSkgY2RzX2NvbnRleHQpLT5wTUFDQ29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGNsb3NlIFNNRSIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCX0KKworCWNkZl9zdGF0dXMgPSBtYWNfY2xvc2UoKChwX2Nkc19jb250ZXh0VHlwZSkgY2RzX2NvbnRleHQpLT5wTUFDQ29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGNsb3NlIE1BQyIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCX0KKworCSgocF9jZHNfY29udGV4dFR5cGUpIGNkc19jb250ZXh0KS0+cE1BQ0NvbnRleHQgPSBOVUxMOworCisJaWYgKHRydWUgPT0gd21hX25lZWRzaHV0ZG93bihjZHNfY29udGV4dCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEZhaWxlZCB0byBzaHV0ZG93biB3bWEiLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJY2RmX3N0YXR1cyA9IHdtYV9jbG9zZShjZHNfY29udGV4dCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogRmFpbGVkIHRvIGNsb3NlIHdtYSIsIF9fZnVuY19fKTsKKwkJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKwkJfQorCX0KKworCWNkZl9zdGF0dXMgPSB3bWFfd21pX3NlcnZpY2VfY2xvc2UoY2RzX2NvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBjbG9zZSB3bWFfd21pX3NlcnZpY2UiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKwl9CisKKwljZHNfbXFfZGVpbml0KCYoKHBfY2RzX2NvbnRleHRUeXBlKSBjZHNfY29udGV4dCktPmZyZWVWb3NNcSk7CisKKwljZGZfc3RhdHVzID0gY2RmX2V2ZW50X2Rlc3Ryb3koJmdwX2Nkc19jb250ZXh0LT53bWFDb21wbGV0ZUV2ZW50KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBmYWlsZWQgdG8gZGVzdHJveSB3bWFDb21wbGV0ZUV2ZW50IiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSk7CisJfQorCisJY2RmX3N0YXR1cyA9IGNkZl9ldmVudF9kZXN0cm95KCZncF9jZHNfY29udGV4dC0+UHJvYmVFdmVudCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZmFpbGVkIHRvIGRlc3Ryb3kgUHJvYmVFdmVudCIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCX0KKworCWNkc19kZWluaXRfbG9nX2NvbXBsZXRpb24oKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkc19nZXRfY29udGV4dCgpIC0gZ2V0IGNvbnRleHQgZGF0YSBhcmVhCisgKgorICogQG1vZHVsZUlkOiBJRCBvZiB0aGUgbW9kdWxlIHdobydzIGNvbnRleHQgZGF0YSBpcyBiZWluZyByZXRyaXZlZC4KKyAqCisgKiBFYWNoIG1vZHVsZSBpbiB0aGUgc3lzdGVtIGhhcyBhIGNvbnRleHQgLyBkYXRhIGFyZWEgdGhhdCBpcyBhbGxvY2F0ZWQKKyAqIGFuZCBtYW5hZ2VkIGJ5IENEUy4gIFRoaXMgQVBJIGFsbG93cyBhbnkgdXNlciB0byBnZXQgYSBwb2ludGVyIHRvIGl0cworICogYWxsb2NhdGVkIGNvbnRleHQgZGF0YSBhcmVhIGZyb20gdGhlIENEUyBnbG9iYWwgY29udGV4dC4KKyAqCisgKiBSZXR1cm46IHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgZGF0YSBhcmVhIG9mIHRoZSBtb2R1bGUgSUQKKyAqCSAgIHNwZWNpZmllZCwgb3IgTlVMTCBpZiB0aGUgY29udGV4dCBkYXRhIGlzIG5vdCBhbGxvY2F0ZWQgZm9yCisgKgkgICB0aGUgbW9kdWxlIElEIHNwZWNpZmllZAorICovCit2b2lkICpjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRCBtb2R1bGVJZCkKK3sKKwl2b2lkICpwTW9kQ29udGV4dCA9IE5VTEw7CisKKwlpZiAoZ3BfY2RzX2NvbnRleHQgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBjZHMgY29udGV4dCBwb2ludGVyIGlzIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN3aXRjaCAobW9kdWxlSWQpIHsKKyNpZm5kZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCWNhc2UgQ0RGX01PRFVMRV9JRF9TQVA6CisJeworCQlwTW9kQ29udGV4dCA9IGdwX2Nkc19jb250ZXh0LT5wU0FQQ29udGV4dDsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwljYXNlIENERl9NT0RVTEVfSURfSEREOgorCXsKKwkJcE1vZENvbnRleHQgPSBncF9jZHNfY29udGV4dC0+cEhERENvbnRleHQ7CisJCWJyZWFrOworCX0KKworCWNhc2UgQ0RGX01PRFVMRV9JRF9TTUU6CisJY2FzZSBDREZfTU9EVUxFX0lEX1BFOgorCXsKKwkJLyogSW4gYWxsIHRoZXNlIGNhc2VzLCB3ZSBqdXN0IHJldHVybiB0aGUgTUFDIENvbnRleHQgKi8KKwkJcE1vZENvbnRleHQgPSBncF9jZHNfY29udGV4dC0+cE1BQ0NvbnRleHQ7CisJCWJyZWFrOworCX0KKworCWNhc2UgQ0RGX01PRFVMRV9JRF9XTUE6CisJeworCQkvKiBGb3Igd21hIG1vZHVsZSAqLworCQlwTW9kQ29udGV4dCA9IGdwX2Nkc19jb250ZXh0LT5wV01BQ29udGV4dDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBDREZfTU9EVUxFX0lEX0NERjoKKwl7CisJCS8qIEZvciBTWVMgdGhpcyBpcyBDRFMgaXRzZWxmICovCisJCXBNb2RDb250ZXh0ID0gZ3BfY2RzX2NvbnRleHQ7CisJCWJyZWFrOworCX0KKworCWNhc2UgQ0RGX01PRFVMRV9JRF9ISUY6CisJeworCQlwTW9kQ29udGV4dCA9IGdwX2Nkc19jb250ZXh0LT5wSElGQ29udGV4dDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBDREZfTU9EVUxFX0lEX0hUQzoKKwl7CisJCXBNb2RDb250ZXh0ID0gZ3BfY2RzX2NvbnRleHQtPmh0Y19jdHg7CisJCWJyZWFrOworCX0KKworCWNhc2UgQ0RGX01PRFVMRV9JRF9DREZfREVWSUNFOgorCXsKKwkJcE1vZENvbnRleHQgPSBncF9jZHNfY29udGV4dC0+Y2RmX2N0eDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBDREZfTU9EVUxFX0lEX1RYUlg6CisJeworCQlwTW9kQ29udGV4dCA9IGdwX2Nkc19jb250ZXh0LT5wZGV2X3R4cnhfY3R4OworCQlicmVhazsKKwl9CisKKwljYXNlIENERl9NT0RVTEVfSURfQ0ZHOgorCXsKKwkJcE1vZENvbnRleHQgPSBncF9jZHNfY29udGV4dC0+Y2ZnX2N0eDsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwl7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE1vZHVsZSBJRCAlaSBkb2VzIG5vdCBoYXZlIGl0cyBjb250ZXh0IG1haW50YWluZWQgYnkgQ0RTIiwKKwkJCSAgX19mdW5jX18sIG1vZHVsZUlkKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCX0KKworCWlmIChwTW9kQ29udGV4dCA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE1vZHVsZSBJRCAlaSBjb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXywKKwkJCSAgbW9kdWxlSWQpOworCX0KKworCXJldHVybiBwTW9kQ29udGV4dDsKK30gLyogY2RzX2dldF9jb250ZXh0KCkgKi8KKworLyoqCisgKiBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCkgLSBnZXQgQ0RTIGdsb2JhbCBDb250ZXh0CisgKgorICogVGhpcyBBUEkgYWxsb3dzIGFueSB1c2VyIHRvIGdldCB0aGUgQ0RTIEdsb2JhbCBDb250ZXh0IHBvaW50ZXIgZnJvbSBhCisgKiBtb2R1bGUgY29udGV4dCBkYXRhIGFyZWEuCisgKgorICogUmV0dXJuOiBwb2ludGVyIHRvIHRoZSBDRFMgZ2xvYmFsIGNvbnRleHQsIE5VTEwgaWYgdGhlIGZ1bmN0aW9uIGlzCisgKgkgICB1bmFibGUgdG8gcmV0cmVpdmUgdGhlIENEUyBjb250ZXh0LgorICovCit2X0NPTlRFWFRfdCBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KHZvaWQpCit7CisJaWYgKGdwX2Nkc19jb250ZXh0ID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZ2xvYmFsIGNkcyBjb250ZXh0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIGdwX2Nkc19jb250ZXh0OworfSAvKiBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCkgKi8KKworLyoqCisgKiBjZHNfaXNfbG9ncF9pbl9wcm9ncmVzcygpIC0gY2hlY2sgaWYgc3NyL3NlbGYgcmVjb3ZlcnkgaXMgZ29pbmcgb24KKyAqCisgKiBSZXR1cm46IHRydWUgaWYgc3NyL3NlbGYgcmVjdm9lcnkgaXMgZ29pbmcgb24gZWxzZSBmYWxzZQorICovCit1aW50OF90IGNkc19pc19sb2dwX2luX3Byb2dyZXNzKHZvaWQpCit7CisJaWYgKGdwX2Nkc19jb250ZXh0ID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZ2xvYmFsIGNkcyBjb250ZXh0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiBncF9jZHNfY29udGV4dC0+aXNMb2dwSW5Qcm9ncmVzczsKK30KKworLyoqCisgKiBjZHNfc2V0X2xvZ3BfaW5fcHJvZ3Jlc3MoKSAtIHNldCBzc3Ivc2VsZiByZWNvdmVyeSBpbiBwcm9ncmVzcworICogQHZhbHVlOiB2YWx1ZSB0byBzZXQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBjZHNfc2V0X2xvZ3BfaW5fcHJvZ3Jlc3ModWludDhfdCB2YWx1ZSkKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKworCWlmIChncF9jZHNfY29udGV4dCA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGdsb2JhbCBjZHMgY29udGV4dCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWdwX2Nkc19jb250ZXh0LT5pc0xvZ3BJblByb2dyZXNzID0gdmFsdWU7CisKKwkvKiBIREQgdXNlcyBpdCdzIG93biBjb250ZXh0IHZhcmlhYmxlIHRvIGNoZWNrIGlmIFNTUiBpbiBwcm9ncmVzcywKKwkgKiBpbnN0ZWFkIG9mIG1vZGlmeWluZyBhbGwgSEREIEFQSXMgc2V0IHRoZSBIREQgY29udGV4dCB2YXJpYWJsZQorCSAqIGhlcmUKKwkgKi8KKwlwSGRkQ3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoIXBIZGRDdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogSEREIGNvbnRleHQgaXMgTnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlwSGRkQ3R4LT5pc0xvZ3BJblByb2dyZXNzID0gdmFsdWU7Cit9CisKKy8qKgorICogY2RzX2lzX2xvYWRfdW5sb2FkX2luX3Byb2dyZXNzKCkgLSBjaGVjayBpZiBkcml2ZXIgbG9hZC91bmxvYWQgaW4gcHJvZ3Jlc3MKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgbG9hZC91bmxvYWQgaXMgZ29pbmcgb24gZWxzZSBmYWxzZQorICovCit1aW50OF90IGNkc19pc19sb2FkX3VubG9hZF9pbl9wcm9ncmVzcyh2b2lkKQoreworCWlmIChncF9jZHNfY29udGV4dCA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGdsb2JhbCBjZHMgY29udGV4dCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ3BfY2RzX2NvbnRleHQtPmlzTG9hZFVubG9hZEluUHJvZ3Jlc3M7Cit9CisKKy8qKgorICogY2RzX3NldF9sb2FkX3VubG9hZF9pbl9wcm9ncmVzcygpIC0gc2V0IGxvYWQvdW5sb2FkIGluIHByb2dyZXNzCisgKiBAdmFsdWU6IHZhbHVlIHRvIHNldAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNkc19zZXRfbG9hZF91bmxvYWRfaW5fcHJvZ3Jlc3ModWludDhfdCB2YWx1ZSkKK3sKKwlpZiAoZ3BfY2RzX2NvbnRleHQgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBnbG9iYWwgY2RzIGNvbnRleHQgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlncF9jZHNfY29udGV4dC0+aXNMb2FkVW5sb2FkSW5Qcm9ncmVzcyA9IHZhbHVlOworCisjaWZkZWYgQ09ORklHX0NOU1MKKwlpZiAodmFsdWUpCisJCWNuc3Nfc2V0X2RyaXZlcl9zdGF0dXMoQ05TU19MT0FEX1VOTE9BRCk7CisJZWxzZQorCQljbnNzX3NldF9kcml2ZXJfc3RhdHVzKENOU1NfSU5JVElBTElaRUQpOworI2VuZGlmCit9CisKKy8qKgorICogY2RzX2FsbG9jX2NvbnRleHQoKSAtIGFsbG9jYXRlIGEgY29udGV4dCB3aXRoaW4gdGhlIENEUyBnbG9iYWwgQ29udGV4dAorICogQHBfY2RzX2NvbnRleHQ6IHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBWb3MgY29udGV4dAorICogQG1vZHVsZUlkOiBtb2R1bGUgSUQgd2hvJ3MgY29udGV4dCBhcmVhIGlzIGJlaW5nIGFsbG9jYXRlZC4KKyAqIEBwcE1vZHVsZUNvbnRleHQ6IHBvaW50ZXIgdG8gbG9jYXRpb24gd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlCisgKglhbGxvY2F0ZWQgY29udGV4dCBpcyByZXR1cm5lZC4gTm90ZSB0aGlzIG91dHB1dCBwb2ludGVyCisgKglpcyB2YWxpZCBvbmx5IGlmIHRoZSBBUEkgcmV0dXJucyBDREZfU1RBVFVTX1NVQ0NFU1MKKyAqIEBwYXJhbSBzaXplOiBzaXplIG9mIHRoZSBjb250ZXh0IGFyZWEgdG8gYmUgYWxsb2NhdGVkLgorICoKKyAqIFRoaXMgQVBJIGFsbG93cyBhbnkgdXNlciB0byBhbGxvY2F0ZSBhIHVzZXIgY29udGV4dCBhcmVhIHdpdGhpbiB0aGUKKyAqIENEUyBHbG9iYWwgQ29udGV4dC4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZHNfYWxsb2NfY29udGV4dCh2b2lkICpwX2Nkc19jb250ZXh0LCBDREZfTU9EVUxFX0lEIG1vZHVsZUlELAorCQkJICAgICB2b2lkICoqcHBNb2R1bGVDb250ZXh0LCB1aW50MzJfdCBzaXplKQoreworCXZvaWQgKipwR3BNb2RDb250ZXh0ID0gTlVMTDsKKworCWlmIChwX2Nkc19jb250ZXh0ID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogY2RzIGNvbnRleHQgaXMgbnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmICgoZ3BfY2RzX2NvbnRleHQgIT0gcF9jZHNfY29udGV4dCkgfHwgKHBwTW9kdWxlQ29udGV4dCA9PSBOVUxMKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBjb250ZXh0IG1pc21hdGNoIG9yIG51bGwgcGFyYW0gcGFzc2VkIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJc3dpdGNoIChtb2R1bGVJRCkgeworCisjaWZuZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwljYXNlIENERl9NT0RVTEVfSURfU0FQOgorCXsKKwkJcEdwTW9kQ29udGV4dCA9ICYoZ3BfY2RzX2NvbnRleHQtPnBTQVBDb250ZXh0KTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwljYXNlIENERl9NT0RVTEVfSURfV01BOgorCXsKKwkJcEdwTW9kQ29udGV4dCA9ICYoZ3BfY2RzX2NvbnRleHQtPnBXTUFDb250ZXh0KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBDREZfTU9EVUxFX0lEX0hJRjoKKwl7CisJCXBHcE1vZENvbnRleHQgPSAmKGdwX2Nkc19jb250ZXh0LT5wSElGQ29udGV4dCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgQ0RGX01PRFVMRV9JRF9FUFBJTkc6CisJeworCQlwR3BNb2RDb250ZXh0ID0gJihncF9jZHNfY29udGV4dC0+ZXBwaW5nX2N0eCk7CisJCWJyZWFrOworCX0KKwljYXNlIENERl9NT0RVTEVfSURfU01FOgorCWNhc2UgQ0RGX01PRFVMRV9JRF9QRToKKwljYXNlIENERl9NT0RVTEVfSURfSEREOgorCWNhc2UgQ0RGX01PRFVMRV9JRF9IRERfU09GVEFQOgorCWRlZmF1bHQ6CisJeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBNb2R1bGUgSUQgJWkgIgorCQkJICAiZG9lcyBub3QgaGF2ZSBpdHMgY29udGV4dCBhbGxvY2F0ZWQgYnkgQ0RTIiwKKwkJCSAgX19mdW5jX18sIG1vZHVsZUlEKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJfQorCisJaWYgKE5VTEwgIT0gKnBHcE1vZENvbnRleHQpIHsKKwkJLyogQ29udGV4dCBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCEKKwkJICogUHJldmVudCBkb3VibGUgYWxsb2NhdGlvbgorCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTW9kdWxlIElEICVpIGNvbnRleHQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQiLAorCQkJICBfX2Z1bmNfXywgbW9kdWxlSUQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0VYSVNUUzsKKwl9CisKKwkvKiBEeW5hbWljYWxseSBhbGxvY2F0ZSB0aGUgY29udGV4dCBmb3IgbW9kdWxlICovCisKKwkqcHBNb2R1bGVDb250ZXh0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZSk7CisKKwlpZiAoKnBwTW9kdWxlQ29udGV4dCA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byAiICJhbGxvY2F0ZSBDb250ZXh0IGZvciBtb2R1bGUgSUQgJWkiLAorCQkJICBfX2Z1bmNfXywgbW9kdWxlSUQpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWlmIChtb2R1bGVJRCA9PSBDREZfTU9EVUxFX0lEX1RMU0hJTSkKKwkJY2RmX21lbV96ZXJvKCpwcE1vZHVsZUNvbnRleHQsIHNpemUpOworCisJKnBHcE1vZENvbnRleHQgPSAqcHBNb2R1bGVDb250ZXh0OworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30gLyogY2RzX2FsbG9jX2NvbnRleHQoKSAqLworCisvKioKKyAqIGNkc19mcmVlX2NvbnRleHQoKSAtIGZyZWUgYW4gYWxsb2NhdGVkIGNvbnRleHQgd2l0aGluIHRoZQorICoJCQlDRFMgZ2xvYmFsIENvbnRleHQKKyAqIEBwX2Nkc19jb250ZXh0OiBwb2ludGVyIHRvIHRoZSBnbG9iYWwgVm9zIGNvbnRleHQKKyAqIEBtb2R1bGVJZDogbW9kdWxlIElEIHdobydzIGNvbnRleHQgYXJlYSBpcyBiZWluZyBmcmVlCisgKiBAcE1vZHVsZUNvbnRleHQ6IHBvaW50ZXIgdG8gbW9kdWxlIGNvbnRleHQgYXJlYSB0byBiZSBmcmVlJ2QuCisgKgorICogIFRoaXMgQVBJIGFsbG93cyBhIHVzZXIgdG8gZnJlZSB0aGUgdXNlciBjb250ZXh0IGFyZWEgd2l0aGluIHRoZQorICogIENEUyBHbG9iYWwgQ29udGV4dC4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZHNfZnJlZV9jb250ZXh0KHZvaWQgKnBfY2RzX2NvbnRleHQsIENERl9NT0RVTEVfSUQgbW9kdWxlSUQsCisJCQkgICAgdm9pZCAqcE1vZHVsZUNvbnRleHQpCit7CisJdm9pZCAqKnBHcE1vZENvbnRleHQgPSBOVUxMOworCisJaWYgKChwX2Nkc19jb250ZXh0ID09IE5VTEwpIHx8IChncF9jZHNfY29udGV4dCAhPSBwX2Nkc19jb250ZXh0KSB8fAorCSAgICAocE1vZHVsZUNvbnRleHQgPT0gTlVMTCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTnVsbCBwYXJhbXMgb3IgY29udGV4dCBtaXNtYXRjaCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXN3aXRjaCAobW9kdWxlSUQpIHsKKyNpZm5kZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCWNhc2UgQ0RGX01PRFVMRV9JRF9TQVA6CisJeworCQlwR3BNb2RDb250ZXh0ID0gJihncF9jZHNfY29udGV4dC0+cFNBUENvbnRleHQpOworCQlicmVhazsKKwl9CisjZW5kaWYKKworCWNhc2UgQ0RGX01PRFVMRV9JRF9XTUE6CisJeworCQlwR3BNb2RDb250ZXh0ID0gJihncF9jZHNfY29udGV4dC0+cFdNQUNvbnRleHQpOworCQlicmVhazsKKwl9CisKKwljYXNlIENERl9NT0RVTEVfSURfSElGOgorCXsKKwkJcEdwTW9kQ29udGV4dCA9ICYoZ3BfY2RzX2NvbnRleHQtPnBISUZDb250ZXh0KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBDREZfTU9EVUxFX0lEX0VQUElORzoKKwl7CisJCXBHcE1vZENvbnRleHQgPSAmKGdwX2Nkc19jb250ZXh0LT5lcHBpbmdfY3R4KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBDREZfTU9EVUxFX0lEX1RYUlg6CisJeworCQlwR3BNb2RDb250ZXh0ID0gJihncF9jZHNfY29udGV4dC0+cGRldl90eHJ4X2N0eCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgQ0RGX01PRFVMRV9JRF9IREQ6CisJY2FzZSBDREZfTU9EVUxFX0lEX1NNRToKKwljYXNlIENERl9NT0RVTEVfSURfUEU6CisJY2FzZSBDREZfTU9EVUxFX0lEX0hERF9TT0ZUQVA6CisJZGVmYXVsdDoKKwl7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE1vZHVsZSBJRCAlaSAiCisJCQkgICJkb2VzIG5vdCBoYXZlIGl0cyBjb250ZXh0IGFsbG9jYXRlZCBieSBDRFMiLAorCQkJICBfX2Z1bmNfXywgbW9kdWxlSUQpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKwl9CisKKwlpZiAoTlVMTCA9PSAqcEdwTW9kQ29udGV4dCkgeworCQkvKiBDb250ZXh0IGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgb3IgZnJlZWQgYWxyZWFkeSEgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTW9kdWxlIElEICVpICIKKwkJCSAgImNvbnRleHQgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCBvciBmcmVlZCBhbHJlYWR5IiwKKwkJCSAgX19mdW5jX18sIG1vZHVsZUlEKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmICgqcEdwTW9kQ29udGV4dCAhPSBwTW9kdWxlQ29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBwR3BNb2RDb250ZXh0ICE9IHBNb2R1bGVDb250ZXh0IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKHBNb2R1bGVDb250ZXh0ICE9IE5VTEwpCisJCWNkZl9tZW1fZnJlZShwTW9kdWxlQ29udGV4dCk7CisKKwkqcEdwTW9kQ29udGV4dCA9IE5VTEw7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfSAvKiBjZHNfZnJlZV9jb250ZXh0KCkgKi8KKworLyoqCisgKiBjZHNfbXFfcG9zdF9tZXNzYWdlKCkgLSBwb3N0IGEgbWVzc2FnZSB0byBhIG1lc3NhZ2UgcXVldWUKKyAqIEBtc2dRdWV1ZUlkOiBpZGVudGlmaWVzIHRoZSBtZXNzYWdlIHF1ZXVlIHVwb24gd2hpY2ggdGhlIG1lc3NhZ2UKKyAqCXdpbGwgYmUgcG9zdGVkLgorICogQG1lc3NhZ2U6IGEgcG9pbnRlciB0byBhIG1lc3NhZ2UgYnVmZmVyLiBNZW1vcnkgZm9yIHRoaXMgbWVzc2FnZQorICoJYnVmZmVyIGlzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIGFuZCBmcmVlJ2QgYnkgdGhlIENERiBhZnRlciB0aGUKKyAqCW1lc3NhZ2UgaXMgcG9zdGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlLiAgSWYgdGhlIGNvbnN1bWVyIG9mIHRoZQorICoJbWVzc2FnZSBuZWVkcyBhbnl0aGluZyBpbiB0aGlzIG1lc3NhZ2UsIGl0IG5lZWRzIHRvIGNvcHkgdGhlIGNvbnRlbnRzCisgKgliZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIG1lc3NhZ2UgcXVldWUgaGFuZGxlci4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRCBtc2dRdWV1ZUlkLCBjZHNfbXNnX3QgKnBNc2cpCit7CisJcF9jZHNfbXFfdHlwZSBwVGFyZ2V0TXEgPSBOVUxMOworCXBfY2RzX21zZ193cmFwcGVyIHBNc2dXcmFwcGVyID0gTlVMTDsKKwl1aW50MzJfdCBkZWJ1Z19jb3VudCA9IDA7CisKKwlpZiAoKGdwX2Nkc19jb250ZXh0ID09IE5VTEwpIHx8IChwTXNnID09IE5VTEwpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE51bGwgcGFyYW1zIG9yIGdsb2JhbCBjZHMgY29udGV4dCBpcyBudWxsIiwKKwkJCSAgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJc3dpdGNoIChtc2dRdWV1ZUlkKSB7CisJLyogTWVzc2FnZSBRdWV1ZSBJRCBmb3IgbWVzc2FnZXMgYm91bmQgZm9yIFNNRSAqLworCWNhc2UgQ0RTX01RX0lEX1NNRToKKwl7CisJCXBUYXJnZXRNcSA9ICYoZ3BfY2RzX2NvbnRleHQtPmNkZl9zY2hlZC5zbWVNY01xKTsKKwkJYnJlYWs7CisJfQorCisJLyogTWVzc2FnZSBRdWV1ZSBJRCBmb3IgbWVzc2FnZXMgYm91bmQgZm9yIFBFICovCisJY2FzZSBDRFNfTVFfSURfUEU6CisJeworCQlwVGFyZ2V0TXEgPSAmKGdwX2Nkc19jb250ZXh0LT5jZGZfc2NoZWQucGVNY01xKTsKKwkJYnJlYWs7CisJfQorCisJLyogTWVzc2FnZSBRdWV1ZSBJRCBmb3IgbWVzc2FnZXMgYm91bmQgZm9yIHdtYSAqLworCWNhc2UgQ0RTX01RX0lEX1dNQToKKwl7CisJCXBUYXJnZXRNcSA9ICYoZ3BfY2RzX2NvbnRleHQtPmNkZl9zY2hlZC53bWFNY01xKTsKKwkJYnJlYWs7CisJfQorCisJLyogTWVzc2FnZSBRdWV1ZSBJRCBmb3IgbWVzc2FnZXMgYm91bmQgZm9yIHRoZSBTWVMgbW9kdWxlICovCisJY2FzZSBDRFNfTVFfSURfU1lTOgorCXsKKwkJcFRhcmdldE1xID0gJihncF9jZHNfY29udGV4dC0+Y2RmX3NjaGVkLnN5c01jTXEpOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgKCIlczogVHJ5aW5nIHRvIHF1ZXVlIG1zZyBpbnRvIHVua25vd24gTUMgTXNnIHF1ZXVlIElEICVkIiksCisJCQkgIF9fZnVuY19fLCBtc2dRdWV1ZUlkKTsKKworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJQ0RGX0FTU0VSVChOVUxMICE9IHBUYXJnZXRNcSk7CisJaWYgKHBUYXJnZXRNcSA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHBUYXJnZXRNcSA9PSBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyogVHJ5IGFuZCBnZXQgYSBmcmVlIE1zZyB3cmFwcGVyICovCisJcE1zZ1dyYXBwZXIgPSBjZHNfbXFfZ2V0KCZncF9jZHNfY29udGV4dC0+ZnJlZVZvc01xKTsKKworCWlmIChOVUxMID09IHBNc2dXcmFwcGVyKSB7CisJCWRlYnVnX2NvdW50ID0gYXRvbWljX2luY19yZXR1cm4oJmNkc193cmFwcGVyX2VtcHR5X2NvdW50KTsKKwkJaWYgKDEgPT0gZGVidWdfY291bnQpCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiJXM6IENEUyBDb3JlIHJ1biBvdXQgb2YgbWVzc2FnZSB3cmFwcGVyICVkIiwKKwkJCQlfX2Z1bmNfXywgZGVidWdfY291bnQpOworCisJCWlmIChDRFNfV1JBUFBFUl9NQVhfRkFJTF9DT1VOVCA9PSBkZWJ1Z19jb3VudCkKKwkJCUNERl9CVUcoMCk7CisKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfQorCisJYXRvbWljX3NldCgmY2RzX3dyYXBwZXJfZW1wdHlfY291bnQsIDApOworCisJLyogQ29weSB0aGUgbWVzc2FnZSBub3cgKi8KKwljZGZfbWVtX2NvcHkoKHZvaWQgKilwTXNnV3JhcHBlci0+cFZvc01zZywKKwkJICAgICAodm9pZCAqKXBNc2csIHNpemVvZihjZHNfbXNnX3QpKTsKKworCWNkc19tcV9wdXQocFRhcmdldE1xLCBwTXNnV3JhcHBlcik7CisKKwlzZXRfYml0KE1DX1BPU1RfRVZFTlRfTUFTSywgJmdwX2Nkc19jb250ZXh0LT5jZGZfc2NoZWQubWNFdmVudEZsYWcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3BfY2RzX2NvbnRleHQtPmNkZl9zY2hlZC5tY1dhaXRRdWV1ZSk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfSAvKiBjZHNfbXFfcG9zdF9tZXNzYWdlKCkgKi8KKworLyoqCisgKiBjZHNfc3lzX3Byb2JlX3RocmVhZF9jYmFjaygpIC0gIHByb2JlIG1jIHRocmVhZCBjYWxsYmFjaworICogQHBVc2VyRGF0YTogcG9pbnRlciB0byB1c2VyIGRhdGEKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBjZHNfc3lzX3Byb2JlX3RocmVhZF9jYmFjayh2b2lkICpwVXNlckRhdGEpCit7CisJaWYgKGdwX2Nkc19jb250ZXh0ICE9IHBVc2VyRGF0YSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBncF9jZHNfY29udGV4dCAhPSBwVXNlckRhdGEiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2RmX2V2ZW50X3NldCgmZ3BfY2RzX2NvbnRleHQtPlByb2JlRXZlbnQpICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBjZGZfZXZlbnRfc2V0IGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KK30gLyogY2RzX3N5c19wcm9iZV90aHJlYWRfY2JhY2soKSAqLworCisvKioKKyAqIGNkc193bWFfY29tcGxldGVfY2JhY2soKSAtIHdtYSBjb21wbGV0ZSBjYWxsYmFjaworICogQHBVc2VyRGF0YTogcG9pbnRlciB0byB1c2VyIGRhdGEKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBjZHNfd21hX2NvbXBsZXRlX2NiYWNrKHZvaWQgKnBVc2VyRGF0YSkKK3sKKwlpZiAoZ3BfY2RzX2NvbnRleHQgIT0gcFVzZXJEYXRhKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGdwX2Nkc19jb250ZXh0ICE9IHBVc2VyRGF0YSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjZGZfZXZlbnRfc2V0KCZncF9jZHNfY29udGV4dC0+d21hQ29tcGxldGVFdmVudCkgIT0KKwkgICAgQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGNkZl9ldmVudF9zZXQgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorfSAvKiBjZHNfd21hX2NvbXBsZXRlX2NiYWNrKCkgKi8KKworLyoqCisgKiBjZHNfY29yZV9yZXR1cm5fbXNnKCkgLSByZXR1cm4gY29yZSBtZXNzYWdlCisgKiBAcFZDb250ZXh0OiBwb2ludGVyIHRvIGNkcyBjb250ZXh0CisgKiBAcE1zZ1dyYXBwZXI6IHBvaW50ZXIgdG8gbWVzc2FnZSB3cmFwcGVyCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RzX2NvcmVfcmV0dXJuX21zZyh2b2lkICpwVkNvbnRleHQsIHBfY2RzX21zZ193cmFwcGVyIHBNc2dXcmFwcGVyKQoreworCXBfY2RzX2NvbnRleHRUeXBlIHBfY2RzX2NvbnRleHQgPSAocF9jZHNfY29udGV4dFR5cGUpIHBWQ29udGV4dDsKKworCUNERl9BU1NFUlQoZ3BfY2RzX2NvbnRleHQgPT0gcF9jZHNfY29udGV4dCk7CisKKwlpZiAoZ3BfY2RzX2NvbnRleHQgIT0gcF9jZHNfY29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBncF9jZHNfY29udGV4dCAhPSBwX2Nkc19jb250ZXh0IiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJQ0RGX0FTU0VSVChOVUxMICE9IHBNc2dXcmFwcGVyKTsKKworCWlmIChwTXNnV3JhcHBlciA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHBNc2dXcmFwcGVyID09IE5VTEwgaW4gZnVuY3Rpb24iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSoqIFJldHVybiB0aGUgbWVzc2FnZSBvbiB0aGUgZnJlZSBtZXNzYWdlIHF1ZXVlCisJKi8KKwlJTklUX0xJU1RfSEVBRCgmcE1zZ1dyYXBwZXItPm1zZ05vZGUpOworCWNkc19tcV9wdXQoJnBfY2RzX2NvbnRleHQtPmZyZWVWb3NNcSwgcE1zZ1dyYXBwZXIpOworfSAvKiBjZHNfY29yZV9yZXR1cm5fbXNnKCkgKi8KKworCisvKioKKyAqIGNkc19zaHV0ZG93bigpIC0gc2h1dGRvd24gQ0RTCisgKiBAY2RzX2NvbnRleHQ6IGdsb2JhbCBjZHMgY29udGV4dAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIGNkc19zaHV0ZG93bih2X0NPTlRFWFRfdCBjZHNfY29udGV4dCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdHBBbmlTaXJHbG9iYWwgcG1hYyA9ICgoKHBfY2RzX2NvbnRleHRUeXBlKWNkc19jb250ZXh0KS0+cE1BQ0NvbnRleHQpOworCisJb2xfdHhyeF9wZGV2X2RldGFjaChncF9jZHNfY29udGV4dC0+cGRldl90eHJ4X2N0eCwgMSk7CisJY2RzX2ZyZWVfY29udGV4dChjZHNfY29udGV4dCwgQ0RGX01PRFVMRV9JRF9UWFJYLAorCQkJIGdwX2Nkc19jb250ZXh0LT5wZGV2X3R4cnhfY3R4KTsKKworCWNkZl9zdGF0dXMgPSBzbWVfY2xvc2UoKChwX2Nkc19jb250ZXh0VHlwZSkgY2RzX2NvbnRleHQpLT5wTUFDQ29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGNsb3NlIFNNRSIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCX0KKwkvKgorCSAqIENBQyB0aW1lciB3aWxsIGJlIGluaXRpYXRlZCBhbmQgc3RhcnRlZCBvbmx5IHdoZW4gU0FQIHN0YXJ0cyBvbgorCSAqIERGUyBjaGFubmVsIGFuZCBpdCB3aWxsIGJlIHN0b3BwZWQgYW5kIGRlc3Ryb3llZCBpbW1lZGlhdGVseSBvbmNlIHRoZQorCSAqIHJhZGFyIGRldGVjdGVkIG9yIHRpbWVkb3V0LiBTbyBhcyBwZXIgZGVzaWduIENBQyB0aW1lciBzaG91bGQgYmUKKwkgKiBkZXN0cm95ZWQgYWZ0ZXIgc3RvcAorCSAqLworCWlmIChwbWFjLT5zYXAuU2FwRGZzSW5mby5pc19kZnNfY2FjX3RpbWVyX3J1bm5pbmcpIHsKKwkJY2RmX21jX3RpbWVyX3N0b3AoJnBtYWMtPnNhcC5TYXBEZnNJbmZvLnNhcF9kZnNfY2FjX3RpbWVyKTsKKwkJcG1hYy0+c2FwLlNhcERmc0luZm8uaXNfZGZzX2NhY190aW1lcl9ydW5uaW5nID0gMDsKKwkJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnBtYWMtPnNhcC5TYXBEZnNJbmZvLnNhcF9kZnNfY2FjX3RpbWVyKTsKKwl9CisKKwljZGZfc3RhdHVzID0gbWFjX2Nsb3NlKCgocF9jZHNfY29udGV4dFR5cGUpIGNkc19jb250ZXh0KS0+cE1BQ0NvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBjbG9zZSBNQUMiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKwl9CisKKwkoKHBfY2RzX2NvbnRleHRUeXBlKSBjZHNfY29udGV4dCktPnBNQUNDb250ZXh0ID0gTlVMTDsKKworCWlmIChmYWxzZSA9PSB3bWFfbmVlZHNodXRkb3duKGNkc19jb250ZXh0KSkgeworCisJCWNkZl9zdGF0dXMgPSB3bWFfY2xvc2UoY2RzX2NvbnRleHQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEZhaWxlZCB0byBjbG9zZSB3bWEhIiwgX19mdW5jX18pOworCQkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCQl9CisJfQorCisJaWYgKGdwX2Nkc19jb250ZXh0LT5odGNfY3R4KSB7CisJCWh0Y19zdG9wKGdwX2Nkc19jb250ZXh0LT5odGNfY3R4KTsKKwkJaHRjX2Rlc3Ryb3koZ3BfY2RzX2NvbnRleHQtPmh0Y19jdHgpOworCQlncF9jZHNfY29udGV4dC0+aHRjX2N0eCA9IE5VTEw7CisJfQorCisJY2RmX3N0YXR1cyA9IHdtYV93bWlfc2VydmljZV9jbG9zZShjZHNfY29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGNsb3NlIHdtYV93bWlfc2VydmljZSEiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKwl9CisKKwljZHNfbXFfZGVpbml0KCYoKHBfY2RzX2NvbnRleHRUeXBlKSBjZHNfY29udGV4dCktPmZyZWVWb3NNcSk7CisKKwljZGZfc3RhdHVzID0gY2RmX2V2ZW50X2Rlc3Ryb3koJmdwX2Nkc19jb250ZXh0LT53bWFDb21wbGV0ZUV2ZW50KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBmYWlsZWQgdG8gZGVzdHJveSB3bWFDb21wbGV0ZUV2ZW50IiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSk7CisJfQorCisJY2RmX3N0YXR1cyA9IGNkZl9ldmVudF9kZXN0cm95KCZncF9jZHNfY29udGV4dC0+UHJvYmVFdmVudCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZmFpbGVkIHRvIGRlc3Ryb3kgUHJvYmVFdmVudCIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RzX2dldF92ZGV2X3R5cGVzKCkgLSBnZXQgdmRldiB0eXBlCisgKiBAbW9kZTogbW9kZQorICogQHR5cGU6IHR5cGUKKyAqIEBzdWJfdHlwZTogc3ViX3R5cGUKKyAqCisgKiBSZXR1cm46IFdNSSB2ZGV2IHR5cGUKKyAqLworQ0RGX1NUQVRVUyBjZHNfZ2V0X3ZkZXZfdHlwZXModENERl9DT05fTU9ERSBtb2RlLCB1aW50MzJfdCAqdHlwZSwKKwkJCSAgICAgIHVpbnQzMl90ICpzdWJfdHlwZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkqdHlwZSA9IDA7CisJKnN1Yl90eXBlID0gMDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0RGX1NUQV9NT0RFOgorCQkqdHlwZSA9IFdNSV9WREVWX1RZUEVfU1RBOworCQlicmVhazsKKwljYXNlIENERl9TQVBfTU9ERToKKwkJKnR5cGUgPSBXTUlfVkRFVl9UWVBFX0FQOworCQlicmVhazsKKwljYXNlIENERl9QMlBfREVWSUNFX01PREU6CisJCSp0eXBlID0gV01JX1ZERVZfVFlQRV9BUDsKKwkJKnN1Yl90eXBlID0gV01JX1VOSUZJRURfVkRFVl9TVUJUWVBFX1AyUF9ERVZJQ0U7CisJCWJyZWFrOworCWNhc2UgQ0RGX1AyUF9DTElFTlRfTU9ERToKKwkJKnR5cGUgPSBXTUlfVkRFVl9UWVBFX1NUQTsKKwkJKnN1Yl90eXBlID0gV01JX1VOSUZJRURfVkRFVl9TVUJUWVBFX1AyUF9DTElFTlQ7CisJCWJyZWFrOworCWNhc2UgQ0RGX1AyUF9HT19NT0RFOgorCQkqdHlwZSA9IFdNSV9WREVWX1RZUEVfQVA7CisJCSpzdWJfdHlwZSA9IFdNSV9VTklGSUVEX1ZERVZfU1VCVFlQRV9QMlBfR087CisJCWJyZWFrOworCWNhc2UgQ0RGX09DQl9NT0RFOgorCQkqdHlwZSA9IFdNSV9WREVWX1RZUEVfT0NCOworCQlicmVhazsKKwlkZWZhdWx0OgorCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiSW52YWxpZCBkZXZpY2UgbW9kZSAlZCIsIG1vZGUpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNkc19mbHVzaF93b3JrKCkgLSBmbHVzaCBwZW5kaW5nIHdvcmtzCisgKiBAd29yazogcG9pbnRlciB0byB3b3JrCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RzX2ZsdXNoX3dvcmsodm9pZCAqd29yaykKK3sKKyNpZiBkZWZpbmVkIChDT05GSUdfQ05TUykKKwljbnNzX2ZsdXNoX3dvcmsod29yayk7CisjZWxpZiBkZWZpbmVkIChXTEFOX09QRU5fU09VUkNFKQorCWNhbmNlbF93b3JrX3N5bmMod29yayk7CisjZW5kaWYKK30KKworLyoqCisgKiBjZHNfZmx1c2hfZGVsYXllZF93b3JrKCkgLSBmbHVzaCBkZWxheWVkIHdvcmtzCisgKiBAZHdvcms6IHBvaW50ZXIgdG8gZGVsYXllZCB3b3JrCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RzX2ZsdXNoX2RlbGF5ZWRfd29yayh2b2lkICpkd29yaykKK3sKKyNpZiBkZWZpbmVkIChDT05GSUdfQ05TUykKKwljbnNzX2ZsdXNoX2RlbGF5ZWRfd29yayhkd29yayk7CisjZWxpZiBkZWZpbmVkIChXTEFOX09QRU5fU09VUkNFKQorCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyhkd29yayk7CisjZW5kaWYKK30KKworLyoqCisgKiBjZHNfaXNfcGFja2V0X2xvZ19lbmFibGVkKCkgLSBjaGVjayBpZiBwYWNrZXQgbG9nIGlzIGVuYWJsZWQKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgcGFja2V0IGxvZyBpcyBlbmFibGVkIGVsc2UgZmFsc2UKKyAqLworYm9vbCBjZHNfaXNfcGFja2V0X2xvZ19lbmFibGVkKHZvaWQpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKworCXBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKSAoZ3BfY2RzX2NvbnRleHQtPnBIRERDb250ZXh0KTsKKwlpZiAoKE5VTEwgPT0gcEhkZEN0eCkgfHwgKE5VTEwgPT0gcEhkZEN0eC0+Y29uZmlnKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBIZGQgQ29udGV4dCBpcyBOdWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlUGFja2V0TG9nOworfQorCisvKioKKyAqIGNkc190cmlnZ2VyX3JlY292ZXJ5KCkgLSB0cmlnZ2VyIHNlbGYgcmVjb3ZlcnkKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBjZHNfdHJpZ2dlcl9yZWNvdmVyeSh2b2lkKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlpZiAoIXdtYV9oYW5kbGUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiV01BIGNvbnRleHQgaXMgaW52YWxkISIpOworCQlyZXR1cm47CisJfQorCisJd21hX2NyYXNoX2luamVjdCh3bWFfaGFuZGxlLCBSRUNPVkVSWV9TSU1fU0VMRl9SRUNPVkVSWSwgMCk7CisKKwlzdGF0dXMgPSBjZGZfd2FpdF9zaW5nbGVfZXZlbnQoJndtYV9oYW5kbGUtPnJlY292ZXJ5X2V2ZW50LAorCQlXTUFfQ1JBU0hfSU5KRUNUX1RJTUVPVVQpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiQ1JBU0hfSU5KRUNUIGNvbW1hbmQgaXMgdGltZWQgb3V0ISIpOworICNpZmRlZiBDT05GSUdfQ05TUworCQlpZiAoY2RzX2lzX2xvZ3BfaW5fcHJvZ3Jlc3MoKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIkxPR1AgaXMgaW4gcHJvZ3Jlc3MsIGlnbm9yZSEiKTsKKwkJCXJldHVybjsKKwkJfQorCQljZHNfc2V0X2xvZ3BfaW5fcHJvZ3Jlc3ModHJ1ZSk7CisJCWNuc3Nfc2NoZWR1bGVfcmVjb3Zlcnlfd29yaygpOworICNlbmRpZgorCisJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogY2RzX2dldF9tb25vdG9uaWNfYm9vdHRpbWUoKSAtIEdldCBrZXJuZWwgYm9vdCB0aW1lLgorICoKKyAqIFJldHVybjogVGltZSBpbiBtaWNyb3NlY29uZHMKKyAqLworCit1aW50NjRfdCBjZHNfZ2V0X21vbm90b25pY19ib290dGltZSh2b2lkKQoreworI2lmZGVmIENPTkZJR19DTlNTCisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJY25zc19nZXRfbW9ub3RvbmljX2Jvb3R0aW1lKCZ0cyk7CisJcmV0dXJuICgodWludDY0X3QpIHRzLnR2X3NlYyAqIDEwMDAwMDApICsgKHRzLnR2X25zZWMgLyAxMDAwKTsKKyNlbHNlCisJcmV0dXJuICgodWludDY0X3QpY2RmX3N5c3RlbV90aWNrc190b19tc2VjcyhjZGZfc3lzdGVtX3RpY2tzKCkpICoKKwkJCSAxMDAwKTsKKyNlbmRpZgorfQorCisvKioKKyAqIGNkc19zZXRfd2FrZWxvY2tfbG9nZ2luZygpIC0gTG9nZ2luZyBvZiB3YWtlbG9jayBlbmFibGVkL2Rpc2FibGVkCisgKiBAdmFsdWU6IEJvb2xlYW4gdmFsdWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBmbGFnIHdoaWNoIHdpbGwgaW5kaWNhdGUgd2hldGhlcgorICogbG9nZ2luZyBvZiB3YWtlbG9jayBpcyBlbmFibGVkIG9yIG5vdAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNkc19zZXRfd2FrZWxvY2tfbG9nZ2luZyhib29sIHZhbHVlKQoreworCXBfY2RzX2NvbnRleHRUeXBlIHBfY2RzX2NvbnRleHQ7CisKKwlwX2Nkc19jb250ZXh0ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworCWlmICghcF9jZHNfY29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiY2RzIGNvbnRleHQgaXMgSW52YWxkIik7CisJCXJldHVybjsKKwl9CisJcF9jZHNfY29udGV4dC0+aXNfd2FrZWxvY2tfbG9nX2VuYWJsZWQgPSB2YWx1ZTsKK30KKworLyoqCisgKiBjZHNfaXNfd2FrZWxvY2tfZW5hYmxlZCgpIC0gQ2hlY2sgaWYgbG9nZ2luZyBvZiB3YWtlbG9jayBpcyBlbmFibGVkL2Rpc2FibGVkCisgKiBAdmFsdWU6IEJvb2xlYW4gdmFsdWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciBsb2dnaW5nIG9mIHdha2Vsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgKgorICogUmV0dXJuOiB0cnVlIGlmIGxvZ2dpbmcgb2Ygd2FrZWxvY2sgaXMgZW5hYmxlZAorICovCitib29sIGNkc19pc193YWtlbG9ja19lbmFibGVkKHZvaWQpCit7CisJcF9jZHNfY29udGV4dFR5cGUgcF9jZHNfY29udGV4dDsKKworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFwX2Nkc19jb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSJjZHMgY29udGV4dCBpcyBJbnZhbGQiKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gcF9jZHNfY29udGV4dC0+aXNfd2FrZWxvY2tfbG9nX2VuYWJsZWQ7Cit9CisKKy8qKgorICogY2RzX3NldF9yaW5nX2xvZ19sZXZlbCgpIC0gU2V0cyB0aGUgbG9nIGxldmVsIG9mIGEgcGFydGljdWxhciByaW5nCisgKiBAcmluZ19pZDogcmluZ19pZAorICogQGxvZ19sZXZlbHZhbHVlOiBMb2cgbGV2ZWwgc3BlY2lmaWNlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgSExPUyB2YWx1ZXMgdG8gZHJpdmVyIGxvZyBsZXZlbHMgYW5kIHNldHMgdGhlIGxvZworICogbGV2ZWwgb2YgYSBwYXJ0aWN1bGFyIHJpbmcgYWNjb3JkaW5nbHkuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgY2RzX3NldF9yaW5nX2xvZ19sZXZlbCh1aW50MzJfdCByaW5nX2lkLCB1aW50MzJfdCBsb2dfbGV2ZWwpCit7CisJcF9jZHNfY29udGV4dFR5cGUgcF9jZHNfY29udGV4dDsKKwl1aW50MzJfdCBsb2dfdmFsOworCisJcF9jZHNfY29udGV4dCA9IGNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKTsKKwlpZiAoIXBfY2RzX2NvbnRleHQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIiVzOiBjZHMgY29udGV4dCBpcyBJbnZhbGQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGxvZ19sZXZlbCkgeworCWNhc2UgTE9HX0xFVkVMX05PX0NPTExFQ1RJT046CisJCWxvZ192YWwgPSBXTEFOX0xPR19MRVZFTF9PRkY7CisJCWJyZWFrOworCWNhc2UgTE9HX0xFVkVMX05PUk1BTF9DT0xMRUNUOgorCQlsb2dfdmFsID0gV0xBTl9MT0dfTEVWRUxfTk9STUFMOworCQlicmVhazsKKwljYXNlIExPR19MRVZFTF9JU1NVRV9SRVBSTzoKKwkJbG9nX3ZhbCA9IFdMQU5fTE9HX0xFVkVMX1JFUFJPOworCQlicmVhazsKKwljYXNlIExPR19MRVZFTF9BQ1RJVkU6CisJZGVmYXVsdDoKKwkJbG9nX3ZhbCA9IFdMQU5fTE9HX0xFVkVMX0FDVElWRTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJpbmdfaWQgPT0gUklOR19JRF9XQUtFTE9DSykgeworCQlwX2Nkc19jb250ZXh0LT53YWtlbG9ja19sb2dfbGV2ZWwgPSBsb2dfdmFsOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChyaW5nX2lkID09IFJJTkdfSURfQ09OTkVDVElWSVRZKSB7CisJCXBfY2RzX2NvbnRleHQtPmNvbm5lY3Rpdml0eV9sb2dfbGV2ZWwgPSBsb2dfdmFsOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChyaW5nX2lkID09IFJJTkdfSURfUEVSX1BBQ0tFVF9TVEFUUykgeworCQlwX2Nkc19jb250ZXh0LT5wYWNrZXRfc3RhdHNfbG9nX2xldmVsID0gbG9nX3ZhbDsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAocmluZ19pZCA9PSBSSU5EX0lEX0RSSVZFUl9ERUJVRykgeworCQlwX2Nkc19jb250ZXh0LT5kcml2ZXJfZGVidWdfbG9nX2xldmVsID0gbG9nX3ZhbDsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAocmluZ19pZCA9PSBSSU5HX0lEX0ZJUk1XQVJFX0RFQlVHKSB7CisJCXBfY2RzX2NvbnRleHQtPmZ3X2RlYnVnX2xvZ19sZXZlbCA9IGxvZ192YWw7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogY2RzX2dldF9yaW5nX2xvZ19sZXZlbCgpIC0gR2V0IHRoZSBhIHJpbmcgaWQncyBsb2cgbGV2ZWwKKyAqIEByaW5nX2lkOiBSaW5nIGlkCisgKgorICogRmV0Y2ggYW5kIHJldHVybiB0aGUgbG9nIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gYSByaW5nIGlkCisgKgorICogUmV0dXJuOiBMb2cgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgcmluZyBJRAorICovCitlbnVtIHdpZmlfZHJpdmVyX2xvZ19sZXZlbCBjZHNfZ2V0X3JpbmdfbG9nX2xldmVsKHVpbnQzMl90IHJpbmdfaWQpCit7CisJcF9jZHNfY29udGV4dFR5cGUgcF9jZHNfY29udGV4dDsKKworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFwX2Nkc19jb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSIlczogY2RzIGNvbnRleHQgaXMgSW52YWxkIiwgX19mdW5jX18pOworCQlyZXR1cm4gV0xBTl9MT0dfTEVWRUxfT0ZGOworCX0KKworCWlmIChyaW5nX2lkID09IFJJTkdfSURfV0FLRUxPQ0spCisJCXJldHVybiBwX2Nkc19jb250ZXh0LT53YWtlbG9ja19sb2dfbGV2ZWw7CisJZWxzZSBpZiAocmluZ19pZCA9PSBSSU5HX0lEX0NPTk5FQ1RJVklUWSkKKwkJcmV0dXJuIHBfY2RzX2NvbnRleHQtPmNvbm5lY3Rpdml0eV9sb2dfbGV2ZWw7CisJZWxzZSBpZiAocmluZ19pZCA9PSBSSU5HX0lEX1BFUl9QQUNLRVRfU1RBVFMpCisJCXJldHVybiBwX2Nkc19jb250ZXh0LT5wYWNrZXRfc3RhdHNfbG9nX2xldmVsOworCWVsc2UgaWYgKHJpbmdfaWQgPT0gUklORF9JRF9EUklWRVJfREVCVUcpCisJCXJldHVybiBwX2Nkc19jb250ZXh0LT5kcml2ZXJfZGVidWdfbG9nX2xldmVsOworCWVsc2UgaWYgKHJpbmdfaWQgPT0gUklOR19JRF9GSVJNV0FSRV9ERUJVRykKKwkJcmV0dXJuIHBfY2RzX2NvbnRleHQtPmZ3X2RlYnVnX2xvZ19sZXZlbDsKKworCXJldHVybiBXTEFOX0xPR19MRVZFTF9PRkY7Cit9CisKKy8qKgorICogY2RzX3NldF9tdWx0aWNhc3RfbG9nZ2luZygpIC0gU2V0IG11dGxpY2FzdCBsb2dnaW5nIHZhbHVlCisgKiBAdmFsdWU6IFZhbHVlIG9mIG11bHRpY2FzdCBsb2dnaW5nCisgKgorICogU2V0IHRoZSBtdWx0aWNhc3QgbG9nZ2luZyB2YWx1ZSB3aGljaCB3aWxsIGluZGljYXRlCisgKiB3aGV0aGVyIHRvIG11bHRpY2FzdCBob3N0IGFuZCBmdyBtZXNzYWdlcyBldmVuCisgKiB3aXRob3V0IGFueSByZWdpc3RyYXRpb24gYnkgdXNlcnNwYWNlIGVudGl0eQorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNkc19zZXRfbXVsdGljYXN0X2xvZ2dpbmcodWludDhfdCB2YWx1ZSkKK3sKKwljZHNfbXVsdGljYXN0X2xvZ2dpbmcgPSB2YWx1ZTsKK30KKworLyoqCisgKiBjZHNfaXNfbXVsdGljYXN0X2xvZ2dpbmcoKSAtIEdldCBtdWx0aWNhc3QgbG9nZ2luZyB2YWx1ZQorICoKKyAqIEdldCB0aGUgbXVsdGljYXN0IGxvZ2dpbmcgdmFsdWUgd2hpY2ggd2lsbCBpbmRpY2F0ZQorICogd2hldGhlciB0byBtdWx0aWNhc3QgaG9zdCBhbmQgZncgbWVzc2FnZXMgZXZlbgorICogd2l0aG91dCBhbnkgcmVnaXN0cmF0aW9uIGJ5IHVzZXJzcGFjZSBlbnRpdHkKKyAqCisgKiBSZXR1cm46IDAgLSBNdWx0aWNhc3QgbG9nZ2luZyBkaXNhYmxlZCwgMSAtIE11bHRpY2FzdCBsb2dnaW5nIGVuYWJsZWQKKyAqLwordWludDhfdCBjZHNfaXNfbXVsdGljYXN0X2xvZ2dpbmcodm9pZCkKK3sKKwlyZXR1cm4gY2RzX211bHRpY2FzdF9sb2dnaW5nOworfQorCisvKgorICogY2RzX2luaXRfbG9nX2NvbXBsZXRpb24oKSAtIEluaXRpYWxpemUgbG9nIHBhcmFtIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBsb2dnaW5nIHJlbGF0ZWQKKyAqIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfaW5pdF9sb2dfY29tcGxldGlvbih2b2lkKQoreworCXBfY2RzX2NvbnRleHRUeXBlIHBfY2RzX2NvbnRleHQ7CisKKwlwX2Nkc19jb250ZXh0ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworCWlmICghcF9jZHNfY29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiJXM6IGNkcyBjb250ZXh0IGlzIEludmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlwX2Nkc19jb250ZXh0LT5sb2dfY29tcGxldGUuaXNfZmF0YWwgPSBXTEFOX0xPR19UWVBFX05PTl9GQVRBTDsKKwlwX2Nkc19jb250ZXh0LT5sb2dfY29tcGxldGUuaW5kaWNhdG9yID0gV0xBTl9MT0dfSU5ESUNBVE9SX1VOVVNFRDsKKwlwX2Nkc19jb250ZXh0LT5sb2dfY29tcGxldGUucmVhc29uX2NvZGUgPSBXTEFOX0xPR19SRUFTT05fQ09ERV9VTlVTRUQ7CisJcF9jZHNfY29udGV4dC0+bG9nX2NvbXBsZXRlLmlzX3JlcG9ydF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCS8qIEF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSBhbiBhbHJlYWR5IGluaXRpYWxpemVkIGxvY2sKKwkgKiByZXN1bHRzIGluIGEgZmFpbHVyZS4gVGhpcyBtdXN0IGJlIG9rIGhlcmUuCisJICovCisJY2RmX3NwaW5sb2NrX2luaXQoJnBfY2RzX2NvbnRleHQtPmJ1Z19yZXBvcnRfbG9jayk7Cit9CisKKy8qKgorICogY2RzX2RlaW5pdF9sb2dfY29tcGxldGlvbigpIC0gRGVpbml0aWFsaXplIGxvZyBwYXJhbSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGVpbml0aWFsaXplIHRoZSBsb2dnaW5nIHJlbGF0ZWQKKyAqIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfZGVpbml0X2xvZ19jb21wbGV0aW9uKHZvaWQpCit7CisJcF9jZHNfY29udGV4dFR5cGUgcF9jZHNfY29udGV4dDsKKworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFwX2Nkc19jb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSIlczogY2RzIGNvbnRleHQgaXMgSW52YWxpZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNkZl9zcGlubG9ja19kZXN0cm95KCZwX2Nkc19jb250ZXh0LT5idWdfcmVwb3J0X2xvY2spOworfQorCisvKioKKyAqIGNkc19zZXRfbG9nX2NvbXBsZXRpb24oKSAtIFN0b3JlIHRoZSBsb2dnaW5nIHBhcmFtcworICogQGlzX2ZhdGFsOiBJbmRpY2F0ZXMgaWYgdGhlIGV2ZW50IHRyaWdnZXJpbmcgYnVnIHJlcG9ydCBpcyBmYXRhbCBvciBub3QKKyAqIEBpbmRpY2F0b3I6IFNvdXJjZSB3aGljaCB0cmlnZXJyZWQgdGhlIGJ1ZyByZXBvcnQKKyAqIEByZWFzb25fY29kZTogUmVhc29uIGZvciB0cmlnZ2VyaW5nIGJ1ZyByZXBvcnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBsb2dnaW5nIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlCisgKiBjYWxsZXIKKyAqCisgKiBSZXR1cm46IDAgaWYgc2V0dGluZyBvZiBwYXJhbXMgaXMgc3VjY2Vzc2Z1bAorICovCitDREZfU1RBVFVTIGNkc19zZXRfbG9nX2NvbXBsZXRpb24odWludDMyX3QgaXNfZmF0YWwsCisJCXVpbnQzMl90IGluZGljYXRvciwKKwkJdWludDMyX3QgcmVhc29uX2NvZGUpCit7CisJcF9jZHNfY29udGV4dFR5cGUgcF9jZHNfY29udGV4dDsKKworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFwX2Nkc19jb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSIlczogY2RzIGNvbnRleHQgaXMgSW52YWxpZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNkZl9zcGlubG9ja19hY3F1aXJlKCZwX2Nkc19jb250ZXh0LT5idWdfcmVwb3J0X2xvY2spOworCXBfY2RzX2NvbnRleHQtPmxvZ19jb21wbGV0ZS5pc19mYXRhbCA9IGlzX2ZhdGFsOworCXBfY2RzX2NvbnRleHQtPmxvZ19jb21wbGV0ZS5pbmRpY2F0b3IgPSBpbmRpY2F0b3I7CisJcF9jZHNfY29udGV4dC0+bG9nX2NvbXBsZXRlLnJlYXNvbl9jb2RlID0gcmVhc29uX2NvZGU7CisJcF9jZHNfY29udGV4dC0+bG9nX2NvbXBsZXRlLmlzX3JlcG9ydF9pbl9wcm9ncmVzcyA9IHRydWU7CisJY2RmX3NwaW5sb2NrX3JlbGVhc2UoJnBfY2RzX2NvbnRleHQtPmJ1Z19yZXBvcnRfbG9jayk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZHNfZ2V0X2xvZ19jb21wbGV0aW9uKCkgLSBHZXQgdGhlIGxvZ2dpbmcgcmVsYXRlZCBwYXJhbXMKKyAqIEBpc19mYXRhbDogSW5kaWNhdGVzIGlmIHRoZSBldmVudCB0cmlnZ2VyaW5nIGJ1ZyByZXBvcnQgaXMgZmF0YWwgb3Igbm90CisgKiBAaW5kaWNhdG9yOiBTb3VyY2Ugd2hpY2ggdHJpZ2VycmVkIHRoZSBidWcgcmVwb3J0CisgKiBAcmVhc29uX2NvZGU6IFJlYXNvbiBmb3IgdHJpZ2dlcmluZyBidWcgcmVwb3J0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgbG9nZ2luZyByZWxhdGVkIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfZ2V0X2xvZ19jb21wbGV0aW9uKHVpbnQzMl90ICppc19mYXRhbCwKKwkJdWludDMyX3QgKmluZGljYXRvciwKKwkJdWludDMyX3QgKnJlYXNvbl9jb2RlKQoreworCXBfY2RzX2NvbnRleHRUeXBlIHBfY2RzX2NvbnRleHQ7CisKKwlwX2Nkc19jb250ZXh0ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworCWlmICghcF9jZHNfY29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiJXM6IGNkcyBjb250ZXh0IGlzIEludmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwljZGZfc3BpbmxvY2tfYWNxdWlyZSgmcF9jZHNfY29udGV4dC0+YnVnX3JlcG9ydF9sb2NrKTsKKwkqaXNfZmF0YWwgPSAgcF9jZHNfY29udGV4dC0+bG9nX2NvbXBsZXRlLmlzX2ZhdGFsOworCSppbmRpY2F0b3IgPSBwX2Nkc19jb250ZXh0LT5sb2dfY29tcGxldGUuaW5kaWNhdG9yOworCSpyZWFzb25fY29kZSA9IHBfY2RzX2NvbnRleHQtPmxvZ19jb21wbGV0ZS5yZWFzb25fY29kZTsKKwlwX2Nkc19jb250ZXh0LT5sb2dfY29tcGxldGUuaXNfcmVwb3J0X2luX3Byb2dyZXNzID0gZmFsc2U7CisJY2RmX3NwaW5sb2NrX3JlbGVhc2UoJnBfY2RzX2NvbnRleHQtPmJ1Z19yZXBvcnRfbG9jayk7Cit9CisKKy8qKgorICogY2RzX2lzX2xvZ19yZXBvcnRfaW5fcHJvZ3Jlc3MoKSAtIENoZWNrIGlmIGJ1ZyByZXBvcnRpbmcgaXMgaW4gcHJvZ3Jlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGJ1ZyByZXBvcnRpbmcgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcworICoKKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgYnVnIHJlcG9ydGluZyBpcyBpbiBwcm9ncmVzcworICovCitib29sIGNkc19pc19sb2dfcmVwb3J0X2luX3Byb2dyZXNzKHZvaWQpCit7CisJcF9jZHNfY29udGV4dFR5cGUgcF9jZHNfY29udGV4dDsKKworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFwX2Nkc19jb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSIlczogY2RzIGNvbnRleHQgaXMgSW52YWxpZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBwX2Nkc19jb250ZXh0LT5sb2dfY29tcGxldGUuaXNfcmVwb3J0X2luX3Byb2dyZXNzOworfQorCisvKioKKyAqIGNkc19mbHVzaF9sb2dzKCkgLSBSZXBvcnQgZmF0YWwgZXZlbnQgdG8gdXNlcnNwYWNlCisgKiBAaXNfZmF0YWw6IEluZGljYXRlcyBpZiB0aGUgZXZlbnQgdHJpZ2dlcmluZyBidWcgcmVwb3J0IGlzIGZhdGFsIG9yIG5vdAorICogQGluZGljYXRvcjogU291cmNlIHdoaWNoIHRyaWdlcnJlZCB0aGUgYnVnIHJlcG9ydAorICogQHJlYXNvbl9jb2RlOiBSZWFzb24gZm9yIHRyaWdnZXJpbmcgYnVnIHJlcG9ydAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgbG9nIHJlbGF0ZWQgcGFyYW1zIGFuZCBzZW5kIHRoZSBXTUkgY29tbWFuZCB0byB0aGUKKyAqIEZXIHRvIGZsdXNoIGl0cyBsb2dzLiBPbiByZWNlaXZpbmcgdGhlIGZsdXNoIGNvbXBsZXRpb24gZXZlbnQgZnJvbSB0aGUgRlcKKyAqIHRoZSBzYW1lIHdpbGwgYmUgY29udmV5ZWQgdG8gdXNlcnNwYWNlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MKKyAqLworQ0RGX1NUQVRVUyBjZHNfZmx1c2hfbG9ncyh1aW50MzJfdCBpc19mYXRhbCwKKwkJdWludDMyX3QgaW5kaWNhdG9yLAorCQl1aW50MzJfdCByZWFzb25fY29kZSkKK3sKKwl1aW50MzJfdCByZXQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlwX2Nkc19jb250ZXh0VHlwZSBwX2Nkc19jb250ZXh0OworCisJcF9jZHNfY29udGV4dCA9IGNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKTsKKwlpZiAoIXBfY2RzX2NvbnRleHQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIiVzOiBjZHMgY29udGV4dCBpcyBJbnZhbGlkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKGNkc19pc19sb2dfcmVwb3J0X2luX3Byb2dyZXNzKCkgPT0gdHJ1ZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiJXM6IEJ1ZyByZXBvcnQgYWxyZWFkeSBpbiBwcm9ncmVzcyAtIGRyb3BwaW5nISB0eXBlOiVkLCBpbmRpY2F0b3I9JWQgcmVhc29uX2NvZGU9JWQiLAorCQkJCV9fZnVuY19fLCBpc19mYXRhbCwgaW5kaWNhdG9yLCByZWFzb25fY29kZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlzdGF0dXMgPSBjZHNfc2V0X2xvZ19jb21wbGV0aW9uKGlzX2ZhdGFsLCBpbmRpY2F0b3IsIHJlYXNvbl9jb2RlKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSIlczogRmFpbGVkIHRvIHNldCBsb2cgdHJpZ2dlciBwYXJhbXMiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJIiVzOiBUcmlnZ2VyaW5nIGJ1ZyByZXBvcnQ6IHR5cGU6JWQsIGluZGljYXRvcj0lZCByZWFzb25fY29kZT0lZCIsCisJCQlfX2Z1bmNfXywgaXNfZmF0YWwsIGluZGljYXRvciwgcmVhc29uX2NvZGUpOworCisJcmV0ID0gc21lX3NlbmRfZmx1c2hfbG9nc19jbWRfdG9fZncocF9jZHNfY29udGV4dC0+cE1BQ0NvbnRleHQpOworCWlmICgwICE9IHJldCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiJXM6IEZhaWxlZCB0byBzZW5kIGZsdXNoIEZXIGxvZyIsIF9fZnVuY19fKTsKKwkJY2RzX2luaXRfbG9nX2NvbXBsZXRpb24oKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RzX2xvZ2dpbmdfc2V0X2Z3X2ZsdXNoX2NvbXBsZXRlKCkgLSBXcmFwcGVyIGZvciBGVyBsb2cgZmx1c2ggY29tcGxldGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIHNpZ25hbCB0byB0aGUgbG9nZ2VyIHRocmVhZCB0byBpbmRpY2F0ZQorICogdGhhdCB0aGUgZmx1c2hpbmcgb2YgRlcgbG9ncyBpcyBjb21wbGV0ZSBieSB0aGUgRlcKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqCisgKi8KK3ZvaWQgY2RzX2xvZ2dpbmdfc2V0X2Z3X2ZsdXNoX2NvbXBsZXRlKHZvaWQpCit7CisJd2xhbl9sb2dnaW5nX3NldF9md19mbHVzaF9jb21wbGV0ZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9jZHMvc3JjL2Nkc19jb25jdXJyZW5jeS5jIGIvY29yZS9jZHMvc3JjL2Nkc19jb25jdXJyZW5jeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTA0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9zcmMvY2RzX2NvbmN1cnJlbmN5LmMKQEAgLTAsMCArMSw2ODIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogY2RzX2NvbmN1cnJlbmN5LmMKKyAqCisgKiBXTEFOIENvbmN1cnJlbmN0IENvbm5lY3Rpb24gTWFuYWdlbWVudCBmdW5jdGlvbnMKKyAqCisgKi8KKworLyogSW5jbHVkZSBmaWxlcyAqLworCisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgPGNkc19zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF90eF9yeC5oPgorI2luY2x1ZGUgPHduaV9hcGkuaD4KKyNpbmNsdWRlICJ3bGFuX2hkZF90cmFjZS5oIgorI2luY2x1ZGUgIndsYW5faGRkX2hvc3RhcGQuaCIKKyNpbmNsdWRlICJjZHNfY29uY3VycmVuY3kuaCIKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKworI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgInNhcF9hcGkuaCIKKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJxd2xhbl92ZXJzaW9uLmgiCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAid21hLmgiCisjaW5jbHVkZSAid21hX2FwaS5oIgorI2luY2x1ZGUgImNkc191dGlscy5oIgorI2luY2x1ZGUgImNkc19yZWdfc2VydmljZS5oIgorI2luY2x1ZGUgIndsYW5faGRkX2lwYS5oIgorCisjZGVmaW5lIENEU19NQVhfRkVBVFVSRV9TRVQgICA4CitzdGF0aWMgc3RydWN0IGNkc19jb25jX2Nvbm5lY3Rpb25faW5mbworCWNvbmNfY29ubmVjdGlvbl9saXN0W01BWF9OVU1CRVJfT0ZfQ09OQ19DT05ORUNUSU9OU107CisKKyNkZWZpbmUgQ09OQ19DT05ORUNUSU9OX0xJU1RfVkFMSURfSU5ERVgoaW5kZXgpIFwKKwkJKChNQVhfTlVNQkVSX09GX0NPTkNfQ09OTkVDVElPTlMgPiBpbmRleCkgJiYgXAorCQkJKGNvbmNfY29ubmVjdGlvbl9saXN0W2luZGV4XS5pbl91c2UpKQorCisjZGVmaW5lIENEU19NQVhfQ09OX1NUUklOR19MRU4gICA1MAorLyoqCisgKiBmaXJzdF9jb25uZWN0aW9uX3BjbF90YWJsZSAtIHRhYmxlIHdoaWNoIHByb3ZpZGVzIFBDTCBmb3IgdGhlCisgKiB2ZXJ5IGZpcnN0IGNvbm5lY3Rpb24gaW4gdGhlIHN5c3RlbQorICovCitzdGF0aWMgY29uc3QgZW51bSBjZHNfcGNsX3R5cGUKK2ZpcnN0X2Nvbm5lY3Rpb25fcGNsX3RhYmxlW0NEU19NQVhfTlVNX09GX01PREVdCisJCQlbQ0RTX01BWF9DT05DX1BSSU9SSVRZX01PREVdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19OT05FLCBDRFNfTk9ORSwgQ0RTX05PTkV9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181RywgICBDRFNfNUcsICAgQ0RTXzVHICB9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUcsICAgQ0RTXzVHLCAgIENEU181RyAgfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUcsICAgQ0RTXzVHLCAgIENEU181RyAgfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7Q0RTX05PTkUsIENEU19OT05FLCBDRFNfTk9ORX0sCit9OworCisvKioKKyAqIHNlY29uZF9jb25uZWN0aW9uX3BjbF9kYnNfdGFibGUgLSB0YWJsZSB3aGljaCBwcm92aWRlcyBQQ0wKKyAqIGZvciB0aGUgMm5kIGNvbm5lY3Rpb24sIHdoZW4gd2UgaGF2ZSBhIGNvbm5lY3Rpb24gYWxyZWFkeSBpbgorICogdGhlIHN5c3RlbSAod2l0aCBEQlMgc3VwcG9ydGVkIGJ5IEhXKQorICovCitzdGF0aWMgY29uc3QgZW51bSBjZHNfcGNsX3R5cGUKK3NlY29uZF9jb25uZWN0aW9uX3BjbF9kYnNfdGFibGVbQ0RTX01BWF9PTkVfQ09OTkVDVElPTl9NT0RFXQorCQkJW0NEU19NQVhfTlVNX09GX01PREVdW0NEU19NQVhfQ09OQ19QUklPUklUWV9NT0RFXSA9IHsKKwlbQ0RTX1NUQV8yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7Q0RTXzVHLCAgICAgICAgQ0RTXzVHLCAgICAgICAgQ0RTXzVHICAgICAgIH0gfSwKKworCVtDRFNfU1RBXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHtDRFNfNUcsICAgICAgICBDRFNfNUcsICAgICAgICBDRFNfNUcgICAgICAgfSB9LAorCisJW0NEU19TVEFfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9CXsKKwkJCUNEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHtDRFNfMjRHLCAgICAgICAgQ0RTXzI0RywgICAgICAgIENEU18yNEcgICAgICAgfSB9LAorCisJW0NEU19TVEFfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9CXsKKwkJCUNEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHtDRFNfMjRHLCAgICAgICAgQ0RTXzI0RywgICAgICAgIENEU18yNEcgICAgICAgfSB9LAorCisJW0NEU19QMlBfQ0xJXzI0XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0NMSV8yNF8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9DTElfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9CXsKKwkJCUNEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0NMSV81XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0JeworCQkJQ0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fMjRfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfU0NDX0NIXzI0RywgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfU0NDX0NIXzI0RywgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfU0NDX0NIXzI0RywgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX0NIXzI0RywgQ0RTX1NDQ19DSF8yNEcsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NIXzI0RywgQ0RTX1NDQ19DSF8yNEcsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPQl7CisJCQlDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NIXzI0RywgQ0RTX1NDQ19DSF8yNEcsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NBUF8yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NBUF8yNF8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NBUF81XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU19TQ0NfQ0hfMjRHLCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU19TQ0NfQ0hfMjRHLCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0JeworCQkJQ0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU19TQ0NfQ0hfMjRHLCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TQVBfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfU0NDX0NIXzI0RywgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfU0NDX0NIXzI0RywgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9CXsKKwkJCUNEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfU0NDX0NIXzI0RywgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfSUJTU18yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9CXsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19JQlNTXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPQl7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfSUJTU181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzI0R19TQ0NfQ0gsIENEU18yNEdfU0NDX0NILCBDRFNfMjRHX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPQl7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfSUJTU181XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzI0R19TQ0NfQ0gsIENEU18yNEdfU0NDX0NILCBDRFNfMjRHX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPQl7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKK307CisKKy8qKgorICogc2Vjb25kX2Nvbm5lY3Rpb25fcGNsX25vZGJzX3RhYmxlIC0gdGFibGUgd2hpY2ggcHJvdmlkZXMgUENMCisgKiBmb3IgdGhlIDJuZCBjb25uZWN0aW9uLCB3aGVuIHdlIGhhdmUgYSBjb25uZWN0aW9uIGFscmVhZHkgaW4KKyAqIHRoZSBzeXN0ZW0gKHdpdGggREJTIG5vdCBzdXBwb3J0ZWQgYnkgSFcpCisgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGNkc19wY2xfdHlwZQorc2Vjb25kX2Nvbm5lY3Rpb25fcGNsX25vZGJzX3RhYmxlW0NEU19NQVhfT05FX0NPTk5FQ1RJT05fTU9ERV0KKwkJCVtDRFNfTUFYX05VTV9PRl9NT0RFXVtDRFNfTUFYX0NPTkNfUFJJT1JJVFlfTU9ERV0gPSB7CisJW0NEU19TVEFfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSF81R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSF81R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIXzVHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV8yNF8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIXzVHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIXzVHfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0hfNUd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBXzVfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIXzVHfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX1NDQ19DSF81RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSF81RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0hfNUd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9DTElfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSF81R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSF81R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIXzVHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9DTElfMjRfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSF81R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSF81R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIXzVHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9DTElfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0hfNUd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9DTElfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0hfNUd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT18yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT18yNF8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSF81RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgICAgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19TQ0NfQ0gsICAgIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19TQ0NfQ0gsICAgIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NILCAgICBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgICAgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSCwgICAgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TQVBfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TQVBfMjRfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TQVBfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NBUF81XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSF81RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfSUJTU18yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfSUJTU18yNF8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfSUJTU181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19JQlNTXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfU0FQX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCit9OworCisvKioKKyAqIHRoaXJkX2Nvbm5lY3Rpb25fcGNsX2Ric190YWJsZSAtIHRhYmxlIHdoaWNoIHByb3ZpZGVzIFBDTCBmb3IKKyAqIHRoZSAzcmQgY29ubmVjdGlvbiwgd2hlbiB3ZSBoYXZlIHR3byBjb25uZWN0aW9ucyBhbHJlYWR5IGluCisgKiB0aGUgc3lzdGVtICh3aXRoIERCUyBzdXBwb3J0ZWQgYnkgSFcpCisgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGNkc19wY2xfdHlwZQordGhpcmRfY29ubmVjdGlvbl9wY2xfZGJzX3RhYmxlW0NEU19NQVhfVFdPX0NPTk5FQ1RJT05fTU9ERV0KKwkJCVtDRFNfTUFYX05VTV9PRl9NT0RFXVtDRFNfTUFYX0NPTkNfUFJJT1JJVFlfTU9ERV0gPSB7CisJW0NEU19TVEFfU0FQX1NDQ18yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9TQVBfU0NDXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1NBUF9NQ0NfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTXzVHLCBDRFNfNUdfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9TQVBfTUNDXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTXzVHLCBDRFNfNUdfTUNDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfU0FQX1NDQ181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfU0FQX1NDQ181XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfU0FQX01DQ181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU18yNEcsICAgICAgICBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9TQVBfTUNDXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzI0RywgICAgICAgIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1NBUF9NQ0NfMjRfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19NQ0NfQ0hfNUcsIENEU181RywgQ0RTXzVHfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfMjRHLCAgICAgICAgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfU0FQX01DQ18yNF81XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSF81RywgQ0RTXzVHLCBDRFNfNUd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU18yNEcsICAgICAgICBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisjaWZuZGVmIFFDQV9XSUZJXzNfMF9FTVUKKwlbQ0RTX1NUQV9TQVBfREJTXzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCUNEU19TQ0NfT05fNV9TQ0NfT05fMjRfNUcsIENEU19OT05FLCBDRFNfU0NDX09OXzVfU0NDX09OXzI0fSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNF81RywgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNF81RywgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQlDRFNfU0NDX09OXzVfU0NDX09OXzI0XzVHLCBDRFNfTk9ORSwgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorI2Vsc2UKKwlbQ0RTX1NUQV9TQVBfREJTXzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCUNEU19TQ0NfT05fNV9TQ0NfT05fMjQsIENEU19OT05FLCBDRFNfU0NDX09OXzVfU0NDX09OXzI0fSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNCwgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNCwgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQlDRFNfU0NDX09OXzVfU0NDX09OXzI0LCBDRFNfTk9ORSwgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorI2VuZGlmCisJW0NEU19TVEFfUDJQX0dPX1NDQ18yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfR09fU0NDXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9HT19NQ0NfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTXzVHLCBDRFNfNUdfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfR09fTUNDXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTXzVHLCBDRFNfNUdfTUNDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0dPX1NDQ181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0dPX1NDQ181XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEdfU0NDX0NILCBDRFNfU0NDX0NIXzI0R30sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0dPX01DQ181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU18yNEcsICAgICAgICBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfR09fTUNDXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzI0RywgICAgICAgIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9HT19NQ0NfMjRfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19NQ0NfQ0hfNUcsIENEU181RywgQ0RTXzVHfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfMjRHLCAgICAgICAgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0dPX01DQ18yNF81XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSF81RywgQ0RTXzVHLCBDRFNfNUd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU18yNEcsICAgICAgICBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisjaWZuZGVmIFFDQV9XSUZJXzNfMF9FTVUKKwlbQ0RTX1NUQV9QMlBfR09fREJTXzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCUNEU19TQ0NfT05fNV9TQ0NfT05fMjRfNUcsIENEU19OT05FLCBDRFNfU0NDX09OXzVfU0NDX09OXzI0fSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNF81RywgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNF81RywgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQlDRFNfU0NDX09OXzVfU0NDX09OXzI0XzVHLCBDRFNfTk9ORSwgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorI2Vsc2UKKwlbQ0RTX1NUQV9QMlBfR09fREJTXzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCUNEU19TQ0NfT05fNV9TQ0NfT05fMjQsIENEU19OT05FLCBDRFNfU0NDX09OXzVfU0NDX09OXzI0fSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNCwgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNCwgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQlDRFNfU0NDX09OXzVfU0NDX09OXzI0LCBDRFNfTk9ORSwgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorI2VuZGlmCisJW0NEU19TVEFfUDJQX0NMSV9TQ0NfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfQ0xJX1NDQ18yNF8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSCwgQ0RTXzVHX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9DTElfTUNDXzI0XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0NMSV9NQ0NfMjRfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTXzVHLCBDRFNfNUdfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfQ0xJX1NDQ181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfQ0xJX1NDQ181XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfQ0xJX01DQ181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTX01DQ19DSF8yNEd9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTX01DQ19DSF8yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfTUNDX0NIXzI0R30sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0NMSV9NQ0NfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU19NQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU19NQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTX01DQ19DSF8yNEd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHtDRFNfTk9ORSwgQ0RTX05PTkUsIENEU19OT05FfSB9LAorCisJW0NEU19TVEFfUDJQX0NMSV9NQ0NfMjRfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU19NQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU19NQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTX01DQ19DSF8yNEd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9DTElfTUNDXzI0XzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfTUNDX0NIXzI0R30sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfTUNDX0NIXzI0R30sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU19NQ0NfQ0hfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisjaWZuZGVmIFFDQV9XSUZJXzNfMF9FTVUKKwlbQ0RTX1NUQV9QMlBfQ0xJX0RCU18xeDFdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCUNEU19TQ0NfT05fNV9TQ0NfT05fMjRfNUcsIENEU19OT05FLCBDRFNfU0NDX09OXzVfU0NDX09OXzI0fSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCUNEU19TQ0NfT05fNV9TQ0NfT05fMjRfNUcsIENEU19OT05FLCBDRFNfU0NDX09OXzVfU0NDX09OXzI0fSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNF81RywgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKyNlbHNlCisJW0NEU19TVEFfUDJQX0NMSV9EQlNfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfU0FQX01PREVdID0geworCQlDRFNfU0NDX09OXzVfU0NDX09OXzI0LCBDRFNfTk9ORSwgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQlDRFNfU0NDX09OXzVfU0NDX09OXzI0LCBDRFNfTk9ORSwgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCUNEU19TQ0NfT05fNV9TQ0NfT05fMjQsIENEU19OT05FLCBDRFNfU0NDX09OXzVfU0NDX09OXzI0fSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisjZW5kaWYKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX1NDQ18yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX1NDQ18yNF8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0gsIENEU181R19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NILCBDRFNfNUdfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ18yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTXzVHLCBDRFNfNUdfTUNDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTXzVHLCBDRFNfNUdfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1AyUF9DTElfTUNDXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTXzVHLCBDRFNfNUdfTUNDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfNUcsIENEU181R19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU181RywgQ0RTXzVHX01DQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fUDJQX0NMSV9TQ0NfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHX1NDQ19DSCwgQ0RTX1NDQ19DSF8yNEd9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1AyUF9DTElfU0NDXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NIXzI0RywgQ0RTXzI0R19TQ0NfQ0gsIENEU19TQ0NfQ0hfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU18yNEcsICAgICAgICBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ181XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU18yNEcsICAgICAgICBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ18yNF81XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSF81RywgQ0RTXzVHLCBDRFNfNUd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU18yNEcsICAgICAgICBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ18yNF81XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSF81RywgQ0RTXzVHLCBDRFNfNUd9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU18yNEcsICAgICAgICBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisjaWZuZGVmIFFDQV9XSUZJXzNfMF9FTVUKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX0RCU18xeDFdID0geworCVtDRFNfU1RBX01PREVdID0geworCQlDRFNfU0NDX09OXzVfU0NDX09OXzI0XzVHLCBDRFNfTk9ORSwgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNH0sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCUNEU19TQ0NfT05fNV9TQ0NfT05fMjRfNUcsIENEU19OT05FLCBDRFNfU0NDX09OXzVfU0NDX09OXzI0fSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCUNEU19TQ0NfT05fNV9TQ0NfT05fMjRfNUcsIENEU19OT05FLCBDRFNfU0NDX09OXzVfU0NDX09OXzI0fSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNF81RywgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKyNlbHNlCisJW0NEU19QMlBfR09fUDJQX0NMSV9EQlNfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHsKKwkJQ0RTX1NDQ19PTl81X1NDQ19PTl8yNCwgQ0RTX05PTkUsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfU0FQX01PREVdID0geworCQlDRFNfU0NDX09OXzVfU0NDX09OXzI0LCBDRFNfTk9ORSwgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQlDRFNfU0NDX09OXzVfU0NDX09OXzI0LCBDRFNfTk9ORSwgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCUNEU19TQ0NfT05fNV9TQ0NfT05fMjQsIENEU19OT05FLCBDRFNfU0NDX09OXzVfU0NDX09OXzI0fSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisjZW5kaWYKKwlbQ0RTX1AyUF9HT19TQVBfU0NDXzI0XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHLCBDRFNfNUcsIENEU181R30sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1NBUF9TQ0NfMjRfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUcsIENEU181RywgQ0RTXzVHfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fU0FQX01DQ18yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181RywgQ0RTXzVHLCBDRFNfNUd9LAorCVtDRFNfU0FQX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19TQVBfTUNDXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHLCBDRFNfNUcsIENEU181R30sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1NBUF9TQ0NfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fU0FQX1NDQ181XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSF8yNEcsIENEU18yNEcsIENEU18yNEd9LAorCVtDRFNfU0FQX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19TQVBfTUNDXzVfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1NBUF9NQ0NfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19NQ0NfQ0hfMjRHLCBDRFNfMjRHLCBDRFNfMjRHfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fU0FQX01DQ18yNF81XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSF81RywgQ0RTXzVHLCBDRFNfNUd9LAorCVtDRFNfU0FQX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19TQVBfTUNDXzI0XzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfTUNDX0NIXzVHLCBDRFNfNUcsIENEU181R30sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKyNpZm5kZWYgUUNBX1dJRklfM18wX0VNVQorCVtDRFNfUDJQX0dPX1NBUF9EQlNfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX09OXzVfU0NDX09OXzI0XzVHLAorCUNEU19TQ0NfT05fNV9TQ0NfT05fMjRfNUcsIENEU19TQ0NfT05fNV9TQ0NfT05fMjRfNUd9LAorCVtDRFNfU0FQX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisjZWxzZQorCVtDRFNfUDJQX0dPX1NBUF9EQlNfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX09OXzVfU0NDX09OXzI0LAorCUNEU19TQ0NfT05fNV9TQ0NfT05fMjQsIENEU19TQ0NfT05fNV9TQ0NfT05fMjR9LAorCVtDRFNfU0FQX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisjZW5kaWYKK307CisKKy8qKgorICogdGhpcmRfY29ubmVjdGlvbl9wY2xfbm9kYnNfdGFibGUgLSB0YWJsZSB3aGljaCBwcm92aWRlcyBQQ0wKKyAqIGZvciB0aGUgM3JkIGNvbm5lY3Rpb24sIHdoZW4gd2UgaGF2ZSB0d28gY29ubmVjdGlvbnMgYWxyZWFkeQorICogaW4gdGhlIHN5c3RlbSAod2l0aCBEQlMgbm90IHN1cHBvcnRlZCBieSBIVykKKyAqLworc3RhdGljIGNvbnN0IGVudW0gY2RzX3BjbF90eXBlCit0aGlyZF9jb25uZWN0aW9uX3BjbF9ub2Ric190YWJsZVtDRFNfTUFYX1RXT19DT05ORUNUSU9OX01PREVdCisJCQlbQ0RTX01BWF9OVU1fT0ZfTU9ERV1bQ0RTX01BWF9DT05DX1BSSU9SSVRZX01PREVdID0geworCVtDRFNfU1RBX1NBUF9TQ0NfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUcsICAgICAgICBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTXzVHLCAgICAgICAgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfU0FQX1NDQ18yNF8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181RywgICAgICAgIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUcsICAgICAgICBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9TQVBfTUNDXzI0XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTXzVHX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9TQVBfTUNDXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTXzVHX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9TQVBfU0NDXzVfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfU0FQX1NDQ181XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1NBUF9NQ0NfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9TQVBfTUNDXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfU0FQX01DQ18yNF81XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1NBUF9NQ0NfMjRfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9TQVBfREJTXzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0dPX1NDQ18yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU181RywgICAgICAgIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0hfNUcsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUcsICAgICAgICBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfR09fU0NDXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHLCAgICAgICAgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSF81RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181RywgICAgICAgIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9HT19NQ0NfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU181R19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9HT19NQ0NfMjRfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU181R19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9HT19TQ0NfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfR09fU0NDXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0dPX01DQ181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9HT19NQ0NfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfR09fTUNDXzI0XzVfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0dPX01DQ18yNF81XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9HT19EQlNfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfU0FQX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfQ0xJX1NDQ18yNF8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSF81RywgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9DTElfU0NDXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0NMSV9NQ0NfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19NQ0NfQ0hfNUcsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfQ0xJX01DQ18yNF8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX01DQ19DSF81RywgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU181R19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9DTElfU0NDXzVfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfQ0xJX1NDQ181XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0NMSV9NQ0NfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9DTElfTUNDXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1NUQV9QMlBfQ0xJX01DQ18yNF81XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19TVEFfUDJQX0NMSV9NQ0NfMjRfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfU1RBX1AyUF9DTElfREJTXzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fUDJQX0NMSV9TQ0NfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUcsICAgICAgICBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTXzVHLCAgICAgICAgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fUDJQX0NMSV9TQ0NfMjRfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUcsICAgICAgICBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NIXzVHLCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTXzVHLCAgICAgICAgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTXzVHX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fUDJQX0NMSV9NQ0NfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU181R19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1AyUF9DTElfTUNDXzI0XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTXzVHX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTXzVHX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfNUdfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX1NDQ181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1AyUF9DTElfU0NDXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX1NDQ19DSCwgQ0RTX1NDQ19DSCwgQ0RTX1NDQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fUDJQX0NMSV9NQ0NfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ181XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0dPX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1AyUF9DTElfTUNDXzI0XzVfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fUDJQX0NMSV9NQ0NfMjRfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX0RCU18xeDFdID0geworCVtDRFNfU1RBX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1NBUF9TQ0NfMjRfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfU0NDX0NILCBDRFNfU0NDX0NILCBDRFNfU0NDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fU0FQX1NDQ18yNF8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19TQ0NfQ0gsIENEU19TQ0NfQ0gsIENEU19TQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19TQVBfTUNDXzI0XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1NBUF9NQ0NfMjRfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfTUNDX0NILCBDRFNfTUNDX0NILCBDRFNfTUNDX0NIfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fU0FQX1NDQ181XzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSCwgQ0RTX01DQ19DSCwgQ0RTX01DQ19DSH0sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1NBUF9TQ0NfNV8yeDJdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19NQ0NfQ0gsIENEU19NQ0NfQ0gsIENEU19NQ0NfQ0h9LAorCVtDRFNfU0FQX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19TQVBfTUNDXzVfMXgxXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19TQVBfTUNDXzVfMngyXSA9IHsKKwlbQ0RTX1NUQV9NT0RFXSA9IHtDRFNfTUNDX0NIXzI0RywgQ0RTXzI0RywgQ0RTXzI0R30sCisJW0NEU19TQVBfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9DTElFTlRfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1AyUF9HT19NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfSUJTU19NT0RFXSA9IHsKKwkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0gfSwKKworCVtDRFNfUDJQX0dPX1NBUF9NQ0NfMjRfNV8xeDFdID0geworCVtDRFNfU1RBX01PREVdID0ge0NEU19NQ0NfQ0hfNUcsIENEU181RywgQ0RTXzVHfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorCisJW0NEU19QMlBfR09fU0FQX01DQ18yNF81XzJ4Ml0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7Q0RTX01DQ19DSF81RywgQ0RTXzVHLCBDRFNfNUd9LAorCVtDRFNfU0FQX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfQ0xJRU5UX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19QMlBfR09fTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX0lCU1NfTU9ERV0gPSB7CisJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9IH0sCisKKwlbQ0RTX1AyUF9HT19TQVBfREJTXzF4MV0gPSB7CisJW0NEU19TVEFfTU9ERV0gPSB7CisJCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSwKKwlbQ0RTX1NBUF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0NMSUVOVF9NT0RFXSA9IHsKKwkJCUNEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEUsIENEU19NQVhfUENMX1RZUEV9LAorCVtDRFNfUDJQX0dPX01PREVdID0geworCQkJQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRSwgQ0RTX01BWF9QQ0xfVFlQRX0sCisJW0NEU19JQlNTX01PREVdID0geworCQlDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFLCBDRFNfTUFYX1BDTF9UWVBFfSB9LAorfTsKKworLyoqCisgKiBuZXh0X2FjdGlvbl90d29fY29ubmVjdGlvbl90YWJsZSAtIHRhYmxlIHdoaWNoIHByb3ZpZGVzIG5leHQKKyAqIGFjdGlvbiB3aGlsZSBhIG5ldyBjb25uZWN0aW9uIGlzIGNvbWluZyB1cCwgd2l0aCBvbmUKKyAqIGNvbm5lY3Rpb24gYWxyZWFkeSBpbiB0aGUgc3lzdGVtCisgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGNkc19jb25jX25leHRfYWN0aW9uCituZXh0X2FjdGlvbl90d29fY29ubmVjdGlvbl90YWJsZVtDRFNfTUFYX09ORV9DT05ORUNUSU9OX01PREVdW0NEU19NQVhfQkFORF0gPSB7CisJW0NEU19TVEFfMjRfMXgxXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTfSwKKwlbQ0RTX1NUQV8yNF8yeDJdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19EQlNfRE9XTkdSQURFfSwKKwlbQ0RTX1NUQV81XzF4MV0gPSB7Q0RTX0RCUywgICAgICAgICAgICAgQ0RTX05PUH0sCisJW0NEU19TVEFfNV8yeDJdID0ge0NEU19EQlNfRE9XTkdSQURFLCAgIENEU19OT1B9LAorCVtDRFNfUDJQX0NMSV8yNF8xeDFdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19EQlN9LAorCVtDRFNfUDJQX0NMSV8yNF8yeDJdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19EQlNfRE9XTkdSQURFfSwKKwlbQ0RTX1AyUF9DTElfNV8xeDFdID0ge0NEU19EQlMsICAgICAgICAgICAgIENEU19OT1B9LAorCVtDRFNfUDJQX0NMSV81XzJ4Ml0gPSB7Q0RTX0RCU19ET1dOR1JBREUsICAgQ0RTX05PUH0sCisJW0NEU19QMlBfR09fMjRfMXgxXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTfSwKKwlbQ0RTX1AyUF9HT18yNF8yeDJdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19EQlNfRE9XTkdSQURFfSwKKwlbQ0RTX1AyUF9HT181XzF4MV0gPSB7Q0RTX0RCUywgICAgICAgICAgICAgQ0RTX05PUH0sCisJW0NEU19QMlBfR09fNV8yeDJdID0ge0NEU19EQlNfRE9XTkdSQURFLCAgIENEU19OT1B9LAorCVtDRFNfU0FQXzI0XzF4MV0gPSB7Q0RTX05PUCwgICAgICAgICAgICAgQ0RTX0RCU30sCisJW0NEU19TQVBfMjRfMngyXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTX0RPV05HUkFERX0sCisJW0NEU19TQVBfNV8xeDFdID0ge0NEU19EQlMsICAgICAgICAgICAgIENEU19OT1B9LAorCVtDRFNfU0FQXzVfMngyXSA9IHtDRFNfREJTX0RPV05HUkFERSwgICBDRFNfTk9QfSwKKwlbQ0RTX0lCU1NfMjRfMXgxXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfTk9QfSwKKwlbQ0RTX0lCU1NfMjRfMngyXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfTk9QfSwKKwlbQ0RTX0lCU1NfNV8xeDFdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19OT1B9LAorCVtDRFNfSUJTU181XzJ4Ml0gPSB7Q0RTX05PUCwgICAgICAgICAgICAgQ0RTX05PUH0sCit9OworCisvKioKKyAqIG5leHRfYWN0aW9uX3RocmVlX2Nvbm5lY3Rpb25fdGFibGUgLSB0YWJsZSB3aGljaCBwcm92aWRlcyBuZXh0CisgKiBhY3Rpb24gd2hpbGUgYSBuZXcgY29ubmVjdGlvbiBpcyBjb21pbmcgdXAsIHdpdGggdHdvCisgKiBjb25uZWN0aW9ucyBhbHJlYWR5IGluIHRoZSBzeXN0ZW0KKyAqLworc3RhdGljIGNvbnN0IGVudW0gY2RzX2NvbmNfbmV4dF9hY3Rpb24KK25leHRfYWN0aW9uX3RocmVlX2Nvbm5lY3Rpb25fdGFibGVbQ0RTX01BWF9UV09fQ09OTkVDVElPTl9NT0RFXQorCQkJCVtDRFNfTUFYX0JBTkRdID0geworCVtDRFNfU1RBX1NBUF9TQ0NfMjRfMXgxXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTfSwKKwlbQ0RTX1NUQV9TQVBfU0NDXzI0XzJ4Ml0gPSB7Q0RTX05PUCwgICAgICAgICAgICAgQ0RTX0RCU19ET1dOR1JBREV9LAorCVtDRFNfU1RBX1NBUF9NQ0NfMjRfMXgxXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTfSwKKwlbQ0RTX1NUQV9TQVBfTUNDXzI0XzJ4Ml0gPSB7Q0RTX05PUCwgICAgICAgICAgICAgQ0RTX0RCU19ET1dOR1JBREV9LAorCVtDRFNfU1RBX1NBUF9TQ0NfNV8xeDFdID0ge0NEU19EQlMsICAgICAgICAgICAgIENEU19OT1B9LAorCVtDRFNfU1RBX1NBUF9TQ0NfNV8yeDJdID0ge0NEU19EQlNfRE9XTkdSQURFLCAgIENEU19OT1B9LAorCVtDRFNfU1RBX1NBUF9NQ0NfNV8xeDFdID0ge0NEU19EQlMsICAgICAgICAgICAgIENEU19OT1B9LAorCVtDRFNfU1RBX1NBUF9NQ0NfNV8yeDJdID0ge0NEU19EQlNfRE9XTkdSQURFLCAgIENEU19OT1B9LAorCVtDRFNfU1RBX1NBUF9NQ0NfMjRfNV8xeDFdID0ge0NEU19EQlMsICAgICAgICAgICAgIENEU19EQlN9LAorCVtDRFNfU1RBX1NBUF9NQ0NfMjRfNV8yeDJdID0ge0NEU19EQlNfRE9XTkdSQURFLCAgIENEU19EQlNfRE9XTkdSQURFfSwKKwlbQ0RTX1NUQV9TQVBfREJTXzF4MV0gPSB7Q0RTX05PUCwgICAgICAgICAgICAgQ0RTX05PUH0sCisJW0NEU19TVEFfUDJQX0dPX1NDQ18yNF8xeDFdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19EQlN9LAorCVtDRFNfU1RBX1AyUF9HT19TQ0NfMjRfMngyXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTX0RPV05HUkFERX0sCisJW0NEU19TVEFfUDJQX0dPX01DQ18yNF8xeDFdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19EQlN9LAorCVtDRFNfU1RBX1AyUF9HT19NQ0NfMjRfMngyXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTX0RPV05HUkFERX0sCisJW0NEU19TVEFfUDJQX0dPX1NDQ181XzF4MV0gPSB7Q0RTX0RCUywgICAgICAgICAgICAgQ0RTX05PUH0sCisJW0NEU19TVEFfUDJQX0dPX1NDQ181XzJ4Ml0gPSB7Q0RTX0RCU19ET1dOR1JBREUsICAgQ0RTX05PUH0sCisJW0NEU19TVEFfUDJQX0dPX01DQ181XzF4MV0gPSB7Q0RTX0RCUywgICAgICAgICAgICAgQ0RTX05PUH0sCisJW0NEU19TVEFfUDJQX0dPX01DQ181XzJ4Ml0gPSB7Q0RTX0RCU19ET1dOR1JBREUsICAgQ0RTX05PUH0sCisJW0NEU19TVEFfUDJQX0dPX01DQ18yNF81XzF4MV0gPSB7Q0RTX0RCUywgICAgICAgICAgICAgQ0RTX0RCU30sCisJW0NEU19TVEFfUDJQX0dPX01DQ18yNF81XzJ4Ml0gPSB7CisJCQlDRFNfREJTX0RPV05HUkFERSwgICBDRFNfREJTX0RPV05HUkFERX0sCisJW0NEU19TVEFfUDJQX0dPX0RCU18xeDFdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19OT1B9LAorCVtDRFNfU1RBX1AyUF9DTElfU0NDXzI0XzF4MV0gPSB7Q0RTX05PUCwgICAgICAgICAgICAgQ0RTX0RCU30sCisJW0NEU19TVEFfUDJQX0NMSV9TQ0NfMjRfMngyXSA9IHsKKwkJCUNEU19OT1AsICAgICAgICAgICAgIENEU19EQlNfRE9XTkdSQURFfSwKKwlbQ0RTX1NUQV9QMlBfQ0xJX01DQ18yNF8xeDFdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19EQlN9LAorCVtDRFNfU1RBX1AyUF9DTElfTUNDXzI0XzJ4Ml0gPSB7CisJCQlDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTX0RPV05HUkFERX0sCisJW0NEU19TVEFfUDJQX0NMSV9TQ0NfNV8xeDFdID0ge0NEU19EQlMsICAgICAgICAgICAgIENEU19OT1B9LAorCVtDRFNfU1RBX1AyUF9DTElfU0NDXzVfMngyXSA9IHtDRFNfREJTX0RPV05HUkFERSwgICBDRFNfTk9QfSwKKwlbQ0RTX1NUQV9QMlBfQ0xJX01DQ181XzF4MV0gPSB7Q0RTX0RCUywgICAgICAgICAgICAgQ0RTX05PUH0sCisJW0NEU19TVEFfUDJQX0NMSV9NQ0NfNV8yeDJdID0ge0NEU19EQlNfRE9XTkdSQURFLCAgIENEU19OT1B9LAorCVtDRFNfU1RBX1AyUF9DTElfTUNDXzI0XzVfMXgxXSA9IHtDRFNfREJTLCAgICAgICAgICAgICBDRFNfREJTfSwKKwlbQ0RTX1NUQV9QMlBfQ0xJX01DQ18yNF81XzJ4Ml0gPSB7CisJCQlDRFNfREJTX0RPV05HUkFERSwgICBDRFNfREJTX0RPV05HUkFERX0sCisJW0NEU19TVEFfUDJQX0NMSV9EQlNfMXgxXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfTk9QfSwKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX1NDQ18yNF8xeDFdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19EQlN9LAorCVtDRFNfUDJQX0dPX1AyUF9DTElfU0NDXzI0XzJ4Ml0gPSB7CisJCQlDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTX0RPV05HUkFERX0sCisJW0NEU19QMlBfR09fUDJQX0NMSV9NQ0NfMjRfMXgxXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTfSwKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ18yNF8yeDJdID0geworCQkJQ0RTX05PUCwgICAgICAgICAgICAgQ0RTX0RCU19ET1dOR1JBREV9LAorCVtDRFNfUDJQX0dPX1AyUF9DTElfU0NDXzVfMXgxXSA9IHtDRFNfREJTLCAgICAgICAgICAgICBDRFNfTk9QfSwKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX1NDQ181XzJ4Ml0gPSB7Q0RTX0RCU19ET1dOR1JBREUsICAgQ0RTX05PUH0sCisJW0NEU19QMlBfR09fUDJQX0NMSV9NQ0NfNV8xeDFdID0ge0NEU19EQlMsICAgICAgICAgICAgIENEU19OT1B9LAorCVtDRFNfUDJQX0dPX1AyUF9DTElfTUNDXzVfMngyXSA9IHtDRFNfREJTX0RPV05HUkFERSwgICBDRFNfTk9QfSwKKwlbQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ18yNF81XzF4MV0gPSB7Q0RTX0RCUywgICAgICAgICAgICAgQ0RTX0RCU30sCisJW0NEU19QMlBfR09fUDJQX0NMSV9NQ0NfMjRfNV8yeDJdID0geworCQkJQ0RTX0RCU19ET1dOR1JBREUsICAgQ0RTX0RCU19ET1dOR1JBREV9LAorCVtDRFNfUDJQX0dPX1AyUF9DTElfREJTXzF4MV0gPSB7Q0RTX05PUCwgICAgICAgICAgICAgQ0RTX05PUH0sCisJW0NEU19QMlBfR09fU0FQX1NDQ18yNF8xeDFdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19EQlN9LAorCVtDRFNfUDJQX0dPX1NBUF9TQ0NfMjRfMngyXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTX0RPV05HUkFERX0sCisJW0NEU19QMlBfR09fU0FQX01DQ18yNF8xeDFdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19EQlN9LAorCVtDRFNfUDJQX0dPX1NBUF9NQ0NfMjRfMngyXSA9IHtDRFNfTk9QLCAgICAgICAgICAgICBDRFNfREJTX0RPV05HUkFERX0sCisJW0NEU19QMlBfR09fU0FQX1NDQ181XzF4MV0gPSB7Q0RTX0RCUywgICAgICAgICAgICAgQ0RTX05PUH0sCisJW0NEU19QMlBfR09fU0FQX1NDQ181XzJ4Ml0gPSB7Q0RTX0RCU19ET1dOR1JBREUsICAgQ0RTX05PUH0sCisJW0NEU19QMlBfR09fU0FQX01DQ181XzF4MV0gPSB7Q0RTX0RCUywgICAgICAgICAgICAgQ0RTX05PUH0sCisJW0NEU19QMlBfR09fU0FQX01DQ181XzJ4Ml0gPSB7Q0RTX0RCU19ET1dOR1JBREUsICAgQ0RTX05PUH0sCisJW0NEU19QMlBfR09fU0FQX01DQ18yNF81XzF4MV0gPSB7Q0RTX0RCUywgICAgICAgICAgICAgQ0RTX0RCU30sCisJW0NEU19QMlBfR09fU0FQX01DQ18yNF81XzJ4Ml0gPSB7CisJCQlDRFNfREJTX0RPV05HUkFERSwgICBDRFNfREJTX0RPV05HUkFERX0sCisJW0NEU19QMlBfR09fU0FQX0RCU18xeDFdID0ge0NEU19OT1AsICAgICAgICAgICAgIENEU19OT1B9LAorfTsKKworLyoqCisgKiBjZHNfdXBkYXRlX2NvbmNfbGlzdCgpIC0gVXBkYXRlIHRoZSBjb25jdXJyZW50IGNvbm5lY3Rpb24gbGlzdAorICogQGNvbm5faW5kZXg6IENvbm5lY3Rpb24gaW5kZXgKKyAqIEBtb2RlOiBNb2RlCisgKiBAY2hhbjogQ2hhbm5lbAorICogQG1hYzogTWFjIGlkCisgKiBAY2hhaW5fbWFzazogQ2hhaW4gbWFzaworICogQHR4X3NwYXRpYWxfc3RyZWFtOiBUeCBzcGF0aWFsIHN0cmVhbQorICogQHJ4X3NwYXRpYWxfc3RyZWFtOiBSeCBzcGF0aWFsIHN0cmVhbQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBpbl91c2U6IEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGluZGV4IGlzIGluIHVzZSBvciBub3QKKyAqCisgKiBVcGRhdGVzIHRoZSBpbmRleCB2YWx1ZSBvZiB0aGUgY29uY3VycmVudCBjb25uZWN0aW9uIGxpc3QKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY2RzX3VwZGF0ZV9jb25jX2xpc3QodWludDMyX3QgY29ubl9pbmRleCwKKwkJZW51bSBjZHNfY29uX21vZGUgbW9kZSwKKwkJdWludDhfdCBjaGFuLAorCQl1aW50OF90IG1hYywKKwkJZW51bSBjZHNfY2hhaW5fbW9kZSBjaGFpbl9tYXNrLAorCQl1aW50OF90IHR4X3NwYXRpYWxfc3RyZWFtLAorCQl1aW50OF90IHJ4X3NwYXRpYWxfc3RyZWFtLAorCQl1aW50MzJfdCBvcmlnaW5hbF9uc3MsCisJCXVpbnQzMl90IHZkZXZfaWQsCisJCWJvb2wgaW5fdXNlKQoreworCWlmIChjb25uX2luZGV4ID49IE1BWF9OVU1CRVJfT0ZfQ09OQ19DT05ORUNUSU9OUykgeworCQljZHNfZXJyKCJOdW1iZXIgb2YgY29ubmVjdGlvbnMgZXhjZWVkZWQgY29ubl9pbmRleDogJWQiLAorCQkJY29ubl9pbmRleCk7CisJCXJldHVybjsKKwl9CisJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0ubW9kZSA9IG1vZGU7CisJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0uY2hhbiA9IGNoYW47CisJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0ubWFjID0gbWFjOworCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLmNoYWluX21hc2sgPSBjaGFpbl9tYXNrOworCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLnR4X3NwYXRpYWxfc3RyZWFtID0gdHhfc3BhdGlhbF9zdHJlYW07CisJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0ucnhfc3BhdGlhbF9zdHJlYW0gPSByeF9zcGF0aWFsX3N0cmVhbTsKKwljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5vcmlnaW5hbF9uc3MgPSBvcmlnaW5hbF9uc3M7CisJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0udmRldl9pZCA9IHZkZXZfaWQ7CisJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0uaW5fdXNlID0gaW5fdXNlOworfQorCisvKioKKyAqIGNkc19tb2RlX3NwZWNpZmljX2Nvbm5lY3Rpb25fY291bnQoKSAtIHByb3ZpZGVzIHRoZQorICogY291bnQgb2YgY29ubmVjdGlvbnMgb2Ygc3BlY2lmaWMgbW9kZQorICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKiBAbW9kZTogdHlwZSBvZiBjb25uZWN0aW9uCisgKiBAbGlzdDogVG8gcHJvdmlkZSB0aGUgaW5kaWNlcyBvbiBjb25jX2Nvbm5lY3Rpb25fbGlzdAorICoJKG9wdGlvbmFsKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGNvdW50IG9mIGN1cnJlbnQgY29ubmVjdGlvbnMKKyAqCisgKiBSZXR1cm46IGNvbm5lY3Rpb24gY291bnQgb2Ygc3BlY2lmaWMgdHlwZQorICovCitzdGF0aWMgdWludDMyX3QgY2RzX21vZGVfc3BlY2lmaWNfY29ubmVjdGlvbl9jb3VudChoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkJIGVudW0gY2RzX2Nvbl9tb2RlIG1vZGUsCisJCQkJCQkgdWludDMyX3QgKmxpc3QpCit7CisJdWludDMyX3QgY29ubl9pbmRleCA9IDAsIGNvdW50ID0gMDsKKwlmb3IgKGNvbm5faW5kZXggPSAwOyBjb25uX2luZGV4IDwgTUFYX05VTUJFUl9PRl9DT05DX0NPTk5FQ1RJT05TOworCQkgY29ubl9pbmRleCsrKSB7CisJCWlmICgoY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0ubW9kZSA9PSBtb2RlKSAmJgorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0uaW5fdXNlKSB7CisJCQlpZiAobGlzdCAhPSBOVUxMKQorCQkJCWxpc3RbY291bnRdID0gY29ubl9pbmRleDsKKwkJCSBjb3VudCsrOworCQl9CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBjZHNfc3RvcmVfYW5kX2RlbF9jb25uX2luZm8oKSAtIFN0b3JlIGFuZCBkZWwgYSBjb25uZWN0aW9uIGluZm8KKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQG1vZGU6IE1vZGUgd2hvc2UgZW50cnkgaGFzIHRvIGJlIGRlbGV0ZWQKKyAqIEBpbmZvOiBTdHJ1dHVyZSBwb2ludGVyIHdoZXJlIHRoZSBjb25uZWN0aW9uIGluZm8gd2lsbCBiZSBzYXZlZAorICoKKyAqIFNhdmVzIHRoZSBjb25uZWN0aW9uIGluZm8gY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgbW9kZQorICogYW5kIGRlbGV0ZWQgdGhhdCBjb3JyZXNwb25kaW5nIGVudHJ5IGJhc2VkIG9uIHZkZXYgZnJvbSB0aGUKKyAqIGNvbm5lY3Rpb24gaW5mbyBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY2RzX3N0b3JlX2FuZF9kZWxfY29ubl9pbmZvKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICAgICAgZW51bSBjZHNfY29uX21vZGUgbW9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgY2RzX2NvbmNfY29ubmVjdGlvbl9pbmZvICppbmZvKQoreworCXVpbnQzMl90IGNvbm5faW5kZXggPSAwOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCXdoaWxlIChDT05DX0NPTk5FQ1RJT05fTElTVF9WQUxJRF9JTkRFWChjb25uX2luZGV4KSkgeworCQlpZiAobW9kZSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5tb2RlKSB7CisJCQlmb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQljb25uX2luZGV4Kys7CisJfQorCisJaWYgKCFmb3VuZCkgeworCQljZHNfZXJyKCJNb2RlOiVkIG5vdCBhdmFpbGFibGUgaW4gdGhlIGNvbm4gaW5mbyIsIG1vZGUpOworCQlyZXR1cm47CisJfQorCisJLyogU3RvcmluZyB0aGUgU1RBIGVudHJ5IHdoaWNoIHdpbGwgYmUgdGVtcG9yYXJpbHkgZGVsZXRlZCAqLworCSppbmZvID0gY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF07CisKKwkvKiBEZWxldGluZyB0aGUgU1RBIGVudHJ5ICovCisJY2RzX2RlY3JfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4LCBpbmZvLT52ZGV2X2lkKTsKKworCWNkc19pbmZvKCJTdG9yZWQgJWQgKCVkKSwgZGVsZXRlZCBTVEEgZW50cnkgd2l0aCB2ZGV2IGlkICVkLCBpbmRleCAlZCIsCisJCWluZm8tPnZkZXZfaWQsIGluZm8tPm1vZGUsIGluZm8tPnZkZXZfaWQsIGNvbm5faW5kZXgpOworCisJLyogQ2FsbGVyIHNob3VsZCBzZXQgdGhlIFBDTCBhbmQgcmVzdG9yZSB0aGUgU1RBIGVudHJ5IGluIGNvbm4gaW5mbyAqLworfQorCisvKioKKyAqIGNkc19yZXN0b3JlX2RlbGV0ZWRfY29ubl9pbmZvKCkgLSBSZXN0b3JlIGNvbm5lY3Rpb24gaW5mbworICogQGhkZF9jdHg6IEhERCBjb250ZXh0CisgKiBAaW5mbzogU2F2ZWQgY29ubmVjdGlvbiBpbmZvIHRoYXQgaXMgdG8gYmUgcmVzdG9yZWQKKyAqCisgKiBSZXN0b3JlcyB0aGUgY29ubmVjdGlvbiBpbmZvIG9mIFNUQSB0aGF0IHdhcyBzYXZlZCBiZWZvcmUKKyAqIHVwZGF0aW5nIHRoZSBQQ0wgdG8gdGhlIEZXCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGNkc19yZXN0b3JlX2RlbGV0ZWRfY29ubl9pbmZvKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCXN0cnVjdCBjZHNfY29uY19jb25uZWN0aW9uX2luZm8gKmluZm8pCit7CisJdWludDMyX3QgY29ubl9pbmRleDsKKworCWNvbm5faW5kZXggPSBjZHNfZ2V0X2Nvbm5lY3Rpb25fY291bnQoaGRkX2N0eCk7CisJaWYgKE1BWF9OVU1CRVJfT0ZfQ09OQ19DT05ORUNUSU9OUyA8PSBjb25uX2luZGV4KSB7CisJCWNkc19lcnIoIkZhaWxlZCB0byByZXN0b3JlIHRoZSBkZWxldGVkIGluZm9ybWF0aW9uICVkLyVkIiwKKwkJCWNvbm5faW5kZXgsIE1BWF9OVU1CRVJfT0ZfQ09OQ19DT05ORUNUSU9OUyk7CisJCXJldHVybjsKKwl9CisKKwljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XSA9ICppbmZvOworCisJY2RzX2luZm8oIlJlc3RvcmVkIHRoZSBkZWxlbGV0ZWQgY29ubiBpbmZvLCB2ZGV2OiVkLCBpbmRleDolZCIsCisJCWluZm8tPnZkZXZfaWQsIGNvbm5faW5kZXgpOworfQorCisvKioKKyAqIGNkc191cGRhdGVfaHdfbW9kZV9jb25uX2luZm8oKSAtIFVwZGF0ZSBjb25uZWN0aW9uIGluZm8gYmFzZWQgb24gSFcgbW9kZQorICogQG51bV92ZGV2X21hY19lbnRyaWVzOiBOdW1iZXIgb2YgdmRldi1tYWMgaWQgZW50cmllcyB0aGF0IGZvbGxvdworICogQHZkZXZfbWFjX21hcDogTWFwcGluZyBvZiB2ZGV2LW1hYyBpZAorICogQGh3X21vZGU6IEhXIG1vZGUKKyAqCisgKiBVcGRhdGVzIHRoZSBjb25uZWN0aW9uIGluZm8gcGFyYW1ldGVycyBiYXNlZCBvbiB0aGUgbmV3IEhXIG1vZGUKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY2RzX3VwZGF0ZV9od19tb2RlX2Nvbm5faW5mbyh1aW50MzJfdCBudW1fdmRldl9tYWNfZW50cmllcywKKwkJCQkgICAgICAgc3RydWN0IHNpcl92ZGV2X21hY19tYXAgKnZkZXZfbWFjX21hcCwKKwkJCQkgICAgICAgc3RydWN0IHNpcl9od19tb2RlX3BhcmFtcyBod19tb2RlKQoreworCXVpbnQzMl90IGksIGNvbm5faW5kZXgsIGZvdW5kOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisKKwloZGRfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoMCAhPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpKSB7CisJCWNkc19lcnIoIkludmFsaWQgSEREIENvbnRleHQiKTsKKwkJcmV0dXJuOworCX0KKworCWNkZl9tdXRleF9hY3F1aXJlKCZoZGRfY3R4LT5oZGRfY29uY19saXN0X2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBudW1fdmRldl9tYWNfZW50cmllczsgaSsrKSB7CisJCWNvbm5faW5kZXggPSAwOworCQlmb3VuZCA9IDA7CisJCXdoaWxlIChDT05DX0NPTk5FQ1RJT05fTElTVF9WQUxJRF9JTkRFWChjb25uX2luZGV4KSkgeworCQkJaWYgKHZkZXZfbWFjX21hcFtpXS52ZGV2X2lkID09CisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0udmRldl9pZCkgeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbm5faW5kZXgrKzsKKwkJfQorCQlpZiAoZm91bmQpIHsKKwkJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLm1hYyA9CisJCQkJdmRldl9tYWNfbWFwW2ldLm1hY19pZDsKKwkJCWlmICh2ZGV2X21hY19tYXBbaV0ubWFjX2lkID09IDApIHsKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS4KKwkJCQkJdHhfc3BhdGlhbF9zdHJlYW0gPSBod19tb2RlLm1hYzBfdHhfc3M7CisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0uCisJCQkJCXJ4X3NwYXRpYWxfc3RyZWFtID0gaHdfbW9kZS5tYWMwX3J4X3NzOworCQkJfSBlbHNlIHsKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS4KKwkJCQkJdHhfc3BhdGlhbF9zdHJlYW0gPSBod19tb2RlLm1hYzFfdHhfc3M7CisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0uCisJCQkJCXJ4X3NwYXRpYWxfc3RyZWFtID0gaHdfbW9kZS5tYWMxX3J4X3NzOworCQkJfQorCQkJY2RzX2luZm8oInZkZXY6JWQsIG1hYzolZCwgdHggc3M6JWQsIHJ4IHNzOyVkIiwKKwkJCSAgY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0udmRldl9pZCwKKwkJCSAgY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0ubWFjLAorCQkJICBjb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS50eF9zcGF0aWFsX3N0cmVhbSwKKwkJCSAgY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0ucnhfc3BhdGlhbF9zdHJlYW0pOworCQl9CisJfQorCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfY3R4LT5oZGRfY29uY19saXN0X2xvY2spOworfQorCisvKioKKyAqIGNkc19zb2Nfc2V0X2R1YWxfbWFjX2NmZ19jYigpIC0gQ2FsbGJhY2sgZm9yIHNldCBkdWFsIG1hYyBjb25maWcKKyAqIEBzdGF0dXM6IFN0YXR1cyBvZiBzZXQgZHVhbCBtYWMgY29uZmlnCisgKiBAc2Nhbl9jb25maWc6IEN1cnJlbnQgc2NhbiBjb25maWcgd2hvc2Ugc3RhdHVzIGlzIHRoZSBmaXJzdCBwYXJhbQorICogQGZ3X21vZGVfY29uZmlnOiBDdXJyZW50IEZXIG1vZGUgY29uZmlnIHdob3NlIHN0YXR1cyBpcyB0aGUgZmlyc3QgcGFyYW0KKyAqCisgKiBDYWxsYmFjayBvbiBzZXR0aW5nIHRoZSBkdWFsIG1hYyBjb25maWd1cmF0aW9uCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgY2RzX3NvY19zZXRfZHVhbF9tYWNfY2ZnX2NiKGVudW0gc2V0X2h3X21vZGVfc3RhdHVzIHN0YXR1cywKKwkJdWludDMyX3Qgc2Nhbl9jb25maWcsCisJCXVpbnQzMl90IGZ3X21vZGVfY29uZmlnKQoreworCWNkc19pbmZvKCJTdGF0dXM6JWQgZm9yIHNjYW5fY29uZmlnOiV4IGZ3X21vZGVfY29uZmlnOiV4IiwKKwkJCXN0YXR1cywgc2Nhbl9jb25maWcsIGZ3X21vZGVfY29uZmlnKTsKK30KKworLyoqCisgKiBjZHNfc2V0X2R1YWxfbWFjX3NjYW5fY29uZmlnKCkgLSBTZXQgdGhlIGR1YWwgTUFDIHNjYW4gY29uZmlnCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqIEBkYnNfdmFsOiBWYWx1ZSBvZiBEQlMgYml0CisgKiBAZGJzX3BsdXNfYWdpbGVfc2Nhbl92YWw6IFZhbHVlIG9mIERCUyBwbHVzIGFnaWxlIHNjYW4gYml0CisgKiBAc2luZ2xlX21hY19zY2FuX3dpdGhfZGJzX3ZhbDogVmFsdWUgb2YgU2luZ2xlIE1BQyBzY2FuIHdpdGggREJTCisgKgorICogU2V0IHRoZSB2YWx1ZXMgb2Ygc2NhbiBjb25maWcuIEZvciBGVyBtb2RlIGNvbmZpZywgdGhlIGV4aXN0aW5nIHZhbHVlcworICogd2lsbCBiZSByZXRhaW5lZAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNkc19zZXRfZHVhbF9tYWNfc2Nhbl9jb25maWcoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJdWludDhfdCBkYnNfdmFsLAorCQl1aW50OF90IGRic19wbHVzX2FnaWxlX3NjYW5fdmFsLAorCQl1aW50OF90IHNpbmdsZV9tYWNfc2Nhbl93aXRoX2Ric192YWwpCit7CisJc3RydWN0IHNpcl9kdWFsX21hY19jb25maWcgY2ZnOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKCFoZGRfY3R4KSB7CisJCWNkc19lcnIoIkhERCBjb250ZXh0IGlzIE5VTEwiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFueSBub24temVybyBwb3NpdGl2ZSB2YWx1ZSBpcyB0cmVhdGVkIGFzIDEgKi8KKwlpZiAoZGJzX3ZhbCAhPSAwKQorCQlkYnNfdmFsID0gMTsKKwlpZiAoZGJzX3BsdXNfYWdpbGVfc2Nhbl92YWwgIT0gMCkKKwkJZGJzX3BsdXNfYWdpbGVfc2Nhbl92YWwgPSAxOworCWlmIChzaW5nbGVfbWFjX3NjYW5fd2l0aF9kYnNfdmFsICE9IDApCisJCXNpbmdsZV9tYWNfc2Nhbl93aXRoX2Ric192YWwgPSAxOworCisJc3RhdHVzID0gd21hX2dldF91cGRhdGVkX3NjYW5fY29uZmlnKCZjZmcuc2Nhbl9jb25maWcsCisJCQlkYnNfdmFsLAorCQkJZGJzX3BsdXNfYWdpbGVfc2Nhbl92YWwsCisJCQlzaW5nbGVfbWFjX3NjYW5fd2l0aF9kYnNfdmFsKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQljZHNfZXJyKCJ3bWFfZ2V0X3VwZGF0ZWRfc2Nhbl9jb25maWcgZmFpbGVkICVkIiwgc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCXN0YXR1cyA9IHdtYV9nZXRfdXBkYXRlZF9md19tb2RlX2NvbmZpZygmY2ZnLmZ3X21vZGVfY29uZmlnLAorCQkJd21hX2dldF9kYnNfY29uZmlnKCksCisJCQl3bWFfZ2V0X2FnaWxlX2Rmc19jb25maWcoKSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJY2RzX2Vycigid21hX2dldF91cGRhdGVkX2Z3X21vZGVfY29uZmlnIGZhaWxlZCAlZCIsIHN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwljZmcuc2V0X2R1YWxfbWFjX2NiID0gKHZvaWQgKiljZHNfc29jX3NldF9kdWFsX21hY19jZmdfY2I7CisKKwljZHNfaW5mbygic2Nhbl9jb25maWc6JXggZndfbW9kZV9jb25maWc6JXgiLAorCQkJY2ZnLnNjYW5fY29uZmlnLCBjZmcuZndfbW9kZV9jb25maWcpOworCisJc3RhdHVzID0gc21lX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnKGhkZF9jdHgtPmhIYWwsIGNmZyk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJY2RzX2Vycigic21lX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnIGZhaWxlZCAlZCIsIHN0YXR1cyk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogY2RzX3NldF9kdWFsX21hY19md19tb2RlX2NvbmZpZygpIC0gU2V0IHRoZSBkdWFsIG1hYyBGVyBtb2RlIGNvbmZpZworICogQGhkZF9jdHg6IEhERCBjb250ZXh0CisgKiBAZGJzOiBEQlMgYml0CisgKiBAZGZzOiBBZ2lsZSBERlMgYml0CisgKgorICogU2V0IHRoZSB2YWx1ZXMgb2YgZncgbW9kZSBjb25maWcuIEZvciBzY2FuIGNvbmZpZywgdGhlIGV4aXN0aW5nIHZhbHVlcworICogd2lsbCBiZSByZXRhaW4uCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgY2RzX3NldF9kdWFsX21hY19md19tb2RlX2NvbmZpZyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQl1aW50OF90IGRicywKKwkJdWludDhfdCBkZnMpCit7CisJc3RydWN0IHNpcl9kdWFsX21hY19jb25maWcgY2ZnOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKCFoZGRfY3R4KSB7CisJCWNkc19lcnIoIkhERCBjb250ZXh0IGlzIE5VTEwiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFueSBub24temVybyBwb3NpdGl2ZSB2YWx1ZSBpcyB0cmVhdGVkIGFzIDEgKi8KKwlpZiAoZGJzICE9IDApCisJCWRicyA9IDE7CisJaWYgKGRmcyAhPSAwKQorCQlkZnMgPSAxOworCisJc3RhdHVzID0gd21hX2dldF91cGRhdGVkX3NjYW5fY29uZmlnKCZjZmcuc2Nhbl9jb25maWcsCisJCQl3bWFfZ2V0X2Ric19zY2FuX2NvbmZpZygpLAorCQkJd21hX2dldF9kYnNfcGx1c19hZ2lsZV9zY2FuX2NvbmZpZygpLAorCQkJd21hX2dldF9zaW5nbGVfbWFjX3NjYW5fd2l0aF9kZnNfY29uZmlnKCkpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWNkc19lcnIoIndtYV9nZXRfdXBkYXRlZF9zY2FuX2NvbmZpZyBmYWlsZWQgJWQiLCBzdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzID0gd21hX2dldF91cGRhdGVkX2Z3X21vZGVfY29uZmlnKCZjZmcuZndfbW9kZV9jb25maWcsCisJCQlkYnMsIGRmcyk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJY2RzX2Vycigid21hX2dldF91cGRhdGVkX2Z3X21vZGVfY29uZmlnIGZhaWxlZCAlZCIsIHN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwljZmcuc2V0X2R1YWxfbWFjX2NiID0gKHZvaWQgKiljZHNfc29jX3NldF9kdWFsX21hY19jZmdfY2I7CisKKwljZHNfaW5mbygic2Nhbl9jb25maWc6JXggZndfbW9kZV9jb25maWc6JXgiLAorCQkJY2ZnLnNjYW5fY29uZmlnLCBjZmcuZndfbW9kZV9jb25maWcpOworCisJc3RhdHVzID0gc21lX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnKGhkZF9jdHgtPmhIYWwsIGNmZyk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJY2RzX2Vycigic21lX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnIGZhaWxlZCAlZCIsIHN0YXR1cyk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogY2RzX3NvY19zZXRfaHdfbW9kZV9jYigpIC0gQ2FsbGJhY2sgZm9yIHNldCBodyBtb2RlCisgKiBAc3RhdHVzOiBTdGF0dXMKKyAqIEBjZmdkX2h3X21vZGVfaW5kZXg6IENvbmZpZ3VyZWQgSFcgbW9kZSBpbmRleAorICogQG51bV92ZGV2X21hY19lbnRyaWVzOiBOdW1iZXIgb2YgdmRldi1tYWMgaWQgbWFwcGluZyB0aGF0IGZvbGxvd3MKKyAqIEB2ZGV2X21hY19tYXA6IHZkZXYtbWFjIGlkIG1hcC4gVGhpcyBtZW1vcnkgd2lsbCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICogU28sIG1ha2UgbG9jYWwgY29weSBpZiBuZWVkZWQuCisgKgorICogUHJvdmlkZXMgdGhlIHN0YXR1cyBhbmQgY29uZmlndXJlZCBodyBtb2RlIGluZGV4IHNldAorICogYnkgdGhlIEZXCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGNkc19zb2Nfc2V0X2h3X21vZGVfY2IodWludDMyX3Qgc3RhdHVzLAorCQkJCSB1aW50MzJfdCBjZmdkX2h3X21vZGVfaW5kZXgsCisJCQkJIHVpbnQzMl90IG51bV92ZGV2X21hY19lbnRyaWVzLAorCQkJCSBzdHJ1Y3Qgc2lyX3ZkZXZfbWFjX21hcCAqdmRldl9tYWNfbWFwKQoreworCUNERl9TVEFUVVMgcmV0OworCXN0cnVjdCBzaXJfaHdfbW9kZV9wYXJhbXMgaHdfbW9kZTsKKwl1aW50MzJfdCBpOworCXBfY2RzX2NvbnRleHRUeXBlIGNkc19jb250ZXh0OworCisJY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFjZHNfY29udGV4dCkgeworCQljZHNfZXJyKCJJbnZhbGlkIENEUyBjb250ZXh0Iik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFNFVF9IV19NT0RFX1NUQVRVU19PSykgeworCQljZHNfZXJyKCJTZXQgSFcgbW9kZSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBzdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJaWYgKCF2ZGV2X21hY19tYXApIHsKKwkJY2RzX2VycigidmRldl9tYWNfbWFwIGlzIE5VTEwiKTsKKwkJcmV0dXJuOworCX0KKworCWNkc19pbmZvKCJjZmdkX2h3X21vZGVfaW5kZXg9JWQiLCBjZmdkX2h3X21vZGVfaW5kZXgpOworCisJZm9yIChpID0gMDsgaSA8IG51bV92ZGV2X21hY19lbnRyaWVzOyBpKyspCisJCWNkc19pbmZvKCJ2ZGV2X2lkOiVkIG1hY19pZDolZCIsCisJCQkJdmRldl9tYWNfbWFwW2ldLnZkZXZfaWQsCisJCQkJdmRldl9tYWNfbWFwW2ldLm1hY19pZCk7CisKKwlyZXQgPSB3bWFfZ2V0X2h3X21vZGVfZnJvbV9pZHgoY2ZnZF9od19tb2RlX2luZGV4LCAmaHdfbW9kZSk7CisJaWYgKHJldCAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJY2RzX2VycigiR2V0IEhXIG1vZGUgZmFpbGVkOiAlZCIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwljZHNfaW5mbygiTUFDMDogVHhTUzolZCwgUnhTUzolZCwgQnc6JWQiLAorCQlod19tb2RlLm1hYzBfdHhfc3MsIGh3X21vZGUubWFjMF9yeF9zcywgaHdfbW9kZS5tYWMwX2J3KTsKKwljZHNfaW5mbygiTUFDMTogVHhTUzolZCwgUnhTUzolZCwgQnc6JWQiLAorCQlod19tb2RlLm1hYzFfdHhfc3MsIGh3X21vZGUubWFjMV9yeF9zcywgaHdfbW9kZS5tYWMxX2J3KTsKKwljZHNfaW5mbygiREJTOiVkLCBBZ2lsZSBERlM6JWQiLAorCQlod19tb2RlLmRic19jYXAsIGh3X21vZGUuYWdpbGVfZGZzX2NhcCk7CisKKwkvKiB1cGRhdGUgY29uY19jb25uZWN0aW9uX2xpc3QgKi8KKwljZHNfdXBkYXRlX2h3X21vZGVfY29ubl9pbmZvKG51bV92ZGV2X21hY19lbnRyaWVzLAorCQkJdmRldl9tYWNfbWFwLAorCQkJaHdfbW9kZSk7CisKKwlyZXQgPSBjZGZfZXZlbnRfc2V0KCZjZHNfY29udGV4dC0+Y29ubmVjdGlvbl91cGRhdGVfZG9uZV9ldnQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHJldCkpCisJCWNkc19lcnIoIkVSUk9SOiBzZXQgY29ubmVjdGlvbl91cGRhdGVfZG9uZSBldmVudCBmYWlsZWQiKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBjZHNfaHdfbW9kZV90cmFuc2l0aW9uX2NiKCkgLSBDYWxsYmFjayBmb3IgSFcgbW9kZSB0cmFuc2l0aW9uIGZyb20gRlcKKyAqIEBvbGRfaHdfbW9kZV9pbmRleDogT2xkIEhXIG1vZGUgaW5kZXgKKyAqIEBuZXdfaHdfbW9kZV9pbmRleDogTmV3IEhXIG1vZGUgaW5kZXgKKyAqIEBudW1fdmRldl9tYWNfZW50cmllczogTnVtYmVyIG9mIHZkZXYtbWFjIGlkIG1hcHBpbmcgdGhhdCBmb2xsb3dzCisgKiBAdmRldl9tYWNfbWFwOiB2ZGV2LW1hYyBpZCBtYXAuIFRoaXMgbWVtb3J5IHdpbGwgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqIFNvLCBtYWtlIGxvY2FsIGNvcHkgaWYgbmVlZGVkLgorICoKKyAqIFByb3ZpZGVzIHRoZSBvbGQgYW5kIG5ldyBIVyBtb2RlIGluZGV4IHNldCBieSB0aGUgRlcKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY2RzX2h3X21vZGVfdHJhbnNpdGlvbl9jYih1aW50MzJfdCBvbGRfaHdfbW9kZV9pbmRleCwKKwkJCQkgdWludDMyX3QgbmV3X2h3X21vZGVfaW5kZXgsCisJCQkJIHVpbnQzMl90IG51bV92ZGV2X21hY19lbnRyaWVzLAorCQkJCSBzdHJ1Y3Qgc2lyX3ZkZXZfbWFjX21hcCAqdmRldl9tYWNfbWFwKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXN0cnVjdCBzaXJfaHdfbW9kZV9wYXJhbXMgaHdfbW9kZTsKKwl1aW50MzJfdCBpOworCisJaWYgKCF2ZGV2X21hY19tYXApIHsKKwkJY2RzX2VycigidmRldl9tYWNfbWFwIGlzIE5VTEwiKTsKKwkJcmV0dXJuOworCX0KKworCWNkc19pbmZvKCJvbGRfaHdfbW9kZV9pbmRleD0lZCwgbmV3X2h3X21vZGVfaW5kZXg9JWQiLAorCQlvbGRfaHdfbW9kZV9pbmRleCwgbmV3X2h3X21vZGVfaW5kZXgpOworCisJZm9yIChpID0gMDsgaSA8IG51bV92ZGV2X21hY19lbnRyaWVzOyBpKyspCisJCWNkc19pbmZvKCJ2ZGV2X2lkOiVkIG1hY19pZDolZCIsCisJCQl2ZGV2X21hY19tYXBbaV0udmRldl9pZCwKKwkJCXZkZXZfbWFjX21hcFtpXS5tYWNfaWQpOworCisJc3RhdHVzID0gd21hX2dldF9od19tb2RlX2Zyb21faWR4KG5ld19od19tb2RlX2luZGV4LCAmaHdfbW9kZSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJY2RzX2VycigiR2V0IEhXIG1vZGUgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwljZHNfaW5mbygiTUFDMDogVHhTUzolZCwgUnhTUzolZCwgQnc6JWQiLAorCQlod19tb2RlLm1hYzBfdHhfc3MsIGh3X21vZGUubWFjMF9yeF9zcywgaHdfbW9kZS5tYWMwX2J3KTsKKwljZHNfaW5mbygiTUFDMTogVHhTUzolZCwgUnhTUzolZCwgQnc6JWQiLAorCQlod19tb2RlLm1hYzFfdHhfc3MsIGh3X21vZGUubWFjMV9yeF9zcywgaHdfbW9kZS5tYWMxX2J3KTsKKwljZHNfaW5mbygiREJTOiVkLCBBZ2lsZSBERlM6JWQiLAorCQlod19tb2RlLmRic19jYXAsIGh3X21vZGUuYWdpbGVfZGZzX2NhcCk7CisKKwkvKiB1cGRhdGUgY29uY19jb25uZWN0aW9uX2xpc3QgKi8KKwljZHNfdXBkYXRlX2h3X21vZGVfY29ubl9pbmZvKG51bV92ZGV2X21hY19lbnRyaWVzLAorCQkJCQkgIHZkZXZfbWFjX21hcCwKKwkJCQkJICBod19tb2RlKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBjZHNfc29jX3NldF9od19tb2RlKCkgLSBTZXQgSFcgbW9kZSBjb21tYW5kIHRvIFNNRQorICogQGhkZF9jdHg6IEhERCBjb250ZXh0CisgKiBAbWFjMF9zczogTUFDMCBzcGF0aWFsIHN0cmVhbSBjb25maWd1cmF0aW9uCisgKiBAbWFjMF9idzogTUFDMCBiYW5kd2lkdGggY29uZmlndXJhdGlvbgorICogQG1hYzFfc3M6IE1BQzEgc3BhdGlhbCBzdHJlYW0gY29uZmlndXJhdGlvbgorICogQG1hYzFfYnc6IE1BQzEgYmFuZHdpZHRoIGNvbmZpZ3VyYXRpb24KKyAqIEBkYnM6IEhXIERCUyBjYXBhYmlsaXR5CisgKiBAZGZzOiBIVyBBZ2lsZSBERlMgY2FwYWJpbGl0eQorICoKKyAqIFNlbmRzIHRoZSBzZXQgaHcgbW9kZSB0byB0aGUgU01FIG1vZHVsZSB3aGljaCB3aWxsIHBhc3Mgb24KKyAqIHRoaXMgbWVzc2FnZSB0byBXTUEgbGF5ZXIKKyAqCisgKiBlLmcuOiBUbyBjb25maWd1cmUgMngyXzgwCisgKiAgICAgICBtYWMwX3NzID0gSFdfTU9ERV9TU18yeDIsIG1hYzBfYncgPSBIV19NT0RFXzgwX01IWgorICogICAgICAgbWFjMV9zcyA9IEhXX01PREVfU1NfMHgwLCBtYWMxX2J3ID0gSFdfTU9ERV9CV19OT05FCisgKiAgICAgICBkYnMgPSBIV19NT0RFX0RCU19OT05FLCBkZnMgPSBIV19NT0RFX0FHSUxFX0RGU19OT05FCisgKiBlLmcuOiBUbyBjb25maWd1cmUgMXgxXzgwXzF4MV80MCAoREJTKQorICogICAgICAgbWFjMF9zcyA9IEhXX01PREVfU1NfMXgxLCBtYWMwX2J3ID0gSFdfTU9ERV84MF9NSFoKKyAqICAgICAgIG1hYzFfc3MgPSBIV19NT0RFX1NTXzF4MSwgbWFjMV9idyA9IEhXX01PREVfNDBfTUhaCisgKiAgICAgICBkYnMgPSBIV19NT0RFX0RCUywgZGZzID0gSFdfTU9ERV9BR0lMRV9ERlNfTk9ORQorICogZS5nLjogVG8gY29uZmlndXJlIDF4MV84MF8xeDFfNDAgKEFnaWxlIERGUykKKyAqICAgICAgIG1hYzBfc3MgPSBIV19NT0RFX1NTXzF4MSwgbWFjMF9idyA9IEhXX01PREVfODBfTUhaCisgKiAgICAgICBtYWMxX3NzID0gSFdfTU9ERV9TU18xeDEsIG1hYzFfYncgPSBIV19NT0RFXzQwX01IWgorICogICAgICAgZGJzID0gSFdfTU9ERV9EQlMsIGRmcyA9IEhXX01PREVfQUdJTEVfREZTCisgKgorICogUmV0dXJuOiBTdWNjZXNzIGlmIHRoZSBtZXNzYWdlIG1hZGUgaXQgZG93biB0byB0aGUgbmV4dCBsYXllcgorICovCitDREZfU1RBVFVTIGNkc19zb2Nfc2V0X2h3X21vZGUoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJZW51bSBod19tb2RlX3NzX2NvbmZpZyBtYWMwX3NzLAorCQllbnVtIGh3X21vZGVfYmFuZHdpZHRoIG1hYzBfYncsCisJCWVudW0gaHdfbW9kZV9zc19jb25maWcgbWFjMV9zcywKKwkJZW51bSBod19tb2RlX2JhbmR3aWR0aCBtYWMxX2J3LAorCQllbnVtIGh3X21vZGVfZGJzX2NhcGFiIGRicywKKwkJZW51bSBod19tb2RlX2FnaWxlX2Rmc19jYXBhYiBkZnMpCit7CisJaW50OF90IGh3X21vZGVfaW5kZXg7CisJc3RydWN0IHNpcl9od19tb2RlIG1zZzsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCWlmICghaGRkX2N0eCkgeworCQljZHNfZXJyKCJJbnZhbGlkIEhERCBjb250ZXh0Iik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlod19tb2RlX2luZGV4ID0gd21hX2dldF9od19tb2RlX2lkeF9mcm9tX2Ric19od19saXN0KG1hYzBfc3MsCisJCQltYWMwX2J3LCBtYWMxX3NzLCBtYWMxX2J3LCBkYnMsIGRmcyk7CisJaWYgKGh3X21vZGVfaW5kZXggPCAwKSB7CisJCWNkc19lcnIoIkludmFsaWQgSFcgbW9kZSBpbmRleCBvYnRhaW5lZCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJbXNnLmh3X21vZGVfaW5kZXggPSBod19tb2RlX2luZGV4OworCW1zZy5zZXRfaHdfbW9kZV9jYiA9ICh2b2lkICopY2RzX3NvY19zZXRfaHdfbW9kZV9jYjsKKworCWNkc19pbmZvKCJzZXQgaHcgbW9kZSB0byBzbWU6IGh3X21vZGVfaW5kZXg6ICVkIiwKKwkJbXNnLmh3X21vZGVfaW5kZXgpOworCisJc3RhdHVzID0gc21lX3NvY19zZXRfaHdfbW9kZShoZGRfY3R4LT5oSGFsLCBtc2cpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWNkc19lcnIoIkZhaWxlZCB0byBzZXQgaHcgbW9kZSB0byBTTUUiKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkc19pc19jb25uZWN0aW9uX2luX3Byb2dyZXNzKCkgLSBjaGVjayBpZiBjb25uZWN0aW9uIGlzIGluIHByb2dyZXNzCisgKiBAaGRkX2N0eCAtIEhERCBjb250ZXh0CisgKgorICogR28gdGhyb3VnaCBlYWNoIGFkYXB0ZXIgYW5kIGNoZWNrIGlmIENvbm5lY3Rpb24gaXMgaW4gcHJvZ3Jlc3MKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgY29ubmVjdGlvbiBpcyBpbiBwcm9ncmVzcyBlbHNlIGZhbHNlCisgKi8KK2Jvb2wgY2RzX2lzX2Nvbm5lY3Rpb25faW5fcHJvZ3Jlc3MoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlcl9ub2RlID0gTlVMTCwgKm5leHQgPSBOVUxMOworCWhkZF9zdGF0aW9uX2N0eF90ICpoZGRfc3RhX2N0eCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSAwOworCXVpbnQ4X3Qgc3RhX2lkID0gMDsKKwl1aW50OF90ICpzdGFfbWFjID0gTlVMTDsKKworCWlmICh0cnVlID09IGhkZF9jdHgtPmJ0Q29leE1vZGVTZXQpIHsKKwkJY2RzX2luZm8oIkJUQ29leCBNb2RlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcyIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKGhkZF9jdHgsICZhZGFwdGVyX25vZGUpOworCXdoaWxlIChOVUxMICE9IGFkYXB0ZXJfbm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCWFkYXB0ZXIgPSBhZGFwdGVyX25vZGUtPnBBZGFwdGVyOworCQlpZiAoIWFkYXB0ZXIpCisJCQlnb3RvIGVuZDsKKworCQljZHNfaW5mbygiQWRhcHRlciB3aXRoIGRldmljZSBtb2RlICVzKCVkKSBleGlzdHMiLAorCQkJaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhhZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQlhZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisJCWlmICgoKFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gYWRhcHRlci0+ZGV2aWNlX21vZGUpCisJCQl8fCAoV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkKKwkJCXx8IChXTEFOX0hERF9QMlBfREVWSUNFID09IGFkYXB0ZXItPmRldmljZV9tb2RlKSkKKwkJCSYmIChlQ29ubmVjdGlvblN0YXRlX0Nvbm5lY3RpbmcgPT0KKwkJCQkoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKSktPgorCQkJCQljb25uX2luZm8uY29ublN0YXRlKSkgeworCQkJY2RzX2VycigiJXAoJWQpIENvbm5lY3Rpb24gaXMgaW4gcHJvZ3Jlc3MiLAorCQkJCVdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIoYWRhcHRlciksCisJCQkJYWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmICgoV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkgJiYKKwkJCQlzbWVfbmVpZ2hib3JfbWlkZGxlX29mX3JvYW1pbmcoCisJCQkJCVdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpLAorCQkJCQlhZGFwdGVyLT5zZXNzaW9uSWQpKSB7CisJCQljZHNfZXJyKCIlcCglZCkgUmVhc3NvY2lhdGlvbiBpbiBwcm9ncmVzcyIsCisJCQkJV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKSwKKwkJCQlhZGFwdGVyLT5zZXNzaW9uSWQpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IGFkYXB0ZXItPmRldmljZV9tb2RlKSB8fAorCQkJKFdMQU5fSEREX1AyUF9DTElFTlQgPT0gYWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJCQkoV0xBTl9IRERfUDJQX0RFVklDRSA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJCWhkZF9zdGFfY3R4ID0KKwkJCQlXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpOworCQkJaWYgKChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0KKwkJCQloZGRfc3RhX2N0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKwkJCQkmJiAoZmFsc2UgPT0KKwkJCQloZGRfc3RhX2N0eC0+Y29ubl9pbmZvLnVJc0F1dGhlbnRpY2F0ZWQpKSB7CisJCQkJc3RhX21hYyA9ICh1aW50OF90ICopCisJCQkJCSYoYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXNbMF0pOworCQkJCWNkc19lcnIoImNsaWVudCAiIE1BQ19BRERSRVNTX1NUUgorCQkJCQkiIGlzIGluIG1pZGRsZSBvZiBXUFMvRUFQT0wgZXhjaGFuZ2UuIiwKKwkJCQkJTUFDX0FERFJfQVJSQVkoc3RhX21hYykpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9IGVsc2UgaWYgKChXTEFOX0hERF9TT0ZUQVAgPT0gYWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJCQkJKFdMQU5fSEREX1AyUF9HTyA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJCWZvciAoc3RhX2lkID0gMDsgc3RhX2lkIDwgV0xBTl9NQVhfU1RBX0NPVU5UOworCQkJCXN0YV9pZCsrKSB7CisJCQkJaWYgKCEoKGFkYXB0ZXItPmFTdGFJbmZvW3N0YV9pZF0uaXNVc2VkKQorCQkJCSAgICAmJiAob2xfdHhyeF9wZWVyX3N0YXRlX2Nvbm4gPT0KKwkJCQkgICAgYWRhcHRlci0+YVN0YUluZm9bc3RhX2lkXS50bFNUQVN0YXRlKSkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJc3RhX21hYyA9ICh1aW50OF90ICopCisJCQkJCQkmKGFkYXB0ZXItPmFTdGFJbmZvW3N0YV9pZF0uCisJCQkJCQkJbWFjQWRkclNUQS5ieXRlc1swXSk7CisJCQkJY2RzX2VycigiY2xpZW50ICIgTUFDX0FERFJFU1NfU1RSCisJCQkJIiBvZiBTQVAvR08gaXMgaW4gbWlkZGxlIG9mIFdQUy9FQVBPTCBleGNoYW5nZSIsCisJCQkJTUFDX0FERFJfQVJSQVkoc3RhX21hYykpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJaWYgKGhkZF9jdHgtPmNvbm5lY3Rpb25faW5fcHJvZ3Jlc3MpIHsKKwkJCQljZHNfZXJyKCJBUC9HTzogY29ubmVjdGlvbiBpcyBpbiBwcm9ncmVzcyIpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CitlbmQ6CisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsIGFkYXB0ZXJfbm9kZSwgJm5leHQpOworCQlhZGFwdGVyX25vZGUgPSBuZXh0OworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogY2RzX2R1bXBfY3VycmVudF9jb25jdXJyZW5jeV9vbmVfY29ubmVjdGlvbigpIC0gVG8gZHVtcCB0aGUKKyAqIGN1cnJlbnQgY29uY3VycmVuY3kgaW5mbyB3aXRoIG9uZSBjb25uZWN0aW9uCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqIEBjY19tb2RlOiBjb25uZWN0aW9uIHN0cmluZworICogQGxlbmd0aDogTWF4aW11bSBzaXplIG9mIHRoZSBzdHJpbmcKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGR1bXAgdGhlIGNvbmN1cnJlbmN5IGluZm8KKyAqCisgKiBSZXR1cm46IGxlbmd0aCBvZiB0aGUgc3RyaW5nCisgKi8KK3N0YXRpYyB1aW50MzJfdCBjZHNfZHVtcF9jdXJyZW50X2NvbmN1cnJlbmN5X29uZV9jb25uZWN0aW9uKAorCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgY2hhciAqY2NfbW9kZSwgdWludDMyX3QgbGVuZ3RoKQoreworCXVpbnQzMl90IGNvdW50ID0gMDsKKworCXN3aXRjaCAoY29uY19jb25uZWN0aW9uX2xpc3RbMF0ubW9kZSkgeworCWNhc2UgQ0RTX1NUQV9NT0RFOgorCQljb3VudCA9IHN0cmxjYXQoY2NfbW9kZSwgIlNUQSIsCisJCQkJCWxlbmd0aCk7CisJCWJyZWFrOworCWNhc2UgQ0RTX1NBUF9NT0RFOgorCQljb3VudCA9IHN0cmxjYXQoY2NfbW9kZSwgIlNBUCIsCisJCQkJCWxlbmd0aCk7CisJCWJyZWFrOworCWNhc2UgQ0RTX1AyUF9DTElFTlRfTU9ERToKKwkJY291bnQgPSBzdHJsY2F0KGNjX21vZGUsICJQMlAgQ0xJIiwKKwkJCQkJbGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBDRFNfUDJQX0dPX01PREU6CisJCWNvdW50ID0gc3RybGNhdChjY19tb2RlLCAiUDJQIEdPIiwKKwkJCQkJbGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBDRFNfSUJTU19NT0RFOgorCQljb3VudCA9IHN0cmxjYXQoY2NfbW9kZSwgIklCU1MiLAorCQkJCQlsZW5ndGgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBlcnIgbXNnICovCisJCWNkc19lcnIoInVuZXhwZWN0ZWQgbW9kZSAlZCIsIGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1vZGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIGNkc19kdW1wX2N1cnJlbnRfY29uY3VycmVuY3lfdHdvX2Nvbm5lY3Rpb24oKSAtIFRvIGR1bXAgdGhlCisgKiBjdXJyZW50IGNvbmN1cnJlbmN5IGluZm8gd2l0aCB0d28gY29ubmVjdGlvbnMKKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQGNjX21vZGU6IGNvbm5lY3Rpb24gc3RyaW5nCisgKiBAbGVuZ3RoOiBNYXhpbXVtIHNpemUgb2YgdGhlIHN0cmluZworICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZHVtcCB0aGUgY29uY3VycmVuY3kgaW5mbworICoKKyAqIFJldHVybjogbGVuZ3RoIG9mIHRoZSBzdHJpbmcKKyAqLworc3RhdGljIHVpbnQzMl90IGNkc19kdW1wX2N1cnJlbnRfY29uY3VycmVuY3lfdHdvX2Nvbm5lY3Rpb24oCisJCQloZGRfY29udGV4dF90ICpoZGRfY3R4LCBjaGFyICpjY19tb2RlLCB1aW50MzJfdCBsZW5ndGgpCit7CisJdWludDMyX3QgY291bnQgPSAwOworCisJc3dpdGNoIChjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5tb2RlKSB7CisJY2FzZSBDRFNfU1RBX01PREU6CisJCWNvdW50ID0gY2RzX2R1bXBfY3VycmVudF9jb25jdXJyZW5jeV9vbmVfY29ubmVjdGlvbigKKwkJCQloZGRfY3R4LCBjY19tb2RlLCBsZW5ndGgpOworCQljb3VudCArPSBzdHJsY2F0KGNjX21vZGUsICIrU1RBIiwKKwkJCQkJbGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBDRFNfU0FQX01PREU6CisJCWNvdW50ID0gY2RzX2R1bXBfY3VycmVudF9jb25jdXJyZW5jeV9vbmVfY29ubmVjdGlvbigKKwkJCQloZGRfY3R4LCBjY19tb2RlLCBsZW5ndGgpOworCQljb3VudCArPSBzdHJsY2F0KGNjX21vZGUsICIrU0FQIiwKKwkJCQkJbGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBDRFNfUDJQX0NMSUVOVF9NT0RFOgorCQljb3VudCA9IGNkc19kdW1wX2N1cnJlbnRfY29uY3VycmVuY3lfb25lX2Nvbm5lY3Rpb24oCisJCQkJaGRkX2N0eCwgY2NfbW9kZSwgbGVuZ3RoKTsKKwkJY291bnQgKz0gc3RybGNhdChjY19tb2RlLCAiK1AyUCBDTEkiLAorCQkJCQlsZW5ndGgpOworCQlicmVhazsKKwljYXNlIENEU19QMlBfR09fTU9ERToKKwkJY291bnQgPSBjZHNfZHVtcF9jdXJyZW50X2NvbmN1cnJlbmN5X29uZV9jb25uZWN0aW9uKAorCQkJCWhkZF9jdHgsIGNjX21vZGUsIGxlbmd0aCk7CisJCWNvdW50ICs9IHN0cmxjYXQoY2NfbW9kZSwgIitQMlAgR08iLAorCQkJCQlsZW5ndGgpOworCQlicmVhazsKKwljYXNlIENEU19JQlNTX01PREU6CisJCWNvdW50ID0gY2RzX2R1bXBfY3VycmVudF9jb25jdXJyZW5jeV9vbmVfY29ubmVjdGlvbigKKwkJCQloZGRfY3R4LCBjY19tb2RlLCBsZW5ndGgpOworCQljb3VudCArPSBzdHJsY2F0KGNjX21vZGUsICIrSUJTUyIsCisJCQkJCWxlbmd0aCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGVyciBtc2cgKi8KKwkJY2RzX2VycigidW5leHBlY3RlZCBtb2RlICVkIiwgY29uY19jb25uZWN0aW9uX2xpc3RbMV0ubW9kZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogY2RzX2R1bXBfY3VycmVudF9jb25jdXJyZW5jeV90aHJlZV9jb25uZWN0aW9uKCkgLSBUbyBkdW1wIHRoZQorICogY3VycmVudCBjb25jdXJyZW5jeSBpbmZvIHdpdGggdGhyZWUgY29ubmVjdGlvbnMKKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQGNjX21vZGU6IGNvbm5lY3Rpb24gc3RyaW5nCisgKiBAbGVuZ3RoOiBNYXhpbXVtIHNpemUgb2YgdGhlIHN0cmluZworICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZHVtcCB0aGUgY29uY3VycmVuY3kgaW5mbworICoKKyAqIFJldHVybjogbGVuZ3RoIG9mIHRoZSBzdHJpbmcKKyAqLworc3RhdGljIHVpbnQzMl90IGNkc19kdW1wX2N1cnJlbnRfY29uY3VycmVuY3lfdGhyZWVfY29ubmVjdGlvbigKKwkJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGNoYXIgKmNjX21vZGUsIHVpbnQzMl90IGxlbmd0aCkKK3sKKwl1aW50MzJfdCBjb3VudCA9IDA7CisKKwlzd2l0Y2ggKGNvbmNfY29ubmVjdGlvbl9saXN0WzJdLm1vZGUpIHsKKwljYXNlIENEU19TVEFfTU9ERToKKwkJY291bnQgPSBjZHNfZHVtcF9jdXJyZW50X2NvbmN1cnJlbmN5X3R3b19jb25uZWN0aW9uKAorCQkJCWhkZF9jdHgsIGNjX21vZGUsIGxlbmd0aCk7CisJCWNvdW50ICs9IHN0cmxjYXQoY2NfbW9kZSwgIitTVEEiLAorCQkJCQlsZW5ndGgpOworCQlicmVhazsKKwljYXNlIENEU19TQVBfTU9ERToKKwkJY291bnQgPSBjZHNfZHVtcF9jdXJyZW50X2NvbmN1cnJlbmN5X3R3b19jb25uZWN0aW9uKAorCQkJCWhkZF9jdHgsIGNjX21vZGUsIGxlbmd0aCk7CisJCWNvdW50ICs9IHN0cmxjYXQoY2NfbW9kZSwgIitTQVAiLAorCQkJCQlsZW5ndGgpOworCQlicmVhazsKKwljYXNlIENEU19QMlBfQ0xJRU5UX01PREU6CisJCWNvdW50ID0gY2RzX2R1bXBfY3VycmVudF9jb25jdXJyZW5jeV90d29fY29ubmVjdGlvbigKKwkJCQloZGRfY3R4LCBjY19tb2RlLCBsZW5ndGgpOworCQljb3VudCArPSBzdHJsY2F0KGNjX21vZGUsICIrUDJQIENMSSIsCisJCQkJCWxlbmd0aCk7CisJCWJyZWFrOworCWNhc2UgQ0RTX1AyUF9HT19NT0RFOgorCQljb3VudCA9IGNkc19kdW1wX2N1cnJlbnRfY29uY3VycmVuY3lfdHdvX2Nvbm5lY3Rpb24oCisJCQkJaGRkX2N0eCwgY2NfbW9kZSwgbGVuZ3RoKTsKKwkJY291bnQgKz0gc3RybGNhdChjY19tb2RlLCAiK1AyUCBHTyIsCisJCQkJCWxlbmd0aCk7CisJCWJyZWFrOworCWNhc2UgQ0RTX0lCU1NfTU9ERToKKwkJY291bnQgPSBjZHNfZHVtcF9jdXJyZW50X2NvbmN1cnJlbmN5X3R3b19jb25uZWN0aW9uKAorCQkJCWhkZF9jdHgsIGNjX21vZGUsIGxlbmd0aCk7CisJCWNvdW50ICs9IHN0cmxjYXQoY2NfbW9kZSwgIitJQlNTIiwKKwkJCQkJbGVuZ3RoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZXJyIG1zZyAqLworCQljZHNfZXJyKCJ1bmV4cGVjdGVkIG1vZGUgJWQiLCBjb25jX2Nvbm5lY3Rpb25fbGlzdFsyXS5tb2RlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBjZHNfZHVtcF9kYnNfY29uY3VycmVuY3koKSAtIFRvIGR1bXAgdGhlIGRicyBjb25jdXJyZW5jeQorICogY29tYmluYXRpb24KKyAqIEBjY19tb2RlOiBjb25uZWN0aW9uIHN0cmluZworICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZHVtcCB0aGUgY29uY3VycmVuY3kgaW5mbworICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBjZHNfZHVtcF9kYnNfY29uY3VycmVuY3koY2hhciAqY2NfbW9kZSwgdWludDMyX3QgbGVuZ3RoKQoreworCXN0cmxjYXQoY2NfbW9kZSwgIiBEQlMiLCBsZW5ndGgpOworCWlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tYWMgPT0KKwkJY29uY19jb25uZWN0aW9uX2xpc3RbMV0ubWFjKSB7CisJCWlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuID09CisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuKSB7CisJCQlpZiAoMCA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tYWMpCisJCQkJc3RybGNhdChjY19tb2RlLCAiIHdpdGggU0NDIG9uIG1hYzAiLAorCQkJCQlsZW5ndGgpOworCQkJZWxzZQorCQkJCXN0cmxjYXQoY2NfbW9kZSwgIiB3aXRoIFNDQyBvbiBtYWMxIiwKKwkJCQkJbGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgwID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1hYykKKwkJCQlzdHJsY2F0KGNjX21vZGUsICIgd2l0aCBNQ0Mgb24gbWFjMCIsCisJCQkJCWxlbmd0aCk7CisJCQllbHNlCisJCQkJc3RybGNhdChjY19tb2RlLCAiIHdpdGggTUNDIG9uIG1hYzEiLAorCQkJCQlsZW5ndGgpOworCQl9CisJfQorCWlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tYWMgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMl0ubWFjKSB7CisJCWlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuID09CisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFsyXS5jaGFuKSB7CisJCQlpZiAoMCA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tYWMpCisJCQkJc3RybGNhdChjY19tb2RlLCAiIHdpdGggU0NDIG9uIG1hYzAiLAorCQkJCQlsZW5ndGgpOworCQkJZWxzZQorCQkJCXN0cmxjYXQoY2NfbW9kZSwgIiB3aXRoIFNDQyBvbiBtYWMxIiwKKwkJCQkJbGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgwID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1hYykKKwkJCQlzdHJsY2F0KGNjX21vZGUsICIgd2l0aCBNQ0Mgb24gbWFjMCIsCisJCQkJCWxlbmd0aCk7CisJCQllbHNlCisJCQkJc3RybGNhdChjY19tb2RlLCAiIHdpdGggTUNDIG9uIG1hYzEiLAorCQkJCQlsZW5ndGgpOworCQl9CisJfQorCWlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5tYWMgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMl0ubWFjKSB7CisJCWlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuID09CisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFsyXS5jaGFuKSB7CisJCQlpZiAoMCA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5tYWMpCisJCQkJc3RybGNhdChjY19tb2RlLCAiIHdpdGggU0NDIG9uIG1hYzAiLAorCQkJCQlsZW5ndGgpOworCQkJZWxzZQorCQkJCXN0cmxjYXQoY2NfbW9kZSwgIiB3aXRoIFNDQyBvbiBtYWMxIiwKKwkJCQkJbGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgwID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzFdLm1hYykKKwkJCQlzdHJsY2F0KGNjX21vZGUsICIgd2l0aCBNQ0Mgb24gbWFjMCIsCisJCQkJCWxlbmd0aCk7CisJCQllbHNlCisJCQkJc3RybGNhdChjY19tb2RlLCAiIHdpdGggTUNDIG9uIG1hYzEiLAorCQkJCQlsZW5ndGgpOworCQl9CisJfQorfQorCisvKioKKyAqIGNkc19kdW1wX2N1cnJlbnRfY29uY3VycmVuY3koKSAtIFRvIGR1bXAgdGhlIGN1cnJlbnQKKyAqIGNvbmN1cnJlbmN5IGNvbWJpbmF0aW9uCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGR1bXAgdGhlIGNvbmN1cnJlbmN5IGluZm8KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY2RzX2R1bXBfY3VycmVudF9jb25jdXJyZW5jeShoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXVpbnQzMl90IG51bV9jb25uZWN0aW9ucyA9IDA7CisJY2hhciBjY19tb2RlW0NEU19NQVhfQ09OX1NUUklOR19MRU5dID0gezB9OworCXVpbnQzMl90IGNvdW50ID0gMDsKKworCW51bV9jb25uZWN0aW9ucyA9IGNkc19nZXRfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4KTsKKworCXN3aXRjaCAobnVtX2Nvbm5lY3Rpb25zKSB7CisJY2FzZSAxOgorCQljZHNfZHVtcF9jdXJyZW50X2NvbmN1cnJlbmN5X29uZV9jb25uZWN0aW9uKGhkZF9jdHgsIGNjX21vZGUsCisJCQkJCXNpemVvZihjY19tb2RlKSk7CisJCWNkc19lcnIoIiVzIFN0YW5kYWxvbmUiLCBjY19tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljb3VudCA9IGNkc19kdW1wX2N1cnJlbnRfY29uY3VycmVuY3lfdHdvX2Nvbm5lY3Rpb24oCisJCQloZGRfY3R4LCBjY19tb2RlLCBzaXplb2YoY2NfbW9kZSkpOworCQlpZiAoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbiA9PQorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMV0uY2hhbikgeworCQkJc3RybGNhdChjY19tb2RlLCAiIFNDQyIsIHNpemVvZihjY19tb2RlKSk7CisJCX0gZWxzZSBpZiAoY29uY19jb25uZWN0aW9uX2xpc3RbMF0ubWFjID09CisJCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzFdLm1hYykgeworCQkJc3RybGNhdChjY19tb2RlLCAiIE1DQyIsIHNpemVvZihjY19tb2RlKSk7CisJCX0gZWxzZQorCQkJc3RybGNhdChjY19tb2RlLCAiIERCUyIsIHNpemVvZihjY19tb2RlKSk7CisJCWNkc19lcnIoIiVzIiwgY2NfbW9kZSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJY291bnQgPSBjZHNfZHVtcF9jdXJyZW50X2NvbmN1cnJlbmN5X3RocmVlX2Nvbm5lY3Rpb24oCisJCQloZGRfY3R4LCBjY19tb2RlLCBzaXplb2YoY2NfbW9kZSkpOworCQlpZiAoKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4gPT0KKwkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzFdLmNoYW4pICYmCisJCQkoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbiA9PQorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzJdLmNoYW4pKXsKKwkJCQlzdHJsY2F0KGNjX21vZGUsICIgU0NDIiwKKwkJCQkJCXNpemVvZihjY19tb2RlKSk7CisJCX0gZWxzZSBpZiAoKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1hYyA9PQorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzFdLm1hYykKKwkJCQkmJiAoY29uY19jb25uZWN0aW9uX2xpc3RbMF0ubWFjID09CisJCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzJdLm1hYykpIHsKKwkJCQkJc3RybGNhdChjY19tb2RlLCAiIE1DQyBvbiBzaW5nbGUgTUFDIiwKKwkJCQkJCXNpemVvZihjY19tb2RlKSk7CisJCX0gZWxzZSB7CisJCQljZHNfZHVtcF9kYnNfY29uY3VycmVuY3koY2NfbW9kZSwgc2l6ZW9mKGNjX21vZGUpKTsKKwkJfQorCQljZHNfZXJyKCIlcyIsIGNjX21vZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBlcnIgbXNnICovCisJCWNkc19lcnIoInVuZXhwZWN0ZWQgbnVtX2Nvbm5lY3Rpb25zIHZhbHVlICVkIiwKKwkJCW51bV9jb25uZWN0aW9ucyk7CisJCWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworLyoqCisgKiBjZHNfY3VycmVudF9jb25jdXJyZW5jeV9pc19zY2MoKSAtIFRvIGNoZWNrIHRoZSBjdXJyZW50CisgKiBjb25jdXJyZW5jeSBjb21iaW5hdGlvbiBpZiBpdCBpcyBkb2luZyBTQ0MKKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gY2hlY2sgaWYgaXQgaXMgZG9pbmcgU0NDCisgKgorICogUmV0dXJuOiBUcnVlIC0gU0NDLCBGYWxzZSAtIE90aGVyd2lzZQorICovCitzdGF0aWMgYm9vbCBjZHNfY3VycmVudF9jb25jdXJyZW5jeV9pc19zY2MoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwl1aW50MzJfdCBudW1fY29ubmVjdGlvbnMgPSAwOworCWJvb2wgaXNfc2NjID0gZmFsc2U7CisKKwludW1fY29ubmVjdGlvbnMgPSBjZHNfZ2V0X2Nvbm5lY3Rpb25fY291bnQoaGRkX2N0eCk7CisKKwlzd2l0Y2ggKG51bV9jb25uZWN0aW9ucykgeworCWNhc2UgMToKKwkJaXNfc2NjID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbiA9PQorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMV0uY2hhbikgeworCQkJaXNfc2NjID0gdHJ1ZTsKKwkJfQorCQlicmVhazsKKwljYXNlIDM6CisJCWlmICgoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbiA9PQorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMV0uY2hhbikgJiYKKwkJCShjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuID09CisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMl0uY2hhbikpeworCQkJCWlzX3NjYyA9IHRydWU7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZXJyIG1zZyAqLworCQljZHNfZXJyKCJ1bmV4cGVjdGVkIG51bV9jb25uZWN0aW9ucyB2YWx1ZSAlZCIsCisJCQludW1fY29ubmVjdGlvbnMpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaXNfc2NjOworfQorCisvKioKKyAqIGNkc19kdW1wX2xlZ2FjeV9jb25jdXJyZW5jeSgpIC0gVG8gZHVtcCB0aGUgY3VycmVudAorICogY29uY3VycmVuY3kgY29tYmluYXRpb24KKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQHN0YV9jaGFubmVsOiBDaGFubmVsIFNUQSBjb25uZWN0aW9uIGhhcyBjb21lIHVwCisgKiBAYXBfY2hhbm5lbDogQ2hhbm5lbCBTQVAgY29ubmVjdGlvbiBoYXMgY29tZSB1cAorICogQHAycF9jaGFubmVsOiBDaGFubmVsIFAyUCBjb25uZWN0aW9uIGhhcyBjb21lIHVwCisgKiBAc3RhX2Jzc2lkOiBCU1NJRCB0byB3aGljaCBTVEEgaXMgY29ubmVjdGVkIHRvCisgKiBAcDJwX2Jzc2lkOiBCU1NJRCB0byB3aGljaCBQMlAgaXMgY29ubmVjdGVkIHRvCisgKiBAYXBfYnNzaWQ6IEJTU0lEIG9mIHRoZSBBUAorICogQHAycF9tb2RlOiBQMlAgQ2xpZW50IG9yIEdPCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkdW1wIHRoZSBjb25jdXJyZW5jeSBpbmZvCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGNkc19kdW1wX2xlZ2FjeV9jb25jdXJyZW5jeShoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQl1aW50OF90IHN0YV9jaGFubmVsLCB1aW50OF90IGFwX2NoYW5uZWwsIHVpbnQ4X3QgcDJwX2NoYW5uZWwsCisJCXN0cnVjdCBjZGZfbWFjX2FkZHIgc3RhX2Jzc2lkLCBzdHJ1Y3QgY2RmX21hY19hZGRyIHAycF9ic3NpZCwKKwkJc3RydWN0IGNkZl9tYWNfYWRkciBhcF9ic3NpZCwgY29uc3QgY2hhciAqcDJwX21vZGUpCit7CisJY29uc3QgY2hhciAqY2NfbW9kZSA9ICJTdGFuZGFsb25lIjsKKworCWlmIChzdGFfY2hhbm5lbCA+IDApIHsKKwkJaWYgKGFwX2NoYW5uZWwgPiAwKSB7CisJCQlpZiAocDJwX2NoYW5uZWwgPiAwKSB7CisJCQkJLyogU1RBICsgQVAgKyBQMlAgKi8KKwkJCQlpZiAocDJwX2NoYW5uZWwgPT0gc3RhX2NoYW5uZWwKKwkJCQkJJiYgYXBfY2hhbm5lbCA9PSBzdGFfY2hhbm5lbCkgeworCQkJCQljY19tb2RlID0gIlNUQStBUCtQMlAgU0NDIjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocDJwX2NoYW5uZWwgPT0gc3RhX2NoYW5uZWwpCisJCQkJCQljY19tb2RlID0KKwkJCQkJCQkiU1RBK1AyUCBTQ0MsIFNBUCBNQ0MiOworCQkJCQllbHNlIGlmIChhcF9jaGFubmVsID09IHN0YV9jaGFubmVsKQorCQkJCQkJY2NfbW9kZSA9CisJCQkJCQkJIlNUQStTQVAgU0NDLCBQMlAgTUNDIjsKKwkJCQkJZWxzZSBpZiAoYXBfY2hhbm5lbCA9PSBwMnBfY2hhbm5lbCkKKwkJCQkJCWNjX21vZGUgPQorCQkJCQkJCSJQMlArU0FQIFNDQywgU1RBIE1DQyI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBTVEEgKyBBUCAqLworCQkJCWNjX21vZGUgPSAoYXBfY2hhbm5lbCA9PSBzdGFfY2hhbm5lbCkgPworCQkJCQkJIlNDQyIgOiAiTUNDIjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwMnBfY2hhbm5lbCA+IDApIHsKKwkJCQkvKiBTVEEgKyBQMlAgKi8KKwkJCQljY19tb2RlID0gKHAycF9jaGFubmVsID09IHN0YV9jaGFubmVsKSA/CisJCQkJCQkiU0NDIiA6ICJNQ0MiOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKGFwX2NoYW5uZWwgPiAwKSB7CisJCQlpZiAocDJwX2NoYW5uZWwgPiAwKSB7CisJCQkJLyogQVAgKyBQMlAgKi8KKwkJCQljY19tb2RlID0gKHAycF9jaGFubmVsID09IGFwX2NoYW5uZWwpID8KKwkJCQkJCSJTQ0MiIDogIk1DQyI7CisJCQl9CisJCX0KKwl9CisJaWYgKHN0YV9jaGFubmVsID4gMCkKKwkJY2RzX2Vycigid2xhbiglZCkgIiBNQUNfQUREUkVTU19TVFIgIiAlcyIsCisJCQlzdGFfY2hhbm5lbCwgTUFDX0FERFJfQVJSQVkoc3RhX2Jzc2lkLmJ5dGVzKSwgY2NfbW9kZSk7CisKKwlpZiAocDJwX2NoYW5uZWwgPiAwKQorCQljZHNfZXJyKCJwMnAtJXMoJWQpICIgTUFDX0FERFJFU1NfU1RSICIgJXMiLAorCQkJcDJwX21vZGUsIHAycF9jaGFubmVsLCBNQUNfQUREUl9BUlJBWShwMnBfYnNzaWQuYnl0ZXMpLAorCQkJY2NfbW9kZSk7CisKKwlpZiAoYXBfY2hhbm5lbCA+IDApCisJCWNkc19lcnIoIkFQKCVkKSAiIE1BQ19BRERSRVNTX1NUUiAiICVzIiwKKwkJCWFwX2NoYW5uZWwsIE1BQ19BRERSX0FSUkFZKGFwX2Jzc2lkLmJ5dGVzKSwgY2NfbW9kZSk7CisKKwloZGRfY3R4LT5tY2NfbW9kZSA9IHN0cmNtcChjY19tb2RlLCAiU0NDIik7Cit9CisKKy8qKgorICogY2RzX2R1bXBfY29uY3VycmVuY3lfaW5mbygpIC0gVG8gZHVtcCBjb25jdXJyZW5jeSBpbmZvCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGR1bXAgdGhlIGNvbmN1cnJlbmN5IGluZm8KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfZHVtcF9jb25jdXJyZW5jeV9pbmZvKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4OworCWhkZF9hcF9jdHhfdCAqaGRkX2FwX2N0eDsKKwloZGRfaG9zdGFwZF9zdGF0ZV90ICpob3N0YXBkX3N0YXRlOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgc3RhQnNzaWQgPSBDREZfTUFDX0FERFJfWkVST19JTklUSUFMSVpFUjsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIHAycEJzc2lkID0gQ0RGX01BQ19BRERSX1pFUk9fSU5JVElBTElaRVI7CisJc3RydWN0IGNkZl9tYWNfYWRkciBhcEJzc2lkID0gQ0RGX01BQ19BRERSX1pFUk9fSU5JVElBTElaRVI7CisJdWludDhfdCBzdGFDaGFubmVsID0gMCwgcDJwQ2hhbm5lbCA9IDAsIGFwQ2hhbm5lbCA9IDA7CisJY29uc3QgY2hhciAqcDJwTW9kZSA9ICJERVYiOworCisjaWZkZWYgUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wKKwl1aW50OF90IHRhcmdldENoYW5uZWwgPSAwOworCXVpbnQ4X3QgcHJlQWRhcHRlckNoYW5uZWwgPSAwOworCXVpbnQ4X3QgY2hhbm5lbDI0OworCXVpbnQ4X3QgY2hhbm5lbDU7CisJaGRkX2FkYXB0ZXJfdCAqcHJlQWRhcHRlckNvbnRleHQgPSBOVUxMOworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIyXzQgPSBOVUxMOworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI1ID0gTlVMTDsKKyNlbmRpZiAvKiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCAqLworCisJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKGhkZF9jdHgsICZhZGFwdGVyTm9kZSk7CisJd2hpbGUgKE5VTEwgIT0gYWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlhZGFwdGVyID0gYWRhcHRlck5vZGUtPnBBZGFwdGVyOworCQlzd2l0Y2ggKGFkYXB0ZXItPmRldmljZV9tb2RlKSB7CisJCWNhc2UgV0xBTl9IRERfSU5GUkFfU1RBVElPTjoKKwkJCXBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpOworCQkJaWYgKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCA9PQorCQkJICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJCQlzdGFDaGFubmVsID0KKwkJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWw7CisJCQkJY2RmX2NvcHlfbWFjYWRkcigmc3RhQnNzaWQsCisJCQkJCQkgJnBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZCk7CisjaWZkZWYgUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wKKwkJCQl0YXJnZXRDaGFubmVsID0gc3RhQ2hhbm5lbDsKKyNlbmRpZiAvKiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCAqLworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9IRERfUDJQX0NMSUVOVDoKKwkJCXBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpOworCQkJaWYgKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCA9PQorCQkJICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJCQlwMnBDaGFubmVsID0KKwkJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWw7CisJCQkJY2RmX2NvcHlfbWFjYWRkcigmcDJwQnNzaWQsCisJCQkJCQkmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkKTsKKwkJCQlwMnBNb2RlID0gIkNMSSI7CisjaWZkZWYgUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wKKwkJCQl0YXJnZXRDaGFubmVsID0gcDJwQ2hhbm5lbDsKKyNlbmRpZiAvKiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCAqLworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9IRERfUDJQX0dPOgorCQkJaGRkX2FwX2N0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKGFkYXB0ZXIpOworCQkJaG9zdGFwZF9zdGF0ZSA9IFdMQU5fSEREX0dFVF9IT1NUQVBfU1RBVEVfUFRSKGFkYXB0ZXIpOworCQkJaWYgKGhvc3RhcGRfc3RhdGUtPmJzc1N0YXRlID09IEJTU19TVEFSVAorCQkJICAgICYmIGhvc3RhcGRfc3RhdGUtPmNkZl9zdGF0dXMgPT0KKwkJCSAgICBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlwMnBDaGFubmVsID0gaGRkX2FwX2N0eC0+b3BlcmF0aW5nQ2hhbm5lbDsKKwkJCQljZGZfY29weV9tYWNhZGRyKCZwMnBCc3NpZCwKKwkJCQkJCSAmYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQpOworI2lmZGVmIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MCisJCQkJdGFyZ2V0Q2hhbm5lbCA9IHAycENoYW5uZWw7CisjZW5kaWYgLyogUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wgKi8KKwkJCX0KKwkJCXAycE1vZGUgPSAiR08iOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9IRERfU09GVEFQOgorCQkJaGRkX2FwX2N0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKGFkYXB0ZXIpOworCQkJaG9zdGFwZF9zdGF0ZSA9IFdMQU5fSEREX0dFVF9IT1NUQVBfU1RBVEVfUFRSKGFkYXB0ZXIpOworCQkJaWYgKGhvc3RhcGRfc3RhdGUtPmJzc1N0YXRlID09IEJTU19TVEFSVAorCQkJICAgICYmIGhvc3RhcGRfc3RhdGUtPmNkZl9zdGF0dXMgPT0KKwkJCSAgICBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlhcENoYW5uZWwgPSBoZGRfYXBfY3R4LT5vcGVyYXRpbmdDaGFubmVsOworCQkJCWNkZl9jb3B5X21hY2FkZHIoJmFwQnNzaWQsCisJCQkJCQkmYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQpOworI2lmZGVmIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MCisJCQkJdGFyZ2V0Q2hhbm5lbCA9IGFwQ2hhbm5lbDsKKyNlbmRpZiAvKiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCAqLworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9IRERfSUJTUzoKKwkJCXJldHVybjsgLyogc2tpcCBwcmludGluZyBzdGF0aW9uIG1lc3NhZ2UgYmVsb3cgKi8KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wKKwkJaWYgKHRhcmdldENoYW5uZWwpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGZpcnN0IGFkYXB0ZXIgZGV0ZWN0ZWQgYXMgYWN0aXZlCisJCQkgKiBzZXQgYXMgZGVmYXVsdCBmb3Igbm9uZSBjb25jdXJyZW5jeSBjYXNlCisJCQkgKi8KKwkJCWlmICghcHJlQWRhcHRlckNoYW5uZWwpIHsKKwkJCQkvKiBJZiBJUEEgVUMgZGF0YSBwYXRoIGlzIGVuYWJsZWQsCisJCQkJICogdGFyZ2V0IHNob3VsZCByZXNlcnZlIGV4dHJhIHR4IGRlc2NyaXB0b3JzCisJCQkJICogZm9yIElQQSBkYXRhIHBhdGguCisJCQkJICogVGhlbiBob3N0IGRhdGEgcGF0aCBzaG91bGQgYWxsb3cgbGVzcyBUWAorCQkJCSAqIHBhY2tldCBwdW1waW5nIGluIGNhc2UgSVBBCisJCQkJICogZGF0YSBwYXRoIGVuYWJsZWQKKwkJCQkgKi8KKwkJCQlpZiAoaGRkX2lwYV91Y19pc19lbmFibGVkKGhkZF9jdHgpICYmCisJCQkJICAgIChXTEFOX0hERF9TT0ZUQVAgPT0gYWRhcHRlci0+ZGV2aWNlX21vZGUpKSB7CisJCQkJCWFkYXB0ZXItPnR4X2Zsb3dfbG93X3dhdGVybWFyayA9CisJCQkJCWhkZF9jdHgtPmNvbmZpZy0+VHhGbG93TG93V2F0ZXJNYXJrICsKKwkJCQkJV0xBTl9URkNfSVBBVUNfVFhfREVTQ19SRVNFUlZFOworCQkJCX0gZWxzZSB7CisJCQkJCWFkYXB0ZXItPnR4X2Zsb3dfbG93X3dhdGVybWFyayA9CisJCQkJCQloZGRfY3R4LT5jb25maWctPgorCQkJCQkJCVR4Rmxvd0xvd1dhdGVyTWFyazsKKwkJCQl9CisJCQkJYWRhcHRlci0+dHhfZmxvd19oaWdoX3dhdGVybWFya19vZmZzZXQgPQorCQkJCSAgIGhkZF9jdHgtPmNvbmZpZy0+VHhGbG93SGlnaFdhdGVyTWFya09mZnNldDsKKwkJCQlvbF90eHJ4X2xsX3NldF90eF9wYXVzZV9xX2RlcHRoKAorCQkJCQlhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCWhkZF9jdHgtPmNvbmZpZy0+VHhGbG93TWF4UXVldWVEZXB0aCk7CisJCQkJLyogVGVtcG9yYXJ5IHNldCBsb2cgbGV2ZWwgYXMgZXJyb3IKKwkJCQkgKiBUWCBGbG93IGNvbnRyb2wgZmVhdHVyZSBzZXR0bGVkIGRvd24sCisJCQkJICogd2lsbCBsb3dlciBsb2cgbGV2ZWwKKwkJCQkgKi8KKwkJCQljZHNfZXJyKCJNT0RFICVkLENIICVkLExXTSAlZCxIV00gJWQsVFhRREVQICVkIiwKKwkJCQkgICAgYWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJICAgIHRhcmdldENoYW5uZWwsCisJCQkJICAgIGFkYXB0ZXItPnR4X2Zsb3dfbG93X3dhdGVybWFyaywKKwkJCQkgICAgYWRhcHRlci0+dHhfZmxvd19sb3dfd2F0ZXJtYXJrICsKKwkJCQkgICAgYWRhcHRlci0+dHhfZmxvd19oaWdoX3dhdGVybWFya19vZmZzZXQsCisJCQkJICAgIGhkZF9jdHgtPmNvbmZpZy0+VHhGbG93TWF4UXVldWVEZXB0aCk7CisJCQkJcHJlQWRhcHRlckNoYW5uZWwgPSB0YXJnZXRDaGFubmVsOworCQkJCXByZUFkYXB0ZXJDb250ZXh0ID0gYWRhcHRlcjsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTQ0MsIGRpc2FibGUgVFggZmxvdyBjb250cm9sIGZvciBib3RoCisJCQkJICogU0NDIGVhY2ggYWRhcHRlciBjYW5ub3QgcmVzZXJ2ZSBkZWRpY2F0ZWQKKwkJCQkgKiBjaGFubmVsIHJlc291cmNlLCBhcyBhIHJlc3VsdCwgaWYgYW55IGFkYXB0ZXIKKwkJCQkgKiBibG9ja2VkIE9TIFEgYnkgZmxvdyBjb250cm9sLAorCQkJCSAqIGJsb2NrZWQgYWRhcHRlciB3aWxsIGxvc3QgY2hhbmNlIHRvIHJlY292ZXIKKwkJCQkgKi8KKwkJCQlpZiAocHJlQWRhcHRlckNoYW5uZWwgPT0gdGFyZ2V0Q2hhbm5lbCkgeworCQkJCQkvKiBDdXJyZW50IGFkYXB0ZXIgKi8KKwkJCQkJYWRhcHRlci0+dHhfZmxvd19sb3dfd2F0ZXJtYXJrID0gMDsKKwkJCQkJYWRhcHRlci0+CisJCQkJCXR4X2Zsb3dfaGlnaF93YXRlcm1hcmtfb2Zmc2V0ID0gMDsKKwkJCQkJb2xfdHhyeF9sbF9zZXRfdHhfcGF1c2VfcV9kZXB0aCgKKwkJCQkJCWFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCWhkZF9jdHgtPmNvbmZpZy0+CisJCQkJCQlUeEhid0Zsb3dNYXhRdWV1ZURlcHRoKTsKKwkJCQkJY2RzX2VycigiU0NDOiBNT0RFICVzKCVkKSwgQ0ggJWQsIExXTSAlZCwgSFdNICVkLCBUWFFERVAgJWQiLAorCQkJCQkgICAgICAgaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZygKKwkJCQkJCQlhZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQkJCSAgICAgICBhZGFwdGVyLT5kZXZpY2VfbW9kZSwKKwkJCQkJICAgICAgIHRhcmdldENoYW5uZWwsCisJCQkJCSAgICAgICBhZGFwdGVyLT50eF9mbG93X2xvd193YXRlcm1hcmssCisJCQkJCSAgICAgICBhZGFwdGVyLT50eF9mbG93X2xvd193YXRlcm1hcmsgKworCQkJCQkgICAgICAgYWRhcHRlci0+CisJCQkJCSAgICAgICB0eF9mbG93X2hpZ2hfd2F0ZXJtYXJrX29mZnNldCwKKwkJCQkJICAgICAgIGhkZF9jdHgtPmNvbmZpZy0+CisJCQkJCSAgICAgICBUeEhid0Zsb3dNYXhRdWV1ZURlcHRoKTsKKworCQkJCQlpZiAoIXByZUFkYXB0ZXJDb250ZXh0KSB7CisJCQkJCQljZHNfZXJyKCJTQ0M6IFByZXZpb3VzIGFkYXB0ZXIgY29udGV4dCBOVUxMIik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCS8qIFByZXZpb3VzIGFkYXB0ZXIgKi8KKwkJCQkJcHJlQWRhcHRlckNvbnRleHQtPgorCQkJCQl0eF9mbG93X2xvd193YXRlcm1hcmsgPSAwOworCQkJCQlwcmVBZGFwdGVyQ29udGV4dC0+CisJCQkJCXR4X2Zsb3dfaGlnaF93YXRlcm1hcmtfb2Zmc2V0ID0gMDsKKwkJCQkJb2xfdHhyeF9sbF9zZXRfdHhfcGF1c2VfcV9kZXB0aCgKKwkJCQkJCXByZUFkYXB0ZXJDb250ZXh0LT5zZXNzaW9uSWQsCisJCQkJCQloZGRfY3R4LT5jb25maWctPgorCQkJCQkJVHhIYndGbG93TWF4UXVldWVEZXB0aCk7CisJCQkJCS8qCisJCQkJCSAqIFRlbXBvcmFyeSBzZXQgbG9nIGxldmVsIGFzIGVycm9yCisJCQkJCSAqIFRYIEZsb3cgY29udHJvbCBmZWF0dXJlIHNldHRsZWQgZG93biwKKwkJCQkJICogd2lsbCBsb3dlciBsb2cgbGV2ZWwKKwkJCQkJICovCisJCQkJCWNkc19lcnIoIlNDQzogTU9ERSAlcyglZCksIENIICVkLCBMV00gJWQsIEhXTSAlZCwgVFhRREVQICVkIiwKKwkJCQkJICAgICAgIGhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcoCisJCQkJCQlwcmVBZGFwdGVyQ29udGV4dC0+ZGV2aWNlX21vZGUKKwkJCQkJCQkgICksCisJCQkJCSAgICAgICBwcmVBZGFwdGVyQ29udGV4dC0+ZGV2aWNlX21vZGUsCisJCQkJCSAgICAgICB0YXJnZXRDaGFubmVsLAorCQkJCQkgICAgICAgcHJlQWRhcHRlckNvbnRleHQtPgorCQkJCQkgICAgICAgdHhfZmxvd19sb3dfd2F0ZXJtYXJrLAorCQkJCQkgICAgICAgcHJlQWRhcHRlckNvbnRleHQtPgorCQkJCQkgICAgICAgdHhfZmxvd19sb3dfd2F0ZXJtYXJrICsKKwkJCQkJICAgICAgIHByZUFkYXB0ZXJDb250ZXh0LT4KKwkJCQkJICAgICAgIHR4X2Zsb3dfaGlnaF93YXRlcm1hcmtfb2Zmc2V0LAorCQkJCQkgICAgICAgaGRkX2N0eC0+Y29uZmlnLT4KKwkJCQkJICAgICAgIFR4SGJ3Rmxvd01heFF1ZXVlRGVwdGgpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIE1DQywgZWFjaCBhZGFwdGVyIHdpbGwgaGF2ZSBkZWRpY2F0ZWQKKwkJCQkgKiByZXNvdXJjZQorCQkJCSAqLworCQkJCWVsc2UgeworCQkJCQkvKiBjdXJyZW50IGNoYW5uZWwgaXMgMi40ICovCisJCQkJCWlmICh0YXJnZXRDaGFubmVsIDw9CisJCQkJICAgICBXTEFOX0hERF9UWF9GTE9XX0NPTlRST0xfTUFYXzI0QkFORF9DSCkgeworCQkJCQkJY2hhbm5lbDI0ID0gdGFyZ2V0Q2hhbm5lbDsKKwkJCQkJCWNoYW5uZWw1ID0gcHJlQWRhcHRlckNoYW5uZWw7CisJCQkJCQlhZGFwdGVyMl80ID0gYWRhcHRlcjsKKwkJCQkJCWFkYXB0ZXI1ID0gcHJlQWRhcHRlckNvbnRleHQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBDdXJyZW50IGNoYW5uZWwgaXMgNSAqLworCQkJCQkJY2hhbm5lbDI0ID0gcHJlQWRhcHRlckNoYW5uZWw7CisJCQkJCQljaGFubmVsNSA9IHRhcmdldENoYW5uZWw7CisJCQkJCQlhZGFwdGVyMl80ID0gcHJlQWRhcHRlckNvbnRleHQ7CisJCQkJCQlhZGFwdGVyNSA9IGFkYXB0ZXI7CisJCQkJCX0KKworCQkJCQlpZiAoIWFkYXB0ZXI1KSB7CisJCQkJCQljZHNfZXJyKCJNQ0M6IDVHSHogYWRhcHRlciBjb250ZXh0IE5VTEwiKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWFkYXB0ZXI1LT50eF9mbG93X2xvd193YXRlcm1hcmsgPQorCQkJCQkJaGRkX2N0eC0+Y29uZmlnLT4KKwkJCQkJCVR4SGJ3Rmxvd0xvd1dhdGVyTWFyazsKKwkJCQkJYWRhcHRlcjUtPgorCQkJCQl0eF9mbG93X2hpZ2hfd2F0ZXJtYXJrX29mZnNldCA9CisJCQkJCQloZGRfY3R4LT5jb25maWctPgorCQkJCQkJVHhIYndGbG93SGlnaFdhdGVyTWFya09mZnNldDsKKwkJCQkJb2xfdHhyeF9sbF9zZXRfdHhfcGF1c2VfcV9kZXB0aCgKKwkJCQkJCWFkYXB0ZXI1LT5zZXNzaW9uSWQsCisJCQkJCQloZGRfY3R4LT5jb25maWctPgorCQkJCQkJVHhIYndGbG93TWF4UXVldWVEZXB0aCk7CisJCQkJCS8qCisJCQkJCSAqIFRlbXBvcmFyeSBzZXQgbG9nIGxldmVsIGFzIGVycm9yCisJCQkJCSAqIFRYIEZsb3cgY29udHJvbCBmZWF0dXJlIHNldHRsZWQgZG93biwKKwkJCQkJICogd2lsbCBsb3dlciBsb2cgbGV2ZWwKKwkJCQkJICovCisJCQkJCWNkc19lcnIoIk1DQzogTU9ERSAlcyglZCksIENIICVkLCBMV00gJWQsIEhXTSAlZCwgVFhRREVQICVkIiwKKwkJCQkJICAgIGhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcoCisJCQkJCQkgICAgYWRhcHRlcjUtPmRldmljZV9tb2RlKSwKKwkJCQkJICAgIGFkYXB0ZXI1LT5kZXZpY2VfbW9kZSwKKwkJCQkJICAgIGNoYW5uZWw1LAorCQkJCQkgICAgYWRhcHRlcjUtPnR4X2Zsb3dfbG93X3dhdGVybWFyaywKKwkJCQkJICAgIGFkYXB0ZXI1LT4KKwkJCQkJICAgIHR4X2Zsb3dfbG93X3dhdGVybWFyayArCisJCQkJCSAgICBhZGFwdGVyNS0+CisJCQkJCSAgICB0eF9mbG93X2hpZ2hfd2F0ZXJtYXJrX29mZnNldCwKKwkJCQkJICAgIGhkZF9jdHgtPmNvbmZpZy0+CisJCQkJCSAgICBUeEhid0Zsb3dNYXhRdWV1ZURlcHRoKTsKKworCQkJCQlpZiAoIWFkYXB0ZXIyXzQpIHsKKwkJCQkJCWNkc19lcnIoIk1DQzogMi40R0h6IGFkYXB0ZXIgY29udGV4dCBOVUxMIik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlhZGFwdGVyMl80LT50eF9mbG93X2xvd193YXRlcm1hcmsgPQorCQkJCQkJaGRkX2N0eC0+Y29uZmlnLT4KKwkJCQkJCVR4TGJ3Rmxvd0xvd1dhdGVyTWFyazsKKwkJCQkJYWRhcHRlcjJfNC0+CisJCQkJCXR4X2Zsb3dfaGlnaF93YXRlcm1hcmtfb2Zmc2V0ID0KKwkJCQkJCWhkZF9jdHgtPmNvbmZpZy0+CisJCQkJCQlUeExid0Zsb3dIaWdoV2F0ZXJNYXJrT2Zmc2V0OworCQkJCQlvbF90eHJ4X2xsX3NldF90eF9wYXVzZV9xX2RlcHRoKAorCQkJCQkJYWRhcHRlcjJfNC0+c2Vzc2lvbklkLAorCQkJCQkJaGRkX2N0eC0+Y29uZmlnLT4KKwkJCQkJCVR4TGJ3Rmxvd01heFF1ZXVlRGVwdGgpOworCQkJCQkvKgorCQkJCQkgKiBUZW1wb3Jhcnkgc2V0IGxvZyBsZXZlbCBhcyBlcnJvcgorCQkJCQkgKiBUWCBGbG93IGNvbnRyb2wgZmVhdHVyZSBzZXR0bGVkIGRvd24sCisJCQkJCSAqIHdpbGwgbG93ZXIgbG9nIGxldmVsCisJCQkJCSAqLworCQkJCQljZHNfZXJyKCJNQ0M6IE1PREUgJXMoJWQpLCBDSCAlZCwgTFdNICVkLCBIV00gJWQsIFRYUURFUCAlZCIsCisJCQkJCQloZGRfZGV2aWNlX21vZGVfdG9fc3RyaW5nKAorCQkJCQkJICAgIGFkYXB0ZXIyXzQtPmRldmljZV9tb2RlKSwKKwkJCQkJCWFkYXB0ZXIyXzQtPmRldmljZV9tb2RlLAorCQkJCQkJY2hhbm5lbDI0LAorCQkJCQkJYWRhcHRlcjJfNC0+CisJCQkJCQl0eF9mbG93X2xvd193YXRlcm1hcmssCisJCQkJCQlhZGFwdGVyMl80LT4KKwkJCQkJCXR4X2Zsb3dfbG93X3dhdGVybWFyayArCisJCQkJCQlhZGFwdGVyMl80LT4KKwkJCQkJCXR4X2Zsb3dfaGlnaF93YXRlcm1hcmtfb2Zmc2V0LAorCQkJCQkJaGRkX2N0eC0+Y29uZmlnLT4KKwkJCQkJCVR4TGJ3Rmxvd01heFF1ZXVlRGVwdGgpOworCisJCQkJfQorCQkJfQorCQl9CisJCXRhcmdldENoYW5uZWwgPSAwOworI2VuZGlmIC8qIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MICovCisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsIGFkYXB0ZXJOb2RlLCAmcE5leHQpOworCQlhZGFwdGVyTm9kZSA9IHBOZXh0OworCX0KKwlpZiAoaGRkX2N0eC0+Y29uZmlnLT5wb2xpY3lfbWFuYWdlcl9lbmFibGVkKSB7CisJCWNkc19kdW1wX2N1cnJlbnRfY29uY3VycmVuY3koaGRkX2N0eCk7CisJCWhkZF9jdHgtPm1jY19tb2RlID0gIWNkc19jdXJyZW50X2NvbmN1cnJlbmN5X2lzX3NjYyhoZGRfY3R4KTsKKwl9IGVsc2UgeworCQkvKiBoZGRfY3R4LT5tY2NfbW9kZSBnZXRzIHVwZGF0ZWQgaW5zaWRlIGJlbG93IGZ1bmN0aW9uLCB3aGljaAorCQkgKiAgZ2V0cyB1c2VkIGJ5IElQQQorCQkgKi8KKwkJY2RzX2R1bXBfbGVnYWN5X2NvbmN1cnJlbmN5KGhkZF9jdHgsCisJCQlzdGFDaGFubmVsLCBhcENoYW5uZWwsIHAycENoYW5uZWwsCisJCQlzdGFCc3NpZCwgcDJwQnNzaWQsIGFwQnNzaWQsIHAycE1vZGUpOworCX0KK30KKworLyoqCisgKiBjZHNfc2V0X2NvbmN1cnJlbmN5X21vZGUoKSAtIFRvIHNldCBjb25jdXJyZW5jeSBtb2RlCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqIEBtb2RlOiBDb25jdXJyZW5jeSBtb2RlCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBzZXQgdGhlIGNvbmN1cnJlbmN5IG1vZGUKKyAqCisgKiBSZXR1cm46IE5PTkUKKyAqLwordm9pZCBjZHNfc2V0X2NvbmN1cnJlbmN5X21vZGUoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgdENERl9DT05fTU9ERSBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0RGX1NUQV9NT0RFOgorCWNhc2UgQ0RGX1AyUF9DTElFTlRfTU9ERToKKwljYXNlIENERl9QMlBfR09fTU9ERToKKwljYXNlIENERl9TQVBfTU9ERToKKwkJaGRkX2N0eC0+Y29uY3VycmVuY3lfbW9kZSB8PSAoMSA8PCBtb2RlKTsKKwkJaGRkX2N0eC0+bm9fb2Zfb3Blbl9zZXNzaW9uc1ttb2RlXSsrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJY2RzX2luZm8oImNvbmN1cnJlbmN5X21vZGUgPSAweCV4IE51bWJlciBvZiBvcGVuIHNlc3Npb25zIGZvciBtb2RlICVkID0gJWQiLAorCQloZGRfY3R4LT5jb25jdXJyZW5jeV9tb2RlLCBtb2RlLAorCQloZGRfY3R4LT5ub19vZl9vcGVuX3Nlc3Npb25zW21vZGVdKTsKK30KKworLyoqCisgKiBjZHNfY2xlYXJfY29uY3VycmVuY3lfbW9kZSgpIC0gVG8gY2xlYXIgY29uY3VycmVuY3kgbW9kZQorICogQGhkZF9jdHg6IEhERCBjb250ZXh0CisgKiBAbW9kZTogQ29uY3VycmVuY3kgbW9kZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gY2xlYXIgdGhlIGNvbmN1cnJlbmN5IG1vZGUKKyAqCisgKiBSZXR1cm46IE5PTkUKKyAqLwordm9pZCBjZHNfY2xlYXJfY29uY3VycmVuY3lfbW9kZShoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgICAgdENERl9DT05fTU9ERSBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0RGX1NUQV9NT0RFOgorCWNhc2UgQ0RGX1AyUF9DTElFTlRfTU9ERToKKwljYXNlIENERl9QMlBfR09fTU9ERToKKwljYXNlIENERl9TQVBfTU9ERToKKwkJaGRkX2N0eC0+bm9fb2Zfb3Blbl9zZXNzaW9uc1ttb2RlXS0tOworCQlpZiAoIShoZGRfY3R4LT5ub19vZl9vcGVuX3Nlc3Npb25zW21vZGVdKSkKKwkJCWhkZF9jdHgtPmNvbmN1cnJlbmN5X21vZGUgJj0gKH4oMSA8PCBtb2RlKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwljZHNfaW5mbygiY29uY3VycmVuY3lfbW9kZSA9IDB4JXggTnVtYmVyIG9mIG9wZW4gc2Vzc2lvbnMgZm9yIG1vZGUgJWQgPSAlZCIsCisJCWhkZF9jdHgtPmNvbmN1cnJlbmN5X21vZGUsIG1vZGUsCisJCWhkZF9jdHgtPm5vX29mX29wZW5fc2Vzc2lvbnNbbW9kZV0pOworfQorCisvKioKKyAqIGNkc19zb2Nfc2V0X3BjbCgpIC0gU2V0cyBQQ0wgdG8gRlcKKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQG1vZGU6IENvbm5lY3Rpb24gbW9kZQorICoKKyAqIEZldGNoZXMgdGhlIFBDTCBhbmQgc2VuZHMgdGhlIFBDTCB0byBTTUUKKyAqIG1vZHVsZSB3aGljaCBpbiB0dXJuIHdpbGwgc2VuZCB0aGUgV01JCisgKiBjb21tYW5kIFdNSV9TT0NfU0VUX1BDTF9DTURJRCB0byB0aGUgZncKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY2RzX3NvY19zZXRfcGNsKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIHRDREZfQ09OX01PREUgbW9kZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwllbnVtIGNkc19jb25fbW9kZSBjb25fbW9kZTsKKwlzdHJ1Y3Qgc2lyX3BjbF9saXN0IHBjbDsKKwlwY2wucGNsX2xlbiA9IDA7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENERl9TVEFfTU9ERToKKwkJY29uX21vZGUgPSBDRFNfU1RBX01PREU7CisJCWJyZWFrOworCWNhc2UgQ0RGX1AyUF9DTElFTlRfTU9ERToKKwkJY29uX21vZGUgPSBDRFNfUDJQX0NMSUVOVF9NT0RFOworCQlicmVhazsKKwljYXNlIENERl9QMlBfR09fTU9ERToKKwkJY29uX21vZGUgPSBDRFNfUDJQX0dPX01PREU7CisJCWJyZWFrOworCWNhc2UgQ0RGX1NBUF9NT0RFOgorCQljb25fbW9kZSA9IENEU19TQVBfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBDREZfSUJTU19NT0RFOgorCQljb25fbW9kZSA9IENEU19JQlNTX01PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNkc19lcnIoIlVuYWJsZSB0byBzZXQgUENMIHRvIEZXOiAlZCIsIG1vZGUpOworCQlyZXR1cm47CisJfQorCisJY2RzX2RlYnVnKCJnZXQgcGNsIHRvIHNldCBpdCB0byB0aGUgRlciKTsKKworCXN0YXR1cyA9IGNkc19nZXRfcGNsKGhkZF9jdHgsIGNvbl9tb2RlLAorCQkJcGNsLnBjbF9saXN0LCAmcGNsLnBjbF9sZW4pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWNkc19lcnIoIlVuYWJsZSB0byBzZXQgUENMIHRvIEZXLCBHZXQgUENMIGZhaWxlZCIpOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzID0gc21lX3NvY19zZXRfcGNsKGhkZF9jdHgtPmhIYWwsIHBjbCk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCWNkc19lcnIoIlNlbmQgc29jIHNldCBQQ0wgdG8gU01FIGZhaWxlZCIpOworCWVsc2UKKwkJY2RzX2luZm8oIlNldCBQQ0wgdG8gRlcgZm9yIG1vZGU6JWQiLCBtb2RlKTsKK30KKworLyoqCisgKiBjZHNfaW5jcl9hY3RpdmVfc2Vzc2lvbigpIC0gaW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucworICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKiBAbW9kZToJRGV2aWNlIG1vZGUKKyAqIEBzZXNzaW9uX2lkOiBzZXNzaW9uIElEIGZvciB0aGUgY29ubmVjdGlvbiBzZXNzaW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zIG1haW50YWluZWQgcGVyIGRldmljZQorICogbW9kZS4gSW4gdGhlIGNhc2Ugb2YgU1RBL1AyUCBDTEkvSUJTUyB1cG9uIGNvbm5lY3Rpb24gaW5kaWNhdGlvbiBpdCBpcworICogaW5jcmVtZW50ZWQ7IEluIHRoZSBjYXNlIG9mIFNBUC9QMlAgR08gdXBvbiBic3Mgc3RhcnQgaXQgaXMgaW5jcmVtZW50ZWQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfaW5jcl9hY3RpdmVfc2Vzc2lvbihoZGRfY29udGV4dF90ICpoZGRfY3R4LCB0Q0RGX0NPTl9NT0RFIG1vZGUsCisJCQkJICB1aW50OF90IHNlc3Npb25faWQpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDREZfU1RBX01PREU6CisJY2FzZSBDREZfUDJQX0NMSUVOVF9NT0RFOgorCWNhc2UgQ0RGX1AyUF9HT19NT0RFOgorCWNhc2UgQ0RGX1NBUF9NT0RFOgorCQloZGRfY3R4LT5ub19vZl9hY3RpdmVfc2Vzc2lvbnNbbW9kZV0rKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWNkc19pbmZvKCJOby4jIG9mIGFjdGl2ZSBzZXNzaW9ucyBmb3IgbW9kZSAlZCA9ICVkIiwKKwkJbW9kZSwgaGRkX2N0eC0+bm9fb2ZfYWN0aXZlX3Nlc3Npb25zW21vZGVdKTsKKwkvKgorCSAqIEdldCBQQ0wgbG9naWMgbWFrZXMgdXNlIG9mIHRoZSBjb25uZWN0aW9uIGluZm8gc3RydWN0dXJlLgorCSAqIExldCB1cyBzZXQgdGhlIFBDTCB0byB0aGUgRlcgYmVmb3JlIHVwZGF0aW5nIHRoZSBjb25uZWN0aW9uCisJICogaW5mbyBzdHJ1Y3R1cmUgYWJvdXQgdGhlIG5ldyBjb25uZWN0aW9uLgorCSAqLworCWNkZl9tdXRleF9hY3F1aXJlKCZoZGRfY3R4LT5oZGRfY29uY19saXN0X2xvY2spOworCWlmIChtb2RlID09IENERl9TVEFfTU9ERSkgeworCQkvKiBTZXQgUENMIG9mIFNUQSB0byB0aGUgRlcgKi8KKwkJY2RzX3NvY19zZXRfcGNsKGhkZF9jdHgsIG1vZGUpOworCQljZHNfaW5mbygiU2V0IFBDTCBvZiBTVEEgdG8gRlciKTsKKwl9CisJY2RzX2luY3JfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4LCBzZXNzaW9uX2lkKTsKKwljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2N0eC0+aGRkX2NvbmNfbGlzdF9sb2NrKTsKK30KKworLyoqCisgKiBjZHNfbmVlZF9vcHBvcnR1bmlzdGljX3VwZ3JhZGUoKSAtIFRlbGxzIHVzIGlmIHdlIHJlYWxseQorICogbmVlZCBhbiB1cGdyYWRlIHRvIDJ4MgorICogQGhkZF9jdHg6IEhERCBjb250ZXh0CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGlmIHVwZHJhZGUgdG8gMngyIGlzIG5lZWRlZAorICoKKyAqIFJldHVybjogQ0RTX05PUCA9IHVwZ3JhZGUgaXMgbm90IG5lZWRlZCwgb3RoZXJ3aXNlIHVwZ3JhZGUgaXMKKyAqIG5lZWRlZAorICovCitlbnVtIGNkc19jb25jX25leHRfYWN0aW9uIGNkc19uZWVkX29wcG9ydHVuaXN0aWNfdXBncmFkZSgKKwkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwl1aW50MzJfdCBjb25uX2luZGV4OworCWVudW0gY2RzX2NvbmNfbmV4dF9hY3Rpb24gdXBncmFkZSA9IENEU19OT1A7CisJdWludDhfdCBtYWMgPSAwOworCisJaWYgKHdtYV9pc19od19kYnNfY2FwYWJsZSgpID09IGZhbHNlKSB7CisJCWNkc19lcnIoImRyaXZlciBpc24ndCBkYnMgY2FwYWJsZSwgbm8gZnVydGhlciBhY3Rpb24gbmVlZGVkIik7CisJCXJldHVybiB1cGdyYWRlOworCX0KKworCS8qIEFyZSBib3RoIG1hYydzIHN0aWxsIGluIHVzZSovCisJZm9yIChjb25uX2luZGV4ID0gMDsgY29ubl9pbmRleCA8IE1BWF9OVU1CRVJfT0ZfQ09OQ19DT05ORUNUSU9OUzsKKwkJY29ubl9pbmRleCsrKSB7CisJCWlmICgoY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0ubWFjID09IDApICYmCisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5pbl91c2UpIHsKKwkJCW1hYyB8PSAxOworCQkJaWYgKDMgPT0gbWFjKQorCQkJCWdvdG8gZG9uZTsKKwkJfSBlbHNlIGlmICgoY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0ubWFjID09IDEpICYmCisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5pbl91c2UpIHsKKwkJCW1hYyB8PSAyOworCQkJaWYgKDMgPT0gbWFjKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKyNpZmRlZiBRQ0FfV0lGSV8zXzBfRU1VCisJLyogRm9yIGVtdWxhdGlvbiBvbmx5OiBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiBvbiAyLjQsIHN0YXkgaW4gREJTICovCisJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4pKQorCQlnb3RvIGRvbmU7CisjZW5kaWYKKwkvKiBMZXQncyByZXF1ZXN0IGZvciBzaW5nbGUgTUFDIG1vZGUgKi8KKwl1cGdyYWRlID0gQ0RTX01DQzsKKwkvKiBJcyB0aGVyZSBhbnkgY29ubmVjdGlvbiBoYWQgYW4gaW5pdGlhbCBjb25uZWN0aW9uIHdpdGggMngyICovCisJZm9yIChjb25uX2luZGV4ID0gMDsgY29ubl9pbmRleCA8IE1BWF9OVU1CRVJfT0ZfQ09OQ19DT05ORUNUSU9OUzsKKwkJY29ubl9pbmRleCsrKSB7CisJCWlmICgoY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0ub3JpZ2luYWxfbnNzID09IDEpICYmCisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5pbl91c2UpIHsKKwkJCXVwZ3JhZGUgPSBDRFNfTUNDX1VQR1JBREU7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKK2RvbmU6CisJcmV0dXJuIHVwZ3JhZGU7Cit9CisKKworLyoqCisgKiBjZHNfc2V0X3BjbF9mb3JfZXhpc3RpbmdfY29tYm8oKSAtIFNldCBQQ0wgZm9yIGV4aXN0aW5nIGNvbm5lY3Rpb24KKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQG1vZGU6IENvbm5lY3Rpb24gbW9kZSBvZiB0eXBlICdjZHNfY29uX21vZGUnCisgKgorICogU2V0IHRoZSBQQ0wgZm9yIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY2RzX3NldF9wY2xfZm9yX2V4aXN0aW5nX2NvbWJvKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCWVudW0gY2RzX2Nvbl9tb2RlIG1vZGUpCit7CisJc3RydWN0IGNkc19jb25jX2Nvbm5lY3Rpb25faW5mbyBpbmZvOworCXRDREZfQ09OX01PREUgcGNsX21vZGU7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENEU19TVEFfTU9ERToKKwkJcGNsX21vZGUgPSBDREZfU1RBX01PREU7CisJCWJyZWFrOworCWNhc2UgQ0RTX1NBUF9NT0RFOgorCQlwY2xfbW9kZSA9IENERl9TQVBfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBDRFNfUDJQX0NMSUVOVF9NT0RFOgorCQlwY2xfbW9kZSA9IENERl9QMlBfQ0xJRU5UX01PREU7CisJCWJyZWFrOworCWNhc2UgQ0RTX1AyUF9HT19NT0RFOgorCQlwY2xfbW9kZSA9IENERl9QMlBfR09fTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBDRFNfSUJTU19NT0RFOgorCQlwY2xfbW9kZSA9IENERl9JQlNTX01PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNkc19lcnIoIkludmFsaWQgbW9kZSB0byBzZXQgUENMIik7CisJCXJldHVybjsKKwl9OworCisJaWYgKGNkc19tb2RlX3NwZWNpZmljX2Nvbm5lY3Rpb25fY291bnQoCisJCQkJaGRkX2N0eCwgbW9kZSwgTlVMTCkgPiAwKSB7CisJCS8qIENoZWNrLCBzdG9yZSBhbmQgdGVtcCBkZWxldGUgdGhlIG1vZGUncyBwYXJhbWV0ZXIgKi8KKwkJY2RzX3N0b3JlX2FuZF9kZWxfY29ubl9pbmZvKGhkZF9jdHgsIG1vZGUsCisJCQkJJmluZm8pOworCQkvKiBTZXQgdGhlIFBDTCB0byB0aGUgRlcgc2luY2UgY29ubmVjdGlvbiBnb3QgdXBkYXRlZCAqLworCQljZHNfc29jX3NldF9wY2woaGRkX2N0eCwgcGNsX21vZGUpOworCQljZHNfaW5mbygiU2V0IFBDTCB0byBGVyBmb3IgbW9kZTolZCIsIG1vZGUpOworCQkvKiBSZXN0b3JlIHRoZSBjb25uZWN0aW9uIGluZm8gKi8KKwkJY2RzX3Jlc3RvcmVfZGVsZXRlZF9jb25uX2luZm8oaGRkX2N0eCwgJmluZm8pOworCX0KK30KKworLyoqCisgKiBjZHNfZGVjcl9zZXNzaW9uX3NldF9wY2woKSAtIERlY3JlbWVudCBzZXNzaW9uIGNvdW50IGFuZCBzZXQgUENMCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqIEBtb2RlOiBDb25uZWN0aW9uIG1vZGUKKyAqIEBzZXNzaW9uX2lkOiBTZXNzaW9uIGlkCisgKgorICogRGVjcmVtZW50cyB0aGUgYWN0aXZlIHNlc3Npb24gY291bnQgYW5kIHNldHMgdGhlIFBDTCBpZiBhIFNUQSBjb25uZWN0aW9uCisgKiBleGlzdHMKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfZGVjcl9zZXNzaW9uX3NldF9wY2woaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJCXRDREZfQ09OX01PREUgbW9kZSwKKwkJCQkJCXVpbnQ4X3Qgc2Vzc2lvbl9pZCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisKKwljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2N0eC0+aGRkX2NvbmNfbGlzdF9sb2NrKTsKKwljZHNfZGVjcl9hY3RpdmVfc2Vzc2lvbihoZGRfY3R4LCBtb2RlLCBzZXNzaW9uX2lkKTsKKwkvKgorCSAqIEFmdGVyIHRoZSByZW1vdmFsIG9mIHRoaXMgY29ubmVjdGlvbiwgd2UgbmVlZCB0byBjaGVjayBpZgorCSAqIGEgU1RBIGNvbm5lY3Rpb24gc3RpbGwgZXhpc3RzLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKKwkgKiBpZiBvbmUgb3IgbW9yZSBTVEEgZXhpc3RzLCB3ZSBuZWVkIHRvIHByb3ZpZGUgdGhlIHVwZGF0ZWQKKwkgKiBQQ0wgdG8gdGhlIEZXIGZvciBjYXNlcyBsaWtlIExGUi4KKwkgKgorCSAqIFNpbmNlIGNkc19nZXRfcGNsIHByb3ZpZGVzIFBDTCBsaXN0IGJhc2VkIG9uIHRoZSBuZXcKKwkgKiBjb25uZWN0aW9uIHRoYXQgaXMgZ29pbmcgdG8gY29tZSB1cCwgd2Ugd2lsbCBmaW5kIHRoZQorCSAqIGV4aXN0aW5nIFNUQSBlbnRyeSwgc2F2ZSBpdCBhbmQgZGVsZXRlIGl0IHRlbXBvcmFyaWx5LgorCSAqIEFmdGVyIHRoaXMgd2Ugd2lsbCBnZXQgUENMIGFzIHRob3VnaCBhcyBuZXcgU1RBIGNvbm5lY3Rpb24KKwkgKiBpcyBjb21pbmcgdXAuIFRoaXMgd2lsbCBnaXZlIHRoZSBleGFjdCBQQ0wgdGhhdCBuZWVkcyB0byBiZQorCSAqIGdpdmVuIHRvIHRoZSBGVy4gQWZ0ZXIgc2V0dGluZyB0aGUgUENMLCB3ZSBuZWVkIHRvIHJlc3RvcmUKKwkgKiB0aGUgZW50cnkgdGhhdCB3ZSBoYXZlIHNhdmVkIGJlZm9yZS4KKwkgKi8KKwljZHNfc2V0X3BjbF9mb3JfZXhpc3RpbmdfY29tYm8oaGRkX2N0eCwgQ0RTX1NUQV9NT0RFKTsKKwkvKiBkbyB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgSFcgbW9kZSAqLworCWlmIChjZHNfbmVlZF9vcHBvcnR1bmlzdGljX3VwZ3JhZGUoaGRkX2N0eCkpIHsKKwkJLyogbGV0J3Mgc3RhcnQgdGhlIHRpbWVyICovCisJCWNkZl9tY190aW1lcl9zdG9wKCZoZGRfY3R4LT5kYnNfb3Bwb3J0dW5pc3RpY190aW1lcik7CisJCWNkZl9zdGF0dXMgPSBjZGZfbWNfdGltZXJfc3RhcnQoCisJCQkJCSZoZGRfY3R4LT5kYnNfb3Bwb3J0dW5pc3RpY190aW1lciwKKwkJCQkJREJTX09QUE9SVFVOSVNUSUNfVElNRSAqCisJCQkJCQkxMDAwKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCQljZHNfZXJyKCJGYWlsZWQgdG8gc3RhcnQgZGJzIG9wcG9ydHVuaXN0aWMgdGltZXIiKTsKKwl9CisJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9jdHgtPmhkZF9jb25jX2xpc3RfbG9jayk7CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBjZHNfZGVjcl9hY3RpdmVfc2Vzc2lvbigpIC0gZGVjcmVtZW50cyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucworICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKiBAbW9kZToJRGV2aWNlIG1vZGUKKyAqIEBzZXNzaW9uX2lkOiBzZXNzaW9uIElEIGZvciB0aGUgY29ubmVjdGlvbiBzZXNzaW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBkZWNyZW1lbnRzIHRoZSBudW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zIG1haW50YWluZWQgcGVyIGRldmljZQorICogbW9kZS4gSW4gdGhlIGNhc2Ugb2YgU1RBL1AyUCBDTEkvSUJTUyB1cG9uIGRpc2Nvbm5lY3Rpb24gaXQgaXMgZGVjcmVtZW50ZWQKKyAqIEluIHRoZSBjYXNlIG9mIFNBUC9QMlAgR08gdXBvbiBic3Mgc3RvcCBpdCBpcyBkZWNyZW1lbnRlZAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNkc19kZWNyX2FjdGl2ZV9zZXNzaW9uKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIHRDREZfQ09OX01PREUgbW9kZSwKKwkJCQkgIHVpbnQ4X3Qgc2Vzc2lvbl9pZCkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENERl9TVEFfTU9ERToKKwljYXNlIENERl9QMlBfQ0xJRU5UX01PREU6CisJY2FzZSBDREZfUDJQX0dPX01PREU6CisJY2FzZSBDREZfU0FQX01PREU6CisJCWlmIChoZGRfY3R4LT5ub19vZl9hY3RpdmVfc2Vzc2lvbnNbbW9kZV0pCisJCQloZGRfY3R4LT5ub19vZl9hY3RpdmVfc2Vzc2lvbnNbbW9kZV0tLTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWNkc19pbmZvKCJOby4jIG9mIGFjdGl2ZSBzZXNzaW9ucyBmb3IgbW9kZSAlZCA9ICVkIiwKKwkJbW9kZSwgaGRkX2N0eC0+bm9fb2ZfYWN0aXZlX3Nlc3Npb25zW21vZGVdKTsKKwljZHNfZGVjcl9jb25uZWN0aW9uX2NvdW50KGhkZF9jdHgsIHNlc3Npb25faWQpOworfQorCisvKioKKyAqIGNkc19kYnNfb3Bwb3J0dW5pc3RpY190aW1lcl9oYW5kbGVyKCkgLSBoYW5kbGVyIG9mCisgKiBkYnNfb3Bwb3J0dW5pc3RpY190aW1lcgorICogQGRhdGE6IEhERCBjb250ZXh0CisgKgorICogaGFuZGxlciBmb3IgZGJzX29wcG9ydHVuaXN0aWNfdGltZXIKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfZGJzX29wcG9ydHVuaXN0aWNfdGltZXJfaGFuZGxlcih2b2lkICpkYXRhKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSAoaGRkX2NvbnRleHRfdCAqKSBkYXRhOworCWVudW0gY2RzX2NvbmNfbmV4dF9hY3Rpb24gYWN0aW9uID0gQ0RTX05PUDsKKworCWlmIChOVUxMID09IGhkZF9jdHgpIHsKKwkJY2RzX2VycigiaGRkX2N0eCBpcyBOVUxMIik7CisJCXJldHVybjsKKwl9CisKKwljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2N0eC0+aGRkX2NvbmNfbGlzdF9sb2NrKTsKKwkvKiBpZiB3ZSBzdGlsbCBuZWVkIGl0ICovCisJYWN0aW9uID0gY2RzX25lZWRfb3Bwb3J0dW5pc3RpY191cGdyYWRlKGhkZF9jdHgpOworCWlmIChhY3Rpb24pIHsKKwkJLyogbGV0cyBjYWxsIGZvciBhY3Rpb24gKi8KKwkJY2RzX25leHRfYWN0aW9ucyhoZGRfY3R4LCBhY3Rpb24pOworCX0KKwljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2N0eC0+aGRkX2NvbmNfbGlzdF9sb2NrKTsKKworfQorCisvKioKKyAqIGNkc19pbml0X3BvbGljeV9tZ3IoKSAtIEluaXRpYWxpemUgdGhlIHBvbGljeSBtYW5hZ2VyCisgKiByZWxhdGVkIGRhdGEgc3RydWN0dXJlcworICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKgorICogSW5pdGlhbGl6ZSB0aGUgcG9saWN5IG1hbmFnZXIgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKiBSZXR1cm46IFN1Y2Nlc3MgaWYgdGhlIHBvbGljeSBtYW5hZ2VyIGlzIGluaXRpYWxpemVkIGNvbXBsZXRlbHkKKyAqLworQ0RGX1NUQVRVUyBjZHNfaW5pdF9wb2xpY3lfbWdyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJcF9jZHNfY29udGV4dFR5cGUgcF9jZHNfY29udGV4dDsKKworCWNkc19kZWJ1ZygiSW5pdGlhbGl6aW5nIHRoZSBwb2xpY3kgbWFuYWdlciIpOworCisJcF9jZHNfY29udGV4dCA9IGNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKTsKKwlpZiAoIXBfY2RzX2NvbnRleHQpIHsKKwkJY2RzX2VycigiSW52YWxpZCBDRFMgY29udGV4dCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyogaW5pdCBjb25jX2Nvbm5lY3Rpb25fbGlzdCAqLworCWNkZl9tZW1femVybyhjb25jX2Nvbm5lY3Rpb25fbGlzdCwgc2l6ZW9mKGNvbmNfY29ubmVjdGlvbl9saXN0KSk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfbXV0ZXhfaW5pdCgKKwkJCQkJJmhkZF9jdHgtPmhkZF9jb25jX2xpc3RfbG9jaykpKSB7CisJCWNkc19lcnIoIkZhaWxlZCB0byBpbml0IGhkZF9jb25jX2xpc3RfbG9jayIpOworCQkvKiBMZXRzIHVzIG5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXNtZV9yZWdpc3Rlcl9od19tb2RlX3RyYW5zX2NiKGhkZF9jdHgtPmhIYWwsCisJCQkJY2RzX2h3X21vZGVfdHJhbnNpdGlvbl9jYik7CisJc3RhdHVzID0gY2RmX21jX3RpbWVyX2luaXQoJmhkZF9jdHgtPmRic19vcHBvcnR1bmlzdGljX3RpbWVyLAorCQkJCSAgIENERl9USU1FUl9UWVBFX1NXLAorCQkJCSAgIGNkc19kYnNfb3Bwb3J0dW5pc3RpY190aW1lcl9oYW5kbGVyLAorCQkJCSAgICh2b2lkICopaGRkX2N0eCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljZHNfZXJyKCJGYWlsZWQgdG8gaW5pdCBEQlMgb3Bwb3J0dW5pc3RpYyB0aW1lciIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGNkZl9ldmVudF9pbml0KCZwX2Nkc19jb250ZXh0LT5jb25uZWN0aW9uX3VwZGF0ZV9kb25lX2V2dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljZHNfZXJyKCJjb25uZWN0aW9uX3VwZGF0ZV9kb25lX2V2dCBpbml0IGZhaWxlZCIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RzX2dldF9jb25uZWN0aW9uX2Zvcl92ZGV2X2lkKCkgLSBwcm92aWRlcyB0aGUKKyAqIHBlcnRpY3VsYXIgY29ubmVjdGlvbiB3aXRoIHRoZSByZXF1ZXN0ZWQgdmRldiBpZAorICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKiBAdmRldl9pZDogdmRldiBpZCBvZiB0aGUgY29ubmVjdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIHNwZWNpZmljIGNvbm5lY3Rpb24gd2l0aCB0aGUKKyAqIHJlcXVlc3RlZCB2ZGV2IGlkCisgKgorICogUmV0dXJuOiBpbmRleCBpbiB0aGUgY29ubmVjdGlvbiB0YWJsZQorICovCit1aW50MzJfdCBjZHNfZ2V0X2Nvbm5lY3Rpb25fZm9yX3ZkZXZfaWQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJCXVpbnQzMl90IHZkZXZfaWQpCit7CisJdWludDMyX3QgY29ubl9pbmRleCA9IDA7CisJZm9yIChjb25uX2luZGV4ID0gMDsgY29ubl9pbmRleCA8IE1BWF9OVU1CRVJfT0ZfQ09OQ19DT05ORUNUSU9OUzsKKwkJIGNvbm5faW5kZXgrKykgeworCQlpZiAoKGNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLnZkZXZfaWQgPT0gdmRldl9pZCkgJiYKKwkJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLmluX3VzZSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGNvbm5faW5kZXg7Cit9CisKKworLyoqCisgKiBjZHNfZ2V0X2Nvbm5lY3Rpb25fY291bnQoKSAtIHByb3ZpZGVzIHRoZSBjb3VudCBvZgorICogY3VycmVudCBjb25uZWN0aW9ucworICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGNvdW50IG9mIGN1cnJlbnQgY29ubmVjdGlvbnMKKyAqCisgKiBSZXR1cm46IGNvbm5lY3Rpb24gY291bnQKKyAqLwordWludDMyX3QgY2RzX2dldF9jb25uZWN0aW9uX2NvdW50KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJdWludDMyX3QgY29ubl9pbmRleCwgY291bnQgPSAwOworCWZvciAoY29ubl9pbmRleCA9IDA7IGNvbm5faW5kZXggPCBNQVhfTlVNQkVSX09GX0NPTkNfQ09OTkVDVElPTlM7CisJCSBjb25uX2luZGV4KyspIHsKKwkJaWYgKGNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLmluX3VzZSkKKwkJCWNvdW50Kys7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBjZHNfZ2V0X21vZGUoKSAtIEdldCBtb2RlIGZyb20gdHlwZSBhbmQgc3VidHlwZQorICogQHR5cGU6IHR5cGUKKyAqIEBzdWJ0eXBlOiBzdWJ0eXBlCisgKgorICogR2V0IHRoZSBjb25jdXJyZW5jeSBtb2RlIGZyb20gdGhlIHR5cGUgYW5kIHN1YnR5cGUKKyAqIG9mIHRoZSBpbnRlcmZhY2UKKyAqCisgKiBSZXR1cm46IGNkc19jb25fbW9kZQorICovCitlbnVtIGNkc19jb25fbW9kZSBjZHNfZ2V0X21vZGUodWludDhfdCB0eXBlLCB1aW50OF90IHN1YnR5cGUpCit7CisJZW51bSBjZHNfY29uX21vZGUgbW9kZSA9IENEU19NQVhfTlVNX09GX01PREU7CisJaWYgKHR5cGUgPT0gV01JX1ZERVZfVFlQRV9BUCkgeworCQlzd2l0Y2ggKHN1YnR5cGUpIHsKKwkJY2FzZSAwOgorCQkJbW9kZSA9IENEU19TQVBfTU9ERTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9VTklGSUVEX1ZERVZfU1VCVFlQRV9QMlBfR086CisJCQltb2RlID0gQ0RTX1AyUF9HT19NT0RFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCS8qIGVyciBtc2cqLworCQkJY2RzX2VycigiVW5rbm93biBzdWJ0eXBlICVkIGZvciB0eXBlICVkIiwKKwkJCQlzdWJ0eXBlLCB0eXBlKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICh0eXBlID09IFdNSV9WREVWX1RZUEVfU1RBKSB7CisJCXN3aXRjaCAoc3VidHlwZSkgeworCQljYXNlIDA6CisJCQltb2RlID0gQ0RTX1NUQV9NT0RFOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1VOSUZJRURfVkRFVl9TVUJUWVBFX1AyUF9DTElFTlQ6CisJCQltb2RlID0gQ0RTX1AyUF9DTElFTlRfTU9ERTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkvKiBlcnIgbXNnKi8KKwkJCWNkc19lcnIoIlVua25vd24gc3VidHlwZSAlZCBmb3IgdHlwZSAlZCIsCisJCQkJc3VidHlwZSwgdHlwZSk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAodHlwZSA9PSBXTUlfVkRFVl9UWVBFX0lCU1MpIHsKKwkJbW9kZSA9IENEU19JQlNTX01PREU7CisJfSBlbHNlIHsKKwkJLyogZXJyIG1zZyAqLworCQljZHNfZXJyKCJVbmtub3duIHR5cGUgJWQiLCB0eXBlKTsKKwl9CisKKwlyZXR1cm4gbW9kZTsKK30KKworLyoqCisgKiBjZHNfaW5jcl9jb25uZWN0aW9uX2NvdW50KCkgLSBhZGRzIHRoZSBuZXcgY29ubmVjdGlvbiB0bworICogdGhlIGN1cnJlbnQgY29ubmVjdGlvbnMgbGlzdAorICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyB0aGUgbmV3IGNvbm5lY3Rpb24gdG8gdGhlIGN1cnJlbnQKKyAqIGNvbm5lY3Rpb25zIGxpc3QKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBjZHNfaW5jcl9jb25uZWN0aW9uX2NvdW50KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCSAgdWludDMyX3QgdmRldl9pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXVpbnQzMl90IGNvbm5faW5kZXg7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKndtYV9jb25uX3RhYmxlX2VudHJ5OworCisJY29ubl9pbmRleCA9IGNkc19nZXRfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4KTsKKwlpZiAoaGRkX2N0eC0+Y29uZmlnLT5nTWF4Q29uY3VycmVudEFjdGl2ZVNlc3Npb25zIDwgY29ubl9pbmRleCkgeworCQkvKiBlcnIgbXNnICovCisJCWNkc19lcnIoImV4Y2VlZGVkIG1heCBjb25uZWN0aW9uIGxpbWl0ICVkIiwKKwkJCWhkZF9jdHgtPmNvbmZpZy0+Z01heENvbmN1cnJlbnRBY3RpdmVTZXNzaW9ucyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJd21hX2Nvbm5fdGFibGVfZW50cnkgPSB3bWFfZ2V0X2ludGVyZmFjZV9ieV92ZGV2X2lkKHZkZXZfaWQpOworCisJaWYgKE5VTEwgPT0gd21hX2Nvbm5fdGFibGVfZW50cnkpIHsKKwkJLyogZXJyIG1zZyovCisJCWNkc19lcnIoImNhbid0IGZpbmQgdmRldl9pZCAlZCBpbiBXTUEgdGFibGUiLCB2ZGV2X2lkKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBhZGQgdGhlIGVudHJ5ICovCisJY2RzX3VwZGF0ZV9jb25jX2xpc3QoY29ubl9pbmRleCwKKwkJCWNkc19nZXRfbW9kZSh3bWFfY29ubl90YWJsZV9lbnRyeS0+dHlwZSwKKwkJCQkJd21hX2Nvbm5fdGFibGVfZW50cnktPnN1Yl90eXBlKSwKKwkJCWNkc19mcmVxX3RvX2NoYW4od21hX2Nvbm5fdGFibGVfZW50cnktPm1oeiksCisJCQl3bWFfY29ubl90YWJsZV9lbnRyeS0+bWFjX2lkLAorCQkJd21hX2Nvbm5fdGFibGVfZW50cnktPmNoYWluX21hc2ssCisJCQl3bWFfY29ubl90YWJsZV9lbnRyeS0+dHhfc3RyZWFtcywKKwkJCXdtYV9jb25uX3RhYmxlX2VudHJ5LT5yeF9zdHJlYW1zLAorCQkJd21hX2Nvbm5fdGFibGVfZW50cnktPm5zcywgdmRldl9pZCwgdHJ1ZSk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjZHNfdXBkYXRlX2Nvbm5lY3Rpb25faW5mbygpIC0gdXBkYXRlcyB0aGUgZXhpc3RpbmcKKyAqIGNvbm5lY3Rpb24gaW4gdGhlIGN1cnJlbnQgY29ubmVjdGlvbnMgbGlzdAorICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyB0aGUgbmV3IGNvbm5lY3Rpb24gdG8gdGhlIGN1cnJlbnQKKyAqIGNvbm5lY3Rpb25zIGxpc3QKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBjZHNfdXBkYXRlX2Nvbm5lY3Rpb25faW5mbyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkgICB1aW50MzJfdCB2ZGV2X2lkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdWludDMyX3QgY29ubl9pbmRleCA9IDA7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICp3bWFfY29ubl90YWJsZV9lbnRyeTsKKworCWNkZl9tdXRleF9hY3F1aXJlKCZoZGRfY3R4LT5oZGRfY29uY19saXN0X2xvY2spOworCXdoaWxlIChDT05DX0NPTk5FQ1RJT05fTElTVF9WQUxJRF9JTkRFWChjb25uX2luZGV4KSkgeworCQlpZiAodmRldl9pZCA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS52ZGV2X2lkKSB7CisJCQkvKiBkZWJ1ZyBtc2cgKi8KKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJCWNvbm5faW5kZXgrKzsKKwl9CisJaWYgKCFmb3VuZCkgeworCQkvKiBlcnIgbXNnICovCisJCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfY3R4LT5oZGRfY29uY19saXN0X2xvY2spOworCQljZHNfZXJyKCJjYW4ndCBmaW5kIHZkZXZfaWQgJWQgaW4gY29uY19jb25uZWN0aW9uX2xpc3QiLAorCQkJdmRldl9pZCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJd21hX2Nvbm5fdGFibGVfZW50cnkgPSB3bWFfZ2V0X2ludGVyZmFjZV9ieV92ZGV2X2lkKHZkZXZfaWQpOworCisJaWYgKE5VTEwgPT0gd21hX2Nvbm5fdGFibGVfZW50cnkpIHsKKwkJLyogZXJyIG1zZyovCisJCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfY3R4LT5oZGRfY29uY19saXN0X2xvY2spOworCQljZHNfZXJyKCJjYW4ndCBmaW5kIHZkZXZfaWQgJWQgaW4gV01BIHRhYmxlIiwgdmRldl9pZCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogYWRkIHRoZSBlbnRyeSAqLworCWNkc191cGRhdGVfY29uY19saXN0KGNvbm5faW5kZXgsCisJCQljZHNfZ2V0X21vZGUod21hX2Nvbm5fdGFibGVfZW50cnktPnR5cGUsCisJCQkJCXdtYV9jb25uX3RhYmxlX2VudHJ5LT5zdWJfdHlwZSksCisJCQljZHNfZnJlcV90b19jaGFuKHdtYV9jb25uX3RhYmxlX2VudHJ5LT5taHopLAorCQkJd21hX2Nvbm5fdGFibGVfZW50cnktPm1hY19pZCwKKwkJCXdtYV9jb25uX3RhYmxlX2VudHJ5LT5jaGFpbl9tYXNrLAorCQkJd21hX2Nvbm5fdGFibGVfZW50cnktPnR4X3N0cmVhbXMsCisJCQl3bWFfY29ubl90YWJsZV9lbnRyeS0+cnhfc3RyZWFtcywKKwkJCXdtYV9jb25uX3RhYmxlX2VudHJ5LT5uc3MsIHZkZXZfaWQsIHRydWUpOworCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfY3R4LT5oZGRfY29uY19saXN0X2xvY2spOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RzX2RlY3JfY29ubmVjdGlvbl9jb3VudCgpIC0gcmVtb3ZlIHRoZSBvbGQgY29ubmVjdGlvbgorICogZnJvbSB0aGUgY3VycmVudCBjb25uZWN0aW9ucyBsaXN0CisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkIG9mIHRoZSBvbGQgY29ubmVjdGlvbgorICoKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIG9sZCBjb25uZWN0aW9uIGZyb20gdGhlIGN1cnJlbnQKKyAqIGNvbm5lY3Rpb25zIGxpc3QKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBjZHNfZGVjcl9jb25uZWN0aW9uX2NvdW50KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCSAgdWludDMyX3QgdmRldl9pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXVpbnQzMl90IGNvbm5faW5kZXggPSAwLCBuZXh0X2Nvbm5faW5kZXggPSAwOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCXdoaWxlIChDT05DX0NPTk5FQ1RJT05fTElTVF9WQUxJRF9JTkRFWChjb25uX2luZGV4KSkgeworCQlpZiAodmRldl9pZCA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS52ZGV2X2lkKSB7CisJCQkvKiBkZWJ1ZyBtc2cgKi8KKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJCWNvbm5faW5kZXgrKzsKKwl9CisJaWYgKCFmb3VuZCkgeworCQkvKiBlcnIgbXNnICovCisJCWNkc19lcnIoImNhbid0IGZpbmQgdmRldl9pZCAlZCBpbiBjb25jX2Nvbm5lY3Rpb25fbGlzdCIsCisJCQl2ZGV2X2lkKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJbmV4dF9jb25uX2luZGV4ID0gY29ubl9pbmRleCArIDE7CisJd2hpbGUgKENPTkNfQ09OTkVDVElPTl9MSVNUX1ZBTElEX0lOREVYKG5leHRfY29ubl9pbmRleCkpIHsKKwkJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0udmRldl9pZCA9CisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtuZXh0X2Nvbm5faW5kZXhdLnZkZXZfaWQ7CisJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLnR4X3NwYXRpYWxfc3RyZWFtID0KKwkJCWNvbmNfY29ubmVjdGlvbl9saXN0W25leHRfY29ubl9pbmRleF0udHhfc3BhdGlhbF9zdHJlYW07CisJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLnJ4X3NwYXRpYWxfc3RyZWFtID0KKwkJCWNvbmNfY29ubmVjdGlvbl9saXN0W25leHRfY29ubl9pbmRleF0ucnhfc3BhdGlhbF9zdHJlYW07CisJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLm1vZGUgPQorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbbmV4dF9jb25uX2luZGV4XS5tb2RlOworCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5tYWMgPQorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbbmV4dF9jb25uX2luZGV4XS5tYWM7CisJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLmNoYW4gPQorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbbmV4dF9jb25uX2luZGV4XS5jaGFuOworCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5jaGFpbl9tYXNrID0KKwkJCWNvbmNfY29ubmVjdGlvbl9saXN0W25leHRfY29ubl9pbmRleF0uY2hhaW5fbWFzazsKKwkJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0ub3JpZ2luYWxfbnNzID0KKwkJCWNvbmNfY29ubmVjdGlvbl9saXN0W25leHRfY29ubl9pbmRleF0ub3JpZ2luYWxfbnNzOworCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5pbl91c2UgPQorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbbmV4dF9jb25uX2luZGV4XS5pbl91c2U7CisJCWNvbm5faW5kZXgrKzsKKwkJbmV4dF9jb25uX2luZGV4Kys7CisJfQorCisJLyogY2xlYW4gdXAgdGhlIGVudHJ5ICovCisJY2RmX21lbV96ZXJvKCZjb25jX2Nvbm5lY3Rpb25fbGlzdFtuZXh0X2Nvbm5faW5kZXggLSAxXSwKKwkJc2l6ZW9mKCpjb25jX2Nvbm5lY3Rpb25fbGlzdCkpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RzX2dldF9jb25uZWN0aW9uX2NoYW5uZWxzKCkgLSBwcm92aWRlcyB0aGUgY2hhbm5lbChzKQorICogb24gd2hpY2ggY3VycmVudCBjb25uZWN0aW9uKHMpIGlzCisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqIEBjaGFubmVsczoJdGhlIGNoYW5uZWwocykgb24gd2hpY2ggY3VycmVudCBjb25uZWN0aW9uKHMpIGlzCisgKiBAbGVuOglOdW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBvcmRlcjoJbm8gb3JkZXIgT1IgMi40IEdoeiBjaGFubmVsIGZvbGxvd2VkIGJ5IDUgR2h6CisgKgljaGFubmVsIE9SIDUgR2h6IGNoYW5uZWwgZm9sbG93ZWQgYnkgMi40IEdoeiBjaGFubmVsCisgKgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGNoYW5uZWwocykgb24gd2hpY2ggY3VycmVudAorICogY29ubmVjdGlvbihzKSBpcy9hcmUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBjZHNfZ2V0X2Nvbm5lY3Rpb25fY2hhbm5lbHMoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCXVpbnQ4X3QgKmNoYW5uZWxzLCB1aW50MzJfdCAqbGVuLCB1aW50OF90IG9yZGVyKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVpbnQzMl90IGNvbm5faW5kZXggPSAwLCBudW1fY2hhbm5lbHMgPSAwOworCisJaWYgKE5VTEwgPT0gaGRkX2N0eCkgeworCQkvKiBlcnIgbXNnKi8KKwkJY2RzX2VycigiaGRkX2N0eCBpcyBOVUxMIik7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmICgoTlVMTCA9PSBjaGFubmVscykgfHwgKE5VTEwgPT0gbGVuKSkgeworCQkvKiBlcnIgbXNnKi8KKwkJY2RzX2VycigiY2hhbm5lbHMgb3IgbGVuIGlzIE5VTEwiKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaWYgKDAgPT0gb3JkZXIpIHsKKwkJd2hpbGUgKENPTkNfQ09OTkVDVElPTl9MSVNUX1ZBTElEX0lOREVYKGNvbm5faW5kZXgpKSB7CisJCQljaGFubmVsc1tudW1fY2hhbm5lbHMrK10gPQorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXgrK10uY2hhbjsKKwkJfQorCQkqbGVuID0gbnVtX2NoYW5uZWxzOworCX0gZWxzZSBpZiAoMSA9PSBvcmRlcikgeworCQl3aGlsZSAoQ09OQ19DT05ORUNUSU9OX0xJU1RfVkFMSURfSU5ERVgoY29ubl9pbmRleCkpIHsKKwkJCWlmIChDRFNfSVNfQ0hBTk5FTF8yNEdIWigKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5jaGFuKSkgeworCQkJCWNoYW5uZWxzW251bV9jaGFubmVscysrXSA9CisJCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXgrK10uY2hhbjsKKwkJCX0gZWxzZQorCQkJCWNvbm5faW5kZXgrKzsKKwkJfQorCQljb25uX2luZGV4ID0gMDsKKwkJd2hpbGUgKENPTkNfQ09OTkVDVElPTl9MSVNUX1ZBTElEX0lOREVYKGNvbm5faW5kZXgpKSB7CisJCQlpZiAoQ0RTX0lTX0NIQU5ORUxfNUdIWigKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5jaGFuKSkgeworCQkJCWNoYW5uZWxzW251bV9jaGFubmVscysrXSA9CisJCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXgrK10uY2hhbjsKKwkJCX0gZWxzZQorCQkJCWNvbm5faW5kZXgrKzsKKwkJfQorCQkqbGVuID0gbnVtX2NoYW5uZWxzOworCX0gZWxzZSBpZiAoMiA9PSBvcmRlcikgeworCQl3aGlsZSAoQ09OQ19DT05ORUNUSU9OX0xJU1RfVkFMSURfSU5ERVgoY29ubl9pbmRleCkpIHsKKwkJCWlmIChDRFNfSVNfQ0hBTk5FTF81R0haKAorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLmNoYW4pKSB7CisJCQkJY2hhbm5lbHNbbnVtX2NoYW5uZWxzKytdID0KKwkJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleCsrXS5jaGFuOworCQkJfSBlbHNlCisJCQkJY29ubl9pbmRleCsrOworCQl9CisJCWNvbm5faW5kZXggPSAwOworCQl3aGlsZSAoQ09OQ19DT05ORUNUSU9OX0xJU1RfVkFMSURfSU5ERVgoY29ubl9pbmRleCkpIHsKKwkJCWlmIChDRFNfSVNfQ0hBTk5FTF8yNEdIWigKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5jaGFuKSkgeworCQkJCWNoYW5uZWxzW251bV9jaGFubmVscysrXSA9CisJCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXgrK10uY2hhbjsKKwkJCX0gZWxzZQorCQkJCWNvbm5faW5kZXgrKzsKKwkJfQorCQkqbGVuID0gbnVtX2NoYW5uZWxzOworCX0gZWxzZSB7CisJCWNkc19lcnIoInVua25vd24gb3JkZXIgJWQiLCBvcmRlcik7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNkc191cGRhdGVfd2l0aF9zYWZlX2NoYW5uZWxfbGlzdCgpIC0gcHJvdmlkZXMgdGhlIHNhZmUKKyAqIGNoYW5uZWwgbGlzdAorICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKiBAcGNsX2NoYW5uZWxzOiBjaGFubmVsIGxpc3QKKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgbGlzdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIHNhZmUgY2hhbm5lbCBsaXN0IGZyb20gdGhlIGxpc3QKKyAqIHByb3ZpZGVkIGFmdGVyIGNvbnN1bHRpbmcgdGhlIGNoYW5uZWwgYXZvaWRhbmNlIGxpc3QKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworI2lmZGVmIENPTkZJR19DTlNTCit2b2lkIGNkc191cGRhdGVfd2l0aF9zYWZlX2NoYW5uZWxfbGlzdChoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJdWludDhfdCAqcGNsX2NoYW5uZWxzLCB1aW50MzJfdCAqbGVuKQoreworCXVpbnQxNl90IHVuc2FmZV9jaGFubmVsX2xpc3RbTUFYX05VTV9DSEFOXTsKKwl1aW50OF90IGN1cnJlbnRfY2hhbm5lbF9saXN0W01BWF9OVU1fQ0hBTl07CisJdWludDE2X3QgdW5zYWZlX2NoYW5uZWxfY291bnQgPSAwOworCXVpbnQ4X3QgaXNfdW5zYWZlID0gMTsKKwl1aW50OF90IGksIGo7CisJdWludDMyX3Qgc2FmZV9jaGFubmVsX2NvdW50ID0gMCwgY3VycmVudF9jaGFubmVsX2NvdW50ID0gMDsKKworCWlmIChsZW4pIHsKKwkJY3VycmVudF9jaGFubmVsX2NvdW50ID0gQ0RGX01JTigqbGVuLCBNQVhfTlVNX0NIQU4pOworCX0gZWxzZSB7CisJCWNkc19lcnIoImludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWwgbGVuZ3RoIik7CisJCXJldHVybjsKKwl9CisKKwljbnNzX2dldF93bGFuX3Vuc2FmZV9jaGFubmVsKHVuc2FmZV9jaGFubmVsX2xpc3QsCisJCQkJICAgICAmdW5zYWZlX2NoYW5uZWxfY291bnQsCisJCQkJICAgICBzaXplb2YodW5zYWZlX2NoYW5uZWxfbGlzdCkpOworCisJaWYgKHVuc2FmZV9jaGFubmVsX2NvdW50KSB7CisJCWNkZl9tZW1fY29weShjdXJyZW50X2NoYW5uZWxfbGlzdCwgcGNsX2NoYW5uZWxzLAorCQkJY3VycmVudF9jaGFubmVsX2NvdW50KTsKKwkJY2RmX21lbV96ZXJvKHBjbF9jaGFubmVscywKKwkJCXNpemVvZigqcGNsX2NoYW5uZWxzKSpjdXJyZW50X2NoYW5uZWxfY291bnQpOworCisJCWZvciAoaSA9IDA7IGkgPCBjdXJyZW50X2NoYW5uZWxfY291bnQ7IGkrKykgeworCQkJaXNfdW5zYWZlID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCB1bnNhZmVfY2hhbm5lbF9jb3VudDsgaisrKSB7CisJCQkJaWYgKGN1cnJlbnRfY2hhbm5lbF9saXN0W2ldID09CisJCQkJCXVuc2FmZV9jaGFubmVsX2xpc3Rbal0pIHsKKwkJCQkJLyogRm91bmQgdW5zYWZlIGNoYW5uZWwsIHVwZGF0ZSBpdCAqLworCQkJCQlpc191bnNhZmUgPSAxOworCQkJCQljZHNfd2FybigiQ0ggJWQgaXMgbm90IHNhZmUiLAorCQkJCQkJY3VycmVudF9jaGFubmVsX2xpc3RbaV0pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWlzX3Vuc2FmZSkgeworCQkJCXBjbF9jaGFubmVsc1tzYWZlX2NoYW5uZWxfY291bnQrK10gPQorCQkJCQljdXJyZW50X2NoYW5uZWxfbGlzdFtpXTsKKwkJCX0KKwkJfQorCQkqbGVuID0gc2FmZV9jaGFubmVsX2NvdW50OworCX0KKwlyZXR1cm47Cit9CisjZWxzZQordm9pZCBjZHNfdXBkYXRlX3dpdGhfc2FmZV9jaGFubmVsX2xpc3QoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCXVpbnQ4X3QgKnBjbF9jaGFubmVscywgdWludDMyX3QgKmxlbikKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYKKy8qKgorICogY2RzX2dldF9jaGFubmVsX2xpc3QoKSAtIHByb3ZpZGVzIHRoZSBjaGFubmVsIGxpc3QKKyAqIHN1Z2dlc3Rpb24gZm9yIG5ldyBjb25uZWN0aW9uCisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqIEBwY2w6CVRoZSBwcmVmZXJyZWQgY2hhbm5lbCBsaXN0IGVudW0KKyAqIEBwY2xfY2hhbm5lbHM6IFBDTCBjaGFubmVscworICogQGxlbjogbGVuZ2h0IG9mIHRoZSBQQ0wKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBhY3R1YWwgY2hhbm5lbCBsaXN0IGJhc2VkIG9uIHRoZQorICogY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbiBkZXJpdmVkIHVzaW5nIHByZWZlcnJlZCBjaGFubmVsCisgKiBsaXN0IGVudW0gb2J0YWluZWQgZnJvbSBvbmUgb2YgdGhlIHBjbF90YWJsZQorICoKKyAqIFJldHVybjogQ2hhbm5lbCBMaXN0CisgKi8KK0NERl9TVEFUVVMgY2RzX2dldF9jaGFubmVsX2xpc3QoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCWVudW0gY2RzX3BjbF90eXBlIHBjbCwKKwkJCXVpbnQ4X3QgKnBjbF9jaGFubmVscywgdWludDMyX3QgKmxlbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXVpbnQzMl90IG51bV9jaGFubmVscyA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKwl1aW50MzJfdCBjaGFuX2luZGV4ID0gMCwgY2hhbl9pbmRleF8yNCA9IDAsIGNoYW5faW5kZXhfNSA9IDA7CisJdWludDhfdCBjaGFubmVsX2xpc3RbTUFYX05VTV9DSEFOXSA9IHswfTsKKwl1aW50OF90IGNoYW5uZWxfbGlzdF8yNFtNQVhfTlVNX0NIQU5dID0gezB9OworCXVpbnQ4X3QgY2hhbm5lbF9saXN0XzVbTUFYX05VTV9DSEFOXSA9IHswfTsKKworCWlmIChOVUxMID09IGhkZF9jdHgpIHsKKwkJLyogZXJyIG1zZyovCisJCWNkc19lcnIoImhkZF9jdHggaXMgTlVMTCIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmICgoTlVMTCA9PSBwY2xfY2hhbm5lbHMpIHx8IChOVUxMID09IGxlbikpIHsKKwkJLyogZXJyIG1zZyovCisJCWNkc19lcnIoInBjbF9jaGFubmVscyBvciBsZW4gaXMgTlVMTCIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmIChDRFNfTUFYX1BDTF9UWVBFID09IHBjbCkgeworCQkvKiBtc2cgKi8KKwkJY2RzX2VycigicGNsIGlzIGludmFsaWQiKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoQ0RTX05PTkUgPT0gcGNsKSB7CisJCS8qIG1zZyAqLworCQljZHNfZXJyKCJwY2wgaXMgMCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKwkvKiBnZXQgdGhlIGNoYW5uZWwgbGlzdCBmb3IgY3VycmVudCBkb21haW4gKi8KKwlzdGF0dXMgPSBzbWVfZ2V0X2NmZ192YWxpZF9jaGFubmVscyhoZGRfY3R4LT5oSGFsLCBjaGFubmVsX2xpc3QsCisJCQkmbnVtX2NoYW5uZWxzKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQkvKiBlcnIgbXNnKi8KKwkJY2RzX2VycigiTm8gdmFsaWQgY2hhbm5lbCIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwkvKiBMZXQncyBkaXZpZGUgdGhlIGxpc3QgaW4gMi40ICYgNSBHaHogbGlzdHMgKi8KKwl3aGlsZSAoKGNoYW5uZWxfbGlzdFtjaGFuX2luZGV4XSA8PSAxMSkgJiYKKwkJKGNoYW5faW5kZXhfMjQgPCBNQVhfTlVNX0NIQU4pKQorCQljaGFubmVsX2xpc3RfMjRbY2hhbl9pbmRleF8yNCsrXSA9IGNoYW5uZWxfbGlzdFtjaGFuX2luZGV4KytdOworCWlmIChjaGFubmVsX2xpc3RbY2hhbl9pbmRleF0gPT0gMTIpIHsKKwkJY2hhbm5lbF9saXN0XzI0W2NoYW5faW5kZXhfMjQrK10gPSBjaGFubmVsX2xpc3RbY2hhbl9pbmRleCsrXTsKKwkJaWYgKGNoYW5uZWxfbGlzdFtjaGFuX2luZGV4XSA9PSAxMykgeworCQkJY2hhbm5lbF9saXN0XzI0W2NoYW5faW5kZXhfMjQrK10gPQorCQkJCWNoYW5uZWxfbGlzdFtjaGFuX2luZGV4KytdOworCQkJaWYgKGNoYW5uZWxfbGlzdFtjaGFuX2luZGV4XSA9PSAxNCkKKwkJCQljaGFubmVsX2xpc3RfMjRbY2hhbl9pbmRleF8yNCsrXSA9CisJCQkJCWNoYW5uZWxfbGlzdFtjaGFuX2luZGV4KytdOworCQl9CisJfQorCXdoaWxlICgoY2hhbl9pbmRleCA8IG51bV9jaGFubmVscykgJiYKKwkJKGNoYW5faW5kZXhfNSA8IE1BWF9OVU1fQ0hBTikpCisJCWNoYW5uZWxfbGlzdF81W2NoYW5faW5kZXhfNSsrXSA9IGNoYW5uZWxfbGlzdFtjaGFuX2luZGV4KytdOworCisJbnVtX2NoYW5uZWxzID0gMDsKKwlzd2l0Y2ggKHBjbCkgeworCWNhc2UgQ0RTXzI0RzoKKwkJY2RmX21lbV9jb3B5KHBjbF9jaGFubmVscywgY2hhbm5lbF9saXN0XzI0LAorCQkJY2hhbl9pbmRleF8yNCk7CisJCSpsZW4gPSBjaGFuX2luZGV4XzI0OworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCWNhc2UgQ0RTXzVHOgorCQljZGZfbWVtX2NvcHkocGNsX2NoYW5uZWxzLCBjaGFubmVsX2xpc3RfNSwKKwkJCWNoYW5faW5kZXhfNSk7CisJCSpsZW4gPSBjaGFuX2luZGV4XzU7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBDRFNfU0NDX0NIOgorCWNhc2UgQ0RTX01DQ19DSDoKKwkJY2RzX2dldF9jb25uZWN0aW9uX2NoYW5uZWxzKGhkZF9jdHgsCisJCQljaGFubmVsX2xpc3QsICZudW1fY2hhbm5lbHMsIDApOworCQljZGZfbWVtX2NvcHkocGNsX2NoYW5uZWxzLCBjaGFubmVsX2xpc3QsIG51bV9jaGFubmVscyk7CisJCSpsZW4gPSBudW1fY2hhbm5lbHM7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBDRFNfU0NDX0NIXzI0RzoKKwljYXNlIENEU19NQ0NfQ0hfMjRHOgorCQljZHNfZ2V0X2Nvbm5lY3Rpb25fY2hhbm5lbHMoaGRkX2N0eCwKKwkJCWNoYW5uZWxfbGlzdCwgJm51bV9jaGFubmVscywgMCk7CisJCWNkZl9tZW1fY29weShwY2xfY2hhbm5lbHMsIGNoYW5uZWxfbGlzdCwgbnVtX2NoYW5uZWxzKTsKKwkJKmxlbiA9IG51bV9jaGFubmVsczsKKwkJY2RmX21lbV9jb3B5KCZwY2xfY2hhbm5lbHNbbnVtX2NoYW5uZWxzXSwKKwkJCWNoYW5uZWxfbGlzdF8yNCwgY2hhbl9pbmRleF8yNCk7CisJCSpsZW4gKz0gY2hhbl9pbmRleF8yNDsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlicmVhazsKKwljYXNlIENEU19TQ0NfQ0hfNUc6CisJY2FzZSBDRFNfTUNDX0NIXzVHOgorCQljZHNfZ2V0X2Nvbm5lY3Rpb25fY2hhbm5lbHMoaGRkX2N0eCwKKwkJCWNoYW5uZWxfbGlzdCwgJm51bV9jaGFubmVscywgMCk7CisJCWNkZl9tZW1fY29weShwY2xfY2hhbm5lbHMsIGNoYW5uZWxfbGlzdCwKKwkJCW51bV9jaGFubmVscyk7CisJCSpsZW4gPSBudW1fY2hhbm5lbHM7CisJCWNkZl9tZW1fY29weSgmcGNsX2NoYW5uZWxzW251bV9jaGFubmVsc10sCisJCQljaGFubmVsX2xpc3RfNSwgY2hhbl9pbmRleF81KTsKKwkJKmxlbiArPSBjaGFuX2luZGV4XzU7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBDRFNfMjRHX1NDQ19DSDoKKwljYXNlIENEU18yNEdfTUNDX0NIOgorCQljZGZfbWVtX2NvcHkocGNsX2NoYW5uZWxzLCBjaGFubmVsX2xpc3RfMjQsCisJCQljaGFuX2luZGV4XzI0KTsKKwkJKmxlbiA9IGNoYW5faW5kZXhfMjQ7CisJCWNkc19nZXRfY29ubmVjdGlvbl9jaGFubmVscyhoZGRfY3R4LAorCQkJY2hhbm5lbF9saXN0LCAmbnVtX2NoYW5uZWxzLCAwKTsKKwkJY2RmX21lbV9jb3B5KCZwY2xfY2hhbm5lbHNbY2hhbl9pbmRleF8yNF0sCisJCQljaGFubmVsX2xpc3QsIG51bV9jaGFubmVscyk7CisJCSpsZW4gKz0gbnVtX2NoYW5uZWxzOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCWNhc2UgQ0RTXzVHX1NDQ19DSDoKKwljYXNlIENEU181R19NQ0NfQ0g6CisJCWNkZl9tZW1fY29weShwY2xfY2hhbm5lbHMsIGNoYW5uZWxfbGlzdF81LAorCQkJY2hhbl9pbmRleF81KTsKKwkJKmxlbiA9IGNoYW5faW5kZXhfNTsKKwkJY2RzX2dldF9jb25uZWN0aW9uX2NoYW5uZWxzKGhkZF9jdHgsCisJCQljaGFubmVsX2xpc3QsICZudW1fY2hhbm5lbHMsIDApOworCQljZGZfbWVtX2NvcHkoJnBjbF9jaGFubmVsc1tjaGFuX2luZGV4XzVdLAorCQkJY2hhbm5lbF9saXN0LCBudW1fY2hhbm5lbHMpOworCQkqbGVuICs9IG51bV9jaGFubmVsczsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlicmVhazsKKwljYXNlIENEU19TQ0NfT05fMjRfU0NDX09OXzU6CisJCWNkc19nZXRfY29ubmVjdGlvbl9jaGFubmVscyhoZGRfY3R4LAorCQkJY2hhbm5lbF9saXN0LCAmbnVtX2NoYW5uZWxzLCAxKTsKKwkJY2RmX21lbV9jb3B5KHBjbF9jaGFubmVscywgY2hhbm5lbF9saXN0LAorCQkJbnVtX2NoYW5uZWxzKTsKKwkJKmxlbiA9IG51bV9jaGFubmVsczsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlicmVhazsKKwljYXNlIENEU19TQ0NfT05fNV9TQ0NfT05fMjQ6CisJCWNkc19nZXRfY29ubmVjdGlvbl9jaGFubmVscyhoZGRfY3R4LAorCQkJY2hhbm5lbF9saXN0LCAmbnVtX2NoYW5uZWxzLCAyKTsKKwkJY2RmX21lbV9jb3B5KHBjbF9jaGFubmVscywgY2hhbm5lbF9saXN0LCBudW1fY2hhbm5lbHMpOworCQkqbGVuID0gbnVtX2NoYW5uZWxzOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCWNhc2UgQ0RTX1NDQ19PTl8yNF9TQ0NfT05fNV8yNEc6CisJCWNkc19nZXRfY29ubmVjdGlvbl9jaGFubmVscyhoZGRfY3R4LAorCQkJY2hhbm5lbF9saXN0LCAmbnVtX2NoYW5uZWxzLCAxKTsKKwkJY2RmX21lbV9jb3B5KHBjbF9jaGFubmVscywgY2hhbm5lbF9saXN0LCBudW1fY2hhbm5lbHMpOworCQkqbGVuID0gbnVtX2NoYW5uZWxzOworCQljZGZfbWVtX2NvcHkoJnBjbF9jaGFubmVsc1tudW1fY2hhbm5lbHNdLAorCQkJY2hhbm5lbF9saXN0XzI0LCBjaGFuX2luZGV4XzI0KTsKKwkJKmxlbiArPSBjaGFuX2luZGV4XzI0OworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCWNhc2UgQ0RTX1NDQ19PTl8yNF9TQ0NfT05fNV81RzoKKwkJY2RzX2dldF9jb25uZWN0aW9uX2NoYW5uZWxzKGhkZF9jdHgsCisJCQljaGFubmVsX2xpc3QsICZudW1fY2hhbm5lbHMsIDEpOworCQljZGZfbWVtX2NvcHkocGNsX2NoYW5uZWxzLCBjaGFubmVsX2xpc3QsIG51bV9jaGFubmVscyk7CisJCSpsZW4gPSBudW1fY2hhbm5lbHM7CisJCWNkZl9tZW1fY29weSgmcGNsX2NoYW5uZWxzW251bV9jaGFubmVsc10sCisJCQljaGFubmVsX2xpc3RfNSwgY2hhbl9pbmRleF81KTsKKwkJKmxlbiArPSBjaGFuX2luZGV4XzU7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBDRFNfU0NDX09OXzVfU0NDX09OXzI0XzI0RzoKKwkJY2RzX2dldF9jb25uZWN0aW9uX2NoYW5uZWxzKGhkZF9jdHgsCisJCQljaGFubmVsX2xpc3QsICZudW1fY2hhbm5lbHMsIDIpOworCQljZGZfbWVtX2NvcHkocGNsX2NoYW5uZWxzLCBjaGFubmVsX2xpc3QsIG51bV9jaGFubmVscyk7CisJCSpsZW4gPSBudW1fY2hhbm5lbHM7CisJCWNkZl9tZW1fY29weSgmcGNsX2NoYW5uZWxzW251bV9jaGFubmVsc10sCisJCQljaGFubmVsX2xpc3RfMjQsIGNoYW5faW5kZXhfMjQpOworCQkqbGVuICs9IGNoYW5faW5kZXhfMjQ7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBDRFNfU0NDX09OXzVfU0NDX09OXzI0XzVHOgorCQljZHNfZ2V0X2Nvbm5lY3Rpb25fY2hhbm5lbHMoaGRkX2N0eCwKKwkJCWNoYW5uZWxfbGlzdCwgJm51bV9jaGFubmVscywgMik7CisJCWNkZl9tZW1fY29weShwY2xfY2hhbm5lbHMsIGNoYW5uZWxfbGlzdCwgbnVtX2NoYW5uZWxzKTsKKwkJKmxlbiA9IG51bV9jaGFubmVsczsKKwkJY2RmX21lbV9jb3B5KCZwY2xfY2hhbm5lbHNbbnVtX2NoYW5uZWxzXSwKKwkJCWNoYW5uZWxfbGlzdF81LCBjaGFuX2luZGV4XzUpOworCQkqbGVuICs9IGNoYW5faW5kZXhfNTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBlcnIgbXNnICovCisJCWNkc19lcnIoInVua25vd24gcGNsIHZhbHVlICVkIiwgcGNsKTsKKwkJYnJlYWs7CisJfQorCisJLyogY2hlY2sgdGhlIGNoYW5uZWwgYXZvaWRhbmNlIGxpc3QgKi8KKwljZHNfdXBkYXRlX3dpdGhfc2FmZV9jaGFubmVsX2xpc3QoaGRkX2N0eCwgcGNsX2NoYW5uZWxzLCBsZW4pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjZHNfbWFwX2NvbmN1cnJlbmN5X21vZGUoKSAtIHRvIG1hcCBjb25jdXJyZW5jeSBtb2RlIGJldHdlZW4gc21lIGFuZCBoZGQKKyAqIEBoZGRfY3R4OiBoZGQgY29udGV4dAorICogQG9sZF9tb2RlOiBzbWUgcHJvdmlkZWQgY29uY3VycmVuY3kgbW9kZQorICogQG5ld19tb2RlOiBoZGQgcHJvdmlkZWQgY29uY3VycmVuY3kgbW9kZQorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIG1hcCBjb25jdXJyZW5jeSBtb2RlIGJldHdlZW4gc21lIGFuZCBoZGQKKyAqCisgKiBSZXR1cm46IHRydWUgb3IgZmFsc2UKKyAqLworYm9vbCBjZHNfbWFwX2NvbmN1cnJlbmN5X21vZGUoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwl0Q0RGX0NPTl9NT0RFICpvbGRfbW9kZSwgZW51bSBjZHNfY29uX21vZGUgKm5ld19tb2RlKQoreworCWJvb2wgc3RhdHVzID0gdHJ1ZTsKKworCWlmICghaGRkX2N0eCkgeworCQljZHNfZXJyKCJIREQgY29udGV4dCBpcyBOVUxMIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzd2l0Y2ggKCpvbGRfbW9kZSkgeworCisJY2FzZSBDREZfU1RBX01PREU6CisJCSpuZXdfbW9kZSA9IENEU19TVEFfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBDREZfU0FQX01PREU6CisJCSpuZXdfbW9kZSA9IENEU19TQVBfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBDREZfUDJQX0NMSUVOVF9NT0RFOgorCQkqbmV3X21vZGUgPSBDRFNfUDJQX0NMSUVOVF9NT0RFOworCQlicmVhazsKKwljYXNlIENERl9QMlBfR09fTU9ERToKKwkJKm5ld19tb2RlID0gQ0RTX1AyUF9HT19NT0RFOworCQlicmVhazsKKwljYXNlIENERl9JQlNTX01PREU6CisJCSpuZXdfbW9kZSA9IENEU19JQlNTX01PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpuZXdfbW9kZSA9IENEU19NQVhfTlVNX09GX01PREU7CisJCXN0YXR1cyA9IGZhbHNlOworCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjZHNfZ2V0X3BjbCgpIC0gcHJvdmlkZXMgdGhlIHByZWZlcnJlZCBjaGFubmVsIGxpc3QgZm9yCisgKiBuZXcgY29ubmVjdGlvbgorICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKiBAbW9kZToJRGV2aWNlIG1vZGUKKyAqIEBwY2xfY2hhbm5lbHM6IFBDTCBjaGFubmVscworICogQGxlbjogbGVuZ2h0IG9mIHRoZSBQQ0wKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBwcmVmZXJyZWQgY2hhbm5lbCBsaXN0IG9uIHdoaWNoCisgKiBwb2xpY3kgbWFuYWdlciB3YW50cyB0aGUgbmV3IGNvbm5lY3Rpb24gdG8gY29tZSB1cC4gVmFyaW91cworICogY29ubmVjdGlvbiBkZWNpc2lvbiBtYWtpbmcgZW50aXRpZXMgd2lsbCB1c2luZyB0aGlzIGZ1bmN0aW9uCisgKiB0byBxdWVyeSB0aGUgUENMIGluZm8KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBjZHNfZ2V0X3BjbChoZGRfY29udGV4dF90ICpoZGRfY3R4LCBlbnVtIGNkc19jb25fbW9kZSBtb2RlLAorCQkJdWludDhfdCAqcGNsX2NoYW5uZWxzLCB1aW50MzJfdCAqbGVuKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdWludDMyX3QgbnVtX2Nvbm5lY3Rpb25zID0gMDsKKwllbnVtIGNkc19jb25jX3ByaW9yaXR5X21vZGUgZmlyc3RfaW5kZXggPSAwOworCWVudW0gY2RzX29uZV9jb25uZWN0aW9uX21vZGUgc2Vjb25kX2luZGV4ID0gMDsKKwllbnVtIGNkc190d29fY29ubmVjdGlvbl9tb2RlIHRoaXJkX2luZGV4ID0gMDsKKwllbnVtIGNkc19wY2xfdHlwZSBwY2wgPSBDRFNfTk9ORTsKKwllbnVtIGNkc19jb25jX3ByaW9yaXR5X21vZGUgY29uY19zeXN0ZW1fcHJlZiA9IDA7CisJLyogZmluZCB0aGUgY3VycmVudCBjb25uZWN0aW9uIHN0YXRlIGZyb20gY29uY19jb25uZWN0aW9uX2xpc3QqLworCW51bV9jb25uZWN0aW9ucyA9IGNkc19nZXRfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4KTsKKwljZHNfZGVidWcoImNvbm5lY3Rpb25zOiVkIHByZWY6JWQgcmVxdWVzdGVkIG1vZGU6JWQiLAorCQludW1fY29ubmVjdGlvbnMsIGhkZF9jdHgtPmNvbmZpZy0+Y29uY19zeXN0ZW1fcHJlZiwgbW9kZSk7CisKKwlzd2l0Y2ggKGhkZF9jdHgtPmNvbmZpZy0+Y29uY19zeXN0ZW1fcHJlZikgeworCWNhc2UgMDoKKwkJY29uY19zeXN0ZW1fcHJlZiA9IENEU19USFJPVUdIUFVUOworCQlicmVhazsKKwljYXNlIDE6CisJCWNvbmNfc3lzdGVtX3ByZWYgPSBDRFNfUE9XRVJTQVZFOworCQlicmVhazsKKwljYXNlIDI6CisJCWNvbmNfc3lzdGVtX3ByZWYgPSBDRFNfTEFURU5DWTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZXJyIG1zZyAqLworCQljZHNfZXJyKCJ1bmtub3duIGNvbmNfc3lzdGVtX3ByZWYgdmFsdWUgJWQiLAorCQkJaGRkX2N0eC0+Y29uZmlnLT5jb25jX3N5c3RlbV9wcmVmKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChudW1fY29ubmVjdGlvbnMpIHsKKwljYXNlIDA6CisJCWZpcnN0X2luZGV4ID0KKwkJCWNkc19nZXRfZmlyc3RfY29ubmVjdGlvbl9wY2xfdGFibGVfaW5kZXgoaGRkX2N0eCk7CisJCXBjbCA9IGZpcnN0X2Nvbm5lY3Rpb25fcGNsX3RhYmxlW21vZGVdW2ZpcnN0X2luZGV4XTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzZWNvbmRfaW5kZXggPQorCQkJY2RzX2dldF9zZWNvbmRfY29ubmVjdGlvbl9wY2xfdGFibGVfaW5kZXgoaGRkX2N0eCk7CisJCWlmIChDRFNfTUFYX09ORV9DT05ORUNUSU9OX01PREUgPT0gc2Vjb25kX2luZGV4KSB7CisJCQkvKiBlcnIgbXNnICovCisJCQljZHNfZXJyKCJjb3VsZG4ndCBmaW5kIGluZGV4IGZvciAybmQgY29ubmVjdGlvbiBwY2wgdGFibGUiKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJaWYgKHdtYV9pc19od19kYnNfY2FwYWJsZSgpID09IHRydWUpIHsKKwkJCXBjbCA9IHNlY29uZF9jb25uZWN0aW9uX3BjbF9kYnNfdGFibGUKKwkJCQlbc2Vjb25kX2luZGV4XVttb2RlXVtjb25jX3N5c3RlbV9wcmVmXTsKKwkJfSBlbHNlIHsKKwkJCXBjbCA9IHNlY29uZF9jb25uZWN0aW9uX3BjbF9ub2Ric190YWJsZQorCQkJCVtzZWNvbmRfaW5kZXhdW21vZGVdW2NvbmNfc3lzdGVtX3ByZWZdOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0aGlyZF9pbmRleCA9CisJCQljZHNfZ2V0X3RoaXJkX2Nvbm5lY3Rpb25fcGNsX3RhYmxlX2luZGV4KGhkZF9jdHgpOworCQlpZiAoQ0RTX01BWF9UV09fQ09OTkVDVElPTl9NT0RFID09IHRoaXJkX2luZGV4KSB7CisJCQkvKiBlcnIgbXNnICovCisJCQljZHNfZXJyKCJjb3VsZG4ndCBmaW5kIGluZGV4IGZvciAzcmQgY29ubmVjdGlvbiBwY2wgdGFibGUiKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJaWYgKHdtYV9pc19od19kYnNfY2FwYWJsZSgpID09IHRydWUpIHsKKwkJCXBjbCA9IHRoaXJkX2Nvbm5lY3Rpb25fcGNsX2Ric190YWJsZQorCQkJCVt0aGlyZF9pbmRleF1bbW9kZV1bY29uY19zeXN0ZW1fcHJlZl07CisJCX0gZWxzZSB7CisJCQlwY2wgPSB0aGlyZF9jb25uZWN0aW9uX3BjbF9ub2Ric190YWJsZQorCQkJCVt0aGlyZF9pbmRleF1bbW9kZV1bY29uY19zeXN0ZW1fcHJlZl07CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZXJyIG1zZyAqLworCQljZHNfZXJyKCJ1bmV4cGVjdGVkIG51bV9jb25uZWN0aW9ucyB2YWx1ZSAlZCIsCisJCQludW1fY29ubmVjdGlvbnMpOworCQlicmVhazsKKwl9CisKKwljZHNfZGVidWcoImluZGV4MTolZCBpbmRleDI6JWQgaW5kZXgzOiVkIHBjbDolZCBkYnM6JWQiLAorCQlmaXJzdF9pbmRleCwgc2Vjb25kX2luZGV4LCB0aGlyZF9pbmRleCwKKwkJcGNsLCB3bWFfaXNfaHdfZGJzX2NhcGFibGUoKSk7CisKKwkvKiBvbmNlIHRoZSBQQ0wgZW51bSBpcyBvYnRhaW5lZCBmaW5kIG91dCB0aGUgZXhhY3QgY2hhbm5lbCBsaXN0IHdpdGgKKwkgKiBoZWxwIGZyb20gc21lX2dldF9jZmdfdmFsaWRfY2hhbm5lbHMKKwkgKi8KKwlzdGF0dXMgPSBjZHNfZ2V0X2NoYW5uZWxfbGlzdChoZGRfY3R4LCBwY2wsIHBjbF9jaGFubmVscywgbGVuKTsKKwlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQl1aW50MzJfdCBpOworCQljZHNfZGVidWcoInBjbCBsZW46JWQiLCAqbGVuKTsKKwkJZm9yIChpID0gMDsgaSA8ICpsZW47IGkrKykKKwkJCWNkc19kZWJ1ZygiY2hhbjolZCIsIHBjbF9jaGFubmVsc1tpXSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjZHNfZGlzYWxsb3dfbWNjKCkgLSBDaGVjayBmb3IgbWNjCisgKgorICogQGhkZF9jdHg6CUhERCBDb250ZXh0CisgKiBAY2hhbm5lbDogY2hhbm5lbCBvbiB3aGljaCBuZXcgY29ubmVjdGlvbiBpcyBjb21pbmcgdXAKKyAqCisgKiBXaGVuIGEgbmV3IGNvbm5lY3Rpb24gaXMgYWJvdXQgdG8gY29tZSB1cCBjaGVjayBpZiBjdXJyZW50CisgKiBjb25jdXJyZW5jeSBjb21iaW5hdGlvbiBpbmNsdWRpbmcgdGhlIG5ldyBjb25uZWN0aW9uIGlzCisgKiBjYXVzaW5nIE1DQworICoKKyAqIFJldHVybjogVHJ1ZS9GYWxzZQorICovCitib29sIGNkc19kaXNhbGxvd19tY2MoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgdWludDhfdCBjaGFubmVsKQoreworCXVpbnQzMl90IGluZGV4ID0gMDsKKwlib29sIG1hdGNoID0gZmFsc2U7CisJd2hpbGUgKENPTkNfQ09OTkVDVElPTl9MSVNUX1ZBTElEX0lOREVYKGluZGV4KSkgeworCQlpZiAod21hX2lzX2h3X2Ric19jYXBhYmxlKCkgPT0gZmFsc2UpIHsKKwkJCWlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFtpbmRleF0uY2hhbiAhPQorCQkJCWNoYW5uZWwpIHsKKwkJCQltYXRjaCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoQ0RTX0lTX0NIQU5ORUxfNUdIWgorCQkJKGNvbmNfY29ubmVjdGlvbl9saXN0W2luZGV4XS5jaGFuKSkgeworCQkJaWYgKGNvbmNfY29ubmVjdGlvbl9saXN0W2luZGV4XS5jaGFuICE9IGNoYW5uZWwpIHsKKwkJCQltYXRjaCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaW5kZXgrKzsKKwl9CisJcmV0dXJuIG1hdGNoOworfQorCisvKioKKyAqIGNkc19hbGxvd19uZXdfaG9tZV9jaGFubmVsKCkgLSBDaGVjayBmb3IgYWxsb3dlZCBudW1iZXIgb2YKKyAqIGhvbWUgY2hhbm5lbHMKKyAqCisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqIEBjaGFubmVsOiBjaGFubmVsIG9uIHdoaWNoIG5ldyBjb25uZWN0aW9uIGlzIGNvbWluZyB1cAorICogQG51bV9jb25uZWN0aW9uczogbnVtYmVyIG9mIGN1cnJlbnQgY29ubmVjdGlvbnMKKyAqCisgKiBXaGVuIGEgbmV3IGNvbm5lY3Rpb24gaXMgYWJvdXQgdG8gY29tZSB1cCBjaGVjayBpZiBjdXJyZW50CisgKiBjb25jdXJyZW5jeSBjb21iaW5hdGlvbiBpbmNsdWRpbmcgdGhlIG5ldyBjb25uZWN0aW9uIGlzCisgKiBhbGxvd2VkIG9yIG5vdCBiYXNlZCBvbiB0aGUgSFcgY2FwYWJpbGl0eQorICoKKyAqIFJldHVybjogVHJ1ZS9GYWxzZQorICovCitib29sIGNkc19hbGxvd19uZXdfaG9tZV9jaGFubmVsKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQl1aW50OF90IGNoYW5uZWwsIHVpbnQzMl90IG51bV9jb25uZWN0aW9ucykKK3sKKwlib29sIHN0YXR1cyA9IHRydWU7CisKKwlpZiAoKG51bV9jb25uZWN0aW9ucyA9PSAyKSAmJgorCQkoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbiAhPSBjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuKQorCQkmJgorCQkoY29uY19jb25uZWN0aW9uX2xpc3RbMF0ubWFjID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzFdLm1hYykpIHsKKwkJaWYgKHdtYV9pc19od19kYnNfY2FwYWJsZSgpID09IGZhbHNlKSB7CisJCQlpZiAoKGNoYW5uZWwgIT0gY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikgJiYKKwkJCQkoY2hhbm5lbCAhPSBjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuKSkgeworCQkJCS8qIGVyciBtc2cgKi8KKwkJCQljZHNfZXJyKCJkb24ndCBhbGxvdyAzcmQgaG9tZSBjaGFubmVsIG9uIHNhbWUgTUFDIik7CisJCQkJc3RhdHVzID0gZmFsc2U7CisJCQl9CisJCX0gZWxzZSBpZiAoKChDRFNfSVNfQ0hBTk5FTF8yNEdIWihjaGFubmVsKSkgJiYKKwkJCQkoQ0RTX0lTX0NIQU5ORUxfMjRHSFoKKwkJCQkoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikpICYmCisJCQkJKENEU19JU19DSEFOTkVMXzI0R0haCisJCQkJKGNvbmNfY29ubmVjdGlvbl9saXN0WzFdLmNoYW4pKSkgfHwKKwkJCQkgICAoKENEU19JU19DSEFOTkVMXzVHSFooY2hhbm5lbCkpICYmCisJCQkJKENEU19JU19DSEFOTkVMXzVHSFoKKwkJCQkoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikpICYmCisJCQkJKENEU19JU19DSEFOTkVMXzVHSFoKKwkJCQkoY29uY19jb25uZWN0aW9uX2xpc3RbMV0uY2hhbikpKSkgeworCQkJLyogZXJyIG1zZyAqLworCQkJY2RzX2VycigiZG9uJ3QgYWxsb3cgM3JkIGhvbWUgY2hhbm5lbCBvbiBzYW1lIE1BQyIpOworCQkJc3RhdHVzID0gZmFsc2U7CisJCX0KKyNpZm5kZWYgUUNBX1dJRklfM18wX0VNVQorCX0KKyNlbHNlCisJfSBlbHNlIGlmICgobnVtX2Nvbm5lY3Rpb25zID09IDEpICYmCisJCShjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuICE9IGNoYW5uZWwpKSB7CisJCWlmICgoKENEU19JU19DSEFOTkVMXzI0R0haKGNoYW5uZWwpKSAmJgorCQkJKENEU19JU19DSEFOTkVMXzI0R0haCisJCQkoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikpKSB8fAorCQkJICAgKChDRFNfSVNfQ0hBTk5FTF81R0haKGNoYW5uZWwpKSAmJgorCQkJKENEU19JU19DSEFOTkVMXzVHSFoKKwkJCShjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuKSkpKSB7CisJCQkvKiBlcnIgbXNnICovCisJCQljZHNfZXJyKCJkb24ndCBhbGxvdyAybmQgaG9tZSBjaGFubmVsIG9uIHNhbWUgTUFDIik7CisJCQlzdGF0dXMgPSBmYWxzZTsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY2RzX2FsbG93X2NvbmN1cnJlbmN5KCkgLSBDaGVjayBmb3IgYWxsb3dlZCBjb25jdXJyZW5jeQorICogY29tYmluYXRpb24KKyAqCisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqIEBtb2RlOgluZXcgY29ubmVjdGlvbiBtb2RlCisgKiBAY2hhbm5lbDogY2hhbm5lbCBvbiB3aGljaCBuZXcgY29ubmVjdGlvbiBpcyBjb21pbmcgdXAKKyAqIEBidzogQmFuZHdpZHRoIHJlcXVlc3RlZCBieSB0aGUgY29ubmVjdGlvbiAob3B0aW9uYWwpCisgKgorICogV2hlbiBhIG5ldyBjb25uZWN0aW9uIGlzIGFib3V0IHRvIGNvbWUgdXAgY2hlY2sgaWYgY3VycmVudAorICogY29uY3VycmVuY3kgY29tYmluYXRpb24gaW5jbHVkaW5nIHRoZSBuZXcgY29ubmVjdGlvbiBpcworICogYWxsb3dlZCBvciBub3QgYmFzZWQgb24gdGhlIEhXIGNhcGFiaWxpdHkKKyAqCisgKiBSZXR1cm46IFRydWUvRmFsc2UKKyAqLworYm9vbCBjZHNfYWxsb3dfY29uY3VycmVuY3koaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgZW51bSBjZHNfY29uX21vZGUgbW9kZSwKKwkJCQl1aW50OF90IGNoYW5uZWwsIGVudW0gaHdfbW9kZV9iYW5kd2lkdGggYncpCit7CisJdWludDMyX3QgbnVtX2Nvbm5lY3Rpb25zID0gMCwgY291bnQgPSAwLCBpbmRleCA9IDA7CisJYm9vbCBzdGF0dXMgPSBmYWxzZSwgbWF0Y2ggPSBmYWxzZTsKKwl1aW50MzJfdCBsaXN0W01BWF9OVU1CRVJfT0ZfQ09OQ19DT05ORUNUSU9OU107CisKKwljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2N0eC0+aGRkX2NvbmNfbGlzdF9sb2NrKTsKKwkvKiBmaW5kIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gc3RhdGUgZnJvbSBjb25jX2Nvbm5lY3Rpb25fbGlzdCovCisJbnVtX2Nvbm5lY3Rpb25zID0gY2RzX2dldF9jb25uZWN0aW9uX2NvdW50KGhkZF9jdHgpOworCisJaWYgKGNkc19tYXhfY29uY3VycmVudF9jb25uZWN0aW9uc19yZWFjaGVkKCkpIHsKKwkJY2RzX2VycigiUmVhY2hlZCBtYXggY29uY3VycmVudCBjb25uZWN0aW9uczogJWQiLAorCQkJaGRkX2N0eC0+Y29uZmlnLT5nTWF4Q29uY3VycmVudEFjdGl2ZVNlc3Npb25zKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCS8qIGRvbid0IGFsbG93IDNyZCBob21lIGNoYW5uZWwgb24gc2FtZSBNQUMgKi8KKwkJaWYgKCFjZHNfYWxsb3dfbmV3X2hvbWVfY2hhbm5lbChoZGRfY3R4LCBjaGFubmVsLAorCQkJbnVtX2Nvbm5lY3Rpb25zKSkKKwkJCQlnb3RvIGRvbmU7CisKKwkJLyogZG9uJ3QgYWxsb3cgTUNDIGlmIFNBUC9HTyBvbiBERlMgY2hhbm5lbCBvciBhYm91dCB0byBjb21lIHVwCisJCSogb24gREZTIGNoYW5uZWwKKwkJKi8KKwkJY291bnQgPSBjZHNfbW9kZV9zcGVjaWZpY19jb25uZWN0aW9uX2NvdW50KGhkZF9jdHgsCisJCQkJQ0RTX1AyUF9HT19NT0RFLCBsaXN0KTsKKwkJd2hpbGUgKGluZGV4IDwgY291bnQpIHsKKwkJCWlmICgoQ0RTX0lTX0RGU19DSCgKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtsaXN0W2luZGV4XV0uY2hhbikpICYmCisJCQkJKENEU19JU19DSEFOTkVMXzVHSFooY2hhbm5lbCkpICYmCisJCQkJKGNoYW5uZWwgIT0KKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtsaXN0W2luZGV4XV0uY2hhbikpIHsKKwkJCQkvKiBlcnIgbXNnICovCisJCQkJY2RzX2VycigiZG9uJ3QgYWxsb3cgTUNDIGlmIFNBUC9HTyBvbiBERlMgY2hhbm5lbCIpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWluZGV4Kys7CisJCX0KKworCQlpbmRleCA9IDA7CisJCWNvdW50ID0gY2RzX21vZGVfc3BlY2lmaWNfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4LAorCQkJCUNEU19TQVBfTU9ERSwgbGlzdCk7CisJCXdoaWxlIChpbmRleCA8IGNvdW50KSB7CisJCQlpZiAoKENEU19JU19ERlNfQ0goCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbbGlzdFtpbmRleF1dLmNoYW4pKSAmJgorCQkJCShDRFNfSVNfQ0hBTk5FTF81R0haKGNoYW5uZWwpKSAmJgorCQkJCShjaGFubmVsICE9CisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbbGlzdFtpbmRleF1dLmNoYW4pKSB7CisJCQkJLyogZXJyIG1zZyAqLworCQkJCWNkc19lcnIoImRvbid0IGFsbG93IE1DQyBpZiBTQVAvR08gb24gREZTIGNoYW5uZWwiKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlpbmRleCsrOworCQl9CisKKwkJaW5kZXggPSAwOworCQlpZiAoKENEU19QMlBfR09fTU9ERSA9PSBtb2RlKSB8fCAoQ0RTX1NBUF9NT0RFID09IG1vZGUpKSB7CisJCQlpZiAoQ0RTX0lTX0RGU19DSChjaGFubmVsKSkKKwkJCQltYXRjaCA9IGNkc19kaXNhbGxvd19tY2MoaGRkX2N0eCwgY2hhbm5lbCk7CisJCX0KKwkJaWYgKHRydWUgPT0gbWF0Y2gpIHsKKwkJCWNkc19lcnIoIk5vIE1DQywgU0FQL0dPIGFib3V0IHRvIGNvbWUgdXAgb24gREZTIGNoYW5uZWwiKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCS8qIGRvbid0IGFsbG93IElCU1MgKyBTVEEgTUNDICovCisJLyogZG9uJ3QgYWxsb3cgSUJTUyArIFNUQSBTQ0MgaWYgSUJTUyBpcyBvbiBERlMgY2hhbm5lbCAqLworCWNvdW50ID0gY2RzX21vZGVfc3BlY2lmaWNfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4LAorCQkJQ0RTX1NUQV9NT0RFLCBsaXN0KTsKKwlpZiAoKENEU19JQlNTX01PREUgPT0gbW9kZSkgJiYKKwkJKGNkc19tb2RlX3NwZWNpZmljX2Nvbm5lY3Rpb25fY291bnQoaGRkX2N0eCwKKwkJQ0RTX0lCU1NfTU9ERSwgbGlzdCkpICYmIGNvdW50KSB7CisJCS8qIGVyciBtc2cgKi8KKwkJY2RzX2VycigiTm8gMm5kIElCU1MsIHdlIGFscmVhZHkgaGF2ZSBTVEEgKyBJQlNTIik7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKChDRFNfSUJTU19NT0RFID09IG1vZGUpICYmCisJCShDRFNfSVNfREZTX0NIKGNoYW5uZWwpKSAmJiBjb3VudCkgeworCQkvKiBlcnIgbXNnICovCisJCWNkc19lcnIoIk5vIElCU1MgKyBTVEEgU0NDL01DQywgSUJTUyBpcyBvbiBERlMgY2hhbm5lbCIpOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChDRFNfSUJTU19NT0RFID09IG1vZGUpIHsKKwkJaWYgKHdtYV9pc19od19kYnNfY2FwYWJsZSgpID09IHRydWUpIHsKKwkJCWlmIChudW1fY29ubmVjdGlvbnMgPiAxKSB7CisJCQkJLyogZXJyIG1zZyAqLworCQkJCWNkc19lcnIoIk5vIElCU1MsIHdlIGhhdmUgY29uY3VycmVudCBjb25uZWN0aW9ucyBhbHJlYWR5Iik7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJaWYgKENEU19TVEFfTU9ERSAhPSBjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tb2RlKSB7CisJCQkJLyogZXJyIG1zZyAqLworCQkJCWNkc19lcnIoIk5vIElCU1MsIHdlIGhhdmUgYSBub24gU1RBIGNvbm5lY3Rpb24iKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlpZiAoY2hhbm5lbCAmJgorCQkJCShjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuICE9IGNoYW5uZWwpICYmCisJCQkJQ0RTX0lTX1NBTUVfQkFORF9DSEFOTkVMUygKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuLCBjaGFubmVsKSkgeworCQkJCS8qIGVyciBtc2cgKi8KKwkJCQljZHNfZXJyKCJObyBJQlNTICsgU1RBIE1DQyIpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfSBlbHNlIGlmIChudW1fY29ubmVjdGlvbnMpIHsKKwkJCS8qIGVyciBtc2cgKi8KKwkJCWNkc19lcnIoIk5vIElCU1MsIHdlIGhhdmUgb25lIGNvbm5lY3Rpb24gYWxyZWFkeSIpOworCQkJZ290byBkb25lOworCQl9CisJfQorCWNvdW50ID0gY2RzX21vZGVfc3BlY2lmaWNfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4LAorCQkJQ0RTX1NUQV9NT0RFLCBsaXN0KTsKKwlpZiAoKENEU19TVEFfTU9ERSA9PSBtb2RlKSAmJgorCQkoY2RzX21vZGVfc3BlY2lmaWNfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4LAorCQlDRFNfSUJTU19NT0RFLCBsaXN0KSkgJiYgY291bnQpIHsKKwkJLyogZXJyIG1zZyAqLworCQljZHNfZXJyKCJObyAybmQgU1RBLCB3ZSBhbHJlYWR5IGhhdmUgU1RBICsgSUJTUyIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChDRFNfU1RBX01PREUgPT0gbW9kZSkgJiYKKwkJKGNkc19tb2RlX3NwZWNpZmljX2Nvbm5lY3Rpb25fY291bnQoaGRkX2N0eCwKKwkJQ0RTX0lCU1NfTU9ERSwgbGlzdCkpKSB7CisJCWlmICh3bWFfaXNfaHdfZGJzX2NhcGFibGUoKSA9PSB0cnVlKSB7CisJCQlpZiAobnVtX2Nvbm5lY3Rpb25zID4gMSkgeworCQkJCS8qIGVyciBtc2cgKi8KKwkJCQljZHNfZXJyKCJObyAybmQgU1RBLCB3ZSBhbHJlYWR5IGhhdmUgSUJTUyBjb25jdXJyZW5jeSIpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWlmIChjaGFubmVsICYmCisJCQkJKENEU19JU19ERlNfQ0goY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikpCisJCQkJJiYgKENEU19JU19DSEFOTkVMXzVHSFooY2hhbm5lbCkpKSB7CisJCQkJLyogZXJyIG1zZyAqLworCQkJCWNkc19lcnIoIk5vIElCU1MgKyBTVEEgU0NDL01DQywgSUJTUyBpcyBvbiBERlMgY2hhbm5lbCIpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWlmICgoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbiAhPSBjaGFubmVsKSAmJgorCQkJCUNEU19JU19TQU1FX0JBTkRfQ0hBTk5FTFMoCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbiwgY2hhbm5lbCkpIHsKKwkJCQkvKiBlcnIgbXNnICovCisJCQkJY2RzX2VycigiTm8gSUJTUyArIFNUQSBNQ0MiKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBlcnIgbXNnICovCisJCQljZHNfZXJyKCJObyBTVEEsIHdlIGhhdmUgSUJTUyBjb25uZWN0aW9uIGFscmVhZHkiKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCS8qIGNhbiB3ZSBhbGxvdyB2aHQxNjAgKi8KKwlpZiAobnVtX2Nvbm5lY3Rpb25zICYmCisJCSgoYncgPT0gSFdfTU9ERV84MF9QTFVTXzgwX01IWikgfHwgKGJ3ID09IEhXX01PREVfMTYwX01IWikpKSB7CisJCS8qIGVyciBtc2cgKi8KKwkJY2RzX2VycigiTm8gVkhUMTYwLCB3ZSBoYXZlIG9uZSBjb25uZWN0aW9uIGFscmVhZHkiKTsKKwkJZ290byBkb25lOworCX0KKwlzdGF0dXMgPSB0cnVlOworCitkb25lOgorCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfY3R4LT5oZGRfY29uY19saXN0X2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY2RzX2dldF9maXJzdF9jb25uZWN0aW9uX3BjbF90YWJsZV9pbmRleCgpIC0gcHJvdmlkZXMgdGhlCisgKiByb3cgaW5kZXggdG8gZmlyc3RDb25uZWN0aW9uUGNsVGFibGUgdG8gZ2V0IHRvIHRoZSBjb3JyZWN0CisgKiBwY2wKKyAqIEBoZGRfY3R4OglIREQgQ29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIHJvdyBpbmRleCB0bworICogZmlyc3RDb25uZWN0aW9uUGNsVGFibGUuIFRoZSBpbmRleCBpcyB0aGUgcHJlZmVyZW5jZSBjb25maWcuCisgKgorICogUmV0dXJuOiB0YWJsZSBpbmRleAorICovCitlbnVtIGNkc19jb25jX3ByaW9yaXR5X21vZGUgY2RzX2dldF9maXJzdF9jb25uZWN0aW9uX3BjbF90YWJsZV9pbmRleCgKKwkJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlpZiAoaGRkX2N0eC0+Y29uZmlnLT5jb25jX3N5c3RlbV9wcmVmID49IENEU19NQVhfQ09OQ19QUklPUklUWV9NT0RFKQorCQlyZXR1cm4gQ0RTX1RIUk9VR0hQVVQ7CisJcmV0dXJuIGhkZF9jdHgtPmNvbmZpZy0+Y29uY19zeXN0ZW1fcHJlZjsKK30KKworLyoqCisgKiBjZHNfZ2V0X3NlY29uZF9jb25uZWN0aW9uX3BjbF90YWJsZV9pbmRleCgpIC0gcHJvdmlkZXMgdGhlCisgKiByb3cgaW5kZXggdG8gc2Vjb25kQ29ubmVjdGlvblBjbFRhYmxlIHRvIGdldCB0byB0aGUgY29ycmVjdAorICogcGNsCisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSByb3cgaW5kZXggdG8KKyAqIHNlY29uZENvbm5lY3Rpb25QY2xUYWJsZS4gVGhlIGluZGV4IGlzIGRlcml2ZWQgYmFzZWQgb24KKyAqIGN1cnJlbnQgY29ubmVjdGlvbiwgYmFuZCBvbiB3aGljaCBpdCBpcyBvbiAmIGNoYWluIG1hc2sgaXQgaXMKKyAqIHVzaW5nLCBhcyBvYnRhaW5lZCBmcm9tIGNvbmNfY29ubmVjdGlvbl9saXN0LgorICoKKyAqIFJldHVybjogdGFibGUgaW5kZXgKKyAqLworZW51bSBjZHNfb25lX2Nvbm5lY3Rpb25fbW9kZSBjZHNfZ2V0X3NlY29uZF9jb25uZWN0aW9uX3BjbF90YWJsZV9pbmRleCgKKwkJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwllbnVtIGNkc19vbmVfY29ubmVjdGlvbl9tb2RlIGluZGV4ID0gQ0RTX01BWF9PTkVfQ09OTkVDVElPTl9NT0RFOworCisJaWYgKENEU19TVEFfTU9ERSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tb2RlKSB7CisJCWlmIChDRFNfSVNfQ0hBTk5FTF8yNEdIWihjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuKSkgeworCQkJaWYgKENEU19PTkVfT05FID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYWluX21hc2spCisJCQkJaW5kZXggPSBDRFNfU1RBXzI0XzF4MTsKKwkJCWVsc2UKKwkJCQlpbmRleCA9IENEU19TVEFfMjRfMngyOworCQl9IGVsc2UgeworCQkJaWYgKENEU19PTkVfT05FID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYWluX21hc2spCisJCQkJaW5kZXggPSBDRFNfU1RBXzVfMXgxOworCQkJZWxzZQorCQkJCWluZGV4ID0gQ0RTX1NUQV81XzJ4MjsKKwkJfQorCX0gZWxzZSBpZiAoQ0RTX1NBUF9NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1vZGUpIHsKKwkJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4pKSB7CisJCQlpZiAoQ0RTX09ORV9PTkUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQlpbmRleCA9IENEU19TQVBfMjRfMXgxOworCQkJZWxzZQorCQkJCWluZGV4ID0gQ0RTX1NBUF8yNF8yeDI7CisJCX0gZWxzZSB7CisJCQlpZiAoQ0RTX09ORV9PTkUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQlpbmRleCA9IENEU19TQVBfNV8xeDE7CisJCQllbHNlCisJCQkJaW5kZXggPSBDRFNfU0FQXzVfMngyOworCQl9CisJfSBlbHNlIGlmIChDRFNfUDJQX0NMSUVOVF9NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1vZGUpIHsKKwkJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4pKSB7CisJCQlpZiAoQ0RTX09ORV9PTkUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQlpbmRleCA9IENEU19QMlBfQ0xJXzI0XzF4MTsKKwkJCWVsc2UKKwkJCQlpbmRleCA9IENEU19QMlBfQ0xJXzI0XzJ4MjsKKwkJfSBlbHNlIHsKKwkJCWlmIChDRFNfT05FX09ORSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCWluZGV4ID0gQ0RTX1AyUF9DTElfNV8xeDE7CisJCQllbHNlCisJCQkJaW5kZXggPSBDRFNfUDJQX0NMSV81XzJ4MjsKKwkJfQorCX0gZWxzZSBpZiAoQ0RTX1AyUF9HT19NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1vZGUpIHsKKwkJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4pKSB7CisJCQlpZiAoQ0RTX09ORV9PTkUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQlpbmRleCA9IENEU19QMlBfR09fMjRfMXgxOworCQkJZWxzZQorCQkJCWluZGV4ID0gQ0RTX1AyUF9HT18yNF8yeDI7CisJCX0gZWxzZSB7CisJCQlpZiAoQ0RTX09ORV9PTkUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQlpbmRleCA9IENEU19QMlBfR09fNV8xeDE7CisJCQllbHNlCisJCQkJaW5kZXggPSBDRFNfUDJQX0dPXzVfMngyOworCQl9CisJfSBlbHNlIGlmIChDRFNfSUJTU19NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1vZGUpIHsKKwkJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4pKSB7CisJCQlpZiAoQ0RTX09ORV9PTkUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQlpbmRleCA9IENEU19JQlNTXzI0XzF4MTsKKwkJCWVsc2UKKwkJCQlpbmRleCA9IENEU19JQlNTXzI0XzJ4MjsKKwkJfSBlbHNlIHsKKwkJCWlmIChDRFNfT05FX09ORSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCWluZGV4ID0gQ0RTX0lCU1NfNV8xeDE7CisJCQllbHNlCisJCQkJaW5kZXggPSBDRFNfSUJTU181XzJ4MjsKKwkJfQorCX0KKworCWNkc19kZWJ1ZygibW9kZTolZCBjaGFuOiVkIGNoYWluOiVkIGluZGV4OiVkIiwKKwkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0ubW9kZSwgY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbiwKKwkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaywgaW5kZXgpOworCisJcmV0dXJuIGluZGV4OworfQorCisvKioKKyAqIGNkc19nZXRfdGhpcmRfY29ubmVjdGlvbl9wY2xfdGFibGVfaW5kZXgoKSAtIHByb3ZpZGVzIHRoZQorICogcm93IGluZGV4IHRvIHRoaXJkQ29ubmVjdGlvblBjbFRhYmxlIHRvIGdldCB0byB0aGUgY29ycmVjdAorICogcGNsCisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSByb3cgaW5kZXggdG8KKyAqIHRoaXJkQ29ubmVjdGlvblBjbFRhYmxlLiBUaGUgaW5kZXggaXMgZGVyaXZlZCBiYXNlZCBvbgorICogY3VycmVudCBjb25uZWN0aW9uLCBiYW5kIG9uIHdoaWNoIGl0IGlzIG9uICYgY2hhaW4gbWFzayBpdCBpcworICogdXNpbmcsIGFzIG9idGFpbmVkIGZyb20gY29uY19jb25uZWN0aW9uX2xpc3QuCisgKgorICogUmV0dXJuOiB0YWJsZSBpbmRleAorICovCitlbnVtIGNkc190d29fY29ubmVjdGlvbl9tb2RlIGNkc19nZXRfdGhpcmRfY29ubmVjdGlvbl9wY2xfdGFibGVfaW5kZXgoCisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwllbnVtIGNkc19vbmVfY29ubmVjdGlvbl9tb2RlIGluZGV4ID0gQ0RTX01BWF9UV09fQ09OTkVDVElPTl9NT0RFOworCisJLyogU1RBICsgU0FQICovCisJaWYgKCgoQ0RTX1NUQV9NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1vZGUpICYmCisJCShDRFNfU0FQX01PREUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMV0ubW9kZSkpIHx8CisJCSgoQ0RTX1NBUF9NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1vZGUpICYmCisJCShDRFNfU1RBX01PREUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMV0ubW9kZSkpKSB7CisJCS8qIFNDQyAqLworCQlpZiAoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbiA9PQorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMV0uY2hhbikgeworCQkJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKAorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4pKSB7CisJCQkJaWYgKENEU19PTkVfT05FID09CisJCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYWluX21hc2spCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9TQVBfU0NDXzI0XzF4MTsKKwkJCQllbHNlCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9TQVBfU0NDXzI0XzJ4MjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKENEU19PTkVfT05FID09CisJCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYWluX21hc2spCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9TQVBfU0NDXzVfMXgxOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1NBUF9TQ0NfNV8yeDI7CisJCQl9CisJCS8qIE1DQyAqLworCQl9IGVsc2UgaWYgKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1hYyA9PQorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzFdLm1hYykgeworCQkJaWYgKChDRFNfSVNfQ0hBTk5FTF8yNEdIWgorCQkJCShjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuKSkgJiYKKwkJCQkoQ0RTX0lTX0NIQU5ORUxfMjRHSFoKKwkJCQkoY29uY19jb25uZWN0aW9uX2xpc3RbMV0uY2hhbikpKSB7CisJCQkJaWYgKENEU19PTkVfT05FID09CisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1NBUF9NQ0NfMjRfMXgxOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1NBUF9NQ0NfMjRfMngyOworCQkJfSBlbHNlIGlmICgoQ0RTX0lTX0NIQU5ORUxfNUdIWigKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuKSkgJiYKKwkJCQkoQ0RTX0lTX0NIQU5ORUxfNUdIWigKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuKSkpIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCQlpbmRleCA9IENEU19TVEFfU0FQX01DQ181XzF4MTsKKwkJCQllbHNlCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9TQVBfTUNDXzVfMngyOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCQlpbmRleCA9IENEU19TVEFfU0FQX01DQ18yNF81XzF4MTsKKwkJCQllbHNlCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9TQVBfTUNDXzI0XzVfMngyOworCQkJfQorCQkvKiBEQlMgKi8KKwkJfSBlbHNlCisJCQlpbmRleCA9IENEU19TVEFfU0FQX0RCU18xeDE7CisJfSBlbHNlICAgIC8qIFNUQSArIFAyUCBHTyAqLworCWlmICgoKENEU19TVEFfTU9ERSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tb2RlKSAmJgorCQkoQ0RTX1AyUF9HT19NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzFdLm1vZGUpKSB8fAorCQkoKENEU19QMlBfR09fTU9ERSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tb2RlKSAmJgorCQkoQ0RTX1NUQV9NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzFdLm1vZGUpKSkgeworCQkvKiBTQ0MgKi8KKwkJaWYgKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4gPT0KKwkJY29uY19jb25uZWN0aW9uX2xpc3RbMV0uY2hhbikgeworCQkJaWYgKENEU19JU19DSEFOTkVMXzI0R0haCisJCQkJKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4pKSB7CisJCQkJaWYgKENEU19PTkVfT05FID09CisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9HT19TQ0NfMjRfMXgxOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9HT19TQ0NfMjRfMngyOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCQlpbmRleCA9IENEU19TVEFfUDJQX0dPX1NDQ181XzF4MTsKKwkJCQllbHNlCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9QMlBfR09fU0NDXzVfMngyOworCQkJfQorCQkvKiBNQ0MgKi8KKwkJfSBlbHNlIGlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tYWMgPT0KKwkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzFdLm1hYykgeworCQkJaWYgKChDRFNfSVNfQ0hBTk5FTF8yNEdIWigKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuKSkgJiYKKwkJCQkoQ0RTX0lTX0NIQU5ORUxfMjRHSFoKKwkJCQkoY29uY19jb25uZWN0aW9uX2xpc3RbMV0uY2hhbikpKSB7CisJCQkJaWYgKENEU19PTkVfT05FID09CisJCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYWluX21hc2spCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9QMlBfR09fTUNDXzI0XzF4MTsKKwkJCQllbHNlCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9QMlBfR09fTUNDXzI0XzJ4MjsKKwkJCX0gZWxzZSBpZiAoKENEU19JU19DSEFOTkVMXzVHSFooCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikpICYmCisJCQkJKENEU19JU19DSEFOTkVMXzVHSFooCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMV0uY2hhbikpKSB7CisJCQkJaWYgKENEU19PTkVfT05FID09CisJCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYWluX21hc2spCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9QMlBfR09fTUNDXzVfMXgxOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9HT19NQ0NfNV8yeDI7CisJCQl9IGVsc2UgeworCQkJCWlmIChDRFNfT05FX09ORSA9PQorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYWluX21hc2spCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9QMlBfR09fTUNDXzI0XzVfMXgxOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9HT19NQ0NfMjRfNV8yeDI7CisJCQl9CisJCS8qIERCUyAqLworCQl9IGVsc2UKKwkJCWluZGV4ID0gQ0RTX1NUQV9QMlBfR09fREJTXzF4MTsKKwl9IGVsc2UgICAgLyogU1RBICsgUDJQIENMSSAqLworCWlmICgoKENEU19TVEFfTU9ERSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tb2RlKSAmJgorCQkoQ0RTX1AyUF9DTElFTlRfTU9ERSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5tb2RlKSkgfHwKKwkJKChDRFNfUDJQX0NMSUVOVF9NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1vZGUpICYmCisJCShDRFNfU1RBX01PREUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMV0ubW9kZSkpKSB7CisJCS8qIFNDQyAqLworCQlpZiAoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbiA9PQorCQljb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuKSB7CisJCQlpZiAoQ0RTX0lTX0NIQU5ORUxfMjRHSFoKKwkJCQkoY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikpIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCQlpbmRleCA9IENEU19TVEFfUDJQX0NMSV9TQ0NfMjRfMXgxOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9DTElfU0NDXzI0XzJ4MjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKENEU19PTkVfT05FID09CisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9DTElfU0NDXzVfMXgxOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9DTElfU0NDXzVfMngyOworCQkJfQorCQkvKiBNQ0MgKi8KKwkJfSBlbHNlIGlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tYWMgPT0KKwkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzFdLm1hYykgeworCQkJaWYgKChDRFNfSVNfQ0hBTk5FTF8yNEdIWigKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuKSkgJiYKKwkJCQkoQ0RTX0lTX0NIQU5ORUxfMjRHSFooCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMV0uY2hhbikpKSB7CisJCQkJaWYgKENEU19PTkVfT05FID09CisJCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYWluX21hc2spCisJCQkJCWluZGV4ID0gQ0RTX1NUQV9QMlBfQ0xJX01DQ18yNF8xeDE7CisJCQkJZWxzZQorCQkJCQlpbmRleCA9IENEU19TVEFfUDJQX0NMSV9NQ0NfMjRfMngyOworCQkJfSBlbHNlIGlmICgoQ0RTX0lTX0NIQU5ORUxfNUdIWigKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuKSkgJiYKKwkJCQkoQ0RTX0lTX0NIQU5ORUxfNUdIWigKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuKSkpIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9DTElfTUNDXzVfMXgxOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9DTElfTUNDXzVfMngyOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9DTElfTUNDXzI0XzVfMXgxOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBDRFNfU1RBX1AyUF9DTElfTUNDXzI0XzVfMngyOworCQkJfQorCQkvKiBEQlMgKi8KKwkJfSBlbHNlCisJCQlpbmRleCA9IENEU19TVEFfUDJQX0NMSV9EQlNfMXgxOworCX0gZWxzZSAgICAvKiBQMlAgR08gKyBQMlAgQ0xJICovCisJaWYgKCgoQ0RTX1AyUF9HT19NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1vZGUpICYmCisJCShDRFNfUDJQX0NMSUVOVF9NT0RFID09IGNvbmNfY29ubmVjdGlvbl9saXN0WzFdLm1vZGUpKSB8fAorCQkoKENEU19QMlBfQ0xJRU5UX01PREUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMF0ubW9kZSkgJiYKKwkJKENEU19QMlBfR09fTU9ERSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5tb2RlKSkpIHsKKwkJLyogU0NDICovCisJCWlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuID09CisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuKSB7CisJCQlpZiAoQ0RTX0lTX0NIQU5ORUxfMjRHSFooCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikpIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQkJaW5kZXggPSBDRFNfUDJQX0dPX1AyUF9DTElfU0NDXzI0XzF4MTsKKwkJCQllbHNlCisJCQkJCWluZGV4ID0gQ0RTX1AyUF9HT19QMlBfQ0xJX1NDQ18yNF8yeDI7CisJCQl9IGVsc2UgeworCQkJCWlmIChDRFNfT05FX09ORSA9PQorCQkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fUDJQX0NMSV9TQ0NfNV8xeDE7CisJCQkJZWxzZQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fUDJQX0NMSV9TQ0NfNV8yeDI7CisJCQl9CisJCS8qIE1DQyAqLworCQl9IGVsc2UgaWYgKGNvbmNfY29ubmVjdGlvbl9saXN0WzBdLm1hYyA9PQorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMV0ubWFjKSB7CisJCQlpZiAoKENEU19JU19DSEFOTkVMXzI0R0haKAorCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikpICYmCisJCQkoQ0RTX0lTX0NIQU5ORUxfMjRHSFooCisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuKSkpIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQkJaW5kZXggPSBDRFNfUDJQX0dPX1AyUF9DTElfTUNDXzI0XzF4MTsKKwkJCQllbHNlCisJCQkJCWluZGV4ID0gQ0RTX1AyUF9HT19QMlBfQ0xJX01DQ18yNF8yeDI7CisJCQl9IGVsc2UgaWYgKChDRFNfSVNfQ0hBTk5FTF81R0haKAorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4pKSAmJgorCQkJCShDRFNfSVNfQ0hBTk5FTF81R0haKAorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzFdLmNoYW4pKSkgeworCQkJCWlmIChDRFNfT05FX09ORSA9PQorCQkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fUDJQX0NMSV9NQ0NfNV8xeDE7CisJCQkJZWxzZQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fUDJQX0NMSV9NQ0NfNV8yeDI7CisJCQl9IGVsc2UgeworCQkJCWlmIChDRFNfT05FX09ORSA9PQorCQkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fUDJQX0NMSV9NQ0NfMjRfNV8xeDE7CisJCQkJZWxzZQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fUDJQX0NMSV9NQ0NfMjRfNV8yeDI7CisJCQl9CisJCS8qIERCUyAqLworCQl9IGVsc2UKKwkJCWluZGV4ID0gQ0RTX1AyUF9HT19QMlBfQ0xJX0RCU18xeDE7CisJfSBlbHNlICAgIC8qIFNUQSArIFAyUCBDTEkgKi8KKwlpZiAoKChDRFNfU0FQX01PREUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMF0ubW9kZSkgJiYKKwkJKENEU19QMlBfR09fTU9ERSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5tb2RlKSkgfHwKKwkJKChDRFNfUDJQX0dPX01PREUgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbMF0ubW9kZSkgJiYKKwkJKENEU19TQVBfTU9ERSA9PSBjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5tb2RlKSkpIHsKKwkJLyogU0NDICovCisJCWlmIChjb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuID09CisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuKSB7CisJCQlpZiAoQ0RTX0lTX0NIQU5ORUxfMjRHSFooCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikpIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQkJaW5kZXggPSBDRFNfUDJQX0dPX1NBUF9TQ0NfMjRfMXgxOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBDRFNfUDJQX0dPX1NBUF9TQ0NfMjRfMngyOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQkJaW5kZXggPSBDRFNfUDJQX0dPX1NBUF9TQ0NfNV8xeDE7CisJCQkJZWxzZQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fU0FQX1NDQ181XzJ4MjsKKwkJCX0KKwkJLyogTUNDICovCisJCX0gZWxzZSBpZiAoY29uY19jb25uZWN0aW9uX2xpc3RbMF0ubWFjID09CisJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5tYWMpIHsKKwkJCWlmICgoQ0RTX0lTX0NIQU5ORUxfMjRHSFooCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhbikpICYmCisJCQkJKENEU19JU19DSEFOTkVMXzI0R0haKAorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzFdLmNoYW4pKSkgeworCQkJCWlmIChDRFNfT05FX09ORSA9PQorCQkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fU0FQX01DQ18yNF8xeDE7CisJCQkJZWxzZQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fU0FQX01DQ18yNF8yeDI7CisJCQl9IGVsc2UgaWYgKChDRFNfSVNfQ0hBTk5FTF81R0haKAorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzBdLmNoYW4pKSAmJgorCQkJCShDRFNfSVNfQ0hBTk5FTF81R0haKAorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0WzFdLmNoYW4pKSkgeworCQkJCWlmIChDRFNfT05FX09ORSA9PQorCQkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrKQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fU0FQX01DQ181XzF4MTsKKwkJCQllbHNlCisJCQkJCWluZGV4ID0gQ0RTX1AyUF9HT19TQVBfTUNDXzVfMngyOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoQ0RTX09ORV9PTkUgPT0KKwkJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbMF0uY2hhaW5fbWFzaykKKwkJCQkJaW5kZXggPSBDRFNfUDJQX0dPX1NBUF9NQ0NfMjRfNV8xeDE7CisJCQkJZWxzZQorCQkJCQlpbmRleCA9IENEU19QMlBfR09fU0FQX01DQ18yNF81XzJ4MjsKKwkJCX0KKwkJLyogREJTICovCisJCX0gZWxzZQorCQkJaW5kZXggPSBDRFNfUDJQX0dPX1NBUF9EQlNfMXgxOworCX0KKworCWNkc19kZWJ1ZygibW9kZTA6JWQgbW9kZTE6JWQgY2hhbjA6JWQgY2hhbjE6JWQgY2hhaW46JWQgaW5kZXg6JWQiLAorCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5tb2RlLCBjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5tb2RlLAorCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFuLCBjb25jX2Nvbm5lY3Rpb25fbGlzdFsxXS5jaGFuLAorCQljb25jX2Nvbm5lY3Rpb25fbGlzdFswXS5jaGFpbl9tYXNrLCBpbmRleCk7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKKy8qKgorICogY2RzX21vZGVfc3dpdGNoX2Ric190b19tY2MoKSAtIGluaXRpYXRlcyBhIG1vZGUgc3dpdGNoCisgKiBmcm9tIERCUyB0byBNQ0MKKyAqIEBoZGRfY3R4OglIREQgQ29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIGEgbW9kZSBzd2l0Y2ggZnJvbSBEQlMgdG8gTUNDIGlmIGFueQorICogY2hhbmdlIGluIGNvbmN1cnJlbmN5IHNjZW5hcmlvIG9yIHNvbWUgb3RoZXIgZXh0ZXJuYWwgZW50aXR5CisgKiAobG9va2luZyBmb3IgcmFuZ2UsIHRoZXJtYWwgbWl0aWdhdGlvbiBldGMuKSBtYWRlIGFuIGV4cGxpY2l0CisgKiByZXF1ZXN0LiBOb3RpZmllcyBGVyBhcyB3ZWxsCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW0KKyAqLworQ0RGX1NUQVRVUyBjZHNfbW9kZV9zd2l0Y2hfZGJzX3RvX21jYyhoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RzX21vZGVfc3dpdGNoX21jY190b19kYnMoKSAtIGluaXRpYXRlcyBhIG1vZGUgc3dpdGNoCisgKiBmcm9tIE1DQyB0byBEQlMKKyAqIEBoZGRfY3R4OglIREQgQ29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIGEgbW9kZSBzd2l0Y2ggZnJvbSBNQ0MgdG8gREJTIGlmIGFueQorICogY2hhbmdlIGluIGNvbmN1cnJlbmN5IHNjZW5hcmlvIG9yIHNvbWUgb3RoZXIgZXh0ZXJuYWwgZW50aXR5CisgKiAocG93ZXJzYXZlLCB0aGVybWFsIG1pdGlnYXRpb24gZXRjLikgbWFkZSBhbiBleHBsaWNpdAorICogcmVxdWVzdC4gTm90aWZpZXMgRlcgYXMgd2VsbAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtCisgKi8KK0NERl9TVEFUVVMgY2RzX21vZGVfc3dpdGNoX21jY190b19kYnMoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkc19jdXJyZW50X2Nvbm5lY3Rpb25zX3VwZGF0ZSgpIC0gaW5pdGlhdGVzIGFjdGlvbnMKKyAqIG5lZWRlZCBvbiBjdXJyZW50IGNvbm5lY3Rpb25zIG9uY2UgY2hhbm5lbCBoYXMgYmVlbiBkZWNpZGVkCisgKiBmb3IgdGhlIG5ldyBjb25uZWN0aW9uCisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqIEBjaGFubmVsOiBDaGFubmVsIG9uIHdoaWNoIG5ldyBjb25uZWN0aW9uIHdpbGwgYmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBpbml0aWF0ZXMgYWN0aW9ucworICogbmVlZGVkIG9uIGN1cnJlbnQgY29ubmVjdGlvbnMgb25jZSBjaGFubmVsIGhhcyBiZWVuIGRlY2lkZWQKKyAqIGZvciB0aGUgbmV3IGNvbm5lY3Rpb24uIE5vdGlmaWVzIFVNQUMgJiBGVyBhcyB3ZWxsCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW0KKyAqLworQ0RGX1NUQVRVUyBjZHNfY3VycmVudF9jb25uZWN0aW9uc191cGRhdGUoCisJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQl1aW50OF90IGNoYW5uZWwpCit7CisJZW51bSBjZHNfY29uY19uZXh0X2FjdGlvbiBuZXh0X2FjdGlvbiA9IENEU19OT1A7CisJdWludDMyX3QgbnVtX2Nvbm5lY3Rpb25zID0gMDsKKwllbnVtIGNkc19vbmVfY29ubmVjdGlvbl9tb2RlIHNlY29uZF9pbmRleCA9IDA7CisJZW51bSBjZHNfdHdvX2Nvbm5lY3Rpb25fbW9kZSB0aGlyZF9pbmRleCA9IDA7CisJZW51bSBjZHNfYmFuZCBiYW5kOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAod21hX2lzX2h3X2Ric19jYXBhYmxlKCkgPT0gZmFsc2UpIHsKKwkJY2RzX2VycigiZHJpdmVyIGlzbid0IGRicyBjYXBhYmxlLCBubyBmdXJ0aGVyIGFjdGlvbiBuZWVkZWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT1NVUFBPUlQ7CisJfQorCWlmIChDRFNfSVNfQ0hBTk5FTF8yNEdIWihjaGFubmVsKSkKKwkJYmFuZCA9IENEU19CQU5EXzI0OworCWVsc2UKKwkJYmFuZCA9IENEU19CQU5EXzU7CisKKwljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2N0eC0+aGRkX2NvbmNfbGlzdF9sb2NrKTsKKwludW1fY29ubmVjdGlvbnMgPSBjZHNfZ2V0X2Nvbm5lY3Rpb25fY291bnQoaGRkX2N0eCk7CisKKwljZHNfZGVidWcoIm51bV9jb25uZWN0aW9ucz0lZCBjaGFubmVsPSVkIiwKKwkJbnVtX2Nvbm5lY3Rpb25zLCBjaGFubmVsKTsKKworCXN3aXRjaCAobnVtX2Nvbm5lY3Rpb25zKSB7CisJY2FzZSAwOgorCQluZXh0X2FjdGlvbiA9IENEU19OT1A7CisjaWZkZWYgUUNBX1dJRklfM18wX0VNVQorCQkvKiBGb3IgZW11bGF0aW9uIG9ubHk6IGlmIGl0IGlzIGEgY29ubmVjdGlvbiBvbiAyLjQsCisJCSAqIHJlcXVlc3QgREJTCisJCSAqLworCQlpZiAoQ0RTX0lTX0NIQU5ORUxfMjRHSFooY2hhbm5lbCkpCisJCQluZXh0X2FjdGlvbiA9IENEU19EQlM7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzZWNvbmRfaW5kZXggPQorCQkJY2RzX2dldF9zZWNvbmRfY29ubmVjdGlvbl9wY2xfdGFibGVfaW5kZXgoaGRkX2N0eCk7CisJCWlmIChDRFNfTUFYX09ORV9DT05ORUNUSU9OX01PREUgPT0gc2Vjb25kX2luZGV4KSB7CisJCQkvKiBlcnIgbXNnICovCisJCQljZHNfZXJyKCJjb3VsZG4ndCBmaW5kIGluZGV4IGZvciAybmQgY29ubmVjdGlvbiBuZXh0IGFjdGlvbiB0YWJsZSIpOworCQkJZ290byBkb25lOworCQl9CisJCW5leHRfYWN0aW9uID0KKwkJCW5leHRfYWN0aW9uX3R3b19jb25uZWN0aW9uX3RhYmxlW3NlY29uZF9pbmRleF1bYmFuZF07CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdGhpcmRfaW5kZXggPQorCQkJY2RzX2dldF90aGlyZF9jb25uZWN0aW9uX3BjbF90YWJsZV9pbmRleChoZGRfY3R4KTsKKwkJaWYgKENEU19NQVhfVFdPX0NPTk5FQ1RJT05fTU9ERSA9PSB0aGlyZF9pbmRleCkgeworCQkJLyogZXJyIG1zZyAqLworCQkJY2RzX2VycigiY291bGRuJ3QgZmluZCBpbmRleCBmb3IgM3JkIGNvbm5lY3Rpb24gbmV4dCBhY3Rpb24gdGFibGUiKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQluZXh0X2FjdGlvbiA9CisJCQluZXh0X2FjdGlvbl90aHJlZV9jb25uZWN0aW9uX3RhYmxlW3RoaXJkX2luZGV4XVtiYW5kXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZXJyIG1zZyAqLworCQljZHNfZXJyKCJ1bmV4cGVjdGVkIG51bV9jb25uZWN0aW9ucyB2YWx1ZSAlZCIsIG51bV9jb25uZWN0aW9ucyk7CisJCWJyZWFrOworCX0KKworCWlmIChDRFNfTk9QICE9IG5leHRfYWN0aW9uKQorCQlzdGF0dXMgPSBjZHNfbmV4dF9hY3Rpb25zKGhkZF9jdHgsIG5leHRfYWN0aW9uKTsKKwllbHNlCisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT1NVUFBPUlQ7CisKKwljZHNfZGVidWcoImluZGV4Mj0lZCBpbmRleDM9JWQgbmV4dF9hY3Rpb249JWQsIGJhbmQ9JWQgc3RhdHVzPSVkIiwKKwkJc2Vjb25kX2luZGV4LCB0aGlyZF9pbmRleCwgbmV4dF9hY3Rpb24sIGJhbmQsIHN0YXR1cyk7CisKK2RvbmU6CisJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9jdHgtPmhkZF9jb25jX2xpc3RfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjZHNfd2FpdF9mb3JfbnNzX3VwZGF0ZSgpIC0gZmluZHMgb3V0IGlmIHdlIG5lZWQgdG8gd2FpdAorICogZm9yIGFsbCBuc3MgdXBkYXRlIHRvIGZpbmlzaCBiZWZvcmUgcmVxdWVzdGluZyBmb3IgSFcgbW9kZQorICogdXBkYXRlCisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqIEBhY3Rpb246IG5leHQgYWN0aW9uIHRvIGhhcHBlbiBhdCBwb2xpY3kgbWdyIGFmdGVyCisgKgkJYmVhY29uIHVwZGF0ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZmluZHMgb3V0IGlmIHdlIG5lZWQgdG8gd2FpdAorICogZm9yIGFsbCBuc3MgdXBkYXRlIHRvIGZpbmlzaCBiZWZvcmUgcmVxdWVzdGluZyBmb3IgSFcgbW9kZQorICogdXBkYXRlCisgKgorICogUmV0dXJuOiBib29sZWFuLiBUcnVlID0gd2FpdCBmb3IgbnNzIHVwZGF0ZSwgRmFsc2UgPSBnbyBhaGVhZAorICogd2l0aCBIVyBtb2RlIHVwZGF0ZQorICovCitib29sIGNkc193YWl0X2Zvcl9uc3NfdXBkYXRlKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIHVpbnQ4X3QgYWN0aW9uKQoreworCXVpbnQzMl90IGNvbm5faW5kZXggPSAwOworCWJvb2wgd2FpdCA9IGZhbHNlOworCWlmIChDRFNfREJTID09IGFjdGlvbikgeworCQlmb3IgKGNvbm5faW5kZXggPSAwOworCQkJY29ubl9pbmRleCA8IE1BWF9OVU1CRVJfT0ZfQ09OQ19DT05ORUNUSU9OUzsKKwkJCWNvbm5faW5kZXgrKykgeworCQkJaWYgKChjb25jX2Nvbm5lY3Rpb25fbGlzdAorCQkJCVtjb25uX2luZGV4XS5vcmlnaW5hbF9uc3MgPT0gMSkgJiYKKwkJCQkoY29uY19jb25uZWN0aW9uX2xpc3QKKwkJCQlbY29ubl9pbmRleF0udHhfc3BhdGlhbF9zdHJlYW0gPT0gMikgJiYKKwkJCQkoY29uY19jb25uZWN0aW9uX2xpc3QKKwkJCQlbY29ubl9pbmRleF0ucnhfc3BhdGlhbF9zdHJlYW0gPT0gMikgJiYKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5pbl91c2UpIHsKKwkJCQl3YWl0ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoQ0RTX01DQyA9PSBhY3Rpb24pIHsKKwkJZm9yIChjb25uX2luZGV4ID0gMDsKKwkJCWNvbm5faW5kZXggPCBNQVhfTlVNQkVSX09GX0NPTkNfQ09OTkVDVElPTlM7CisJCQljb25uX2luZGV4KyspIHsKKwkJCWlmICgoY29uY19jb25uZWN0aW9uX2xpc3QKKwkJCQlbY29ubl9pbmRleF0ub3JpZ2luYWxfbnNzID09IDEpICYmCisJCQkJKGNvbmNfY29ubmVjdGlvbl9saXN0CisJCQkJW2Nvbm5faW5kZXhdLnR4X3NwYXRpYWxfc3RyZWFtID09IDEpICYmCisJCQkJKGNvbmNfY29ubmVjdGlvbl9saXN0CisJCQkJW2Nvbm5faW5kZXhdLnJ4X3NwYXRpYWxfc3RyZWFtID09IDEpICYmCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0uaW5fdXNlKSB7CisJCQkJd2FpdCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHdhaXQ7Cit9CisKKy8qKgorICogY2RzX25zc191cGRhdGVfY2IoKSAtIGNhbGxiYWNrIGZyb20gU01FIGNvbmZpcm1pbmcgbnNzCisgKiB1cGRhdGUKKyAqIEBoZGRfY3R4OglIREQgQ29udGV4dAorICogQHR4X3N0YXR1czogdHggY29tcGxldGlvbiBzdGF0dXMgZm9yIHVwZGF0ZWQgYmVhY29uIHdpdGggbmV3CisgKgkJbnNzIHZhbHVlCisgKiBAdmRldl9pZDogdmRldiBpZCBmb3IgdGhlIHNwZWNpZmljIGNvbm5lY3Rpb24KKyAqIEBuZXh0X2FjdGlvbjogbmV4dCBhY3Rpb24gdG8gaGFwcGVuIGF0IHBvbGljeSBtZ3IgYWZ0ZXIKKyAqCQliZWFjb24gdXBkYXRlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIFNNRSBhdCBuc3MKKyAqIHVwZGF0ZSByZXF1ZXN0IHRpbWUKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfbnNzX3VwZGF0ZV9jYih2b2lkICpjb250ZXh0LCB1aW50OF90IHR4X3N0YXR1cywgdWludDhfdCB2ZGV2X2lkLAorCQkJCXVpbnQ4X3QgbmV4dF9hY3Rpb24pCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IChoZGRfY29udGV4dF90ICopY29udGV4dDsKKwl1aW50MzJfdCBjb25uX2luZGV4ID0gMDsKKwlib29sIHdhaXQgPSB0cnVlOworCisJaWYgKENERl9TVEFUVVNfRV9GQUlMVVJFID09IHR4X3N0YXR1cykgeworCQljZHNfZXJyKCJuc3MgdXBkYXRlIGZhaWxlZCBmb3IgdmRldiAlZCIsIHZkZXZfaWQpOworCQlyZXR1cm47CisJfQorCWlmIChOVUxMID09IGhkZF9jdHgpIHsKKwkJY2RzX2VycigiTlVMTCBoZGRfY3R4Iik7CisJCXJldHVybjsKKwl9CisKKwkvKioKKwkgKiBDaGVjayBpZiB3ZSBhcmUgb2sgdG8gcmVxdWVzdCBmb3IgSFcgbW9kZSBjaGFuZ2Ugbm93CisJICovCisJY2RmX211dGV4X2FjcXVpcmUoJmhkZF9jdHgtPmhkZF9jb25jX2xpc3RfbG9jayk7CisJY29ubl9pbmRleCA9IGNkc19nZXRfY29ubmVjdGlvbl9mb3JfdmRldl9pZChoZGRfY3R4LCB2ZGV2X2lkKTsKKwlpZiAoTUFYX05VTUJFUl9PRl9DT05DX0NPTk5FQ1RJT05TID09IGNvbm5faW5kZXgpIHsKKwkJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9jdHgtPmhkZF9jb25jX2xpc3RfbG9jayk7CisJCWNkc19lcnIoImNvbm5lY3Rpb24gbm90IGZvdW5kIGZvciB2ZGV2ICVkIiwgdmRldl9pZCk7CisJCXJldHVybjsKKwl9CisJc3dpdGNoIChuZXh0X2FjdGlvbikgeworCWNhc2UgQ0RTX0RCUzoKKwkJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0udHhfc3BhdGlhbF9zdHJlYW0gPSAxOworCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5yeF9zcGF0aWFsX3N0cmVhbSA9IDE7CisJCXdhaXQgPSBjZHNfd2FpdF9mb3JfbnNzX3VwZGF0ZShoZGRfY3R4LCBuZXh0X2FjdGlvbik7CisJCWJyZWFrOworCWNhc2UgQ0RTX01DQzoKKwkJY29uY19jb25uZWN0aW9uX2xpc3RbY29ubl9pbmRleF0udHhfc3BhdGlhbF9zdHJlYW0gPSAyOworCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtjb25uX2luZGV4XS5yeF9zcGF0aWFsX3N0cmVhbSA9IDI7CisJCXdhaXQgPSBjZHNfd2FpdF9mb3JfbnNzX3VwZGF0ZShoZGRfY3R4LCBuZXh0X2FjdGlvbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNkc19lcnIoInVuZXhwZWN0ZWQgYWN0aW9uICVkIiwgbmV4dF9hY3Rpb24pOworCQlicmVhazsKKwl9CisJaWYgKCF3YWl0KQorCQljZHNfbmV4dF9hY3Rpb25zKGhkZF9jdHgsIG5leHRfYWN0aW9uKTsKKwljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2N0eC0+aGRkX2NvbmNfbGlzdF9sb2NrKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogY2RzX2NvbXBsZXRlX2FjdGlvbigpIC0gaW5pdGlhdGVzIGFjdGlvbnMgbmVlZGVkIG9uCisgKiBjdXJyZW50IGNvbm5lY3Rpb25zIG9uY2UgY2hhbm5lbCBoYXMgYmVlbiBkZWNpZGVkIGZvciB0aGUgbmV3CisgKiBjb25uZWN0aW9uCisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqIEBuZXdfbnNzOiB0aGUgbmV3IG5zcyB2YWx1ZQorICogQG5leHRfYWN0aW9uOiBuZXh0IGFjdGlvbiB0byBoYXBwZW4gYXQgcG9saWN5IG1nciBhZnRlcgorICoJCWJlYWNvbiB1cGRhdGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBpbml0aWF0ZXMgYWN0aW9ucworICogbmVlZGVkIG9uIGN1cnJlbnQgY29ubmVjdGlvbnMgb25jZSBjaGFubmVsIGhhcyBiZWVuIGRlY2lkZWQKKyAqIGZvciB0aGUgbmV3IGNvbm5lY3Rpb24uIE5vdGlmaWVzIFVNQUMgJiBGVyBhcyB3ZWxsCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW0KKyAqLworQ0RGX1NUQVRVUyBjZHNfY29tcGxldGVfYWN0aW9uKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJdWludDhfdCAgbmV3X25zcywgdWludDhfdCBuZXh0X2FjdGlvbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXVpbnQzMl90IGluZGV4ID0gMCwgY291bnQgPSAwOworCXVpbnQzMl90IGxpc3RbTUFYX05VTUJFUl9PRl9DT05DX0NPTk5FQ1RJT05TXTsKKwl1aW50MzJfdCBjb25uX2luZGV4ID0gMDsKKworCWlmICh3bWFfaXNfaHdfZGJzX2NhcGFibGUoKSA9PSBmYWxzZSkgeworCQljZHNfZXJyKCJkcml2ZXIgaXNuJ3QgZGJzIGNhcGFibGUsIG5vIGZ1cnRoZXIgYWN0aW9uIG5lZWRlZCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PU1VQUE9SVDsKKwl9CisKKwkvKiBjZHNfY29tcGxldGVfYWN0aW9uKCkgaXMgY2FsbGVkIGJ5IGNkc19uZXh0X2FjdGlvbnMoKS4KKwkgKiBBbGwgb3RoZXIgY2FsbGVycyBvZiBjZHNfbmV4dF9hY3Rpb25zKCkgaGF2ZSB0YWtlbiBtdXRleAorCSAqIHByb3RlY3Rpb24uIFNvLCBub3QgdGFraW5nIGFueSBsb2NrIGluc2lkZSBjZHNfY29tcGxldGVfYWN0aW9uKCkKKwkgKiBkdXJpbmcgY29uY19jb25uZWN0aW9uX2xpc3QgYWNjZXNzLgorCSAqLworCWNvdW50ID0gY2RzX21vZGVfc3BlY2lmaWNfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4LAorCQkJQ0RTX1AyUF9HT19NT0RFLCBsaXN0KTsKKwl3aGlsZSAoaW5kZXggPCBjb3VudCkgeworCQljb25uX2luZGV4ID0gY2RzX2dldF9jb25uZWN0aW9uX2Zvcl92ZGV2X2lkKGhkZF9jdHgsCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbbGlzdFtpbmRleF1dLnZkZXZfaWQpOworCQlpZiAoTUFYX05VTUJFUl9PRl9DT05DX0NPTk5FQ1RJT05TID09IGNvbm5faW5kZXgpIHsKKwkJCWNkc19lcnIoImNvbm5lY3Rpb24gbm90IGZvdW5kIGZvciB2ZGV2ICVkIiwKKwkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdFtsaXN0W2luZGV4XV0udmRldl9pZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgxID09IGNvbmNfY29ubmVjdGlvbl9saXN0W2xpc3RbaW5kZXhdXS5vcmlnaW5hbF9uc3MpIHsKKwkJCXN0YXR1cyA9IHNtZV9uc3NfdXBkYXRlX3JlcXVlc3QoaGRkX2N0eC0+aEhhbCwKKwkJCQkJY29uY19jb25uZWN0aW9uX2xpc3QKKwkJCQkJW2xpc3RbaW5kZXhdXS52ZGV2X2lkLCBuZXdfbnNzLAorCQkJCQljZHNfbnNzX3VwZGF0ZV9jYiwKKwkJCQkJbmV4dF9hY3Rpb24sIGhkZF9jdHgpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCWNkc19lcnIoInNtZV9uc3NfdXBkYXRlX3JlcXVlc3QoKSBmYWlsZWQgZm9yIHZkZXYgJWQiLAorCQkJCWNvbmNfY29ubmVjdGlvbl9saXN0W2xpc3RbaW5kZXhdXS52ZGV2X2lkKTsKKwkJCX0KKwkJfQorCQlpbmRleCsrOworCX0KKworCWluZGV4ID0gMDsKKwljb3VudCA9IGNkc19tb2RlX3NwZWNpZmljX2Nvbm5lY3Rpb25fY291bnQoaGRkX2N0eCwKKwkJCUNEU19TQVBfTU9ERSwgbGlzdCk7CisJd2hpbGUgKGluZGV4IDwgY291bnQpIHsKKwkJaWYgKDEgPT0gY29uY19jb25uZWN0aW9uX2xpc3RbbGlzdFtpbmRleF1dLm9yaWdpbmFsX25zcykgeworCQkJc3RhdHVzID0gc21lX25zc191cGRhdGVfcmVxdWVzdChoZGRfY3R4LT5oSGFsLAorCQkJCQljb25jX2Nvbm5lY3Rpb25fbGlzdAorCQkJCQlbbGlzdFtpbmRleF1dLnZkZXZfaWQsIG5ld19uc3MsCisJCQkJCWNkc19uc3NfdXBkYXRlX2NiLAorCQkJCQluZXh0X2FjdGlvbiwgaGRkX2N0eCk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJY2RzX2Vycigic21lX25zc191cGRhdGVfcmVxdWVzdCgpIGZhaWxlZCBmb3IgdmRldiAlZCIsCisJCQkJY29uY19jb25uZWN0aW9uX2xpc3RbbGlzdFtpbmRleF1dLnZkZXZfaWQpOworCQkJfQorCQl9CisJCWluZGV4Kys7CisJfQorCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCXN0YXR1cyA9IGNkc19uZXh0X2FjdGlvbnMoaGRkX2N0eCwgbmV4dF9hY3Rpb24pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjZHNfbmV4dF9hY3Rpb25zKCkgLSBpbml0aWF0ZXMgYWN0aW9ucyBuZWVkZWQgb24gY3VycmVudAorICogY29ubmVjdGlvbnMgb25jZSBjaGFubmVsIGhhcyBiZWVuIGRlY2lkZWQgZm9yIHRoZSBuZXcKKyAqIGNvbm5lY3Rpb24KKyAqIEBoZGRfY3R4OglIREQgQ29udGV4dAorICogQGFjdGlvbjogYWN0aW9uIHRvIGJlIGV4ZWN1dGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWF0ZXMgaW5pdGlhdGVzIGFjdGlvbnMKKyAqIG5lZWRlZCBvbiBjdXJyZW50IGNvbm5lY3Rpb25zIG9uY2UgY2hhbm5lbCBoYXMgYmVlbiBkZWNpZGVkCisgKiBmb3IgdGhlIG5ldyBjb25uZWN0aW9uLiBOb3RpZmllcyBVTUFDICYgRlcgYXMgd2VsbAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtCisgKi8KK0NERl9TVEFUVVMgY2RzX25leHRfYWN0aW9ucyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCWVudW0gY2RzX2NvbmNfbmV4dF9hY3Rpb24gYWN0aW9uKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJc3RydWN0IHNpcl9od19tb2RlX3BhcmFtcyBod19tb2RlOworCisJaWYgKHdtYV9pc19od19kYnNfY2FwYWJsZSgpID09IGZhbHNlKSB7CisJCWNkc19lcnIoImRyaXZlciBpc24ndCBkYnMgY2FwYWJsZSwgbm8gZnVydGhlciBhY3Rpb24gbmVlZGVkIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9TVVBQT1JUOworCX0KKworCS8qIGNoZWNrIGZvciB0aGUgY3VycmVudCBIVyBpbmRleCB0byBzZWUgaWYgcmVhbGx5IG5lZWQgYW55IGFjdGlvbiAqLworCXN0YXR1cyA9IHdtYV9nZXRfY3VycmVudF9od19tb2RlKCZod19tb2RlKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWNkc19lcnIoIndtYV9nZXRfY3VycmVudF9od19tb2RlIGZhaWxlZCIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwkvKioKKwkgKiAgaWYgYWxyZWFkeSBpbiBEQlMgbm8gbmVlZCB0byByZXF1ZXN0IERCUyBvciBpZiBhbHJlYWR5IGluCisJICogIG5vbiBkYnMgbm8gbmVlZCByZXF1ZXN0IGZvciBub24gZGJzIGFnYWluLiBNaWdodCBiZSBuZWVkZWQKKwkgKiAgdG8gZXh0ZW5kIHRoZSBsb2dpYyB3aGVuIG11bHRpcGxlIGRicyBIVyBtb2RlIGlzIGF2YWlsYWJsZQorCSAqLworCWlmICgoKChDRFNfREJTX0RPV05HUkFERSA9PSBhY3Rpb24pIHx8IChDRFNfREJTID09IGFjdGlvbikpCisJCSYmIGh3X21vZGUuZGJzX2NhcCkgfHwKKwkJKCgoQ0RTX01DQ19VUEdSQURFID09IGFjdGlvbikgfHwgKENEU19NQ0MgPT0gYWN0aW9uKSkKKwkJJiYgIWh3X21vZGUuZGJzX2NhcCkpIHsKKwkJY2RzX2VycigiZHJpdmVyIGlzIGFscmVhZHkgaW4gJXMgbW9kZSwgbm8gZnVydGhlciBhY3Rpb24gbmVlZGVkIiwKKwkJCQkoaHdfbW9kZS5kYnNfY2FwKSA/ICJkYnMiIDogIm5vbiBkYnMiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9BTFJFQURZOworCX0KKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDRFNfREJTX0RPV05HUkFERToKKwkJLyoKKwkJKiBjaGVjayBpZiB3ZSBoYXZlIGEgYmVhY29uaW5nIGVudGl0eSB0aGF0IGlzIHVzaW5nIDJ4Mi4gSWYgeWVzLAorCQkqIHVwZGF0ZSB0aGUgYmVhY29uIHRlbXBsYXRlICYgbm90aWZ5IEZXLiBPbmNlIEZXIGNvbmZpcm1zCisJCSogIGJlYWNvbiB1cGRhdGVkLCBzZW5kIGRvd24gdGhlIEhXIG1vZGUgY2hhbmdlIHJlcQorCQkqLworCQlzdGF0dXMgPSBjZHNfY29tcGxldGVfYWN0aW9uKGhkZF9jdHgsIDEsIENEU19EQlMpOworCQlicmVhazsKKwljYXNlIENEU19EQlM6CisJCXN0YXR1cyA9IGNkc19zb2Nfc2V0X2h3X21vZGUoaGRkX2N0eCwgSFdfTU9ERV9TU18xeDEsCisJCQkJCQlIV19NT0RFXzgwX01IWiwKKwkJCQkJCUhXX01PREVfU1NfMXgxLCBIV19NT0RFXzQwX01IWiwKKwkJCQkJCUhXX01PREVfREJTLAorCQkJCQkJSFdfTU9ERV9BR0lMRV9ERlNfTk9ORSk7CisJCWJyZWFrOworCWNhc2UgQ0RTX01DQ19VUEdSQURFOgorCQkvKgorCQkqIGNoZWNrIGlmIHdlIGhhdmUgYSBiZWFjb25pbmcgZW50aXR5IHRoYXQgYWR2ZXJ0aXNlZCAyeDIKKwkJKiBpbnRpYWxseS4gSWYgeWVzLCB1cGRhdGUgdGhlIGJlYWNvbiB0ZW1wbGF0ZSAmIG5vdGlmeSBGVy4KKwkJKiBPbmNlIEZXIGNvbmZpcm1zIGJlYWNvbiB1cGRhdGVkLCBzZW5kIHRoZSBIVyBtb2RlIGNoYW5nZSByZXEKKwkJKi8KKwkJc3RhdHVzID0gY2RzX2NvbXBsZXRlX2FjdGlvbihoZGRfY3R4LCAwLCBDRFNfTUNDKTsKKwkJYnJlYWs7CisJY2FzZSBDRFNfTUNDOgorCQlzdGF0dXMgPSBjZHNfc29jX3NldF9od19tb2RlKGhkZF9jdHgsIEhXX01PREVfU1NfMngyLAorCQkJCQkJSFdfTU9ERV84MF9NSFosCisJCQkJCQlIV19NT0RFX1NTXzB4MCwgSFdfTU9ERV9CV19OT05FLAorCQkJCQkJSFdfTU9ERV9EQlNfTk9ORSwKKwkJCQkJCUhXX01PREVfQUdJTEVfREZTX05PTkUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBlcnIgbXNnICovCisJCWNkc19lcnIoInVuZXhwZWN0ZWQgYWN0aW9uIHZhbHVlICVkIiwgYWN0aW9uKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY2RzX2NmZzgwMjExX2dldF9jb25jdXJyZW5jeV9tYXRyaXgoKSAtIHRvIHJldHJpZXZlIGNvbmN1cnJlbmN5IG1hdHJpeAorICogQHdpcGh5OiBwb2ludGVyIHBoeSBhZGFwdGVyCisgKiBAd2RldjogcG9pbnRlciB0byB3aXJlbGVzcyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZGF0YTogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICogQGRhdGFfbGVuOiBsZW5ndGggb2YgZGF0YQorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGdpdmUgY29uY3VycmVuY3kgbWF0cml4CisgKgorICogUmV0dXJuOiBpbnQgc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBfX2Nkc19jZmc4MDIxMV9nZXRfY29uY3VycmVuY3lfbWF0cml4KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJIGludCBkYXRhX2xlbikKK3sKKwl1aW50MzJfdCBmZWF0dXJlX3NldF9tYXRyaXhbQ0RTX01BWF9GRUFUVVJFX1NFVF0gPSB7MH07CisJdWludDhfdCBpLCBmZWF0dXJlX3NldHMsIG1heF9mZWF0dXJlX3NldHM7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX0NPTkNVUlJFTkNZX01BVFJJWF9NQVggKyAxXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHlfc2tiOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWNkc19lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkgeworCQljZHNfZXJyKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYX01BWCwKKwkJCWRhdGEsIGRhdGFfbGVuLCBOVUxMKSkgeworCQljZHNfZXJyKCJJbnZhbGlkIEFUVFIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUGFyc2UgYW5kIGZldGNoIG1heCBmZWF0dXJlIHNldCAqLworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX0NPTkNVUlJFTkNZX01BVFJJWF9DT05GSUdfUEFSQU1fU0VUX1NJWkVfTUFYXSkgeworCQljZHNfZXJyKCJBdHRyIG1heCBmZWF0dXJlIHNldCBzaXplIGZhaWxlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbWF4X2ZlYXR1cmVfc2V0cyA9IG5sYV9nZXRfdTMyKHRiWworCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYX0NPTkZJR19QQVJBTV9TRVRfU0laRV9NQVhdKTsKKwljZHNfaW5mbygiTWF4IGZlYXR1cmUgc2V0IHNpemUgKCVkKSIsIG1heF9mZWF0dXJlX3NldHMpOworCisJLyogRmlsbCBmZWF0dXJlIGNvbWJpbmF0aW9uIG1hdHJpeCAqLworCWZlYXR1cmVfc2V0cyA9IDA7CisJZmVhdHVyZV9zZXRfbWF0cml4W2ZlYXR1cmVfc2V0cysrXSA9IFdJRklfRkVBVFVSRV9JTkZSQSB8CisJCVdJRklfRkVBVFVSRV9QMlA7CisJLyogQWRkIG1vcmUgZmVhdHVyZSBjb21iaW5hdGlvbnMgaGVyZSAqLworCisJZmVhdHVyZV9zZXRzID0gQ0RGX01JTihmZWF0dXJlX3NldHMsIG1heF9mZWF0dXJlX3NldHMpOworCWNkc19pbmZvKCJOdW1iZXIgb2YgZmVhdHVyZSBzZXRzICglZCkiLCBmZWF0dXJlX3NldHMpOworCWNkc19pbmZvKCJGZWF0dXJlIHNldCBtYXRyaXgiKTsKKwlmb3IgKGkgPSAwOyBpIDwgZmVhdHVyZV9zZXRzOyBpKyspCisJCWNkc19pbmZvKCJbJWRdIDB4JTAyWCIsIGksIGZlYXR1cmVfc2V0X21hdHJpeFtpXSk7CisKKwlyZXBseV9za2IgPSBjZmc4MDIxMV92ZW5kb3JfY21kX2FsbG9jX3JlcGx5X3NrYih3aXBoeSwgc2l6ZW9mKHUzMikgKworCQkJc2l6ZW9mKHUzMikgKiBmZWF0dXJlX3NldHMgKyBOTE1TR19IRFJMRU4pOworCisJaWYgKHJlcGx5X3NrYikgeworCQlpZiAobmxhX3B1dF91MzIocmVwbHlfc2tiLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX0NPTkNVUlJFTkNZX01BVFJJWF9SRVNVTFRTX1NFVF9TSVpFLAorCQkJZmVhdHVyZV9zZXRzKSB8fAorCQkJbmxhX3B1dChyZXBseV9za2IsCisJCQkgICAgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYX1JFU1VMVFNfU0VULAorCQkJICAgICAgc2l6ZW9mKHUzMikgKiBmZWF0dXJlX3NldHMsCisJCQkgICAgICBmZWF0dXJlX3NldF9tYXRyaXgpKSB7CisJCQljZHNfZXJyKCJubGEgcHV0IGZhaWwiKTsKKwkJCWtmcmVlX3NrYihyZXBseV9za2IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIGNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkocmVwbHlfc2tiKTsKKwl9CisJY2RzX2VycigiRmVhdHVyZSBzZXQgbWF0cml4OiBidWZmZXIgYWxsb2MgZmFpbCIpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKioKKyAqIGNkc19jZmc4MDIxMV9nZXRfY29uY3VycmVuY3lfbWF0cml4KCkgLSBnZXQgY29uY3VycmVuY3kgbWF0cml4CisgKiBAd2lwaHk6ICAgcG9pbnRlciB0byB3aXJlbGVzcyB3aXBoeSBzdHJ1Y3R1cmUuCisgKiBAd2RldjogICAgcG9pbnRlciB0byB3aXJlbGVzc19kZXYgc3RydWN0dXJlLgorICogQGRhdGE6ICAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgcGFzc2VkIHZpYSB2ZW5kb3IgaW50ZXJmYWNlCisgKiBAZGF0YV9sZW46TGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHBhc3NlZAorICoKKyAqIFJldHVybjogICBSZXR1cm4gdGhlIFN1Y2Nlc3Mgb3IgRmFpbHVyZSBjb2RlLgorICovCitpbnQKK2Nkc19jZmc4MDIxMV9nZXRfY29uY3VycmVuY3lfbWF0cml4KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCWNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19jZHNfY2ZnODAyMTFfZ2V0X2NvbmN1cnJlbmN5X21hdHJpeCh3aXBoeSwgd2RldiwgZGF0YSwKKwkJCWRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBjZHNfZ2V0X2NvbmN1cnJlbmN5X21vZGUoKSAtIHJldHVybiBjb25jdXJyZW5jeSBtb2RlCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcmV0cmlldmUgY29uY3VycmVuY3kgbW9kZQorICoKKyAqIFJldHVybjogdWludDMyX3QgdmFsdWUgb2YgY29uY3VycmVuY3kgbWFzaworICovCit1aW50MzJfdCBjZHNfZ2V0X2NvbmN1cnJlbmN5X21vZGUodm9pZCkKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCisJaGRkX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJaWYgKE5VTEwgIT0gaGRkX2N0eCkgeworCQljZHNfaW5mbygiY29uY3VycmVuY3lfbW9kZSA9IDB4JXgiLAorCQkJaGRkX2N0eC0+Y29uY3VycmVuY3lfbW9kZSk7CisJCXJldHVybiBoZGRfY3R4LT5jb25jdXJyZW5jeV9tb2RlOworCX0KKworCS8qIHdlIGFyZSBpbiBhbiBpbnZhbGlkIHN0YXRlIDooICovCisJY2RzX2VycigiSW52YWxpZCBjb250ZXh0Iik7CisJcmV0dXJuIENERl9TVEFfTUFTSzsKK30KKworLyoqCisgKiBjZHNfc2FwX3Jlc3RhcnRfaGFuZGxlKCkgLSB0byBoYW5kbGUgcmVzdGFydGluZyBvZiBTQVAKKyAqIEB3b3JrOiBuYW1lIG9mIHRoZSB3b3JrCisgKgorICogUHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHRyaWdnZXIgc2FwIHN0YXJ0LiB0aGlzIGZ1bmN0aW9uCisgKiB3aWxsIGJlIGNhbGxlZCBmcm9tIHdvcmtxdWV1ZS4KKyAqCisgKiBSZXR1cm46IHZvaWQuCisgKi8KK3N0YXRpYyB2b2lkIGNkc19zYXBfcmVzdGFydF9oYW5kbGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWhkZF9hZGFwdGVyX3QgKnNhcF9hZGFwdGVyOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBjb250YWluZXJfb2Yod29yaywgaGRkX2NvbnRleHRfdCwKKwkJCQkJc2FwX3N0YXJ0X3dvcmspOworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJaWYgKDAgIT0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KSkgeworCQljZHNfZXJyKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKTsKKwkJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXNhcF9hZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKGhkZF9jdHgsIFdMQU5fSEREX1NPRlRBUCk7CisJaWYgKHNhcF9hZGFwdGVyID09IE5VTEwpIHsKKwkJY2RzX2Vycigic2FwX2FkYXB0ZXIgaXMgTlVMTCIpOworCQljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJd2xhbl9oZGRfc3RhcnRfc2FwKHNhcF9hZGFwdGVyKTsKKworCWNkc19jaGFuZ2Vfc2FwX3Jlc3RhcnRfcmVxdWlyZWRfc3RhdHVzKGhkZF9jdHgsIGZhbHNlKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7Cit9CisKKy8qKgorICogY2RzX2NoZWNrX2FuZF9yZXN0YXJ0X3NhcCgpIC0gQ2hlY2sgYW5kIHJlc3RhcnQgc2FwIGlmIHJlcXVpcmVkCisgKiBAaGRkX2N0eDogcG9pbnRlciB0byBIREQgY29udGV4dAorICogQHJvYW1fcmVzdWx0OiBSb2FtIHJlc3VsdAorICogQGhkZF9zdGFfY3R4OiBIREQgc3RhdGlvbiBjb250ZXh0CisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgcmVzdGFydCB0aGUgU0FQIGlmIHJlc3RhcnQgaXMgcGVuZGluZworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIGNkc19jaGVja19hbmRfcmVzdGFydF9zYXAoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCWVDc3JSb2FtUmVzdWx0IHJvYW1fcmVzdWx0LAorCQkJaGRkX3N0YXRpb25fY3R4X3QgKmhkZF9zdGFfY3R4KQoreworCWhkZF9hZGFwdGVyX3QgKnNhcF9hZGFwdGVyID0gTlVMTDsKKwloZGRfYXBfY3R4X3QgKmhkZF9hcF9jdHggPSBOVUxMOworCXVpbnQ4X3QgZGVmYXVsdF9zYXBfY2hhbm5lbCA9IDY7CisKKwlpZiAoIShoZGRfY3R4LT5jb25maWctPmNvbmNfY3VzdG9tX3J1bGUxICYmCisJCQkodHJ1ZSA9PSBjZHNfaXNfc2FwX3Jlc3RhcnRfcmVxdWlyZWQoaGRkX2N0eCkpKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXNhcF9hZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKGhkZF9jdHgsIFdMQU5fSEREX1NPRlRBUCk7CisJaWYgKHNhcF9hZGFwdGVyID09IE5VTEwpIHsKKwkJY2RzX2Vycigic2FwX2FkYXB0ZXIgaXMgTlVMTCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKHRlc3RfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnNhcF9hZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKwkJY2RzX2VycigiU0FQIGlzIGFscmVhZHkgaW4gc3RhcnRlZCBzdGF0ZSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaGRkX2FwX2N0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHNhcF9hZGFwdGVyKTsKKwlpZiAoaGRkX2FwX2N0eCA9PSBOVUxMKSB7CisJCWNkc19lcnIoIkhERCBzYXAgY29udGV4dCBpcyBOVUxMIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJaWYgKChlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQgPT0gcm9hbV9yZXN1bHQpICYmCisJCQloZGRfc3RhX2N0eC0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWwgPAorCQkJU0lSXzExQV9DSEFOTkVMX0JFR0lOKSB7CisJCWNkc19lcnIoIlN0YXJ0aW5nIFNBUCBvbiBjaG5sIFslZF0gYWZ0ZXIgU1RBIGFzc29jIGNvbXBsZXRlIiwKKwkJCWhkZF9zdGFfY3R4LT5jb25uX2luZm8ub3BlcmF0aW9uQ2hhbm5lbCk7CisJCWhkZF9hcF9jdHgtPm9wZXJhdGluZ0NoYW5uZWwgPQorCQkJaGRkX3N0YV9jdHgtPmNvbm5faW5mby5vcGVyYXRpb25DaGFubmVsOworCX0gZWxzZSB7CisJCS8qIHN0YXJ0IG9uIGRlZmF1bHQgU0FQIGNoYW5uZWwgKi8KKwkJaGRkX2FwX2N0eC0+b3BlcmF0aW5nQ2hhbm5lbCA9CisJCQlkZWZhdWx0X3NhcF9jaGFubmVsOworCQljZHNfZXJyKCJTdGFydGluZyBTQVAgb24gY2hhbm5lbCBbJWRdIGFmdGVyIFNUQSBhc3NvYyBmYWlsZWQiLAorCQkJZGVmYXVsdF9zYXBfY2hhbm5lbCk7CisJfQorCWhkZF9hcF9jdHgtPnNhcENvbmZpZy5jaF9wYXJhbXMuY2hfd2lkdGggPQorCQloZGRfYXBfY3R4LT5zYXBDb25maWcuY2hfd2lkdGhfb3JpZzsKKwlzbWVfc2V0X2NoX3BhcmFtcyhXTEFOX0hERF9HRVRfSEFMX0NUWChzYXBfYWRhcHRlciksCisJCQloZGRfYXBfY3R4LT5zYXBDb25maWcuU2FwSHdfbW9kZSwKKwkJCWhkZF9hcF9jdHgtPm9wZXJhdGluZ0NoYW5uZWwsCisJCQloZGRfYXBfY3R4LT5zYXBDb25maWcuc2VjX2NoLAorCQkJJmhkZF9hcF9jdHgtPnNhcENvbmZpZy5jaF9wYXJhbXMpOworCS8qCisJICogQ3JlYXRlIGEgd29ya3F1ZXVlIGFuZCBsZXQgdGhlIHdvcmtxdWV1ZSBoYW5kbGUgdGhlIHJlc3RhcnQKKwkgKiBvZiBzYXAgdGFzay4gaWYgd2UgZGlyZWN0bHkgY2FsbCBzYXAgcmVzdGFydCBmdW5jdGlvbiB3aXRob3V0CisJICogY3JlYXRpbmcgd29ya3F1ZXVlIHRoZW4gb3VyIG1haW4gdGhyZWFkIG1pZ2h0IGdvIHRvIHNsZWVwCisJICogd2hpY2ggaXMgbm90IGFjY2VwdGFibGUuCisJICovCisjaWZkZWYgQ09ORklHX0NOU1MKKwljbnNzX2luaXRfd29yaygmaGRkX2N0eC0+c2FwX3N0YXJ0X3dvcmssCisJCQljZHNfc2FwX3Jlc3RhcnRfaGFuZGxlKTsKKyNlbHNlCisJSU5JVF9XT1JLKCZoZGRfY3R4LT5zYXBfc3RhcnRfd29yaywKKwkJCWNkc19zYXBfcmVzdGFydF9oYW5kbGUpOworI2VuZGlmCisJc2NoZWR1bGVfd29yaygmaGRkX2N0eC0+c2FwX3N0YXJ0X3dvcmspOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RzX3N0YV9zYXBfY29uY3VyX2hhbmRsZSgpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGhhbmRsZSBTdGF0aW9uIGFuZCBzYXAKKyAqIGNvbmN1cnJlbmN5LgorICogQGhkZF9jdHg6IHBvaW50ZXIgdG8gaGRkIGNvbnRleHQuCisgKiBAc3RhX2FkYXB0ZXI6IHBvaW50ZXIgdG8gc3RhdGlvbiBhZGFwdGVyLgorICogQHJvYW1fcHJvZmlsZTogcG9pbnRlciB0byBzdGF0aW9uJ3Mgcm9hbSBwcm9maWxlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBmaW5kIHRoZSBBUCB0byB3aGljaCBzdGF0aW9uIGlzIGxpa2VseSB0byBtYWtlIHRoZQorICogdGhlIGNvbm5lY3Rpb24sIGlmIHRoYXQgQVAncyBjaGFubmVsIGhhcHBlbnMgdG8gYmUgZGlmZmVyZW50IHRoYW4KKyAqIFNBUCdzIGNoYW5uZWwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcCB0aGUgU0FQLgorICoKKyAqIFJldHVybjogdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBmdW5jdGlvbidzIG92ZXJhbGwgc3VjY2Vzcy4KKyAqLworc3RhdGljIGJvb2wgY2RzX3N0YV9zYXBfY29uY3VyX2hhbmRsZShoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQloZGRfYWRhcHRlcl90ICpzdGFfYWRhcHRlciwKKwkJdENzclJvYW1Qcm9maWxlICpyb2FtX3Byb2ZpbGUpCit7CisJaGRkX2FkYXB0ZXJfdCAqYXBfYWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihoZGRfY3R4LAorCQkJV0xBTl9IRERfU09GVEFQKTsKKwlib29sIGFyZV9jY19jaGFubmVsc19zYW1lID0gZmFsc2U7CisJdFNjYW5SZXN1bHRIYW5kbGUgc2Nhbl9jYWNoZSA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlpZiAoKGFwX2FkYXB0ZXIgIT0gTlVMTCkgJiYKKwkJdGVzdF9iaXQoU09GVEFQX0JTU19TVEFSVEVELCAmYXBfYWRhcHRlci0+ZXZlbnRfZmxhZ3MpKSB7CisJCXN0YXR1cyA9CisJCQl3bGFuX2hkZF9jaGVja19jdXN0b21fY29uX2NoYW5uZWxfcnVsZXMoc3RhX2FkYXB0ZXIsCisJCQkJCWFwX2FkYXB0ZXIsIHJvYW1fcHJvZmlsZSwgJnNjYW5fY2FjaGUsCisJCQkJCSZhcmVfY2NfY2hhbm5lbHNfc2FtZSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQljZHNfZXJyKCJ3bGFuX2hkZF9jaGVja19jdXN0b21fY29uX2NoYW5uZWxfcnVsZXMgZmFpbGVkISIpOworCQkJLyogTm90IHJldHVybmluZyAqLworCQl9CisJCXN0YXR1cyA9IHNtZV9zY2FuX3Jlc3VsdF9wdXJnZSgKKwkJCQlXTEFOX0hERF9HRVRfSEFMX0NUWChzdGFfYWRhcHRlciksCisJCQkJc2Nhbl9jYWNoZSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQljZHNfZXJyKCJzbWVfc2Nhbl9yZXN1bHRfcHVyZ2UgZmFpbGVkISIpOworCQkJLyogTm90IHJldHVybmluZyAqLworCQl9CisJCS8qCisJCSAqIGFyZV9jY19jaGFubmVsc19zYW1lIHdpbGwgYmUgZmFsc2UgaW5jYXNlIGlmIFNBUCBhbmQgU1RBCisJCSAqIGNoYW5uZWwgaXMgZGlmZmVyZW50IG9yIFNUQSBjaGFubmVsIGlzIHplcm8uCisJCSAqIGluY2FzZSBpZiBTVEEgY2hhbm5lbCBpcyB6ZXJvIHRoZW4gbGV0cyBzdG9wIHRoZSBBUCBhbmQKKwkJICogcmVzdGFydCBmbGFnIHNldCwgc28gbGF0ZXIgd2hlbmV2ZXIgU1RBIGNoYW5uZWwgaXMgZGVmaW5lZAorCQkgKiB3ZSBjYW4gcmVzdGFydCBvdXIgU0FQIGluIHRoYXQgY2hhbm5lbC4KKwkJICovCisJCWlmIChmYWxzZSA9PSBhcmVfY2NfY2hhbm5lbHNfc2FtZSkgeworCQkJY2RzX2luZm8oIlN0b3AgQVAgZHVlIHRvIG1pc21hdGNoIHdpdGggU1RBIGNoYW5uZWwiKTsKKwkJCXdsYW5faGRkX3N0b3Bfc2FwKGFwX2FkYXB0ZXIpOworCQkJY2RzX2NoYW5nZV9zYXBfcmVzdGFydF9yZXF1aXJlZF9zdGF0dXMoaGRkX2N0eCwgdHJ1ZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSB7CisJCQljZHNfaW5mbygic2FwIGNoYW5uZWxzIGFyZSBzYW1lIik7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQKKy8qKgorICogY2RzX3N0YV9wMnBnb19jb25jdXJfaGFuZGxlKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIFN0YXRpb24gYW5kIEdPCisgKiBjb25jdXJyZW5jeS4KKyAqIEBoZGRfY3R4OiBwb2ludGVyIHRvIGhkZCBjb250ZXh0LgorICogQHN0YV9hZGFwdGVyOiBwb2ludGVyIHRvIHN0YXRpb24gYWRhcHRlci4KKyAqIEByb2FtX3Byb2ZpbGU6IHBvaW50ZXIgdG8gc3RhdGlvbidzIHJvYW0gcHJvZmlsZS4KKyAqIEByb2FtX2lkOiByZWZlcmVuY2UgdG8gcm9hbV9pZCB2YXJpYWJsZSBiZWluZyBwYXNzZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGZpbmQgdGhlIEFQIHRvIHdoaWNoIHN0YXRpb24gaXMgbGlrZWx5IHRvIG1ha2UgdGhlCisgKiB0aGUgY29ubmVjdGlvbiwgaWYgdGhhdCBBUCdzIGNoYW5uZWwgaGFwcGVucyB0byBiZSBkaWZmZXJlbnQgdGhhbiBvdXIKKyAqIFAyUEdPJ3MgY2hhbm5lbCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGF2b2lkIGZyZXF1ZW5jeSBldmVudCB0bworICogZnJhbWV3b3JrIHRvIG1ha2UgUDJQR08gc3RvcCBhbmQgYWxzbyBjYWNoZXMgc3RhdGlvbidzIGNvbm5lY3QgcmVxdWVzdC4KKyAqCisgKiBSZXR1cm46IHRydWUgb3IgZmFsc2UgYmFzZWQgb24gZnVuY3Rpb24ncyBvdmVyYWxsIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBib29sIGNkc19zdGFfcDJwZ29fY29uY3VyX2hhbmRsZShoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQloZGRfYWRhcHRlcl90ICpzdGFfYWRhcHRlciwKKwkJdENzclJvYW1Qcm9maWxlICpyb2FtX3Byb2ZpbGUsCisJCXVpbnQzMl90ICpyb2FtX2lkKQoreworCWhkZF9hZGFwdGVyX3QgKnAycGdvX2FkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIoaGRkX2N0eCwKKwkJCVdMQU5fSEREX1AyUF9HTyk7CisJYm9vbCBhcmVfY2NfY2hhbm5lbHNfc2FtZSA9IGZhbHNlOworCXRTY2FuUmVzdWx0SGFuZGxlIHNjYW5fY2FjaGUgPSBOVUxMOworCXVpbnQzMl90IHAycGdvX2NoYW5uZWxfbnVtLCBmcmVxOworCXRIZGRBdm9pZEZyZXFMaXN0IGhkZF9hdm9pZF9mcmVxX2xpc3Q7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJYm9vbCByZXQ7CisKKwlpZiAoKHAycGdvX2FkYXB0ZXIgIT0gTlVMTCkgJiYKKwkJdGVzdF9iaXQoU09GVEFQX0JTU19TVEFSVEVELCAmcDJwZ29fYWRhcHRlci0+ZXZlbnRfZmxhZ3MpKSB7CisJCXN0YXR1cyA9CisJCQl3bGFuX2hkZF9jaGVja19jdXN0b21fY29uX2NoYW5uZWxfcnVsZXMoc3RhX2FkYXB0ZXIsCisJCQkJCXAycGdvX2FkYXB0ZXIsIHJvYW1fcHJvZmlsZSwKKwkJCQkJJnNjYW5fY2FjaGUsICZhcmVfY2NfY2hhbm5lbHNfc2FtZSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQljZHNfZXJyKCJ3bGFuX2hkZF9jaGVja19jdXN0b21fY29uX2NoYW5uZWxfcnVsZXMgZmFpbGVkIik7CisJCQkvKiBOb3QgcmV0dXJuaW5nICovCisJCX0KKwkJLyoKKwkJICogYXJlX2NjX2NoYW5uZWxzX3NhbWUgd2lsbCBiZSBmYWxzZSBpbmNhc2UgaWYgUDJQR08gYW5kIFNUQQorCQkgKiBjaGFubmVsIGlzIGRpZmZlcmVudCBvciBTVEEgY2hhbm5lbCBpcyB6ZXJvLgorCQkgKi8KKwkJaWYgKGZhbHNlID09IGFyZV9jY19jaGFubmVsc19zYW1lKSB7CisJCQlpZiAodHJ1ZSA9PSBjZHNfaXNfc3RhX2Nvbm5lY3Rpb25fcGVuZGluZyhoZGRfY3R4KSkgeworCQkJCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCVRSQUNFX0NPREVfSEREX0NMRUFSX0pPSU5fUkVRLAorCQkJCQlzdGFfYWRhcHRlci0+c2Vzc2lvbklkLCAqcm9hbV9pZCkpOworCQkJCXJldCA9IHNtZV9jbGVhcl9qb2lucmVxX3BhcmFtKAorCQkJCQlXTEFOX0hERF9HRVRfSEFMX0NUWChzdGFfYWRhcHRlciksCisJCQkJCXN0YV9hZGFwdGVyLT5zZXNzaW9uSWQpOworCQkJCWlmICh0cnVlICE9IHJldCkgeworCQkJCQljZHNfZXJyKCJzbWVfY2xlYXJfam9pbnJlcV9wYXJhbSBmYWlsZWQiKTsKKwkJCQkJLyogTm90IHJldHVybmluZyAqLworCQkJCX0KKwkJCQljZHNfY2hhbmdlX3N0YV9jb25uX3BlbmRpbmdfc3RhdHVzKGhkZF9jdHgsCisJCQkJCQlmYWxzZSk7CisJCQkJY2RzX2luZm8oIj09PT5DbGVhciBwZW5kaW5nIGpvaW4gcmVxIik7CisJCQl9CisJCQlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJCQlUUkFDRV9DT0RFX0hERF9TVE9SRV9KT0lOX1JFUSwKKwkJCQkJc3RhX2FkYXB0ZXItPnNlc3Npb25JZCwgKnJvYW1faWQpKTsKKwkJCS8qIHN0b3JlIHRoZSBzY2FuIGNhY2hlIGhlcmUgKi8KKwkJCXJldCA9IHNtZV9zdG9yZV9qb2lucmVxX3BhcmFtKAorCQkJCQlXTEFOX0hERF9HRVRfSEFMX0NUWChzdGFfYWRhcHRlciksCisJCQkJCXJvYW1fcHJvZmlsZSwKKwkJCQkJc2Nhbl9jYWNoZSwKKwkJCQkJcm9hbV9pZCwKKwkJCQkJc3RhX2FkYXB0ZXItPnNlc3Npb25JZCk7CisJCQlpZiAodHJ1ZSAhPSByZXQpIHsKKwkJCQljZHNfZXJyKCJzbWVfc3RvcmVfam9pbnJlcV9wYXJhbSBmYWlsZWQiKTsKKwkJCQkvKiBOb3QgcmV0dXJuaW5nICovCisJCQl9CisJCQljZHNfY2hhbmdlX3N0YV9jb25uX3BlbmRpbmdfc3RhdHVzKGhkZF9jdHgsIHRydWUpOworCQkJLyoKKwkJCSAqIGZpbGwgZnJlcXVlbmN5IGF2b2lkYW5jZSBldmVudCBhbmQgc2VuZCBpdCB1cCwgc28KKwkJCSAqIHAycGdvIHN0b3AgZXZlbnQgc2hvdWxkIGdldCB0cmlnZ2VyIGZyb20gdXBwZXIgbGF5ZXIKKwkJCSAqLworCQkJcDJwZ29fY2hhbm5lbF9udW0gPQorCQkJCVdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHAycGdvX2FkYXB0ZXIpLT4KKwkJCQlvcGVyYXRpbmdDaGFubmVsOworCQkJaWYgKHAycGdvX2NoYW5uZWxfbnVtIDw9IDE0KSB7CisJCQkJZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeSgKKwkJCQkJCXAycGdvX2NoYW5uZWxfbnVtLAorCQkJCQkJSUVFRTgwMjExX0JBTkRfMkdIWik7CisJCQl9IGVsc2UgeworCQkJCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koCisJCQkJCQlwMnBnb19jaGFubmVsX251bSwKKwkJCQkJCUlFRUU4MDIxMV9CQU5EXzVHSFopOworCQkJfQorCQkJY2RmX21lbV96ZXJvKCZoZGRfYXZvaWRfZnJlcV9saXN0LAorCQkJCQlzaXplb2YoaGRkX2F2b2lkX2ZyZXFfbGlzdCkpOworCQkJaGRkX2F2b2lkX2ZyZXFfbGlzdC5hdm9pZEZyZXFSYW5nZUNvdW50ID0gMTsKKwkJCWhkZF9hdm9pZF9mcmVxX2xpc3QuYXZvaWRGcmVxUmFuZ2VbMF0uc3RhcnRGcmVxID0gZnJlcTsKKwkJCWhkZF9hdm9pZF9mcmVxX2xpc3QuYXZvaWRGcmVxUmFuZ2VbMF0uZW5kRnJlcSA9IGZyZXE7CisJCQl3bGFuX2hkZF9zZW5kX2F2b2lkX2ZyZXFfZXZlbnQoaGRkX2N0eCwKKwkJCQkJJmhkZF9hdm9pZF9mcmVxX2xpc3QpOworCQkJY2RzX2luZm8oIj09PT5TZW5kaW5nIGNobmxfYXZvaWQgY2hbJWRdIGZyZXFbJWRdIiwKKwkJCQlwMnBnb19jaGFubmVsX251bSwgZnJlcSk7CisJCQljZHNfaW5mbygiPT5TdG9wIEdPIGR1ZSB0byBtaXNtYXRjaCB3aXRoIFNUQSBjaGFubmVsIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSB7CisJCQljZHNfaW5mbygiPT09PnAycGdvIGNoYW5uZWxzIGFyZSBzYW1lIik7CisJCQlzdGF0dXMgPSBzbWVfc2Nhbl9yZXN1bHRfcHVyZ2UoCisJCQkJCVdMQU5fSEREX0dFVF9IQUxfQ1RYKHN0YV9hZGFwdGVyKSwKKwkJCQkJc2Nhbl9jYWNoZSk7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQkJCWNkc19lcnIoInNtZV9zY2FuX3Jlc3VsdF9wdXJnZSBmYWlsZWQiKTsKKwkJCQkvKiBOb3QgcmV0dXJuaW5nICovCisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworLyoqCisgKiBjZHNfaGFuZGxlX2NvbmNfcnVsZTEoKSAtIENoZWNrIGlmIGNvbmN1cnJlbmN5IHJ1bGUxIGlzIGVuYWJsZWQKKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQGFkYXB0ZXI6IEhERCBhZHBhdGVyCisgKiBAcm9hbV9wcm9maWxlOiBQcm9maWxlIGZvciBjb25uZWN0aW9uCisgKgorICogQ2hlY2sgaWYgY29uY3VycmVuY3kgcnVsZTEgaXMgZW5hYmxlZC4gQXMgcGVyIHJ1bGUxLCBpZiBzdGF0aW9uIGlzIHRyeWluZyB0bworICogY29ubmVjdCB0byBzb21lIEFQIGluIDIuNEdoeiBhbmQgU0FQIGlzIGFscmVhZHkgaW4gc3RhcnRlZCBzdGF0ZSB0aGVuIFNBUAorICogc2hvdWxkIHJlc3RhcnQgaW4gc3RhdGlvbidzCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgY2RzX2hhbmRsZV9jb25jX3J1bGUxKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCXRDc3JSb2FtUHJvZmlsZSAqcm9hbV9wcm9maWxlKQoreworCWJvb2wgcmV0OworCisJLyoKKwkgKiBDdXN0b20gY29uY3VycmVuY3kgcnVsZTE6IEFzIHBlciB0aGlzIHJ1bGUgaWYgc3RhdGlvbiBpcworCSAqIHRyeWluZyB0byBjb25uZWN0IHRvIHNvbWUgQVAgaW4gMi40R2h6IGFuZCBTQVAgaXMgYWxyZWFkeQorCSAqIGluIHN0YXJ0ZWQgc3RhdGUgdGhlbiBTQVAgc2hvdWxkIHJlc3RhcnQgaW4gc3RhdGlvbidzCisJICogY2hhbm5lbC4KKwkgKi8KKwlpZiAoaGRkX2N0eC0+Y29uZmlnLT5jb25jX2N1c3RvbV9ydWxlMSAmJgorCQkJKFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gYWRhcHRlci0+ZGV2aWNlX21vZGUpKSB7CisJCXJldCA9IGNkc19zdGFfc2FwX2NvbmN1cl9oYW5kbGUoaGRkX2N0eCwgYWRhcHRlciwKKwkJCQlyb2FtX3Byb2ZpbGUpOworCQlpZiAodHJ1ZSAhPSByZXQpIHsKKwkJCWNkc19lcnIoImNkc19zdGFfc2FwX2NvbmN1cl9oYW5kbGUgZmFpbGVkIik7CisJCQkvKiBOb3RoaW5nIHRvIGRvIGZvciBub3cgKi8KKwkJfQorCX0KK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAorLyoqCisgKiBjZHNfaGFuZGxlX2NvbmNfcnVsZTIoKSAtIENoZWNrIGlmIGNvbmN1cnJlbmN5IHJ1bGUyIGlzIGVuYWJsZWQKKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQGFkYXB0ZXI6IEhERCBhZHBhdGVyCisgKiBAcm9hbV9wcm9maWxlOiBQcm9maWxlIGZvciBjb25uZWN0aW9uCisgKgorICogQ2hlY2sgaWYgY29uY3VycmVuY3kgcnVsZTEgaXMgZW5hYmxlZC4gQXMgcGVyIHJ1bGUxLCBpZiBzdGF0aW9uIGlzIHRyeWluZyB0bworICogY29ubmVjdCB0byBzb21lIEFQIGluIDVHaHogYW5kIFAyUEdPIGlzIGFscmVhZHkgaW4gc3RhcnRlZCBzdGF0ZSB0aGVuIFAyUEdPCisgKiBzaG91bGQgcmVzdGFydCBpbiBzdGF0aW9uJ3MgY2hhbm5lbAorICoKKyAqIFJldHVybjogTm9uZQorICovCitib29sIGNkc19oYW5kbGVfY29uY19ydWxlMihoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQloZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQl0Q3NyUm9hbVByb2ZpbGUgKnJvYW1fcHJvZmlsZSwKKwkJdWludDMyX3QgKnJvYW1faWQpCit7CisJLyoKKwkgKiBDdXN0b20gY29uY3VycmVuY3kgcnVsZTI6IEFzIHBlciB0aGlzIHJ1bGUgaWYgc3RhdGlvbiBpcworCSAqIHRyeWluZyB0byBjb25uZWN0IHRvIHNvbWUgQVAgaW4gNUdoeiBhbmQgUDJQR08gaXMgYWxyZWFkeSBpbgorCSAqIHN0YXJ0ZWQgc3RhdGUgdGhlbiBQMlBHTyBzaG91bGQgcmVzdGFydCBpbiBzdGF0aW9uJ3MgY2hhbm5lbC4KKwkgKi8KKwlpZiAoaGRkX2N0eC0+Y29uZmlnLT5jb25jX2N1c3RvbV9ydWxlMiAmJgorCQkoV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJaWYgKGZhbHNlID09IGNkc19zdGFfcDJwZ29fY29uY3VyX2hhbmRsZShoZGRfY3R4LAorCQkJCQlhZGFwdGVyLCByb2FtX3Byb2ZpbGUsIHJvYW1faWQpKSB7CisJCQljZHNfZXJyKCJQMlBHTy1TVEEgY2hubCBkaWZmLCBjYWNoZSBqb2luIHJlcSIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXJldHVybiB0cnVlOworfQorI2VuZGlmCisKKy8qKgorICogY2RzX2dldF9jaGFubmVsX2Zyb21fc2Nhbl9yZXN1bHQoKSAtIHRvIGdldCBjaGFubmVsIGZyb20gc2NhbiByZXN1bHQKKyAqIEBhZGFwdGVyOiBzdGF0aW9uIGFkYXB0ZXIKKyAqIEByb2FtX3Byb2ZpbGU6IHBvaW50ZXIgdG8gcm9hbSBwcm9maWxlCisgKiBAY2hhbm5lbDogY2hhbm5lbCB0byBiZSBmaWxsZWQKKyAqCisgKiBUaGlzIHJvdXRpbmUgZ2V0cyBjaGFubmVsIHdoaWNoIG1vc3QgbGlrZWx5IGEgY2FuZGlkYXRlIHRvIHdoaWNoIFNUQQorICogd2lsbCBtYWtlIGNvbm5lY3Rpb24uCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgY2RzX2dldF9jaGFubmVsX2Zyb21fc2Nhbl9yZXN1bHQoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCXRDc3JSb2FtUHJvZmlsZSAqcm9hbV9wcm9maWxlLCB1aW50OF90ICpjaGFubmVsKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRTY2FuUmVzdWx0SGFuZGxlIHNjYW5fY2FjaGUgPSBOVUxMOworCisJc3RhdHVzID0gc21lX2dldF9hcF9jaGFubmVsX2Zyb21fc2Nhbl9jYWNoZSgKKwkJCQlXTEFOX0hERF9HRVRfSEFMX0NUWChhZGFwdGVyKSwKKwkJCQlyb2FtX3Byb2ZpbGUsICZzY2FuX2NhY2hlLAorCQkJCWNoYW5uZWwpOworCXNtZV9zY2FuX3Jlc3VsdF9wdXJnZShXTEFOX0hERF9HRVRfSEFMX0NUWChhZGFwdGVyKSwgc2Nhbl9jYWNoZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjZHNfaGFuZGxlX2NvbmNfbXVsdGlwb3J0KCkgLSB0byBoYW5kbGUgbXVsdGlwb3J0IGNvbmN1cnJlbmN5CisgKiBAc2Vzc2lvbl9pZDogU2Vzc2lvbiBJRAorICogQGNoYW5uZWw6IENoYW5uZWwgbnVtYmVyCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgaGFuZGxlIFNUQSBzaWRlIGNvbmN1cnJlbmN5IHdoZW4gcG9saWN5IG1hbmFnZXIKKyAqIGlzIGVuYWJsZWQuCisgKgorICogUmV0dXJuOiB0cnVlIG9yIGZhbHNlCisgKi8KK2Jvb2wgY2RzX2hhbmRsZV9jb25jX211bHRpcG9ydCh1aW50OF90IHNlc3Npb25faWQsCisJCXVpbnQ4X3QgY2hhbm5lbCkKK3sKKwlib29sIHJldCA9IHRydWU7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJcF9jZHNfY29udGV4dFR5cGUgY2RzX2NvbnRleHQ7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCisJY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFjZHNfY29udGV4dCkgeworCQljZHNfZXJyKCJJbnZhbGlkIENEUyBjb250ZXh0Iik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwloZGRfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoIWhkZF9jdHgpIHsKKwkJY2RzX2VycigiSW52YWxpZCBIREQgY29udGV4dCIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcl9ieV92ZGV2KGhkZF9jdHgsIHNlc3Npb25faWQpOworCWlmICghYWRhcHRlcikgeworCQljZHNfZXJyKCJJbnZhbGlkIEhERCBhZGFwdGVyIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCWNkc19lcnIoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgMCIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qIFRha2UgY2FyZSBvZiAxNjBNSHogYW5kIDgwKzgwTWh6IGxhdGVyICovCisJcmV0ID0gY2RzX2FsbG93X2NvbmN1cnJlbmN5KGhkZF9jdHgsCisJCWNkc19jb252ZXJ0X2RldmljZV9tb2RlX3RvX2hkZF90eXBlKAorCQkJYWRhcHRlci0+ZGV2aWNlX21vZGUpLAorCQljaGFubmVsLCBIV19NT0RFXzIwX01IWik7CisJaWYgKGZhbHNlID09IHJldCkgeworCQljZHNfZXJyKCJDb25uZWN0aW9uIGZhaWxlZCBkdWUgdG8gY29uYyBjaGVjayBmYWlsIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzdGF0dXMgPSBjZGZfZXZlbnRfcmVzZXQoJmNkc19jb250ZXh0LT5jb25uZWN0aW9uX3VwZGF0ZV9kb25lX2V2dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJY2RzX2VycigiY2xlYXJpbmcgZXZlbnQgZmFpbGVkIik7CisKKwlzdGF0dXMgPSBjZHNfY3VycmVudF9jb25uZWN0aW9uc191cGRhdGUoaGRkX2N0eCwgY2hhbm5lbCk7CisJaWYgKENERl9TVEFUVVNfRV9GQUlMVVJFID09IHN0YXR1cykgeworCQljZHNfZXJyKCJjb25uZWN0aW9ucyB1cGRhdGUgZmFpbGVkIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJLyoKKwkgKiB3YWl0IG9ubHkgaWYgc3RhdHVzIGlzIHN1Y2Nlc3NmdWwuIGNvbm5lY3Rpb24gdXBkYXRlIEFQSQorCSAqIHdpbGwgcmV0dXJuIHN1Y2Nlc3Mgb25seSBpbiBjYXNlIGlmIERCUyB1cGRhdGUgaXMgcmVxdWlyZWQuCisJICovCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJc3RhdHVzID0gY2RmX3dhaXRfc2luZ2xlX2V2ZW50KAorCQkJICAgICZjZHNfY29udGV4dC0+Y29ubmVjdGlvbl91cGRhdGVfZG9uZV9ldnQsIDUwMCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWNkc19lcnIoIndhaXQgZm9yIGV2ZW50IGZhaWxlZCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXJldHVybiB0cnVlOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MKKy8qKgorICogY2RzX3Jlc3RhcnRfc29mdGFwKCkgLSByZXN0YXJ0IFNBUCBvbiBTVEEgY2hhbm5lbCB0byBzdXBwb3J0CisgKiBTVEEgKyBTQVAgY29uY3VycmVuY3kuCisgKgorICogQGhkZF9jdHg6IHBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqIEBwSG9zdGFwZEFkYXB0ZXI6IHBvaW50ZXIgdG8gaGRkIGFkYXB0ZXIKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfcmVzdGFydF9zb2Z0YXAoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyKQoreworCXRIZGRBdm9pZEZyZXFMaXN0IGhkZF9hdm9pZF9mcmVxX2xpc3Q7CisKKwkvKiBnZW5lcmF0ZSB2ZW5kb3Igc3BlY2lmaWMgZXZlbnQgKi8KKwljZGZfbWVtX3plcm8oKHZvaWQgKikmaGRkX2F2b2lkX2ZyZXFfbGlzdCwgc2l6ZW9mKHRIZGRBdm9pZEZyZXFMaXN0KSk7CisJaGRkX2F2b2lkX2ZyZXFfbGlzdC5hdm9pZEZyZXFSYW5nZVswXS5zdGFydEZyZXEgPQorCQljZHNfY2hhbl90b19mcmVxKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC4KKwkJCQlvcGVyYXRpbmdDaGFubmVsKTsKKwloZGRfYXZvaWRfZnJlcV9saXN0LmF2b2lkRnJlcVJhbmdlWzBdLmVuZEZyZXEgPQorCQljZHNfY2hhbl90b19mcmVxKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC4KKwkJCQlvcGVyYXRpbmdDaGFubmVsKTsKKwloZGRfYXZvaWRfZnJlcV9saXN0LmF2b2lkRnJlcVJhbmdlQ291bnQgPSAxOworCXdsYW5faGRkX3NlbmRfYXZvaWRfZnJlcV9ldmVudChoZGRfY3R4LCAmaGRkX2F2b2lkX2ZyZXFfbGlzdCk7Cit9CisKKy8qKgorICogY2RzX2ZvcmNlX3NhcF9vbl9zY2MoKSAtIEZvcmNlIFNBUCBvbiBTQ0MKKyAqIEBoZGRfY3R4OiBQb2ludGVyIHRvIEhERCBjb250ZXh0CisgKiBAcm9hbV9yZXN1bHQ6IFJvYW0gcmVzdWx0CisgKgorICogUmVzdGFydHMgU0FQIG9uIFNDQyBpZiBpdHMgb3BlcmF0aW5nIGNoYW5uZWwgaXMgZGlmZmVyZW50IGZyb20gdGhhdCBvZiB0aGUKKyAqIFNUQS1BUCBpbnRlcmZhY2UKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfZm9yY2Vfc2FwX29uX3NjYyhoZGRfY29udGV4dF90ICpoZGRfY3R4LCBlQ3NyUm9hbVJlc3VsdCByb2FtX3Jlc3VsdCkKK3sKKwloZGRfYWRhcHRlcl90ICpob3N0YXBkX2FkYXB0ZXI7CisKKwlpZiAoIShlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQgPT0gcm9hbV9yZXN1bHQgJiYKKwkJaGRkX2N0eC0+Y29uZmlnLT5TYXBTY2NDaGFuQXZvaWRhbmNlKSkgeworCQljZHNfZXJyKCJOb3QgYWJsZSB0byBmb3JjZSBTQVAgb24gU0NDIik7CisJCXJldHVybjsKKwl9CisJaG9zdGFwZF9hZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKGhkZF9jdHgsIFdMQU5fSEREX1NPRlRBUCk7CisJaWYgKGhvc3RhcGRfYWRhcHRlciAhPSBOVUxMKSB7CisJCS8qIFJlc3RhcnQgU0FQIGlmIGl0cyBvcGVyYXRpbmcgY2hhbm5lbCBpcyBkaWZmZXJlbnQKKwkJICogZnJvbSBBUCBjaGFubmVsLgorCQkgKi8KKwkJaWYgKGhvc3RhcGRfYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5vcGVyYXRpbmdDaGFubmVsICE9CisJCQkJcFJvYW1JbmZvLT5wQnNzRGVzYy0+Y2hhbm5lbElkKSB7CisJCQljZHNfZXJyKCJSZXN0YXJ0IFNBUDogU0FQIGNoYW5uZWwtJWQsIFNUQSBjaGFubmVsLSVkIiwKKwkJCQlob3N0YXBkX2FkYXB0ZXItPnNlc3Npb25DdHguYXAub3BlcmF0aW5nQ2hhbm5lbCwKKwkJCQlwUm9hbUluZm8tPnBCc3NEZXNjLT5jaGFubmVsSWQpOworCQkJY2RzX3Jlc3RhcnRfc29mdGFwKGhkZF9jdHgsIGhvc3RhcGRfYWRhcHRlcik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCisvKioKKyAqIGNkc19jaGVja19zdGFfYXBfY29uY3VycmVudF9jaF9pbnRmKCkgLSBSZXN0YXJ0IFNBUCBpbiBTVEEtQVAgY2FzZQorICogQGRhdGE6IFBvaW50ZXIgdG8gU1RBIGFkYXB0ZXIKKyAqCisgKiBSZXN0YXJ0cyB0aGUgU0FQIGludGVyZmFjZSBpbiBTVEEtQVAgY29uY3VycmVuY3kgc2NlbmFyaW8KKyAqCisgKiBSZXN0YXJ0OiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGNkc19jaGVja19zdGFfYXBfY29uY3VycmVudF9jaF9pbnRmKHZvaWQgKmRhdGEpCit7CisJaGRkX2FkYXB0ZXJfdCAqYXBfYWRhcHRlciA9IE5VTEwsICpzdGFfYWRhcHRlciA9IChoZGRfYWRhcHRlcl90ICopIGRhdGE7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoc3RhX2FkYXB0ZXIpOworCXRIYWxIYW5kbGUgKmhhbF9oYW5kbGU7CisJaGRkX2FwX2N0eF90ICpoZGRfYXBfY3R4OworCXVpbnQxNl90IGludGZfY2ggPSAwOworCisJaWYgKChoZGRfY3R4LT5jb25maWctPldsYW5NY2NUb1NjY1N3aXRjaE1vZGUgPT0KKwkJCQlDREZfTUNDX1RPX1NDQ19TV0lUQ0hfRElTQUJMRSkKKwkJCXx8ICEoY2RzX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKCkKKwkJCSAgICB8fCAhKGNkc19nZXRfY29uY3VycmVuY3lfbW9kZSgpID09CisJCQkJCShDREZfU1RBX01BU0sgfCBDREZfU0FQX01BU0spKSkpCisJCXJldHVybjsKKworCWFwX2FkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIoaGRkX2N0eCwgV0xBTl9IRERfU09GVEFQKTsKKwlpZiAoYXBfYWRhcHRlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoIXRlc3RfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJmFwX2FkYXB0ZXItPmV2ZW50X2ZsYWdzKSkKKwkJcmV0dXJuOworCisJaGRkX2FwX2N0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKGFwX2FkYXB0ZXIpOworCWhhbF9oYW5kbGUgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChhcF9hZGFwdGVyKTsKKworCWlmIChoYWxfaGFuZGxlID09IE5VTEwpCisJCXJldHVybjsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwlpbnRmX2NoID0gd2xhbnNhcF9jaGVja19jY19pbnRmKGhkZF9hcF9jdHgtPnNhcENvbnRleHQpOworI2Vsc2UKKwlpbnRmX2NoID0gd2xhbnNhcF9jaGVja19jY19pbnRmKGhkZF9jdHgtPnBjZHNfY29udGV4dCk7CisjZW5kaWYKKwlpZiAoaW50Zl9jaCA9PSAwKQorCQlyZXR1cm47CisKKwloZGRfYXBfY3R4LT5zYXBDb25maWcuY2hhbm5lbCA9IGludGZfY2g7CisJaGRkX2FwX2N0eC0+c2FwQ29uZmlnLmNoX3BhcmFtcy5jaF93aWR0aCA9CisJCWhkZF9hcF9jdHgtPnNhcENvbmZpZy5jaF93aWR0aF9vcmlnOworCXNtZV9zZXRfY2hfcGFyYW1zKGhhbF9oYW5kbGUsCisJCQloZGRfYXBfY3R4LT5zYXBDb25maWcuU2FwSHdfbW9kZSwKKwkJCWhkZF9hcF9jdHgtPnNhcENvbmZpZy5jaGFubmVsLAorCQkJaGRkX2FwX2N0eC0+c2FwQ29uZmlnLnNlY19jaCwKKwkJCSZoZGRfYXBfY3R4LT5zYXBDb25maWcuY2hfcGFyYW1zKTsKKwljZHNfcmVzdGFydF9zYXAoYXBfYWRhcHRlcik7Cit9CisvKioKKyAqIGNkc19jaGVja19jb25jdXJyZW50X2ludGZfYW5kX3Jlc3RhcnRfc2FwKCkgLSBDaGVjayBjb25jdXJyZW50IGNoYW5nZSBpbnRmCisgKiBAaGRkX2N0eDogUG9pbnRlciB0byBIREQgY29udGV4dAorICogQGhkZF9zdGFfY3R4OiBQb2ludGVyIHRvIEhERCBTVEEgY29udGV4dAorICoKKyAqIENoZWNrcyB0aGUgY29uY3VycmVudCBjaGFuZ2UgaW50ZXJmYWNlIGFuZCByZXN0YXJ0cyBTQVAKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNkc19jaGVja19jb25jdXJyZW50X2ludGZfYW5kX3Jlc3RhcnRfc2FwKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCWhkZF9zdGF0aW9uX2N0eF90ICpoZGRfc3RhX2N0eCwgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlpZiAoKGhkZF9jdHgtPmNvbmZpZy0+V2xhbk1jY1RvU2NjU3dpdGNoTW9kZQorCQkJCSE9IENERl9NQ0NfVE9fU0NDX1NXSVRDSF9ESVNBQkxFKSAmJgorCQkJKCgwID09IGhkZF9jdHgtPmNvbmZpZy0+Y29uY19jdXN0b21fcnVsZTEpICYmCisJCQkgKDAgPT0gaGRkX2N0eC0+Y29uZmlnLT5jb25jX2N1c3RvbV9ydWxlMikpCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NUQV9BUF9NT0RFX0RGU19ESVNBQkxFCisJCQkmJiAhQ0RTX0lTX0RGU19DSChoZGRfc3RhX2N0eC0+Y29ubl9pbmZvLgorCQkJCW9wZXJhdGlvbkNoYW5uZWwpCisjZW5kaWYKKwkgICApIHsKKwkJY2RmX2NyZWF0ZV93b3JrKDAsICZoZGRfY3R4LT5zdGFfYXBfaW50Zl9jaGVja193b3JrLAorCQkJCWNkc19jaGVja19zdGFfYXBfY29uY3VycmVudF9jaF9pbnRmLAorCQkJCSh2b2lkICopYWRhcHRlcik7CisJCWNkZl9zY2hlZF93b3JrKDAsICZoZGRfY3R4LT5zdGFfYXBfaW50Zl9jaGVja193b3JrKTsKKwkJY2RzX2luZm8oIkNoZWNraW5nIGZvciBDb25jdXJyZW50IENoYW5nZSBpbnRlcmZlcmVuY2UiKTsKKwl9Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENIICovCisKKy8qKgorICogY2RzX2lzX21jY19pbl8yNEcoKSAtIEZ1bmN0aW9uIHRvIGNoZWNrIGZvciBNQ0MgaW4gMi40R0h6CisgKiBAaGRkX2N0eDogICAgUG9pbnRlciB0byBIREQgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayBmb3IgTUNDIG9wZXJhdGlvbiBpbiAyLjRHSHogYmFuZC4KKyAqIFNUQSwgUDJQIGFuZCBTQVAgYWRhcHRlcnMgYXJlIG9ubHkgY29uc2lkZXJlZC4KKyAqCisgKiBSZXR1cm46IE5vbiB6ZXJvIHZhbHVlIGlmIE1DQyBpcyBkZXRlY3RlZCBpbiAyLjRHSHogYmFuZAorICoKKyAqLwordWludDhfdCBjZHNfaXNfbWNjX2luXzI0RyhoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCWhkZF9hZGFwdGVyX3QgKmhkZF9hZGFwdGVyID0gTlVMTDsKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlcl9ub2RlID0gTlVMTCwgKm5leHQgPSBOVUxMOworCXVpbnQ4X3QgcmV0ID0gMDsKKwloZGRfc3RhdGlvbl9jdHhfdCAqc3RhX2N0eDsKKwloZGRfYXBfY3R4X3QgKmFwX2N0eDsKKwl1aW50OF90IGNoMSA9IDAsIGNoMiA9IDA7CisJdWludDhfdCBjaGFubmVsID0gMDsKKwloZGRfaG9zdGFwZF9zdGF0ZV90ICpob3N0YXBkX3N0YXRlOworCisJc3RhdHVzID0gIGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlcl9ub2RlKTsKKworCS8qIGxvb3AgdGhyb3VnaCBhbGwgYWRhcHRlcnMgYW5kIGNoZWNrIE1DQyBmb3IgU1RBLFAyUCxTQVAgYWRhcHRlcnMgKi8KKwl3aGlsZSAoTlVMTCAhPSBhZGFwdGVyX25vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQloZGRfYWRhcHRlciA9IGFkYXB0ZXJfbm9kZS0+cEFkYXB0ZXI7CisKKwkJaWYgKCEoKGhkZF9hZGFwdGVyLT5kZXZpY2VfbW9kZSA+PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKQorCQkJCQl8fCAoaGRkX2FkYXB0ZXItPmRldmljZV9tb2RlCisJCQkJCQk8PSBXTEFOX0hERF9QMlBfR08pKSkgeworCQkJLyogc2tpcCBmb3Igb3RoZXIgYWRhcHRlcnMgKi8KKwkJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsCisJCQkJCWFkYXB0ZXJfbm9kZSwgJm5leHQpOworCQkJYWRhcHRlcl9ub2RlID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09CisJCQkJaGRkX2FkYXB0ZXItPmRldmljZV9tb2RlIHx8CisJCQkJV0xBTl9IRERfUDJQX0NMSUVOVCA9PQorCQkJCWhkZF9hZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQkJc3RhX2N0eCA9CisJCQkJV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUigKKwkJCQkJCWhkZF9hZGFwdGVyKTsKKwkJCWlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0KKwkJCQkJc3RhX2N0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKwkJCQljaGFubmVsID0KKwkJCQkJc3RhX2N0eC0+Y29ubl9pbmZvLgorCQkJCQlvcGVyYXRpb25DaGFubmVsOworCQl9IGVsc2UgaWYgKFdMQU5fSEREX1AyUF9HTyA9PQorCQkJCWhkZF9hZGFwdGVyLT5kZXZpY2VfbW9kZSB8fAorCQkJCVdMQU5fSEREX1NPRlRBUCA9PQorCQkJCWhkZF9hZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQkJYXBfY3R4ID0gV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIoaGRkX2FkYXB0ZXIpOworCQkJaG9zdGFwZF9zdGF0ZSA9CisJCQkJV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIoCisJCQkJCQloZGRfYWRhcHRlcik7CisJCQlpZiAoaG9zdGFwZF9zdGF0ZS0+YnNzU3RhdGUgPT0gQlNTX1NUQVJUICYmCisJCQkJCWhvc3RhcGRfc3RhdGUtPmNkZl9zdGF0dXMgPT0KKwkJCQkJQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJCWNoYW5uZWwgPSBhcF9jdHgtPm9wZXJhdGluZ0NoYW5uZWw7CisJCX0KKworCQlpZiAoKGNoMSA9PSAwKSB8fAorCQkJCSgoY2gyICE9IDApICYmIChjaDIgIT0gY2hhbm5lbCkpKSB7CisJCQljaDEgPSBjaGFubmVsOworCQl9IGVsc2UgaWYgKChjaDIgPT0gMCkgfHwKKwkJCQkoKGNoMSAhPSAwKSAmJiAoY2gxICE9IGNoYW5uZWwpKSkgeworCQkJY2gyID0gY2hhbm5lbDsKKwkJfQorCisJCWlmICgoY2gxICE9IDAgJiYgY2gyICE9IDApICYmIChjaDEgIT0gY2gyKSAmJgorCQkJCSgoY2gxIDw9IFNJUl8xMUJfQ0hBTk5FTF9FTkQpICYmCisJCQkJIChjaDIgPD0gU0lSXzExQl9DSEFOTkVMX0VORCkpKSB7CisJCQljZHNfZXJyKCJNQ0MgaW4gMi40R2h6IG9uIGNoYW5uZWxzICVkIGFuZCAlZCIsCisJCQkJY2gxLCBjaDIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIoaGRkX2N0eCwKKwkJCQlhZGFwdGVyX25vZGUsICZuZXh0KTsKKwkJYWRhcHRlcl9ub2RlID0gbmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBjZHNfc2V0X21hcygpIC0gRnVuY3Rpb24gdG8gc2V0IE1BUyB2YWx1ZSB0byBVTUFDCisgKiBAYWRhcHRlcjogICAgICAgICAgICBQb2ludGVyIHRvIEhERCBhZGFwdGVyCisgKiBAbWFzX3ZhbHVlOiAgICAgICAgICAwLURpc2FibGUsIDEtRW5hYmxlIE1BUworICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFzc2VzIGRvd24gdGhlIHZhbHVlIG9mIE1BUyB0byBVTUFDCisgKgorICogUmV0dXJuOiBDb25maWd1cmF0aW9uIG1lc3NhZ2UgcG9zdGluZyBzdGF0dXMsIFNVQ0NFU1Mgb3IgRmFpbAorICoKKyAqLworaW50MzJfdCBjZHNfc2V0X21hcyhoZGRfYWRhcHRlcl90ICphZGFwdGVyLCB1aW50OF90IG1hc192YWx1ZSkKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gTlVMTDsKKwlDREZfU1RBVFVTIHJldF9zdGF0dXM7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwlpZiAoIWhkZF9jdHgpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG1hc192YWx1ZSkgeworCQkvKiBNaXJhY2FzdCBpcyBPTi4gRGlzYWJsZSBNQVMgYW5kIGNvbmZpZ3VyZSBQMlAgcXVvdGEgKi8KKwkJaWYgKGhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlTUNDQWRhcHRpdmVTY2hlZHVsZXIpIHsKKwkJCWlmIChjZmdfc2V0X2ludChoZGRfY3R4LT5oSGFsLAorCQkJCQlXTklfQ0ZHX0VOQUJMRV9NQ0NfQURBUFRJVkVfU0NIRUQsIDApCisJCQkJCSE9IGVTSVJfU1VDQ0VTUykgeworCQkJCWNkc19lcnIoIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfRU5BQkxFX01DQ19BREFQVElWRV9TQ0hFRCB0byBDQ00iKTsKKwkJCX0KKwkJCXJldF9zdGF0dXMgPSBzbWVfc2V0X21hcyhmYWxzZSk7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHJldF9zdGF0dXMpIHsKKwkJCQljZHNfZXJyKCJGYWlsZWQgdG8gZGlzYWJsZSBNQVMiKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQl9CisKKwkJLyogQ29uZmlnIHAycCBxdW90YSAqLworCQlpZiAoYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikKKwkJCWNkc19zZXRfbWNjX3AycF9xdW90YShhZGFwdGVyLAorCQkJCQkxMDAgLSBIRERfREVGQVVMVF9NQ0NfUDJQX1FVT1RBKTsKKwkJZWxzZSBpZiAoYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKQorCQkJY2RzX2dvX3NldF9tY2NfcDJwX3F1b3RhKGFkYXB0ZXIsCisJCQkJCUhERF9ERUZBVUxUX01DQ19QMlBfUVVPVEEpOworCQllbHNlCisJCQljZHNfc2V0X21jY19wMnBfcXVvdGEoYWRhcHRlciwKKwkJCQkJSEREX0RFRkFVTFRfTUNDX1AyUF9RVU9UQSk7CisJfSBlbHNlIHsKKwkJLyogUmVzZXQgcDJwIHF1b3RhICovCisJCWlmIChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pCisJCQljZHNfZ29fc2V0X21jY19wMnBfcXVvdGEoYWRhcHRlciwKKwkJCQkJSEREX1JFU0VUX01DQ19QMlBfUVVPVEEpOworCQllbHNlCisJCQljZHNfc2V0X21jY19wMnBfcXVvdGEoYWRhcHRlciwKKwkJCQkJSEREX1JFU0VUX01DQ19QMlBfUVVPVEEpOworCisJCS8qIE1pcmFjYXN0IGlzIE9GRi4gRW5hYmxlIE1BUyBhbmQgcmVzZXQgUDJQIHF1b3RhICovCisJCWlmIChoZGRfY3R4LT5jb25maWctPmVuYWJsZU1DQ0FkYXB0aXZlU2NoZWR1bGVyKSB7CisJCQlpZiAoY2ZnX3NldF9pbnQoaGRkX2N0eC0+aEhhbCwKKwkJCQkJV05JX0NGR19FTkFCTEVfTUNDX0FEQVBUSVZFX1NDSEVELCAxKQorCQkJCQkhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCQljZHNfZXJyKCJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0VOQUJMRV9NQ0NfQURBUFRJVkVfU0NIRUQgdG8gQ0NNIik7CisJCQl9CisKKwkJCS8qIEVuYWJsZSBNQVMgKi8KKwkJCXJldF9zdGF0dXMgPSBzbWVfc2V0X21hcyh0cnVlKTsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gcmV0X3N0YXR1cykgeworCQkJCWNkc19lcnIoIlVuYWJsZSB0byBlbmFibGUgTUFTIik7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNkc19zZXRfbWNjX3AycF9xdW90YSgpIC0gRnVuY3Rpb24gdG8gc2V0IHF1b3RhIGZvciBQMlAKKyAqIEBob3N0YXBkX2FkYXB0ZXI6ICAgIFBvaW50ZXIgdG8gSEREIGFkYXB0ZXIKKyAqIEBzZXRfdmFsdWU6ICAgICAgICAgIFFvdXRhIHZhbHVlIGZvciB0aGUgaW50ZXJmYWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcXVvdGEgZm9yIFAyUCBjYXNlcworICoKKyAqIFJldHVybjogQ29uZmlndXJhdGlvbiBtZXNzYWdlIHBvc3Rpbmcgc3RhdHVzLCBTVUNDRVNTIG9yIEZhaWwKKyAqCisgKi8KK2ludDMyX3QgY2RzX3NldF9tY2NfcDJwX3F1b3RhKGhkZF9hZGFwdGVyX3QgKmhvc3RhcGRfYWRhcGF0ZXIsCisJCXVpbnQzMl90IHNldF92YWx1ZSkKK3sKKwl1aW50OF90IGZpcnN0X2FkYXB0ZXJfb3BlcmF0aW5nX2NoYW5uZWwgPSAwOworCXVpbnQ4X3Qgc2Vjb25kX2FkYXB0ZXJfb3BlcnRhaW5nX2NoYW5uZWwgPSAwOworCWhkZF9hZGFwdGVyX3QgKnN0YV9hZGFwdGVyID0gTlVMTDsKKwlpbnQzMl90IHJldCA9IDA7IC8qIHN1Y2Nlc3MgKi8KKworCXVpbnQzMl90IGNvbmN1cnJlbnRfc3RhdGUgPSBjZHNfZ2V0X2NvbmN1cnJlbmN5X21vZGUoKTsKKworCS8qCisJICogQ2hlY2sgaWYgY29uY3VycmVuY3kgbW9kZSBpcyBhY3RpdmUuCisJICogTmVlZCB0byBtb2RpZnkgdGhpcyBjb2RlIHRvIHN1cHBvcnQgTUNDIG1vZGVzIG90aGVyIHRoYW4gU1RBL1AyUAorCSAqLworCWlmICgoY29uY3VycmVudF9zdGF0ZSA9PSAoQ0RGX1NUQV9NQVNLIHwgQ0RGX1AyUF9DTElFTlRfTUFTSykpIHx8CisJCShjb25jdXJyZW50X3N0YXRlID09IChDREZfU1RBX01BU0sgfCBDREZfUDJQX0dPX01BU0spKSkgeworCQljZHNfaW5mbygiU1RBICYgUDJQIGFyZSBib3RoIGVuYWJsZWQiKTsKKwkJLyoKKwkJICogVGhlIGNoYW5uZWwgbnVtYmVycyBmb3IgYm90aCBhZGFwdGVycyBhbmQgdGhlIHRpbWUKKwkJICogcXVvdGEgZm9yIHRoZSAxc3QgYWRhcHRlciwgaS5lLiwgb25lIHNwZWNpZmllZCBpbiBjbWQKKwkJICogYXJlIGZvcm1hdHRlZCBhcyBhIGJpdCB2ZWN0b3IgdGhlbiBwYXNzZWQgb24gdG8gV01BCisJCSAqICsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKisKKwkJICogfGJpdCAzMS0yNCAgfCBiaXQgMjMtMTYgIHwgICBiaXRzIDE1LTggICB8ICAgYml0cyA3LTAgICAgICAgfAorCQkgKiB8ICBVbnVzZWQgICB8IFF1b3RhIGZvciAgfCBjaGFuLiAjIGZvciAgIHwgICBjaGFuLiAjIGZvciAgICB8CisJCSAqIHwgICAgICAgICAgIHwgMXN0IGNoYW4uICB8IDFzdCBjaGFuLiAgICAgfCAgIDJuZCBjaGFuLiAgICAgIHwKKwkJICogKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKworCQkgKi8KKwkJLyogR2V0IHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBvZiB0aGUgc3BlY2lmaWVkIHZkZXYgKi8KKwkJZmlyc3RfYWRhcHRlcl9vcGVyYXRpbmdfY2hhbm5lbCA9CisJCQloZGRfZ2V0X29wZXJhdGluZ19jaGFubmVsCisJCQkoCisJCQkgaG9zdGFwZF9hZGFwYXRlci0+cEhkZEN0eCwKKwkJCSBob3N0YXBkX2FkYXBhdGVyLT5kZXZpY2VfbW9kZQorCQkJKTsKKwkJY2RzX2luZm8oIjFzdCBjaGFubmVsIE5vLjolZCBhbmQgcXVvdGE6JWRtcyIsCisJCQlmaXJzdF9hZGFwdGVyX29wZXJhdGluZ19jaGFubmVsLCBzZXRfdmFsdWUpOworCQkvKiBNb3ZlIHRoZSB0aW1lIHF1b3RhIGZvciBmaXJzdCBjaGFubmVsIHRvIGJpdHMgMTUtOCAqLworCQlzZXRfdmFsdWUgPSBzZXRfdmFsdWUgPDwgODsKKwkJLyoKKwkJICogU3RvcmUgdGhlIGNoYW5uZWwgbnVtYmVyIG9mIDFzdCBjaGFubmVsIGF0IGJpdHMgNy0wCisJCSAqIG9mIHRoZSBiaXQgdmVjdG9yCisJCSAqLworCQlzZXRfdmFsdWUgPSBzZXRfdmFsdWUgfCBmaXJzdF9hZGFwdGVyX29wZXJhdGluZ19jaGFubmVsOworCQkvKiBGaW5kIG91dCB0aGUgMm5kIE1DQyBhZGFwdGVyIGFuZCBpdHMgb3BlcmF0aW5nIGNoYW5uZWwgKi8KKwkJaWYgKGhvc3RhcGRfYWRhcGF0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX0lORlJBX1NUQVRJT04pIHsKKwkJCS8qCisJCQkgKiBpd3ByaXYgY21kIHdhcyBpc3N1ZWQgb24gd2xhbjA7CisJCQkgKiBnZXQgcDJwMCB2ZGV2IGNoYW5uZWwKKwkJCSAqLworCQkJaWYgKChjb25jdXJyZW50X3N0YXRlICYgQ0RGX1AyUF9DTElFTlRfTUFTSykgIT0gMCkgeworCQkJCS8qIFRoZSAybmQgTUNDIHZkZXYgaXMgUDJQIGNsaWVudCAqLworCQkJCXN0YV9hZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKAorCQkJCQkJaG9zdGFwZF9hZGFwYXRlci0+cEhkZEN0eCwKKwkJCQkJCVdMQU5fSEREX1AyUF9DTElFTlQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGUgMm5kIE1DQyB2ZGV2IGlzIFAyUCBHTyAqLworCQkJCXN0YV9hZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKAorCQkJCQkJaG9zdGFwZF9hZGFwYXRlci0+cEhkZEN0eCwKKwkJCQkJCVdMQU5fSEREX1AyUF9HTyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogaXdwcml2IGNtZCB3YXMgaXNzdWVkIG9uIHAycDA7CisJCQkgKiBnZXQgd2xhbjAgdmRldiBjaGFubmVsCisJCQkgKi8KKwkJCXN0YV9hZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKGhvc3RhcGRfYWRhcGF0ZXItPnBIZGRDdHgsCisJCQkJCVdMQU5fSEREX0lORlJBX1NUQVRJT04pOworCQl9CisJCWlmIChzdGFfYWRhcHRlciAhPSBOVUxMKSB7CisJCQlzZWNvbmRfYWRhcHRlcl9vcGVydGFpbmdfY2hhbm5lbCA9CisJCQkJaGRkX2dldF9vcGVyYXRpbmdfY2hhbm5lbAorCQkJCSgKKwkJCQkgc3RhX2FkYXB0ZXItPnBIZGRDdHgsCisJCQkJIHN0YV9hZGFwdGVyLT5kZXZpY2VfbW9kZQorCQkJCSk7CisJCQljZHNfaW5mbygiMm5kIHZkZXYgY2hhbm5lbCBOby4gaXM6JWQiLAorCQkJCXNlY29uZF9hZGFwdGVyX29wZXJ0YWluZ19jaGFubmVsKTsKKworCQkJaWYgKHNlY29uZF9hZGFwdGVyX29wZXJ0YWluZ19jaGFubmVsID09IDAgfHwKKwkJCQkJZmlyc3RfYWRhcHRlcl9vcGVyYXRpbmdfY2hhbm5lbCA9PSAwKSB7CisJCQkJY2RzX2VycigiSW52YWxpZCBjaGFubmVsIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQkvKgorCQkJICogTm93IG1vdmUgdGhlIHRpbWUgcXVvdGEgYW5kIGNoYW5uZWwgbnVtYmVyIG9mIHRoZQorCQkJICogMXN0IGFkYXB0ZXIgdG8gYml0cyAyMy0xNiBhbmQgYml0cyAxNS04IG9mIHRoZSBiaXQKKwkJCSAqIHZlY3RvciwgcmVzcGVjdGl2ZWx5LgorCQkJICovCisJCQlzZXRfdmFsdWUgPSBzZXRfdmFsdWUgPDwgODsKKwkJCS8qCisJCQkgKiBTdG9yZSB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIDJuZCBNQ0MgdmRldiBhdCBiaXRzCisJCQkgKiA3LTAgb2Ygc2V0X3ZhbHVlCisJCQkgKi8KKwkJCXNldF92YWx1ZSA9IHNldF92YWx1ZSB8CisJCQkJc2Vjb25kX2FkYXB0ZXJfb3BlcnRhaW5nX2NoYW5uZWw7CisJCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKGhvc3RhcGRfYWRhcGF0ZXItPnNlc3Npb25JZCwKKwkJCQkJV01BX1ZERVZfTUNDX1NFVF9USU1FX1FVT1RBLAorCQkJCQlzZXRfdmFsdWUsIFZERVZfQ01EKTsKKwkJfSBlbHNlIHsKKwkJCWNkc19lcnIoIk5VTEwgYWRhcHRlciBoYW5kbGUuIEV4aXQiKTsKKwkJfQorCX0gZWxzZSB7CisJCWNkc19pbmZvKCJNQ0MgaXMgbm90IGFjdGl2ZS4gRXhpdCB3L28gc2V0dGluZyBsYXRlbmN5Iik7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogY2RzX2NoYW5nZV9tY2NfZ29fYmVhY29uX2ludGVydmFsKCkgLSBDaGFuZ2UgTUNDIGJlYWNvbiBpbnRlcnZhbAorICogQHBIb3N0YXBkQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqCisgKiBVcGRhdGVzIHRoZSBiZWFjb24gcGFyYW1ldGVycyBvZiB0aGUgR08gaW4gTUNDIHNjZW5hcmlvCisgKgorICogUmV0dXJuOiBTdWNjZXNzIG9yIEZhaWx1cmUgZGVwZW5kaW5nIG9uIHRoZSBvdmVyYWxsIGZ1bmN0aW9uIGJlaGF2aW9yCisgKi8KK0NERl9TVEFUVVMgY2RzX2NoYW5nZV9tY2NfZ29fYmVhY29uX2ludGVydmFsKGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlcikKK3sKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdm9pZCAqaEhhbDsKKworCWNkc19pbmZvKCJVUERBVEUgQmVhY29uIFBhcmFtcyIpOworCisJaWYgKENERl9TQVBfTU9ERSA9PSBjZHNfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJCWlmIChOVUxMID09IGhIYWwpIHsKKwkJCWNkc19lcnIoIkhhbCBjdHggaXMgbnVsbCIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJfQorCQljZGZfcmV0X3N0YXR1cyA9CisJCQlzbWVfY2hhbmdlX21jY19iZWFjb25faW50ZXJ2YWwoaEhhbCwKKwkJCQkJcEhvc3RhcGRBZGFwdGVyLT4KKwkJCQkJc2Vzc2lvbklkKTsKKwkJaWYgKGNkZl9yZXRfc3RhdHVzID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQljZHNfZXJyKCJGYWlsZWQgdG8gdXBkYXRlIEJlYWNvbiBQYXJhbXMiKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkc19nb19zZXRfbWNjX3AycF9xdW90YSgpIC0gRnVuY3Rpb24gdG8gc2V0IHF1b3RhIGZvciBQMlAgR08KKyAqIEBob3N0YXBkX2FkYXB0ZXI6ICAgIFBvaW50ZXIgdG8gSEREIGFkYXB0ZXIKKyAqIEBzZXRfdmFsdWU6ICAgICAgICAgIFFvdXRhIHZhbHVlIGZvciB0aGUgaW50ZXJmYWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcXVvdGEgZm9yIFAyUCBHTyBjYXNlcworICoKKyAqIFJldHVybjogQ29uZmlndXJhdGlvbiBtZXNzYWdlIHBvc3Rpbmcgc3RhdHVzLCBTVUNDRVNTIG9yIEZhaWwKKyAqCisgKi8KK2ludDMyX3QgY2RzX2dvX3NldF9tY2NfcDJwX3F1b3RhKGhkZF9hZGFwdGVyX3QgKmhvc3RhcGRfYWRhcHRlciwKKwkJdWludDMyX3Qgc2V0X3ZhbHVlKQoreworCXVpbnQ4X3QgZmlyc3RfYWRhcHRlcl9vcGVyYXRpbmdfY2hhbm5lbCA9IDA7CisJdWludDhfdCBzZWNvbmRfYWRhcHRlcl9vcGVydGFpbmdfY2hhbm5lbCA9IDA7CisJdWludDMyX3QgY29uY3VycmVudF9zdGF0ZSA9IDA7CisJaGRkX2FkYXB0ZXJfdCAqc3RhX2FkYXB0ZXIgPSBOVUxMOworCWludDMyX3QgcmV0ID0gMDsgLyogc3VjY2VzcyAqLworCisJLyoKKwkgKiBDaGVjayBpZiBjb25jdXJyZW5jeSBtb2RlIGlzIGFjdGl2ZS4KKwkgKiBOZWVkIHRvIG1vZGlmeSB0aGlzIGNvZGUgdG8gc3VwcG9ydCBNQ0MgbW9kZXMgb3RoZXIgdGhhbgorCSAqIFNUQS9QMlAgR08KKwkgKi8KKworCWNvbmN1cnJlbnRfc3RhdGUgPSBjZHNfZ2V0X2NvbmN1cnJlbmN5X21vZGUoKTsKKwlpZiAoY29uY3VycmVudF9zdGF0ZSA9PSAoQ0RGX1NUQV9NQVNLIHwgQ0RGX1AyUF9HT19NQVNLKSkgeworCQljZHNfaW5mbygiU1RBICYgUDJQIGFyZSBib3RoIGVuYWJsZWQiKTsKKworCQkvKgorCQkgKiBUaGUgY2hhbm5lbCBudW1iZXJzIGZvciBib3RoIGFkYXB0ZXJzIGFuZCB0aGUgdGltZQorCQkgKiBxdW90YSBmb3IgdGhlIDFzdCBhZGFwdGVyLCBpLmUuLCBvbmUgc3BlY2lmaWVkIGluIGNtZAorCQkgKiBhcmUgZm9ybWF0dGVkIGFzIGEgYml0IHZlY3RvciB0aGVuIHBhc3NlZCBvbiB0byBXTUEKKwkJICogKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKisKKwkJICogfGJpdCAzMS0yNCB8Yml0IDIzLTE2ICB8ICBiaXRzIDE1LTggIHxiaXRzIDctMCAgIHwKKwkJICogfCAgVW51c2VkICB8ICBRdW90YSBmb3J8IGNoYW4uICMgZm9yIHxjaGFuLiAjIGZvcnwKKwkJICogfCAgICAgICAgICB8ICAxc3QgY2hhbi58IDFzdCBjaGFuLiAgIHwybmQgY2hhbi4gIHwKKwkJICogKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKisKKwkJICovCisKKwkJLyogR2V0IHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBvZiB0aGUgc3BlY2lmaWVkIHZkZXYgKi8KKwkJZmlyc3RfYWRhcHRlcl9vcGVyYXRpbmdfY2hhbm5lbCA9CisJCQloZGRfZ2V0X29wZXJhdGluZ19jaGFubmVsKGhvc3RhcGRfYWRhcHRlci0+cEhkZEN0eCwKKwkJCQkJaG9zdGFwZF9hZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKwkJY2RzX2luZm8oIjFzdCBjaGFubmVsIE5vLjolZCBhbmQgcXVvdGE6JWRtcyIsCisJCQlmaXJzdF9hZGFwdGVyX29wZXJhdGluZ19jaGFubmVsLCBzZXRfdmFsdWUpOworCisJCS8qIE1vdmUgdGhlIHRpbWUgcXVvdGEgZm9yIGZpcnN0IGFkYXB0ZXIgdG8gYml0cyAxNS04ICovCisJCXNldF92YWx1ZSA9IHNldF92YWx1ZSA8PCA4OworCQkvKgorCQkgKiBTdG9yZSB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgbnVtYmVyIG9mIDFzdCBhZGFwdGVyIGF0CisJCSAqIHRoZSBsb3dlciA4LWJpdHMgb2YgYml0IHZlY3Rvci4KKwkJICovCisJCXNldF92YWx1ZSA9IHNldF92YWx1ZSB8IGZpcnN0X2FkYXB0ZXJfb3BlcmF0aW5nX2NoYW5uZWw7CisJCWlmIChob3N0YXBkX2FkYXB0ZXItPmRldmljZV9tb2RlID09CisJCQkJV0xBTl9IRERfSU5GUkFfU1RBVElPTikgeworCQkJLyogaXdwcml2IGNtZCBpc3N1ZWQgb24gd2xhbjA7IGdldCBwMnAwIHZkZXYgY2hhbiAqLworCQkJaWYgKChjb25jdXJyZW50X3N0YXRlICYgQ0RGX1AyUF9DTElFTlRfTUFTSykgIT0gMCkgeworCQkJCS8qIFRoZSAybmQgTUNDIHZkZXYgaXMgUDJQIGNsaWVudCAqLworCQkJCXN0YV9hZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyCisJCQkJCSgKKwkJCQkJIGhvc3RhcGRfYWRhcHRlci0+cEhkZEN0eCwKKwkJCQkJIFdMQU5fSEREX1AyUF9DTElFTlQKKwkJCQkJKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhlIDJuZCBNQ0MgdmRldiBpcyBQMlAgR08gKi8KKwkJCQlzdGFfYWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcgorCQkJCQkoCisJCQkJCSBob3N0YXBkX2FkYXB0ZXItPnBIZGRDdHgsCisJCQkJCSBXTEFOX0hERF9QMlBfR08KKwkJCQkJKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGl3cHJpdiBjbWQgaXNzdWVkIG9uIHAycDA7IGdldCBjaGFubmVsIGZvciB3bGFuMCAqLworCQkJc3RhX2FkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIKKwkJCQkoCisJCQkJIGhvc3RhcGRfYWRhcHRlci0+cEhkZEN0eCwKKwkJCQkgV0xBTl9IRERfSU5GUkFfU1RBVElPTgorCQkJCSk7CisJCX0KKwkJaWYgKHN0YV9hZGFwdGVyICE9IE5VTEwpIHsKKwkJCXNlY29uZF9hZGFwdGVyX29wZXJ0YWluZ19jaGFubmVsID0KKwkJCQloZGRfZ2V0X29wZXJhdGluZ19jaGFubmVsCisJCQkJKAorCQkJCSBzdGFfYWRhcHRlci0+cEhkZEN0eCwKKwkJCQkgc3RhX2FkYXB0ZXItPmRldmljZV9tb2RlCisJCQkJKTsKKwkJCWNkc19pbmZvKCIybmQgdmRldiBjaGFubmVsIE5vLiBpczolZCIsCisJCQkJc2Vjb25kX2FkYXB0ZXJfb3BlcnRhaW5nX2NoYW5uZWwpOworCisJCQlpZiAoc2Vjb25kX2FkYXB0ZXJfb3BlcnRhaW5nX2NoYW5uZWwgPT0gMCB8fAorCQkJCQlmaXJzdF9hZGFwdGVyX29wZXJhdGluZ19jaGFubmVsID09IDApIHsKKwkJCQljZHNfZXJyKCJJbnZhbGlkIGNoYW5uZWwiKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIE1vdmUgdGhlIHRpbWUgcXVvdGEgYW5kIG9wZXJhdGluZyBjaGFubmVsIG51bWJlcgorCQkJICogZm9yIHRoZSBmaXJzdCBhZGFwdGVyIHRvIGJpdHMgMjMtMTYgJiBiaXRzIDE1LTgKKwkJCSAqIG9mIHNldF92YWx1ZSB2ZWN0b3IsIHJlc3BlY3RpdmVseS4KKwkJCSAqLworCQkJc2V0X3ZhbHVlID0gc2V0X3ZhbHVlIDw8IDg7CisJCQkvKgorCQkJICogU3RvcmUgdGhlIGNoYW5uZWwgbnVtYmVyIGZvciAybmQgTUNDIHZkZXYgYXQgYml0cworCQkJICogNy0wIG9mIHNldF92YWx1ZSB2ZWN0b3IgYXMgcGVyIHRoZSBiaXQgZm9ybWF0IGFib3ZlLgorCQkJICovCisJCQlzZXRfdmFsdWUgPSBzZXRfdmFsdWUgfAorCQkJCXNlY29uZF9hZGFwdGVyX29wZXJ0YWluZ19jaGFubmVsOworCQkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChob3N0YXBkX2FkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJV01BX1ZERVZfTUNDX1NFVF9USU1FX1FVT1RBLAorCQkJCQlzZXRfdmFsdWUsIFZERVZfQ01EKTsKKwkJfSBlbHNlIHsKKwkJCWNkc19lcnIoIk5VTEwgYWRhcHRlciBoYW5kbGUuIEV4aXQiKTsKKwkJfQorCX0gZWxzZSB7CisJCWNkc19pbmZvKCJNQ0MgaXMgbm90IGFjdGl2ZS4gRXhpdCB3L28gc2V0dGluZyBsYXRlbmN5Iik7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogY2RzX3NldF9tY2NfbGF0ZW5jeSgpIC0gU2V0IE1DQyBsYXRlbmN5CisgKiBAYWRhcHRlcjogUG9pbnRlciB0byBIREQgYWRhcHRlcgorICogQHNldF92YWx1ZTogTGF0ZW5jeSB2YWx1ZQorICoKKyAqIFNldHMgdGhlIE1DQyBsYXRlbmN5IHZhbHVlIGR1cmluZyBTVEEtUDJQIGNvbmN1cnJlbmN5CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgY2RzX3NldF9tY2NfbGF0ZW5jeShoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgc2V0X3ZhbHVlKQoreworCXVpbnQzMl90IGNvbmN1cnJlbnRfc3RhdGUgPSAwOworCXVpbnQ4X3QgZmlyc3RfYWRhcHRlcl9vcGVyYXRpbmdfY2hhbm5lbCA9IDA7CisJaW50IHJldCA9IDA7ICAgICAgICAgICAgLyogc3VjY2VzcyAqLworCisJY2RzX2luZm8oIml3cHJpdiBjbWQgdG8gc2V0IE1DQyBsYXRlbmN5IHdpdGggdmFsICVkbXMiLAorCQlzZXRfdmFsdWUpOworCS8qKgorCSAqIENoZWNrIGlmIGNvbmN1cnJlbmN5IG1vZGUgaXMgYWN0aXZlLgorCSAqIE5lZWQgdG8gbW9kaWZ5IHRoaXMgY29kZSB0byBzdXBwb3J0IE1DQyBtb2RlcyBvdGhlciB0aGFuIFNUQS9QMlAKKwkgKi8KKwljb25jdXJyZW50X3N0YXRlID0gY2RzX2dldF9jb25jdXJyZW5jeV9tb2RlKCk7CisJaWYgKChjb25jdXJyZW50X3N0YXRlID09IChDREZfU1RBX01BU0sgfCBDREZfUDJQX0NMSUVOVF9NQVNLKSkgfHwKKwkJKGNvbmN1cnJlbnRfc3RhdGUgPT0gKENERl9TVEFfTUFTSyB8IENERl9QMlBfR09fTUFTSykpKSB7CisJCWNkc19pbmZvKCJTVEEgJiBQMlAgYXJlIGJvdGggZW5hYmxlZCIpOworCQkvKgorCQkgKiBUaGUgY2hhbm5lbCBudW1iZXIgYW5kIGxhdGVuY3kgYXJlIGZvcm1hdHRlZCBpbgorCQkgKiBhIGJpdCB2ZWN0b3IgdGhlbiBwYXNzZWQgb24gdG8gV01BIGxheWVyLgorCQkgKiArKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKisKKwkJICogfGJpdHMgMzEtMTYgfCAgICAgIGJpdHMgMTUtOCAgICB8ICBiaXRzIDctMCAgICB8CisJCSAqIHwgIFVudXNlZCAgIHwgbGF0ZW5jeSAtIENoYW4uIDEgfCAgY2hhbm5lbCBuby4gfAorCQkgKiArKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKisKKwkJICovCisJCS8qIEdldCB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgb2YgdGhlIGRlc2lnbmF0ZWQgdmRldiAqLworCQlmaXJzdF9hZGFwdGVyX29wZXJhdGluZ19jaGFubmVsID0KKwkJCWhkZF9nZXRfb3BlcmF0aW5nX2NoYW5uZWwKKwkJCShhZGFwdGVyLT5wSGRkQ3R4LCBhZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisJCS8qIE1vdmUgdGhlIHRpbWUgbGF0ZW5jeSBmb3IgdGhlIGFkYXB0ZXIgdG8gYml0cyAxNS04ICovCisJCXNldF92YWx1ZSA9IHNldF92YWx1ZSA8PCA4OworCQkvKiBTdG9yZSB0aGUgY2hhbm5lbCBudW1iZXIgYXQgYml0cyA3LTAgb2YgdGhlIGJpdCB2ZWN0b3IgKi8KKwkJc2V0X3ZhbHVlID0KKwkJCXNldF92YWx1ZSB8IGZpcnN0X2FkYXB0ZXJfb3BlcmF0aW5nX2NoYW5uZWw7CisJCS8qIFNlbmQgY29tbWFuZCB0byBXTUEgKi8KKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJV01BX1ZERVZfTUNDX1NFVF9USU1FX0xBVEVOQ1ksCisJCQkJc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJfSBlbHNlIHsKKwkJY2RzX2luZm8oIiVzOiBNQ0MgaXMgbm90IGFjdGl2ZS4gRXhpdCB3L28gc2V0dGluZyBsYXRlbmN5IiwKKwkJCV9fZnVuY19fKTsKKwl9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSCkgfHwgXAorCQkJZGVmaW5lZChGRUFUVVJFX1dMQU5fU1RBX0FQX01PREVfREZTX0RJU0FCTEUpCisvKioKKyAqIGNkc19yZXN0YXJ0X3NhcCgpIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlc3RhcnQgU0FQIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyIGludGVybmFsbHkKKyAqCisgKiBAYXBfYWRhcHRlcjogUG9pbnRlciB0byBTQVAgaGRkX2FkYXB0ZXJfdCBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjZHNfcmVzdGFydF9zYXAoaGRkX2FkYXB0ZXJfdCAqYXBfYWRhcHRlcikKK3sKKwloZGRfYXBfY3R4X3QgKmhkZF9hcF9jdHg7CisJaGRkX2hvc3RhcGRfc3RhdGVfdCAqaG9zdGFwZF9zdGF0ZTsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYXBfYWRhcHRlcik7CisjaWZkZWYgQ0ZHODAyMTFfREVMX1NUQV9WMgorCXN0cnVjdCB0YWdDc3JEZWxTdGFQYXJhbXMgZGVsU3RhUGFyYW1zOworI2VuZGlmCisJdHNhcF9Db25maWdfdCAqc2FwX2NvbmZpZzsKKworCWhkZF9hcF9jdHggPSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihhcF9hZGFwdGVyKTsKKwlzYXBfY29uZmlnID0gJmFwX2FkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnOworCisJbXV0ZXhfbG9jaygmaGRkX2N0eC0+c2FwX2xvY2spOworCWlmICh0ZXN0X2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZhcF9hZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKyNpZmRlZiBDRkc4MDIxMV9ERUxfU1RBX1YyCisJCWRlbFN0YVBhcmFtcy5tYWMgPSBOVUxMOworCQlkZWxTdGFQYXJhbXMuc3VidHlwZSA9IFNJUl9NQUNfTUdNVF9ERUFVVEggPj4gNDsKKwkJZGVsU3RhUGFyYW1zLnJlYXNvbl9jb2RlID0gZUNzckZvcmNlZERlYXV0aFN0YTsKKwkJd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3N0YXRpb24oYXBfYWRhcHRlci0+d2Rldi53aXBoeSwKKwkJCQlhcF9hZGFwdGVyLT5kZXYsCisJCQkJJmRlbFN0YVBhcmFtcyk7CisjZWxzZQorCQl3bGFuX2hkZF9jZmc4MDIxMV9kZWxfc3RhdGlvbihhcF9hZGFwdGVyLT53ZGV2LndpcGh5LAorCQkJCWFwX2FkYXB0ZXItPmRldiwgTlVMTCk7CisjZW5kaWYKKwkJaGRkX2NsZWFudXBfYWN0aW9uZnJhbWUoaGRkX2N0eCwgYXBfYWRhcHRlcik7CisJCWhvc3RhcGRfc3RhdGUgPSBXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihhcF9hZGFwdGVyKTsKKwkJY2RmX2V2ZW50X3Jlc2V0KCZob3N0YXBkX3N0YXRlLT5jZGZfc3RvcF9ic3NfZXZlbnQpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHdsYW5zYXBfc3RvcF9ic3MoCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQkJCQloZGRfYXBfY3R4LT5zYXBDb250ZXh0CisjZWxzZQorCQkJCQloZGRfY3R4LT5wY2RzX2NvbnRleHQKKyNlbmRpZgorCQkJCQkpKSB7CisJCQljZGZfc3RhdHVzID0KKwkJCQljZGZfd2FpdF9zaW5nbGVfZXZlbnQoJmhvc3RhcGRfc3RhdGUtPgorCQkJCQkJY2RmX3N0b3BfYnNzX2V2ZW50LAorCQkJCQkJQlNTX1dBSVRfVElNRU9VVCk7CisKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQkJY2RzX2VycigiU0FQIFN0b3AgRmFpbGVkIik7CisJCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwkJY2xlYXJfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJmFwX2FkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKwkJY2RzX2RlY3Jfc2Vzc2lvbl9zZXRfcGNsKGhkZF9jdHgsCisJCQlhcF9hZGFwdGVyLT5kZXZpY2VfbW9kZSwgYXBfYWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJY2RzX2VycigiU0FQIFN0b3AgU3VjY2VzcyIpOworCisJCWlmICgwICE9IHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9hcGllcyhhcF9hZGFwdGVyKSkgeworCQkJY2RzX2VycigiU0FQIE5vdCBhYmxlIHRvIHNldCBBUCBJRXMiKTsKKwkJCXdsYW5zYXBfcmVzZXRfc2FwX2NvbmZpZ19hZGRfaWUoc2FwX2NvbmZpZywKKwkJCQkJZVVQREFURV9JRV9BTEwpOworCQkJZ290byBlbmQ7CisJCX0KKworCQlpZiAod2xhbnNhcF9zdGFydF9ic3MoCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQkJCQloZGRfYXBfY3R4LT5zYXBDb250ZXh0LAorI2Vsc2UKKwkJCQkJaGRkX2N0eC0+cGNkc19jb250ZXh0LAorI2VuZGlmCisJCQkJCWhkZF9ob3N0YXBkX3NhcF9ldmVudF9jYiwKKwkJCQkJJmhkZF9hcF9jdHgtPnNhcENvbmZpZywKKwkJCQkJYXBfYWRhcHRlci0+ZGV2KSAhPQorCQkJCUNERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJY2RzX2VycigiU0FQIFN0YXJ0IEJzcyBmYWlsIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCisJCWNkc19pbmZvKCJXYWl0aW5nIGZvciBTQVAgdG8gc3RhcnQiKTsKKwkJY2RmX3N0YXR1cyA9CisJCQljZGZfd2FpdF9zaW5nbGVfZXZlbnQoJmhvc3RhcGRfc3RhdGUtPmNkZl9ldmVudCwKKwkJCQkJQlNTX1dBSVRfVElNRU9VVCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQljZHNfZXJyKCJTQVAgU3RhcnQgZmFpbGVkIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCQljZHNfZXJyKCJTQVAgU3RhcnQgU3VjY2VzcyIpOworCQlzZXRfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJmFwX2FkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKwkJY2RzX2luY3JfYWN0aXZlX3Nlc3Npb24oaGRkX2N0eCwgYXBfYWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJCSBhcF9hZGFwdGVyLT5zZXNzaW9uSWQpOworCQlob3N0YXBkX3N0YXRlLT5iQ29tbWl0ID0gdHJ1ZTsKKwl9CitlbmQ6CisJbXV0ZXhfdW5sb2NrKCZoZGRfY3R4LT5zYXBfbG9jayk7CisJcmV0dXJuOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU1RBX0FQX01PREVfREZTX0RJU0FCTEUKKy8qKgorICogY2RzX2NoZWNrX2FuZF9yZXN0YXJ0X3NhcF93aXRoX25vbl9kZnNfYWNzKCkgLSBSZXN0YXJ0IFNBUCB3aXRoIG5vbiBkZnMgYWNzCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqCisgKiBSZXN0YXJ0cyBTQVAgaW4gbm9uLURGUyBBQ1MgbW9kZSB3aGVuIFNUQS1BUCBtb2RlIERGUyBpcyBub3Qgc3VwcG9ydGVkCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgY2RzX2NoZWNrX2FuZF9yZXN0YXJ0X3NhcF93aXRoX25vbl9kZnNfYWNzKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJaGRkX2FkYXB0ZXJfdCAqYXBfYWRhcHRlcjsKKworCWlmIChjZHNfZ2V0X2NvbmN1cnJlbmN5X21vZGUoKSAhPSAoQ0RGX1NUQV9NQVNLIHwgQ0RGX1NBUF9NQVNLKSkgeworCQljZHNfaW5mbygiQ29uY3VycmVuY3kgbW9kZSBpcyBub3QgU0FQIik7CisJCXJldHVybjsKKwl9CisKKwlhcF9hZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKGhkZF9jdHgsIFdMQU5fSEREX1NPRlRBUCk7CisJaWYgKGFwX2FkYXB0ZXIgIT0gTlVMTCAmJgorCQkJdGVzdF9iaXQoU09GVEFQX0JTU19TVEFSVEVELAorCQkJCSZhcF9hZGFwdGVyLT5ldmVudF9mbGFncykKKwkJCSYmIENEU19JU19ERlNfQ0goYXBfYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC4KKwkJCQlvcGVyYXRpbmdDaGFubmVsKSkgeworCisJCWNkc193YXJuKCJTVEEtQVAgTW9kZSBERlMgbm90IHN1cHBvcnRlZC4gUmVzdGFydCBTQVAgd2l0aCBOb24gREZTIEFDUyIpOworCQlhcF9hZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnNhcENvbmZpZy5jaGFubmVsID0KKwkJCUFVVE9fQ0hBTk5FTF9TRUxFQ1Q7CisJCWFwX2FkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnLgorCQkJYWNzX2NmZy5hY3NfbW9kZSA9IHRydWU7CisKKwkJY2RzX3Jlc3RhcnRfc2FwKGFwX2FkYXB0ZXIpOworCX0KK30KKyNlbmRpZgorI2lmZGVmIE1QQ19VVF9GUkFNRVdPUksKK0NERl9TVEFUVVMgY2RzX3VwZGF0ZV9jb25uZWN0aW9uX2luZm9fdXRmdyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQl1aW50MzJfdCB2ZGV2X2lkLCB1aW50MzJfdCB0eF9zdHJlYW1zLCB1aW50MzJfdCByeF9zdHJlYW1zLAorCQl1aW50MzJfdCBjaGFpbl9tYXNrLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzdWJfdHlwZSwKKwkJdWludDMyX3QgY2hhbm5lbGlkLCB1aW50MzJfdCBtYWNfaWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl1aW50MzJfdCBjb25uX2luZGV4ID0gMCwgZm91bmQgPSAwOworCisJY2RmX211dGV4X2FjcXVpcmUoJmhkZF9jdHgtPmhkZF9jb25jX2xpc3RfbG9jayk7CisJd2hpbGUgKENPTkNfQ09OTkVDVElPTl9MSVNUX1ZBTElEX0lOREVYKGNvbm5faW5kZXgpKSB7CisJCWlmICh2ZGV2X2lkID09IGNvbmNfY29ubmVjdGlvbl9saXN0W2Nvbm5faW5kZXhdLnZkZXZfaWQpIHsKKwkJCS8qIGRlYnVnIG1zZyAqLworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJY29ubl9pbmRleCsrOworCX0KKwlpZiAoIWZvdW5kKSB7CisJCS8qIGVyciBtc2cgKi8KKwkJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9jdHgtPmhkZF9jb25jX2xpc3RfbG9jayk7CisJCWNkc19lcnIoImNhbid0IGZpbmQgdmRldl9pZCAlZCBpbiBjb25jX2Nvbm5lY3Rpb25fbGlzdCIsCisJCQl2ZGV2X2lkKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJY2RzX2luZm8oIi0tPiB1cGRhdGluZyBlbnRyeSBhdCBpbmRleFslZF0iLCBjb25uX2luZGV4KTsKKworCWNkc191cGRhdGVfY29uY19saXN0KGNvbm5faW5kZXgsCisJCQljZHNfZ2V0X21vZGUodHlwZSwgc3ViX3R5cGUpLAorCQkJY2hhbm5lbGlkLCBtYWNfaWQsIGNoYWluX21hc2ssIHR4X3N0cmVhbXMsCisJCQlyeF9zdHJlYW1zLCAwLCB2ZGV2X2lkLCB0cnVlKTsKKwljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2N0eC0+aGRkX2NvbmNfbGlzdF9sb2NrKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY2RzX2luY3JfY29ubmVjdGlvbl9jb3VudF91dGZ3KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCXVpbnQzMl90IHZkZXZfaWQsIHVpbnQzMl90IHR4X3N0cmVhbXMsIHVpbnQzMl90IHJ4X3N0cmVhbXMsCisJCXVpbnQzMl90IGNoYWluX21hc2ssIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHN1Yl90eXBlLAorCQl1aW50MzJfdCBjaGFubmVsaWQsIHVpbnQzMl90IG1hY19pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXVpbnQzMl90IGNvbm5faW5kZXggPSAwOworCisJY2RmX211dGV4X2FjcXVpcmUoJmhkZF9jdHgtPmhkZF9jb25jX2xpc3RfbG9jayk7CisJY29ubl9pbmRleCA9IGNkc19nZXRfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4KTsKKwlpZiAoTUFYX05VTUJFUl9PRl9DT05DX0NPTk5FQ1RJT05TIDw9IGNvbm5faW5kZXgpIHsKKwkJLyogZXJyIG1zZyAqLworCQljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2N0eC0+aGRkX2NvbmNfbGlzdF9sb2NrKTsKKwkJY2RzX2VycigiZXhjZWVkZWQgbWF4IGNvbm5lY3Rpb24gbGltaXQgJWQiLAorCQkJTUFYX05VTUJFUl9PRl9DT05DX0NPTk5FQ1RJT05TKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJY2RzX2luZm8oIi0tPiBmaWxsaW5nIGVudHJ5IGF0IGluZGV4WyVkXSIsIGNvbm5faW5kZXgpOworCisJY2RzX3VwZGF0ZV9jb25jX2xpc3QoY29ubl9pbmRleCwKKwkJCSAgICAgY2RzX2dldF9tb2RlKHR5cGUsIHN1Yl90eXBlKSwKKwkJCSAgICAgY2hhbm5lbGlkLCBtYWNfaWQsIGNoYWluX21hc2ssIHR4X3N0cmVhbXMsCisJCQkgICAgIHJ4X3N0cmVhbXMsIDAsIHZkZXZfaWQsIHRydWUpOworCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfY3R4LT5oZGRfY29uY19saXN0X2xvY2spOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBjZHNfZGVjcl9jb25uZWN0aW9uX2NvdW50X3V0ZncoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwl1aW50MzJfdCBkZWxfYWxsLCB1aW50MzJfdCB2ZGV2X2lkKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKGRlbF9hbGwpIHsKKwkJc3RhdHVzID0gY2RzX2luaXRfcG9saWN5X21ncihoZGRfY3R4KTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJY2RzX2VycigiUG9saWN5IG1hbmFnZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwl9IGVsc2UgeworCQljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2N0eC0+aGRkX2NvbmNfbGlzdF9sb2NrKTsKKwkJY2RzX2RlY3JfY29ubmVjdGlvbl9jb3VudChoZGRfY3R4LCB2ZGV2X2lkKTsKKwkJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9jdHgtPmhkZF9jb25jX2xpc3RfbG9jayk7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RydWN0IGNkc19jb25jX2Nvbm5lY3Rpb25faW5mbyAqY2RzX2dldF9jb25uX2luZm8oaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJdWludDMyX3QgKmxlbikKK3sKKwlzdHJ1Y3QgY2RzX2NvbmNfY29ubmVjdGlvbl9pbmZvICpjb25uX3B0ciA9ICZjb25jX2Nvbm5lY3Rpb25fbGlzdFswXTsKKwkqbGVuID0gTUFYX05VTUJFUl9PRl9DT05DX0NPTk5FQ1RJT05TOworCisJcmV0dXJuIGNvbm5fcHRyOworfQorCitlbnVtIGNkc19wY2xfdHlwZSBnZXRfcGNsX2Zyb21fZmlyc3RfY29ubl90YWJsZSgKKwkJZW51bSBjZHNfY29uX21vZGUgdHlwZSwKKwkJZW51bSBjZHNfY29uY19wcmlvcml0eV9tb2RlIHN5c19wcmVmKQoreworCWlmICgoc3lzX3ByZWYgPj0gQ0RTX01BWF9DT05DX1BSSU9SSVRZX01PREUpIHx8CisJCSh0eXBlID49IENEU19NQVhfTlVNX09GX01PREUpKQorCQlyZXR1cm4gQ0RTX01BWF9QQ0xfVFlQRTsKKwlyZXR1cm4gZmlyc3RfY29ubmVjdGlvbl9wY2xfdGFibGVbdHlwZV1bc3lzX3ByZWZdOworfQorCitlbnVtIGNkc19wY2xfdHlwZSBnZXRfcGNsX2Zyb21fc2Vjb25kX2Nvbm5fdGFibGUoCisJZW51bSBjZHNfb25lX2Nvbm5lY3Rpb25fbW9kZSBpZHgsIGVudW0gY2RzX2Nvbl9tb2RlIHR5cGUsCisJZW51bSBjZHNfY29uY19wcmlvcml0eV9tb2RlIHN5c19wcmVmLCB1aW50OF90IGRic19jYXBhYmxlKQoreworCWlmICgoaWR4ID49IENEU19NQVhfT05FX0NPTk5FQ1RJT05fTU9ERSkgfHwKKwkJKHN5c19wcmVmID49IENEU19NQVhfQ09OQ19QUklPUklUWV9NT0RFKSB8fAorCQkodHlwZSA+PSBDRFNfTUFYX05VTV9PRl9NT0RFKSkKKwkJcmV0dXJuIENEU19NQVhfUENMX1RZUEU7CisJaWYgKGRic19jYXBhYmxlKQorCQlyZXR1cm4gc2Vjb25kX2Nvbm5lY3Rpb25fcGNsX2Ric190YWJsZVtpZHhdW3R5cGVdW3N5c19wcmVmXTsKKwllbHNlCisJCXJldHVybiBzZWNvbmRfY29ubmVjdGlvbl9wY2xfbm9kYnNfdGFibGVbaWR4XVt0eXBlXVtzeXNfcHJlZl07Cit9CisKK2VudW0gY2RzX3BjbF90eXBlIGdldF9wY2xfZnJvbV90aGlyZF9jb25uX3RhYmxlKAorCWVudW0gY2RzX3R3b19jb25uZWN0aW9uX21vZGUgaWR4LCBlbnVtIGNkc19jb25fbW9kZSB0eXBlLAorCWVudW0gY2RzX2NvbmNfcHJpb3JpdHlfbW9kZSBzeXNfcHJlZiwgdWludDhfdCBkYnNfY2FwYWJsZSkKK3sKKwlpZiAoKGlkeCA+PSBDRFNfTUFYX1RXT19DT05ORUNUSU9OX01PREUpIHx8CisJCShzeXNfcHJlZiA+PSBDRFNfTUFYX0NPTkNfUFJJT1JJVFlfTU9ERSkgfHwKKwkJKHR5cGUgPj0gQ0RTX01BWF9OVU1fT0ZfTU9ERSkpCisJCXJldHVybiBDRFNfTUFYX1BDTF9UWVBFOworCWlmIChkYnNfY2FwYWJsZSkKKwkJcmV0dXJuIHRoaXJkX2Nvbm5lY3Rpb25fcGNsX2Ric190YWJsZVtpZHhdW3R5cGVdW3N5c19wcmVmXTsKKwllbHNlCisJCXJldHVybiB0aGlyZF9jb25uZWN0aW9uX3BjbF9ub2Ric190YWJsZVtpZHhdW3R5cGVdW3N5c19wcmVmXTsKK30KKyNlbmRpZgorCisvKioKKyAqIGNkc19jb252ZXJ0X2RldmljZV9tb2RlX3RvX2hkZF90eXBlKCkgLSBwcm92aWRlcyB0aGUKKyAqIHR5cGUgdHJhbnNsYXRpb24gZnJvbSBIREQgdG8gcG9saWN5IG1hbmFnZXIgdHlwZQorICogQGRldmljZV9tb2RlOiBHZW5lcmljIGNvbm5lY3Rpb24gbW9kZSB0eXBlCisgKgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIHR5cGUgdHJhbnNsYXRpb24KKyAqCisgKiBSZXR1cm46IGNkc19jb25fbW9kZSBlbnVtCisgKi8KK2VudW0gY2RzX2Nvbl9tb2RlIGNkc19jb252ZXJ0X2RldmljZV9tb2RlX3RvX2hkZF90eXBlKAorCQkJCQlkZXZpY2VfbW9kZV90IGRldmljZV9tb2RlKQoreworCWVudW0gY2RzX2Nvbl9tb2RlIG1vZGUgPSBDRFNfTUFYX05VTV9PRl9NT0RFOworCXN3aXRjaCAoZGV2aWNlX21vZGUpIHsKKwljYXNlIFdMQU5fSEREX0lORlJBX1NUQVRJT046CisJCW1vZGUgPSBDRFNfU1RBX01PREU7CisJCWJyZWFrOworCWNhc2UgV0xBTl9IRERfUDJQX0NMSUVOVDoKKwkJbW9kZSA9IENEU19QMlBfQ0xJRU5UX01PREU7CisJCWJyZWFrOworCWNhc2UgV0xBTl9IRERfUDJQX0dPOgorCQltb2RlID0gQ0RTX1AyUF9HT19NT0RFOworCQlicmVhazsKKwljYXNlIFdMQU5fSEREX1NPRlRBUDoKKwkJbW9kZSA9IENEU19TQVBfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0hERF9JQlNTOgorCQltb2RlID0gQ0RTX0lCU1NfTU9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2RzX2VycigiVW5zdXBwb3J0ZWQgbW9kZSAoJWQpIiwKKwkJCWRldmljZV9tb2RlKTsKKwl9CisJcmV0dXJuIG1vZGU7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Nkcy9zcmMvY2RzX2dldF9iaW4uYyBiL2NvcmUvY2RzL3NyYy9jZHNfZ2V0X2Jpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjODdkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9zcmMvY2RzX2dldF9iaW4uYwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGNkc19nZXRfYmluLmg+CisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgPGNkc19zY2hlZC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX21pc2MuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9tYWluLmg+CisKK3RDREZfQ09OX01PREUgY2RzX2dldF9jb25wYXJhbSh2b2lkKQoreworCXRDREZfQ09OX01PREUgY29uX21vZGU7CisJY29uX21vZGUgPSBoZGRfZ2V0X2NvbnBhcmFtKCk7CisJcmV0dXJuIGNvbl9tb2RlOworfQorCitib29sIGNkc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZyh2b2lkKQoreworCXVpbnQ4X3QgaSA9IDA7CisJdWludDhfdCBqID0gMDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCisJcEhkZEN0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJaWYgKE5VTEwgIT0gcEhkZEN0eCkgeworCQlmb3IgKGkgPSAwOyBpIDwgQ0RGX01BWF9OT19PRl9NT0RFOyBpKyspIHsKKwkJCWogKz0gcEhkZEN0eC0+bm9fb2Zfb3Blbl9zZXNzaW9uc1tpXTsKKwkJfQorCX0KKworCXJldHVybiBqID4gMTsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKK2Jvb2wgY2RzX2NvbmN1cnJlbnRfYmVhY29uaW5nX3Nlc3Npb25zX3J1bm5pbmcodm9pZCkKK3sKKwl1aW50OF90IGkgPSAwOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKwlwSGRkQ3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoTlVMTCAhPSBwSGRkQ3R4KSB7CisJCWkgPSBwSGRkQ3R4LT5ub19vZl9vcGVuX3Nlc3Npb25zW0NERl9TQVBfTU9ERV0gKworCQkgICAgcEhkZEN0eC0+bm9fb2Zfb3Blbl9zZXNzaW9uc1tDREZfUDJQX0dPX01PREVdICsKKwkJICAgIHBIZGRDdHgtPm5vX29mX29wZW5fc2Vzc2lvbnNbQ0RGX0lCU1NfTU9ERV07CisJfQorCXJldHVybiBpID4gMTsKK30KKyNlbmRpZgorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoKKyogICBcYnJpZWYgY2RzX21heF9jb25jdXJyZW50X2Nvbm5lY3Rpb25zX3JlYWNoZWQoKQorKgorKiAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciBwcmVzZW5jZSBvZiBjb25jdXJyZW5jeSB3aGVyZSBtb3JlIHRoYW4KKyogICBvbmUgY29ubmVjdGlvbiBleGlzdHMgYW5kIGl0IHJldHVybnMgdHJ1ZSBpZiB0aGUgbWF4IGNvbmN1cnJlbmN5IGlzCisqICAgcmVhY2hlZC4KKyoKKyogICBFeGFtcGxlOgorKiAgIFNUQSArIFNUQSAod2xhbjAgYW5kIHdsYW4xIGFyZSBjb25uZWN0ZWQpIC0gcmV0dXJucyB0cnVlCisqICAgU1RBICsgU1RBICh3bGFuMCBjb25uZWN0ZWQgYW5kIHdsYW4xIGRpc2Nvbm5lY3RlZCkgLSByZXR1cm5zIGZhbHNlCisqICAgRFVUIHdpdGggUDJQLUdPICsgUDJQLUNMSUVOVCBjb25uZWN0aW9uKSAtIHJldHVybnMgdHJ1ZQorKgorKiAgIFxwYXJhbSAgLSBOb25lCisqCisqICAgXHJldHVybiAtIHRydWUgb3IgZmFsc2UKKyoKKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworYm9vbCBjZHNfbWF4X2NvbmN1cnJlbnRfY29ubmVjdGlvbnNfcmVhY2hlZCh2b2lkKQoreworCXVpbnQ4X3QgaSA9IDAsIGogPSAwOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKwlwSGRkQ3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoTlVMTCAhPSBwSGRkQ3R4KSB7CisJCWZvciAoaSA9IDA7IGkgPCBDREZfTUFYX05PX09GX01PREU7IGkrKykKKwkJCWogKz0gcEhkZEN0eC0+bm9fb2ZfYWN0aXZlX3Nlc3Npb25zW2ldOworCQlyZXR1cm4gaiA+CisJCQkocEhkZEN0eC0+Y29uZmlnLT4KKwkJCSBnTWF4Q29uY3VycmVudEFjdGl2ZVNlc3Npb25zIC0gMSk7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGNkc19jbGVhcl9jb25jdXJyZW50X3Nlc3Npb25fY291bnQodm9pZCkKK3sKKwl1aW50OF90IGkgPSAwOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKwlwSGRkQ3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoTlVMTCAhPSBwSGRkQ3R4KSB7CisJCWZvciAoaSA9IDA7IGkgPCBDREZfTUFYX05PX09GX01PREU7IGkrKykKKwkJCXBIZGRDdHgtPm5vX29mX2FjdGl2ZV9zZXNzaW9uc1tpXSA9IDA7CisJfQorfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoKKyogICBcYnJpZWYgY2RzX2lzX211bHRpcGxlX2FjdGl2ZV9zdGFfc2Vzc2lvbnMoKQorKgorKiAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciBwcmVzZW5jZSBvZiBtdWx0aXBsZSBhY3RpdmUgc3RhIGNvbm5lY3Rpb25zCisqICAgYW5kIGl0IHJldHVybnMgdHJ1ZSBpZiB0aGUgbW9yZSB0aGFuIDEgYWN0aXZlIHN0YSBjb25uZWN0aW9uIGV4aXN0cy4KKyoKKyogICBccGFyYW0gIC0gTm9uZQorKgorKiAgIFxyZXR1cm4gLSB0cnVlIG9yIGZhbHNlCisqCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Jvb2wgY2RzX2lzX211bHRpcGxlX2FjdGl2ZV9zdGFfc2Vzc2lvbnModm9pZCkKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCXVpbnQ4X3QgaiA9IDA7CisKKwlwSGRkQ3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoTlVMTCAhPSBwSGRkQ3R4KQorCQlqID0gcEhkZEN0eC0+bm9fb2ZfYWN0aXZlX3Nlc3Npb25zW0NERl9TVEFfTU9ERV07CisKKwlyZXR1cm4gaiA+IDE7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKgorKiAgIFxicmllZiBjZHNfaXNfc3RhX2FjdGl2ZV9jb25uZWN0aW9uX2V4aXN0cygpCisqCisqICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBvZiBhY3RpdmUgc3RhIGNvbm5lY3Rpb24KKyogICBhbmQgaXQgcmV0dXJucyB0cnVlIGlmIGV4aXN0cy4KKyoKKyogICBccGFyYW0gIC0gTm9uZQorKgorKiAgIFxyZXR1cm4gLSB0cnVlIG9yIGZhbHNlCisqCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Jvb2wgY2RzX2lzX3N0YV9hY3RpdmVfY29ubmVjdGlvbl9leGlzdHModm9pZCkKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCXVpbnQ4X3QgaiA9IDA7CisKKwlwSGRkQ3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoTlVMTCAhPSBwSGRkQ3R4KQorCQlqID0gcEhkZEN0eC0+bm9fb2ZfYWN0aXZlX3Nlc3Npb25zW0NERl9TVEFfTU9ERV07CisKKwlyZXR1cm4gaiA/IHRydWUgOiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvY2RzL3NyYy9jZHNfaWVlZTgwMjExX2NvbW1vbl9pLmggYi9jb3JlL2Nkcy9zcmMvY2RzX2llZWU4MDIxMV9jb21tb25faS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NmM4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9zcmMvY2RzX2llZWU4MDIxMV9jb21tb25faS5oCkBAIC0wLDAgKzEsNTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIENEU19DT01NT05fX0lFRUU4MDIxMV9JX0hfCisjZGVmaW5lIENEU19DT01NT05fX0lFRUU4MDIxMV9JX0hfCisKKy8qIFRoZXNlIGRlZmluZXMgc2hvdWxkIG1hdGNoIHRoZSB0YWJsZSBmcm9tIGFoX2ludGVybmFsLmggKi8KK3R5cGVkZWYgZW51bSB7CisJREZTX1VOSU5JVF9ET01BSU4gPSAwLCAgLyogVW5pbml0aWFsaXplZCBkZnMgZG9tYWluICovCisJREZTX0ZDQ19ET01BSU4gPSAxLCAgICAgLyogRkNDMyBkZnMgZG9tYWluICovCisJREZTX0VUU0lfRE9NQUlOID0gMiwgICAgLyogRVRTSSBkZnMgZG9tYWluICovCisJREZTX01LSzRfRE9NQUlOID0gMyAgICAgLyogSmFwYW4gZGZzIGRvbWFpbiAqLworfSBIQUxfREZTX0RPTUFJTjsKKworLyogWFhYIG5vdCByZWFsbHkgYSBtb2RlOyB0aGVyZSBhcmUgcmVhbGx5IG11bHRpcGxlIFBIWSdzICovCitlbnVtIGllZWU4MDIxMV9waHltb2RlIHsKKwlJRUVFODAyMTFfTU9ERV9BVVRPID0gMCwgICAgICAgIC8qIGF1dG9zZWxlY3QgKi8KKwlJRUVFODAyMTFfTU9ERV8xMUEgPSAxLCAvKiA1R0h6LCBPRkRNICovCisJSUVFRTgwMjExX01PREVfMTFCID0gMiwgLyogMkdIeiwgQ0NLICovCisJSUVFRTgwMjExX01PREVfMTFHID0gMywgLyogMkdIeiwgT0ZETSAqLworCUlFRUU4MDIxMV9NT0RFX0ZIID0gNCwgIC8qIDJHSHosIEdGU0sgKi8KKwlJRUVFODAyMTFfTU9ERV9UVVJCT19BID0gNSwgICAgIC8qIDVHSHosIE9GRE0sIDJ4IGNsb2NrIGR5bmFtaWMgdHVyYm8gKi8KKwlJRUVFODAyMTFfTU9ERV9UVVJCT19HID0gNiwgICAgIC8qIDJHSHosIE9GRE0sIDJ4IGNsb2NrIGR5bmFtaWMgdHVyYm8gKi8KKwlJRUVFODAyMTFfTU9ERV8xMU5BX0hUMjAgPSA3LCAgIC8qIDVHaHosIEhUMjAgKi8KKwlJRUVFODAyMTFfTU9ERV8xMU5HX0hUMjAgPSA4LCAgIC8qIDJHaHosIEhUMjAgKi8KKwlJRUVFODAyMTFfTU9ERV8xMU5BX0hUNDBQTFVTID0gOSwgICAgICAgLyogNUdoeiwgSFQ0MCAoZXh0IGNoICsxKSAqLworCUlFRUU4MDIxMV9NT0RFXzExTkFfSFQ0ME1JTlVTID0gMTAsICAgICAvKiA1R2h6LCBIVDQwIChleHQgY2ggLTEpICovCisJSUVFRTgwMjExX01PREVfMTFOR19IVDQwUExVUyA9IDExLCAgICAgIC8qIDJHaHosIEhUNDAgKGV4dCBjaCArMSkgKi8KKwlJRUVFODAyMTFfTU9ERV8xMU5HX0hUNDBNSU5VUyA9IDEyLCAgICAgLyogMkdoeiwgSFQ0MCAoZXh0IGNoIC0xKSAqLworCUlFRUU4MDIxMV9NT0RFXzExTkdfSFQ0MCA9IDEzLCAgLyogMkdoeiwgQXV0byBIVDQwICovCisJSUVFRTgwMjExX01PREVfMTFOQV9IVDQwID0gMTQsICAvKiAyR2h6LCBBdXRvIEhUNDAgKi8KKwlJRUVFODAyMTFfTU9ERV8xMUFDX1ZIVDIwID0gMTUsIC8qIDVHaHosIFZIVDIwICovCisJSUVFRTgwMjExX01PREVfMTFBQ19WSFQ0MFBMVVMgPSAxNiwgICAgIC8qIDVHaHosIFZIVDQwIChFeHQgY2ggKzEpICovCisJSUVFRTgwMjExX01PREVfMTFBQ19WSFQ0ME1JTlVTID0gMTcsICAgIC8qIDVHaHogIFZIVDQwIChFeHQgY2ggLTEpICovCisJSUVFRTgwMjExX01PREVfMTFBQ19WSFQ0MCA9IDE4LCAvKiA1R2h6LCBWSFQ0MCAqLworCUlFRUU4MDIxMV9NT0RFXzExQUNfVkhUODAgPSAxOSwgLyogNUdoeiwgVkhUODAgKi8KKwlJRUVFODAyMTFfTU9ERV8yR19BVVRPID0gMjAsICAgIC8qIDJHIDExIGIvZy9uICBhdXRvc2VsZWN0ICovCisJSUVFRTgwMjExX01PREVfNUdfQVVUTyA9IDIxLCAgICAvKiA1RyAxMSBhL24vYWMgYXV0b3NlbGVjdCAqLworCUlFRUU4MDIxMV9NT0RFXzExQUdOID0gMjIsICAgLyogU3VwcG9ydCAxMU4gaW4gYm90aCAyRyBhbmQgNUcgKi8KK307CisjZGVmaW5lIElFRUU4MDIxMV9NT0RFX01BWCAgICAgIChJRUVFODAyMTFfTU9ERV8xMUFDX1ZIVDgwICsgMSkKKworZW51bSBpZWVlODAyMTFfb3Btb2RlIHsKKwlJRUVFODAyMTFfTV9TVEEgPSAxLCAgICAvKiBpbmZyYXN0cnVjdHVyZSBzdGF0aW9uICovCisJSUVFRTgwMjExX01fSUJTUyA9IDAsICAgLyogSUJTUyAoYWRob2MpIHN0YXRpb24gKi8KKwlJRUVFODAyMTFfTV9BSERFTU8gPSAzLCAvKiBPbGQgbHVjZW50IGNvbXBhdGlibGUgYWRob2MgZGVtbyAqLworCUlFRUU4MDIxMV9NX0hPU1RBUCA9IDYsIC8qIFNvZnR3YXJlIEFjY2VzcyBQb2ludCAqLworCUlFRUU4MDIxMV9NX01PTklUT1IgPSA4LCAgICAgICAgLyogTW9uaXRvciBtb2RlICovCisJSUVFRTgwMjExX01fV0RTID0gMiwgICAgLyogV0RTIGxpbmsgKi8KKwlJRUVFODAyMTFfTV9CVEFNUCA9IDksICAvKiBWQVAgZm9yIEJUIEFNUCAqLworCisJSUVFRTgwMjExX01fUDJQX0dPID0gMzMsICAgICAgICAvKiBQMlAgR08gKi8KKwlJRUVFODAyMTFfTV9QMlBfQ0xJRU5UID0gMzQsICAgIC8qIFAyUCBDbGllbnQgKi8KKwlJRUVFODAyMTFfTV9QMlBfREVWSUNFID0gMzUsICAgIC8qIFAyUCBEZXZpY2UgKi8KKworCUlFRUU4MDIxMV9PUE1PREVfTUFYID0gSUVFRTgwMjExX01fQlRBTVAsICAgICAgIC8qIEhpZ2hlc3QgbnVtYmVyZWQgb3Btb2RlIGluIHRoZSBsaXN0ICovCisKKwlJRUVFODAyMTFfTV9BTlkgPSAweEZGICAvKiBBbnkgb2YgdGhlIGFib3ZlOyB1c2VkIGJ5IE5ESVMgNi54ICovCit9OworCisvKgorICogODAyLjExbgorICovCisjZGVmaW5lIElFRUU4MDIxMV9DV01fRVhUQ0hfQlVTWV9USFJFU0hPTEQgMzAKKworZW51bSBpZWVlODAyMTFfY3dtX21vZGUgeworCUlFRUU4MDIxMV9DV01fTU9ERTIwLAorCUlFRUU4MDIxMV9DV01fTU9ERTIwNDAsCisJSUVFRTgwMjExX0NXTV9NT0RFNDAsCisJSUVFRTgwMjExX0NXTV9NT0RFTUFYCit9OworCitlbnVtIGllZWU4MDIxMV9jd21fZXh0cHJvdHNwYWNpbmcgeworCUlFRUU4MDIxMV9DV01fRVhUUFJPVFNQQUNJTkcyMCwKKwlJRUVFODAyMTFfQ1dNX0VYVFBST1RTUEFDSU5HMjUsCisJSUVFRTgwMjExX0NXTV9FWFRQUk9UU1BBQ0lOR01BWAorfTsKKworZW51bSBpZWVlODAyMTFfY3dtX3dpZHRoIHsKKwlJRUVFODAyMTFfQ1dNX1dJRFRIMjAsCisJSUVFRTgwMjExX0NXTV9XSURUSDQwLAorCUlFRUU4MDIxMV9DV01fV0lEVEg4MCwKKwlJRUVFODAyMTFfQ1dNX1dJRFRISU5WQUxJRCA9IDB4ZmYgICAgICAgLyogdXNlciBpbnZhbGlkIHZhbHVlICovCit9OworCitlbnVtIGllZWU4MDIxMV9jd21fZXh0cHJvdG1vZGUgeworCUlFRUU4MDIxMV9DV01fRVhUUFJPVE5PTkUsICAgICAgLyogbm8gcHJvdGVjdGlvbiAqLworCUlFRUU4MDIxMV9DV01fRVhUUFJPVENUU09OTFksICAgLyogQ1RTIHRvIHNlbGYgKi8KKwlJRUVFODAyMTFfQ1dNX0VYVFBST1RSVFNDVFMsICAgIC8qIFJUUy1DVFMgKi8KKwlJRUVFODAyMTFfQ1dNX0VYVFBST1RNQVgKK307CisKK2VudW0gaWVlZTgwMjExX2ZpeGVkX3JhdGVfbW9kZSB7CisJSUVFRTgwMjExX0ZJWEVEX1JBVEVfTk9ORSA9IDAsCisJSUVFRTgwMjExX0ZJWEVEX1JBVEVfTUNTID0gMSwgICAvKiBIVCByYXRlcyAqLworCUlFRUU4MDIxMV9GSVhFRF9SQVRFX0xFR0FDWSA9IDIsICAgICAgICAvKiBsZWdhY3kgcmF0ZXMgKi8KKwlJRUVFODAyMTFfRklYRURfUkFURV9WSFQgPSAzICAgIC8qIFZIVCByYXRlcyAqLworfTsKKworLyogSG9sZHMgdGhlIGZpeGVkIHJhdGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggVkFQICovCitzdHJ1Y3QgaWVlZTgwMjExX2ZpeGVkX3JhdGUgeworCWVudW0gaWVlZTgwMjExX2ZpeGVkX3JhdGVfbW9kZSBtb2RlOworCXVpbnQzMl90IHNlcmllczsKKwl1aW50MzJfdCByZXRyaWVzOworfTsKKworLyoKKyAqIDgwMi4xMWcgcHJvdGVjdGlvbiBtb2RlLgorICovCitlbnVtIGllZWU4MDIxMV9wcm90bW9kZSB7CisJSUVFRTgwMjExX1BST1RfTk9ORSA9IDAsICAgICAgICAvKiBubyBwcm90ZWN0aW9uICovCisJSUVFRTgwMjExX1BST1RfQ1RTT05MWSA9IDEsICAgICAvKiBDVFMgdG8gc2VsZiAqLworCUlFRUU4MDIxMV9QUk9UX1JUU0NUUyA9IDIsICAgICAgLyogUlRTLUNUUyAqLworfTsKKworLyoKKyAqIFJvYW1pbmcgbW9kZSBpcyBlZmZlY3RpdmVseSB3aG8gY29udHJvbHMgdGhlIG9wZXJhdGlvbgorICogb2YgdGhlIDgwMi4xMSBzdGF0ZSBtYWNoaW5lIHdoZW4gb3BlcmF0aW5nIGFzIGEgc3RhdGlvbi4KKyAqIFN0YXRlIHRyYW5zaXRpb25zIGFyZSBjb250cm9sbGVkIGVpdGhlciBieSB0aGUgZHJpdmVyCisgKiAodHlwaWNhbGx5IHdoZW4gbWFuYWdlbWVudCBmcmFtZXMgYXJlIHByb2Nlc3NlZCBieSB0aGUKKyAqIGhhcmR3YXJlL2Zpcm13YXJlKSwgdGhlIGhvc3QgKGF1dG8vbm9ybWFsIG9wZXJhdGlvbiBvZgorICogdGhlIDgwMi4xMSBsYXllciksIG9yIGV4cGxpY2l0bHkgdGhyb3VnaCBpb2N0bCByZXF1ZXN0cworICogd2hlbiBhcHBsaWNhdGlvbnMgbGlrZSB3cGFfc3VwcGxpY2FudCB3YW50IGNvbnRyb2wuCisgKi8KK2VudW0gaWVlZTgwMjExX3JvYW1pbmdtb2RlIHsKKwlJRUVFODAyMTFfUk9BTUlOR19ERVZJQ0UgPSAwLCAgIC8qIGRyaXZlci9oYXJkd2FyZSBjb250cm9sICovCisJSUVFRTgwMjExX1JPQU1JTkdfQVVUTyA9IDEsICAgICAvKiA4MDIuMTEgbGF5ZXIgY29udHJvbCAqLworCUlFRUU4MDIxMV9ST0FNSU5HX01BTlVBTCA9IDIsICAgLyogYXBwbGljYXRpb24gY29udHJvbCAqLworfTsKKworLyoKKyAqIFNjYW5uaW5nIG1vZGUgY29udHJvbHMgc3RhdGlvbiBzY2FubmluZyB3b3JrOyB0aGlzIGlzCisgKiB1c2VkIG9ubHkgd2hlbiByb2FtaW5nIG1vZGUgcGVybWl0cyB0aGUgaG9zdCB0byBzZWxlY3QKKyAqIHRoZSBic3MgdG8gam9pbi9jaGFubmVsIHRvIHVzZS4KKyAqLworZW51bSBpZWVlODAyMTFfc2Nhbm1vZGUgeworCUlFRUU4MDIxMV9TQ0FOX0RFVklDRSA9IDAsICAgICAgLyogZHJpdmVyL2hhcmR3YXJlIGNvbnRyb2wgKi8KKwlJRUVFODAyMTFfU0NBTl9CRVNUID0gMSwgICAgICAgIC8qIDgwMi4xMSBsYXllciBzZWxlY3RzIGJlc3QgKi8KKwlJRUVFODAyMTFfU0NBTl9GSVJTVCA9IDIsICAgICAgIC8qIHRha2UgZmlyc3Qgc3VpdGFibGUgY2FuZGlkYXRlICovCit9OworCisjZGVmaW5lIElFRUU4MDIxMV9OV0lEX0xFTiAgICAgIDMyCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX01BWCAgICAgIDI1NQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9CWVRFUyAgICAzMiAgICAgIC8qIGhvd21hbnkoSUVFRTgwMjExX0NIQU5fTUFYLCBOQkJZKSAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9BTlkgICAgICAoLTEpICAgIC8qIHRva2VuIGZvciBgYGFueSBjaGFubmVsJycgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fQU5ZQyBcCisJKChzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKikgSUVFRTgwMjExX0NIQU5fQU5ZKQorCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0RFRkFVTFQgICAgICAgICAgMTEKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fREVGQVVMVF8xMUEgICAgICA1MgorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9BREhPQ19ERUZBVUxUMSAgIDEwCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0FESE9DX0RFRkFVTFQyICAgMTEKKworI2RlZmluZSBJRUVFODAyMTFfUkFEQVJfMTFIQ09VTlQgICAgICAgIDUKKyNkZWZpbmUgSUVFRTgwMjExX1JBREFSX1RFU1RfTVVURV9DSEFOXzExQSAgICAgIDM2ICAgICAgLyogTW92ZSB0byBjaGFubmVsIDM2IGZvciBtdXRlIHRlc3QgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1JBREFSX1RFU1RfTVVURV9DSEFOXzExTkhUMjAgIDM2CisjZGVmaW5lIElFRUU4MDIxMV9SQURBUl9URVNUX01VVEVfQ0hBTl8xMU5IVDQwVSAzNgorI2RlZmluZSBJRUVFODAyMTFfUkFEQVJfVEVTVF9NVVRFX0NIQU5fMTFOSFQ0MEQgNDAgICAgICAvKiBNb3ZlIHRvIGNoYW5uZWwgNDAgZm9yIEhUNDBEIG11dGUgdGVzdCAqLworI2RlZmluZSBJRUVFODAyMTFfUkFEQVJfREVURUNUX0RFRkFVTFRfREVMQVkgICAgNjAwMDAgICAvKiBTVEEgaWdub3JlIEFQIGJlYWNvbnMgZHVyaW5nIHRoaXMgcGVyaW9kIGluIG1pbGxpc2Vjb25kICovCisKKyNkZWZpbmUgSUVFRTgwMjExXzJHQ1NBX1RCVFRDT1VOVCAgICAgICAgMworCisvKiBiaXRzIDAtMyBhcmUgZm9yIHByaXZhdGUgdXNlIGJ5IGRyaXZlcnMgKi8KKy8qIGNoYW5uZWwgYXR0cmlidXRlcyAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9UVVJCTyAgICAgICAgICAgIDB4MDAwMDAwMTAgICAgICAvKiBUdXJibyBjaGFubmVsICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0NDSyAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgICAgIC8qIENDSyBjaGFubmVsICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX09GRE0gICAgICAgICAgICAgMHgwMDAwMDA0MCAgICAgIC8qIE9GRE0gY2hhbm5lbCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl8yR0haICAgICAgICAgICAgIDB4MDAwMDAwODAgICAgICAvKiAyIEdIeiBzcGVjdHJ1bSBjaGFubmVsLiAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl81R0haICAgICAgICAgICAgIDB4MDAwMDAxMDAgICAgICAvKiA1IEdIeiBzcGVjdHJ1bSBjaGFubmVsICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX1BBU1NJVkUgICAgICAgICAgMHgwMDAwMDIwMCAgICAgIC8qIE9ubHkgcGFzc2l2ZSBzY2FuIGFsbG93ZWQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fRFlOICAgICAgICAgICAgICAweDAwMDAwNDAwICAgICAgLyogRHluYW1pYyBDQ0stT0ZETSBjaGFubmVsICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0dGU0sgICAgICAgICAgICAgMHgwMDAwMDgwMCAgICAgIC8qIEdGU0sgY2hhbm5lbCAoRkhTUyBQSFkpICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX1JBREFSX0RGUyAgICAgICAgMHgwMDAwMTAwMCAgICAgIC8qIFJhZGFyIGZvdW5kIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fU1RVUkJPICAgICAgICAgICAweDAwMDAyMDAwICAgICAgLyogMTFhIHN0YXRpYyB0dXJibyBjaGFubmVsIG9ubHkgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fSEFMRiAgICAgICAgICAgICAweDAwMDA0MDAwICAgICAgLyogSGFsZiByYXRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fUVVBUlRFUiAgICAgICAgICAweDAwMDA4MDAwICAgICAgLyogUXVhcnRlciByYXRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fSFQyMCAgICAgICAgICAgICAweDAwMDEwMDAwICAgICAgLyogSFQgMjAgY2hhbm5lbCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9IVDQwUExVUyAgICAgICAgIDB4MDAwMjAwMDAgICAgICAvKiBIVCA0MCB3aXRoIGV4dGVuc2lvbiBjaGFubmVsIGFib3ZlICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0hUNDBNSU5VUyAgICAgICAgMHgwMDA0MDAwMCAgICAgIC8qIEhUIDQwIHdpdGggZXh0ZW5zaW9uIGNoYW5uZWwgYmVsb3cgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fSFQ0MElOVE9MICAgICAgICAweDAwMDgwMDAwICAgICAgLyogSFQgNDAgSW50b2xlcmFudCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9WSFQyMCAgICAgICAgICAgIDB4MDAxMDAwMDAgICAgICAvKiBWSFQgMjAgY2hhbm5lbCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9WSFQ0MFBMVVMgICAgICAgIDB4MDAyMDAwMDAgICAgICAvKiBWSFQgNDAgd2l0aCBleHRlbnNpb24gY2hhbm5lbCBhYm92ZSAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9WSFQ0ME1JTlVTICAgICAgIDB4MDA0MDAwMDAgICAgICAvKiBWSFQgNDAgd2l0aCBleHRlbnNpb24gY2hhbm5lbCBiZWxvdyAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9WSFQ4MCAgICAgICAgICAgIDB4MDA4MDAwMDAgICAgICAvKiBWSFQgODAgY2hhbm5lbCAqLworCisvKiBmbGFnZXh0ICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX1JBREFSX0ZPVU5EICAgIDB4MDEKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fREZTICAgICAgICAgICAgICAweDAwMDIgIC8qIERGUyByZXF1aXJlZCBvbiBjaGFubmVsICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0RGU19DTEVBUiAgICAgICAgMHgwMDA4ICAvKiBpZiBjaGFubmVsIGhhcyBiZWVuIGNoZWNrZWQgZm9yIERGUyAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl8xMURfRVhDTFVERUQgICAgIDB4MDAxMCAgLyogZXhjbHVkZWQgaW4gMTFEICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0NTQV9SRUNFSVZFRCAgICAgMHgwMDIwICAvKiBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgcmVjZWl2ZWQgb24gdGhpcyBjaGFubmVsICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0RJU0FMTE9XX0FESE9DICAgMHgwMDQwICAvKiBhZC1ob2MgaXMgbm90IGFsbG93ZWQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fRElTQUxMT1dfSE9TVEFQICAweDAwODAgIC8qIFN0YXRpb24gb25seSBjaGFubmVsICovCisKKy8qCisgKiBVc2VmdWwgY29tYmluYXRpb25zIG9mIGNoYW5uZWwgY2hhcmFjdGVyaXN0aWNzLgorICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0ZIU1MgXAorCShJRUVFODAyMTFfQ0hBTl8yR0haIHwgSUVFRTgwMjExX0NIQU5fR0ZTSykKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fQSBcCisJKElFRUU4MDIxMV9DSEFOXzVHSFogfCBJRUVFODAyMTFfQ0hBTl9PRkRNKQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9CIFwKKwkoSUVFRTgwMjExX0NIQU5fMkdIWiB8IElFRUU4MDIxMV9DSEFOX0NDSykKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fUFVSRUcgXAorCShJRUVFODAyMTFfQ0hBTl8yR0haIHwgSUVFRTgwMjExX0NIQU5fT0ZETSkKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fRyBcCisJKElFRUU4MDIxMV9DSEFOXzJHSFogfCBJRUVFODAyMTFfQ0hBTl9EWU4pCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOXzEwOEEgXAorCShJRUVFODAyMTFfQ0hBTl81R0haIHwgSUVFRTgwMjExX0NIQU5fT0ZETSB8IElFRUU4MDIxMV9DSEFOX1RVUkJPKQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl8xMDhHIFwKKwkoSUVFRTgwMjExX0NIQU5fMkdIWiB8IElFRUU4MDIxMV9DSEFOX09GRE0gfCBJRUVFODAyMTFfQ0hBTl9UVVJCTykKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fU1QgXAorCShJRUVFODAyMTFfQ0hBTl8xMDhBIHwgSUVFRTgwMjExX0NIQU5fU1RVUkJPKQorCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExQUNfMkcoX2MpIFwKKwkoSUVFRTgwMjExX0lTX0NIQU5fMkdIWigoX2MpKSAmJiBJRUVFODAyMTFfSVNfQ0hBTl9WSFQoKF9jKSkpCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOXzExQUNfVkhUMjBfMkcgXAorCShJRUVFODAyMTFfQ0hBTl8yR0haIHwgSUVFRTgwMjExX0NIQU5fVkhUMjApCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOXzExQUNfVkhUNDBfMkcgXAorCShJRUVFODAyMTFfQ0hBTl8yR0haIHwgSUVFRTgwMjExX0NIQU5fVkhUNDBQTFVTIHwgSUVFRTgwMjExX0NIQU5fVkhUNDBNSU5VUykKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQ4MF8yRyBcCisJKElFRUU4MDIxMV9DSEFOXzJHSFogfCBJRUVFODAyMTFfQ0hBTl9WSFQ4MCkKKworI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMUFDX1ZIVDIwXzJHKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOXzExQUNfVkhUMjBfMkcpID09IElFRUU4MDIxMV9DSEFOXzExQUNfVkhUMjBfMkcpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExQUNfVkhUNDBfMkcoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQ0MF8yRykgIT0gMCkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fMTFBQ19WSFQ4MF8yRyhfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl8xMUFDX1ZIVDgwXzJHKSA9PSBJRUVFODAyMTFfQ0hBTl8xMUFDX1ZIVDgwXzJHKQorCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOXzExTkdfSFQyMCBcCisJKElFRUU4MDIxMV9DSEFOXzJHSFogfCBJRUVFODAyMTFfQ0hBTl9IVDIwKQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl8xMU5BX0hUMjAgXAorCShJRUVFODAyMTFfQ0hBTl81R0haIHwgSUVFRTgwMjExX0NIQU5fSFQyMCkKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fMTFOR19IVDQwUExVUyBcCisJKElFRUU4MDIxMV9DSEFOXzJHSFogfCBJRUVFODAyMTFfQ0hBTl9IVDQwUExVUykKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fMTFOR19IVDQwTUlOVVMgXAorCShJRUVFODAyMTFfQ0hBTl8yR0haIHwgSUVFRTgwMjExX0NIQU5fSFQ0ME1JTlVTKQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl8xMU5BX0hUNDBQTFVTIFwKKwkoSUVFRTgwMjExX0NIQU5fNUdIWiB8IElFRUU4MDIxMV9DSEFOX0hUNDBQTFVTKQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl8xMU5BX0hUNDBNSU5VUyBcCisJKElFRUU4MDIxMV9DSEFOXzVHSFogfCBJRUVFODAyMTFfQ0hBTl9IVDQwTUlOVVMpCisKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fQUxMIFwKKwkoSUVFRTgwMjExX0NIQU5fMkdIWiB8IElFRUU4MDIxMV9DSEFOXzVHSFogfCBJRUVFODAyMTFfQ0hBTl9HRlNLIHwgXAorCSBJRUVFODAyMTFfQ0hBTl9DQ0sgfCBJRUVFODAyMTFfQ0hBTl9PRkRNIHwgSUVFRTgwMjExX0NIQU5fRFlOIHwgXAorCSBJRUVFODAyMTFfQ0hBTl9IVDIwIHwgSUVFRTgwMjExX0NIQU5fSFQ0MFBMVVMgfCBJRUVFODAyMTFfQ0hBTl9IVDQwTUlOVVMgfCBcCisJIElFRUU4MDIxMV9DSEFOX1ZIVDIwIHwgSUVFRTgwMjExX0NIQU5fVkhUNDBQTFVTIHwgSUVFRTgwMjExX0NIQU5fVkhUNDBNSU5VUyB8IElFRUU4MDIxMV9DSEFOX1ZIVDgwIHwgXAorCSBJRUVFODAyMTFfQ0hBTl9IQUxGIHwgSUVFRTgwMjExX0NIQU5fUVVBUlRFUikKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fQUxMVFVSQk8JXAorCShJRUVFODAyMTFfQ0hBTl9BTEwgfCBJRUVFODAyMTFfQ0hBTl9UVVJCTyB8IElFRUU4MDIxMV9DSEFOX1NUVVJCTykKKworI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl9GSFNTKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOX0ZIU1MpID09IElFRUU4MDIxMV9DSEFOX0ZIU1MpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX0EoX2MpCVwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fQSkgPT0gSUVFRTgwMjExX0NIQU5fQSkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fQihfYykJXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9CKSA9PSBJRUVFODAyMTFfQ0hBTl9CKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl9QVVJFRyhfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9QVVJFRykgPT0gSUVFRTgwMjExX0NIQU5fUFVSRUcpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX0coX2MpCVwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fRykgPT0gSUVFRTgwMjExX0NIQU5fRykKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fQU5ZRyhfYykgXAorCShJRUVFODAyMTFfSVNfQ0hBTl9QVVJFRyhfYykgfHwgSUVFRTgwMjExX0lTX0NIQU5fRyhfYykpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX1NUKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOX1NUKSA9PSBJRUVFODAyMTFfQ0hBTl9TVCkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fMTA4QShfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl8xMDhBKSA9PSBJRUVFODAyMTFfQ0hBTl8xMDhBKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMDhHKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOXzEwOEcpID09IElFRUU4MDIxMV9DSEFOXzEwOEcpCisKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fMkdIWihfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl8yR0haKSAhPSAwKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl81R0haKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOXzVHSFopICE9IDApCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX09GRE0oX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fT0ZETSkgIT0gMCkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fQ0NLKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOX0NDSykgIT0gMCkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fR0ZTSyhfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9HRlNLKSAhPSAwKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl9UVVJCTyhfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9UVVJCTykgIT0gMCkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fV0VBVEhFUl9SQURBUihfYykgXAorCSgoKChfYyktPmljX2ZyZXEgPj0gNTYwMCkgJiYgKChfYyktPmljX2ZyZXEgPD0gNTY1MCkpIFwKKwkgfHwgKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOX0hUNDBQTFVTKSAmJiAoNTU4MCA9PSAoX2MpLT5pY19mcmVxKSkpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX1NUVVJCTyhfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9TVFVSQk8pICE9IDApCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX0RUVVJCTyhfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBcCisJICAoSUVFRTgwMjExX0NIQU5fVFVSQk8gfCBJRUVFODAyMTFfQ0hBTl9TVFVSQk8pKSA9PSBJRUVFODAyMTFfQ0hBTl9UVVJCTykKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fSEFMRihfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9IQUxGKSAhPSAwKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl9RVUFSVEVSKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOX1FVQVJURVIpICE9IDApCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX1BBU1NJVkUoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRSkgIT0gMCkKKworI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl9ERlMoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdleHQgJiAoSUVFRTgwMjExX0NIQU5fREZTfElFRUU4MDIxMV9DSEFOX0RGU19DTEVBUikpID09IElFRUU4MDIxMV9DSEFOX0RGUykKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fREZTRkxBRyhfYykgXAorCSgoKF9jKS0+aWNfZmxhZ2V4dCAmIElFRUU4MDIxMV9DSEFOX0RGUykgPT0gSUVFRTgwMjExX0NIQU5fREZTKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl9ESVNBTExPV19BREhPQyhfYykgXAorCSgoKF9jKS0+aWNfZmxhZ2V4dCAmIElFRUU4MDIxMV9DSEFOX0RJU0FMTE9XX0FESE9DKSAhPSAwKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMURfRVhDTFVERUQoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdleHQgJiBJRUVFODAyMTFfQ0hBTl8xMURfRVhDTFVERUQpICE9IDApCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX0NTQShfYykgXAorCSgoKF9jKS0+aWNfZmxhZ2V4dCAmIElFRUU4MDIxMV9DSEFOX0NTQV9SRUNFSVZFRCkgIT0gMCkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fT0REKF9jKSBcCisJKCgoX2MpLT5pY19mcmVxID09IDUxNzApIHx8ICgoX2MpLT5pY19mcmVxID09IDUxOTApIHx8IFwKKwkgKChfYyktPmljX2ZyZXEgPT0gNTIxMCkgfHwgKChfYyktPmljX2ZyZXEgPT0gNTIzMCkpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX0RJU0FMTE9XX0hPU1RBUChfYykgXAorCSgoKF9jKS0+aWNfZmxhZ2V4dCAmIElFRUU4MDIxMV9DSEFOX0RJU0FMTE9XX0hPU1RBUCkgIT0gMCkKKworI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMU5HX0hUMjAoX2MpCVwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fMTFOR19IVDIwKSA9PSBJRUVFODAyMTFfQ0hBTl8xMU5HX0hUMjApCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExTkFfSFQyMChfYykJXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl8xMU5BX0hUMjApID09IElFRUU4MDIxMV9DSEFOXzExTkFfSFQyMCkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fMTFOR19IVDQwUExVUyhfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl8xMU5HX0hUNDBQTFVTKSA9PSBJRUVFODAyMTFfQ0hBTl8xMU5HX0hUNDBQTFVTKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMU5HX0hUNDBNSU5VUyhfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl8xMU5HX0hUNDBNSU5VUykgPT0gSUVFRTgwMjExX0NIQU5fMTFOR19IVDQwTUlOVVMpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExTkFfSFQ0MFBMVVMoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fMTFOQV9IVDQwUExVUykgPT0gSUVFRTgwMjExX0NIQU5fMTFOQV9IVDQwUExVUykKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fMTFOQV9IVDQwTUlOVVMoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fMTFOQV9IVDQwTUlOVVMpID09IElFRUU4MDIxMV9DSEFOXzExTkFfSFQ0ME1JTlVTKQorCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExTihfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiAoSUVFRTgwMjExX0NIQU5fSFQyMCB8IElFRUU4MDIxMV9DSEFOX0hUNDBQTFVTIHwgSUVFRTgwMjExX0NIQU5fSFQ0ME1JTlVTKSkgIT0gMCkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fMTFOX0hUMjAoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgKElFRUU4MDIxMV9DSEFOX0hUMjApKSAhPSAwKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMU5fSFQ0MChfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiAoSUVFRTgwMjExX0NIQU5fSFQ0MFBMVVMgfCBJRUVFODAyMTFfQ0hBTl9IVDQwTUlOVVMpKSAhPSAwKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMU5HKF9jKSBcCisJKElFRUU4MDIxMV9JU19DSEFOXzJHSFooKF9jKSkgJiYgSUVFRTgwMjExX0lTX0NIQU5fMTFOKChfYykpKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMU5BKF9jKSBcCisJKElFRUU4MDIxMV9JU19DSEFOXzVHSFooKF9jKSkgJiYgSUVFRTgwMjExX0lTX0NIQU5fMTFOKChfYykpKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMU5fSFQ0MFBMVVMoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fSFQ0MFBMVVMpICE9IDApCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExTl9IVDQwTUlOVVMoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fSFQ0ME1JTlVTKSAhPSAwKQorCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX0hUMjBfQ0FQQUJMRShfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9IVDIwKSA9PSBJRUVFODAyMTFfQ0hBTl9IVDIwKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl9IVDQwUExVU19DQVBBQkxFKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOX0hUNDBQTFVTKSA9PSBJRUVFODAyMTFfQ0hBTl9IVDQwUExVUykKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fSFQ0ME1JTlVTX0NBUEFCTEUoX2MpCVwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fSFQ0ME1JTlVTKSA9PSBJRUVFODAyMTFfQ0hBTl9IVDQwTUlOVVMpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX0hUNDBfQ0FQQUJMRShfYykgXAorCShJRUVFODAyMTFfSVNfQ0hBTl9IVDQwUExVU19DQVBBQkxFKF9jKSB8fCBJRUVFODAyMTFfSVNfQ0hBTl9IVDQwTUlOVVNfQ0FQQUJMRShfYykpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOX0hUX0NBUEFCTEUoX2MpIFwKKwkoSUVFRTgwMjExX0lTX0NIQU5fSFQyMF9DQVBBQkxFKF9jKSB8fCBJRUVFODAyMTFfSVNfQ0hBTl9IVDQwX0NBUEFCTEUoX2MpKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMU5fQ1RMX0NBUEFCTEUoX2MpICBJRUVFODAyMTFfSVNfQ0hBTl9IVDIwX0NBUEFCTEUoX2MpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExTl9DVExfVV9DQVBBQkxFKF9jKQlcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOX0hUNDBQTFVTKSA9PSBJRUVFODAyMTFfQ0hBTl9IVDQwUExVUykKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fMTFOX0NUTF9MX0NBUEFCTEUoX2MpCVwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fSFQ0ME1JTlVTKSA9PSBJRUVFODAyMTFfQ0hBTl9IVDQwTUlOVVMpCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExTl9DVExfNDBfQ0FQQUJMRShfYykgXAorCShJRUVFODAyMTFfSVNfQ0hBTl8xMU5fQ1RMX1VfQ0FQQUJMRSgoX2MpKSB8fCBJRUVFODAyMTFfSVNfQ0hBTl8xMU5fQ1RMX0xfQ0FQQUJMRSgoX2MpKSkKKworI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl9WSFQoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgKElFRUU4MDIxMV9DSEFOX1ZIVDIwIHwgXAorCQkJICAgIElFRUU4MDIxMV9DSEFOX1ZIVDQwUExVUyB8IElFRUU4MDIxMV9DSEFOX1ZIVDQwTUlOVVMgfCBJRUVFODAyMTFfQ0hBTl9WSFQ4MCkpICE9IDApCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExQUMoX2MpIFwKKwkoIElFRUU4MDIxMV9JU19DSEFOXzVHSFooKF9jKSkgJiYgSUVFRTgwMjExX0lTX0NIQU5fVkhUKChfYykpICkKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQyMCBcCisJKElFRUU4MDIxMV9DSEFOXzVHSFogfCBJRUVFODAyMTFfQ0hBTl9WSFQyMCkKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQ0MCBcCisJKElFRUU4MDIxMV9DSEFOXzVHSFogfCBJRUVFODAyMTFfQ0hBTl9WSFQ0MFBMVVMgfCBJRUVFODAyMTFfQ0hBTl9WSFQ0ME1JTlVTICkKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQ0MFBMVVMgXAorCShJRUVFODAyMTFfQ0hBTl81R0haIHwgSUVFRTgwMjExX0NIQU5fVkhUNDBQTFVTKQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl8xMUFDX1ZIVDQwTUlOVVMgXAorCShJRUVFODAyMTFfQ0hBTl81R0haIHwgSUVFRTgwMjExX0NIQU5fVkhUNDBNSU5VUykKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQ4MCBcCisJKElFRUU4MDIxMV9DSEFOXzVHSFogfCBJRUVFODAyMTFfQ0hBTl9WSFQ4MCkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fMTFBQ19WSFQyMChfYykgXAorCSgoKF9jKS0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl8xMUFDX1ZIVDIwKSA9PSBJRUVFODAyMTFfQ0hBTl8xMUFDX1ZIVDIwKQorCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExQUNfVkhUNDAoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgKElFRUU4MDIxMV9DSEFOX1ZIVDQwUExVUyB8IElFRUU4MDIxMV9DSEFOX1ZIVDQwTUlOVVMpKSAhPTApCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExQUNfVkhUNDBQTFVTKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOXzExQUNfVkhUNDBQTFVTKSA9PSBJRUVFODAyMTFfQ0hBTl8xMUFDX1ZIVDQwUExVUykKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fMTFBQ19WSFQ0ME1JTlVTKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOXzExQUNfVkhUNDBNSU5VUykgPT0gSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQ0ME1JTlVTKQorI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMUFDX1ZIVDgwKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOXzExQUNfVkhUODApID09IElFRUU4MDIxMV9DSEFOXzExQUNfVkhUODApCisKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fUkFEQVIoX2MpICAgIFwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fUkFEQVJfREZTKSA9PSBJRUVFODAyMTFfQ0hBTl9SQURBUl9ERlMpCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX1NFVF9SQURBUihfYykJXAorCSgoX2MpLT5pY19mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9SQURBUl9ERlMpCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0NMUl9SQURBUihfYykJXAorCSgoX2MpLT5pY19mbGFncyAmPSB+SUVFRTgwMjExX0NIQU5fUkFEQVJfREZTKQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9TRVRfRElTQUxMT1dfQURIT0MoX2MpCVwKKwkoKF9jKS0+aWNfZmxhZ2V4dCB8PSBJRUVFODAyMTFfQ0hBTl9ESVNBTExPV19BREhPQykKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fU0VUX0RJU0FMTE9XX0hPU1RBUChfYykJIFwKKwkoKF9jKS0+aWNfZmxhZ2V4dCB8PSBJRUVFODAyMTFfQ0hBTl9ESVNBTExPV19IT1NUQVApCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX1NFVF9ERlMoX2MpICBcCisJKChfYyktPmljX2ZsYWdleHQgfD0gSUVFRTgwMjExX0NIQU5fREZTKQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9TRVRfREZTX0NMRUFSKF9jKSAgXAorCSgoX2MpLT5pY19mbGFnZXh0IHw9IElFRUU4MDIxMV9DSEFOX0RGU19DTEVBUikKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fRVhDTFVERV8xMUQoX2MpCVwKKwkoKF9jKS0+aWNfZmxhZ2V4dCB8PSBJRUVFODAyMTFfQ0hBTl8xMURfRVhDTFVERUQpCisKKy8qIGNoYW5uZWwgZW5jb2RpbmcgZm9yIEZIIHBoeSAqLworI2RlZmluZSBJRUVFODAyMTFfRkhfQ0hBTk1PRCAgICAgICAgICAgIDgwCisjZGVmaW5lIElFRUU4MDIxMV9GSF9DSEFOKHNldCxwYXQpICAgICAgKCgoc2V0KS0xKSpJRUVFODAyMTFfRkhfQ0hBTk1PRCsocGF0KSkKKyNkZWZpbmUgSUVFRTgwMjExX0ZIX0NIQU5TRVQoY2hhbikgICAgICAoKGNoYW4pL0lFRUU4MDIxMV9GSF9DSEFOTU9EKzEpCisjZGVmaW5lIElFRUU4MDIxMV9GSF9DSEFOUEFUKGNoYW4pICAgICAgKChjaGFuKSVJRUVFODAyMTFfRkhfQ0hBTk1PRCkKKworLyoKKyAqIDgwMi4xMSByYXRlIHNldC4KKyAqLworI2RlZmluZSBJRUVFODAyMTFfUkFURV9TSVpFICAgICA4ICAgICAgIC8qIDgwMi4xMSBzdGFuZGFyZCAqLworI2RlZmluZSBJRUVFODAyMTFfUkFURV9NQVhTSVpFICAzNiAgICAgIC8qIG1heCByYXRlcyB3ZSdsbCBoYW5kbGUgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0hUX1JBVEVfU0laRSAgMTI4CisjZGVmaW5lIElFRUU4MDIxMV9SQVRFX1NJTkdMRV9TVFJFQU1fTUNTX01BWCAgICAgNyAgICAgIC8qIE1DUzcgKi8KKworI2RlZmluZSBJRUVFODAyMTFfUkFURV9NQ1MgICAgICAweDgwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1JBVEVfTUNTX1ZBTCAgMHg3RkZGCisKKyNkZWZpbmUgSUVFRTgwMjExX1JBVEVfSURYX0VOVFJZKHZhbCwgaWR4KSAoKCh2YWwmKDB4ZmY8PChpZHgqOCkpKT4+KGlkeCo4KSkpCisKKy8qCisgKiBSU1NJIHJhbmdlCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1JTU0lfTUFYICAgICAgICAgICAtMTAgICAgICAgIC8qIGluIGRiICovCisjZGVmaW5lIElFRUU4MDIxMV9SU1NJX01JTiAgICAgICAgICAgLTIwMAorCisvKgorICogMTFuIEEtTVBEVSAmIEEtTVNEVSBsaW1pdHMKKyAqLworI2RlZmluZSBJRUVFODAyMTFfQU1QRFVfTElNSVRfTUlOICAgICAgICAgICAoMSAqIDEwMjQpCisjZGVmaW5lIElFRUU4MDIxMV9BTVBEVV9MSU1JVF9NQVggICAgICAgICAgICg2NCAqIDEwMjQgLSAxKQorI2RlZmluZSBJRUVFODAyMTFfQU1QRFVfTElNSVRfREVGQVVMVCAgICAgICBJRUVFODAyMTFfQU1QRFVfTElNSVRfTUFYCisjZGVmaW5lIElFRUU4MDIxMV9BTVBEVV9TVUJGUkFNRV9NSU4gICAgICAgIDIKKyNkZWZpbmUgSUVFRTgwMjExX0FNUERVX1NVQkZSQU1FX01BWCAgICAgICAgNjQKKyNkZWZpbmUgSUVFRTgwMjExX0FNUERVX1NVQkZSQU1FX0RFRkFVTFQgICAgMzIKKyNkZWZpbmUgSUVFRTgwMjExX0FNU0RVX0xJTUlUX01BWCAgICAgICAgICAgNDA5NgorI2RlZmluZSBJRUVFODAyMTFfUklGU19BR0dSX0RJViAgICAgICAgICAgICAxMAorI2RlZmluZSBJRUVFODAyMTFfTUFYX0FNUERVX01JTiAgICAgICAgICAgICAwCisjZGVmaW5lIElFRUU4MDIxMV9NQVhfQU1QRFVfTUFYICAgICAgICAgICAgIDMKKworLyoKKyAqIDExYWMgQS1NUERVIGxpbWl0cworICovCisjZGVmaW5lIElFRUU4MDIxMV9WSFRfTUFYX0FNUERVX01JTiAgICAgICAgIDAKKyNkZWZpbmUgSUVFRTgwMjExX1ZIVF9NQVhfQU1QRFVfTUFYICAgICAgICAgNworCitzdHJ1Y3QgaWVlZTgwMjExX3JhdGVzZXQgeworCXVpbnQ4X3QgcnNfbnJhdGVzOworCXVpbnQ4X3QgcnNfcmF0ZXNbSUVFRTgwMjExX1JBVEVfTUFYU0laRV07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbl9pbmZvIHsKKwl1aW50OF90IGVzc2lkW0lFRUU4MDIxMV9OV0lEX0xFTiArIDFdOworCXVpbnQ4X3QgZXNzbGVuOworCXVpbnQ4X3QgcnNzaV9jdGxfMDsKKwl1aW50OF90IHJzc2lfY3RsXzE7CisJdWludDhfdCByc3NpX2N0bF8yOworCWludCBudW1jaGFpbnM7Cit9OworCisjZGVmaW5lIElFRUU4MDIxMV9BRERSX0xFTiAgNiAgIC8qIHNpemUgb2YgODAyLjExIGFkZHJlc3MgKi8KKworc3RydWN0IGllZWU4MDIxMV9pYnNzX3BlZXJfbGlzdCB7CisJdWludDhfdCBic3NpZFtJRUVFODAyMTFfQUREUl9MRU5dOworfTsKKworc3RydWN0IGllZWU4MDIxMV9yb2FtIHsKKwlpbnQ4X3QgcnNzaTExYTsgICAgICAgICAvKiByc3NpIHRocmVzaCBmb3IgMTFhIGJzcyAqLworCWludDhfdCByc3NpMTFiOyAgICAgICAgIC8qIGZvciAxMWcgc3RhIGluIDExYiBic3MgKi8KKwlpbnQ4X3QgcnNzaTExYk9ubHk7ICAgICAvKiBmb3IgMTFiIHN0YSAqLworCXVpbnQ4X3QgcGFkMTsKKwl1aW50OF90IHJhdGUxMWE7ICAgICAgICAvKiByYXRlIHRocmVzaCBmb3IgMTFhIGJzcyAqLworCXVpbnQ4X3QgcmF0ZTExYjsgICAgICAgIC8qIGZvciAxMWcgc3RhIGluIDExYiBic3MgKi8KKwl1aW50OF90IHJhdGUxMWJPbmx5OyAgICAvKiBmb3IgMTFiIHN0YSAqLworCXVpbnQ4X3QgcGFkMjsKK307CisKKyNkZWZpbmUgSUVFRTgwMjExX1RJRF9TSVpFICAgICAgMTcgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgVElEcyAqLworI2RlZmluZSBJRUVFODAyMTFfTk9OX1FPU19TRVEgICAxNiAgICAgIC8qIGluZGV4IGZvciBub24tUW9TIChpbmNsdWRpbmcgbWFuYWdlbWVudCkgc2VxdWVuY2UgbnVtYmVyIHNwYWNlICovCisjZGVmaW5lIElFRUU4MDIxMV9TRVFfTUFTSyAgICAgIDB4ZmZmICAgLyogc2VxdWVuY2UgZ2VuZXJhdG9yIG1hc2sgKi8KKyNkZWZpbmUgTUlOX1NXX1NFUSAgICAgICAgICAgICAgMHgxMDAgICAvKiBtaW5pbXVtIHNlcXVlbmNlIGZvciBTVyBnZW5lcmF0ZSBwYWNrZWN0ICovCisKKy8qIGNyeXB0byByZWxhdGVkIGRlZmluZXMqLworI2RlZmluZSBJRUVFODAyMTFfS0VZQlVGX1NJWkUgICAxNgorI2RlZmluZSBJRUVFODAyMTFfTUlDQlVGX1NJWkUgICAoOCs4KSAgIC8qIHNwYWNlIGZvciBib3RoIHR4K3J4IGtleXMgKi8KKworZW51bSBpZWVlODAyMTFfY2xpc3RfY21kIHsKKwlDTElTVF9VUERBVEUsCisJQ0xJU1RfREZTX1VQREFURSwKKwlDTElTVF9ORVdfQ09VTlRSWSwKKwlDTElTVF9OT0xfVVBEQVRFCit9OworCitlbnVtIGllZWU4MDIxMV9uYXdkc19wYXJhbSB7CisJSUVFRTgwMjExX05BV0RTX1BBUkFNX05VTSA9IDAsCisJSUVFRTgwMjExX05BV0RTX1BBUkFNX01PREUsCisJSUVFRTgwMjExX05BV0RTX1BBUkFNX0RFRkNBUFMsCisJSUVFRTgwMjExX05BV0RTX1BBUkFNX09WRVJSSURFLAorfTsKKworc3RydWN0IGllZWU4MDIxMV9taWJfY3ljbGVfY250cyB7CisJdWludDMyX3QgdHhfZnJhbWVfY291bnQ7CisJdWludDMyX3QgcnhfZnJhbWVfY291bnQ7CisJdWludDMyX3QgcnhfY2xlYXJfY291bnQ7CisJdWludDMyX3QgY3ljbGVfY291bnQ7CisJdWludDhfdCBpc19yeF9hY3RpdmU7CisJdWludDhfdCBpc190eF9hY3RpdmU7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2NoYW51dGlsX2luZm8geworCXVpbnQzMl90IHJ4X2NsZWFyX2NvdW50OworCXVpbnQzMl90IGN5Y2xlX2NvdW50OworCXVpbnQ4X3QgdmFsdWU7CisJdWludDMyX3QgYmVhY29uX2NvdW50OworCXVpbnQ4X3QgYmVhY29uX2ludGVydmFsczsKK307CisKKyNlbmRpZiAvKiBDRFNfQ09NTU9OX19JRUVFODAyMTFfSV9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZHMvc3JjL2Nkc19tcS5jIGIvY29yZS9jZHMvc3JjL2Nkc19tcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTRlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Nkcy9zcmMvY2RzX21xLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiBjZHNfbXEuYworICoKKyAqIENvbm5lY3Rpdml0eSBkcml2ZXIgc2VydmljZXMgKENEUykgbWVzc2FnZSBxdWV1ZSBBUElzCisgKgorICogTWVzc2FnZSBRdWV1ZSBEZWZpbml0aW9ucyBhbmQgQVBJCisgKi8KKworLyogSW5jbHVkZSBGaWxlcyAqLworI2luY2x1ZGUgPGNkc19tcS5oPgorI2luY2x1ZGUgImNkc19zY2hlZC5oIgorI2luY2x1ZGUgPGNkc19hcGkuaD4KKyNpbmNsdWRlICJzaXJfdHlwZXMuaCIKKworLyogUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMgKi8KKworLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24gKi8KKwordFNpclJldFN0YXR1cyB1X21hY19wb3N0X2N0cmxfbXNnKHZvaWQgKnBTaXJHbG9iYWwsIHZvaWQgKnBNYik7CisKKy8qKgorICogY2RzX21xX2luaXQoKSAtIGluaXRpYWxpemUgY2RzIG1lc3NhZ2UgcXVldWUKKyAqIEBwTXE6IFBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgcXVldWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBNZXNzYWdlIHF1ZXVlLgorICoKKyAqIFJldHVybjogY2RmIHN0YXR1cworICovCitpbmxpbmUgQ0RGX1NUQVRVUyBjZHNfbXFfaW5pdChwX2Nkc19tcV90eXBlIHBNcSkKK3sKKworCWlmIChwTXEgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOVUxMIHBvaW50ZXIgcGFzc2VkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyogTm93IGluaXRpYWxpemUgdGhlIGxvY2sgKi8KKwlzcGluX2xvY2tfaW5pdCgmcE1xLT5tcUxvY2spOworCisJLyogTm93IGluaXRpYWxpemUgdGhlIExpc3QgZGF0YSBzdHJ1Y3R1cmUgKi8KKwlJTklUX0xJU1RfSEVBRCgmcE1xLT5tcUxpc3QpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30gLyogY2RzX21xX2luaXQoKSAqLworCisvKioKKyAqIGNkc19tcV9kZWluaXQoKSAtIGRlLWluaXRpYWxpemUgY2RzIG1lc3NhZ2UgcXVldWUKKyAqIEBwTXE6IFBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgcXVldWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRlLWluaXRpYWxpemVzIGNkcyBtZXNzYWdlIHF1ZXVlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK2lubGluZSB2b2lkIGNkc19tcV9kZWluaXQocF9jZHNfbXFfdHlwZSBwTXEpCit7CisJaWYgKHBNcSA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE5VTEwgcG9pbnRlciBwYXNzZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHdpdGggdGhlIGVtYmVkZGVkIGxpc3Qgb3Igc3BpbmxvY2sgKi8KK30gLyogY2RzX21xX2RlaW5pdCgpICovCisKKy8qKgorICogY2RzX21xX3B1dCgpIC0gYWRkIGEgbWVzc2FnZSB0byB0aGUgbWVzc2FnZSBxdWV1ZQorICogQHBNcTogUG9pbnRlciB0byB0aGUgbWVzc2FnZSBxdWV1ZQorICogQHBNc2dXcmFwcGVyOiBNc2cgd3JhcHBlciBjb250YWluaW5nIHRoZSBtZXNzYWdlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK2lubGluZSB2b2lkIGNkc19tcV9wdXQocF9jZHNfbXFfdHlwZSBwTXEsIHBfY2RzX21zZ193cmFwcGVyIHBNc2dXcmFwcGVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKHBNcSA9PSBOVUxMKSB8fCAocE1zZ1dyYXBwZXIgPT0gTlVMTCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwTXEtPm1xTG9jaywgZmxhZ3MpOworCisJbGlzdF9hZGRfdGFpbCgmcE1zZ1dyYXBwZXItPm1zZ05vZGUsICZwTXEtPm1xTGlzdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwTXEtPm1xTG9jaywgZmxhZ3MpOworCit9IC8qIGNkc19tcV9wdXQoKSAqLworCisvKioKKyAqIGNkc19tcV9nZXQoKSAtIGdldCBhIG1lc3NhZ2Ugd2l0aCBpdHMgd3JhcHBlciBmcm9tIGEgbWVzc2FnZSBxdWV1ZQorICogQHBNcTogUG9pbnRlciB0byB0aGUgbWVzc2FnZSBxdWV1ZQorICoKKyAqIFJldHVybjogcG9pbnRlciB0byB0aGUgbWVzc2FnZSB3cmFwcGVyCisgKi8KK2lubGluZSBwX2Nkc19tc2dfd3JhcHBlciBjZHNfbXFfZ2V0KHBfY2RzX21xX3R5cGUgcE1xKQoreworCXBfY2RzX21zZ193cmFwcGVyIHBNc2dXcmFwcGVyID0gTlVMTDsKKworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RwdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChwTXEgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOVUxMIHBvaW50ZXIgcGFzc2VkIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcE1xLT5tcUxvY2ssIGZsYWdzKTsKKworCWlmIChsaXN0X2VtcHR5KCZwTXEtPm1xTGlzdCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSAgIiVzOiBDRFMgTWVzc2FnZSBRdWV1ZSBpcyBlbXB0eSIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlsaXN0cHRyID0gcE1xLT5tcUxpc3QubmV4dDsKKwkJcE1zZ1dyYXBwZXIgPQorCQkJKHBfY2RzX21zZ193cmFwcGVyKSBsaXN0X2VudHJ5KGxpc3RwdHIsIGNkc19tc2dfd3JhcHBlciwKKwkJCQkJCSAgICAgICBtc2dOb2RlKTsKKwkJbGlzdF9kZWwocE1xLT5tcUxpc3QubmV4dCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcE1xLT5tcUxvY2ssIGZsYWdzKTsKKworCXJldHVybiBwTXNnV3JhcHBlcjsKKworfSAvKiBjZHNfbXFfZ2V0KCkgKi8KKworLyoqCisgKiBjZHNfaXNfbXFfZW1wdHkoKSAtIGNoZWNrIGlmIHRoZSBtZXNzYWdlIHF1ZXVlIGlzIGVtcHR5CisgKiBAcE1xOiBQb2ludGVyIHRvIHRoZSBtZXNzYWdlIHF1ZXVlCisgKgorICogUmV0dXJuOiB0cnVlIGlmIG1lc3NhZ2UgcXVldWUgaXMgZW10cHkKKyAqCSAgIGZhbHNlIG90aGVyd2lzZQorICovCitpbmxpbmUgYm9vbCBjZHNfaXNfbXFfZW1wdHkocF9jZHNfbXFfdHlwZSBwTXEpCit7CisJYm9vbCBzdGF0ZSA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocE1xID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwTXEtPm1xTG9jaywgZmxhZ3MpOworCXN0YXRlID0gbGlzdF9lbXB0eSgmcE1xLT5tcUxpc3QpID8gdHJ1ZSA6IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBNcS0+bXFMb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc3RhdGU7Cit9IC8qIGNkc19tcV9nZXQoKSAqLworCisvKioKKyAqIGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKCkgLSBwb3N0IGEgbWVzc2FnZSB0byBhIG1lc3NhZ2UgcXVldWUKKyAqIEBwQnVmOiBQb2ludGVyIHRvIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgY2FsbGVyCisgKgorICogUmV0dXJuOiBjZGYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWModm9pZCAqcEJ1ZikKK3sKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdFNpclJldFN0YXR1cyBzaXJTdGF0dXM7CisJdl9DT05URVhUX3QgY2RzX2NvbnRleHQ7CisJdm9pZCAqaEhhbDsKKworCWNkc19jb250ZXh0ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworCWlmIChOVUxMID09IGNkc19jb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGludmFsaWQgY2RzX2NvbnRleHQiLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJaEhhbCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1NNRSk7CisJCWlmIChOVUxMID09IGhIYWwpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBpbnZhbGlkIGhIYWwiLCBfX2Z1bmNfXyk7CisJCX0gZWxzZSB7CisJCQlzaXJTdGF0dXMgPSB1X21hY19wb3N0X2N0cmxfbXNnKGhIYWwsIHBCdWYpOworCQkJaWYgKGVTSVJfU1VDQ0VTUyA9PSBzaXJTdGF0dXMpCisJCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9CisKKwljZGZfbWVtX2ZyZWUocEJ1Zik7CisKKwlyZXR1cm4gY2RmX3JldF9zdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Nkcy9zcmMvY2RzX3BhY2tldC5jIGIvY29yZS9jZHMvc3JjL2Nkc19wYWNrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGU1ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZHMvc3JjL2Nkc19wYWNrZXQuYwpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgICAgICAgY2RzX3BhY2tldC5jCisKKyAgIFxicmllZiAgICAgICBDb25uZWN0aXZpdHkgZHJpdmVyIHNlcnZpY2VzIChDRFMpIG5ldHdvcmsgUGFja2V0IEFQSXMKKworICAgTmV0d29yayBQcm90b2NvbCBwYWNrZXQvYnVmZmVyIHN1cHBvcnQgaW50ZXJmYWNlcworCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBJbmNsdWRlIEZpbGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPGNkc19wYWNrZXQuaD4KKyNpbmNsdWRlIDxpX2Nkc19wYWNrZXQuaD4KKyNpbmNsdWRlIDxjZGZfbWNfdGltZXIuaD4KKyNpbmNsdWRlIDxjZGZfdHJhY2UuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9tYWluLmg+CisjaW5jbHVkZSAiY2RmX25idWYuaCIKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisKKyNkZWZpbmUgVFhfUEtUX01JTl9IRUFEUk9PTSAgICAgICAgICAoNjQpCisKKy8qIFByb3RvY29sIHNwZWNpZmljIHBhY2tldCB0cmFja2luZyBmZWF0dXJlICovCisjZGVmaW5lIENEU19QS1RfVFJBQ19FVEhfVFlQRV9PRkZTRVQgKDEyKQorI2RlZmluZSBDRFNfUEtUX1RSQUNfSVBfT0ZGU0VUICAgICAgICgxNCkKKyNkZWZpbmUgQ0RTX1BLVF9UUkFDX0lQX0hFQURFUl9TSVpFICAoMjApCisjZGVmaW5lIENEU19QS1RfVFJBQ19ESENQX1NSVl9QT1JUICAgKDY3KQorI2RlZmluZSBDRFNfUEtUX1RSQUNfREhDUF9DTElfUE9SVCAgICg2OCkKKyNkZWZpbmUgQ0RTX1BLVF9UUkFDX0VBUE9MX0VUSF9UWVBFICAoMHg4ODhFKQorI2lmZGVmIFFDQV9QS1RfUFJPVE9fVFJBQ0UKKyNkZWZpbmUgQ0RTX1BLVF9UUkFDX01BWF9TVFJJTkdfTEVOICAoMTIpCisjZGVmaW5lIENEU19QS1RfVFJBQ19NQVhfVFJBQ0VfQlVGICAgKDUwKQorI2RlZmluZSBDRFNfUEtUX1RSQUNfTUFYX1NUUklOR19CVUYgICg2NCkKKworLyogcHJvdG9jb2wgU3RvcmFnZSBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBvcmRlcjsKKwl2X1RJTUVfdCBldmVudF90aW1lOworCWNoYXIgZXZlbnRfc3RyaW5nW0NEU19QS1RfVFJBQ19NQVhfU1RSSU5HX0xFTl07Cit9IGNkc19wa3RfcHJvdG9fdHJhY2VfdDsKKworY2RzX3BrdF9wcm90b190cmFjZV90ICp0cmFjZV9idWZmZXIgPSBOVUxMOwordW5zaWduZWQgaW50IHRyYWNlX2J1ZmZlcl9vcmRlciA9IDA7CitjZGZfc3BpbmxvY2tfdCB0cmFjZV9idWZmZXJfbG9jazsKKyNlbmRpZiAvKiBRQ0FfUEtUX1BST1RPX1RSQUNFICovCisKKy8qKgorICogY2RzX3BrdF9yZXR1cm5fcGFja2V0ICBGcmVlIHRoZSBjZHMgUGFja2V0CisgKiBAIGNkcyBQYWNrZXQKKyAqLworQ0RGX1NUQVRVUyBjZHNfcGt0X3JldHVybl9wYWNrZXQoY2RzX3BrdF90ICpwYWNrZXQpCit7CisJLyogVmFsaWRhdGUgdGhlIGlucHV0IHBhcmFtZXRlciBwb2ludGVyICovCisJaWYgKHVubGlrZWx5KHBhY2tldCA9PSBOVUxMKSkgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCS8qIEZyZWUgdXAgdGhlIEFkZiBuYnVmICovCisJY2RmX25idWZfZnJlZShwYWNrZXQtPnBrdF9idWYpOworCisJcGFja2V0LT5wa3RfYnVmID0gTlVMTDsKKworCS8qIEZyZWUgdXAgdGhlIFJ4IHBhY2tldCAqLworCWNkZl9tZW1fZnJlZShwYWNrZXQpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIGNkc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgoKSAtIEdldCBwYWNrZXQgbGVuZ3RoIGZvciBhIGNkcyBQYWNrZXQKKworICAgVGhpcyBBUEkgcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIGEgY2RzIFBhY2tldC4KKworICAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgY2RzIFBhY2tldCB0byBnZXQgdGhlIHBhY2tldCBsZW5ndGggZnJvbS4KKworICAgXHBhcmFtIHBQYWNrZXRTaXplIC0gbG9jYXRpb24gdG8gcmV0dXJuIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZAorICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY2RzIFBhY2tldC4KKyAgIFxyZXR1cm4KKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTCitjZHNfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKGNkc19wa3RfdCAqcFBhY2tldCwgdWludDE2X3QgKnBQYWNrZXRTaXplKQoreworCS8qIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMgKi8KKwlpZiAodW5saWtlbHkoKHBQYWNrZXQgPT0gTlVMTCkgfHwgKHBQYWNrZXRTaXplID09IE5VTEwpKSB8fAorCSAgICAocFBhY2tldC0+cGt0X2J1ZiA9PSBOVUxMKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIlZQS1QgWyVkXTogTlVMTCBwb2ludGVyIiwgX19MSU5FX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKwkvKiByZXR1cm4gdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiAqLworCSpwUGFja2V0U2l6ZSA9IGNkZl9uYnVmX2xlbihwUGFja2V0LT5wa3RfYnVmKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBAYnJpZWYgY2RzX3BrdF9nZXRfcHJvdG9fdHlwZSgpIC0KKyAgICAgIEZpbmQgcHJvdG9jbyB0eXBlIGZyb20gcGFja2V0IGNvbnRlbnRzCisKKyogc2tiIFBhY2tldCBQb2ludGVyCisqIHRyYWNraW5nX21hcCBwYWNrZXQgdHlwZSB3YW50IHRvIHRyYWNrCisqIGRvdDExX3R5cGUsIHR5cGUgb2YgZG90MTEgZnJhbWUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1aW50OF90IGNkc19wa3RfZ2V0X3Byb3RvX3R5cGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDhfdCB0cmFja2luZ19tYXAsCisJCQkgICAgICAgdWludDhfdCBkb3QxMV90eXBlKQoreworCXVpbnQ4X3QgcGt0X3Byb3RvX3R5cGUgPSAwOworCXVpbnQxNl90IGV0aGVyX3R5cGU7CisJdWludDE2X3QgU1BvcnQ7CisJdWludDE2X3QgRFBvcnQ7CisKKwlpZiAoZG90MTFfdHlwZSkgeworCQlpZiAoZG90MTFfdHlwZSA9PQorCQkgICAgKENEU19QS1RfVFJBQ19UWVBFX01HTVRfQUNUSU9OICYgdHJhY2tpbmdfbWFwKSkKKwkJCXBrdF9wcm90b190eXBlIHw9IENEU19QS1RfVFJBQ19UWVBFX01HTVRfQUNUSU9OOworCisJCS8qIFByb3RvY29sIHR5cGUgbWFwICovCisJCXJldHVybiBwa3RfcHJvdG9fdHlwZTsKKwl9CisKKwkvKiBFQVBPTCBUcmFja2luZyBlbmFibGVkICovCisJaWYgKENEU19QS1RfVFJBQ19UWVBFX0VBUE9MICYgdHJhY2tpbmdfbWFwKSB7CisJCWV0aGVyX3R5cGUgPSAodWludDE2X3QpICgqKHVpbnQxNl90ICopCisJCQkJCSAoc2tiLT5kYXRhICsKKwkJCQkJICBDRFNfUEtUX1RSQUNfRVRIX1RZUEVfT0ZGU0VUKSk7CisJCWlmIChDRFNfUEtUX1RSQUNfRUFQT0xfRVRIX1RZUEUgPT0gQ0RGX1NXQVBfVTE2KGV0aGVyX3R5cGUpKSB7CisJCQlwa3RfcHJvdG9fdHlwZSB8PSBDRFNfUEtUX1RSQUNfVFlQRV9FQVBPTDsKKwkJfQorCX0KKworCS8qIERIQ1AgVHJhY2tpbmcgZW5hYmxlZCAqLworCWlmIChDRFNfUEtUX1RSQUNfVFlQRV9ESENQICYgdHJhY2tpbmdfbWFwKSB7CisJCVNQb3J0ID0gKHVpbnQxNl90KSAoKih1aW50MTZfdCAqKQorCQkJCSAgICAoc2tiLT5kYXRhICsgQ0RTX1BLVF9UUkFDX0lQX09GRlNFVCArCisJCQkJICAgICBDRFNfUEtUX1RSQUNfSVBfSEVBREVSX1NJWkUpKTsKKwkJRFBvcnQgPSAodWludDE2X3QpICgqKHVpbnQxNl90ICopCisJCQkJICAgIChza2ItPmRhdGEgKyBDRFNfUEtUX1RSQUNfSVBfT0ZGU0VUICsKKwkJCQkgICAgIENEU19QS1RfVFJBQ19JUF9IRUFERVJfU0laRSArCisJCQkJICAgICBzaXplb2YodWludDE2X3QpKSk7CisJCWlmICgoKENEU19QS1RfVFJBQ19ESENQX1NSVl9QT1JUID09IENERl9TV0FQX1UxNihTUG9ydCkpCisJCSAgICAgJiYgKENEU19QS1RfVFJBQ19ESENQX0NMSV9QT1JUID09IENERl9TV0FQX1UxNihEUG9ydCkpKQorCQkgICAgfHwgKChDRFNfUEtUX1RSQUNfREhDUF9DTElfUE9SVCA9PSBDREZfU1dBUF9VMTYoU1BvcnQpKQorCQkJJiYgKENEU19QS1RfVFJBQ19ESENQX1NSVl9QT1JUID09IENERl9TV0FQX1UxNihEUG9ydCkpKSkgeworCQkJcGt0X3Byb3RvX3R5cGUgfD0gQ0RTX1BLVF9UUkFDX1RZUEVfREhDUDsKKwkJfQorCX0KKworCS8qIFByb3RvY29sIHR5cGUgbWFwICovCisJcmV0dXJuIHBrdF9wcm90b190eXBlOworfQorCisjaWZkZWYgUUNBX1BLVF9QUk9UT19UUkFDRQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogQGJyaWVmIGNkc19wa3RfdHJhY2VfYnVmX3VwZGF0ZSgpIC0KKyAgICAgIFVwZGF0ZSBzdG9yYWdlIGJ1ZmZlciB3aXRoIGludGVyZXN0IGV2ZW50IHN0cmluZworCisqIGV2ZW50X3N0cmluZyBFdmVudCBTdHJpbmcgbWF5IHBhY2tldCB0eXBlIG9yIG91dHN0YW5kaW5nIGV2ZW50CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjZHNfcGt0X3RyYWNlX2J1Zl91cGRhdGUoY2hhciAqZXZlbnRfc3RyaW5nKQoreworCXVpbnQzMl90IHNsb3Q7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlcyAlZCwgJXMiLCBfX2Z1bmNfXywgX19MSU5FX18sIGV2ZW50X3N0cmluZyk7CisJY2RmX3NwaW5sb2NrX2FjcXVpcmUoJnRyYWNlX2J1ZmZlcl9sb2NrKTsKKwlzbG90ID0gdHJhY2VfYnVmZmVyX29yZGVyICUgQ0RTX1BLVF9UUkFDX01BWF9UUkFDRV9CVUY7CisJdHJhY2VfYnVmZmVyW3Nsb3RdLm9yZGVyID0gdHJhY2VfYnVmZmVyX29yZGVyOworCXRyYWNlX2J1ZmZlcltzbG90XS5ldmVudF90aW1lID0gY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOworCWNkZl9tZW1femVybyh0cmFjZV9idWZmZXJbc2xvdF0uZXZlbnRfc3RyaW5nLAorCQkgICAgIHNpemVvZih0cmFjZV9idWZmZXJbc2xvdF0uZXZlbnRfc3RyaW5nKSk7CisJY2RmX21lbV9jb3B5KHRyYWNlX2J1ZmZlcltzbG90XS5ldmVudF9zdHJpbmcsCisJCSAgICAgZXZlbnRfc3RyaW5nLAorCQkgICAgIChDRFNfUEtUX1RSQUNfTUFYX1NUUklOR19MRU4gPCBzdHJsZW4oZXZlbnRfc3RyaW5nKSkgPworCQkgICAgIENEU19QS1RfVFJBQ19NQVhfU1RSSU5HX0xFTiA6IHN0cmxlbihldmVudF9zdHJpbmcpKTsKKwl0cmFjZV9idWZmZXJfb3JkZXIrKzsKKwljZGZfc3BpbmxvY2tfcmVsZWFzZSgmdHJhY2VfYnVmZmVyX2xvY2spOworCisJcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBAYnJpZWYgY2RzX3BrdF90cmFjZV9idWZfZHVtcCgpIC0KKyAgICAgIER1bXAgc3RvcmVkIGluZm9ybWF0aW9uIGludG8ga2VybmVsIGxvZworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY2RzX3BrdF90cmFjZV9idWZfZHVtcCh2b2lkKQoreworCXVpbnQzMl90IHNsb3QsIGlkeDsKKworCWNkZl9zcGlubG9ja19hY3F1aXJlKCZ0cmFjZV9idWZmZXJfbG9jayk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIlBBQ0tFVCBUUkFDRSBEVU1QIFNUQVJUIEN1cnJlbnQgVGltZXN0YW1wICV1IiwKKwkJICAodW5zaWduZWQgaW50KWNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIk9SREVSIDogICAgICAgIFRJTUUgOiBFVlQiKTsKKwlpZiAoQ0RTX1BLVF9UUkFDX01BWF9UUkFDRV9CVUYgPiB0cmFjZV9idWZmZXJfb3JkZXIpIHsKKwkJZm9yIChzbG90ID0gMDsgc2xvdCA8IHRyYWNlX2J1ZmZlcl9vcmRlcjsgc2xvdCsrKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlNWQgOiUxMnUgOiAlcyIsCisJCQkJICB0cmFjZV9idWZmZXJbc2xvdF0ub3JkZXIsCisJCQkJICAodW5zaWduZWQgaW50KXRyYWNlX2J1ZmZlcltzbG90XS5ldmVudF90aW1lLAorCQkJCSAgdHJhY2VfYnVmZmVyW3Nsb3RdLmV2ZW50X3N0cmluZyk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IENEU19QS1RfVFJBQ19NQVhfVFJBQ0VfQlVGOyBpZHgrKykgeworCQkJc2xvdCA9CisJCQkJKHRyYWNlX2J1ZmZlcl9vcmRlciArCisJCQkJIGlkeCkgJSBDRFNfUEtUX1RSQUNfTUFYX1RSQUNFX0JVRjsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiU1ZCA6JTEydSA6ICVzIiwgdHJhY2VfYnVmZmVyW3Nsb3RdLm9yZGVyLAorCQkJCSAgKHVuc2lnbmVkIGludCl0cmFjZV9idWZmZXJbc2xvdF0uZXZlbnRfdGltZSwKKwkJCQkgIHRyYWNlX2J1ZmZlcltzbG90XS5ldmVudF9zdHJpbmcpOworCQl9CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIlBBQ0tFVCBUUkFDRSBEVU1QIEVORCIpOworCWNkZl9zcGlubG9ja19yZWxlYXNlKCZ0cmFjZV9idWZmZXJfbG9jayk7CisKKwlyZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIEBicmllZiBjZHNfcGt0X3Byb3RvX3RyYWNlX2luaXQoKSAtCisgICAgICBJbml0aWFsaXplIHByb3RvY29sIHRyYWNlIGZ1bmN0aW9uYWxpdHksIGFsbG9jYXRlIHJlcXVpcmVkIHJlc291cmNlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjZHNfcGt0X3Byb3RvX3RyYWNlX2luaXQodm9pZCkKK3sKKwkvKiBJbml0IHNwaW4gbG9jayB0byBwcm90ZWN0IGdsb2JhbCBtZW1vcnkgKi8KKwljZGZfc3BpbmxvY2tfaW5pdCgmdHJhY2VfYnVmZmVyX2xvY2spOworCXRyYWNlX2J1ZmZlcl9vcmRlciA9IDA7CisJdHJhY2VfYnVmZmVyID0KKwkJY2RmX21lbV9tYWxsb2MoQ0RTX1BLVF9UUkFDX01BWF9UUkFDRV9CVUYgKgorCQkJICAgICAgIHNpemVvZihjZHNfcGt0X3Byb3RvX3RyYWNlX3QpKTsKKwljZGZfbWVtX3plcm8oKHZvaWQgKil0cmFjZV9idWZmZXIsCisJCSAgICAgQ0RTX1BLVF9UUkFDX01BWF9UUkFDRV9CVUYgKgorCQkgICAgIHNpemVvZihjZHNfcGt0X3Byb3RvX3RyYWNlX3QpKTsKKworCS8qIFJlZ2lzdGVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIE5CVUYKKwkgKiBMb3dlciBsYXllciBldmVudCBhbHNvIHdpbGwgYmUgcmVwb3J0ZWQgdG8gaGVyZSAqLworCWNkZl9uYnVmX3JlZ190cmFjZV9jYihjZHNfcGt0X3RyYWNlX2J1Zl91cGRhdGUpOworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogQGJyaWVmIGNkc19wa3RfcHJvdG9fdHJhY2VfY2xvc2UoKSAtCisgICAgICBGcmVlIHJlcXVpcmVkIHJlc291cmNlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjZHNfcGt0X3Byb3RvX3RyYWNlX2Nsb3NlKHZvaWQpCit7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIiVzICVkIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwljZGZfbWVtX2ZyZWUodHJhY2VfYnVmZmVyKTsKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmdHJhY2VfYnVmZmVyX2xvY2spOworCisJcmV0dXJuOworfQorI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworI2lmZGVmIE1FTU9SWV9ERUJVRworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogQGJyaWVmIGNkc19wYWNrZXRfYWxsb2NfZGVidWcoKSAtCisgICAgICBBbGxvY2F0ZSBhIG5ldHdvcmsgYnVmZmVyIGZvciBUWAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY2RzX3BhY2tldF9hbGxvY19kZWJ1Zyh1aW50MTZfdCBzaXplLCB2b2lkICoqZGF0YSwgdm9pZCAqKnBwUGFja2V0LAorCQkJCSAgdWludDhfdCAqZmlsZV9uYW1lLCB1aW50MzJfdCBsaW5lX251bSkKK3sKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJY2RmX25idWZfdCBuYnVmOworCisJbmJ1ZiA9CisJCWNkZl9uYnVmX2FsbG9jX2RlYnVnKE5VTEwsIHJvdW5kdXAoc2l6ZSArIFRYX1BLVF9NSU5fSEVBRFJPT00sIDQpLAorCQkJCSAgICAgVFhfUEtUX01JTl9IRUFEUk9PTSwgc2l6ZW9mKHVpbnQzMl90KSwgZmFsc2UsCisJCQkJICAgICBmaWxlX25hbWUsIGxpbmVfbnVtKTsKKworCWlmIChuYnVmICE9IE5VTEwpIHsKKwkJY2RmX25idWZfcHV0X3RhaWwobmJ1Ziwgc2l6ZSk7CisJCWNkZl9uYnVmX3NldF9wcm90b2NvbChuYnVmLCBFVEhfUF9DT05UUk9MKTsKKwkJKnBwUGFja2V0ID0gbmJ1ZjsKKwkJKmRhdGEgPSBjZGZfbmJ1Zl9kYXRhKG5idWYpOworCQljZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gY2RmX3JldF9zdGF0dXM7Cit9CisjZWxzZQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogQGJyaWVmIGNkc19wYWNrZXRfYWxsb2MoKSAtCisgICAgICBBbGxvY2F0ZSBhIG5ldHdvcmsgYnVmZmVyIGZvciBUWAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY2RzX3BhY2tldF9hbGxvYyh1aW50MTZfdCBzaXplLCB2b2lkICoqZGF0YSwgdm9pZCAqKnBwUGFja2V0KQoreworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwljZGZfbmJ1Zl90IG5idWY7CisKKwluYnVmID0gY2RmX25idWZfYWxsb2MoTlVMTCwgcm91bmR1cChzaXplICsgVFhfUEtUX01JTl9IRUFEUk9PTSwgNCksCisJCQkgICAgICBUWF9QS1RfTUlOX0hFQURST09NLCBzaXplb2YodWludDMyX3QpLCBmYWxzZSk7CisKKwlpZiAobmJ1ZiAhPSBOVUxMKSB7CisJCWNkZl9uYnVmX3B1dF90YWlsKG5idWYsIHNpemUpOworCQljZGZfbmJ1Zl9zZXRfcHJvdG9jb2wobmJ1ZiwgRVRIX1BfQ09OVFJPTCk7CisJCSpwcFBhY2tldCA9IG5idWY7CisJCSpkYXRhID0gY2RmX25idWZfZGF0YShuYnVmKTsKKwkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIGNkZl9yZXRfc3RhdHVzOworfQorCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIEBicmllZiBjZHNfcGFja2V0X2ZyZWUoKSAtCisgICAgICBGcmVlIGlucHV0IG5ldHdvcmsgYnVmZmVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjZHNfcGFja2V0X2ZyZWUodm9pZCAqcFBhY2tldCkKK3sKKwljZGZfbmJ1Zl9mcmVlKChjZGZfbmJ1Zl90KSBwUGFja2V0KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvY2RzL3NyYy9jZHNfcmVnX3NlcnZpY2UuYyBiL2NvcmUvY2RzL3NyYy9jZHNfcmVnX3NlcnZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQyNzUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZHMvc3JjL2Nkc19yZWdfc2VydmljZS5jCkBAIC0wLDAgKzEsMTQzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGSUxFOiAgICAgICAgIGNkc19yZWdfc2VydmljZS5jCisgICBPVkVSVklFVzogICAgIFRoaXMgc291cmNlIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIENEUyByZWd1bGF0b3J5IEFQSXMKKyAgIERFUEVOREVOQ0lFUzogTm9uZQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJjZHNfcmVnX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKyNpbmNsdWRlICJzbWVfYXBpLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorI2luY2x1ZGUgImNkc19yZWdkb21haW4uaCIKKyNpbmNsdWRlICJjZHNfcmVnZG9tYWluX2NvbW1vbi5oIgorCisjZGVmaW5lIFdPUkxEX1NLVV9NQVNLICAgICAgICAgIDB4MDBGMAorI2RlZmluZSBXT1JMRF9TS1VfUFJFRklYICAgICAgICAweDAwNjAKKyNkZWZpbmUgTUFYX0NPVU5UUllfQ09VTlQgICAgICAgMzAwCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE0LCAwKSkgfHwgZGVmaW5lZChXSVRIX0JBQ0tQT1JUUykKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOIElFRUU4MDIxMV9DSEFOX05PX0lSCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX05PX0lCU1MgSUVFRTgwMjExX0NIQU5fTk9fSVIKKyNlbmRpZgorCitzdGF0aWMgdl9SRUdET01BSU5fdCB0ZW1wX3JlZ19kb21haW4gPSBSRUdET01BSU5fQ09VTlQ7CisKKy8qIHRydWUgaWYgaW5pdCBoYXBwZW5zIHRocnUgaW5pdCB0aW1lIGRyaXZlciBoaW50ICovCitzdGF0aWMgYm9vbCBpbml0X2J5X2RyaXZlciA9IGZhbHNlOworLyogdHJ1ZSBpZiBpbml0IGhhcHBlbnMgdGhydSBpbml0IHRpbWUgIGNhbGxiYWNrIGZyb20gcmVndWxhdG9yeSBjb3JlLgorICAgdGhpcyBzaG91bGQgYmUgc2V0IHRvIHRydWUgZHVyaW5nIGRyaXZlciByZWxvYWQgKi8KK3N0YXRpYyBib29sIGluaXRfYnlfcmVnX2NvcmUgPSBmYWxzZTsKKworI2RlZmluZSBSRUdfV0FJVF9USU1FICAgICAgICAgICAgNTAKKworI2RlZmluZSBSRUdfUlVMRV8yNDEyXzI0NjIgICAgUkVHX1JVTEUoMjQxMi0xMCwgMjQ2MisxMCwgNDAsIDAsIDIwLCAwKQorCisjZGVmaW5lIFJFR19SVUxFXzI0NjdfMjQ3MiAgICBSRUdfUlVMRSgyNDY3LTEwLCAyNDcyKzEwLCA0MCwgMCwgMjAsIFwKKwkJCSAgICAgIE5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTikKKworI2RlZmluZSBSRUdfUlVMRV8yNDg0ICAgICAgICAgUkVHX1JVTEUoMjQ4NC0xMCwgMjQ4NCsxMCwgNDAsIDAsIDIwLCBcCisJCSAgICAgICBOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4gfCBOTDgwMjExX1JSRl9OT19PRkRNKQorCisjZGVmaW5lIFJFR19SVUxFXzUxODBfNTMyMCAgICBSRUdfUlVMRSg1MTgwLTEwLCA1MzIwKzEwLCA4MCwgMCwgMjAsIFwKKwkJTkw4MDIxMV9SUkZfUEFTU0lWRV9TQ0FOIHwgTkw4MDIxMV9SUkZfTk9fSUJTUykKKworI2RlZmluZSBSRUdfUlVMRV81NTAwXzU3MjAgICAgUkVHX1JVTEUoNTUwMC0xMCwgNTcyMCsxMCwgODAsIDAsIDIwLCBcCisJCU5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTiB8IE5MODAyMTFfUlJGX05PX0lCU1MpCisKKyNkZWZpbmUgUkVHX1JVTEVfNTc0NV81OTI1ICAgIFJFR19SVUxFKDU3NDUtMTAsIDU5MjUrMTAsIDgwLCAwLCAyMCwgXAorCQlOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4gfCBOTDgwMjExX1JSRl9OT19JQlNTKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gY2RzX3dvcmxkX3JlZ2RvbV82MF82MV82MiA9IHsKKwkubl9yZWdfcnVsZXMgPSA2LAorCS5hbHBoYTIgPSAgIjAwIiwKKwkucmVnX3J1bGVzID0geworCQlSRUdfUlVMRV8yNDEyXzI0NjIsCisJCVJFR19SVUxFXzI0NjdfMjQ3MiwKKwkJUkVHX1JVTEVfMjQ4NCwKKwkJUkVHX1JVTEVfNTE4MF81MzIwLAorCQlSRUdfUlVMRV81NTAwXzU3MjAsCisJCVJFR19SVUxFXzU3NDVfNTkyNSwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gY2RzX3dvcmxkX3JlZ2RvbV82M182NSA9IHsKKwkubl9yZWdfcnVsZXMgPSA0LAorCS5hbHBoYTIgPSAgIjAwIiwKKwkucmVnX3J1bGVzID0geworCQlSRUdfUlVMRV8yNDEyXzI0NjIsCisJCVJFR19SVUxFXzI0NjdfMjQ3MiwKKwkJUkVHX1JVTEVfNTE4MF81MzIwLAorCQlSRUdfUlVMRV81NzQ1XzU5MjUsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluIGNkc193b3JsZF9yZWdkb21fNjQgPSB7CisJLm5fcmVnX3J1bGVzID0gMywKKwkuYWxwaGEyID0gICIwMCIsCisJLnJlZ19ydWxlcyA9IHsKKwkJUkVHX1JVTEVfMjQxMl8yNDYyLAorCQlSRUdfUlVMRV81MTgwXzUzMjAsCisJCVJFR19SVUxFXzU3NDVfNTkyNSwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gY2RzX3dvcmxkX3JlZ2RvbV82Nl82OSA9IHsKKwkubl9yZWdfcnVsZXMgPSA0LAorCS5hbHBoYTIgPSAgIjAwIiwKKwkucmVnX3J1bGVzID0geworCQlSRUdfUlVMRV8yNDEyXzI0NjIsCisJCVJFR19SVUxFXzUxODBfNTMyMCwKKwkJUkVHX1JVTEVfNTUwMF81NzIwLAorCQlSRUdfUlVMRV81NzQ1XzU5MjUsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluIGNkc193b3JsZF9yZWdkb21fNjdfNjhfNkFfNkMgPSB7CisJLm5fcmVnX3J1bGVzID0gNSwKKwkuYWxwaGEyID0gICIwMCIsCisJLnJlZ19ydWxlcyA9IHsKKwkJUkVHX1JVTEVfMjQxMl8yNDYyLAorCQlSRUdfUlVMRV8yNDY3XzI0NzIsCisJCVJFR19SVUxFXzUxODBfNTMyMCwKKwkJUkVHX1JVTEVfNTUwMF81NzIwLAorCQlSRUdfUlVMRV81NzQ1XzU5MjUsCisJfQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgcmVnRG9tYWluOworCWNvdW50cnlfY29kZV90IGNvdW50cnlDb2RlOworfSBDb3VudHJ5SW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgY291bnRyeUNvdW50OworCUNvdW50cnlJbmZvX3QgY291bnRyeUluZm9bTUFYX0NPVU5UUllfQ09VTlRdOworfSBDb3VudHJ5SW5mb1RhYmxlX3Q7CisKK3N0YXRpYyBDb3VudHJ5SW5mb1RhYmxlX3QgY291bnRyeV9pbmZvX3RhYmxlID0geworCS8qIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUgaXMgYWx3YXlzIHRoZSB3b3JsZCBkb21haW4gKi8KKwkxMzgsCisJeworCQl7UkVHRE9NQUlOX1dPUkxELCB7JzAnLCAnMCd9fSwgLyogV09STEQgRE9NQUlOICovCisJCXtSRUdET01BSU5fRkNDLCB7J0EnLCAnRCd9fSwgLyogQU5ET1JSQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnQScsICdFJ319LCAvKiBVQUUgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0EnLCAnTCd9fSwgLyogQUxCQU5JQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnQScsICdNJ319LCAvKiBBUk1FTklBICovCisJCXtSRUdET01BSU5fRVRTSSwgeydBJywgJ04nfX0sIC8qIE5FVEhFUkxBTkRTIEFOVElMTEVTICovCisJCXtSRUdET01BSU5fRkNDLCB7J0EnLCAnUid9fSwgLyogQVJHRU5USU5BICovCisJCXtSRUdET01BSU5fRkNDLCB7J0EnLCAnUyd9fSwgLyogQU1FUklDQU4gU09NT0EgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0EnLCAnVCd9fSwgLyogQVVTVFJJQSAqLworCQl7UkVHRE9NQUlOX0ZDQywgeydBJywgJ1UnfX0sIC8qIEFVU1RSQUxJQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnQScsICdXJ319LCAvKiBBUlVCQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnQScsICdaJ319LCAvKiBBWkVSQkFJSkFOICovCisJCXtSRUdET01BSU5fRVRTSSwgeydCJywgJ0EnfX0sIC8qIEJPU05JQSBBTkQgSEVSWkVHT1ZJTkEgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnQicsICdCJ319LCAvKiBCQVJCQURPUyAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnQicsICdEJ319LCAvKiBCQU5HTEFERVNIICovCisJCXtSRUdET01BSU5fRVRTSSwgeydCJywgJ0UnfX0sIC8qIEJFTEdJVU0gKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0InLCAnRyd9fSwgLyogQlVMR0FSSUEgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0InLCAnSCd9fSwgLyogQkFIUkFJTiAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnQicsICdMJ319LCAvKiAqLworCQl7UkVHRE9NQUlOX0ZDQywgeydCJywgJ00nfX0sIC8qIEJFUk1VREEgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0InLCAnTid9fSwgLyogQlJVTkVJIERBUlVTU0FMQU0gKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0InLCAnTyd9fSwgLyogQk9MSVZJQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnQicsICdSJ319LCAvKiBCUkFaSUwgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnQicsICdTJ319LCAvKiBCQUhBTUFTICovCisJCXtSRUdET01BSU5fRVRTSSwgeydCJywgJ1knfX0sIC8qIEJFTEFSVVMgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0InLCAnWid9fSwgLyogQkVMSVpFICovCisJCXtSRUdET01BSU5fRkNDLCB7J0MnLCAnQSd9fSwgLyogQ0FOQURBICovCisJCXtSRUdET01BSU5fRVRTSSwgeydDJywgJ0gnfX0sIC8qIFNXSVRaRVJMQU5EICovCisJCXtSRUdET01BSU5fRVRTSSwgeydDJywgJ0wnfX0sIC8qIENISUxFICovCisJCXtSRUdET01BSU5fRkNDLCB7J0MnLCAnTid9fSwgLyogQ0hJTkEgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnQycsICdPJ319LCAvKiBDT0xPTUJJQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnQycsICdSJ319LCAvKiBDT1NUQSBSSUNBICovCisJCXtSRUdET01BSU5fRVRTSSwgeydDJywgJ1MnfX0sCisJCXtSRUdET01BSU5fRVRTSSwgeydDJywgJ1knfX0sIC8qIENZUFJVUyAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnQycsICdaJ319LCAvKiBDWkVDSCBSRVBVQkxJQyAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnRCcsICdFJ319LCAvKiBHRVJNQU5ZICovCisJCXtSRUdET01BSU5fRVRTSSwgeydEJywgJ0snfX0sIC8qIERFTk1BUksgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnRCcsICdPJ319LCAvKiBET01JTklDQU4gUkVQVUJMSUMgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0QnLCAnWid9fSwgLyogQUxHRVJJQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnRScsICdDJ319LCAvKiBFQ1VBRE9SICovCisJCXtSRUdET01BSU5fRVRTSSwgeydFJywgJ0UnfX0sIC8qIEVTVE9OSUEgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0UnLCAnRyd9fSwgLyogRUdZUFQgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0UnLCAnUyd9fSwgLyogU1BBSU4gKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0YnLCAnSSd9fSwgLyogRklOTEFORCAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnRicsICdSJ319LCAvKiBGUkFOQ0UgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0cnLCAnQid9fSwgLyogVU5JVEVEIEtJTkdET00gKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnRycsICdEJ319LCAvKiBHUkVOQURBICovCisJCXtSRUdET01BSU5fRVRTSSwgeydHJywgJ0UnfX0sIC8qIEdFT1JHSUEgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0cnLCAnRid9fSwgLyogRlJFTkNIIEdVSUFOQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnRycsICdMJ319LCAvKiBHUkVFTkxBTkQgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0cnLCAnUCd9fSwgLyogR1VBREVMT1VQRSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnRycsICdSJ319LCAvKiBHUkVFQ0UgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnRycsICdUJ319LCAvKiBHVUFURU1BTEEgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnRycsICdVJ319LCAvKiBHVUFNICovCisJCXtSRUdET01BSU5fRVRTSSwgeydIJywgJ1UnfX0sIC8qIEhVTkdBUlkgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnSScsICdEJ319LCAvKiBJTkRPTkVTSUEgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0knLCAnRSd9fSwgLyogSVJFTEFORCAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnSScsICdMJ319LCAvKiBJU1JBRUwgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0knLCAnTid9fSwgLyogSU5ESUEgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0knLCAnUid9fSwgLyogSVJBTiwgSVNMQU1JQyBSRVBVQkxJQyBPRiAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnSScsICdTJ319LCAvKiBJQ0VMTkFEICovCisJCXtSRUdET01BSU5fRVRTSSwgeydJJywgJ1QnfX0sIC8qIElUQUxZICovCisJCXtSRUdET01BSU5fRkNDLCB7J0onLCAnTSd9fSwgLyogSkFNQUlDQSAqLworCQl7UkVHRE9NQUlOX0pBUEFOLCB7J0onLCAnUCd9fSwgLyogSkFQQU4gKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0onLCAnTyd9fSwgLyogSk9SREFOICovCisJCXtSRUdET01BSU5fRVRTSSwgeydLJywgJ0UnfX0sIC8qIEtFTllBICovCisJCXtSRUdET01BSU5fRVRTSSwgeydLJywgJ0gnfX0sIC8qIENBTUJPRElBICovCisJCXtSRUdET01BSU5fRVRTSSwgeydLJywgJ1AnfX0sIC8qIEtPUkVBLCBERU1PQ1JBVElDIFBFT1BMRSdzIFJFUFVCTElDIE9GICovCisJCXtSRUdET01BSU5fRVRTSSwgeydLJywgJ1InfX0sIC8qIEtPUkVBLCBSRVBVQkxJQyBPRiAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnSycsICdXJ319LCAvKiBLVVdBSVQgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0snLCAnWid9fSwgLyogS0FaQUtIU1RBTiAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnTCcsICdCJ319LCAvKiBMRUJBTk9OICovCisJCXtSRUdET01BSU5fRVRTSSwgeydMJywgJ0knfX0sIC8qIExJRUNIVEVOU1RFSU4gKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J0wnLCAnSyd9fSwgLyogU1JJLUxBTktBICovCisJCXtSRUdET01BSU5fRVRTSSwgeydMJywgJ1QnfX0sIC8qIExJVEhVQU5JQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnTCcsICdVJ319LCAvKiBMVVhFTUJPVVJHICovCisJCXtSRUdET01BSU5fRVRTSSwgeydMJywgJ1YnfX0sIC8qIExBVFZJQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnTScsICdBJ319LCAvKiBNT1JPQ0NPICovCisJCXtSRUdET01BSU5fRVRTSSwgeydNJywgJ0MnfX0sIC8qIE1PTkFDTyAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnTScsICdLJ319LCAvKiBNQUNFRE9OSUEsIFRIRSBGT1JNRVIgWVVHT1NMQVYgUkVQVUJMSUMgT0YgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnTScsICdOJ319LCAvKiBNT05HT0xJQSAqLworCQl7UkVHRE9NQUlOX0ZDQywgeydNJywgJ08nfX0sIC8qIE1BQ0FPICovCisJCXtSRUdET01BSU5fRkNDLCB7J00nLCAnUCd9fSwgLyogTk9SVEhFUk4gTUFSSUFOQSBJU0xBTkRTICovCisJCXtSRUdET01BSU5fRVRTSSwgeydNJywgJ1EnfX0sIC8qIE1BUlRJTklRVUUgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnTScsICdUJ319LCAvKiBNQUxUQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnTScsICdVJ319LCAvKiBNQVVSSVRJVVMgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J00nLCAnVyd9fSwgLyogTUFMQVdJICovCisJCXtSRUdET01BSU5fRkNDLCB7J00nLCAnWCd9fSwgLyogTUVYSUNPICovCisJCXtSRUdET01BSU5fRVRTSSwgeydNJywgJ1knfX0sIC8qIE1BTEFZU0lBICovCisJCXtSRUdET01BSU5fRVRTSSwgeydOJywgJ0cnfX0sIC8qIE5JR0VSSUEgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnTicsICdJJ319LCAvKiBOSUNBUkFHVUEgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J04nLCAnTCd9fSwgLyogTkVUSEVSTEFORFMgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J04nLCAnTyd9fSwgLyogTk9SV0FZICovCisJCXtSRUdET01BSU5fRVRTSSwgeydOJywgJ1AnfX0sIC8qIE5FUEFMICovCisJCXtSRUdET01BSU5fRkNDLCB7J04nLCAnWid9fSwgLyogTkVXLVpFQUxBTkQgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnTycsICdNJ319LCAvKiBPTUFOICovCisJCXtSRUdET01BSU5fRkNDLCB7J1AnLCAnQSd9fSwgLyogUEFOQU1BICovCisJCXtSRUdET01BSU5fRVRTSSwgeydQJywgJ0UnfX0sIC8qIFBFUlUgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1AnLCAnRid9fSwgLyogRlJFTkNIIFBPTFlORVNJQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnUCcsICdHJ319LCAvKiBQQVBVQSBORVcgR1VJTkVBICovCisJCXtSRUdET01BSU5fRkNDLCB7J1AnLCAnSCd9fSwgLyogUEhJTElQUElORVMgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1AnLCAnSyd9fSwgLyogUEFLSVNUQU4gKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1AnLCAnTCd9fSwgLyogUE9MQU5EICovCisJCXtSRUdET01BSU5fRkNDLCB7J1AnLCAnUid9fSwgLyogUFVFUlRPIFJJQ08gKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnUCcsICdTJ319LCAvKiBQQUxFU1RJTklBTiBURVJSSVRPUlksIE9DQ1VQSUVEICovCisJCXtSRUdET01BSU5fRVRTSSwgeydQJywgJ1QnfX0sIC8qIFBPUlRVR0FMICovCisJCXtSRUdET01BSU5fRkNDLCB7J1AnLCAnWSd9fSwgLyogUEFSQUdVQVkgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1EnLCAnQSd9fSwgLyogUUFUQVIgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1InLCAnRSd9fSwgLyogUkVVTklPTiAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnUicsICdPJ319LCAvKiBST01BSU5JQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnUicsICdTJ319LCAvKiBTRVJCSUEgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1InLCAnVSd9fSwgLyogUlVTU0lBICovCisJCXtSRUdET01BSU5fRkNDLCB7J1InLCAnVyd9fSwgLyogUldBTkRBICovCisJCXtSRUdET01BSU5fRVRTSSwgeydTJywgJ0EnfX0sIC8qIFNBVURJIEFSQUJJQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnUycsICdFJ319LCAvKiBTV0VERU4gKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1MnLCAnRyd9fSwgLyogU0lOR0FQT1JFICovCisJCXtSRUdET01BSU5fRVRTSSwgeydTJywgJ0knfX0sIC8qIFNMT1ZFTk5JQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnUycsICdLJ319LCAvKiBTTE9WQUtJQSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnUycsICdWJ319LCAvKiBFTCBTQUxWQURPUiAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnUycsICdZJ319LCAvKiBTWVJJQU4gQVJBQiBSRVBVQkxJQyAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnVCcsICdIJ319LCAvKiBUSEFJTEFORCAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnVCcsICdOJ319LCAvKiBUVU5JU0lBICovCisJCXtSRUdET01BSU5fRVRTSSwgeydUJywgJ1InfX0sIC8qIFRVUktFWSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnVCcsICdUJ319LCAvKiBUUklOSURBRCBBTkQgVE9CQUdPICovCisJCXtSRUdET01BSU5fRkNDLCB7J1QnLCAnVyd9fSwgLyogVEFJV0FOLCBQUklWSU5DRSBPRiBDSElOQSAqLworCQl7UkVHRE9NQUlOX0ZDQywgeydUJywgJ1onfX0sIC8qIFRBTlpBTklBLCBVTklURUQgUkVQVUJMSUMgT0YgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1UnLCAnQSd9fSwgLyogVUtSQUlORSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnVScsICdHJ319LCAvKiBVR0FOREEgKi8KKwkJe1JFR0RPTUFJTl9GQ0MsIHsnVScsICdTJ319LCAvKiBVU0EgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1UnLCAnWSd9fSwgLyogVVJVR1VBWSAqLworCQl7UkVHRE9NQUlOX0ZDQywgeydVJywgJ1onfX0sIC8qIFVaQkVLSVNUQU4gKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1YnLCAnRSd9fSwgLyogVkVORVpVRUxBICovCisJCXtSRUdET01BSU5fRkNDLCB7J1YnLCAnSSd9fSwgLyogVklSR0lOIElTTEFORFMsIFVTICovCisJCXtSRUdET01BSU5fRVRTSSwgeydWJywgJ04nfX0sIC8qIFZJRVROQU0gKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1knLCAnRSd9fSwgLyogWUVNRU4gKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1knLCAnVCd9fSwgLyogTUFZT1RURSAqLworCQl7UkVHRE9NQUlOX0VUU0ksIHsnWicsICdBJ319LCAvKiBTT1VUSCBBRlJJQ0EgKi8KKwkJe1JFR0RPTUFJTl9FVFNJLCB7J1onLCAnVyd9fSwgLyogWklNQkFCV0UgKi8KKwl9Cit9OworCitjb25zdCB0UmZDaGFubmVsUHJvcHMgcmZfY2hhbm5lbHNbTlVNX1JGX0NIQU5ORUxTXSA9IHsKKwl7MjQxMiwgMX0sCisJezI0MTcsIDJ9LAorCXsyNDIyLCAzfSwKKwl7MjQyNywgNH0sCisJezI0MzIsIDV9LAorCXsyNDM3LCA2fSwKKwl7MjQ0MiwgN30sCisJezI0NDcsIDh9LAorCXsyNDUyLCA5fSwKKwl7MjQ1NywgMTB9LAorCXsyNDYyLCAxMX0sCisJezI0NjcsIDEyfSwKKwl7MjQ3MiwgMTN9LAorCXsyNDg0LCAxNH0sCisJezQ5MjAsIDI0MH0sCisJezQ5NDAsIDI0NH0sCisJezQ5NjAsIDI0OH0sCisJezQ5ODAsIDI1Mn0sCisJezUwNDAsIDIwOH0sCisJezUwNjAsIDIxMn0sCisJezUwODAsIDIxNn0sCisJezUxODAsIDM2fSwKKwl7NTIwMCwgNDB9LAorCXs1MjIwLCA0NH0sCisJezUyNDAsIDQ4fSwKKwl7NTI2MCwgNTJ9LAorCXs1MjgwLCA1Nn0sCisJezUzMDAsIDYwfSwKKwl7NTMyMCwgNjR9LAorCXs1NTAwLCAxMDB9LAorCXs1NTIwLCAxMDR9LAorCXs1NTQwLCAxMDh9LAorCXs1NTYwLCAxMTJ9LAorCXs1NTgwLCAxMTZ9LAorCXs1NjAwLCAxMjB9LAorCXs1NjIwLCAxMjR9LAorCXs1NjQwLCAxMjh9LAorCXs1NjYwLCAxMzJ9LAorCXs1NjgwLCAxMzZ9LAorCXs1NzAwLCAxNDB9LAorCXs1NzIwLCAxNDR9LAorCXs1NzQ1LCAxNDl9LAorCXs1NzY1LCAxNTN9LAorCXs1Nzg1LCAxNTd9LAorCXs1ODA1LCAxNjF9LAorCXs1ODI1LCAxNjV9LAorCXs1ODUyLCAxNzB9LAorCXs1ODU1LCAxNzF9LAorCXs1ODYwLCAxNzJ9LAorCXs1ODY1LCAxNzN9LAorCXs1ODcwLCAxNzR9LAorCXs1ODc1LCAxNzV9LAorCXs1ODgwLCAxNzZ9LAorCXs1ODg1LCAxNzd9LAorCXs1ODkwLCAxNzh9LAorCXs1ODk1LCAxNzl9LAorCXs1OTAwLCAxODB9LAorCXs1OTA1LCAxODF9LAorCXs1OTEwLCAxODJ9LAorCXs1OTE1LCAxODN9LAorCXs1OTIwLCAxODR9LAorCXsyNDIyLCAzfSwKKwl7MjQyNywgNH0sCisJezI0MzIsIDV9LAorCXsyNDM3LCA2fSwKKwl7MjQ0MiwgN30sCisJezI0NDcsIDh9LAorCXsyNDUyLCA5fSwKKwl7MjQ1NywgMTB9LAorCXsyNDYyLCAxMX0sCisJezQ5MzAsIDI0Mn0sCisJezQ5NTAsIDI0Nn0sCisJezQ5NzAsIDI1MH0sCisJezUwNTAsIDIxMH0sCisJezUwNzAsIDIxNH0sCisJezUxOTAsIDM4fSwKKwl7NTIxMCwgNDJ9LAorCXs1MjMwLCA0Nn0sCisJezUyNTAsIDUwfSwKKwl7NTI3MCwgNTR9LAorCXs1MjkwLCA1OH0sCisJezUzMTAsIDYyfSwKKwl7NTUxMCwgMTAyfSwKKwl7NTUzMCwgMTA2fSwKKwl7NTU1MCwgMTEwfSwKKwl7NTU3MCwgMTE0fSwKKwl7NTU5MCwgMTE4fSwKKwl7NTYxMCwgMTIyfSwKKwl7NTYzMCwgMTI2fSwKKwl7NTY1MCwgMTMwfSwKKwl7NTY3MCwgMTM0fSwKKwl7NTY5MCwgMTM4fSwKKwl7NTcxMCwgMTQyfSwKKwl7NTc1NSwgMTUxfSwKKwl7NTc3NSwgMTU1fSwKKwl7NTc5NSwgMTU5fSwKKwl7NTgxNSwgMTYzLCAgICAgICAgICAgICAgICB9LAorfTsKKworc3RhdGljIHRfcmVnX3RhYmxlIHJlZ190YWJsZTsKKworY29uc3Qgc1JlZ3VsYXRvcnlDaGFubmVsICpyZWdfY2hhbm5lbHMgPQorCXJlZ190YWJsZS5yZWdEb21haW5zWzBdLmNoYW5uZWxzOworCisKKy8qKgorICogY2RzX2lzX3d3cl9za3UoKSAtIGlzIHJlZ2RvbWFpbiB3b3JsZCBza3UKKyAqIEByZWdkOiBpbnRlZ2VyIHJlZ3VsYXRvcnkgZG9tYWluCisgKgorICogUmV0dXJuOiBib29sCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBjZHNfaXNfd3dyX3NrdSh1MTYgcmVnZCkKK3sKKwlyZXR1cm4gKChyZWdkICYgQ09VTlRSWV9FUkRfRkxBRykgIT0gQ09VTlRSWV9FUkRfRkxBRykgJiYKKwkgICAgICAgKCgocmVnZCAmIFdPUkxEX1NLVV9NQVNLKSA9PSBXT1JMRF9TS1VfUFJFRklYKSB8fAorCQkocmVnZCA9PSBXT1JMRCkpOworfQorCisvKioKKyAqIGNkc19pc193b3JsZF9yZWdkb21haW4oKSAtIHdoZXRoZXIgd29ybGQgcmVnZG9tYWluCisgKiBAcmVnZDogaW50ZWdlciByZWd1bGF0b3J5IGRvbWFpbgorICoKKyAqIFJldHVybjogYm9vbAorICovCitib29sIGNkc19pc193b3JsZF9yZWdkb21haW4odWludDMyX3QgcmVnZCkKK3sKKwlyZXR1cm4gY2RzX2lzX3d3cl9za3UocmVnZCAmIH5XT1JMRFdJREVfUk9BTUlOR19GTEFHKTsKK30KKworCisvKioKKyAqIGNkc193b3JsZF9yZWdkb21haW4oKSAtIHdoaWNoIGNvbnN0YW50IHdvcmxkIHJlZ2RvbWFpbgorICogQHJlZzogcmVndWxhdG9yeSBkYXRhCisgKgorICogUmV0dXJuOiByZWdkb21haW4gcHRyCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbgorKmNkc193b3JsZF9yZWdkb21haW4oc3RydWN0IHJlZ3VsYXRvcnkgKnJlZykKK3sKKwlSRUdfRE1OX1BBSVJfTUFQUElORyAqcmVncGFpciA9CisJCShSRUdfRE1OX1BBSVJfTUFQUElORyAqKXJlZy0+cmVncGFpcjsKKworCXN3aXRjaCAocmVncGFpci0+cmVnRG1uRW51bSkgeworCWNhc2UgMHg2MDoKKwljYXNlIDB4NjE6CisJY2FzZSAweDYyOgorCQlyZXR1cm4gJmNkc193b3JsZF9yZWdkb21fNjBfNjFfNjI7CisJY2FzZSAweDYzOgorCWNhc2UgMHg2NToKKwkJcmV0dXJuICZjZHNfd29ybGRfcmVnZG9tXzYzXzY1OworCWNhc2UgMHg2NDoKKwkJcmV0dXJuICZjZHNfd29ybGRfcmVnZG9tXzY0OworCWNhc2UgMHg2NjoKKwljYXNlIDB4Njk6CisJCXJldHVybiAmY2RzX3dvcmxkX3JlZ2RvbV82Nl82OTsKKwljYXNlIDB4Njc6CisJY2FzZSAweDY4OgorCWNhc2UgMHg2QToKKwljYXNlIDB4NkM6CisJCXJldHVybiAmY2RzX3dvcmxkX3JlZ2RvbV82N182OF82QV82QzsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlyZXR1cm4gJmNkc193b3JsZF9yZWdkb21fNjBfNjFfNjI7CisJfQorfQorCisvKioKKyAqIGNkc19yZWd1bGF0b3J5X3dpcGh5X2luaXQoKSAtIHJlZ3VsYXRvcnkgd2lwaHkgaW5pdAorICogQGhkZF9jdHg6IGhkZCBjb250ZXh0CisgKiBAcmVnOiByZWd1bGF0b3J5IGRhdGEKKyAqIEB3aXBoeTogd2lwaHkgc3RydWN0dXJlCisgKgorICogUmV0dXJuOiBpbnQKKyAqLworc3RhdGljIGludCBjZHNfcmVndWxhdG9yeV93aXBoeV9pbml0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICAgICBzdHJ1Y3QgcmVndWxhdG9yeSAqcmVnLAorCQkJCSAgICAgc3RydWN0IHdpcGh5ICp3aXBoeSkKK3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmVnX2RvbWFpbjsKKworCWlmIChjZHNfaXNfd29ybGRfcmVnZG9tYWluKHJlZy0+cmVnX2RvbWFpbikpIHsKKwkJcmVnX2RvbWFpbiA9IGNkc193b3JsZF9yZWdkb21haW4ocmVnKTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE0LCAwKSkgfHwgZGVmaW5lZChXSVRIX0JBQ0tQT1JUUykKKwkJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0gUkVHVUxBVE9SWV9DVVNUT01fUkVHOworI2Vsc2UKKwkJd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlk7CisjZW5kaWYKKwl9IGVsc2UgaWYgKGhkZF9jdHgtPmNvbmZpZy0+ZlJlZ0NoYW5nZURlZkNvdW50cnkpIHsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE0LCAwKSkgfHwgZGVmaW5lZChXSVRIX0JBQ0tQT1JUUykKKwkJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0gUkVHVUxBVE9SWV9DVVNUT01fUkVHOworI2Vsc2UKKwkJd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlk7CisjZW5kaWYKKwkJcmVnX2RvbWFpbiA9ICZjZHNfd29ybGRfcmVnZG9tXzYwXzYxXzYyOworCX0gZWxzZSB7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNCwgMCkpIHx8IGRlZmluZWQoV0lUSF9CQUNLUE9SVFMpCisJCXdpcGh5LT5yZWd1bGF0b3J5X2ZsYWdzIHw9IFJFR1VMQVRPUllfU1RSSUNUX1JFRzsKKyNlbHNlCisJCXdpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX1NUUklDVF9SRUdVTEFUT1JZOworI2VuZGlmCisJCXJlZ19kb21haW4gPSAmY2RzX3dvcmxkX3JlZ2RvbV82MF82MV82MjsKKwl9CisKKwkvKgorCSAqIHNhdmUgdGhlIG9yaWdpbmFsIGRyaXZlciByZWd1bGF0b3J5IGZsYWdzCisJICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNCwgMCkpIHx8IGRlZmluZWQoV0lUSF9CQUNLUE9SVFMpCisJaGRkX2N0eC0+cmVnLnJlZ19mbGFncyA9IHdpcGh5LT5yZWd1bGF0b3J5X2ZsYWdzOworI2Vsc2UKKwloZGRfY3R4LT5yZWcucmVnX2ZsYWdzID0gd2lwaHktPmZsYWdzOworI2VuZGlmCisJd2lwaHlfYXBwbHlfY3VzdG9tX3JlZ3VsYXRvcnkod2lwaHksIHJlZ19kb21haW4pOworCisJLyoKKwkgKiByZXN0b3JlIHRoZSBkcml2ZXIgcmVndWxhdG9yeSBmbGFncyBzaW5jZQorCSAqIHdpcGh5X2FwcGx5X2N1c3RvbV9yZWd1bGF0b3J5IG1heSBoYXZlCisJICogY2hhbmdlZCB0aGVtCisJICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNCwgMCkpIHx8IGRlZmluZWQoV0lUSF9CQUNLUE9SVFMpCisJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgPSBoZGRfY3R4LT5yZWcucmVnX2ZsYWdzOworI2Vsc2UKKwl3aXBoeS0+ZmxhZ3MgPSBoZGRfY3R4LT5yZWcucmVnX2ZsYWdzOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjZHNfdXBkYXRlX3JlZ3VsYXRvcnlfaW5mbygpIC0gdXBkYXRlIHJlZ3VsYXRvcnkgaW5mbworICogQGhkZF9jdHg6IGhkZCBjb250ZXh0CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK3N0YXRpYyB2b2lkIGNkc191cGRhdGVfcmVndWxhdG9yeV9pbmZvKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJdWludDMyX3QgY291bnRyeV9jb2RlOworCisJY291bnRyeV9jb2RlID0gY2RzX2dldF9jb3VudHJ5X2Zyb21fYWxwaGEyKGhkZF9jdHgtPnJlZy5hbHBoYTIpOworCisJaGRkX2N0eC0+cmVnLnJlZ19kb21haW4gPSBDT1VOVFJZX0VSRF9GTEFHOworCWhkZF9jdHgtPnJlZy5yZWdfZG9tYWluIHw9IGNvdW50cnlfY29kZTsKKworCWNkc19maWxsX3NvbWVfcmVndWxhdG9yeV9pbmZvKCZoZGRfY3R4LT5yZWcpOworCisJcmV0dXJuOworfQorCisKKy8qKgorICogY2RzX2dldF9jaGFubmVsX2xpc3Rfd2l0aF9wb3dlcigpIC0gcmV0cmlldmUgY2hhbm5lbCBsaXN0IHdpdGggcG93ZXIKKyAqIEBiYXNlX2NoYW5uZWxzOiBiYXNlIGNoYW5uZWxzCisgKiBAbnVtX2Jhc2VfY2hhbm5lbHM6IG51bWJlciBvZiBiYXNlIGNoYW5uZWxzCisgKiBAY2hhbm5lbHNfNDBtaHo6IDQwIE1IeiBjaGFubmVscworICogQG51bV80MG1oel9jaGFubmVsczogbnVtYmVyIG9mIDQwIE1oeiBjaGFubmVscworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTCisgKi8KK0NERl9TVEFUVVMgY2RzX2dldF9jaGFubmVsX2xpc3Rfd2l0aF9wb3dlcih0Q2hhbm5lbExpc3RXaXRoUG93ZXIgKgorCQkJCQkgICBiYXNlX2NoYW5uZWxzLAorCQkJCQkgICB1aW50OF90ICpudW1fYmFzZV9jaGFubmVscywKKwkJCQkJICAgdENoYW5uZWxMaXN0V2l0aFBvd2VyICoKKwkJCQkJICAgY2hhbm5lbHNfNDBtaHosCisJCQkJCSAgIHVpbnQ4X3QgKm51bV80MG1oel9jaGFubmVscykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlpbnQgaSwgY291bnQ7CisKKwlpZiAoYmFzZV9jaGFubmVscyAmJiBudW1fYmFzZV9jaGFubmVscykgeworCQljb3VudCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPD0gUkZfQ0hBTl8xNDsgaSsrKSB7CisJCQlpZiAocmVnX2NoYW5uZWxzW2ldLmVuYWJsZWQpIHsKKwkJCQliYXNlX2NoYW5uZWxzW2NvdW50XS5jaGFuSWQgPQorCQkJCQlyZl9jaGFubmVsc1tpXS5jaGFubmVsTnVtOworCQkJCWJhc2VfY2hhbm5lbHNbY291bnQrK10ucHdyID0KKwkJCQkJcmVnX2NoYW5uZWxzW2ldLnB3ckxpbWl0OworCQkJfQorCQl9CisJCWZvciAoaSA9IFJGX0NIQU5fMzY7IGkgPD0gUkZfQ0hBTl8xODQ7IGkrKykgeworCQkJaWYgKHJlZ19jaGFubmVsc1tpXS5lbmFibGVkKSB7CisJCQkJYmFzZV9jaGFubmVsc1tjb3VudF0uY2hhbklkID0KKwkJCQkJcmZfY2hhbm5lbHNbaV0uY2hhbm5lbE51bTsKKwkJCQliYXNlX2NoYW5uZWxzW2NvdW50KytdLnB3ciA9CisJCQkJCXJlZ19jaGFubmVsc1tpXS5wd3JMaW1pdDsKKwkJCX0KKwkJfQorCQkqbnVtX2Jhc2VfY2hhbm5lbHMgPSBjb3VudDsKKwl9CisKKwlpZiAoY2hhbm5lbHNfNDBtaHogJiYgbnVtXzQwbWh6X2NoYW5uZWxzKSB7CisJCWNvdW50ID0gMDsKKworCQlmb3IgKGkgPSBSRl9DSEFOX0JPTkRfMzsgaSA8PSBSRl9DSEFOX0JPTkRfMTE7IGkrKykgeworCQkJaWYgKHJlZ19jaGFubmVsc1tpXS5lbmFibGVkKSB7CisJCQkJY2hhbm5lbHNfNDBtaHpbY291bnRdLmNoYW5JZCA9CisJCQkJCXJmX2NoYW5uZWxzW2ldLmNoYW5uZWxOdW07CisJCQkJY2hhbm5lbHNfNDBtaHpbY291bnQrK10ucHdyID0KKwkJCQkJcmVnX2NoYW5uZWxzW2ldLnB3ckxpbWl0OworCQkJfQorCQl9CisKKwkJZm9yIChpID0gUkZfQ0hBTl9CT05EXzM4OyBpIDw9IFJGX0NIQU5fQk9ORF8xNjM7IGkrKykgeworCQkJaWYgKHJlZ19jaGFubmVsc1tpXS5lbmFibGVkKSB7CisJCQkJY2hhbm5lbHNfNDBtaHpbY291bnRdLmNoYW5JZCA9CisJCQkJCXJmX2NoYW5uZWxzW2ldLmNoYW5uZWxOdW07CisJCQkJY2hhbm5lbHNfNDBtaHpbY291bnQrK10ucHdyID0KKwkJCQkJcmVnX2NoYW5uZWxzW2ldLnB3ckxpbWl0OworCQkJfQorCQl9CisJCSpudW1fNDBtaHpfY2hhbm5lbHMgPSBjb3VudDsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNkc19yZWFkX2RlZmF1bHRfY291bnRyeSgpIC0gc2V0IHRoZSBkZWZhdWx0IGNvdW50cnkKKyAqIEBkZWZhdWx0X2NvdW50cnk6IGRlZmF1bHQgY291bnRyeQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIGNkc19yZWFkX2RlZmF1bHRfY291bnRyeShjb3VudHJ5X2NvZGVfdCBkZWZhdWx0X2NvdW50cnkpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwltZW1jcHkoZGVmYXVsdF9jb3VudHJ5LAorCSAgICAgICByZWdfdGFibGUuZGVmYXVsdF9jb3VudHJ5LAorCSAgICAgICBzaXplb2YoY291bnRyeV9jb2RlX3QpKTsKKworCXByX2luZm8oIkRlZmF1bHRDb3VudHJ5IGlzICVjJWNcbiIsCisJCWRlZmF1bHRfY291bnRyeVswXSwKKwkJZGVmYXVsdF9jb3VudHJ5WzFdKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY2RzX2dldF9jaGFubmVsX2VudW0oKSAtIGdldCB0aGUgY2hhbm5lbCBlbnVtZXJhdGlvbgorICogQGNoYW5fbnVtOiBjaGFubmVsIG51bWJlcgorICoKKyAqIFJldHVybjogZW51bSBmb3IgdGhlIGNoYW5uZWwKKyAqLworc3RhdGljIGVSZkNoYW5uZWxzIGNkc19nZXRfY2hhbm5lbF9lbnVtKHVpbnQzMl90IGNoYW5fbnVtKQoreworCXVpbnQzMl90IGxvb3A7CisKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDw9IFJGX0NIQU5fMTg0OyBsb29wKyspCisJCWlmIChyZl9jaGFubmVsc1tsb29wXS5jaGFubmVsTnVtID09IGNoYW5fbnVtKQorCQkJcmV0dXJuIGxvb3A7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiaW52YWxpZCBjaGFubmVsIG51bWJlciAlZCIsIGNoYW5fbnVtKTsKKworCXJldHVybiBJTlZBTElEX1JGX0NIQU5ORUw7Cit9CisKKworLyoqCisgKiBjZHNfZ2V0X2NoYW5uZWxfc3RhdGUoKSAtIGdldCB0aGUgY2hhbm5lbCBzdGF0ZQorICogQGNoYW5uZWxfbnVtOiBjaGFubmVsIG51bWJlcgorICoKKyAqIFJldHVybjogQ0hBTk5FTF9TVEFURQorICovCitDSEFOTkVMX1NUQVRFIGNkc19nZXRfY2hhbm5lbF9zdGF0ZSh1aW50MzJfdCBjaGFuX251bSkKK3sKKwllUmZDaGFubmVscyBjaGFuX2VudW07CisKKwljaGFuX2VudW0gPSBjZHNfZ2V0X2NoYW5uZWxfZW51bShjaGFuX251bSk7CisJaWYgKElOVkFMSURfUkZfQ0hBTk5FTCA9PSBjaGFuX2VudW0pCisJCXJldHVybiBDSEFOTkVMX1NUQVRFX0lOVkFMSUQ7CisJZWxzZQorCQlyZXR1cm4gcmVnX2NoYW5uZWxzW2NoYW5fZW51bV0uZW5hYmxlZDsKK30KKworCisvKioKKyAqIGNkc19nZXRfYm9uZGVkX2NoYW5uZWxfc3RhdGUoKSAtIGdldCB0aGUgYm9uZGVkIGNoYW5uZWwgc3RhdGUKKyAqIEBjaGFubmVsX251bTogY2hhbm5lbCBudW1iZXIKKyAqCisgKiBSZXR1cm46IENIQU5ORUxfU1RBVEUKKyAqLworQ0hBTk5FTF9TVEFURSBjZHNfZ2V0X2JvbmRlZF9jaGFubmVsX3N0YXRlKHVpbnQzMl90IGNoYW5fbnVtLAorCQkJCQkgICBlbnVtIGNoYW5uZWxfd2lkdGggY2hfd2lkdGgpCit7CisJZVJmQ2hhbm5lbHMgY2hhbl9lbnVtOworCWJvb2wgYndfZW5hYmxlZCA9IGZhbHNlOworCisJY2hhbl9lbnVtID0gY2RzX2dldF9jaGFubmVsX2VudW0oY2hhbl9udW0pOworCWlmIChJTlZBTElEX1JGX0NIQU5ORUwgPT0gY2hhbl9lbnVtKQorCQlyZXR1cm4gQ0hBTk5FTF9TVEFURV9JTlZBTElEOworCisJaWYgKHJlZ19jaGFubmVsc1tjaGFuX2VudW1dLmVuYWJsZWQpIHsKKwkJaWYgKENIQU5fV0lEVEhfNU1IWiA9PSBjaF93aWR0aCkKKwkJCWJ3X2VuYWJsZWQgPSAxOworCQllbHNlIGlmIChDSEFOX1dJRFRIXzEwTUhaID09IGNoX3dpZHRoKQorCQkJYndfZW5hYmxlZCA9ICEocmVnX2NoYW5uZWxzW2NoYW5fZW51bV0uZmxhZ3MgJgorCQkJCSAgICAgICBJRUVFODAyMTFfQ0hBTl9OT18xME1IWik7CisJCWVsc2UgaWYgKENIQU5fV0lEVEhfMjBNSFogPT0gY2hfd2lkdGgpCisJCQlid19lbmFibGVkID0gIShyZWdfY2hhbm5lbHNbY2hhbl9lbnVtXS5mbGFncyAmCisJCQkJICAgICAgIElFRUU4MDIxMV9DSEFOX05PXzIwTUhaKTsKKwkJZWxzZSBpZiAoQ0hBTl9XSURUSF80ME1IWiA9PSBjaF93aWR0aCkKKwkJCWJ3X2VuYWJsZWQgPSAhKHJlZ19jaGFubmVsc1tjaGFuX2VudW1dLmZsYWdzICYKKwkJCQkgICAgICAgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MCk7CisJCWVsc2UgaWYgKENIQU5fV0lEVEhfODBNSFogPT0gY2hfd2lkdGgpCisJCQlid19lbmFibGVkID0gIShyZWdfY2hhbm5lbHNbY2hhbl9lbnVtXS5mbGFncyAmCisJCQkJICAgICAgIElFRUU4MDIxMV9DSEFOX05PXzgwTUhaKTsKKwkJZWxzZSBpZiAoQ0hBTl9XSURUSF8xNjBNSFogPT0gY2hfd2lkdGgpCisJCQlid19lbmFibGVkID0gIShyZWdfY2hhbm5lbHNbY2hhbl9lbnVtXS5mbGFncyAmCisJCQkJICAgICAgIElFRUU4MDIxMV9DSEFOX05PXzE2ME1IWik7CisJfQorCisJaWYgKGJ3X2VuYWJsZWQpCisJCXJldHVybiByZWdfY2hhbm5lbHNbY2hhbl9lbnVtXS5lbmFibGVkOworCWVsc2UKKwkJcmV0dXJuIENIQU5ORUxfU1RBVEVfRElTQUJMRTsKK30KKworLyoqCisgKiBjZHNfZ2V0X21heF9jaGFubmVsX2J3KCkgLSBnZXQgdGhlIG1heCBjaGFubmVsIGJhbmR3aWR0aAorICogQGNoYW5uZWxfbnVtOiBjaGFubmVsIG51bWJlcgorICoKKyAqIFJldHVybjogY2hhbm5lbF93aWR0aAorICovCitlbnVtIGNoYW5uZWxfd2lkdGggY2RzX2dldF9tYXhfY2hhbm5lbF9idyh1aW50MzJfdCBjaGFuX251bSkKK3sKKwllUmZDaGFubmVscyBjaGFuX2VudW07CisJZW51bSBjaGFubmVsX3dpZHRoIGNoYW5fYncgPSBDSEFOX1dJRFRIXzBNSFo7CisKKwljaGFuX2VudW0gPSBjZHNfZ2V0X2NoYW5uZWxfZW51bShjaGFuX251bSk7CisKKwlpZiAoKElOVkFMSURfUkZfQ0hBTk5FTCAhPSBjaGFuX2VudW0pICYmCisJICAgIChDSEFOTkVMX1NUQVRFX0RJU0FCTEUgIT0gcmVnX2NoYW5uZWxzW2NoYW5fZW51bV0uZW5hYmxlZCkpIHsKKworCQlpZiAoIShyZWdfY2hhbm5lbHNbY2hhbl9lbnVtXS5mbGFncyAmCisJCSAgICAgIElFRUU4MDIxMV9DSEFOX05PXzE2ME1IWikpCisJCQljaGFuX2J3ID0gQ0hBTl9XSURUSF8xNjBNSFo7CisJCWVsc2UgaWYgKCEocmVnX2NoYW5uZWxzW2NoYW5fZW51bV0uZmxhZ3MgJgorCQkJICAgSUVFRTgwMjExX0NIQU5fTk9fODBNSFopKQorCQkJY2hhbl9idyA9IENIQU5fV0lEVEhfODBNSFo7CisJCWVsc2UgaWYgKCEocmVnX2NoYW5uZWxzW2NoYW5fZW51bV0uZmxhZ3MgJgorCQkJICAgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MCkpCisJCQljaGFuX2J3ID0gQ0hBTl9XSURUSF80ME1IWjsKKwkJZWxzZSBpZiAoIShyZWdfY2hhbm5lbHNbY2hhbl9lbnVtXS5mbGFncyAmCisJCQkgICBJRUVFODAyMTFfQ0hBTl9OT18yME1IWikpCisJCQljaGFuX2J3ID0gQ0hBTl9XSURUSF8yME1IWjsKKwkJZWxzZSBpZiAoIShyZWdfY2hhbm5lbHNbY2hhbl9lbnVtXS5mbGFncyAmCisJCQkgICBJRUVFODAyMTFfQ0hBTl9OT18xME1IWikpCisJCQljaGFuX2J3ID0gQ0hBTl9XSURUSF8xME1IWjsKKwkJZWxzZQorCQkJY2hhbl9idyA9IENIQU5fV0lEVEhfNU1IWjsKKwl9CisKKwlyZXR1cm4gY2hhbl9idzsKKworfQorCitzdGF0aWMgaW50IGNkc19idzIwX2NoX2luZGV4X3RvX2J3NDBfY2hfaW5kZXgoaW50IGspCit7CisJaW50IG0gPSAtMTsKKwlpZiAoayA+PSBSRl9DSEFOXzEgJiYgayA8PSBSRl9DSEFOXzE0KSB7CisJCW0gPSBrIC0gUkZfQ0hBTl8xICsgUkZfQ0hBTl9CT05EXzM7CisJCWlmIChtID4gUkZfQ0hBTl9CT05EXzExKQorCQkJbSA9IFJGX0NIQU5fQk9ORF8xMTsKKwl9IGVsc2UgaWYgKGsgPj0gUkZfQ0hBTl8yNDAgJiYgayA8PSBSRl9DSEFOXzIxNikgeworCQltID0gayAtIFJGX0NIQU5fMjQwICsgUkZfQ0hBTl9CT05EXzI0MjsKKwkJaWYgKG0gPiBSRl9DSEFOX0JPTkRfMjE0KQorCQkJbSA9IFJGX0NIQU5fQk9ORF8yMTQ7CisJfSBlbHNlIGlmIChrID49IFJGX0NIQU5fMzYgJiYgayA8PSBSRl9DSEFOXzY0KSB7CisJCW0gPSBrIC0gUkZfQ0hBTl8zNiArIFJGX0NIQU5fQk9ORF8zODsKKwkJaWYgKG0gPiBSRl9DSEFOX0JPTkRfNjIpCisJCQltID0gUkZfQ0hBTl9CT05EXzYyOworCX0KKwllbHNlIGlmIChrID49IFJGX0NIQU5fMTAwICYmIGsgPD0gUkZfQ0hBTl8xNDQpCisJeworCQltID0gayAtIFJGX0NIQU5fMTAwICsgUkZfQ0hBTl9CT05EXzEwMjsKKwkJaWYgKG0gPiBSRl9DSEFOX0JPTkRfMTQyKQorCQkJbSA9IFJGX0NIQU5fQk9ORF8xNDI7CisJfSBlbHNlIGlmIChrID49IFJGX0NIQU5fMTQ5ICYmIGsgPD0gUkZfQ0hBTl8xNjUpIHsKKwkJbSA9IGsgLSBSRl9DSEFOXzE0OSArIFJGX0NIQU5fQk9ORF8xNTE7CisJCWlmIChtID4gUkZfQ0hBTl9CT05EXzE2MykKKwkJCW0gPSBSRl9DSEFOX0JPTkRfMTYzOworCX0KKwlyZXR1cm4gbTsKK30KKworLyoqCisgKiBjZHNfc2V0X2Rmc19yZWdpb24oKSAtIHNldCB0aGUgZGZzX3JlZ2lvbgorICogQGRmc19yZWdpb246IHRoZSBkZnNfcmVnaW9uIHRvIHNldAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGlmIGRmc19yZWdpb24gc2V0IGNvcnJlY3RseQorICogICAgICAgICBDREZfU1RBVFVTX0VfRVhJU1RTIGlmIGhkZCBjb250ZXh0IG5vdCBmb3VuZAorICovCitDREZfU1RBVFVTIGNkc19zZXRfZGZzX3JlZ2lvbih1aW50OF90IGRmc19yZWdpb24pCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eF9wdHIgPSBOVUxMOworCisJaGRkX2N0eF9wdHIgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9IREQpOworCisJaWYgKE5VTEwgPT0gaGRkX2N0eF9wdHIpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRVhJU1RTOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNCwgMCkpIHx8IGRlZmluZWQoV0lUSF9CQUNLUE9SVFMpCisJaGRkX2N0eF9wdHItPnJlZy5kZnNfcmVnaW9uID0gZGZzX3JlZ2lvbjsKKyNlbHNlCisKKwkvKiByZW1hcCB0aGUgY3RsIGNvZGUgdG8gZGZzIHJlZ2lvbiBjb2RlICovCisJc3dpdGNoIChoZGRfY3R4X3B0ci0+cmVnLmN0bF81ZykgeworCWNhc2UgRkNDOgorCQloZGRfY3R4X3B0ci0+cmVnLmRmc19yZWdpb24gPSBERlNfRkNDX0RPTUFJTjsKKwkJYnJlYWs7CisJY2FzZSBFVFNJOgorCQloZGRfY3R4X3B0ci0+cmVnLmRmc19yZWdpb24gPSBERlNfRVRTSV9ET01BSU47CisJCWJyZWFrOworCWNhc2UgTUtLOgorCQloZGRfY3R4X3B0ci0+cmVnLmRmc19yZWdpb24gPSBERlNfTUtLNF9ET01BSU47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHNldCBkZWZhdWx0IGRmc19yZWdpb24gdG8gRkNDICovCisJCWhkZF9jdHhfcHRyLT5yZWcuZGZzX3JlZ2lvbiA9IERGU19GQ0NfRE9NQUlOOworCQlicmVhazsKKwl9CisjZW5kaWYKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkc19nZXRfZGZzX3JlZ2lvbigpIC0gZ2V0IHRoZSBkZnNfcmVnaW9uCisgKiBAZGZzX3JlZ2lvbjogdGhlIGRmc19yZWdpb24gdG8gcmV0dXJuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgaWYgZGZzX3JlZ2lvbiBzZXQgY29ycmVjdGx5CisgKiAgICAgICAgIENERl9TVEFUVVNfRV9FWElTVFMgaWYgaGRkIGNvbnRleHQgbm90IGZvdW5kCisgKi8KK0NERl9TVEFUVVMgY2RzX2dldF9kZnNfcmVnaW9uKHVpbnQ4X3QgKmRmc19yZWdpb24pCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eF9wdHIgPSBOVUxMOworCisJaGRkX2N0eF9wdHIgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9IREQpOworCisJaWYgKE5VTEwgPT0gaGRkX2N0eF9wdHIpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRVhJU1RTOworCisJKmRmc19yZWdpb24gPSBoZGRfY3R4X3B0ci0+cmVnLmRmc19yZWdpb247CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkc19nZXRfcmVnX2RvbWFpbl9mcm9tX2NvdW50cnlfY29kZSgpIC0gZ2V0IHRoZSByZWd1bGF0b3J5IGRvbWFpbgorICogQHJlZ19kb21haW5fcHRyOiBwdHIgdG8gc3RvcmUgcmVndWxhdG9yeSBkb21haW4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCisgKiAgICAgICAgIENERl9TVEFUVVNfRV9GQVVMVCBvbiBlcnJvcgorICogICAgICAgICBDREZfU1RBVFVTX0VfRU1QVFkgY291bnRyeSB0YWJsZSBlbXB0eQorICovCitDREZfU1RBVFVTIGNkc19nZXRfcmVnX2RvbWFpbl9mcm9tX2NvdW50cnlfY29kZSh2X1JFR0RPTUFJTl90ICpyZWdfZG9tYWluX3B0ciwKKwkJCQkJCWNvbnN0IGNvdW50cnlfY29kZV90CisJCQkJCQljb3VudHJ5X2NvZGUsCisJCQkJCQl2X0NvdW50cnlJbmZvU291cmNlX3Qgc291cmNlKQoreworCXZfQ09OVEVYVF90IGNkc19jb250ZXh0ID0gTlVMTDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gTlVMTDsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gTlVMTDsKKwlpbnQgaTsKKworCWlmIChOVUxMID09IHJlZ19kb21haW5fcHRyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAoIkludmFsaWQgcmVnIGRvbWFpbiBwb2ludGVyIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCSpyZWdfZG9tYWluX3B0ciA9IFJFR0RPTUFJTl9DT1VOVDsKKworCWlmIChOVUxMID09IGNvdW50cnlfY29kZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgKCJDb3VudHJ5IGNvZGUgYXJyYXkgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlpZiAoMCA9PSBjb3VudHJ5X2luZm9fdGFibGUuY291bnRyeUNvdW50KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAoIlJlZyBkb21haW4gdGFibGUgaXMgZW1wdHkiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRU1QVFk7CisJfQorCisJY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisKKwlpZiAoTlVMTCAhPSBjZHNfY29udGV4dCkKKwkJaGRkX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJZWxzZQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0VYSVNUUzsKKworCWlmIChOVUxMID09IGhkZF9jdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICgiSW52YWxpZCBwSGRkQ3R4IHBvaW50ZXIiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJd2lwaHkgPSBoZGRfY3R4LT53aXBoeTsKKworCWlmIChjZHNfaXNfbG9ncF9pbl9wcm9ncmVzcygpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiU1NSIGluIHByb2dyZXNzLCByZXR1cm4iKTsKKwkJKnJlZ19kb21haW5fcHRyID0gdGVtcF9yZWdfZG9tYWluOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCXRlbXBfcmVnX2RvbWFpbiA9IFJFR0RPTUFJTl9DT1VOVDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnRyeV9pbmZvX3RhYmxlLmNvdW50cnlDb3VudCAmJgorCSAgICAgUkVHRE9NQUlOX0NPVU5UID09IHRlbXBfcmVnX2RvbWFpbjsgaSsrKSB7CisJCWlmIChtZW1jbXAoY291bnRyeV9jb2RlLAorCQkJICAgY291bnRyeV9pbmZvX3RhYmxlLmNvdW50cnlJbmZvW2ldLmNvdW50cnlDb2RlLAorCQkJICAgIENEU19DT1VOVFJZX0NPREVfTEVOKSA9PSAwKSB7CisKKwkJCXRlbXBfcmVnX2RvbWFpbiA9CisJCQkJY291bnRyeV9pbmZvX3RhYmxlLmNvdW50cnlJbmZvW2ldLnJlZ0RvbWFpbjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKFJFR0RPTUFJTl9DT1VOVCA9PSB0ZW1wX3JlZ19kb21haW4pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICgiQ291bnRyeSBkb2VzIG5vdCBtYXAgdG8gYW55IFJlZ3VsYXRvcnkgZG9tYWluIikpOworCQl0ZW1wX3JlZ19kb21haW4gPSBSRUdET01BSU5fV09STEQ7CisJfQorCisJaWYgKENPVU5UUllfUVVFUlkgPT0gc291cmNlKSB7CisJCSpyZWdfZG9tYWluX3B0ciA9IHRlbXBfcmVnX2RvbWFpbjsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlpZiAoKENPVU5UUllfSU5JVCA9PSBzb3VyY2UpICYmIChmYWxzZSA9PSBpbml0X2J5X3JlZ19jb3JlKSkgeworCQlpbml0X2J5X2RyaXZlciA9IHRydWU7CisJCWlmICgoJzAnICE9IGNvdW50cnlfY29kZVswXSkgfHwgKCcwJyAhPSBjb3VudHJ5X2NvZGVbMV0pKSB7CisJCQlJTklUX0NPTVBMRVRJT04oaGRkX2N0eC0+cmVnX2luaXQpOworCQkJcmVndWxhdG9yeV9oaW50KHdpcGh5LCBjb3VudHJ5X2NvZGUpOworCQkJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZoZGRfY3R4LT5yZWdfaW5pdCwKKwkJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoUkVHX1dBSVRfVElNRSkpOworCQl9CisJfSBlbHNlIGlmIChDT1VOVFJZX0lFID09IHNvdXJjZSB8fCBDT1VOVFJZX1VTRVIgPT0gc291cmNlKSB7CisJCXJlZ3VsYXRvcnlfaGludF91c2VyKGNvdW50cnlfY29kZSwKKwkJCQkgICAgIE5MODAyMTFfVVNFUl9SRUdfSElOVF9VU0VSKTsKKwl9CisKKwkqcmVnX2RvbWFpbl9wdHIgPSB0ZW1wX3JlZ19kb21haW47CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKyAqIGNkc19pc19kc3JjX2NoYW5uZWwoKSAtIGlzIHRoZSBjaGFubmVsIERTUkMKKyAqIEBjZW50ZXJfZnJlcTogY2VudGVyIGZyZXEgb2YgdGhlIGNoYW5uZWwKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgZHNyYyBjaGFubmVsCisgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIGNkc19pc19kc3JjX2NoYW5uZWwodWludDE2X3QgY2VudGVyX2ZyZXEpCit7CisJc3dpdGNoIChjZW50ZXJfZnJlcSkgeworCWNhc2UgNTg1MjoKKwljYXNlIDU4NjA6CisJY2FzZSA1ODcwOgorCWNhc2UgNTg4MDoKKwljYXNlIDU4OTA6CisJY2FzZSA1OTAwOgorCWNhc2UgNTkxMDoKKwljYXNlIDU5MjA6CisJY2FzZSA1ODc1OgorCWNhc2UgNTkwNToKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgRkVBVFVSRV9TVEFUSUNBTExZX0FERF8xMVBfQ0hBTk5FTFMKKyNkZWZpbmUgREVGQVVMVF8xMVBfUE9XRVIgKDMwKQorI2VuZGlmCisKKy8qKgorICogY2RzX3Byb2Nlc3NfcmVndWxhdG9yeV9kYXRhKCkgLSBwcm9jZXNzIHJlZ3VsYXRvcnkgZGF0YQorICogQHdpcGh5OiB3aXBoeQorICogQGJhbmRfY2FwYWJpbGl0eTogYmFuZF9jYXBhYmlsaXR5CisgKgorICogUmV0dXJuOiBpbnQKKyAqLworc3RhdGljIGludCBjZHNfcHJvY2Vzc19yZWd1bGF0b3J5X2RhdGEoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICAgdWludDhfdCBiYW5kX2NhcGFiaWxpdHksIGJvb2wgcmVzZXQpCit7CisJaW50IGksIGosIG07CisJaW50IGsgPSAwLCBuID0gMDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnX3J1bGUgKnJlZ19ydWxlOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKKwlzUmVndWxhdG9yeUNoYW5uZWwgKnRlbXBfY2hhbl9rOworCXNSZWd1bGF0b3J5Q2hhbm5lbCAqdGVtcF9jaGFuX247CisJc1JlZ3VsYXRvcnlDaGFubmVsICp0ZW1wX2NoYW47CisKKwloZGRfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoTlVMTCA9PSBoZGRfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiaW52YWxpZCBoZGRfY3R4IHBvaW50ZXIiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwloZGRfY3R4LT5pc1ZIVDgwQWxsb3dlZCA9IDA7CisKKwlpZiAoYmFuZF9jYXBhYmlsaXR5ID09IGVDU1JfQkFORF8yNCkKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgImJhbmQgY2FwYWJpbGl0eSBpcyBzZXQgdG8gMkcgb25seSIpOworCisJZm9yIChpID0gMCwgbSA9IDA7IGkgPCBJRUVFODAyMTFfTlVNX0JBTkRTOyBpKyspIHsKKworCQlpZiAoaSA9PSBJRUVFODAyMTFfQkFORF8yR0haICYmIGJhbmRfY2FwYWJpbGl0eSA9PSBlQ1NSX0JBTkRfNUcpCisJCQljb250aW51ZTsKKworCQllbHNlIGlmIChpID09IElFRUU4MDIxMV9CQU5EXzVHSFoKKwkJCSAmJiBiYW5kX2NhcGFiaWxpdHkgPT0gZUNTUl9CQU5EXzI0KQorCQkJY29udGludWU7CisKKwkJaWYgKHdpcGh5LT5iYW5kc1tpXSA9PSBOVUxMKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJlcnJvcjogd2lwaHktPmJhbmRzIGlzIE5VTEwsIGkgPSAlZCIsIGkpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaSA9PSAwKQorCQkJbSA9IDA7CisJCWVsc2UKKwkJCW0gPSB3aXBoeS0+YmFuZHNbaS0xXS0+bl9jaGFubmVscyArIG07CisKKwkJZm9yIChqID0gMDsgaiA8IHdpcGh5LT5iYW5kc1tpXS0+bl9jaGFubmVsczsgaisrKSB7CisKKwkJCWsgPSBtICsgajsKKwkJCW4gPSBjZHNfYncyMF9jaF9pbmRleF90b19idzQwX2NoX2luZGV4KGspOworCisJCQljaGFuID0gJih3aXBoeS0+YmFuZHNbaV0tPmNoYW5uZWxzW2pdKTsKKwkJCXRlbXBfY2hhbl9rID0KKwkJCQkmKHJlZ190YWJsZS5yZWdEb21haW5zW3RlbXBfcmVnX2RvbWFpbl0uCisJCQkJICBjaGFubmVsc1trXSk7CisKKwkJCXRlbXBfY2hhbl9uID0KKwkJCQkmKHJlZ190YWJsZS5yZWdEb21haW5zW3RlbXBfcmVnX2RvbWFpbl0uCisJCQkJICBjaGFubmVsc1tuXSk7CisKKwkJCWlmICgoIXJlc2V0KSAmJgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTQsIDApKSB8fCBkZWZpbmVkKFdJVEhfQkFDS1BPUlRTKQorCQkJICAgICh3aXBoeS0+cmVndWxhdG9yeV9mbGFncyAmCisJCQkgICAgIFJFR1VMQVRPUllfQ1VTVE9NX1JFRykpIHsKKyNlbHNlCisJCQkJKHdpcGh5LT5mbGFncyAmCisJCQkJIFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkpKSB7CisjZW5kaWYKKwkJCQlyZWdfcnVsZSA9IGZyZXFfcmVnX2luZm8od2lwaHksCisJCQkJCQkJIE1IWl9UT19LSFooY2hhbi0+CisJCQkJCQkJCSBjZW50ZXJfZnJlcSkpOworCisJCQkJaWYgKCFJU19FUlIocmVnX3J1bGUpKSB7CisJCQkJCWNoYW4tPmZsYWdzICY9CisJCQkJCQl+SUVFRTgwMjExX0NIQU5fRElTQUJMRUQ7CisKKwkJCQkJaWYgKCEocmVnX3J1bGUtPmZsYWdzICYKKwkJCQkJICAgICAgTkw4MDIxMV9SUkZfREZTKSkgeworCQkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLAorCQkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCQkJICAiJXM6IFJlbW92ZSBwYXNzaXZlIHNjYW4gcmVzdHJpY3Rpb24gZm9yICV1IiwKKwkJCQkJCQkgIF9fZnVuY19fLAorCQkJCQkJCSAgY2hhbi0+Y2VudGVyX2ZyZXEpOworCQkJCQkJY2hhbi0+ZmxhZ3MgJj0KKwkJCQkJCQl+SUVFRTgwMjExX0NIQU5fUkFEQVI7CisJCQkJCX0KKworCQkJCQlpZiAoIShyZWdfcnVsZS0+ZmxhZ3MgJgorCQkJCQkgICAgICBOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4pKSB7CisJCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJCQkgICIlczogUmVtb3ZlIHBhc3NpdmUgc2NhbiByZXN0cmljdGlvbiBmb3IgJXUiLAorCQkJCQkJCSAgX19mdW5jX18sCisJCQkJCQkJICBjaGFuLT5jZW50ZXJfZnJlcSk7CisJCQkJCQljaGFuLT5mbGFncyAmPQorCQkJCQkJICAgfklFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTjsKKwkJCQkJfQorCisJCQkJCWlmICghKHJlZ19ydWxlLT5mbGFncyAmCisJCQkJCSAgICAgIE5MODAyMTFfUlJGX05PX0lCU1MpKSB7CisJCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJCQkgICIlczogUmVtb3ZlIG5vIGlic3MgcmVzdHJpY3Rpb24gZm9yICV1IiwKKwkJCQkJCQkgIF9fZnVuY19fLAorCQkJCQkJCSAgY2hhbi0+Y2VudGVyX2ZyZXEpOworCQkJCQkJY2hhbi0+ZmxhZ3MgJj0KKwkJCQkJCQl+SUVFRTgwMjExX0NIQU5fTk9fSUJTUzsKKwkJCQkJfQorCisJCQkJCWNoYW4tPm1heF9wb3dlciA9IE1CTV9UT19EQk0ocmVnX3J1bGUtPgorCQkJCQkJCQkgICAgIHBvd2VyX3J1bGUuCisJCQkJCQkJCSAgICAgbWF4X2VpcnApOworCQkJCX0KKwkJCX0KKworI2lmZGVmIEZFQVRVUkVfU1RBVElDQUxMWV9BRERfMTFQX0NIQU5ORUxTCisJCQlpZiAoaXNfZHNyY19jaGFubmVsKGNoYW4tPmNlbnRlcl9mcmVxKSkgeworCQkJCXRlbXBfY2hhbl9rLT5lbmFibGVkID0KKwkJCQkJQ0hBTk5FTF9TVEFURV9FTkFCTEU7CisJCQkJdGVtcF9jaGFuX2stPnB3ckxpbWl0ID0KKwkJCQkJREVGQVVMVF8xMVBfUE9XRVI7CisJCQkJdGVtcF9jaGFuX2stPmZsYWdzID0gY2hhbi0+ZmxhZ3M7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJaWYgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpIHsKKwkJCQl0ZW1wX2NoYW5fay0+ZW5hYmxlZCA9CisJCQkJCUNIQU5ORUxfU1RBVEVfRElTQUJMRTsKKwkJCQl0ZW1wX2NoYW5fay0+ZmxhZ3MgPSBjaGFuLT5mbGFnczsKKwkJCQlpZiAobiAhPSAtMSkgeworCQkJCQl0ZW1wX2NoYW5fbi0+ZW5hYmxlZCA9CisJCQkJCQlDSEFOTkVMX1NUQVRFX0RJU0FCTEU7CisJCQkJCXRlbXBfY2hhbl9uLT5mbGFncyA9IGNoYW4tPmZsYWdzOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoY2hhbi0+ZmxhZ3MgJgorCQkJCSAgIChJRUVFODAyMTFfQ0hBTl9SQURBUiB8CisJCQkJICAgIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTYsIDApKQorCQkJCQl8CisJCQkJCUlFRUU4MDIxMV9DSEFOX0lORE9PUl9PTkxZCisjZW5kaWYKKwkJCQkpKSB7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE2LCAwKSkKKwkJCQlpZiAoY2hhbi0+ZmxhZ3MgJgorCQkJCSAgICBJRUVFODAyMTFfQ0hBTl9JTkRPT1JfT05MWSkKKwkJCQkJY2hhbi0+ZmxhZ3MgfD0KKwkJCQkJCUlFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTjsKKyNlbmRpZgorCQkJCXRlbXBfY2hhbl9rLT5lbmFibGVkID0gQ0hBTk5FTF9TVEFURV9ERlM7CisJCQkJdGVtcF9jaGFuX2stPnB3ckxpbWl0ID0KKwkJCQkJY2hhbi0+bWF4X3Bvd2VyOworCQkJCXRlbXBfY2hhbl9rLT5mbGFncyA9IGNoYW4tPmZsYWdzOworCisJCQkJaWYgKG4gIT0gLTEpIHsKKwkJCQkJaWYgKChjaGFuLT5mbGFncyAmCisJCQkJCSAgICAgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MCkgPT0KKwkJCQkJICAgIElFRUU4MDIxMV9DSEFOX05PX0hUNDApIHsKKwkJCQkJCXRlbXBfY2hhbl9uLT5lbmFibGVkID0KKwkJCQkJCQlDSEFOTkVMX1NUQVRFX0RJU0FCTEU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0ZW1wX2NoYW5fbi0+ZW5hYmxlZCA9CisJCQkJCQkJQ0hBTk5FTF9TVEFURV9ERlM7CisJCQkJCQl0ZW1wX2NoYW5fbi0+cHdyTGltaXQgPQorCQkJCQkJCSBjaGFuLT5tYXhfcG93ZXItMzsKKwkJCQkJfQorCQkJCQl0ZW1wX2NoYW5fbi0+ZmxhZ3MgPSBjaGFuLT5mbGFnczsKKwkJCQl9CisJCQkJaWYgKChjaGFuLT5mbGFncyAmCisJCQkJICAgICBJRUVFODAyMTFfQ0hBTl9OT184ME1IWikgPT0gMCkKKwkJCQkJaGRkX2N0eC0+aXNWSFQ4MEFsbG93ZWQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQl0ZW1wX2NoYW5fay0+ZW5hYmxlZCA9IENIQU5ORUxfU1RBVEVfRU5BQkxFOworCQkJCXRlbXBfY2hhbl9rLT5wd3JMaW1pdCA9IGNoYW4tPm1heF9wb3dlcjsKKwkJCQl0ZW1wX2NoYW5fay0+ZmxhZ3MgPSBjaGFuLT5mbGFnczsKKwkJCQlpZiAobiAhPSAtMSkgeworCQkJCQlpZiAoKGNoYW4tPmZsYWdzICYKKwkJCQkJICAgICBJRUVFODAyMTFfQ0hBTl9OT19IVDQwKSA9PQorCQkJCQkgICAgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MCkgeworCQkJCQkJdGVtcF9jaGFuX24tPmVuYWJsZWQgPQorCQkJCQkJCUNIQU5ORUxfU1RBVEVfRElTQUJMRTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRlbXBfY2hhbl9uLT5lbmFibGVkID0KKwkJCQkJCQlDSEFOTkVMX1NUQVRFX0VOQUJMRTsKKwkJCQkJCXRlbXBfY2hhbl9uLT5wd3JMaW1pdCA9CisJCQkJCQkJY2hhbi0+bWF4X3Bvd2VyIC0gMzsKKwkJCQkJfQorCQkJCQl0ZW1wX2NoYW5fbi0+ZmxhZ3MgPSBjaGFuLT5mbGFnczsKKwkJCQl9CisJCQkJaWYgKChjaGFuLT5mbGFncyAmCisJCQkJICAgICBJRUVFODAyMTFfQ0hBTl9OT184ME1IWikgPT0gMCkKKwkJCQkJaGRkX2N0eC0+aXNWSFQ4MEFsbG93ZWQgPSAxOworCQkJfQorCQl9CisJfQorCisJaWYgKDAgPT0gKGhkZF9jdHgtPnJlZy5lZXByb21fcmRfZXh0ICYKKwkJICAoMSA8PCBXSEFMX1JFR19FWFRfRkNDX0NIXzE0NCkpKSB7CisJCXRlbXBfY2hhbiA9ICYocmVnX3RhYmxlLnJlZ0RvbWFpbnNbdGVtcF9yZWdfZG9tYWluXS4KKwkJCSAgICAgIGNoYW5uZWxzW1JGX0NIQU5fMTQ0XSk7CisJCXRlbXBfY2hhbi0+ZW5hYmxlZCA9CisJCQlDSEFOTkVMX1NUQVRFX0RJU0FCTEU7CisJfQorCisJaWYgKGsgPT0gMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgMTQsIDApKSAmJiAhZGVmaW5lZChXSVRIX0JBQ0tQT1JUUykKKy8qKgorICogcmVzdG9yZV9jdXN0b21fcmVnX3NldHRpbmdzKCkgLSByZXN0b3JlIGN1c3RvbSByZWcgc2V0dGluZ3MKKyAqIEB3aXBoeTogd2lwaHkgc3RydWN0dXJlCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIHJlc3RvcmVfY3VzdG9tX3JlZ19zZXR0aW5ncyhzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisJaW50IGk7CisKKwlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgYmFuZCsrKSB7CisJCXNiYW5kID0gd2lwaHktPmJhbmRzW2JhbmRdOworCQlpZiAoIXNiYW5kKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBzYmFuZC0+bl9jaGFubmVsczsgaSsrKSB7CisJCQljaGFuID0gJnNiYW5kLT5jaGFubmVsc1tpXTsKKwkJCWNoYW4tPmZsYWdzID0gY2hhbi0+b3JpZ19mbGFnczsKKwkJCWNoYW4tPm1heF9hbnRlbm5hX2dhaW4gPSBjaGFuLT5vcmlnX21hZzsKKwkJCWNoYW4tPm1heF9wb3dlciA9IGNoYW4tPm9yaWdfbXB3cjsKKwkJfQorCX0KK30KKyNlbmRpZgorCisvKioKKyAqIGhkZF9yZWdfbm90aWZpZXIoKSAtIHJlZ3VsYXRvcnkgbm90aWZpZXIKKyAqIEB3aXBoeTogd2lwaHkKKyAqIEByZXF1ZXN0OiByZWd1bGF0b3J5IHJlcXVlc3QKKyAqCisgKiBSZXR1cm46IHZvaWQgb3IgaW50CisgKi8KK3ZvaWQgaGRkX3JlZ19ub3RpZmllcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkgICAgICBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwllQ3NyQmFuZCBiYW5kX2NhcGFiaWxpdHkgPSBlQ1NSX0JBTkRfQUxMOworCWNvdW50cnlfY29kZV90IGNvdW50cnlfY29kZTsKKwlpbnQgaTsKKwlib29sIHZodDgwX2FsbG93ZWQ7CisJYm9vbCByZXNldCA9IGZhbHNlOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICBGTCgiY291bnRyeTogJWMlYywgaW5pdGlhdG9yICVkLCBkZnNfcmVnaW9uOiAlZCIpLAorCQkgIHJlcXVlc3QtPmFscGhhMlswXSwKKwkJICByZXF1ZXN0LT5hbHBoYTJbMV0sCisJCSAgcmVxdWVzdC0+aW5pdGlhdG9yLAorCQkgIHJlcXVlc3QtPmRmc19yZWdpb24pOworCisJaWYgKE5VTEwgPT0gaGRkX2N0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgKCJJbnZhbGlkIHBIZGRDdHggcG9pbnRlciIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChoZGRfY3R4LT5pc1VubG9hZEluUHJvZ3Jlc3MgfHwgaGRkX2N0eC0+aXNMb2dwSW5Qcm9ncmVzcykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBVbmxvYWRpbmcgb3IgU1NSIGluIFByb2dyZXNzLCBJZ25vcmUhISEiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlzbWVfZ2V0X2ZyZXFfYmFuZChoZGRfY3R4LT5oSGFsLCAmYmFuZF9jYXBhYmlsaXR5KTsKKworCS8qIGZpcnN0IGNoZWNrIGlmIHRoaXMgY2FsbGJhY2sgaXMgaW4gcmVzcG9uc2UgdG8gdGhlIGRyaXZlciBjYWxsYmFjayAqLworCisJc3dpdGNoIChyZXF1ZXN0LT5pbml0aWF0b3IpIHsKKwljYXNlIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVI6CisJY2FzZSBOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09SRToKKwljYXNlIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9VU0VSOgorCisJCWlmICgoZmFsc2UgPT0gaW5pdF9ieV9kcml2ZXIpICYmCisJCSAgICAoZmFsc2UgPT0gaW5pdF9ieV9yZWdfY29yZSkpIHsKKworCQkJaWYgKE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1JFID09IHJlcXVlc3QtPmluaXRpYXRvcikgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWluaXRfYnlfcmVnX2NvcmUgPSB0cnVlOworCQl9CisKKwkJaWYgKChOTDgwMjExX1JFR0RPTV9TRVRfQllfRFJJVkVSID09IHJlcXVlc3QtPmluaXRpYXRvcikgJiYKKwkJICAgICh0cnVlID09IGluaXRfYnlfZHJpdmVyKSkgeworCisJCQkvKgorCQkJICogcmVzdG9yZSB0aGUgZHJpdmVyIHJlZ3VsYXRvcnkgZmxhZ3Mgc2luY2UKKwkJCSAqIHJlZ3VsYXRvcnlfaGludCBtYXkgaGF2ZQorCQkJICogY2hhbmdlZCB0aGVtCisJCQkgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE0LCAwKSkgfHwgZGVmaW5lZChXSVRIX0JBQ0tQT1JUUykKKwkJCXdpcGh5LT5yZWd1bGF0b3J5X2ZsYWdzID0gaGRkX2N0eC0+cmVnLnJlZ19mbGFnczsKKyNlbHNlCisJCQl3aXBoeS0+ZmxhZ3MgPSBoZGRfY3R4LT5yZWcucmVnX2ZsYWdzOworI2VuZGlmCisJCX0KKworCQlpZiAoTkw4MDIxMV9SRUdET01fU0VUX0JZX0NPUkUgPT0gcmVxdWVzdC0+aW5pdGlhdG9yKSB7CisJCQloZGRfY3R4LT5yZWcuY2Nfc3JjID0gQ09VTlRSWV9DT0RFX1NFVF9CWV9DT1JFOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTQsIDApKSB8fCBkZWZpbmVkKFdJVEhfQkFDS1BPUlRTKQorCQkJaWYgKHdpcGh5LT5yZWd1bGF0b3J5X2ZsYWdzICYgUkVHVUxBVE9SWV9DVVNUT01fUkVHKQorI2Vsc2UKKwkJCQlpZiAod2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSkKKyNlbmRpZgorCQkJCQlyZXNldCA9IHRydWU7CisJCX0gZWxzZSBpZiAoTkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUiA9PSByZXF1ZXN0LT5pbml0aWF0b3IpCisJCQloZGRfY3R4LT5yZWcuY2Nfc3JjID0gQ09VTlRSWV9DT0RFX1NFVF9CWV9EUklWRVI7CisJCWVsc2UgeworCQkJaGRkX2N0eC0+cmVnLmNjX3NyYyA9IENPVU5UUllfQ09ERV9TRVRfQllfVVNFUjsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgMTQsIDApKSAmJiAhZGVmaW5lZChXSVRIX0JBQ0tQT1JUUykKKwkJCWlmICgocmVxdWVzdC0+YWxwaGEyWzBdID09ICcwJykgJiYKKwkJCSAgICAocmVxdWVzdC0+YWxwaGEyWzFdID09ICcwJykgJiYKKwkJCSAgICAod2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSkpIHsKKwkJCQlyZXN0b3JlX2N1c3RvbV9yZWdfc2V0dGluZ3Mod2lwaHkpOworCQkJCXJlc2V0ID0gdHJ1ZTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJLyogZmlyc3QgbG9va3VwIHRoZSBjb3VudHJ5IGluIHRoZSBsb2NhbCBkYXRhYmFzZSAqLworCQljb3VudHJ5X2NvZGVbMF0gPSByZXF1ZXN0LT5hbHBoYTJbMF07CisJCWNvdW50cnlfY29kZVsxXSA9IHJlcXVlc3QtPmFscGhhMlsxXTsKKworCQloZGRfY3R4LT5yZWcuYWxwaGEyWzBdID0gcmVxdWVzdC0+YWxwaGEyWzBdOworCQloZGRfY3R4LT5yZWcuYWxwaGEyWzFdID0gcmVxdWVzdC0+YWxwaGEyWzFdOworCisJCWNkc191cGRhdGVfcmVndWxhdG9yeV9pbmZvKGhkZF9jdHgpOworCisJCXRlbXBfcmVnX2RvbWFpbiA9IFJFR0RPTUFJTl9DT1VOVDsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50cnlfaW5mb190YWJsZS5jb3VudHJ5Q291bnQgJiYKKwkJICAgICBSRUdET01BSU5fQ09VTlQgPT0gdGVtcF9yZWdfZG9tYWluOyBpKyspIHsKKwkJCWlmIChtZW1jbXAoY291bnRyeV9jb2RlLAorCQkJCSAgY291bnRyeV9pbmZvX3RhYmxlLmNvdW50cnlJbmZvW2ldLmNvdW50cnlDb2RlLAorCQkJCSAgQ0RTX0NPVU5UUllfQ09ERV9MRU4pID09IDApIHsKKworCQkJCXRlbXBfcmVnX2RvbWFpbiA9CisJCQkJY291bnRyeV9pbmZvX3RhYmxlLmNvdW50cnlJbmZvW2ldLnJlZ0RvbWFpbjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChSRUdET01BSU5fQ09VTlQgPT0gdGVtcF9yZWdfZG9tYWluKQorCQkJdGVtcF9yZWdfZG9tYWluID0gUkVHRE9NQUlOX1dPUkxEOworCisJCXZodDgwX2FsbG93ZWQgPSBoZGRfY3R4LT5pc1ZIVDgwQWxsb3dlZDsKKwkJaWYgKGNkc19wcm9jZXNzX3JlZ3VsYXRvcnlfZGF0YSh3aXBoeSwgYmFuZF9jYXBhYmlsaXR5LAorCQkJCQkJcmVzZXQpID09IDApIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAoIiByZWd1bGF0b3J5IGVudHJ5IGNyZWF0ZWQiKSk7CisJCX0KKwkJaWYgKGhkZF9jdHgtPmlzVkhUODBBbGxvd2VkICE9IHZodDgwX2FsbG93ZWQpCisJCQloZGRfY2hlY2thbmR1cGRhdGVfcGh5bW9kZShoZGRfY3R4KTsKKworCQlpZiAoTkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUiA9PSByZXF1ZXN0LT5pbml0aWF0b3IpCisJCQljb21wbGV0ZSgmaGRkX2N0eC0+cmVnX2luaXQpOworCisJCWlmIChyZXF1ZXN0LT5hbHBoYTJbMF0gPT0gJzAnCisJCSAgICAmJiByZXF1ZXN0LT5hbHBoYTJbMV0gPT0gJzAnKSB7CisJCQlzbWVfZ2VuZXJpY19jaGFuZ2VfY291bnRyeV9jb2RlKGhkZF9jdHgtPmhIYWwsCisJCQkJCQkJY291bnRyeV9jb2RlLAorCQkJCQkJCVJFR0RPTUFJTl9DT1VOVCk7CisJCX0gZWxzZSB7CisJCQlzbWVfZ2VuZXJpY19jaGFuZ2VfY291bnRyeV9jb2RlKGhkZF9jdHgtPmhIYWwsCisJCQkJCQkJY291bnRyeV9jb2RlLAorCQkJCQkJCXRlbXBfcmVnX2RvbWFpbik7CisJCX0KKworCQljZHNfZmlsbF9hbmRfc2VuZF9jdGxfdG9fZncoJmhkZF9jdHgtPnJlZyk7CisKKwkJY2RzX3NldF9kZnNfcmVnaW9uKHJlcXVlc3QtPmRmc19yZWdpb24pOworCisJCWNkc19zZXRfd21hX2Rmc19yZWdpb24oJmhkZF9jdHgtPnJlZyk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIGNkc19yZWd1bGF0b3J5X2luaXQoKSAtIHJlZ3VsYXRvcnlfaW5pdAorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgY2RzX3JlZ3VsYXRvcnlfaW5pdCh2b2lkKQoreworCXZfQ09OVEVYVF90IGNkc19jb250ZXh0ID0gTlVMTDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gTlVMTDsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gTlVMTDsKKwlpbnQgcmV0X3ZhbCA9IDA7CisJc3RydWN0IHJlZ3VsYXRvcnkgKnJlZ19pbmZvOworCisJY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisKKwlpZiAoIWNkc19jb250ZXh0KQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCisJaGRkX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJaWYgKCFoZGRfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAoIkludmFsaWQgcEhkZEN0eCBwb2ludGVyIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXdpcGh5ID0gaGRkX2N0eC0+d2lwaHk7CisKKwlyZWdfaW5mbyA9ICZoZGRfY3R4LT5yZWc7CisKKwljZHNfcmVndWxhdG9yeV93aXBoeV9pbml0KGhkZF9jdHgsIHJlZ19pbmZvLCB3aXBoeSk7CisKKwl0ZW1wX3JlZ19kb21haW4gPSBSRUdET01BSU5fV09STEQ7CisKKwlpZiAoY2RzX3Byb2Nlc3NfcmVndWxhdG9yeV9kYXRhKHdpcGh5LAorCQkJCQloZGRfY3R4LT5jb25maWctPgorCQkJCQluQmFuZENhcGFiaWxpdHksIHRydWUpICE9IDApIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICgiRXJyb3Igd2hpbGUgY3JlYXRpbmcgcmVndWxhdG9yeSBlbnRyeSIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlyZWdfaW5mby0+Y2Nfc3JjID0gQ09VTlRSWV9DT0RFX1NFVF9CWV9EUklWRVI7CisKKwlyZXRfdmFsID0gY2RzX2ZpbGxfc29tZV9yZWd1bGF0b3J5X2luZm8ocmVnX2luZm8pOworCWlmIChyZXRfdmFsKSB7CisJCWNkZl9wcmludChLRVJOX0VSUiAiRXJyb3IgaW4gZ2V0dGluZyBjb3VudHJ5IGNvZGVcbiIpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwlyZWdfdGFibGUuZGVmYXVsdF9jb3VudHJ5WzBdID0gcmVnX2luZm8tPmFscGhhMlswXTsKKwlyZWdfdGFibGUuZGVmYXVsdF9jb3VudHJ5WzFdID0gcmVnX2luZm8tPmFscGhhMlsxXTsKKworCWluaXRfY29tcGxldGlvbigmaGRkX2N0eC0+cmVnX2luaXQpOworCisJY2RzX2ZpbGxfYW5kX3NlbmRfY3RsX3RvX2Z3KHJlZ19pbmZvKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RzX3NldF9yZWdfZG9tYWluKCkgLSBzZXQgcmVndWxhdG9yeSBkb21haW4KKyAqIEBjbGllbnRfY3R4dDogY2xpZW50IGNvbnRleHQKKyAqIEByZWdfZG9tYWluOiByZWd1bGF0b3J5IGRvbWFpbgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIGNkc19zZXRfcmVnX2RvbWFpbih2b2lkICpjbGllbnRfY3R4dCwgdl9SRUdET01BSU5fdCByZWdfZG9tYWluKQoreworCWlmIChyZWdfZG9tYWluID49IFJFR0RPTUFJTl9DT1VOVCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkNEUyBzZXQgcmVnIGRvbWFpbiwgaW52YWxpZCBSRUcgZG9tYWluIElEICVkIiwKKwkJCSAgcmVnX2RvbWFpbik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJcmVnX2NoYW5uZWxzID0gcmVnX3RhYmxlLnJlZ0RvbWFpbnNbcmVnX2RvbWFpbl0uY2hhbm5lbHM7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29yZS9jZHMvc3JjL2Nkc19yZWdkb21haW4uYyBiL2NvcmUvY2RzL3NyYy9jZHNfcmVnZG9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5MzUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RzL3NyYy9jZHNfcmVnZG9tYWluLmMKQEAgLTAsMCArMSw2OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIE5vdGlmaWNhdGlvbnMgYW5kIGxpY2Vuc2VzIGFyZSByZXRhaW5lZCBmb3IgYXR0cmlidXRpb24gcHVycG9zZXMgb25seS4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA2IFNhbSBMZWZmbGVyLCBFcnJubyBDb25zdWx0aW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqIDEuIFRoZSBtYXRlcmlhbHMgY29udGFpbmVkIGhlcmVpbiBhcmUgdW5tb2RpZmllZCBhbmQgYXJlIHVzZWQKKyAqICAgIHVubW9kaWZpZWQuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBOTworICogICAgJydXQVJSQU5UWScnIGRpc2NsYWltZXIgYmVsb3cgKCcnRGlzY2xhaW1lcicnKSwgd2l0aG91dAorICogICAgbW9kaWZpY2F0aW9uLgorICogMy4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYQorICogICAgZGlzY2xhaW1lciBzaW1pbGFyIHRvIHRoZSBEaXNjbGFpbWVyIGJlbG93IGFuZCBhbnkgcmVkaXN0cmlidXRpb24KKyAqICAgIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbiBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIKKyAqICAgIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdCBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICcnQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OSU5GUklOR0VNRU5ULAorICogTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpbmNsdWRlICJ3bWEuaCIKKyNpbmNsdWRlICJjZHNfcmVnZG9tYWluLmgiCisjaW5jbHVkZSAiY2RzX3JlZ2RvbWFpbl9jb21tb24uaCIKKworc3RhdGljIHJlZ2RtX3N1cHBfb3BfY2xhc3NlcyByZWdkbV9jdXJyX3N1cHBfb3BwX2NsYXNzZXMgPSB7IDAgfTsKKworLyogR2xvYmFsIE9wZXJhdGluZyBDbGFzc2VzICovCityZWdkbV9vcF9jbGFzc19tYXBfdCBnbG9iYWxfb3BfY2xhc3NbXSA9IHsKKwl7ODEsIDI1LCBCVzIwLCB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9fSwKKwl7ODIsIDI1LCBCVzIwLCB7MTR9fSwKKwl7ODMsIDQwLCBCVzQwX0xPV19QUklNQVJZLCB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOX19LAorCXs4NCwgNDAsIEJXNDBfSElHSF9QUklNQVJZLCB7NSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9fSwKKwl7MTE1LCAyMCwgQlcyMCwgezM2LCA0MCwgNDQsIDQ4fX0sCisJezExNiwgNDAsIEJXNDBfTE9XX1BSSU1BUlksIHszNiwgNDR9fSwKKwl7MTE3LCA0MCwgQlc0MF9ISUdIX1BSSU1BUlksIHs0MCwgNDh9fSwKKwl7MTE4LCAyMCwgQlcyMCwgezUyLCA1NiwgNjAsIDY0fX0sCisJezExOSwgNDAsIEJXNDBfTE9XX1BSSU1BUlksIHs1MiwgNjB9fSwKKwl7MTIwLCA0MCwgQlc0MF9ISUdIX1BSSU1BUlksIHs1NiwgNjR9fSwKKwl7MTIxLCAyMCwgQlcyMCwKKwkgezEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfX0sCisJezEyMiwgNDAsIEJXNDBfTE9XX1BSSU1BUlksIHsxMDAsIDEwOCwgMTE2LCAxMjQsIDEzMn19LAorCXsxMjMsIDQwLCBCVzQwX0hJR0hfUFJJTUFSWSwgezEwNCwgMTEyLCAxMjAsIDEyOCwgMTM2fX0sCisJezEyNSwgMjAsIEJXMjAsIHsxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5fX0sCisJezEyNiwgNDAsIEJXNDBfTE9XX1BSSU1BUlksIHsxNDksIDE1N319LAorCXsxMjcsIDQwLCBCVzQwX0hJR0hfUFJJTUFSWSwgezE1MywgMTYxfX0sCisJezEyOCwgODAsIEJXODAsIHszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsCisJCQkgICAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ0LAorCQkJICAgMTQ5LCAxNTMsIDE1NywgMTYxfSB9LAorCXswLCAwLCAwLCB7MH19LAorfTsKKworLyogT3BlcmF0aW5nIENsYXNzZXMgaW4gVVMgKi8KK3JlZ2RtX29wX2NsYXNzX21hcF90IHVzX29wX2NsYXNzW10gPSB7CisJezEsIDIwLCBCVzIwLCB7MzYsIDQwLCA0NCwgNDh9fSwKKwl7MiwgMjAsIEJXMjAsIHs1MiwgNTYsIDYwLCA2NH19LAorCXs0LCAyMCwgQlcyMCwgezEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLAorCQkJMTQ0fSB9LAorCXs1LCAyMCwgQlcyMCwgezE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fX0sCisJezEyLCAyNSwgQlcyMCwgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX19LAorCXsyMiwgNDAsIEJXNDBfTE9XX1BSSU1BUlksIHszNiwgNDR9fSwKKwl7MjMsIDQwLCBCVzQwX0xPV19QUklNQVJZLCB7NTIsIDYwfX0sCisJezI0LCA0MCwgQlc0MF9MT1dfUFJJTUFSWSwgezEwMCwgMTA4LCAxMTYsIDEyNCwgMTMyfX0sCisJezI2LCA0MCwgQlc0MF9MT1dfUFJJTUFSWSwgezE0OSwgMTU3fX0sCisJezI3LCA0MCwgQlc0MF9ISUdIX1BSSU1BUlksIHs0MCwgNDh9fSwKKwl7MjgsIDQwLCBCVzQwX0hJR0hfUFJJTUFSWSwgezU2LCA2NH19LAorCXsyOSwgNDAsIEJXNDBfSElHSF9QUklNQVJZLCB7MTA0LCAxMTIsIDEyMCwgMTI4LCAxMzZ9fSwKKwl7MzEsIDQwLCBCVzQwX0hJR0hfUFJJTUFSWSwgezE1MywgMTYxfX0sCisJezMyLCA0MCwgQlc0MF9MT1dfUFJJTUFSWSwgezEsIDIsIDMsIDQsIDUsIDYsIDd9fSwKKwl7MzMsIDQwLCBCVzQwX0hJR0hfUFJJTUFSWSwgezUsIDYsIDcsIDgsIDksIDEwLCAxMX19LAorCXsxMjgsIDgwLCBCVzgwLCB7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LAorCQkJICAgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0NCwKKwkJCSAgIDE0OSwgMTUzLCAxNTcsIDE2MX0gfSwKKwl7MCwgMCwgMCwgezB9fSwKK307CisKKy8qIE9wZXJhdGluZyBDbGFzc2VzIGluIEV1cm9wZSAqLworcmVnZG1fb3BfY2xhc3NfbWFwX3QgZXVyb19vcF9jbGFzc1tdID0geworCXsxLCAyMCwgQlcyMCwgezM2LCA0MCwgNDQsIDQ4fX0sCisJezIsIDIwLCBCVzIwLCB7NTIsIDU2LCA2MCwgNjR9fSwKKwl7MywgMjAsIEJXMjAsIHsxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH19LAorCXs0LCAyNSwgQlcyMCwgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfX0sCisJezUsIDQwLCBCVzQwX0xPV19QUklNQVJZLCB7MzYsIDQ0fX0sCisJezYsIDQwLCBCVzQwX0xPV19QUklNQVJZLCB7NTIsIDYwfX0sCisJezcsIDQwLCBCVzQwX0xPV19QUklNQVJZLCB7MTAwLCAxMDgsIDExNiwgMTI0LCAxMzJ9fSwKKwl7OCwgNDAsIEJXNDBfSElHSF9QUklNQVJZLCB7NDAsIDQ4fX0sCisJezksIDQwLCBCVzQwX0hJR0hfUFJJTUFSWSwgezU2LCA2NH19LAorCXsxMCwgNDAsIEJXNDBfSElHSF9QUklNQVJZLCB7MTA0LCAxMTIsIDEyMCwgMTI4LCAxMzZ9fSwKKwl7MTEsIDQwLCBCVzQwX0xPV19QUklNQVJZLCB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOX19LAorCXsxMiwgNDAsIEJXNDBfSElHSF9QUklNQVJZLCB7NSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9fSwKKwl7MTcsIDIwLCBCVzIwLCB7MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUsIDE2OX19LAorCXsxMjgsIDgwLCBCVzgwLCB7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsCisJCQkgICAxMTYsIDEyMCwgMTI0LCAxMjh9IH0sCisJezAsIDAsIDAsIHswfX0sCit9OworCisvKiBPcGVyYXRpbmcgQ2xhc3NlcyBpbiBKYXBhbiAqLworcmVnZG1fb3BfY2xhc3NfbWFwX3QgamFwYW5fb3BfY2xhc3NbXSA9IHsKKwl7MSwgMjAsIEJXMjAsIHszNiwgNDAsIDQ0LCA0OH19LAorCXszMCwgMjUsIEJXMjAsIHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxM319LAorCXszMSwgMjUsIEJXMjAsIHsxNH19LAorCXszMiwgMjAsIEJXMjAsIHs1MiwgNTYsIDYwLCA2NH19LAorCXszNCwgMjAsIEJXMjAsIHsxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH19LAorCXszNiwgNDAsIEJXNDBfTE9XX1BSSU1BUlksIHszNiwgNDR9fSwKKwl7MzcsIDQwLCBCVzQwX0xPV19QUklNQVJZLCB7NTIsIDYwfX0sCisJezM5LCA0MCwgQlc0MF9MT1dfUFJJTUFSWSwgezEwMCwgMTA4LCAxMTYsIDEyNCwgMTMyfX0sCisJezQxLCA0MCwgQlc0MF9ISUdIX1BSSU1BUlksIHs0MCwgNDh9fSwKKwl7NDIsIDQwLCBCVzQwX0hJR0hfUFJJTUFSWSwgezU2LCA2NH19LAorCXs0NCwgNDAsIEJXNDBfSElHSF9QUklNQVJZLCB7MTA0LCAxMTIsIDEyMCwgMTI4LCAxMzZ9fSwKKwl7MTI4LCA4MCwgQlc4MCwgezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLAorCQkJICAgMTE2LCAxMjAsIDEyNCwgMTI4fSB9LAorCXswLCAwLCAwLCB7MH19LAorfTsKKworLyoKKyAqIEJ5IGRlZmF1bHQsIHRoZSByZWdkb21haW4gdGFibGVzIHJlZmVyZW5jZSB0aGUgY29tbW9uIHRhYmxlcworICogZnJvbSByZWdkb21haW5fY29tbW9uLmguICBUaGVzZSBkZWZhdWx0IHRhYmxlcyBjYW4gYmUgcmVwbGFjZWQKKyAqIGJ5IGNhbGxzIHRvIHBvcHVsYXRlX3JlZ2RvbWFpbl90YWJsZXMgZnVuY3Rpb25zLgorICovCitIQUxfUkVHX0RNTl9UQUJMRVMgb2xfcmVnZG1uX3JkdCA9IHsKKwlhaF9jbW5fcmVnX2RvbWFpbl9wYWlycywgICAgLyogcmVnRG9tYWluUGFpcnMgKi8KKwlhaF9jbW5fYWxsX2NvdW50cmllcywgICAgICAvKiBhbGxDb3VudHJpZXMgKi8KKwlhaF9jbW5fcmVnX2RvbWFpbnMsICAgICAgICAvKiBhbGxSZWdEb21haW5zICovCisJQ0RGX0FSUkFZX1NJWkUoYWhfY21uX3JlZ19kb21haW5fcGFpcnMpLCAvKiByZWdEb21haW5QYWlyc0N0ICovCisJQ0RGX0FSUkFZX1NJWkUoYWhfY21uX2FsbF9jb3VudHJpZXMpLCAgIC8qIGFsbENvdW50cmllc0N0ICovCisJQ0RGX0FSUkFZX1NJWkUoYWhfY21uX3JlZ19kb21haW5zKSwgICAgIC8qIGFsbFJlZ0RvbWFpbkN0ICovCit9OworCitzdGF0aWMgdWludDE2X3QgZ2V0X2VlcHJvbV9yZCh1aW50MTZfdCByZCkKK3sKKwlyZXR1cm4gcmQgJiB+V09STERXSURFX1JPQU1JTkdfRkxBRzsKK30KKworLyoKKyAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgcmVndWxhdG9yeSBkb21haW4vY291bnRyeSBpbiBFRVBST00KKyAqIGlzIGFjY2VwdGFibGUuCisgKi8KK3N0YXRpYyBib29sIHJlZ2Rtbl9pc19lZXByb21fdmFsaWQodWludDE2X3QgcmQpCit7CisJaW50MzJfdCBpOworCisJaWYgKHJkICYgQ09VTlRSWV9FUkRfRkxBRykgeworCQl1aW50MTZfdCBjYyA9IHJkICYgfkNPVU5UUllfRVJEX0ZMQUc7CisJCWZvciAoaSA9IDA7IGkgPCBvbF9yZWdkbW5fcmR0LmFsbENvdW50cmllc0N0OyBpKyspCisJCQlpZiAob2xfcmVnZG1uX3JkdC5hbGxDb3VudHJpZXNbaV0uY291bnRyeUNvZGUgPT0gY2MpCisJCQkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IG9sX3JlZ2Rtbl9yZHQucmVnRG9tYWluUGFpcnNDdDsgaSsrKQorCQkJaWYgKG9sX3JlZ2Rtbl9yZHQucmVnRG9tYWluUGFpcnNbaV0ucmVnRG1uRW51bSA9PSByZCkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyogVE9ETzogQnJpbmcgaXQgdW5kZXIgZGVidWcgbGV2ZWwgKi8KKwljZGZfcHJpbnQoIiVzOiBpbnZhbGlkIHJlZ3VsYXRvcnkgZG9tYWluL2NvdW50cnkgY29kZSAweCV4XG4iLAorCQkgIF9fZnVuY19fLCByZCk7CisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogRmluZCB0aGUgcG9pbnRlciB0byB0aGUgY291bnRyeSBlbGVtZW50IGluIHRoZSBjb3VudHJ5IHRhYmxlCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb3VudHJ5IGNvZGUKKyAqLworc3RhdGljIGNvbnN0IENPVU5UUllfQ09ERV9UT19FTlVNX1JEICpmaW5kX2NvdW50cnkodWludDE2X3QgY291bnRyeV9jb2RlKQoreworCWludDMyX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBvbF9yZWdkbW5fcmR0LmFsbENvdW50cmllc0N0OyBpKyspIHsKKwkJaWYgKG9sX3JlZ2Rtbl9yZHQuYWxsQ291bnRyaWVzW2ldLmNvdW50cnlDb2RlID09IGNvdW50cnlfY29kZSkKKwkJCXJldHVybiAmb2xfcmVnZG1uX3JkdC5hbGxDb3VudHJpZXNbaV07CisJfQorCXJldHVybiBOVUxMOyAgICAgICAgICAgIC8qIE5vdCBmb3VuZCAqLworfQorCitpbnQzMl90IGNkc19nZXRfY291bnRyeV9mcm9tX2FscGhhMih1aW50OF90ICphbHBoYTIpCit7CisJaW50MzJfdCBpOworCisJZm9yIChpID0gMDsgaSA8IG9sX3JlZ2Rtbl9yZHQuYWxsQ291bnRyaWVzQ3Q7IGkrKykgeworCQlpZiAob2xfcmVnZG1uX3JkdC5hbGxDb3VudHJpZXNbaV0uaXNvTmFtZVswXSA9PSBhbHBoYTJbMF0gJiYKKwkJICAgIG9sX3JlZ2Rtbl9yZHQuYWxsQ291bnRyaWVzW2ldLmlzb05hbWVbMV0gPT0gYWxwaGEyWzFdKQorCQkJcmV0dXJuIG9sX3JlZ2Rtbl9yZHQuYWxsQ291bnRyaWVzW2ldLmNvdW50cnlDb2RlOworCX0KKwlyZXR1cm4gQ1RSWV9ERUZBVUxUOworfQorCitzdGF0aWMgdWludDE2X3QgcmVnZG1uX2dldF9kZWZhdWx0X2NvdW50cnkodWludDE2X3QgcmQpCit7CisJaW50MzJfdCBpOworCisJaWYgKHJkICYgQ09VTlRSWV9FUkRfRkxBRykgeworCQljb25zdCBDT1VOVFJZX0NPREVfVE9fRU5VTV9SRCAqY291bnRyeSA9IE5VTEw7CisJCXVpbnQxNl90IGNjID0gcmQgJiB+Q09VTlRSWV9FUkRfRkxBRzsKKworCQljb3VudHJ5ID0gZmluZF9jb3VudHJ5KGNjKTsKKwkJaWYgKGNvdW50cnkpCisJCQlyZXR1cm4gY2M7CisJfQorCisJLyoKKwkgKiBDaGVjayByZWcgZG9tYWlucyB0aGF0IGhhdmUgb25seSBvbmUgY291bnRyeQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBvbF9yZWdkbW5fcmR0LnJlZ0RvbWFpblBhaXJzQ3Q7IGkrKykgeworCQlpZiAob2xfcmVnZG1uX3JkdC5yZWdEb21haW5QYWlyc1tpXS5yZWdEbW5FbnVtID09IHJkKSB7CisJCQlpZiAob2xfcmVnZG1uX3JkdC5yZWdEb21haW5QYWlyc1tpXS5zaW5nbGVDQyAhPSAwKQorCQkJCXJldHVybiBvbF9yZWdkbW5fcmR0LnJlZ0RvbWFpblBhaXJzW2ldLnNpbmdsZUNDOworCQkJZWxzZQorCQkJCWkgPSBvbF9yZWdkbW5fcmR0LnJlZ0RvbWFpblBhaXJzQ3Q7CisJCX0KKwl9CisJcmV0dXJuIENUUllfREVGQVVMVDsKK30KKworc3RhdGljIGNvbnN0IFJFR19ETU5fUEFJUl9NQVBQSU5HICpnZXRfcmVnZG1uX3BhaXIodWludDE2X3QgcmVnX2RtbikKK3sKKwlpbnQzMl90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2xfcmVnZG1uX3JkdC5yZWdEb21haW5QYWlyc0N0OyBpKyspIHsKKwkJaWYgKG9sX3JlZ2Rtbl9yZHQucmVnRG9tYWluUGFpcnNbaV0ucmVnRG1uRW51bSA9PSByZWdfZG1uKQorCQkJcmV0dXJuICZvbF9yZWdkbW5fcmR0LnJlZ0RvbWFpblBhaXJzW2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IFJFR19ET01BSU4gKmdldF9yZWdkbW4odWludDE2X3QgcmVnX2RtbikKK3sKKwlpbnQzMl90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2xfcmVnZG1uX3JkdC5yZWdEb21haW5zQ3Q7IGkrKykgeworCQlpZiAob2xfcmVnZG1uX3JkdC5yZWdEb21haW5zW2ldLnJlZ0RtbkVudW0gPT0gcmVnX2RtbikKKwkJCXJldHVybiAmb2xfcmVnZG1uX3JkdC5yZWdEb21haW5zW2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IENPVU5UUllfQ09ERV9UT19FTlVNX1JEICpnZXRfY291bnRyeV9mcm9tX3JkKHVpbnQxNl90IHJlZ2RtbikKK3sKKwlpbnQzMl90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2xfcmVnZG1uX3JkdC5hbGxDb3VudHJpZXNDdDsgaSsrKSB7CisJCWlmIChvbF9yZWdkbW5fcmR0LmFsbENvdW50cmllc1tpXS5yZWdEbW5FbnVtID09IHJlZ2RtbikKKwkJCXJldHVybiAmb2xfcmVnZG1uX3JkdC5hbGxDb3VudHJpZXNbaV07CisJfQorCXJldHVybiBOVUxMOyAgICAgICAgICAgIC8qIE5vdCBmb3VuZCAqLworfQorCisvKgorICogU29tZSB1c2VycyBoYXZlIHJlcG9ydGVkIHRoZWlyIEVFUFJPTSBwcm9ncmFtbWVkIHdpdGgKKyAqIDB4ODAwMCBzZXQsIHRoaXMgaXMgbm90IGEgc3VwcG9ydGVkIHJlZ3VsYXRvcnkgZG9tYWluCisgKiBidXQgc2luY2Ugd2UgaGF2ZSBtb3JlIHRoYW4gb25lIHVzZXIgd2l0aCBpdCB3ZSBuZWVkCisgKiBhIHNvbHV0aW9uIGZvciB0aGVtLiBXZSBkZWZhdWx0IHRvIFdPUjBfV09STEQKKyAqLworc3RhdGljIHZvaWQgcmVnZF9zYW5pdGl6ZShzdHJ1Y3QgcmVndWxhdG9yeSAqcmVnKQoreworCWlmIChyZWctPnJlZ19kb21haW4gIT0gQ09VTlRSWV9FUkRfRkxBRykKKwkJcmV0dXJuOworCXJlZy0+cmVnX2RvbWFpbiA9IFdPUjBfV09STEQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIGNvdW50cnkgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gcmVndWxhdG9yeSBkb21haW4uCisgKi8KK2ludDMyX3QgY2RzX2ZpbGxfc29tZV9yZWd1bGF0b3J5X2luZm8oc3RydWN0IHJlZ3VsYXRvcnkgKnJlZykKK3sKKwl1aW50MTZfdCBjb3VudHJ5X2NvZGU7CisJdWludDE2X3QgcmVnZG1uLCByZDsKKwljb25zdCBDT1VOVFJZX0NPREVfVE9fRU5VTV9SRCAqY291bnRyeSA9IE5VTEw7CisKKwlyZWdkX3Nhbml0aXplKHJlZyk7CisJcmQgPSByZWctPnJlZ19kb21haW47CisKKwlpZiAoIXJlZ2Rtbl9pc19lZXByb21fdmFsaWQocmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ2RtbiA9IGdldF9lZXByb21fcmQocmQpOworCisJY291bnRyeV9jb2RlID0gcmVnZG1uX2dldF9kZWZhdWx0X2NvdW50cnkocmVnZG1uKTsKKwlpZiAoY291bnRyeV9jb2RlID09IENUUllfREVGQVVMVCAmJiByZWdkbW4gPT0gQ1RSWV9ERUZBVUxUKSB7CisJCS8qIFNldCB0byBDVFJZX1VOSVRFRF9TVEFURVMgZm9yIHRlc3RpbmcgKi8KKwkJY291bnRyeV9jb2RlID0gQ1RSWV9VTklURURfU1RBVEVTOworCX0KKworCWlmIChjb3VudHJ5X2NvZGUgIT0gQ1RSWV9ERUZBVUxUKSB7CisJCWNvdW50cnkgPSBmaW5kX2NvdW50cnkoY291bnRyeV9jb2RlKTsKKwkJaWYgKCFjb3VudHJ5KSB7CisJCQkvKiBUT0RPOiBCcmluZyBpdCB1bmRlciBkZWJ1ZyBsZXZlbCAqLworCQkJY2RmX3ByaW50KEtFUk5fRVJSICJOb3QgYSB2YWxpZCBjb3VudHJ5IGNvZGVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVnZG1uID0gY291bnRyeS0+cmVnRG1uRW51bTsKKwl9CisKKwlyZWctPnJlZ3BhaXIgPSBnZXRfcmVnZG1uX3BhaXIocmVnZG1uKTsKKwlpZiAoIXJlZy0+cmVncGFpcikgeworCQkvKiBUT0RPOiBCcmluZyBpdCB1bmRlciBkZWJ1ZyBsZXZlbCAqLworCQljZGZfcHJpbnQoS0VSTl9FUlIgIk5vIHJlZ3BhaXIgaXMgZm91bmQsIGNhbiBub3QgcHJvY2VlZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVnLT5jb3VudHJ5X2NvZGUgPSBjb3VudHJ5X2NvZGU7CisKKwlpZiAoIWNvdW50cnkpCisJCWNvdW50cnkgPSBnZXRfY291bnRyeV9mcm9tX3JkKHJlZ2Rtbik7CisKKwlpZiAoY291bnRyeSkgeworCQlyZWctPmFscGhhMlswXSA9IGNvdW50cnktPmlzb05hbWVbMF07CisJCXJlZy0+YWxwaGEyWzFdID0gY291bnRyeS0+aXNvTmFtZVsxXTsKKwl9IGVsc2UgeworCQlyZWctPmFscGhhMlswXSA9ICcwJzsKKwkJcmVnLT5hbHBoYTJbMV0gPSAnMCc7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm5zIHJlZ3VsYXRvcnkgZG9tYWluIGZvciBnaXZlbiBjb3VudHJ5IHN0cmluZworICovCitpbnQzMl90IHJlZ2Rtbl9nZXRfcmVnZG1uX2Zvcl9jb3VudHJ5KHVpbnQ4X3QgKmFscGhhMikKK3sKKwl1aW50OF90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2xfcmVnZG1uX3JkdC5hbGxDb3VudHJpZXNDdDsgaSsrKSB7CisJCWlmICgob2xfcmVnZG1uX3JkdC5hbGxDb3VudHJpZXNbaV0uaXNvTmFtZVswXSA9PSBhbHBoYTJbMF0pICYmCisJCSAgICAob2xfcmVnZG1uX3JkdC5hbGxDb3VudHJpZXNbaV0uaXNvTmFtZVsxXSA9PSBhbHBoYTJbMV0pKQorCQkJcmV0dXJuIG9sX3JlZ2Rtbl9yZHQuYWxsQ291bnRyaWVzW2ldLnJlZ0RtbkVudW07CisJfQorCXJldHVybiAtMTsKK30KKworLyoKKyAqIFRlc3QgdG8gc2VlIGlmIHRoZSBiaXRtYXNrIGFycmF5IGlzIGFsbCB6ZXJvcworICovCitzdGF0aWMgYm9vbCBpc19jaGFuX2JpdF9tYXNrX3plcm8oY29uc3QgdWludDY0X3QgKmJpdG1hc2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQk1MRU47IGkrKykgeworCQlpZiAoYml0bWFza1tpXSAhPSAwKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbWFzayBvZiBhdmFpbGFibGUgbW9kZXMgYmFzZWQgb24gdGhlIGhhcmR3YXJlCisgKiBjYXBhYmlsaXRpZXMgYW5kIHRoZSBzcGVjaWZpZWQgY291bnRyeSBjb2RlIGFuZCByZWcgZG9tYWluLgorICovCitzdGF0aWMgdWludDMyX3QgcmVnZG1uX2dldHdtb2Rlc25yZWcodWludDMyX3QgbW9kZXNBdmFpbCwKKwkJCQkgICAgIGNvbnN0IENPVU5UUllfQ09ERV9UT19FTlVNX1JEICpjb3VudHJ5LAorCQkJCSAgICAgY29uc3QgUkVHX0RPTUFJTiAqcmQ1R0h6KQoreworCisJLyogQ2hlY2sgY291bnRyeSByZWd1bGF0aW9ucyBmb3IgYWxsb3dlZCBtb2RlcyAqLworCWlmICgobW9kZXNBdmFpbCAmIChSRUdETU5fTU9ERV8xMUFfVFVSQk8gfCBSRUdETU5fTU9ERV9UVVJCTykpICYmCisJICAgICghY291bnRyeS0+YWxsb3cxMWFUdXJibykpCisJCW1vZGVzQXZhaWwgJj0gfihSRUdETU5fTU9ERV8xMUFfVFVSQk8gfCBSRUdETU5fTU9ERV9UVVJCTyk7CisKKwlpZiAoKG1vZGVzQXZhaWwgJiBSRUdETU5fTU9ERV8xMUdfVFVSQk8pICYmICghY291bnRyeS0+YWxsb3cxMWdUdXJibykpCisJCW1vZGVzQXZhaWwgJj0gflJFR0RNTl9NT0RFXzExR19UVVJCTzsKKworCWlmICgobW9kZXNBdmFpbCAmIFJFR0RNTl9NT0RFXzExRykgJiYgKCFjb3VudHJ5LT5hbGxvdzExZykpCisJCW1vZGVzQXZhaWwgJj0gflJFR0RNTl9NT0RFXzExRzsKKworCWlmICgobW9kZXNBdmFpbCAmIFJFR0RNTl9NT0RFXzExQSkgJiYKKwkgICAgKGlzX2NoYW5fYml0X21hc2tfemVybyhyZDVHSHotPmNoYW4xMWEpKSkKKwkJbW9kZXNBdmFpbCAmPSB+UkVHRE1OX01PREVfMTFBOworCisJaWYgKChtb2Rlc0F2YWlsICYgUkVHRE1OX01PREVfMTFOR19IVDIwKSAmJiAoIWNvdW50cnktPmFsbG93MTFuZzIwKSkKKwkJbW9kZXNBdmFpbCAmPSB+UkVHRE1OX01PREVfMTFOR19IVDIwOworCisJaWYgKChtb2Rlc0F2YWlsICYgUkVHRE1OX01PREVfMTFOQV9IVDIwKSAmJiAoIWNvdW50cnktPmFsbG93MTFuYTIwKSkKKwkJbW9kZXNBdmFpbCAmPSB+UkVHRE1OX01PREVfMTFOQV9IVDIwOworCisJaWYgKChtb2Rlc0F2YWlsICYgUkVHRE1OX01PREVfMTFOR19IVDQwUExVUykgJiYgKCFjb3VudHJ5LT5hbGxvdzExbmc0MCkpCisJCW1vZGVzQXZhaWwgJj0gflJFR0RNTl9NT0RFXzExTkdfSFQ0MFBMVVM7CisKKwlpZiAoKG1vZGVzQXZhaWwgJiBSRUdETU5fTU9ERV8xMU5HX0hUNDBNSU5VUykgJiYKKwkgICAgKCFjb3VudHJ5LT5hbGxvdzExbmc0MCkpCisJCW1vZGVzQXZhaWwgJj0gflJFR0RNTl9NT0RFXzExTkdfSFQ0ME1JTlVTOworCisJaWYgKChtb2Rlc0F2YWlsICYgUkVHRE1OX01PREVfMTFOQV9IVDQwUExVUykgJiYgKCFjb3VudHJ5LT5hbGxvdzExbmE0MCkpCisJCW1vZGVzQXZhaWwgJj0gflJFR0RNTl9NT0RFXzExTkFfSFQ0MFBMVVM7CisKKwlpZiAoKG1vZGVzQXZhaWwgJiBSRUdETU5fTU9ERV8xMU5BX0hUNDBNSU5VUykgJiYKKwkgICAgKCFjb3VudHJ5LT5hbGxvdzExbmE0MCkpCisJCW1vZGVzQXZhaWwgJj0gflJFR0RNTl9NT0RFXzExTkFfSFQ0ME1JTlVTOworCisJaWYgKChtb2Rlc0F2YWlsICYgUkVHRE1OX01PREVfMTFBQ19WSFQyMCkgJiYgKCFjb3VudHJ5LT5hbGxvdzExbmEyMCkpCisJCW1vZGVzQXZhaWwgJj0gflJFR0RNTl9NT0RFXzExQUNfVkhUMjA7CisKKwlpZiAoKG1vZGVzQXZhaWwgJiBSRUdETU5fTU9ERV8xMUFDX1ZIVDQwUExVUykgJiYKKwkgICAgKCFjb3VudHJ5LT5hbGxvdzExbmE0MCkpCisJCW1vZGVzQXZhaWwgJj0gflJFR0RNTl9NT0RFXzExQUNfVkhUNDBQTFVTOworCisJaWYgKChtb2Rlc0F2YWlsICYgUkVHRE1OX01PREVfMTFBQ19WSFQ0ME1JTlVTKSAmJgorCSAgICAoIWNvdW50cnktPmFsbG93MTFuYTQwKSkKKwkJbW9kZXNBdmFpbCAmPSB+UkVHRE1OX01PREVfMTFBQ19WSFQ0ME1JTlVTOworCisJaWYgKChtb2Rlc0F2YWlsICYgUkVHRE1OX01PREVfMTFBQ19WSFQ4MCkgJiYgKCFjb3VudHJ5LT5hbGxvdzExbmE4MCkpCisJCW1vZGVzQXZhaWwgJj0gflJFR0RNTl9NT0RFXzExQUNfVkhUODA7CisKKwlpZiAoKG1vZGVzQXZhaWwgJiBSRUdETU5fTU9ERV8xMUFDX1ZIVDIwXzJHKSAmJiAoIWNvdW50cnktPmFsbG93MTFuZzIwKSkKKwkJbW9kZXNBdmFpbCAmPSB+UkVHRE1OX01PREVfMTFBQ19WSFQyMF8yRzsKKworCXJldHVybiBtb2Rlc0F2YWlsOworfQorCit2b2lkIGNkc19maWxsX3NlbmRfY3RsX2luZm9fdG9fZncoc3RydWN0IHJlZ3VsYXRvcnkgKnJlZywgdWludDMyX3QgbW9kZXNBdmFpbCwKKwkJCQkgIHVpbnQzMl90IG1vZGVTZWxlY3QpCit7CisJY29uc3QgUkVHX0RPTUFJTiAqcmVnZG9tYWluMkcgPSBOVUxMOworCWNvbnN0IFJFR19ET01BSU4gKnJlZ2RvbWFpbjVHID0gTlVMTDsKKwlpbnQ4X3QgY3RsXzJnLCBjdGxfNWcsIGN0bDsKKwljb25zdCBSRUdfRE9NQUlOICpyZCA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGNtb2RlICpjbTsKKwljb25zdCBDT1VOVFJZX0NPREVfVE9fRU5VTV9SRCAqY291bnRyeTsKKwljb25zdCBSRUdfRE1OX1BBSVJfTUFQUElORyAqcmVncGFpcjsKKworCXJlZ3BhaXIgPSByZWctPnJlZ3BhaXI7CisJcmVnZG9tYWluMkcgPSBnZXRfcmVnZG1uKHJlZ3BhaXItPnJlZ0RtbjJHSHopOworCWlmICghcmVnZG9tYWluMkcpIHsKKwkJY2RmX3ByaW50KEtFUk5fRVJSICJGYWlsZWQgdG8gZ2V0IHJlZ2RtbiAyRyIpOworCQlyZXR1cm47CisJfQorCisJcmVnZG9tYWluNUcgPSBnZXRfcmVnZG1uKHJlZ3BhaXItPnJlZ0RtbjVHSHopOworCWlmICghcmVnZG9tYWluNUcpIHsKKwkJY2RmX3ByaW50KEtFUk5fRVJSICJGYWlsZWQgdG8gZ2V0IHJlZ2RtbiA1RyIpOworCQlyZXR1cm47CisJfQorCisJLyogZmluZCBmaXJzdCBuaWJsZSBvZiBDVEwgKi8KKwljdGxfMmcgPSByZWdkb21haW4yRy0+Y29uZm9ybWFuY2VfdGVzdF9saW1pdDsKKwljdGxfNWcgPSByZWdkb21haW41Ry0+Y29uZm9ybWFuY2VfdGVzdF9saW1pdDsKKworCS8qIGZpbmQgc2Vjb25kIG5pYmxlIG9mIENUTCAqLworCWNvdW50cnkgPSBmaW5kX2NvdW50cnkocmVnLT5jb3VudHJ5X2NvZGUpOworCWlmIChjb3VudHJ5ICE9IE5VTEwpCisJCW1vZGVzQXZhaWwgPQorCQkJcmVnZG1uX2dldHdtb2Rlc25yZWcobW9kZXNBdmFpbCwgY291bnRyeSwgcmVnZG9tYWluNUcpOworCisJZm9yIChjbSA9IG1vZGVzOyBjbSA8ICZtb2Rlc1tDREZfQVJSQVlfU0laRShtb2RlcyldOyBjbSsrKSB7CisKKwkJaWYgKChjbS0+bW9kZSAmIG1vZGVTZWxlY3QpID09IDApCisJCQljb250aW51ZTsKKworCQlpZiAoKGNtLT5tb2RlICYgbW9kZXNBdmFpbCkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoY20tPm1vZGUpIHsKKwkJY2FzZSBSRUdETU5fTU9ERV9UVVJCTzoKKwkJCXJkID0gcmVnZG9tYWluNUc7CisJCQljdGwgPSByZC0+Y29uZm9ybWFuY2VfdGVzdF9saW1pdCB8IENUTF9UVVJCTzsKKwkJCWJyZWFrOworCQljYXNlIFJFR0RNTl9NT0RFXzExQToKKwkJY2FzZSBSRUdETU5fTU9ERV8xMU5BX0hUMjA6CisJCWNhc2UgUkVHRE1OX01PREVfMTFOQV9IVDQwUExVUzoKKwkJY2FzZSBSRUdETU5fTU9ERV8xMU5BX0hUNDBNSU5VUzoKKwkJY2FzZSBSRUdETU5fTU9ERV8xMUFDX1ZIVDIwOgorCQljYXNlIFJFR0RNTl9NT0RFXzExQUNfVkhUNDBQTFVTOgorCQljYXNlIFJFR0RNTl9NT0RFXzExQUNfVkhUNDBNSU5VUzoKKwkJY2FzZSBSRUdETU5fTU9ERV8xMUFDX1ZIVDgwOgorCQkJcmQgPSByZWdkb21haW41RzsKKwkJCWN0bCA9IHJkLT5jb25mb3JtYW5jZV90ZXN0X2xpbWl0OworCQkJYnJlYWs7CisJCWNhc2UgUkVHRE1OX01PREVfMTFCOgorCQkJcmQgPSByZWdkb21haW4yRzsKKwkJCWN0bCA9IHJkLT5jb25mb3JtYW5jZV90ZXN0X2xpbWl0IHwgQ1RMXzExQjsKKwkJCWJyZWFrOworCQljYXNlIFJFR0RNTl9NT0RFXzExRzoKKwkJY2FzZSBSRUdETU5fTU9ERV8xMU5HX0hUMjA6CisJCWNhc2UgUkVHRE1OX01PREVfMTFOR19IVDQwUExVUzoKKwkJY2FzZSBSRUdETU5fTU9ERV8xMU5HX0hUNDBNSU5VUzoKKwkJY2FzZSBSRUdETU5fTU9ERV8xMUFDX1ZIVDIwXzJHOgorCQljYXNlIFJFR0RNTl9NT0RFXzExQUNfVkhUNDBfMkc6CisJCWNhc2UgUkVHRE1OX01PREVfMTFBQ19WSFQ4MF8yRzoKKwkJCXJkID0gcmVnZG9tYWluMkc7CisJCQljdGwgPSByZC0+Y29uZm9ybWFuY2VfdGVzdF9saW1pdCB8IENUTF8xMUc7CisJCQlicmVhazsKKwkJY2FzZSBSRUdETU5fTU9ERV8xMUdfVFVSQk86CisJCQlyZCA9IHJlZ2RvbWFpbjJHOworCQkJY3RsID0gcmQtPmNvbmZvcm1hbmNlX3Rlc3RfbGltaXQgfCBDVExfMTA4RzsKKwkJCWJyZWFrOworCQljYXNlIFJFR0RNTl9NT0RFXzExQV9UVVJCTzoKKwkJCXJkID0gcmVnZG9tYWluNUc7CisJCQljdGwgPSByZC0+Y29uZm9ybWFuY2VfdGVzdF9saW1pdCB8IENUTF8xMDhHOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljZGZfcHJpbnQoS0VSTl9FUlIgIiVzOiBVbmtvbnduIEhBTCBtb2RlIDB4JXhcbiIsCisJCQkJICBfX2Z1bmNfXywgY20tPm1vZGUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmQgPT0gcmVnZG9tYWluMkcpCisJCQljdGxfMmcgPSBjdGw7CisKKwkJaWYgKHJkID09IHJlZ2RvbWFpbjVHKQorCQkJY3RsXzVnID0gY3RsOworCX0KKworCS8qIHNhdmUgdGhlIGN0bCBpbmZvcm1hdGlvbiBmb3IgZnV0dXJlIHJlZmVyZW5jZSAqLworCXJlZy0+Y3RsXzVnID0gY3RsXzVnOworCXJlZy0+Y3RsXzJnID0gY3RsXzJnOworCisJd21hX3NlbmRfcmVnZG9tYWluX2luZm9fdG9fZncocmVnLT5yZWdfZG9tYWluLCByZWdwYWlyLT5yZWdEbW4yR0h6LAorCQkJCSAgICAgIHJlZ3BhaXItPnJlZ0RtbjVHSHosIGN0bF8yZywgY3RsXzVnKTsKK30KKworLyogY2RzX3NldF93bWFfZGZzX3JlZ2lvbigpIC0gdG8gc2V0IHRoZSBkZnMgcmVnaW9uIHRvIHdtYQorICoKKyAqIEByZWc6IHRoZSByZWd1bGF0b3J5IGhhbmRsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNkc19zZXRfd21hX2Rmc19yZWdpb24oc3RydWN0IHJlZ3VsYXRvcnkgKnJlZykKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisKKwlpZiAoIXdtYSkgeworCQljZGZfcHJpbnQoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwljZGZfcHJpbnQoIiVzOiBkZnNfcmVnaW9uOiAlZCIsIF9fZnVuY19fLCByZWctPmRmc19yZWdpb24pOworCXdtYV9zZXRfZGZzX3JlZ2lvbih3bWEsIHJlZy0+ZGZzX3JlZ2lvbik7Cit9CisKK3ZvaWQgY2RzX2ZpbGxfYW5kX3NlbmRfY3RsX3RvX2Z3KHN0cnVjdCByZWd1bGF0b3J5ICpyZWcpCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCXVpbnQzMl90IG1vZGVTZWxlY3QgPSAweEZGRkZGRkZGOworCisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl3bWFfZ2V0X21vZGVzZWxlY3Qod21hLCAmbW9kZVNlbGVjdCk7CisKKwljZHNfZmlsbF9zZW5kX2N0bF9pbmZvX3RvX2Z3KHJlZywgd21hLT5yZWdfY2FwLndpcmVsZXNzX21vZGVzLAorCQkJCSAgICAgbW9kZVNlbGVjdCk7CisJcmV0dXJuOworfQorCisvKiBnZXQgdGhlIGN0bCBmcm9tIHJlZ2RvbWFpbiAqLwordWludDhfdCBjZHNfZ2V0X2N0bF9mb3JfcmVnZG1uKHVpbnQzMl90IHJlZ19kbW4pCit7CisJdWludDhfdCBpOworCXVpbnQ4X3QgZGVmYXVsdF9yZWdkbW5fY3RsID0gRkNDOworCisJaWYgKHJlZ19kbW4gPT0gQ1RSWV9ERUZBVUxUKSB7CisJCXJldHVybiBkZWZhdWx0X3JlZ2Rtbl9jdGw7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IG9sX3JlZ2Rtbl9yZHQucmVnRG9tYWluc0N0OyBpKyspIHsKKwkJCWlmIChvbF9yZWdkbW5fcmR0LnJlZ0RvbWFpbnNbaV0ucmVnRG1uRW51bSA9PSByZWdfZG1uKQorCQkJCXJldHVybiBvbF9yZWdkbW5fcmR0LnJlZ0RvbWFpbnNbaV0uCisJCQkJICAgICAgIGNvbmZvcm1hbmNlX3Rlc3RfbGltaXQ7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICogR2V0IHRoZSA1RyByZWcgZG9tYWluIHZhbHVlIGZvciByZWcgZG9hbWluCisgKi8KK3VpbnQxNl90IGNkc19nZXRfcmVnZG1uXzVnKHVpbnQzMl90IHJlZ19kbW4pCit7CisJdWludDE2X3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBvbF9yZWdkbW5fcmR0LnJlZ0RvbWFpblBhaXJzQ3Q7IGkrKykgeworCQlpZiAob2xfcmVnZG1uX3JkdC5yZWdEb21haW5QYWlyc1tpXS5yZWdEbW5FbnVtID09IHJlZ19kbW4pIHsKKwkJCXJldHVybiBvbF9yZWdkbW5fcmR0LnJlZ0RvbWFpblBhaXJzW2ldLnJlZ0RtbjVHSHo7CisJCX0KKwl9CisJY2RmX3ByaW50KCIlczogaW52YWxpZCByZWd1bGF0b3J5IGRvbWFpbi9jb3VudHJ5IGNvZGUgMHgleFxuIiwKKwkJICBfX2Z1bmNfXywgcmVnX2Rtbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgb3BlcmF0aW5nIGNsYXNzIGZvciBhIGdpdmVuIGNoYW5uZWwKKyAqLwordWludDE2X3QgY2RzX3JlZ2RtX2dldF9vcGNsYXNzX2Zyb21fY2hhbm5lbCh1aW50OF90ICpjb3VudHJ5LCB1aW50OF90IGNoYW5uZWwsCisJCQkJCSAgICB1aW50OF90IG9mZnNldCkKK3sKKwlyZWdkbV9vcF9jbGFzc19tYXBfdCAqY2xhc3MgPSBOVUxMOworCXVpbnQxNl90IGkgPSAwOworCisJaWYgKHRydWUgPT0gY2RmX21lbV9jb21wYXJlKGNvdW50cnksICJVUyIsIDIpKSB7CisJCWNsYXNzID0gdXNfb3BfY2xhc3M7CisJfSBlbHNlIGlmICh0cnVlID09IGNkZl9tZW1fY29tcGFyZShjb3VudHJ5LCAiRVUiLCAyKSkgeworCQljbGFzcyA9IGV1cm9fb3BfY2xhc3M7CisJfSBlbHNlIGlmICh0cnVlID09IGNkZl9tZW1fY29tcGFyZShjb3VudHJ5LCAiSlAiLCAyKSkgeworCQljbGFzcyA9IGphcGFuX29wX2NsYXNzOworCX0gZWxzZSB7CisJCWNsYXNzID0gZ2xvYmFsX29wX2NsYXNzOworCX0KKworCXdoaWxlIChjbGFzcy0+b3BfY2xhc3MpIHsKKwkJaWYgKChvZmZzZXQgPT0gY2xhc3MtPm9mZnNldCkgfHwgKG9mZnNldCA9PSBCV0FMTCkpIHsKKwkJCWZvciAoaSA9IDA7CisJCQkgICAgIChpIDwgTUFYX0NIQU5ORUxTX1BFUl9PUEVSQVRJTkdfQ0xBU1MgJiYKKwkJCSAgICAgIGNsYXNzLT5jaGFubmVsc1tpXSk7IGkrKykgeworCQkJCWlmIChjaGFubmVsID09IGNsYXNzLT5jaGFubmVsc1tpXSkKKwkJCQkJcmV0dXJuIGNsYXNzLT5vcF9jbGFzczsKKwkJCX0KKwkJfQorCQljbGFzcysrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCBjdXJyZW50IG9wZXJhdGluZyBjbGFzc2VzIHBlciBjb3VudHJ5LCByZWdkb21haW4KKyAqLwordWludDE2X3QgY2RzX3JlZ2RtX3NldF9jdXJyX29wY2xhc3Nlcyh1aW50OF90IG51bV9jbGFzc2VzLCB1aW50OF90ICpjbGFzcykKK3sKKwl1aW50OF90IGk7CisKKwlpZiAoU0lSX01BQ19NQVhfU1VQUF9PUEVSX0NMQVNTRVMgPCBudW1fY2xhc3NlcykgeworCQljZGZfcHJpbnQoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIG51bUNsYXNzZXMgKCVkKVxuIiwKKwkJCSAgX19mdW5jX18sIG51bV9jbGFzc2VzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fY2xhc3NlczsgaSsrKSB7CisJCXJlZ2RtX2N1cnJfc3VwcF9vcHBfY2xhc3Nlcy5jbGFzc2VzW2ldID0gY2xhc3NbaV07CisJfQorCXJlZ2RtX2N1cnJfc3VwcF9vcHBfY2xhc3Nlcy5udW1fY2xhc3NlcyA9IG51bV9jbGFzc2VzOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgY3VycmVudCBvcGVyYXRpbmcgY2xhc3NlcworICovCit1aW50MTZfdCBjZHNfcmVnZG1fZ2V0X2N1cnJfb3BjbGFzc2VzKHVpbnQ4X3QgKm51bV9jbGFzc2VzLCB1aW50OF90ICpjbGFzcykKK3sKKwl1aW50OF90IGk7CisKKwlpZiAoIW51bV9jbGFzc2VzIHx8ICFjbGFzcykgeworCQljZGZfcHJpbnQoS0VSTl9FUlIgIiVzOiBFaXRoZXIgbnVtX2NsYXNzZXMgb3IgY2xhc3MgaXMgbnVsbFxuIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJlZ2RtX2N1cnJfc3VwcF9vcHBfY2xhc3Nlcy5udW1fY2xhc3NlczsgaSsrKSB7CisJCWNsYXNzW2ldID0gcmVnZG1fY3Vycl9zdXBwX29wcF9jbGFzc2VzLmNsYXNzZXNbaV07CisJfQorCisJKm51bV9jbGFzc2VzID0gcmVnZG1fY3Vycl9zdXBwX29wcF9jbGFzc2VzLm51bV9jbGFzc2VzOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Nkcy9zcmMvY2RzX3NjaGVkLmMgYi9jb3JlL2Nkcy9zcmMvY2RzX3NjaGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjOGRmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY2RzL3NyYy9jZHNfc2NoZWQuYwpAQCAtMCwwICsxLDEyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogIEZpbGU6IGNkc19zY2hlZC5jCisgKgorICogIERPQzogQ0RTIFNjaGVkdWxlciBJbXBsZW1lbnRhdGlvbgorICovCisKKyAvKiBJbmNsdWRlIEZpbGVzICovCisjaW5jbHVkZSA8Y2RzX21xLmg+CisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgPGFuaV9nbG9iYWwuaD4KKyNpbmNsdWRlIDxzaXJfdHlwZXMuaD4KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1fYXBpLmg+CisjaW5jbHVkZSA8c21lX2FwaS5oPgorI2luY2x1ZGUgPHdsYW5fcWN0X3N5cy5oPgorI2luY2x1ZGUgImNkc19zY2hlZC5oIgorI2luY2x1ZGUgPHdsYW5faGRkX3Bvd2VyLmg+CisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaWYgZGVmaW5lZChRQ0FfQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfQ05TUykKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2VuZGlmCisvKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cyAqLworI2RlZmluZSBDRFNfU0NIRURfVEhSRUFEX0hFQVJUX0JFQVQgICAgSU5GSU5JVEUKKy8qIE1pbGxpIHNlY29uZHMgdG8gZGVsYXkgU1NSIHRocmVhZCB3aGVuIGFuIEVudHJ5IHBvaW50IGlzIEFjdGl2ZSAqLworI2RlZmluZSBTU1JfV0FJVF9TTEVFUF9USU1FIDIwMAorLyogTUFYIGl0ZXJhdGlvbiBjb3VudCB0byB3YWl0IGZvciBFbnRyeSBwb2ludCB0byBleGl0IGJlZm9yZQorICogd2UgcHJvY2VlZCB3aXRoIFNTUiBpbiBXRCBUaHJlYWQKKyAqLworI2RlZmluZSBNQVhfU1NSX1dBSVRfSVRFUkFUSU9OUyAyMDAKKyNkZWZpbmUgTUFYX1NTUl9QUk9URUNUX0xPRyAoMTYpCisKK3N0YXRpYyBhdG9taWNfdCBzc3JfcHJvdGVjdF9lbnRyeV9jb3VudDsKKworLyoqCisgKiBzdHJ1Y3Qgc3NyX3Byb3RlY3QgLSBzdWIgc3lzdGVtIHJlc3RhcnQoc3NyKSBwcm90ZWN0aW9uIHRyYWNraW5nIHRhYmxlCisgKiBAZnVuYzogRnVuY3Rpb24gd2hpY2ggbmVlZHMgc3NyIHByb3RlY3Rpb24KKyAqIEBmcmVlOiBGbGFnIHRvIHRlbGwgd2hldGhlciBlbnRyeSBpcyBmcmVlIGluIHRhYmxlIG9yIG5vdAorICogQHBpZDogUHJvY2VzcyBpZCB3aGljaCBuZWVkcyBzc3IgcHJvdGVjdGlvbgorICovCitzdHJ1Y3Qgc3NyX3Byb3RlY3QgeworCWNvbnN0IGNoYXIgKmZ1bmM7CisJYm9vbCAgZnJlZTsKKwl1aW50MzJfdCBwaWQ7Cit9OworCitzdGF0aWMgc3BpbmxvY2tfdCBzc3JfcHJvdGVjdF9sb2NrOworc3RhdGljIHN0cnVjdCBzc3JfcHJvdGVjdCBzc3JfcHJvdGVjdF9sb2dbTUFYX1NTUl9QUk9URUNUX0xPR107CisKK3N0YXRpYyBwX2Nkc19zY2hlZF9jb250ZXh0IGdwX2Nkc19zY2hlZF9jb250ZXh0OworCitzdGF0aWMgaW50IGNkc19tY190aHJlYWQodm9pZCAqQXJnKTsKKyNpZmRlZiBRQ0FfQ09ORklHX1NNUAorc3RhdGljIGludCBjZHNfb2xfcnhfdGhyZWFkKHZvaWQgKmFyZyk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBhZmZpbmVfY3B1Oworc3RhdGljIENERl9TVEFUVVMgY2RzX2FsbG9jX29sX3J4X3BrdF9mcmVlcShwX2Nkc19zY2hlZF9jb250ZXh0IHBTY2hlZENvbnRleHQpOworI2VuZGlmCisKKyNpZmRlZiBRQ0FfQ09ORklHX1NNUAorI2RlZmluZSBDRFNfQ09SRV9QRVJfQ0xVU1RFUiAoNCkKK3N0YXRpYyBpbnQgY2RzX3NldF9jcHVzX2FsbG93ZWRfcHRyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBjcHUpCit7CisjaWZkZWYgV0xBTl9PUEVOX1NPVVJDRQorCXJldHVybiBzZXRfY3B1c19hbGxvd2VkX3B0cih0YXNrLCBjcHVtYXNrX29mKGNwdSkpOworI2VsaWYgZGVmaW5lZChDT05GSUdfQ05TUykKKwlyZXR1cm4gY25zc19zZXRfY3B1c19hbGxvd2VkX3B0cih0YXNrLCBjcHUpOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisvKioKKyAqIGNkc19jcHVfaG90cGx1Z19ub3RpZnkoKSAtIGhvdCBwbHVnIG5vdGlmeQorICogQGJsb2NrOiBQb2ludGVyIHRvIGJsb2NrCisgKiBAc3RhdGU6IFN0YXRlCisgKiBAaGNwdTogUG9pbnRlciB0byBob3RwbHVnIGNwdQorICoKKyAqIFJldHVybjogTk9USUZZX09LCisgKi8KK3N0YXRpYyBpbnQKK2Nkc19jcHVfaG90cGx1Z19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpibG9jaywKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhdGUsIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgbG9uZyBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCXVuc2lnbmVkIGxvbmcgcHJlZl9jcHUgPSAwOworCXBfY2RzX3NjaGVkX2NvbnRleHQgcFNjaGVkQ29udGV4dCA9IGdldF9jZHNfc2NoZWRfY3R4dCgpOworCWludCBpOworCXVuc2lnbmVkIGludCBtdWx0aV9jbHVzdGVyOworCXVuc2lnbmVkIGludCBudW1fY3B1czsKKworCWlmICgoTlVMTCA9PSBwU2NoZWRDb250ZXh0KSB8fCAoTlVMTCA9PSBwU2NoZWRDb250ZXh0LT5vbF9yeF90aHJlYWQpKQorCQlyZXR1cm4gTk9USUZZX09LOworCisJaWYgKGNkc19pc19sb2FkX3VubG9hZF9pbl9wcm9ncmVzcygpKQorCQlyZXR1cm4gTk9USUZZX09LOworCisJbnVtX2NwdXMgPSBudW1fcG9zc2libGVfY3B1cygpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIlczogUlggQ09SRSAlZCwgU1RBVEUgJWQsIE5VTSBDUFVTICVkIiwKKwkJICBfX2Z1bmNfXywgKGludClhZmZpbmVfY3B1LCAoaW50KXN0YXRlLCBudW1fY3B1cyk7CisJbXVsdGlfY2x1c3RlciA9IChudW1fY3B1cyA+IENEU19DT1JFX1BFUl9DTFVTVEVSKSA/IDEgOiAwOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgQ1BVX09OTElORToKKwkJaWYgKCghbXVsdGlfY2x1c3RlcikgJiYgKGFmZmluZV9jcHUgIT0gMCkpCisJCQlyZXR1cm4gTk9USUZZX09LOworCisJCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQkJaWYgKGkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXByZWZfY3B1ID0gaTsKKwkJCWlmICghbXVsdGlfY2x1c3RlcikKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIENQVV9ERUFEOgorCQlpZiAoY3B1ICE9IGFmZmluZV9jcHUpCisJCQlyZXR1cm4gTk9USUZZX09LOworCisJCWFmZmluZV9jcHUgPSAwOworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJCWlmIChpID09IDApCisJCQkJY29udGludWU7CisJCQlwcmVmX2NwdSA9IGk7CisJCQlpZiAoIW11bHRpX2NsdXN0ZXIpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocHJlZl9jcHUgPT0gMCkKKwkJcmV0dXJuIE5PVElGWV9PSzsKKworCWlmICghY2RzX3NldF9jcHVzX2FsbG93ZWRfcHRyKHBTY2hlZENvbnRleHQtPm9sX3J4X3RocmVhZCwgcHJlZl9jcHUpKQorCQlhZmZpbmVfY3B1ID0gcHJlZl9jcHU7CisKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNkc19jcHVfaG90cGx1Z19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGNkc19jcHVfaG90cGx1Z19ub3RpZnksCit9OworI2VuZGlmCisKKy8qKgorICogY2RzX3NjaGVkX29wZW4oKSAtIGluaXRpYWxpemUgdGhlIENEUyBTY2hlZHVsZXIKKyAqIEBwX2Nkc19jb250ZXh0OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgQ0RTIENvbnRleHQKKyAqIEBwU2NoZWRDb250ZXh0OiBQb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVyIGJpZworICoJZW5vdWdoIHRvIGhvbGQgYSBzY2hlZHVsZXIgY29udGV4dC4KKyAqIEBTY2hlZEN0eFNpemU6IENEUyBzY2hlZHVsZXIgY29udGV4dCBzaXplCisgKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgQ0RTIFNjaGVkdWxlcgorICogVXBvbiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uOgorICoJLSBBbGwgdGhlIG1lc3NhZ2UgcXVldWVzIGFyZSBpbml0aWFsaXplZAorICoJLSBUaGUgTWFpbiBDb250cm9sbGVyIHRocmVhZCBpcyBjcmVhdGVkIGFuZCByZWFkeSB0byByZWNlaXZlIGFuZAorICoJZGlzcGF0Y2ggbWVzc2FnZXMuCisgKgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIGNkc19zY2hlZF9vcGVuKHZvaWQgKnBfY2RzX2NvbnRleHQsCisJCXBfY2RzX3NjaGVkX2NvbnRleHQgcFNjaGVkQ29udGV4dCwKKwkJdWludDMyX3QgU2NoZWRDdHhTaXplKQoreworCUNERl9TVEFUVVMgdlN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBPcGVuaW5nIHRoZSBDRFMgU2NoZWR1bGVyIiwgX19mdW5jX18pOworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoKHBfY2RzX2NvbnRleHQgPT0gTlVMTCkgfHwgKHBTY2hlZENvbnRleHQgPT0gTlVMTCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTnVsbCBwYXJhbXMgYmVpbmcgcGFzc2VkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmIChzaXplb2YoY2RzX3NjaGVkX2NvbnRleHQpICE9IFNjaGVkQ3R4U2l6ZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogSW5jb3JyZWN0IENEUyBTY2hlZCBDb250ZXh0IHNpemUgcGFzc2VkIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKwljZGZfbWVtX3plcm8ocFNjaGVkQ29udGV4dCwgc2l6ZW9mKGNkc19zY2hlZF9jb250ZXh0KSk7CisJcFNjaGVkQ29udGV4dC0+cFZDb250ZXh0ID0gcF9jZHNfY29udGV4dDsKKwl2U3RhdHVzID0gY2RzX3NjaGVkX2luaXRfbXFzKHBTY2hlZENvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIENEUyBTY2hlZHVsZXIgTVFzIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gdlN0YXR1czsKKwl9CisJLyogSW5pdGlhbGl6ZSB0aGUgaGVscGVyIGV2ZW50cyBhbmQgZXZlbnQgcXVldWVzICovCisJaW5pdF9jb21wbGV0aW9uKCZwU2NoZWRDb250ZXh0LT5NY1N0YXJ0RXZlbnQpOworCWluaXRfY29tcGxldGlvbigmcFNjaGVkQ29udGV4dC0+TWNTaHV0ZG93bik7CisJaW5pdF9jb21wbGV0aW9uKCZwU2NoZWRDb250ZXh0LT5SZXN1bWVNY0V2ZW50KTsKKworCXNwaW5fbG9ja19pbml0KCZwU2NoZWRDb250ZXh0LT5NY1RocmVhZExvY2spOworI2lmZGVmIFFDQV9DT05GSUdfU01QCisJc3Bpbl9sb2NrX2luaXQoJnBTY2hlZENvbnRleHQtPm9sX3J4X3RocmVhZF9sb2NrKTsKKyNlbmRpZgorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcFNjaGVkQ29udGV4dC0+bWNXYWl0UXVldWUpOworCXBTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnID0gMDsKKworI2lmZGVmIFFDQV9DT05GSUdfU01QCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcFNjaGVkQ29udGV4dC0+b2xfcnhfd2FpdF9xdWV1ZSk7CisJaW5pdF9jb21wbGV0aW9uKCZwU2NoZWRDb250ZXh0LT5vbF9yeF9zdGFydF9ldmVudCk7CisJaW5pdF9jb21wbGV0aW9uKCZwU2NoZWRDb250ZXh0LT5vbF9zdXNwZW5kX3J4X2V2ZW50KTsKKwlpbml0X2NvbXBsZXRpb24oJnBTY2hlZENvbnRleHQtPm9sX3Jlc3VtZV9yeF9ldmVudCk7CisJaW5pdF9jb21wbGV0aW9uKCZwU2NoZWRDb250ZXh0LT5vbF9yeF9zaHV0ZG93bik7CisJcFNjaGVkQ29udGV4dC0+b2xfcnhfZXZlbnRfZmxhZyA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJnBTY2hlZENvbnRleHQtPm9sX3J4X3F1ZXVlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwU2NoZWRDb250ZXh0LT5jZHNfb2xfcnhfcGt0X2ZyZWVxX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZwU2NoZWRDb250ZXh0LT5vbF9yeF90aHJlYWRfcXVldWUpOworCXNwaW5fbG9ja19iaCgmcFNjaGVkQ29udGV4dC0+Y2RzX29sX3J4X3BrdF9mcmVlcV9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcFNjaGVkQ29udGV4dC0+Y2RzX29sX3J4X3BrdF9mcmVlcSk7CisJc3Bpbl91bmxvY2tfYmgoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXFfbG9jayk7CisJaWYgKGNkc19hbGxvY19vbF9yeF9wa3RfZnJlZXEocFNjaGVkQ29udGV4dCkgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZjZHNfY3B1X2hvdHBsdWdfbm90aWZpZXIpOworCXBTY2hlZENvbnRleHQtPmNwdV9ob3RfcGx1Z19ub3RpZmllciA9ICZjZHNfY3B1X2hvdHBsdWdfbm90aWZpZXI7CisjZW5kaWYKKwlncF9jZHNfc2NoZWRfY29udGV4dCA9IHBTY2hlZENvbnRleHQ7CisKKwkvKiBDcmVhdGUgdGhlIENEUyBNYWluIENvbnRyb2xsZXIgdGhyZWFkICovCisJcFNjaGVkQ29udGV4dC0+TWNUaHJlYWQgPSBrdGhyZWFkX2NyZWF0ZShjZHNfbWNfdGhyZWFkLCBwU2NoZWRDb250ZXh0LAorCQkJCQkJICJjZHNfbWNfdGhyZWFkIik7CisJaWYgKElTX0VSUihwU2NoZWRDb250ZXh0LT5NY1RocmVhZCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogQ291bGQgbm90IENyZWF0ZSBDRFMgTWFpbiBUaHJlYWQgQ29udHJvbGxlciIsCisJCQkgIF9fZnVuY19fKTsKKwkJZ290byBNQ19USFJFQURfU1RBUlRfRkFJTFVSRTsKKwl9CisJd2FrZV91cF9wcm9jZXNzKHBTY2hlZENvbnRleHQtPk1jVGhyZWFkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBDRFMgTWFpbiBDb250cm9sbGVyIHRocmVhZCBDcmVhdGVkIiwgX19mdW5jX18pOworCisjaWZkZWYgUUNBX0NPTkZJR19TTVAKKwlwU2NoZWRDb250ZXh0LT5vbF9yeF90aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZShjZHNfb2xfcnhfdGhyZWFkLAorCQkJCQkJICAgICAgIHBTY2hlZENvbnRleHQsCisJCQkJCQkgICAgICAgImNkc19vbF9yeF90aHJlYWQiKTsKKwlpZiAoSVNfRVJSKHBTY2hlZENvbnRleHQtPm9sX3J4X3RocmVhZCkpIHsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBDb3VsZCBub3QgQ3JlYXRlIENEUyBPTCBSWCBUaHJlYWQiLAorCQkJICBfX2Z1bmNfXyk7CisJCWdvdG8gT0xfUlhfVEhSRUFEX1NUQVJUX0ZBSUxVUkU7CisKKwl9CisJd2FrZV91cF9wcm9jZXNzKHBTY2hlZENvbnRleHQtPm9sX3J4X3RocmVhZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICgiQ0RTIE9MIFJYIHRocmVhZCBDcmVhdGVkIikpOworI2VuZGlmCisJLyoKKwkgKiBOb3cgbWFrZSBzdXJlIGFsbCB0aHJlYWRzIGhhdmUgc3RhcnRlZCBiZWZvcmUgd2UgZXhpdC4KKwkgKiBFYWNoIHRocmVhZCBzaG91bGQgbm9ybWFsbHkgQUNLIGJhY2sgd2hlbiBpdCBzdGFydHMuCisJICovCisJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZwU2NoZWRDb250ZXh0LT5NY1N0YXJ0RXZlbnQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6IENEUyBNQyBUaHJlYWQgaGFzIHN0YXJ0ZWQiLCBfX2Z1bmNfXyk7CisjaWZkZWYgUUNBX0NPTkZJR19TTVAKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnBTY2hlZENvbnRleHQtPm9sX3J4X3N0YXJ0X2V2ZW50KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBDRFMgT0wgUnggVGhyZWFkIGhhcyBzdGFydGVkIiwgX19mdW5jX18pOworI2VuZGlmCisJLyogV2UncmUgZ29vZCBub3c6IExldCdzIGdldCB0aGUgYmFsbCByb2xsaW5nISEhICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogQ0RTIFNjaGVkdWxlciBzdWNjZXNzZnVsbHkgT3BlbmVkIiwgX19mdW5jX18pOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKyNpZmRlZiBRQ0FfQ09ORklHX1NNUAorT0xfUlhfVEhSRUFEX1NUQVJUX0ZBSUxVUkU6CisJLyogVHJ5IGFuZCBmb3JjZSB0aGUgTWFpbiB0aHJlYWQgY29udHJvbGxlciB0byBleGl0ICovCisJc2V0X2JpdChNQ19TSFVURE9XTl9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcpOworCXNldF9iaXQoTUNfUE9TVF9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcFNjaGVkQ29udGV4dC0+bWNXYWl0UXVldWUpOworCS8qIFdhaXQgZm9yIE1DIHRvIGV4aXQgKi8KKwl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnBTY2hlZENvbnRleHQtPk1jU2h1dGRvd24pOworI2VuZGlmCisKK01DX1RIUkVBRF9TVEFSVF9GQUlMVVJFOgorCS8qIERlLWluaXRpYWxpemUgYWxsIHRoZSBtZXNzYWdlIHF1ZXVlcyAqLworCWNkc19zY2hlZF9kZWluaXRfbXFzKHBTY2hlZENvbnRleHQpOworCisjaWZkZWYgUUNBX0NPTkZJR19TTVAKKwl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmY2RzX2NwdV9ob3RwbHVnX25vdGlmaWVyKTsKKwljZHNfZnJlZV9vbF9yeF9wa3RfZnJlZXEoZ3BfY2RzX3NjaGVkX2NvbnRleHQpOworI2VuZGlmCisKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKworfSAvKiBjZHNfc2NoZWRfb3BlbigpICovCisKKy8qKgorICogY2RzX21jX3RocmVhZCgpIC0gY2RzIG1haW4gY29udHJvbGxlciB0aHJlYWQgZXhlY3V0aW9uIGhhbmRsZXIKKyAqIEBBcmc6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBDRFMgU2NoZWQgQ29udGV4dAorICoKKyAqIFJldHVybjogdGhyZWFkIGV4aXQgY29kZQorICovCitzdGF0aWMgaW50IGNkc19tY190aHJlYWQodm9pZCAqQXJnKQoreworCXBfY2RzX3NjaGVkX2NvbnRleHQgcFNjaGVkQ29udGV4dCA9IChwX2Nkc19zY2hlZF9jb250ZXh0KSBBcmc7CisJcF9jZHNfbXNnX3dyYXBwZXIgcE1zZ1dyYXBwZXIgPSBOVUxMOworCXRwQW5pU2lyR2xvYmFsIHBNYWNDb250ZXh0ID0gTlVMTDsKKwl0U2lyUmV0U3RhdHVzIG1hY1N0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIHZTdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaW50IHJldFdhaXRTdGF0dXMgPSAwOworCWJvb2wgc2h1dGRvd24gPSBmYWxzZTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKwl2X0NPTlRFWFRfdCBwX2Nkc19jb250ZXh0ID0gTlVMTDsKKworCWlmIChBcmcgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBCYWQgQXJncyBwYXNzZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yKTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA4LCAwKSkKKwlkYWVtb25pemUoIk1DX1RocmVhZCIpOworI2VuZGlmCisKKwkvKiBBY2sgYmFjayB0byB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRoZSBtYWluIGNvbnRyb2xsZXIgdGhyZWFkCisJICogaGFzIGJlZW4gY3JlYXRlZAorCSAqLworCWNvbXBsZXRlKCZwU2NoZWRDb250ZXh0LT5NY1N0YXJ0RXZlbnQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBNQyBUaHJlYWQgJWQgKCVzKSBzdGFydGluZyB1cCIsIF9fZnVuY19fLCBjdXJyZW50LT5waWQsCisJCSAgY3VycmVudC0+Y29tbSk7CisKKwkvKiBHZXQgdGhlIEdsb2JhbCBDRFMgQ29udGV4dCAqLworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFwX2Nkc19jb250ZXh0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogR2xvYmFsIENEUyBjb250ZXh0IGlzIE51bGwiLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlwSGRkQ3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoIXBIZGRDdHgpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKCFzaHV0ZG93bikgeworCQkvKiBUaGlzIGltcGxlbWVudHMgdGhlIGV4ZWN1dGlvbiBtb2RlbCBhbGdvcml0aG0gKi8KKwkJcmV0V2FpdFN0YXR1cyA9CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocFNjaGVkQ29udGV4dC0+bWNXYWl0UXVldWUsCisJCQkJCQkgdGVzdF9iaXQoTUNfUE9TVF9FVkVOVF9NQVNLLAorCQkJCQkJCSAgJnBTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnKQorCQkJCQkJIHx8IHRlc3RfYml0KE1DX1NVU1BFTkRfRVZFTlRfTUFTSywKKwkJCQkJCQkgICAgICZwU2NoZWRDb250ZXh0LT5tY0V2ZW50RmxhZykpOworCisJCWlmIChyZXRXYWl0U3RhdHVzID09IC1FUkVTVEFSVFNZUykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSByZXR1cm5lZCAtRVJFU1RBUlRTWVMiLAorCQkJCSAgX19mdW5jX18pOworCQkJQ0RGX0JVRygwKTsKKwkJfQorCQljbGVhcl9iaXQoTUNfUE9TVF9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcpOworCisJCXdoaWxlICgxKSB7CisJCQkvKiBDaGVjayBpZiBNQyBuZWVkcyB0byBzaHV0ZG93biAqLworCQkJaWYgKHRlc3RfYml0CisJCQkJICAgIChNQ19TSFVURE9XTl9FVkVOVF9NQVNLLAorCQkJCSAgICAmcFNjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcpKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICIlczogTUMgdGhyZWFkIHNpZ25hbGVkIHRvIHNodXRkb3duIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQkJc2h1dGRvd24gPSB0cnVlOworCQkJCS8qIENoZWNrIGZvciBhbnkgU3VzcGVuZCBJbmRpY2F0aW9uICovCisJCQkJaWYgKHRlc3RfYml0CisJCQkJCSAgICAoTUNfU1VTUEVORF9FVkVOVF9NQVNLLAorCQkJCQkgICAgJnBTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnKSkgeworCQkJCQljbGVhcl9iaXQoTUNfU1VTUEVORF9FVkVOVF9NQVNLLAorCQkJCQkJICAmcFNjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcpOworCisJCQkJCS8qIFVuYmxvY2sgYW55b25lIHdhaXRpbmcgb24gc3VzcGVuZCAqLworCQkJCQljb21wbGV0ZSgmcEhkZEN0eC0+bWNfc3VzX2V2ZW50X3Zhcik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJLyogQ2hlY2sgdGhlIFNZUyBxdWV1ZSBmaXJzdCAqLworCQkJaWYgKCFjZHNfaXNfbXFfZW1wdHkoJnBTY2hlZENvbnRleHQtPnN5c01jTXEpKSB7CisJCQkJLyogU2VydmljZSB0aGUgU1lTIG1lc3NhZ2UgcXVldWUgKi8KKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSAgIiVzOiBTZXJ2aWNpbmcgdGhlIENEUyBTWVMgTUMgTWVzc2FnZSBxdWV1ZSIsCisJCQkJCSAgX19mdW5jX18pOworCQkJCXBNc2dXcmFwcGVyID0KKwkJCQkJY2RzX21xX2dldCgmcFNjaGVkQ29udGV4dC0+c3lzTWNNcSk7CisJCQkJaWYgKHBNc2dXcmFwcGVyID09IE5VTEwpIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkgICIlczogcE1zZ1dyYXBwZXIgaXMgTlVMTCIsCisJCQkJCQkgIF9fZnVuY19fKTsKKwkJCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXZTdGF0dXMgPQorCQkJCQlzeXNfbWNfcHJvY2Vzc19tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LAorCQkJCQkJCSAgIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKwkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkgeworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJCSAgIiVzOiBJc3N1ZSBQcm9jZXNzaW5nIFNZUyBtZXNzYWdlIiwKKwkJCQkJCSAgX19mdW5jX18pOworCQkJCX0KKwkJCQkvKiByZXR1cm4gbWVzc2FnZSB0byB0aGUgQ29yZSAqLworCQkJCWNkc19jb3JlX3JldHVybl9tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LAorCQkJCQkJICAgIHBNc2dXcmFwcGVyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIENoZWNrIHRoZSBXTUEgcXVldWUgKi8KKwkJCWlmICghY2RzX2lzX21xX2VtcHR5KCZwU2NoZWRDb250ZXh0LT53bWFNY01xKSkgeworCQkJCS8qIFNlcnZpY2UgdGhlIFdNQSBtZXNzYWdlIHF1ZXVlICovCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICIlczogU2VydmljaW5nIHRoZSBDRFMgV01BIE1DIE1lc3NhZ2UgcXVldWUiLAorCQkJCQkgIF9fZnVuY19fKTsKKwkJCQlwTXNnV3JhcHBlciA9CisJCQkJCWNkc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPndtYU1jTXEpOworCQkJCWlmIChwTXNnV3JhcHBlciA9PSBOVUxMKSB7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJICAiJXM6IHBNc2dXcmFwcGVyIGlzIE5VTEwiLAorCQkJCQkJICBfX2Z1bmNfXyk7CisJCQkJCUNERl9BU1NFUlQoMCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQl2U3RhdHVzID0KKwkJCQkJd21hX21jX3Byb2Nlc3NfbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwKKwkJCQkJCQkgcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworCQkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKSB7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJICAiJXM6IElzc3VlIFByb2Nlc3NpbmcgV01BIG1lc3NhZ2UiLAorCQkJCQkJICBfX2Z1bmNfXyk7CisJCQkJfQorCQkJCS8qIHJldHVybiBtZXNzYWdlIHRvIHRoZSBDb3JlICovCisJCQkJY2RzX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsCisJCQkJCQkgICAgcE1zZ1dyYXBwZXIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogQ2hlY2sgdGhlIFBFIHF1ZXVlICovCisJCQlpZiAoIWNkc19pc19tcV9lbXB0eSgmcFNjaGVkQ29udGV4dC0+cGVNY01xKSkgeworCQkJCS8qIFNlcnZpY2UgdGhlIFBFIG1lc3NhZ2UgcXVldWUgKi8KKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSAgIiVzOiBTZXJ2aWNpbmcgdGhlIENEUyBQRSBNQyBNZXNzYWdlIHF1ZXVlIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQkJcE1zZ1dyYXBwZXIgPQorCQkJCQljZHNfbXFfZ2V0KCZwU2NoZWRDb250ZXh0LT5wZU1jTXEpOworCQkJCWlmIChOVUxMID09IHBNc2dXcmFwcGVyKSB7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJICAiJXM6IHBNc2dXcmFwcGVyIGlzIE5VTEwiLAorCQkJCQkJICBfX2Z1bmNfXyk7CisJCQkJCUNERl9BU1NFUlQoMCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIE5lZWQgc29tZSBvcHRpbWl6YXRpb24gKi8KKwkJCQlwTWFjQ29udGV4dCA9CisJCQkJCWNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKwkJCQlpZiAoTlVMTCA9PSBwTWFjQ29udGV4dCkgeworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkJICAiTUFDIENvbnRleHQgbm90IHJlYWR5IHlldCIpOworCQkJCQljZHNfY29yZV9yZXR1cm5fbXNnCisJCQkJCQkocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LAorCQkJCQkJcE1zZ1dyYXBwZXIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQltYWNTdGF0dXMgPQorCQkJCQlwZV9wcm9jZXNzX21lc3NhZ2VzKHBNYWNDb250ZXh0LAorCQkJCQkJCSAgICAodFNpck1zZ1EgKikKKwkJCQkJCQkgICAgcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworCQkJCWlmIChlU0lSX1NVQ0NFU1MgIT0gbWFjU3RhdHVzKSB7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJICAiJXM6IElzc3VlIFByb2Nlc3NpbmcgUEUgbWVzc2FnZSIsCisJCQkJCQkgIF9fZnVuY19fKTsKKwkJCQl9CisJCQkJLyogcmV0dXJuIG1lc3NhZ2UgdG8gdGhlIENvcmUgKi8KKwkJCQljZHNfY29yZV9yZXR1cm5fbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwKKwkJCQkJCSAgICBwTXNnV3JhcHBlcik7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiogQ2hlY2sgdGhlIFNNRSBxdWV1ZSAqKi8KKwkJCWlmICghY2RzX2lzX21xX2VtcHR5KCZwU2NoZWRDb250ZXh0LT5zbWVNY01xKSkgeworCQkJCS8qIFNlcnZpY2UgdGhlIFNNRSBtZXNzYWdlIHF1ZXVlICovCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICIlczogU2VydmljaW5nIHRoZSBDRFMgU01FIE1DIE1lc3NhZ2UgcXVldWUiLAorCQkJCQkgIF9fZnVuY19fKTsKKwkJCQlwTXNnV3JhcHBlciA9CisJCQkJCWNkc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnNtZU1jTXEpOworCQkJCWlmIChOVUxMID09IHBNc2dXcmFwcGVyKSB7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJICAiJXM6IHBNc2dXcmFwcGVyIGlzIE5VTEwiLAorCQkJCQkJICBfX2Z1bmNfXyk7CisJCQkJCUNERl9BU1NFUlQoMCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIE5lZWQgc29tZSBvcHRpbWl6YXRpb24gKi8KKwkJCQlwTWFjQ29udGV4dCA9CisJCQkJCWNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1NNRSk7CisJCQkJaWYgKE5VTEwgPT0gcE1hY0NvbnRleHQpIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJCSAgIk1BQyBDb250ZXh0IG5vdCByZWFkeSB5ZXQiKTsKKwkJCQkJY2RzX2NvcmVfcmV0dXJuX21zZworCQkJCQkJKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwKKwkJCQkJCXBNc2dXcmFwcGVyKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJdlN0YXR1cyA9CisJCQkJCXNtZV9wcm9jZXNzX21zZygodEhhbEhhbmRsZSkgcE1hY0NvbnRleHQsCisJCQkJCQkJcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworCQkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKSB7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJICAiJXM6IElzc3VlIFByb2Nlc3NpbmcgU01FIG1lc3NhZ2UiLAorCQkJCQkJICBfX2Z1bmNfXyk7CisJCQkJfQorCQkJCS8qIHJldHVybiBtZXNzYWdlIHRvIHRoZSBDb3JlICovCisJCQkJY2RzX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsCisJCQkJCQkgICAgcE1zZ1dyYXBwZXIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogQ2hlY2sgZm9yIGFueSBTdXNwZW5kIEluZGljYXRpb24gKi8KKwkJCWlmICh0ZXN0X2JpdAorCQkJCSAgICAoTUNfU1VTUEVORF9FVkVOVF9NQVNLLAorCQkJCSAgICAmcFNjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcpKSB7CisJCQkJY2xlYXJfYml0KE1DX1NVU1BFTkRfRVZFTlRfTUFTSywKKwkJCQkJICAmcFNjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcpOworCQkJCXNwaW5fbG9jaygmcFNjaGVkQ29udGV4dC0+TWNUaHJlYWRMb2NrKTsKKworCQkJCS8qIE1jIFRocmVhZCBTdXNwZW5kZWQgKi8KKwkJCQljb21wbGV0ZSgmcEhkZEN0eC0+bWNfc3VzX2V2ZW50X3Zhcik7CisKKwkJCQlJTklUX0NPTVBMRVRJT04ocFNjaGVkQ29udGV4dC0+UmVzdW1lTWNFdmVudCk7CisJCQkJc3Bpbl91bmxvY2soJnBTY2hlZENvbnRleHQtPk1jVGhyZWFkTG9jayk7CisKKwkJCQkvKiBXYWl0IGZvZSBSZXN1bWUgSW5kaWNhdGlvbiAqLworCQkJCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZQorCQkJCQkoJnBTY2hlZENvbnRleHQtPlJlc3VtZU1jRXZlbnQpOworCQkJfQorCQkJYnJlYWs7ICAvKiBBbGwgcXVldWVzIGFyZSBlbXB0eSBub3cgKi8KKwkJfSAvKiB3aGlsZSBtZXNzYWdlIGxvb3AgcHJvY2Vzc2luZyAqLworCX0gLyogd2hpbGUgdHJ1ZSAqLworCS8qIElmIHdlIGdldCBoZXJlIHRoZSBNQyB0aHJlYWQgbXVzdCBleGl0ICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IE1DIFRocmVhZCBleGl0aW5nISEhISIsIF9fZnVuY19fKTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmcFNjaGVkQ29udGV4dC0+TWNTaHV0ZG93biwgMCk7Cit9IC8qIGNkc19tY190aHJlYWQoKSAqLworCisjaWZkZWYgUUNBX0NPTkZJR19TTVAKKy8qKgorICogY2RzX2ZyZWVfb2xfcnhfcGt0X2ZyZWVxKCkgLSBmcmVlIGNkcyBidWZmZXIgZnJlZSBxdWV1ZQorICogQHBTY2hlZENvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgQ0RTIFNjaGVkIENvbnRleHQKKyAqCisgKiBUaGlzIEFQSSBkb2VzIG1lbSBmcmVlIG9mIHRoZSBidWZmZXJzIGF2YWlsYWJsZSBpbiBmcmVlIGNkcyBidWZmZXIKKyAqIHF1ZXVlIHdoaWNoIGlzIHVzZWQgZm9yIERhdGEgcnggcHJvY2Vzc2luZy4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBjZHNfZnJlZV9vbF9yeF9wa3RfZnJlZXEocF9jZHNfc2NoZWRfY29udGV4dCBwU2NoZWRDb250ZXh0KQoreworCXN0cnVjdCBjZHNfb2xfcnhfcGt0ICpwa3QsICp0bXA7CisKKwlzcGluX2xvY2tfYmgoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXFfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBrdCwgdG1wLCAmcFNjaGVkQ29udGV4dC0+Y2RzX29sX3J4X3BrdF9mcmVlcSwKKwkJCQkgbGlzdCkgeworCQlsaXN0X2RlbCgmcGt0LT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXFfbG9jayk7CisJCWNkZl9tZW1fZnJlZShwa3QpOworCQlzcGluX2xvY2tfYmgoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXFfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZwU2NoZWRDb250ZXh0LT5jZHNfb2xfcnhfcGt0X2ZyZWVxX2xvY2spOworfQorCisvKioKKyAqIGNkc19hbGxvY19vbF9yeF9wa3RfZnJlZXEoKSAtIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIGZyZWUgYnVmZmVyIHF1ZXVlCisgKiBAcFNjaGVkQ29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBDRFMgU2NoZWQgQ29udGV4dAorICoKKyAqIFRoaXMgQVBJIGFsbG9jYXRlcyBDRFNfTUFYX09MX1JYX1BLVCBudW1iZXIgb2YgY2RzIG1lc3NhZ2UgYnVmZmVycworICogd2hpY2ggYXJlIHVzZWQgZm9yIFJ4IGRhdGEgcHJvY2Vzc2luZy4KKyAqCisgKiBSZXR1cm46IHN0YXR1cyBvZiBtZW1vcnkgYWxsb2NhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBjZHNfYWxsb2Nfb2xfcnhfcGt0X2ZyZWVxKHBfY2RzX3NjaGVkX2NvbnRleHQgcFNjaGVkQ29udGV4dCkKK3sKKwlzdHJ1Y3QgY2RzX29sX3J4X3BrdCAqcGt0LCAqdG1wOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IENEU19NQVhfT0xfUlhfUEtUOyBpKyspIHsKKwkJcGt0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwa3QpKTsKKwkJaWYgKCFwa3QpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzIFZvcyBwYWNrZXQgYWxsb2NhdGlvbiBmb3Igb2wgcnggdGhyZWFkIGZhaWxlZCIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlnb3RvIGZyZWU7CisJCX0KKwkJbWVtc2V0KHBrdCwgMCwgc2l6ZW9mKCpwa3QpKTsKKwkJc3Bpbl9sb2NrX2JoKCZwU2NoZWRDb250ZXh0LT5jZHNfb2xfcnhfcGt0X2ZyZWVxX2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZwa3QtPmxpc3QsICZwU2NoZWRDb250ZXh0LT5jZHNfb2xfcnhfcGt0X2ZyZWVxKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXFfbG9jayk7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworZnJlZToKKwlzcGluX2xvY2tfYmgoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXFfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBrdCwgdG1wLCAmcFNjaGVkQ29udGV4dC0+Y2RzX29sX3J4X3BrdF9mcmVlcSwKKwkJCQkgbGlzdCkgeworCQlsaXN0X2RlbCgmcGt0LT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXFfbG9jayk7CisJCWNkZl9tZW1fZnJlZShwa3QpOworCQlzcGluX2xvY2tfYmgoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXFfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZwU2NoZWRDb250ZXh0LT5jZHNfb2xfcnhfcGt0X2ZyZWVxX2xvY2spOworCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07Cit9CisKKy8qKgorICogY2RzX2ZyZWVfb2xfcnhfcGt0KCkgLSBhcGkgdG8gcmVsZWFzZSBjZHMgbWVzc2FnZSB0byB0aGUgZnJlZXEKKyAqIFRoaXMgYXBpIHJldHVybnMgdGhlIGNkcyBtZXNzYWdlIHVzZWQgZm9yIFJ4IGRhdGEgdG8gdGhlIGZyZWUgcXVldWUKKyAqIEBwU2NoZWRDb250ZXh0OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgQ0RTIFNjaGVkIENvbnRleHQKKyAqIEBwa3Q6IENEUyBtZXNzYWdlIGJ1ZmZlciB0byBiZSByZXR1cm5lZCB0byBmcmVlIHF1ZXVlLgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkCitjZHNfZnJlZV9vbF9yeF9wa3QocF9jZHNfc2NoZWRfY29udGV4dCBwU2NoZWRDb250ZXh0LAorCQkgICAgc3RydWN0IGNkc19vbF9yeF9wa3QgKnBrdCkKK3sKKwltZW1zZXQocGt0LCAwLCBzaXplb2YoKnBrdCkpOworCXNwaW5fbG9ja19iaCgmcFNjaGVkQ29udGV4dC0+Y2RzX29sX3J4X3BrdF9mcmVlcV9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZwa3QtPmxpc3QsICZwU2NoZWRDb250ZXh0LT5jZHNfb2xfcnhfcGt0X2ZyZWVxKTsKKwlzcGluX3VubG9ja19iaCgmcFNjaGVkQ29udGV4dC0+Y2RzX29sX3J4X3BrdF9mcmVlcV9sb2NrKTsKK30KKworLyoqCisgKiBjZHNfYWxsb2Nfb2xfcnhfcGt0KCkgLSBBUEkgdG8gcmV0dXJuIG5leHQgYXZhaWxhYmxlIGNkcyBtZXNzYWdlCisgKiBAcFNjaGVkQ29udGV4dDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIENEUyBTY2hlZCBDb250ZXh0CisgKgorICogVGhpcyBhcGkgcmV0dXJucyBuZXh0IGF2YWlsYWJsZSBjZHMgbWVzc2FnZSBidWZmZXIgdXNlZCBmb3IgcnggZGF0YQorICogcHJvY2Vzc2luZworICoKKyAqIFJldHVybjogUG9pbnRlciB0byBjZHMgbWVzc2FnZSBidWZmZXIKKyAqLworc3RydWN0IGNkc19vbF9yeF9wa3QgKmNkc19hbGxvY19vbF9yeF9wa3QocF9jZHNfc2NoZWRfY29udGV4dCBwU2NoZWRDb250ZXh0KQoreworCXN0cnVjdCBjZHNfb2xfcnhfcGt0ICpwa3Q7CisKKwlzcGluX2xvY2tfYmgoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXFfbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXEpKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZwU2NoZWRDb250ZXh0LT5jZHNfb2xfcnhfcGt0X2ZyZWVxX2xvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcGt0ID0gbGlzdF9maXJzdF9lbnRyeSgmcFNjaGVkQ29udGV4dC0+Y2RzX29sX3J4X3BrdF9mcmVlcSwKKwkJCSAgICAgICBzdHJ1Y3QgY2RzX29sX3J4X3BrdCwgbGlzdCk7CisJbGlzdF9kZWwoJnBrdC0+bGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnBTY2hlZENvbnRleHQtPmNkc19vbF9yeF9wa3RfZnJlZXFfbG9jayk7CisJcmV0dXJuIHBrdDsKK30KKworLyoqCisgKiBjZHNfaW5kaWNhdGVfcnhwa3QoKSAtIGluZGljYXRlIHJ4IGRhdGEgcGFja2V0CisgKiBAQXJnOiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgQ0RTIFNjaGVkIENvbnRleHQKKyAqIEBwa3Q6IENEUyBkYXRhIG1lc3NhZ2UgYnVmZmVyCisgKgorICogVGhpcyBhcGkgZW5xdWV1ZXMgdGhlIHJ4IHBhY2tldCBpbnRvIG9sX3J4X3RocmVhZF9xdWV1ZSBhbmQgbm90aWZpZXMKKyAqIGNkc19vbF9yeF90aHJlYWQoKQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkCitjZHNfaW5kaWNhdGVfcnhwa3QocF9jZHNfc2NoZWRfY29udGV4dCBwU2NoZWRDb250ZXh0LAorCQkgICBzdHJ1Y3QgY2RzX29sX3J4X3BrdCAqcGt0KQoreworCXNwaW5fbG9ja19iaCgmcFNjaGVkQ29udGV4dC0+b2xfcnhfcXVldWVfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcGt0LT5saXN0LCAmcFNjaGVkQ29udGV4dC0+b2xfcnhfdGhyZWFkX3F1ZXVlKTsKKwlzcGluX3VubG9ja19iaCgmcFNjaGVkQ29udGV4dC0+b2xfcnhfcXVldWVfbG9jayk7CisJc2V0X2JpdChSWF9QT1NUX0VWRU5UX01BU0ssICZwU2NoZWRDb250ZXh0LT5vbF9yeF9ldmVudF9mbGFnKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBTY2hlZENvbnRleHQtPm9sX3J4X3dhaXRfcXVldWUpOworfQorCisvKioKKyAqIGNkc19kcm9wX3J4cGt0X2J5X3N0YWlkKCkgLSBhcGkgdG8gZHJvcCBwZW5kaW5nIHJ4IHBhY2tldHMgZm9yIGEgc3RhCisgKiBAcFNjaGVkQ29udGV4dDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIENEUyBTY2hlZCBDb250ZXh0CisgKiBAc3RhSWQ6IFN0YXRpb24gSWQKKyAqCisgKiBUaGlzIGFwaSBkcm9wcyBxdWV1ZWQgcGFja2V0cyBmb3IgYSBzdGF0aW9uLCB0byBkcm9wIGFsbCB0aGUgcGVuZGluZworICogcGFja2V0cyB0aGUgY2FsbGVyIGhhcyB0byBzZW5kIFdMQU5fTUFYX1NUQV9DT1VOVCBhcyBzdGFJZC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBjZHNfZHJvcF9yeHBrdF9ieV9zdGFpZChwX2Nkc19zY2hlZF9jb250ZXh0IHBTY2hlZENvbnRleHQsIHVpbnQxNl90IHN0YUlkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgbG9jYWxfbGlzdDsKKwlzdHJ1Y3QgY2RzX29sX3J4X3BrdCAqcGt0LCAqdG1wOworCWNkZl9uYnVmX3QgYnVmLCBuZXh0X2J1ZjsKKworCUlOSVRfTElTVF9IRUFEKCZsb2NhbF9saXN0KTsKKwlzcGluX2xvY2tfYmgoJnBTY2hlZENvbnRleHQtPm9sX3J4X3F1ZXVlX2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZwU2NoZWRDb250ZXh0LT5vbF9yeF90aHJlYWRfcXVldWUpKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZwU2NoZWRDb250ZXh0LT5vbF9yeF9xdWV1ZV9sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGt0LCB0bXAsICZwU2NoZWRDb250ZXh0LT5vbF9yeF90aHJlYWRfcXVldWUsCisJCQkJCQkJCWxpc3QpIHsKKwkJaWYgKHBrdC0+c3RhSWQgPT0gc3RhSWQgfHwgc3RhSWQgPT0gV0xBTl9NQVhfU1RBX0NPVU5UKQorCQkJbGlzdF9tb3ZlX3RhaWwoJnBrdC0+bGlzdCwgJmxvY2FsX2xpc3QpOworCX0KKwlzcGluX3VubG9ja19iaCgmcFNjaGVkQ29udGV4dC0+b2xfcnhfcXVldWVfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBrdCwgJmxvY2FsX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJnBrdC0+bGlzdCk7CisJCWJ1ZiA9IHBrdC0+Unhwa3Q7CisJCXdoaWxlIChidWYpIHsKKwkJCW5leHRfYnVmID0gY2RmX25idWZfcXVldWVfbmV4dChidWYpOworCQkJY2RmX25idWZfZnJlZShidWYpOworCQkJYnVmID0gbmV4dF9idWY7CisJCX0KKwkJY2RzX2ZyZWVfb2xfcnhfcGt0KHBTY2hlZENvbnRleHQsIHBrdCk7CisJfQorfQorCisvKioKKyAqIGNkc19yeF9mcm9tX3F1ZXVlKCkgLSBmdW5jdGlvbiB0byBwcm9jZXNzIHBlbmRpbmcgUnggcGFja2V0cworICogQHBTY2hlZENvbnRleHQ6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBDRFMgU2NoZWQgQ29udGV4dAorICoKKyAqIFRoaXMgYXBpIHRyYXZlcnNlcyB0aGUgcGVuZGluZyBidWZmZXIgbGlzdCBhbmQgY2FsbGluZyB0aGUgY2FsbGJhY2suCisgKiBUaGlzIGNhbGxiYWNrIHdvdWxkIGVzc2VudGlhbGx5IHNlbmQgdGhlIHBhY2tldCB0byBIREQuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIGNkc19yeF9mcm9tX3F1ZXVlKHBfY2RzX3NjaGVkX2NvbnRleHQgcFNjaGVkQ29udGV4dCkKK3sKKwlzdHJ1Y3QgY2RzX29sX3J4X3BrdCAqcGt0OworCXVpbnQxNl90IHN0YV9pZDsKKworCXNwaW5fbG9ja19iaCgmcFNjaGVkQ29udGV4dC0+b2xfcnhfcXVldWVfbG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwU2NoZWRDb250ZXh0LT5vbF9yeF90aHJlYWRfcXVldWUpKSB7CisJCXBrdCA9IGxpc3RfZmlyc3RfZW50cnkoJnBTY2hlZENvbnRleHQtPm9sX3J4X3RocmVhZF9xdWV1ZSwKKwkJCQkgICAgICAgc3RydWN0IGNkc19vbF9yeF9wa3QsIGxpc3QpOworCQlsaXN0X2RlbCgmcGt0LT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJnBTY2hlZENvbnRleHQtPm9sX3J4X3F1ZXVlX2xvY2spOworCQlzdGFfaWQgPSBwa3QtPnN0YUlkOworCQlwa3QtPmNhbGxiYWNrKHBrdC0+Y29udGV4dCwgcGt0LT5SeHBrdCwgc3RhX2lkKTsKKwkJY2RzX2ZyZWVfb2xfcnhfcGt0KHBTY2hlZENvbnRleHQsIHBrdCk7CisJCXNwaW5fbG9ja19iaCgmcFNjaGVkQ29udGV4dC0+b2xfcnhfcXVldWVfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZwU2NoZWRDb250ZXh0LT5vbF9yeF9xdWV1ZV9sb2NrKTsKK30KKworLyoqCisgKiBjZHNfb2xfcnhfdGhyZWFkKCkgLSBjZHMgbWFpbiB0bHNoaW0gcnggdGhyZWFkCisgKiBAQXJnOiBwb2ludGVyIHRvIHRoZSBnbG9iYWwgQ0RTIFNjaGVkIENvbnRleHQKKyAqCisgKiBUaGlzIGFwaSBpcyB0aGUgdGhyZWFkIGhhbmRsZXIgZm9yIFRsc2hpbSBEYXRhIHBhY2tldCBwcm9jZXNzaW5nLgorICoKKyAqIFJldHVybjogdGhyZWFkIGV4aXQgY29kZQorICovCitzdGF0aWMgaW50IGNkc19vbF9yeF90aHJlYWQodm9pZCAqYXJnKQoreworCXBfY2RzX3NjaGVkX2NvbnRleHQgcFNjaGVkQ29udGV4dCA9IChwX2Nkc19zY2hlZF9jb250ZXh0KSBhcmc7CisJdW5zaWduZWQgbG9uZyBwcmVmX2NwdSA9IDA7CisJYm9vbCBzaHV0ZG93biA9IGZhbHNlOworCWludCBzdGF0dXMsIGk7CisJdW5zaWduZWQgaW50IG51bV9jcHVzOworCisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMSk7CisjaWZkZWYgTVNNX1BMQVRGT1JNCisJc2V0X3dha2VfdXBfaWRsZSh0cnVlKTsKKyNlbmRpZgorCisJbnVtX2NwdXMgPSBudW1fcG9zc2libGVfY3B1cygpOworCS8qIEZpbmQgdGhlIGF2YWlsYWJsZSBjcHUgY29yZSBvdGhlciB0aGFuIGNwdSAwIGFuZAorCSAqIGJpbmQgdGhlIHRocmVhZAorCSAqLworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQlpZiAoaSA9PSAwKQorCQkJY29udGludWU7CisJCXByZWZfY3B1ID0gaTsKKwkJaWYgKG51bV9jcHVzIDw9IENEU19DT1JFX1BFUl9DTFVTVEVSKQorCQkJYnJlYWs7CisJfQorCWlmIChwcmVmX2NwdSAhPSAwICYmICghY2RzX3NldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIHByZWZfY3B1KSkpCisJCWFmZmluZV9jcHUgPSBwcmVmX2NwdTsKKworCWlmICghYXJnKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEJhZCBBcmdzIHBhc3NlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY29tcGxldGUoJnBTY2hlZENvbnRleHQtPm9sX3J4X3N0YXJ0X2V2ZW50KTsKKworCXdoaWxlICghc2h1dGRvd24pIHsKKwkJc3RhdHVzID0KKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwU2NoZWRDb250ZXh0LT5vbF9yeF93YWl0X3F1ZXVlLAorCQkJCQkJIHRlc3RfYml0KFJYX1BPU1RfRVZFTlRfTUFTSywKKwkJCQkJCQkgICZwU2NoZWRDb250ZXh0LT5vbF9yeF9ldmVudF9mbGFnKQorCQkJCQkJIHx8IHRlc3RfYml0KFJYX1NVU1BFTkRfRVZFTlRfTUFTSywKKwkJCQkJCQkgICAgICZwU2NoZWRDb250ZXh0LT5vbF9yeF9ldmVudF9mbGFnKSk7CisJCWlmIChzdGF0dXMgPT0gLUVSRVNUQVJUU1lTKQorCQkJYnJlYWs7CisKKwkJY2xlYXJfYml0KFJYX1BPU1RfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPm9sX3J4X2V2ZW50X2ZsYWcpOworCQl3aGlsZSAodHJ1ZSkgeworCQkJaWYgKHRlc3RfYml0KFJYX1NIVVRET1dOX0VWRU5UX01BU0ssCisJCQkJICAgICAmcFNjaGVkQ29udGV4dC0+b2xfcnhfZXZlbnRfZmxhZykpIHsKKwkJCQljbGVhcl9iaXQoUlhfU0hVVERPV05fRVZFTlRfTUFTSywKKwkJCQkJICAmcFNjaGVkQ29udGV4dC0+b2xfcnhfZXZlbnRfZmxhZyk7CisJCQkJaWYgKHRlc3RfYml0KFJYX1NVU1BFTkRfRVZFTlRfTUFTSywKKwkJCQkJICAgICAmcFNjaGVkQ29udGV4dC0+b2xfcnhfZXZlbnRfZmxhZykpIHsKKwkJCQkJY2xlYXJfYml0KFJYX1NVU1BFTkRfRVZFTlRfTUFTSywKKwkJCQkJCSAgJnBTY2hlZENvbnRleHQtPm9sX3J4X2V2ZW50X2ZsYWcpOworCQkJCQljb21wbGV0ZQorCQkJCQkJKCZwU2NoZWRDb250ZXh0LT5vbF9zdXNwZW5kX3J4X2V2ZW50KTsKKwkJCQl9CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICIlczogU2h1dHRpbmcgZG93biBPTCBSWCBUaHJlYWQiLAorCQkJCQkgIF9fZnVuY19fKTsKKwkJCQlzaHV0ZG93biA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQljZHNfcnhfZnJvbV9xdWV1ZShwU2NoZWRDb250ZXh0KTsKKworCQkJaWYgKHRlc3RfYml0KFJYX1NVU1BFTkRfRVZFTlRfTUFTSywKKwkJCQkgICAgICZwU2NoZWRDb250ZXh0LT5vbF9yeF9ldmVudF9mbGFnKSkgeworCQkJCWNsZWFyX2JpdChSWF9TVVNQRU5EX0VWRU5UX01BU0ssCisJCQkJCSAgJnBTY2hlZENvbnRleHQtPm9sX3J4X2V2ZW50X2ZsYWcpOworCQkJCXNwaW5fbG9jaygmcFNjaGVkQ29udGV4dC0+b2xfcnhfdGhyZWFkX2xvY2spOworCQkJCWNvbXBsZXRlKCZwU2NoZWRDb250ZXh0LT5vbF9zdXNwZW5kX3J4X2V2ZW50KTsKKwkJCQlJTklUX0NPTVBMRVRJT04KKwkJCQkJKHBTY2hlZENvbnRleHQtPm9sX3Jlc3VtZV9yeF9ldmVudCk7CisJCQkJc3Bpbl91bmxvY2soJnBTY2hlZENvbnRleHQtPm9sX3J4X3RocmVhZF9sb2NrKTsKKwkJCQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUKKwkJCQkJKCZwU2NoZWRDb250ZXh0LT5vbF9yZXN1bWVfcnhfZXZlbnQpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogRXhpdGluZyBDRFMgT0wgcnggdGhyZWFkIiwgX19mdW5jX18pOworCWNvbXBsZXRlX2FuZF9leGl0KCZwU2NoZWRDb250ZXh0LT5vbF9yeF9zaHV0ZG93biwgMCk7Cit9CisjZW5kaWYKKworLyoqCisgKiBjZHNfc2NoZWRfY2xvc2UoKSAtIGNsb3NlIHRoZSBjZHMgc2NoZWR1bGVyCisgKiBAcF9jZHNfY29udGV4dDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIENEUyBDb250ZXh0CisgKgorICogVGhpcyBhcGkgY2xvc2VzIHRoZSBDRFMgU2NoZWR1bGVyIHVwb24gc3VjY2Vzc2Z1bCBjbG9zaW5nOgorICoJLSBBbGwgdGhlIG1lc3NhZ2UgcXVldWVzIGFyZSBmbHVzaGVkCisgKgktIFRoZSBNYWluIENvbnRyb2xsZXIgdGhyZWFkIGlzIGNsb3NlZAorICoJLSBUaGUgVHggdGhyZWFkIGlzIGNsb3NlZAorICoKKyAqCisgKiBSZXR1cm46IGNkZiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZHNfc2NoZWRfY2xvc2Uodm9pZCAqcF9jZHNfY29udGV4dCkKK3sKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBpbnZva2VkIiwgX19mdW5jX18pOworCWlmIChncF9jZHNfc2NoZWRfY29udGV4dCA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGdwX2Nkc19zY2hlZF9jb250ZXh0ID09IE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyogc2h1dCBkb3duIE1DIFRocmVhZCAqLworCXNldF9iaXQoTUNfU0hVVERPV05fRVZFTlRfTUFTSywgJmdwX2Nkc19zY2hlZF9jb250ZXh0LT5tY0V2ZW50RmxhZyk7CisJc2V0X2JpdChNQ19QT1NUX0VWRU5UX01BU0ssICZncF9jZHNfc2NoZWRfY29udGV4dC0+bWNFdmVudEZsYWcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3BfY2RzX3NjaGVkX2NvbnRleHQtPm1jV2FpdFF1ZXVlKTsKKwkvKiBXYWl0IGZvciBNQyB0byBleGl0ICovCisJd2FpdF9mb3JfY29tcGxldGlvbigmZ3BfY2RzX3NjaGVkX2NvbnRleHQtPk1jU2h1dGRvd24pOworCWdwX2Nkc19zY2hlZF9jb250ZXh0LT5NY1RocmVhZCA9IDA7CisKKwkvKiBDbGVhbiB1cCBtZXNzYWdlIHF1ZXVlcyBvZiBNQyB0aHJlYWQgKi8KKwljZHNfc2NoZWRfZmx1c2hfbWNfbXFzKGdwX2Nkc19zY2hlZF9jb250ZXh0KTsKKworCS8qIERlaW5pdCBhbGwgdGhlIHF1ZXVlcyAqLworCWNkc19zY2hlZF9kZWluaXRfbXFzKGdwX2Nkc19zY2hlZF9jb250ZXh0KTsKKworI2lmZGVmIFFDQV9DT05GSUdfU01QCisJLyogU2h1dCBkb3duIFRsc2hpbSBSeCB0aHJlYWQgKi8KKwlzZXRfYml0KFJYX1NIVVRET1dOX0VWRU5UX01BU0ssICZncF9jZHNfc2NoZWRfY29udGV4dC0+b2xfcnhfZXZlbnRfZmxhZyk7CisJc2V0X2JpdChSWF9QT1NUX0VWRU5UX01BU0ssICZncF9jZHNfc2NoZWRfY29udGV4dC0+b2xfcnhfZXZlbnRfZmxhZyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZncF9jZHNfc2NoZWRfY29udGV4dC0+b2xfcnhfd2FpdF9xdWV1ZSk7CisJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlCisJCSgmZ3BfY2RzX3NjaGVkX2NvbnRleHQtPm9sX3J4X3NodXRkb3duKTsKKwlncF9jZHNfc2NoZWRfY29udGV4dC0+b2xfcnhfdGhyZWFkID0gTlVMTDsKKwljZHNfZHJvcF9yeHBrdF9ieV9zdGFpZChncF9jZHNfc2NoZWRfY29udGV4dCwgV0xBTl9NQVhfU1RBX0NPVU5UKTsKKwljZHNfZnJlZV9vbF9yeF9wa3RfZnJlZXEoZ3BfY2RzX3NjaGVkX2NvbnRleHQpOworCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZjZHNfY3B1X2hvdHBsdWdfbm90aWZpZXIpOworI2VuZGlmCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30gLyogY2RzX3NjaGVkX2Nsb3NlKCkgKi8KKworLyoqCisgKiBjZHNfc2NoZWRfaW5pdF9tcXMoKSAtIGluaXRpYWxpemUgdGhlIGNkcyBzY2hlZHVsZXIgbWVzc2FnZSBxdWV1ZXMKKyAqIEBwX2Nkc19zY2hlZF9jb250ZXh0OiBQb2ludGVyIHRvIHRoZSBTY2hlZHVsZXIgQ29udGV4dC4KKyAqCisgKiBUaGlzIGFwaSBpbml0aWFsaXplcyB0aGUgY2RzIHNjaGVkdWxlciBtZXNzYWdlIHF1ZXVlcy4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBjZHNfc2NoZWRfaW5pdF9tcXMocF9jZHNfc2NoZWRfY29udGV4dCBwU2NoZWRDb250ZXh0KQoreworCUNERl9TVEFUVVMgdlN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkvKiBOb3cgaW50aWFsaXplIGFsbCB0aGUgbWVzc2FnZSBxdWV1ZXMgKi8KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBJbml0aWFsaXppbmcgdGhlIFdNQSBNQyBNZXNzYWdlIHF1ZXVlIiwgX19mdW5jX18pOworCXZTdGF0dXMgPSBjZHNfbXFfaW5pdCgmcFNjaGVkQ29udGV4dC0+d21hTWNNcSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGluaXQgV01BIE1DIE1lc3NhZ2UgcXVldWUiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiB2U3RhdHVzOworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBJbml0aWFsaXppbmcgdGhlIFBFIE1DIE1lc3NhZ2UgcXVldWUiLCBfX2Z1bmNfXyk7CisJdlN0YXR1cyA9IGNkc19tcV9pbml0KCZwU2NoZWRDb250ZXh0LT5wZU1jTXEpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBpbml0IFBFIE1DIE1lc3NhZ2UgcXVldWUiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiB2U3RhdHVzOworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBJbml0aWFsaXppbmcgdGhlIFNNRSBNQyBNZXNzYWdlIHF1ZXVlIiwgX19mdW5jX18pOworCXZTdGF0dXMgPSBjZHNfbXFfaW5pdCgmcFNjaGVkQ29udGV4dC0+c21lTWNNcSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGluaXQgU01FIE1DIE1lc3NhZ2UgcXVldWUiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiB2U3RhdHVzOworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBJbml0aWFsaXppbmcgdGhlIFNZUyBNQyBNZXNzYWdlIHF1ZXVlIiwgX19mdW5jX18pOworCXZTdGF0dXMgPSBjZHNfbXFfaW5pdCgmcFNjaGVkQ29udGV4dC0+c3lzTWNNcSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGluaXQgU1lTIE1DIE1lc3NhZ2UgcXVldWUiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiB2U3RhdHVzOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIGNkc19zY2hlZF9pbml0X21xcygpICovCisKKy8qKgorICogY2RzX3NjaGVkX2RlaW5pdF9tcXMoKSAtIERlaW5pdGlhbGl6ZSB0aGUgY2RzIHNjaGVkdWxlciBtZXNzYWdlIHF1ZXVlcworICogQHBfY2RzX3NjaGVkX2NvbnRleHQ6IFBvaW50ZXIgdG8gdGhlIFNjaGVkdWxlciBDb250ZXh0LgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNkc19zY2hlZF9kZWluaXRfbXFzKHBfY2RzX3NjaGVkX2NvbnRleHQgcFNjaGVkQ29udGV4dCkKK3sKKwkvKiBOb3cgZGUtaW50aWFsaXplIGFsbCBtZXNzYWdlIHF1ZXVlcyAqLworCisJLyogTUMgV01BICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlcyBEZS1Jbml0aWFsaXppbmcgdGhlIFdNQSBNQyBNZXNzYWdlIHF1ZXVlIiwgX19mdW5jX18pOworCWNkc19tcV9kZWluaXQoJnBTY2hlZENvbnRleHQtPndtYU1jTXEpOworCS8qIE1DIFBFICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlcyBEZS1Jbml0aWFsaXppbmcgdGhlIFBFIE1DIE1lc3NhZ2UgcXVldWUiLCBfX2Z1bmNfXyk7CisJY2RzX21xX2RlaW5pdCgmcFNjaGVkQ29udGV4dC0+cGVNY01xKTsKKwkvKiBNQyBTTUUgKi8KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzIERlLUluaXRpYWxpemluZyB0aGUgU01FIE1DIE1lc3NhZ2UgcXVldWUiLCBfX2Z1bmNfXyk7CisJY2RzX21xX2RlaW5pdCgmcFNjaGVkQ29udGV4dC0+c21lTWNNcSk7CisJLyogTUMgU1lTICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlcyBEZS1Jbml0aWFsaXppbmcgdGhlIFNZUyBNQyBNZXNzYWdlIHF1ZXVlIiwgX19mdW5jX18pOworCWNkc19tcV9kZWluaXQoJnBTY2hlZENvbnRleHQtPnN5c01jTXEpOworCit9IC8qIGNkc19zY2hlZF9kZWluaXRfbXFzKCkgKi8KKworLyoqCisgKiBjZHNfc2NoZWRfZmx1c2hfbWNfbXFzKCkgLSBmbHVzaCBhbGwgdGhlIE1DIHRocmVhZCBtZXNzYWdlIHF1ZXVlcworICogQHBTY2hlZENvbnRleHQ6IFBvaW50ZXIgdG8gZ2xvYmFsIGNkcyBjb250ZXh0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RzX3NjaGVkX2ZsdXNoX21jX21xcyhwX2Nkc19zY2hlZF9jb250ZXh0IHBTY2hlZENvbnRleHQpCit7CisJcF9jZHNfbXNnX3dyYXBwZXIgcE1zZ1dyYXBwZXIgPSBOVUxMOworCXBfY2RzX2NvbnRleHRUeXBlIGNkc19jdHg7CisKKwkvKiBIZXJlIGVhY2ggb2YgdGhlIE1DIHRocmVhZCBNUSBzaGFsbCBiZSBkcmFpbmVkIGFuZCByZXR1cm5lZCB0byB0aGUKKwkgKiBDb3JlLiBCZWZvcmUgcmV0dXJuaW5nIGEgd3JhcHBlciB0byB0aGUgQ29yZSwgdGhlIENEUyBtZXNzYWdlIHNoYWxsCisJICogYmUgZnJlZWQgZmlyc3QKKwkgKi8KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgKCJGbHVzaGluZyB0aGUgTUMgVGhyZWFkIG1lc3NhZ2UgcXVldWUiKSk7CisKKwlpZiAoTlVMTCA9PSBwU2NoZWRDb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHBTY2hlZENvbnRleHQgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNkc19jdHggPSAocF9jZHNfY29udGV4dFR5cGUpIChwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQpOworCWlmIChOVUxMID09IGNkc19jdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogY2RzX2N0eCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyogRmx1c2ggdGhlIFNZUyBNcSAqLworCXdoaWxlIChOVUxMICE9IChwTXNnV3JhcHBlciA9IGNkc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnN5c01jTXEpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IEZyZWVpbmcgTUMgU1lTIG1lc3NhZ2UgdHlwZSAlZCAiLCBfX2Z1bmNfXywKKwkJCSAgcE1zZ1dyYXBwZXItPnBWb3NNc2ctPnR5cGUpOworCQljZHNfY29yZV9yZXR1cm5fbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXIpOworCX0KKwkvKiBGbHVzaCB0aGUgV01BIE1xICovCisJd2hpbGUgKE5VTEwgIT0gKHBNc2dXcmFwcGVyID0gY2RzX21xX2dldCgmcFNjaGVkQ29udGV4dC0+d21hTWNNcSkpKSB7CisJCWlmIChwTXNnV3JhcHBlci0+cFZvc01zZyAhPSBOVUxMKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiBGcmVlaW5nIE1DIFdNQSBNU0cgbWVzc2FnZSB0eXBlICVkIiwKKwkJCQkgIF9fZnVuY19fLCBwTXNnV3JhcHBlci0+cFZvc01zZy0+dHlwZSk7CisJCQlpZiAocE1zZ1dyYXBwZXItPnBWb3NNc2ctPmJvZHlwdHIpIHsKKwkJCQljZGZfbWVtX2ZyZWUoKHZvaWQgKilwTXNnV3JhcHBlci0+CisJCQkJCSAgICAgcFZvc01zZy0+Ym9keXB0cik7CisJCQl9CisKKwkJCXBNc2dXcmFwcGVyLT5wVm9zTXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJCXBNc2dXcmFwcGVyLT5wVm9zTXNnLT5ib2R5dmFsID0gMDsKKwkJCXBNc2dXcmFwcGVyLT5wVm9zTXNnLT50eXBlID0gMDsKKwkJfQorCQljZHNfY29yZV9yZXR1cm5fbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXIpOworCX0KKworCS8qIEZsdXNoIHRoZSBQRSBNcSAqLworCXdoaWxlIChOVUxMICE9IChwTXNnV3JhcHBlciA9IGNkc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnBlTWNNcSkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogRnJlZWluZyBNQyBQRSBNU0cgbWVzc2FnZSB0eXBlICVkIiwgX19mdW5jX18sCisJCQkgIHBNc2dXcmFwcGVyLT5wVm9zTXNnLT50eXBlKTsKKwkJcGVfZnJlZV9tc2coY2RzX2N0eC0+cE1BQ0NvbnRleHQsCisJCQkgICAgKHRTaXJNc2dRICopIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKwkJY2RzX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKwl9CisJLyogRmx1c2ggdGhlIFNNRSBNcSAqLworCXdoaWxlIChOVUxMICE9IChwTXNnV3JhcHBlciA9IGNkc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnNtZU1jTXEpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IEZyZWVpbmcgTUMgU01FIE1TRyBtZXNzYWdlIHR5cGUgJWQiLCBfX2Z1bmNfXywKKwkJCSAgcE1zZ1dyYXBwZXItPnBWb3NNc2ctPnR5cGUpOworCQlzbWVfZnJlZV9tc2coY2RzX2N0eC0+cE1BQ0NvbnRleHQsIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKwkJY2RzX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKwl9Cit9IC8qIGNkc19zY2hlZF9mbHVzaF9tY19tcXMoKSAqLworCisvKioKKyAqIGdldF9jZHNfc2NoZWRfY3R4dCgpIC0gZ2V0IGNkcyBzY2hlZHVsZXIgY29udGV4dAorICoKKyAqIFJldHVybjogbm9uZQorICovCitwX2Nkc19zY2hlZF9jb250ZXh0IGdldF9jZHNfc2NoZWRfY3R4dCh2b2lkKQoreworCS8qIE1ha2Ugc3VyZSB0aGF0IFZvcyBTY2hlZHVsZXIgY29udGV4dCBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworCWlmIChncF9jZHNfc2NoZWRfY29udGV4dCA9PSBOVUxMKQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBncF9jZHNfc2NoZWRfY29udGV4dCA9PSBOVUxMIiwgX19mdW5jX18pOworCisJcmV0dXJuIGdwX2Nkc19zY2hlZF9jb250ZXh0OworfQorCisvKioKKyAqIGNkc19zc3JfcHJvdGVjdF9pbml0KCkgLSBpbml0aWFsaXplIHNzciBwcm90ZWN0aW9uIGRlYnVnIGZ1bmN0aW9uYWxpdHkKKyAqCisgKiBSZXR1cm46CisgKiAgICAgICAgdm9pZAorICovCit2b2lkIGNkc19zc3JfcHJvdGVjdF9pbml0KHZvaWQpCit7CisJaW50IGkgPSAwOworCisJc3Bpbl9sb2NrX2luaXQoJnNzcl9wcm90ZWN0X2xvY2spOworCisJd2hpbGUgKGkgPCBNQVhfU1NSX1BST1RFQ1RfTE9HKSB7CisJCXNzcl9wcm90ZWN0X2xvZ1tpXS5mdW5jID0gTlVMTDsKKwkJc3NyX3Byb3RlY3RfbG9nW2ldLmZyZWUgPSB0cnVlOworCQlzc3JfcHJvdGVjdF9sb2dbaV0ucGlkID0gIDA7CisJCWkrKzsKKwl9Cit9CisKKy8qKgorICogY2RzX3ByaW50X2V4dGVybmFsX3RocmVhZHMoKSAtIHByaW50IGV4dGVybmFsIHRocmVhZHMgc3R1Y2sgaW4gZHJpdmVyCisgKgorICogUmV0dXJuOgorICogICAgICAgIHZvaWQKKyAqLworCitzdGF0aWMgdm9pZCBjZHNfcHJpbnRfZXh0ZXJuYWxfdGhyZWFkcyh2b2lkKQoreworCWludCBpID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3JfcHJvdGVjdF9sb2NrLCBpcnFfZmxhZ3MpOworCisJd2hpbGUgKGkgPCBNQVhfU1NSX1BST1RFQ1RfTE9HKSB7CisJCWlmICghc3NyX3Byb3RlY3RfbG9nW2ldLmZyZWUpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJIlBJRCAlZCBpcyBzdHVjayBhdCAlcyIsIHNzcl9wcm90ZWN0X2xvZ1tpXS5waWQsCisJCQlzc3JfcHJvdGVjdF9sb2dbaV0uZnVuYyk7CisJCX0KKwkJaSsrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzcl9wcm90ZWN0X2xvY2ssIGlycV9mbGFncyk7Cit9CisKKy8qKgorICogY2RzX3Nzcl9wcm90ZWN0KCkgLSBzdGFydCBzc3IgcHJvdGVjdGlvbgorICogQGNhbGxlcl9mdW5jOiBuYW1lIG9mIGNhbGxpbmcgZnVuY3Rpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8ga2VlcCB0cmFjayBvZiBhY3RpdmUgZHJpdmVyIGVudHJ5IHBvaW50cworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNkc19zc3JfcHJvdGVjdChjb25zdCBjaGFyICpjYWxsZXJfZnVuYykKK3sKKwlpbnQgY291bnQ7CisJaW50IGkgPSAwOworCWJvb2wgc3RhdHVzID0gZmFsc2U7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwljb3VudCA9IGF0b21pY19pbmNfcmV0dXJuKCZzc3JfcHJvdGVjdF9lbnRyeV9jb3VudCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3NyX3Byb3RlY3RfbG9jaywgaXJxX2ZsYWdzKTsKKworCXdoaWxlIChpIDwgTUFYX1NTUl9QUk9URUNUX0xPRykgeworCQlpZiAoc3NyX3Byb3RlY3RfbG9nW2ldLmZyZWUpIHsKKwkJCXNzcl9wcm90ZWN0X2xvZ1tpXS5mdW5jID0gY2FsbGVyX2Z1bmM7CisJCQlzc3JfcHJvdGVjdF9sb2dbaV0uZnJlZSA9IGZhbHNlOworCQkJc3NyX3Byb3RlY3RfbG9nW2ldLnBpZCA9IGN1cnJlbnQtPnBpZDsKKwkJCXN0YXR1cyA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3NyX3Byb3RlY3RfbG9jaywgaXJxX2ZsYWdzKTsKKworCWlmICghc3RhdHVzKQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJIkNvdWxkIG5vdCB0cmFjayBQSUQgJWQgY2FsbCAlczogbG9nIGlzIGZ1bGwiLAorCQljdXJyZW50LT5waWQsIGNhbGxlcl9mdW5jKTsKK30KKworLyoqCisgKiBjZHNfc3NyX3VucHJvdGVjdCgpIC0gc3RvcCBzc3IgcHJvdGVjdGlvbgorICogQGNhbGxlcl9mdW5jOiBuYW1lIG9mIGNhbGxpbmcgZnVuY3Rpb24uCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY2RzX3Nzcl91bnByb3RlY3QoY29uc3QgY2hhciAqY2FsbGVyX2Z1bmMpCit7CisJaW50IGNvdW50OworCWludCBpID0gMDsKKwlib29sIHN0YXR1cyA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJY291bnQgPSBhdG9taWNfZGVjX3JldHVybigmc3NyX3Byb3RlY3RfZW50cnlfY291bnQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzcl9wcm90ZWN0X2xvY2ssIGlycV9mbGFncyk7CisKKwl3aGlsZSAoaSA8IE1BWF9TU1JfUFJPVEVDVF9MT0cpIHsKKwkJaWYgKCFzc3JfcHJvdGVjdF9sb2dbaV0uZnJlZSkgeworCQkJaWYgKChzc3JfcHJvdGVjdF9sb2dbaV0ucGlkID09IGN1cnJlbnQtPnBpZCkgJiYKKwkJCSAgICAgIXN0cmNtcChzc3JfcHJvdGVjdF9sb2dbaV0uZnVuYywgY2FsbGVyX2Z1bmMpKSB7CisJCQkJc3NyX3Byb3RlY3RfbG9nW2ldLmZ1bmMgPSBOVUxMOworCQkJCXNzcl9wcm90ZWN0X2xvZ1tpXS5mcmVlID0gdHJ1ZTsKKwkJCQlzc3JfcHJvdGVjdF9sb2dbaV0ucGlkID0gIDA7CisJCQkJc3RhdHVzID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpKys7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3NyX3Byb3RlY3RfbG9jaywgaXJxX2ZsYWdzKTsKKworCWlmICghc3RhdHVzKQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJVbnRyYWNrZWQgY2FsbCAlcyIsIGNhbGxlcl9mdW5jKTsKK30KKworLyoqCisgKiBjZHNfaXNfc3NyX3JlYWR5KCkgLSBjaGVjayBpZiB0aGUgY2FsbGluZyBleGVjdXRpb24gY2FuIHByb2NlZWQgd2l0aCBzc3IKKyAqCisgKiBAY2FsbGVyX2Z1bmM6IG5hbWUgb2YgY2FsbGluZyBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm46IHRydWUgaWYgdGhlcmUgaXMgbm8gYWN0aXZlIGVudHJ5IHBvaW50cyBpbiBkcml2ZXIKKyAqCSAgIGZhbHNlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBhY3RpdmUgZW50cnkgaW4gZHJpdmVyCisgKi8KK2Jvb2wgY2RzX2lzX3Nzcl9yZWFkeShjb25zdCBjaGFyICpjYWxsZXJfZnVuYykKK3sKKwlpbnQgY291bnQgPSBNQVhfU1NSX1dBSVRfSVRFUkFUSU9OUzsKKworCXdoaWxlIChjb3VudCkgeworCisJCWlmICghYXRvbWljX3JlYWQoJnNzcl9wcm90ZWN0X2VudHJ5X2NvdW50KSkKKwkJCWJyZWFrOworCisJCWlmICgtLWNvdW50KSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogV2FpdGluZyBmb3IgYWN0aXZlIGVudHJ5IHBvaW50cyB0byBleGl0IiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCW1zbGVlcChTU1JfV0FJVF9TTEVFUF9USU1FKTsKKwkJfQorCX0KKwkvKiBhdCBsZWFzdCBvbmUgZXh0ZXJuYWwgdGhyZWFkIGlzIGV4ZWN1dGluZyAqLworCWlmICghY291bnQpIHsKKwkJY2RzX3ByaW50X2V4dGVybmFsX3RocmVhZHMoKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIkFsbG93aW5nIFNTUiBmb3IgJXMiLCBjYWxsZXJfZnVuYyk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvY2RzL3NyYy9jZHNfdXRpbHMuYyBiL2NvcmUvY2RzL3NyYy9jZHNfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDE4NmFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZHMvc3JjL2Nkc191dGlscy5jCkBAIC0wLDAgKzEsMTEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGSUxFOiAgICAgICAgIGNkc191dGlscy5jCisKKyAgIE9WRVJWSUVXOiAgICAgVGhpcyBzb3VyY2UgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgQ0RTIGNyeXB0byBBUElzCisgICAgICAgICAgICAgICAgVGhlIGZvdXIgQVBJcyBtZW50aW9uZWQgaW4gdGhpcyBmaWxlIGFyZSB1c2VkIGZvcgorICAgICAgICAgICAgICAgIGluaXRpYWxpemluZywgYW5kIGRlLWluaXRpYWxpemluZyBhIGNyeXB0byBjb250ZXh0LCBhbmQKKyAgICAgICAgICAgICAgICBvYnRhaW5pbmcgdHJ1bHkgcmFuZG9tIGRhdGEgKGZvciBrZXlzKSwgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgIFNIQTEgSE1BQywgYW5kIEFFUyBlbmNyeXB0IGFuZCBkZWNyeXB0IHJvdXRpbmVzLgorCisgICAgICAgICAgICAgICAgVGhlIHJvdXRpbmVzIGluY2x1ZGU6CisgICAgICAgICAgICAgICAgY2RzX2NyeXB0b19pbml0KCkgLSBJbml0aWFsaXplcyBDcnlwdG8gbW9kdWxlCisgICAgICAgICAgICAgICAgY2RzX2NyeXB0b19kZWluaXQoKSAtIERlLWluaXRpYWxpemVzIENyeXB0byBtb2R1bGUKKyAgICAgICAgICAgICAgICBjZHNfcmFuZF9nZXRfYnl0ZXMoKSAtIEdlbmVyYXRlcyByYW5kb20gYnl0ZQorICAgICAgICAgICAgICAgIGNkc19zaGExX2htYWNfc3RyKCkgLSBHZW5lcmF0ZSB0aGUgSE1BQy1TSEExIG9mIGEgc3RyaW5nIGdpdmVuIGEga2V5CisgICAgICAgICAgICAgICAgY2RzX2VuY3J5cHRfYWVzKCkgLSBHZW5lcmF0ZSBBRVMgRW5jcnlwdGVkIGJ5dGUgc3RyZWFtCisgICAgICAgICAgICAgICAgY2RzX2RlY3J5cHRfYWVzKCkgLSBEZWNyeXB0cyBhbiBBRVMgRW5jcnlwdGVkIGJ5dGUgc3RyZWFtCisKKyAgIERFUEVOREVOQ0lFUzoKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RzX3V0aWxzLmgiCisjaW5jbHVkZSAiY2RmX21lbW9yeS5oIgorI2luY2x1ZGUgImNkc19jcnlwdG8uaCIKKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPGNyeXB0by9oYXNoLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2Flcy5oPgorCisjaW5jbHVkZSAiY2RzX2llZWU4MDIxMV9jb21tb24uaCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBBQURfTEVOIDIwCisjZGVmaW5lIElWX1NJWkVfQUVTXzEyOCAxNgorI2RlZmluZSBDTUFDX0lQTl9MRU4gNgorI2RlZmluZSBDTUFDX1RMRU4gOCAgICAgICAgICAgICAvKiBDTUFDIFRMZW4gPSA2NCBiaXRzICg4IG9jdGV0cykgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdsb2JhbCBEYXRhIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIFZhcmlhYmxlIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBGdW5jdGlvbiBEZWZpbml0aW9ucyBhbmQgRG9jdW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQ09ORklHX0lDTlNTCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworc3RhdGljIGlubGluZSB2b2lkIHhvcl8xMjgoY29uc3QgdTggKmEsIGNvbnN0IHU4ICpiLCB1OCAqb3V0KQoreworCXU4IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUVTX0JMT0NLX1NJWkU7IGkrKykKKwkJb3V0W2ldID0gYVtpXSBeIGJbaV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsZWZ0c2hpZnRfb25lYml0KGNvbnN0IHU4ICppbnB1dCwgdTggKm91dHB1dCkKK3sKKwlpbnQgaSwgb3ZlcmZsb3cgPSAwOworCisJZm9yIChpID0gKEFFU19CTE9DS19TSVpFIC0gMSk7IGkgPj0gMDsgaS0tKSB7CisJCW91dHB1dFtpXSA9IGlucHV0W2ldIDw8IDE7CisJCW91dHB1dFtpXSB8PSBvdmVyZmxvdzsKKwkJb3ZlcmZsb3cgPSAoaW5wdXRbaV0gJiAweDgwKSA/IDEgOiAwOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX3N1YmtleShzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLCB1OCAqazEsIHU4ICprMikKK3sKKwl1OCBsW0FFU19CTE9DS19TSVpFXSwgdG1wW0FFU19CTE9DS19TSVpFXTsKKwl1OCBjb25zdF9yYltBRVNfQkxPQ0tfU0laRV0gPSB7CisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcKKwl9OworCXU4IGNvbnN0X3plcm9bQUVTX0JMT0NLX1NJWkVdID0geworCQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisJfTsKKworCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBsLCBjb25zdF96ZXJvKTsKKworCWlmICgobFswXSAmIDB4ODApID09IDApIHsgICAgICAgLyogSWYgTVNCKGwpID0gMCwgdGhlbiBrMSA9IGwgPDwgMSAqLworCQlsZWZ0c2hpZnRfb25lYml0KGwsIGsxKTsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBFbHNlIGsxID0gKCBsIDw8IDEgKSAoKykgUmIgKi8KKwkJbGVmdHNoaWZ0X29uZWJpdChsLCB0bXApOworCQl4b3JfMTI4KHRtcCwgY29uc3RfcmIsIGsxKTsKKwl9CisKKwlpZiAoKGsxWzBdICYgMHg4MCkgPT0gMCkgeworCQlsZWZ0c2hpZnRfb25lYml0KGsxLCBrMik7CisJfSBlbHNlIHsKKwkJbGVmdHNoaWZ0X29uZWJpdChrMSwgdG1wKTsKKwkJeG9yXzEyOCh0bXAsIGNvbnN0X3JiLCBrMik7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGFkZGluZyh1OCAqbGFzdGIsIHU4ICpwYWQsIHUxNiBsZW5ndGgpCit7CisJdTggajsKKworCS8qIG9yaWdpbmFsIGxhc3QgYmxvY2sgKi8KKwlmb3IgKGogPSAwOyBqIDwgQUVTX0JMT0NLX1NJWkU7IGorKykgeworCQlpZiAoaiA8IGxlbmd0aCkKKwkJCXBhZFtqXSA9IGxhc3RiW2pdOworCQllbHNlIGlmIChqID09IGxlbmd0aCkKKwkJCXBhZFtqXSA9IDB4ODA7CisJCWVsc2UKKwkJCXBhZFtqXSA9IDB4MDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBjZHNfY21hY19jYWxjX21pYyhzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLAorCQl1OCAqbSwgdTE2IGxlbmd0aCwgdTggKm1hYykKK3sKKwl1OCB4W0FFU19CTE9DS19TSVpFXSwgeVtBRVNfQkxPQ0tfU0laRV07CisJdTggbV9sYXN0W0FFU19CTE9DS19TSVpFXSwgcGFkZGVkW0FFU19CTE9DS19TSVpFXTsKKwl1OCBrMVtBRVNfS0VZU0laRV8xMjhdLCBrMltBRVNfS0VZU0laRV8xMjhdOworCWludCBjbXBCbGs7CisJaW50IGksIG5CbG9ja3MgPSAobGVuZ3RoICsgMTUpIC8gQUVTX0JMT0NLX1NJWkU7CisKKwlnZW5lcmF0ZV9zdWJrZXkodGZtLCBrMSwgazIpOworCisJaWYgKG5CbG9ja3MgPT0gMCkgeworCQluQmxvY2tzID0gMTsKKwkJY21wQmxrID0gMDsKKwl9IGVsc2UgeworCQljbXBCbGsgPSAoKGxlbmd0aCAlIEFFU19CTE9DS19TSVpFKSA9PSAwKSA/IDEgOiAwOworCX0KKworCWlmIChjbXBCbGspIHsgICAgICAgICAgIC8qIExhc3QgYmxvY2sgaXMgY29tcGxldGUgYmxvY2sgKi8KKwkJeG9yXzEyOCgmbVtBRVNfQkxPQ0tfU0laRSAqIChuQmxvY2tzIC0gMSldLCBrMSwgbV9sYXN0KTsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBMYXN0IGJsb2NrIGlzIG5vdCBjb21wbGV0ZSBibG9jayAqLworCQlwYWRkaW5nKCZtW0FFU19CTE9DS19TSVpFICogKG5CbG9ja3MgLSAxKV0sIHBhZGRlZCwKKwkJCWxlbmd0aCAlIEFFU19CTE9DS19TSVpFKTsKKwkJeG9yXzEyOChwYWRkZWQsIGsyLCBtX2xhc3QpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBRVNfQkxPQ0tfU0laRTsgaSsrKQorCQl4W2ldID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAobkJsb2NrcyAtIDEpOyBpKyspIHsKKwkJeG9yXzEyOCh4LCAmbVtBRVNfQkxPQ0tfU0laRSAqIGldLCB5KTsgIC8qIHkgPSBNaSAoKykgeCAqLworCQljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKHRmbSwgeCwgeSk7ICAgLyogeCA9IEFFUy0xMjgoS0VZLCB5KSAqLworCX0KKworCXhvcl8xMjgoeCwgbV9sYXN0LCB5KTsKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKHRmbSwgeCwgeSk7CisKKwltZW1jcHkobWFjLCB4LCBDTUFDX1RMRU4pOworfQorI2VuZGlmCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgY2RzX2NyeXB0b19pbml0KCkgLSBJbml0aWFsaXplcyBDcnlwdG8gbW9kdWxlCisKKyAgIFRoZSBjZHNfY3J5cHRvX2luaXQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyBDcnlwdG8gbW9kdWxlLgorCisgICBccGFyYW0gcGhDcnlwdFByb3YgLSBwb2ludGVyIHRvIHRoZSBDcnlwdCBoYW5kbGUKKworICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIHJhbmRvbSBtZW1vcnkuCisKKyAgICAgICAgICBDREZfU1RBVFVTX0VfRkFVTFQgIC0gcGJCdWYgaXMgYW4gaW52YWxpZCBwb2ludGVyLgorCisgICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgLSBkZWZhdWx0IHJldHVybiB2YWx1ZSBpZiBpdCBmYWlscyBkdWUgdG8KKyAgICAgICAgICB1bmtub3duIHJlYXNvbnMKKworICAqKipDREZfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpCisgICAgICAgICAgYXJlIHVuYXZhaWxhYmxlCisgICBcc2EKKworICAgICggKioqIHJldHVybiB2YWx1ZSBub3QgY29uc2lkZXJlZCB5ZXQgKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjZHNfY3J5cHRvX2luaXQodWludDMyX3QgKnBoQ3J5cHRQcm92KQoreworCUNERl9TVEFUVVMgdVJlc3VsdCA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHJlcXVpcmUgYSBjcnlwdG8gY29udGV4dCAqLworCSpwaENyeXB0UHJvdiA9IDA7CisJdVJlc3VsdCA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gKHVSZXN1bHQpOworfQorCitDREZfU1RBVFVTIGNkc19jcnlwdG9fZGVpbml0KHVpbnQzMl90IGhDcnlwdFByb3YpCit7CisJQ0RGX1NUQVRVUyB1UmVzdWx0ID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkvKiBDcnlwdFJlbGVhc2VDb250ZXh0IHN1Y2NlZWRlZCAqLworCXVSZXN1bHQgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlyZXR1cm4gKHVSZXN1bHQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBjZHNfcmFuZF9nZXRfYnl0ZXMoKSAtIEdlbmVyYXRlcyByYW5kb20gYnl0ZQorCisgICBUaGUgY2RzX3JhbmRfZ2V0X2J5dGVzKCkgZnVuY3Rpb24gZ2VuZXJhdGUgcmFuZG9tIGJ5dGVzLgorCisgICBCdWZmZXIgc2hvdWxkIGJlIGFsbG9jYXRlZCBiZWZvcmUgY2FsbGluZyBjZHNfcmFuZF9nZXRfYnl0ZXMoKS4KKworICAgQXR0ZW1wdGluZyB0byBpbml0aWFsaXplIGFuIGFscmVhZHkgaW5pdGlhbGl6ZWQgbG9jayByZXN1bHRzIGluCisgICBhIGZhaWx1cmUuCisKKyAgIFxwYXJhbSBsb2NrIC0gcG9pbnRlciB0byB0aGUgb3BhcXVlIGxvY2sgb2JqZWN0IHRvIGluaXRpYWxpemUKKworICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIHJhbmRvbSBtZW1vcnkuCisKKyAgICAgICAgICBDREZfU1RBVFVTX0VfRkFVTFQgIC0gcGJCdWYgaXMgYW4gaW52YWxpZCBwb2ludGVyLgorCisgICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgLSBkZWZhdWx0IHJldHVybiB2YWx1ZSBpZiBpdCBmYWlscyBkdWUgdG8KKyAgICAgICAgICB1bmtub3duIHJlYXNvbnMKKworICAqKipDREZfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpCisgICAgICAgICAgYXJlIHVuYXZhaWxhYmxlCisgICBcc2EKKworICAgICggKioqIHJldHVybiB2YWx1ZSBub3QgY29uc2lkZXJlZCB5ZXQgKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUworY2RzX3JhbmRfZ2V0X2J5dGVzKHVpbnQzMl90IGNyeXB0SGFuZGxlLCB1aW50OF90ICpwYkJ1ZiwgdWludDMyX3QgbnVtQnl0ZXMpCit7CisJQ0RGX1NUQVRVUyB1UmVzdWx0ID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkvKiBjaGVjayBmb3IgaW52YWxpZCBwb2ludGVyICovCisJaWYgKE5VTEwgPT0gcGJCdWYpIHsKKwkJdVJlc3VsdCA9IENERl9TVEFUVVNfRV9GQVVMVDsKKwkJcmV0dXJuICh1UmVzdWx0KTsKKwl9CisKKwlnZXRfcmFuZG9tX2J5dGVzKHBiQnVmLCBudW1CeXRlcyk7CisJLyogIlJhbmRvbSBzZXF1ZW5jZSBnZW5lcmF0ZWQuIiAqLworCXVSZXN1bHQgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuICh1UmVzdWx0KTsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKK3VpbnQ4X3QgY2RzX2dldF9tbWllX3NpemUoKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9tbWllKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgY2RzX2luY3JlYXNlX3NlcSgpIC0gSW5jcmVhc2UgdGhlIElQTiBha2EgU2VxdWVuY2UgbnVtYmVyIGJ5IG9uZSB1bml0CisKKyAgIFRoZSBjZHNfaW5jcmVhc2Vfc2VxKCkgZnVuY3Rpb24gaW5jcmVhc2VzIHRoZSBJUE4gYnkgb25lIHVuaXQuCisKKyAgIFxwYXJhbSBpcG4gLSBwb2ludGVyIHRvIHRoZSBJUE4gYWthIFNlcXVlbmNlIG51bWJlciBbNiBieXRlc10KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgY2RzX2luY3JlYXNlX3NlcSh1aW50OF90ICppcG4pCit7CisJdWludDY0X3QgdmFsdWUgPSAwOworCWlmIChpcG4pIHsKKwkJdmFsdWUgPSAoMHhmZmZmZmZmZmZmZmYpICYgKCooKHVpbnQ2NF90ICopIGlwbikpOworCQl2YWx1ZSA9IHZhbHVlICsgMTsKKwkJY2RmX21lbV9jb3B5KGlwbiwgJnZhbHVlLCBJRUVFODAyMTFfTU1JRV9JUE5MRU4pOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgY2RzX2F0dGFjaF9tbWllKCkgLSBhdHRjaGVzIHRoZSBjb21wbGV0ZSBNTUlFIGF0IHRoZSBlbmQgb2YgZnJhbWUKKworICAgVGhlIGNkc19hdHRhY2hfbW1pZSgpIGNhbGN1bGF0ZXMgdGhlIGVudGlyZSBNTUlFIGFuZCBhdHRhY2hlcyBhdCB0aGUgZW5kCisgICBvZiBCcm9hZGNhc3QvTXVsdGljYXN0IHJvYnVzdCBtYW5hZ2VtZW50IGZyYW1lcy4KKworICAgXHBhcmFtIGlndGsgLSBwb2ludGVyICBncm91cCBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZQorICAgICAgICAgICAgICAgIHRoZSA4IGJ5dGUgTUlDLgorICAgXHBhcmFtIGlwbiAtIHBvaW50ZXIgaXBuLCBpdCBpcyBhbHNvIGtub3duIGFzIHNlcXVlbmNlIG51bWJlcgorICAgXHBhcmFtIGtleV9pZCAtIGtleSBpZGVudGljYXRpb24gbnVtYmVyCisgICBccGFyYW0gZnJtIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lLgorICAgXHBhcmFtIGVmcm0gLSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGZyYW1lLgorICAgXHBhcmFtIGZybUxlbiAtIHNpemUgb2YgdGhlIGVudGlyZSBmcmFtZS4KKworICAgXHJldHVybiAtIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbgorICAgICAgICAgICAgZmFpbHVyZS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitib29sCitjZHNfYXR0YWNoX21taWUodWludDhfdCAqaWd0aywgdWludDhfdCAqaXBuLCB1aW50MTZfdCBrZXlfaWQsCisJCXVpbnQ4X3QgKmZybSwgdWludDhfdCAqZWZybSwgdWludDE2X3QgZnJtTGVuKQoreworCXN0cnVjdCBpZWVlODAyMTFfbW1pZSAqbW1pZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aDsKKwl1aW50OF90IGFhZFtBQURfTEVOXSwgbWljW0NNQUNfVExFTl0sICppbnB1dCA9IE5VTEw7CisJdWludDhfdCBwcmV2aW91c19pcG5bSUVFRTgwMjExX01NSUVfSVBOTEVOXSA9IHsgMCB9OworCXVpbnQxNl90IG5CeXRlcyA9IDA7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbTsKKworCS8qICBUaGlzIGlzIGhvdyByZWNlaXZlZCBmcmFtZSBsb29rIGxpa2UKKwkgKgorCSAqICAgICAgICA8LS0tLS0tLS0tLS0tZnJtTGVuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KKwkgKgorCSAqICAgICAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKKwkgKiAgICAgICAgfCA4MDIuMTEgSEVBREVSIHwgTWFuYWdlbWVudCBmcmFtZWJvZHkgfCBNTUlFICB8CisJICogICAgICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnJtCisJICogICBUaGlzIGlzIGhvdyBNTUlFIGZyb20gYWJvdmUgZnJhbWUgbG9vayBsaWtlCisJICoKKwkgKgorCSAqICAgICAgICA8LS0tLS0tLS0tLS0tIDE4IEJ5dGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisJICogICAgICAgICstLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKKwkgKiAgICAgICAgfEVsZW1lbnQgfCBMZW5ndGggIHwgS2V5IGlkICB8ICAgSVBOICAgICB8ICBNSUMgICAgfAorCSAqICAgICAgICB8ICBpZCAgICB8ICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8CisJICogICAgICAgICstLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKKwkgKiBPY3RldCAgICAgMSAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgNiAgICAgICAgICAgIDgKKwkgKgorCSAqLworCisJLyogQ2hlY2sgaWYgZnJhbWUgaXMgaW52YWxpZCBsZW5ndGggKi8KKwlpZiAoKChlZnJtIC0gZnJtKSAhPSBmcm1MZW4pIHx8IChmcm1MZW4gPCBzaXplb2YoKndoKSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBmcmFtZSBsZW5ndGgiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJbW1pZSA9IChzdHJ1Y3QgaWVlZTgwMjExX21taWUgKikoZWZybSAtIHNpemVvZigqbW1pZSkpOworCisJLyogQ29weSBFbGVtZW50IGlkICovCisJbW1pZS0+ZWxlbWVudF9pZCA9IElFRUU4MDIxMV9FTEVNSURfTU1JRTsKKworCS8qIENvcHkgTGVuZ3RoICovCisJbW1pZS0+bGVuZ3RoID0gc2l6ZW9mKCptbWllKSAtIDI7CisKKwkvKiBDb3B5IEtleSBpZCAqLworCW1taWUtPmtleV9pZCA9IGtleV9pZDsKKworCS8qCisJICogSW4gY2FzZSBvZiBlcnJvciwgcmV2ZXJ0IGJhY2sgdG8gb3JpZ2luYWwgSVBOCisJICogdG8gZG8gdGhhdCBjb3B5IHRoZSBvcmlnaW5hbCBJUE4gaW50byBwcmV2aW91c19pcG4KKwkgKi8KKwljZGZfbWVtX2NvcHkoJnByZXZpb3VzX2lwblswXSwgaXBuLCBJRUVFODAyMTFfTU1JRV9JUE5MRU4pOworCWNkc19pbmNyZWFzZV9zZXEoaXBuKTsKKwljZGZfbWVtX2NvcHkobW1pZS0+c2VxdWVuY2VfbnVtYmVyLCBpcG4sIElFRUU4MDIxMV9NTUlFX0lQTkxFTik7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBNSUMgYW5kIHRoZW4gY29weQorCSAqLworCXRmbSA9IGNkc19jcnlwdG9fYWxsb2NfY2lwaGVyKCJhZXMiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHRmbSkpIHsKKwkJcmV0ID0gUFRSX0VSUih0Zm0pOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBjcnlwdG9fYWxsb2NfY2lwaGVyIGZhaWxlZCAoJWQpIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX3RmbTsKKwl9CisKKwlyZXQgPSBjcnlwdG9fY2lwaGVyX3NldGtleSh0Zm0sIGlndGssIEFFU19LRVlTSVpFXzEyOCk7CisJaWYgKHJldCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBjcnlwdG9fY2lwaGVyX3NldGtleSBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLAorCQkJICByZXQpOworCQlnb3RvIGVycl90Zm07CisJfQorCisJLyogQ29uc3RydWN0IEFBRCAqLworCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKilmcm07CisKKwkvKiBHZW5lcmF0ZSBCSVAgQUFEOiBGQyhtYXNrZWQpIHx8IEExIHx8IEEyIHx8IEEzICovCisKKwkvKiBGQyB0eXBlL3N1YnR5cGUgKi8KKwlhYWRbMF0gPSB3aC0+aV9mY1swXTsKKwkvKiBNYXNrIEZDIFJldHJ5LCBQd3JNZ3QsIE1vcmVEYXRhIGZsYWdzIHRvIHplcm8gKi8KKwlhYWRbMV0gPSB3aC0+aV9mY1sxXSAmIH4oSUVFRTgwMjExX0ZDMV9SRVRSWSB8IElFRUU4MDIxMV9GQzFfUFdSX01HVCB8CisJCQkJIElFRUU4MDIxMV9GQzFfTU9SRV9EQVRBKTsKKwkvKiBBMSB8fCBBMiB8fCBBMyAqLworCWNkZl9tZW1fY29weShhYWQgKyAyLCB3aC0+aV9hZGRyX2FsbCwgMyAqIElFRUU4MDIxMV9BRERSX0xFTik7CisKKwkvKiBNSUMgPSBBRVMtMTI4LUNNQUMoSUdUSywgQUFEIHx8IE1hbmFnZW1lbnQgRnJhbWUgQm9keSB8fCBNTUlFLCA2NCkgKi8KKwluQnl0ZXMgPSBBQURfTEVOICsgKGZybUxlbiAtIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lKSk7CisJaW5wdXQgPSAodWludDhfdCAqKSBjZGZfbWVtX21hbGxvYyhuQnl0ZXMpOworCWlmIChOVUxMID09IGlucHV0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQlnb3RvIGVycl90Zm07CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSBBQUQsIE1hbmFnZW1lbnQgZnJhbWUgYm9keSwgYW5kCisJICogTU1JRSB3aXRoIDggYml0IE1JQyB6ZXJvZWQgb3V0CisJICovCisJY2RmX21lbV96ZXJvKGlucHV0LCBuQnl0ZXMpOworCWNkZl9tZW1fY29weShpbnB1dCwgYWFkLCBBQURfTEVOKTsKKwkvKiBDb3B5IE1hbmFnZW1lbnQgRnJhbWUgQm9keSBhbmQgTU1JRSB3aXRob3V0IE1JQyAqLworCWNkZl9tZW1fY29weShpbnB1dCArIEFBRF9MRU4sCisJCSAgICAgKHVpbnQ4X3QgKikgKGVmcm0gLQorCQkJCSAgKGZybUxlbiAtIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lKSkpLAorCQkgICAgIG5CeXRlcyAtIEFBRF9MRU4gLSBDTUFDX1RMRU4pOworCisJY2RzX2NtYWNfY2FsY19taWModGZtLCBpbnB1dCwgbkJ5dGVzLCBtaWMpOworCWNkZl9tZW1fZnJlZShpbnB1dCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIkNNQUMoVCk9ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCIsCisJCSAgbWljWzBdLCBtaWNbMV0sIG1pY1syXSwgbWljWzNdLAorCQkgIG1pY1s0XSwgbWljWzVdLCBtaWNbNl0sIG1pY1s3XSk7CisJY2RmX21lbV9jb3B5KG1taWUtPm1pYywgbWljLCBJRUVFODAyMTFfTU1JRV9NSUNMRU4pOworCitlcnJfdGZtOgorCWlmIChyZXQpIHsKKwkJY2RmX21lbV9jb3B5KGlwbiwgcHJldmlvdXNfaXBuLCBJRUVFODAyMTFfTU1JRV9JUE5MRU4pOworCX0KKworCWlmICh0Zm0pCisJCWNkc19jcnlwdG9fZnJlZV9jaXBoZXIodGZtKTsKKwlyZXR1cm4gIXJldCA/IHRydWUgOiBmYWxzZTsKK30KKworYm9vbAorY2RzX2lzX21taWVfdmFsaWQodWludDhfdCAqaWd0aywgdWludDhfdCAqaXBuLCB1aW50OF90ICpmcm0sIHVpbnQ4X3QgKmVmcm0pCit7CisJc3RydWN0IGllZWU4MDIxMV9tbWllICptbWllOworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoOworCXVpbnQ4X3QgKnJ4X2lwbiwgYWFkW0FBRF9MRU5dLCBtaWNbQ01BQ19UTEVOXSwgKmlucHV0OworCXVpbnQxNl90IG5CeXRlcyA9IDA7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbTsKKworCS8qIENoZWNrIGlmIGZyYW1lIGlzIGludmFsaWQgbGVuZ3RoICovCisJaWYgKChlZnJtIDwgZnJtKSB8fCAoKGVmcm0gLSBmcm0pIDwgc2l6ZW9mKCp3aCkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW52YWxpZCBmcmFtZSBsZW5ndGgiKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCW1taWUgPSAoc3RydWN0IGllZWU4MDIxMV9tbWllICopKGVmcm0gLSBzaXplb2YoKm1taWUpKTsKKworCS8qIENoZWNrIEVsZW1lbnQgSUQgKi8KKwlpZiAoKG1taWUtPmVsZW1lbnRfaWQgIT0gSUVFRTgwMjExX0VMRU1JRF9NTUlFKSB8fAorCSAgICAobW1pZS0+bGVuZ3RoICE9IChzaXplb2YoKm1taWUpIC0gMikpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSUUgaXMgbm90IE1nbXQgTUlDIElFIG9yIEludmFsaWQgbGVuZ3RoIik7CisJCS8qIElFIGlzIG5vdCBNZ210IE1JQyBJRSBvciBpbnZhbGlkIGxlbmd0aCAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogVmFsaWRhdGUgSVBOICovCisJcnhfaXBuID0gbW1pZS0+c2VxdWVuY2VfbnVtYmVyOworCWlmIChPU19NRU1DTVAocnhfaXBuLCBpcG4sIENNQUNfSVBOX0xFTikgPD0gMCkgeworCQkvKiBSZXBsYXkgZXJyb3IgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJSZXBsYXkgZXJyb3IgbW1pZSBpcG4gJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlgiCisJCQkgICIgZHJ2ciBpcG4gJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlgiLAorCQkJICByeF9pcG5bMF0sIHJ4X2lwblsxXSwgcnhfaXBuWzJdLCByeF9pcG5bM10sIHJ4X2lwbls0XSwKKwkJCSAgcnhfaXBuWzVdLCBpcG5bMF0sIGlwblsxXSwgaXBuWzJdLCBpcG5bM10sIGlwbls0XSwKKwkJCSAgaXBuWzVdKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl0Zm0gPSBjZHNfY3J5cHRvX2FsbG9jX2NpcGhlcigiYWVzIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCXJldCA9IFBUUl9FUlIodGZtKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJjcnlwdG9fYWxsb2NfY2lwaGVyIGZhaWxlZCAoJWQpIiwgcmV0KTsKKwkJZ290byBlcnJfdGZtOworCX0KKworCXJldCA9IGNyeXB0b19jaXBoZXJfc2V0a2V5KHRmbSwgaWd0aywgQUVTX0tFWVNJWkVfMTI4KTsKKwlpZiAocmV0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiY3J5cHRvX2NpcGhlcl9zZXRrZXkgZmFpbGVkICglZCkiLCByZXQpOworCQlnb3RvIGVycl90Zm07CisJfQorCisJLyogQ29uc3RydWN0IEFBRCAqLworCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKilmcm07CisKKwkvKiBHZW5lcmF0ZSBCSVAgQUFEOiBGQyhtYXNrZWQpIHx8IEExIHx8IEEyIHx8IEEzICovCisKKwkvKiBGQyB0eXBlL3N1YnR5cGUgKi8KKwlhYWRbMF0gPSB3aC0+aV9mY1swXTsKKwkvKiBNYXNrIEZDIFJldHJ5LCBQd3JNZ3QsIE1vcmVEYXRhIGZsYWdzIHRvIHplcm8gKi8KKwlhYWRbMV0gPSB3aC0+aV9mY1sxXSAmIH4oSUVFRTgwMjExX0ZDMV9SRVRSWSB8IElFRUU4MDIxMV9GQzFfUFdSX01HVCB8CisJCQkJIElFRUU4MDIxMV9GQzFfTU9SRV9EQVRBKTsKKwkvKiBBMSB8fCBBMiB8fCBBMyAqLworCWNkZl9tZW1fY29weShhYWQgKyAyLCB3aC0+aV9hZGRyX2FsbCwgMyAqIElFRUU4MDIxMV9BRERSX0xFTik7CisKKwkvKiBNSUMgPSBBRVMtMTI4LUNNQUMoSUdUSywgQUFEIHx8IE1hbmFnZW1lbnQgRnJhbWUgQm9keSB8fCBNTUlFLCA2NCkgKi8KKwluQnl0ZXMgPSBBQURfTEVOICsgKGVmcm0gLSAodWludDhfdCAqKSAod2ggKyAxKSk7CisJaW5wdXQgPSAodWludDhfdCAqKSBjZGZfbWVtX21hbGxvYyhuQnl0ZXMpOworCWlmIChOVUxMID09IGlucHV0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldCA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZ290byBlcnJfdGZtOworCX0KKworCS8qIENvcHkgdGhlIEFBRCwgTU1JRSB3aXRoIDggYml0IE1JQyB6ZXJvZWQgb3V0ICovCisJY2RmX21lbV96ZXJvKGlucHV0LCBuQnl0ZXMpOworCWNkZl9tZW1fY29weShpbnB1dCwgYWFkLCBBQURfTEVOKTsKKwljZGZfbWVtX2NvcHkoaW5wdXQgKyBBQURfTEVOLCAodWludDhfdCAqKSAod2ggKyAxKSwKKwkJICAgICBuQnl0ZXMgLSBBQURfTEVOIC0gQ01BQ19UTEVOKTsKKworCWNkc19jbWFjX2NhbGNfbWljKHRmbSwgaW5wdXQsIG5CeXRlcywgbWljKTsKKwljZGZfbWVtX2ZyZWUoaW5wdXQpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIkNNQUMoVCk9ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCIsCisJCSAgbWljWzBdLCBtaWNbMV0sIG1pY1syXSwgbWljWzNdLAorCQkgIG1pY1s0XSwgbWljWzVdLCBtaWNbNl0sIG1pY1s3XSk7CisKKwlpZiAoT1NfTUVNQ01QKG1pYywgbW1pZS0+bWljLCBDTUFDX1RMRU4pICE9IDApIHsKKwkJLyogTU1JRSBNSUMgbWlzbWF0Y2ggKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJCQy9NQyBNR01UIGZyYW1lIE1NSUUgTUlDIGNoZWNrIEZhaWxlZCIKKwkJCSAgIiBybWljICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCIKKwkJCSAgIiBjbWljICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCIsCisJCQkgIG1taWUtPm1pY1swXSwgbW1pZS0+bWljWzFdLCBtbWllLT5taWNbMl0sCisJCQkgIG1taWUtPm1pY1szXSwgbW1pZS0+bWljWzRdLCBtbWllLT5taWNbNV0sCisJCQkgIG1taWUtPm1pY1s2XSwgbW1pZS0+bWljWzddLCBtaWNbMF0sIG1pY1sxXSwgbWljWzJdLAorCQkJICBtaWNbM10sIG1pY1s0XSwgbWljWzVdLCBtaWNbNl0sIG1pY1s3XSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBVcGRhdGUgSVBOICovCisJY2RmX21lbV9jb3B5KGlwbiwgcnhfaXBuLCBDTUFDX0lQTl9MRU4pOworCitlcnJfdGZtOgorCWlmICh0Zm0pCisJCWNkc19jcnlwdG9fZnJlZV9jaXBoZXIodGZtKTsKKworCXJldHVybiAhcmV0ID8gdHJ1ZSA6IGZhbHNlOworfQorCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExVyAqLworLyoqCisgKiBjZHNfc2hhMV9obWFjX3N0cgorICoKKyAqIEZVTkNUSU9OOgorICogR2VuZXJhdGUgdGhlIEhNQUMtU0hBMSBvZiBhIHN0cmluZyBnaXZlbiBhIGtleS4KKyAqCisgKiBMT0dJQzoKKyAqIFN0YW5kYXJkIEhNQUMgcHJvY2Vzc2luZyBmcm9tIFJGQyAyMTA0LiBUaGUgY29kZSBpcyBwcm92aWRlZCBpbiB0aGUKKyAqIGFwcGVuZGl4IG9mIHRoZSBSRkMuCisgKgorICogQVNTVU1QVElPTlM6CisgKiBUaGUgUkZDIGlzIGNvcnJlY3QuCisgKgorICogQHBhcmFtIHRleHQgdGV4dCB0byBiZSBoYXNoZWQKKyAqIEBwYXJhbSB0ZXh0TGVuIGxlbmd0aCBvZiB0ZXh0CisgKiBAcGFyYW0ga2V5IGtleSB0byB1c2UgZm9yIEhNQUMKKyAqIEBwYXJhbSBrZXlMZW4gbGVuZ3RoIG9mIGtleQorICogQHBhcmFtIGRpZ2VzdCBob2xkcyByZXN1bHRhbnQgU0hBMSBITUFDICgyMEIpCisgKgorICogQHJldHVybiBDREZfU1RBVFVTX1NVQ0NTUyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKgorICovCisKK3N0cnVjdCBobWFjX3NoYTFfcmVzdWx0IHsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworCWludCBlcnI7Cit9OworCitzdGF0aWMgdm9pZCBobWFjX3NoYTFfY29tcGxldGUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXEsIGludCBlcnIpCit7CisJc3RydWN0IGhtYWNfc2hhMV9yZXN1bHQgKnIgPSByZXEtPmRhdGE7CisJaWYgKGVyciA9PSAtRUlOUFJPR1JFU1MpCisJCXJldHVybjsKKwlyLT5lcnIgPSBlcnI7CisJY29tcGxldGUoJnItPmNvbXBsZXRpb24pOworfQorCitpbnQKK2htYWNfc2hhMSh1aW50OF90ICprZXksIHVpbnQ4X3Qga3NpemUsIGNoYXIgKnBsYWludGV4dCwgdWludDhfdCBwc2l6ZSwKKwkgIHVpbnQ4X3QgKm91dHB1dCwgdWludDhfdCBvdXRsZW4pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBobWFjX3NoYTFfcmVzdWx0IHRyZXN1bHQ7CisJdm9pZCAqaGFzaF9idWZmID0gTlVMTDsKKworCXVuc2lnbmVkIGNoYXIgaGFzaF9yZXN1bHRbNjRdOworCWludCBpOworCisJbWVtc2V0KG91dHB1dCwgMCwgb3V0bGVuKTsKKworCWluaXRfY29tcGxldGlvbigmdHJlc3VsdC5jb21wbGV0aW9uKTsKKworCXRmbSA9IGNkc19jcnlwdG9fYWxsb2NfYWhhc2goImhtYWMoc2hhMSkiLCBDUllQVE9fQUxHX1RZUEVfQUhBU0gsCisJCQkJIENSWVBUT19BTEdfVFlQRV9BSEFTSF9NQVNLKTsKKwlpZiAoSVNfRVJSKHRmbSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJjcnlwdG9fYWxsb2NfYWhhc2ggZmFpbGVkIik7CisJCXJldCA9IFBUUl9FUlIodGZtKTsKKwkJZ290byBlcnJfdGZtOworCX0KKworCXJlcSA9IGFoYXNoX3JlcXVlc3RfYWxsb2ModGZtLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgImZhaWxlZCB0byBhbGxvY2F0ZSByZXF1ZXN0IGZvciBobWFjKHNoYTEpIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlcTsKKwl9CisKKwlhaGFzaF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HLAorCQkJCSAgIGhtYWNfc2hhMV9jb21wbGV0ZSwgJnRyZXN1bHQpOworCisJaGFzaF9idWZmID0ga3phbGxvYyhwc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoYXNoX2J1ZmYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJmYWlsZWQgdG8ga3phbGxvYyBoYXNoX2J1ZmYiKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaGFzaF9idWY7CisJfQorCisJbWVtc2V0KGhhc2hfcmVzdWx0LCAwLCA2NCk7CisJbWVtY3B5KGhhc2hfYnVmZiwgcGxhaW50ZXh0LCBwc2l6ZSk7CisJc2dfaW5pdF9vbmUoJnNnLCBoYXNoX2J1ZmYsIHBzaXplKTsKKworCWlmIChrc2l6ZSkgeworCQljcnlwdG9fYWhhc2hfY2xlYXJfZmxhZ3ModGZtLCB+MCk7CisJCXJldCA9IGNkc19jcnlwdG9fYWhhc2hfc2V0a2V5KHRmbSwga2V5LCBrc2l6ZSk7CisJCWlmIChyZXQpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgImNyeXB0b19haGFzaF9zZXRrZXkgZmFpbGVkIik7CisJCQlnb3RvIGVycl9zZXRrZXk7CisJCX0KKwl9CisKKwlhaGFzaF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsICZzZywgaGFzaF9yZXN1bHQsIHBzaXplKTsKKwlyZXQgPSBjZHNfY3J5cHRvX2FoYXNoX2RpZ2VzdChyZXEpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAicmV0IDB4JXgiLCByZXQpOworCisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJCWZvciAoaSA9IDA7IGkgPCBvdXRsZW47IGkrKykKKwkJCW91dHB1dFtpXSA9IGhhc2hfcmVzdWx0W2ldOworCQlicmVhazsKKwljYXNlIC1FSU5QUk9HUkVTUzoKKwljYXNlIC1FQlVTWToKKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZ0cmVzdWx0LmNvbXBsZXRpb24pOworCQlpZiAoIXJldCAmJiAhdHJlc3VsdC5lcnIpIHsKKwkJCUlOSVRfQ09NUExFVElPTih0cmVzdWx0LmNvbXBsZXRpb24pOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJ3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUgZmFpbGVkIik7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSB0cmVzdWx0LmVycjsKKwkJCWdvdG8gb3V0OworCQl9CisJZGVmYXVsdDoKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CitlcnJfc2V0a2V5OgorCWtmcmVlKGhhc2hfYnVmZik7CitlcnJfaGFzaF9idWY6CisJYWhhc2hfcmVxdWVzdF9mcmVlKHJlcSk7CitlcnJfcmVxOgorCWNkc19jcnlwdG9fZnJlZV9haGFzaCh0Zm0pOworZXJyX3RmbToKKwlyZXR1cm4gcmV0OworfQorCitDREZfU1RBVFVTIGNkc19zaGExX2htYWNfc3RyKHVpbnQzMl90IGNyeXB0SGFuZGxlLCAgICAgIC8qIEhhbmRsZSAqLworCQkJICAgICB1aW50OF90ICpwVGV4dCwgICAgLyogcG9pbnRlciB0byBkYXRhIHN0cmVhbSAqLworCQkJICAgICB1aW50MzJfdCB0ZXh0TGVuLCAgLyogbGVuZ3RoIG9mIGRhdGEgc3RyZWFtICovCisJCQkgICAgIHVpbnQ4X3QgKnBLZXksICAgICAvKiBwb2ludGVyIHRvIGF1dGhlbnRpY2F0aW9uIGtleSAqLworCQkJICAgICB1aW50MzJfdCBrZXlMZW4sICAgLyogbGVuZ3RoIG9mIGF1dGhlbnRpY2F0aW9uIGtleSAqLworCQkJICAgICB1aW50OF90IGRpZ2VzdFtDRFNfRElHRVNUX1NIQTFfU0laRV0pCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGxlciBkaWdlc3QgdG8gYmUgZmlsbGVkIGluICovCisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBobWFjX3NoYTEocEtleSwgICAvKiB1aW50OF90ICprZXksICovCisJCQkodWludDhfdCkga2V5TGVuLCAgICAgICAvKiB1aW50OF90IGtzaXplLCAqLworCQkJKGNoYXIgKilwVGV4dCwgIC8qIGNoYXIgKnBsYWludGV4dCwgKi8KKwkJCSh1aW50OF90KSB0ZXh0TGVuLCAgICAgIC8qIHVpbnQ4X3QgcHNpemUsICovCisJCQlkaWdlc3QsIC8qIHVpbnQ4X3QgKm91dHB1dCwgKi8KKwkJCUNEU19ESUdFU1RfU0hBMV9TSVpFICAgIC8qIHVpbnQ4X3Qgb3V0bGVuICovCisJCQkpOworCisJaWYgKHJldCAhPSAwKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiaG1hY19zaGExKCkgY2FsbCBmYWlsZWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNkc19tZDVfaG1hY19zdHIKKyAqCisgKiBGVU5DVElPTjoKKyAqIEdlbmVyYXRlIHRoZSBITUFDLU1ENSBvZiBhIHN0cmluZyBnaXZlbiBhIGtleS4KKyAqCisgKiBMT0dJQzoKKyAqIFN0YW5kYXJkIEhNQUMgcHJvY2Vzc2luZyBmcm9tIFJGQyAyMTA0LiBUaGUgY29kZSBpcyBwcm92aWRlZCBpbiB0aGUKKyAqIGFwcGVuZGl4IG9mIHRoZSBSRkMuCisgKgorICogQVNTVU1QVElPTlM6CisgKiBUaGUgUkZDIGlzIGNvcnJlY3QuCisgKgorICogQHBhcmFtIHRleHQgdGV4dCB0byBiZSBoYXNoZWQKKyAqIEBwYXJhbSB0ZXh0TGVuIGxlbmd0aCBvZiB0ZXh0CisgKiBAcGFyYW0ga2V5IGtleSB0byB1c2UgZm9yIEhNQUMKKyAqIEBwYXJhbSBrZXlMZW4gbGVuZ3RoIG9mIGtleQorICogQHBhcmFtIGRpZ2VzdCBob2xkcyByZXN1bHRhbnQgTUQ1IEhNQUMgKDIwQikKKyAqCisgKiBAcmV0dXJuIENERl9TVEFUVVNfU1VDQ1NTIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqCisgKi8KK3N0cnVjdCBobWFjX21kNV9yZXN1bHQgeworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CisJaW50IGVycjsKK307CisKK3N0YXRpYyB2b2lkIGhtYWNfbWQ1X2NvbXBsZXRlKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxLCBpbnQgZXJyKQoreworCXN0cnVjdCBobWFjX21kNV9yZXN1bHQgKnIgPSByZXEtPmRhdGE7CisJaWYgKGVyciA9PSAtRUlOUFJPR1JFU1MpCisJCXJldHVybjsKKwlyLT5lcnIgPSBlcnI7CisJY29tcGxldGUoJnItPmNvbXBsZXRpb24pOworfQorCitpbnQKK2htYWNfbWQ1KHVpbnQ4X3QgKmtleSwgdWludDhfdCBrc2l6ZSwgY2hhciAqcGxhaW50ZXh0LCB1aW50OF90IHBzaXplLAorCSB1aW50OF90ICpvdXRwdXQsIHVpbnQ4X3Qgb3V0bGVuKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKnRmbTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisJc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgaG1hY19tZDVfcmVzdWx0IHRyZXN1bHQgPSB7LmVyciA9IDAgfTsKKwl2b2lkICpoYXNoX2J1ZmYgPSBOVUxMOworCisJdW5zaWduZWQgY2hhciBoYXNoX3Jlc3VsdFs2NF07CisJaW50IGk7CisKKwltZW1zZXQob3V0cHV0LCAwLCBvdXRsZW4pOworCisJaW5pdF9jb21wbGV0aW9uKCZ0cmVzdWx0LmNvbXBsZXRpb24pOworCisJdGZtID0gY2RzX2NyeXB0b19hbGxvY19haGFzaCgiaG1hYyhtZDUpIiwgQ1JZUFRPX0FMR19UWVBFX0FIQVNILAorCQkJCSBDUllQVE9fQUxHX1RZUEVfQUhBU0hfTUFTSyk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiY3J5cHRvX2FsbG9jX2FoYXNoIGZhaWxlZCIpOworCQlyZXQgPSBQVFJfRVJSKHRmbSk7CisJCWdvdG8gZXJyX3RmbTsKKwl9CisKKwlyZXEgPSBhaGFzaF9yZXF1ZXN0X2FsbG9jKHRmbSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWVzdCBmb3IgaG1hYyhtZDUpIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlcTsKKwl9CisKKwlhaGFzaF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HLAorCQkJCSAgIGhtYWNfbWQ1X2NvbXBsZXRlLCAmdHJlc3VsdCk7CisKKwloYXNoX2J1ZmYgPSBremFsbG9jKHBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhc2hfYnVmZikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgImZhaWxlZCB0byBremFsbG9jIGhhc2hfYnVmZiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9oYXNoX2J1ZjsKKwl9CisKKwltZW1zZXQoaGFzaF9yZXN1bHQsIDAsIDY0KTsKKwltZW1jcHkoaGFzaF9idWZmLCBwbGFpbnRleHQsIHBzaXplKTsKKwlzZ19pbml0X29uZSgmc2csIGhhc2hfYnVmZiwgcHNpemUpOworCisJaWYgKGtzaXplKSB7CisJCWNyeXB0b19haGFzaF9jbGVhcl9mbGFncyh0Zm0sIH4wKTsKKwkJcmV0ID0gY2RzX2NyeXB0b19haGFzaF9zZXRrZXkodGZtLCBrZXksIGtzaXplKTsKKwkJaWYgKHJldCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiY3J5cHRvX2FoYXNoX3NldGtleSBmYWlsZWQiKTsKKwkJCWdvdG8gZXJyX3NldGtleTsKKwkJfQorCX0KKworCWFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgJnNnLCBoYXNoX3Jlc3VsdCwgcHNpemUpOworCXJldCA9IGNkc19jcnlwdG9fYWhhc2hfZGlnZXN0KHJlcSk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwgInJldCAweCV4IiwgcmV0KTsKKworCXN3aXRjaCAocmV0KSB7CisJY2FzZSAwOgorCQlmb3IgKGkgPSAwOyBpIDwgb3V0bGVuOyBpKyspCisJCQlvdXRwdXRbaV0gPSBoYXNoX3Jlc3VsdFtpXTsKKwkJYnJlYWs7CisJY2FzZSAtRUlOUFJPR1JFU1M6CisJY2FzZSAtRUJVU1k6CisJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmdHJlc3VsdC5jb21wbGV0aW9uKTsKKwkJaWYgKCFyZXQgJiYgIXRyZXN1bHQuZXJyKSB7CisJCQlJTklUX0NPTVBMRVRJT04odHJlc3VsdC5jb21wbGV0aW9uKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAid2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlIGZhaWxlZCIpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gdHJlc3VsdC5lcnI7CisJCQlnb3RvIG91dDsKKwkJfQorCWRlZmF1bHQ6CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorZXJyX3NldGtleToKKwlrZnJlZShoYXNoX2J1ZmYpOworZXJyX2hhc2hfYnVmOgorCWFoYXNoX3JlcXVlc3RfZnJlZShyZXEpOworZXJyX3JlcToKKwljZHNfY3J5cHRvX2ZyZWVfYWhhc2godGZtKTsKK2Vycl90Zm06CisJcmV0dXJuIHJldDsKK30KKworQ0RGX1NUQVRVUyBjZHNfbWQ1X2htYWNfc3RyKHVpbnQzMl90IGNyeXB0SGFuZGxlLCAgICAgICAvKiBIYW5kbGUgKi8KKwkJCSAgICB1aW50OF90ICpwVGV4dCwgICAgIC8qIHBvaW50ZXIgdG8gZGF0YSBzdHJlYW0gKi8KKwkJCSAgICB1aW50MzJfdCB0ZXh0TGVuLCAgIC8qIGxlbmd0aCBvZiBkYXRhIHN0cmVhbSAqLworCQkJICAgIHVpbnQ4X3QgKnBLZXksICAgICAgLyogcG9pbnRlciB0byBhdXRoZW50aWNhdGlvbiBrZXkgKi8KKwkJCSAgICB1aW50MzJfdCBrZXlMZW4sICAgIC8qIGxlbmd0aCBvZiBhdXRoZW50aWNhdGlvbiBrZXkgKi8KKwkJCSAgICB1aW50OF90IGRpZ2VzdFtDRFNfRElHRVNUX01ENV9TSVpFXSkKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsbGVyIGRpZ2VzdCB0byBiZSBmaWxsZWQgaW4gKi8KKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGhtYWNfbWQ1KHBLZXksICAgIC8qIHVpbnQ4X3QgKmtleSwgKi8KKwkJICAgICAgICh1aW50OF90KSBrZXlMZW4sICAgICAgICAvKiB1aW50OF90IGtzaXplLCAqLworCQkgICAgICAgKGNoYXIgKilwVGV4dCwgICAvKiBjaGFyICpwbGFpbnRleHQsICovCisJCSAgICAgICAodWludDhfdCkgdGV4dExlbiwgICAgICAgLyogdWludDhfdCBwc2l6ZSwgKi8KKwkJICAgICAgIGRpZ2VzdCwgIC8qIHVpbnQ4X3QgKm91dHB1dCwgKi8KKwkJICAgICAgIENEU19ESUdFU1RfTUQ1X1NJWkUgICAgICAvKiB1aW50OF90IG91dGxlbiAqLworCQkgICAgICAgKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgImhtYWNfbWQ1KCkgY2FsbCBmYWlsZWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitzdHJ1Y3QgZWNiX2Flc19yZXN1bHQgeworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CisJaW50IGVycjsKK307CisKK3N0YXRpYyB2b2lkIGVjYl9hZXNfY29tcGxldGUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXEsIGludCBlcnIpCit7CisJc3RydWN0IGVjYl9hZXNfcmVzdWx0ICpyID0gcmVxLT5kYXRhOworCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKQorCQlyZXR1cm47CisJci0+ZXJyID0gZXJyOworCWNvbXBsZXRlKCZyLT5jb21wbGV0aW9uKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgY2RzX2VuY3J5cHRfYWVzKCkgLSBHZW5lcmF0ZSBBRVMgRW5jcnlwdGVkIGJ5dGUgc3RyZWFtCisKKyAgIFRoZSBjZHNfZW5jcnlwdF9hZXMoKSBmdW5jdGlvbiBnZW5lcmF0ZXMgdGhlIGVuY3J5cHRlZCBieXRlIHN0cmVhbSBmb3IgZ2l2ZW4gdGV4dC4KKworICAgQnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgYmVmb3JlIGNhbGxpbmcgY2RzX3JhbmRfZ2V0X2J5dGVzKCkuCisKKyAgIEF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSBhbiBhbHJlYWR5IGluaXRpYWxpemVkIGxvY2sgcmVzdWx0cyBpbgorICAgYSBmYWlsdXJlLgorCisgICBccGFyYW0gbG9jayAtIHBvaW50ZXIgdG8gdGhlIG9wYXF1ZSBsb2NrIG9iamVjdCB0byBpbml0aWFsaXplCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCByYW5kb20gbWVtb3J5LgorCisgICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBVUxUICAtIHBiQnVmIGlzIGFuIGludmFsaWQgcG9pbnRlci4KKworICAgICAgICAgIENERl9TVEFUVVNfRV9GQUlMVVJFIC0gZGVmYXVsdCByZXR1cm4gdmFsdWUgaWYgaXQgZmFpbHMgZHVlIHRvCisgICAgICAgICAgdW5rbm93biByZWFzb25zCisKKyAgKioqQ0RGX1NUQVRVU19FX1JFU09VUkNFUyAtIFN5c3RlbSByZXNvdXJjZXMgKG90aGVyIHRoYW4gbWVtb3J5KQorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZQorICAgXHNhCisKKyAgICAoICoqKiByZXR1cm4gdmFsdWUgbm90IGNvbnNpZGVyZWQgeWV0ICkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUyBjZHNfZW5jcnlwdF9hZXModWludDMyX3QgY3J5cHRIYW5kbGUsICAgICAgICAvKiBIYW5kbGUgKi8KKwkJCSAgIHVpbnQ4X3QgKnBQbGFpblRleHQsICAgICAgICAgLyogcG9pbnRlciB0byBkYXRhIHN0cmVhbSAqLworCQkJICAgdWludDhfdCAqcENpcGhlcnRleHQsIHVpbnQ4X3QgKnBLZXkpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYXV0aGVudGljYXRpb24ga2V5ICovCisJc3RydWN0IGVjYl9hZXNfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICp0Zm07CisJaW50IHJldCA9IDA7CisJY2hhciBpdltJVl9TSVpFX0FFU18xMjhdOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19pbjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfb3V0OworCisJaW5pdF9jb21wbGV0aW9uKCZyZXN1bHQuY29tcGxldGlvbik7CisKKwl0Zm0gPSBjZHNfY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIoImNiYyhhZXMpIiwgMCwgMCk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIgZmFpbGVkIik7CisJCXJldCA9IFBUUl9FUlIodGZtKTsKKwkJZ290byBlcnJfdGZtOworCX0KKworCXJlcSA9IGFibGtjaXBoZXJfcmVxdWVzdF9hbGxvYyh0Zm0sIEdGUF9LRVJORUwpOworCWlmICghcmVxKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVlc3QgZm9yIGNiYyhhZXMpIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlcTsKKwl9CisKKwlhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKHJlcSwgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0csCisJCQkJCWVjYl9hZXNfY29tcGxldGUsICZyZXN1bHQpOworCisJY3J5cHRvX2FibGtjaXBoZXJfY2xlYXJfZmxhZ3ModGZtLCB+MCk7CisKKwlyZXQgPSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkodGZtLCBwS2V5LCBBRVNfS0VZU0laRV8xMjgpOworCWlmIChyZXQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJjcnlwdG9fY2lwaGVyX3NldGtleSBmYWlsZWQiKTsKKwkJZ290byBlcnJfc2V0a2V5OworCX0KKworCW1lbXNldChpdiwgMCwgSVZfU0laRV9BRVNfMTI4KTsKKworCXNnX2luaXRfb25lKCZzZ19pbiwgcFBsYWluVGV4dCwgQUVTX0JMT0NLX1NJWkUpOworCisJc2dfaW5pdF9vbmUoJnNnX291dCwgcENpcGhlcnRleHQsIEFFU19CTE9DS19TSVpFKTsKKworCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCAmc2dfaW4sICZzZ19vdXQsIEFFU19CTE9DS19TSVpFLCBpdik7CisKKwljcnlwdG9fYWJsa2NpcGhlcl9lbmNyeXB0KHJlcSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2Vycl9zZXRrZXk6CisJY2RzX2FibGtjaXBoZXJfcmVxdWVzdF9mcmVlKHJlcSk7CitlcnJfcmVxOgorCWNkc19jcnlwdG9fZnJlZV9hYmxrY2lwaGVyKHRmbSk7CitlcnJfdGZtOgorCS8qIHJldHVybiByZXQ7ICovCisJaWYgKHJldCAhPSAwKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMoKSBjYWxsIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBjZHNfZGVjcnlwdF9hZXMoKSAtIERlY3J5cHRzIGFuIEFFUyBFbmNyeXB0ZWQgYnl0ZSBzdHJlYW0KKworICAgVGhlIGNkc19kZWNyeXB0X2FlcygpIGZ1bmN0aW9uIGRlY3J5cHRzIHRoZSBlbmNyeXB0ZWQgYnl0ZSBzdHJlYW0uCisKKyAgIEJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIGJlZm9yZSBjYWxsaW5nIGNkc19yYW5kX2dldF9ieXRlcygpLgorCisgICBBdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgYW4gYWxyZWFkeSBpbml0aWFsaXplZCBsb2NrIHJlc3VsdHMgaW4KKyAgIGEgZmFpbHVyZS4KKworICAgXHBhcmFtIGxvY2sgLSBwb2ludGVyIHRvIHRoZSBvcGFxdWUgbG9jayBvYmplY3QgdG8gaW5pdGlhbGl6ZQorCisgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIFN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgcmFuZG9tIG1lbW9yeS4KKworICAgICAgICAgIENERl9TVEFUVVNfRV9GQVVMVCAgLSBwYkJ1ZiBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuCisKKyAgICAgICAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSAtIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIGl0IGZhaWxzIGR1ZSB0bworICAgICAgICAgIHVua25vd24gcmVhc29ucworCisgICoqKkNERl9TVEFUVVNfRV9SRVNPVVJDRVMgLSBTeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkKKyAgICAgICAgICBhcmUgdW5hdmFpbGFibGUKKyAgIFxzYQorCisgICAgKCAqKiogcmV0dXJuIHZhbHVlIG5vdCBjb25zaWRlcmVkIHlldCApCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NERl9TVEFUVVMgY2RzX2RlY3J5cHRfYWVzKHVpbnQzMl90IGNyeXB0SGFuZGxlLCAgICAgICAgLyogSGFuZGxlICovCisJCQkgICB1aW50OF90ICpwVGV4dCwgICAgICAvKiBwb2ludGVyIHRvIGRhdGEgc3RyZWFtICovCisJCQkgICB1aW50OF90ICpwRGVjcnlwdGVkLCB1aW50OF90ICpwS2V5KQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGF1dGhlbnRpY2F0aW9uIGtleSAqLworLyogICAgQ0RGX1NUQVRVUyB1UmVzdWx0ID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7ICovCisJc3RydWN0IGVjYl9hZXNfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICp0Zm07CisJaW50IHJldCA9IDA7CisJY2hhciBpdltJVl9TSVpFX0FFU18xMjhdOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19pbjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfb3V0OworCisJaW5pdF9jb21wbGV0aW9uKCZyZXN1bHQuY29tcGxldGlvbik7CisKKwl0Zm0gPSBjZHNfY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIoImNiYyhhZXMpIiwgMCwgMCk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIgZmFpbGVkIik7CisJCXJldCA9IFBUUl9FUlIodGZtKTsKKwkJZ290byBlcnJfdGZtOworCX0KKworCXJlcSA9IGFibGtjaXBoZXJfcmVxdWVzdF9hbGxvYyh0Zm0sIEdGUF9LRVJORUwpOworCWlmICghcmVxKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVlc3QgZm9yIGNiYyhhZXMpIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlcTsKKwl9CisKKwlhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKHJlcSwgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0csCisJCQkJCWVjYl9hZXNfY29tcGxldGUsICZyZXN1bHQpOworCisJY3J5cHRvX2FibGtjaXBoZXJfY2xlYXJfZmxhZ3ModGZtLCB+MCk7CisKKwlyZXQgPSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkodGZtLCBwS2V5LCBBRVNfS0VZU0laRV8xMjgpOworCWlmIChyZXQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJjcnlwdG9fY2lwaGVyX3NldGtleSBmYWlsZWQiKTsKKwkJZ290byBlcnJfc2V0a2V5OworCX0KKworCW1lbXNldChpdiwgMCwgSVZfU0laRV9BRVNfMTI4KTsKKworCXNnX2luaXRfb25lKCZzZ19pbiwgcFRleHQsIEFFU19CTE9DS19TSVpFKTsKKworCXNnX2luaXRfb25lKCZzZ19vdXQsIHBEZWNyeXB0ZWQsIEFFU19CTE9DS19TSVpFKTsKKworCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCAmc2dfaW4sICZzZ19vdXQsIEFFU19CTE9DS19TSVpFLCBpdik7CisKKwljcnlwdG9fYWJsa2NpcGhlcl9kZWNyeXB0KHJlcSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2Vycl9zZXRrZXk6CisJY2RzX2FibGtjaXBoZXJfcmVxdWVzdF9mcmVlKHJlcSk7CitlcnJfcmVxOgorCWNkc19jcnlwdG9fZnJlZV9hYmxrY2lwaGVyKHRmbSk7CitlcnJfdGZtOgorCS8qIHJldHVybiByZXQ7ICovCisJaWYgKHJldCAhPSAwKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMoKSBjYWxsIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCit1aW50MzJfdCBjZHNfY2hhbl90b19mcmVxKHVpbnQ4X3QgY2hhbikKK3sKKwlpZiAoY2hhbiA8IENEU18yNF9HSFpfQ0hBTk5FTF8xNCkgICAgICAgLyogY2ggMCAtIGNoIDEzICovCisJCXJldHVybiBDRFNfMjRfR0haX0JBU0VfRlJFUSArIGNoYW4gKiBDRFNfQ0hBTl9TUEFDSU5HXzVNSFo7CisJZWxzZSBpZiAoY2hhbiA9PSBDRFNfMjRfR0haX0NIQU5ORUxfMTQpIC8qIGNoIDE0ICovCisJCXJldHVybiBDRFNfQ0hBTl8xNF9GUkVROworCWVsc2UgaWYgKGNoYW4gPCBDRFNfMjRfR0haX0NIQU5ORUxfMjcpICAvKiBjaCAxNSAtIGNoIDI2ICovCisJCXJldHVybiBDRFNfQ0hBTl8xNV9GUkVRICsKKwkJICAgICAgIChjaGFuIC0gQ0RTXzI0X0dIWl9DSEFOTkVMXzE1KSAqIENEU19DSEFOX1NQQUNJTkdfMjBNSFo7CisJZWxzZSBpZiAoY2hhbiA9PSBDRFNfNV9HSFpfQ0hBTk5FTF8xNzApCisJCXJldHVybiBDRFNfQ0hBTl8xNzBfRlJFUTsKKwllbHNlCisJCXJldHVybiBDRFNfNV9HSFpfQkFTRV9GUkVRICsgY2hhbiAqIENEU19DSEFOX1NQQUNJTkdfNU1IWjsKK30KKwordWludDhfdCBjZHNfZnJlcV90b19jaGFuKHVpbnQzMl90IGZyZXEpCit7CisJdWludDhfdCBjaGFuOworCisJaWYgKGZyZXEgPiBDRFNfMjRfR0haX0JBU0VfRlJFUSAmJiBmcmVxIDwgQ0RTX0NIQU5fMTRfRlJFUSkKKwkJY2hhbiA9ICgoZnJlcSAtIENEU18yNF9HSFpfQkFTRV9GUkVRKSAvIENEU19DSEFOX1NQQUNJTkdfNU1IWik7CisJZWxzZSBpZiAoZnJlcSA9PSBDRFNfQ0hBTl8xNF9GUkVRKQorCQljaGFuID0gQ0RTXzI0X0dIWl9DSEFOTkVMXzE0OworCWVsc2UgaWYgKChmcmVxID4gQ0RTXzI0X0dIWl9CQVNFX0ZSRVEpICYmIChmcmVxIDwgQ0RTXzVfR0haX0JBU0VfRlJFUSkpCisJCWNoYW4gPSAoKChmcmVxIC0gQ0RTX0NIQU5fMTVfRlJFUSkgLyBDRFNfQ0hBTl9TUEFDSU5HXzIwTUhaKSArCisJCQlDRFNfMjRfR0haX0NIQU5ORUxfMTUpOworCWVsc2UKKwkJY2hhbiA9IChmcmVxIC0gQ0RTXzVfR0haX0JBU0VfRlJFUSkgLyBDRFNfQ0hBTl9TUEFDSU5HXzVNSFo7CisJcmV0dXJuIGNoYW47Cit9CisKK3VpbnQ4X3QgY2RzX2NoYW5fdG9fYmFuZCh1aW50MzJfdCBjaGFuKQoreworCWlmIChjaGFuIDw9IENEU18yNF9HSFpfQ0hBTk5FTF8xNCkKKwkJcmV0dXJuIENEU19CQU5EXzJHSFo7CisKKwlyZXR1cm4gQ0RTX0JBTkRfNUdIWjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvY2RzL3NyYy9pX2Nkc19wYWNrZXQuaCBiL2NvcmUvY2RzL3NyYy9pX2Nkc19wYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzg1OGZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZHMvc3JjL2lfY2RzX3BhY2tldC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZCggX19JX0NEU19QQUNLRVRfSCApCisjZGVmaW5lIF9fSV9DRFNfUEFDS0VUX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgICAgICAgaV9jZHNfcGFja2V0LmgKKworICAgXGJyaWVmICAgICAgIENvbm5lY3Rpdml0eSBkcml2ZXIgc2VydmljZXMgbmV0d29yayBwYWNrZXQgQVBJcworCisgICBOZXR3b3JrIFByb3RvY29sIHBhY2tldC9idWZmZXIgaW50ZXJuYWwgaW5jbHVkZSBmaWxlCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisvKgorICogUnggUGFja2V0IFN0cnVjdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBjaGFubmVsOworCXVpbnQ4X3Qgc25yOworCXVpbnQzMl90IHJzc2k7CisJdWludDMyX3QgdGltZXN0YW1wOworCXVpbnQ4X3QgKm1wZHVfaGRyX3B0cjsKKwl1aW50OF90ICptcGR1X2RhdGFfcHRyOworCXVpbnQzMl90IG1wZHVfbGVuOworCXVpbnQzMl90IG1wZHVfaGRyX2xlbjsKKwl1aW50MzJfdCBtcGR1X2RhdGFfbGVuOworCXVpbnQ4X3Qgb2ZmbG9hZFNjYW5MZWFybiA6IDE7CisJdWludDhfdCByb2FtQ2FuZGlkYXRlSW5kIDogMTsKKwl1aW50OF90IHNjYW4gOiAxOworCXVpbnQ4X3Qgc2Nhbl9zcmM7CisJdWludDhfdCBkcHVGZWVkYmFjazsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50MzJfdCB0c2ZfZGVsdGE7Cit9IHRfcGFja2V0bWV0YSwgKnRwX3BhY2tldG1ldGE7CisKKy8qIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNkcyBwYWNrZXQgdHlwZSAqLworc3RydWN0IGNkc19wa3RfdCB7CisJLyogUGFja2V0IE1ldGEgSW5mb3JtYXRpb24gKi8KKwl0X3BhY2tldG1ldGEgcGt0X21ldGE7CisKKwkvKiBQb2ludGVyIHRvIFBhY2tldCAqLworCXZvaWQgKnBrdF9idWY7Cit9OworCisjZW5kaWYgLyogIWRlZmluZWQoIF9fSV9DRFNfUEFDS0VUX0ggKSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9jZHMvc3JjL3F1ZXVlLmggYi9jb3JlL2Nkcy9zcmMvcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzIwMDQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jZHMvc3JjL3F1ZXVlLmgKQEAgLTAsMCArMSw1NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAgICBAKCMpcXVldWUuaCAgICA4LjUgKEJlcmtlbGV5KSA4LzIwLzk0CisgKiAkRnJlZUJTRDogc3JjL3N5cy9zeXMvcXVldWUuaCx2IDEuNTggMjAwNC8wNC8wNyAwNDoxOTo0OSBpbXAgRXhwICQKKyAqLworCisjaWYgIWRlZmluZWQoX19OZXRCU0RfXykKKyNpZm5kZWYgX1NZU19RVUVVRV9IXworI2RlZmluZSAgICBfU1lTX1FVRVVFX0hfCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBmb3VyIHR5cGVzIG9mIGRhdGEgc3RydWN0dXJlczogc2luZ2x5LWxpbmtlZCBsaXN0cywKKyAqIHNpbmdseS1saW5rZWQgdGFpbCBxdWV1ZXMsIGxpc3RzIGFuZCB0YWlsIHF1ZXVlcy4KKyAqCisgKiBBIHNpbmdseS1saW5rZWQgbGlzdCBpcyBoZWFkZWQgYnkgYSBzaW5nbGUgZm9yd2FyZCBwb2ludGVyLiBUaGUgZWxlbWVudHMKKyAqIGFyZSBzaW5nbHkgbGlua2VkIGZvciBtaW5pbXVtIHNwYWNlIGFuZCBwb2ludGVyIG1hbmlwdWxhdGlvbiBvdmVyaGVhZCBhdAorICogdGhlIGV4cGVuc2Ugb2YgTyhuKSByZW1vdmFsIGZvciBhcmJpdHJhcnkgZWxlbWVudHMuIE5ldyBlbGVtZW50cyBjYW4gYmUKKyAqIGFkZGVkIHRvIHRoZSBsaXN0IGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisgKiBFbGVtZW50cyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3Qgc2hvdWxkIHVzZSB0aGUgZXhwbGljaXQKKyAqIG1hY3JvIGZvciB0aGlzIHB1cnBvc2UgZm9yIG9wdGltdW0gZWZmaWNpZW5jeS4gQSBzaW5nbHktbGlua2VkIGxpc3QgbWF5CisgKiBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uICBTaW5nbHktbGlua2VkIGxpc3RzIGFyZSBpZGVhbAorICogZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxhcmdlIGRhdGFzZXRzIGFuZCBmZXcgb3Igbm8gcmVtb3ZhbHMgb3IgZm9yCisgKiBpbXBsZW1lbnRpbmcgYSBMSUZPIHF1ZXVlLgorICoKKyAqIEEgc2luZ2x5LWxpbmtlZCB0YWlsIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0byB0aGUKKyAqIGhlYWQgb2YgdGhlIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZQorICogc2luZ2x5IGxpbmtlZCBmb3IgbWluaW11bSBzcGFjZSBhbmQgcG9pbnRlciBtYW5pcHVsYXRpb24gb3ZlcmhlYWQgYXQgdGhlCisgKiBleHBlbnNlIG9mIE8obikgcmVtb3ZhbCBmb3IgYXJiaXRyYXJ5IGVsZW1lbnRzLiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkCisgKiB0byB0aGUgbGlzdCBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlCisgKiBlbmQgb2YgdGhlIGxpc3QuIEVsZW1lbnRzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgdGFpbCBxdWV1ZQorICogc2hvdWxkIHVzZSB0aGUgZXhwbGljaXQgbWFjcm8gZm9yIHRoaXMgcHVycG9zZSBmb3Igb3B0aW11bSBlZmZpY2llbmN5LgorICogQSBzaW5nbHktbGlua2VkIHRhaWwgcXVldWUgbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqIFNpbmdseS1saW5rZWQgdGFpbCBxdWV1ZXMgYXJlIGlkZWFsIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsYXJnZSBkYXRhc2V0cworICogYW5kIGZldyBvciBubyByZW1vdmFscyBvciBmb3IgaW1wbGVtZW50aW5nIGEgRklGTyBxdWV1ZS4KKyAqCisgKiBBIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlciAob3IgYW4gYXJyYXkgb2YgZm9yd2FyZAorICogcG9pbnRlcnMgZm9yIGEgaGFzaCB0YWJsZSBoZWFkZXIpLiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseSBsaW5rZWQKKyAqIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZQorICogb3IgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCBvciBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gQSBsaXN0CisgKiBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLgorICoKKyAqIEEgdGFpbCBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlIGhlYWQgb2YgdGhlCisgKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5CisgKiBsaW5rZWQgc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bworICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yCisgKiBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZgorICogdGhlIGxpc3QuIEEgdGFpbCBxdWV1ZSBtYXkgYmUgdHJhdmVyc2VkIGluIGVpdGhlciBkaXJlY3Rpb24uCisgKgorICogRm9yIGRldGFpbHMgb24gdGhlIHVzZSBvZiB0aGVzZSBtYWNyb3MsIHNlZSB0aGUgcXVldWUoMykgbWFudWFsIHBhZ2UuCisgKgorICoKKyAqICAgICAgICAgICAgICAgIFNMSVNUICAgIExJU1QgICAgU1RBSUxRICAgIFRBSUxRCisgKiBfSEVBRCAgICAgICAgICAgICsgICAgKyAgICArICAgICsKKyAqIF9IRUFEX0lOSVRJQUxJWkVSICAgICAgICArICAgICsgICAgKyAgICArCisgKiBfRU5UUlkgICAgICAgICAgICArICAgICsgICAgKyAgICArCisgKiBfSU5JVCAgICAgICAgICAgICsgICAgKyAgICArICAgICsKKyAqIF9FTVBUWSAgICAgICAgICAgICsgICAgKyAgICArICAgICsKKyAqIF9GSVJTVCAgICAgICAgICAgICsgICAgKyAgICArICAgICsKKyAqIF9ORVhUICAgICAgICAgICAgKyAgICArICAgICsgICAgKworICogX1BSRVYgICAgICAgICAgICAtICAgIC0gICAgLSAgICArCisgKiBfTEFTVCAgICAgICAgICAgIC0gICAgLSAgICArICAgICsKKyAqIF9GT1JFQUNIICAgICAgICAgICAgKyAgICArICAgICsgICAgKworICogX0ZPUkVBQ0hfU0FGRSAgICAgICAgKyAgICArICAgICsgICAgKworICogX0ZPUkVBQ0hfUkVWRVJTRSAgICAgICAgLSAgICAtICAgIC0gICAgKworICogX0ZPUkVBQ0hfUkVWRVJTRV9TQUZFICAgIC0gICAgLSAgICAtICAgICsKKyAqIF9JTlNFUlRfSEVBRCAgICAgICAgICAgICsgICAgKyAgICArICAgICsKKyAqIF9JTlNFUlRfQkVGT1JFICAgICAgICAtICAgICsgICAgLSAgICArCisgKiBfSU5TRVJUX0FGVEVSICAgICAgICArICAgICsgICAgKyAgICArCisgKiBfSU5TRVJUX1RBSUwgICAgICAgICAgICAtICAgIC0gICAgKyAgICArCisgKiBfQ09OQ0FUICAgICAgICAgICAgLSAgICAtICAgICsgICAgKworICogX1JFTU9WRV9IRUFEICAgICAgICAgICAgKyAgICAtICAgICsgICAgLQorICogX1JFTU9WRSAgICAgICAgICAgICsgICAgKyAgICArICAgICsKKyAqCisgKi8KKyNkZWZpbmUgICAgUVVFVUVfTUFDUk9fREVCVUcgMAorI2lmIFFVRVVFX01BQ1JPX0RFQlVHCisvKiBTdG9yZSB0aGUgbGFzdCAyIHBsYWNlcyB0aGUgcXVldWUgZWxlbWVudCBvciBoZWFkIHdhcyBhbHRlcmVkICovCitzdHJ1Y3QgcW1fdHJhY2UgeworCWNoYXIgKmxhc3RmaWxlOworCWludCBsYXN0bGluZTsKKwljaGFyICpwcmV2ZmlsZTsKKwlpbnQgcHJldmxpbmU7Cit9OworCisjZGVmaW5lICAgIFRSQUNFQlVGICAgIHN0cnVjdCBxbV90cmFjZSB0cmFjZTsKKyNkZWZpbmUgICAgVFJBU0hJVCh4KSAgICBkbyB7KHgpID0gKHZvaWQgKilOVUxMOyB9IHdoaWxlICgwKQorCisjZGVmaW5lICAgIFFNRF9UUkFDRV9IRUFEKGhlYWQpIGRvIHsJCQlcCisJCShoZWFkKS0+dHJhY2UucHJldmxpbmUgPSAoaGVhZCktPnRyYWNlLmxhc3RsaW5lOwlcCisJCShoZWFkKS0+dHJhY2UucHJldmZpbGUgPSAoaGVhZCktPnRyYWNlLmxhc3RmaWxlOwlcCisJCShoZWFkKS0+dHJhY2UubGFzdGxpbmUgPSBfX0xJTkVfXzsJCSAgXAorCQkoaGVhZCktPnRyYWNlLmxhc3RmaWxlID0gX19GSUxFX187CQkgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgICAgUU1EX1RSQUNFX0VMRU0oZWxlbSkgZG8gewkJCVwKKwkJKGVsZW0pLT50cmFjZS5wcmV2bGluZSA9IChlbGVtKS0+dHJhY2UubGFzdGxpbmU7CVwKKwkJKGVsZW0pLT50cmFjZS5wcmV2ZmlsZSA9IChlbGVtKS0+dHJhY2UubGFzdGZpbGU7CVwKKwkJKGVsZW0pLT50cmFjZS5sYXN0bGluZSA9IF9fTElORV9fOwkJICBcCisJCShlbGVtKS0+dHJhY2UubGFzdGZpbGUgPSBfX0ZJTEVfXzsJCSAgXAorfSB3aGlsZSAoMCkKKworI2Vsc2UKKyNkZWZpbmUgICAgUU1EX1RSQUNFX0VMRU0oZWxlbSkKKyNkZWZpbmUgICAgUU1EX1RSQUNFX0hFQUQoaGVhZCkKKyNkZWZpbmUgICAgVFJBQ0VCVUYKKyNkZWZpbmUgVFJBU0hJVCh4KSBkbyB7KHgpID0gKHZvaWQgKikwOyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIFFVRVVFX01BQ1JPX0RFQlVHICovCisKKyNpZmRlZiBBVEhSX1JOV0YKKy8qIE5ESVMgY29udGFpbnMgYSBkZWZuIGZvciBTTElTVF9FTlRSWSBhbmQgU0lOR0xFX0xJU1RfRU5UUlkgKi8KKyNlbmRpZgorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZSAgICBTTElTVF9IRUFEKG5hbWUsIHR5cGUpCQkJIFwKKwlzdHJ1Y3QgbmFtZSB7CQkJCSAgICAgXAorCQlzdHJ1Y3QgdHlwZSAqc2xoX2ZpcnN0OyAvKiBmaXJzdCBlbGVtZW50ICovCSAgICAgICBcCisJfQorCisjZGVmaW5lICAgIFNMSVNUX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkgICBcCisJeyBOVUxMIH0KKworI2RlZmluZSAgICBTSU5HX0xJU1RfRU5UUlkodHlwZSkJCQlcCisJc3RydWN0IHsJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqc2xlX25leHQ7IC8qIG5leHQgZWxlbWVudCAqLwkgICAgIFwKKwl9CisKKy8qCisgKiBTaW5nbHktbGlua2VkIExpc3QgZnVuY3Rpb25zLgorICovCisjZGVmaW5lICAgIFNMSVNUX0VNUFRZKGhlYWQpICAgICgoaGVhZCktPnNsaF9maXJzdCA9PSBOVUxMKQorCisjZGVmaW5lICAgIFNMSVNUX0ZJUlNUKGhlYWQpICAgICgoaGVhZCktPnNsaF9maXJzdCkKKworI2RlZmluZSAgICBTTElTVF9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkgICAgICBcCisJZm9yICgodmFyKSA9IFNMSVNUX0ZJUlNUKChoZWFkKSk7CQkgXAorCSAgICAgKHZhcik7CQkJICAgICAgIFwKKwkgICAgICh2YXIpID0gU0xJU1RfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lICAgIFNMSVNUX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCB0dmFyKQkJIFwKKwlmb3IgKCh2YXIpID0gU0xJU1RfRklSU1QoKGhlYWQpKTsJCSBcCisJICAgICAodmFyKSAmJiAoKHR2YXIpID0gU0xJU1RfTkVYVCgodmFyKSwgZmllbGQpLCAxKTsJICAgICBcCisJICAgICAodmFyKSA9ICh0dmFyKSkKKworI2RlZmluZSAgICBTTElTVF9GT1JFQUNIX1BSRVZQVFIodmFyLCB2YXJwLCBoZWFkLCBmaWVsZCkJICAgIFwKKwlmb3IgKCh2YXJwKSA9ICZTTElTVF9GSVJTVCgoaGVhZCkpOwkJICAgXAorCSAgICAgKCh2YXIpID0gKih2YXJwKSkgIT0gTlVMTDsJCQkgICBcCisJICAgICAodmFycCkgPSAmU0xJU1RfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lICAgIFNMSVNUX0lOSVQoaGVhZCkgZG8gewkJCVwKKwkJU0xJU1RfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSAgICBTTElTVF9JTlNFUlRfQUZURVIoc2xpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJICAgIFwKKwkJU0xJU1RfTkVYVCgoZWxtKSwgZmllbGQpID0gU0xJU1RfTkVYVCgoc2xpc3RlbG0pLCBmaWVsZCk7ICAgIFwKKwkJU0xJU1RfTkVYVCgoc2xpc3RlbG0pLCBmaWVsZCkgPSAoZWxtKTsJCSAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgICAgU0xJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkgICAgICAgXAorCQlTTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJICAgXAorCQlTTElTVF9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSAgICBTTElTVF9ORVhUKGVsbSwgZmllbGQpICAgICgoZWxtKS0+ZmllbGQuc2xlX25leHQpCisKKyNkZWZpbmUgICAgU0xJU1RfUkVNT1ZFKGhlYWQsIGVsbSwgdHlwZSwgZmllbGQpIGRvIHsJCVwKKwkJaWYgKFNMSVNUX0ZJUlNUKChoZWFkKSkgPT0gKGVsbSkpIHsJCSAgIFwKKwkJCVNMSVNUX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOwkgICAgIFwKKwkJfQkJCQkgXAorCQllbHNlIHsJCQkJICAgICAgXAorCQkJc3RydWN0IHR5cGUgKmN1cmVsbSA9IFNMSVNUX0ZJUlNUKChoZWFkKSk7CSAgXAorCQkJd2hpbGUgKFNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCkgIT0gKGVsbSkpCSAgXAorCQkJCWN1cmVsbSA9IFNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCk7CSAgIFwKKwkJCVNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCkgPQkJICAgXAorCQkJCVNMSVNUX05FWFQoU0xJU1RfTkVYVChjdXJlbG0sIGZpZWxkKSwgZmllbGQpOwkgXAorCQl9CQkJCSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lICAgIFNMSVNUX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkgICAgICBcCisJCVNMSVNUX0ZJUlNUKChoZWFkKSkgPSBTTElTVF9ORVhUKFNMSVNUX0ZJUlNUKChoZWFkKSksIGZpZWxkKTsJIFwKK30gd2hpbGUgKDApCisKKy8qCisgKiBTaW5nbHktbGlua2VkIFRhaWwgcXVldWUgZGVjbGFyYXRpb25zLgorICovCisjZGVmaW5lICAgIFNUQUlMUV9IRUFEKG5hbWUsIHR5cGUpCQkJICBcCisJc3RydWN0IG5hbWUgewkJCQkgICAgIFwKKwkJc3RydWN0IHR5cGUgKnN0cWhfZmlyc3Q7IC8qIGZpcnN0IGVsZW1lbnQgKi8JCVwKKwkJc3RydWN0IHR5cGUgKipzdHFoX2xhc3Q7IC8qIGFkZHIgb2YgbGFzdCBuZXh0IGVsZW1lbnQgKi8JIFwKKwl9CisKKyNkZWZpbmUgICAgU1RBSUxRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCSAgICBcCisJeyBOVUxMLCAmKGhlYWQpLnN0cWhfZmlyc3QgfQorCisjZGVmaW5lICAgIFNUQUlMUV9FTlRSWSh0eXBlKQkJCSAgICAgXAorCXN0cnVjdCB7CQkJCVwKKwkJc3RydWN0IHR5cGUgKnN0cWVfbmV4dDsgLyogbmV4dCBlbGVtZW50ICovCSAgICAgIFwKKwl9CisKKy8qCisgKiBTaW5nbHktbGlua2VkIFRhaWwgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lICAgIFNUQUlMUV9DT05DQVQoaGVhZDEsIGhlYWQyKSBkbyB7CQkgICBcCisJCWlmICghU1RBSUxRX0VNUFRZKChoZWFkMikpKSB7CQkJIFwKKwkJCSooaGVhZDEpLT5zdHFoX2xhc3QgPSAoaGVhZDIpLT5zdHFoX2ZpcnN0OwkgIFwKKwkJCShoZWFkMSktPnN0cWhfbGFzdCA9IChoZWFkMiktPnN0cWhfbGFzdDsJXAorCQkJU1RBSUxRX0lOSVQoKGhlYWQyKSk7CQkJIFwKKwkJfQkJCQkgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSAgICBTVEFJTFFfRU1QVFkoaGVhZCkgICAgKChoZWFkKS0+c3RxaF9maXJzdCA9PSBOVUxMKQorCisjZGVmaW5lICAgIFNUQUlMUV9GSVJTVChoZWFkKSAgICAoKGhlYWQpLT5zdHFoX2ZpcnN0KQorCisjZGVmaW5lICAgIFNUQUlMUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkgICBcCisJZm9yKCh2YXIpID0gU1RBSUxRX0ZJUlNUKChoZWFkKSk7CQkgXAorCSAgICAodmFyKTsJCQkgICAgICBcCisJICAgICh2YXIpID0gU1RBSUxRX05FWFQoKHZhciksIGZpZWxkKSkKKworI2RlZmluZSAgICBTVEFJTFFfRk9SRUFDSF9TQUZFKHZhciwgaGVhZCwgZmllbGQsIHR2YXIpCQkgIFwKKwlmb3IgKCh2YXIpID0gU1RBSUxRX0ZJUlNUKChoZWFkKSk7CQkgIFwKKwkgICAgICh2YXIpICYmICgodHZhcikgPSBTVEFJTFFfTkVYVCgodmFyKSwgZmllbGQpLCAxKTsJICAgICAgXAorCSAgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUgICAgU1RBSUxRX0lOSVQoaGVhZCkgZG8gewkJCSBcCisJCVNUQUlMUV9GSVJTVCgoaGVhZCkpID0gTlVMTDsJCQlcCisJCShoZWFkKS0+c3RxaF9sYXN0ID0gJlNUQUlMUV9GSVJTVCgoaGVhZCkpOwkgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lICAgIFNUQUlMUV9JTlNFUlRfQUZURVIoaGVhZCwgdHFlbG0sIGVsbSwgZmllbGQpIGRvIHsJICAgIFwKKwkJaWYgKChTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gU1RBSUxRX05FWFQoKHRxZWxtKSwgZmllbGQpKSA9PSBOVUxMKSBcCisJCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkgICAgICAgXAorCQlTVEFJTFFfTkVYVCgodHFlbG0pLCBmaWVsZCkgPSAoZWxtKTsJCSAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lICAgIFNUQUlMUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJCWlmICgoU1RBSUxRX05FWFQoKGVsbSksIGZpZWxkKSA9IFNUQUlMUV9GSVJTVCgoaGVhZCkpKSA9PSBOVUxMKQkgICBcCisJCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkgICAgICAgXAorCQlTVEFJTFFfRklSU1QoKGhlYWQpKSA9IChlbG0pOwkJCSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lICAgIFNUQUlMUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJCVNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBOVUxMOwkJIFwKKwkJKihoZWFkKS0+c3RxaF9sYXN0ID0gKGVsbSk7CQkgICAgICAgXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSAgICBTVEFJTFFfTEFTVChoZWFkLCB0eXBlLCBmaWVsZCkJCSAgICAgXAorCShTVEFJTFFfRU1QVFkoKGhlYWQpKSA/CQkJICAgICAgIFwKKwkgTlVMTCA6CQkJCSAgIFwKKwkgKChzdHJ1Y3QgdHlwZSAqKQkJICAgICBcCisJICAoKGNoYXIgKikoKGhlYWQpLT5zdHFoX2xhc3QpIC0gX19vZmZzZXRvZihzdHJ1Y3QgdHlwZSwgZmllbGQpKSkpCisKKyNkZWZpbmUgICAgU1RBSUxRX05FWFQoZWxtLCBmaWVsZCkgICAgKChlbG0pLT5maWVsZC5zdHFlX25leHQpCisKKyNkZWZpbmUgICAgU1RBSUxRX1JFTU9WRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSBkbyB7CQkgXAorCQlpZiAoU1RBSUxRX0ZJUlNUKChoZWFkKSkgPT0gKGVsbSkpIHsJCSAgICBcCisJCQlTVEFJTFFfUkVNT1ZFX0hFQUQoKGhlYWQpLCBmaWVsZCk7CSAgICAgIFwKKwkJfQkJCQkgXAorCQllbHNlIHsJCQkJICAgICAgXAorCQkJc3RydWN0IHR5cGUgKmN1cmVsbSA9IFNUQUlMUV9GSVJTVCgoaGVhZCkpOwkgICBcCisJCQl3aGlsZSAoU1RBSUxRX05FWFQoY3VyZWxtLCBmaWVsZCkgIT0gKGVsbSkpCSAgIFwKKwkJCQljdXJlbG0gPSBTVEFJTFFfTkVYVChjdXJlbG0sIGZpZWxkKTsJICAgIFwKKwkJCWlmICgoU1RBSUxRX05FWFQoY3VyZWxtLCBmaWVsZCkgPQkgICAgIFwKKwkJCQkgICAgIFNUQUlMUV9ORVhUKFNUQUlMUV9ORVhUKGN1cmVsbSwgZmllbGQpLCBmaWVsZCkpID09IE5VTEwpIFwKKwkJCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoY3VyZWxtKSwgZmllbGQpOyBcCisJCX0JCQkJIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgICAgU1RBSUxRX1JFTU9WRV9BRlRFUihoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkgXAorCQlpZiAoU1RBSUxRX05FWFQoZWxtLCBmaWVsZCkpIHsJICAgICAgXAorCQkJaWYgKChTVEFJTFFfTkVYVChlbG0sIGZpZWxkKSA9CQkgIFwKKwkJCQkgICAgIFNUQUlMUV9ORVhUKFNUQUlMUV9ORVhUKGVsbSwgZmllbGQpLCBmaWVsZCkpID09IE5VTEwpIFwKKwkJCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwlcCisJCX0JCQkJIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgICAgU1RBSUxRX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkgICAgICAgXAorCQlpZiAoKFNUQUlMUV9GSVJTVCgoaGVhZCkpID0JCSAgICAgICBcCisJCQkgICAgIFNUQUlMUV9ORVhUKFNUQUlMUV9GSVJTVCgoaGVhZCkpLCBmaWVsZCkpID09IE5VTEwpCSAgICAgICBcCisJCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfRklSU1QoKGhlYWQpKTsJICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lICAgIFNUQUlMUV9SRU1PVkVfSEVBRF9VTlRJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CSAgICAgIFwKKwkJaWYgKChTVEFJTFFfRklSU1QoKGhlYWQpKSA9IFNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkpID09IE5VTEwpCSAgIFwKKwkJCShoZWFkKS0+c3RxaF9sYXN0ID0gJlNUQUlMUV9GSVJTVCgoaGVhZCkpOwkgIFwKK30gd2hpbGUgKDApCisKKy8qCisgKiBMaXN0IGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZSAgICBBVEhfTElTVF9IRUFEKG5hbWUsIHR5cGUpCQkJXAorCXN0cnVjdCBuYW1lIHsJCQkJICAgICBcCisJCXN0cnVjdCB0eXBlICpsaF9maXJzdDsgLyogZmlyc3QgZWxlbWVudCAqLwkgICAgICBcCisJfQorCisjaWZuZGVmIExJU1RfSEVBRAorI2RlZmluZSBMSVNUX0hFQUQgQVRIX0xJU1RfSEVBRAorI2VuZGlmCisKKyNkZWZpbmUgICAgTElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJICBcCisJeyBOVUxMIH0KKworI2RlZmluZSAgICBMSVNUX0VOVFJZKHR5cGUpCQkJICAgXAorCXN0cnVjdCB7CQkJCVwKKwkJc3RydWN0IHR5cGUgKmxlX25leHQ7IC8qIG5leHQgZWxlbWVudCAqLwkgICAgXAorCQlzdHJ1Y3QgdHlwZSAqKmxlX3ByZXY7IC8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovCSAgXAorCX0KKworLyoKKyAqIExpc3QgZnVuY3Rpb25zLgorICovCisKKyNkZWZpbmUgICAgTElTVF9FTVBUWShoZWFkKSAgICAoKGhlYWQpLT5saF9maXJzdCA9PSBOVUxMKQorCisjZGVmaW5lICAgIExJU1RfRklSU1QoaGVhZCkgICAgKChoZWFkKS0+bGhfZmlyc3QpCisKKyNkZWZpbmUgICAgTElTVF9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkgICAgIFwKKwlmb3IgKCh2YXIpID0gTElTVF9GSVJTVCgoaGVhZCkpOwkJXAorCSAgICAgKHZhcik7CQkJICAgICAgIFwKKwkgICAgICh2YXIpID0gTElTVF9ORVhUKCh2YXIpLCBmaWVsZCkpCisKKyNkZWZpbmUgICAgTElTVF9GT1JFQUNIX1NBRkUodmFyLCBoZWFkLCBmaWVsZCwgdHZhcikJCVwKKwlmb3IgKCh2YXIpID0gTElTVF9GSVJTVCgoaGVhZCkpOwkJXAorCSAgICAgKHZhcikgJiYgKCh0dmFyKSA9IExJU1RfTkVYVCgodmFyKSwgZmllbGQpLCAxKTsJICAgIFwKKwkgICAgICh2YXIpID0gKHR2YXIpKQorCisjZGVmaW5lICAgIExJU1RfSU5JVChoZWFkKSBkbyB7CQkJICAgICAgIFwKKwkJTElTVF9GSVJTVCgoaGVhZCkpID0gTlVMTDsJCSAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgICAgTElTVF9JTlNFUlRfQUZURVIobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJICBcCisJCWlmICgoTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSBMSVNUX05FWFQoKGxpc3RlbG0pLCBmaWVsZCkpICE9IE5VTEwpIFwKKwkJCUxJU1RfTkVYVCgobGlzdGVsbSksIGZpZWxkKS0+ZmllbGQubGVfcHJldiA9CSAgICBcCisJCQkJJkxJU1RfTkVYVCgoZWxtKSwgZmllbGQpOwkJIFwKKwkJTElTVF9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkgICAgXAorCQkoZWxtKS0+ZmllbGQubGVfcHJldiA9ICZMSVNUX05FWFQoKGxpc3RlbG0pLCBmaWVsZCk7CSAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lICAgIExJU1RfSU5TRVJUX0JFRk9SRShsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkgICBcCisJCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2OwlcCisJCUxJU1RfTkVYVCgoZWxtKSwgZmllbGQpID0gKGxpc3RlbG0pOwkJICAgIFwKKwkJKihsaXN0ZWxtKS0+ZmllbGQubGVfcHJldiA9IChlbG0pOwkJICBcCisJCShsaXN0ZWxtKS0+ZmllbGQubGVfcHJldiA9ICZMSVNUX05FWFQoKGVsbSksIGZpZWxkKTsJICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgICAgTElTVF9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkgIFwKKwkJaWYgKChMSVNUX05FWFQoKGVsbSksIGZpZWxkKSA9IExJU1RfRklSU1QoKGhlYWQpKSkgIT0gTlVMTCkgICAgXAorCQkJTElTVF9GSVJTVCgoaGVhZCkpLT5maWVsZC5sZV9wcmV2ID0gJkxJU1RfTkVYVCgoZWxtKSwgZmllbGQpOyBcCisJCUxJU1RfRklSU1QoKGhlYWQpKSA9IChlbG0pOwkJICAgICAgIFwKKwkJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmTElTVF9GSVJTVCgoaGVhZCkpOwkgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSAgICBMSVNUX05FWFQoZWxtLCBmaWVsZCkgICAgKChlbG0pLT5maWVsZC5sZV9uZXh0KQorCisjZGVmaW5lICAgIExJU1RfUkVNT1ZFKGVsbSwgZmllbGQpIGRvIHsJCQkgICBcCisJCWlmIChMSVNUX05FWFQoKGVsbSksIGZpZWxkKSAhPSBOVUxMKQkJICAgIFwKKwkJCUxJU1RfTkVYVCgoZWxtKSwgZmllbGQpLT5maWVsZC5sZV9wcmV2ID0JIFwKKwkJCQkoZWxtKS0+ZmllbGQubGVfcHJldjsJCSAgICAgXAorCQkqKGVsbSktPmZpZWxkLmxlX3ByZXYgPSBMSVNUX05FWFQoKGVsbSksIGZpZWxkKTsJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFRhaWwgcXVldWUgZGVjbGFyYXRpb25zLgorICovCisjZGVmaW5lICBIRUFETkFNRQorI2RlZmluZSAgQ09QWV9IRUFETkFNRShoZWFkKQorCisjZGVmaW5lICAgIFRBSUxRX0hFQUQobmFtZSwgdHlwZSkJCQkgXAorCXN0cnVjdCBuYW1lIHsJCQkJICAgICBcCisJCXN0cnVjdCB0eXBlICp0cWhfZmlyc3Q7IC8qIGZpcnN0IGVsZW1lbnQgKi8JICAgICAgIFwKKwkJc3RydWN0IHR5cGUgKip0cWhfbGFzdDsgLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwlcCisJCUhFQUROQU1FCQkJICAgIFwKKwkJCVRSQUNFQlVGCQkJICAgIFwKKwl9CisKKyNkZWZpbmUgICAgVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCSAgIFwKKwl7IE5VTEwsICYoaGVhZCkudHFoX2ZpcnN0IH0KKworI2RlZmluZSAgICBUQUlMUV9FTlRSWSh0eXBlKQkJCSAgICBcCisJc3RydWN0IHsJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqdHFlX25leHQ7IC8qIG5leHQgZWxlbWVudCAqLwkgICAgIFwKKwkJc3RydWN0IHR5cGUgKip0cWVfcHJldjsgLyogYWRkcmVzcyBvZiBwcmV2aW91cyBuZXh0IGVsZW1lbnQgKi8JICAgXAorCQlUUkFDRUJVRgkJCSAgICBcCisJfQorCisvKgorICogVGFpbCBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKworI2RlZmluZSAgICBUQUlMUV9FTVBUWShoZWFkKSAgICAoKGhlYWQpLT50cWhfZmlyc3QgPT0gTlVMTCkKKworI2RlZmluZSAgICBUQUlMUV9GSVJTVChoZWFkKSAgICAoKGhlYWQpLT50cWhfZmlyc3QpCisKKyNkZWZpbmUgICAgVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJICAgICAgXAorCWZvciAoKHZhcikgPSBUQUlMUV9GSVJTVCgoaGVhZCkpOwkJIFwKKwkgICAgICh2YXIpOwkJCSAgICAgICBcCisJICAgICAodmFyKSA9IFRBSUxRX05FWFQoKHZhciksIGZpZWxkKSkKKworI2RlZmluZSAgICBUQUlMUV9GT1JFQUNIX1NBRkUodmFyLCBoZWFkLCBmaWVsZCwgdHZhcikJCSBcCisJZm9yICgodmFyKSA9IFRBSUxRX0ZJUlNUKChoZWFkKSk7CQkgXAorCSAgICAgKHZhcikgJiYgKCh0dmFyKSA9IFRBSUxRX05FWFQoKHZhciksIGZpZWxkKSwgMSk7CSAgICAgXAorCSAgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUgICAgVEFJTFFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkKQkgICAgXAorCWZvciAoKHZhcikgPSBUQUlMUV9MQVNUKChoZWFkKSwgaGVhZG5hbWUpOwkgICAgICBcCisJICAgICAodmFyKTsJCQkgICAgICAgXAorCSAgICAgKHZhcikgPSBUQUlMUV9QUkVWKCh2YXIpLCBoZWFkbmFtZSwgZmllbGQpKQorCisjZGVmaW5lICAgIFRBSUxRX0ZPUkVBQ0hfUkVWRVJTRV9TQUZFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkLCB0dmFyKQkgICBcCisJZm9yICgodmFyKSA9IFRBSUxRX0xBU1QoKGhlYWQpLCBoZWFkbmFtZSk7CSAgICAgIFwKKwkgICAgICh2YXIpICYmICgodHZhcikgPSBUQUlMUV9QUkVWKCh2YXIpLCBoZWFkbmFtZSwgZmllbGQpLCAxKTsJICAgXAorCSAgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUgICAgVEFJTFFfSU5JVChoZWFkKSBkbyB7CQkJXAorCQlUQUlMUV9GSVJTVCgoaGVhZCkpID0gTlVMTDsJCSAgICAgICBcCisJCShoZWFkKS0+dHFoX2xhc3QgPSAmVEFJTFFfRklSU1QoKGhlYWQpKTsJICAgIFwKKwkJQ09QWV9IRUFETkFNRShoZWFkKTsJCQkgICAgIFwKKwkJUU1EX1RSQUNFX0hFQUQoaGVhZCk7CQkJICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lICAgIFRBSUxRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CSAgICAgXAorCQlpZiAoKFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKSA9IFRBSUxRX05FWFQoKGxpc3RlbG0pLCBmaWVsZCkpICE9IE5VTEwpIFwKKwkJCVRBSUxRX05FWFQoKGVsbSksIGZpZWxkKS0+ZmllbGQudHFlX3ByZXYgPQkgICBcCisJCQkJJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCSAgXAorCQllbHNlIHsJCQkJICAgICAgXAorCQkJKGhlYWQpLT50cWhfbGFzdCA9ICZUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCk7CSAgICAgXAorCQkJUU1EX1RSQUNFX0hFQUQoaGVhZCk7CQkJIFwKKwkJfQkJCQkgXAorCQlUQUlMUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkgICAgIFwKKwkJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJlRBSUxRX05FWFQoKGxpc3RlbG0pLCBmaWVsZCk7CSAgICAgIFwKKwkJUU1EX1RSQUNFX0VMRU0oJihlbG0pLT5maWVsZCk7CQkJICBcCisJCVFNRF9UUkFDRV9FTEVNKCZsaXN0ZWxtLT5maWVsZCk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lICAgIFRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkgICAgXAorCQkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2OwkgIFwKKwkJVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gKGxpc3RlbG0pOwkJICAgICBcCisJCSoobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGVsbSk7CQkgICBcCisJCShsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkgICAgICBcCisJCVFNRF9UUkFDRV9FTEVNKCYoZWxtKS0+ZmllbGQpOwkJCSAgXAorCQlRTURfVFJBQ0VfRUxFTSgmbGlzdGVsbS0+ZmllbGQpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSAgICBUQUlMUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CSAgICAgICBcCisJCWlmICgoVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gVEFJTFFfRklSU1QoKGhlYWQpKSkgIT0gTlVMTCkJIFwKKwkJCVRBSUxRX0ZJUlNUKChoZWFkKSktPmZpZWxkLnRxZV9wcmV2ID0JCSBcCisJCQkJJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCSAgXAorCQllbHNlCQkJCSAgICBcCisJCQkoaGVhZCktPnRxaF9sYXN0ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJICAgICBcCisJCVRBSUxRX0ZJUlNUKChoZWFkKSkgPSAoZWxtKTsJCQlcCisJCShlbG0pLT5maWVsZC50cWVfcHJldiA9ICZUQUlMUV9GSVJTVCgoaGVhZCkpOwkJIFwKKwkJUU1EX1RSQUNFX0hFQUQoaGVhZCk7CQkJICAgICBcCisJCVFNRF9UUkFDRV9FTEVNKCYoZWxtKS0+ZmllbGQpOwkJCSAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSAgICBUQUlMUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CSAgICAgICBcCisJCVRBSUxRX05FWFQoKGVsbSksIGZpZWxkKSA9IE5VTEw7CQlcCisJCShlbG0pLT5maWVsZC50cWVfcHJldiA9IChoZWFkKS0+dHFoX2xhc3Q7CSAgICAgXAorCQkqKGhlYWQpLT50cWhfbGFzdCA9IChlbG0pOwkJICAgICAgXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCSBcCisJCVFNRF9UUkFDRV9IRUFEKGhlYWQpOwkJCSAgICAgXAorCQlRTURfVFJBQ0VfRUxFTSgmKGVsbSktPmZpZWxkKTsJCQkgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgICAgVEFJTFFfTEFTVChoZWFkLCBoZWFkbmFtZSkJCQkgXAorCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChoZWFkKS0+dHFoX2xhc3QpKS0+dHFoX2xhc3QpKQorCisjZGVmaW5lICAgIFRBSUxRX05FWFQoZWxtLCBmaWVsZCkgKChlbG0pLT5maWVsZC50cWVfbmV4dCkKKworI2RlZmluZSAgICBUQUlMUV9QUkVWKGVsbSwgaGVhZG5hbWUsIGZpZWxkKQkJICAgXAorCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChlbG0pLT5maWVsZC50cWVfcHJldikpLT50cWhfbGFzdCkpCisKKyNkZWZpbmUgICAgVEFJTFFfUkVNT1ZFKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCSAgICAgIFwKKwkJaWYgKChUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkpICE9IE5VTEwpCQkgICAgICAgXAorCQkJVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpLT5maWVsZC50cWVfcHJldiA9CSAgIFwKKwkJCQkoZWxtKS0+ZmllbGQudHFlX3ByZXY7CQkgICAgICBcCisJCWVsc2UgewkJCQkgICAgICBcCisJCQkoaGVhZCktPnRxaF9sYXN0ID0gKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkgXAorCQkJUU1EX1RSQUNFX0hFQUQoaGVhZCk7CQkJIFwKKwkJfQkJCQkgXAorCQkqKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkgIFwKKwkJVFJBU0hJVCgoZWxtKS0+ZmllbGQudHFlX25leHQpOwkJCSAgIFwKKwkJVFJBU0hJVCgoZWxtKS0+ZmllbGQudHFlX3ByZXYpOwkJCSAgIFwKKwkJUU1EX1RSQUNFX0VMRU0oJihlbG0pLT5maWVsZCk7CQkJICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRBSUxRX0NPTkNBVChoZWFkMSwgaGVhZDIsIGZpZWxkKSAgZG8gewkJCSBcCisJCWlmICghVEFJTFFfRU1QVFkoaGVhZDIpKSB7CQkJCSAgICAgXAorCQkJKihoZWFkMSktPnRxaF9sYXN0ID0gKGhlYWQyKS0+dHFoX2ZpcnN0OwkJIFwKKwkJCShoZWFkMiktPnRxaF9maXJzdC0+ZmllbGQudHFlX3ByZXYgPSAoaGVhZDEpLT50cWhfbGFzdDsJIFwKKwkJCShoZWFkMSktPnRxaF9sYXN0ICA9IChoZWFkMiktPnRxaF9sYXN0OwkJCSBcCisJCQlUQUlMUV9JTklUKChoZWFkMikpOwkJCQkJIFwKKwkJfQkJCQkJCQkgICAgIFwKK30gd2hpbGUgKDApCisKKyNpZmRlZiBfS0VSTkVMCisKKy8qCisgKiBYWFggaW5zcXVlKCkgYW5kIHJlbXF1ZSgpIGFyZSBhbiBvbGQgd2F5IG9mIGhhbmRsaW5nIGNlcnRhaW4gcXVldWVzLgorICogVGhleSBib2d1c2x5IGFzc3VtZXMgdGhhdCBhbGwgcXVldWUgaGVhZHMgbG9vayBhbGlrZS4KKyAqLworCitzdHJ1Y3QgcXVlaGVhZCB7CisJc3RydWN0IHF1ZWhlYWQgKnFoX2xpbms7CisJc3RydWN0IHF1ZWhlYWQgKnFoX3JsaW5rOworfTsKKworI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKworc3RhdGljIF9faW5saW5lIHZvaWQgaW5zcXVlKHZvaWQgKmEsIHZvaWQgKmIpCit7CisJc3RydWN0IHF1ZWhlYWQgKmVsZW1lbnQgPSAoc3RydWN0IHF1ZWhlYWQgKilhLAorCSpoZWFkID0gKHN0cnVjdCBxdWVoZWFkICopYjsKKworCWVsZW1lbnQtPnFoX2xpbmsgPSBoZWFkLT5xaF9saW5rOworCWVsZW1lbnQtPnFoX3JsaW5rID0gaGVhZDsKKwloZWFkLT5xaF9saW5rID0gZWxlbWVudDsKKwllbGVtZW50LT5xaF9saW5rLT5xaF9ybGluayA9IGVsZW1lbnQ7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIHJlbXF1ZSh2b2lkICphKQoreworCXN0cnVjdCBxdWVoZWFkICplbGVtZW50ID0gKHN0cnVjdCBxdWVoZWFkICopYTsKKworCWVsZW1lbnQtPnFoX2xpbmstPnFoX3JsaW5rID0gZWxlbWVudC0+cWhfcmxpbms7CisJZWxlbWVudC0+cWhfcmxpbmstPnFoX2xpbmsgPSBlbGVtZW50LT5xaF9saW5rOworCWVsZW1lbnQtPnFoX3JsaW5rID0gMDsKK30KKworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhKF9fR05VQ19fIHx8IF9fSU5URUxfQ09NUElMRVIpICovCisKK3ZvaWQgaW5zcXVlKHZvaWQgKmEsIHZvaWQgKmIpOwordm9pZCByZW1xdWUodm9pZCAqYSk7CisKKyNlbmRpZiAvKiBfX0dOVUNfXyB8fCBfX0lOVEVMX0NPTVBJTEVSICovCisKKyNlbmRpZiAvKiBfS0VSTkVMICovCisKKyNlbmRpZiAvKiAhX1NZU19RVUVVRV9IXyAqLworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhX19OZXRCU0RfXyAqLworI2luY2x1ZGVfbmV4dCA8c3lzL3F1ZXVlLmg+CisjZW5kaWYgLyogX19OZXRCU0RfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC9odHQvaHR0LmMgYi9jb3JlL2RwL2h0dC9odHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQwYTdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9odHQvaHR0LmMKQEAgLTAsMCArMSw1NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGZpbGUgaHR0LmMKKyAqIEBicmllZiBQcm92aWRlIGZ1bmN0aW9ucyB0byBjcmVhdGUraW5pdCBhbmQgZGVzdHJveSBhIEhUVCBpbnN0YW5jZS4KKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYSBIVFQgaW5zdGFuY2U7IGluaXRpYWxpemluZworICogIHRoZSBIVFQgaW5zdGFuY2UsIGUuZy4gYnkgYWxsb2NhdGluZyBhIHBvb2wgb2YgSFRUIHR4IGRlc2NyaXB0b3JzIGFuZAorICogIGNvbm5lY3RpbmcgdGhlIEhUVCBzZXJ2aWNlIHdpdGggSFRDOyBhbmQgZGVsZXRpbmcgYSBIVFQgaW5zdGFuY2UuCisgKi8KKworI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4gICAgICAgICAvKiBjZGZfbWVtX21hbGxvYyAqLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPiAgICAgICAgICAvKiBjZGZfZGV2aWNlX3QsIGNkZl9wcmludCAqLworCisjaW5jbHVkZSA8aHR0Lmg+ICAgICAgICAgICAgICAgIC8qIGh0dF90eF9tc2R1X2Rlc2NfdCAqLworI2luY2x1ZGUgPG9sX2NmZy5oPgorI2luY2x1ZGUgPG9sX3R4cnhfaHR0X2FwaS5oPiAgICAvKiBvbF90eF9kb3dsb2FkX2RvbmVfbGwsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF9odHRfYXBpLmg+CisKKyNpbmNsdWRlIDxodHRfaW50ZXJuYWwuaD4KKyNpbmNsdWRlICJoaWYuaCIKKworI2RlZmluZSBIVFRfSFRDX1BLVF9QT09MX0lOSVRfU0laRSAxMDAgIC8qIGVub3VnaCBmb3IgYSBsYXJnZSBBLU1QRFUgKi8KKworQV9TVEFUVVMoKmh0dF9oMnRfcnhfcmluZ19jZmdfbXNnKShzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisKKyNpZmRlZiBJUEFfT0ZGTE9BRAorQV9TVEFUVVMgaHR0X2lwYV9jb25maWcoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIEFfU1RBVFVTIHN0YXR1cykKK3sKKwlpZiAoKEFfT0sgPT0gc3RhdHVzKSAmJgorCSAgICBvbF9jZmdfaXBhX3VjX29mZmxvYWRfZW5hYmxlZChwZGV2LT5jdHJsX3BkZXYpKQorCQlzdGF0dXMgPSBodHRfaDJ0X2lwYV91Y19yc2NfY2ZnX21zZyhwZGV2KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZGVmaW5lIEhUVF9JUEFfQ09ORklHIGh0dF9pcGFfY29uZmlnCisjZWxzZQorI2RlZmluZSBIVFRfSVBBX0NPTkZJRyhwZGV2LCBzdGF0dXMpIHN0YXR1cyAgICAgLyogbm8tb3AgKi8KKyNlbmRpZiAvKiBJUEFfT0ZGTE9BRCAqLworCitzdHJ1Y3QgaHR0X2h0Y19wa3QgKmh0dF9odGNfcGt0X2FsbG9jKHN0cnVjdCBodHRfcGRldl90ICpwZGV2KQoreworCXN0cnVjdCBodHRfaHRjX3BrdF91bmlvbiAqcGt0ID0gTlVMTDsKKworCUhUVF9UWF9NVVRFWF9BQ1FVSVJFKCZwZGV2LT5odHRfdHhfbXV0ZXgpOworCWlmIChwZGV2LT5odHRfaHRjX3BrdF9mcmVlbGlzdCkgeworCQlwa3QgPSBwZGV2LT5odHRfaHRjX3BrdF9mcmVlbGlzdDsKKwkJcGRldi0+aHR0X2h0Y19wa3RfZnJlZWxpc3QgPSBwZGV2LT5odHRfaHRjX3BrdF9mcmVlbGlzdC0+dS5uZXh0OworCX0KKwlIVFRfVFhfTVVURVhfUkVMRUFTRSgmcGRldi0+aHR0X3R4X211dGV4KTsKKworCWlmIChwa3QgPT0gTlVMTCkKKwkJcGt0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwa3QpKTsKKworCXJldHVybiAmcGt0LT51LnBrdDsgICAgIC8qIG5vdCBhY3R1YWxseSBhIGRlcmVmZXJlbmNlICovCit9CisKK3ZvaWQgaHR0X2h0Y19wa3RfZnJlZShzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwgc3RydWN0IGh0dF9odGNfcGt0ICpwa3QpCit7CisJc3RydWN0IGh0dF9odGNfcGt0X3VuaW9uICp1X3BrdCA9IChzdHJ1Y3QgaHR0X2h0Y19wa3RfdW5pb24gKilwa3Q7CisKKwlIVFRfVFhfTVVURVhfQUNRVUlSRSgmcGRldi0+aHR0X3R4X211dGV4KTsKKwl1X3BrdC0+dS5uZXh0ID0gcGRldi0+aHR0X2h0Y19wa3RfZnJlZWxpc3Q7CisJcGRldi0+aHR0X2h0Y19wa3RfZnJlZWxpc3QgPSB1X3BrdDsKKwlIVFRfVFhfTVVURVhfUkVMRUFTRSgmcGRldi0+aHR0X3R4X211dGV4KTsKK30KKwordm9pZCBodHRfaHRjX3BrdF9wb29sX2ZyZWUoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJc3RydWN0IGh0dF9odGNfcGt0X3VuaW9uICpwa3QsICpuZXh0OworCXBrdCA9IHBkZXYtPmh0dF9odGNfcGt0X2ZyZWVsaXN0OworCXdoaWxlIChwa3QpIHsKKwkJbmV4dCA9IHBrdC0+dS5uZXh0OworCQljZGZfbWVtX2ZyZWUocGt0KTsKKwkJcGt0ID0gbmV4dDsKKwl9CisJcGRldi0+aHR0X2h0Y19wa3RfZnJlZWxpc3QgPSBOVUxMOworfQorCisjaWZkZWYgQVRIXzExQUNfVFhDT01QQUNUCit2b2lkIGh0dF9odGNfbWlzY19wa3RfbGlzdF9hZGQoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsIHN0cnVjdCBodHRfaHRjX3BrdCAqcGt0KQoreworCXN0cnVjdCBodHRfaHRjX3BrdF91bmlvbiAqdV9wa3QgPSAoc3RydWN0IGh0dF9odGNfcGt0X3VuaW9uICopcGt0OworCisJSFRUX1RYX01VVEVYX0FDUVVJUkUoJnBkZXYtPmh0dF90eF9tdXRleCk7CisJaWYgKHBkZXYtPmh0dF9odGNfcGt0X21pc2NsaXN0KSB7CisJCXVfcGt0LT51Lm5leHQgPSBwZGV2LT5odHRfaHRjX3BrdF9taXNjbGlzdDsKKwkJcGRldi0+aHR0X2h0Y19wa3RfbWlzY2xpc3QgPSB1X3BrdDsKKwl9IGVsc2UgeworCQlwZGV2LT5odHRfaHRjX3BrdF9taXNjbGlzdCA9IHVfcGt0OworCX0KKwlIVFRfVFhfTVVURVhfUkVMRUFTRSgmcGRldi0+aHR0X3R4X211dGV4KTsKK30KKwordm9pZCBodHRfaHRjX21pc2NfcGt0X3Bvb2xfZnJlZShzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKwlzdHJ1Y3QgaHR0X2h0Y19wa3RfdW5pb24gKnBrdCwgKm5leHQ7CisJY2RmX25idWZfdCBuZXRidWY7CisJcGt0ID0gcGRldi0+aHR0X2h0Y19wa3RfbWlzY2xpc3Q7CisKKwl3aGlsZSAocGt0KSB7CisJCW5leHQgPSBwa3QtPnUubmV4dDsKKwkJbmV0YnVmID0gKGNkZl9uYnVmX3QpIChwa3QtPnUucGt0Lmh0Y19wa3QucE5ldEJ1ZkNvbnRleHQpOworCQljZGZfbmJ1Zl91bm1hcChwZGV2LT5vc2RldiwgbmV0YnVmLCBDREZfRE1BX1RPX0RFVklDRSk7CisJCWNkZl9uYnVmX2ZyZWUobmV0YnVmKTsKKwkJY2RmX21lbV9mcmVlKHBrdCk7CisJCXBrdCA9IG5leHQ7CisJfQorCXBkZXYtPmh0dF9odGNfcGt0X21pc2NsaXN0ID0gTlVMTDsKK30KKyNlbmRpZgorCisvKioKKyAqIGh0dF9wZGV2X2FsbG9jKCkgLSBhbGxvY2F0ZSBIVFQgcGRldgorICogQHR4cnhfcGRldjogdHhyeCBwZGV2CisgKiBAY3RybF9wZGV2OiBjZmcgcGRldgorICogQGh0Y19wZGV2OiBIVEMgcGRldgorICogQG9zZGV2OiBvcyBkZXZpY2UKKyAqCisgKiBSZXR1cm46IEhUVCBwZGV2IGhhbmRsZQorICovCitodHRfcGRldl9oYW5kbGUKK2h0dF9wZGV2X2FsbG9jKG9sX3R4cnhfcGRldl9oYW5kbGUgdHhyeF9wZGV2LAorCSAgIG9sX3BkZXZfaGFuZGxlIGN0cmxfcGRldiwKKwkgICBIVENfSEFORExFIGh0Y19wZGV2LCBjZGZfZGV2aWNlX3Qgb3NkZXYpCit7CisJc3RydWN0IGh0dF9wZGV2X3QgKnBkZXY7CisKKwlwZGV2ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwZGV2KSk7CisJaWYgKCFwZGV2KQorCQlnb3RvIGZhaWwxOworCisJcGRldi0+b3NkZXYgPSBvc2RldjsKKwlwZGV2LT5jdHJsX3BkZXYgPSBjdHJsX3BkZXY7CisJcGRldi0+dHhyeF9wZGV2ID0gdHhyeF9wZGV2OworCXBkZXYtPmh0Y19wZGV2ID0gaHRjX3BkZXY7CisKKwljZGZfbWVtX3NldCgmcGRldi0+c3RhdHMsIHNpemVvZihwZGV2LT5zdGF0cyksIDApOworCXBkZXYtPmh0dF9odGNfcGt0X2ZyZWVsaXN0ID0gTlVMTDsKKyNpZmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKKwlwZGV2LT5odHRfaHRjX3BrdF9taXNjbGlzdCA9IE5VTEw7CisjZW5kaWYKKwlwZGV2LT5jZmcuZGVmYXVsdF90eF9jb21wX3JlcSA9CisJCQkhb2xfY2ZnX3R4X2ZyZWVfYXRfZG93bmxvYWQocGRldi0+Y3RybF9wZGV2KTsKKworCXBkZXYtPmNmZy5pc19mdWxsX3Jlb3JkZXJfb2ZmbG9hZCA9CisJCQlvbF9jZmdfaXNfZnVsbF9yZW9yZGVyX29mZmxvYWQocGRldi0+Y3RybF9wZGV2KTsKKwljZGZfcHJpbnQoImlzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkZWQ/ICVkXG4iLAorCQkgIChpbnQpcGRldi0+Y2ZnLmlzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkKTsKKworCXBkZXYtPmNmZy5jZV9jbGFzc2lmeV9lbmFibGVkID0KKwkJb2xfY2ZnX2lzX2NlX2NsYXNzaWZ5X2VuYWJsZWQoY3RybF9wZGV2KTsKKwljZGZfcHJpbnQoImNlX2NsYXNzaWZ5X2VuYWJsZWQgJWRcbiIsCisJCSAgcGRldi0+Y2ZnLmNlX2NsYXNzaWZ5X2VuYWJsZWQpOworCisJcGRldi0+dGFyZ2V0ZGVmID0gaHRjX2dldF90YXJnZXRkZWYoaHRjX3BkZXYpOworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorCS8qIFRPRE86IE9LQTogUmVtb3ZlIGhhcmQtY29kaW5nICovCisJSFRUX1NFVF9XSUZJX0lQKHBkZXYsIDIsIDApOworI2VuZGlmIC8qIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KSAqLworCisJLyoKKwkgKiBDb25uZWN0IHRvIEhUQyBzZXJ2aWNlLgorCSAqIFRoaXMgaGFzIHRvIGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgaHR0X3J4X2F0dGFjaCwKKwkgKiBzaW5jZSBodHRfcnhfYXR0YWNoIGludm9sdmVzIHNlbmRpbmcgYSByeCByaW5nIGNvbmZpZ3VyZQorCSAqIG1lc3NhZ2UgdG8gdGhlIHRhcmdldC4KKwkgKi8KKy8qIEFSNjAwNCBkb24ndCBuZWVkIEhUVCBsYXllci4gKi8KKyNpZm5kZWYgQVI2MDA0X0hXCisJaWYgKGh0dF9odGNfYXR0YWNoKHBkZXYpKQorCQlnb3RvIGZhaWwyOworI2VuZGlmCisKKwlyZXR1cm4gcGRldjsKKworZmFpbDI6CisJY2RmX21lbV9mcmVlKHBkZXYpOworCitmYWlsMToKKwlyZXR1cm4gTlVMTDsKKworfQorCisvKioKKyAqIGh0dF9hdHRhY2goKSAtIEFsbG9jYXRlIGFuZCBzZXR1cCBIVFQgVFgvUlggZGVzY3JpcHRvcnMKKyAqIEBwZGV2OiBwZGV2IHB0cgorICogQGRlc2NfcG9vbF9zaXplOiBzaXplIG9mIHR4IGRlc2NyaXB0b3JzCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCisgKi8KK2ludAoraHR0X2F0dGFjaChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwgaW50IGRlc2NfcG9vbF9zaXplKQoreworCWludCBpOworCWVudW0gd2xhbl9mcm1fZm10IGZybV90eXBlOworCWludCByZXQgPSAwOworCisJcmV0ID0gaHR0X3R4X2F0dGFjaChwZGV2LCBkZXNjX3Bvb2xfc2l6ZSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsMTsKKworCXJldCA9IGh0dF9yeF9hdHRhY2gocGRldik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsMjsKKworCUhUVF9UWF9NVVRFWF9JTklUKCZwZGV2LT5odHRfdHhfbXV0ZXgpOworCUhUVF9UWF9OQlVGX1FVRVVFX01VVEVYX0lOSVQocGRldik7CisKKwkvKiBwcmUtYWxsb2NhdGUgc29tZSBIVENfUEFDS0VUIG9iamVjdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSFRUX0hUQ19QS1RfUE9PTF9JTklUX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgaHR0X2h0Y19wa3RfdW5pb24gKnBrdDsKKwkJcGt0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwa3QpKTsKKwkJaWYgKCFwa3QpCisJCQlicmVhazsKKwkJaHR0X2h0Y19wa3RfZnJlZShwZGV2LCAmcGt0LT51LnBrdCk7CisJfQorCisJLyoKKwkgKiBMTCAtIGRvd25sb2FkIGp1c3QgdGhlIGluaXRpYWwgcG9ydGlvbiBvZiB0aGUgZnJhbWUuCisJICogRG93bmxvYWQgZW5vdWdoIHRvIGNvdmVyIHRoZSBlbmNhcHN1bGF0aW9uIGhlYWRlcnMgY2hlY2tlZAorCSAqIGJ5IHRoZSB0YXJnZXQncyB0eCBjbGFzc2lmaWNhdGlvbiBkZXNjcmlwdG9yIGVuZ2luZS4KKwkgKi8KKworCS8qIGFjY291bnQgZm9yIHRoZSA4MDIuMyBvciA4MDIuMTEgaGVhZGVyICovCisJZnJtX3R5cGUgPSBvbF9jZmdfZnJhbWVfdHlwZShwZGV2LT5jdHJsX3BkZXYpOworCWlmIChmcm1fdHlwZSA9PSB3bGFuX2ZybV9mbXRfbmF0aXZlX3dpZmkpIHsKKwkJcGRldi0+ZG93bmxvYWRfbGVuID0gSFRUX1RYX0hEUl9TSVpFX05BVElWRV9XSUZJOworCX0gZWxzZSBpZiAoZnJtX3R5cGUgPT0gd2xhbl9mcm1fZm10XzgwMl8zKSB7CisJCXBkZXYtPmRvd25sb2FkX2xlbiA9IEhUVF9UWF9IRFJfU0laRV9FVEhFUk5FVDsKKwl9IGVsc2UgeworCQljZGZfcHJpbnQoIlVuZXhwZWN0ZWQgZnJhbWUgdHlwZSBzcGVjOiAlZFxuIiwgZnJtX3R5cGUpOworCQlIVFRfQVNTRVJUMCgwKTsKKwl9CisJLyoKKwkgKiBBY2NvdW50IGZvciB0aGUgb3B0aW9uYWwgTDIgLyBldGhlcm5ldCBoZWFkZXIgZmllbGRzOgorCSAqIDgwMi4xUSwgTExDL1NOQVAKKwkgKi8KKwlwZGV2LT5kb3dubG9hZF9sZW4gKz0KKwkJSFRUX1RYX0hEUl9TSVpFXzgwMl8xUSArIEhUVF9UWF9IRFJfU0laRV9MTENfU05BUDsKKworCS8qCisJICogQWNjb3VudCBmb3IgdGhlIHBvcnRpb24gb2YgdGhlIEwzIChJUCkgcGF5bG9hZCB0aGF0IHRoZQorCSAqIHRhcmdldCBuZWVkcyBmb3IgaXRzIHR4IGNsYXNzaWZpY2F0aW9uLgorCSAqLworCXBkZXYtPmRvd25sb2FkX2xlbiArPSBvbF9jZmdfdHhfZG93bmxvYWRfc2l6ZShwZGV2LT5jdHJsX3BkZXYpOworCisJLyoKKwkgKiBBY2NvdW50IGZvciB0aGUgSFRUIHR4IGRlc2NyaXB0b3IsIGluY2x1ZGluZyB0aGUKKwkgKiBIVEMgaGVhZGVyICsgYWxpZ25tZW50IHBhZGRpbmcuCisJICovCisJcGRldi0+ZG93bmxvYWRfbGVuICs9IHNpemVvZihzdHJ1Y3QgaHR0X2hvc3RfdHhfZGVzY190KTsKKworCS8qCisJICogVGhlIFRYQ09NUEFDVCBodHRfdHhfc2NoZWQgZnVuY3Rpb24gdXNlcyBwZGV2LT5kb3dubG9hZF9sZW4KKwkgKiB0byBhcHBseSBmb3IgYWxsIHJlcXVldWVkIHR4IGZyYW1lcy4gIFRodXMsCisJICogcGRldi0+ZG93bmxvYWRfbGVuIGhhcyB0byBiZSB0aGUgbGFyZ2VzdCBkb3dubG9hZCBsZW5ndGggb2YKKwkgKiBhbnkgdHggZnJhbWUgdGhhdCB3aWxsIGJlIGRvd25sb2FkZWQuCisJICogVGhpcyBtYXhpbXVtIGRvd25sb2FkIGxlbmd0aCBpcyBmb3IgbWFuYWdlbWVudCB0eCBmcmFtZXMsCisJICogd2hpY2ggaGF2ZSBhbiA4MDIuMTEgaGVhZGVyLgorCSAqLworI2lmZGVmIEFUSF8xMUFDX1RYQ09NUEFDVAorCXBkZXYtPmRvd25sb2FkX2xlbiA9IHNpemVvZihzdHJ1Y3QgaHR0X2hvc3RfdHhfZGVzY190KQorCQkrIEhUVF9UWF9IRFJfU0laRV9PVVRFUl9IRFJfTUFYIC8qIHdvcnN0IGNhc2UgKi8KKwkJKyBIVFRfVFhfSERSX1NJWkVfODAyXzFRCisJCSsgSFRUX1RYX0hEUl9TSVpFX0xMQ19TTkFQCisJCSsgb2xfY2ZnX3R4X2Rvd25sb2FkX3NpemUocGRldi0+Y3RybF9wZGV2KTsKKyNlbmRpZgorCXBkZXYtPnR4X3NlbmRfY29tcGxldGVfcGFydDIgPSBvbF90eF9kb3dubG9hZF9kb25lX2xsOworCisJLyoKKwkgKiBGb3IgTEwsIHRoZSBGVyByeCBkZXNjIGlzIGFsb25nc2lkZSB0aGUgSFcgcnggZGVzYyBmaWVsZHMgaW4KKwkgKiB0aGUgaHR0X2hvc3RfcnhfZGVzY19iYXNlIHN0cnVjdC8uCisJICovCisJcGRldi0+cnhfZndfZGVzY19vZmZzZXQgPSBSWF9TVERfREVTQ19GV19NU0RVX09GRlNFVDsKKworCWh0dF9oMnRfcnhfcmluZ19jZmdfbXNnID0gaHR0X2gydF9yeF9yaW5nX2NmZ19tc2dfbGw7CisKKwlyZXR1cm4gMDsKKworZmFpbDI6CisJaHR0X3R4X2RldGFjaChwZGV2KTsKKworZmFpbDE6CisJcmV0dXJuIHJldDsKK30KKworQV9TVEFUVVMgaHR0X2F0dGFjaF90YXJnZXQoaHR0X3BkZXZfaGFuZGxlIHBkZXYpCit7CisJQV9TVEFUVVMgc3RhdHVzOworCisJc3RhdHVzID0gaHR0X2gydF92ZXJfcmVxX21zZyhwZGV2KTsKKwlpZiAoc3RhdHVzICE9IEFfT0spCisJCXJldHVybiBzdGF0dXM7CisKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkKKwkvKgorCSAqIFNlbmQgdGhlIGZyYWdfZGVzYyBpbmZvIHRvIHRhcmdldC4KKwkgKi8KKwlodHRfaDJ0X2ZyYWdfZGVzY19iYW5rX2NmZ19tc2cocGRldik7CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisKKworCS8qCisJICogSWYgYXBwbGljYWJsZSwgc2VuZCB0aGUgcnggcmluZyBjb25maWcgbWVzc2FnZSB0byB0aGUgdGFyZ2V0LgorCSAqIFRoZSBob3N0IGNvdWxkIHdhaXQgZm9yIHRoZSBIVFQgdmVyc2lvbiBudW1iZXIgY29uZmlybWF0aW9uIG1lc3NhZ2UKKwkgKiBmcm9tIHRoZSB0YXJnZXQgYmVmb3JlIHNlbmRpbmcgYW55IGZ1cnRoZXIgSFRUIG1lc3NhZ2VzLCBidXQgaXQncworCSAqIHJlYXNvbmFibGUgdG8gYXNzdW1lIHRoYXQgdGhlIGhvc3QgYW5kIHRhcmdldCBIVFQgdmVyc2lvbiBudW1iZXJzCisJICogbWF0Y2gsIGFuZCBwcm9jZWVkIGltbWVkaWF0ZWx5IHdpdGggdGhlIHJlbWFpbmluZyBjb25maWd1cmF0aW9uCisJICogaGFuZHNoYWtpbmcuCisJICovCisKKwlzdGF0dXMgPSBodHRfaDJ0X3J4X3JpbmdfY2ZnX21zZyhwZGV2KTsKKwlzdGF0dXMgPSBIVFRfSVBBX0NPTkZJRyhwZGV2LCBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBodHRfZGV0YWNoKGh0dF9wZGV2X2hhbmRsZSBwZGV2KQoreworCWh0dF9yeF9kZXRhY2gocGRldik7CisJaHR0X3R4X2RldGFjaChwZGV2KTsKKwlodHRfaHRjX3BrdF9wb29sX2ZyZWUocGRldik7CisjaWZkZWYgQVRIXzExQUNfVFhDT01QQUNUCisJaHR0X2h0Y19taXNjX3BrdF9wb29sX2ZyZWUocGRldik7CisjZW5kaWYKKwlIVFRfVFhfTVVURVhfREVTVFJPWSgmcGRldi0+aHR0X3R4X211dGV4KTsKKwlIVFRfVFhfTkJVRl9RVUVVRV9NVVRFWF9ERVNUUk9ZKHBkZXYpOworfQorCisvKioKKyAqIGh0dF9wZGV2X2ZyZWUoKSAtIEZyZWUgSFRUIHBkZXYKKyAqIEBwZGV2OiBodHQgcGRldgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGh0dF9wZGV2X2ZyZWUoaHR0X3BkZXZfaGFuZGxlIHBkZXYpCit7CisJY2RmX21lbV9mcmVlKHBkZXYpOworfQorCit2b2lkIGh0dF9kZXRhY2hfdGFyZ2V0KGh0dF9wZGV2X2hhbmRsZSBwZGV2KQoreworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0ZBU1RQQVRICisvKioKKyAqIGh0dF9wa3RfZGxfbGVuX2dldCgpIEhUVCBwYWNrZXQgZG93bmxvYWQgbGVuZ3RoIGZvciBmYXN0cGF0aCBjYXNlCisgKgorICogQGh0dF9kZXY6IHBvaW50ZXIgdG8gaHR0IGRldmljZS4KKyAqCisgKiBBcyBmcmFnbWVudCBvbmUgYWxyZWFkeSBkb3dubG9hZGVkIEhUVC9IVEMgaGVhZGVyLCBkb3dubG9hZCBsZW5ndGggaXMKKyAqIHJlbWFpbmluZyBieXRlcy4KKyAqCisgKiBSZXR1cm46IGRvd25sb2FkIGxlbmd0aAorICovCitpbnQgaHR0X3BrdF9kbF9sZW5fZ2V0KHN0cnVjdCBodHRfcGRldl90ICpodHRfZGV2KQoreworCXJldHVybiBodHRfZGV2LT5kb3dubG9hZF9sZW4gLSBzaXplb2Yoc3RydWN0IGh0dF9ob3N0X3R4X2Rlc2NfdCk7Cit9CisjZWxzZQoraW50IGh0dF9wa3RfZGxfbGVuX2dldChzdHJ1Y3QgaHR0X3BkZXZfdCAqaHR0X2RldikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgaHR0X2h0Y19hdHRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJSFRDX1NFUlZJQ0VfQ09OTkVDVF9SRVEgY29ubmVjdDsKKwlIVENfU0VSVklDRV9DT05ORUNUX1JFU1AgcmVzcG9uc2U7CisJQV9TVEFUVVMgc3RhdHVzOworCisJY2RmX21lbV9zZXQoJmNvbm5lY3QsIHNpemVvZihjb25uZWN0KSwgMCk7CisJY2RmX21lbV9zZXQoJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpLCAwKTsKKworCWNvbm5lY3QucE1ldGFEYXRhID0gTlVMTDsKKwljb25uZWN0Lk1ldGFEYXRhTGVuZ3RoID0gMDsKKwljb25uZWN0LkVwQ2FsbGJhY2tzLnBDb250ZXh0ID0gcGRldjsKKwljb25uZWN0LkVwQ2FsbGJhY2tzLkVwVHhDb21wbGV0ZSA9IGh0dF9oMnRfc2VuZF9jb21wbGV0ZTsKKwljb25uZWN0LkVwQ2FsbGJhY2tzLkVwVHhDb21wbGV0ZU11bHRpcGxlID0gTlVMTDsKKwljb25uZWN0LkVwQ2FsbGJhY2tzLkVwUmVjdiA9IGh0dF90MmhfbXNnX2hhbmRsZXI7CisKKwkvKiByeCBidWZmZXJzIGN1cnJlbnRseSBhcmUgcHJvdmlkZWQgYnkgSElGLCBub3QgYnkgRXBSZWN2UmVmaWxsICovCisJY29ubmVjdC5FcENhbGxiYWNrcy5FcFJlY3ZSZWZpbGwgPSBOVUxMOworCWNvbm5lY3QuRXBDYWxsYmFja3MuUmVjdlJlZmlsbFdhdGVyTWFyayA9IDE7CisJLyogTi9BLCBmaWxsIGlzIGRvbmUgYnkgSElGICovCisKKwljb25uZWN0LkVwQ2FsbGJhY2tzLkVwU2VuZEZ1bGwgPSBodHRfaDJ0X2Z1bGw7CisJLyoKKwkgKiBTcGVjaWZ5IGhvdyBkZWVwIHRvIGxldCBhIHF1ZXVlIGdldCBiZWZvcmUgaHRjX3NlbmRfcGt0IHdpbGwKKwkgKiBjYWxsIHRoZSBFcFNlbmRGdWxsIGZ1bmN0aW9uIGR1ZSB0byBleGNlc3NpdmUgc2VuZCBxdWV1ZSBkZXB0aC4KKwkgKi8KKwljb25uZWN0Lk1heFNlbmRRdWV1ZURlcHRoID0gSFRUX01BWF9TRU5EX1FVRVVFX0RFUFRIOworCisJLyogZGlzYWJsZSBmbG93IGNvbnRyb2wgZm9yIEhUVCBkYXRhIG1lc3NhZ2Ugc2VydmljZSAqLworI2lmbmRlZiBISUZfU0RJTworCWNvbm5lY3QuQ29ubmVjdGlvbkZsYWdzIHw9IEhUQ19DT05ORUNUX0ZMQUdTX0RJU0FCTEVfQ1JFRElUX0ZMT1dfQ1RSTDsKKyNlbmRpZgorCisJLyogY29ubmVjdCB0byBjb250cm9sIHNlcnZpY2UgKi8KKwljb25uZWN0LlNlcnZpY2VJRCA9IEhUVF9EQVRBX01TR19TVkM7CisKKwlzdGF0dXMgPSBodGNfY29ubmVjdF9zZXJ2aWNlKHBkZXYtPmh0Y19wZGV2LCAmY29ubmVjdCwgJnJlc3BvbnNlKTsKKworCWlmIChzdGF0dXMgIT0gQV9PSykKKwkJcmV0dXJuIC1FSU87ICAgICAgIC8qIGZhaWx1cmUgKi8KKworCXBkZXYtPmh0Y19lbmRwb2ludCA9IHJlc3BvbnNlLkVuZHBvaW50OworI2lmIGRlZmluZWQoSElGX1BDSSkKKwloaWZfc2F2ZV9odGNfaHR0X2NvbmZpZ19lbmRwb2ludChwZGV2LT5odGNfZW5kcG9pbnQpOworI2VuZGlmCisKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCit9CisKKyNpZiBIVFRfREVCVUdfTEVWRUwgPiA1Cit2b2lkIGh0dF9kaXNwbGF5KGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBpbnQgaW5kZW50KQoreworCWNkZl9wcmludCgiJSpzJXM6XG4iLCBpbmRlbnQsICIgIiwgIkhUVCIpOworCWNkZl9wcmludCgiJSpzdHggZGVzYyBwb29sOiAlZCBlbGVtcyBvZiAlZCBieXRlcywgJWQgYWxsb2NhdGVkXG4iLAorCQkgIGluZGVudCArIDQsICIgIiwKKwkJICBwZGV2LT50eF9kZXNjcy5wb29sX2VsZW1zLAorCQkgIHBkZXYtPnR4X2Rlc2NzLnNpemUsIHBkZXYtPnR4X2Rlc2NzLmFsbG9jX2NudCk7CisJY2RmX3ByaW50KCIlKnNyeCByaW5nOiBzcGFjZSBmb3IgJWQgZWxlbXMsIGZpbGxlZCB3aXRoICVkIGJ1ZmZlcnNcbiIsCisJCSAgaW5kZW50ICsgNCwgIiAiLAorCQkgIHBkZXYtPnJ4X3Jpbmcuc2l6ZSwgcGRldi0+cnhfcmluZy5maWxsX2xldmVsKTsKKwljZGZfcHJpbnQoIiUqc2F0ICVwICglI3ggcGFkZHIpXG4iLCBpbmRlbnQgKyA4LCAiICIsCisJCSAgcGRldi0+cnhfcmluZy5idWYucGFkZHJzX3JpbmcsIHBkZXYtPnJ4X3JpbmcuYmFzZV9wYWRkcik7CisJY2RmX3ByaW50KCIlKnNuZXRidWYgcmluZyBAICVwXG4iLCBpbmRlbnQgKyA4LCAiICIsCisJCSAgcGRldi0+cnhfcmluZy5idWYubmV0YnVmc19yaW5nKTsKKwljZGZfcHJpbnQoIiUqc0ZXX0lEWCBzaGFkb3cgcmVnaXN0ZXI6IHZhZGRyID0gJXAsIHBhZGRyID0gJSN4XG4iLAorCQkgIGluZGVudCArIDgsICIgIiwKKwkJICBwZGV2LT5yeF9yaW5nLmFsbG9jX2lkeC52YWRkciwgcGRldi0+cnhfcmluZy5hbGxvY19pZHgucGFkZHIpOworCWNkZl9wcmludCgiJSpzU1cgZW5xdWV1ZSBpZHg9ICVkLCBTVyBkZXF1ZXVlIGlkeDogZGVzYz0gJWQsIGJ1Zj0gJWRcbiIsCisJCSAgaW5kZW50ICsgOCwgIiAiLCAqcGRldi0+cnhfcmluZy5hbGxvY19pZHgudmFkZHIsCisJCSAgcGRldi0+cnhfcmluZy5zd19yZF9pZHgubXNkdV9kZXNjLAorCQkgIHBkZXYtPnJ4X3Jpbmcuc3dfcmRfaWR4Lm1zZHVfcGF5bGQpOworfQorI2VuZGlmCisKKy8qIERpc2FibGUgQVNQTSA6IERpc2FibGUgUENJZSBsb3cgcG93ZXIgKi8KK3ZvaWQgaHR0X2h0Y19kaXNhYmxlX2FzcG0odm9pZCkKK3sKKwlodGNfZGlzYWJsZV9hc3BtKCk7Cit9CisKKyNpZmRlZiBJUEFfT0ZGTE9BRAorLyoKKyAqIEF0dGFjaCByZXNvdXJjZSBmb3IgbWljcm8gY29udHJvbGxlciBkYXRhIHBhdGgKKyAqLworaW50IGh0dF9pcGFfdWNfYXR0YWNoKHN0cnVjdCBodHRfcGRldl90ICpwZGV2KQoreworCWludCBlcnJvcjsKKworCS8qIFRYIHJlc291cmNlIGF0dGFjaCAqLworCWVycm9yID0gaHR0X3R4X2lwYV91Y19hdHRhY2goCisJCXBkZXYsCisJCW9sX2NmZ19pcGFfdWNfdHhfYnVmX3NpemUocGRldi0+Y3RybF9wZGV2KSwKKwkJb2xfY2ZnX2lwYV91Y190eF9tYXhfYnVmX2NudChwZGV2LT5jdHJsX3BkZXYpLAorCQlvbF9jZmdfaXBhX3VjX3R4X3BhcnRpdGlvbl9iYXNlKHBkZXYtPmN0cmxfcGRldikpOworCWlmIChlcnJvcikgeworCQljZGZfcHJpbnQoIkhUVCBJUEEgVUMgVFggYXR0YWNoIGZhaWwgY29kZSAlZFxuIiwgZXJyb3IpOworCQlIVFRfQVNTRVJUMCgwKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qIFJYIHJlc291cmNlIGF0dGFjaCAqLworCWVycm9yID0gaHR0X3J4X2lwYV91Y19hdHRhY2goCisJCXBkZXYsCisJCW9sX2NmZ19pcGFfdWNfcnhfaW5kX3Jpbmdfc2l6ZShwZGV2LT5jdHJsX3BkZXYpKTsKKwlpZiAoZXJyb3IpIHsKKwkJY2RmX3ByaW50KCJIVFQgSVBBIFVDIFJYIGF0dGFjaCBmYWlsIGNvZGUgJWRcbiIsIGVycm9yKTsKKwkJaHR0X3R4X2lwYV91Y19kZXRhY2gocGRldik7CisJCUhUVF9BU1NFUlQwKDApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLworfQorCit2b2lkIGh0dF9pcGFfdWNfZGV0YWNoKHN0cnVjdCBodHRfcGRldl90ICpwZGV2KQoreworCS8qIFRYIElQQSBtaWNybyBjb250cm9sbGVyIGRldGFjaCAqLworCWh0dF90eF9pcGFfdWNfZGV0YWNoKHBkZXYpOworCisJLyogUlggSVBBIG1pY3JvIGNvbnRyb2xsZXIgZGV0YWNoICovCisJaHR0X3J4X2lwYV91Y19kZXRhY2gocGRldik7Cit9CisKKy8qCisgKiBEaXN0cmlidXRlIG1pY3JvIGNvbnRyb2xsZXIgcmVzb3VyY2UgdG8gY29udHJvbCBtb2R1bGUKKyAqLworaW50CitodHRfaXBhX3VjX2dldF9yZXNvdXJjZShodHRfcGRldl9oYW5kbGUgcGRldiwKKwkJCXVpbnQzMl90ICpjZV9zcl9iYXNlX3BhZGRyLAorCQkJdWludDMyX3QgKmNlX3NyX3Jpbmdfc2l6ZSwKKwkJCWNkZl9kbWFfYWRkcl90ICpjZV9yZWdfcGFkZHIsCisJCQl1aW50MzJfdCAqdHhfY29tcF9yaW5nX2Jhc2VfcGFkZHIsCisJCQl1aW50MzJfdCAqdHhfY29tcF9yaW5nX3NpemUsCisJCQl1aW50MzJfdCAqdHhfbnVtX2FsbG9jX2J1ZmZlciwKKwkJCXVpbnQzMl90ICpyeF9yZHlfcmluZ19iYXNlX3BhZGRyLAorCQkJdWludDMyX3QgKnJ4X3JkeV9yaW5nX3NpemUsCisJCQl1aW50MzJfdCAqcnhfcHJvY19kb25lX2lkeF9wYWRkcikKK3sKKwkvKiBSZWxlYXNlIGFsbG9jYXRlZCByZXNvdXJjZSB0byBjbGllbnQgKi8KKwkqdHhfY29tcF9yaW5nX2Jhc2VfcGFkZHIgPQorCQkodWludDMyX3QpIHBkZXYtPmlwYV91Y190eF9yc2MudHhfY29tcF9iYXNlLnBhZGRyOworCSp0eF9jb21wX3Jpbmdfc2l6ZSA9CisJCSh1aW50MzJfdCkgb2xfY2ZnX2lwYV91Y190eF9tYXhfYnVmX2NudChwZGV2LT5jdHJsX3BkZXYpOworCSp0eF9udW1fYWxsb2NfYnVmZmVyID0gKHVpbnQzMl90KSBwZGV2LT5pcGFfdWNfdHhfcnNjLmFsbG9jX3R4X2J1Zl9jbnQ7CisJKnJ4X3JkeV9yaW5nX2Jhc2VfcGFkZHIgPQorCQkodWludDMyX3QpIHBkZXYtPmlwYV91Y19yeF9yc2MucnhfaW5kX3JpbmdfYmFzZS5wYWRkcjsKKwkqcnhfcmR5X3Jpbmdfc2l6ZSA9ICh1aW50MzJfdCkgcGRldi0+aXBhX3VjX3J4X3JzYy5yeF9pbmRfcmluZ19zaXplOworCSpyeF9wcm9jX2RvbmVfaWR4X3BhZGRyID0KKwkJKHVpbnQzMl90KSBwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4X2lwYV9wcmNfZG9uZV9pZHgucGFkZHI7CisKKwkvKiBHZXQgY29weSBlbmdpbmUsIGJ1cyByZXNvdXJjZSAqLworCWh0Y19pcGFfZ2V0X2NlX3Jlc291cmNlKHBkZXYtPmh0Y19wZGV2LAorCQkJCWNlX3NyX2Jhc2VfcGFkZHIsCisJCQkJY2Vfc3JfcmluZ19zaXplLCBjZV9yZWdfcGFkZHIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEaXN0cmlidXRlIG1pY3JvIGNvbnRyb2xsZXIgZG9vcmJlbGwgcmVnaXN0ZXIgdG8gZmlybXdhcmUKKyAqLworaW50CitodHRfaXBhX3VjX3NldF9kb29yYmVsbF9wYWRkcihodHRfcGRldl9oYW5kbGUgcGRldiwKKwkJCSAgICAgIHVpbnQzMl90IGlwYV91Y190eF9kb29yYmVsbF9wYWRkciwKKwkJCSAgICAgIHVpbnQzMl90IGlwYV91Y19yeF9kb29yYmVsbF9wYWRkcikKK3sKKwlwZGV2LT5pcGFfdWNfdHhfcnNjLnR4X2NvbXBfaWR4X3BhZGRyID0gaXBhX3VjX3R4X2Rvb3JiZWxsX3BhZGRyOworCXBkZXYtPmlwYV91Y19yeF9yc2MucnhfcmR5X2lkeF9wYWRkciA9IGlwYV91Y19yeF9kb29yYmVsbF9wYWRkcjsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBJUEFfT0ZGTE9BRCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC9odHQvaHR0X2Z3X3N0YXRzLmMgYi9jb3JlL2RwL2h0dC9odHRfZndfc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWU2MjdkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9odHQvaHR0X2Z3X3N0YXRzLmMKQEAgLTAsMCArMSwxMTU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIGh0dF9md19zdGF0cy5jCisgKiBAYnJpZWYgUHJvdmlkZSBmdW5jdGlvbnMgdG8gcHJvY2VzcyBGVyBzdGF0dXMgcmV0cmlldmVkIGZyb20gRlcuCisgKi8KKworI2luY2x1ZGUgPGh0Y19hcGkuaD4gICAgICAgICAgICAvKiBIVENfUEFDS0VUICovCisjaW5jbHVkZSA8aHR0Lmg+ICAgICAgICAgICAgICAgIC8qIEhUVF9UMkhfTVNHX1RZUEUsIGV0Yy4gKi8KKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCAqLworI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4gICAgICAgICAvKiBjZGZfbWVtX3NldCAqLworI2luY2x1ZGUgPG9sX2Z3X3R4X2RiZy5oPiAgICAgICAvKiBvbF9md190eF9kYmdfcHBkdV9iYXNlICovCisKKyNpbmNsdWRlIDxvbF9odHRfcnhfYXBpLmg+CisjaW5jbHVkZSA8b2xfdHhyeF9odHRfYXBpLmg+ICAgIC8qIGh0dF90eF9zdGF0dXMgKi8KKworI2luY2x1ZGUgPGh0dF9pbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8d2xhbl9kZWZzLmg+CisKKyNkZWZpbmUgUk9VTkRfVVBfVE9fNCh2YWwpICgoKHZhbCkgKyAzKSAmIH4weDMpCisKKworc3RhdGljIGNoYXIgKmJ3X3N0cl9hcnJbXSA9IHsiMjBNSHoiLCAiNDBNSHoiLCAiODBNSHoiLCAiMTYwTUh6In07CisKKy8qCisgKiBEZWZpbmVkIHRoZSBtYWNybyB0eF9yYXRlX3N0YXRzX3ByaW50X2NtbigpCisgKiBzbyB0aGF0IHRoaXMgY291bGQgYmUgdXNlZCBpbiBib3RoCisgKiBodHRfdDJoX3N0YXRzX3R4X3JhdGVfc3RhdHNfcHJpbnQoKSAmCisgKiBodHRfdDJoX3N0YXRzX3R4X3JhdGVfc3RhdHNfcHJpbnRfdjIoKS4KKyAqIEVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zIHRha2UgYSBkaWZmZXJlbnQgc3RydWN0dXJlIGFzIGFyZ3VtZW50LAorICogYnV0IHdpdGggY29tbW9uIGZpZWxkcyBpbiB0aGUgc3RydWN0dXJlcy0tc28gdXNpbmcgYSBtYWNybworICogdG8gYnlwYXNzIHRoZSBzdHJvbmcgdHlwZS1jaGVja2luZyBvZiBhIGZ1bmN0aW9uIHNlZW1zIGEgc2ltcGxlCisgKiB0cmljayB0byB1c2UgdG8gYXZvaWQgdGhlIGNvZGUgZHVwbGljYXRpb24uCisgKi8KKyNkZWZpbmUgdHhfcmF0ZV9zdGF0c19wcmludF9jbW4oX3R4X3JhdGVfaW5mbywgX2NvbmNpc2UpIFwKK3sJCQkJCQkJCQkJCQkJCVwKKwlpbnQgaTsJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCVwKKwljZGZfcHJpbnQoIlRYIFJhdGUgSW5mbzpcbiIpOwkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJXAorCS8qIE1DUyAqLwkJCQkJCQkJCQkJXAorCWNkZl9wcmludCgiTUNTIGNvdW50cyAoMC4uOSk6ICIpOwkJCQkJXAorCWNkZl9wcmludCgiJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsXAorCQkgIF90eF9yYXRlX2luZm8tPm1jc1swXSwJCQkJCQlcCisJCSAgX3R4X3JhdGVfaW5mby0+bWNzWzFdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5tY3NbMl0sCQkJCQkJXAorCQkgIF90eF9yYXRlX2luZm8tPm1jc1szXSwJCQkJCQlcCisJCSAgX3R4X3JhdGVfaW5mby0+bWNzWzRdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5tY3NbNV0sCQkJCQkJXAorCQkgIF90eF9yYXRlX2luZm8tPm1jc1s2XSwJCQkJCQlcCisJCSAgX3R4X3JhdGVfaW5mby0+bWNzWzddLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5tY3NbOF0sCQkJCQkJXAorCQkgIF90eF9yYXRlX2luZm8tPm1jc1s5XSk7CQkJCQkJXAorCQkJCQkJCQkJCQkJCQlcCisJLyogU0dJICovCQkJCQkJCQkJCQlcCisJY2RmX3ByaW50KCJTR0kgY291bnRzICgwLi45KTogIik7CQkJCQlcCisJY2RmX3ByaW50KCIlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIixcCisJCSAgX3R4X3JhdGVfaW5mby0+c2dpWzBdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zZ2lbMV0sCQkJCQkJXAorCQkgIF90eF9yYXRlX2luZm8tPnNnaVsyXSwJCQkJCQlcCisJCSAgX3R4X3JhdGVfaW5mby0+c2dpWzNdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zZ2lbNF0sCQkJCQkJXAorCQkgIF90eF9yYXRlX2luZm8tPnNnaVs1XSwJCQkJCQlcCisJCSAgX3R4X3JhdGVfaW5mby0+c2dpWzZdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zZ2lbN10sCQkJCQkJXAorCQkgIF90eF9yYXRlX2luZm8tPnNnaVs4XSwJCQkJCQlcCisJCSAgX3R4X3JhdGVfaW5mby0+c2dpWzldKTsJCQkJCQlcCisJCQkJCQkJCQkJCQkJCVwKKwkvKiBOU1MgKi8JCQkJCQkJCQkJCVwKKwljZGZfcHJpbnQoIk5TUyAgY291bnRzOiAiKTsJCQkJCQkJXAorCWNkZl9wcmludCgiMXgxICVkLCAyeDIgJWQsIDN4MyAlZFxuIiwJCQkJXAorCQkgIF90eF9yYXRlX2luZm8tPm5zc1swXSwJCQkJCQlcCisJCSAgX3R4X3JhdGVfaW5mby0+bnNzWzFdLCBfdHhfcmF0ZV9pbmZvLT5uc3NbMl0pO1wKKwkJCQkJCQkJCQkJCQkJXAorCS8qIEJXICovCQkJCQkJCQkJCQlcCisJY2RmX3ByaW50KCJCVyBjb3VudHM6ICIpOwkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCVwKKwlmb3IgKGkgPSAwOwkJCQkJCQkJCQkJXAorCQlpIDwgc2l6ZW9mKF90eF9yYXRlX2luZm8tPmJ3KSAvIHNpemVvZihfdHhfcmF0ZV9pbmZvLT5id1swXSk7XAorCQlpKyspIHsJCQkJCQkJCQkJCVwKKwkJCWNkZl9wcmludCgiJXMgJWQgIiwgYndfc3RyX2FycltpXSwgX3R4X3JhdGVfaW5mby0+YndbaV0pO1wKKwl9CQkJCQkJCQkJCQkJCVwKKwljZGZfcHJpbnQoIlxuIik7CQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQlcCisJLyogUHJlYW1ibGUgKi8JCQkJCQkJCQkJXAorCWNkZl9wcmludCgiUHJlYW1ibGUgKE8gQyBIIFYpIGNvdW50czogIik7CQkJXAorCWNkZl9wcmludCgiJWQsICVkLCAlZCwgJWRcbiIsCQkJCQkJXAorCQkgIF90eF9yYXRlX2luZm8tPnByZWFtWzBdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5wcmVhbVsxXSwJCQkJCQlcCisJCSAgX3R4X3JhdGVfaW5mby0+cHJlYW1bMl0sCQkJCQkJXAorCQkgIF90eF9yYXRlX2luZm8tPnByZWFtWzNdKTsJCQkJCQlcCisJCQkJCQkJCQkJCQkJCVwKKwkvKiBTVEJDIHJhdGUgY291bnRzICovCQkJCQkJCQlcCisJY2RmX3ByaW50KCJTVEJDIHJhdGUgY291bnRzICgwLi45KTogIik7CQkJCVwKKwljZGZfcHJpbnQoIiVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLFwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zdGJjWzBdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zdGJjWzFdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zdGJjWzJdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zdGJjWzNdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zdGJjWzRdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zdGJjWzVdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zdGJjWzZdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zdGJjWzddLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zdGJjWzhdLAkJCQkJCVwKKwkJICBfdHhfcmF0ZV9pbmZvLT5zdGJjWzldKTsJCQkJCQlcCisJCQkJCQkJCQkJCQkJCVwKKwkvKiBMRFBDIGFuZCBUeEJGIGNvdW50cyAqLwkJCQkJCQlcCisJY2RmX3ByaW50KCJMRFBDIENvdW50czogIik7CQkJCQkJCVwKKwljZGZfcHJpbnQoIiVkXG4iLCBfdHhfcmF0ZV9pbmZvLT5sZHBjKTsJCQkJXAorCWNkZl9wcmludCgiUlRTIENvdW50czogIik7CQkJCQkJCVwKKwljZGZfcHJpbnQoIiVkXG4iLCBfdHhfcmF0ZV9pbmZvLT5ydHNfY250KTsJCQlcCisJLyogUlNTSSBWYWx1ZXMgZm9yIGxhc3QgYWNrIGZyYW1lcyAqLwkJCQlcCisJY2RmX3ByaW50KCJBY2sgUlNTSTogJWRcbiIsIF90eF9yYXRlX2luZm8tPmFja19yc3NpKTtcCit9CisKK3N0YXRpYyB2b2lkIGh0dF90Mmhfc3RhdHNfdHhfcmF0ZV9zdGF0c19wcmludCh3bGFuX2RiZ190eF9yYXRlX2luZm9fdCAqCisJCQkJCSAgICAgIHR4X3JhdGVfaW5mbywgaW50IGNvbmNpc2UpCit7CisJdHhfcmF0ZV9zdGF0c19wcmludF9jbW4odHhfcmF0ZV9pbmZvLCBjb25jaXNlKTsKK30KKworc3RhdGljIHZvaWQgaHR0X3QyaF9zdGF0c190eF9yYXRlX3N0YXRzX3ByaW50X3YyKHdsYW5fZGJnX3R4X3JhdGVfaW5mb192Ml90ICoKKwkJCQkJICAgICAgdHhfcmF0ZV9pbmZvLCBpbnQgY29uY2lzZSkKK3sKKwl0eF9yYXRlX3N0YXRzX3ByaW50X2Ntbih0eF9yYXRlX2luZm8sIGNvbmNpc2UpOworfQorCisvKgorICogRGVmaW5lZCB0aGUgbWFjcm8gcnhfcmF0ZV9zdGF0c19wcmludF9jbW4oKQorICogc28gdGhhdCB0aGlzIGNvdWxkIGJlIHVzZWQgaW4gYm90aAorICogaHR0X3QyaF9zdGF0c19yeF9yYXRlX3N0YXRzX3ByaW50KCkgJgorICogaHR0X3QyaF9zdGF0c19yeF9yYXRlX3N0YXRzX3ByaW50X3YyKCkuCisgKiBFYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyB0YWtlIGEgZGlmZmVyZW50IHN0cnVjdHVyZSBhcyBhcmd1bWVudCwKKyAqIGJ1dCB3aXRoIGNvbW1vbiBmaWVsZHMgaW4gdGhlIHN0cnVjdHVyZXMgLS0gc28gdXNpbmcgYSBtYWNybworICogdG8gYnlwYXNzIHRoZSBzdHJvbmcgdHlwZS1jaGVja2luZyBvZiBhIGZ1bmN0aW9uIHNlZW1zIGEgc2ltcGxlCisgKiB0cmljayB0byB1c2UgdG8gYXZvaWQgdGhlIGNvZGUgZHVwbGljYXRpb24uCisgKi8KKyNkZWZpbmUgcnhfcmF0ZV9zdGF0c19wcmludF9jbW4oX3J4X3BoeV9pbmZvLCBfY29uY2lzZSkgXAorewkJCQkJCQkJCQkJCQkJXAorCWludCBpOwkJCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJXAorCWNkZl9wcmludCgiUlggUmF0ZSBJbmZvOlxuIik7CQkJCQkJXAorCQkJCQkJCQkJCQkJCQlcCisJLyogTUNTICovCQkJCQkJCQkJCQlcCisJY2RmX3ByaW50KCJNQ1MgY291bnRzICgwLi45KTogIik7CQkJCQlcCisJY2RmX3ByaW50KCIlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIixcCisJCSAgX3J4X3BoeV9pbmZvLT5tY3NbMF0sCQkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPm1jc1sxXSwJCQkJCQkJXAorCQkgIF9yeF9waHlfaW5mby0+bWNzWzJdLAkJCQkJCQlcCisJCSAgX3J4X3BoeV9pbmZvLT5tY3NbM10sCQkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPm1jc1s0XSwJCQkJCQkJXAorCQkgIF9yeF9waHlfaW5mby0+bWNzWzVdLAkJCQkJCQlcCisJCSAgX3J4X3BoeV9pbmZvLT5tY3NbNl0sCQkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPm1jc1s3XSwJCQkJCQkJXAorCQkgIF9yeF9waHlfaW5mby0+bWNzWzhdLAkJCQkJCQlcCisJCSAgX3J4X3BoeV9pbmZvLT5tY3NbOV0pOwkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJXAorCS8qIFNHSSAqLwkJCQkJCQkJCQkJXAorCWNkZl9wcmludCgiU0dJIGNvdW50cyAoMC4uOSk6ICIpOwkJCQkJXAorCWNkZl9wcmludCgiJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsXAorCQkgIF9yeF9waHlfaW5mby0+c2dpWzBdLAkJCQkJCQlcCisJCSAgX3J4X3BoeV9pbmZvLT5zZ2lbMV0sCQkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnNnaVsyXSwJCQkJCQkJXAorCQkgIF9yeF9waHlfaW5mby0+c2dpWzNdLAkJCQkJCQlcCisJCSAgX3J4X3BoeV9pbmZvLT5zZ2lbNF0sCQkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnNnaVs1XSwJCQkJCQkJXAorCQkgIF9yeF9waHlfaW5mby0+c2dpWzZdLAkJCQkJCQlcCisJCSAgX3J4X3BoeV9pbmZvLT5zZ2lbN10sCQkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnNnaVs4XSwJCQkJCQkJXAorCQkgIF9yeF9waHlfaW5mby0+c2dpWzldKTsJCQkJCQlcCisJCQkJCQkJCQkJCQkJCVwKKwkvKiBOU1MgKi8JCQkJCQkJCQkJCVwKKwljZGZfcHJpbnQoIk5TUyAgY291bnRzOiAiKTsJCQkJCQkJXAorCS8qIG5zc1swXSBqdXN0IGhvbGRzIHRoZSBjb3VudCBvZiBub24tc3RiYyBmcmFtZXMgdGhhdCB3ZXJlIHNlbnQgYXQgMXgxIFwKKwkgKiByYXRlcyBhbmQgbnN0cyBob2xkcyB0aGUgY291bnQgb2YgZnJhbWVzIHNlbnQgd2l0aCBzdGJjLglcCisJICogSXQgd2FzIGRlY2lkZWQgdG8gbm90IGluY2x1ZGUgUFBEVXMgc2VudCB3LyBTVEJDIGluIG5zc1swXVwKKwkgKiBzaW5jZSBpdCB3b3VsZCBiZSBlYXNpZXIgdG8gY2hhbmdlIHRoZSB2YWx1ZSB0aGF0IG5lZWRzIHRvIGJlXAorCSAqIHByaW50ZWQgKGZyb20gInN0YmMrbm9uLXN0YmMgY291bnQgdG8gb25seSBub24tc3RiYyBjb3VudCIpXAorCSAqIGlmIG5lZWRlZCBpbiB0aGUgZnV0dXJlLiBIZW5jZSB0aGUgYWRkaXRpb24gaW4gdGhlIGhvc3QgY29kZVwKKwkgKiBhdCB0aGlzIGxpbmUuICovCQkJCQkJCQkJXAorCWNkZl9wcmludCgiMXgxICVkLCAyeDIgJWQsIDN4MyAlZCwgNHg0ICVkXG4iLAkJXAorCQkgIF9yeF9waHlfaW5mby0+bnNzWzBdICsgX3J4X3BoeV9pbmZvLT5uc3RzLAlcCisJCSAgX3J4X3BoeV9pbmZvLT5uc3NbMV0sCQkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPm5zc1syXSwJCQkJCQkJXAorCQkgIF9yeF9waHlfaW5mby0+bnNzWzNdKTsJCQkJCQlcCisJCQkJCQkJCQkJCQkJCVwKKwkvKiBOU1RTICovCQkJCQkJCQkJCQlcCisJY2RmX3ByaW50KCJOU1RTIGNvdW50OiAiKTsJCQkJCQkJXAorCWNkZl9wcmludCgiJWRcbiIsIF9yeF9waHlfaW5mby0+bnN0cyk7CQkJCVwKKwkJCQkJCQkJCQkJCQkJXAorCS8qIEJXICovCQkJCQkJCQkJCQlcCisJY2RmX3ByaW50KCJCVyBjb3VudHM6ICIpOwkJCQkJCQlcCisJZm9yIChpID0gMDsJCQkJCQkJCQkJCVwKKwkJaSA8IHNpemVvZihfcnhfcGh5X2luZm8tPmJ3KSAvIHNpemVvZihfcnhfcGh5X2luZm8tPmJ3WzBdKTsJXAorCQlpKyspIHsJCQkJCQkJCQkJCVwKKwkJCWNkZl9wcmludCgiJXMgJWQgIiwgYndfc3RyX2FycltpXSwgX3J4X3BoeV9pbmZvLT5id1tpXSk7XAorCX0JCQkJCQkJCQkJCQkJXAorCWNkZl9wcmludCgiXG4iKTsJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCVwKKwkvKiBQcmVhbWJsZSAqLwkJCQkJCQkJCQlcCisJY2RmX3ByaW50KCJQcmVhbWJsZSBjb3VudHM6ICIpOwkJCQkJCVwKKwljZGZfcHJpbnQoIiVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnByZWFtWzBdLAkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnByZWFtWzFdLAkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnByZWFtWzJdLAkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnByZWFtWzNdLAkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnByZWFtWzRdLAkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnByZWFtWzVdKTsJCQkJCQlcCisJCQkJCQkJCQkJCQkJCVwKKwkvKiBTVEJDIHJhdGUgY291bnRzICovCQkJCQkJCQlcCisJY2RmX3ByaW50KCJTVEJDIHJhdGUgY291bnRzICgwLi45KTogIik7CQkJCVwKKwljZGZfcHJpbnQoIiVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLFwKKwkJICBfcnhfcGh5X2luZm8tPnN0YmNbMF0sCQkJCQkJXAorCQkgIF9yeF9waHlfaW5mby0+c3RiY1sxXSwJCQkJCQlcCisJCSAgX3J4X3BoeV9pbmZvLT5zdGJjWzJdLAkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnN0YmNbM10sCQkJCQkJXAorCQkgIF9yeF9waHlfaW5mby0+c3RiY1s0XSwJCQkJCQlcCisJCSAgX3J4X3BoeV9pbmZvLT5zdGJjWzVdLAkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnN0YmNbNl0sCQkJCQkJXAorCQkgIF9yeF9waHlfaW5mby0+c3RiY1s3XSwJCQkJCQlcCisJCSAgX3J4X3BoeV9pbmZvLT5zdGJjWzhdLAkJCQkJCVwKKwkJICBfcnhfcGh5X2luZm8tPnN0YmNbOV0pOwkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJXAorCS8qIExEUEMgYW5kIFR4QkYgY291bnRzICovCQkJCQkJCVwKKwljZGZfcHJpbnQoIkxEUEMgVFhCRiBDb3VudHM6ICIpOwkJCQkJXAorCWNkZl9wcmludCgiJWQsICVkXG4iLCBfcnhfcGh5X2luZm8tPmxkcGMsIF9yeF9waHlfaW5mby0+dHhiZik7XAorCS8qIFJTU0kgVmFsdWVzIGZvciBsYXN0IHJlY2VpdmVkIGZyYW1lcyAqLwkJCVwKKwljZGZfcHJpbnQoIlJTU0kgKGRhdGEsIG1nbXQpOiAlZCwgJWRcbiIsIF9yeF9waHlfaW5mby0+ZGF0YV9yc3NpLFwKKwkJICBfcnhfcGh5X2luZm8tPm1nbXRfcnNzaSk7CQkJCQkJXAorCQkJCQkJCQkJCQkJCQlcCisJY2RmX3ByaW50KCJSU1NJIENoYWluIDAgKDB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeClcbiIsXAorCQkgICgoX3J4X3BoeV9pbmZvLT5yc3NpX2NoYWluMCA+PiAyNCkgJiAweGZmKSwJXAorCQkgICgoX3J4X3BoeV9pbmZvLT5yc3NpX2NoYWluMCA+PiAxNikgJiAweGZmKSwJXAorCQkgICgoX3J4X3BoeV9pbmZvLT5yc3NpX2NoYWluMCA+PiA4KSAmIDB4ZmYpLAlcCisJCSAgKChfcnhfcGh5X2luZm8tPnJzc2lfY2hhaW4wID4+IDApICYgMHhmZikpOwlcCisJCQkJCQkJCQkJCQkJCVwKKwljZGZfcHJpbnQoIlJTU0kgQ2hhaW4gMSAoMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4KVxuIixcCisJCSAgKChfcnhfcGh5X2luZm8tPnJzc2lfY2hhaW4xID4+IDI0KSAmIDB4ZmYpLAlcCisJCSAgKChfcnhfcGh5X2luZm8tPnJzc2lfY2hhaW4xID4+IDE2KSAmIDB4ZmYpLAlcCisJCSAgKChfcnhfcGh5X2luZm8tPnJzc2lfY2hhaW4xID4+IDgpICYgMHhmZiksCVwKKwkJICAoKF9yeF9waHlfaW5mby0+cnNzaV9jaGFpbjEgPj4gMCkgJiAweGZmKSk7CVwKKwkJCQkJCQkJCQkJCQkJXAorCWNkZl9wcmludCgiUlNTSSBDaGFpbiAyICgweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMngpXG4iLFwKKwkJICAoKF9yeF9waHlfaW5mby0+cnNzaV9jaGFpbjIgPj4gMjQpICYgMHhmZiksCVwKKwkJICAoKF9yeF9waHlfaW5mby0+cnNzaV9jaGFpbjIgPj4gMTYpICYgMHhmZiksCVwKKwkJICAoKF9yeF9waHlfaW5mby0+cnNzaV9jaGFpbjIgPj4gOCkgJiAweGZmKSwJXAorCQkgICgoX3J4X3BoeV9pbmZvLT5yc3NpX2NoYWluMiA+PiAwKSAmIDB4ZmYpKTsJXAorfQorCitzdGF0aWMgdm9pZCBodHRfdDJoX3N0YXRzX3J4X3JhdGVfc3RhdHNfcHJpbnQod2xhbl9kYmdfcnhfcmF0ZV9pbmZvX3QgKgorCQkJCQkgICAgICByeF9waHlfaW5mbywgaW50IGNvbmNpc2UpCit7CisJcnhfcmF0ZV9zdGF0c19wcmludF9jbW4ocnhfcGh5X2luZm8sIGNvbmNpc2UpOworfQorCitzdGF0aWMgdm9pZCBodHRfdDJoX3N0YXRzX3J4X3JhdGVfc3RhdHNfcHJpbnRfdjIod2xhbl9kYmdfcnhfcmF0ZV9pbmZvX3YyX3QgKgorCQkJCQkgICAgICByeF9waHlfaW5mbywgaW50IGNvbmNpc2UpCit7CisJcnhfcmF0ZV9zdGF0c19wcmludF9jbW4ocnhfcGh5X2luZm8sIGNvbmNpc2UpOworfQorCitzdGF0aWMgdm9pZAoraHR0X3QyaF9zdGF0c19wZGV2X3N0YXRzX3ByaW50KHN0cnVjdCB3bGFuX2RiZ19zdGF0cyAqd2xhbl9wZGV2X3N0YXRzLAorCQkJICAgICAgIGludCBjb25jaXNlKQoreworCXN0cnVjdCB3bGFuX2RiZ190eF9zdGF0cyAqdHggPSAmd2xhbl9wZGV2X3N0YXRzLT50eDsKKwlzdHJ1Y3Qgd2xhbl9kYmdfcnhfc3RhdHMgKnJ4ID0gJndsYW5fcGRldl9zdGF0cy0+cng7CisKKwljZGZfcHJpbnQoIldBTCBQZGV2IHN0YXRzOlxuIik7CisJY2RmX3ByaW50KCJcbiMjIyBUeCAjIyNcbiIpOworCisJLyogTnVtIEhUVCBjb29raWVzIHF1ZXVlZCB0byBkaXNwYXRjaCBsaXN0ICovCisJY2RmX3ByaW50KCJjb21wX3F1ZXVlZCAgICAgICA6XHQlZFxuIiwgdHgtPmNvbXBfcXVldWVkKTsKKwkvKiBOdW0gSFRUIGNvb2tpZXMgZGlzcGF0Y2hlZCAqLworCWNkZl9wcmludCgiY29tcF9kZWxpdmVyZWQgICAgOlx0JWRcbiIsIHR4LT5jb21wX2RlbGl2ZXJlZCk7CisJLyogTnVtIE1TRFUgcXVldWVkIHRvIFdBTCAqLworCWNkZl9wcmludCgibXNkdV9lbnF1ZWQgICAgICAgOlx0JWRcbiIsIHR4LT5tc2R1X2VucXVlZCk7CisJLyogTnVtIE1QRFUgcXVldWVkIHRvIFdBTCAqLworCWNkZl9wcmludCgibXBkdV9lbnF1ZWQgICAgICAgOlx0JWRcbiIsIHR4LT5tcGR1X2VucXVlZCk7CisJLyogTnVtIE1TRFVzIGRyb3BwZWQgYnkgV01NIGxpbWl0ICovCisJY2RmX3ByaW50KCJ3bW1fZHJvcCAgICAgICAgICA6XHQlZFxuIiwgdHgtPndtbV9kcm9wKTsKKwkvKiBOdW0gTG9jYWwgZnJhbWVzIHF1ZXVlZCAqLworCWNkZl9wcmludCgibG9jYWxfZW5xdWVkICAgICAgOlx0JWRcbiIsIHR4LT5sb2NhbF9lbnF1ZWQpOworCS8qIE51bSBMb2NhbCBmcmFtZXMgZG9uZSAqLworCWNkZl9wcmludCgibG9jYWxfZnJlZWQgICAgICAgOlx0JWRcbiIsIHR4LT5sb2NhbF9mcmVlZCk7CisJLyogTnVtIHF1ZXVlZCB0byBIVyAqLworCWNkZl9wcmludCgiaHdfcXVldWVkICAgICAgICAgOlx0JWRcbiIsIHR4LT5od19xdWV1ZWQpOworCS8qIE51bSBQUERVIHJlYXBlZCBmcm9tIEhXICovCisJY2RmX3ByaW50KCJod19yZWFwZWQgICAgICAgICA6XHQlZFxuIiwgdHgtPmh3X3JlYXBlZCk7CisJLyogTnVtIHVuZGVycnVucyAqLworCWNkZl9wcmludCgibWFjIHVuZGVycnVuICAgICAgOlx0JWRcbiIsIHR4LT51bmRlcnJ1bik7CisJLyogTnVtIHVuZGVycnVucyAqLworCWNkZl9wcmludCgicGh5IHVuZGVycnVuICAgICAgOlx0JWRcbiIsIHR4LT5waHlfdW5kZXJydW4pOworCS8qIE51bSBQUERVcyBjbGVhbmVkIHVwIGluIFRYIGFib3J0ICovCisJY2RmX3ByaW50KCJ0eF9hYm9ydCAgICAgICAgICA6XHQlZFxuIiwgdHgtPnR4X2Fib3J0KTsKKwkvKiBOdW0gTVBEVXMgcmVxdWVkIGJ5IFNXICovCisJY2RmX3ByaW50KCJtcGR1c19yZXF1ZWQgICAgICA6XHQlZFxuIiwgdHgtPm1wZHVzX3JlcXVlZCk7CisJLyogRXhjZXNzaXZlIHJldHJpZXMgKi8KKwljZGZfcHJpbnQoImV4Y2VzcyByZXRyaWVzICAgIDpcdCVkXG4iLCB0eC0+dHhfa28pOworCS8qIGxhc3QgZGF0YSByYXRlICovCisJY2RmX3ByaW50KCJsYXN0IHJjICAgICAgICAgICA6XHQlZFxuIiwgdHgtPmRhdGFfcmMpOworCS8qIHNjaGVkdWxlciBzZWxmIHRyaWdnZXJzICovCisJY2RmX3ByaW50KCJzY2hlZCBzZWxmIHRyaWcgICA6XHQlZFxuIiwgdHgtPnNlbGZfdHJpZ2dlcnMpOworCS8qIFNXIHJldHJ5IGZhaWx1cmVzICovCisJY2RmX3ByaW50KCJhbXBkdSByZXRyeSBmYWlsZWQ6XHQlZFxuIiwgdHgtPnN3X3JldHJ5X2ZhaWx1cmUpOworCS8qIGlsZWdhbCBwaHkgcmF0ZSBlcnJpcnMgKi8KKwljZGZfcHJpbnQoImlsbGVnYWwgcmF0ZSBlcnJzIDpcdCVkXG4iLCB0eC0+aWxsZ2xfcmF0ZV9waHlfZXJyKTsKKwkvKiBwZGV2IGNvbnRpbm91cyBleGNlc3NpdmUgcmV0cmllcyAgKi8KKwljZGZfcHJpbnQoInBkZXYgY29udCB4cmV0cnkgIDpcdCVkXG4iLCB0eC0+cGRldl9jb250X3hyZXRyeSk7CisJLyogcGRldiBjb250aW5vdXMgZXhjZXNzaXZlIHJldHJpZXMgICovCisJY2RmX3ByaW50KCJwZGV2IHR4IHRpbWVvdXQgICA6XHQlZFxuIiwgdHgtPnBkZXZfdHhfdGltZW91dCk7CisJLyogcGRldiByZXNldHMgICovCisJY2RmX3ByaW50KCJwZGV2IHJlc2V0cyAgICAgICA6XHQlZFxuIiwgdHgtPnBkZXZfcmVzZXRzKTsKKwkvKiBQUERVID4gdHhvcCBkdXJhdGlvbiAgKi8KKwljZGZfcHJpbnQoInBwZHUgdHhvcCBvdmYgICAgIDpcdCVkXG4iLCB0eC0+dHhvcF9vdmYpOworCisJY2RmX3ByaW50KCJcbiMjIyBSeCAjIyNcbiIpOworCS8qIENudHMgYW55IGNoYW5nZSBpbiByaW5nIHJvdXRpbmcgbWlkLXBwZHUgKi8KKwljZGZfcHJpbnQoInBwZHVfcm91dGVfY2hhbmdlIDpcdCVkXG4iLCByeC0+bWlkX3BwZHVfcm91dGVfY2hhbmdlKTsKKwkvKiBUb3RhbCBudW1iZXIgb2Ygc3RhdHVzZXMgcHJvY2Vzc2VkICovCisJY2RmX3ByaW50KCJzdGF0dXNfcmN2ZCAgICAgICA6XHQlZFxuIiwgcngtPnN0YXR1c19yY3ZkKTsKKwkvKiBFeHRyYSBmcmFncyBvbiByaW5ncyAwLTMgKi8KKwljZGZfcHJpbnQoInIwX2ZyYWdzICAgICAgICAgIDpcdCVkXG4iLCByeC0+cjBfZnJhZ3MpOworCWNkZl9wcmludCgicjFfZnJhZ3MgICAgICAgICAgOlx0JWRcbiIsIHJ4LT5yMV9mcmFncyk7CisJY2RmX3ByaW50KCJyMl9mcmFncyAgICAgICAgICA6XHQlZFxuIiwgcngtPnIyX2ZyYWdzKTsKKwljZGZfcHJpbnQoInIzX2ZyYWdzICAgICAgICAgIDpcdCVkXG4iLCByeC0+cjNfZnJhZ3MpOworCS8qIE1TRFVzIC8gTVBEVXMgZGVsaXZlcmVkIHRvIEhUVCAqLworCWNkZl9wcmludCgiaHR0X21zZHVzICAgICAgICAgOlx0JWRcbiIsIHJ4LT5odHRfbXNkdXMpOworCWNkZl9wcmludCgiaHR0X21wZHVzICAgICAgICAgOlx0JWRcbiIsIHJ4LT5odHRfbXBkdXMpOworCS8qIE1TRFVzIC8gTVBEVXMgZGVsaXZlcmVkIHRvIGxvY2FsIHN0YWNrICovCisJY2RmX3ByaW50KCJsb2NfbXNkdXMgICAgICAgICA6XHQlZFxuIiwgcngtPmxvY19tc2R1cyk7CisJY2RmX3ByaW50KCJsb2NfbXBkdXMgICAgICAgICA6XHQlZFxuIiwgcngtPmxvY19tcGR1cyk7CisJLyogQU1TRFVzIHRoYXQgaGF2ZSBtb3JlIE1TRFVzIHRoYW4gdGhlIHN0YXR1cyByaW5nIHNpemUgKi8KKwljZGZfcHJpbnQoIm92ZXJzaXplX2Ftc2R1ICAgIDpcdCVkXG4iLCByeC0+b3ZlcnNpemVfYW1zZHUpOworCS8qIE51bWJlciBvZiBQSFkgZXJyb3JzICovCisJY2RmX3ByaW50KCJwaHlfZXJycyAgICAgICAgICA6XHQlZFxuIiwgcngtPnBoeV9lcnJzKTsKKwkvKiBOdW1iZXIgb2YgUEhZIGVycm9ycyBkcm9wcGVkICovCisJY2RmX3ByaW50KCJwaHlfZXJycyBkcm9wcGVkICA6XHQlZFxuIiwgcngtPnBoeV9lcnJfZHJvcCk7CisJLyogTnVtYmVyIG9mIG1wZHUgZXJyb3JzIC0gRkNTLCBNSUMsIEVOQyBldGMuICovCisJY2RmX3ByaW50KCJtcGR1X2VycnMgICAgICAgICA6XHQlZFxuIiwgcngtPm1wZHVfZXJycyk7CisKK30KKworc3RhdGljIHZvaWQKK2h0dF90Mmhfc3RhdHNfcnhfcmVvcmRlcl9zdGF0c19wcmludChzdHJ1Y3QgcnhfcmVvcmRlcl9zdGF0cyAqc3RhdHNfcHRyLAorCQkJCSAgICAgaW50IGNvbmNpc2UpCit7CisJY2RmX3ByaW50KCJSeCByZW9yZGVyIHN0YXRpc3RpY3M6XG4iKTsKKwljZGZfcHJpbnQoIiAgJXUgbm9uLVFvUyBmcmFtZXMgcmVjZWl2ZWRcbiIsIHN0YXRzX3B0ci0+ZGVsaXZlcl9ub25fcW9zKTsKKwljZGZfcHJpbnQoIiAgJXUgZnJhbWVzIHJlY2VpdmVkIGluLW9yZGVyXG4iLAorCQkgIHN0YXRzX3B0ci0+ZGVsaXZlcl9pbl9vcmRlcik7CisJY2RmX3ByaW50KCIgICV1IGZyYW1lcyBmbHVzaGVkIGR1ZSB0byB0aW1lb3V0XG4iLAorCQkgIHN0YXRzX3B0ci0+ZGVsaXZlcl9mbHVzaF90aW1lb3V0KTsKKwljZGZfcHJpbnQoIiAgJXUgZnJhbWVzIGZsdXNoZWQgZHVlIHRvIG1vdmluZyBvdXQgb2Ygd2luZG93XG4iLAorCQkgIHN0YXRzX3B0ci0+ZGVsaXZlcl9mbHVzaF9vb3cpOworCWNkZl9wcmludCgiICAldSBmcmFtZXMgZmx1c2hlZCBkdWUgdG8gcmVjZWl2aW5nIERFTEJBXG4iLAorCQkgIHN0YXRzX3B0ci0+ZGVsaXZlcl9mbHVzaF9kZWxiYSk7CisJY2RmX3ByaW50KCIgICV1IGZyYW1lcyBkaXNjYXJkZWQgZHVlIHRvIEZDUyBlcnJvclxuIiwKKwkJICBzdGF0c19wdHItPmZjc19lcnJvcik7CisJY2RmX3ByaW50KCIgICV1IGZyYW1lcyBkaXNjYXJkZWQgZHVlIHRvIGludmFsaWQgcGVlclxuIiwKKwkJICBzdGF0c19wdHItPmludmFsaWRfcGVlcik7CisJY2RmX3ByaW50CisJCSgiICAldSBmcmFtZXMgZGlzY2FyZGVkIGR1ZSB0byBkdXBsaWNhdGlvbiAobm9uIGFnZ3JlZ2F0aW9uKVxuIiwKKwkJc3RhdHNfcHRyLT5kdXBfbm9uX2FnZ3IpOworCWNkZl9wcmludCgiICAldSBmcmFtZXMgZGlzY2FyZGVkIGR1ZSB0byBkdXBsaWNhdGlvbiBpbiByZW9yZGVyIHF1ZXVlXG4iLAorCQkgc3RhdHNfcHRyLT5kdXBfaW5fcmVvcmRlcik7CisJY2RmX3ByaW50KCIgICV1IGZyYW1lcyBkaXNjYXJkZWQgZHVlIHRvIHByb2Nlc3NlZCBiZWZvcmVcbiIsCisJCSAgc3RhdHNfcHRyLT5kdXBfcGFzdCk7CisJY2RmX3ByaW50KCIgICV1IHRpbWVzIHJlb3JkZXIgdGltZW91dCBoYXBwZW5lZFxuIiwKKwkJICBzdGF0c19wdHItPnJlb3JkZXJfdGltZW91dCk7CisJY2RmX3ByaW50KCIgICV1IHRpbWVzIGluY29ycmVjdCBiYXIgcmVjZWl2ZWRcbiIsCisJCSAgc3RhdHNfcHRyLT5pbnZhbGlkX2Jhcl9zc24pOworCWNkZl9wcmludCgiICAldSB0aW1lcyBiYXIgc3NuIHJlc2V0IGhhcHBlbmVkXG4iLAorCQkJc3RhdHNfcHRyLT5zc25fcmVzZXQpOworCWNkZl9wcmludCgiICAldSB0aW1lcyBmbHVzaGVkIGR1ZSB0byBwZWVyIGRlbGV0ZVxuIiwKKwkJCXN0YXRzX3B0ci0+ZGVsaXZlcl9mbHVzaF9kZWxwZWVyKTsKKwljZGZfcHJpbnQoIiAgJXUgdGltZXMgZmx1c2hlZCBkdWUgdG8gb2ZmbG9hZFxuIiwKKwkJCXN0YXRzX3B0ci0+ZGVsaXZlcl9mbHVzaF9vZmZsb2FkKTsKKwljZGZfcHJpbnQoIiAgJXUgdGltZXMgZmx1c2hlZCBkdWUgdG8gb3VmIG9mIGJ1ZmZlclxuIiwKKwkJCXN0YXRzX3B0ci0+ZGVsaXZlcl9mbHVzaF9vb2IpOworCWNkZl9wcmludCgiICAldSBNUERVJ3MgZHJvcHBlZCBkdWUgdG8gUE4gY2hlY2sgZmFpbFxuIiwKKwkJCXN0YXRzX3B0ci0+cG5fZmFpbCk7CisJY2RmX3ByaW50KCIgICV1IE1QRFUncyBkcm9wcGVkIGR1ZSB0byBsYWNrIG9mIG1lbW9yeVxuIiwKKwkJCXN0YXRzX3B0ci0+c3RvcmVfZmFpbCk7CisJY2RmX3ByaW50KCIgICV1IHRpbWVzIHRpZCBwb29sIGFsbG9jIHN1Y2NlZWRlZFxuIiwKKwkJCXN0YXRzX3B0ci0+dGlkX3Bvb2xfYWxsb2Nfc3VjYyk7CisJY2RmX3ByaW50KCIgICV1IHRpbWVzIE1QRFUgcG9vbCBhbGxvYyBzdWNjZWVkZWRcbiIsCisJCQlzdGF0c19wdHItPm1wZHVfcG9vbF9hbGxvY19zdWNjKTsKKwljZGZfcHJpbnQoIiAgJXUgdGltZXMgTVNEVSBwb29sIGFsbG9jIHN1Y2NlZWRlZFxuIiwKKwkJCXN0YXRzX3B0ci0+bXNkdV9wb29sX2FsbG9jX3N1Y2MpOworCWNkZl9wcmludCgiICAldSB0aW1lcyB0aWQgcG9vbCBhbGxvYyBmYWlsZWRcbiIsCisJCQlzdGF0c19wdHItPnRpZF9wb29sX2FsbG9jX2ZhaWwpOworCWNkZl9wcmludCgiICAldSB0aW1lcyBNUERVIHBvb2wgYWxsb2MgZmFpbGVkXG4iLAorCQkJc3RhdHNfcHRyLT5tcGR1X3Bvb2xfYWxsb2NfZmFpbCk7CisJY2RmX3ByaW50KCIgICV1IHRpbWVzIE1TRFUgcG9vbCBhbGxvYyBmYWlsZWRcbiIsCisJCQlzdGF0c19wdHItPm1zZHVfcG9vbF9hbGxvY19mYWlsKTsKKwljZGZfcHJpbnQoIiAgJXUgdGltZXMgdGlkIHBvb2wgZnJlZWRcbiIsCisJCQlzdGF0c19wdHItPnRpZF9wb29sX2ZyZWUpOworCWNkZl9wcmludCgiICAldSB0aW1lcyBNUERVIHBvb2wgZnJlZWRcbiIsCisJCQlzdGF0c19wdHItPm1wZHVfcG9vbF9mcmVlKTsKKwljZGZfcHJpbnQoIiAgJXUgdGltZXMgTVNEVSBwb29sIGZyZWVkXG4iLAorCQkJc3RhdHNfcHRyLT5tc2R1X3Bvb2xfZnJlZSk7CisJY2RmX3ByaW50KCIgICV1IE1TRFVzIHVuZGVsaXZlcmVkIHRvIEhUVCwgcXVldWVkIHRvIFJ4IE1TRFUgZnJlZSBsaXN0XG4iLAorCQkJc3RhdHNfcHRyLT5tc2R1X3F1ZXVlZCk7CisJY2RmX3ByaW50KCIgICV1IE1TRFVzIHJlbGVhc2VkIGZyb20gUnggTVNEVSBsaXN0IHRvIE1BQyByaW5nXG4iLAorCQkJc3RhdHNfcHRyLT5tc2R1X3JlY3ljbGVkKTsKKwljZGZfcHJpbnQoIiAgJXUgTVBEVXMgd2l0aCBpbnZhbGlkIHBlZXIgYnV0IEEyIGZvdW5kIGluIEFTVFxuIiwKKwkJCXN0YXRzX3B0ci0+aW52YWxpZF9wZWVyX2EyX2luX2FzdCk7CisJY2RmX3ByaW50KCIgICV1IE1QRFVzIHdpdGggaW52YWxpZCBwZWVyIGJ1dCBBMyBmb3VuZCBpbiBBU1RcbiIsCisJCQlzdGF0c19wdHItPmludmFsaWRfcGVlcl9hM19pbl9hc3QpOworCWNkZl9wcmludCgiICAldSBNUERVcyB3aXRoIGludmFsaWQgcGVlciwgQnJvYWRjYXN0IG9yIE11bGl0Y2FzdCBmcmFtZVxuIiwKKwkJCXN0YXRzX3B0ci0+aW52YWxpZF9wZWVyX2JtY19tcGR1cyk7CisJY2RmX3ByaW50KCIgICV1IE1TRFVzIHdpdGggZXJyIGF0dGVudGlvbiB3b3JkXG4iLAorCQkJc3RhdHNfcHRyLT5yeGRlc2NfZXJyX2F0dCk7CisJY2RmX3ByaW50KCIgICV1IE1TRFVzIHdpdGggZmxhZyBvZiBwZWVyX2lkeF9pbnZhbGlkXG4iLAorCQkJc3RhdHNfcHRyLT5yeGRlc2NfZXJyX3BlZXJfaWR4X2ludik7CisJY2RmX3ByaW50KCIgICV1IE1TRFVzIHdpdGggIGZsYWcgb2YgcGVlcl9pZHhfdGltZW91dFxuIiwKKwkJCXN0YXRzX3B0ci0+cnhkZXNjX2Vycl9wZWVyX2lkeF90byk7CisJY2RmX3ByaW50KCIgICV1IE1TRFVzIHdpdGggIGZsYWcgb2Ygb3ZlcmZsb3dcbiIsCisJCQlzdGF0c19wdHItPnJ4ZGVzY19lcnJfb3YpOworCWNkZl9wcmludCgiICAldSBNU0RVcyB3aXRoICBmbGFnIG9mIG1zZHVfbGVuZ3RoX2VyclxuIiwKKwkJCXN0YXRzX3B0ci0+cnhkZXNjX2Vycl9tc2R1X2xlbik7CisJY2RmX3ByaW50KCIgICV1IE1TRFVzIHdpdGggIGZsYWcgb2YgbXBkdV9sZW5ndGhfZXJyXG4iLAorCQkJc3RhdHNfcHRyLT5yeGRlc2NfZXJyX21wZHVfbGVuKTsKKwljZGZfcHJpbnQoIiAgJXUgTVNEVXMgd2l0aCAgZmxhZyBvZiB0a2lwX21pY19lcnJcbiIsCisJCQlzdGF0c19wdHItPnJ4ZGVzY19lcnJfdGtpcF9taWMpOworCWNkZl9wcmludCgiICAldSBNU0RVcyB3aXRoICBmbGFnIG9mIGRlY3J5cHRfZXJyXG4iLAorCQkJc3RhdHNfcHRyLT5yeGRlc2NfZXJyX2RlY3J5cHQpOworCWNkZl9wcmludCgiICAldSBNU0RVcyB3aXRoICBmbGFnIG9mIGZjc19lcnJcbiIsCisJCQlzdGF0c19wdHItPnJ4ZGVzY19lcnJfZmNzKTsKKwljZGZfcHJpbnQoIiAgJXUgVW5pY2FzdCBmcmFtZXMgd2l0aCBpbnZhbGlkIHBlZXIgaGFuZGxlclxuIiwKKwkJCXN0YXRzX3B0ci0+cnhkZXNjX3VjX21zZHVzX2ludl9wZWVyKTsKKwljZGZfcHJpbnQoIiAgJXUgdW5pY2FzdCBmcmFtZSBkaXJlY3RseSB0byBEVVQgd2l0aCBpbnZhbGlkIHBlZXIgaGFuZGxlclxuIiwKKwkJCXN0YXRzX3B0ci0+cnhkZXNjX2RpcmVjdF9tc2R1c19pbnZfcGVlcik7CisJY2RmX3ByaW50KCIgICV1IEJyb2FkY2FzdC9NdWx0aWNhc3QgZnJhbWVzIHdpdGggaW52YWxpZCBwZWVyIGhhbmRsZXJcbiIsCisJCQlzdGF0c19wdHItPnJ4ZGVzY19ibWNfbXNkdXNfaW52X3BlZXIpOworCWNkZl9wcmludCgiICAldSBNU0RVcyBkcm9wcGVkIGR1ZSB0byBubyBmaXJzdCBNU0RVIGZsYWdcbiIsCisJCQlzdGF0c19wdHItPnJ4ZGVzY19ub18xc3RfbXNkdSk7CisJY2RmX3ByaW50KCIgICV1IE1TRFVzIGRyb3BwZWQgZHVlIHRvIHJpbmcgb3ZlcmZsb3dcbiIsCisJCQlzdGF0c19wdHItPm1zZHVfZHJvcF9yaW5nX292KTsKKwljZGZfcHJpbnQoIiAgJXUgTVNEVXMgZHJvcHBlZCBkdWUgdG8gRkMgbWlzbWF0Y2hcbiIsCisJCQlzdGF0c19wdHItPm1zZHVfZHJvcF9mY19taXNtYXRjaCk7CisJY2RmX3ByaW50KCIgICV1IE1TRFVzIGRyb3BwZWQgZHVlIHRvIG1ndCBmcmFtZSBpbiBSZW1vdGUgcmluZ1xuIiwKKwkJCXN0YXRzX3B0ci0+bXNkdV9kcm9wX21nbXRfcmVtb3RlX3JpbmcpOworCWNkZl9wcmludCgiICAldSBNU0RVcyBkcm9wcGVkIGR1ZSB0byBtaXNjIG5vbiBlcnJvclxuIiwKKwkJCXN0YXRzX3B0ci0+bXNkdV9kcm9wX21pc2MpOworCWNkZl9wcmludCgiICAldSBNU0RVcyBnbyB0byBvZmZsb2FkIGJlZm9yZSByZW9yZGVyXG4iLAorCQkJc3RhdHNfcHRyLT5vZmZsb2FkX21zZHVfd2FsKTsKKwljZGZfcHJpbnQoIiAgJXUgZGF0YSBmcmFtZSBkcm9wcGVkIGJ5IG9mZmxvYWQgYWZ0ZXIgcmVvcmRlclxuIiwKKwkJCXN0YXRzX3B0ci0+b2ZmbG9hZF9tc2R1X3Jlb3JkZXIpOworCWNkZl9wcmludCgiICAldSAgTVBEVXMgd2l0aCBTTiBpbiB0aGUgcGFzdCAmIHdpdGhpbiBCQSB3aW5kb3dcbiIsCisJCQlzdGF0c19wdHItPmR1cF9wYXN0X3dpdGhpbl93aW5kb3cpOworCWNkZl9wcmludCgiICAldSAgTVBEVXMgd2l0aCBTTiBpbiB0aGUgcGFzdCAmIG91dHNpZGUgQkEgd2luZG93XG4iLAorCQkJc3RhdHNfcHRyLT5kdXBfcGFzdF9vdXRzaWRlX3dpbmRvdyk7Cit9CisKK3N0YXRpYyB2b2lkCitodHRfdDJoX3N0YXRzX3J4X3JlbV9idWZfc3RhdHNfcHJpbnQoCisgICAgc3RydWN0IHJ4X3JlbW90ZV9idWZmZXJfbWdtdF9zdGF0cyAqc3RhdHNfcHRyLCBpbnQgY29uY2lzZSkKK3sKKwljZGZfcHJpbnQoIlJ4IFJlbW90ZSBCdWZmZXIgU3RhdGlzdGljczpcbiIpOworCWNkZl9wcmludCgiICAldSBNU0RVJ3MgcmVhcGVkIGZvciBSeCBwcm9jZXNzaW5nXG4iLAorCQkJc3RhdHNfcHRyLT5yZW1vdGVfcmVhcGVkKTsKKwljZGZfcHJpbnQoIiAgJXUgTVNEVSdzIHJlY3ljbGVkIHdpdGhpbiBmaXJtd2FyZVxuIiwKKwkJCXN0YXRzX3B0ci0+cmVtb3RlX3JlY3ljbGVkKTsKKwljZGZfcHJpbnQoIiAgJXUgTVNEVSdzIHN0b3JlZCBieSBEYXRhIFJ4XG4iLAorCQkJc3RhdHNfcHRyLT5kYXRhX3J4X21zZHVzX3N0b3JlZCk7CisJY2RmX3ByaW50KCIgICV1IEhUVCBpbmRpY2F0aW9ucyBmcm9tIFdBTCBSeCBNU0RVXG4iLAorCQkJc3RhdHNfcHRyLT53YWxfcnhfaW5kKTsKKwljZGZfcHJpbnQoIiAgJXUgSFRUIGluZGljYXRpb25zIHVuY29uc3VtZWQgZnJvbSBXQUwgUnggTVNEVVxuIiwKKwkJCXN0YXRzX3B0ci0+d2FsX3J4X2luZF91bmNvbnN1bWVkKTsKKwljZGZfcHJpbnQoIiAgJXUgSFRUIGluZGljYXRpb25zIGZyb20gRGF0YSBSeCBNU0RVXG4iLAorCQkJc3RhdHNfcHRyLT5kYXRhX3J4X2luZCk7CisJY2RmX3ByaW50KCIgICV1IEhUVCBpbmRpY2F0aW9ucyB1bmNvbnN1bWVkIGZyb20gRGF0YSBSeCBNU0RVXG4iLAorCQkJc3RhdHNfcHRyLT5kYXRhX3J4X2luZF91bmNvbnN1bWVkKTsKKwljZGZfcHJpbnQoIiAgJXUgSFRUIGluZGljYXRpb25zIGZyb20gQVRIQlVGXG4iLAorCQkJc3RhdHNfcHRyLT5hdGhidWZfcnhfaW5kKTsKKwljZGZfcHJpbnQoIiAgJXUgUmVtb3RlIGJ1ZmZlcnMgcmVxdWVzdGVkIGZvciByZWZpbGxcbiIsCisJCQlzdGF0c19wdHItPnJlZmlsbF9idWZfcmVxKTsKKwljZGZfcHJpbnQoIiAgJXUgUmVtb3RlIGJ1ZmZlcnMgZmlsbGVkIGJ5IGhvc3RcbiIsCisJCQlzdGF0c19wdHItPnJlZmlsbF9idWZfcnNwKTsKKwljZGZfcHJpbnQoIiAgJXUgdGltZXMgTUFDIGhhcyBubyBidWZmZXJzXG4iLAorCQkJc3RhdHNfcHRyLT5tYWNfbm9fYnVmcyk7CisJY2RmX3ByaW50KCIgICV1IHRpbWVzIGYvdyB3cml0ZSAmIHJlYWQgaW5kaWNlcyBvbiBNQUMgcmluZyBhcmUgZXF1YWxcbiIsCisJCQlzdGF0c19wdHItPmZ3X2luZGljZXNfZXF1YWwpOworCWNkZl9wcmludCgiICAldSB0aW1lcyBmL3cgaGFzIG5vIHJlbW90ZSBidWZmZXJzIHRvIHBvc3QgdG8gTUFDXG4iLAorCQkJc3RhdHNfcHRyLT5ob3N0X25vX2J1ZnMpOworfQorCitzdGF0aWMgdm9pZAoraHR0X3QyaF9zdGF0c190eGJmX2luZm9fYnVmX3N0YXRzX3ByaW50KAorCXN0cnVjdCB3bGFuX2RiZ190eGJmX2RhdGFfc3RhdHMgKnN0YXRzX3B0cikKK3sKKwljZGZfcHJpbnQoIlRYQkYgZGF0YSBTdGF0aXN0aWNzOlxuIik7CisJY2RmX3ByaW50KCJ0eF90eGJmX3ZodCAoMC4uOSk6ICIpOworCWNkZl9wcmludCgiJXUsICV1LCAldSwgJXUsICV1LCAldSwgJXUsICV1LCAldSwgJWRcbiIsCisJCSAgc3RhdHNfcHRyLT50eF90eGJmX3ZodFswXSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfdmh0WzFdLAorCQkgIHN0YXRzX3B0ci0+dHhfdHhiZl92aHRbMl0sCisJCSAgc3RhdHNfcHRyLT50eF90eGJmX3ZodFszXSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfdmh0WzRdLAorCQkgIHN0YXRzX3B0ci0+dHhfdHhiZl92aHRbNV0sCisJCSAgc3RhdHNfcHRyLT50eF90eGJmX3ZodFs2XSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfdmh0WzddLAorCQkgIHN0YXRzX3B0ci0+dHhfdHhiZl92aHRbOF0sCisJCSAgc3RhdHNfcHRyLT50eF90eGJmX3ZodFs5XSk7CisJY2RmX3ByaW50KCJyeF90eGJmX3ZodCAoMC4uOSk6ICIpOworCWNkZl9wcmludCgiJXUsICV1LCAldSwgJXUsICV1LCAldSwgJXUsICV1LCAldSwgJXVcbiIsCisJCSAgc3RhdHNfcHRyLT5yeF90eGJmX3ZodFswXSwKKwkJICBzdGF0c19wdHItPnJ4X3R4YmZfdmh0WzFdLAorCQkgIHN0YXRzX3B0ci0+cnhfdHhiZl92aHRbMl0sCisJCSAgc3RhdHNfcHRyLT5yeF90eGJmX3ZodFszXSwKKwkJICBzdGF0c19wdHItPnJ4X3R4YmZfdmh0WzRdLAorCQkgIHN0YXRzX3B0ci0+cnhfdHhiZl92aHRbNV0sCisJCSAgc3RhdHNfcHRyLT5yeF90eGJmX3ZodFs2XSwKKwkJICBzdGF0c19wdHItPnJ4X3R4YmZfdmh0WzddLAorCQkgIHN0YXRzX3B0ci0+cnhfdHhiZl92aHRbOF0sCisJCSAgc3RhdHNfcHRyLT5yeF90eGJmX3ZodFs5XSk7CisJY2RmX3ByaW50KCJ0eF90eGJmX2h0ICgwLi43KTogIik7CisJY2RmX3ByaW50KCIldSwgJXUsICV1LCAldSwgJXUsICV1LCAldSwgJXVcbiIsCisJCSAgc3RhdHNfcHRyLT50eF90eGJmX2h0WzBdLAorCQkgIHN0YXRzX3B0ci0+dHhfdHhiZl9odFsxXSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfaHRbMl0sCisJCSAgc3RhdHNfcHRyLT50eF90eGJmX2h0WzNdLAorCQkgIHN0YXRzX3B0ci0+dHhfdHhiZl9odFs0XSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfaHRbNV0sCisJCSAgc3RhdHNfcHRyLT50eF90eGJmX2h0WzZdLAorCQkgIHN0YXRzX3B0ci0+dHhfdHhiZl9odFs3XSk7CisJY2RmX3ByaW50KCJ0eF90eGJmX29mZG0gKDAuLjcpOiAiKTsKKwljZGZfcHJpbnQoIiV1LCAldSwgJXUsICV1LCAldSwgJXUsICV1LCAldVxuIiwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfb2ZkbVswXSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfb2ZkbVsxXSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfb2ZkbVsyXSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfb2ZkbVszXSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfb2ZkbVs0XSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfb2ZkbVs1XSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfb2ZkbVs2XSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfb2ZkbVs3XSk7CisJY2RmX3ByaW50KCJ0eF90eGJmX2NjayAoMC4uNik6ICIpOworCWNkZl9wcmludCgiJXUsICV1LCAldSwgJXUsICV1LCAldSwgJXVcbiIsCisJCSAgc3RhdHNfcHRyLT50eF90eGJmX2Nja1swXSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfY2NrWzFdLAorCQkgIHN0YXRzX3B0ci0+dHhfdHhiZl9jY2tbMl0sCisJCSAgc3RhdHNfcHRyLT50eF90eGJmX2Nja1szXSwKKwkJICBzdGF0c19wdHItPnR4X3R4YmZfY2NrWzRdLAorCQkgIHN0YXRzX3B0ci0+dHhfdHhiZl9jY2tbNV0sCisJCSAgc3RhdHNfcHRyLT50eF90eGJmX2Nja1s2XSk7Cit9CisKK3N0YXRpYyB2b2lkCitodHRfdDJoX3N0YXRzX3R4YmZfc25kX2J1Zl9zdGF0c19wcmludCgKKwlzdHJ1Y3Qgd2xhbl9kYmdfdHhiZl9zbmRfc3RhdHMgKnN0YXRzX3B0cikKK3sKKwljZGZfcHJpbnQoIlRYQkYgc25kIEJ1ZmZlciBTdGF0aXN0aWNzOlxuIik7CisJY2RmX3ByaW50KCJjYmZfMjA6ICIpOworCWNkZl9wcmludCgiJXUsICV1LCAldSwgJXVcbiIsCisJCSAgc3RhdHNfcHRyLT5jYmZfMjBbMF0sCisJCSAgc3RhdHNfcHRyLT5jYmZfMjBbMV0sCisJCSAgc3RhdHNfcHRyLT5jYmZfMjBbMl0sCisJCSAgc3RhdHNfcHRyLT5jYmZfMjBbM10pOworCWNkZl9wcmludCgiY2JmXzQwOiAiKTsKKwljZGZfcHJpbnQoIiV1LCAldSwgJXUsICV1XG4iLAorCQkgIHN0YXRzX3B0ci0+Y2JmXzQwWzBdLAorCQkgIHN0YXRzX3B0ci0+Y2JmXzQwWzFdLAorCQkgIHN0YXRzX3B0ci0+Y2JmXzQwWzJdLAorCQkgIHN0YXRzX3B0ci0+Y2JmXzQwWzNdKTsKKwljZGZfcHJpbnQoImNiZl84MDogIik7CisJY2RmX3ByaW50KCIldSwgJXUsICV1LCAldVxuIiwKKwkJICBzdGF0c19wdHItPmNiZl84MFswXSwKKwkJICBzdGF0c19wdHItPmNiZl84MFsxXSwKKwkJICBzdGF0c19wdHItPmNiZl84MFsyXSwKKwkJICBzdGF0c19wdHItPmNiZl84MFszXSk7CisJY2RmX3ByaW50KCJzb3VuZGluZzogIik7CisJY2RmX3ByaW50KCIldSwgJXUsICV1LCAldSwgJXUsICV1LCAldSwgJXUsICV1XG4iLAorCQkgIHN0YXRzX3B0ci0+c291bmRpbmdbMF0sCisJCSAgc3RhdHNfcHRyLT5zb3VuZGluZ1sxXSwKKwkJICBzdGF0c19wdHItPnNvdW5kaW5nWzJdLAorCQkgIHN0YXRzX3B0ci0+c291bmRpbmdbM10sCisJCSAgc3RhdHNfcHRyLT5zb3VuZGluZ1s0XSwKKwkJICBzdGF0c19wdHItPnNvdW5kaW5nWzVdLAorCQkgIHN0YXRzX3B0ci0+c291bmRpbmdbNl0sCisJCSAgc3RhdHNfcHRyLT5zb3VuZGluZ1s3XSwKKwkJICBzdGF0c19wdHItPnNvdW5kaW5nWzhdKTsKK30KKworc3RhdGljIHZvaWQKK2h0dF90Mmhfc3RhdHNfdHhfc2VsZmdlbl9idWZfc3RhdHNfcHJpbnQoCisJc3RydWN0IHdsYW5fZGJnX3R4X3NlbGZnZW5fc3RhdHMgKnN0YXRzX3B0cikKK3sKKwljZGZfcHJpbnQoIlR4IHNlbGZnZW4gQnVmZmVyIFN0YXRpc3RpY3M6XG4iKTsKKwljZGZfcHJpbnQoIiAgJXUgc3VfbmRwYVxuIiwKKwkJCXN0YXRzX3B0ci0+c3VfbmRwYSk7CisJY2RmX3ByaW50KCIgICV1IG11X25kcFxuIiwKKwkJCXN0YXRzX3B0ci0+bXVfbmRwKTsKKwljZGZfcHJpbnQoIiAgJXUgbXVfbmRwYVxuIiwKKwkJCXN0YXRzX3B0ci0+bXVfbmRwYSk7CisJY2RmX3ByaW50KCIgICV1IG11X25kcFxuIiwKKwkJCXN0YXRzX3B0ci0+bXVfbmRwKTsKKwljZGZfcHJpbnQoIiAgJXUgbXVfYnJwb2xsXzFcbiIsCisJCQlzdGF0c19wdHItPm11X2JycG9sbF8xKTsKKwljZGZfcHJpbnQoIiAgJXUgbXVfYnJwb2xsXzJcbiIsCisJCQlzdGF0c19wdHItPm11X2JycG9sbF8yKTsKKwljZGZfcHJpbnQoIiAgJXUgbXVfYmFyXzFcbiIsCisJCQlzdGF0c19wdHItPm11X2Jhcl8xKTsKKwljZGZfcHJpbnQoIiAgJXUgbXVfYmFyXzJcbiIsCisJCQlzdGF0c19wdHItPm11X2Jhcl8yKTsKKwljZGZfcHJpbnQoIiAgJXUgY3RzX2J1cnN0XG4iLAorCQkJc3RhdHNfcHRyLT5jdHNfYnVyc3QpOworCWNkZl9wcmludCgiICAldSBzdV9uZHBfZXJyXG4iLAorCQkJc3RhdHNfcHRyLT5zdV9uZHBfZXJyKTsKKwljZGZfcHJpbnQoIiAgJXUgc3VfbmRwYV9lcnJcbiIsCisJCQlzdGF0c19wdHItPnN1X25kcGFfZXJyKTsKKwljZGZfcHJpbnQoIiAgJXUgbXVfbmRwX2VyclxuIiwKKwkJCXN0YXRzX3B0ci0+bXVfbmRwX2Vycik7CisJY2RmX3ByaW50KCIgICV1IG11X2JycDFfZXJyXG4iLAorCQkJc3RhdHNfcHRyLT5tdV9icnAxX2Vycik7CisJY2RmX3ByaW50KCIgICV1IG11X2JycDJfZXJyXG4iLAorCQkJc3RhdHNfcHRyLT5tdV9icnAyX2Vycik7Cit9CisKK3N0YXRpYyB2b2lkCitodHRfdDJoX3N0YXRzX3dpZmkyX2Vycm9yX3N0YXRzX3ByaW50KAorCXN0cnVjdCB3bGFuX2RiZ193aWZpMl9lcnJvcl9zdGF0cyAqc3RhdHNfcHRyKQoreworCWludCBpOworCisJY2RmX3ByaW50KCJTY2hlZHVsZXIgZXJyb3IgU3RhdGlzdGljczpcbiIpOworCWNkZl9wcmludCgidXJybl9zdGF0czogIik7CisJY2RmX3ByaW50KCIlZCwgJWQsICVkXG4iLAorCQkgIHN0YXRzX3B0ci0+dXJybl9zdGF0c1swXSwKKwkJICBzdGF0c19wdHItPnVycm5fc3RhdHNbMV0sCisJCSAgc3RhdHNfcHRyLT51cnJuX3N0YXRzWzJdKTsKKwljZGZfcHJpbnQoImZsdXNoX2VycnMgKDAuLiVkKTogIiwKKwkJCVdIQUxfREJHX0ZMVVNIX1JFQVNPTl9NQVhDTlQpOworCWZvciAoaSA9IDA7IGkgPCBXSEFMX0RCR19GTFVTSF9SRUFTT05fTUFYQ05UOyBpKyspCisJCWNkZl9wcmludCgiICAldSIsIHN0YXRzX3B0ci0+Zmx1c2hfZXJyc1tpXSk7CisJY2RmX3ByaW50KCJcbiIpOworCWNkZl9wcmludCgic2NoZF9zdGFsbF9lcnJzICgwLi4zKTogIik7CisJY2RmX3ByaW50KCIlZCwgJWQsICVkLCAlZFxuIiwKKwkJICBzdGF0c19wdHItPnNjaGRfc3RhbGxfZXJyc1swXSwKKwkJICBzdGF0c19wdHItPnNjaGRfc3RhbGxfZXJyc1sxXSwKKwkJICBzdGF0c19wdHItPnNjaGRfc3RhbGxfZXJyc1syXSwKKwkJICBzdGF0c19wdHItPnNjaGRfc3RhbGxfZXJyc1szXSk7CisJY2RmX3ByaW50KCJzY2hkX2NtZF9yZXN1bHQgKDAuLiVkKTogIiwKKwkJCVdIQUxfREJHX0NNRF9SRVNVTFRfTUFYQ05UKTsKKwlmb3IgKGkgPSAwOyBpIDwgV0hBTF9EQkdfQ01EX1JFU1VMVF9NQVhDTlQ7IGkrKykKKwkJY2RmX3ByaW50KCIgICV1Iiwgc3RhdHNfcHRyLT5zY2hkX2NtZF9yZXN1bHRbaV0pOworCWNkZl9wcmludCgiXG4iKTsKKwljZGZfcHJpbnQoInNpZnNfc3RhdHVzICgwLi4lZCk6ICIsCisJCQlXSEFMX0RCR19TSUZTX1NUQVRVU19NQVhDTlQpOworCWZvciAoaSA9IDA7IGkgPCBXSEFMX0RCR19TSUZTX1NUQVRVU19NQVhDTlQ7IGkrKykKKwkJY2RmX3ByaW50KCIgICV1Iiwgc3RhdHNfcHRyLT5zaWZzX3N0YXR1c1tpXSk7CisJY2RmX3ByaW50KCJcbiIpOworCWNkZl9wcmludCgicGh5X2VycnMgKDAuLiVkKTogIiwKKwkJCVdIQUxfREJHX1BIWV9FUlJfTUFYQ05UKTsKKwlmb3IgKGkgPSAwOyBpIDwgV0hBTF9EQkdfUEhZX0VSUl9NQVhDTlQ7IGkrKykKKwkJY2RmX3ByaW50KCIgICV1Iiwgc3RhdHNfcHRyLT5waHlfZXJyc1tpXSk7CisJY2RmX3ByaW50KCJcbiIpOworCWNkZl9wcmludCgiICAldSByeF9yYXRlX2ludmFsXG4iLAorCQkJc3RhdHNfcHRyLT5yeF9yYXRlX2ludmFsKTsKK30KKworc3RhdGljIHZvaWQKK2h0dF90MmhfcnhfbXVzdV9uZHBhX3BrdHNfc3RhdHNfcHJpbnQoCisJc3RydWN0IHJ4X3R4YmZfbXVzdV9uZHBhX3BrdHNfc3RhdHMgKnN0YXRzX3B0cikKK3sKKwljZGZfcHJpbnQoIlJ4IFRYQkYgTVUvU1UgUGFja2V0cyBhbmQgTkRQQSBTdGF0aXN0aWNzOlxuIik7CisJY2RmX3ByaW50KCIgICV1IE51bWJlciBvZiBUWEJGIE1VIHBhY2tldHMgcmVjZWl2ZWRcbiIsCisJCQlzdGF0c19wdHItPm51bWJlcl9tdV9wa3RzKTsKKwljZGZfcHJpbnQoIiAgJXUgTnVtYmVyIG9mIFRYQkYgU1UgcGFja2V0cyByZWNlaXZlZFxuIiwKKwkJCXN0YXRzX3B0ci0+bnVtYmVyX3N1X3BrdHMpOworCWNkZl9wcmludCgiICAldSBOdW1iZXIgb2YgVFhCRiBkaXJlY3RlZCBORFBBXG4iLAorCQkJc3RhdHNfcHRyLT50eGJmX2RpcmVjdGVkX25kcGFfY291bnQpOworCWNkZl9wcmludCgiICAldSBOdW1iZXIgb2YgVFhCRiByZXRyaWVkIE5EUEFcbiIsCisJCQlzdGF0c19wdHItPnR4YmZfbmRwYV9yZXRyeV9jb3VudCk7CisJY2RmX3ByaW50KCIgICV1IFRvdGFsIG51bWJlciBvZiBUWEJGIE5EUEFcbiIsCisJCQlzdGF0c19wdHItPnR4YmZfdG90YWxfbmRwYV9jb3VudCk7Cit9CisKKyNkZWZpbmUgSFRUX1RJQ0tfVE9fVVNFQyh0aWNrcywgbWljcm9zZWNfcGVyX3RpY2spICh0aWNrcyAqIG1pY3Jvc2VjX3Blcl90aWNrKQorc3RhdGljIGlubGluZSBpbnQgaHR0X3JhdGVfZmxhZ3NfdG9fbWh6KHVpbnQ4X3QgcmF0ZV9mbGFncykKK3sKKwlpZiAocmF0ZV9mbGFncyAmIDB4MjApCisJCXJldHVybiA0MDsgICAgICAvKiBXSEFMX1JDX0ZMQUdfNDBNSFogKi8KKwlpZiAocmF0ZV9mbGFncyAmIDB4NDApCisJCXJldHVybiA4MDsgICAgICAvKiBXSEFMX1JDX0ZMQUdfODBNSFogKi8KKwlpZiAocmF0ZV9mbGFncyAmIDB4ODApCisJCXJldHVybiAxNjA7ICAgICAvKiBXSEFMX1JDX0ZMQUdfMTYwTUhaICovCisJcmV0dXJuIDIwOworfQorCisjZGVmaW5lIEhUVF9GV19TVEFUU19NQVhfQkxPQ0tfQUNLX1dJTkRPVyA2NAorCitzdGF0aWMgdm9pZAoraHR0X3QyaF90eF9wcGR1X2JpdG1hcHNfcHIodWludDMyX3QgKnF1ZXVlZF9wdHIsIHVpbnQzMl90ICphY2tlZF9wdHIpCit7CisJY2hhciBxdWV1ZWRfc3RyW0hUVF9GV19TVEFUU19NQVhfQkxPQ0tfQUNLX1dJTkRPVyArIDFdOworCWNoYXIgYWNrZWRfc3RyW0hUVF9GV19TVEFUU19NQVhfQkxPQ0tfQUNLX1dJTkRPVyArIDFdOworCWludCBpLCBqLCB3b3JkOworCisJY2RmX21lbV9zZXQocXVldWVkX3N0ciwgSFRUX0ZXX1NUQVRTX01BWF9CTE9DS19BQ0tfV0lORE9XLCAnMCcpOworCWNkZl9tZW1fc2V0KGFja2VkX3N0ciwgSFRUX0ZXX1NUQVRTX01BWF9CTE9DS19BQ0tfV0lORE9XLCAnLScpOworCWkgPSAwOworCWZvciAod29yZCA9IDA7IHdvcmQgPCAyOyB3b3JkKyspIHsKKwkJdWludDMyX3QgcXVldWVkID0gKihxdWV1ZWRfcHRyICsgd29yZCk7CisJCXVpbnQzMl90IGFja2VkID0gKihhY2tlZF9wdHIgKyB3b3JkKTsKKwkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyssIGkrKykgeworCQkJaWYgKHF1ZXVlZCAmICgxIDw8IGopKSB7CisJCQkJcXVldWVkX3N0cltpXSA9ICcxJzsKKwkJCQlhY2tlZF9zdHJbaV0gPSAoYWNrZWQgJiAoMSA8PCBqKSkgPyAneScgOiAnTic7CisJCQl9CisJCX0KKwl9CisJcXVldWVkX3N0cltIVFRfRldfU1RBVFNfTUFYX0JMT0NLX0FDS19XSU5ET1ddID0gJ1wwJzsKKwlhY2tlZF9zdHJbSFRUX0ZXX1NUQVRTX01BWF9CTE9DS19BQ0tfV0lORE9XXSA9ICdcMCc7CisJY2RmX3ByaW50KCIlc1xuIiwgcXVldWVkX3N0cik7CisJY2RmX3ByaW50KCIlc1xuIiwgYWNrZWRfc3RyKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBodHRfbXNnX3JlYWQxNih1aW50MTZfdCAqcDE2KQoreworI2lmZGVmIEJJR19FTkRJQU5fSE9TVAorCS8qCisJICogRHVyaW5nIHVwbG9hZCwgdGhlIGJ5dGVzIHdpdGhpbiBlYWNoIHVpbnQzMl90IHdvcmQgd2VyZQorCSAqIHN3YXBwZWQgYnkgdGhlIEhJRiBIVy4gIFRoaXMgcmVzdWx0cyBpbiB0aGUgbG93ZXIgYW5kIHVwcGVyIGJ5dGVzCisJICogb2YgZWFjaCB1aW50MTZfdCB0byBiZSBpbiB0aGUgY29ycmVjdCBiaWctZW5kaWFuIG9yZGVyIHdpdGgKKwkgKiByZXNwZWN0IHRvIGVhY2ggb3RoZXIsIGJ1dCBmb3IgZWFjaCBldmVuLWluZGV4IHVpbnQxNl90IHRvCisJICogaGF2ZSBpdHMgcG9zaXRpb24gc3dpdGNoZWQgd2l0aCBpdHMgc3VjY2Vzc29yIG5laWdoYm9yIHVpbnQxNl90LgorCSAqIFVuZG8gdGhpcyB1aW50MTZfdCBwb3NpdGlvbiBzd2FwcGluZy4KKwkgKi8KKwlyZXR1cm4gKCgoc2l6ZV90KSBwMTYpICYgMHgyKSA/ICoocDE2IC0gMSkgOiAqKHAxNiArIDEpOworI2Vsc2UKKwlyZXR1cm4gKnAxNjsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgaHR0X21zZ19yZWFkOCh1aW50OF90ICpwOCkKK3sKKyNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKKwkvKgorCSAqIER1cmluZyB1cGxvYWQsIHRoZSBieXRlcyB3aXRoaW4gZWFjaCB1aW50MzJfdCB3b3JkIHdlcmUKKwkgKiBzd2FwcGVkIGJ5IHRoZSBISUYgSFcuCisJICogVW5kbyB0aGlzIGJ5dGUgc3dhcHBpbmcuCisJICovCisJc3dpdGNoICgoKHNpemVfdCkgcDgpICYgMHgzKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gKihwOCArIDMpOworCWNhc2UgMToKKwkJcmV0dXJuICoocDggKyAxKTsKKwljYXNlIDI6CisJCXJldHVybiAqKHA4IC0gMSk7CisJZGVmYXVsdCAvKiAzICovOgorCQlyZXR1cm4gKihwOCAtIDMpOworCX0KKyNlbHNlCisJcmV0dXJuICpwODsKKyNlbmRpZgorfQorCit2b2lkIGh0dF9tYWtlX3U4X2xpc3Rfc3RyKHVpbnQzMl90ICphbGlnbmVkX2RhdGEsCisJCQkgIGNoYXIgKmJ1ZmZlciwgaW50IHNwYWNlLCBpbnQgbWF4X2VsZW1zKQoreworCXVpbnQ4X3QgKnA4ID0gKHVpbnQ4X3QgKikgYWxpZ25lZF9kYXRhOworCWNoYXIgKmJ1Zl9wID0gYnVmZmVyOworCXdoaWxlIChtYXhfZWxlbXMtLSA+IDApIHsKKwkJaW50IGJ5dGVzOworCQl1aW50OF90IHZhbDsKKworCQl2YWwgPSBodHRfbXNnX3JlYWQ4KHA4KTsKKwkJaWYgKHZhbCA9PSAwKQorCQkJLyogbm90IGVub3VnaCBkYXRhIHRvIGZpbGwgdGhlIHJlc2VydmVkIG1zZyBidWZmZXIqLworCQkJYnJlYWs7CisKKwkJYnl0ZXMgPSBjZGZfc25wcmludChidWZfcCwgc3BhY2UsICIlZCwiLCB2YWwpOworCQlzcGFjZSAtPSBieXRlczsKKwkJaWYgKHNwYWNlID4gMCkKKwkJCWJ1Zl9wICs9IGJ5dGVzOworCQllbHNlIC8qIG5vdCBlbm91Z2ggcHJpbnQgYnVmZmVyIHNwYWNlIGZvciBhbGwgdGhlIGRhdGEgKi8KKwkJCWJyZWFrOworCQlwOCsrOworCX0KKwlpZiAoYnVmX3AgPT0gYnVmZmVyKQorCQkqYnVmX3AgPSAnXDAnOyAgICAgICAgLyogbm90aGluZyB3YXMgd3JpdHRlbiAqLworCWVsc2UKKwkJKihidWZfcCAtIDEpID0gJ1wwJzsgIC8qIGVyYXNlIHRoZSBmaW5hbCBjb21tYSAqLworCit9CisKK3ZvaWQgaHR0X21ha2VfdTE2X2xpc3Rfc3RyKHVpbnQzMl90ICphbGlnbmVkX2RhdGEsCisJCQkgICBjaGFyICpidWZmZXIsIGludCBzcGFjZSwgaW50IG1heF9lbGVtcykKK3sKKwl1aW50MTZfdCAqcDE2ID0gKHVpbnQxNl90ICopIGFsaWduZWRfZGF0YTsKKwljaGFyICpidWZfcCA9IGJ1ZmZlcjsKKwl3aGlsZSAobWF4X2VsZW1zLS0gPiAwKSB7CisJCWludCBieXRlczsKKwkJdWludDE2X3QgdmFsOworCisJCXZhbCA9IGh0dF9tc2dfcmVhZDE2KHAxNik7CisJCWlmICh2YWwgPT0gMCkKKwkJCS8qIG5vdCBlbm91Z2ggZGF0YSB0byBmaWxsIHRoZSByZXNlcnZlZCBtc2cgYnVmZmVyICovCisJCQlicmVhazsKKwkJYnl0ZXMgPSBjZGZfc25wcmludChidWZfcCwgc3BhY2UsICIlZCwiLCB2YWwpOworCQlzcGFjZSAtPSBieXRlczsKKwkJaWYgKHNwYWNlID4gMCkKKwkJCWJ1Zl9wICs9IGJ5dGVzOworCQllbHNlIC8qIG5vdCBlbm91Z2ggcHJpbnQgYnVmZmVyIHNwYWNlIGZvciBhbGwgdGhlIGRhdGEgKi8KKwkJCWJyZWFrOworCisJCXAxNisrOworCX0KKwlpZiAoYnVmX3AgPT0gYnVmZmVyKQorCQkqYnVmX3AgPSAnXDAnOyAgLyogbm90aGluZyB3YXMgd3JpdHRlbiAqLworCWVsc2UKKwkJKihidWZfcCAtIDEpID0gJ1wwJzsgICAgLyogZXJhc2UgdGhlIGZpbmFsIGNvbW1hICovCit9CisKK3ZvaWQKK2h0dF90MmhfdHhfcHBkdV9sb2dfcHJpbnQoc3RydWN0IG9sX2Z3X3R4X2RiZ19wcGR1X21zZ19oZHIgKmhkciwKKwkJCSAgc3RydWN0IG9sX2Z3X3R4X2RiZ19wcGR1X2Jhc2UgKnJlY29yZCwKKwkJCSAgaW50IGxlbmd0aCwgaW50IGNvbmNpc2UpCit7CisJaW50IGk7CisJaW50IHJlY29yZF9zaXplOworCWludCBudW1fcmVjb3JkczsKKworCXJlY29yZF9zaXplID0KKwkJc2l6ZW9mKCpyZWNvcmQpICsKKwkJaGRyLT5tcGR1X2J5dGVzX2FycmF5X2xlbiAqIHNpemVvZih1aW50MTZfdCkgKworCQloZHItPm1wZHVfbXNkdXNfYXJyYXlfbGVuICogc2l6ZW9mKHVpbnQ4X3QpICsKKwkJaGRyLT5tc2R1X2J5dGVzX2FycmF5X2xlbiAqIHNpemVvZih1aW50MTZfdCk7CisJbnVtX3JlY29yZHMgPSAobGVuZ3RoIC0gc2l6ZW9mKCpoZHIpKSAvIHJlY29yZF9zaXplOworCWNkZl9wcmludCgiVHggUFBEVSBsb2cgZWxlbWVudHM6XG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcmVjb3JkczsgaSsrKSB7CisJCXVpbnQxNl90IHN0YXJ0X3NlcV9udW07CisJCXVpbnQxNl90IHN0YXJ0X3BuX2xzYnM7CisJCXVpbnQ4X3QgbnVtX21wZHVzOworCQl1aW50MTZfdCBwZWVyX2lkOworCQl1aW50OF90IGV4dF90aWQ7CisJCXVpbnQ4X3QgcmF0ZV9jb2RlOworCQl1aW50OF90IHJhdGVfZmxhZ3M7CisJCXVpbnQ4X3QgdHJpZXM7CisJCXVpbnQ4X3QgY29tcGxldGU7CisJCXVpbnQzMl90IHRpbWVfZW5xdWV1ZV91czsKKwkJdWludDMyX3QgdGltZV9jb21wbGV0aW9uX3VzOworCQl1aW50MzJfdCAqbXNnX3dvcmQgPSAodWludDMyX3QgKikgcmVjb3JkOworCisJCS8qIGZpZWxkcyB1c2VkIGZvciBib3RoIGNvbmNpc2UgYW5kIGNvbXBsZXRlIHByaW50b3V0cyAqLworCQlzdGFydF9zZXFfbnVtID0KKwkJCSgoKihtc2dfd29yZCArIE9MX0ZXX1RYX0RCR19QUERVX1NUQVJUX1NFUV9OVU1fMTYpKSAmCisJCQkgT0xfRldfVFhfREJHX1BQRFVfU1RBUlRfU0VRX05VTV9NKSA+PgorCQkJT0xfRldfVFhfREJHX1BQRFVfU1RBUlRfU0VRX05VTV9TOworCQljb21wbGV0ZSA9CisJCQkoKCoobXNnX3dvcmQgKyBPTF9GV19UWF9EQkdfUFBEVV9DT01QTEVURV8xNikpICYKKwkJCSBPTF9GV19UWF9EQkdfUFBEVV9DT01QTEVURV9NKSA+PgorCQkJT0xfRldfVFhfREJHX1BQRFVfQ09NUExFVEVfUzsKKworCQkvKiBmaWVsZHMgdXNlZCBvbmx5IGZvciBjb21wbGV0ZSBwcmludG91dHMgKi8KKwkJaWYgKCFjb25jaXNlKSB7CisjZGVmaW5lIEJVRl9TSVpFIDgwCisJCQljaGFyIGJ1ZltCVUZfU0laRV07CisJCQl1aW50OF90ICpwODsKKwkJCXRpbWVfZW5xdWV1ZV91cyA9CisJCQkJSFRUX1RJQ0tfVE9fVVNFQyhyZWNvcmQtPnRpbWVzdGFtcF9lbnF1ZXVlLAorCQkJCQkJIGhkci0+bWljcm9zZWNfcGVyX3RpY2spOworCQkJdGltZV9jb21wbGV0aW9uX3VzID0KKwkJCQlIVFRfVElDS19UT19VU0VDKHJlY29yZC0+dGltZXN0YW1wX2NvbXBsZXRpb24sCisJCQkJCQkgaGRyLT5taWNyb3NlY19wZXJfdGljayk7CisKKwkJCXN0YXJ0X3BuX2xzYnMgPQorCQkJCSgoKgorCQkJCSAgKG1zZ193b3JkICsKKwkJCQkgICBPTF9GV19UWF9EQkdfUFBEVV9TVEFSVF9QTl9MU0JTXzE2KSkgJgorCQkJCSBPTF9GV19UWF9EQkdfUFBEVV9TVEFSVF9QTl9MU0JTX00pID4+CisJCQkJT0xfRldfVFhfREJHX1BQRFVfU1RBUlRfUE5fTFNCU19TOworCQkJbnVtX21wZHVzID0KKwkJCQkoKCoobXNnX3dvcmQgKyBPTF9GV19UWF9EQkdfUFBEVV9OVU1fTVBEVVNfMTYpKSYKKwkJCQkgT0xfRldfVFhfREJHX1BQRFVfTlVNX01QRFVTX00pID4+CisJCQkJT0xfRldfVFhfREJHX1BQRFVfTlVNX01QRFVTX1M7CisJCQlwZWVyX2lkID0KKwkJCQkoKCoobXNnX3dvcmQgKyBPTF9GV19UWF9EQkdfUFBEVV9QRUVSX0lEXzE2KSkgJgorCQkJCSBPTF9GV19UWF9EQkdfUFBEVV9QRUVSX0lEX00pID4+CisJCQkJT0xfRldfVFhfREJHX1BQRFVfUEVFUl9JRF9TOworCQkJZXh0X3RpZCA9CisJCQkJKCgqKG1zZ193b3JkICsgT0xfRldfVFhfREJHX1BQRFVfRVhUX1RJRF8xNikpICYKKwkJCQkgT0xfRldfVFhfREJHX1BQRFVfRVhUX1RJRF9NKSA+PgorCQkJCU9MX0ZXX1RYX0RCR19QUERVX0VYVF9USURfUzsKKwkJCXJhdGVfY29kZSA9CisJCQkJKCgqKG1zZ193b3JkICsgT0xfRldfVFhfREJHX1BQRFVfUkFURV9DT0RFXzE2KSkmCisJCQkJIE9MX0ZXX1RYX0RCR19QUERVX1JBVEVfQ09ERV9NKSA+PgorCQkJCU9MX0ZXX1RYX0RCR19QUERVX1JBVEVfQ09ERV9TOworCQkJcmF0ZV9mbGFncyA9CisJCQkJKCgqKG1zZ193b3JkICsgT0xfRldfVFhfREJHX1BQRFVfUkFURUZMQUdTXzE2KSkmCisJCQkJIE9MX0ZXX1RYX0RCR19QUERVX1JBVEVfRkxBR1NfTSkgPj4KKwkJCQlPTF9GV19UWF9EQkdfUFBEVV9SQVRFX0ZMQUdTX1M7CisJCQl0cmllcyA9CisJCQkJKCgqKG1zZ193b3JkICsgT0xfRldfVFhfREJHX1BQRFVfVFJJRVNfMTYpKSAmCisJCQkJIE9MX0ZXX1RYX0RCR19QUERVX1RSSUVTX00pID4+CisJCQkJT0xfRldfVFhfREJHX1BQRFVfVFJJRVNfUzsKKworCQkJY2RmX3ByaW50KCIgLSBQUERVIHR4IHRvIHBlZXIgJWQsIFRJRCAlZFxuIiwgcGVlcl9pZCwKKwkJCQkgIGV4dF90aWQpOworCQkJY2RmX3ByaW50CisJCQkJKCIgICBzdGFydCBzZXEgbnVtPSAldSwgc3RhcnQgUE4gTFNCcz0gJSMwNHhcbiIsCisJCQkJc3RhcnRfc2VxX251bSwgc3RhcnRfcG5fbHNicyk7CisJCQljZGZfcHJpbnQKKwkJCQkoIiAgIFBQRFU6ICVkIE1QRFVzLCAoPykgTVNEVXMsICVkIGJ5dGVzXG4iLAorCQkJCW51bV9tcGR1cywKKwkJCQkgLyogbnVtX21zZHVzIC0gbm90IHlldCBjb21wdXRlZCBpbiB0YXJnZXQgKi8KKwkJCQlyZWNvcmQtPm51bV9ieXRlcyk7CisJCQlpZiAoY29tcGxldGUpIHsKKwkJCQljZGZfcHJpbnQKKwkJCQkgICAgICAoIiAgIGVucXVldWVkOiAldSwgY29tcGxldGVkOiAldSB1c2VjKVxuIiwKKwkJCQkgICAgICAgdGltZV9lbnF1ZXVlX3VzLCB0aW1lX2NvbXBsZXRpb25fdXMpOworCQkJCWNkZl9wcmludAorCQkJCQkoIiAgICVkIHRyaWVzLCBsYXN0IHR4IHVzZWQgcmF0ZSAlZCAiLAorCQkJCQkgdHJpZXMsIHJhdGVfY29kZSk7CisJCQkJY2RmX3ByaW50KCJvbiAlZCBNSHogY2hhbiAoZmxhZ3MgPSAlI3gpXG4iLAorCQkJCQkgIGh0dF9yYXRlX2ZsYWdzX3RvX21oegorCQkJCQkgIChyYXRlX2ZsYWdzKSwgcmF0ZV9mbGFncyk7CisJCQkJY2RmX3ByaW50CisJCQkJICAgICAgKCIgIGVucXVldWVkIGFuZCBhY2tlZCBNUERVIGJpdG1hcHM6XG4iKTsKKwkJCQlodHRfdDJoX3R4X3BwZHVfYml0bWFwc19wcihtc2dfd29yZCArCisJCQkJCSAgIE9MX0ZXX1RYX0RCR19QUERVX0VOUVVFVUVEX0xTQlNfMTYsCisJCQkJCQkJICAgbXNnX3dvcmQgKworCQkJCQkgICBPTF9GV19UWF9EQkdfUFBEVV9CTE9DS19BQ0tfTFNCU18xNik7CisJCQl9IGVsc2UgeworCQkJCWNkZl9wcmludAorCQkJCSAgICAgICgiICBlbnF1ZXVlZDogJWQgdXMsIG5vdCB5ZXQgY29tcGxldGVkXG4iLAorCQkJCQl0aW1lX2VucXVldWVfdXMpOworCQkJfQorCQkJLyogc2tpcCB0aGUgcmVndWxhciBtc2cgZmllbGRzIHRvIHJlYWNoIHRoZSB0YWlsIGFyZWEgKi8KKwkJCXA4ID0gKHVpbnQ4X3QgKikgcmVjb3JkOworCQkJcDggKz0gc2l6ZW9mKHN0cnVjdCBvbF9md190eF9kYmdfcHBkdV9iYXNlKTsKKwkJCWlmIChoZHItPm1wZHVfYnl0ZXNfYXJyYXlfbGVuKSB7CisJCQkJaHR0X21ha2VfdTE2X2xpc3Rfc3RyKCh1aW50MzJfdCAqKSBwOCwgYnVmLAorCQkJCQkJICAgICAgQlVGX1NJWkUsCisJCQkJCQkgICAgICBoZHItPgorCQkJCQkJICAgICAgbXBkdV9ieXRlc19hcnJheV9sZW4pOworCQkJCWNkZl9wcmludCgiICAgTVBEVSBieXRlczogJXNcbiIsIGJ1Zik7CisJCQl9CisJCQlwOCArPSBoZHItPm1wZHVfYnl0ZXNfYXJyYXlfbGVuICogc2l6ZW9mKHVpbnQxNl90KTsKKwkJCWlmIChoZHItPm1wZHVfbXNkdXNfYXJyYXlfbGVuKSB7CisJCQkJaHR0X21ha2VfdThfbGlzdF9zdHIoKHVpbnQzMl90ICopIHA4LCBidWYsCisJCQkJCQkgICAgIEJVRl9TSVpFLAorCQkJCQkJICAgICBoZHItPm1wZHVfbXNkdXNfYXJyYXlfbGVuKTsKKwkJCQljZGZfcHJpbnQoIiAgIE1QRFUgTVNEVXM6ICVzXG4iLCBidWYpOworCQkJfQorCQkJcDggKz0gaGRyLT5tcGR1X21zZHVzX2FycmF5X2xlbiAqIHNpemVvZih1aW50OF90KTsKKwkJCWlmIChoZHItPm1zZHVfYnl0ZXNfYXJyYXlfbGVuKSB7CisJCQkJaHR0X21ha2VfdTE2X2xpc3Rfc3RyKCh1aW50MzJfdCAqKSBwOCwgYnVmLAorCQkJCQkJICAgICAgQlVGX1NJWkUsCisJCQkJCQkgICAgICBoZHItPgorCQkJCQkJICAgICAgbXNkdV9ieXRlc19hcnJheV9sZW4pOworCQkJCWNkZl9wcmludCgiICAgTVNEVSBieXRlczogJXNcbiIsIGJ1Zik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBjb25jaXNlICovCisJCQljZGZfcHJpbnQoInN0YXJ0IHNlcSBudW0gPSAldSAiLCBzdGFydF9zZXFfbnVtKTsKKwkJCWNkZl9wcmludCgiZW5xdWV1ZWQgYW5kIGFja2VkIE1QRFUgYml0bWFwczpcbiIpOworCQkJaWYgKGNvbXBsZXRlKSB7CisJCQkJaHR0X3QyaF90eF9wcGR1X2JpdG1hcHNfcHIobXNnX3dvcmQgKworCQkJCQlPTF9GV19UWF9EQkdfUFBEVV9FTlFVRVVFRF9MU0JTXzE2LAorCQkJCQkJCSAgIG1zZ193b3JkICsKKwkJCQkJT0xfRldfVFhfREJHX1BQRFVfQkxPQ0tfQUNLX0xTQlNfMTYpOworCQkJfSBlbHNlIHsKKwkJCQljZGZfcHJpbnQoIihub3QgY29tcGxldGVkKVxuIik7CisJCQl9CisJCX0KKwkJcmVjb3JkID0gKHN0cnVjdCBvbF9md190eF9kYmdfcHBkdV9iYXNlICopCisJCQkgKCgodWludDhfdCAqKSByZWNvcmQpICsgcmVjb3JkX3NpemUpOworCX0KK30KKwordm9pZCBodHRfdDJoX3N0YXRzX3ByaW50KHVpbnQ4X3QgKnN0YXRzX2RhdGEsIGludCBjb25jaXNlKQoreworCXVpbnQzMl90ICptc2dfd29yZCA9ICh1aW50MzJfdCAqKSBzdGF0c19kYXRhOworCWVudW0gaHR0X2RiZ19zdGF0c190eXBlIHR5cGU7CisJZW51bSBodHRfZGJnX3N0YXRzX3N0YXR1cyBzdGF0dXM7CisJaW50IGxlbmd0aDsKKworCXR5cGUgPSBIVFRfVDJIX1NUQVRTX0NPTkZfVExWX1RZUEVfR0VUKCptc2dfd29yZCk7CisJc3RhdHVzID0gSFRUX1QySF9TVEFUU19DT05GX1RMVl9TVEFUVVNfR0VUKCptc2dfd29yZCk7CisJbGVuZ3RoID0gSFRUX1QySF9TVEFUU19DT05GX1RMVl9MRU5HVEhfR0VUKCptc2dfd29yZCk7CisKKwkvKiBjaGVjayB0aGF0IHdlJ3ZlIGJlZW4gZ2l2ZW4gYSB2YWxpZCBzdGF0cyB0eXBlICovCisJaWYgKHN0YXR1cyA9PSBIVFRfREJHX1NUQVRTX1NUQVRVU19TRVJJRVNfRE9ORSkgeworCQlyZXR1cm47CisJfSBlbHNlIGlmIChzdGF0dXMgPT0gSFRUX0RCR19TVEFUU19TVEFUVVNfSU5WQUxJRCkgeworCQljZGZfcHJpbnQoIlRhcmdldCBkb2Vzbid0IHN1cHBvcnQgc3RhdHMgdHlwZSAlZFxuIiwgdHlwZSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHN0YXR1cyA9PSBIVFRfREJHX1NUQVRTX1NUQVRVU19FUlJPUikgeworCQljZGZfcHJpbnQoIlRhcmdldCBjb3VsZG4ndCB1cGxvYWQgc3RhdHMgdHlwZSAlZCAobm8gbWVtPylcbiIsCisJCQkgIHR5cGUpOworCQlyZXR1cm47CisJfQorCS8qIGdvdCB2YWxpZCAodGhvdWdoIHBlcmhhcHMgcGFydGlhbCkgc3RhdHMgLSBwcm9jZXNzIHRoZW0gKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEhUVF9EQkdfU1RBVFNfV0FMX1BERVZfVFhSWDoKKwl7CisJCXN0cnVjdCB3bGFuX2RiZ19zdGF0cyAqd2xhbl9kYmdfc3RhdHNfcHRyOworCisJCXdsYW5fZGJnX3N0YXRzX3B0ciA9CisJCQkoc3RydWN0IHdsYW5fZGJnX3N0YXRzICopKG1zZ193b3JkICsgMSk7CisJCWh0dF90Mmhfc3RhdHNfcGRldl9zdGF0c19wcmludCh3bGFuX2RiZ19zdGF0c19wdHIsCisJCQkJCSAgICAgICBjb25jaXNlKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSFRUX0RCR19TVEFUU19SWF9SRU9SREVSOgorCXsKKwkJc3RydWN0IHJ4X3Jlb3JkZXJfc3RhdHMgKnJ4X3Jlb3JkZXJfc3RhdHNfcHRyOworCisJCXJ4X3Jlb3JkZXJfc3RhdHNfcHRyID0KKwkJCShzdHJ1Y3QgcnhfcmVvcmRlcl9zdGF0cyAqKShtc2dfd29yZCArIDEpOworCQlodHRfdDJoX3N0YXRzX3J4X3Jlb3JkZXJfc3RhdHNfcHJpbnQKKwkJCShyeF9yZW9yZGVyX3N0YXRzX3B0ciwgY29uY2lzZSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSFRUX0RCR19TVEFUU19SWF9SQVRFX0lORk86CisJeworCQl3bGFuX2RiZ19yeF9yYXRlX2luZm9fdCAqcnhfcGh5X2luZm87CisJCXJ4X3BoeV9pbmZvID0KKwkJCSh3bGFuX2RiZ19yeF9yYXRlX2luZm9fdCAqKSAobXNnX3dvcmQgKyAxKTsKKworCQlodHRfdDJoX3N0YXRzX3J4X3JhdGVfc3RhdHNfcHJpbnQocnhfcGh5X2luZm8sIGNvbmNpc2UpOworCisJCWJyZWFrOworCX0KKwljYXNlIEhUVF9EQkdfU1RBVFNfUlhfUkFURV9JTkZPX1YyOgorCXsKKwkJd2xhbl9kYmdfcnhfcmF0ZV9pbmZvX3YyX3QgKnJ4X3BoeV9pbmZvOworCQlyeF9waHlfaW5mbyA9CisJCQkod2xhbl9kYmdfcnhfcmF0ZV9pbmZvX3YyX3QgKikgKG1zZ193b3JkICsgMSk7CisJCWh0dF90Mmhfc3RhdHNfcnhfcmF0ZV9zdGF0c19wcmludF92MihyeF9waHlfaW5mbywgY29uY2lzZSk7CisJCWJyZWFrOworCX0KKwljYXNlIEhUVF9EQkdfU1RBVFNfVFhfUFBEVV9MT0c6CisJeworCQlzdHJ1Y3Qgb2xfZndfdHhfZGJnX3BwZHVfbXNnX2hkciAqaGRyOworCQlzdHJ1Y3Qgb2xfZndfdHhfZGJnX3BwZHVfYmFzZSAqcmVjb3JkOworCisJCWlmIChzdGF0dXMgPT0gSFRUX0RCR19TVEFUU19TVEFUVVNfUEFSVElBTAorCQkgICAgJiYgbGVuZ3RoID09IDApIHsKKwkJCWNkZl9wcmludAorCQkJCSgiSFRUX0RCR19TVEFUU19UWF9QUERVX0xPRyAtLSBsZW5ndGggPSAwIVxuIik7CisJCQlicmVhazsKKwkJfQorCQloZHIgPQorCQkJKHN0cnVjdCBvbF9md190eF9kYmdfcHBkdV9tc2dfaGRyICopKG1zZ193b3JkICsgMSk7CisJCXJlY29yZCA9IChzdHJ1Y3Qgb2xfZndfdHhfZGJnX3BwZHVfYmFzZSAqKShoZHIgKyAxKTsKKwkJaHR0X3QyaF90eF9wcGR1X2xvZ19wcmludChoZHIsIHJlY29yZCwgbGVuZ3RoLCBjb25jaXNlKTsKKwl9CisJYnJlYWs7CisJY2FzZSBIVFRfREJHX1NUQVRTX1RYX1JBVEVfSU5GTzoKKwl7CisJCXdsYW5fZGJnX3R4X3JhdGVfaW5mb190ICp0eF9yYXRlX2luZm87CisJCXR4X3JhdGVfaW5mbyA9CisJCQkod2xhbl9kYmdfdHhfcmF0ZV9pbmZvX3QgKikgKG1zZ193b3JkICsgMSk7CisKKwkJaHR0X3QyaF9zdGF0c190eF9yYXRlX3N0YXRzX3ByaW50KHR4X3JhdGVfaW5mbywgY29uY2lzZSk7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgSFRUX0RCR19TVEFUU19UWF9SQVRFX0lORk9fVjI6CisJeworCQl3bGFuX2RiZ190eF9yYXRlX2luZm9fdjJfdCAqdHhfcmF0ZV9pbmZvOworCQl0eF9yYXRlX2luZm8gPQorCQkJKHdsYW5fZGJnX3R4X3JhdGVfaW5mb192Ml90ICopIChtc2dfd29yZCArIDEpOworCQlodHRfdDJoX3N0YXRzX3R4X3JhdGVfc3RhdHNfcHJpbnRfdjIodHhfcmF0ZV9pbmZvLCBjb25jaXNlKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSFRUX0RCR19TVEFUU19SWF9SRU1PVEVfUklOR19CVUZGRVJfSU5GTzoKKwl7CisJCXN0cnVjdCByeF9yZW1vdGVfYnVmZmVyX21nbXRfc3RhdHMgKnJ4X3JlbV9idWY7CisKKwkJcnhfcmVtX2J1ZiA9IChzdHJ1Y3QgcnhfcmVtb3RlX2J1ZmZlcl9tZ210X3N0YXRzICopKG1zZ193b3JkICsgMSk7CisJCWh0dF90Mmhfc3RhdHNfcnhfcmVtX2J1Zl9zdGF0c19wcmludChyeF9yZW1fYnVmLCBjb25jaXNlKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSFRUX0RCR19TVEFUU19UWEJGX0lORk86CisJeworCQlzdHJ1Y3Qgd2xhbl9kYmdfdHhiZl9kYXRhX3N0YXRzICp0eGJmX2luZm9fYnVmOworCisJCXR4YmZfaW5mb19idWYgPQorCQkJKHN0cnVjdCB3bGFuX2RiZ190eGJmX2RhdGFfc3RhdHMgKikobXNnX3dvcmQgKyAxKTsKKwkJaHR0X3QyaF9zdGF0c190eGJmX2luZm9fYnVmX3N0YXRzX3ByaW50KHR4YmZfaW5mb19idWYpOworCQlicmVhazsKKwl9CisJY2FzZSBIVFRfREJHX1NUQVRTX1NORF9JTkZPOgorCXsKKwkJc3RydWN0IHdsYW5fZGJnX3R4YmZfc25kX3N0YXRzICp0eGJmX3NuZF9idWY7CisKKwkJdHhiZl9zbmRfYnVmID0KKwkJCShzdHJ1Y3Qgd2xhbl9kYmdfdHhiZl9zbmRfc3RhdHMgKikobXNnX3dvcmQgKyAxKTsKKwkJaHR0X3QyaF9zdGF0c190eGJmX3NuZF9idWZfc3RhdHNfcHJpbnQodHhiZl9zbmRfYnVmKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSFRUX0RCR19TVEFUU19UWF9TRUxGR0VOX0lORk86CisJeworCQlzdHJ1Y3Qgd2xhbl9kYmdfdHhfc2VsZmdlbl9zdGF0cyAgKnR4X3NlbGZnZW5fYnVmOworCisJCXR4X3NlbGZnZW5fYnVmID0KKwkJCShzdHJ1Y3Qgd2xhbl9kYmdfdHhfc2VsZmdlbl9zdGF0cyAgKikobXNnX3dvcmQgKyAxKTsKKwkJaHR0X3QyaF9zdGF0c190eF9zZWxmZ2VuX2J1Zl9zdGF0c19wcmludCh0eF9zZWxmZ2VuX2J1Zik7CisJCWJyZWFrOworCX0KKwljYXNlIEhUVF9EQkdfU1RBVFNfRVJST1JfSU5GTzoKKwl7CisJCXN0cnVjdCB3bGFuX2RiZ193aWZpMl9lcnJvcl9zdGF0cyAgKndpZmkyX2Vycm9yX2J1ZjsKKworCQl3aWZpMl9lcnJvcl9idWYgPQorCQkJKHN0cnVjdCB3bGFuX2RiZ193aWZpMl9lcnJvcl9zdGF0cyAgKikobXNnX3dvcmQgKyAxKTsKKwkJaHR0X3QyaF9zdGF0c193aWZpMl9lcnJvcl9zdGF0c19wcmludCh3aWZpMl9lcnJvcl9idWYpOworCQlicmVhazsKKwl9CisJY2FzZSBIVFRfREJHX1NUQVRTX1RYQkZfTVVTVV9ORFBBX1BLVDoKKwl7CisJCXN0cnVjdCByeF90eGJmX211c3VfbmRwYV9wa3RzX3N0YXRzICpyeF9tdXN1X25kcGFfc3RhdHM7CisKKwkJcnhfbXVzdV9uZHBhX3N0YXRzID0gKHN0cnVjdCByeF90eGJmX211c3VfbmRwYV9wa3RzX3N0YXRzICopCisJCQkJCQkJCShtc2dfd29yZCArIDEpOworCQlodHRfdDJoX3J4X211c3VfbmRwYV9wa3RzX3N0YXRzX3ByaW50KHJ4X211c3VfbmRwYV9zdGF0cyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2RwL2h0dC9odHRfaDJ0LmMgYi9jb3JlL2RwL2h0dC9odHRfaDJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3NDYwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvaHR0L2h0dF9oMnQuYwpAQCAtMCwwICsxLDkwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBAZmlsZSBodHRfaDJ0LmMKKyAqIEBicmllZiBQcm92aWRlIGZ1bmN0aW9ucyB0byBzZW5kIGhvc3QtPnRhcmdldCBIVFQgbWVzc2FnZXMuCisgKiBAZGV0YWlscworICogIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgcmVsYXRlZCB0byBob3N0LT50YXJnZXQgSFRUIG1lc3NhZ2VzLgorICogIFRoZXJlIGFyZSBhIGNvdXBsZSBhc3BlY3RzIG9mIHRoaXMgaG9zdC0+dGFyZ2V0IG1lc3NhZ2luZzoKKyAqICAxLiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBieSBIVEMgd2hlbgorICogICAgICBhIGhvc3QtPnRhcmdldCBzZW5kIGNvbXBsZXRlcy4KKyAqICAgICAgVGhpcyBzZW5kLWNvbXBsZXRpb24gY2FsbGJhY2sgaXMgcHJpbWFyaWx5IHJlbGV2YW50IHRvIEhMLAorICogICAgICB0byBpbnZva2UgdGhlIGRvd25sb2FkIHNjaGVkdWxlciB0byBzZXQgdXAgYSBuZXcgZG93bmxvYWQsCisgKiAgICAgIGFuZCBvcHRpb25hbGx5IGZyZWUgdGhlIHR4IGZyYW1lIHdob3NlIGRvd25sb2FkIGlzIGNvbXBsZXRlZC4KKyAqICAgICAgRm9yIGJvdGggSEwgYW5kIExMLCB0aGlzIGNvbXBsZXRpb24gY2FsbGJhY2sgZnJlZXMgdXAgdGhlCisgKiAgICAgIEhUQ19QQUNLRVQgb2JqZWN0IHVzZWQgdG8gc3BlY2lmeSB0aGUgZG93bmxvYWQuCisgKiAgMi4gIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIG1lc3NhZ2VzIHRvIHNlbmQKKyAqICAgICAgZnJvbSB0aGUgaG9zdCB0byB0aGUgdGFyZ2V0LgorICovCisKKyNpbmNsdWRlIDxjZGZfbWVtb3J5Lmg+ICAgICAgICAgLyogY2RmX21lbV9jb3B5ICovCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX21hcF9zaW5nbGUgKi8KKyNpbmNsdWRlIDxodGNfYXBpLmg+ICAgICAgICAgICAgLyogSFRDX1BBQ0tFVCAqLworI2luY2x1ZGUgPGh0Yy5oPiAgICAgICAgICAgICAgICAvKiBIVENfSERSX0FMSUdOTUVOVF9QQURESU5HICovCisjaW5jbHVkZSA8aHR0Lmg+ICAgICAgICAgICAgICAgIC8qIEhUVCBob3N0LT50YXJnZXQgbXNnIGRlZnMgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2h0dF9hcGkuaD4gICAgLyogb2xfdHhfY29tcGxldGlvbl9oYW5kbGVyLCBodHRfdHhfc3RhdHVzICovCisjaW5jbHVkZSA8b2xfaHR0X3R4X2FwaS5oPgorCisjaW5jbHVkZSA8aHR0X2ludGVybmFsLmg+CisKKyNkZWZpbmUgSFRUX01TR19CVUZfU0laRShtc2dfYnl0ZXMpIFwKKwkoKG1zZ19ieXRlcykgKyBIVENfSEVBREVSX0xFTiArIEhUQ19IRFJfQUxJR05NRU5UX1BBRERJTkcpCisKKyNpZm5kZWYgY29udGFpbmVyX29mCisjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgXAorCSgodHlwZSAqKSgoY2hhciAqKShwdHIpIC0gKGNoYXIgKikoJigodHlwZSAqKTApLT5tZW1iZXIpKSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZAoraHR0X2gydF9zZW5kX2NvbXBsZXRlX2ZyZWVfbmV0YnVmKHZvaWQgKnBkZXYsIEFfU1RBVFVTIHN0YXR1cywKKwkJCQkgIGNkZl9uYnVmX3QgbmV0YnVmLCB1aW50MTZfdCBtc2R1X2lkKQoreworCWNkZl9uYnVmX2ZyZWUobmV0YnVmKTsKK30KKwordm9pZCBodHRfaDJ0X3NlbmRfY29tcGxldGUodm9pZCAqY29udGV4dCwgSFRDX1BBQ0tFVCAqaHRjX3BrdCkKK3sKKwl2b2lkICgqc2VuZF9jb21wbGV0ZV9wYXJ0Mikodm9pZCAqcGRldiwgQV9TVEFUVVMgc3RhdHVzLAorCQkJCSAgICBjZGZfbmJ1Zl90IG1zZHUsIHVpbnQxNl90IG1zZHVfaWQpOworCXN0cnVjdCBodHRfcGRldl90ICpwZGV2ID0gKHN0cnVjdCBodHRfcGRldl90ICopY29udGV4dDsKKwlzdHJ1Y3QgaHR0X2h0Y19wa3QgKmh0dF9wa3Q7CisJY2RmX25idWZfdCBuZXRidWY7CisKKwlzZW5kX2NvbXBsZXRlX3BhcnQyID0gaHRjX3BrdC0+cFBrdENvbnRleHQ7CisKKwlodHRfcGt0ID0gY29udGFpbmVyX29mKGh0Y19wa3QsIHN0cnVjdCBodHRfaHRjX3BrdCwgaHRjX3BrdCk7CisKKwkvKiBwcm9jZXNzIChmcmVlIG9yIGtlZXApIHRoZSBuZXRidWYgdGhhdCBoZWxkIHRoZSBtZXNzYWdlICovCisJbmV0YnVmID0gKGNkZl9uYnVmX3QpIGh0Y19wa3QtPnBOZXRCdWZDb250ZXh0OworCWlmIChzZW5kX2NvbXBsZXRlX3BhcnQyICE9IE5VTEwpIHsKKwkJc2VuZF9jb21wbGV0ZV9wYXJ0MihodHRfcGt0LT5wZGV2X2N0eHQsIGh0Y19wa3QtPlN0YXR1cywgbmV0YnVmLAorCQkJCSAgICBodHRfcGt0LT5tc2R1X2lkKTsKKwl9CisJLyogZnJlZSB0aGUgaHR0X2h0Y19wa3QgLyBIVENfUEFDS0VUIG9iamVjdCAqLworCWh0dF9odGNfcGt0X2ZyZWUocGRldiwgaHR0X3BrdCk7Cit9CisKK0hUQ19TRU5EX0ZVTExfQUNUSU9OIGh0dF9oMnRfZnVsbCh2b2lkICpjb250ZXh0LCBIVENfUEFDS0VUICpwa3QpCit7CisvKiBGSVggVEhJUyAqLworCXJldHVybiBIVENfU0VORF9GVUxMX0tFRVA7Cit9CisKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkKK0FfU1RBVFVTIGh0dF9oMnRfZnJhZ19kZXNjX2JhbmtfY2ZnX21zZyhzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKwlBX1NUQVRVUyByYyA9IEFfT0s7CisKKwlzdHJ1Y3QgaHR0X2h0Y19wa3QgKnBrdDsKKwljZGZfbmJ1Zl90IG1zZzsKKwl1X2ludDMyX3QgKm1zZ193b3JkOworCXN0cnVjdCBodHRfdHhfZnJhZ19kZXNjX2JhbmtfY2ZnX3QgKmJhbmtfY2ZnOworCisJcGt0ID0gaHR0X2h0Y19wa3RfYWxsb2MocGRldik7CisJaWYgKCFwa3QpCisJCXJldHVybiBBX0VSUk9SOyAvKiBmYWlsdXJlICovCisKKwkvKiBzaG93IHRoYXQgdGhpcyBpcyBub3QgYSB0eCBmcmFtZSBkb3dubG9hZAorCSAqIChub3QgcmVxdWlyZWQsIGJ1dCBoZWxwZnVsKQorCSAqLworCXBrdC0+bXNkdV9pZCA9IEhUVF9UWF9DT01QTF9JTlZfTVNEVV9JRDsKKwlwa3QtPnBkZXZfY3R4dCA9IE5VTEw7IC8qIG5vdCB1c2VkIGR1cmluZyBzZW5kLWRvbmUgY2FsbGJhY2sgKi8KKworCW1zZyA9IGNkZl9uYnVmX2FsbG9jKAorCQlwZGV2LT5vc2RldiwKKwkJSFRUX01TR19CVUZfU0laRShzaXplb2Yoc3RydWN0IGh0dF90eF9mcmFnX2Rlc2NfYmFua19jZmdfdCkpLAorCQkvKiByZXNlcnZlIHJvb20gZm9yIHRoZSBIVEMgaGVhZGVyICovCisJCUhUQ19IRUFERVJfTEVOICsgSFRDX0hEUl9BTElHTk1FTlRfUEFERElORywgNCwgdHJ1ZSk7CisJaWYgKCFtc2cpIHsKKwkJaHR0X2h0Y19wa3RfZnJlZShwZGV2LCBwa3QpOworCQlyZXR1cm4gQV9FUlJPUjsgLyogZmFpbHVyZSAqLworCX0KKworCS8qCisJICogU2V0IHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UuCisJICogVGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBIVENfSERSX0FMSUdOTUVOVF9QQURESU5HIGlzIGFkZGVkCisJICogc2VwYXJhdGVseSBkdXJpbmcgdGhlIGJlbG93IGNhbGwgdG8gYWRmX25idWZfcHVzaF9oZWFkLgorCSAqIFRoZSBjb250cmlidXRpb24gZnJvbSB0aGUgSFRDIGhlYWRlciBpcyBhZGRlZCBzZXBhcmF0ZWx5IGluc2lkZSBIVEMuCisJICovCisJY2RmX25idWZfcHV0X3RhaWwobXNnLCBzaXplb2Yoc3RydWN0IGh0dF90eF9mcmFnX2Rlc2NfYmFua19jZmdfdCkpOworCisJLyogZmlsbCBpbiB0aGUgbWVzc2FnZSBjb250ZW50cyAqLworCW1zZ193b3JkID0gKHVfaW50MzJfdCAqKSBjZGZfbmJ1Zl9kYXRhKG1zZyk7CisKKwltZW1zZXQobXNnX3dvcmQsIDAgLCBzaXplb2Yoc3RydWN0IGh0dF90eF9mcmFnX2Rlc2NfYmFua19jZmdfdCkpOworCS8qIHJld2luZCBiZXlvbmQgYWxpZ25tZW50IHBhZCB0byBnZXQgdG8gdGhlIEhUQyBoZWFkZXIgcmVzZXJ2ZWQgYXJlYSAqLworCWNkZl9uYnVmX3B1c2hfaGVhZChtc2csIEhUQ19IRFJfQUxJR05NRU5UX1BBRERJTkcpOworCisJKm1zZ193b3JkID0gMDsKKwlIVFRfSDJUX01TR19UWVBFX1NFVCgqbXNnX3dvcmQsIEhUVF9IMlRfTVNHX1RZUEVfRlJBR19ERVNDX0JBTktfQ0ZHKTsKKworCWJhbmtfY2ZnID0gKHN0cnVjdCBodHRfdHhfZnJhZ19kZXNjX2JhbmtfY2ZnX3QgKiltc2dfd29yZDsKKworCS8qKiBAbm90ZSBAdG9kbyBIYXJkIGNvZGVkIHRvIDAgQXNzdW1pbmcganVzdCBvbmUgcGRldiBmb3Igbm93LiovCisJSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19QREVWSURfU0VUKCptc2dfd29yZCwgMCk7CisJLyoqIEBub3RlIEhhcmQgY29kZWQgdG8gMS4qLworCUhUVF9IMlRfRlJBR19ERVNDX0JBTktfTlVNX0JBTktTX1NFVCgqbXNnX3dvcmQsIDEpOworCUhUVF9IMlRfRlJBR19ERVNDX0JBTktfREVTQ19TSVpFX1NFVCgqbXNnX3dvcmQsIHBkZXYtPmZyYWdfZGVzY3Muc2l6ZSk7CisJSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19TV0FQX1NFVCgqbXNnX3dvcmQsIDApOworCisJLyoqIEJhbmsgc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmUuKi8KKyNpZiBIVFRfUEFERFI2NAorCWJhbmtfY2ZnLT5iYW5rX2Jhc2VfYWRkcmVzc1swXS5sbyA9IHBkZXYtPmZyYWdfZGVzY3MucG9vbF9wYWRkcjsKKwliYW5rX2NmZy0+YmFua19iYXNlX2FkZHJlc3NbMF0uaGkgPSAwOworI2Vsc2UgLyogISBIVFRfUEFERFI2NCAqLworCWJhbmtfY2ZnLT5iYW5rX2Jhc2VfYWRkcmVzc1swXSA9IHBkZXYtPmZyYWdfZGVzY3MucG9vbF9wYWRkcjsKKyNlbmRpZiAvKiBIVFRfUEFERFI2NCAqLworCS8qIExvZ2ljYWwgTWluIGluZGV4ICovCisJSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19NSU5fSURYX1NFVChiYW5rX2NmZy0+YmFua19pbmZvWzBdLCAwKTsKKwkvKiBMb2dpY2FsIE1heCBpbmRleCAqLworCUhUVF9IMlRfRlJBR19ERVNDX0JBTktfTUFYX0lEWF9TRVQoYmFua19jZmctPmJhbmtfaW5mb1swXSwKKwkJCQkJICAgcGRldi0+ZnJhZ19kZXNjcy5wb29sX2VsZW1zLTEpOworCisJU0VUX0hUQ19QQUNLRVRfSU5GT19UWCgKKwkJJnBrdC0+aHRjX3BrdCwKKwkJaHR0X2gydF9zZW5kX2NvbXBsZXRlX2ZyZWVfbmV0YnVmLAorCQljZGZfbmJ1Zl9kYXRhKG1zZyksCisJCWNkZl9uYnVmX2xlbihtc2cpLAorCQlwZGV2LT5odGNfZW5kcG9pbnQsCisJCTEpOyAvKiB0YWcgLSBub3QgcmVsZXZhbnQgaGVyZSAqLworCisJU0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKCZwa3QtPmh0Y19wa3QsIG1zZyk7CisKKwlyYyA9IGh0Y19zZW5kX3BrdChwZGV2LT5odGNfcGRldiwgJnBrdC0+aHRjX3BrdCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkgKi8KKworQV9TVEFUVVMgaHR0X2gydF92ZXJfcmVxX21zZyhzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKwlzdHJ1Y3QgaHR0X2h0Y19wa3QgKnBrdDsKKwljZGZfbmJ1Zl90IG1zZzsKKwl1aW50MzJfdCAqbXNnX3dvcmQ7CisKKwlwa3QgPSBodHRfaHRjX3BrdF9hbGxvYyhwZGV2KTsKKwlpZiAoIXBrdCkKKwkJcmV0dXJuIEFfRVJST1I7IC8qIGZhaWx1cmUgKi8KKworCS8qIHNob3cgdGhhdCB0aGlzIGlzIG5vdCBhIHR4IGZyYW1lIGRvd25sb2FkCisJICogKG5vdCByZXF1aXJlZCwgYnV0IGhlbHBmdWwpCisJICovCisJcGt0LT5tc2R1X2lkID0gSFRUX1RYX0NPTVBMX0lOVl9NU0RVX0lEOworCXBrdC0+cGRldl9jdHh0ID0gTlVMTDsgIC8qIG5vdCB1c2VkIGR1cmluZyBzZW5kLWRvbmUgY2FsbGJhY2sgKi8KKworCS8qIHJlc2VydmUgcm9vbSBmb3IgdGhlIEhUQyBoZWFkZXIgKi8KKwltc2cgPSBjZGZfbmJ1Zl9hbGxvYyhwZGV2LT5vc2RldiwgSFRUX01TR19CVUZfU0laRShIVFRfVkVSX1JFUV9CWVRFUyksCisJCQkgICAgIEhUQ19IRUFERVJfTEVOICsgSFRDX0hEUl9BTElHTk1FTlRfUEFERElORywgNCwKKwkJCSAgICAgdHJ1ZSk7CisJaWYgKCFtc2cpIHsKKwkJaHR0X2h0Y19wa3RfZnJlZShwZGV2LCBwa3QpOworCQlyZXR1cm4gQV9FUlJPUjsgLyogZmFpbHVyZSAqLworCX0KKworCS8qCisJICogU2V0IHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UuCisJICogVGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBIVENfSERSX0FMSUdOTUVOVF9QQURESU5HIGlzIGFkZGVkCisJICogc2VwYXJhdGVseSBkdXJpbmcgdGhlIGJlbG93IGNhbGwgdG8gY2RmX25idWZfcHVzaF9oZWFkLgorCSAqIFRoZSBjb250cmlidXRpb24gZnJvbSB0aGUgSFRDIGhlYWRlciBpcyBhZGRlZCBzZXBhcmF0ZWx5IGluc2lkZSBIVEMuCisJICovCisJY2RmX25idWZfcHV0X3RhaWwobXNnLCBIVFRfVkVSX1JFUV9CWVRFUyk7CisKKwkvKiBmaWxsIGluIHRoZSBtZXNzYWdlIGNvbnRlbnRzICovCisJbXNnX3dvcmQgPSAodWludDMyX3QgKikgY2RmX25idWZfZGF0YShtc2cpOworCisJLyogcmV3aW5kIGJleW9uZCBhbGlnbm1lbnQgcGFkIHRvIGdldCB0byB0aGUgSFRDIGhlYWRlciByZXNlcnZlZCBhcmVhICovCisJY2RmX25idWZfcHVzaF9oZWFkKG1zZywgSFRDX0hEUl9BTElHTk1FTlRfUEFERElORyk7CisKKwkqbXNnX3dvcmQgPSAwOworCUhUVF9IMlRfTVNHX1RZUEVfU0VUKCptc2dfd29yZCwgSFRUX0gyVF9NU0dfVFlQRV9WRVJTSU9OX1JFUSk7CisKKwlTRVRfSFRDX1BBQ0tFVF9JTkZPX1RYKCZwa3QtPmh0Y19wa3QsCisJCQkgICAgICAgaHR0X2gydF9zZW5kX2NvbXBsZXRlX2ZyZWVfbmV0YnVmLAorCQkJICAgICAgIGNkZl9uYnVmX2RhdGEobXNnKSwgY2RmX25idWZfbGVuKG1zZyksCisJCQkgICAgICAgcGRldi0+aHRjX2VuZHBvaW50LAorCQkJICAgICAgIDEpOyAvKiB0YWcgLSBub3QgcmVsZXZhbnQgaGVyZSAqLworCisJU0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKCZwa3QtPmh0Y19wa3QsIG1zZyk7CisKKyNpZmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKKwlpZiAoaHRjX3NlbmRfcGt0KHBkZXYtPmh0Y19wZGV2LCAmcGt0LT5odGNfcGt0KSA9PSBBX09LKQorCQlodHRfaHRjX21pc2NfcGt0X2xpc3RfYWRkKHBkZXYsIHBrdCk7CisjZWxzZQorCWh0Y19zZW5kX3BrdChwZGV2LT5odGNfcGRldiwgJnBrdC0+aHRjX3BrdCk7CisjZW5kaWYKKworCXJldHVybiBBX09LOworfQorCitBX1NUQVRVUyBodHRfaDJ0X3J4X3JpbmdfY2ZnX21zZ19sbChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKwlzdHJ1Y3QgaHR0X2h0Y19wa3QgKnBrdDsKKwljZGZfbmJ1Zl90IG1zZzsKKwl1aW50MzJfdCAqbXNnX3dvcmQ7CisJaW50IGVuYWJsZV9jdHJsX2RhdGEsIGVuYWJsZV9tZ210X2RhdGEsCisJICAgIGVuYWJsZV9udWxsX2RhdGEsIGVuYWJsZV9waHlfZGF0YSwgZW5hYmxlX2hkciwKKwkgICAgZW5hYmxlX3BwZHVfc3RhcnQsIGVuYWJsZV9wcGR1X2VuZDsKKworCXBrdCA9IGh0dF9odGNfcGt0X2FsbG9jKHBkZXYpOworCWlmICghcGt0KQorCQlyZXR1cm4gQV9FUlJPUjsgLyogZmFpbHVyZSAqLworCisJLyogc2hvdyB0aGF0IHRoaXMgaXMgbm90IGEgdHggZnJhbWUgZG93bmxvYWQKKwkgICAobm90IHJlcXVpcmVkLCBidXQgaGVscGZ1bCkKKwkqLworCXBrdC0+bXNkdV9pZCA9IEhUVF9UWF9DT01QTF9JTlZfTVNEVV9JRDsKKwlwa3QtPnBkZXZfY3R4dCA9IE5VTEw7ICAvKiBub3QgdXNlZCBkdXJpbmcgc2VuZC1kb25lIGNhbGxiYWNrICovCisKKwkvKiByZXNlcnZlIHJvb20gZm9yIHRoZSBIVEMgaGVhZGVyICovCisJbXNnID0gY2RmX25idWZfYWxsb2MocGRldi0+b3NkZXYsCisJCQkgICAgIEhUVF9NU0dfQlVGX1NJWkUoSFRUX1JYX1JJTkdfQ0ZHX0JZVEVTKDEpKSwKKwkJCSAgICAgSFRDX0hFQURFUl9MRU4gKyBIVENfSERSX0FMSUdOTUVOVF9QQURESU5HLCA0LAorCQkJICAgICB0cnVlKTsKKwlpZiAoIW1zZykgeworCQlodHRfaHRjX3BrdF9mcmVlKHBkZXYsIHBrdCk7CisJCXJldHVybiBBX0VSUk9SOyAvKiBmYWlsdXJlICovCisJfQorCS8qCisJICogU2V0IHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UuCisJICogVGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBIVENfSERSX0FMSUdOTUVOVF9QQURESU5HIGlzIGFkZGVkCisJICogc2VwYXJhdGVseSBkdXJpbmcgdGhlIGJlbG93IGNhbGwgdG8gY2RmX25idWZfcHVzaF9oZWFkLgorCSAqIFRoZSBjb250cmlidXRpb24gZnJvbSB0aGUgSFRDIGhlYWRlciBpcyBhZGRlZCBzZXBhcmF0ZWx5IGluc2lkZSBIVEMuCisJICovCisJY2RmX25idWZfcHV0X3RhaWwobXNnLCBIVFRfUlhfUklOR19DRkdfQllURVMoMSkpOworCisJLyogZmlsbCBpbiB0aGUgbWVzc2FnZSBjb250ZW50cyAqLworCW1zZ193b3JkID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEobXNnKTsKKworCS8qIHJld2luZCBiZXlvbmQgYWxpZ25tZW50IHBhZCB0byBnZXQgdG8gdGhlIEhUQyBoZWFkZXIgcmVzZXJ2ZWQgYXJlYSAqLworCWNkZl9uYnVmX3B1c2hfaGVhZChtc2csIEhUQ19IRFJfQUxJR05NRU5UX1BBRERJTkcpOworCisJKm1zZ193b3JkID0gMDsKKwlIVFRfSDJUX01TR19UWVBFX1NFVCgqbXNnX3dvcmQsIEhUVF9IMlRfTVNHX1RZUEVfUlhfUklOR19DRkcpOworCUhUVF9SWF9SSU5HX0NGR19OVU1fUklOR1NfU0VUKCptc2dfd29yZCwgMSk7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisjaWYgSFRUX1BBRERSNjQKKwlIVFRfUlhfUklOR19DRkdfSURYX1NIQURPV19SRUdfUEFERFJfTE9fU0VUKCptc2dfd29yZCwKKwkJCQkJCSAgICBwZGV2LT5yeF9yaW5nLmFsbG9jX2lkeC5wYWRkcik7CisJbXNnX3dvcmQrKzsKKwlIVFRfUlhfUklOR19DRkdfSURYX1NIQURPV19SRUdfUEFERFJfSElfU0VUKCptc2dfd29yZCwgMCk7CisjZWxzZSAvKiAhIEhUVF9QQUREUjY0ICovCisJSFRUX1JYX1JJTkdfQ0ZHX0lEWF9TSEFET1dfUkVHX1BBRERSX1NFVCgqbXNnX3dvcmQsCisJCQkJCQkgcGRldi0+cnhfcmluZy5hbGxvY19pZHgucGFkZHIpOworI2VuZGlmIC8qIEhUVF9QQUREUjY0ICovCisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisjaWYgSFRUX1BBRERSNjQKKwlIVFRfUlhfUklOR19DRkdfQkFTRV9QQUREUl9MT19TRVQoKm1zZ193b3JkLAorCQkJCQkgIHBkZXYtPnJ4X3JpbmcuYmFzZV9wYWRkcik7CisJbXNnX3dvcmQrKzsKKwlIVFRfUlhfUklOR19DRkdfQkFTRV9QQUREUl9ISV9TRVQoKm1zZ193b3JkLCAwKTsKKyNlbHNlIC8qICEgSFRUX1BBRERSNjQgKi8KKwlIVFRfUlhfUklOR19DRkdfQkFTRV9QQUREUl9TRVQoKm1zZ193b3JkLCBwZGV2LT5yeF9yaW5nLmJhc2VfcGFkZHIpOworI2VuZGlmIC8qIEhUVF9QQUREUjY0ICovCisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1JYX1JJTkdfQ0ZHX0xFTl9TRVQoKm1zZ193b3JkLCBwZGV2LT5yeF9yaW5nLnNpemUpOworCUhUVF9SWF9SSU5HX0NGR19CVUZfU1pfU0VUKCptc2dfd29yZCwgSFRUX1JYX0JVRl9TSVpFKTsKKworLyogRklYIFRISVM6IGlmIHRoZSBGVyBjcmVhdGVzIGEgY29tcGxldGUgdHJhbnNsYXRlZCByeCBkZXNjcmlwdG9yLAorICogdGhlbiB0aGUgTUFDIERNQSBvZiB0aGUgSFcgcnggZGVzY3JpcHRvciBzaG91bGQgYmUgZGlzYWJsZWQuCisgKi8KKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisjaWZuZGVmIFJFTU9WRV9QS1RfTE9HCisJaWYgKG9sX2NmZ19pc19wYWNrZXRfbG9nX2VuYWJsZWQocGRldi0+Y3RybF9wZGV2KSkgeworCQllbmFibGVfY3RybF9kYXRhID0gMTsKKwkJZW5hYmxlX21nbXRfZGF0YSA9IDE7CisJCWVuYWJsZV9udWxsX2RhdGEgPSAxOworCQllbmFibGVfcGh5X2RhdGEgPSAxOworCQllbmFibGVfaGRyID0gMTsKKwkJZW5hYmxlX3BwZHVfc3RhcnQgPSAxOworCQllbmFibGVfcHBkdV9lbmQgPSAxOworCQkvKiBEaXNhYmxlIEFTUE0gd2hlbiBwa3QgbG9nIGlzIGVuYWJsZWQgKi8KKwkJY2RmX3ByaW50KCJQa3QgbG9nIGlzIGVuYWJsZWRcbiIpOworCQlodHRfaHRjX2Rpc2FibGVfYXNwbSgpOworCX0gZWxzZSB7CisJCWNkZl9wcmludCgiUGt0IGxvZyBpcyBkaXNhYmxlZFxuIik7CisJCWVuYWJsZV9jdHJsX2RhdGEgPSAwOworCQllbmFibGVfbWdtdF9kYXRhID0gMDsKKwkJZW5hYmxlX251bGxfZGF0YSA9IDA7CisJCWVuYWJsZV9waHlfZGF0YSA9IDA7CisJCWVuYWJsZV9oZHIgPSAwOworCQllbmFibGVfcHBkdV9zdGFydCA9IDA7CisJCWVuYWJsZV9wcGR1X2VuZCA9IDA7CisJfQorI2Vsc2UKKwllbmFibGVfY3RybF9kYXRhID0gMDsKKwllbmFibGVfbWdtdF9kYXRhID0gMDsKKwllbmFibGVfbnVsbF9kYXRhID0gMDsKKwllbmFibGVfcGh5X2RhdGEgPSAwOworCWVuYWJsZV9oZHIgPSAwOworCWVuYWJsZV9wcGR1X3N0YXJ0ID0gMDsKKwllbmFibGVfcHBkdV9lbmQgPSAwOworI2VuZGlmCisJSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfODAyXzExX0hEUl9TRVQoKm1zZ193b3JkLCBlbmFibGVfaGRyKTsKKwlIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX1BBWUxEX1NFVCgqbXNnX3dvcmQsIDEpOworCUhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1BQRFVfU1RBUlRfU0VUKCptc2dfd29yZCwgZW5hYmxlX3BwZHVfc3RhcnQpOworCUhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1BQRFVfRU5EX1NFVCgqbXNnX3dvcmQsIGVuYWJsZV9wcGR1X2VuZCk7CisJSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVBEVV9TVEFSVF9TRVQoKm1zZ193b3JkLCAxKTsKKwlIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NUERVX0VORF9TRVQoKm1zZ193b3JkLCAxKTsKKwlIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX1NUQVJUX1NFVCgqbXNnX3dvcmQsIDEpOworCUhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01TRFVfRU5EX1NFVCgqbXNnX3dvcmQsIDEpOworCUhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1JYX0FUVE5fU0VUKCptc2dfd29yZCwgMSk7CisJLyogYWx3YXlzIHByZXNlbnQ/ICovCisJSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfRlJBR19JTkZPX1NFVCgqbXNnX3dvcmQsIDEpOworCUhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1VDQVNUX1NFVCgqbXNnX3dvcmQsIDEpOworCUhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01DQVNUX1NFVCgqbXNnX3dvcmQsIDEpOworCS8qIE11c3QgY2hhbmdlIHRvIGR5bmFtaWMgZW5hYmxlIGF0IHJ1biB0aW1lCisJICogcmF0aGVyIHRoYW4gYXQgY29tcGlsZSB0aW1lCisJICovCisJSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfQ1RSTF9TRVQoKm1zZ193b3JkLCBlbmFibGVfY3RybF9kYXRhKTsKKwlIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NR01UX1NFVCgqbXNnX3dvcmQsIGVuYWJsZV9tZ210X2RhdGEpOworCUhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX05VTExfU0VUKCptc2dfd29yZCwgZW5hYmxlX251bGxfZGF0YSk7CisJSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfUEhZX1NFVCgqbXNnX3dvcmQsIGVuYWJsZV9waHlfZGF0YSk7CisJSFRUX1JYX1JJTkdfQ0ZHX0lEWF9JTklUX1ZBTF9TRVQoKm1zZ193b3JkLAorCQkJCQkgKnBkZXYtPnJ4X3JpbmcuYWxsb2NfaWR4LnZhZGRyKTsKKworCW1zZ193b3JkKys7CisJKm1zZ193b3JkID0gMDsKKwlIVFRfUlhfUklOR19DRkdfT0ZGU0VUXzgwMl8xMV9IRFJfU0VUKCptc2dfd29yZCwKKwkJCQkJICAgICAgUlhfREVTQ19IRFJfU1RBVFVTX09GRlNFVDMyKTsKKwlIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01TRFVfUEFZTERfU0VUKCptc2dfd29yZCwKKwkJCQkJICAgICAgSFRUX1JYX0RFU0NfUkVTRVJWQVRJT04zMik7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9QUERVX1NUQVJUX1NFVCgqbXNnX3dvcmQsCisJCQkJCSAgICAgIFJYX0RFU0NfUFBEVV9TVEFSVF9PRkZTRVQzMik7CisJSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9QUERVX0VORF9TRVQoKm1zZ193b3JkLAorCQkJCQkgICAgUlhfREVTQ19QUERVX0VORF9PRkZTRVQzMik7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NUERVX1NUQVJUX1NFVCgqbXNnX3dvcmQsCisJCQkJCSAgICAgIFJYX0RFU0NfTVBEVV9TVEFSVF9PRkZTRVQzMik7CisJSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NUERVX0VORF9TRVQoKm1zZ193b3JkLAorCQkJCQkgICAgUlhfREVTQ19NUERVX0VORF9PRkZTRVQzMik7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NU0RVX1NUQVJUX1NFVCgqbXNnX3dvcmQsCisJCQkJCSAgICAgIFJYX0RFU0NfTVNEVV9TVEFSVF9PRkZTRVQzMik7CisJSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NU0RVX0VORF9TRVQoKm1zZ193b3JkLAorCQkJCQkgICAgUlhfREVTQ19NU0RVX0VORF9PRkZTRVQzMik7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9SWF9BVFROX1NFVCgqbXNnX3dvcmQsCisJCQkJCSAgIFJYX0RFU0NfQVRUTl9PRkZTRVQzMik7CisJSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9GUkFHX0lORk9fU0VUKCptc2dfd29yZCwKKwkJCQkJICAgICBSWF9ERVNDX0ZSQUdfSU5GT19PRkZTRVQzMik7CisKKwlTRVRfSFRDX1BBQ0tFVF9JTkZPX1RYKCZwa3QtPmh0Y19wa3QsCisJCQkgICAgICAgaHR0X2gydF9zZW5kX2NvbXBsZXRlX2ZyZWVfbmV0YnVmLAorCQkJICAgICAgIGNkZl9uYnVmX2RhdGEobXNnKSwKKwkJCSAgICAgICBjZGZfbmJ1Zl9sZW4obXNnKSwKKwkJCSAgICAgICBwZGV2LT5odGNfZW5kcG9pbnQsCisJCQkgICAgICAgMSk7IC8qIHRhZyAtIG5vdCByZWxldmFudCBoZXJlICovCisKKwlTRVRfSFRDX1BBQ0tFVF9ORVRfQlVGX0NPTlRFWFQoJnBrdC0+aHRjX3BrdCwgbXNnKTsKKworI2lmZGVmIEFUSF8xMUFDX1RYQ09NUEFDVAorCWlmIChodGNfc2VuZF9wa3QocGRldi0+aHRjX3BkZXYsICZwa3QtPmh0Y19wa3QpID09IEFfT0spCisJCWh0dF9odGNfbWlzY19wa3RfbGlzdF9hZGQocGRldiwgcGt0KTsKKyNlbHNlCisJaHRjX3NlbmRfcGt0KHBkZXYtPmh0Y19wZGV2LCAmcGt0LT5odGNfcGt0KTsKKyNlbmRpZgorCXJldHVybiBBX09LOworfQorCitpbnQKK2h0dF9oMnRfZGJnX3N0YXRzX2dldChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwKKwkJICAgICAgdWludDMyX3Qgc3RhdHNfdHlwZV91cGxvYWRfbWFzaywKKwkJICAgICAgdWludDMyX3Qgc3RhdHNfdHlwZV9yZXNldF9tYXNrLAorCQkgICAgICB1aW50OF90IGNmZ19zdGF0X3R5cGUsIHVpbnQzMl90IGNmZ192YWwsIHVpbnQ2NF90IGNvb2tpZSkKK3sKKwlzdHJ1Y3QgaHR0X2h0Y19wa3QgKnBrdDsKKwljZGZfbmJ1Zl90IG1zZzsKKwl1aW50MzJfdCAqbXNnX3dvcmQ7CisKKwlwa3QgPSBodHRfaHRjX3BrdF9hbGxvYyhwZGV2KTsKKwlpZiAoIXBrdCkKKwkJcmV0dXJuIC1FSU5WQUw7ICAgICAgLyogZmFpbHVyZSAqLworCisJaWYgKHN0YXRzX3R5cGVfdXBsb2FkX21hc2sgPj0gMSA8PCBIVFRfREJHX05VTV9TVEFUUyB8fAorCSAgICBzdGF0c190eXBlX3Jlc2V0X21hc2sgPj0gMSA8PCBIVFRfREJHX05VTV9TVEFUUykgeworCQkvKiBGSVggVEhJUyAtIGFkZCBtb3JlIGRldGFpbHM/ICovCisJCWNkZl9wcmludCgiJSN4ICUjeCBzdGF0cyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJICBzdGF0c190eXBlX3VwbG9hZF9tYXNrLCBzdGF0c190eXBlX3Jlc2V0X21hc2spOworCQlyZXR1cm4gLUVJTlZBTDsgICAgICAvKiBmYWlsdXJlICovCisJfQorCisJLyogc2hvdyB0aGF0IHRoaXMgaXMgbm90IGEgdHggZnJhbWUgZG93bmxvYWQKKwkgKiAobm90IHJlcXVpcmVkLCBidXQgaGVscGZ1bCkKKwkgKi8KKwlwa3QtPm1zZHVfaWQgPSBIVFRfVFhfQ09NUExfSU5WX01TRFVfSUQ7CisJcGt0LT5wZGV2X2N0eHQgPSBOVUxMOyAgLyogbm90IHVzZWQgZHVyaW5nIHNlbmQtZG9uZSBjYWxsYmFjayAqLworCisKKwltc2cgPSBjZGZfbmJ1Zl9hbGxvYyhwZGV2LT5vc2RldiwKKwkJCSAgICAgSFRUX01TR19CVUZfU0laRShIVFRfSDJUX1NUQVRTX1JFUV9NU0dfU1opLAorCQkJICAgICAvKiByZXNlcnZlIHJvb20gZm9yIEhUQyBoZWFkZXIgKi8KKwkJCSAgICAgSFRDX0hFQURFUl9MRU4gKyBIVENfSERSX0FMSUdOTUVOVF9QQURESU5HLCA0LAorCQkJICAgICBmYWxzZSk7CisJaWYgKCFtc2cpIHsKKwkJaHR0X2h0Y19wa3RfZnJlZShwZGV2LCBwa3QpOworCQlyZXR1cm4gLUVJTlZBTDsgICAgICAvKiBmYWlsdXJlICovCisJfQorCS8qIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlICovCisJY2RmX25idWZfcHV0X3RhaWwobXNnLCBIVFRfSDJUX1NUQVRTX1JFUV9NU0dfU1opOworCisJLyogZmlsbCBpbiB0aGUgbWVzc2FnZSBjb250ZW50cyAqLworCW1zZ193b3JkID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEobXNnKTsKKworCS8qIHJld2luZCBiZXlvbmQgYWxpZ25tZW50IHBhZCB0byBnZXQgdG8gdGhlIEhUQyBoZWFkZXIgcmVzZXJ2ZWQgYXJlYSAqLworCWNkZl9uYnVmX3B1c2hfaGVhZChtc2csIEhUQ19IRFJfQUxJR05NRU5UX1BBRERJTkcpOworCisJKm1zZ193b3JkID0gMDsKKwlIVFRfSDJUX01TR19UWVBFX1NFVCgqbXNnX3dvcmQsIEhUVF9IMlRfTVNHX1RZUEVfU1RBVFNfUkVRKTsKKwlIVFRfSDJUX1NUQVRTX1JFUV9VUExPQURfVFlQRVNfU0VUKCptc2dfd29yZCwgc3RhdHNfdHlwZV91cGxvYWRfbWFzayk7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX0gyVF9TVEFUU19SRVFfUkVTRVRfVFlQRVNfU0VUKCptc2dfd29yZCwgc3RhdHNfdHlwZV9yZXNldF9tYXNrKTsKKworCW1zZ193b3JkKys7CisJKm1zZ193b3JkID0gMDsKKwlIVFRfSDJUX1NUQVRTX1JFUV9DRkdfVkFMX1NFVCgqbXNnX3dvcmQsIGNmZ192YWwpOworCUhUVF9IMlRfU1RBVFNfUkVRX0NGR19TVEFUX1RZUEVfU0VUKCptc2dfd29yZCwgY2ZnX3N0YXRfdHlwZSk7CisKKwkvKiBjb29raWUgTFNCcyAqLworCW1zZ193b3JkKys7CisJKm1zZ193b3JkID0gY29va2llICYgMHhmZmZmZmZmZjsKKworCS8qIGNvb2tpZSBNU0JzICovCisJbXNnX3dvcmQrKzsKKwkqbXNnX3dvcmQgPSBjb29raWUgPj4gMzI7CisKKwlTRVRfSFRDX1BBQ0tFVF9JTkZPX1RYKCZwa3QtPmh0Y19wa3QsCisJCQkgICAgICAgaHR0X2gydF9zZW5kX2NvbXBsZXRlX2ZyZWVfbmV0YnVmLAorCQkJICAgICAgIGNkZl9uYnVmX2RhdGEobXNnKSwKKwkJCSAgICAgICBjZGZfbmJ1Zl9sZW4obXNnKSwKKwkJCSAgICAgICBwZGV2LT5odGNfZW5kcG9pbnQsCisJCQkgICAgICAgMSk7IC8qIHRhZyAtIG5vdCByZWxldmFudCBoZXJlICovCisKKwlTRVRfSFRDX1BBQ0tFVF9ORVRfQlVGX0NPTlRFWFQoJnBrdC0+aHRjX3BrdCwgbXNnKTsKKworI2lmZGVmIEFUSF8xMUFDX1RYQ09NUEFDVAorCWlmIChodGNfc2VuZF9wa3QocGRldi0+aHRjX3BkZXYsICZwa3QtPmh0Y19wa3QpID09IEFfT0spCisJCWh0dF9odGNfbWlzY19wa3RfbGlzdF9hZGQocGRldiwgcGt0KTsKKyNlbHNlCisJaHRjX3NlbmRfcGt0KHBkZXYtPmh0Y19wZGV2LCAmcGt0LT5odGNfcGt0KTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK0FfU1RBVFVTIGh0dF9oMnRfc3luY19tc2coc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsIHVpbnQ4X3Qgc3luY19jbnQpCit7CisJc3RydWN0IGh0dF9odGNfcGt0ICpwa3Q7CisJY2RmX25idWZfdCBtc2c7CisJdWludDMyX3QgKm1zZ193b3JkOworCisJcGt0ID0gaHR0X2h0Y19wa3RfYWxsb2MocGRldik7CisJaWYgKCFwa3QpCisJCXJldHVybiBBX05PX01FTU9SWTsKKworCS8qIHNob3cgdGhhdCB0aGlzIGlzIG5vdCBhIHR4IGZyYW1lIGRvd25sb2FkCisJICAgKG5vdCByZXF1aXJlZCwgYnV0IGhlbHBmdWwpCisJKi8KKwlwa3QtPm1zZHVfaWQgPSBIVFRfVFhfQ09NUExfSU5WX01TRFVfSUQ7CisJcGt0LT5wZGV2X2N0eHQgPSBOVUxMOyAgLyogbm90IHVzZWQgZHVyaW5nIHNlbmQtZG9uZSBjYWxsYmFjayAqLworCisJLyogcmVzZXJ2ZSByb29tIGZvciBIVEMgaGVhZGVyICovCisJbXNnID0gY2RmX25idWZfYWxsb2MocGRldi0+b3NkZXYsIEhUVF9NU0dfQlVGX1NJWkUoSFRUX0gyVF9TWU5DX01TR19TWiksCisJCQkgICAgIEhUQ19IRUFERVJfTEVOICsgSFRDX0hEUl9BTElHTk1FTlRfUEFERElORywgNCwKKwkJCSAgICAgZmFsc2UpOworCWlmICghbXNnKSB7CisJCWh0dF9odGNfcGt0X2ZyZWUocGRldiwgcGt0KTsKKwkJcmV0dXJuIEFfTk9fTUVNT1JZOworCX0KKwkvKiBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSAqLworCWNkZl9uYnVmX3B1dF90YWlsKG1zZywgSFRUX0gyVF9TWU5DX01TR19TWik7CisKKwkvKiBmaWxsIGluIHRoZSBtZXNzYWdlIGNvbnRlbnRzICovCisJbXNnX3dvcmQgPSAodWludDMyX3QgKikgY2RmX25idWZfZGF0YShtc2cpOworCisJLyogcmV3aW5kIGJleW9uZCBhbGlnbm1lbnQgcGFkIHRvIGdldCB0byB0aGUgSFRDIGhlYWRlciByZXNlcnZlZCBhcmVhICovCisJY2RmX25idWZfcHVzaF9oZWFkKG1zZywgSFRDX0hEUl9BTElHTk1FTlRfUEFERElORyk7CisKKwkqbXNnX3dvcmQgPSAwOworCUhUVF9IMlRfTVNHX1RZUEVfU0VUKCptc2dfd29yZCwgSFRUX0gyVF9NU0dfVFlQRV9TWU5DKTsKKwlIVFRfSDJUX1NZTkNfQ09VTlRfU0VUKCptc2dfd29yZCwgc3luY19jbnQpOworCisJU0VUX0hUQ19QQUNLRVRfSU5GT19UWCgmcGt0LT5odGNfcGt0LAorCQkJICAgICAgIGh0dF9oMnRfc2VuZF9jb21wbGV0ZV9mcmVlX25ldGJ1ZiwKKwkJCSAgICAgICBjZGZfbmJ1Zl9kYXRhKG1zZyksCisJCQkgICAgICAgY2RmX25idWZfbGVuKG1zZyksCisJCQkgICAgICAgcGRldi0+aHRjX2VuZHBvaW50LAorCQkJICAgICAgIDEpOyAvKiB0YWcgLSBub3QgcmVsZXZhbnQgaGVyZSAqLworCisJU0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKCZwa3QtPmh0Y19wa3QsIG1zZyk7CisKKyNpZmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKKwlpZiAoaHRjX3NlbmRfcGt0KHBkZXYtPmh0Y19wZGV2LCAmcGt0LT5odGNfcGt0KSA9PSBBX09LKQorCQlodHRfaHRjX21pc2NfcGt0X2xpc3RfYWRkKHBkZXYsIHBrdCk7CisjZWxzZQorCWh0Y19zZW5kX3BrdChwZGV2LT5odGNfcGRldiwgJnBrdC0+aHRjX3BrdCk7CisjZW5kaWYKKworCXJldHVybiBBX09LOworfQorCitpbnQKK2h0dF9oMnRfYWdncl9jZmdfbXNnKHN0cnVjdCBodHRfcGRldl90ICpwZGV2LAorCQkgICAgIGludCBtYXhfc3ViZnJtc19hbXBkdSwgaW50IG1heF9zdWJmcm1zX2Ftc2R1KQoreworCXN0cnVjdCBodHRfaHRjX3BrdCAqcGt0OworCWNkZl9uYnVmX3QgbXNnOworCXVpbnQzMl90ICptc2dfd29yZDsKKworCXBrdCA9IGh0dF9odGNfcGt0X2FsbG9jKHBkZXYpOworCWlmICghcGt0KQorCQlyZXR1cm4gLUVJTlZBTDsgICAgICAvKiBmYWlsdXJlICovCisKKwkvKiBzaG93IHRoYXQgdGhpcyBpcyBub3QgYSB0eCBmcmFtZSBkb3dubG9hZAorCSAqIChub3QgcmVxdWlyZWQsIGJ1dCBoZWxwZnVsKQorCSAqLworCXBrdC0+bXNkdV9pZCA9IEhUVF9UWF9DT01QTF9JTlZfTVNEVV9JRDsKKwlwa3QtPnBkZXZfY3R4dCA9IE5VTEw7ICAvKiBub3QgdXNlZCBkdXJpbmcgc2VuZC1kb25lIGNhbGxiYWNrICovCisKKwkvKiByZXNlcnZlIHJvb20gZm9yIEhUQyBoZWFkZXIgKi8KKwltc2cgPSBjZGZfbmJ1Zl9hbGxvYyhwZGV2LT5vc2RldiwgSFRUX01TR19CVUZfU0laRShIVFRfQUdHUl9DRkdfTVNHX1NaKSwKKwkJCSAgICAgSFRDX0hFQURFUl9MRU4gKyBIVENfSERSX0FMSUdOTUVOVF9QQURESU5HLCA0LAorCQkJICAgICBmYWxzZSk7CisJaWYgKCFtc2cpIHsKKwkJaHR0X2h0Y19wa3RfZnJlZShwZGV2LCBwa3QpOworCQlyZXR1cm4gLUVJTlZBTDsgICAgICAvKiBmYWlsdXJlICovCisJfQorCS8qIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlICovCisJY2RmX25idWZfcHV0X3RhaWwobXNnLCBIVFRfQUdHUl9DRkdfTVNHX1NaKTsKKworCS8qIGZpbGwgaW4gdGhlIG1lc3NhZ2UgY29udGVudHMgKi8KKwltc2dfd29yZCA9ICh1aW50MzJfdCAqKSBjZGZfbmJ1Zl9kYXRhKG1zZyk7CisKKwkvKiByZXdpbmQgYmV5b25kIGFsaWdubWVudCBwYWQgdG8gZ2V0IHRvIHRoZSBIVEMgaGVhZGVyIHJlc2VydmVkIGFyZWEgKi8KKwljZGZfbmJ1Zl9wdXNoX2hlYWQobXNnLCBIVENfSERSX0FMSUdOTUVOVF9QQURESU5HKTsKKworCSptc2dfd29yZCA9IDA7CisJSFRUX0gyVF9NU0dfVFlQRV9TRVQoKm1zZ193b3JkLCBIVFRfSDJUX01TR19UWVBFX0FHR1JfQ0ZHKTsKKworCWlmIChtYXhfc3ViZnJtc19hbXBkdSAmJiAobWF4X3N1YmZybXNfYW1wZHUgPD0gNjQpKSB7CisJCUhUVF9BR0dSX0NGR19NQVhfTlVNX0FNUERVX1NVQkZSTV9TRVQoKm1zZ193b3JkLAorCQkJCQkJICAgICAgbWF4X3N1YmZybXNfYW1wZHUpOworCX0KKworCWlmIChtYXhfc3ViZnJtc19hbXNkdSAmJiAobWF4X3N1YmZybXNfYW1zZHUgPCAzMikpIHsKKwkJSFRUX0FHR1JfQ0ZHX01BWF9OVU1fQU1TRFVfU1VCRlJNX1NFVCgqbXNnX3dvcmQsCisJCQkJCQkgICAgICBtYXhfc3ViZnJtc19hbXNkdSk7CisJfQorCisJU0VUX0hUQ19QQUNLRVRfSU5GT19UWCgmcGt0LT5odGNfcGt0LAorCQkJICAgICAgIGh0dF9oMnRfc2VuZF9jb21wbGV0ZV9mcmVlX25ldGJ1ZiwKKwkJCSAgICAgICBjZGZfbmJ1Zl9kYXRhKG1zZyksCisJCQkgICAgICAgY2RmX25idWZfbGVuKG1zZyksCisJCQkgICAgICAgcGRldi0+aHRjX2VuZHBvaW50LAorCQkJICAgICAgIDEpOyAvKiB0YWcgLSBub3QgcmVsZXZhbnQgaGVyZSAqLworCisJU0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKCZwa3QtPmh0Y19wa3QsIG1zZyk7CisKKyNpZmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKKwlpZiAoaHRjX3NlbmRfcGt0KHBkZXYtPmh0Y19wZGV2LCAmcGt0LT5odGNfcGt0KSA9PSBBX09LKQorCQlodHRfaHRjX21pc2NfcGt0X2xpc3RfYWRkKHBkZXYsIHBrdCk7CisjZWxzZQorCWh0Y19zZW5kX3BrdChwZGV2LT5odGNfcGRldiwgJnBrdC0+aHRjX3BrdCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisjaWZkZWYgSVBBX09GRkxPQUQKK2ludCBodHRfaDJ0X2lwYV91Y19yc2NfY2ZnX21zZyhzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKwlzdHJ1Y3QgaHR0X2h0Y19wa3QgKnBrdDsKKwljZGZfbmJ1Zl90IG1zZzsKKwl1aW50MzJfdCAqbXNnX3dvcmQ7CisKKwlwa3QgPSBodHRfaHRjX3BrdF9hbGxvYyhwZGV2KTsKKwlpZiAoIXBrdCkKKwkJcmV0dXJuIEFfTk9fTUVNT1JZOworCisJLyogc2hvdyB0aGF0IHRoaXMgaXMgbm90IGEgdHggZnJhbWUgZG93bmxvYWQKKwkgKiAobm90IHJlcXVpcmVkLCBidXQgaGVscGZ1bCkKKwkgKi8KKwlwa3QtPm1zZHVfaWQgPSBIVFRfVFhfQ09NUExfSU5WX01TRFVfSUQ7CisJcGt0LT5wZGV2X2N0eHQgPSBOVUxMOyAgLyogbm90IHVzZWQgZHVyaW5nIHNlbmQtZG9uZSBjYWxsYmFjayAqLworCisJLyogcmVzZXJ2ZSByb29tIGZvciBIVEMgaGVhZGVyICovCisJbXNnID0gY2RmX25idWZfYWxsb2MocGRldi0+b3NkZXYsIEhUVF9NU0dfQlVGX1NJWkUoSFRUX1dESV9JUEFfQ0ZHX1NaKSwKKwkJCSAgICAgSFRDX0hFQURFUl9MRU4gKyBIVENfSERSX0FMSUdOTUVOVF9QQURESU5HLCA0LAorCQkJICAgICBmYWxzZSk7CisJaWYgKCFtc2cpIHsKKwkJaHR0X2h0Y19wa3RfZnJlZShwZGV2LCBwa3QpOworCQlyZXR1cm4gQV9OT19NRU1PUlk7CisJfQorCS8qIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlICovCisJY2RmX25idWZfcHV0X3RhaWwobXNnLCBIVFRfV0RJX0lQQV9DRkdfU1opOworCisJLyogZmlsbCBpbiB0aGUgbWVzc2FnZSBjb250ZW50cyAqLworCW1zZ193b3JkID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEobXNnKTsKKworCS8qIHJld2luZCBiZXlvbmQgYWxpZ25tZW50IHBhZCB0byBnZXQgdG8gdGhlIEhUQyBoZWFkZXIgcmVzZXJ2ZWQgYXJlYSAqLworCWNkZl9uYnVmX3B1c2hfaGVhZChtc2csIEhUQ19IRFJfQUxJR05NRU5UX1BBRERJTkcpOworCisJKm1zZ193b3JkID0gMDsKKwlIVFRfV0RJX0lQQV9DRkdfVFhfUEtUX1BPT0xfU0laRV9TRVQoKm1zZ193b3JkLAorCQlwZGV2LT5pcGFfdWNfdHhfcnNjLmFsbG9jX3R4X2J1Zl9jbnQpOworCUhUVF9IMlRfTVNHX1RZUEVfU0VUKCptc2dfd29yZCwgSFRUX0gyVF9NU0dfVFlQRV9XRElfSVBBX0NGRyk7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisgICAgICAgIC8qIFRYIENPTVAgUklORyBCQVNFIExPICovCisJSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfUklOR19CQVNFX0FERFJfTE9fU0VUKCptc2dfd29yZCwKKwkJKHVuc2lnbmVkIGludClwZGV2LT5pcGFfdWNfdHhfcnNjLnR4X2NvbXBfYmFzZS5wYWRkcik7CisJbXNnX3dvcmQrKzsKKwkqbXNnX3dvcmQgPSAwOworICAgICAgICAvKiBUWCBDT01QIFJJTkcgQkFTRSBISSwgTk9ORSAqLworCisJbXNnX3dvcmQrKzsKKwkqbXNnX3dvcmQgPSAwOworCUhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfU0laRV9TRVQoKm1zZ193b3JkLAorCQkodW5zaWduZWQgaW50KW9sX2NmZ19pcGFfdWNfdHhfbWF4X2J1Zl9jbnQocGRldi0+Y3RybF9wZGV2KSk7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfTE9fU0VUKCptc2dfd29yZCwKKwkJKHVuc2lnbmVkIGludClwZGV2LT5pcGFfdWNfdHhfcnNjLnR4X2NvbXBfaWR4X3BhZGRyKTsKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX0xPX1NFVCgqbXNnX3dvcmQsCisJCSh1bnNpZ25lZCBpbnQpcGRldi0+aXBhX3VjX3R4X3JzYy50eF9jZV9pZHgucGFkZHIpOworCW1zZ193b3JkKys7CisJKm1zZ193b3JkID0gMDsKKworCW1zZ193b3JkKys7CisJKm1zZ193b3JkID0gMDsKKwlIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JJTkdfQkFTRV9BRERSX0xPX1NFVCgqbXNnX3dvcmQsCisJCSh1bnNpZ25lZCBpbnQpcGRldi0+aXBhX3VjX3J4X3JzYy5yeF9pbmRfcmluZ19iYXNlLnBhZGRyKTsKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUl9ISV9TRVQoKm1zZ193b3JkLAorCQkwKTsKKworCW1zZ193b3JkKys7CisJKm1zZ193b3JkID0gMDsKKwlIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JJTkdfU0laRV9TRVQoKm1zZ193b3JkLAorCQkodW5zaWduZWQgaW50KW9sX2NmZ19pcGFfdWNfcnhfaW5kX3Jpbmdfc2l6ZShwZGV2LT5jdHJsX3BkZXYpKTsKKworCW1zZ193b3JkKys7CisJKm1zZ193b3JkID0gMDsKKwlIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JEX0lEWF9BRERSX0xPX1NFVCgqbXNnX3dvcmQsCisJCSh1bnNpZ25lZCBpbnQpcGRldi0+aXBhX3VjX3J4X3JzYy5yeF9pcGFfcHJjX2RvbmVfaWR4LnBhZGRyKTsKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SRF9JRFhfQUREUl9ISV9TRVQoKm1zZ193b3JkLAorCQkwKTsKKworCW1zZ193b3JkKys7CisJKm1zZ193b3JkID0gMDsKKwlIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1dSX0lEWF9BRERSX0xPX1NFVCgqbXNnX3dvcmQsCisJCSh1bnNpZ25lZCBpbnQpcGRldi0+aXBhX3VjX3J4X3JzYy5yeF9yZHlfaWR4X3BhZGRyKTsKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9XUl9JRFhfQUREUl9ISV9TRVQoKm1zZ193b3JkLAorCQkwKTsKKworCW1zZ193b3JkKys7CisJKm1zZ193b3JkID0gMDsKKwlIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfQkFTRV9BRERSX0xPX1NFVCgqbXNnX3dvcmQsCisJCSh1bnNpZ25lZCBpbnQpcGRldi0+aXBhX3VjX3J4X3JzYy5yeDJfaW5kX3JpbmdfYmFzZS5wYWRkcik7CisJbXNnX3dvcmQrKzsKKwkqbXNnX3dvcmQgPSAwOworCUhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9CQVNFX0FERFJfSElfU0VUKCptc2dfd29yZCwKKwkJMCk7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1NJWkVfU0VUKCptc2dfd29yZCwKKwkJKHVuc2lnbmVkIGludClvbF9jZmdfaXBhX3VjX3J4X2luZF9yaW5nX3NpemUocGRldi0+Y3RybF9wZGV2KSk7CisKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX0xPX1NFVCgqbXNnX3dvcmQsCisJCSh1bnNpZ25lZCBpbnQpcGRldi0+aXBhX3VjX3J4X3JzYy5yeF9pcGFfcHJjX2RvbmVfaWR4LnBhZGRyKTsKKwltc2dfd29yZCsrOworCSptc2dfd29yZCA9IDA7CisJSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX0hJX1NFVCgqbXNnX3dvcmQsCisJCTApOworCisJbXNnX3dvcmQrKzsKKwkqbXNnX3dvcmQgPSAwOworCUhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9XUl9JRFhfQUREUl9MT19TRVQoKm1zZ193b3JkLAorCQkodW5zaWduZWQgaW50KXBkZXYtPmlwYV91Y19yeF9yc2MucngyX3JkeV9pZHhfcGFkZHIpOworCW1zZ193b3JkKys7CisJKm1zZ193b3JkID0gMDsKKwlIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfV1JfSURYX0FERFJfSElfU0VUKCptc2dfd29yZCwKKwkJMCk7CisKKwljZGZfdHJhY2VfaGV4X2R1bXAoQ0RGX01PRFVMRV9JRF9IVFQsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJKHZvaWQgKiljZGZfbmJ1Zl9kYXRhKG1zZyksIDQwKTsKKworCVNFVF9IVENfUEFDS0VUX0lORk9fVFgoJnBrdC0+aHRjX3BrdCwKKwkJCSAgICAgICBodHRfaDJ0X3NlbmRfY29tcGxldGVfZnJlZV9uZXRidWYsCisJCQkgICAgICAgY2RmX25idWZfZGF0YShtc2cpLAorCQkJICAgICAgIGNkZl9uYnVmX2xlbihtc2cpLAorCQkJICAgICAgIHBkZXYtPmh0Y19lbmRwb2ludCwKKwkJCSAgICAgICAxKTsgLyogdGFnIC0gbm90IHJlbGV2YW50IGhlcmUgKi8KKworCVNFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVCgmcGt0LT5odGNfcGt0LCBtc2cpOworCisJaHRjX3NlbmRfcGt0KHBkZXYtPmh0Y19wZGV2LCAmcGt0LT5odGNfcGt0KTsKKworCXJldHVybiBBX09LOworfQorCitpbnQgaHR0X2gydF9pcGFfdWNfc2V0X2FjdGl2ZShzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwKKwkJCSAgICAgIGJvb2wgdWNfYWN0aXZlLCBib29sIGlzX3R4KQoreworCXN0cnVjdCBodHRfaHRjX3BrdCAqcGt0OworCWNkZl9uYnVmX3QgbXNnOworCXVpbnQzMl90ICptc2dfd29yZDsKKwl1aW50OF90IGFjdGl2ZV90YXJnZXQgPSAwOworCisJcGt0ID0gaHR0X2h0Y19wa3RfYWxsb2MocGRldik7CisJaWYgKCFwa3QpCisJCXJldHVybiBBX05PX01FTU9SWTsKKworCS8qIHNob3cgdGhhdCB0aGlzIGlzIG5vdCBhIHR4IGZyYW1lIGRvd25sb2FkCisJICogKG5vdCByZXF1aXJlZCwgYnV0IGhlbHBmdWwpCisJICovCisJcGt0LT5tc2R1X2lkID0gSFRUX1RYX0NPTVBMX0lOVl9NU0RVX0lEOworCXBrdC0+cGRldl9jdHh0ID0gTlVMTDsgIC8qIG5vdCB1c2VkIGR1cmluZyBzZW5kLWRvbmUgY2FsbGJhY2sgKi8KKworCS8qIHJlc2VydmUgcm9vbSBmb3IgSFRDIGhlYWRlciAqLworCW1zZyA9IGNkZl9uYnVmX2FsbG9jKHBkZXYtPm9zZGV2LAorCQkJICAgICBIVFRfTVNHX0JVRl9TSVpFKEhUVF9XRElfSVBBX09QX1JFUVVFU1RfU1opLAorCQkJICAgICBIVENfSEVBREVSX0xFTiArIEhUQ19IRFJfQUxJR05NRU5UX1BBRERJTkcsIDQsCisJCQkgICAgIGZhbHNlKTsKKwlpZiAoIW1zZykgeworCQlodHRfaHRjX3BrdF9mcmVlKHBkZXYsIHBrdCk7CisJCXJldHVybiBBX05PX01FTU9SWTsKKwl9CisJLyogc2V0IHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgKi8KKwljZGZfbmJ1Zl9wdXRfdGFpbChtc2csIEhUVF9XRElfSVBBX09QX1JFUVVFU1RfU1opOworCisJLyogZmlsbCBpbiB0aGUgbWVzc2FnZSBjb250ZW50cyAqLworCW1zZ193b3JkID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEobXNnKTsKKworCS8qIHJld2luZCBiZXlvbmQgYWxpZ25tZW50IHBhZCB0byBnZXQgdG8gdGhlIEhUQyBoZWFkZXIgcmVzZXJ2ZWQgYXJlYSAqLworCWNkZl9uYnVmX3B1c2hfaGVhZChtc2csIEhUQ19IRFJfQUxJR05NRU5UX1BBRERJTkcpOworCisJKm1zZ193b3JkID0gMDsKKwlpZiAodWNfYWN0aXZlICYmIGlzX3R4KQorCQlhY3RpdmVfdGFyZ2V0ID0gSFRUX1dESV9JUEFfT1BDT0RFX1RYX1JFU1VNRTsKKwllbHNlIGlmICghdWNfYWN0aXZlICYmIGlzX3R4KQorCQlhY3RpdmVfdGFyZ2V0ID0gSFRUX1dESV9JUEFfT1BDT0RFX1RYX1NVU1BFTkQ7CisJZWxzZSBpZiAodWNfYWN0aXZlICYmICFpc190eCkKKwkJYWN0aXZlX3RhcmdldCA9IEhUVF9XRElfSVBBX09QQ09ERV9SWF9SRVNVTUU7CisJZWxzZSBpZiAoIXVjX2FjdGl2ZSAmJiAhaXNfdHgpCisJCWFjdGl2ZV90YXJnZXQgPSBIVFRfV0RJX0lQQV9PUENPREVfUlhfU1VTUEVORDsKKworCUhUVF9XRElfSVBBX09QX1JFUVVFU1RfT1BfQ09ERV9TRVQoKm1zZ193b3JkLCBhY3RpdmVfdGFyZ2V0KTsKKwlIVFRfSDJUX01TR19UWVBFX1NFVCgqbXNnX3dvcmQsIEhUVF9IMlRfTVNHX1RZUEVfV0RJX0lQQV9PUF9SRVEpOworCisJU0VUX0hUQ19QQUNLRVRfSU5GT19UWCgmcGt0LT5odGNfcGt0LAorCQkJICAgICAgIGh0dF9oMnRfc2VuZF9jb21wbGV0ZV9mcmVlX25ldGJ1ZiwKKwkJCSAgICAgICBjZGZfbmJ1Zl9kYXRhKG1zZyksCisJCQkgICAgICAgY2RmX25idWZfbGVuKG1zZyksCisJCQkgICAgICAgcGRldi0+aHRjX2VuZHBvaW50LAorCQkJICAgICAgIDEpOyAvKiB0YWcgLSBub3QgcmVsZXZhbnQgaGVyZSAqLworCisJU0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKCZwa3QtPmh0Y19wa3QsIG1zZyk7CisKKwlodGNfc2VuZF9wa3QocGRldi0+aHRjX3BkZXYsICZwa3QtPmh0Y19wa3QpOworCisJcmV0dXJuIEFfT0s7Cit9CisKK2ludCBodHRfaDJ0X2lwYV91Y19nZXRfc3RhdHMoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJc3RydWN0IGh0dF9odGNfcGt0ICpwa3Q7CisJY2RmX25idWZfdCBtc2c7CisJdWludDMyX3QgKm1zZ193b3JkOworCisJcGt0ID0gaHR0X2h0Y19wa3RfYWxsb2MocGRldik7CisJaWYgKCFwa3QpCisJCXJldHVybiBBX05PX01FTU9SWTsKKworCS8qIHNob3cgdGhhdCB0aGlzIGlzIG5vdCBhIHR4IGZyYW1lIGRvd25sb2FkCisJICogKG5vdCByZXF1aXJlZCwgYnV0IGhlbHBmdWwpCisJICovCisJcGt0LT5tc2R1X2lkID0gSFRUX1RYX0NPTVBMX0lOVl9NU0RVX0lEOworCXBrdC0+cGRldl9jdHh0ID0gTlVMTDsgIC8qIG5vdCB1c2VkIGR1cmluZyBzZW5kLWRvbmUgY2FsbGJhY2sgKi8KKworCS8qIHJlc2VydmUgcm9vbSBmb3IgSFRDIGhlYWRlciAqLworCW1zZyA9IGNkZl9uYnVmX2FsbG9jKHBkZXYtPm9zZGV2LAorCQkJICAgICBIVFRfTVNHX0JVRl9TSVpFKEhUVF9XRElfSVBBX09QX1JFUVVFU1RfU1opLAorCQkJICAgICBIVENfSEVBREVSX0xFTiArIEhUQ19IRFJfQUxJR05NRU5UX1BBRERJTkcsIDQsCisJCQkgICAgIGZhbHNlKTsKKwlpZiAoIW1zZykgeworCQlodHRfaHRjX3BrdF9mcmVlKHBkZXYsIHBrdCk7CisJCXJldHVybiBBX05PX01FTU9SWTsKKwl9CisJLyogc2V0IHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgKi8KKwljZGZfbmJ1Zl9wdXRfdGFpbChtc2csIEhUVF9XRElfSVBBX09QX1JFUVVFU1RfU1opOworCisJLyogZmlsbCBpbiB0aGUgbWVzc2FnZSBjb250ZW50cyAqLworCW1zZ193b3JkID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEobXNnKTsKKworCS8qIHJld2luZCBiZXlvbmQgYWxpZ25tZW50IHBhZCB0byBnZXQgdG8gdGhlIEhUQyBoZWFkZXIgcmVzZXJ2ZWQgYXJlYSAqLworCWNkZl9uYnVmX3B1c2hfaGVhZChtc2csIEhUQ19IRFJfQUxJR05NRU5UX1BBRERJTkcpOworCisJKm1zZ193b3JkID0gMDsKKwlIVFRfV0RJX0lQQV9PUF9SRVFVRVNUX09QX0NPREVfU0VUKCptc2dfd29yZCwKKwkJCQkJICAgSFRUX1dESV9JUEFfT1BDT0RFX0RCR19TVEFUUyk7CisJSFRUX0gyVF9NU0dfVFlQRV9TRVQoKm1zZ193b3JkLCBIVFRfSDJUX01TR19UWVBFX1dESV9JUEFfT1BfUkVRKTsKKworCVNFVF9IVENfUEFDS0VUX0lORk9fVFgoJnBrdC0+aHRjX3BrdCwKKwkJCSAgICAgICBodHRfaDJ0X3NlbmRfY29tcGxldGVfZnJlZV9uZXRidWYsCisJCQkgICAgICAgY2RmX25idWZfZGF0YShtc2cpLAorCQkJICAgICAgIGNkZl9uYnVmX2xlbihtc2cpLAorCQkJICAgICAgIHBkZXYtPmh0Y19lbmRwb2ludCwKKwkJCSAgICAgICAxKTsgLyogdGFnIC0gbm90IHJlbGV2YW50IGhlcmUgKi8KKworCVNFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVCgmcGt0LT5odGNfcGt0LCBtc2cpOworCisJaHRjX3NlbmRfcGt0KHBkZXYtPmh0Y19wZGV2LCAmcGt0LT5odGNfcGt0KTsKKworCXJldHVybiBBX09LOworfQorI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL2h0dC9odHRfaW50ZXJuYWwuaCBiL2NvcmUvZHAvaHR0L2h0dF9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzcxMGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL2h0dC9odHRfaW50ZXJuYWwuaApAQCAtMCwwICsxLDUwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfSFRUX0lOVEVSTkFMX19IXworI2RlZmluZSBfSFRUX0lOVEVSTkFMX19IXworCisjaW5jbHVkZSA8YXRoZGVmcy5oPiAgICAgICAgICAgIC8qIEFfU1RBVFVTICovCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX3QgKi8KKyNpbmNsdWRlIDxjZGZfdXRpbC5oPiAgICAgICAgICAgLyogY2RmX2Fzc2VydCAqLworI2luY2x1ZGUgPGh0Y19hcGkuaD4gICAgICAgICAgICAvKiBIVENfUEFDS0VUICovCisKKyNpbmNsdWRlIDxodHRfdHlwZXMuaD4KKworI2lmbmRlZiBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZih0eXBlLCBmaWVsZCkgICAoKHNpemVfdCkoJigodHlwZSAqKTApLT5maWVsZCkpCisjZW5kaWYKKworI3VuZGVmIE1TCisjZGVmaW5lIE1TKF92LCBfZikgKCgoX3YpICYgX2YgIyMgX01BU0spID4+IF9mICMjIF9MU0IpCisjdW5kZWYgU00KKyNkZWZpbmUgU00oX3YsIF9mKSAoKChfdikgPDwgX2YgIyMgX0xTQikgJiBfZiAjIyBfTUFTSykKKyN1bmRlZiBXTworI2RlZmluZSBXTyhfZikgICAgICAoKF9mICMjIF9PRkZTRVQpID4+IDIpCisKKyNkZWZpbmUgR0VUX0ZJRUxEKF9hZGRyLCBfZikgTVMoKigoQV9VSU5UMzIgKikoX2FkZHIpICsgV08oX2YpKSwgX2YpCisKKyNpbmNsdWRlIDxyeF9kZXNjLmg+CisjaW5jbHVkZSA8d2FsX3J4X2Rlc2MuaD4gICAgICAgIC8qIHN0cnVjdCByeF9hdHRlbnRpb24sIGV0YyAqLworCitzdHJ1Y3QgaHR0X2hvc3RfZndfZGVzY19iYXNlIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBmd19yeF9kZXNjX2Jhc2UgdmFsOworCQlBX1VJTlQzMiBkdW1teV9wYWQ7ICAgICAvKiBtYWtlIHN1cmUgaXQgaXMgRE9XUkQgYWxpZ25lZCAqLworCX0gdTsKK307CisKKy8qCisgKiBUaGlzIHN0cnVjdCBkZWZpbmVzIHRoZSBiYXNpYyBkZXNjcmlwdG9yIGluZm9ybWF0aW9uIHVzZWQgYnkgaG9zdCwKKyAqIHdoaWNoIGlzIHdyaXR0ZW4gZWl0aGVyIGJ5IHRoZSAxMWFjIEhXIE1BQyBpbnRvIHRoZSBob3N0IFJ4IGRhdGEKKyAqIGJ1ZmZlciByaW5nIGRpcmVjdGx5IG9yIGdlbmVyYXRlZCBieSBGVyBhbmQgY29waWVkIGZyb20gUnggaW5kaWNhdGlvbgorICovCisjZGVmaW5lIFJYX0hUVF9IRFJfU1RBVFVTX0xFTiA2NAorc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSB7CisJc3RydWN0IGh0dF9ob3N0X2Z3X2Rlc2NfYmFzZSBmd19kZXNjOworCXN0cnVjdCByeF9hdHRlbnRpb24gYXR0ZW50aW9uOworCXN0cnVjdCByeF9mcmFnX2luZm8gZnJhZ19pbmZvOworCXN0cnVjdCByeF9tcGR1X3N0YXJ0IG1wZHVfc3RhcnQ7CisJc3RydWN0IHJ4X21zZHVfc3RhcnQgbXNkdV9zdGFydDsKKwlzdHJ1Y3QgcnhfbXNkdV9lbmQgbXNkdV9lbmQ7CisJc3RydWN0IHJ4X21wZHVfZW5kIG1wZHVfZW5kOworCXN0cnVjdCByeF9wcGR1X3N0YXJ0IHBwZHVfc3RhcnQ7CisJc3RydWN0IHJ4X3BwZHVfZW5kIHBwZHVfZW5kOworCWNoYXIgcnhfaGRyX3N0YXR1c1tSWF9IVFRfSERSX1NUQVRVU19MRU5dOworfTsKKworI2RlZmluZSBSWF9TVERfREVTQ19BVFROX09GRlNFVAlcCisJKG9mZnNldG9mKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UsIGF0dGVudGlvbikpCisjZGVmaW5lIFJYX1NURF9ERVNDX0ZSQUdfSU5GT19PRkZTRVQgXAorCShvZmZzZXRvZihzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlLCBmcmFnX2luZm8pKQorI2RlZmluZSBSWF9TVERfREVTQ19NUERVX1NUQVJUX09GRlNFVCBcCisJKG9mZnNldG9mKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UsIG1wZHVfc3RhcnQpKQorI2RlZmluZSBSWF9TVERfREVTQ19NU0RVX1NUQVJUX09GRlNFVCBcCisJKG9mZnNldG9mKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UsIG1zZHVfc3RhcnQpKQorI2RlZmluZSBSWF9TVERfREVTQ19NU0RVX0VORF9PRkZTRVQgXAorCShvZmZzZXRvZihzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlLCBtc2R1X2VuZCkpCisjZGVmaW5lIFJYX1NURF9ERVNDX01QRFVfRU5EX09GRlNFVCBcCisJKG9mZnNldG9mKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UsIG1wZHVfZW5kKSkKKyNkZWZpbmUgUlhfU1REX0RFU0NfUFBEVV9TVEFSVF9PRkZTRVQgXAorCShvZmZzZXRvZihzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlLCBwcGR1X3N0YXJ0KSkKKyNkZWZpbmUgUlhfU1REX0RFU0NfUFBEVV9FTkRfT0ZGU0VUIFwKKwkob2Zmc2V0b2Yoc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSwgcHBkdV9lbmQpKQorI2RlZmluZSBSWF9TVERfREVTQ19IRFJfU1RBVFVTX09GRlNFVCBcCisJKG9mZnNldG9mKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UsIHJ4X2hkcl9zdGF0dXMpKQorCisjZGVmaW5lIFJYX1NURF9ERVNDX0ZXX01TRFVfT0ZGU0VUIFwKKwkob2Zmc2V0b2Yoc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSwgZndfZGVzYykpCisKKyNkZWZpbmUgUlhfU1REX0RFU0NfU0laRSAoc2l6ZW9mKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UpKQorCisjZGVmaW5lIFJYX0RFU0NfQVRUTl9PRkZTRVQzMiAgICAgICAoUlhfU1REX0RFU0NfQVRUTl9PRkZTRVQgPj4gMikKKyNkZWZpbmUgUlhfREVTQ19GUkFHX0lORk9fT0ZGU0VUMzIgIChSWF9TVERfREVTQ19GUkFHX0lORk9fT0ZGU0VUID4+IDIpCisjZGVmaW5lIFJYX0RFU0NfTVBEVV9TVEFSVF9PRkZTRVQzMiAoUlhfU1REX0RFU0NfTVBEVV9TVEFSVF9PRkZTRVQgPj4gMikKKyNkZWZpbmUgUlhfREVTQ19NU0RVX1NUQVJUX09GRlNFVDMyIChSWF9TVERfREVTQ19NU0RVX1NUQVJUX09GRlNFVCA+PiAyKQorI2RlZmluZSBSWF9ERVNDX01TRFVfRU5EX09GRlNFVDMyICAgKFJYX1NURF9ERVNDX01TRFVfRU5EX09GRlNFVCA+PiAyKQorI2RlZmluZSBSWF9ERVNDX01QRFVfRU5EX09GRlNFVDMyICAgKFJYX1NURF9ERVNDX01QRFVfRU5EX09GRlNFVCA+PiAyKQorI2RlZmluZSBSWF9ERVNDX1BQRFVfU1RBUlRfT0ZGU0VUMzIgKFJYX1NURF9ERVNDX1BQRFVfU1RBUlRfT0ZGU0VUID4+IDIpCisjZGVmaW5lIFJYX0RFU0NfUFBEVV9FTkRfT0ZGU0VUMzIgICAoUlhfU1REX0RFU0NfUFBEVV9FTkRfT0ZGU0VUID4+IDIpCisjZGVmaW5lIFJYX0RFU0NfSERSX1NUQVRVU19PRkZTRVQzMiAoUlhfU1REX0RFU0NfSERSX1NUQVRVU19PRkZTRVQgPj4gMikKKworI2RlZmluZSBSWF9TVERfREVTQ19TSVpFX0RXT1JEICAgICAgKFJYX1NURF9ERVNDX1NJWkUgPj4gMikKKworLyoKKyAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIG1pbmltdW0gaGVhZHJvb20gcHJvdmlkZWQgaW4gdGhlIHJ4IG5ldGJ1ZnMKKyAqIGZvciB1c2UgYnkgdGhlIE9TIHNoaW0gYW5kIE9TIGFuZCByeCBkYXRhIGNvbnN1bWVycy4KKyAqLworI2RlZmluZSBIVFRfUlhfQlVGX09TX01JTl9IRUFEUk9PTSAzMgorI2RlZmluZSBIVFRfUlhfU1REX0RFU0NfUkVTRVJWQVRJT04gIFwKKwkoKEhUVF9SWF9CVUZfT1NfTUlOX0hFQURST09NID4gUlhfU1REX0RFU0NfU0laRSkgPyBcCisJIEhUVF9SWF9CVUZfT1NfTUlOX0hFQURST09NIDogUlhfU1REX0RFU0NfU0laRSkKKyNkZWZpbmUgSFRUX1JYX0RFU0NfUkVTRVJWQVRJT04zMiBcCisJKEhUVF9SWF9TVERfREVTQ19SRVNFUlZBVElPTiA+PiAyKQorCisjZGVmaW5lIEhUVF9SWF9ERVNDX0FMSUdOX01BU0sgNyAgICAgICAgLyogOC1ieXRlIGFsaWdubWVudCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICpodHRfcnhfZGVzYyhjZGZfbmJ1Zl90IG1zZHUpCit7CisJcmV0dXJuIChzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICopCisJICAgICAgICgoKHNpemVfdCkgKGNkZl9uYnVmX2hlYWQobXNkdSkgKyBIVFRfUlhfREVTQ19BTElHTl9NQVNLKSkgJgorCQl+SFRUX1JYX0RFU0NfQUxJR05fTUFTSyk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfTFJPKQorLyoqCisgKiBodHRfcHJpbnRfcnhfZGVzY19scm8oKSAtIHByaW50IExSTyBpbmZvcm1hdGlvbiBpbiB0aGUgcngKKyAqIGRlc2NyaXB0b3IKKyAqIEByeF9kZXNjOiBIVFQgcnggZGVzY3JpcHRvcgorICoKKyAqIFByaW50cyB0aGUgTFJPIHJlbGF0ZWQgZmllbGRzIGluIHRoZSBIVFQgcnggZGVzY3JpcHRvcgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaHR0X3ByaW50X3J4X2Rlc2NfbHJvKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKnJ4X2Rlc2MpCit7CisJY2RmX3ByaW50CisJCSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVJYIERFU0MgTFJPLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJY2RmX3ByaW50KCJtc2R1X2VuZC5scm9fZWxpZ2libGU6MHgleFxuIiwKKwkJIHJ4X2Rlc2MtPm1zZHVfZW5kLmxyb19lbGlnaWJsZSk7CisJY2RmX3ByaW50KCJtc2R1X3N0YXJ0LnRjcF9vbmx5X2FjazoweCV4XG4iLAorCQkgcnhfZGVzYy0+bXNkdV9zdGFydC50Y3Bfb25seV9hY2spOworCWNkZl9wcmludCgibXNkdV9lbmQudGNwX3VkcF9jaGtzdW06MHgleFxuIiwKKwkJIHJ4X2Rlc2MtPm1zZHVfZW5kLnRjcF91ZHBfY2hrc3VtKTsKKwljZGZfcHJpbnQoIm1zZHVfZW5kLnRjcF9zZXFfbnVtYmVyOjB4JXhcbiIsCisJCSByeF9kZXNjLT5tc2R1X2VuZC50Y3Bfc2VxX251bWJlcik7CisJY2RmX3ByaW50KCJtc2R1X2VuZC50Y3BfYWNrX251bWJlcjoweCV4XG4iLAorCQkgcnhfZGVzYy0+bXNkdV9lbmQudGNwX2Fja19udW1iZXIpOworCWNkZl9wcmludCgibXNkdV9zdGFydC50Y3BfcHJvdG86MHgleFxuIiwKKwkJIHJ4X2Rlc2MtPm1zZHVfc3RhcnQudGNwX3Byb3RvKTsKKwljZGZfcHJpbnQoIm1zZHVfc3RhcnQuaXB2Nl9wcm90bzoweCV4XG4iLAorCQkgcnhfZGVzYy0+bXNkdV9zdGFydC5pcHY2X3Byb3RvKTsKKwljZGZfcHJpbnQoIm1zZHVfc3RhcnQuaXB2NF9wcm90bzoweCV4XG4iLAorCQkgcnhfZGVzYy0+bXNkdV9zdGFydC5pcHY0X3Byb3RvKTsKKwljZGZfcHJpbnQoIm1zZHVfc3RhcnQubDNfb2Zmc2V0OjB4JXhcbiIsCisJCSByeF9kZXNjLT5tc2R1X3N0YXJ0LmwzX29mZnNldCk7CisJY2RmX3ByaW50KCJtc2R1X3N0YXJ0Lmw0X29mZnNldDoweCV4XG4iLAorCQkgcnhfZGVzYy0+bXNkdV9zdGFydC5sNF9vZmZzZXQpOworCWNkZl9wcmludCgibXNkdV9zdGFydC5mbG93X2lkX3RvZXBsaXR6OjB4JXhcbiIsCisJCQkgICByeF9kZXNjLT5tc2R1X3N0YXJ0LmZsb3dfaWRfdG9lcGxpdHopOworCWNkZl9wcmludAorCQkoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cit9CisKKy8qKgorICogaHR0X3ByaW50X3J4X2Rlc2NfbHJvKCkgLSBleHRyYWN0IExSTyBpbmZvcm1hdGlvbiBmcm9tIHRoZSByeAorICogZGVzY3JpcHRvcgorICogQG1zZHU6IG5ldHdvcmsgYnVmZmVyCisgKiBAcnhfZGVzYzogSFRUIHJ4IGRlc2NyaXB0b3IKKyAqCisgKiBFeHRyYWN0cyB0aGUgTFJPIHJlbGF0ZWQgZmllbGRzIGZyb20gdGhlIEhUVCByeCBkZXNjcmlwdG9yCisgKiBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIG5ldHdvcmsgYnVmZmVyJ3MgY29udHJvbCBibG9jaworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaHR0X3J4X2V4dHJhY3RfbHJvX2luZm8oY2RmX25idWZfdCBtc2R1LAorCSBzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICpyeF9kZXNjKQoreworCU5CVUZfTFJPX0VMSUdJQkxFKG1zZHUpID0gcnhfZGVzYy0+bXNkdV9lbmQubHJvX2VsaWdpYmxlOworCWlmIChyeF9kZXNjLT5tc2R1X2VuZC5scm9fZWxpZ2libGUpIHsKKwkJTkJVRl9UQ1BfUFVSRV9BQ0sobXNkdSkgPSByeF9kZXNjLT5tc2R1X3N0YXJ0LnRjcF9vbmx5X2FjazsKKwkJTkJVRl9UQ1BfQ0hLU1VNKG1zZHUpID0gcnhfZGVzYy0+bXNkdV9lbmQudGNwX3VkcF9jaGtzdW07CisJCU5CVUZfVENQX1NFUV9OVU0obXNkdSkgPSByeF9kZXNjLT5tc2R1X2VuZC50Y3Bfc2VxX251bWJlcjsKKwkJTkJVRl9UQ1BfQUNLX05VTShtc2R1KSA9IHJ4X2Rlc2MtPm1zZHVfZW5kLnRjcF9hY2tfbnVtYmVyOworCQlOQlVGX1RDUF9XSU4obXNkdSkgPSByeF9kZXNjLT5tc2R1X2VuZC53aW5kb3dfc2l6ZTsKKwkJTkJVRl9UQ1BfUFJPVE8obXNkdSkgPSByeF9kZXNjLT5tc2R1X3N0YXJ0LnRjcF9wcm90bzsKKwkJTkJVRl9JUFY2X1BST1RPKG1zZHUpID0gcnhfZGVzYy0+bXNkdV9zdGFydC5pcHY2X3Byb3RvOworCQlOQlVGX0lQX09GRlNFVChtc2R1KSA9IHJ4X2Rlc2MtPm1zZHVfc3RhcnQubDNfb2Zmc2V0OworCQlOQlVGX1RDUF9PRkZTRVQobXNkdSkgPSByeF9kZXNjLT5tc2R1X3N0YXJ0Lmw0X29mZnNldDsKKwkJTkJVRl9GTE9XX0lEX1RPRVBMSVRaKG1zZHUpID0KKwkJCSByeF9kZXNjLT5tc2R1X3N0YXJ0LmZsb3dfaWRfdG9lcGxpdHo7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBodHRfcHJpbnRfcnhfZGVzY19scm8oc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqcnhfZGVzYykKK3t9CitzdGF0aWMgaW5saW5lIHZvaWQgaHR0X3J4X2V4dHJhY3RfbHJvX2luZm8oY2RmX25idWZfdCBtc2R1LAorCSBzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICpyeF9kZXNjKSB7fQorI2VuZGlmIC8qIEZFQVRVUkVfTFJPICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBodHRfcHJpbnRfcnhfZGVzYyhzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICpyeF9kZXNjKQoreworCWNkZl9wcmludAorCQkoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS1SWCBERVNDLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJY2RmX3ByaW50KCJhdHRlbnRpb246ICUjMDEweFxuIiwKKwkJICAodW5zaWduZWQgaW50KSgqKHVpbnQzMl90ICopICZyeF9kZXNjLT5hdHRlbnRpb24pKTsKKwljZGZfcHJpbnQoImZyYWdfaW5mbzogJSMwMTB4XG4iLAorCQkgICh1bnNpZ25lZCBpbnQpKCoodWludDMyX3QgKikgJnJ4X2Rlc2MtPmZyYWdfaW5mbykpOworCWNkZl9wcmludCgibXBkdV9zdGFydDogJSMwMTB4ICUjMDEweCAlIzAxMHhcbiIsCisJCSAgKHVuc2lnbmVkIGludCkoKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXBkdV9zdGFydClbMF0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPm1wZHVfc3RhcnQpWzFdKSwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5tcGR1X3N0YXJ0KVsyXSkpOworCWNkZl9wcmludCgibXNkdV9zdGFydDogJSMwMTB4ICUjMDEweCAlIzAxMHhcbiIsCisJCSAgKHVuc2lnbmVkIGludCkoKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXNkdV9zdGFydClbMF0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPm1zZHVfc3RhcnQpWzFdKSwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5tc2R1X3N0YXJ0KVsyXSkpOworCWNkZl9wcmludCgibXNkdV9lbmQ6ICUjMDEweCAlIzAxMHggJSMwMTB4ICUjMDEweCAlIzAxMHhcbiIsCisJCSAgKHVuc2lnbmVkIGludCkoKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXNkdV9lbmQpWzBdKSwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5tc2R1X2VuZClbMV0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPm1zZHVfZW5kKVsyXSksCisJCSAgKHVuc2lnbmVkIGludCkoKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXNkdV9lbmQpWzNdKSwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5tc2R1X2VuZClbNF0pKTsKKwljZGZfcHJpbnQoIm1wZHVfZW5kOiAlIzAxMHhcbiIsCisJCSAgKHVuc2lnbmVkIGludCkoKih1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXBkdV9lbmQpKTsKKwljZGZfcHJpbnQoInBwZHVfc3RhcnQ6ICIgIiUjMDEweCAlIzAxMHggJSMwMTB4ICUjMDEweCAlIzAxMHhcbiIKKwkJICAiJSMwMTB4ICUjMDEweCAlIzAxMHggJSMwMTB4ICUjMDEweFxuIiwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5wcGR1X3N0YXJ0KVswXSksCisJCSAgKHVuc2lnbmVkIGludCkoKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+cHBkdV9zdGFydClbMV0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfc3RhcnQpWzJdKSwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5wcGR1X3N0YXJ0KVszXSksCisJCSAgKHVuc2lnbmVkIGludCkoKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+cHBkdV9zdGFydClbNF0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfc3RhcnQpWzVdKSwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5wcGR1X3N0YXJ0KVs2XSksCisJCSAgKHVuc2lnbmVkIGludCkoKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+cHBkdV9zdGFydClbN10pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfc3RhcnQpWzhdKSwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5wcGR1X3N0YXJ0KVs5XSkpOworCWNkZl9wcmludCgicHBkdV9lbmQ6IiAiJSMwMTB4ICUjMDEweCAlIzAxMHggJSMwMTB4ICUjMDEweFxuIgorCQkgICIlIzAxMHggJSMwMTB4ICUjMDEweCAlIzAxMHggJSMwMTB4XG4iCisJCSAgIiUjMDEweCwlIzAxMHggJSMwMTB4ICUjMDEweCAlIzAxMHhcbiIKKwkJICAiJSMwMTB4ICUjMDEweCAlIzAxMHggJSMwMTB4ICUjMDEweFxuIiAiJSMwMTB4ICUjMDEweFxuIiwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5wcGR1X2VuZClbMF0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxXSksCisJCSAgKHVuc2lnbmVkIGludCkoKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+cHBkdV9lbmQpWzJdKSwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5wcGR1X2VuZClbM10pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVs0XSksCisJCSAgKHVuc2lnbmVkIGludCkoKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+cHBkdV9lbmQpWzVdKSwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5wcGR1X2VuZClbNl0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVs3XSksCisJCSAgKHVuc2lnbmVkIGludCkoKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+cHBkdV9lbmQpWzhdKSwKKwkJICAodW5zaWduZWQgaW50KSgoKHVpbnQzMl90ICopICZyeF9kZXNjLT5wcGR1X2VuZClbOV0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxMF0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxMV0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxMl0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxM10pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxNF0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxNV0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxNl0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxN10pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxOF0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsxOV0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsyMF0pLAorCQkgICh1bnNpZ25lZCBpbnQpKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPnBwZHVfZW5kKVsyMV0pKTsKKwljZGZfcHJpbnQKKwkJKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworfQorCisjaWZuZGVmIEhUVF9BU1NFUlRfTEVWRUwKKyNkZWZpbmUgSFRUX0FTU0VSVF9MRVZFTCAzCisjZW5kaWYKKworI2RlZmluZSBIVFRfQVNTRVJUX0FMV0FZUyhjb25kaXRpb24pIGNkZl9hc3NlcnRfYWx3YXlzKChjb25kaXRpb24pKQorCisjZGVmaW5lIEhUVF9BU1NFUlQwKGNvbmRpdGlvbikgY2RmX2Fzc2VydCgoY29uZGl0aW9uKSkKKyNpZiBIVFRfQVNTRVJUX0xFVkVMID4gMAorI2RlZmluZSBIVFRfQVNTRVJUMShjb25kaXRpb24pIGNkZl9hc3NlcnQoKGNvbmRpdGlvbikpCisjZWxzZQorI2RlZmluZSBIVFRfQVNTRVJUMShjb25kaXRpb24pCisjZW5kaWYKKworI2lmIEhUVF9BU1NFUlRfTEVWRUwgPiAxCisjZGVmaW5lIEhUVF9BU1NFUlQyKGNvbmRpdGlvbikgY2RmX2Fzc2VydCgoY29uZGl0aW9uKSkKKyNlbHNlCisjZGVmaW5lIEhUVF9BU1NFUlQyKGNvbmRpdGlvbikKKyNlbmRpZgorCisjaWYgSFRUX0FTU0VSVF9MRVZFTCA+IDIKKyNkZWZpbmUgSFRUX0FTU0VSVDMoY29uZGl0aW9uKSBjZGZfYXNzZXJ0KChjb25kaXRpb24pKQorI2Vsc2UKKyNkZWZpbmUgSFRUX0FTU0VSVDMoY29uZGl0aW9uKQorI2VuZGlmCisKKyNkZWZpbmUgSFRUX01BQ19BRERSX0xFTiA2CisKKy8qCisgKiBIVFRfTUFYX1NFTkRfUVVFVUVfREVQVEggLQorICogSG93IG1hbnkgcGFja2V0cyBIVEMgc2hvdWxkIGFsbG93IHRvIGFjY3VtdWxhdGUgaW4gYSBzZW5kIHF1ZXVlCisgKiBiZWZvcmUgY2FsbGluZyB0aGUgRXBTZW5kRnVsbCBjYWxsYmFjayB0byBzZWUgd2hldGhlciB0byByZXRhaW4KKyAqIG9yIGRyb3AgcGFja2V0cy4KKyAqIFRoaXMgaXMgbm90IHJlbGV2YW50IGZvciBMTCwgd2hlcmUgdHggZGVzY3JpcHRvcnMgc2hvdWxkIGJlIGltbWVkaWF0ZWx5CisgKiBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQuCisgKiBUaGlzIGlzIG5vdCB2ZXJ5IHJlbGV2YW50IGZvciBITCBlaXRoZXIsIHNpbmNlIGl0IGlzIGFudGljaXBhdGVkIHRoYXQKKyAqIHRoZSBITCB0eCBkb3dubG9hZCBzY2hlZHVsZXIgd2lsbCBub3Qgd29yayB0aGlzIGZhciBpbiBhZHZhbmNlIC0gcmF0aGVyLAorICogaXQgd2lsbCBtYWtlIGl0cyBkZWNpc2lvbnMganVzdC1pbi10aW1lLCBzbyBpdCBjYW4gYmUgcmVzcG9uc2l2ZSB0bworICogY2hhbmdpbmcgY29uZGl0aW9ucy4KKyAqIEhlbmNlLCB0aGlzIHF1ZXVlIGRlcHRoIHRocmVzaG9sZCBzcGVjIGlzIG1vc3RseSBqdXN0IGEgZm9ybWFsaXR5LgorICovCisjZGVmaW5lIEhUVF9NQVhfU0VORF9RVUVVRV9ERVBUSCA2NAorCisjZGVmaW5lIElTX1BXUjIodmFsdWUpICgoKHZhbHVlKSBeICgodmFsdWUpLTEpKSA9PSAoKHZhbHVlKSA8PCAxKSAtIDEpCisKKy8qIEZJWCBUSElTCisgKiBTaG91bGQgYmU6IHNpemVvZihzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzYykgKyBtYXggcnggTVNEVSBzaXplLAorICogcm91bmRlZCB1cCB0byBhIGNhY2hlIGxpbmUgc2l6ZS4KKyAqLworI2RlZmluZSBIVFRfUlhfQlVGX1NJWkUgMTkyMAorLyoKKyAqIERNQV9NQVAgZXhwZWN0cyB0aGUgYnVmZmVyIHRvIGJlIGFuIGludGVncmFsIG51bWJlciBvZiBjYWNoZSBsaW5lcy4KKyAqIFJhdGhlciB0aGFuIGNoZWNraW5nIHRoZSBhY3R1YWwgY2FjaGUgbGluZSBzaXplLCB0aGlzIGNvZGUgbWFrZXMgYQorICogY29uc2VydmF0aXZlIGVzdGltYXRlIG9mIHdoYXQgdGhlIGNhY2hlIGxpbmUgc2l6ZSBjb3VsZCBiZS4KKyAqLworI2RlZmluZSBIVFRfTE9HMl9NQVhfQ0FDSEVfTElORV9TSVpFIDcgIC8qIDJeNyA9IDEyOCAqLworI2RlZmluZSBIVFRfTUFYX0NBQ0hFX0xJTkVfU0laRV9NQVNLICgoMSA8PCBIVFRfTE9HMl9NQVhfQ0FDSEVfTElORV9TSVpFKSAtIDEpCisKKyNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKKy8qCisgKiBiaWctZW5kaWFuOiBieXRlcyB3aXRoaW4gYSA0LWJ5dGUgIndvcmQiIGFyZSBzd2FwcGVkOgorICogcHJlLXN3YXAgIHBvc3Qtc3dhcAorICogIGluZGV4ICAgICBpbmRleAorICogICAgMCAgICAgICAgIDMKKyAqICAgIDEgICAgICAgICAyCisgKiAgICAyICAgICAgICAgMQorICogICAgMyAgICAgICAgIDAKKyAqICAgIDQgICAgICAgICA3CisgKiAgICA1ICAgICAgICAgNgorICogZXRjLgorICogVG8gY29tcHV0ZSB0aGUgcG9zdC1zd2FwIGluZGV4IGZyb20gdGhlIHByZS1zd2FwIGluZGV4LCBjb21wdXRlCisgKiB0aGUgYnl0ZSBvZmZzZXQgZm9yIHRoZSBzdGFydCBvZiB0aGUgd29yZCAoaW5kZXggJiB+MHgzKSBhbmQgYWRkCisgKiB0aGUgc3dhcHBlZCBieXRlIG9mZnNldCB3aXRoaW4gdGhlIHdvcmQgKDMgLSAoaW5kZXggJiAweDMpKS4KKyAqLworI2RlZmluZSBIVFRfRU5ESUFOX0JZVEVfSURYX1NXQVAoaWR4KSAoKChpZHgpICYgfjB4MykgKyAoMyAtICgoaWR4KSAmIDB4MykpKQorI2Vsc2UKKy8qIGxpdHRsZS1lbmRpYW46IG5vIGFkanVzdG1lbnQgbmVlZGVkICovCisjZGVmaW5lIEhUVF9FTkRJQU5fQllURV9JRFhfU1dBUChpZHgpIGlkeAorI2VuZGlmCisKKyNkZWZpbmUgSFRUX1RYX01VVEVYX0lOSVQoX211dGV4KQkJCVwKKwljZGZfc3BpbmxvY2tfaW5pdChfbXV0ZXgpCisKKyNkZWZpbmUgSFRUX1RYX01VVEVYX0FDUVVJUkUoX211dGV4KQkJCVwKKwljZGZfc3Bpbl9sb2NrX2JoKF9tdXRleCkKKworI2RlZmluZSBIVFRfVFhfTVVURVhfUkVMRUFTRShfbXV0ZXgpCQkJXAorCWNkZl9zcGluX3VubG9ja19iaChfbXV0ZXgpCisKKyNkZWZpbmUgSFRUX1RYX01VVEVYX0RFU1RST1koX211dGV4KQkJCVwKKwljZGZfc3BpbmxvY2tfZGVzdHJveShfbXV0ZXgpCisKKyNkZWZpbmUgSFRUX1RYX0RFU0NfUEFERFIoX3BkZXYsIF90eF9kZXNjX3ZhZGRyKSAgICAgICBcCisJKChfcGRldiktPnR4X2Rlc2NzLnBvb2xfcGFkZHIgKyAgKHVpbnQzMl90KQkgIFwKKwkgKChjaGFyICopKF90eF9kZXNjX3ZhZGRyKSAtCQkJICAgXAorCSAgKGNoYXIgKikoKF9wZGV2KS0+dHhfZGVzY3MucG9vbF92YWRkcikpKQorCisjaWZkZWYgQVRIXzExQUNfVFhDT01QQUNUCisKKyNkZWZpbmUgSFRUX1RYX05CVUZfUVVFVUVfTVVURVhfSU5JVChfcGRldikJCVwKKwljZGZfc3BpbmxvY2tfaW5pdCgmX3BkZXYtPnR4bmJ1ZnFfbXV0ZXgpCisKKyNkZWZpbmUgSFRUX1RYX05CVUZfUVVFVUVfTVVURVhfREVTVFJPWShfcGRldikJICAgICAgIFwKKwlIVFRfVFhfTVVURVhfREVTVFJPWSgmX3BkZXYtPnR4bmJ1ZnFfbXV0ZXgpCisKKyNkZWZpbmUgSFRUX1RYX05CVUZfUVVFVUVfUkVNT1ZFKF9wZGV2LCBfbXNkdSkJZG8gewlcCisJSFRUX1RYX01VVEVYX0FDUVVJUkUoJl9wZGV2LT50eG5idWZxX211dGV4KTsJXAorCV9tc2R1ID0gIGNkZl9uYnVmX3F1ZXVlX3JlbW92ZSgmX3BkZXYtPnR4bmJ1ZnEpO1wKKwlIVFRfVFhfTVVURVhfUkVMRUFTRSgmX3BkZXYtPnR4bmJ1ZnFfbXV0ZXgpOyAgICBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfTkJVRl9RVUVVRV9BREQoX3BkZXYsIF9tc2R1KSBkbyB7CVwKKwlIVFRfVFhfTVVURVhfQUNRVUlSRSgmX3BkZXYtPnR4bmJ1ZnFfbXV0ZXgpOwlcCisJY2RmX25idWZfcXVldWVfYWRkKCZfcGRldi0+dHhuYnVmcSwgX21zZHUpOyAgICAgXAorCUhUVF9UWF9NVVRFWF9SRUxFQVNFKCZfcGRldi0+dHhuYnVmcV9tdXRleCk7ICAgIFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9UWF9OQlVGX1FVRVVFX0lOU0VSVF9IRUFEKF9wZGV2LCBfbXNkdSkgZG8geyAgIFwKKwlIVFRfVFhfTVVURVhfQUNRVUlSRSgmX3BkZXYtPnR4bmJ1ZnFfbXV0ZXgpOwkgICBcCisJY2RmX25idWZfcXVldWVfaW5zZXJ0X2hlYWQoJl9wZGV2LT50eG5idWZxLCBfbXNkdSk7XAorCUhUVF9UWF9NVVRFWF9SRUxFQVNFKCZfcGRldi0+dHhuYnVmcV9tdXRleCk7ICAgICAgIFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKworI2RlZmluZSBIVFRfVFhfTkJVRl9RVUVVRV9NVVRFWF9JTklUKF9wZGV2KQorI2RlZmluZSBIVFRfVFhfTkJVRl9RVUVVRV9SRU1PVkUoX3BkZXYsIF9tc2R1KQorI2RlZmluZSBIVFRfVFhfTkJVRl9RVUVVRV9BREQoX3BkZXYsIF9tc2R1KQorI2RlZmluZSBIVFRfVFhfTkJVRl9RVUVVRV9JTlNFUlRfSEVBRChfcGRldiwgX21zZHUpCisjZGVmaW5lIEhUVF9UWF9OQlVGX1FVRVVFX01VVEVYX0RFU1RST1koX3BkZXYpCisKKyNlbmRpZgorCisjaWZkZWYgQVRIXzExQUNfVFhDT01QQUNUCisjZGVmaW5lIEhUVF9UWF9TQ0hFRCBodHRfdHhfc2NoZWQKKyNlbHNlCisjZGVmaW5lIEhUVF9UWF9TQ0hFRChwZGV2KSAgICAgIC8qIG5vLW9wICovCisjZW5kaWYKKworaW50IGh0dF90eF9hdHRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsIGludCBkZXNjX3Bvb2xfZWxlbXMpOworCit2b2lkIGh0dF90eF9kZXRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpOworCitpbnQgaHR0X3J4X2F0dGFjaChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisKK3ZvaWQgaHR0X3J4X2RldGFjaChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisKK2ludCBodHRfaHRjX2F0dGFjaChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisKK3ZvaWQgaHR0X3QyaF9tc2dfaGFuZGxlcih2b2lkICpjb250ZXh0LCBIVENfUEFDS0VUICpwa3QpOworCit2b2lkIGh0dF9oMnRfc2VuZF9jb21wbGV0ZSh2b2lkICpjb250ZXh0LCBIVENfUEFDS0VUICpwa3QpOworCitBX1NUQVRVUyBodHRfaDJ0X3Zlcl9yZXFfbXNnKHN0cnVjdCBodHRfcGRldl90ICpwZGV2KTsKKworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorQV9TVEFUVVMKK2h0dF9oMnRfZnJhZ19kZXNjX2JhbmtfY2ZnX21zZyhzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisKK2V4dGVybiBBX1NUQVRVUyBodHRfaDJ0X3J4X3JpbmdfY2ZnX21zZ19sbChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CitleHRlcm4gQV9TVEFUVVMgKCpodHRfaDJ0X3J4X3JpbmdfY2ZnX21zZykoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpOworCitIVENfU0VORF9GVUxMX0FDVElPTiBodHRfaDJ0X2Z1bGwodm9pZCAqY29udGV4dCwgSFRDX1BBQ0tFVCAqcGt0KTsKKworc3RydWN0IGh0dF9odGNfcGt0ICpodHRfaHRjX3BrdF9hbGxvYyhzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisKK3ZvaWQgaHR0X2h0Y19wa3RfZnJlZShzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwgc3RydWN0IGh0dF9odGNfcGt0ICpwa3QpOworCit2b2lkIGh0dF9odGNfcGt0X3Bvb2xfZnJlZShzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisKKyNpZmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKK3ZvaWQKK2h0dF9odGNfbWlzY19wa3RfbGlzdF9hZGQoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsIHN0cnVjdCBodHRfaHRjX3BrdCAqcGt0KTsKKwordm9pZCBodHRfaHRjX21pc2NfcGt0X3Bvb2xfZnJlZShzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisjZW5kaWYKKwordm9pZCBodHRfaHRjX2Rpc2FibGVfYXNwbSh2b2lkKTsKKworaW50CitodHRfcnhfaGFzaF9saXN0X2luc2VydChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwgdWludDMyX3QgcGFkZHIsCisJCQljZGZfbmJ1Zl90IG5ldGJ1Zik7CisKK2NkZl9uYnVmX3QgaHR0X3J4X2hhc2hfbGlzdF9sb29rdXAoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsIHVpbnQzMl90IHBhZGRyKTsKKworI2lmZGVmIElQQV9PRkZMT0FECitpbnQKK2h0dF90eF9pcGFfdWNfYXR0YWNoKHN0cnVjdCBodHRfcGRldl90ICpwZGV2LAorCQkgICAgIHVuc2lnbmVkIGludCB1Y190eF9idWZfc3osCisJCSAgICAgdW5zaWduZWQgaW50IHVjX3R4X2J1Zl9jbnQsCisJCSAgICAgdW5zaWduZWQgaW50IHVjX3R4X3BhcnRpdGlvbl9iYXNlKTsKKworaW50CitodHRfcnhfaXBhX3VjX2F0dGFjaChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwgdW5zaWduZWQgaW50IHJ4X2luZF9yaW5nX3NpemUpOworCitpbnQgaHR0X3R4X2lwYV91Y19kZXRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpOworCitpbnQgaHR0X3J4X2lwYV91Y19kZXRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50CitodHRfdHhfaXBhX3VjX2F0dGFjaChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwKKwkJICAgICB1bnNpZ25lZCBpbnQgdWNfdHhfYnVmX3N6LAorCQkgICAgIHVuc2lnbmVkIGludCB1Y190eF9idWZfY250LAorCQkgICAgIHVuc2lnbmVkIGludCB1Y190eF9wYXJ0aXRpb25fYmFzZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2h0dF9yeF9pcGFfdWNfYXR0YWNoKHN0cnVjdCBodHRfcGRldl90ICpwZGV2LCB1bnNpZ25lZCBpbnQgcnhfaW5kX3Jpbmdfc2l6ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaHR0X3R4X2lwYV91Y19kZXRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGh0dF9yeF9pcGFfdWNfZGV0YWNoKHN0cnVjdCBodHRfcGRldl90ICpwZGV2KQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCisjZW5kaWYgLyogX0hUVF9JTlRFUk5BTF9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvaHR0L2h0dF9yeC5jIGIvY29yZS9kcC9odHQvaHR0X3J4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3NzYzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvaHR0L2h0dF9yeC5jCkBAIC0wLDAgKzEsMjQ0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBAZmlsZSBodHRfcnguYworICogQGJyaWVmIEltcGxlbWVudCByZWNlaXZlIGFzcGVjdHMgb2YgSFRULgorICogQGRldGFpbHMKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhyZWUgY2F0ZWdvcmllcyBvZiBIVFQgcnggY29kZToKKyAqICAxLiAgQW4gYWJzdHJhY3Rpb24gb2YgdGhlIHJ4IGRlc2NyaXB0b3IsIHRvIGhpZGUgdGhlCisgKiAgICAgIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIEhMIHZzLiBMTCByeCBkZXNjcmlwdG9yLgorICogIDIuICBGdW5jdGlvbnMgZm9yIHByb3ZpZGluZyBhY2Nlc3MgdG8gdGhlIChzZXJpZXMgb2YpCisgKiAgICAgIHJ4IGRlc2NyaXB0b3IocykgYW5kIHJ4IGZyYW1lKHMpIGFzc29jaWF0ZWQgd2l0aAorICogICAgICBhbiByeCBpbmRpY2F0aW9uIG1lc3NhZ2UuCisgKiAgMy4gIEZ1bmN0aW9ucyBmb3Igc2V0dGluZyB1cCBhbmQgdXNpbmcgdGhlIE1BQyBETUEKKyAqICAgICAgcnggcmluZyAoYXBwbGllcyB0byBMTCBvbmx5KS4KKyAqLworCisjaW5jbHVkZSA8Y2RmX21lbW9yeS5oPiAgICAgICAgIC8qIGNkZl9tZW1fbWFsbG9jLGZyZWUsIGV0Yy4gKi8KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4gICAgICAgICAgLyogY2RmX3ByaW50LCBib29sICovCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX3QsIGV0Yy4gKi8KKyNpbmNsdWRlIDxjZGZfc29mdGlycV90aW1lci5oPiAgLyogY2RmX3NvZnRpcnFfdGltZXJfZnJlZSAqLworCisjaW5jbHVkZSA8aHR0Lmg+ICAgICAgICAgICAgICAgIC8qIEhUVF9ITF9SWF9ERVNDX1NJWkUgKi8KKyNpbmNsdWRlIDxvbF9jZmcuaD4KKyNpbmNsdWRlIDxvbF9yeC5oPgorI2luY2x1ZGUgPG9sX2h0dF9yeF9hcGkuaD4KKyNpbmNsdWRlIDxodHRfaW50ZXJuYWwuaD4gICAgICAgLyogSFRUX0FTU0VSVCwgaHR0X3BkZXZfdCwgSFRUX1JYX0JVRl9TSVpFICovCisjaW5jbHVkZSAicmVndGFibGUuaCIKKworI2luY2x1ZGUgPGNkc19pZWVlODAyMTFfY29tbW9uLmg+ICAgLyogaWVlZTgwMjExX2ZyYW1lLCBpZWVlODAyMTFfcW9zY250bCAqLworI2luY2x1ZGUgPGNkc19pZWVlODAyMTFfZGVmaW5lcy5oPiAgLyogaWVlZTgwMjExX3J4X3N0YXR1cyAqLworCisjaWZkZWYgREVCVUdfRE1BX0RPTkUKKyNpbmNsdWRlIDxhc20vYmFycmllci5oPgorI2luY2x1ZGUgPHdtYV9hcGkuaD4KKyNlbmRpZgorCisvKiBBUjk4ODh2MSBXT1JLQVJPVU5EIGZvciBFViMxMTIzNjcgKi8KKy8qIEZJWCBUSElTIC0gcmVtb3ZlIHRoaXMgV0FSIHdoZW4gdGhlIGJ1ZyBpcyBmaXhlZCAqLworI2RlZmluZSBQRVJFR1JJTkVfMV8wX1pFUk9fTEVOX1BIWV9FUlJfV0FSCisKKy8qLS0tIHNldHVwIC8gdGVhci1kb3duIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIVFRfUlhfUklOR19TSVpFX01JTgorI2RlZmluZSBIVFRfUlhfUklOR19TSVpFX01JTiAxMjggICAgICAgIC8qIHNsaWdodGx5ID4gdGhhbiBvbmUgbGFyZ2UgQS1NUERVICovCisjZW5kaWYKKworI2lmbmRlZiBIVFRfUlhfUklOR19TSVpFX01BWAorI2RlZmluZSBIVFRfUlhfUklOR19TSVpFX01BWCAyMDQ4ICAgICAgIC8qIH4yMCBtcyBAIDEgR2JwcyBvZiAxNTAwQiBNU0RVcyAqLworI2VuZGlmCisKKyNpZm5kZWYgSFRUX1JYX0FWR19GUk1fQllURVMKKyNkZWZpbmUgSFRUX1JYX0FWR19GUk1fQllURVMgMTAwMAorI2VuZGlmCisKKyNpZm5kZWYgSFRUX1JYX0hPU1RfTEFURU5DWV9NQVhfTVMKKyNkZWZpbmUgSFRUX1JYX0hPU1RfTEFURU5DWV9NQVhfTVMgMjAgLyogbXMgKi8JLyogdmVyeSBjb25zZXJ2YXRpdmUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEhUVF9SWF9IT1NUX0xBVEVOQ1lfV09SU1RfTElLRUxZX01TCisjZGVmaW5lIEhUVF9SWF9IT1NUX0xBVEVOQ1lfV09SU1RfTElLRUxZX01TIDEwIC8qIG1zICovCS8qIGNvbnNlcnZhdGl2ZSAqLworI2VuZGlmCisKKyNpZm5kZWYgSFRUX1JYX1JJTkdfUkVGSUxMX1JFVFJZX1RJTUVfTVMKKyNkZWZpbmUgSFRUX1JYX1JJTkdfUkVGSUxMX1JFVFJZX1RJTUVfTVMgICAgNTAKKyNlbmRpZgorCisvKi0tLSBSWCBJbiBPcmRlciBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBOdW1iZXIgb2YgYnVja2V0cyBpbiB0aGUgaGFzaCB0YWJsZSAqLworI2RlZmluZSBSWF9OVU1fSEFTSF9CVUNLRVRTIDEwMjQgICAgICAgIC8qIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgUlhfTlVNX0hBU0hfQlVDS0VUU19NQVNLIChSWF9OVU1fSEFTSF9CVUNLRVRTIC0gMSkKKworLyogTnVtYmVyIG9mIGhhc2ggZW50cmllcyBhbGxvY2F0ZWQgcGVyIGJ1Y2tldCAqLworI2RlZmluZSBSWF9FTlRSSUVTX1NJWkUgMTAKKworI2RlZmluZSBSWF9IQVNIX0ZVTkNUSU9OKGEpICgoKGEgPj4gMTQpIF4gKGEgPj4gNCkpICYgUlhfTlVNX0hBU0hfQlVDS0VUU19NQVNLKQorCisjaWZkZWYgUlhfSEFTSF9ERUJVR19MT0cKKyNkZWZpbmUgUlhfSEFTSF9MT0coeCkgeAorI2Vsc2UKKyNkZWZpbmUgUlhfSEFTSF9MT0coeCkgICAgICAgICAgLyogbm8tb3AgKi8KKyNlbmRpZgorCisvKiBEZSAtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gb2YgdGhlIHJ4IGJ1ZmZlciBoYXNoIHRhYmxlLiBUaGlzIGZ1bmN0aW9uIHdpbGwKKyAgIGZyZWUgdXAgdGhlIGhhc2ggdGFibGUgd2hpY2ggaW5jbHVkZXMgZnJlZWluZyBhbGwgdGhlIHBlbmRpbmcgcnggYnVmZmVycyovCit2b2lkIGh0dF9yeF9oYXNoX2RlaW5pdChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKworCXVpbnQzMl90IGk7CisJc3RydWN0IGh0dF9yeF9oYXNoX2VudHJ5ICpoYXNoX2VudHJ5OworCXN0cnVjdCBodHRfbGlzdF9ub2RlICpsaXN0X2l0ZXIgPSBOVUxMOworCisJaWYgKE5VTEwgPT0gcGRldi0+cnhfcmluZy5oYXNoX3RhYmxlKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IFJYX05VTV9IQVNIX0JVQ0tFVFM7IGkrKykgeworCQkvKiBGcmVlIHRoZSBoYXNoIGVudHJpZXMgaW4gaGFzaCBidWNrZXQgaSAqLworCQlsaXN0X2l0ZXIgPSBwZGV2LT5yeF9yaW5nLmhhc2hfdGFibGVbaV0ubGlzdGhlYWQubmV4dDsKKwkJd2hpbGUgKGxpc3RfaXRlciAhPSAmcGRldi0+cnhfcmluZy5oYXNoX3RhYmxlW2ldLmxpc3RoZWFkKSB7CisJCQloYXNoX2VudHJ5ID0KKwkJCQkoc3RydWN0IGh0dF9yeF9oYXNoX2VudHJ5ICopKChjaGFyICopbGlzdF9pdGVyIC0KKwkJCQkJCQkgICAgIHBkZXYtPnJ4X3JpbmcuCisJCQkJCQkJICAgICBsaXN0bm9kZV9vZmZzZXQpOworCQkJaWYgKGhhc2hfZW50cnktPm5ldGJ1ZikgeworCQkJCWNkZl9uYnVmX2ZyZWUoaGFzaF9lbnRyeS0+bmV0YnVmKTsKKwkJCQloYXNoX2VudHJ5LT5wYWRkciA9IDA7CisJCQl9CisJCQlsaXN0X2l0ZXIgPSBsaXN0X2l0ZXItPm5leHQ7CisKKwkJCWlmICghaGFzaF9lbnRyeS0+ZnJvbWxpc3QpCisJCQkJY2RmX21lbV9mcmVlKGhhc2hfZW50cnkpOworCQl9CisKKwkJY2RmX21lbV9mcmVlKHBkZXYtPnJ4X3JpbmcuaGFzaF90YWJsZVtpXS5lbnRyaWVzKTsKKworCX0KKwljZGZfbWVtX2ZyZWUocGRldi0+cnhfcmluZy5oYXNoX3RhYmxlKTsKKwlwZGV2LT5yeF9yaW5nLmhhc2hfdGFibGUgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGNlaWxfcHdyMihpbnQgdmFsdWUpCit7CisJaW50IGxvZzI7CisJaWYgKElTX1BXUjIodmFsdWUpKQorCQlyZXR1cm4gdmFsdWU7CisKKwlsb2cyID0gMDsKKwl3aGlsZSAodmFsdWUpIHsKKwkJdmFsdWUgPj49IDE7CisJCWxvZzIrKzsKKwl9CisJcmV0dXJuIDEgPDwgbG9nMjsKK30KKworc3RhdGljIGJvb2wKK2h0dF9yeF9tc2R1X2ZpcnN0X21zZHVfZmxhZ19sbChodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXNkdV9kZXNjKQoreworCXN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKnJ4X2Rlc2MgPQorCQkoc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqKW1zZHVfZGVzYzsKKwlyZXR1cm4gKGJvb2wpCisJCSgoKCooKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXNkdV9lbmQpICsgNCkpICYKKwkJICBSWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSykgPj4KKwkJIFJYX01TRFVfRU5EXzRfRklSU1RfTVNEVV9MU0IpOworfQorCitzdGF0aWMgaW50IGh0dF9yeF9yaW5nX3NpemUoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJaW50IHNpemU7CisKKwkvKgorCSAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGhvc3QgQ1BVIHdpbGwgdHlwaWNhbGx5IGJlIGFibGUgdG8gc2VydmljZQorCSAqIHRoZSByeCBpbmRpY2F0aW9uIGZyb20gb25lIEEtTVBEVSBiZWZvcmUgdGhlIHJ4IGluZGljYXRpb24gZnJvbQorCSAqIHRoZSBzdWJzZXF1ZW50IEEtTVBEVSBoYXBwZW5zLCByb3VnaGx5IDEtMiBtcyBsYXRlci4KKwkgKiBIb3dldmVyLCB0aGUgcnggcmluZyBzaG91bGQgYmUgc2l6ZWQgdmVyeSBjb25zZXJ2YXRpdmVseSwgdG8KKwkgKiBhY2NvbW9kYXRlIHRoZSB3b3JzdCByZWFzb25hYmxlIGRlbGF5IGJlZm9yZSB0aGUgaG9zdCBDUFUgc2VydmljZXMKKwkgKiBhIHJ4IGluZGljYXRpb24gaW50ZXJydXB0LgorCSAqIFRoZSByeCByaW5nIG5lZWQgbm90IGJlIGtlcHQgZnVsbCBvZiBlbXB0eSBidWZmZXJzLiAgSW4gdGhlb3J5LAorCSAqIHRoZSBodHQgaG9zdCBTVyBjYW4gZHluYW1pY2FsbHkgdHJhY2sgdGhlIGxvdy13YXRlciBtYXJrIGluIHRoZQorCSAqIHJ4IHJpbmcsIGFuZCBkeW5hbWljYWxseSBhZGp1c3QgdGhlIGxldmVsIHRvIHdoaWNoIHRoZSByeCByaW5nCisJICogaXMgZmlsbGVkIHdpdGggZW1wdHkgYnVmZmVycywgdG8gZHluYW1pY2FsbHkgbWVldCB0aGUgZGVzaXJlZAorCSAqIGxvdy13YXRlciBtYXJrLgorCSAqIEluIGNvbnRyYXN0LCBpdCdzIGRpZmZpY3VsdCB0byByZXNpemUgdGhlIHJ4IHJpbmcgaXRzZWxmLCBvbmNlCisJICogaXQncyBpbiB1c2UuCisJICogVGh1cywgdGhlIHJpbmcgaXRzZWxmIHNob3VsZCBiZSBzaXplZCB2ZXJ5IGNvbnNlcnZhdGl2ZWx5LCB3aGlsZQorCSAqIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlIHJpbmcgaXMgZmlsbGVkIHdpdGggZW1wdHkgYnVmZmVycyBzaG91bGQKKwkgKiBiZSBzaXplZCBtb2RlcmF0ZWx5IGNvbnNlcnZhdGl2ZWx5LgorCSAqLworCXNpemUgPQorCQlvbF9jZmdfbWF4X3RocnVwdXRfbWJwcyhwZGV2LT5jdHJsX3BkZXYpICoKKwkJMTAwMCAvKiAxZTYgYnBzL21icHMgLyAxZTMgbXMgcGVyIHNlYyA9IDEwMDAgKi8gIC8KKwkJKDggKiBIVFRfUlhfQVZHX0ZSTV9CWVRFUykgKiBIVFRfUlhfSE9TVF9MQVRFTkNZX01BWF9NUzsKKworCWlmIChzaXplIDwgSFRUX1JYX1JJTkdfU0laRV9NSU4pCisJCXNpemUgPSBIVFRfUlhfUklOR19TSVpFX01JTjsKKwllbHNlIGlmIChzaXplID4gSFRUX1JYX1JJTkdfU0laRV9NQVgpCisJCXNpemUgPSBIVFRfUlhfUklOR19TSVpFX01BWDsKKworCXNpemUgPSBjZWlsX3B3cjIoc2l6ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgaHR0X3J4X3JpbmdfZmlsbF9sZXZlbChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBvbF9jZmdfbWF4X3RocnVwdXRfbWJwcyhwZGV2LT5jdHJsX3BkZXYpICoKKwkJMTAwMCAvKiAxZTYgYnBzL21icHMgLyAxZTMgbXMgcGVyIHNlYyA9IDEwMDAgKi8gIC8KKwkJOCAqIEhUVF9SWF9BVkdfRlJNX0JZVEVTICogSFRUX1JYX0hPU1RfTEFURU5DWV9XT1JTVF9MSUtFTFlfTVM7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIGZpbGwgbGV2ZWwgaXMgYXQgbGVhc3QgMSBsZXNzIHRoYW4gdGhlIHJpbmcgc2l6ZS4KKwkgKiBMZWF2aW5nIDEgZWxlbWVudCBlbXB0eSBhbGxvd3MgdGhlIFNXIHRvIGVhc2lseSBkaXN0aW5ndWlzaAorCSAqIGJldHdlZW4gYSBmdWxsIHJpbmcgdnMuIGFuIGVtcHR5IHJpbmcuCisJICovCisJaWYgKHNpemUgPj0gcGRldi0+cnhfcmluZy5zaXplKQorCQlzaXplID0gcGRldi0+cnhfcmluZy5zaXplIC0gMTsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdm9pZCBodHRfcnhfcmluZ19yZWZpbGxfcmV0cnkodm9pZCAqYXJnKQoreworCWh0dF9wZGV2X2hhbmRsZSBwZGV2ID0gKGh0dF9wZGV2X2hhbmRsZSkgYXJnOworCWh0dF9yeF9tc2R1X2J1ZmZfcmVwbGVuaXNoKHBkZXYpOworfQorCit2b2lkIGh0dF9yeF9yaW5nX2ZpbGxfbihzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwgaW50IG51bSkKK3sKKwlpbnQgaWR4OworCUNERl9TVEFUVVMgc3RhdHVzOworCXN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKnJ4X2Rlc2M7CisKKwlpZHggPSAqKHBkZXYtPnJ4X3JpbmcuYWxsb2NfaWR4LnZhZGRyKTsKKwl3aGlsZSAobnVtID4gMCkgeworCQl1aW50MzJfdCBwYWRkcjsKKwkJY2RmX25idWZfdCByeF9uZXRidWY7CisJCWludCBoZWFkcm9vbTsKKworCQlyeF9uZXRidWYgPQorCQkJY2RmX25idWZfYWxsb2MocGRldi0+b3NkZXYsIEhUVF9SWF9CVUZfU0laRSwKKwkJCQkgICAgICAgMCwgNCwgZmFsc2UpOworCQlpZiAoIXJ4X25ldGJ1ZikgeworCQkJY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKCZwZGV2LT5yeF9yaW5nLgorCQkJCQkJIHJlZmlsbF9yZXRyeV90aW1lcik7CisJCQkvKgorCQkJICogRmFpbGVkIHRvIGZpbGwgaXQgdG8gdGhlIGRlc2lyZWQgbGV2ZWwgLQorCQkJICogd2UnbGwgc3RhcnQgYSB0aW1lciBhbmQgdHJ5IGFnYWluIG5leHQgdGltZS4KKwkJCSAqIEFzIGxvbmcgYXMgZW5vdWdoIGJ1ZmZlcnMgYXJlIGxlZnQgaW4gdGhlIHJpbmcgZm9yCisJCQkgKiBhbm90aGVyIEEtTVBEVSByeCwgbm8gc3BlY2lhbCByZWNvdmVyeSBpcyBuZWVkZWQuCisJCQkgKi8KKyNpZmRlZiBERUJVR19ETUFfRE9ORQorCQkJcGRldi0+cnhfcmluZy5kYmdfcmVmaWxsX2NudCsrOworI2VuZGlmCisJCQljZGZfc29mdGlycV90aW1lcl9zdGFydCgKKwkJCQkmcGRldi0+cnhfcmluZy5yZWZpbGxfcmV0cnlfdGltZXIsCisJCQkJSFRUX1JYX1JJTkdfUkVGSUxMX1JFVFJZX1RJTUVfTVMpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJLyogQ2xlYXIgcnhfZGVzYyBhdHRlbnRpb24gd29yZCBiZWZvcmUgcG9zdGluZyB0byBSeCByaW5nICovCisJCXJ4X2Rlc2MgPSBodHRfcnhfZGVzYyhyeF9uZXRidWYpOworCQkqKHVpbnQzMl90ICopICZyeF9kZXNjLT5hdHRlbnRpb24gPSAwOworCisjaWZkZWYgREVCVUdfRE1BX0RPTkUKKwkJKih1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXNkdV9lbmQgPSAxOworCisjZGVmaW5lIE1BR0lDX1BBVFRFUk4gMHhERUFEQkVFRgorCQkqKHVpbnQzMl90ICopICZyeF9kZXNjLT5tc2R1X3N0YXJ0ID0gTUFHSUNfUEFUVEVSTjsKKworCQkvKiBUbyBlbnN1cmUgdGhhdCBhdHRlbnRpb24gYml0IGlzIHJlc2V0IGFuZCBtc2R1X2VuZCBpcyBzZXQKKwkJICAgYmVmb3JlIGNhbGxpbmcgZG1hX21hcCAqLworCQlzbXBfbWIoKTsKKyNlbmRpZgorCQkvKgorCQkgKiBBZGp1c3QgY2RmX25idWZfZGF0YSB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGJ1ZmZlcgorCQkgKiB3aGVyZSB0aGUgcnggZGVzY3JpcHRvciB3aWxsIGJlIGZpbGxlZCBpbi4KKwkJICovCisJCWhlYWRyb29tID0gY2RmX25idWZfZGF0YShyeF9uZXRidWYpIC0gKHVpbnQ4X3QgKikgcnhfZGVzYzsKKwkJY2RmX25idWZfcHVzaF9oZWFkKHJ4X25ldGJ1ZiwgaGVhZHJvb20pOworCisjaWZkZWYgREVCVUdfRE1BX0RPTkUKKwkJc3RhdHVzID0KKwkJCWNkZl9uYnVmX21hcChwZGV2LT5vc2RldiwgcnhfbmV0YnVmLAorCQkJCQkJQ0RGX0RNQV9CSURJUkVDVElPTkFMKTsKKyNlbHNlCisJCXN0YXR1cyA9CisJCQljZGZfbmJ1Zl9tYXAocGRldi0+b3NkZXYsIHJ4X25ldGJ1ZiwKKwkJCQkJCUNERl9ETUFfRlJPTV9ERVZJQ0UpOworI2VuZGlmCisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQljZGZfbmJ1Zl9mcmVlKHJ4X25ldGJ1Zik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcGFkZHIgPSBjZGZfbmJ1Zl9nZXRfZnJhZ19wYWRkcl9sbyhyeF9uZXRidWYsIDApOworCQlpZiAocGRldi0+Y2ZnLmlzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkKSB7CisJCQlpZiAoY2RmX3VubGlrZWx5CisJCQkJICAgIChodHRfcnhfaGFzaF9saXN0X2luc2VydChwZGV2LCBwYWRkciwKKwkJCQkJCQkgICAgIHJ4X25ldGJ1ZikpKSB7CisJCQkJY2RmX3ByaW50KCIlczogaGFzaCBpbnNlcnQgZmFpbGVkIVxuIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisjaWZkZWYgREVCVUdfRE1BX0RPTkUKKwkJCQljZGZfbmJ1Zl91bm1hcChwZGV2LT5vc2RldiwgcnhfbmV0YnVmLAorCQkJCQkgICAgICAgQ0RGX0RNQV9CSURJUkVDVElPTkFMKTsKKyNlbHNlCisJCQkJY2RmX25idWZfdW5tYXAocGRldi0+b3NkZXYsIHJ4X25ldGJ1ZiwKKwkJCQkJICAgICAgIENERl9ETUFfRlJPTV9ERVZJQ0UpOworI2VuZGlmCisJCQkJY2RmX25idWZfZnJlZShyeF9uZXRidWYpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBkZXYtPnJ4X3JpbmcuYnVmLm5ldGJ1ZnNfcmluZ1tpZHhdID0gcnhfbmV0YnVmOworCQl9CisjaWYgSFRUX1BBRERSNjQKKwkJcGRldi0+cnhfcmluZy5idWYucGFkZHJzX3JpbmdbaWR4XSA9IDA7CisJCXBkZXYtPnJ4X3JpbmcuYnVmLnBhZGRyc19yaW5nW2lkeF0gPSAodWludDMyX3QpcGFkZHI7CisjZWxzZQorCQlwZGV2LT5yeF9yaW5nLmJ1Zi5wYWRkcnNfcmluZ1tpZHhdID0gcGFkZHI7CisjZW5kaWYgLyogSFRUX1BBRERSNjQgKi8KKwkJcGRldi0+cnhfcmluZy5maWxsX2NudCsrOworCisJCW51bS0tOworCQlpZHgrKzsKKwkJaWR4ICY9IHBkZXYtPnJ4X3Jpbmcuc2l6ZV9tYXNrOworCX0KKworZmFpbDoKKwkqKHBkZXYtPnJ4X3JpbmcuYWxsb2NfaWR4LnZhZGRyKSA9IGlkeDsKKwlyZXR1cm47Cit9CisKK3Vuc2lnbmVkIGh0dF9yeF9yaW5nX2VsZW1zKHN0cnVjdCBodHRfcGRldl90ICpwZGV2KQoreworCXJldHVybgorCQkoKnBkZXYtPnJ4X3JpbmcuYWxsb2NfaWR4LnZhZGRyIC0KKwkJIHBkZXYtPnJ4X3Jpbmcuc3dfcmRfaWR4Lm1zZHVfcGF5bGQpICYgcGRldi0+cnhfcmluZy5zaXplX21hc2s7Cit9CisKK3Vuc2lnbmVkIGludCBodHRfcnhfaW5fb3JkZXJfcmluZ19lbGVtcyhzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKwlyZXR1cm4KKwkJKCpwZGV2LT5yeF9yaW5nLmFsbG9jX2lkeC52YWRkciAtCisJCSAqcGRldi0+cnhfcmluZy50YXJnZXRfaWR4LnZhZGRyKSAmCisJCXBkZXYtPnJ4X3Jpbmcuc2l6ZV9tYXNrOworfQorCit2b2lkIGh0dF9yeF9kZXRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKCZwZGV2LT5yeF9yaW5nLnJlZmlsbF9yZXRyeV90aW1lcik7CisJY2RmX3NvZnRpcnFfdGltZXJfZnJlZSgmcGRldi0+cnhfcmluZy5yZWZpbGxfcmV0cnlfdGltZXIpOworCisJaWYgKHBkZXYtPmNmZy5pc19mdWxsX3Jlb3JkZXJfb2ZmbG9hZCkgeworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudChwZGV2LT5vc2RldiwKKwkJCQkJICAgc2l6ZW9mKHVpbnQzMl90KSwKKwkJCQkJICAgcGRldi0+cnhfcmluZy50YXJnZXRfaWR4LnZhZGRyLAorCQkJCQkgICBwZGV2LT5yeF9yaW5nLnRhcmdldF9pZHgucGFkZHIsCisJCQkJCSAgIGNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+CisJCQkJCQkJCSAgICByeF9yaW5nLgorCQkJCQkJCQkgICAgdGFyZ2V0X2lkeCksCisJCQkJCQkJCSAgIG1lbWN0eCkpOworCQlodHRfcnhfaGFzaF9kZWluaXQocGRldik7CisJfSBlbHNlIHsKKwkJaW50IHN3X3JkX2lkeCA9IHBkZXYtPnJ4X3Jpbmcuc3dfcmRfaWR4Lm1zZHVfcGF5bGQ7CisKKwkJd2hpbGUgKHN3X3JkX2lkeCAhPSAqKHBkZXYtPnJ4X3JpbmcuYWxsb2NfaWR4LnZhZGRyKSkgeworI2lmZGVmIERFQlVHX0RNQV9ET05FCisJCQljZGZfbmJ1Zl91bm1hcChwZGV2LT5vc2RldiwKKwkJCQkgICAgICAgcGRldi0+cnhfcmluZy5idWYuCisJCQkJICAgICAgIG5ldGJ1ZnNfcmluZ1tzd19yZF9pZHhdLAorCQkJCSAgICAgICBDREZfRE1BX0JJRElSRUNUSU9OQUwpOworI2Vsc2UKKwkJCWNkZl9uYnVmX3VubWFwKHBkZXYtPm9zZGV2LAorCQkJCSAgICAgICBwZGV2LT5yeF9yaW5nLmJ1Zi4KKwkJCQkgICAgICAgbmV0YnVmc19yaW5nW3N3X3JkX2lkeF0sCisJCQkJICAgICAgIENERl9ETUFfRlJPTV9ERVZJQ0UpOworI2VuZGlmCisJCQljZGZfbmJ1Zl9mcmVlKHBkZXYtPnJ4X3JpbmcuYnVmLgorCQkJCSAgICAgIG5ldGJ1ZnNfcmluZ1tzd19yZF9pZHhdKTsKKwkJCXN3X3JkX2lkeCsrOworCQkJc3dfcmRfaWR4ICY9IHBkZXYtPnJ4X3Jpbmcuc2l6ZV9tYXNrOworCQl9CisJCWNkZl9tZW1fZnJlZShwZGV2LT5yeF9yaW5nLmJ1Zi5uZXRidWZzX3JpbmcpOworCX0KKworCWNkZl9vc19tZW1fZnJlZV9jb25zaXN0ZW50KHBkZXYtPm9zZGV2LAorCQkJCSAgIHNpemVvZih1aW50MzJfdCksCisJCQkJICAgcGRldi0+cnhfcmluZy5hbGxvY19pZHgudmFkZHIsCisJCQkJICAgcGRldi0+cnhfcmluZy5hbGxvY19pZHgucGFkZHIsCisJCQkJICAgY2RmX2dldF9kbWFfbWVtX2NvbnRleHQoKCZwZGV2LT5yeF9yaW5nLgorCQkJCQkJCSAgICBhbGxvY19pZHgpLAorCQkJCQkJCSAgIG1lbWN0eCkpOworCisJY2RmX29zX21lbV9mcmVlX2NvbnNpc3RlbnQocGRldi0+b3NkZXYsCisJCQkJICAgcGRldi0+cnhfcmluZy5zaXplICogc2l6ZW9mKHVpbnQzMl90KSwKKwkJCQkgICBwZGV2LT5yeF9yaW5nLmJ1Zi5wYWRkcnNfcmluZywKKwkJCQkgICBwZGV2LT5yeF9yaW5nLmJhc2VfcGFkZHIsCisJCQkJICAgY2RmX2dldF9kbWFfbWVtX2NvbnRleHQoKCZwZGV2LT5yeF9yaW5nLmJ1ZiksCisJCQkJCQkJICAgbWVtY3R4KSk7Cit9CisKKy8qLS0tIHJ4IGRlc2NyaXB0b3IgZmllbGQgYWNjZXNzIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgbmVlZCB0byB1c2UgYml0IG1hc2tzIGFuZCBzaGlmdHMgdG8gZXh0cmFjdCBmaWVsZHMKKyAqIGZyb20gdGhlIHJ4IGRlc2NyaXB0b3JzLCByYXRoZXIgdGhhbiBkaXJlY3RseSB1c2luZyB0aGUgYml0ZmllbGRzLgorICogRm9yIGV4YW1wbGUsIHVzZQorICogICAgIChkZXNjICYgRklFTERfTUFTSykgPj4gRklFTERfTFNCCisgKiByYXRoZXIgdGhhbgorICogICAgIGRlc2MuZmllbGQKKyAqIFRoaXMgYWxsb3dzIHRoZSBmdW5jdGlvbnMgdG8gd29yayBjb3JyZWN0bHkgb24gZWl0aGVyIGxpdHRsZS1lbmRpYW4KKyAqIG1hY2hpbmVzIChubyBlbmRpYW5uZXNzIGNvbnZlcnNpb24gbmVlZGVkKSBvciBiaWctZW5kaWFuIG1hY2hpbmVzCisgKiAoZW5kaWFubmVzcyBjb252ZXJzaW9uIHByb3ZpZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIEhXIERNQSdzCisgKiBieXRlLXN3aXp6bGluZykuCisgKi8KKy8qIEZJWCBUSElTOiBBUFBMSUVTIFRPIExMIE9OTFkgKi8KKworLyoqCisgKiBodHRfcnhfbXBkdV9kZXNjX3JldHJ5X2xsKCkgLSBSZXR1cm5zIHRoZSByZXRyeSBiaXQgZnJvbSB0aGUgUnggZGVzY3JpcHRvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBMb3cgTGF0ZW5jeSBkcml2ZXIKKyAqIEBwZGV2OiAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlIChwb2ludGVyKSB0byBIVFQgcGRldi4KKyAqIEBtcGR1X2Rlc2M6ICAgICAgICAgICAgICAgICAgICAgVm9pZCBwb2ludGVyIHRvIHRoZSBSeCBkZXNjcmlwdG9yIGZvciBNUERVCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXlsb2FkLgorICoKKyAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJldHJ5IGJpdCBvZiB0aGUgODAyLjExIGhlYWRlciBmb3IgdGhlCisgKiAgcHJvdmlkZWQgcnggTVBEVSBkZXNjcmlwdG9yLgorICoKKyAqIFJldHVybjogICAgICAgIGJvb2xlYW4gLS0gdHJ1ZSBpZiByZXRyeSBpcyBzZXQsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sCitodHRfcnhfbXBkdV9kZXNjX3JldHJ5X2xsKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptcGR1X2Rlc2MpCit7CisJc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqcnhfZGVzYyA9CisJCShzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICopIG1wZHVfZGVzYzsKKworCXJldHVybgorCQkoYm9vbCkoKCgqKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXBkdV9zdGFydCkpICYKKwkJUlhfTVBEVV9TVEFSVF8wX1JFVFJZX01BU0spID4+CisJCVJYX01QRFVfU1RBUlRfMF9SRVRSWV9MU0IpOworfQorCit1aW50MTZfdCBodHRfcnhfbXBkdV9kZXNjX3NlcV9udW1fbGwoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1wZHVfZGVzYykKK3sKKwlzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICpyeF9kZXNjID0KKwkJKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKiltcGR1X2Rlc2M7CisKKwlyZXR1cm4KKwkJKHVpbnQxNl90KSAoKCgqKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXBkdV9zdGFydCkpICYKKwkJCSAgICAgUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTUFTSykgPj4KKwkJCSAgICBSWF9NUERVX1NUQVJUXzBfU0VRX05VTV9MU0IpOworfQorCisvKiBGSVggVEhJUzogQVBQTElFUyBUTyBMTCBPTkxZICovCit2b2lkCitodHRfcnhfbXBkdV9kZXNjX3BuX2xsKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgICAgdm9pZCAqbXBkdV9kZXNjLCB1bmlvbiBodHRfcnhfcG5fdCAqcG4sIGludCBwbl9sZW5fYml0cykKK3sKKwlzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICpyeF9kZXNjID0KKwkJKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKiltcGR1X2Rlc2M7CisKKwlzd2l0Y2ggKHBuX2xlbl9iaXRzKSB7CisJY2FzZSAyNDoKKwkJLyogYml0cyAyMzowICovCisJCXBuLT5wbjI0ID0gcnhfZGVzYy0+bXBkdV9zdGFydC5wbl8zMV8wICYgMHhmZmZmZmY7CisJCWJyZWFrOworCWNhc2UgNDg6CisJCS8qIGJpdHMgMzE6MCAqLworCQlwbi0+cG40OCA9IHJ4X2Rlc2MtPm1wZHVfc3RhcnQucG5fMzFfMDsKKwkJLyogYml0cyA0NzozMiAqLworCQlwbi0+cG40OCB8PSAoKHVpbnQ2NF90KQorCQkJICAgICAoKCooKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXBkdV9zdGFydCkgKyAyKSkKKwkJCSAgICAgICYgUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX01BU0spKQorCQkJPDwgKDMyIC0gUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX0xTQik7CisJCWJyZWFrOworCWNhc2UgMTI4OgorCQkvKiBiaXRzIDMxOjAgKi8KKwkJcG4tPnBuMTI4WzBdID0gcnhfZGVzYy0+bXBkdV9zdGFydC5wbl8zMV8wOworCQkvKiBiaXRzIDQ3OjMyICovCisJCXBuLT5wbjEyOFswXSB8PQorCQkJKCh1aW50NjRfdCkgKCgqKCgodWludDMyX3QgKikmcnhfZGVzYy0+bXBkdV9zdGFydCkgKyAyKSkKKwkJCQkgICAgICYgUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX01BU0spKQorCQkJPDwgKDMyIC0gUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX0xTQik7CisJCS8qIGJpdHMgNjM6NDggKi8KKwkJcG4tPnBuMTI4WzBdIHw9CisJCQkoKHVpbnQ2NF90KSAoKCooKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXNkdV9lbmQpICsgMikpCisJCQkJICAgICAmIFJYX01TRFVfRU5EXzFfRVhUX1dBUElfUE5fNjNfNDhfTUFTSykpCisJCQk8PCAoNDggLSBSWF9NU0RVX0VORF8xX0VYVF9XQVBJX1BOXzYzXzQ4X0xTQik7CisJCS8qIGJpdHMgOTU6NjQgKi8KKwkJcG4tPnBuMTI4WzFdID0gcnhfZGVzYy0+bXNkdV9lbmQuZXh0X3dhcGlfcG5fOTVfNjQ7CisJCS8qIGJpdHMgMTI3Ojk2ICovCisJCXBuLT5wbjEyOFsxXSB8PQorCQkJKCh1aW50NjRfdCkgcnhfZGVzYy0+bXNkdV9lbmQuZXh0X3dhcGlfcG5fMTI3Xzk2KSA8PCAzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2RmX3ByaW50KCJFcnJvcjogaW52YWxpZCBsZW5ndGggc3BlYyAoJWQgYml0cykgZm9yIFBOXG4iLAorCQkJICBwbl9sZW5fYml0cyk7CisJfTsKK30KKworLyoqCisgKiBodHRfcnhfbXBkdV9kZXNjX3RpZF9sbCgpIC0gUmV0dXJucyB0aGUgVElEIHZhbHVlIGZyb20gdGhlIFJ4IGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgTG93IExhdGVuY3kgZHJpdmVyCisgKiBAcGRldjogICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGUgKHBvaW50ZXIpIHRvIEhUVCBwZGV2LgorICogQG1wZHVfZGVzYzogICAgICAgICAgICAgICAgICAgVm9pZCBwb2ludGVyIHRvIHRoZSBSeCBkZXNjcmlwdG9yIGZvciB0aGUgTVBEVQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBheWxvYWQuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBUSUQgc2V0IGluIHRoZSA4MDIuMTEgUW9TIENvbnRyb2wgZm9yIHRoZSBNUERVCisgKiBpbiB0aGUgcGFja2V0IGhlYWRlciwgYnkgbG9va2luZyBhdCB0aGUgbXBkdV9zdGFydCBvZiB0aGUgUnggZGVzY3JpcHRvci4KKyAqIFJ4IGRlc2NyaXB0b3IgZ2V0cyBhIGNvcHkgb2YgdGhlIFRJRCBmcm9tIHRoZSBNQUMuCisgKgorICogUmV0dXJuOiAgICAgICAgQWN0dWFsIFRJRCBzZXQgaW4gdGhlIHBhY2tldCBoZWFkZXIuCisgKi8KK3VpbnQ4X3QKK2h0dF9yeF9tcGR1X2Rlc2NfdGlkX2xsKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptcGR1X2Rlc2MpCit7CisJc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqcnhfZGVzYyA9CisJCShzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICopIG1wZHVfZGVzYzsKKworCXJldHVybgorCQkodWludDhfdCkoKCgqKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPm1wZHVfc3RhcnQpICsgMikpICYKKwkJUlhfTVBEVV9TVEFSVF8yX1RJRF9NQVNLKSA+PgorCQlSWF9NUERVX1NUQVJUXzJfVElEX0xTQik7Cit9CisKK3VpbnQzMl90IGh0dF9yeF9tcGR1X2Rlc2NfdHNmMzIoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1wZHVfZGVzYykKK3sKKy8qIEZJWCBUSElTICovCisJcmV0dXJuIDA7Cit9CisKKy8qIEZJWCBUSElTOiBBUFBMSUVTIFRPIExMIE9OTFkgKi8KK2NoYXIgKmh0dF9yeF9tcGR1X3dpZmlfaGRyX3JldHJpZXZlKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptcGR1X2Rlc2MpCit7CisJc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqcnhfZGVzYyA9CisJCShzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICopbXBkdV9kZXNjOworCXJldHVybiByeF9kZXNjLT5yeF9oZHJfc3RhdHVzOworfQorCisvKiBGSVggVEhJUzogQVBQTElFUyBUTyBMTCBPTkxZICovCitib29sIGh0dF9yeF9tc2R1X2Rlc2NfY29tcGxldGVzX21wZHVfbGwoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1zZHVfZGVzYykKK3sKKwlzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICpyeF9kZXNjID0KKwkJKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKiltc2R1X2Rlc2M7CisJcmV0dXJuIChib29sKQorCQkoKCgqKCgodWludDMyX3QgKikgJnJ4X2Rlc2MtPm1zZHVfZW5kKSArIDQpKSAmCisJCSAgUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTUFTSykgPj4gUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCKTsKK30KKworLyogRklYIFRISVM6IEFQUExJRVMgVE8gTEwgT05MWSAqLworaW50IGh0dF9yeF9tc2R1X2hhc193bGFuX21jYXN0X2ZsYWdfbGwoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1zZHVfZGVzYykKK3sKKwlzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICpyeF9kZXNjID0KKwkJKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKiltc2R1X2Rlc2M7CisJLyogSFcgcnggZGVzYzogdGhlIG1jYXN0X2JjYXN0IGZsYWcgaXMgb25seSB2YWxpZAorCSAgIGlmIGZpcnN0X21zZHUgaXMgc2V0ICovCisJcmV0dXJuCisJCSgoKigoKHVpbnQzMl90ICopICZyeF9kZXNjLT5tc2R1X2VuZCkgKyA0KSkgJgorCQkgUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX01BU0spID4+IFJYX01TRFVfRU5EXzRfRklSU1RfTVNEVV9MU0I7Cit9CisKKy8qIEZJWCBUSElTOiBBUFBMSUVTIFRPIExMIE9OTFkgKi8KK2Jvb2wgaHR0X3J4X21zZHVfaXNfd2xhbl9tY2FzdF9sbChodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXNkdV9kZXNjKQoreworCXN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKnJ4X2Rlc2MgPQorCQkoc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqKW1zZHVfZGVzYzsKKwlyZXR1cm4KKwkJKCgqKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+YXR0ZW50aW9uKSkgJgorCQkgUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTUFTSykKKwkJPj4gUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTFNCOworfQorCisvKiBGSVggVEhJUzogQVBQTElFUyBUTyBMTCBPTkxZICovCitpbnQgaHR0X3J4X21zZHVfaXNfZnJhZ19sbChodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXNkdV9kZXNjKQoreworCXN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKnJ4X2Rlc2MgPQorCQkoc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqKW1zZHVfZGVzYzsKKwlyZXR1cm4KKwkJKCgqKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+YXR0ZW50aW9uKSkgJgorCQkgUlhfQVRURU5USU9OXzBfRlJBR01FTlRfTUFTSykgPj4gUlhfQVRURU5USU9OXzBfRlJBR01FTlRfTFNCOworfQorCitzdGF0aWMgaW5saW5lCit1aW50OF90IGh0dF9yeF9tc2R1X2Z3X2Rlc2NfZ2V0KGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptc2R1X2Rlc2MpCit7CisJLyoKKwkgKiBITCBhbmQgTEwgdXNlIHRoZSBzYW1lIGZvcm1hdCBmb3IgRlcgcnggZGVzYywgYnV0IGhhdmUgdGhlIEZXIHJ4IGRlc2MKKwkgKiBpbiBkaWZmZXJlbnQgbG9jYXRpb25zLgorCSAqIEluIExMLCB0aGUgRlcgcnggZGVzY3JpcHRvciBoYXMgYmVlbiBjb3BpZWQgaW50byB0aGUgc2FtZQorCSAqIGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSBzdHJ1Y3QgdGhhdCBob2xkcyB0aGUgSFcgcnggZGVzYy4KKwkgKiBJbiBITCwgdGhlIEZXIHJ4IGRlc2NyaXB0b3IsIGFsb25nIHdpdGggdGhlIE1TRFUgcGF5bG9hZCwKKwkgKiBpcyBpbiB0aGUgc2FtZSBidWZmZXIgYXMgdGhlIHJ4IGluZGljYXRpb24gbWVzc2FnZS4KKwkgKgorCSAqIFVzZSB0aGUgRlcgcnggZGVzYyBvZmZzZXQgY29uZmlndXJlZCBkdXJpbmcgc3RhcnR1cCB0byBhY2NvdW50IGZvcgorCSAqIHRoaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIEhMIHZzLiBMTC4KKwkgKgorCSAqIEFuIG9wdGltaXphdGlvbiB3b3VsZCBiZSB0byBkZWZpbmUgdGhlIExMIGFuZCBITCBtc2R1X2Rlc2MgcG9pbnRlcgorCSAqIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGV5IGJvdGggdXNlIHRoZSBzYW1lIG9mZnNldCB0byB0aGUgRlcgcnggZGVzYy4KKwkgKiBUaGVuIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNvdWxkIGJlIGNvbnZlcnRlZCB0byBtYWNyb3MsIHdpdGhvdXQKKwkgKiBuZWVkaW5nIHRvIGV4cG9zZSB0aGUgaHR0X3BkZXZfdCBkZWZpbml0aW9uIG91dHNpZGUgSFRULgorCSAqLworCXJldHVybiAqKCgodWludDhfdCAqKSBtc2R1X2Rlc2MpICsgcGRldi0+cnhfZndfZGVzY19vZmZzZXQpOworfQorCitpbnQgaHR0X3J4X21zZHVfZGlzY2FyZChodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXNkdV9kZXNjKQoreworCXJldHVybiBodHRfcnhfbXNkdV9md19kZXNjX2dldChwZGV2LCBtc2R1X2Rlc2MpICYgRldfUlhfREVTQ19ESVNDQVJEX007Cit9CisKK2ludCBodHRfcnhfbXNkdV9mb3J3YXJkKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptc2R1X2Rlc2MpCit7CisJcmV0dXJuIGh0dF9yeF9tc2R1X2Z3X2Rlc2NfZ2V0KHBkZXYsIG1zZHVfZGVzYykgJiBGV19SWF9ERVNDX0ZPUldBUkRfTTsKK30KKworaW50IGh0dF9yeF9tc2R1X2luc3BlY3QoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1zZHVfZGVzYykKK3sKKwlyZXR1cm4gaHR0X3J4X21zZHVfZndfZGVzY19nZXQocGRldiwgbXNkdV9kZXNjKSAmIEZXX1JYX0RFU0NfSU5TUEVDVF9NOworfQorCit2b2lkCitodHRfcnhfbXNkdV9hY3Rpb25zKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgdm9pZCAqbXNkdV9kZXNjLCBpbnQgKmRpc2NhcmQsIGludCAqZm9yd2FyZCwgaW50ICppbnNwZWN0KQoreworCXVpbnQ4X3QgcnhfbXNkdV9md19kZXNjID0gaHR0X3J4X21zZHVfZndfZGVzY19nZXQocGRldiwgbXNkdV9kZXNjKTsKKyNpZmRlZiBIVFRfREVCVUdfREFUQQorCUhUVF9QUklOVCgiYWN0OjB4JXggIiwgcnhfbXNkdV9md19kZXNjKTsKKyNlbmRpZgorCSpkaXNjYXJkID0gcnhfbXNkdV9md19kZXNjICYgRldfUlhfREVTQ19ESVNDQVJEX007CisJKmZvcndhcmQgPSByeF9tc2R1X2Z3X2Rlc2MgJiBGV19SWF9ERVNDX0ZPUldBUkRfTTsKKwkqaW5zcGVjdCA9IHJ4X21zZHVfZndfZGVzYyAmIEZXX1JYX0RFU0NfSU5TUEVDVF9NOworfQorCitzdGF0aWMgaW5saW5lIGNkZl9uYnVmX3QgaHR0X3J4X25ldGJ1Zl9wb3AoaHR0X3BkZXZfaGFuZGxlIHBkZXYpCit7CisJaW50IGlkeDsKKwljZGZfbmJ1Zl90IG1zZHU7CisKKwlIVFRfQVNTRVJUMShodHRfcnhfcmluZ19lbGVtcyhwZGV2KSAhPSAwKTsKKworI2lmZGVmIERFQlVHX0RNQV9ET05FCisJcGRldi0+cnhfcmluZy5kYmdfcmluZ19pZHgrKzsKKwlwZGV2LT5yeF9yaW5nLmRiZ19yaW5nX2lkeCAmPSBwZGV2LT5yeF9yaW5nLnNpemVfbWFzazsKKyNlbmRpZgorCisJaWR4ID0gcGRldi0+cnhfcmluZy5zd19yZF9pZHgubXNkdV9wYXlsZDsKKwltc2R1ID0gcGRldi0+cnhfcmluZy5idWYubmV0YnVmc19yaW5nW2lkeF07CisJaWR4Kys7CisJaWR4ICY9IHBkZXYtPnJ4X3Jpbmcuc2l6ZV9tYXNrOworCXBkZXYtPnJ4X3Jpbmcuc3dfcmRfaWR4Lm1zZHVfcGF5bGQgPSBpZHg7CisJcGRldi0+cnhfcmluZy5maWxsX2NudC0tOworCXJldHVybiBtc2R1OworfQorCitzdGF0aWMgaW5saW5lIGNkZl9uYnVmX3QKK2h0dF9yeF9pbl9vcmRlcl9uZXRidWZfcG9wKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB1aW50MzJfdCBwYWRkcikKK3sKKwlIVFRfQVNTRVJUMShodHRfcnhfaW5fb3JkZXJfcmluZ19lbGVtcyhwZGV2KSAhPSAwKTsKKwlwZGV2LT5yeF9yaW5nLmZpbGxfY250LS07CisJcmV0dXJuIGh0dF9yeF9oYXNoX2xpc3RfbG9va3VwKHBkZXYsIHBhZGRyKTsKK30KKworLyogRklYIE1FOiB0aGlzIGZ1bmN0aW9uIGFwcGxpZXMgb25seSB0byBMTCByeCBkZXNjcy4KKyAgIEFuIGVxdWl2YWxlbnQgZm9yIEhMIHJ4IGRlc2NzIGlzIG5lZWRlZC4gKi8KKyNpZmRlZiBDSEVDS1NVTV9PRkZMT0FECitzdGF0aWMgaW5saW5lCit2b2lkCitodHRfc2V0X2NoZWNrc3VtX3Jlc3VsdF9sbChodHRfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCBtc2R1LAorCQkJICAgc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqcnhfZGVzYykKK3sKKyNkZWZpbmUgTUFYX0lQX1ZFUiAgICAgICAgICAyCisjZGVmaW5lIE1BWF9QUk9UT19WQUwgICAgICAgNAorCXN0cnVjdCByeF9tc2R1X3N0YXJ0ICpyeF9tc2R1ID0gJnJ4X2Rlc2MtPm1zZHVfc3RhcnQ7CisJdW5zaWduZWQgaW50IHByb3RvID0gKHJ4X21zZHUtPnRjcF9wcm90bykgfCAocnhfbXNkdS0+dWRwX3Byb3RvIDw8IDEpOworCisJLyoKKwkgKiBIVyBzdXBwb3J0cyBUQ1AgJiBVRFAgY2hlY2tzdW0gb2ZmbG9hZCBmb3IgaXB2NCBhbmQgaXB2NgorCSAqLworCXN0YXRpYyBjb25zdCBjZGZfbmJ1Zl9sNF9yeF9ja3N1bV90eXBlX3QKKwkJY2tzdW1fdGFibGVbXVtNQVhfUFJPVE9fVkFMXVtNQVhfSVBfVkVSXSA9IHsKKwkJeworCQkJLyogbm9uLWZyYWdtZW50ZWQgSVAgcGFja2V0ICovCisJCQkvKiBub24gVENQL1VEUCBwYWNrZXQgKi8KKwkJCXtDREZfTkJVRl9SWF9DS1NVTV9OT05FLCBDREZfTkJVRl9SWF9DS1NVTV9OT05FfSwKKwkJCS8qIFRDUCBwYWNrZXQgKi8KKwkJCXtDREZfTkJVRl9SWF9DS1NVTV9UQ1AsIENERl9OQlVGX1JYX0NLU1VNX1RDUElQVjZ9LAorCQkJLyogVURQIHBhY2tldCAqLworCQkJe0NERl9OQlVGX1JYX0NLU1VNX1VEUCwgQ0RGX05CVUZfUlhfQ0tTVU1fVURQSVBWNn0sCisJCQkvKiBpbnZhbGlkIHBhY2tldCB0eXBlICovCisJCQl7Q0RGX05CVUZfUlhfQ0tTVU1fTk9ORSwgQ0RGX05CVUZfUlhfQ0tTVU1fTk9ORX0sCisJCX0sCisJCXsKKwkJCS8qIGZyYWdtZW50ZWQgSVAgcGFja2V0ICovCisJCQl7Q0RGX05CVUZfUlhfQ0tTVU1fTk9ORSwgQ0RGX05CVUZfUlhfQ0tTVU1fTk9ORX0sCisJCQl7Q0RGX05CVUZfUlhfQ0tTVU1fTk9ORSwgQ0RGX05CVUZfUlhfQ0tTVU1fTk9ORX0sCisJCQl7Q0RGX05CVUZfUlhfQ0tTVU1fTk9ORSwgQ0RGX05CVUZfUlhfQ0tTVU1fTk9ORX0sCisJCQl7Q0RGX05CVUZfUlhfQ0tTVU1fTk9ORSwgQ0RGX05CVUZfUlhfQ0tTVU1fTk9ORX0sCisJCX0KKwl9OworCisJY2RmX25idWZfcnhfY2tzdW1fdCBja3N1bSA9IHsKKwkJY2tzdW1fdGFibGVbcnhfbXNkdS0+aXBfZnJhZ11bcHJvdG9dW3J4X21zZHUtPmlwdjZfcHJvdG9dLAorCQlDREZfTkJVRl9SWF9DS1NVTV9OT05FLAorCQkwCisJfTsKKworCWlmIChja3N1bS5sNF90eXBlICE9CisJICAgIChjZGZfbmJ1Zl9sNF9yeF9ja3N1bV90eXBlX3QpIENERl9OQlVGX1JYX0NLU1VNX05PTkUpIHsKKwkJY2tzdW0ubDRfcmVzdWx0ID0KKwkJCSgoKih1aW50MzJfdCAqKSAmcnhfZGVzYy0+YXR0ZW50aW9uKSAmCisJCQkgUlhfQVRURU5USU9OXzBfVENQX1VEUF9DSEtTVU1fRkFJTF9NQVNLKSA/CisJCQlDREZfTkJVRl9SWF9DS1NVTV9OT05FIDoKKwkJCUNERl9OQlVGX1JYX0NLU1VNX1RDUF9VRFBfVU5ORUNFU1NBUlk7CisJfQorCWNkZl9uYnVmX3NldF9yeF9ja3N1bShtc2R1LCAmY2tzdW0pOworI3VuZGVmIE1BWF9JUF9WRVIKKyN1bmRlZiBNQVhfUFJPVE9fVkFMCit9CisjZWxzZQorI2RlZmluZSBodHRfc2V0X2NoZWNrc3VtX3Jlc3VsdF9sbChwZGV2LCBtc2R1LCByeF9kZXNjKSAvKiBuby1vcCAqLworI2VuZGlmCisKKyNpZmRlZiBERUJVR19ETUFfRE9ORQordm9pZCBodHRfcnhfcHJpbnRfcnhfaW5kaWNhdGlvbihjZGZfbmJ1Zl90IHJ4X2luZF9tc2csIGh0dF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXVpbnQzMl90ICptc2dfd29yZDsKKwlpbnQgYnl0ZV9vZmZzZXQ7CisJaW50IG1wZHVfcmFuZ2UsIG51bV9tcGR1X3JhbmdlOworCisJbXNnX3dvcmQgPSAodWludDMyX3QgKikgY2RmX25idWZfZGF0YShyeF9pbmRfbXNnKTsKKworCWNkZl9wcmludAorCQkoIi0tLS0tLS0tLS0tLS0tLS0tLUhUVCBSWCBJTkQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJY2RmX3ByaW50KCJhbGxvYyBpZHggcGFkZHIgJXggKCp2YWRkcikgJWRcbiIsCisJCSAgcGRldi0+cnhfcmluZy5hbGxvY19pZHgucGFkZHIsCisJCSAgKnBkZXYtPnJ4X3JpbmcuYWxsb2NfaWR4LnZhZGRyKTsKKworCWNkZl9wcmludCgic3dfcmRfaWR4IG1zZHVfcGF5bGQgJWQgbXNkdV9kZXNjICVkXG4iLAorCQkgIHBkZXYtPnJ4X3Jpbmcuc3dfcmRfaWR4Lm1zZHVfcGF5bGQsCisJCSAgcGRldi0+cnhfcmluZy5zd19yZF9pZHgubXNkdV9kZXNjKTsKKworCWNkZl9wcmludCgiZGJnX3JpbmdfaWR4ICVkXG4iLCBwZGV2LT5yeF9yaW5nLmRiZ19yaW5nX2lkeCk7CisKKwljZGZfcHJpbnQoImZpbGxfbGV2ZWwgJWQgZmlsbF9jbnQgJWRcbiIsIHBkZXYtPnJ4X3JpbmcuZmlsbF9sZXZlbCwKKwkJICBwZGV2LT5yeF9yaW5nLmZpbGxfY250KTsKKworCWNkZl9wcmludCgiaW5pdGlhbCBtc2R1X3BheWxkICVkIGN1cnIgbXBkdSByYW5nZSAlZCBjdXJyIG1wZHUgY250ICVkXG4iLAorCQkgIHBkZXYtPnJ4X3JpbmcuZGJnX2luaXRpYWxfbXNkdV9wYXlsZCwKKwkJICBwZGV2LT5yeF9yaW5nLmRiZ19tcGR1X3JhbmdlLCBwZGV2LT5yeF9yaW5nLmRiZ19tcGR1X2NvdW50KTsKKworCS8qIFByaW50IHRoZSBSWF9JTkQgY29udGVudHMgKi8KKworCWNkZl9wcmludCgicGVlciBpZCAleCBSViAleCBGViAleCBleHRfdGlkICV4IG1zZ190eXBlICV4XG4iLAorCQkgIEhUVF9SWF9JTkRfUEVFUl9JRF9HRVQoKm1zZ193b3JkKSwKKwkJICBIVFRfUlhfSU5EX1JFTF9WQUxJRF9HRVQoKm1zZ193b3JkKSwKKwkJICBIVFRfUlhfSU5EX0ZMVVNIX1ZBTElEX0dFVCgqbXNnX3dvcmQpLAorCQkgIEhUVF9SWF9JTkRfRVhUX1RJRF9HRVQoKm1zZ193b3JkKSwKKwkJICBIVFRfVDJIX01TR19UWVBFX0dFVCgqbXNnX3dvcmQpKTsKKworCWNkZl9wcmludCgibnVtX21wZHVfcmFuZ2VzICV4IHJlbF9zZXFfbnVtX2VuZCAleCByZWxfc2VxX251bV9zdGFydCAleFxuIgorCQkgICIgZmx1c2hfc2VxX251bV9lbmQgJXggZmx1c2hfc2VxX251bV9zdGFydCAleFxuIiwKKwkJICBIVFRfUlhfSU5EX05VTV9NUERVX1JBTkdFU19HRVQoKihtc2dfd29yZCArIDEpKSwKKwkJICBIVFRfUlhfSU5EX1JFTF9TRVFfTlVNX0VORF9HRVQoKihtc2dfd29yZCArIDEpKSwKKwkJICBIVFRfUlhfSU5EX1JFTF9TRVFfTlVNX1NUQVJUX0dFVCgqKG1zZ193b3JkICsgMSkpLAorCQkgIEhUVF9SWF9JTkRfRkxVU0hfU0VRX05VTV9FTkRfR0VUKCoobXNnX3dvcmQgKyAxKSksCisJCSAgSFRUX1JYX0lORF9GTFVTSF9TRVFfTlVNX1NUQVJUX0dFVCgqKG1zZ193b3JkICsgMSkpKTsKKworCWNkZl9wcmludCgiZndfcnhfZGVzY19ieXRlcyAleFxuIiwKKwkJICBIVFRfUlhfSU5EX0ZXX1JYX0RFU0NfQllURVNfR0VUKCoKKwkJCQkJCSAgKG1zZ193b3JkICsgMiArCisJCQkJCQkgICBIVFRfUlhfUFBEVV9ERVNDX1NJWkUzMikpKTsKKworCS8qIHJlY2VpdmUgTVNEVSBkZXNjIGZvciBjdXJyZW50IGZyYW1lICovCisJYnl0ZV9vZmZzZXQgPQorCQlIVFRfRU5ESUFOX0JZVEVfSURYX1NXQVAoSFRUX1JYX0lORF9GV19SWF9ERVNDX0JZVEVfT0ZGU0VUICsKKwkJCQkJIHBkZXYtPnJ4X2luZF9tc2R1X2J5dGVfaWR4KTsKKworCWNkZl9wcmludCgibXNkdSBieXRlIGlkeCAleCBtc2R1IGRlc2MgJXhcbiIsIHBkZXYtPnJ4X2luZF9tc2R1X2J5dGVfaWR4LAorCQkgIEhUVF9SWF9JTkRfRldfUlhfREVTQ19CWVRFU19HRVQoKgorCQkJCQkJICAobXNnX3dvcmQgKyAyICsKKwkJCQkJCSAgIEhUVF9SWF9QUERVX0RFU0NfU0laRTMyKSkpOworCisJbnVtX21wZHVfcmFuZ2UgPSBIVFRfUlhfSU5EX05VTV9NUERVX1JBTkdFU19HRVQoKihtc2dfd29yZCArIDEpKTsKKworCWZvciAobXBkdV9yYW5nZSA9IDA7IG1wZHVfcmFuZ2UgPCBudW1fbXBkdV9yYW5nZTsgbXBkdV9yYW5nZSsrKSB7CisJCWVudW0gaHR0X3J4X3N0YXR1cyBzdGF0dXM7CisJCWludCBudW1fbXBkdXM7CisKKwkJaHR0X3J4X2luZF9tcGR1X3JhbmdlX2luZm8ocGRldiwgcnhfaW5kX21zZywgbXBkdV9yYW5nZSwKKwkJCQkJICAgJnN0YXR1cywgJm51bV9tcGR1cyk7CisKKwkJY2RmX3ByaW50KCJtcGR1X3JhbmdlICV4IHN0YXR1cyAleCBudW1fbXBkdXMgJXhcbiIsCisJCQkgIHBkZXYtPnJ4X2luZF9tc2R1X2J5dGVfaWR4LCBzdGF0dXMsIG51bV9tcGR1cyk7CisJfQorCWNkZl9wcmludAorCQkoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cit9CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0RNQV9ET05FCisjZGVmaW5lIE1BWF9ET05FX0JJVF9DSEVDS19JVEVSIDUKKyNlbmRpZgorCitpbnQKK2h0dF9yeF9hbXNkdV9wb3BfbGwoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgICBjZGZfbmJ1Zl90IHJ4X2luZF9tc2csCisJCSAgICBjZGZfbmJ1Zl90ICpoZWFkX21zZHUsIGNkZl9uYnVmX3QgKnRhaWxfbXNkdSkKK3sKKwlpbnQgbXNkdV9sZW4sIG1zZHVfY2hhaW5pbmcgPSAwOworCWNkZl9uYnVmX3QgbXNkdTsKKwlzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICpyeF9kZXNjOworCXVpbnQ4X3QgKnJ4X2luZF9kYXRhOworCXVpbnQzMl90ICptc2dfd29yZCwgbnVtX21zZHVfYnl0ZXM7CisJZW51bSBodHRfdDJoX21zZ190eXBlIG1zZ190eXBlOworCXVpbnQ4X3QgcGFkX2J5dGVzID0gMDsKKworCUhUVF9BU1NFUlQxKGh0dF9yeF9yaW5nX2VsZW1zKHBkZXYpICE9IDApOworCXJ4X2luZF9kYXRhID0gY2RmX25idWZfZGF0YShyeF9pbmRfbXNnKTsKKwltc2dfd29yZCA9ICh1aW50MzJfdCAqKSByeF9pbmRfZGF0YTsKKworCW1zZ190eXBlID0gSFRUX1QySF9NU0dfVFlQRV9HRVQoKm1zZ193b3JkKTsKKworCWlmIChjZGZfdW5saWtlbHkoSFRUX1QySF9NU0dfVFlQRV9SWF9GUkFHX0lORCA9PSBtc2dfdHlwZSkpIHsKKwkJbnVtX21zZHVfYnl0ZXMgPSBIVFRfUlhfRlJBR19JTkRfRldfUlhfREVTQ19CWVRFU19HRVQoCisJCQkqKG1zZ193b3JkICsgSFRUX1JYX0ZSQUdfSU5EX0hEUl9QUkVGSVhfU0laRTMyKSk7CisJfSBlbHNlIHsKKwkJbnVtX21zZHVfYnl0ZXMgPSBIVFRfUlhfSU5EX0ZXX1JYX0RFU0NfQllURVNfR0VUKAorCQkJKihtc2dfd29yZAorCQkJICArIEhUVF9SWF9JTkRfSERSX1BSRUZJWF9TSVpFMzIKKwkJCSAgKyBIVFRfUlhfUFBEVV9ERVNDX1NJWkUzMikpOworCX0KKwltc2R1ID0gKmhlYWRfbXNkdSA9IGh0dF9yeF9uZXRidWZfcG9wKHBkZXYpOworCXdoaWxlICgxKSB7CisJCWludCBsYXN0X21zZHUsIG1zZHVfbGVuX2ludmFsaWQsIG1zZHVfY2hhaW5lZDsKKwkJaW50IGJ5dGVfb2Zmc2V0OworCisJCS8qCisJCSAqIFNldCB0aGUgbmV0YnVmIGxlbmd0aCB0byBiZSB0aGUgZW50aXJlIGJ1ZmZlciBsZW5ndGgKKwkJICogaW5pdGlhbGx5LCBzbyB0aGUgdW5tYXAgd2lsbCB1bm1hcCB0aGUgZW50aXJlIGJ1ZmZlci4KKwkJICovCisJCWNkZl9uYnVmX3NldF9wa3RsZW4obXNkdSwgSFRUX1JYX0JVRl9TSVpFKTsKKyNpZmRlZiBERUJVR19ETUFfRE9ORQorCQljZGZfbmJ1Zl91bm1hcChwZGV2LT5vc2RldiwgbXNkdSwgQ0RGX0RNQV9CSURJUkVDVElPTkFMKTsKKyNlbHNlCisJCWNkZl9uYnVmX3VubWFwKHBkZXYtPm9zZGV2LCBtc2R1LCBDREZfRE1BX0ZST01fREVWSUNFKTsKKyNlbmRpZgorCisJCS8qIGNhY2hlIGNvbnNpc3RlbmN5IGhhcyBiZWVuIHRha2VuIGNhcmUgb2YgYnkgY2RmX25idWZfdW5tYXAgKi8KKworCQkvKgorCQkgKiBOb3cgcmVhZCB0aGUgcnggZGVzY3JpcHRvci4KKwkJICogU2V0IHRoZSBsZW5ndGggdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlLgorCQkgKiBDaGVjayBpZiB0aGlzIE1TRFUgY29tcGxldGVzIGEgTVBEVS4KKwkJICovCisJCXJ4X2Rlc2MgPSBodHRfcnhfZGVzYyhtc2R1KTsKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkKKwkJaWYgKEhUVF9XSUZJX0lQKHBkZXYsIDIsIDApKQorCQkJcGFkX2J5dGVzID0gcnhfZGVzYy0+bXNkdV9lbmQubDNfaGVhZGVyX3BhZGRpbmc7CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisJCS8qCisJCSAqIE1ha2UgdGhlIG5ldGJ1ZidzIGRhdGEgcG9pbnRlciBwb2ludCB0byB0aGUgcGF5bG9hZCByYXRoZXIKKwkJICogdGhhbiB0aGUgZGVzY3JpcHRvci4KKwkJICovCisKKwkJY2RmX25idWZfcHVsbF9oZWFkKG1zZHUsCisJCQkJICAgSFRUX1JYX1NURF9ERVNDX1JFU0VSVkFUSU9OICsgcGFkX2J5dGVzKTsKKworCQkvKgorCQkgKiBTYW5pdHkgY2hlY2sgLSBjb25maXJtIHRoZSBIVyBpcyBmaW5pc2hlZCBmaWxsaW5nIGluCisJCSAqIHRoZSByeCBkYXRhLgorCQkgKiBJZiB0aGUgSFcgYW5kIFNXIGFyZSB3b3JraW5nIGNvcnJlY3RseSwgdGhlbiBpdCdzIGd1YXJhbnRlZWQKKwkJICogdGhhdCB0aGUgSFcncyBNQUMgRE1BIGlzIGRvbmUgYmVmb3JlIHRoaXMgcG9pbnQgaW4gdGhlIFNXLgorCQkgKiBUbyBwcmV2ZW50IHRoZSBjYXNlIHRoYXQgd2UgaGFuZGxlIGEgc3RhbGUgUnggZGVzY3JpcHRvciwKKwkJICoganVzdCBhc3NlcnQgZm9yIG5vdyB1bnRpbCB3ZSBoYXZlIGEgd2F5IHRvIHJlY292ZXIuCisJCSAqLworCisjaWZkZWYgREVCVUdfRE1BX0RPTkUKKwkJaWYgKGNkZl91bmxpa2VseSghKCgqKHVpbnQzMl90ICopICZyeF9kZXNjLT5hdHRlbnRpb24pCisJCQkJICAgJiBSWF9BVFRFTlRJT05fMF9NU0RVX0RPTkVfTUFTSykpKSB7CisKKwkJCWludCBkYmdfaXRlciA9IE1BWF9ET05FX0JJVF9DSEVDS19JVEVSOworCisJCQljZGZfcHJpbnQoIm1hbGZvcm1lZCBmcmFtZVxuIik7CisKKwkJCXdoaWxlIChkYmdfaXRlciAmJgorCQkJICAgICAgICghKCgqKHVpbnQzMl90ICopICZyeF9kZXNjLT5hdHRlbnRpb24pICYKKwkJCQkgIFJYX0FUVEVOVElPTl8wX01TRFVfRE9ORV9NQVNLKSkpIHsKKwkJCQljZGZfbWRlbGF5KDEpOworCisJCQkJY2RmX2ludmFsaWRhdGVfcmFuZ2UoKHZvaWQgKilyeF9kZXNjLAorCQkJCQkJICAgICAodm9pZCAqKSgoY2hhciAqKXJ4X2Rlc2MgKworCQkJCQkJIEhUVF9SWF9TVERfREVTQ19SRVNFUlZBVElPTikpOworCisJCQkJY2RmX3ByaW50KCJkZWJ1ZyBpdGVyICVkIHN1Y2Nlc3MgJWRcbiIsCisJCQkJCSAgZGJnX2l0ZXIsCisJCQkJCSAgcGRldi0+cnhfcmluZy5kYmdfc3luY19zdWNjZXNzKTsKKworCQkJCWRiZ19pdGVyLS07CisJCQl9CisKKwkJCWlmIChjZGZfdW5saWtlbHkoISgoKih1aW50MzJfdCAqKSAmcnhfZGVzYy0+YXR0ZW50aW9uKQorCQkJCQkgICAmIFJYX0FUVEVOVElPTl8wX01TRFVfRE9ORV9NQVNLKSkpIHsKKworI2lmZGVmIEhUVF9SWF9SRVNUT1JFCisJCQkJY2RmX3ByaW50KCJSWCBkb25lIGJpdCBlcnJvciBkZXRlY3RlZCFcbiIpOworCQkJCWNkZl9uYnVmX3NldF9uZXh0KG1zZHUsIE5VTEwpOworCQkJCSp0YWlsX21zZHUgPSBtc2R1OworCQkJCXBkZXYtPnJ4X3JpbmcucnhfcmVzZXQgPSAxOworCQkJCXJldHVybiBtc2R1X2NoYWluaW5nOworI2Vsc2UKKwkJCQl3bWFfY2xpX3NldF9jb21tYW5kKDAsIEdFTl9QQVJBTV9DUkFTSF9JTkpFQ1QsCisJCQkJCQkgICAgMCwgR0VOX0NNRCk7CisJCQkJSFRUX0FTU0VSVF9BTFdBWVMoMCk7CisjZW5kaWYKKwkJCX0KKwkJCXBkZXYtPnJ4X3JpbmcuZGJnX3N5bmNfc3VjY2VzcysrOworCQkJY2RmX3ByaW50KCJkZWJ1ZyBpdGVyICVkIHN1Y2Nlc3MgJWRcbiIsIGRiZ19pdGVyLAorCQkJCSAgcGRldi0+cnhfcmluZy5kYmdfc3luY19zdWNjZXNzKTsKKwkJfQorI2Vsc2UKKwkJSFRUX0FTU0VSVF9BTFdBWVMoKCoodWludDMyX3QgKikgJnJ4X2Rlc2MtPmF0dGVudGlvbikgJgorCQkJCSAgUlhfQVRURU5USU9OXzBfTVNEVV9ET05FX01BU0spOworI2VuZGlmCisJCS8qCisJCSAqIENvcHkgdGhlIEZXIHJ4IGRlc2NyaXB0b3IgZm9yIHRoaXMgTVNEVSBmcm9tIHRoZSByeAorCQkgKiBpbmRpY2F0aW9uIG1lc3NhZ2UgaW50byB0aGUgTVNEVSdzIG5ldGJ1Zi4KKwkJICogSEwgdXNlcyB0aGUgc2FtZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UgZGVmaW5pdGlvbiBhcyBMTCwgYW5kCisJCSAqIHNpbXBseSBhcHBlbmRzIG5ldyBpbmZvIChmaWVsZHMgZnJvbSB0aGUgSFcgcnggZGVzYywgYW5kIHRoZQorCQkgKiBNU0RVIHBheWxvYWQgaXRzZWxmKS4KKwkJICogU28sIHRoZSBvZmZzZXQgaW50byB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlIG9ubHkgaGFzIHRvCisJCSAqIGFjY291bnQgZm9yIHRoZSBzdGFuZGFyZCBvZmZzZXQgb2YgdGhlIHBlci1NU0RVIEZXIHJ4CisJCSAqIGRlc2MgaW5mbyB3aXRoaW4gdGhlIG1lc3NhZ2UsIGFuZCBob3cgbWFueSBieXRlcyBvZiB0aGUKKwkJICogcGVyLU1TRFUgRlcgcnggZGVzYyBpbmZvIGhhdmUgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLgorCQkgKiAoQW5kIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBob3N0LAorCQkgKiBzaW5jZSBmb3IgYSBiaWctZW5kaWFuIGhvc3QsIHRoZSByeCBpbmQgbWVzc2FnZSBjb250ZW50cywKKwkJICogaW5jbHVkaW5nIHRoZSBwZXItTVNEVSByeCBkZXNjIGJ5dGVzLCB3ZXJlIGJ5dGVzd2FwcGVkIGR1cmluZworCQkgKiB1cGxvYWQuKQorCQkgKi8KKwkJaWYgKHBkZXYtPnJ4X2luZF9tc2R1X2J5dGVfaWR4IDwgbnVtX21zZHVfYnl0ZXMpIHsKKwkJCWlmIChjZGZfdW5saWtlbHkKKwkJCQkgICAgKEhUVF9UMkhfTVNHX1RZUEVfUlhfRlJBR19JTkQgPT0gbXNnX3R5cGUpKQorCQkJCWJ5dGVfb2Zmc2V0ID0KKwkJCQkJSFRUX0VORElBTl9CWVRFX0lEWF9TV0FQCisJCQkJCShIVFRfUlhfRlJBR19JTkRfRldfREVTQ19CWVRFX09GRlNFVCk7CisJCQllbHNlCisJCQkJYnl0ZV9vZmZzZXQgPQorCQkJCQlIVFRfRU5ESUFOX0JZVEVfSURYX1NXQVAKKwkJCQkJKEhUVF9SWF9JTkRfRldfUlhfREVTQ19CWVRFX09GRlNFVCArCisJCQkJCQlwZGV2LT5yeF9pbmRfbXNkdV9ieXRlX2lkeCk7CisKKwkJCSooKHVpbnQ4X3QgKikgJnJ4X2Rlc2MtPmZ3X2Rlc2MudS52YWwpID0KKwkJCQlyeF9pbmRfZGF0YVtieXRlX29mZnNldF07CisJCQkvKgorCQkJICogVGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBvbmx5IHByb3ZpZGUgdGhlIGJhc2ljCisJCQkgKiBwZXItTVNEVSByeCBkZXNjcmlwdG9ycy4gIEp1c3QgdG8gYmUgc3VyZSwKKwkJCSAqIHZlcmlmeSB0aGF0IHRoZSB0YXJnZXQgaGFzIG5vdCBhdHRhY2hlZAorCQkJICogZXh0ZW5zaW9uIGRhdGEgKGUuZy4gTFJPIGZsb3cgSUQpLgorCQkJICovCisJCQkvKgorCQkJICogVGhlIGFzc2VydGlvbiBiZWxvdyBjdXJyZW50bHkgZG9lc24ndCB3b3JrIGZvcgorCQkJICogUlhfRlJBR19JTkQgbWVzc2FnZXMsIHNpbmNlIHRoZWlyIGZvcm1hdCBkaWZmZXJzCisJCQkgKiBmcm9tIHRoZSBSWF9JTkQgZm9ybWF0IChubyBGVyByeCBQUERVIGRlc2MgaW4KKwkJCSAqIHRoZSBjdXJyZW50IFJYX0ZSQUdfSU5EIG1lc3NhZ2UpLgorCQkJICogSWYgdGhlIFJYX0ZSQUdfSU5EIG1lc3NhZ2UgZm9ybWF0IGlzIHVwZGF0ZWQgdG8gbWF0Y2gKKwkJCSAqIHRoZSBSWF9JTkQgbWVzc2FnZSBmb3JtYXQsIHRoZW4gdGhlIGZvbGxvd2luZworCQkJICogYXNzZXJ0aW9uIGNhbiBiZSByZXN0b3JlZC4KKwkJCSAqLworCQkJLyogY2RmX2Fzc2VydCgocnhfaW5kX2RhdGFbYnl0ZV9vZmZzZXRdICYKKwkJCSAgIEZXX1JYX0RFU0NfRVhUX00pID09IDApOyAqLworCQkJcGRldi0+cnhfaW5kX21zZHVfYnl0ZV9pZHggKz0gMTsKKwkJCS8qIG9yIG1vcmUsIGlmIHRoZXJlJ3MgZXh0IGRhdGEgKi8KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBXaGVuIGFuIG92ZXJzaXplZCBBTVNEVSBoYXBwZW5lZCwgRlcgd2lsbCBsb3N0IHNvbWUKKwkJCSAqIG9mIE1TRFUgc3RhdHVzIC0gaW4gdGhpcyBjYXNlLCB0aGUgRlcgZGVzY3JpcHRvcnMKKwkJCSAqIHByb3ZpZGVkIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSBhY3R1YWwgTVNEVXMKKwkJCSAqIGluc2lkZSB0aGlzIE1QRFUuCisJCQkgKiBNYXJrIHRoZSBGVyBkZXNjcmlwdG9ycyBzbyB0aGF0IGl0IHdpbGwgc3RpbGwKKwkJCSAqIGRlbGl2ZXIgdG8gdXBwZXIgc3RhY2ssIGlmIG5vIENSQyBlcnJvciBmb3IgdGhlIE1QRFUuCisJCQkgKgorCQkJICogRklYIFRISVMgLSB0aGUgRlcgZGVzY3JpcHRvcnMgYXJlIGFjdHVhbGx5IGZvciBNU0RVcworCQkJICogaW4gdGhlIGVuZCBvZiB0aGlzIEEtTVNEVSBpbnN0ZWFkIG9mIHRoZSBiZWdpbm5pbmcuCisJCQkgKi8KKwkJCSooKHVpbnQ4X3QgKikgJnJ4X2Rlc2MtPmZ3X2Rlc2MudS52YWwpID0gMDsKKwkJfQorCisJCS8qCisJCSAqICBUQ1AvVURQIGNoZWNrc3VtIG9mZmxvYWQgc3VwcG9ydAorCQkgKi8KKwkJaHR0X3NldF9jaGVja3N1bV9yZXN1bHRfbGwocGRldiwgbXNkdSwgcnhfZGVzYyk7CisKKwkJbXNkdV9sZW5faW52YWxpZCA9ICgqKHVpbnQzMl90ICopICZyeF9kZXNjLT5hdHRlbnRpb24pICYKKwkJCQkgICBSWF9BVFRFTlRJT05fMF9NUERVX0xFTkdUSF9FUlJfTUFTSzsKKwkJbXNkdV9jaGFpbmVkID0gKCgoKih1aW50MzJfdCAqKSAmcnhfZGVzYy0+ZnJhZ19pbmZvKSAmCisJCQkJIFJYX0ZSQUdfSU5GT18wX1JJTkcyX01PUkVfQ09VTlRfTUFTSykgPj4KKwkJCQlSWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX0xTQik7CisJCW1zZHVfbGVuID0KKwkJCSgoKigodWludDMyX3QgKikgJnJ4X2Rlc2MtPm1zZHVfc3RhcnQpKSAmCisJCQkgUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX01BU0spID4+CisJCQlSWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTFNCOworCisJCWRvIHsKKwkJCWlmICghbXNkdV9sZW5faW52YWxpZCAmJiAhbXNkdV9jaGFpbmVkKSB7CisjaWYgZGVmaW5lZChQRVJFR1JJTkVfMV8wX1pFUk9fTEVOX1BIWV9FUlJfV0FSKQorCQkJCWlmIChtc2R1X2xlbiA+IDB4MzAwMCkKKwkJCQkJYnJlYWs7CisjZW5kaWYKKwkJCQljZGZfbmJ1Zl90cmltX3RhaWwobXNkdSwKKwkJCQkJCSAgIEhUVF9SWF9CVUZfU0laRSAtCisJCQkJCQkgICAoUlhfU1REX0RFU0NfU0laRSArCisJCQkJCQkgICAgbXNkdV9sZW4pKTsKKwkJCX0KKwkJfSB3aGlsZSAoMCk7CisKKwkJd2hpbGUgKG1zZHVfY2hhaW5lZC0tKSB7CisJCQljZGZfbmJ1Zl90IG5leHQgPSBodHRfcnhfbmV0YnVmX3BvcChwZGV2KTsKKwkJCWNkZl9uYnVmX3NldF9wa3RsZW4obmV4dCwgSFRUX1JYX0JVRl9TSVpFKTsKKwkJCW1zZHVfbGVuIC09IEhUVF9SWF9CVUZfU0laRTsKKwkJCWNkZl9uYnVmX3NldF9uZXh0KG1zZHUsIG5leHQpOworCQkJbXNkdSA9IG5leHQ7CisJCQltc2R1X2NoYWluaW5nID0gMTsKKworCQkJaWYgKG1zZHVfY2hhaW5lZCA9PSAwKSB7CisJCQkJLyogVHJpbSB0aGUgbGFzdCBvbmUgdG8gdGhlIGNvcnJlY3Qgc2l6ZSAtCisJCQkJICogYWNjb3VudGluZyBmb3IgaW5jb25zaXN0ZW50IEhXIGxlbmd0aHMKKwkJCQkgKiBjYXVzaW5nIGxlbmd0aCBvdmVyZmxvd3MgYW5kIHVuZGVyZmxvd3MKKwkJCQkgKi8KKwkJCQlpZiAoKCh1bnNpZ25lZCltc2R1X2xlbikgPgorCQkJCSAgICAoKHVuc2lnbmVkKQorCQkJCSAgICAgKEhUVF9SWF9CVUZfU0laRSAtIFJYX1NURF9ERVNDX1NJWkUpKSkgeworCQkJCQltc2R1X2xlbiA9CisJCQkJCQkoSFRUX1JYX0JVRl9TSVpFIC0KKwkJCQkJCSBSWF9TVERfREVTQ19TSVpFKTsKKwkJCQl9CisKKwkJCQljZGZfbmJ1Zl90cmltX3RhaWwobmV4dCwKKwkJCQkJCSAgIEhUVF9SWF9CVUZfU0laRSAtCisJCQkJCQkgICAoUlhfU1REX0RFU0NfU0laRSArCisJCQkJCQkgICAgbXNkdV9sZW4pKTsKKwkJCX0KKwkJfQorCisJCWxhc3RfbXNkdSA9CisJCQkoKCooKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXNkdV9lbmQpICsgNCkpICYKKwkJCSBSWF9NU0RVX0VORF80X0xBU1RfTVNEVV9NQVNLKSA+PgorCQkJUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCOworCisJCWlmIChsYXN0X21zZHUpIHsKKwkJCWNkZl9uYnVmX3NldF9uZXh0KG1zZHUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQljZGZfbmJ1Zl90IG5leHQgPSBodHRfcnhfbmV0YnVmX3BvcChwZGV2KTsKKwkJCWNkZl9uYnVmX3NldF9uZXh0KG1zZHUsIG5leHQpOworCQkJbXNkdSA9IG5leHQ7CisJCX0KKwl9CisJKnRhaWxfbXNkdSA9IG1zZHU7CisKKwkvKgorCSAqIERvbid0IHJlZmlsbCB0aGUgcmluZyB5ZXQuCisJICogRmlyc3QsIHRoZSBlbGVtZW50cyBwb3BwZWQgaGVyZSBhcmUgc3RpbGwgaW4gdXNlIC0gaXQgaXMKKwkgKiBub3Qgc2FmZSB0byBvdmVyd3JpdGUgdGhlbSB1bnRpbCB0aGUgbWF0Y2hpbmcgY2FsbCB0bworCSAqIG1wZHVfZGVzY19saXN0X25leHQuCisJICogU2Vjb25kLCBmb3IgZWZmaWNpZW5jeSBpdCBpcyBwcmVmZXJhYmxlIHRvIHJlZmlsbCB0aGUgcnggcmluZworCSAqIHdpdGggMSBQUERVJ3Mgd29ydGggb2YgcnggYnVmZmVycyAoc29tZXRoaW5nIGxpa2UgMzIgeCAzIGJ1ZmZlcnMpLAorCSAqIHJhdGhlciB0aGFuIG9uZSBNUERVJ3Mgd29ydGggb2YgcnggYnVmZmVycyAoc3RoIGxpa2UgMyBidWZmZXJzKS4KKwkgKiBDb25zZXF1ZW50bHksIHdlJ2xsIHJlbHkgb24gdGhlIHR4cnggU1cgdG8gdGVsbCB1cyB3aGVuIGl0IGlzIGRvbmUKKwkgKiBwdWxsaW5nIGFsbCB0aGUgUFBEVSdzIHJ4IGJ1ZmZlcnMgb3V0IG9mIHRoZSByeCByaW5nLCBhbmQgdGhlbgorCSAqIHJlZmlsbCBpdCBqdXN0IG9uY2UuCisJICovCisJcmV0dXJuIG1zZHVfY2hhaW5pbmc7Cit9CisKK2ludAoraHR0X3J4X29mZmxvYWRfbXNkdV9wb3BfbGwoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkgICBjZGZfbmJ1Zl90IG9mZmxvYWRfZGVsaXZlcl9tc2csCisJCQkgICBpbnQgKnZkZXZfaWQsCisJCQkgICBpbnQgKnBlZXJfaWQsCisJCQkgICBpbnQgKnRpZCwKKwkJCSAgIHVpbnQ4X3QgKmZ3X2Rlc2MsCisJCQkgICBjZGZfbmJ1Zl90ICpoZWFkX2J1ZiwgY2RmX25idWZfdCAqdGFpbF9idWYpCit7CisJY2RmX25idWZfdCBidWY7CisJdWludDMyX3QgKm1zZHVfaGRyLCBtc2R1X2xlbjsKKworCSpoZWFkX2J1ZiA9ICp0YWlsX2J1ZiA9IGJ1ZiA9IGh0dF9yeF9uZXRidWZfcG9wKHBkZXYpOworCS8qIEZha2UgcmVhZCBtcGR1X2Rlc2MgdG8ga2VlcCBkZXNjIHB0ciBpbiBzeW5jICovCisJaHR0X3J4X21wZHVfZGVzY19saXN0X25leHQocGRldiwgTlVMTCk7CisJY2RmX25idWZfc2V0X3BrdGxlbihidWYsIEhUVF9SWF9CVUZfU0laRSk7CisjaWZkZWYgREVCVUdfRE1BX0RPTkUKKwljZGZfbmJ1Zl91bm1hcChwZGV2LT5vc2RldiwgYnVmLCBDREZfRE1BX0JJRElSRUNUSU9OQUwpOworI2Vsc2UKKwljZGZfbmJ1Zl91bm1hcChwZGV2LT5vc2RldiwgYnVmLCBDREZfRE1BX0ZST01fREVWSUNFKTsKKyNlbmRpZgorCW1zZHVfaGRyID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEoYnVmKTsKKworCS8qIEZpcnN0IGR3b3JkICovCisJbXNkdV9sZW4gPSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0xFTl9HRVQoKm1zZHVfaGRyKTsKKwkqcGVlcl9pZCA9IEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfUEVFUl9JRF9HRVQoKm1zZHVfaGRyKTsKKworCS8qIFNlY29uZCBkd29yZCAqLworCW1zZHVfaGRyKys7CisJKnZkZXZfaWQgPSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX1ZERVZfSURfR0VUKCptc2R1X2hkcik7CisJKnRpZCA9IEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfVElEX0dFVCgqbXNkdV9oZHIpOworCSpmd19kZXNjID0gSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9ERVNDX0dFVCgqbXNkdV9oZHIpOworCisJY2RmX25idWZfcHVsbF9oZWFkKGJ1ZiwgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9IRFJfQllURVMpOworCWNkZl9uYnVmX3NldF9wa3RsZW4oYnVmLCBtc2R1X2xlbik7CisJcmV0dXJuIDA7Cit9CisKK2ludAoraHR0X3J4X29mZmxvYWRfcGFkZHJfbXNkdV9wb3BfbGwoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkJIHVpbnQzMl90ICptc2dfd29yZCwKKwkJCQkgaW50IG1zZHVfaXRlciwKKwkJCQkgaW50ICp2ZGV2X2lkLAorCQkJCSBpbnQgKnBlZXJfaWQsCisJCQkJIGludCAqdGlkLAorCQkJCSB1aW50OF90ICpmd19kZXNjLAorCQkJCSBjZGZfbmJ1Zl90ICpoZWFkX2J1ZiwgY2RmX25idWZfdCAqdGFpbF9idWYpCit7CisJY2RmX25idWZfdCBidWY7CisJdWludDMyX3QgKm1zZHVfaGRyLCBtc2R1X2xlbjsKKwl1aW50MzJfdCAqY3Vycl9tc2R1OworCXVpbnQzMl90IHBhZGRyOworCisJY3Vycl9tc2R1ID0KKwkJbXNnX3dvcmQgKyAobXNkdV9pdGVyICogSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9EV09SRFMpOworCXBhZGRyID0gSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEFERFJfR0VUKCpjdXJyX21zZHUpOworCSpoZWFkX2J1ZiA9ICp0YWlsX2J1ZiA9IGJ1ZiA9IGh0dF9yeF9pbl9vcmRlcl9uZXRidWZfcG9wKHBkZXYsIHBhZGRyKTsKKworCWlmIChjZGZfdW5saWtlbHkoTlVMTCA9PSBidWYpKSB7CisJCWNkZl9wcmludCgiJXM6IG5ldGJ1ZiBwb3AgZmFpbGVkIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJY2RmX25idWZfc2V0X3BrdGxlbihidWYsIEhUVF9SWF9CVUZfU0laRSk7CisjaWZkZWYgREVCVUdfRE1BX0RPTkUKKwljZGZfbmJ1Zl91bm1hcChwZGV2LT5vc2RldiwgYnVmLCBDREZfRE1BX0JJRElSRUNUSU9OQUwpOworI2Vsc2UKKwljZGZfbmJ1Zl91bm1hcChwZGV2LT5vc2RldiwgYnVmLCBDREZfRE1BX0ZST01fREVWSUNFKTsKKyNlbmRpZgorCW1zZHVfaGRyID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEoYnVmKTsKKworCS8qIEZpcnN0IGR3b3JkICovCisJbXNkdV9sZW4gPSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0xFTl9HRVQoKm1zZHVfaGRyKTsKKwkqcGVlcl9pZCA9IEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfUEVFUl9JRF9HRVQoKm1zZHVfaGRyKTsKKworCS8qIFNlY29uZCBkd29yZCAqLworCW1zZHVfaGRyKys7CisJKnZkZXZfaWQgPSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX1ZERVZfSURfR0VUKCptc2R1X2hkcik7CisJKnRpZCA9IEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfVElEX0dFVCgqbXNkdV9oZHIpOworCSpmd19kZXNjID0gSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9ERVNDX0dFVCgqbXNkdV9oZHIpOworCisJY2RmX25idWZfcHVsbF9oZWFkKGJ1ZiwgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9IRFJfQllURVMpOworCWNkZl9uYnVmX3NldF9wa3RsZW4oYnVmLCBtc2R1X2xlbik7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiB2b2lkCitkdW1wX3BrdChjZGZfbmJ1Zl90IG5idWYsIHVpbnQzMl90IG5idWZfcGFkZHIsIGludCBsZW4pOworCisjaWZkZWYgUlhfSEFTSF9ERUJVRworI2RlZmluZSBIVFRfUlhfQ0hFQ0tfTVNEVV9DT1VOVChtc2R1X2NvdW50KSBIVFRfQVNTRVJUX0FMV0FZUyhtc2R1X2NvdW50KQorI2Vsc2UKKyNkZWZpbmUgSFRUX1JYX0NIRUNLX01TRFVfQ09VTlQobXNkdV9jb3VudCkgICAgIC8qIG5vLW9wICovCisjZW5kaWYKKworLyogUmV0dXJuIHZhbHVlczogMSAtIHN1Y2Nlc3MsIDAgLSBmYWlsdXJlICovCitpbnQKK2h0dF9yeF9hbXNkdV9yeF9pbl9vcmRlcl9wb3BfbGwoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkJY2RmX25idWZfdCByeF9pbmRfbXNnLAorCQkJCWNkZl9uYnVmX3QgKmhlYWRfbXNkdSwgY2RmX25idWZfdCAqdGFpbF9tc2R1KQoreworCWNkZl9uYnVmX3QgbXNkdSwgbmV4dCwgcHJldiA9IE5VTEw7CisJdWludDhfdCAqcnhfaW5kX2RhdGE7CisJdWludDMyX3QgKm1zZ193b3JkOworCXVuc2lnbmVkIGludCBtc2R1X2NvdW50ID0gMDsKKwl1aW50OF90IG9mZmxvYWRfaW5kOworCXN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKnJ4X2Rlc2M7CisKKwlIVFRfQVNTRVJUMShodHRfcnhfaW5fb3JkZXJfcmluZ19lbGVtcyhwZGV2KSAhPSAwKTsKKworCXJ4X2luZF9kYXRhID0gY2RmX25idWZfZGF0YShyeF9pbmRfbXNnKTsKKwltc2dfd29yZCA9ICh1aW50MzJfdCAqKSByeF9pbmRfZGF0YTsKKworCW9mZmxvYWRfaW5kID0gSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfT0ZGTE9BRF9HRVQoKm1zZ193b3JkKTsKKworCS8qIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIE1TRFVzICovCisJbXNkdV9jb3VudCA9IEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfQ05UX0dFVCgqKG1zZ193b3JkICsgMSkpOworCUhUVF9SWF9DSEVDS19NU0RVX0NPVU5UKG1zZHVfY291bnQpOworCisJbXNnX3dvcmQgPQorCQkodWludDMyX3QgKikgKHJ4X2luZF9kYXRhICsgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfSERSX0JZVEVTKTsKKwlpZiAob2ZmbG9hZF9pbmQpIHsKKwkJb2xfcnhfb2ZmbG9hZF9wYWRkcl9kZWxpdmVyX2luZF9oYW5kbGVyKHBkZXYsIG1zZHVfY291bnQsCisJCQkJCQkJbXNnX3dvcmQpOworCQkqaGVhZF9tc2R1ID0gKnRhaWxfbXNkdSA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCSgqaGVhZF9tc2R1KSA9IG1zZHUgPSBodHRfcnhfaW5fb3JkZXJfbmV0YnVmX3BvcCgKKwkJcGRldiwKKwkJSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEFERFJfR0VUKCptc2dfd29yZCkpOworCisJaWYgKGNkZl91bmxpa2VseShOVUxMID09IG1zZHUpKSB7CisJCWNkZl9wcmludCgiJXM6IG5ldGJ1ZiBwb3AgZmFpbGVkIVxuIiwgX19mdW5jX18pOworCQkqdGFpbF9tc2R1ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKG1zZHVfY291bnQgPiAwKSB7CisKKwkJLyoKKwkJICogU2V0IHRoZSBuZXRidWYgbGVuZ3RoIHRvIGJlIHRoZSBlbnRpcmUgYnVmZmVyIGxlbmd0aAorCQkgKiBpbml0aWFsbHksIHNvIHRoZSB1bm1hcCB3aWxsIHVubWFwIHRoZSBlbnRpcmUgYnVmZmVyLgorCQkgKi8KKwkJY2RmX25idWZfc2V0X3BrdGxlbihtc2R1LCBIVFRfUlhfQlVGX1NJWkUpOworI2lmZGVmIERFQlVHX0RNQV9ET05FCisJCWNkZl9uYnVmX3VubWFwKHBkZXYtPm9zZGV2LCBtc2R1LCBDREZfRE1BX0JJRElSRUNUSU9OQUwpOworI2Vsc2UKKwkJY2RmX25idWZfdW5tYXAocGRldi0+b3NkZXYsIG1zZHUsIENERl9ETUFfRlJPTV9ERVZJQ0UpOworI2VuZGlmCisKKwkJLyogY2FjaGUgY29uc2lzdGVuY3kgaGFzIGJlZW4gdGFrZW4gY2FyZSBvZiBieSBjZGZfbmJ1Zl91bm1hcCAqLworCQlyeF9kZXNjID0gaHR0X3J4X2Rlc2MobXNkdSk7CisKKwkJaHR0X3J4X2V4dHJhY3RfbHJvX2luZm8obXNkdSwgcnhfZGVzYyk7CisKKwkJLyoKKwkJICogTWFrZSB0aGUgbmV0YnVmJ3MgZGF0YSBwb2ludGVyIHBvaW50IHRvIHRoZSBwYXlsb2FkIHJhdGhlcgorCQkgKiB0aGFuIHRoZSBkZXNjcmlwdG9yLgorCQkgKi8KKwkJY2RmX25idWZfcHVsbF9oZWFkKG1zZHUsIEhUVF9SWF9TVERfREVTQ19SRVNFUlZBVElPTik7CisjaWYgSFRUX1BBRERSNjQKKyNkZWZpbmUgTkVYVF9GSUVMRF9PRkZTRVRfSU4zMiAyCisjZWxzZSAvKiAhIEhUVF9QQUREUjY0ICovCisjZGVmaW5lIE5FWFRfRklFTERfT0ZGU0VUX0lOMzIgMQorI2VuZGlmIC8qIEhUVF9QQUREUjY0ICovCisjCisJCWNkZl9uYnVmX3RyaW1fdGFpbChtc2R1LAorCQkJCSAgIEhUVF9SWF9CVUZfU0laRSAtCisJCQkJICAgKFJYX1NURF9ERVNDX1NJWkUgKworCQkJCSAgICBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9NU0RVX0xFTl9HRVQoCisJCQkJCSAgICAqKG1zZ193b3JkICsgTkVYVF9GSUVMRF9PRkZTRVRfSU4zMikpKSk7CisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX0RFQlVHKQorCQlkdW1wX3BrdChtc2R1LCAwLCA2NCk7CisjZW5kaWYKKwkJKigodWludDhfdCAqKSAmcnhfZGVzYy0+ZndfZGVzYy51LnZhbCkgPQorCQkJSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRldfREVTQ19HRVQoKihtc2dfd29yZCArIE5FWFRfRklFTERfT0ZGU0VUX0lOMzIpKTsKKyN1bmRlZiBORVhUX0ZJRUxEX09GRlNFVF9JTjMyCisKKwkJbXNkdV9jb3VudC0tOworCisJCWlmIChjZGZfdW5saWtlbHkoKCooKHVfaW50OF90ICopICZyeF9kZXNjLT5md19kZXNjLnUudmFsKSkgJgorCQkJCSAgICBGV19SWF9ERVNDX01JQ19FUlJfTSkpIHsKKwkJCXVfaW50OF90IHRpZCA9CisJCQkJSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRVhUX1RJRF9HRVQoCisJCQkJCSoodV9pbnQzMl90ICopcnhfaW5kX2RhdGEpOworCQkJdV9pbnQxNl90IHBlZXJfaWQgPQorCQkJCUhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BFRVJfSURfR0VUKAorCQkJCQkqKHVfaW50MzJfdCAqKXJ4X2luZF9kYXRhKTsKKwkJCW9sX3J4X21pY19lcnJvcl9oYW5kbGVyKHBkZXYtPnR4cnhfcGRldiwgdGlkLCBwZWVyX2lkLAorCQkJCQkJcnhfZGVzYywgbXNkdSk7CisKKwkJCWh0dF9yeF9kZXNjX2ZyYW1lX2ZyZWUocGRldiwgbXNkdSk7CisJCQkvKiBpZiB0aGlzIGlzIHRoZSBsYXN0IG1zZHUgKi8KKwkJCWlmICghbXNkdV9jb3VudCkgeworCQkJCS8qIGlmIHRoaXMgaXMgdGhlIG9ubHkgbXNkdSAqLworCQkJCWlmICghcHJldikgeworCQkJCQkqaGVhZF9tc2R1ID0gKnRhaWxfbXNkdSA9IE5VTEw7CisJCQkJCXJldHVybiAwOworCQkJCX0gZWxzZSB7CisJCQkJCSp0YWlsX21zZHUgPSBwcmV2OworCQkJCQljZGZfbmJ1Zl9zZXRfbmV4dChwcmV2LCBOVUxMKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfSBlbHNlIHsgLyogaWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgbXNkdSAqLworCQkJCS8qIGdldCB0aGUgbmV4dCBtc2R1ICovCisJCQkJbXNnX3dvcmQgKz0gSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9EV09SRFM7CisJCQkJbmV4dCA9IGh0dF9yeF9pbl9vcmRlcl9uZXRidWZfcG9wKAorCQkJCQlwZGV2LAorCQkJCQlIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUl9HRVQoCisJCQkJCQkqbXNnX3dvcmQpKTsKKwkJCQlpZiAoY2RmX3VubGlrZWx5KE5VTEwgPT0gbmV4dCkpIHsKKwkJCQkJY2RmX3ByaW50KCIlczogbmV0YnVmIHBvcCBmYWlsZWQhXG4iLAorCQkJCQkJCQkgX19mdW5jX18pOworCQkJCQkqdGFpbF9tc2R1ID0gTlVMTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQkJLyogaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IG1zZHUsIHVwZGF0ZSB0aGUKKwkJCQkgKiBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZWNlZGluZyBtc2R1CisJCQkJICovCisJCQkJaWYgKHByZXYpIHsKKwkJCQkJY2RmX25idWZfc2V0X25leHQocHJldiwgbmV4dCk7CisJCQkJfSBlbHNlIHsKKwkJCQkvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBtc2R1LCB1cGRhdGUgdGhlCisJCQkJICogaGVhZCBwb2ludGVyCisJCQkJICovCisJCQkJCSpoZWFkX21zZHUgPSBuZXh0OworCQkJCX0KKwkJCQltc2R1ID0gbmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIFVwZGF0ZSBjaGVja3N1bSByZXN1bHQgKi8KKwkJaHR0X3NldF9jaGVja3N1bV9yZXN1bHRfbGwocGRldiwgbXNkdSwgcnhfZGVzYyk7CisKKwkJLyogY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFzdCBtc2R1ICovCisJCWlmIChtc2R1X2NvdW50KSB7CisJCQltc2dfd29yZCArPSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9NU0RVX0RXT1JEUzsKKwkJCW5leHQgPSBodHRfcnhfaW5fb3JkZXJfbmV0YnVmX3BvcCgKKwkJCQlwZGV2LAorCQkJCUhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BBRERSX0dFVCgqbXNnX3dvcmQpKTsKKwkJCWlmIChjZGZfdW5saWtlbHkoTlVMTCA9PSBuZXh0KSkgeworCQkJCWNkZl9wcmludCgiJXM6IG5ldGJ1ZiBwb3AgZmFpbGVkIVxuIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQkJKnRhaWxfbXNkdSA9IE5VTEw7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQljZGZfbmJ1Zl9zZXRfbmV4dChtc2R1LCBuZXh0KTsKKwkJCXByZXYgPSBtc2R1OworCQkJbXNkdSA9IG5leHQ7CisJCX0gZWxzZSB7CisJCQkqdGFpbF9tc2R1ID0gbXNkdTsKKwkJCWNkZl9uYnVmX3NldF9uZXh0KG1zZHUsIE5VTEwpOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIFV0aWwgZmFrZSBmdW5jdGlvbiB0aGF0IGhhcyBzYW1lIHByb3RvdHlwZSBhcyBjZGZfbmJ1Zl9jbG9uZSB0aGF0IGp1c3QKKyAqIHJldHVyZXMgdGhlIHNhbWUgbmJ1ZgorICovCitjZGZfbmJ1Zl90IGh0dF9yeF9jZGZfbm9jbG9uZV9idWYoY2RmX25idWZfdCBidWYpCit7CisJcmV0dXJuIGJ1ZjsKK30KKworLyogRklYTUU6IFRoaXMgaXMgYSBIVyBkZWZpbml0aW9uIG5vdCBwcm92ZGVkIGJ5IEhXLCB3aGVyZSBkb2VzIGl0IGdvID8gKi8KK2VudW0geworCUhXX1JYX0RFQ0FQX0ZPUk1BVF9SQVcgPSAwLAorCUhXX1JYX0RFQ0FQX0ZPUk1BVF9OV0lGSSwKKwlIV19SWF9ERUNBUF9GT1JNQVRfODAyMywKKwlIV19SWF9ERUNBUF9GT1JNQVRfRVRIMiwKK307CisKKyNkZWZpbmUgSFRUX0ZDU19MRU4gKDQpCisKK3N0YXRpYyB2b2lkCitodHRfcnhfcGFyc2VfcHBkdV9zdGFydF9zdGF0dXMoc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqcnhfZGVzYywKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnMpCit7CisKKwlzdHJ1Y3QgcnhfcHBkdV9zdGFydCAqcHBkdV9zdGFydCA9ICZyeF9kZXNjLT5wcGR1X3N0YXJ0OworCisJLyogUlNTSSAqLworCXJzLT5yc19yc3NpID0gcHBkdV9zdGFydC0+cnNzaV9jb21iOworCisJLyogUEhZIHJhdGUgKi8KKwkvKiByc19yYXRlcGh5IGNvZGluZworCSAgIFtiMyAtIGIwXQorCSAgIDAgLT4gT0ZETQorCSAgIDEgLT4gQ0NLCisJICAgMiAtPiBIVAorCSAgIDMgLT4gVkhUCisJICAgT0ZETSAvIENDSworCSAgIFtiNyAgLSBiNCBdID0+IExTSUcgcmF0ZQorCSAgIFtiMjMgLSBiOCBdID0+IHNlcnZpY2UgZmllbGQKKwkgICAoYicxMiBzdGF0aWMvZHluYW1pYywKKwkgICBiJzE0Li5iJzEzIEJXIGZvciBWSFQpCisJICAgW2IzMSAtIGIyNCBdID0+IFJlc2VydmVkCisJICAgSFQgLyBWSFQKKwkgICBbYjE1IC0gYjQgXSA9PiBTSUcgQV8yIDEyIExTQnMKKwkgICBbYjMxIC0gYjE2XSA9PiBTSUcgQV8xIDE2IExTQnMKKworCSAqLworCWlmIChwcGR1X3N0YXJ0LT5wcmVhbWJsZV90eXBlID09IDB4NCkgeworCQlycy0+cnNfcmF0ZXBoeSA9IHBwZHVfc3RhcnQtPmxfc2lnX3JhdGVfc2VsZWN0OworCQlycy0+cnNfcmF0ZXBoeSB8PSBwcGR1X3N0YXJ0LT5sX3NpZ19yYXRlIDw8IDQ7CisJCXJzLT5yc19yYXRlcGh5IHw9IHBwZHVfc3RhcnQtPnNlcnZpY2UgPDwgODsKKwl9IGVsc2UgeworCQlycy0+cnNfcmF0ZXBoeSA9IChwcGR1X3N0YXJ0LT5wcmVhbWJsZV90eXBlICYgMHg0KSA/IDMgOiAyOworI2lmZGVmIEhFTElVTVBMVVMKKwkJcnMtPnJzX3JhdGVwaHkgfD0KKwkJCShwcGR1X3N0YXJ0LT5odF9zaWdfdmh0X3NpZ19haF9zaWdfYV8yICYgMHhGRkYpIDw8IDQ7CisJCXJzLT5yc19yYXRlcGh5IHw9CisJCQkocHBkdV9zdGFydC0+aHRfc2lnX3ZodF9zaWdfYWhfc2lnX2FfMSAmIDB4RkZGRikgPDwgMTY7CisjZWxzZQorCQlycy0+cnNfcmF0ZXBoeSB8PSAocHBkdV9zdGFydC0+aHRfc2lnX3ZodF9zaWdfYV8yICYgMHhGRkYpIDw8IDQ7CisJCXJzLT5yc19yYXRlcGh5IHw9CisJCQkocHBkdV9zdGFydC0+aHRfc2lnX3ZodF9zaWdfYV8xICYgMHhGRkZGKSA8PCAxNjsKKyNlbmRpZgorCX0KKworCXJldHVybjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IG1vbnRpb3IgbW9kZSBjb2RlIHRvIHJlc3RpdGNoIGFuIE1TRFUgbGlzdAorICogY29ycmVzcG9uZGluZyB0byBhbiBNUERVIGJhY2sgaW50byBhbiBNUERVIGJ5IGxpbmtpbmcgdXAgdGhlIHNrYnMuCisgKi8KK2NkZl9uYnVmX3QKK2h0dF9yeF9yZXN0aXRjaF9tcGR1X2Zyb21fbXNkdXMoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkJY2RmX25idWZfdCBoZWFkX21zZHUsCisJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cywKKwkJCQl1bnNpZ25lZCBjbG9uZV9ub3RfcmVxZCkKK3sKKworCWNkZl9uYnVmX3QgbXNkdSwgbXBkdV9idWYsIHByZXZfYnVmLCBtc2R1X29yaWcsIGhlYWRfZnJhZ19saXN0X2Nsb25lZDsKKwljZGZfbmJ1Zl90ICgqY2xvbmVfbmJ1Zl9mbikoY2RmX25idWZfdCBidWYpOworCXVuc2lnbmVkIGRlY2FwX2Zvcm1hdCwgd2lmaV9oZHJfbGVuLCBzZWNfaGRyX2xlbiwgbXNkdV9sbGNfbGVuLAorCQkgbXBkdV9idWZfbGVuLCBkZWNhcF9oZHJfcHVsbF9ieXRlcywgZnJhZ19saXN0X3N1bV9sZW4sIGRpciwKKwkJIGlzX2Ftc2R1LCBpc19maXJzdF9mcmFnLCBhbXNkdV9wYWQsIG1zZHVfbGVuOworCXN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKnJ4X2Rlc2M7CisJY2hhciAqaGRyX2Rlc2M7CisJdW5zaWduZWQgY2hhciAqZGVzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Fvc2NudGwgKnFvczsKKworCS8qIElmIHRoaXMgcGFja2V0IGRvZXMgbm90IGdvIHVwIHRoZSBub3JtYWwgc3RhY2sgcGF0aCB3ZSBkb250IG5lZWQgdG8KKwkgKiB3YXN0ZSBjeWNsZXMgY2xvbmluZyB0aGUgcGFja2V0cworCSAqLworCWNsb25lX25idWZfZm4gPQorCQljbG9uZV9ub3RfcmVxZCA/IGh0dF9yeF9jZGZfbm9jbG9uZV9idWYgOiBjZGZfbmJ1Zl9jbG9uZTsKKworCS8qIFRoZSBuYnVmIGhhcyBiZWVuIHB1bGxlZCBqdXN0IGJleW9uZCB0aGUgc3RhdHVzIGFuZCBwb2ludHMgdG8gdGhlCisJICogcGF5bG9hZAorCSAqLworCW1zZHVfb3JpZyA9IGhlYWRfbXNkdTsKKwlyeF9kZXNjID0gaHR0X3J4X2Rlc2MobXNkdV9vcmlnKTsKKworCS8qIEZpbGwgb3V0IHRoZSByeF9zdGF0dXMgZnJvbSB0aGUgUFBEVSBzdGFydCBhbmQgZW5kIGZpZWxkcyAqLworCWlmIChyeF9kZXNjLT5hdHRlbnRpb24uZmlyc3RfbXBkdSkgeworCQlodHRfcnhfcGFyc2VfcHBkdV9zdGFydF9zdGF0dXMocnhfZGVzYywgcnhfc3RhdHVzKTsKKworCQkvKiBUaGUgdGltZXN0YW1wIGlzIG5vIGxvbmdlciB2YWxpZCAtIEl0IHdpbGwgYmUgdmFsaWQgb25seSBmb3IKKwkJICogdGhlIGxhc3QgTVBEVQorCQkgKi8KKwkJcnhfc3RhdHVzLT5yc190c3RhbXAudHNmID0gfjA7CisJfQorCisJZGVjYXBfZm9ybWF0ID0KKwkJR0VUX0ZJRUxEKCZyeF9kZXNjLT5tc2R1X3N0YXJ0LCBSWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUKTsKKworCWhlYWRfZnJhZ19saXN0X2Nsb25lZCA9IE5VTEw7CisKKwkvKiBFYXN5IGNhc2UgLSBUaGUgTVNEVSBzdGF0dXMgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhIG5vbi1kZWNhcHBlZAorCSAqIHBhY2tldCBpbiBSQVcgbW9kZS4KKwkgKiByZXR1cm4KKwkgKi8KKwlpZiAoZGVjYXBfZm9ybWF0ID09IEhXX1JYX0RFQ0FQX0ZPUk1BVF9SQVcpIHsKKwkJLyogTm90ZSB0aGF0IHRoaXMgcGF0aCBtaWdodCBzdWZmZXIgZnJvbSBoZWFkcm9vbSB1bmF2YWlsYWJpbHR5LAorCQkgKiBidXQgdGhlIFJYIHN0YXR1cyBpcyB1c3VhbGx5IGVub3VnaAorCQkgKi8KKwkJbXBkdV9idWYgPSBjbG9uZV9uYnVmX2ZuKGhlYWRfbXNkdSk7CisKKwkJcHJldl9idWYgPSBtcGR1X2J1ZjsKKworCQlmcmFnX2xpc3Rfc3VtX2xlbiA9IDA7CisJCWlzX2ZpcnN0X2ZyYWcgPSAxOworCQltc2R1X2xlbiA9IGNkZl9uYnVmX2xlbihtcGR1X2J1Zik7CisKKwkJLyogRHJvcCB0aGUgemVyby1sZW5ndGggbXNkdSAqLworCQlpZiAoIW1zZHVfbGVuKQorCQkJZ290byBtcGR1X3N0aXRjaF9mYWlsOworCisJCW1zZHVfb3JpZyA9IGNkZl9uYnVmX25leHQoaGVhZF9tc2R1KTsKKworCQl3aGlsZSAobXNkdV9vcmlnKSB7CisKKwkJCS8qIFRPRE86IGludHJhIEFNU0RVIHBhZGRpbmcgLSBkbyB3ZSBuZWVkIGl0ID8/PyAqLworCQkJbXNkdSA9IGNsb25lX25idWZfZm4obXNkdV9vcmlnKTsKKwkJCWlmICghbXNkdSkKKwkJCQlnb3RvIG1wZHVfc3RpdGNoX2ZhaWw7CisKKwkJCWlmIChpc19maXJzdF9mcmFnKSB7CisJCQkJaXNfZmlyc3RfZnJhZyA9IDA7CisJCQkJaGVhZF9mcmFnX2xpc3RfY2xvbmVkID0gbXNkdTsKKwkJCX0KKworCQkJbXNkdV9sZW4gPSBjZGZfbmJ1Zl9sZW4obXNkdSk7CisJCQkvKiBEcm9wIHRoZSB6ZXJvLWxlbmd0aCBtc2R1ICovCisJCQlpZiAoIW1zZHVfbGVuKQorCQkJCWdvdG8gbXBkdV9zdGl0Y2hfZmFpbDsKKworCQkJZnJhZ19saXN0X3N1bV9sZW4gKz0gbXNkdV9sZW47CisKKwkJCS8qIE1haW50YWluIHRoZSBsaW5raW5nIG9mIHRoZSBjbG9uZWQgTVNEVVMgKi8KKwkJCWNkZl9uYnVmX3NldF9uZXh0X2V4dChwcmV2X2J1ZiwgbXNkdSk7CisKKwkJCS8qIE1vdmUgdG8gdGhlIG5leHQgKi8KKwkJCXByZXZfYnVmID0gbXNkdTsKKwkJCW1zZHVfb3JpZyA9IGNkZl9uYnVmX25leHQobXNkdV9vcmlnKTsKKwkJfQorCisJCS8qIFRoZSBsYXN0IG1zZHUgbGVuZ3RoIG5lZWQgYmUgbGFyZ2VyIHRoYW4gSFRUX0ZDU19MRU4gKi8KKwkJaWYgKG1zZHVfbGVuIDwgSFRUX0ZDU19MRU4pCisJCQlnb3RvIG1wZHVfc3RpdGNoX2ZhaWw7CisKKwkJY2RmX25idWZfdHJpbV90YWlsKHByZXZfYnVmLCBIVFRfRkNTX0xFTik7CisKKwkJLyogSWYgdGhlcmUgd2VyZSBtb3JlIGZyYWdtZW50cyB0byB0aGlzIFJBVyBmcmFtZSAqLworCQlpZiAoaGVhZF9mcmFnX2xpc3RfY2xvbmVkKSB7CisJCQljZGZfbmJ1Zl9hcHBlbmRfZXh0X2xpc3QobXBkdV9idWYsCisJCQkJCQkgaGVhZF9mcmFnX2xpc3RfY2xvbmVkLAorCQkJCQkJIGZyYWdfbGlzdF9zdW1fbGVuKTsKKwkJfQorCisJCWdvdG8gbXBkdV9zdGl0Y2hfZG9uZTsKKwl9CisKKwkvKiBEZWNhcCBtb2RlOgorCSAqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGhlYWRlciBpbiBkZWNhcHBlZCBwYWNrZXQgdG8ga25vY2sgb2ZmIGJhc2VkCisJICogb24gdGhlIGRlY2FwIHR5cGUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiByYXcgYnl0ZXMgdG8gY29weQorCSAqIHN0YXR1cyBoZWFkZXIKKwkgKi8KKworCWhkcl9kZXNjID0gJnJ4X2Rlc2MtPnJ4X2hkcl9zdGF0dXNbMF07CisKKwkvKiBCYXNlIHNpemUgKi8KKwl3aWZpX2hkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9mcmFtZSk7CisJd2ggPSAoc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKWhkcl9kZXNjOworCisJZGlyID0gd2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX0RJUl9NQVNLOworCWlmIChkaXIgPT0gSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTKQorCQl3aWZpX2hkcl9sZW4gKz0gNjsKKworCWlzX2Ftc2R1ID0gMDsKKwlpZiAod2gtPmlfZmNbMF0gJiBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TKSB7CisJCXFvcyA9IChzdHJ1Y3QgaWVlZTgwMjExX3Fvc2NudGwgKikKKwkJICAgICAgKGhkcl9kZXNjICsgd2lmaV9oZHJfbGVuKTsKKwkJd2lmaV9oZHJfbGVuICs9IDI7CisKKwkJaXNfYW1zZHUgPSAocW9zLT5pX3Fvc1swXSAmIElFRUU4MDIxMV9RT1NfQU1TRFUpOworCX0KKworCS8qIFRPRE86IEFueSBzZWN1cml0eSBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBNUERVICovCisJc2VjX2hkcl9sZW4gPSAwOworCisJLyogTVNEVSByZWxhdGVkIHN0dWZmIExMQyAtIEFNU0RVIHN1YmZyYW1lIGhlYWRlciBldGMgKi8KKwltc2R1X2xsY19sZW4gPSBpc19hbXNkdSA/ICgxNCArIDgpIDogODsKKworCW1wZHVfYnVmX2xlbiA9IHdpZmlfaGRyX2xlbiArIHNlY19oZHJfbGVuICsgbXNkdV9sbGNfbGVuOworCisJLyogIkRlY2FwIiBoZWFkZXIgdG8gcmVtb3ZlIGZyb20gTVNEVSBidWZmZXIgKi8KKwlkZWNhcF9oZHJfcHVsbF9ieXRlcyA9IDE0OworCisJLyogQWxsb2NhdGUgYSBuZXcgbmJ1ZiBmb3IgaG9sZGluZyB0aGUgODAyLjExIGhlYWRlciByZXRyaWV2ZWQgZnJvbSB0aGUKKwkgKiBzdGF0dXMgb2YgdGhlIG5vdyBkZWNhcHBlZCBmaXJzdCBtc2R1LiBMZWF2ZSBlbm91Z2ggaGVhZHJvb20gZm9yCisJICogYWNjb21vZGF0aW5nIGFueSByYWRpby10YXAgL3ByaXNtIGxpa2UgUEhZIGhlYWRlcgorCSAqLworI2RlZmluZSBIVFRfTUFYX01PTklUT1JfSEVBREVSICg1MTIpCisJbXBkdV9idWYgPSBjZGZfbmJ1Zl9hbGxvYyhwZGV2LT5vc2RldiwKKwkJCQkgIEhUVF9NQVhfTU9OSVRPUl9IRUFERVIgKyBtcGR1X2J1Zl9sZW4sCisJCQkJICBIVFRfTUFYX01PTklUT1JfSEVBREVSLCA0LCBmYWxzZSk7CisKKwlpZiAoIW1wZHVfYnVmKQorCQlnb3RvIG1wZHVfc3RpdGNoX2ZhaWw7CisKKwkvKiBDb3B5IHRoZSBNUERVIHJlbGF0ZWQgaGVhZGVyIGFuZCBlbmMgaGVhZGVycyBpbnRvIHRoZSBmaXJzdCBidWZmZXIKKwkgKiAtIE5vdGUgdGhhdCB0aGVyZSBjYW4gYmUgYSAyIGJ5dGUgcGFkIGJldHdlZW4gaGVhYWRlciBhbmQgZW5jIGhlYWRlcgorCSAqLworCisJcHJldl9idWYgPSBtcGR1X2J1ZjsKKwlkZXN0ID0gY2RmX25idWZfcHV0X3RhaWwocHJldl9idWYsIHdpZmlfaGRyX2xlbik7CisJaWYgKCFkZXN0KQorCQlnb3RvIG1wZHVfc3RpdGNoX2ZhaWw7CisJY2RmX21lbV9jb3B5KGRlc3QsIGhkcl9kZXNjLCB3aWZpX2hkcl9sZW4pOworCWhkcl9kZXNjICs9IHdpZmlfaGRyX2xlbjsKKworCS8qIE5PVEUgLSBUaGlzIHBhZGRpbmcgaXMgcHJlc2VudCBvbmx5IGluIHRoZSBSQVcgaGVhZGVyIHN0YXR1cyAtIG5vdAorCSAqIHdoZW4gdGhlIE1TRFUgZGF0YSBwYXlsb2FkIGlzIGluIFJBVyBmb3JtYXQuCisJICovCisJLyogU2tpcCB0aGUgIklWIHBhZCIgKi8KKwlpZiAod2lmaV9oZHJfbGVuICYgMHgzKQorCQloZHJfZGVzYyArPSAyOworCisJLyogVGhlIGZpcnN0IExMQyBsZW4gaXMgY29waWVkIGludG8gdGhlIE1QRFUgYnVmZmVyICovCisJZnJhZ19saXN0X3N1bV9sZW4gPSAwOworCWZyYWdfbGlzdF9zdW1fbGVuIC09IG1zZHVfbGxjX2xlbjsKKworCW1zZHVfb3JpZyA9IGhlYWRfbXNkdTsKKwlpc19maXJzdF9mcmFnID0gMTsKKwlhbXNkdV9wYWQgPSAwOworCisJd2hpbGUgKG1zZHVfb3JpZykgeworCisJCS8qIFRPRE86IGludHJhIEFNU0RVIHBhZGRpbmcgLSBkbyB3ZSBuZWVkIGl0ID8/PyAqLworCisJCW1zZHUgPSBjbG9uZV9uYnVmX2ZuKG1zZHVfb3JpZyk7CisJCWlmICghbXNkdSkKKwkJCWdvdG8gbXBkdV9zdGl0Y2hfZmFpbDsKKworCQlpZiAoaXNfZmlyc3RfZnJhZykgeworCQkJaXNfZmlyc3RfZnJhZyA9IDA7CisJCQloZWFkX2ZyYWdfbGlzdF9jbG9uZWQgPSBtc2R1OworCQl9IGVsc2UgeworCisJCQkvKiBNYWludGFpbiB0aGUgbGlua2luZyBvZiB0aGUgY2xvbmVkIE1TRFVTICovCisJCQljZGZfbmJ1Zl9zZXRfbmV4dF9leHQocHJldl9idWYsIG1zZHUpOworCisJCQkvKiBSZWxvYWQgdGhlIGhkciBwdHIgb25seSBvbiBub24tZmlyc3QgTVNEVXMgKi8KKwkJCXJ4X2Rlc2MgPSBodHRfcnhfZGVzYyhtc2R1X29yaWcpOworCQkJaGRyX2Rlc2MgPSAmcnhfZGVzYy0+cnhfaGRyX3N0YXR1c1swXTsKKworCQl9CisKKwkJLyogQ29weSB0aGlzIGJ1ZmZlcnMgTVNEVSByZWxhdGVkIHN0YXR1cyBpbnRvIHRoZSBwcmV2IGJ1ZmZlciAqLworCQlkZXN0ID0gY2RmX25idWZfcHV0X3RhaWwocHJldl9idWYsIG1zZHVfbGxjX2xlbiArIGFtc2R1X3BhZCk7CisJCWRlc3QgKz0gYW1zZHVfcGFkOworCQljZGZfbWVtX2NvcHkoZGVzdCwgaGRyX2Rlc2MsIG1zZHVfbGxjX2xlbik7CisKKwkJLyogUHVzaCB0aGUgTVNEVSBidWZmZXIgYmV5b25kIHRoZSBkZWNhcCBoZWFkZXIgKi8KKwkJY2RmX25idWZfcHVsbF9oZWFkKG1zZHUsIGRlY2FwX2hkcl9wdWxsX2J5dGVzKTsKKwkJZnJhZ19saXN0X3N1bV9sZW4gKz0KKwkJCW1zZHVfbGxjX2xlbiArIGNkZl9uYnVmX2xlbihtc2R1KSArIGFtc2R1X3BhZDsKKworCQkvKiBTZXQgdXAgaW50cmEtQU1TRFUgcGFkIHRvIGJlIGFkZGVkIHRvIHN0YXJ0IG9mIG5leHQgYnVmZmVyIC0KKwkJICogQU1TRFUgcGFkIGlzIDQgYnl0ZSBwYWQgb24gQU1TRFUgc3ViZnJhbWUgKi8KKwkJYW1zZHVfcGFkID0gKG1zZHVfbGxjX2xlbiArIGNkZl9uYnVmX2xlbihtc2R1KSkgJiAweDM7CisJCWFtc2R1X3BhZCA9IGFtc2R1X3BhZCA/ICg0IC0gYW1zZHVfcGFkKSA6IDA7CisKKwkJLyogVE9ETyBGSVhNRSBIb3cgZG8gd2UgaGFuZGxlIE1TRFVzIHRoYXQgaGF2ZSBmcmFnbGlzdCAtIFNob3VsZAorCQkgKiBwcm9iYWJseSBpdGVyYXRlIGFsbCB0aGUgZnJhZ3MgY2xvbmluZyB0aGVtIGFsb25nIHRoZSB3YXkgYW5kCisJCSAqIGFuZCBhbHNvIHVwZGF0aW5nIHRoZSBwcmV2X2J1ZiBwb2ludGVyCisJCSAqLworCisJCS8qIE1vdmUgdG8gdGhlIG5leHQgKi8KKwkJcHJldl9idWYgPSBtc2R1OworCQltc2R1X29yaWcgPSBjZGZfbmJ1Zl9uZXh0KG1zZHVfb3JpZyk7CisKKwl9CisKKwkvKiBUT0RPOiBDb252ZXJ0IHRoaXMgdG8gc3VpdGFibGUgY2RmIHJvdXRpbmVzICovCisJY2RmX25idWZfYXBwZW5kX2V4dF9saXN0KG1wZHVfYnVmLCBoZWFkX2ZyYWdfbGlzdF9jbG9uZWQsCisJCQkJIGZyYWdfbGlzdF9zdW1fbGVuKTsKKworbXBkdV9zdGl0Y2hfZG9uZToKKwkvKiBDaGVjayBpZiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgUFBEVSBlbmQgc3RhdHVzIGZvciBUU0YgKi8KKwlpZiAocnhfZGVzYy0+YXR0ZW50aW9uLmxhc3RfbXBkdSkKKyNpZmRlZiBIRUxJVU1QTFVTCisJCXJ4X3N0YXR1cy0+cnNfdHN0YW1wLnRzZiA9CisJCQlyeF9kZXNjLT5wcGR1X2VuZC5yeF9wa3RfZW5kLnBoeV90aW1lc3RhbXBfMV9sb3dlcl8zMjsKKyNlbHNlCisJCXJ4X3N0YXR1cy0+cnNfdHN0YW1wLnRzZiA9IHJ4X2Rlc2MtPnBwZHVfZW5kLnRzZl90aW1lc3RhbXA7CisjZW5kaWYKKwkvKiBBbGwgdGhlIG5idWZzIGhhdmUgYmVlbiBsaW5rZWQgaW50byB0aGUgZXh0IGxpc3QgYW5kCisJICAgdGhlbiB1bmxpbmsgdGhlIG5idWYgbGlzdCAqLworCWlmIChjbG9uZV9ub3RfcmVxZCkgeworCQltc2R1ID0gaGVhZF9tc2R1OworCQl3aGlsZSAobXNkdSkgeworCQkJbXNkdV9vcmlnID0gbXNkdTsKKwkJCW1zZHUgPSBjZGZfbmJ1Zl9uZXh0KG1zZHUpOworCQkJY2RmX25idWZfc2V0X25leHQobXNkdV9vcmlnLCBOVUxMKTsKKwkJfQorCX0KKworCXJldHVybiBtcGR1X2J1ZjsKKworbXBkdV9zdGl0Y2hfZmFpbDoKKwkvKiBGcmVlIHRoZXNlIGFsbG9jZWQgYnVmZmVycyBhbmQgdGhlIG9yaWcgYnVmZmVycyBpbiBub24tY2xvbmUgY2FzZSAqLworCWlmICghY2xvbmVfbm90X3JlcWQpIHsKKwkJLyogRnJlZSB0aGUgaGVhZCBidWZmZXIgKi8KKwkJaWYgKG1wZHVfYnVmKQorCQkJY2RmX25idWZfZnJlZShtcGR1X2J1Zik7CisKKwkJLyogRnJlZSB0aGUgcGFydGlhbCBsaXN0ICovCisJCXdoaWxlIChoZWFkX2ZyYWdfbGlzdF9jbG9uZWQpIHsKKwkJCW1zZHUgPSBoZWFkX2ZyYWdfbGlzdF9jbG9uZWQ7CisJCQloZWFkX2ZyYWdfbGlzdF9jbG9uZWQgPQorCQkJCWNkZl9uYnVmX25leHRfZXh0KGhlYWRfZnJhZ19saXN0X2Nsb25lZCk7CisJCQljZGZfbmJ1Zl9mcmVlKG1zZHUpOworCQl9CisJfSBlbHNlIHsKKwkJLyogRnJlZSB0aGUgYWxsb2NlZCBoZWFkIGJ1ZmZlciAqLworCQlpZiAoZGVjYXBfZm9ybWF0ICE9IEhXX1JYX0RFQ0FQX0ZPUk1BVF9SQVcpCisJCQlpZiAobXBkdV9idWYpCisJCQkJY2RmX25idWZfZnJlZShtcGR1X2J1Zik7CisKKwkJLyogRnJlZSB0aGUgb3JpZyBidWZmZXJzICovCisJCW1zZHUgPSBoZWFkX21zZHU7CisJCXdoaWxlIChtc2R1KSB7CisJCQltc2R1X29yaWcgPSBtc2R1OworCQkJbXNkdSA9IGNkZl9uYnVmX25leHQobXNkdSk7CisJCQljZGZfbmJ1Zl9mcmVlKG1zZHVfb3JpZyk7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50MTZfdCBodHRfcnhfbXBkdV9kZXNjX3Jzc2lfZGJtKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptcGR1X2Rlc2MpCit7CisJLyoKKwkgKiBDdXJyZW50bHkgdGhlIFJTU0kgaXMgcHJvdmlkZWQgb25seSBhcyBhIGZpZWxkIGluIHRoZQorCSAqIEhUVF9UMkhfUlhfSU5EIG1lc3NhZ2UsIHJhdGhlciB0aGFuIGluIGVhY2ggcnggZGVzY3JpcHRvci4KKwkgKi8KKwlyZXR1cm4gSFRUX1JTU0lfSU5WQUxJRDsKK30KKworLyoKKyAqIGh0dF9yeF9hbXNkdV9wb3AgLQorICogZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBpcyBwcm9ncmFtbWVkIGR1cmluZyBhdHRhY2ggdG8gcG9pbnQKKyAqIHRvIGVpdGhlciBodHRfcnhfYW1zZHVfcG9wX2xsIG9yIGh0dF9yeF9hbXNkdV9yeF9pbl9vcmRlcl9wb3BfbGwuCisgKi8KK2ludCAoKmh0dF9yeF9hbXNkdV9wb3ApKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJY2RmX25idWZfdCByeF9pbmRfbXNnLAorCQkJY2RmX25idWZfdCAqaGVhZF9tc2R1LCBjZGZfbmJ1Zl90ICp0YWlsX21zZHUpOworCisvKgorICogaHR0X3J4X2ZyYWdfcG9wIC0KKyAqIGdsb2JhbCBmdW5jdGlvbiBwb2ludGVyIHRoYXQgaXMgcHJvZ3JhbW1lZCBkdXJpbmcgYXR0YWNoIHRvIHBvaW50CisgKiB0byBlaXRoZXIgaHR0X3J4X2Ftc2R1X3BvcF9sbAorICovCitpbnQgKCpodHRfcnhfZnJhZ19wb3ApKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgICAgY2RmX25idWZfdCByeF9pbmRfbXNnLAorCQkgICAgICAgY2RmX25idWZfdCAqaGVhZF9tc2R1LCBjZGZfbmJ1Zl90ICp0YWlsX21zZHUpOworCitpbnQKKygqaHR0X3J4X29mZmxvYWRfbXNkdV9wb3ApKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJICAgY2RmX25idWZfdCBvZmZsb2FkX2RlbGl2ZXJfbXNnLAorCQkJICAgaW50ICp2ZGV2X2lkLAorCQkJICAgaW50ICpwZWVyX2lkLAorCQkJICAgaW50ICp0aWQsCisJCQkgICB1aW50OF90ICpmd19kZXNjLAorCQkJICAgY2RmX25idWZfdCAqaGVhZF9idWYsIGNkZl9uYnVmX3QgKnRhaWxfYnVmKTsKKwordm9pZCAqICgqaHR0X3J4X21wZHVfZGVzY19saXN0X25leHQpKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSAgICBjZGZfbmJ1Zl90IHJ4X2luZF9tc2cpOworCitib29sICgqaHR0X3J4X21wZHVfZGVzY19yZXRyeSkoCisgICAgaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1wZHVfZGVzYyk7CisKK3VpbnQxNl90ICgqaHR0X3J4X21wZHVfZGVzY19zZXFfbnVtKShodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXBkdV9kZXNjKTsKKwordm9pZCAoKmh0dF9yeF9tcGR1X2Rlc2NfcG4pKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJICAgIHZvaWQgKm1wZHVfZGVzYywKKwkJCSAgICB1bmlvbiBodHRfcnhfcG5fdCAqcG4sIGludCBwbl9sZW5fYml0cyk7CisKK3VpbnQ4X3QgKCpodHRfcnhfbXBkdV9kZXNjX3RpZCkoCisgICAgaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1wZHVfZGVzYyk7CisKK2Jvb2wgKCpodHRfcnhfbXNkdV9kZXNjX2NvbXBsZXRlc19tcGR1KShodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXNkdV9kZXNjKTsKKworYm9vbCAoKmh0dF9yeF9tc2R1X2ZpcnN0X21zZHVfZmxhZykoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1zZHVfZGVzYyk7CisKK2ludCAoKmh0dF9yeF9tc2R1X2hhc193bGFuX21jYXN0X2ZsYWcpKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptc2R1X2Rlc2MpOworCitib29sICgqaHR0X3J4X21zZHVfaXNfd2xhbl9tY2FzdCkoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1zZHVfZGVzYyk7CisKK2ludCAoKmh0dF9yeF9tc2R1X2lzX2ZyYWcpKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptc2R1X2Rlc2MpOworCit2b2lkICogKCpodHRfcnhfbXNkdV9kZXNjX3JldHJpZXZlKShodHRfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCBtc2R1KTsKKworYm9vbCAoKmh0dF9yeF9tcGR1X2lzX2VuY3J5cHRlZCkoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1wZHVfZGVzYyk7CisKK2Jvb2wgKCpodHRfcnhfbXNkdV9kZXNjX2tleV9pZCkoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkJdm9pZCAqbXBkdV9kZXNjLCB1aW50OF90ICprZXlfaWQpOworCit2b2lkICpodHRfcnhfbXBkdV9kZXNjX2xpc3RfbmV4dF9sbChodHRfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCByeF9pbmRfbXNnKQoreworCWludCBpZHggPSBwZGV2LT5yeF9yaW5nLnN3X3JkX2lkeC5tc2R1X2Rlc2M7CisJY2RmX25idWZfdCBuZXRidWYgPSBwZGV2LT5yeF9yaW5nLmJ1Zi5uZXRidWZzX3JpbmdbaWR4XTsKKwlwZGV2LT5yeF9yaW5nLnN3X3JkX2lkeC5tc2R1X2Rlc2MgPSBwZGV2LT5yeF9yaW5nLnN3X3JkX2lkeC5tc2R1X3BheWxkOworCXJldHVybiAodm9pZCAqKWh0dF9yeF9kZXNjKG5ldGJ1Zik7Cit9CisKK2Jvb2wgKCpodHRfcnhfbXNkdV9jaGFuX2luZm9fcHJlc2VudCkoCisJaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJdm9pZCAqbXBkdV9kZXNjKTsKKworYm9vbCAoKmh0dF9yeF9tc2R1X2NlbnRlcl9mcmVxKSgKKwlodHRfcGRldl9oYW5kbGUgcGRldiwKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJdm9pZCAqbXBkdV9kZXNjLAorCXVpbnQxNl90ICpwcmltYXJ5X2NoYW5fY2VudGVyX2ZyZXFfbWh6LAorCXVpbnQxNl90ICpjb250aWdfY2hhbjFfY2VudGVyX2ZyZXFfbWh6LAorCXVpbnQxNl90ICpjb250aWdfY2hhbjJfY2VudGVyX2ZyZXFfbWh6LAorCXVpbnQ4X3QgKnBoeV9tb2RlKTsKKwordm9pZCAqaHR0X3J4X2luX29yZF9tcGR1X2Rlc2NfbGlzdF9uZXh0X2xsKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCQkgICBjZGZfbmJ1Zl90IG5ldGJ1ZikKK3sKKwlyZXR1cm4gKHZvaWQgKilodHRfcnhfZGVzYyhuZXRidWYpOworfQorCit2b2lkICpodHRfcnhfbXNkdV9kZXNjX3JldHJpZXZlX2xsKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IG1zZHUpCit7CisJcmV0dXJuIGh0dF9yeF9kZXNjKG1zZHUpOworfQorCitib29sIGh0dF9yeF9tcGR1X2lzX2VuY3J5cHRlZF9sbChodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXBkdV9kZXNjKQoreworCXN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKnJ4X2Rlc2MgPQorCQkoc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqKW1wZHVfZGVzYzsKKworCXJldHVybiAoKCgqKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXBkdV9zdGFydCkpICYKKwkJIFJYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTUFTSykgPj4KKwkJUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9MU0IpID8gdHJ1ZSA6IGZhbHNlOworfQorCitib29sIGh0dF9yeF9tc2R1X2NoYW5faW5mb19wcmVzZW50X2xsKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptcGR1X2Rlc2MpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitib29sIGh0dF9yeF9tc2R1X2NlbnRlcl9mcmVxX2xsKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwl2b2lkICptcGR1X2Rlc2MsCisJdWludDE2X3QgKnByaW1hcnlfY2hhbl9jZW50ZXJfZnJlcV9taHosCisJdWludDE2X3QgKmNvbnRpZ19jaGFuMV9jZW50ZXJfZnJlcV9taHosCisJdWludDE2X3QgKmNvbnRpZ19jaGFuMl9jZW50ZXJfZnJlcV9taHosCisJdWludDhfdCAqcGh5X21vZGUpCit7CisJaWYgKHByaW1hcnlfY2hhbl9jZW50ZXJfZnJlcV9taHopCisJCSpwcmltYXJ5X2NoYW5fY2VudGVyX2ZyZXFfbWh6ID0gMDsKKwlpZiAoY29udGlnX2NoYW4xX2NlbnRlcl9mcmVxX21oeikKKwkJKmNvbnRpZ19jaGFuMV9jZW50ZXJfZnJlcV9taHogPSAwOworCWlmIChjb250aWdfY2hhbjJfY2VudGVyX2ZyZXFfbWh6KQorCQkqY29udGlnX2NoYW4yX2NlbnRlcl9mcmVxX21oeiA9IDA7CisJaWYgKHBoeV9tb2RlKQorCQkqcGh5X21vZGUgPSAwOworCXJldHVybiBmYWxzZTsKK30KKworYm9vbAoraHR0X3J4X21zZHVfZGVzY19rZXlfaWRfbGwoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1wZHVfZGVzYywKKwkJCSAgIHVpbnQ4X3QgKmtleV9pZCkKK3sKKwlzdHJ1Y3QgaHR0X2hvc3RfcnhfZGVzY19iYXNlICpyeF9kZXNjID0gKHN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKikKKwkJCQkJCW1wZHVfZGVzYzsKKworCWlmICghaHR0X3J4X21zZHVfZmlyc3RfbXNkdV9mbGFnX2xsKHBkZXYsIG1wZHVfZGVzYykpCisJCXJldHVybiBmYWxzZTsKKworCSprZXlfaWQgPSAoKCooKCh1aW50MzJfdCAqKSAmcnhfZGVzYy0+bXNkdV9lbmQpICsgMSkpICYKKwkJICAgKFJYX01TRFVfRU5EXzFfS0VZX0lEX09DVF9NQVNLID4+CisJCSAgICBSWF9NU0RVX0VORF8xX0tFWV9JRF9PQ1RfTFNCKSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBodHRfcnhfZGVzY19mcmFtZV9mcmVlKGh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiwgY2RmX25idWZfdCBtc2R1KQoreworCWNkZl9uYnVmX2ZyZWUobXNkdSk7Cit9CisKK3ZvaWQgaHR0X3J4X21zZHVfZGVzY19mcmVlKGh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiwgY2RmX25idWZfdCBtc2R1KQoreworCS8qCisJICogVGhlIHJ4IGRlc2NyaXB0b3IgaXMgaW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSByeCBNU0RVIHBheWxvYWQsCisJICogYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgZnJlZWQgc2VwYXJhdGVseS4KKwkgKi8KK30KKwordm9pZCBodHRfcnhfbXNkdV9idWZmX3JlcGxlbmlzaChodHRfcGRldl9oYW5kbGUgcGRldikKK3sKKwlpZiAoY2RmX2F0b21pY19kZWNfYW5kX3Rlc3QoJnBkZXYtPnJ4X3JpbmcucmVmaWxsX3JlZl9jbnQpKSB7CisJCWludCBudW1fdG9fZmlsbDsKKwkJbnVtX3RvX2ZpbGwgPSBwZGV2LT5yeF9yaW5nLmZpbGxfbGV2ZWwgLQorCQkJcGRldi0+cnhfcmluZy5maWxsX2NudDsKKworCQlodHRfcnhfcmluZ19maWxsX24ocGRldiwKKwkJCQkgICBudW1fdG9fZmlsbCAvKiBva2F5IGlmIDw9IDAgKi8pOworCX0KKwljZGZfYXRvbWljX2luYygmcGRldi0+cnhfcmluZy5yZWZpbGxfcmVmX2NudCk7Cit9CisKKyNkZWZpbmUgQVI2MDBQX0FTU0VNQkxFX0hXX1JBVEVDT0RFKF9yYXRlLCBfbnNzLCBfcHJlYW0pICAgICBcCisJKCgoX3ByZWFtKSA8PCA2KSB8ICgoX25zcykgPDwgNCkgfCAoX3JhdGUpKQorCitlbnVtIEFSNjAwUF9IV19SQVRFQ09ERV9QUkVBTV9UWVBFIHsKKwlBUjYwMFBfSFdfUkFURUNPREVfUFJFQU1fT0ZETSwKKwlBUjYwMFBfSFdfUkFURUNPREVfUFJFQU1fQ0NLLAorCUFSNjAwUF9IV19SQVRFQ09ERV9QUkVBTV9IVCwKKwlBUjYwMFBfSFdfUkFURUNPREVfUFJFQU1fVkhULAorfTsKKworLyotLS0gUlggSW4gT3JkZXIgSGFzaCBDb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSW5pdGlhbGl6ZXMgdGhlIGNpcmN1bGFyIGxpbmtlZCBsaXN0ICovCitzdGF0aWMgaW5saW5lIHZvaWQgaHR0X2xpc3RfaW5pdChzdHJ1Y3QgaHR0X2xpc3Rfbm9kZSAqaGVhZCkKK3sKKwloZWFkLT5wcmV2ID0gaGVhZDsKKwloZWFkLT5uZXh0ID0gaGVhZDsKK30KKworLyogQWRkcyBlbnRyeSB0byB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdCAqLworc3RhdGljIGlubGluZSB2b2lkIGh0dF9saXN0X2FkZF90YWlsKHN0cnVjdCBodHRfbGlzdF9ub2RlICpoZWFkLAorCQkJCSAgICAgc3RydWN0IGh0dF9saXN0X25vZGUgKm5vZGUpCit7CisJaGVhZC0+cHJldi0+bmV4dCA9IG5vZGU7CisJbm9kZS0+cHJldiA9IGhlYWQtPnByZXY7CisJbm9kZS0+bmV4dCA9IGhlYWQ7CisJaGVhZC0+cHJldiA9IG5vZGU7Cit9CisKKy8qIFJlbW92ZXMgdGhlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IG5vZGUgZnJvbSB0aGUgbGlua2VkIGxpc3QgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBodHRfbGlzdF9yZW1vdmUoc3RydWN0IGh0dF9saXN0X25vZGUgKm5vZGUpCit7CisJbm9kZS0+cHJldi0+bmV4dCA9IG5vZGUtPm5leHQ7CisJbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7Cit9CisKKy8qIEhlbHBlciBtYWNybyB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGxpbmtlZCBsaXN0ICovCisjZGVmaW5lIEhUVF9MSVNUX0lURVJfRldEKGl0ZXIsIGhlYWQpIGZvciAoaXRlciA9IChoZWFkKS0+bmV4dDsJCVwKKwkJCQkJICAgKGl0ZXIpICE9IChoZWFkKTsJCVwKKwkJCQkJICAgKGl0ZXIpID0gKGl0ZXIpLT5uZXh0KQlcCisKKyNpZmRlZiBSWF9IQVNIX0RFQlVHCisvKiBIYXNoIGNvb2tpZSByZWxhdGVkIG1hY3JvcyAqLworI2RlZmluZSBIVFRfUlhfSEFTSF9DT09LSUUgMHhERUVECisKKyNkZWZpbmUgSFRUX1JYX0hBU0hfQ09PS0lFX1NFVChoYXNoX2VsZW1lbnQpIFwKKwkoKGhhc2hfZWxlbWVudCktPmNvb2tpZSA9IEhUVF9SWF9IQVNIX0NPT0tJRSkKKworI2RlZmluZSBIVFRfUlhfSEFTSF9DT09LSUVfQ0hFQ0soaGFzaF9lbGVtZW50KSBcCisJSFRUX0FTU0VSVF9BTFdBWVMoKGhhc2hfZWxlbWVudCktPmNvb2tpZSA9PSBIVFRfUlhfSEFTSF9DT09LSUUpCisKKy8qIEhhc2ggY291bnQgcmVsYXRlZCBtYWNyb3MgKi8KKyNkZWZpbmUgSFRUX1JYX0hBU0hfQ09VTlRfSU5DUihoYXNoX2J1Y2tldCkgXAorCSgoaGFzaF9idWNrZXQpLmNvdW50KyspCisKKyNkZWZpbmUgSFRUX1JYX0hBU0hfQ09VTlRfREVDUihoYXNoX2J1Y2tldCkgXAorCSgoaGFzaF9idWNrZXQpLmNvdW50LS0pCisKKyNkZWZpbmUgSFRUX1JYX0hBU0hfQ09VTlRfUkVTRVQoaGFzaF9idWNrZXQpICgoaGFzaF9idWNrZXQpLmNvdW50ID0gMCkKKworI2RlZmluZSBIVFRfUlhfSEFTSF9DT1VOVF9QUklOVChoYXNoX2J1Y2tldCkgXAorCVJYX0hBU0hfTE9HKGNkZl9wcmludCgiIGNvdW50ICVkXG4iLCAoaGFzaF9idWNrZXQpLmNvdW50KSkKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUlhfSEFTSF9ERUJVRyAqLworLyogSGFzaCBjb29raWUgcmVsYXRlZCBtYWNyb3MgKi8KKyNkZWZpbmUgSFRUX1JYX0hBU0hfQ09PS0lFX1NFVChoYXNoX2VsZW1lbnQpICAgIC8qIG5vLW9wICovCisjZGVmaW5lIEhUVF9SWF9IQVNIX0NPT0tJRV9DSEVDSyhoYXNoX2VsZW1lbnQpICAvKiBuby1vcCAqLworLyogSGFzaCBjb3VudCByZWxhdGVkIG1hY3JvcyAqLworI2RlZmluZSBIVFRfUlhfSEFTSF9DT1VOVF9JTkNSKGhhc2hfYnVja2V0KSAgICAgLyogbm8tb3AgKi8KKyNkZWZpbmUgSFRUX1JYX0hBU0hfQ09VTlRfREVDUihoYXNoX2J1Y2tldCkgICAgIC8qIG5vLW9wICovCisjZGVmaW5lIEhUVF9SWF9IQVNIX0NPVU5UX1BSSU5UKGhhc2hfYnVja2V0KSAgICAvKiBuby1vcCAqLworI2RlZmluZSBIVFRfUlhfSEFTSF9DT1VOVF9SRVNFVChoYXNoX2J1Y2tldCkgICAgLyogbm8tb3AgKi8KKyNlbmRpZiAvKiBSWF9IQVNIX0RFQlVHICovCisKKy8qIEluc2VydHMgdGhlIGdpdmVuICJwaHlzaWNhbCBhZGRyZXNzIC0gbmV0d29yayBidWZmZXIiIHBhaXIgaW50byB0aGUKKyAgIGhhc2ggdGFibGUgZm9yIHRoZSBnaXZlbiBwZGV2LiBUaGlzIGZ1bmN0aW9uIHdpbGwgZG8gdGhlIGZvbGxvd2luZzoKKyAgIDEuIERldGVybWluZSB3aGljaCBidWNrZXQgdG8gaW5zZXJ0IHRoZSBwYWlyIGludG8KKyAgIDIuIEZpcnN0IHRyeSB0byBhbGxvY2F0ZSB0aGUgaGFzaCBlbnRyeSBmb3IgdGhpcyBwYWlyIGZyb20gdGhlIHByZS1hbGxvY2F0ZWQKKyAgICAgIGVudHJpZXMgbGlzdAorICAgMy4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcyBpbiB0aGUgcHJlLWFsbG9jYXRlZCBlbnRyaWVzIGxpc3QsIGFsbG9jYXRlCisgICAgICB0aGUgaGFzaCBlbnRyeSBmcm9tIHRoZSBoYXNoIG1lbW9yeSBwb29sCisgICBOb3RlOiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQtc2FmZQorICAgUmV0dXJucyAwIC0gc3VjY2VzcywgMSAtIGZhaWx1cmUgKi8KK2ludAoraHR0X3J4X2hhc2hfbGlzdF9pbnNlcnQoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsIHVpbnQzMl90IHBhZGRyLAorCQkJY2RmX25idWZfdCBuZXRidWYpCit7CisJaW50IGk7CisJc3RydWN0IGh0dF9yeF9oYXNoX2VudHJ5ICpoYXNoX2VsZW1lbnQgPSBOVUxMOworCisJaSA9IFJYX0hBU0hfRlVOQ1RJT04ocGFkZHIpOworCisJLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBlbnRyaWVzIGluIHRoZSBwcmUtYWxsb2NhdGVkIGZyZWUgbGlzdCAqLworCWlmIChwZGV2LT5yeF9yaW5nLmhhc2hfdGFibGVbaV0uZnJlZXBvb2wubmV4dCAhPQorCSAgICAmcGRldi0+cnhfcmluZy5oYXNoX3RhYmxlW2ldLmZyZWVwb29sKSB7CisKKwkJaGFzaF9lbGVtZW50ID0KKwkJCShzdHJ1Y3QgaHR0X3J4X2hhc2hfZW50cnkgKikoCisJCQkJKGNoYXIgKikKKwkJCQlwZGV2LT5yeF9yaW5nLmhhc2hfdGFibGVbaV0uZnJlZXBvb2wubmV4dCAtCisJCQkJcGRldi0+cnhfcmluZy5saXN0bm9kZV9vZmZzZXQpOworCQlpZiAoY2RmX3VubGlrZWx5KE5VTEwgPT0gaGFzaF9lbGVtZW50KSkgeworCQkJSFRUX0FTU0VSVF9BTFdBWVMoMCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWh0dF9saXN0X3JlbW92ZShwZGV2LT5yeF9yaW5nLmhhc2hfdGFibGVbaV0uZnJlZXBvb2wubmV4dCk7CisJfSBlbHNlIHsKKwkJaGFzaF9lbGVtZW50ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBodHRfcnhfaGFzaF9lbnRyeSkpOworCQlpZiAoY2RmX3VubGlrZWx5KE5VTEwgPT0gaGFzaF9lbGVtZW50KSkgeworCQkJSFRUX0FTU0VSVF9BTFdBWVMoMCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQloYXNoX2VsZW1lbnQtPmZyb21saXN0ID0gMDsKKwl9CisKKwloYXNoX2VsZW1lbnQtPm5ldGJ1ZiA9IG5ldGJ1ZjsKKwloYXNoX2VsZW1lbnQtPnBhZGRyID0gcGFkZHI7CisJSFRUX1JYX0hBU0hfQ09PS0lFX1NFVChoYXNoX2VsZW1lbnQpOworCisJaHR0X2xpc3RfYWRkX3RhaWwoJnBkZXYtPnJ4X3JpbmcuaGFzaF90YWJsZVtpXS5saXN0aGVhZCwKKwkJCSAgJmhhc2hfZWxlbWVudC0+bGlzdG5vZGUpOworCisJUlhfSEFTSF9MT0coY2RmX3ByaW50KCJyeCBoYXNoOiAlczogcGFkZHIgMHgleCBuZXRidWYgJXAgYnVja2V0ICVkXG4iLAorCQkJICAgICAgX19mdW5jX18sIHBhZGRyLCBuZXRidWYsIChpbnQpaSkpOworCisJSFRUX1JYX0hBU0hfQ09VTlRfSU5DUihwZGV2LT5yeF9yaW5nLmhhc2hfdGFibGVbaV0pOworCUhUVF9SWF9IQVNIX0NPVU5UX1BSSU5UKHBkZXYtPnJ4X3JpbmcuaGFzaF90YWJsZVtpXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2l2ZW4gYSBwaHlzaWNhbCBhZGRyZXNzIHRoaXMgZnVuY3Rpb24gd2lsbCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIG5ldHdvcmsKKyAgIGJ1ZmZlciBmcm9tIHRoZSBoYXNoIHRhYmxlLgorICAgTm90ZTogdGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkLXNhZmUgKi8KK2NkZl9uYnVmX3QgaHR0X3J4X2hhc2hfbGlzdF9sb29rdXAoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsIHVpbnQzMl90IHBhZGRyKQoreworCXVpbnQzMl90IGk7CisJc3RydWN0IGh0dF9saXN0X25vZGUgKmxpc3RfaXRlciA9IE5VTEw7CisJY2RmX25idWZfdCBuZXRidWYgPSBOVUxMOworCXN0cnVjdCBodHRfcnhfaGFzaF9lbnRyeSAqaGFzaF9lbnRyeTsKKworCWkgPSBSWF9IQVNIX0ZVTkNUSU9OKHBhZGRyKTsKKworCUhUVF9MSVNUX0lURVJfRldEKGxpc3RfaXRlciwgJnBkZXYtPnJ4X3JpbmcuaGFzaF90YWJsZVtpXS5saXN0aGVhZCkgeworCQloYXNoX2VudHJ5ID0gKHN0cnVjdCBodHRfcnhfaGFzaF9lbnRyeSAqKQorCQkJICAgICAoKGNoYXIgKilsaXN0X2l0ZXIgLQorCQkJICAgICAgcGRldi0+cnhfcmluZy5saXN0bm9kZV9vZmZzZXQpOworCisJCUhUVF9SWF9IQVNIX0NPT0tJRV9DSEVDSyhoYXNoX2VudHJ5KTsKKworCQlpZiAoaGFzaF9lbnRyeS0+cGFkZHIgPT0gcGFkZHIpIHsKKwkJCS8qIEZvdW5kIHRoZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHBhZGRyICovCisJCQluZXRidWYgPSBoYXNoX2VudHJ5LT5uZXRidWY7CisJCQlodHRfbGlzdF9yZW1vdmUoJmhhc2hfZW50cnktPmxpc3Rub2RlKTsKKwkJCUhUVF9SWF9IQVNIX0NPVU5UX0RFQ1IocGRldi0+cnhfcmluZy5oYXNoX3RhYmxlW2ldKTsKKwkJCS8qIGlmIHRoZSByeCBlbnRyeSBpcyBmcm9tIHRoZSBwcmUtYWxsb2NhdGVkIGxpc3QsCisJCQkgICByZXR1cm4gaXQgKi8KKwkJCWlmIChoYXNoX2VudHJ5LT5mcm9tbGlzdCkKKwkJCQlodHRfbGlzdF9hZGRfdGFpbCgmcGRldi0+cnhfcmluZy5oYXNoX3RhYmxlW2ldLgorCQkJCQkJICBmcmVlcG9vbCwKKwkJCQkJCSAgJmhhc2hfZW50cnktPmxpc3Rub2RlKTsKKwkJCWVsc2UKKwkJCQljZGZfbWVtX2ZyZWUoaGFzaF9lbnRyeSk7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJUlhfSEFTSF9MT0coY2RmX3ByaW50KCJyeCBoYXNoOiAlczogcGFkZHIgMHgleCwgbmV0YnVmICVwLCBidWNrZXQgJWRcbiIsCisJCQkgICAgICBfX2Z1bmNfXywgcGFkZHIsIG5ldGJ1ZiwgKGludClpKSk7CisJSFRUX1JYX0hBU0hfQ09VTlRfUFJJTlQocGRldi0+cnhfcmluZy5oYXNoX3RhYmxlW2ldKTsKKworCWlmIChuZXRidWYgPT0gTlVMTCkgeworCQljZGZfcHJpbnQoInJ4IGhhc2g6ICVzOiBubyBlbnRyeSBmb3VuZCBmb3IgMHgleCEhIVxuIiwKKwkJCSAgX19mdW5jX18sIHBhZGRyKTsKKwkJSFRUX0FTU0VSVF9BTFdBWVMoMCk7CisJfQorCisJcmV0dXJuIG5ldGJ1ZjsKK30KKworLyogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gb2YgdGhlIHJ4IGJ1ZmZlciBoYXNoIHRhYmxlLiBUaGlzIGZ1bmN0aW9uIHdpbGwKKyAgIGFsbG9jYXRlIGEgaGFzaCB0YWJsZSBvZiBhIGNlcnRhaW4gcHJlLWRldGVybWluZWQgc2l6ZSBhbmQgaW5pdGlhbGl6ZSBhbGwKKyAgIHRoZSBlbGVtZW50cyAqLworaW50IGh0dF9yeF9oYXNoX2luaXQoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJaW50IGksIGo7CisKKwlIVFRfQVNTRVJUMihJU19QV1IyKFJYX05VTV9IQVNIX0JVQ0tFVFMpKTsKKworCXBkZXYtPnJ4X3JpbmcuaGFzaF90YWJsZSA9CisJCWNkZl9tZW1fbWFsbG9jKFJYX05VTV9IQVNIX0JVQ0tFVFMgKgorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaHR0X3J4X2hhc2hfYnVja2V0KSk7CisKKwlpZiAoTlVMTCA9PSBwZGV2LT5yeF9yaW5nLmhhc2hfdGFibGUpIHsKKwkJY2RmX3ByaW50KCJyeCBoYXNoIHRhYmxlIGFsbG9jYXRpb24gZmFpbGVkIVxuIik7CisJCXJldHVybiAxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBSWF9OVU1fSEFTSF9CVUNLRVRTOyBpKyspIHsKKwkJSFRUX1JYX0hBU0hfQ09VTlRfUkVTRVQocGRldi0+cnhfcmluZy5oYXNoX3RhYmxlW2ldKTsKKworCQkvKiBpbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIGJ1Y2tldHMgKi8KKwkJaHR0X2xpc3RfaW5pdCgmcGRldi0+cnhfcmluZy5oYXNoX3RhYmxlW2ldLmxpc3RoZWFkKTsKKworCQkvKiBpbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIGZyZWUgcG9vbCBwZXIgYnVja2V0ICovCisJCWh0dF9saXN0X2luaXQoJnBkZXYtPnJ4X3JpbmcuaGFzaF90YWJsZVtpXS5mcmVlcG9vbCk7CisKKwkJLyogcHJlLWFsbG9jYXRlIGEgcG9vbCBvZiBlbnRyaWVzIGZvciB0aGlzIGJ1Y2tldCAqLworCQlwZGV2LT5yeF9yaW5nLmhhc2hfdGFibGVbaV0uZW50cmllcyA9CisJCQljZGZfbWVtX21hbGxvYyhSWF9FTlRSSUVTX1NJWkUgKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGh0dF9yeF9oYXNoX2VudHJ5KSk7CisKKwkJaWYgKE5VTEwgPT0gcGRldi0+cnhfcmluZy5oYXNoX3RhYmxlW2ldLmVudHJpZXMpIHsKKwkJCWNkZl9wcmludCgicnggaGFzaCBidWNrZXQgJWQgZW50cmllcyBhbGxvYyBmYWlsZWRcbiIsCisJCQkJKGludClpKTsKKwkJCXdoaWxlIChpKSB7CisJCQkJaS0tOworCQkJCWNkZl9tZW1fZnJlZShwZGV2LT5yeF9yaW5nLmhhc2hfdGFibGVbaV0uCisJCQkJCSAgICAgZW50cmllcyk7CisJCQl9CisJCQljZGZfbWVtX2ZyZWUocGRldi0+cnhfcmluZy5oYXNoX3RhYmxlKTsKKwkJCXBkZXYtPnJ4X3JpbmcuaGFzaF90YWJsZSA9IE5VTEw7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qIGluaXRpYWxpemUgdGhlIGZyZWUgbGlzdCB3aXRoIHByZS1hbGxvY2F0ZWQgZW50cmllcyAqLworCQlmb3IgKGogPSAwOyBqIDwgUlhfRU5UUklFU19TSVpFOyBqKyspIHsKKwkJCXBkZXYtPnJ4X3JpbmcuaGFzaF90YWJsZVtpXS5lbnRyaWVzW2pdLmZyb21saXN0ID0gMTsKKwkJCWh0dF9saXN0X2FkZF90YWlsKCZwZGV2LT5yeF9yaW5nLmhhc2hfdGFibGVbaV0uZnJlZXBvb2wsCisJCQkJCSAgJnBkZXYtPnJ4X3JpbmcuaGFzaF90YWJsZVtpXS4KKwkJCQkJICBlbnRyaWVzW2pdLmxpc3Rub2RlKTsKKwkJfQorCX0KKworCXBkZXYtPnJ4X3JpbmcubGlzdG5vZGVfb2Zmc2V0ID0KKwkJY2RmX29mZnNldG9mKHN0cnVjdCBodHRfcnhfaGFzaF9lbnRyeSwgbGlzdG5vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaHR0X3J4X2hhc2hfZHVtcF90YWJsZShzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKwl1aW50MzJfdCBpOworCXN0cnVjdCBodHRfcnhfaGFzaF9lbnRyeSAqaGFzaF9lbnRyeTsKKwlzdHJ1Y3QgaHR0X2xpc3Rfbm9kZSAqbGlzdF9pdGVyID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9OVU1fSEFTSF9CVUNLRVRTOyBpKyspIHsKKwkJSFRUX0xJU1RfSVRFUl9GV0QobGlzdF9pdGVyLAorCQkJCSAgJnBkZXYtPnJ4X3JpbmcuaGFzaF90YWJsZVtpXS5saXN0aGVhZCkgeworCQkJaGFzaF9lbnRyeSA9CisJCQkJKHN0cnVjdCBodHRfcnhfaGFzaF9lbnRyeSAqKSgoY2hhciAqKWxpc3RfaXRlciAtCisJCQkJCQkJICAgICBwZGV2LT5yeF9yaW5nLgorCQkJCQkJCSAgICAgbGlzdG5vZGVfb2Zmc2V0KTsKKwkJCWNkZl9wcmludCgiaGFzaF90YWJsZVslZF06IG5ldGJ1ZiAlcCBwYWRkciAweCV4XG4iLCBpLAorCQkJCSAgaGFzaF9lbnRyeS0+bmV0YnVmLCBoYXNoX2VudHJ5LT5wYWRkcik7CisJCX0KKwl9Cit9CisKKy8qLS0tIFJYIEluIE9yZGVyIEhhc2ggQ29kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG1vdmUgdGhlIGZ1bmN0aW9uIHRvIHRoZSBlbmQgb2YgZmlsZQorICogdG8gb21pdCBsbC9obCBwcmUtZGVjbGFyYXRpb24KKyAqLworaW50IGh0dF9yeF9hdHRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJY2RmX2RtYV9hZGRyX3QgcGFkZHI7CisjaWYgSFRUX1BBRERSNjQKKwl1aW50MzJfdCByaW5nX2VsZW1fc2l6ZSA9IHNpemVvZih1aW50NjRfdCk7CisjZWxzZQorCXVpbnQzMl90IHJpbmdfZWxlbV9zaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyNlbmRpZiAvKiBIVFRfUEFERFI2NCAqLworCXBkZXYtPnJ4X3Jpbmcuc2l6ZSA9IGh0dF9yeF9yaW5nX3NpemUocGRldik7CisJSFRUX0FTU0VSVDIoSVNfUFdSMihwZGV2LT5yeF9yaW5nLnNpemUpKTsKKwlwZGV2LT5yeF9yaW5nLnNpemVfbWFzayA9IHBkZXYtPnJ4X3Jpbmcuc2l6ZSAtIDE7CisKKwkvKgorCSogU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgbGV2ZWwgdG8gd2hpY2ggdGhlIHJ4IHJpbmcKKwkqIHNob3VsZCBiZSBmaWxsZWQsIGJhc2VkIG9uIHRoZSBtYXggdGhyb3VnaHB1dCBhbmQgdGhlIHdvcnN0CisJKiBsaWtlbHkgbGF0ZW5jeSBmb3IgdGhlIGhvc3QgdG8gZmlsbCB0aGUgcnggcmluZy4KKwkqIEluIHRoZW9yeSwgdGhpcyBmaWxsIGxldmVsIGNhbiBiZSBkeW5hbWljYWxseSBhZGp1c3RlZCBmcm9tCisJKiB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgaGVyZSB0byByZWZsZWN0IHRoZSBhY3R1YWwgaG9zdCBsYXRlbmN5CisJKiByYXRoZXIgdGhhbiBhIGNvbnNlcnZhdGl2ZSBhc3N1bXB0aW9uLgorCSovCisJcGRldi0+cnhfcmluZy5maWxsX2xldmVsID0gaHR0X3J4X3JpbmdfZmlsbF9sZXZlbChwZGV2KTsKKworCWlmIChwZGV2LT5jZmcuaXNfZnVsbF9yZW9yZGVyX29mZmxvYWQpIHsKKwkJaWYgKGh0dF9yeF9oYXNoX2luaXQocGRldikpCisJCQlnb3RvIGZhaWwxOworCisJCS8qIGFsbG9jYXRlIHRoZSB0YXJnZXQgaW5kZXggKi8KKwkJcGRldi0+cnhfcmluZy50YXJnZXRfaWR4LnZhZGRyID0KKwkJCSBjZGZfb3NfbWVtX2FsbG9jX2NvbnNpc3RlbnQocGRldi0+b3NkZXYsCisJCQkJIHNpemVvZih1aW50MzJfdCksCisJCQkJICZwYWRkciwKKwkJCQkgY2RmX2dldF9kbWFfbWVtX2NvbnRleHQoCisJCQkJCSgmcGRldi0+cnhfcmluZy50YXJnZXRfaWR4KSwKKwkJCQkJIG1lbWN0eCkpOworCisJCWlmICghcGRldi0+cnhfcmluZy50YXJnZXRfaWR4LnZhZGRyKQorCQkJZ290byBmYWlsMTsKKworCQlwZGV2LT5yeF9yaW5nLnRhcmdldF9pZHgucGFkZHIgPSBwYWRkcjsKKwkJKnBkZXYtPnJ4X3JpbmcudGFyZ2V0X2lkeC52YWRkciA9IDA7CisJfSBlbHNlIHsKKwkJcGRldi0+cnhfcmluZy5idWYubmV0YnVmc19yaW5nID0KKwkJCWNkZl9tZW1fbWFsbG9jKHBkZXYtPnJ4X3Jpbmcuc2l6ZSAqIHNpemVvZihjZGZfbmJ1Zl90KSk7CisJCWlmICghcGRldi0+cnhfcmluZy5idWYubmV0YnVmc19yaW5nKQorCQkJZ290byBmYWlsMTsKKworCQlwZGV2LT5yeF9yaW5nLnN3X3JkX2lkeC5tc2R1X3BheWxkID0gMDsKKwkJcGRldi0+cnhfcmluZy5zd19yZF9pZHgubXNkdV9kZXNjID0gMDsKKwl9CisKKwlwZGV2LT5yeF9yaW5nLmJ1Zi5wYWRkcnNfcmluZyA9CisJCWNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudCgKKwkJCXBkZXYtPm9zZGV2LAorCQkJIHBkZXYtPnJ4X3Jpbmcuc2l6ZSAqIHJpbmdfZWxlbV9zaXplLAorCQkJICZwYWRkciwKKwkJCSBjZGZfZ2V0X2RtYV9tZW1fY29udGV4dCgKKwkJCQkoJnBkZXYtPnJ4X3JpbmcuYnVmKSwKKwkJCQkgbWVtY3R4KSk7CisJaWYgKCFwZGV2LT5yeF9yaW5nLmJ1Zi5wYWRkcnNfcmluZykKKwkJZ290byBmYWlsMjsKKworCXBkZXYtPnJ4X3JpbmcuYmFzZV9wYWRkciA9IHBhZGRyOworCXBkZXYtPnJ4X3JpbmcuYWxsb2NfaWR4LnZhZGRyID0KKwkJIGNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudCgKKwkJCXBkZXYtPm9zZGV2LAorCQkJIHNpemVvZih1aW50MzJfdCksCisJCQkgJnBhZGRyLAorCQkJIGNkZl9nZXRfZG1hX21lbV9jb250ZXh0KAorCQkJCSgmcGRldi0+cnhfcmluZy5hbGxvY19pZHgpLAorCQkJCSBtZW1jdHgpKTsKKworCWlmICghcGRldi0+cnhfcmluZy5hbGxvY19pZHgudmFkZHIpCisJCWdvdG8gZmFpbDM7CisKKwlwZGV2LT5yeF9yaW5nLmFsbG9jX2lkeC5wYWRkciA9IHBhZGRyOworCSpwZGV2LT5yeF9yaW5nLmFsbG9jX2lkeC52YWRkciA9IDA7CisKKwkvKgorCSogSW5pdGlhbGl6ZSB0aGUgUnggcmVmaWxsIHJlZmVyZW5jZSBjb3VudGVyIHRvIGJlIG9uZSBzbyB0aGF0CisJKiBvbmx5IG9uZSB0aHJlYWQgaXMgYWxsb3dlZCB0byByZWZpbGwgdGhlIFJ4IHJpbmcuCisJKi8KKwljZGZfYXRvbWljX2luaXQoJnBkZXYtPnJ4X3JpbmcucmVmaWxsX3JlZl9jbnQpOworCWNkZl9hdG9taWNfaW5jKCZwZGV2LT5yeF9yaW5nLnJlZmlsbF9yZWZfY250KTsKKworCS8qIEluaXRpYWxpemUgdGhlIFJ4IHJlZmlsbCByZXRyeSB0aW1lciAqLworCWNkZl9zb2Z0aXJxX3RpbWVyX2luaXQocGRldi0+b3NkZXYsCisJCSAmcGRldi0+cnhfcmluZy5yZWZpbGxfcmV0cnlfdGltZXIsCisJCSBodHRfcnhfcmluZ19yZWZpbGxfcmV0cnksICh2b2lkICopcGRldiwKKwkJIENERl9USU1FUl9UWVBFX1NXKTsKKworCXBkZXYtPnJ4X3JpbmcuZmlsbF9jbnQgPSAwOworI2lmZGVmIERFQlVHX0RNQV9ET05FCisJcGRldi0+cnhfcmluZy5kYmdfcmluZ19pZHggPSAwOworCXBkZXYtPnJ4X3JpbmcuZGJnX3JlZmlsbF9jbnQgPSAwOworCXBkZXYtPnJ4X3JpbmcuZGJnX3N5bmNfc3VjY2VzcyA9IDA7CisjZW5kaWYKKyNpZmRlZiBIVFRfUlhfUkVTVE9SRQorCXBkZXYtPnJ4X3JpbmcucnhfcmVzZXQgPSAwOworCXBkZXYtPnJ4X3JpbmcuaHR0X3J4X3Jlc3RvcmUgPSAwOworI2VuZGlmCisJaHR0X3J4X3JpbmdfZmlsbF9uKHBkZXYsIHBkZXYtPnJ4X3JpbmcuZmlsbF9sZXZlbCk7CisKKwlpZiAocGRldi0+Y2ZnLmlzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkKSB7CisJCWNkZl9wcmludCgiSFRUOiBmdWxsIHJlb3JkZXIgb2ZmbG9hZCBlbmFibGVkXG4iKTsKKwkJaHR0X3J4X2Ftc2R1X3BvcCA9IGh0dF9yeF9hbXNkdV9yeF9pbl9vcmRlcl9wb3BfbGw7CisJCWh0dF9yeF9mcmFnX3BvcCA9IGh0dF9yeF9hbXNkdV9yeF9pbl9vcmRlcl9wb3BfbGw7CisJCWh0dF9yeF9tcGR1X2Rlc2NfbGlzdF9uZXh0ID0KKwkJCSBodHRfcnhfaW5fb3JkX21wZHVfZGVzY19saXN0X25leHRfbGw7CisJfSBlbHNlIHsKKwkJaHR0X3J4X2Ftc2R1X3BvcCA9IGh0dF9yeF9hbXNkdV9wb3BfbGw7CisJCWh0dF9yeF9mcmFnX3BvcCA9IGh0dF9yeF9hbXNkdV9wb3BfbGw7CisJCWh0dF9yeF9tcGR1X2Rlc2NfbGlzdF9uZXh0ID0gaHR0X3J4X21wZHVfZGVzY19saXN0X25leHRfbGw7CisJfQorCisJaHR0X3J4X29mZmxvYWRfbXNkdV9wb3AgPSBodHRfcnhfb2ZmbG9hZF9tc2R1X3BvcF9sbDsKKyAgICAgICAgaHR0X3J4X21wZHVfZGVzY19yZXRyeSA9IGh0dF9yeF9tcGR1X2Rlc2NfcmV0cnlfbGw7CisJaHR0X3J4X21wZHVfZGVzY19zZXFfbnVtID0gaHR0X3J4X21wZHVfZGVzY19zZXFfbnVtX2xsOworCWh0dF9yeF9tcGR1X2Rlc2NfcG4gPSBodHRfcnhfbXBkdV9kZXNjX3BuX2xsOworICAgICAgICBodHRfcnhfbXBkdV9kZXNjX3RpZCA9IGh0dF9yeF9tcGR1X2Rlc2NfdGlkX2xsOworCWh0dF9yeF9tc2R1X2Rlc2NfY29tcGxldGVzX21wZHUgPSBodHRfcnhfbXNkdV9kZXNjX2NvbXBsZXRlc19tcGR1X2xsOworCWh0dF9yeF9tc2R1X2ZpcnN0X21zZHVfZmxhZyA9IGh0dF9yeF9tc2R1X2ZpcnN0X21zZHVfZmxhZ19sbDsKKwlodHRfcnhfbXNkdV9oYXNfd2xhbl9tY2FzdF9mbGFnID0gaHR0X3J4X21zZHVfaGFzX3dsYW5fbWNhc3RfZmxhZ19sbDsKKwlodHRfcnhfbXNkdV9pc193bGFuX21jYXN0ID0gaHR0X3J4X21zZHVfaXNfd2xhbl9tY2FzdF9sbDsKKwlodHRfcnhfbXNkdV9pc19mcmFnID0gaHR0X3J4X21zZHVfaXNfZnJhZ19sbDsKKwlodHRfcnhfbXNkdV9kZXNjX3JldHJpZXZlID0gaHR0X3J4X21zZHVfZGVzY19yZXRyaWV2ZV9sbDsKKwlodHRfcnhfbXBkdV9pc19lbmNyeXB0ZWQgPSBodHRfcnhfbXBkdV9pc19lbmNyeXB0ZWRfbGw7CisJaHR0X3J4X21zZHVfZGVzY19rZXlfaWQgPSBodHRfcnhfbXNkdV9kZXNjX2tleV9pZF9sbDsKKwlodHRfcnhfbXNkdV9jaGFuX2luZm9fcHJlc2VudCA9IGh0dF9yeF9tc2R1X2NoYW5faW5mb19wcmVzZW50X2xsOworCWh0dF9yeF9tc2R1X2NlbnRlcl9mcmVxID0gaHR0X3J4X21zZHVfY2VudGVyX2ZyZXFfbGw7CisKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCisKK2ZhaWwzOgorCWNkZl9vc19tZW1fZnJlZV9jb25zaXN0ZW50KHBkZXYtPm9zZGV2LAorCQkJCSAgIHBkZXYtPnJ4X3Jpbmcuc2l6ZSAqIHNpemVvZih1aW50MzJfdCksCisJCQkJICAgcGRldi0+cnhfcmluZy5idWYucGFkZHJzX3JpbmcsCisJCQkJICAgcGRldi0+cnhfcmluZy5iYXNlX3BhZGRyLAorCQkJCSAgIGNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+cnhfcmluZy5idWYpLAorCQkJCQkJCSAgIG1lbWN0eCkpOworCitmYWlsMjoKKwlpZiAocGRldi0+Y2ZnLmlzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkKSB7CisJCWNkZl9vc19tZW1fZnJlZV9jb25zaXN0ZW50KHBkZXYtPm9zZGV2LAorCQkJCQkgICBzaXplb2YodWludDMyX3QpLAorCQkJCQkgICBwZGV2LT5yeF9yaW5nLnRhcmdldF9pZHgudmFkZHIsCisJCQkJCSAgIHBkZXYtPnJ4X3JpbmcudGFyZ2V0X2lkeC5wYWRkciwKKwkJCQkJICAgY2RmX2dldF9kbWFfbWVtX2NvbnRleHQoKCZwZGV2LT4KKwkJCQkJCQkJICAgIHJ4X3JpbmcuCisJCQkJCQkJCSAgICB0YXJnZXRfaWR4KSwKKwkJCQkJCQkJICAgbWVtY3R4KSk7CisJCWh0dF9yeF9oYXNoX2RlaW5pdChwZGV2KTsKKwl9IGVsc2UgeworCQljZGZfbWVtX2ZyZWUocGRldi0+cnhfcmluZy5idWYubmV0YnVmc19yaW5nKTsKKwl9CisKK2ZhaWwxOgorCXJldHVybiAxOyAgICAgICAgICAgICAgIC8qIGZhaWx1cmUgKi8KK30KKworI2lmZGVmIElQQV9PRkZMT0FECitpbnQgaHR0X3J4X2lwYV91Y19hdHRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsCisJCQkgdW5zaWduZWQgaW50IHJ4X2luZF9yaW5nX2VsZW1lbnRzKQoreworCS8qIEFsbG9jYXRlIFJYIGluZGljYXRpb24gcmluZyAqLworCS8qIFJYIElORCByaW5nIGVsZW1lbnQKKwkgKiAgIDRieXRlczogcG9pbnRlcgorCSAqICAgMmJ5dGVzOiBWREVWIElECisJICogICAyYnl0ZXM6IGxlbmd0aCAqLworCXBkZXYtPmlwYV91Y19yeF9yc2MucnhfaW5kX3JpbmdfYmFzZS52YWRkciA9CisJCWNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudCgKKwkJCXBkZXYtPm9zZGV2LAorCQkJcnhfaW5kX3JpbmdfZWxlbWVudHMgKgorCQkJc2l6ZW9mKHN0cnVjdCBpcGFfdWNfcnhfcmluZ19lbGVtX3QpLAorCQkJJnBkZXYtPmlwYV91Y19yeF9yc2MucnhfaW5kX3JpbmdfYmFzZS5wYWRkciwKKwkJCWNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+aXBhX3VjX3J4X3JzYy4KKwkJCQkJCSByeF9pbmRfcmluZ19iYXNlKSwKKwkJCQkJCW1lbWN0eCkpOworCWlmICghcGRldi0+aXBhX3VjX3J4X3JzYy5yeF9pbmRfcmluZ19iYXNlLnZhZGRyKSB7CisJCWNkZl9wcmludCgiJXM6IFJYIElORCBSSU5HIGFsbG9jIGZhaWwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwkvKiBSWCBpbmRpY2F0aW9uIHJpbmcgc2l6ZSwgYnkgYnl0ZXMgKi8KKwlwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4X2luZF9yaW5nX3NpemUgPQorCQlyeF9pbmRfcmluZ19lbGVtZW50cyAqIHNpemVvZihzdHJ1Y3QgaXBhX3VjX3J4X3JpbmdfZWxlbV90KTsKKwljZGZfbWVtX3plcm8ocGRldi0+aXBhX3VjX3J4X3JzYy5yeF9pbmRfcmluZ19iYXNlLnZhZGRyLAorCQlwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4X2luZF9yaW5nX3NpemUpOworCisJLyogQWxsb2NhdGUgUlggcHJvY2VzcyBkb25lIGluZGV4ICovCisJcGRldi0+aXBhX3VjX3J4X3JzYy5yeF9pcGFfcHJjX2RvbmVfaWR4LnZhZGRyID0KKwkJY2RmX29zX21lbV9hbGxvY19jb25zaXN0ZW50KAorCQkJcGRldi0+b3NkZXYsCisJCQk0LAorCQkJJnBkZXYtPmlwYV91Y19yeF9yc2MucnhfaXBhX3ByY19kb25lX2lkeC5wYWRkciwKKwkJCWNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+aXBhX3VjX3J4X3JzYy4KKwkJCQkJCSByeF9pcGFfcHJjX2RvbmVfaWR4KSwKKwkJCQkJCW1lbWN0eCkpOworCWlmICghcGRldi0+aXBhX3VjX3J4X3JzYy5yeF9pcGFfcHJjX2RvbmVfaWR4LnZhZGRyKSB7CisJCWNkZl9wcmludCgiJXM6IFJYIFBST0MgRE9ORSBJTkQgYWxsb2MgZmFpbCIsIF9fZnVuY19fKTsKKwkJY2RmX29zX21lbV9mcmVlX2NvbnNpc3RlbnQoCisJCQlwZGV2LT5vc2RldiwKKwkJCXBkZXYtPmlwYV91Y19yeF9yc2MucnhfaW5kX3Jpbmdfc2l6ZSwKKwkJCXBkZXYtPmlwYV91Y19yeF9yc2MucnhfaW5kX3JpbmdfYmFzZS52YWRkciwKKwkJCXBkZXYtPmlwYV91Y19yeF9yc2MucnhfaW5kX3JpbmdfYmFzZS5wYWRkciwKKwkJCWNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+aXBhX3VjX3J4X3JzYy4KKwkJCQkJCSByeF9pbmRfcmluZ19iYXNlKSwKKwkJCQkJCW1lbWN0eCkpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCWNkZl9tZW1femVybyhwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4X2lwYV9wcmNfZG9uZV9pZHgudmFkZHIsIDQpOworCisJLyogQWxsb2NhdGUgUlgyIGluZGljYXRpb24gcmluZyAqLworCS8qIFJYMiBJTkQgcmluZyBlbGVtZW50CisJICogICA0Ynl0ZXM6IHBvaW50ZXIKKwkgKiAgIDJieXRlczogVkRFViBJRAorCSAqICAgMmJ5dGVzOiBsZW5ndGggKi8KKwlwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4Ml9pbmRfcmluZ19iYXNlLnZhZGRyID0KKwkJY2RmX29zX21lbV9hbGxvY19jb25zaXN0ZW50KAorCQkJcGRldi0+b3NkZXYsCisJCQlyeF9pbmRfcmluZ19lbGVtZW50cyAqCisJCQlzaXplb2Yoc3RydWN0IGlwYV91Y19yeF9yaW5nX2VsZW1fdCksCisJCQkmcGRldi0+aXBhX3VjX3J4X3JzYy5yeDJfaW5kX3JpbmdfYmFzZS5wYWRkciwKKwkJCWNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+aXBhX3VjX3J4X3JzYy4KKwkJCQkJCSByeDJfaW5kX3JpbmdfYmFzZSksCisJCQkJCQltZW1jdHgpKTsKKwlpZiAoIXBkZXYtPmlwYV91Y19yeF9yc2MucngyX2luZF9yaW5nX2Jhc2UudmFkZHIpIHsKKwkJY2RmX3ByaW50KCIlczogUlggSU5EIFJJTkcgYWxsb2MgZmFpbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCS8qIFJYIGluZGljYXRpb24gcmluZyBzaXplLCBieSBieXRlcyAqLworCXBkZXYtPmlwYV91Y19yeF9yc2MucngyX2luZF9yaW5nX3NpemUgPQorCQlyeF9pbmRfcmluZ19lbGVtZW50cyAqIHNpemVvZihzdHJ1Y3QgaXBhX3VjX3J4X3JpbmdfZWxlbV90KTsKKwljZGZfbWVtX3plcm8ocGRldi0+aXBhX3VjX3J4X3JzYy5yeDJfaW5kX3JpbmdfYmFzZS52YWRkciwKKwkJcGRldi0+aXBhX3VjX3J4X3JzYy5yeDJfaW5kX3Jpbmdfc2l6ZSk7CisKKwkvKiBBbGxvY2F0ZSBSWCBwcm9jZXNzIGRvbmUgaW5kZXggKi8KKwlwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4Ml9pcGFfcHJjX2RvbmVfaWR4LnZhZGRyID0KKwkJY2RmX29zX21lbV9hbGxvY19jb25zaXN0ZW50KAorCQkJcGRldi0+b3NkZXYsCisJCQk0LAorCQkJJnBkZXYtPmlwYV91Y19yeF9yc2MucngyX2lwYV9wcmNfZG9uZV9pZHgucGFkZHIsCisJCQljZGZfZ2V0X2RtYV9tZW1fY29udGV4dCgoJnBkZXYtPmlwYV91Y19yeF9yc2MuCisJCQkJCQkgcnhfaXBhX3ByY19kb25lX2lkeCksCisJCQkJCQltZW1jdHgpKTsKKwlpZiAoIXBkZXYtPmlwYV91Y19yeF9yc2MucngyX2lwYV9wcmNfZG9uZV9pZHgudmFkZHIpIHsKKwkJY2RmX3ByaW50KCIlczogUlggUFJPQyBET05FIElORCBhbGxvYyBmYWlsIiwgX19mdW5jX18pOworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudCgKKwkJCXBkZXYtPm9zZGV2LAorCQkJcGRldi0+aXBhX3VjX3J4X3JzYy5yeDJfaW5kX3Jpbmdfc2l6ZSwKKwkJCXBkZXYtPmlwYV91Y19yeF9yc2MucngyX2luZF9yaW5nX2Jhc2UudmFkZHIsCisJCQlwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4Ml9pbmRfcmluZ19iYXNlLnBhZGRyLAorCQkJY2RmX2dldF9kbWFfbWVtX2NvbnRleHQoKCZwZGV2LT5pcGFfdWNfcnhfcnNjLgorCQkJCQkJIHJ4Ml9pbmRfcmluZ19iYXNlKSwKKwkJCQkJCW1lbWN0eCkpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCWNkZl9tZW1femVybyhwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4Ml9pcGFfcHJjX2RvbmVfaWR4LnZhZGRyLCA0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGh0dF9yeF9pcGFfdWNfZGV0YWNoKHN0cnVjdCBodHRfcGRldl90ICpwZGV2KQoreworCWlmIChwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4X2luZF9yaW5nX2Jhc2UudmFkZHIpIHsKKwkJY2RmX29zX21lbV9mcmVlX2NvbnNpc3RlbnQoCisJCQlwZGV2LT5vc2RldiwKKwkJCXBkZXYtPmlwYV91Y19yeF9yc2MucnhfaW5kX3Jpbmdfc2l6ZSwKKwkJCXBkZXYtPmlwYV91Y19yeF9yc2MucnhfaW5kX3JpbmdfYmFzZS52YWRkciwKKwkJCXBkZXYtPmlwYV91Y19yeF9yc2MucnhfaW5kX3JpbmdfYmFzZS5wYWRkciwKKwkJCWNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+aXBhX3VjX3J4X3JzYy4KKwkJCQkJCSByeF9pbmRfcmluZ19iYXNlKSwKKwkJCQkJCW1lbWN0eCkpOworCX0KKworCWlmIChwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4X2lwYV9wcmNfZG9uZV9pZHgudmFkZHIpIHsKKwkJY2RmX29zX21lbV9mcmVlX2NvbnNpc3RlbnQoCisJCQlwZGV2LT5vc2RldiwKKwkJCTQsCisJCQlwZGV2LT5pcGFfdWNfcnhfcnNjLgorCQkJcnhfaXBhX3ByY19kb25lX2lkeC52YWRkciwKKwkJCXBkZXYtPmlwYV91Y19yeF9yc2MucnhfaXBhX3ByY19kb25lX2lkeC5wYWRkciwKKwkJCWNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+aXBhX3VjX3J4X3JzYy4KKwkJCQkJCSByeF9pcGFfcHJjX2RvbmVfaWR4KSwKKwkJCQkJCW1lbWN0eCkpOworCX0KKwlpZiAocGRldi0+aXBhX3VjX3J4X3JzYy5yeDJfaW5kX3JpbmdfYmFzZS52YWRkcikgeworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudCgKKwkJCXBkZXYtPm9zZGV2LAorCQkJcGRldi0+aXBhX3VjX3J4X3JzYy5yeDJfaW5kX3Jpbmdfc2l6ZSwKKwkJCXBkZXYtPmlwYV91Y19yeF9yc2MucngyX2luZF9yaW5nX2Jhc2UudmFkZHIsCisJCQlwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4Ml9pbmRfcmluZ19iYXNlLnBhZGRyLAorCQkJY2RmX2dldF9kbWFfbWVtX2NvbnRleHQoKCZwZGV2LT5pcGFfdWNfcnhfcnNjLgorCQkJCQkJIHJ4Ml9pbmRfcmluZ19iYXNlKSwKKwkJCQkJCW1lbWN0eCkpOworCX0KKworCWlmIChwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4Ml9pcGFfcHJjX2RvbmVfaWR4LnZhZGRyKSB7CisJCWNkZl9vc19tZW1fZnJlZV9jb25zaXN0ZW50KAorCQkJcGRldi0+b3NkZXYsCisJCQk0LAorCQkJcGRldi0+aXBhX3VjX3J4X3JzYy4KKwkJCXJ4X2lwYV9wcmNfZG9uZV9pZHgudmFkZHIsCisJCQlwZGV2LT5pcGFfdWNfcnhfcnNjLnJ4Ml9pcGFfcHJjX2RvbmVfaWR4LnBhZGRyLAorCQkJY2RmX2dldF9kbWFfbWVtX2NvbnRleHQoKCZwZGV2LT5pcGFfdWNfcnhfcnNjLgorCQkJCQkJIHJ4X2lwYV9wcmNfZG9uZV9pZHgpLAorCQkJCQkJbWVtY3R4KSk7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL2h0dC9odHRfdDJoLmMgYi9jb3JlL2RwL2h0dC9odHRfdDJoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkODQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvaHR0L2h0dF90MmguYwpAQCAtMCwwICsxLDkzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBAZmlsZSBodHRfdDJoLmMKKyAqIEBicmllZiBQcm92aWRlIGZ1bmN0aW9ucyB0byBwcm9jZXNzIHRhcmdldC0+aG9zdCBIVFQgbWVzc2FnZXMuCisgKiBAZGV0YWlscworICogIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgcmVsYXRlZCB0byB0YXJnZXQtPmhvc3QgSFRUIG1lc3NhZ2VzLgorICogIFRoZXJlIGFyZSB0d28gY2F0ZWdvcmllcyBvZiBmdW5jdGlvbnM6CisgKiAgMS4gIEEgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIEhUVCBtZXNzYWdlIGZyb20gSFRDLCBhbmQgZGlzcGF0Y2hlcyBpdAorICogICAgICBiYXNlZCBvbiB0aGUgSFRUIG1lc3NhZ2UgdHlwZS4KKyAqICAyLiAgZnVuY3Rpb25zIHRoYXQgcHJvdmlkZSB0aGUgaW5mbyBlbGVtZW50cyBmcm9tIHNwZWNpZmljIEhUVCBtZXNzYWdlcy4KKyAqLworCisjaW5jbHVkZSA8aHRjX2FwaS5oPiAgICAgICAgICAgIC8qIEhUQ19QQUNLRVQgKi8KKyNpbmNsdWRlIDxodHQuaD4gICAgICAgICAgICAgICAgLyogSFRUX1QySF9NU0dfVFlQRSwgZXRjLiAqLworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90ICovCisKKyNpbmNsdWRlIDxvbF9odHRfcnhfYXBpLmg+CisjaW5jbHVkZSA8b2xfaHR0X3R4X2FwaS5oPgorI2luY2x1ZGUgPG9sX3R4cnhfaHR0X2FwaS5oPiAgICAvKiBodHRfdHhfc3RhdHVzICovCisKKyNpbmNsdWRlIDxodHRfaW50ZXJuYWwuaD4gICAgICAgLyogSFRUX1RYX1NDSEVELCBldGMuICovCisjaW5jbHVkZSA8cGt0bG9nX2FjX2ZtdC5oPgorI2luY2x1ZGUgPHdkaV9ldmVudC5oPgorI2luY2x1ZGUgPG9sX2h0dF90eF9hcGkuaD4KKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+CisvKi0tLSB0YXJnZXQtPmhvc3QgSFRUIG1lc3NhZ2UgZGlzcGF0Y2ggZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgREVCVUdfQ1JFRElUCisjZGVmaW5lIERFQlVHX0NSRURJVCAwCisjZW5kaWYKKworc3RhdGljIHVpbnQ4X3QgKmh0dF90MmhfbWFjX2FkZHJfZGVzd2l6emxlKHVpbnQ4X3QgKnRndF9tYWNfYWRkciwKKwkJCQkJICAgdWludDhfdCAqYnVmZmVyKQoreworI2lmZGVmIEJJR19FTkRJQU5fSE9TVAorCS8qCisJICogVGhlIGhvc3QgZW5kaWFubmVzcyBpcyBvcHBvc2l0ZSBvZiB0aGUgdGFyZ2V0IGVuZGlhbm5lc3MuCisJICogVG8gbWFrZSB1aW50MzJfdCBlbGVtZW50cyBjb21lIG91dCBjb3JyZWN0bHksIHRoZSB0YXJnZXQtPmhvc3QKKwkgKiB1cGxvYWQgaGFzIHN3aXp6bGVkIHRoZSBieXRlcyBpbiBlYWNoIHVpbnQzMl90IGVsZW1lbnQgb2YgdGhlCisJICogbWVzc2FnZS4KKwkgKiBGb3IgYnl0ZS1hcnJheSBtZXNzYWdlIGZpZWxkcyBsaWtlIHRoZSBNQUMgYWRkcmVzcywgdGhpcworCSAqIHVwbG9hZCBzd2l6emxpbmcgcHV0cyB0aGUgYnl0ZXMgaW4gdGhlIHdyb25nIG9yZGVyLCBhbmQgbmVlZHMKKwkgKiB0byBiZSB1bmRvbmUuCisJICovCisJYnVmZmVyWzBdID0gdGd0X21hY19hZGRyWzNdOworCWJ1ZmZlclsxXSA9IHRndF9tYWNfYWRkclsyXTsKKwlidWZmZXJbMl0gPSB0Z3RfbWFjX2FkZHJbMV07CisJYnVmZmVyWzNdID0gdGd0X21hY19hZGRyWzBdOworCWJ1ZmZlcls0XSA9IHRndF9tYWNfYWRkcls3XTsKKwlidWZmZXJbNV0gPSB0Z3RfbWFjX2FkZHJbNl07CisJcmV0dXJuIGJ1ZmZlcjsKKyNlbHNlCisJLyoKKwkgKiBUaGUgaG9zdCBlbmRpYW5uZXNzIG1hdGNoZXMgdGhlIHRhcmdldCBlbmRpYW5uZXNzIC0KKwkgKiB3ZSBjYW4gdXNlIHRoZSBtYWMgYWRkciBkaXJlY3RseSBmcm9tIHRoZSBtZXNzYWdlIGJ1ZmZlci4KKwkgKi8KKwlyZXR1cm4gdGd0X21hY19hZGRyOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGh0dF9yeF9mcmFnX3NldF9sYXN0X21zZHUoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsIGNkZl9uYnVmX3QgbXNnKQoreworCXVpbnQzMl90ICptc2dfd29yZDsKKwl1bnNpZ25lZCBudW1fbXNkdV9ieXRlczsKKwljZGZfbmJ1Zl90IG1zZHU7CisJc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqcnhfZGVzYzsKKwlpbnQgc3RhcnRfaWR4OworCXVpbnQ4X3QgKnBfZndfbXNkdV9yeF9kZXNjID0gMDsKKworCW1zZ193b3JkID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEobXNnKTsKKwludW1fbXNkdV9ieXRlcyA9IEhUVF9SWF9GUkFHX0lORF9GV19SWF9ERVNDX0JZVEVTX0dFVCgKKwkJKihtc2dfd29yZCArIEhUVF9SWF9GUkFHX0lORF9IRFJfUFJFRklYX1NJWkUzMikpOworCS8qCisJICogMSB3b3JkIGZvciB0aGUgbWVzc2FnZSBoZWFkZXIsCisJICogMSB3b3JkIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBNU0RVIGJ5dGVzLAorCSAqIDEgd29yZCBmb3IgZXZlcnkgNCBNU0RVIGJ5dGVzIChyb3VuZCB1cCksCisJICogMSB3b3JkIGZvciB0aGUgTVBEVSByYW5nZSBoZWFkZXIKKwkgKi8KKwlwZGV2LT5yeF9tcGR1X3JhbmdlX29mZnNldF93b3JkcyA9IDMgKyAoKG51bV9tc2R1X2J5dGVzICsgMykgPj4gMik7CisJcGRldi0+cnhfaW5kX21zZHVfYnl0ZV9pZHggPSAwOworCisJcF9md19tc2R1X3J4X2Rlc2MgPSAoKHVpbnQ4X3QgKikgKG1zZ193b3JkKSArCisJCQkgICAgIEhUVF9FTkRJQU5fQllURV9JRFhfU1dBUAorCQkJCSAgICAgKEhUVF9SWF9GUkFHX0lORF9GV19ERVNDX0JZVEVfT0ZGU0VUKSk7CisKKwkvKgorCSAqIEZpeCBmb3IgRVYxMjY3MTAsIGluIHdoaWNoIEJTT0Qgb2NjdXJzIGR1ZSB0byBsYXN0X21zZHUgYml0CisJICogbm90IHNldCB3aGlsZSB0aGUgbmV4dCBwb2ludGVyIGlzIGRlbGliZXJhdGVseSBzZXQgdG8gTlVMTAorCSAqIGJlZm9yZSBjYWxsaW5nIG9sX3J4X3BuX2NoZWNrX2Jhc2UoKQorCSAqCisJICogRm9yIGZyYWdtZW50IGZyYW1lcywgdGhlIEhXIG1heSBub3QgaGF2ZSBzZXQgdGhlIGxhc3RfbXNkdSBiaXQKKwkgKiBpbiB0aGUgcnggZGVzY3JpcHRvciwgYnV0IHRoZSBTVyBleHBlY3RzIHRoaXMgZmxhZyB0byBiZSBzZXQsCisJICogc2luY2UgZWFjaCBmcmFnbWVudCBpcyBpbiBhIHNlcGFyYXRlIE1QRFUuIFRodXMsIHNldCB0aGUgZmxhZyBoZXJlLAorCSAqIGp1c3QgaW4gY2FzZSB0aGUgSFcgZGlkbid0LgorCSAqLworCXN0YXJ0X2lkeCA9IHBkZXYtPnJ4X3Jpbmcuc3dfcmRfaWR4Lm1zZHVfcGF5bGQ7CisJbXNkdSA9IHBkZXYtPnJ4X3JpbmcuYnVmLm5ldGJ1ZnNfcmluZ1tzdGFydF9pZHhdOworCWNkZl9uYnVmX3NldF9wa3RsZW4obXNkdSwgSFRUX1JYX0JVRl9TSVpFKTsKKwljZGZfbmJ1Zl91bm1hcChwZGV2LT5vc2RldiwgbXNkdSwgQ0RGX0RNQV9GUk9NX0RFVklDRSk7CisJcnhfZGVzYyA9IGh0dF9yeF9kZXNjKG1zZHUpOworCSooKHVpbnQ4X3QgKikgJnJ4X2Rlc2MtPmZ3X2Rlc2MudS52YWwpID0gKnBfZndfbXNkdV9yeF9kZXNjOworCXJ4X2Rlc2MtPm1zZHVfZW5kLmxhc3RfbXNkdSA9IDE7CisJY2RmX25idWZfbWFwKHBkZXYtPm9zZGV2LCBtc2R1LCBDREZfRE1BX0ZST01fREVWSUNFKTsKK30KKworLyogVGFyZ2V0IHRvIGhvc3QgTXNnL2V2ZW50ICBoYW5kbGVyICBmb3IgbG93IHByaW9yaXR5IG1lc3NhZ2VzKi8KK3ZvaWQgaHR0X3QyaF9scF9tc2dfaGFuZGxlcih2b2lkICpjb250ZXh0LCBjZGZfbmJ1Zl90IGh0dF90MmhfbXNnKQoreworCXN0cnVjdCBodHRfcGRldl90ICpwZGV2ID0gKHN0cnVjdCBodHRfcGRldl90ICopY29udGV4dDsKKwl1aW50MzJfdCAqbXNnX3dvcmQ7CisJZW51bSBodHRfdDJoX21zZ190eXBlIG1zZ190eXBlOworCisJbXNnX3dvcmQgPSAodWludDMyX3QgKikgY2RmX25idWZfZGF0YShodHRfdDJoX21zZyk7CisJbXNnX3R5cGUgPSBIVFRfVDJIX01TR19UWVBFX0dFVCgqbXNnX3dvcmQpOworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIEhUVF9UMkhfTVNHX1RZUEVfVkVSU0lPTl9DT05GOgorCXsKKwkJcGRldi0+dGd0X3Zlci5tYWpvciA9IEhUVF9WRVJfQ09ORl9NQUpPUl9HRVQoKm1zZ193b3JkKTsKKwkJcGRldi0+dGd0X3Zlci5taW5vciA9IEhUVF9WRVJfQ09ORl9NSU5PUl9HRVQoKm1zZ193b3JkKTsKKwkJY2RmX3ByaW50CisJCQkoInRhcmdldCB1c2VzIEhUVCB2ZXJzaW9uICVkLiVkOyBob3N0IHVzZXMgJWQuJWRcbiIsCisJCQlwZGV2LT50Z3RfdmVyLm1ham9yLCBwZGV2LT50Z3RfdmVyLm1pbm9yLAorCQkJSFRUX0NVUlJFTlRfVkVSU0lPTl9NQUpPUiwKKwkJCUhUVF9DVVJSRU5UX1ZFUlNJT05fTUlOT1IpOworCQlpZiAocGRldi0+dGd0X3Zlci5tYWpvciAhPSBIVFRfQ1VSUkVOVF9WRVJTSU9OX01BSk9SKQorCQkJY2RmX3ByaW50CisJCQkgICAgICAoIioqKiBJbmNvbXBhdGlibGUgaG9zdC90YXJnZXQgSFRUIHZlcnNpb25zIVxuIik7CisJCS8qIGFib3J0IGlmIHRoZSB0YXJnZXQgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGhvc3QgKi8KKwkJY2RmX2Fzc2VydChwZGV2LT50Z3RfdmVyLm1ham9yID09CisJCQkgICBIVFRfQ1VSUkVOVF9WRVJTSU9OX01BSk9SKTsKKwkJaWYgKHBkZXYtPnRndF92ZXIubWlub3IgIT0gSFRUX0NVUlJFTlRfVkVSU0lPTl9NSU5PUikgeworCQkJY2RmX3ByaW50KCIqKiogV2FybmluZzogaG9zdC90YXJnZXQgSFRUIHZlcnNpb25zIGFyZSAiKTsKKwkJCWNkZl9wcmludCgiIGRpZmZlcmVudCwgdGhvdWdoIGNvbXBhdGlibGUhXG4iKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBIVFRfVDJIX01TR19UWVBFX1JYX0ZMVVNIOgorCXsKKwkJdWludDE2X3QgcGVlcl9pZDsKKwkJdWludDhfdCB0aWQ7CisJCWludCBzZXFfbnVtX3N0YXJ0LCBzZXFfbnVtX2VuZDsKKwkJZW51bSBodHRfcnhfZmx1c2hfYWN0aW9uIGFjdGlvbjsKKworCQlwZWVyX2lkID0gSFRUX1JYX0ZMVVNIX1BFRVJfSURfR0VUKCptc2dfd29yZCk7CisJCXRpZCA9IEhUVF9SWF9GTFVTSF9USURfR0VUKCptc2dfd29yZCk7CisJCXNlcV9udW1fc3RhcnQgPQorCQkJSFRUX1JYX0ZMVVNIX1NFUV9OVU1fU1RBUlRfR0VUKCoobXNnX3dvcmQgKyAxKSk7CisJCXNlcV9udW1fZW5kID0KKwkJCUhUVF9SWF9GTFVTSF9TRVFfTlVNX0VORF9HRVQoKihtc2dfd29yZCArIDEpKTsKKwkJYWN0aW9uID0KKwkJCUhUVF9SWF9GTFVTSF9NUERVX1NUQVRVU19HRVQoKihtc2dfd29yZCArIDEpKSA9PQorCQkJMSA/IGh0dF9yeF9mbHVzaF9yZWxlYXNlIDogaHR0X3J4X2ZsdXNoX2Rpc2NhcmQ7CisJCW9sX3J4X2ZsdXNoX2hhbmRsZXIocGRldi0+dHhyeF9wZGV2LCBwZWVyX2lkLCB0aWQsCisJCQkJICAgIHNlcV9udW1fc3RhcnQsIHNlcV9udW1fZW5kLCBhY3Rpb24pOworCQlicmVhazsKKwl9CisJY2FzZSBIVFRfVDJIX01TR19UWVBFX1JYX09GRkxPQURfREVMSVZFUl9JTkQ6CisJeworCQlpbnQgbXNkdV9jbnQ7CisJCW1zZHVfY250ID0KKwkJCUhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfQ05UX0dFVCgqbXNnX3dvcmQpOworCQlvbF9yeF9vZmZsb2FkX2RlbGl2ZXJfaW5kX2hhbmRsZXIocGRldi0+dHhyeF9wZGV2LAorCQkJCQkJICBodHRfdDJoX21zZywKKwkJCQkJCSAgbXNkdV9jbnQpOworCQlicmVhazsKKwl9CisJY2FzZSBIVFRfVDJIX01TR19UWVBFX1JYX0ZSQUdfSU5EOgorCXsKKwkJdWludDE2X3QgcGVlcl9pZDsKKwkJdWludDhfdCB0aWQ7CisKKwkJcGVlcl9pZCA9IEhUVF9SWF9GUkFHX0lORF9QRUVSX0lEX0dFVCgqbXNnX3dvcmQpOworCQl0aWQgPSBIVFRfUlhfRlJBR19JTkRfRVhUX1RJRF9HRVQoKm1zZ193b3JkKTsKKwkJaHR0X3J4X2ZyYWdfc2V0X2xhc3RfbXNkdShwZGV2LCBodHRfdDJoX21zZyk7CisKKwkJb2xfcnhfZnJhZ19pbmRpY2F0aW9uX2hhbmRsZXIocGRldi0+dHhyeF9wZGV2LAorCQkJCQkgICAgICBodHRfdDJoX21zZywKKwkJCQkJICAgICAgcGVlcl9pZCwgdGlkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9SWF9BRERCQToKKwl7CisJCXVpbnQxNl90IHBlZXJfaWQ7CisJCXVpbnQ4X3QgdGlkOworCQl1aW50OF90IHdpbl9zejsKKwkJdWludDE2X3Qgc3RhcnRfc2VxX251bTsKKworCQkvKgorCQkgKiBGT1IgTk9XLCB0aGUgaG9zdCBkb2Vzbid0IG5lZWQgdG8ga25vdyB0aGUgaW5pdGlhbAorCQkgKiBzZXF1ZW5jZSBudW1iZXIgZm9yIHJ4IGFnZ3JlZ2F0aW9uLgorCQkgKiBUaHVzLCBhbnkgdmFsdWUgd2lsbCBkbyAtIHNwZWNpZnkgMC4KKwkJICovCisJCXN0YXJ0X3NlcV9udW0gPSAwOworCQlwZWVyX2lkID0gSFRUX1JYX0FEREJBX1BFRVJfSURfR0VUKCptc2dfd29yZCk7CisJCXRpZCA9IEhUVF9SWF9BRERCQV9USURfR0VUKCptc2dfd29yZCk7CisJCXdpbl9zeiA9IEhUVF9SWF9BRERCQV9XSU5fU0laRV9HRVQoKm1zZ193b3JkKTsKKwkJb2xfcnhfYWRkYmFfaGFuZGxlcihwZGV2LT50eHJ4X3BkZXYsIHBlZXJfaWQsIHRpZCwKKwkJCQkgICAgd2luX3N6LCBzdGFydF9zZXFfbnVtLAorCQkJCSAgICAwIC8qIHN1Y2Nlc3MgKi8pOworCQlicmVhazsKKwl9CisJY2FzZSBIVFRfVDJIX01TR19UWVBFX1JYX0RFTEJBOgorCXsKKwkJdWludDE2X3QgcGVlcl9pZDsKKwkJdWludDhfdCB0aWQ7CisKKwkJcGVlcl9pZCA9IEhUVF9SWF9ERUxCQV9QRUVSX0lEX0dFVCgqbXNnX3dvcmQpOworCQl0aWQgPSBIVFRfUlhfREVMQkFfVElEX0dFVCgqbXNnX3dvcmQpOworCQlvbF9yeF9kZWxiYV9oYW5kbGVyKHBkZXYtPnR4cnhfcGRldiwgcGVlcl9pZCwgdGlkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9QRUVSX01BUDoKKwl7CisJCXVpbnQ4X3QgbWFjX2FkZHJfZGVzd2l6emxlX2J1ZltIVFRfTUFDX0FERFJfTEVOXTsKKwkJdWludDhfdCAqcGVlcl9tYWNfYWRkcjsKKwkJdWludDE2X3QgcGVlcl9pZDsKKwkJdWludDhfdCB2ZGV2X2lkOworCisJCXBlZXJfaWQgPSBIVFRfUlhfUEVFUl9NQVBfUEVFUl9JRF9HRVQoKm1zZ193b3JkKTsKKwkJdmRldl9pZCA9IEhUVF9SWF9QRUVSX01BUF9WREVWX0lEX0dFVCgqbXNnX3dvcmQpOworCQlwZWVyX21hY19hZGRyID0gaHR0X3QyaF9tYWNfYWRkcl9kZXN3aXp6bGUoCisJCQkodWludDhfdCAqKSAobXNnX3dvcmQgKyAxKSwKKwkJCSZtYWNfYWRkcl9kZXN3aXp6bGVfYnVmWzBdKTsKKworCQlvbF9yeF9wZWVyX21hcF9oYW5kbGVyKHBkZXYtPnR4cnhfcGRldiwgcGVlcl9pZCwKKwkJCQkgICAgICAgdmRldl9pZCwgcGVlcl9tYWNfYWRkciwKKwkJCQkgICAgICAgMSAvKmNhbiB0eCAqLyk7CisJCWJyZWFrOworCX0KKwljYXNlIEhUVF9UMkhfTVNHX1RZUEVfUEVFUl9VTk1BUDoKKwl7CisJCXVpbnQxNl90IHBlZXJfaWQ7CisJCXBlZXJfaWQgPSBIVFRfUlhfUEVFUl9VTk1BUF9QRUVSX0lEX0dFVCgqbXNnX3dvcmQpOworCisJCW9sX3J4X3BlZXJfdW5tYXBfaGFuZGxlcihwZGV2LT50eHJ4X3BkZXYsIHBlZXJfaWQpOworCQlicmVhazsKKwl9CisJY2FzZSBIVFRfVDJIX01TR19UWVBFX1NFQ19JTkQ6CisJeworCQl1aW50MTZfdCBwZWVyX2lkOworCQllbnVtIGh0dF9zZWNfdHlwZSBzZWNfdHlwZTsKKwkJaW50IGlzX3VuaWNhc3Q7CisKKwkJcGVlcl9pZCA9IEhUVF9TRUNfSU5EX1BFRVJfSURfR0VUKCptc2dfd29yZCk7CisJCXNlY190eXBlID0gSFRUX1NFQ19JTkRfU0VDX1RZUEVfR0VUKCptc2dfd29yZCk7CisJCWlzX3VuaWNhc3QgPSBIVFRfU0VDX0lORF9VTklDQVNUX0dFVCgqbXNnX3dvcmQpOworCQltc2dfd29yZCsrOyAgIC8qIHBvaW50IHRvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBNaWNoYWVsIGtleSAqLworCQlvbF9yeF9zZWNfaW5kX2hhbmRsZXIocGRldi0+dHhyeF9wZGV2LCBwZWVyX2lkLAorCQkJCSAgICAgIHNlY190eXBlLCBpc191bmljYXN0LCBtc2dfd29yZCwKKwkJCQkgICAgICBtc2dfd29yZCArIDIpOworCQlicmVhazsKKwl9CisJY2FzZSBIVFRfVDJIX01TR19UWVBFX01HTVRfVFhfQ09NUExfSU5EOgorCXsKKwkJc3RydWN0IGh0dF9tZ210X3R4X2NvbXBsX2luZCAqY29tcGxfbXNnOworCisJCWNvbXBsX21zZyA9CisJCQkoc3RydWN0IGh0dF9tZ210X3R4X2NvbXBsX2luZCAqKShtc2dfd29yZCArIDEpOworCisJCW9sX3R4X3NpbmdsZV9jb21wbGV0aW9uX2hhbmRsZXIocGRldi0+dHhyeF9wZGV2LAorCQkJCQkJY29tcGxfbXNnLT5zdGF0dXMsCisJCQkJCQljb21wbF9tc2ctPmRlc2NfaWQpOworCQlIVFRfVFhfU0NIRUQocGRldik7CisJCWJyZWFrOworCX0KKwljYXNlIEhUVF9UMkhfTVNHX1RZUEVfU1RBVFNfQ09ORjoKKwl7CisJCXVpbnQ2NF90IGNvb2tpZTsKKwkJdWludDhfdCAqc3RhdHNfaW5mb19saXN0OworCisJCWNvb2tpZSA9ICoobXNnX3dvcmQgKyAxKTsKKwkJY29va2llIHw9ICgodWludDY0X3QpICgqKG1zZ193b3JkICsgMikpKSA8PCAzMjsKKworCQlzdGF0c19pbmZvX2xpc3QgPSAodWludDhfdCAqKSAobXNnX3dvcmQgKyAzKTsKKwkJb2xfdHhyeF9md19zdGF0c19oYW5kbGVyKHBkZXYtPnR4cnhfcGRldiwgY29va2llLAorCQkJCQkgc3RhdHNfaW5mb19saXN0KTsKKwkJYnJlYWs7CisJfQorI2lmbmRlZiBSRU1PVkVfUEtUX0xPRworCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9QS1RMT0c6CisJeworCQl1aW50MzJfdCAqcGxfaGRyOworCQl1aW50MzJfdCBsb2dfdHlwZTsKKwkJcGxfaGRyID0gKG1zZ193b3JkICsgMSk7CisJCWxvZ190eXBlID0KKwkJCSgqKHBsX2hkciArIDEpICYgQVRIX1BLVExPR19IRFJfTE9HX1RZUEVfTUFTSykgPj4KKwkJCUFUSF9QS1RMT0dfSERSX0xPR19UWVBFX1NISUZUOworCQlpZiAoKGxvZ190eXBlID09IFBLVExPR19UWVBFX1RYX0NUUkwpCisJCSAgICB8fCAobG9nX3R5cGUgPT0gUEtUTE9HX1RZUEVfVFhfU1RBVCkKKwkJICAgIHx8IChsb2dfdHlwZSA9PSBQS1RMT0dfVFlQRV9UWF9NU0RVX0lEKQorCQkgICAgfHwgKGxvZ190eXBlID09IFBLVExPR19UWVBFX1RYX0ZSTV9IRFIpCisJCSAgICB8fCAobG9nX3R5cGUgPT0gUEtUTE9HX1RZUEVfVFhfVklSVF9BRERSKSkKKwkJCXdkaV9ldmVudF9oYW5kbGVyKFdESV9FVkVOVF9UWF9TVEFUVVMsCisJCQkJCSAgcGRldi0+dHhyeF9wZGV2LCBwbF9oZHIpOworCQllbHNlIGlmIChsb2dfdHlwZSA9PSBQS1RMT0dfVFlQRV9SQ19GSU5EKQorCQkJd2RpX2V2ZW50X2hhbmRsZXIoV0RJX0VWRU5UX1JBVEVfRklORCwKKwkJCQkJICBwZGV2LT50eHJ4X3BkZXYsIHBsX2hkcik7CisJCWVsc2UgaWYgKGxvZ190eXBlID09IFBLVExPR19UWVBFX1JDX1VQREFURSkKKwkJCXdkaV9ldmVudF9oYW5kbGVyKFdESV9FVkVOVF9SQVRFX1VQREFURSwKKwkJCQkJICBwZGV2LT50eHJ4X3BkZXYsIHBsX2hkcik7CisJCWVsc2UgaWYgKGxvZ190eXBlID09IFBLVExPR19UWVBFX1JYX1NUQVQpCisJCQl3ZGlfZXZlbnRfaGFuZGxlcihXRElfRVZFTlRfUlhfREVTQywKKwkJCQkJICBwZGV2LT50eHJ4X3BkZXYsIHBsX2hkcik7CisKKwkJYnJlYWs7CisJfQorI2VuZGlmCisJY2FzZSBIVFRfVDJIX01TR19UWVBFX1RYX0NSRURJVF9VUERBVEVfSU5EOgorCXsKKwkJdWludDMyX3QgaHR0X2NyZWRpdF9kZWx0YV9hYnM7CisJCWludDMyX3QgaHR0X2NyZWRpdF9kZWx0YTsKKwkJaW50IHNpZ247CisKKwkJaHR0X2NyZWRpdF9kZWx0YV9hYnMgPQorCQkJSFRUX1RYX0NSRURJVF9ERUxUQV9BQlNfR0VUKCptc2dfd29yZCk7CisJCXNpZ24gPSBIVFRfVFhfQ1JFRElUX1NJR05fQklUX0dFVCgqbXNnX3dvcmQpID8gLTEgOiAxOworCQlodHRfY3JlZGl0X2RlbHRhID0gc2lnbiAqIGh0dF9jcmVkaXRfZGVsdGFfYWJzOworCQlvbF90eF9jcmVkaXRfY29tcGxldGlvbl9oYW5kbGVyKHBkZXYtPnR4cnhfcGRldiwKKwkJCQkJCWh0dF9jcmVkaXRfZGVsdGEpOworCQlicmVhazsKKwl9CisKKwljYXNlIEhUVF9UMkhfTVNHX1RZUEVfV0RJX0lQQV9PUF9SRVNQT05TRToKKwl7CisJCXVpbnQ4X3Qgb3BfY29kZTsKKwkJdWludDE2X3QgbGVuOworCQl1aW50OF90ICpvcF9tc2dfYnVmZmVyOworCQl1aW50OF90ICptc2dfc3RhcnRfcHRyOworCisJCW1zZ19zdGFydF9wdHIgPSAodWludDhfdCAqKSBtc2dfd29yZDsKKwkJb3BfY29kZSA9CisJCQlIVFRfV0RJX0lQQV9PUF9SRVNQT05TRV9PUF9DT0RFX0dFVCgqbXNnX3dvcmQpOworCQltc2dfd29yZCsrOworCQlsZW4gPSBIVFRfV0RJX0lQQV9PUF9SRVNQT05TRV9SU1BfTEVOX0dFVCgqbXNnX3dvcmQpOworCisJCW9wX21zZ19idWZmZXIgPQorCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mCisJCQkJICAgICAgIChzdHJ1Y3QgaHR0X3dkaV9pcGFfb3BfcmVzcG9uc2VfdCkgKworCQkJCSAgICAgICBsZW4pOworCQlpZiAoIW9wX21zZ19idWZmZXIpIHsKKwkJCWNkZl9wcmludCgiT1BDT0RFIG1lc3NzYWdlIGJ1ZmZlciBhbGxvYyBmYWlsIik7CisJCQlicmVhazsKKwkJfQorCQljZGZfbWVtX2NvcHkob3BfbXNnX2J1ZmZlciwKKwkJCSAgICAgbXNnX3N0YXJ0X3B0ciwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBodHRfd2RpX2lwYV9vcF9yZXNwb25zZV90KSArCisJCQkgICAgIGxlbik7CisJCW9sX3R4cnhfaXBhX3VjX29wX3Jlc3BvbnNlKHBkZXYtPnR4cnhfcGRldiwKKwkJCQkJICAgb3BfbXNnX2J1ZmZlcik7CisJCWJyZWFrOworCX0KKworCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9GTE9XX1BPT0xfTUFQOgorCXsKKwkJdWludDhfdCBudW1fZmxvd3M7CisJCXN0cnVjdCBodHRfZmxvd19wb29sX21hcF9wYXlsb2FkX3QgKnBvb2xfbWFwX3BheW9hZDsKKworCQludW1fZmxvd3MgPSBIVFRfRkxPV19QT09MX01BUF9OVU1fRkxPV1NfR0VUKCptc2dfd29yZCk7CisKKwkJbXNnX3dvcmQrKzsKKwkJd2hpbGUgKG51bV9mbG93cykgeworCQkJcG9vbF9tYXBfcGF5b2FkID0gKHN0cnVjdCBodHRfZmxvd19wb29sX21hcF9wYXlsb2FkX3QgKikKKwkJCQkJCQkJbXNnX3dvcmQ7CisJCQlvbF90eF9mbG93X3Bvb2xfbWFwX2hhbmRsZXIocG9vbF9tYXBfcGF5b2FkLT5mbG93X2lkLAorCQkJCQlwb29sX21hcF9wYXlvYWQtPmZsb3dfdHlwZSwKKwkJCQkJcG9vbF9tYXBfcGF5b2FkLT5mbG93X3Bvb2xfaWQsCisJCQkJCXBvb2xfbWFwX3BheW9hZC0+Zmxvd19wb29sX3NpemUpOworCisJCQltc2dfd29yZCArPSAoSFRUX0ZMT1dfUE9PTF9NQVBfUEFZTE9BRF9TWiAvCisJCQkJCQkgSFRUX0ZMT1dfUE9PTF9NQVBfSEVBREVSX1NaKTsKKwkJCW51bV9mbG93cy0tOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9GTE9XX1BPT0xfVU5NQVA6CisJeworCQlzdHJ1Y3QgaHR0X2Zsb3dfcG9vbF91bm1hcF90ICpwb29sX251bWFwX3BheWxvYWQ7CisKKwkJcG9vbF9udW1hcF9wYXlsb2FkID0gKHN0cnVjdCBodHRfZmxvd19wb29sX3VubWFwX3QgKiltc2dfd29yZDsKKwkJb2xfdHhfZmxvd19wb29sX3VubWFwX2hhbmRsZXIocG9vbF9udW1hcF9wYXlsb2FkLT5mbG93X2lkLAorCQkJCQlwb29sX251bWFwX3BheWxvYWQtPmZsb3dfdHlwZSwKKwkJCQkJcG9vbF9udW1hcF9wYXlsb2FkLT5mbG93X3Bvb2xfaWQpOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9OworCS8qIEZyZWUgdGhlIGluZGljYXRpb24gYnVmZmVyICovCisJY2RmX25idWZfZnJlZShodHRfdDJoX21zZyk7Cit9CisKKy8qIEdlbmVyaWMgVGFyZ2V0IHRvIGhvc3QgTXNnL2V2ZW50ICBoYW5kbGVyICBmb3IgbG93IHByaW9yaXR5IG1lc3NhZ2VzCisgICBMb3cgcHJpb3JpdHkgbWVzc2FnZSBhcmUgaGFuZGxlciBpbiBhIGRpZmZlcmVudCBoYW5kbGVyIGNhbGxlZCBmcm9tCisgICB0aGlzIGZ1bmN0aW9uIC4gU28gdGhhdCB0aGUgbW9zdCBsaWtlbHkgc3VjY2VzIHBhdGggbGlrZSBSeCBhbmQKKyAgIFR4IGNvbXAgICBoYXMgbGl0dGxlIGNvZGUgICBmb290IHByaW50CisgKi8KK3ZvaWQgaHR0X3QyaF9tc2dfaGFuZGxlcih2b2lkICpjb250ZXh0LCBIVENfUEFDS0VUICpwa3QpCit7CisJc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYgPSAoc3RydWN0IGh0dF9wZGV2X3QgKiljb250ZXh0OworCWNkZl9uYnVmX3QgaHR0X3QyaF9tc2cgPSAoY2RmX25idWZfdCkgcGt0LT5wUGt0Q29udGV4dDsKKwl1aW50MzJfdCAqbXNnX3dvcmQ7CisJZW51bSBodHRfdDJoX21zZ190eXBlIG1zZ190eXBlOworCisJLyogY2hlY2sgZm9yIHN1Y2Nlc3NmdWwgbWVzc2FnZSByZWNlcHRpb24gKi8KKwlpZiAocGt0LT5TdGF0dXMgIT0gQV9PSykgeworCQlpZiAocGt0LT5TdGF0dXMgIT0gQV9FQ0FOQ0VMRUQpCisJCQlwZGV2LT5zdGF0cy5odGNfZXJyX2NudCsrOworCQljZGZfbmJ1Zl9mcmVlKGh0dF90MmhfbXNnKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBIVFRfUlhfUkVTVE9SRQorCWlmIChjZGZfdW5saWtlbHkocGRldi0+cnhfcmluZy5yeF9yZXNldCkpIHsKKwkJY2RmX3ByaW50KCJyeCByZXN0b3JlIC4uXG4iKTsKKwkJY2RmX25idWZfZnJlZShodHRfdDJoX21zZyk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCS8qIGNvbmZpcm0gYWxpZ25tZW50ICovCisJSFRUX0FTU0VSVDMoKCgodW5zaWduZWQgbG9uZyljZGZfbmJ1Zl9kYXRhKGh0dF90MmhfbXNnKSkgJiAweDMpID09IDApOworCisJbXNnX3dvcmQgPSAodWludDMyX3QgKikgY2RmX25idWZfZGF0YShodHRfdDJoX21zZyk7CisJbXNnX3R5cGUgPSBIVFRfVDJIX01TR19UWVBFX0dFVCgqbXNnX3dvcmQpOworCisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX0RFQlVHKQorCWNkZl9wcmludCgiJXMgJWQ6IG1zZ193b3JkIDB4JXggbXNnX3R5cGUgJWRcbiIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCAqbXNnX3dvcmQsIG1zZ190eXBlKTsKKyNlbmRpZgorCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9SWF9JTkQ6CisJeworCQl1bnNpZ25lZCBudW1fbXBkdV9yYW5nZXM7CisJCXVuc2lnbmVkIG51bV9tc2R1X2J5dGVzOworCQl1aW50MTZfdCBwZWVyX2lkOworCQl1aW50OF90IHRpZDsKKworCQlpZiAoY2RmX3VubGlrZWx5KHBkZXYtPmNmZy5pc19mdWxsX3Jlb3JkZXJfb2ZmbG9hZCkpIHsKKwkJCWNkZl9wcmludCgiSFRUX1QySF9NU0dfVFlQRV9SWF9JTkQgbm90IHN1cHBvcnRlZCAiKTsKKwkJCWNkZl9wcmludCgid2l0aCBmdWxsIHJlb3JkZXIgb2ZmbG9hZFxuIik7CisJCQlicmVhazsKKwkJfQorCQlwZWVyX2lkID0gSFRUX1JYX0lORF9QRUVSX0lEX0dFVCgqbXNnX3dvcmQpOworCQl0aWQgPSBIVFRfUlhfSU5EX0VYVF9USURfR0VUKCptc2dfd29yZCk7CisKKwkJbnVtX21zZHVfYnl0ZXMgPQorCQkJSFRUX1JYX0lORF9GV19SWF9ERVNDX0JZVEVTX0dFVCgKKwkJCQkqKG1zZ193b3JkICsgMiArIEhUVF9SWF9QUERVX0RFU0NfU0laRTMyKSk7CisJCS8qCisJCSAqIDEgd29yZCBmb3IgdGhlIG1lc3NhZ2UgaGVhZGVyLAorCQkgKiBIVFRfUlhfUFBEVV9ERVNDX1NJWkUzMiB3b3JkcyBmb3IgdGhlIEZXIHJ4IFBQRFUgZGVzYworCQkgKiAxIHdvcmQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIE1TRFUgYnl0ZXMsCisJCSAqIDEgd29yZCBmb3IgZXZlcnkgNCBNU0RVIGJ5dGVzIChyb3VuZCB1cCksCisJCSAqIDEgd29yZCBmb3IgdGhlIE1QRFUgcmFuZ2UgaGVhZGVyCisJCSAqLworCQlwZGV2LT5yeF9tcGR1X3JhbmdlX29mZnNldF93b3JkcyA9CisJCQkoSFRUX1JYX0lORF9IRFJfQllURVMgKyBudW1fbXNkdV9ieXRlcyArIDMpID4+IDI7CisJCW51bV9tcGR1X3JhbmdlcyA9CisJCQlIVFRfUlhfSU5EX05VTV9NUERVX1JBTkdFU19HRVQoKihtc2dfd29yZCArIDEpKTsKKwkJcGRldi0+cnhfaW5kX21zZHVfYnl0ZV9pZHggPSAwOworCisJCW9sX3J4X2luZGljYXRpb25faGFuZGxlcihwZGV2LT50eHJ4X3BkZXYsCisJCQkJCSBodHRfdDJoX21zZywgcGVlcl9pZCwKKwkJCQkJIHRpZCwgbnVtX21wZHVfcmFuZ2VzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9UWF9DT01QTF9JTkQ6CisJeworCQlpbnQgbnVtX21zZHVzOworCQllbnVtIGh0dF90eF9zdGF0dXMgc3RhdHVzOworCisJCS8qIHN0YXR1cyAtIG5vIGVudW0gdHJhbnNsYXRpb24gbmVlZGVkICovCisJCXN0YXR1cyA9IEhUVF9UWF9DT01QTF9JTkRfU1RBVFVTX0dFVCgqbXNnX3dvcmQpOworCQludW1fbXNkdXMgPSBIVFRfVFhfQ09NUExfSU5EX05VTV9HRVQoKm1zZ193b3JkKTsKKwkJaWYgKG51bV9tc2R1cyAmIDB4MSkgeworCQkJc3RydWN0IGh0dF90eF9jb21wbF9pbmRfYmFzZSAqY29tcGwgPQorCQkJCSh2b2lkICopbXNnX3dvcmQ7CisKKwkJCS8qCisJCQkgKiBIb3N0IENQVSBlbmRpYW5uZXNzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBGVyBDUFUuCisJCQkgKiBUaGlzIGNhbiByZXN1bHQgaW4gZXZlbiBhbmQgb2RkIE1TRFUgSURzIGJlaW5nCisJCQkgKiBzd2l0Y2hlZC4gSWYgdGhpcyBoYXBwZW5zLCBjb3B5IHRoZSBzd2l0Y2hlZCBmaW5hbAorCQkJICogb2RkIE1TRFUgSUQgZnJvbSBsb2NhdGlvbiBwYXlsb2FkW3NpemVdLCB0bworCQkJICogbG9jYXRpb24gcGF5bG9hZFtzaXplLTFdLCB3aGVyZSB0aGUgbWVzc2FnZQorCQkJICogaGFuZGxlciBmdW5jdGlvbiBleHBlY3RzIHRvIGZpbmQgaXQKKwkJCSAqLworCQkJaWYgKGNvbXBsLT5wYXlsb2FkW251bV9tc2R1c10gIT0KKwkJCSAgICBIVFRfVFhfQ09NUExfSU5WX01TRFVfSUQpIHsKKwkJCQljb21wbC0+cGF5bG9hZFtudW1fbXNkdXMgLSAxXSA9CisJCQkJCWNvbXBsLT5wYXlsb2FkW251bV9tc2R1c107CisJCQl9CisJCX0KKwkJb2xfdHhfY29tcGxldGlvbl9oYW5kbGVyKHBkZXYtPnR4cnhfcGRldiwgbnVtX21zZHVzLAorCQkJCQkgc3RhdHVzLCBtc2dfd29yZCArIDEpOworCQlIVFRfVFhfU0NIRUQocGRldik7CisJCWJyZWFrOworCX0KKwljYXNlIEhUVF9UMkhfTVNHX1RZUEVfUlhfUE5fSU5EOgorCXsKKwkJdWludDE2X3QgcGVlcl9pZDsKKwkJdWludDhfdCB0aWQsIHBuX2llX2NudCwgKnBuX2llID0gTlVMTDsKKwkJaW50IHNlcV9udW1fc3RhcnQsIHNlcV9udW1fZW5kOworCisJCS8qRmlyc3QgZHdvcmQgKi8KKwkJcGVlcl9pZCA9IEhUVF9SWF9QTl9JTkRfUEVFUl9JRF9HRVQoKm1zZ193b3JkKTsKKwkJdGlkID0gSFRUX1JYX1BOX0lORF9FWFRfVElEX0dFVCgqbXNnX3dvcmQpOworCisJCW1zZ193b3JkKys7CisJCS8qU2Vjb25kIGR3b3JkICovCisJCXNlcV9udW1fc3RhcnQgPQorCQkJSFRUX1JYX1BOX0lORF9TRVFfTlVNX1NUQVJUX0dFVCgqbXNnX3dvcmQpOworCQlzZXFfbnVtX2VuZCA9IEhUVF9SWF9QTl9JTkRfU0VRX05VTV9FTkRfR0VUKCptc2dfd29yZCk7CisJCXBuX2llX2NudCA9IEhUVF9SWF9QTl9JTkRfUE5fSUVfQ05UX0dFVCgqbXNnX3dvcmQpOworCisJCW1zZ193b3JkKys7CisJCS8qVGhpcmQgZHdvcmQgKi8KKwkJaWYgKHBuX2llX2NudCkKKwkJCXBuX2llID0gKHVpbnQ4X3QgKikgbXNnX3dvcmQ7CisKKwkJb2xfcnhfcG5faW5kX2hhbmRsZXIocGRldi0+dHhyeF9wZGV2LCBwZWVyX2lkLCB0aWQsCisJCQkJICAgICBzZXFfbnVtX3N0YXJ0LCBzZXFfbnVtX2VuZCwKKwkJCQkgICAgIHBuX2llX2NudCwgcG5faWUpOworCisJCWJyZWFrOworCX0KKwljYXNlIEhUVF9UMkhfTVNHX1RZUEVfVFhfSU5TUEVDVF9JTkQ6CisJeworCQlpbnQgbnVtX21zZHVzOworCisJCW51bV9tc2R1cyA9IEhUVF9UWF9DT01QTF9JTkRfTlVNX0dFVCgqbXNnX3dvcmQpOworCQlpZiAobnVtX21zZHVzICYgMHgxKSB7CisJCQlzdHJ1Y3QgaHR0X3R4X2NvbXBsX2luZF9iYXNlICpjb21wbCA9CisJCQkJKHZvaWQgKiltc2dfd29yZDsKKworCQkJLyoKKwkJCSAqIEhvc3QgQ1BVIGVuZGlhbm5lc3MgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEZXIENQVS4KKwkJCSAqIFRoaXMgY2FuIHJlc3VsdCBpbiBldmVuIGFuZCBvZGQgTVNEVSBJRHMgYmVpbmcKKwkJCSAqIHN3aXRjaGVkLiBJZiB0aGlzIGhhcHBlbnMsIGNvcHkgdGhlIHN3aXRjaGVkIGZpbmFsCisJCQkgKiBvZGQgTVNEVSBJRCBmcm9tIGxvY2F0aW9uIHBheWxvYWRbc2l6ZV0sIHRvCisJCQkgKiBsb2NhdGlvbiBwYXlsb2FkW3NpemUtMV0sIHdoZXJlIHRoZSBtZXNzYWdlIGhhbmRsZXIKKwkJCSAqIGZ1bmN0aW9uIGV4cGVjdHMgdG8gZmluZCBpdAorCQkJICovCisJCQlpZiAoY29tcGwtPnBheWxvYWRbbnVtX21zZHVzXSAhPQorCQkJICAgIEhUVF9UWF9DT01QTF9JTlZfTVNEVV9JRCkgeworCQkJCWNvbXBsLT5wYXlsb2FkW251bV9tc2R1cyAtIDFdID0KKwkJCQkJY29tcGwtPnBheWxvYWRbbnVtX21zZHVzXTsKKwkJCX0KKwkJfQorCQlvbF90eF9pbnNwZWN0X2hhbmRsZXIocGRldi0+dHhyeF9wZGV2LCBudW1fbXNkdXMsCisJCQkJICAgICAgbXNnX3dvcmQgKyAxKTsKKwkJSFRUX1RYX1NDSEVEKHBkZXYpOworCQlicmVhazsKKwl9CisJY2FzZSBIVFRfVDJIX01TR19UWVBFX1JYX0lOX09SRF9QQUREUl9JTkQ6CisJeworCQl1aW50MTZfdCBwZWVyX2lkOworCQl1aW50OF90IHRpZDsKKwkJdWludDhfdCBvZmZsb2FkX2luZCwgZnJhZ19pbmQ7CisKKwkJaWYgKGNkZl91bmxpa2VseSghcGRldi0+Y2ZnLmlzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkKSkgeworCQkJY2RmX3ByaW50KCJIVFRfVDJIX01TR19UWVBFX1JYX0lOX09SRF9QQUREUl9JTkQgbm90ICIpOworCQkJY2RmX3ByaW50KCJzdXBwb3J0ZWQgd2hlbiBmdWxsIHJlb3JkZXIgb2ZmbG9hZCBpcyAiKTsKKwkJCWNkZl9wcmludCgiZGlzYWJsZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcGVlcl9pZCA9IEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BFRVJfSURfR0VUKCptc2dfd29yZCk7CisJCXRpZCA9IEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0VYVF9USURfR0VUKCptc2dfd29yZCk7CisJCW9mZmxvYWRfaW5kID0gSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfT0ZGTE9BRF9HRVQoKm1zZ193b3JkKTsKKwkJZnJhZ19pbmQgPSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9GUkFHX0dFVCgqbXNnX3dvcmQpOworCisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX0RFQlVHKQorCQljZGZfcHJpbnQoIiVzICVkOiBwZWVyaWQgJWQgdGlkICVkIG9mZmxvYWRpbmQgJWQgZnJhZ2luZCAlZFxuIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBwZWVyX2lkLCB0aWQsIG9mZmxvYWRfaW5kLAorCQkJICBmcmFnX2luZCk7CisjZW5kaWYKKwkJaWYgKGNkZl91bmxpa2VseShmcmFnX2luZCkpIHsKKwkJCW9sX3J4X2ZyYWdfaW5kaWNhdGlvbl9oYW5kbGVyKHBkZXYtPnR4cnhfcGRldiwKKwkJCQkJCSAgICAgIGh0dF90MmhfbXNnLAorCQkJCQkJICAgICAgcGVlcl9pZCwgdGlkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJb2xfcnhfaW5fb3JkZXJfaW5kaWNhdGlvbl9oYW5kbGVyKHBkZXYtPnR4cnhfcGRldiwKKwkJCQkJCSAgaHR0X3QyaF9tc2csIHBlZXJfaWQsCisJCQkJCQkgIHRpZCwgb2ZmbG9hZF9pbmQpOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlodHRfdDJoX2xwX21zZ19oYW5kbGVyKGNvbnRleHQsIGh0dF90MmhfbXNnKTsKKwkJcmV0dXJuOworCisJfTsKKworCS8qIEZyZWUgdGhlIGluZGljYXRpb24gYnVmZmVyICovCisJY2RmX25idWZfZnJlZShodHRfdDJoX21zZyk7Cit9CisKKy8qLS0tIHRhcmdldC0+aG9zdCBIVFQgbWVzc2FnZSBJbmZvIEVsZW1lbnQgYWNjZXNzIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0gdHggY29tcGxldGlvbiBtZXNzYWdlIC0tLSovCisKK3VpbnQxNl90IGh0dF90eF9jb21wbF9kZXNjX2lkKHZvaWQgKml0ZXJhdG9yLCBpbnQgbnVtKQoreworCS8qCisJICogVGhlIE1TRFUgSURzIGFyZSBwYWNrZWQgLCAyIHBlciAzMi1iaXQgd29yZC4KKwkgKiBJdGVyYXRlIG9uIHRoZW0gYXMgYW4gYXJyYXkgb2YgMTYtYml0IGVsZW1lbnRzLgorCSAqIFRoaXMgd2lsbCB3b3JrIGZpbmUgaWYgdGhlIGhvc3QgZW5kaWFubmVzcyBtYXRjaGVzCisJICogdGhlIHRhcmdldCBlbmRpYW5uZXNzLgorCSAqIElmIHRoZSBob3N0IGVuZGlhbm5lc3MgaXMgb3Bwb3NpdGUgb2YgdGhlIHRhcmdldCdzLAorCSAqIHRoaXMgaXRlcmF0b3Igd2lsbCBwcm9kdWNlIGRlc2NyaXB0b3IgSURzIGluIGEgZGlmZmVyZW50CisJICogb3JkZXIgdGhhbiB0aGUgdGFyZ2V0IGluc2VydGVkIHRoZW0gaW50byB0aGUgbWVzc2FnZSAtCisJICogaWYgdGhlIHRhcmdldCBwdXRzIGluIFswLCAxLCAyLCAzLCAuLi5dIHRoZSBob3N0IHdpbGwKKwkgKiBwdXQgb3V0IFsxLCAwLCAzLCAyLCAuLi5dLgorCSAqIFRoaXMgaXMgZmluZSwgZXhjZXB0IGZvciB0aGUgbGFzdCBJRCBpZiB0aGVyZSBhcmUgYW4KKwkgKiBvZGQgbnVtYmVyIG9mIElEcy4gIEJ1dCB0aGUgVFhfQ09NUExfSU5EIGhhbmRsaW5nIGNvZGUKKwkgKiBpbiB0aGUgaHR0X3QyaF9tc2dfaGFuZGxlciBhbHJlYWR5IGFkZGVkIGEgZHVwbGljYXRlCisJICogb2YgdGhlIGZpbmFsIElELCBpZiB0aGVyZSB3ZXJlIGFuIG9kZCBudW1iZXIgb2YgSURzLAorCSAqIHNvIHRoaXMgZnVuY3Rpb24gY2FuIHNhZmVseSB0cmVhdCB0aGUgSURzIGFzIGFuIGFycmF5CisJICogb2YgMTYtYml0IGVsZW1lbnRzLgorCSAqLworCXJldHVybiAqKCgodWludDE2X3QgKikgaXRlcmF0b3IpICsgbnVtKTsKK30KKworLyotLS0gcnggaW5kaWNhdGlvbiBtZXNzYWdlIC0tLSovCisKK2ludCBodHRfcnhfaW5kX2ZsdXNoKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IHJ4X2luZF9tc2cpCit7CisJdWludDMyX3QgKm1zZ193b3JkOworCisJbXNnX3dvcmQgPSAodWludDMyX3QgKikgY2RmX25idWZfZGF0YShyeF9pbmRfbXNnKTsKKwlyZXR1cm4gSFRUX1JYX0lORF9GTFVTSF9WQUxJRF9HRVQoKm1zZ193b3JkKTsKK30KKwordm9pZAoraHR0X3J4X2luZF9mbHVzaF9zZXFfbnVtX3JhbmdlKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJICAgICAgIGNkZl9uYnVmX3QgcnhfaW5kX21zZywKKwkJCSAgICAgICB1bnNpZ25lZCAqc2VxX251bV9zdGFydCwgdW5zaWduZWQgKnNlcV9udW1fZW5kKQoreworCXVpbnQzMl90ICptc2dfd29yZDsKKworCW1zZ193b3JkID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEocnhfaW5kX21zZyk7CisJbXNnX3dvcmQrKzsKKwkqc2VxX251bV9zdGFydCA9IEhUVF9SWF9JTkRfRkxVU0hfU0VRX05VTV9TVEFSVF9HRVQoKm1zZ193b3JkKTsKKwkqc2VxX251bV9lbmQgPSBIVFRfUlhfSU5EX0ZMVVNIX1NFUV9OVU1fRU5EX0dFVCgqbXNnX3dvcmQpOworfQorCitpbnQgaHR0X3J4X2luZF9yZWxlYXNlKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IHJ4X2luZF9tc2cpCit7CisJdWludDMyX3QgKm1zZ193b3JkOworCisJbXNnX3dvcmQgPSAodWludDMyX3QgKikgY2RmX25idWZfZGF0YShyeF9pbmRfbXNnKTsKKwlyZXR1cm4gSFRUX1JYX0lORF9SRUxfVkFMSURfR0VUKCptc2dfd29yZCk7Cit9CisKK3ZvaWQKK2h0dF9yeF9pbmRfcmVsZWFzZV9zZXFfbnVtX3JhbmdlKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSBjZGZfbmJ1Zl90IHJ4X2luZF9tc2csCisJCQkJIHVuc2lnbmVkICpzZXFfbnVtX3N0YXJ0LCB1bnNpZ25lZCAqc2VxX251bV9lbmQpCit7CisJdWludDMyX3QgKm1zZ193b3JkOworCisJbXNnX3dvcmQgPSAodWludDMyX3QgKikgY2RmX25idWZfZGF0YShyeF9pbmRfbXNnKTsKKwltc2dfd29yZCsrOworCSpzZXFfbnVtX3N0YXJ0ID0gSFRUX1JYX0lORF9SRUxfU0VRX05VTV9TVEFSVF9HRVQoKm1zZ193b3JkKTsKKwkqc2VxX251bV9lbmQgPSBIVFRfUlhfSU5EX1JFTF9TRVFfTlVNX0VORF9HRVQoKm1zZ193b3JkKTsKK30KKwordm9pZAoraHR0X3J4X2luZF9tcGR1X3JhbmdlX2luZm8oc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsCisJCQkgICBjZGZfbmJ1Zl90IHJ4X2luZF9tc2csCisJCQkgICBpbnQgbXBkdV9yYW5nZV9udW0sCisJCQkgICBlbnVtIGh0dF9yeF9zdGF0dXMgKnN0YXR1cywgaW50ICptcGR1X2NvdW50KQoreworCXVpbnQzMl90ICptc2dfd29yZDsKKworCW1zZ193b3JkID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEocnhfaW5kX21zZyk7CisJbXNnX3dvcmQgKz0gcGRldi0+cnhfbXBkdV9yYW5nZV9vZmZzZXRfd29yZHMgKyBtcGR1X3JhbmdlX251bTsKKwkqc3RhdHVzID0gSFRUX1JYX0lORF9NUERVX1NUQVRVU19HRVQoKm1zZ193b3JkKTsKKwkqbXBkdV9jb3VudCA9IEhUVF9SWF9JTkRfTVBEVV9DT1VOVF9HRVQoKm1zZ193b3JkKTsKK30KKworLyoqCisgKiBodHRfcnhfaW5kX3Jzc2lfZGJtKCkgLSBSZXR1cm4gdGhlIFJTU0kgcHJvdmlkZWQgaW4gYSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UuCisgKgorICogQHBkZXY6ICAgICAgIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcnhfaW5kX21zZzogdGhlIG5ldGJ1ZiBjb250YWluaW5nIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm4gdGhlIFJTU0kgZnJvbSBhbiByeCBpbmRpY2F0aW9uIG1lc3NhZ2UsIGluIGRCbSB1bml0cy4KKyAqCisgKiBSZXR1cm46IFJTU0kgaW4gZEJtLCBvciBIVFRfSU5WQUxJRF9SU1NJCisgKi8KK2ludDE2X3QgaHR0X3J4X2luZF9yc3NpX2RibShodHRfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCByeF9pbmRfbXNnKQoreworCWludDhfdCByc3NpOworCXVpbnQzMl90ICptc2dfd29yZDsKKworCW1zZ193b3JkID0gKHVpbnQzMl90ICopCisJCSAgIChjZGZfbmJ1Zl9kYXRhKHJ4X2luZF9tc2cpICsKKwkJICAgIEhUVF9SWF9JTkRfRldfUlhfUFBEVV9ERVNDX0JZVEVfT0ZGU0VUKTsKKworCS8qIGNoZWNrIGlmIHRoZSBSWF9JTkQgbWVzc2FnZSBjb250YWlucyB2YWxpZCByeCBQUERVIHN0YXJ0IGluZm8gKi8KKwlpZiAoIUhUVF9SWF9JTkRfU1RBUlRfVkFMSURfR0VUKCptc2dfd29yZCkpCisJCXJldHVybiBIVFRfUlNTSV9JTlZBTElEOworCisJcnNzaSA9IEhUVF9SWF9JTkRfUlNTSV9DTUJfR0VUKCptc2dfd29yZCk7CisJcmV0dXJuIChIVFRfVEdUX1JTU0lfSU5WQUxJRCA9PSByc3NpKSA/CisJICAgICAgIEhUVF9SU1NJX0lOVkFMSUQgOiByc3NpOworfQorCisvKioKKyAqIGh0dF9yeF9pbmRfcnNzaV9kYm1fY2hhaW4oKSAtIFJldHVybiB0aGUgUlNTSSBmb3IgYSBjaGFpbiBwcm92aWRlZCBpbiBhIHJ4CisgKiAgICAgICAgICAgICAgaW5kaWNhdGlvbiBtZXNzYWdlLgorICogQHBkZXY6ICAgICAgIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcnhfaW5kX21zZzogdGhlIG5ldGJ1ZiBjb250YWluaW5nIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqIEBjaGFpbjogICAgICB0aGUgaW5kZXggb2YgdGhlIGNoYWluICgwLTQpCisgKgorICogUmV0dXJuIHRoZSBSU1NJIGZvciBhIGNoYWluIGZyb20gYW4gcnggaW5kaWNhdGlvbiBtZXNzYWdlLCBpbiBkQm0gdW5pdHMuCisgKgorICogUmV0dXJuOiBSU1NJLCBvciBIVFRfSU5WQUxJRF9SU1NJCisgKi8KK2ludDE2X3QKK2h0dF9yeF9pbmRfcnNzaV9kYm1fY2hhaW4oaHR0X3BkZXZfaGFuZGxlIHBkZXYsIGNkZl9uYnVmX3QgcnhfaW5kX21zZywKKwkJICAgICAgaW50OF90IGNoYWluKQoreworCWludDhfdCByc3NpOworCXVpbnQzMl90ICptc2dfd29yZDsKKworCWlmIChjaGFpbiA8IDAgfHwgY2hhaW4gPiAzKQorCQlyZXR1cm4gSFRUX1JTU0lfSU5WQUxJRDsKKworCW1zZ193b3JkID0gKHVpbnQzMl90ICopCisJCShjZGZfbmJ1Zl9kYXRhKHJ4X2luZF9tc2cpICsKKwkJIEhUVF9SWF9JTkRfRldfUlhfUFBEVV9ERVNDX0JZVEVfT0ZGU0VUKTsKKworCS8qIGNoZWNrIGlmIHRoZSBSWF9JTkQgbWVzc2FnZSBjb250YWlucyB2YWxpZCByeCBQUERVIHN0YXJ0IGluZm8gKi8KKwlpZiAoIUhUVF9SWF9JTkRfU1RBUlRfVkFMSURfR0VUKCptc2dfd29yZCkpCisJCXJldHVybiBIVFRfUlNTSV9JTlZBTElEOworCisJbXNnX3dvcmQgKz0gMSArIGNoYWluOworCisJcnNzaSA9IEhUVF9SWF9JTkRfUlNTSV9QUkkyMF9HRVQoKm1zZ193b3JkKTsKKwlyZXR1cm4gKEhUVF9UR1RfUlNTSV9JTlZBTElEID09IHJzc2kpID8KKwkJSFRUX1JTU0lfSU5WQUxJRCA6CisJCXJzc2k7Cit9CisKKy8qKgorICogaHR0X3J4X2luZF9sZWdhY3lfcmF0ZSgpIC0gUmV0dXJuIHRoZSBkYXRhIHJhdGUKKyAqIEBwZGV2OiAgICAgICAgdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEByeF9pbmRfbXNnOiAgdGhlIG5ldGJ1ZiBjb250YWluaW5nIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqIEBsZWdhY3lfcmF0ZTogKG91dHB1dCkgdGhlIGRhdGEgcmF0ZQorICogICAgICBUaGUgbGVnYWN5X3JhdGUgcGFyYW1ldGVyJ3MgdmFsdWUgZGVwZW5kcyBvbiB0aGUKKyAqICAgICAgbGVnYWN5X3JhdGVfc2VsIHZhbHVlLgorICogICAgICBJZiBsZWdhY3lfcmF0ZV9zZWwgaXMgMDoKKyAqICAgICAgICAgICAgICAweDg6IE9GRE0gNDggTWJwcworICogICAgICAgICAgICAgIDB4OTogT0ZETSAyNCBNYnBzCisgKiAgICAgICAgICAgICAgMHhBOiBPRkRNIDEyIE1icHMKKyAqICAgICAgICAgICAgICAweEI6IE9GRE0gNiBNYnBzCisgKiAgICAgICAgICAgICAgMHhDOiBPRkRNIDU0IE1icHMKKyAqICAgICAgICAgICAgICAweEQ6IE9GRE0gMzYgTWJwcworICogICAgICAgICAgICAgIDB4RTogT0ZETSAxOCBNYnBzCisgKiAgICAgICAgICAgICAgMHhGOiBPRkRNIDkgTWJwcworICogICAgICBJZiBsZWdhY3lfcmF0ZV9zZWwgaXMgMToKKyAqICAgICAgICAgICAgICAweDg6IENDSyAxMSBNYnBzIGxvbmcgcHJlYW1ibGUKKyAqICAgICAgICAgICAgICAweDk6IENDSyA1LjUgTWJwcyBsb25nIHByZWFtYmxlCisgKiAgICAgICAgICAgICAgMHhBOiBDQ0sgMiBNYnBzIGxvbmcgcHJlYW1ibGUKKyAqICAgICAgICAgICAgICAweEI6IENDSyAxIE1icHMgbG9uZyBwcmVhbWJsZQorICogICAgICAgICAgICAgIDB4QzogQ0NLIDExIE1icHMgc2hvcnQgcHJlYW1ibGUKKyAqICAgICAgICAgICAgICAweEQ6IENDSyA1LjUgTWJwcyBzaG9ydCBwcmVhbWJsZQorICogICAgICAgICAgICAgIDB4RTogQ0NLIDIgTWJwcyBzaG9ydCBwcmVhbWJsZQorICogICAgICAtMSBvbiBlcnJvci4KKyAqIEBsZWdhY3lfcmF0ZV9zZWw6IChvdXRwdXQpIDAgdG8gaW5kaWNhdGUgT0ZETSwgMSB0byBpbmRpY2F0ZSBDQ0suCisgKiAgICAgIC0xIG9uIGVycm9yLgorICoKKyAqIFJldHVybiB0aGUgZGF0YSByYXRlIHByb3ZpZGVkIGluIGEgcnggaW5kaWNhdGlvbiBtZXNzYWdlLgorICovCit2b2lkCitodHRfcnhfaW5kX2xlZ2FjeV9yYXRlKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IHJ4X2luZF9tc2csCisJCSAgICAgICB1aW50OF90ICpsZWdhY3lfcmF0ZSwgdWludDhfdCAqbGVnYWN5X3JhdGVfc2VsKQoreworCXVpbnQzMl90ICptc2dfd29yZDsKKworCW1zZ193b3JkID0gKHVpbnQzMl90ICopCisJCShjZGZfbmJ1Zl9kYXRhKHJ4X2luZF9tc2cpICsKKwkJIEhUVF9SWF9JTkRfRldfUlhfUFBEVV9ERVNDX0JZVEVfT0ZGU0VUKTsKKworCS8qIGNoZWNrIGlmIHRoZSBSWF9JTkQgbWVzc2FnZSBjb250YWlucyB2YWxpZCByeCBQUERVIHN0YXJ0IGluZm8gKi8KKwlpZiAoIUhUVF9SWF9JTkRfU1RBUlRfVkFMSURfR0VUKCptc2dfd29yZCkpIHsKKwkJKmxlZ2FjeV9yYXRlID0gLTE7CisJCSpsZWdhY3lfcmF0ZV9zZWwgPSAtMTsKKwkJcmV0dXJuOworCX0KKworCSpsZWdhY3lfcmF0ZSA9IEhUVF9SWF9JTkRfTEVHQUNZX1JBVEVfR0VUKCptc2dfd29yZCk7CisJKmxlZ2FjeV9yYXRlX3NlbCA9IEhUVF9SWF9JTkRfTEVHQUNZX1JBVEVfU0VMX0dFVCgqbXNnX3dvcmQpOworfQorCisvKioKKyAqIGh0dF9yeF9pbmRfdGltZXN0YW1wKCkgLSBSZXR1cm4gdGhlIHRpbWVzdGFtcAorICogQHBkZXY6ICAgICAgICAgICAgICAgICAgdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEByeF9pbmRfbXNnOiAgICAgICAgICAgIHRoZSBuZXRidWYgY29udGFpbmluZyB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBAdGltZXN0YW1wX21pY3Jvc2VjOiAgICAob3V0cHV0KSB0aGUgdGltZXN0YW1wIHRvIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAtMSBvbiBlcnJvci4KKyAqIEB0aW1lc3RhbXBfc3VibWljcm9zZWM6IHRoZSBzdWJtaWNyb3NlY29uZCBwb3J0aW9uIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLiAtMSBvbiBlcnJvci4KKyAqCisgKiBSZXR1cm4gdGhlIHRpbWVzdGFtcCBwcm92aWRlZCBpbiBhIHJ4IGluZGljYXRpb24gbWVzc2FnZS4KKyAqLwordm9pZAoraHR0X3J4X2luZF90aW1lc3RhbXAoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIGNkZl9uYnVmX3QgcnhfaW5kX21zZywKKwkJICAgICB1aW50MzJfdCAqdGltZXN0YW1wX21pY3Jvc2VjLAorCQkgICAgIHVpbnQ4X3QgKnRpbWVzdGFtcF9zdWJtaWNyb3NlYykKK3sKKwl1aW50MzJfdCAqbXNnX3dvcmQ7CisKKwltc2dfd29yZCA9ICh1aW50MzJfdCAqKQorCQkoY2RmX25idWZfZGF0YShyeF9pbmRfbXNnKSArCisJCSBIVFRfUlhfSU5EX0ZXX1JYX1BQRFVfREVTQ19CWVRFX09GRlNFVCk7CisKKwkvKiBjaGVjayBpZiB0aGUgUlhfSU5EIG1lc3NhZ2UgY29udGFpbnMgdmFsaWQgcnggUFBEVSBzdGFydCBpbmZvICovCisJaWYgKCFIVFRfUlhfSU5EX0VORF9WQUxJRF9HRVQoKm1zZ193b3JkKSkgeworCQkqdGltZXN0YW1wX21pY3Jvc2VjID0gLTE7CisJCSp0aW1lc3RhbXBfc3VibWljcm9zZWMgPSAtMTsKKwkJcmV0dXJuOworCX0KKworCSp0aW1lc3RhbXBfbWljcm9zZWMgPSAqKG1zZ193b3JkICsgNik7CisJKnRpbWVzdGFtcF9zdWJtaWNyb3NlYyA9CisJCUhUVF9SWF9JTkRfVElNRVNUQU1QX1NVQk1JQ1JPU0VDX0dFVCgqbXNnX3dvcmQpOworfQorCisjZGVmaW5lIElOVkFMSURfVFNGIC0xCisvKioKKyAqIGh0dF9yeF9pbmRfdHNmMzIoKSAtIFJldHVybiB0aGUgVFNGIHRpbWVzdGFtcAorICogQHBkZXY6ICAgICAgIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcnhfaW5kX21zZzogdGhlIG5ldGJ1ZiBjb250YWluaW5nIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm4gdGhlIFRTRiB0aW1lc3RhbXAgcHJvdmlkZWQgaW4gYSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UuCisgKgorICogUmV0dXJuOiBUU0YgdGltZXN0YW1wCisgKi8KK3VpbnQzMl90CitodHRfcnhfaW5kX3RzZjMyKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IHJ4X2luZF9tc2cpCit7CisJdWludDMyX3QgKm1zZ193b3JkOworCisJbXNnX3dvcmQgPSAodWludDMyX3QgKikKKwkJKGNkZl9uYnVmX2RhdGEocnhfaW5kX21zZykgKworCQkgSFRUX1JYX0lORF9GV19SWF9QUERVX0RFU0NfQllURV9PRkZTRVQpOworCisJLyogY2hlY2sgaWYgdGhlIFJYX0lORCBtZXNzYWdlIGNvbnRhaW5zIHZhbGlkIHJ4IFBQRFUgc3RhcnQgaW5mbyAqLworCWlmICghSFRUX1JYX0lORF9FTkRfVkFMSURfR0VUKCptc2dfd29yZCkpCisJCXJldHVybiBJTlZBTElEX1RTRjsKKworCXJldHVybiAqKG1zZ193b3JkICsgNSk7Cit9CisKKy8qKgorICogaHR0X3J4X2luZF9leHRfdGlkKCkgLSBSZXR1cm4gdGhlIGV4dGVuZGVkIHRyYWZmaWMgSUQgcHJvdmlkZWQgaW4gYSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UuCisgKiBAcGRldjogICAgICAgdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEByeF9pbmRfbXNnOiB0aGUgbmV0YnVmIGNvbnRhaW5pbmcgdGhlIHJ4IGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqIFJldHVybiB0aGUgZXh0ZW5kZWQgdHJhZmZpYyBJRCBpbiBhIHJ4IGluZGljYXRpb24gbWVzc2FnZS4KKyAqCisgKiBSZXR1cm46IEV4dGVuZGVkIFRJRAorICovCit1aW50OF90CitodHRfcnhfaW5kX2V4dF90aWQoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIGNkZl9uYnVmX3QgcnhfaW5kX21zZykKK3sKKwl1aW50MzJfdCAqbXNnX3dvcmQ7CisKKwltc2dfd29yZCA9ICh1aW50MzJfdCAqKQorCQkoY2RmX25idWZfZGF0YShyeF9pbmRfbXNnKSk7CisKKwlyZXR1cm4gSFRUX1JYX0lORF9FWFRfVElEX0dFVCgqbXNnX3dvcmQpOworfQorCisvKi0tLSBzdGF0cyBjb25maXJtYXRpb24gbWVzc2FnZSAtLS0qLworCit2b2lkCitodHRfdDJoX2RiZ19zdGF0c19oZHJfcGFyc2UodWludDhfdCAqc3RhdHNfaW5mb19saXN0LAorCQkJICAgIGVudW0gaHR0X2RiZ19zdGF0c190eXBlICp0eXBlLAorCQkJICAgIGVudW0gaHR0X2RiZ19zdGF0c19zdGF0dXMgKnN0YXR1cywKKwkJCSAgICBpbnQgKmxlbmd0aCwgdWludDhfdCAqKnN0YXRzX2RhdGEpCit7CisJdWludDMyX3QgKm1zZ193b3JkID0gKHVpbnQzMl90ICopIHN0YXRzX2luZm9fbGlzdDsKKwkqdHlwZSA9IEhUVF9UMkhfU1RBVFNfQ09ORl9UTFZfVFlQRV9HRVQoKm1zZ193b3JkKTsKKwkqc3RhdHVzID0gSFRUX1QySF9TVEFUU19DT05GX1RMVl9TVEFUVVNfR0VUKCptc2dfd29yZCk7CisJKmxlbmd0aCA9IEhUVF9UMkhfU1RBVFNfQ09ORl9UTFZfSERSX1NJWkUgKyAgICAgLyogaGVhZGVyIGxlbmd0aCAqLworCQlIVFRfVDJIX1NUQVRTX0NPTkZfVExWX0xFTkdUSF9HRVQoKm1zZ193b3JkKTsgLyogZGF0YSBsZW4gKi8KKwkqc3RhdHNfZGF0YSA9IHN0YXRzX2luZm9fbGlzdCArIEhUVF9UMkhfU1RBVFNfQ09ORl9UTFZfSERSX1NJWkU7Cit9CisKK3ZvaWQKK2h0dF9yeF9mcmFnX2luZF9mbHVzaF9zZXFfbnVtX3JhbmdlKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSAgICBjZGZfbmJ1Zl90IHJ4X2ZyYWdfaW5kX21zZywKKwkJCQkgICAgaW50ICpzZXFfbnVtX3N0YXJ0LCBpbnQgKnNlcV9udW1fZW5kKQoreworCXVpbnQzMl90ICptc2dfd29yZDsKKworCW1zZ193b3JkID0gKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEocnhfZnJhZ19pbmRfbXNnKTsKKwltc2dfd29yZCsrOworCSpzZXFfbnVtX3N0YXJ0ID0gSFRUX1JYX0ZSQUdfSU5EX0ZMVVNIX1NFUV9OVU1fU1RBUlRfR0VUKCptc2dfd29yZCk7CisJKnNlcV9udW1fZW5kID0gSFRUX1JYX0ZSQUdfSU5EX0ZMVVNIX1NFUV9OVU1fRU5EX0dFVCgqbXNnX3dvcmQpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9kcC9odHQvaHR0X3R4LmMgYi9jb3JlL2RwL2h0dC9odHRfdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzI1Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9odHQvaHR0X3R4LmMKQEAgLTAsMCArMSw4NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGZpbGUgaHR0X3R4LmMKKyAqIEBicmllZiBJbXBsZW1lbnQgdHJhbnNtaXQgYXNwZWN0cyBvZiBIVFQuCisgKiBAZGV0YWlscworICogIFRoaXMgZmlsZSBjb250YWlucyB0aHJlZSBjYXRlZ29yaWVzIG9mIEhUVCB0eCBjb2RlOgorICogIDEuICBBbiBhYnN0cmFjdGlvbiBvZiB0aGUgdHggZGVzY3JpcHRvciwgdG8gaGlkZSB0aGUKKyAqICAgICAgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgSEwgdnMuIExMIHR4IGRlc2NyaXB0b3IuCisgKiAgMi4gIEZ1bmN0aW9ucyBmb3IgYWxsb2NhdGluZyBhbmQgZnJlZWluZyBIVFQgdHggZGVzY3JpcHRvcnMuCisgKiAgMy4gIFRoZSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSB0eCBmcmFtZSBmcm9tIHR4cnggYW5kIHNlbmRzIHRoZQorICogICAgICB0eCBmcmFtZSB0byBIVEMuCisgKi8KKyNpbmNsdWRlIDxvc2RlcC5oPiAgICAgICAgICAgICAgLyogdWludDMyX3QsIG9mZnNldG9mLCBldGMuICovCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+ICAgICAgICAgIC8qIGNkZl9kbWFfYWRkcl90ICovCisjaW5jbHVkZSA8Y2RmX21lbW9yeS5oPiAgICAgICAgIC8qIGNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudCBldCBhbCAqLworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90LCBldGMuICovCisjaW5jbHVkZSA8Y2RmX3RpbWUuaD4gICAgICAgICAgIC8qIGNkZl9tZGVsYXkgKi8KKworI2luY2x1ZGUgPGh0dC5oPiAgICAgICAgICAgICAgICAvKiBodHRfdHhfbXNkdV9kZXNjX3QgKi8KKyNpbmNsdWRlIDxodGMuaD4gICAgICAgICAgICAgICAgLyogSFRDX0hEUl9MRU5HVEggKi8KKyNpbmNsdWRlIDxodGNfYXBpLmg+ICAgICAgICAgICAgLyogaHRjX2ZsdXNoX3N1cnByaXNlX3JlbW92ZSAqLworI2luY2x1ZGUgPG9sX2NmZy5oPiAgICAgICAgICAgICAvKiBvbF9jZmdfbmV0YnVmX2ZyYWdzX21heCwgZXRjLiAqLworI2luY2x1ZGUgPG9sX2h0dF90eF9hcGkuaD4gICAgICAvKiBIVFRfVFhfREVTQ19WQUREUl9PRkZTRVQgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2h0dF9hcGkuaD4gICAgLyogb2xfdHhfbXNkdV9pZF9zdG9yYWdlICovCisjaW5jbHVkZSA8aHR0X2ludGVybmFsLmg+CisKKy8qIElQQSBNaWNybyBjb250cm9sZXIgVFggZGF0YSBwYWNrZXQgSFRUIEhlYWRlciBQcmVzZXQgKi8KKy8qIDMxIHwgMzAgIDI5IHwgMjggfCAyNyB8IDI2ICAyMiAgfCAyMSAgIDE2IHwgMTUgIDEzICAgfCAxMiAgOCAgICAgIHwgNyAwCisgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUiAgfCBDUyAgT0wgfCBSICB8IFBQIHwgZXh0IFRJRCB8IHZkZXYgSUQgfCBwa3QgdHlwZSB8IHBrdCBzdWJ0eXAgfCBtc2cgdHlwZQorICogMCAgfCAwICAgICAgfCAwICB8ICAgIHwgMHgxRiAgICB8IDAgICAgICAgfCAyICAgICAgICB8IDAgICAgICAgICAgfCAweDAxCisgKioqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcGt0IElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwa3QgbGVuZ3RoCisgKioqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdfZGVzY19wdHIKKyAqKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9pZAorICoqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBIVFRfSVBBX1VDX09GRkxPQURfVFhfSEVBREVSX0RFRkFVTFQgMHgwN0MwNDAwMQorCisvKi0tLSBzZXR1cCAvIHRlYXItZG93biBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBRQ0FfU1VQUE9SVF9UWERFU0NfU0FOSVRZX0NIRUNLUwordWludDMyX3QgKmdfZGJnX2h0dF9kZXNjX2VuZF9hZGRyLCAqZ19kYmdfaHR0X2Rlc2Nfc3RhcnRfYWRkcjsKKyNlbmRpZgorCitpbnQgaHR0X3R4X2F0dGFjaChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwgaW50IGRlc2NfcG9vbF9lbGVtcykKK3sKKwlpbnQgaSwgcG9vbF9zaXplOworCXVpbnQzMl90ICoqcDsKKwljZGZfZG1hX2FkZHJfdCBwb29sX3BhZGRyOworCisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpCisJcGRldi0+dHhfZGVzY3Muc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHR0X2hvc3RfdHhfZGVzY190KTsKKworCWlmIChIVFRfV0lGSV9JUF9WRVJTSU9OKHBkZXYtPndpZmlfaXBfdmVyLm1ham9yLCAweDIpKSB7CisJCS8qCisJCSogc2l6ZW9mIE1TRFVfRVhUL0ZyYWdtZW50YXRpb24gZGVzY3JpcHRvci4KKwkJKi8KKwkJcGRldi0+ZnJhZ19kZXNjcy5zaXplID0gc2l6ZW9mKHN0cnVjdCBtc2R1X2V4dF9kZXNjX3QpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEFkZCB0aGUgZnJhZ21lbnRhdGlvbiBkZXNjcmlwdG9yIGVsZW1lbnRzLgorCQkgKiBBZGQgdGhlIG1vc3QgdGhhdCB0aGUgT1MgbWF5IGRlbGl2ZXIsIHBsdXMgb25lIG1vcmUKKwkJICogaW4gY2FzZSB0aGUgdHhyeCBjb2RlIGFkZHMgYSBwcmVmaXggZnJhZ21lbnQgKGZvcgorCQkgKiBUU08gb3IgYXVkaW8gaW50ZXJ3b3JraW5nIFNOQVAgaGVhZGVyKQorCQkgKi8KKwkJcGRldi0+ZnJhZ19kZXNjcy5zaXplID0KKwkJCShvbF9jZmdfbmV0YnVmX2ZyYWdzX21heChwZGV2LT5jdHJsX3BkZXYpKzEpICogOAorCQkJKyA0OworCX0KKyNlbHNlIC8qICEgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisJLyoKKwkgKiBTdGFydCB3aXRoIHRoZSBzaXplIG9mIHRoZSBiYXNlIHN0cnVjdAorCSAqIHRoYXQgYWN0dWFsbHkgZ2V0cyBkb3dubG9hZGVkLgorCSAqCisJICogQWRkIHRoZSBmcmFnbWVudGF0aW9uIGRlc2NyaXB0b3IgZWxlbWVudHMuCisJICogQWRkIHRoZSBtb3N0IHRoYXQgdGhlIE9TIG1heSBkZWxpdmVyLCBwbHVzIG9uZSBtb3JlCisJICogaW4gY2FzZSB0aGUgdHhyeCBjb2RlIGFkZHMgYSBwcmVmaXggZnJhZ21lbnQgKGZvcgorCSAqIFRTTyBvciBhdWRpbyBpbnRlcndvcmtpbmcgU05BUCBoZWFkZXIpCisJICovCisJcGRldi0+dHhfZGVzY3Muc2l6ZSA9CisJCXNpemVvZihzdHJ1Y3QgaHR0X2hvc3RfdHhfZGVzY190KQorCQkrIChvbF9jZmdfbmV0YnVmX2ZyYWdzX21heChwZGV2LT5jdHJsX3BkZXYpICsgMSkgKiA4CisJCSAgIC8qIDJ4IHVpbnQzMl90ICovCisJCSsgNDsgLyogdWludDMyX3QgZnJhZ21lbnRhdGlvbiBsaXN0IHRlcm1pbmF0b3IgKi8KKworCWlmIChwZGV2LT50eF9kZXNjcy5zaXplIDwgc2l6ZW9mKHVpbnQzMl90ICopKQorCQlwZGV2LT50eF9kZXNjcy5zaXplID0gc2l6ZW9mKHVpbnQzMl90ICopOworI2VuZGlmIC8qIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KSAqLworCS8qCisJICogTWFrZSBzdXJlIHR4X2Rlc2NzLnNpemUgaXMgYSBtdWx0aXBsZSBvZiA0LWJ5dGVzLgorCSAqIEl0IHNob3VsZCBiZSwgYnV0IHJvdW5kIHVwIGp1c3QgdG8gYmUgc3VyZS4KKwkgKi8KKwlwZGV2LT50eF9kZXNjcy5zaXplID0gKHBkZXYtPnR4X2Rlc2NzLnNpemUgKyAzKSAmICh+MHgzKTsKKworCXBkZXYtPnR4X2Rlc2NzLnBvb2xfZWxlbXMgPSBkZXNjX3Bvb2xfZWxlbXM7CisJcGRldi0+dHhfZGVzY3MuYWxsb2NfY250ID0gMDsKKworCXBvb2xfc2l6ZSA9IHBkZXYtPnR4X2Rlc2NzLnBvb2xfZWxlbXMgKiBwZGV2LT50eF9kZXNjcy5zaXplOworCisJcGRldi0+dHhfZGVzY3MucG9vbF92YWRkciA9CisJCWNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudCgKKwkJCXBkZXYtPm9zZGV2LCBwb29sX3NpemUsCisJCQkmcG9vbF9wYWRkciwKKwkJCWNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+dHhfZGVzY3MpLCBtZW1jdHgpKTsKKworCXBkZXYtPnR4X2Rlc2NzLnBvb2xfcGFkZHIgPSBwb29sX3BhZGRyOworCisJaWYgKCFwZGV2LT50eF9kZXNjcy5wb29sX3ZhZGRyKQorCQlyZXR1cm4gLUVOT0JVRlM7ICAgICAgIC8qIGZhaWx1cmUgKi8KKworCWNkZl9wcmludCgiJXM6aHR0X2Rlc2Nfc3RhcnQ6MHglcCBodHRfZGVzY19lbmQ6MHglcFxuIiwgX19mdW5jX18sCisJCSAgcGRldi0+dHhfZGVzY3MucG9vbF92YWRkciwKKwkJICAodWludDMyX3QgKikgKHBkZXYtPnR4X2Rlc2NzLnBvb2xfdmFkZHIgKyBwb29sX3NpemUpKTsKKworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorCXBkZXYtPmZyYWdfZGVzY3MucG9vbF9lbGVtcyA9IGRlc2NfcG9vbF9lbGVtczsKKwkvKgorCSAqIEFsbG9jYXRlIHNwYWNlIGZvciBNU0RVIGV4dGVuc2lvbiBkZXNjcmlwdG9yCisJICogSC9XIGV4cGVjdHMgdGhpcyBpbiBjb250aWd1b3VzIG1lbW9yeQorCSAqLworCXBvb2xfc2l6ZSA9IHBkZXYtPmZyYWdfZGVzY3MucG9vbF9lbGVtcyAqIHBkZXYtPmZyYWdfZGVzY3Muc2l6ZTsKKworCXBkZXYtPmZyYWdfZGVzY3MucG9vbF92YWRkciA9IGNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudCgKKwkJcGRldi0+b3NkZXYsIHBvb2xfc2l6ZSwgJnBvb2xfcGFkZHIsCisJCWNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+ZnJhZ19kZXNjcyksIG1lbWN0eCkpOworCisJaWYgKCFwZGV2LT5mcmFnX2Rlc2NzLnBvb2xfdmFkZHIpCisJCXJldHVybiAtRU5PQlVGUzsgLyogZmFpbHVyZSAqLworCisJcGRldi0+ZnJhZ19kZXNjcy5wb29sX3BhZGRyID0gcG9vbF9wYWRkcjsKKworCWNkZl9wcmludCgiJXM6TVNEVSBFeHQuVGFibGUgU3RhcnQ6MHglcCBNU0RVIEV4dC5UYWJsZSBFbmQ6MHglcFxuIiwKKwkJICBfX2Z1bmNfXywgcGRldi0+ZnJhZ19kZXNjcy5wb29sX3ZhZGRyLAorCQkgICh1X2ludDMyX3QgKikgKHBkZXYtPmZyYWdfZGVzY3MucG9vbF92YWRkciArIHBvb2xfc2l6ZSkpOworI2VuZGlmIC8qIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KSAqLworCisjaWZkZWYgUUNBX1NVUFBPUlRfVFhERVNDX1NBTklUWV9DSEVDS1MKKwlnX2RiZ19odHRfZGVzY19lbmRfYWRkciA9ICh1aW50MzJfdCAqKQorCQkJCSAgKHBkZXYtPnR4X2Rlc2NzLnBvb2xfdmFkZHIgKyBwb29sX3NpemUpOworCWdfZGJnX2h0dF9kZXNjX3N0YXJ0X2FkZHIgPSAodWludDMyX3QgKikgcGRldi0+dHhfZGVzY3MucG9vbF92YWRkcjsKKyNlbmRpZgorCisJLyogbGluayB0eCBkZXNjcmlwdG9ycyBpbnRvIGEgZnJlZWxpc3QgKi8KKwlwZGV2LT50eF9kZXNjcy5mcmVlbGlzdCA9ICh1aW50MzJfdCAqKSBwZGV2LT50eF9kZXNjcy5wb29sX3ZhZGRyOworCXAgPSAodWludDMyX3QgKiopIHBkZXYtPnR4X2Rlc2NzLmZyZWVsaXN0OworCWZvciAoaSA9IDA7IGkgPCBkZXNjX3Bvb2xfZWxlbXMgLSAxOyBpKyspIHsKKwkJKnAgPSAodWludDMyX3QgKikgKCgoY2hhciAqKXApICsgcGRldi0+dHhfZGVzY3Muc2l6ZSk7CisJCXAgPSAodWludDMyX3QgKiopICpwOworCX0KKwkqcCA9IE5VTEw7CisKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCit9CisKK3ZvaWQgaHR0X3R4X2RldGFjaChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKwlpZiAocGRldikgeworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudCgKKwkJCXBkZXYtPm9zZGV2LAorCQkJLyogcG9vbF9zaXplICovCisJCQlwZGV2LT50eF9kZXNjcy5wb29sX2VsZW1zICogcGRldi0+dHhfZGVzY3Muc2l6ZSwKKwkJCXBkZXYtPnR4X2Rlc2NzLnBvb2xfdmFkZHIsCisJCQlwZGV2LT50eF9kZXNjcy5wb29sX3BhZGRyLAorCQkJY2RmX2dldF9kbWFfbWVtX2NvbnRleHQoKCZwZGV2LT50eF9kZXNjcyksIG1lbWN0eCkpOworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudCgKKwkJCXBkZXYtPm9zZGV2LAorCQkJLyogcG9vbF9zaXplICovCisJCQlwZGV2LT5mcmFnX2Rlc2NzLnBvb2xfZWxlbXMgKgorCQkJcGRldi0+ZnJhZ19kZXNjcy5zaXplLAorCQkJcGRldi0+ZnJhZ19kZXNjcy5wb29sX3ZhZGRyLAorCQkJcGRldi0+ZnJhZ19kZXNjcy5wb29sX3BhZGRyLAorCQkJY2RmX2dldF9kbWFfbWVtX2NvbnRleHQoKCZwZGV2LT5mcmFnX2Rlc2NzKSwgbWVtY3R4KSk7CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisJfQorfQorCisvKi0tLSBkZXNjcmlwdG9yIGFsbG9jYXRpb24gZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgKmh0dF90eF9kZXNjX2FsbG9jKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB1aW50MzJfdCAqcGFkZHJfbG8pCit7CisJc3RydWN0IGh0dF9ob3N0X3R4X2Rlc2NfdCAqaHR0X2hvc3RfdHhfZGVzYzsgICAgLyogaW5jbHVkZXMgSFRDIGhkciAqLworCXN0cnVjdCBodHRfdHhfbXNkdV9kZXNjX3QgKmh0dF90eF9kZXNjOyAvKiBkb2Vzbid0IGluY2x1ZGUgIEhUQyBoZHIgKi8KKwl1aW50MTZfdCBpbmRleDsKKwl1aW50MzJfdCAqZnJhZ21lbnRhdGlvbl9kZXNjcl9maWVsZF9wdHI7CisKKwlodHRfaG9zdF90eF9kZXNjID0gKHN0cnVjdCBodHRfaG9zdF90eF9kZXNjX3QgKilwZGV2LT50eF9kZXNjcy5mcmVlbGlzdDsKKwlpZiAoIWh0dF9ob3N0X3R4X2Rlc2MpCisJCXJldHVybiBOVUxMOyAgICAvKiBwb29sIGlzIGV4aGF1c3RlZCAqLworCisJaHR0X3R4X2Rlc2MgPSAmaHR0X2hvc3RfdHhfZGVzYy0+YWxpZ24zMi50eF9kZXNjOworCisJaWYgKHBkZXYtPnR4X2Rlc2NzLmZyZWVsaXN0KSB7CisJCXBkZXYtPnR4X2Rlc2NzLmZyZWVsaXN0ID0KKwkJCSooKHVpbnQzMl90ICoqKSBwZGV2LT50eF9kZXNjcy5mcmVlbGlzdCk7CisJCXBkZXYtPnR4X2Rlc2NzLmFsbG9jX2NudCsrOworCX0KKwkvKgorCSAqIEZvciBMTCwgc2V0IHVwIHRoZSBmcmFnbWVudGF0aW9uIGRlc2NyaXB0b3IgYWRkcmVzcy4KKwkgKiBDdXJyZW50bHksIHRoaXMgSFRUIHR4IGRlc2MgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQgb25jZSB1cCBmcm9udC4KKwkgKiBJZiB0aGlzIGlzIGNoYW5nZWQgdG8gaGF2ZSB0aGUgYWxsb2NhdGlvbiBkb25lIGR1cmluZyB0eCwgdGhlbiBpdAorCSAqIHdvdWxkIGJlIGhlbHBmdWwgdG8gaGF2ZSBzZXBhcmF0ZSBodHRfdHhfZGVzY19hbGxvYyBmdW5jdGlvbnMgZm9yCisJICogSEwgdnMuIExMLCB0byByZW1vdmUgdGhlIGJlbG93IGNvbmRpdGlvbmFsIGJyYW5jaC4KKwkgKi8KKwlmcmFnbWVudGF0aW9uX2Rlc2NyX2ZpZWxkX3B0ciA9ICh1aW50MzJfdCAqKQorCQkoKHVpbnQzMl90ICopIGh0dF90eF9kZXNjKSArCisJCUhUVF9UWF9ERVNDX0ZSQUdTX0RFU0NfUEFERFJfT0ZGU0VUX0RXT1JEOworCisJaW5kZXggPSAoKGNoYXIgKilodHRfaG9zdF90eF9kZXNjIC0KKwkJIChjaGFyICopKCgoc3RydWN0IGh0dF9ob3N0X3R4X2Rlc2NfdCAqKQorCQkJICAgcGRldi0+dHhfZGVzY3MucG9vbF92YWRkcikpKSAvCisJCXBkZXYtPnR4X2Rlc2NzLnNpemU7CisJLyoKKwkgKiBUaGUgZnJhZ21lbnRhdGlvbiBkZXNjcmlwdG9yIGlzIGFsbG9jYXRlZCBmcm9tIGNvbnNpc3RlbnQKKwkgKiBtZW1vcnkuIFRoZXJlZm9yZSwgd2UgY2FuIHVzZSB0aGUgYWRkcmVzcyBkaXJlY3RseSByYXRoZXIKKwkgKiB0aGFuIGhhdmluZyB0byBtYXAgaXQgZnJvbSBhIHZpcnR1YWwvQ1BVIGFkZHJlc3MgdG8gYQorCSAqIHBoeXNpY2FsL2J1cyBhZGRyZXNzLgorCSAqLworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorI2lmIEhUVF9QQUREUjY0CisJLyogdGhpcyBpczogZnJhZ3NfZGVzY19wdHIubG8gKi8KKwkqZnJhZ21lbnRhdGlvbl9kZXNjcl9maWVsZF9wdHIgPSAodWludDMyX3QpCisJCShwZGV2LT5mcmFnX2Rlc2NzLnBvb2xfcGFkZHIgKworCQkgKHBkZXYtPmZyYWdfZGVzY3Muc2l6ZSAqIGluZGV4KSk7CisJZnJhZ21lbnRhdGlvbl9kZXNjcl9maWVsZF9wdHIrKzsKKwkvKiBmcmFnc19kZXNjX3B0ci5oaSAqLworCSpmcmFnbWVudGF0aW9uX2Rlc2NyX2ZpZWxkX3B0ciA9IDA7CisjZWxzZSAvKiAhIEhUVF9QQUREUjY0ICovCisJKmZyYWdtZW50YXRpb25fZGVzY3JfZmllbGRfcHRyID0gKHVpbnQzMl90KQorCQkocGRldi0+ZnJhZ19kZXNjcy5wb29sX3BhZGRyICsKKwkJIChwZGV2LT5mcmFnX2Rlc2NzLnNpemUgKiBpbmRleCkpOworCWNkZl9wcmludCgiJXMgJWQ6IGkgJWQgZnJhZ19wYWRkciAweCV4XG4iLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgaW5kZXgsCisJCSAgKCpmcmFnbWVudGF0aW9uX2Rlc2NyX2ZpZWxkX3B0cikpOworI2VuZGlmIC8qIEhUVF9QQUREUjY0ICovCisjZWxzZSAvKiAhSEVMSVVNUExVU19QQUREUjY0ICovCisJKmZyYWdtZW50YXRpb25fZGVzY3JfZmllbGRfcHRyID0KKwkJSFRUX1RYX0RFU0NfUEFERFIocGRldiwgaHR0X3R4X2Rlc2MpICsgSFRUX1RYX0RFU0NfTEVOOworI2VuZGlmIC8qIEhFTElVTVBMVVNfUEFERFI2NCAqLworCisJLyoKKwkgKiBJbmNsdWRlIHRoZSBoZWFkcm9vbSBmb3IgdGhlIEhUQyBmcmFtZSBoZWFkZXIgd2hlbiBzcGVjaWZ5aW5nIHRoZQorCSAqIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBIVFQgdHggZGVzY3JpcHRvci4KKwkgKi8KKwkqcGFkZHJfbG8gPSAodWludDMyX3QpIEhUVF9UWF9ERVNDX1BBRERSKHBkZXYsIGh0dF9ob3N0X3R4X2Rlc2MpOworCS8qCisJICogVGhlIGFsbG9jYXRlZCB0eCBkZXNjcmlwdG9yIHNwYWNlIGluY2x1ZGVzIGhlYWRyb29tIGZvciBhCisJICogSFRDIGZyYW1lIGhlYWRlci4gIEhpZGUgdGhpcyBoZWFkcm9vbSwgc28gdGhhdCB3ZSBkb24ndCBoYXZlCisJICogdG8ganVtcCBwYXN0IHRoZSBoZWFkcm9vbSBlYWNoIHRpbWUgd2UgcHJvZ3JhbSBhIGZpZWxkIHdpdGhpbgorCSAqIHRoZSB0eCBkZXNjLCBidXQgb25seSBvbmNlIHdoZW4gd2UgZG93bmxvYWQgdGhlIHR4IGRlc2MgKGFuZAorCSAqIHRoZSBoZWFkcm9vbSkgdG8gdGhlIHRhcmdldCB2aWEgSFRDLgorCSAqIFNraXAgcGFzdCB0aGUgaGVhZHJvb20gYW5kIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSFRUIHR4IGRlc2MuCisJICovCisJcmV0dXJuICh2b2lkICopaHR0X3R4X2Rlc2M7Cit9CisKK3ZvaWQgaHR0X3R4X2Rlc2NfZnJlZShodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqdHhfZGVzYykKK3sKKwljaGFyICpodHRfaG9zdF90eF9kZXNjID0gdHhfZGVzYzsKKwkvKiByZXdpbmQgb3ZlciB0aGUgSFRDIGZyYW1lIGhlYWRlciBzcGFjZSAqLworCWh0dF9ob3N0X3R4X2Rlc2MgLT0KKwkJb2Zmc2V0b2Yoc3RydWN0IGh0dF9ob3N0X3R4X2Rlc2NfdCwgYWxpZ24zMi50eF9kZXNjKTsKKwkqKCh1aW50MzJfdCAqKikgaHR0X2hvc3RfdHhfZGVzYykgPSBwZGV2LT50eF9kZXNjcy5mcmVlbGlzdDsKKwlwZGV2LT50eF9kZXNjcy5mcmVlbGlzdCA9ICh1aW50MzJfdCAqKSBodHRfaG9zdF90eF9kZXNjOworCXBkZXYtPnR4X2Rlc2NzLmFsbG9jX2NudC0tOworfQorCisvKi0tLSBkZXNjcmlwdG9yIGZpZWxkIGFjY2VzcyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaHR0X3R4X2Rlc2NfZnJhZ3NfdGFibGVfc2V0KGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSB2b2lkICpodHRfdHhfZGVzYywKKwkJCQkgdWludDMyX3QgcGFkZHIsCisJCQkJIHVpbnQzMl90IGZyYWdfZGVzY19wYWRkcl9sbywKKwkJCQkgaW50IHJlc2V0KQoreworCXVpbnQzMl90ICpmcmFnbWVudGF0aW9uX2Rlc2NyX2ZpZWxkX3B0cjsKKworCWZyYWdtZW50YXRpb25fZGVzY3JfZmllbGRfcHRyID0gKHVpbnQzMl90ICopCisJCSgodWludDMyX3QgKikgaHR0X3R4X2Rlc2MpICsKKwkJSFRUX1RYX0RFU0NfRlJBR1NfREVTQ19QQUREUl9PRkZTRVRfRFdPUkQ7CisJaWYgKHJlc2V0KSB7CisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpCisJCSpmcmFnbWVudGF0aW9uX2Rlc2NyX2ZpZWxkX3B0ciA9IGZyYWdfZGVzY19wYWRkcl9sbzsKKyNlbHNlCisJCSpmcmFnbWVudGF0aW9uX2Rlc2NyX2ZpZWxkX3B0ciA9CisJCQlIVFRfVFhfREVTQ19QQUREUihwZGV2LCBodHRfdHhfZGVzYykgKyBIVFRfVFhfREVTQ19MRU47CisjZW5kaWYKKwl9IGVsc2UgeworCQkqZnJhZ21lbnRhdGlvbl9kZXNjcl9maWVsZF9wdHIgPSBwYWRkcjsKKwl9Cit9CisKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkKK3ZvaWQgKgoraHR0X3R4X2ZyYWdfYWxsb2MoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgdV9pbnQxNl90IGluZGV4LAorCQkgIHVfaW50MzJfdCAqZnJhZ19wYWRkcl9sbykKK3sKKwkvKiogSW5kZXggc2hvdWxkIG5ldmVyIGJlIDAsIHNpbmNlIGl0cyB1c2VkIGJ5IHRoZSBoYXJkd2FyZQorCSAgICB0byB0ZXJtaW5hdGUgdGhlIGxpbmsuICovCisJaWYgKGluZGV4ID49IHBkZXYtPnR4X2Rlc2NzLnBvb2xfZWxlbXMpCisJCXJldHVybiBOVUxMOworCisJKmZyYWdfcGFkZHJfbG8gPSAodWludDMyX3QpCisJCShwZGV2LT5mcmFnX2Rlc2NzLnBvb2xfcGFkZHIgKyAocGRldi0+ZnJhZ19kZXNjcy5zaXplICogaW5kZXgpKTsKKworCXJldHVybiAoKGNoYXIgKikgcGRldi0+ZnJhZ19kZXNjcy5wb29sX3ZhZGRyKSArCisJCShwZGV2LT5mcmFnX2Rlc2NzLnNpemUgKiBpbmRleCk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisKKy8qIFBVVCBUSEVTRSBBUyBJTkxJTkUgSU4gb2xfaHR0X3R4X2FwaS5oICovCisKK3ZvaWQgaHR0X3R4X2Rlc2NfZmxhZ19wb3N0cG9uZWQoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKmRlc2MpCit7Cit9CisKK3ZvaWQgaHR0X3R4X3BlbmRpbmdfZGlzY2FyZChodHRfcGRldl9oYW5kbGUgcGRldikKK3sKKwlodGNfZmx1c2hfc3VycHJpc2VfcmVtb3ZlKHBkZXYtPmh0Y19wZGV2KTsKK30KKwordm9pZCBodHRfdHhfZGVzY19mbGFnX2JhdGNoX21vcmUoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKmRlc2MpCit7Cit9CisKKy8qLS0tIHR4IHNlbmQgZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIEFUSF8xMUFDX1RYQ09NUEFDVAorCisvKiBTY2hlZHVsaW5nIHRoZSBRdWV1ZWQgcGFja2V0cyBpbiBIVFQgd2hpY2ggY291bGQgbm90IGJlIHNlbnQgb3V0CisgICBiZWNhdXNlIG9mIE5vIENFIGRlc2MqLwordm9pZCBodHRfdHhfc2NoZWQoaHR0X3BkZXZfaGFuZGxlIHBkZXYpCit7CisJY2RmX25idWZfdCBtc2R1OworCWludCBkb3dubG9hZF9sZW4gPSBwZGV2LT5kb3dubG9hZF9sZW47CisJaW50IHBhY2tldF9sZW47CisKKwlIVFRfVFhfTkJVRl9RVUVVRV9SRU1PVkUocGRldiwgbXNkdSk7CisJd2hpbGUgKG1zZHUgIT0gTlVMTCkgeworCQlpbnQgbm90X2FjY2VwdGVkOworCQkvKiBwYWNrZXQgbGVuZ3RoIGluY2x1ZGVzIEhUVCB0eCBkZXNjIGZyYWcgYWRkZWQgYWJvdmUgKi8KKwkJcGFja2V0X2xlbiA9IGNkZl9uYnVmX2xlbihtc2R1KTsKKwkJaWYgKHBhY2tldF9sZW4gPCBkb3dubG9hZF9sZW4pIHsKKwkJCS8qCisJCQkgKiBUaGlzIGNhc2Ugb2YgcGFja2V0IGxlbmd0aCBiZWluZyBsZXNzIHRoYW4gdGhlCisJCQkgKiBub21pbmFsIGRvd25sb2FkIGxlbmd0aCBjYW4gaGFwcGVuIGZvciBhIGNvdXBsZQorCQkJICogb2YgcmVhc29uczoKKwkJCSAqIEluIEhMLCB0aGUgbm9taW5hbCBkb3dubG9hZCBsZW5ndGggaXMgYSBsYXJnZQorCQkJICogYXJ0aWZpY2lhbCB2YWx1ZS4KKwkJCSAqIEluIExMLCB0aGUgZnJhbWUgbWF5IG5vdCBoYXZlIHRoZSBvcHRpb25hbCBoZWFkZXIKKwkJCSAqIGZpZWxkcyBhY2NvdW50ZWQgZm9yIGluIHRoZSBub21pbmFsIGRvd25sb2FkIHNpemUKKwkJCSAqIChMTEMvU05BUCBoZWFkZXIsIElQdjQgb3IgSVB2NiBoZWFkZXIpLgorCQkJICovCisJCQlkb3dubG9hZF9sZW4gPSBwYWNrZXRfbGVuOworCQl9CisKKwkJbm90X2FjY2VwdGVkID0KKwkJCWh0Y19zZW5kX2RhdGFfcGt0KHBkZXYtPmh0Y19wZGV2LCBtc2R1LAorCQkJCQkgIHBkZXYtPmh0Y19lbmRwb2ludCwKKwkJCQkJICBkb3dubG9hZF9sZW4pOworCQlpZiAobm90X2FjY2VwdGVkKSB7CisJCQlIVFRfVFhfTkJVRl9RVUVVRV9JTlNFUlRfSEVBRChwZGV2LCBtc2R1KTsKKwkJCXJldHVybjsKKwkJfQorCQlIVFRfVFhfTkJVRl9RVUVVRV9SRU1PVkUocGRldiwgbXNkdSk7CisJfQorfQorCitpbnQgaHR0X3R4X3NlbmRfc3RkKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IG1zZHUsIHVpbnQxNl90IG1zZHVfaWQpCit7CisKKwlpbnQgZG93bmxvYWRfbGVuID0gcGRldi0+ZG93bmxvYWRfbGVuOworCisJaW50IHBhY2tldF9sZW47CisKKwkvKiBwYWNrZXQgbGVuZ3RoIGluY2x1ZGVzIEhUVCB0eCBkZXNjIGZyYWcgYWRkZWQgYWJvdmUgKi8KKwlwYWNrZXRfbGVuID0gY2RmX25idWZfbGVuKG1zZHUpOworCWlmIChwYWNrZXRfbGVuIDwgZG93bmxvYWRfbGVuKSB7CisJCS8qCisJCSAqIFRoaXMgY2FzZSBvZiBwYWNrZXQgbGVuZ3RoIGJlaW5nIGxlc3MgdGhhbiB0aGUgbm9taW5hbAorCQkgKiBkb3dubG9hZCBsZW5ndGggY2FuIGhhcHBlbiBmb3IgYSBjb3VwbGUgb2YgcmVhc29uczoKKwkJICogSW4gSEwsIHRoZSBub21pbmFsIGRvd25sb2FkIGxlbmd0aCBpcyBhIGxhcmdlIGFydGlmaWNpYWwKKwkJICogdmFsdWUuCisJCSAqIEluIExMLCB0aGUgZnJhbWUgbWF5IG5vdCBoYXZlIHRoZSBvcHRpb25hbCBoZWFkZXIgZmllbGRzCisJCSAqIGFjY291bnRlZCBmb3IgaW4gdGhlIG5vbWluYWwgZG93bmxvYWQgc2l6ZSAoTExDL1NOQVAgaGVhZGVyLAorCQkgKiBJUHY0IG9yIElQdjYgaGVhZGVyKS4KKwkJICovCisJCWRvd25sb2FkX2xlbiA9IHBhY2tldF9sZW47CisJfQorCisJTkJVRl9VUERBVEVfVFhfUEtUX0NPVU5UKG1zZHUsIE5CVUZfVFhfUEtUX0hUVCk7CisJRFBUUkFDRShjZGZfZHBfdHJhY2UobXNkdSwgQ0RGX0RQX1RSQUNFX0hUVF9QQUNLRVRfUFRSX1JFQ09SRCwKKwkJCQkodWludDhfdCAqKShjZGZfbmJ1Zl9kYXRhKG1zZHUpKSwKKwkJCQlzaXplb2YoY2RmX25idWZfZGF0YShtc2R1KSkpKTsKKwlpZiAoY2RmX25idWZfcXVldWVfbGVuKCZwZGV2LT50eG5idWZxKSA+IDApIHsKKwkJSFRUX1RYX05CVUZfUVVFVUVfQUREKHBkZXYsIG1zZHUpOworCQlodHRfdHhfc2NoZWQocGRldik7CisJCXJldHVybiAwOworCX0KKworCWNkZl9uYnVmX3RyYWNlX3VwZGF0ZShtc2R1LCAiSFQ6VDoiKTsKKwlpZiAoaHRjX3NlbmRfZGF0YV9wa3QKKwkJICAgIChwZGV2LT5odGNfcGRldiwgbXNkdSwgcGRldi0+aHRjX2VuZHBvaW50LCBkb3dubG9hZF9sZW4pKSB7CisJCUhUVF9UWF9OQlVGX1FVRVVFX0FERChwZGV2LCBtc2R1KTsKKwl9CisKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCisKK30KKworY2RmX25idWZfdAoraHR0X3R4X3NlbmRfYmF0Y2goaHR0X3BkZXZfaGFuZGxlIHBkZXYsIGNkZl9uYnVmX3QgaGVhZF9tc2R1LCBpbnQgbnVtX21zZHVzKQoreworCWNkZl9wcmludCgiKioqICVzIGN1cmVudGx5IG9ubHkgYXBwbGllcyBmb3IgSEwgc3lzdGVtc1xuIiwgX19mdW5jX18pOworCWNkZl9hc3NlcnQoMCk7CisJcmV0dXJuIGhlYWRfbXNkdTsKKworfQorCitpbnQKK2h0dF90eF9zZW5kX25vbnN0ZChodHRfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgY2RmX25idWZfdCBtc2R1LAorCQkgICB1aW50MTZfdCBtc2R1X2lkLCBlbnVtIGh0dF9wa3RfdHlwZSBwa3RfdHlwZSkKK3sKKwlpbnQgZG93bmxvYWRfbGVuOworCisJLyoKKwkgKiBUaGUgcGt0X3R5cGUgY291bGQgYmUgY2hlY2tlZCB0byBzZWUgd2hhdCBMMiBoZWFkZXIgdHlwZSBpcyBwcmVzZW50LAorCSAqIGFuZCB0aGVuIHRoZSBMMiBoZWFkZXIgY291bGQgYmUgZXhhbWluZWQgdG8gZGV0ZXJtaW5lIGl0cyBsZW5ndGguCisJICogQnV0IGZvciBzaW1wbGljaXR5LCBqdXN0IHVzZSB0aGUgbWF4aW11bSBwb3NzaWJsZSBoZWFkZXIgc2l6ZSwKKwkgKiByYXRoZXIgdGhhbiBjb21wdXRpbmcgdGhlIGFjdHVhbCBoZWFkZXIgc2l6ZS4KKwkgKi8KKwlkb3dubG9hZF9sZW4gPSBzaXplb2Yoc3RydWN0IGh0dF9ob3N0X3R4X2Rlc2NfdCkKKwkJKyBIVFRfVFhfSERSX1NJWkVfT1VURVJfSERSX01BWCAvKiB3b3JzdCBjYXNlICovCisJCSsgSFRUX1RYX0hEUl9TSVpFXzgwMl8xUQorCQkrIEhUVF9UWF9IRFJfU0laRV9MTENfU05BUAorCQkrIG9sX2NmZ190eF9kb3dubG9hZF9zaXplKHBkZXYtPmN0cmxfcGRldik7CisJY2RmX2Fzc2VydChkb3dubG9hZF9sZW4gPD0gcGRldi0+ZG93bmxvYWRfbGVuKTsKKwlyZXR1cm4gaHR0X3R4X3NlbmRfc3RkKHBkZXYsIG1zZHUsIG1zZHVfaWQpOworfQorCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQVRIXzExQUNfVFhDT01QQUNUICovCisKKyNpZmRlZiBRQ0FfVFhfSFRUMl9TVVBQT1JUCitzdGF0aWMgaW5saW5lIEhUQ19FTkRQT0lOVF9JRAoraHR0X3R4X2h0dDJfZ2V0X2VwX2lkKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IG1zZHUpCit7CisJLyoKKwkgKiBUWCBIVFQyIHNlcnZpY2UgbWFpbmx5IGZvciBzbWFsbCBzaXplZCBmcmFtZSBhbmQgY2hlY2sgaWYKKwkgKiB0aGlzIGNhbmRpZGF0ZSBmcmFtZSBhbGxvdyBvciBub3QuCisJICovCisJaWYgKChwZGV2LT5odGNfdHhfaHR0Ml9lbmRwb2ludCAhPSBFTkRQT0lOVF9VTlVTRUQpICYmCisJICAgIGNkZl9uYnVmX2dldF90eF9wYXJhbGxlbF9kbmxvYWRfZnJtKG1zZHUpICYmCisJICAgIChjZGZfbmJ1Zl9sZW4obXNkdSkgPCBwZGV2LT5odGNfdHhfaHR0Ml9tYXhfc2l6ZSkpCisJCXJldHVybiBwZGV2LT5odGNfdHhfaHR0Ml9lbmRwb2ludDsKKwllbHNlCisJCXJldHVybiBwZGV2LT5odGNfZW5kcG9pbnQ7Cit9CisjZWxzZQorI2RlZmluZSBodHRfdHhfaHR0Ml9nZXRfZXBfaWQocGRldiwgbXNkdSkgICAgIChwZGV2LT5odGNfZW5kcG9pbnQpCisjZW5kaWYgLyogUUNBX1RYX0hUVDJfU1VQUE9SVCAqLworCitzdGF0aWMgaW5saW5lIGludAoraHR0X3R4X3NlbmRfYmFzZShodHRfcGRldl9oYW5kbGUgcGRldiwKKwkJIGNkZl9uYnVmX3QgbXNkdSwKKwkJIHVpbnQxNl90IG1zZHVfaWQsIGludCBkb3dubG9hZF9sZW4sIHVpbnQ4X3QgbW9yZV9kYXRhKQoreworCXN0cnVjdCBodHRfaG9zdF90eF9kZXNjX3QgKmh0dF9ob3N0X3R4X2Rlc2M7CisJc3RydWN0IGh0dF9odGNfcGt0ICpwa3Q7CisJaW50IHBhY2tldF9sZW47CisJSFRDX0VORFBPSU5UX0lEIGVwX2lkOworCisJLyoKKwkgKiBUaGUgSFRUIHR4IGRlc2NyaXB0b3Igd2FzIGF0dGFjaGVkIGFzIHRoZSBwcmVmaXggZnJhZ21lbnQgdG8gdGhlCisJICogbXNkdSBuZXRidWYgZHVyaW5nIHRoZSBjYWxsIHRvIGh0dF90eF9kZXNjX2luaXQuCisJICogUmV0cmlldmUgaXQgc28gd2UgY2FuIHByb3ZpZGUgaXRzIEhUQyBoZWFkZXIgc3BhY2UgdG8gSFRDLgorCSAqLworCWh0dF9ob3N0X3R4X2Rlc2MgPSAoc3RydWN0IGh0dF9ob3N0X3R4X2Rlc2NfdCAqKQorCQkJICAgY2RmX25idWZfZ2V0X2ZyYWdfdmFkZHIobXNkdSwgMCk7CisKKwlwa3QgPSBodHRfaHRjX3BrdF9hbGxvYyhwZGV2KTsKKwlpZiAoIXBrdCkKKwkJcmV0dXJuIC1FTk9CVUZTOyAgICAgICAvKiBmYWlsdXJlICovCisKKwlwa3QtPm1zZHVfaWQgPSBtc2R1X2lkOworCXBrdC0+cGRldl9jdHh0ID0gcGRldi0+dHhyeF9wZGV2OworCisJLyogcGFja2V0IGxlbmd0aCBpbmNsdWRlcyBIVFQgdHggZGVzYyBmcmFnIGFkZGVkIGFib3ZlICovCisJcGFja2V0X2xlbiA9IGNkZl9uYnVmX2xlbihtc2R1KTsKKwlpZiAocGFja2V0X2xlbiA8IGRvd25sb2FkX2xlbikgeworCQkvKgorCQkgKiBUaGlzIGNhc2Ugb2YgcGFja2V0IGxlbmd0aCBiZWluZyBsZXNzIHRoYW4gdGhlIG5vbWluYWwKKwkJICogZG93bmxvYWQgbGVuZ3RoIGNhbiBoYXBwZW4gZm9yIGEgY291cGxlIHJlYXNvbnM6CisJCSAqIEluIEhMLCB0aGUgbm9taW5hbCBkb3dubG9hZCBsZW5ndGggaXMgYSBsYXJnZSBhcnRpZmljaWFsCisJCSAqIHZhbHVlLgorCQkgKiBJbiBMTCwgdGhlIGZyYW1lIG1heSBub3QgaGF2ZSB0aGUgb3B0aW9uYWwgaGVhZGVyIGZpZWxkcworCQkgKiBhY2NvdW50ZWQgZm9yIGluIHRoZSBub21pbmFsIGRvd25sb2FkIHNpemUgKExMQy9TTkFQIGhlYWRlciwKKwkJICogSVB2NCBvciBJUHY2IGhlYWRlcikuCisJCSAqLworCQlkb3dubG9hZF9sZW4gPSBwYWNrZXRfbGVuOworCX0KKworCWVwX2lkID0gaHR0X3R4X2h0dDJfZ2V0X2VwX2lkKHBkZXYsIG1zZHUpOworCisJU0VUX0hUQ19QQUNLRVRfSU5GT19UWCgmcGt0LT5odGNfcGt0LAorCQkJICAgICAgIHBkZXYtPnR4X3NlbmRfY29tcGxldGVfcGFydDIsCisJCQkgICAgICAgKHVuc2lnbmVkIGNoYXIgKilodHRfaG9zdF90eF9kZXNjLAorCQkJICAgICAgIGRvd25sb2FkX2xlbiAtIEhUQ19IRFJfTEVOR1RILAorCQkJICAgICAgIGVwX2lkLAorCQkJICAgICAgIDEpOyAvKiB0YWcgLSBub3QgcmVsZXZhbnQgaGVyZSAqLworCisJU0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKCZwa3QtPmh0Y19wa3QsIG1zZHUpOworCisJY2RmX25idWZfdHJhY2VfdXBkYXRlKG1zZHUsICJIVDpUOiIpOworCU5CVUZfVVBEQVRFX1RYX1BLVF9DT1VOVChtc2R1LCBOQlVGX1RYX1BLVF9IVFQpOworCURQVFJBQ0UoY2RmX2RwX3RyYWNlKG1zZHUsIENERl9EUF9UUkFDRV9IVFRfUEFDS0VUX1BUUl9SRUNPUkQsCisJCQkJKHVpbnQ4X3QgKikoY2RmX25idWZfZGF0YShtc2R1KSksCisJCQkJc2l6ZW9mKGNkZl9uYnVmX2RhdGEobXNkdSkpKSk7CisJaHRjX3NlbmRfZGF0YV9wa3QocGRldi0+aHRjX3BkZXYsICZwa3QtPmh0Y19wa3QsIG1vcmVfZGF0YSk7CisKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCit9CisKK2NkZl9uYnVmX3QKK2h0dF90eF9zZW5kX2JhdGNoKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IGhlYWRfbXNkdSwgaW50IG51bV9tc2R1cykKK3sKKwljZGZfbmJ1Zl90IHJlamVjdGVkID0gTlVMTDsKKwl1aW50MTZfdCAqbXNkdV9pZF9zdG9yYWdlOworCXVpbnQxNl90IG1zZHVfaWQ7CisJY2RmX25idWZfdCBtc2R1OworCS8qCisJICogRk9SIE5PVywgaXRlcmF0ZSB0aHJvdWdoIHRoZSBiYXRjaCwgc2VuZGluZyB0aGUgZnJhbWVzIHNpbmdseS4KKwkgKiBFdmVudHVhbGx5IEhUQyBhbmQgSElGIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VwdCBhIGJhdGNoIG9mCisJICogZGF0YSBmcmFtZXMgcmF0aGVyIHRoYW4gc2luZ2xlcy4KKwkgKi8KKwltc2R1ID0gaGVhZF9tc2R1OworCXdoaWxlIChudW1fbXNkdXMtLSkgeworCQljZGZfbmJ1Zl90IG5leHRfbXNkdSA9IGNkZl9uYnVmX25leHQobXNkdSk7CisJCW1zZHVfaWRfc3RvcmFnZSA9IG9sX3R4X21zZHVfaWRfc3RvcmFnZShtc2R1KTsKKwkJbXNkdV9pZCA9ICptc2R1X2lkX3N0b3JhZ2U7CisKKwkJLyogaHR0X3R4X3NlbmRfYmFzZSByZXR1cm5zIDAgYXMgc3VjY2VzcyBhbmQgMSBhcyBmYWlsdXJlICovCisJCWlmIChodHRfdHhfc2VuZF9iYXNlKHBkZXYsIG1zZHUsIG1zZHVfaWQsIHBkZXYtPmRvd25sb2FkX2xlbiwKKwkJCQkgICAgIG51bV9tc2R1cykpIHsKKwkJCWNkZl9uYnVmX3NldF9uZXh0KG1zZHUsIHJlamVjdGVkKTsKKwkJCXJlamVjdGVkID0gbXNkdTsKKwkJfQorCQltc2R1ID0gbmV4dF9tc2R1OworCX0KKwlyZXR1cm4gcmVqZWN0ZWQ7Cit9CisKK2ludAoraHR0X3R4X3NlbmRfbm9uc3RkKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICBjZGZfbmJ1Zl90IG1zZHUsCisJCSAgIHVpbnQxNl90IG1zZHVfaWQsIGVudW0gaHR0X3BrdF90eXBlIHBrdF90eXBlKQoreworCWludCBkb3dubG9hZF9sZW47CisKKwkvKgorCSAqIFRoZSBwa3RfdHlwZSBjb3VsZCBiZSBjaGVja2VkIHRvIHNlZSB3aGF0IEwyIGhlYWRlciB0eXBlIGlzIHByZXNlbnQsCisJICogYW5kIHRoZW4gdGhlIEwyIGhlYWRlciBjb3VsZCBiZSBleGFtaW5lZCB0byBkZXRlcm1pbmUgaXRzIGxlbmd0aC4KKwkgKiBCdXQgZm9yIHNpbXBsaWNpdHksIGp1c3QgdXNlIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGhlYWRlciBzaXplLAorCSAqIHJhdGhlciB0aGFuIGNvbXB1dGluZyB0aGUgYWN0dWFsIGhlYWRlciBzaXplLgorCSAqLworCWRvd25sb2FkX2xlbiA9IHNpemVvZihzdHJ1Y3QgaHR0X2hvc3RfdHhfZGVzY190KQorCQkrIEhUVF9UWF9IRFJfU0laRV9PVVRFUl9IRFJfTUFYICAgICAgLyogd29yc3QgY2FzZSAqLworCQkrIEhUVF9UWF9IRFJfU0laRV84MDJfMVEKKwkJKyBIVFRfVFhfSERSX1NJWkVfTExDX1NOQVAKKwkJKyBvbF9jZmdfdHhfZG93bmxvYWRfc2l6ZShwZGV2LT5jdHJsX3BkZXYpOworCXJldHVybiBodHRfdHhfc2VuZF9iYXNlKHBkZXYsIG1zZHUsIG1zZHVfaWQsIGRvd25sb2FkX2xlbiwgMCk7Cit9CisKK2ludCBodHRfdHhfc2VuZF9zdGQoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIGNkZl9uYnVmX3QgbXNkdSwgdWludDE2X3QgbXNkdV9pZCkKK3sKKwlyZXR1cm4gaHR0X3R4X3NlbmRfYmFzZShwZGV2LCBtc2R1LCBtc2R1X2lkLCBwZGV2LT5kb3dubG9hZF9sZW4sIDApOworfQorCisjZW5kaWYgLypBVEhfMTFBQ19UWENPTVBBQ1QgKi8KKyNpZmRlZiBIVFRfREJHCit2b2lkIGh0dF90eF9kZXNjX2Rpc3BsYXkodm9pZCAqdHhfZGVzYykKK3sKKwlzdHJ1Y3QgaHR0X3R4X21zZHVfZGVzY190ICpodHRfdHhfZGVzYzsKKworCWh0dF90eF9kZXNjID0gKHN0cnVjdCBodHRfdHhfbXNkdV9kZXNjX3QgKil0eF9kZXNjOworCisJLyogb25seSB3b3JrcyBmb3IgbGl0dGxlLWVuZGlhbiAqLworCWNkZl9wcmludCgiSFRUIHR4IGRlc2MgKEAgJXApOlxuIiwgaHR0X3R4X2Rlc2MpOworCWNkZl9wcmludCgiICBtc2cgdHlwZSA9ICVkXG4iLCBodHRfdHhfZGVzYy0+bXNnX3R5cGUpOworCWNkZl9wcmludCgiICBwa3Qgc3VidHlwZSA9ICVkXG4iLCBodHRfdHhfZGVzYy0+cGt0X3N1YnR5cGUpOworCWNkZl9wcmludCgiICBwa3QgdHlwZSA9ICVkXG4iLCBodHRfdHhfZGVzYy0+cGt0X3R5cGUpOworCWNkZl9wcmludCgiICB2ZGV2IElEID0gJWRcbiIsIGh0dF90eF9kZXNjLT52ZGV2X2lkKTsKKwljZGZfcHJpbnQoIiAgZXh0IFRJRCA9ICVkXG4iLCBodHRfdHhfZGVzYy0+ZXh0X3RpZCk7CisJY2RmX3ByaW50KCIgIHBvc3Rwb25lZCA9ICVkXG4iLCBodHRfdHhfZGVzYy0+cG9zdHBvbmVkKTsKKyNpZiBIVFRfUEFERFI2NAorCWNkZl9wcmludCgiICByZXNlcnZlZF9kd29yZDBfYml0czI4ID0gJWRcbiIsIGh0dF90eF9kZXNjLT5yZXNlcnZlZF9kd29yZDBfYml0czI4KTsKKwljZGZfcHJpbnQoIiAgY2tzdW1fb2ZmbG9hZCA9ICVkXG4iLCBodHRfdHhfZGVzYy0+Y2tzdW1fb2ZmbG9hZCk7CisJY2RmX3ByaW50KCIgIHR4X2NvbXBsX3JlcT0gJWRcbiIsIGh0dF90eF9kZXNjLT50eF9jb21wbF9yZXEpOworI2Vsc2UgLyogIUhUVF9QQUREUjY0ICovCisJY2RmX3ByaW50KCIgIGJhdGNoIG1vcmUgPSAlZFxuIiwgaHR0X3R4X2Rlc2MtPm1vcmVfaW5fYmF0Y2gpOworI2VuZGlmIC8qIEhUVF9QQUREUjY0ICovCisJY2RmX3ByaW50KCIgIGxlbmd0aCA9ICVkXG4iLCBodHRfdHhfZGVzYy0+bGVuKTsKKwljZGZfcHJpbnQoIiAgaWQgPSAlZFxuIiwgaHR0X3R4X2Rlc2MtPmlkKTsKKyNpZiBIVFRfUEFERFI2NAorCWNkZl9wcmludCgiICBmcmFnIGRlc2MgYWRkci5sbyA9ICUjeFxuIiwKKwkJICBodHRfdHhfZGVzYy0+ZnJhZ3NfZGVzY19wdHIubG8pOworCWNkZl9wcmludCgiICBmcmFnIGRlc2MgYWRkci5oaSA9ICUjeFxuIiwKKwkJICBodHRfdHhfZGVzYy0+ZnJhZ3NfZGVzY19wdHIuaGkpOworCWNkZl9wcmludCgiICBwZWVyaWQgPSAlZFxuIiwgaHR0X3R4X2Rlc2MtPnBlZXJpZCk7CisJY2RmX3ByaW50KCIgIGNoYW5mcmVxID0gJWRcbiIsIGh0dF90eF9kZXNjLT5jaGFuZnJlcSk7CisjZWxzZSAvKiAhIEhUVF9QQUREUjY0ICovCisJY2RmX3ByaW50KCIgIGZyYWcgZGVzYyBhZGRyID0gJSN4XG4iLCBodHRfdHhfZGVzYy0+ZnJhZ3NfZGVzY19wdHIpOworI2VuZGlmIC8qIEhUVF9QQUREUjY0ICovCit9CisjZW5kaWYKKworI2lmZGVmIElQQV9PRkZMT0FECitpbnQgaHR0X3R4X2lwYV91Y19hdHRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsCisJCQkgdW5zaWduZWQgaW50IHVjX3R4X2J1Zl9zeiwKKwkJCSB1bnNpZ25lZCBpbnQgdWNfdHhfYnVmX2NudCwKKwkJCSB1bnNpZ25lZCBpbnQgdWNfdHhfcGFydGl0aW9uX2Jhc2UpCit7CisJdW5zaWduZWQgaW50IHR4X2J1ZmZlcl9jb3VudDsKKwljZGZfbmJ1Zl90IGJ1ZmZlcl92YWRkcjsKKwl1aW50MzJfdCBidWZmZXJfcGFkZHI7CisJdWludDMyX3QgKmhlYWRlcl9wdHI7CisJdWludDMyX3QgKnJpbmdfdmFkZHI7CisJaW50IHJldHVybl9jb2RlID0gMDsKKwl1bnNpZ25lZCBpbnQgdHhfY29tcF9yaW5nX3NpemU7CisKKwkvKiBBbGxvY2F0ZSBDRSBXcml0ZSBJbmRleCBXT1JEICovCisJcGRldi0+aXBhX3VjX3R4X3JzYy50eF9jZV9pZHgudmFkZHIgPQorCQljZGZfb3NfbWVtX2FsbG9jX2NvbnNpc3RlbnQoCisJCQlwZGV2LT5vc2RldiwKKwkJCTQsCisJCQkmcGRldi0+aXBhX3VjX3R4X3JzYy50eF9jZV9pZHgucGFkZHIsCisJCQljZGZfZ2V0X2RtYV9tZW1fY29udGV4dCgKKwkJCQkoJnBkZXYtPmlwYV91Y190eF9yc2MudHhfY2VfaWR4KSwKKwkJCQltZW1jdHgpKTsKKwlpZiAoIXBkZXYtPmlwYV91Y190eF9yc2MudHhfY2VfaWR4LnZhZGRyKSB7CisJCWNkZl9wcmludCgiJXM6IENFIFdyaXRlIEluZGV4IFdPUkQgYWxsb2MgZmFpbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCS8qIEFsbG9jYXRlIFRYIENPTVAgUmluZyAqLworCXR4X2NvbXBfcmluZ19zaXplID0gdWNfdHhfYnVmX2NudCAqIHNpemVvZihjZGZfbmJ1Zl90KTsKKwlwZGV2LT5pcGFfdWNfdHhfcnNjLnR4X2NvbXBfYmFzZS52YWRkciA9CisJCWNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudCgKKwkJCXBkZXYtPm9zZGV2LAorCQkJdHhfY29tcF9yaW5nX3NpemUsCisJCQkmcGRldi0+aXBhX3VjX3R4X3JzYy50eF9jb21wX2Jhc2UucGFkZHIsCisJCQljZGZfZ2V0X2RtYV9tZW1fY29udGV4dCgoJnBkZXYtPmlwYV91Y190eF9yc2MuCisJCQkJCQkgdHhfY29tcF9iYXNlKSwKKwkJCQkJCW1lbWN0eCkpOworCWlmICghcGRldi0+aXBhX3VjX3R4X3JzYy50eF9jb21wX2Jhc2UudmFkZHIpIHsKKwkJY2RmX3ByaW50KCIlczogVFggQ09NUCByaW5nIGFsbG9jIGZhaWwiLCBfX2Z1bmNfXyk7CisJCXJldHVybl9jb2RlID0gLUVOT0JVRlM7CisJCWdvdG8gZnJlZV90eF9jZV9pZHg7CisJfQorCisJY2RmX21lbV96ZXJvKHBkZXYtPmlwYV91Y190eF9yc2MudHhfY29tcF9iYXNlLnZhZGRyLCB0eF9jb21wX3Jpbmdfc2l6ZSk7CisKKwkvKiBBbGxvY2F0ZSBUWCBCVUYgdkFkZHJlc3MgU3RvcmFnZSAqLworCXBkZXYtPmlwYV91Y190eF9yc2MudHhfYnVmX3Bvb2xfdmFkZHJfc3RyZyA9CisJCShjZGZfbmJ1Zl90ICopIGNkZl9tZW1fbWFsbG9jKHVjX3R4X2J1Zl9jbnQgKgorCQkJCQkgICAgICBzaXplb2YoY2RmX25idWZfdCkpOworCWlmICghcGRldi0+aXBhX3VjX3R4X3JzYy50eF9idWZfcG9vbF92YWRkcl9zdHJnKSB7CisJCWNkZl9wcmludCgiJXM6IFRYIEJVRiBQT09MIHZhZGRyIHN0b3JhZ2UgYWxsb2MgZmFpbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuX2NvZGUgPSAtRU5PQlVGUzsKKwkJZ290byBmcmVlX3R4X2NvbXBfYmFzZTsKKwl9CisJY2RmX21lbV96ZXJvKHBkZXYtPmlwYV91Y190eF9yc2MudHhfYnVmX3Bvb2xfdmFkZHJfc3RyZywKKwkJICAgICB1Y190eF9idWZfY250ICogc2l6ZW9mKGNkZl9uYnVmX3QpKTsKKworCXJpbmdfdmFkZHIgPSBwZGV2LT5pcGFfdWNfdHhfcnNjLnR4X2NvbXBfYmFzZS52YWRkcjsKKwkvKiBBbGxvY2F0ZSBUWCBidWZmZXJzIGFzIG1hbnkgYXMgcG9zc2libGUgKi8KKwlmb3IgKHR4X2J1ZmZlcl9jb3VudCA9IDA7CisJICAgICB0eF9idWZmZXJfY291bnQgPCAodWNfdHhfYnVmX2NudCAtIDEpOyB0eF9idWZmZXJfY291bnQrKykgeworCQlidWZmZXJfdmFkZHIgPSBjZGZfbmJ1Zl9hbGxvYyhwZGV2LT5vc2RldiwKKwkJCQkJICAgICAgdWNfdHhfYnVmX3N6LCAwLCA0LCBmYWxzZSk7CisJCWlmICghYnVmZmVyX3ZhZGRyKSB7CisJCQljZGZfcHJpbnQoIiVzOiBUWCBCVUYgYWxsb2MgZmFpbCwgbG9vcCBpbmRleDogJWQiLAorCQkJCSAgX19mdW5jX18sIHR4X2J1ZmZlcl9jb3VudCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIEluaXQgYnVmZmVyICovCisJCWNkZl9tZW1femVybyhjZGZfbmJ1Zl9kYXRhKGJ1ZmZlcl92YWRkciksIHVjX3R4X2J1Zl9zeik7CisJCWhlYWRlcl9wdHIgPSAodWludDMyX3QgKikgY2RmX25idWZfZGF0YShidWZmZXJfdmFkZHIpOworCisJCS8qIEhUVCBjb250cm9sIGhlYWRlciAqLworCQkqaGVhZGVyX3B0ciA9IEhUVF9JUEFfVUNfT0ZGTE9BRF9UWF9IRUFERVJfREVGQVVMVDsKKwkJaGVhZGVyX3B0cisrOworCisJCS8qIFBLVCBJRCAqLworCQkqaGVhZGVyX3B0ciB8PSAoKHVpbnQxNl90KSB1Y190eF9wYXJ0aXRpb25fYmFzZSArCisJCQkJdHhfYnVmZmVyX2NvdW50KSA8PCAxNjsKKworCQljZGZfbmJ1Zl9tYXAocGRldi0+b3NkZXYsIGJ1ZmZlcl92YWRkciwgQ0RGX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJYnVmZmVyX3BhZGRyID0gY2RmX25idWZfZ2V0X2ZyYWdfcGFkZHJfbG8oYnVmZmVyX3ZhZGRyLCAwKTsKKwkJaGVhZGVyX3B0cisrOworCisJCS8qIEZyYWcgRGVzYyBQb2ludGVyICovCisJCS8qIDY0Yml0cyBkZXNjcmlwdG9yLCBMb3cgMzJiaXRzICovCisJCSpoZWFkZXJfcHRyID0gKHVpbnQzMl90KSAoYnVmZmVyX3BhZGRyICsgMjApOworCQloZWFkZXJfcHRyKys7CisKKwkJLyogNjRiaXRzIGRlc2NyaXB0b3IsIGhpZ2ggMzJiaXRzICovCisJCSpoZWFkZXJfcHRyID0gMDsKKwkJaGVhZGVyX3B0cisrOworCisJCS8qIGNoYW5yZXEsIHBlZXJpZCAqLworCQkqaGVhZGVyX3B0ciA9IDB4RkZGRkZGRkY7CisKKwkJLyogRlJBRyBIZWFkZXIgKi8KKwkJLyogNiB3b3JkcyBUU08gaGVhZGVyICovCisJCWhlYWRlcl9wdHIgKz0gNjsKKwkJKmhlYWRlcl9wdHIgPSBidWZmZXJfcGFkZHIgKyA2NDsKKworCQkqcmluZ192YWRkciA9IGJ1ZmZlcl9wYWRkcjsKKwkJcGRldi0+aXBhX3VjX3R4X3JzYy50eF9idWZfcG9vbF92YWRkcl9zdHJnW3R4X2J1ZmZlcl9jb3VudF0gPQorCQkJYnVmZmVyX3ZhZGRyOworCQkvKiBNZW1vcnkgYmFycmllciB0byBlbnN1cmUgYWN0dWFsIHZhbHVlIHVwZGF0ZWQgKi8KKworCQlyaW5nX3ZhZGRyICs9IDI7CisJfQorCisJcGRldi0+aXBhX3VjX3R4X3JzYy5hbGxvY190eF9idWZfY250ID0gdHhfYnVmZmVyX2NvdW50OworCisJcmV0dXJuIDA7CisKK2ZyZWVfdHhfY29tcF9iYXNlOgorCWNkZl9vc19tZW1fZnJlZV9jb25zaXN0ZW50KHBkZXYtPm9zZGV2LAorCQkJCSAgIG9sX2NmZ19pcGFfdWNfdHhfbWF4X2J1Zl9jbnQocGRldi0+CisJCQkJCQkJCWN0cmxfcGRldikgKiA0LAorCQkJCSAgIHBkZXYtPmlwYV91Y190eF9yc2MudHhfY29tcF9iYXNlLnZhZGRyLAorCQkJCSAgIHBkZXYtPmlwYV91Y190eF9yc2MudHhfY29tcF9iYXNlLnBhZGRyLAorCQkJCSAgIGNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+CisJCQkJCQkJICAgIGlwYV91Y190eF9yc2MuCisJCQkJCQkJICAgIHR4X2NvbXBfYmFzZSksCisJCQkJCQkJICAgbWVtY3R4KSk7CitmcmVlX3R4X2NlX2lkeDoKKwljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudChwZGV2LT5vc2RldiwKKwkJCQkgICA0LAorCQkJCSAgIHBkZXYtPmlwYV91Y190eF9yc2MudHhfY2VfaWR4LnZhZGRyLAorCQkJCSAgIHBkZXYtPmlwYV91Y190eF9yc2MudHhfY2VfaWR4LnBhZGRyLAorCQkJCSAgIGNkZl9nZXRfZG1hX21lbV9jb250ZXh0KCgmcGRldi0+CisJCQkJCQkJICAgIGlwYV91Y190eF9yc2MuCisJCQkJCQkJICAgIHR4X2NlX2lkeCksCisJCQkJCQkJICAgbWVtY3R4KSk7CisJcmV0dXJuIHJldHVybl9jb2RlOworfQorCitpbnQgaHR0X3R4X2lwYV91Y19kZXRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJdWludDE2X3QgaWR4OworCisJaWYgKHBkZXYtPmlwYV91Y190eF9yc2MudHhfY2VfaWR4LnZhZGRyKSB7CisJCWNkZl9vc19tZW1fZnJlZV9jb25zaXN0ZW50KAorCQkJcGRldi0+b3NkZXYsCisJCQk0LAorCQkJcGRldi0+aXBhX3VjX3R4X3JzYy50eF9jZV9pZHgudmFkZHIsCisJCQlwZGV2LT5pcGFfdWNfdHhfcnNjLnR4X2NlX2lkeC5wYWRkciwKKwkJCWNkZl9nZXRfZG1hX21lbV9jb250ZXh0KAorCQkJCSgmcGRldi0+aXBhX3VjX3R4X3JzYy50eF9jZV9pZHgpLAorCQkJCW1lbWN0eCkpOworCX0KKworCWlmIChwZGV2LT5pcGFfdWNfdHhfcnNjLnR4X2NvbXBfYmFzZS52YWRkcikgeworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudCgKKwkJCXBkZXYtPm9zZGV2LAorCQkJb2xfY2ZnX2lwYV91Y190eF9tYXhfYnVmX2NudChwZGV2LT5jdHJsX3BkZXYpICogNCwKKwkJCXBkZXYtPmlwYV91Y190eF9yc2MudHhfY29tcF9iYXNlLnZhZGRyLAorCQkJcGRldi0+aXBhX3VjX3R4X3JzYy50eF9jb21wX2Jhc2UucGFkZHIsCisJCQljZGZfZ2V0X2RtYV9tZW1fY29udGV4dCgoJnBkZXYtPmlwYV91Y190eF9yc2MuCisJCQkJCQkgdHhfY29tcF9iYXNlKSwKKwkJCQkJCW1lbWN0eCkpOworCX0KKworCS8qIEZyZWUgZWFjaCBzaW5nbGUgYnVmZmVyICovCisJZm9yIChpZHggPSAwOyBpZHggPCBwZGV2LT5pcGFfdWNfdHhfcnNjLmFsbG9jX3R4X2J1Zl9jbnQ7IGlkeCsrKSB7CisJCWlmIChwZGV2LT5pcGFfdWNfdHhfcnNjLnR4X2J1Zl9wb29sX3ZhZGRyX3N0cmdbaWR4XSkgeworCQkJY2RmX25idWZfdW5tYXAocGRldi0+b3NkZXYsCisJCQkJICAgICAgIHBkZXYtPmlwYV91Y190eF9yc2MuCisJCQkJICAgICAgIHR4X2J1Zl9wb29sX3ZhZGRyX3N0cmdbaWR4XSwKKwkJCQkgICAgICAgQ0RGX0RNQV9GUk9NX0RFVklDRSk7CisJCQljZGZfbmJ1Zl9mcmVlKHBkZXYtPmlwYV91Y190eF9yc2MuCisJCQkJICAgICAgdHhfYnVmX3Bvb2xfdmFkZHJfc3RyZ1tpZHhdKTsKKwkJfQorCX0KKworCS8qIEZyZWUgc3RvcmFnZSAqLworCWNkZl9tZW1fZnJlZShwZGV2LT5pcGFfdWNfdHhfcnNjLnR4X2J1Zl9wb29sX3ZhZGRyX3N0cmcpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogSVBBX09GRkxPQUQgKi8KKworI2lmIGRlZmluZWQoRkVBVFVSRV9UU08pCit2b2lkCitodHRfdHhfZGVzY19maWxsX3Rzb19pbmZvKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICpkZXNjLAorCSBzdHJ1Y3QgY2RmX3Rzb19pbmZvX3QgKnRzb19pbmZvKQoreworCXVfaW50MzJfdCAqd29yZDsKKwlpbnQgaTsKKwlzdHJ1Y3QgY2RmX3Rzb19zZWdfZWxlbV90ICp0c29fc2VnID0gdHNvX2luZm8tPmN1cnJfc2VnOworCXN0cnVjdCBtc2R1X2V4dF9kZXNjX3QgKm1zZHVfZXh0X2Rlc2MgPSAoc3RydWN0IG1zZHVfZXh0X2Rlc2NfdCAqKWRlc2M7CisKKwl3b3JkID0gKHVfaW50MzJfdCAqKShkZXNjKTsKKworCS8qIEluaXRpYWxpemUgdGhlIFRTTyBmbGFncyBwZXIgTVNEVSAqLworCSgoc3RydWN0IG1zZHVfZXh0X2Rlc2NfdCAqKW1zZHVfZXh0X2Rlc2MpLT50c29fZmxhZ3MgPQorCQkgdHNvX3NlZy0+c2VnLnRzb19mbGFnczsKKworCS8qIEZpcnN0IDI0IGJ5dGVzICg2KjQpIGNvbnRhaW4gdGhlIFRTTyBmbGFncyAqLworCXdvcmQgKz0gNjsKKworCWZvciAoaSA9IDA7IGkgPCB0c29fc2VnLT5zZWcubnVtX2ZyYWdzOyBpKyspIHsKKwkJLyogWzMxOjBdIGZpcnN0IDMyIGJpdHMgb2YgdGhlIGJ1ZmZlciBwb2ludGVyICAqLworCQkqd29yZCA9IHRzb19zZWctPnNlZy50c29fZnJhZ3NbaV0ucGFkZHJfbG93XzMyOworCQl3b3JkKys7CisJCS8qIFsxNTowXSB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgZmlyc3QgYnVmZmVyIHBvaW50ZXIgKi8KKwkJLyogWzMxOjE2XSBsZW5ndGggb2YgdGhlIGZpcnN0IGJ1ZmZlciAqLworCQkqd29yZCA9ICh0c29fc2VnLT5zZWcudHNvX2ZyYWdzW2ldLmxlbmd0aCA8PCAxNik7CisJCXdvcmQrKzsKKwl9CisKKwlpZiAodHNvX3NlZy0+c2VnLm51bV9mcmFncyA8IEZSQUdfTlVNX01BWCkgeworCQkqd29yZCA9IDA7CisJCXdvcmQrKzsKKwkJKndvcmQgPSAwOworCX0KK30KKyNlbmRpZiAvKiBGRUFUVVJFX1RTTyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC9odHQvaHR0X3R5cGVzLmggYi9jb3JlL2RwL2h0dC9odHRfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDgyYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9odHQvaHR0X3R5cGVzLmgKQEAgLTAsMCArMSwzNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0hUVF9UWVBFU19fSF8KKyNkZWZpbmUgX0hUVF9UWVBFU19fSF8KKworI2luY2x1ZGUgPG9zZGVwLmg+ICAgICAgICAgICAgICAvKiB1aW50MTZfdCwgZG1hX2FkZHJfdCAqLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPiAgICAgICAgICAvKiBjZGZfZGV2aWNlX3QgKi8KKyNpbmNsdWRlIDxjZGZfbG9jay5oPiAgICAgICAgICAgLyogY2RmX3NwaW5sb2NrX3QgKi8KKyNpbmNsdWRlIDxjZGZfc29mdGlycV90aW1lci5oPiAgLyogY2RmX3NvZnRpcnFfdGltZXJfdCAqLworI2luY2x1ZGUgPGNkZl9hdG9taWMuaD4gICAgICAgICAvKiBjZGZfYXRvbWljX2luYyAqLworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90ICovCisjaW5jbHVkZSA8aHRjX2FwaS5oPiAgICAgICAgICAgIC8qIEhUQ19QQUNLRVQgKi8KKworI2luY2x1ZGUgPG9sX2N0cmxfYXBpLmg+ICAgICAgICAvKiBvbF9wZGV2X2hhbmRsZSAqLworI2luY2x1ZGUgPG9sX3R4cnhfYXBpLmg+ICAgICAgICAvKiBvbF90eHJ4X3BkZXZfaGFuZGxlICovCisKKyNkZWZpbmUgREVCVUdfRE1BX0RPTkUKKworI2RlZmluZSBIVFRfVFhfTVVURVhfVFlQRSBjZGZfc3BpbmxvY2tfdAorCisjaWZkZWYgUUNBX1RYX0hUVDJfU1VQUE9SVAorI2lmbmRlZiBIVENfVFhfSFRUMl9NQVhfU0laRQorLyogU2hvdWxkIHN5bmMgdG8gdGhlIHRhcmdldCdzIGltcGxlbWVudGF0aW9uLiAqLworI2RlZmluZSBIVENfVFhfSFRUMl9NQVhfU0laRSAgICAoMTIwKQorI2VuZGlmCisjZW5kaWYgLyogUUNBX1RYX0hUVDJfU1VQUE9SVCAqLworCisKK3N0cnVjdCBodHRfaHRjX3BrdCB7CisJdm9pZCAqcGRldl9jdHh0OworCWRtYV9hZGRyX3QgbmJ1Zl9wYWRkcjsKKwlIVENfUEFDS0VUIGh0Y19wa3Q7CisJdWludDE2X3QgbXNkdV9pZDsKK307CisKK3N0cnVjdCBodHRfaHRjX3BrdF91bmlvbiB7CisJdW5pb24geworCQlzdHJ1Y3QgaHR0X2h0Y19wa3QgcGt0OworCQlzdHJ1Y3QgaHR0X2h0Y19wa3RfdW5pb24gKm5leHQ7CisJfSB1OworfTsKKworLyoKKyAqIEhUVCBob3N0IGRlc2NyaXB0b3I6CisgKiBJbmNsdWRlIHRoZSBodHRfdHhfbXNkdV9kZXNjIHRoYXQgZ2V0cyBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQsCisgKiBidXQgYWxzbyBpbmNsdWRlIHRoZSBIVENfRlJBTUVfSERSIGFuZCBhbGlnbm1lbnQgcGFkZGluZyB0aGF0CisgKiBwcmVjZWRlIHRoZSBodHRfdHhfbXNkdV9kZXNjLgorICogaHRjX3NlbmRfZGF0YV9wa3QgZXhwZWN0cyB0aGlzIGhlYWRlciBzcGFjZSBhdCB0aGUgZnJvbnQgb2YgdGhlCisgKiBpbml0aWFsIGZyYWdtZW50IChpLmUuIHR4IGRlc2NyaXB0b3IpIHRoYXQgaXMgZG93bmxvYWRlZC4KKyAqLworc3RydWN0IGh0dF9ob3N0X3R4X2Rlc2NfdCB7CisJdWludDhfdCBodGNfaGVhZGVyW0hUQ19IRUFERVJfTEVOXTsKKwkvKiBmb3JjZSB0aGUgdHhfZGVzYyBmaWVsZCB0byBiZWdpbiBvbiBhIDQtYnl0ZSBib3VuZGFyeSAqLworCXVuaW9uIHsKKwkJdWludDMyX3QgZHVtbXlfZm9yY2VfYWxpZ247CisJCXN0cnVjdCBodHRfdHhfbXNkdV9kZXNjX3QgdHhfZGVzYzsKKwl9IGFsaWduMzI7Cit9OworCitzdHJ1Y3QgaHR0X3R4X21nbXRfZGVzY19idWYgeworCWNkZl9uYnVmX3QgbXNnX2J1ZjsKKwlBX0JPT0wgaXNfaW51c2U7CisJY2RmX25idWZfdCBtZ210X2ZybTsKK307CisKK3N0cnVjdCBodHRfdHhfbWdtdF9kZXNjX2N0eHQgeworCXN0cnVjdCBodHRfdHhfbWdtdF9kZXNjX2J1ZiAqcG9vbDsKKwlBX1VJTlQzMiBwZW5kaW5nX2NudDsKK307CisKK3N0cnVjdCBodHRfbGlzdF9ub2RlIHsKKwlzdHJ1Y3QgaHR0X2xpc3Rfbm9kZSAqcHJldjsKKwlzdHJ1Y3QgaHR0X2xpc3Rfbm9kZSAqbmV4dDsKK307CisKK3N0cnVjdCBodHRfcnhfaGFzaF9lbnRyeSB7CisJQV9VSU5UMzIgcGFkZHI7CisJY2RmX25idWZfdCBuZXRidWY7CisJQV9VSU5UOCBmcm9tbGlzdDsKKwlzdHJ1Y3QgaHR0X2xpc3Rfbm9kZSBsaXN0bm9kZTsKKyNpZmRlZiBSWF9IQVNIX0RFQlVHCisJQV9VSU5UMzIgY29va2llOworI2VuZGlmCit9OworCitzdHJ1Y3QgaHR0X3J4X2hhc2hfYnVja2V0IHsKKwlzdHJ1Y3QgaHR0X2xpc3Rfbm9kZSBsaXN0aGVhZDsKKwlzdHJ1Y3QgaHR0X3J4X2hhc2hfZW50cnkgKmVudHJpZXM7CisJc3RydWN0IGh0dF9saXN0X25vZGUgZnJlZXBvb2w7CisjaWZkZWYgUlhfSEFTSF9ERUJVRworCUFfVUlOVDMyIGNvdW50OworI2VuZGlmCit9OworCisvKiBJUEEgbWljcm8gY29udHJvbGxlcgorICAgd2xhbiBob3N0IGRyaXZlcgorICAgZmlybXdhcmUgc2hhcmVkIG1lbW9yeSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB1Y19zaGFyZWRfbWVtX3QgeworCXVpbnQzMl90ICp2YWRkcjsKKwljZGZfZG1hX2FkZHJfdCBwYWRkcjsKKwljZGZfZG1hX21lbV9jb250ZXh0KG1lbWN0eCk7Cit9OworCisvKiBNaWNybyBjb250cm9sbGVyIGRhdGFwYXRoIG9mZmxvYWQKKyAqIFdMQU4gVFggcmVzb3VyY2VzICovCitzdHJ1Y3QgaHR0X2lwYV91Y190eF9yZXNvdXJjZV90IHsKKwlzdHJ1Y3QgdWNfc2hhcmVkX21lbV90IHR4X2NlX2lkeDsKKwlzdHJ1Y3QgdWNfc2hhcmVkX21lbV90IHR4X2NvbXBfYmFzZTsKKworCXVpbnQzMl90IHR4X2NvbXBfaWR4X3BhZGRyOworCWNkZl9uYnVmX3QgKnR4X2J1Zl9wb29sX3ZhZGRyX3N0cmc7CisJdWludDMyX3QgYWxsb2NfdHhfYnVmX2NudDsKK307CisKKy8qIE1pY3JvIGNvbnRyb2xsZXIgZGF0YXBhdGggb2ZmbG9hZAorICogV0xBTiBSWCByZXNvdXJjZXMgKi8KK3N0cnVjdCBodHRfaXBhX3VjX3J4X3Jlc291cmNlX3QgeworCWNkZl9kbWFfYWRkcl90IHJ4X3JkeV9pZHhfcGFkZHI7CisJc3RydWN0IHVjX3NoYXJlZF9tZW1fdCByeF9pbmRfcmluZ19iYXNlOworCXN0cnVjdCB1Y19zaGFyZWRfbWVtX3QgcnhfaXBhX3ByY19kb25lX2lkeDsKKwl1aW50MzJfdCByeF9pbmRfcmluZ19zaXplOworCisJLyogMm5kIFJYIHJpbmcgKi8KKwljZGZfZG1hX2FkZHJfdCByeDJfcmR5X2lkeF9wYWRkcjsKKwlzdHJ1Y3QgdWNfc2hhcmVkX21lbV90IHJ4Ml9pbmRfcmluZ19iYXNlOworCXN0cnVjdCB1Y19zaGFyZWRfbWVtX3QgcngyX2lwYV9wcmNfZG9uZV9pZHg7CisJdWludDMyX3QgcngyX2luZF9yaW5nX3NpemU7Cit9OworCitzdHJ1Y3QgaXBhX3VjX3J4X3JpbmdfZWxlbV90IHsKKwl1aW50MzJfdCByeF9wYWNrZXRfcGFkZHI7CisJdWludDE2X3QgdmRldl9pZDsKKwl1aW50MTZfdCByeF9wYWNrZXRfbGVuZzsKK307CisKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkKK3N0cnVjdCBtc2R1X2V4dF9kZXNjX3QgeworI2lmIGRlZmluZWQoRkVBVFVSRV9UU08pCisJc3RydWN0IGNkZl90c29fZmxhZ3NfdCB0c29fZmxhZ3M7CisjZWxzZQorCXVfaW50MzJfdCB0c29fZmxhZzA7CisJdV9pbnQzMl90IHRzb19mbGFnMTsKKwl1X2ludDMyX3QgdHNvX2ZsYWcyOworCXVfaW50MzJfdCB0c29fZmxhZzM7CisJdV9pbnQzMl90IHRzb19mbGFnNDsKKwl1X2ludDMyX3QgdHNvX2ZsYWc1OworI2VuZGlmCisJdV9pbnQzMl90IGZyYWdfcHRyMDsKKwl1X2ludDMyX3QgZnJhZ19sZW4wOworCXVfaW50MzJfdCBmcmFnX3B0cjE7CisJdV9pbnQzMl90IGZyYWdfbGVuMTsKKwl1X2ludDMyX3QgZnJhZ19wdHIyOworCXVfaW50MzJfdCBmcmFnX2xlbjI7CisJdV9pbnQzMl90IGZyYWdfcHRyMzsKKwl1X2ludDMyX3QgZnJhZ19sZW4zOworCXVfaW50MzJfdCBmcmFnX3B0cjQ7CisJdV9pbnQzMl90IGZyYWdfbGVuNDsKKwl1X2ludDMyX3QgZnJhZ19wdHI1OworCXVfaW50MzJfdCBmcmFnX2xlbjU7Cit9OworI2VuZGlmICAvKiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkgKi8KKworc3RydWN0IGh0dF9wZGV2X3QgeworCW9sX3BkZXZfaGFuZGxlIGN0cmxfcGRldjsKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHR4cnhfcGRldjsKKwlIVENfSEFORExFIGh0Y19wZGV2OworCWNkZl9kZXZpY2VfdCBvc2RldjsKKworCUhUQ19FTkRQT0lOVF9JRCBodGNfZW5kcG9pbnQ7CisKKyNpZmRlZiBRQ0FfVFhfSFRUMl9TVVBQT1JUCisJSFRDX0VORFBPSU5UX0lEIGh0Y190eF9odHQyX2VuZHBvaW50OworCXVpbnQxNl90IGh0Y190eF9odHQyX21heF9zaXplOworI2VuZGlmIC8qIFFDQV9UWF9IVFQyX1NVUFBPUlQgKi8KKworI2lmZGVmIEFUSF8xMUFDX1RYQ09NUEFDVAorCUhUVF9UWF9NVVRFWF9UWVBFIHR4bmJ1ZnFfbXV0ZXg7CisJY2RmX25idWZfcXVldWVfdCB0eG5idWZxOworCXN0cnVjdCBodHRfaHRjX3BrdF91bmlvbiAqaHR0X2h0Y19wa3RfbWlzY2xpc3Q7CisjZW5kaWYKKworCXN0cnVjdCBodHRfaHRjX3BrdF91bmlvbiAqaHR0X2h0Y19wa3RfZnJlZWxpc3Q7CisJc3RydWN0IHsKKwkJaW50IGlzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkOworCQlpbnQgZGVmYXVsdF90eF9jb21wX3JlcTsKKwkJaW50IGNlX2NsYXNzaWZ5X2VuYWJsZWQ7CisJfSBjZmc7CisJc3RydWN0IHsKKwkJdWludDhfdCBtYWpvcjsKKwkJdWludDhfdCBtaW5vcjsKKwl9IHRndF92ZXI7CisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpCisJc3RydWN0IHsKKwkJdV9pbnQ4X3QgbWFqb3I7CisJCXVfaW50OF90IG1pbm9yOworCX0gd2lmaV9pcF92ZXI7CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisJc3RydWN0IHsKKwkJc3RydWN0IHsKKwkJCS8qCisJCQkgKiBSaW5nIG9mIG5ldHdvcmsgYnVmZmVyIG9iamVjdHMgLQorCQkJICogVGhpcyByaW5nIGlzIHVzZWQgZXhjbHVzaXZlbHkgYnkgdGhlIGhvc3QgU1cuCisJCQkgKiBUaGlzIHJpbmcgbWlycm9ycyB0aGUgZGV2X2FkZHJzX3JpbmcgdGhhdCBpcyBzaGFyZWQKKwkJCSAqIGJldHdlZW4gdGhlIGhvc3QgU1cgYW5kIHRoZSBNQUMgSFcuCisJCQkgKiBUaGUgaG9zdCBTVyB1c2VzIHRoaXMgbmV0YnVmcyByaW5nIHRvIGxvY2F0ZSB0aGUgbncKKwkJCSAqIGJ1ZmZlciBvYmplY3RzIHdob3NlIGRhdGEgYnVmZmVycyB0aGUgSFcgaGFzIGZpbGxlZC4KKwkJCSAqLworCQkJY2RmX25idWZfdCAqbmV0YnVmc19yaW5nOworCQkJLyoKKwkJCSAqIFJpbmcgb2YgYnVmZmVyIGFkZHJlc3NlcyAtCisJCQkgKiBUaGlzIHJpbmcgaG9sZHMgdGhlICJwaHlzaWNhbCIgZGV2aWNlIGFkZHJlc3Mgb2YgdGhlCisJCQkgKiByeCBidWZmZXJzIHRoZSBob3N0IFNXIHByb3ZpZGVzIGZvciBNQUMgSFcgdG8gZmlsbC4KKwkJCSAqLworI2lmIEhUVF9QQUREUjY0CisJCQl1aW50NjRfdCAqcGFkZHJzX3Jpbmc7CisjZWxzZSAgIC8qICEgSFRUX1BBRERSNjQgKi8KKwkJCXVpbnQzMl90ICpwYWRkcnNfcmluZzsKKyNlbmRpZgorCQkJY2RmX2RtYV9tZW1fY29udGV4dChtZW1jdHgpOworCQl9IGJ1ZjsKKwkJLyoKKwkJICogQmFzZSBhZGRyZXNzIG9mIHJpbmcsIGFzIGEgInBoeXNpY2FsIiBkZXZpY2UgYWRkcmVzcyByYXRoZXIKKwkJICogdGhhbiBhIENQVSBhZGRyZXNzLgorCQkgKi8KKwkJdWludDMyX3QgYmFzZV9wYWRkcjsKKwkJaW50IHNpemU7ICAgICAgIC8qIGhvdyBtYW55IGVsZW1zIGluIHRoZSByaW5nIChwb3dlciBvZiAyKSAqLworCQl1bnNpZ25lZCBzaXplX21hc2s7ICAgICAvKiBzaXplIC0gMSAqLworCisJCWludCBmaWxsX2xldmVsOyAvKiBob3cgbWFueSByeCBidWZmZXJzIHRvIGtlZXAgaW4gdGhlIHJpbmcgKi8KKwkJaW50IGZpbGxfY250OyAgIC8qICMgb2YgcnggYnVmZmVycyAoZnVsbCtlbXB0eSkgaW4gdGhlIHJpbmcgKi8KKworCQkvKgorCQkgKiB0YXJnZXRfaWR4IC0KKwkJICogV2l0aG91dCByZW9yZGVyIG9mZmxvYWQ6CisJCSAqIG5vdCB1c2VkCisJCSAqIFdpdGggcmVvcmRlciBvZmZsb2FkOgorCQkgKiBwb2ludHMgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSByeCByaW5nIGZyb20gd2hpY2ggcnggYnVmZmVycworCQkgKiBhcmUgYXZhaWxhYmxlIHRvIGNvcHkgaW50byB0aGUgTUFDIERNQSByaW5nCisJCSAqLworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgKnZhZGRyOworCQkJdWludDMyX3QgcGFkZHI7CisJCQljZGZfZG1hX21lbV9jb250ZXh0KG1lbWN0eCk7CisJCX0gdGFyZ2V0X2lkeDsKKworCQkvKgorCQkgKiBhbGxvY19pZHgvaG9zdF9pZHggLQorCQkgKiBXaXRob3V0IHJlb3JkZXIgb2ZmbG9hZDoKKwkJICogd2hlcmUgSFRUIFNXIGhhcyBkZXBvc2l0ZWQgZW1wdHkgYnVmZmVycworCQkgKiBUaGlzIGlzIGFsbG9jYXRlZCBpbiBjb25zaXN0ZW50IG1lbSwgc28gdGhhdCB0aGUgRlcgY2FuIHJlYWQKKwkJICogdGhpcyB2YXJpYWJsZSwgYW5kIHByb2dyYW0gdGhlIEhXJ3MgRldfSURYIHJlZyB3aXRoIHRoZSB2YWx1ZQorCQkgKiBvZiB0aGlzIHNoYWRvdyByZWdpc3RlcgorCQkgKiBXaXRoIHJlb3JkZXIgb2ZmbG9hZDoKKwkJICogcG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIGF2YWlsYWJsZSBmcmVlIHJ4IGJ1ZmZlcnMKKwkJICovCisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCAqdmFkZHI7CisJCQl1aW50MzJfdCBwYWRkcjsKKwkJCWNkZl9kbWFfbWVtX2NvbnRleHQobWVtY3R4KTsKKwkJfSBhbGxvY19pZHg7CisKKwkJLyogc3dfcmRfaWR4IC0KKwkJICogd2hlcmUgSFRUIFNXIGhhcyBwcm9jZXNzZWQgYnVmcyBmaWxsZWQgYnkgcnggTUFDIERNQSAqLworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbXNkdV9kZXNjOworCQkJdW5zaWduZWQgbXNkdV9wYXlsZDsKKwkJfSBzd19yZF9pZHg7CisKKwkJLyoKKwkJICogcmVmaWxsX3JldHJ5X3RpbWVyIC0gdGltZXIgdHJpZ2dlcmVkIHdoZW4gdGhlIHJpbmcgaXMgbm90CisJCSAqIHJlZmlsbGVkIHRvIHRoZSBsZXZlbCBleHBlY3RlZAorCQkgKi8KKwkJY2RmX3NvZnRpcnFfdGltZXJfdCByZWZpbGxfcmV0cnlfdGltZXI7CisKKwkJLyoKKwkJICogcmVmaWxsX3JlZl9jbnQgLSByZWYgY250IGZvciBSeCBidWZmZXIgcmVwbGVuaXNobWVudCAtIHRoaXMKKwkJICogdmFyaWFibGUgaXMgdXNlZCB0byBndWFyYW50ZWUgdGhhdCBvbmx5IG9uZSB0aHJlYWQgdHJpZXMKKwkJICogdG8gcmVwbGVuaXNoIFJ4IHJpbmcuCisJCSAqLworCQljZGZfYXRvbWljX3QgcmVmaWxsX3JlZl9jbnQ7CisjaWZkZWYgREVCVUdfRE1BX0RPTkUKKwkJdWludDMyX3QgZGJnX2luaXRpYWxfbXNkdV9wYXlsZDsKKwkJdWludDMyX3QgZGJnX21wZHVfcmFuZ2U7CisJCXVpbnQzMl90IGRiZ19tcGR1X2NvdW50OworCQl1aW50MzJfdCBkYmdfcmluZ19pZHg7CisJCXVpbnQzMl90IGRiZ19yZWZpbGxfY250OworCQl1aW50MzJfdCBkYmdfc3luY19zdWNjZXNzOworI2VuZGlmCisjaWZkZWYgSFRUX1JYX1JFU1RPUkUKKwkJaW50IHJ4X3Jlc2V0OworCQl1aW50OF90IGh0dF9yeF9yZXN0b3JlOworI2VuZGlmCisJCXN0cnVjdCBodHRfcnhfaGFzaF9idWNrZXQgKmhhc2hfdGFibGU7CisJCXVpbnQzMl90IGxpc3Rub2RlX29mZnNldDsKKwl9IHJ4X3Jpbmc7CisJbG9uZyByeF9md19kZXNjX29mZnNldDsKKwlpbnQgcnhfbXBkdV9yYW5nZV9vZmZzZXRfd29yZHM7CisJaW50IHJ4X2luZF9tc2R1X2J5dGVfaWR4OworCisJc3RydWN0IHsKKwkJaW50IHNpemU7ICAgICAgIC8qIG9mIGVhY2ggSFRUIHR4IGRlc2MgKi8KKwkJaW50IHBvb2xfZWxlbXM7CisJCWludCBhbGxvY19jbnQ7CisJCWNoYXIgKnBvb2xfdmFkZHI7CisJCXVpbnQzMl90IHBvb2xfcGFkZHI7CisJCXVpbnQzMl90ICpmcmVlbGlzdDsKKwkJY2RmX2RtYV9tZW1fY29udGV4dChtZW1jdHgpOworCX0gdHhfZGVzY3M7CisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpCisJc3RydWN0IHsKKwkJaW50IHNpemU7IC8qIG9mIGVhY2ggRnJhZ21lbnQvTVNEVS1FeHQgZGVzY3JpcHRvciAqLworCQlpbnQgcG9vbF9lbGVtczsKKwkJY2hhciAqcG9vbF92YWRkcjsKKwkJdWludDMyX3QgcG9vbF9wYWRkcjsKKwkJY2RmX2RtYV9tZW1fY29udGV4dChtZW1jdHgpOworCX0gZnJhZ19kZXNjczsKKyNlbmRpZiAvKiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkgKi8KKworCWludCBkb3dubG9hZF9sZW47CisJdm9pZCAoKnR4X3NlbmRfY29tcGxldGVfcGFydDIpKHZvaWQgKnBkZXYsIEFfU1RBVFVTIHN0YXR1cywKKwkJCQkgICAgICAgY2RmX25idWZfdCBtc2R1LCB1aW50MTZfdCBtc2R1X2lkKTsKKworCUhUVF9UWF9NVVRFWF9UWVBFIGh0dF90eF9tdXRleDsKKworCXN0cnVjdCB7CisJCWludCBodGNfZXJyX2NudDsKKwl9IHN0YXRzOworCisJc3RydWN0IGh0dF90eF9tZ210X2Rlc2NfY3R4dCB0eF9tZ210X2Rlc2NfY3R4dDsKKwlzdHJ1Y3QgdGFyZ2V0ZGVmX3MgKnRhcmdldGRlZjsKKwlzdHJ1Y3QgY2VfcmVnX2RlZiAqdGFyZ2V0X2NlX2RlZjsKKworCXN0cnVjdCBodHRfaXBhX3VjX3R4X3Jlc291cmNlX3QgaXBhX3VjX3R4X3JzYzsKKwlzdHJ1Y3QgaHR0X2lwYV91Y19yeF9yZXNvdXJjZV90IGlwYV91Y19yeF9yc2M7Cit9OworCisjZGVmaW5lIEhUVF9FUElEX0dFVChfaHR0X3BkZXZfaGRsKSAgXAorCSgoKHN0cnVjdCBodHRfcGRldl90ICopKF9odHRfcGRldl9oZGwpKS0+aHRjX2VuZHBvaW50KQorCisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpCisjZGVmaW5lIEhUVF9XSUZJX0lQKHBkZXYsIHgsIHkpICgoKHBkZXYpLT53aWZpX2lwX3Zlci5tYWpvciA9PSAoeCkpICYmCVwKKwkJCQkgKChwZGV2KS0+d2lmaV9pcF92ZXIubWlub3IgPT0gKHkpKSkKKworI2RlZmluZSBIVFRfU0VUX1dJRklfSVAocGRldiwgeCwgeSkgKCgocGRldiktPndpZmlfaXBfdmVyLm1ham9yID0gKHgpKSAmJiBcCisJCQkJICAgICAoKHBkZXYpLT53aWZpX2lwX3Zlci5taW5vciA9ICh5KSkpCisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisKKyNlbmRpZiAvKiBfSFRUX1RZUEVTX19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC9odHQvcnhfZGVzYy5oIGIvY29yZS9kcC9odHQvcnhfZGVzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTYzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL2h0dC9yeF9kZXNjLmgKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1JYX0RFU0NfSF8KKyNkZWZpbmUgX1JYX0RFU0NfSF8KKworLyoKKyAqIFJFTUlORDogQ29weSBvbmUgb2YgcnhfZGVzYyByZWxhdGVkIHN0cnVjdHVyZXMgaGVyZSBmb3IgZXhwb3J0LAorICogICAgICAgICBob3BlcyB0aGV5IGFyZSBhbHdheXMgdGhlIHNhbWUgYmV0d2VlbiBQZXJlZ3JpbmUgYW5kIFJvbWUgaW4gZnV0dXJlCisgKi8KK3N0cnVjdCByeF9hdHRlbnRpb24geworCXZvbGF0aWxlCisJdWludDMyX3QgZmlyc3RfbXBkdToxLCAvKiBbMF0gKi8KKwkJbGFzdF9tcGR1OjEsIC8qIFsxXSAqLworCQltY2FzdF9iY2FzdDoxLCAvKiBbMl0gKi8KKwkJcGVlcl9pZHhfaW52YWxpZDoxLCAvKiBbM10gKi8KKwkJcGVlcl9pZHhfdGltZW91dDoxLCAvKiBbNF0gKi8KKwkJcG93ZXJfbWdtdDoxLCAvKiBbNV0gKi8KKwkJbm9uX3FvczoxLCAvKiBbNl0gKi8KKwkJbnVsbF9kYXRhOjEsIC8qIFs3XSAqLworCQltZ210X3R5cGU6MSwgLyogWzhdICovCisJCWN0cmxfdHlwZToxLCAvKiBbOV0gKi8KKwkJbW9yZV9kYXRhOjEsIC8qIFsxMF0gKi8KKwkJZW9zcDoxLCAvKiBbMTFdICovCisJCXVfYXBzZF90cmlnZ2VyOjEsIC8qIFsxMl0gKi8KKwkJZnJhZ21lbnQ6MSwgLyogWzEzXSAqLworCQlvcmRlcjoxLCAvKiBbMTRdICovCisJCWNsYXNzaWZpY2F0aW9uOjEsIC8qIFsxNV0gKi8KKwkJb3ZlcmZsb3dfZXJyOjEsIC8qIFsxNl0gKi8KKwkJbXNkdV9sZW5ndGhfZXJyOjEsIC8qIFsxN10gKi8KKwkJdGNwX3VkcF9jaGtzdW1fZmFpbDoxLCAvKiBbMThdICovCisJCWlwX2Noa3N1bV9mYWlsOjEsIC8qIFsxOV0gKi8KKwkJc2FfaWR4X2ludmFsaWQ6MSwgLyogWzIwXSAqLworCQlkYV9pZHhfaW52YWxpZDoxLCAvKiBbMjFdICovCisJCXNhX2lkeF90aW1lb3V0OjEsIC8qIFsyMl0gKi8KKwkJZGFfaWR4X3RpbWVvdXQ6MSwgLyogWzIzXSAqLworCQllbmNyeXB0X3JlcXVpcmVkOjEsIC8qIFsyNF0gKi8KKwkJZGlyZWN0ZWQ6MSwgLyogWzI1XSAqLworCQlidWZmZXJfZnJhZ21lbnQ6MSwgLyogWzI2XSAqLworCQltcGR1X2xlbmd0aF9lcnI6MSwgLyogWzI3XSAqLworCQl0a2lwX21pY19lcnI6MSwgLyogWzI4XSAqLworCQlkZWNyeXB0X2VycjoxLCAvKiBbMjldICovCisJCWZjc19lcnI6MSwgLyogWzMwXSAqLworCQltc2R1X2RvbmU6MTsgLyogWzMxXSAqLworfTsKKworc3RydWN0IHJ4X2ZyYWdfaW5mbyB7CisJdm9sYXRpbGUKKwl1aW50MzJfdCByaW5nMF9tb3JlX2NvdW50OjgsICAgLyogWzc6MF0gKi8KKwkJcmluZzFfbW9yZV9jb3VudDo4LCAvKiBbMTU6OF0gKi8KKwkJcmluZzJfbW9yZV9jb3VudDo4LCAvKiBbMjM6MTZdICovCisJCXJpbmczX21vcmVfY291bnQ6ODsgLyogWzMxOjI0XSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgcmluZzRfbW9yZV9jb3VudDo4LCAvKiBbNzowXSAqLworCQlyaW5nNV9tb3JlX2NvdW50OjgsIC8qIFsxNTo4XSAqLworCQlyaW5nNl9tb3JlX2NvdW50OjgsIC8qIFsyMzoxNl0gKi8KKwkJcmluZzdfbW9yZV9jb3VudDo4OyAvKiBbMzE6MjRdICovCit9OworCitzdHJ1Y3QgcnhfbXNkdV9zdGFydCB7CisJdm9sYXRpbGUKKwl1aW50MzJfdCBtc2R1X2xlbmd0aDoxNCwgLyogWzEzOjBdICovCisjaWYgZGVmaW5lZChIRUxJVU1QTFVTKQorCQlsM19vZmZzZXQ6NywgLyogWzIwOjE0XSAqLworCQlpcHNlY19haDoxLCAvKiBbMjFdICovCisJCXJlc2VydmVkXzBhOjIsIC8qIFsyMzoyMl0gKi8KKwkJbDRfb2Zmc2V0OjcsIC8qIFszMDoyNF0gKi8KKwkJaXBzZWNfZXNwOjE7IC8qIFszMV0gKi8KKyNlbHNlCisJCWlwX29mZnNldDo2LCAvKiBbMTk6MTRdICovCisJCXJpbmdfbWFzazo0LCAvKiBbMjM6MjBdICovCisJCXRjcF91ZHBfb2Zmc2V0OjcsIC8qIFszMDoyNF0gKi8KKwkJcmVzZXJ2ZWRfMGM6MTsgLyogWzMxXSAqLworI2VuZGlmIC8qIGRlZmluZWQoSEVMSVVNUExVUykgKi8KKyNpZiBkZWZpbmVkKEhFTElVTVBMVVMpCisJdm9sYXRpbGUgdWludDMyX3QgZmxvd19pZF90b2VwbGl0ejozMjsgLyogWzMxOjBdICovCisjZWxzZQorCXZvbGF0aWxlIHVpbnQzMl90IGZsb3dfaWRfY3JjOjMyOyAvKiBbMzE6MF0gKi8KKyNlbmRpZiAvKiBkZWZpbmVkKEhFTElVTVBMVVMpICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCBtc2R1X251bWJlcjo4LCAvKiBbNzowXSAqLworCQlkZWNhcF9mb3JtYXQ6MiwgLyogWzk6OF0gKi8KKwkJaXB2NF9wcm90bzoxLCAvKiBbMTBdICovCisJCWlwdjZfcHJvdG86MSwgLyogWzExXSAqLworCQl0Y3BfcHJvdG86MSwgLyogWzEyXSAqLworCQl1ZHBfcHJvdG86MSwgLyogWzEzXSAqLworCQlpcF9mcmFnOjEsIC8qIFsxNF0gKi8KKwkJdGNwX29ubHlfYWNrOjEsIC8qIFsxNV0gKi8KKwkJc2FfaWR4OjExLCAvKiBbMjY6MTZdICovCisJCXJlc2VydmVkXzJiOjU7IC8qIFszMToyN10gKi8KKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkKKwl2b2xhdGlsZQorCXVpbnQzMl90IGRhX2lkeDoxMSwgLyogWzEwOjBdICovCisJCWRhX2lzX2JjYXN0X21jYXN0OjEsIC8qIFsxMV0gKi8KKwkJcmVzZXJ2ZWRfM2E6NCwgLyogWzE1OjEyXSAqLworCQlpcDRfcHJvdG9jb2xfaXA2X25leHRfaGVhZGVyOjgsIC8qIFsyMzoxNl0gKi8KKwkJcmluZ19tYXNrOjg7IC8qIFszMToyNF0gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCB0b2VwbGl0el9oYXNoXzJfb3JfNDozMjsgLyogWzMxOjBdICovCisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCit9OworCitzdHJ1Y3QgcnhfbXNkdV9lbmQgeworCXZvbGF0aWxlCisJdWludDMyX3QgaXBfaGRyX2Noa3N1bToxNiwgLyogWzE1OjBdICovCisJCXRjcF91ZHBfY2hrc3VtOjE2OyAvKiBbMzE6MTZdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCBrZXlfaWRfb2N0ZXQ6OCwgLyogWzc6MF0gKi8KKyNpZiBkZWZpbmVkKEhFTElVTVBMVVMpCisJCWNsYXNzaWZpY2F0aW9uX3J1bGU6NiwgLyogWzEzOjhdICovCisJCWNsYXNzaWZ5X25vdF9kb25lX3RydW5jYXRlOjEsIC8qIFsxNF0gKi8KKwkJY2xhc3NpZnlfbm90X2RvbmVfY2NlX2RpczoxLCAvKiBbMTVdICovCisjZWxzZQorCQljbGFzc2lmaWNhdGlvbl9maWx0ZXI6OCwgLyogWzE1OjhdICovCisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTKSAqLworCWV4dF93YXBpX3BuXzYzXzQ4OjE2OyAvKiBbMzE6MTZdICovCisJdm9sYXRpbGUgdWludDMyX3QgZXh0X3dhcGlfcG5fOTVfNjQ6MzI7IC8qIFszMTowXSAqLworCXZvbGF0aWxlIHVpbnQzMl90IGV4dF93YXBpX3BuXzEyN185NjozMjsgLyogWzMxOjBdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCByZXBvcnRlZF9tcGR1X2xlbmd0aDoxNCwgLyogWzEzOjBdICovCisJCWZpcnN0X21zZHU6MSwgLyogWzE0XSAqLworCQlsYXN0X21zZHU6MSwgLyogWzE1XSAqLworI2lmIGRlZmluZWQoSEVMSVVNUExVUykKKwkJc2FfaWR4X3RpbWVvdXQ6MSwgLyogWzE2XSAqLworCQlkYV9pZHhfdGltZW91dDoxLCAvKiBbMTddICovCisJCW1zZHVfbGltaXRfZXJyb3I6MSwgLyogWzE4XSAqLworCQljbGFzc2lmeV9yaW5nX21hc2s6OCwgLyogWzI2OjE5XSAqLworI2VuZGlmIC8qIGRlZmluZWQoSEVMSVVNUExVUykgKi8KKwkJcmVzZXJ2ZWRfM2E6MywgLyogWzI5OjI3XSAqLworCQlwcmVfZGVsaW1fZXJyOjEsIC8qIFszMF0gKi8KKwkJcmVzZXJ2ZWRfM2I6MTsgLyogWzMxXSAqLworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorCXZvbGF0aWxlIHVpbnQzMl90IGlwdjZfb3B0aW9uc19jcmM6MzI7CisJdm9sYXRpbGUgdWludDMyX3QgdGNwX3NlcV9udW1iZXI6MzI7CisJdm9sYXRpbGUgdWludDMyX3QgdGNwX2Fja19udW1iZXI6MzI7CisJdm9sYXRpbGUKKwl1aW50MzJfdCB0Y3BfZmxhZzo5LCAvKiBbODowXSAqLworCQlscm9fZWxpZ2libGU6MSwgLyogWzldICovCisJCWwzX2hlYWRlcl9wYWRkaW5nOjMsIC8qIFsxMjoxMF0gKi8KKwkJcmVzZXJ2ZWRfOGE6MywgLyogWzE1OjEzXSAqLworCQl3aW5kb3dfc2l6ZToxNjsgLyogWzMxOjE2XSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgZGFfb2Zmc2V0OjYsIC8qIFs1OjBdICovCisJCXNhX29mZnNldDo2LCAvKiBbMTE6Nl0gKi8KKwkJZGFfb2Zmc2V0X3ZhbGlkOjEsIC8qIFsxMl0gKi8KKwkJc2Ffb2Zmc2V0X3ZhbGlkOjEsIC8qIFsxM10gKi8KKwkJdHlwZV9vZmZzZXQ6NywgLyogWzIwOjE0XSAqLworCQlyZXNlcnZlZF85YToxMTsgLyogWzMxOjIxXSAqLworCXZvbGF0aWxlIHVpbnQzMl90IHJ1bGVfaW5kaWNhdGlvbl8zMV8wOjMyOworCXZvbGF0aWxlIHVpbnQzMl90IHJ1bGVfaW5kaWNhdGlvbl82M18zMjozMjsKKwl2b2xhdGlsZSB1aW50MzJfdCBydWxlX2luZGljYXRpb25fOTVfNjQ6MzI7CisJdm9sYXRpbGUgdWludDMyX3QgcnVsZV9pbmRpY2F0aW9uXzEyN185NjozMjsKKyNlbmRpZiAvKiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkgKi8KK307CisKK3N0cnVjdCByeF9tcGR1X2VuZCB7CisJdm9sYXRpbGUKKwl1aW50MzJfdCByZXNlcnZlZF8wOjEzLCAvKiBbMTI6MF0gKi8KKwkJb3ZlcmZsb3dfZXJyOjEsIC8qIFsxM10gKi8KKwkJbGFzdF9tcGR1OjEsIC8qIFsxNF0gKi8KKwkJcG9zdF9kZWxpbV9lcnI6MSwgLyogWzE1XSAqLworCQlwb3N0X2RlbGltX2NudDoxMiwgLyogWzI3OjE2XSAqLworCQltcGR1X2xlbmd0aF9lcnI6MSwgLyogWzI4XSAqLworCQl0a2lwX21pY19lcnI6MSwgLyogWzI5XSAqLworCQlkZWNyeXB0X2VycjoxLCAvKiBbMzBdICovCisJCWZjc19lcnI6MTsgLyogWzMxXSAqLworfTsKKworCisjaWYgZGVmaW5lZChIRUxJVU1QTFVTKQorCitzdHJ1Y3QgcnhfbXBkdV9zdGFydCB7CisJdm9sYXRpbGUKKwl1aW50MzJfdCBwZWVyX2lkeDoxMSwgLyogWzEwOjBdICovCisJCWZyX2RzOjEsIC8qIFsxMV0gKi8KKwkJdG9fZHM6MSwgLyogWzEyXSAqLworCQllbmNyeXB0ZWQ6MSwgLyogWzEzXSAqLworCQlyZXRyeToxLCAvKiBbMTRdICovCisJCXJlc2VydmVkOjEsIC8qIFsxNV0gKi8KKwkJc2VxX251bToxMiwgLyogWzI3OjE2XSAqLworCQllbmNyeXB0X3R5cGU6NDsgLyogWzMxOjI4XSAqLworCXZvbGF0aWxlIHVpbnQzMl90IHBuXzMxXzA6MzI7IC8qIFszMTowXSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgcG5fNDdfMzI6MTYsIC8qIFsxNTowXSAqLworCQl0b2VwbGl0el9oYXNoOjIsIC8qIFsxNzoxNl0gKi8KKwkJcmVzZXJ2ZWRfMjoxMCwgLyogWzI3OjE4XSAqLworCQl0aWQ6NDsgLyogWzMxOjI4XSAqLworfTsKKworCitzdHJ1Y3QgcnhfcHBkdV9zdGFydCB7CisJdm9sYXRpbGUKKwl1aW50MzJfdCByc3NpX3ByaV9jaGFpbjA6OCwgLyogWzc6MF0gKi8KKwkJcnNzaV9zZWMyMF9jaGFpbjA6OCwgLyogWzE1OjhdICovCisJCXJzc2lfc2VjNDBfY2hhaW4wOjgsIC8qIFsyMzoxNl0gKi8KKwkJcnNzaV9zZWM4MF9jaGFpbjA6ODsgLyogWzMxOjI0XSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgcnNzaV9wcmlfY2hhaW4xOjgsIC8qIFs3OjBdICovCisJCXJzc2lfc2VjMjBfY2hhaW4xOjgsIC8qIFsxNTo4XSAqLworCQlyc3NpX3NlYzQwX2NoYWluMTo4LCAvKiBbMjM6MTZdICovCisJCXJzc2lfc2VjODBfY2hhaW4xOjg7IC8qIFszMToyNF0gKi8KKwl2b2xhdGlsZQorCXVpbnQzMl90IHJzc2lfcHJpX2NoYWluMjo4LCAvKiBbNzowXSAqLworCQlyc3NpX3NlYzIwX2NoYWluMjo4LCAvKiBbMTU6OF0gKi8KKwkJcnNzaV9zZWM0MF9jaGFpbjI6OCwgLyogWzIzOjE2XSAqLworCQlyc3NpX3NlYzgwX2NoYWluMjo4OyAvKiBbMzE6MjRdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCByc3NpX3ByaV9jaGFpbjM6OCwgLyogWzc6MF0gKi8KKwkJcnNzaV9zZWMyMF9jaGFpbjM6OCwgLyogWzE1OjhdICovCisJCXJzc2lfc2VjNDBfY2hhaW4zOjgsIC8qIFsyMzoxNl0gKi8KKwkJcnNzaV9zZWM4MF9jaGFpbjM6ODsgLyogWzMxOjI0XSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgcnNzaV9jb21iOjgsIC8qIFs3OjBdICovCisJCWJhbmR3aWR0aDozLCAvKiBbMTA6OF0gKi8KKwkJcmVzZXJ2ZWRfNGE6NSwgLyogWzE1OjExXSAqLworCQlyc3NpX2NvbWJfaHQ6OCwgLyogWzIzOjE2XSAqLworCQlyZXNlcnZlZF80Yjo4OyAvKiBbMzE6MjRdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCBsX3NpZ19yYXRlOjQsIC8qWzM6MF0gKi8KKwkJbF9zaWdfcmF0ZV9zZWxlY3Q6MSwgLyogWzRdICovCisJCWxfc2lnX2xlbmd0aDoxMiwgLyogWzE2OjVdICovCisJCWxfc2lnX3Bhcml0eToxLCAvKiBbMTddICovCisJCWxfc2lnX3RhaWw6NiwgLyogWzIzOjE4XSAqLworCQlwcmVhbWJsZV90eXBlOjg7IC8qIFszMToyNF0gKi8KKwl2b2xhdGlsZQorCXVpbnQzMl90IGh0X3NpZ192aHRfc2lnX2FoX3NpZ19hXzE6MjQsIC8qIFsyMzowXSAqLworCQljYXB0dXJlZF9pbXBsaWNpdF9zb3VuZGluZzoxLCAvKiBbMjRdICovCisJCXJlc2VydmVkXzY6NzsgLyogWzMxOjI1XSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgaHRfc2lnX3ZodF9zaWdfYWhfc2lnX2FfMjoyNCwgLyogWzIzOjBdICovCisJCXJlc2VydmVkXzc6ODsgLyogWzMxOjI0XSAqLworCXZvbGF0aWxlIHVpbnQzMl90IHZodF9zaWdfYjozMjsgLyogWzMxOjBdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCBzZXJ2aWNlOjE2LCAvKiBbMTU6MF0gKi8KKwkJcmVzZXJ2ZWRfOToxNjsgLyogWzMxOjE2XSAqLworfTsKK3N0cnVjdCByeF9sb2NhdGlvbl9pbmZvIHsKKwl2b2xhdGlsZQorCXVpbnQzMl90IHJ0dF9mYWNfbGVnYWN5OjE0LCAvKiBbMTM6MF0gKi8KKwkJcnR0X2ZhY19sZWdhY3lfc3RhdHVzOjEsIC8qIFsxNF0gKi8KKwkJcnR0X2ZhY192aHQ6MTQsIC8qIFsyODoxNV0gKi8KKwkJcnR0X2ZhY192aHRfc3RhdHVzOjEsIC8qIFsyOV0gKi8KKwkJcnR0X2Nmcl9zdGF0dXM6MSwgLyogWzMwXSAqLworCQlydHRfY2lyX3N0YXR1czoxOyAvKiBbMzFdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCBydHRfZmFjX3NpZnM6MTAsIC8qIFs5OjBdICovCisJCXJ0dF9mYWNfc2lmc19zdGF0dXM6MiwgLyogWzExOjEwXSAqLworCQlydHRfY2hhbm5lbF9kdW1wX3NpemU6MTEsIC8qIFsyMjoxMl0gKi8KKwkJcnR0X21hY19waHlfcGhhc2U6MiwgLyogWzI0OjIzXSAqLworCQlydHRfaHdfaWZmdF9tb2RlOjEsIC8qIFsyNV0gKi8KKwkJcnR0X2J0Y2Zfc3RhdHVzOjEsIC8qIFsyNl0gKi8KKwkJcnR0X3ByZWFtYmxlX3R5cGU6MiwgLyogWzI4OjI3XSAqLworCQlydHRfcGt0X2J3OjIsIC8qIFszMDoyOV0gKi8KKwkJcnR0X2dpX3R5cGU6MTsgLyogWzMxXSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgcnR0X21jc19yYXRlOjQsIC8qIFszOjBdICovCisJCXJ0dF9zdHJvbmdlc3RfY2hhaW46MiwgLyogWzU6NF0gKi8KKwkJcnR0X3BoYXNlX2p1bXA6NywgLyogWzEyOjZdICovCisJCXJ0dF9yeF9jaGFpbl9tYXNrOjQsIC8qIFsxNjoxM10gKi8KKwkJcnR0X3R4X2RhdGFfc3RhcnRfeF9waGFzZToxLCAvKiBbMTddICovCisJCXJlc2VydmVkXzI6MTMsIC8qIFszMDoxOF0gKi8KKwkJcnhfbG9jYXRpb25faW5mb192YWxpZDoxOyAvKiBbMzFdICovCit9OworCitzdHJ1Y3QgcnhfcGt0X2VuZCB7CisJdm9sYXRpbGUKKwl1aW50MzJfdCByeF9zdWNjZXNzOjEsIC8qIFswXSAqLworCQlyZXNlcnZlZF8wYToyLCAvKiBbMjoxXSAqLworCQllcnJvcl90eF9pbnRlcnJ1cHRfcng6MSwgLyogWzNdICovCisJCWVycm9yX29mZG1fcG93ZXJfZHJvcDoxLCAvKiBbNF0gKi8KKwkJZXJyb3Jfb2ZkbV9yZXN0YXJ0OjEsIC8qIFs1XSAqLworCQllcnJvcl9jY2tfcG93ZXJfZHJvcDoxLCAvKiBbNl0gKi8KKwkJZXJyb3JfY2NrX3Jlc3RhcnQ6MSwgLyogWzddICovCisJCXJlc2VydmVkXzBiOjI0OyAvKiBbMzE6OF0gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBwaHlfdGltZXN0YW1wXzFfbG93ZXJfMzI6MzI7IC8qIFszMTowXSAqLworCXZvbGF0aWxlIHVpbnQzMl90IHBoeV90aW1lc3RhbXBfMV91cHBlcl8zMjozMjsgLyogWzMxOjBdICovCisJdm9sYXRpbGUgdWludDMyX3QgcGh5X3RpbWVzdGFtcF8yX2xvd2VyXzMyOjMyOyAvKiBbMzE6MF0gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBwaHlfdGltZXN0YW1wXzJfdXBwZXJfMzI6MzI7IC8qIFszMTowXSAqLworCXN0cnVjdCByeF9sb2NhdGlvbl9pbmZvIHJ4X2xvY2F0aW9uX2luZm87Cit9OworCitzdHJ1Y3QgcnhfcGh5X3BwZHVfZW5kIHsKKwl2b2xhdGlsZQorCXVpbnQzMl90IHJlc2VydmVkXzBhOjIsIC8qIFsxOjBdICovCisJCWVycm9yX3JhZGFyOjEsIC8qIFsyXSAqLworCQllcnJvcl9yeF9hYm9ydDoxLCAvKiBbM10gKi8KKwkJZXJyb3JfcnhfbmFwOjEsIC8qIFs0XSAqLworCQllcnJvcl9vZmRtX3RpbWluZzoxLCAvKiBbNV0gKi8KKwkJZXJyb3Jfb2ZkbV9zaWduYWxfcGFyaXR5OjEsIC8qIFs2XSAqLworCQllcnJvcl9vZmRtX3JhdGVfaWxsZWdhbDoxLCAvKiBbN10gKi8KKwkJZXJyb3Jfb2ZkbV9sZW5ndGhfaWxsZWdhbDoxLCAvKiBbOF0gKi8KKwkJZXJyb3JfcHBkdV9vZmRtX3Jlc3RhcnQ6MSwgLyogWzldICovCisJCWVycm9yX29mZG1fc2VydmljZToxLCAvKiBbMTBdICovCisJCWVycm9yX3BwZHVfb2ZkbV9wb3dlcl9kcm9wOjEsIC8qIFsxMV0gKi8KKwkJZXJyb3JfY2NrX2Jsb2NrZXI6MSwgLyogWzEyXSAqLworCQllcnJvcl9jY2tfdGltaW5nOjEsIC8qIFsxM10gKi8KKwkJZXJyb3JfY2NrX2hlYWRlcl9jcmM6MSwgLyogWzE0XSAqLworCQllcnJvcl9jY2tfcmF0ZV9pbGxlZ2FsOjEsIC8qIFsxNV0gKi8KKwkJZXJyb3JfY2NrX2xlbmd0aF9pbGxlZ2FsOjEsIC8qIFsxNl0gKi8KKwkJZXJyb3JfcHBkdV9jY2tfcmVzdGFydDoxLCAvKiBbMTddICovCisJCWVycm9yX2Nja19zZXJ2aWNlOjEsIC8qIFsxOF0gKi8KKwkJZXJyb3JfcHBkdV9jY2tfcG93ZXJfZHJvcDoxLCAvKiBbMTldICovCisJCWVycm9yX2h0X2NyY19lcnI6MSwgLyogWzIwXSAqLworCQllcnJvcl9odF9sZW5ndGhfaWxsZWdhbDoxLCAvKiBbMjFdICovCisJCWVycm9yX2h0X3JhdGVfaWxsZWdhbDoxLCAvKiBbMjJdICovCisJCWVycm9yX2h0X3psZjoxLCAvKiBbMjNdICovCisJCWVycm9yX2ZhbHNlX3JhZGFyX2V4dDoxLCAvKiBbMjRdICovCisJCWVycm9yX2dyZWVuX2ZpZWxkOjEsIC8qIFsyNV0gKi8KKwkJZXJyb3Jfc3BlY3RyYWxfc2NhbjoxLCAvKiBbMjZdICovCisJCWVycm9yX3J4X2J3X2d0X2R5bl9idzoxLCAvKiBbMjddICovCisJCWVycm9yX2xlZ19odF9taXNtYXRjaDoxLCAvKiBbMjhdICovCisJCWVycm9yX3ZodF9jcmNfZXJyb3I6MSwgLyogWzI5XSAqLworCQllcnJvcl92aHRfc2lnYV91bnN1cHBvcnRlZDoxLCAvKiBbMzBdICovCisJCWVycm9yX3ZodF9sc2lnX2xlbl9pbnZhbGlkOjE7IC8qIFszMV0gKi8KKwl2b2xhdGlsZQorCXVpbnQzMl90IGVycm9yX3ZodF9uZHBfb3JfemxmOjEsIC8qIFswXSAqLworCQllcnJvcl92aHRfbnN5bV9sdF96ZXJvOjEsIC8qIFsxXSAqLworCQllcnJvcl92aHRfcnhfZXh0cmFfc3ltYm9sX21pc21hdGNoOjEsIC8qIFsyXSAqLworCQllcnJvcl92aHRfcnhfc2tpcF9ncm91cF9pZDA6MSwgLyogWzNdICovCisJCWVycm9yX3ZodF9yeF9za2lwX2dyb3VwX2lkMXRvNjI6MSwgLyogWzRdICovCisJCWVycm9yX3ZodF9yeF9za2lwX2dyb3VwX2lkNjM6MSwgLyogWzVdICovCisJCWVycm9yX29mZG1fbGRwY19kZWNvZGVyX2Rpc2FibGVkOjEsIC8qIFs2XSAqLworCQllcnJvcl9kZWZlcl9uYXA6MSwgLyogWzddICovCisJCWVycm9yX2Zkb21haW5fdGltZW91dDoxLCAvKiBbOF0gKi8KKwkJZXJyb3JfbHNpZ19yZWxfY2hlY2s6MSwgLyogWzldICovCisJCWVycm9yX2J0X2NvbGxpc2lvbjoxLCAvKiBbMTBdICovCisJCWVycm9yX3Vuc3VwcG9ydGVkX211X2ZlZWRiYWNrOjEsIC8qIFsxMV0gKi8KKwkJZXJyb3JfcHBkdV90eF9pbnRlcnJ1cHRfcng6MSwgLyogWzEyXSAqLworCQllcnJvcl9yeF91bnN1cHBvcnRlZF9jYmY6MSwgLyogWzEzXSAqLworCQlyZXNlcnZlZF8xOjE4OyAvKiBbMzE6MTRdICovCit9OworCitzdHJ1Y3QgcnhfdGltaW5nX29mZnNldCB7CisJdm9sYXRpbGUKKwl1aW50MzJfdCB0aW1pbmdfb2Zmc2V0OjEyLCAvKiBbMTE6MF0gKi8KKwkJcmVzZXJ2ZWQ6MjA7IC8qIFszMToxMl0gKi8KK307CisKK3N0cnVjdCByeF9wcGR1X2VuZCB7CisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3AwOjMyOworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wMTozMjsKKwl2b2xhdGlsZSB1aW50MzJfdCBldm1fcDI6MzI7CisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3AzOjMyOworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wNDozMjsKKwl2b2xhdGlsZSB1aW50MzJfdCBldm1fcDU6MzI7CisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3A2OjMyOworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wNzozMjsKKwl2b2xhdGlsZSB1aW50MzJfdCBldm1fcDg6MzI7CisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3A5OjMyOworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wMTA6MzI7CisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3AxMTozMjsKKwl2b2xhdGlsZSB1aW50MzJfdCBldm1fcDEyOjMyOworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wMTM6MzI7CisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3AxNDozMjsKKwl2b2xhdGlsZSB1aW50MzJfdCBldm1fcDE1OjMyOworCXZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkXzE2OjMyOworCXZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkXzE3OjMyOworCXZvbGF0aWxlIHVpbnQzMl90IHdiX3RpbWVzdGFtcF9sb3dlcl8zMjozMjsKKwl2b2xhdGlsZSB1aW50MzJfdCB3Yl90aW1lc3RhbXBfdXBwZXJfMzI6MzI7CisJc3RydWN0IHJ4X3BrdF9lbmQgcnhfcGt0X2VuZDsKKwlzdHJ1Y3QgcnhfcGh5X3BwZHVfZW5kIHJ4X3BoeV9wcGR1X2VuZDsKKwlzdHJ1Y3QgcnhfdGltaW5nX29mZnNldCByeF90aW1pbmdfb2Zmc2V0OworCXZvbGF0aWxlCisJdWludDMyX3QgcnhfYW50ZW5uYToyNCwgLyogWzIzOjBdICovCisJCXR4X2h0X3ZodF9hY2s6MSwgLyogWzI0XSAqLworCQlyeF9wa3RfZW5kX3ZhbGlkOjEsIC8qIFsyNV0gKi8KKwkJcnhfcGh5X3BwZHVfZW5kX3ZhbGlkOjEsIC8qIFsyNl0gKi8KKwkJcnhfdGltaW5nX29mZnNldF92YWxpZDoxLCAvKiBbMjddICovCisJCWJiX2NhcHR1cmVkX2NoYW5uZWw6MSwgLyogWzI4XSAqLworCQl1bnN1cHBvcnRlZF9tdV9uYzoxLCAvKiBbMjldICovCisJCW90cF90eGJmX2Rpc2FibGU6MSwgLyogWzMwXSAqLworCQlyZXNlcnZlZF8zMToxOyAvKiBbMzFdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCBjb2V4X2J0X3R4X2Zyb21fc3RhcnRfb2Zfcng6MSwgLyogWzBdICovCisJCWNvZXhfYnRfdHhfYWZ0ZXJfc3RhcnRfb2Zfcng6MSwgLyogWzFdICovCisJCWNvZXhfd2FuX3R4X2Zyb21fc3RhcnRfb2Zfcng6MSwgLyogWzJdICovCisJCWNvZXhfd2FuX3R4X2FmdGVyX3N0YXJ0X29mX3J4OjEsIC8qIFszXSAqLworCQljb2V4X3dsYW5fdHhfZnJvbV9zdGFydF9vZl9yeDoxLCAvKiBbNF0gKi8KKwkJY29leF93bGFuX3R4X2FmdGVyX3N0YXJ0X29mX3J4OjEsIC8qIFs1XSAqLworCQltcGR1X2RlbGltaXRlcl9lcnJvcnNfc2VlbjoxLCAvKiBbNl0gKi8KKwkJZnRtOjEsIC8qIFs3XSAqLworCQlmdG1fZGlhbG9nX3Rva2VuOjgsIC8qIFsxNTo4XSAqLworCQlmdG1fZm9sbG93X3VwX2RpYWxvZ190b2tlbjo4LCAvKiBbMjM6MTZdICovCisJCXJlc2VydmVkXzMyOjg7IC8qIFszMToyNF0gKi8KKwl2b2xhdGlsZQorCXVpbnQzMl90IGJlZm9yZV9tcGR1X2NudF9wYXNzaW5nX2Zjczo4LCAvKiBbNzowXSAqLworCQliZWZvcmVfbXBkdV9jbnRfZmFpbGluZ19mY3M6OCwgLyogWzE1OjhdICovCisJCWFmdGVyX21wZHVfY250X3Bhc3NpbmdfZmNzOjgsIC8qIFsyMzoxNl0gKi8KKwkJYWZ0ZXJfbXBkdV9jbnRfZmFpbGluZ19mY3M6ODsgLyogWzMxOjI0XSAqLworCXZvbGF0aWxlIHVpbnQzMl90IHBoeV90aW1lc3RhbXBfdHhfbG93ZXJfMzI6MzI7IC8qIFszMTowXSAqLworCXZvbGF0aWxlIHVpbnQzMl90IHBoeV90aW1lc3RhbXBfdHhfdXBwZXJfMzI6MzI7IC8qIFszMTowXSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgYmJfbGVuZ3RoOjE2LCAvKiBbMTU6MF0gKi8KKwkJYmJfZGF0YToxLCAvKiBbMTZdICovCisJCXBlZXJfaWR4X3ZhbGlkOjEsIC8qIFsxN10gKi8KKwkJcGVlcl9pZHg6MTEsIC8qIFsyODoxOF0gKi8KKwkJcmVzZXJ2ZWRfMjY6MiwgLyogWzMwOjI5XSAqLworCQlwcGR1X2RvbmU6MTsgLyogWzMxXSAqLworfTsKKyNlbHNlCitzdHJ1Y3QgcnhfcHBkdV9zdGFydCB7CisJdm9sYXRpbGUKKwl1aW50MzJfdCByc3NpX2NoYWluMF9wcmkyMDo4LCAvKiBbNzowXSAqLworCQlyc3NpX2NoYWluMF9zZWMyMDo4LCAvKiBbMTU6OF0gKi8KKwkJcnNzaV9jaGFpbjBfc2VjNDA6OCwgLyogWzIzOjE2XSAqLworCQlyc3NpX2NoYWluMF9zZWM4MDo4OyAvKiBbMzE6MjRdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCByc3NpX2NoYWluMV9wcmkyMDo4LCAvKiBbNzowXSAqLworCQlyc3NpX2NoYWluMV9zZWMyMDo4LCAvKiBbMTU6OF0gKi8KKwkJcnNzaV9jaGFpbjFfc2VjNDA6OCwgLyogWzIzOjE2XSAqLworCQlyc3NpX2NoYWluMV9zZWM4MDo4OyAvKiBbMzE6MjRdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCByc3NpX2NoYWluMl9wcmkyMDo4LCAvKiBbNzowXSAqLworCQlyc3NpX2NoYWluMl9zZWMyMDo4LCAvKiBbMTU6OF0gKi8KKwkJcnNzaV9jaGFpbjJfc2VjNDA6OCwgLyogWzIzOjE2XSAqLworCQlyc3NpX2NoYWluMl9zZWM4MDo4OyAvKiBbMzE6MjRdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCByc3NpX2NoYWluM19wcmkyMDo4LCAvKiBbNzowXSAqLworCQlyc3NpX2NoYWluM19zZWMyMDo4LCAvKiBbMTU6OF0gKi8KKwkJcnNzaV9jaGFpbjNfc2VjNDA6OCwgLyogWzIzOjE2XSAqLworCQlyc3NpX2NoYWluM19zZWM4MDo4OyAvKiBbMzE6MjRdICovCisJdm9sYXRpbGUKKwl1aW50MzJfdCByc3NpX2NvbWI6OCwgIC8qIFs3OjBdICovCisJCXJlc2VydmVkXzRhOjE2LCAvKiBbMjM6OF0gKi8KKwkJaXNfZ3JlZW5maWVsZDoxLCAvKiBbMjRdICovCisJCXJlc2VydmVkXzRiOjc7IC8qIFszMToyNV0gKi8KKwl2b2xhdGlsZQorCXVpbnQzMl90IGxfc2lnX3JhdGU6NCwgLyogWzM6MF0gKi8KKwkJbF9zaWdfcmF0ZV9zZWxlY3Q6MSwgLyogWzRdICovCisJCWxfc2lnX2xlbmd0aDoxMiwgLyogWzE2OjVdICovCisJCWxfc2lnX3Bhcml0eToxLCAvKiBbMTddICovCisJCWxfc2lnX3RhaWw6NiwgLyogWzIzOjE4XSAqLworCQlwcmVhbWJsZV90eXBlOjg7IC8qIFszMToyNF0gKi8KKwl2b2xhdGlsZQorCXVpbnQzMl90IGh0X3NpZ192aHRfc2lnX2FfMToyNCwgLyogWzIzOjBdICovCisJCXJlc2VydmVkXzY6ODsgLyogWzMxOjI0XSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgaHRfc2lnX3ZodF9zaWdfYV8yOjI0LCAvKiBbMjM6MF0gKi8KKwkJdHhiZl9oX2luZm86MSwgLyogWzI0XSAqLworCQlyZXNlcnZlZF83Ojc7IC8qIFszMToyNV0gKi8KKwl2b2xhdGlsZQorCXVpbnQzMl90IHZodF9zaWdfYjoyOSwgLyogWzI4OjBdICovCisJCXJlc2VydmVkXzg6MzsgLyogWzMxOjI5XSAqLworCXZvbGF0aWxlCisJdWludDMyX3Qgc2VydmljZToxNiwgICAvKiBbMTU6MF0gKi8KKwkJcmVzZXJ2ZWRfOToxNjsgLyogWzMxOjE2XSAqLworfTsKKworCitzdHJ1Y3QgcnhfbXBkdV9zdGFydCB7CisJdm9sYXRpbGUKKwl1aW50MzJfdCBwZWVyX2lkeDoxMSwgIC8qIFsxMDowXSAqLworCQlmcl9kczoxLCAvKiBbMTFdICovCisJCXRvX2RzOjEsIC8qIFsxMl0gKi8KKwkJZW5jcnlwdGVkOjEsIC8qIFsxM10gKi8KKwkJcmV0cnk6MSwgLyogWzE0XSAqLworCQl0eGJmX2hfaW5mbzoxLCAvKiBbMTVdICovCisJCXNlcV9udW06MTIsIC8qIFsyNzoxNl0gKi8KKwkJZW5jcnlwdF90eXBlOjQ7IC8qIFszMToyOF0gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBwbl8zMV8wOjMyOyAgIC8qIFszMTowXSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgcG5fNDdfMzI6MTYsICAvKiBbMTU6MF0gKi8KKwkJZGlyZWN0ZWQ6MSwgLyogWzE2XSAqLworCQlyZXNlcnZlZF8yOjExLCAvKiBbMjc6MTddICovCisJCXRpZDo0OyAvKiBbMzE6MjhdICovCit9OworCitzdHJ1Y3QgcnhfcHBkdV9lbmQgeworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wMDozMjsgICAgLyogWzMxOjBdICovCisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3AxOjMyOyAgICAvKiBbMzE6MF0gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBldm1fcDI6MzI7ICAgIC8qIFszMTowXSAqLworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wMzozMjsgICAgLyogWzMxOjBdICovCisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3A0OjMyOyAgICAvKiBbMzE6MF0gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBldm1fcDU6MzI7ICAgIC8qIFszMTowXSAqLworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wNjozMjsgICAgLyogWzMxOjBdICovCisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3A3OjMyOyAgICAvKiBbMzE6MF0gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBldm1fcDg6MzI7ICAgIC8qIFszMTowXSAqLworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wOTozMjsgICAgLyogWzMxOjBdICovCisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3AxMDozMjsgICAvKiBbMzE6MF0gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBldm1fcDExOjMyOyAgIC8qIFszMTowXSAqLworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wMTI6MzI7ICAgLyogWzMxOjBdICovCisJdm9sYXRpbGUgdWludDMyX3QgZXZtX3AxMzozMjsgICAvKiBbMzE6MF0gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBldm1fcDE0OjMyOyAgIC8qIFszMTowXSAqLworCXZvbGF0aWxlIHVpbnQzMl90IGV2bV9wMTU6MzI7ICAgLyogWzMxOjBdICovCisJdm9sYXRpbGUgdWludDMyX3QgdHNmX3RpbWVzdGFtcDozMjsgLyogWzMxOjBdICovCisJdm9sYXRpbGUgdWludDMyX3Qgd2JfdGltZXN0YW1wOjMyOyAvKiBbMzE6MF0gKi8KKwl2b2xhdGlsZQorCXVpbnQzMl90IGxvY2F0aW9uaW5nX3RpbWVzdGFtcDo4LCAvKiBbNzowXSAqLworCQlwaHlfZXJyX2NvZGU6OCwgLyogWzE1OjhdICovCisJCXBoeV9lcnI6MSwgLyogWzE2XSAqLworCQlyeF9sb2NhdGlvbjoxLCAvKiBbMTddICovCisJCXR4YmZfaF9pbmZvOjEsIC8qIFsxOF0gKi8KKwkJcmVzZXJ2ZWRfMTg6MTM7IC8qIFszMToxOV0gKi8KKwl2b2xhdGlsZQorCXVpbnQzMl90IHJ4X2FudGVubmE6MjQsIC8qIFsyMzowXSAqLworCQl0eF9odF92aHRfYWNrOjEsIC8qIFsyNF0gKi8KKwkJYmJfY2FwdHVyZWRfY2hhbm5lbDoxLCAvKiBbMjVdICovCisJCXJlc2VydmVkXzE5OjY7IC8qIFszMToyNl0gKi8KKwl2b2xhdGlsZQorCXVpbnQzMl90IHJ0dF9jb3JyZWN0aW9uX3ZhbHVlOjI0LCAvKiBbMjM6MF0gKi8KKwkJcmVzZXJ2ZWRfMjA6NywgLyogWzMwOjI0XSAqLworCQlydHRfbm9ybWFsX21vZGU6MTsgLyogWzMxXSAqLworCXZvbGF0aWxlCisJdWludDMyX3QgYmJfbGVuZ3RoOjE2LCAvKiBbMTU6MF0gKi8KKwkJcmVzZXJ2ZWRfMjE6MTUsIC8qIFszMDoxNl0gKi8KKwkJcHBkdV9kb25lOjE7IC8qIFszMV0gKi8KK307CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTKSAqLworCisjZW5kaWYgLypfUlhfREVTQ19IXyovCmRpZmYgLS1naXQgYS9jb3JlL2RwL29sL2luYy9vbF9jZmcuaCBiL2NvcmUvZHAvb2wvaW5jL29sX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNTllYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL29sL2luYy9vbF9jZmcuaApAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfT0xfQ0ZHX19IXworI2RlZmluZSBfT0xfQ0ZHX19IXworCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+ICAgICAgICAgIC8qIHVpbnQzMl90ICovCisjaW5jbHVkZSA8b2xfY3RybF9hcGkuaD4gICAgICAgIC8qIG9sX3BkZXZfaGFuZGxlICovCisjaW5jbHVkZSA8Y2RzX2llZWU4MDIxMV9jb21tb24uaD4gICAvKiBpZWVlODAyMTFfcW9zZnJhbWVfaHRjX2FkZHI0ICovCisjaW5jbHVkZSA8ZW5ldC5oPiAgICAgICAgICAgICAgIC8qIExMQ19TTkFQX0hEUl9MRU4gKi8KKyNpbmNsdWRlICJ3bGFuX3RndF9kZWZfY29uZmlnLmgiCisKKy8qKgorICogQGJyaWVmIGZvcm1hdCBvZiBkYXRhIGZyYW1lcyBkZWxpdmVyZWQgdG8vZnJvbSB0aGUgV0xBTiBkcml2ZXIgYnkvdG8gdGhlIE9TCisgKi8KK2VudW0gd2xhbl9mcm1fZm10IHsKKwl3bGFuX2ZybV9mbXRfdW5rbm93biwKKwl3bGFuX2ZybV9mbXRfcmF3LAorCXdsYW5fZnJtX2ZtdF9uYXRpdmVfd2lmaSwKKwl3bGFuX2ZybV9mbXRfODAyXzMsCit9OworCitzdHJ1Y3Qgd2xhbl9pcGFfdWNfcnNjX3QgeworCXU4IHVjX29mZmxvYWRfZW5hYmxlZDsKKwl1MzIgdHhfbWF4X2J1Zl9jbnQ7CisJdTMyIHR4X2J1Zl9zaXplOworCXUzMiByeF9pbmRfcmluZ19zaXplOworCXUzMiB0eF9wYXJ0aXRpb25fYmFzZTsKK307CisKKy8qIENvbmZpZyBwYXJhbWV0ZXJzIGZvciB0eHJ4X3BkZXYgKi8KK3N0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgeworCXU4IGlzX2hpZ2hfbGF0ZW5jeTsKKwl1OCBkZWZyYWdfdGltZW91dF9jaGVjazsKKwl1OCByeF9wbl9jaGVjazsKKwl1OCBwbl9yeF9md2RfY2hlY2s7CisJdTggaG9zdF9hZGRiYTsKKwl1OCB0eF9mcmVlX2F0X2Rvd25sb2FkOworCXU4IHJ4X2Z3ZF9pbnRlcl9ic3M7CisJdTMyIG1heF90aHJ1cHV0X21icHM7CisJdTMyIHRhcmdldF90eF9jcmVkaXQ7CisJdTMyIHZvd19jb25maWc7CisJdTMyIHR4X2Rvd25sb2FkX3NpemU7CisJdTMyIG1heF9wZWVyX2lkOworCXUzMiBtYXhfdmRldjsKKwl1MzIgbWF4X25idWZfZnJhZ3M7CisJdTMyIHRocm90dGxlX3BlcmlvZF9tczsKKwllbnVtIHdsYW5fZnJtX2ZtdCBmcmFtZV90eXBlOworCXU4IHJ4X2Z3ZF9kaXNhYmxlZDsKKwl1OCBpc19wYWNrZXRfbG9nX2VuYWJsZWQ7CisJdTggaXNfZnVsbF9yZW9yZGVyX29mZmxvYWQ7CisJc3RydWN0IHdsYW5faXBhX3VjX3JzY190IGlwYV91Y19yc2M7CisJYm9vbCBpcF90Y3BfdWRwX2NoZWNrc3VtX29mZmxvYWQ7CisJYm9vbCBlbmFibGVfcnh0aHJlYWQ7CisJYm9vbCBjZV9jbGFzc2lmeV9lbmFibGVkOworI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKKwl1aW50MzJfdCB0eF9mbG93X3N0b3BfcXVldWVfdGg7CisJdWludDMyX3QgdHhfZmxvd19zdGFydF9xdWV1ZV9vZmZzZXQ7CisjZW5kaWYKK307CisKKy8qKgorICogQGJyaWVmIFNwZWNpZnkgd2hldGhlciB0aGUgc3lzdGVtIGlzIGhpZ2gtbGF0ZW5jeSBvciBsb3ctbGF0ZW5jeS4KKyAqIEBkZXRhaWxzCisgKiAgSW5kaWNhdGUgd2hldGhlciB0aGUgc3lzdGVtIGlzIG9wZXJhdGluZyBpbiBoaWdoLWxhdGVuY3kgKG1lc3NhZ2UKKyAqICBiYXNlZCwgZS5nLiBVU0IpIG1vZGUgb3IgbG93LWxhdGVuY3kgKG1lbW9yeS1tYXBwZWQsIGUuZy4gUENJZSkgbW9kZS4KKyAqICBTb21lIGNoaXBzIHN1cHBvcnQganVzdCBvbmUgdHlwZSBvZiBob3N0IC8gdGFyZ2V0IGludGVyZmFjZS4KKyAqICBPdGhlciBjaGlwcyBzdXBwb3J0IGJvdGggTEwgYW5kIEhMIGludGVyZmFjZXMgKGUuZy4gUENJZSBhbmQgVVNCKSwKKyAqICBzbyB0aGUgc2VsZWN0aW9uIHdpbGwgYmUgbWFkZSBiYXNlZCBvbiB3aGljaCBidXMgSFcgaXMgcHJlc2VudCwgb3IKKyAqICB3aGljaCBpcyBwcmVmZXJyZWQgaWYgYm90aCBhcmUgcHJlc2VudC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKiBAcmV0dXJuIDEgLT4gaGlnaC1sYXRlbmN5IC1PUi0gMCAtPiBsb3ctbGF0ZW5jeQorICovCitpbnQgb2xfY2ZnX2lzX2hpZ2hfbGF0ZW5jeShvbF9wZGV2X2hhbmRsZSBwZGV2KTsKKworLyoqCisgKiBAYnJpZWYgU3BlY2lmeSB0aGUgcmFuZ2Ugb2YgcGVlciBJRHMuCisgKiBAZGV0YWlscworICogIFNwZWNpZnkgdGhlIG1heGltdW0gcGVlciBJRC4gIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBlZXJzLAorICogIG1pbnVzIG9uZS4KKyAqICBUaGlzIGlzIHVzZWQgYnkgdGhlIGhvc3QgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGFycmF5cyBpbmRleGVkIGJ5CisgKiAgcGVlciBJRC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKiBAcmV0dXJuIG1heGltdW0gcGVlciBJRAorICovCitpbnQgb2xfY2ZnX21heF9wZWVyX2lkKG9sX3BkZXZfaGFuZGxlIHBkZXYpOworCisvKioKKyAqIEBicmllZiBTcGVjaWZ5IHRoZSBtYXggbnVtYmVyIG9mIHZpcnR1YWwgZGV2aWNlcyB3aXRoaW4gYSBwaHlzaWNhbCBkZXZpY2UuCisgKiBAZGV0YWlscworICogIFNwZWNpZnkgaG93IG1hbnkgdmlydHVhbCBkZXZpY2VzIG1heSBleGlzdCB3aXRoaW4gYSBwaHlzaWNhbCBkZXZpY2UuCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIGRldmljZQorICogQHJldHVybiBtYXhpbXVtIG51bWJlciBvZiB2aXJ0dWFsIGRldmljZXMKKyAqLworaW50IG9sX2NmZ19tYXhfdmRldnMob2xfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogQGJyaWVmIENoZWNrIHdoZXRoZXIgaG9zdC1zaWRlIHJ4IFBOIGNoZWNrIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAZGV0YWlscworICogIENob29zZSB3aGV0aGVyIHRvIGFsbG9jYXRlIHJ4IFBOIHN0YXRlIGluZm9ybWF0aW9uIGFuZCBwZXJmb3JtCisgKiAgcnggUE4gY2hlY2tzIChpZiBhcHBsaWNhYmxlLCBiYXNlZCBvbiBzZWN1cml0eSB0eXBlKSBvbiB0aGUgaG9zdC4KKyAqICBJZiB0aGUgcnggUE4gY2hlY2sgaXMgc3BlY2lmaWVkIHRvIGJlIGRvbmUgb24gdGhlIGhvc3QsIHRoZSBob3N0IFNXCisgKiAgd2lsbCBkZXRlcm1pbmUgd2hpY2ggcGVlcnMgYXJlIHVzaW5nIGEgc2VjdXJpdHkgdHlwZSAoZS5nLiBDQ01QKSB0aGF0CisgKiAgcmVxdWlyZXMgYSBQTiBjaGVjay4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKiBAcmV0dXJuIDEgLT4gaG9zdCBwZXJmb3JtcyByeCBQTiBjaGVjayAtT1ItIDAgLT4gbm8gaG9zdC1zaWRlIHJ4IFBOIGNoZWNrCisgKi8KK2ludCBvbF9jZmdfcnhfcG5fY2hlY2sob2xfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogQGJyaWVmIENoZWNrIHdoZXRoZXIgaG9zdC1zaWRlIHJ4IGZvcndhcmRpbmcgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAqIEBkZXRhaWxzCisgKiAgQ2hvb3NlIHdoZXRoZXIgdG8gY2hlY2sgd2hldGhlciB0byBmb3J3YXJkIHJ4IGZyYW1lcyB0byB0eCBvbiB0aGUgaG9zdC4KKyAqICBGb3IgTEwgc3lzdGVtcywgdGhpcyByeCAtPiB0eCBob3N0LXNpZGUgZm9yd2FyZGluZyBjaGVjayBpcyB0eXBpY2FsbHkKKyAqICBlbmFibGVkLgorICogIEZvciBITCBzeXN0ZW1zLCB0aGUgcnggLT4gdHggZm9yd2FyZGluZyBjaGVjayBpcyB0eXBpY2FsbHkgZG9uZSBvbiB0aGUKKyAqICB0YXJnZXQuICBIb3dldmVyLCBldmVuIGluIEhMIHN5c3RlbXMsIHRoZSBob3N0LXNpZGUgcnggLT4gdHggZm9yd2FyZGluZworICogIHdpbGwgdHlwaWNhbGx5IGJlIGVuYWJsZWQsIGFzIGEgc2Vjb25kLXRpZXIgc2FmZXR5IG5ldCBpbiBjYXNlIHRoZQorICogIHRhcmdldCBkb2Vzbid0IGhhdmUgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSBhbGwgcnggLT4gdHggZm9yd2FyZGVkIGZyYW1lcy4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKiBAcmV0dXJuIDEgLT4gaG9zdCBkb2VzIHJ4LT50eCBmb3J3YXJkIC1PUi0gMCAtPiBubyBob3N0LXNpZGUgcngtPnR4IGZvcndhcmQKKyAqLworaW50IG9sX2NmZ19yeF9md2RfY2hlY2sob2xfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogQGJyaWVmIHNldCByeCBmd2QgZGlzYWJsZS9lbmFibGUuCisgKiBAZGV0YWlscworICogIENob29zZSB3aGV0aGVyIHRvIGZvcndhcmQgcnggZnJhbWVzIHRvIHR4ICh3aGVyZSBhcHBsaWNhYmxlKSB3aXRoaW4gdGhlCisgKiAgV0xBTiBkcml2ZXIsIG9yIHRvIGxlYXZlIGFsbCBmb3J3YXJkaW5nIHVwIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorICogIGN1cnJlbnRseSBvbmx5IGludHJhLWJzcyBmd2QgaXMgc3VwcG9ydGVkLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gaGFuZGxlIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2UKKyAqIEBwYXJhbSBkaXNhYmxlX3J4X2Z3ZCAxIC0+IG5vIHJ4LT50eCBmb3J3YXJkIC0+IHJ4LT50eCBmb3J3YXJkCisgKi8KK3ZvaWQgb2xfc2V0X2NmZ19yeF9md2RfZGlzYWJsZWQob2xfcGRldl9oYW5kbGUgcGRldiwgdWludDhfdCBkaXNhbGJlX3J4X2Z3ZCk7CisKKy8qKgorICogQGJyaWVmIENoZWNrIHdoZXRoZXIgcnggZm9yd2FyZGluZyBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQGRldGFpbHMKKyAqICBDaG9vc2Ugd2hldGhlciB0byBmb3J3YXJkIHJ4IGZyYW1lcyB0byB0eCAod2hlcmUgYXBwbGljYWJsZSkgd2l0aGluIHRoZQorICogIFdMQU4gZHJpdmVyLCBvciB0byBsZWF2ZSBhbGwgZm9yd2FyZGluZyB1cCB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKiBAcmV0dXJuIDEgLT4gbm8gcngtPnR4IGZvcndhcmQgLU9SLSAwIC0+IHJ4LT50eCBmb3J3YXJkIChpbiBob3N0IG9yIHRhcmdldCkKKyAqLworaW50IG9sX2NmZ19yeF9md2RfZGlzYWJsZWQob2xfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdG8gcGVyZm9ybSBpbnRlci1CU1Mgb3IgaW50cmEtQlNTIHJ4LT50eCBmb3J3YXJkaW5nLgorICogQGRldGFpbHMKKyAqICBDaGVjayB3aGV0aGVyIGRhdGEgcmVjZWl2ZWQgYnkgYW4gQVAgb24gb25lIHZpcnR1YWwgZGV2aWNlIGRlc3RpbmVkCisgKiAgdG8gYSBTVEEgYXNzb2NpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHZpcnR1YWwgZGV2aWNlIHdpdGhpbiB0aGUgc2FtZQorICogIHBoeXNpY2FsIGRldmljZSBzaG91bGQgYmUgZm9yd2FyZGVkIHdpdGhpbiB0aGUgZHJpdmVyLCBvciB3aGV0aGVyCisgKiAgZm9yd2FyZGluZyBzaG91bGQgb25seSBiZSBkb25lIHdpdGhpbiBhIHZpcnR1YWwgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gaGFuZGxlIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2UKKyAqIEByZXR1cm4KKyAqICAgICAgMSAtPiBmb3J3YXJkIGJvdGggd2l0aGluIGFuZCBiZXR3ZWVuIHZkZXZzCisgKiAgICAgIC1PUi0KKyAqICAgICAgMCAtPiBmb3J3YXJkIG9ubHkgd2l0aGluIGEgdmRldgorICovCitpbnQgb2xfY2ZnX3J4X2Z3ZF9pbnRlcl9ic3Mob2xfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogQGJyaWVmIFNwZWNpZnkgZGF0YSBmcmFtZSBmb3JtYXQgdXNlZCBieSB0aGUgT1MuCisgKiBAZGV0YWlscworICogIFNwZWNpZnkgd2hhdCB0eXBlIG9mIGZyYW1lICg4MDIuMyBvciBuYXRpdmUgV2lGaSkgdGhlIGhvc3QgZGF0YSBTVworICogIHNob3VsZCBleHBlY3QgZnJvbSBhbmQgcHJvdmlkZSB0byB0aGUgT1Mgc2hpbS4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKiBAcmV0dXJuIGVudW1lcmF0ZWQgZGF0YSBmcmFtZSBmb3JtYXQKKyAqLworZW51bSB3bGFuX2ZybV9mbXQgb2xfY2ZnX2ZyYW1lX3R5cGUob2xfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogQGJyaWVmIFNwZWNpZnkgdGhlIHBlYWsgdGhyb3VnaHB1dC4KKyAqIEBkZXRhaWxzCisgKiAgU3BlY2lmeSB0aGUgcGVhayB0aHJvdWdocHV0IHRoYXQgYSBzeXN0ZW0gaXMgZXhwZWN0ZWQgdG8gc3VwcG9ydC4KKyAqICBUaGUgZGF0YSBTVyB1c2VzIHRoaXMgY29uZmlndXJhdGlvbiB0byBoZWxwIGNob29zZSB0aGUgc2l6ZSBmb3IgaXRzCisgKiAgdHggZGVzY3JpcHRvciBwb29sIGFuZCByeCBidWZmZXIgcmluZy4KKyAqICBUaGUgZGF0YSBTVyBhc3N1bWVzIHRoYXQgdGhlIHBlYWsgdGhyb3VnaHB1dCBhcHBsaWVzIHRvIGVpdGhlciByeCBvciB0eCwKKyAqICByYXRoZXIgdGhhbiBoYXZpbmcgc2VwYXJhdGUgc3BlY3Mgb2YgdGhlIHJ4IG1heCB0aHJvdWdocHV0IHZzLiB0aGUgdHgKKyAqICBtYXggdGhyb3VnaHB1dC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKiBAcmV0dXJuIG1heGltdW0gc3VwcG9ydGVkIHRocm91Z2hwdXQgaW4gTWJwcyAobm90IE1CcHMpCisgKi8KK2ludCBvbF9jZmdfbWF4X3RocnVwdXRfbWJwcyhvbF9wZGV2X2hhbmRsZSBwZGV2KTsKKworLyoqCisgKiBAYnJpZWYgU3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnJhZ21lbnRzIHBlciB0eCBuZXR3b3JrIGJ1ZmZlci4KKyAqIEBkZXRhaWxzCisgKiAgU3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnJhZ21lbnRzIHRoYXQgYSB0eCBmcmFtZSBwcm92aWRlZCB0bworICogIHRoZSBXTEFOIGRyaXZlciBieSB0aGUgT1MgbWF5IGNvbnRhaW4uCisgKiAgSW4gTEwgc3lzdGVtcywgdGhlIGhvc3QgZGF0YSBTVyB1c2VzIHRoaXMgbWF4aW11bSBmcmFnbWVudCBjb3VudCB0bworICogIGRldGVybWluZSBob3cgbWFueSBlbGVtZW50cyB0byBhbGxvY2F0ZSBpbiB0aGUgZnJhZ21lbnRhdGlvbiBkZXNjcmlwdG9yCisgKiAgaXQgY3JlYXRlcyB0byBzcGVjaWZ5IHRvIHRoZSB0eCBNQUMgRE1BIHdoZXJlIHRvIGxvY2F0ZSB0aGUgdHggZnJhbWUncworICogIGRhdGEuCisgKiAgVGhpcyBtYXhpbXVtIGZyYWdtZW50cyBjb3VudCBpcyBvbmx5IGZvciByZWd1bGFyIGZyYW1lcywgbm90IFRTTyBmcmFtZXMsCisgKiAgc2luY2UgVFNPIGZyYW1lcyBhcmUgc2VudCBpbiBzZWdtZW50cyB3aXRoIGEgbGltaXRlZCBudW1iZXIgb2YgZnJhZ21lbnRzCisgKiAgcGVyIHNlZ21lbnQuCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIGRldmljZQorICogQHJldHVybiBtYXhpbXVtIG51bWJlciBvZiBmcmFnbWVudHMgdGhhdCBjYW4gb2NjdXIgaW4gYSByZWd1bGFyIHR4IGZyYW1lCisgKi8KK2ludCBvbF9jZmdfbmV0YnVmX2ZyYWdzX21heChvbF9wZGV2X2hhbmRsZSBwZGV2KTsKKworLyoqCisgKiBAYnJpZWYgRm9yIEhMIHN5c3RlbXMsIHNwZWNpZnkgd2hlbiB0byBmcmVlIHR4IGZyYW1lcy4KKyAqIEBkZXRhaWxzCisgKiAgSW4gTEwgc3lzdGVtcywgdGhlIGhvc3QncyB0eCBmcmFtZSBpcyByZWZlcmVuY2VkIGJ5IHRoZSBNQUMgRE1BLCBhbmQKKyAqICB0aHVzIGNhbm5vdCBiZSBmcmVlZCB1bnRpbCB0aGUgdGFyZ2V0IGluZGljYXRlcyB0aGF0IGl0IGlzIGZpbmlzaGVkCisgKiAgdHJhbnNtaXR0aW5nIHRoZSBmcmFtZS4KKyAqICBJbiBITCBzeXN0ZW1zLCB0aGUgZW50aXJlIHR4IGZyYW1lIGlzIGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldC4KKyAqICBDb25zZXF1ZW50bHksIHRoZSB0YXJnZXQgaGFzIGl0cyBvd24gY29weSBvZiB0aGUgdHggZnJhbWUsIGFuZCB0aGUKKyAqICBob3N0IGNhbiBmcmVlIHRoZSB0eCBmcmFtZSBhcyBzb29uIGFzIHRoZSBkb3dubG9hZCBjb21wbGV0ZXMuCisgKiAgQWx0ZXJuYXRpdmVseSwgdGhlIEhMIGhvc3QgY2FuIGtlZXAgdGhlIGZyYW1lIGFsbG9jYXRlZCB1bnRpbCB0aGUKKyAqICB0YXJnZXQgZXhwbGljaXRseSB0ZWxscyB0aGUgSEwgaG9zdCBpdCBpcyBkb25lIHRyYW5zbWl0dGluZyB0aGUgZnJhbWUuCisgKiAgVGhpcyBnaXZlcyB0aGUgdGFyZ2V0IHRoZSBvcHRpb24gb2YgZGlzY2FyZGluZyBpdHMgY29weSBvZiB0aGUgdHgKKyAqICBmcmFtZSwgYW5kIHRoZW4gbGF0ZXIgZ2V0dGluZyBhIG5ldyBjb3B5IGZyb20gdGhlIGhvc3QuCisgKiAgVGhpcyBmdW5jdGlvbiB0ZWxscyB0aGUgaG9zdCB3aGV0aGVyIGl0IHNob3VsZCByZXRhaW4gaXRzIGNvcHkgb2YgdGhlCisgKiAgdHJhbnNtaXQgZnJhbWVzIHVudGlsIHRoZSB0YXJnZXQgZXhwbGljaXRseSBpbmRpY2F0ZXMgaXQgaXMgZmluaXNoZWQKKyAqICB0cmFuc21pdHRpbmcgdGhlbSwgb3IgaWYgaXQgc2hvdWxkIGZyZWUgaXRzIGNvcHkgYXMgc29vbiBhcyB0aGUKKyAqICB0eCBmcmFtZSBpcyBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQuCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIGRldmljZQorICogQHJldHVybgorICogICAgICAwIC0+IHJldGFpbiB0aGUgdHggZnJhbWUgdW50aWwgdGhlIHRhcmdldCBpbmRpY2F0ZXMgaXQgaXMgZG9uZQorICogICAgICAgICAgdHJhbnNtaXR0aW5nIHRoZSBmcmFtZQorICogICAgICAtT1ItCisgKiAgICAgIDEgLT4gZnJlZSB0aGUgdHggZnJhbWUgYXMgc29vbiBhcyB0aGUgZG93bmxvYWQgY29tcGxldGVzCisgKi8KK2ludCBvbF9jZmdfdHhfZnJlZV9hdF9kb3dubG9hZChvbF9wZGV2X2hhbmRsZSBwZGV2KTsKKworLyoqCisgKiBAYnJpZWYgTG93IHdhdGVyIG1hcmsgZm9yIHRhcmdldCB0eCBjcmVkaXQuCisgKiBUeCBjb21wbGV0aW9uIGhhbmRsZXIgaXMgaW52b2tlZCB0byByZWFwIHRoZSBidWZmZXJzIHdoZW4gdGhlIHRhcmdldCB0eAorICogY3JlZGl0IGdvZXMgYmVsb3cgTG93IFdhdGVyIE1hcmsuCisgKi8KKyNkZWZpbmUgT0xfQ0ZHX05VTV9NU0RVX1JFQVAgNTEyCisjZGVmaW5lIG9sX2NmZ190eF9jcmVkaXRfbHdtKHBkZXYpCQkJCQkgICAgICAgXAorCSgoQ0ZHX1RHVF9OVU1fTVNEVV9ERVNDID4gIE9MX0NGR19OVU1fTVNEVV9SRUFQKSA/CQkgICAgICAgXAorCSAoQ0ZHX1RHVF9OVU1fTVNEVV9ERVNDIC0gIE9MX0NGR19OVU1fTVNEVV9SRUFQKSA6IDApCisKKy8qKgorICogQGJyaWVmIEluIGEgSEwgc3lzdGVtLCBzcGVjaWZ5IHRoZSB0YXJnZXQgaW5pdGlhbCBjcmVkaXQgY291bnQuCisgKiBAZGV0YWlscworICogIFRoZSBITCBob3N0IHR4IGRhdGEgU1cgaW5jbHVkZXMgYSBtb2R1bGUgZm9yIGRldGVybWluaW5nIHdoaWNoIHR4IGZyYW1lcworICogIHRvIGRvd25sb2FkIHRvIHRoZSB0YXJnZXQgYXQgYSBnaXZlbiB0aW1lLgorICogIFRvIG1ha2UgdGhpcyBqdWRnZW1lbnQsIHRoZSBITCB0eCBkb3dubG9hZCBzY2hlZHVsZXIgaGFzIHRvIGtub3cKKyAqICBob3cgbWFueSBidWZmZXJzIHRoZSBITCB0YXJnZXQgaGFzIGF2YWlsYWJsZSB0byBob2xkIHR4IGZyYW1lcy4KKyAqICBEdWUgdG8gdGhlIHBvc3NpYmlsaXR5IHRoYXQgYSBzaW5nbGUgdGFyZ2V0IGJ1ZmZlciBwb29sIGNhbiBiZSBzaGFyZWQKKyAqICBiZXR3ZWVuIHJ4IGFuZCB0eCBmcmFtZXMsIHRoZSBob3N0IG1heSBub3QgYmUgYWJsZSB0byBvYnRhaW4gYSBwcmVjaXNlCisgKiAgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdHggYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgdGFyZ2V0LCBidXQgaXQKKyAqICB1c2VzIHRoZSBiZXN0IGVzdGltYXRlLCBhcyBwcm92aWRlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24sCisgKiAgdG8gZGV0ZXJtaW5lIGhvdyBiZXN0IHRvIHNjaGVkdWxlIHRoZSB0eCBmcmFtZSBkb3dubG9hZHMuCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIGRldmljZQorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHR4IGJ1ZmZlcnMgYXZhaWxhYmxlIGluIGEgSEwgdGFyZ2V0CisgKi8KK3VpbnQxNl90IG9sX2NmZ190YXJnZXRfdHhfY3JlZGl0KG9sX3BkZXZfaGFuZGxlIHBkZXYpOworCisvKioKKyAqIEBicmllZiBTcGVjaWZ5IHRoZSBMTCB0eCBNU0RVIGhlYWRlciBkb3dubG9hZCBzaXplLgorICogQGRldGFpbHMKKyAqICBJbiBMTCBzeXN0ZW1zLCBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgZnJvbSBhIHR4IGZyYW1lIHRvIGRvd25sb2FkLAorICogIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIHRhcmdldCBGVydzIERlc2NyaXB0b3IgRW5naW5lIHdpdGggZW5vdWdoIG9mCisgKiAgdGhlIHBhY2tldCdzIHBheWxvYWQgdG8gaW50ZXJwcmV0IHdoYXQga2luZCBvZiB0cmFmZmljIHRoaXMgaXMsCisgKiAgYW5kIHdobyBpdCBpcyBmb3IuCisgKiAgVGhpcyBkb3dubG9hZCBzaXplIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaW5jbHVkZSB0aGUgODAyLjMgLyA4MDIuMTEKKyAqICBmcmFtZSBlbmNhcHN1bGF0aW9uIGhlYWRlcnM7IGl0IHN0YXJ0cyB3aXRoIHRoZSBlbmNhcHN1bGF0ZWQgSVAgcGFja2V0CisgKiAgKG9yIHdoYXRldmVyIGV0aGVydHlwZSBpcyBjYXJyaWVkIHdpdGhpbiB0aGUgZXRoZXJuZXQtaXNoIGZyYW1lKS4KKyAqICBUaGUgTEwgaG9zdCBkYXRhIFNXIHdpbGwgZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIG9mIHRoZSBNU0RVIGhlYWRlciB0bworICogIGRvd25sb2FkIGJ5IGFkZGluZyB0aGlzIGRvd25sb2FkIHNpemUgc3BlY2lmaWNhdGlvbiB0byB0aGUgc2l6ZSBvZiB0aGUKKyAqICBmcmFtZSBoZWFkZXIgZm9ybWF0IHNwZWNpZmllZCBieSB0aGUgb2xfY2ZnX2ZyYW1lX3R5cGUgY29uZmlndXJhdGlvbgorICogIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gaGFuZGxlIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2UKKyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBiZXlvbmQgdGhlIDgwMi4zIG9yIG5hdGl2ZSBXaUZpIGhlYWRlciB0bworICogICAgICBkb3dubG9hZCB0byB0aGUgdGFyZ2V0IGZvciB0eCBjbGFzc2lmaWNhdGlvbgorICovCitpbnQgb2xfY2ZnX3R4X2Rvd25sb2FkX3NpemUob2xfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogYnJpZWYgU3BlY2lmeSB3aGVyZSBkZWZyYWcgdGltZW91dCBhbmQgZHVwbGljYXRlIGRldGVjdGlvbiBpcyBoYW5kbGVkCisgKiBAZGV0YWlscworICogICBub24tYWdncmVnYXRlIGR1cGxpY2F0ZSBkZXRlY3Rpb24gYW5kIHRpbWluZyBvdXQgc3RhbGUgZnJhZ21lbnRzCisgKiAgIHJlcXVpcmVzIGFkZGl0aW9uYWwgdGFyZ2V0IG1lbW9yeS4gVG8gcmVhY2ggbWF4IGNsaWVudAorICogICBjb25maWd1cmF0aW9ucyAoMTI4KyksIG5vbi1hZ2dyZWdhdGUgZHVwbGljYXRlIGRldGVjdGlvbiBhbmQgdGhlCisgKiAgIGxvZ2ljIHRvIHRpbWUgb3V0IHN0YWxlIGZyYWdtZW50cyBpcyBtb3ZlZCB0byB0aGUgaG9zdC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKiBAcmV0dXJuCisgKiAgMCAtPiB0YXJnZXQgaXMgcmVzcG9uc2libGUgbm9uLWFnZ3JlZ2F0ZSBkdXBsaWNhdGUgZGV0ZWN0aW9uIGFuZAorICogICAgICAgICAgdGltaW5nIG91dCBzdGFsZSBmcmFnbWVudHMuCisgKgorICogIDEgLT4gaG9zdCBpcyByZXNwb25zaWJsZSBub24tYWdncmVnYXRlIGR1cGxpY2F0ZSBkZXRlY3Rpb24gYW5kCisgKiAgICAgICAgICB0aW1pbmcgb3V0IHN0YWxlIGZyYWdtZW50cy4KKyAqLworaW50IG9sX2NmZ19yeF9ob3N0X2RlZnJhZ190aW1lb3V0X2R1cGxpY2F0ZV9jaGVjayhvbF9wZGV2X2hhbmRsZSBwZGV2KTsKKworLyoqCisgKiBicmllZiBRdWVyeSBmb3IgdGhlIHBlcmlvZCBpbiBtcyB1c2VkIGZvciB0aHJvdHRsaW5nIGZvcgorICogdGhlcm1hbCBtaXRpZ2F0aW9uCisgKiBAZGV0YWlscworICogICBJbiBMTCBzeXN0ZW1zLCB0cmFuc21pdCBkYXRhIHRocm90dGxpbmcgaXMgdXNlZCBmb3IgdGhlcm1hbAorICogICBtaXRpZ2F0aW9uIHdoZXJlIGRhdGEgaXMgcGF1c2VkIGFuZCByZXN1bWVkIGR1cmluZyB0aGUKKyAqICAgdGhyb3R0bGUgcGVyaW9kIGkuZS4gdGhlIHRocm90dGxlIHBlcmlvZCBjb25zaXN0cyBvZiBhbgorICogICAib24iIHBoYXNlIHdoZW4gdHJhbnNtaXQgaXMgYWxsb3dlZCBhbmQgYW4gIm9mZiIgcGhhc2Ugd2hlbgorICogICB0cmFuc21pdCBpcyBzdXNwZW5kZWQuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwKKyAqICAgcGVyaW9kIHVzZWQgZm9yIHRocm90dGxpbmcuCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIGRldmljZQorICogQHJldHVybiB0aGUgdG90YWwgdGhyb3R0bGUgcGVyaW9kIGluIG1zCisgKi8KK2ludCBvbF9jZmdfdGhyb3R0bGVfcGVyaW9kX21zKG9sX3BkZXZfaGFuZGxlIHBkZXYpOworCisvKioKKyAqIGJyaWVmIENoZWNrIHdoZXRoZXIgZnVsbCByZW9yZGVyIG9mZmxvYWQgaXMKKyAqIGVuYWJsZWQvZGlzYWJsZSBieSB0aGUgaG9zdAorICogQGRldGFpbHMKKyAqICAgSWYgdGhlIGhvc3QgZG9lcyBub3Qgc3VwcG9ydCByZWNlaXZlIHJlb3JkZXIgKGkuZS4gdGhlCisgKiAgIHRhcmdldCBwZXJmb3JtcyBmdWxsIHJlY2VpdmUgcmUtb3JkZXJpbmcpIHRoaXMgd2lsbCByZXR1cm4KKyAqICAgImVuYWJsZWQiCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIGRldmljZQorICogQHJldHVybiAxIC0gZW5hYmxlLCAwIC0gZGlzYWJsZQorICovCitpbnQgb2xfY2ZnX2lzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkKG9sX3BkZXZfaGFuZGxlIHBkZXYpOworCitpbnQgb2xfY2ZnX2lzX3J4X3RocmVhZF9lbmFibGVkKG9sX3BkZXZfaGFuZGxlIHBkZXYpOworCisvKioKKyAqIG9sX2NmZ19pc19pcF90Y3BfdWRwX2NoZWNrc3VtX29mZmxvYWRfZW5hYmxlZCgpIC0gcmV0dXJuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGlwX3RjcF91ZHBfY2hlY2tzdW1fb2ZmbG9hZCBpcyBlbmFibGUvZGlzYWJsZQorICogQHBkZXYgOiBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIGRldmljZQorICoKKyAqIFJldHVybjogMSAtIGVuYWJsZSwgMCAtIGRpc2FibGUKKyAqLworc3RhdGljIGlubGluZQoraW50IG9sX2NmZ19pc19pcF90Y3BfdWRwX2NoZWNrc3VtX29mZmxvYWRfZW5hYmxlZChvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZyA9IChzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICopcGRldjsKKwlyZXR1cm4gY2ZnLT5pcF90Y3BfdWRwX2NoZWNrc3VtX29mZmxvYWQ7Cit9CisKKworI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKK2ludCBvbF9jZmdfZ2V0X3R4X2Zsb3dfc3RvcF9xdWV1ZV90aChvbF9wZGV2X2hhbmRsZSBwZGV2KTsKKworaW50IG9sX2NmZ19nZXRfdHhfZmxvd19zdGFydF9xdWV1ZV9vZmZzZXQob2xfcGRldl9oYW5kbGUgcGRldik7CisjZW5kaWYKKworYm9vbCBvbF9jZmdfaXNfY2VfY2xhc3NpZnlfZW5hYmxlZChvbF9wZGV2X2hhbmRsZSBwZGV2KTsKKworZW51bSB3bGFuX3RhcmdldF9mbXRfdHJhbnNsYXRpb25fY2FwcyB7CisJd2xhbl9mcm1fdHJhbl9jYXBfcmF3ID0gMHgwMSwKKwl3bGFuX2ZybV90cmFuX2NhcF9uYXRpdmVfd2lmaSA9IDB4MDIsCisJd2xhbl9mcm1fdHJhbl9jYXBfODAyMyA9IDB4MDQsCit9OworCisvKioKKyAqIEBicmllZiBTcGVjaWZ5IHRoZSBtYXhpbXVtIGhlYWRlciBzaXplIGFkZGVkIGJ5IFNXIHR4IGVuY2Fwc3VsYXRpb24KKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG5ldyBMMiBoZWFkZXIsIG5vdCB0aGUKKyAqICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBhbmQgb2xkIEwyIGhlYWRlcnMuCisgKiAgVGh1cywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBtYXhpbXVtIDgwMi4xMSBoZWFkZXIgc2l6ZSB0aGF0IHRoZQorICogIHR4IFNXIG1heSBuZWVkIHRvIGFkZCB0byB0eCBkYXRhIGZyYW1lcy4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9sX2NmZ19zd19lbmNhcF9oZHJfbWF4X3NpemUob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwkvKgorCSAqICAyNCBieXRlIGJhc2ljIDgwMi4xMSBoZWFkZXIKKwkgKiArIDYgYnl0ZSA0dGggYWRkcgorCSAqICsgMiBieXRlIFFvUyBjb250cm9sCisJICogKyA0IGJ5dGUgSFQgY29udHJvbAorCSAqICsgOCBieXRlIExMQy9TTkFQCisJICovCisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc2ZyYW1lX2h0Y19hZGRyNCkgKyBMTENfU05BUF9IRFJfTEVOOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3Qgb2xfY2ZnX3R4X2VuY2FwKG9sX3BkZXZfaGFuZGxlIHBkZXYpCit7CisJLyogdHggZW5jYXAgZG9uZSBpbiBIVyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBvbF9jZmdfaG9zdF9hZGRiYShvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCS8qCisJICogQUREQkEgbmVnb3RpYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgdGFyZ2V0IEZXIGZvciBQZXJlZ3JpbmUgKyBSb21lLgorCSAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIEBicmllZiBJZiB0aGUgaG9zdCBTVydzIEFEREJBIG5lZ290aWF0aW9uIGZhaWxzLCBzaG91bGQgaXQgYmUgcmV0cmllZD8KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9sX2NmZ19hZGRiYV9yZXRyeShvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXJldHVybiAwOyAgICAgICAgICAgICAgIC8qIGRpc2FibGVkIGZvciBub3cgKi8KK30KKworLyoqCisgKiBAYnJpZWYgSG93IG1hbnkgZnJhbWVzIHRvIGhvbGQgaW4gYSBwYXVzZWQgdmRldidzIHR4IHF1ZXVlIGluIExMIHN5c3RlbXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgb2xfdHhfY2ZnX21heF90eF9xdWV1ZV9kZXB0aF9sbChvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCS8qCisJICogU3RvcmUgdXAgdG8gMTUwMCBmcmFtZXMgZm9yIGEgcGF1c2VkIHZkZXYuCisJICogRm9yIGV4YW1wbGUsIGlmIHRoZSB2ZGV2IGlzIHNlbmRpbmcgMzAwIE1icHMgb2YgdHJhZmZpYywgYW5kIHRoZQorCSAqIFBIWSBpcyBjYXBhYmxlIG9mIDYwMCBNYnBzLCB0aGVuIGl0IHdpbGwgdGFrZSA1NiBtcyBmb3IgdGhlIFBIWSB0bworCSAqIGRyYWluIGJvdGggdGhlIDcwMCBmcmFtZXMgdGhhdCBhcmUgcXVldWVkIGluaXRpYWxseSwgcGx1cyB0aGUgbmV4dAorCSAqIDcwMCBmcmFtZXMgdGhhdCBjb21lIGluIHdoaWxlIHRoZSBQSFkgaXMgY2F0Y2hpbmcgdXAuCisJICogU28gaW4gdGhpcyBleGFtcGxlIHNjZW5hcmlvLCB0aGUgUEhZIHdpbGwgcmVtYWluIGZ1bGx5IHV0aWxpemVkCisJICogaW4gYSBNQ0Mgc3lzdGVtIHRoYXQgaGFzIGEgY2hhbm5lbC1zd2l0Y2hpbmcgcGVyaW9kIG9mIDU2IG1zIG9yIGxlc3MuCisJICogNzAwIGZyYW1lcyBjYWxjdWxhdGlvbiB3YXMgY29ycmVjdCB3aGVuIEZXIGRyYWluIHBhY2tldCB3aXRob3V0CisJICogYW55IG92ZXJoZWFkLiBBY3R1YWwgc2l0dWF0aW9uIGRyYWluIG92ZXJoZWFkIHdpbGwgc2xvd2Rvd24gZHJhaW4KKwkgKiBzcGVlZC4gQW5kIGNoYW5uZWwgcGVyaW9kIGlzIGxlc3MgdGhhbiA1NiBtc2VjCisJICogV29yc3Qgc2NlbmFyaW8sIDE1MDAgZnJhbWVzIHNob3VsZCBiZSBzdG9yZWQgaW4gaG9zdC4KKwkgKi8KKwlyZXR1cm4gMTUwMDsKK30KKworLyoqCisgKiBAYnJpZWYgU2V0IHBhY2tldCBsb2cgY29uZmlnIGluIEhUVCBjb25maWcgYmFzZWQgb24gQ0ZHIGluaSBjb25maWd1cmF0aW9uCisgKi8KK3ZvaWQgb2xfc2V0X2NmZ19wYWNrZXRfbG9nX2VuYWJsZWQob2xfcGRldl9oYW5kbGUgcGRldiwgdWludDhfdCB2YWwpOworCisvKioKKyAqIEBicmllZiBHZXQgcGFja2V0IGxvZyBjb25maWcgZnJvbSBIVFQgY29uZmlnCisgKi8KK3VpbnQ4X3Qgb2xfY2ZnX2lzX3BhY2tldF9sb2dfZW5hYmxlZChvbF9wZGV2X2hhbmRsZSBwZGV2KTsKKworI2lmZGVmIElQQV9PRkZMT0FECisvKioKKyAqIEBicmllZiBJUEEgbWljcm8gY29udHJvbGxlciBkYXRhIHBhdGggb2ZmbG9hZCBlbmFibGUgb3Igbm90CisgKiBAZGV0YWlsCisgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIElQQSBtaWNybyBjb250cm9sbGVyIGRhdGEgcGF0aCBvZmZsb2FkCisgKiAgZmVhdHVyZSBlbmFibGVkIG9yIG5vdAorICoKKyAqIEBwYXJhbSBwZGV2IC0gaGFuZGxlIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2UKKyAqLwordW5zaWduZWQgaW50IG9sX2NmZ19pcGFfdWNfb2ZmbG9hZF9lbmFibGVkKG9sX3BkZXZfaGFuZGxlIHBkZXYpOworLyoqCisgKiBAYnJpZWYgSVBBIG1pY3JvIGNvbnRyb2xsZXIgZGF0YSBwYXRoIFRYIGJ1ZmZlciBzaXplCisgKiBAZGV0YWlsCisgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIElQQSBtaWNybyBjb250cm9sbGVyIGRhdGEgcGF0aCBvZmZsb2FkCisgKiAgVFggYnVmZmVyIHNpemUgd2hpY2ggc2hvdWxkIGJlIHByZS1hbGxvY2F0ZWQgYnkgZHJpdmVyLgorICogIERlZmF1bHQgYnVmZmVyIHNpemUgaXMgMksKKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKi8KK3Vuc2lnbmVkIGludCBvbF9jZmdfaXBhX3VjX3R4X2J1Zl9zaXplKG9sX3BkZXZfaGFuZGxlIHBkZXYpOworLyoqCisgKiBAYnJpZWYgSVBBIG1pY3JvIGNvbnRyb2xsZXIgZGF0YSBwYXRoIFRYIGJ1ZmZlciBzaXplCisgKiBAZGV0YWlsCisgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIElQQSBtaWNybyBjb250cm9sbGVyIGRhdGEgcGF0aCBvZmZsb2FkCisgKiAgVFggYnVmZmVyIGNvdW50IHdoaWNoIHNob3VsZCBiZSBwcmUtYWxsb2NhdGVkIGJ5IGRyaXZlci4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKi8KK3Vuc2lnbmVkIGludCBvbF9jZmdfaXBhX3VjX3R4X21heF9idWZfY250KG9sX3BkZXZfaGFuZGxlIHBkZXYpOworLyoqCisgKiBAYnJpZWYgSVBBIG1pY3JvIGNvbnRyb2xsZXIgZGF0YSBwYXRoIFRYIGJ1ZmZlciBzaXplCisgKiBAZGV0YWlsCisgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIElQQSBtaWNybyBjb250cm9sbGVyIGRhdGEgcGF0aCBvZmZsb2FkCisgKiAgUlggaW5kaWNhdGlvbiByaW5nIHNpemUgd2hpY2ggd2lsbCBub3RpZmllZCBieSBXTEFOIEZXIHRvIElQQQorICogIG1pY3JvIGNvbnRyb2xsZXIKKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKi8KK3Vuc2lnbmVkIGludCBvbF9jZmdfaXBhX3VjX3J4X2luZF9yaW5nX3NpemUob2xfcGRldl9oYW5kbGUgcGRldik7CisvKioKKyAqIEBicmllZiBJUEEgbWljcm8gY29udHJvbGxlciBkYXRhIHBhdGggVFggYnVmZmVyIHNpemUKKyAqIEBwYXJhbSBwZGV2IC0gaGFuZGxlIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2UKKyAqLwordW5zaWduZWQgaW50IG9sX2NmZ19pcGFfdWNfdHhfcGFydGl0aW9uX2Jhc2Uob2xfcGRldl9oYW5kbGUgcGRldik7CisjZWxzZQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb2xfY2ZnX2lwYV91Y19vZmZsb2FkX2VuYWJsZWQoCisJb2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb2xfY2ZnX2lwYV91Y190eF9idWZfc2l6ZSgKKwlvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvbF9jZmdfaXBhX3VjX3R4X21heF9idWZfY250KAorCW9sX3BkZXZfaGFuZGxlIHBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9sX2NmZ19pcGFfdWNfcnhfaW5kX3Jpbmdfc2l6ZSgKKwlvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvbF9jZmdfaXBhX3VjX3R4X3BhcnRpdGlvbl9iYXNlKAorCW9sX3BkZXZfaGFuZGxlIHBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogSVBBX09GRkxPQUQgKi8KKyNlbmRpZiAvKiBfT0xfQ0ZHX19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC9vbC9pbmMvb2xfY3RybF9hZGRiYV9hcGkuaCBiL2NvcmUvZHAvb2wvaW5jL29sX2N0cmxfYWRkYmFfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4NTRlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvb2wvaW5jL29sX2N0cmxfYWRkYmFfYXBpLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfT0xfQ1RSTF9BRERCQV9BUElfSF8KKyNkZWZpbmUgX09MX0NUUkxfQUREQkFfQVBJX0hfCisjZGVmaW5lIG9sX2N0cmxfYWRkYmFfYXR0YWNoKGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgIDAKKyNkZWZpbmUgb2xfY3RybF9hZGRiYV9kZXRhY2goYSkgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBvbF9jdHJsX2FkZGJhX2luaXQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAwCisjZGVmaW5lIG9sX2N0cmxfYWRkYmFfY2xlYW51cChhKSAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgb2xfY3RybF9hZGRiYV9yZXF1ZXN0X3NldHVwKGEsIGIsIGMsIGQsIGUsIGYpICAgMAorI2RlZmluZSBvbF9jdHJsX2FkZGJhX3Jlc3BvbnNlX3NldHVwKGEsIGIsIGMsIGQsIGUsIGYpICAwCisjZGVmaW5lIG9sX2N0cmxfYWRkYmFfcmVxdWVzdF9wcm9jZXNzKGEsIGIsIGMsIGQsIGUpICAgIDAKKyNkZWZpbmUgb2xfY3RybF9hZGRiYV9yZXNwb25zZV9wcm9jZXNzKGEsIGIsIGMsIGQpICAgICAgMAorI2RlZmluZSBvbF9jdHJsX2FkZGJhX2NsZWFyKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIG9sX2N0cmxfZGVsYmFfcHJvY2VzcyhhLCBiLCBjKSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgb2xfY3RybF9hZGRiYV9nZXRfc3RhdHVzKGEsIGIpICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBvbF9jdHJsX2FkZGJhX3NldF9yZXNwb25zZShhLCBiLCBjKSAgICAgICAgICAgICAwCisjZGVmaW5lIG9sX2N0cmxfYWRkYmFfY2xlYXJfcmVzcG9uc2UoYSkgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9kcC9vbC9pbmMvb2xfY3RybF9hcGkuaCBiL2NvcmUvZHAvb2wvaW5jL29sX2N0cmxfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlNmViMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvb2wvaW5jL29sX2N0cmxfYXBpLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGZpbGUgb2xfY3RybF9hcGkuaAorICogQGJyaWVmIERlZmluaXRpb25zIHVzZWQgaW4gbXVsdGlwbGUgZXh0ZXJuYWwgaW50ZXJmYWNlcyB0byB0aGUgY29udHJvbCBTVy4KKyAqLworI2lmbmRlZiBfT0xfQ1RSTF9BUElfX0hfCisjZGVmaW5lIF9PTF9DVFJMX0FQSV9fSF8KKworc3RydWN0IG9sX3BkZXZfdDsKK3R5cGVkZWYgc3RydWN0IG9sX3BkZXZfdCAqb2xfcGRldl9oYW5kbGU7CisKK3N0cnVjdCBvbF92ZGV2X3Q7Cit0eXBlZGVmIHN0cnVjdCBvbF92ZGV2X3QgKm9sX3ZkZXZfaGFuZGxlOworCitzdHJ1Y3Qgb2xfcGVlcl90OwordHlwZWRlZiBzdHJ1Y3Qgb2xfcGVlcl90ICpvbF9wZWVyX2hhbmRsZTsKKworI2VuZGlmIC8qIF9PTF9DVFJMX0FQSV9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvb2wvaW5jL29sX2RlZmluZXMuaCBiL2NvcmUvZHAvb2wvaW5jL29sX2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjgzYWRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9vbC9pbmMvb2xfZGVmaW5lcy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBPZmZsb2FkIHNwZWNpZmljIE9wYXF1ZSBEYXRhIHR5cGVzLgorICovCisjaWZuZGVmIF9ERVZfT0xfREVGSU5FU19ICisjZGVmaW5lIF9ERVZfT0xfREVGSU5FU19ICisKKy8qKgorICogQGJyaWVmIE9wYXF1ZSBoYW5kbGUgb2Ygd21pIHN0cnVjdHVyZQorICovCitzdHJ1Y3Qgd21pX3VuaWZpZWQ7Cit0eXBlZGVmIHN0cnVjdCB3bWlfdW5pZmllZCAqd21pX3VuaWZpZWRfdDsKKwordHlwZWRlZiB2b2lkICpvbF9zY25fdDsKKy8qKgorICogQHdtaV9ldmVudF9oYW5kbGVyIGZ1bmN0aW9uIHByb3RvdHlwZQorICovCit0eXBlZGVmIGludCAoKndtaV91bmlmaWVkX2V2ZW50X2hhbmRsZXIpKG9sX3Njbl90IHNjbl9oYW5kbGUsCisJCQkJCSB1aW50OF90ICpldmVudF9idWYsIHVpbnQzMl90IGxlbik7CisKKyNlbmRpZiAvKiBfREVWX09MX0RFRklORVNfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC9vbC9pbmMvb2xfaHR0X2FwaS5oIGIvY29yZS9kcC9vbC9pbmMvb2xfaHR0X2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOWU1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL29sL2luYy9vbF9odHRfYXBpLmgKQEAgLTAsMCArMSwzNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGZpbGUgb2xfaHR0X2FwaS5oCisgKiBAYnJpZWYgU3BlY2lmeSB0aGUgZ2VuZXJhbCBIVFQgQVBJIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIGhvc3QgZGF0YSBTVy4KKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBIVFQgQVBJIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8KKyAqICBlaXRoZXIgdHggbm9yIHJ4LgorICovCisjaWZuZGVmIF9PTF9IVFRfQVBJX19IXworI2RlZmluZSBfT0xfSFRUX0FQSV9fSF8KKworI2luY2x1ZGUgPGNkZl90eXBlcy5oPiAgICAgICAgICAvKiBjZGZfZGV2aWNlX3QgKi8KKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCAqLworI2luY2x1ZGUgPGF0aGRlZnMuaD4gICAgICAgICAgICAvKiBBX1NUQVRVUyAqLworI2luY2x1ZGUgPGh0Y19hcGkuaD4gICAgICAgICAgICAvKiBIVENfSEFORExFICovCisjaW5jbHVkZSA8b2xfY3RybF9hcGkuaD4gICAgICAgIC8qIG9sX3BkZXZfaGFuZGxlICovCisjaW5jbHVkZSA8b2xfdHhyeF9hcGkuaD4gICAgICAgIC8qIG9sX3R4cnhfcGRldl9oYW5kbGUgKi8KKyNpbmNsdWRlICJodHQuaCIgICAgICAgICAgICAgICAgLyogaHR0X2RiZ19zdGF0c190eXBlLCBldGMuICovCisKKy8qIFRJRCAqLworI2RlZmluZSBPTF9IVFRfVElEX05PTl9RT1NfVU5JQ0FTVCAgICAgMTYKKyNkZWZpbmUgT0xfSFRUX1RJRF9OT05fUU9TX01DQVNUX0JDQVNUIDE4CisKK3N0cnVjdCBodHRfcGRldl90OwordHlwZWRlZiBzdHJ1Y3QgaHR0X3BkZXZfdCAqaHR0X3BkZXZfaGFuZGxlOworCitodHRfcGRldl9oYW5kbGUKK2h0dF9wZGV2X2FsbG9jKG9sX3R4cnhfcGRldl9oYW5kbGUgdHhyeF9wZGV2LAorCW9sX3BkZXZfaGFuZGxlIGN0cmxfcGRldiwKKwlIVENfSEFORExFIGh0Y19wZGV2LCBjZGZfZGV2aWNlX3Qgb3NkZXYpOworCisvKioKKyAqIEBicmllZiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEhUVCBpbnN0YW5jZS4KKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGFuIEhUVCBpbnN0YW5jZS4KKyAqICBUaGlzIGludm9sdmVzIGFsbG9jYXRpbmcgYSBwb29sIG9mIEhUVCB0eCBkZXNjcmlwdG9ycyBpbgorICogIGNvbnNpc3RlbnQgbWVtb3J5LCBhbGxvY2F0aW5nIGFuZCBmaWxsaW5nIGEgcnggcmluZyAoTEwgb25seSksCisgKiAgYW5kIGNvbm5lY3RpbmcgdGhlIEhUQydzIEhUVF9EQVRBX01TRyBzZXJ2aWNlLgorICogIFRoZSBIVEMgc2VydmljZSBjb25uZWN0IGNhbGwgd2lsbCBibG9jaywgc28gdGhpcyBmdW5jdGlvbgorICogIG5lZWRzIHRvIGJlIGNhbGxlZCBpbiBwYXNzaXZlIGNvbnRleHQuCisgKiAgQmVjYXVzZSBIVEMgc2V0dXAgaGFzIG5vdCBiZWVuIGNvbXBsZXRlZCBhdCB0aGUgdGltZSB0aGlzIGZ1bmN0aW9uCisgKiAgaXMgY2FsbGVkLCB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBzZW5kIGFueSBIVEMgbWVzc2FnZXMgdG8gdGhlIHRhcmdldC4KKyAqICBNZXNzYWdlcyB0byBjb25maWd1cmUgdGhlIHRhcmdldCBhcmUgaW5zdGVhZCBzZW50IGluIHRoZQorICogIGh0Y19hdHRhY2hfdGFyZ2V0IGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gZGF0YSBTVydzIHBoeXNpY2FsIGRldmljZSBoYW5kbGUKKyAqICAgICAgKHVzZWQgYXMgY29udGV4dCBwb2ludGVyIGR1cmluZyBIVFQgLT4gdHhyeCBjYWxscykKKyAqIEBwYXJhbSBkZXNjX3Bvb2xfc2l6ZSAtIG51bWJlciBvZiBIVFQgZGVzY3JpcHRvcnMgdG8gKHByZSlhbGxvY2F0ZQorICogQHJldHVybiBzdWNjZXNzIC0+IEhUVCBwZGV2IGhhbmRsZTsgZmFpbHVyZSAtPiBOVUxMCisgKi8KK2ludAoraHR0X2F0dGFjaChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwgaW50IGRlc2NfcG9vbF9zaXplKTsKKworLyoqCisgKiBAYnJpZWYgU2VuZCBIVFQgY29uZmlndXJhdGlvbiBtZXNzYWdlcyB0byB0aGUgdGFyZ2V0LgorICogQGRldGFpbHMKKyAqICBGb3IgTEwgb25seSwgdGhpcyBmdW5jdGlvbiBzZW5kcyBhIHJ4IHJpbmcgY29uZmlndXJhdGlvbiBtZXNzYWdlIHRvIHRoZQorICogIHRhcmdldC4gIEZvciBITCwgdGhpcyBmdW5jdGlvbiBpcyBhIG5vLW9wLgorICoKKyAqIEBwYXJhbSBodHRfcGRldiAtIGhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlIGJlaW5nIGluaXRpYWxpemVkCisgKi8KK0FfU1RBVFVTIGh0dF9hdHRhY2hfdGFyZ2V0KGh0dF9wZGV2X2hhbmRsZSBodHRfcGRldik7CisKKy8qKgorICogZW51bSBodHRfb3BfbW9kZSAtIFZpcnR1YWwgZGV2aWNlIG9wZXJhdGlvbiBtb2RlCisgKgorICogQGh0dF9vcF9tb2RlX3Vua25vd246IFVua25vd24gbW9kZQorICogQGh0dF9vcF9tb2RlX2FwOiBBUCBtb2RlCisgKiBAaHR0X29wX21vZGVfaWJzczogSUJTUyBtb2RlCisgKiBAaHR0X29wX21vZGVfc3RhOiBTVEEgKGNsaWVudCkgbW9kZQorICogQGh0dF9vcF9tb2RlX21vbml0b3I6IE1vbml0b3IgbW9kZQorICogQGh0dF9vcF9tb2RlX29jYjogT0NCIG1vZGUKKyAqLworZW51bSBodHRfb3BfbW9kZSB7CisJaHR0X29wX21vZGVfdW5rbm93biwKKwlodHRfb3BfbW9kZV9hcCwKKwlodHRfb3BfbW9kZV9pYnNzLAorCWh0dF9vcF9tb2RlX3N0YSwKKwlodHRfb3BfbW9kZV9tb25pdG9yLAorCWh0dF9vcF9tb2RlX29jYiwKK307CisKKy8qIG5vLW9wcyAqLworI2RlZmluZSBodHRfdmRldl9hdHRhY2goaHR0X3BkZXYsIHZkZXZfaWQsIG9wX21vZGUpCisjZGVmaW5lIGh0dF92ZGV2X2RldGFjaChodHRfcGRldiwgdmRldl9pZCkKKyNkZWZpbmUgaHR0X3BlZXJfcW9zX3VwZGF0ZShodHRfcGRldiwgcGVlcl9pZCwgcW9zX2NhcGFibGUpCisjZGVmaW5lIGh0dF9wZWVyX3VhcHNkbWFza191cGRhdGUoaHR0X3BkZXYsIHBlZXJfaWQsIHVhcHNkX21hc2spCisKK3ZvaWQgaHR0X3BkZXZfZnJlZShodHRfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogQGJyaWVmIERlYWxsb2NhdGUgYSBIVFQgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIGh0dF9wZGV2IC0gaGFuZGxlIHRvIHRoZSBIVFQgaW5zdGFuY2UgYmVpbmcgdG9ybiBkb3duCisgKi8KK3ZvaWQgaHR0X2RldGFjaChodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYpOworCisvKioKKyAqIEBicmllZiBTdG9wIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gSFRUIGFuZCB0YXJnZXQKKyAqIEBkZXRhaWxzCisgKiAgRm9yIElTT0Mgc29sdXRpb24sIHRoaXMgZnVuY3Rpb24gc3RvcCB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEhUVCBhbmQKKyAqICB0YXJnZXQuCisgKiAgRm9yIFBlcmVncmluZS9Sb21lLCBpdCdzIGFscmVhZHkgc3RvcHBlZCBieSBvbF9hdGhfZGlzY29ubmVjdF9odGMKKyAqICBiZWZvcmUgb2xfdHhyeF9wZGV2X2RldGFjaCBjYWxsZWQgaW4gb2xfYXRoX2RldGFjaC4gU28gdGhpcyBmdW5jdGlvbiBpcworICogIGEgbm8tb3AuCisgKiAgUGVyZWdyaW5lL1JvbWUgSFRUIGxheWVyIGlzIG9uIHRvcCBvZiBIVEMgd2hpbGUgSVNPQyBzb2x1dGlvbiBIVFQgbGF5ZXIgaXMKKyAqICBvbiB0b3Agb2YgRFhFIGxheWVyLgorICoKKyAqIEBwYXJhbSBodHRfcGRldiAtIGhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlIGJlaW5nIGluaXRpYWxpemVkCisgKi8KK3ZvaWQgaHR0X2RldGFjaF90YXJnZXQoaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2KTsKKworLyoKKyAqIEBicmllZiBUZWxsIHRoZSB0YXJnZXQgc2lkZSBvZiBIVFQgdG8gc3VzcGVuZCBIMlQgcHJvY2Vzc2luZyB1bnRpbCBzeW5jZWQKKyAqIEBwYXJhbSBodHRfcGRldiAtIHRoZSBob3N0IEhUVCBvYmplY3QKKyAqIEBwYXJhbSBzeW5jX2NudCAtIHdoYXQgc3luYyBjb3VudCB2YWx1ZSB0aGUgdGFyZ2V0IEhUVCBGVyBzaG91bGQgd2FpdCBmb3IKKyAqICAgICAgYmVmb3JlIHJlc3VtaW5nIEgyVCBwcm9jZXNzaW5nCisgKi8KK0FfU1RBVFVTIGh0dF9oMnRfc3luY19tc2coaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2LCB1aW50OF90IHN5bmNfY250KTsKKworaW50CitodHRfaDJ0X2FnZ3JfY2ZnX21zZyhodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsCisJCSAgICAgaW50IG1heF9zdWJmcm1zX2FtcGR1LCBpbnQgbWF4X3N1YmZybXNfYW1zZHUpOworCisvKioKKyAqIEBicmllZiBHZXQgdGhlIEZXIHN0YXR1cworICogQGRldGFpbHMKKyAqICBUcmlnZ2VyIEZXIEhUVCB0byByZXRyaWV2ZSBGVyBzdGF0dXMuCisgKiAgQSBzZXBhcmF0ZSBIVFQgbWVzc2FnZSB3aWxsIGNvbWUgYmFjayB3aXRoIHRoZSBzdGF0aXN0aWNzIHdlIHdhbnQuCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIEhUVCBpbnN0YW5jZQorICogQHBhcmFtIHN0YXRzX3R5cGVfdXBsb2FkX21hc2sgLSBiaXRtYXNrIGlkZW50aWZ5aW5nIHdoaWNoIHN0YXRzIHRvIHVwbG9hZAorICogQHBhcmFtIHN0YXRzX3R5cGVfcmVzZXRfbWFzayAtIGJpdG1hc2sgaWRlbnRpZnlpbmcgd2hpY2ggc3RhdHMgdG8gcmVzZXQKKyAqIEBwYXJhbSBjb29raWUgLSB1bmlxdWUgdmFsdWUgdG8gZGlzdGluZ3Vpc2ggYW5kIGlkZW50aWZ5IHN0YXRzIHJlcXVlc3RzCisgKiBAcmV0dXJuIDAgLSBzdWNjZWVkIHRvIHNlbmQgdGhlIHJlcXVlc3QgdG8gRlc7IG90aGVyd2lzZSwgZmFpbGVkIHRvIGRvIHNvLgorICovCitpbnQKK2h0dF9oMnRfZGJnX3N0YXRzX2dldChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwKKwkJICAgICAgdWludDMyX3Qgc3RhdHNfdHlwZV91cGxvYWRfbWFzaywKKwkJICAgICAgdWludDMyX3Qgc3RhdHNfdHlwZV9yZXNldF9tYXNrLAorCQkgICAgICB1aW50OF90IGNmZ19zdGF0c190eXBlLAorCQkgICAgICB1aW50MzJfdCBjZmdfdmFsLCB1aW50NjRfdCBjb29raWUpOworCisvKioKKyAqIEBicmllZiBHZXQgdGhlIGZpZWxkcyBmcm9tIEhUVCBUMkggc3RhdHMgdXBsb2FkIG1lc3NhZ2UncyBzdGF0cyBpbmZvIGhlYWRlcgorICogQGRldGFpbHMKKyAqICBQYXJzZSB0aGUgYSBIVFQgVDJIIG1lc3NhZ2UncyBzdGF0cyBpbmZvIHRhZy1sZW5ndGgtdmFsdWUgaGVhZGVyLAorICogIHRvIG9idGFpbiB0aGUgc3RhdHMgdHlwZSwgc3RhdHVzLCBkYXRhIGxlbmdodCwgYW5kIGRhdGEgYWRkcmVzcy4KKyAqCisgKiBAcGFyYW0gc3RhdHNfaW5mb19saXN0IC0gYWRkcmVzcyBvZiBzdGF0cyByZWNvcmQncyBoZWFkZXIKKyAqIEBwYXJhbVtvdXRdIHR5cGUgLSB3aGljaCB0eXBlIG9mIEZXIHN0YXRzIGFyZSBjb250YWluZWQgaW4gdGhlIHJlY29yZAorICogQHBhcmFtW291dF0gc3RhdHVzIC0gd2hldGhlciB0aGUgc3RhdHMgYXJlIChmdWxseSkgcHJlc2VudCBpbiB0aGUgcmVjb3JkCisgKiBAcGFyYW1bb3V0XSBsZW5ndGggLSBob3cgbGFyZ2UgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgc3RhdHMgcmVjb3JkIGlzCisgKiBAcGFyYW1bb3V0XSBzdGF0c19kYXRhIC0gd2hlcmUgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgc3RhdHMgcmVjb3JkIGlzCisgKi8KK3ZvaWQKK2h0dF90MmhfZGJnX3N0YXRzX2hkcl9wYXJzZSh1aW50OF90ICpzdGF0c19pbmZvX2xpc3QsCisJCQkgICAgZW51bSBodHRfZGJnX3N0YXRzX3R5cGUgKnR5cGUsCisJCQkgICAgZW51bSBodHRfZGJnX3N0YXRzX3N0YXR1cyAqc3RhdHVzLAorCQkJICAgIGludCAqbGVuZ3RoLCB1aW50OF90ICoqc3RhdHNfZGF0YSk7CisKKy8qKgorICogQGJyaWVmIERpc3BsYXkgYSBzdGF0cyByZWNvcmQgZnJvbSB0aGUgSFRUIFQySCBTVEFUU19DT05GIG1lc3NhZ2UuCisgKiBAZGV0YWlscworICogIFBhcnNlIHRoZSBzdGF0cyB0eXBlIGFuZCBzdGF0dXMsIGFuZCBpbnZva2UgYSB0eXBlLXNwZWNpZmllZCBwcmludG91dAorICogIHRvIGRpc3BsYXkgdGhlIHN0YXRzIHZhbHVlcy4KKyAqCisgKiAgQHBhcmFtIHN0YXRzX2RhdGEgLSBidWZmZXIgaG9sZGluZyB0aGUgc3RhdHMgcmVjb3JkIGZyb20gdGhlIFNUQVRTX0NPTkYgbXNnCisgKiAgQHBhcmFtIGNvbmNpc2UgLSB3aGV0aGVyIHRvIGRvIGEgdmVyYm9zZSBvciBjb25jaXNlIHByaW50b3V0CisgKi8KK3ZvaWQgaHR0X3QyaF9zdGF0c19wcmludCh1aW50OF90ICpzdGF0c19kYXRhLCBpbnQgY29uY2lzZSk7CisKKyNpZm5kZWYgSFRUX0RFQlVHX0xFVkVMCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUgSFRUX0RFQlVHX0xFVkVMIDEwCisjZWxzZQorI2RlZmluZSBIVFRfREVCVUdfTEVWRUwgMAorI2VuZGlmCisjZW5kaWYKKworI2lmIEhUVF9ERUJVR19MRVZFTCA+IDUKK3ZvaWQgaHR0X2Rpc3BsYXkoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIGludCBpbmRlbnQpOworI2Vsc2UKKyNkZWZpbmUgaHR0X2Rpc3BsYXkocGRldiwgaW5kZW50KQorI2VuZGlmCisKKyNkZWZpbmUgSFRUX0RYRV9SWF9MT0cgMAorI2RlZmluZSBodHRfcnhfcmVvcmRlcl9sb2dfcHJpbnQocGRldikKKworI2lmZGVmIElQQV9PRkZMT0FECisvKioKKyAqIEBicmllZiBzZW5kIElQQSBVQyByZXNvdXJjZSBjb25maWcgbWVzc2FnZSB0byBmaXJtd2FyZSB3aXRoIEhUVCBtZXNzYWdlCisgKiBAZGV0YWlscworICogIHNlbmQgSVBBIFVDIHJlc291cmNlIGNvbmZpZyBtZXNzYWdlIHRvIGZpcm13YXJlIHdpdGggSFRUIG1lc3NhZ2UKKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlCisgKi8KK2ludCBodHRfaDJ0X2lwYV91Y19yc2NfY2ZnX21zZyhzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisKKy8qKgorICogQGJyaWVmIENsaWVudCByZXF1ZXN0IHJlc291cmNlIGluZm9ybWF0aW9uCisgKiBAZGV0YWlscworICogIE9MIGNsaWVudCB3aWxsIHJldXFlc3QgSVBBIFVDIHJlbGF0ZWQgcmVzb3VyY2UgaW5mb3JtYXRpb24KKyAqICBSZXNvdXJjZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGRpc3RyaWJ1dHRlZCB0byBJUEEgbW9kdWxlCisgKiAgQWxsIG9mIHRoZSByZXF1aXJlZCByZXNvdXJjZXMgc2hvdWxkIGJlIHByZS1hbGxvY2F0ZWQKKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlCisgKiBAcGFyYW0gY2Vfc3JfYmFzZV9wYWRkciAtIGNvcHkgZW5naW5lIHNvdXJjZSByaW5nIGJhc2UgcGh5c2ljYWwgYWRkcmVzcworICogQHBhcmFtIGNlX3NyX3Jpbmdfc2l6ZSAtIGNvcHkgZW5naW5lIHNvdXJjZSByaW5nIHNpemUKKyAqIEBwYXJhbSBjZV9yZWdfcGFkZHIgLSBjb3B5IGVuZ2luZSByZWdpc3RlciBwaHlzaWNhbCBhZGRyZXNzCisgKiBAcGFyYW0gdHhfY29tcF9yaW5nX2Jhc2VfcGFkZHIgLSB0eCBjb21wIHJpbmcgYmFzZSBwaHlzaWNhbCBhZGRyZXNzCisgKiBAcGFyYW0gdHhfY29tcF9yaW5nX3NpemUgLSB0eCBjb21wIHJpbmcgc2l6ZQorICogQHBhcmFtIHR4X251bV9hbGxvY19idWZmZXIgLSBudW1iZXIgb2YgYWxsb2NhdGVkIHR4IGJ1ZmZlcgorICogQHBhcmFtIHJ4X3JkeV9yaW5nX2Jhc2VfcGFkZHIgLSByeCByZWFkeSByaW5nIGJhc2UgcGh5c2ljYWwgYWRkcmVzcworICogQHBhcmFtIHJ4X3JkeV9yaW5nX3NpemUgLSByeCByZWFkeSByaW5nIHNpemUKKyAqIEBwYXJhbSByeF9wcm9jX2RvbmVfaWR4X3BhZGRyIC0gcnggcHJvY2VzcyBkb25lIGluZGV4IHBoeXNpY2FsIGFkZHJlc3MKKyAqLworaW50CitodHRfaXBhX3VjX2dldF9yZXNvdXJjZShodHRfcGRldl9oYW5kbGUgcGRldiwKKwkJCXVpbnQzMl90ICpjZV9zcl9iYXNlX3BhZGRyLAorCQkJdWludDMyX3QgKmNlX3NyX3Jpbmdfc2l6ZSwKKwkJCWNkZl9kbWFfYWRkcl90ICpjZV9yZWdfcGFkZHIsCisJCQl1aW50MzJfdCAqdHhfY29tcF9yaW5nX2Jhc2VfcGFkZHIsCisJCQl1aW50MzJfdCAqdHhfY29tcF9yaW5nX3NpemUsCisJCQl1aW50MzJfdCAqdHhfbnVtX2FsbG9jX2J1ZmZlciwKKwkJCXVpbnQzMl90ICpyeF9yZHlfcmluZ19iYXNlX3BhZGRyLAorCQkJdWludDMyX3QgKnJ4X3JkeV9yaW5nX3NpemUsCisJCQl1aW50MzJfdCAqcnhfcHJvY19kb25lX2lkeF9wYWRkcik7CisKKy8qKgorICogQGJyaWVmIENsaWVudCBzZXQgSVBBIFVDIGRvb3JiZWxsIHJlZ2lzdGVyCisgKiBAZGV0YWlscworICogIElQQSBVQyBsZXQga25vdyBkb29yYmVsbCByZWdpc3RlciBwaHlzaWNhbCBhZGRyZXNzCisgKiAgV0xBTiBmaXJtd2FyZSB3aWxsIHVzZSB0aGlzIHBoeXNpY2FsIGFkZHJlc3MgdG8gbm90aWZ5IElQQSBVQworICoKKyAqIEBwYXJhbSBwZGV2IC0gaGFuZGxlIHRvIHRoZSBIVFQgaW5zdGFuY2UKKyAqIEBwYXJhbSBpcGFfdWNfdHhfZG9vcmJlbGxfcGFkZHIgLSB0eCBjb21wIGRvb3JiZWxsIHBoeXNpY2FsIGFkZHJlc3MKKyAqIEBwYXJhbSBpcGFfdWNfcnhfZG9vcmJlbGxfcGFkZHIgLSByeCByZWFkeSBkb29yYmVsbCBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK2ludAoraHR0X2lwYV91Y19zZXRfZG9vcmJlbGxfcGFkZHIoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkgICAgICB1aW50MzJfdCBpcGFfdWNfdHhfZG9vcmJlbGxfcGFkZHIsCisJCQkgICAgICB1aW50MzJfdCBpcGFfdWNfcnhfZG9vcmJlbGxfcGFkZHIpOworCisvKioKKyAqIEBicmllZiBDbGllbnQgbm90aWZ5IElQQSBVQyBkYXRhIHBhdGggYWN0aXZlIG9yIG5vdAorICoKKyAqIEBwYXJhbSBwZGV2IC0gaGFuZGxlIHRvIHRoZSBIVFQgaW5zdGFuY2UKKyAqIEBwYXJhbSB1Y19hY3RpdmUgLSBVQyBkYXRhIHBhdGggaXMgYWN0aXZlIG9yIG5vdAorICogQHBhcmFtIGlzX3R4IC0gVUMgVFggaXMgYWN0aXZlIG9yIG5vdAorICovCitpbnQKK2h0dF9oMnRfaXBhX3VjX3NldF9hY3RpdmUoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYsIGJvb2wgdWNfYWN0aXZlLCBib29sIGlzX3R4KTsKKworLyoqCisgKiBAYnJpZWYgcXVlcnkgdWMgZGF0YSBwYXRoIHN0YXRzCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIEhUVCBpbnN0YW5jZQorICovCitpbnQgaHR0X2gydF9pcGFfdWNfZ2V0X3N0YXRzKHN0cnVjdCBodHRfcGRldl90ICpwZGV2KTsKKworLyoqCisgKiBAYnJpZWYgQXR0YWNoIElQQSBVQyBkYXRhIHBhdGgKKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlCisgKi8KK2ludCBodHRfaXBhX3VjX2F0dGFjaChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisKKy8qKgorICogQGJyaWVmIGRldGFjaCBJUEEgVUMgZGF0YSBwYXRoCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIEhUVCBpbnN0YW5jZQorICovCit2b2lkIGh0dF9pcGFfdWNfZGV0YWNoKHN0cnVjdCBodHRfcGRldl90ICpwZGV2KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBodHRfaDJ0X2lwYV91Y19yc2NfY2ZnX21zZyhzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2h0dF9pcGFfdWNfZ2V0X3Jlc291cmNlKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJdWludDMyX3QgKmNlX3NyX2Jhc2VfcGFkZHIsCisJCQl1aW50MzJfdCAqY2Vfc3JfcmluZ19zaXplLAorCQkJY2RmX2RtYV9hZGRyX3QgKmNlX3JlZ19wYWRkciwKKwkJCXVpbnQzMl90ICp0eF9jb21wX3JpbmdfYmFzZV9wYWRkciwKKwkJCXVpbnQzMl90ICp0eF9jb21wX3Jpbmdfc2l6ZSwKKwkJCXVpbnQzMl90ICp0eF9udW1fYWxsb2NfYnVmZmVyLAorCQkJdWludDMyX3QgKnJ4X3JkeV9yaW5nX2Jhc2VfcGFkZHIsCisJCQl1aW50MzJfdCAqcnhfcmR5X3Jpbmdfc2l6ZSwKKwkJCXVpbnQzMl90ICpyeF9wcm9jX2RvbmVfaWR4X3BhZGRyKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraHR0X2lwYV91Y19zZXRfZG9vcmJlbGxfcGFkZHIoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkgICAgICB1aW50MzJfdCBpcGFfdWNfdHhfZG9vcmJlbGxfcGFkZHIsCisJCQkgICAgICB1aW50MzJfdCBpcGFfdWNfcnhfZG9vcmJlbGxfcGFkZHIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitodHRfaDJ0X2lwYV91Y19zZXRfYWN0aXZlKHN0cnVjdCBodHRfcGRldl90ICpwZGV2LCBib29sIHVjX2FjdGl2ZSwKKwlib29sIGlzX3R4KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBodHRfaDJ0X2lwYV91Y19nZXRfc3RhdHMoc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGh0dF9pcGFfdWNfYXR0YWNoKHN0cnVjdCBodHRfcGRldl90ICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHR0X2lwYV91Y19kZXRhY2goc3RydWN0IGh0dF9wZGV2X3QgKnBkZXYpCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCisKKyNlbmRpZiAvKiBfT0xfSFRUX0FQSV9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvb2wvaW5jL29sX2h0dF9yeF9hcGkuaCBiL2NvcmUvZHAvb2wvaW5jL29sX2h0dF9yeF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTRjNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9vbC9pbmMvb2xfaHR0X3J4X2FwaS5oCkBAIC0wLDAgKzEsODYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIG9sX2h0dF9yeF9hcGkuaAorICogQGJyaWVmIFNwZWNpZnkgdGhlIHJ4IEhUVCBBUEkgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGUgaG9zdCBkYXRhIFNXLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEhUVCBBUEkgZnVuY3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljYWxseQorICogIHJlbGF0ZWQgdG8gcmVjZWl2ZSBwcm9jZXNzaW5nLgorICogIEluIHBhcnRpY3VsYXIsIHRoaXMgZmlsZSBzcGVjaWZpZXMgbWV0aG9kcyBvZiB0aGUgYWJzdHJhY3QgSFRUIHJ4CisgKiAgZGVzY3JpcHRvciwgYW5kIGZ1bmN0aW9ucyB0byBpdGVyYXRlIHRob3VnaCBhIHNlcmllcyBvZiByeCBkZXNjcmlwdG9ycworICogIGFuZCByeCBNU0RVIGJ1ZmZlcnMuCisgKi8KKyNpZm5kZWYgX09MX0hUVF9SWF9BUElfX0hfCisjZGVmaW5lIF9PTF9IVFRfUlhfQVBJX19IXworCisvKiAjaW5jbHVkZSA8b3NhcGlfbGludXguaD4gICAgIC8gKiB1aW50MTZfdCwgZXRjLiAqIC8gKi8KKyNpbmNsdWRlIDxvc2RlcC5oPiAgICAgICAgICAgICAgLyogdWludDE2X3QsIGV0Yy4gKi8KKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCAqLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPiAgICAgICAgICAvKiBib29sICovCisKKyNpbmNsdWRlIDxodHQuaD4gICAgICAgICAgICAgICAgLyogSFRUX1JYX0lORF9NUERVX1NUQVRVUyAqLworI2luY2x1ZGUgPG9sX2h0dF9hcGkuaD4gICAgICAgICAvKiBodHRfcGRldl9oYW5kbGUgKi8KKworI2luY2x1ZGUgPGNkc19pZWVlODAyMTFfZGVmaW5lcy5oPiAgLyogaWVlZTgwMjExX3J4X3N0YXR1cyAqLworI2luY2x1ZGUgPG9sX3Zvd2V4dF9kYmdfZGVmcy5oPgorCisvKj09PT09PT09PT09PT09PT0gY29uc3RhbnRzIGFuZCB0eXBlcyB1c2VkIGluIHRoZSByeCBBUEkgPT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgSFRUX1JTU0lfSU5WQUxJRCAweDdmZmYKKworLyoqCisgKiBzdHJ1Y3Qgb2NiX3J4X3N0YXRzX2hkcl90IC0gUlggc3RhdHMgaGVhZGVyCisgKiBAdmVyc2lvbjoJCVRoZSB2ZXJzaW9uIG11c3QgYmUgMS4KKyAqIEBsZW5ndGg6CQlUaGUgbGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgKiBAY2hhbm5lbF9mcmVxOglUaGUgY2VudGVyIGZyZXF1ZW5jeSBmb3IgdGhlIHBhY2tldAorICogQHJzc2lfY21iOgkJY29tYmluZWQgUlNTSSBmcm9tIGFsbCBjaGFpbnMKKyAqIEByc3NpWzRdOgkJcnNzaSBmb3IgY2hhaW5zIDAgdGhyb3VnaCAzIChmb3IgMjAgTUh6IGJhbmR3aWR0aCkKKyAqIEB0c2YzMjoJCXRpbWVzdGFtcCBpbiBUU0YgdW5pdHMKKyAqIEB0aW1lc3RhbXBfbWljcm9zZWM6CXRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMKKyAqIEBkYXRhcmF0ZToJCU1DUyBpbmRleAorICogQHRpbWVzdGFtcF9zdWJtaWNyb3NlYzogc3VibWljcm9zZWNvbmQgcG9ydGlvbiBvZiB0aGUgdGltZXN0YW1wCisgKiBAZXh0X3RpZDoJCUV4dGVuZGVkIFRJRAorICogQHJlc2VydmVkOgkJRW5zdXJlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaXMgYSBtdWx0aXBsZSBvZiA0LgorICoJCQlNdXN0IGJlIDAuCisgKgorICogV2hlbiByZWNlaXZpbmcgYW4gT0NCIHBhY2tldCwgdGhlIFJYIHN0YXRzIGlzIHNlbnQgdG8gdGhlIHVzZXIgYXBwbGljYXRpb24KKyAqIHNvIHRoYXQgdGhlIHVzZXIgYXBwbGljYXRpb24gY2FuIGRvIHByb2Nlc3NpbmcgYmFzZWQgb24gdGhlIFJYIHN0YXRzLgorICogVGhpcyBzdHJ1Y3R1cmUgd2lsbCBiZSBwcmVjZWRlZCBieSBhbiBldGhlcm5ldCBoZWFkZXIgd2l0aAorICogdGhlIHByb3RvIGZpZWxkIHNldCB0byAweDgxNTIuIFRoaXMgc3RydWN0IGluY2x1ZGVzIHZhcmlvdXMgUlgKKyAqIHBhcmFtYXRlcnMgaW5jbHVkaW5nIFJTU0ksIGRhdGEgcmF0ZSwgYW5kIGNlbnRlciBmcmVxdWVuY3kuCisgKi8KK1BSRVBBQ0sgc3RydWN0IG9jYl9yeF9zdGF0c19oZHJfdCB7CisJdWludDE2X3QgdmVyc2lvbjsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgY2hhbm5lbF9mcmVxOworCWludDE2X3QgcnNzaV9jbWI7CisJaW50MTZfdCByc3NpWzRdOworCXVpbnQzMl90IHRzZjMyOworCXVpbnQzMl90IHRpbWVzdGFtcF9taWNyb3NlYzsKKwl1aW50OF90IGRhdGFyYXRlOworCXVpbnQ4X3QgdGltZXN0YW1wX3N1Ym1pY3Jvc2VjOworCXVpbnQ4X3QgZXh0X3RpZDsKKwl1aW50OF90IHJlc2VydmVkOworfTsKKworLyo9PT09PT09PT09PT09PT09IHJ4IGluZGljYXRpb24gbWVzc2FnZSBmaWVsZCBhY2Nlc3MgbWV0aG9kcyA9PT09PT09PT09PT09PT0qLworCisvKioKKyAqIEBicmllZiBDaGVjayBpZiBhIHJ4IGluZGljYXRpb24gbWVzc2FnZSBoYXMgYSByeCByZW9yZGVyIGZsdXNoIGNvbW1hbmQuCisgKiBAZGV0YWlscworICogIFNwYWNlIGlzIHJlc2VydmVkIGluIGVhY2ggcnggaW5kaWNhdGlvbiBtZXNzYWdlIGZvciBhIHJ4IHJlb3JkZXIgZmx1c2gKKyAqICBjb21tYW5kLCB0byByZWxlYXNlIHNwZWNpZmllZCBNUERVcyBmcm9tIHRoZSByeCByZW9yZGVyIGhvbGRpbmcgYXJyYXkKKyAqICBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbmV3IE1QRFVzIHJlZmVyZW5jZWQgYnkgdGhlIHJ4IGluZGljYXRpb24gbWVzc2FnZS4KKyAqICBUaGlzIHJ4IHJlb3JkZXIgZmx1c2ggY29tbWFuZCBjb250YWlucyBhIGZsYWcgdG8gc2hvdyB3aGV0aGVyIHRoZSBjb21tYW5kCisgKiAgaXMgdmFsaWQgd2l0aGluIGEgZ2l2ZW4gcnggaW5kaWNhdGlvbiBtZXNzYWdlLgorICogIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSB2YWxpZGl0eSBmbGFnIGZyb20gdGhlIHJ4IGluZGljYXRpb24KKyAqICBmbHVzaCBjb21tYW5kIElFIHdpdGhpbiB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBwYXJhbSByeF9pbmRfbXNnIC0gdGhlIG5ldGJ1ZiBjb250YWluaW5nIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqIEByZXR1cm4KKyAqICAgICAgMSAtIHRoZSBtZXNzYWdlJ3MgcnggZmx1c2ggY29tbWFuZCBpcyB2YWxpZCBhbmQgc2hvdWxkIGJlIHByb2Nlc3NlZAorICogICAgICAgICAgYmVmb3JlIHByb2Nlc3NpbmcgbmV3IHJ4IE1QRFVzLAorICogICAgICAtT1ItCisgKiAgICAgIDAgLSB0aGUgbWVzc2FnZSdzIHJ4IGZsdXNoIGNvbW1hbmQgaXMgaW52YWxpZCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQKKyAqLworaW50IGh0dF9yeF9pbmRfZmx1c2goaHR0X3BkZXZfaGFuZGxlIHBkZXYsIGNkZl9uYnVmX3QgcnhfaW5kX21zZyk7CisKKy8qKgorICogQGJyaWVmIFJldHVybiB0aGUgc2VxdWVuY2UgbnVtYmVyIHN0YXJ0aW5nIHRoZSByYW5nZSBvZiBNUERVcyB0byBmbHVzaC4KKyAqIEBkZXRhaWxzCisgKiAgUmVhZCB0aGUgZmllbGRzIG9mIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UgdGhhdCBpZGVudGlmeSB0aGUgc3RhcnQKKyAqICBhbmQgZW5kIG9mIHRoZSByYW5nZSBvZiBNUERVcyB0byBmbHVzaCBmcm9tIHRoZSByeCByZW9yZGVyIGhvbGRpbmcgYXJyYXkKKyAqICBhbmQgc2VuZCBvbiB0byBzdWJzZXF1ZW50IHN0YWdlcyBvZiByeCBwcm9jZXNzaW5nLgorICogIFRoZXNlIHNlcXVlbmNlIG51bWJlcnMgYXJlIHRoZSA2IExTQnMgb2YgdGhlIDEyLWJpdCA4MDIuMTEgc2VxdWVuY2UKKyAqICBudW1iZXIuICBUaGVzZSBzZXF1ZW5jZSBudW1iZXJzIGFyZSBtYXNrZWQgd2l0aCB0aGUgYmxvY2sgYWNrIHdpbmRvdyBzaXplLAorICogIHJvdW5kZWQgdXAgdG8gYSBwb3dlciBvZiB0d28gKG1pbnVzIG9uZSwgdG8gY3JlYXRlIGEgYml0bWFzaykgdG8gb2J0YWluCisgKiAgdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXggaW50byB0aGUgcnggcmVvcmRlciBob2xkaW5nIGFycmF5LgorICogIFRoZSBzZXJpZXMgb2YgTVBEVXMgdG8gZmx1c2ggaW5jbHVkZXMgdGhlIG9uZSBzcGVjaWZpZWQgYnkgdGhlIHN0YXJ0CisgKiAgc2VxdWVuY2UgbnVtYmVyLgorICogIFRoZSBzZXJpZXMgb2YgTVBEVXMgdG8gZmx1c2ggZXhjbHVkZXMgdGhlIG9uZSBzcGVjaWZpZWQgYnkgdGhlIGVuZAorICogIHNlcXVlbmNlIG51bWJlcjsgdGhlIE1QRFVzIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBlbmQgc2VxdWVuY2UgbnVtYmVyCisgKiAgYXJlIHRvIGJlIGZsdXNoZWQuCisgKiAgVGhlc2Ugc3RhcnQgYW5kIGVuZCBzZXEgbnVtIGZpZWxkcyBhcmUgb25seSB2YWxpZCBpZiB0aGUgImZsdXNoIHZhbGlkIgorICogIGZsYWcgaXMgc2V0LgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBwYXJhbSByeF9pbmRfbXNnIC0gdGhlIG5ldGJ1ZiBjb250YWluaW5nIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqIEBwYXJhbSBzZXFfbnVtX3N0YXJ0IC0gKGNhbGwtYnktcmVmZXJlbmNlIG91dHB1dCkgc2VxdWVuY2UgbnVtYmVyCisgKiAgICAgIGZvciB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIE1QRFVzIHRvIGZsdXNoCisgKiBAcGFyYW0gc2VxX251bV9lbmQgLSAoY2FsbC1ieS1yZWZlcmVuY2Ugb3V0cHV0KSBzZXF1ZW5jZSBudW1iZXIKKyAqICAgICAgZm9yIHRoZSBlbmQgb2YgdGhlIHJhbmdlIG9mIE1QRFVzIHRvIGZsdXNoCisgKi8KK3ZvaWQKK2h0dF9yeF9pbmRfZmx1c2hfc2VxX251bV9yYW5nZShodHRfcGRldl9oYW5kbGUgcGRldiwKKwkJCSAgICAgICBjZGZfbmJ1Zl90IHJ4X2luZF9tc2csCisJCQkgICAgICAgdW5zaWduZWQgKnNlcV9udW1fc3RhcnQsIHVuc2lnbmVkICpzZXFfbnVtX2VuZCk7CisKKy8qKgorICogQGJyaWVmIENoZWNrIGlmIGEgcnggaW5kaWNhdGlvbiBtZXNzYWdlIGhhcyBhIHJ4IHJlb3JkZXIgcmVsZWFzZSBjb21tYW5kLgorICogQGRldGFpbHMKKyAqICBTcGFjZSBpcyByZXNlcnZlZCBpbiBlYWNoIHJ4IGluZGljYXRpb24gbWVzc2FnZSBmb3IgYSByeCByZW9yZGVyIHJlbGVhc2UKKyAqICBjb21tYW5kLCB0byByZWxlYXNlIHNwZWNpZmllZCBNUERVcyBmcm9tIHRoZSByeCByZW9yZGVyIGhvbGRpbmcgYXJyYXkKKyAqICBhZnRlciBwcm9jZXNzaW5nIHRoZSBuZXcgTVBEVXMgcmVmZXJlbmNlZCBieSB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlLgorICogIFRoaXMgcnggcmVvcmRlciByZWxlYXNlIGNvbW1hbmQgY29udGFpbnMgYSBmbGFnIHRvIHNob3cgd2hldGhlciB0aGUgY29tbWFuZAorICogIGlzIHZhbGlkIHdpdGhpbiBhIGdpdmVuIHJ4IGluZGljYXRpb24gbWVzc2FnZS4KKyAqICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgdmFsaWRpdHkgZmxhZyBmcm9tIHRoZSByeCBpbmRpY2F0aW9uCisgKiAgcmVsZWFzZSBjb21tYW5kIElFIHdpdGhpbiB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBwYXJhbSByeF9pbmRfbXNnIC0gdGhlIG5ldGJ1ZiBjb250YWluaW5nIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqIEByZXR1cm4KKyAqICAgICAgMSAtIHRoZSBtZXNzYWdlJ3MgcnggcmVsZWFzZSBjb21tYW5kIGlzIHZhbGlkIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkCisgKiAgICAgICAgICBhZnRlciBwcm9jZXNzaW5nIG5ldyByeCBNUERVcywKKyAqICAgICAgLU9SLQorICogICAgICAwIC0gdGhlIG1lc3NhZ2UncyByeCByZWxlYXNlIGNvbW1hbmQgaXMgaW52YWxpZCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQKKyAqLworaW50IGh0dF9yeF9pbmRfcmVsZWFzZShodHRfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCByeF9pbmRfbXNnKTsKKworLyoqCisgKiBAYnJpZWYgUmV0dXJuIHRoZSBzZXF1ZW5jZSBudW1iZXIgc3RhcnRpbmcgdGhlIHJhbmdlIG9mIE1QRFVzIHRvIHJlbGVhc2UuCisgKiBAZGV0YWlscworICogIFJlYWQgdGhlIGZpZWxkcyBvZiB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlIHRoYXQgaWRlbnRpZnkgdGhlIHN0YXJ0CisgKiAgYW5kIGVuZCBvZiB0aGUgcmFuZ2Ugb2YgTVBEVXMgdG8gcmVsZWFzZSBmcm9tIHRoZSByeCByZW9yZGVyIGhvbGRpbmcKKyAqICBhcnJheSBhbmQgc2VuZCBvbiB0byBzdWJzZXF1ZW50IHN0YWdlcyBvZiByeCBwcm9jZXNzaW5nLgorICogIFRoZXNlIHNlcXVlbmNlIG51bWJlcnMgYXJlIHRoZSA2IExTQnMgb2YgdGhlIDEyLWJpdCA4MDIuMTEgc2VxdWVuY2UKKyAqICBudW1iZXIuICBUaGVzZSBzZXF1ZW5jZSBudW1iZXJzIGFyZSBtYXNrZWQgd2l0aCB0aGUgYmxvY2sgYWNrIHdpbmRvdyBzaXplLAorICogIHJvdW5kZWQgdXAgdG8gYSBwb3dlciBvZiB0d28gKG1pbnVzIG9uZSwgdG8gY3JlYXRlIGEgYml0bWFzaykgdG8gb2J0YWluCisgKiAgdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXggaW50byB0aGUgcnggcmVvcmRlciBob2xkaW5nIGFycmF5LgorICogIFRoZSBzZXJpZXMgb2YgTVBEVXMgdG8gcmVsZWFzZSBpbmNsdWRlcyB0aGUgb25lIHNwZWNpZmllZCBieSB0aGUgc3RhcnQKKyAqICBzZXF1ZW5jZSBudW1iZXIuCisgKiAgVGhlIHNlcmllcyBvZiBNUERVcyB0byByZWxlYXNlIGV4Y2x1ZGVzIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBlbmQKKyAqICBzZXF1ZW5jZSBudW1iZXI7IHRoZSBNUERVcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgZW5kIHNlcXVlbmNlIG51bWJlcgorICogIGFyZSB0byBiZSByZWxlYXNlZC4KKyAqICBUaGVzZSBzdGFydCBhbmQgZW5kIHNlcSBudW0gZmllbGRzIGFyZSBvbmx5IHZhbGlkIGlmIHRoZSAicmVsZWFzZSB2YWxpZCIKKyAqICBmbGFnIGlzIHNldC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gcnhfaW5kX21zZyAtIHRoZSBuZXRidWYgY29udGFpbmluZyB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBAcGFyYW0gc2VxX251bV9zdGFydCAtIChjYWxsLWJ5LXJlZmVyZW5jZSBvdXRwdXQpIHNlcXVlbmNlIG51bWJlcgorICogICAgICAgIGZvciB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIE1QRFVzIHRvIHJlbGVhc2UKKyAqIEBwYXJhbSBzZXFfbnVtX2VuZCAtIChjYWxsLWJ5LXJlZmVyZW5jZSBvdXRwdXQpIHNlcXVlbmNlIG51bWJlcgorICogICAgICAgIGZvciB0aGUgZW5kIG9mIHRoZSByYW5nZSBvZiBNUERVcyB0byByZWxlYXNlCisgKi8KK3ZvaWQKK2h0dF9yeF9pbmRfcmVsZWFzZV9zZXFfbnVtX3JhbmdlKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSBjZGZfbmJ1Zl90IHJ4X2luZF9tc2csCisJCQkJIHVuc2lnbmVkICpzZXFfbnVtX3N0YXJ0LAorCQkJCSB1bnNpZ25lZCAqc2VxX251bV9lbmQpOworCisvKgorICogRm9yIG5vdywgdGhlIGhvc3QgSFRUIC0+IGhvc3QgZGF0YSByeCBzdGF0dXMgZW51bQorICogZXhhY3RseSBtYXRjaGVzIHRoZSB0YXJnZXQgSFRUIC0+IGhvc3QgSFRUIHJ4IHN0YXR1cyBlbnVtOworICogbm8gdHJhbnNsYXRpb24gaXMgcmVxdWlyZWQuCisgKiBIb3dldmVyLCB0aGUgaG9zdCBkYXRhIFNXIHNob3VsZCBvbmx5IHVzZSB0aGUgaHR0X3J4X3N0YXR1cywKKyAqIHNvIHRoYXQgaW4gdGhlIGZ1dHVyZSBhIHRyYW5zbGF0aW9uIGZyb20gdGFyZ2V0IEhUVCByeCBzdGF0dXMKKyAqIHRvIGhvc3QgSFRUIHJ4IHN0YXR1cyBjYW4gYmUgYWRkZWQsIGlmIHRoZSBuZWVkIGV2ZXIgYXJpc2VzLgorICovCitlbnVtIGh0dF9yeF9zdGF0dXMgeworCWh0dF9yeF9zdGF0dXNfdW5rbm93biA9IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfVU5LTk9XTiwKKwlodHRfcnhfc3RhdHVzX29rID0gSFRUX1JYX0lORF9NUERVX1NUQVRVU19PSywKKwlodHRfcnhfc3RhdHVzX2Vycl9mY3MgPSBIVFRfUlhfSU5EX01QRFVfU1RBVFVTX0VSUl9GQ1MsCisJaHR0X3J4X3N0YXR1c19lcnJfZHVwID0gSFRUX1JYX0lORF9NUERVX1NUQVRVU19FUlJfRFVQLAorCWh0dF9yeF9zdGF0dXNfZXJyX3JlcGxheSA9IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfRVJSX1JFUExBWSwKKwlodHRfcnhfc3RhdHVzX2Vycl9pbnZfcGVlciA9IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfRVJSX0lOVl9QRUVSLAorCWh0dF9yeF9zdGF0dXNfY3RybF9tZ210X251bGwgPSBIVFRfUlhfSU5EX01QRFVfU1RBVFVTX01HTVRfQ1RSTCwKKwlodHRfcnhfc3RhdHVzX3RraXBfbWljX2VyciA9IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfVEtJUF9NSUNfRVJSLAorCisJaHR0X3J4X3N0YXR1c19lcnJfbWlzYyA9IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfRVJSX01JU0MKK307CisKKy8qKgorICogQGJyaWVmIENoZWNrIHRoZSBzdGF0dXMgTVBEVSByYW5nZSByZWZlcmVuY2VkIGJ5IGEgcnggaW5kaWNhdGlvbiBtZXNzYWdlLgorICogQGRldGFpbHMKKyAqICBDaGVjayB0aGUgc3RhdHVzIG9mIGEgcmFuZ2Ugb2YgTVBEVXMgcmVmZXJlbmNlZCBieSBhIHJ4IGluZGljYXRpb24gbWVzc2FnZS4KKyAqICBUaGlzIHN0YXR1cyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIE1QRFVzIHNob3VsZCBiZSBwcm9jZXNzZWQgb3IgZGlzY2FyZGVkLgorICogIElmIHRoZSBzdGF0dXMgaXMgT0ssIHRoZW4gdGhlIE1QRFVzIHdpdGhpbiB0aGUgcmFuZ2Ugc2hvdWxkIGJlIHByb2Nlc3NlZAorICogIGFzIHVzdWFsLgorICogIE90aGVyd2lzZSAoRkNTIGVycm9yLCBkdXBsaWNhdGUgZXJyb3IsIHJlcGxheSBlcnJvciwgdW5rbm93biBzZW5kZXIgZXJyb3IsCisgKiAgZXRjLikgdGhlIE1QRFVzIHdpdGhpbiB0aGUgcmFuZ2Ugc2hvdWxkIGJlIGRpc2NhcmRlZC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gcnhfaW5kX21zZyAtIHRoZSBuZXRidWYgY29udGFpbmluZyB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBAcGFyYW0gbXBkdV9yYW5nZV9udW0gLSB3aGljaCBNUERVIHJhbmdlIHdpdGhpbiB0aGUgcnggaW5kIG1zZyB0byBjaGVjaywKKyAqICAgICAgICBzdGFydGluZyBmcm9tIDAKKyAqIEBwYXJhbSBzdGF0dXMgLSAoY2FsbC1ieS1yZWZlcmVuY2Ugb3V0cHV0KSBNUERVIHN0YXR1cworICogQHBhcmFtIG1wZHVfY291bnQgLSAoY2FsbC1ieS1yZWZlcmVuY2Ugb3V0cHV0KSBjb3VudCBvZiBNUERVcyBjb21wcmlzaW5nCisgKiAgICAgICAgdGhlIHNwZWNpZmllZCBNUERVIHJhbmdlCisgKi8KK3ZvaWQKK2h0dF9yeF9pbmRfbXBkdV9yYW5nZV9pbmZvKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJICAgY2RmX25idWZfdCByeF9pbmRfbXNnLAorCQkJICAgaW50IG1wZHVfcmFuZ2VfbnVtLAorCQkJICAgZW51bSBodHRfcnhfc3RhdHVzICpzdGF0dXMsIGludCAqbXBkdV9jb3VudCk7CisKKy8qKgorICogQGJyaWVmIFJldHVybiB0aGUgUlNTSSBwcm92aWRlZCBpbiBhIHJ4IGluZGljYXRpb24gbWVzc2FnZS4KKyAqIEBkZXRhaWxzCisgKiAgUmV0dXJuIHRoZSBSU1NJIGZyb20gYW4gcnggaW5kaWNhdGlvbiBtZXNzYWdlLCBjb252ZXJ0ZWQgdG8gZEJtIHVuaXRzLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBwYXJhbSByeF9pbmRfbXNnIC0gdGhlIG5ldGJ1ZiBjb250YWluaW5nIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqIEByZXR1cm4gUlNTSSBpbiBkQm0sIG9yIEhUVF9JTlZBTElEX1JTU0kKKyAqLworaW50MTZfdAoraHR0X3J4X2luZF9yc3NpX2RibShodHRfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCByeF9pbmRfbXNnKTsKKworaW50MTZfdAoraHR0X3J4X2luZF9yc3NpX2RibV9jaGFpbihodHRfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCByeF9pbmRfbXNnLAorCQkJICBpbnQ4X3QgY2hhaW4pOworCit2b2lkCitodHRfcnhfaW5kX2xlZ2FjeV9yYXRlKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IHJ4X2luZF9tc2csCisJCSAgICAgICB1aW50OF90ICpsZWdhY3lfcmF0ZSwgdWludDhfdCAqbGVnYWN5X3JhdGVfc2VsKTsKKworCit2b2lkCitodHRfcnhfaW5kX3RpbWVzdGFtcChodHRfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCByeF9pbmRfbXNnLAorCQkgICAgIHVpbnQzMl90ICp0aW1lc3RhbXBfbWljcm9zZWMsCisJCSAgICAgdWludDhfdCAqdGltZXN0YW1wX3N1Ym1pY3Jvc2VjKTsKKwordWludDMyX3QKK2h0dF9yeF9pbmRfdHNmMzIoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIGNkZl9uYnVmX3QgcnhfaW5kX21zZyk7CisKK3VpbnQ4X3QKK2h0dF9yeF9pbmRfZXh0X3RpZChodHRfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCByeF9pbmRfbXNnKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09IHJ4IE1QRFUgZGVzY3JpcHRvciBhY2Nlc3MgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogQGJyaWVmIENoZWNrIGlmIHRoZSByZXRyeSBiaXQgaXMgc2V0IGluIFJ4LWRlc2NyaXB0b3IKKyAqIEBkZXRhaWxzCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJldHJ5IGJpdCBvZiB0aGUgODAyLjExIGhlYWRlciBmb3IgdGhlCisgKiAgcHJvdmlkZWQgcnggTVBEVSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIGhhbmRsZSBvZiB0aGUgcGh5c2ljYWwgZGV2aWNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIG1zZHVfZGVzYyAtIHRoZSBhYnN0cmFjdCBkZXNjcmlwdG9yIGZvciB0aGUgTVNEVSBpbiBxdWVzdGlvbgorICogQHJldHVybiBib29sZWFuIC0tIHRydWUgaWYgcmV0cnkgaXMgc2V0LCBmYWxzZSBvdGhlcndpc2UKKyAqLworZXh0ZXJuCitib29sICgqaHR0X3J4X21wZHVfZGVzY19yZXRyeSkoCisJCWh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptcGR1X2Rlc2MpOworCisvKioKKyAqIEBicmllZiBSZXR1cm4gYSByeCBNUERVJ3Mgc2VxdWVuY2UgbnVtYmVyLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIExTQnMgb2YgdGhlIDgwMi4xMSBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZQorICogIHByb3ZpZGVkIHJ4IE1QRFUgZGVzY3JpcHRvci4KKyAqICBEZXBlbmRpbmcgb24gdGhlIHN5c3RlbSwgNi0xMiBMU0JzIGZyb20gdGhlIDgwMi4xMSBzZXF1ZW5jZSBudW1iZXIgYXJlCisgKiAgcmV0dXJuZWQuICAoVHlwaWNhbGx5LCBlaXRoZXIgdGhlIDggb3IgMTIgTFNCcyBhcmUgcmV0dXJuZWQuKQorICogIFRoaXMgc2VxdWVuY2UgbnVtYmVyIGlzIG1hc2tlZCB3aXRoIHRoZSBibG9jayBhY2sgd2luZG93IHNpemUsCisgKiAgcm91bmRlZCB1cCB0byBhIHBvd2VyIG9mIHR3byAobWludXMgb25lLCB0byBjcmVhdGUgYSBiaXRtYXNrKSB0byBvYnRhaW4KKyAqICB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBpbnRvIHRoZSByeCByZW9yZGVyIGhvbGRpbmcgYXJyYXkuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgSFRUIGluc3RhbmNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIG1wZHVfZGVzYyAtIHRoZSBhYnN0cmFjdCBkZXNjcmlwdG9yIGZvciB0aGUgTVBEVSBpbiBxdWVzdGlvbgorICogQHJldHVybiB0aGUgTFNCcyBvZiB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgTVBEVQorICovCitleHRlcm4gdWludDE2X3QKKygqaHR0X3J4X21wZHVfZGVzY19zZXFfbnVtKShodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXBkdV9kZXNjKTsKKworLyoqCisgKiBAYnJpZWYgUmV0dXJuIGEgcnggTVBEVSdzIHJ4IHJlb3JkZXIgYXJyYXkgaW5kZXgsIGJhc2VkIG9uIHNlcXVlbmNlIG51bWJlci4KKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc2VxdWVuY2UtbnVtYmVyIGJhc2VkIGluZGV4IGludG8gdGhlIHJ4CisgKiAgcmVvcmRlciBhcnJheSBmb3IgdGhlIHNwZWNpZmllZCBNUERVLgorICogIEluIHNvbWUgc3lzdGVtcywgdGhpcyByeCByZW9yZGVyIGFycmF5IGlzIHNpbXBseSB0aGUgTFNCcyBvZiB0aGUKKyAqICBzZXF1ZW5jZSBudW1iZXIsIG9yIHBvc3NpYmx5IGV2ZW4gdGhlIGZ1bGwgc2VxdWVuY2UgbnVtYmVyLgorICogIFRvIHN1cHBvcnQgc3VjaCBzeXN0ZW1zLCB0aGUgcmV0dXJuZWQgaW5kZXggaGFzIHRvIGJlIG1hc2tlZCB3aXRoCisgKiAgdGhlIHBvd2VyLW9mLXR3byBhcnJheSBzaXplIGJlZm9yZSB1c2luZyB0aGUgdmFsdWUgdG8gaW5kZXggdGhlCisgKiAgcnggcmVvcmRlciBhcnJheS4KKyAqICBJbiBvdGhlciBzeXN0ZW1zLCB0aGlzIHJ4IHJlb3JkZXIgYXJyYXkgaW5kZXggaXMKKyAqICAgICAgKHNlcXVlbmNlIG51bWJlcikgJSAoYmxvY2sgYWNrIHdpbmRvdyBzaXplKQorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBwYXJhbSBtcGR1X2Rlc2MgLSB0aGUgYWJzdHJhY3QgZGVzY3JpcHRvciBmb3IgdGhlIE1QRFUgaW4gcXVlc3Rpb24KKyAqIEByZXR1cm4gdGhlIHJ4IHJlb3JkZXIgYXJyYXkgaW5kZXggdGhlIE1QRFUgZ29lcyBpbnRvCisgKi8KKy8qIHVzZSBzZXF1ZW5jZSBudW1iZXIgKG9yIExTQnMgdGhlcmVvZikgYXMgcnggcmVvcmRlciBhcnJheSBpbmRleCAqLworI2RlZmluZSBodHRfcnhfbXBkdV9kZXNjX3Jlb3JkZXJfaWR4IGh0dF9yeF9tcGR1X2Rlc2Nfc2VxX251bQorCit1bmlvbiBodHRfcnhfcG5fdCB7CisJLyogV0VQOiAyNC1iaXQgUE4gKi8KKwl1aW50MzJfdCBwbjI0OworCisJLyogVEtJUCBvciBDQ01QOiA0OC1iaXQgUE4gKi8KKwl1aW50NjRfdCBwbjQ4OworCisJLyogV0FQSTogMTI4LWJpdCBQTiAqLworCXVpbnQ2NF90IHBuMTI4WzJdOworfTsKKworLyoqCisgKiBAYnJpZWYgRmluZCB0aGUgcGFja2V0IG51bWJlciAoUE4pIGZvciBhIE1QRFUuCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gb25seSBhcHBsaWVzIHdoZW4gdGhlIHJ4IFBOIGNoZWNrIGlzIGNvbmZpZ3VyZWQgdG8gYmUKKyAqICBwZXJmb3JtZWQgaW4gdGhlIGhvc3QgcmF0aGVyIHRoYW4gdGhlIHRhcmdldCwgYW5kIG9uIHBlZXJzIHVzaW5nIGEKKyAqICBzZWN1cml0eSB0eXBlIGZvciB3aGljaCBhIFBOIGNoZWNrIGFwcGxpZXMuCisgKiAgVGhlIHBuX2xlbl9iaXRzIGFyZ3VtZW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGVsZW1lbnQgb2YgdGhlCisgKiAgaHR0X3J4X3BuX3QgdW5pb24gdG8gZGVwb3NpdCB0aGUgUE4gdmFsdWUgcmVhZCBmcm9tIHRoZSBNUERVIGRlc2NyaXB0b3IKKyAqICBpbnRvLgorICogIEEgMjQtYml0IFBOIGlzIGRlcG9zaXRlZCBpbnRvIHBuLT5wbjI0LgorICogIEEgNDgtYml0IFBOIGlzIGRlcG9zaXRlZCBpbnRvIHBuLT5wbjQ4LgorICogIEEgMTI4LWJpdCBQTiBpcyBkZXBvc2l0ZWQgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciBpbnRvIHBuLT5wbjEyOC4KKyAqICBTcGVjaWZpY2FsbHksIGJpdHMgNjM6MCBvZiB0aGUgUE4gYXJlIGNvcGllZCBpbnRvIHBuLT5wbjEyOFswXSwgd2hpbGUKKyAqICBiaXRzIDEyNzo2NCBvZiB0aGUgUE4gYXJlIGNvcGllZCBpbnRvIHBuLT5wbjEyOFsxXS4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gbXBkdV9kZXNjIC0gdGhlIGFic3RyYWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBNUERVIGluIHF1ZXN0aW9uCisgKiBAcGFyYW0gcG4gLSB0aGUgbG9jYXRpb24gdG8gY29weSB0aGUgcGFja2V0IG51bWJlciBpbnRvCisgKiBAcGFyYW0gcG5fbGVuX2JpdHMgLSB0aGUgUE4gc2l6ZSwgaW4gYml0cworICovCitleHRlcm4gdm9pZCAoKmh0dF9yeF9tcGR1X2Rlc2NfcG4pKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSAgIHZvaWQgKm1wZHVfZGVzYywKKwkJCQkgICB1bmlvbiBodHRfcnhfcG5fdCAqcG4sIGludCBwbl9sZW5fYml0cyk7CisKKy8qKgorICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gUmV0dXJucyB0aGUgVElEIHZhbHVlIGZyb20gdGhlIFJ4IGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgTG93IExhdGVuY3kgZHJpdmVyCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgVElEIHNldCBpbiB0aGUgODAyLjExIFFvUyBDb250cm9sIGZvciB0aGUgTVBEVQorICogIGluIHRoZSBwYWNrZXQgaGVhZGVyLCBieSBsb29raW5nIGF0IHRoZSBtcGR1X3N0YXJ0IG9mIHRoZSBSeCBkZXNjcmlwdG9yLgorICogIFJ4IGRlc2NyaXB0b3IgZ2V0cyBhIGNvcHkgb2YgdGhlIFRJRCBmcm9tIHRoZSBNQUMuCisgKiBAcGRldjogIEhhbmRsZSAocG9pbnRlcikgdG8gSFRUIHBkZXYuCisgKiBAcGFyYW0gbXBkdV9kZXNjIC0gdGhlIGFic3RyYWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBNUERVIGluIHF1ZXN0aW9uCisgKiBAcmV0dXJuOiAgICAgICAgQWN0dWFsIFRJRCBzZXQgaW4gdGhlIHBhY2tldCBoZWFkZXIuCisgKi8KK2V4dGVybgordWludDhfdCAoKmh0dF9yeF9tcGR1X2Rlc2NfdGlkKSgKKwkJCWh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptcGR1X2Rlc2MpOworCisvKioKKyAqIEBicmllZiBSZXR1cm4gdGhlIFRTRiB0aW1lc3RhbXAgaW5kaWNhdGluZyB3aGVuIGEgTVBEVSB3YXMgcmVjZWl2ZWQuCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIHRpbWVzdGFtcCBpbmRpY2F0aW5nIHdoZW4gdGhlIFBQRFUgdGhhdAorICogIHRoZSBzcGVjaWZpZWQgTVBEVSBiZWxvbmdzIHRvIHdhcyByZWNlaXZlZC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gbXBkdV9kZXNjIC0gdGhlIGFic3RyYWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBNUERVIGluIHF1ZXN0aW9uCisgKiBAcmV0dXJuIDMyIExTQnMgb2YgVFNGIHRpbWUgYXQgd2hpY2ggdGhlIE1QRFUncyBQUERVIHdhcyByZWNlaXZlZAorICovCit1aW50MzJfdCBodHRfcnhfbXBkdV9kZXNjX3RzZjMyKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptcGR1X2Rlc2MpOworCisvKioKKyAqIEBicmllZiBSZXR1cm4gdGhlIDgwMi4xMSBoZWFkZXIgb2YgdGhlIE1QRFUKKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSA4MDIuMTEgaGVhZGVyCisgKiAgb2YgdGhlIFJ4IE1QRFUKKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gbXBkdV9kZXNjIC0gdGhlIGFic3RyYWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBNUERVIGluIHF1ZXN0aW9uCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gODAyLjExIGhlYWRlciBvZiB0aGUgcmVjZWl2ZWQgTVBEVQorICovCitjaGFyICpodHRfcnhfbXBkdV93aWZpX2hkcl9yZXRyaWV2ZShodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXBkdV9kZXNjKTsKKworLyoqCisgKiBAYnJpZWYgUmV0dXJuIHRoZSBSU1NJIHByb3ZpZGVkIGluIGEgcnggZGVzY3JpcHRvci4KKyAqIEBkZXRhaWxzCisgKiAgUmV0dXJuIHRoZSBSU1NJIGZyb20gYSByeCBkZXNjcmlwdG9yLCBjb252ZXJ0ZWQgdG8gZEJtIHVuaXRzLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBwYXJhbSBtcGR1X2Rlc2MgLSB0aGUgYWJzdHJhY3QgZGVzY3JpcHRvciBmb3IgdGhlIE1QRFUgaW4gcXVlc3Rpb24KKyAqIEByZXR1cm4gUlNTSSBpbiBkQm0sIG9yIEhUVF9JTlZBTElEX1JTU0kKKyAqLworaW50MTZfdCBodHRfcnhfbXBkdV9kZXNjX3Jzc2lfZGJtKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCB2b2lkICptcGR1X2Rlc2MpOworCisvKj09PT09PT09PT09PT09PT09PT09IHJ4IE1TRFUgZGVzY3JpcHRvciBhY2Nlc3MgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogQGJyaWVmIENoZWNrIGlmIGEgTVNEVSBjb21wbGV0ZXMgYSBNUERVLgorICogQGRldGFpbHMKKyAqICBXaGVuIEEtTVNEVSBhZ2dyZWdhdGlvbiBpcyB1c2VkLCBhIHNpbmdsZSBNUERVIHdpbGwgY29uc2lzdCBvZgorICogIG11bHRpcGxlIE1TRFVzLiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgYSBNU0RVJ3MgcnggZGVzY3JpcHRvciB0bworICogIHNlZSB3aGV0aGVyIHRoZSBNU0RVIGlzIHRoZSBmaW5hbCBNU0RVIHdpdGhpbiBhIE1QRFUuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgaGFuZGxlIG9mIHRoZSBwaHlzaWNhbCBkZXZpY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gbXNkdV9kZXNjIC0gdGhlIGFic3RyYWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBNU0RVIGluIHF1ZXN0aW9uCisgKiBAcmV0dXJuCisgKiAgICAgIDAgLSB0aGVyZSBhcmUgc3Vic2VxdWVudCBNU0RVcyB3aXRoaW4gdGhlIEEtTVNEVSAvIE1QRFUKKyAqICAgICAgLU9SLQorICogICAgICAxIC0gdGhpcyBpcyB0aGUgbGFzdCBNU0RVIHdpdGhpbiBpdHMgTVBEVQorICovCitleHRlcm4gYm9vbCAoKmh0dF9yeF9tc2R1X2Rlc2NfY29tcGxldGVzX21wZHUpKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCQkgICAgICAgdm9pZCAqbXNkdV9kZXNjKTsKKworLyoqCisgKiBAYnJpZWYgQ2hlY2sgaWYgYSBNU0RVIGlzIGZpcnN0IG1zZHUgb2YgTVBEVS4KKyAqIEBkZXRhaWxzCisgKiAgV2hlbiBBLU1TRFUgYWdncmVnYXRpb24gaXMgdXNlZCwgYSBzaW5nbGUgTVBEVSB3aWxsIGNvbnNpc3Qgb2YKKyAqICBtdWx0aXBsZSBNU0RVcy4gIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGEgTVNEVSdzIHJ4IGRlc2NyaXB0b3IgdG8KKyAqICBzZWUgd2hldGhlciB0aGUgTVNEVSBpcyB0aGUgZmlyc3QgTVNEVSB3aXRoaW4gYSBNUERVLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIGhhbmRsZSBvZiB0aGUgcGh5c2ljYWwgZGV2aWNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIG1zZHVfZGVzYyAtIHRoZSBhYnN0cmFjdCBkZXNjcmlwdG9yIGZvciB0aGUgTVNEVSBpbiBxdWVzdGlvbgorICogQHJldHVybgorICogICAgICAwIC0gdGhpcyBpcyBpbnRlcmlvciBNU0RVIGluIHRoZSBBLU1TRFUgLyBNUERVCisgKiAgICAgIC1PUi0KKyAqICAgICAgMSAtIHRoaXMgaXMgdGhlIGZpcnN0IE1TRFUgd2l0aGluIGl0cyBNUERVCisgKi8KK2V4dGVybiBib29sICgqaHR0X3J4X21zZHVfZmlyc3RfbXNkdV9mbGFnKShodHRfcGRldl9oYW5kbGUgcGRldiwKKwkJCQkJICAgdm9pZCAqbXNkdV9kZXNjKTsKKworLyoqCisgKiBAYnJpZWYgUmV0cmlldmUgZW5jcnlwdCBiaXQgZnJvbSBhIG1wZHUgZGVzYy4KKyAqIEBkZXRhaWxzCisgKiAgRncgd2lsbCBwYXNzIGFsbCB0aGUgZnJhbWUgIHRvIHRoZSBob3N0IHdoZXRoZXIgZW5jcnlwdGVkIG9yIG5vdCwgYW5kIHdpbGwKKyAqICBpbmRpY2F0ZSB0aGUgZW5jcnlwdCBmbGFnIGluIHRoZSBkZXNjLCB0aGlzIGZ1bmN0aW9uIGlzIHRvIGdldCB0aGUgaW5mbworICogIGFuZCB1c2VkIHRvIG1ha2UgYSBqdWRnZSB3aGV0aGVyIHNob3VsZCBtYWtlIHBuIGNoZWNrLCBiZWNhdXNlCisgKiAgbm9uLWVuY3J5cHRlZCBmcmFtZXMgYWx3YXlzIGdldCB0aGUgc2FtZSBwbiBudW1iZXIgMC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gbXBkdV9kZXNjIC0gdGhlIGFic3RyYWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBNUERVIGluIHF1ZXN0aW9uCisgKiBAcmV0dXJuIDAgLSB0aGUgZnJhbWUgd2FzIG5vdCBlbmNyeXB0ZWQKKyAqICAgICAgICAgMSAtIHRoZSBmcmFtZSB3YXMgZW5jcnlwdGVkCisgKi8KK2V4dGVybiBib29sICgqaHR0X3J4X21wZHVfaXNfZW5jcnlwdGVkKShodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXBkdV9kZXNjKTsKKworLyoqCisgKiBAYnJpZWYgSW5kaWNhdGUgd2hldGhlciBhIHJ4IGRlc2MgaGFzIGEgV0xBTiB1bmljYXN0IHZzLiBtY2FzdC9iY2FzdCBmbGFnLgorICogQGRldGFpbHMKKyAqICBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGEgTVBEVSB3YXMgZGVsaXZlcmVkIG92ZXIgV0xBTiBhcyB1bmljYXN0IG9yCisgKiAgbXVsdGljYXN0L2Jyb2FkY2FzdCBtYXkgYmUgb25seSB2YWxpZCBvbmNlIHBlciBNUERVIChMTCksIG9yIHdpdGhpbiBlYWNoCisgKiAgcnggZGVzY3JpcHRvciBmb3IgdGhlIE1TRFVzIHdpdGhpbiB0aGUgTVBEVSAoSEwpLiAgKEluIHByYWN0aWNlLCBpdCBpcworICogIHVubGlrZWx5IHRoYXQgQS1NU0RVIGFnZ3JlZ2F0aW9uIHdpbGwgYmUgdXNlZCBpbiBITCwgc28gdHlwaWNhbGx5IEhMIHdpbGwKKyAqICBvbmx5IGhhdmUgb25lIE1TRFUgcGVyIE1QRFUgYW55d2F5LikKKyAqICBUaGlzIGZ1bmN0aW9uIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcnggZGVzY3JpcHRvciBjb250YWlucworICogIGEgV0xBTiB1Y2FzdCB2cy4gbWNhc3QvYmNhc3QgZmxhZy4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gbXNkdV9kZXNjIC0gdGhlIGFic3RyYWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBNU0RVIGluIHF1ZXN0aW9uCisgKiBAcmV0dXJuCisgKiAgICAgIDAgLSBUaGUgcnggZGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIGEgV0xBTiB1Y2FzdCB2cy4gbWNhc3QgZmxhZy4KKyAqICAgICAgLU9SLQorICogICAgICAxIC0gVGhlIHJ4IGRlc2NyaXB0b3IgaGFzIGEgdmFsaWQgV0xBTiB1Y2FzdCB2cy4gbWNhc3QgZmxhZy4KKyAqLworZXh0ZXJuIGludCAoKmh0dF9yeF9tc2R1X2hhc193bGFuX21jYXN0X2ZsYWcpKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCQkgICAgICB2b2lkICptc2R1X2Rlc2MpOworCisvKioKKyAqIEBicmllZiBJbmRpY2F0ZSB3aGV0aGVyIGEgTVNEVSB3YXMgcmVjZWl2ZWQgYXMgdW5pY2FzdCBvciBtY2FzdC9iY2FzdAorICogQGRldGFpbHMKKyAqICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBNUERVIHRoYXQgdGhlIHNwZWNpZmllZCBNU0RVIGJlbG9uZ2VkIHRvIHdhcworICogIGRlbGl2ZXJlZCBvdmVyIHRoZSBXTEFOIGFzIHVuaWNhc3QsIG9yIGFzIG11bHRpY2FzdC9icm9hZGNhc3QuCisgKiAgVGhpcyBxdWVyeSBjYW4gb25seSBiZSBwZXJmb3JtZWQgb24gcnggZGVzY3JpcHRvcnMgZm9yIHdoaWNoCisgKiAgaHR0X3J4X21zZHVfaGFzX3dsYW5fbWNhc3RfZmxhZyBpcyB0cnVlLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBwYXJhbSBtc2R1X2Rlc2MgLSB0aGUgYWJzdHJhY3QgZGVzY3JpcHRvciBmb3IgdGhlIE1TRFUgaW4gcXVlc3Rpb24KKyAqIEByZXR1cm4KKyAqICAgICAgMCAtIFRoZSBNU0RVIHdhcyBkZWxpdmVyZWQgb3ZlciB0aGUgV0xBTiBhcyB1bmljYXN0LgorICogICAgICAtT1ItCisgKiAgICAgIDEgLSBUaGUgTVNEVSB3YXMgZGVsaXZlcmVkIG92ZXIgdGhlIFdMQU4gYXMgYnJvYWRjYXN0IG9yIG11bHRpY2FzdC4KKyAqLworZXh0ZXJuIGJvb2wgKCpodHRfcnhfbXNkdV9pc193bGFuX21jYXN0KShodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXNkdV9kZXNjKTsKKworLyoqCisgKiBAYnJpZWYgSW5kaWNhdGUgd2hldGhlciBhIE1TRFUgd2FzIHJlY2VpdmVkIGFzIGEgZnJhZ21lbnRlZCBmcmFtZQorICogQGRldGFpbHMKKyAqICBUaGlzIHF1ZXJ5IGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBvbiBMTCBzeXN0ZW0uCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgSFRUIGluc3RhbmNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIG1zZHVfZGVzYyAtIHRoZSBhYnN0cmFjdCBkZXNjcmlwdG9yIGZvciB0aGUgTVNEVSBpbiBxdWVzdGlvbgorICogQHJldHVybgorICogICAgICAwIC0gVGhlIE1TRFUgd2FzIGEgbm9uLWZyYWdtZW50ZWQgZnJhbWUuCisgKiAgICAgIC1PUi0KKyAqICAgICAgMSAtIFRoZSBNU0RVIHdhcyBmcmFnbWVudGVkIGZyYW1lLgorICovCitleHRlcm4gaW50ICgqaHR0X3J4X21zZHVfaXNfZnJhZykoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1zZHVfZGVzYyk7CisKKy8qKgorICogQGJyaWVmIEluZGljYXRlIGlmIGEgTVNEVSBzaG91bGQgYmUgZGVsaXZlcmVkIHRvIHRoZSBPUyBzaGltIG9yIGRpc2NhcmRlZC4KKyAqIEBkZXRhaWxzCisgKiAgSW5kaWNhdGUgd2hldGhlciBhIE1TRFUgc2hvdWxkIGJlIGRpc2NhcmRlZCBvciBkZWxpdmVyZWQgdG8gdGhlIE9TIHNoaW0uCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgSFRUIGluc3RhbmNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIG1zZHVfZGVzYyAtIHRoZSBhYnN0cmFjdCBkZXNjcmlwdG9yIGZvciB0aGUgTVNEVSBpbiBxdWVzdGlvbgorICogQHJldHVybgorICogICAgICAwIC0gVGhlIE1TRFUgc2hvdWxkIGJlIGRlbGl2ZXJlZCB0byB0aGUgT1MKKyAqICAgICAgLU9SLQorICogICAgICBub24temVybyAtIFRoZSBNU0RVIHNob3VsZCBub3QgYmUgZGVsaXZlcmVkIHRvIHRoZSBPUy4KKyAqICAgICAgICAgIElmIHRoZSAiZm9yd2FyZCIgZmxhZyBpcyBzZXQsIGl0IHNob3VsZCBiZSBmb3J3YXJkZWQgdG8gdHguCisgKiAgICAgICAgICBFbHNlLCBpdCBzaG91bGQgYmUgZGlzY2FyZGVkLgorICovCitpbnQgaHR0X3J4X21zZHVfZGlzY2FyZChodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXNkdV9kZXNjKTsKKworLyoqCisgKiBAYnJpZWYgSW5kaWNhdGUgd2hldGhlciBhIE1TRFUgc2hvdWxkIGJlIGZvcndhcmRlZCB0byB0eC4KKyAqIEBkZXRhaWxzCisgKiAgSW5kaWNhdGUgd2hldGhlciBhIE1TRFUgc2hvdWxkIGJlIGZvcndhcmRlZCB0byB0eCwgZS5nLiBmb3IgaW50cmEtQlNTCisgKiAgU1RBLXRvLVNUQSBmb3J3YXJkaW5nIGluIGFuIEFQLCBvciBmb3IgbXVsdGljYXN0IGVjaG8gaW4gYW4gQVAuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgSFRUIGluc3RhbmNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIG1zZHVfZGVzYyAtIHRoZSBhYnN0cmFjdCBkZXNjcmlwdG9yIGZvciB0aGUgTVNEVSBpbiBxdWVzdGlvbgorICogQHJldHVybgorICogICAgICAwIC0gVGhlIE1TRFUgc2hvdWxkIG5vdCBiZSBmb3J3YXJkZWQKKyAqICAgICAgLU9SLQorICogICAgICBub24temVybyAtIFRoZSBNU0RVIHNob3VsZCBiZSBmb3J3YXJkZWQuCisgKiAgICAgICAgICBJZiB0aGUgImRpc2NhcmQiIGZsYWcgaXMgc2V0LCB0aGVuIHRoZSBvcmlnaW5hbCBNU0RVIGNhbiBiZQorICogICAgICAgICAgZGlyZWN0bHkgZm9yd2FyZGVkIGludG8gdGhlIHR4IHBhdGguCisgKiAgICAgICAgICBFbHNlLCBhIGNvcHkgKGNsb25lPykgb2YgdGhlIHJ4IE1TRFUgbmVlZHMgdG8gYmUgY3JlYXRlZCB0bworICogICAgICAgICAgc2VuZCB0byB0aGUgdHggcGF0aC4KKyAqLworaW50IGh0dF9yeF9tc2R1X2ZvcndhcmQoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKm1zZHVfZGVzYyk7CisKKy8qKgorICogQGJyaWVmIEluZGljYXRlIHdoZXRoZXIgYSBNU0RVJ3MgY29udGVudHMgbmVlZCB0byBiZSBpbnNwZWN0ZWQuCisgKiBAZGV0YWlscworICogIEluZGljYXRlIHdoZXRoZXIgdGhlIGhvc3QgZGF0YSBTVyBuZWVkcyB0byBleGFtaW5lIHRoZSBjb250ZW50cyBvZiB0aGUKKyAqICByZWNlaXZlZCBNU0RVLCBhbmQgYmFzZWQgb24gdGhlIHBhY2tldCB0eXBlIGluZmVyIHdoYXQgc3BlY2lhbCBoYW5kbGluZworICogIHRvIHByb3ZpZGUgZm9yIHRoZSBNU0RVLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBwYXJhbSBtc2R1X2Rlc2MgLSB0aGUgYWJzdHJhY3QgZGVzY3JpcHRvciBmb3IgdGhlIE1TRFUgaW4gcXVlc3Rpb24KKyAqIEByZXR1cm4KKyAqICAgICAgMCAtIE5vIGluc3BlY3Rpb24gKyBzcGVjaWFsIGhhbmRsaW5nIGlzIHJlcXVpcmVkLgorICogICAgICAtT1ItCisgKiAgICAgIG5vbi16ZXJvIC0gSW5zcGVjdCB0aGUgTVNEVSBjb250ZW50cyB0byBpbmZlciB3aGF0IHNwZWNpYWwgaGFuZGxpbmcKKyAqICAgICAgICAgIHRvIGFwcGx5IHRvIHRoZSBNU0RVLgorICovCitpbnQgaHR0X3J4X21zZHVfaW5zcGVjdChodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXNkdV9kZXNjKTsKKworLyoqCisgKiBAYnJpZWYgUHJvdmlkZSBhbGwgYWN0aW9uIHNwZWNpZmljYXRpb25zIGZvciBhIHJ4IE1TRFUKKyAqIEBkZXRhaWxzCisgKiAgUHJvdmlkZSBhbGwgYWN0aW9uIHNwZWNpZmljYXRpb25zIHRvZ2V0aGVyLiAgVGhpcyBwcm92aWRlcyB0aGUgc2FtZQorICogIGluZm9ybWF0aW9uIGluIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgYXMgd291bGQgYmUgcHJvdmlkZWQgYnkgY2FsbGluZworICogIHRoZSBmdW5jdGlvbnMgaHR0X3J4X21zZHVfZGlzY2FyZCwgaHR0X3J4X21zZHVfZm9yd2FyZCwgYW5kCisgKiAgaHR0X3J4X21zZHVfaW5zcGVjdC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gbXNkdV9kZXNjIC0gdGhlIGFic3RyYWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBNU0RVIGluIHF1ZXN0aW9uCisgKiBAcGFyYW1bb3V0XSBkaXNjYXJkIC0gMTogZGlzY2FyZCB0aGUgTVNEVSwgMDogZGVsaXZlciB0aGUgTVNEVSB0byB0aGUgT1MKKyAqIEBwYXJhbVtvdXRdIGZvcndhcmQgLSAxOiBmb3J3YXJkIHRoZSByeCBNU0RVIHRvIHR4LCAwOiBubyByeC0+dHggZm9yd2FyZAorICogQHBhcmFtW291dF0gaW5zcGVjdCAtIDE6IHByb2Nlc3MgYWNjb3JkaW5nIHRvIE1TRFUgY29udGVudHMsIDA6IG5vIGluc3BlY3QKKyAqLwordm9pZAoraHR0X3J4X21zZHVfYWN0aW9ucyhodHRfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgIHZvaWQgKm1zZHVfZGVzYywgaW50ICpkaXNjYXJkLCBpbnQgKmZvcndhcmQsIGludCAqaW5zcGVjdCk7CisKKy8qKgorICogQGJyaWVmIEdldCB0aGUga2V5IGlkIHNlbnQgaW4gSVYgb2YgdGhlIGZyYW1lCisgKiBAZGV0YWlscworICogIFByb3ZpZGUgdGhlIGtleSBpbmRleCBvY3RldCB3aGljaCBpcyB0YWtlbiBmcm9tIElWLgorICogIFRoaXMgaXMgdmFsaWQgb25seSBmb3IgdGhlIGZpcnN0IE1TRFUuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgSFRUIGluc3RhbmNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIG1zZHVfZGVzYyAtIHRoZSBhYnN0cmFjdCBkZXNjcmlwdG9yIGZvciB0aGUgTVNEVSBpbiBxdWVzdGlvbgorICogQGtleV9pZCAtIEtleSBpZCBvY3RldAorICogQHJldHVybiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIga2V5IGlkIGFjY2VzcyBpcyBzdWNjZXNzZnVsCisgKiAgIHRydWUgLSBTdWNjZXNzCisgKiAgIGZhbHNlIC0gaWYgdGhpcyBpcyBub3QgZmlyc3QgbXNkdQorICovCitleHRlcm4gYm9vbAorKCpodHRfcnhfbXNkdV9kZXNjX2tleV9pZCkoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkgICB2b2lkICptcGR1X2Rlc2MsIHVpbnQ4X3QgKmtleV9pZCk7CisKK2V4dGVybiBib29sCisoKmh0dF9yeF9tc2R1X2NoYW5faW5mb19wcmVzZW50KSgKKwlodHRfcGRldl9oYW5kbGUgcGRldiwKKwl2b2lkICptcGR1X2Rlc2MpOworCitleHRlcm4gYm9vbAorKCpodHRfcnhfbXNkdV9jZW50ZXJfZnJlcSkoCisJaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCXZvaWQgKm1wZHVfZGVzYywKKwl1aW50MTZfdCAqcHJpbWFyeV9jaGFuX2NlbnRlcl9mcmVxX21oeiwKKwl1aW50MTZfdCAqY29udGlnX2NoYW4xX2NlbnRlcl9mcmVxX21oeiwKKwl1aW50MTZfdCAqY29udGlnX2NoYW4yX2NlbnRlcl9mcmVxX21oeiwKKwl1aW50OF90ICpwaHlfbW9kZSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PSByeCBNU0RVICsgZGVzY3JpcHRvciBkZWxpdmVyeSA9PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJuIGEgbGlua2VkLWxpc3Qgb2YgbmV0d29yayBidWZmZXIgaG9sZGluZyB0aGUgbmV4dCByeCBBLU1TRFUuCisgKiBAZGV0YWlscworICogIEluIHNvbWUgc3lzdGVtcywgdGhlIHJ4IE1TRFVzIGFyZSB1cGxvYWRlZCBhbG9uZyB3aXRoIHRoZSByeAorICogIGluZGljYXRpb24gbWVzc2FnZSwgd2hpbGUgaW4gb3RoZXIgc3lzdGVtcyB0aGUgcnggTVNEVXMgYXJlIHVwbG9hZGVkCisgKiAgb3V0IG9mIGJhbmQsIHZpYSBNQUMgRE1BLgorICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYW4gYWJzdHJhY3Qgd2F5IHRvIG9idGFpbiBhIGxpbmtlZC1saXN0IG9mIHRoZQorICogIG5leHQgTVNEVXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgTVNEVSB3YXMgZGVsaXZlcmVkIGluLWJhbmQgd2l0aAorICogIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UsIG9yIG91dCBvZiBiYW5kIHRocm91Z2ggTUFDIERNQS4KKyAqICBJbiBhIExMIHN5c3RlbSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbGlua2VkIGxpc3Qgb2YgdGhlIG9uZSBvciBtb3JlCisgKiAgTVNEVXMgdGhhdCB0b2dldGhlciBjb21wcmlzZSBhbiBBLU1TRFUuCisgKiAgSW4gYSBITCBzeXN0ZW0sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGRlZ2VuZXJhdGUgbGlua2VkIGxpc3QgY29uc2lzdGluZworICogIG9mIGEgc2luZ2xlIE1TRFUgKGhlYWRfbXNkdSA9PSB0YWlsX21zZHUpLgorICogIFRoaXMgZnVuY3Rpb24gYWxzbyBtYWtlcyBzdXJlIGVhY2ggTVNEVSdzIHJ4IGRlc2NyaXB0b3IgY2FuIGJlIGZvdW5kCisgKiAgdGhyb3VnaCB0aGUgTVNEVSdzIG5ldHdvcmsgYnVmZmVyLgorICogIEluIG1vc3Qgc3lzdGVtcywgdGhpcyBpcyB0cml2aWFsIC0gYSBzaW5nbGUgbmV0d29yayBidWZmZXIgc3RvcmVzIGJvdGgKKyAqICB0aGUgTVNEVSByeCBkZXNjcmlwdG9yIGFuZCB0aGUgTVNEVSBwYXlsb2FkLgorICogIEluIHN5c3RlbXMgd2hlcmUgdGhlIHJ4IGRlc2NyaXB0b3IgaXMgaW4gYSBzZXBhcmF0ZSBidWZmZXIgZnJvbSB0aGUKKyAqICBuZXR3b3JrIGJ1ZmZlciBob2xkaW5nIHRoZSBNU0RVIHBheWxvYWQsIGEgcG9pbnRlciB0byB0aGUgcnggZGVzY3JpcHRvcgorICogIGhhcyB0byBiZSBzdG9yZWQgaW4gdGhlIG5ldHdvcmsgYnVmZmVyLgorICogIEFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbCwgdGhlIGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gTVNEVSBjYW4gYmUKKyAqICBvYnRhaW5lZCB2aWEgdGhlIGh0dF9yeF9tc2R1X2Rlc2NfcmV0cmlldmUgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgSFRUIGluc3RhbmNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIHJ4X2luZF9tc2cgLSB0aGUgbmV0YnVmIGNvbnRhaW5pbmcgdGhlIHJ4IGluZGljYXRpb24gbWVzc2FnZQorICogQHBhcmFtIGhlYWRfbXNkdSAtIGNhbGwtYnktcmVmZXJlbmNlIG5ldHdvcmsgYnVmZmVyIGhhbmRsZSwgd2hpY2ggZ2V0cyBzZXQKKyAqICAgICAgaW4gdGhpcyBmdW5jdGlvbiB0byBwb2ludCB0byB0aGUgaGVhZCBNU0RVIG9mIHRoZSBBLU1TRFUKKyAqIEBwYXJhbSB0YWlsX21zZHUgLSBjYWxsLWJ5LXJlZmVyZW5jZSBuZXR3b3JrIGJ1ZmZlciBoYW5kbGUsIHdoaWNoIGdldHMgc2V0CisgKiAgICAgIGluIHRoaXMgZnVuY3Rpb24gdG8gcG9pbnQgdG8gdGhlIHRhaWwgTVNEVSBvZiB0aGUgQS1NU0RVLCBvciB0aGUKKyAqICAgICAgc2FtZSBNU0RVIHRoYXQgdGhlIGhlYWRfbXNkdSBwb2ludHMgdG8gaWYgb25seSBhIHNpbmdsZSBNU0RVIGlzCisgKiAgICAgIGRlbGl2ZXJlZCBhdCBhIHRpbWUuCisgKiBAcmV0dXJuIGluZGljYXRpb24gb2Ygd2hldGhlciBhbnkgTVNEVXMgaW4gdGhlIEFNU0RVIHVzZSBjaGFpbmluZzoKKyAqIDAgLSBubyBidWZmZXIgY2hhaW5pbmcKKyAqIDEgLSBidWZmZXJzIGFyZSBjaGFpbmVkCisgKi8KK2V4dGVybiBpbnQKKygqaHR0X3J4X2Ftc2R1X3BvcCkoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgICBjZGZfbmJ1Zl90IHJ4X2luZF9tc2csCisJCSAgICBjZGZfbmJ1Zl90ICpoZWFkX21zZHUsIGNkZl9uYnVmX3QgKnRhaWxfbXNkdSk7CisKK2V4dGVybiBpbnQKKygqaHR0X3J4X2ZyYWdfcG9wKShodHRfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgY2RmX25idWZfdCByeF9pbmRfbXNnLAorCQkgICBjZGZfbmJ1Zl90ICpoZWFkX21zZHUsIGNkZl9uYnVmX3QgKnRhaWxfbXNkdSk7CisKKy8qKgorICogQGJyaWVmIFJldHVybiBhIGxpbmtlZCBsaXN0IG9mIGJ1ZmZlcnMgaG9sZGluZyBvbmUgTVNEVQorICogIEluIHNvbWUgc3lzdGVtcyB0aGUgYnVmZmVycyBhcmUgZGVsaXZlcmVkIGFsb25nIHdpdGggb2ZmbG9hZCBkZWxpdmVyeQorICogIGluZGljYXRpb24gbWVzc2FnZSBpdHNlbGYsIHdoaWxlIGluIG90aGVyIHN5c3RlbXMgdGhlIGJ1ZmZlcnMgYXJlIHVwbG9hZGVkCisgKiAgb3V0IG9mIGJhbmQsIHZpYSBNQUMgRE1BLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGFuIGFic3RyYWN0IHdheSB0byBvYnRhaW4gYSBsaW5rZWQtbGlzdCBvZiB0aGUKKyAqICBidWZmZXJzIGNvcnJlc3BvbmRpbmcgdG8gYW4gbXNkdSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBNU0RVIHdhcworICogIGRlbGl2ZXJlZCBpbi1iYW5kIHdpdGggdGhlIHJ4IGluZGljYXRpb24gbWVzc2FnZSwgb3Igb3V0IG9mIGJhbmQgdGhyb3VnaAorICogIE1BQyBETUEuCisgKiAgSW4gYSBMTCBzeXN0ZW0sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGxpbmtlZCBsaXN0IG9mIG9uZSBvciBtb3JlCisgKiAgYnVmZmVycyBjb3JyZXNwb25kaW5nIHRvIGFuIE1TRFUKKyAqICBJbiBhIEhMIHN5c3RlbSAsIFRPRE8KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gb2ZmbG9hZF9kZWxpdmVyX21zZyAtIHRoZSBuZWJ1ZiBjb250YWluaW5nIHRoZSBvZmZsb2FkIGRlbGl2ZXIgbWVzc2FnZQorICogQHBhcmFtIGhlYWRfbXNkdSAtIGNhbGwtYnktcmVmZXJlbmNlIG5ldHdvcmsgYnVmZmVyIGhhbmRsZSwgd2hpY2ggZ2V0cyBzZXQgaW4gdGhpcworICogICAgICBmdW5jdGlvbiB0byB0aGUgaGVhZCBidWZmZXIgb2YgdGhpcyBNU0RVCisgKiBAcGFyYW0gdGFpbF9tc2R1IC0gY2FsbC1ieS1yZWZlcmVuY2UgbmV0d29yayBidWZmZXIgaGFuZGxlLCB3aGljaCBnZXRzIHNldCBpbiB0aGlzCisgKiAgICAgIGZ1bmN0aW9uIHRvIHRoZSB0YWlsIGJ1ZmZlciBvZiB0aGlzIE1TRFUKKyAqLworZXh0ZXJuIGludAorKCpodHRfcnhfb2ZmbG9hZF9tc2R1X3BvcCkoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkgICBjZGZfbmJ1Zl90IG9mZmxvYWRfZGVsaXZlcl9tc2csCisJCQkgICBpbnQgKnZkZXZfaWQsCisJCQkgICBpbnQgKnBlZXJfaWQsCisJCQkgICBpbnQgKnRpZCwKKwkJCSAgIHVpbnQ4X3QgKmZ3X2Rlc2MsCisJCQkgICBjZGZfbmJ1Zl90ICpoZWFkX2J1ZiwgY2RmX25idWZfdCAqdGFpbF9idWYpOworCisvKioKKyAqIEBicmllZiBSZXR1cm4gdGhlIHJ4IGRlc2NyaXB0b3IgZm9yIHRoZSBuZXh0IHJ4IE1QRFUuCisgKiBAZGV0YWlscworICogIFRoZSByeCBNU0RVIGRlc2NyaXB0b3JzIG1heSBiZSB1cGxvYWRlZCBhcyBwYXJ0IG9mIHRoZSByeCBpbmRpY2F0aW9uCisgKiAgbWVzc2FnZSwgb3IgZGVsaXZlcmVkIHNlcGFyYXRlbHkgb3V0IG9mIGJhbmQuCisgKiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhbiBhYnN0cmFjdCB3YXkgdG8gb2J0YWluIHRoZSBuZXh0IE1QRFUgZGVzY3JpcHRvciwKKyAqICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIE1QRFUgZGVzY3JpcHRvcnMgYXJlIGRlbGl2ZXJlZCBpbi1iYW5kIHdpdGgKKyAqICB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlLCBvciBvdXQgb2YgYmFuZC4KKyAqICBUaGlzIGlzIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBzZXJpZXMgb2YgTVBEVSBkZXNjcmlwdG9ycyByZWZlcmVuY2VkCisgKiAgYnkgYSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UuCisgKiAgVGhlIGh0dF9yeF9hbXNkdV9wb3AgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbgorICogIChvciBhdCBsZWFzdCBiZWZvcmUgdXNpbmcgdGhlIHJldHVybmVkIHJ4IGRlc2NyaXB0b3IgaGFuZGxlKSwgc28gdGhhdAorICogIHRoZSBjYWNoZSBsb2NhdGlvbiBmb3IgdGhlIHJ4IGRlc2NyaXB0b3Igd2lsbCBiZSBmbHVzaGVkIGJlZm9yZSB0aGUKKyAqICByeCBkZXNjcmlwdG9yIGdldHMgdXNlZC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gcnhfaW5kX21zZyAtIHRoZSBuZXRidWYgY29udGFpbmluZyB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBAcmV0dXJuIG5leHQgYWJzdHJhY3QgcnggZGVzY3JpcHRvciBmcm9tIHRoZSBzZXJpZXMgb2YgTVBEVXMgcmVmZXJlbmNlZAorICogICAgICBieSBhbiByeCBpbmQgbXNnCisgKi8KK2V4dGVybiB2b2lkICoKKygqaHR0X3J4X21wZHVfZGVzY19saXN0X25leHQpKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IHJ4X2luZF9tc2cpOworCisvKioKKyAqIEBicmllZiBSZXRyaWV2ZSBhIHByZXZpb3VzbHktc3RvcmVkIHJ4IGRlc2NyaXB0b3IgZnJvbSBhIE1TRFUgYnVmZmVyLgorICogQGRldGFpbHMKKyAqICBUaGUgZGF0YSBTVyB3aWxsIGNhbGwgdGhlIGh0dF9yeF9tc2R1X2Rlc2NfbGluayBtYWNyby9mdW5jdGlvbiB0bworICogIGxpbmsgYSBNU0RVJ3MgcnggZGVzY3JpcHRvciB3aXRoIHRoZSBidWZmZXIgaG9sZGluZyB0aGUgTVNEVSBwYXlsb2FkLgorICogIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSByeCBNU0RVIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgSFRUIGluc3RhbmNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIG1zZHUgLSB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIE1TRFUgcGF5bG9hZAorICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhYnN0cmFjdCByeCBNU0RVIGRlc2NyaXB0b3IKKyAqLworZXh0ZXJuIHZvaWQgKgorKCpodHRfcnhfbXNkdV9kZXNjX3JldHJpZXZlKShodHRfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCBtc2R1KTsKKworLyoqCisgKiBAYnJpZWYgRnJlZSBib3RoIGFuIHJ4IE1TRFUgZGVzY3JpcHRvciBhbmQgdGhlIGFzc29jaWF0ZWQgTVNEVSBidWZmZXIuCisgKiBAZGV0YWlscworICogIFVzdWFsbHkgdGhlIFdMQU4gZHJpdmVyIGRvZXMgbm90IGZyZWUgcnggTVNEVSBidWZmZXJzLCBidXQgbmVlZHMgdG8KKyAqICBkbyBzbyB3aGVuIGFuIGludmFsaWQgZnJhbWUgKGUuZy4gRkNTIGVycm9yKSB3YXMgZGVwb3NpdGVkIGludG8gdGhlCisgKiAgcXVldWUgb2YgcnggYnVmZmVycy4KKyAqICBUaGlzIGZ1bmN0aW9uIGZyZWVzIGJvdGggdGhlIHJ4IGRlc2NyaXB0b3IgYW5kIHRoZSByeCBmcmFtZS4KKyAqICBPbiBzb21lIHN5c3RlbXMsIHRoZSByeCBkZXNjcmlwdG9yIGFuZCByeCBmcmFtZSBhcmUgc3RvcmVkIGluIHRoZQorICogIHNhbWUgYnVmZmVyLCBhbmQgdGh1cyBvbmUgZnJlZSBzdWZmaWNlcyBmb3IgYm90aCBvYmplY3RzLgorICogIE9uIG90aGVyIHN5c3RlbXMsIHRoZSByeCBkZXNjcmlwdG9yIGFuZCByeCBmcmFtZSBhcmUgc3RvcmVkCisgKiAgc2VwYXJhdGVseSwgc28gZGlzdGluY3QgZnJlZXMgYXJlIGludGVybmFsbHkgbmVlZGVkLgorICogIEhvd2V2ZXIsIGluIGVpdGhlciBjYXNlLCB0aGUgcnggZGVzY3JpcHRvciBoYXMgYmVlbiBhc3NvY2lhdGVkIHdpdGgKKyAqICB0aGUgTVNEVSBidWZmZXIsIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5IGh0dF9yeF9tc2R1X2Rlc2NfcmV0cmlldmUuCisgKiAgSGVuY2UsIGl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgdGhlIE1TRFUgYnVmZmVyOyB0aGUgSFRUIFNXCisgKiAgaW50ZXJuYWxseSBmaW5kcyB0aGUgY29ycmVzcG9uZGluZyBNU0RVIHJ4IGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIGh0dF9wZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBwYXJhbSByeF9tc2R1X2Rlc2MgLSByeCBkZXNjcmlwdG9yIGZvciB0aGUgTVNEVSBiZWluZyBmcmVlZAorICogQHBhcmFtIG1zZHUgLSByeCBmcmFtZSBidWZmZXIgZm9yIHRoZSBNU0RVIGJlaW5nIGZyZWVkCisgKi8KK3ZvaWQgaHR0X3J4X2Rlc2NfZnJhbWVfZnJlZShodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsIGNkZl9uYnVmX3QgbXNkdSk7CisKKy8qKgorICogQGJyaWVmIExvb2sgdXAgYW5kIGZyZWUgdGhlIHJ4IGRlc2NyaXB0b3IgZm9yIGEgTVNEVS4KKyAqIEBkZXRhaWxzCisgKiAgV2hlbiB0aGUgZHJpdmVyIGRlbGl2ZXJzIHJ4IGZyYW1lcyB0byB0aGUgT1MsIGl0IGZpcnN0IG5lZWRzCisgKiAgdG8gZnJlZSB0aGUgYXNzb2NpYXRlZCByeCBkZXNjcmlwdG9ycy4KKyAqICBJbiBzb21lIHN5c3RlbXMgdGhlIHJ4IGRlc2NyaXB0b3JzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlIHNhbWUKKyAqICBidWZmZXIgYXMgdGhlIHJ4IGZyYW1lcywgc28gdGhpcyBvcGVyYXRpb24gaXMgYSBuby1vcC4KKyAqICBJbiBvdGhlciBzeXN0ZW1zLCB0aGUgcnggZGVzY3JpcHRvcnMgYXJlIHN0b3JlZCBzZXBhcmF0ZWx5CisgKiAgZnJvbSB0aGUgcnggZnJhbWVzLCBzbyB0aGUgcnggZGVzY3JpcHRvciBoYXMgdG8gYmUgZnJlZWQuCisgKiAgVGhlIGRlc2NyaXB0b3IgaXMgbG9jYXRlZCBmcm9tIHRoZSBNU0RVIGJ1ZmZlciB3aXRoIHRoZQorICogIGh0dF9yeF9kZXNjX2ZyYW1lX2ZyZWUgbWFjcm8vZnVuY3Rpb24uCisgKgorICogQHBhcmFtIGh0dF9wZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBwYXJhbSBtc2R1IC0gcnggZnJhbWUgYnVmZmVyIGZvciB0aGUgcnggTVNEVSBkZXNjcmlwdG9yIGJlaW5nIGZyZWVkCisgKi8KK3ZvaWQgaHR0X3J4X21zZHVfZGVzY19mcmVlKGh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiwgY2RmX25idWZfdCBtc2R1KTsKKworLyoqCisgKiBAYnJpZWYgQWRkIG5ldyBNU0RVIGJ1ZmZlcnMgZm9yIHRoZSB0YXJnZXQgdG8gZmlsbC4KKyAqIEBkZXRhaWxzCisgKiAgSW4gc29tZSBzeXN0ZW1zLCB0aGUgdW5kZXJseWluZyB1cGxvYWQgbWVjaGFuaXNtIChISUYpIGFsbG9jYXRlcyBuZXcgcngKKyAqICBidWZmZXJzIGl0c2VsZi4gIEluIG90aGVyIHN5c3RlbXMsIHRoZSB1bmRlcmx5aW5nIHVwbG9hZCBtZWNoYW5pc20KKyAqICAoTUFDIERNQSkgbmVlZHMgdG8gYmUgcHJvdmlkZWQgd2l0aCBuZXcgcnggYnVmZmVycy4KKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYW4gYWJzdHJhY3QgbWV0aG9kIHRvIGluZGljYXRlIHRvIHRoZSB1bmRlcmx5aW5nCisgKiAgZGF0YSB1cGxvYWQgbWVjaGFuaXNtIHdoZW4gaXQgaXMgYW4gYXBwcm9wcmlhdGUgdGltZSB0byBhbGxvY2F0ZSBuZXcgcngKKyAqICBidWZmZXJzLgorICogIElmIHRoZSBhbGxvY2F0aW9uIGlzIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCwgYSBsYSBISUYsIHRoZW4gdGhpcyBmdW5jdGlvbgorICogIGNhbGwgaXMgaWdub3JlZC4KKyAqICBJZiB0aGUgYWxsb2NhdGlvbiBoYXMgdG8gYmUgZG9uZSBleHBsaWNpdGx5LCBhIGxhIE1BQyBETUEsIHRoZW4gdGhpcworICogIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBjb250ZXh0IGFuZCB0aW1pbmcgZm9yIHN1Y2ggcmVwbGVuaXNobWVudAorICogIGFsbG9jYXRpb25zLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIEhUVCBpbnN0YW5jZSB0aGUgcnggZGF0YSB3aWxsIGJlIHJlY2VpdmVkIG9uCisgKi8KK3ZvaWQgaHR0X3J4X21zZHVfYnVmZl9yZXBsZW5pc2goaHR0X3BkZXZfaGFuZGxlIHBkZXYpOworCisvKioKKyAqIEBicmllZiBMaW5rcyBsaXN0IG9mIE1TRFVzIGludG8gYW4gc2luZ2xlIE1QRFUuIFVwZGF0ZXMgUlggc3RhdHMKKyAqIEBkZXRhaWxzCisgKiAgV2hlbiBIVyBNU0RVIHNwbGl0dGluZyBpcyB0dXJuZWQgb24gZWFjaCBNU0RVIGluIGFuIEFNU0RVIE1QRFUgb2NjdXBpZXMKKyAqICBhIHNlcGFyYXRlIHdidWYgZm9yIGRlbGl2ZXJ5IHRvIHRoZSBuZXR3b3JrIHN0YWNrLiBGb3IgZGVsaXZlcnkgdG8gdGhlCisgKiAgbW9uaXRvciBtb2RlIGludGVyZmFjZSB0aGV5IG5lZWQgdG8gYmUgcmVzdGl0Y2hlZCBpbnRvIGFuIE1QRFUuIFRoaXMKKyAqICBmdW5jdGlvbiBkb2VzIHRoaXMuIEFsc28gdXBkYXRlcyB0aGUgUlggc3RhdHVzIGlmIHRoZSBNUERVIHN0YXJ0cworICogIGEgbmV3IFBQRFUKKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBIVFQgaW5zdGFuY2UgdGhlIHJ4IGRhdGEgd2FzIHJlY2VpdmVkIG9uCisgKiBAcGFyYW0gaGVhZF9tc2R1IC0gbmV0d29yayBidWZmZXIgaGFuZGxlLCB3aGljaCBwb2ludHMgdG8gdGhlIGZpcnN0IE1TRFUKKyAqICAgICAgaW4gdGhlIGxpc3QuIFRoaXMgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgbGlzdAorICogQHBhcmFtIHJ4X3N0YXVzIC0gcG9pbnRlciB0byB0aGUgc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1QRFUuCisgKiAgICAgIFVwZGF0ZWQgb25seSBpZiB0aGVyZSBpcyBhIG5ldyBQUERVIGFuZCBuZXcgc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCBpdAorICogQHBhcmFtIGNsb25lX25vdF9yZXFkIC0gSWYgc2V0IHRoZSBNUERVIGxpbmtpbmcgZGVzdHJveXMgdGhlIHBhc3NlZCBpbgorICogICAgICBsaXN0LCBlbHNlIG9wZXJhdGVzIG9uIGEgY2xvbmVkIG5idWYKKyAqIEByZXR1cm4gbmV0d29yayBidWZmZXIgaGFuZGxlIHRvIHRoZSBNUERVCisgKi8KK2NkZl9uYnVmX3QKK2h0dF9yeF9yZXN0aXRjaF9tcGR1X2Zyb21fbXNkdXMoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkJY2RmX25idWZfdCBoZWFkX21zZHUsCisJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cywKKwkJCQl1bnNpZ25lZCBjbG9uZV9ub3RfcmVxZCk7CisKKy8qKgorICogQGJyaWVmIFJldHVybiB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIE1QRFVzIHRvIGZsdXNoLgorICogQHBhcmFtIHBkZXYgLSB0aGUgSFRUIGluc3RhbmNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIHJ4X2ZyYWdfaW5kX21zZyAtIHRoZSBuZXRidWYgY29udGFpbmluZyB0aGUgcnggZnJhZ21lbnQgaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBAcGFyYW0gc2VxX251bV9zdGFydCAtIChjYWxsLWJ5LXJlZmVyZW5jZSBvdXRwdXQpIHNlcXVlbmNlIG51bWJlcgorICogICAgICBmb3IgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBvZiBNUERVcyB0byBmbHVzaAorICogQHBhcmFtIHNlcV9udW1fZW5kIC0gKGNhbGwtYnktcmVmZXJlbmNlIG91dHB1dCkgc2VxdWVuY2UgbnVtYmVyCisgKiAgICAgIGZvciB0aGUgZW5kIG9mIHRoZSByYW5nZSBvZiBNUERVcyB0byBmbHVzaAorICovCit2b2lkCitodHRfcnhfZnJhZ19pbmRfZmx1c2hfc2VxX251bV9yYW5nZShodHRfcGRldl9oYW5kbGUgcGRldiwKKwkJCQkgICAgY2RmX25idWZfdCByeF9mcmFnX2luZF9tc2csCisJCQkJICAgIGludCAqc2VxX251bV9zdGFydCwgaW50ICpzZXFfbnVtX2VuZCk7CisvKioKKyAqIEBicmllZiBSZXR1cm4gdGhlIEhMIHJ4IGRlc2Mgc2l6ZQorICogQHBhcmFtIHBkZXYgLSB0aGUgSFRUIGluc3RhbmNlIHRoZSByeCBkYXRhIHdhcyByZWNlaXZlZCBvbgorICogQHBhcmFtIG1zZHVfZGVzYyAtIHRoZSBobCByeCBkZXNjIHBvaW50ZXIKKyAqCisgKi8KK3VpbnQxNl90IGh0dF9yeF9tc2R1X3J4X2Rlc2Nfc2l6ZV9obChodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqbXNkdV9kZXNjKTsKKworLyoqCisgKiBAYnJpZWYgcG9wdWxhdGVzIHZvd2V4dCBzdGF0cyBieSBwcm9jZXNzaW5nIFJYIGRlc2MuCisgKiBAcGFyYW0gbXNkdSAtIG5ldHdvcmsgYnVmZmVyIGhhbmRsZQorICogQHBhcmFtIHZvd3N0YXRzIC0gaGFuZGxlIHRvIHZvdyBleHQgc3RhdHMuCisgKi8KK3ZvaWQgaHR0X3J4X2dldF92b3dleHRfc3RhdHMoY2RmX25idWZfdCBtc2R1LCBzdHJ1Y3Qgdm93X2V4dHN0YXRzICp2b3dzdGF0cyk7CisKKy8qKgorICogQGJyaWVmIHBhcnNlcyB0aGUgb2ZmbG9hZCBtZXNzYWdlIHBhc3NlZCBieSB0aGUgdGFyZ2V0LgorICogQHBhcmFtIHBkZXYgLSBwZGV2IGhhbmRsZQorICogQHBhcmFtIHBhZGRyIC0gcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcnggYnVmZmVyCisgKiBAcGFyYW0gdmRldl9pZCAtIHJlZmVyZW5jZSB0byB2ZGV2IGlkIHRvIGJlIGZpbGxlZAorICogQHBhcmFtIHBlZXJfaWQgLSByZWZlcmVuY2UgdG8gdGhlIHBlZXIgaWQgdG8gYmUgZmlsbGVkCisgKiBAcGFyYW0gdGlkIC0gcmVmZXJlbmNlIHRvIHRoZSB0aWQgdG8gYmUgZmlsbGVkCisgKiBAcGFyYW0gZndfZGVzYyAtIHJlZmVyZW5jZSB0byB0aGUgZncgZGVzY3JpcHRvciB0byBiZSBmaWxsZWQKKyAqIEBwYXJhbSBwZWVyX2lkIC0gcmVmZXJlbmNlIHRvIHRoZSBwZWVyIGlkIHRvIGJlIGZpbGxlZAorICogQHBhcmFtIGhlYWRfYnVmIC0gcmVmZXJlbmNlIHRvIHRoZSBoZWFkIGJ1ZmZlcgorICogQHBhcmFtIHRhaWxfYnVmIC0gcmVmZXJlbmNlIHRvIHRoZSB0YWlsIGJ1ZmZlcgorICovCitpbnQKK2h0dF9yeF9vZmZsb2FkX3BhZGRyX21zZHVfcG9wX2xsKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSB1aW50MzJfdCAqbXNnX3dvcmQsCisJCQkJIGludCBtc2R1X2l0ZXIsCisJCQkJIGludCAqdmRldl9pZCwKKwkJCQkgaW50ICpwZWVyX2lkLAorCQkJCSBpbnQgKnRpZCwKKwkJCQkgdWludDhfdCAqZndfZGVzYywKKwkJCQkgY2RmX25idWZfdCAqaGVhZF9idWYsIGNkZl9uYnVmX3QgKnRhaWxfYnVmKTsKKyNlbmRpZiAvKiBfT0xfSFRUX1JYX0FQSV9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvb2wvaW5jL29sX2h0dF90eF9hcGkuaCBiL2NvcmUvZHAvb2wvaW5jL29sX2h0dF90eF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGViYWJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9vbC9pbmMvb2xfaHR0X3R4X2FwaS5oCkBAIC0wLDAgKzEsOTY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIG9sX2h0dF90eF9hcGkuaAorICogQGJyaWVmIFNwZWNpZnkgdGhlIHR4IEhUVCBBUEkgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGUgaG9zdCBkYXRhIFNXLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEhUVCBBUEkgZnVuY3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljYWxseQorICogIHJlbGF0ZWQgdG8gdHJhbnNtaXQgcHJvY2Vzc2luZy4KKyAqICBJbiBwYXJ0aWN1bGFyLCB0aGUgbWV0aG9kcyBvZiB0aGUgYWJzdHJhY3QgSFRUIHR4IGRlc2NyaXB0b3IgYXJlCisgKiAgc3BlY2lmaWVkLgorICovCisjaWZuZGVmIF9PTF9IVFRfVFhfQVBJX19IXworI2RlZmluZSBfT0xfSFRUX1RYX0FQSV9fSF8KKworLyogI2luY2x1ZGUgPG9zYXBpX2xpbnV4Lmg+ICAgIC8gKiB1aW50MTZfdCwgZXRjLiAqIC8gKi8KKyNpbmNsdWRlIDxvc2RlcC5oPiAgICAgICAgICAgICAgLyogdWludDE2X3QsIGV0Yy4gKi8KKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCAqLworI2luY2x1ZGUgPG9sX2NmZy5oPiAgICAgICAgICAgICAvKiB3bGFuX2ZybV9mbXQgKi8KKworI2luY2x1ZGUgPGh0dC5oPiAgICAgICAgICAgICAgICAvKiBuZWVkZWQgYnkgaW5saW5lIGZ1bmN0aW9ucyAqLworI2luY2x1ZGUgPGNkZl9uZXRfdHlwZXMuaD4KKyNpbmNsdWRlIDxvbF9odHRfYXBpLmg+ICAgICAgICAgLyogaHR0X3BkZXZfaGFuZGxlICovCisjaW5jbHVkZSA8aHR0X3R5cGVzLmg+CisjaW5jbHVkZSA8Y2RmX3RyYWNlLmg+CisKKy8qIFJlbW92ZSB0aGVzZSBtYWNyb3Mgd2hlbiB0aGV5IGdldCBhZGRlZCB0byBodHQuaC4gKi8KKyNpZm5kZWYgSFRUX1RYX0RFU0NfRVhURU5TSU9OX0dFVAorI2RlZmluZSBIVFRfVFhfREVTQ19FWFRFTlNJT05fT0ZGU0VUX0JZVEVTIDAKKyNkZWZpbmUgSFRUX1RYX0RFU0NfRVhURU5TSU9OX09GRlNFVF9EV09SRCAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX0VYVEVOU0lPTl9NICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX0VYVEVOU0lPTl9TICAgICAgICAyOAorCisjZGVmaW5lIEhUVF9UWF9ERVNDX0VYVEVOU0lPTl9HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1RYX0RFU0NfRVhURU5TSU9OX00pID4+IEhUVF9UWF9ERVNDX0VYVEVOU0lPTl9TKQorI2RlZmluZSBIVFRfVFhfREVTQ19FWFRFTlNJT05fU0VUKF92YXIsIF92YWwpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9ERVNDX0VYVEVOU0lPTiwgX3ZhbCk7CQlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfVFhfREVTQ19FWFRFTlNJT05fUykpOwlcCisJfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT0gbWV0YS1pbmZvIGFib3V0IHR4IE1TRFVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBGb3Igc2ltcGxpY2l0eSwgdXNlIHRoZSBJRUVFIDgwMi4xMSBmcmFtZSB0eXBlIHZhbHVlcy4KKyAqLworZW51bSBodHRfZnJtX3R5cGUgeworCWh0dF9mcm1fdHlwZV9tZ210ID0gMCwKKwlodHRfZnJtX3R5cGVfY3RybCA9IDEsCisJaHR0X2ZybV90eXBlX2RhdGEgPSAyCit9OworCisvKgorICogRm9yIHNpbXBsaWNpdHksIHVzZSB0aGUgSUVFRSA4MDIuMTEgZnJhbWUgc3ViLXR5cGUgdmFsdWVzLgorICovCitlbnVtIGh0dF9mcm1fc3VidHlwZSB7CisJaHR0X2ZybV9zdWJ0eXBlX21nbXRfYXNzb2NfcmVxID0gMCwKKwlodHRfZnJtX3N1YnR5cGVfbWdtdF9hc3NvY19yZXNwID0gMSwKKwlodHRfZnJtX3N1YnR5cGVfbWdtdF9yZWFzc29jX3JlcSA9IDIsCisJaHR0X2ZybV9zdWJ0eXBlX21nbXRfcmVhc3NvY19yZXNwID0gMywKKwlodHRfZnJtX3N1YnR5cGVfbWdtdF9wcm9iZV9yZXEgPSA0LAorCWh0dF9mcm1fc3VidHlwZV9tZ210X3Byb2JlX3Jlc3AgPSA1LAorCWh0dF9mcm1fc3VidHlwZV9tZ210X3RpbWluZ19hZHYgPSA2LAorCWh0dF9mcm1fc3VidHlwZV9tZ210X2JlYWNvbiA9IDgsCisJaHR0X2ZybV9zdWJ0eXBlX21nbXRfYXRpbSA9IDksCisJaHR0X2ZybV9zdWJ0eXBlX21nbXRfZGlzYXNzb2MgPSAxMCwKKwlodHRfZnJtX3N1YnR5cGVfbWdtdF9hdXRoID0gMTEsCisJaHR0X2ZybV9zdWJ0eXBlX21nbXRfZGVhdXRoID0gMTIsCisJaHR0X2ZybV9zdWJ0eXBlX21nbXRfYWN0aW9uID0gMTMsCisJaHR0X2ZybV9zdWJ0eXBlX21nbXRfYWN0aW9uX25vX2FjayA9IDE0LAorCisJaHR0X2ZybV9zdWJ0eXBlX2RhdGFfZGF0YSA9IDAsCisJaHR0X2ZybV9zdWJ0eXBlX2RhdGFfZGF0YV9jZl9hY2sgPSAxLAorCWh0dF9mcm1fc3VidHlwZV9kYXRhX2RhdGFfY2ZfcG9sbCA9IDIsCisJaHR0X2ZybV9zdWJ0eXBlX2RhdGFfZGF0YV9jZl9hY2tfY2ZfcG9sbCA9IDMsCisJaHR0X2ZybV9zdWJ0eXBlX2RhdGFfbnVsbCA9IDQsCisJaHR0X2ZybV9zdWJ0eXBlX2RhdGFfY2ZfYWNrID0gNSwKKwlodHRfZnJtX3N1YnR5cGVfZGF0YV9jZl9wb2xsID0gNiwKKwlodHRfZnJtX3N1YnR5cGVfZGF0YV9jZl9hY2tfY2ZfcG9sbCA9IDcsCisJaHR0X2ZybV9zdWJ0eXBlX2RhdGFfUW9TX2RhdGEgPSA4LAorCWh0dF9mcm1fc3VidHlwZV9kYXRhX1FvU19kYXRhX2NmX2FjayA9IDksCisJaHR0X2ZybV9zdWJ0eXBlX2RhdGFfUW9TX2RhdGFfY2ZfcG9sbCA9IDEwLAorCWh0dF9mcm1fc3VidHlwZV9kYXRhX1FvU19kYXRhX2NmX2Fja19jZl9wb2xsID0gMTEsCisJaHR0X2ZybV9zdWJ0eXBlX2RhdGFfUW9TX251bGwgPSAxMiwKKwlodHRfZnJtX3N1YnR5cGVfZGF0YV9Rb1NfY2ZfcG9sbCA9IDE0LAorCWh0dF9mcm1fc3VidHlwZV9kYXRhX1FvU19jZl9hY2tfY2ZfcG9sbCA9IDE1LAorfTsKKworZW51bSBodHRfb2ZkbV9kYXRhcmF0ZSB7CQkvKiBWYWx1ZSAgICBNQlBTICAgIE1vZHVsYXRpb24gIENvZGluZyovCisJaHR0X29mZG1fZGF0YXJhdGVfNl9tYnBzID0gMCwJLyogMCAgICAgICAgNiAgICAgICBCUFNLICAgICAgICAxLzIgICAqLworCWh0dF9vZmRtX2RhdGFyYXRlXzlfbWJwcyA9IDEsCS8qIDEgICAgICAgIDkgICAgICAgQlBTSyAgICAgICAgMy80ICAgKi8KKwlodHRfb2ZkbV9kYXRhcmF0ZV8xMl9tYnBzID0gMiwJLyogMiAgICAgICAgMTIgICAgICBRUFNLICAgICAgICAxLzIgICAqLworCWh0dF9vZmRtX2RhdGFyYXRlXzE4X21icHMgPSAzLAkvKiAzICAgICAgICAxOCAgICAgIFFQU0sgICAgICAgIDMvNCAgICovCisJaHR0X29mZG1fZGF0YXJhdGVfMjRfbWJwcyA9IDQsCS8qIDQgICAgICAgIDI0ICAgICAgMTYtUUFNICAgICAgMS8yICAgKi8KKwlodHRfb2ZkbV9kYXRhcmF0ZV8zNl9tYnBzID0gNSwJLyogNSAgICAgICAgMzYgICAgICAxNi1RQU0gICAgICAzLzQgICAqLworCWh0dF9vZmRtX2RhdGFyYXRlXzQ4X21icHMgPSA2LAkvKiA2ICAgICAgICA0OCAgICAgIDY0LVFBTSAgICAgIDEvMiAgICovCisJaHR0X29mZG1fZGF0YXJhdGVfNTRfbWJwcyA9IDcsCS8qIDcgICAgICAgIDU0ICAgICAgNjQtUUFNICAgICAgMy80ICAgKi8KKwlodHRfb2ZkbV9kYXRhcmF0ZV9tYXggPSA3LAorfTsKKworLyoqCisgKiBzdHJ1Y3Qgb2NiX3R4X2N0cmxfaGRyX3QgLSBUWCBjb250cm9sIGhlYWRlcgorICogQHZlcnNpb246CQltdXN0IGJlIDEKKyAqIEBsZW5ndGg6CQlsZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAqIEBjaGFubmVsX2ZyZXE6CWNoYW5uZWwgb24gd2hpY2ggdG8gdHJhbnNtaXQgdGhlIHBhY2tldAorICogQHZhbGlkX3B3cjoJCWJpdCAwOiBpZiBzZXQsIHR4IHB3ciBzcGVjIGlzIHZhbGlkCisgKiBAdmFsaWRfZGF0YXJhdGU6CWJpdCAxOiBpZiBzZXQsIHR4IE1DUyBtYXNrIHNwZWMgaXMgdmFsaWQKKyAqIEB2YWxpZF9yZXRyaWVzOgliaXQgMjogaWYgc2V0LCB0eCByZXRyaWVzIHNwZWMgaXMgdmFsaWQKKyAqIEB2YWxpZF9jaGFpbl9tYXNrOgliaXQgMzogaWYgc2V0LCBjaGFpbiBtYXNrIGlzIHZhbGlkCisgKiBAdmFsaWRfZXhwaXJlX3RzZjoJYml0IDQ6IGlmIHNldCwgdHggZXhwaXJlIFRTRiBzcGVjIGlzIHZhbGlkCisgKiBAdmFsaWRfdGlkOgkJYml0IDU6IGlmIHNldCwgVElEIGlzIHZhbGlkCisgKiBAcmVzZXJ2ZWQwXzE1XzY6CWJpdHMgMTU6NiAtIHVudXNlZCwgc2V0IHRvIDB4MAorICogQGFsbF9mbGFnczoJCXVuaW9uIG9mIGFsbCB0aGUgZmxhZ3MKKyAqIEBleHBpcmVfdHNmX2xvOglUWCBleHBpcnkgdGltZSAoVFNGKSBMU0JzCisgKiBAZXhwaXJlX3RzZl9oaToJVFggZXhwaXJ5IHRpbWUgKFRTRikgTVNCcworICogQHB3cjoJCVNwZWNpZnkgd2hhdCBwb3dlciB0aGUgdHggZnJhbWUgbmVlZHMgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqCQkJYXQuIFRoZSBwb3dlciBhIHNpZ25lZCAodHdvJ3MgY29tcGxlbWVudCkgdmFsdWUgaXMgaW4KKyAqCQkJdW5pdHMgb2YgMC41IGRCbS4gVGhlIHZhbHVlIG5lZWRzIHRvIGJlIGFwcHJvcHJpYXRlbHkKKyAqCQkJc2lnbi1leHRlbmRlZCB3aGVuIGV4dHJhY3RpbmcgdGhlIHZhbHVlIGZyb20gdGhlIG1lc3NhZ2UKKyAqCQkJYW5kIHN0b3JpbmcgaXQgaW4gYSB2YXJpYWJsZSB0aGF0IGlzIGxhcmdlciB0aGFuIEFfSU5UOC4KKyAqCQkJSWYgdGhlIHRyYW5zbWlzc2lvbiB1c2VzIG11bHRpcGxlIHR4IGNoYWlucywgdGhpcyBwb3dlcgorICoJCQlzcGVjIGlzIHRoZSB0b3RhbCB0cmFuc21pdCBwb3dlciwgYXNzdW1pbmcgaW5jb2hlcmVudAorICoJCQljb21iaW5hdGlvbiBvZiBwZXItY2hhaW4gcG93ZXIgdG8gcHJvZHVjZSB0aGUgdG90YWwKKyAqCQkJcG93ZXIuCisgKiBAZGF0YXJhdGU6CQlUaGUgZGVzaXJlZCBtb2R1bGF0aW9uIGFuZCBjb2Rpbmcgc2NoZW1lLgorICoJCQlWQUxVRSAgICBEQVRBIFJBVEUgICBNT0RVTEFUSU9OICBDT0RJTkcgUkFURQorICoJCQlAIDIwIE1IegorICoJCQkoTUJQUykKKyAqCQkJMCAgICAgICAgNiAgICAgICAgICAgQlBTSyAgICAgICAgMS8yCisgKgkJCTEgICAgICAgIDkgICAgICAgICAgIEJQU0sgICAgICAgIDMvNAorICoJCQkyICAgICAgICAxMiAgICAgICAgICBRUFNLICAgICAgICAxLzIKKyAqCQkJMyAgICAgICAgMTggICAgICAgICAgUVBTSyAgICAgICAgMy80CisgKgkJCTQgICAgICAgIDI0ICAgICAgICAgIDE2LVFBTSAgICAgIDEvMgorICoJCQk1ICAgICAgICAzNiAgICAgICAgICAxNi1RQU0gICAgICAzLzQKKyAqCQkJNiAgICAgICAgNDggICAgICAgICAgNjQtUUFNICAgICAgMS8yCisgKgkJCTcgICAgICAgIDU0ICAgICAgICAgIDY0LVFBTSAgICAgIDMvNAorICogQHJldHJ5X2xpbWl0OglTcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc21pc3Npb25zLCBpbmNsdWRpbmcKKyAqCQkJdGhlIGluaXRpYWwgdHJhbnNtaXNzaW9uLCB0byBhdHRlbXB0IGJlZm9yZSBnaXZpbmcgdXAgaWYKKyAqCQkJbm8gYWNrIGlzIHJlY2VpdmVkLgorICoJCQlJZiB0aGUgdHggcmF0ZSBpcyBzcGVjaWZpZWQsIHRoZW4gYWxsIHJldHJpZXMgc2hhbGwgdXNlCisgKgkJCXRoZSBzYW1lIHJhdGUgYXMgdGhlIGluaXRpYWwgdHJhbnNtaXNzaW9uLgorICoJCQlJZiBubyB0eCByYXRlIGlzIHNwZWNpZmllZCwgdGhlIHRhcmdldCBjYW4gY2hvb3NlCisgKgkJCXdoZXRoZXIgdG8gcmV0YWluIHRoZSBvcmlnaW5hbCByYXRlIGR1cmluZyB0aGUKKyAqCQkJcmV0cmFuc21pc3Npb25zLCBvciB0byBmYWxsIGJhY2sgdG8gYSBtb3JlIHJvYnVzdCByYXRlLgorICogQGNoYWluX21hc2s6CQlzcGVjaWZ5IHdoaWNoIGNoYWlucyB0byB0cmFuc21pdCBmcm9tCisgKiBAZXh0X3RpZDoJCUV4dGVuZGVkIFRyYWZmaWMgSUQgKDAtMTUpCisgKiBAcmVzZXJ2ZWQ6CQlFbnN1cmUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGlzIGEgbXVsdGlwbGUgb2YKKyAqCQkJNC4gTXVzdCBiZSAwLgorICoKKyAqIFdoZW4gc2VuZGluZyBhbiBPQ0IgcGFja2V0LCB0aGUgdXNlciBhcHBsaWNhdGlvbiBoYXMKKyAqIHRoZSBvcHRpb24gb2YgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmcgc3RydWN0IGZvbGxvd2luZyBhbiBldGhlcm5ldCBoZWFkZXIKKyAqIHdpdGggdGhlIHByb3RvIGZpZWxkIHNldCB0byAweDgxNTEuIFRoaXMgc3RydWN0IGluY2x1ZGVzIHZhcmlvdXMgVFgKKyAqIHBhcmFtYXRlcnMgaW5jbHVkaW5nIHRoZSBUWCBwb3dlciBhbmQgTUNTLgorICovCitQUkVQQUNLIHN0cnVjdCBvY2JfdHhfY3RybF9oZHJfdCB7CisJdWludDE2X3QgdmVyc2lvbjsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgY2hhbm5lbF9mcmVxOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDE2X3QKKwkJCXZhbGlkX3B3cjoxLAorCQkJdmFsaWRfZGF0YXJhdGU6MSwKKwkJCXZhbGlkX3JldHJpZXM6MSwKKwkJCXZhbGlkX2NoYWluX21hc2s6MSwKKwkJCXZhbGlkX2V4cGlyZV90c2Y6MSwKKwkJCXZhbGlkX3RpZDoxLAorCQkJcmVzZXJ2ZWQwXzE1XzY6MTA7CisJCX07CisJCXVpbnQxNl90IGFsbF9mbGFnczsKKwl9OworCisJdWludDMyX3QgZXhwaXJlX3RzZl9sbzsKKwl1aW50MzJfdCBleHBpcmVfdHNmX2hpOworCWludDhfdCBwd3I7CisJdWludDhfdCBkYXRhcmF0ZTsKKwl1aW50OF90IHJldHJ5X2xpbWl0OworCXVpbnQ4X3QgY2hhaW5fbWFzazsKKwl1aW50OF90IGV4dF90aWQ7CisJdWludDhfdCByZXNlcnZlZFszXTsKK30gUE9TVFBBQ0s7CisKKy8qKgorICogQGJyaWVmIHR4IE1TRFUgbWV0YS1kYXRhIHRoYXQgSFRUIG1heSB1c2UgdG8gcHJvZ3JhbSB0aGUgRlcvSFcgdHggZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgaHR0X21zZHVfaW5mb190IHsKKwkvKiB0aGUgaW5mbyBzdWItc3RydWN0IHNwZWNpZmllcyB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBNU0RVICovCisJc3RydWN0IHsKKwkJdWludDE2X3QgZXRoZXJ0eXBlOworI2RlZmluZSBIVFRfSU5WQUxJRF9QRUVSX0lEIDB4ZmZmZgorCQl1aW50MTZfdCBwZWVyX2lkOworCQl1aW50OF90IHZkZXZfaWQ7CisJCXVpbnQ4X3QgZXh0X3RpZDsKKwkJLyoKKwkJICogbDJfaGRyX3R5cGUgLSBMMiBmb3JtYXQgKDgwMi4zLCBuYXRpdmUgV2lGaSA4MDIuMTEsCisJCSAqIG9yIHJhdyA4MDIuMTEpCisJCSAqIEJhc2VkIG9uIGF0dGFjaC10aW1lIGNvbmZpZ3VyYXRpb24sIHRoZSB0eCBmcmFtZXMgcHJvdmlkZWQKKwkJICogYnkgdGhlIE9TIHRvIHRoZSB0eCBkYXRhIFNXIGFyZSBleHBlY3RlZCB0byBiZSBlaXRoZXIKKwkJICogODAyLjMgZm9ybWF0IG9yIHRoZSAibmF0aXZlIFdpRmkiIHZhcmlhbnQgb2YgODAyLjExIGZvcm1hdC4KKwkJICogSW50ZXJuYWxseSwgdGhlIGRyaXZlciBtYXkgYWxzbyBpbmplY3QgdHggZnJhbWVzIGludG8gdGhlIHR4CisJCSAqIGRhdGFwYXRoLCBhbmQgdGhlc2UgZnJhbWVzIG1heSBiZSBlaXRoZXIgODAyLjMgZm9ybWF0IG9yCisJCSAqIDgwMi4xMSAicmF3IiBmb3JtYXQsIHdpdGggbm8gZnVydGhlciA4MDIuMTEgZW5jYXBzdWxhdGlvbgorCQkgKiBuZWVkZWQuCisJCSAqIFRoZSB0eCBmcmFtZXMgYXJlIHRhZ2dlZCB3aXRoIHRoZWlyIGZyYW1lIGZvcm1hdCwgc28gdGFyZ2V0CisJCSAqIEZXL0hXIHdpbGwga25vdyBob3cgdG8gaW50ZXJwcmV0IHRoZSBwYWNrZXQncyBlbmNhcHN1bGF0aW9uCisJCSAqIGhlYWRlcnMgd2hlbiBkb2luZyB0eCBjbGFzc2lmaWNhdGlvbiwgYW5kIHdoYXQgZm9ybSBvZiA4MDIuMTEKKwkJICogaGVhZGVyIGVuY2Fwc3VsYXRpb24gaXMgbmVlZGVkLCBpZiBhbnkuCisJCSAqLworCQl1aW50OF90IGwyX2hkcl90eXBlOyAgICAvKiBlbnVtIGh0dF9wa3RfdHlwZSAqLworCQkvKgorCQkgKiBmcmFtZV90eXBlIC0gaXMgdGhlIHR4IGZyYW1lIG1hbmFnZW1lbnQgb3IgZGF0YT8KKwkJICogSnVzdCB0byBhdm9pZCBjb25mdXNpb24sIHRoZSBlbnVtIHZhbHVlcyBmb3IgdGhpcyBmcmFtZSB0eXBlCisJCSAqIGZpZWxkIHVzZSB0aGUgODAyLjExIGZyYW1lIHR5cGUgdmFsdWVzLCBhbHRob3VnaCBpdCBpcworCQkgKiB1bmV4cGVjdGVkIGZvciBjb250cm9sIGZyYW1lcyB0byBiZSBzZW50IHRocm91Z2ggdGhlIGhvc3QKKwkJICogZGF0YSBwYXRoLgorCQkgKi8KKwkJdWludDhfdCBmcmFtZV90eXBlOyAgICAgLyogZW51bSBodHRfZnJtX3R5cGUgKi8KKwkJLyoKKwkJICogZnJhbWUgc3VidHlwZSAtIHRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBzdWItdHlwZSBvZgorCQkgKiBtYW5hZ2VtZW50IGZyYW1lcworCQkgKiBKdXN0IHRvIGF2b2lkIGNvbmZ1c2lvbiwgdGhlIGVudW0gdmFsdWVzIGZvciB0aGlzIGZyYW1lCisJCSAqIHN1YnR5cGUgZmllbGQgdXNlIHRoZSA4MDIuMTEgbWFuYWdlbWVudCBmcmFtZSBzdWJ0eXBlIHZhbHVlcy4KKwkJICovCisJCXVpbnQ4X3QgZnJhbWVfc3VidHlwZTsgIC8qIGVudW0gaHR0X2ZybV9zdWJ0eXBlICovCisJCXVpbnQ4X3QgaXNfdW5pY2FzdDsKKworCQkvKiBkZXN0X2FkZHIgaXMgbm90IGN1cnJlbnRseSB1c2VkLgorCQkgKiBJdCBjb3VsZCBiZSB1c2VkIGFzIGFuIGlucHV0IHRvIGEgVHggQkQgKFJpdmEgdHggZGVzY3JpcHRvcikKKwkJICogc2lnbmF0dXJlIGNvbXB1dGF0aW9uLgorCQkgICB1aW50OF90ICpkZXN0X2FkZHI7CisJCSAqLworCisJCXVpbnQ4X3QgbDNfaGRyX29mZnNldDsgIC8qIHdydCBjZGZfbmJ1Zl9kYXRhKG1zZHUpLCBpbiBieXRlcyAqLworCisJCS8qIGw0X2hkcl9vZmZzZXQgaXMgbm90IGN1cnJlbnRseSB1c2VkLgorCQkgKiBJdCBjb3VsZCBiZSB1c2VkIHRvIHNwZWNpZnkgdG8gYSBUQ1AvVURQIGNoZWNrc3VtIGNvbXB1dGF0aW9uCisJCSAqIGVuZ2luZSB3aGVyZSB0aGUgVENQL1VEUCBoZWFkZXIgc3RhcnRzLgorCQkgKi8KKwkJLyogdWludDhfdCBsNF9oZHJfb2Zmc2V0OyAtIHdydCBjZGZfbmJ1Zl9kYXRhKG1zZHUpLCBpbiBieXRlcyAqLworCX0gaW5mbzsKKwkvKiB0aGUgYWN0aW9uIHN1Yi1zdHJ1Y3Qgc3BlY2lmaWVzIGhvdyB0byBwcm9jZXNzIHRoZSBNU0RVICovCisJc3RydWN0IHsKKwkJdWludDhfdCB1c2VfNm1icHM7ICAgICAgLyogbWdtdCBmcmFtZXM6IG9wdGlvbiB0byBmb3JjZQorCQkJCQkgICA2IE1icHMgcmF0ZSAqLworCQl1aW50OF90IGRvX2VuY3J5cHQ7CisJCXVpbnQ4X3QgZG9fdHhfY29tcGxldGU7CisJCXVpbnQ4X3QgdHhfY29tcF9yZXE7CisKKwkJLyoKKwkJICogY2tzdW1fb2ZmbG9hZCAtIFNwZWNpZnkgd2hldGhlciBjaGVja3N1bSBvZmZsb2FkIGlzCisJCSAqIGVuYWJsZWQgb3Igbm90CisJCSAqIFRhcmdldCBGVyB1c2VzIHRoaXMgZmxhZyB0byB0dXJuIG9uIEhXIGNoZWNrc3VtbWluZworCQkgKiAweDAgLSBObyBjaGVja3N1bSBvZmZsb2FkCisJCSAqIDB4MSAtIEwzIGhlYWRlciBjaGVja3N1bSBvbmx5CisJCSAqIDB4MiAtIEw0IGNoZWNrc3VtIG9ubHkKKwkJICogMHgzIC0gTDMgaGVhZGVyIGNoZWNrc3VtICsgTDQgY2hlY2tzdW0KKwkJICovCisJCWNkZl9uYnVmX3R4X2Nrc3VtX3QgY2tzdW1fb2ZmbG9hZDsKKwl9IGFjdGlvbjsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBodHRfbXNkdV9pbmZvX2R1bXAoc3RydWN0IGh0dF9tc2R1X2luZm9fdCAqbXNkdV9pbmZvKQoreworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiSFRUIE1TRFUgaW5mbyBvYmplY3QgKCVwKVxuIiwgbXNkdV9pbmZvKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiAgZXRoZXJ0eXBlOiAlI3hcbiIsIG1zZHVfaW5mby0+aW5mby5ldGhlcnR5cGUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiICBwZWVyX2lkOiAlZFxuIiwgbXNkdV9pbmZvLT5pbmZvLnBlZXJfaWQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiICB2ZGV2X2lkOiAlZFxuIiwgbXNkdV9pbmZvLT5pbmZvLnZkZXZfaWQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiICBleHRfdGlkOiAlZFxuIiwgbXNkdV9pbmZvLT5pbmZvLmV4dF90aWQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiICBsMl9oZHJfdHlwZTogJWRcbiIsIG1zZHVfaW5mby0+aW5mby5sMl9oZHJfdHlwZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIgIGZyYW1lX3R5cGU6ICVkXG4iLCBtc2R1X2luZm8tPmluZm8uZnJhbWVfdHlwZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIgIGZyYW1lX3N1YnR5cGU6ICVkXG4iLCBtc2R1X2luZm8tPmluZm8uZnJhbWVfc3VidHlwZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIgIGlzX3VuaWNhc3Q6ICV1XG4iLCBtc2R1X2luZm8tPmluZm8uaXNfdW5pY2FzdCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIgIGwzX2hkcl9vZmZzZXQ6ICV1XG4iLCBtc2R1X2luZm8tPmluZm8ubDNfaGRyX29mZnNldCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIgIHVzZSA2IE1icHM6ICVkXG4iLCBtc2R1X2luZm8tPmFjdGlvbi51c2VfNm1icHMpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiICBkb19lbmNyeXB0OiAlZFxuIiwgbXNkdV9pbmZvLT5hY3Rpb24uZG9fZW5jcnlwdCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIgIGRvX3R4X2NvbXBsZXRlOiAlZFxuIiwgbXNkdV9pbmZvLT5hY3Rpb24uZG9fdHhfY29tcGxldGUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiICBpc191bmljYXN0OiAldVxuIiwgbXNkdV9pbmZvLT5pbmZvLmlzX3VuaWNhc3QpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiICBpc191bmljYXN0OiAldVxuIiwgbXNkdV9pbmZvLT5pbmZvLmlzX3VuaWNhc3QpOworfQorCisvKj09PT09PT09PT09PT09PT0gdHggY29tcGxldGlvbiBtZXNzYWdlIGZpZWxkIGFjY2VzcyBtZXRob2RzID09PT09PT09PT09PT09PSovCisKKy8qKgorICogQGJyaWVmIExvb2sgdXAgdGhlIGRlc2NyaXB0b3IgSUQgb2YgdGhlIG50aCBNU0RVIGZyb20gYSB0eCBjb21wbGV0aW9uIG1zZy4KKyAqIEBkZXRhaWxzCisgKiAgQSB0eCBjb21wbGV0aW9uIG1lc3NhZ2UgdGVsbHMgdGhlIGhvc3QgdGhhdCB0aGUgdGFyZ2V0IGlzIGRvbmUKKyAqICB0cmFuc21pdHRpbmcgYSBzZXJpZXMgb2YgTVNEVXMuICBUaGUgbWVzc2FnZSB1c2VzIGEgZGVzY3JpcHRvciBJRAorICogIHRvIGlkZW50aWZ5IGVhY2ggc3VjaCBNU0RVLiAgVGhpcyBmdW5jdGlvbi9tYWNybyBpcyB1c2VkIHRvCisgKiAgZmluZCB0aGUgSUQgb2Ygb25lIHN1Y2ggTVNEVSByZWZlcmVuY2VkIGJ5IHRoZSB0eCBjb21wbGV0aW9uIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGl0ZXJhdG9yIC0gdHggY29tcGxldGlvbiBtZXNzYWdlIGNvbnRleHQgcHJvdmlkZWQgYnkgSFRUIHRvIHRoZQorICogICAgICB0eCBjb21wbGV0aW9uIG1lc3NhZ2UgaGFuZGxlci4gIFRoaXMgYWJzdHJhY3QgcmVmZXJlbmNlIHRvIHRoZQorICogICAgICBIVFQgdHggY29tcGxldGlvbiBtZXNzYWdlJ3MgcGF5bG9hZCBhbGxvd3MgdGhlIGRhdGEgU1cncyB0eAorICogICAgICBjb21wbGV0aW9uIGhhbmRsZXIgdG8gbm90IGNhcmUgYWJvdXQgdGhlIGZvcm1hdCBvZiB0aGUgSFRUCisgKiAgICAgIHR4IGNvbXBsZXRpb24gbWVzc2FnZS4KKyAqIEBwYXJhbSBudW0gLSAoemVyby1iYXNlZCkgaW5kZXggdG8gc3BlY2lmeSBhIHNpbmdsZSBNU0RVIHdpdGhpbiB0aGUKKyAqICAgICAgc2VyaWVzIG9mIE1TRFVzIHJlZmVyZW5jZWQgYnkgdGhlIHR4IGNvbXBsZXRpb24gbWVzc2FnZQorICogQHJldHVybiBkZXNjcmlwdG9yIElEIGZvciB0aGUgc3BlY2lmaWVkIE1TRFUKKyAqLwordWludDE2X3QgaHR0X3R4X2NvbXBsX2Rlc2NfaWQodm9pZCAqaXRlcmF0b3IsIGludCBudW0pOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT0gdHggZGVzY3JpcHRvciBvcGVyYXRpb25zID09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlIGEgSFRUIGFic3RyYWN0IHR4IGRlc2NyaXB0b3IuCisgKiBAZGV0YWlscworICogIEFsbG9jYXRlIGEgSFRUIGFic3RyYWN0IHR4IGRlc2NyaXB0b3IgZnJvbSBhIHBvb2wgd2l0aGluICJjb25zaXN0ZW50IgorICogIG1lbW9yeSwgd2hpY2ggaXMgYWNjZXNzaWJsZSBieSBISUYgYW5kL29yIE1BQyBETUEgYXMgd2VsbCBhcyBieSB0aGUKKyAqICBob3N0IENQVS4KKyAqICBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSB0eCBkYXRhcGF0aCB3aWxsIGFsbG9jYXRlIEhUVCB0eCBkZXNjcmlwdG9ycworICogIGFuZCBsaW5rIHRoZW0gd2l0aCBkYXRhcGF0aCBTVyB0eCBkZXNjcmlwdG9ycyB1cCBmcm9udCBhcyB0aGUgZHJpdmVyCisgKiAgaXMgbG9hZGVkLiAgVGhlcmVhZnRlciwgdGhlIGxpbmsgZnJvbSBkYXRhcGF0aCBTVyB0eCBkZXNjcmlwdG9yIHRvCisgKiAgSFRUIHR4IGRlc2NyaXB0b3Igd2lsbCBiZSBtYWludGFpbmVkIHVudGlsIHRoZSBkcml2ZXIgaXMgdW5sb2FkZWQuCisgKgorICogQHBhcmFtIGh0dF9wZGV2IC0gaGFuZGxlIHRvIHRoZSBIVFQgaW5zdGFuY2UgbWFraW5nIHRoZSBhbGxvY2F0aW9uCisgKiBAcGFyYW1bT1VUXSBwYWRkcl9sbyAtIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEhUVCBkZXNjcmlwdG9yCisgKiBAcmV0dXJuIHN1Y2Nlc3MgLT4gZGVzY3JpcHRvciBoYW5kbGUsIC1PUi0gZmFpbHVyZSAtPiBOVUxMCisgKi8KK3ZvaWQgKmh0dF90eF9kZXNjX2FsbG9jKGh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiwgdWludDMyX3QgKnBhZGRyX2xvKTsKKworLyoqCisgKiBAYnJpZWYgRnJlZSBhIEhUVCBhYnN0cmFjdCB0eCBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBodHRfcGRldiAtIGhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlIHRoYXQgbWFkZSB0aGUgYWxsb2NhdGlvbgorICogQHBhcmFtIGh0dF90eF9kZXNjIC0gdGhlIGRlc2NyaXB0b3IgdG8gZnJlZQorICovCit2b2lkIGh0dF90eF9kZXNjX2ZyZWUoaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2LCB2b2lkICpodHRfdHhfZGVzYyk7CisKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkKKy8qIFRPRE86IG9rYTogdXNlIGtlcm5lbC1kb2MgZm9ybWF0ICovCisvKioKKyAqIEBicmllZiBGcmVlIGEgSFRUIGFic3RyYWN0IHR4IGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIGh0dF9wZGV2IC0gaGFuZGxlIHRvIHRoZSBIVFQgaW5zdGFuY2UgdGhhdCBtYWRlIHRoZSBhbGxvY2F0aW9uCisgKiBAcGFyYW0gaHR0X3R4X2Rlc2MgLSB0aGUgZGVzY3JpcHRvciB0byBmcmVlCisgKi8KK3ZvaWQgKgoraHR0X3R4X2ZyYWdfYWxsb2MoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgdV9pbnQxNl90IGluZGV4LAorCQkgIHVfaW50MzJfdCAqZnJhZ19wYWRkcl9sbyk7CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisvKioKKyAqIEBicmllZiBEaXNjYXJkIGFsbCB0eCBmcmFtZXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZG93bmxvYWRlZC4KKyAqIEBkZXRhaWxzCisgKiBUaGlzIGZ1bmN0aW9uIGRpY2FyZHMgYW55IHR4IGZyYW1lcyBxdWV1ZWQgaW4gSFRUIG9yIHRoZSBsYXllcnMKKyAqIHVuZGVyIEhUVC4KKyAqIFRoZSBkb3dubG9hZCBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGludm9rZWQgb24gdGhlc2UgZnJhbWVzLgorICoKKyAqIEBwYXJhbSBodHRfcGRldiAtIGhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlCisgKiBAcGFyYW1bT1VUXSBmcmFnX3BhZGRyX2xvIC0gcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZnJhZ21lbnQgZGVzY3JpcHRvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNU0RVIExpbmsgRXh0ZW5zaW9uIERlc2NyaXB0b3IpCisgKi8KK3ZvaWQgaHR0X3R4X3BlbmRpbmdfZGlzY2FyZChodHRfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogQGJyaWVmIERvd25sb2FkIGEgTVNEVSBkZXNjcmlwdG9yIGFuZCAoYSBwb3J0aW9uIG9mKSB0aGUgTVNEVSBwYXlsb2FkLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aGluIExMIHN5c3RlbXMgdG8gZG93bmxvYWQgYSB0eCBkZXNjcmlwdG9yIGFuZAorICogIHRoZSBpbml0aWFsIHBvcnRpb24gb2YgdGhlIHR4IE1TRFUgcGF5bG9hZCwgYW5kIHdpdGhpbiBITCBzeXN0ZW1zIHRvCisgKiAgZG93bmxvYWQgdGhlIHR4IGRlc2NyaXB0b3IgYW5kIHRoZSBlbnRpcmUgdHggTVNEVSBwYXlsb2FkLgorICogIFRoZSBIVFQgbGF5ZXIgZGV0ZXJtaW5lcyBpbnRlcm5hbGx5IGhvdyBtdWNoIG9mIHRoZSB0eCBkZXNjcmlwdG9yCisgKiAgYWN0dWFsbHkgbmVlZHMgdG8gYmUgZG93bmxvYWRlZC4gSW4gcGFydGljdWxhciwgdGhlIEhUVCBsYXllciBkb2VzIG5vdAorICogIGRvd25sb2FkIHRoZSBmcmFnbWVudGF0aW9uIGRlc2NyaXB0b3IsIGFuZCBvbmx5IGZvciB0aGUgTEwgY2FzZSBkb3dubG9hZHMKKyAqICB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZnJhZ21lbnRhdGlvbiBkZXNjcmlwdG9yLgorICogIEluIEhMIHN5c3RlbXMsIHRoZSB0eCBkZXNjcmlwdG9yIGFuZCB0aGUgZW50aXJlIGZyYW1lIGFyZSBkb3dubG9hZGVkLgorICogIEluIExMIHN5c3RlbXMsIG9ubHkgdGhlIHR4IGRlc2NyaXB0b3IgYW5kIHRoZSBoZWFkZXIgb2YgdGhlIGZyYW1lIGFyZQorICogIGRvd25sb2FkZWQuICBUbyBkZXRlcm1pbmUgaG93IG11Y2ggb2YgdGhlIHR4IGZyYW1lIHRvIGRvd25sb2FkLCB0aGlzCisgKiAgZnVuY3Rpb24gYXNzdW1lcyB0aGUgdHggZnJhbWUgaXMgdGhlIGRlZmF1bHQgZnJhbWUgdHlwZSwgYXMgc3BlY2lmaWVkCisgKiAgYnkgb2xfY2ZnX2ZyYW1lX3R5cGUuICAiUmF3IiBmcmFtZXMgbmVlZCB0byBiZSB0cmFuc21pdHRlZCB0aHJvdWdoIHRoZQorICogIGFsdGVybmF0ZSBodHRfdHhfc2VuZF9ub25zdGQgZnVuY3Rpb24uCisgKiAgVGhlIHR4IGRlc2NyaXB0b3IgaGFzIGFscmVhZHkgYmVlbiBhdHRhY2hlZCB0byB0aGUgY2RmX25idWYgb2JqZWN0IGR1cmluZworICogIGEgcHJlY2VkaW5nIGNhbGwgdG8gaHR0X3R4X2Rlc2NfaW5pdC4KKyAqCisgKiBAcGFyYW0gaHR0X3BkZXYgLSB0aGUgaGFuZGxlIG9mIHRoZSBwaHlzaWNhbCBkZXZpY2Ugc2VuZGluZyB0aGUgdHggZGF0YQorICogQHBhcmFtIG1zZHUgLSB0aGUgZnJhbWUgYmVpbmcgdHJhbnNtaXR0ZWQKKyAqIEBwYXJhbSBtc2R1X2lkIC0gdW5pcXVlIElEIGZvciB0aGUgZnJhbWUgYmVpbmcgdHJhbnNtaXR0ZWQKKyAqIEByZXR1cm4gMCAtPiBzdWNjZXNzLCAtT1ItIDEgLT4gZmFpbHVyZQorICovCitpbnQKK2h0dF90eF9zZW5kX3N0ZChodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsIGNkZl9uYnVmX3QgbXNkdSwgdWludDE2X3QgbXNkdV9pZCk7CisKKy8qKgorICogQGJyaWVmIERvd25sb2FkIGEgQmF0Y2ggT2YgVHggTVNEVXMKKyAqIEBkZXRhaWxzCisgKiAgICAgRWFjaCBNU0RVIGFscmVhZHkgaGFzIHRoZSBNU0RVIElEIHN0b3JlZCBpbiB0aGUgaGVhZHJvb20gb2YgdGhlCisgKiAgICAgbmV0YnVmIGRhdGEgYnVmZmVyLCBhbmQgaGFzIHRoZSBIVFQgdHggZGVzY3JpcHRvciBhbHJlYWR5IGF0dGFjaGVkCisgKiAgICAgYXMgYSBwcmVmaXggZnJhZ21lbnQgdG8gdGhlIG5ldGJ1Zi4KKyAqCisgKiBAcGFyYW0gaHR0X3BkZXYgLSB0aGUgaGFuZGxlIG9mIHRoZSBwaHlzaWNhbCBkZXZpY2Ugc2VuZGluZyB0aGUgdHggZGF0YQorICogQHBhcmFtIGhlYWRfbXNkdSAtIHRoZSBNU0RVIEhlYWQgZm9yIFR4IGJhdGNoIGJlaW5nIHRyYW5zbWl0dGVkCisgKiBAcGFyYW0gbnVtX21zZHVzIC0gVGhlIHRvdGFsIE51bWJlciBvZiBNU0RVJ3MgcHJvdmlkZWQgZm9yIGJhdGNoIHR4CisgKiBAcmV0dXJuIG51bGwtdGVybWluYXRlZCBsaW5rZWQtbGlzdCBvZiB1bmFjY2VwdGVkIGZyYW1lcworICovCitjZGZfbmJ1Zl90CitodHRfdHhfc2VuZF9iYXRjaChodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsCisJCSAgY2RmX25idWZfdCBoZWFkX21zZHUsIGludCBudW1fbXNkdXMpOworCisvKiBUaGUgaHR0IHNjaGVkdWxlciBmb3IgcXVldWVkIHBhY2tldHMgaW4gaHR0CisgKiBodHQgd2hlbiB1bmFibGUgdG8gc2VuZCB0byBIVEMgYmVjYXVzZSBvZiBsYWNrIG9mIHJlc291cmNlCisgKiBmb3JtcyBhIG5idWYgcXVldWUgd2hpY2ggaXMgZmx1c2hlZCB3aGVuIHR4IGNvbXBsZXRpb24gZXZlbnQgZnJvbQorICogdGFyZ2V0IGlzIHJlY2lldmVkCisgKi8KKwordm9pZCBodHRfdHhfc2NoZWQoaHR0X3BkZXZfaGFuZGxlIHBkZXYpOworCisvKioKKyAqIEBicmllZiBTYW1lIGFzIGh0dF90eF9zZW5kX3N0ZCwgYnV0IGNhbiBoYW5kbGUgcmF3IGZyYW1lcy4KKyAqLworaW50CitodHRfdHhfc2VuZF9ub25zdGQoaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2LAorCQkgICBjZGZfbmJ1Zl90IG1zZHUsCisJCSAgIHVpbnQxNl90IG1zZHVfaWQsIGVudW0gaHR0X3BrdF90eXBlIHBrdF90eXBlKTsKKworLyoqCisgKiBodHRfcGt0X2RsX2xlbl9nZXQoKSBHZXRzIHRoZSBIVFQgUEtUIGRvd25sb2FkIGxlbmd0aC4KKyAqIEBwZGV2OiBwb2ludGVyIHRvIHN0cnVjdCBodHRfcGRldl90CisgKgorICogUmV0dXJuOiBzaXplIG9mIEhUVCBwYWNrZXQgZG93bmxvYWQgbGVuZ3RoLgorICovCitpbnQKK2h0dF9wa3RfZGxfbGVuX2dldChzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisKKyNkZWZpbmUgSFRUX1RYX0NMQVNTSUZZX0JJVF9TCTQgIC8qIFVzZWQgdG8gc2V0CisJCQkJICAgICogY2xhc3NpZnkgYml0IGluIEhUVCBkZXNjLiovCisKKy8qKgorICogZW51bSBodHRfY2VfdHhfcGt0X3R5cGUgLSBlbnVtIG9mIHBhY2tldCB0eXBlcyB0byBiZSBzZXQgaW4gQ0UKKyAqCQkJICAgICBkZXNjcmlwdG9yCisgKiBAdHhfcGt0X3R5cGVfcmF3OiBWYWx1ZSBzZXQgZm9yIFJBVyBmcmFtZXMKKyAqIEB0eF9wa3RfdHlwZV9uYXRpdmVfd2lmaTogVmFsdWUgc2V0IGZvciBOQVRJVkUgV0lGSSBmcmFtZXMKKyAqIEB0eF9wa3RfdHlwZV9ldGgyOiBWYWx1ZSBzZXQgZm9yIEV0aGVybmV0IElJIGZyYW1lcyAobW9zdGx5IGRlZmF1bHQpCisgKiBAdHhfcGt0X3R5cGVfODAyXzM6IFZhbHVlIHNldCBmb3IgODAyLjMgLyBvcmlnaW5hbCBldGhlcm5ldCBmcmFtZXMKKyAqIEB0eF9wa3RfdHlwZV9tZ210OiBWYWx1ZSBzZXQgZm9yIE1HTVQgZnJhbWVzIG92ZXIgSFRUCisgKgorICovCitlbnVtIGh0dF9jZV90eF9wa3RfdHlwZSB7CisJdHhfcGt0X3R5cGVfcmF3ID0gMCwKKwl0eF9wa3RfdHlwZV9uYXRpdmVfd2lmaSA9IDEsCisJdHhfcGt0X3R5cGVfZXRoMiA9IDIsCisJdHhfcGt0X3R5cGVfODAyXzMgPSAzLAorCXR4X3BrdF90eXBlX21nbXQgPSA0Cit9OworCisKK2V4dGVybiBjb25zdCB1aW50MzJfdCBodHRfdG9fY2VfcGt0X3R5cGVbXTsKKworLyoqCisgKiBQcm92aWRlIGEgY29uc3RhbnQgdG8gc3BlY2lmeSB0aGUgb2Zmc2V0IG9mIHRoZSBIVFQgcG9ydGlvbiBvZiB0aGUKKyAqIEhUVCB0eCBkZXNjcmlwdG9yLCB0byBhdm9pZCBoYXZpbmcgdG8gZXhwb3J0IHRoZSBkZXNjcmlwdG9yIGRlZmludGlvbi4KKyAqIFRoZSBodHQgbW9kdWxlIGNoZWNrcyBpbnRlcm5hbGx5IHRoYXQgdGhpcyBleHBvcnRlZCBvZmZzZXQgaXMgY29uc2lzdGVudAorICogd2l0aCB0aGUgcHJpdmF0ZSB0eCBkZXNjcmlwdG9yIGRlZmluaXRpb24uCisgKgorICogU2ltaWxhcmx5LCBleHBvcnQgYSBkZWZpbml0aW9uIG9mIHRoZSBIVFQgdHggZGVzY3JpcHRvciBzaXplLCBhbmQgdGhlbgorICogY2hlY2sgaW50ZXJuYWxseSB0aGF0IHRoaXMgZXhwb3J0ZWQgY29uc3RhbnQgbWF0Y2hlcyB0aGUgcHJpdmF0ZSB0eAorICogZGVzY3JpcHRvciBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIEhUVF9UWF9ERVNDX1ZBRERSX09GRlNFVCA4CisKKy8qKgorICogaHR0X3R4X2Rlc2NfaW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgcGVyIHBhY2tldCBIVFQgVHggZGVzY3JpcHRvcgorICogQHBkZXY6CQkgIFRoZSBoYW5kbGUgb2YgdGhlIHBoeXNpY2FsIGRldmljZSBzZW5kaW5nIHRoZQorICoJCQkgIHR4IGRhdGEKKyAqIEBodHRfdHhfZGVzYzoJICBBYnN0cmFjdCBoYW5kbGUgdG8gdGhlIHR4IGRlc2NyaXB0b3IKKyAqIEBodHRfdHhfZGVzY19wYWRkcl9sbzogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgSFRUIHR4IGRlc2NyaXB0b3IKKyAqIEBtc2R1X2lkOgkJICBJRCB0byB0YWcgdGhlIGRlc2NyaXB0b3Igd2l0aC4KKyAqCQkJICBUaGUgRlcgc2VuZHMgdGhpcyBJRCBiYWNrIHRvIGhvc3QgYXMgYSBjb29raWUKKyAqCQkJICBkdXJpbmcgVHggY29tcGxldGlvbiwgd2hpY2ggdGhlIGhvc3QgdXNlcyB0bworICoJCQkgIGlkZW50aWZ5IHRoZSBNU0RVLgorICoJCQkgIFRoaXMgSUQgaXMgYW4gaW5kZXggaW50byB0aGUgT0wgVHggZGVzYy4gYXJyYXkuCisgKiBAbXNkdToJCSAgVGhlIE1TRFUgdGhhdCBpcyBiZWluZyBwcmVwYXJlZCBmb3IgdHJhbnNtaXNzaW9uCisgKiBAbXNkdV9pbmZvOgkJICBUeCBNU0RVIG1ldGEtZGF0YQorICogQHRzb19pbmZvOgkJICBTdG9yYWdlIGZvciBUU08gbWV0YS1kYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgSFRUIHR4IGRlc2NyaXB0b3IuCisgKiBIVFQgVHggZGVzY3JpcHRvciBpcyBhIGhvc3QtZi93IGludGVyZmFjZSBzdHJ1Y3R1cmUsIGFuZCBtZXRhLWRhdGEKKyAqIGFjY29tcGFueWluZyBldmVyeSBwYWNrZXQgZG93bmxvYWRlZCB0byBmL3cgdmlhIHRoZSBIVFQgaW50ZXJmYWNlLgorICovCitzdGF0aWMgaW5saW5lCit2b2lkCitodHRfdHhfZGVzY19pbml0KGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgdm9pZCAqaHR0X3R4X2Rlc2MsCisJCSB1aW50MzJfdCBodHRfdHhfZGVzY19wYWRkcl9sbywKKwkJIHVpbnQxNl90IG1zZHVfaWQsCisJCSBjZGZfbmJ1Zl90IG1zZHUsIHN0cnVjdCBodHRfbXNkdV9pbmZvX3QgKm1zZHVfaW5mbywKKwkJIHN0cnVjdCBjZGZfdHNvX2luZm9fdCAqdHNvX2luZm8sCisJCSBzdHJ1Y3Qgb2NiX3R4X2N0cmxfaGRyX3QgKnR4X2N0cmwsCisJCSB1aW50OF90IGlzX2RzcmMpCit7CisJdWludDhfdCAgcGt0X3R5cGUsIHBrdF9zdWJ0eXBlID0gMCwgY2VfcGt0X3R5cGUgPSAwOworCXVpbnQzMl90IGh3X2NsYXNzaWZ5ID0gMCwgZGF0YV9hdHRyID0gMDsKKwl1aW50MzJfdCAqd29yZDAsICp3b3JkMSwgbG9jYWxfd29yZDM7CisjaWYgSFRUX1BBRERSNjQKKwl1aW50MzJfdCAqd29yZDQ7CisjZWxzZSAvKiAhIEhUVF9QQUREUjY0ICovCisJdWludDMyX3QgKndvcmQzOworI2VuZGlmIC8qIEhUVF9QQUREUjY0ICovCisJdWludDMyX3QgbG9jYWxfd29yZDAsIGxvY2FsX3dvcmQxOworCXN0cnVjdCBodHRfaG9zdF90eF9kZXNjX3QgKmh0dF9ob3N0X3R4X2Rlc2MgPQorCQkoc3RydWN0IGh0dF9ob3N0X3R4X2Rlc2NfdCAqKQorCQkoKChjaGFyICopaHR0X3R4X2Rlc2MpIC0gSFRUX1RYX0RFU0NfVkFERFJfT0ZGU0VUKTsKKwlib29sIGRlc2NfZXh0X3JlcXVpcmVkID0gKHR4X2N0cmwgJiYgdHhfY3RybC0+YWxsX2ZsYWdzICE9IDApOworCisJd29yZDAgPSAodWludDMyX3QgKikgaHR0X3R4X2Rlc2M7CisJd29yZDEgPSB3b3JkMCArIDE7CisJLyoKKwkgKiB3b3JkMiBpcyBmcmFnIGRlc2MgcG9pbnRlcgorCSAqIHdvcmQzIG9yIDQgaXMgcGVlcl9pZAorCSAqLworI2lmIEhUVF9QQUREUjY0CisJd29yZDQgPSB3b3JkMCArIDQ7ICAgICAgLyogRHdvcmQgMyAqLworI2Vsc2UgLyogISBIVFRfUEFERFI2NCAgKi8KKwl3b3JkMyA9IHdvcmQwICsgMzsgICAgICAvKiBEd29yZCAzICovCisjZW5kaWYgLyogSFRUX1BBRERSNjQgKi8KKworCXBrdF90eXBlID0gbXNkdV9pbmZvLT5pbmZvLmwyX2hkcl90eXBlOworCisJaWYgKGNkZl9saWtlbHkocGRldi0+Y2ZnLmNlX2NsYXNzaWZ5X2VuYWJsZWQpKSB7CisJCWlmIChjZGZfbGlrZWx5KHBrdF90eXBlID09IGh0dF9wa3RfdHlwZV9ldGgyIHx8CisJCQlwa3RfdHlwZSA9PSBodHRfcGt0X3R5cGVfZXRoZXJuZXQpKQorCQkJY2RmX25idWZfdHhfaW5mb19nZXQobXNkdSwgcGt0X3R5cGUsIHBrdF9zdWJ0eXBlLAorCQkJCSAgICAgaHdfY2xhc3NpZnkpOworCisJCWNlX3BrdF90eXBlID0gaHR0X3RvX2NlX3BrdF90eXBlW3BrdF90eXBlXTsKKwkJaWYgKDB4ZmZmZmZmZmYgPT0gY2VfcGt0X3R5cGUpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSJJbnZhbGlkIEhUVCBwa3QgdHlwZSAlZFxuIiwgcGt0X3R5cGUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBIVFQgVHggRGVzYyBpcyBpbiB1bmNhY2hlZCBtZW1vcnkuIFVzZWQgY2FjaGVkIHdyaXRlcyBwZXIgd29yZCwgdG8KKwkgKiByZWR1Y2UgdW5uZWNlc3NhcnkgbWVtb3J5IGFjY2Vzcy4KKwkgKi8KKworCWxvY2FsX3dvcmQwID0gMDsKKwlpZiAobXNkdV9pbmZvKSB7CisJCUhUVF9IMlRfTVNHX1RZUEVfU0VUKGxvY2FsX3dvcmQwLCBIVFRfSDJUX01TR19UWVBFX1RYX0ZSTSk7CisJCUhUVF9UWF9ERVNDX1BLVF9UWVBFX1NFVChsb2NhbF93b3JkMCwgcGt0X3R5cGUpOworCQlIVFRfVFhfREVTQ19QS1RfU1VCVFlQRV9TRVQobG9jYWxfd29yZDAsIHBrdF9zdWJ0eXBlKTsKKwkJSFRUX1RYX0RFU0NfVkRFVl9JRF9TRVQobG9jYWxfd29yZDAsIG1zZHVfaW5mby0+aW5mby52ZGV2X2lkKTsKKwkJaWYgKHR4X2N0cmwgJiYgdHhfY3RybC0+dmFsaWRfdGlkKQorCQkJSFRUX1RYX0RFU0NfRVhUX1RJRF9TRVQobG9jYWxfd29yZDAsIHR4X2N0cmwtPmV4dF90aWQpOworCQllbHNlCisJCQlIVFRfVFhfREVTQ19FWFRfVElEX1NFVChsb2NhbF93b3JkMCwKKwkJCQltc2R1X2luZm8tPmluZm8uZXh0X3RpZCk7CisJCUhUVF9UWF9ERVNDX0VYVEVOU0lPTl9TRVQobG9jYWxfd29yZDAsIGRlc2NfZXh0X3JlcXVpcmVkKTsKKwkJSFRUX1RYX0RFU0NfRVhUX1RJRF9TRVQobG9jYWxfd29yZDAsIG1zZHVfaW5mby0+aW5mby5leHRfdGlkKTsKKwkJSFRUX1RYX0RFU0NfQ0tTVU1fT0ZGTE9BRF9TRVQobG9jYWxfd29yZDAsCisJCQkJCSAgICAgIG1zZHVfaW5mby0+YWN0aW9uLmNrc3VtX29mZmxvYWQpOworCQlIVFRfVFhfREVTQ19OT19FTkNSWVBUX1NFVChsb2NhbF93b3JkMCwKKwkJCQkJICAgbXNkdV9pbmZvLT5hY3Rpb24uZG9fZW5jcnlwdCA/CisJCQkJCSAgIDAgOiAxKTsKKwl9CisKKwkqd29yZDAgPSBsb2NhbF93b3JkMDsKKworCWxvY2FsX3dvcmQxID0gMDsKKworI2lmIGRlZmluZWQoRkVBVFVSRV9UU08pCisJaWYgKHRzb19pbmZvLT5pc190c28pCisJCUhUVF9UWF9ERVNDX0ZSTV9MRU5fU0VUKGxvY2FsX3dvcmQxLCB0c29faW5mby0+dG90YWxfbGVuKTsKKwllbHNlCisjZW5kaWYKKwkJSFRUX1RYX0RFU0NfRlJNX0xFTl9TRVQobG9jYWxfd29yZDEsIGNkZl9uYnVmX2xlbihtc2R1KSk7CisKKwlIVFRfVFhfREVTQ19GUk1fSURfU0VUKGxvY2FsX3dvcmQxLCBtc2R1X2lkKTsKKwkqd29yZDEgPSBsb2NhbF93b3JkMTsKKworCS8qIEluaXRpYWxpemUgcGVlcl9pZCB0byBJTlZBTElEX1BFRVIgYmVjYXVzZQorCSAgIHRoaXMgaXMgTk9UIFJlaW5qZWN0aW9uIHBhdGggKi8KKwlsb2NhbF93b3JkMyA9IEhUVF9JTlZBTElEX1BFRVI7CisJaWYgKHR4X2N0cmwgJiYgdHhfY3RybC0+Y2hhbm5lbF9mcmVxKQorCQlIVFRfVFhfREVTQ19DSEFOX0ZSRVFfU0VUKGxvY2FsX3dvcmQzLCB0eF9jdHJsLT5jaGFubmVsX2ZyZXEpOworI2lmIEhUVF9QQUREUjY0CisJKndvcmQ0ID0gbG9jYWxfd29yZDM7CisjZWxzZSAvKiAhIEhUVF9QQUREUjY0ICovCisJKndvcmQzID0gbG9jYWxfd29yZDM7CisjZW5kaWYgLyogSFRUX1BBRERSNjQgKi8KKworCS8qCisJICogIElmIGFueSBvZiB0aGUgdHggY29udHJvbCBmbGFncyBhcmUgc2V0LCB0aGVuIHdlIG5lZWQgdGhlIGV4dGVuZGVkCisJICogIEhUVCBoZWFkZXIuCisJICovCisJaWYgKGRlc2NfZXh0X3JlcXVpcmVkKSB7CisJCXN0cnVjdCBodHRfdHhfbXNkdV9kZXNjX2V4dF90IGxvY2FsX2Rlc2NfZXh0ID0gezB9OworCisJCS8qCisJCSAqIENvcHkgdGhlIGluZm8gdGhhdCB3YXMgcmVhZCBmcm9tIFRYIGNvbnRyb2wgaGVhZGVyIGZyb20gdGhlCisJCSAqIHVzZXIgYXBwbGljYXRpb24gdG8gdGhlIGV4dGVuZGVkIEhUVCBoZWFkZXIuCisJCSAqIEZpcnN0IGNvcHkgZXZlcnl0aGluZworCQkgKiB0byBhIGxvY2FsIHRlbXAgc3RydWN0dXJlLCBhbmQgdGhlbiBjb3B5IGV2ZXJ5dGhpbmcgdG8gdGhlCisJCSAqIGFjdHVhbCB1bmNhY2hlZCBzdHJ1Y3R1cmUgaW4gb25lIGdvIHRvIHNhdmUgbWVtb3J5IHdyaXRlcy4KKwkJICovCisJCWxvY2FsX2Rlc2NfZXh0LnZhbGlkX3B3ciA9IHR4X2N0cmwtPnZhbGlkX3B3cjsKKwkJbG9jYWxfZGVzY19leHQudmFsaWRfbWNzX21hc2sgPSB0eF9jdHJsLT52YWxpZF9kYXRhcmF0ZTsKKwkJbG9jYWxfZGVzY19leHQudmFsaWRfcmV0cmllcyA9IHR4X2N0cmwtPnZhbGlkX3JldHJpZXM7CisJCWxvY2FsX2Rlc2NfZXh0LnZhbGlkX2V4cGlyZV90c2YgPSB0eF9jdHJsLT52YWxpZF9leHBpcmVfdHNmOworCQlsb2NhbF9kZXNjX2V4dC52YWxpZF9jaGFpbm1hc2sgPSB0eF9jdHJsLT52YWxpZF9jaGFpbl9tYXNrOworCisJCWxvY2FsX2Rlc2NfZXh0LnB3ciA9IHR4X2N0cmwtPnB3cjsKKwkJaWYgKHR4X2N0cmwtPnZhbGlkX2RhdGFyYXRlICYmCisJCQkJdHhfY3RybC0+ZGF0YXJhdGUgPD0gaHR0X29mZG1fZGF0YXJhdGVfbWF4KQorCQkJbG9jYWxfZGVzY19leHQubWNzX21hc2sgPQorCQkJCSgxIDw8ICh0eF9jdHJsLT5kYXRhcmF0ZSArIDQpKTsKKwkJbG9jYWxfZGVzY19leHQucmV0cnlfbGltaXQgPSB0eF9jdHJsLT5yZXRyeV9saW1pdDsKKwkJbG9jYWxfZGVzY19leHQuZXhwaXJlX3RzZl9sbyA9IHR4X2N0cmwtPmV4cGlyZV90c2ZfbG87CisJCWxvY2FsX2Rlc2NfZXh0LmV4cGlyZV90c2ZfaGkgPSB0eF9jdHJsLT5leHBpcmVfdHNmX2hpOworCQlsb2NhbF9kZXNjX2V4dC5jaGFpbl9tYXNrID0gdHhfY3RybC0+Y2hhaW5fbWFzazsKKworCQlsb2NhbF9kZXNjX2V4dC5pc19kc3JjID0gKGlzX2RzcmMgIT0gMCk7CisKKwkJY2RmX25idWZfcHVzaF9oZWFkKG1zZHUsIHNpemVvZihsb2NhbF9kZXNjX2V4dCkpOworCQljZGZfbWVtX2NvcHkoY2RmX25idWZfZGF0YShtc2R1KSwgJmxvY2FsX2Rlc2NfZXh0LAorCQkJCXNpemVvZihsb2NhbF9kZXNjX2V4dCkpOworCX0KKworCS8qCisJICogU3BlY2lmeSB0aGF0IHRoZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBPUyBpcyBhIGJ5dGVzdHJlYW0sCisJICogYW5kIHRodXMgc2hvdWxkIG5vdCBiZSBieXRlLXN3YXBwZWQgZHVyaW5nIHRoZSBISUYgZG93bmxvYWQKKwkgKiBldmVuIGlmIHRoZSBob3N0IGlzIGJpZy1lbmRpYW4uCisJICogVGhlcmUgY291bGQgYmUgZXh0cmEgZnJhZ21lbnRzIGFkZGVkIGJlZm9yZSB0aGUgT1MncyBmcmFnbWVudHMsCisJICogZS5nLiBmb3IgVFNPLCBzbyBpdCdzIGluY29ycmVjdCB0byBjbGVhciB0aGUgZnJhZyAwIHdvcmRzdHJlYW0gZmxhZy4KKwkgKiBJbnN0ZWFkLCBjbGVhciB0aGUgd29yZHN0cmVhbSBmbGFnIGZvciB0aGUgZmluYWwgZnJhZ21lbnQsIHdoaWNoCisJICogaXMgY2VydGFpbiB0byBiZSAob25lIG9mIHRoZSkgZnJhZ21lbnQocykgcHJvdmlkZWQgYnkgdGhlIE9TLgorCSAqIFNldHRpbmcgdGhlIGZsYWcgZm9yIHRoaXMgZmluYWwgZnJhZ21lbnQgc3VmZmljZXMgZm9yIHNwZWNpZnlpbmcKKwkgKiBhbGwgZnJhZ21lbnRzIHByb3ZpZGVkIGJ5IHRoZSBPUyByYXRoZXIgdGhhbiBhZGRlZCBieSB0aGUgZHJpdmVyLgorCSAqLworCWNkZl9uYnVmX3NldF9mcmFnX2lzX3dvcmRzdHJlYW0obXNkdSwgY2RmX25idWZfZ2V0X251bV9mcmFncyhtc2R1KSAtIDEsCisJCQkJCTApOworCisJLyogc3RvcmUgYSBsaW5rIHRvIHRoZSBIVFQgdHggZGVzY3JpcHRvciB3aXRoaW4gdGhlIG5ldGJ1ZiAqLworCWNkZl9uYnVmX2ZyYWdfcHVzaF9oZWFkKG1zZHUsIHNpemVvZihzdHJ1Y3QgaHR0X2hvc3RfdHhfZGVzY190KSwKKwkJCQkoY2hhciAqKWh0dF9ob3N0X3R4X2Rlc2MsIC8qIHZpcnR1YWwgYWRkciAqLworCQkJCWh0dF90eF9kZXNjX3BhZGRyX2xvLAorCQkJCTAgLyogcGh5cyBhZGRyIE1TQnMgLSBuL2EgKi8pOworCisJLyoKKwkgKiBJbmRpY2F0ZSB0aGF0IHRoZSBIVFQgaGVhZGVyIChhbmQgSFRDIGhlYWRlcikgaXMgYSBtZXRhLWRhdGEKKwkgKiAid29yZHN0cmVhbSIsIGkuZS4gc2VyaWVzIG9mIHVpbnQzMl90LCByYXRoZXIgdGhhbiBhIGRhdGEKKwkgKiBieXRlc3RyZWFtLgorCSAqIFRoaXMgYWxsb3dzIHRoZSBISUYgZG93bmxvYWQgdG8gYnl0ZXN3YXAgdGhlIEhUVCArIEhUQyBoZWFkZXJzIGlmCisJICogdGhlIGhvc3QgaXMgYmlnLWVuZGlhbiwgdG8gY29udmVydCB0byB0aGUgdGFyZ2V0J3MgbGl0dGxlLWVuZGlhbgorCSAqIGZvcm1hdC4KKwkgKi8KKwljZGZfbmJ1Zl9zZXRfZnJhZ19pc193b3Jkc3RyZWFtKG1zZHUsIDAsIDEpOworCisJaWYgKGNkZl9saWtlbHkocGRldi0+Y2ZnLmNlX2NsYXNzaWZ5X2VuYWJsZWQgJiYKKwkJKG1zZHVfaW5mby0+aW5mby5sMl9oZHJfdHlwZSAhPSBodHRfcGt0X3R5cGVfbWdtdCkpKSB7CisJCXVpbnQzMl90IHBrdF9vZmZzZXQgPSBjZGZfbmJ1Zl9nZXRfZnJhZ19sZW4obXNkdSwgMCk7CisJCWRhdGFfYXR0ciA9IGh3X2NsYXNzaWZ5IDw8IENERl9DRV9UWF9DTEFTU0lGWV9CSVRfUzsKKwkJZGF0YV9hdHRyIHw9IGNlX3BrdF90eXBlIDw8IENERl9DRV9UWF9QS1RfVFlQRV9CSVRfUzsKKwkJZGF0YV9hdHRyIHw9IHBrdF9vZmZzZXQgIDw8IENERl9DRV9UWF9QS1RfT0ZGU0VUX0JJVF9TOworCX0KKworCWNkZl9uYnVmX2RhdGFfYXR0cl9zZXQobXNkdSwgZGF0YV9hdHRyKTsKK30KKworLyoqCisgKiBAYnJpZWYgU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBNU0RVIGluIHF1ZXN0aW9uIHdhcyBwb3N0cG9uZWQuCisgKiBAZGV0YWlscworICogIEluIHN5c3RlbXMgaW4gd2hpY2ggdGhlIGhvc3QgcmV0YWlucyBpdHMgdHggZnJhbWUgdW50aWwgdGhlIHRhcmdldCBzZW5kcworICogIGEgdHggY29tcGxldGlvbiwgdGhlIHRhcmdldCBoYXMgdGhlIG9wdGlvbiBvZiBkaXNjYXJkaW5nIGl0J3MgY29weSBvZgorICogIHRoZSB0eCBkZXNjcmlwdG9yIChhbmQgZnJhbWUsIGZvciBITCkgYW5kIHNlbmRpbmcgYSAicG9zdHBvbmUiIG1lc3NhZ2UKKyAqICB0byB0aGUgaG9zdCwgdG8gaW5mb3JtIHRoZSBob3N0IHRoYXQgaXQgbXVzdCBldmVudHVhbGx5IGRvd25sb2FkIHRoZQorICogIHR4IGRlc2NyaXB0b3IgKGFuZCBmcmFtZSwgZm9yIEhMKS4KKyAqICBCZWZvcmUgdGhlIGhvc3QgZG93bmxvYWRzIHRoZSBwb3N0cG9uZWQgdHggZGVzYy9mcmFtZSBhZ2FpbiwgaXQgd2lsbCB1c2UKKyAqICB0aGlzIGZ1bmN0aW9uIHRvIHNldCBhIGZsYWcgaW4gdGhlIEhUVCB0eCBkZXNjcmlwdG9yIGluZGljYXRpbmcgdGhhdCB0aGlzCisgKiAgaXMgYSByZS1zZW5kIG9mIGEgcG9zdHBvbmVkIGZyYW1lLCByYXRoZXIgdGhhbiBhIG5ldyBmcmFtZS4gIFRoZSB0YXJnZXQKKyAqICB1c2VzIHRoaXMgZmxhZyB0byBrZWVwIHRoZSBjb3JyZWN0IG9yZGVyIGJldHdlZW4gcmUtc2VudCBhbmQgbmV3IHR4IGZyYW1lcy4KKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50IGZvciBMTCBzeXN0ZW1zLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIGhhbmRsZSBvZiB0aGUgcGh5c2ljYWwgZGV2aWNlIHNlbmRpbmcgdGhlIHR4IGRhdGEKKyAqIEBwYXJhbSBkZXNjIC0gYWJzdHJhY3QgaGFuZGxlIHRvIHRoZSB0eCBkZXNjcmlwdG9yCisgKi8KK3ZvaWQgaHR0X3R4X2Rlc2NfZmxhZ19wb3N0cG9uZWQoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKmRlc2MpOworCisvKioKKyAqIEBicmllZiBTZXQgYSBmbGFnIHRvIHRlbGwgdGhlIHRhcmdldCB0aGF0IG1vcmUgdHggZG93bmxvYWRzIGFyZSBlbiByb3V0ZS4KKyAqIEBkZXRhaWxzCisgKiAgQXQgdGltZXMsIHBhcnRpY3VsYXJseSBpbiByZXNwb25zZSB0byBhIFUtQVBTRCB0cmlnZ2VyIGluIGEgSEwgc3lzdGVtLCB0aGUKKyAqICBob3N0IHdpbGwgZG93bmxvYWQgbXVsdGlwbGUgdHggZGVzY3JpcHRvcnMgKCsgZnJhbWVzLCBpbiBITCkgaW4gYSBiYXRjaC4KKyAqICBUaGUgaG9zdCB3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNldCBhICJtb3JlIiBmbGFnIGluIHRoZSBpbml0aWFsCisgKiAgYW5kIGludGVyaW9yIGZyYW1lcyBvZiB0aGUgYmF0Y2gsIHRvIHRlbGwgdGhlIHRhcmdldCB0aGF0IG1vcmUgdHggZnJhbWUKKyAqICBkb3dubG9hZHMgd2l0aGluIHRoZSBiYXRjaCBhcmUgaW1taW5lbnQuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgaGFuZGxlIG9mIHRoZSBwaHlzaWNhbCBkZXZpY2Ugc2VuZGluZyB0aGUgdHggZGF0YQorICogQHBhcmFtIGRlc2MgLSBhYnN0cmFjdCBoYW5kbGUgdG8gdGhlIHR4IGRlc2NyaXB0b3IKKyAqLwordm9pZCBodHRfdHhfZGVzY19mbGFnX2JhdGNoX21vcmUoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKmRlc2MpOworCisvKioKKyAqIEBicmllZiBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIGluIHRoZSBmcmFnbWVudGF0aW9uIGRlc2NyaXB0b3IuCisgKiBAZGV0YWlscworICogIFNwZWNpZnkgdGhlIG51bWJlciBvZiBmcmFnbWVudHMgd2l0aGluIHRoZSBNU0RVLCBpLmUuIHRoZSBudW1iZXIgb2YKKyAqICBlbGVtZW50cyB3aXRoaW4gdGhlIGZyYWdtZW50YXRpb24gZGVzY3JpcHRvci4KKyAqICBGb3IgTEwsIHRoaXMgaXMgdXNlZCB0byB0ZXJtaW5hdGUgdGhlIGxpc3Qgb2YgZnJhZ21lbnRzIHVzZWQgYnkgdGhlCisgKiAgSFcncyB0eCBNQUMgRE1BLgorICogIEZvciBITCwgdGhpcyBpcyB1c2VkIHRvIHRlcm1pbmF0ZSB0aGUgbGlzdCBvZiBmcmFnbWVudHMgcHJvdmlkZWQgdG8KKyAqICBIVEMgZm9yIGRvd25sb2FkLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIGhhbmRsZSBvZiB0aGUgcGh5c2ljYWwgZGV2aWNlIHNlbmRpbmcgdGhlIHR4IGRhdGEKKyAqIEBwYXJhbSBkZXNjIC0gYWJzdHJhY3QgaGFuZGxlIHRvIHRoZSB0eCBkZXNjcmlwdG9yCisgKiBAcGFyYW0gbnVtX2ZyYWdzIC0gdGhlIG51bWJlciBvZiBmcmFnbWVudHMgY29tcHJpc2luZyB0aGUgTVNEVQorICovCitzdGF0aWMgaW5saW5lCit2b2lkCitodHRfdHhfZGVzY19udW1fZnJhZ3MoaHR0X3BkZXZfaGFuZGxlIHBkZXYsIHZvaWQgKmRlc2MsIHVpbnQzMl90IG51bV9mcmFncykKK3sKKwkvKgorCSAqIFNldCB0aGUgZWxlbWVudCBhZnRlciB0aGUgdmFsaWQgZnJhZyBlbGVtcyB0byAweDAsCisJICogdG8gdGVybWluYXRlIHRoZSBsaXN0IG9mIGZyYWdtZW50cy4KKwkgKi8KKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkKKwlpZiAoSFRUX1dJRklfSVAocGRldiwgMiwgMCkpIHsKKwkJLyoqIFNraXAgVFNPIHJlbGF0ZWQgNCBkd29yZHMgV0lGSTIuMCovCisJCWRlc2MgPSAodm9pZCAqKSYoKChzdHJ1Y3QgbXNkdV9leHRfZGVzY190ICopZGVzYyktPmZyYWdfcHRyMCk7CisJCS8qIEZyYWcgcHRyIGlzIDQ4IGJpdCB3aWRlIHNvIGNsZWFyIHRoZSBuZXh0IGR3b3JkIGFzIHdlbGwgKi8KKwkJKigodWludDMyX3QgKikoKChjaGFyICopZGVzYykgKyAobnVtX2ZyYWdzIDw8IDMpKSkgPSAwOworCQkqKCh1aW50MzJfdCAqKQorCQkgICgoKGNoYXIgKilkZXNjKSArIChudW1fZnJhZ3MgPDwgMykgKyBzaXplb2YodWludDMyX3QpKSkgPSAwOworCQkvKiBUT0RPOiBPS0E6IHJlbW92ZSB0aGUgbWFnaWMgY29uc3RhbnRzICovCisJfSBlbHNlIHsKKwkJLyogWFhYT0tBIC0tIExvb2tzIGxpa2UgYSBidWcsIGNhbGxlZCB3aXRoIGh0dF9mcmFnX2Rlc2MgKi8KKwkJKigodV9pbnQzMl90ICopCisJCSAgKCgoY2hhciAqKSBkZXNjKSArIEhUVF9UWF9ERVNDX0xFTiArIG51bV9mcmFncyAqIDgpKSA9IDA7CisJfQorI2Vsc2UgLyogISBIRUxJVU1QTFVTX1BBRERSNjQgKi8KKwkqKCh1aW50MzJfdCAqKQorCSAgKCgoY2hhciAqKWRlc2MpICsgSFRUX1RYX0RFU0NfTEVOICsgbnVtX2ZyYWdzICogOCkpID0gMDsKKyNlbmRpZiAvKiBIRUxJVU1QTFVTX1BBRERSNjQgKi8KK30KKworLyogY2hlY2tzdW0gb2ZmbG9hZCBmbGFncyBmb3IgaHcgKi8KKyNkZWZpbmUgSVBWNF9DU1VNX0VOICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFVEUF9JUFY0X0NTVU1fRU4gMHgwMDAyMDAwMAorI2RlZmluZSBVRFBfSVBWNl9DU1VNX0VOIDB4MDAwNDAwMDAKKyNkZWZpbmUgVENQX0lQVjRfQ1NVTV9FTiAweDAwMDgwMDAwCisjZGVmaW5lIFRDUF9JUFY2X0NTVU1fRU4gMHgwMDEwMDAwMAorI2RlZmluZSBQQVJUSUFMX0NTVU1fRU4gIDB4MDAyMDAwMDAKKworLyoqCisgKiBAYnJpZWYgU3BlY2lmeSB0aGUgbG9jYXRpb24gYW5kIHNpemUgb2YgYSBmcmFnbWVudCBvZiBhIHR4IE1TRFUuCisgKiBAZGV0YWlscworICogIEluIExMIHN5c3RlbXMsIHRoZSB0eCBNQUMgRE1BIG5lZWRzIHRvIGtub3cgaG93IHRoZSBNU0RVIGlzIGNvbnN0cnVjdGVkCisgKiAgZnJvbSBmcmFnbWVudHMuCisgKiAgSW4gTEwgYW5kIEhMIHN5c3RlbXMsIHRoZSBISUYncyBkb3dubG9hZCBETUEgdG8gdGhlIHRhcmdldCAoTEw6IHR4IGRlc2MKKyAqICArIGhlYWRlciBvZiB0eCBwYXlsb2FkOyBITDogdHggZGVzYyArIGVudGlyZSB0eCBwYXlsb2FkKSBuZWVkcyB0byBrbm93CisgKiAgd2hlcmUgdG8gZmluZCB0aGUgZnJhZ21lbnRzIHRvIGRvd25sb2FkLgorICogIFRoZSB0eCBkYXRhIFNXIHVzZXMgdGhpcyBmdW5jdGlvbiB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZgorICogIGVhY2ggb2YgdGhlIE1TRFUncyBmcmFnbWVudHMuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgaGFuZGxlIG9mIHRoZSBwaHlzaWNhbCBkZXZpY2Ugc2VuZGluZyB0aGUgdHggZGF0YQorICogQHBhcmFtIGRlc2MgLSBhYnN0cmFjdCBoYW5kbGUgdG8gdGhlIEhUVCB0eCBkZXNjcmlwdG9yCisgKiBAcGFyYW0gZnJhZ19udW0gLSB3aGljaCBmcmFnbWVudCBpcyBiZWluZyBzcGVjaWZpZWQgKHplcm8tYmFzZWQgaW5kZXhpbmcpCisgKiBAcGFyYW0gZnJhZ19waHlzX2FkZHIgLSBETUEvcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZnJhZ21lbnQKKyAqIEBwYXJhbSBmcmFnX2xlbiAtIG51bWJlciBvZiBieXRlcyB3aXRoaW4gdGhlIGZyYWdtZW50CisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQKK2h0dF90eF9kZXNjX2ZyYWcoaHR0X3BkZXZfaGFuZGxlIHBkZXYsCisJCSB2b2lkICpkZXNjLAorCQkgaW50IGZyYWdfbnVtLCB1aW50MzJfdCBmcmFnX3BoeXNfYWRkciwgdWludDE2X3QgZnJhZ19sZW4pCit7CisJdV9pbnQzMl90ICp3b3JkOworCisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpCisJaWYgKEhUVF9XSUZJX0lQKHBkZXYsIDIsIDApKSB7CisJCXdvcmQgPSAodV9pbnQzMl90ICopKGRlc2MpOworCQkvKiBJbml0aWFsaXplIHRvcCA2IHdvcmRzIG9mIFRTTyBmbGFncyBwZXIgcGFja2V0ICovCisJCSp3b3JkKysgPSAwOworCQkqd29yZCsrID0gMDsKKwkJKndvcmQrKyA9IDA7CisJCWlmICgoKHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKikocGRldi0+Y3RybF9wZGV2KSkKKwkJICAgIC0+aXBfdGNwX3VkcF9jaGVja3N1bV9vZmZsb2FkKQorCQkJKndvcmQgfD0gKElQVjRfQ1NVTV9FTiB8IFRDUF9JUFY0X0NTVU1fRU4gfAorCQkJCQlUQ1BfSVBWNl9DU1VNX0VOIHwgVURQX0lQVjRfQ1NVTV9FTiB8CisJCQkJCVVEUF9JUFY2X0NTVU1fRU4pOworCQllbHNlCisJCQkqd29yZCA9IDA7CisJCXdvcmQrKzsKKwkJKndvcmQrKyA9IDA7CisJCSp3b3JkKysgPSAwOworCisJCWNkZl9hc3NlcnRfYWx3YXlzKHdvcmQgPT0gJigoKHN0cnVjdCBtc2R1X2V4dF9kZXNjX3QgKikKKwkJCQkJICAgICBkZXNjKS0+ZnJhZ19wdHIwKSk7CisKKwkJLyogRWFjaCBmcmFnbWVudCBjb25zdW1lcyAyIERXT1JEUyAqLworCQl3b3JkICs9IChmcmFnX251bSA8PCAxKTsKKwkJKndvcmQgPSBmcmFnX3BoeXNfYWRkcjsKKworCQl3b3JkKys7CisJCSp3b3JkID0gKGZyYWdfbGVuPDwxNik7CisKKwl9IGVsc2UgeworCQkvKiBGb3IgSGVsaXVtKywgdGhpcyBibG9jayBjYW5ub3QgZXhpc3QgKi8KKwkJQ0RGX0FTU0VSVCgwKTsKKwl9CisjZWxzZSAvKiAhZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisJd29yZCA9ICh1aW50MzJfdCAqKSAoKChjaGFyICopZGVzYykgKyBIVFRfVFhfREVTQ19MRU4gKyBmcmFnX251bSAqIDgpOworCSp3b3JkID0gZnJhZ19waHlzX2FkZHI7CisJd29yZCsrOworCSp3b3JkID0gZnJhZ19sZW47CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCit9CisKK3ZvaWQgaHR0X3R4X2Rlc2NfZnJhZ3NfdGFibGVfc2V0KGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSB2b2lkICpkZXNjLAorCQkJCSB1aW50MzJfdCBwYWRkciwKKwkJCQkgdWludDMyX3QgZnJhZ19kZXNjX3BhZGRyX2xvLAorCQkJCSBpbnQgcmVzZXQpOworCisvKioKKyAqIEBicmllZiBTcGVjaWZ5IHRoZSB0eXBlIGFuZCBzdWJ0eXBlIG9mIGEgdHggZnJhbWUuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgaGFuZGxlIG9mIHRoZSBwaHlzaWNhbCBkZXZpY2Ugc2VuZGluZyB0aGUgdHggZGF0YQorICogQHBhcmFtIHR5cGUgLSBmb3JtYXQgb2YgdGhlIE1TRFUgKDgwMi4zLCBuYXRpdmUgV2lGaSwgcmF3LCBvciBtZ210KQorICogQHBhcmFtIHN1Yl90eXBlIC0gc3ViX3R5cGUgKHJlbGV2YW50IGZvciByYXcgZnJhbWVzKQorICovCitzdGF0aWMgaW5saW5lCit2b2lkCitodHRfdHhfZGVzY190eXBlKGh0dF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgdm9pZCAqaHR0X3R4X2Rlc2MsIGVudW0gd2xhbl9mcm1fZm10IHR5cGUsIHVpbnQ4X3Qgc3ViX3R5cGUpCit7CisJdWludDMyX3QgKndvcmQwOworCisJd29yZDAgPSAodWludDMyX3QgKikgaHR0X3R4X2Rlc2M7CisJLyogY2xlYXIgb2xkIHZhbHVlcyAqLworCSp3b3JkMCAmPSB+KEhUVF9UWF9ERVNDX1BLVF9UWVBFX00gfCBIVFRfVFhfREVTQ19QS1RfU1VCVFlQRV9NKTsKKwkvKiB3cml0ZSBuZXcgdmFsdWVzICovCisJSFRUX1RYX0RFU0NfUEtUX1RZUEVfU0VUKCp3b3JkMCwgdHlwZSk7CisJSFRUX1RYX0RFU0NfUEtUX1NVQlRZUEVfU0VUKCp3b3JkMCwgc3ViX3R5cGUpOworfQorCisvKioqKiogVFggTUdNVCBERVNDIG1hbmFnZW1lbnQgQVBJcyAqKioqLworCisvKiBOdW1iZXIgb2YgbWdtdCBkZXNjcmlwdG9ycyBpbiB0aGUgcG9vbCAqLworI2RlZmluZSBIVFRfTUFYX05VTV9NR01UX0RFU0NTIDMyCisKKy8qKiBodHRfdHhfbWdtdF9kZXNjX3Bvb2xfYWxsb2MKKyAqIEBkZXNjcmlwdGlvbiAtIGFsbG9jYXRlcyB0aGUgbWVtb3J5IGZvciBtZ210IGZyYW1lIGRlc2NyaXB0b3JzCisgKiBAcGFyYW0gIC0gaHR0IHBkZXYgb2JqZWN0CisgKiBAcGFyYW0gIC0gbnVtIG9mIGRlc2NyaXB0b3JzIHRvIGJlIGFsbG9jYXRlZCBpbiB0aGUgcG9vbAorICovCit2b2lkIGh0dF90eF9tZ210X2Rlc2NfcG9vbF9hbGxvYyhzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwgQV9VSU5UMzIgbnVtX2VsZW1zKTsKKworLyoqIGh0dF90eF9tZ210X2Rlc2NfYWxsb2MKKyAqIEBkZXNjcmlwdGlvbiAtIHJlc2VydmVzIGEgbWdtdCBkZXNjcmlwdG9yIGZyb20gdGhlIHBvb2wKKyAqIEBwYXJhbSAgLSBodHQgcGRldiBvYmplY3QKKyAqIEBwYXJhbSAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGFsbG9jYXRlZCBkZXNjIGlkCisgKiBAcGFyYW0gIC0gcG9pbnRlciB0byB0aGUgbWFtYW5nZW1lbnQgZnJvbSBVTUFDCisgKiBAcmV0dXJuIC0gcG9pbnRlciB0aGUgYWxsb2NhdGVkIG1nbXQgZGVzY3JpcHRvcgorICovCitjZGZfbmJ1Zl90CitodHRfdHhfbWdtdF9kZXNjX2FsbG9jKHN0cnVjdCBodHRfcGRldl90ICpwZGV2LCBBX1VJTlQzMiAqZGVzY19pZCwKKwkJICAgICAgIGNkZl9uYnVmX3QgbWdtdF9mcm0pOworCisvKiogaHR0X3R4X21nbXRfZGVzY19mcmVlCisgKiBAZGVzY3JpcHRpb24gLSByZWxlYXNlcyB0aGUgbWFuYWdlbWVudCBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIHBvb2wKKyAqIEBwYXJhbSAgLSBodHQgcGRldiBvYmplY3QKKyAqIEBwYXJhbSAgLSBkZXNjcmlwdG9yIElECisgKi8KK3ZvaWQKK2h0dF90eF9tZ210X2Rlc2NfZnJlZShzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldiwgQV9VSU5UOCBkZXNjX2lkLAorCQkgICAgICBBX1VJTlQzMiBzdGF0dXMpOworCisvKiogaHR0X3R4X21nbXRfZGVzY19wb29sX2ZyZWUKKyAqIEBkZXNjcmlwdGlvbiAtIHJlbGVhc2VzIGFsbCB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgbWdtdCBkZXNjIHBvb2wKKyAqIEBwYXJhbSAgLSBodHQgcGRldiBvYmplY3QKKyAqLwordm9pZCBodHRfdHhfbWdtdF9kZXNjX3Bvb2xfZnJlZShzdHJ1Y3QgaHR0X3BkZXZfdCAqcGRldik7CisKKy8qKgorICogQGJyaWVmIFByb3ZpZGUgYSBidWZmZXIgdG8gc3RvcmUgYSA4MDIuMTEgaGVhZGVyIGFkZGVkIGJ5IFNXIHR4IGVuY2FwCisgKgorICogQHBhcmFtIGh0dF90eF9kZXNjIC0gd2hpY2ggZnJhbWUgdGhlIDgwMi4xMSBoZWFkZXIgaXMgYmVpbmcgYWRkZWQgdG8KKyAqIEBwYXJhbSBuZXdfbDJfaGRyX3NpemUgLSBob3cgbGFyZ2UgdGhlIGJ1ZmZlciBuZWVkcyB0byBiZQorICovCisjZGVmaW5lIGh0dF90eF9kZXNjX21wZHVfaGVhZGVyKGh0dF90eF9kZXNjLCBuZXdfbDJfaGRyX3NpemUpIC8qTlVMTCovCisvKioKKyAqIEBicmllZiBIb3cgbWFueSB0eCBjcmVkaXRzIHdvdWxkIGJlIGNvbnN1bWVkIGJ5IHRoZSBzcGVjaWZpZWQgdHggZnJhbWUuCisgKgorICogQHBhcmFtIG1zZHUgLSB0aGUgdHggZnJhbWUgaW4gcXVlc3Rpb24KKyAqIEByZXR1cm4gbnVtYmVyIG9mIGNyZWRpdHMgdXNlZCBmb3IgdGhpcyB0eCBmcmFtZQorICovCisjZGVmaW5lIGh0dF90eF9tc2R1X2NyZWRpdChtc2R1KSAxICAgICAgLyogMSBjcmVkaXQgcGVyIGJ1ZmZlciAqLworI2lmZGVmIEhUVF9EQkcKK3ZvaWQgaHR0X3R4X2Rlc2NfZGlzcGxheSh2b2lkICp0eF9kZXNjKTsKKyNlbHNlCisjZGVmaW5lIGh0dF90eF9kZXNjX2Rpc3BsYXkodHhfZGVzYykKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgaHR0X3R4X2Rlc2Nfc2V0X3BlZXJfaWQodm9pZCAqaHR0X3R4X2Rlc2MsIHVpbnQxNl90IHBlZXJfaWQpCit7CisJdWludDE2X3QgKnBlZXJfaWRfZmllbGRfcHRyOworCisJcGVlcl9pZF9maWVsZF9wdHIgPSAodWludDE2X3QgKikKKwkJCSAgICAoaHR0X3R4X2Rlc2MgKworCQkJICAgICBIVFRfVFhfREVTQ19QRUVSSURfREVTQ19QQUREUl9PRkZTRVRfQllURVMpOworCisJKnBlZXJfaWRfZmllbGRfcHRyID0gcGVlcl9pZDsKK30KKworc3RhdGljIGlubGluZQordm9pZCBodHRfdHhfZGVzY19zZXRfY2hhbmZyZXEodm9pZCAqaHR0X3R4X2Rlc2MsIHVpbnQxNl90IGNoYW5mcmVxKQoreworCXVpbnQxNl90ICpjaGFuZnJlcV9maWVsZF9wdHI7CisKKwkvKiBUaGUgcmVhc29uIHdlIGRvbnQgdXNlIENIQU5fRlJFUV9PRkZTRVRfQllURVMgaXMgYmVjYXVzZQorCSAgIGl0IHVzZXMgRFdPUkQgYXMgdW5pdCAqLworCS8qIFRoZSByZWFzb24gd2UgZG9udCB1c2UgdGhlIFNFVCBtYWNybyBpbiBodHQuaCBpcyBiZWNhdXNlCisJICAgaHR0X3R4X2Rlc2MgaXMgaW5jb21wbGV0ZSB0eXBlICovCisJY2hhbmZyZXFfZmllbGRfcHRyID0gKHVpbnQxNl90ICopCisJCShodHRfdHhfZGVzYyArCisJCSBIVFRfVFhfREVTQ19QRUVSSURfREVTQ19QQUREUl9PRkZTRVRfQllURVMKKwkJICsgc2l6ZW9mKEFfVUlOVDE2KSk7CisKKwkqY2hhbmZyZXFfZmllbGRfcHRyID0gY2hhbmZyZXE7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfVFNPKQordm9pZAoraHR0X3R4X2Rlc2NfZmlsbF90c29faW5mbyhodHRfcGRldl9oYW5kbGUgcGRldiwgdm9pZCAqZGVzYywKKwkgc3RydWN0IGNkZl90c29faW5mb190ICp0c29faW5mbyk7CisjZWxzZQorI2RlZmluZSBodHRfdHhfZGVzY19maWxsX3Rzb19pbmZvKHBkZXYsIGRlc2MsIHRzb19pbmZvKQorI2VuZGlmCisjZW5kaWYgLyogX09MX0hUVF9UWF9BUElfX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL29sL2luYy9vbF9vc2lmX2FwaS5oIGIvY29yZS9kcC9vbC9pbmMvb2xfb3NpZl9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQ0YTVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9vbC9pbmMvb2xfb3NpZl9hcGkuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBAZmlsZSBvbF9vc2lmX2FwaS5oCisgKiBAYnJpZWYgRGVmaW5pdGlvbnMgdXNlZCBpbiBtdWx0aXBsZSBleHRlcm5hbCBpbnRlcmZhY2VzIHRvIHRoZSB0eHJ4IFNXLgorICovCisjaWZuZGVmIF9PTF9PU0lGX0FQSV9fSF8KKyNkZWZpbmUgX09MX09TSUZfQVBJX19IXworCisvKioKKyAqIEB0eXBlZGVmIG9sX29zaWZfdmRldl9oYW5kbGUKKyAqIEBicmllZiBvcGFxdWUgaGFuZGxlIGZvciBPUyBzaGltIHZpcnR1YWwgZGV2aWNlIG9iamVjdAorICovCitzdHJ1Y3Qgb2xfb3NpZl92ZGV2X3Q7Cit0eXBlZGVmIHN0cnVjdCBvbF9vc2lmX3ZkZXZfdCAqb2xfb3NpZl92ZGV2X2hhbmRsZTsKKworI2VuZGlmIC8qIF9PTF9PU0lGX0FQSV9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvb2wvaW5jL29sX3BhcmFtcy5oIGIvY29yZS9kcC9vbC9pbmMvb2xfcGFyYW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllZmYyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvb2wvaW5jL29sX3BhcmFtcy5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogRGVmaW50aW9ucyBmb3IgdGhlIEF0aGVyb3MgV2lyZWxlc3MgTEFOIGNvbnRyb2xsZXIgZHJpdmVyLgorICovCisjaWZuZGVmIF9ERVZfT0xfUEFSQU1TX0gKKyNkZWZpbmUgX0RFVl9PTF9QQVJBTVNfSAorI2luY2x1ZGUgIm9sX3R4cnhfc3RhdHMuaCIKKyNpbmNsdWRlICJ3bGFuX2RlZnMuaCIgICAgICAgICAgLyogZm9yIHdsYW4gc3RhdHN0IGRlZmluaXRpb25zICovCisvKgorKiogRW51bWVyYXRpb24gb2YgUERFViBDb25maWd1cmF0aW9uIHBhcmFtZXRlcgorKi8KKworZW51bSBvbF9hdGhfcGFyYW1fdCB7CisJT0xfQVRIX1BBUkFNX1RYQ0hBSU5NQVNLID0gMCwKKwlPTF9BVEhfUEFSQU1fUlhDSEFJTk1BU0ssCisJT0xfQVRIX1BBUkFNX1RYQ0hBSU5NQVNLTEVHQUNZLAorCU9MX0FUSF9QQVJBTV9SWENIQUlOTUFTS0xFR0FDWSwKKwlPTF9BVEhfUEFSQU1fQ0hBSU5NQVNLX1NFTCwKKwlPTF9BVEhfUEFSQU1fQU1QRFUsCisJT0xfQVRIX1BBUkFNX0FNUERVX0xJTUlULAorCU9MX0FUSF9QQVJBTV9BTVBEVV9TVUJGUkFNRVMsCisJT0xfQVRIX1BBUkFNX0xEUEMsCisJT0xfQVRIX1BBUkFNX05PTl9BR0dfU1dfUkVUUllfVEgsCisJT0xfQVRIX1BBUkFNX0FHR19TV19SRVRSWV9USCwKKwlPTF9BVEhfUEFSQU1fU1RBX0tJQ0tPVVRfVEgsCisJT0xfQVRIX1BBUkFNX1dMQU5fUFJPRl9FTkFCTEUsCisJT0xfQVRIX1BBUkFNX0xUUl9FTkFCTEUsCisJT0xfQVRIX1BBUkFNX0xUUl9BQ19MQVRFTkNZX0JFLAorCU9MX0FUSF9QQVJBTV9MVFJfQUNfTEFURU5DWV9CSywKKwlPTF9BVEhfUEFSQU1fTFRSX0FDX0xBVEVOQ1lfVkksCisJT0xfQVRIX1BBUkFNX0xUUl9BQ19MQVRFTkNZX1ZPLAorCU9MX0FUSF9QQVJBTV9MVFJfQUNfTEFURU5DWV9USU1FT1VULAorCU9MX0FUSF9QQVJBTV9MVFJfVFhfQUNUSVZJVFlfVElNRU9VVCwKKwlPTF9BVEhfUEFSQU1fTFRSX1NMRUVQX09WRVJSSURFLAorCU9MX0FUSF9QQVJBTV9MVFJfUlhfT1ZFUlJJREUsCisJT0xfQVRIX1BBUkFNX0wxU1NfRU5BQkxFLAorCU9MX0FUSF9QQVJBTV9EU0xFRVBfRU5BQkxFLAorCU9MX0FUSF9QQVJBTV9QQ0lFTFBfVFhCVUZfRkxVU0gsCisJT0xfQVRIX1BBUkFNX1BDSUVMUF9UWEJVRl9XQVRFUk1BUkssCisJT0xfQVRIX1BBUkFNX1BDSUVMUF9UWEJVRl9UTU9fRU4sCisJT0xfQVRIX1BBUkFNX1BDSUVMUF9UWEJVRl9UTU9fVkFMVUUsCisJT0xfQVRIX1BBUkFNX0JDTl9CVVJTVCwKKwlPTF9BVEhfUEFSQU1fQVJQX0FDX09WRVJSSURFLAorCU9MX0FUSF9QQVJBTV9UWFBPV0VSX0xJTUlUMkcsCisJT0xfQVRIX1BBUkFNX1RYUE9XRVJfTElNSVQ1RywKKwlPTF9BVEhfUEFSQU1fVFhQT1dFUl9TQ0FMRSwKKwlPTF9BVEhfUEFSQU1fRENTLAorCU9MX0FUSF9QQVJBTV9BTklfRU5BQkxFLAorCU9MX0FUSF9QQVJBTV9BTklfUE9MTF9QRVJJT0QsCisJT0xfQVRIX1BBUkFNX0FOSV9MSVNURU5fUEVSSU9ELAorCU9MX0FUSF9QQVJBTV9BTklfT0ZETV9MRVZFTCwKKwlPTF9BVEhfUEFSQU1fQU5JX0NDS19MRVZFTCwKKwlPTF9BVEhfUEFSQU1fUFJPWFlTVEEsCisJT0xfQVRIX1BBUkFNX0RZTl9UWF9DSEFJTk1BU0ssCisJT0xfQVRIX1BBUkFNX1ZPV19FWFRfU1RBVFMsCisJT0xfQVRIX1BBUkFNX1BXUl9HQVRJTkdfRU5BQkxFLAorCU9MX0FUSF9QQVJBTV9DSEFUVEVSLAorfTsKKworLyoKKyoqIEVudW1lcmF0aW9uIG9mIFBERVYgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyovCisKK2VudW0gb2xfaGFsX3BhcmFtX3QgeworCU9MX0hBTF9DT05GSUdfRE1BX0JFQUNPTl9SRVNQT05TRV9USU1FID0gMAorfTsKKworLyoKKyoqIHN0cnVjdHVyZSB0byBob2xkIGFsbCBzdGF0cyBpbmZvcm1hdGlvbgorKiogZm9yIG9mZmxvYWQgZGV2aWNlIGludGVyZmFjZQorKi8KK3N0cnVjdCBvbF9zdGF0cyB7CisJaW50IHR4cnhfc3RhdHNfbGV2ZWw7CisJc3RydWN0IG9sX3R4cnhfc3RhdHMgdHhyeF9zdGF0czsKKwlzdHJ1Y3Qgd2xhbl9kYmdfc3RhdHMgc3RhdHM7Cit9OworI2VuZGlmIC8qIF9ERVZfT0xfUEFSQU1TX0ggICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL29sL2luYy9vbF90eHJ4X2FwaS5oIGIvY29yZS9kcC9vbC9pbmMvb2xfdHhyeF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODlkNDllCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9vbC9pbmMvb2xfdHhyeF9hcGkuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBAZmlsZSBvbF90eHJ4X2FwaS5oCisgKiBAYnJpZWYgRGVmaW5pdGlvbnMgdXNlZCBpbiBtdWx0aXBsZSBleHRlcm5hbCBpbnRlcmZhY2VzIHRvIHRoZSB0eHJ4IFNXLgorICovCisjaWZuZGVmIF9PTF9UWFJYX0FQSV9fSF8KKyNkZWZpbmUgX09MX1RYUlhfQVBJX19IXworCisvKioKKyAqIEB0eXBlZGVmIG9sX3R4cnhfcGRldl9oYW5kbGUKKyAqIEBicmllZiBvcGFxdWUgaGFuZGxlIGZvciB0eHJ4IHBoeXNpY2FsIGRldmljZSBvYmplY3QKKyAqLworc3RydWN0IG9sX3R4cnhfcGRldl90OwordHlwZWRlZiBzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKm9sX3R4cnhfcGRldl9oYW5kbGU7CisKKy8qKgorICogQHR5cGVkZWYgb2xfdHhyeF92ZGV2X2hhbmRsZQorICogQGJyaWVmIG9wYXF1ZSBoYW5kbGUgZm9yIHR4cnggdmlydHVhbCBkZXZpY2Ugb2JqZWN0CisgKi8KK3N0cnVjdCBvbF90eHJ4X3ZkZXZfdDsKK3R5cGVkZWYgc3RydWN0IG9sX3R4cnhfdmRldl90ICpvbF90eHJ4X3ZkZXZfaGFuZGxlOworCisvKioKKyAqIEB0eXBlZGVmIG9sX3R4cnhfcGVlcl9oYW5kbGUKKyAqIEBicmllZiBvcGFxdWUgaGFuZGxlIGZvciB0eHJ4IHBlZXIgb2JqZWN0CisgKi8KK3N0cnVjdCBvbF90eHJ4X3BlZXJfdDsKK3R5cGVkZWYgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpvbF90eHJ4X3BlZXJfaGFuZGxlOworCisvKioKKyAqIEBicmllZiBBRERCQSBuZWdvdGlhdGlvbiBzdGF0dXMsIHVzZWQgYm90aCBkdXJpbmcgcmVxdWVzdHMgYW5kIGNvbmZpcm1hdGlvbnMKKyAqLworZW51bSBvbF9hZGRiYV9zdGF0dXMgeworCS8qIHN0YXR1czogbmVnb3RpYXRpb24gc3RhcnRlZCBvciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJb2xfYWRkYmFfc3VjY2VzcywKKworCS8qIHJlamVjdDogYWdncmVnYXRpb24gaXMgbm90IGFwcGxpY2FibGUgLSBkb24ndCB0cnkgYWdhaW4gKi8KKwlvbF9hZGRiYV9yZWplY3QsCisKKwkvKiBidXN5OiBBRERCQSBuZWdvdGlhdGlvbiBjb3VsZG4ndCBiZSBwZXJmb3JtZWQgLSB0cnkgYWdhaW4gbGF0ZXIgKi8KKwlvbF9hZGRiYV9idXN5LAorfTsKKworZW51bSBvbF9zZWNfdHlwZSB7CisJb2xfc2VjX3R5cGVfbm9uZSwKKwlvbF9zZWNfdHlwZV93ZXAxMjgsCisJb2xfc2VjX3R5cGVfd2VwMTA0LAorCW9sX3NlY190eXBlX3dlcDQwLAorCW9sX3NlY190eXBlX3RraXAsCisJb2xfc2VjX3R5cGVfdGtpcF9ub21pYywKKwlvbF9zZWNfdHlwZV9hZXNfY2NtcCwKKwlvbF9zZWNfdHlwZV93YXBpLAorCisJLyoga2VlcCB0aGlzIGxhc3QhICovCisJb2xfc2VjX3R5cGVfdHlwZXMKK307CisKKy8qKgorICogQGVudW0gb2xfdHhfc3BlYworICogQGJyaWVmIGluZGljYXRlIHdoYXQgbm9uLXN0YW5kYXJkIHRyYW5zbWlzc2lvbiBhY3Rpb25zIHRvIGFwcGx5CisgKiBAZGV0YWlscworICogIEluZGljYXRlIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAtIFRoZSB0eCBmcmFtZSBhbHJlYWR5IGhhcyBhIGNvbXBsZXRlIDgwMi4xMSBoZWFkZXIuCisgKiAgICAgIFRodXMsIHNraXAgODAyLjMvbmF0aXZlLVdpRmkgdG8gODAyLjExIGhlYWRlciBlbmNhcHN1bGF0aW9uIGFuZAorICogICAgICBBLU1TRFUgYWdncmVnYXRpb24uCisgKiAgICAtIFRoZSB0eCBmcmFtZSBzaG91bGQgbm90IGJlIGFnZ3JlZ2F0ZWQgKEEtTVBEVSBvciBBLU1TRFUpCisgKiAgICAtIFRoZSB0eCBmcmFtZSBpcyBhbHJlYWR5IGVuY3J5cHRlZCAtIGRvbid0IGF0dGVtcHQgZW5jcnlwdGlvbi4KKyAqICAgIC0gVGhlIHR4IGZyYW1lIGlzIGEgc2VnbWVudCBvZiBhIFRDUCBqdW1ibyBmcmFtZS4KKyAqICAgIC0gVGhpcyB0eCBmcmFtZSBzaG91bGQgbm90IGJlIHVubWFwcGVkIGFuZCBmcmVlZCBieSB0aGUgdHhyeCBsYXllcgorICogICAgICBhZnRlciB0cmFuc21pc3Npb24sIGJ1dCBpbnN0ZWFkIGdpdmVuIHRvIGEgcmVnaXN0ZXJlZCB0eCBjb21wbGV0aW9uCisgKiAgICAgIGNhbGxiYWNrLgorICogIE1vcmUgdGhhbiBvbmUgb2YgdGhlc2Ugc3BlY2lmaWNhdGlvbiBjYW4gYXBwbHksIHRob3VnaCB0eXBpY2FsbHkKKyAqICBvbmx5IGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaXMgYXBwbGllZCB0byBhIHR4IGZyYW1lLgorICogIEEgY29tcG91bmQgc3BlY2lmaWNhdGlvbiBjYW4gYmUgY3JlYXRlZCwgYXMgYSBiaXQtT1Igb2YgdGhlc2UKKyAqICBzcGVjaWZpY2F0aW9ucy4KKyAqLworZW51bSBvbF90eF9zcGVjIHsKKwlvbF90eF9zcGVjX3N0ZCA9IDB4MCwgICAvKiBkbyByZWd1bGFyIHByb2Nlc3NpbmcgKi8KKwlvbF90eF9zcGVjX3JhdyA9IDB4MSwgICAvKiBza2lwIGVuY2FwICsgQS1NU0RVIGFnZ3IgKi8KKwlvbF90eF9zcGVjX25vX2FnZ3IgPSAweDIsICAgICAgIC8qIHNraXAgZW5jYXAgKyBhbGwgYWdnciAqLworCW9sX3R4X3NwZWNfbm9fZW5jcnlwdCA9IDB4NCwgICAgLyogc2tpcCBlbmNhcCArIGVuY3J5cHQgKi8KKwlvbF90eF9zcGVjX3RzbyA9IDB4OCwgICAvKiBUQ1Agc2VnbWVudGVkICovCisJb2xfdHhfc3BlY19ud2lmaV9ub19lbmNyeXB0ID0gMHgxMCwgICAgIC8qIHNraXAgZW5jcnlwdCBmb3IgbndpZmkgKi8KKwlvbF90eF9zcGVjX25vX2ZyZWUgPSAweDIwLCAgICAgIC8qIGdpdmUgdG8gY2IgcmF0aGVyIHRoYW4gZnJlZSAqLworfTsKKworI2VuZGlmIC8qIF9PTF9UWFJYX0FQSV9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvb2wvaW5jL29sX3R4cnhfY3RybF9hcGkuaCBiL2NvcmUvZHAvb2wvaW5jL29sX3R4cnhfY3RybF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQ1Y2YxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9vbC9pbmMvb2xfdHhyeF9jdHJsX2FwaS5oCkBAIC0wLDAgKzEsMTMxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBAZmlsZSBvbF90eHJ4X2N0cmxfYXBpLmgKKyAqIEBicmllZiBEZWZpbmUgdGhlIGhvc3QgZGF0YSBBUEkgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGUgaG9zdCBjb250cm9sIFNXLgorICovCisjaWZuZGVmIF9PTF9UWFJYX0NUUkxfQVBJX19IXworI2RlZmluZSBfT0xfVFhSWF9DVFJMX0FQSV9fSF8KKworI2luY2x1ZGUgPGF0aGRlZnMuaD4gICAgICAgICAgICAvKiBBX1NUQVRVUyAqLworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90ICovCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+ICAgICAgICAgIC8qIGNkZl9kZXZpY2VfdCAqLworI2luY2x1ZGUgPGh0Y19hcGkuaD4gICAgICAgICAgICAvKiBIVENfSEFORExFICovCisKKyNpbmNsdWRlIDxvbF9vc2lmX2FwaS5oPiAgICAgICAgLyogb2xfb3NpZl92ZGV2X2hhbmRsZSAqLworI2luY2x1ZGUgPG9sX3R4cnhfYXBpLmg+ICAgICAgICAvKiBvbF90eHJ4X3BkZXZfaGFuZGxlLCBldGMuICovCisjaW5jbHVkZSA8b2xfY3RybF9hcGkuaD4gICAgICAgIC8qIG9sX3BkZXZfaGFuZGxlLCBvbF92ZGV2X2hhbmRsZSAqLworCisjaW5jbHVkZSA8d2xhbl9kZWZzLmg+ICAgICAgICAgIC8qIE1BWF9TUEFUSUFMX1NUUkVBTSAqLworCisjZGVmaW5lIE9MX0FUSF9UWF9EUkFJTl9XQUlUX0RFTEFZIDUwCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHN0YXRpb24gc3VwcG9ydGVkIGJ5IGRhdGEgcGF0aCwgaW5jbHVkaW5nIEJDLiAqLworI2RlZmluZSBXTEFOX01BWF9TVEFfQ09VTlQgIChIQUxfTlVNX1NUQSkKKworLyogVGhlIHN5bWJvbGljIHN0YXRpb24gSUQgcmV0dXJuIHRvIEhERCB0byBzcGVjaWZ5IHRoZSBwYWNrZXQgaXMgYmMvbWMgKi8KKyNkZWZpbmUgV0xBTl9SWF9CQ01DX1NUQV9JRCAoV0xBTl9NQVhfU1RBX0NPVU5UICsgMSkKKworLyogVGhlIHN5bWJvbGljIHN0YXRpb24gSUQgcmV0dXJuIHRvIEhERCB0byBzcGVjaWZ5IHRoZSBwYWNrZXQgaXMKKyAgICAgICB0byBzb2Z0LUFQIGl0c2VsZiAqLworI2RlZmluZSBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRCAoV0xBTl9NQVhfU1RBX0NPVU5UICsgMikKKworLyoqCisgKiBlbnVtIHdsYW5fb3BfbW9kZSAtIFZpcnR1YWwgZGV2aWNlIG9wZXJhdGlvbiBtb2RlCisgKgorICogQHdsYW5fb3BfbW9kZV91bmtub3duOiBVbmtub3duIG1vZGUKKyAqIEB3bGFuX29wX21vZGVfYXA6IEFQIG1vZGUKKyAqIEB3bGFuX29wX21vZGVfaWJzczogSUJTUyBtb2RlCisgKiBAd2xhbl9vcF9tb2RlX3N0YTogU1RBIChjbGllbnQpIG1vZGUKKyAqIEB3bGFuX29wX21vZGVfbW9uaXRvcjogTW9uaXRvciBtb2RlCisgKiBAd2xhbl9vcF9tb2RlX29jYjogT0NCIG1vZGUKKyAqLworZW51bSB3bGFuX29wX21vZGUgeworCXdsYW5fb3BfbW9kZV91bmtub3duLAorCXdsYW5fb3BfbW9kZV9hcCwKKwl3bGFuX29wX21vZGVfaWJzcywKKwl3bGFuX29wX21vZGVfc3RhLAorCXdsYW5fb3BfbW9kZV9tb25pdG9yLAorCXdsYW5fb3BfbW9kZV9vY2IsCit9OworCisjZGVmaW5lIE9MX1RYUV9QQVVTRV9SRUFTT05fRlcgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgT0xfVFhRX1BBVVNFX1JFQVNPTl9QRUVSX1VOQVVUSE9SSVpFRCAoMSA8PCAxKQorI2RlZmluZSBPTF9UWFFfUEFVU0VfUkVBU09OX1RYX0FCT1JUICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIE9MX1RYUV9QQVVTRV9SRUFTT05fVkRFVl9TVE9QICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgT0xfVFhRX1BBVVNFX1JFQVNPTl9USEVSTUFMX01JVElHQVRJT04gKDEgPDwgNCkKKworCisvKioKKyAqIGVudW0gbmV0aWZfYWN0aW9uX3R5cGUgLSBUeXBlIG9mIGFjdGlvbnMgb24gbmV0aWYgcXVldWVzCisgKiBAV0xBTl9TVE9QX0FMTF9ORVRJRl9RVUVVRTogc3RvcCBhbGwgbmV0aWYgcXVldWVzCisgKiBAV0xBTl9TVEFSVF9BTExfTkVUSUZfUVVFVUU6IHN0YXJ0IGFsbCBuZXRpZiBxdWV1ZXMKKyAqIEBXTEFOX1dBS0VfQUxMX05FVElGX1FVRVVFOiB3YWtlIGFsbCBuZXRpZiBxdWV1ZXMKKyAqIEBXTEFOX1NUT1BfQUxMX05FVElGX1FVRVVFX05fQ0FSUklFUjogc3RvcCBhbGwgcXVldWVzIGFuZCBvZmYgY2FycmllcgorICogQFdMQU5fU1RBUlRfQUxMX05FVElGX1FVRVVFX05fQ0FSUklFUjogc3RhcnQgYWxsIHF1ZXVlcyBhbmQgb24gY2FycmllcgorICogQFdMQU5fTkVUSUZfVFhfRElTQUJMRTogZGlzYWJsZSB0eAorICogQFdMQU5fTkVUSUZfVFhfRElTQUJMRV9OX0NBUlJJRVI6IGRpc2FibGUgdHggYW5kIG9mZiBjYXJyaWVyCisgKiBAV0xBTl9ORVRJRl9DQVJSSUVSX09OOiBvbiBjYXJyaWVyCisgKiBAV0xBTl9ORVRJRl9DQVJSSUVSX09GRjogb2ZmIGNhcnJpZXIKKyAqLworZW51bSBuZXRpZl9hY3Rpb25fdHlwZSB7CisJV0xBTl9TVE9QX0FMTF9ORVRJRl9RVUVVRSwKKwlXTEFOX1NUQVJUX0FMTF9ORVRJRl9RVUVVRSwKKwlXTEFOX1dBS0VfQUxMX05FVElGX1FVRVVFLAorCVdMQU5fU1RPUF9BTExfTkVUSUZfUVVFVUVfTl9DQVJSSUVSLAorCVdMQU5fU1RBUlRfQUxMX05FVElGX1FVRVVFX05fQ0FSUklFUiwKKwlXTEFOX05FVElGX1RYX0RJU0FCTEUsCisJV0xBTl9ORVRJRl9UWF9ESVNBQkxFX05fQ0FSUklFUiwKKwlXTEFOX05FVElGX0NBUlJJRVJfT04sCisJV0xBTl9ORVRJRl9DQVJSSUVSX09GRiwKKwlXTEFOX05FVElGX0FDVElPTl9UWVBFX01BWCwKK307CisKKy8qKgorICogZW51bSBuZXRpZl9yZWFzb25fdHlwZSAtIHJlYXNvbiBmb3IgbmV0aWYgcXVldWUgYWN0aW9uCisgKiBAV0xBTl9DT05UUk9MX1BBVEg6IGFjdGlvbiBmcm9tIGNvbnRyb2wgcGF0aAorICogQFdMQU5fREFUQV9GTE9XX0NPTlRST0w6IGJlY2F1c2Ugb2YgZmxvdyBjb250cm9sCisgKiBAV0xBTl9GV19QQVVTRTogYmVjYXVzZSBvZiBmaXJtd2FyZSBwYXVzZQorICogQFdMQU5fVFhfQUJPUlQ6IGJlY2F1c2Ugb2YgdHggYWJvcnQKKyAqIEBXTEFOX1ZERVZfU1RPUDogYmVjYXVzZSBvZiB2ZGV2IHN0b3AKKyAqIEBXTEFOX1BFRVJfVU5BVVRIT1JJU0VEOiBiZWNhdXNlIG9mIHBlZXIgaXMgdW5hdXRob3Jpc2VkCisgKiBAV0xBTl9USEVSTUFMX01JVElHQVRJT046IGJlY2F1c2Ugb2YgdGhlcm1hbCBtaXRpZ2F0aW9uCisgKi8KK2VudW0gbmV0aWZfcmVhc29uX3R5cGUgeworCVdMQU5fQ09OVFJPTF9QQVRILAorCVdMQU5fREFUQV9GTE9XX0NPTlRST0wsCisJV0xBTl9GV19QQVVTRSwKKwlXTEFOX1RYX0FCT1JULAorCVdMQU5fVkRFVl9TVE9QLAorCVdMQU5fUEVFUl9VTkFVVEhPUklTRUQsCisJV0xBTl9USEVSTUFMX01JVElHQVRJT04sCisJV0xBTl9SRUFTT05fVFlQRV9NQVgsCit9OworCisKKy8qIGNvbW1hbmQgb3B0aW9ucyBmb3IgZHVtcFN0YXRzKi8KKyNkZWZpbmUgV0xBTl9IRERfU1RBVFMgICAgICAgIDAKKyNkZWZpbmUgV0xBTl9UWFJYX1NUQVRTICAgICAgIDEKKyNkZWZpbmUgV0xBTl9UWFJYX0hJU1RfU1RBVFMgIDIKKyNkZWZpbmUgV0xBTl9UWFJYX1RTT19TVEFUUyAgIDMKKyNkZWZpbmUgV0xBTl9IRERfTkVUSUZfT1BFUl9ISVNUT1JZIDQKKyNkZWZpbmUgV0xBTl9EVU1QX1RYX0ZMT1dfUE9PTF9JTkZPIDUKKyNkZWZpbmUgV0xBTl9UWFJYX0RFU0NfU1RBVFMgIDYKKworb2xfdHhyeF9wZGV2X2hhbmRsZQorb2xfdHhyeF9wZGV2X2FsbG9jKG9sX3BkZXZfaGFuZGxlIGN0cmxfcGRldiwKKwkJICAgSFRDX0hBTkRMRSBodGNfcGRldiwgY2RmX2RldmljZV90IG9zZGV2KTsKKworLyoqCisgKiBAYnJpZWYgU2V0IHVwIHRoZSBkYXRhIFNXIHN1YnN5c3RlbS4KKyAqIEBkZXRhaWxzCisgKiAgQXMgcGFydCBvZiB0aGUgV0xBTiBkZXZpY2UgYXR0YWNoLCB0aGUgZGF0YSBTVyBzdWJzeXN0ZW0gaGFzCisgKiAgdG8gYmUgYXR0YWNoZWQgYXMgYSBjb21wb25lbnQgd2l0aGluIHRoZSBXTEFOIGRldmljZS4KKyAqICBUaGlzIGF0dGFjaCBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBwaHlzaWNhbCBkZXZpY2Ugb2JqZWN0CisgKiAgdXNlZCBieSB0aGUgZGF0YSBTVy4KKyAqICBUaGUgZGF0YSBTVyBzdWJzeXN0ZW0gYXR0YWNoIG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgdGFyZ2V0IGhhcworICogIGJlIHN0YXJ0ZWQsIGFuZCBob3N0IC8gdGFyZ2V0IHBhcmFtZXRlciBuZWdvdGlhdGlvbiBoYXMgY29tcGxldGVkLAorICogIHNpbmNlIHRoZSBob3N0IGRhdGEgU1cgdXNlcyBzb21lIG9mIHRoZXNlIGhvc3QvdGFyZ2V0IG5lZ290aWF0ZWQKKyAqICBwYXJhbWV0ZXJzIChlLmcuIHBlZXIgSUQgcmFuZ2UpIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb25zIHdpdGhpbgorICogIGl0cyBhdHRhY2ggZnVuY3Rpb24uCisgKiAgSG93ZXZlciwgdGhlIGhvc3QgZGF0YSBTVyBpcyBub3QgYWxsb3dlZCB0byBzZW5kIEhUQyBtZXNzYWdlcyB0byB0aGUKKyAqICB0YXJnZXQgd2l0aGluIHRoaXMgcGRldl9hdHRhY2ggZnVuY3Rpb24gY2FsbCwgc2luY2UgdGhlIEhUQyBzZXR1cAorICogIGhhcyBub3QgY29tcGxldGUgYXQgdGhpcyBzdGFnZSBvZiBpbml0aWFsaXphdGlvbnMuICBBbnkgbWVzc2FnaW5nCisgKiAgdG8gdGhlIHRhcmdldCBoYXMgdG8gYmUgZG9uZSBpbiB0aGUgc2VwYXJhdGUgcGRldl9hdHRhY2hfdGFyZ2V0IGNhbGwKKyAqICB0aGF0IGlzIGludm9rZWQgYWZ0ZXIgSFRDIHNldHVwIGlzIGNvbXBsZXRlLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdHhyeF9wZGV2IGhhbmRsZQorICogQHJldHVybiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50CitvbF90eHJ4X3BkZXZfYXR0YWNoKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogQGJyaWVmIERvIGZpbmFsIHN0ZXBzIG9mIGRhdGEgU1cgc2V0dXAgdGhhdCBzZW5kIG1lc3NhZ2VzIHRvIHRoZSB0YXJnZXQuCisgKiBAZGV0YWlscworICogIFRoZSBtYWpvcml0eSBvZiB0aGUgZGF0YSBTVyBzZXR1cCBhcmUgZG9uZSBieSB0aGUgcGRldl9hdHRhY2ggZnVuY3Rpb24sCisgKiAgYnV0IHRoaXMgZnVuY3Rpb24gY29tcGxldGVzIHRoZSBkYXRhIFNXIHNldHVwIGJ5IHNlbmRpbmcgZGF0YXBhdGgKKyAqICBjb25maWd1cmF0aW9uIG1lc3NhZ2VzIHRvIHRoZSB0YXJnZXQuCisgKgorICogQHBhcmFtIGRhdGFfcGRldiAtIHRoZSBwaHlzaWNhbCBkZXZpY2UgYmVpbmcgaW5pdGlhbGl6ZWQKKyAqLworQV9TVEFUVVMgb2xfdHhyeF9wZGV2X2F0dGFjaF90YXJnZXQob2xfdHhyeF9wZGV2X2hhbmRsZSBkYXRhX3BkZXYpOworCisvKioKKyAqIEBicmllZiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGF0YSBvYmplY3QgZm9yIGEgbmV3IHZpcnR1YWwgZGV2aWNlLgorICogQHBhcmFtIGRhdGFfcGRldiAtIHRoZSBwaHlzaWNhbCBkZXZpY2UgdGhlIHZpcnR1YWwgZGV2aWNlIGJlbG9uZ3MgdG8KKyAqIEBwYXJhbSB2ZGV2X21hY19hZGRyIC0gdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSB2aXJ0dWFsIGRldmljZQorICogQHBhcmFtIHZkZXZfaWQgLSB0aGUgSUQgdXNlZCB0byBpZGVudGlmeSB0aGUgdmlydHVhbCBkZXZpY2UgdG8gdGhlIHRhcmdldAorICogQHBhcmFtIG9wX21vZGUgLSB3aGV0aGVyIHRoaXMgdmlydHVhbCBkZXZpY2UgaXMgb3BlcmF0aW5nIGFzIGFuIEFQLAorICogICAgICBhbiBJQlNTLCBvciBhIFNUQQorICogQHJldHVybgorICogICAgICBzdWNjZXNzOiBoYW5kbGUgdG8gbmV3IGRhdGEgdmRldiBvYmplY3QsIC1PUi0KKyAqICAgICAgZmFpbHVyZTogTlVMTAorICovCitvbF90eHJ4X3ZkZXZfaGFuZGxlCitvbF90eHJ4X3ZkZXZfYXR0YWNoKG9sX3R4cnhfcGRldl9oYW5kbGUgZGF0YV9wZGV2LAorCQkgICAgdWludDhfdCAqdmRldl9tYWNfYWRkciwKKwkJICAgIHVpbnQ4X3QgdmRldl9pZCwgZW51bSB3bGFuX29wX21vZGUgb3BfbW9kZSk7CisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlIGFuZCBzZXQgdXAgcmVmZXJlbmNlcyBmb3IgYSBkYXRhIHBlZXIgb2JqZWN0LgorICogQGRldGFpbHMKKyAqICBXaGVuIGFuIGFzc29jaWF0aW9uIHdpdGggYSBwZWVyIHN0YXJ0cywgdGhlIGhvc3QncyBjb250cm9sIFNXCisgKiAgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIGluZm9ybSB0aGUgaG9zdCBkYXRhIFNXLgorICogIFRoZSBob3N0IGRhdGEgU1cgYWxsb2NhdGVzIGl0cyBvd24gcGVlciBvYmplY3QsIGFuZCBzdG9yZXMgYQorICogIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCBwZWVyIG9iamVjdCB3aXRoaW4gdGhlIGRhdGEgcGVlciBvYmplY3QuCisgKiAgVGhlIGhvc3QgZGF0YSBTVyBhbHNvIHN0b3JlcyBhIHJlZmVyZW5jZSB0byB0aGUgdmlydHVhbCBkZXZpY2UKKyAqICB0aGF0IHRoZSBwZWVyIGlzIGFzc29jaWF0ZWQgd2l0aC4gIFRoaXMgdmlydHVhbCBkZXZpY2UgaGFuZGxlIGlzCisgKiAgdXNlZCB3aGVuIHRoZSBkYXRhIFNXIGRlbGl2ZXJzIHJ4IGRhdGEgZnJhbWVzIHRvIHRoZSBPUyBzaGltIGxheWVyLgorICogIFRoZSBob3N0IGRhdGEgU1cgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgbmV3IHBlZXIgZGF0YSBvYmplY3QsCisgKiAgc28gYSByZWZlcmVuY2Ugd2l0aGluIHRoZSBjb250cm9sIHBlZXIgb2JqZWN0IGNhbiBiZSBzZXQgdG8gdGhlCisgKiAgZGF0YSBwZWVyIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gZGF0YV9wZGV2IC0gZGF0YSBwaHlzaWNhbCBkZXZpY2Ugb2JqZWN0IHRoYXQgd2lsbCBpbmRpcmVjdGx5CisgKiAgICAgIG93biB0aGUgZGF0YV9wZWVyIG9iamVjdAorICogQHBhcmFtIGRhdGFfdmRldiAtIGRhdGEgdmlydHVhbCBkZXZpY2Ugb2JqZWN0IHRoYXQgd2lsbCBkaXJlY3RseQorICogICAgICBvd24gdGhlIGRhdGFfcGVlciBvYmplY3QKKyAqIEBwYXJhbSBwZWVyX21hY19hZGRyIC0gTUFDIGFkZHJlc3Mgb2YgdGhlIG5ldyBwZWVyCisgKiBAcmV0dXJuIGhhbmRsZSB0byBuZXcgZGF0YSBwZWVyIG9iamVjdCwgb3IgTlVMTCBpZiB0aGUgYXR0YWNoIGZhaWxzCisgKi8KK29sX3R4cnhfcGVlcl9oYW5kbGUKK29sX3R4cnhfcGVlcl9hdHRhY2gob2xfdHhyeF9wZGV2X2hhbmRsZSBkYXRhX3BkZXYsCisJCSAgICBvbF90eHJ4X3ZkZXZfaGFuZGxlIGRhdGFfdmRldiwgdWludDhfdCAqcGVlcl9tYWNfYWRkcik7CisKKy8qKgorICogQGJyaWVmIFBhcmFtZXRlciB0eXBlIHRvIGJlIGlucHV0IHRvIG9sX3R4cnhfcGVlcl91cGRhdGUKKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBzdHJ1Y3QgaXMgdW5pb24sdG8gYmUgdXNlZCB0byBzcGVjaWZ5IHZhcmlvdXMgaW5mb3JtYXRpb25zIHRvIHVwZGF0ZQorICogICB0eHJ4IHBlZXIgb2JqZWN0LgorICovCit1bmlvbiBvbF90eHJ4X3BlZXJfdXBkYXRlX3BhcmFtX3QgeworCXVpbnQ4X3QgcW9zX2NhcGFibGU7CisJdWludDhfdCB1YXBzZF9tYXNrOworCWVudW0gb2xfc2VjX3R5cGUgc2VjX3R5cGU7Cit9OworCisvKioKKyAqIEBicmllZiBQYXJhbWV0ZXIgdHlwZSB0byBiZSBpbnB1dCB0byBvbF90eHJ4X3BlZXJfdXBkYXRlCisgKiBAZGV0YWlscworICogICBUaGlzIGVudW0gaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgZXhhY3QgaW5mb3JtYXRpb24gaW4KKyAqICAgb2xfdHhyeF9wZWVyX3VwZGF0ZV9wYXJhbV90CisgKiAgIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSB0eHJ4IHBlZXIgb2JqZWN0LgorICovCitlbnVtIG9sX3R4cnhfcGVlcl91cGRhdGVfc2VsZWN0X3QgeworCW9sX3R4cnhfcGVlcl91cGRhdGVfcW9zX2NhcGFibGUgPSAxLAorCW9sX3R4cnhfcGVlcl91cGRhdGVfdWFwc2RNYXNrLAorCW9sX3R4cnhfcGVlcl91cGRhdGVfcGVlcl9zZWN1cml0eSwKK307CisKKy8qKgorICogQGJyaWVmIFVwZGF0ZSB0aGUgZGF0YSBwZWVyIG9iamVjdCBhcyBzb21lIGluZm9ybWFpdG9uIGNoYW5nZWQgaW4gbm9kZS4KKyAqIEBkZXRhaWxzCisgKiAgT25seSBhIHNpbmdsZSBwcmFyYW1ldGVyIGNhbiBiZSBjaGFuZ2VkIGZvciBlYWNoIGNhbGwgdG8gdGhpcyBmdW5jLgorICoKKyAqIEBwYXJhbSBwZWVyIC0gcG9pbnRlciB0byB0aGUgbm9kZSdzIG9iamVjdAorICogQHBhcmFtIHBhcmFtIC0gbmV3IHBhcmFtIHRvIGJlIHVwYXRlZCBpbiBwZWVyIG9iamVjdC4KKyAqIEBwYXJhbSBzZWxlY3QgLSBzcGVjaWZ5IHdoYXQncyBwYXJhbWV0ZXIgbmVlZGVkIHRvIGJlIHVwZGF0ZQorICovCit2b2lkCitvbF90eHJ4X3BlZXJfdXBkYXRlKG9sX3R4cnhfdmRldl9oYW5kbGUgZGF0YV92ZGV2LCB1aW50OF90ICpwZWVyX21hYywKKwkJICAgIHVuaW9uIG9sX3R4cnhfcGVlcl91cGRhdGVfcGFyYW1fdCAqcGFyYW0sCisJCSAgICBlbnVtIG9sX3R4cnhfcGVlcl91cGRhdGVfc2VsZWN0X3Qgc2VsZWN0KTsKKworZW51bSB7CisJT0xfVFhfV01NX0FDX0JFLAorCU9MX1RYX1dNTV9BQ19CSywKKwlPTF9UWF9XTU1fQUNfVkksCisJT0xfVFhfV01NX0FDX1ZPLAorCisJT0xfVFhfTlVNX1dNTV9BQworfTsKKworLyoqCisgKiBAYnJpZWYgUGFyYW1ldGVyIHR5cGUgdG8gcGFzcyBXTU0gc2V0dGluZyB0byBvbF90eHJ4X3NldF93bW1fcGFyYW0KKyAqIEBkZXRhaWxzCisgKiAgIFRoZSBzdHJ1Y3QgaXMgdXNlZCB0byBzcGVjaWZ5IGluZm9ybWFpdG9uIHRvIHVwZGF0ZSBUWCBXTU0gc2NoZWR1bGVyLgorICovCitzdHJ1Y3Qgb2xfdHhfYWNfcGFyYW1fdCB7CisJdWludDMyX3QgYWlmczsKKwl1aW50MzJfdCBjd21pbjsKKwl1aW50MzJfdCBjd21heDsKK307CisKK3N0cnVjdCBvbF90eF93bW1fcGFyYW1fdCB7CisJc3RydWN0IG9sX3R4X2FjX3BhcmFtX3QgYWNbT0xfVFhfTlVNX1dNTV9BQ107Cit9OworCisvKioKKyAqIEBicmllZiBTZXQgcGFyYW10ZXJzIG9mIFdNTSBzY2hlZHVsZXIgcGVyIEFDIHNldHRpbmdzLiAgLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgb25seSB0byBITCBzeXN0ZW1zLgorICoKKyAqIEBwYXJhbSBkYXRhX3BkZXYgLSB0aGUgcGh5c2ljYWwgZGV2aWNlIGJlaW5nIHBhdXNlZAorICogQHBhcmFtIHdtbV9wYXJhbSAtIHRoZSB3bW0gcGFyYW1ldGVycworICovCisjZGVmaW5lIG9sX3R4cnhfc2V0X3dtbV9wYXJhbShkYXRhX3BkZXYsIHdtbV9wYXJhbSkgICAgIC8qIG5vLW9wICovCisKKy8qKgorICogQGJyaWVmIG5vdGlmeSB0eCBkYXRhIFNXIHRoYXQgYSBwZWVyJ3MgdHJhbnNtaXNzaW9ucyBhcmUgc3VzcGVuZGVkLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgb25seSB0byBITCBzeXN0ZW1zIC0gaW4gTEwgc3lzdGVtcywgdHggZmxvdyBjb250cm9sCisgKiAgaXMgaGFuZGxlZCBlbnRpcmVseSB3aXRoaW4gdGhlIHRhcmdldCBGVy4KKyAqICBUaGUgSEwgaG9zdCB0eCBkYXRhIFNXIGlzIGRvaW5nIHR4IGNsYXNzaWZpY2F0aW9uIGFuZCB0eCBkb3dubG9hZAorICogIHNjaGVkdWxpbmcsIGFuZCB0aGVyZWZvcmUgYWxzbyBuZWVkcyB0byBhY3RpdmVseSBwYXJ0aWNpcGF0ZSBpbiB0eAorICogIGZsb3cgY29udHJvbC4gIFNwZWNpZmljYWxseSwgdGhlIEhMIHR4IGRhdGEgU1cgbmVlZHMgdG8gY2hlY2sgd2hldGhlciBhCisgKiAgZ2l2ZW4gcGVlciBpcyBhdmFpbGFibGUgdG8gdHJhbnNtaXQgdG8sIG9yIGlzIHBhdXNlZC4KKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdGVsbCB0aGUgSEwgdHggZGF0YSBTVyB3aGVuIGEgcGVlciBpcyBwYXVzZWQsCisgKiAgc28gdGhlIGhvc3QgdHggZGF0YSBTVyBjYW4gaG9sZCB0aGUgdHggZnJhbWVzIGZvciB0aGF0IFNXLgorICoKKyAqIEBwYXJhbSBkYXRhX3BlZXIgLSB3aGljaCBwZWVyIGlzIGJlaW5nIHBhdXNlZAorICovCisjZGVmaW5lIG9sX3R4cnhfcGVlcl9wYXVzZShkYXRhX3BlZXIpICAgLyogbm8tb3AgKi8KKworLyoqCisgKiBAYnJpZWYgbm90aWZ5IHR4IGRhdGEgU1cgdGhhdCBhIHBlZXItVElEIGlzIHJlYWR5IHRvIHRyYW5zbWl0IHRvLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgb25seSB0byBITCBzeXN0ZW1zIC0gaW4gTEwgc3lzdGVtcywgdHggZmxvdyBjb250cm9sCisgKiAgaXMgaGFuZGxlZCBlbnRpcmVseSB3aXRoaW4gdGhlIHRhcmdldCBGVy4KKyAqICBJZiBhIHBlZXItVElEIGhhcyB0eCBwYXVzZWQsIHRoZW4gdGhlIHR4IGRhdGFwYXRoIHdpbGwgZW5kIHVwIHF1ZXVpbmcKKyAqICBhbnkgdHggZnJhbWVzIHRoYXQgYXJyaXZlIGZyb20gdGhlIE9TIHNoaW0gZm9yIHRoYXQgcGVlci1USUQuCisgKiAgSW4gYSBITCBzeXN0ZW0sIHRoZSBob3N0IHR4IGRhdGEgU1cgaXRzZWxmIHdpbGwgY2xhc3NpZnkgdGhlIHR4IGZyYW1lLAorICogIGFuZCBkZXRlcm1pbmUgdGhhdCBpdCBuZWVkcyB0byBiZSBxdWV1ZWQgcmF0aGVyIHRoYW4gZG93bmxvYWRlZCB0byB0aGUKKyAqICB0YXJnZXQgZm9yIHRyYW5zbWlzc2lvbi4KKyAqICBPbmNlIHRoZSBwZWVyLVRJRCBpcyByZWFkeSB0byBhY2NlcHQgZGF0YSwgdGhlIGhvc3QgY29udHJvbCBTVyB3aWxsIGNhbGwKKyAqICB0aGlzIGZ1bmN0aW9uIHRvIG5vdGlmeSB0aGUgaG9zdCBkYXRhIFNXIHRoYXQgdGhlIHF1ZXVlZCBmcmFtZXMgY2FuIGJlCisgKiAgZW5hYmxlZCBmb3IgdHJhbnNtaXNzaW9uLCBvciBzcGVjaWZpY2FsbHkgdG8gZG93bmxvYWQgdGhlIHR4IGZyYW1lcworICogIHRvIHRoZSB0YXJnZXQgdG8gdHJhbnNtaXQuCisgKiAgVGhlIFRJRCBwYXJhbWV0ZXIgaXMgYW4gZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgUW9TIFRJRC4gIFZhbHVlcyAwLTE1CisgKiAgaW5kaWNhdGUgYSByZWd1bGFyIFFvUyBUSUQsIGFuZCB0aGUgdmFsdWUgMTYgaW5kaWNhdGVzIGVpdGhlciBub24tUW9TCisgKiAgZGF0YSwgbXVsdGljYXN0IGRhdGEsIG9yIGJyb2FkY2FzdCBkYXRhLgorICoKKyAqIEBwYXJhbSBkYXRhX3BlZXIgLSB3aGljaCBwZWVyIGlzIGJlaW5nIHVucGF1c2VkCisgKiBAcGFyYW0gdGlkIC0gd2hpY2ggVElEIHdpdGhpbiB0aGUgcGVlciBpcyBiZWluZyB1bnBhdXNlZCwgb3IgLTEgYXMgYQorICogICAgICB3aWxkY2FyZCB0byB1bnBhdXNlIGFsbCBUSURzIHdpdGhpbiB0aGUgcGVlcgorICovCisjZGVmaW5lIG9sX3R4cnhfcGVlcl90aWRfdW5wYXVzZShkYXRhX3BlZXIsIHRpZCkgICAgICAgIC8qIG5vLW9wICovCisKKy8qKgorICogQGJyaWVmIFRlbGwgYSBwYXVzZWQgcGVlciB0byByZWxlYXNlIGEgc3BlY2lmaWVkIG51bWJlciBvZiB0eCBmcmFtZXMuCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBvbmx5IHRvIEhMIHN5c3RlbXMgLSBpbiBMTCBzeXN0ZW1zLCB0eCBmbG93IGNvbnRyb2wKKyAqICBpcyBoYW5kbGVkIGVudGlyZWx5IHdpdGhpbiB0aGUgdGFyZ2V0IEZXLgorICogIERvd25sb2FkIHVwIHRvIGEgc3BlY2lmaWVkIG1heGltdW0gbnVtYmVyIG9mIHR4IGZyYW1lcyBmcm9tIHRoZSB0eAorICogIHF1ZXVlcyBvZiB0aGUgc3BlY2lmaWVkIFRJRHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcGF1c2VkIHBlZXIsIHVzdWFsbHkKKyAqICBpbiByZXNwb25zZSB0byBhIFUtQVBTRCB0cmlnZ2VyIGZyb20gdGhlIHBlZXIuCisgKiAgSXQgaXMgdXAgdG8gdGhlIGhvc3QgZGF0YSBTVyB0byBkZXRlcm1pbmUgaG93IHRvIGNob29zZSBmcmFtZXMgZnJvbSB0aGUKKyAqICB0eCBxdWV1ZXMgb2YgdGhlIHNwZWNpZmllZCBUSURzLiAgSG93ZXZlciwgdGhlIGhvc3QgZGF0YSBTVyBkb2VzIG5lZWQgdG8KKyAqICBwcm92aWRlIGxvbmctdGVybSBmYWlybmVzcyBhY3Jvc3MgdGhlIFUtQVBTRCBlbmFibGVkIFRJRHMuCisgKiAgVGhlIGhvc3QgZGF0YSBTVyB3aWxsIG5vdGlmeSB0aGUgdGFyZ2V0IGRhdGEgRlcgd2hlbiBpdCBpcyBkb25lIGRvd25sb2FkaW5nCisgKiAgdGhlIGJhdGNoIG9mIFUtQVBTRCB0cmlnZ2VyZWQgdHggZnJhbWVzLCBzbyB0aGUgdGFyZ2V0IGRhdGEgRlcgY2FuCisgKiAgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuIGluLXByb2dyZXNzIGRvd25sb2FkIHZlcnN1cyBhIGNhc2Ugd2hlbiB0aGVyZSBhcmUKKyAqICBmZXdlciB0eCBmcmFtZXMgYXZhaWxhYmxlIHRoYW4gdGhlIHNwZWNpZmllZCBsaW1pdC4KKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50IHByaW1hcmlseSB0byBITCBVLUFQU0QsIHdoZXJlIHRoZSBmcmFtZXMgYXJlCisgKiAgaGVsZCBpbiB0aGUgaG9zdC4KKyAqCisgKiBAcGFyYW0gcGVlciAtIHdoaWNoIHBlZXIgc2VudCB0aGUgVS1BUFNEIHRyaWdnZXIKKyAqIEBwYXJhbSB0aWRfbWFzayAtIGJpdG1hc2sgb2YgVS1BUFNEIGVuYWJsZWQgVElEcyBmcm9tIHdob3NlIHR4IHF1ZXVlcworICogICAgICB0eCBmcmFtZXMgY2FuIGJlIHJlbGVhc2VkCisgKiBAcGFyYW0gbWF4X2ZybXMgLSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHR4IGZyYW1lcyB0byByZWxlYXNlIGZyb20gdGhlCisgKiAgICAgIHNwZWNpZmllZCBUSUQncyBxdWV1ZXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcGVlcgorICovCisjZGVmaW5lIG9sX3R4cnhfdHhfcmVsZWFzZShwZWVyLCB0aWRfbWFzaywgbWF4X2ZybXMpICAgIC8qIG5vLW9wICovCisKKy8qKgorICogQGJyaWVmIFN1c3BlbmQgYWxsIHR4IGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBkZXZpY2UuCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBwcmltYXJpbHkgdG8gSEwgc3lzdGVtcywgYnV0IGFsc28gYXBwbGllcyB0bworICogIExMIHN5c3RlbXMgdGhhdCB1c2UgcGVyLXZkZXYgdHggcXVldWVzIGZvciBNQ0Mgb3IgdGhlcm1hbCB0aHJvdHRsaW5nLgorICogIEFzIGFuIGV4YW1wbGUsIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgdXNlZCB3aGVuIGEgc2luZ2xlLWNoYW5uZWwgcGh5c2ljYWwKKyAqICBkZXZpY2Ugc3VwcG9ydHMgbXVsdGlwbGUgY2hhbm5lbHMgYnkganVtcGluZyBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZQorICogIGNoYW5uZWxzIGluIGEgdGltZS1zaGFyZWQgbWFubmVyLiAgQXMgdGhlIGRldmljZSBpcyBzd2l0Y2hlZCBmcm9tIGNoYW5uZWwKKyAqICBBIHRvIGNoYW5uZWwgQiwgdGhlIHZpcnR1YWwgZGV2aWNlcyB0aGF0IG9wZXJhdGUgb24gY2hhbm5lbCBBIHdpbGwgYmUKKyAqICBwYXVzZWQuCisgKgorICogQHBhcmFtIGRhdGFfdmRldiAtIHRoZSB2aXJ0dWFsIGRldmljZSBiZWluZyBwYXVzZWQKKyAqIEBwYXJhbSByZWFzb24gLSB0aGUgcmVhc29uIGZvciB3aGljaCB2ZGV2IHF1ZXVlIGlzIGdldHRpbmcgcGF1c2VkCisgKi8KKyNpZiBkZWZpbmVkKFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MKSB8fCBkZWZpbmVkKFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIpCit2b2lkIG9sX3R4cnhfdmRldl9wYXVzZShvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsIHVpbnQzMl90IHJlYXNvbik7CisjZWxzZQorc3RhdGljIGlubGluZQordm9pZCBvbF90eHJ4X3ZkZXZfcGF1c2Uob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCB1aW50MzJfdCByZWFzb24pCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MICovCisKKy8qKgorICogQGJyaWVmIERyb3AgYWxsIHR4IGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBkZXZpY2UuCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBwcmltYXJpbHkgdG8gSEwgc3lzdGVtcywgYnV0IGFsc28gYXBwbGllcyB0bworICogIExMIHN5c3RlbXMgdGhhdCB1c2UgcGVyLXZkZXYgdHggcXVldWVzIGZvciBNQ0Mgb3IgdGhlcm1hbCB0aHJvdHRsaW5nLgorICogIFRoaXMgZnVuY3Rpb24gd291bGQgdHlwaWNhbGx5IGJlIHVzZWQgYnkgdGhlIGN0cmwgU1cgYWZ0ZXIgaXQgcGFya3MKKyAqICBhIFNUQSB2ZGV2IGFuZCB0aGVuIHJlc3VtZXMgaXQsIGJ1dCB0byBhIG5ldyBBUC4gIEluIHRoaXMgY2FzZSwgdGhvdWdoCisgKiAgdGhlIHNhbWUgdmRldiBjYW4gYmUgdXNlZCwgYW55IG9sZCB0eCBmcmFtZXMgcXVldWVkIGluc2lkZSBpdCB3b3VsZCBiZQorICogIHN0YWxlLCBhbmQgd291bGQgbmVlZCB0byBiZSBkaXNjYXJkZWQuCisgKgorICogQHBhcmFtIGRhdGFfdmRldiAtIHRoZSB2aXJ0dWFsIGRldmljZSBiZWluZyBmbHVzaGVkCisgKi8KKyNpZiBkZWZpbmVkKFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MKQordm9pZCBvbF90eHJ4X3ZkZXZfZmx1c2gob2xfdHhyeF92ZGV2X2hhbmRsZSBkYXRhX3ZkZXYpOworI2Vsc2UKKyNkZWZpbmUgb2xfdHhyeF92ZGV2X2ZsdXNoKGRhdGFfdmRldikgICAvKiBuby1vcCAqLworI2VuZGlmIC8qIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MICovCisKKy8qKgorICogQGJyaWVmIFJlc3VtZSB0eCBmb3IgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGRldmljZS4KKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmdW5jdGlvbiBhcHBsaWVzIHByaW1hcmlseSB0byBITCBzeXN0ZW1zLCBidXQgYWxzbyBhcHBsaWVzIHRvCisgKiAgTEwgc3lzdGVtcyB0aGF0IHVzZSBwZXItdmRldiB0eCBxdWV1ZXMgZm9yIE1DQyBvciB0aGVybWFsIHRocm90dGxpbmcuCisgKgorICogQHBhcmFtIGRhdGFfdmRldiAtIHRoZSB2aXJ0dWFsIGRldmljZSBiZWluZyB1bnBhdXNlZAorICogQHBhcmFtIHJlYXNvbiAtIHRoZSByZWFzb24gZm9yIHdoaWNoIHZkZXYgcXVldWUgaXMgZ2V0dGluZyB1bnBhdXNlZAorICovCisjaWYgZGVmaW5lZChRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCkgfHwgZGVmaW5lZChRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyKQordm9pZCBvbF90eHJ4X3ZkZXZfdW5wYXVzZShvbF90eHJ4X3ZkZXZfaGFuZGxlIGRhdGFfdmRldiwgdWludDMyX3QgcmVhc29uKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lCit2b2lkIG9sX3R4cnhfdmRldl91bnBhdXNlKG9sX3R4cnhfdmRldl9oYW5kbGUgZGF0YV92ZGV2LCB1aW50MzJfdCByZWFzb24pCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MICovCisKKy8qKgorICogQGJyaWVmIFN1c3BlbmQgYWxsIHR4IGRhdGEgcGVyIHRoZXJtYWwgZXZlbnQvdGltZXIgZm9yIHRoZQorICogIHNwZWNpZmllZCBwaHlzaWNhbCBkZXZpY2UKKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmdW5jdGlvbiBhcHBsaWVzIG9ubHkgdG8gSEwgc3lzdGVybXMsIGFuZCBpdCBtYWtlcyBwYXVzZSBhbmQKKyAqIHVucGF1c2Ugb3BlcmF0aW9ucyBoYXBwZW4gaW4gcGFpcnMuCisgKi8KKyNkZWZpbmUgb2xfdHhyeF90aHJvdHRsZV9wYXVzZShkYXRhX3BkZXYpICAgICAgIC8qIG5vLW9wICovCisKKy8qKgorICogQGJyaWVmIFJlc3VtZSBhbGwgdHggZGF0YSBwZXIgdGhlcm1hbCBldmVudC90aW1lciBmb3IgdGhlCisgKiBzcGVjaWZpZWQgcGh5c2ljYWwgZGV2aWNlCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBvbmx5IHRvIEhMIHN5c3Rlcm1zLCBhbmQgaXQgbWFrZXMgcGF1c2UgYW5kCisgKiB1bnBhdXNlIG9wZXJhdGlvbnMgaGFwcGVuIGluIHBhaXJzLgorICovCisjZGVmaW5lIG9sX3R4cnhfdGhyb3R0bGVfdW5wYXVzZShkYXRhX3BkZXYpICAgICAvKiBuby1vcCAqLworCisvKioKKyAqIEBicmllZiBTdXNwZW5kIGFsbCB0eCBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIGRldmljZS4KKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmdW5jdGlvbiBhcHBsaWVzIG9ubHkgdG8gSEwgc3lzdGVtcyAtIGluIExMIHN5c3RlbXMsIHR4IGZsb3cgY29udHJvbAorICogIGlzIGhhbmRsZWQgZW50aXJlbHkgd2l0aGluIHRoZSB0YXJnZXQgRlcuCisgKiAgSW4gc29tZSBzeXN0ZW1zIGl0IGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIHRlbXBvcmFyaWx5CisgKiAgc3VzcGVuZCBhbGwgV0xBTiB0cmFmZmljLCBlLmcuIHRvIGFsbG93IGFub3RoZXIgZGV2aWNlIHN1Y2ggYXMgYmx1ZXRvb3RoCisgKiAgdG8gdGVtcG9yYXJpbHkgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHNoYXJlZCBSRiBjaGFpbiByZXNvdXJjZXMuCisgKiAgVGhpcyBmdW5jdGlvbiBzdXNwZW5kcyB0eCB0cmFmZmljIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZGF0YV9wZGV2IC0gdGhlIHBoeXNpY2FsIGRldmljZSBiZWluZyBwYXVzZWQKKyAqLworI2lmIGRlZmluZWQoUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wpIHx8IGRlZmluZWQoUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMikKK3ZvaWQgb2xfdHhyeF9wZGV2X3BhdXNlKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqZGF0YV9wZGV2LCB1aW50MzJfdCByZWFzb24pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgb2xfdHhyeF9wZGV2X3BhdXNlKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqZGF0YV9wZGV2LCB1aW50MzJfdCByZWFzb24pCit7CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8qKgorICogQGJyaWVmIFJlc3VtZSB0eCBmb3IgdGhlIHNwZWNpZmllZCBwaHlzaWNhbCBkZXZpY2UuCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBvbmx5IHRvIEhMIHN5c3RlbXMgLSBpbiBMTCBzeXN0ZW1zLCB0eCBmbG93IGNvbnRyb2wKKyAqICBpcyBoYW5kbGVkIGVudGlyZWx5IHdpdGhpbiB0aGUgdGFyZ2V0IEZXLgorICoKKyAqIEBwYXJhbSBkYXRhX3BkZXYgLSB0aGUgcGh5c2ljYWwgZGV2aWNlIGJlaW5nIHVucGF1c2VkCisgKi8KKyNpZiBkZWZpbmVkKFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MKSB8fCBkZWZpbmVkKFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIpCit2b2lkIG9sX3R4cnhfcGRldl91bnBhdXNlKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwgdWludDMyX3QgcmVhc29uKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lCit2b2lkIG9sX3R4cnhfcGRldl91bnBhdXNlKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwgdWludDMyX3QgcmVhc29uKQoreworCXJldHVybjsKK30KKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBTeW5jaHJvbml6ZSB0aGUgZGF0YS1wYXRoIHR4IHdpdGggYSBjb250cm9sLXBhdGggdGFyZ2V0IGRvd25sb2FkCisgKiBAZHRhaWxzCisgKiBAcGFyYW0gZGF0YV9wZGV2IC0gdGhlIGRhdGEtcGF0aCBwaHlzaWNhbCBkZXZpY2Ugb2JqZWN0CisgKiBAcGFyYW0gc3luY19jbnQgLSBhZnRlciB0aGUgaG9zdCBkYXRhLXBhdGggU1cgZG93bmxvYWRzIHRoaXMgc3luYyByZXF1ZXN0CisgKiAgICAgIHRvIHRoZSB0YXJnZXQgZGF0YS1wYXRoIEZXLCB0aGUgdGFyZ2V0IHR4IGRhdGEtcGF0aCB3aWxsIGhvbGQgaXRzZWxmCisgKiAgICAgIGluIHN1c3BlbnNpb24gdW50aWwgaXQgaXMgZ2l2ZW4gYW4gb3V0LW9mLWJhbmQgc3luYyBjb3VudGVyIHZhbHVlIHRoYXQKKyAqICAgICAgaXMgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHRoaXMgY291bnRlciB2YWx1ZQorICovCit2b2lkIG9sX3R4cnhfdHhfc3luYyhvbF90eHJ4X3BkZXZfaGFuZGxlIGRhdGFfcGRldiwgdWludDhfdCBzeW5jX2NudCk7CisKKy8qKgorICogQGJyaWVmIERlbGV0ZSBhIHBlZXIncyBkYXRhIG9iamVjdC4KKyAqIEBkZXRhaWxzCisgKiAgV2hlbiB0aGUgaG9zdCdzIGNvbnRyb2wgU1cgZGlzYXNzb2NpYXRlcyBhIHBlZXIsIGl0IGNhbGxzIHRoaXMKKyAqICBmdW5jdGlvbiB0byBkZWxldGUgdGhlIHBlZXIncyBkYXRhIG9iamVjdC4KKyAqICBUaGUgcmVmZXJlbmNlIHN0b3JlZCBpbiB0aGUgY29udHJvbCBwZWVyIG9iamVjdCB0byB0aGUgZGF0YSBwZWVyCisgKiAgb2JqZWN0IChzZXQgdXAgYnkgYSBjYWxsIHRvIG9sX3BlZXJfc3RvcmUoKSkgaXMgcHJvdmlkZWQuCisgKgorICogQHBhcmFtIGRhdGFfcGVlciAtIHRoZSBvYmplY3QgdG8gZGVsZXRlCisgKi8KK3ZvaWQgb2xfdHhyeF9wZWVyX2RldGFjaChvbF90eHJ4X3BlZXJfaGFuZGxlIGRhdGFfcGVlcik7CisKK3R5cGVkZWYgdm9pZCAoKm9sX3R4cnhfdmRldl9kZWxldGVfY2IpKHZvaWQgKmNvbnRleHQpOworCisvKioKKyAqIEBicmllZiBEZWFsbG9jYXRlIHRoZSBzcGVjaWZpZWQgZGF0YSB2aXJ0dWFsIGRldmljZSBvYmplY3QuCisgKiBAZGV0YWlscworICogIEFsbCBwZWVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHZpcnR1YWwgZGV2aWNlIG5lZWQgdG8gYmUgZGVsZXRlZAorICogIChvbF90eHJ4X3BlZXJfZGV0YWNoKSBiZWZvcmUgdGhlIHZpcnR1YWwgZGV2aWNlIGl0c2VsZiBpcyBkZWxldGVkLgorICogIEhvd2V2ZXIsIGZvciB0aGUgcGVlcnMgdG8gYmUgZnVsbHkgZGVsZXRlZCwgdGhlIHBlZXIgZGVsZXRpb24gaGFzIHRvCisgKiAgcGVyY29sYXRlIHRocm91Z2ggdGhlIHRhcmdldCBkYXRhIEZXIGFuZCBiYWNrIHVwIHRvIHRoZSBob3N0IGRhdGEgU1cuCisgKiAgVGh1cywgZXZlbiB0aG91Z2ggdGhlIGhvc3QgY29udHJvbCBTVyBtYXkgaGF2ZSBpc3N1ZWQgYSBwZWVyX2RldGFjaAorICogIGNhbGwgZm9yIGVhY2ggb2YgdGhlIHZkZXYncyBwZWVycywgdGhlIHBlZXIgb2JqZWN0cyBtYXkgc3RpbGwgYmUKKyAqICBhbGxvY2F0ZWQsIHBlbmRpbmcgcmVtb3ZhbCBvZiBhbGwgcmVmZXJlbmNlcyB0byB0aGVtIGJ5IHRoZSB0YXJnZXQgRlcuCisgKiAgSW4gdGhpcyBjYXNlLCB0aG91Z2ggdGhlIHZkZXZfZGV0YWNoIGZ1bmN0aW9uIGNhbGwgd2lsbCBzdGlsbCByZXR1cm4KKyAqICBpbW1lZGlhdGVseSwgdGhlIHZkZXYgaXRzZWxmIHdvbid0IGFjdHVhbGx5IGJlIGRlbGV0ZWQsIHVudGlsIHRoZQorICogIGRlbGV0aW9ucyBvZiBhbGwgaXRzIHBlZXJzIGNvbXBsZXRlLgorICogIFRoZSBjYWxsZXIgY2FuIHByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4KKyAqICB0aGUgdmRldiBkZWxldGlvbiBhY3R1YWxseSBoYXBwZW5zIC0gd2hldGhlciBpdCdzIGRpcmVjdGx5IHdpdGhpbiB0aGUKKyAqICB2ZGV2X2RldGFjaCBjYWxsLCBvciBpZiBpdCdzIGRlZmVycmVkIHVudGlsIGFsbCBpbi1wcm9ncmVzcyBwZWVyCisgKiAgZGVsZXRpb25zIGhhdmUgY29tcGxldGVkLgorICoKKyAqIEBwYXJhbSBkYXRhX3ZkZXYgLSBkYXRhIG9iamVjdCBmb3IgdGhlIHZpcnR1YWwgZGV2aWNlIGluIHF1ZXN0aW9uCisgKiBAcGFyYW0gY2FsbGJhY2sgLSBmdW5jdGlvbiB0byBjYWxsIChpZiBub24tTlVMTCkgb25jZSB0aGUgdmRldiBoYXMKKyAqICAgICAgYmVlbiB3aG9sbHkgZGVsZXRlZAorICogQHBhcmFtIGNhbGxiYWNrX2NvbnRleHQgLSBjb250ZXh0IHRvIHByb3ZpZGUgaW4gdGhlIGNhbGxiYWNrCisgKi8KK3ZvaWQKK29sX3R4cnhfdmRldl9kZXRhY2gob2xfdHhyeF92ZGV2X2hhbmRsZSBkYXRhX3ZkZXYsCisJCSAgICBvbF90eHJ4X3ZkZXZfZGVsZXRlX2NiIGNhbGxiYWNrLCB2b2lkICpjYWxsYmFja19jb250ZXh0KTsKKworLyoqCisgKiBAYnJpZWYgRGVsZXRlIHRoZSBkYXRhIFNXIHN0YXRlLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiB0aGUgV0xBTiBkcml2ZXIgaXMgYmVpbmcgcmVtb3ZlZCB0bworICogIHJlbW92ZSB0aGUgaG9zdCBkYXRhIGNvbXBvbmVudCB3aXRoaW4gdGhlIGRyaXZlci4KKyAqICBBbGwgdmlydHVhbCBkZXZpY2VzIHdpdGhpbiB0aGUgcGh5c2ljYWwgZGV2aWNlIG5lZWQgdG8gYmUgZGVsZXRlZAorICogIChvbF90eHJ4X3ZkZXZfZGV0YWNoKSBiZWZvcmUgdGhlIHBoeXNpY2FsIGRldmljZSBpdHNlbGYgaXMgZGVsZXRlZC4KKyAqCisgKiBAcGFyYW0gZGF0YV9wZGV2IC0gdGhlIGRhdGEgcGh5c2ljYWwgZGV2aWNlIG9iamVjdCBiZWluZyByZW1vdmVkCisgKiBAcGFyYW0gZm9yY2UgLSBkZWxldGUgdGhlIHBkZXYgKGFuZCBpdHMgdmRldnMgYW5kIHBlZXJzKSBldmVuIGlmIHRoZXJlCisgKiAgICAgIGFyZSBvdXRzdGFuZGluZyByZWZlcmVuY2VzIGJ5IHRoZSB0YXJnZXQgdG8gdGhlIHZkZXZzIGFuZCBwZWVycworICogICAgICB3aXRoaW4gdGhlIHBkZXYKKyAqLwordm9pZCBvbF90eHJ4X3BkZXZfZGV0YWNoKG9sX3R4cnhfcGRldl9oYW5kbGUgZGF0YV9wZGV2LCBpbnQgZm9yY2UpOworCit0eXBlZGVmIHZvaWQKKygqb2xfdHhyeF9kYXRhX3R4X2NiKSh2b2lkICpjdHh0LCBjZGZfbmJ1Zl90IHR4X2ZybSwgaW50IGhhZF9lcnJvcik7CisKKy8qKgorICogQGJyaWVmIFN0b3JlIGEgZGVsaXZlcnkgbm90aWZpY2F0aW9uIGNhbGxiYWNrIGZvciBzcGVjaWZpYyBkYXRhIGZyYW1lcy4KKyAqIEBkZXRhaWxzCisgKiAgVGhyb3VnaCBhIG5vbi1zdGQgdHggZnVuY3Rpb24sIHRoZSB0eHJ4IFNXIGNhbiBiZSBnaXZlbiB0eCBkYXRhIGZyYW1lcworICogIHRoYXQgYXJlIHNwZWNpYWxseSBtYXJrZWQgdG8gbm90IGJlIHVubWFwcGVkIGFuZCBmcmVlZCBieSB0aGUgdHggU1cKKyAqICB3aGVuIHRyYW5zbWlzc2lvbiBjb21wbGV0ZXMuICBSYXRoZXIsIHRoZXNlIHNwZWNpYWxseS1tYXJrZWQgZnJhbWVzCisgKiAgYXJlIHByb3ZpZGVkIHRvIHRoZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gZGF0YV92ZGV2IC0gd2hpY2ggdmRldiB0aGUgY2FsbGJhY2sgaXMgYmVpbmcgcmVnaXN0ZXJlZCB3aXRoCisgKiAgICAgIChDdXJyZW50bHkgdGhlIGNhbGxiYWNrIGlzIHN0b3JlZCBpbiB0aGUgcGRldiByYXRoZXIgdGhhbiB0aGUgdmRldi4pCisgKiBAcGFyYW0gY2FsbGJhY2sgLSB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHR4IGZyYW1lcyBtYXJrZWQgYXMgIm5vIGZyZWUiCisgKiAgICAgIGFyZSBkb25lIGJlaW5nIHRyYW5zbWl0dGVkCisgKiBAcGFyYW0gY3R4dCAtIHRoZSBjb250ZXh0IGFyZ3VtZW50IHByb3ZpZGVkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICovCit2b2lkCitvbF90eHJ4X2RhdGFfdHhfY2Jfc2V0KG9sX3R4cnhfdmRldl9oYW5kbGUgZGF0YV92ZGV2LAorCQkgICAgICAgb2xfdHhyeF9kYXRhX3R4X2NiIGNhbGxiYWNrLCB2b2lkICpjdHh0KTsKKworLyoqCisgKiBAYnJpZWYgQWxsb3cgdGhlIGNvbnRyb2wtcGF0aCBTVyB0byBzZW5kIGRhdGEgZnJhbWVzLgorICogQGRldGFpbHMKKyAqICBHZW5lcmFsbHksIGFsbCB0eCBkYXRhIGZyYW1lcyBjb21lIGZyb20gdGhlIE9TIHNoaW0gaW50byB0aGUgdHhyeCBsYXllci4KKyAqICBIb3dldmVyLCB0aGVyZSBhcmUgcmFyZSBjYXNlcyBzdWNoIGFzIFRETFMgbWVzc2FnaW5nIHdoZXJlIHRoZSBVTUFDCisgKiAgY29udHJvbC1wYXRoIFNXIGNyZWF0ZXMgdHggZGF0YSBmcmFtZXMuCisgKiAgVGhpcyBVTUFDIFNXIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gcHJvdmlkZSB0aGUgdHggZGF0YSBmcmFtZXMgdG8KKyAqICB0aGUgdHhyeCBsYXllci4KKyAqICBUaGUgVU1BQyBTVyBjYW4gcmVxdWVzdCBhIGNhbGxiYWNrIGZvciB0aGVzZSBkYXRhIGZyYW1lcyBhZnRlciB0aGVpcgorICogIHRyYW5zbWlzc2lvbiBjb21wbGV0ZXMsIGJ5IHVzaW5nIHRoZSBvbF90eHJ4X2RhdGFfdHhfY2Jfc2V0IGZ1bmN0aW9uCisgKiAgdG8gcmVnaXN0ZXIgYSB0eCBjb21wbGV0aW9uIGNhbGxiYWNrLCBhbmQgYnkgc3BlY2lmeWluZworICogIG9sX3R4X3NwZWNfbm9fZnJlZSBhcyB0aGUgdHhfc3BlYyBhcmcgd2hlbiBnaXZpbmcgdGhlIGZyYW1lcyB0bworICogIG9sX3R4X25vbl9zdGQuCisgKiAgVGhlIE1TRFVzIG5lZWQgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgTDIgaGVhZGVyIHR5cGUgKDgwMi4zIHZzLiA4MDIuMTEpLAorICogIGFzIHNwZWNpZmllZCBieSBvbF9jZmdfZnJhbWVfdHlwZSgpLgorICoKKyAqIEBwYXJhbSBkYXRhX3ZkZXYgLSB3aGljaCB2ZGV2IHNob3VsZCB0cmFuc21pdCB0aGUgdHggZGF0YSBmcmFtZXMKKyAqIEBwYXJhbSB0eF9zcGVjIC0gd2hhdCBub24tc3RhbmRhcmQgaGFuZGxpbmcgdG8gYXBwbHkgdG8gdGhlIHR4IGRhdGEgZnJhbWVzCisgKiBAcGFyYW0gbXNkdV9saXN0IC0gTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgdHggTVNEVXMKKyAqLworY2RmX25idWZfdAorb2xfdHhfbm9uX3N0ZChvbF90eHJ4X3ZkZXZfaGFuZGxlIGRhdGFfdmRldiwKKwkgICAgICBlbnVtIG9sX3R4X3NwZWMgdHhfc3BlYywgY2RmX25idWZfdCBtc2R1X2xpc3QpOworCit0eXBlZGVmIHZvaWQKKygqb2xfdHhyeF9tZ210X3R4X2NiKSh2b2lkICpjdHh0LCBjZGZfbmJ1Zl90IHR4X21nbXRfZnJtLCBpbnQgaGFkX2Vycm9yKTsKKworLyoqCisgKiBAYnJpZWYgU3RvcmUgYSBjYWxsYmFjayBmb3IgZGVsaXZlcnkgbm90aWZpY2F0aW9ucyBmb3IgbWFuYWdlbWVudCBmcmFtZXMuCisgKiBAZGV0YWlscworICogIFdoZW4gdGhlIHR4cnggU1cgcmVjZWl2ZXMgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSB0YXJnZXQgdGhhdCBhIHR4IGZyYW1lCisgKiAgaGFzIGJlZW4gZGVsaXZlcmVkIHRvIGl0cyByZWNpcGllbnQsIGl0IHdpbGwgY2hlY2sgaWYgdGhlIHR4IGZyYW1lCisgKiAgaXMgYSBtYW5hZ2VtZW50IGZyYW1lLiAgSWYgc28sIHRoZSB0eHJ4IFNXIHdpbGwgY2hlY2sgdGhlIG1hbmFnZW1lbnQKKyAqICBmcmFtZSB0eXBlIHNwZWNpZmllZCB3aGVuIHRoZSBmcmFtZSB3YXMgc3VibWl0dGVkIGZvciB0cmFuc21pc3Npb24uCisgKiAgSWYgdGhlcmUgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIGZvciB0aGUgdHlwZSBvZiBtYW5hZ21lbnQKKyAqICBmcmFtZSBpbiBxdWVzdGlvbiwgdGhlIHR4cnggY29kZSB3aWxsIGludm9rZSB0aGUgY2FsbGJhY2sgdG8gaW5mb3JtCisgKiAgdGhlIG1hbmFnZW1lbnQgKyBjb250cm9sIFNXIHRoYXQgdGhlIG1nbXQgZnJhbWUgd2FzIGRlbGl2ZXJlZC4KKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGNvbnRyb2wgU1cgdG8gc3RvcmUgYSBjYWxsYmFjayBwb2ludGVyCisgKiAgZm9yIGEgZ2l2ZW4gdHlwZSBvZiBtYW5hZ2VtZW50IGZyYW1lLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIGRhdGEgcGh5c2ljYWwgZGV2aWNlIG9iamVjdAorICogQHBhcmFtIHR5cGUgLSB0aGUgdHlwZSBvZiBtZ210IGZyYW1lIHRoZSBjYWxsYmFjayBpcyB1c2VkIGZvcgorICogQHBhcmFtIGRvd25sb2FkX2NiIC0gdGhlIGNhbGxiYWNrIGZvciBub3RpZmljYXRpb24gb2YgZGVsaXZlcnkgdG8gdGhlIHRhcmdldAorICogQHBhcmFtIG90YV9hY2tfY2IgLSB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmaWNhdGlvbiBvZiBkZWxpdmVyeSB0byB0aGUgcGVlcgorICogQHBhcmFtIGN0eHQgLSBjb250ZXh0IHRvIHVzZSB3aXRoIHRoZSBjYWxsYmFjaworICovCit2b2lkCitvbF90eHJ4X21nbXRfdHhfY2Jfc2V0KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgICAgIHVpbnQ4X3QgdHlwZSwKKwkJICAgICAgIG9sX3R4cnhfbWdtdF90eF9jYiBkb3dubG9hZF9jYiwKKwkJICAgICAgIG9sX3R4cnhfbWdtdF90eF9jYiBvdGFfYWNrX2NiLCB2b2lkICpjdHh0KTsKKworLyoqCisgKiBAYnJpZWYgVHJhbnNtaXQgYSBtYW5hZ2VtZW50IGZyYW1lLgorICogQGRldGFpbHMKKyAqICBTZW5kIHRoZSBzcGVjaWZpZWQgbWFuYWdlbWVudCBmcmFtZSBmcm9tIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBkZXZpY2UuCisgKiAgVGhlIHR5cGUgaXMgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB0byBpbnZva2UgYSBjYWxsYmFjayB0byBpbmZvcm0KKyAqICB0aGUgc2VuZGVyIHRoYXQgdGhlIHR4IG1nbXQgZnJhbWUgd2FzIGRlbGl2ZXJlZCwgYW5kIGlmIHNvLCB3aGljaAorICogIGNhbGxiYWNrIHRvIHVzZS4KKyAqCisgKiBAcGFyYW0gdmRldiAtIHZpcnR1YWwgZGV2aWNlIHRyYW5zbWl0dGluZyB0aGUgZnJhbWUKKyAqIEBwYXJhbSB0eF9tZ210X2ZybSAtIG1hbmFnZW1lbnQgZnJhbWUgdG8gdHJhbnNtaXQKKyAqIEBwYXJhbSB0eXBlIC0gdGhlIHR5cGUgb2YgbWFuYWdtZW50IGZyYW1lIChkZXRlcm1pbmVzIHdoYXQgY2FsbGJhY2sgdG8gdXNlKQorICogQHBhcmFtIHVzZV82bWJwcyAtIHNwZWNpZnkgd2hldGhlciBtYW5hZ2VtZW50IGZyYW1lIHRvIHRyYW5zbWl0IHNob3VsZCB1c2UgNiBNYnBzCisgKiAgICAgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gMSBNYnBzIG1pbiByYXRlKGZvciA1R0h6IGJhbmQgb3IgUDJQKQorICogQHJldHVybgorICogICAgICAwIC0+IHRoZSBmcmFtZSBpcyBhY2NlcHRlZCBmb3IgdHJhbnNtaXNzaW9uLCAtT1ItCisgKiAgICAgIDEgLT4gdGhlIGZyYW1lIHdhcyBub3QgYWNjZXB0ZWQKKyAqLworaW50CitvbF90eHJ4X21nbXRfc2VuZChvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJCSAgY2RmX25idWZfdCB0eF9tZ210X2ZybSwKKwkJICB1aW50OF90IHR5cGUsIHVpbnQ4X3QgdXNlXzZtYnBzLCB1aW50MTZfdCBjaGFuZnJlcSk7CisKKy8qKgorICogQGJyaWVmIFNldHVwIHRoZSBtb25pdG9yIG1vZGUgdmFwICh2ZGV2KSBmb3IgdGhpcyBwZGV2CisgKiBAZGV0YWlscworICogIFdoZW4gYSBub24tTlVMTCB2ZGV2IGhhbmRsZSBpcyByZWdpc3RlcmVkIGFzIHRoZSBtb25pdG9yIG1vZGUgdmRldiwgYWxsCisgKiAgcGFja2V0cyByZWNlaXZlZCBieSB0aGUgc3lzdGVtIGFyZSBkZWxpdmVyZWQgdG8gdGhlIE9TIHN0YWNrIG9uIHRoaXMKKyAqICBpbnRlcmZhY2UgaW4gODAyLjExIE1QRFUgZm9ybWF0LiBPbmx5IGEgc2luZ2xlIG1vbml0b3IgbW9kZSBpbnRlcmZhY2UKKyAqICBjYW4gYmUgdXAgYXQgYW55IHRpbWVyLiBXaGVuIHRoZSB2ZGV2IGhhbmRsZSBpcyBzZXQgdG8gTlVMTCB0aGUgbW9uaXRvcgorICogIG1vZGUgZGVsaXZlcnkgaXMgc3RvcHBlZC4gVGhpcyBoYW5kbGUgbWF5IGVpdGhlciBiZSBhIHVuaXF1ZSB2ZGV2CisgKiAgb2JqZWN0IHRoYXQgb25seSByZWNlaXZlcyBtb25pdG9yIG1vZGUgcGFja2V0cyBPUiBhIHBvaW50IHRvIGEgYSB2ZGV2CisgKiAgb2JqZWN0IHRoYXQgYWxzbyByZWNlaXZlcyBub24tbW9uaXRvciB0cmFmZmljLiBJbiB0aGUgc2Vjb25kIGNhc2UgdGhlCisgKiAgT1Mgc3RhY2sgaXMgcmVzcG9uc2libGUgZm9yIGRlbGl2ZXJpbmcgdGhlIHR3byBzdHJlYW1zIHVzaW5nIGFwcHJvcHJhdGUKKyAqICBPUyBBUElzCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZGF0YSBwaHlzaWNhbCBkZXZpY2Ugb2JqZWN0CisgKiBAcGFyYW0gdmRldiAtIHRoZSBkYXRhIHZpcnR1YWwgZGV2aWNlIG9iamVjdCB0byBkZWxpdmVyIG1vbml0b3IgbW9kZQorICogICAgICAgICAgICAgICAgICBwYWNrZXRzIG9uCisgKiBAcmV0dXJuCisgKiAgICAgICAwIC0+IHRoZSBtb25pdG9yIG1vZGUgdmFwIHdhcyBzdWNlc3NmdWxseSBzZXR1cAorICogICAgICAtMSAtPiBVbmFibGUgdG8gc2V0dXAgbW9uaXRvciBtb2RlCisgKi8KK2ludAorb2xfdHhyeF9zZXRfbW9uaXRvcl9tb2RlX3ZhcChvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkgICAgIG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldik7CisKKy8qKgorICogQGJyaWVmIFNldHVwIHRoZSBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsIG9mIHRoZSBkZXZpY2UKKyAqIEBkZXRhaWxzCisgKiAgTWFpbmx5IHVzZWQgd2hlbiBwb3B1bGF0aW5nIG1vbml0b3IgbW9kZSBzdGF0dXMgdGhhdCByZXF1aXJlcyB0aGUKKyAqICBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZGF0YSBwaHlzaWNhbCBkZXZpY2Ugb2JqZWN0CisgKiBAcGFyYW0gY2hhbl9taHogLSB0aGUgY2hhbm5lbCBmcmVxdWVuY3kgKG1oeikKKyAqICAgICAgICAgICAgICAgICAgcGFja2V0cyBvbgorICogQHJldHVybiAtIHZvaWQKKyAqLwordm9pZCBvbF90eHJ4X3NldF9jdXJjaGFuKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDMyX3QgY2hhbl9taHopOworCitDREZfU1RBVFVTIG9sX3R4cnhfYnVzX3N1c3BlbmQodm9pZCk7CitDREZfU1RBVFVTIG9sX3R4cnhfYnVzX3Jlc3VtZSh2b2lkKTsKK0NERl9TVEFUVVMgb2xfdHhyeF93YWl0X2Zvcl9wZW5kaW5nX3R4KGludCB0aW1lb3V0KTsKKworLyoqCisgKiBAYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgcGVuZGluZyB0cmFuc21pdCBmcmFtZXMgdGhhdCBhcmUgYXdhaXRpbmcgY29tcGxldGlvbi4KKyAqIEBkZXRhaWxzCisgKiAgTWFpbmx5IHVzZWQgaW4gY2xlYW4gdXAgcGF0aCB0byBtYWtlIHN1cmUgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIGZyZWUnZWQKKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBkYXRhIHBoeXNpY2FsIGRldmljZSBvYmplY3QKKyAqIEByZXR1cm4gLSBjb3VudCBvZiBwZW5kaW5nIGZyYW1lcworICovCitpbnQgb2xfdHhyeF9nZXRfdHhfcGVuZGluZyhvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYpOworCisvKioKKyAqIEBicmllZiBEaXNjYXJkIGFsbCB0eCBmcmFtZXMgdGhhdCBhcmUgcGVuZGluZyBpbiB0eHJ4LgorICogQGRldGFpbHMKKyAqICBNYWlubHkgdXNlZCBpbiBjbGVhbiB1cCBwYXRoIHRvIG1ha2Ugc3VyZSBhbGwgcGVuZGluZyB0eCBwYWNrZXRzCisgKiAgaGVsZCBieSB0eHJ4IGFyZSByZXR1cm5lZCBiYWNrIHRvIE9TIHNoaW0gaW1tZWRpYXRlbHkuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZGF0YSBwaHlzaWNhbCBkZXZpY2Ugb2JqZWN0CisgKiBAcmV0dXJuIC0gdm9pZAorICovCit2b2lkIG9sX3R4cnhfZGlzY2FyZF90eF9wZW5kaW5nKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldik7CisKKy8qKgorICogQGJyaWVmIHNldCB0aGUgc2FmZW1vZGUgb2YgdGhlIGRldmljZQorICogQGRldGFpbHMKKyAqICBUaGlzIGZsYWcgaXMgdXNlZCB0byBieXBhc3MgdGhlIGVuY3J5cHQgYW5kIGRlY3J5cHQgcHJvY2Vzc2VzIHdoZW4gc2VuZCBhbmQKKyAqICByZWNlaXZlIHBhY2tldHMuIEl0IHdvcmtzIGxpa2Ugb3BlbiBBVVRIIG1vZGUsIEhXIHdpbGwgdHJlYXRlIGFsbCBwYWNrZXRzCisgKiAgYXMgbm9uLWVuY3J5cHQgZnJhbWVzIGJlY2F1c2Ugbm8ga2V5IGluc3RhbGxlZC4gRm9yIHJ4IGZyYWdtZW50ZWQgZnJhbWVzLAorICogIGl0IGJ5cGFzc2VzIGFsbCB0aGUgcnggZGVmcmFnbWVudGFpb24uCisgKgorICogQHBhcmFtIHZkZXYgLSB0aGUgZGF0YSB2aXJ0dWFsIGRldmljZSBvYmplY3QKKyAqIEBwYXJhbSB2YWwgLSB0aGUgc2FmZW1vZGUgc3RhdGUKKyAqIEByZXR1cm4gLSB2b2lkCisgKi8KK3ZvaWQgb2xfdHhyeF9zZXRfc2FmZW1vZGUob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCB1aW50MzJfdCB2YWwpOworCisvKioKKyAqIEBicmllZiBzZXQgdGhlIHByaXZhY3kgZmlsdGVyCisgKiBAZGV0YWlscworICogIFJ4IHJlbGF0ZWQuIFNldCB0aGUgcHJpdmFjeSBmaWx0ZXJzLiBXaGVuIHJ4IHBhY2tldHMsIGNoZWNrCisgKiAgdGhlIGV0aGVyIHR5cGUsIGZpbHRlciB0eXBlIGFuZCBwYWNrZXQgdHlwZQorICogIHRvIGRlY2lkZSB3aGV0aGVyIGRpc2NhcmQgdGhlc2UgcGFja2V0cy4KKyAqCisgKiBAcGFyYW0gdmRldiAtIHRoZSBkYXRhIHZpcnR1YWwgZGV2aWNlIG9iamVjdAorICogQHBhcmFtIGZpbHRlciAtIGZpbHRlcnMgdG8gYmUgc2V0CisgKiBAcGFyYW0gbnVtIC0gdGhlIG51bWJlciBvZiBmaWx0ZXJzCisgKiBAcmV0dXJuIC0gdm9pZAorICovCit2b2lkCitvbF90eHJ4X3NldF9wcml2YWN5X2ZpbHRlcnMob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LAorCQkJICAgIHZvaWQgKmZpbHRlciwgdWludDMyX3QgbnVtKTsKKworLyoqCisgKiBAYnJpZWYgY29uZmlndXJlIHRoZSBkcm9wIHVuZW5jcnlwdGVkIGZyYW1lIGZsYWcKKyAqIEBkZXRhaWxzCisgKiAgUnggcmVsYXRlZC4gV2hlbiBzZXQgdGhpcyBmbGFnLCBhbGwgdGhlIHVuZW5jcnlwdGVkIGZyYW1lcworICogIHJlY2VpdmVkIG92ZXIgYSBzZWN1cmUgY29ubmVjdGlvbiB3aWxsIGJlIGRpc2NhcmRlZAorICoKKyAqIEBwYXJhbSB2ZGV2IC0gdGhlIGRhdGEgdmlydHVhbCBkZXZpY2Ugb2JqZWN0CisgKiBAcGFyYW0gdmFsIC0gZmxhZworICogQHJldHVybiAtIHZvaWQKKyAqLwordm9pZCBvbF90eHJ4X3NldF9kcm9wX3VuZW5jKG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgdWludDMyX3QgdmFsKTsKKworZW51bSBvbF90eHJ4X3BlZXJfc3RhdGUgeworCW9sX3R4cnhfcGVlcl9zdGF0ZV9pbnZhbGlkLAorCW9sX3R4cnhfcGVlcl9zdGF0ZV9kaXNjLCAgICAgICAgLyogaW5pdGlhbCBzdGF0ZSAqLworCW9sX3R4cnhfcGVlcl9zdGF0ZV9jb25uLCAgICAgICAgLyogYXV0aGVudGljYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKwlvbF90eHJ4X3BlZXJfc3RhdGVfYXV0aCwgICAgICAgIC8qIGF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwgKi8KK307CisKKy8qKgorICogQGJyaWVmIHNwZWNpZnkgdGhlIHBlZXIncyBhdXRoZW50aWNhdGlvbiBzdGF0ZQorICogQGRldGFpbHMKKyAqICBTcGVjaWZ5IHRoZSBwZWVyJ3MgYXV0aGVudGljYXRpb24gc3RhdGUgKG5vbmUsIGNvbm5lY3RlZCwgYXV0aGVudGljYXRlZCkKKyAqICB0byBhbGxvdyB0aGUgZGF0YSBTVyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBmaWx0ZXIgb3V0IGludmFsaWQgZGF0YSBmcmFtZXMuCisgKiAgKEluIHRoZSAiY29ubmVjdGVkIiBzdGF0ZSwgd2hlcmUgc2VjdXJpdHkgaXMgZW5hYmxlZCwgYnV0IGF1dGhlbnRpY2F0aW9uCisgKiAgaGFzIG5vdCBjb21wbGV0ZWQsIHR4IGFuZCByeCBkYXRhIGZyYW1lcyBvdGhlciB0aGFuIEVBUE9MIG9yIFdBUEkgc2hvdWxkCisgKiAgYmUgZGlzY2FyZGVkLikKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHN5c3RlbXMgaW4gd2hpY2ggdGhlIHR4IGFuZCByeCBmaWx0ZXJpbmcKKyAqICBhcmUgZG9uZSBpbiB0aGUgaG9zdCByYXRoZXIgdGhhbiBpbiB0aGUgdGFyZ2V0LgorICoKKyAqIEBwYXJhbSBkYXRhX3BlZXIgLSB3aGljaCBwZWVyIGhhcyBjaGFuZ2VkIGl0cyBzdGF0ZQorICogQHBhcmFtIHN0YXRlIC0gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgcGVlcgorICoKKyAqIFJldHVybjogQ0RGIFN0YXR1cworICovCitDREZfU1RBVFVTCitvbF90eHJ4X3BlZXJfc3RhdGVfdXBkYXRlKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDhfdCAqcGVlcl9hZGRyLAorCQkJICBlbnVtIG9sX3R4cnhfcGVlcl9zdGF0ZSBzdGF0ZSk7CisKK3ZvaWQKK29sX3R4cnhfcGVlcl9rZXlpbnN0YWxsZWRfc3RhdGVfdXBkYXRlKG9sX3R4cnhfcGVlcl9oYW5kbGUgZGF0YV9wZWVyLAorCQkJCSAgICAgICB1aW50OF90IHZhbCk7CisKKyNkZWZpbmUgb2xfdHhfYWRkYmFfY29uZihkYXRhX3BlZXIsIHRpZCwgc3RhdHVzKSAgICAgICAgLyogbm8tb3AgKi8KKworLyoqCisgKiBAYnJpZWYgRmluZCBhIHR4cnggcGVlciBoYW5kbGUgZnJvbSB0aGUgcGVlcidzIE1BQyBhZGRyZXNzCisgKiBAZGV0YWlscworICogIFRoZSBjb250cm9sIFNXIHR5cGljYWxseSB1c2VzIHRoZSB0eHJ4IHBlZXIgaGFuZGxlIHRvIHJlZmVyIHRvIHRoZSBwZWVyLgorICogIEluIHVudXN1YWwgY2lyY3Vtc3RhbmNlcywgaWYgaXQgaXMgaW5mZWFzaWJsZSBmb3IgdGhlIGNvbnRyb2wgU1cgbWFpbnRhaW4KKyAqICB0aGUgdHhyeCBwZWVyIGhhbmRsZSBidXQgaXQgY2FuIG1haW50YWluIHRoZSBwZWVyJ3MgTUFDIGFkZHJlc3MsCisgKiAgdGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIHBlZXIgaGFuZGxlZCB0byBiZSByZXRyaWV2ZWQsIGJhc2VkIG9uIHRoZSBwZWVyJ3MKKyAqICBNQUMgYWRkcmVzcy4KKyAqICBJbiBjYXNlcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGUgcGVlciBvYmplY3RzIHdpdGggdGhlIHNhbWUgTUFDIGFkZHJlc3MsCisgKiAgaXQgaXMgdW5kZWZpbmVkIHdoaWNoIHN1Y2ggb2JqZWN0IGlzIHJldHVybmVkLgorICogIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5jcmVtZW50IHRoZSBwZWVyJ3MgcmVmZXJlbmNlIGNvdW50LiAgVGh1cywgaXQgaXMKKyAqICBvbmx5IHN1aXRhYmxlIGZvciB1c2UgYXMgbG9uZyBhcyB0aGUgY29udHJvbCBTVyBoYXMgYXNzdXJhbmNlIHRoYXQgaXQgaGFzCisgKiAgbm90IGRlbGV0ZWQgdGhlIHBlZXIgb2JqZWN0LCBieSBjYWxsaW5nIG9sX3R4cnhfcGVlcl9kZXRhY2guCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZGF0YSBwaHlzaWNhbCBkZXZpY2Ugb2JqZWN0CisgKiBAcGFyYW0gcGVlcl9tYWNfYWRkciAtIE1BQyBhZGRyZXNzIG9mIHRoZSBwZWVyIGluIHF1ZXN0aW9uCisgKiBAcmV0dXJuIGhhbmRsZSB0byB0aGUgdHhyeCBwZWVyIG9iamVjdAorICovCitvbF90eHJ4X3BlZXJfaGFuZGxlCitvbF90eHJ4X3BlZXJfZmluZF9ieV9hZGRyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDhfdCAqcGVlcl9tYWNfYWRkcik7CisKKy8qKgorICogQGJyaWVmIEZpbmQgYSB0eHJ4IHBlZXIgaGFuZGxlIGZyb20gYSBwZWVyJ3MgbG9jYWwgSUQKKyAqIEBkZXRhaWxzCisgKiAgVGhlIGNvbnRyb2wgU1cgdHlwaWNhbGx5IHVzZXMgdGhlIHR4cnggcGVlciBoYW5kbGUgdG8gcmVmZXIgdG8gdGhlIHBlZXIuCisgKiAgSW4gdW51c3VhbCBjaXJjdW1zdGFuY2VzLCBpZiBpdCBpcyBpbmZlYXNpYmxlIGZvciB0aGUgY29udHJvbCBTVyBtYWludGFpbgorICogIHRoZSB0eHJ4IHBlZXIgaGFuZGxlIGJ1dCBpdCBjYW4gbWFpbnRhaW4gYSBzbWFsbCBpbnRlZ2VyIGxvY2FsIHBlZXIgSUQsCisgKiAgdGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIHBlZXIgaGFuZGxlZCB0byBiZSByZXRyaWV2ZWQsIGJhc2VkIG9uIHRoZSBsb2NhbAorICogIHBlZXIgSUQuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZGF0YSBwaHlzaWNhbCBkZXZpY2Ugb2JqZWN0CisgKiBAcGFyYW0gbG9jYWxfcGVlcl9pZCAtIHRoZSBJRCB0eHJ4IGFzc2lnbmVkIGxvY2FsbHkgdG8gdGhlIHBlZXIgaW4gcXVlc3Rpb24KKyAqIEByZXR1cm4gaGFuZGxlIHRvIHRoZSB0eHJ4IHBlZXIgb2JqZWN0CisgKi8KKyNpZiBRQ0FfU1VQUE9SVF9UWFJYX0xPQ0FMX1BFRVJfSUQKK29sX3R4cnhfcGVlcl9oYW5kbGUKK29sX3R4cnhfcGVlcl9maW5kX2J5X2xvY2FsX2lkKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDhfdCBsb2NhbF9wZWVyX2lkKTsKKyNlbHNlCisjZGVmaW5lIG9sX3R4cnhfcGVlcl9maW5kX2J5X2xvY2FsX2lkKHBkZXYsIGxvY2FsX3BlZXJfaWQpIE5VTEwKKyNlbmRpZgorCitzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3N0YXRzX3QgeworCXN0cnVjdCB7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCB1Y2FzdDsKKwkJCXVpbnQzMl90IG1jYXN0OworCQkJdWludDMyX3QgYmNhc3Q7CisJCX0gZnJtczsKKwkJc3RydWN0IHsKKwkJCXVpbnQzMl90IHVjYXN0OworCQkJdWludDMyX3QgbWNhc3Q7CisJCQl1aW50MzJfdCBiY2FzdDsKKwkJfSBieXRlczsKKwl9IHR4OworCXN0cnVjdCB7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCB1Y2FzdDsKKwkJCXVpbnQzMl90IG1jYXN0OworCQkJdWludDMyX3QgYmNhc3Q7CisJCX0gZnJtczsKKwkJc3RydWN0IHsKKwkJCXVpbnQzMl90IHVjYXN0OworCQkJdWludDMyX3QgbWNhc3Q7CisJCQl1aW50MzJfdCBiY2FzdDsKKwkJfSBieXRlczsKKwl9IHJ4OworfTsKKworLyoqCisgKiBAYnJpZWYgUHJvdmlkZSBhIHNuYXBzaG90IG9mIHRoZSB0eHJ4IGNvdW50ZXJzIGZvciB0aGUgc3BlY2lmaWVkIHBlZXIKKyAqIEBkZXRhaWxzCisgKiAgVGhlIHR4cnggbGF5ZXIgb3B0aW9uYWxseSBtYWludGFpbnMgcGVyLXBlZXIgc3RhdHMgY291bnRlcnMuCisgKiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgY2FsbGVyIHdpdGggYSBjb25zaXN0ZW50IHNuYXBzaG90IG9mIHRoZQorICogIHR4cnggc3RhdHMgY291bnRlcnMgZm9yIHRoZSBzcGVjaWZpZWQgcGVlci4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBkYXRhIHBoeXNpY2FsIGRldmljZSBvYmplY3QKKyAqIEBwYXJhbSBwZWVyIC0gd2hpY2ggcGVlcidzIHN0YXRzIGNvdW50ZXJzIGFyZSByZXF1ZXN0ZWQKKyAqIEBwYXJhbSBzdGF0cyAtIGJ1ZmZlciBmb3IgaG9sZGluZyB0aGUgc3RhdHMgY291bnRlcnMgc25hcHNob3QKKyAqIEByZXR1cm4gc3VjY2VzcyAvIGZhaWx1cmUgc3RhdHVzCisgKi8KKyNpZmRlZiBRQ0FfRU5BQkxFX09MX1RYUlhfUEVFUl9TVEFUUworQV9TVEFUVVMKK29sX3R4cnhfcGVlcl9zdGF0c19jb3B5KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCW9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlciwgb2xfdHhyeF9wZWVyX3N0YXRzX3QgKnN0YXRzKTsKKyNlbHNlCisjZGVmaW5lIG9sX3R4cnhfcGVlcl9zdGF0c19jb3B5KHBkZXYsIHBlZXIsIHN0YXRzKSBBX0VSUk9SICAgICAgLyogZmFpbHVyZSAqLworI2VuZGlmIC8qIFFDQV9FTkFCTEVfT0xfVFhSWF9QRUVSX1NUQVRTICovCisKKy8qIENvbmZpZyBwYXJhbWV0ZXJzIGZvciB0eHJ4X3BkZXYgKi8KK3N0cnVjdCB0eHJ4X3BkZXZfY2ZnX3BhcmFtX3QgeworCXVpbnQ4X3QgaXNfZnVsbF9yZW9yZGVyX29mZmxvYWQ7CisJLyogSVBBIE1pY3JvIGNvbnRyb2xsZXIgZGF0YSBwYXRoIG9mZmxvYWQgZW5hYmxlIGZsYWcgKi8KKwl1aW50OF90IGlzX3VjX29mZmxvYWRfZW5hYmxlZDsKKwkvKiBJUEEgTWljcm8gY29udHJvbGxlciBkYXRhIHBhdGggb2ZmbG9hZCBUWCBidWZmZXIgY291bnQgKi8KKwl1aW50MzJfdCB1Y190eF9idWZmZXJfY291bnQ7CisJLyogSVBBIE1pY3JvIGNvbnRyb2xsZXIgZGF0YSBwYXRoIG9mZmxvYWQgVFggYnVmZmVyIHNpemUgKi8KKwl1aW50MzJfdCB1Y190eF9idWZmZXJfc2l6ZTsKKwkvKiBJUEEgTWljcm8gY29udHJvbGxlciBkYXRhIHBhdGggb2ZmbG9hZCBSWCBpbmRpY2F0aW9uIHJpbmcgY291bnQgKi8KKwl1aW50MzJfdCB1Y19yeF9pbmRpY2F0aW9uX3JpbmdfY291bnQ7CisJLyogSVBBIE1pY3JvIGNvbnRyb2xsZXIgZGF0YSBwYXRoIG9mZmxvYWQgVFggcGFydGl0aW9uIGJhc2UgKi8KKwl1aW50MzJfdCB1Y190eF9wYXJ0aXRpb25fYmFzZTsKKwkvKiBJUCwgVENQIGFuZCBVRFAgY2hlY2tzdW0gb2ZmbG9hZCAqLworCWJvb2wgaXBfdGNwX3VkcF9jaGVja3N1bV9vZmZsb2FkOworCS8qIFJ4IHByb2Nlc3NpbmcgaW4gdGhyZWFkIGZyb20gVFhSWCAqLworCWJvb2wgZW5hYmxlX3J4dGhyZWFkOworCS8qIENFIGNsYXNzaWZpY2F0aW9uIGVuYWJsZWQgdGhyb3VnaCBJTkkgKi8KKwlib29sIGNlX2NsYXNzaWZ5X2VuYWJsZWQ7CisjaWZkZWYgUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMgorCS8qIFRocmVzaG9sZCB0byBzdG9wIHF1ZXVlIGluIHBlcmNlbnRhZ2UgKi8KKwl1aW50MzJfdCB0eF9mbG93X3N0b3BfcXVldWVfdGg7CisJLyogU3RhcnQgcXVldWUgb2Zmc2V0IGluIHBlcmNlbnRhZ2UgKi8KKwl1aW50MzJfdCB0eF9mbG93X3N0YXJ0X3F1ZXVlX29mZnNldDsKKyNlbmRpZgorfTsKKworLyoqCisgKiBAYnJpZWYgU2V0dXAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBAZGV0YWlscworICogIEFsbG9jYXRpb24gY29uZmlndXJhdGlvbiBjb250ZXh0IHRoYXQgd2lsbCBiZSB1c2VkIGFjcm9zcyBkYXRhIHBhdGgKKyAqCisgKiBAcGFyYW0gb3NkZXYgLSBPUyBoYW5kbGUgbmVlZGVkIGFzIGFuIGFyZ3VtZW50IGZvciBzb21lIE9TIHByaW1pdGl2ZXMKKyAqIEByZXR1cm4gdGhlIGNvbnRyb2wgZGV2aWNlIG9iamVjdAorICovCitvbF9wZGV2X2hhbmRsZSBvbF9wZGV2X2NmZ19hdHRhY2goY2RmX2RldmljZV90IG9zZGV2LAorCQkJCSAgc3RydWN0IHR4cnhfcGRldl9jZmdfcGFyYW1fdCBjZmdfcGFyYW0pOworCitDREZfU1RBVFVTIG9sX3R4cnhfZ2V0X3ZkZXZpZChzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsIHVpbnQ4X3QgKnZkZXZfaWQpOwordm9pZCAqb2xfdHhyeF9nZXRfdmRldl9ieV9zdGFfaWQodWludDhfdCBzdGFfaWQpOworCisKKyNkZWZpbmUgT0xfVFhSWF9JTlZBTElEX0xPQ0FMX1BFRVJfSUQgMHhmZmZmCisjaWZkZWYgUUNBX1NVUFBPUlRfVFhSWF9MT0NBTF9QRUVSX0lECit1aW50MTZfdCBvbF90eHJ4X2xvY2FsX3BlZXJfaWQob2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyKTsKK29sX3R4cnhfcGVlcl9oYW5kbGUgb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkJCSAgICAgIHVpbnQ4X3QgKnBlZXJfYWRkciwKKwkJCQkJICAgICAgdWludDhfdCAqcGVlcl9pZCk7CitvbF90eHJ4X3BlZXJfaGFuZGxlCitvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyX2FuZF92ZGV2KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCQkgICBvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJCQkJICAgdWludDhfdCAqcGVlcl9hZGRyLCB1aW50OF90ICpwZWVyX2lkKTsKKyNlbHNlCisjZGVmaW5lIG9sX3R4cnhfbG9jYWxfcGVlcl9pZChwZWVyKSBPTF9UWFJYX0lOVkFMSURfTE9DQUxfUEVFUl9JRAorI2RlZmluZSBvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyKHBkZXYsIHBlZXJfYWRkciwgcGVlcl9pZCkgTlVMTAorI2RlZmluZSBvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyX2FuZF92ZGV2KHBkZXYsIHZkZXYsIHBlZXJfYWRkciwgcGVlcl9pZCkgTlVMTAorI2VuZGlmCisKKyNkZWZpbmUgT0xfVFhSWF9SU1NJX0lOVkFMSUQgMHhmZmZmCisvKioKKyAqIEBicmllZiBQcm92aWRlIHRoZSBjdXJyZW50IFJTU0kgYXZlcmFnZSBmcm9tIGRhdGEgZnJhbWVzIHNlbnQgYnkgYSBwZWVyLgorICogQGRldGFpbHMKKyAqICBJZiBhIHBlZXIgaGFzIHNlbnQgZGF0YSBmcmFtZXMsIHRoZSBkYXRhIFNXIHdpbGwgb3B0aW9uYWxseSBrZWVwCisgKiAgYSBydW5uaW5nIGF2ZXJhZ2Ugb2YgdGhlIFJTU0kgb2JzZXJ2ZWQgZm9yIHRob3NlIGRhdGEgZnJhbWVzLgorICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGF0IHRpbWUtYXZlcmFnZSBSU1NJIGlmIGlzIGl0IGF2YWlsYWJsZSwKKyAqICBvciBPTF9UWFJYX1JTU0lfSU5WQUxJRCBpZiBlaXRoZXIgUlNTSSB0cmFja2luZyBpcyBkaXNhYmxlZCBvciBpZgorICogIG5vIGRhdGEgZnJhbWUgaW5kaWNhdGlvbnMgd2l0aCB2YWxpZCBSU1NJIG1ldGEtZGF0YSBoYXZlIGJlZW4gcmVjZWl2ZWQuCisgKiAgVGhlIFJTU0kgaXMgaW4gYXBwcm94aW1hdGUgZEJtIHVuaXRzLCBhbmQgaXMgbm9ybWFsaXplZCB3aXRoIHJlc3BlY3QKKyAqICB0byBhIDIwIE1IeiBjaGFubmVsLiAgRm9yIGV4YW1wbGUsIGlmIGEgZGF0YSBmcmFtZSBpcyByZWNlaXZlZCBvbiBhCisgKiAgNDAgTUh6IGNoYW5uZWwsIHdoZXJlaW4gYm90aCB0aGUgcHJpbWFyeSAyMCBNSHogY2hhbm5lbCBhbmQgdGhlCisgKiAgc2Vjb25kYXJ5IDIwIE1IeiBjaGFubmVsIGhhdmUgYW4gUlNTSSBvZiAtNzcgZEJtLCB0aGUgcmVwb3J0ZWQgUlNTSQorICogIHdpbGwgYmUgLTc3IGRCbSwgcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCAtNzQgZEJtIFJTU0kgZnJvbSB0aGUKKyAqICBjb21iaW5hdGlvbiBvZiB0aGUgcHJpbWFyeSArIGV4dGVuc2lvbiAyMCBNSHogY2hhbm5lbHMuCisgKiAgQWx0ZXJuYXRpdmVseSwgdGhlIFJTU0kgbWF5IGJlIGV2YWx1YXRlZCBvbmx5IG9uIHRoZSBwcmltYXJ5IDIwIE1IegorICogIGNoYW5uZWwuCisgKgorICogQHBhcmFtIHBlZXIgLSB3aGljaCBwZWVyJ3MgUlNTSSBpcyBkZXNpcmVkCisgKiBAcmV0dXJuIFJTU0kgZXZhbHV0ZWQgZnJvbSBmcmFtZXMgc2VudCBieSB0aGUgc3BlY2lmaWVkIHBlZXIKKyAqLworI2lmZGVmIFFDQV9TVVBQT1JUX1BFRVJfREFUQV9SWF9SU1NJCitpbnQxNl90IG9sX3R4cnhfcGVlcl9yc3NpKG9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlcik7CisjZWxzZQorI2RlZmluZSBvbF90eHJ4X3BlZXJfcnNzaShwZWVyKSBPTF9UWFJYX1JTU0lfSU5WQUxJRAorI2VuZGlmIC8qIFFDQV9TVVBQT1JUX1BFRVJfREFUQV9SWF9SU1NJICovCisKKyNkZWZpbmUgT0xfVFhSWF9JTlZBTElEX0xPQ0FMX1BFRVJfSUQgMHhmZmZmCisjaWYgUUNBX1NVUFBPUlRfVFhSWF9MT0NBTF9QRUVSX0lECit1aW50MTZfdCBvbF90eHJ4X2xvY2FsX3BlZXJfaWQob2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyKTsKKyNlbHNlCisjZGVmaW5lIG9sX3R4cnhfbG9jYWxfcGVlcl9pZChwZWVyKSBPTF9UWFJYX0lOVkFMSURfTE9DQUxfUEVFUl9JRAorI2VuZGlmCisKKyNpZmRlZiBRQ0FfQ09NUFVURV9UWF9ERUxBWQorLyoqCisgKiBAYnJpZWYgdXBkYXRlcyB0aGUgY29tcHV0ZSBpbnRlcnZhbCBwZXJpb2QgZm9yIFRTTSBzdGF0cy4KKyAqIEBkZXRhaWxzCisgKiBAcGFyYW0gaW50ZXJ2YWwgLSBpbnRlcnZhbCBmb3Igc3RhdHMgY29tcHV0YXRpb24KKyAqLwordm9pZCBvbF90eF9zZXRfY29tcHV0ZV9pbnRlcnZhbChvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIHVpbnQzMl90IGludGVydmFsKTsKKworLyoqCisgKiBAYnJpZWYgUmV0dXJuIHRoZSB1cGxpbmsgKHRyYW5zbWl0dGVkKSBwYWNrZXQgY291bnQgYW5kIGxvc3MgY291bnQuCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZm9yIGdldHRpbmcgdXBsaW5rIHBhY2tldCBjb3VudCBhbmQKKyAqICBsb3NzIGNvdW50IGZvciBnaXZlbiBzdHJlYW0gKGFjY2VzcyBjYXRlZ29yeSkgYSByZWd1bGFyIGludGVydmFsLgorICogIFRoaXMgYWxzbyByZXNldHMgdGhlIGNvdW50ZXJzIGhlbmNlLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgcGFja2V0cworICogIGNvdW50ZWQgaW4gbGFzdCA1KGRlZmF1bHQpIHNlY29uZCBpbnRlcnZhbC4gVGhlc2UgY291bnRlciBhcmUKKyAqICBpbmNyZW1lbnRlZCBwZXIgYWNjZXNzIGNhdGVnb3J5IGluIG9sX3R4X2NvbXBsZXRpb25faGFuZGxlcigpCisgKgorICogQHBhcmFtIGNhdGVnb3J5IC0gYWNjZXNzIGNhdGVnb3J5IG9mIGludGVyZXN0CisgKiBAcGFyYW0gb3V0X3BhY2tldF9jb3VudCAtIG51bWJlciBvZiBwYWNrZXRzIHRyYW5zbWl0dGVkCisgKiBAcGFyYW0gb3V0X3BhY2tldF9sb3NzX2NvdW50IC0gbnVtYmVyIG9mIHBhY2tldHMgbG9zdAorICovCit2b2lkCitvbF90eF9wYWNrZXRfY291bnQob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICB1aW50MTZfdCAqb3V0X3BhY2tldF9jb3VudCwKKwkJICAgdWludDE2X3QgKm91dF9wYWNrZXRfbG9zc19jb3VudCwgaW50IGNhdGVnb3J5KTsKKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBSZXR1cm4gdGhlIGF2ZXJhZ2UgZGVsYXlzIGZvciB0eCBmcmFtZXMuCisgKiBAZGV0YWlscworICogIFJldHVybiB0aGUgYXZlcmFnZSBvZiB0aGUgdG90YWwgdGltZSB0eCBmcmFtZXMgc3BlbmQgd2l0aGluIHRoZSBkcml2ZXIKKyAqICBhbmQgdGhlIGF2ZXJhZ2UgdGltZSB0eCBmcmFtZXMgdGFrZSB0byBiZSB0cmFuc21pdHRlZC4KKyAqICBUaGVzZSBhdmVyYWdlcyBhcmUgY29tcHV0ZWQgb3ZlciBhIDUgc2Vjb25kIHRpbWUgaW50ZXJ2YWwuCisgKiAgVGhlc2UgYXZlcmFnZXMgYXJlIGNvbXB1dGVkIHNlcGFyYXRlbHkgZm9yIHNlcGFyYXRlIGFjY2VzcyBjYXRlZ29yaWVzLAorICogIGlmIHRoZSBRQ0FfQ09NUFVURV9UWF9ERUxBWV9QRVJfQUMgZmxhZyBpcyBzZXQuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZGF0YSBwaHlzaWNhbCBkZXZpY2UgaW5zdGFuY2UKKyAqIEBwYXJhbSBxdWV1ZV9kZWxheV9taWNyb3NlYyAtIGF2ZXJhZ2UgdGltZSB0eCBmcm1zIHNwZW5kIGluIHRoZSBXTEFOIGRyaXZlcgorICogQHBhcmFtIHR4X2RlbGF5X21pY3Jvc2VjIC0gYXZlcmFnZSB0aW1lIGZvciBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqIEBwYXJhbSBjYXRlZ29yeSAtIGNhdGVnb3J5IChUSUQpIG9mIGludGVyZXN0CisgKi8KKyNpZmRlZiBRQ0FfQ09NUFVURV9UWF9ERUxBWQordm9pZAorb2xfdHhfZGVsYXkob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCSAgICB1aW50MzJfdCAqcXVldWVfZGVsYXlfbWljcm9zZWMsCisJICAgIHVpbnQzMl90ICp0eF9kZWxheV9taWNyb3NlYywgaW50IGNhdGVnb3J5KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK29sX3R4X2RlbGF5KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkgICAgdWludDMyX3QgKnF1ZXVlX2RlbGF5X21pY3Jvc2VjLAorCSAgICB1aW50MzJfdCAqdHhfZGVsYXlfbWljcm9zZWMsIGludCBjYXRlZ29yeSkKK3sKKwkvKiBuby1vcCB2ZXJzaW9uIGlmIFFDQV9DT01QVVRFX1RYX0RFTEFZIGlzIG5vdCBzZXQgKi8KKwkqcXVldWVfZGVsYXlfbWljcm9zZWMgPSAqdHhfZGVsYXlfbWljcm9zZWMgPSAwOworfQorI2VuZGlmCisKKy8qCisgKiBCaW5zIHVzZWQgZm9yIHJlcG9ydGluZyBkZWxheSBoaXN0b2dyYW06CisgKiBiaW4gMDogIDAgLSAxMCAgbXMgZGVsYXkKKyAqIGJpbiAxOiAxMCAtIDIwICBtcyBkZWxheQorICogYmluIDI6IDIwIC0gNDAgIG1zIGRlbGF5CisgKiBiaW4gMzogNDAgLSA4MCAgbXMgZGVsYXkKKyAqIGJpbiA0OiA4MCAtIDE2MCBtcyBkZWxheQorICogYmluIDU6ID4gMTYwIG1zIGRlbGF5CisgKi8KKyNkZWZpbmUgUUNBX1RYX0RFTEFZX0hJU1RfUkVQT1JUX0JJTlMgNgorLyoqCisgKiBAYnJpZWYgUHJvdmlkZSBhIGhpc3RvZ3JhbSBvZiB0eCBxdWV1aW5nIGRlbGF5cy4KKyAqIEBkZXRhaWxzCisgKiAgUmV0dXJuIGEgaGlzdG9ncmFtIHNob3dpbmcgdGhlIG51bWJlciBvZiB0eCBmcmFtZXMgb2YgdGhlIHNwZWNpZmllZAorICogIGNhdGVnb3J5IGZvciBlYWNoIG9mIHRoZSBkZWxheSBsZXZlbHMgaW4gdGhlIGhpc3RvZ3JhbSBiaW4gc3BhY2luZ3MKKyAqICBsaXN0ZWQgYWJvdmUuCisgKiAgVGhlc2UgaGlzdG9ncmFtcyBhcmUgY29tcHV0ZWQgb3ZlciBhIDUgc2Vjb25kIHRpbWUgaW50ZXJ2YWwuCisgKiAgVGhlc2UgaGlzdG9ncmFtcyBhcmUgY29tcHV0ZWQgc2VwYXJhdGVseSBmb3Igc2VwYXJhdGUgYWNjZXNzIGNhdGVnb3JpZXMsCisgKiAgaWYgdGhlIFFDQV9DT01QVVRFX1RYX0RFTEFZX1BFUl9BQyBmbGFnIGlzIHNldC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBkYXRhIHBoeXNpY2FsIGRldmljZSBpbnN0YW5jZQorICogQHBhcmFtIGJpbl92YWx1ZXMgLSBhbiBhcnJheSBvZiBRQ0FfVFhfREVMQVlfSElTVF9SRVBPUlRfQklOUyBlbGVtZW50cworICogICAgICBUaGlzIGFycmF5IGdldHMgZmlsbGVkIGluIHdpdGggdGhlIGhpc3RvZ3JhbSBiaW4gY291bnRzLgorICogQHBhcmFtIGNhdGVnb3J5IC0gY2F0ZWdvcnkgKFRJRCkgb2YgaW50ZXJlc3QKKyAqLworI2lmZGVmIFFDQV9DT01QVVRFX1RYX0RFTEFZCit2b2lkCitvbF90eF9kZWxheV9oaXN0KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDE2X3QgKmJpbl92YWx1ZXMsIGludCBjYXRlZ29yeSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitvbF90eF9kZWxheV9oaXN0KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDE2X3QgKmJpbl92YWx1ZXMsIGludCBjYXRlZ29yeSkKK3sKKwkvKiBuby1vcCB2ZXJzaW9uIGlmIFFDQV9DT01QVVRFX1RYX0RFTEFZIGlzIG5vdCBzZXQgKi8KKwljZGZfYXNzZXJ0KGJpbl92YWx1ZXMpOworCWNkZl9tZW1femVybyhiaW5fdmFsdWVzLAorCQkgICAgIFFDQV9UWF9ERUxBWV9ISVNUX1JFUE9SVF9CSU5TICogc2l6ZW9mKCpiaW5fdmFsdWVzKSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUUNBX1NVUFBPUlRfVFhfVEhST1RUTEUpCisvKioKKyAqIEBicmllZiBTZXQgdGhlIHRoZXJtYWwgbWl0Z2F0aW9uIHRocm90dGxpbmcgbGV2ZWwuCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBvbmx5IHRvIExMIHN5c3RlbXMuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBzZXQgdGhlCisgKiAgdHggdGhyb3R0bGUgbGV2ZWwgdXNlZCBmb3IgdGhlcm1hbCBtaXRpZ2F0aW9uCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgcGh5c2ljcyBkZXZpY2UgYmVpbmcgdGhyb3R0bGVkCisgKi8KK3ZvaWQgb2xfdHhfdGhyb3R0bGVfc2V0X2xldmVsKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwgaW50IGxldmVsKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb2xfdHhfdGhyb3R0bGVfc2V0X2xldmVsKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJCQkJICAgIGludCBsZXZlbCkKK3sKKwkvKiBuby1vcCAqLworfQorI2VuZGlmIC8qIFFDQV9TVVBQT1JUX1RYX1RIUk9UVExFICovCisKKyNpZiBkZWZpbmVkKFFDQV9TVVBQT1JUX1RYX1RIUk9UVExFKQorLyoqCisgKiBAYnJpZWYgQ29uZmlndXJlIHRoZSB0aGVybWFsIG1pdGdhdGlvbiB0aHJvdHRsaW5nIHBlcmlvZC4KKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmdW5jdGlvbiBhcHBsaWVzIG9ubHkgdG8gTEwgc3lzdGVtcy4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHNldCB0aGUKKyAqICBwZXJpb2Qgb3ZlciB3aGljaCBkYXRhIHdpbGwgYmUgdGhyb3R0bGVkCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgcGh5c2ljcyBkZXZpY2UgYmVpbmcgdGhyb3R0bGVkCisgKi8KK3ZvaWQgb2xfdHhfdGhyb3R0bGVfaW5pdF9wZXJpb2Qoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LCBpbnQgcGVyaW9kKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb2xfdHhfdGhyb3R0bGVfaW5pdF9wZXJpb2Qoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJCQkgICAgICBpbnQgcGVyaW9kKQoreworCS8qIG5vLW9wICovCit9CisjZW5kaWYgLyogUUNBX1NVUFBPUlRfVFhfVEhST1RUTEUgKi8KKwordm9pZCBvbF92ZGV2X3J4X3NldF9pbnRyYWJzc19md2Qob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCBib29sIHZhbCk7CisKKworI2lmZGVmIElQQV9PRkZMT0FECisvKioKKyAqIEBicmllZiBDbGllbnQgcmVxdWVzdCByZXNvdXJjZSBpbmZvcm1hdGlvbgorICogQGRldGFpbHMKKyAqICBPTCBjbGllbnQgd2lsbCByZXVxZXN0IElQQSBVQyByZWxhdGVkIHJlc291cmNlIGluZm9ybWF0aW9uCisgKiAgUmVzb3VyY2UgaW5mb3JtYXRpb24gd2lsbCBiZSBkaXN0cmlidXR0ZWQgdG8gSVBBIG1vZHVsZQorICogIEFsbCBvZiB0aGUgcmVxdWlyZWQgcmVzb3VyY2VzIHNob3VsZCBiZSBwcmUtYWxsb2NhdGVkCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIEhUVCBpbnN0YW5jZQorICogQHBhcmFtIGNlX3NyX2Jhc2VfcGFkZHIgLSBjb3B5IGVuZ2luZSBzb3VyY2UgcmluZyBiYXNlIHBoeXNpY2FsIGFkZHJlc3MKKyAqIEBwYXJhbSBjZV9zcl9yaW5nX3NpemUgLSBjb3B5IGVuZ2luZSBzb3VyY2UgcmluZyBzaXplCisgKiBAcGFyYW0gY2VfcmVnX3BhZGRyIC0gY29weSBlbmdpbmUgcmVnaXN0ZXIgcGh5c2ljYWwgYWRkcmVzcworICogQHBhcmFtIHR4X2NvbXBfcmluZ19iYXNlX3BhZGRyIC0gdHggY29tcCByaW5nIGJhc2UgcGh5c2ljYWwgYWRkcmVzcworICogQHBhcmFtIHR4X2NvbXBfcmluZ19zaXplIC0gdHggY29tcCByaW5nIHNpemUKKyAqIEBwYXJhbSB0eF9udW1fYWxsb2NfYnVmZmVyIC0gbnVtYmVyIG9mIGFsbG9jYXRlZCB0eCBidWZmZXIKKyAqIEBwYXJhbSByeF9yZHlfcmluZ19iYXNlX3BhZGRyIC0gcnggcmVhZHkgcmluZyBiYXNlIHBoeXNpY2FsIGFkZHJlc3MKKyAqIEBwYXJhbSByeF9yZHlfcmluZ19zaXplIC0gcnggcmVhZHkgcmluZyBzaXplCisgKiBAcGFyYW0gcnhfcHJvY19kb25lX2lkeF9wYWRkciAtIHJ4IHByb2Nlc3MgZG9uZSBpbmRleCBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK3ZvaWQKK29sX3R4cnhfaXBhX3VjX2dldF9yZXNvdXJjZShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkgICAgdWludDMyX3QgKmNlX3NyX2Jhc2VfcGFkZHIsCisJCQkgICAgdWludDMyX3QgKmNlX3NyX3Jpbmdfc2l6ZSwKKwkJCSAgICBjZGZfZG1hX2FkZHJfdCAqY2VfcmVnX3BhZGRyLAorCQkJICAgIHVpbnQzMl90ICp0eF9jb21wX3JpbmdfYmFzZV9wYWRkciwKKwkJCSAgICB1aW50MzJfdCAqdHhfY29tcF9yaW5nX3NpemUsCisJCQkgICAgdWludDMyX3QgKnR4X251bV9hbGxvY19idWZmZXIsCisJCQkgICAgdWludDMyX3QgKnJ4X3JkeV9yaW5nX2Jhc2VfcGFkZHIsCisJCQkgICAgdWludDMyX3QgKnJ4X3JkeV9yaW5nX3NpemUsCisJCQkgICAgdWludDMyX3QgKnJ4X3Byb2NfZG9uZV9pZHhfcGFkZHIpOworCisvKioKKyAqIEBicmllZiBDbGllbnQgc2V0IElQQSBVQyBkb29yYmVsbCByZWdpc3RlcgorICogQGRldGFpbHMKKyAqICBJUEEgVUMgbGV0IGtub3cgZG9vcmJlbGwgcmVnaXN0ZXIgcGh5c2ljYWwgYWRkcmVzcworICogIFdMQU4gZmlybXdhcmUgd2lsbCB1c2UgdGhpcyBwaHlzaWNhbCBhZGRyZXNzIHRvIG5vdGlmeSBJUEEgVUMKKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlCisgKiBAcGFyYW0gaXBhX3VjX3R4X2Rvb3JiZWxsX3BhZGRyIC0gdHggY29tcCBkb29yYmVsbCBwaHlzaWNhbCBhZGRyZXNzCisgKiBAcGFyYW0gaXBhX3VjX3J4X2Rvb3JiZWxsX3BhZGRyIC0gcnggcmVhZHkgZG9vcmJlbGwgcGh5c2ljYWwgYWRkcmVzcworICovCit2b2lkCitvbF90eHJ4X2lwYV91Y19zZXRfZG9vcmJlbGxfcGFkZHIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSAgdWludDMyX3QgaXBhX3R4X3VjX2Rvb3JiZWxsX3BhZGRyLAorCQkJCSAgdWludDMyX3QgaXBhX3J4X3VjX2Rvb3JiZWxsX3BhZGRyKTsKKworLyoqCisgKiBAYnJpZWYgQ2xpZW50IG5vdGlmeSBJUEEgVUMgZGF0YSBwYXRoIGFjdGl2ZSBvciBub3QKKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlCisgKiBAcGFyYW0gdWNfYWN0aXZlIC0gVUMgZGF0YSBwYXRoIGlzIGFjdGl2ZSBvciBub3QKKyAqIEBwYXJhbSBpc190eCAtIFVDIFRYIGlzIGFjdGl2ZSBvciBub3QKKyAqLwordm9pZAorb2xfdHhyeF9pcGFfdWNfc2V0X2FjdGl2ZShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIGJvb2wgdWNfYWN0aXZlLCBib29sIGlzX3R4KTsKKworLyoqCisgKiBAYnJpZWYgT2ZmbG9hZCBkYXRhIHBhdGggYWN0aXZhdGlvbiBub3RpZmljYWl0b24KKyAqIEBkZXRhaWxzCisgKiAgRmlybXdhcmUgbm90aWZpY2F0aW9uIGhhbmRsZXIgZm9yIG9mZmxvYWQgZGF0YXBhdGggYWN0aXZpdHkKKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlCisgKiBAcGFyYW0gb3BfY29kZSAtIGFjdGl2YXRlZCBmb3IgdHggb3IgcnggZGF0YSBwYXRyaAorICovCit2b2lkIG9sX3R4cnhfaXBhX3VjX29wX3Jlc3BvbnNlKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDhfdCAqb3BfbXNnKTsKKworLyoqCisgKiBAYnJpZWYgY2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0cmF0aW9uCisgKiBAZGV0YWlscworICogIE9TSUYgbGF5ZXIgY2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0cmF0aW9uIEFQSQorICogIE9TSUYgbGF5ZXIgd2lsbCByZWdpc3RlciBmaXJtd2FyZSBvZmZsb2FkIGRhdGFwYXRoIGFjdGl2aXR5CisgKiAgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIEhUVCBpbnN0YW5jZQorICogQHBhcmFtIGlwYV91Y19vcF9jYl90eXBlIC0gY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBzaG91bGQgYmUgcmVnaXN0ZXJlZAorICogQHBhcmFtIG9zaWZfZGV2IC0gb3NpZiBpbnN0YW5jZSBwb2ludGVyCisgKi8KK3ZvaWQgb2xfdHhyeF9pcGFfdWNfcmVnaXN0ZXJfb3BfY2Iob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSAgIHZvaWQgKCppcGFfdWNfb3BfY2JfdHlwZSkodWludDhfdCAqb3BfbXNnLAorCQkJCQkJCSAgICAgdm9pZCAqb3NpZl9jdHh0KSwKKwkJCQkgICB2b2lkICpvc2lmX2Rldik7CisKKy8qKgorICogQGJyaWVmIHF1ZXJ5IHVjIGRhdGEgcGF0aCBzdGF0cworICogQGRldGFpbHMKKyAqICBRdWVyeSB1YyBkYXRhIHBhdGggc3RhdHMgZnJvbSBmaXJtd2FyZQorICoKKyAqIEBwYXJhbSBwZGV2IC0gaGFuZGxlIHRvIHRoZSBIVFQgaW5zdGFuY2UKKyAqLwordm9pZCBvbF90eHJ4X2lwYV91Y19nZXRfc3RhdChvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAorb2xfdHhyeF9pcGFfdWNfZ2V0X3Jlc291cmNlKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCSAgICB1aW50MzJfdCAqY2Vfc3JfYmFzZV9wYWRkciwKKwkJCSAgICB1aW50MzJfdCAqY2Vfc3JfcmluZ19zaXplLAorCQkJICAgIGNkZl9kbWFfYWRkcl90ICpjZV9yZWdfcGFkZHIsCisJCQkgICAgdWludDMyX3QgKnR4X2NvbXBfcmluZ19iYXNlX3BhZGRyLAorCQkJICAgIHVpbnQzMl90ICp0eF9jb21wX3Jpbmdfc2l6ZSwKKwkJCSAgICB1aW50MzJfdCAqdHhfbnVtX2FsbG9jX2J1ZmZlciwKKwkJCSAgICB1aW50MzJfdCAqcnhfcmR5X3JpbmdfYmFzZV9wYWRkciwKKwkJCSAgICB1aW50MzJfdCAqcnhfcmR5X3Jpbmdfc2l6ZSwKKwkJCSAgICB1aW50MzJfdCAqcnhfcHJvY19kb25lX2lkeF9wYWRkcikKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorb2xfdHhyeF9pcGFfdWNfc2V0X2Rvb3JiZWxsX3BhZGRyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCQkgIHVpbnQzMl90IGlwYV90eF91Y19kb29yYmVsbF9wYWRkciwKKwkJCQkgIHVpbnQzMl90IGlwYV9yeF91Y19kb29yYmVsbF9wYWRkcikKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorb2xfdHhyeF9pcGFfdWNfc2V0X2FjdGl2ZShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJYm9vbCB1Y19hY3RpdmUsIGJvb2wgaXNfdHgpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK29sX3R4cnhfaXBhX3VjX29wX3Jlc3BvbnNlKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDhfdCAqb3BfbXNnKQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitvbF90eHJ4X2lwYV91Y19yZWdpc3Rlcl9vcF9jYihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkJICAgdm9pZCAoKmlwYV91Y19vcF9jYl90eXBlKSh1aW50OF90ICpvcF9tc2csCisJCQkJCQkJICAgICB2b2lkICpvc2lmX2N0eHQpLAorCQkJCSAgIHZvaWQgKm9zaWZfZGV2KQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9sX3R4cnhfaXBhX3VjX2dldF9zdGF0KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldikKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogSVBBX09GRkxPQUQgKi8KKwordm9pZCBvbF90eHJ4X2Rpc3BsYXlfc3RhdHModWludDE2X3QgYml0bWFwKTsKK3ZvaWQgb2xfdHhyeF9jbGVhcl9zdGF0cyh1aW50MTZfdCBiaXRtYXApOworaW50IG9sX3R4cnhfc3RhdHModWludDhfdCB2ZGV2X2lkLCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGJ1Zl9sZW4pOworCitDREZfU1RBVFVTIG9sX3R4cnhfcmVnaXN0ZXJfb2NiX3BlZXIodm9pZCAqY2RzX2N0eCwgdWludDhfdCAqbWFjX2FkZHIsCisJCQkJICAgICB1aW50OF90ICpwZWVyX2lkKTsKKwordm9pZCBvbF90eHJ4X3NldF9vY2JfcGVlcihzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcik7CisKK2Jvb2wgb2xfdHhyeF9nZXRfb2NiX3BlZXIoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKipwZWVyKTsKKworLyogVFggRkxPVyBDb250cm9sIHJlbGF0ZWQgZnVuY3Rpb25zICovCisjaWZkZWYgUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMgorI2RlZmluZSBUWF9GTE9XX01HTVRfUE9PTF9JRAkweEVGCisKKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19HTE9CQUxfTUdNVF9QT09MCisjZGVmaW5lIFRYX0ZMT1dfTUdNVF9QT09MX1NJWkUgIDMyCisjZWxzZQorI2RlZmluZSBUWF9GTE9XX01HTVRfUE9PTF9TSVpFICAwCisjZW5kaWYKKwordm9pZCBvbF90eF9yZWdpc3Rlcl9mbG93X2NvbnRyb2woc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KTsKK3ZvaWQgb2xfdHhfZGVyZWdpc3Rlcl9mbG93X2NvbnRyb2woc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KTsKK3ZvaWQgb2xfdHhfZHVtcF9mbG93X3Bvb2xfaW5mbyh2b2lkKTsKK3ZvaWQgb2xfdHhfY2xlYXJfZmxvd19wb29sX3N0YXRzKHZvaWQpOwordm9pZCBvbF90eF9mbG93X3Bvb2xfbWFwX2hhbmRsZXIodWludDhfdCBmbG93X2lkLCB1aW50OF90IGZsb3dfdHlwZSwKKwkJCQkgdWludDhfdCBmbG93X3Bvb2xfaWQsIHVpbnQxNl90IGZsb3dfcG9vbF9zaXplKTsKK3ZvaWQgb2xfdHhfZmxvd19wb29sX3VubWFwX2hhbmRsZXIodWludDhfdCBmbG93X2lkLCB1aW50OF90IGZsb3dfdHlwZSwKKwkJCQkgICB1aW50OF90IGZsb3dfcG9vbF9pZCk7CitzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKm9sX3R4X2NyZWF0ZV9mbG93X3Bvb2wodWludDhfdCBmbG93X3Bvb2xfaWQsCisJCQkJCQkgdWludDE2X3QgZmxvd19wb29sX3NpemUpOworaW50IG9sX3R4X2RlbGV0ZV9mbG93X3Bvb2woc3RydWN0IG9sX3R4X2Zsb3dfcG9vbF90ICpwb29sKTsKK3ZvaWQgb2xfdHhfc2V0X2Rlc2NfZ2xvYmFsX3Bvb2xfc2l6ZSh1aW50MzJfdCBudW1fbXNkdV9kZXNjKTsKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbF90eF9yZWdpc3Rlcl9mbG93X2NvbnRyb2woc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBvbF90eF9kZXJlZ2lzdGVyX2Zsb3dfY29udHJvbChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpCit7CisJcmV0dXJuOworfQorc3RhdGljIGlubGluZSB2b2lkIG9sX3R4X2R1bXBfZmxvd19wb29sX2luZm8odm9pZCkKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgb2xfdHhfY2xlYXJfZmxvd19wb29sX3N0YXRzKHZvaWQpCit7CisJcmV0dXJuOworfQorc3RhdGljIGlubGluZSB2b2lkIG9sX3R4X2Zsb3dfcG9vbF9tYXBfaGFuZGxlcih1aW50OF90IGZsb3dfaWQsCisJdWludDhfdCBmbG93X3R5cGUsIHVpbnQ4X3QgZmxvd19wb29sX2lkLCB1aW50MTZfdCBmbG93X3Bvb2xfc2l6ZSkKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgb2xfdHhfZmxvd19wb29sX3VubWFwX2hhbmRsZXIodWludDhfdCBmbG93X2lkLAorCSB1aW50OF90IGZsb3dfdHlwZSwgdWludDhfdCBmbG93X3Bvb2xfaWQpCit7CisJcmV0dXJuOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKm9sX3R4X2NyZWF0ZV9mbG93X3Bvb2woCisJCXVpbnQ4X3QgZmxvd19wb29sX2lkLCB1aW50MTZfdCBmbG93X3Bvb2xfc2l6ZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG9sX3R4X2RlbGV0ZV9mbG93X3Bvb2woc3RydWN0IG9sX3R4X2Zsb3dfcG9vbF90ICpwb29sKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIG9sX3R4X3NldF9kZXNjX2dsb2JhbF9wb29sX3NpemUodWludDMyX3QgbnVtX21zZHVfZGVzYykKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9PTF9UWFJYX0NUUkxfQVBJX19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC9vbC9pbmMvb2xfdHhyeF9kYmcuaCBiL2NvcmUvZHAvb2wvaW5jL29sX3R4cnhfZGJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1MDEwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvb2wvaW5jL29sX3R4cnhfZGJnLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGZpbGUgb2xfdHhyeF9kYmcuaAorICogQGJyaWVmIEZ1bmN0aW9ucyBwcm92aWRlZCBmb3IgdmlzaWJpbGl0eSBhbmQgZGVidWdnaW5nLgorICovCisjaWZuZGVmIF9PTF9UWFJYX0RCR19fSF8KKyNkZWZpbmUgX09MX1RYUlhfREJHX19IXworCisjaW5jbHVkZSA8YXRoZGVmcy5oPiAgICAgICAgICAgIC8qIEFfU1RBVFVTLCB1aW50NjRfdCAqLworI2luY2x1ZGUgPGNkZl9sb2NrLmg+ICAgICAgICAgICAvKiBjZGZfc2VtYXBob3JlX3QgKi8KKyNpbmNsdWRlIDxodHQuaD4gICAgICAgICAgICAgICAgLyogaHR0X2RiZ19zdGF0c190eXBlICovCisjaW5jbHVkZSA8b2xfdHhyeF9zdGF0cy5oPiAgICAgIC8qIG9sX3R4cnhfc3RhdHMgKi8KKwordHlwZWRlZiB2b2lkICgqb2xfdHhyeF9zdGF0c19jYWxsYmFjaykodm9pZCAqY3R4dCwKKwkJCQkgICAgICAgZW51bSBodHRfZGJnX3N0YXRzX3R5cGUgdHlwZSwKKwkJCQkgICAgICAgdWludDhfdCAqYnVmLCBpbnQgYnl0ZXMpOworCitzdHJ1Y3Qgb2xfdHhyeF9zdGF0c19yZXEgeworCXVpbnQzMl90IHN0YXRzX3R5cGVfdXBsb2FkX21hc2s7ICAgICAgICAvKiB3aGljaCBzdGF0cyB0byB1cGxvYWQgKi8KKwl1aW50MzJfdCBzdGF0c190eXBlX3Jlc2V0X21hc2s7IC8qIHdoaWNoIHN0YXRzIHRvIHJlc2V0ICovCisKKwkvKiBzdGF0cyB3aWxsIGJlIHByaW50ZWQgaWYgZWl0aGVyIHByaW50IGVsZW1lbnQgaXMgc2V0ICovCisJc3RydWN0IHsKKwkJaW50IHZlcmJvc2U7ICAgIC8qIHZlcmJvc2Ugc3RhdHMgcHJpbnRvdXQgKi8KKwkJaW50IGNvbmNpc2U7ICAgIC8qIGNvbmNpc2Ugc3RhdHMgcHJpbnRvdXQgKHRha2VzIHByZWNlZGVuY2UpICovCisJfSBwcmludDsgICAgICAgICAgICAgICAgLyogcHJpbnQgdXBsb2FkZWQgc3RhdHMgKi8KKworCS8qIHN0YXRzIG5vdGlmeSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgaWYgZnAgaXMgbm9uLU5VTEwgKi8KKwlzdHJ1Y3QgeworCQlvbF90eHJ4X3N0YXRzX2NhbGxiYWNrIGZwOworCQl2b2lkICpjdHh0OworCX0gY2FsbGJhY2s7CisKKwkvKiBzdGF0cyB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGlmIGJ1ZiBpcyBub24tTlVMTCAqLworCXN0cnVjdCB7CisJCXVpbnQ4X3QgKmJ1ZjsKKwkJaW50IGJ5dGVfbGltaXQ7IC8qIGRvbid0IGNvcHkgbW9yZSB0aGFuIHRoaXMgKi8KKwl9IGNvcHk7CisKKwkvKgorCSAqIElmIGJsb2NraW5nIGlzIHRydWUsIHRoZSBjYWxsZXIgd2lsbCB0YWtlIHRoZSBzcGVjaWZpZWQgc2VtYXBob3JlCisJICogdG8gd2FpdCBmb3IgdGhlIHN0YXRzIHRvIGJlIHVwbG9hZGVkLCBhbmQgdGhlIGRyaXZlciB3aWxsIHJlbGVhc2UKKwkgKiB0aGUgc2VtYXBob3JlIHdoZW4gdGhlIHN0YXRzIGFyZSBkb25lIGJlaW5nIHVwbG9hZGVkLgorCSAqLworCXN0cnVjdCB7CisJCWludCBibG9ja2luZzsKKwkJY2RmX3NlbWFwaG9yZV90ICpzZW1fcHRyOworCX0gd2FpdDsKK307CisKKyNpZm5kZWYgVFhSWF9ERUJVR19MRVZFTAorI2RlZmluZSBUWFJYX0RFQlVHX0xFVkVMIDAgICAgICAvKiBubyBkZWJ1ZyBpbmZvICovCisjZW5kaWYKKworI2lmbmRlZiBBVEhfUEVSRl9QV1JfT0ZGTE9BRCAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgb2xfdHhyeF9kZWJ1Zyh2ZGV2LCBkZWJ1Z19zcGVjcykgMAorI2RlZmluZSBvbF90eHJ4X2Z3X3N0YXRzX2NmZyh2ZGV2LCB0eXBlLCB2YWwpIDAKKyNkZWZpbmUgb2xfdHhyeF9md19zdGF0c19nZXQodmRldiwgcmVxKSAwCisjZGVmaW5lIG9sX3R4cnhfYWdncl9jZmcodmRldiwgbWF4X3N1YmZybXNfYW1wZHUsIG1heF9zdWJmcm1zX2Ftc2R1KSAwCisKKyNlbHNlIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPG9sX3R4cnhfYXBpLmg+ICAgICAgICAvKiBvbF90eHJ4X3BkZXZfaGFuZGxlLCBldGMuICovCisKK2ludCBvbF90eHJ4X2RlYnVnKG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgaW50IGRlYnVnX3NwZWNzKTsKKwordm9pZCBvbF90eHJ4X2Z3X3N0YXRzX2NmZyhvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJCQkgIHVpbnQ4X3QgY2ZnX3N0YXRzX3R5cGUsIHVpbnQzMl90IGNmZ192YWwpOworCitpbnQgb2xfdHhyeF9md19zdGF0c19nZXQob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LAorCQkJIHN0cnVjdCBvbF90eHJ4X3N0YXRzX3JlcSAqcmVxKTsKKworaW50IG9sX3R4cnhfYWdncl9jZmcob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LAorCQkgICAgIGludCBtYXhfc3ViZnJtc19hbXBkdSwgaW50IG1heF9zdWJmcm1zX2Ftc2R1KTsKKworZW51bSB7CisJVFhSWF9EQkdfTUFTS19PQkpTID0gMHgwMSwKKwlUWFJYX0RCR19NQVNLX1NUQVRTID0gMHgwMiwKKwlUWFJYX0RCR19NQVNLX1BST1RfQU5BTFlaRSA9IDB4MDQsCisJVFhSWF9EQkdfTUFTS19SWF9SRU9SREVSX1RSQUNFID0gMHgwOCwKKwlUWFJYX0RCR19NQVNLX1JYX1BOX1RSQUNFID0gMHgxMAorfTsKKworLyotLS0gdHhyeCBwcmludG91dHMgLS0tKi8KKworLyoKKyAqIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSB0eHJ4IHByaW50b3V0cyB3aXRoIGR5bmFtaWNhbGx5IGFkanVzdGFibGUKKyAqIHZlcmJvc2l0eS4gIFRoZXNlIHByaW50b3V0cyBzaG91bGQgbm90IGltcGFjdCBwZXJmb3JtYW5jZS4KKyAqLworI2RlZmluZSBUWFJYX1BSSU5UX0VOQUJMRSAxCisvKiB1bmNvbW1lbnQgdGhpcyBmb3IgdmVyYm9zZSB0eHJ4IHByaW50b3V0cyAobWF5IGltcGFjdCBwZXJmb3JtYW5jZSkgKi8KKy8qICNkZWZpbmUgVFhSWF9QUklOVF9WRVJCT1NFX0VOQUJMRSAxICovCisKK3ZvaWQgb2xfdHhyeF9wcmludF9sZXZlbF9zZXQodW5zaWduZWQgbGV2ZWwpOworCisvKi0tLSB0eHJ4IG9iamVjdCAocGRldiwgdmRldiwgcGVlcikgZGlzcGxheSBkZWJ1ZyBmdW5jdGlvbnMgLS0tKi8KKworI2lmIFRYUlhfREVCVUdfTEVWRUwgPiA1Cit2b2lkIG9sX3R4cnhfcGRldl9kaXNwbGF5KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgaW50IGluZGVudCk7Cit2b2lkIG9sX3R4cnhfdmRldl9kaXNwbGF5KG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgaW50IGluZGVudCk7Cit2b2lkIG9sX3R4cnhfcGVlcl9kaXNwbGF5KG9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlciwgaW50IGluZGVudCk7CisjZWxzZQorI2RlZmluZSBvbF90eHJ4X3BkZXZfZGlzcGxheShwZGV2LCBpbmRlbnQpCisjZGVmaW5lIG9sX3R4cnhfdmRldl9kaXNwbGF5KHZkZXYsIGluZGVudCkKKyNkZWZpbmUgb2xfdHhyeF9wZWVyX2Rpc3BsYXkocGVlciwgaW5kZW50KQorI2VuZGlmCisKKy8qLS0tIHR4cnggc3RhdHMgZGlzcGxheSBkZWJ1ZyBmdW5jdGlvbnMgLS0tKi8KKworCit2b2lkIG9sX3R4cnhfc3RhdHNfZGlzcGxheShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYpOworCit2b2lkIG9sX3R4cnhfc3RhdHNfY2xlYXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KTsKKworCisvKi0tLSB0eHJ4IHByb3RvY29sIGFuYWx5emVyIGRlYnVnIGZlYXR1cmUgLS0tKi8KKworLyogdW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIHRoZSBwcm90b2NvbCBhbmFsenllciBmZWF0dXJlICovCisvKiAjZGVmaW5lIEVOQUJMRV9UWFJYX1BST1RfQU5BTFlaRSAxICovCisKKyNpZiBkZWZpbmVkKEVOQUJMRV9UWFJYX1BST1RfQU5BTFlaRSkKKwordm9pZCBvbF90eHJ4X3Byb3RfYW5zX2Rpc3BsYXkob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KTsKKworI2Vsc2UKKworI2RlZmluZSBvbF90eHJ4X3Byb3RfYW5zX2Rpc3BsYXkocGRldikKKworI2VuZGlmIC8qIEVOQUJMRV9UWFJYX1BST1RfQU5BTFlaRSAqLworCisvKi0tLSB0eHJ4IHNlcXVlbmNlIG51bWJlciB0cmFjZSBkZWJ1ZyBmZWF0dXJlIC0tLSovCisKKy8qIHVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSB0aGUgcnggcmVvcmRlciB0cmFjZSBmZWF0dXJlICovCisvKiAjZGVmaW5lIEVOQUJMRV9SWF9SRU9SREVSX1RSQUNFIDEgKi8KKworI2RlZmluZSBvbF90eHJ4X3NlcV9udW1fdHJhY2VfZGlzcGxheShwZGV2KSBcCisJb2xfcnhfcmVvcmRlcl90cmFjZV9kaXNwbGF5KHBkZXYsIDAsIDApCisKKyNpZiBkZWZpbmVkKEVOQUJMRV9SWF9SRU9SREVSX1RSQUNFKQorCit2b2lkCitvbF9yeF9yZW9yZGVyX3RyYWNlX2Rpc3BsYXkob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LCBpbnQganVzdF9vbmNlLCBpbnQgbGltaXQpOworCisjZWxzZQorCisjZGVmaW5lIG9sX3J4X3Jlb3JkZXJfdHJhY2VfZGlzcGxheShwZGV2LCBqdXN0X29uY2UsIGxpbWl0KQorCisjZW5kaWYgLyogRU5BQkxFX1JYX1JFT1JERVJfVFJBQ0UgKi8KKworLyotLS0gdHhyeCBwYWNrZXQgbnVtYmVyIHRyYWNlIGRlYnVnIGZlYXR1cmUgLS0tKi8KKworLyogdW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIHRoZSByeCBQTiB0cmFjZSBmZWF0dXJlICovCisvKiAjZGVmaW5lIEVOQUJMRV9SWF9QTl9UUkFDRSAxICovCisKKyNkZWZpbmUgb2xfdHhyeF9wbl90cmFjZV9kaXNwbGF5KHBkZXYpIG9sX3J4X3BuX3RyYWNlX2Rpc3BsYXkocGRldiwgMCkKKworI2lmIGRlZmluZWQoRU5BQkxFX1JYX1BOX1RSQUNFKQorCit2b2lkIG9sX3J4X3BuX3RyYWNlX2Rpc3BsYXkob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LCBpbnQganVzdF9vbmNlKTsKKworI2Vsc2UKKworI2RlZmluZSBvbF9yeF9wbl90cmFjZV9kaXNwbGF5KHBkZXYsIGp1c3Rfb25jZSkKKworI2VuZGlmIC8qIEVOQUJMRV9SWF9QTl9UUkFDRSAqLworCisvKi0tLSB0eCBxdWV1ZSBsb2cgZGVidWcgZmVhdHVyZSAtLS0qLworLyogdW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIHRoZSB0eCBxdWV1ZSBsb2cgZmVhdHVyZSAqLworLyogI2RlZmluZSBFTkFCTEVfVFhfUVVFVUVfTE9HIDEgKi8KKworI2RlZmluZSBvbF90eF9xdWV1ZV9sb2dfZGlzcGxheShwZGV2KQorCisjZW5kaWYgLyogQVRIX1BFUkZfUFdSX09GRkxPQUQgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYgLyogX09MX1RYUlhfREJHX19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC9vbC9pbmMvb2xfdHhyeF9odHRfYXBpLmggYi9jb3JlL2RwL29sL2luYy9vbF90eHJ4X2h0dF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA0MWNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9vbC9pbmMvb2xfdHhyeF9odHRfYXBpLmgKQEAgLTAsMCArMSw1NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGZpbGUgb2xfdHhyeF9odHRfYXBpLmgKKyAqIEBicmllZiBEZWZpbmUgdGhlIGhvc3QgZGF0YSBBUEkgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGUgaG9zdCBIVFQgU1cuCisgKi8KKyNpZm5kZWYgX09MX1RYUlhfSFRUX0FQSV9fSF8KKyNkZWZpbmUgX09MX1RYUlhfSFRUX0FQSV9fSF8KKworI2luY2x1ZGUgPGh0dC5oPiAgICAgICAgICAgICAgICAvKiBIVFRfVFhfQ09NUExfSU5EX1NUQVQgKi8KKyNpbmNsdWRlIDxhdGhkZWZzLmg+ICAgICAgICAgICAgLyogQV9TVEFUVVMgKi8KKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCAqLworCisjaW5jbHVkZSA8b2xfdHhyeF9hcGkuaD4gICAgICAgIC8qIG9sX3R4cnhfcGRldl9oYW5kbGUgKi8KKworc3RhdGljIGlubGluZSB1aW50MTZfdCAqb2xfdHhfbXNkdV9pZF9zdG9yYWdlKGNkZl9uYnVmX3QgbXNkdSkKK3sKKwljZGZfYXNzZXJ0KGNkZl9uYnVmX2hlYWRyb29tKG1zZHUpID49IChzaXplb2YodWludDE2X3QpICogMiAtIDEpKTsKKwlyZXR1cm4gKHVpbnQxNl90ICopICgoKGNkZl9zaXplX3QpIChjZGZfbmJ1Zl9oZWFkKG1zZHUpICsgMSkpICYgfjB4MSk7Cit9CisKKy8qKgorICogQGJyaWVmIFR4IE1TRFUgZG93bmxvYWQgY29tcGxldGlvbiBmb3IgYSBMTCBzeXN0ZW0KKyAqIEBkZXRhaWxzCisgKiAgUmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkb3dubG9hZGVkIHR4IGRlc2NyaXB0b3IuCisgKiAgSW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgdGhlIHJlZmVyZW5jZSBjb3VudCBpcyB6ZXJvLCBmcmVlCisgKiAgdGhlIHR4IGRlc2NyaXB0b3IgYW5kIHR4IGZyYW1lLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gKGFic3RyYWN0KSBwb2ludGVyIHRvIHRoZSB0eHJ4IHBoeXNpY2FsIGRldmljZQorICogQHBhcmFtIHN0YXR1cyAtIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGUgZG93bmxvYWQgc3VjY2VlZGVkCisgKiBAcGFyYW0gbXNkdSAtIHRoZSBkb3dubG9hZGVkIHR4IGZyYW1lCisgKiBAcGFyYW0gbXNkdV9pZCAtIHRoZSB0eHJ4IElEIG9mIHRoZSB0eCBmcmFtZSAtIHRoaXMgaXMgdXNlZCBmb3IKKyAqICAgICAgbG9jYXRpbmcgdGhlIGZyYW1lJ3MgdHggZGVzY3JpcHRvcgorICovCit2b2lkCitvbF90eF9kb3dubG9hZF9kb25lX2xsKHZvaWQgKnBkZXYsCisJCSAgICAgICBBX1NUQVRVUyBzdGF0dXMsIGNkZl9uYnVmX3QgbXNkdSwgdWludDE2X3QgbXNkdV9pZCk7CisKKy8qKgorICogQGJyaWVmIFR4IE1TRFUgZG93bmxvYWQgY29tcGxldGlvbiBmb3IgSEwgc3lzdGVtIHdpdGhvdXQgdHggY29tcGxldGlvbiBtc2dzCisgKiBAZGV0YWlscworICogIEZyZWUgdGhlIHR4IGRlc2NyaXB0b3IgYW5kIHR4IGZyYW1lLgorICogIEludm9rZSB0aGUgSEwgdHggZG93bmxvYWQgc2NoZWR1bGVyLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gKGFic3RyYWN0KSBwb2ludGVyIHRvIHRoZSB0eHJ4IHBoeXNpY2FsIGRldmljZQorICogQHBhcmFtIHN0YXR1cyAtIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGUgZG93bmxvYWQgc3VjY2VlZGVkCisgKiBAcGFyYW0gbXNkdSAtIHRoZSBkb3dubG9hZGVkIHR4IGZyYW1lCisgKiBAcGFyYW0gbXNkdV9pZCAtIHRoZSB0eHJ4IElEIG9mIHRoZSB0eCBmcmFtZSAtIHRoaXMgaXMgdXNlZCBmb3IKKyAqICAgICAgbG9jYXRpbmcgdGhlIGZyYW1lJ3MgdHggZGVzY3JpcHRvcgorICovCit2b2lkCitvbF90eF9kb3dubG9hZF9kb25lX2hsX2ZyZWUodm9pZCAqcGRldiwKKwkJCSAgICBBX1NUQVRVUyBzdGF0dXMsIGNkZl9uYnVmX3QgbXNkdSwgdWludDE2X3QgbXNkdV9pZCk7CisKKy8qKgorICogQGJyaWVmIFR4IE1TRFUgZG93bmxvYWQgY29tcGxldGlvbiBmb3IgSEwgc3lzdGVtIHdpdGggdHggY29tcGxldGlvbiBtc2dzCisgKiBAZGV0YWlscworICogIFJlbGVhc2UgdGhlIHJlZmVyZW5jZSB0byB0aGUgZG93bmxvYWRlZCB0eCBkZXNjcmlwdG9yLgorICogIEluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IHRoZSByZWZlcmVuY2UgY291bnQgaXMgemVybywgZnJlZQorICogIHRoZSB0eCBkZXNjcmlwdG9yIGFuZCB0eCBmcmFtZS4KKyAqICBPcHRpb25hbGx5LCBpbnZva2UgdGhlIEhMIHR4IGRvd25sb2FkIHNjaGVkdWxlci4gIChJdCBpcyBwcm9iYWJsZSB0aGF0CisgKiAgdGhlIEhMIHR4IGRvd25sb2FkIHNjaGVkdWxlciB3b3VsZCBvcGVyYXRlIGluIHJlc3BvbnNlIHRvIHR4IGNvbXBsZXRpb24KKyAqICBtZXNzYWdlcyByYXRoZXIgdGhhbiBkb3dubG9hZCBjb21wbGV0aW9uIGV2ZW50cy4pCisgKgorICogQHBhcmFtIHBkZXYgLSAoYWJzdHJhY3QpIHBvaW50ZXIgdG8gdGhlIHR4cnggcGh5c2ljYWwgZGV2aWNlCisgKiBAcGFyYW0gc3RhdHVzIC0gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBkb3dubG9hZCBzdWNjZWVkZWQKKyAqIEBwYXJhbSBtc2R1IC0gdGhlIGRvd25sb2FkZWQgdHggZnJhbWUKKyAqIEBwYXJhbSBtc2R1X2lkIC0gdGhlIHR4cnggSUQgb2YgdGhlIHR4IGZyYW1lIC0gdGhpcyBpcyB1c2VkIGZvcgorICogICAgICBsb2NhdGluZyB0aGUgZnJhbWUncyB0eCBkZXNjcmlwdG9yCisgKi8KK3ZvaWQKK29sX3R4X2Rvd25sb2FkX2RvbmVfaGxfcmV0YWluKHZvaWQgKnBkZXYsCisJCQkgICAgICBBX1NUQVRVUyBzdGF0dXMsCisJCQkgICAgICBjZGZfbmJ1Zl90IG1zZHUsIHVpbnQxNl90IG1zZHVfaWQpOworCisvKgorICogRm9yIG5vdywgbWFrZSB0aGUgaG9zdCBIVFQgLT4gaG9zdCB0eHJ4IHR4IGNvbXBsZXRpb24gc3RhdHVzCisgKiBtYXRjaCB0aGUgdGFyZ2V0IEhUVCAtPiBob3N0IEhUVCB0eCBjb21wbGV0aW9uIHN0YXR1cywgc28gbm8KKyAqIHRyYW5zbGF0aW9uIGlzIG5lZWRlZC4KKyAqLworLyoKKyAqIGhvc3Qtb25seSBzdGF0dXNlcyB1c2UgYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUgbnVtYmVyIHNwYWNlCisgKiB0aGFuIGhvc3QtdGFyZ2V0IHN0YXR1c2VzCisgKi8KKyNkZWZpbmUgSFRUX0hPU1RfT05MWV9TVEFUVVNfQ09ERV9TVEFSVCAxMjgKK2VudW0gaHR0X3R4X3N0YXR1cyB7CisJLyogb2sgLSBzdWNjZXNzZnVsbHkgc2VudCArIGFja2VkICovCisJaHR0X3R4X3N0YXR1c19vayA9IEhUVF9UWF9DT01QTF9JTkRfU1RBVF9PSywKKworCS8qIGRpc2NhcmQgLSBub3Qgc2VudCAoY29uZ2VzdGlvbiBjb250cm9sKSAqLworCWh0dF90eF9zdGF0dXNfZGlzY2FyZCA9IEhUVF9UWF9DT01QTF9JTkRfU1RBVF9ESVNDQVJELAorCisJLyogbm9fYWNrIC0gc2VudCwgYnV0IG5vIGFjayAqLworCWh0dF90eF9zdGF0dXNfbm9fYWNrID0gSFRUX1RYX0NPTVBMX0lORF9TVEFUX05PX0FDSywKKworCS8qIGRvd25sb2FkX2ZhaWwgLSBob3N0IGNvdWxkIG5vdCBkZWxpdmVyIHRoZSB0eCBmcmFtZSB0byB0YXJnZXQgKi8KKwlodHRfdHhfc3RhdHVzX2Rvd25sb2FkX2ZhaWwgPSBIVFRfSE9TVF9PTkxZX1NUQVRVU19DT0RFX1NUQVJULAorfTsKKworLyoqCisgKiBAYnJpZWYgUHJvY2VzcyBhIHR4IGNvbXBsZXRpb24gbWVzc2FnZSBzZW50IGJ5IHRoZSB0YXJnZXQuCisgKiBAZGV0YWlscworICogIFdoZW4gdGhlIHRhcmdldCBpcyBkb25lIHRyYW5zbWl0dGluZyBhIHR4IGZyYW1lIChlaXRoZXIgYmVjYXVzZQorICogIHRoZSBmcmFtZSB3YXMgc2VudCArIGFja25vd2xlZGdlZCwgb3IgYmVjYXVzZSB0aGUgdGFyZ2V0IGdhdmUgdXApCisgKiAgaXQgc2VuZHMgYSB0eCBjb21wbGV0aW9uIG1lc3NhZ2UgdG8gdGhlIGhvc3QuCisgKiAgVGhpcyBub3RpZmljYXRpb24gZnVuY3Rpb24gaXMgdXNlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlCisgKiAgdHJhbnNtaXNzaW9uIHN1Y2NlZWRlZCBvciBub3Q7IHRoZSBzdGF0dXMgYXJndW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIKKyAqICB0aGUgdHJhbnNtaXNzaW9uIHN1Y2NlZWRlZC4KKyAqICBUaGlzIHR4IGNvbXBsZXRpb24gbWVzc2FnZSBpbmRpY2F0ZXMgdmlhIHRoZSBkZXNjcmlwdG9yIElEIHdoaWNoCisgKiAgdHggZnJhbWVzIHdlcmUgY29tcGxldGVkLCBhbmQgaW5kaWNhdGVzIHZpYSB0aGUgc3RhdHVzIHdoZXRoZXIgdGhlCisgKiAgZnJhbWVzIHdlcmUgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5LgorICogIFRoZSBob3N0IGZyZWVzIHRoZSBjb21wbGV0ZWQgZGVzY3JpcHRvcnMgLyBmcmFtZXMgKHVwZGF0aW5nIHN0YXRzCisgKiAgaW4gdGhlIHByb2Nlc3MpLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIGRhdGEgcGh5c2ljYWwgZGV2aWNlIHRoYXQgc2VudCB0aGUgdHggZnJhbWVzCisgKiAgICAgIChyZWdpc3RlcmVkIHdpdGggSFRUIGFzIGEgY29udGV4dCBwb2ludGVyIGR1cmluZyBhdHRhY2ggdGltZSkKKyAqIEBwYXJhbSBudW1fbXNkdXMgLSBob3cgbWFueSBNU0RVcyBhcmUgcmVmZXJlbmNlZCBieSB0aGUgdHggY29tcGxldGlvbgorICogICAgICBtZXNzYWdlCisgKiBAcGFyYW0gc3RhdHVzIC0gd2hldGhlciB0cmFuc21pc3Npb24gd2FzIHN1Y2Nlc3NmdWwKKyAqIEBwYXJhbSB0eF9tc2R1X2lkX2l0ZXJhdG9yIC0gYWJzdHJhY3QgbWV0aG9kIG9mIGZpbmRpbmcgdGhlIElEcyBmb3IgdGhlCisgKiAgICAgIGluZGl2aWR1YWwgTVNEVXMgcmVmZXJlbmNlZCBieSB0aGUgdHggY29tcGxldGlvbiBtZXNzYWdlLCB2aWEgdGhlCisgKiAgICAgIGh0dF90eF9jb21wbF9kZXNjX2lkIEFQSSBmdW5jdGlvbgorICovCit2b2lkCitvbF90eF9jb21wbGV0aW9uX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJIGludCBudW1fbXNkdXMsCisJCQkgZW51bSBodHRfdHhfc3RhdHVzIHN0YXR1cywgdm9pZCAqdHhfbXNkdV9pZF9pdGVyYXRvcik7CisKK3ZvaWQgb2xfdHhfY3JlZGl0X2NvbXBsZXRpb25faGFuZGxlcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIGludCBjcmVkaXRzKTsKKworLyoqCisgKiBAYnJpZWYgSW5pdCB0aGUgdG90YWwgYW1vdW50IG9mIHRhcmdldCBjcmVkaXQuCisgKiBAZGV0YWlscworICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIGRhdGEgcGh5c2ljYWwgZGV2aWNlIHRoYXQgc2VudCB0aGUgdHggZnJhbWVzCisgKiBAcGFyYW0gY3JlZGl0X2RlbHRhIC0gaG93IG11Y2ggdG8gaW5jcmVtZW50IHRoZSB0YXJnZXQncyB0eCBjcmVkaXQgYnkKKyAqLwordm9pZCBvbF90eF90YXJnZXRfY3JlZGl0X2luaXQoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LCBpbnQgY3JlZGl0X2RlbHRhKTsKKworLyoqCisgKiBAYnJpZWYgUHJvY2VzcyBhIHR4IGNvbXBsZXRpb24gbWVzc2FnZSBmb3IgYSBzaW5nbGUgTVNEVS4KKyAqIEBkZXRhaWxzCisgKiAgVGhlIG9sX3R4X3NpbmdsZV9jb21wbGV0aW9uX2hhbmRsZXIgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIHNhbWUgdHgKKyAqICBjb21wbGV0aW9uIHByb2Nlc3NpbmcgYXMgdGhlIG9sX3R4X2NvbXBsZXRpb25faGFuZGxlciwgYnV0IGZvciBhCisgKiAgc2luZ2xlIGZyYW1lLgorICogIG9sX3R4X2NvbXBsZXRpb25faGFuZGxlciBpcyBvcHRpbWl6ZWQgdG8gaGFuZGxlIGJhdGNoIGNvbXBsZXRpb25zCisgKiAgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGU7IGluIGNvbnRyYXN0IG9sX3R4X3NpbmdsZV9jb21wbGV0aW9uX2hhbmRsZXIKKyAqICBoYW5kbGVzIHNpbmdsZSBmcmFtZXMgYXMgc2ltcGx5IGFuZCBnZW5lcmFsbHkgYXMgcG9zc2libGUuCisgKiAgVGh1cywgdGhpcyBvbF90eF9zaW5nbGVfY29tcGxldGlvbl9oYW5kbGVyIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIGZvcgorICogIGludGVybWl0dGVudCB1c2FnZSwgc3VjaCBhcyBmb3IgdHggbWdtdCBmcmFtZXMuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZGF0YSBwaHlzaWNhbCBkZXZpY2UgdGhhdCBzZW50IHRoZSB0eCBmcmFtZXMKKyAqIEBwYXJhbSBzdGF0dXMgLSB3aGV0aGVyIHRyYW5zbWlzc2lvbiB3YXMgc3VjY2Vzc2Z1bAorICogQHBhcmFtIHR4X21zZHVfaWQgLSBJRCBvZiB0aGUgZnJhbWUgd2hpY2ggY29tcGxldGVkIHRyYW5zbWlzc2lvbgorICovCit2b2lkCitvbF90eF9zaW5nbGVfY29tcGxldGlvbl9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCQllbnVtIGh0dF90eF9zdGF0dXMgc3RhdHVzLCB1aW50MTZfdCB0eF9kZXNjX2lkKTsKKworLyoqCisgKiBAYnJpZWYgVXBkYXRlIHRoZSBhbW91bnQgb2YgdGFyZ2V0IGNyZWRpdC4KKyAqIEBkZXRhaWxzCisgKiAgV2hlbiB0aGUgdGFyZ2V0IGZpbmlzaGVzIHdpdGggYW4gb2xkIHRyYW5zbWl0IGZyYW1lLCBpdCBjYW4gdXNlIHRoZQorICogIHNwYWNlIHRoYXQgd2FzIG9jY3VwaWVkIGJ5IHRoZSBvbGQgdHggZnJhbWUgdG8gc3RvcmUgYSBuZXcgdHggZnJhbWUuCisgKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluZm9ybSB0aGUgdHhyeCBsYXllciwgd2hlcmUgdGhlIEhMIHR4IGRvd25sb2FkCisgKiAgc2NoZWR1bGVyIHJlc2lkZXMsIGFib3V0IHN1Y2ggdXBkYXRlcyB0byB0aGUgdGFyZ2V0J3MgdHggY3JlZGl0LgorICogIFRoaXMgY3JlZGl0IHVwZGF0ZSBpcyBkb25lIGV4cGxpY2l0bHksIHJhdGhlciB0aGFuIGhhdmluZyB0aGUgdHhyeCBsYXllcgorICogIHVwZGF0ZSB0aGUgY3JlZGl0IGNvdW50IGl0c2VsZiBpbnNpZGUgdGhlIG9sX3R4X2NvbXBsZXRpb24gaGFuZGxlcgorICogIGZ1bmN0aW9uLiAgVGhpcyBwcm92aWRlcyBIVFQgd2l0aCB0aGUgZmxleGliaWxpdHkgdG8gbGltaXQgdGhlIHJhdGUgb2YKKyAqICBkb3dubG9hZHMgZnJvbSB0aGUgVFhSWCBsYXllcidzIGRvd25sb2FkIHNjaGVkdWxlciwgYnkgY29udHJvbGxpbmcgaG93CisgKiAgbXVjaCBjcmVkaXQgdGhlIGRvd25sb2FkIHNjaGVkdWxlciBnZXRzLCBhbmQgYWxzbyBwcm92aWRlcyB0aGUgZmxleGliaWxpdHkKKyAqICB0byBhY2NvdW50IGZvciBhIGNoYW5nZSBpbiB0aGUgdHggbWVtb3J5IHBvb2wgc2l6ZSB3aXRoaW4gdGhlIHRhcmdldC4KKyAqICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgSEwgc3lzdGVtczsgaW4gTEwgc3lzdGVtcywgZWFjaCB0eCBmcmFtZQorICogIGlzIGFzc3VtZWQgdG8gdXNlIGV4YWN0bHkgb25lIGNyZWRpdCAoZm9yIGl0cyB0YXJnZXQtc2lkZSB0eCBkZXNjcmlwdG9yKSwKKyAqICBhbmQgYW55IHJhdGUgbGltaXRpbmcgaXMgbWFuYWdlZCB3aXRoaW4gdGhlIHRhcmdldC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBkYXRhIHBoeXNpY2FsIGRldmljZSB0aGF0IHNlbnQgdGhlIHR4IGZyYW1lcworICogQHBhcmFtIGNyZWRpdF9kZWx0YSAtIGhvdyBtdWNoIHRvIGluY3JlbWVudCB0aGUgdGFyZ2V0J3MgdHggY3JlZGl0IGJ5CisgKi8KK3ZvaWQgb2xfdHhfdGFyZ2V0X2NyZWRpdF91cGRhdGUoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LCBpbnQgY3JlZGl0X2RlbHRhKTsKKworLyoqCisgKiBAYnJpZWYgUHJvY2VzcyBhbiByeCBpbmRpY2F0aW9uIG1lc3NhZ2Ugc2VudCBieSB0aGUgdGFyZ2V0LgorICogQGRldGFpbHMKKyAqICBUaGUgdGFyZ2V0IHNlbmRzIGEgcnggaW5kaWNhdGlvbiBtZXNzYWdlIHRvIHRoZSBob3N0IGFzIGEKKyAqICBub3RpZmljYXRpb24gdGhhdCB0aGVyZSBhcmUgbmV3IHJ4IGZyYW1lcyBhdmFpbGFibGUgZm9yIHRoZQorICogIGhvc3QgdG8gcHJvY2Vzcy4KKyAqICBUaGUgSFRUIGhvc3QgbGF5ZXIgbG9jYXRlcyB0aGUgcnggZGVzY3JpcHRvcnMgYW5kIHJ4IGZyYW1lcworICogIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5kaWNhdGlvbiwgYW5kIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8KKyAqICBpbnZva2UgdGhlIHJ4IGRhdGEgcHJvY2Vzc2luZyBvbiB0aGUgbmV3IGZyYW1lcy4KKyAqICAoRm9yIExMLCB0aGUgcnggZGVzY3JpcHRvcnMgYW5kIGZyYW1lcyBhcmUgZGVsaXZlcmVkIGRpcmVjdGx5CisgKiAgdG8gdGhlIGhvc3QgdmlhIE1BQyBETUEsIHdoaWxlIGZvciBITCB0aGUgcnggZGVzY3JpcHRvciBhbmQKKyAqICBmcmFtZSBmb3IgaW5kaXZpZHVhbCBmcmFtZXMgYXJlIGNvbWJpbmVkIHdpdGggdGhlIHJ4IGluZGljYXRpb24KKyAqICBtZXNzYWdlLikKKyAqICBBbGwgTVBEVXMgcmVmZXJlbmNlZCBieSBhIHJ4IGluZGljYXRpb24gbWVzc2FnZSBiZWxvbmcgdG8gdGhlCisgKiAgc2FtZSBwZWVyLVRJRC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBkYXRhIHBoeXNpY2FsIGRldmljZSB0aGF0IHJlY2VpdmVkIHRoZSBmcmFtZXMKKyAqICAgICAgKHJlZ2lzdGVyZWQgd2l0aCBIVFQgYXMgYSBjb250ZXh0IHBvaW50ZXIgZHVyaW5nIGF0dGFjaCB0aW1lKQorICogQHBhcmFtIHJ4X2luZF9tc2cgLSB0aGUgbmV0d29yayBidWZmZXIgaG9sZGluZyB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlCisgKiAgICAgIChGb3IgSEwsIHRoaXMgbmV0YnVmIGFsc28gaG9sZHMgdGhlIHJ4IGRlc2MgYW5kIHJ4IHBheWxvYWQsIGJ1dAorICogICAgICB0aGUgZGF0YSBTVyBpcyBhZ25vc3RpYyB0byB3aGV0aGVyIHRoZSBkZXNjIGFuZCBwYXlsb2FkIGFyZQorICogICAgICBwaWdneWJhY2tlZCB3aXRoIHRoZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UuKQorICogQHBhcmFtIHBlZXJfaWQgLSB3aGljaCBwZWVyIHNlbnQgdGhpcyByeCBkYXRhCisgKiBAcGFyYW0gdGlkIC0gd2hhdCAoZXh0ZW5kZWQpIHRyYWZmaWMgdHlwZSB0aGUgcnggZGF0YSBpcworICogQHBhcmFtIG51bV9tcGR1X3JhbmdlcyAtIGhvdyBtYW55IHJhbmdlcyBvZiBNUERVcyBkb2VzIHRoZSBtZXNzYWdlIGRlc2NyaWJlLgorICogICAgICBFYWNoIE1QRFUgd2l0aGluIHRoZSByYW5nZSBoYXMgdGhlIHNhbWUgcnggc3RhdHVzLgorICovCit2b2lkCitvbF9yeF9pbmRpY2F0aW9uX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJIGNkZl9uYnVmX3QgcnhfaW5kX21zZywKKwkJCSB1aW50MTZfdCBwZWVyX2lkLCB1aW50OF90IHRpZCwgaW50IG51bV9tcGR1X3Jhbmdlcyk7CisKKy8qKgorICogQGJyaWVmIFByb2Nlc3MgYW4gcnggZnJhZ21lbnQgaW5kaWNhdGlvbiBtZXNzYWdlIHNlbnQgYnkgdGhlIHRhcmdldC4KKyAqIEBkZXRhaWxzCisgKiAgVGhlIHRhcmdldCBzZW5kcyBhIHJ4IGZyYWdtZW50IGluZGljYXRpb24gbWVzc2FnZSB0byB0aGUgaG9zdCBhcyBhCisgKiAgbm90aWZpY2F0aW9uIHRoYXQgdGhlcmUgYXJlIG5ldyByeCBmcmFnbWVudCBhdmFpbGFibGUgZm9yIHRoZQorICogIGhvc3QgdG8gcHJvY2Vzcy4KKyAqICBUaGUgSFRUIGhvc3QgbGF5ZXIgbG9jYXRlcyB0aGUgcnggZGVzY3JpcHRvcnMgYW5kIHJ4IGZyYWdtZW50CisgKiAgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmRpY2F0aW9uLCBhbmQgY2FsbHMgdGhpcyBmdW5jdGlvbiB0bworICogIGludm9rZSB0aGUgcnggZnJhZ21lbnQgZGF0YSBwcm9jZXNzaW5nIG9uIHRoZSBuZXcgZnJhZ21lbnQuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZGF0YSBwaHlzaWNhbCBkZXZpY2UgdGhhdCByZWNlaXZlZCB0aGUgZnJhbWVzCisgKiAgICAgIChyZWdpc3RlcmVkIHdpdGggSFRUIGFzIGEgY29udGV4dCBwb2ludGVyIGR1cmluZyBhdHRhY2ggdGltZSkKKyAqIEBwYXJhbSByeF9mcmFnX2luZF9tc2cgLSB0aGUgbmV0d29yayBidWZmZXIgaG9sZGluZyB0aGUgcnggZnJhZ21lbnQgaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBAcGFyYW0gcGVlcl9pZCAtIHdoaWNoIHBlZXIgc2VudCB0aGlzIHJ4IGRhdGEKKyAqIEBwYXJhbSB0aWQgLSB3aGF0IChleHRlbmRlZCkgdHJhZmZpYyB0eXBlIHRoZSByeCBkYXRhIGlzCisgKi8KK3ZvaWQgb2xfcnhfZnJhZ19pbmRpY2F0aW9uX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSAgIGNkZl9uYnVmX3QgcnhfZnJhZ19pbmRfbXNnLAorCQkJCSAgIHVpbnQxNl90IHBlZXJfaWQsIHVpbnQ4X3QgdGlkKTsKKworLyoqCisgKiBAYnJpZWYgUHJvY2VzcyByeCBvZmZsb2FkIGRlbGl2ZXIgaW5kaWNhdGlvbiBtZXNzYWdlIHNlbnQgYnkgdGhlIHRhcmdldC4KKyAqIEBkZXRhaWxzCisgKiAgV2hlbiB0aGUgdGFyZ2V0IGV4aXRzIG9mZmxvYWQgbW9kZSwgdGFyZ2V0IGRlbGl2ZXJzIHBhY2tldHMgdGhhdCBpdCBoYXMKKyAqICBoZWxkIGluIGl0cyBtZW1vcnkgdG8gdGhlIGhvc3QgdXNpbmcgdGhpcyBtZXNzYWdlLgorICogIExvdyBsYXRlbmN5IGNhc2U6CisgKiAgVGhlIG1lc3NhZ2UgY29udGFpbnMgdGhlIG51bWJlciBvZiBNU0RVcyB0aGF0IGFyZSBiZWluZyBkZWxpdmVyZWQgYnkgdGhlCisgKiAgdGFyZ2V0IHRvIHRoZSBob3N0LiBUaGUgcGFja2V0IGl0c2VsZiByZXNpZGVzIGluIGhvc3QgcmluZyBhbG9uZyB3aXRoIHNvbWUKKyAqICBtZXRhZGF0YSBkZXNjcmliaW5nIHRoZSBwZWVyIGlkLCB2ZGV2IGlkLCB0aWQsIEZXIGRlc2MgYW5kIGxlbmd0aCBvZgorICogIHRoZSBwYWNrZXQgYmVpbmcgZGVsaXZlcmVkLgorICogIEhpZ2h0IGxldGVuY3kgY2FzZToKKyAqICBUaGUgbWVzc2FnZSBpdHNlbGYgY29udGFpbnMgdGhlIHBheWxvYWQgb2YgdGhlIE1TRFUgYmVpbmcgZGVsaXZlcmVkIGJ5CisgKiAgdGhlIHRhcmdldCB0byB0aGUgaG9zdC4gVGhlIG1lc3NhZ2UgYWxzbyBjb250YWlucyBtZXRhIGRhdGEgZGVzY3JpYmluZworICogIHRoZSBwYWNrZXQgc3VjaCBhcyBwZWVyIGlkLCB2ZGV2IGlkLCB0aWQsIEZXIGRlc2MgYW5kIGxlbmd0aCBvZiB0aGUgcGFja2V0CisgKiAgYmVpbmcgZGVsaXZlcmVkLiBSZWZlciB0byBodHQuaCBmb3IgdGhlIGV4YWN0IHN0cnVjdHVyZSBvZiB0aGUgbWVzc2FnZS4KKyAqICBAcGFyYW0gcGRldiAtIHRoZSBkYXRhIHBoeXNpY2FsIGRldmljZSB0aGF0IHJlY2VpdmVkIHRoZSBmcmFtZS4KKyAqICBAcGFyYW0gbXNnIC0gb2ZmbG9hZCBkZWxpdmVyIGluZGljYXRpb24gbWVzc2FnZQorICogIEBwYXJhbSBtc2R1X2NudCAtIG51bWJlciBvZiBNU0RVcyBiZWluZyBkZWxpdnJlZC4KKyAqLwordm9pZAorb2xfcnhfb2ZmbG9hZF9kZWxpdmVyX2luZF9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCQkgIGNkZl9uYnVmX3QgbXNnLCBpbnQgbXNkdV9jbnQpOworCisvKioKKyAqIEBicmllZiBQcm9jZXNzIGEgcGVlciBtYXAgbWVzc2FnZSBzZW50IGJ5IHRoZSB0YXJnZXQuCisgKiBAZGV0YWlscworICogIEVhY2ggdGltZSB0aGUgdGFyZ2V0IGFsbG9jYXRlcyBhIG5ldyBwZWVyIElELCBpdCB3aWxsIGluZm9ybSB0aGUKKyAqICBob3N0IHZpYSB0aGUgInBlZXIgbWFwIiBtZXNzYWdlLiAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhhdAorICogIG1lc3NhZ2UuICBUaGUgaG9zdCBkYXRhIFNXIGxvb2tzIGZvciBhIHBlZXIgb2JqZWN0IHdob3NlIE1BQyBhZGRyZXNzCisgKiAgbWF0Y2hlcyB0aGUgTUFDIGFkZHJlc3Mgc3BlY2lmaWVkIGluIHRoZSBwZWVyIG1hcCBtZXNzYWdlLCBhbmQgdGhlbgorICogIHNldHMgdXAgYSBtYXBwaW5nIGJldHdlZW4gdGhlIHBlZXIgSUQgc3BlY2lmaWVkIGluIHRoZSBtZXNzYWdlIGFuZAorICogIHRoZSBwZWVyIG9iamVjdCB0aGF0IHdhcyBmb3VuZC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGRhdGEgcGh5c2ljYWwgZGV2aWNlIGhhbmRsZQorICogICAgICAocmVnaXN0ZXJlZCB3aXRoIEhUVCBhcyBhIGNvbnRleHQgcG9pbnRlciBkdXJpbmcgYXR0YWNoIHRpbWUpCisgKiBAcGFyYW0gcGVlcl9pZCAtIElEIGdlbmVyYXRlZCBieSB0aGUgdGFyZ2V0IHRvIHJlZmVyIHRvIHRoZSBwZWVyIGluIHF1ZXN0aW9uCisgKiAgICAgIFRoZSB0YXJnZXQgbWF5IGNyZWF0ZSBtdWx0aXBsZSBJRHMgZm9yIGEgc2luZ2xlIHBlZXIuCisgKiBAcGFyYW0gdmRldl9pZCAtIFJlZmVyZW5jZSB0byB0aGUgdmlydHVhbCBkZXZpY2UgdGhlIHBlZXIgaXMgYXNzb2NpYXRlZCB3aXRoCisgKiBAcGFyYW0gcGVlcl9tYWNfYWRkciAtIE1BQyBhZGRyZXNzIG9mIHRoZSBwZWVyIGluIHF1ZXN0aW9uCisgKiBAcGFyYW0gdHhfcmVhZHkgLSB3aGV0aGVyIHRyYW5zbWl0cyB0byB0aGlzIHBlZXIgY2FuIGJlIGRvbmUgYWxyZWFkeSwgb3IKKyAqICAgICAgbmVlZCB0byB3YWl0IGZvciBhIGNhbGwgdG8gcGVlcl90eF9yZWFkeSAob25seSBhcHBsaWVzIHRvIEhMIHN5c3RlbXMpCisgKi8KK3ZvaWQKK29sX3J4X3BlZXJfbWFwX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgICAgdWludDE2X3QgcGVlcl9pZCwKKwkJICAgICAgIHVpbnQ4X3QgdmRldl9pZCwgdWludDhfdCAqcGVlcl9tYWNfYWRkciwgaW50IHR4X3JlYWR5KTsKKworLyoqCisgKiBAYnJpZWYgbm90aWZ5IHRoZSBob3N0IHRoYXQgdGhlIHRhcmdldCBpcyByZWFkeSB0byB0cmFuc21pdCB0byBhIG5ldyBwZWVyLgorICogQGRldGFpbHMKKyAqICBTb21lIHRhcmdldHMgY2FuIGltbWVkaWF0ZWx5IGFjY2VwdCB0eCBmcmFtZXMgZm9yIGEgbmV3IHBlZXIsIGFzIHNvb24gYXMKKyAqICB0aGUgcGVlcidzIGFzc29jaWF0aW9uIGNvbXBsZXRlcy4gIE90aGVyIHRhcmdldCBuZWVkIGEgc2hvcnQgc2V0dXAgdGltZQorICogIGJlZm9yZSB0aGV5IGFyZSByZWFkeSB0byBhY2NlcHQgdHggZnJhbWVzIGZvciB0aGUgbmV3IHBlZXIuCisgKiAgSWYgdGhlIHRhcmdldCBuZWVkcyB0aW1lIGZvciBzZXR1cCwgaXQgd2lsbCBwcm92aWRlIGEgcGVlcl90eF9yZWFkeQorICogIG1lc3NhZ2Ugd2hlbiBpdCBpcyBkb25lIHdpdGggdGhlIHNldHVwLiAgVGhpcyBmdW5jdGlvbiBmb3J3YXJkcyB0aGlzCisgKiAgbm90aWZpY2F0aW9uIGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdCdzIHR4IHF1ZXVlIG1hbmFnZXIuCisgKiAgVGhpcyBmdW5jdGlvbiBvbmx5IGFwcGxpZXMgZm9yIEhMIHN5c3RlbXMsIGluIHdoaWNoIHRoZSBob3N0IGRldGVybWluZXMKKyAqICB3aGljaCBwZWVyIGEgZ2l2ZW4gdHggZnJhbWUgaXMgZm9yLCBhbmQgc3RvcmVzIHRoZSB0eCBmcmFtZXMgaW4gcXVldWVzLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gZGF0YSBwaHlzaWNhbCBkZXZpY2UgaGFuZGxlCisgKiAgICAgIChyZWdpc3RlcmVkIHdpdGggSFRUIGFzIGEgY29udGV4dCBwb2ludGVyIGR1cmluZyBhdHRhY2ggdGltZSkKKyAqIEBwYXJhbSBwZWVyX2lkIC0gSUQgZm9yIHRoZSBuZXcgcGVlciB3aGljaCBjYW4gbm93IGFjY2VwdCB0eCBmcmFtZXMKKyAqLwordm9pZCBvbF90eHJ4X3BlZXJfdHhfcmVhZHlfaGFuZGxlcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIHVpbnQxNl90IHBlZXJfaWQpOworCisvKioKKyAqIEBicmllZiBQcm9jZXNzIGEgcGVlciB1bm1hcCBtZXNzYWdlIHNlbnQgYnkgdGhlIHRhcmdldC4KKyAqIEBkZXRhaWxzCisgKiAgRWFjaCB0aW1lIHRoZSB0YXJnZXQgZnJlZXMgYSBwZWVyIElELCBpdCB3aWxsIGluZm9ybSB0aGUgaG9zdCB2aWEgdGhlCisgKiAgInBlZXIgdW5tYXAiIG1lc3NhZ2UuICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGF0IG1lc3NhZ2UuCisgKiAgVGhlIGhvc3QgZGF0YSBTVyB1c2VzIHRoZSBwZWVyIElEIGZyb20gdGhlIG1lc3NhZ2UgdG8gZmluZCB0aGUgcGVlcgorICogIG9iamVjdCBmcm9tIHBlZXJfbWFwW3BlZXJfaWRdLCB0aGVuIGludmFsaWRhdGVzIHBlZXJfbWFwW3BlZXJfaWRdCisgKiAgKGJ5IHNldHRpbmcgaXQgdG8gTlVMTCksIGFuZCBjaGVja3Mgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbWFpbmluZworICogIHJlZmVyZW5jZXMgdG8gdGhlIHBlZXIgb2JqZWN0LiAgSWYgbm90LCB0aGUgZnVuY3Rpb24gZGVsZXRlcyB0aGUKKyAqICBwZWVyIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGRhdGEgcGh5c2ljYWwgZGV2aWNlIGhhbmRsZQorICogICAgICAocmVnaXN0ZXJlZCB3aXRoIEhUVCBhcyBhIGNvbnRleHQgcG9pbnRlciBkdXJpbmcgYXR0YWNoIHRpbWUpCisgKiBAcGFyYW0gcGVlcl9pZCAtIElEIHRoYXQgaXMgYmVpbmcgZnJlZWQuCisgKiAgICAgIFRoZSB0YXJnZXQgbWF5IGNyZWF0ZSBtdWx0aXBsZSBJRHMgZm9yIGEgc2luZ2xlIHBlZXIuCisgKi8KK3ZvaWQgb2xfcnhfcGVlcl91bm1hcF9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDE2X3QgcGVlcl9pZCk7CisKKy8qKgorICogQGJyaWVmIFByb2Nlc3MgYSBzZWN1cml0eSBpbmRpY2F0aW9uIG1lc3NhZ2Ugc2VudCBieSB0aGUgdGFyZ2V0LgorICogQGRldGFpbHMKKyAqICBXaGVuIGEga2V5IGlzIGFzc2lnbmVkIHRvIGEgcGVlciwgdGhlIHRhcmdldCB3aWxsIGluZm9ybSB0aGUgaG9zdAorICogIHdpdGggYSBzZWN1cml0eSBpbmRpY2F0aW9uIG1lc3NhZ2UuCisgKiAgVGhlIGhvc3QgcmVtZW1iZXJzIHRoZSBzZWN1cml0eSB0eXBlLCBhbmQgaW5mZXJzIHdoZXRoZXIgYSByeCBQTgorICogIGNoZWNrIGlzIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGRhdGEgcGh5c2ljYWwgZGV2aWNlIGhhbmRsZQorICogQHBhcmFtIHBlZXJfaWQgLSB3aGljaCBwZWVyIHRoZSBzZWN1cml0eSBpbmZvIGlzIGZvcgorICogQHBhcmFtIHNlY190eXBlIC0gd2hpY2ggdHlwZSBvZiBzZWN1cml0eSAvIGtleSB0aGUgcGVlciBpcyB1c2luZworICogQHBhcmFtIGlzX3VuaWNhc3QgLSB3aGV0aGVyIHNlY3VyaXR5IHNwZWMgaXMgZm9yIGEgdW5pY2FzdCBvciBtdWx0aWNhc3Qga2V5CisgKiBAcGFyYW0gbWljaGFlbF9rZXkgLSBrZXkgdXNlZCBmb3IgVEtJUCBNSUMgKGlmIHNlY190eXBlID09IFRLSVApCisgKiBAcGFyYW0gcnhfcG4gLSBSU0MgdXNlZCBmb3IgV0FQSSBQTiByZXBsYXkgY2hlY2sgKGlmIHNlY190eXBlID09IFdBUEkpCisgKi8KK3ZvaWQKK29sX3J4X3NlY19pbmRfaGFuZGxlcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgICAgIHVpbnQxNl90IHBlZXJfaWQsCisJCSAgICAgIGVudW0gaHR0X3NlY190eXBlIHNlY190eXBlLAorCQkgICAgICBpbnQgaXNfdW5pY2FzdCwgdWludDMyX3QgKm1pY2hhZWxfa2V5LCB1aW50MzJfdCAqcnhfcG4pOworCisvKioKKyAqIEBicmllZiBQcm9jZXNzIGFuIEFEREJBIG1lc3NhZ2Ugc2VudCBieSB0aGUgdGFyZ2V0LgorICogQGRldGFpbHMKKyAqICBXaGVuIHRoZSB0YXJnZXQgbm90aWZpZXMgdGhlIGhvc3Qgb2YgYW4gQUREQkEgZXZlbnQgZm9yIGEgc3BlY2lmaWVkCisgKiAgcGVlci1USUQsIHRoZSBob3N0IHdpbGwgc2V0IHVwIHRoZSByeCByZW9yZGVyaW5nIHN0YXRlIGZvciB0aGUgcGVlci1USUQuCisgKiAgU3BlY2lmaWNhbGx5LCB0aGUgaG9zdCB3aWxsIGNyZWF0ZSBhIHJ4IHJlb3JkZXJpbmcgYXJyYXkgd2hvc2UgbGVuZ3RoCisgKiAgaXMgYmFzZWQgb24gdGhlIHdpbmRvdyBzaXplIHNwZWNpZmllZCBpbiB0aGUgQUREQkEuCisgKgorICogQHBhcmFtIHBkZXYgLSBkYXRhIHBoeXNpY2FsIGRldmljZSBoYW5kbGUKKyAqICAgICAgKHJlZ2lzdGVyZWQgd2l0aCBIVFQgYXMgYSBjb250ZXh0IHBvaW50ZXIgZHVyaW5nIGF0dGFjaCB0aW1lKQorICogQHBhcmFtIHBlZXJfaWQgLSB3aGljaCBwZWVyIHRoZSBBRERCQSBldmVudCBpcyBmb3IKKyAqIEBwYXJhbSB0aWQgLSB3aGljaCB0cmFmZmljIElEIHdpdGhpbiB0aGUgcGVlciB0aGUgQUREQkEgZXZlbnQgaXMgZm9yCisgKiBAcGFyYW0gd2luX3N6IC0gaG93IG1hbnkgc2VxdWVuY2UgbnVtYmVycyBhcmUgaW4gdGhlIEFSUSBibG9jayBhY2sgd2luZG93CisgKiAgICAgIHNldCB1cCBieSB0aGUgQUREQkEgZXZlbnQKKyAqIEBwYXJhbSBzdGFydF9zZXFfbnVtIC0gdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHNlcXVlbmNlIG51bWJlciBkdXJpbmcgdGhlCisgKiAgICAgIGJsb2NrIGFjayBhZ3JlZW1lbnQsIGFzIHNwZWNpZmllZCBieSB0aGUgQUREQkEgcmVxdWVzdC4KKyAqIEBwYXJhbSBmYWlsZWQgLSBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB0YXJnZXQncyBBRERCQSBzZXR1cCBzdWNjZWVkZWQ6CisgKiAgICAgIDAgLT4gc3VjY2VzcywgMSAtPiBmYWlsCisgKi8KK3ZvaWQKK29sX3J4X2FkZGJhX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgdWludDE2X3QgcGVlcl9pZCwKKwkJICAgIHVpbnQ4X3QgdGlkLAorCQkgICAgdWludDhfdCB3aW5fc3osIHVpbnQxNl90IHN0YXJ0X3NlcV9udW0sIHVpbnQ4X3QgZmFpbGVkKTsKKworLyoqCisgKiBAYnJpZWYgUHJvY2VzcyBhIERFTEJBIG1lc3NhZ2Ugc2VudCBieSB0aGUgdGFyZ2V0LgorICogQGRldGFpbHMKKyAqICBXaGVuIHRoZSB0YXJnZXQgbm90aWZpZXMgdGhlIGhvc3Qgb2YgYSBERUxCQSBldmVudCBmb3IgYSBzcGVjaWZpZWQKKyAqICBwZWVyLVRJRCwgdGhlIGhvc3Qgd2lsbCBjbGVhbiB1cCB0aGUgcnggcmVvcmRlcmluZyBzdGF0ZSBmb3IgdGhlIHBlZXItVElELgorICogIFNwZWNpZmljYWxseSwgdGhlIGhvc3Qgd2lsbCByZW1vdmUgdGhlIHJ4IHJlb3JkZXJpbmcgYXJyYXksIGFuZCB3aWxsCisgKiAgc2V0IHRoZSByZW9yZGVyIHdpbmRvdyBzaXplIHRvIGJlIDEgKHN0b3AgYW5kIGdvIEFSUSkuCisgKgorICogQHBhcmFtIHBkZXYgLSBkYXRhIHBoeXNpY2FsIGRldmljZSBoYW5kbGUKKyAqICAgICAgKHJlZ2lzdGVyZWQgd2l0aCBIVFQgYXMgYSBjb250ZXh0IHBvaW50ZXIgZHVyaW5nIGF0dGFjaCB0aW1lKQorICogQHBhcmFtIHBlZXJfaWQgLSB3aGljaCBwZWVyIHRoZSBBRERCQSBldmVudCBpcyBmb3IKKyAqIEBwYXJhbSB0aWQgLSB3aGljaCB0cmFmZmljIElEIHdpdGhpbiB0aGUgcGVlciB0aGUgQUREQkEgZXZlbnQgaXMgZm9yCisgKi8KK3ZvaWQKK29sX3J4X2RlbGJhX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LCB1aW50MTZfdCBwZWVyX2lkLCB1aW50OF90IHRpZCk7CisKK2VudW0gaHR0X3J4X2ZsdXNoX2FjdGlvbiB7CisJaHR0X3J4X2ZsdXNoX3JlbGVhc2UsCisJaHR0X3J4X2ZsdXNoX2Rpc2NhcmQsCit9OworCisvKioKKyAqIEBicmllZiBQcm9jZXNzIGEgcnggcmVvcmRlciBmbHVzaCBtZXNzYWdlIHNlbnQgYnkgdGhlIHRhcmdldC4KKyAqIEBkZXRhaWxzCisgKiAgVGhlIHRhcmdldCdzIHJ4IHJlb3JkZXIgbG9naWMgY2FuIHNlbmQgYSBmbHVzaCBpbmRpY2F0aW9uIHRvIHRoZQorICogIGhvc3QncyByeCByZW9yZGVyIGJ1ZmZlcmluZyBlaXRoZXIgYXMgYSBmbHVzaCBJRSB3aXRoaW4gYSByeAorICogIGluZGljYXRpb24gbWVzc2FnZSwgb3IgYXMgYSBzdGFuZGFsb25lIHJ4IHJlb3JkZXIgZmx1c2ggbWVzc2FnZS4KKyAqICBUaGlzIG9sX3J4X2ZsdXNoX2hhbmRsZXIgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBzdGFuZGFsb25lIHJ4CisgKiAgcmVvcmRlciBmbHVzaCBtZXNzYWdlIGZyb20gdGhlIHRhcmdldC4KKyAqICBUaGUgZmx1c2ggbWVzc2FnZSBzcGVjaWZpZXMgYSByYW5nZSBvZiBzZXF1ZW5jZSBudW1iZXJzIHdob3NlCisgKiAgcnggZnJhbWVzIGFyZSBmbHVzaGVkLgorICogIFNvbWUgc2VxdWVuY2UgbnVtYmVycyB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZSBtYXkgbm90IGhhdmUKKyAqICByeCBmcmFtZXM7IHRoZSBob3N0IG5lZWRzIHRvIGNoZWNrIGZvciBlYWNoIHNlcXVlbmNlIG51bWJlciBpbgorICogIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugd2hldGhlciB0aGVyZSBhcmUgcnggZnJhbWVzIGhlbGQgZm9yIHRoYXQKKyAqICBzZXF1ZW5jZSBudW1iZXIuCisgKgorICogQHBhcmFtIHBkZXYgLSBkYXRhIHBoeXNpY2FsIGRldmljZSBoYW5kbGUKKyAqICAgICAgKHJlZ2lzdGVyZWQgd2l0aCBIVFQgYXMgYSBjb250ZXh0IHBvaW50ZXIgZHVyaW5nIGF0dGFjaCB0aW1lKQorICogQHBhcmFtIHBlZXJfaWQgLSB3aGljaCBwZWVyJ3MgcnggZGF0YSBpcyBiZWluZyBmbHVzaGVkCisgKiBAcGFyYW0gdGlkIC0gd2hpY2ggdHJhZmZpYyBJRCB3aXRoaW4gdGhlIHBlZXIgaGFzIHRoZSByeCBkYXRhIGJlaW5nIGZsdXNoZWQKKyAqIEBwYXJhbSBzZXFfbnVtX3N0YXJ0IC0gV2hpY2ggc2VxdWVuY2UgbnVtYmVyIHdpdGhpbiB0aGUgcnggcmVvcmRlcmluZworICogICAgICBidWZmZXIgdGhlIGZsdXNoaW5nIHNob3VsZCBzdGFydCB3aXRoLgorICogICAgICBUaGlzIGlzIHRoZSBMU0JzIG9mIHRoZSA4MDIuMTEgc2VxdWVuY2UgbnVtYmVyLgorICogICAgICBUaGlzIHNlcXVlbmNlIG51bWJlciBpcyBtYXNrZWQgd2l0aCB0aGUgcm91bmRlZC10by1wb3dlci1vZi10d28KKyAqICAgICAgd2luZG93IHNpemUgdG8gZ2VuZXJhdGUgYSByZW9yZGVyIGJ1ZmZlciBpbmRleC4KKyAqICAgICAgVGhlIGZsdXNoIGluY2x1ZGVzIHRoaXMgaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIuCisgKiBAcGFyYW0gc2VxX251bV9lbmQgLSBXaGljaCBzZXF1ZW5jZSBudW1iZXIgd2l0aGluIHRoZSByeCByZW9yZGVyaW5nCisgKiAgICAgIGJ1ZmZlciB0aGUgZmx1c2hpbmcgc2hvdWxkIHN0b3AgYXQuCisgKiAgICAgIFRoaXMgaXMgdGhlIExTQnMgb2YgdGhlIDgwMi4xMSBzZXF1ZW5jZSBudW1iZXIuCisgKiAgICAgIFRoaXMgc2VxdWVuY2UgbnVtYmVyIGlzIG1hc2tlZCB3aXRoIHRoZSByb3VuZGVkLXRvLXBvd2VyLW9mLXR3bworICogICAgICB3aW5kb3cgc2l6ZSB0byBnZW5lcmF0ZSBhIHJlb3JkZXIgYnVmZmVyIGluZGV4LgorICogICAgICBUaGUgZmx1c2ggZXhjbHVkZXMgdGhpcyBmaW5hbCBzZXF1ZW5jZSBudW1iZXIuCisgKiBAcGFyYW0gYWN0aW9uIC0gd2hldGhlciB0byByZWxlYXNlIG9yIGRpc2NhcmQgdGhlIHJ4IGZyYW1lcworICovCit2b2lkCitvbF9yeF9mbHVzaF9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgIHVpbnQxNl90IHBlZXJfaWQsCisJCSAgICB1aW50OF90IHRpZCwKKwkJICAgIHVpbnQxNl90IHNlcV9udW1fc3RhcnQsCisJCSAgICB1aW50MTZfdCBzZXFfbnVtX2VuZCwgZW51bSBodHRfcnhfZmx1c2hfYWN0aW9uIGFjdGlvbik7CisKKy8qKgorICogQGJyaWVmIFByb2Nlc3MgYSByeCBwbiBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqIEBkZXRhaWxzCisgKiAgICAgIFdoZW4gdGhlIHBlZXIgaXMgY29uZmlndXJlZCB0byBnZXQgUE4gY2hlY2tpbmcgZG9uZSBpbiB0YXJnZXQsCisgKiAgICAgIHRoZSB0YXJnZXQgaW5zdGVhZCBvZiBzZW5kaW5nIHJlb3JkZXIgZmx1c2gvcmVsZWFzZSBtZXNzYWdlcworICogICAgICBzZW5kcyBQTiBpbmRpY2F0aW9uIG1lc3NhZ2VzIHdoaWNoIGNvbnRhaW4gdGhlIHN0YXJ0IGFuZCBlbmQKKyAqICAgICAgc2VxdWVuY2UgbnVtYmVycyB0byBiZSBmbHVzaGVkL3JlbGVhc2VkIGFsb25nIHdpdGggdGhlIHNlcXVlbmNlCisgKiAgICAgIG51bWJlcnMgb2YgTVBEVXMgdGhhdCBmYWlsZWQgdGhlIFBOIGNoZWNrIGluIHRhcmdldC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGRhdGEgcGh5c2ljYWwgZGV2aWNlIGhhbmRsZQorICogICAgICAocmVnaXN0ZXJlZCB3aXRoIEhUVCBhcyBhIGNvbnRleHQgcG9pbnRlciBkdXJpbmcgYXR0YWNoIHRpbWUpCisgKiBAcGFyYW0gcGVlcl9pZCAtIHdoaWNoIHBlZXIncyByeCBkYXRhIGlzIGJlaW5nIGZsdXNoZWQKKyAqIEBwYXJhbSB0aWQgLSB3aGljaCB0cmFmZmljIElEIHdpdGhpbiB0aGUgcGVlcgorICogQHBhcmFtIHNlcV9udW1fc3RhcnQgLSBXaGljaCBzZXF1ZW5jZSBudW1iZXIgd2l0aGluIHRoZSByeCByZW9yZGVyaW5nCisgKiAgICAgIGJ1ZmZlciB0byBzdGFydCB3aXRoLgorICogICAgICBUaGlzIGlzIHRoZSBMU0JzIG9mIHRoZSA4MDIuMTEgc2VxdWVuY2UgbnVtYmVyLgorICogICAgICBUaGlzIHNlcXVlbmNlIG51bWJlciBpcyBtYXNrZWQgd2l0aCB0aGUgcm91bmRlZC10by1wb3dlci1vZi10d28KKyAqICAgICAgd2luZG93IHNpemUgdG8gZ2VuZXJhdGUgYSByZW9yZGVyIGJ1ZmZlciBpbmRleC4KKyAqICAgICAgVGhpcyBpcyB0aGUgaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIuCisgKiBAcGFyYW0gc2VxX251bV9lbmQgLSBXaGljaCBzZXF1ZW5jZSBudW1iZXIgd2l0aGluIHRoZSByeCByZW9yZGVyaW5nCisgKiAgICAgIGJ1ZmZlciB0byBzdG9wIGF0LgorICogICAgICBUaGlzIGlzIHRoZSBMU0JzIG9mIHRoZSA4MDIuMTEgc2VxdWVuY2UgbnVtYmVyLgorICogICAgICBUaGlzIHNlcXVlbmNlIG51bWJlciBpcyBtYXNrZWQgd2l0aCB0aGUgcm91bmRlZC10by1wb3dlci1vZi10d28KKyAqICAgICAgd2luZG93IHNpemUgdG8gZ2VuZXJhdGUgYSByZW9yZGVyIGJ1ZmZlciBpbmRleC4KKyAqICAgICAgVGhlIHByb2Nlc3Npbmcgc3RvcHMgcmlnaHQgYmVmb3JlIHRoaXMgc2VxdWVuY2UgbnVtYmVyCisgKiBAcGFyYW0gcG5faWVfY250IC0gSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgUE4gaW5mb3JtYXRpb24gZWxlbWVudHMuCisgKiBAcGFyYW0gcG5faWUgLSBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBQTiBpbmZvcm1hdGlvbiBlbGVtZW50cy4gRWFjaAorICogICAgICBQTiBpbmZvcm1hdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBMU0JzIG9mIHRoZSA4MDIuMTEgc2VxdWVuY2UgbnVtYmVyCisgKiAgICAgIG9mIHRoZSBNUERVIHRoYXQgZmFpbGVkIHRoZSBQTiBjaGVja2luZyBpbiB0YXJnZXQuCisgKi8KK3ZvaWQKK29sX3J4X3BuX2luZF9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgICB1aW50MTZfdCBwZWVyX2lkLAorCQkgICAgIHVpbnQ4X3QgdGlkLAorCQkgICAgIGludCBzZXFfbnVtX3N0YXJ0LAorCQkgICAgIGludCBzZXFfbnVtX2VuZCwgdWludDhfdCBwbl9pZV9jbnQsIHVpbnQ4X3QgKnBuX2llKTsKKworLyoqCisgKiBAYnJpZWYgUHJvY2VzcyBhIHN0YXRzIG1lc3NhZ2Ugc2VudCBieSB0aGUgdGFyZ2V0LgorICogQGRldGFpbHMKKyAqICBUaGUgaG9zdCBjYW4gcmVxdWVzdCB0YXJnZXQgZm9yIHN0YXRzLgorICogIFRoZSB0YXJnZXQgc2VuZHMgdGhlIHN0YXRzIHRvIHRoZSBob3N0IHZpYSBhIGNvbmZpcm1hdGlvbiBtZXNzYWdlLgorICogIFRoaXMgb2xfdHhyeF9md19zdGF0c19oYW5kbGVyIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgY29uZmlybWF0aW9uIG1lc3NhZ2UuCisgKiAgQ3VycmVudGx5LCB0aGlzIHByb2Nlc3NpbmcgY29uc2lzdHMgb2YgY29weWluZyB0aGUgc3RhdHMgZnJvbSB0aGUgbWVzc2FnZQorICogIGJ1ZmZlciBpbnRvIHRoZSB0eHJ4IHBkZXYgb2JqZWN0LCBhbmQgd2FraW5nIHRoZSBzbGVlcGluZyBob3N0IGNvbnRleHQKKyAqICB0aGF0IHJlcXVlc3RlZCB0aGUgc3RhdHMuCisgKgorICogQHBhcmFtIHBkZXYgLSBkYXRhIHBoeXNpY2FsIGRldmljZSBoYW5kbGUKKyAqICAgICAgKHJlZ2lzdGVyZWQgd2l0aCBIVFQgYXMgYSBjb250ZXh0IHBvaW50ZXIgZHVyaW5nIGF0dGFjaCB0aW1lKQorICogQHBhcmFtIGNvb2tpZSAtIFZhbHVlIGVjaG9lZCBmcm9tIHRoZSBjb29raWUgaW4gdGhlIHN0YXRzIHJlcXVlc3QKKyAqICAgICAgbWVzc2FnZS4gIFRoaXMgYWxsb3dzIHRoZSBob3N0IFNXIHRvIGZpbmQgdGhlIHN0YXRzIHJlcXVlc3Qgb2JqZWN0LgorICogICAgICAoQ3VycmVudGx5LCB0aGlzIGNvb2tpZSBpcyB1bnVzZWQuKQorICogQHBhcmFtIHN0YXRzX2luZm9fbGlzdCAtIHN0YXRzIGNvbmZpcm1hdGlvbiBtZXNzYWdlIGNvbnRlbnRzLCBjb250YWluaW5nCisgKiAgICAgIGEgbGlzdCBvZiB0aGUgc3RhdHMgcmVxdWVzdGVkIGZyb20gdGhlIHRhcmdldAorICovCit2b2lkCitvbF90eHJ4X2Z3X3N0YXRzX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJIHVpbnQ2NF90IGNvb2tpZSwgdWludDhfdCAqc3RhdHNfaW5mb19saXN0KTsKKworLyoqCisgKiBAYnJpZWYgUHJvY2VzcyBhIHR4IGluc3BlY3QgbWVzc2FnZSBzZW50IGJ5IHRoZSB0YXJnZXQuCisgKiBAZGV0YWlsczoKKyAqICBUT0RPOiB1cGRhdGUKKyAqICBUaGlzIHR4IGluc3BlY3QgbWVzc2FnZSBpbmRpY2F0ZXMgdmlhIHRoZSBkZXNjcmlwdG9yIElECisgKiAgd2hpY2ggdHggZnJhbWVzIGFyZSB0byBiZSBpbnNwZWN0ZWQgYnkgaG9zdC4gVGhlIGhvc3QKKyAqICByZS1pbmplY3RzIHRoZSBwYWNrZXQgYmFjayB0byB0aGUgaG9zdCBmb3IgYSBudW1iZXIgb2YKKyAqICBjYXNlcy4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBkYXRhIHBoeXNpY2FsIGRldmljZSB0aGF0IHNlbnQgdGhlIHR4IGZyYW1lcworICogICAgICAocmVnaXN0ZXJlZCB3aXRoIEhUVCBhcyBhIGNvbnRleHQgcG9pbnRlciBkdXJpbmcgYXR0YWNoIHRpbWUpCisgKiBAcGFyYW0gbnVtX21zZHVzIC0gaG93IG1hbnkgTVNEVXMgYXJlIHJlZmVyZW5jZWQgYnkgdGhlIHR4IGNvbXBsZXRpb24KKyAqICAgICAgbWVzc2FnZQorICogQHBhcmFtIHR4X21zZHVfaWRfaXRlcmF0b3IgLSBhYnN0cmFjdCBtZXRob2Qgb2YgZmluZGluZyB0aGUgSURzIGZvciB0aGUKKyAqICAgICAgaW5kaXZpZHVhbCBNU0RVcyByZWZlcmVuY2VkIGJ5IHRoZSB0eCBjb21wbGV0aW9uIG1lc3NhZ2UsIHZpYSB0aGUKKyAqICAgICAgaHR0X3R4X2NvbXBsX2Rlc2NfaWQgQVBJIGZ1bmN0aW9uCisgKi8KK3ZvaWQKK29sX3R4X2luc3BlY3RfaGFuZGxlcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgICAgIGludCBudW1fbXNkdXMsIHZvaWQgKnR4X2Rlc2NfaWRfaXRlcmF0b3IpOworCisvKioKKyAqIEBicmllZiBHZXQgdGhlIFVBUFNEIG1hc2suCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIFVBUFNEIFRJRCBtYXNrLgorICoKKyAqIEBwYXJhbSB0eHJ4X3BkZXYgLSBwb2ludGVyIHRvIHRoZSB0eHJ4IHBkZXYgb2JqZWN0CisgKiBAcGFyYW0gcGVlcl9pZCAtIFBlZXJJRC4KKyAqIEByZXR1cm4gdWFwc2QgbWFzayB2YWx1ZQorICovCit1aW50OF90CitvbF90eHJ4X3BlZXJfdWFwc2RtYXNrX2dldChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnR4cnhfcGRldiwgdWludDE2X3QgcGVlcl9pZCk7CisKKy8qKgorICogQGJyaWVmIEdldCB0aGUgUW9zIENhcGFibGUuCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHR4cnhfcGVlciBxb3NfY2FwYWJsZS4KKyAqCisgKiBAcGFyYW0gdHhyeF9wZGV2IC0gcG9pbnRlciB0byB0aGUgdHhyeCBwZGV2IG9iamVjdAorICogQHBhcmFtIHBlZXJfaWQgLSBQZWVySUQuCisgKiBAcmV0dXJuIHFvc19jYXBhYmxlIHZhbHVlCisgKi8KK3VpbnQ4X3QKK29sX3R4cnhfcGVlcl9xb3NjYXBhYmxlX2dldChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnR4cnhfcGRldiwgdWludDE2X3QgcGVlcl9pZCk7CisKKy8qKgorICogQGJyaWVmIFByb2Nlc3MgYW4gcnggaW5kaWNhdGlvbiBtZXNzYWdlIHNlbnQgYnkgdGhlIHRhcmdldC4KKyAqIEBkZXRhaWxzCisgKiAgVGhlIHRhcmdldCBzZW5kcyBhIHJ4IGluZGljYXRpb24gbWVzc2FnZSB0byB0aGUgaG9zdCBhcyBhCisgKiAgbm90aWZpY2F0aW9uIHRoYXQgdGhlcmUgYXJlIG5ldyByeCBmcmFtZXMgYXZhaWxhYmxlIGZvciB0aGUKKyAqICBob3N0IHRvIHByb2Nlc3MuCisgKiAgVGhlIEhUVCBob3N0IGxheWVyIGxvY2F0ZXMgdGhlIHJ4IGRlc2NyaXB0b3JzIGFuZCByeCBmcmFtZXMKKyAqICBhc3NvY2lhdGVkIHdpdGggdGhlIGluZGljYXRpb24sIGFuZCBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvCisgKiAgaW52b2tlIHRoZSByeCBkYXRhIHByb2Nlc3Npbmcgb24gdGhlIG5ldyBmcmFtZXMuCisgKiAgQWxsIE1QRFVzIHJlZmVyZW5jZWQgYnkgYSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UgYmVsb25nIHRvIHRoZQorICogIHNhbWUgcGVlci1USUQuIFRoZSBmcmFtZXMgaW5kaWNhdGVkIGhhdmUgYmVlbiByZS1vcmRlcmVkIGJ5CisgKiAgdGhlIHRhcmdldC4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBkYXRhIHBoeXNpY2FsIGRldmljZSB0aGF0IHJlY2VpdmVkIHRoZSBmcmFtZXMKKyAqICAgICAgKHJlZ2lzdGVyZWQgd2l0aCBIVFQgYXMgYSBjb250ZXh0IHBvaW50ZXIgZHVyaW5nIGF0dGFjaCB0aW1lKQorICogQHBhcmFtIHJ4X2luZF9tc2cgLSB0aGUgbmV0d29yayBidWZmZXIgaG9sZGluZyB0aGUgcnggaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBAcGFyYW0gcGVlcl9pZCAtIHdoaWNoIHBlZXIgc2VudCB0aGlzIHJ4IGRhdGEKKyAqIEBwYXJhbSB0aWQgLSB3aGF0IChleHRlbmRlZCkgdHJhZmZpYyB0eXBlIHRoZSByeCBkYXRhIGlzCisgKiBAcGFyYW0gaXNfb2ZmbG9hZCAtIGlzIHRoaXMgYW4gb2ZmbG9hZCBpbmRpY2F0aW9uPworICovCit2b2lkCitvbF9yeF9pbl9vcmRlcl9pbmRpY2F0aW9uX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSAgY2RmX25idWZfdCByeF9pbmRfbXNnLAorCQkJCSAgdWludDE2X3QgcGVlcl9pZCwKKwkJCQkgIHVpbnQ4X3QgdGlkLCB1aW50OF90IGlzX29mZmxvYWQpOworCisjZW5kaWYgLyogX09MX1RYUlhfSFRUX0FQSV9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvb2wvaW5jL29sX3R4cnhfb3NpZl9hcGkuaCBiL2NvcmUvZHAvb2wvaW5jL29sX3R4cnhfb3NpZl9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI2ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC9vbC9pbmMvb2xfdHhyeF9vc2lmX2FwaS5oCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIG9sX3R4cnhfb3NpZl9hcGkuaAorICogQGJyaWVmIERlZmluZSB0aGUgaG9zdCBkYXRhIEFQSSBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZSBob3N0IE9TIHNoaW0gU1cuCisgKi8KKyNpZm5kZWYgX09MX1RYUlhfT1NJRl9BUElfX0hfCisjZGVmaW5lIF9PTF9UWFJYX09TSUZfQVBJX19IXworCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX3QgKi8KKworI2luY2x1ZGUgPG9sX29zaWZfYXBpLmg+ICAgICAgICAvKiBvbF9vc2lmX3ZkZXZfaGFuZGxlICovCisjaW5jbHVkZSA8b2xfdHhyeF9hcGkuaD4gICAgICAgIC8qIG9sX3R4cnhfcGRldl9oYW5kbGUsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2N0cmxfYXBpLmg+CisjaW5jbHVkZSAiY2RzX3NjaGVkLmgiCisKKy8qKgorICogc3RydWN0IG9sX3J4X2NhY2hlZF9idWYgLSByeCBjYWNoZWQgYnVmZmVyCisgKiBAbGlzdDogbGlua2VkIGxpc3QKKyAqIEBidWY6IHNrYiBidWZmZXIKKyAqLworc3RydWN0IG9sX3J4X2NhY2hlZF9idWYgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwljZGZfbmJ1Zl90IGJ1ZjsKK307CisKKy8qKgorICogQHR5cGVkZWYgb2xfdHhyeF9yeF9mcAorICogQGJyaWVmIHJlY2VpdmUgZnVuY3Rpb24gdG8gaGFuZCBiYXRjaGVzIG9mIGRhdGEgZnJhbWVzIGZyb20gdHhyeCB0byBPUyBzaGltCisgKi8KK3R5cGVkZWYgdm9pZCAoKm9sX3R4cnhfcnhfZnApKHZvaWQgKm9zaWZfZGV2LCBjZGZfbmJ1Zl90IG1zZHVzKTsKKworLyoqCisgKiBAdHlwZWRlZiBvbF90eHJ4X3R4X2ZwCisgKiBAYnJpZWYgdG9wLWxldmVsIHRyYW5zbWl0IGZ1bmN0aW9uCisgKi8KK3R5cGVkZWYgY2RmX25idWZfdCAoKm9sX3R4cnhfdHhfZnApKG9sX3R4cnhfdmRldl9oYW5kbGUgZGF0YV92ZGV2LAorCQkJCSAgICBjZGZfbmJ1Zl90IG1zZHVfbGlzdCk7CisKKy8qKgorICogQHR5cGVkZWYgb2xfdHhyeF90eF9ub25fc3RkX2ZwCisgKiBAYnJpZWYgdG9wLWxldmVsIHRyYW5zbWl0IGZ1bmN0aW9uIGZvciBub24tc3RhbmRhcmQgdHggZnJhbWVzCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gcG9pbnRlciBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgb2xfdHhyeF90eF9mcAorICogIHRvIHN1cHBvcnQgbm9uLXN0YW5kYXJkIHRyYW5zbWl0cy4gIEluIHBhcnRpY3VsYXIsIHRoaXMgZnVuY3Rpb24KKyAqICBzdXBwb3J0cyB0cmFuc21pc3Npb24gb2Y6CisgKiAgMS4gIlJhdyIgZnJhbWVzCisgKiAgICAgVGhlc2UgcmF3IGZyYW1lcyBhbHJlYWR5IGhhdmUgYW4gODAyLjExIGhlYWRlcjsgdGhlIHVzdWFsCisgKiAgICAgODAyLjExIGhlYWRlciBlbmNhcHN1bGF0aW9uIGJ5IHRoZSBkcml2ZXIgZG9lcyBub3QgYXBwbHkuCisgKiAgMi4gVFNPIHNlZ21lbnRzCisgKiAgICAgRHVyaW5nIHR4IGNvbXBsZXRpb24sIHRoZSB0eHJ4IGxheWVyIG5lZWRzIHRvIHJlY2xhaW0gdGhlIGJ1ZmZlcgorICogICAgIHRoYXQgaG9sZHMgdGhlIGV0aGVybmV0L0lQL1RDUCBoZWFkZXIgY3JlYXRlZCBmb3IgdGhlIFRTTyBzZWdtZW50LgorICogICAgIFRodXMsIHRoZXNlIHR4IGZyYW1lcyBuZWVkIHRvIGJlIG1hcmtlZCBhcyBUU08sIHRvIHNob3cgdGhhdCB0aGV5CisgKiAgICAgbmVlZCB0aGlzIHNwZWNpYWwgaGFuZGxpbmcgZHVyaW5nIHR4IGNvbXBsZXRpb24uCisgKgorICogQHBhcmFtIGRhdGFfdmRldiAtIHdoaWNoIHZpcnR1YWwgZGV2aWNlIHNob3VsZCB0cmFuc21pdCB0aGUgZnJhbWUKKyAqIEBwYXJhbSB0eF9zcGVjIC0gd2hhdCBub24tc3RhbmRhcmQgb3BlcmF0aW9ucyB0byBhcHBseSB0byB0aGUgdHggZnJhbWUKKyAqIEBwYXJhbSBtc2R1X2xpc3QgLSB0eCBmcmFtZShzKSwgaW4gYSBudWxsLXRlcm1pbmF0ZWQgbGlzdAorICovCit0eXBlZGVmIGNkZl9uYnVmX3QgKCpvbF90eHJ4X3R4X25vbl9zdGRfZnApKG9sX3R4cnhfdmRldl9oYW5kbGUgZGF0YV92ZGV2LAorCQkJCQkgICAgZW51bSBvbF90eF9zcGVjIHR4X3NwZWMsCisJCQkJCSAgICBjZGZfbmJ1Zl90IG1zZHVfbGlzdCk7CisKK3N0cnVjdCB0eHJ4X3J4X21ldGFpbmZvOworCisvKioKKyAqIEB0eXBlZGVmIG9sX3R4cnhfdHhfZmNfZnAKKyAqIEBicmllZiB0eCBmbG93IGNvbnRyb2wgbm90aWZpY2F0aW9uIGZ1bmN0aW9uIGZyb20gdHhyeCB0byBPUyBzaGltCisgKiBAcGFyYW0gb3NpZl9kZXYgLSB0aGUgdmlydHVhbCBkZXZpY2UncyBPUyBzaGltIG9iamVjdAorICogQHBhcmFtIHR4X3Jlc3VtZSAtIHR4IG9zIHEgc2hvdWxkIGJlIHJlc3VtZWQgb3Igbm90CisgKi8KK3R5cGVkZWYgdm9pZCAoKm9sX3R4cnhfdHhfZmxvd19jb250cm9sX2ZwKSh2b2lkICpvc2lmX2RldiwKKwkJCQkJICAgIGJvb2wgdHhfcmVzdW1lKTsKKworLyoqCisgKiBzdHJ1Y3Qgb2xfdHhyeF9kZXNjX3R5cGUgLSB0eHJ4IGRlc2NyaXB0b3IgdHlwZQorICogQHN0YV9pZDogc3RhIGlkCisgKiBAaXNfcW9zX2VuYWJsZWQ6IGlzIHN0YXRpb24gcW9zIGVuYWJsZWQKKyAqIEBpc193YXBpX3N1cHBvcnRlZDogaXMgc3RhdGlvbiB3YXBpIHN1cHBvcnRlZAorICovCitzdHJ1Y3Qgb2xfdHhyeF9kZXNjX3R5cGUgeworCXVpbnQ4X3Qgc3RhX2lkOworCXVpbnQ4X3QgaXNfcW9zX2VuYWJsZWQ7CisJdWludDhfdCBpc193YXBpX3N1cHBvcnRlZDsKK307CisKKwordHlwZWRlZiBDREZfU1RBVFVTICgqb2xfcnhfY2FsbGJhY2tfZnApKHZvaWQgKnBfY2RzX2djdHgsCisJCQkJCSBjZGZfbmJ1Zl90IHBEYXRhQnVmZiwKKwkJCQkJIHVpbnQ4X3QgdWNTVEFJZCk7CisKK3R5cGVkZWYgdm9pZCAoKm9sX3R4X3BhdXNlX2NhbGxiYWNrX2ZwKSh1aW50OF90IHZkZXZfaWQsCisJCQkJCWVudW0gbmV0aWZfYWN0aW9uX3R5cGUgYWN0aW9uLAorCQkJCQllbnVtIG5ldGlmX3JlYXNvbl90eXBlIHJlYXNvbik7CisKKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyCitDREZfU1RBVFVTIG9sX3R4cnhfcmVnaXN0ZXJfcGF1c2VfY2Iob2xfdHhfcGF1c2VfY2FsbGJhY2tfZnAgcGF1c2VfY2IpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUKK0NERl9TVEFUVVMgb2xfdHhyeF9yZWdpc3Rlcl9wYXVzZV9jYihvbF90eF9wYXVzZV9jYWxsYmFja19mcCBwYXVzZV9jYikKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCit9CisjZW5kaWYKKworI2lmZGVmIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MCisKK2ludCBvbF90eHJ4X3JlZ2lzdGVyX3R4X2Zsb3dfY29udHJvbCAodWludDhfdCB2ZGV2X2lkLAorCW9sX3R4cnhfdHhfZmxvd19jb250cm9sX2ZwIGZsb3dDb250cm9sLAorCXZvaWQgKm9zaWZfZmNfY3R4KTsKKworaW50IG9sX3R4cnhfZGVyZWdpc3Rlcl90eF9mbG93X2NvbnRyb2xfY2IodWludDhfdCB2ZGV2X2lkKTsKKwordm9pZCBvbF90eHJ4X2Zsb3dfY29udHJvbF9jYihvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJYm9vbCB0eF9yZXN1bWUpOworYm9vbAorb2xfdHhyeF9nZXRfdHhfcmVzb3VyY2UodWludDhfdCBzdGFfaWQsCisJCQl1bnNpZ25lZCBpbnQgbG93X3dhdGVybWFyaywKKwkJCXVuc2lnbmVkIGludCBoaWdoX3dhdGVybWFya19vZmZzZXQpOworCitpbnQKK29sX3R4cnhfbGxfc2V0X3R4X3BhdXNlX3FfZGVwdGgodWludDhfdCB2ZGV2X2lkLCBpbnQgcGF1c2VfcV9kZXB0aCk7CisjZW5kaWYgLyogUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wgKi8KKworLyoqCisgKiBAdHlwZWRlZiBvbF90eHJ4X3J4X2ZwCisgKiBAYnJpZWYgcmVjZWl2ZSBmdW5jdGlvbiB0byBoYW5kIGJhdGNoZXMgb2YgZGF0YSBmcmFtZXMgZnJvbSB0eHJ4IHRvIE9TIHNoaW0KKyAqLworCitzdHJ1Y3Qgb2xfdHhyeF9vc2lmX29wcyB7CisJLyogdHggZnVuY3Rpb24gcG9pbnRlcnMgLSBzcGVjaWZpZWQgYnkgdHhyeCwgc3RvcmVkIGJ5IE9TIHNoaW0gKi8KKwlzdHJ1Y3QgeworCQlvbF90eHJ4X3R4X2ZwIHN0ZDsKKwkJb2xfdHhyeF90eF9ub25fc3RkX2ZwIG5vbl9zdGQ7CisJCW9sX3R4cnhfdHhfZmxvd19jb250cm9sX2ZwIGZsb3dfY29udHJvbF9jYjsKKwl9IHR4OworCisJLyogcnggZnVuY3Rpb24gcG9pbnRlcnMgLSBzcGVjaWZpZWQgYnkgT1Mgc2hpbSwgc3RvcmVkIGJ5IHR4cnggKi8KKwlzdHJ1Y3QgeworCQlvbF90eHJ4X3J4X2ZwIHN0ZDsKKwl9IHJ4OworfTsKKworLyoqCisgKiBAYnJpZWYgTGluayBhIHZkZXYncyBkYXRhIG9iamVjdCB3aXRoIHRoZSBtYXRjaGluZyBPUyBzaGltIHZkZXYgb2JqZWN0LgorICogQGRldGFpbHMKKyAqICBUaGUgZGF0YSBvYmplY3QgZm9yIGEgdmlydHVhbCBkZXZpY2UgaXMgY3JlYXRlZCBieSB0aGUgZnVuY3Rpb24KKyAqICBvbF90eHJ4X3ZkZXZfYXR0YWNoLiAgSG93ZXZlciwgcmF0aGVyIHRoYW4gZnVsbHkgbGlua2luZyB0aGUKKyAqICBkYXRhIHZkZXYgb2JqZWN0IHdpdGggdGhlIHZkZXYgb2JqZWN0cyBmcm9tIHRoZSBvdGhlciBzdWJzeXN0ZW1zCisgKiAgdGhhdCB0aGUgZGF0YSB2ZGV2IG9iamVjdCBpbnRlcmFjdHMgd2l0aCwgdGhlIHR4cnhfdmRldl9hdHRhY2gKKyAqICBmdW5jdGlvbiBmb2N1c2VzIHByaW1hcmlseSBvbiBjcmVhdGluZyB0aGUgZGF0YSB2ZGV2IG9iamVjdC4KKyAqICBBZnRlciB0aGUgY3JlYXRpb24gb2YgYm90aCB0aGUgZGF0YSB2ZGV2IG9iamVjdCBhbmQgdGhlIE9TIHNoaW0KKyAqICB2ZGV2IG9iamVjdCwgdGhpcyB0eHJ4X29zaWZfdmRldl9hdHRhY2ggZnVuY3Rpb24gaXMgdXNlZCB0byBjb25uZWN0CisgKiAgdGhlIHR3byB2ZGV2IG9iamVjdHMsIHNvIHRoZSBkYXRhIFNXIGNhbiB1c2UgdGhlIE9TIHNoaW0gdmRldiBoYW5kbGUKKyAqICB3aGVuIHBhc3NpbmcgcnggZGF0YSByZWNlaXZlZCBieSBhIHZkZXYgdXAgdG8gdGhlIE9TIHNoaW0uCisgKgorICogQHBhcmFtIHR4cnhfdmRldiAtIHRoZSB2aXJ0dWFsIGRldmljZSdzIGRhdGEgb2JqZWN0CisgKiBAcGFyYW0gb3NpZl92ZGV2IC0gdGhlIHZpcnR1YWwgZGV2aWNlJ3MgT1Mgc2hpbSBvYmplY3QKKyAqIEBwYXJhbSB0eHJ4X29wcyAtIChwb2ludGVycyB0bykgdGhlIGZ1bmN0aW9ucyB1c2VkIGZvciB0eCBhbmQgcnggZGF0YSB4ZmVyCisgKiAgICAgIFRoZXJlIGFyZSB0d28gcG9ydGlvbnMgb2YgdGhlc2UgdHhyeCBvcGVyYXRpb25zLgorICogICAgICBUaGUgcnggcG9ydGlvbiBpcyBmaWxsZWQgaW4gYnkgT1NJRiBTVyBiZWZvcmUgY2FsbGluZworICogICAgICBvbF90eHJ4X29zaWZfdmRldl9yZWdpc3RlcjsgaW5zaWRlIHRoZSBvbF90eHJ4X29zaWZfdmRldl9yZWdpc3RlcgorICogICAgICB0aGUgdHhyeCBTVyBzdG9yZXMgYSBjb3B5IG9mIHRoZXNlIHJ4IGZ1bmN0aW9uIHBvaW50ZXJzLCB0byB1c2UKKyAqICAgICAgYXMgaXQgZGVsaXZlcnMgcnggZGF0YSBmcmFtZXMgdG8gdGhlIE9TSUYgU1cuCisgKiAgICAgIFRoZSB0eCBwb3J0aW9uIGlzIGZpbGxlZCBpbiBieSB0aGUgdHhyeCBTVyBpbnNpZGUKKyAqICAgICAgb2xfdHhyeF9vc2lmX3ZkZXZfcmVnaXN0ZXI7IHdoZW4gdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJucywKKyAqICAgICAgdGhlIE9TSUYgU1cgc3RvcmVzIGEgY29weSBvZiB0aGVzZSB0eCBmdW5jdGlvbnMgdG8gdXNlIGFzIGl0CisgKiAgICAgIGRlbGl2ZXJzIHR4IGRhdGEgZnJhbWVzIHRvIHRoZSB0eHJ4IFNXLgorICogICAgICBUaGUgcnggZnVuY3Rpb24gcG9pbnRlciBpbnB1dHMgY29uc2lzdCBvZiB0aGUgZm9sbG93aW5nOgorICogICAgICByeDogdGhlIE9TIHNoaW0gcnggZnVuY3Rpb24gdG8gZGVsaXZlciByeCBkYXRhIGZyYW1lcyB0by4KKyAqICAgICAgICAgIFRoaXMgY2FuIGhhdmUgZGlmZmVyZW50IHZhbHVlcyBmb3IgZGlmZmVyZW50IHZpcnR1YWwgZGV2aWNlcywKKyAqICAgICAgICAgIGUuZy4gc28gb25lIHZpcnR1YWwgZGV2aWNlJ3MgT1Mgc2hpbSBkaXJlY3RseSBoYW5kcyByeCBmcmFtZXMgdG8KKyAqICAgICAgICAgIHRoZSBPUywgYnV0IGFub3RoZXIgdmlydHVhbCBkZXZpY2UncyBPUyBzaGltIGZpbHRlcnMgb3V0IFAyUAorICogICAgICAgICAgbWVzc2FnZXMgYmVmb3JlIHNlbmRpbmcgdGhlIHJ4IGZyYW1lcyB0byB0aGUgT1MuCisgKiAgICAgICAgICBUaGUgbmV0YnVmcyBkZWxpdmVyZWQgdG8gdGhlIG9zaWZfcnggZnVuY3Rpb24gYXJlIGluIHRoZSBmb3JtYXQKKyAqICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgT1MgdG8gdXNlIGZvciB0eCBhbmQgcnggZnJhbWVzIChlaXRoZXIgODAyLjMgb3IKKyAqICAgICAgICAgIG5hdGl2ZSBXaUZpKS4KKyAqICAgICAgcnhfbW9uOiB0aGUgT1Mgc2hpbSByeCBtb25pdG9yIGZ1bmN0aW9uIHRvIGRlbGl2ZXIgbW9uaXRvciBkYXRhIHRvCisgKiAgICAgICAgICBUaG91Z2ggaW4gcHJhY3RpY2UsIGl0IGlzIHByb2JhYmxlIHRoYXQgdGhlIHNhbWUgZnVuY3Rpb24gd2lsbAorICogICAgICAgICAgYmUgdXNlZCBmb3IgZGVsaXZlcmluZyByeCBtb25pdG9yIGRhdGEgZm9yIGFsbCB2aXJ0dWFsIGRldmljZXMsCisgKiAgICAgICAgICBpbiB0aGVvcnkgZWFjaCBkaWZmZXJlbnQgdmlydHVhbCBkZXZpY2UgY2FuIGhhdmUgYSBkaWZmZXJlbnQKKyAqICAgICAgICAgIE9TIHNoaW0gZnVuY3Rpb24gZm9yIGFjY2VwdGluZyByeCBtb25pdG9yIGRhdGEuCisgKiAgICAgICAgICBUaGUgbmV0YnVmcyBkZWxpdmVyZWQgdG8gdGhlIG9zaWZfcnhfbW9uIGZ1bmN0aW9uIGFyZSBpbiA4MDIuMTEKKyAqICAgICAgICAgIGZvcm1hdC4gIEVhY2ggbmV0YnVmIGhvbGRzIGEgODAyLjExIE1QRFUsIG5vdCBhbiA4MDIuMTEgTVNEVS4KKyAqICAgICAgICAgIERlcGVuZGluZyBvbiBjb21waWxlLXRpbWUgY29uZmlndXJhdGlvbiwgZWFjaCBuZXRidWYgbWF5IGFsc28KKyAqICAgICAgICAgIGhhdmUgYSBtb25pdG9yLW1vZGUgZW5jYXBzdWxhdGlvbiBoZWFkZXIgc3VjaCBhcyBhIHJhZGlvdGFwCisgKiAgICAgICAgICBoZWFkZXIgYWRkZWQgYmVmb3JlIHRoZSBNUERVIGNvbnRlbnRzLgorICogICAgICBUaGUgdHggZnVuY3Rpb24gcG9pbnRlciBvdXRwdXRzIGNvbnNpc3Qgb2YgdGhlIGZvbGxvd2luZzoKKyAqICAgICAgdHg6IHRoZSB0eCBmdW5jdGlvbiBwb2ludGVyIGZvciBzdGFuZGFyZCBkYXRhIGZyYW1lcworICogICAgICAgICAgVGhpcyBmdW5jdGlvbiBwb2ludGVyIGlzIHNldCBieSB0aGUgdHhyeCBTVyB0byBwZXJmb3JtCisgKiAgICAgICAgICBob3N0LXNpZGUgdHJhbnNtaXQgb3BlcmF0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIGEgSEwgb3IgTEwKKyAqICAgICAgICAgIGhvc3QvdGFyZ2V0IGludGVyZmFjZSBpcyBpbiB1c2UuCisgKiAgICAgIHR4X25vbl9zdGQ6IHRoZSB0eCBmdW5jdGlvbiBwb2ludGVyIGZvciBub24tc3RhbmRhcmQgZGF0YSBmcmFtZXMsCisgKiAgICAgICAgICBzdWNoIGFzIFRTTyBmcmFtZXMsIGV4cGxpY2l0bHktcHJpb3JpdGl6ZWQgZnJhbWVzLCBvciAicmF3IgorICogICAgICAgICAgZnJhbWVzIHdoaWNoIHNraXAgc29tZSBvZiB0aGUgdHggb3BlcmF0aW9ucywgc3VjaCBhcyA4MDIuMTEKKyAqICAgICAgICAgIE1BQyBoZWFkZXIgZW5jYXBzdWxhdGlvbi4KKyAqLwordm9pZAorb2xfdHhyeF9vc2lmX3ZkZXZfcmVnaXN0ZXIob2xfdHhyeF92ZGV2X2hhbmRsZSB0eHJ4X3ZkZXYsCisJCQkgICB2b2lkICpvc2lmX3ZkZXYsIHN0cnVjdCBvbF90eHJ4X29zaWZfb3BzICp0eHJ4X29wcyk7CisKKy8qKgorICogQGJyaWVmIERpdmlkZSBhIGp1bWJvIFRDUCBmcmFtZSBpbnRvIHNtYWxsZXIgc2VnbWVudHMuCisgKiBAZGV0YWlscworICogIEZvciBlZmZpY2llbmN5LCB0aGUgcHJvdG9jb2wgc3RhY2sgYWJvdmUgdGhlIFdMQU4gZHJpdmVyIG1heSBvcGVyYXRlCisgKiAgb24ganVtYm8gdHggZnJhbWVzLCB3aGljaCBhcmUgbGFyZ2VyIHRoYW4gdGhlIDgwMi4xMSBNVFUuCisgKiAgVGhlIE9TSUYgU1cgdXNlcyB0aGlzIHR4cnggQVBJIGZ1bmN0aW9uIHRvIGRpdmlkZSB0aGUganVtYm8gdHggVENQIGZyYW1lCisgKiAgaW50byBhIHNlcmllcyBvZiBzZWdtZW50IGZyYW1lcy4KKyAqICBUaGUgc2VnbWVudHMgYXJlIGNyZWF0ZWQgYXMgY2xvbmVzIG9mIHRoZSBpbnB1dCBqdW1ibyBmcmFtZS4KKyAqICBUaGUgdHhyeCBTVyBnZW5lcmF0ZXMgYSBuZXcgZW5jYXBzdWxhdGlvbiBoZWFkZXIgKGV0aGVybmV0ICsgSVAgKyBUQ1ApCisgKiAgZm9yIGVhY2ggb2YgdGhlIG91dHB1dCBzZWdtZW50IGZyYW1lcy4gIFRoZSBleGFjdCBmb3JtYXQgb2YgdGhpcyBoZWFkZXIsCisgKiAgZS5nLiA4MDIuMyB2cy4gRXRoZXJuZXQgSUksIGFuZCBJUHY0IHZzLiBJUHY2LCBpcyBjaG9zZW4gdG8gbWF0Y2ggdGhlCisgKiAgaGVhZGVyIGZvcm1hdCBvZiB0aGUgaW5wdXQganVtYm8gZnJhbWUuCisgKiAgVGhlIGlucHV0IGp1bWJvIGZyYW1lIGlzIG5vdCBtb2RpZmllZC4KKyAqICBBZnRlciB0aGUgb2xfdHhyeF9vc2lmX3Rzb19zZWdtZW50IHJldHVybnMsIHRoZSBPU0lGIFNXIG5lZWRzIHRvIHBlcmZvcm0KKyAqICBETUEgbWFwcGluZyBvbiBlYWNoIG9mIHRoZSBzZWdtZW50IG5ldHdvcmsgYnVmZmVycywgYW5kIGFsc28gbmVlZHMgdG8KKyAqCisgKiBAcGFyYW0gdHhyeF92ZGV2IC0gd2hpY2ggdmlydHVhbCBkZXZpY2Ugd2lsbCB0cmFuc21pdCB0aGUgVFNPIHNlZ21lbnRzCisgKiBAcGFyYW0gbWF4X3NlZ19wYXlsb2FkX2J5dGVzIC0gdGhlIG1heGltdW0gc2l6ZSBmb3IgdGhlIFRDUCBwYXlsb2FkIG9mCisgKiAgICAgIGVhY2ggc2VnbWVudCBmcmFtZS4KKyAqICAgICAgVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBldGhlcm5ldCArIElQICsgVENQIGhlYWRlciBzaXplcy4KKyAqIEBwYXJhbSBqdW1ib190Y3BfZnJhbWUgLSBqdW1ibyBmcmFtZSB3aGljaCBuZWVkcyB0byBiZSBjbG9uZWQrc2VnbWVudGVkCisgKiBAcmV0dXJuCisgKiAgICAgIE5VTEwgaWYgdGhlIHNlZ21lbnRhdGlvbiBmYWlscywgLSBPUiAtCisgKiAgICAgIGEgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2Ygc2VnbWVudCBuZXR3b3JrIGJ1ZmZlcnMKKyAqLworY2RmX25idWZfdCBvbF90eHJ4X29zaWZfdHNvX3NlZ21lbnQob2xfdHhyeF92ZGV2X2hhbmRsZSB0eHJ4X3ZkZXYsCisJCQkJICAgIGludCBtYXhfc2VnX3BheWxvYWRfYnl0ZXMsCisJCQkJICAgIGNkZl9uYnVmX3QganVtYm9fdGNwX2ZyYW1lKTsKKworY2RmX25idWZfdCBvbF90eF9zZW5kX2RhdGFfZnJhbWUodWludDhfdCBzdGFfaWQsIGNkZl9uYnVmX3Qgc2tiLAorCQkJCQkJCQkJICB1aW50OF90IHByb3RvX3R5cGUpOworCisjaWZkZWYgSVBBX09GRkxPQUQKK2NkZl9uYnVmX3Qgb2xfdHhfc2VuZF9pcGFfZGF0YV9mcmFtZSh2b2lkICp2ZGV2LAorCQkJY2RmX25idWZfdCBza2IpOworI2VuZGlmCisKK0NERl9TVEFUVVMgb2xfdHhyeF9yZWdpc3Rlcl9wZWVyKG9sX3J4X2NhbGxiYWNrX2ZwIHJ4Y2IsCisJCQkJIHN0cnVjdCBvbF90eHJ4X2Rlc2NfdHlwZSAqc3RhX2Rlc2MpOworCitDREZfU1RBVFVTIG9sX3R4cnhfY2xlYXJfcGVlcih1aW50OF90IHN0YV9pZCk7CisKK0NERl9TVEFUVVMgb2xfdHhyeF9jaGFuZ2VfcGVlcl9zdGF0ZSh1aW50OF90IHN0YV9pZCwKKwkJCQkgICAgIGVudW0gb2xfdHhyeF9wZWVyX3N0YXRlIHN0YV9zdGF0ZSwKKwkJCQkgICAgIGJvb2wgcm9hbV9zeW5jaF9pbl9wcm9ncmVzcyk7CisKK3ZvaWQgb2xfcnhfZGF0YV9wcm9jZXNzKHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJCWNkZl9uYnVmX3QgcnhfYnVmX2xpc3QpOworCit2b2lkIG9sX3R4cnhfZmx1c2hfcnhfZnJhbWVzKHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJCSAgICAgYm9vbCBkcm9wKTsKKworI2lmIGRlZmluZWQoRkVBVFVSRV9MUk8pCit2b2lkIG9sX3JlZ2lzdGVyX2xyb19mbHVzaF9jYih2b2lkIChoYW5kbGVyKSh2b2lkICopLCB2b2lkICpkYXRhKTsKKyNlbmRpZgorI2VuZGlmIC8qIF9PTF9UWFJYX09TSUZfQVBJX19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC9vbC9pbmMvb2xfdHhyeF9zdGF0cy5oIGIvY29yZS9kcC9vbC9pbmMvb2xfdHhyeF9zdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YjM4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL29sL2luYy9vbF90eHJ4X3N0YXRzLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGZpbGUgb2xfdHhyeF9zdGF0dXMuaAorICogQGJyaWVmIEZ1bmN0aW9ucyBwcm92aWRlZCBmb3IgdmlzaWJpbGl0eSBhbmQgZGVidWdnaW5nLgorICogTk9URTogVGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aCBrZXJuZWwgZHJpdmVyIFNXIGFuZCB1c2Vyc3BhY2UgU1cuCisgKiBUaHVzLCBkbyBub3QgcmVmZXJlbmNlIHVzZSBhbnkga2VybmVsIGhlYWRlciBmaWxlcyBvciBkZWZzIGluIHRoaXMgZmlsZSEKKyAqLworI2lmbmRlZiBfT0xfVFhSWF9TVEFUU19fSF8KKyNkZWZpbmUgX09MX1RYUlhfU1RBVFNfX0hfCisKKyNpbmNsdWRlIDxhdGhkZWZzLmg+ICAgICAgICAgICAgLyogdWludDY0X3QgKi8KKworCisKK3N0cnVjdCBvbF90eHJ4X3N0YXRzX2VsZW0geworCXVpbnQ2NF90IHBrdHM7CisJdWludDY0X3QgYnl0ZXM7Cit9OworCisjZGVmaW5lIE5VTV9NQVhfVFNPX1NFR1MgOAorI2RlZmluZSBOVU1fTUFYX1RTT19TRUdTX01BU0sgKE5VTV9NQVhfVFNPX1NFR1MgLSAxKQorCisjZGVmaW5lIE5VTV9NQVhfVFNPX01TRFVTIDEyOAorI2RlZmluZSBOVU1fTUFYX1RTT19NU0RVU19NQVNLIChOVU1fTUFYX1RTT19NU0RVUyAtIDEpCisKK3N0cnVjdCBvbF90eHJ4X3N0YXRzX3Rzb19tc2R1IHsKKwlzdHJ1Y3QgY2RmX3Rzb19zZWdfdCB0c29fc2Vnc1tOVU1fTUFYX1RTT19TRUdTXTsKKwl1aW50MzJfdCBudW1fc2VnOworCXVpbnQzMl90IHRzb19zZWdfaWR4OworfTsKKworc3RydWN0IG9sX3R4cnhfc3RhdHNfdHNvX2luZm8geworCXN0cnVjdCBvbF90eHJ4X3N0YXRzX3Rzb19tc2R1IHRzb19tc2R1X2luZm9bTlVNX01BWF9UU09fTVNEVVNdOworCXVpbnQzMl90IHRzb19tc2R1X2lkeDsKK307CisKKy8qKgorICogQGJyaWVmIGRhdGEgc3RhdHMgcHVibGlzaGVkIGJ5IHRoZSBob3N0IHR4cnggbGF5ZXIKKyAqLworc3RydWN0IG9sX3R4cnhfc3RhdHMgeworCXN0cnVjdCB7CisJCS8qIE1TRFVzIGdpdmVuIHRvIHRoZSB0eHJ4IGxheWVyIGJ5IHRoZSBtYW5hZ2VtZW50IHN0YWNrICovCisJCXN0cnVjdCBvbF90eHJ4X3N0YXRzX2VsZW0gbWdtdDsKKwkJLyogTVNEVXMgc3VjY2Vzc2Z1bGx5IHNlbnQgYWNyb3NzIHRoZSBXTEFOICovCisJCXN0cnVjdCBvbF90eHJ4X3N0YXRzX2VsZW0gZGVsaXZlcmVkOworCQlzdHJ1Y3QgeworCQkJLyogTVNEVXMgdGhhdCB0aGUgaG9zdCBkaWQgbm90IGFjY2VwdCAqLworCQkJc3RydWN0IG9sX3R4cnhfc3RhdHNfZWxlbSBob3N0X3JlamVjdDsKKwkJCS8qIE1TRFVzIHdoaWNoIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQgKi8KKwkJCXN0cnVjdCBvbF90eHJ4X3N0YXRzX2VsZW0gZG93bmxvYWRfZmFpbDsKKwkJCS8qIE1TRFVzIHdoaWNoIHRoZSB0YXJnZXQgZGlzY2FyZGVkCisJCQkgICAobGFjayBvZiBtZW1vcnkgb3Igb2xkIGFnZSkgKi8KKwkJCXN0cnVjdCBvbF90eHJ4X3N0YXRzX2VsZW0gdGFyZ2V0X2Rpc2NhcmQ7CisJCQkvKiBNU0RVcyB3aGljaCB0aGUgdGFyZ2V0IHNlbnQgYnV0CisJCQkgICBjb3VsZG4ndCBnZXQgYW4gYWNrIGZvciAqLworCQkJc3RydWN0IG9sX3R4cnhfc3RhdHNfZWxlbSBub19hY2s7CisJCX0gZHJvcHBlZDsKKwkJLyogY29udGFpbnMgaW5mb3JtYXRpb24gb2YgcGFja2V0cyByZWNldmllZCBwZXIgdHggY29tcGxldGlvbiovCisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCBwa3RzXzE7CisJCQl1aW50MzJfdCBwa3RzXzJfMTA7CisJCQl1aW50MzJfdCBwa3RzXzExXzIwOworCQkJdWludDMyX3QgcGt0c18yMV8zMDsKKwkJCXVpbnQzMl90IHBrdHNfMzFfNDA7CisJCQl1aW50MzJfdCBwa3RzXzQxXzUwOworCQkJdWludDMyX3QgcGt0c181MV82MDsKKwkJCXVpbnQzMl90IHBrdHNfNjFfcGx1czsKKwkJfSBjb21wX2hpc3RvZ3JhbTsKKwkJLyogVFNPIChUQ1Agc2VnbWVudGF0aW9uIG9mZmxvYWQpIGluZm9ybWF0aW9uICovCisJCXN0cnVjdCB7CisJCQlzdHJ1Y3Qgb2xfdHhyeF9zdGF0c19lbGVtIHRzb19wa3RzOworI2lmIGRlZmluZWQoRkVBVFVSRV9UU08pCisJCQlzdHJ1Y3Qgb2xfdHhyeF9zdGF0c190c29faW5mbyB0c29faW5mbzsKKyNlbmRpZgorCQl9IHRzbzsKKwl9IHR4OworCXN0cnVjdCB7CisJCS8qIE1TRFVzIGdpdmVuIHRvIHRoZSBPUyBzaGltICovCisJCXN0cnVjdCBvbF90eHJ4X3N0YXRzX2VsZW0gZGVsaXZlcmVkOworCQlzdHJ1Y3QgeworCQkJLyogTVNEVXMgZm9yd2FyZGVkIHRvIG5ldHdvcmsgc3RhY2sgKi8KKwkJCXVfaW50MzJfdCBwYWNrZXRzX3N0YWNrOworCQkJLyogTVNEVXMgZm9yd2FyZGVkIGZyb20gdGhlIHJ4IHBhdGggdG8gdGhlIHR4IHBhdGggKi8KKwkJCXVfaW50MzJfdCBwYWNrZXRzX2Z3ZDsKKwkJCS8qIE1TRFVzIGZvcndhcmRlZCB0byBzdGFjayBhbmQgdHggcGF0aCAqLworCQkJdV9pbnQzMl90IHBhY2tldHNfc3RhY2tfbl9md2Q7CisJCX0gaW50cmFfYnNzX2Z3ZDsKKwl9IHJ4OworfTsKKworLyoKKyAqIFN0cnVjdHVyZSB0byBjb25zb2xpZGF0ZSBob3N0IHN0YXRzCisgKi8KK3N0cnVjdCBpZWVlODAyMTFyZXFfb2xfYXRoX2hvc3Rfc3RhdHMgeworCXN0cnVjdCBvbF90eHJ4X3N0YXRzIHR4cnhfc3RhdHM7CisJc3RydWN0IHsKKwkJaW50IHBrdF9xX2ZhaWxfY291bnQ7CisJCWludCBwa3RfcV9lbXB0eV9jb3VudDsKKwkJaW50IHNlbmRfcV9lbXB0eV9jb3VudDsKKwl9IGh0YzsKKwlzdHJ1Y3QgeworCQlpbnQgcGlwZV9ub19yZXNyY19jb3VudDsKKwkJaW50IGNlX3JpbmdfZGVsdGFfZmFpbF9jb3VudDsKKwl9IGhpZjsKK307CisKKyNlbmRpZiAvKiBfT0xfVFhSWF9TVEFUU19fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvb2wvaW5jL29sX3Zvd2V4dF9kYmdfZGVmcy5oIGIvY29yZS9kcC9vbC9pbmMvb2xfdm93ZXh0X2RiZ19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlMDdhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvb2wvaW5jL29sX3Zvd2V4dF9kYmdfZGVmcy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1ZPV19ERUZJTkVTX19IXworI2RlZmluZSBfVk9XX0RFRklORVNfX0hfCisKKyNkZWZpbmUgVURQX0NLU1VNX09GRlNFVCAgIDQwICAgLyogVURQIGNoZWNrIHN1bSBvZmZzZXQgaW4gbmV0d29yayBidWZmZXIgKi8KKyNkZWZpbmUgUlRQX0hEUl9PRkZTRVQgIDQyICAgICAgLyogUlRQIGhlYWRlciBvZmZzZXQgaW4gbmV0d29yayBidWZmZXIgKi8KKyNkZWZpbmUgRVhUX0hEUl9PRkZTRVQgNTQgICAgICAgLyogRXh0ZW5zaW9uIGhlYWRlciBvZmZzZXQgaW4gbmV0d29yayBidWZmZXIgKi8KKyNkZWZpbmUgVURQX1BEVV9SVFBfRVhUICAweDkwICAgLyogKCgyIDw8IDYpIHwgKDEgPDwgNCkpIFJUUCBWMiArIFggYml0ICovCisjZGVmaW5lIElQX1ZFUjRfTl9OT19FWFRSQV9IRUFERVJTIDB4NDUKKyNkZWZpbmUgSVBFUkYzX0RBVEFfT0ZGU0VUIDEyICAgLyogaXBlcmYzIGRhdGEgb2Zmc2V0IGZyb20gRVhUX0hEUl9PRkZTRVQgKi8KKyNkZWZpbmUgSEFMX1JYXzQwICAweDA4ICAgICAgICAgLyogNDAgTWh6ICovCisjZGVmaW5lIEhBTF9SWF9HSSAgMHgwNCAgICAgICAgIC8qIGZ1bGwgZ2kgKi8KKworc3RydWN0IHZvd19leHRzdGF0cyB7CisJdWludDhfdCByeF9yc3NpX2N0bDA7ICAgLyogY29udHJvbCBjaGFubmVsIGNoYWluMCByc3NpICovCisJdWludDhfdCByeF9yc3NpX2N0bDE7ICAgLyogY29udHJvbCBjaGFubmVsIGNoYWluMSByc3NpICovCisJdWludDhfdCByeF9yc3NpX2N0bDI7ICAgLyogY29udHJvbCBjaGFubmVsIGNoYWluMiByc3NpICovCisJdWludDhfdCByeF9yc3NpX2V4dDA7ICAgLyogZXh0ZW50aW9uIGNoYW5uZWwgY2hhaW4wIHJzc2kgKi8KKwl1aW50OF90IHJ4X3Jzc2lfZXh0MTsgICAvKiBleHRlbnRpb24gY2hhbm5lbCBjaGFpbjEgcnNzaSAqLworCXVpbnQ4X3QgcnhfcnNzaV9leHQyOyAgIC8qIGV4dGVudGlvbiBjaGFubmVsIGNoYWluMiByc3NpICovCisJdWludDhfdCByeF9yc3NpX2NvbWI7ICAgLyogY29tYmluZWQgUlNTSSB2YWx1ZSAqLworCXVpbnQ4X3QgcnhfYnc7ICAgICAgICAgIC8qIEJhbmQgd2lkdGggMC0yMCwgMS00MCwgMi04MCAqLworCXVpbnQ4X3Qgcnhfc2dpOyAgICAgICAgIC8qIEd1YXJkIGludGVydmFsLCAwLUxvbmcgR0ksIDEtU2hvcnQgR0kgKi8KKwl1aW50OF90IHJ4X25zczsgICAgICAgICAvKiBOdW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zICovCisJdWludDhfdCByeF9tY3M7ICAgICAgICAgLyogUmF0ZSBNQ1MgdmFsdWUgKi8KKwl1aW50OF90IHJ4X3JhdGVjb2RlOyAgICAvKiBIYXJkd2FyZSByYXRlIGNvZGUgKi8KKwl1aW50OF90IHJ4X3JzX2ZsYWdzOyAgICAvKiBSZWNpZXZlIG1pc2MgZmxhZ3MgKi8KKwl1aW50OF90IHJ4X21vcmVhZ2dyOyAgICAvKiAwIC0gbm9uIGFnZ3IgZnJhbWUgKi8KKwl1aW50MzJfdCByeF9tYWNUczsgICAgICAvKiBUaW1lIHN0YW1wICovCisJdWludDE2X3Qgcnhfc2Vxbm87ICAgICAgLyogcnggc2VxdWVuY2UgbnVtYmVyICovCit9OworCisvKioKKyAqIEBicmllZiBwb3B1bGF0ZXMgdm93IGV4dCBzdGF0cyBpbiBnaXZlbiBuZXR3b3JrIGJ1ZmZlci4KKyAqIEBwYXJhbSBtc2R1IC0gbmV0d29yayBidWZmZXIgaGFuZGxlCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byBodHQgZGV2LgorICovCit2b2lkIG9sX2F0aF9hZGRfdm93X2V4dHN0YXRzKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IG1zZHUpOworCisjZW5kaWYgLyogX1ZPV19ERUZJTkVTX19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC90eHJ4L2lwdjZfZGVmcy5oIGIvY29yZS9kcC90eHJ4L2lwdjZfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzUyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvaXB2Nl9kZWZzLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0lQVjZfX0hfCisjZGVmaW5lIF9JUFY2X19IXworCisjaWYgZGVmaW5lZChBVEhfVEFSR0VUKQorI2luY2x1ZGUgPG9zYXBpLmg+ICAgICAgICAgICAgICAvKiBBX1VJTlQ4ICovCisjZWxzZQorI2luY2x1ZGUgPGFfdHlwZXMuaD4gICAgICAgICAgICAvKiBBX1VJTlQ4ICovCisjZW5kaWYKKworLyogdXRpbGl0aWVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gbmV0d29yayBieXRlIG9yZGVyIGFuZCBuYXRpdmUgZW5kaWFubmVzcyAqLworI2lmbmRlZiBCWVRFU1dBUDMyCisjZGVmaW5lIEJZVEVTV0FQMzIoeCkgXAorCSgoKCh4KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSAvKiBieXRlIDAgLT4gYnl0ZSAzICovIHwgXAorCSAoKCh4KSAmIDB4MDAwMGZmMDApIDw8ICA4KSAvKiBieXRlIDEgLT4gYnl0ZSAyICovIHwgXAorCSAoKCh4KSAmIDB4MDBmZjAwMDApID4+ICA4KSAvKiBieXRlIDIgLT4gYnl0ZSAxICovIHwgXAorCSAoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSAvKiBieXRlIDMgLT4gYnl0ZSAwICovKQorI2VuZGlmIC8qIEJZVEVTV0FQMzIgKi8KKworI2lmbmRlZiBCRV9UT19DUFUzMgorI2lmIGRlZmluZWQoQVRIX1RBUkdFVCkKKy8qIGFzc3VtZSB0YXJnZXQgaXMgbGl0dGxlLWVuZGlhbiAqLworI2RlZmluZSBCRV9UT19DUFUzMih4KSBCWVRFU1dBUDMyKHgpCisjZWxzZQorI2lmZGVmIEJJR19FTkRJQU5fSE9TVAorI2RlZmluZSBCRV9UT19DUFUzMih4KSAoeCkKKyNlbHNlCisjZGVmaW5lIEJFX1RPX0NQVTMyKHgpIEJZVEVTV0FQMzIoeCkKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYgLyogQkVfVE9fQ1BVMzIgKi8KKworLyogSVB2NiBoZWFkZXIgZGVmaW5pdGlvbiAqLworCisjZGVmaW5lIElQVjZfQUREUl9MRU4gNCAgICAgICAgIC8qIGJ5dGVzICovCitzdHJ1Y3QgaXB2Nl9oZHJfdCB7CisJQV9VSU5UMzIgdmVyX3RjbGFzc19mbG93bGFiZWw7ICAvKiB2ZXJzaW9uLCB0cmFmZmljIGNsYXNzLCBhbmQgZmxvdyBsYWJlbCAqLworCUFfVUlOVDggcHlsZF9sZW5bMl07ICAgIC8qIHBheWxvYWQgbGVuZ3RoICovCisJQV9VSU5UOCBuZXh0X2hkcjsKKwlBX1VJTlQ4IGhvcF9saW1pdDsKKwlBX1VJTlQ4IHNyY19hZGRyW0lQVjZfQUREUl9MRU5dOworCUFfVUlOVDggZHN0X2FkZHJbSVBWNl9BRERSX0xFTl07Cit9OworCisjZGVmaW5lIElQVjZfSERSX0xFTiAoc2l6ZW9mKHN0cnVjdCBpcHY2X2hkcl90KSkKKyNkZWZpbmUgSVBWNl9IRFJfT0ZGU0VUX05FWFRfSERSIChvZmZzZXRvZihzdHJ1Y3QgaXB2Nl9oZHJfdCwgbmV4dF9oZHIpKQorI2RlZmluZSBJUFY2X0hEUl9PRkZTRVRfRFNUX0FERFIgKG9mZnNldG9mKHN0cnVjdCBpcHY2X2hkcl90LCBkc3RfYWRkclswXSkpCisKKy8qIElQdjYgaGVhZGVyIGZpZWxkIGFjY2VzcyBtYWNyb3MgKi8KKworI2RlZmluZSBJUFY2X0hEUl9WRVJTSU9OX00gICAgICAgMHhGMDAwMDAwMAorI2RlZmluZSBJUFY2X0hEUl9WRVJTSU9OX1MgICAgICAgMjgKKworI2RlZmluZSBJUFY2X0hEUl9UUkFGRklDX0NMQVNTX00gMHgwRkYwMDAwMAorI2RlZmluZSBJUFY2X0hEUl9UUkFGRklDX0NMQVNTX1MgMjAKKworI2RlZmluZSBJUFY2X0hEUl9GTE9XX0xBQkVMX00gICAgMHgwMDBGRkZGRgorI2RlZmluZSBJUFY2X0hEUl9GTE9XX0xBQkVMX1MgICAgMAorCitzdGF0aWMgaW5saW5lIEFfVUlOVDggaXB2Nl92ZXJzaW9uKHN0cnVjdCBpcHY2X2hkcl90ICppcHY2X2hkcikKK3sKKwlyZXR1cm4KKwkJKEJFX1RPX0NQVTMyKGlwdjZfaGRyLT52ZXJfdGNsYXNzX2Zsb3dsYWJlbCkgJgorCQkgSVBWNl9IRFJfVkVSU0lPTl9NKSA+PiBJUFY2X0hEUl9WRVJTSU9OX1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgQV9VSU5UOCBpcHY2X3RyYWZmaWNfY2xhc3Moc3RydWN0IGlwdjZfaGRyX3QgKmlwdjZfaGRyKQoreworCXJldHVybgorCQkoQV9VSU5UOCkgKChCRV9UT19DUFUzMihpcHY2X2hkci0+dmVyX3RjbGFzc19mbG93bGFiZWwpICYKKwkJCSAgICBJUFY2X0hEUl9UUkFGRklDX0NMQVNTX00pID4+IElQVjZfSERSX1RSQUZGSUNfQ0xBU1NfUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgQV9VSU5UMzIgaXB2Nl9mbG93X2xhYmVsKHN0cnVjdCBpcHY2X2hkcl90ICppcHY2X2hkcikKK3sKKwlyZXR1cm4KKwkJKEJFX1RPX0NQVTMyKGlwdjZfaGRyLT52ZXJfdGNsYXNzX2Zsb3dsYWJlbCkgJgorCQkgSVBWNl9IRFJfRkxPV19MQUJFTF9NKSA+PiBJUFY2X0hEUl9GTE9XX0xBQkVMX1M7Cit9CisKKyNlbmRpZiAvKiBfSVBWNl9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF9jZmcuYyBiL2NvcmUvZHAvdHhyeC9vbF9jZmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTZhOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L29sX2NmZy5jCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8b2xfY2ZnLmg+CisjaW5jbHVkZSA8b2xfaWZfYXRodmFyLmg+CisKK3Vuc2lnbmVkIGludCB2b3dfY29uZmlnID0gMDsKKworI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKKy8qKgorICogb2xfdHhfc2V0X2Zsb3dfY29udHJvbF9wYXJhbWV0ZXJzKCkgLSBzZXQgZmxvdyBjb250cm9sIHBhcmFtZXRlcnMKKyAqIEBjZmdfY3R4OiBjZmcgY29udGV4dAorICogQGNmZ19wYXJhbTogY2ZnIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljCit2b2lkIG9sX3R4X3NldF9mbG93X2NvbnRyb2xfcGFyYW1ldGVycyhzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmdfY3R4LAorCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3BhcmFtX3QgY2ZnX3BhcmFtKQoreworCWNmZ19jdHgtPnR4X2Zsb3dfc3RhcnRfcXVldWVfb2Zmc2V0ID0KKwkJCQkJY2ZnX3BhcmFtLnR4X2Zsb3dfc3RhcnRfcXVldWVfb2Zmc2V0OworCWNmZ19jdHgtPnR4X2Zsb3dfc3RvcF9xdWV1ZV90aCA9CisJCQkJCWNmZ19wYXJhbS50eF9mbG93X3N0b3BfcXVldWVfdGg7Cit9CisjZWxzZQorc3RhdGljCit2b2lkIG9sX3R4X3NldF9mbG93X2NvbnRyb2xfcGFyYW1ldGVycyhzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmdfY3R4LAorCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3BhcmFtX3QgY2ZnX3BhcmFtKQoreworCXJldHVybjsKK30KKyNlbmRpZgorCisvKiBGSVggVEhJUyAtCisgKiBGb3Igbm93LCBhbGwgdGhlc2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBoYXJkY29kZWQuCisgKiBNYW55IG9mIHRoZXNlIHNob3VsZCBhY3R1YWxseSBiZSBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGluc3RlYWQuCisgKi8KKworb2xfcGRldl9oYW5kbGUgb2xfcGRldl9jZmdfYXR0YWNoKGNkZl9kZXZpY2VfdCBvc2RldiwKKwkJCQkgIHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3BhcmFtX3QgY2ZnX3BhcmFtKQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZ19jdHg7CisKKwljZmdfY3R4ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpjZmdfY3R4KSk7CisJaWYgKCFjZmdfY3R4KSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2ZnIGN0eCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogTmVlZCB0byBjaGFuZ2UgSFRUX0xMX1RYX0hEUl9TSVpFX0lQIGFjY29yZGluZ2x5LgorCSAqIEluY2x1ZGUgcGF5bG9hZCwgdXAgdG8gdGhlIGVuZCBvZiBVRFAgaGVhZGVyIGZvciBJUHY0IGNhc2UKKwkgKi8KKwljZmdfY3R4LT50eF9kb3dubG9hZF9zaXplID0gMTY7CisJLyogdGVtcG9yYXJpbHkgZGlhYmxlZCBQTiBjaGVjayBmb3IgUml2YS9Qcm9udG8gKi8KKwljZmdfY3R4LT5yeF9wbl9jaGVjayA9IDE7CisjaWYgQ0ZHX1RHVF9ERUZBVUxUX1JYX1NLSVBfREVGUkFHX1RJTUVPVVRfRFVQX0RFVEVDVElPTl9DSEVDSworCWNmZ19jdHgtPmRlZnJhZ190aW1lb3V0X2NoZWNrID0gMTsKKyNlbmRpZgorCWNmZ19jdHgtPm1heF9wZWVyX2lkID0gNTExOworCWNmZ19jdHgtPm1heF92ZGV2ID0gQ0ZHX1RHVF9OVU1fVkRFVjsKKwljZmdfY3R4LT5wbl9yeF9md2RfY2hlY2sgPSAxOworCWNmZ19jdHgtPmZyYW1lX3R5cGUgPSB3bGFuX2ZybV9mbXRfODAyXzM7CisJY2ZnX2N0eC0+bWF4X3RocnVwdXRfbWJwcyA9IDgwMDsKKwljZmdfY3R4LT5tYXhfbmJ1Zl9mcmFncyA9IDE7CisJY2ZnX2N0eC0+dm93X2NvbmZpZyA9IHZvd19jb25maWc7CisJY2ZnX2N0eC0+dGFyZ2V0X3R4X2NyZWRpdCA9IENGR19UR1RfTlVNX01TRFVfREVTQzsKKwljZmdfY3R4LT50aHJvdHRsZV9wZXJpb2RfbXMgPSA0MDsKKwljZmdfY3R4LT5yeF9md2RfZGlzYWJsZWQgPSAwOworCWNmZ19jdHgtPmlzX3BhY2tldF9sb2dfZW5hYmxlZCA9IDA7CisJY2ZnX2N0eC0+aXNfZnVsbF9yZW9yZGVyX29mZmxvYWQgPSBjZmdfcGFyYW0uaXNfZnVsbF9yZW9yZGVyX29mZmxvYWQ7CisJY2ZnX2N0eC0+aXBhX3VjX3JzYy51Y19vZmZsb2FkX2VuYWJsZWQgPQorCQljZmdfcGFyYW0uaXNfdWNfb2ZmbG9hZF9lbmFibGVkOworCWNmZ19jdHgtPmlwYV91Y19yc2MudHhfbWF4X2J1Zl9jbnQgPSBjZmdfcGFyYW0udWNfdHhfYnVmZmVyX2NvdW50OworCWNmZ19jdHgtPmlwYV91Y19yc2MudHhfYnVmX3NpemUgPSBjZmdfcGFyYW0udWNfdHhfYnVmZmVyX3NpemU7CisJY2ZnX2N0eC0+aXBhX3VjX3JzYy5yeF9pbmRfcmluZ19zaXplID0KKwkJY2ZnX3BhcmFtLnVjX3J4X2luZGljYXRpb25fcmluZ19jb3VudDsKKwljZmdfY3R4LT5pcGFfdWNfcnNjLnR4X3BhcnRpdGlvbl9iYXNlID0gY2ZnX3BhcmFtLnVjX3R4X3BhcnRpdGlvbl9iYXNlOworCWNmZ19jdHgtPmVuYWJsZV9yeHRocmVhZCA9IGNmZ19wYXJhbS5lbmFibGVfcnh0aHJlYWQ7CisJY2ZnX2N0eC0+aXBfdGNwX3VkcF9jaGVja3N1bV9vZmZsb2FkID0KKwkJY2ZnX3BhcmFtLmlwX3RjcF91ZHBfY2hlY2tzdW1fb2ZmbG9hZDsKKwljZmdfY3R4LT5jZV9jbGFzc2lmeV9lbmFibGVkID0gY2ZnX3BhcmFtLmNlX2NsYXNzaWZ5X2VuYWJsZWQ7CisKKwlvbF90eF9zZXRfZmxvd19jb250cm9sX3BhcmFtZXRlcnMoY2ZnX2N0eCwgY2ZnX3BhcmFtKTsKKwlyZXR1cm4gKG9sX3BkZXZfaGFuZGxlKSBjZmdfY3R4OworfQorCitpbnQgb2xfY2ZnX2lzX2hpZ2hfbGF0ZW5jeShvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZyA9IChzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICopcGRldjsKKwlyZXR1cm4gY2ZnLT5pc19oaWdoX2xhdGVuY3k7Cit9CisKK2ludCBvbF9jZmdfbWF4X3BlZXJfaWQob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJLyoKKwkgKiBUQkRYWFggLSB0aGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhlIHBlZXIgdGFibGUKKwkgKiBzaXplIGFsbG9jYXRlZCBpbiBGVworCSAqLworCXJldHVybiBjZmctPm1heF9wZWVyX2lkOworfQorCitpbnQgb2xfY2ZnX21heF92ZGV2cyhvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZyA9IChzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICopcGRldjsKKwlyZXR1cm4gY2ZnLT5tYXhfdmRldjsKK30KKworaW50IG9sX2NmZ19yeF9wbl9jaGVjayhvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZyA9IChzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICopcGRldjsKKwlyZXR1cm4gY2ZnLT5yeF9wbl9jaGVjazsKK30KKworaW50IG9sX2NmZ19yeF9md2RfY2hlY2sob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJcmV0dXJuIGNmZy0+cG5fcnhfZndkX2NoZWNrOworfQorCit2b2lkIG9sX3NldF9jZmdfcnhfZndkX2Rpc2FibGVkKG9sX3BkZXZfaGFuZGxlIHBkZXYsIHVpbnQ4X3QgZGlzYWJsZV9yeF9md2QpCit7CisJc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqY2ZnID0gKHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKilwZGV2OworCWNmZy0+cnhfZndkX2Rpc2FibGVkID0gZGlzYWJsZV9yeF9md2Q7Cit9CisKK3ZvaWQgb2xfc2V0X2NmZ19wYWNrZXRfbG9nX2VuYWJsZWQob2xfcGRldl9oYW5kbGUgcGRldiwgdWludDhfdCB2YWwpCit7CisJc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqY2ZnID0gKHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKilwZGV2OworCWNmZy0+aXNfcGFja2V0X2xvZ19lbmFibGVkID0gdmFsOworfQorCit1aW50OF90IG9sX2NmZ19pc19wYWNrZXRfbG9nX2VuYWJsZWQob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJcmV0dXJuIGNmZy0+aXNfcGFja2V0X2xvZ19lbmFibGVkOworfQorCitpbnQgb2xfY2ZnX3J4X2Z3ZF9kaXNhYmxlZChvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworI2lmIGRlZmluZWQoQVRIUl9XSU5fTldGKQorCS8qIGZvciBXaW5kb3dzLCBsZXQgdGhlIE9TIGhhbmRsZSB0aGUgZm9yd2FyZGluZyAqLworCXJldHVybiAxOworI2Vsc2UKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJcmV0dXJuIGNmZy0+cnhfZndkX2Rpc2FibGVkOworI2VuZGlmCit9CisKK2ludCBvbF9jZmdfcnhfZndkX2ludGVyX2JzcyhvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZyA9IChzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICopcGRldjsKKwlyZXR1cm4gY2ZnLT5yeF9md2RfaW50ZXJfYnNzOworfQorCitlbnVtIHdsYW5fZnJtX2ZtdCBvbF9jZmdfZnJhbWVfdHlwZShvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZyA9IChzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICopcGRldjsKKwlyZXR1cm4gY2ZnLT5mcmFtZV90eXBlOworfQorCitpbnQgb2xfY2ZnX21heF90aHJ1cHV0X21icHMob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJcmV0dXJuIGNmZy0+bWF4X3RocnVwdXRfbWJwczsKK30KKworaW50IG9sX2NmZ19uZXRidWZfZnJhZ3NfbWF4KG9sX3BkZXZfaGFuZGxlIHBkZXYpCit7CisJc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqY2ZnID0gKHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKilwZGV2OworCXJldHVybiBjZmctPm1heF9uYnVmX2ZyYWdzOworfQorCitpbnQgb2xfY2ZnX3R4X2ZyZWVfYXRfZG93bmxvYWQob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJcmV0dXJuIGNmZy0+dHhfZnJlZV9hdF9kb3dubG9hZDsKK30KKwordWludDE2X3Qgb2xfY2ZnX3RhcmdldF90eF9jcmVkaXQob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJdWludDE2X3QgcmM7CisJdWludDE2X3Qgdm93X21heF9zdGEgPSAoY2ZnLT52b3dfY29uZmlnICYgMHhmZmZmMDAwMCkgPj4gMTY7CisJdWludDE2X3Qgdm93X21heF9kZXNjX3BlcnN0YSA9IGNmZy0+dm93X2NvbmZpZyAmIDB4MDAwMGZmZmY7CisKKwlyYyA9ICAoY2ZnLT50YXJnZXRfdHhfY3JlZGl0ICsgKHZvd19tYXhfc3RhICogdm93X21heF9kZXNjX3BlcnN0YSkpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgb2xfY2ZnX3R4X2Rvd25sb2FkX3NpemUob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJcmV0dXJuIGNmZy0+dHhfZG93bmxvYWRfc2l6ZTsKK30KKworaW50IG9sX2NmZ19yeF9ob3N0X2RlZnJhZ190aW1lb3V0X2R1cGxpY2F0ZV9jaGVjayhvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZyA9IChzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICopcGRldjsKKwlyZXR1cm4gY2ZnLT5kZWZyYWdfdGltZW91dF9jaGVjazsKK30KKworaW50IG9sX2NmZ190aHJvdHRsZV9wZXJpb2RfbXMob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJcmV0dXJuIGNmZy0+dGhyb3R0bGVfcGVyaW9kX21zOworfQorCitpbnQgb2xfY2ZnX2lzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkKG9sX3BkZXZfaGFuZGxlIHBkZXYpCit7CisJc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqY2ZnID0gKHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKilwZGV2OworCXJldHVybiBjZmctPmlzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkOworfQorCisvKioKKyAqIG9sX2NmZ19pc19yeF90aHJlYWRfZW5hYmxlZCgpIC0gcmV0dXJuIHJ4X3RocmVhZCBpcyBlbmFibGUvZGlzYWJsZQorICogQHBkZXYgOiBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIGRldmljZQorICoKKyAqIFJldHVybjogMSAtIGVuYWJsZSwgMCAtIGRpc2FibGUKKyAqLworaW50IG9sX2NmZ19pc19yeF90aHJlYWRfZW5hYmxlZChvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZyA9IChzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICopcGRldjsKKwlyZXR1cm4gY2ZnLT5lbmFibGVfcnh0aHJlYWQ7Cit9CisKKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyCisvKioKKyAqIG9sX2NmZ19nZXRfdHhfZmxvd19zdG9wX3F1ZXVlX3RoKCkgLSByZXR1cm4gc3RvcCBxdWV1ZSB0aHJlc2hvbGQKKyAqIEBwZGV2IDogaGFuZGxlIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2UKKyAqCisgKiBSZXR1cm46IHN0b3AgcXVldWUgdGhyZXNob2xkCisgKi8KK2ludCBvbF9jZmdfZ2V0X3R4X2Zsb3dfc3RvcF9xdWV1ZV90aChvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZyA9IChzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICopcGRldjsKKwlyZXR1cm4gY2ZnLT50eF9mbG93X3N0b3BfcXVldWVfdGg7Cit9CisKKy8qKgorICogb2xfY2ZnX2dldF90eF9mbG93X3N0YXJ0X3F1ZXVlX29mZnNldCgpIC0gcmV0dXJuIHN0YXJ0IHF1ZXVlIG9mZnNldAorICogQHBkZXYgOiBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIGRldmljZQorICoKKyAqIFJldHVybjogc3RhcnQgcXVldWUgb2Zmc2V0CisgKi8KK2ludCBvbF9jZmdfZ2V0X3R4X2Zsb3dfc3RhcnRfcXVldWVfb2Zmc2V0KG9sX3BkZXZfaGFuZGxlIHBkZXYpCit7CisJc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqY2ZnID0gKHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKilwZGV2OworCXJldHVybiBjZmctPnR4X2Zsb3dfc3RhcnRfcXVldWVfb2Zmc2V0OworfQorI2VuZGlmCisKKyNpZmRlZiBJUEFfT0ZGTE9BRAordW5zaWduZWQgaW50IG9sX2NmZ19pcGFfdWNfb2ZmbG9hZF9lbmFibGVkKG9sX3BkZXZfaGFuZGxlIHBkZXYpCit7CisJc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqY2ZnID0gKHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKilwZGV2OworCXJldHVybiAodW5zaWduZWQgaW50KWNmZy0+aXBhX3VjX3JzYy51Y19vZmZsb2FkX2VuYWJsZWQ7Cit9CisKK3Vuc2lnbmVkIGludCBvbF9jZmdfaXBhX3VjX3R4X2J1Zl9zaXplKG9sX3BkZXZfaGFuZGxlIHBkZXYpCit7CisJc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqY2ZnID0gKHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKilwZGV2OworCXJldHVybiBjZmctPmlwYV91Y19yc2MudHhfYnVmX3NpemU7Cit9CisKK3Vuc2lnbmVkIGludCBvbF9jZmdfaXBhX3VjX3R4X21heF9idWZfY250KG9sX3BkZXZfaGFuZGxlIHBkZXYpCit7CisJc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqY2ZnID0gKHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKilwZGV2OworCXJldHVybiBjZmctPmlwYV91Y19yc2MudHhfbWF4X2J1Zl9jbnQ7Cit9CisKK3Vuc2lnbmVkIGludCBvbF9jZmdfaXBhX3VjX3J4X2luZF9yaW5nX3NpemUob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJcmV0dXJuIGNmZy0+aXBhX3VjX3JzYy5yeF9pbmRfcmluZ19zaXplOworfQorCit1bnNpZ25lZCBpbnQgb2xfY2ZnX2lwYV91Y190eF9wYXJ0aXRpb25fYmFzZShvbF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3QgKmNmZyA9IChzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICopcGRldjsKKwlyZXR1cm4gY2ZnLT5pcGFfdWNfcnNjLnR4X3BhcnRpdGlvbl9iYXNlOworfQorI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCisKKy8qKgorICogb2xfY2ZnX2lzX2NlX2NsYXNzaWZ5X2VuYWJsZWQoKSAtIFJldHVybiBpZiBDRSBjbGFzc2lmaWNhdGlvbiBpcyBlbmFibGVkCisgKgkJCQkgICAgIG9yIGRpc2FibGVkCisgKiBAcGRldiA6IGhhbmRsZSB0byB0aGUgcGh5c2ljYWwgZGV2aWNlCisgKgorICogUmV0dXJuOiAxIC0gZW5hYmxlZCwgMCAtIGRpc2FibGVkCisgKi8KK2Jvb2wgb2xfY2ZnX2lzX2NlX2NsYXNzaWZ5X2VuYWJsZWQob2xfcGRldl9oYW5kbGUgcGRldikKK3sKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXBkZXY7CisJcmV0dXJuIGNmZy0+Y2VfY2xhc3NpZnlfZW5hYmxlZDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF9jdHJsX3R4cnhfYXBpLmggYi9jb3JlL2RwL3R4cngvb2xfY3RybF90eHJ4X2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YTk1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfY3RybF90eHJ4X2FwaS5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIG9sX2N0cmxfdHhyeF9hcGkuaAorICogQGJyaWVmIERlZmluZSB0aGUgaG9zdCBjb250cm9sIEFQSSBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZSBob3N0IGRhdGEgU1cuCisgKi8KKyNpZm5kZWYgX09MX0NUUkxfVFhSWF9BUElfX0hfCisjZGVmaW5lIF9PTF9DVFJMX1RYUlhfQVBJX19IXworCisvKiAjaW5jbHVkZSA8b3NhcGlfbGludXguaD4gICAgICAvICogdWludDhfdCAqIC8gKi8KKyNpbmNsdWRlIDxvc2RlcC5oPiAgICAgICAgICAgICAgLyogdWludDhfdCAqLworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90ICovCisKKyNpbmNsdWRlIDxvbF9jdHJsX2FwaS5oPiAgICAgICAgICAgIC8qIG9sX3ZkZXZfaGFuZGxlICovCisjaW5jbHVkZSA8b2xfdHhyeF9hcGkuaD4gICAgICAgICAgICAvKiBvbF90eHJ4X3BlZXJfaGFuZGxlLCBldGMuICovCisjaW5jbHVkZSA8Y2RzX2llZWU4MDIxMV9jb21tb24uaD4gICAvKiBpZWVlODAyMTFfZnJhbWUgKi8KKworZW51bSBvbF9yeF9lcnJfdHlwZSB7CisJT0xfUlhfRVJSX0RFRlJBR19NSUMsCisJT0xfUlhfRVJSX1BOLAorCU9MX1JYX0VSUl9VTktOT1dOX1BFRVIsCisJT0xfUlhfRVJSX01BTEZPUk1FRCwKKwlPTF9SWF9FUlJfVEtJUF9NSUMsCisJT0xfUlhfRVJSX0RFQ1JZUFQsCisJT0xfUlhfRVJSX01QRFVfTEVOR1RILAorCU9MX1JYX0VSUl9FTkNSWVBUX1JFUVVJUkVELAorCU9MX1JYX0VSUl9EVVAsCisJT0xfUlhfRVJSX1VOS05PV04sCisJT0xfUlhfRVJSX0ZDUywKKwlPTF9SWF9FUlJfUFJJVkFDWSwKKwlPTF9SWF9FUlJfTk9ORV9GUkFHLAorCU9MX1JYX0VSUl9OT05FID0gMHhGRgorfTsKKworI2lmZGVmIFNVUFBPUlRfSE9TVF9TVEFUSVNUSUNTCisvKiogKiBAYnJpZWYgVXBkYXRlIHR4IHN0YXRpc3RpY3MKKyAqIEBkZXRhaWxzCisgKiAgVXBkYXRlIHR4IHN0YXRpc3RpY3MgYWZ0ZXIgdHggY29tcGxldGUuCisgKgorICogQHBhcmFtIHBkZXYgLSBvbF9wZGV2X2hhbmRsZSBpbnN0YW5jZQorICogQHBhcmFtIHZkZXZfaWQgLSBJRCBvZiB0aGUgdmlydHVhbCBkZXZpY2UgdGhhdCB0eCBmcmFtZQorICogQHBhcmFtIGhhZF9lcnJvciAtIHdoZXRoZXIgdGhlcmUgaXMgZXJyb3Igd2hlbiB0eAorICovCit2b2lkIG9sX3R4X3N0YXRpc3RpY3Mob2xfcGRldl9oYW5kbGUgcGRldiwgdWludDE2X3QgdmRldl9pZCwgaW50IGhhZF9lcnJvcik7CisjZWxzZQorI2RlZmluZSBvbF90eF9zdGF0aXN0aWNzKHBkZXYsIHZkZXZfaWQsIGhhZF9lcnJvcikKKyNlbmRpZgorCisvKiogKiBAYnJpZWYgQ291bnQgb24gcmVjZWl2ZWQgcGFja2V0cyBmb3IgaW52YWxpZCBwZWVyIGNhc2UKKyAqCisgKiBAcGFyYW0gcGRldiAtIHR4cnggcGRldiBoYW5kbGUKKyAqIEBwYXJhbSB3aCAtIHJlY2VpdmVkIGZyYW1lCisgKiBAcGFyYW0gZXJyX3R5cGUgLSB3aGF0IGtpbmQgb2YgZXJyb3Igb2NjdXJyZWQKKyAqLwordm9pZCBvbF9yeF9lcnJfaW52X3BlZXJfc3RhdGlzdGljcyhvbF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoLAorCQkJCSAgIGVudW0gb2xfcnhfZXJyX3R5cGUgZXJyX3R5cGUpOworCisvKioKKyAqIEBicmllZiBDb3VudCBvbiByZWNlaXZlZCBwYWNrZXRzLCBib3RoIHN1Y2Nlc3MgYW5kIGZhaWxlZAorICoKKyAqIEBwYXJhbSBwZGV2IC0gb2xfcGRldl9oYW5kbGUgaGFuZGxlCisgKiBAcGFyYW0gdmRldl9pZCAtIElEIG9mIHRoZSB2aXJ0dWFsIGRldmljZSByZWNlaXZlZCB0aGUgZXJyb25lb3VzIHJ4IGZyYW1lCisgKiBAcGFyYW0gZXJyX3R5cGUgLSB3aGF0IGtpbmQgb2YgZXJyb3Igb2NjdXJyZWQKKyAqIEBwYXJhbSBzZWNfdHlwZSAtIFRoZSBjaXBoZXIgdHlwZSB0aGUgcGVlciBpcyB1c2luZworICogQHBhcmFtIGlzX21jYXN0IC0gd2hldGhlciB0aGlzIGlzIG9uZSBtdWx0aSBjYXN0IGZyYW1lCisgKi8KK3ZvaWQgb2xfcnhfZXJyX3N0YXRpc3RpY3Mob2xfcGRldl9oYW5kbGUgcGRldiwKKwkJCSAgdWludDhfdCB2ZGV2X2lkLAorCQkJICBlbnVtIG9sX3J4X2Vycl90eXBlIGVycl90eXBlLAorCQkJICBlbnVtIG9sX3NlY190eXBlIHNlY190eXBlLCBpbnQgaXNfbWNhc3QpOworCisvKioKKyAqIEBicmllZiBQcm92aWRlIG5vdGlmaWNhdGlvbiBvZiBmYWlsdXJlIGR1cmluZyBob3N0IHJ4IHByb2Nlc3NpbmcKKyAqIEBkZXRhaWxzCisgKiAgSW5kaWNhdGUgYW4gZXJyb3IgZHVyaW5nIGhvc3QgcnggZGF0YSBwcm9jZXNzaW5nLCBpbmNsdWRpbmcgd2hhdAorICogIGtpbmQgb2YgZXJyb3IgaGFwcGVuZWQsIHdoZW4gaXQgaGFwcGVuZWQsIHdoaWNoIHBlZXIgYW5kIFRJRCB0aGUKKyAqICBlcnJvbmVvdXMgcnggZnJhbWUgaXMgZnJvbSwgYW5kIHdoYXQgdGhlIGVycm9uZW91cyByeCBmcmFtZSBpdHNlbGYKKyAqICBpcy4KKyAqCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byB0aGUgY3RybCBTVydzIHBoeXNpY2FsIGRldmljZSBvYmplY3QKKyAqIEBwYXJhbSB2ZGV2X2lkIC0gSUQgb2YgdGhlIHZpcnR1YWwgZGV2aWNlIHJlY2VpdmVkIHRoZSBlcnJvbmVvdXMgcnggZnJhbWUKKyAqIEBwYXJhbSBwZWVyX21hY19hZGRyIC0gTUFDIGFkZHJlc3Mgb2YgdGhlIHBlZXIgdGhhdCBzZW50IHRoZSBlcnJvbmVvdXMKKyAqICAgICAgcnggZnJhbWUKKyAqIEBwYXJhbSB0aWQgLSB3aGljaCBUSUQgd2l0aGluIHRoZSBwZWVyIHNlbnQgdGhlIGVycm9uZW91cyByeCBmcmFtZQorICogQHBhcmFtIHRzZjMyICAtIHRoZSB0aW1zdGFtcCBpbiBUU0YgdW5pdHMgb2YgdGhlIGVycm9uZW91cyByeCBmcmFtZSwgb3IKKyAqICAgICAgb25lIG9mIHRoZSBmcmFnbWVudHMgdGhhdCB3aGVuIHJlYXNzZW1ibGVkLCBjb25zdGl0dXRlIHRoZSByeCBmcmFtZQorICogQHBhcmFtIGVycl90eXBlIC0gd2hhdCBraW5kIG9mIGVycm9yIG9jY3VycmVkCisgKiBAcGFyYW0gcnhfZnJhbWUgLSB0aGUgcnggZnJhbWUgdGhhdCBoYWQgYW4gZXJyb3IKKyAqIEBwbiAtIFBhY2tldCBzZXF1ZW5jZSBudW1iZXIKKyAqIEBrZXlfaWQgLSBLZXkgaW5kZXggb2N0ZXQgcmVjZWl2ZWQgaW4gSVYgb2YgdGhlIGZyYW1lCisgKi8KK3ZvaWQKK29sX3J4X2VycihvbF9wZGV2X2hhbmRsZSBwZGV2LAorCSAgdWludDhfdCB2ZGV2X2lkLAorCSAgdWludDhfdCAqcGVlcl9tYWNfYWRkciwKKwkgIGludCB0aWQsCisJICB1aW50MzJfdCB0c2YzMiwKKwkgIGVudW0gb2xfcnhfZXJyX3R5cGUgZXJyX3R5cGUsCisJICBjZGZfbmJ1Zl90IHJ4X2ZyYW1lLCB1aW50NjRfdCAqcG4sIHVpbnQ4X3Qga2V5X2lkKTsKKworZW51bSBvbF9yeF9ub3RpZnlfdHlwZSB7CisJT0xfUlhfTk9USUZZX0lQVjRfSUdNUCwKK307CisKKy8qKgorICogQGJyaWVmIFByb3ZpZGUgbm90aWZpY2F0aW9uIG9mIHJlY2VwdGlvbiBvZiBkYXRhIG9mIHNwZWNpYWwgaW50ZXJlc3QuCisgKiBAZGV0YWlscworICogIEluZGljYXRlIHdoZW4gInNwZWNpYWwiIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQuICBUaGUgbmF0dXJlIG9mIHRoZQorICogIGRhdGEgdGhhdCByZXN1bHRzIGluIGl0IGJlaW5nIGNvbnNpZGVyZWQgc3BlY2lhbCBpcyBzcGVjaWZpZWQgaW4gdGhlCisgKiAgbm90aWZ5X3R5cGUgYXJndW1lbnQuCisgKiAgVGhpcyBmdW5jdGlvbiBpcyBjdXJyZW50bHkgdXNlZCBieSB0aGUgZGF0YS1wYXRoIFNXIHRvIG5vdGlmeSB0aGUKKyAqICBjb250cm9sIHBhdGggU1cgd2hlbiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIHJ4IGRhdGEgYXJlIHJlY2VpdmVkOgorICogICAgKyBJUHY0IElHTVAgZnJhbWVzCisgKiAgICAgIFRoZSBjb250cm9sIFNXIGNhbiB1c2UgdGhlc2UgdG8gbGVhcm4gYWJvdXQgbXVsdGljYXN0IGdyb3VwCisgKiAgICAgIG1lbWJlcnNoaXAsIGlmIGl0IHNvIGNob29zZXMuCisgKgorICogQHBhcmFtIHBkZXYgLSBoYW5kbGUgdG8gdGhlIGN0cmwgU1cncyBwaHlzaWNhbCBkZXZpY2Ugb2JqZWN0CisgKiBAcGFyYW0gdmRldl9pZCAtIElEIG9mIHRoZSB2aXJ0dWFsIGRldmljZSByZWNlaXZlZCB0aGUgc3BlY2lhbCBkYXRhCisgKiBAcGFyYW0gcGVlcl9tYWNfYWRkciAtIE1BQyBhZGRyZXNzIG9mIHRoZSBwZWVyIHRoYXQgc2VudCB0aGUgc3BlY2lhbCBkYXRhCisgKiBAcGFyYW0gdGlkIC0gd2hpY2ggVElEIHdpdGhpbiB0aGUgcGVlciBzZW50IHRoZSBzcGVjaWFsIGRhdGEKKyAqIEBwYXJhbSB0c2YzMiAgLSB0aGUgdGltc3RhbXAgaW4gVFNGIHVuaXRzIG9mIHRoZSBzcGVjaWFsIGRhdGEKKyAqIEBwYXJhbSBub3RpZnlfdHlwZSAtIHdoYXQga2luZCBvZiBzcGVjaWFsIGRhdGEgd2FzIHJlY2VpdmVkCisgKiBAcGFyYW0gcnhfZnJhbWUgLSB0aGUgcnggZnJhbWUgY29udGFpbmluZyB0aGUgc3BlY2lhbCBkYXRhCisgKi8KK3ZvaWQKK29sX3J4X25vdGlmeShvbF9wZGV2X2hhbmRsZSBwZGV2LAorCSAgICAgdWludDhfdCB2ZGV2X2lkLAorCSAgICAgdWludDhfdCAqcGVlcl9tYWNfYWRkciwKKwkgICAgIGludCB0aWQsCisJICAgICB1aW50MzJfdCB0c2YzMiwKKwkgICAgIGVudW0gb2xfcnhfbm90aWZ5X3R5cGUgbm90aWZ5X3R5cGUsIGNkZl9uYnVmX3QgcnhfZnJhbWUpOworCisvKioKKyAqIEBicmllZiBJbmRpY2F0ZSB3aGVuIGEgcGF1c2VkIFNUQSBoYXMgdHggZGF0YSBhdmFpbGFibGUuCisgKiBAZGV0YWlscworICogIEluZGljYXRlIHRvIHRoZSBjb250cm9sIFNXIHdoZW4gYSBwYXVzZWQgcGVlciB0aGF0IHByZXZpb3VzbHkKKyAqICBoYXMgYWxsIGl0cyBwZWVyLVRJRCBxdWV1ZXMgZW1wdHkgZ2V0cyBhIE1TRFUgdG8gdHJhbnNtaXQuCisgKiAgQ29udmVyc2VseSwgaW5kaWNhdGUgd2hlbiBhIHBhdXNlZCBwZWVyIHRoYXQgaGFkIGRhdGEgaW4gb25lIG9yIG1vcmUgb2YKKyAqICBpdHMgcGVlci1USUQgcXVldWVzIGhhcyBhbGwgcXVldWVkIGRhdGEgcmVtb3ZlZCAoZS5nLiBkdWUgdG8gYSBVLUFQU0QKKyAqICB0cmlnZ2VyZWQgdHJhbnNtaXNzaW9uKSwgYnV0IGlzIHN0aWxsIHBhdXNlZC4KKyAqICBJdCBpcyB1cCB0byB0aGUgY29udHJvbCBTVyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcGVlciBpcyBwYXVzZWQgZHVlIHRvCisgKiAgYmVpbmcgaW4gcG93ZXItc2F2ZSBzbGVlcCwgb3Igc29tZSBvdGhlciByZWFzb24sIGFuZCB0aHVzIHdoZXRoZXIgaXQgaXMKKyAqICBuZWNlc3NhcnkgdG8gc2V0IHRoZSBUSU0gaW4gYmVhY29ucyB0byBub3RpZnkgYSBzbGVlcGluZyBTVEEgdGhhdCBpdCBoYXMKKyAqICBkYXRhLgorICogIFRoZSBkYXRhIFNXIHdpbGwgYWxzbyBpc3N1ZSB0aGlzIG9sX3R4X3BhdXNlZF9wZWVyX2RhdGEgY2FsbCB3aGVuIGFuCisgKiAgdW5wYXVzZWQgcGVlciB0aGF0IGN1cnJlbnRseSBoYXMgdHggZGF0YSBpbiBvbmUgb3IgbW9yZSBvZiBpdHMKKyAqICBwZWVyLVRJRCBxdWV1ZXMgYmVjb21lcyBwYXVzZWQuCisgKiAgVGhlIGRhdGEgU1cgd2lsbCBub3QgaXNzdWUgdGhpcyBvbF90eF9wYXVzZWRfcGVlcl9kYXRhIGNhbGwgd2hlbiBhCisgKiAgcGVlciB3aXRoIGRhdGEgaW4gb25lIG9yIG1vcmUgb2YgaXRzIHBlZXItVElEIHF1ZXVlcyBiZWNvbWVzIHVucGF1c2VkLgorICoKKyAqIEBwYXJhbSBwZWVyIC0gdGhlIHBhdXNlZCBwZWVyCisgKiBAcGFyYW0gaGFzX3R4X2RhdGEgLQorICogICAgICAxIC0+IGEgcGF1c2VkIHBlZXIgdGhhdCBwcmV2aW91c2x5IGhhZCBubyB0eCBkYXRhIG5vdyBkb2VzLCAtT1ItCisgKiAgICAgIDAgLT4gYSBwYXVzZWQgcGVlciB0aGF0IHByZXZpb3VzbHkgaGFkIHR4IGRhdGEgbm93IGRvZXNudAorICovCit2b2lkIG9sX3R4X3BhdXNlZF9wZWVyX2RhdGEob2xfcGVlcl9oYW5kbGUgcGVlciwgaW50IGhhc190eF9kYXRhKTsKKworI2RlZmluZSBvbF9jdHJsX2FkZGJhX3JlcShwZGV2LCBwZWVyX21hY19hZGRyLCB0aWQpIG9sX2FkZGJhX3JlcV9yZWplY3QKKyNkZWZpbmUgb2xfY3RybF9yeF9hZGRiYV9jb21wbGV0ZShwZGV2LCBwZWVyX21hY19hZGRyLCB0aWQsIGZhaWxlZCkgLyogbm8tb3AgKi8KKwordm9pZCBvbF90eHJ4X3NldF9wZWVyX2F1dGhvcml6ZWRfZXZlbnQoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2KTsKKworCisjZW5kaWYgLyogX09MX0NUUkxfVFhSWF9BUElfX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfb3NpZl90eHJ4X2FwaS5oIGIvY29yZS9kcC90eHJ4L29sX29zaWZfdHhyeF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDdhMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L29sX29zaWZfdHhyeF9hcGkuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIG9sX29zaWZfdHhyeF9hcGkuaAorICogQGJyaWVmIERlZmluZSB0aGUgT1Mgc3BlY2lmaWMgQVBJIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdHhyeCBTVy4KKyAqLworI2lmbmRlZiBfT0xfT1NJRl9UWFJYX0FQSV9IXworI2RlZmluZSBfT0xfT1NJRl9UWFJYX0FQSV9IXworCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX3QgKi8KKworLyoqCisgKiBAYnJpZWYgQ2FsbCB0eCBjb21wbGV0aW9uIGhhbmRsZXIgdG8gcmVsZWFzZSB0aGUgYnVmZmVycworICogQGRldGFpbHMKKyAqCisgKiBJbnZva2UgdHggY29tcGxldGlvbiBoYW5kbGVyIHdoZW4gdGhlIHR4IGNyZWRpdCBnb2VzIGJlbG93IGxvdyB3YXRlciBtYXJrLgorICogVGhpcyBlbGltaW5hdGUgdGhlIHBhY2tldCBkcm9wIGluIHRoZSBob3N0IGRyaXZlciBkdWUgdG8gc2VuZCByb3V0aW5lIG5vdAorICogeWllbGRpbmcgdGhlIGNwdSB3aGVuIHRoZSBhbW91bnQgb2YgdHJhZmZpYyBwdW1wZWQgZnJvbSB0aGUgbmV0d29yayBsYXllcgorICogaXMgdmVyeSBoaWdoLgorICoKKyAqIEBwYXJhbSBvc2RldgorICovCisKK3ZvaWQgb2xfb3NpZl9hdGhfdGFza2xldChjZGZfZGV2aWNlX3Qgb3NkZXYpOworCisjZW5kaWYgLyogX09MX09TSUZfVFhSWF9BUElfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF9yeC5jIGIvY29yZS9kcC90eHJ4L29sX3J4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwMDdhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvdHhyeC9vbF9yeC5jCkBAIC0wLDAgKzEsMTQ5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAgICAgLyogY2RmX25idWZfdCwgZXRjLiAqLworI2luY2x1ZGUgPGNkZl91dGlsLmg+ICAgICAgICAgICAgICAgLyogY2RmX29zX2NwdV90b19sZTY0ICovCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+ICAgICAgICAgICAgICAvKiBib29sICovCisjaW5jbHVkZSA8Y2RzX2llZWU4MDIxMV9jb21tb24uaD4gICAvKiBpZWVlODAyMTFfZnJhbWUgKi8KKworLyogZXh0ZXJuYWwgQVBJIGhlYWRlciBmaWxlcyAqLworI2luY2x1ZGUgPG9sX2N0cmxfdHhyeF9hcGkuaD4gICAvKiBvbF9yeF9ub3RpZnkgKi8KKyNpbmNsdWRlIDxvbF9odHRfYXBpLmg+ICAgICAgICAgLyogaHR0X3BkZXZfaGFuZGxlICovCisjaW5jbHVkZSA8b2xfdHhyeF9hcGkuaD4gICAgICAgIC8qIG9sX3R4cnhfcGRldl9oYW5kbGUgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2h0dF9hcGkuaD4gICAgLyogb2xfcnhfaW5kaWNhdGlvbl9oYW5kbGVyICovCisjaW5jbHVkZSA8b2xfaHR0X3J4X2FwaS5oPiAgICAgIC8qIGh0dF9yeF9wZWVyX2lkLCBldGMuICovCisKKy8qIGludGVybmFsIEFQSSBoZWFkZXIgZmlsZXMgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+ICAgICAgLyogb2xfdHhyeF92ZGV2X3QsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF90eHJ4X3BlZXJfZmluZC5oPiAgLyogb2xfdHhyeF9wZWVyX2ZpbmRfYnlfaWQgKi8KKyNpbmNsdWRlIDxvbF9yeF9yZW9yZGVyLmg+ICAgICAgLyogb2xfcnhfcmVvcmRlcl9zdG9yZSwgZXRjLiAqLworI2luY2x1ZGUgPG9sX3J4X3Jlb3JkZXJfdGltZW91dC5oPiAgICAgIC8qIE9MX1JYX1JFT1JERVJfVElNRU9VVF9VUERBVEUgKi8KKyNpbmNsdWRlIDxvbF9yeF9kZWZyYWcuaD4gICAgICAgLyogb2xfcnhfZGVmcmFnX3dhaXRsaXN0X2ZsdXNoICovCisjaW5jbHVkZSA8b2xfdHhyeF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHdkaV9ldmVudC5oPgorI2lmZGVmIFFDQV9TVVBQT1JUX1NXX1RYUlhfRU5DQVAKKyNpbmNsdWRlIDxvbF90eHJ4X2VuY2FwLmg+ICAgICAgLyogb2xfcnhfZGVjYXBfaW5mb190LCBldGMgKi8KKyNlbmRpZgorCisvKiBGSVggVEhJUzogdHhyeCBzaG91bGQgbm90IGluY2x1ZGUgcHJpdmF0ZSBoZWFkZXIgZmlsZXMgb2Ygb3RoZXIgbW9kdWxlcyAqLworI2luY2x1ZGUgPGh0dF90eXBlcy5oPgorI2luY2x1ZGUgPG9sX2lmX2F0aHZhci5oPgorI2luY2x1ZGUgPGVuZXQuaD4gICAgICAgICAgICAgICAvKiBldGhlcm5ldCArIFNOQVAvTExDIGhlYWRlciBkZWZzIGFuZAorCQkJCSAgIGV0aGVydHlwZSB2YWx1ZXMgKi8KKyNpbmNsdWRlIDxpcF9wcm90Lmg+ICAgICAgICAgICAgLyogSVAgcHJvdG9jb2wgdmFsdWVzICovCisjaW5jbHVkZSA8aXB2NC5oPiAgICAgICAgICAgICAgIC8qIElQdjQgaGVhZGVyIGRlZnMgKi8KKyNpbmNsdWRlIDxpcHY2X2RlZnMuaD4gICAgICAgICAgLyogSVB2NiBoZWFkZXIgZGVmcyAqLworI2luY2x1ZGUgPG9sX3Zvd2V4dF9kYmdfZGVmcy5oPgorI2luY2x1ZGUgPG9sX3R4cnhfb3NpZl9hcGkuaD4KKyNpbmNsdWRlIDx3bWEuaD4KKworI2lmZGVmIEhUVF9SWF9SRVNUT1JFCisjaWYgIGRlZmluZWQoQ09ORklHX0NOU1MpCisjaW5jbHVkZSA8bmV0L2Nuc3MuaD4KKyNlbmRpZgorI2VuZGlmCisKK3ZvaWQgb2xfcnhfZGF0YV9wcm9jZXNzKHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJCWNkZl9uYnVmX3QgcnhfYnVmX2xpc3QpOworCisKKyNpZmRlZiBIVFRfUlhfUkVTVE9SRQorCitzdGF0aWMgdm9pZCBvbF9yeF9yZXN0b3JlX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICpodHRfcngpCit7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIkVudGVyOiAlcyIsIF9fZnVuY19fKTsKKwljbnNzX2RldmljZV9zZWxmX3JlY292ZXJ5KCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIkV4aXQ6ICVzIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgREVDTEFSRV9XT1JLKG9sX3J4X3Jlc3RvcmVfd29yaywgb2xfcnhfcmVzdG9yZV9oYW5kbGVyKTsKKwordm9pZCBvbF9yeF90cmlnZ2VyX3Jlc3RvcmUoaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2LCBjZGZfbmJ1Zl90IGhlYWRfbXNkdSwKKwkJCSAgIGNkZl9uYnVmX3QgdGFpbF9tc2R1KQoreworCWNkZl9uYnVmX3QgbmV4dDsKKworCXdoaWxlIChoZWFkX21zZHUpIHsKKwkJbmV4dCA9IGNkZl9uYnVmX25leHQoaGVhZF9tc2R1KTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICJmcmVlaW5nICVwXG4iLCBoZWFkX21zZHUpOworCQljZGZfbmJ1Zl9mcmVlKGhlYWRfbXNkdSk7CisJCWhlYWRfbXNkdSA9IG5leHQ7CisJfQorCisJaWYgKCFodHRfcGRldi0+cnhfcmluZy5odHRfcnhfcmVzdG9yZSkgeworCQljZHNfc2V0X2xvZ3BfaW5fcHJvZ3Jlc3ModHJ1ZSk7CisJCWh0dF9wZGV2LT5yeF9yaW5nLmh0dF9yeF9yZXN0b3JlID0gMTsKKwkJc2NoZWR1bGVfd29yaygmb2xfcnhfcmVzdG9yZV93b3JrKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgb2xfcnhfcHJvY2Vzc19pbnZfcGVlcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkJICAgdm9pZCAqcnhfbXBkdV9kZXNjLCBjZGZfbmJ1Zl90IG1zZHUpCit7CisJdWludDhfdCBhMVtJRUVFODAyMTFfQUREUl9MRU5dOworCWh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiA9IHBkZXYtPmh0dF9wZGV2OworCXN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2g7CisJc3RydWN0IHdkaV9ldmVudF9yeF9wZWVyX2ludmFsaWRfbXNnIG1zZzsKKworCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKikKKwkgICAgIGh0dF9yeF9tcGR1X3dpZmlfaGRyX3JldHJpZXZlKGh0dF9wZGV2LCByeF9tcGR1X2Rlc2MpOworCS8qCisJICogS2xvY3dvcmsgaXNzdWUgIzYxNTIKKwkgKiAgQWxsIHRhcmdldHMgdGhhdCBzZW5kIGEgIklOVkFMSURfUEVFUiIgcnggc3RhdHVzIHByb3ZpZGUgYQorCSAqICA4MDIuMTEgaGVhZGVyIGZvciBlYWNoIHJ4IE1QRFUsIHNvIGl0IGlzIGNlcnRhaW4gdGhhdAorCSAqICBodHRfcnhfbXBkdV93aWZpX2hkcl9yZXRyaWV2ZSB3aWxsIHN1Y2NlZWQuCisJICogIEhvd2V2ZXIsIGJvdGggZm9yIHJvYnVzdG5lc3MsIGUuZy4gaWYgdGhpcyBmdW5jdGlvbiBpcyBnaXZlbiBhCisJICogIE1TRFUgZGVzY3JpcHRvciByYXRoZXIgdGhhbiBhIE1QRFUgZGVzY3JpcHRvciwgYW5kIHRvIG1ha2UgaXQKKwkgKiAgY2xlYXIgdG8gc3RhdGljIGFuYWx5c2lzIHRoYXQgdGhpcyBjb2RlIGlzIHNhZmUsIGFkZCBhbiBleHBsaWNpdAorCSAqICBjaGVjayB0aGF0IGh0dF9yeF9tcGR1X3dpZmlfaGRyX3JldHJpZXZlIHByb3ZpZGVzIGEgbm9uLU5VTEwgdmFsdWUuCisJICovCisJaWYgKHdoID09IE5VTEwgfHwgIUlFRUU4MDIxMV9JU19EQVRBKHdoKSkKKwkJcmV0dXJuOworCisJLyogaWdub3JlIGZyYW1lcyBmb3Igbm9uLWV4aXN0ZW50IGJzc2lkcyAqLworCWNkZl9tZW1fY29weShhMSwgd2gtPmlfYWRkcjEsIElFRUU4MDIxMV9BRERSX0xFTik7CisJVEFJTFFfRk9SRUFDSCh2ZGV2LCAmcGRldi0+dmRldl9saXN0LCB2ZGV2X2xpc3RfZWxlbSkgeworCQlpZiAoY2RmX21lbV9jb21wYXJlKGExLCB2ZGV2LT5tYWNfYWRkci5yYXcsIElFRUU4MDIxMV9BRERSX0xFTikKKwkJICAgID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghdmRldikKKwkJcmV0dXJuOworCisJbXNnLndoID0gd2g7CisJbXNnLm1zZHUgPSBtc2R1OworCW1zZy52ZGV2X2lkID0gdmRldi0+dmRldl9pZDsKKyNpZmRlZiBXRElfRVZFTlRfRU5BQkxFCisJd2RpX2V2ZW50X2hhbmRsZXIoV0RJX0VWRU5UX1JYX1BFRVJfSU5WQUxJRCwgcGRldiwgJm1zZyk7CisjZW5kaWYKK30KKworI2lmZGVmIFFDQV9TVVBQT1JUX1BFRVJfREFUQV9SWF9SU1NJCitzdGF0aWMgaW5saW5lIGludDE2X3QKK29sX3J4X3Jzc2lfYXZnKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwgaW50MTZfdCByc3NpX29sZCwgaW50MTZfdCByc3NpX25ldykKK3sKKwlpbnQgcnNzaV9vbGRfd2VpZ2h0OworCisJaWYgKHJzc2lfbmV3ID09IEhUVF9SU1NJX0lOVkFMSUQpCisJCXJldHVybiByc3NpX29sZDsKKwlpZiAocnNzaV9vbGQgPT0gSFRUX1JTU0lfSU5WQUxJRCkKKwkJcmV0dXJuIHJzc2lfbmV3OworCisJcnNzaV9vbGRfd2VpZ2h0ID0KKwkJKDEgPDwgcGRldi0+cnNzaV91cGRhdGVfc2hpZnQpIC0gcGRldi0+cnNzaV9uZXdfd2VpZ2h0OworCXJldHVybiAocnNzaV9uZXcgKiBwZGV2LT5yc3NpX25ld193ZWlnaHQgKworCQlyc3NpX29sZCAqIHJzc2lfb2xkX3dlaWdodCkgPj4gcGRldi0+cnNzaV91cGRhdGVfc2hpZnQ7Cit9CisKK3N0YXRpYyB2b2lkCitvbF9yeF9pbmRfcnNzaV91cGRhdGUoc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCBjZGZfbmJ1Zl90IHJ4X2luZF9tc2cpCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gcGVlci0+dmRldi0+cGRldjsKKwlwZWVyLT5yc3NpX2RibSA9IG9sX3J4X3Jzc2lfYXZnKHBkZXYsIHBlZXItPnJzc2lfZGJtLAorCQkJCQlodHRfcnhfaW5kX3Jzc2lfZGJtKHBkZXYtPmh0dF9wZGV2LAorCQkJCQkJCSAgICByeF9pbmRfbXNnKSk7Cit9CisKK3N0YXRpYyB2b2lkCitvbF9yeF9tcGR1X3Jzc2lfdXBkYXRlKHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwgdm9pZCAqcnhfbXBkdV9kZXNjKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHBlZXItPnZkZXYtPnBkZXY7CisJaWYgKCFwZWVyKQorCQlyZXR1cm47CisJcGVlci0+cnNzaV9kYm0gPSBvbF9yeF9yc3NpX2F2ZyhwZGV2LCBwZWVyLT5yc3NpX2RibSwKKwkJCQkJaHR0X3J4X21wZHVfZGVzY19yc3NpX2RibSgKKwkJCQkJCXBkZXYtPmh0dF9wZGV2LAorCQkJCQkJcnhfbXBkdV9kZXNjKSk7Cit9CisKKyNlbHNlCisjZGVmaW5lIG9sX3J4X2luZF9yc3NpX3VwZGF0ZShwZWVyLCByeF9pbmRfbXNnKSAvKiBuby1vcCAqLworI2RlZmluZSBvbF9yeF9tcGR1X3Jzc2lfdXBkYXRlKHBlZXIsIHJ4X21wZHVfZGVzYykgICAgICAvKiBuby1vcCAqLworI2VuZGlmIC8qIFFDQV9TVVBQT1JUX1BFRVJfREFUQV9SWF9SU1NJICovCisKK3ZvaWQgZGlzY2FyZF9tc2R1cyhodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsCisJCSAgIGNkZl9uYnVmX3QgaGVhZF9tc2R1LAorCQkgICBjZGZfbmJ1Zl90IHRhaWxfbXNkdSkKK3sKKwl3aGlsZSAoMSkgeworCQljZGZfbmJ1Zl90IG5leHQ7CisJCW5leHQgPSBjZGZfbmJ1Zl9uZXh0KAorCQkJaGVhZF9tc2R1KTsKKwkJaHR0X3J4X2Rlc2NfZnJhbWVfZnJlZQorCQkJKGh0dF9wZGV2LAorCQkJIGhlYWRfbXNkdSk7CisJCWlmIChoZWFkX21zZHUgPT0KKwkJICAgIHRhaWxfbXNkdSkgeworCQkJYnJlYWs7CisJCX0KKwkJaGVhZF9tc2R1ID0gbmV4dDsKKwl9CisJcmV0dXJuOworfQorCit2b2lkIGNoYWluX21zZHVzKGh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiwKKwkJIGNkZl9uYnVmX3QgaGVhZF9tc2R1LAorCQkgY2RmX25idWZfdCB0YWlsX21zZHUpCit7CisJd2hpbGUgKDEpIHsKKwkJY2RmX25idWZfdCBuZXh0OworCQluZXh0ID0gY2RmX25idWZfbmV4dChoZWFkX21zZHUpOworCQlodHRfcnhfZGVzY19mcmFtZV9mcmVlKAorCQkJaHR0X3BkZXYsCisJCQloZWFkX21zZHUpOworCQlpZiAoaGVhZF9tc2R1ID09IHRhaWxfbXNkdSkKKwkJCWJyZWFrOworCQloZWFkX21zZHUgPSBuZXh0OworCX0KKwlyZXR1cm47Cit9CisKK3ZvaWQgcHJvY2Vzc19yZW9yZGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgICB2b2lkICpyeF9tcGR1X2Rlc2MsCisJCSAgICAgdWludDhfdCB0aWQsCisJCSAgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCQkgICAgIGNkZl9uYnVmX3QgaGVhZF9tc2R1LAorCQkgICAgIGNkZl9uYnVmX3QgdGFpbF9tc2R1LAorCQkgICAgIGludCBudW1fbXBkdV9yYW5nZXMsCisJCSAgICAgaW50IG51bV9wZHVzLAorCQkgICAgIGJvb2wgcnhfaW5kX3JlbGVhc2UKKwkpCit7CisJaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2ID0gcGRldi0+aHR0X3BkZXY7CisJZW51bSBodHRfcnhfc3RhdHVzIG1wZHVfc3RhdHVzOworCWludCByZW9yZGVyX2lkeDsKKwlyZW9yZGVyX2lkeCA9IGh0dF9yeF9tcGR1X2Rlc2NfcmVvcmRlcl9pZHgoaHR0X3BkZXYsIHJ4X21wZHVfZGVzYyk7CisJT0xfUlhfUkVPUkRFUl9UUkFDRV9BREQocGRldiwgdGlkLAorCQkJCXJlb3JkZXJfaWR4LAorCQkJCWh0dF9yeF9tcGR1X2Rlc2Nfc2VxX251bShodHRfcGRldiwKKwkJCQkJCQkgcnhfbXBkdV9kZXNjKSwKKwkJCQkxKTsKKwlvbF9yeF9tcGR1X3Jzc2lfdXBkYXRlKHBlZXIsIHJ4X21wZHVfZGVzYyk7CisJLyoKKwkgKiBJbiBtb3N0IGNhc2VzLCBvdXQtb2YtYm91bmRzIGFuZCBkdXBsaWNhdGUgc2VxdWVuY2UgbnVtYmVyIGRldGVjdGlvbgorCSAqIGlzIHBlcmZvcm1lZCBieSB0aGUgdGFyZ2V0LCBidXQgaW4gc29tZSBjYXNlcyBpdCBpcyBkb25lIGJ5IHRoZSBob3N0LgorCSAqIFNwZWNpZmljYWxseSwgdGhlIGhvc3QgZG9lcyByeCBvdXQtb2YtYm91bmRzIHNlcXVlbmNlIG51bWJlcgorCSAqIGRldGVjdGlvbiBmb3I6CisJICogMS4gIFBlcmVncmluZSBvciBSb21lIHRhcmdldAorCSAqICAgICBmb3IgcGVlci1USURzIHRoYXQgZG8gbm90IGhhdmUgYWdncmVnYXRpb24gZW5hYmxlZCwgaWYgdGhlCisJICogICAgIFJYX1NLSVBfREVGUkFHX1RJTUVPVVRfRFVQX0RFVEVDVElPTl9DSEVDSyBmbGFnCisJICogICAgIGlzIHNldCBkdXJpbmcgdGhlIGRyaXZlciBidWlsZC4KKwkgKiAyLiAgUml2YS1mYW1pbHkgdGFyZ2V0cywgd2hpY2ggaGF2ZSByeCByZW9yZGVyIHRpbWVvdXRzIGhhbmRsZWQgYnkKKwkgKiAgICAgdGhlIGhvc3QgcmF0aGVyIHRoYW4gdGhlIHRhcmdldC4KKwkgKiAgICAgKFRoZSB0YXJnZXQgYWxyZWFkeSBkb2VzIGR1cGxpY2F0ZSBkZXRlY3Rpb24sIGJ1dCB0aGUgaG9zdAorCSAqICAgICBtYXkgaGF2ZSBnaXZlbiB1cCB3YWl0aW5nIGZvciBhIHBhcnRpY3VsYXIgc2VxdWVuY2UgbnVtYmVyIGJlZm9yZQorCSAqICAgICBpdCBhcnJpdmVzLiAgSW4gdGhpcyBjYXNlLCB0aGUgb3V0LW9mLWJvdW5kcyBzZXF1ZW5jZSBudW1iZXIKKwkgKiAgICAgb2YgdGhlIGxhdGUgZnJhbWUgYWxsb3dzIHRoZSBob3N0IHRvIGRpc2NhcmQgaXQsIHJhdGhlciB0aGFuCisJICogICAgIHNlbmRpbmcgaXQgb3V0IG9mIG9yZGVyLgorCSAqLworCW1wZHVfc3RhdHVzID0gT0xfUlhfU0VRX05VTV9DSEVDSyhwZGV2LAorCQkJCQkJICBwZWVyLAorCQkJCQkJICB0aWQsCisJCQkJCQkgIHJ4X21wZHVfZGVzYyk7CisJaWYgKG1wZHVfc3RhdHVzICE9IGh0dF9yeF9zdGF0dXNfb2spIHsKKwkJLyoKKwkJICogSWYgdGhlIHNlcXVlbmNlIG51bWJlciB3YXMgb3V0IG9mIGJvdW5kcywgdGhlIE1QRFUgbmVlZHMKKwkJICogdG8gYmUgZGlzY2FyZGVkLgorCQkgKi8KKwkJZGlzY2FyZF9tc2R1cyhodHRfcGRldiwgaGVhZF9tc2R1LCB0YWlsX21zZHUpOworCQkvKgorCQkgKiBGb3IgUGVyZWdyaW5lIGFuZCBSb21lLAorCQkgKiBPTF9SWF9SRU9SREVSX1NFUV9OVU1fQ0hFQ0sgc2hvdWxkIG9ubHkgZmFpbCBmb3IgdGhlIGNhc2UKKwkJICogb2YgKGR1cGxpY2F0ZSkgbm9uLWFnZ3JlZ2F0ZXMuCisJCSAqCisJCSAqIEZvciBSaXZhLCBQcm9udG8gYW5kIE5vcnRoc3RhciwKKwkJICogdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIE1QRFUgZGVsaXZlcmVkIGF0IGEgdGltZS4KKwkJICogVGh1cywgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgTVBEVXMgdGhhdCBuZWVkIHRvIGJlCisJCSAqIHByb2Nlc3NlZCBoZXJlLgorCQkgKiBKdXN0IHRvIGJlIHN1cmUgdGhpcyBpcyB0cnVlLCBjaGVjayB0aGUgYXNzdW1wdGlvbgorCQkgKiB0aGF0IHRoaXMgd2FzIHRoZSBvbmx5IE1QRFUgcmVmZXJlbmNlZCBieSB0aGUgcngKKwkJICogaW5kaWNhdGlvbi4KKwkJICovCisJCVRYUlhfQVNTRVJUMigobnVtX21wZHVfcmFuZ2VzID09IDEpICYmIG51bV9tcGR1cyA9PSAxKTsKKworCQkvKgorCQkgKiBUaGUgTVBEVSB3YXMgbm90IHN0b3JlZCBpbiB0aGUgcnggcmVvcmRlciBhcnJheSwgc28KKwkJICogdGhlcmUncyBub3RoaW5nIHRvIHJlbGVhc2UuCisJCSAqLworCQlyeF9pbmRfcmVsZWFzZSA9IGZhbHNlOworCX0gZWxzZSB7CisJCW9sX3J4X3Jlb3JkZXJfc3RvcmUocGRldiwgcGVlciwgdGlkLAorCQkJCSAgICByZW9yZGVyX2lkeCwgaGVhZF9tc2R1LCB0YWlsX21zZHUpOworCQlpZiAocGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0ud2luX3N6X21hc2sgPT0gMCkgeworCQkJcGVlci0+dGlkc19sYXN0X3NlcVt0aWRdID0gaHR0X3J4X21wZHVfZGVzY19zZXFfbnVtKAorCQkJCWh0dF9wZGV2LAorCQkJCXJ4X21wZHVfZGVzYyk7CisJCX0KKwl9CisJcmV0dXJuOworfSAvKiBwcm9jZXNzX3Jlb3JkZXIgKi8KKwordm9pZAorb2xfcnhfaW5kaWNhdGlvbl9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCSBjZGZfbmJ1Zl90IHJ4X2luZF9tc2csCisJCQkgdWludDE2X3QgcGVlcl9pZCwgdWludDhfdCB0aWQsIGludCBudW1fbXBkdV9yYW5nZXMpCit7CisJaW50IG1wZHVfcmFuZ2UsIGk7CisJdW5zaWduZWQgc2VxX251bV9zdGFydCA9IDAsIHNlcV9udW1fZW5kID0gMDsKKwlib29sIHJ4X2luZF9yZWxlYXNlID0gZmFsc2U7CisJc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2ID0gTlVMTDsKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisJaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2OworCXVpbnQxNl90IGNlbnRlcl9mcmVxOworCXVpbnQxNl90IGNoYW4xOworCXVpbnQxNl90IGNoYW4yOworCXVpbnQ4X3QgcGh5bW9kZTsKKwlib29sIHJldDsKKworCWh0dF9wZGV2ID0gcGRldi0+aHR0X3BkZXY7CisJcGVlciA9IG9sX3R4cnhfcGVlcl9maW5kX2J5X2lkKHBkZXYsIHBlZXJfaWQpOworCWlmICghcGVlcikgeworCQkvKgorCQkgKiBJZiB3ZSBjYW4ndCBmaW5kIGEgcGVlciBzZW5kIHRoaXMgcGFja2V0IHRvIE9DQiBpbnRlcmZhY2UKKwkJICogdXNpbmcgT0NCIHNlbGYgcGVlcgorCQkgKi8KKwkJaWYgKCFvbF90eHJ4X2dldF9vY2JfcGVlcihwZGV2LCAmcGVlcikpCisJCQlwZWVyID0gTlVMTDsKKwl9CisKKwlpZiAocGVlcikgeworCQl2ZGV2ID0gcGVlci0+dmRldjsKKwkJb2xfcnhfaW5kX3Jzc2lfdXBkYXRlKHBlZXIsIHJ4X2luZF9tc2cpOworCisJCWlmICh2ZGV2LT5vcG1vZGUgPT0gd2xhbl9vcF9tb2RlX29jYikgeworCQkJaHR0X3J4X2luZF9sZWdhY3lfcmF0ZShwZGV2LT5odHRfcGRldiwgcnhfaW5kX21zZywKKwkJCQkgICAgICAgJnBlZXItPmxhc3RfcGt0X2xlZ2FjeV9yYXRlLAorCQkJCSAgICAgICAmcGVlci0+bGFzdF9wa3RfbGVnYWN5X3JhdGVfc2VsKTsKKwkJCXBlZXItPmxhc3RfcGt0X3Jzc2lfY21iID0gaHR0X3J4X2luZF9yc3NpX2RibSgKKwkJCQlwZGV2LT5odHRfcGRldiwgcnhfaW5kX21zZyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJCXBlZXItPmxhc3RfcGt0X3Jzc2lbaV0gPQorCQkJCQlodHRfcnhfaW5kX3Jzc2lfZGJtX2NoYWluKAorCQkJCQlwZGV2LT5odHRfcGRldiwgcnhfaW5kX21zZywgaSk7CisJCQlodHRfcnhfaW5kX3RpbWVzdGFtcChwZGV2LT5odHRfcGRldiwgcnhfaW5kX21zZywKKwkJCQkJJnBlZXItPmxhc3RfcGt0X3RpbWVzdGFtcF9taWNyb3NlYywKKwkJCQkJJnBlZXItPmxhc3RfcGt0X3RpbWVzdGFtcF9zdWJtaWNyb3NlYyk7CisJCQlwZWVyLT5sYXN0X3BrdF90c2YgPSBodHRfcnhfaW5kX3RzZjMyKHBkZXYtPmh0dF9wZGV2LAorCQkJCQkJCSAgICAgIHJ4X2luZF9tc2cpOworCQkJcGVlci0+bGFzdF9wa3RfdGlkID0gaHR0X3J4X2luZF9leHRfdGlkKHBkZXYtPmh0dF9wZGV2LAorCQkJCQkJCQlyeF9pbmRfbXNnKTsKKwkJfQorCX0KKworCVRYUlhfU1RBVFNfSU5DUihwZGV2LCBwcml2LnJ4Lm5vcm1hbC5wcGR1cyk7CisKKwlPTF9SWF9SRU9SREVSX1RJTUVPVVRfTVVURVhfTE9DSyhwZGV2KTsKKworCWlmIChodHRfcnhfaW5kX2ZsdXNoKHBkZXYtPmh0dF9wZGV2LCByeF9pbmRfbXNnKSAmJiBwZWVyKSB7CisJCWh0dF9yeF9pbmRfZmx1c2hfc2VxX251bV9yYW5nZShwZGV2LT5odHRfcGRldiwgcnhfaW5kX21zZywKKwkJCQkJICAgICAgICZzZXFfbnVtX3N0YXJ0LCAmc2VxX251bV9lbmQpOworCQlpZiAodGlkID09IEhUVF9JTlZBTElEX1RJRCkgeworCQkJLyoKKwkJCSAqIGhvc3QvRlcgcmVvcmRlciBzdGF0ZSB3ZW50IG91dC1vZiBzeW5jCisJCQkgKiBmb3IgYSB3aGlsZSBiZWNhdXNlIEZXIHJhbiBvdXQgb2YgUnggaW5kaWNhdGlvbgorCQkJICogYnVmZmVyLiBXZSBoYXZlIHRvIGRpc2NhcmQgYWxsIHRoZSBidWZmZXJzIGluCisJCQkgKiByZW9yZGVyIHF1ZXVlLgorCQkJICovCisJCQlvbF9yeF9yZW9yZGVyX3BlZXJfY2xlYW51cCh2ZGV2LCBwZWVyKTsKKwkJfSBlbHNlIHsKKwkJCW9sX3J4X3Jlb3JkZXJfZmx1c2godmRldiwgcGVlciwgdGlkLCBzZXFfbnVtX3N0YXJ0LAorCQkJCQkgICAgc2VxX251bV9lbmQsIGh0dF9yeF9mbHVzaF9yZWxlYXNlKTsKKwkJfQorCX0KKworCWlmIChodHRfcnhfaW5kX3JlbGVhc2UocGRldi0+aHR0X3BkZXYsIHJ4X2luZF9tc2cpKSB7CisJCS8qIHRoZSBpbmQgaW5mbyBvZiByZWxlYXNlIGlzIHNhdmVkIGhlcmUgYW5kIGRvIHJlbGVhc2UgYXQgdGhlCisJCSAqIGVuZC4gVGhpcyBpcyBmb3IgdGhlIHJlYXNvbiBvZiBpbiBITCBjYXNlLCB0aGUgY2RmX25idWZfdAorCQkgKiBmb3IgbXNnIGFuZCBwYXlsb2FkIGFyZSB0aGUgc2FtZSBidWYuIEFuZCB0aGUgYnVmIHdpbGwgYmUKKwkJICogY2hhbmdlZCBkdXJpbmcgcHJvY2Vzc2luZyAqLworCQlyeF9pbmRfcmVsZWFzZSA9IHRydWU7CisJCWh0dF9yeF9pbmRfcmVsZWFzZV9zZXFfbnVtX3JhbmdlKHBkZXYtPmh0dF9wZGV2LCByeF9pbmRfbXNnLAorCQkJCQkJICZzZXFfbnVtX3N0YXJ0LCAmc2VxX251bV9lbmQpOworCX0KKyNpZmRlZiBERUJVR19ETUFfRE9ORQorCXBkZXYtPmh0dF9wZGV2LT5yeF9yaW5nLmRiZ19pbml0aWFsX21zZHVfcGF5bGQgPQorCQlwZGV2LT5odHRfcGRldi0+cnhfcmluZy5zd19yZF9pZHgubXNkdV9wYXlsZDsKKyNlbmRpZgorCisJZm9yIChtcGR1X3JhbmdlID0gMDsgbXBkdV9yYW5nZSA8IG51bV9tcGR1X3JhbmdlczsgbXBkdV9yYW5nZSsrKSB7CisJCWVudW0gaHR0X3J4X3N0YXR1cyBzdGF0dXM7CisJCWludCBpLCBudW1fbXBkdXM7CisJCWNkZl9uYnVmX3QgaGVhZF9tc2R1LCB0YWlsX21zZHUsIG1zZHU7CisJCXZvaWQgKnJ4X21wZHVfZGVzYzsKKworI2lmZGVmIERFQlVHX0RNQV9ET05FCisJCXBkZXYtPmh0dF9wZGV2LT5yeF9yaW5nLmRiZ19tcGR1X3JhbmdlID0gbXBkdV9yYW5nZTsKKyNlbmRpZgorCisJCWh0dF9yeF9pbmRfbXBkdV9yYW5nZV9pbmZvKHBkZXYtPmh0dF9wZGV2LCByeF9pbmRfbXNnLAorCQkJCQkgICBtcGR1X3JhbmdlLCAmc3RhdHVzLCAmbnVtX21wZHVzKTsKKwkJaWYgKChzdGF0dXMgPT0gaHR0X3J4X3N0YXR1c19vaykgJiYgcGVlcikgeworCQkJVFhSWF9TVEFUU19BREQocGRldiwgcHJpdi5yeC5ub3JtYWwubXBkdXMsIG51bV9tcGR1cyk7CisJCQkvKiB2YWxpZCBmcmFtZSAtIGRlcG9zaXQgaXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciAqLworCQkJZm9yIChpID0gMDsgaSA8IG51bV9tcGR1czsgaSsrKSB7CisJCQkJaW50IG1zZHVfY2hhaW5pbmc7CisJCQkJLyoKKwkJCQkgKiBHZXQgYSBsaW5rZWQgbGlzdCBvZiB0aGUgTVNEVXMgdGhhdCBjb21wcmlzZQorCQkJCSAqIHRoaXMgTVBEVS4KKwkJCQkgKiBUaGlzIGFsc28gYXR0YWNoZXMgZWFjaCByeCBNU0RVIGRlc2NyaXB0b3IgdG8KKwkJCQkgKiB0aGUgY29ycmVzcG9uZGluZyByeCBNU0RVIG5ldHdvcmsgYnVmZmVyLgorCQkJCSAqIChJbiBzb21lIHN5c3RlbXMsIHRoZSByeCBNU0RVIGRlc2MgaXMgYWxyZWFkeQorCQkJCSAqIGluIHRoZSBzYW1lIGJ1ZmZlciBhcyB0aGUgTVNEVSBwYXlsb2FkOyBpbgorCQkJCSAqIG90aGVyIHN5c3RlbXMgdGhleSBhcmUgc2VwYXJhdGUsIHNvIGEgcG9pbnRlcgorCQkJCSAqIG5lZWRzIHRvIGJlIHNldCBpbiB0aGUgbmV0YnVmIHRvIGxvY2F0ZSB0aGUKKwkJCQkgKiBjb3JyZXNwb25kaW5nIHJ4IGRlc2NyaXB0b3IuKQorCQkJCSAqCisJCQkJICogSXQgaXMgbmVjY2Vzc2FyeSB0byBjYWxsIGh0dF9yeF9hbXNkdV9wb3AKKwkJCQkgKiBiZWZvcmUgaHR0X3J4X21wZHVfZGVzY19saXN0X25leHQsIGJlY2F1c2UKKwkJCQkgKiB0aGUgKE1QRFUpIHJ4IGRlc2NyaXB0b3IgaGFzIERNQSB1bm1hcHBpbmcKKwkJCQkgKiBkb25lIGR1cmluZyB0aGUgaHR0X3J4X2Ftc2R1X3BvcCBjYWxsLgorCQkJCSAqIFRoZSByeCBkZXNjIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgdW50aWwgdGhpcworCQkJCSAqIERNQSB1bm1hcHBpbmcgaGFzIGJlZW4gZG9uZSwgc2luY2UgdGhlIERNQQorCQkJCSAqIHVubWFwcGluZyBpbnZvbHZlcyBtYWtpbmcgc3VyZSB0aGUgY2FjaGUgYXJlYQorCQkJCSAqIGZvciB0aGUgbWFwcGVkIGJ1ZmZlciBpcyBmbHVzaGVkLCBzbyB0aGUgZGF0YQorCQkJCSAqIHdyaXR0ZW4gYnkgdGhlIE1BQyBETUEgaW50byBtZW1vcnkgd2lsbCBiZQorCQkJCSAqIGZldGNoZWQsIHJhdGhlciB0aGFuIGdhcmJhZ2UgZnJvbSB0aGUgY2FjaGUuCisJCQkJICovCisKKyNpZmRlZiBERUJVR19ETUFfRE9ORQorCQkJCXBkZXYtPmh0dF9wZGV2LT5yeF9yaW5nLmRiZ19tcGR1X2NvdW50ID0gaTsKKyNlbmRpZgorCisJCQkJbXNkdV9jaGFpbmluZyA9CisJCQkJCWh0dF9yeF9hbXNkdV9wb3AoaHR0X3BkZXYsCisJCQkJCQkJIHJ4X2luZF9tc2csCisJCQkJCQkJICZoZWFkX21zZHUsCisJCQkJCQkJICZ0YWlsX21zZHUpOworI2lmZGVmIEhUVF9SWF9SRVNUT1JFCisJCQkJaWYgKGh0dF9wZGV2LT5yeF9yaW5nLnJ4X3Jlc2V0KSB7CisJCQkJCW9sX3J4X3RyaWdnZXJfcmVzdG9yZShodHRfcGRldiwKKwkJCQkJCQkgICAgICBoZWFkX21zZHUsCisJCQkJCQkJICAgICAgdGFpbF9tc2R1KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKyNlbmRpZgorCQkJCXJ4X21wZHVfZGVzYyA9CisJCQkJCWh0dF9yeF9tcGR1X2Rlc2NfbGlzdF9uZXh0KGh0dF9wZGV2LAorCQkJCQkJCQkgICByeF9pbmRfbXNnKTsKKwkJCQlyZXQgPSBodHRfcnhfbXNkdV9jZW50ZXJfZnJlcShodHRfcGRldiwgcGVlciwKKwkJCQkJcnhfbXBkdV9kZXNjLCAmY2VudGVyX2ZyZXEsICZjaGFuMSwKKwkJCQkJJmNoYW4yLCAmcGh5bW9kZSk7CisJCQkJaWYgKHJldCA9PSB0cnVlKSB7CisJCQkJCXBlZXItPmxhc3RfcGt0X2NlbnRlcl9mcmVxID0KKwkJCQkJCWNlbnRlcl9mcmVxOworCQkJCX0gZWxzZSB7CisJCQkJCXBlZXItPmxhc3RfcGt0X2NlbnRlcl9mcmVxID0gMDsKKwkJCQl9CisKKwkJCQkvKiBQa3Rsb2cgKi8KKyNpZmRlZiBXRElfRVZFTlRfRU5BQkxFCisJCQkJd2RpX2V2ZW50X2hhbmRsZXIoV0RJX0VWRU5UX1JYX0RFU0NfUkVNT1RFLAorCQkJCQkJICBwZGV2LCBoZWFkX21zZHUpOworI2VuZGlmCisKKwkJCQlpZiAobXNkdV9jaGFpbmluZykgeworCQkJCQkvKgorCQkJCQkgKiBUQkRYWFggLSB0byBkZWxpdmVyIFNEVSB3aXRoCisJCQkJCSAqIGNoYWluaW5nLCB3ZSBuZWVkIHRvIHN0aXRjaCB0aG9zZQorCQkJCQkgKiBzY2F0dGVyZWQgYnVmZmVycyBpbnRvIG9uZSBzaW5nbGUKKwkJCQkJICogYnVmZmVyLgorCQkJCQkgKiBKdXN0IGRpc2NhcmQgaXQgbm93LgorCQkJCQkgKi8KKwkJCQkJY2hhaW5fbXNkdXMoaHR0X3BkZXYsCisJCQkJCQkgICAgaGVhZF9tc2R1LAorCQkJCQkJICAgIHRhaWxfbXNkdSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJvY2Vzc19yZW9yZGVyKHBkZXYsIHJ4X21wZHVfZGVzYywKKwkJCQkJCQl0aWQsIHBlZXIsCisJCQkJCQkJaGVhZF9tc2R1LCB0YWlsX21zZHUsCisJCQkJCQkJbnVtX21wZHVfcmFuZ2VzLAorCQkJCQkJCW51bV9tcGR1cywKKwkJCQkJCQlyeF9pbmRfcmVsZWFzZSk7CisJCQkJfQorCisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBpbnZhbGlkIGZyYW1lcyAtIGRpc2NhcmQgdGhlbSAqLworCQkJT0xfUlhfUkVPUkRFUl9UUkFDRV9BREQocGRldiwgdGlkLAorCQkJCQkJVFhSWF9TRVFfTlVNX0VSUihzdGF0dXMpLAorCQkJCQkJVFhSWF9TRVFfTlVNX0VSUihzdGF0dXMpLAorCQkJCQkJbnVtX21wZHVzKTsKKwkJCVRYUlhfU1RBVFNfQUREKHBkZXYsIHByaXYucnguZXJyLm1wZHVfYmFkLCBudW1fbXBkdXMpOworCQkJZm9yIChpID0gMDsgaSA8IG51bV9tcGR1czsgaSsrKSB7CisJCQkJLyogcHVsbCB0aGUgTVBEVSdzIE1TRFVzIG9mZiB0aGUgYnVmZmVyIHF1ZXVlICovCisJCQkJaHR0X3J4X2Ftc2R1X3BvcChodHRfcGRldiwgcnhfaW5kX21zZywgJm1zZHUsCisJCQkJCQkgJnRhaWxfbXNkdSk7CisjaWZkZWYgSFRUX1JYX1JFU1RPUkUKKwkJCQlpZiAoaHR0X3BkZXYtPnJ4X3JpbmcucnhfcmVzZXQpIHsKKwkJCQkJb2xfcnhfdHJpZ2dlcl9yZXN0b3JlKGh0dF9wZGV2LCBtc2R1LAorCQkJCQkJCSAgICAgIHRhaWxfbXNkdSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisjZW5kaWYKKwkJCQkvKiBwdWxsIHRoZSBNUERVIGRlc2Mgb2ZmIHRoZSBkZXNjIHF1ZXVlICovCisJCQkJcnhfbXBkdV9kZXNjID0KKwkJCQkJaHR0X3J4X21wZHVfZGVzY19saXN0X25leHQoaHR0X3BkZXYsCisJCQkJCQkJCSAgIHJ4X2luZF9tc2cpOworCQkJCU9MX1JYX0VSUl9TVEFUSVNUSUNTXzIocGRldiwgdmRldiwgcGVlciwKKwkJCQkJCSAgICAgICByeF9tcGR1X2Rlc2MsIG1zZHUsCisJCQkJCQkgICAgICAgc3RhdHVzKTsKKworCQkJCWlmIChzdGF0dXMgPT0gaHR0X3J4X3N0YXR1c190a2lwX21pY19lcnIgJiYKKwkJCQkgICAgdmRldiAhPSBOVUxMICYmIHBlZXIgIT0gTlVMTCkgeworCQkJCQl1bmlvbiBodHRfcnhfcG5fdCBwbjsKKwkJCQkJdWludDhfdCBrZXlfaWQ7CisJCQkJCWh0dF9yeF9tcGR1X2Rlc2NfcG4oCisJCQkJCQlwZGV2LT5odHRfcGRldiwKKwkJCQkJCWh0dF9yeF9tc2R1X2Rlc2NfcmV0cmlldmUoCisJCQkJCQkJcGRldi0+aHR0X3BkZXYsCisJCQkJCQkJbXNkdSksICZwbiwgNDgpOworCQkJCQlpZiAoaHR0X3J4X21zZHVfZGVzY19rZXlfaWQoCisJCQkJCQkgICAgcGRldi0+aHR0X3BkZXYsCisJCQkJCQkgICAgaHR0X3J4X21zZHVfZGVzY19yZXRyaWV2ZSgKKwkJCQkJCQkgICAgcGRldi0+aHR0X3BkZXYsCisJCQkJCQkJICAgIG1zZHUpLAorCQkJCQkJICAgICZrZXlfaWQpID09IHRydWUpIHsKKwkJCQkJCW9sX3J4X2VycihwZGV2LT5jdHJsX3BkZXYsCisJCQkJCQkJICB2ZGV2LT52ZGV2X2lkLAorCQkJCQkJCSAgcGVlci0+bWFjX2FkZHIucmF3LAorCQkJCQkJCSAgdGlkLCAwLAorCQkJCQkJCSAgT0xfUlhfRVJSX1RLSVBfTUlDLAorCQkJCQkJCSAgbXNkdSwgJnBuLnBuNDgsCisJCQkJCQkJICBrZXlfaWQpOworCQkJCQl9CisJCQkJfQorI2lmZGVmIFdESV9FVkVOVF9FTkFCTEUKKwkJCQlpZiAoc3RhdHVzICE9IGh0dF9yeF9zdGF0dXNfY3RybF9tZ210X251bGwpIHsKKwkJCQkJLyogUGt0bG9nICovCisJCQkJCXdkaV9ldmVudF9oYW5kbGVyKAorCQkJCQkJV0RJX0VWRU5UX1JYX0RFU0NfUkVNT1RFLCBwZGV2LAorCQkJCQkJbXNkdSk7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKHN0YXR1cyA9PSBodHRfcnhfc3RhdHVzX2Vycl9pbnZfcGVlcikgeworCQkJCQkvKiBvbmNlIHBlciBtcGR1ICovCisJCQkJCW9sX3J4X3Byb2Nlc3NfaW52X3BlZXIocGRldiwKKwkJCQkJCQkgICAgICAgcnhfbXBkdV9kZXNjLAorCQkJCQkJCSAgICAgICBtc2R1KTsKKwkJCQl9CisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJLyogRnJlZSB0aGUgbmJ1ZiAqLworCQkJCQljZGZfbmJ1Zl90IG5leHQ7CisJCQkJCW5leHQgPSBjZGZfbmJ1Zl9uZXh0KG1zZHUpOworCQkJCQlodHRfcnhfZGVzY19mcmFtZV9mcmVlKGh0dF9wZGV2LCBtc2R1KTsKKwkJCQkJaWYgKG1zZHUgPT0gdGFpbF9tc2R1KQorCQkJCQkJYnJlYWs7CisJCQkJCW1zZHUgPSBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIE5vdyB0aGF0IGEgd2hvbGUgYmF0Y2ggb2YgTVNEVXMgaGF2ZSBiZWVuIHB1bGxlZCBvdXQgb2YgSFRUCisJICogYW5kIHB1dCBpbnRvIHRoZSByeCByZW9yZGVyIGFycmF5LCBpdCBpcyBhbiBhcHByb3ByaWF0ZSB0aW1lCisJICogdG8gcmVxdWVzdCBIVFQgdG8gcHJvdmlkZSBuZXcgcnggTVNEVSBidWZmZXJzIGZvciB0aGUgdGFyZ2V0CisJICogdG8gZmlsbC4KKwkgKiBUaGlzIGNvdWxkIGJlIGRvbmUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLCBidXQgaXQncworCSAqIGJldHRlciB0byBkbyBpdCBub3csIHJhdGhlciB0aGFuIHdhaXRpbmcgdW50aWwgYWZ0ZXIgdGhlIGRyaXZlcgorCSAqIGFuZCBPUyBmaW5pc2ggcHJvY2Vzc2luZyB0aGUgYmF0Y2ggb2YgcnggTVNEVXMuCisJICovCisJaHR0X3J4X21zZHVfYnVmZl9yZXBsZW5pc2goaHR0X3BkZXYpOworCisJaWYgKCh0cnVlID09IHJ4X2luZF9yZWxlYXNlKSAmJiBwZWVyICYmIHZkZXYpIHsKKwkJb2xfcnhfcmVvcmRlcl9yZWxlYXNlKHZkZXYsIHBlZXIsIHRpZCwgc2VxX251bV9zdGFydCwKKwkJCQkgICAgICBzZXFfbnVtX2VuZCk7CisJfQorCU9MX1JYX1JFT1JERVJfVElNRU9VVF9VUERBVEUocGVlciwgdGlkKTsKKwlPTF9SWF9SRU9SREVSX1RJTUVPVVRfTVVURVhfVU5MT0NLKHBkZXYpOworCisJaWYgKHBkZXYtPnJ4LmZsYWdzLmRlZnJhZ190aW1lb3V0X2NoZWNrKQorCQlvbF9yeF9kZWZyYWdfd2FpdGxpc3RfZmx1c2gocGRldik7Cit9CisKK3ZvaWQKK29sX3J4X3NlY19pbmRfaGFuZGxlcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgICAgIHVpbnQxNl90IHBlZXJfaWQsCisJCSAgICAgIGVudW0gaHR0X3NlY190eXBlIHNlY190eXBlLAorCQkgICAgICBpbnQgaXNfdW5pY2FzdCwgdWludDMyX3QgKm1pY2hhZWxfa2V5LCB1aW50MzJfdCAqcnhfcG4pCit7CisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyOworCWludCBzZWNfaW5kZXgsIGk7CisKKwlwZWVyID0gb2xfdHhyeF9wZWVyX2ZpbmRfYnlfaWQocGRldiwgcGVlcl9pZCk7CisJaWYgKCFwZWVyKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkgICAiQ291bGRuJ3QgZmluZCBwZWVyIGZyb20gSUQgJWQgLSBza2lwcGluZyBzZWN1cml0eSBpbml0c1xuIiwKKwkJCSAgIHBlZXJfaWQpOworCQlyZXR1cm47CisJfQorCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMSwKKwkJICAgInNlYyBzcGVjIGZvciBwZWVyICVwICglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCk6ICIKKwkJICAgIiVzIGtleSBvZiB0eXBlICVkXG4iLAorCQkgICBwZWVyLAorCQkgICBwZWVyLT5tYWNfYWRkci5yYXdbMF0sIHBlZXItPm1hY19hZGRyLnJhd1sxXSwKKwkJICAgcGVlci0+bWFjX2FkZHIucmF3WzJdLCBwZWVyLT5tYWNfYWRkci5yYXdbM10sCisJCSAgIHBlZXItPm1hY19hZGRyLnJhd1s0XSwgcGVlci0+bWFjX2FkZHIucmF3WzVdLAorCQkgICBpc191bmljYXN0ID8gInVjYXN0IiA6ICJtY2FzdCIsIHNlY190eXBlKTsKKwlzZWNfaW5kZXggPSBpc191bmljYXN0ID8gdHhyeF9zZWNfdWNhc3QgOiB0eHJ4X3NlY19tY2FzdDsKKwlwZWVyLT5zZWN1cml0eVtzZWNfaW5kZXhdLnNlY190eXBlID0gc2VjX3R5cGU7CisJLyogbWljaGFlbCBrZXkgb25seSB2YWxpZCBmb3IgVEtJUAorCSAgIGJ1dCBmb3Igc2ltcGxpY2l0eSwgY29weSBpdCBhbnl3YXkgKi8KKwljZGZfbWVtX2NvcHkoJnBlZXItPnNlY3VyaXR5W3NlY19pbmRleF0ubWljaGFlbF9rZXlbMF0sCisJCSAgICAgbWljaGFlbF9rZXksCisJCSAgICAgc2l6ZW9mKHBlZXItPnNlY3VyaXR5W3NlY19pbmRleF0ubWljaGFlbF9rZXkpKTsKKworCWlmIChzZWNfdHlwZSAhPSBodHRfc2VjX3R5cGVfd2FwaSkgeworCQljZGZfbWVtX3NldChwZWVyLT50aWRzX2xhc3RfcG5fdmFsaWQsCisJCQkgICAgT0xfVFhSWF9OVU1fRVhUX1RJRFMsIDB4MDApOworCX0gZWxzZSBpZiAoc2VjX2luZGV4ID09IHR4cnhfc2VjX21jYXN0IHx8IHBlZXItPnRpZHNfbGFzdF9wbl92YWxpZFswXSkgeworCQlmb3IgKGkgPSAwOyBpIDwgT0xfVFhSWF9OVU1fRVhUX1RJRFM7IGkrKykgeworCQkJLyoKKwkJCSAqIFNldHRpbmcgUE4gdmFsaWQgYml0IGZvciBXQVBJIHNlY190eXBlLAorCQkJICogc2luY2UgV0FQSSBQTiBoYXMgdG8gYmUgc3RhcnRlZCB3aXRoIHByZWRlZmluZWQgdmFsdWUKKwkJCSAqLworCQkJcGVlci0+dGlkc19sYXN0X3BuX3ZhbGlkW2ldID0gMTsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcGVlci0+dGlkc19sYXN0X3BuW2ldLAorCQkJCSAgICAgKHVpbnQ4X3QgKikgcnhfcG4sCisJCQkJICAgICBzaXplb2YodW5pb24gaHR0X3J4X3BuX3QpKTsKKwkJCXBlZXItPnRpZHNfbGFzdF9wbltpXS5wbjEyOFsxXSA9CisJCQkJY2RmX29zX2NwdV90b19sZTY0KAorCQkJCQlwZWVyLT50aWRzX2xhc3RfcG5baV0ucG4xMjhbMV0pOworCQkJcGVlci0+dGlkc19sYXN0X3BuW2ldLnBuMTI4WzBdID0KKwkJCQljZGZfb3NfY3B1X3RvX2xlNjQoCisJCQkJCXBlZXItPnRpZHNfbGFzdF9wbltpXS5wbjEyOFswXSk7CisJCX0KKwl9Cit9CisKKyNpZiBkZWZpbmVkKFBFUkVfSVBfSERSX0FMSUdOTUVOVF9XQVIpCisKKyNpbmNsdWRlIDxjZHNfaWVlZTgwMjExX2NvbW1vbi5oPgorCitzdGF0aWMgdm9pZCB0cmFuc2NhcF9ud2lmaV90b184MDIzKGNkZl9uYnVmX3QgbXNkdSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aDsKKwl1aW50MzJfdCBoZHJzaXplOworCXN0cnVjdCBsbGMgKmxsY2hkcjsKKwlzdHJ1Y3QgZXRoZXJfaGVhZGVyICpldGhfaGRyOworCXVpbnQxNl90IGV0aGVyX3R5cGUgPSAwOworCXVpbnQ4X3QgYTFbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGEyW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBhM1tJRUVFODAyMTFfQUREUl9MRU5dOworCXVpbnQ4X3QgZmMxOworCisJd2ggPSAoc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKWNkZl9uYnVmX2RhdGEobXNkdSk7CisJY2RmX21lbV9jb3B5KGExLCB3aC0+aV9hZGRyMSwgSUVFRTgwMjExX0FERFJfTEVOKTsKKwljZGZfbWVtX2NvcHkoYTIsIHdoLT5pX2FkZHIyLCBJRUVFODAyMTFfQUREUl9MRU4pOworCWNkZl9tZW1fY29weShhMywgd2gtPmlfYWRkcjMsIElFRUU4MDIxMV9BRERSX0xFTik7CisJZmMxID0gd2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX0RJUl9NQVNLOworCS8qIE5hdGl2ZSBXaWZpIGhlYWRlciBpcyA4MDIxMSBub24tUW9TIGhlYWRlciAqLworCWhkcnNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9mcmFtZSk7CisKKwlsbGNoZHIgPSAoc3RydWN0IGxsYyAqKSgoKHVpbnQ4X3QgKikgY2RmX25idWZfZGF0YShtc2R1KSkgKyBoZHJzaXplKTsKKwlldGhlcl90eXBlID0gbGxjaGRyLT5sbGNfdW4udHlwZV9zbmFwLmV0aGVyX3R5cGU7CisKKwkvKgorCSAqIE5vdyBtb3ZlIHRoZSBkYXRhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFjIGhlYWRlciA6CisJICogbmV3LWhlYWRlciA9IG9sZC1oZHIgKyAod2lmaGRyc2l6ZSArIGxsY2hkcnNpemUgLSBldGhoZHJzaXplKQorCSAqLworCWNkZl9uYnVmX3B1bGxfaGVhZChtc2R1LAorCQkJICAgKGhkcnNpemUgKyBzaXplb2Yoc3RydWN0IGxsYykgLQorCQkJICAgIHNpemVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKSkpOworCWV0aF9oZHIgPSAoc3RydWN0IGV0aGVyX2hlYWRlciAqKShjZGZfbmJ1Zl9kYXRhKG1zZHUpKTsKKwlzd2l0Y2ggKGZjMSkgeworCWNhc2UgSUVFRTgwMjExX0ZDMV9ESVJfTk9EUzoKKwkJY2RmX21lbV9jb3B5KGV0aF9oZHItPmV0aGVyX2Rob3N0LCBhMSwgSUVFRTgwMjExX0FERFJfTEVOKTsKKwkJY2RmX21lbV9jb3B5KGV0aF9oZHItPmV0aGVyX3Nob3N0LCBhMiwgSUVFRTgwMjExX0FERFJfTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkMxX0RJUl9UT0RTOgorCQljZGZfbWVtX2NvcHkoZXRoX2hkci0+ZXRoZXJfZGhvc3QsIGEzLCBJRUVFODAyMTFfQUREUl9MRU4pOworCQljZGZfbWVtX2NvcHkoZXRoX2hkci0+ZXRoZXJfc2hvc3QsIGEyLCBJRUVFODAyMTFfQUREUl9MRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQzFfRElSX0ZST01EUzoKKwkJY2RmX21lbV9jb3B5KGV0aF9oZHItPmV0aGVyX2Rob3N0LCBhMSwgSUVFRTgwMjExX0FERFJfTEVOKTsKKwkJY2RmX21lbV9jb3B5KGV0aF9oZHItPmV0aGVyX3Nob3N0LCBhMywgSUVFRTgwMjExX0FERFJfTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkMxX0RJUl9EU1RPRFM6CisJCWJyZWFrOworCX0KKwlldGhfaGRyLT5ldGhlcl90eXBlID0gZXRoZXJfdHlwZTsKK30KKyNlbmRpZgorCit2b2lkIG9sX3J4X25vdGlmeShvbF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgIHVpbnQ4X3QgdmRldl9pZCwKKwkJICB1aW50OF90ICpwZWVyX21hY19hZGRyLAorCQkgIGludCB0aWQsCisJCSAgdWludDMyX3QgdHNmMzIsCisJCSAgZW51bSBvbF9yeF9ub3RpZnlfdHlwZSBub3RpZnlfdHlwZSwgY2RmX25idWZfdCByeF9mcmFtZSkKK3sKKwkvKgorCSAqIE5PVEU6IFRoaXMgaXMgdXNlZCBpbiBxY2FfbWFpbiBmb3IgQVAgbW9kZSB0byBoYW5kbGUgSUdNUAorCSAqIHBhY2tldHMgc3BlY2lhbGx5LiBVbWFjIGhhcyBhIGNvcnJlc3BvbmRpbmcgaGFuZGxlciBmb3IgdGhpcworCSAqIG5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gaGF2ZSB0aGlzIGZvciBDTEQgYXMgd2VsbC4KKwkgKi8KK30KKworLyoqCisgKiBAYnJpZWYgTG9vayBpbnRvIGEgcnggTVNEVSB0byBzZWUgd2hhdCBraW5kIG9mIHNwZWNpYWwgaGFuZGxpbmcgaXQgcmVxdWlyZXMKKyAqIEBkZXRhaWxzCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGhvc3QgcnggU1cgc2VlcyB0aGF0IHRoZSB0YXJnZXQKKyAqICAgICAgcnggRlcgaGFzIG1hcmtlZCBhIHJ4IE1TRFUgYXMgbmVlZGluZyBpbnNwZWN0aW9uLgorICogICAgICBCYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGUgaW5zcGVjdGlvbiwgdGhlIGhvc3QgcnggU1cgd2lsbCBpbmZlcgorICogICAgICB3aGF0IHNwZWNpYWwgaGFuZGxpbmcgdG8gcGVyZm9ybSBvbiB0aGUgcnggZnJhbWUuCisgKiAgICAgIEN1cnJlbnRseSwgdGhlIG9ubHkgdHlwZSBvZiBmcmFtZXMgdGhhdCByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcKKyAqICAgICAgYXJlIElHTVAgZnJhbWVzLiAgVGhlIHJ4IGRhdGEtcGF0aCBTVyBjaGVja3MgaWYgdGhlIGZyYW1lIGlzIElHTVAKKyAqICAgICAgKGl0IHNob3VsZCBiZSwgc2luY2UgdGhlIHRhcmdldCB3b3VsZCBub3QgaGF2ZSBzZXQgdGhlIGluc3BlY3QgZmxhZworICogICAgICBvdGhlcndpc2UpLCBhbmQgdGhlbiBjYWxscyB0aGUgb2xfcnhfbm90aWZ5IGZ1bmN0aW9uIHNvIHRoZQorICogICAgICBjb250cm9sLXBhdGggU1cgY2FuIHBlcmZvcm0gbXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAgbGVhcm5pbmcKKyAqICAgICAgYnkgc25pZmZpbmcgdGhlIElHTVAgZnJhbWUuCisgKi8KKyNkZWZpbmUgU0laRU9GXzgwMjExX0hEUiAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUpKQordm9pZAorb2xfcnhfaW5zcGVjdChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJICAgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCSAgICAgIHVuc2lnbmVkIHRpZCwgY2RmX25idWZfdCBtc2R1LCB2b2lkICpyeF9kZXNjKQoreworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiA9IHZkZXYtPnBkZXY7CisJdWludDhfdCAqZGF0YSwgKmwzX2hkcjsKKwl1aW50MTZfdCBldGhlcnR5cGU7CisJaW50IG9mZnNldDsKKworCWRhdGEgPSBjZGZfbmJ1Zl9kYXRhKG1zZHUpOworCWlmIChwZGV2LT5mcmFtZV9mb3JtYXQgPT0gd2xhbl9mcm1fZm10X25hdGl2ZV93aWZpKSB7CisJCW9mZnNldCA9IFNJWkVPRl84MDIxMV9IRFIgKyBMTENfU05BUF9IRFJfT0ZGU0VUX0VUSEVSVFlQRTsKKwkJbDNfaGRyID0gZGF0YSArIFNJWkVPRl84MDIxMV9IRFIgKyBMTENfU05BUF9IRFJfTEVOOworCX0gZWxzZSB7CisJCW9mZnNldCA9IEVUSEVSTkVUX0FERFJfTEVOICogMjsKKwkJbDNfaGRyID0gZGF0YSArIEVUSEVSTkVUX0hEUl9MRU47CisJfQorCWV0aGVydHlwZSA9IChkYXRhW29mZnNldF0gPDwgOCkgfCBkYXRhW29mZnNldCArIDFdOworCWlmIChldGhlcnR5cGUgPT0gRVRIRVJUWVBFX0lQVjQpIHsKKwkJb2Zmc2V0ID0gSVBWNF9IRFJfT0ZGU0VUX1BST1RPQ09MOworCQlpZiAobDNfaGRyW29mZnNldF0gPT0gSVBfUFJPVE9DT0xfSUdNUCkgeworCQkJb2xfcnhfbm90aWZ5KHBkZXYtPmN0cmxfcGRldiwKKwkJCQkgICAgIHZkZXYtPnZkZXZfaWQsCisJCQkJICAgICBwZWVyLT5tYWNfYWRkci5yYXcsCisJCQkJICAgICB0aWQsCisJCQkJICAgICBodHRfcnhfbXBkdV9kZXNjX3RzZjMyKHBkZXYtPmh0dF9wZGV2LAorCQkJCQkJCSAgICByeF9kZXNjKSwKKwkJCQkgICAgIE9MX1JYX05PVElGWV9JUFY0X0lHTVAsIG1zZHUpOworCQl9CisJfQorfQorCit2b2lkCitvbF9yeF9vZmZsb2FkX2RlbGl2ZXJfaW5kX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSAgY2RmX25idWZfdCBtc2csIGludCBtc2R1X2NudCkKK3sKKwlpbnQgdmRldl9pZCwgcGVlcl9pZCwgdGlkOworCWNkZl9uYnVmX3QgaGVhZF9idWYsIHRhaWxfYnVmLCBidWY7CisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyOworCXVpbnQ4X3QgZndfZGVzYzsKKwlodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYgPSBwZGV2LT5odHRfcGRldjsKKworCXdoaWxlIChtc2R1X2NudCkgeworCQlodHRfcnhfb2ZmbG9hZF9tc2R1X3BvcChodHRfcGRldiwgbXNnLCAmdmRldl9pZCwgJnBlZXJfaWQsCisJCQkJCSZ0aWQsICZmd19kZXNjLCAmaGVhZF9idWYsICZ0YWlsX2J1Zik7CisKKwkJcGVlciA9IG9sX3R4cnhfcGVlcl9maW5kX2J5X2lkKHBkZXYsIHBlZXJfaWQpOworCQlpZiAocGVlcikgeworCQkJb2xfcnhfZGF0YV9wcm9jZXNzKHBlZXIsIGhlYWRfYnVmKTsKKwkJfSBlbHNlIHsKKwkJCWJ1ZiA9IGhlYWRfYnVmOworCQkJd2hpbGUgKDEpIHsKKwkJCQljZGZfbmJ1Zl90IG5leHQ7CisJCQkJbmV4dCA9IGNkZl9uYnVmX25leHQoYnVmKTsKKwkJCQlodHRfcnhfZGVzY19mcmFtZV9mcmVlKGh0dF9wZGV2LCBidWYpOworCQkJCWlmIChidWYgPT0gdGFpbF9idWYpCisJCQkJCWJyZWFrOworCQkJCWJ1ZiA9IG5leHQ7CisJCQl9CisJCX0KKwkJbXNkdV9jbnQtLTsKKwl9CisJaHR0X3J4X21zZHVfYnVmZl9yZXBsZW5pc2goaHR0X3BkZXYpOworfQorCit2b2lkCitvbF9yeF9taWNfZXJyb3JfaGFuZGxlcigKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJdV9pbnQ4X3QgdGlkLAorCXVfaW50MTZfdCBwZWVyX2lkLAorCXZvaWQgKm1zZHVfZGVzYywKKwljZGZfbmJ1Zl90IG1zZHUpCit7CisJdW5pb24gaHR0X3J4X3BuX3QgcG4gPSB7MH07CisJdV9pbnQ4X3Qga2V5X2lkID0gMDsKKworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciA9IE5VTEw7CisJc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2ID0gTlVMTDsKKworCWlmIChwZGV2KSB7CisJCXBlZXIgPSBvbF90eHJ4X3BlZXJfZmluZF9ieV9pZChwZGV2LCBwZWVyX2lkKTsKKwkJaWYgKHBlZXIpIHsKKwkJCXZkZXYgPSBwZWVyLT52ZGV2OworCQkJaWYgKHZkZXYpIHsKKwkJCQlodHRfcnhfbXBkdV9kZXNjX3BuKHZkZXYtPnBkZXYtPmh0dF9wZGV2LAorCQkJCQkJICAgIG1zZHVfZGVzYywgJnBuLCA0OCk7CisKKwkJCQlpZiAoaHR0X3J4X21zZHVfZGVzY19rZXlfaWQoCisJCQkJCXZkZXYtPnBkZXYtPmh0dF9wZGV2LCBtc2R1X2Rlc2MsCisJCQkJCSZrZXlfaWQpID09IHRydWUpIHsKKwkJCQkJb2xfcnhfZXJyKHZkZXYtPnBkZXYtPmN0cmxfcGRldiwKKwkJCQkJCSAgdmRldi0+dmRldl9pZCwKKwkJCQkJCSAgcGVlci0+bWFjX2FkZHIucmF3LCB0aWQsIDAsCisJCQkJCQkgIE9MX1JYX0VSUl9US0lQX01JQywgbXNkdSwKKwkJCQkJCSAgJnBuLnBuNDgsIGtleV9pZCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqIEBicmllZiBDaGVjayB0aGUgZmlyc3QgbXNkdSB0byBkZWNpZGUgd2hldGhlciB0aGUgYS1tc2R1IHNob3VsZCBiZSBhY2NlcHRlZC4KKyAqLworYm9vbAorb2xfcnhfZmlsdGVyKHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwKKwkgICAgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwgY2RmX25idWZfdCBtc2R1LCB2b2lkICpyeF9kZXNjKQoreworI2RlZmluZSBGSUxURVJfU1RBVFVTX1JFSkVDVCAxCisjZGVmaW5lIEZJTFRFUl9TVEFUVVNfQUNDRVBUIDAKKwl1aW50OF90ICp3aDsKKwl1aW50MzJfdCBvZmZzZXQgPSAwOworCXVpbnQxNl90IGV0aGVyX3R5cGUgPSAwOworCWJvb2wgaXNfZW5jcnlwdGVkID0gZmFsc2UsIGlzX21jYXN0ID0gZmFsc2U7CisJdWludDhfdCBpOworCWVudW0gcHJpdmFjeV9maWx0ZXJfcGFja2V0X3R5cGUgcGFja2V0X3R5cGUgPQorCQlQUklWQUNZX0ZJTFRFUl9QQUNLRVRfVU5JQ0FTVDsKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYgPSB2ZGV2LT5wZGV2OworCWh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiA9IHBkZXYtPmh0dF9wZGV2OworCWludCBzZWNfaWR4OworCisJLyoKKwkgKiBTYWZlbW9kZSBtdXN0IGF2b2lkIHRoZSBQcml2YWN5RXhlbXB0aW9uTGlzdCBhbmQKKwkgKiBFeGNsdWRlVW5lbmNyeXB0ZWQgY2hlY2tpbmcKKwkgKi8KKwlpZiAodmRldi0+c2FmZW1vZGUpCisJCXJldHVybiBGSUxURVJfU1RBVFVTX0FDQ0VQVDsKKworCWlzX21jYXN0ID0gaHR0X3J4X21zZHVfaXNfd2xhbl9tY2FzdChodHRfcGRldiwgcnhfZGVzYyk7CisJaWYgKHZkZXYtPm51bV9maWx0ZXJzID4gMCkgeworCQlpZiAocGRldi0+ZnJhbWVfZm9ybWF0ID09IHdsYW5fZnJtX2ZtdF9uYXRpdmVfd2lmaSkgeworCQkJb2Zmc2V0ID0gU0laRU9GXzgwMjExX0hEUiArCisJCQkJTExDX1NOQVBfSERSX09GRlNFVF9FVEhFUlRZUEU7CisJCX0gZWxzZSB7CisJCQlvZmZzZXQgPSBFVEhFUk5FVF9BRERSX0xFTiAqIDI7CisJCX0KKwkJLyogZ2V0IGhlYWRlciBpbmZvIGZyb20gbXNkdSAqLworCQl3aCA9IGNkZl9uYnVmX2RhdGEobXNkdSk7CisKKwkJLyogZ2V0IGV0aGVyIHR5cGUgKi8KKwkJZXRoZXJfdHlwZSA9ICh3aFtvZmZzZXRdIDw8IDgpIHwgd2hbb2Zmc2V0ICsgMV07CisJCS8qIGdldCBwYWNrZXQgdHlwZSAqLworCQlpZiAodHJ1ZSA9PSBpc19tY2FzdCkKKwkJCXBhY2tldF90eXBlID0gUFJJVkFDWV9GSUxURVJfUEFDS0VUX01VTFRJQ0FTVDsKKwkJZWxzZQorCQkJcGFja2V0X3R5cGUgPSBQUklWQUNZX0ZJTFRFUl9QQUNLRVRfVU5JQ0FTVDsKKwl9CisJLyogZ2V0IGVuY3J5cHQgaW5mbyAqLworCWlzX2VuY3J5cHRlZCA9IGh0dF9yeF9tcGR1X2lzX2VuY3J5cHRlZChodHRfcGRldiwgcnhfZGVzYyk7CisjaWZkZWYgQVRIX1NVUFBPUlRfV0FQSQorCWlmICgodHJ1ZSA9PSBpc19lbmNyeXB0ZWQpICYmIChFVEhFUlRZUEVfV0FJID09IGV0aGVyX3R5cGUpKSB7CisJCS8qIFdlIGV4cGVjdCB0aGUgV0FJIGZyYW1lcyB0byBiZSBhbHdheXMgdW5lbmNyeXB0ZWQgd2hlbgorCQkgICB0aGUgVU1BQyBnZXRzIGl0LiovCisJCXJldHVybiBGSUxURVJfU1RBVFVTX1JFSkVDVDsKKwl9CisjZW5kaWYgLyogQVRIX1NVUFBPUlRfV0FQSSAqLworCisJZm9yIChpID0gMDsgaSA8IHZkZXYtPm51bV9maWx0ZXJzOyBpKyspIHsKKwkJZW51bSBwcml2YWN5X2ZpbHRlciBmaWx0ZXJfdHlwZTsKKwkJZW51bSBwcml2YWN5X2ZpbHRlcl9wYWNrZXRfdHlwZSBmaWx0ZXJfcGFja2V0X3R5cGU7CisKKwkJLyogc2tpcCBpZiB0aGUgZXRoZXIgdHlwZSBkb2VzIG5vdCBtYXRjaCAqLworCQlpZiAodmRldi0+cHJpdmFjeV9maWx0ZXJzW2ldLmV0aGVyX3R5cGUgIT0gZXRoZXJfdHlwZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHNraXAgaWYgdGhlIHBhY2tldCB0eXBlIGRvZXMgbm90IG1hdGNoICovCisJCWZpbHRlcl9wYWNrZXRfdHlwZSA9IHZkZXYtPnByaXZhY3lfZmlsdGVyc1tpXS5wYWNrZXRfdHlwZTsKKwkJaWYgKGZpbHRlcl9wYWNrZXRfdHlwZSAhPSBwYWNrZXRfdHlwZSAmJgorCQkgICAgZmlsdGVyX3BhY2tldF90eXBlICE9IFBSSVZBQ1lfRklMVEVSX1BBQ0tFVF9CT1RIKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZpbHRlcl90eXBlID0gdmRldi0+cHJpdmFjeV9maWx0ZXJzW2ldLmZpbHRlcl90eXBlOworCQlpZiAoZmlsdGVyX3R5cGUgPT0gUFJJVkFDWV9GSUxURVJfQUxXQVlTKSB7CisJCQkvKgorCQkJICogSW4gdGhpcyBjYXNlLCB3ZSBhY2NlcHQgdGhlIGZyYW1lIGlmIGFuZCBvbmx5IGlmCisJCQkgKiBpdCB3YXMgb3JpZ2luYWxseSBOT1QgZW5jcnlwdGVkLgorCQkJICovCisJCQlpZiAodHJ1ZSA9PSBpc19lbmNyeXB0ZWQpCisJCQkJcmV0dXJuIEZJTFRFUl9TVEFUVVNfUkVKRUNUOworCQkJZWxzZQorCQkJCXJldHVybiBGSUxURVJfU1RBVFVTX0FDQ0VQVDsKKworCQl9IGVsc2UgaWYgKGZpbHRlcl90eXBlID09IFBSSVZBQ1lfRklMVEVSX0tFWV9VTkFWQUlMQUJMRSkgeworCQkJLyoKKwkJCSAqIEluIHRoaXMgY2FzZSwgd2UgcmVqZWN0IHRoZSBmcmFtZSBpZiBpdCB3YXMKKwkJCSAqIG9yaWdpbmFsbHkgTk9UIGVuY3J5cHRlZCBidXQgd2UgaGF2ZSB0aGUga2V5IG1hcHBpbmcKKwkJCSAqIGtleSBmb3IgdGhpcyBmcmFtZS4KKwkJCSAqLworCQkJaWYgKCFpc19lbmNyeXB0ZWQgJiYKKwkJCSAgICAhaXNfbWNhc3QgJiYKKwkJCSAgICAocGVlci0+c2VjdXJpdHlbdHhyeF9zZWNfdWNhc3RdLnNlY190eXBlICE9CisJCQkgICAgIGh0dF9zZWNfdHlwZV9ub25lKSAmJgorCQkJICAgIChwZWVyLT5rZXlpbnN0YWxsZWQgfHwgIUVUSEVSVFlQRV9JU19FQVBPTF9XQVBJKAorCQkJCSAgICBldGhlcl90eXBlKSkpIHsKKwkJCQlyZXR1cm4gRklMVEVSX1NUQVRVU19SRUpFQ1Q7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBGSUxURVJfU1RBVFVTX0FDQ0VQVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGUgcHJpdmFjeSBleGVtcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gdGhpcyBmcmFtZS4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoZSBwcml2YWN5IGV4ZW1wdGlvbiBsaXN0IGRvZXMgbm90IGFwcGx5IHRvIHRoZSBmcmFtZSwKKwkgKiBjaGVjayBFeGNsdWRlVW5lbmNyeXB0ZWQuCisJICogSWYgRXhjbHVkZVVuZW5jcnlwdGVkIGlzIG5vdCBzZXQsIG9yIGlmIHRoaXMgd2FzIG9yaW5naWFsbHkKKwkgKiBhbiBlbmNyeXB0ZWQgZnJhbWUsIGl0IHdpbGwgYmUgYWNjZXB0ZWQuCisJICovCisJaWYgKCF2ZGV2LT5kcm9wX3VuZW5jIHx8ICh0cnVlID09IGlzX2VuY3J5cHRlZCkpCisJCXJldHVybiBGSUxURVJfU1RBVFVTX0FDQ0VQVDsKKworCS8qCisJICogIElmIHRoaXMgaXMgYSBvcGVuIGNvbm5lY3Rpb24sIGl0IHdpbGwgYmUgYWNjZXB0ZWQuCisJICovCisJc2VjX2lkeCA9ICh0cnVlID09IGlzX21jYXN0KSA/IHR4cnhfc2VjX21jYXN0IDogdHhyeF9zZWNfdWNhc3Q7CisJaWYgKHBlZXItPnNlY3VyaXR5W3NlY19pZHhdLnNlY190eXBlID09IGh0dF9zZWNfdHlwZV9ub25lKQorCQlyZXR1cm4gRklMVEVSX1NUQVRVU19BQ0NFUFQ7CisKKwlpZiAoKGZhbHNlID09IGlzX2VuY3J5cHRlZCkgJiYgdmRldi0+ZHJvcF91bmVuYykgeworCQlPTF9SWF9FUlJfU1RBVElTVElDUyhwZGV2LCB2ZGV2LCBPTF9SWF9FUlJfUFJJVkFDWSwKKwkJCQkgICAgIHBkZXYtPnNlY190eXBlc1todHRfc2VjX3R5cGVfbm9uZV0sCisJCQkJICAgICBpc19tY2FzdCk7CisJfQorCXJldHVybiBGSUxURVJfU1RBVFVTX1JFSkVDVDsKK30KKwordm9pZAorb2xfcnhfZGVsaXZlcihzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJICAgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1bnNpZ25lZCB0aWQsIGNkZl9uYnVmX3QgbXNkdV9saXN0KQoreworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiA9IHZkZXYtPnBkZXY7CisJaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2ID0gcGRldi0+aHR0X3BkZXY7CisJY2RmX25idWZfdCBkZWxpdmVyX2xpc3RfaGVhZCA9IE5VTEw7CisJY2RmX25idWZfdCBkZWxpdmVyX2xpc3RfdGFpbCA9IE5VTEw7CisJY2RmX25idWZfdCBtc2R1OworCWJvb2wgZmlsdGVyID0gZmFsc2U7CisjaWZkZWYgUUNBX1NVUFBPUlRfU1dfVFhSWF9FTkNBUAorCXN0cnVjdCBvbF9yeF9kZWNhcF9pbmZvX3QgaW5mbzsKKwljZGZfbWVtX3NldCgmaW5mbywgc2l6ZW9mKGluZm8pLCAwKTsKKyNlbmRpZgorCisJbXNkdSA9IG1zZHVfbGlzdDsKKwkvKgorCSAqIENoZWNrIGVhY2ggTVNEVSB0byBzZWUgd2hldGhlciBpdCByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLAorCSAqIGFuZCBmcmVlIGVhY2ggTVNEVSdzIHJ4IGRlc2NyaXB0b3IKKwkgKi8KKwl3aGlsZSAobXNkdSkgeworCQl2b2lkICpyeF9kZXNjOworCQlpbnQgZGlzY2FyZCwgaW5zcGVjdCwgZHVtbXlfZndkOworCQljZGZfbmJ1Zl90IG5leHQgPSBjZGZfbmJ1Zl9uZXh0KG1zZHUpOworCisJCXJ4X2Rlc2MgPSBodHRfcnhfbXNkdV9kZXNjX3JldHJpZXZlKHBkZXYtPmh0dF9wZGV2LCBtc2R1KTsKKworI2lmZGVmIFFDQV9TVVBQT1JUX1NXX1RYUlhfRU5DQVAKKwkJaW5mby5pc19tc2R1X2NtcGxfbXBkdSA9CisJCQlodHRfcnhfbXNkdV9kZXNjX2NvbXBsZXRlc19tcGR1KGh0dF9wZGV2LCByeF9kZXNjKTsKKwkJaW5mby5pc19maXJzdF9zdWJmcm0gPQorCQkJaHR0X3J4X21zZHVfZmlyc3RfbXNkdV9mbGFnKGh0dF9wZGV2LCByeF9kZXNjKTsKKwkJaWYgKE9MX1JYX0RFQ0FQKHZkZXYsIHBlZXIsIG1zZHUsICZpbmZvKSAhPSBBX09LKSB7CisJCQlkaXNjYXJkID0gMTsKKwkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9XQVJOLAorCQkJCSAgICJkZWNhcCBlcnJvciAlcCBmcm9tIHBlZXIgJXAgIgorCQkJCSAgICIoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpIGxlbiAlZFxuIiwKKwkJCQkgICBtc2R1LCBwZWVyLAorCQkJCSAgIHBlZXItPm1hY19hZGRyLnJhd1swXSwgcGVlci0+bWFjX2FkZHIucmF3WzFdLAorCQkJCSAgIHBlZXItPm1hY19hZGRyLnJhd1syXSwgcGVlci0+bWFjX2FkZHIucmF3WzNdLAorCQkJCSAgIHBlZXItPm1hY19hZGRyLnJhd1s0XSwgcGVlci0+bWFjX2FkZHIucmF3WzVdLAorCQkJCSAgIGNkZl9uYnVmX2xlbihtc2R1KSk7CisJCQlnb3RvIERPTkU7CisJCX0KKyNlbmRpZgorCQlodHRfcnhfbXNkdV9hY3Rpb25zKHBkZXYtPmh0dF9wZGV2LCByeF9kZXNjLCAmZGlzY2FyZCwKKwkJCQkgICAgJmR1bW15X2Z3ZCwgJmluc3BlY3QpOworCQlpZiAoaW5zcGVjdCkKKwkJCW9sX3J4X2luc3BlY3QodmRldiwgcGVlciwgdGlkLCBtc2R1LCByeF9kZXNjKTsKKworCQkvKgorCQkgKiBDaGVjayB0aGUgZmlyc3QgbXNkdSBpbiB0aGUgbXBkdSwgaWYgaXQgd2lsbCBiZSBmaWx0ZXJlZCBvdXQsCisJCSAqIHRoZW4gZGlzY2FyZCB0aGUgZW50aXJlIG1wZHUuCisJCSAqLworCQlpZiAoaHR0X3J4X21zZHVfZmlyc3RfbXNkdV9mbGFnKGh0dF9wZGV2LCByeF9kZXNjKSkKKwkJCWZpbHRlciA9IG9sX3J4X2ZpbHRlcih2ZGV2LCBwZWVyLCBtc2R1LCByeF9kZXNjKTsKKworI2lmZGVmIFFDQV9TVVBQT1JUX1NXX1RYUlhfRU5DQVAKK0RPTkU6CisjZW5kaWYKKwkJaHR0X3J4X21zZHVfZGVzY19mcmVlKGh0dF9wZGV2LCBtc2R1KTsKKwkJaWYgKGRpc2NhcmQgfHwgKHRydWUgPT0gZmlsdGVyKSkgeworCQkJb2xfdHhyeF9mcm1zX2R1bXAoInJ4IGRpc2NhcmRpbmc6IiwKKwkJCQkJICBwZGV2LCBkZWxpdmVyX2xpc3RfaGVhZCwKKwkJCQkJICBvbF90eHJ4X2ZybV9kdW1wX3RjcF9zZXEgfAorCQkJCQkgIG9sX3R4cnhfZnJtX2R1bXBfY29udGVudHMsCisJCQkJCSAgMCAvKiBkb24ndCBwcmludCBjb250ZW50cyAqLyk7CisJCQljZGZfbmJ1Zl9mcmVlKG1zZHUpOworCQkJLyogSWYgZGlzY2FyZGluZyBwYWNrZXQgaXMgbGFzdCBwYWNrZXQgb2YgdGhlIGRlbGl2ZXJ5CisJCQkgICBsaXN0LCBOVUxMIHRlcm1pbmF0b3Igc2hvdWxkIGJlIGFkZGVkCisJCQkgICBmb3IgZGVsaXZlcnkgbGlzdC4gKi8KKwkJCWlmIChuZXh0ID09IE5VTEwgJiYgZGVsaXZlcl9saXN0X2hlYWQpIHsKKwkJCQkvKiBhZGQgTlVMTCB0ZXJtaW5hdG9yICovCisJCQkJY2RmX25idWZfc2V0X25leHQoZGVsaXZlcl9saXN0X3RhaWwsIE5VTEwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqICBJZiB0aGlzIGlzIGZvciBPQ0IsCisJCQkgKiAgdGhlbiBwcmVwZW5kIHRoZSBSWCBzdGF0cyBoZWFkZXIuCisJCQkgKi8KKwkJCWlmICh2ZGV2LT5vcG1vZGUgPT0gd2xhbl9vcF9tb2RlX29jYikgeworCQkJCWludCBpOworCQkJCXN0cnVjdCBvbF90eHJ4X29jYl9jaGFuX2luZm8gKmNoYW5faW5mbyA9IDA7CisJCQkJaW50IHBhY2tldF9mcmVxID0gcGVlci0+bGFzdF9wa3RfY2VudGVyX2ZyZXE7CisJCQkJZm9yIChpID0gMDsgaSA8IHZkZXYtPm9jYl9jaGFubmVsX2NvdW50OyBpKyspIHsKKwkJCQkJaWYgKHZkZXYtPm9jYl9jaGFubmVsX2luZm9baV0uCisJCQkJCQljaGFuX2ZyZXEgPT0gcGFja2V0X2ZyZXEpIHsKKwkJCQkJCWNoYW5faW5mbyA9ICZ2ZGV2LT4KKwkJCQkJCQlvY2JfY2hhbm5lbF9pbmZvW2ldOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFjaGFuX2luZm8gfHwgIWNoYW5faW5mby0+CisJCQkJCWRpc2FibGVfcnhfc3RhdHNfaGRyKSB7CisJCQkJCXN0cnVjdCBldGhlcl9oZWFkZXIgZXRoX2hlYWRlciA9IHsKKwkJCQkJCXswfSB9OworCQkJCQlzdHJ1Y3Qgb2NiX3J4X3N0YXRzX2hkcl90IHJ4X2hlYWRlciA9IHsKKwkJCQkJCTB9OworCisJCQkJCS8qCisJCQkJCSAqIENvbnN0cnVjdCB0aGUgUlggc3RhdHMgaGVhZGVyIGFuZAorCQkJCQkgKiBwdXNoIHRoYXQgdG8gdGhlIGZyb250b2YgdGhlIHBhY2tldC4KKwkJCQkJICovCisJCQkJCXJ4X2hlYWRlci52ZXJzaW9uID0gMTsKKwkJCQkJcnhfaGVhZGVyLmxlbmd0aCA9IHNpemVvZihyeF9oZWFkZXIpOworCQkJCQlyeF9oZWFkZXIuY2hhbm5lbF9mcmVxID0KKwkJCQkJCXBlZXItPmxhc3RfcGt0X2NlbnRlcl9mcmVxOworCQkJCQlyeF9oZWFkZXIucnNzaV9jbWIgPQorCQkJCQkJcGVlci0+bGFzdF9wa3RfcnNzaV9jbWI7CisJCQkJCWNkZl9tZW1fY29weShyeF9oZWFkZXIucnNzaSwKKwkJCQkJCQlwZWVyLT5sYXN0X3BrdF9yc3NpLAorCQkJCQkJCXNpemVvZihyeF9oZWFkZXIucnNzaSkpOworCQkJCQlpZiAocGVlci0+bGFzdF9wa3RfbGVnYWN5X3JhdGVfc2VsID09CisJCQkJCSAgICAwKSB7CisJCQkJCQlzd2l0Y2ggKHBlZXItPgorCQkJCQkJCWxhc3RfcGt0X2xlZ2FjeV9yYXRlKSB7CisJCQkJCQljYXNlIDB4ODoKKwkJCQkJCQlyeF9oZWFkZXIuZGF0YXJhdGUgPSA2OworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAweDk6CisJCQkJCQkJcnhfaGVhZGVyLmRhdGFyYXRlID0gNDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMHhBOgorCQkJCQkJCXJ4X2hlYWRlci5kYXRhcmF0ZSA9IDI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDB4QjoKKwkJCQkJCQlyeF9oZWFkZXIuZGF0YXJhdGUgPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAweEM6CisJCQkJCQkJcnhfaGVhZGVyLmRhdGFyYXRlID0gNzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMHhEOgorCQkJCQkJCXJ4X2hlYWRlci5kYXRhcmF0ZSA9IDU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDB4RToKKwkJCQkJCQlyeF9oZWFkZXIuZGF0YXJhdGUgPSAzOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAweEY6CisJCQkJCQkJcnhfaGVhZGVyLmRhdGFyYXRlID0gMTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJcnhfaGVhZGVyLmRhdGFyYXRlID0KKwkJCQkJCQkJMHhGRjsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJ4X2hlYWRlci5kYXRhcmF0ZSA9IDB4RkY7CisJCQkJCX0KKworCQkJCQlyeF9oZWFkZXIudGltZXN0YW1wX21pY3Jvc2VjID0gcGVlci0+CisJCQkJCQlsYXN0X3BrdF90aW1lc3RhbXBfbWljcm9zZWM7CisJCQkJCXJ4X2hlYWRlci50aW1lc3RhbXBfc3VibWljcm9zZWMgPSBwZWVyLT4KKwkJCQkJCWxhc3RfcGt0X3RpbWVzdGFtcF9zdWJtaWNyb3NlYzsKKwkJCQkJcnhfaGVhZGVyLnRzZjMyID0gcGVlci0+bGFzdF9wa3RfdHNmOworCQkJCQlyeF9oZWFkZXIuZXh0X3RpZCA9IHBlZXItPmxhc3RfcGt0X3RpZDsKKworCQkJCQljZGZfbmJ1Zl9wdXNoX2hlYWQobXNkdSwKKwkJCQkJCXNpemVvZihyeF9oZWFkZXIpKTsKKwkJCQkJY2RmX21lbV9jb3B5KGNkZl9uYnVmX2RhdGEobXNkdSksCisJCQkJCQkmcnhfaGVhZGVyLCBzaXplb2YocnhfaGVhZGVyKSk7CisKKwkJCQkJLyogQ29uc3RydWN0IHRoZSBldGhlcm5ldCBoZWFkZXIgd2l0aAorCQkJCQkgICB0eXBlIDB4ODE1MiBhbmQgcHVzaCB0aGF0IHRvIHRoZQorCQkJCQkgICBmcm9udCBvZiB0aGUgcGFja2V0IHRvIGluZGljYXRlIHRoZQorCQkJCQkgICBSWCBzdGF0cyBoZWFkZXIuICovCisJCQkJCWV0aF9oZWFkZXIuZXRoZXJfdHlwZSA9IENERl9TV0FQX1UxNigKKwkJCQkJCUVUSEVSVFlQRV9PQ0JfUlgpOworCQkJCQljZGZfbmJ1Zl9wdXNoX2hlYWQobXNkdSwKKwkJCQkJCQkgICBzaXplb2YoZXRoX2hlYWRlcikpOworCQkJCQljZGZfbWVtX2NvcHkoY2RmX25idWZfZGF0YShtc2R1KSwKKwkJCQkJCQkmZXRoX2hlYWRlciwKKwkJCQkJCQkgc2l6ZW9mKGV0aF9oZWFkZXIpKTsKKwkJCQl9CisJCQl9CisJCQlPTF9SWF9QRUVSX1NUQVRTX1VQREFURShwZWVyLCBtc2R1KTsKKwkJCU9MX1JYX0VSUl9TVEFUSVNUSUNTXzEocGRldiwgdmRldiwgcGVlciwgcnhfZGVzYywKKwkJCQkJICAgICAgIE9MX1JYX0VSUl9OT05FKTsKKwkJCVRYUlhfU1RBVFNfTVNEVV9JTkNSKHZkZXYtPnBkZXYsIHJ4LmRlbGl2ZXJlZCwgbXNkdSk7CisJCQlPTF9UWFJYX0xJU1RfQVBQRU5EKGRlbGl2ZXJfbGlzdF9oZWFkLAorCQkJCQkgICAgZGVsaXZlcl9saXN0X3RhaWwsIG1zZHUpOworCQl9CisJCW1zZHUgPSBuZXh0OworCX0KKwkvKiBzYW5pdHkgY2hlY2sgLSBhcmUgdGhlcmUgYW55IGZyYW1lcyBsZWZ0IHRvIGdpdmUgdG8gdGhlIE9TIHNoaW0/ICovCisJaWYgKCFkZWxpdmVyX2xpc3RfaGVhZCkKKwkJcmV0dXJuOworCisjaWYgZGVmaW5lZChQRVJFX0lQX0hEUl9BTElHTk1FTlRfV0FSKQorCWlmIChwZGV2LT5ob3N0XzgwMjExX2VuYWJsZSkKKwkJZm9yIChtc2R1ID0gZGVsaXZlcl9saXN0X2hlYWQ7IG1zZHU7IG1zZHUgPSBjZGZfbmJ1Zl9uZXh0KG1zZHUpKQorCQkJdHJhbnNjYXBfbndpZmlfdG9fODAyMyhtc2R1KTsKKyNlbmRpZgorCisJb2xfdHhyeF9mcm1zX2R1bXAoInJ4IGRlbGl2ZXJpbmc6IiwKKwkJCSAgcGRldiwgZGVsaXZlcl9saXN0X2hlYWQsCisJCQkgIG9sX3R4cnhfZnJtX2R1bXBfdGNwX3NlcSB8IG9sX3R4cnhfZnJtX2R1bXBfY29udGVudHMsCisJCQkgIDAgLyogZG9uJ3QgcHJpbnQgY29udGVudHMgKi8pOworCisJb2xfcnhfZGF0YV9wcm9jZXNzKHBlZXIsIGRlbGl2ZXJfbGlzdF9oZWFkKTsKK30KKwordm9pZAorb2xfcnhfZGlzY2FyZChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJICAgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1bnNpZ25lZCB0aWQsIGNkZl9uYnVmX3QgbXNkdV9saXN0KQoreworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiA9IHZkZXYtPnBkZXY7CisJaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2ID0gcGRldi0+aHR0X3BkZXY7CisKKwl3aGlsZSAobXNkdV9saXN0KSB7CisJCWNkZl9uYnVmX3QgbXNkdSA9IG1zZHVfbGlzdDsKKworCQltc2R1X2xpc3QgPSBjZGZfbmJ1Zl9uZXh0KG1zZHVfbGlzdCk7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMSwKKwkJCSAgICJkaXNjYXJkIHJ4ICVwIGZyb20gcGFydGx5LWRlbGV0ZWQgcGVlciAlcCAiCisJCQkgICAiKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KVxuIiwKKwkJCSAgIG1zZHUsIHBlZXIsCisJCQkgICBwZWVyLT5tYWNfYWRkci5yYXdbMF0sIHBlZXItPm1hY19hZGRyLnJhd1sxXSwKKwkJCSAgIHBlZXItPm1hY19hZGRyLnJhd1syXSwgcGVlci0+bWFjX2FkZHIucmF3WzNdLAorCQkJICAgcGVlci0+bWFjX2FkZHIucmF3WzRdLCBwZWVyLT5tYWNfYWRkci5yYXdbNV0pOworCQlodHRfcnhfZGVzY19mcmFtZV9mcmVlKGh0dF9wZGV2LCBtc2R1KTsKKwl9Cit9CisKK3ZvaWQgb2xfcnhfcGVlcl9pbml0KHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyKQoreworCXVpbnQ4X3QgdGlkOworCWZvciAodGlkID0gMDsgdGlkIDwgT0xfVFhSWF9OVU1fRVhUX1RJRFM7IHRpZCsrKSB7CisJCW9sX3J4X3Jlb3JkZXJfaW5pdCgmcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0sIHRpZCk7CisKKwkJLyogaW52YWxpZCBzZXF1ZW5jZSBudW1iZXIgKi8KKwkJcGVlci0+dGlkc19sYXN0X3NlcVt0aWRdID0gSUVFRTgwMjExX1NFUV9NQVg7CisJfQorCS8qCisJICogU2V0IHNlY3VyaXR5IGRlZmF1bHRzOiBubyBQTiBjaGVjaywgbm8gc2VjdXJpdHkuCisJICogVGhlIHRhcmdldCBtYXkgc2VuZCBhIEhUVCBTRUNfSU5EIG1lc3NhZ2UgdG8gb3ZlcndyaXRlCisJICogdGhlc2UgZGVmYXVsdHMuCisJICovCisJcGVlci0+c2VjdXJpdHlbdHhyeF9zZWNfdWNhc3RdLnNlY190eXBlID0KKwkJcGVlci0+c2VjdXJpdHlbdHhyeF9zZWNfbWNhc3RdLnNlY190eXBlID0gaHR0X3NlY190eXBlX25vbmU7CisJcGVlci0+a2V5aW5zdGFsbGVkID0gMDsKKwljZGZfYXRvbWljX2luaXQoJnBlZXItPmZ3X3BuX2NoZWNrKTsKK30KKwordm9pZAorb2xfcnhfcGVlcl9jbGVhbnVwKHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyKQoreworCXBlZXItPmtleWluc3RhbGxlZCA9IDA7CisJb2xfcnhfcmVvcmRlcl9wZWVyX2NsZWFudXAodmRldiwgcGVlcik7Cit9CisKKy8qCisgKiBGcmVlIGZyYW1lcyBpbmNsdWRpbmcgYm90aCByeCBkZXNjcmlwdG9ycyBhbmQgYnVmZmVycworICovCit2b2lkIG9sX3J4X2ZyYW1lc19mcmVlKGh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiwgY2RmX25idWZfdCBmcmFtZXMpCit7CisJY2RmX25idWZfdCBuZXh0LCBmcmFnID0gZnJhbWVzOworCisJd2hpbGUgKGZyYWcpIHsKKwkJbmV4dCA9IGNkZl9uYnVmX25leHQoZnJhZyk7CisJCWh0dF9yeF9kZXNjX2ZyYW1lX2ZyZWUoaHR0X3BkZXYsIGZyYWcpOworCQlmcmFnID0gbmV4dDsKKwl9Cit9CisKK3ZvaWQKK29sX3J4X2luX29yZGVyX2luZGljYXRpb25faGFuZGxlcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkJICBjZGZfbmJ1Zl90IHJ4X2luZF9tc2csCisJCQkJICB1aW50MTZfdCBwZWVyX2lkLAorCQkJCSAgdWludDhfdCB0aWQsIHVpbnQ4X3QgaXNfb2ZmbG9hZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYgPSBOVUxMOworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciA9IE5VTEw7CisJaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2ID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCWNkZl9uYnVmX3QgaGVhZF9tc2R1LCB0YWlsX21zZHUgPSBOVUxMOworCisJaWYgKHBkZXYpIHsKKwkJcGVlciA9IG9sX3R4cnhfcGVlcl9maW5kX2J5X2lkKHBkZXYsIHBlZXJfaWQpOworCQlodHRfcGRldiA9IHBkZXYtPmh0dF9wZGV2OworCX0gZWxzZSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkgICAiJXM6IEludmFsaWQgcGRldiBwYXNzZWQhXG4iLCBfX2Z1bmNfXyk7CisJCWNkZl9hc3NlcnRfYWx3YXlzKHBkZXYpOworCQlyZXR1cm47CisJfQorCisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX0RFQlVHKQorCWNkZl9wcmludCgiJXMgJWQ6IHJ4X2luZF9tc2cgMHglcCBwZWVyX2lkICVkIHRpZCAlZCBpc19vZmZsb2FkICVkXG4iLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgcnhfaW5kX21zZywgcGVlcl9pZCwgdGlkLCBpc19vZmZsb2FkKTsKKyNlbmRpZgorCisJLyoKKwkgKiBHZXQgYSBsaW5rZWQgbGlzdCBvZiB0aGUgTVNEVXMgaW4gdGhlIHJ4IGluIG9yZGVyIGluZGljYXRpb24uCisJICogVGhpcyBhbHNvIGF0dGFjaGVzIGVhY2ggcnggTVNEVSBkZXNjcmlwdG9yIHRvIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgcnggTVNEVSBuZXR3b3JrIGJ1ZmZlci4KKwkgKi8KKwlzdGF0dXMgPSBodHRfcnhfYW1zZHVfcG9wKGh0dF9wZGV2LCByeF9pbmRfbXNnLCAmaGVhZF9tc2R1LCAmdGFpbF9tc2R1KTsKKwlpZiAoY2RmX3VubGlrZWx5KDAgPT0gc3RhdHVzKSkgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfV0FSTiwKKwkJCSAgICIlczogUG9wIHN0YXR1cyBpcyAwLCByZXR1cm5pbmcgaGVyZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyogUmVwbGVuaXNoIHRoZSByeCBidWZmZXIgcmluZyBmaXJzdCB0byBwcm92aWRlIGJ1ZmZlcnMgdG8gdGhlIHRhcmdldAorCSAgIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSBpbmRldGVybWluYXRlIHRpbWUgdGFrZW4gYnkgdGhlIE9TCisJICAgdG8gY29uc3VtZSB0aGUgcnggZnJhbWVzICovCisJaHR0X3J4X21zZHVfYnVmZl9yZXBsZW5pc2goaHR0X3BkZXYpOworCisJLyogU2VuZCB0aGUgY2hhaW4gb2YgTVNEVXMgdG8gdGhlIE9TICovCisJLyogcnhfb3B0X3Byb2MgdGFrZXMgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBtc2R1IG5ldGJ1ZnMgKi8KKwljZGZfbmJ1Zl9zZXRfbmV4dCh0YWlsX21zZHUsIE5VTEwpOworCisJLyogUGt0bG9nICovCisjaWZkZWYgV0RJX0VWRU5UX0VOQUJMRQorCXdkaV9ldmVudF9oYW5kbGVyKFdESV9FVkVOVF9SWF9ERVNDX1JFTU9URSwgcGRldiwgaGVhZF9tc2R1KTsKKyNlbmRpZgorCisJLyogaWYgdGhpcyBpcyBhbiBvZmZsb2FkIGluZGljYXRpb24sIHBlZXIgaWQgaXMgY2FycmllZCBpbiB0aGUKKwkgICByeCBidWZmZXIgKi8KKwlpZiAocGVlcikgeworCQl2ZGV2ID0gcGVlci0+dmRldjsKKwl9IGVsc2UgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfSU5GTzIsCisJCQkgICAiJXM6IENvdWxkbid0IGZpbmQgcGVlciBmcm9tIElEIDB4JXhcbiIsCisJCQkgICBfX2Z1bmNfXywgcGVlcl9pZCk7CisJCXdoaWxlIChoZWFkX21zZHUpIHsKKwkJCWNkZl9uYnVmX3QgbXNkdSA9IGhlYWRfbXNkdTsKKwkJCWhlYWRfbXNkdSA9IGNkZl9uYnVmX25leHQoaGVhZF9tc2R1KTsKKwkJCWh0dF9yeF9kZXNjX2ZyYW1lX2ZyZWUoaHR0X3BkZXYsIG1zZHUpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlwZWVyLT5yeF9vcHRfcHJvYyh2ZGV2LCBwZWVyLCB0aWQsIGhlYWRfbXNkdSk7Cit9CisKKy8qIHRoZSBtc2R1X2xpc3QgcGFzc2VkIGhlcmUgbXVzdCBiZSBOVUxMIHRlcm1pbmF0ZWQgKi8KK3ZvaWQKK29sX3J4X2luX29yZGVyX2RlbGl2ZXIoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkgICAgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCQkgICAgICAgdW5zaWduZWQgdGlkLCBjZGZfbmJ1Zl90IG1zZHVfbGlzdCkKK3sKKwljZGZfbmJ1Zl90IG1zZHU7CisKKwltc2R1ID0gbXNkdV9saXN0OworCS8qCisJICogQ3VycmVudGx5LCB0aGlzIGRvZXMgbm90IGNoZWNrIGVhY2ggTVNEVSB0byBzZWUgd2hldGhlciBpdCByZXF1aXJlcworCSAqIHNwZWNpYWwgaGFuZGxpbmcuIE1TRFVzIHRoYXQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIChleGFtcGxlOiBJR01QCisJICogZnJhbWVzKSBzaG91bGQgYmUgc2VudCB2aWEgYSBzZXBlcmF0ZSBIVFQgbWVzc2FnZS4gQWxzbywgdGhpcyBkb2VzCisJICogbm90IGRvIHJ4LT50eCBmb3J3YXJkaW5nIG9yIGZpbHRlcmluZy4KKwkgKi8KKworCXdoaWxlIChtc2R1KSB7CisJCWNkZl9uYnVmX3QgbmV4dCA9IGNkZl9uYnVmX25leHQobXNkdSk7CisKKwkJT0xfUlhfUEVFUl9TVEFUU19VUERBVEUocGVlciwgbXNkdSk7CisJCU9MX1JYX0VSUl9TVEFUSVNUSUNTXzEodmRldi0+cGRldiwgdmRldiwgcGVlciwgcnhfZGVzYywKKwkJCQkgICAgICAgT0xfUlhfRVJSX05PTkUpOworCQlUWFJYX1NUQVRTX01TRFVfSU5DUih2ZGV2LT5wZGV2LCByeC5kZWxpdmVyZWQsIG1zZHUpOworCisJCW1zZHUgPSBuZXh0OworCX0KKworCW9sX3R4cnhfZnJtc19kdW1wKCJyeCBkZWxpdmVyaW5nOiIsCisJCQkgIHBkZXYsIGRlbGl2ZXJfbGlzdF9oZWFkLAorCQkJICBvbF90eHJ4X2ZybV9kdW1wX3RjcF9zZXEgfCBvbF90eHJ4X2ZybV9kdW1wX2NvbnRlbnRzLAorCQkJICAwIC8qIGRvbid0IHByaW50IGNvbnRlbnRzICovKTsKKworCW9sX3J4X2RhdGFfcHJvY2VzcyhwZWVyLCBtc2R1X2xpc3QpOworfQorCit2b2lkCitvbF9yeF9vZmZsb2FkX3BhZGRyX2RlbGl2ZXJfaW5kX2hhbmRsZXIoaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2LAorCQkJCQl1aW50MzJfdCBtc2R1X2NvdW50LAorCQkJCQl1aW50MzJfdCAqbXNnX3dvcmQpCit7CisJaW50IHZkZXZfaWQsIHBlZXJfaWQsIHRpZDsKKwljZGZfbmJ1Zl90IGhlYWRfYnVmLCB0YWlsX2J1ZiwgYnVmOworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwl1aW50OF90IGZ3X2Rlc2M7CisJaW50IG1zZHVfaXRlciA9IDA7CisKKwl3aGlsZSAobXNkdV9jb3VudCkgeworCQlodHRfcnhfb2ZmbG9hZF9wYWRkcl9tc2R1X3BvcF9sbChodHRfcGRldiwgbXNnX3dvcmQsIG1zZHVfaXRlciwKKwkJCQkJCSAmdmRldl9pZCwgJnBlZXJfaWQsICZ0aWQsCisJCQkJCQkgJmZ3X2Rlc2MsICZoZWFkX2J1ZiwKKwkJCQkJCSAmdGFpbF9idWYpOworCisJCXBlZXIgPSBvbF90eHJ4X3BlZXJfZmluZF9ieV9pZChodHRfcGRldi0+dHhyeF9wZGV2LCBwZWVyX2lkKTsKKwkJaWYgKHBlZXIpIHsKKwkJCW9sX3J4X2RhdGFfcHJvY2VzcyhwZWVyLCBoZWFkX2J1Zik7CisJCX0gZWxzZSB7CisJCQlidWYgPSBoZWFkX2J1ZjsKKwkJCXdoaWxlICgxKSB7CisJCQkJY2RmX25idWZfdCBuZXh0OworCQkJCW5leHQgPSBjZGZfbmJ1Zl9uZXh0KGJ1Zik7CisJCQkJaHR0X3J4X2Rlc2NfZnJhbWVfZnJlZShodHRfcGRldiwgYnVmKTsKKwkJCQlpZiAoYnVmID09IHRhaWxfYnVmKQorCQkJCQlicmVhazsKKwkJCQlidWYgPSBuZXh0OworCQkJfQorCQl9CisJCW1zZHVfaXRlcisrOworCQltc2R1X2NvdW50LS07CisJfQorCWh0dF9yeF9tc2R1X2J1ZmZfcmVwbGVuaXNoKGh0dF9wZGV2KTsKK30KKworCisjaWZkZWYgTkVWRVJERUZJTkVECisvKioKKyAqIEBicmllZiBwb3B1bGF0ZXMgdm93IGV4dCBzdGF0cyBpbiBnaXZlbiBuZXR3b3JrIGJ1ZmZlci4KKyAqIEBwYXJhbSBtc2R1IC0gbmV0d29yayBidWZmZXIgaGFuZGxlCisgKiBAcGFyYW0gcGRldiAtIGhhbmRsZSB0byBodHQgZGV2LgorICovCit2b2lkIG9sX2F0aF9hZGRfdm93X2V4dHN0YXRzKGh0dF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IG1zZHUpCit7CisJLyogRklYIFRISVM6CisJICogdHhyeCBzaG91bGQgbm90IGJlIGRpcmVjdGx5IHVzaW5nIGRhdGEgdHlwZXMgKHNjbikKKwkgKiB0aGF0IGFyZSBpbnRlcm5hbCB0byBvdGhlciBtb2R1bGVzLgorCSAqLworCXN0cnVjdCBvbF9hdGhfc29mdGNfbmV0ODAyMTEgKnNjbiA9CisJCShzdHJ1Y3Qgb2xfYXRoX3NvZnRjX25ldDgwMjExICopcGRldi0+Y3RybF9wZGV2OworCisJaWYgKHNjbi0+dm93X2V4dHN0YXRzID09IDApIHsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCXVpbnQ4X3QgKmRhdGEsICpsM19oZHIsICpicDsKKwkJdWludDE2X3QgZXRoZXJ0eXBlOworCQlpbnQgb2Zmc2V0OworCQlzdHJ1Y3Qgdm93X2V4dHN0YXRzIHZvd3N0YXRzOworCisJCWRhdGEgPSBjZGZfbmJ1Zl9kYXRhKG1zZHUpOworCisJCW9mZnNldCA9IEVUSEVSTkVUX0FERFJfTEVOICogMjsKKwkJbDNfaGRyID0gZGF0YSArIEVUSEVSTkVUX0hEUl9MRU47CisJCWV0aGVydHlwZSA9IChkYXRhW29mZnNldF0gPDwgOCkgfCBkYXRhW29mZnNldCArIDFdOworCQlpZiAoZXRoZXJ0eXBlID09IEVUSEVSVFlQRV9JUFY0KSB7CisJCQlvZmZzZXQgPSBJUFY0X0hEUl9PRkZTRVRfUFJPVE9DT0w7CisJCQlpZiAoKGwzX2hkcltvZmZzZXRdID09IElQX1BST1RPQ09MX1VEUCkgJiYKKwkJCSAgICAobDNfaGRyWzBdID09IElQX1ZFUjRfTl9OT19FWFRSQV9IRUFERVJTKSkgeworCQkJCWJwID0gZGF0YSArIEVYVF9IRFJfT0ZGU0VUOworCisJCQkJaWYgKChkYXRhW1JUUF9IRFJfT0ZGU0VUXSA9PSBVRFBfUERVX1JUUF9FWFQpICYmCisJCQkJICAgIChicFswXSA9PSAweDEyKSAmJgorCQkJCSAgICAoYnBbMV0gPT0gMHgzNCkgJiYKKwkJCQkgICAgKGJwWzJdID09IDB4MDApICYmIChicFszXSA9PSAweDA4KSkgeworCQkJCQkvKgorCQkJCQkgKiBDbGVhciBVRFAgY2hlY2tzdW0gc28gd2UgZG8gbm90IGhhdmUKKwkJCQkJICogdG8gcmVjYWxjdWxhdGUgaXQKKwkJCQkJICogYWZ0ZXIgZmlsbGluZyBpbiBzdGF0dXMgZmllbGRzLgorCQkJCQkgKi8KKwkJCQkJZGF0YVtVRFBfQ0tTVU1fT0ZGU0VUXSA9IDA7CisJCQkJCWRhdGFbKFVEUF9DS1NVTV9PRkZTRVQgKyAxKV0gPSAwOworCisJCQkJCWJwICs9IElQRVJGM19EQVRBX09GRlNFVDsKKworCQkJCQlodHRfcnhfZ2V0X3Zvd2V4dF9zdGF0cyhtc2R1LAorCQkJCQkJCQkmdm93c3RhdHMpOworCisJCQkJCS8qIGNvbnRyb2wgY2hhbm5lbCBSU1NJICovCisJCQkJCSpicCsrID0gdm93c3RhdHMucnhfcnNzaV9jdGwwOworCQkJCQkqYnArKyA9IHZvd3N0YXRzLnJ4X3Jzc2lfY3RsMTsKKwkJCQkJKmJwKysgPSB2b3dzdGF0cy5yeF9yc3NpX2N0bDI7CisKKwkJCQkJLyogcnggcmF0ZSBpbmZvICovCisJCQkJCSpicCsrID0gdm93c3RhdHMucnhfYnc7CisJCQkJCSpicCsrID0gdm93c3RhdHMucnhfc2dpOworCQkJCQkqYnArKyA9IHZvd3N0YXRzLnJ4X25zczsKKworCQkJCQkqYnArKyA9IHZvd3N0YXRzLnJ4X3Jzc2lfY29tYjsKKwkJCQkJLyogcnNmbGFncyAqLworCQkJCQkqYnArKyA9IHZvd3N0YXRzLnJ4X3JzX2ZsYWdzOworCisJCQkJCS8qIFRpbWUgc3RhbXAgTG8gKi8KKwkJCQkJKmJwKysgPSAodWludDhfdCkKKwkJCQkJCSgodm93c3RhdHMuCisJCQkJCQkgIHJ4X21hY1RzICYgMHgwMDAwZmYwMCkgPj4gOCk7CisJCQkJCSpicCsrID0gKHVpbnQ4X3QpCisJCQkJCQkodm93c3RhdHMucnhfbWFjVHMgJiAweDAwMDBmZik7CisJCQkJCS8qIHJ4IHBoeSBlcnJvcnMgKi8KKwkJCQkJKmJwKysgPSAodWludDhfdCkKKwkJCQkJCSgoc2NuLT5jaGFuX3N0YXRzLgorCQkJCQkJICBwaHlfZXJyX2NudCA+PiA4KSAmIDB4ZmYpOworCQkJCQkqYnArKyA9CisJCQkJCQkodWludDhfdCkgKHNjbi0+Y2hhbl9zdGF0cy4KKwkJCQkJCQkgICBwaHlfZXJyX2NudCAmIDB4ZmYpOworCQkJCQkvKiByeCBjbGVhciBjb3VudCAqLworCQkJCQkqYnArKyA9ICh1aW50OF90KQorCQkJCQkJKChzY24tPm1pYl9jeWNsZV9jbnRzLgorCQkJCQkJICByeF9jbGVhcl9jb3VudCA+PiAyNCkgJiAweGZmKTsKKwkJCQkJKmJwKysgPSAodWludDhfdCkKKwkJCQkJCSgoc2NuLT5taWJfY3ljbGVfY250cy4KKwkJCQkJCSAgcnhfY2xlYXJfY291bnQgPj4gMTYpICYgMHhmZik7CisJCQkJCSpicCsrID0gKHVpbnQ4X3QpCisJCQkJCQkoKHNjbi0+bWliX2N5Y2xlX2NudHMuCisJCQkJCQkgIHJ4X2NsZWFyX2NvdW50ID4+IDgpICYgMHhmZik7CisJCQkJCSpicCsrID0gKHVpbnQ4X3QpCisJCQkJCQkoc2NuLT5taWJfY3ljbGVfY250cy4KKwkJCQkJCSByeF9jbGVhcl9jb3VudCAmIDB4ZmYpOworCQkJCQkvKiByeCBjeWNsZSBjb3VudCAqLworCQkJCQkqYnArKyA9ICh1aW50OF90KQorCQkJCQkJKChzY24tPm1pYl9jeWNsZV9jbnRzLgorCQkJCQkJICBjeWNsZV9jb3VudCA+PiAyNCkgJiAweGZmKTsKKwkJCQkJKmJwKysgPSAodWludDhfdCkKKwkJCQkJCSgoc2NuLT5taWJfY3ljbGVfY250cy4KKwkJCQkJCSAgY3ljbGVfY291bnQgPj4gMTYpICYgMHhmZik7CisJCQkJCSpicCsrID0gKHVpbnQ4X3QpCisJCQkJCQkoKHNjbi0+bWliX2N5Y2xlX2NudHMuCisJCQkJCQkgIGN5Y2xlX2NvdW50ID4+IDgpICYgMHhmZik7CisJCQkJCSpicCsrID0gKHVpbnQ4X3QpCisJCQkJCQkoc2NuLT5taWJfY3ljbGVfY250cy4KKwkJCQkJCSBjeWNsZV9jb3VudCAmIDB4ZmYpOworCisJCQkJCSpicCsrID0gdm93c3RhdHMucnhfcmF0ZWNvZGU7CisJCQkJCSpicCsrID0gdm93c3RhdHMucnhfbW9yZWFnZ3I7CisKKwkJCQkJLyogc2VxdWVuY2UgbnVtYmVyICovCisJCQkJCSpicCsrID0gKHVpbnQ4X3QpCisJCQkJCQkoKHZvd3N0YXRzLnJ4X3NlcW5vID4+IDgpICYKKwkJCQkJCSAweGZmKTsKKwkJCQkJKmJwKysgPSAodWludDhfdCkKKwkJCQkJCSh2b3dzdGF0cy5yeF9zZXFubyAmIDB4ZmYpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfcnguaCBiL2NvcmUvZHAvdHhyeC9vbF9yeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDc0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfcnguaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9PTF9SWF9fSF8KKyNkZWZpbmUgX09MX1JYX19IXworCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX3QgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+ICAgICAgLyogb2xfdHhyeF92ZGV2X3QsIGV0Yy4gKi8KKwordm9pZAorb2xfcnhfZGVsaXZlcihzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJICAgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1bnNpZ25lZCB0aWQsIGNkZl9uYnVmX3QgaGVhZF9tc2R1KTsKKwordm9pZAorb2xfcnhfZGlzY2FyZChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJICAgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1bnNpZ25lZCB0aWQsIGNkZl9uYnVmX3QgaGVhZF9tc2R1KTsKKwordm9pZCBvbF9yeF9mcmFtZXNfZnJlZShodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsIGNkZl9uYnVmX3QgZnJhbWVzKTsKKwordm9pZCBvbF9yeF9wZWVyX2luaXQoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LCBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIpOworCit2b2lkCitvbF9yeF9wZWVyX2NsZWFudXAoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LCBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIpOworCit2b2lkCitvbF9yeF9pbl9vcmRlcl9kZWxpdmVyKHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwKKwkJICAgICAgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJICAgICAgIHVuc2lnbmVkIHRpZCwgY2RmX25idWZfdCBoZWFkX21zZHUpOworCit2b2lkCitvbF9yeF9vZmZsb2FkX3BhZGRyX2RlbGl2ZXJfaW5kX2hhbmRsZXIoaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2LAorCQkJCQl1aW50MzJfdCBtc2R1X2NvdW50LAorCQkJCQl1aW50MzJfdCAqbXNnX3dvcmQpOworCit2b2lkCitvbF9yeF9taWNfZXJyb3JfaGFuZGxlcigKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJdV9pbnQ4X3QgdGlkLAorCXVfaW50MTZfdCBwZWVyX2lkLAorCXZvaWQgKm1zZHVfZGVzYywKKwljZGZfbmJ1Zl90IG1zZHUpOworCisjZW5kaWYgLyogX09MX1JYX19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC90eHJ4L29sX3J4X2RlZnJhZy5jIGIvY29yZS9kcC90eHJ4L29sX3J4X2RlZnJhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjJjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfcnhfZGVmcmFnLmMKQEAgLTAsMCArMSwxMDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA3IFNhbSBMZWZmbGVyLCBFcnJubyBDb25zdWx0aW5nCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgPG9sX2h0dF9hcGkuaD4KKyNpbmNsdWRlIDxvbF90eHJ4X2FwaS5oPgorI2luY2x1ZGUgPG9sX3R4cnhfaHR0X2FwaS5oPgorI2luY2x1ZGUgPG9sX2h0dF9yeF9hcGkuaD4KKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+CisjaW5jbHVkZSA8b2xfcnhfcmVvcmRlci5oPgorI2luY2x1ZGUgPG9sX3J4X3BuLmg+CisjaW5jbHVkZSA8b2xfcnhfZndkLmg+CisjaW5jbHVkZSA8b2xfcnguaD4KKyNpbmNsdWRlIDxvbF90eHJ4X2ludGVybmFsLmg+CisjaW5jbHVkZSA8b2xfY3RybF90eHJ4X2FwaS5oPgorI2luY2x1ZGUgPG9sX3R4cnhfcGVlcl9maW5kLmg+CisjaW5jbHVkZSA8Y2RmX25idWYuaD4KKyNpbmNsdWRlIDxpZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxjZGZfdXRpbC5oPgorI2luY2x1ZGUgPGF0aGRlZnMuaD4KKyNpbmNsdWRlIDxjZGZfbWVtb3J5Lmg+CisjaW5jbHVkZSA8b2xfcnhfZGVmcmFnLmg+CisjaW5jbHVkZSA8ZW5ldC5oPgorI2luY2x1ZGUgPGNkZl90aW1lLmg+ICAgICAgICAgICAvKiBjZGZfc3lzdGVtX3RpbWUgKi8KKworI2RlZmluZSBERUZSQUdfSUVFRTgwMjExX0FERFJfRVEoYTEsIGEyKSBcCisJKGNkZl9tZW1fY29tcGFyZShhMSwgYTIsIElFRUU4MDIxMV9BRERSX0xFTikgPT0gMCkKKworI2RlZmluZSBERUZSQUdfSUVFRTgwMjExX0FERFJfQ09QWShkc3QsIHNyYykgXAorCWNkZl9tZW1fY29weShkc3QsIHNyYywgSUVFRTgwMjExX0FERFJfTEVOKQorCisjZGVmaW5lIERFRlJBR19JRUVFODAyMTFfUU9TX0hBU19TRVEod2gpIFwKKwkoKCh3aCktPmlfZmNbMF0gJiBcCisJICAoSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TKSkgPT0gXAorCSAoSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TKSkKKworI2RlZmluZSBERUZSQUdfSUVFRTgwMjExX1FPU19HRVRfVElEKF94KSBcCisJKChfeCktPmlfcW9zWzBdICYgSUVFRTgwMjExX1FPU19USUQpCisKK2NvbnN0IHN0cnVjdCBvbF9yeF9kZWZyYWdfY2lwaGVyIGZfY2NtcCA9IHsKKwkiQUVTLUNDTSIsCisJSUVFRTgwMjExX1dFUF9JVkxFTiArIElFRUU4MDIxMV9XRVBfS0lETEVOICsgSUVFRTgwMjExX1dFUF9FWFRJVkxFTiwKKwlJRUVFODAyMTFfV0VQX01JQ0xFTiwKKwkwLAorfTsKKworY29uc3Qgc3RydWN0IG9sX3J4X2RlZnJhZ19jaXBoZXIgZl90a2lwID0geworCSJUS0lQIiwKKwlJRUVFODAyMTFfV0VQX0lWTEVOICsgSUVFRTgwMjExX1dFUF9LSURMRU4gKyBJRUVFODAyMTFfV0VQX0VYVElWTEVOLAorCUlFRUU4MDIxMV9XRVBfQ1JDTEVOLAorCUlFRUU4MDIxMV9XRVBfTUlDTEVOLAorfTsKKworY29uc3Qgc3RydWN0IG9sX3J4X2RlZnJhZ19jaXBoZXIgZl93ZXAgPSB7CisJIldFUCIsCisJSUVFRTgwMjExX1dFUF9JVkxFTiArIElFRUU4MDIxMV9XRVBfS0lETEVOLAorCUlFRUU4MDIxMV9XRVBfQ1JDTEVOLAorCTAsCit9OworCitpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqb2xfcnhfZnJhZ19nZXRfbWFjX2hkcigKKwlodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsCisJY2RmX25idWZfdCBmcmFnKQoreworCXJldHVybgorCQkoc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKSBjZGZfbmJ1Zl9kYXRhKGZyYWcpOworfQorI2RlZmluZSBvbF9yeF9mcmFnX3B1bGxfaGRyKHBkZXYsIGZyYWcsIGhkcnNpemUpIFwKKwljZGZfbmJ1Zl9wdWxsX2hlYWQoZnJhZywgaGRyc2l6ZSk7CisjZGVmaW5lIE9MX1JYX0ZSQUdfQ0xPTkUoZnJhZykgTlVMTCAgICAgLyogbm8tb3AgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitvbF9yeF9mcmFnX2Rlc2NfYWRqdXN0KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgICAgIGNkZl9uYnVmX3QgbXNkdSwKKwkJICAgICAgIHZvaWQgKipyeF9kZXNjX29sZF9wb3NpdGlvbiwKKwkJICAgICAgIHZvaWQgKippbmRfb2xkX3Bvc2l0aW9uLCBpbnQgKnJ4X2Rlc2NfbGVuKQoreworCSpyeF9kZXNjX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJKmluZF9vbGRfcG9zaXRpb24gPSBOVUxMOworCSpyeF9kZXNjX2xlbiA9IDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGluY29taW5nIGZyYWdtZW50cworICovCit2b2lkCitvbF9yeF9mcmFnX2luZGljYXRpb25faGFuZGxlcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkgICAgICBjZGZfbmJ1Zl90IHJ4X2ZyYWdfaW5kX21zZywKKwkJCSAgICAgIHVpbnQxNl90IHBlZXJfaWQsIHVpbnQ4X3QgdGlkKQoreworCXVpbnQxNl90IHNlcV9udW07CisJaW50IHNlcV9udW1fc3RhcnQsIHNlcV9udW1fZW5kOworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwlodHRfcGRldl9oYW5kbGUgaHR0X3BkZXY7CisJY2RmX25idWZfdCBoZWFkX21zZHUsIHRhaWxfbXNkdTsKKwl2b2lkICpyeF9tcGR1X2Rlc2M7CisKKwlodHRfcGRldiA9IHBkZXYtPmh0dF9wZGV2OworCXBlZXIgPSBvbF90eHJ4X3BlZXJfZmluZF9ieV9pZChwZGV2LCBwZWVyX2lkKTsKKworCWlmICghb2xfY2ZnX2lzX2Z1bGxfcmVvcmRlcl9vZmZsb2FkKHBkZXYtPmN0cmxfcGRldikgJiYKKwkgICAgaHR0X3J4X2luZF9mbHVzaChwZGV2LT5odHRfcGRldiwgcnhfZnJhZ19pbmRfbXNnKSAmJiBwZWVyKSB7CisJCWh0dF9yeF9mcmFnX2luZF9mbHVzaF9zZXFfbnVtX3JhbmdlKHBkZXYtPmh0dF9wZGV2LAorCQkJCQkJICAgIHJ4X2ZyYWdfaW5kX21zZywKKwkJCQkJCSAgICAmc2VxX251bV9zdGFydCwKKwkJCQkJCSAgICAmc2VxX251bV9lbmQpOworCQkvKgorCQkgKiBBc3N1bWluZyBmbHVzaCBpbmRpY2F0aW9uIGZvciBmcmFncyBzZW50IGZyb20gdGFyZ2V0IGlzCisJCSAqIHNlcGFyYXRlIGZyb20gbm9ybWFsIGZyYW1lcworCQkgKi8KKwkJb2xfcnhfcmVvcmRlcl9mbHVzaF9mcmFnKGh0dF9wZGV2LCBwZWVyLCB0aWQsIHNlcV9udW1fc3RhcnQpOworCX0KKwlpZiAocGVlcikgeworCQlodHRfcnhfZnJhZ19wb3AoaHR0X3BkZXYsIHJ4X2ZyYWdfaW5kX21zZywgJmhlYWRfbXNkdSwKKwkJCQkmdGFpbF9tc2R1KTsKKwkJY2RmX2Fzc2VydChoZWFkX21zZHUgPT0gdGFpbF9tc2R1KTsKKwkJaWYgKG9sX2NmZ19pc19mdWxsX3Jlb3JkZXJfb2ZmbG9hZChwZGV2LT5jdHJsX3BkZXYpKSB7CisJCQlyeF9tcGR1X2Rlc2MgPQorCQkJCWh0dF9yeF9tcGR1X2Rlc2NfbGlzdF9uZXh0KGh0dF9wZGV2LCBoZWFkX21zZHUpOworCQl9IGVsc2UgeworCQkJcnhfbXBkdV9kZXNjID0KKwkJCQlodHRfcnhfbXBkdV9kZXNjX2xpc3RfbmV4dChodHRfcGRldiwKKwkJCQkJCQkgICByeF9mcmFnX2luZF9tc2cpOworCQl9CisJCXNlcV9udW0gPSBodHRfcnhfbXBkdV9kZXNjX3NlcV9udW0oaHR0X3BkZXYsIHJ4X21wZHVfZGVzYyk7CisJCU9MX1JYX0VSUl9TVEFUSVNUSUNTXzEocGRldiwgcGVlci0+dmRldiwgcGVlciwgcnhfbXBkdV9kZXNjLAorCQkJCSAgICAgICBPTF9SWF9FUlJfTk9ORV9GUkFHKTsKKwkJb2xfcnhfcmVvcmRlcl9zdG9yZV9mcmFnKHBkZXYsIHBlZXIsIHRpZCwgc2VxX251bSwgaGVhZF9tc2R1KTsKKwl9IGVsc2UgeworCQkvKiBpbnZhbGlkIGZyYW1lIC0gZGlzY2FyZCBpdCAqLworCQlodHRfcnhfZnJhZ19wb3AoaHR0X3BkZXYsIHJ4X2ZyYWdfaW5kX21zZywgJmhlYWRfbXNkdSwKKwkJCQkmdGFpbF9tc2R1KTsKKwkJaWYgKG9sX2NmZ19pc19mdWxsX3Jlb3JkZXJfb2ZmbG9hZChwZGV2LT5jdHJsX3BkZXYpKQorCQkJaHR0X3J4X21zZHVfZGVzY19yZXRyaWV2ZShodHRfcGRldiwgaGVhZF9tc2R1KTsKKwkJZWxzZQorCQkJaHR0X3J4X21wZHVfZGVzY19saXN0X25leHQoaHR0X3BkZXYsIHJ4X2ZyYWdfaW5kX21zZyk7CisKKwkJaHR0X3J4X2Rlc2NfZnJhbWVfZnJlZShodHRfcGRldiwgaGVhZF9tc2R1KTsKKwl9CisJLyogcmVxdWVzdCBIVFQgdG8gcHJvdmlkZSBuZXcgcnggTVNEVSBidWZmZXJzIGZvciB0aGUgdGFyZ2V0IHRvIGZpbGwuICovCisJaHR0X3J4X21zZHVfYnVmZl9yZXBsZW5pc2goaHR0X3BkZXYpOworfQorCisvKgorICogRmx1c2hpbmcgZnJhZ21lbnRzCisgKi8KK3ZvaWQKK29sX3J4X3Jlb3JkZXJfZmx1c2hfZnJhZyhodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsCisJCQkgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1bnNpZ25lZCB0aWQsIGludCBzZXFfbnVtKQoreworCXN0cnVjdCBvbF9yeF9yZW9yZGVyX2FycmF5X2VsZW1fdCAqcnhfcmVvcmRlcl9hcnJheV9lbGVtOworCWludCBzZXE7CisKKwlzZXEgPSBzZXFfbnVtICYgcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0ud2luX3N6X21hc2s7CisJcnhfcmVvcmRlcl9hcnJheV9lbGVtID0gJnBlZXItPnRpZHNfcnhfcmVvcmRlclt0aWRdLmFycmF5W3NlcV07CisJaWYgKHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCkgeworCQlvbF9yeF9mcmFtZXNfZnJlZShodHRfcGRldiwgcnhfcmVvcmRlcl9hcnJheV9lbGVtLT5oZWFkKTsKKwkJcnhfcmVvcmRlcl9hcnJheV9lbGVtLT5oZWFkID0gTlVMTDsKKwkJcnhfcmVvcmRlcl9hcnJheV9lbGVtLT50YWlsID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBSZW9yZGVyIGFuZCBzdG9yZSBmcmFnbWVudHMKKyAqLwordm9pZAorb2xfcnhfcmVvcmRlcl9zdG9yZV9mcmFnKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCSBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJCQkgdW5zaWduZWQgdGlkLCB1aW50MTZfdCBzZXFfbnVtLCBjZGZfbmJ1Zl90IGZyYWcpCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqZm1hY19oZHIsICptYWNfaGRyOworCXVpbnQ4X3QgZnJhZ25vLCBtb3JlX2ZyYWcsIGFsbF9mcmFnX3ByZXNlbnQgPSAwOworCXN0cnVjdCBvbF9yeF9yZW9yZGVyX2FycmF5X2VsZW1fdCAqcnhfcmVvcmRlcl9hcnJheV9lbGVtOworCXVpbnQxNl90IGZyeHNlcSwgcnhzZXEsIHNlcTsKKwlodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYgPSBwZGV2LT5odHRfcGRldjsKKworCXNlcSA9IHNlcV9udW0gJiBwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS53aW5fc3pfbWFzazsKKwljZGZfYXNzZXJ0KHNlcSA9PSAwKTsKKwlyeF9yZW9yZGVyX2FycmF5X2VsZW0gPSAmcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0uYXJyYXlbc2VxXTsKKworCW1hY19oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKQorCQlvbF9yeF9mcmFnX2dldF9tYWNfaGRyKGh0dF9wZGV2LCBmcmFnKTsKKwlyeHNlcSA9IGNkZl9sZTE2X3RvX2NwdSgqKHVpbnQxNl90ICopIG1hY19oZHItPmlfc2VxKSA+PgorCQlJRUVFODAyMTFfU0VRX1NFUV9TSElGVDsKKwlmcmFnbm8gPSBjZGZfbGUxNl90b19jcHUoKih1aW50MTZfdCAqKSBtYWNfaGRyLT5pX3NlcSkgJgorCQlJRUVFODAyMTFfU0VRX0ZSQUdfTUFTSzsKKwltb3JlX2ZyYWcgPSBtYWNfaGRyLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9NT1JFX0ZSQUc7CisKKwlpZiAoKCFtb3JlX2ZyYWcpICYmICghZnJhZ25vKSAmJiAoIXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCkpIHsKKwkJcnhfcmVvcmRlcl9hcnJheV9lbGVtLT5oZWFkID0gZnJhZzsKKwkJcnhfcmVvcmRlcl9hcnJheV9lbGVtLT50YWlsID0gZnJhZzsKKwkJY2RmX25idWZfc2V0X25leHQoZnJhZywgTlVMTCk7CisJCW9sX3J4X2RlZnJhZyhwZGV2LCBwZWVyLCB0aWQsIHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCk7CisJCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCA9IE5VTEw7CisJCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+dGFpbCA9IE5VTEw7CisJCXJldHVybjsKKwl9CisJaWYgKHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCkgeworCQlmbWFjX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopCisJCQlvbF9yeF9mcmFnX2dldF9tYWNfaGRyKGh0dF9wZGV2LAorCQkJCQkgICAgICAgcnhfcmVvcmRlcl9hcnJheV9lbGVtLT5oZWFkKTsKKwkJZnJ4c2VxID0gY2RmX2xlMTZfdG9fY3B1KCoodWludDE2X3QgKikgZm1hY19oZHItPmlfc2VxKSA+PgorCQkJSUVFRTgwMjExX1NFUV9TRVFfU0hJRlQ7CisJCWlmIChyeHNlcSAhPSBmcnhzZXEKKwkJICAgIHx8ICFERUZSQUdfSUVFRTgwMjExX0FERFJfRVEobWFjX2hkci0+aV9hZGRyMSwKKwkJCQkJCSBmbWFjX2hkci0+aV9hZGRyMSkKKwkJICAgIHx8ICFERUZSQUdfSUVFRTgwMjExX0FERFJfRVEobWFjX2hkci0+aV9hZGRyMiwKKwkJCQkJCSBmbWFjX2hkci0+aV9hZGRyMikpIHsKKwkJCW9sX3J4X2ZyYW1lc19mcmVlKGh0dF9wZGV2LAorCQkJCQkgIHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCk7CisJCQlyeF9yZW9yZGVyX2FycmF5X2VsZW0tPmhlYWQgPSBOVUxMOworCQkJcnhfcmVvcmRlcl9hcnJheV9lbGVtLT50YWlsID0gTlVMTDsKKwkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkJICAgIlxuIG9sX3J4X3Jlb3JkZXJfc3RvcmU6ICAlcyBtaXNtYXRjaCBcbiIsCisJCQkJICAgKHJ4c2VxID09IGZyeHNlcSkKKwkJCQkgICA/ICJhZGRyZXNzIgorCQkJCSAgIDogInNlcSBudW1iZXIiKTsKKwkJfQorCX0KKworCW9sX3J4X2ZyYWdsaXN0X2luc2VydChodHRfcGRldiwgJnJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCwKKwkJCSAgICAgICZyeF9yZW9yZGVyX2FycmF5X2VsZW0tPnRhaWwsIGZyYWcsCisJCQkgICAgICAmYWxsX2ZyYWdfcHJlc2VudCk7CisKKwlpZiAocGRldi0+cnguZmxhZ3MuZGVmcmFnX3RpbWVvdXRfY2hlY2spCisJCW9sX3J4X2RlZnJhZ193YWl0bGlzdF9yZW1vdmUocGVlciwgdGlkKTsKKworCWlmIChhbGxfZnJhZ19wcmVzZW50KSB7CisJCW9sX3J4X2RlZnJhZyhwZGV2LCBwZWVyLCB0aWQsIHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCk7CisJCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCA9IE5VTEw7CisJCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+dGFpbCA9IE5VTEw7CisJCXBlZXItPnRpZHNfcnhfcmVvcmRlclt0aWRdLmRlZnJhZ190aW1lb3V0X21zID0gMDsKKwkJcGVlci0+dGlkc19sYXN0X3NlcVt0aWRdID0gc2VxX251bTsKKwl9IGVsc2UgaWYgKHBkZXYtPnJ4LmZsYWdzLmRlZnJhZ190aW1lb3V0X2NoZWNrKSB7CisJCXVpbnQzMl90IG5vd19tcyA9IGNkZl9zeXN0ZW1fdGlja3NfdG9fbXNlY3MoY2RmX3N5c3RlbV90aWNrcygpKTsKKworCQlwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS5kZWZyYWdfdGltZW91dF9tcyA9CisJCQlub3dfbXMgKyBwZGV2LT5yeC5kZWZyYWcudGltZW91dF9tczsKKwkJb2xfcnhfZGVmcmFnX3dhaXRsaXN0X2FkZChwZWVyLCB0aWQpOworCX0KK30KKworLyoKKyAqIEluc2VydCBhbmQgc3RvcmUgZnJhZ21lbnRzCisgKi8KK3ZvaWQKK29sX3J4X2ZyYWdsaXN0X2luc2VydChodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsCisJCSAgICAgIGNkZl9uYnVmX3QgKmhlYWRfYWRkciwKKwkJICAgICAgY2RmX25idWZfdCAqdGFpbF9hZGRyLAorCQkgICAgICBjZGZfbmJ1Zl90IGZyYWcsIHVpbnQ4X3QgKmFsbF9mcmFnX3ByZXNlbnQpCit7CisJY2RmX25idWZfdCBuZXh0LCBwcmV2ID0gTlVMTCwgY3VyID0gKmhlYWRfYWRkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICptYWNfaGRyLCAqY21hY19oZHIsICpuZXh0X2hkciwgKmxtYWNfaGRyOworCXVpbnQ4X3QgZnJhZ25vLCBjdXJfZnJhZ25vLCBsZnJhZ25vLCBuZXh0X2ZyYWdubzsKKwl1aW50OF90IGxhc3RfbW9yZWZyYWcgPSAxLCBjb3VudCA9IDA7CisJY2RmX25idWZfdCBmcmFnX2Nsb25lOworCisJY2RmX2Fzc2VydChmcmFnKTsKKwlmcmFnX2Nsb25lID0gT0xfUlhfRlJBR19DTE9ORShmcmFnKTsKKwlmcmFnID0gZnJhZ19jbG9uZSA/IGZyYWdfY2xvbmUgOiBmcmFnOworCisJbWFjX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopCisJCW9sX3J4X2ZyYWdfZ2V0X21hY19oZHIoaHR0X3BkZXYsIGZyYWcpOworCWZyYWdubyA9IGNkZl9sZTE2X3RvX2NwdSgqKHVpbnQxNl90ICopIG1hY19oZHItPmlfc2VxKSAmCisJCUlFRUU4MDIxMV9TRVFfRlJBR19NQVNLOworCisJaWYgKCEoKmhlYWRfYWRkcikpIHsKKwkJKmhlYWRfYWRkciA9IGZyYWc7CisJCSp0YWlsX2FkZHIgPSBmcmFnOworCQljZGZfbmJ1Zl9zZXRfbmV4dCgqdGFpbF9hZGRyLCBOVUxMKTsKKwkJcmV0dXJuOworCX0KKwkvKiBGb3IgZWZmaWNpZW5jeSwgY29tcGFyZSB3aXRoIHRhaWwgZmlyc3QgKi8KKwlsbWFjX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopCisJCW9sX3J4X2ZyYWdfZ2V0X21hY19oZHIoaHR0X3BkZXYsICp0YWlsX2FkZHIpOworCWxmcmFnbm8gPSBjZGZfbGUxNl90b19jcHUoKih1aW50MTZfdCAqKSBsbWFjX2hkci0+aV9zZXEpICYKKwkJICBJRUVFODAyMTFfU0VRX0ZSQUdfTUFTSzsKKwlpZiAoZnJhZ25vID4gbGZyYWdubykgeworCQljZGZfbmJ1Zl9zZXRfbmV4dCgqdGFpbF9hZGRyLCBmcmFnKTsKKwkJKnRhaWxfYWRkciA9IGZyYWc7CisJCWNkZl9uYnVmX3NldF9uZXh0KCp0YWlsX2FkZHIsIE5VTEwpOworCX0gZWxzZSB7CisJCWRvIHsKKwkJCWNtYWNfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKikKKwkJCQlvbF9yeF9mcmFnX2dldF9tYWNfaGRyKGh0dF9wZGV2LCBjdXIpOworCQkJY3VyX2ZyYWdubyA9CisJCQkJY2RmX2xlMTZfdG9fY3B1KCoodWludDE2X3QgKikgY21hY19oZHItPmlfc2VxKSAmCisJCQkJSUVFRTgwMjExX1NFUV9GUkFHX01BU0s7CisJCQlwcmV2ID0gY3VyOworCQkJY3VyID0gY2RmX25idWZfbmV4dChjdXIpOworCQl9IHdoaWxlIChmcmFnbm8gPiBjdXJfZnJhZ25vKTsKKworCQlpZiAoZnJhZ25vID09IGN1cl9mcmFnbm8pIHsKKwkJCWh0dF9yeF9kZXNjX2ZyYW1lX2ZyZWUoaHR0X3BkZXYsIGZyYWcpOworCQkJKmFsbF9mcmFnX3ByZXNlbnQgPSAwOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJY2RmX25idWZfc2V0X25leHQocHJldiwgZnJhZyk7CisJCQljZGZfbmJ1Zl9zZXRfbmV4dChmcmFnLCBjdXIpOworCQl9CisJfQorCW5leHQgPSBjZGZfbmJ1Zl9uZXh0KCpoZWFkX2FkZHIpOworCWxtYWNfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKilvbF9yeF9mcmFnX2dldF9tYWNfaGRyKGh0dF9wZGV2LAorCQkJCQkJCQkgICAgKnRhaWxfYWRkcik7CisJbGFzdF9tb3JlZnJhZyA9IGxtYWNfaGRyLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9NT1JFX0ZSQUc7CisJaWYgKCFsYXN0X21vcmVmcmFnKSB7CisJCWRvIHsKKwkJCW5leHRfaGRyID0KKwkJCQkoc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKQorCQkJCW9sX3J4X2ZyYWdfZ2V0X21hY19oZHIoaHR0X3BkZXYsIG5leHQpOworCQkJbmV4dF9mcmFnbm8gPQorCQkJCWNkZl9sZTE2X3RvX2NwdSgqKHVpbnQxNl90ICopIG5leHRfaGRyLT5pX3NlcSkgJgorCQkJCUlFRUU4MDIxMV9TRVFfRlJBR19NQVNLOworCQkJY291bnQrKzsKKwkJCWlmIChuZXh0X2ZyYWdubyAhPSBjb3VudCkKKwkJCQlicmVhazsKKworCQkJbmV4dCA9IGNkZl9uYnVmX25leHQobmV4dCk7CisJCX0gd2hpbGUgKG5leHQpOworCisJCWlmICghbmV4dCkgeworCQkJKmFsbF9mcmFnX3ByZXNlbnQgPSAxOworCQkJcmV0dXJuOworCQl9CisJfQorCSphbGxfZnJhZ19wcmVzZW50ID0gMDsKK30KKworLyoKKyAqIGFkZCB0aWQgdG8gcGVuZGluZyBmcmFnbWVudCB3YWl0IGxpc3QKKyAqLwordm9pZCBvbF9yeF9kZWZyYWdfd2FpdGxpc3RfYWRkKHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwgdW5zaWduZWQgdGlkKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHBlZXItPnZkZXYtPnBkZXY7CisJc3RydWN0IG9sX3J4X3Jlb3JkZXJfdCAqcnhfcmVvcmRlciA9ICZwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXTsKKworCVRBSUxRX0lOU0VSVF9UQUlMKCZwZGV2LT5yeC5kZWZyYWcud2FpdGxpc3QsIHJ4X3Jlb3JkZXIsCisJCQkgIGRlZnJhZ193YWl0bGlzdF9lbGVtKTsKK30KKworLyoKKyAqIHJlbW92ZSB0aWQgZnJvbSBwZW5kaW5nIGZyYWdtZW50IHdhaXQgbGlzdAorICovCit2b2lkIG9sX3J4X2RlZnJhZ193YWl0bGlzdF9yZW1vdmUoc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1bnNpZ25lZCB0aWQpCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gcGVlci0+dmRldi0+cGRldjsKKwlzdHJ1Y3Qgb2xfcnhfcmVvcmRlcl90ICpyeF9yZW9yZGVyID0gJnBlZXItPnRpZHNfcnhfcmVvcmRlclt0aWRdOworCisJaWYgKHJ4X3Jlb3JkZXItPmRlZnJhZ193YWl0bGlzdF9lbGVtLnRxZV9uZXh0ICE9IE5VTEwgfHwKKwkgICAgcnhfcmVvcmRlci0+ZGVmcmFnX3dhaXRsaXN0X2VsZW0udHFlX3ByZXYgIT0gTlVMTCkgeworCisJCVRBSUxRX1JFTU9WRSgmcGRldi0+cnguZGVmcmFnLndhaXRsaXN0LCByeF9yZW9yZGVyLAorCQkJICAgICBkZWZyYWdfd2FpdGxpc3RfZWxlbSk7CisKKwkJcnhfcmVvcmRlci0+ZGVmcmFnX3dhaXRsaXN0X2VsZW0udHFlX25leHQgPSBOVUxMOworCQlyeF9yZW9yZGVyLT5kZWZyYWdfd2FpdGxpc3RfZWxlbS50cWVfcHJldiA9IE5VTEw7CisJfQorfQorCisjaWZuZGVmIGNvbnRhaW5lcl9vZgorI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpIFwKKwkoKHR5cGUgKikoKGNoYXIgKikocHRyKSAtIChjaGFyICopKCYoKHR5cGUgKikwKS0+bWVtYmVyKSkpCisjZW5kaWYKKworLyoKKyAqIGZsdXNoIHN0YWxlIGZyYWdtZW50cyBmcm9tIHRoZSB3YWl0bGlzdAorICovCit2b2lkIG9sX3J4X2RlZnJhZ193YWl0bGlzdF9mbHVzaChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpCit7CisJc3RydWN0IG9sX3J4X3Jlb3JkZXJfdCAqcnhfcmVvcmRlciwgKnRtcDsKKwl1aW50MzJfdCBub3dfbXMgPSBjZGZfc3lzdGVtX3RpY2tzX3RvX21zZWNzKGNkZl9zeXN0ZW1fdGlja3MoKSk7CisKKwlUQUlMUV9GT1JFQUNIX1NBRkUocnhfcmVvcmRlciwgJnBkZXYtPnJ4LmRlZnJhZy53YWl0bGlzdCwKKwkJCSAgIGRlZnJhZ193YWl0bGlzdF9lbGVtLCB0bXApIHsKKwkJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyOworCQlzdHJ1Y3Qgb2xfcnhfcmVvcmRlcl90ICpyeF9yZW9yZGVyX2Jhc2U7CisJCXVuc2lnbmVkIHRpZDsKKworCQlpZiAocnhfcmVvcmRlci0+ZGVmcmFnX3RpbWVvdXRfbXMgPiBub3dfbXMpCisJCQlicmVhazsKKworCQl0aWQgPSByeF9yZW9yZGVyLT50aWQ7CisJCS8qIGdldCBpbmRleCAwIG9mIHRoZSByeF9yZW9yZGVyIGFycmF5ICovCisJCXJ4X3Jlb3JkZXJfYmFzZSA9IHJ4X3Jlb3JkZXIgLSB0aWQ7CisJCXBlZXIgPQorCQkJY29udGFpbmVyX29mKHJ4X3Jlb3JkZXJfYmFzZSwgc3RydWN0IG9sX3R4cnhfcGVlcl90LAorCQkJCSAgICAgdGlkc19yeF9yZW9yZGVyWzBdKTsKKworCQlvbF9yeF9kZWZyYWdfd2FpdGxpc3RfcmVtb3ZlKHBlZXIsIHRpZCk7CisJCW9sX3J4X3Jlb3JkZXJfZmx1c2hfZnJhZyhwZGV2LT5odHRfcGRldiwgcGVlciwgdGlkLAorCQkJCQkgMCAvKiBmcmFncyBhbHdheXMgc3RvcmVkIGF0IHNlcSAwICovKTsKKwl9Cit9CisKKy8qCisgKiBIYW5kbGluZyBzZWN1cml0eSBjaGVja2luZyBhbmQgcHJvY2Vzc2luZyBmcmFnbWVudHMKKyAqLwordm9pZAorb2xfcnhfZGVmcmFnKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkgICAgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwgdW5zaWduZWQgdGlkLCBjZGZfbmJ1Zl90IGZyYWdfbGlzdCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYgPSBOVUxMOworCWNkZl9uYnVmX3QgdG1wX25leHQsIG1zZHUsIHByZXYgPSBOVUxMLCBjdXIgPSBmcmFnX2xpc3Q7CisJdWludDhfdCBpbmRleCwgdGtpcF9kZW1pYyA9IDA7CisJdWludDE2X3QgaGRyX3NwYWNlOworCXZvaWQgKnJ4X2Rlc2M7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2g7CisJdWludDhfdCBrZXlbREVGUkFHX0lFRUU4MDIxMV9LRVlfTEVOXTsKKworCWh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiA9IHBkZXYtPmh0dF9wZGV2OworCXZkZXYgPSBwZWVyLT52ZGV2OworCisJLyogYnlwYXNzIGRlZnJhZyBmb3Igc2FmZSBtb2RlICovCisJaWYgKHZkZXYtPnNhZmVtb2RlKSB7CisJCWlmIChvbF9jZmdfaXNfZnVsbF9yZW9yZGVyX29mZmxvYWQocGRldi0+Y3RybF9wZGV2KSkKKwkJCW9sX3J4X2luX29yZGVyX2RlbGl2ZXIodmRldiwgcGVlciwgdGlkLCBmcmFnX2xpc3QpOworCQllbHNlCisJCQlvbF9yeF9kZWxpdmVyKHZkZXYsIHBlZXIsIHRpZCwgZnJhZ19saXN0KTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChjdXIpIHsKKwkJdG1wX25leHQgPSBjZGZfbmJ1Zl9uZXh0KGN1cik7CisJCWNkZl9uYnVmX3NldF9uZXh0KGN1ciwgTlVMTCk7CisJCWlmICghb2xfcnhfcG5fY2hlY2tfYmFzZSh2ZGV2LCBwZWVyLCB0aWQsIGN1cikpIHsKKwkJCS8qIFBOIGNoZWNrIGZhaWxlZCxkaXNjYXJkIGZyYWdzICovCisJCQlpZiAocHJldikgeworCQkJCWNkZl9uYnVmX3NldF9uZXh0KHByZXYsIE5VTEwpOworCQkJCW9sX3J4X2ZyYW1lc19mcmVlKGh0dF9wZGV2LCBmcmFnX2xpc3QpOworCQkJfQorCQkJb2xfcnhfZnJhbWVzX2ZyZWUoaHR0X3BkZXYsIHRtcF9uZXh0KTsKKwkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkJICAgIm9sX3J4X2RlZnJhZzogUE4gQ2hlY2sgZmFpbGVkXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiByZW1vdmUgRkNTIGZyb20gZWFjaCBmcmFnbWVudCAqLworCQljZGZfbmJ1Zl90cmltX3RhaWwoY3VyLCBERUZSQUdfSUVFRTgwMjExX0ZDU19MRU4pOworCQlwcmV2ID0gY3VyOworCQljZGZfbmJ1Zl9zZXRfbmV4dChjdXIsIHRtcF9uZXh0KTsKKwkJY3VyID0gdG1wX25leHQ7CisJfQorCWN1ciA9IGZyYWdfbGlzdDsKKwl3aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopb2xfcnhfZnJhZ19nZXRfbWFjX2hkcihodHRfcGRldiwgY3VyKTsKKwloZHJfc3BhY2UgPSBvbF9yeF9mcmFnX2hkcnNpemUod2gpOworCXJ4X2Rlc2MgPSBodHRfcnhfbXNkdV9kZXNjX3JldHJpZXZlKGh0dF9wZGV2LCBmcmFnX2xpc3QpOworCWNkZl9hc3NlcnQoaHR0X3J4X21zZHVfaGFzX3dsYW5fbWNhc3RfZmxhZyhodHRfcGRldiwgcnhfZGVzYykpOworCWluZGV4ID0gaHR0X3J4X21zZHVfaXNfd2xhbl9tY2FzdChodHRfcGRldiwgcnhfZGVzYykgPworCQl0eHJ4X3NlY19tY2FzdCA6IHR4cnhfc2VjX3VjYXN0OworCisJc3dpdGNoIChwZWVyLT5zZWN1cml0eVtpbmRleF0uc2VjX3R5cGUpIHsKKwljYXNlIGh0dF9zZWNfdHlwZV90a2lwOgorCQl0a2lwX2RlbWljID0gMTsKKwkvKiBmYWxsLXRocm91Z2ggdG8gcmVzdCBvZiB0a2lwIG9wcyAqLworCWNhc2UgaHR0X3NlY190eXBlX3RraXBfbm9taWM6CisJCXdoaWxlIChjdXIpIHsKKwkJCXRtcF9uZXh0ID0gY2RmX25idWZfbmV4dChjdXIpOworCQkJaWYgKCFvbF9yeF9mcmFnX3RraXBfZGVjYXAocGRldiwgY3VyLCBoZHJfc3BhY2UpKSB7CisJCQkJLyogVEtJUCBkZWNhcCBmYWlsZWQsIGRpc2NhcmQgZnJhZ3MgKi8KKwkJCQlvbF9yeF9mcmFtZXNfZnJlZShodHRfcGRldiwgZnJhZ19saXN0KTsKKwkJCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJCQkgICAiXG4gb2xfcnhfZGVmcmFnOiBUS0lQIGRlY2FwIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJY3VyID0gdG1wX25leHQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGh0dF9zZWNfdHlwZV9hZXNfY2NtcDoKKwkJd2hpbGUgKGN1cikgeworCQkJdG1wX25leHQgPSBjZGZfbmJ1Zl9uZXh0KGN1cik7CisJCQlpZiAoIW9sX3J4X2ZyYWdfY2NtcF9kZW1pYyhwZGV2LCBjdXIsIGhkcl9zcGFjZSkpIHsKKwkJCQkvKiBDQ01QIGRlbWljIGZhaWxlZCwgZGlzY2FyZCBmcmFncyAqLworCQkJCW9sX3J4X2ZyYW1lc19mcmVlKGh0dF9wZGV2LCBmcmFnX2xpc3QpOworCQkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkJCSAgICJcbiBvbF9yeF9kZWZyYWc6IENDTVAgZGVtaWMgZmFpbGVkXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoIW9sX3J4X2ZyYWdfY2NtcF9kZWNhcChwZGV2LCBjdXIsIGhkcl9zcGFjZSkpIHsKKwkJCQkvKiBDQ01QIGRlY2FwIGZhaWxlZCwgZGlzY2FyZCBmcmFncyAqLworCQkJCW9sX3J4X2ZyYW1lc19mcmVlKGh0dF9wZGV2LCBmcmFnX2xpc3QpOworCQkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkJCSAgICJcbiBvbF9yeF9kZWZyYWc6IENDTVAgZGVjYXAgZmFpbGVkXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQljdXIgPSB0bXBfbmV4dDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgaHR0X3NlY190eXBlX3dlcDQwOgorCWNhc2UgaHR0X3NlY190eXBlX3dlcDEwNDoKKwljYXNlIGh0dF9zZWNfdHlwZV93ZXAxMjg6CisJCXdoaWxlIChjdXIpIHsKKwkJCXRtcF9uZXh0ID0gY2RmX25idWZfbmV4dChjdXIpOworCQkJaWYgKCFvbF9yeF9mcmFnX3dlcF9kZWNhcChwZGV2LCBjdXIsIGhkcl9zcGFjZSkpIHsKKwkJCQkvKiB3ZXAgZGVjYXAgZmFpbGVkLCBkaXNjYXJkIGZyYWdzICovCisJCQkJb2xfcnhfZnJhbWVzX2ZyZWUoaHR0X3BkZXYsIGZyYWdfbGlzdCk7CisJCQkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJCQkJICAgIlxuIG9sX3J4X2RlZnJhZzogd2VwIGRlY2FwIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJY3VyID0gdG1wX25leHQ7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwltc2R1ID0gb2xfcnhfZGVmcmFnX2RlY2FwX3JlY29tYmluZShodHRfcGRldiwgZnJhZ19saXN0LCBoZHJfc3BhY2UpOworCWlmICghbXNkdSkKKwkJcmV0dXJuOworCisJaWYgKHRraXBfZGVtaWMpIHsKKwkJY2RmX21lbV9jb3B5KGtleSwKKwkJCSAgICAgcGVlci0+c2VjdXJpdHlbaW5kZXhdLm1pY2hhZWxfa2V5LAorCQkJICAgICBzaXplb2YocGVlci0+c2VjdXJpdHlbaW5kZXhdLm1pY2hhZWxfa2V5KSk7CisJCWlmICghb2xfcnhfZnJhZ190a2lwX2RlbWljKHBkZXYsIGtleSwgbXNkdSwgaGRyX3NwYWNlKSkgeworCQkJaHR0X3J4X2Rlc2NfZnJhbWVfZnJlZShodHRfcGRldiwgbXNkdSk7CisJCQlvbF9yeF9lcnIocGRldi0+Y3RybF9wZGV2LAorCQkJCSAgdmRldi0+dmRldl9pZCwgcGVlci0+bWFjX2FkZHIucmF3LCB0aWQsIDAsCisJCQkJICBPTF9SWF9ERUZSQUdfRVJSLCBtc2R1LCBOVUxMLCAwKTsKKwkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkJICAgIlxuIG9sX3J4X2RlZnJhZzogVEtJUCBkZW1pYyBmYWlsZWRcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKilvbF9yeF9mcmFnX2dldF9tYWNfaGRyKGh0dF9wZGV2LCBtc2R1KTsKKwlpZiAoREVGUkFHX0lFRUU4MDIxMV9RT1NfSEFTX1NFUSh3aCkpCisJCW9sX3J4X2RlZnJhZ19xb3NfZGVjYXAocGRldiwgbXNkdSwgaGRyX3NwYWNlKTsKKwlpZiAob2xfY2ZnX2ZyYW1lX3R5cGUocGRldi0+Y3RybF9wZGV2KSA9PSB3bGFuX2ZybV9mbXRfODAyXzMpCisJCW9sX3J4X2RlZnJhZ19ud2lmaV90b184MDIzKHBkZXYsIG1zZHUpOworCisJb2xfcnhfZndkX2NoZWNrKHZkZXYsIHBlZXIsIHRpZCwgbXNkdSk7Cit9CisKKy8qCisgKiBIYW5kbGluZyBUS0lQIHByb2Nlc3NpbmcgZm9yIGRlZnJhZ21lbnRhdGlvbgorICovCitpbnQKK29sX3J4X2ZyYWdfdGtpcF9kZWNhcChvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgICAgIGNkZl9uYnVmX3QgbXNkdSwgdWludDE2X3QgaGRybGVuKQoreworCXVpbnQ4X3QgKml2cCwgKm9yaWdIZHI7CisKKwl2b2lkICpyeF9kZXNjX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJdm9pZCAqaW5kX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJaW50IHJ4X2Rlc2NfbGVuID0gMDsKKworCW9sX3J4X2ZyYWdfZGVzY19hZGp1c3QocGRldiwKKwkJCSAgICAgICBtc2R1LAorCQkJICAgICAgICZyeF9kZXNjX29sZF9wb3NpdGlvbiwKKwkJCSAgICAgICAmaW5kX29sZF9wb3NpdGlvbiwgJnJ4X2Rlc2NfbGVuKTsKKwkvKiBIZWFkZXIgc2hvdWxkIGhhdmUgZXh0ZW5kZWQgSVYgKi8KKwlvcmlnSGRyID0gKHVpbnQ4X3QgKikgKGNkZl9uYnVmX2RhdGEobXNkdSkgKyByeF9kZXNjX2xlbik7CisKKwlpdnAgPSBvcmlnSGRyICsgaGRybGVuOworCWlmICghKGl2cFtJRUVFODAyMTFfV0VQX0lWTEVOXSAmIElFRUU4MDIxMV9XRVBfRVhUSVYpKQorCQlyZXR1cm4gT0xfUlhfREVGUkFHX0VSUjsKKworCWNkZl9tZW1fbW92ZShvcmlnSGRyICsgZl90a2lwLmljX2hlYWRlciwgb3JpZ0hkciwgaGRybGVuKTsKKwljZGZfbmJ1Zl9wdWxsX2hlYWQobXNkdSwgZl90a2lwLmljX2hlYWRlcik7CisJY2RmX25idWZfdHJpbV90YWlsKG1zZHUsIGZfdGtpcC5pY190cmFpbGVyKTsKKwlyZXR1cm4gT0xfUlhfREVGUkFHX09LOworfQorCisvKgorICogSGFuZGxpbmcgV0VQIHByb2Nlc3NpbmcgZm9yIGRlZnJhZ21lbnRhdGlvbgorICovCitpbnQKK29sX3J4X2ZyYWdfd2VwX2RlY2FwKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgY2RmX25idWZfdCBtc2R1LCB1aW50MTZfdCBoZHJsZW4pCit7CisJdWludDhfdCAqb3JpZ0hkcjsKKwl2b2lkICpyeF9kZXNjX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJdm9pZCAqaW5kX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJaW50IHJ4X2Rlc2NfbGVuID0gMDsKKworCW9sX3J4X2ZyYWdfZGVzY19hZGp1c3QocGRldiwKKwkJCSAgICAgICBtc2R1LAorCQkJICAgICAgICZyeF9kZXNjX29sZF9wb3NpdGlvbiwKKwkJCSAgICAgICAmaW5kX29sZF9wb3NpdGlvbiwgJnJ4X2Rlc2NfbGVuKTsKKwlvcmlnSGRyID0gKHVpbnQ4X3QgKikgKGNkZl9uYnVmX2RhdGEobXNkdSkgKyByeF9kZXNjX2xlbik7CisJY2RmX21lbV9tb3ZlKG9yaWdIZHIgKyBmX3dlcC5pY19oZWFkZXIsIG9yaWdIZHIsIGhkcmxlbik7CisJY2RmX25idWZfcHVsbF9oZWFkKG1zZHUsIGZfd2VwLmljX2hlYWRlcik7CisJY2RmX25idWZfdHJpbV90YWlsKG1zZHUsIGZfd2VwLmljX3RyYWlsZXIpOworCXJldHVybiBPTF9SWF9ERUZSQUdfT0s7Cit9CisKKy8qCisgKiBWZXJpZnkgYW5kIHN0cmlwIE1JQyBmcm9tIHRoZSBmcmFtZS4KKyAqLworaW50CitvbF9yeF9mcmFnX3RraXBfZGVtaWMob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LCBjb25zdCB1aW50OF90ICprZXksCisJCSAgICAgIGNkZl9uYnVmX3QgbXNkdSwgdWludDE2X3QgaGRybGVuKQoreworCWludCBzdGF0dXM7CisJdWludDMyX3QgcGt0bGVuOworCXVpbnQ4X3QgbWljW0lFRUU4MDIxMV9XRVBfTUlDTEVOXTsKKwl1aW50OF90IG1pYzBbSUVFRTgwMjExX1dFUF9NSUNMRU5dOworCXZvaWQgKnJ4X2Rlc2Nfb2xkX3Bvc2l0aW9uID0gTlVMTDsKKwl2b2lkICppbmRfb2xkX3Bvc2l0aW9uID0gTlVMTDsKKwlpbnQgcnhfZGVzY19sZW4gPSAwOworCisJb2xfcnhfZnJhZ19kZXNjX2FkanVzdChwZGV2LAorCQkJICAgICAgIG1zZHUsCisJCQkgICAgICAgJnJ4X2Rlc2Nfb2xkX3Bvc2l0aW9uLAorCQkJICAgICAgICZpbmRfb2xkX3Bvc2l0aW9uLCAmcnhfZGVzY19sZW4pOworCisJcGt0bGVuID0gb2xfcnhfZGVmcmFnX2xlbihtc2R1KSAtIHJ4X2Rlc2NfbGVuOworCisJc3RhdHVzID0gb2xfcnhfZGVmcmFnX21pYyhwZGV2LCBrZXksIG1zZHUsIGhkcmxlbiwKKwkJCQkgIHBrdGxlbiAtIChoZHJsZW4gKyBmX3RraXAuaWNfbWljbGVuKSwgbWljKTsKKwlpZiAoc3RhdHVzICE9IE9MX1JYX0RFRlJBR19PSykKKwkJcmV0dXJuIE9MX1JYX0RFRlJBR19FUlI7CisKKwlvbF9yeF9kZWZyYWdfY29weWRhdGEobXNkdSwgcGt0bGVuIC0gZl90a2lwLmljX21pY2xlbiArIHJ4X2Rlc2NfbGVuLAorCQkJICAgICAgZl90a2lwLmljX21pY2xlbiwgKGNhZGRyX3QpIG1pYzApOworCWlmIChjZGZfbWVtX2NvbXBhcmUobWljLCBtaWMwLCBmX3RraXAuaWNfbWljbGVuKSkKKwkJcmV0dXJuIE9MX1JYX0RFRlJBR19FUlI7CisKKwljZGZfbmJ1Zl90cmltX3RhaWwobXNkdSwgZl90a2lwLmljX21pY2xlbik7CisJcmV0dXJuIE9MX1JYX0RFRlJBR19PSzsKK30KKworLyoKKyAqIEhhbmRsaW5nIENDTVAgcHJvY2Vzc2luZyBmb3IgZGVmcmFnbWVudGF0aW9uCisgKi8KK2ludAorb2xfcnhfZnJhZ19jY21wX2RlY2FwKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgICAgY2RmX25idWZfdCBuYnVmLCB1aW50MTZfdCBoZHJsZW4pCit7CisJdWludDhfdCAqaXZwLCAqb3JpZ0hkcjsKKwl2b2lkICpyeF9kZXNjX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJdm9pZCAqaW5kX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJaW50IHJ4X2Rlc2NfbGVuID0gMDsKKworCW9sX3J4X2ZyYWdfZGVzY19hZGp1c3QocGRldiwKKwkJCSAgICAgICBuYnVmLAorCQkJICAgICAgICZyeF9kZXNjX29sZF9wb3NpdGlvbiwKKwkJCSAgICAgICAmaW5kX29sZF9wb3NpdGlvbiwgJnJ4X2Rlc2NfbGVuKTsKKworCW9yaWdIZHIgPSAodWludDhfdCAqKSAoY2RmX25idWZfZGF0YShuYnVmKSArIHJ4X2Rlc2NfbGVuKTsKKwlpdnAgPSBvcmlnSGRyICsgaGRybGVuOworCWlmICghKGl2cFtJRUVFODAyMTFfV0VQX0lWTEVOXSAmIElFRUU4MDIxMV9XRVBfRVhUSVYpKQorCQlyZXR1cm4gT0xfUlhfREVGUkFHX0VSUjsKKworCWNkZl9tZW1fbW92ZShvcmlnSGRyICsgZl9jY21wLmljX2hlYWRlciwgb3JpZ0hkciwgaGRybGVuKTsKKwljZGZfbmJ1Zl9wdWxsX2hlYWQobmJ1ZiwgZl9jY21wLmljX2hlYWRlcik7CisKKwlyZXR1cm4gT0xfUlhfREVGUkFHX09LOworfQorCisvKgorICogVmVyaWZ5IGFuZCBzdHJpcCBNSUMgZnJvbSB0aGUgZnJhbWUuCisgKi8KK2ludAorb2xfcnhfZnJhZ19jY21wX2RlbWljKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgICAgY2RmX25idWZfdCB3YnVmLCB1aW50MTZfdCBoZHJsZW4pCit7CisJdWludDhfdCAqaXZwLCAqb3JpZ0hkcjsKKwl2b2lkICpyeF9kZXNjX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJdm9pZCAqaW5kX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJaW50IHJ4X2Rlc2NfbGVuID0gMDsKKworCW9sX3J4X2ZyYWdfZGVzY19hZGp1c3QocGRldiwKKwkJCSAgICAgICB3YnVmLAorCQkJICAgICAgICZyeF9kZXNjX29sZF9wb3NpdGlvbiwKKwkJCSAgICAgICAmaW5kX29sZF9wb3NpdGlvbiwgJnJ4X2Rlc2NfbGVuKTsKKworCW9yaWdIZHIgPSAodWludDhfdCAqKSAoY2RmX25idWZfZGF0YSh3YnVmKSArIHJ4X2Rlc2NfbGVuKTsKKworCWl2cCA9IG9yaWdIZHIgKyBoZHJsZW47CisJaWYgKCEoaXZwW0lFRUU4MDIxMV9XRVBfSVZMRU5dICYgSUVFRTgwMjExX1dFUF9FWFRJVikpCisJCXJldHVybiBPTF9SWF9ERUZSQUdfRVJSOworCisJY2RmX25idWZfdHJpbV90YWlsKHdidWYsIGZfY2NtcC5pY190cmFpbGVyKTsKKworCXJldHVybiBPTF9SWF9ERUZSQUdfT0s7Cit9CisKKy8qCisgKiBDcmFmdCBwc2V1ZG8gaGVhZGVyIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBNSUMuCisgKi8KK3ZvaWQgb2xfcnhfZGVmcmFnX21pY2hkcihjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aDAsIHVpbnQ4X3QgaGRyW10pCit7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9mcmFtZV9hZGRyNCAqd2ggPQorCQkoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9mcmFtZV9hZGRyNCAqKXdoMDsKKworCXN3aXRjaCAod2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX0RJUl9NQVNLKSB7CisJY2FzZSBJRUVFODAyMTFfRkMxX0RJUl9OT0RTOgorCQlERUZSQUdfSUVFRTgwMjExX0FERFJfQ09QWShoZHIsIHdoLT5pX2FkZHIxKTsgICAvKiBEQSAqLworCQlERUZSQUdfSUVFRTgwMjExX0FERFJfQ09QWShoZHIgKyBJRUVFODAyMTFfQUREUl9MRU4sCisJCQkJCSAgIHdoLT5pX2FkZHIyKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkMxX0RJUl9UT0RTOgorCQlERUZSQUdfSUVFRTgwMjExX0FERFJfQ09QWShoZHIsIHdoLT5pX2FkZHIzKTsgICAvKiBEQSAqLworCQlERUZSQUdfSUVFRTgwMjExX0FERFJfQ09QWShoZHIgKyBJRUVFODAyMTFfQUREUl9MRU4sCisJCQkJCSAgIHdoLT5pX2FkZHIyKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkMxX0RJUl9GUk9NRFM6CisJCURFRlJBR19JRUVFODAyMTFfQUREUl9DT1BZKGhkciwgd2gtPmlfYWRkcjEpOyAgIC8qIERBICovCisJCURFRlJBR19JRUVFODAyMTFfQUREUl9DT1BZKGhkciArIElFRUU4MDIxMV9BRERSX0xFTiwKKwkJCQkJICAgd2gtPmlfYWRkcjMpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQzFfRElSX0RTVE9EUzoKKwkJREVGUkFHX0lFRUU4MDIxMV9BRERSX0NPUFkoaGRyLCB3aC0+aV9hZGRyMyk7ICAgLyogREEgKi8KKwkJREVGUkFHX0lFRUU4MDIxMV9BRERSX0NPUFkoaGRyICsgSUVFRTgwMjExX0FERFJfTEVOLAorCQkJCQkgICB3aC0+aV9hZGRyNCk7CisJCWJyZWFrOworCX0KKwkvKgorCSAqIEJpdCA3IGlzIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1MgZm9yIGRhdGEgZnJhbWUsIGJ1dAorCSAqIGl0IGNvdWxkIGFsc28gYmUgc2V0IGZvciBkZWF1dGgsIGRpc2Fzc29jLCBhY3Rpb24sIGV0Yy4gZm9yCisJICogYSBtZ3QgdHlwZSBmcmFtZS4gSXQgY29tZXMgaW50byBwaWN0dXJlIGZvciBNRlAuCisJICovCisJaWYgKHdoLT5pX2ZjWzBdICYgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUykgeworCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3Fvc2ZyYW1lICpxd2ggPQorCQkJKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcW9zZnJhbWUgKil3aDsKKwkJaGRyWzEyXSA9IHF3aC0+aV9xb3NbMF0gJiBJRUVFODAyMTFfUU9TX1RJRDsKKwl9IGVsc2UgeworCQloZHJbMTJdID0gMDsKKwl9CisJaGRyWzEzXSA9IGhkclsxNF0gPSBoZHJbMTVdID0gMDsgICAgICAgIC8qIHJlc2VydmVkICovCit9CisKKy8qCisgKiBNaWNoYWVsX21pYyBmb3IgZGVmcmFnbWVudGF0aW9uCisgKi8KK2ludAorb2xfcnhfZGVmcmFnX21pYyhvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCSBjb25zdCB1aW50OF90ICprZXksCisJCSBjZGZfbmJ1Zl90IHdidWYsCisJCSB1aW50MTZfdCBvZmYsIHVpbnQxNl90IGRhdGFfbGVuLCB1aW50OF90IG1pY1tdKQoreworCXVpbnQ4X3QgaGRyWzE2XSA9IHsgMCwgfTsKKwl1aW50MzJfdCBsLCByOworCWNvbnN0IHVpbnQ4X3QgKmRhdGE7CisJdWludDMyX3Qgc3BhY2U7CisJdm9pZCAqcnhfZGVzY19vbGRfcG9zaXRpb24gPSBOVUxMOworCXZvaWQgKmluZF9vbGRfcG9zaXRpb24gPSBOVUxMOworCWludCByeF9kZXNjX2xlbiA9IDA7CisKKwlvbF9yeF9mcmFnX2Rlc2NfYWRqdXN0KHBkZXYsCisJCQkgICAgICAgd2J1ZiwKKwkJCSAgICAgICAmcnhfZGVzY19vbGRfcG9zaXRpb24sCisJCQkgICAgICAgJmluZF9vbGRfcG9zaXRpb24sICZyeF9kZXNjX2xlbik7CisKKwlvbF9yeF9kZWZyYWdfbWljaGRyKChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopKGNkZl9uYnVmX2RhdGEod2J1ZikgKworCQkJCQkJICAgICAgIHJ4X2Rlc2NfbGVuKSwgaGRyKTsKKwlsID0gZ2V0X2xlMzIoa2V5KTsKKwlyID0gZ2V0X2xlMzIoa2V5ICsgNCk7CisKKwkvKiBNaWNoYWVsIE1JQyBwc2V1ZG8gaGVhZGVyOiBEQSwgU0EsIDMgeCAwLCBQcmlvcml0eSAqLworCWwgXj0gZ2V0X2xlMzIoaGRyKTsKKwltaWNoYWVsX2Jsb2NrKGwsIHIpOworCWwgXj0gZ2V0X2xlMzIoJmhkcls0XSk7CisJbWljaGFlbF9ibG9jayhsLCByKTsKKwlsIF49IGdldF9sZTMyKCZoZHJbOF0pOworCW1pY2hhZWxfYmxvY2sobCwgcik7CisJbCBePSBnZXRfbGUzMigmaGRyWzEyXSk7CisJbWljaGFlbF9ibG9jayhsLCByKTsKKworCS8qIGZpcnN0IGJ1ZmZlciBoYXMgc3BlY2lhbCBoYW5kbGluZyAqLworCWRhdGEgPSAodWludDhfdCAqKSBjZGZfbmJ1Zl9kYXRhKHdidWYpICsgcnhfZGVzY19sZW4gKyBvZmY7CisJc3BhY2UgPSBvbF9yeF9kZWZyYWdfbGVuKHdidWYpIC0gcnhfZGVzY19sZW4gLSBvZmY7CisJZm9yICg7OyApIHsKKwkJaWYgKHNwYWNlID4gZGF0YV9sZW4pCisJCQlzcGFjZSA9IGRhdGFfbGVuOworCisJCS8qIGNvbGxlY3QgMzItYml0IGJsb2NrcyBmcm9tIGN1cnJlbnQgYnVmZmVyICovCisJCXdoaWxlIChzcGFjZSA+PSBzaXplb2YodWludDMyX3QpKSB7CisJCQlsIF49IGdldF9sZTMyKGRhdGEpOworCQkJbWljaGFlbF9ibG9jayhsLCByKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCXNwYWNlIC09IHNpemVvZih1aW50MzJfdCk7CisJCQlkYXRhX2xlbiAtPSBzaXplb2YodWludDMyX3QpOworCQl9CisJCWlmIChkYXRhX2xlbiA8IHNpemVvZih1aW50MzJfdCkpCisJCQlicmVhazsKKworCQl3YnVmID0gY2RmX25idWZfbmV4dCh3YnVmKTsKKwkJaWYgKHdidWYgPT0gTlVMTCkKKwkJCXJldHVybiBPTF9SWF9ERUZSQUdfRVJSOworCisJCXJ4X2Rlc2NfbGVuID0gMDsKKworCQlpZiAoc3BhY2UgIT0gMCkgeworCQkJY29uc3QgdWludDhfdCAqZGF0YV9uZXh0OworCQkJLyoKKwkJCSAqIEJsb2NrIHN0cmFkZGxlcyBidWZmZXJzLCBzcGxpdCByZWZlcmVuY2VzLgorCQkJICovCisJCQlkYXRhX25leHQgPQorCQkJCSh1aW50OF90ICopIGNkZl9uYnVmX2RhdGEod2J1ZikgKyByeF9kZXNjX2xlbjsKKwkJCWlmICgob2xfcnhfZGVmcmFnX2xlbih3YnVmKSAtIHJ4X2Rlc2NfbGVuKSA8CisJCQkgICAgc2l6ZW9mKHVpbnQzMl90KSAtIHNwYWNlKSB7CisJCQkJcmV0dXJuIE9MX1JYX0RFRlJBR19FUlI7CisJCQl9CisJCQlzd2l0Y2ggKHNwYWNlKSB7CisJCQljYXNlIDE6CisJCQkJbCBePSBnZXRfbGUzMl9zcGxpdChkYXRhWzBdLCBkYXRhX25leHRbMF0sCisJCQkJCQkgICAgZGF0YV9uZXh0WzFdLCBkYXRhX25leHRbMl0pOworCQkJCWRhdGEgPSBkYXRhX25leHQgKyAzOworCQkJCXNwYWNlID0gKG9sX3J4X2RlZnJhZ19sZW4od2J1ZikgLSByeF9kZXNjX2xlbikKKwkJCQkJLSAzOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWwgXj0gZ2V0X2xlMzJfc3BsaXQoZGF0YVswXSwgZGF0YVsxXSwKKwkJCQkJCSAgICBkYXRhX25leHRbMF0sIGRhdGFfbmV4dFsxXSk7CisJCQkJZGF0YSA9IGRhdGFfbmV4dCArIDI7CisJCQkJc3BhY2UgPSAob2xfcnhfZGVmcmFnX2xlbih3YnVmKSAtIHJ4X2Rlc2NfbGVuKQorCQkJCQktIDI7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJbCBePSBnZXRfbGUzMl9zcGxpdChkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLAorCQkJCQkJICAgIGRhdGFfbmV4dFswXSk7CisJCQkJZGF0YSA9IGRhdGFfbmV4dCArIDE7CisJCQkJc3BhY2UgPSAob2xfcnhfZGVmcmFnX2xlbih3YnVmKSAtIHJ4X2Rlc2NfbGVuKQorCQkJCQktIDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQltaWNoYWVsX2Jsb2NrKGwsIHIpOworCQkJZGF0YV9sZW4gLT0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBTZXR1cCBmb3IgbmV4dCBidWZmZXIuCisJCQkgKi8KKwkJCWRhdGEgPSAodWludDhfdCAqKSBjZGZfbmJ1Zl9kYXRhKHdidWYpICsgcnhfZGVzY19sZW47CisJCQlzcGFjZSA9IG9sX3J4X2RlZnJhZ19sZW4od2J1ZikgLSByeF9kZXNjX2xlbjsKKwkJfQorCX0KKwkvKiBMYXN0IGJsb2NrIGFuZCBwYWRkaW5nICgweDVhLCA0Li43IHggMCkgKi8KKwlzd2l0Y2ggKGRhdGFfbGVuKSB7CisJY2FzZSAwOgorCQlsIF49IGdldF9sZTMyX3NwbGl0KDB4NWEsIDAsIDAsIDApOworCQlicmVhazsKKwljYXNlIDE6CisJCWwgXj0gZ2V0X2xlMzJfc3BsaXQoZGF0YVswXSwgMHg1YSwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbCBePSBnZXRfbGUzMl9zcGxpdChkYXRhWzBdLCBkYXRhWzFdLCAweDVhLCAwKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlsIF49IGdldF9sZTMyX3NwbGl0KGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIDB4NWEpOworCQlicmVhazsKKwl9CisJbWljaGFlbF9ibG9jayhsLCByKTsKKwltaWNoYWVsX2Jsb2NrKGwsIHIpOworCXB1dF9sZTMyKG1pYywgbCk7CisJcHV0X2xlMzIobWljICsgNCwgcik7CisKKwlyZXR1cm4gT0xfUlhfREVGUkFHX09LOworfQorCisvKgorICogQ2FsY3VsYXRlIGhlYWRlcnNpemUKKyAqLwordWludDE2X3Qgb2xfcnhfZnJhZ19oZHJzaXplKGNvbnN0IHZvaWQgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2ggPSAoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKWRhdGE7CisJdWludDE2X3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lKTsKKworCWlmICgod2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX0RJUl9NQVNLKSA9PSBJRUVFODAyMTFfRkMxX0RJUl9EU1RPRFMpCisJCXNpemUgKz0gSUVFRTgwMjExX0FERFJfTEVOOworCisJaWYgKERFRlJBR19JRUVFODAyMTFfUU9TX0hBU19TRVEod2gpKSB7CisJCXNpemUgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwkJaWYgKHdoLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9PUkRFUikKKwkJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRjKTsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiBSZWNvbWJpbmUgYW5kIGRlY2FwIGZyYWdtZW50cworICovCitjZGZfbmJ1Zl90CitvbF9yeF9kZWZyYWdfZGVjYXBfcmVjb21iaW5lKGh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiwKKwkJCSAgICAgY2RmX25idWZfdCBmcmFnX2xpc3QsIHVpbnQxNl90IGhkcnNpemUpCit7CisJY2RmX25idWZfdCB0bXA7CisJY2RmX25idWZfdCBtc2R1ID0gZnJhZ19saXN0OworCWNkZl9uYnVmX3QgcnhfbmJ1ZiA9IGZyYWdfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aDsKKworCW1zZHUgPSBjZGZfbmJ1Zl9uZXh0KG1zZHUpOworCWNkZl9uYnVmX3NldF9uZXh0KHJ4X25idWYsIE5VTEwpOworCXdoaWxlIChtc2R1KSB7CisJCWh0dF9yeF9tc2R1X2Rlc2NfZnJlZShodHRfcGRldiwgbXNkdSk7CisJCXRtcCA9IGNkZl9uYnVmX25leHQobXNkdSk7CisJCWNkZl9uYnVmX3NldF9uZXh0KG1zZHUsIE5VTEwpOworCQlvbF9yeF9mcmFnX3B1bGxfaGRyKGh0dF9wZGV2LCBtc2R1LCBoZHJzaXplKTsKKwkJaWYgKCFvbF9yeF9kZWZyYWdfY29uY2F0KHJ4X25idWYsIG1zZHUpKSB7CisJCQlvbF9yeF9mcmFtZXNfZnJlZShodHRfcGRldiwgdG1wKTsKKwkJCWh0dF9yeF9kZXNjX2ZyYW1lX2ZyZWUoaHR0X3BkZXYsIHJ4X25idWYpOworCQkJY2RmX25idWZfZnJlZShtc2R1KTsKKwkJCS8qIG1zZHUgcnggZGVzYyBhbHJlYWR5IGZyZWVkIGFib3ZlICovCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQltc2R1ID0gdG1wOworCX0KKwl3aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopb2xfcnhfZnJhZ19nZXRfbWFjX2hkcihodHRfcGRldiwKKwkJCQkJCQkgICAgICByeF9uYnVmKTsKKwl3aC0+aV9mY1sxXSAmPSB+SUVFRTgwMjExX0ZDMV9NT1JFX0ZSQUc7CisJKih1aW50MTZfdCAqKSB3aC0+aV9zZXEgJj0gfklFRUU4MDIxMV9TRVFfRlJBR19NQVNLOworCisJcmV0dXJuIHJ4X25idWY7Cit9CisKK3ZvaWQgb2xfcnhfZGVmcmFnX253aWZpX3RvXzgwMjMob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LCBjZGZfbmJ1Zl90IG1zZHUpCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSB3aDsKKwl1aW50MzJfdCBoZHJzaXplOworCXN0cnVjdCBsbGNfc25hcF9oZHJfdCBsbGNoZHI7CisJc3RydWN0IGV0aGVybmV0X2hkcl90ICpldGhfaGRyOworCXZvaWQgKnJ4X2Rlc2Nfb2xkX3Bvc2l0aW9uID0gTlVMTDsKKwl2b2lkICppbmRfb2xkX3Bvc2l0aW9uID0gTlVMTDsKKwlpbnQgcnhfZGVzY19sZW4gPSAwOworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoX3B0cjsKKworCW9sX3J4X2ZyYWdfZGVzY19hZGp1c3QocGRldiwKKwkJCSAgICAgICBtc2R1LAorCQkJICAgICAgICZyeF9kZXNjX29sZF9wb3NpdGlvbiwKKwkJCSAgICAgICAmaW5kX29sZF9wb3NpdGlvbiwgJnJ4X2Rlc2NfbGVuKTsKKworCXdoX3B0ciA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopKGNkZl9uYnVmX2RhdGEobXNkdSkgKyByeF9kZXNjX2xlbik7CisJY2RmX21lbV9jb3B5KCZ3aCwgd2hfcHRyLCBzaXplb2Yod2gpKTsKKwloZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUpOworCWNkZl9tZW1fY29weSgmbGxjaGRyLCAoKHVpbnQ4X3QgKikgKGNkZl9uYnVmX2RhdGEobXNkdSkgKworCQkJCQkgICAgcnhfZGVzY19sZW4pKSArIGhkcnNpemUsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHJfdCkpOworCisJLyoKKwkgKiBOb3cgbW92ZSB0aGUgZGF0YSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hYyBoZWFkZXIgOgorCSAqIG5ldy1oZWFkZXIgPSBvbGQtaGRyICsgKHdpZmhkcnNpemUgKyBsbGNoZHJzaXplIC0gZXRoaGRyc2l6ZSkKKwkgKi8KKwljZGZfbmJ1Zl9wdWxsX2hlYWQobXNkdSwgKHJ4X2Rlc2NfbGVuICsgaGRyc2l6ZSArCisJCQkJICBzaXplb2Yoc3RydWN0IGxsY19zbmFwX2hkcl90KSAtCisJCQkJICBzaXplb2Yoc3RydWN0IGV0aGVybmV0X2hkcl90KSkpOworCWV0aF9oZHIgPSAoc3RydWN0IGV0aGVybmV0X2hkcl90ICopKGNkZl9uYnVmX2RhdGEobXNkdSkpOworCXN3aXRjaCAod2guaV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfRElSX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9GQzFfRElSX05PRFM6CisJCWNkZl9tZW1fY29weShldGhfaGRyLT5kZXN0X2FkZHIsIHdoLmlfYWRkcjEsCisJCQkgICAgIElFRUU4MDIxMV9BRERSX0xFTik7CisJCWNkZl9tZW1fY29weShldGhfaGRyLT5zcmNfYWRkciwgd2guaV9hZGRyMiwgSUVFRTgwMjExX0FERFJfTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkMxX0RJUl9UT0RTOgorCQljZGZfbWVtX2NvcHkoZXRoX2hkci0+ZGVzdF9hZGRyLCB3aC5pX2FkZHIzLAorCQkJICAgICBJRUVFODAyMTFfQUREUl9MRU4pOworCQljZGZfbWVtX2NvcHkoZXRoX2hkci0+c3JjX2FkZHIsIHdoLmlfYWRkcjIsIElFRUU4MDIxMV9BRERSX0xFTik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDMV9ESVJfRlJPTURTOgorCQljZGZfbWVtX2NvcHkoZXRoX2hkci0+ZGVzdF9hZGRyLCB3aC5pX2FkZHIxLAorCQkJICAgICBJRUVFODAyMTFfQUREUl9MRU4pOworCQljZGZfbWVtX2NvcHkoZXRoX2hkci0+c3JjX2FkZHIsIHdoLmlfYWRkcjMsIElFRUU4MDIxMV9BRERSX0xFTik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTOgorCQlicmVhazsKKwl9CisKKwljZGZfbWVtX2NvcHkoZXRoX2hkci0+ZXRoZXJ0eXBlLCBsbGNoZHIuZXRoZXJ0eXBlLAorCQkgICAgIHNpemVvZihsbGNoZHIuZXRoZXJ0eXBlKSk7Cit9CisKKy8qCisgKiBIYW5kbGluZyBRT1MgZm9yIGRlZnJhZ21lbnRhdGlvbgorICovCit2b2lkCitvbF9yeF9kZWZyYWdfcW9zX2RlY2FwKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgICAgIGNkZl9uYnVmX3QgbmJ1ZiwgdWludDE2X3QgaGRybGVuKQoreworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoOworCXVpbnQxNl90IHFvc2xlbjsKKwl2b2lkICpyeF9kZXNjX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJdm9pZCAqaW5kX29sZF9wb3NpdGlvbiA9IE5VTEw7CisJaW50IHJ4X2Rlc2NfbGVuID0gMDsKKworCW9sX3J4X2ZyYWdfZGVzY19hZGp1c3QocGRldiwKKwkJCSAgICAgICBuYnVmLAorCQkJICAgICAgICZyeF9kZXNjX29sZF9wb3NpdGlvbiwKKwkJCSAgICAgICAmaW5kX29sZF9wb3NpdGlvbiwgJnJ4X2Rlc2NfbGVuKTsKKworCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKikoY2RmX25idWZfZGF0YShuYnVmKSArIHJ4X2Rlc2NfbGVuKTsKKwlpZiAoREVGUkFHX0lFRUU4MDIxMV9RT1NfSEFTX1NFUSh3aCkpIHsKKwkJcW9zbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zY250bCk7CisJCS8qIFFvcyBmcmFtZSB3aXRoIE9yZGVyIGJpdCBzZXQgaW5kaWNhdGVzIGEgSFRDIGZyYW1lICovCisJCWlmICh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfT1JERVIpCisJCQlxb3NsZW4gKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRjKTsKKworCQkvKiByZW1vdmUgUW9TIGZpbGVkIGZyb20gaGVhZGVyICovCisJCWhkcmxlbiAtPSBxb3NsZW47CisJCWNkZl9tZW1fbW92ZSgodWludDhfdCAqKSB3aCArIHFvc2xlbiwgd2gsIGhkcmxlbik7CisJCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKiljZGZfbmJ1Zl9wdWxsX2hlYWQobmJ1ZiwKKwkJCQkJCQkJICByeF9kZXNjX2xlbiArCisJCQkJCQkJCSAgcW9zbGVuKTsKKwkJLyogY2xlYXIgUW9TIGJpdCAqLworCQkvKgorCQkgKiBLVyMgNjE1NCAnY2RmX25idWZfcHVsbF9oZWFkJyBpbiB0dXJuIGNhbGxzCisJCSAqIF9fY2RmX25idWZfcHVsbF9oZWFkLAorCQkgKiB3aGljaCByZXR1cm5zIE5VTEwgaWYgdGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgZGF0YSB0byBwdWxsLgorCQkgKiBJdCdzIGd1YXJhbnRlZWQgdGhhdCBjZGZfbmJ1Zl9wdWxsX2hlYWQgd2lsbCBzdWNjZWVkIHJhdGhlcgorCQkgKiB0aGFuIHJldHVybmluZyBOVUxMLCBzaW5jZSB0aGUgZW50aXJlIHJ4IGZyYW1lIGlzIGFscmVhZHkKKwkJICogcHJlc2VudCBpbiB0aGUgcnggYnVmZmVyLgorCQkgKiBIb3dldmVyLCB0byBtYWtlIGl0IG9idmlvdXMgdG8gc3RhdGljIGFuYWx5emVycyB0aGF0IHRoaXMKKwkJICogY29kZSBpcyBzYWZlLCBhZGQgYW4gZXhwbGljaXQgY2hlY2sgdGhhdCBjZGZfbmJ1Zl9wdWxsX2hlYWQKKwkJICogcmV0dXJucyBhIG5vbi1OVUxMIHZhbHVlLgorCQkgKiBTaW5jZSB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgaXMgbm90IHBlcmZvcm1hbmNlLWNyaXRpY2FsLAorCQkgKiBhZGRpbmcgdGhpcyBleHBsaWNpdCBjaGVjayBpcyBva2F5LgorCQkgKi8KKwkJaWYgKHdoKQorCQkJd2gtPmlfZmNbMF0gJj0gfklFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1M7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfcnhfZGVmcmFnLmggYi9jb3JlL2RwL3R4cngvb2xfcnhfZGVmcmFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyZmE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvdHhyeC9vbF9yeF9kZWZyYWcuaApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfT0xfUlhfREVGUkFHX0hfCisjZGVmaW5lIF9PTF9SWF9ERUZSQUdfSF8KKworI2luY2x1ZGUgPGNkZl9uYnVmLmg+CisjaW5jbHVkZSA8Y2RzX2llZWU4MDIxMV9jb21tb24uaD4KKyNpbmNsdWRlIDxjZGZfdXRpbC5oPgorI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4KKyNpbmNsdWRlIDxvbF90eHJ4X2ludGVybmFsLmg+CisjaW5jbHVkZSA8b2xfdHhyeF9kYmcuaD4KKworI2RlZmluZSBERUZSQUdfSUVFRTgwMjExX0FERFJfTEVOICAgIDYKKyNkZWZpbmUgREVGUkFHX0lFRUU4MDIxMV9LRVlfTEVOICAgICA4CisjZGVmaW5lIERFRlJBR19JRUVFODAyMTFfRkNTX0xFTiAgICAgNAorCitzdHJ1Y3Qgb2xfcnhfZGVmcmFnX2NpcGhlciB7CisJY29uc3QgY2hhciAqaWNfbmFtZTsKKwl1aW50MTZfdCBpY19oZWFkZXI7CisJdWludDhfdCBpY190cmFpbGVyOworCXVpbnQ4X3QgaWNfbWljbGVuOworfTsKKworZW51bSB7CisJT0xfUlhfREVGUkFHX0VSUiwKKwlPTF9SWF9ERUZSQUdfT0ssCisJT0xfUlhfREVGUkFHX1BOX0VSUgorfTsKKworI2RlZmluZSBvbF9yeF9kZWZyYWdfY29weWRhdGEoYnVmLCBvZmZzZXQsIGxlbiwgX3RvKSBcCisJY2RmX25idWZfY29weV9iaXRzKGJ1Ziwgb2Zmc2V0LCBsZW4sIF90bykKKworI2RlZmluZSBvbF9yeF9kZWZyYWdfbGVuKGJ1ZikgXAorCWNkZl9uYnVmX2xlbihidWYpCisKK3ZvaWQKK29sX3J4X2ZyYWdsaXN0X2luc2VydChodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsCisJCSAgICAgIGNkZl9uYnVmX3QgKmhlYWRfYWRkciwKKwkJICAgICAgY2RmX25idWZfdCAqdGFpbF9hZGRyLAorCQkgICAgICBjZGZfbmJ1Zl90IGZyYWcsIHVpbnQ4X3QgKmFsbF9mcmFnX3ByZXNlbnQpOworCit2b2lkIG9sX3J4X2RlZnJhZ193YWl0bGlzdF9hZGQoc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1bnNpZ25lZCB0aWQpOworCit2b2lkIG9sX3J4X2RlZnJhZ193YWl0bGlzdF9yZW1vdmUoc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1bnNpZ25lZCB0aWQpOworCit2b2lkIG9sX3J4X2RlZnJhZ193YWl0bGlzdF9mbHVzaChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpOworCit2b2lkCitvbF9yeF9kZWZyYWcob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCSAgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1bnNpZ25lZCB0aWQsIGNkZl9uYnVmX3QgZnJhZ19saXN0KTsKKworaW50CitvbF9yeF9mcmFnX3RraXBfZGVjYXAob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgICBjZGZfbmJ1Zl90IG1zZHUsIHVpbnQxNl90IGhkcmxlbik7CisKK2ludAorb2xfcnhfZnJhZ193ZXBfZGVjYXAob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgIGNkZl9uYnVmX3QgbmJ1ZiwgdWludDE2X3QgaGRybGVuKTsKKwordm9pZCBvbF9yeF9kZWZyYWdfbndpZmlfdG9fODAyMyhvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIGNkZl9uYnVmX3QgbXNkdSk7CisKK3ZvaWQKK29sX3J4X2RlZnJhZ19xb3NfZGVjYXAob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgICAgY2RmX25idWZfdCBuYnVmLCB1aW50MTZfdCBoZHJsZW4pOworCitpbnQKK29sX3J4X2ZyYWdfdGtpcF9kZW1pYyhvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwgY2RmX25idWZfdCBtc2R1LCB1aW50MTZfdCBoZHJsZW4pOworCitpbnQKK29sX3J4X2ZyYWdfY2NtcF9kZWNhcChvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgICAgIGNkZl9uYnVmX3QgbmJ1ZiwgdWludDE2X3QgaGRybGVuKTsKKworaW50CitvbF9yeF9mcmFnX2NjbXBfZGVtaWMob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgICBjZGZfbmJ1Zl90IHdidWYsIHVpbnQxNl90IGhkcmxlbik7CisKK3VpbnQxNl90IG9sX3J4X2ZyYWdfaGRyc2l6ZShjb25zdCB2b2lkICpkYXRhKTsKKwordm9pZCBvbF9yeF9kZWZyYWdfbWljaGRyKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoMCwgdWludDhfdCBoZHJbXSk7CisKK3ZvaWQKK29sX3J4X3Jlb3JkZXJfc3RvcmVfZnJhZyhvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCQkJIHVuc2lnbmVkIHRpZCwgdWludDE2X3Qgc2VxX251bSwgY2RmX25idWZfdCBmcmFnKTsKKworY2RmX25idWZfdAorb2xfcnhfZGVmcmFnX2RlY2FwX3JlY29tYmluZShodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYsCisJCQkgICAgIGNkZl9uYnVmX3QgZnJhZ19saXN0LCB1aW50MTZfdCBoZHJzaXplKTsKKworaW50CitvbF9yeF9kZWZyYWdfbWljKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJIGNvbnN0IHVpbnQ4X3QgKmtleSwKKwkJIGNkZl9uYnVmX3Qgd2J1ZiwKKwkJIHVpbnQxNl90IG9mZiwgdWludDE2X3QgZGF0YV9sZW4sIHVpbnQ4X3QgbWljW10pOworCit2b2lkCitvbF9yeF9yZW9yZGVyX2ZsdXNoX2ZyYWcoaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2LAorCQkJIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJCSB1bnNpZ25lZCB0aWQsIGludCBzZXFfbnVtKTsKKworc3RhdGljIGlubGluZSB2b2lkIHhvcl9ibG9jayh1aW50OF90ICpiLCBjb25zdCB1aW50OF90ICphLCBjZGZfc2l6ZV90IGxlbikKK3sKKwljZGZfc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWJbaV0gXj0gYVtpXTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCByb3RsKHVpbnQzMl90IHZhbCwgaW50IGJpdHMpCit7CisJcmV0dXJuICh2YWwgPDwgYml0cykgfCAodmFsID4+ICgzMiAtIGJpdHMpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCByb3RyKHVpbnQzMl90IHZhbCwgaW50IGJpdHMpCit7CisJcmV0dXJuICh2YWwgPj4gYml0cykgfCAodmFsIDw8ICgzMiAtIGJpdHMpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCB4c3dhcCh1aW50MzJfdCB2YWwpCit7CisJcmV0dXJuICgodmFsICYgMHgwMGZmMDBmZikgPDwgOCkgfCAoKHZhbCAmIDB4ZmYwMGZmMDApID4+IDgpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitnZXRfbGUzMl9zcGxpdCh1aW50OF90IGIwLCB1aW50OF90IGIxLCB1aW50OF90IGIyLCB1aW50OF90IGIzKQoreworCXJldHVybiBiMCB8IChiMSA8PCA4KSB8IChiMiA8PCAxNikgfCAoYjMgPDwgMjQpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF9sZTMyKGNvbnN0IHVpbnQ4X3QgKnApCit7CisJcmV0dXJuIGdldF9sZTMyX3NwbGl0KHBbMF0sIHBbMV0sIHBbMl0sIHBbM10pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2xlMzIodWludDhfdCAqcCwgdWludDMyX3QgdikKK3sKKwlwWzBdID0gKHYpICYgMHhmZjsKKwlwWzFdID0gKHYgPj4gOCkgJiAweGZmOworCXBbMl0gPSAodiA+PiAxNikgJiAweGZmOworCXBbM10gPSAodiA+PiAyNCkgJiAweGZmOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3Qgb2xfcnhfZGVmcmFnX2NvbmNhdChjZGZfbmJ1Zl90IGRzdCwgY2RmX25idWZfdCBzcmMpCit7CisJLyoKKwkgKiBJbnNpZGUgY2RmX25idWZfY2F0LCBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gcmVhbGxvY2F0ZSBkc3QKKwkgKiB0byBwcm92aWRlIHNwYWNlIGZvciBzcmMsIHRoZSBoZWFkcm9vbSBwb3J0aW9uIGlzIGNvcGllZCBmcm9tCisJICogdGhlIG9yaWdpbmFsIGRzdCBidWZmZXIgdG8gdGhlIGxhcmdlciBuZXcgZHN0IGJ1ZmZlci4KKwkgKiAoVGhpcyBpcyBuZWVkZWQsIGJlY2F1c2UgdGhlIGhlYWRyb29tIG9mIHRoZSBkc3QgYnVmZmVyCisJICogY29udGFpbnMgdGhlIHJ4IGRlc2MuKQorCSAqLworCWlmIChjZGZfbmJ1Zl9jYXQoZHN0LCBzcmMpKQorCQlyZXR1cm4gT0xfUlhfREVGUkFHX0VSUjsKKworCXJldHVybiBPTF9SWF9ERUZSQUdfT0s7Cit9CisKKyNkZWZpbmUgbWljaGFlbF9ibG9jayhsLCByKQlcCisJZG8gewkJCQkJXAorCQlyIF49IHJvdGwobCwgMTcpOwlcCisJCWwgKz0gcjsJCQkJXAorCQlyIF49IHhzd2FwKGwpOwkJXAorCQlsICs9IHI7CQkJCVwKKwkJciBePSByb3RsKGwsIDMpOwlcCisJCWwgKz0gcjsJCQkJXAorCQlyIF49IHJvdHIobCwgMik7CVwKKwkJbCArPSByOwkJCQlcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfcnhfZndkLmMgYi9jb3JlL2RwL3R4cngvb2xfcnhfZndkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3ZjM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvdHhyeC9vbF9yeF9md2QuYwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyogc3RhbmRhcmQgaGVhZGVyIGZpbGVzICovCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX21hcCAqLworI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4gICAgICAgICAvKiBjZGZfbWVtX2NvbXBhcmUgKi8KKworLyogZXh0ZXJuYWwgaGVhZGVyIGZpbGVzICovCisjaW5jbHVkZSA8b2xfY2ZnLmg+ICAgICAgICAgICAgICAgICAvKiB3bGFuX29wX21vZGVfYXAsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF9odHRfcnhfYXBpLmg+ICAgICAgICAgIC8qIGh0dF9yeF9tc2R1X2Rlc2NfcmV0cmlldmUgKi8KKyNpbmNsdWRlIDxjZHNfaWVlZTgwMjExX2NvbW1vbi5oPiAgIC8qIGllZWU4MDIxMV9mcmFtZSwgZXRjLiAqLworCisvKiBpbnRlcm5hbCBoZWFkZXIgZmlsZXMgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+ICAgICAgLyogb2xfdHhyeF9kZXZfdCwgZXRjLiAqLworI2luY2x1ZGUgPG9sX3J4X2Z3ZC5oPiAgICAgICAgICAvKiBvdXIgb3duIGRlZnMgKi8KKyNpbmNsdWRlIDxvbF9yeC5oPiAgICAgICAgICAgICAgLyogb2xfcnhfZGVsaXZlciAqLworI2luY2x1ZGUgPG9sX3R4cnhfaW50ZXJuYWwuaD4gICAvKiBUWFJYX0FTU0VSVDEgKi8KKyNpbmNsdWRlIDxvbF90eC5oPgorLyoKKyAqIFBvcnRpbmcgZnJvbSBBcDExUHJlcGFyZUZvcndhcmRlZFBhY2tldC4KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhIFJYIGRhdGEgZnJhbWUgZnJvbSBhbiBhc3NvY2lhdGVkIHN0YXRpb24gaXMKKyAqIHRvIGJlIGZvcndhcmRlZCB0byBhbm90aGVyIGFzc29jaWF0ZWQgc3RhdGlvbi4gV2Ugd2lsbCBwcmVwYXJlIHRoZQorICogcmVjZWl2ZWQgcGFja2V0IHNvIHRoYXQgaXQgaXMgc3VpdGFibGUgZm9yIHRyYW5zbWlzc2lvbiBhZ2Fpbi4KKyAqIENoZWNrIHRoYXQgdGhpcyBQYWNrZXQgaXMgc3VpdGFibGUgZm9yIGZvcndhcmRpbmcuIElmIHllcywgdGhlbgorICogcHJlcGFyZSB0aGUgbmV3IDgwMi4xMSBoZWFkZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBvbF9hcF9md2RfY2hlY2soc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LCBjZGZfbmJ1Zl90IG1zZHUpCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqbWFjX2hlYWRlcjsKKwl1bnNpZ25lZCBjaGFyIHRtcF9hZGRyW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdW5zaWduZWQgY2hhciB0eXBlOworCXVuc2lnbmVkIGNoYXIgc3VidHlwZTsKKwl1bnNpZ25lZCBjaGFyIGZyb21kczsKKwl1bnNpZ25lZCBjaGFyIHRvZHM7CisKKwltYWNfaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKikoY2RmX25idWZfZGF0YShtc2R1KSk7CisJVFhSWF9BU1NFUlQxKG1hY19oZWFkZXIpOworCisJdHlwZSA9IG1hY19oZWFkZXItPmlfZmNbMF0gJiBJRUVFODAyMTFfRkMwX1RZUEVfTUFTSzsKKwlzdWJ0eXBlID0gbWFjX2hlYWRlci0+aV9mY1swXSAmIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLOworCXRvZHMgPSBtYWNfaGVhZGVyLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9ESVJfVE9EUzsKKwlmcm9tZHMgPSBtYWNfaGVhZGVyLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9ESVJfRlJPTURTOworCisJLyoKKwkgKiBNYWtlIHN1cmUgbm8gUU9TIG9yIGFueSBvdGhlciBub24tZGF0YSBzdWJ0eXBlCisJICogU2hvdWxkIGJlIGEgVG9EcyBkYXRhIGZyYW1lLgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoaXMgZnJhbWUgaXMgdW5pY2FzdCBhbmQgbm90IGZvciB1cy4KKwkgKiBUaGVzZSBwYWNrZXRzIHNob3VsZCBjb21lIHVwIHRocm91Z2ggdGhlIG5vcm1hbCByeCBwYXRoIGFuZAorCSAqIG5vdCBmb3J3YXJkZWQuCisJICovCisJaWYgKHR5cGUgIT0gSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEgfHwKKwkgICAgc3VidHlwZSAhPSAweDAgfHwKKwkgICAgKCh0b2RzICE9IDEpIHx8IChmcm9tZHMgIT0gMCkpIHx8CisJICAgIChjZGZfbWVtX2NvbXBhcmUKKwkJICAgICAobWFjX2hlYWRlci0+aV9hZGRyMywgdmRldi0+bWFjX2FkZHIucmF3LAorCQkgICAgIElFRUU4MDIxMV9BRERSX0xFTikgPT0gMCkpIHsKKyNpZmRlZiBERUJVR19IT1NUX1JDCisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMSwKKwkJCSAgICJFeGl0OiAlcyB8IFVubmVjZXNzYXJ5IHRvIGFkanVzdCBtYWMgaGVhZGVyXG4iLAorCQkJICAgX19mdW5jX18pOworI2VuZGlmCisJfSBlbHNlIHsKKwkJLyogRmxpcCB0aGUgVG9EcyBiaXQgdG8gRnJvbURzICovCisJCW1hY19oZWFkZXItPmlfZmNbMV0gJj0gMHhmZTsKKwkJbWFjX2hlYWRlci0+aV9mY1sxXSB8PSAweDI7CisKKwkJLyoKKwkJICogRmxpcCB0aGUgYWRkcmVzc2VzCisJCSAqIChUb0RzLCBhZGRyMSwgUkE9QlNTSUQpIG1vdmUgdG8gKEZyRHMsIGFkZHIyLCBUQT1CU1NJRCkKKwkJICogKFRvRHMsIGFkZHIyLCBTQSkgbW92ZSB0byAoRnJEcywgYWRkcjMsIFNBKQorCQkgKiAoVG9EcywgYWRkcjMsIERBKSBtb3ZlIHRvIChGckRzLCBhZGRyMSwgREEpCisJCSAqLworCisJCW1lbWNweSh0bXBfYWRkciwgbWFjX2hlYWRlci0+aV9hZGRyMiwgc2l6ZW9mKHRtcF9hZGRyKSk7CisKKwkJbWVtY3B5KG1hY19oZWFkZXItPmlfYWRkcjIsCisJCSAgICAgICBtYWNfaGVhZGVyLT5pX2FkZHIxLCBzaXplb2YodG1wX2FkZHIpKTsKKworCQltZW1jcHkobWFjX2hlYWRlci0+aV9hZGRyMSwKKwkJICAgICAgIG1hY19oZWFkZXItPmlfYWRkcjMsIHNpemVvZih0bXBfYWRkcikpOworCisJCW1lbWNweShtYWNfaGVhZGVyLT5pX2FkZHIzLCB0bXBfYWRkciwgc2l6ZW9mKHRtcF9hZGRyKSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb2xfcnhfZndkX3RvX3R4KHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwgY2RmX25idWZfdCBtc2R1KQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHZkZXYtPnBkZXY7CisKKwlpZiAocGRldi0+ZnJhbWVfZm9ybWF0ID09IHdsYW5fZnJtX2ZtdF9uYXRpdmVfd2lmaSkKKwkJb2xfYXBfZndkX2NoZWNrKHZkZXYsIG1zZHUpOworCisJLyoKKwkgKiBNYXAgdGhlIG5ldGJ1Ziwgc28gaXQncyBhY2Nlc3NpYmxlIHRvIHRoZSBETUEgdGhhdAorCSAqIHNlbmRzIGl0IHRvIHRoZSB0YXJnZXQuCisJICovCisJY2RmX25idWZfbWFwX3NpbmdsZShwZGV2LT5vc2RldiwgbXNkdSwgQ0RGX0RNQV9UT19ERVZJQ0UpOworCWNkZl9uYnVmX3NldF9uZXh0KG1zZHUsIE5VTEwpOyAgLyogYWRkIE5VTEwgdGVybWluYXRvciAqLworCisJbXNkdSA9IE9MX1RYX0xMKHZkZXYsIG1zZHUpOworCisJaWYgKG1zZHUpIHsKKwkJLyoKKwkJICogVGhlIGZyYW1lIHdhcyBub3QgYWNjZXB0ZWQgYnkgdGhlIHR4LgorCQkgKiBXZSBjb3VsZCBzdG9yZSB0aGUgZnJhbWUgYW5kIHRyeSBhZ2FpbiBsYXRlciwKKwkJICogYnV0IHRoZSBzaW1wbGVzdCBzb2x1dGlvbiBpcyB0byBkaXNjYXJkIHRoZSBmcmFtZXMuCisJCSAqLworCQljZGZfbmJ1Zl91bm1hcF9zaW5nbGUocGRldi0+b3NkZXYsIG1zZHUsIENERl9ETUFfVE9fREVWSUNFKTsKKwkJY2RmX25idWZfdHhfZnJlZShtc2R1LCBOQlVGX1BLVF9FUlJPUik7CisJfQorfQorCit2b2lkCitvbF9yeF9md2RfY2hlY2soc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsIHVuc2lnbmVkIHRpZCwgY2RmX25idWZfdCBtc2R1X2xpc3QpCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gdmRldi0+cGRldjsKKwljZGZfbmJ1Zl90IGRlbGl2ZXJfbGlzdF9oZWFkID0gTlVMTDsKKwljZGZfbmJ1Zl90IGRlbGl2ZXJfbGlzdF90YWlsID0gTlVMTDsKKwljZGZfbmJ1Zl90IG1zZHU7CisKKwltc2R1ID0gbXNkdV9saXN0OworCXdoaWxlIChtc2R1KSB7CisJCXN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdHhfdmRldjsKKwkJdm9pZCAqcnhfZGVzYzsKKwkJLyoKKwkJICogUmVtZW1iZXIgdGhlIG5leHQgbGlzdCBlbGVtLCBiZWNhdXNlIG91ciBwcm9jZXNzaW5nCisJCSAqIG1heSBjYXVzZSB0aGUgTVNEVSB0byBnZXQgbGlua2VkIGludG8gYSBkaWZmZXJlbnQgbGlzdC4KKwkJICovCisJCW1zZHVfbGlzdCA9IGNkZl9uYnVmX25leHQobXNkdSk7CisKKwkJcnhfZGVzYyA9IGh0dF9yeF9tc2R1X2Rlc2NfcmV0cmlldmUocGRldi0+aHR0X3BkZXYsIG1zZHUpOworCisJCWlmICghdmRldi0+ZGlzYWJsZV9pbnRyYWJzc19md2QgJiYKKwkJICAgIGh0dF9yeF9tc2R1X2ZvcndhcmQocGRldi0+aHR0X3BkZXYsIHJ4X2Rlc2MpKSB7CisJCQkvKgorCQkJICogVXNlIHRoZSBzYW1lIHZkZXYgdGhhdCByZWNlaXZlZCB0aGUgZnJhbWUgdG8KKwkJCSAqIHRyYW5zbWl0IHRoZSBmcmFtZS4KKwkJCSAqIFRoaXMgaXMgZXhhY3RseSB3aGF0IHdlIHdhbnQgZm9yIGludHJhLUJTUworCQkJICogZm9yd2FyZGluZywgbGlrZSBTVEEtdG8tU1RBIGZvcndhcmRpbmcgYW5kCisJCQkgKiBtdWx0aWNhc3QgZWNoby4KKwkJCSAqIElmIHRoaXMgaXMgYSBpbnRyYS1CU1MgZm9yd2FyZGluZyBjYXNlICh3aGljaCBpcyBub3QKKwkJCSAqIGN1cnJlbnRseSBzdXBwb3J0ZWQpLCB0aGVuIHRoZSB0eCB2ZGV2IGlzIGRpZmZlcmVudAorCQkJICogZnJvbSB0aGUgcnggdmRldi4KKwkJCSAqIE9uIHRoZSBMTCBob3N0IHRoZSB2ZGV2cyBhcmUgbm90IGFjdHVhbGx5IHVzZWQKKwkJCSAqIGZvciB0eCwgc28gaXQgd291bGQgc3RpbGwgd29yayB0byB1c2UgdGhlIHJ4IHZkZXYKKwkJCSAqIHJhdGhlciB0aGFuIHRoZSB0eCB2ZGV2LgorCQkJICogRm9yIEhMLCB0aGUgdHggY2xhc3NpZmljYXRpb24gc2VhcmNoZXMgZm9yIHRoZSBEQQorCQkJICogd2l0aGluIHRoZSBnaXZlbiB2ZGV2LCBzbyB3ZSB3b3VsZCB3YW50IHRvIGdldCB0aGUgREEKKwkJCSAqIHBlZXIgSUQgZnJvbSB0aGUgdGFyZ2V0LCBzbyB3ZSBjYW4gbG9jYXRlCisJCQkgKiB0aGUgdHggdmRldi4KKwkJCSAqLworCQkJdHhfdmRldiA9IHZkZXY7CisJCQkvKgorCQkJICogQ29weWluZyBUSUQgdmFsdWUgb2YgUlggcGFja2V0IHRvIGZvcndhcmRlZAorCQkJICogcGFja2V0IGlmIHRoZSB0aWQgaXMgb3RoZXIgdGhhbiBub24gcW9zIHRpZC4KKwkJCSAqIEJ1dCBmb3Igbm9uIHFvcyB0aWQgZmlsbCBpbnZhbGlkIHRpZCBzbyB0aGF0CisJCQkgKiBGdyB3aWxsIHRha2UgY2FyZSBvZiBmaWxsaW5nIHByb3BlciB0aWQuCisJCQkgKi8KKwkJCWlmICh0aWQgIT0gSFRUX05PTl9RT1NfVElEKSB7CisJCQkJY2RmX25idWZfc2V0X3RpZChtc2R1LCB0aWQpOworCQkJfSBlbHNlIHsKKwkJCQljZGZfbmJ1Zl9zZXRfdGlkKG1zZHUsCisJCQkJCQkgQURGX05CVUZfVFhfRVhUX1RJRF9JTlZBTElEKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBUaGlzIE1TRFUgbmVlZHMgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSB0eCBwYXRoLgorCQkJICogQ2hlY2sgd2hldGhlciBpdCBhbHNvIG5lZWRzIHRvIGJlIHNlbnQgdG8gdGhlIE9TCisJCQkgKiBzaGltLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkKKwkJCSAqIChvciBjbG9uZT8pLgorCQkJICovCisJCQlpZiAoaHR0X3J4X21zZHVfZGlzY2FyZChwZGV2LT5odHRfcGRldiwgcnhfZGVzYykpIHsKKwkJCQlodHRfcnhfbXNkdV9kZXNjX2ZyZWUocGRldi0+aHR0X3BkZXYsIG1zZHUpOworCQkJCWNkZl9uZXRfYnVmX2RlYnVnX3JlbGVhc2Vfc2tiKG1zZHUpOworCQkJCW9sX3J4X2Z3ZF90b190eCh0eF92ZGV2LCBtc2R1KTsKKwkJCQltc2R1ID0gTlVMTDsgICAgLyogYWxyZWFkeSBoYW5kbGVkIHRoaXMgTVNEVSAqLworCQkJCVRYUlhfU1RBVFNfQUREKHBkZXYsCisJCQkJCSBwdWIucnguaW50cmFfYnNzX2Z3ZC5wYWNrZXRzX2Z3ZCwgMSk7CisJCQl9IGVsc2UgeworCQkJCWNkZl9uYnVmX3QgY29weTsKKwkJCQljb3B5ID0gY2RmX25idWZfY29weShtc2R1KTsKKwkJCQlpZiAoY29weSkKKwkJCQkJb2xfcnhfZndkX3RvX3R4KHR4X3ZkZXYsIGNvcHkpOworCQkJCVRYUlhfU1RBVFNfQUREKHBkZXYsCisJCQkJICAgcHViLnJ4LmludHJhX2Jzc19md2QucGFja2V0c19zdGFja19uX2Z3ZCwgMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlUWFJYX1NUQVRTX0FERChwZGV2LAorCQkJCSBwdWIucnguaW50cmFfYnNzX2Z3ZC5wYWNrZXRzX3N0YWNrLCAxKTsKKwkJfQorCQlpZiAobXNkdSkgeworCQkJLyogc2VuZCB0aGlzIGZyYW1lIHRvIHRoZSBPUyAqLworCQkJT0xfVFhSWF9MSVNUX0FQUEVORChkZWxpdmVyX2xpc3RfaGVhZCwKKwkJCQkJICAgIGRlbGl2ZXJfbGlzdF90YWlsLCBtc2R1KTsKKwkJfQorCQltc2R1ID0gbXNkdV9saXN0OworCX0KKwlpZiAoZGVsaXZlcl9saXN0X2hlYWQpIHsKKwkJLyogYWRkIE5VTEwgdGVybWluYXRvciAqLworCQljZGZfbmJ1Zl9zZXRfbmV4dChkZWxpdmVyX2xpc3RfdGFpbCwgTlVMTCk7CisJCWlmIChvbF9jZmdfaXNfZnVsbF9yZW9yZGVyX29mZmxvYWQocGRldi0+Y3RybF9wZGV2KSkgeworCQkJb2xfcnhfaW5fb3JkZXJfZGVsaXZlcih2ZGV2LCBwZWVyLCB0aWQsCisJCQkJCSAgICAgICBkZWxpdmVyX2xpc3RfaGVhZCk7CisJCX0gZWxzZSB7CisJCQlvbF9yeF9kZWxpdmVyKHZkZXYsIHBlZXIsIHRpZCwgZGVsaXZlcl9saXN0X2hlYWQpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9kcC90eHJ4L29sX3J4X2Z3ZC5oIGIvY29yZS9kcC90eHJ4L29sX3J4X2Z3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTcwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfcnhfZndkLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX09MX1JYX0ZXRF9IXworI2RlZmluZSBfT0xfUlhfRldEX0hfCisKKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCwgZXRjLiAqLworCisjaW5jbHVkZSA8b2xfdHhyeF9hcGkuaD4gICAgICAgIC8qIG9sX3R4cnhfcGVlcl90LCBldGMuICovCisKK2NkZl9uYnVmX3QKK29sX3J4X2Z3ZF9tY2FzdF9jaGVja19zdGEoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkJICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJCQkgIGNkZl9uYnVmX3QgbXNkdSwgdm9pZCAqcnhfZGVzYywgaW50IGlzX3dsYW5fbWNhc3QpOworCitjZGZfbmJ1Zl90CitvbF9yeF9md2RfbWNhc3RfY2hlY2tfYXAoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkJIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJCSBjZGZfbmJ1Zl90IG1zZHUsIHZvaWQgKnJ4X2Rlc2MsIGludCBpc193bGFuX21jYXN0KTsKKworLyoqCisgKiBAYnJpZWYgQ2hlY2sgaWYgcnggZnJhbWVzIHNob3VsZCBiZSB0cmFuc21pdHRlZCBvdmVyIFdMQU4uCisgKiBAZGV0YWlscworICogIENoZWNrIGlmIHJ4IGZyYW1lcyBzaG91bGQgYmUgdHJhbnNtaXR0ZWQgYmFjayBvdmVyIFdMQU4sIGluc3RlYWQgb2YKKyAqICBvciBpbiBhZGRpdGlvbiB0byBkZWxpdmVyaW5nIHRoZSByeCBmcmFtZXMgdG8gdGhlIE9TLgorICogIFJ4IGZyYW1lcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdHJhbnNtaXQgcGF0aCB1bmRlciB0aGUgZm9sbG93aW5nCisgKiAgY29uZGl0aW9uczoKKyAqICAxLiAgSWYgdGhlIGRlc3RpbmF0aW9uIGlzIGEgU1RBIGFzc29jaWF0ZWQgdG8gdGhlIHNhbWUgdmlydHVhbCBkZXZpY2UKKyAqICAgICAgd2l0aGluIHRoaXMgcGh5c2ljYWwgZGV2aWNlLCB0aGUgcnggZnJhbWUgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlCisgKiAgICAgIHR4IHBhdGggcmF0aGVyIHRoYW4gYmVpbmcgc2VudCB0byB0aGUgT1MuICBJZiB0aGUgZGVzdGluYXRpb24gaXMgYQorICogICAgICBTVEEgYXNzb2NpYXRlZCB0byBhIGRpZmZlcmVudCB2aXJ0dWFsIGRldmljZSB3aXRoaW4gdGhpcyBwaHlzaWNhbAorICogICAgICBkZXZpY2UsIHRoZW4gdGhlIHJ4IGZyYW1lIHdpbGwgb3B0aW9uYWxseSBiZSBmb3J3YXJkZWQgdG8gdGhlIHR4IHBhdGguCisgKiAgMi4gIElmIHRoZSBmcmFtZSBpcyByZWNlaXZlZCBieSBhbiBBUCwgYnV0IHRoZSBkZXN0aW5hdGlvbiBpcyBmb3IgYW5vdGhlcgorICogICAgICBBUCB0aGF0IHRoZSBjdXJyZW50IEFQIGlzIGFzc29jaWF0ZWQgd2l0aCBmb3IgV0RTIGZvcndhcmRpbmcsIHRoZQorICogICAgICBpbnRlcm1lZGlhdGUgQVAgd2lsbCBmb3J3YXJkIHRoZSByeCBmcmFtZSB0byB0aGUgdHggcGF0aCB0byB0cmFuc21pdAorICogICAgICB0byBzZW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBBUCwgcmF0aGVyIHRoYW4gc2VuZGluZyBpdCB0byB0aGUgT1MuCisgKiAgMy4gIElmIHRoZSBBUCByZWNlaXZlcyBhIG11bHRpY2FzdCBmcmFtZSwgaXQgd2lsbCByZXRyYW5zbWl0IHRoZSBmcmFtZQorICogICAgICB3aXRoaW4gdGhlIEJTUywgaW4gYWRkaXRpb24gdG8gc2VuZGluZyB0aGUgZnJhbWUgdG8gdGhlIE9TLgorICoKKyAqIEBwYXJhbSB2ZGV2IC0gd2hpY2ggdmlydHVhbCBkZXZpY2UgdGhlIGZyYW1lcyB3ZXJlIGFkZHJlc3NlZCB0bworICogQHBhcmFtIHBlZXIgLSB3aGljaCBwZWVyIHRoZSByeCBmcmFtZXMgYmVsb25nIHRvCisgKiBAcGFyYW0gdGlkICAtIHdoaWNoIFRJRCB3aXRoaW4gdGhlIHBlZXIgdGhlIHJ4IGZyYW1lcyBiZWxvbmcgdG8KKyAqIEBwYXJhbSBtc2R1X2xpc3QgLSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBNU0RVcyB0byBwZXJmb3JtIHRoZSByeC0+dHgKKyAqICAgICAgZm9yd2FyZGluZyBjaGVjayBvbgorICovCit2b2lkCitvbF9yeF9md2RfY2hlY2soc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJCXVuc2lnbmVkIHRpZCwgY2RmX25idWZfdCBtc2R1X2xpc3QpOworCisjZW5kaWYgLyogX09MX1JYX0ZXRF9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC90eHJ4L29sX3J4X3BuLmMgYi9jb3JlL2RwL3R4cngvb2xfcnhfcG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjI2MTZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L29sX3J4X3BuLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCAqLworCisjaW5jbHVkZSA8b2xfaHR0X3J4X2FwaS5oPiAgICAgIC8qIGh0dF9yeF9wbl90LCBldGMuICovCisjaW5jbHVkZSA8b2xfY3RybF90eHJ4X2FwaS5oPiAgIC8qIG9sX3J4X2VyciAqLworCisjaW5jbHVkZSA8b2xfdHhyeF9pbnRlcm5hbC5oPiAgIC8qIG9sX3J4X21wZHVfbGlzdF9uZXh0ICovCisjaW5jbHVkZSA8b2xfdHhyeF90eXBlcy5oPiAgICAgIC8qIG9sX3R4cnhfdmRldl90LCBldGMuICovCisjaW5jbHVkZSA8b2xfcnhfcG4uaD4gICAgICAgICAgIC8qIG91ciBvd24gZGVmcyAqLworI2luY2x1ZGUgPG9sX3J4X2Z3ZC5oPiAgICAgICAgICAvKiBvbF9yeF9md2RfY2hlY2sgKi8KKyNpbmNsdWRlIDxvbF9yeC5oPiAgICAgICAgICAgICAgLyogb2xfcnhfZGVsaXZlciAqLworCisvKiBhZGQgdGhlIE1TRFVzIGZyb20gdGhpcyBNUERVIHRvIHRoZSBsaXN0IG9mIGdvb2QgZnJhbWVzICovCisjZGVmaW5lIEFERF9NUERVX1RPX0xJU1QoaGVhZCwgdGFpbCwgbXBkdSwgbXBkdV90YWlsKSBkbyB7CQlcCisJCWlmICghaGVhZCkgewkJCQkJCVwKKwkJCWhlYWQgPSBtcGR1OwkJCQkJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCWNkZl9uYnVmX3NldF9uZXh0KHRhaWwsIG1wZHUpOwkJCVwKKwkJfQkJCQkJCQlcCisJCXRhaWwgPSBtcGR1X3RhaWw7CQkJCQlcCisJfSB3aGlsZSAoMCkKKworaW50IG9sX3J4X3BuX2NtcDI0KHVuaW9uIGh0dF9yeF9wbl90ICpuZXdfcG4sCisJCSAgIHVuaW9uIGh0dF9yeF9wbl90ICpvbGRfcG4sIGludCBpc191bmljYXN0LCBpbnQgb3Btb2RlKQoreworCWludCByYyA9ICgobmV3X3BuLT5wbjI0ICYgMHhmZmZmZmYpIDw9IChvbGRfcG4tPnBuMjQgJiAweGZmZmZmZikpOworCXJldHVybiByYzsKK30KKworaW50IG9sX3J4X3BuX2NtcDQ4KHVuaW9uIGh0dF9yeF9wbl90ICpuZXdfcG4sCisJCSAgIHVuaW9uIGh0dF9yeF9wbl90ICpvbGRfcG4sIGludCBpc191bmljYXN0LCBpbnQgb3Btb2RlKQoreworCWludCByYyA9ICgobmV3X3BuLT5wbjQ4ICYgMHhmZmZmZmZmZmZmZmZVTEwpIDw9CisJCSAgKG9sZF9wbi0+cG40OCAmIDB4ZmZmZmZmZmZmZmZmVUxMKSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgb2xfcnhfcG5fd2FwaV9jbXAodW5pb24gaHR0X3J4X3BuX3QgKm5ld19wbiwKKwkJICAgICAgdW5pb24gaHR0X3J4X3BuX3QgKm9sZF9wbiwgaW50IGlzX3VuaWNhc3QsIGludCBvcG1vZGUpCit7CisJaW50IHBuX2lzX3JlcGxheSA9IDA7CisKKwlpZiAobmV3X3BuLT5wbjEyOFsxXSA9PSBvbGRfcG4tPnBuMTI4WzFdKQorCQlwbl9pc19yZXBsYXkgPSAobmV3X3BuLT5wbjEyOFswXSA8PSBvbGRfcG4tPnBuMTI4WzBdKTsKKwllbHNlCisJCXBuX2lzX3JlcGxheSA9IChuZXdfcG4tPnBuMTI4WzFdIDwgb2xkX3BuLT5wbjEyOFsxXSk7CisKKwlpZiAoaXNfdW5pY2FzdCkgeworCQlpZiAob3Btb2RlID09IHdsYW5fb3BfbW9kZV9hcCkKKwkJCXBuX2lzX3JlcGxheSB8PSAoKG5ld19wbi0+cG4xMjhbMF0gJiAweDFVTEwpICE9IDApOworCQllbHNlCisJCQlwbl9pc19yZXBsYXkgfD0gKChuZXdfcG4tPnBuMTI4WzBdICYgMHgxVUxMKSAhPSAxKTsKKwl9CisJcmV0dXJuIHBuX2lzX3JlcGxheTsKK30KKworY2RmX25idWZfdAorb2xfcnhfcG5fY2hlY2tfYmFzZShzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCSAgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJCSAgICB1bnNpZ25lZCB0aWQsIGNkZl9uYnVmX3QgbXNkdV9saXN0KQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHZkZXYtPnBkZXY7CisJdW5pb24gaHR0X3J4X3BuX3QgKmxhc3RfcG47CisJY2RmX25idWZfdCBvdXRfbGlzdF9oZWFkID0gTlVMTDsKKwljZGZfbmJ1Zl90IG91dF9saXN0X3RhaWwgPSBOVUxMOworCWNkZl9uYnVmX3QgbXBkdTsKKwlpbnQgaW5kZXg7ICAgICAgICAgICAgICAvKiB1bmljYXN0IHZzLiBtdWx0aWNhc3QgKi8KKwlpbnQgcG5fbGVuOworCXZvaWQgKnJ4X2Rlc2M7CisJaW50IGxhc3RfcG5fdmFsaWQ7CisKKwkvKiBNYWtlIHN1cmUgaG9zdCBwbiBjaGVjayBpcyBub3QgcmVkdW5kYW50ICovCisJaWYgKGNkZl9hdG9taWNfcmVhZCgmcGVlci0+ZndfcG5fY2hlY2spKQorCQlyZXR1cm4gbXNkdV9saXN0OworCisJLyogRmlyc3QsIGNoZWNrIHdoZXRoZXIgdGhlIFBOIGNoZWNrIGFwcGxpZXMgKi8KKwlyeF9kZXNjID0gaHR0X3J4X21zZHVfZGVzY19yZXRyaWV2ZShwZGV2LT5odHRfcGRldiwgbXNkdV9saXN0KTsKKwljZGZfYXNzZXJ0KGh0dF9yeF9tc2R1X2hhc193bGFuX21jYXN0X2ZsYWcocGRldi0+aHR0X3BkZXYsIHJ4X2Rlc2MpKTsKKwlpbmRleCA9IGh0dF9yeF9tc2R1X2lzX3dsYW5fbWNhc3QocGRldi0+aHR0X3BkZXYsIHJ4X2Rlc2MpID8KKwkJdHhyeF9zZWNfbWNhc3QgOiB0eHJ4X3NlY191Y2FzdDsKKwlwbl9sZW4gPSBwZGV2LT5yeF9wbltwZWVyLT5zZWN1cml0eVtpbmRleF0uc2VjX3R5cGVdLmxlbjsKKwlpZiAocG5fbGVuID09IDApCisJCXJldHVybiBtc2R1X2xpc3Q7CisKKwlsYXN0X3BuX3ZhbGlkID0gcGVlci0+dGlkc19sYXN0X3BuX3ZhbGlkW3RpZF07CisJbGFzdF9wbiA9ICZwZWVyLT50aWRzX2xhc3RfcG5bdGlkXTsKKwltcGR1ID0gbXNkdV9saXN0OworCXdoaWxlIChtcGR1KSB7CisJCWNkZl9uYnVmX3QgbXBkdV90YWlsLCBuZXh0X21wZHU7CisJCXVuaW9uIGh0dF9yeF9wbl90IG5ld19wbjsKKwkJaW50IHBuX2lzX3JlcGxheSA9IDA7CisKKwkJcnhfZGVzYyA9IGh0dF9yeF9tc2R1X2Rlc2NfcmV0cmlldmUocGRldi0+aHR0X3BkZXYsIG1wZHUpOworCisJCS8qCisJCSAqIEZpbmQgdGhlIGxhc3QgTVNEVSB3aXRoaW4gdGhpcyBNUERVLCBhbmQKKwkJICogdGhlIGZpbmQgdGhlIGZpcnN0IE1TRFUgd2l0aGluIHRoZSBuZXh0IE1QRFUuCisJCSAqLworCQlvbF9yeF9tcGR1X2xpc3RfbmV4dChwZGV2LCBtcGR1LCAmbXBkdV90YWlsLCAmbmV4dF9tcGR1KTsKKworCQkvKiBEb24ndCBjaGVjayB0aGUgUE4gcmVwbGF5IGZvciBub24tZW5jcnlwdGVkIGZyYW1lcyAqLworCQlpZiAoIWh0dF9yeF9tcGR1X2lzX2VuY3J5cHRlZChwZGV2LT5odHRfcGRldiwgcnhfZGVzYykpIHsKKwkJCUFERF9NUERVX1RPX0xJU1Qob3V0X2xpc3RfaGVhZCwgb3V0X2xpc3RfdGFpbCwgbXBkdSwKKwkJCQkJIG1wZHVfdGFpbCk7CisJCQltcGR1ID0gbmV4dF9tcGR1OworCQkJY29udGludWU7CisJCX0KKworCQkvKiByZXRyaWV2ZSBQTiBmcm9tIHJ4IGRlc2NyaXB0b3IgKi8KKwkJaHR0X3J4X21wZHVfZGVzY19wbihwZGV2LT5odHRfcGRldiwgcnhfZGVzYywgJm5ld19wbiwgcG5fbGVuKTsKKworCQkvKiBpZiB0aGVyZSB3YXMgbm8gcHJpb3IgUE4sIHRoZXJlJ3Mgbm90aGluZyB0byBjaGVjayAqLworCQlpZiAobGFzdF9wbl92YWxpZCkgeworCQkJcG5faXNfcmVwbGF5ID0KKwkJCQlwZGV2LT5yeF9wbltwZWVyLT5zZWN1cml0eVtpbmRleF0uc2VjX3R5cGVdLgorCQkJCWNtcCgmbmV3X3BuLCBsYXN0X3BuLCBpbmRleCA9PSB0eHJ4X3NlY191Y2FzdCwKKwkJCQkgICAgdmRldi0+b3Btb2RlKTsKKwkJfSBlbHNlIHsKKwkJCWxhc3RfcG5fdmFsaWQgPSBwZWVyLT50aWRzX2xhc3RfcG5fdmFsaWRbdGlkXSA9IDE7CisJCX0KKworCQlpZiAocG5faXNfcmVwbGF5KSB7CisJCQljZGZfbmJ1Zl90IG1zZHU7CisJCQlzdGF0aWMgdWludDMyX3QgbGFzdF9wbmNoZWNrX3ByaW50X3RpbWUgLyogPSAwICovOworCQkJaW50IGxvZ19sZXZlbDsKKwkJCXVpbnQzMl90IGN1cnJlbnRfdGltZV9tczsKKworCQkJLyoKKwkJCSAqIFRoaXMgTVBEVSBmYWlsZWQgdGhlIFBOIGNoZWNrOgorCQkJICogMS4gIG5vdGlmeSB0aGUgY29udHJvbCBTVyBvZiB0aGUgUE4gZmFpbHVyZQorCQkJICogICAgIChzbyBjb3VudGVybWVhc3VyZXMgY2FuIGJlIHRha2VuLCBpZiBuZWNlc3NhcnkpCisJCQkgKiAyLiAgRGlzY2FyZCBhbGwgdGhlIE1TRFVzIGZyb20gdGhpcyBNUERVLgorCQkJICovCisJCQltc2R1ID0gbXBkdTsKKwkJCWN1cnJlbnRfdGltZV9tcyA9CisJCQkJY2RmX3N5c3RlbV90aWNrc190b19tc2VjcyhjZGZfc3lzdGVtX3RpY2tzKCkpOworCQkJaWYgKFRYUlhfUE5fQ0hFQ0tfRkFJTFVSRV9QUklOVF9QRVJJT0RfTVMgPAorCQkJICAgIChjdXJyZW50X3RpbWVfbXMgLSBsYXN0X3BuY2hlY2tfcHJpbnRfdGltZSkpIHsKKwkJCQlsYXN0X3BuY2hlY2tfcHJpbnRfdGltZSA9IGN1cnJlbnRfdGltZV9tczsKKwkJCQlsb2dfbGV2ZWwgPSBUWFJYX1BSSU5UX0xFVkVMX1dBUk47CisJCQl9IGVsc2UgeworCQkJCWxvZ19sZXZlbCA9IFRYUlhfUFJJTlRfTEVWRUxfSU5GTzI7CisJCQl9CisKKwkJCVRYUlhfUFJJTlQobG9nX2xldmVsLAorCQkJCSAgICJQTiBjaGVjayBmYWlsZWQgLSBUSUQgJWQsIHBlZXIgJXAgIgorCQkJCSAgICIoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpICVzXG4iCisJCQkJICAgIiAgICBvbGQgUE4gKHU2NCB4Mik9IDB4JTA4bGx4ICUwOGxseCAoTFNCcyA9ICVsbGQpXG4iCisJCQkJICAgIiAgICBuZXcgUE4gKHU2NCB4Mik9IDB4JTA4bGx4ICUwOGxseCAoTFNCcyA9ICVsbGQpXG4iCisJCQkJICAgIiAgICBuZXcgc2VxIG51bSA9ICVkXG4iLAorCQkJCSAgIHRpZCwgcGVlciwKKwkJCQkgICBwZWVyLT5tYWNfYWRkci5yYXdbMF0sIHBlZXItPm1hY19hZGRyLnJhd1sxXSwKKwkJCQkgICBwZWVyLT5tYWNfYWRkci5yYXdbMl0sIHBlZXItPm1hY19hZGRyLnJhd1szXSwKKwkJCQkgICBwZWVyLT5tYWNfYWRkci5yYXdbNF0sIHBlZXItPm1hY19hZGRyLnJhd1s1XSwKKwkJCQkgICAoaW5kZXggPT0KKwkJCQkgICAgdHhyeF9zZWNfdWNhc3QpID8gInVjYXN0IiA6ICJtY2FzdCIsCisJCQkJICAgbGFzdF9wbi0+cG4xMjhbMV0sIGxhc3RfcG4tPnBuMTI4WzBdLAorCQkJCSAgIGxhc3RfcG4tPnBuMTI4WzBdICYgMHhmZmZmZmZmZmZmZmZVTEwsCisJCQkJICAgbmV3X3BuLnBuMTI4WzFdLCBuZXdfcG4ucG4xMjhbMF0sCisJCQkJICAgbmV3X3BuLnBuMTI4WzBdICYgMHhmZmZmZmZmZmZmZmZVTEwsCisJCQkJICAgaHR0X3J4X21wZHVfZGVzY19zZXFfbnVtKHBkZXYtPmh0dF9wZGV2LAorCQkJCQkJCSAgICByeF9kZXNjKSk7CisjaWYgZGVmaW5lZChFTkFCTEVfUlhfUE5fVFJBQ0UpCisJCQlvbF9yeF9wbl90cmFjZV9kaXNwbGF5KHBkZXYsIDEpOworI2VuZGlmIC8qIEVOQUJMRV9SWF9QTl9UUkFDRSAqLworCQkJb2xfcnhfZXJyKHBkZXYtPmN0cmxfcGRldiwKKwkJCQkgIHZkZXYtPnZkZXZfaWQsIHBlZXItPm1hY19hZGRyLnJhdywgdGlkLAorCQkJCSAgaHR0X3J4X21wZHVfZGVzY190c2YzMihwZGV2LT5odHRfcGRldiwKKwkJCQkJCQkgcnhfZGVzYyksIE9MX1JYX0VSUl9QTiwKKwkJCQkgIG1wZHUsIE5VTEwsIDApOworCQkJLyogZnJlZSBhbGwgTVNEVXMgd2l0aGluIHRoaXMgTVBEVSAqLworCQkJZG8geworCQkJCWNkZl9uYnVmX3QgbmV4dF9tc2R1OworCQkJCU9MX1JYX0VSUl9TVEFUSVNUSUNTXzEocGRldiwgdmRldiwgcGVlciwKKwkJCQkJCSAgICAgICByeF9kZXNjLCBPTF9SWF9FUlJfUE4pOworCQkJCW5leHRfbXNkdSA9IGNkZl9uYnVmX25leHQobXNkdSk7CisJCQkJaHR0X3J4X2Rlc2NfZnJhbWVfZnJlZShwZGV2LT5odHRfcGRldiwgbXNkdSk7CisJCQkJaWYgKG1zZHUgPT0gbXBkdV90YWlsKQorCQkJCQlicmVhazsKKwkJCQllbHNlCisJCQkJCW1zZHUgPSBuZXh0X21zZHU7CisJCQl9IHdoaWxlICgxKTsKKwkJfSBlbHNlIHsKKwkJCUFERF9NUERVX1RPX0xJU1Qob3V0X2xpc3RfaGVhZCwgb3V0X2xpc3RfdGFpbCwgbXBkdSwKKwkJCQkJIG1wZHVfdGFpbCk7CisJCQkvKgorCQkJICogUmVtZW1iZXIgdGhlIG5ldyBQTi4KKwkJCSAqIEZvciBzaW1wbGljaXR5LCBqdXN0IGRvIDIgNjQtYml0IHdvcmQgY29waWVzIHRvCisJCQkgKiBjb3ZlciB0aGUgd29yc3QgY2FzZSAoV0FQSSksIHJlZ2FyZGxlc3Mgb2YgdGhlIGxlbmd0aAorCQkJICogb2YgdGhlIFBOLgorCQkJICogVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGRvaW5nIGEgY29uZGl0aW9uYWwKKwkJCSAqIGJyYW5jaCB0byBjb3B5IG9ubHkgdGhlIHJlbGV2YW50IHBvcnRpb24uCisJCQkgKi8KKwkJCWxhc3RfcG4tPnBuMTI4WzBdID0gbmV3X3BuLnBuMTI4WzBdOworCQkJbGFzdF9wbi0+cG4xMjhbMV0gPSBuZXdfcG4ucG4xMjhbMV07CisJCQlPTF9SWF9QTl9UUkFDRV9BREQocGRldiwgcGVlciwgdGlkLCByeF9kZXNjKTsKKwkJfQorCisJCW1wZHUgPSBuZXh0X21wZHU7CisJfQorCS8qIG1ha2Ugc3VyZSB0aGUgbGlzdCBpcyBudWxsLXRlcm1pbmF0ZWQgKi8KKwlpZiAob3V0X2xpc3RfdGFpbCkKKwkJY2RmX25idWZfc2V0X25leHQob3V0X2xpc3RfdGFpbCwgTlVMTCk7CisKKwlyZXR1cm4gb3V0X2xpc3RfaGVhZDsKK30KKwordm9pZAorb2xfcnhfcG5fY2hlY2soc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCSAgICAgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsIHVuc2lnbmVkIHRpZCwgY2RmX25idWZfdCBtc2R1X2xpc3QpCit7CisJbXNkdV9saXN0ID0gb2xfcnhfcG5fY2hlY2tfYmFzZSh2ZGV2LCBwZWVyLCB0aWQsIG1zZHVfbGlzdCk7CisJb2xfcnhfZndkX2NoZWNrKHZkZXYsIHBlZXIsIHRpZCwgbXNkdV9saXN0KTsKK30KKwordm9pZAorb2xfcnhfcG5fY2hlY2tfb25seShzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCSAgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJCSAgICB1bnNpZ25lZCB0aWQsIGNkZl9uYnVmX3QgbXNkdV9saXN0KQoreworCW1zZHVfbGlzdCA9IG9sX3J4X3BuX2NoZWNrX2Jhc2UodmRldiwgcGVlciwgdGlkLCBtc2R1X2xpc3QpOworCW9sX3J4X2RlbGl2ZXIodmRldiwgcGVlciwgdGlkLCBtc2R1X2xpc3QpOworfQorCisjaWYgZGVmaW5lZChFTkFCTEVfUlhfUE5fVFJBQ0UpCisKK0FfU1RBVFVTIG9sX3J4X3BuX3RyYWNlX2F0dGFjaChvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYpCit7CisJaW50IG51bV9lbGVtczsKKworCW51bV9lbGVtcyA9IDEgPDwgVFhSWF9SWF9QTl9UUkFDRV9TSVpFX0xPRzI7CisJcGRldi0+cnhfcG5fdHJhY2UuaWR4ID0gMDsKKwlwZGV2LT5yeF9wbl90cmFjZS5jbnQgPSAwOworCXBkZXYtPnJ4X3BuX3RyYWNlLm1hc2sgPSBudW1fZWxlbXMgLSAxOworCXBkZXYtPnJ4X3BuX3RyYWNlLmRhdGEgPQorCQljZGZfbWVtX21hbGxvYyhzaXplb2YoKnBkZXYtPnJ4X3BuX3RyYWNlLmRhdGEpICogbnVtX2VsZW1zKTsKKwlpZiAoIXBkZXYtPnJ4X3BuX3RyYWNlLmRhdGEpCisJCXJldHVybiBBX05PX01FTU9SWTsKKwlyZXR1cm4gQV9PSzsKK30KKwordm9pZCBvbF9yeF9wbl90cmFjZV9kZXRhY2gob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KQoreworCWNkZl9tZW1fZnJlZShwZGV2LT5yeF9wbl90cmFjZS5kYXRhKTsKK30KKwordm9pZAorb2xfcnhfcG5fdHJhY2VfYWRkKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1aW50MTZfdCB0aWQsIHZvaWQgKnJ4X2Rlc2MpCit7CisJdWludDMyX3QgaWR4ID0gcGRldi0+cnhfcG5fdHJhY2UuaWR4OworCXVuaW9uIGh0dF9yeF9wbl90IHBuOworCXVpbnQzMl90IHBuMzI7CisJdWludDE2X3Qgc2VxX251bTsKKwl1aW50OF90IHVuaWNhc3Q7CisKKwlodHRfcnhfbXBkdV9kZXNjX3BuKHBkZXYtPmh0dF9wZGV2LCByeF9kZXNjLCAmcG4sIDQ4KTsKKwlwbjMyID0gcG4ucG40OCAmIDB4ZmZmZmZmZmY7CisJc2VxX251bSA9IGh0dF9yeF9tcGR1X2Rlc2Nfc2VxX251bShwZGV2LT5odHRfcGRldiwgcnhfZGVzYyk7CisJdW5pY2FzdCA9ICFodHRfcnhfbXNkdV9pc193bGFuX21jYXN0KHBkZXYtPmh0dF9wZGV2LCByeF9kZXNjKTsKKworCXBkZXYtPnJ4X3BuX3RyYWNlLmRhdGFbaWR4XS5wZWVyID0gcGVlcjsKKwlwZGV2LT5yeF9wbl90cmFjZS5kYXRhW2lkeF0udGlkID0gdGlkOworCXBkZXYtPnJ4X3BuX3RyYWNlLmRhdGFbaWR4XS5zZXFfbnVtID0gc2VxX251bTsKKwlwZGV2LT5yeF9wbl90cmFjZS5kYXRhW2lkeF0udW5pY2FzdCA9IHVuaWNhc3Q7CisJcGRldi0+cnhfcG5fdHJhY2UuZGF0YVtpZHhdLnBuMzIgPSBwbjMyOworCXBkZXYtPnJ4X3BuX3RyYWNlLmNudCsrOworCWlkeCsrOworCXBkZXYtPnJ4X3BuX3RyYWNlLmlkeCA9IGlkeCAmIHBkZXYtPnJ4X3BuX3RyYWNlLm1hc2s7Cit9CisKK3ZvaWQgb2xfcnhfcG5fdHJhY2VfZGlzcGxheShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIGludCBqdXN0X29uY2UpCit7CisJc3RhdGljIGludCBwcmludF9jb3VudCAvKiA9IDAgKi87CisJdWludDMyX3QgaSwgc3RhcnQsIGVuZDsKKwl1aW50NjRfdCBjbnQ7CisJaW50IGVsZW1zOworCWludCBsaW1pdCA9IDA7ICAgICAgICAgIC8qIG1vdmUgdGhpcyB0byB0aGUgYXJnIGxpc3Q/ICovCisKKwlpZiAocHJpbnRfY291bnQgIT0gMCAmJiBqdXN0X29uY2UpCisJCXJldHVybjsKKworCXByaW50X2NvdW50Kys7CisKKwllbmQgPSBwZGV2LT5yeF9wbl90cmFjZS5pZHg7CisJaWYgKHBkZXYtPnJ4X3BuX3RyYWNlLmNudCA8PSBwZGV2LT5yeF9wbl90cmFjZS5tYXNrKSB7CisJCS8qIHRyYWNlIGxvZyBoYXMgbm90IHlldCB3cmFwcGVkIGFyb3VuZCAtIHN0YXJ0IGF0IHRoZSB0b3AgKi8KKwkJc3RhcnQgPSAwOworCQljbnQgPSAwOworCX0gZWxzZSB7CisJCXN0YXJ0ID0gZW5kOworCQljbnQgPSBwZGV2LT5yeF9wbl90cmFjZS5jbnQgLSAocGRldi0+cnhfcG5fdHJhY2UubWFzayArIDEpOworCX0KKwllbGVtcyA9IChlbmQgLSAxIC0gc3RhcnQpICYgcGRldi0+cnhfcG5fdHJhY2UubWFzazsKKwlpZiAobGltaXQgPiAwICYmIGVsZW1zID4gbGltaXQpIHsKKwkJaW50IGRlbHRhOworCQlkZWx0YSA9IGVsZW1zIC0gbGltaXQ7CisJCXN0YXJ0ICs9IGRlbHRhOworCQlzdGFydCAmPSBwZGV2LT5yeF9wbl90cmFjZS5tYXNrOworCQljbnQgKz0gZGVsdGE7CisJfQorCisJaSA9IHN0YXJ0OworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXEgICAgIFBOIik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiAgIGNvdW50ICBpZHggICAgcGVlciAgIHRpZCB1bmkgIG51bSAgICBMU0JzIik7CisJZG8geworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiAgJTZsbGQgJTRkICAlcCAlMmQgICAlZCAlNGQgJThkIiwKKwkJCSAgY250LCBpLAorCQkJICBwZGV2LT5yeF9wbl90cmFjZS5kYXRhW2ldLnBlZXIsCisJCQkgIHBkZXYtPnJ4X3BuX3RyYWNlLmRhdGFbaV0udGlkLAorCQkJICBwZGV2LT5yeF9wbl90cmFjZS5kYXRhW2ldLnVuaWNhc3QsCisJCQkgIHBkZXYtPnJ4X3BuX3RyYWNlLmRhdGFbaV0uc2VxX251bSwKKwkJCSAgcGRldi0+cnhfcG5fdHJhY2UuZGF0YVtpXS5wbjMyKTsKKwkJY250Kys7CisJCWkrKzsKKwkJaSAmPSBwZGV2LT5yeF9wbl90cmFjZS5tYXNrOworCX0gd2hpbGUgKGkgIT0gZW5kKTsKK30KKyNlbmRpZiAvKiBFTkFCTEVfUlhfUE5fVFJBQ0UgKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF9yeF9wbi5oIGIvY29yZS9kcC90eHJ4L29sX3J4X3BuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1ZGM5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvdHhyeC9vbF9yeF9wbi5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfT0xfUlhfUE5fSF8KKyNkZWZpbmUgX09MX1JYX1BOX0hfCisKKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCwgZXRjLiAqLworCisjaW5jbHVkZSA8b2xfdHhyeF9hcGkuaD4gICAgICAgIC8qIG9sX3R4cnhfcGVlcl90LCBldGMuICovCisKK2ludCBvbF9yeF9wbl9jbXAyNCh1bmlvbiBodHRfcnhfcG5fdCAqbmV3X3BuLAorCQkgICB1bmlvbiBodHRfcnhfcG5fdCAqb2xkX3BuLCBpbnQgaXNfdW5pY2FzdCwgaW50IG9wbW9kZSk7CisKK2ludCBvbF9yeF9wbl9jbXA0OCh1bmlvbiBodHRfcnhfcG5fdCAqbmV3X3BuLAorCQkgICB1bmlvbiBodHRfcnhfcG5fdCAqb2xkX3BuLCBpbnQgaXNfdW5pY2FzdCwgaW50IG9wbW9kZSk7CisKK2ludCBvbF9yeF9wbl93YXBpX2NtcCh1bmlvbiBodHRfcnhfcG5fdCAqbmV3X3BuLAorCQkgICAgICB1bmlvbiBodHRfcnhfcG5fdCAqb2xkX3BuLCBpbnQgaXNfdW5pY2FzdCwgaW50IG9wbW9kZSk7CisKKy8qKgorICogQGJyaWVmIElmIGFwcGxpY2FibGUsIGNoZWNrIHRoZSBQYWNrZXQgTnVtYmVyIHRvIGRldGVjdCByZXBsYXlzLgorICogQGRldGFpbHMKKyAqICBEZXRlcm1pbmUgd2hldGhlciBhIFBOIGNoZWNrIGlzIG5lZWRlZCwgYW5kIGlmIHNvLCB3aGF0IHRoZSBQTiBzaXplIGlzLgorICogIChBIFBOIHNpemUgb2YgMCBpcyB1c2VkIHRvIGluZGlyZWN0bHkgYnlwYXNzIHRoZSBQTiBjaGVjayBmb3Igc2VjdXJpdHkKKyAqICBtZXRob2RzIHRoYXQgZG9uJ3QgaW52b2x2ZSBhIFBOIGNoZWNrLikKKyAqICBUaGlzIGZ1bmN0aW9uIHByb2R1Y2VzIGV2ZW50IG5vdGlmaWNhdGlvbnMgZm9yIGFueSBQTiBmYWlsdXJlcywgdmlhIHRoZQorICogIG9sX3J4X2VyciBmdW5jdGlvbi4KKyAqICBBZnRlciB0aGUgUE4gY2hlY2ssIGNhbGwgdGhlIG5leHQgc3RhZ2Ugb2YgcnggcHJvY2Vzc2luZyAocnggLS0+IHR4CisgKiAgZm9yd2FyZGluZyBjaGVjaykuCisgKgorICogQHBhcmFtIHZkZXYgLSB3aGljaCB2aXJ0dWFsIGRldmljZSB0aGUgZnJhbWVzIHdlcmUgYWRkcmVzc2VkIHRvCisgKiBAcGFyYW0gcGVlciAtIHdoaWNoIHBlZXIgdGhlIHJ4IGZyYW1lcyBiZWxvbmcgdG8KKyAqIEBwYXJhbSB0aWQgIC0gd2hpY2ggVElEIHdpdGhpbiB0aGUgcGVlciB0aGUgcnggZnJhbWVzIGJlbG9uZyB0bworICogQHBhcmFtIG1zZHVfbGlzdCAtIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIE1TRFVzIHRvIHBlcmZvcm0gUE4gY2hlY2sgb24KKyAqICAgICAgKGlmIFBOIGNoZWNrIGlzIGFwcGxpY2FibGUsIGkuZS4gUE4gbGVuZ3RoID4gMCkKKyAqLwordm9pZAorb2xfcnhfcG5fY2hlY2soc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCSAgICAgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsIHVuc2lnbmVkIHRpZCwgY2RmX25idWZfdCBtc2R1X2xpc3QpOworCisvKioKKyAqIEBicmllZiBJZiBhcHBsaWNhYmxlLCBjaGVjayB0aGUgUGFja2V0IE51bWJlciB0byBkZXRlY3QgcmVwbGF5cy4KKyAqIEBkZXRhaWxzCisgKiAgRGV0ZXJtaW5lIHdoZXRoZXIgYSBQTiBjaGVjayBpcyBuZWVkZWQsIGFuZCBpZiBzbywgd2hhdCB0aGUgUE4gc2l6ZSBpcy4KKyAqICAoQSBQTiBzaXplIG9mIDAgaXMgdXNlZCB0byBpbmRpcmVjdGx5IGJ5cGFzcyB0aGUgUE4gY2hlY2sgZm9yIHNlY3VyaXR5CisgKiAgbWV0aG9kcyB0aGF0IGRvbid0IGludm9sdmUgYSBQTiBjaGVjay4pCisgKiAgVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBldmVudCBub3RpZmljYXRpb25zIGZvciBhbnkgUE4gZmFpbHVyZXMsIHZpYSB0aGUKKyAqICBvbF9yeF9lcnIgZnVuY3Rpb24uCisgKiAgQWZ0ZXIgdGhlIFBOIGNoZWNrLCBkZWxpdmVyIHRoZSB2YWxpZCByeCBmcmFtZXMgdG8gdGhlIE9TIHNoaW0uCisgKiAgKERvbid0IHBlcmZvcm0gYSByeCAtLT4gdHggZm9yd2FyZGluZyBjaGVjay4pCisgKgorICogQHBhcmFtIHZkZXYgLSB3aGljaCB2aXJ0dWFsIGRldmljZSB0aGUgZnJhbWVzIHdlcmUgYWRkcmVzc2VkIHRvCisgKiBAcGFyYW0gcGVlciAtIHdoaWNoIHBlZXIgdGhlIHJ4IGZyYW1lcyBiZWxvbmcgdG8KKyAqIEBwYXJhbSB0aWQgIC0gd2hpY2ggVElEIHdpdGhpbiB0aGUgcGVlciB0aGUgcnggZnJhbWVzIGJlbG9uZyB0bworICogQHBhcmFtIG1zZHVfbGlzdCAtIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIE1TRFVzIHRvIHBlcmZvcm0gUE4gY2hlY2sgb24KKyAqICAgICAgKGlmIFBOIGNoZWNrIGlzIGFwcGxpY2FibGUsIGkuZS4gUE4gbGVuZ3RoID4gMCkKKyAqLwordm9pZAorb2xfcnhfcG5fY2hlY2tfb25seShzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCSAgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJCSAgICB1bnNpZ25lZCB0aWQsIGNkZl9uYnVmX3QgbXNkdV9saXN0KTsKKworLyoqCisgKiBAYnJpZWYgSWYgYXBwbGljYWJsZSwgY2hlY2sgdGhlIFBhY2tldCBOdW1iZXIgdG8gZGV0ZWN0IHJlcGxheXMuCisgKiBAZGV0YWlscworICogIFNhbWUgYXMgb2xfcnhfcG5fY2hlY2sgYnV0IHJldHVybiB2YWxpZCByeCBuZXRidWZzCisgKiAgcmF0aGVyIHRoYW4gaW52b2tpbmcgdGhlIHJ4IC0tPiB0eCBmb3J3YXJkaW5nIGNoZWNrLgorICoKKyAqIEBwYXJhbSB2ZGV2IC0gd2hpY2ggdmlydHVhbCBkZXZpY2UgdGhlIGZyYW1lcyB3ZXJlIGFkZHJlc3NlZCB0bworICogQHBhcmFtIHBlZXIgLSB3aGljaCBwZWVyIHRoZSByeCBmcmFtZXMgYmVsb25nIHRvCisgKiBAcGFyYW0gdGlkIC0gd2hpY2ggVElEIHdpdGhpbiB0aGUgcGVlciB0aGUgcnggZnJhbWVzIGJlbG9uZyB0bworICogQHBhcmFtIG1zZHVfbGlzdCAtIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIE1TRFVzIHRvIHBlcmZvcm0gUE4gY2hlY2sgb24KKyAqICAgICAgKGlmIFBOIGNoZWNrIGlzIGFwcGxpY2FibGUsIGkuZS4gUE4gbGVuZ3RoID4gMCkKKyAqIEByZXR1cm4gbGlzdCBvZiBuZXRidWZzIHRoYXQgZGlkbid0IGZhaWwgdGhlIFBOIGNoZWNrCisgKi8KK2NkZl9uYnVmX3QKK29sX3J4X3BuX2NoZWNrX2Jhc2Uoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCQkgICAgdW5zaWduZWQgdGlkLCBjZGZfbmJ1Zl90IG1zZHVfbGlzdCk7CisKKyNlbmRpZiAvKiBfT0xfUlhfUE5fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF9yeF9yZW9yZGVyLmMgYi9jb3JlL2RwL3R4cngvb2xfcnhfcmVvcmRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGQ0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfcnhfcmVvcmRlci5jCkBAIC0wLDAgKzEsODI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKj09PSBoZWFkZXIgZmlsZSBpbmNsdWRlcyA9PT0qLworLyogZ2VuZXJpYyB1dGlsaXRpZXMgKi8KKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCwgZXRjLiAqLworI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4gICAgICAgICAvKiBjZGZfbWVtX21hbGxvYyAqLworCisjaW5jbHVkZSA8aWVlZTgwMjExLmg+ICAgICAgICAgIC8qIElFRUU4MDIxMV9TRVFfTUFYICovCisKKy8qIGV4dGVybmFsIGludGVyZmFjZXMgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2FwaS5oPiAgICAgICAgLyogb2xfdHhyeF9wZGV2X2hhbmRsZSAqLworI2luY2x1ZGUgPG9sX3R4cnhfaHR0X2FwaS5oPiAgICAvKiBvbF9yeF9hZGRiYV9oYW5kbGVyLCBldGMuICovCisjaW5jbHVkZSA8b2xfY3RybF90eHJ4X2FwaS5oPiAgIC8qIG9sX2N0cmxfcnhfYWRkYmFfY29tcGxldGUgKi8KKyNpbmNsdWRlIDxvbF9odHRfcnhfYXBpLmg+ICAgICAgLyogaHR0X3J4X2Rlc2NfZnJhbWVfZnJlZSAqLworI2luY2x1ZGUgPG9sX2N0cmxfdHhyeF9hcGkuaD4gICAvKiBvbF9yeF9lcnIgKi8KKworLyogZGF0YXBhdGggaW50ZXJuYWwgaW50ZXJmYWNlcyAqLworI2luY2x1ZGUgPG9sX3R4cnhfcGVlcl9maW5kLmg+ICAvKiBvbF90eHJ4X3BlZXJfZmluZF9ieV9pZCAqLworI2luY2x1ZGUgPG9sX3R4cnhfaW50ZXJuYWwuaD4gICAvKiBUWFJYX0FTU0VSVCAqLworI2luY2x1ZGUgPG9sX3J4X3Jlb3JkZXJfdGltZW91dC5oPiAgICAgIC8qIE9MX1JYX1JFT1JERVJfVElNRU9VVF9SRU1PVkUsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF9yeF9yZW9yZGVyLmg+CisjaW5jbHVkZSA8b2xfcnhfZGVmcmFnLmg+CisKKy8qPT09IGRhdGEgdHlwZXMgYW5kIGRlZmluZXMgPT09Ki8KKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9ST1VORF9QV1IyKHZhbHVlKSBnX2xvZzJjZWlsW3ZhbHVlXQorCisvKj09PSBnbG9iYWwgdmFyaWFibGVzID09PSovCisKK3N0YXRpYyBjaGFyIGdfbG9nMmNlaWxbXSA9IHsKKwkxLCAgICAgICAgICAgICAgICAgICAgICAvKiAwIC0+IDEgKi8KKwkxLCAgICAgICAgICAgICAgICAgICAgICAvKiAxIC0+IDEgKi8KKwkyLCAgICAgICAgICAgICAgICAgICAgICAvKiAyIC0+IDIgKi8KKwk0LCA0LCAgICAgICAgICAgICAgICAgICAvKiAzLTQgLT4gNCAqLworCTgsIDgsIDgsIDgsICAgICAgICAgICAgIC8qIDUtOCAtPiA4ICovCisJMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAvKiA5LTE2IC0+IDE2ICovCisJMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorCTMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgLyogMTctMzIgLT4gMzIgKi8KKwk2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsCisJNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LAorCTY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKKwk2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIC8qIDMzLTY0IC0+IDY0ICovCit9OworCisvKj09PSBmdW5jdGlvbiBkZWZpbml0aW9ucyA9PT0qLworCisvKi0tLSovCisKKyNkZWZpbmUgUUNBX1NVUFBPUlRfUlhfUkVPUkRFUl9SRUxFQVNFX0NIRUNLIDAKKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9JRFhfU1RBUlRfU0VMRl9TRUxFQ1QocGVlciwgdGlkLCBpZHhfc3RhcnQpICAvKiBuby1vcCAqLworI2RlZmluZSBPTF9SWF9SRU9SREVSX0lEWF9XUkFQKGlkeCwgd2luX3N6LCB3aW5fc3pfbWFzaykgeyBpZHggJj0gd2luX3N6X21hc2s7IH0KKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9JRFhfTUFYKHdpbl9zeiwgd2luX3N6X21hc2spIHdpbl9zel9tYXNrCisjZGVmaW5lIE9MX1JYX1JFT1JERVJfSURYX0lOSVQoc2VxX251bSwgd2luX3N6LCB3aW5fc3pfbWFzaykgMCAgLyogbi9hICovCisjZGVmaW5lIE9MX1JYX1JFT1JERVJfTk9fSE9MRVMocnhfcmVvcmRlcikgMAorI2RlZmluZSBPTF9SWF9SRU9SREVSX01QRFVfQ05UX0lOQ1IocnhfcmVvcmRlciwgaW5jcikgICAvKiBuL2EgKi8KKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9NUERVX0NOVF9ERUNSKHJ4X3Jlb3JkZXIsIGRlY3IpICAgLyogbi9hICovCisKKy8qLS0tKi8KKworLyogcmVvcmRlciBhcnJheSBlbGVtZW50cyBhcmUga25vd24gdG8gYmUgbm9uLU5VTEwgKi8KKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9QVFJfQ0hFQ0socHRyKSAgICAvKiBuby1vcCAqLworI2RlZmluZSBPTF9SWF9SRU9SREVSX0xJU1RfQVBQRU5EKGhlYWRfbXNkdSwgdGFpbF9tc2R1LCByeF9yZW9yZGVyX2FycmF5X2VsZW0pIFwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICh0YWlsX21zZHUpIHsJCQkJCVwKKwkJCWNkZl9uYnVmX3NldF9uZXh0KHRhaWxfbXNkdSwJCQlcCisJCQkJCSAgcnhfcmVvcmRlcl9hcnJheV9lbGVtLT5oZWFkKTsgXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisvKiBmdW5jdGlvbnMgY2FsbGVkIGJ5IHR4cnggY29tcG9uZW50cyAqLworCit2b2lkIG9sX3J4X3Jlb3JkZXJfaW5pdChzdHJ1Y3Qgb2xfcnhfcmVvcmRlcl90ICpyeF9yZW9yZGVyLCB1aW50OF90IHRpZCkKK3sKKwlyeF9yZW9yZGVyLT53aW5fc3ogPSAxOworCXJ4X3Jlb3JkZXItPndpbl9zel9tYXNrID0gMDsKKwlyeF9yZW9yZGVyLT5hcnJheSA9ICZyeF9yZW9yZGVyLT5iYXNlOworCXJ4X3Jlb3JkZXItPmJhc2UuaGVhZCA9IHJ4X3Jlb3JkZXItPmJhc2UudGFpbCA9IE5VTEw7CisJcnhfcmVvcmRlci0+dGlkID0gdGlkOworCXJ4X3Jlb3JkZXItPmRlZnJhZ190aW1lb3V0X21zID0gMDsKKworCXJ4X3Jlb3JkZXItPmRlZnJhZ193YWl0bGlzdF9lbGVtLnRxZV9uZXh0ID0gTlVMTDsKKwlyeF9yZW9yZGVyLT5kZWZyYWdfd2FpdGxpc3RfZWxlbS50cWVfcHJldiA9IE5VTEw7Cit9CisKK3N0YXRpYyBlbnVtIGh0dF9yeF9zdGF0dXMKK29sX3J4X3Jlb3JkZXJfc2VxX251bV9jaGVjaygKKwkJCQlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCQkJICAgIHVuc2lnbmVkIHRpZCwgdW5zaWduZWQgc2VxX251bSkKK3sKKwl1bnNpZ25lZCBzZXFfbnVtX2RlbHRhOworCisJLyogZG9uJ3QgY2hlY2sgdGhlIG5ldyBzZXFfbnVtIGFnYWluc3QgbGFzdF9zZXEKKwkgICBpZiBsYXN0X3NlcSBpcyBub3QgdmFsaWQgKi8KKwlpZiAocGVlci0+dGlkc19sYXN0X3NlcVt0aWRdID09IElFRUU4MDIxMV9TRVFfTUFYKQorCQlyZXR1cm4gaHR0X3J4X3N0YXR1c19vazsKKworCS8qCisJICogRm9yIGR1cGxpY2F0ZSBkZXRlY3Rpb24sIGl0IG1pZ2h0IGJlIGhlbHBmdWwgdG8gYWxzbyBjaGVjaworCSAqIHdoZXRoZXIgdGhlIHJldHJ5IGJpdCBpcyBzZXQgb3Igbm90IC0gYSBzdHJpY3QgZHVwbGljYXRlIHBhY2tldAorCSAqIHNob3VsZCBiZSB0aGUgb25lIHdpdGggcmV0cnkgYml0IHNldC4KKwkgKiBIb3dldmVyLCBzaW5jZSBtYW55IGltcGxlbWVudGF0aW9ucyBkbyBub3Qgc2V0IHRoZSByZXRyeSBiaXQsCisJICogYW5kIHNpbmNlIHRoaXMgc2FtZSBmdW5jdGlvbiBpcyBhbHNvIHVzZWQgZm9yIGZpbHRlcmluZyBvdXQKKwkgKiBsYXRlLWFycml2aW5nIGZyYW1lcyAoZnJhbWVzIHRoYXQgYXJpdmUgYWZ0ZXIgdGhlaXIgcnggcmVvcmRlcgorCSAqIHRpbWVvdXQgaGFzIGV4cGlyZWQpIHdoaWNoIGFyZSBub3QgcmV0cmllcywgZG9uJ3QgYm90aGVyIGNoZWNraW5nCisJICogdGhlIHJldHJ5IGJpdCBmb3Igbm93LgorCSAqLworCS8qIG5vdGU6IGlmIG5ldyBzZXFfbnVtID09IG9sZCBzZXFfbnVtLCBzZXFfbnVtX2RlbHRhID0gNDA5NSAqLworCXNlcV9udW1fZGVsdGEgPSAoc2VxX251bSAtIDEgLSBwZWVyLT50aWRzX2xhc3Rfc2VxW3RpZF0pICYKKwkJKElFRUU4MDIxMV9TRVFfTUFYIC0gMSk7ICAgICAvKiBhY2NvdW50IGZvciB3cmFwYXJvdW5kICovCisKKwlpZiAoc2VxX251bV9kZWx0YSA+IChJRUVFODAyMTFfU0VRX01BWCA+PiAxKSkgeworCQlyZXR1cm4gaHR0X3J4X3N0YXR1c19lcnJfcmVwbGF5OworCQkvKiBvciBtYXliZSBodHRfcnhfc3RhdHVzX2Vycl9kdXAgKi8KKwl9CisJcmV0dXJuIGh0dF9yeF9zdGF0dXNfb2s7Cit9CisKKy8qKgorICogb2xfcnhfc2VxX251bV9jaGVjaygpIC0gRG9lcyBkdXBsaWNhdGUgZGV0ZWN0aW9uIGZvciBtY2FzdCBwYWNrZXRzIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGUgZGV0ZWN0aW9uICYgY2hlY2sgZm9yIG91dC1vZi1vcmRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRzIGZvciB1bmljYXN0IHBhY2tldHMuCisgKiBAcGRldjogICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHBkZXYgbWFpbnRhaW5lZCBieSBPTAorICogQHBlZXI6ICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBwZWVyIHN0cnVjdHVyZSBtYWludGFpbmVkIGJ5IE9MCisgKiBAdGlkOiAgICAgICAgICAgICAgICAgICAgICAgICBUSUQgdmFsdWUgcGFzc2VkIGFzIHBhcnQgb2YgSFRUIG1zZyBieSBmL3cKKyAqIEByeF9tcGR1X2Rlc2M6ICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gUnggRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIE1QRFUKKyAqCisgKiAgVGhpcyBmdW5jdGlvbgorICogICAgICAxKSBGb3IgTXVsdGljYXN0IEZyYW1lcyAtLSBkb2VzIGR1cGxpY2F0ZSBkZXRlY3Rpb24KKyAqICAgICAgICAgIEEgZnJhbWUgaXMgY29uc2lkZXJlZCBkdXBsaWNhdGUgJiBkcm9wcGVkIGlmIGl0IGhhcyBhIHNlcS5udW1iZXIKKyAqICAgICAgICAgIHdoaWNoIGlzIHJlY2VpdmVkIHR3aWNlIGluIHN1Y2Nlc3Npb24gYW5kIHdpdGggdGhlIHJldHJ5IGJpdCBzZXQKKyAqICAgICAgICAgIGluIHRoZSBzZWNvbmQgY2FzZS4KKyAqICAgICAgICAgIEEgZnJhbWUgd2hpY2ggaXMgb2xkZXIgdGhhbiB0aGUgbGFzdCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQKKyAqICAgICAgICAgIGlzIG5vdCBjb25zaWRlcmVkIGR1cGxpY2F0ZSBidXQgb3V0LW9mLW9yZGVyLiBUaGlzIGZ1bmN0aW9uIGRvZXMKKyAqICAgICAgICAgIHBlcmZvcm0gb3V0LW9mLW9yZGVyIGNoZWNrIGZvciBtdWx0aWNhc3QgZnJhbWVzLCB3aGljaCBpcyBpbgorICogICAgICAgICAga2VlcGluZyB3aXRoIHRoZSA4MDIuMTEgMjAxMiBzcGVjIHNlY3Rpb24gOS4zLjIuMTAKKyAqICAgICAgMikgRm9yIFVuaWNhc3QgRnJhbWVzIC0tIGRvZXMgZHVwbGljYXRlIGRldGVjdGlvbiAmIG91dC1vZi1vcmRlciBjaGVjaworICogICAgICAgICAgb25seSBmb3Igbm9uLWFnZ3JlZ2F0aW9uIHRpZHMuCisgKgorICogUmV0dXJuOiAgICAgICAgUmV0dXJucyBodHRfcnhfc3RhdHVzX2Vycl9yZXBsYXksIGlmIHBhY2tldCBuZWVkcyB0byBiZQorICogICAgICAgICAgICAgICAgZHJvcHBlZCwgaHR0X3J4X3N0YXR1c19vayBvdGhlcndpc2UuCisgKi8KK2VudW0gaHR0X3J4X3N0YXR1cworb2xfcnhfc2VxX251bV9jaGVjayhzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkJCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJCQkJdWludDhfdCB0aWQsCisJCQkJCXZvaWQgKnJ4X21wZHVfZGVzYykKK3sKKwl1aW50MTZfdCBwa3RfdGlkID0gMHhmZmZmOworCXVpbnQxNl90IHNlcV9udW0gPSBJRUVFODAyMTFfU0VRX01BWDsKKwlib29sIHJldHJ5ID0gMDsKKworCXNlcV9udW0gPSBodHRfcnhfbXBkdV9kZXNjX3NlcV9udW0ocGRldi0+aHR0X3BkZXYsIHJ4X21wZHVfZGVzYyk7CisKKwkgLyogRm9yIG1jYXN0IHBhY2tldHMsIHdlIG9ubHkgdGhlIGR1cC1kZXRlY3Rpb24sIG5vdCByZS1vcmRlciBjaGVjayAqLworCisJaWYgKGNkZl91bmxpa2VseShPTF9SWF9NQ0FTVF9USUQgPT0gdGlkKSkgeworCisJCXBrdF90aWQgPSBodHRfcnhfbXBkdV9kZXNjX3RpZChwZGV2LT5odHRfcGRldiwgcnhfbXBkdV9kZXNjKTsKKworCQkvKiBJbnZhbGlkIHBhY2tldCBUSUQsIGV4cGVjdGVkIG9ubHkgZm9yIEhMICovCisJCS8qIFBhc3MgdGhlIHBhY2tldCBvbiAqLworCQlpZiAoY2RmX3VubGlrZWx5KHBrdF90aWQgPj0gT0xfVFhSWF9OVU1fRVhUX1RJRFMpKQorCQkJcmV0dXJuIGh0dF9yeF9zdGF0dXNfb2s7CisKKwkJcmV0cnkgPSBodHRfcnhfbXBkdV9kZXNjX3JldHJ5KHBkZXYtPmh0dF9wZGV2LCByeF9tcGR1X2Rlc2MpOworCisJCS8qCisJCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGRlZmluZSBmcmFtZXMgdG8gYmUgZHVwbGljYXRlIGlmIHRoZXkgYXJyaXZlCisJCSAqICJPTkxZIiBpbiBzdWNjZXNzaW9uIHdpdGggdGhlIHNhbWUgc2VxdWVuY2UgbnVtYmVyIGFuZCB0aGUgbGFzdAorCQkgKiBvbmUgaGFzIHRoZSByZXRyeSBiaXQgc2V0LiBGb3IgYW4gb2xkZXIgZnJhbWUsIHdlIGNvbnNpZGVyIHRoYXQKKwkJICogYXMgYW4gb3V0IG9mIG9yZGVyIGZyYW1lLCBhbmQgaGVuY2UgZG8gbm90IHBlcmZvcm0gdGhlIGR1cC1kZXRlY3Rpb24KKwkJICogb3Igb3V0LW9mLW9yZGVyIGNoZWNrIGZvciBtdWx0aWNhc3QgZnJhbWVzIGFzIHBlciBkaXNjdXNzaW9ucyAmIHNwZWMKKwkJICogSGVuY2UgInNlcV9udW0gPD0gbGFzdF9zZXFfbnVtIiBjaGVjayBpcyBub3QgbmVjZXNzYXJ5LgorCQkgKi8KKwkJaWYgKGNkZl91bmxpa2VseShyZXRyeSAmJgorCQkJKHNlcV9udW0gPT0gcGVlci0+dGlkc19tY2FzdF9sYXN0X3NlcVtwa3RfdGlkXSkpKSB7LyogZHJvcCBtY2FzdCAqLworCQkJVFhSWF9TVEFUU19JTkNSKHBkZXYsIHByaXYucnguZXJyLm1zZHVfbWNfZHVwX2Ryb3ApOworCQkJcmV0dXJuIGh0dF9yeF9zdGF0dXNfZXJyX3JlcGxheTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgbXVsdGljYXN0IHBhY2tldCBsaWtlbHkgdG8gYmUgcGFzc2VkIG9uLi4uCisJCQkgKiBTZXQgdGhlIG1jYXN0IGxhc3Qgc2VxIG51bWJlciBoZXJlCisJCQkgKiBUaGlzIGlzIGZhaXJseSBhY2N1cmF0ZSBzaW5jZToKKwkJCSAqIGEpIGYvdyBzZW5kcyBtdWx0aWNhc3QgYXMgc2VwYXJhdGUgUFBEVS9IVFQgbWVzc2FnZXMKKwkJCSAqIGIpIE1jYXN0IHBhY2tldHMgYXJlIG5vdCBhZ2dyZWdhdGVkICYgaGVuY2Ugc2luZ2xlCisJCQkgKiBjKSBSZXN1bHQgb2YgYikgaXMgdGhhdCwgZmx1c2ggLyByZWxlYXNlIGJpdCBpcyBzZXQgYWx3YXlzCisJCQkgKglvbiB0aGUgbWNhc3QgcGFja2V0cywgc28gbGlrZWx5IHRvIGJlIGltbWVkaWF0ZWRseSByZWxlYXNlZC4KKwkJCSAqLworCQkJcGVlci0+dGlkc19tY2FzdF9sYXN0X3NlcVtwa3RfdGlkXSA9IHNlcV9udW07CisJCQlyZXR1cm4gaHR0X3J4X3N0YXR1c19vazsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gb2xfcnhfcmVvcmRlcl9zZXFfbnVtX2NoZWNrKHBkZXYsIHBlZXIsIHRpZCwgc2VxX251bSk7Cit9CisKKwordm9pZAorb2xfcnhfcmVvcmRlcl9zdG9yZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCSAgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJCSAgICB1bnNpZ25lZCB0aWQsCisJCSAgICB1bnNpZ25lZCBpZHgsIGNkZl9uYnVmX3QgaGVhZF9tc2R1LCBjZGZfbmJ1Zl90IHRhaWxfbXNkdSkKK3sKKwlzdHJ1Y3Qgb2xfcnhfcmVvcmRlcl9hcnJheV9lbGVtX3QgKnJ4X3Jlb3JkZXJfYXJyYXlfZWxlbTsKKworCWlkeCAmPSBwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS53aW5fc3pfbWFzazsKKwlyeF9yZW9yZGVyX2FycmF5X2VsZW0gPSAmcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0uYXJyYXlbaWR4XTsKKwlpZiAocnhfcmVvcmRlcl9hcnJheV9lbGVtLT5oZWFkKSB7CisJCWNkZl9uYnVmX3NldF9uZXh0KHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+dGFpbCwgaGVhZF9tc2R1KTsKKwl9IGVsc2UgeworCQlyeF9yZW9yZGVyX2FycmF5X2VsZW0tPmhlYWQgPSBoZWFkX21zZHU7CisJCU9MX1JYX1JFT1JERVJfTVBEVV9DTlRfSU5DUigmcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0sIDEpOworCX0KKwlyeF9yZW9yZGVyX2FycmF5X2VsZW0tPnRhaWwgPSB0YWlsX21zZHU7Cit9CisKK3ZvaWQKK29sX3J4X3Jlb3JkZXJfcmVsZWFzZShzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCSAgICAgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJICAgICAgdW5zaWduZWQgdGlkLCB1bnNpZ25lZCBpZHhfc3RhcnQsIHVuc2lnbmVkIGlkeF9lbmQpCit7CisJdW5zaWduZWQgaWR4OworCXVuc2lnbmVkIHdpbl9zeiwgd2luX3N6X21hc2s7CisJc3RydWN0IG9sX3J4X3Jlb3JkZXJfYXJyYXlfZWxlbV90ICpyeF9yZW9yZGVyX2FycmF5X2VsZW07CisJY2RmX25idWZfdCBoZWFkX21zZHU7CisJY2RmX25idWZfdCB0YWlsX21zZHU7CisKKwlPTF9SWF9SRU9SREVSX0lEWF9TVEFSVF9TRUxGX1NFTEVDVChwZWVyLCB0aWQsICZpZHhfc3RhcnQpOworCS8qIG1heSBnZXQgcmVzZXQgYmVsb3cgKi8KKwlwZWVyLT50aWRzX25leHRfcmVsX2lkeFt0aWRdID0gKHVpbnQxNl90KSBpZHhfZW5kOworCisJd2luX3N6ID0gcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0ud2luX3N6OworCXdpbl9zel9tYXNrID0gcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0ud2luX3N6X21hc2s7CisJaWR4X3N0YXJ0ICY9IHdpbl9zel9tYXNrOworCWlkeF9lbmQgJj0gd2luX3N6X21hc2s7CisJcnhfcmVvcmRlcl9hcnJheV9lbGVtID0gJnBlZXItPnRpZHNfcnhfcmVvcmRlclt0aWRdLmFycmF5W2lkeF9zdGFydF07CisKKwloZWFkX21zZHUgPSByeF9yZW9yZGVyX2FycmF5X2VsZW0tPmhlYWQ7CisJdGFpbF9tc2R1ID0gcnhfcmVvcmRlcl9hcnJheV9lbGVtLT50YWlsOworCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCA9IHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+dGFpbCA9IE5VTEw7CisJT0xfUlhfUkVPUkRFUl9QVFJfQ0hFQ0soaGVhZF9tc2R1KSB7CisJCU9MX1JYX1JFT1JERVJfTVBEVV9DTlRfREVDUigmcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0sIDEpOworCX0KKworCWlkeCA9IChpZHhfc3RhcnQgKyAxKTsKKwlPTF9SWF9SRU9SREVSX0lEWF9XUkFQKGlkeCwgd2luX3N6LCB3aW5fc3pfbWFzayk7CisJd2hpbGUgKGlkeCAhPSBpZHhfZW5kKSB7CisJCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbSA9ICZwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS5hcnJheVtpZHhdOworCQlPTF9SWF9SRU9SREVSX1BUUl9DSEVDSyhyeF9yZW9yZGVyX2FycmF5X2VsZW0tPmhlYWQpIHsKKwkJCU9MX1JYX1JFT1JERVJfTVBEVV9DTlRfREVDUigmcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0sCisJCQkJCQkgICAgMSk7CisJCQlPTF9SWF9SRU9SREVSX0xJU1RfQVBQRU5EKGhlYWRfbXNkdSwgdGFpbF9tc2R1LAorCQkJCQkJICByeF9yZW9yZGVyX2FycmF5X2VsZW0pOworCQkJdGFpbF9tc2R1ID0gcnhfcmVvcmRlcl9hcnJheV9lbGVtLT50YWlsOworCQl9CisJCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCA9IHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+dGFpbCA9CisJCQkJCQkgICAgICBOVUxMOworCQlpZHgrKzsKKwkJT0xfUlhfUkVPUkRFUl9JRFhfV1JBUChpZHgsIHdpbl9zeiwgd2luX3N6X21hc2spOworCX0KKwlPTF9SWF9SRU9SREVSX1BUUl9DSEVDSyhoZWFkX21zZHUpIHsKKwkJdWludDE2X3Qgc2VxX251bTsKKwkJaHR0X3BkZXZfaGFuZGxlIGh0dF9wZGV2ID0gdmRldi0+cGRldi0+aHR0X3BkZXY7CisKKwkJLyoKKwkJICogVGhpcyBsb2dpYyBpcyBub3QgcXVpdGUgY29ycmVjdCAtIHRoZSBsYXN0X3NlcSB2YWx1ZSBzaG91bGQKKwkJICogYmUgdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgZmluYWwgTVBEVSByZWxlYXNlZCByYXRoZXIgdGhhbgorCQkgKiB0aGUgaW5pdGlhbCBNUERVIHJlbGVhc2VkLgorCQkgKiBIb3dldmVyLCB0cmFja2luZyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBmaXJzdCBNUERVIGluCisJCSAqIHRoZSByZWxlYXNlZCBiYXRjaCB3b3JrcyB3ZWxsIGVub3VnaDoKKwkJICogRm9yIFBlcmVncmluZSBhbmQgUm9tZSwgdGhlIGxhc3Rfc2VxIGlzIGNoZWNrZWQgb25seSBmb3IKKwkJICogbm9uLWFnZ3JlZ2F0ZSBjYXNlcywgd2hlcmUgb25seSBvbmUgTVBEVSBhdCBhIHRpbWUgaXMKKwkJICogcmVsZWFzZWQuCisJCSAqIEZvciBSaXZhLCBQcm9udG8sIGFuZCBOb3J0aHN0YXIsIHRoZSBsYXN0X3NlcSBpcyBjaGVja2VkIHRvCisJCSAqIGZpbHRlciBvdXQgbGF0ZS1hcnJpdmluZyByeCBmcmFtZXMsIHdob3NlIHNlcXVlbmNlIG51bWJlcgorCQkgKiB3aWxsIGJlIGxlc3MgdGhhbiB0aGUgZmlyc3QgTVBEVSBpbiB0aGlzIHJlbGVhc2UgYmF0Y2guCisJCSAqLworCQlzZXFfbnVtID0gaHR0X3J4X21wZHVfZGVzY19zZXFfbnVtKAorCQkJaHR0X3BkZXYsCisJCQlodHRfcnhfbXNkdV9kZXNjX3JldHJpZXZlKGh0dF9wZGV2LAorCQkJCQkJICBoZWFkX21zZHUpKTsKKwkJcGVlci0+dGlkc19sYXN0X3NlcVt0aWRdID0gc2VxX251bTsKKwkJLyogcnhfb3B0X3Byb2MgdGFrZXMgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBtc2R1IG5ldGJ1ZnMgKi8KKwkJY2RmX25idWZfc2V0X25leHQodGFpbF9tc2R1LCBOVUxMKTsKKwkJcGVlci0+cnhfb3B0X3Byb2ModmRldiwgcGVlciwgdGlkLCBoZWFkX21zZHUpOworCX0KKwkvKgorCSAqIElmIHRoZSByeCByZW9yZGVyIHRpbWVvdXQgaXMgaGFuZGxlZCBieSBob3N0IFNXIHJhdGhlciB0aGFuIHRoZQorCSAqIHRhcmdldCdzIHJ4IHJlb3JkZXIgbG9naWMsIHRoZW4gc3RvcCB0aGUgdGltZXIgaGVyZS4KKwkgKiAoSWYgdGhlcmUgYXJlIHJlbWFpbmluZyByeCBob2xlcywgdGhlbiB0aGUgdGltZXIgd2lsbCBiZSByZXN0YXJ0ZWQuKQorCSAqLworCU9MX1JYX1JFT1JERVJfVElNRU9VVF9SRU1PVkUocGVlciwgdGlkKTsKK30KKwordm9pZAorb2xfcnhfcmVvcmRlcl9mbHVzaChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCSAgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJCSAgICB1bnNpZ25lZCB0aWQsCisJCSAgICB1bnNpZ25lZCBpZHhfc3RhcnQsCisJCSAgICB1bnNpZ25lZCBpZHhfZW5kLCBlbnVtIGh0dF9yeF9mbHVzaF9hY3Rpb24gYWN0aW9uKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldjsKKwl1bnNpZ25lZCB3aW5fc3o7CisJdWludDhfdCB3aW5fc3pfbWFzazsKKwlzdHJ1Y3Qgb2xfcnhfcmVvcmRlcl9hcnJheV9lbGVtX3QgKnJ4X3Jlb3JkZXJfYXJyYXlfZWxlbTsKKwljZGZfbmJ1Zl90IGhlYWRfbXNkdSA9IE5VTEw7CisJY2RmX25idWZfdCB0YWlsX21zZHUgPSBOVUxMOworCisJcGRldiA9IHZkZXYtPnBkZXY7CisJd2luX3N6ID0gcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0ud2luX3N6OworCXdpbl9zel9tYXNrID0gcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0ud2luX3N6X21hc2s7CisKKwlPTF9SWF9SRU9SREVSX0lEWF9TVEFSVF9TRUxGX1NFTEVDVChwZWVyLCB0aWQsICZpZHhfc3RhcnQpOworCS8qIGEgaWR4X2VuZCB2YWx1ZSBvZiAweGZmZmYgbWVhbnMgdG8gZmx1c2ggdGhlIGVudGlyZSBhcnJheSAqLworCWlmIChpZHhfZW5kID09IDB4ZmZmZikgeworCQlpZHhfZW5kID0gaWR4X3N0YXJ0OworCQkvKgorCQkgKiBUaGUgYXJyYXkgaXMgYmVpbmcgZmx1c2hlZCBpbiBlbnRpcmV0eSBiZWNhdXNlIHRoZSBibG9jaworCQkgKiBhY2sgd2luZG93IGhhcyBiZWVuIHNoaWZ0ZWQgdG8gYSBuZXcgcG9zaXRpb24gdGhhdCBkb2VzIG5vdAorCQkgKiBvdmVybGFwIHdpdGggdGhlIG9sZCBwb3NpdGlvbi4gIChPciBkdWUgdG8gcmVjZXB0aW9uIG9mIGEKKwkJICogREVMQkEuKQorCQkgKiBUaHVzLCBzaW5jZSB0aGUgYmxvY2sgYWNrIHdpbmRvdyBpcyBlc3NlbnRpYWxseSBiZWluZyByZXNldCwKKwkJICogcmVzZXQgdGhlICJuZXh0IHJlbGVhc2UgaW5kZXgiLgorCQkgKi8KKwkJcGVlci0+dGlkc19uZXh0X3JlbF9pZHhbdGlkXSA9CisJCQlPTF9SWF9SRU9SREVSX0lEWF9JTklUKDAgLypuL2EgKi8sIHdpbl9zeiwgd2luX3N6X21hc2spOworCX0gZWxzZSB7CisJCXBlZXItPnRpZHNfbmV4dF9yZWxfaWR4W3RpZF0gPSAodWludDE2X3QpIGlkeF9lbmQ7CisJfQorCisJaWR4X3N0YXJ0ICY9IHdpbl9zel9tYXNrOworCWlkeF9lbmQgJj0gd2luX3N6X21hc2s7CisKKwlkbyB7CisJCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbSA9CisJCQkmcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0uYXJyYXlbaWR4X3N0YXJ0XTsKKwkJaWR4X3N0YXJ0ID0gKGlkeF9zdGFydCArIDEpOworCQlPTF9SWF9SRU9SREVSX0lEWF9XUkFQKGlkeF9zdGFydCwgd2luX3N6LCB3aW5fc3pfbWFzayk7CisKKwkJaWYgKHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCkgeworCQkJT0xfUlhfUkVPUkRFUl9NUERVX0NOVF9ERUNSKCZwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXSwKKwkJCQkJCSAgICAxKTsKKwkJCWlmIChoZWFkX21zZHUgPT0gTlVMTCkgeworCQkJCWhlYWRfbXNkdSA9IHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZDsKKwkJCQl0YWlsX21zZHUgPSByeF9yZW9yZGVyX2FycmF5X2VsZW0tPnRhaWw7CisJCQkJcnhfcmVvcmRlcl9hcnJheV9lbGVtLT5oZWFkID0gTlVMTDsKKwkJCQlyeF9yZW9yZGVyX2FycmF5X2VsZW0tPnRhaWwgPSBOVUxMOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2RmX25idWZfc2V0X25leHQodGFpbF9tc2R1LAorCQkJCQkgIHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCk7CisJCQl0YWlsX21zZHUgPSByeF9yZW9yZGVyX2FycmF5X2VsZW0tPnRhaWw7CisJCQlyeF9yZW9yZGVyX2FycmF5X2VsZW0tPmhlYWQgPQorCQkJCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+dGFpbCA9IE5VTEw7CisJCX0KKwl9IHdoaWxlIChpZHhfc3RhcnQgIT0gaWR4X2VuZCk7CisKKwlvbF9yeF9kZWZyYWdfd2FpdGxpc3RfcmVtb3ZlKHBlZXIsIHRpZCk7CisKKwlpZiAoaGVhZF9tc2R1KSB7CisJCXVpbnQxNl90IHNlcV9udW07CisJCWh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiA9IHZkZXYtPnBkZXYtPmh0dF9wZGV2OworCisJCXNlcV9udW0gPSBodHRfcnhfbXBkdV9kZXNjX3NlcV9udW0oCisJCQlodHRfcGRldiwKKwkJCWh0dF9yeF9tc2R1X2Rlc2NfcmV0cmlldmUoaHR0X3BkZXYsIGhlYWRfbXNkdSkpOworCQlwZWVyLT50aWRzX2xhc3Rfc2VxW3RpZF0gPSBzZXFfbnVtOworCQkvKiByeF9vcHRfcHJvYyB0YWtlcyBhIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIG1zZHUgbmV0YnVmcyAqLworCQljZGZfbmJ1Zl9zZXRfbmV4dCh0YWlsX21zZHUsIE5VTEwpOworCQlpZiAoYWN0aW9uID09IGh0dF9yeF9mbHVzaF9yZWxlYXNlKSB7CisJCQlwZWVyLT5yeF9vcHRfcHJvYyh2ZGV2LCBwZWVyLCB0aWQsIGhlYWRfbXNkdSk7CisJCX0gZWxzZSB7CisJCQlkbyB7CisJCQkJY2RmX25idWZfdCBuZXh0OworCQkJCW5leHQgPSBjZGZfbmJ1Zl9uZXh0KGhlYWRfbXNkdSk7CisJCQkJaHR0X3J4X2Rlc2NfZnJhbWVfZnJlZShwZGV2LT5odHRfcGRldiwKKwkJCQkJCSAgICAgICBoZWFkX21zZHUpOworCQkJCWhlYWRfbXNkdSA9IG5leHQ7CisJCQl9IHdoaWxlIChoZWFkX21zZHUpOworCQl9CisJfQorCS8qCisJICogSWYgdGhlIHJ4IHJlb3JkZXIgYXJyYXkgaXMgZW1wdHksIHRoZW4gcmVzZXQgdGhlIGxhc3Rfc2VxIHZhbHVlIC0KKwkgKiBpdCBpcyBsaWtlbHkgdGhhdCBhIEJBUiBvciBhIHNlcXVlbmNlIG51bWJlciBzaGlmdCBjYXVzZWQgdGhlCisJICogc2VxdWVuY2UgbnVtYmVyIHRvIGp1bXAsIHNvIHRoZSBvbGQgbGFzdF9zZXEgdmFsdWUgaXMgbm90IHJlbGV2YW50LgorCSAqLworCWlmIChPTF9SWF9SRU9SREVSX05PX0hPTEVTKCZwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXSkpCisJCXBlZXItPnRpZHNfbGFzdF9zZXFbdGlkXSA9IElFRUU4MDIxMV9TRVFfTUFYOyAgIC8qIGludmFsaWQgKi8KKworCU9MX1JYX1JFT1JERVJfVElNRU9VVF9SRU1PVkUocGVlciwgdGlkKTsKK30KKwordm9pZAorb2xfcnhfcmVvcmRlcl9maXJzdF9ob2xlKHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJCSB1bnNpZ25lZCB0aWQsIHVuc2lnbmVkICppZHhfZW5kKQoreworCXVuc2lnbmVkIHdpbl9zeiwgd2luX3N6X21hc2s7CisJdW5zaWduZWQgaWR4X3N0YXJ0ID0gMCwgdG1wX2lkeCA9IDA7CisKKwl3aW5fc3ogPSBwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS53aW5fc3o7CisJd2luX3N6X21hc2sgPSBwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS53aW5fc3pfbWFzazsKKworCU9MX1JYX1JFT1JERVJfSURYX1NUQVJUX1NFTEZfU0VMRUNUKHBlZXIsIHRpZCwgJmlkeF9zdGFydCk7CisJdG1wX2lkeCsrOworCU9MX1JYX1JFT1JERVJfSURYX1dSQVAodG1wX2lkeCwgd2luX3N6LCB3aW5fc3pfbWFzayk7CisJLyogYnlwYXNzIHRoZSBpbml0aWFsIGhvbGUgKi8KKwl3aGlsZSAodG1wX2lkeCAhPSBpZHhfc3RhcnQgJiYKKwkgICAgICAgIXBlZXItPnRpZHNfcnhfcmVvcmRlclt0aWRdLmFycmF5W3RtcF9pZHhdLmhlYWQpIHsKKwkJdG1wX2lkeCsrOworCQlPTF9SWF9SRU9SREVSX0lEWF9XUkFQKHRtcF9pZHgsIHdpbl9zeiwgd2luX3N6X21hc2spOworCX0KKwkvKiBieXBhc3MgdGhlIHByZXNlbnQgZnJhbWVzIGZvbGxvd2luZyB0aGUgaW5pdGlhbCBob2xlICovCisJd2hpbGUgKHRtcF9pZHggIT0gaWR4X3N0YXJ0ICYmCisJICAgICAgIHBlZXItPnRpZHNfcnhfcmVvcmRlclt0aWRdLmFycmF5W3RtcF9pZHhdLmhlYWQpIHsKKwkJdG1wX2lkeCsrOworCQlPTF9SWF9SRU9SREVSX0lEWF9XUkFQKHRtcF9pZHgsIHdpbl9zeiwgd2luX3N6X21hc2spOworCX0KKwkvKgorCSAqIGlkeF9lbmQgaXMgZXhjbHVzaXZlIHJhdGhlciB0aGFuIGluY2x1c2l2ZS4KKwkgKiBJbiBvdGhlciB3b3JkcywgaXQgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzbG90IG9mIHRoZSBzZWNvbmQKKwkgKiBob2xlLCByYXRoZXIgdGhhbiB0aGUgaW5kZXggb2YgdGhlIGZpbmFsIHByZXNlbnQgZnJhbWUgZm9sbG93aW5nCisJICogdGhlIGZpcnN0IGhvbGUuCisJICovCisJKmlkeF9lbmQgPSB0bXBfaWR4OworfQorCit2b2lkCitvbF9yeF9yZW9yZGVyX3BlZXJfY2xlYW51cChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCQkgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIpCit7CisJaW50IHRpZDsKKwlmb3IgKHRpZCA9IDA7IHRpZCA8IE9MX1RYUlhfTlVNX0VYVF9USURTOyB0aWQrKykgeworCQlvbF9yeF9yZW9yZGVyX2ZsdXNoKHZkZXYsIHBlZXIsIHRpZCwgMCwgMCwKKwkJCQkgICAgaHR0X3J4X2ZsdXNoX2Rpc2NhcmQpOworCX0KKwlPTF9SWF9SRU9SREVSX1RJTUVPVVRfUEVFUl9DTEVBTlVQKHBlZXIpOworfQorCisvKiBmdW5jdGlvbnMgY2FsbGVkIGJ5IEhUVCAqLworCit2b2lkCitvbF9yeF9hZGRiYV9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgIHVpbnQxNl90IHBlZXJfaWQsCisJCSAgICB1aW50OF90IHRpZCwKKwkJICAgIHVpbnQ4X3Qgd2luX3N6LCB1aW50MTZfdCBzdGFydF9zZXFfbnVtLCB1aW50OF90IGZhaWxlZCkKK3sKKwl1aW50OF90IHJvdW5kX3B3cjJfd2luX3N6OworCXVuc2lnbmVkIGFycmF5X3NpemU7CisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyOworCXN0cnVjdCBvbF9yeF9yZW9yZGVyX3QgKnJ4X3Jlb3JkZXI7CisKKwlwZWVyID0gb2xfdHhyeF9wZWVyX2ZpbmRfYnlfaWQocGRldiwgcGVlcl9pZCk7CisJaWYgKHBlZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHBkZXYtPmNmZy5ob3N0X2FkZGJhKSB7CisJCW9sX2N0cmxfcnhfYWRkYmFfY29tcGxldGUocGRldi0+Y3RybF9wZGV2LAorCQkJCQkgICZwZWVyLT5tYWNfYWRkci5yYXdbMF0sIHRpZCwgZmFpbGVkKTsKKwl9CisJaWYgKGZhaWxlZCkKKwkJcmV0dXJuOworCisJcGVlci0+dGlkc19sYXN0X3NlcVt0aWRdID0gSUVFRTgwMjExX1NFUV9NQVg7ICAgLyogaW52YWxpZCAqLworCXJ4X3Jlb3JkZXIgPSAmcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF07CisKKwlUWFJYX0FTU0VSVDIod2luX3N6IDw9IDY0KTsKKwlyeF9yZW9yZGVyLT53aW5fc3ogPSB3aW5fc3o7CisJcm91bmRfcHdyMl93aW5fc3ogPSBPTF9SWF9SRU9SREVSX1JPVU5EX1BXUjIod2luX3N6KTsKKwlhcnJheV9zaXplID0KKwkJcm91bmRfcHdyMl93aW5fc3ogKiBzaXplb2Yoc3RydWN0IG9sX3J4X3Jlb3JkZXJfYXJyYXlfZWxlbV90KTsKKwlyeF9yZW9yZGVyLT5hcnJheSA9IGNkZl9tZW1fbWFsbG9jKGFycmF5X3NpemUpOworCVRYUlhfQVNTRVJUMShyeF9yZW9yZGVyLT5hcnJheSk7CisJY2RmX21lbV9zZXQocnhfcmVvcmRlci0+YXJyYXksIGFycmF5X3NpemUsIDB4MCk7CisKKwlyeF9yZW9yZGVyLT53aW5fc3pfbWFzayA9IHJvdW5kX3B3cjJfd2luX3N6IC0gMTsKKwlyeF9yZW9yZGVyLT5udW1fbXBkdXMgPSAwOworCisJcGVlci0+dGlkc19uZXh0X3JlbF9pZHhbdGlkXSA9CisJCU9MX1JYX1JFT1JERVJfSURYX0lOSVQoc3RhcnRfc2VxX251bSwgcnhfcmVvcmRlci0+d2luX3N6LAorCQkJCSAgICAgICByeF9yZW9yZGVyLT53aW5fc3pfbWFzayk7Cit9CisKK3ZvaWQKK29sX3J4X2RlbGJhX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LCB1aW50MTZfdCBwZWVyX2lkLCB1aW50OF90IHRpZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisJc3RydWN0IG9sX3J4X3Jlb3JkZXJfdCAqcnhfcmVvcmRlcjsKKworCXBlZXIgPSBvbF90eHJ4X3BlZXJfZmluZF9ieV9pZChwZGV2LCBwZWVyX2lkKTsKKwlpZiAocGVlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlwZWVyLT50aWRzX25leHRfcmVsX2lkeFt0aWRdID0gMHhmZmZmOyAgLyogaW52YWxpZCB2YWx1ZSAqLworCXJ4X3Jlb3JkZXIgPSAmcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF07CisKKwkvKiBjaGVjayB0aGF0IHRoZXJlIHJlYWxseSB3YXMgYSBibG9jayBhY2sgYWdyZWVtZW50ICovCisJVFhSWF9BU1NFUlQxKHJ4X3Jlb3JkZXItPndpbl9zel9tYXNrICE9IDApOworCS8qCisJICogRGVhbGxvY2F0ZSB0aGUgb2xkIHJ4IHJlb3JkZXIgYXJyYXkuCisJICogVGhlIGNhbGwgdG8gb2xfcnhfcmVvcmRlcl9pbml0IGJlbG93CisJICogd2lsbCByZXNldCByeF9yZW9yZGVyLT5hcnJheSB0byBwb2ludCB0bworCSAqIHRoZSBzaW5nbGUtZWxlbWVudCBzdGF0aWNhbGx5LWFsbG9jYXRlZCByZW9yZGVyIGFycmF5CisJICogdXNlZCBmb3Igbm9uIGJsb2NrLWFjayBjYXNlcy4KKwkgKi8KKwlpZiAocnhfcmVvcmRlci0+YXJyYXkgIT0gJnJ4X3Jlb3JkZXItPmJhc2UpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0lORk8xLAorCQkJICAgIiVzLCBkZWxldGUgcmVvcmRlciBhcnJheSwgdGlkOiVkXG4iLCBfX2Z1bmNfXywgdGlkKTsKKwkJY2RmX21lbV9mcmVlKHJ4X3Jlb3JkZXItPmFycmF5KTsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIFRJRCB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAoQVJRIHdpbmRvdyBzaXplID0gMSkgKi8KKwlvbF9yeF9yZW9yZGVyX2luaXQocnhfcmVvcmRlciwgdGlkKTsKK30KKwordm9pZAorb2xfcnhfZmx1c2hfaGFuZGxlcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgICB1aW50MTZfdCBwZWVyX2lkLAorCQkgICAgdWludDhfdCB0aWQsCisJCSAgICB1aW50MTZfdCBpZHhfc3RhcnQsCisJCSAgICB1aW50MTZfdCBpZHhfZW5kLCBlbnVtIGh0dF9yeF9mbHVzaF9hY3Rpb24gYWN0aW9uKQoreworCXN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiA9IE5VTEw7CisJdm9pZCAqcnhfZGVzYzsKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisJaW50IGlkeDsKKwlzdHJ1Y3Qgb2xfcnhfcmVvcmRlcl9hcnJheV9lbGVtX3QgKnJ4X3Jlb3JkZXJfYXJyYXlfZWxlbTsKKwlodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYgPSBwZGV2LT5odHRfcGRldjsKKworCXBlZXIgPSBvbF90eHJ4X3BlZXJfZmluZF9ieV9pZChwZGV2LCBwZWVyX2lkKTsKKwlpZiAocGVlcikKKwkJdmRldiA9IHBlZXItPnZkZXY7CisJZWxzZQorCQlyZXR1cm47CisKKwlPTF9SWF9SRU9SREVSX1RJTUVPVVRfTVVURVhfTE9DSyhwZGV2KTsKKworCWlkeCA9IGlkeF9zdGFydCAmIHBlZXItPnRpZHNfcnhfcmVvcmRlclt0aWRdLndpbl9zel9tYXNrOworCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbSA9ICZwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS5hcnJheVtpZHhdOworCWlmIChyeF9yZW9yZGVyX2FycmF5X2VsZW0tPmhlYWQpIHsKKwkJcnhfZGVzYyA9CisJCQlodHRfcnhfbXNkdV9kZXNjX3JldHJpZXZlKGh0dF9wZGV2LAorCQkJCQkJICByeF9yZW9yZGVyX2FycmF5X2VsZW0tPmhlYWQpOworCQlpZiAoaHR0X3J4X21zZHVfaXNfZnJhZyhodHRfcGRldiwgcnhfZGVzYykpIHsKKwkJCW9sX3J4X3Jlb3JkZXJfZmx1c2hfZnJhZyhodHRfcGRldiwgcGVlciwgdGlkLAorCQkJCQkJIGlkeF9zdGFydCk7CisJCQkvKgorCQkJICogQXNzdW1pbmcgZmx1c2ggbWVzc2FnZSBzZW50IHNlcGVyYXRlbHkgZm9yIGZyYWdzCisJCQkgKiBhbmQgZm9yIG5vcm1hbCBmcmFtZXMKKwkJCSAqLworCQkJT0xfUlhfUkVPUkRFUl9USU1FT1VUX01VVEVYX1VOTE9DSyhwZGV2KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlvbF9yeF9yZW9yZGVyX2ZsdXNoKHZkZXYsIHBlZXIsIHRpZCwgaWR4X3N0YXJ0LCBpZHhfZW5kLCBhY3Rpb24pOworCS8qCisJICogSWYgdGhlIHJ4IHJlb3JkZXIgdGltZW91dCBpcyBoYW5kbGVkIGJ5IGhvc3QgU1csIHNlZSBpZiB0aGVyZSBhcmUKKwkgKiByZW1haW5pbmcgcnggaG9sZXMgdGhhdCByZXF1aXJlIHRoZSB0aW1lciB0byBiZSByZXN0YXJ0ZWQuCisJICovCisJT0xfUlhfUkVPUkRFUl9USU1FT1VUX1VQREFURShwZWVyLCB0aWQpOworCU9MX1JYX1JFT1JERVJfVElNRU9VVF9NVVRFWF9VTkxPQ0socGRldik7Cit9CisKK3ZvaWQKK29sX3J4X3BuX2luZF9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgICB1aW50MTZfdCBwZWVyX2lkLAorCQkgICAgIHVpbnQ4X3QgdGlkLAorCQkgICAgIGludCBzZXFfbnVtX3N0YXJ0LAorCQkgICAgIGludCBzZXFfbnVtX2VuZCwgdWludDhfdCBwbl9pZV9jbnQsIHVpbnQ4X3QgKnBuX2llKQoreworCXN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiA9IE5VTEw7CisJdm9pZCAqcnhfZGVzYzsKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisJc3RydWN0IG9sX3J4X3Jlb3JkZXJfYXJyYXlfZWxlbV90ICpyeF9yZW9yZGVyX2FycmF5X2VsZW07CisJdW5zaWduZWQgd2luX3N6X21hc2s7CisJY2RmX25idWZfdCBoZWFkX21zZHUgPSBOVUxMOworCWNkZl9uYnVmX3QgdGFpbF9tc2R1ID0gTlVMTDsKKwlodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYgPSBwZGV2LT5odHRfcGRldjsKKwlpbnQgc2VxX251bSwgaSA9IDA7CisKKwlwZWVyID0gb2xfdHhyeF9wZWVyX2ZpbmRfYnlfaWQocGRldiwgcGVlcl9pZCk7CisKKwlpZiAoIXBlZXIpIHsKKwkJLyoKKwkJICogSWYgd2UgY2FuJ3QgZmluZCBhIHBlZXIgc2VuZCB0aGlzIHBhY2tldCB0byBPQ0IgaW50ZXJmYWNlCisJCSAqIHVzaW5nIE9DQiBzZWxmIHBlZXIKKwkJICovCisJCWlmICghb2xfdHhyeF9nZXRfb2NiX3BlZXIocGRldiwgJnBlZXIpKQorCQkJcGVlciA9IE5VTEw7CisJfQorCisJaWYgKHBlZXIpCisJCXZkZXYgPSBwZWVyLT52ZGV2OworCWVsc2UKKwkJcmV0dXJuOworCisJY2RmX2F0b21pY19zZXQoJnBlZXItPmZ3X3BuX2NoZWNrLCAxKTsKKwkvKlRPRE86IEZyYWdtZW50YXRpb24gY2FzZSAqLworCXdpbl9zel9tYXNrID0gcGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0ud2luX3N6X21hc2s7CisJc2VxX251bV9zdGFydCAmPSB3aW5fc3pfbWFzazsKKwlzZXFfbnVtX2VuZCAmPSB3aW5fc3pfbWFzazsKKwlzZXFfbnVtID0gc2VxX251bV9zdGFydDsKKworCWRvIHsKKwkJcnhfcmVvcmRlcl9hcnJheV9lbGVtID0KKwkJCSZwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS5hcnJheVtzZXFfbnVtXTsKKworCQlpZiAocnhfcmVvcmRlcl9hcnJheV9lbGVtLT5oZWFkKSB7CisJCQlpZiAocG5faWVfY250ICYmIHNlcV9udW0gPT0gKGludCkocG5faWVbaV0pKSB7CisJCQkJY2RmX25idWZfdCBtc2R1LCBuZXh0X21zZHUsIG1wZHVfaGVhZCwKKwkJCQkJICAgbXBkdV90YWlsOworCQkJCXN0YXRpYyB1aW50MzJfdCBsYXN0X3BuY2hlY2tfcHJpbnRfdGltZTsKKwkJCQkvKiBEbyBub3QgbmVlZCB0byBpbml0aWFsaXplIGFzIEMgZG9lcyBpdCAqLworCisJCQkJaW50IGxvZ19sZXZlbDsKKwkJCQl1aW50MzJfdCBjdXJyZW50X3RpbWVfbXM7CisJCQkJdW5pb24gaHR0X3J4X3BuX3QgcG4gPSB7IDAgfTsKKwkJCQlpbnQgaW5kZXgsIHBuX2xlbjsKKworCQkJCW1wZHVfaGVhZCA9IG1zZHUgPSByeF9yZW9yZGVyX2FycmF5X2VsZW0tPmhlYWQ7CisJCQkJbXBkdV90YWlsID0gcnhfcmVvcmRlcl9hcnJheV9lbGVtLT50YWlsOworCisJCQkJcG5faWVfY250LS07CisJCQkJaSsrOworCQkJCXJ4X2Rlc2MgPSBodHRfcnhfbXNkdV9kZXNjX3JldHJpZXZlKGh0dF9wZGV2LAorCQkJCQkJCQkgICAgbXNkdSk7CisJCQkJaW5kZXggPSBodHRfcnhfbXNkdV9pc193bGFuX21jYXN0KAorCQkJCQlwZGV2LT5odHRfcGRldiwgcnhfZGVzYykKKwkJCQkJPyB0eHJ4X3NlY19tY2FzdAorCQkJCQk6IHR4cnhfc2VjX3VjYXN0OworCQkJCXBuX2xlbiA9IHBkZXYtPnJ4X3BuW3BlZXItPnNlY3VyaXR5W2luZGV4XS4KKwkJCQkJCSAgICAgc2VjX3R5cGVdLmxlbjsKKwkJCQlodHRfcnhfbXBkdV9kZXNjX3BuKGh0dF9wZGV2LCByeF9kZXNjLCAmcG4sCisJCQkJCQkgICAgcG5fbGVuKTsKKworCQkJCWN1cnJlbnRfdGltZV9tcyA9IGNkZl9zeXN0ZW1fdGlja3NfdG9fbXNlY3MoCisJCQkJCWNkZl9zeXN0ZW1fdGlja3MoKSk7CisJCQkJaWYgKFRYUlhfUE5fQ0hFQ0tfRkFJTFVSRV9QUklOVF9QRVJJT0RfTVMgPAorCQkJCSAgICAoY3VycmVudF90aW1lX21zIC0KKwkJCQkgICAgIGxhc3RfcG5jaGVja19wcmludF90aW1lKSkgeworCQkJCQlsYXN0X3BuY2hlY2tfcHJpbnRfdGltZSA9CisJCQkJCQljdXJyZW50X3RpbWVfbXM7CisJCQkJCWxvZ19sZXZlbCA9IFRYUlhfUFJJTlRfTEVWRUxfV0FSTjsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2dfbGV2ZWwgPSBUWFJYX1BSSU5UX0xFVkVMX0lORk8yOworCQkJCX0KKwkJCQlUWFJYX1BSSU5UKGxvZ19sZXZlbCwKKwkJCQkJICAgIlRndCBQTiBjaGVjayBmYWlsZWQgLSBUSUQgJWQsIHBlZXIgJXAgIgorCQkJCQkgICAiKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KVxuIgorCQkJCQkgICAiICAgIFBOICh1NjQgeDIpPSAweCUwOGxseCAlMDhsbHggKExTQnMgPSAlbGxkKVxuIgorCQkJCQkgICAiICAgIG5ldyBzZXEgbnVtID0gJWRcbiIsCisJCQkJCSAgIHRpZCwgcGVlciwKKwkJCQkJICAgcGVlci0+bWFjX2FkZHIucmF3WzBdLAorCQkJCQkgICBwZWVyLT5tYWNfYWRkci5yYXdbMV0sCisJCQkJCSAgIHBlZXItPm1hY19hZGRyLnJhd1syXSwKKwkJCQkJICAgcGVlci0+bWFjX2FkZHIucmF3WzNdLAorCQkJCQkgICBwZWVyLT5tYWNfYWRkci5yYXdbNF0sCisJCQkJCSAgIHBlZXItPm1hY19hZGRyLnJhd1s1XSwgcG4ucG4xMjhbMV0sCisJCQkJCSAgIHBuLnBuMTI4WzBdLAorCQkJCQkgICBwbi5wbjEyOFswXSAmIDB4ZmZmZmZmZmZmZmZmVUxMLAorCQkJCQkgICBodHRfcnhfbXBkdV9kZXNjX3NlcV9udW0oaHR0X3BkZXYsCisJCQkJCQkJCSAgICByeF9kZXNjKSk7CisJCQkJb2xfcnhfZXJyKHBkZXYtPmN0cmxfcGRldiwgdmRldi0+dmRldl9pZCwKKwkJCQkJICBwZWVyLT5tYWNfYWRkci5yYXcsIHRpZCwKKwkJCQkJICBodHRfcnhfbXBkdV9kZXNjX3RzZjMyKGh0dF9wZGV2LAorCQkJCQkJCQkgcnhfZGVzYyksCisJCQkJCSAgT0xfUlhfRVJSX1BOLCBtcGR1X2hlYWQsIE5VTEwsIDApOworCisJCQkJLyogZnJlZSBhbGwgTVNEVXMgd2l0aGluIHRoaXMgTVBEVSAqLworCQkJCWRvIHsKKwkJCQkJbmV4dF9tc2R1ID0gY2RmX25idWZfbmV4dChtc2R1KTsKKwkJCQkJaHR0X3J4X2Rlc2NfZnJhbWVfZnJlZShodHRfcGRldiwgbXNkdSk7CisJCQkJCWlmIChtc2R1ID09IG1wZHVfdGFpbCkKKwkJCQkJCWJyZWFrOworCQkJCQllbHNlCisJCQkJCQltc2R1ID0gbmV4dF9tc2R1OworCQkJCX0gd2hpbGUgKDEpOworCisJCQl9IGVsc2UgeworCQkJCWlmIChoZWFkX21zZHUgPT0gTlVMTCkgeworCQkJCQloZWFkX21zZHUgPSByeF9yZW9yZGVyX2FycmF5X2VsZW0tPmhlYWQ7CisJCQkJCXRhaWxfbXNkdSA9IHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+dGFpbDsKKwkJCQl9IGVsc2UgeworCQkJCQljZGZfbmJ1Zl9zZXRfbmV4dCgKKwkJCQkJCXRhaWxfbXNkdSwKKwkJCQkJCXJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+aGVhZCk7CisJCQkJCXRhaWxfbXNkdSA9IHJ4X3Jlb3JkZXJfYXJyYXlfZWxlbS0+dGFpbDsKKwkJCQl9CisJCQl9CisJCQlyeF9yZW9yZGVyX2FycmF5X2VsZW0tPmhlYWQgPSBOVUxMOworCQkJcnhfcmVvcmRlcl9hcnJheV9lbGVtLT50YWlsID0gTlVMTDsKKwkJfQorCQlzZXFfbnVtID0gKHNlcV9udW0gKyAxKSAmIHdpbl9zel9tYXNrOworCX0gd2hpbGUgKHNlcV9udW0gIT0gc2VxX251bV9lbmQpOworCisJaWYgKGhlYWRfbXNkdSkgeworCQkvKiByeF9vcHRfcHJvYyB0YWtlcyBhIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIG1zZHUgbmV0YnVmcyAqLworCQljZGZfbmJ1Zl9zZXRfbmV4dCh0YWlsX21zZHUsIE5VTEwpOworCQlwZWVyLT5yeF9vcHRfcHJvYyh2ZGV2LCBwZWVyLCB0aWQsIGhlYWRfbXNkdSk7CisJfQorfQorCisjaWYgZGVmaW5lZChFTkFCTEVfUlhfUkVPUkRFUl9UUkFDRSkKKworQV9TVEFUVVMgb2xfcnhfcmVvcmRlcl90cmFjZV9hdHRhY2gob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KQoreworCWludCBudW1fZWxlbXM7CisKKwludW1fZWxlbXMgPSAxIDw8IFRYUlhfUlhfUkVPUkRFUl9UUkFDRV9TSVpFX0xPRzI7CisJcGRldi0+cnhfcmVvcmRlcl90cmFjZS5pZHggPSAwOworCXBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UuY250ID0gMDsKKwlwZGV2LT5yeF9yZW9yZGVyX3RyYWNlLm1hc2sgPSBudW1fZWxlbXMgLSAxOworCXBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UuZGF0YSA9IGNkZl9tZW1fbWFsbG9jKAorCQlzaXplb2YoKnBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UuZGF0YSkgKiBudW1fZWxlbXMpOworCWlmICghcGRldi0+cnhfcmVvcmRlcl90cmFjZS5kYXRhKQorCQlyZXR1cm4gQV9OT19NRU1PUlk7CisKKwl3aGlsZSAoLS1udW1fZWxlbXMgPj0gMCkKKwkJcGRldi0+cnhfcmVvcmRlcl90cmFjZS5kYXRhW251bV9lbGVtc10uc2VxX251bSA9IDB4ZmZmZjsKKworCXJldHVybiBBX09LOworfQorCit2b2lkIG9sX3J4X3Jlb3JkZXJfdHJhY2VfZGV0YWNoKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldikKK3sKKwljZGZfbWVtX2ZyZWUocGRldi0+cnhfcmVvcmRlcl90cmFjZS5kYXRhKTsKK30KKwordm9pZAorb2xfcnhfcmVvcmRlcl90cmFjZV9hZGQob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJdWludDhfdCB0aWQsCisJCQl1aW50MTZfdCByZW9yZGVyX2lkeCwgdWludDE2X3Qgc2VxX251bSwgaW50IG51bV9tcGR1cykKK3sKKwl1aW50MzJfdCBpZHggPSBwZGV2LT5yeF9yZW9yZGVyX3RyYWNlLmlkeDsKKworCXBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UuZGF0YVtpZHhdLnRpZCA9IHRpZDsKKwlwZGV2LT5yeF9yZW9yZGVyX3RyYWNlLmRhdGFbaWR4XS5yZW9yZGVyX2lkeCA9IHJlb3JkZXJfaWR4OworCXBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UuZGF0YVtpZHhdLnNlcV9udW0gPSBzZXFfbnVtOworCXBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UuZGF0YVtpZHhdLm51bV9tcGR1cyA9IG51bV9tcGR1czsKKwlwZGV2LT5yeF9yZW9yZGVyX3RyYWNlLmNudCsrOworCWlkeCsrOworCXBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UuaWR4ID0gaWR4ICYgcGRldi0+cnhfcmVvcmRlcl90cmFjZS5tYXNrOworfQorCit2b2lkCitvbF9yeF9yZW9yZGVyX3RyYWNlX2Rpc3BsYXkob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LCBpbnQganVzdF9vbmNlLCBpbnQgbGltaXQpCit7CisJc3RhdGljIGludCBwcmludF9jb3VudDsKKwl1aW50MzJfdCBpLCBzdGFydCwgZW5kOworCXVpbnQ2NF90IGNudDsKKwlpbnQgZWxlbXM7CisKKwlpZiAocHJpbnRfY291bnQgIT0gMCAmJiBqdXN0X29uY2UpCisJCXJldHVybjsKKworCXByaW50X2NvdW50Kys7CisKKwllbmQgPSBwZGV2LT5yeF9yZW9yZGVyX3RyYWNlLmlkeDsKKwlpZiAocGRldi0+cnhfcmVvcmRlcl90cmFjZS5kYXRhW2VuZF0uc2VxX251bSA9PSAweGZmZmYpIHsKKwkJLyogdHJhY2UgbG9nIGhhcyBub3QgeWV0IHdyYXBwZWQgYXJvdW5kIC0gc3RhcnQgYXQgdGhlIHRvcCAqLworCQlzdGFydCA9IDA7CisJCWNudCA9IDA7CisJfSBlbHNlIHsKKwkJc3RhcnQgPSBlbmQ7CisJCWNudCA9IHBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UuY250IC0KKwkJCShwZGV2LT5yeF9yZW9yZGVyX3RyYWNlLm1hc2sgKyAxKTsKKwl9CisJZWxlbXMgPSAoZW5kIC0gMSAtIHN0YXJ0KSAmIHBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UubWFzazsKKwlpZiAobGltaXQgPiAwICYmIGVsZW1zID4gbGltaXQpIHsKKwkJaW50IGRlbHRhOworCQlkZWx0YSA9IGVsZW1zIC0gbGltaXQ7CisJCXN0YXJ0ICs9IGRlbHRhOworCQlzdGFydCAmPSBwZGV2LT5yeF9yZW9yZGVyX3RyYWNlLm1hc2s7CisJCWNudCArPSBkZWx0YTsKKwl9CisKKwlpID0gc3RhcnQ7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiAgICAgICAgICAgbG9nICAgICAgIGFycmF5IHNlcSIpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIgICBjb3VudCAgIGlkeCAgdGlkICAgaWR4ICBudW0gKExTQnMpIik7CisJZG8geworCQl1aW50MTZfdCBzZXFfbnVtLCByZW9yZGVyX2lkeDsKKwkJc2VxX251bSA9IHBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UuZGF0YVtpXS5zZXFfbnVtOworCQlyZW9yZGVyX2lkeCA9IHBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UuZGF0YVtpXS5yZW9yZGVyX2lkeDsKKwkJaWYgKHNlcV9udW0gPCAoMSA8PCAxNCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiAgJTZsbGQgICU0ZCAgJTNkICAlNGQgICU0ZCAoJWQpIiwKKwkJCQkgIGNudCwgaSwgcGRldi0+cnhfcmVvcmRlcl90cmFjZS5kYXRhW2ldLnRpZCwKKwkJCQkgIHJlb3JkZXJfaWR4LCBzZXFfbnVtLCBzZXFfbnVtICYgNjMpOworCQl9IGVsc2UgeworCQkJaW50IGVyciA9IFRYUlhfU0VRX05VTV9FUlIoc2VxX251bSk7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICIgICU2bGxkICAlNGQgZXJyICVkICglZCBNUERVcykiLAorCQkJCSAgY250LCBpLCBlcnIsCisJCQkJICBwZGV2LT5yeF9yZW9yZGVyX3RyYWNlLmRhdGFbaV0ubnVtX21wZHVzKTsKKwkJfQorCQljbnQrKzsKKwkJaSsrOworCQlpICY9IHBkZXYtPnJ4X3Jlb3JkZXJfdHJhY2UubWFzazsKKwl9IHdoaWxlIChpICE9IGVuZCk7Cit9CisKKyNlbmRpZiAvKiBFTkFCTEVfUlhfUkVPUkRFUl9UUkFDRSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC90eHJ4L29sX3J4X3Jlb3JkZXIuaCBiL2NvcmUvZHAvdHhyeC9vbF9yeF9yZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyOWM2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvdHhyeC9vbF9yeF9yZW9yZGVyLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfT0xfUlhfUkVPUkRFUl9fSF8KKyNkZWZpbmUgX09MX1JYX1JFT1JERVJfX0hfCisKKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCwgZXRjLiAqLworCisjaW5jbHVkZSA8b2xfdHhyeF9hcGkuaD4gICAgICAgIC8qIG9sX3R4cnhfcGVlcl90LCBldGMuICovCisKKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+ICAgICAgLyogb2xfcnhfcmVvcmRlcl90ICovCisKK3ZvaWQKK29sX3J4X3Jlb3JkZXJfc3RvcmUoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCQkgICAgdW5zaWduZWQgdGlkLAorCQkgICAgdW5zaWduZWQgcmVvcmRlcl9hcnJheV9pbmRleCwKKwkJICAgIGNkZl9uYnVmX3QgaGVhZF9tc2R1LCBjZGZfbmJ1Zl90IHRhaWxfbXNkdSk7CisKK3ZvaWQKK29sX3J4X3Jlb3JkZXJfcmVsZWFzZShzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCSAgICAgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJICAgICAgdW5zaWduZWQgdGlkLAorCQkgICAgICB1bnNpZ25lZCBzZXFfbnVtX3N0YXJ0LCB1bnNpZ25lZCBzZXFfbnVtX2VuZCk7CisKK3ZvaWQKK29sX3J4X3Jlb3JkZXJfZmx1c2goc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCQkgICAgdW5zaWduZWQgdGlkLAorCQkgICAgdW5zaWduZWQgc2VxX251bV9zdGFydCwKKwkJICAgIHVuc2lnbmVkIHNlcV9udW1fZW5kLCBlbnVtIGh0dF9yeF9mbHVzaF9hY3Rpb24gYWN0aW9uKTsKKworLyoqCisgKiBAYnJpZWYgLSBmaW5kIGVuZCBvZiBmaXJzdCByYW5nZSBvZiBwcmVzZW50IE1QRFVzIGFmdGVyIHRoZSBpbml0aWFsIHJ4IGhvbGUKKyAqIEBwYXJhbVtpbl0gcGVlciAtIHdoaWNoIHNlbmRlcidzIGRhdGEgaXMgYmVpbmcgY2hlY2tlZAorICogQHBhcmFtW2luXSB0aWQgLSB3aGljaCB0eXBlIG9mIGRhdGEgaXMgYmVpbmcgY2hlY2tlZAorICogQHBhcmFtW291dF0gaWR4X2VuZCAtIHRoZSByZW9yZGVyIGFycmF5IGluZGV4IGhvbGRpbmcgdGhlIGxhc3QgTVBEVSBpbiB0aGUKKyAqICAgICAgcmFuZ2Ugb2YgaW4tb3JkZXIgTVBEVXMgdGhhdCBmb2xsb3dpbmcgdGhlIGluaXRpYWwgaG9sZS4KKyAqICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGluLW9yZGVyIE1QRFUgZm9sbG93aW5nIHRoZQorICogICAgICBmaXJzdCBob2xlLCByYXRoZXIgdGhhbiB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHNlY29uZCBob2xlLgorICovCit2b2lkCitvbF9yeF9yZW9yZGVyX2ZpcnN0X2hvbGUoc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCQkJIHVuc2lnbmVkIHRpZCwgdW5zaWduZWQgKmlkeF9lbmQpOworCit2b2lkCitvbF9yeF9yZW9yZGVyX3BlZXJfY2xlYW51cChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCQkgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIpOworCit2b2lkIG9sX3J4X3Jlb3JkZXJfaW5pdChzdHJ1Y3Qgb2xfcnhfcmVvcmRlcl90ICpyeF9yZW9yZGVyLCB1aW50OF90IHRpZCk7CisKK2VudW0gaHR0X3J4X3N0YXR1cworb2xfcnhfc2VxX251bV9jaGVjayhzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCQkJICAgIHVpbnQ4X3QgdGlkLCB2b2lkICpyeF9tcGR1X2Rlc2MpOworCisvKgorICogUGVyZWdyaW5lIGFuZCBSb21lOiBkbyBzZXF1ZW5jZSBudW1iZXIgY2hlY2tpbmcgaW4gdGhlIGhvc3QKKyAqIGZvciBwZWVyLVRJRHMgd2l0aG91dCBhZ2dyZWdhdGlvbiBlbmFibGVkCisgKi8KKworI2RlZmluZSBPTF9SWF9TRVFfTlVNX0NIRUNLKHBkZXYsIHBlZXIsIHRpZCwgcnhfbXBkdV9kZXNjKQlcCisJKHBkZXYtPnJ4LmZsYWdzLmR1cF9jaGVjayAmJiBwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS53aW5fc3pfbWFzayA9PSAwKSA/IFwKKwkJb2xfcnhfc2VxX251bV9jaGVjayggXAorCQlwZGV2LCBwZWVyLCB0aWQsIFwKKwkJcnhfbXBkdV9kZXNjKSA6IFwKKwkJaHR0X3J4X3N0YXR1c19vaworCisjZW5kaWYgLyogX09MX1JYX1JFT1JERVJfX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfcnhfcmVvcmRlcl90aW1lb3V0LmMgYi9jb3JlL2RwL3R4cngvb2xfcnhfcmVvcmRlcl90aW1lb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyZTJhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvdHhyeC9vbF9yeF9yZW9yZGVyX3RpbWVvdXQuYwpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT0gaGVhZGVyIGZpbGUgaW5jbHVkZXMgPT09Ki8KKy8qIGdlbmVyaWMgdXRpbGl0aWVzICovCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX3QsIGV0Yy4gKi8KKyNpbmNsdWRlIDxjZGZfc29mdGlycV90aW1lci5oPgorI2luY2x1ZGUgPGNkZl90aW1lLmg+CisKKy8qIGRhdGFwYXRoIGludGVybmFsIGludGVyZmFjZXMgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+ICAgICAgLyogb2xfdHhyeF9wZGV2X3QsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2ludGVybmFsLmg+ICAgLyogVFhSWF9BU1NFUlQsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF9yeF9yZW9yZGVyLmg+ICAgICAgLyogb2xfcnhfcmVvcmRlcl9mbHVzaCwgZXRjLiAqLworCisjaWZkZWYgUUNBX1NVUFBPUlRfT0xfUlhfUkVPUkRFUl9USU1FT1VUCisKK3ZvaWQgb2xfcnhfcmVvcmRlcl90aW1lb3V0X3JlbW92ZShzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsIHVuc2lnbmVkIHRpZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXY7CisJc3RydWN0IG9sX3R4X3Jlb3JkZXJfY2F0X3RpbWVvdXRfdCAqcnhfcmVvcmRlcl90aW1lb3V0X2FjOworCXN0cnVjdCBvbF9yeF9yZW9yZGVyX3RpbWVvdXRfbGlzdF9lbGVtX3QgKmxpc3RfZWxlbTsKKwlpbnQgYWM7CisKKwlwZGV2ID0gcGVlci0+dmRldi0+cGRldjsKKwlhYyA9IFRYUlhfVElEX1RPX1dNTV9BQyh0aWQpOworCXJ4X3Jlb3JkZXJfdGltZW91dF9hYyA9ICZwZGV2LT5yeC5yZW9yZGVyX3RpbWVvdXQuYWNjZXNzX2NhdHNbYWNdOworCWxpc3RfZWxlbSA9ICZwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS50aW1lb3V0OworCWlmICghbGlzdF9lbGVtLT5hY3RpdmUpIHsKKwkJLyogdGhpcyBlbGVtZW50IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCAqLworCQlyZXR1cm47CisJfQorCWxpc3RfZWxlbS0+YWN0aXZlID0gMDsKKwlUQUlMUV9SRU1PVkUoJnJ4X3Jlb3JkZXJfdGltZW91dF9hYy0+dmlydHVhbF90aW1lcl9saXN0LCBsaXN0X2VsZW0sCisJCSAgICAgcmVvcmRlcl90aW1lb3V0X2xpc3RfZWxlbSk7Cit9CisKK3N0YXRpYyB2b2lkCitvbF9yeF9yZW9yZGVyX3RpbWVvdXRfc3RhcnQoc3RydWN0IG9sX3R4X3Jlb3JkZXJfY2F0X3RpbWVvdXRfdAorCQkJICAgICpyeF9yZW9yZGVyX3RpbWVvdXRfYWMsIHVpbnQzMl90IHRpbWVfbm93X21zKQoreworCXVpbnQzMl90IGR1cmF0aW9uX21zOworCXN0cnVjdCBvbF9yeF9yZW9yZGVyX3RpbWVvdXRfbGlzdF9lbGVtX3QgKmxpc3RfZWxlbTsKKworCWxpc3RfZWxlbSA9IFRBSUxRX0ZJUlNUKCZyeF9yZW9yZGVyX3RpbWVvdXRfYWMtPnZpcnR1YWxfdGltZXJfbGlzdCk7CisKKwlkdXJhdGlvbl9tcyA9IGxpc3RfZWxlbS0+dGltZXN0YW1wX21zIC0gdGltZV9ub3dfbXM7CisJY2RmX3NvZnRpcnFfdGltZXJfc3RhcnQoJnJ4X3Jlb3JkZXJfdGltZW91dF9hYy0+dGltZXIsIGR1cmF0aW9uX21zKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitvbF9yeF9yZW9yZGVyX3RpbWVvdXRfYWRkKHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwgdWludDhfdCB0aWQpCit7CisJdWludDMyX3QgdGltZV9ub3dfbXM7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2OworCXN0cnVjdCBvbF90eF9yZW9yZGVyX2NhdF90aW1lb3V0X3QgKnJ4X3Jlb3JkZXJfdGltZW91dF9hYzsKKwlzdHJ1Y3Qgb2xfcnhfcmVvcmRlcl90aW1lb3V0X2xpc3RfZWxlbV90ICpsaXN0X2VsZW07CisJaW50IGFjOworCWludCBzdGFydDsKKworCXBkZXYgPSBwZWVyLT52ZGV2LT5wZGV2OworCWFjID0gVFhSWF9USURfVE9fV01NX0FDKHRpZCk7CisJcnhfcmVvcmRlcl90aW1lb3V0X2FjID0gJnBkZXYtPnJ4LnJlb3JkZXJfdGltZW91dC5hY2Nlc3NfY2F0c1thY107CisJbGlzdF9lbGVtID0gJnBlZXItPnRpZHNfcnhfcmVvcmRlclt0aWRdLnRpbWVvdXQ7CisKKwlsaXN0X2VsZW0tPmFjdGl2ZSA9IDE7CisJbGlzdF9lbGVtLT5wZWVyID0gcGVlcjsKKwlsaXN0X2VsZW0tPnRpZCA9IHRpZDsKKworCS8qIHNldCB0aGUgZXhwaXJhdGlvbiB0aW1lc3RhbXAgKi8KKwl0aW1lX25vd19tcyA9IGNkZl9zeXN0ZW1fdGlja3NfdG9fbXNlY3MoY2RmX3N5c3RlbV90aWNrcygpKTsKKwlsaXN0X2VsZW0tPnRpbWVzdGFtcF9tcyA9CisJCXRpbWVfbm93X21zICsgcnhfcmVvcmRlcl90aW1lb3V0X2FjLT5kdXJhdGlvbl9tczsKKworCS8qIGFkZCB0byB0aGUgcXVldWUgKi8KKwlzdGFydCA9IFRBSUxRX0VNUFRZKCZyeF9yZW9yZGVyX3RpbWVvdXRfYWMtPnZpcnR1YWxfdGltZXJfbGlzdCk7CisJVEFJTFFfSU5TRVJUX1RBSUwoJnJ4X3Jlb3JkZXJfdGltZW91dF9hYy0+dmlydHVhbF90aW1lcl9saXN0LAorCQkJICBsaXN0X2VsZW0sIHJlb3JkZXJfdGltZW91dF9saXN0X2VsZW0pOworCWlmIChzdGFydCkKKwkJb2xfcnhfcmVvcmRlcl90aW1lb3V0X3N0YXJ0KHJ4X3Jlb3JkZXJfdGltZW91dF9hYywgdGltZV9ub3dfbXMpOworfQorCit2b2lkIG9sX3J4X3Jlb3JkZXJfdGltZW91dF91cGRhdGUoc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLCB1aW50OF90IHRpZCkKK3sKKwlpZiAoIXBlZXIpCisJCXJldHVybjsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIGhvbGVzLCBpLmUuIG5vIHF1ZXVlZCBmcmFtZXMsCisJICogdGhlbiB0aW1lb3V0IGRvZXNuJ3QgYXBwbHkuCisJICovCisJaWYgKHBlZXItPnRpZHNfcnhfcmVvcmRlclt0aWRdLm51bV9tcGR1cyA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIHRoZSB2aXJ0dWFsIHRpbWVyIGZvciB0aGlzIHBlZXItVElEIGlzIGFscmVhZHkgcnVubmluZywKKwkgKiB0aGVuIGxlYXZlIGl0LgorCSAqLworCWlmIChwZWVyLT50aWRzX3J4X3Jlb3JkZXJbdGlkXS50aW1lb3V0LmFjdGl2ZSkKKwkJcmV0dXJuOworCisJb2xfcnhfcmVvcmRlcl90aW1lb3V0X2FkZChwZWVyLCB0aWQpOworfQorCitzdGF0aWMgdm9pZCBvbF9yeF9yZW9yZGVyX3RpbWVvdXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldjsKKwlzdHJ1Y3Qgb2xfcnhfcmVvcmRlcl90aW1lb3V0X2xpc3RfZWxlbV90ICpsaXN0X2VsZW0sICp0bXA7CisJdWludDMyX3QgdGltZV9ub3dfbXM7CisJc3RydWN0IG9sX3R4X3Jlb3JkZXJfY2F0X3RpbWVvdXRfdCAqcnhfcmVvcmRlcl90aW1lb3V0X2FjOworCisJcnhfcmVvcmRlcl90aW1lb3V0X2FjID0gKHN0cnVjdCBvbF90eF9yZW9yZGVyX2NhdF90aW1lb3V0X3QgKilhcmc7CisJdGltZV9ub3dfbXMgPSBjZGZfc3lzdGVtX3RpY2tzX3RvX21zZWNzKGNkZl9zeXN0ZW1fdGlja3MoKSk7CisKKwlwZGV2ID0gcnhfcmVvcmRlcl90aW1lb3V0X2FjLT5wZGV2OworCWNkZl9zcGluX2xvY2soJnBkZXYtPnJ4Lm11dGV4KTsKKy8qIFRPRE86IGNvbmRpdGlvbmFsbHkgdGFrZSBtdXRleCBsb2NrIGR1cmluZyByZWd1bGFyIHJ4ICovCisJVEFJTFFfRk9SRUFDSF9TQUZFKGxpc3RfZWxlbSwKKwkJCSAgICZyeF9yZW9yZGVyX3RpbWVvdXRfYWMtPnZpcnR1YWxfdGltZXJfbGlzdCwKKwkJCSAgIHJlb3JkZXJfdGltZW91dF9saXN0X2VsZW0sIHRtcCkgeworCQl1bnNpZ25lZCBpZHhfc3RhcnQsIGlkeF9lbmQ7CisJCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKworCQlpZiAobGlzdF9lbGVtLT50aW1lc3RhbXBfbXMgPiB0aW1lX25vd19tcykKKwkJCWJyZWFrOyAgLyogdGltZSBoYXMgbm90IGV4cGlyZWQgeWV0IGZvciB0aGlzIGVsZW1lbnQgKi8KKworCQlsaXN0X2VsZW0tPmFjdGl2ZSA9IDA7CisJCS8qIHJlbW92ZSB0aGUgZXhwaXJlZCBlbGVtZW50IGZyb20gdGhlIGxpc3QgKi8KKwkJVEFJTFFfUkVNT1ZFKCZyeF9yZW9yZGVyX3RpbWVvdXRfYWMtPnZpcnR1YWxfdGltZXJfbGlzdCwKKwkJCSAgICAgbGlzdF9lbGVtLCByZW9yZGVyX3RpbWVvdXRfbGlzdF9lbGVtKTsKKworCQlwZWVyID0gbGlzdF9lbGVtLT5wZWVyOworCisJCWlkeF9zdGFydCA9IDB4ZmZmZjsgICAgIC8qIHN0YXJ0IGZyb20gbmV4dF9yZWxfaWR4ICovCisJCW9sX3J4X3Jlb3JkZXJfZmlyc3RfaG9sZShwZWVyLCBsaXN0X2VsZW0tPnRpZCwgJmlkeF9lbmQpOworCQlvbF9yeF9yZW9yZGVyX2ZsdXNoKHBlZXItPnZkZXYsCisJCQkJICAgIHBlZXIsCisJCQkJICAgIGxpc3RfZWxlbS0+dGlkLAorCQkJCSAgICBpZHhfc3RhcnQsIGlkeF9lbmQsIGh0dF9yeF9mbHVzaF9yZWxlYXNlKTsKKwl9CisJLyogcmVzdGFydCB0aGUgdGltZXIgaWYgdW5leHBpcmVkIGVsZW1lbnRzIGFyZSBsZWZ0IGluIHRoZSBsaXN0ICovCisJaWYgKCFUQUlMUV9FTVBUWSgmcnhfcmVvcmRlcl90aW1lb3V0X2FjLT52aXJ0dWFsX3RpbWVyX2xpc3QpKQorCQlvbF9yeF9yZW9yZGVyX3RpbWVvdXRfc3RhcnQocnhfcmVvcmRlcl90aW1lb3V0X2FjLCB0aW1lX25vd19tcyk7CisKKwljZGZfc3Bpbl91bmxvY2soJnBkZXYtPnJ4Lm11dGV4KTsKK30KKwordm9pZCBvbF9yeF9yZW9yZGVyX3RpbWVvdXRfaW5pdChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0RGX0FSUkFZX1NJWkUocGRldi0+cngucmVvcmRlcl90aW1lb3V0LmFjY2Vzc19jYXRzKTsKKwkJaSsrKSB7CisJCXN0cnVjdCBvbF90eF9yZW9yZGVyX2NhdF90aW1lb3V0X3QgKnJ4X3Jlb3JkZXJfdGltZW91dF9hYzsKKwkJcnhfcmVvcmRlcl90aW1lb3V0X2FjID0KKwkJCSZwZGV2LT5yeC5yZW9yZGVyX3RpbWVvdXQuYWNjZXNzX2NhdHNbaV07CisJCS8qIGluaXQgdGhlIHBlci1BQyB0aW1lcnMgKi8KKwkJY2RmX3NvZnRpcnFfdGltZXJfaW5pdChwZGV2LT5vc2RldiwKKwkJCQkgICAgICAgJnJ4X3Jlb3JkZXJfdGltZW91dF9hYy0+dGltZXIsCisJCQkJICAgICAgIG9sX3J4X3Jlb3JkZXJfdGltZW91dCwKKwkJCQkgICAgICAgcnhfcmVvcmRlcl90aW1lb3V0X2FjKTsKKwkJLyogaW5pdCB0aGUgdmlydHVhbCB0aW1lciBsaXN0ICovCisJCVRBSUxRX0lOSVQoJnJ4X3Jlb3JkZXJfdGltZW91dF9hYy0+dmlydHVhbF90aW1lcl9saXN0KTsKKwkJcnhfcmVvcmRlcl90aW1lb3V0X2FjLT5wZGV2ID0gcGRldjsKKwl9CisJcGRldi0+cngucmVvcmRlcl90aW1lb3V0LmFjY2Vzc19jYXRzW1RYUlhfV01NX0FDX1ZPXS5kdXJhdGlvbl9tcyA9IDQwOworCXBkZXYtPnJ4LnJlb3JkZXJfdGltZW91dC5hY2Nlc3NfY2F0c1tUWFJYX1dNTV9BQ19WSV0uZHVyYXRpb25fbXMgPSAxMDA7CisJcGRldi0+cngucmVvcmRlcl90aW1lb3V0LmFjY2Vzc19jYXRzW1RYUlhfV01NX0FDX0JFXS5kdXJhdGlvbl9tcyA9IDEwMDsKKwlwZGV2LT5yeC5yZW9yZGVyX3RpbWVvdXQuYWNjZXNzX2NhdHNbVFhSWF9XTU1fQUNfQktdLmR1cmF0aW9uX21zID0gMTAwOworfQorCit2b2lkIG9sX3J4X3Jlb3JkZXJfdGltZW91dF9wZWVyX2NsZWFudXAoc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyKQoreworCWludCB0aWQ7CisKKwlmb3IgKHRpZCA9IDA7IHRpZCA8IE9MX1RYUlhfTlVNX0VYVF9USURTOyB0aWQrKykgeworCQlpZiAocGVlci0+dGlkc19yeF9yZW9yZGVyW3RpZF0udGltZW91dC5hY3RpdmUpCisJCQlvbF9yeF9yZW9yZGVyX3RpbWVvdXRfcmVtb3ZlKHBlZXIsIHRpZCk7CisJfQorfQorCit2b2lkIG9sX3J4X3Jlb3JkZXJfdGltZW91dF9jbGVhbnVwKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDREZfQVJSQVlfU0laRShwZGV2LT5yeC5yZW9yZGVyX3RpbWVvdXQuYWNjZXNzX2NhdHMpOworCQlpKyspIHsKKwkJc3RydWN0IG9sX3R4X3Jlb3JkZXJfY2F0X3RpbWVvdXRfdCAqcnhfcmVvcmRlcl90aW1lb3V0X2FjOworCQlyeF9yZW9yZGVyX3RpbWVvdXRfYWMgPQorCQkJJnBkZXYtPnJ4LnJlb3JkZXJfdGltZW91dC5hY2Nlc3NfY2F0c1tpXTsKKwkJY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKCZyeF9yZW9yZGVyX3RpbWVvdXRfYWMtPnRpbWVyKTsKKwkJY2RmX3NvZnRpcnFfdGltZXJfZnJlZSgmcnhfcmVvcmRlcl90aW1lb3V0X2FjLT50aW1lcik7CisJfQorfQorCisjZW5kaWYgLyogUUNBX1NVUFBPUlRfT0xfUlhfUkVPUkRFUl9USU1FT1VUICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfcnhfcmVvcmRlcl90aW1lb3V0LmggYi9jb3JlL2RwL3R4cngvb2xfcnhfcmVvcmRlcl90aW1lb3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0Mzg3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvdHhyeC9vbF9yeF9yZW9yZGVyX3RpbWVvdXQuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfT0xfUlhfUkVPUkRFUl9USU1FT1VUX19IXworI2RlZmluZSBfT0xfUlhfUkVPUkRFUl9USU1FT1VUX19IXworCisjaW5jbHVkZSA8b2xfdHhyeF90eXBlcy5oPiAgICAgIC8qIG9sX3R4cnhfcGRldl90LCBldGMuICovCisKKyNpZmRlZiBRQ0FfU1VQUE9SVF9PTF9SWF9SRU9SREVSX1RJTUVPVVQKKwordm9pZCBvbF9yeF9yZW9yZGVyX3RpbWVvdXRfaW5pdChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpOwordm9pZCBvbF9yeF9yZW9yZGVyX3RpbWVvdXRfY2xlYW51cChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpOwordm9pZCBvbF9yeF9yZW9yZGVyX3RpbWVvdXRfcmVtb3ZlKHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwgdW5zaWduZWQgdGlkKTsKK3ZvaWQgb2xfcnhfcmVvcmRlcl90aW1lb3V0X3VwZGF0ZShzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsIHVpbnQ4X3QgdGlkKTsKK3ZvaWQgb2xfcnhfcmVvcmRlcl90aW1lb3V0X3BlZXJfY2xlYW51cChzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIpOworCisjZGVmaW5lIE9MX1JYX1JFT1JERVJfVElNRU9VVF9JTklUICAgIG9sX3J4X3Jlb3JkZXJfdGltZW91dF9pbml0CisjZGVmaW5lIE9MX1JYX1JFT1JERVJfVElNRU9VVF9QRUVSX0NMRUFOVVAgb2xfcnhfcmVvcmRlcl90aW1lb3V0X3BlZXJfY2xlYW51cAorI2RlZmluZSBPTF9SWF9SRU9SREVSX1RJTUVPVVRfQ0xFQU5VUCBvbF9yeF9yZW9yZGVyX3RpbWVvdXRfY2xlYW51cAorI2RlZmluZSBPTF9SWF9SRU9SREVSX1RJTUVPVVRfUkVNT1ZFICBvbF9yeF9yZW9yZGVyX3RpbWVvdXRfcmVtb3ZlCisjZGVmaW5lIE9MX1JYX1JFT1JERVJfVElNRU9VVF9VUERBVEUgIG9sX3J4X3Jlb3JkZXJfdGltZW91dF91cGRhdGUKKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9USU1FT1VUX1BFRVJfVElEX0lOSVQocGVlciwgdGlkKSBcCisJKHBlZXIpLT50aWRzX3J4X3Jlb3JkZXJbKHRpZCldLnRpbWVvdXQuYWN0aXZlID0gMAorI2RlZmluZSBPTF9SWF9SRU9SREVSX1RJTUVPVVRfTVVURVhfTE9DSyhwZGV2KSBcCisJY2RmX3NwaW5fbG9jaygmKHBkZXYpLT5yeC5tdXRleCkKKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9USU1FT1VUX01VVEVYX1VOTE9DSyhwZGV2KSBcCisJY2RmX3NwaW5fdW5sb2NrKCYocGRldiktPnJ4Lm11dGV4KQorCisjZWxzZQorCisjZGVmaW5lIE9MX1JYX1JFT1JERVJfVElNRU9VVF9JTklUKHBkZXYpICAgICAgICAvKiBuby1vcCAqLworI2RlZmluZSBPTF9SWF9SRU9SREVSX1RJTUVPVVRfUEVFUl9DTEVBTlVQKHBlZXIpICAgICAgICAvKiBuby1vcCAqLworI2RlZmluZSBPTF9SWF9SRU9SREVSX1RJTUVPVVRfQ0xFQU5VUChwZGV2KSAgICAgLyogbm8tb3AgKi8KKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9USU1FT1VUX1JFTU9WRShwZWVyLCB0aWQpIC8qIG5vLW9wICovCisjZGVmaW5lIE9MX1JYX1JFT1JERVJfVElNRU9VVF9VUERBVEUocGVlciwgdGlkKSAvKiBuby1vcCAqLworI2RlZmluZSBPTF9SWF9SRU9SREVSX1RJTUVPVVRfUEVFUl9USURfSU5JVChwZWVyLCB0aWQpICAvKiBuby1vcCAqLworI2RlZmluZSBPTF9SWF9SRU9SREVSX1RJTUVPVVRfTVVURVhfTE9DSyhwZGV2KSAgLyogbm8tb3AgKi8KKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9USU1FT1VUX01VVEVYX1VOTE9DSyhwZGV2KSAgICAgICAgLyogbm8tb3AgKi8KKworI2VuZGlmIC8qIFFDQV9TVVBQT1JUX09MX1JYX1JFT1JERVJfVElNRU9VVCAqLworCisjZW5kaWYgLyogX09MX1JYX1JFT1JERVJfVElNRU9VVF9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF90eC5jIGIvY29yZS9kcC90eHJ4L29sX3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5NDFjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvdHhyeC9vbF90eC5jCkBAIC0wLDAgKzEsMTM2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyogT1MgYWJzdHJhY3Rpb24gbGlicmFyaWVzICovCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX3QsIGV0Yy4gKi8KKyNpbmNsdWRlIDxjZGZfYXRvbWljLmg+ICAgICAgICAgLyogY2RmX2F0b21pY19yZWFkLCBldGMuICovCisjaW5jbHVkZSA8Y2RmX3V0aWwuaD4gICAgICAgICAgIC8qIGNkZl91bmxpa2VseSAqLworCisvKiBBUElzIGZvciBvdGhlciBtb2R1bGVzICovCisjaW5jbHVkZSA8aHR0Lmg+ICAgICAgICAgICAgICAgIC8qIEhUVF9UWF9FWFRfVElEX01HTVQgKi8KKyNpbmNsdWRlIDxvbF9odHRfdHhfYXBpLmg+ICAgICAgLyogaHR0X3R4X2Rlc2NfdGlkICovCisjaW5jbHVkZSA8b2xfdHhyeF9hcGkuaD4gICAgICAgIC8qIG9sX3R4cnhfdmRldl9oYW5kbGUgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2N0cmxfYXBpLmg+ICAgLyogb2xfdHhyeF9zeW5jICovCisKKy8qIGludGVybmFsIGhlYWRlciBmaWxlcyByZWxldmFudCBmb3IgYWxsIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2ludGVybmFsLmg+ICAgLyogVFhSWF9BU1NFUlQxICovCisjaW5jbHVkZSA8b2xfdHhyeF90eXBlcy5oPiAgICAgIC8qIHBkZXYgc3RhdHMgKi8KKyNpbmNsdWRlIDxvbF90eF9kZXNjLmg+ICAgICAgICAgLyogb2xfdHhfZGVzYyAqLworI2luY2x1ZGUgPG9sX3R4X3NlbmQuaD4gICAgICAgICAvKiBvbF90eF9zZW5kICovCisjaW5jbHVkZSA8b2xfdHhyeC5oPgorCisvKiBpbnRlcm5hbCBoZWFkZXIgZmlsZXMgcmVsZXZhbnQgb25seSBmb3IgSEwgc3lzdGVtcyAqLworI2luY2x1ZGUgPG9sX3R4X3F1ZXVlLmg+ICAgICAgICAvKiBvbF90eF9lbnF1ZXVlICovCisKKy8qIGludGVybmFsIGhlYWRlciBmaWxlcyByZWxldmFudCBvbmx5IGZvciBzcGVjaWZpYyBzeXN0ZW1zIChQcm9udG8pICovCisjaW5jbHVkZSA8b2xfdHhyeF9lbmNhcC5oPiAgICAgIC8qIE9MX1RYX0VOQ0FQLCBldGMgKi8KKyNpbmNsdWRlIDxvbF90eC5oPgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0ZBU1RQQVRICisjaW5jbHVkZSA8aGlmLmg+ICAgICAgICAgICAgICAvKiBISUZfREVWSUNFICovCisjaW5jbHVkZSA8aHRjX2FwaS5oPiAgICAvKiBMYXllcmluZyB2aW9sYXRpb24sIGJ1dCByZXF1aXJlZCBmb3IgZmFzdCBwYXRoICovCisjaW5jbHVkZSA8aHR0X2ludGVybmFsLmg+CisjaW5jbHVkZSA8aHR0X3R5cGVzLmg+ICAgICAgICAvKiBodGNfZW5kcG9pbnQgKi8KKworaW50IGNlX3NlbmRfZmFzdChzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLCBjZGZfbmJ1Zl90ICptc2R1cywKKwkJIHVuc2lnbmVkIGludCBudW1fbXNkdXMsIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9pZCk7CisjZW5kaWYgIC8qIFdMQU5fRkVBVFVSRV9GQVNUUEFUSCAqLworCisvKgorICogVGhlIFRYUlggbW9kdWxlIGRvZXNuJ3QgYWNjZXB0IHR4IGZyYW1lcyB1bmxlc3MgdGhlIHRhcmdldCBoYXMKKyAqIGVub3VnaCBkZXNjcmlwdG9ycyBmb3IgdGhlbS4KKyAqIEZvciBMTCwgdGhlIFRYUlggZGVzY3JpcHRvciBwb29sIGlzIHNpemVkIHRvIG1hdGNoIHRoZSB0YXJnZXQncworICogZGVzY3JpcHRvciBwb29sLiAgSGVuY2UsIGlmIHRoZSBkZXNjcmlwdG9yIGFsbG9jYXRpb24gaW4gVFhSWAorICogc3VjY2VlZHMsIHRoYXQgZ3VhcmFudGVlcyB0aGF0IHRoZSB0YXJnZXQgaGFzIHJvb20gdG8gYWNjZXB0CisgKiB0aGUgbmV3IHR4IGZyYW1lLgorICovCisjZGVmaW5lIG9sX3R4X3ByZXBhcmVfbGwodHhfZGVzYywgdmRldiwgbXNkdSwgbXNkdV9pbmZvKQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gdmRldi0+cGRldjsJCVwKKwkJKG1zZHVfaW5mbyktPmh0dC5pbmZvLmZyYW1lX3R5cGUgPSBwZGV2LT5odHRfcGt0X3R5cGU7CVwKKwkJdHhfZGVzYyA9IG9sX3R4X2Rlc2NfbGwocGRldiwgdmRldiwgbXNkdSwgbXNkdV9pbmZvKTsJXAorCQlpZiAoY2RmX3VubGlrZWx5KCF0eF9kZXNjKSkgewkJCQlcCisJCQlUWFJYX1NUQVRTX01TRFVfTElTVF9JTkNSKAkJCVwKKwkJCQlwZGV2LCB0eC5kcm9wcGVkLmhvc3RfcmVqZWN0LCBtc2R1KTsJXAorCQkJcmV0dXJuIG1zZHU7IC8qIHRoZSBsaXN0IG9mIHVuYWNjZXB0ZWQgTVNEVXMgKi8JXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIG9sX3R4X3ByZXBhcmVfdHNvKHZkZXYsIG1zZHUsIG1zZHVfaW5mbykgXAorCWRvIHsgXAorCQltc2R1X2luZm8udHNvX2luZm8uY3Vycl9zZWcgPSBOVUxMOyBcCisJCWlmIChjZGZfbmJ1Zl9pc190c28obXNkdSkpIHsgXAorCQkJaW50IG51bV9zZWcgPSBjZGZfbmJ1Zl9nZXRfdHNvX251bV9zZWcobXNkdSk7IFwKKwkJCW1zZHVfaW5mby50c29faW5mby50c29fc2VnX2xpc3QgPSBOVUxMOyBcCisJCSAgICBtc2R1X2luZm8udHNvX2luZm8ubnVtX3NlZ3MgPSBudW1fc2VnOyBcCisJCQl3aGlsZSAobnVtX3NlZykgeyBcCisJCQkJc3RydWN0IGNkZl90c29fc2VnX2VsZW1fdCAqdHNvX3NlZyA9IFwKKwkJCQkJb2xfdHNvX2FsbG9jX3NlZ21lbnQodmRldi0+cGRldik7IFwKKwkJCQlpZiAodHNvX3NlZykgeyBcCisJCQkJCXRzb19zZWctPm5leHQgPSBcCisJCQkJCQltc2R1X2luZm8udHNvX2luZm8udHNvX3NlZ19saXN0OyBcCisJCQkJCW1zZHVfaW5mby50c29faW5mby50c29fc2VnX2xpc3QgXAorCQkJCQkJPSB0c29fc2VnOyBcCisJCQkJCW51bV9zZWctLTsgXAorCQkJCX0gZWxzZSB7XAorCQkJCQljZGZfcHJpbnQoIlRTTyBzZWcgYWxsb2MgZmFpbGVkIVxuIik7IFwKKwkJCQl9IFwKKwkJCX0gXAorCQkJY2RmX25idWZfZ2V0X3Rzb19pbmZvKHZkZXYtPnBkZXYtPm9zZGV2LCBcCisJCQkJbXNkdSwgJm1zZHVfaW5mby50c29faW5mbyk7IFwKKwkJCW1zZHVfaW5mby50c29faW5mby5jdXJyX3NlZyA9IFwKKwkJCQltc2R1X2luZm8udHNvX2luZm8udHNvX3NlZ19saXN0OyBcCisJCSAgICBudW1fc2VnID0gbXNkdV9pbmZvLnRzb19pbmZvLm51bV9zZWdzOyBcCisJCX0gZWxzZSB7IFwKKwkJCW1zZHVfaW5mby50c29faW5mby5pc190c28gPSAwOyBcCisJCQltc2R1X2luZm8udHNvX2luZm8ubnVtX3NlZ3MgPSAxOyBcCisJCX0gXAorCX0gd2hpbGUgKDApCisKKy8qKgorICogb2xfdHhfc2VuZF9kYXRhX2ZyYW1lKCkgLSBzZW5kIGRhdGEgZnJhbWUKKyAqIEBzdGFfaWQ6IHN0YSBpZAorICogQHNrYjogc2tiCisgKiBAcHJvdG9fdHlwZTogcHJvdG8gdHlwZQorICoKKyAqIFJldHVybjogc2tiL05VTEwgZm9yIHN1Y2Nlc3MKKyAqLworY2RmX25idWZfdCBvbF90eF9zZW5kX2RhdGFfZnJhbWUodWludDhfdCBzdGFfaWQsIGNkZl9uYnVmX3Qgc2tiLAorCQkJCSB1aW50OF90IHByb3RvX3R5cGUpCit7CisJdm9pZCAqY2RmX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0NERl9ERVZJQ0UpOworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwljZGZfbmJ1Zl90IHJldDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCWlmIChjZGZfdW5saWtlbHkoIXBkZXYpKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkiJXM6cGRldiBpcyBudWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gc2tiOworCX0KKworCWlmIChzdGFfaWQgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkiJXM6SW52YWxpZCBzdGEgaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBza2I7CisJfQorCisJcGVlciA9IG9sX3R4cnhfcGVlcl9maW5kX2J5X2xvY2FsX2lkKHBkZXYsIHN0YV9pZCk7CisJaWYgKCFwZWVyKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkiJXM6SW52YWxpZCBwZWVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gc2tiOworCX0KKworCWlmIChwZWVyLT5zdGF0ZSA8IG9sX3R4cnhfcGVlcl9zdGF0ZV9jb25uKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9XQVJOLAorCQkJIiVzOiBzdGF0aW9uIHRvIGJlIHlldCByZWdpc3RlcmVkLi5kcm9wcGluZyBwa3QiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBza2I7CisJfQorCisJc3RhdHVzID0gY2RmX25idWZfbWFwX3NpbmdsZShjZGZfY3R4LCBza2IsIENERl9ETUFfVE9fREVWSUNFKTsKKwlpZiAoY2RmX3VubGlrZWx5KHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9XQVJOLAorCQkJIiVzOiBuYnVmIG1hcCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBza2I7CisJfQorCisJY2RmX25idWZfdHJhY2Vfc2V0X3Byb3RvX3R5cGUoc2tiLCBwcm90b190eXBlKTsKKworCWlmICgob2xfY2ZnX2lzX2lwX3RjcF91ZHBfY2hlY2tzdW1fb2ZmbG9hZF9lbmFibGVkKHBkZXYtPmN0cmxfcGRldikpCisJCSYmIChjZGZfbmJ1Zl9nZXRfcHJvdG9jb2woc2tiKSA9PSBodG9ucyhFVEhfUF9JUCkpCisJCSYmIChjZGZfbmJ1Zl9nZXRfaXBfc3VtbWVkKHNrYikgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpCisJCWNkZl9uYnVmX3NldF9pcF9zdW1tZWQoc2tiLCBDSEVDS1NVTV9DT01QTEVURSk7CisKKwkvKiBUZXJtaW5hdGUgdGhlIChzaW5nbGUtZWxlbWVudCkgbGlzdCBvZiB0eCBmcmFtZXMgKi8KKwljZGZfbmJ1Zl9zZXRfbmV4dChza2IsIE5VTEwpOworCXJldCA9IE9MX1RYX0xMKHBlZXItPnZkZXYsIHNrYik7CisJaWYgKHJldCkgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfV0FSTiwKKwkJCSIlczogRmFpbGVkIHRvIHR4IiwgX19mdW5jX18pOworCQljZGZfbmJ1Zl91bm1hcF9zaW5nbGUoY2RmX2N0eCwgcmV0LCBDREZfRE1BX1RPX0RFVklDRSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBJUEFfT0ZGTE9BRAorLyoqCisgKiBvbF90eF9zZW5kX2lwYV9kYXRhX2ZyYW1lKCkgLSBzZW5kIElQQSBkYXRhIGZyYW1lCisgKiBAdmRldjogdmRldgorICogQHNrYjogc2tiCisgKgorICogUmV0dXJuOiBza2IvIE5VTEwgaXMgZm9yIHN1Y2Nlc3MKKyAqLworY2RmX25idWZfdCBvbF90eF9zZW5kX2lwYV9kYXRhX2ZyYW1lKHZvaWQgKnZkZXYsCisJCQljZGZfbmJ1Zl90IHNrYikKK3sKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwljZGZfbmJ1Zl90IHJldDsKKworCWlmIChjZGZfdW5saWtlbHkoIXBkZXYpKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkiJXM6IHBkZXYgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHNrYjsKKwl9CisKKwlpZiAoKG9sX2NmZ19pc19pcF90Y3BfdWRwX2NoZWNrc3VtX29mZmxvYWRfZW5hYmxlZChwZGV2LT5jdHJsX3BkZXYpKQorCQkmJiAoY2RmX25idWZfZ2V0X3Byb3RvY29sKHNrYikgPT0gaHRvbnMoRVRIX1BfSVApKQorCQkmJiAoY2RmX25idWZfZ2V0X2lwX3N1bW1lZChza2IpID09IENIRUNLU1VNX1BBUlRJQUwpKQorCQljZGZfbmJ1Zl9zZXRfaXBfc3VtbWVkKHNrYiwgQ0hFQ0tTVU1fQ09NUExFVEUpOworCisJLyogVGVybWluYXRlIHRoZSAoc2luZ2xlLWVsZW1lbnQpIGxpc3Qgb2YgdHggZnJhbWVzICovCisJY2RmX25idWZfc2V0X25leHQoc2tiLCBOVUxMKTsKKwlyZXQgPSBPTF9UWF9MTCgoc3RydWN0IG9sX3R4cnhfdmRldl90ICopdmRldiwgc2tiKTsKKwlpZiAocmV0KSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9XQVJOLAorCQkJIiVzOiBGYWlsZWQgdG8gdHgiLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChGRUFUVVJFX1RTTykKK2NkZl9uYnVmX3Qgb2xfdHhfbGwob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCBjZGZfbmJ1Zl90IG1zZHVfbGlzdCkKK3sKKwljZGZfbmJ1Zl90IG1zZHUgPSBtc2R1X2xpc3Q7CisJc3RydWN0IG9sX3R4cnhfbXNkdV9pbmZvX3QgbXNkdV9pbmZvOworCisJbXNkdV9pbmZvLmh0dC5pbmZvLmwyX2hkcl90eXBlID0gdmRldi0+cGRldi0+aHR0X3BrdF90eXBlOworCW1zZHVfaW5mby5odHQuYWN0aW9uLnR4X2NvbXBfcmVxID0gMDsKKwkvKgorCSAqIFRoZSBtc2R1X2xpc3QgdmFyaWFibGUgY291bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBtc2R1IHZhciwKKwkgKiBidXQganVzdCB0byBjbGFyaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIGRvbmUgb24gYSBzaW5nbGUgTVNEVQorCSAqIHZzLiBhIGxpc3Qgb2YgTVNEVXMsIHVzZSBhIGRpc3RpbmN0IHZhcmlhYmxlIGZvciBzaW5nbGUgTVNEVXMKKwkgKiB3aXRoaW4gdGhlIGxpc3QuCisJICovCisJd2hpbGUgKG1zZHUpIHsKKwkJY2RmX25idWZfdCBuZXh0OworCQlzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjOworCQlpbnQgc2VnbWVudHMgPSAxOworCisJCW1zZHVfaW5mby5odHQuaW5mby5leHRfdGlkID0gY2RmX25idWZfZ2V0X3RpZChtc2R1KTsKKwkJbXNkdV9pbmZvLnBlZXIgPSBOVUxMOworCisJCW9sX3R4X3ByZXBhcmVfdHNvKHZkZXYsIG1zZHUsIG1zZHVfaW5mbyk7CisJCXNlZ21lbnRzID0gbXNkdV9pbmZvLnRzb19pbmZvLm51bV9zZWdzOworCisJCS8qCisJCSAqIFRoZSBuZXRidWYgbWF5IGdldCBsaW5rZWQgaW50byBhIGRpZmZlcmVudCBsaXN0IGluc2lkZSB0aGUKKwkJICogb2xfdHhfc2VuZCBmdW5jdGlvbiwgc28gc3RvcmUgdGhlIG5leHQgcG9pbnRlciBiZWZvcmUgdGhlCisJCSAqIHR4X3NlbmQgY2FsbC4KKwkJICovCisJCW5leHQgPSBjZGZfbmJ1Zl9uZXh0KG1zZHUpOworCQkvKiBpbml0IHRoZSBjdXJyZW50IHNlZ21lbnQgdG8gdGhlIDFzdCBzZWdtZW50IGluIHRoZSBsaXN0ICovCisJCXdoaWxlIChzZWdtZW50cykgeworCisJCQlpZiAobXNkdV9pbmZvLnRzb19pbmZvLmN1cnJfc2VnKQorCQkJCU5CVUZfTUFQUEVEX1BBRERSX0xPKG1zZHUpID0gbXNkdV9pbmZvLnRzb19pbmZvLgorCQkJCQljdXJyX3NlZy0+c2VnLnRzb19mcmFnc1swXS5wYWRkcl9sb3dfMzI7CisKKwkJCXNlZ21lbnRzLS07CisKKwkJCS8qKgorCQkJKiBpZiB0aGlzIGlzIGEganVtYm8gbmJ1ZiwgdGhlbiBpbmNyZW1lbnQgdGhlIG51bWJlcgorCQkJKiBvZiBuYnVmIHVzZXJzIGZvciBlYWNoIGFkZGl0aW9uYWwgc2VnbWVudCBvZiB0aGUgbXNkdS4KKwkJCSogVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBza2IgaXMgZnJlZWQgb25seSBhZnRlcgorCQkJKiByZWNlaXZpbmcgdHggY29tcGxldGlvbiBmb3IgYWxsIHNlZ21lbnRzIG9mIGFuIG5idWYKKwkJCSovCisJCQlpZiAoc2VnbWVudHMpCisJCQkJY2RmX25idWZfaW5jX3VzZXJzKG1zZHUpOworCisJCQlvbF90eF9wcmVwYXJlX2xsKHR4X2Rlc2MsIHZkZXYsIG1zZHUsICZtc2R1X2luZm8pOworCisJCQkvKgorCQkJICogSWYgZGVidWcgZGlzcGxheSBpcyBlbmFibGVkLCBzaG93IHRoZSBtZXRhLWRhdGEgYmVpbmcKKwkJCSAqIGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldCB2aWEgdGhlIEhUVCB0eCBkZXNjcmlwdG9yLgorCQkJICovCisJCQlodHRfdHhfZGVzY19kaXNwbGF5KHR4X2Rlc2MtPmh0dF90eF9kZXNjKTsKKworCQkJb2xfdHhfc2VuZCh2ZGV2LT5wZGV2LCB0eF9kZXNjLCBtc2R1KTsKKworCQkJaWYgKG1zZHVfaW5mby50c29faW5mby5jdXJyX3NlZykgeworCQkJCW1zZHVfaW5mby50c29faW5mby5jdXJyX3NlZyA9CisJCQkJCSBtc2R1X2luZm8udHNvX2luZm8uY3Vycl9zZWctPm5leHQ7CisJCQl9CisKKwkJCWNkZl9uYnVmX2RlY19udW1fZnJhZ3MobXNkdSk7CisKKwkJCWlmIChtc2R1X2luZm8udHNvX2luZm8uaXNfdHNvKSB7CisJCQkJVFhSWF9TVEFUU19UU09fSU5DX1NFRyh2ZGV2LT5wZGV2KTsKKwkJCQlUWFJYX1NUQVRTX1RTT19JTkNfU0VHX0lEWCh2ZGV2LT5wZGV2KTsKKwkJCX0KKwkJfSAvKiB3aGlsZSBzZWdtZW50cyAqLworCisJCW1zZHUgPSBuZXh0OworCQlpZiAobXNkdV9pbmZvLnRzb19pbmZvLmlzX3RzbykgeworCQkJVFhSWF9TVEFUU19UU09fSU5DX01TRFVfSURYKHZkZXYtPnBkZXYpOworCQkJVFhSWF9TVEFUU19UU09fUkVTRVRfTVNEVSh2ZGV2LT5wZGV2KTsKKwkJfQorCX0gLyogd2hpbGUgbXNkdXMgKi8KKwlyZXR1cm4gTlVMTDsgICAgICAgICAgICAvKiBhbGwgTVNEVXMgd2VyZSBhY2NlcHRlZCAqLworfQorI2Vsc2UgLyogVFNPICovCisKK2NkZl9uYnVmX3Qgb2xfdHhfbGwob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCBjZGZfbmJ1Zl90IG1zZHVfbGlzdCkKK3sKKwljZGZfbmJ1Zl90IG1zZHUgPSBtc2R1X2xpc3Q7CisJc3RydWN0IG9sX3R4cnhfbXNkdV9pbmZvX3QgbXNkdV9pbmZvOworCisJbXNkdV9pbmZvLmh0dC5pbmZvLmwyX2hkcl90eXBlID0gdmRldi0+cGRldi0+aHR0X3BrdF90eXBlOworCW1zZHVfaW5mby5odHQuYWN0aW9uLnR4X2NvbXBfcmVxID0gMDsKKwltc2R1X2luZm8udHNvX2luZm8uaXNfdHNvID0gMDsKKwkvKgorCSAqIFRoZSBtc2R1X2xpc3QgdmFyaWFibGUgY291bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBtc2R1IHZhciwKKwkgKiBidXQganVzdCB0byBjbGFyaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIGRvbmUgb24gYSBzaW5nbGUgTVNEVQorCSAqIHZzLiBhIGxpc3Qgb2YgTVNEVXMsIHVzZSBhIGRpc3RpbmN0IHZhcmlhYmxlIGZvciBzaW5nbGUgTVNEVXMKKwkgKiB3aXRoaW4gdGhlIGxpc3QuCisJICovCisJd2hpbGUgKG1zZHUpIHsKKwkJY2RmX25idWZfdCBuZXh0OworCQlzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjOworCisJCW1zZHVfaW5mby5odHQuaW5mby5leHRfdGlkID0gY2RmX25idWZfZ2V0X3RpZChtc2R1KTsKKwkJbXNkdV9pbmZvLnBlZXIgPSBOVUxMOworCQlvbF90eF9wcmVwYXJlX2xsKHR4X2Rlc2MsIHZkZXYsIG1zZHUsICZtc2R1X2luZm8pOworCisJCS8qCisJCSAqIElmIGRlYnVnIGRpc3BsYXkgaXMgZW5hYmxlZCwgc2hvdyB0aGUgbWV0YS1kYXRhIGJlaW5nCisJCSAqIGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldCB2aWEgdGhlIEhUVCB0eCBkZXNjcmlwdG9yLgorCQkgKi8KKwkJaHR0X3R4X2Rlc2NfZGlzcGxheSh0eF9kZXNjLT5odHRfdHhfZGVzYyk7CisJCS8qCisJCSAqIFRoZSBuZXRidWYgbWF5IGdldCBsaW5rZWQgaW50byBhIGRpZmZlcmVudCBsaXN0IGluc2lkZSB0aGUKKwkJICogb2xfdHhfc2VuZCBmdW5jdGlvbiwgc28gc3RvcmUgdGhlIG5leHQgcG9pbnRlciBiZWZvcmUgdGhlCisJCSAqIHR4X3NlbmQgY2FsbC4KKwkJICovCisJCW5leHQgPSBjZGZfbmJ1Zl9uZXh0KG1zZHUpOworCQlvbF90eF9zZW5kKHZkZXYtPnBkZXYsIHR4X2Rlc2MsIG1zZHUpOworCQltc2R1ID0gbmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7ICAgICAgICAgICAgLyogYWxsIE1TRFVzIHdlcmUgYWNjZXB0ZWQgKi8KK30KKyNlbmRpZiAvKiBUU08gKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorLyoqCisgKiBvbF90eF9wcmVwYXJlX2xsX2Zhc3QoKSBBbGxvYyBhbmQgcHJlcGFyZSBUeCBkZXNjcmlwdG9yCisgKgorICogQWxsb2NhdGUgYW5kIHByZXBhcmUgVHggZGVzY3JpcHRvciB3aXRoIG1zZHUgYW5kIGZyYWdtZW50IGRlc2NyaXRvcgorICogaW5mb3JhbXRpb24uCisgKgorICogQHBkZXY6IHBvaW50ZXIgdG8gb2wgcGRldiBoYW5kbGUKKyAqIEB2ZGV2OiBwb2ludGVyIHRvIG9sIHZkZXYgaGFuZGxlCisgKiBAbXNkdTogbGlua2VkIGxpc3Qgb2YgbXNkdSBwYWNrZXRzCisgKiBAcGt0X2Rvd25sb2FkX2xlbjogcGFja2V0IGRvd25sb2FkIGxlbmd0aAorICogQGVwX2lkOiBlbmRwb2ludCBJRAorICogQG1zZHVfaW5mbzogSGFuZGxlIHRvIG1zZHVfaW5mbworICoKKyAqIFJldHVybjogUG9pbnRlciB0byBUeCBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9sX3R4X2Rlc2NfdCAqCitvbF90eF9wcmVwYXJlX2xsX2Zhc3Qoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkgICAgICBvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsIGNkZl9uYnVmX3QgbXNkdSwKKwkJICAgICAgdWludDMyX3QgcGt0X2Rvd25sb2FkX2xlbiwgdWludDMyX3QgZXBfaWQsCisJCSAgICAgIHN0cnVjdCBvbF90eHJ4X21zZHVfaW5mb190ICptc2R1X2luZm8pCit7CisJc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYyA9IE5VTEw7CisJdWludDMyX3QgKmh0dF90eF9kZXNjOworCXZvaWQgKmh0Y19oZHJfdmFkZHI7CisJdV9pbnQzMl90IG51bV9mcmFncywgaTsKKworCXR4X2Rlc2MgPSBvbF90eF9kZXNjX2FsbG9jX3dyYXBwZXIocGRldiwgdmRldiwgbXNkdV9pbmZvKTsKKwlpZiAoY2RmX3VubGlrZWx5KCF0eF9kZXNjKSkKKwkJcmV0dXJuIE5VTEw7CisKKwl0eF9kZXNjLT5uZXRidWYgPSBtc2R1OworCWlmIChtc2R1X2luZm8tPnRzb19pbmZvLmlzX3RzbykgeworCQl0eF9kZXNjLT50c29fZGVzYyA9IG1zZHVfaW5mby0+dHNvX2luZm8uY3Vycl9zZWc7CisJCXR4X2Rlc2MtPnBrdF90eXBlID0gb2xfdHhfZnJtX3RzbzsKKwkJVFhSWF9TVEFUU19NU0RVX0lOQ1IocGRldiwgdHgudHNvLnRzb19wa3RzLCBtc2R1KTsKKwl9IGVsc2UgeworCQl0eF9kZXNjLT5wa3RfdHlwZSA9IG9sX3R4X2ZybV9zdGQ7CisJfQorCisJaHR0X3R4X2Rlc2MgPSB0eF9kZXNjLT5odHRfdHhfZGVzYzsKKworCS8qIE1ha2Ugc3VyZSBmcmFncyBudW0gaXMgc2V0IHRvIDAgKi8KKwkvKgorCSAqIERvIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiBoYXJkc3RhcnQsIHNvCisJICogdGhhdCB3ZSBjYW4gaG9wZWZ1bGx5IHRha2Ugb25seSBvbmUgY2FjaGUtbWlzcyB3aGlsZQorCSAqIGFjY2Vzc2luZyBza2ItPmNiLgorCSAqLworCisJLyogSFRUIEhlYWRlciAqLworCS8qIFRPRE8gOiBUYWtlIGNhcmUgb2YgbXVsdGlwbGUgZnJhZ21lbnRzICovCisKKwkvKiBUT0RPOiBQcmVjb21wdXRlIGFuZCBzdG9yZSBwYWRkciBpbiBvbF90eF9kZXNjX3QgKi8KKwkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIEhUVC9IVEMgaGVhZGVyLCBhZGRlZCBieSBkcml2ZXIgKi8KKwlodGNfaGRyX3ZhZGRyID0gKGNoYXIgKilodHRfdHhfZGVzYyAtIEhUQ19IRUFERVJfTEVOOworCWh0dF90eF9kZXNjX2luaXQocGRldi0+aHR0X3BkZXYsIGh0dF90eF9kZXNjLAorCQkJIHR4X2Rlc2MtPmh0dF90eF9kZXNjX3BhZGRyLCB0eF9kZXNjLT5pZCwgbXNkdSwKKwkJCSAmbXNkdV9pbmZvLT5odHQsICZtc2R1X2luZm8tPnRzb19pbmZvLAorCQkJTlVMTCwgdmRldi0+b3Btb2RlID09IHdsYW5fb3BfbW9kZV9vY2IpOworCisJbnVtX2ZyYWdzID0gY2RmX25idWZfZ2V0X251bV9mcmFncyhtc2R1KTsKKwkvKiBudW1fZnJhZ3MgYXJlIGV4cGVjdGVkIHRvIGJlIDIgbWF4ICovCisJbnVtX2ZyYWdzID0gKG51bV9mcmFncyA+IENWR19OQlVGX01BWF9FWFRSQV9GUkFHUykgPworCQlDVkdfTkJVRl9NQVhfRVhUUkFfRlJBR1MgOiBudW1fZnJhZ3M7CisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpCisJLyoKKwkgKiBVc2UgbnVtX2ZyYWdzIC0gMSwgc2luY2UgMSBmcmFnIGlzIHVzZWQgdG8gc3RvcmUKKwkgKiB0aGUgSFRUL0hUQyBkZXNjcmlwdG9yCisJICogUmVmZXIgdG8gaHR0X3R4X2Rlc2NfaW5pdCgpCisJICovCisJaHR0X3R4X2Rlc2NfbnVtX2ZyYWdzKHBkZXYtPmh0dF9wZGV2LCB0eF9kZXNjLT5odHRfZnJhZ19kZXNjLAorCQkJICAgICAgbnVtX2ZyYWdzIC0gMSk7CisjZWxzZSAvKiAhIGRlZmluZWQoSEVMSVVNUExVU1BBRERSNjQpICovCisJaHR0X3R4X2Rlc2NfbnVtX2ZyYWdzKHBkZXYtPmh0dF9wZGV2LCB0eF9kZXNjLT5odHRfdHhfZGVzYywKKwkJCSAgICAgIG51bV9mcmFncy0xKTsKKyNlbmRpZiAvKiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkgKi8KKwlpZiAobXNkdV9pbmZvLT50c29faW5mby5pc190c28pIHsKKwkJaHR0X3R4X2Rlc2NfZmlsbF90c29faW5mbyhwZGV2LT5odHRfcGRldiwKKwkJCSB0eF9kZXNjLT5odHRfZnJhZ19kZXNjLCAmbXNkdV9pbmZvLT50c29faW5mbyk7CisJCVRYUlhfU1RBVFNfVFNPX1NFR19VUERBVEUocGRldiwKKwkJCSBtc2R1X2luZm8tPnRzb19pbmZvLmN1cnJfc2VnLT5zZWcpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDE7IGkgPCBudW1fZnJhZ3M7IGkrKykgeworCQkJY2RmX3NpemVfdCBmcmFnX2xlbjsKKwkJCXVfaW50MzJfdCBmcmFnX3BhZGRyOworCisJCQlmcmFnX2xlbiA9IGNkZl9uYnVmX2dldF9mcmFnX2xlbihtc2R1LCBpKTsKKwkJCWZyYWdfcGFkZHIgPSBjZGZfbmJ1Zl9nZXRfZnJhZ19wYWRkcl9sbyhtc2R1LCBpKTsKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkKKwkJCWh0dF90eF9kZXNjX2ZyYWcocGRldi0+aHR0X3BkZXYsIHR4X2Rlc2MtPmh0dF9mcmFnX2Rlc2MsCisJCQkJCSBpIC0gMSwgZnJhZ19wYWRkciwgZnJhZ19sZW4pOworI2lmIGRlZmluZWQoSEVMSVVNUExVU19ERUJVRykKKwkJCWNkZl9wcmludCgiJXM6JWQ6IGh0dF9mZGVzYz0lcCBmcmFnX3BhZGRyPSV1IGxlbj0lenVcbiIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHR4X2Rlc2MtPmh0dF9mcmFnX2Rlc2MsCisJCQkJICBmcmFnX3BhZGRyLCBmcmFnX2xlbik7CisJCQlkdW1wX3BrdChuZXRidWYsIGZyYWdfcGFkZHIsIDY0KTsKKyNlbmRpZiAvKiBIRUxJVU1QTFVTX0RFQlVHICovCisjZWxzZSAvKiAhIGRlZmluZWQoSEVMSVVNUExVU1BBRERSNjQpICovCisJCQlodHRfdHhfZGVzY19mcmFnKHBkZXYtPmh0dF9wZGV2LCB0eF9kZXNjLT5odHRfdHhfZGVzYywKKwkJCQkJIGkgLSAxLCBmcmFnX3BhZGRyLCBmcmFnX2xlbik7CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisJCX0KKwl9CisKKwkvKgorCSAqICBEbyB3ZSB3YW50IHRvIHR1cm4gb24gd29yZF9zdHJlYW0gYml0LW1hcCBoZXJlID8gRm9yIGxpbnV4LCBub24tVFNPCisJICogIHRoaXMgaXMgbm90IHJlcXVpcmVkLiBXZSBzdGlsbCBoYXZlIHRvIG1hcmsgdGhlIHN3YXAgYml0IGNvcnJlY3RseSwKKwkgKiAgd2hlbiBwb3N0aW5nIHRvIHRoZSByaW5nCisJICovCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlLCBkYXRhIGRvd25sb2FkIGxlbmd0aCBpcyBjb3JyZWN0ICovCisKKwkvKgorCSAqIFRPRE8gOiBDYW4gd2UgcmVtb3ZlIHRoaXMgY2hlY2sgYW5kIGFsd2F5cyBkb3dubG9hZCBhIGZpeGVkIGxlbmd0aCA/CisJICogKi8KKwlpZiAoY2RmX3VubGlrZWx5KGNkZl9uYnVmX2xlbihtc2R1KSA8IHBrdF9kb3dubG9hZF9sZW4pKQorCQlwa3RfZG93bmxvYWRfbGVuID0gY2RmX25idWZfbGVuKG1zZHUpOworCisJLyogRmlsbCB0aGUgSFRDIGhlYWRlciBpbmZvcm1hdGlvbiAqLworCS8qCisJICogUGFzc2luZyAwIGFzIHRoZSBzZXFfbm8gZmllbGQsIHdlIGNhbiBwcm9iYWJseSBnZXQgYXdheQorCSAqIHdpdGggaXQgZm9yIHRoZSB0aW1lIGJlaW5nLCBzaW5jZSB0aGlzIGlzIG5vdCBjaGVja2VkIGluIGYvdworCSAqLworCS8qIFRPRE8gOiBQcmVmaWxsIHRoaXMsIGxvb2sgYXQgbXVsdGktZnJhZ21lbnQgY2FzZSAqLworCUhUQ19UWF9ERVNDX0ZJTEwoaHRjX2hkcl92YWRkciwgcGt0X2Rvd25sb2FkX2xlbiwgZXBfaWQsIDApOworCisJcmV0dXJuIHR4X2Rlc2M7Cit9CisjaWYgZGVmaW5lZChGRUFUVVJFX1RTTykKKy8qKgorICogb2xfdHhfbGxfZmFzdCgpIFVwZGF0ZSBtZXRhZGF0YSBpbmZvcm1hdGlvbiBhbmQgc2VuZCBtc2R1IHRvIEhJRi9DRQorICoKKyAqIEB2ZGV2OiBoYW5kbGUgdG8gb2xfdHhyeF92ZGV2X3QKKyAqIEBtc2R1X2xpc3Q6IG1zZHUgbGlzdCB0byBiZSBzZW50IG91dC4KKyAqCisgKiBSZXR1cm46IG9uIHN1Y2Nlc3MgcmV0dXJuIE5VTEwsIHBvaW50ZXIgdG8gbmJ1ZiB3aGVuIGl0IGZhaWxzIHRvIHNlbmQuCisgKi8KK2NkZl9uYnVmX3QKK29sX3R4X2xsX2Zhc3Qob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCBjZGZfbmJ1Zl90IG1zZHVfbGlzdCkKK3sKKwljZGZfbmJ1Zl90IG1zZHUgPSBtc2R1X2xpc3Q7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gdmRldi0+cGRldjsKKwl1aW50MzJfdCBwa3RfZG93bmxvYWRfbGVuID0KKwkJKChzdHJ1Y3QgaHR0X3BkZXZfdCAqKShwZGV2LT5odHRfcGRldikpLT5kb3dubG9hZF9sZW47CisJdWludDMyX3QgZXBfaWQgPSBIVFRfRVBJRF9HRVQocGRldi0+aHR0X3BkZXYpOworCXN0cnVjdCBvbF90eHJ4X21zZHVfaW5mb190IG1zZHVfaW5mbzsKKworCW1zZHVfaW5mby5odHQuaW5mby5sMl9oZHJfdHlwZSA9IHZkZXYtPnBkZXYtPmh0dF9wa3RfdHlwZTsKKwltc2R1X2luZm8uaHR0LmFjdGlvbi50eF9jb21wX3JlcSA9IDA7CisJLyoKKwkgKiBUaGUgbXNkdV9saXN0IHZhcmlhYmxlIGNvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbXNkdSB2YXIsCisJICogYnV0IGp1c3QgdG8gY2xhcmlmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBkb25lIG9uIGEgc2luZ2xlIE1TRFUKKwkgKiB2cy4gYSBsaXN0IG9mIE1TRFVzLCB1c2UgYSBkaXN0aW5jdCB2YXJpYWJsZSBmb3Igc2luZ2xlIE1TRFVzCisJICogd2l0aGluIHRoZSBsaXN0LgorCSAqLworCXdoaWxlIChtc2R1KSB7CisJCWNkZl9uYnVmX3QgbmV4dDsKKwkJc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYzsKKwkJaW50IHNlZ21lbnRzID0gMTsKKworCQltc2R1X2luZm8uaHR0LmluZm8uZXh0X3RpZCA9IGNkZl9uYnVmX2dldF90aWQobXNkdSk7CisJCW1zZHVfaW5mby5wZWVyID0gTlVMTDsKKworCQlvbF90eF9wcmVwYXJlX3Rzbyh2ZGV2LCBtc2R1LCBtc2R1X2luZm8pOworCQlzZWdtZW50cyA9IG1zZHVfaW5mby50c29faW5mby5udW1fc2VnczsKKworCQkvKgorCQkgKiBUaGUgbmV0YnVmIG1heSBnZXQgbGlua2VkIGludG8gYSBkaWZmZXJlbnQgbGlzdAorCQkgKiBpbnNpZGUgdGhlIGNlX3NlbmRfZmFzdCBmdW5jdGlvbiwgc28gc3RvcmUgdGhlIG5leHQKKwkJICogcG9pbnRlciBiZWZvcmUgdGhlIGNlX3NlbmQgY2FsbC4KKwkJICovCisJCW5leHQgPSBjZGZfbmJ1Zl9uZXh0KG1zZHUpOworCQkvKiBpbml0IHRoZSBjdXJyZW50IHNlZ21lbnQgdG8gdGhlIDFzdCBzZWdtZW50IGluIHRoZSBsaXN0ICovCisJCXdoaWxlIChzZWdtZW50cykgeworCisJCQlpZiAobXNkdV9pbmZvLnRzb19pbmZvLmN1cnJfc2VnKQorCQkJCU5CVUZfTUFQUEVEX1BBRERSX0xPKG1zZHUpID0gbXNkdV9pbmZvLnRzb19pbmZvLgorCQkJCQljdXJyX3NlZy0+c2VnLnRzb19mcmFnc1swXS5wYWRkcl9sb3dfMzI7CisKKwkJCXNlZ21lbnRzLS07CisKKwkJCS8qKgorCQkJKiBpZiB0aGlzIGlzIGEganVtYm8gbmJ1ZiwgdGhlbiBpbmNyZW1lbnQgdGhlIG51bWJlcgorCQkJKiBvZiBuYnVmIHVzZXJzIGZvciBlYWNoIGFkZGl0aW9uYWwgc2VnbWVudCBvZiB0aGUgbXNkdS4KKwkJCSogVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBza2IgaXMgZnJlZWQgb25seSBhZnRlcgorCQkJKiByZWNlaXZpbmcgdHggY29tcGxldGlvbiBmb3IgYWxsIHNlZ21lbnRzIG9mIGFuIG5idWYKKwkJCSovCisJCQlpZiAoc2VnbWVudHMpCisJCQkJY2RmX25idWZfaW5jX3VzZXJzKG1zZHUpOworCisJCQltc2R1X2luZm8uaHR0LmluZm8uZnJhbWVfdHlwZSA9IHBkZXYtPmh0dF9wa3RfdHlwZTsKKwkJCW1zZHVfaW5mby5odHQuaW5mby52ZGV2X2lkID0gdmRldi0+dmRldl9pZDsKKwkJCW1zZHVfaW5mby5odHQuYWN0aW9uLmNrc3VtX29mZmxvYWQgPQorCQkJCWNkZl9uYnVmX2dldF90eF9ja3N1bShtc2R1KTsKKwkJCXN3aXRjaCAoY2RmX25idWZfZ2V0X2V4ZW1wdGlvbl90eXBlKG1zZHUpKSB7CisJCQljYXNlIENERl9OQlVGX0VYRU1QVF9OT19FWEVNUFRJT046CisJCQljYXNlIENERl9OQlVGX0VYRU1QVF9PTl9LRVlfTUFQUElOR19LRVlfVU5BVkFJTEFCTEU6CisJCQkJLyogV2Ugd2FudCB0byBlbmNyeXB0IHRoaXMgZnJhbWUgKi8KKwkJCQltc2R1X2luZm8uaHR0LmFjdGlvbi5kb19lbmNyeXB0ID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0RGX05CVUZfRVhFTVBUX0FMV0FZUzoKKwkJCQkvKiBXZSBkb24ndCB3YW50IHRvIGVuY3J5cHQgdGhpcyBmcmFtZSAqLworCQkJCW1zZHVfaW5mby5odHQuYWN0aW9uLmRvX2VuY3J5cHQgPSAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQltc2R1X2luZm8uaHR0LmFjdGlvbi5kb19lbmNyeXB0ID0gMTsKKwkJCQljZGZfYXNzZXJ0KDApOworCQkJCWJyZWFrOworCQkJfQorCisJCQl0eF9kZXNjID0gb2xfdHhfcHJlcGFyZV9sbF9mYXN0KHBkZXYsIHZkZXYsIG1zZHUsCisJCQkJCQkgIHBrdF9kb3dubG9hZF9sZW4sIGVwX2lkLAorCQkJCQkJICAmbXNkdV9pbmZvKTsKKworCQkJaWYgKGNkZl9saWtlbHkodHhfZGVzYykpIHsKKwkJCQkvKgorCQkJCSAqIElmIGRlYnVnIGRpc3BsYXkgaXMgZW5hYmxlZCwgc2hvdyB0aGUgbWV0YQorCQkJCSAqIGRhdGEgYmVpbmcgZG93bmxvYWRlZCB0byB0aGUgdGFyZ2V0IHZpYSB0aGUKKwkJCQkgKiBIVFQgdHggZGVzY3JpcHRvci4KKwkJCQkgKi8KKwkJCQlodHRfdHhfZGVzY19kaXNwbGF5KHR4X2Rlc2MtPmh0dF90eF9kZXNjKTsKKwkJCQlpZiAoKDAgPT0gY2Vfc2VuZF9mYXN0KHBkZXYtPmNlX3R4X2hkbCwgJm1zZHUsCisJCQkJCQkgICAgICAgMSwgZXBfaWQpKSkgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgcGFja2V0IGNvdWxkIG5vdCBiZSBzZW50LgorCQkJCQkgKiBGcmVlIHRoZSBkZXNjcmlwdG9yLCByZXR1cm4gdGhlCisJCQkJCSAqIHBhY2tldCB0byB0aGUgY2FsbGVyLgorCQkJCQkgKi8KKwkJCQkJb2xfdHhfZGVzY19mcmVlKHBkZXYsIHR4X2Rlc2MpOworCQkJCQlyZXR1cm4gbXNkdTsKKwkJCQl9CisJCQkJaWYgKG1zZHVfaW5mby50c29faW5mby5jdXJyX3NlZykgeworCQkJCQltc2R1X2luZm8udHNvX2luZm8uY3Vycl9zZWcgPQorCQkJCQltc2R1X2luZm8udHNvX2luZm8uY3Vycl9zZWctPm5leHQ7CisJCQkJfQorCisJCQkJaWYgKG1zZHVfaW5mby50c29faW5mby5pc190c28pIHsKKwkJCQkJY2RmX25idWZfZGVjX251bV9mcmFncyhtc2R1KTsKKwkJCQkJVFhSWF9TVEFUU19UU09fSU5DX1NFRyh2ZGV2LT5wZGV2KTsKKwkJCQkJVFhSWF9TVEFUU19UU09fSU5DX1NFR19JRFgodmRldi0+cGRldik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlUWFJYX1NUQVRTX01TRFVfTElTVF9JTkNSKAorCQkJCQlwZGV2LCB0eC5kcm9wcGVkLmhvc3RfcmVqZWN0LCBtc2R1KTsKKwkJCQkvKiB0aGUgbGlzdCBvZiB1bmFjY2VwdGVkIE1TRFVzICovCisJCQkJcmV0dXJuIG1zZHU7CisJCQl9CisJCX0gLyogd2hpbGUgc2VnbWVudHMgKi8KKworCQltc2R1ID0gbmV4dDsKKwkJaWYgKG1zZHVfaW5mby50c29faW5mby5pc190c28pIHsKKwkJCVRYUlhfU1RBVFNfVFNPX0lOQ19NU0RVX0lEWCh2ZGV2LT5wZGV2KTsKKwkJCVRYUlhfU1RBVFNfVFNPX1JFU0VUX01TRFUodmRldi0+cGRldik7CisJCX0KKwl9IC8qIHdoaWxlIG1zZHVzICovCisJcmV0dXJuIE5VTEw7IC8qIGFsbCBNU0RVcyB3ZXJlIGFjY2VwdGVkICovCit9CisjZWxzZQorY2RmX25idWZfdAorb2xfdHhfbGxfZmFzdChvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsIGNkZl9uYnVmX3QgbXNkdV9saXN0KQoreworCWNkZl9uYnVmX3QgbXNkdSA9IG1zZHVfbGlzdDsKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSB2ZGV2LT5wZGV2OworCXVpbnQzMl90IHBrdF9kb3dubG9hZF9sZW4gPQorCQkoKHN0cnVjdCBodHRfcGRldl90ICopKHBkZXYtPmh0dF9wZGV2KSktPmRvd25sb2FkX2xlbjsKKwl1aW50MzJfdCBlcF9pZCA9IEhUVF9FUElEX0dFVChwZGV2LT5odHRfcGRldik7CisJc3RydWN0IG9sX3R4cnhfbXNkdV9pbmZvX3QgbXNkdV9pbmZvOworCisJbXNkdV9pbmZvLmh0dC5pbmZvLmwyX2hkcl90eXBlID0gdmRldi0+cGRldi0+aHR0X3BrdF90eXBlOworCW1zZHVfaW5mby5odHQuYWN0aW9uLnR4X2NvbXBfcmVxID0gMDsKKwltc2R1X2luZm8udHNvX2luZm8uaXNfdHNvID0gMDsKKwkvKgorCSAqIFRoZSBtc2R1X2xpc3QgdmFyaWFibGUgY291bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBtc2R1IHZhciwKKwkgKiBidXQganVzdCB0byBjbGFyaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIGRvbmUgb24gYSBzaW5nbGUgTVNEVQorCSAqIHZzLiBhIGxpc3Qgb2YgTVNEVXMsIHVzZSBhIGRpc3RpbmN0IHZhcmlhYmxlIGZvciBzaW5nbGUgTVNEVXMKKwkgKiB3aXRoaW4gdGhlIGxpc3QuCisJICovCisJd2hpbGUgKG1zZHUpIHsKKwkJY2RmX25idWZfdCBuZXh0OworCQlzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjOworCisJCW1zZHVfaW5mby5odHQuaW5mby5leHRfdGlkID0gY2RmX25idWZfZ2V0X3RpZChtc2R1KTsKKwkJbXNkdV9pbmZvLnBlZXIgPSBOVUxMOworCisJCW1zZHVfaW5mby5odHQuaW5mby5mcmFtZV90eXBlID0gcGRldi0+aHR0X3BrdF90eXBlOworCQltc2R1X2luZm8uaHR0LmluZm8udmRldl9pZCA9IHZkZXYtPnZkZXZfaWQ7CisJCW1zZHVfaW5mby5odHQuYWN0aW9uLmNrc3VtX29mZmxvYWQgPQorCQkJY2RmX25idWZfZ2V0X3R4X2Nrc3VtKG1zZHUpOworCQlzd2l0Y2ggKGNkZl9uYnVmX2dldF9leGVtcHRpb25fdHlwZShtc2R1KSkgeworCQljYXNlIENERl9OQlVGX0VYRU1QVF9OT19FWEVNUFRJT046CisJCWNhc2UgQ0RGX05CVUZfRVhFTVBUX09OX0tFWV9NQVBQSU5HX0tFWV9VTkFWQUlMQUJMRToKKwkJCS8qIFdlIHdhbnQgdG8gZW5jcnlwdCB0aGlzIGZyYW1lICovCisJCQltc2R1X2luZm8uaHR0LmFjdGlvbi5kb19lbmNyeXB0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIENERl9OQlVGX0VYRU1QVF9BTFdBWVM6CisJCQkvKiBXZSBkb24ndCB3YW50IHRvIGVuY3J5cHQgdGhpcyBmcmFtZSAqLworCQkJbXNkdV9pbmZvLmh0dC5hY3Rpb24uZG9fZW5jcnlwdCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1zZHVfaW5mby5odHQuYWN0aW9uLmRvX2VuY3J5cHQgPSAxOworCQkJY2RmX2Fzc2VydCgwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdHhfZGVzYyA9IG9sX3R4X3ByZXBhcmVfbGxfZmFzdChwZGV2LCB2ZGV2LCBtc2R1LAorCQkJCQkgIHBrdF9kb3dubG9hZF9sZW4sIGVwX2lkLAorCQkJCQkgICZtc2R1X2luZm8pOworCisJCWlmIChjZGZfbGlrZWx5KHR4X2Rlc2MpKSB7CisJCQkvKgorCQkJICogSWYgZGVidWcgZGlzcGxheSBpcyBlbmFibGVkLCBzaG93IHRoZSBtZXRhLWRhdGEgYmVpbmcKKwkJCSAqIGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldCB2aWEgdGhlIEhUVCB0eCBkZXNjcmlwdG9yLgorCQkJICovCisJCQlodHRfdHhfZGVzY19kaXNwbGF5KHR4X2Rlc2MtPmh0dF90eF9kZXNjKTsKKwkJCS8qCisJCQkgKiBUaGUgbmV0YnVmIG1heSBnZXQgbGlua2VkIGludG8gYSBkaWZmZXJlbnQgbGlzdAorCQkJICogaW5zaWRlIHRoZSBjZV9zZW5kX2Zhc3QgZnVuY3Rpb24sIHNvIHN0b3JlIHRoZSBuZXh0CisJCQkgKiBwb2ludGVyIGJlZm9yZSB0aGUgY2Vfc2VuZCBjYWxsLgorCQkJICovCisJCQluZXh0ID0gY2RmX25idWZfbmV4dChtc2R1KTsKKwkJCWlmICgoMCA9PSBjZV9zZW5kX2Zhc3QocGRldi0+Y2VfdHhfaGRsLCAmbXNkdSwgMSwKKwkJCQkJICAgICAgIGVwX2lkKSkpIHsKKwkJCQkvKiBUaGUgcGFja2V0IGNvdWxkIG5vdCBiZSBzZW50ICovCisJCQkJLyogRnJlZSB0aGUgZGVzY3JpcHRvciwgcmV0dXJuIHRoZSBwYWNrZXQgdG8gdGhlCisJCQkJICogY2FsbGVyICovCisJCQkJb2xfdHhfZGVzY19mcmVlKHBkZXYsIHR4X2Rlc2MpOworCQkJCXJldHVybiBtc2R1OworCQkJfQorCQkJbXNkdSA9IG5leHQ7CisJCX0gZWxzZSB7CisJCQlUWFJYX1NUQVRTX01TRFVfTElTVF9JTkNSKAorCQkJCXBkZXYsIHR4LmRyb3BwZWQuaG9zdF9yZWplY3QsIG1zZHUpOworCQkJcmV0dXJuIG1zZHU7IC8qIHRoZSBsaXN0IG9mIHVuYWNjZXB0ZWQgTVNEVXMgKi8KKwkJfQorCX0KKworCXJldHVybiBOVUxMOyAvKiBhbGwgTVNEVXMgd2VyZSBhY2NlcHRlZCAqLworfQorI2VuZGlmIC8qIEZFQVRVUkVfVFNPICovCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0ZBU1RQQVRIICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRkFTVFBBVEgKKy8qKgorICogb2xfdHhfbGxfd3JhcHBlcigpIHdyYXBwZXIgdG8gb2xfdHhfbGwKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgY2RmX25idWZfdAorb2xfdHhfbGxfd3JhcHBlcihvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsIGNkZl9uYnVmX3QgbXNkdV9saXN0KQoreworCXN0cnVjdCBvbF9zb2Z0YyAqaGlmX2RldmljZSA9CisJCShzdHJ1Y3Qgb2xfc29mdGMgKiljZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCisJaWYgKGNkZl9saWtlbHkoaGlmX2RldmljZSAmJiBoaWZfZGV2aWNlLT5mYXN0cGF0aF9tb2RlX29uKSkKKwkJbXNkdV9saXN0ID0gb2xfdHhfbGxfZmFzdCh2ZGV2LCBtc2R1X2xpc3QpOworCWVsc2UKKwkJbXNkdV9saXN0ID0gb2xfdHhfbGwodmRldiwgbXNkdV9saXN0KTsKKworCXJldHVybiBtc2R1X2xpc3Q7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBjZGZfbmJ1Zl90CitvbF90eF9sbF93cmFwcGVyKG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgY2RmX25idWZfdCBtc2R1X2xpc3QpCit7CisJcmV0dXJuIG9sX3R4X2xsKHZkZXYsIG1zZHVfbGlzdCk7Cit9CisjZW5kaWYgIC8qIFdMQU5fRkVBVFVSRV9GQVNUUEFUSCAqLworCisjaWZkZWYgUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wKKworI2RlZmluZSBPTF9UWF9WREVWX1BBVVNFX1FVRVVFX1NFTkRfTUFSR0lOIDQwMAorI2RlZmluZSBPTF9UWF9WREVWX1BBVVNFX1FVRVVFX1NFTkRfUEVSSU9EX01TIDUKK3N0YXRpYyB2b2lkIG9sX3R4X3ZkZXZfbGxfcGF1c2VfcXVldWVfc2VuZF9iYXNlKHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldikKK3sKKwlpbnQgbWF4X3RvX2FjY2VwdDsKKworCWNkZl9zcGluX2xvY2tfYmgoJnZkZXYtPmxsX3BhdXNlLm11dGV4KTsKKwlpZiAodmRldi0+bGxfcGF1c2UucGF1c2VkX3JlYXNvbikgeworCQljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPmxsX3BhdXNlLm11dGV4KTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogU2VuZCBhcyBtdWNoIG9mIHRoZSBiYWNrbG9nIGFzIHBvc3NpYmxlLCBidXQgbGVhdmUgc29tZSBtYXJnaW4KKwkgKiBvZiB1bmFsbG9jYXRlZCB0eCBkZXNjcmlwdG9ycyB0aGF0IGNhbiBiZSB1c2VkIGZvciBuZXcgZnJhbWVzCisJICogYmVpbmcgdHJhbnNtaXR0ZWQgYnkgb3RoZXIgdmRldnMuCisJICogSWRlYWxseSB0aGVyZSB3b3VsZCBiZSBhIHNjaGVkdWxlciwgd2hpY2ggd291bGQgbm90IG9ubHkgbGVhdmUKKwkgKiBzb21lIG1hcmdpbiBmb3IgbmV3IGZyYW1lcyBmb3Igb3RoZXIgdmRldnMsIGJ1dCBhbHNvIHdvdWxkCisJICogZmFpcmx5IGFwcG9ydGlvbiB0aGUgdHggZGVzY3JpcHRvcnMgYmV0d2VlbiBtdWx0aXBsZSB2ZGV2cyB0aGF0CisJICogaGF2ZSBiYWNrbG9ncyBpbiB0aGVpciBwYXVzZSBxdWV1ZXMuCisJICogSG93ZXZlciwgdGhlIGZhaXJuZXNzIGJlbmVmaXQgb2YgaGF2aW5nIGEgc2NoZWR1bGVyIGZvciBmcmFtZXMKKwkgKiBmcm9tIG11bHRpcGxlIHZkZXYncyBwYXVzZSBxdWV1ZXMgaXMgbm90IHN1ZmZpY2llbnQgdG8gb3V0d2VpZ2gKKwkgKiB0aGUgZXh0cmEgY29tcGxleGl0eS4KKwkgKi8KKwltYXhfdG9fYWNjZXB0ID0gdmRldi0+cGRldi0+dHhfZGVzYy5udW1fZnJlZSAtCisJCU9MX1RYX1ZERVZfUEFVU0VfUVVFVUVfU0VORF9NQVJHSU47CisJd2hpbGUgKG1heF90b19hY2NlcHQgPiAwICYmIHZkZXYtPmxsX3BhdXNlLnR4cS5kZXB0aCkgeworCQljZGZfbmJ1Zl90IHR4X21zZHU7CisJCW1heF90b19hY2NlcHQtLTsKKwkJdmRldi0+bGxfcGF1c2UudHhxLmRlcHRoLS07CisJCXR4X21zZHUgPSB2ZGV2LT5sbF9wYXVzZS50eHEuaGVhZDsKKwkJaWYgKHR4X21zZHUpIHsKKwkJCXZkZXYtPmxsX3BhdXNlLnR4cS5oZWFkID0gY2RmX25idWZfbmV4dCh0eF9tc2R1KTsKKwkJCWlmIChOVUxMID09IHZkZXYtPmxsX3BhdXNlLnR4cS5oZWFkKQorCQkJCXZkZXYtPmxsX3BhdXNlLnR4cS50YWlsID0gTlVMTDsKKwkJCWNkZl9uYnVmX3NldF9uZXh0KHR4X21zZHUsIE5VTEwpOworCQkJTkJVRl9VUERBVEVfVFhfUEtUX0NPVU5UKHR4X21zZHUsCisJCQkJCQlOQlVGX1RYX1BLVF9UWFJYX0RFUVVFVUUpOworCQkJdHhfbXNkdSA9IG9sX3R4X2xsX3dyYXBwZXIodmRldiwgdHhfbXNkdSk7CisJCQkvKgorCQkJICogSXQgaXMgdW5leHBlY3RlZCB0aGF0IG9sX3R4X2xsIHdvdWxkIHJlamVjdCB0aGUgZnJhbWUKKwkJCSAqIHNpbmNlIHdlIGNoZWNrZWQgdGhhdCB0aGVyZSdzIHJvb20gZm9yIGl0LCB0aG91Z2gKKwkJCSAqIHRoZXJlJ3MgYW4gaW5maW5pdGVzaW1hbCBwb3NzaWJpbGl0eSB0aGF0IGJldHdlZW4gdGhlCisJCQkgKiB0aW1lIHdlIGNoZWNrZWQgdGhlIHJvb20gYXZhaWxhYmxlIGFuZCBub3csIGEKKwkJCSAqIGNvbmN1cnJlbnQgYmF0Y2ggb2YgdHggZnJhbWVzIHVzZWQgdXAgYWxsIHRoZSByb29tLgorCQkJICogRm9yIHNpbXBsaWNpdHksIGp1c3QgZHJvcCB0aGUgZnJhbWUuCisJCQkgKi8KKwkJCWlmICh0eF9tc2R1KSB7CisJCQkJY2RmX25idWZfdW5tYXAodmRldi0+cGRldi0+b3NkZXYsIHR4X21zZHUsCisJCQkJCSAgICAgICBDREZfRE1BX1RPX0RFVklDRSk7CisJCQkJY2RmX25idWZfdHhfZnJlZSh0eF9tc2R1LCBOQlVGX1BLVF9FUlJPUik7CisJCQl9CisJCX0KKwl9CisJaWYgKHZkZXYtPmxsX3BhdXNlLnR4cS5kZXB0aCkgeworCQljZGZfc29mdGlycV90aW1lcl9jYW5jZWwoJnZkZXYtPmxsX3BhdXNlLnRpbWVyKTsKKwkJY2RmX3NvZnRpcnFfdGltZXJfc3RhcnQoJnZkZXYtPmxsX3BhdXNlLnRpbWVyLAorCQkJCQlPTF9UWF9WREVWX1BBVVNFX1FVRVVFX1NFTkRfUEVSSU9EX01TKTsKKwkJdmRldi0+bGxfcGF1c2UuaXNfcV90aW1lcl9vbiA9IHRydWU7CisJCWlmICh2ZGV2LT5sbF9wYXVzZS50eHEuZGVwdGggPj0gdmRldi0+bGxfcGF1c2UubWF4X3FfZGVwdGgpCisJCQl2ZGV2LT5sbF9wYXVzZS5xX292ZXJmbG93X2NudCsrOworCX0KKworCWNkZl9zcGluX3VubG9ja19iaCgmdmRldi0+bGxfcGF1c2UubXV0ZXgpOworfQorCitzdGF0aWMgY2RmX25idWZfdAorb2xfdHhfdmRldl9wYXVzZV9xdWV1ZV9hcHBlbmQoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkJICAgICAgY2RmX25idWZfdCBtc2R1X2xpc3QsIHVpbnQ4X3Qgc3RhcnRfdGltZXIpCit7CisJY2RmX3NwaW5fbG9ja19iaCgmdmRldi0+bGxfcGF1c2UubXV0ZXgpOworCXdoaWxlIChtc2R1X2xpc3QgJiYKKwkgICAgICAgdmRldi0+bGxfcGF1c2UudHhxLmRlcHRoIDwgdmRldi0+bGxfcGF1c2UubWF4X3FfZGVwdGgpIHsKKwkJY2RmX25idWZfdCBuZXh0ID0gY2RmX25idWZfbmV4dChtc2R1X2xpc3QpOworCQlOQlVGX1VQREFURV9UWF9QS1RfQ09VTlQobXNkdV9saXN0LCBOQlVGX1RYX1BLVF9UWFJYX0VOUVVFVUUpOworCQlEUFRSQUNFKGNkZl9kcF90cmFjZShtc2R1X2xpc3QsCisJCQkJQ0RGX0RQX1RSQUNFX1RYUlhfUVVFVUVfUEFDS0VUX1BUUl9SRUNPUkQsCisJCQkJKHVpbnQ4X3QgKikoY2RmX25idWZfZGF0YShtc2R1X2xpc3QpKSwKKwkJCQlzaXplb2YoY2RmX25idWZfZGF0YShtc2R1X2xpc3QpKSkpOworCisJCXZkZXYtPmxsX3BhdXNlLnR4cS5kZXB0aCsrOworCQlpZiAoIXZkZXYtPmxsX3BhdXNlLnR4cS5oZWFkKSB7CisJCQl2ZGV2LT5sbF9wYXVzZS50eHEuaGVhZCA9IG1zZHVfbGlzdDsKKwkJCXZkZXYtPmxsX3BhdXNlLnR4cS50YWlsID0gbXNkdV9saXN0OworCQl9IGVsc2UgeworCQkJY2RmX25idWZfc2V0X25leHQodmRldi0+bGxfcGF1c2UudHhxLnRhaWwsIG1zZHVfbGlzdCk7CisJCX0KKwkJdmRldi0+bGxfcGF1c2UudHhxLnRhaWwgPSBtc2R1X2xpc3Q7CisKKwkJbXNkdV9saXN0ID0gbmV4dDsKKwl9CisJaWYgKHZkZXYtPmxsX3BhdXNlLnR4cS50YWlsKQorCQljZGZfbmJ1Zl9zZXRfbmV4dCh2ZGV2LT5sbF9wYXVzZS50eHEudGFpbCwgTlVMTCk7CisKKwlpZiAoc3RhcnRfdGltZXIpIHsKKwkJY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKCZ2ZGV2LT5sbF9wYXVzZS50aW1lcik7CisJCWNkZl9zb2Z0aXJxX3RpbWVyX3N0YXJ0KCZ2ZGV2LT5sbF9wYXVzZS50aW1lciwKKwkJCQkJT0xfVFhfVkRFVl9QQVVTRV9RVUVVRV9TRU5EX1BFUklPRF9NUyk7CisJCXZkZXYtPmxsX3BhdXNlLmlzX3FfdGltZXJfb24gPSB0cnVlOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPmxsX3BhdXNlLm11dGV4KTsKKworCXJldHVybiBtc2R1X2xpc3Q7Cit9CisKKy8qCisgKiBTdG9yZSB1cCB0aGUgdHggZnJhbWUgaW4gdGhlIHZkZXYncyB0eCBxdWV1ZSBpZiB0aGUgdmRldiBpcyBwYXVzZWQuCisgKiBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgZnJhbWVzIGluIHRoZSB0eCBxdWV1ZSwgcmVqZWN0IGl0LgorICovCitjZGZfbmJ1Zl90IG9sX3R4X2xsX3F1ZXVlKG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgY2RmX25idWZfdCBtc2R1X2xpc3QpCit7CisJdWludDE2X3QgZXRoX3R5cGU7CisJdWludDMyX3QgcGF1c2VkX3JlYXNvbjsKKworCWlmIChtc2R1X2xpc3QgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYXVzZWRfcmVhc29uID0gdmRldi0+bGxfcGF1c2UucGF1c2VkX3JlYXNvbjsKKwlpZiAocGF1c2VkX3JlYXNvbikgeworCQlpZiAoY2RmX3VubGlrZWx5KChwYXVzZWRfcmVhc29uICYKKwkJCQkgIE9MX1RYUV9QQVVTRV9SRUFTT05fUEVFUl9VTkFVVEhPUklaRUQpID09CisJCQkJIHBhdXNlZF9yZWFzb24pKSB7CisJCQlldGhfdHlwZSA9ICgoKHN0cnVjdCBldGhlcm5ldF9oZHJfdCAqKQorCQkJCSAgICAgY2RmX25idWZfZGF0YShtc2R1X2xpc3QpKS0+CisJCQkJICAgIGV0aGVydHlwZVswXSA8PCA4KSB8CisJCQkJICAgKCgoc3RydWN0IGV0aGVybmV0X2hkcl90ICopCisJCQkJICAgICBjZGZfbmJ1Zl9kYXRhKG1zZHVfbGlzdCkpLT5ldGhlcnR5cGVbMV0pOworCQkJaWYgKEVUSEVSVFlQRV9JU19FQVBPTF9XQVBJKGV0aF90eXBlKSkgeworCQkJCW1zZHVfbGlzdCA9IG9sX3R4X2xsX3dyYXBwZXIodmRldiwgbXNkdV9saXN0KTsKKwkJCQlyZXR1cm4gbXNkdV9saXN0OworCQkJfQorCQl9CisJCW1zZHVfbGlzdCA9IG9sX3R4X3ZkZXZfcGF1c2VfcXVldWVfYXBwZW5kKHZkZXYsIG1zZHVfbGlzdCwgMSk7CisJfSBlbHNlIHsKKwkJaWYgKHZkZXYtPmxsX3BhdXNlLnR4cS5kZXB0aCA+IDAgfHwKKwkJICAgIHZkZXYtPnBkZXYtPnR4X3Rocm90dGxlLmN1cnJlbnRfdGhyb3R0bGVfbGV2ZWwgIT0KKwkJICAgIFRIUk9UVExFX0xFVkVMXzApIHsKKwkJCS8qIG5vdCBwYXVzZWQsIGJ1dCB0aGVyZSBpcyBhIGJhY2tsb2cgb2YgZnJtcworCQkJICAgZnJvbSBhIHByaW9yIHBhdXNlIG9yIHRocm90dGxlIG9mZiBwaGFzZSAqLworCQkJbXNkdV9saXN0ID0gb2xfdHhfdmRldl9wYXVzZV9xdWV1ZV9hcHBlbmQoCisJCQkJdmRldiwgbXNkdV9saXN0LCAwKTsKKwkJCS8qIGlmIHRocm90dGxlIGlzIGRpc2FibGVkIG9yIHBoYXNlIGlzICJvbiIsCisJCQkgICBzZW5kIHRoZSBmcmFtZSAqLworCQkJaWYgKHZkZXYtPnBkZXYtPnR4X3Rocm90dGxlLmN1cnJlbnRfdGhyb3R0bGVfbGV2ZWwgPT0KKwkJCSAgICBUSFJPVFRMRV9MRVZFTF8wIHx8CisJCQkgICAgdmRldi0+cGRldi0+dHhfdGhyb3R0bGUuY3VycmVudF90aHJvdHRsZV9waGFzZSA9PQorCQkJICAgIFRIUk9UVExFX1BIQVNFX09OKSB7CisJCQkJLyogc2VuZCBhcyBtYW55IGZyYW1lcyBhcyBwb3NzaWJsZQorCQkJCSAgIGZyb20gdGhlIHZkZXZzIGJhY2tsb2cgKi8KKwkJCQlvbF90eF92ZGV2X2xsX3BhdXNlX3F1ZXVlX3NlbmRfYmFzZSh2ZGV2KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIG5vdCBwYXVzZWQsIG5vIHRocm90dGxlIGFuZCBubyBiYWNrbG9nIC0KKwkJCSAgIHNlbmQgdGhlIG5ldyBmcmFtZXMgKi8KKwkJCW1zZHVfbGlzdCA9IG9sX3R4X2xsX3dyYXBwZXIodmRldiwgbXNkdV9saXN0KTsKKwkJfQorCX0KKwlyZXR1cm4gbXNkdV9saXN0OworfQorCisvKgorICogUnVuIHRocm91Z2ggdGhlIHRyYW5zbWl0IHF1ZXVlcyBmb3IgYWxsIHRoZSB2ZGV2cyBhbmQKKyAqIHNlbmQgdGhlIHBlbmRpbmcgZnJhbWVzCisgKi8KK3ZvaWQgb2xfdHhfcGRldl9sbF9wYXVzZV9xdWV1ZV9zZW5kX2FsbChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpCit7CisJaW50IG1heF90b19zZW5kOyAgICAgICAgLyogdHJhY2tzIGhvdyBtYW55IGZyYW1lcyBoYXZlIGJlZW4gc2VudCAqLworCWNkZl9uYnVmX3QgdHhfbXNkdTsKKwlzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYgPSBOVUxMOworCXVpbnQ4X3QgbW9yZTsKKworCWlmIChOVUxMID09IHBkZXYpCisJCXJldHVybjsKKworCWlmIChwZGV2LT50eF90aHJvdHRsZS5jdXJyZW50X3Rocm90dGxlX3BoYXNlID09IFRIUk9UVExFX1BIQVNFX09GRikKKwkJcmV0dXJuOworCisJLyogZW5zdXJlIHRoYXQgd2Ugc2VuZCBubyBtb3JlIHRoYW4gdHhfdGhyZXNob2xkIGZyYW1lcyBhdCBvbmNlICovCisJbWF4X3RvX3NlbmQgPSBwZGV2LT50eF90aHJvdHRsZS50eF90aHJlc2hvbGQ7CisKKwkvKiByb3VuZCByb2JpbiB0aHJvdWdoIHRoZSB2ZGV2IHF1ZXVlcyBmb3IgdGhlIGdpdmVuIHBkZXYgKi8KKworCS8qIFBvdGVudGlhbCBpbXByb3ZlbWVudDogZG93bmxvYWQgc2V2ZXJhbCBmcmFtZXMgZnJvbSB0aGUgc2FtZSB2ZGV2CisJICAgYXQgYSB0aW1lLCBzaW5jZSBpdCBpcyBtb3JlIGxpa2VseSB0aGF0IHRob3NlIGZyYW1lcyBjb3VsZCBiZQorCSAgIGFnZ3JlZ2F0ZWQgdG9nZXRoZXIsIHJlbWVtYmVyIHdoaWNoIHZkZXYgd2FzIHNlcnZpY2VkIGxhc3QsCisJICAgc28gdGhlIG5leHQgY2FsbCB0aGlzIGZ1bmN0aW9uIGNhbiByZXN1bWUgdGhlIHJvdW5kLXJvYmluCisJICAgdHJhdmVyc2luZyB3aGVyZSB0aGUgY3VycmVudCBpbnZvY2F0aW9uIGxlZnQgb2ZmICovCisJZG8geworCQltb3JlID0gMDsKKwkJVEFJTFFfRk9SRUFDSCh2ZGV2LCAmcGRldi0+dmRldl9saXN0LCB2ZGV2X2xpc3RfZWxlbSkgeworCisJCQljZGZfc3Bpbl9sb2NrX2JoKCZ2ZGV2LT5sbF9wYXVzZS5tdXRleCk7CisJCQlpZiAodmRldi0+bGxfcGF1c2UudHhxLmRlcHRoKSB7CisJCQkJaWYgKHZkZXYtPmxsX3BhdXNlLnBhdXNlZF9yZWFzb24pIHsKKwkJCQkJY2RmX3NwaW5fdW5sb2NrX2JoKCZ2ZGV2LT5sbF9wYXVzZS4KKwkJCQkJCQkgICBtdXRleCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXR4X21zZHUgPSB2ZGV2LT5sbF9wYXVzZS50eHEuaGVhZDsKKwkJCQlpZiAoTlVMTCA9PSB0eF9tc2R1KSB7CisJCQkJCWNkZl9zcGluX3VubG9ja19iaCgmdmRldi0+bGxfcGF1c2UuCisJCQkJCQkJICAgbXV0ZXgpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQltYXhfdG9fc2VuZC0tOworCQkJCXZkZXYtPmxsX3BhdXNlLnR4cS5kZXB0aC0tOworCisJCQkJdmRldi0+bGxfcGF1c2UudHhxLmhlYWQgPQorCQkJCQljZGZfbmJ1Zl9uZXh0KHR4X21zZHUpOworCisJCQkJaWYgKE5VTEwgPT0gdmRldi0+bGxfcGF1c2UudHhxLmhlYWQpCisJCQkJCXZkZXYtPmxsX3BhdXNlLnR4cS50YWlsID0gTlVMTDsKKworCQkJCWNkZl9uYnVmX3NldF9uZXh0KHR4X21zZHUsIE5VTEwpOworCQkJCXR4X21zZHUgPSBvbF90eF9sbF93cmFwcGVyKHZkZXYsIHR4X21zZHUpOworCQkJCS8qCisJCQkJICogSXQgaXMgdW5leHBlY3RlZCB0aGF0IG9sX3R4X2xsIHdvdWxkIHJlamVjdAorCQkJCSAqIHRoZSBmcmFtZSwgc2luY2Ugd2UgY2hlY2tlZCB0aGF0IHRoZXJlJ3MKKwkJCQkgKiByb29tIGZvciBpdCwgdGhvdWdoIHRoZXJlJ3MgYW4gaW5maW5pdGVzaW1hbAorCQkJCSAqIHBvc3NpYmlsaXR5IHRoYXQgYmV0d2VlbiB0aGUgdGltZSB3ZSBjaGVja2VkCisJCQkJICogdGhlIHJvb20gYXZhaWxhYmxlIGFuZCBub3csIGEgY29uY3VycmVudAorCQkJCSAqIGJhdGNoIG9mIHR4IGZyYW1lcyB1c2VkIHVwIGFsbCB0aGUgcm9vbS4KKwkJCQkgKiBGb3Igc2ltcGxpY2l0eSwganVzdCBkcm9wIHRoZSBmcmFtZS4KKwkJCQkgKi8KKwkJCQlpZiAodHhfbXNkdSkgeworCQkJCQljZGZfbmJ1Zl91bm1hcChwZGV2LT5vc2RldiwgdHhfbXNkdSwKKwkJCQkJCSAgICAgICBDREZfRE1BX1RPX0RFVklDRSk7CisJCQkJCWNkZl9uYnVmX3R4X2ZyZWUodHhfbXNkdSwKKwkJCQkJCQkgTkJVRl9QS1RfRVJST1IpOworCQkJCX0KKwkJCX0KKwkJCS8qY2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgbXNkdXMgdG8gdHJhbnNtaXQgKi8KKwkJCWlmICh2ZGV2LT5sbF9wYXVzZS50eHEuZGVwdGgpCisJCQkJbW9yZSA9IDE7CisJCQljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPmxsX3BhdXNlLm11dGV4KTsKKwkJfQorCX0gd2hpbGUgKG1vcmUgJiYgbWF4X3RvX3NlbmQpOworCisJdmRldiA9IE5VTEw7CisJVEFJTFFfRk9SRUFDSCh2ZGV2LCAmcGRldi0+dmRldl9saXN0LCB2ZGV2X2xpc3RfZWxlbSkgeworCQljZGZfc3Bpbl9sb2NrX2JoKCZ2ZGV2LT5sbF9wYXVzZS5tdXRleCk7CisJCWlmICh2ZGV2LT5sbF9wYXVzZS50eHEuZGVwdGgpIHsKKwkJCWNkZl9zb2Z0aXJxX3RpbWVyX2NhbmNlbCgmcGRldi0+dHhfdGhyb3R0bGUudHhfdGltZXIpOworCQkJY2RmX3NvZnRpcnFfdGltZXJfc3RhcnQoCisJCQkJJnBkZXYtPnR4X3Rocm90dGxlLnR4X3RpbWVyLAorCQkJCU9MX1RYX1ZERVZfUEFVU0VfUVVFVUVfU0VORF9QRVJJT0RfTVMpOworCQkJY2RmX3NwaW5fdW5sb2NrX2JoKCZ2ZGV2LT5sbF9wYXVzZS5tdXRleCk7CisJCQlyZXR1cm47CisJCX0KKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZ2ZGV2LT5sbF9wYXVzZS5tdXRleCk7CisJfQorfQorCit2b2lkIG9sX3R4X3ZkZXZfbGxfcGF1c2VfcXVldWVfc2VuZCh2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiA9IChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKiljb250ZXh0OworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHZkZXYtPnBkZXY7CisKKwlpZiAocGRldi0+dHhfdGhyb3R0bGUuY3VycmVudF90aHJvdHRsZV9sZXZlbCAhPSBUSFJPVFRMRV9MRVZFTF8wICYmCisJICAgIHBkZXYtPnR4X3Rocm90dGxlLmN1cnJlbnRfdGhyb3R0bGVfcGhhc2UgPT0gVEhST1RUTEVfUEhBU0VfT0ZGKQorCQlyZXR1cm47CisJb2xfdHhfdmRldl9sbF9wYXVzZV9xdWV1ZV9zZW5kX2Jhc2UodmRldik7Cit9CisjZW5kaWYgLyogUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wgKi8KKworc3RhdGljIGlubGluZSBpbnQgb2xfdHhyeF90eF9pc19yYXcoZW51bSBvbF90eF9zcGVjIHR4X3NwZWMpCit7CisJcmV0dXJuCisJCXR4X3NwZWMgJgorCQkob2xfdHhfc3BlY19yYXcgfCBvbF90eF9zcGVjX25vX2FnZ3IgfCBvbF90eF9zcGVjX25vX2VuY3J5cHQpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3Qgb2xfdHhyeF90eF9yYXdfc3VidHlwZShlbnVtIG9sX3R4X3NwZWMgdHhfc3BlYykKK3sKKwl1aW50OF90IHN1Yl90eXBlID0gMHgxOyAvKiA4MDIuMTEgTUFDIGhlYWRlciBwcmVzZW50ICovCisKKwlpZiAodHhfc3BlYyAmIG9sX3R4X3NwZWNfbm9fYWdncikKKwkJc3ViX3R5cGUgfD0gMHgxIDw8IEhUVF9UWF9NU0RVX0RFU0NfUkFXX1NVQlRZUEVfTk9fQUdHUl9TOworCWlmICh0eF9zcGVjICYgb2xfdHhfc3BlY19ub19lbmNyeXB0KQorCQlzdWJfdHlwZSB8PSAweDEgPDwgSFRUX1RYX01TRFVfREVTQ19SQVdfU1VCVFlQRV9OT19FTkNSWVBUX1M7CisJaWYgKHR4X3NwZWMgJiBvbF90eF9zcGVjX253aWZpX25vX2VuY3J5cHQpCisJCXN1Yl90eXBlIHw9IDB4MSA8PCBIVFRfVFhfTVNEVV9ERVNDX1JBV19TVUJUWVBFX05PX0VOQ1JZUFRfUzsKKwlyZXR1cm4gc3ViX3R5cGU7Cit9CisKK2NkZl9uYnVmX3QKK29sX3R4X25vbl9zdGRfbGwob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LAorCQkgZW51bSBvbF90eF9zcGVjIHR4X3NwZWMsIGNkZl9uYnVmX3QgbXNkdV9saXN0KQoreworCWNkZl9uYnVmX3QgbXNkdSA9IG1zZHVfbGlzdDsKKwlodHRfcGRldl9oYW5kbGUgaHR0X3BkZXYgPSB2ZGV2LT5wZGV2LT5odHRfcGRldjsKKwlzdHJ1Y3Qgb2xfdHhyeF9tc2R1X2luZm9fdCBtc2R1X2luZm87CisKKwltc2R1X2luZm8uaHR0LmluZm8ubDJfaGRyX3R5cGUgPSB2ZGV2LT5wZGV2LT5odHRfcGt0X3R5cGU7CisJbXNkdV9pbmZvLmh0dC5hY3Rpb24udHhfY29tcF9yZXEgPSAwOworCisJLyoKKwkgKiBUaGUgbXNkdV9saXN0IHZhcmlhYmxlIGNvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbXNkdSB2YXIsCisJICogYnV0IGp1c3QgdG8gY2xhcmlmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBkb25lIG9uIGEgc2luZ2xlIE1TRFUKKwkgKiB2cy4gYSBsaXN0IG9mIE1TRFVzLCB1c2UgYSBkaXN0aW5jdCB2YXJpYWJsZSBmb3Igc2luZ2xlIE1TRFVzCisJICogd2l0aGluIHRoZSBsaXN0LgorCSAqLworCXdoaWxlIChtc2R1KSB7CisJCWNkZl9uYnVmX3QgbmV4dDsKKwkJc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYzsKKworCQltc2R1X2luZm8uaHR0LmluZm8uZXh0X3RpZCA9IGNkZl9uYnVmX2dldF90aWQobXNkdSk7CisJCW1zZHVfaW5mby5wZWVyID0gTlVMTDsKKwkJbXNkdV9pbmZvLnRzb19pbmZvLmlzX3RzbyA9IDA7CisKKwkJb2xfdHhfcHJlcGFyZV9sbCh0eF9kZXNjLCB2ZGV2LCBtc2R1LCAmbXNkdV9pbmZvKTsKKworCQkvKgorCQkgKiBUaGUgbmV0YnVmIG1heSBnZXQgbGlua2VkIGludG8gYSBkaWZmZXJlbnQgbGlzdCBpbnNpZGUgdGhlCisJCSAqIG9sX3R4X3NlbmQgZnVuY3Rpb24sIHNvIHN0b3JlIHRoZSBuZXh0IHBvaW50ZXIgYmVmb3JlIHRoZQorCQkgKiB0eF9zZW5kIGNhbGwuCisJCSAqLworCQluZXh0ID0gY2RmX25idWZfbmV4dChtc2R1KTsKKworCQlpZiAodHhfc3BlYyAhPSBvbF90eF9zcGVjX3N0ZCkgeworCQkJaWYgKHR4X3NwZWMgJiBvbF90eF9zcGVjX25vX2ZyZWUpIHsKKwkJCQl0eF9kZXNjLT5wa3RfdHlwZSA9IG9sX3R4X2ZybV9ub19mcmVlOworCQkJfSBlbHNlIGlmICh0eF9zcGVjICYgb2xfdHhfc3BlY190c28pIHsKKwkJCQl0eF9kZXNjLT5wa3RfdHlwZSA9IG9sX3R4X2ZybV90c287CisJCQl9IGVsc2UgaWYgKHR4X3NwZWMgJiBvbF90eF9zcGVjX253aWZpX25vX2VuY3J5cHQpIHsKKwkJCQl1aW50OF90IHN1Yl90eXBlID0KKwkJCQkJb2xfdHhyeF90eF9yYXdfc3VidHlwZSh0eF9zcGVjKTsKKwkJCQlodHRfdHhfZGVzY190eXBlKGh0dF9wZGV2LCB0eF9kZXNjLT5odHRfdHhfZGVzYywKKwkJCQkJCSBodHRfcGt0X3R5cGVfbmF0aXZlX3dpZmksCisJCQkJCQkgc3ViX3R5cGUpOworCQkJfSBlbHNlIGlmIChvbF90eHJ4X3R4X2lzX3Jhdyh0eF9zcGVjKSkgeworCQkJCS8qIGRpZmZlcmVudCB0eXBlcyBvZiByYXcgZnJhbWVzICovCisJCQkJdWludDhfdCBzdWJfdHlwZSA9CisJCQkJCW9sX3R4cnhfdHhfcmF3X3N1YnR5cGUodHhfc3BlYyk7CisJCQkJaHR0X3R4X2Rlc2NfdHlwZShodHRfcGRldiwgdHhfZGVzYy0+aHR0X3R4X2Rlc2MsCisJCQkJCQkgaHR0X3BrdF90eXBlX3Jhdywgc3ViX3R5cGUpOworCQkJfQorCQl9CisJCS8qCisJCSAqIElmIGRlYnVnIGRpc3BsYXkgaXMgZW5hYmxlZCwgc2hvdyB0aGUgbWV0YS1kYXRhIGJlaW5nCisJCSAqIGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldCB2aWEgdGhlIEhUVCB0eCBkZXNjcmlwdG9yLgorCQkgKi8KKwkJaHR0X3R4X2Rlc2NfZGlzcGxheSh0eF9kZXNjLT5odHRfdHhfZGVzYyk7CisJCW9sX3R4X3NlbmQodmRldi0+cGRldiwgdHhfZGVzYywgbXNkdSk7CisJCW1zZHUgPSBuZXh0OworCX0KKwlyZXR1cm4gTlVMTDsgICAgICAgICAgICAvKiBhbGwgTVNEVXMgd2VyZSBhY2NlcHRlZCAqLworfQorCisjaWZkZWYgUUNBX1NVUFBPUlRfU1dfVFhSWF9FTkNBUAorI2RlZmluZSBPTF9UWF9FTkNBUF9XUkFQUEVSKHBkZXYsIHZkZXYsIHR4X2Rlc2MsIG1zZHUsIHR4X21zZHVfaW5mbykgXAorCWRvIHsgXAorCQlpZiAoT0xfVFhfRU5DQVAodmRldiwgdHhfZGVzYywgbXNkdSwgJnR4X21zZHVfaW5mbykgIT0gQV9PSykgeyBcCisJCQljZGZfYXRvbWljX2luYygmcGRldi0+dHhfcXVldWUucnNyY19jbnQpOyBcCisJCQlvbF90eF9kZXNjX2ZyYW1lX2ZyZWVfbm9uc3RkKHBkZXYsIHR4X2Rlc2MsIDEpOwlcCisJCQlpZiAodHhfbXNkdV9pbmZvLnBlZXIpIHsgXAorCQkJCS8qIHJlbW92ZSB0aGUgcGVlciByZWZlcmVuY2UgYWRkZWQgYWJvdmUgKi8gXAorCQkJCW9sX3R4cnhfcGVlcl91bnJlZl9kZWxldGUodHhfbXNkdV9pbmZvLnBlZXIpOyBcCisJCQl9IFwKKwkJCWdvdG8gTVNEVV9MT09QX0JPVFRPTTsgXAorCQl9IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgT0xfVFhfRU5DQVBfV1JBUFBFUihwZGV2LCB2ZGV2LCB0eF9kZXNjLCBtc2R1LCB0eF9tc2R1X2luZm8pIC8qIG5vLW9wICovCisjZW5kaWYKKworLyogdHggZmlsdGVyaW5nIGlzIGhhbmRsZWQgd2l0aGluIHRoZSB0YXJnZXQgRlcgKi8KKyNkZWZpbmUgVFhfRklMVEVSX0NIRUNLKHR4X21zZHVfaW5mbykgMCAvKiBkb24ndCBmaWx0ZXIgKi8KKworLyoqCisgKiBwYXJzZV9vY2JfdHhfaGVhZGVyKCkgLSBGdW5jdGlvbiB0byBjaGVjayBmb3IgT0NCCisgKiBUWCBjb250cm9sIGhlYWRlciBvbiBhIHBhY2tldCBhbmQgZXh0cmFjdCBpdCBpZiBwcmVzZW50CisgKgorICogQG1zZHU6ICAgUG9pbnRlciB0byBPUyBwYWNrZXQgKGNkZl9uYnVmX3QpCisgKi8KKyNkZWZpbmUgT0NCX0hFQURFUl9WRVJTSU9OICAgICAxCitib29sIHBhcnNlX29jYl90eF9oZWFkZXIoY2RmX25idWZfdCBtc2R1LAorCQkJc3RydWN0IG9jYl90eF9jdHJsX2hkcl90ICp0eF9jdHJsKQoreworCXN0cnVjdCBldGhlcl9oZWFkZXIgKmV0aF9oZHJfcDsKKwlzdHJ1Y3Qgb2NiX3R4X2N0cmxfaGRyX3QgKnR4X2N0cmxfaGRyOworCisJLyogQ2hlY2sgaWYgVFggY29udHJvbCBoZWFkZXIgaXMgcHJlc2VudCAqLworCWV0aF9oZHJfcCA9IChzdHJ1Y3QgZXRoZXJfaGVhZGVyICopIGNkZl9uYnVmX2RhdGEobXNkdSk7CisJaWYgKGV0aF9oZHJfcC0+ZXRoZXJfdHlwZSAhPSBDREZfU1dBUF9VMTYoRVRIRVJUWVBFX09DQl9UWCkpCisJCS8qIFRYIGNvbnRyb2wgaGVhZGVyIGlzIG5vdCBwcmVzZW50LiBOb3RoaW5nIHRvIGRvLi4gKi8KKwkJcmV0dXJuIHRydWU7CisKKwkvKiBSZW1vdmUgdGhlIGV0aGVybmV0IGhlYWRlciAqLworCWNkZl9uYnVmX3B1bGxfaGVhZChtc2R1LCBzaXplb2Yoc3RydWN0IGV0aGVyX2hlYWRlcikpOworCisJLyogUGFyc2UgdGhlIFRYIGNvbnRyb2wgaGVhZGVyICovCisJdHhfY3RybF9oZHIgPSAoc3RydWN0IG9jYl90eF9jdHJsX2hkcl90ICopIGNkZl9uYnVmX2RhdGEobXNkdSk7CisKKwlpZiAodHhfY3RybF9oZHItPnZlcnNpb24gPT0gT0NCX0hFQURFUl9WRVJTSU9OKSB7CisJCWlmICh0eF9jdHJsKQorCQkJY2RmX21lbV9jb3B5KHR4X2N0cmwsIHR4X2N0cmxfaGRyLAorCQkJCXNpemVvZigqdHhfY3RybF9oZHIpKTsKKwl9IGVsc2UgeworCQkvKiBUaGUgVFggY29udHJvbCBoZWFkZXIgaXMgaW52YWxpZC4gKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIFJlbW92ZSB0aGUgVFggY29udHJvbCBoZWFkZXIgKi8KKwljZGZfbmJ1Zl9wdWxsX2hlYWQobXNkdSwgdHhfY3RybF9oZHItPmxlbmd0aCk7CisJcmV0dXJuIHRydWU7Cit9CisKK2NkZl9uYnVmX3QKK29sX3R4X25vbl9zdGQob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LAorCSAgICAgIGVudW0gb2xfdHhfc3BlYyB0eF9zcGVjLCBjZGZfbmJ1Zl90IG1zZHVfbGlzdCkKK3sKKwlyZXR1cm4gb2xfdHhfbm9uX3N0ZF9sbCh2ZGV2LCB0eF9zcGVjLCBtc2R1X2xpc3QpOworfQorCit2b2lkCitvbF90eHJ4X2RhdGFfdHhfY2Jfc2V0KG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwKKwkJICAgICAgIG9sX3R4cnhfZGF0YV90eF9jYiBjYWxsYmFjaywgdm9pZCAqY3R4dCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSB2ZGV2LT5wZGV2OworCXBkZXYtPnR4X2RhdGFfY2FsbGJhY2suZnVuYyA9IGNhbGxiYWNrOworCXBkZXYtPnR4X2RhdGFfY2FsbGJhY2suY3R4dCA9IGN0eHQ7Cit9CisKK3ZvaWQKK29sX3R4cnhfbWdtdF90eF9jYl9zZXQob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgICAgdWludDhfdCB0eXBlLAorCQkgICAgICAgb2xfdHhyeF9tZ210X3R4X2NiIGRvd25sb2FkX2NiLAorCQkgICAgICAgb2xfdHhyeF9tZ210X3R4X2NiIG90YV9hY2tfY2IsIHZvaWQgKmN0eHQpCit7CisJVFhSWF9BU1NFUlQxKHR5cGUgPCBPTF9UWFJYX01HTVRfTlVNX1RZUEVTKTsKKwlwZGV2LT50eF9tZ210LmNhbGxiYWNrc1t0eXBlXS5kb3dubG9hZF9jYiA9IGRvd25sb2FkX2NiOworCXBkZXYtPnR4X21nbXQuY2FsbGJhY2tzW3R5cGVdLm90YV9hY2tfY2IgPSBvdGFfYWNrX2NiOworCXBkZXYtPnR4X21nbXQuY2FsbGJhY2tzW3R5cGVdLmN0eHQgPSBjdHh0OworfQorCisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpCit2b2lkIGR1bXBfZnJhZ19kZXNjKGNoYXIgKm1zZywgc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYykKK3sKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAqZnJhZ19wdHJfaV9wOworCWludCAgICAgICAgICAgICAgICAgICAgIGk7CisKKwljZGZfcHJpbnQoIk9MIFRYIERlc2NyaXB0b3IgMHglcCBtc2R1X2lkICVkXG4iLAorCQkgdHhfZGVzYywgdHhfZGVzYy0+aW5kZXgpOworCWNkZl9wcmludCgiSFRUIFRYIERlc2NyaXB0b3IgdmFkZHI6IDB4JXAgcGFkZHI6IDB4JXhcbiIsCisJCSB0eF9kZXNjLT5odHRfdHhfZGVzYywgdHhfZGVzYy0+aHR0X3R4X2Rlc2NfcGFkZHIpOworCWNkZl9wcmludCgiJXMgJWQ6IEZyYWdtZW50IERlc2NyaXB0b3IgMHglcFxuIiwKKwkJIF9fZnVuY19fLCBfX0xJTkVfXywgdHhfZGVzYy0+aHR0X2ZyYWdfZGVzYyk7CisKKwkvKiBpdCBsb29rcyBmcm9tIGh0dF90eF9kZXNjX2ZyYWcoKSB0aGF0IHR4X2Rlc2MtPmh0dF9mcmFnX2Rlc2MKKwkgICBpcyBhbHJlYWR5IGRlLXJlZmVycmFibGUgKD0+IGluIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSkgKi8KKwlmcmFnX3B0cl9pX3AgPSB0eF9kZXNjLT5odHRfZnJhZ19kZXNjOworCisJLyogRHVtcCA2IHdvcmRzIG9mIFRTTyBmbGFncyAqLworCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJNTEUgRGVzYzpUU08gRmxhZ3M6ICAiLAorCQkgICAgICAgRFVNUF9QUkVGSVhfTk9ORSwgOCwgNCwKKwkJICAgICAgIGZyYWdfcHRyX2lfcCwgMjQsIHRydWUpOworCisJZnJhZ19wdHJfaV9wICs9IDY7IC8qIFNraXAgNiB3b3JkcyBvZiBUU08gZmxhZ3MgKi8KKworCWkgPSAwOworCXdoaWxlICgqZnJhZ19wdHJfaV9wKSB7CisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJNTEUgRGVzYzpGcmFnIFB0cjogICIsCisJCQkgICAgICAgRFVNUF9QUkVGSVhfTk9ORSwgOCwgNCwKKwkJCSAgICAgICBmcmFnX3B0cl9pX3AsIDgsIHRydWUpOworCQlpKys7CisJCWlmIChpID4gNSkgLyogbWF4IDYgdGltZXM6IGZyYWdfcHRyMCB0byBmcmFnX3B0cjUgKi8KKwkJCWJyZWFrOworCQllbHNlICAvKiBqdW1wIHRvIG5leHQgIHBvaW50ZXIgLSBza2lwIGxlbmd0aCAqLworCQkJZnJhZ19wdHJfaV9wICs9IDI7CisJfQorCXJldHVybjsKK30KKyNlbmRpZiAvKiBIRUxJVU1QTFVTX1BBRERSNjQgKi8KKworaW50CitvbF90eHJ4X21nbXRfc2VuZChvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJCSAgY2RmX25idWZfdCB0eF9tZ210X2ZybSwKKwkJICB1aW50OF90IHR5cGUsIHVpbnQ4X3QgdXNlXzZtYnBzLCB1aW50MTZfdCBjaGFuZnJlcSkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSB2ZGV2LT5wZGV2OworCXN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2M7CisJc3RydWN0IG9sX3R4cnhfbXNkdV9pbmZvX3QgdHhfbXNkdV9pbmZvOworCisJdHhfbXNkdV9pbmZvLnRzb19pbmZvLmlzX3RzbyA9IDA7CisKKwl0eF9tc2R1X2luZm8uaHR0LmFjdGlvbi51c2VfNm1icHMgPSB1c2VfNm1icHM7CisJdHhfbXNkdV9pbmZvLmh0dC5pbmZvLmV4dF90aWQgPSBIVFRfVFhfRVhUX1RJRF9NR01UOworCXR4X21zZHVfaW5mby5odHQuaW5mby52ZGV2X2lkID0gdmRldi0+dmRldl9pZDsKKwl0eF9tc2R1X2luZm8uaHR0LmFjdGlvbi5kb190eF9jb21wbGV0ZSA9CisJCXBkZXYtPnR4X21nbXQuY2FsbGJhY2tzW3R5cGVdLm90YV9hY2tfY2IgPyAxIDogMDsKKworCS8qCisJICogRklYIFRISVM6IGwyX2hkcl90eXBlIHNob3VsZCBvbmx5IHNwZWNpZnkgTDIgaGVhZGVyIHR5cGUKKwkgKiBUaGUgUGVyZWdyaW5lL1JvbWUgSFRUIGxheWVyIHByb3ZpZGVzIHRoZSBGVyB3aXRoIGEgInBrdCB0eXBlIgorCSAqIHRoYXQgaXMgYSBjb21iaW5hdGlvbiBvZiBMMiBoZWFkZXIgdHlwZSBhbmQgODAyLjExIGZyYW1lIHR5cGUuCisJICogSWYgdGhlIDgwMi4xMSBmcmFtZSB0eXBlIGlzICJtZ210IiwgdGhlbiB0aGUgSFRUIHBrdCB0eXBlIGlzICJtZ210Ii4KKwkgKiBCdXQgaWYgdGhlIDgwMi4xMSBmcmFtZSB0eXBlIGlzICJkYXRhIiwgdGhlbiB0aGUgSFRUIHBrdCB0eXBlIGlzCisJICogdGhlIEwyIGhlYWRlciB0eXBlIChtb3JlIG9yIGxlc3MpOiA4MDIuMyB2cy4gTmF0aXZlIFdpRmkKKwkgKiAoYmFzaWMgODAyLjExKS4KKwkgKiAoT3IgdGhlIGhlYWRlciB0eXBlIGNhbiBiZSAicmF3Iiwgd2hpY2ggaXMgYW55IHZlcnNpb24gb2YgdGhlIDgwMi4xMQorCSAqIGhlYWRlciwgYW5kIGFsc28gaW1wbGllcyB0aGF0IHNvbWUgb2YgdGhlIG9mZmxvYWRlZCB0eCBkYXRhCisJICogcHJvY2Vzc2luZyBzdGVwcyBtYXkgbm90IGFwcGx5LikKKwkgKiBGb3IgZWZmaWNpZW5jeSwgdGhlIFBlcmVncmluZS9Sb21lIEhUVCB1c2VzIHRoZSBtc2R1X2luZm8ncworCSAqIGwyX2hkcl90eXBlIGZpZWxkIHRvIHByb2dyYW0gdGhlIEhUVCBwa3QgdHlwZS4gIFRodXMsIHRoaXMgdHhyeCBTVworCSAqIG5lZWRzIHRvIG92ZXJsb2FkIHRoZSBsMl9oZHJfdHlwZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBmcmFtZSBpcworCSAqIGRhdGEgdnMuIG1nbXQsIGFzIHdlbGwgYXMgODAyLjMgTDIgaGVhZGVyIHZzLiA4MDIuMTEgTDIgaGVhZGVyLgorCSAqIFRvIGZpeCB0aGlzLCB0aGUgbXNkdV9pbmZvJ3MgbDJfaGRyX3R5cGUgc2hvdWxkIGJlIGxlZnQgc3BlY2lmeWluZworCSAqIGp1c3QgdGhlIEwyIGhlYWRlciB0eXBlLiAgRm9yIG1nbXQgZnJhbWVzLCB0aGVyZSBzaG91bGQgYmUgYQorCSAqIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIHBhdGNoIHRoZSBIVFQgcGt0IHR5cGUgdG8gc3RvcmUgYSAibWdtdCIgdmFsdWUKKwkgKiByYXRoZXIgdGhhbiB0aGUgTDIgaGVhZGVyIHR5cGUuICBUaGVuIHRoZSBIVFQgcGt0IHR5cGUgY2FuIGJlCisJICogcHJvZ3JhbW1lZCBlZmZpY2llbnRseSBmb3IgZGF0YSBmcmFtZXMsIGFuZCB0aGUgbXNkdV9pbmZvJ3MKKwkgKiBsMl9oZHJfdHlwZSBmaWVsZCB3b24ndCBiZSBjb25mdXNpbmdseSBvdmVybG9hZGVkIHRvIGhvbGQgdGhlIDgwMi4xMQorCSAqIGZyYW1lIHR5cGUgcmF0aGVyIHRoYW4gdGhlIEwyIGhlYWRlciB0eXBlLgorCSAqLworCS8qCisJICogRklYIFRISVM6IHJlbW92ZSBkdXBsaWNhdGlvbiBvZiBodHRfZnJtX3R5cGVfbWdtdCBhbmQKKwkgKiBodHRfcGt0X3R5cGVfbWdtdAorCSAqIFRoZSBodHQgbW9kdWxlIGV4cGVjdHMgYSAiZW51bSBodHRfcGt0X3R5cGUiIHZhbHVlLgorCSAqIFRoZSBodHRfZHhlIG1vZHVsZSBleHBlY3RzIGEgImVudW0gaHR0X2ZybV90eXBlIiB2YWx1ZS4KKwkgKiBUaGlzIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAsIHNvIGJvdGggdmVyc2lvbnMgb2YgaHR0IHVzZSBhCisJICogY29uc2lzdGVudCBtZXRob2Qgb2Ygc3BlY2lmeWluZyB0aGUgZnJhbWUgdHlwZS4KKwkgKi8KKyNpZmRlZiBRQ0FfU1VQUE9SVF9JTlRFR1JBVEVEX1NPQworCS8qIHR4IG1nbXQgZnJhbWVzIGFsd2F5cyBjb21lIHdpdGggYSA4MDIuMTEgaGVhZGVyICovCisJdHhfbXNkdV9pbmZvLmh0dC5pbmZvLmwyX2hkcl90eXBlID0gaHR0X3BrdF90eXBlX25hdGl2ZV93aWZpOworCXR4X21zZHVfaW5mby5odHQuaW5mby5mcmFtZV90eXBlID0gaHR0X2ZybV90eXBlX21nbXQ7CisjZWxzZQorCXR4X21zZHVfaW5mby5odHQuaW5mby5sMl9oZHJfdHlwZSA9IGh0dF9wa3RfdHlwZV9tZ210OworCXR4X21zZHVfaW5mby5odHQuaW5mby5mcmFtZV90eXBlID0gaHR0X3BrdF90eXBlX21nbXQ7CisjZW5kaWYKKworCXR4X21zZHVfaW5mby5wZWVyID0gTlVMTDsKKworCWNkZl9uYnVmX21hcF9zaW5nbGUocGRldi0+b3NkZXYsIHR4X21nbXRfZnJtLCBDREZfRE1BX1RPX0RFVklDRSk7CisJLyogRm9yIExMIHR4X2NvbXBfcmVxIGlzIG5vdCB1c2VkIHNvIGluaXRpYWxpemVkIHRvIDAgKi8KKwl0eF9tc2R1X2luZm8uaHR0LmFjdGlvbi50eF9jb21wX3JlcSA9IDA7CisJdHhfZGVzYyA9IG9sX3R4X2Rlc2NfbGwocGRldiwgdmRldiwgdHhfbWdtdF9mcm0sICZ0eF9tc2R1X2luZm8pOworCS8qIEZJWCBUSElTIC0KKwkgKiBUaGUgRlcgY3VycmVudGx5IGhhcyB0cm91YmxlIHVzaW5nIHRoZSBob3N0J3MgZnJhZ21lbnRzIHRhYmxlCisJICogZm9yIG1hbmFnZW1lbnQgZnJhbWVzLiAgVW50aWwgdGhpcyBpcyBmaXhlZCwgcmF0aGVyIHRoYW4KKwkgKiBzcGVjaWZ5aW5nIHRoZSBmcmFnbWVudCB0YWJsZSB0byB0aGUgRlcsIHNwZWNpZnkganVzdCB0aGUKKwkgKiBhZGRyZXNzIG9mIHRoZSBpbml0aWFsIGZyYWdtZW50LgorCSAqLworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorCS8qIGR1bXBfZnJhZ19kZXNjKCJvbF90eHJ4X21nbXRfc2VuZCgpOiBhZnRlciBvbF90eF9kZXNjX2xsIiwKKwkgICB0eF9kZXNjKTsgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkgKi8KKwlpZiAodHhfZGVzYykgeworCQkvKgorCQkgKiBGb2xsb3dpbmcgdGhlIGNhbGwgdG8gb2xfdHhfZGVzY19sbCwgZnJhZyAwIGlzIHRoZQorCQkgKiBIVFQgdHggSFcgZGVzY3JpcHRvciwgYW5kIHRoZSBmcmFtZSBwYXlsb2FkIGlzIGluCisJCSAqIGZyYWcgMS4KKwkJICovCisJCWh0dF90eF9kZXNjX2ZyYWdzX3RhYmxlX3NldCgKKwkJCXBkZXYtPmh0dF9wZGV2LAorCQkJdHhfZGVzYy0+aHR0X3R4X2Rlc2MsCisJCQljZGZfbmJ1Zl9nZXRfZnJhZ19wYWRkcl9sbyh0eF9tZ210X2ZybSwgMSksCisJCQkwLCAwKTsKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkgJiYgZGVmaW5lZChIRUxJVU1QTFVTX0RFQlVHKQorCQlkdW1wX2ZyYWdfZGVzYygKKwkJCSJhZnRlciBodHRfdHhfZGVzY19mcmFnc190YWJsZV9zZXQiLAorCQkJdHhfZGVzYyk7CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisJfQorCWlmICghdHhfZGVzYykgeworCQljZGZfbmJ1Zl91bm1hcF9zaW5nbGUocGRldi0+b3NkZXYsIHR4X21nbXRfZnJtLAorCQkJCSAgICAgIENERl9ETUFfVE9fREVWSUNFKTsKKwkJcmV0dXJuIC1FSU5WQUw7ICAgICAgIC8qIGNhbid0IGFjY2VwdCB0aGUgdHggbWdtdCBmcmFtZSAqLworCX0KKwlUWFJYX1NUQVRTX01TRFVfSU5DUihwZGV2LCB0eC5tZ210LCB0eF9tZ210X2ZybSk7CisJVFhSWF9BU1NFUlQxKHR5cGUgPCBPTF9UWFJYX01HTVRfTlVNX1RZUEVTKTsKKwl0eF9kZXNjLT5wa3RfdHlwZSA9IHR5cGUgKyBPTF9UWFJYX01HTVRfVFlQRV9CQVNFOworCisJaHR0X3R4X2Rlc2Nfc2V0X2NoYW5mcmVxKHR4X2Rlc2MtPmh0dF90eF9kZXNjLCBjaGFuZnJlcSk7CisJTkJVRl9TRVRfUEFDS0VUX1RSQUNLKHR4X2Rlc2MtPm5ldGJ1ZiwgTkJVRl9UWF9QS1RfTUdNVF9UUkFDSyk7CisJb2xfdHhfc2VuZF9ub25zdGQocGRldiwgdHhfZGVzYywgdHhfbWdtdF9mcm0sCisJCQkgIGh0dF9wa3RfdHlwZV9tZ210KTsKKworCXJldHVybiAwOyAgICAgICAgICAgICAgIC8qIGFjY2VwdGVkIHRoZSB0eCBtZ210IGZyYW1lICovCit9CisKK3ZvaWQgb2xfdHhyeF9zeW5jKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDhfdCBzeW5jX2NudCkKK3sKKwlodHRfaDJ0X3N5bmNfbXNnKHBkZXYtPmh0dF9wZGV2LCBzeW5jX2NudCk7Cit9CisKK2NkZl9uYnVmX3Qgb2xfdHhfcmVpbmplY3Qoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkJICBjZGZfbmJ1Zl90IG1zZHUsIHVpbnQxNl90IHBlZXJfaWQpCit7CisJc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYzsKKwlzdHJ1Y3Qgb2xfdHhyeF9tc2R1X2luZm9fdCBtc2R1X2luZm87CisKKwltc2R1X2luZm8uaHR0LmluZm8ubDJfaGRyX3R5cGUgPSB2ZGV2LT5wZGV2LT5odHRfcGt0X3R5cGU7CisJbXNkdV9pbmZvLmh0dC5pbmZvLmV4dF90aWQgPSBIVFRfVFhfRVhUX1RJRF9JTlZBTElEOworCW1zZHVfaW5mby5wZWVyID0gTlVMTDsKKwltc2R1X2luZm8uaHR0LmFjdGlvbi50eF9jb21wX3JlcSA9IDA7CisJbXNkdV9pbmZvLnRzb19pbmZvLmlzX3RzbyA9IDA7CisKKwlvbF90eF9wcmVwYXJlX2xsKHR4X2Rlc2MsIHZkZXYsIG1zZHUsICZtc2R1X2luZm8pOworCUhUVF9UWF9ERVNDX1BPU1RQT05FRF9TRVQoKigodWludDMyX3QgKikgKHR4X2Rlc2MtPmh0dF90eF9kZXNjKSksIHRydWUpOworCisJaHR0X3R4X2Rlc2Nfc2V0X3BlZXJfaWQodHhfZGVzYy0+aHR0X3R4X2Rlc2MsIHBlZXJfaWQpOworCisJb2xfdHhfc2VuZCh2ZGV2LT5wZGV2LCB0eF9kZXNjLCBtc2R1KTsKKworCXJldHVybiBOVUxMOworfQorCisjaWYgZGVmaW5lZChGRUFUVVJFX1RTTykKK3ZvaWQgb2xfdHNvX3NlZ19saXN0X2luaXQoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LCB1aW50MzJfdCBudW1fc2VnKQoreworCWludCBpOworCXBkZXYtPnRzb19zZWdfcG9vbC5wb29sX3NpemUgPSBudW1fc2VnOworCXBkZXYtPnRzb19zZWdfcG9vbC5udW1fZnJlZSA9IG51bV9zZWc7CisKKwlwZGV2LT50c29fc2VnX3Bvb2wuYXJyYXkgPSBOVUxMOworCXBkZXYtPnRzb19zZWdfcG9vbC5hcnJheSA9IGNkZl9tZW1fbWFsbG9jKG51bV9zZWcgKgorCQkgc2l6ZW9mKHN0cnVjdCBjZGZfdHNvX3NlZ19lbGVtX3QpKTsKKwlpZiAoIXBkZXYtPnRzb19zZWdfcG9vbC5hcnJheSkgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJICIlcyBDb3VsZCBub3QgYWxsb2NhdGUgVFNPIGFycmF5IVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcGRldi0+dHNvX3NlZ19wb29sLmZyZWVsaXN0ID0gJnBkZXYtPnRzb19zZWdfcG9vbC5hcnJheVswXTsKKworCWZvciAoaSA9IDA7IGkgPCAobnVtX3NlZyAtIDEpOyBpKyspCisJCXBkZXYtPnRzb19zZWdfcG9vbC5hcnJheVtpXS5uZXh0ID0KKwkJCSAmcGRldi0+dHNvX3NlZ19wb29sLmFycmF5W2kgKyAxXTsKKworCXBkZXYtPnRzb19zZWdfcG9vbC5hcnJheVtpXS5uZXh0ID0gTlVMTDsKKworCWNkZl9zcGlubG9ja19pbml0KCZwZGV2LT50c29fc2VnX3Bvb2wudHNvX211dGV4KTsKK30KKwordm9pZCBvbF90c29fc2VnX2xpc3RfZGVpbml0KHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwljZGZfc3Bpbl9sb2NrX2JoKCZwZGV2LT50c29fc2VnX3Bvb2wudHNvX211dGV4KTsKKwlpZiAocGRldi0+dHNvX3NlZ19wb29sLmFycmF5KSB7CisJCWNkZl9tZW1fZnJlZShwZGV2LT50c29fc2VnX3Bvb2wuYXJyYXkpOworCQlwZGV2LT50c29fc2VnX3Bvb2wuYXJyYXkgPSBOVUxMOworCX0KKworCXBkZXYtPnRzb19zZWdfcG9vbC5mcmVlbGlzdCA9IE5VTEw7CisJcGRldi0+dHNvX3NlZ19wb29sLm51bV9mcmVlID0gMDsKKwlwZGV2LT50c29fc2VnX3Bvb2wucG9vbF9zaXplID0gMDsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnRzb19zZWdfcG9vbC50c29fbXV0ZXgpOworCWNkZl9zcGlubG9ja19kZXN0cm95KCZwZGV2LT50c29fc2VnX3Bvb2wudHNvX211dGV4KTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1RTTyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC90eHJ4L29sX3R4LmggYi9jb3JlL2RwL3R4cngvb2xfdHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjRiYmZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L29sX3R4LmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBAZmlsZSBvbF90eC5oCisgKiBAYnJpZWYgSW50ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBoaWdoLWxldmVsIHR4IG1vZHVsZS4KKyAqLworI2lmbmRlZiBfT0xfVFhfX0hfCisjZGVmaW5lIF9PTF9UWF9fSF8KKworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90ICovCisjaW5jbHVkZSA8Y2RmX2xvY2suaD4KKyNpbmNsdWRlIDxvbF90eHJ4X2FwaS5oPiAgICAgICAgLyogb2xfdHhyeF92ZGV2X2hhbmRsZSAqLworCisjaW5jbHVkZSA8b2xfdHhyeF90eXBlcy5oPiAgICAgIC8qIG9sX3R4X2Rlc2NfdCwgb2xfdHhyeF9tc2R1X2luZm9fdCAqLworCitjZGZfbmJ1Zl90IG9sX3R4X2xsKG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgY2RmX25idWZfdCBtc2R1X2xpc3QpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorY2RmX25idWZfdCBvbF90eF9sbF9mYXN0KG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgY2RmX25idWZfdCBtc2R1X2xpc3QpOworI2VuZGlmCisKK2NkZl9uYnVmX3Qgb2xfdHhfbGxfcXVldWUob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCBjZGZfbmJ1Zl90IG1zZHVfbGlzdCk7CisKKyNpZmRlZiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTAorI2RlZmluZSBPTF9UWF9MTCBvbF90eF9sbF9xdWV1ZQorI2Vsc2UKKyNkZWZpbmUgT0xfVFhfTEwgb2xfdHhfbGwKKyNlbmRpZgorCisjaWZkZWYgUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wKK3ZvaWQgb2xfdHhfdmRldl9sbF9wYXVzZV9xdWV1ZV9zZW5kKHZvaWQgKmNvbnRleHQpOwordm9pZCBvbF90eF9wZGV2X2xsX3BhdXNlX3F1ZXVlX3NlbmRfYWxsKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9sX3R4X3ZkZXZfbGxfcGF1c2VfcXVldWVfc2VuZCh2b2lkICpjb250ZXh0KQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgb2xfdHhfcGRldl9sbF9wYXVzZV9xdWV1ZV9zZW5kX2FsbChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpCit7CisJcmV0dXJuOworfQorI2VuZGlmCitjZGZfbmJ1Zl90CitvbF90eF9ub25fc3RkX2xsKG9sX3R4cnhfdmRldl9oYW5kbGUgZGF0YV92ZGV2LAorCQkgZW51bSBvbF90eF9zcGVjIHR4X3NwZWMsIGNkZl9uYnVmX3QgbXNkdV9saXN0KTsKKworY2RmX25idWZfdAorb2xfdHhfcmVpbmplY3Qoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LCBjZGZfbmJ1Zl90IG1zZHUsIHVpbnQxNl90IHBlZXJfaWQpOworCit2b2lkIG9sX3R4cnhfbWdtdF90eF9jb21wbGV0ZSh2b2lkICpjdHh0LCBjZGZfbmJ1Zl90IG5ldGJ1ZiwgaW50IGVycik7CisKKworI2lmIGRlZmluZWQoRkVBVFVSRV9UU08pCit2b2lkIG9sX3Rzb19zZWdfbGlzdF9pbml0KHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwgdWludDMyX3QgbnVtX3NlZyk7Cit2b2lkIG9sX3Rzb19zZWdfbGlzdF9kZWluaXQoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KTsKKyNlbmRpZgorI2VuZGlmIC8qIF9PTF9UWF9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF90eF9kZXNjLmMgYi9jb3JlL2RwL3R4cngvb2xfdHhfZGVzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOTViOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfdHhfZGVzYy5jCkBAIC0wLDAgKzEsNjIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8Y2RmX25ldF90eXBlcy5oPiAgICAgIC8qIENERl9OQlVGX0VYRU1QVF9OT19FWEVNUFRJT04sIGV0Yy4gKi8KKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCwgZXRjLiAqLworI2luY2x1ZGUgPGNkZl91dGlsLmg+ICAgICAgICAgICAvKiBjZGZfYXNzZXJ0ICovCisjaW5jbHVkZSA8Y2RmX2xvY2suaD4gICAgICAgICAgIC8qIGNkZl9zcGlubG9jayAqLworI2lmZGVmIFFDQV9DT01QVVRFX1RYX0RFTEFZCisjaW5jbHVkZSA8Y2RmX3RpbWUuaD4gICAgICAgICAgIC8qIGNkZl9zeXN0ZW1fdGlja3MgKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8b2xfaHR0X3R4X2FwaS5oPiAgICAgIC8qIGh0dF90eF9kZXNjX2lkICovCisKKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+ICAgICAgLyogb2xfdHhyeF9wZGV2X3QgKi8KKyNpbmNsdWRlIDxvbF90eF9kZXNjLmg+CisjaW5jbHVkZSA8b2xfdHhyeF9pbnRlcm5hbC5oPgorI2lmZGVmIFFDQV9TVVBQT1JUX1NXX1RYUlhfRU5DQVAKKyNpbmNsdWRlIDxvbF90eHJ4X2VuY2FwLmg+ICAgICAgLyogT0xfVFhfUkVTVE9SRV9IRFIsIGV0YyAqLworI2VuZGlmCisjaW5jbHVkZSA8b2xfdHhyeC5oPgorCisjaWZkZWYgUUNBX1NVUFBPUlRfVFhERVNDX1NBTklUWV9DSEVDS1MKK2V4dGVybiB1aW50MzJfdCAqZ19kYmdfaHR0X2Rlc2NfZW5kX2FkZHIsICpnX2RiZ19odHRfZGVzY19zdGFydF9hZGRyOworI2VuZGlmCisKKyNpZmRlZiBRQ0FfU1VQUE9SVF9UWERFU0NfU0FOSVRZX0NIRUNLUworc3RhdGljIGlubGluZSB2b2lkIG9sX3R4X2Rlc2Nfc2FuaXR5X2NoZWNrcyhzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkJCXN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MpCit7CisJaWYgKHR4X2Rlc2MtPnBrdF90eXBlICE9IDB4ZmYpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJCQkgICAiJXMgUG90ZW50aWFsIHR4X2Rlc2MgY29ycnVwdGlvbiBwa3RfdHlwZToweCV4IHBkZXY6MHglcCIsCisJCQkJICAgX19mdW5jX18sIHR4X2Rlc2MtPnBrdF90eXBlLCBwZGV2KTsKKwkJY2RmX2Fzc2VydCgwKTsKKwl9CisJaWYgKCh1aW50MzJfdCAqKSB0eF9kZXNjLT5odHRfdHhfZGVzYyA8CisJCSAgICBnX2RiZ19odHRfZGVzY19zdGFydF9hZGRyCisJCSAgICB8fCAodWludDMyX3QgKikgdHhfZGVzYy0+aHR0X3R4X2Rlc2MgPgorCQkgICAgZ19kYmdfaHR0X2Rlc2NfZW5kX2FkZHIpIHsKKwkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkJICAgIiVzIFBvdGVudGlhbCBodHRfZGVzYyBjdXJydXB0aW9uOjB4JXAgcGRldjoweCVwXG4iLAorCQkJCSAgIF9fZnVuY19fLCB0eF9kZXNjLT5odHRfdHhfZGVzYywgcGRldik7CisJCQljZGZfYXNzZXJ0KDApOworCX0KK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBvbF90eF9kZXNjX3Jlc2V0X3BrdF90eXBlKHN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MpCit7CisJdHhfZGVzYy0+cGt0X3R5cGUgPSAweGZmOworfQorI2lmZGVmIFFDQV9DT01QVVRFX1RYX0RFTEFZCitzdGF0aWMgaW5saW5lIHZvaWQgb2xfdHhfZGVzY19jb21wdXRlX2RlbGF5KHN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MpCit7CisJaWYgKHR4X2Rlc2MtPmVudHJ5X3RpbWVzdGFtcF90aWNrcyAhPSAweGZmZmZmZmZmKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsICIlcyBUaW1lc3RhbXA6MHgleFxuIiwKKwkJCQkgICBfX2Z1bmNfXywgdHhfZGVzYy0+ZW50cnlfdGltZXN0YW1wX3RpY2tzKTsKKwkJY2RmX2Fzc2VydCgwKTsKKwl9CisJdHhfZGVzYy0+ZW50cnlfdGltZXN0YW1wX3RpY2tzID0gY2RmX3N5c3RlbV90aWNrcygpOworfQorc3RhdGljIGlubGluZSB2b2lkIG9sX3R4X2Rlc2NfcmVzZXRfdGltZXN0YW1wKHN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MpCit7CisJdHhfZGVzYy0+ZW50cnlfdGltZXN0YW1wX3RpY2tzID0gMHhmZmZmZmZmZjsKK30KKyNlbmRpZgorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbF90eF9kZXNjX3Nhbml0eV9jaGVja3Moc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJCQkJc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYykKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgb2xfdHhfZGVzY19yZXNldF9wa3RfdHlwZShzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjKQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBvbF90eF9kZXNjX2NvbXB1dGVfZGVsYXkoc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYykKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgb2xfdHhfZGVzY19yZXNldF90aW1lc3RhbXAoc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYykKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYKKworI2lmbmRlZiBRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyCisvKioKKyAqIG9sX3R4X2Rlc2NfYWxsb2MoKSAtIGFsbG9jYXRlIGRlc2NyaXB0b3IgZnJvbSBmcmVlbGlzdAorICogQHBkZXY6IHBkZXYgaGFuZGxlCisgKiBAdmRldjogdmRldiBoYW5kbGUKKyAqCisgKiBSZXR1cm46IHR4IGRlc2NyaXB0b3IgcG9pbnRlci8gTlVMTCBpbiBjYXNlIG9mIGVycm9yCisgKi8KK3N0YXRpYworc3RydWN0IG9sX3R4X2Rlc2NfdCAqb2xfdHhfZGVzY19hbGxvYyhzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkJCSAgICAgc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2KQoreworCXN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MgPSBOVUxMOworCisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+dHhfbXV0ZXgpOworCWlmIChwZGV2LT50eF9kZXNjLmZyZWVsaXN0KSB7CisJCXBkZXYtPnR4X2Rlc2MubnVtX2ZyZWUtLTsKKwkJdHhfZGVzYyA9ICZwZGV2LT50eF9kZXNjLmZyZWVsaXN0LT50eF9kZXNjOworCQlwZGV2LT50eF9kZXNjLmZyZWVsaXN0ID0gcGRldi0+dHhfZGVzYy5mcmVlbGlzdC0+bmV4dDsKKwkJb2xfdHhfZGVzY19zYW5pdHlfY2hlY2tzKHBkZXYsIHR4X2Rlc2MpOworCQlvbF90eF9kZXNjX2NvbXB1dGVfZGVsYXkodHhfZGVzYyk7CisKKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT50eF9tdXRleCk7CisJaWYgKCF0eF9kZXNjKQorCQlyZXR1cm4gTlVMTDsKKworI2lmIGRlZmluZWQoQ09ORklHX1BFUl9WREVWX1RYX0RFU0NfUE9PTCkKKwl0eF9kZXNjLT52ZGV2ID0gdmRldjsKKwljZGZfYXRvbWljX2luYygmdmRldi0+dHhfZGVzY19jb3VudCk7CisjZW5kaWYKKworCXJldHVybiB0eF9kZXNjOworfQorCisvKioKKyAqIG9sX3R4X2Rlc2NfYWxsb2Nfd3JhcHBlcigpIC1hbGxvY2F0ZSB0eCBkZXNjcmlwdG9yCisgKiBAcGRldjogcGRldiBoYW5kbGVyCisgKiBAdmRldjogdmRldiBoYW5kbGVyCisgKiBAbXNkdV9pbmZvOiBtc2R1IGhhbmRsZXIKKyAqCisgKiBSZXR1cm46IHR4IGRlc2NyaXB0b3Igb3IgTlVMTAorICovCitzdHJ1Y3Qgb2xfdHhfZGVzY190ICoKK29sX3R4X2Rlc2NfYWxsb2Nfd3JhcHBlcihzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkJIHN0cnVjdCBvbF90eHJ4X21zZHVfaW5mb190ICptc2R1X2luZm8pCit7CisJcmV0dXJuIG9sX3R4X2Rlc2NfYWxsb2MocGRldiwgdmRldik7Cit9CisKKyNlbHNlCisvKioKKyAqIG9sX3R4X2Rlc2NfYWxsb2MoKSAtYWxsb2NhdGUgdHggZGVzY3JpcHRvcgorICogQHBkZXY6IHBkZXYgaGFuZGxlcgorICogQHZkZXY6IHZkZXYgaGFuZGxlcgorICogQHBvb2w6IGZsb3cgcG9vbAorICoKKyAqIFJldHVybjogdHggZGVzY3JpcHRvciBvciBOVUxMCisgKi8KK3N0YXRpYworc3RydWN0IG9sX3R4X2Rlc2NfdCAqb2xfdHhfZGVzY19hbGxvYyhzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkJICAgICAgc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkJCSAgICAgIHN0cnVjdCBvbF90eF9mbG93X3Bvb2xfdCAqcG9vbCkKK3sKKwlzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjID0gTlVMTDsKKworCWlmIChwb29sKSB7CisJCWNkZl9zcGluX2xvY2tfYmgoJnBvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKwkJaWYgKHBvb2wtPmF2YWlsX2Rlc2MpIHsKKwkJCXR4X2Rlc2MgPSAmcG9vbC0+ZnJlZWxpc3QtPnR4X2Rlc2M7CisJCQlwb29sLT5mcmVlbGlzdCA9IHBvb2wtPmZyZWVsaXN0LT5uZXh0OworCQkJaWYgKGNkZl91bmxpa2VseSgtLXBvb2wtPmF2YWlsX2Rlc2MgPCBwb29sLT5zdG9wX3RoKSkgeworCQkJCXBvb2wtPnN0YXR1cyA9IEZMT1dfUE9PTF9BQ1RJVkVfUEFVU0VEOworCQkJCWNkZl9zcGluX3VubG9ja19iaCgmcG9vbC0+Zmxvd19wb29sX2xvY2spOworCQkJCS8qIHBhdXNlIG5ldHdvcmsgcXVldWVzICovCisJCQkJcGRldi0+cGF1c2VfY2IodmRldi0+dmRldl9pZCwKKwkJCQkJICAgICAgIFdMQU5fU1RPUF9BTExfTkVUSUZfUVVFVUUsCisJCQkJCSAgICAgICBXTEFOX0RBVEFfRkxPV19DT05UUk9MKTsKKwkJCX0gZWxzZSB7CisJCQkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwb29sLT5mbG93X3Bvb2xfbG9jayk7CisJCQl9CisJCQlvbF90eF9kZXNjX3Nhbml0eV9jaGVja3MocGRldiwgdHhfZGVzYyk7CisJCQlvbF90eF9kZXNjX2NvbXB1dGVfZGVsYXkodHhfZGVzYyk7CisJCX0gZWxzZSB7CisJCQljZGZfc3Bpbl91bmxvY2tfYmgoJnBvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKwkJCXBkZXYtPnBvb2xfc3RhdHMucGt0X2Ryb3Bfbm9fZGVzYysrOworCQl9CisJfSBlbHNlIHsKKwkJcGRldi0+cG9vbF9zdGF0cy5wa3RfZHJvcF9ub19wb29sKys7CisJfQorCisJcmV0dXJuIHR4X2Rlc2M7Cit9CisKKy8qKgorICogb2xfdHhfZGVzY19hbGxvY193cmFwcGVyKCkgLWFsbG9jYXRlIHR4IGRlc2NyaXB0b3IKKyAqIEBwZGV2OiBwZGV2IGhhbmRsZXIKKyAqIEB2ZGV2OiB2ZGV2IGhhbmRsZXIKKyAqIEBtc2R1X2luZm86IG1zZHUgaGFuZGxlcgorICoKKyAqIFJldHVybjogdHggZGVzY3JpcHRvciBvciBOVUxMCisgKi8KKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19HTE9CQUxfTUdNVF9QT09MCitzdHJ1Y3Qgb2xfdHhfZGVzY190ICoKK29sX3R4X2Rlc2NfYWxsb2Nfd3JhcHBlcihzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkJIHN0cnVjdCBvbF90eHJ4X21zZHVfaW5mb190ICptc2R1X2luZm8pCit7CisJaWYgKGNkZl91bmxpa2VseShtc2R1X2luZm8tPmh0dC5pbmZvLmZyYW1lX3R5cGUgPT0gaHR0X3BrdF90eXBlX21nbXQpKQorCQlyZXR1cm4gb2xfdHhfZGVzY19hbGxvYyhwZGV2LCB2ZGV2LCBwZGV2LT5tZ210X3Bvb2wpOworCWVsc2UKKwkJcmV0dXJuIG9sX3R4X2Rlc2NfYWxsb2MocGRldiwgdmRldiwgdmRldi0+cG9vbCk7Cit9CisjZWxzZQorc3RydWN0IG9sX3R4X2Rlc2NfdCAqCitvbF90eF9kZXNjX2FsbG9jX3dyYXBwZXIoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJIHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwKKwkJCSBzdHJ1Y3Qgb2xfdHhyeF9tc2R1X2luZm9fdCAqbXNkdV9pbmZvKQoreworCXJldHVybiBvbF90eF9kZXNjX2FsbG9jKHBkZXYsIHZkZXYsIHZkZXYtPnBvb2wpOworfQorI2VuZGlmCisjZW5kaWYKKworLyogVEJEOiBtYWtlIHRoaXMgaW5saW5lIGluIHRoZSAuaCBmaWxlPyAqLworc3RydWN0IG9sX3R4X2Rlc2NfdCAqb2xfdHhfZGVzY19maW5kKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJCQkgICAgIHVpbnQxNl90IHR4X2Rlc2NfaWQpCit7CisJcmV0dXJuICZwZGV2LT50eF9kZXNjLmFycmF5W3R4X2Rlc2NfaWRdLnR4X2Rlc2M7Cit9CisKKyNpZm5kZWYgUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMgorLyoqCisgKiBvbF90eF9kZXNjX2ZyZWUoKSAtIHB1dCBkZXNjcmlwdG9yIHRvIGZyZWVsaXN0CisgKiBAcGRldjogcGRldiBoYW5kbGUKKyAqIEB0eF9kZXNjOiB0eCBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgb2xfdHhfZGVzY19mcmVlKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwgc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYykKK3sKKwljZGZfc3Bpbl9sb2NrX2JoKCZwZGV2LT50eF9tdXRleCk7CisjaWYgZGVmaW5lZChGRUFUVVJFX1RTTykKKwlpZiAodHhfZGVzYy0+cGt0X3R5cGUgPT0gb2xfdHhfZnJtX3RzbykgeworCQlpZiAoY2RmX3VubGlrZWx5KHR4X2Rlc2MtPnRzb19kZXNjID09IE5VTEwpKQorCQkJY2RmX3ByaW50KCIlcyAlZCBUU08gZGVzYyBpcyBOVUxMIVxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJZWxzZQorCQkJb2xfdHNvX2ZyZWVfc2VnbWVudChwZGV2LCB0eF9kZXNjLT50c29fZGVzYyk7CisJfQorI2VuZGlmCisJb2xfdHhfZGVzY19yZXNldF9wa3RfdHlwZSh0eF9kZXNjKTsKKwlvbF90eF9kZXNjX3Jlc2V0X3RpbWVzdGFtcCh0eF9kZXNjKTsKKworCSgodW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCAqKXR4X2Rlc2MpLT5uZXh0ID0KKwkJcGRldi0+dHhfZGVzYy5mcmVlbGlzdDsKKwlwZGV2LT50eF9kZXNjLmZyZWVsaXN0ID0gKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKil0eF9kZXNjOworCXBkZXYtPnR4X2Rlc2MubnVtX2ZyZWUrKzsKKyNpZiBkZWZpbmVkKENPTkZJR19QRVJfVkRFVl9UWF9ERVNDX1BPT0wpCisjaWZkZWYgUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wKKwlpZiAoKGNkZl9hdG9taWNfcmVhZCgmdHhfZGVzYy0+dmRldi0+b3NfcV9wYXVzZWQpKSAmJgorCSAgICAoY2RmX2F0b21pY19yZWFkKCZ0eF9kZXNjLT52ZGV2LT50eF9kZXNjX2NvdW50KSA8CisJICAgICBUWFJYX0hMX1RYX0ZMT1dfQ1RSTF9WREVWX0xPV19XQVRFUl9NQVJLKSkgeworCQkvKiB3YWtldXAgbmV0aWZfcXVldWUgKi8KKwkJY2RmX2F0b21pY19zZXQoJnR4X2Rlc2MtPnZkZXYtPm9zX3FfcGF1c2VkLCAwKTsKKwkJb2xfdHhyeF9mbG93X2NvbnRyb2xfY2IodHhfZGVzYy0+dmRldiwgdHJ1ZSk7CisJfQorI2VuZGlmIC8qIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MICovCisJY2RmX2F0b21pY19kZWMoJnR4X2Rlc2MtPnZkZXYtPnR4X2Rlc2NfY291bnQpOworCXR4X2Rlc2MtPnZkZXYgPSBOVUxMOworI2VuZGlmCisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT50eF9tdXRleCk7Cit9CisKKyNlbHNlCisvKioKKyAqIG9sX3R4X2Rlc2NfZnJlZSgpIC0gcHV0IGRlc2NyaXB0b3IgdG8gcG9vbCBmcmVlbGlzdAorICogQHBkZXY6IHBkZXYgaGFuZGxlCisgKiBAdHhfZGVzYzogdHggZGVzY3JpcHRvcgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIG9sX3R4X2Rlc2NfZnJlZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsIHN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MpCit7CisJc3RydWN0IG9sX3R4X2Zsb3dfcG9vbF90ICpwb29sID0gdHhfZGVzYy0+cG9vbDsKKworI2lmIGRlZmluZWQoRkVBVFVSRV9UU08pCisJaWYgKHR4X2Rlc2MtPnBrdF90eXBlID09IG9sX3R4X2ZybV90c28pIHsKKwkJaWYgKGNkZl91bmxpa2VseSh0eF9kZXNjLT50c29fZGVzYyA9PSBOVUxMKSkKKwkJCWNkZl9wcmludCgiJXMgJWQgVFNPIGRlc2MgaXMgTlVMTCFcbiIsCisJCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWVsc2UKKwkJCW9sX3Rzb19mcmVlX3NlZ21lbnQocGRldiwgdHhfZGVzYy0+dHNvX2Rlc2MpOworCX0KKyNlbmRpZgorCW9sX3R4X2Rlc2NfcmVzZXRfcGt0X3R5cGUodHhfZGVzYyk7CisJb2xfdHhfZGVzY19yZXNldF90aW1lc3RhbXAodHhfZGVzYyk7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZwb29sLT5mbG93X3Bvb2xfbG9jayk7CisJKCh1bmlvbiBvbF90eF9kZXNjX2xpc3RfZWxlbV90ICopdHhfZGVzYyktPm5leHQgPQorCQkJCXBvb2wtPmZyZWVsaXN0OworCXBvb2wtPmZyZWVsaXN0ID0gKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKil0eF9kZXNjOworCXBvb2wtPmF2YWlsX2Rlc2MrKzsKKwlzd2l0Y2ggKHBvb2wtPnN0YXR1cykgeworCWNhc2UgRkxPV19QT09MX0FDVElWRV9QQVVTRUQ6CisJCWlmIChwb29sLT5hdmFpbF9kZXNjID4gcG9vbC0+c3RhcnRfdGgpIHsKKwkJCXBkZXYtPnBhdXNlX2NiKHBvb2wtPm1lbWJlcl9mbG93X2lkLAorCQkJCSAgICAgICBXTEFOX1dBS0VfQUxMX05FVElGX1FVRVVFLAorCQkJCSAgICAgICBXTEFOX0RBVEFfRkxPV19DT05UUk9MKTsKKwkJCXBvb2wtPnN0YXR1cyA9IEZMT1dfUE9PTF9BQ1RJVkVfVU5QQVVTRUQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBGTE9XX1BPT0xfSU5WQUxJRDoKKwkJaWYgKHBvb2wtPmF2YWlsX2Rlc2MgPT0gcG9vbC0+Zmxvd19wb29sX3NpemUpIHsKKwkJCWNkZl9zcGluX3VubG9ja19iaCgmcG9vbC0+Zmxvd19wb29sX2xvY2spOworCQkJb2xfdHhfZnJlZV9pbnZhbGlkX2Zsb3dfcG9vbChwb29sKTsKKwkJCWNkZl9wcmludCgiJXMgJWQgcG9vbCBpcyBJTlZBTElEIFN0YXRlISFcbiIsCisJCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBGTE9XX1BPT0xfQUNUSVZFX1VOUEFVU0VEOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQljZGZfcHJpbnQoIiVzICVkIHBvb2wgaXMgSU5BQ1RJVkUgU3RhdGUhIVxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJYnJlYWs7CisJfTsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKworfQorI2VuZGlmCisKK2V4dGVybiB2b2lkCitkdW1wX2ZyYWdfZGVzYyhjaGFyICptc2csIHN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MpOworCit2b2lkCitkdW1wX3BrdChjZGZfbmJ1Zl90IG5idWYsIHVpbnQzMl90IG5idWZfcGFkZHIsIGludCBsZW4pCit7CisJY2RmX3ByaW50KCIlczogUGt0OiBWQSAweCVwIFBBIDB4JXggbGVuICVkXG4iLCBfX2Z1bmNfXywKKwkJICBjZGZfbmJ1Zl9kYXRhKG5idWYpLCBuYnVmX3BhZGRyLCBsZW4pOworCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJQa3Q6ICAgIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDQsCisJCSAgICAgICBjZGZfbmJ1Zl9kYXRhKG5idWYpLCBsZW4sIHRydWUpOworfQorCitjb25zdCB1aW50MzJfdCBodHRfdG9fY2VfcGt0X3R5cGVbXSA9IHsKKwlbaHR0X3BrdF90eXBlX3Jhd10gPSB0eF9wa3RfdHlwZV9yYXcsCisJW2h0dF9wa3RfdHlwZV9uYXRpdmVfd2lmaV0gPSB0eF9wa3RfdHlwZV9uYXRpdmVfd2lmaSwKKwlbaHR0X3BrdF90eXBlX2V0aGVybmV0XSA9IHR4X3BrdF90eXBlXzgwMl8zLAorCVtodHRfcGt0X3R5cGVfbWdtdF0gPSB0eF9wa3RfdHlwZV9tZ210LAorCVtodHRfcGt0X3R5cGVfZXRoMl0gPSB0eF9wa3RfdHlwZV9ldGgyLAorCVtodHRfcGt0X251bV90eXBlc10gPSAweGZmZmZmZmZmCit9OworCitzdHJ1Y3Qgb2xfdHhfZGVzY190ICpvbF90eF9kZXNjX2xsKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJCQkgICBzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCQkJICAgY2RmX25idWZfdCBuZXRidWYsCisJCQkJICAgc3RydWN0IG9sX3R4cnhfbXNkdV9pbmZvX3QgKm1zZHVfaW5mbykKK3sKKwlzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjOworCXVuc2lnbmVkIGludCBpOworCXVpbnQzMl90IG51bV9mcmFnczsKKworCW1zZHVfaW5mby0+aHR0LmluZm8udmRldl9pZCA9IHZkZXYtPnZkZXZfaWQ7CisJbXNkdV9pbmZvLT5odHQuYWN0aW9uLmNrc3VtX29mZmxvYWQgPSBjZGZfbmJ1Zl9nZXRfdHhfY2tzdW0obmV0YnVmKTsKKwlzd2l0Y2ggKGNkZl9uYnVmX2dldF9leGVtcHRpb25fdHlwZShuZXRidWYpKSB7CisJY2FzZSBDREZfTkJVRl9FWEVNUFRfTk9fRVhFTVBUSU9OOgorCWNhc2UgQ0RGX05CVUZfRVhFTVBUX09OX0tFWV9NQVBQSU5HX0tFWV9VTkFWQUlMQUJMRToKKwkJLyogV2Ugd2FudCB0byBlbmNyeXB0IHRoaXMgZnJhbWUgKi8KKwkJbXNkdV9pbmZvLT5odHQuYWN0aW9uLmRvX2VuY3J5cHQgPSAxOworCQlicmVhazsKKwljYXNlIENERl9OQlVGX0VYRU1QVF9BTFdBWVM6CisJCS8qIFdlIGRvbid0IHdhbnQgdG8gZW5jcnlwdCB0aGlzIGZyYW1lICovCisJCW1zZHVfaW5mby0+aHR0LmFjdGlvbi5kb19lbmNyeXB0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2RmX2Fzc2VydCgwKTsKKwkJYnJlYWs7CisJfQorCisJLyogYWxsb2NhdGUgdGhlIGRlc2NyaXB0b3IgKi8KKwl0eF9kZXNjID0gb2xfdHhfZGVzY19hbGxvY193cmFwcGVyKHBkZXYsIHZkZXYsIG1zZHVfaW5mbyk7CisJaWYgKCF0eF9kZXNjKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGluaXRpYWxpemUgdGhlIFNXIHR4IGRlc2NyaXB0b3IgKi8KKwl0eF9kZXNjLT5uZXRidWYgPSBuZXRidWY7CisKKwlpZiAobXNkdV9pbmZvLT50c29faW5mby5pc190c28pIHsKKwkJdHhfZGVzYy0+dHNvX2Rlc2MgPSBtc2R1X2luZm8tPnRzb19pbmZvLmN1cnJfc2VnOworCQl0eF9kZXNjLT5wa3RfdHlwZSA9IG9sX3R4X2ZybV90c287CisJCVRYUlhfU1RBVFNfTVNEVV9JTkNSKHBkZXYsIHR4LnRzby50c29fcGt0cywgbmV0YnVmKTsKKwl9IGVsc2UgeworCQl0eF9kZXNjLT5wa3RfdHlwZSA9IG9sX3R4X2ZybV9zdGQ7CisJfQorCisJLyogaW5pdGlhbGl6ZSB0aGUgSFcgdHggZGVzY3JpcHRvciAqLworCisJaHR0X3R4X2Rlc2NfaW5pdChwZGV2LT5odHRfcGRldiwgdHhfZGVzYy0+aHR0X3R4X2Rlc2MsCisJCQkgdHhfZGVzYy0+aHR0X3R4X2Rlc2NfcGFkZHIsCisJCQkgb2xfdHhfZGVzY19pZChwZGV2LCB0eF9kZXNjKSwgbmV0YnVmLCAmbXNkdV9pbmZvLT5odHQsCisJCQkgJm1zZHVfaW5mby0+dHNvX2luZm8sCisJCQkgTlVMTCwgdmRldi0+b3Btb2RlID09IHdsYW5fb3BfbW9kZV9vY2IpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBmcmFnbWVudGF0aW9uIGRlc2NyaXB0b3IuCisJICogU2tpcCB0aGUgcHJlZml4IGZyYWdtZW50IChIVFQgdHggZGVzY3JpcHRvcikgdGhhdCB3YXMgYWRkZWQKKwkgKiBkdXJpbmcgdGhlIGNhbGwgdG8gaHR0X3R4X2Rlc2NfaW5pdCBhYm92ZS4KKwkgKi8KKwludW1fZnJhZ3MgPSBjZGZfbmJ1Zl9nZXRfbnVtX2ZyYWdzKG5ldGJ1Zik7CisJLyogbnVtX2ZyYWdzIGFyZSBleHBlY3RlZCB0byBiZSAyIG1heCAqLworCW51bV9mcmFncyA9IChudW1fZnJhZ3MgPiBDVkdfTkJVRl9NQVhfRVhUUkFfRlJBR1MpCisJCT8gQ1ZHX05CVUZfTUFYX0VYVFJBX0ZSQUdTCisJCTogbnVtX2ZyYWdzOworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorCS8qCisJICogVXNlIG51bV9mcmFncyAtIDEsIHNpbmNlIDEgZnJhZyBpcyB1c2VkIHRvIHN0b3JlCisJICogdGhlIEhUVC9IVEMgZGVzY3JpcHRvcgorCSAqIFJlZmVyIHRvIGh0dF90eF9kZXNjX2luaXQoKQorCSAqLworCWh0dF90eF9kZXNjX251bV9mcmFncyhwZGV2LT5odHRfcGRldiwgdHhfZGVzYy0+aHR0X2ZyYWdfZGVzYywKKwkJCSAgICAgIG51bV9mcmFncyAtIDEpOworI2Vsc2UgLyogISBkZWZpbmVkKEhFTElVTVBMVVNQQUREUjY0KSAqLworCWh0dF90eF9kZXNjX251bV9mcmFncyhwZGV2LT5odHRfcGRldiwgdHhfZGVzYy0+aHR0X3R4X2Rlc2MsCisJCQkgICAgICBudW1fZnJhZ3MgLSAxKTsKKyNlbmRpZiAvKiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkgKi8KKworCWlmIChtc2R1X2luZm8tPnRzb19pbmZvLmlzX3RzbykgeworCQlodHRfdHhfZGVzY19maWxsX3Rzb19pbmZvKHBkZXYtPmh0dF9wZGV2LAorCQkJIHR4X2Rlc2MtPmh0dF9mcmFnX2Rlc2MsICZtc2R1X2luZm8tPnRzb19pbmZvKTsKKwkJVFhSWF9TVEFUU19UU09fU0VHX1VQREFURShwZGV2LAorCQkJIG1zZHVfaW5mby0+dHNvX2luZm8uY3Vycl9zZWctPnNlZyk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMTsgaSA8IG51bV9mcmFnczsgaSsrKSB7CisJCQljZGZfc2l6ZV90IGZyYWdfbGVuOworCQkJdWludDMyX3QgZnJhZ19wYWRkcjsKKworCQkJZnJhZ19sZW4gPSBjZGZfbmJ1Zl9nZXRfZnJhZ19sZW4obmV0YnVmLCBpKTsKKwkJCWZyYWdfcGFkZHIgPSBjZGZfbmJ1Zl9nZXRfZnJhZ19wYWRkcl9sbyhuZXRidWYsIGkpOworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorCQkJaHR0X3R4X2Rlc2NfZnJhZyhwZGV2LT5odHRfcGRldiwgdHhfZGVzYy0+aHR0X2ZyYWdfZGVzYywgaSAtIDEsCisJCQkJIGZyYWdfcGFkZHIsIGZyYWdfbGVuKTsKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfREVCVUcpCisJCQljZGZfcHJpbnQoIiVzOiVkOiBodHRfZmRlc2M9JXAgZnJhZ19wYWRkcj0ldSBsZW49JXp1XG4iLAorCQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgdHhfZGVzYy0+aHR0X2ZyYWdfZGVzYywKKwkJCQkJICBmcmFnX3BhZGRyLCBmcmFnX2xlbik7CisJCQlkdW1wX3BrdChuZXRidWYsIGZyYWdfcGFkZHIsIDY0KTsKKyNlbmRpZiAvKiBIRUxJVU1QTFVTX0RFQlVHICovCisjZWxzZSAvKiAhIGRlZmluZWQoSEVMSVVNUExVU1BBRERSNjQpICovCisJCQlodHRfdHhfZGVzY19mcmFnKHBkZXYtPmh0dF9wZGV2LCB0eF9kZXNjLT5odHRfdHhfZGVzYywgaSAtIDEsCisJCQkJCQkJIGZyYWdfcGFkZHIsIGZyYWdfbGVuKTsKKyNlbmRpZiAvKiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkgKi8KKwkJfQorCX0KKworI2lmIGRlZmluZWQoSEVMSVVNUExVU19ERUJVRykKKwlkdW1wX2ZyYWdfZGVzYygib2xfdHhfZGVzY19sbCgpIiwgdHhfZGVzYyk7CisjZW5kaWYKKwlyZXR1cm4gdHhfZGVzYzsKK30KKwordm9pZCBvbF90eF9kZXNjX2ZyYW1lX2xpc3RfZnJlZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkJb2xfdHhfZGVzY19saXN0ICp0eF9kZXNjcywgaW50IGhhZF9lcnJvcikKK3sKKwlzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjLCAqdG1wOworCWNkZl9uYnVmX3QgbXNkdXMgPSBOVUxMOworCisJVEFJTFFfRk9SRUFDSF9TQUZFKHR4X2Rlc2MsIHR4X2Rlc2NzLCB0eF9kZXNjX2xpc3RfZWxlbSwgdG1wKSB7CisJCWNkZl9uYnVmX3QgbXNkdSA9IHR4X2Rlc2MtPm5ldGJ1ZjsKKworCQljZGZfYXRvbWljX2luaXQoJnR4X2Rlc2MtPnJlZl9jbnQpOyAgIC8qIGNsZWFyIHRoZSByZWYgY250ICovCisjaWZkZWYgUUNBX1NVUFBPUlRfU1dfVFhSWF9FTkNBUAorCQkvKiByZXN0b3JlIG9yaWdpbmFsIGhkciBvZmZzZXQgKi8KKwkJT0xfVFhfUkVTVE9SRV9IRFIodHhfZGVzYywgbXNkdSk7CisjZW5kaWYKKwkJY2RmX25idWZfdW5tYXAocGRldi0+b3NkZXYsIG1zZHUsIENERl9ETUFfVE9fREVWSUNFKTsKKwkJLyogZnJlZSB0aGUgdHggZGVzYyAqLworCQlvbF90eF9kZXNjX2ZyZWUocGRldiwgdHhfZGVzYyk7CisJCS8qIGxpbmsgdGhlIG5ldGJ1ZiBpbnRvIGEgbGlzdCB0byBmcmVlIGFzIGEgYmF0Y2ggKi8KKwkJY2RmX25idWZfc2V0X25leHQobXNkdSwgbXNkdXMpOworCQltc2R1cyA9IG1zZHU7CisJfQorCS8qIGZyZWUgdGhlIG5ldGJ1ZnMgYXMgYSBiYXRjaCAqLworCWNkZl9uYnVmX3R4X2ZyZWUobXNkdXMsIGhhZF9lcnJvcik7Cit9CisKK3ZvaWQgb2xfdHhfZGVzY19mcmFtZV9mcmVlX25vbnN0ZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkJICBzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjLCBpbnQgaGFkX2Vycm9yKQoreworCWludCBtZ210X3R5cGU7CisJb2xfdHhyeF9tZ210X3R4X2NiIG90YV9hY2tfY2I7CisJY2hhciAqdHJhY2Vfc3RyOworCisJY2RmX2F0b21pY19pbml0KCZ0eF9kZXNjLT5yZWZfY250KTsgICAgIC8qIGNsZWFyIHRoZSByZWYgY250ICovCisjaWZkZWYgUUNBX1NVUFBPUlRfU1dfVFhSWF9FTkNBUAorCS8qIHJlc3RvcmUgb3JpZ2luYWwgaGRyIG9mZnNldCAqLworCU9MX1RYX1JFU1RPUkVfSERSKHR4X2Rlc2MsICh0eF9kZXNjLT5uZXRidWYpKTsKKyNlbmRpZgorCXRyYWNlX3N0ciA9IChoYWRfZXJyb3IpID8gIk9UOkM6RjoiIDogIk9UOkM6UzoiOworCWNkZl9uYnVmX3RyYWNlX3VwZGF0ZSh0eF9kZXNjLT5uZXRidWYsIHRyYWNlX3N0cik7CisJaWYgKHR4X2Rlc2MtPnBrdF90eXBlID09IG9sX3R4X2ZybV9ub19mcmVlKSB7CisJCS8qIGZyZWUgdGhlIHR4IGRlc2MgYnV0IGRvbid0IHVubWFwIG9yIGZyZWUgdGhlIGZyYW1lICovCisJCWlmIChwZGV2LT50eF9kYXRhX2NhbGxiYWNrLmZ1bmMpIHsKKwkJCWNkZl9uYnVmX3NldF9uZXh0KHR4X2Rlc2MtPm5ldGJ1ZiwgTlVMTCk7CisJCQlwZGV2LT50eF9kYXRhX2NhbGxiYWNrLmZ1bmMocGRldi0+dHhfZGF0YV9jYWxsYmFjay5jdHh0LAorCQkJCQkJICAgIHR4X2Rlc2MtPm5ldGJ1ZiwgaGFkX2Vycm9yKTsKKwkJCW9sX3R4X2Rlc2NfZnJlZShwZGV2LCB0eF9kZXNjKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBsZXQgdGhlIGNvZGUgYmVsb3cgdW5tYXAgYW5kIGZyZWUgdGhlIGZyYW1lICovCisJfQorCWNkZl9uYnVmX3VubWFwKHBkZXYtPm9zZGV2LCB0eF9kZXNjLT5uZXRidWYsIENERl9ETUFfVE9fREVWSUNFKTsKKwkvKiBjaGVjayB0aGUgZnJhbWUgdHlwZSB0byBzZWUgd2hhdCBraW5kIG9mIHNwZWNpYWwgc3RlcHMgYXJlIG5lZWRlZCAqLworCWlmICgodHhfZGVzYy0+cGt0X3R5cGUgPj0gT0xfVFhSWF9NR01UX1RZUEVfQkFTRSkgJiYKKwkJICAgKHR4X2Rlc2MtPnBrdF90eXBlICE9IDB4ZmYpKSB7CisJCXVpbnQzMl90IGZyYWdfZGVzY19wYWRkcl9sbyA9IDA7CisKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkKKwkJZnJhZ19kZXNjX3BhZGRyX2xvID0gdHhfZGVzYy0+aHR0X2ZyYWdfZGVzY19wYWRkcjsKKwkJLyogRklYIFRISVMgLQorCQkgKiBUaGUgRlcgY3VycmVudGx5IGhhcyB0cm91YmxlIHVzaW5nIHRoZSBob3N0J3MgZnJhZ21lbnRzCisJCSAqIHRhYmxlIGZvciBtYW5hZ2VtZW50IGZyYW1lcy4gIFVudGlsIHRoaXMgaXMgZml4ZWQsCisJCSAqIHJhdGhlciB0aGFuIHNwZWNpZnlpbmcgdGhlIGZyYWdtZW50IHRhYmxlIHRvIHRoZSBGVywKKwkJICogdGhlIGhvc3QgU1cgd2lsbCBzcGVjaWZ5IGp1c3QgdGhlIGFkZHJlc3Mgb2YgdGhlIGluaXRpYWwKKwkJICogZnJhZ21lbnQuCisJCSAqIE5vdyB0aGF0IHRoZSBtZ210IGZyYW1lIGlzIGRvbmUsIHRoZSBIVFQgdHggZGVzYydzIGZyYWdzCisJCSAqIHRhYmxlIHBvaW50ZXIgbmVlZHMgdG8gYmUgcmVzZXQuCisJCSAqLworI2lmIGRlZmluZWQoSEVMSVVNUExVU19ERUJVRykKKwkJY2RmX3ByaW50KCIlcyAlZDogRnJhZyBEZXNjcmlwdG9yIFJlc2V0IFslZF0gdG8gMHgleFxuIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCB0eF9kZXNjLT5pbmRleCwKKwkJCSAgZnJhZ19kZXNjX3BhZGRyX2xvKTsKKyNlbmRpZiAvKiBIRUxJVU1QTFVTX0RFQlVHICovCisjZW5kaWYgLyogSEVMSVVNUExVU19QQUREUjY0ICovCisJCWh0dF90eF9kZXNjX2ZyYWdzX3RhYmxlX3NldChwZGV2LT5odHRfcGRldiwKKwkJCQkJICAgIHR4X2Rlc2MtPmh0dF90eF9kZXNjLCAwLAorCQkJCQkgICAgZnJhZ19kZXNjX3BhZGRyX2xvLCAxKTsKKworCQltZ210X3R5cGUgPSB0eF9kZXNjLT5wa3RfdHlwZSAtIE9MX1RYUlhfTUdNVF9UWVBFX0JBU0U7CisJCS8qCisJCSAqICB3ZSBhbHJlYWR5IGNoZWNrZWQgdGhlIHZhbHVlIHdoZW4gdGhlIG1nbXQgZnJhbWUgd2FzCisJCSAqICBwcm92aWRlZCB0byB0aGUgdHhyeCBsYXllci4KKwkJICogIG5vIG5lZWQgdG8gY2hlY2sgaXQgYSAybmQgdGltZS4KKwkJICovCisJCW90YV9hY2tfY2IgPSBwZGV2LT50eF9tZ210LmNhbGxiYWNrc1ttZ210X3R5cGVdLm90YV9hY2tfY2I7CisJCWlmIChvdGFfYWNrX2NiKSB7CisJCQl2b2lkICpjdHh0OworCQkJY3R4dCA9IHBkZXYtPnR4X21nbXQuY2FsbGJhY2tzW21nbXRfdHlwZV0uY3R4dDsKKwkJCW90YV9hY2tfY2IoY3R4dCwgdHhfZGVzYy0+bmV0YnVmLCBoYWRfZXJyb3IpOworCQl9CisJCS8qIGZyZWUgdGhlIG5ldGJ1ZiAqLworCQljZGZfbmJ1Zl9mcmVlKHR4X2Rlc2MtPm5ldGJ1Zik7CisJfSBlbHNlIHsKKwkJLyogc2luZ2xlIHJlZ3VsYXIgZnJhbWUgKi8KKwkJY2RmX25idWZfc2V0X25leHQodHhfZGVzYy0+bmV0YnVmLCBOVUxMKTsKKwkJY2RmX25idWZfdHhfZnJlZSh0eF9kZXNjLT5uZXRidWYsIGhhZF9lcnJvcik7CisJfQorCS8qIGZyZWUgdGhlIHR4IGRlc2MgKi8KKwlvbF90eF9kZXNjX2ZyZWUocGRldiwgdHhfZGVzYyk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfVFNPKQorLyoqCisgKiBodHRfdHNvX2FsbG9jX3NlZ21lbnQoKSAtIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGEgVFNPIHNlZ21lbnQKKyAqIGVsZW1lbnQKKyAqIEBwZGV2OiAgIEhUVCBwZGV2CisgKiBAdHNvX3NlZzogICAgVGhpcyBpcyB0aGUgb3V0cHV0LiBUaGUgVFNPIHNlZ21lbnQgZWxlbWVudC4KKyAqCisgKiBBbGxvY2F0ZXMgYSBUU08gc2VnbWVudCBlbGVtZW50IGZyb20gdGhlIGZyZWUgbGlzdCBoZWxkIGluCisgKiB0aGUgSFRUIHBkZXYKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RydWN0IGNkZl90c29fc2VnX2VsZW1fdCAqb2xfdHNvX2FsbG9jX3NlZ21lbnQoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCXN0cnVjdCBjZGZfdHNvX3NlZ19lbGVtX3QgKnRzb19zZWcgPSBOVUxMOworCisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+dHNvX3NlZ19wb29sLnRzb19tdXRleCk7CisJaWYgKHBkZXYtPnRzb19zZWdfcG9vbC5mcmVlbGlzdCkgeworCQlwZGV2LT50c29fc2VnX3Bvb2wubnVtX2ZyZWUtLTsKKwkJdHNvX3NlZyA9IHBkZXYtPnRzb19zZWdfcG9vbC5mcmVlbGlzdDsKKwkJcGRldi0+dHNvX3NlZ19wb29sLmZyZWVsaXN0ID0gcGRldi0+dHNvX3NlZ19wb29sLmZyZWVsaXN0LT5uZXh0OworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnRzb19zZWdfcG9vbC50c29fbXV0ZXgpOworCWlmICghdHNvX3NlZykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdHNvX3NlZzsKK30KKworLyoqCisgKiBvbF90c29fZnJlZV9zZWdtZW50KCkgLSBmdW5jdGlvbiB0byBmcmVlIGEgVFNPIHNlZ21lbnQKKyAqIGVsZW1lbnQKKyAqIEBwZGV2OiAgIEhUVCBwZGV2CisgKiBAdHNvX3NlZzogVGhlIFRTTyBzZWdtZW50IGVsZW1lbnQgdG8gYmUgZnJlZWQKKyAqCisgKiBSZXR1cm5zIGEgVFNPIHNlZ21lbnQgZWxlbWVudCB0byB0aGUgZnJlZSBsaXN0IGhlbGQgaW4gdGhlCisgKiBIVFQgcGRldgorICoKKyAqIFJldHVybjogbm9uZQorICovCisKK3ZvaWQgb2xfdHNvX2ZyZWVfc2VnbWVudChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJIHN0cnVjdCBjZGZfdHNvX3NlZ19lbGVtX3QgKnRzb19zZWcpCit7CisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+dHNvX3NlZ19wb29sLnRzb19tdXRleCk7CisJdHNvX3NlZy0+bmV4dCA9IHBkZXYtPnRzb19zZWdfcG9vbC5mcmVlbGlzdDsKKwlwZGV2LT50c29fc2VnX3Bvb2wuZnJlZWxpc3QgPSB0c29fc2VnOworCXBkZXYtPnRzb19zZWdfcG9vbC5udW1fZnJlZSsrOworCWNkZl9zcGluX3VubG9ja19iaCgmcGRldi0+dHNvX3NlZ19wb29sLnRzb19tdXRleCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF90eF9kZXNjLmggYi9jb3JlL2RwL3R4cngvb2xfdHhfZGVzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTRjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfdHhfZGVzYy5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBAZmlsZSBvbF90eF9kZXNjLmgKKyAqIEBicmllZiBBUEkgZGVmaW5pdGlvbnMgZm9yIHRoZSB0eCBkZXNjcmlwdG9yIG1vZHVsZSB3aXRoaW4gdGhlIGRhdGEgU1cuCisgKi8KKyNpZm5kZWYgX09MX1RYX0RFU0NfX0hfCisjZGVmaW5lIF9PTF9UWF9ERVNDX19IXworCisjaW5jbHVkZSA8Y2RzX3F1ZXVlLmg+ICAgICAgICAgIC8qIFRBSUxRX0hFQUQgKi8KKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCAqLworI2luY2x1ZGUgPG9sX3R4cnhfdHlwZXMuaD4gICAgICAvKiBvbF90eF9kZXNjX3QgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2ludGVybmFsLmg+ICAgLypUWFJYX0FTU0VSVDIgKi8KKworc3RydWN0IG9sX3R4X2Rlc2NfdCAqCitvbF90eF9kZXNjX2FsbG9jX3dyYXBwZXIoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJIHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwKKwkJCSBzdHJ1Y3Qgb2xfdHhyeF9tc2R1X2luZm9fdCAqbXNkdV9pbmZvKTsKKworCisvKioKKyAqIEBicmllZiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHR4IGRlc2NyaXB0b3IgZm9yIGEgTEwgc3lzdGVtLgorICogQGRldGFpbHMKKyAqICBBbGxvY2F0ZSBhIHR4IGRlc2NyaXB0b3IgcGFpciBmb3IgYSBuZXcgdHggZnJhbWUgLSBhIFNXIHR4IGRlc2NyaXB0b3IKKyAqICBmb3IgcHJpdmF0ZSB1c2Ugd2l0aGluIHRoZSBob3N0IGRhdGEgU1csIGFuZCBhIEhUVCB0eCBkZXNjcmlwdG9yIGZvcgorICogIGRvd25sb2FkaW5nIHR4IG1ldGEtZGF0YSB0byB0aGUgdGFyZ2V0IEZXL0hXLgorICogIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGlzIHBhaXIgb2YgdHggZGVzY3JpcHRvcnMgYmFzZWQgb24gdGhlCisgKiAgaW5mb3JtYXRpb24gaW4gdGhlIG5ldGJ1Zi4KKyAqICBGb3IgTEwsIHRoaXMgaW5jbHVkZXMgZmlsbGluZyBpbiBhIGZyYWdtZW50YXRpb24gZGVzY3JpcHRvciB0bworICogIHNwZWNpZnkgdG8gdGhlIE1BQyBIVyB3aGVyZSB0byBmaW5kIHRoZSB0eCBmcmFtZSdzIGZyYWdtZW50cy4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBkYXRhIHBoeXNpY2FsIGRldmljZSBzZW5kaW5nIHRoZSBkYXRhCisgKiAgICAgIChmb3IgYWNjZXNzaW5nIHRoZSB0eCBkZXNjIHBvb2wpCisgKiBAcGFyYW0gdmRldiAtIHRoZSB2aXJ0dWFsIGRldmljZSBzZW5kaW5nIHRoZSBkYXRhCisgKiAgICAgIChmb3Igc3BlY2lmeWluZyB0aGUgdHJhbnNtaXR0ZXIgYWRkcmVzcyBmb3IgbXVsdGljYXN0IC8gYnJvYWRjYXN0IGRhdGEpCisgKiBAcGFyYW0gbmV0YnVmIC0gdGhlIHR4IGZyYW1lCisgKiBAcGFyYW0gbXNkdV9pbmZvIC0gdHggbWV0YS1kYXRhCisgKi8KK3N0cnVjdCBvbF90eF9kZXNjX3QgKm9sX3R4X2Rlc2NfbGwoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJCSAgIHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwKKwkJCQkgICBjZGZfbmJ1Zl90IG5ldGJ1ZiwKKwkJCQkgICBzdHJ1Y3Qgb2xfdHhyeF9tc2R1X2luZm9fdCAqbXNkdV9pbmZvKTsKKworLyoqCisgKiBAYnJpZWYgVXNlIGEgdHggZGVzY3JpcHRvciBJRCB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGRlc3JpcHRvciBvYmplY3QuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZGF0YSBwaHlzaWNhbCBkZXZpY2Ugc2VuZGluZyB0aGUgZGF0YQorICogQHBhcmFtIHR4X2Rlc2NfaWQgLSB0aGUgSUQgb2YgdGhlIGRlc2NyaXB0b3IgaW4gcXVlc3Rpb24KKyAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3Igb2JqZWN0IHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgSUQKKyAqLworc3RydWN0IG9sX3R4X2Rlc2NfdCAqb2xfdHhfZGVzY19maW5kKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJCQkgICAgIHVpbnQxNl90IHR4X2Rlc2NfaWQpOworCisvKioKKyAqIEBicmllZiBGcmVlIGEgbGlzdCBvZiB0eCBkZXNjcmlwdG9ycyBhbmQgdGhlIHR4IGZyYW1lcyB0aGV5IHJlZmVyIHRvLgorICogQGRldGFpbHMKKyAqICBGcmVlIGEgYmF0Y2ggb2YgInN0YW5kYXJkIiB0eCBkZXNjcmlwdG9ycyBhbmQgdGhlaXIgdHggZnJhbWVzLgorICogIEZyZWUgZWFjaCB0eCBkZXNjcmlwdG9yLCBieSByZXR1cm5pbmcgaXQgdG8gdGhlIGZyZWVsaXN0LgorICogIFVubWFwIGVhY2ggbmV0YnVmLCBhbmQgZnJlZSB0aGUgbmV0YnVmcyBhcyBhIGJhdGNoLgorICogIElycmVndWxhciB0eCBmcmFtZXMgbGlrZSBUU08gb3IgbWFuYWdtZW50IGZyYW1lcyB0aGF0IHJlcXVpcmUKKyAqICBzcGVjaWFsIGhhbmRsaW5nIGFyZSBwcm9jZXNzZWQgYnkgdGhlIG9sX3R4X2Rlc2NfZnJhbWVfZnJlZV9ub25zdGQKKyAqICBmdW5jdGlvbiByYXRoZXIgdGhhbiB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIGRhdGEgcGh5c2ljYWwgZGV2aWNlIHRoYXQgc2VudCB0aGUgZGF0YQorICogQHBhcmFtIHR4X2Rlc2NzIC0gYSBsaXN0IG9mIFNXIHR4IGRlc2NyaXB0b3JzIGZvciB0aGUgdHggZnJhbWVzCisgKiBAcGFyYW0gaGFkX2Vycm9yIC0gYm9vbCBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhlIHRyYW5zbWlzc2lvbiBmYWlsZWQuCisgKiAgICAgICAgICAgIFRoaXMgaXMgcHJvdmlkZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXQgZ2V0IG5vdGlmaWVkIG9mCisgKiAgICAgICAgICAgIHRoZSB0eCBmcmFtZSBjb21wbGV0aW9uLgorICovCit2b2lkIG9sX3R4X2Rlc2NfZnJhbWVfbGlzdF9mcmVlKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJCQlvbF90eF9kZXNjX2xpc3QgKnR4X2Rlc2NzLCBpbnQgaGFkX2Vycm9yKTsKKworLyoqCisgKiBAYnJpZWYgRnJlZSBhIG5vbi1zdGFuZGFyZCB0eCBmcmFtZSBhbmQgaXRzIHR4IGRlc2NyaXB0b3IuCisgKiBAZGV0YWlscworICogIENoZWNrIHRoZSB0eCBmcmFtZSB0eXBlIChlLmcuIFRTTyB2cy4gbWFuYWdlbWVudCkgdG8gZGV0ZXJtaW5lIHdoYXQKKyAqICBzcGVjaWFsIHN0ZXBzLCBpZiBhbnksIG5lZWQgdG8gYmUgcGVyZm9ybWVkIHByaW9yIHRvIGZyZWVpbmcgdGhlCisgKiAgdHggZnJhbWUgYW5kIGl0cyB0eCBkZXNjcmlwdG9yLgorICogIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gYmUgdXNlZCB0byBmcmVlIHNpbmdsZSBzdGFuZGFyZCB0eCBmcmFtZXMuCisgKiAgQWZ0ZXIgcGVyZm9ybWluZyBhbnkgc3BlY2lhbCBzdGVwcyBiYXNlZCBvbiB0eCBmcmFtZSB0eXBlLCBmcmVlIHRoZQorICogIHR4IGRlc2NyaXB0b3IsIGkuZS4gcmV0dXJuIGl0IHRvIHRoZSBmcmVlbGlzdCwgYW5kIHVubWFwIGFuZAorICogIGZyZWUgdGhlIG5ldGJ1ZiByZWZlcmVuY2VkIGJ5IHRoZSB0eCBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIGRhdGEgcGh5c2ljYWwgZGV2aWNlIHRoYXQgc2VudCB0aGUgZGF0YQorICogQHBhcmFtIHR4X2Rlc2MgLSB0aGUgU1cgdHggZGVzY3JpcHRvciBmb3IgdGhlIHR4IGZyYW1lIHRoYXQgd2FzIHNlbnQKKyAqIEBwYXJhbSBoYWRfZXJyb3IgLSBib29sIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGUgdHJhbnNtaXNzaW9uIGZhaWxlZC4KKyAqICAgICAgICAgICAgVGhpcyBpcyBwcm92aWRlZCB0byBjYWxsYmFjayBmdW5jdGlvbnMgdGhhdCBnZXQgbm90aWZpZWQgb2YKKyAqICAgICAgICAgICAgdGhlIHR4IGZyYW1lIGNvbXBsZXRpb24uCisgKi8KK3ZvaWQgb2xfdHhfZGVzY19mcmFtZV9mcmVlX25vbnN0ZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkJICBzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjLCBpbnQgaGFkX2Vycm9yKTsKKworLyoKKyAqIEBicmllZiBEZXRlcm1pbmUgdGhlIElEIG9mIGEgdHggZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gcGRldiAtIHRoZSBwaHlzaWNhbCBkZXZpY2UgdGhhdCBpcyBzZW5kaW5nIHRoZSBkYXRhCisgKiBAcGFyYW0gdHhfZGVzYyAtIHRoZSBkZXNjcmlwdG9yIHdob3NlIElEIGlzIGJlaW5nIGRldGVybWluZWQKKyAqIEByZXR1cm4gbnVtZXJpYyBJRCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHR4IGRlc2NyaXB0b3IKKyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdAorb2xfdHhfZGVzY19pZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsIHN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MpCit7CisJVFhSWF9BU1NFUlQyKCgodW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCAqKXR4X2Rlc2MgLQorCQkgICAgICBwZGV2LT50eF9kZXNjLmFycmF5KSA8IHBkZXYtPnR4X2Rlc2MucG9vbF9zaXplKTsKKwlyZXR1cm4gKHVpbnQxNl90KQorCSAgICAgICAoKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKil0eF9kZXNjIC0gcGRldi0+dHhfZGVzYy5hcnJheSk7Cit9CisKKy8qCisgKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBiZWFjb24gaGVhZHIgZm9yIHRoZSB2ZGV2CisgKiBAcGFyYW0gcGRldiAtIG9wYXF1ZSBwb2ludGUgdG8gc2NuCisgKiBAcGFyYW0gdmRldmlkIC0gdmRldiBpZAorICogQHJldHVybiB2b2lkIHBvaW50ZXIgdG8gdGhlIGJlYWNvbiBoZWFkZXIgZm9yIHRoZSBnaXZlbiB2ZGV2CisgKi8KKwordm9pZCAqb2xfYXRoX2dldF9iY25faGVhZGVyKG9sX3BkZXZfaGFuZGxlIHBkZXYsIEFfVUlOVDMyIHZkZXZfaWQpOworCisvKgorICogQGJyaWVmIEZyZWUgYSB0eCBkZXNjcmlwdG9yLCB3aXRob3V0IGZyZWVpbmcgdGhlIG1hdGNoaW5nIGZyYW1lLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHVzaW5nIGR1cmluZyB0aGUgZnVuY3Rpb24gY2FsbCB0aGF0IHN1Ym1pdHMgdHggZnJhbWVzCisgKiAgaW50byB0aGUgdHhyeCBsYXllciwgZm9yIGNhc2VzIHdoZXJlIGEgdHggZGVzY3JpcHRvciBpcyBzdWNjZXNzZnVsbHkKKyAqICBhbGxvY2F0ZWQsIGJ1dCBmb3Igb3RoZXIgcmVhc29ucyB0aGUgZnJhbWUgY291bGQgbm90IGJlIGFjY2VwdGVkLgorICoKKyAqIEBwYXJhbSBwZGV2IC0gdGhlIGRhdGEgcGh5c2ljYWwgZGV2aWNlIHRoYXQgaXMgc2VuZGluZyB0aGUgZGF0YQorICogQHBhcmFtIHR4X2Rlc2MgLSB0aGUgZGVzY3JpcHRvciBiZWluZyBmcmVlZAorICovCit2b2lkIG9sX3R4X2Rlc2NfZnJlZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsIHN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MpOworCisjaWYgZGVmaW5lZChGRUFUVVJFX1RTTykKK3N0cnVjdCBjZGZfdHNvX3NlZ19lbGVtX3QgKm9sX3Rzb19hbGxvY19zZWdtZW50KHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldik7CisKK3ZvaWQgb2xfdHNvX2ZyZWVfc2VnbWVudChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJIHN0cnVjdCBjZGZfdHNvX3NlZ19lbGVtX3QgKnRzb19zZWcpOworI2VuZGlmCisKKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyCitpbnQgb2xfdHhfZnJlZV9pbnZhbGlkX2Zsb3dfcG9vbChzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnBvb2wpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG9sX3R4X2ZyZWVfaW52YWxpZF9mbG93X3Bvb2wodm9pZCAqcG9vbCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX09MX1RYX0RFU0NfX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfdHhfcXVldWUuYyBiL2NvcmUvZHAvdHhyeC9vbF90eF9xdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNGFlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfdHhfcXVldWUuYwpAQCAtMCwwICsxLDQyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90LCBldGMuICovCisjaW5jbHVkZSA8Y2RmX2F0b21pYy5oPiAgICAgICAgIC8qIGNkZl9hdG9taWNfcmVhZCwgZXRjLiAqLworI2luY2x1ZGUgPG9sX2NmZy5oPiAgICAgICAgICAgICAvKiBvbF9jZmdfYWRkYmFfcmV0cnkgKi8KKyNpbmNsdWRlIDxodHQuaD4gICAgICAgICAgICAgICAgLyogSFRUX1RYX0VYVF9USURfTUdNVCAqLworI2luY2x1ZGUgPG9sX2h0dF90eF9hcGkuaD4gICAgICAvKiBodHRfdHhfZGVzY190aWQgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2FwaS5oPiAgICAgICAgLyogb2xfdHhyeF92ZGV2X2hhbmRsZSAqLworI2luY2x1ZGUgPG9sX3R4cnhfY3RybF9hcGkuaD4gICAvKiBvbF90eHJ4X3N5bmMsIG9sX3R4X2FkZGJhX2NvbmYgKi8KKyNpbmNsdWRlIDxvbF9jdHJsX3R4cnhfYXBpLmg+ICAgLyogb2xfY3RybF9hZGRiYV9yZXEgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2ludGVybmFsLmg+ICAgLyogVFhSWF9BU1NFUlQxLCBldGMuICovCisjaW5jbHVkZSA8b2xfdHhyeF90eXBlcy5oPiAgICAgIC8qIHBkZXYgc3RhdHMgKi8KKyNpbmNsdWRlIDxvbF90eF9kZXNjLmg+ICAgICAgICAgLyogb2xfdHhfZGVzYywgb2xfdHhfZGVzY19mcmFtZV9saXN0X2ZyZWUgKi8KKyNpbmNsdWRlIDxvbF90eC5oPiAgICAgICAgICAgICAgLyogb2xfdHhfdmRldl9sbF9wYXVzZV9xdWV1ZV9zZW5kICovCisjaW5jbHVkZSA8b2xfdHhfcXVldWUuaD4KKyNpbmNsdWRlIDxvbF90eHJ4X2RiZy5oPiAgICAgICAgLyogRU5BQkxFX1RYX1FVRVVFX0xPRyAqLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPiAgICAgICAgICAvKiBib29sICovCisKKyNpZiBkZWZpbmVkKFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MKQorCit2b2lkIG9sX3R4cnhfdmRldl9wYXVzZShvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsIHVpbnQzMl90IHJlYXNvbikKK3sKKwkvKiBUTyBETzogbG9nIHRoZSBxdWV1ZSBwYXVzZSAqLworCS8qIGFjcXVpcmUgdGhlIG11dGV4IGxvY2ssIHNpbmNlIHdlJ2xsIGJlIG1vZGlmeWluZyB0aGUgcXVldWVzICovCisJVFhfU0NIRURfREVCVUdfUFJJTlQoIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZ2ZGV2LT5sbF9wYXVzZS5tdXRleCk7CisJdmRldi0+bGxfcGF1c2UucGF1c2VkX3JlYXNvbiB8PSByZWFzb247CisJdmRldi0+bGxfcGF1c2UucV9wYXVzZV9jbnQrKzsKKwl2ZGV2LT5sbF9wYXVzZS5pc19xX3BhdXNlZCA9IHRydWU7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ2ZGV2LT5sbF9wYXVzZS5tdXRleCk7CisKKwlEUFRSQUNFKGNkZl9kcF90cmFjZShOVUxMLCBDREZfRFBfVFJBQ0VfVkRFVl9QQVVTRSwKKwkJCQlOVUxMLCAwKSk7CisJVFhfU0NIRURfREVCVUdfUFJJTlQoIkxlYXZlICVzXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3ZvaWQgb2xfdHhyeF92ZGV2X3VucGF1c2Uob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCB1aW50MzJfdCByZWFzb24pCit7CisJLyogVE8gRE86IGxvZyB0aGUgcXVldWUgdW5wYXVzZSAqLworCS8qIGFjcXVpcmUgdGhlIG11dGV4IGxvY2ssIHNpbmNlIHdlJ2xsIGJlIG1vZGlmeWluZyB0aGUgcXVldWVzICovCisJVFhfU0NIRURfREVCVUdfUFJJTlQoIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZ2ZGV2LT5sbF9wYXVzZS5tdXRleCk7CisJaWYgKHZkZXYtPmxsX3BhdXNlLnBhdXNlZF9yZWFzb24gJiByZWFzb24pIHsKKwkJdmRldi0+bGxfcGF1c2UucGF1c2VkX3JlYXNvbiAmPSB+cmVhc29uOworCQlpZiAoIXZkZXYtPmxsX3BhdXNlLnBhdXNlZF9yZWFzb24pIHsKKwkJCXZkZXYtPmxsX3BhdXNlLmlzX3FfcGF1c2VkID0gZmFsc2U7CisJCQl2ZGV2LT5sbF9wYXVzZS5xX3VucGF1c2VfY250Kys7CisJCQljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPmxsX3BhdXNlLm11dGV4KTsKKwkJCW9sX3R4X3ZkZXZfbGxfcGF1c2VfcXVldWVfc2VuZCh2ZGV2KTsKKwkJfSBlbHNlIHsKKwkJCWNkZl9zcGluX3VubG9ja19iaCgmdmRldi0+bGxfcGF1c2UubXV0ZXgpOworCQl9CisJfSBlbHNlIHsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZ2ZGV2LT5sbF9wYXVzZS5tdXRleCk7CisJfQorCURQVFJBQ0UoY2RmX2RwX3RyYWNlKE5VTEwsIENERl9EUF9UUkFDRV9WREVWX1VOUEFVU0UsCisJCQkJTlVMTCwgMCkpOworCVRYX1NDSEVEX0RFQlVHX1BSSU5UKCJMZWF2ZSAlc1xuIiwgX19mdW5jX18pOworfQorCit2b2lkIG9sX3R4cnhfdmRldl9mbHVzaChvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYpCit7CisJY2RmX3NwaW5fbG9ja19iaCgmdmRldi0+bGxfcGF1c2UubXV0ZXgpOworCWNkZl9zb2Z0aXJxX3RpbWVyX2NhbmNlbCgmdmRldi0+bGxfcGF1c2UudGltZXIpOworCXZkZXYtPmxsX3BhdXNlLmlzX3FfdGltZXJfb24gPSBmYWxzZTsKKwl3aGlsZSAodmRldi0+bGxfcGF1c2UudHhxLmhlYWQpIHsKKwkJY2RmX25idWZfdCBuZXh0ID0KKwkJCWNkZl9uYnVmX25leHQodmRldi0+bGxfcGF1c2UudHhxLmhlYWQpOworCQljZGZfbmJ1Zl9zZXRfbmV4dCh2ZGV2LT5sbF9wYXVzZS50eHEuaGVhZCwgTlVMTCk7CisJCWNkZl9uYnVmX3VubWFwKHZkZXYtPnBkZXYtPm9zZGV2LAorCQkJICAgICAgIHZkZXYtPmxsX3BhdXNlLnR4cS5oZWFkLAorCQkJICAgICAgIENERl9ETUFfVE9fREVWSUNFKTsKKwkJY2RmX25idWZfdHhfZnJlZSh2ZGV2LT5sbF9wYXVzZS50eHEuaGVhZCwKKwkJCQkgTkJVRl9QS1RfRVJST1IpOworCQl2ZGV2LT5sbF9wYXVzZS50eHEuaGVhZCA9IG5leHQ7CisJfQorCXZkZXYtPmxsX3BhdXNlLnR4cS50YWlsID0gTlVMTDsKKwl2ZGV2LT5sbF9wYXVzZS50eHEuZGVwdGggPSAwOworCWNkZl9zcGluX3VubG9ja19iaCgmdmRldi0+bGxfcGF1c2UubXV0ZXgpOworfQorCisjZW5kaWYgLyogZGVmaW5lZChRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCkgKi8KKworI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKKworLyoqCisgKiBvbF90eHJ4X21hcF90b19uZXRpZl9yZWFzb25fdHlwZSgpIC0gbWFwIHRvIG5ldGlmX3JlYXNvbl90eXBlCisgKiBAcmVhc29uOiByZWFzb24KKyAqCisgKiBSZXR1cm46IG5ldGlmX3JlYXNvbl90eXBlCisgKi8KK2VudW0gbmV0aWZfcmVhc29uX3R5cGUKK29sX3R4cnhfbWFwX3RvX25ldGlmX3JlYXNvbl90eXBlKHVpbnQzMl90IHJlYXNvbikKK3sKKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgT0xfVFhRX1BBVVNFX1JFQVNPTl9GVzoKKwkJcmV0dXJuIFdMQU5fRldfUEFVU0U7CisJY2FzZSBPTF9UWFFfUEFVU0VfUkVBU09OX1BFRVJfVU5BVVRIT1JJWkVEOgorCQlyZXR1cm4gV0xBTl9QRUVSX1VOQVVUSE9SSVNFRDsKKwljYXNlIE9MX1RYUV9QQVVTRV9SRUFTT05fVFhfQUJPUlQ6CisJCXJldHVybiBXTEFOX1RYX0FCT1JUOworCWNhc2UgT0xfVFhRX1BBVVNFX1JFQVNPTl9WREVWX1NUT1A6CisJCXJldHVybiBXTEFOX1ZERVZfU1RPUDsKKwljYXNlIE9MX1RYUV9QQVVTRV9SRUFTT05fVEhFUk1BTF9NSVRJR0FUSU9OOgorCQlyZXR1cm4gV0xBTl9USEVSTUFMX01JVElHQVRJT047CisJZGVmYXVsdDoKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJCSAgICIlczogcmVhc29uIG5vdCBzdXBwb3J0ZWQgJWRcbiIsCisJCQkgICBfX2Z1bmNfXywgcmVhc29uKTsKKwkJcmV0dXJuIFdMQU5fUkVBU09OX1RZUEVfTUFYOworCX0KK30KKworLyoqCisgKiBvbF90eHJ4X3ZkZXZfcGF1c2UoKSAtIHBhdXNlIHZkZXYgbmV0d29yayBxdWV1ZXMKKyAqIEB2ZGV2OiB2ZGV2IGhhbmRsZQorICogQHJlYXNvbjogcmVhc29uCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgb2xfdHhyeF92ZGV2X3BhdXNlKG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgdWludDMyX3QgcmVhc29uKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHZkZXYtPnBkZXY7CisJZW51bSBuZXRpZl9yZWFzb25fdHlwZSBuZXRpZl9yZWFzb247CisKKwlpZiAoY2RmX3VubGlrZWx5KCghcGRldikgfHwgKCFwZGV2LT5wYXVzZV9jYikpKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkJICAgIiVzOiBpbnZhbGlkIHBkZXZcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCW5ldGlmX3JlYXNvbiA9IG9sX3R4cnhfbWFwX3RvX25ldGlmX3JlYXNvbl90eXBlKHJlYXNvbik7CisJaWYgKG5ldGlmX3JlYXNvbiA9PSBXTEFOX1JFQVNPTl9UWVBFX01BWCkKKwkJcmV0dXJuOworCisJcGRldi0+cGF1c2VfY2IodmRldi0+dmRldl9pZCwgV0xBTl9ORVRJRl9UWF9ESVNBQkxFLCBuZXRpZl9yZWFzb24pOworfQorCisvKioKKyAqIG9sX3R4cnhfdmRldl91bnBhdXNlKCkgLSB1bnBhdXNlIHZkZXYgbmV0d29yayBxdWV1ZXMKKyAqIEB2ZGV2OiB2ZGV2IGhhbmRsZQorICogQHJlYXNvbjogcmVhc29uCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgb2xfdHhyeF92ZGV2X3VucGF1c2Uob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCB1aW50MzJfdCByZWFzb24pCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gdmRldi0+cGRldjsKKwllbnVtIG5ldGlmX3JlYXNvbl90eXBlIG5ldGlmX3JlYXNvbjsKKworCWlmIChjZGZfdW5saWtlbHkoKCFwZGV2KSB8fCAoIXBkZXYtPnBhdXNlX2NiKSkpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJCQkgICAiJXM6IGludmFsaWQgcGRldlxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJbmV0aWZfcmVhc29uID0gb2xfdHhyeF9tYXBfdG9fbmV0aWZfcmVhc29uX3R5cGUocmVhc29uKTsKKwlpZiAobmV0aWZfcmVhc29uID09IFdMQU5fUkVBU09OX1RZUEVfTUFYKQorCQlyZXR1cm47CisKKwlwZGV2LT5wYXVzZV9jYih2ZGV2LT52ZGV2X2lkLCBXTEFOX1dBS0VfQUxMX05FVElGX1FVRVVFLAorCQkJbmV0aWZfcmVhc29uKTsKKworfQorCisvKioKKyAqIG9sX3R4cnhfcGRldl9wYXVzZSgpIC0gcGF1c2UgbmV0d29yayBxdWV1ZXMgZm9yIGVhY2ggdmRldgorICogQHBkZXY6IHBkZXYgaGFuZGxlCisgKiBAcmVhc29uOiByZWFzb24KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBvbF90eHJ4X3BkZXZfcGF1c2Uoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LCB1aW50MzJfdCByZWFzb24pCit7CisJc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2ID0gTlVMTCwgKnRtcDsKKworCVRBSUxRX0ZPUkVBQ0hfU0FGRSh2ZGV2LCAmcGRldi0+dmRldl9saXN0LCB2ZGV2X2xpc3RfZWxlbSwgdG1wKSB7CisJCW9sX3R4cnhfdmRldl9wYXVzZSh2ZGV2LCByZWFzb24pOworCX0KKworfQorCisvKioKKyAqIG9sX3R4cnhfcGRldl91bnBhdXNlKCkgLSB1bnBhdXNlIG5ldHdvcmsgcXVldWVzIGZvciBlYWNoIHZkZXYKKyAqIEBwZGV2OiBwZGV2IGhhbmRsZQorICogQHJlYXNvbjogcmVhc29uCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgb2xfdHhyeF9wZGV2X3VucGF1c2Uoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LCB1aW50MzJfdCByZWFzb24pCit7CisJc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2ID0gTlVMTCwgKnRtcDsKKworCVRBSUxRX0ZPUkVBQ0hfU0FGRSh2ZGV2LCAmcGRldi0+dmRldl9saXN0LCB2ZGV2X2xpc3RfZWxlbSwgdG1wKSB7CisJCW9sX3R4cnhfdmRldl9wYXVzZSh2ZGV2LCByZWFzb24pOworCX0KKworfQorI2VuZGlmCisKKy8qLS0tIExMIHR4IHRocm90dGxlIHF1ZXVlIGNvZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoUUNBX1NVUFBPUlRfVFhfVEhST1RUTEUpCit1aW50OF90IG9sX3R4X3BkZXZfaXNfdGFyZ2V0X2VtcHR5KHZvaWQpCit7CisJLyogVE0gVE9ETyAqLworCXJldHVybiAxOworfQorCisjaWZkZWYgUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMgorLyoqCisgKiBvbF90eHJ4X3RoZXJtYWxfcGF1c2UoKSAtIHBhdXNlIGR1ZSB0byB0aGVybWFsIG1pdGlnYXRpb24KKyAqIEBwZGV2OiBwZGV2IGhhbmRsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lCit2b2lkIG9sX3R4cnhfdGhlcm1hbF9wYXVzZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpCit7CisJb2xfdHhyeF9wZGV2X3BhdXNlKHBkZXYsIE9MX1RYUV9QQVVTRV9SRUFTT05fVEhFUk1BTF9NSVRJR0FUSU9OKTsKKwlyZXR1cm47Cit9CisvKioKKyAqIG9sX3R4cnhfdGhlcm1hbF91bnBhdXNlKCkgLSB1bnBhdXNlIGR1ZSB0byB0aGVybWFsIG1pdGlnYXRpb24KKyAqIEBwZGV2OiBwZGV2IGhhbmRsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lCit2b2lkIG9sX3R4cnhfdGhlcm1hbF91bnBhdXNlKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwlvbF90eHJ4X3BkZXZfdW5wYXVzZShwZGV2LCBPTF9UWFFfUEFVU0VfUkVBU09OX1RIRVJNQUxfTUlUSUdBVElPTik7CisJcmV0dXJuOworfQorI2Vsc2UKKy8qKgorICogb2xfdHhyeF90aGVybWFsX3BhdXNlKCkgLSBwYXVzZSBkdWUgdG8gdGhlcm1hbCBtaXRpZ2F0aW9uCisgKiBAcGRldjogcGRldiBoYW5kbGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZQordm9pZCBvbF90eHJ4X3RoZXJtYWxfcGF1c2Uoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCXJldHVybjsKK30KKworLyoqCisgKiBvbF90eHJ4X3RoZXJtYWxfdW5wYXVzZSgpIC0gdW5wYXVzZSBkdWUgdG8gdGhlcm1hbCBtaXRpZ2F0aW9uCisgKiBAcGRldjogcGRldiBoYW5kbGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZQordm9pZCBvbF90eHJ4X3RoZXJtYWxfdW5wYXVzZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpCit7CisJb2xfdHhfcGRldl9sbF9wYXVzZV9xdWV1ZV9zZW5kX2FsbChwZGV2KTsKKwlyZXR1cm47Cit9CisjZW5kaWYKKwordm9pZCBvbF90eF9wZGV2X3Rocm90dGxlX3BoYXNlX3RpbWVyKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqKWNvbnRleHQ7CisJaW50IG1zOworCWVudW0gdGhyb3R0bGVfbGV2ZWwgY3VyX2xldmVsOworCWVudW0gdGhyb3R0bGVfcGhhc2UgY3VyX3BoYXNlOworCisJLyogdXBkYXRlIHRoZSBwaGFzZSAqLworCXBkZXYtPnR4X3Rocm90dGxlLmN1cnJlbnRfdGhyb3R0bGVfcGhhc2UrKzsKKworCWlmIChwZGV2LT50eF90aHJvdHRsZS5jdXJyZW50X3Rocm90dGxlX3BoYXNlID09IFRIUk9UVExFX1BIQVNFX01BWCkKKwkJcGRldi0+dHhfdGhyb3R0bGUuY3VycmVudF90aHJvdHRsZV9waGFzZSA9IFRIUk9UVExFX1BIQVNFX09GRjsKKworCWlmIChwZGV2LT50eF90aHJvdHRsZS5jdXJyZW50X3Rocm90dGxlX3BoYXNlID09IFRIUk9UVExFX1BIQVNFX09GRikgeworCQkvKiBUcmFmZmljIGlzIHN0b3BwZWQgKi8KKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX1dBUk4sCisJCQkJICAgInRocm90dGxlIHBoYXNlIC0tPiBPRkZcbiIpOworCQlvbF90eHJ4X3RoZXJtYWxfcGF1c2UocGRldik7CisJCWN1cl9sZXZlbCA9IHBkZXYtPnR4X3Rocm90dGxlLmN1cnJlbnRfdGhyb3R0bGVfbGV2ZWw7CisJCWN1cl9waGFzZSA9IHBkZXYtPnR4X3Rocm90dGxlLmN1cnJlbnRfdGhyb3R0bGVfcGhhc2U7CisJCW1zID0gcGRldi0+dHhfdGhyb3R0bGUudGhyb3R0bGVfdGltZV9tc1tjdXJfbGV2ZWxdW2N1cl9waGFzZV07CisJCWlmIChwZGV2LT50eF90aHJvdHRsZS5jdXJyZW50X3Rocm90dGxlX2xldmVsICE9CisJCQkJVEhST1RUTEVfTEVWRUxfMCkgeworCQkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX1dBUk4sCisJCQkJCSAgICJzdGFydCB0aW1lciAlZCBtc1xuIiwgbXMpOworCQkJY2RmX3NvZnRpcnFfdGltZXJfc3RhcnQoJnBkZXYtPnR4X3Rocm90dGxlLgorCQkJCQkJCXBoYXNlX3RpbWVyLCBtcyk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUcmFmZmljIGNhbiBnbyAqLworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfV0FSTiwKKwkJCQkJInRocm90dGxlIHBoYXNlIC0tPiBPTlxuIik7CisJCW9sX3R4cnhfdGhlcm1hbF91bnBhdXNlKHBkZXYpOworCQljdXJfbGV2ZWwgPSBwZGV2LT50eF90aHJvdHRsZS5jdXJyZW50X3Rocm90dGxlX2xldmVsOworCQljdXJfcGhhc2UgPSBwZGV2LT50eF90aHJvdHRsZS5jdXJyZW50X3Rocm90dGxlX3BoYXNlOworCQltcyA9IHBkZXYtPnR4X3Rocm90dGxlLnRocm90dGxlX3RpbWVfbXNbY3VyX2xldmVsXVtjdXJfcGhhc2VdOworCQlpZiAocGRldi0+dHhfdGhyb3R0bGUuY3VycmVudF90aHJvdHRsZV9sZXZlbCAhPQorCQkgICAgVEhST1RUTEVfTEVWRUxfMCkgeworCQkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX1dBUk4sICJzdGFydCB0aW1lciAlZCBtc1xuIiwKKwkJCQkgICBtcyk7CisJCQljZGZfc29mdGlycV90aW1lcl9zdGFydCgmcGRldi0+dHhfdGhyb3R0bGUucGhhc2VfdGltZXIsCisJCQkJCQltcyk7CisJCX0KKwl9Cit9CisKKyNpZmRlZiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTAordm9pZCBvbF90eF9wZGV2X3Rocm90dGxlX3R4X3RpbWVyKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqKWNvbnRleHQ7CisJb2xfdHhfcGRldl9sbF9wYXVzZV9xdWV1ZV9zZW5kX2FsbChwZGV2KTsKK30KKyNlbmRpZgorCit2b2lkIG9sX3R4X3Rocm90dGxlX3NldF9sZXZlbChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsIGludCBsZXZlbCkKK3sKKwlpbnQgbXMgPSAwOworCisJaWYgKGxldmVsID49IFRIUk9UVExFX0xFVkVMX01BWCkgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfV0FSTiwKKwkJCSAgICIlcyBpbnZhbGlkIHRocm90dGxlIGxldmVsIHNldCAlZCwgaWdub3JpbmdcbiIsCisJCQkgICBfX2Z1bmNfXywgbGV2ZWwpOworCQlyZXR1cm47CisJfQorCisJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwgIlNldHRpbmcgdGhyb3R0bGUgbGV2ZWwgJWRcbiIsIGxldmVsKTsKKworCS8qIFNldCB0aGUgY3VycmVudCB0aHJvdHRsZSBsZXZlbCAqLworCXBkZXYtPnR4X3Rocm90dGxlLmN1cnJlbnRfdGhyb3R0bGVfbGV2ZWwgPSAoZW51bSB0aHJvdHRsZV9sZXZlbCkgbGV2ZWw7CisKKwkvKiBSZXNldCB0aGUgcGhhc2UgKi8KKwlwZGV2LT50eF90aHJvdHRsZS5jdXJyZW50X3Rocm90dGxlX3BoYXNlID0gVEhST1RUTEVfUEhBU0VfT0ZGOworCisJLyogU3RhcnQgd2l0aCB0aGUgbmV3IHRpbWUgKi8KKwltcyA9IHBkZXYtPnR4X3Rocm90dGxlLgorCSAgICAgdGhyb3R0bGVfdGltZV9tc1tsZXZlbF1bVEhST1RUTEVfUEhBU0VfT0ZGXTsKKworCWNkZl9zb2Z0aXJxX3RpbWVyX2NhbmNlbCgmcGRldi0+dHhfdGhyb3R0bGUucGhhc2VfdGltZXIpOworCisJaWYgKGxldmVsICE9IFRIUk9UVExFX0xFVkVMXzApCisJCWNkZl9zb2Z0aXJxX3RpbWVyX3N0YXJ0KCZwZGV2LT50eF90aHJvdHRsZS5waGFzZV90aW1lciwgbXMpOworfQorCisvKiBUaGlzIHRhYmxlIHN0b3JlcyB0aGUgZHV0eSBjeWNsZSBmb3IgZWFjaCBsZXZlbC4KKyAgIEV4YW1wbGUgIm9uIiB0aW1lIGZvciBsZXZlbCAyIHdpdGggZHV0eSBwZXJpb2QgMTAwbXMgaXM6CisgICAib24iIHRpbWUgPSBkdXR5X3BlcmlvZF9tcyA+PiB0aHJvdHRsZV9kdXR5X2N5Y2xlX3RhYmxlWzJdCisgICAib24iIHRpbWUgPSAxMDAgbXMgPj4gMiA9IDI1bXMgKi8KK3N0YXRpYyB1aW50OF90IGdfdGhyb3R0bGVfZHV0eV9jeWNsZV90YWJsZVtUSFJPVFRMRV9MRVZFTF9NQVhdID0geyAwLCAxLCAyLCA0IH07CisKK3ZvaWQgb2xfdHhfdGhyb3R0bGVfaW5pdF9wZXJpb2Qoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LCBpbnQgcGVyaW9kKQoreworCWludCBpOworCisJLyogU2V0IHRoZSBjdXJyZW50IHRocm90dGxlIGxldmVsICovCisJcGRldi0+dHhfdGhyb3R0bGUudGhyb3R0bGVfcGVyaW9kX21zID0gcGVyaW9kOworCisJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX1dBUk4sICJsZXZlbCAgT0ZGICBPTlxuIik7CisJZm9yIChpID0gMDsgaSA8IFRIUk9UVExFX0xFVkVMX01BWDsgaSsrKSB7CisJCXBkZXYtPnR4X3Rocm90dGxlLnRocm90dGxlX3RpbWVfbXNbaV1bVEhST1RUTEVfUEhBU0VfT05dID0KKwkJCXBkZXYtPnR4X3Rocm90dGxlLnRocm90dGxlX3BlcmlvZF9tcyA+PgorCQkJZ190aHJvdHRsZV9kdXR5X2N5Y2xlX3RhYmxlW2ldOworCQlwZGV2LT50eF90aHJvdHRsZS50aHJvdHRsZV90aW1lX21zW2ldW1RIUk9UVExFX1BIQVNFX09GRl0gPQorCQkJcGRldi0+dHhfdGhyb3R0bGUudGhyb3R0bGVfcGVyaW9kX21zIC0KKwkJCXBkZXYtPnR4X3Rocm90dGxlLnRocm90dGxlX3RpbWVfbXNbCisJCQkJaV1bVEhST1RUTEVfUEhBU0VfT05dOworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfV0FSTiwgIiVkICAgICAgJWQgICAgJWRcbiIsIGksCisJCQkgICBwZGV2LT50eF90aHJvdHRsZS4KKwkJCSAgIHRocm90dGxlX3RpbWVfbXNbaV1bVEhST1RUTEVfUEhBU0VfT0ZGXSwKKwkJCSAgIHBkZXYtPnR4X3Rocm90dGxlLgorCQkJICAgdGhyb3R0bGVfdGltZV9tc1tpXVtUSFJPVFRMRV9QSEFTRV9PTl0pOworCX0KK30KKwordm9pZCBvbF90eF90aHJvdHRsZV9pbml0KHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwl1aW50MzJfdCB0aHJvdHRsZV9wZXJpb2Q7CisKKwlwZGV2LT50eF90aHJvdHRsZS5jdXJyZW50X3Rocm90dGxlX2xldmVsID0gVEhST1RUTEVfTEVWRUxfMDsKKwlwZGV2LT50eF90aHJvdHRsZS5jdXJyZW50X3Rocm90dGxlX3BoYXNlID0gVEhST1RUTEVfUEhBU0VfT0ZGOworCWNkZl9zcGlubG9ja19pbml0KCZwZGV2LT50eF90aHJvdHRsZS5tdXRleCk7CisKKwl0aHJvdHRsZV9wZXJpb2QgPSBvbF9jZmdfdGhyb3R0bGVfcGVyaW9kX21zKHBkZXYtPmN0cmxfcGRldik7CisKKwlvbF90eF90aHJvdHRsZV9pbml0X3BlcmlvZChwZGV2LCB0aHJvdHRsZV9wZXJpb2QpOworCisJY2RmX3NvZnRpcnFfdGltZXJfaW5pdChwZGV2LT5vc2RldiwKKwkJCSAgICAgICAmcGRldi0+dHhfdGhyb3R0bGUucGhhc2VfdGltZXIsCisJCQkgICAgICAgb2xfdHhfcGRldl90aHJvdHRsZV9waGFzZV90aW1lciwgcGRldiwKKwkJCSAgICAgICBDREZfVElNRVJfVFlQRV9TVyk7CisKKyNpZmRlZiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTAorCWNkZl9zb2Z0aXJxX3RpbWVyX2luaXQocGRldi0+b3NkZXYsCisJCQkgICAgICAgJnBkZXYtPnR4X3Rocm90dGxlLnR4X3RpbWVyLAorCQkJICAgICAgIG9sX3R4X3BkZXZfdGhyb3R0bGVfdHhfdGltZXIsIHBkZXYsCisJCQkgICAgICAgQ0RGX1RJTUVSX1RZUEVfU1cpOworI2VuZGlmCisKKwlwZGV2LT50eF90aHJvdHRsZS50eF90aHJlc2hvbGQgPSBUSFJPVFRMRV9UWF9USFJFU0hPTEQ7Cit9CisjZW5kaWYgLyogUUNBX1NVUFBPUlRfVFhfVEhST1RUTEUgKi8KKy8qLS0tIEVuZCBvZiBMTCB0eCB0aHJvdHRsZSBxdWV1ZSBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfdHhfcXVldWUuaCBiL2NvcmUvZHAvdHhyeC9vbF90eF9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODA5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfdHhfcXVldWUuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIG9sX3R4X3F1ZXVlLmgKKyAqIEBicmllZiBBUEkgZGVmaW5pdGlvbnMgZm9yIHRoZSB0eCBmcmFtZSBxdWV1ZSBtb2R1bGUgd2l0aGluIHRoZSBkYXRhIFNXLgorICovCisjaWZuZGVmIF9PTF9UWF9RVUVVRV9fSF8KKyNkZWZpbmUgX09MX1RYX1FVRVVFX19IXworCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX3QgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+ICAgICAgLyogb2xfdHhyeF92ZGV2X3QsIGV0Yy4gKi8KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4gICAgICAgICAgLyogYm9vbCAqLworCisvKi0tLSBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBvcHRpb25hbCBxdWV1ZSBsb2cgZmVhdHVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChFTkFCTEVfVFhfUVVFVUVfTE9HKQorCit2b2lkCitvbF90eF9xdWV1ZV9sb2dfZW5xdWV1ZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQlzdHJ1Y3Qgb2xfdHhyeF9tc2R1X2luZm9fdCAqbXNkdV9pbmZvLAorCQkJaW50IGZybXMsIGludCBieXRlcyk7Cit2b2lkCitvbF90eF9xdWV1ZV9sb2dfZGVxdWV1ZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQlzdHJ1Y3Qgb2xfdHhfZnJtc19xdWV1ZV90ICp0eHEsIGludCBmcm1zLCBpbnQgYnl0ZXMpOwordm9pZAorb2xfdHhfcXVldWVfbG9nX2ZyZWUoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkgICAgIHN0cnVjdCBvbF90eF9mcm1zX3F1ZXVlX3QgKnR4cSwKKwkJICAgICBpbnQgdGlkLCBpbnQgZnJtcywgaW50IGJ5dGVzKTsKKyNkZWZpbmUgT0xfVFhfUVVFVUVfTE9HX0VOUVVFVUUgb2xfdHhfcXVldWVfbG9nX2VucXVldWUKKyNkZWZpbmUgT0xfVFhfUVVFVUVfTE9HX0RFUVVFVUUgb2xfdHhfcXVldWVfbG9nX2RlcXVldWUKKyNkZWZpbmUgT0xfVFhfUVVFVUVfTE9HX0ZSRUUgICAgb2xfdHhfcXVldWVfbG9nX2ZyZWUKKworI2Vsc2UKKworI2RlZmluZSBPTF9UWF9RVUVVRV9MT0dfRU5RVUVVRShwZGV2LCBtc2R1X2luZm8sIGZybXMsIGJ5dGVzKSAgIC8qIG5vLW9wICovCisjZGVmaW5lIE9MX1RYX1FVRVVFX0xPR19ERVFVRVVFKHBkZXYsIHR4cSwgZnJtcywgYnl0ZXMpIC8qIG5vLW9wICovCisjZGVmaW5lIE9MX1RYX1FVRVVFX0xPR19GUkVFKHBkZXYsIHR4cSwgdGlkLCBmcm1zLCBieXRlcykgICAgICAgLyogbm8tb3AgKi8KKworI2VuZGlmIC8qIFRYUlhfREVCVUdfTEVWRUwgPiA1ICovCisKKyNkZWZpbmUgb2xfdHhfZW5xdWV1ZShwZGV2LCB0eHEsIHR4X2Rlc2MsIHR4X21zZHVfaW5mbykgLyogbm8tb3AgKi8KKyNkZWZpbmUgb2xfdHhfZGVxdWV1ZShwZGV2LCBleHRfdGlkLCB0eHEsIGhlYWQsIG51bV9mcmFtZXMsIGNyZWRpdCwgYnl0ZXMpIDAKKyNkZWZpbmUgb2xfdHhfcXVldWVfZnJlZShwZGV2LCB0eHEsIHRpZCkgICAgICAgIC8qIG5vLW9wICovCisjZGVmaW5lIG9sX3R4X3F1ZXVlX2Rpc2NhcmQocGRldiwgZmx1c2gsIHR4X2Rlc2NzKSAgICAgIC8qIG5vLW9wICovCisKK3ZvaWQKK29sX3R4X3F1ZXVlX2xvZ19zY2hlZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCSAgICAgIGludCBjcmVkaXQsCisJCSAgICAgIGludCAqbnVtX2FjdGl2ZV90aWRzLAorCQkgICAgICB1aW50MzJfdCAqKmFjdGl2ZV9iaXRtYXAsIHVpbnQ4X3QgKipkYXRhKTsKKworI2RlZmluZSBPTF9UWF9RVUVVRV9MT0dfU0NIRUQoIFwKKwkJcGRldiwgY3JlZGl0LCBudW1fYWN0aXZlX3RpZHMsIGFjdGl2ZV9iaXRtYXAsIGRhdGEpCisKKyNkZWZpbmUgb2xfdHhfcXVldWVzX2Rpc3BsYXkocGRldikgICAgICAvKiBuby1vcCAqLworCisjZGVmaW5lIG9sX3R4X3F1ZXVlX2RlY3NfcmVpbml0KHBlZXIsIHBlZXJfaWQpICAvKiBuby1vcCAqLworCisjaWZkZWYgUUNBX1NVUFBPUlRfVFhfVEhST1RUTEUKKy8qKgorICogQGJyaWVmIC0gaW5pdGlhbGl6ZSB0aGUgdGhyb3R0bGUgY29udGV4dAorICogQHBhcmFtIHBkZXYgLSB0aGUgcGh5c2ljYWwgZGV2aWNlIG9iamVjdCwgd2hpY2ggc3RvcmVzIHRoZSB0eHFzCisgKi8KK3ZvaWQgb2xfdHhfdGhyb3R0bGVfaW5pdChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpOworI2Vsc2UKKyNkZWZpbmUgb2xfdHhfdGhyb3R0bGVfaW5pdChwZGV2KSAgICAgICAvKm5vIG9wICovCisjZW5kaWYKKyNlbmRpZiAvKiBfT0xfVFhfUVVFVUVfX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfdHhfc2VuZC5jIGIvY29yZS9kcC90eHJ4L29sX3R4X3NlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJhNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L29sX3R4X3NlbmQuYwpAQCAtMCwwICsxLDk2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGNkZl9hdG9taWMuaD4gICAgICAgICAvKiBjZGZfYXRvbWljX2luYywgZXRjLiAqLworI2luY2x1ZGUgPGNkZl9sb2NrLmg+ICAgICAgICAgICAvKiBjZGZfb3Nfc3BpbmxvY2sgKi8KKyNpbmNsdWRlIDxjZGZfdGltZS5oPiAgICAgICAgICAgLyogY2RmX3N5c3RlbV90aWNrcywgZXRjLiAqLworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90ICovCisjaW5jbHVkZSA8Y2RmX25ldF90eXBlcy5oPiAgICAgIC8qIEFERl9OQlVGX1RYX0VYVF9USURfSU5WQUxJRCAqLworCisjaW5jbHVkZSA8Y2RzX3F1ZXVlLmg+ICAgICAgICAgIC8qIFRBSUxRICovCisjaWZkZWYgUUNBX0NPTVBVVEVfVFhfREVMQVkKKyNpbmNsdWRlIDxpZWVlODAyMTEuaD4gICAgICAgICAgLyogaWVlZTgwMjExX2ZyYW1lLCBldGMuICovCisjaW5jbHVkZSA8ZW5ldC5oPiAgICAgICAgICAgICAgIC8qIGV0aGVybmV0X2hkcl90LCBldGMuICovCisjaW5jbHVkZSA8aXB2Nl9kZWZzLmg+ICAgICAgICAgIC8qIGlwdjZfdHJhZmZpY19jbGFzcyAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxvbF90eHJ4X2FwaS5oPiAgICAgICAgLyogb2xfdHhyeF92ZGV2X2hhbmRsZSwgZXRjLiAqLworI2luY2x1ZGUgPG9sX2h0dF90eF9hcGkuaD4gICAgICAvKiBodHRfdHhfY29tcGxfZGVzY19pZCAqLworI2luY2x1ZGUgPG9sX3R4cnhfaHR0X2FwaS5oPiAgICAvKiBodHRfdHhfc3RhdHVzICovCisKKyNpbmNsdWRlIDxvbF9jdHJsX3R4cnhfYXBpLmg+CisjaW5jbHVkZSA8b2xfdHhyeF90eXBlcy5oPiAgICAgIC8qIG9sX3R4cnhfdmRldl90LCBldGMgKi8KKyNpbmNsdWRlIDxvbF90eF9kZXNjLmg+ICAgICAgICAgLyogb2xfdHhfZGVzY19maW5kLCBvbF90eF9kZXNjX2ZyYW1lX2ZyZWUgKi8KKyNpZmRlZiBRQ0FfQ09NUFVURV9UWF9ERUxBWQorI2VuZGlmCisjaW5jbHVkZSA8b2xfdHhyeF9pbnRlcm5hbC5oPiAgIC8qIE9MX1RYX0RFU0NfTk9fUkVGUywgZXRjLiAqLworI2luY2x1ZGUgPG9sX29zaWZfdHhyeF9hcGkuaD4KKyNpbmNsdWRlIDxvbF90eC5oPiAgICAgICAgICAgICAgLyogb2xfdHhfcmVpbmplY3QgKi8KKworI2luY2x1ZGUgPG9sX2NmZy5oPiAgICAgICAgICAgICAvKiBvbF9jZmdfaXNfaGlnaF9sYXRlbmN5ICovCisjaWZkZWYgUUNBX1NVUFBPUlRfU1dfVFhSWF9FTkNBUAorI2luY2x1ZGUgPG9sX3R4cnhfZW5jYXAuaD4gICAgICAvKiBPTF9UWF9SRVNUT1JFX0hEUiwgZXRjICovCisjZW5kaWYKKworI2lmZGVmIFRYX0NSRURJVF9SRUNMQUlNX1NVUFBPUlQKKworI2RlZmluZSBPTF9UWF9DUkVESVRfUkVDTEFJTShwZGV2KQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGNkZl9hdG9taWNfcmVhZCgmcGRldi0+dGFyZ2V0X3R4X2NyZWRpdCkgIDwJCVwKKwkJICAgIG9sX2NmZ190eF9jcmVkaXRfbHdtKHBkZXYtPmN0cmxfcGRldikpIHsJCVwKKwkJCW9sX29zaWZfYXRoX3Rhc2tsZXQocGRldi0+b3NkZXYpOwkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZWxzZQorCisjZGVmaW5lIE9MX1RYX0NSRURJVF9SRUNMQUlNKHBkZXYpCisKKyNlbmRpZiAvKiBUWF9DUkVESVRfUkVDTEFJTV9TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFRYX0NSRURJVF9SRUNMQUlNX1NVUFBPUlQpCisvKgorICogSEwgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiB0aGUgYW1vdW50IG9mIGNyZWRpdCBhdmFpbGFibGUgdG8gZG93bmxvYWQKKyAqIHR4IGZyYW1lcyB0byB0aGUgdGFyZ2V0IC0gdGhlIGRvd25sb2FkIHNjaGVkdWxlciBkZWNpZGVzIHdoZW4gdG8KKyAqIGRvd25sb2FkIGZyYW1lcywgYW5kIHdoaWNoIGZyYW1lcyB0byBkb3dubG9hZCwgYmFzZWQgb24gdGhlIGNyZWRpdAorICogYXZhaWxhYmlsaXR5LgorICogTEwgc3lzdGVtcyB0aGF0IHVzZSBUWF9DUkVESVRfUkVDTEFJTV9TVVBQT1JUIGFsc28gbmVlZCB0byBrZWVwIHRyYWNrCisgKiBvZiB0aGUgdGFyZ2V0X3R4X2NyZWRpdCwgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gcG9sbCBmb3IgdHggY29tcGxldGlvbgorICogbWVzc2FnZXMuCisgKi8KKyNkZWZpbmUgT0xfVFhfVEFSR0VUX0NSRURJVF9BREpVU1QoZmFjdG9yLCBwZGV2LCBtc2R1KSBcCisJY2RmX2F0b21pY19hZGQoCVwKKwkJZmFjdG9yICogaHR0X3R4X21zZHVfY3JlZGl0KG1zZHUpLCAmcGRldi0+dGFyZ2V0X3R4X2NyZWRpdCkKKyNkZWZpbmUgT0xfVFhfVEFSR0VUX0NSRURJVF9ERUNSKHBkZXYsIG1zZHUpIFwKKwlPTF9UWF9UQVJHRVRfQ1JFRElUX0FESlVTVCgtMSwgcGRldiwgbXNkdSkKKyNkZWZpbmUgT0xfVFhfVEFSR0VUX0NSRURJVF9JTkNSKHBkZXYsIG1zZHUpIFwKKwlPTF9UWF9UQVJHRVRfQ1JFRElUX0FESlVTVCgxLCBwZGV2LCBtc2R1KQorI2RlZmluZSBPTF9UWF9UQVJHRVRfQ1JFRElUX0RFQ1JfSU5UKHBkZXYsIGRlbHRhKSBcCisJY2RmX2F0b21pY19hZGQoLTEgKiBkZWx0YSwgJnBkZXYtPnRhcmdldF90eF9jcmVkaXQpCisjZGVmaW5lIE9MX1RYX1RBUkdFVF9DUkVESVRfSU5DUl9JTlQocGRldiwgZGVsdGEpIFwKKwljZGZfYXRvbWljX2FkZChkZWx0YSwgJnBkZXYtPnRhcmdldF90eF9jcmVkaXQpCisjZWxzZQorLyoKKyAqIExMIGRvZXMgbm90IG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0YXJnZXQgY3JlZGl0LgorICogU2luY2UgdGhlIGhvc3QgdHggZGVzY3JpcHRvciBwb29sIHNpemUgbWF0Y2hlcyB0aGUgdGFyZ2V0J3MsCisgKiB3ZSBrbm93IHRoZSB0YXJnZXQgaGFzIHNwYWNlIGZvciB0aGUgbmV3IHR4IGZyYW1lIGlmIHRoZSBob3N0J3MKKyAqIHR4IGRlc2NyaXB0b3IgYWxsb2NhdGlvbiBzdWNjZWVkZWQuCisgKi8KKyNkZWZpbmUgT0xfVFhfVEFSR0VUX0NSRURJVF9BREpVU1QoZmFjdG9yLCBwZGV2LCBtc2R1KSAgLyogbm8tb3AgKi8KKyNkZWZpbmUgT0xfVFhfVEFSR0VUX0NSRURJVF9ERUNSKHBkZXYsIG1zZHUpICAgIC8qIG5vLW9wICovCisjZGVmaW5lIE9MX1RYX1RBUkdFVF9DUkVESVRfSU5DUihwZGV2LCBtc2R1KSAgICAvKiBuby1vcCAqLworI2RlZmluZSBPTF9UWF9UQVJHRVRfQ1JFRElUX0RFQ1JfSU5UKHBkZXYsIGRlbHRhKSAgICAgICAvKiBuby1vcCAqLworI2RlZmluZSBPTF9UWF9UQVJHRVRfQ1JFRElUX0lOQ1JfSU5UKHBkZXYsIGRlbHRhKSAgICAgICAvKiBuby1vcCAqLworI2VuZGlmCisKKyNpZmRlZiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTAorI2RlZmluZSBPTF9UWF9GTE9XX0NUX1VOUEFVU0VfT1NfUShwZGV2KQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXY7CQkJCVwKKwkJVEFJTFFfRk9SRUFDSCh2ZGV2LCAmcGRldi0+dmRldl9saXN0LCB2ZGV2X2xpc3RfZWxlbSkgewlcCisJCQlpZiAoY2RmX2F0b21pY19yZWFkKCZ2ZGV2LT5vc19xX3BhdXNlZCkgJiYJXAorCQkJICAgICh2ZGV2LT50eF9mbF9od20gIT0gMCkpIHsJCQlcCisJCQkJY2RmX3NwaW5fbG9jaygmcGRldi0+dHhfbXV0ZXgpOwkJXAorCQkJCWlmIChwZGV2LT50eF9kZXNjLm51bV9mcmVlID4JCVwKKwkJCQkgICAgdmRldi0+dHhfZmxfaHdtKSB7CQkJXAorCQkJCQljZGZfYXRvbWljX3NldCgmdmRldi0+b3NfcV9wYXVzZWQsIDApOyBcCisJCQkJCWNkZl9zcGluX3VubG9jaygmcGRldi0+dHhfbXV0ZXgpOyBcCisJCQkJCW9sX3R4cnhfZmxvd19jb250cm9sX2NiKHZkZXYsIHRydWUpO1wKKwkJCQl9CQkJCQlcCisJCQkJZWxzZSB7CQkJCQlcCisJCQkJCWNkZl9zcGluX3VubG9jaygmcGRldi0+dHhfbXV0ZXgpOyBcCisJCQkJfQkJCQkJXAorCQkJfQkJCQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIE9MX1RYX0ZMT1dfQ1RfVU5QQVVTRV9PU19RKHBkZXYpCisjZW5kaWYgLyogUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wgKi8KKworc3RhdGljIGlubGluZSB1aW50MTZfdAorb2xfdHhfc2VuZF9iYXNlKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYywgY2RmX25idWZfdCBtc2R1KQoreworCWludCBtc2R1X2NyZWRpdF9jb25zdW1lZDsKKworCVRYX0NSRURJVF9ERUJVR19QUklOVCgiVFggJWQgYnl0ZXNcbiIsIGNkZl9uYnVmX2xlbihtc2R1KSk7CisJVFhfQ1JFRElUX0RFQlVHX1BSSU5UKCIgPEhUVD4gRGVjcmVhc2UgY3JlZGl0ICVkIC0gMSA9ICVkLCBsZW46JWQuXG4iLAorCQkJICAgICAgY2RmX2F0b21pY19yZWFkKCZwZGV2LT50YXJnZXRfdHhfY3JlZGl0KSwKKwkJCSAgICAgIGNkZl9hdG9taWNfcmVhZCgmcGRldi0+dGFyZ2V0X3R4X2NyZWRpdCkgLSAxLAorCQkJICAgICAgY2RmX25idWZfbGVuKG1zZHUpKTsKKworCW1zZHVfY3JlZGl0X2NvbnN1bWVkID0gaHR0X3R4X21zZHVfY3JlZGl0KG1zZHUpOworCU9MX1RYX1RBUkdFVF9DUkVESVRfREVDUl9JTlQocGRldiwgbXNkdV9jcmVkaXRfY29uc3VtZWQpOworCU9MX1RYX0NSRURJVF9SRUNMQUlNKHBkZXYpOworCisJLyoKKwkgKiBXaGVuIHRoZSB0eCBmcmFtZSBpcyBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQsIHRoZXJlIGFyZSB0d28KKwkgKiBvdXRzdGFuZGluZyByZWZlcmVuY2VzOgorCSAqIDEuICBUaGUgaG9zdCBkb3dubG9hZCBTVyAoSFRULCBIVEMsIEhJRikKKwkgKiAgICAgVGhpcyByZWZlcmVuY2UgaXMgY2xlYXJlZCBieSB0aGUgb2xfdHhfc2VuZF9kb25lIGNhbGxiYWNrCisJICogICAgIGZ1bmN0aW9ucy4KKwkgKiAyLiAgVGhlIHRhcmdldCBGVworCSAqICAgICBUaGlzIHJlZmVyZW5jZSBpcyBjbGVhcmVkIGJ5IHRoZSBvbF90eF9jb21wbGV0aW9uX2hhbmRsZXIKKwkgKiAgICAgZnVuY3Rpb24uCisJICogSXQgaXMgZXh0cmVtZWx5IHByb2JhYmxlIHRoYXQgdGhlIGRvd25sb2FkIGNvbXBsZXRpb24gaXMgcHJvY2Vzc2VkCisJICogYmVmb3JlIHRoZSB0eCBjb21wbGV0aW9uIG1lc3NhZ2UuICBIb3dldmVyLCB1bmRlciBleGNlcHRpb25hbAorCSAqIGNvbmRpdGlvbnMgdGhlIHR4IGNvbXBsZXRpb24gbWF5IGJlIHByb2Nlc3NlZCBmaXJzdC4gIFRodXMsIHJhdGhlcgorCSAqIHRoYXQgYXNzdW1pbmcgdGhhdCByZWZlcmVuY2UgKDEpIGlzIGRvbmUgYmVmb3JlIHJlZmVyZW5jZSAoMiksCisJICogZXhwbGljaXQgcmVmZXJlbmNlIHRyYWNraW5nIGlzIG5lZWRlZC4KKwkgKiBEb3VibGUtaW5jcmVtZW50IHRoZSByZWYgY291bnQgdG8gYWNjb3VudCBmb3IgYm90aCByZWZlcmVuY2VzCisJICogZGVzY3JpYmVkIGFib3ZlLgorCSAqLworCisJT0xfVFhfREVTQ19SRUZfSU5JVCh0eF9kZXNjKTsKKwlPTF9UWF9ERVNDX1JFRl9JTkModHhfZGVzYyk7CisJT0xfVFhfREVTQ19SRUZfSU5DKHR4X2Rlc2MpOworCisJcmV0dXJuIG1zZHVfY3JlZGl0X2NvbnN1bWVkOworfQorCit2b2lkCitvbF90eF9zZW5kKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkgICBzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjLCBjZGZfbmJ1Zl90IG1zZHUpCit7CisJaW50IG1zZHVfY3JlZGl0X2NvbnN1bWVkOworCXVpbnQxNl90IGlkOworCWludCBmYWlsZWQ7CisKKwltc2R1X2NyZWRpdF9jb25zdW1lZCA9IG9sX3R4X3NlbmRfYmFzZShwZGV2LCB0eF9kZXNjLCBtc2R1KTsKKwlpZCA9IG9sX3R4X2Rlc2NfaWQocGRldiwgdHhfZGVzYyk7CisJTkJVRl9VUERBVEVfVFhfUEtUX0NPVU5UKG1zZHUsIE5CVUZfVFhfUEtUX1RYUlgpOworCURQVFJBQ0UoY2RmX2RwX3RyYWNlKG1zZHUsIENERl9EUF9UUkFDRV9UWFJYX1BBQ0tFVF9QVFJfUkVDT1JELAorCQkJCSh1aW50OF90ICopKGNkZl9uYnVmX2RhdGEobXNkdSkpLAorCQkJCXNpemVvZihjZGZfbmJ1Zl9kYXRhKG1zZHUpKSkpOworCWZhaWxlZCA9IGh0dF90eF9zZW5kX3N0ZChwZGV2LT5odHRfcGRldiwgbXNkdSwgaWQpOworCWlmIChjZGZfdW5saWtlbHkoZmFpbGVkKSkgeworCQlPTF9UWF9UQVJHRVRfQ1JFRElUX0lOQ1JfSU5UKHBkZXYsIG1zZHVfY3JlZGl0X2NvbnN1bWVkKTsKKwkJb2xfdHhfZGVzY19mcmFtZV9mcmVlX25vbnN0ZChwZGV2LCB0eF9kZXNjLCAxIC8qIGhhZCBlcnJvciAqLyk7CisJfQorfQorCit2b2lkCitvbF90eF9zZW5kX2JhdGNoKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJIGNkZl9uYnVmX3QgaGVhZF9tc2R1LCBpbnQgbnVtX21zZHVzKQoreworCWNkZl9uYnVmX3QgcmVqZWN0ZWQ7CisJT0xfVFhfQ1JFRElUX1JFQ0xBSU0ocGRldik7CisKKwlyZWplY3RlZCA9IGh0dF90eF9zZW5kX2JhdGNoKHBkZXYtPmh0dF9wZGV2LCBoZWFkX21zZHUsIG51bV9tc2R1cyk7CisJd2hpbGUgKGNkZl91bmxpa2VseShyZWplY3RlZCkpIHsKKwkJc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYzsKKwkJdWludDE2X3QgKm1zZHVfaWRfc3RvcmFnZTsKKwkJY2RmX25idWZfdCBuZXh0OworCisJCW5leHQgPSBjZGZfbmJ1Zl9uZXh0KHJlamVjdGVkKTsKKwkJbXNkdV9pZF9zdG9yYWdlID0gb2xfdHhfbXNkdV9pZF9zdG9yYWdlKHJlamVjdGVkKTsKKwkJdHhfZGVzYyA9IG9sX3R4X2Rlc2NfZmluZChwZGV2LCAqbXNkdV9pZF9zdG9yYWdlKTsKKworCQlPTF9UWF9UQVJHRVRfQ1JFRElUX0lOQ1IocGRldiwgcmVqZWN0ZWQpOworCQlvbF90eF9kZXNjX2ZyYW1lX2ZyZWVfbm9uc3RkKHBkZXYsIHR4X2Rlc2MsIDEgLyogaGFkIGVycm9yICovKTsKKworCQlyZWplY3RlZCA9IG5leHQ7CisJfQorfQorCit2b2lkCitvbF90eF9zZW5kX25vbnN0ZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCSAgc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYywKKwkJICBjZGZfbmJ1Zl90IG1zZHUsIGVudW0gaHR0X3BrdF90eXBlIHBrdF90eXBlKQoreworCWludCBtc2R1X2NyZWRpdF9jb25zdW1lZDsKKwl1aW50MTZfdCBpZDsKKwlpbnQgZmFpbGVkOworCisJbXNkdV9jcmVkaXRfY29uc3VtZWQgPSBvbF90eF9zZW5kX2Jhc2UocGRldiwgdHhfZGVzYywgbXNkdSk7CisJaWQgPSBvbF90eF9kZXNjX2lkKHBkZXYsIHR4X2Rlc2MpOworCU5CVUZfVVBEQVRFX1RYX1BLVF9DT1VOVChtc2R1LCBOQlVGX1RYX1BLVF9UWFJYKTsKKwlmYWlsZWQgPSBodHRfdHhfc2VuZF9ub25zdGQocGRldi0+aHR0X3BkZXYsIG1zZHUsIGlkLCBwa3RfdHlwZSk7CisJaWYgKGZhaWxlZCkgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJICAgIkVycm9yOiBmcmVlaW5nIHR4IGZyYW1lIGFmdGVyIGh0dF90eCBmYWlsZWQiKTsKKwkJT0xfVFhfVEFSR0VUX0NSRURJVF9JTkNSX0lOVChwZGV2LCBtc2R1X2NyZWRpdF9jb25zdW1lZCk7CisJCW9sX3R4X2Rlc2NfZnJhbWVfZnJlZV9ub25zdGQocGRldiwgdHhfZGVzYywgMSAvKiBoYWQgZXJyb3IgKi8pOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitvbF90eF9kb3dubG9hZF9kb25lX2Jhc2Uoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJIEFfU1RBVFVTIHN0YXR1cywgY2RmX25idWZfdCBtc2R1LCB1aW50MTZfdCBtc2R1X2lkKQoreworCXN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2M7CisKKwl0eF9kZXNjID0gb2xfdHhfZGVzY19maW5kKHBkZXYsIG1zZHVfaWQpOworCWNkZl9hc3NlcnQodHhfZGVzYyk7CisKKwkvKgorCSAqIElmIHRoZSBkb3dubG9hZCBpcyBkb25lIGZvcgorCSAqIHRoZSBNYW5hZ2VtZW50IGZyYW1lIHRoZW4KKwkgKiBjYWxsIHRoZSBkb3dubG9hZCBjYWxsYmFjayBpZiByZWdpc3RlcmVkCisJICovCisJaWYgKHR4X2Rlc2MtPnBrdF90eXBlID49IE9MX1RYUlhfTUdNVF9UWVBFX0JBU0UpIHsKKwkJaW50IHR4X21nbXRfaW5kZXggPSB0eF9kZXNjLT5wa3RfdHlwZSAtIE9MX1RYUlhfTUdNVF9UWVBFX0JBU0U7CisJCW9sX3R4cnhfbWdtdF90eF9jYiBkb3dubG9hZF9jYiA9CisJCQlwZGV2LT50eF9tZ210LmNhbGxiYWNrc1t0eF9tZ210X2luZGV4XS5kb3dubG9hZF9jYjsKKworCQlpZiAoZG93bmxvYWRfY2IpIHsKKwkJCWRvd25sb2FkX2NiKHBkZXYtPnR4X21nbXQuY2FsbGJhY2tzW3R4X21nbXRfaW5kZXhdLmN0eHQsCisJCQkJICAgIHR4X2Rlc2MtPm5ldGJ1Ziwgc3RhdHVzICE9IEFfT0spOworCQl9CisJfQorCisJaWYgKHN0YXR1cyAhPSBBX09LKSB7CisJCU9MX1RYX1RBUkdFVF9DUkVESVRfSU5DUihwZGV2LCBtc2R1KTsKKwkJb2xfdHhfZGVzY19mcmFtZV9mcmVlX25vbnN0ZChwZGV2LCB0eF9kZXNjLAorCQkJCQkgICAgIDEgLyogZG93bmxvYWQgZXJyICovKTsKKwl9IGVsc2UgeworCQlpZiAoT0xfVFhfREVTQ19OT19SRUZTKHR4X2Rlc2MpKSB7CisJCQkvKgorCQkJICogVGhlIGRlY3JlbWVudGVkIHZhbHVlIHdhcyB6ZXJvIC0gZnJlZSB0aGUgZnJhbWUuCisJCQkgKiBVc2UgdGhlIHR4IHN0YXR1cyByZWNvcmRlZCBwcmV2aW91c2x5IGR1cmluZworCQkJICogdHggY29tcGxldGlvbiBoYW5kbGluZy4KKwkJCSAqLworCQkJb2xfdHhfZGVzY19mcmFtZV9mcmVlX25vbnN0ZChwZGV2LCB0eF9kZXNjLAorCQkJCQkJICAgICB0eF9kZXNjLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgaHR0X3R4X3N0YXR1c19vayk7CisJCX0KKwl9Cit9CisKK3ZvaWQKK29sX3R4X2Rvd25sb2FkX2RvbmVfbGwodm9pZCAqcGRldiwKKwkJICAgICAgIEFfU1RBVFVTIHN0YXR1cywgY2RmX25idWZfdCBtc2R1LCB1aW50MTZfdCBtc2R1X2lkKQoreworCW9sX3R4X2Rvd25sb2FkX2RvbmVfYmFzZSgoc3RydWN0IG9sX3R4cnhfcGRldl90ICopcGRldiwgc3RhdHVzLCBtc2R1LAorCQkJCSBtc2R1X2lkKTsKK30KKwordm9pZAorb2xfdHhfZG93bmxvYWRfZG9uZV9obF9yZXRhaW4odm9pZCAqdHhyeF9wZGV2LAorCQkJICAgICAgQV9TVEFUVVMgc3RhdHVzLAorCQkJICAgICAgY2RmX25idWZfdCBtc2R1LCB1aW50MTZfdCBtc2R1X2lkKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHR4cnhfcGRldjsKKwlvbF90eF9kb3dubG9hZF9kb25lX2Jhc2UocGRldiwgc3RhdHVzLCBtc2R1LCBtc2R1X2lkKTsKK30KKwordm9pZAorb2xfdHhfZG93bmxvYWRfZG9uZV9obF9mcmVlKHZvaWQgKnR4cnhfcGRldiwKKwkJCSAgICBBX1NUQVRVUyBzdGF0dXMsIGNkZl9uYnVmX3QgbXNkdSwgdWludDE2X3QgbXNkdV9pZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSB0eHJ4X3BkZXY7CisJc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYzsKKworCXR4X2Rlc2MgPSBvbF90eF9kZXNjX2ZpbmQocGRldiwgbXNkdV9pZCk7CisJY2RmX2Fzc2VydCh0eF9kZXNjKTsKKworCW9sX3R4X2Rvd25sb2FkX2RvbmVfYmFzZShwZGV2LCBzdGF0dXMsIG1zZHUsIG1zZHVfaWQpOworCisJaWYgKCh0eF9kZXNjLT5wa3RfdHlwZSAhPSBvbF90eF9mcm1fbm9fZnJlZSkgJiYKKwkgICAgKHR4X2Rlc2MtPnBrdF90eXBlIDwgT0xfVFhSWF9NR01UX1RZUEVfQkFTRSkpIHsKKwkJY2RmX2F0b21pY19hZGQoMSwgJnBkZXYtPnR4X3F1ZXVlLnJzcmNfY250KTsKKwkJb2xfdHhfZGVzY19mcmFtZV9mcmVlX25vbnN0ZChwZGV2LCB0eF9kZXNjLCBzdGF0dXMgIT0gQV9PSyk7CisJfQorfQorCit2b2lkIG9sX3R4X3RhcmdldF9jcmVkaXRfaW5pdChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsIGludCBjcmVkaXRfZGVsdGEpCit7CisJY2RmX2F0b21pY19hZGQoY3JlZGl0X2RlbHRhLCAmcGRldi0+b3JpZ190YXJnZXRfdHhfY3JlZGl0KTsKK30KKwordm9pZCBvbF90eF90YXJnZXRfY3JlZGl0X3VwZGF0ZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsIGludCBjcmVkaXRfZGVsdGEpCit7CisJVFhfQ1JFRElUX0RFQlVHX1BSSU5UKCIgPEhUVD4gSW5jcmVhc2UgY3JlZGl0ICVkICsgJWQgPSAlZFxuIiwKKwkJCSAgICAgIGNkZl9hdG9taWNfcmVhZCgmcGRldi0+dGFyZ2V0X3R4X2NyZWRpdCksCisJCQkgICAgICBjcmVkaXRfZGVsdGEsCisJCQkgICAgICBjZGZfYXRvbWljX3JlYWQoJnBkZXYtPnRhcmdldF90eF9jcmVkaXQpICsKKwkJCSAgICAgIGNyZWRpdF9kZWx0YSk7CisJY2RmX2F0b21pY19hZGQoY3JlZGl0X2RlbHRhLCAmcGRldi0+dGFyZ2V0X3R4X2NyZWRpdCk7Cit9CisKKyNpZmRlZiBRQ0FfQ09NUFVURV9UWF9ERUxBWQorCitzdGF0aWMgdm9pZAorb2xfdHhfZGVsYXlfY29tcHV0ZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCSAgICBlbnVtIGh0dF90eF9zdGF0dXMgc3RhdHVzLAorCQkgICAgdWludDE2X3QgKmRlc2NfaWRzLCBpbnQgbnVtX21zZHVzKTsKKyNkZWZpbmUgT0xfVFhfREVMQVlfQ09NUFVURSBvbF90eF9kZWxheV9jb21wdXRlCisjZWxzZQorI2RlZmluZSBPTF9UWF9ERUxBWV9DT01QVVRFKHBkZXYsIHN0YXR1cywgZGVzY19pZHMsIG51bV9tc2R1cykgIC8qIG5vLW9wICovCisjZW5kaWYgLyogUUNBX0NPTVBVVEVfVFhfREVMQVkgKi8KKworI2lmbmRlZiBPTF9UWF9SRVNUT1JFX0hEUgorI2RlZmluZSBPTF9UWF9SRVNUT1JFX0hEUihfX3R4X2Rlc2MsIF9fbXNkdSkKKyNlbmRpZgorLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNvdWxkIGhhdmUgYmVlbiBpbmxpbmUgZnVuY3Rpb25zIHRvby4KKyAqIFRoZSBvbmx5IHJhdGlvbmFsZSBmb3IgY2hvb3NpbmcgbWFjcm9zLCBpcyB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gaW5saW5lCisgKiB0aGUgaW1wbGVtZW50YXRpb24sIHdoaWNoIGNhbm5vdCBiZSBjb250cm9sbGVkIGZvciBhY3R1YWwgImlubGluZSIgZnVuY3Rpb25zLAorICogc2luY2UgImlubGluZSIgaXMgb25seSBhIGhpbnQgdG8gdGhlIGNvbXBpbGVyLgorICogSW4gdGhlIHBlcmZvcm1hbmNlIHBhdGgsIHdlIGNob29zZSB0byBmb3JjZSB0aGUgaW5saW5pbmcsIGluIHByZWZlcmVuY2UgdG8KKyAqIHR5cGUtY2hlY2tpbmcgb2ZmZXJlZCBieSB0aGUgYWN0dWFsIGlubGluZWQgZnVuY3Rpb25zLgorICovCisjZGVmaW5lIG9sX3R4X21zZHVfY29tcGxldGVfYmF0Y2goX3BkZXYsIF90eF9kZXNjLCBfdHhfZGVzY3MsIF9zdGF0dXMpIFwKKwlUQUlMUV9JTlNFUlRfVEFJTCgmKF90eF9kZXNjcyksIChfdHhfZGVzYyksIHR4X2Rlc2NfbGlzdF9lbGVtKQorI2lmbmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKKyNkZWZpbmUgb2xfdHhfbXNkdV9jb21wbGV0ZV9zaW5nbGUoX3BkZXYsIF90eF9kZXNjLCBfbmV0YnVmLFwKKwkJCQkgICBfbGNsX2ZyZWVsaXN0LCBfdHhfZGVzY19sYXN0KQlcCisJZG8gewkJCQkJCQkJXAorCQljZGZfYXRvbWljX2luaXQoJihfdHhfZGVzYyktPnJlZl9jbnQpOwkJCVwKKwkJLyogcmVzdG9yZSBvcmdpbmFsIGhkciBvZmZzZXQgKi8JCQlcCisJCU9MX1RYX1JFU1RPUkVfSERSKChfdHhfZGVzYyksIChfbmV0YnVmKSk7CQlcCisJCWNkZl9uYnVmX3VubWFwKChfcGRldiktPm9zZGV2LCAoX25ldGJ1ZiksIENERl9ETUFfVE9fREVWSUNFKTsgXAorCQljZGZfbmJ1Zl9mcmVlKChfbmV0YnVmKSk7CQkJCVwKKwkJKCh1bmlvbiBvbF90eF9kZXNjX2xpc3RfZWxlbV90ICopKF90eF9kZXNjKSktPm5leHQgPQlcCisJCQkoX2xjbF9mcmVlbGlzdCk7CQkJCVwKKwkJaWYgKGNkZl91bmxpa2VseSghbGNsX2ZyZWVsaXN0KSkgewkJCVwKKwkJCShfdHhfZGVzY19sYXN0KSA9ICh1bmlvbiBvbF90eF9kZXNjX2xpc3RfZWxlbV90ICopXAorCQkJCShfdHhfZGVzYyk7CQkJCVwKKwkJfQkJCQkJCQlcCisJCShfbGNsX2ZyZWVsaXN0KSA9ICh1bmlvbiBvbF90eF9kZXNjX2xpc3RfZWxlbV90ICopKF90eF9kZXNjKTsgXAorCX0gd2hpbGUgKDApCisjZWxzZSAgICAvKiFBVEhfMTFBQ19UWENPTVBBQ1QgKi8KKyNkZWZpbmUgb2xfdHhfbXNkdV9jb21wbGV0ZV9zaW5nbGUoX3BkZXYsIF90eF9kZXNjLCBfbmV0YnVmLFwKKwkJCQkgICBfbGNsX2ZyZWVsaXN0LCBfdHhfZGVzY19sYXN0KQlcCisJZG8gewkJCQkJCQkJXAorCQkvKiByZXN0b3JlIG9yZ2luYWwgaGRyIG9mZnNldCAqLwkJCVwKKwkJT0xfVFhfUkVTVE9SRV9IRFIoKF90eF9kZXNjKSwgKF9uZXRidWYpKTsJCVwKKwkJY2RmX25idWZfdW5tYXAoKF9wZGV2KS0+b3NkZXYsIChfbmV0YnVmKSwgQ0RGX0RNQV9UT19ERVZJQ0UpOyBcCisJCWNkZl9uYnVmX2ZyZWUoKF9uZXRidWYpKTsJCQkJXAorCQkoKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKikoX3R4X2Rlc2MpKS0+bmV4dCA9CVwKKwkJCShfbGNsX2ZyZWVsaXN0KTsJCQkJXAorCQlpZiAoY2RmX3VubGlrZWx5KCFsY2xfZnJlZWxpc3QpKSB7CQkJXAorCQkJKF90eF9kZXNjX2xhc3QpID0gKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKilcCisJCQkJKF90eF9kZXNjKTsJCQkJXAorCQl9CQkJCQkJCVwKKwkJKF9sY2xfZnJlZWxpc3QpID0gKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKikoX3R4X2Rlc2MpOyBcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIUFUSF8xMUFDX1RYQ09NUEFDVCAqLworCisjaWZkZWYgUUNBX1RYX1NJTkdMRV9DT01QTEVUSU9OUworI2lmZGVmIFFDQV9UWF9TVERfUEFUSF9PTkxZCisjZGVmaW5lIG9sX3R4X21zZHVfY29tcGxldGUoX3BkZXYsIF90eF9kZXNjLCBfdHhfZGVzY3MsCQkJXAorCQkJICAgIF9uZXRidWYsIF9sY2xfZnJlZWxpc3QsCQkJXAorCQkJICAgIF90eF9kZXNjX2xhc3QsIF9zdGF0dXMpCQkJXAorCW9sX3R4X21zZHVfY29tcGxldGVfc2luZ2xlKChfcGRldiksIChfdHhfZGVzYyksCQkJXAorCQkJCSAgIChfbmV0YnVmKSwgKF9sY2xfZnJlZWxpc3QpLAkJXAorCQkJCSAgIF90eF9kZXNjX2xhc3QpCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFRQ0FfVFhfU1REX1BBVEhfT05MWSAqLworI2RlZmluZSBvbF90eF9tc2R1X2NvbXBsZXRlKF9wZGV2LCBfdHhfZGVzYywgX3R4X2Rlc2NzLAkJCVwKKwkJCSAgICBfbmV0YnVmLCBfbGNsX2ZyZWVsaXN0LAkJCVwKKwkJCSAgICBfdHhfZGVzY19sYXN0LCBfc3RhdHVzKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChjZGZfbGlrZWx5KChfdHhfZGVzYyktPnBrdF90eXBlID09IG9sX3R4X2ZybV9zdGQpKSB7IFwKKwkJCW9sX3R4X21zZHVfY29tcGxldGVfc2luZ2xlKChfcGRldiksIChfdHhfZGVzYyksXAorCQkJCQkJICAgKF9uZXRidWYpLCAoX2xjbF9mcmVlbGlzdCksIFwKKwkJCQkJCSAgIChfdHhfZGVzY19sYXN0KSk7CVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlvbF90eF9kZXNjX2ZyYW1lX2ZyZWVfbm9uc3RkKAkJCVwKKwkJCQkoX3BkZXYpLCAoX3R4X2Rlc2MpLAkJCVwKKwkJCQkoX3N0YXR1cykgIT0gaHR0X3R4X3N0YXR1c19vayk7CQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisjZW5kaWYgLyogIVFDQV9UWF9TVERfUEFUSF9PTkxZICovCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFRQ0FfVFhfU0lOR0xFX0NPTVBMRVRJT05TICovCisjaWZkZWYgUUNBX1RYX1NURF9QQVRIX09OTFkKKyNkZWZpbmUgb2xfdHhfbXNkdV9jb21wbGV0ZShfcGRldiwgX3R4X2Rlc2MsIF90eF9kZXNjcywJCQlcCisJCQkgICAgX25ldGJ1ZiwgX2xjbF9mcmVlbGlzdCwJCQlcCisJCQkgICAgX3R4X2Rlc2NfbGFzdCwgX3N0YXR1cykJCQlcCisJb2xfdHhfbXNkdXNfY29tcGxldGVfYmF0Y2goKF9wZGV2KSwgKF90eF9kZXNjKSwgKF90eF9kZXNjcyksIChfc3RhdHVzKSkKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIVFDQV9UWF9TVERfUEFUSF9PTkxZICovCisjZGVmaW5lIG9sX3R4X21zZHVfY29tcGxldGUoX3BkZXYsIF90eF9kZXNjLCBfdHhfZGVzY3MsCQkJXAorCQkJICAgIF9uZXRidWYsIF9sY2xfZnJlZWxpc3QsCQkJXAorCQkJICAgIF90eF9kZXNjX2xhc3QsIF9zdGF0dXMpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGNkZl9saWtlbHkoKF90eF9kZXNjKS0+cGt0X3R5cGUgPT0gb2xfdHhfZnJtX3N0ZCkpIHsgXAorCQkJb2xfdHhfbXNkdV9jb21wbGV0ZV9iYXRjaCgoX3BkZXYpLCAoX3R4X2Rlc2MpLAlcCisJCQkJCQkgIChfdHhfZGVzY3MpLCAoX3N0YXR1cykpOyBcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJb2xfdHhfZGVzY19mcmFtZV9mcmVlX25vbnN0ZCgoX3BkZXYpLCAoX3R4X2Rlc2MpLCBcCisJCQkJCQkgICAgIChfc3RhdHVzKSAhPQlcCisJCQkJCQkgICAgIGh0dF90eF9zdGF0dXNfb2spOyBcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisjZW5kaWYgLyogIVFDQV9UWF9TVERfUEFUSF9PTkxZICovCisjZW5kaWYgLyogUUNBX1RYX1NJTkdMRV9DT01QTEVUSU9OUyAqLworCit2b2lkIG9sX3R4X2Rpc2NhcmRfdGFyZ2V0X2ZybXMob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KQoreworCWludCBpID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcGRldi0+dHhfZGVzYy5wb29sX3NpemU7IGkrKykgeworCisJCS8qCisJCSAqIENvbmZpcm0gdGhhdCBlYWNoIHR4IGRlc2NyaXB0b3IgaXMgImVtcHR5IiwgaS5lLiBpdCBoYXMKKwkJICogbm8gdHggZnJhbWUgYXR0YWNoZWQuCisJCSAqIEluIHBhcnRpY3VsYXIsIGNoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIGZyYW1lcyB0aGF0IGhhdmUKKwkJICogYmVlbiBnaXZlbiB0byB0aGUgdGFyZ2V0IHRvIHRyYW5zbWl0LCBmb3Igd2hpY2ggdGhlCisJCSAqIHRhcmdldCBoYXMgbmV2ZXIgcHJvdmlkZWQgYSByZXNwb25zZS4KKwkJICovCisJCWlmIChjZGZfYXRvbWljX3JlYWQoJnBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0udHhfZGVzYy5yZWZfY250KSkgeworCQkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX1dBUk4sCisJCQkJICAgIldhcm5pbmc6IGZyZWVpbmcgdHggZnJhbWUgIgorCQkJCSAgICIobm8gdHggY29tcGxldGlvbiBmcm9tIHRoZSB0YXJnZXQpXG4iKTsKKwkJCW9sX3R4X2Rlc2NfZnJhbWVfZnJlZV9ub25zdGQocGRldiwKKwkJCQkJCSAgICAgJnBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0uCisJCQkJCQkgICAgIHR4X2Rlc2MsIDEpOworCQl9CisJfQorfQorCit2b2lkIG9sX3R4X2NyZWRpdF9jb21wbGV0aW9uX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LCBpbnQgY3JlZGl0cykKK3sKKwlvbF90eF90YXJnZXRfY3JlZGl0X3VwZGF0ZShwZGV2LCBjcmVkaXRzKTsKKworCS8qIFVOUEFVU0UgT1MgUSAqLworCU9MX1RYX0ZMT1dfQ1RfVU5QQVVTRV9PU19RKHBkZXYpOworfQorCisvKiBXQVJOSU5HOiBvbF90eF9pbnNwZWN0X2hhbmRsZXIoKSdzIGJhaGF2aW9yIGlzIHNpbWlsYXIgdG8gdGhhdCBvZgorICAgb2xfdHhfY29tcGxldGlvbl9oYW5kbGVyKCkuCisgICAqIGFueSBjaGFuZ2UgaW4gb2xfdHhfY29tcGxldGlvbl9oYW5kbGVyKCkgbXVzdCBiZSBtaXJyb3JlZCBpbgorICAgb2xfdHhfaW5zcGVjdF9oYW5kbGVyKCkuCisqLwordm9pZAorb2xfdHhfY29tcGxldGlvbl9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCSBpbnQgbnVtX21zZHVzLAorCQkJIGVudW0gaHR0X3R4X3N0YXR1cyBzdGF0dXMsIHZvaWQgKnR4X2Rlc2NfaWRfaXRlcmF0b3IpCit7CisJaW50IGk7CisJdWludDE2X3QgKmRlc2NfaWRzID0gKHVpbnQxNl90ICopIHR4X2Rlc2NfaWRfaXRlcmF0b3I7CisJdWludDE2X3QgdHhfZGVzY19pZDsKKwlzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjOworCWNoYXIgKnRyYWNlX3N0cjsKKworCXVpbnQzMl90IGJ5dGVfY250ID0gMDsKKwl1bmlvbiBvbF90eF9kZXNjX2xpc3RfZWxlbV90ICp0ZF9hcnJheSA9IHBkZXYtPnR4X2Rlc2MuYXJyYXk7CisJY2RmX25idWZfdCBuZXRidWY7CisKKwl1bmlvbiBvbF90eF9kZXNjX2xpc3RfZWxlbV90ICpsY2xfZnJlZWxpc3QgPSBOVUxMOworCXVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKnR4X2Rlc2NfbGFzdCA9IE5VTEw7CisJb2xfdHhfZGVzY19saXN0IHR4X2Rlc2NzOworCVRBSUxRX0lOSVQoJnR4X2Rlc2NzKTsKKworCU9MX1RYX0RFTEFZX0NPTVBVVEUocGRldiwgc3RhdHVzLCBkZXNjX2lkcywgbnVtX21zZHVzKTsKKworCXRyYWNlX3N0ciA9IChzdGF0dXMpID8gIk9UOkM6RjoiIDogIk9UOkM6UzoiOworCWZvciAoaSA9IDA7IGkgPCBudW1fbXNkdXM7IGkrKykgeworCQl0eF9kZXNjX2lkID0gZGVzY19pZHNbaV07CisJCXR4X2Rlc2MgPSAmdGRfYXJyYXlbdHhfZGVzY19pZF0udHhfZGVzYzsKKwkJdHhfZGVzYy0+c3RhdHVzID0gc3RhdHVzOworCQluZXRidWYgPSB0eF9kZXNjLT5uZXRidWY7CisKKwkJY2RmX25idWZfdHJhY2VfdXBkYXRlKG5ldGJ1ZiwgdHJhY2Vfc3RyKTsKKwkJLyogUGVyIFNEVSB1cGRhdGUgb2YgYnl0ZSBjb3VudCAqLworCQlieXRlX2NudCArPSBjZGZfbmJ1Zl9sZW4obmV0YnVmKTsKKwkJaWYgKE9MX1RYX0RFU0NfTk9fUkVGUyh0eF9kZXNjKSkgeworCQkJb2xfdHhfc3RhdGlzdGljcygKKwkJCQlwZGV2LT5jdHJsX3BkZXYsCisJCQkJSFRUX1RYX0RFU0NfVkRFVl9JRF9HRVQoKigodWludDMyX3QgKikKKwkJCQkJCQkgICh0eF9kZXNjLT4KKwkJCQkJCQkgICBodHRfdHhfZGVzYykpKSwKKwkJCQlzdGF0dXMgIT0gaHR0X3R4X3N0YXR1c19vayk7CisJCQlvbF90eF9tc2R1X2NvbXBsZXRlKHBkZXYsIHR4X2Rlc2MsIHR4X2Rlc2NzLCBuZXRidWYsCisJCQkJCSAgICBsY2xfZnJlZWxpc3QsIHR4X2Rlc2NfbGFzdCwgc3RhdHVzKTsKKwkJfQorCQlOQlVGX1VQREFURV9UWF9QS1RfQ09VTlQobmV0YnVmLCBOQlVGX1RYX1BLVF9GUkVFKTsKKyNpZmRlZiBRQ0FfU1VQUE9SVF9UWERFU0NfU0FOSVRZX0NIRUNLUworCQl0eF9kZXNjLT5wa3RfdHlwZSA9IDB4ZmY7CisjaWZkZWYgUUNBX0NPTVBVVEVfVFhfREVMQVkKKwkJdHhfZGVzYy0+ZW50cnlfdGltZXN0YW1wX3RpY2tzID0gMHhmZmZmZmZmZjsKKyNlbmRpZgorI2VuZGlmCisJfQorCisJLyogT25lIHNob3QgcHJvdGVjdGVkIGFjY2VzcyB0byBwZGV2IGZyZWVsaXN0LCB3aGVuIHNldHVwICovCisJaWYgKGxjbF9mcmVlbGlzdCkgeworCQljZGZfc3Bpbl9sb2NrKCZwZGV2LT50eF9tdXRleCk7CisJCXR4X2Rlc2NfbGFzdC0+bmV4dCA9IHBkZXYtPnR4X2Rlc2MuZnJlZWxpc3Q7CisJCXBkZXYtPnR4X2Rlc2MuZnJlZWxpc3QgPSBsY2xfZnJlZWxpc3Q7CisJCXBkZXYtPnR4X2Rlc2MubnVtX2ZyZWUgKz0gKHVpbnQxNl90KSBudW1fbXNkdXM7CisJCWNkZl9zcGluX3VubG9jaygmcGRldi0+dHhfbXV0ZXgpOworCX0gZWxzZSB7CisJCW9sX3R4X2Rlc2NfZnJhbWVfbGlzdF9mcmVlKHBkZXYsICZ0eF9kZXNjcywKKwkJCQkJICAgc3RhdHVzICE9IGh0dF90eF9zdGF0dXNfb2spOworCX0KKworCU9MX1RYX1RBUkdFVF9DUkVESVRfQURKVVNUKG51bV9tc2R1cywgcGRldiwgTlVMTCk7CisKKwkvKiBVTlBBVVNFIE9TIFEgKi8KKwlPTF9UWF9GTE9XX0NUX1VOUEFVU0VfT1NfUShwZGV2KTsKKwkvKiBEbyBvbmUgc2hvdCBzdGF0aXN0aWNzICovCisJVFhSWF9TVEFUU19VUERBVEVfVFhfU1RBVFMocGRldiwgc3RhdHVzLCBudW1fbXNkdXMsIGJ5dGVfY250KTsKK30KKworLyoKKyAqIG9sX3R4X3NpbmdsZV9jb21wbGV0aW9uX2hhbmRsZXIgcGVyZm9ybXMgdGhlIHNhbWUgdHggY29tcGxldGlvbgorICogcHJvY2Vzc2luZyBhcyBvbF90eF9jb21wbGV0aW9uX2hhbmRsZXIsIGJ1dCBmb3IgYSBzaW5nbGUgZnJhbWUuCisgKiBvbF90eF9jb21wbGV0aW9uX2hhbmRsZXIgaXMgb3B0aW1pemVkIHRvIGhhbmRsZSBiYXRjaCBjb21wbGV0aW9ucworICogYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGU7IGluIGNvbnRyYXN0IG9sX3R4X3NpbmdsZV9jb21wbGV0aW9uX2hhbmRsZXIKKyAqIGhhbmRsZXMgc2luZ2xlIGZyYW1lcyBhcyBzaW1wbHkgYW5kIGdlbmVyYWxseSBhcyBwb3NzaWJsZS4KKyAqIFRodXMsIHRoaXMgb2xfdHhfc2luZ2xlX2NvbXBsZXRpb25faGFuZGxlciBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IKKyAqIGludGVybWl0dGVudCB1c2FnZSwgc3VjaCBhcyBmb3IgdHggbWdtdCBmcmFtZXMuCisgKi8KK3ZvaWQKK29sX3R4X3NpbmdsZV9jb21wbGV0aW9uX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCWVudW0gaHR0X3R4X3N0YXR1cyBzdGF0dXMsIHVpbnQxNl90IHR4X2Rlc2NfaWQpCit7CisJc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYzsKKwl1bmlvbiBvbF90eF9kZXNjX2xpc3RfZWxlbV90ICp0ZF9hcnJheSA9IHBkZXYtPnR4X2Rlc2MuYXJyYXk7CisJY2RmX25idWZfdCBuZXRidWY7CisKKwl0eF9kZXNjID0gJnRkX2FycmF5W3R4X2Rlc2NfaWRdLnR4X2Rlc2M7CisJdHhfZGVzYy0+c3RhdHVzID0gc3RhdHVzOworCW5ldGJ1ZiA9IHR4X2Rlc2MtPm5ldGJ1ZjsKKworCU5CVUZfVVBEQVRFX1RYX1BLVF9DT1VOVChuZXRidWYsIE5CVUZfVFhfUEtUX0ZSRUUpOworCS8qIERvIG9uZSBzaG90IHN0YXRpc3RpY3MgKi8KKwlUWFJYX1NUQVRTX1VQREFURV9UWF9TVEFUUyhwZGV2LCBzdGF0dXMsIDEsIGNkZl9uYnVmX2xlbihuZXRidWYpKTsKKworCWlmIChPTF9UWF9ERVNDX05PX1JFRlModHhfZGVzYykpIHsKKwkJb2xfdHhfZGVzY19mcmFtZV9mcmVlX25vbnN0ZChwZGV2LCB0eF9kZXNjLAorCQkJCQkgICAgIHN0YXR1cyAhPSBodHRfdHhfc3RhdHVzX29rKTsKKwl9CisKKwlUWF9DUkVESVRfREVCVUdfUFJJTlQoIiA8SFRUPiBJbmNyZWFzZSBjcmVkaXQgJWQgKyAlZCA9ICVkXG4iLAorCQkJICAgICAgY2RmX2F0b21pY19yZWFkKCZwZGV2LT50YXJnZXRfdHhfY3JlZGl0KSwKKwkJCSAgICAgIDEsIGNkZl9hdG9taWNfcmVhZCgmcGRldi0+dGFyZ2V0X3R4X2NyZWRpdCkgKyAxKTsKKworCisJY2RmX2F0b21pY19hZGQoMSwgJnBkZXYtPnRhcmdldF90eF9jcmVkaXQpOworfQorCisvKiBXQVJOSU5HOiBvbF90eF9pbnNwZWN0X2hhbmRsZXIoKSdzIGJhaGF2aW9yIGlzIHNpbWlsYXIgdG8gdGhhdCBvZgorICAgb2xfdHhfY29tcGxldGlvbl9oYW5kbGVyKCkuCisgKiBhbnkgY2hhbmdlIGluIG9sX3R4X2NvbXBsZXRpb25faGFuZGxlcigpIG11c3QgYmUgbWlycm9yZWQgaGVyZS4KKyAqLwordm9pZAorb2xfdHhfaW5zcGVjdF9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJICAgICAgaW50IG51bV9tc2R1cywgdm9pZCAqdHhfZGVzY19pZF9pdGVyYXRvcikKK3sKKwl1aW50MTZfdCB2ZGV2X2lkLCBpOworCXN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldjsKKwl1aW50MTZfdCAqZGVzY19pZHMgPSAodWludDE2X3QgKikgdHhfZGVzY19pZF9pdGVyYXRvcjsKKwl1aW50MTZfdCB0eF9kZXNjX2lkOworCXN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2M7CisJdW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCAqdGRfYXJyYXkgPSBwZGV2LT50eF9kZXNjLmFycmF5OworCXVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKmxjbF9mcmVlbGlzdCA9IE5VTEw7CisJdW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCAqdHhfZGVzY19sYXN0ID0gTlVMTDsKKwljZGZfbmJ1Zl90IG5ldGJ1ZjsKKwlvbF90eF9kZXNjX2xpc3QgdHhfZGVzY3M7CisJVEFJTFFfSU5JVCgmdHhfZGVzY3MpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9tc2R1czsgaSsrKSB7CisJCXR4X2Rlc2NfaWQgPSBkZXNjX2lkc1tpXTsKKwkJdHhfZGVzYyA9ICZ0ZF9hcnJheVt0eF9kZXNjX2lkXS50eF9kZXNjOworCQluZXRidWYgPSB0eF9kZXNjLT5uZXRidWY7CisKKwkJLyogZmluZCB0aGUgInZkZXYiIHRoaXMgdHhfZGVzYyBiZWxvbmdzIHRvICovCisJCXZkZXZfaWQgPSBIVFRfVFhfREVTQ19WREVWX0lEX0dFVCgqKCh1aW50MzJfdCAqKQorCQkJCQkJICAgICh0eF9kZXNjLT5odHRfdHhfZGVzYykpKTsKKwkJVEFJTFFfRk9SRUFDSCh2ZGV2LCAmcGRldi0+dmRldl9saXN0LCB2ZGV2X2xpc3RfZWxlbSkgeworCQkJaWYgKHZkZXYtPnZkZXZfaWQgPT0gdmRldl9pZCkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIHZkZXYgbm93IHBvaW50cyB0byB0aGUgdmRldiBmb3IgdGhpcyBkZXNjcmlwdG9yLiAqLworCisjaWZuZGVmIEFUSF8xMUFDX1RYQ09NUEFDVAorCQkvKiBzYXZlIHRoaXMgbXVsdGljYXN0IHBhY2tldCB0byBsb2NhbCBmcmVlIGxpc3QgKi8KKwkJaWYgKGNkZl9hdG9taWNfZGVjX2FuZF90ZXN0KCZ0eF9kZXNjLT5yZWZfY250KSkKKyNlbmRpZgorCQl7CisJCQkvKiBmb3IgdGhpcyBmdW5jdGlvbiBvbmx5LCBmb3JjZSBodHQgc3RhdHVzIHRvIGJlCisJCQkgICAiaHR0X3R4X3N0YXR1c19vayIKKwkJCSAqIGZvciBncmFjZWZ1bCBmcmVlaW5nIG9mIHRoaXMgbXVsdGljYXN0IGZyYW1lCisJCQkgKi8KKwkJCW9sX3R4X21zZHVfY29tcGxldGUocGRldiwgdHhfZGVzYywgdHhfZGVzY3MsIG5ldGJ1ZiwKKwkJCQkJICAgIGxjbF9mcmVlbGlzdCwgdHhfZGVzY19sYXN0LAorCQkJCQkgICAgaHR0X3R4X3N0YXR1c19vayk7CisJCX0KKwl9CisKKwlpZiAobGNsX2ZyZWVsaXN0KSB7CisJCWNkZl9zcGluX2xvY2soJnBkZXYtPnR4X211dGV4KTsKKwkJdHhfZGVzY19sYXN0LT5uZXh0ID0gcGRldi0+dHhfZGVzYy5mcmVlbGlzdDsKKwkJcGRldi0+dHhfZGVzYy5mcmVlbGlzdCA9IGxjbF9mcmVlbGlzdDsKKwkJY2RmX3NwaW5fdW5sb2NrKCZwZGV2LT50eF9tdXRleCk7CisJfSBlbHNlIHsKKwkJb2xfdHhfZGVzY19mcmFtZV9saXN0X2ZyZWUocGRldiwgJnR4X2Rlc2NzLAorCQkJCQkgICBodHRfdHhfc3RhdHVzX2Rpc2NhcmQpOworCX0KKwlUWF9DUkVESVRfREVCVUdfUFJJTlQoIiA8SFRUPiBJbmNyZWFzZSBIVFQgY3JlZGl0ICVkICsgJWQgPSAlZC4uXG4iLAorCQkJICAgICAgY2RmX2F0b21pY19yZWFkKCZwZGV2LT50YXJnZXRfdHhfY3JlZGl0KSwKKwkJCSAgICAgIG51bV9tc2R1cywKKwkJCSAgICAgIGNkZl9hdG9taWNfcmVhZCgmcGRldi0+dGFyZ2V0X3R4X2NyZWRpdCkgKworCQkJICAgICAgbnVtX21zZHVzKTsKKworCU9MX1RYX1RBUkdFVF9DUkVESVRfQURKVVNUKG51bV9tc2R1cywgcGRldiwgTlVMTCk7Cit9CisKKyNpZmRlZiBRQ0FfQ09NUFVURV9UWF9ERUxBWQorCit2b2lkIG9sX3R4X3NldF9jb21wdXRlX2ludGVydmFsKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDMyX3QgaW50ZXJ2YWwpCit7CisJcGRldi0+dHhfZGVsYXkuYXZnX3BlcmlvZF90aWNrcyA9IGNkZl9zeXN0ZW1fbXNlY3NfdG9fdGlja3MoaW50ZXJ2YWwpOworfQorCit2b2lkCitvbF90eF9wYWNrZXRfY291bnQob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICB1aW50MTZfdCAqb3V0X3BhY2tldF9jb3VudCwKKwkJICAgdWludDE2X3QgKm91dF9wYWNrZXRfbG9zc19jb3VudCwgaW50IGNhdGVnb3J5KQoreworCSpvdXRfcGFja2V0X2NvdW50ID0gcGRldi0+cGFja2V0X2NvdW50W2NhdGVnb3J5XTsKKwkqb3V0X3BhY2tldF9sb3NzX2NvdW50ID0gcGRldi0+cGFja2V0X2xvc3NfY291bnRbY2F0ZWdvcnldOworCXBkZXYtPnBhY2tldF9jb3VudFtjYXRlZ29yeV0gPSAwOworCXBkZXYtPnBhY2tldF9sb3NzX2NvdW50W2NhdGVnb3J5XSA9IDA7Cit9CisKK3VpbnQzMl90IG9sX3R4X2RlbGF5X2F2Zyh1aW50NjRfdCBzdW0sIHVpbnQzMl90IG51bSkKK3sKKwl1aW50MzJfdCBzdW0zMjsKKwlpbnQgc2hpZnQgPSAwOworCS8qCisJICogVG8gYXZvaWQgZG9pbmcgYSA2NC1iaXQgZGl2aWRlLCBzaGlmdCB0aGUgc3VtIGRvd24gdW50aWwgaXQgaXMKKwkgKiBubyBtb3JlIHRoYW4gMzIgYml0cyAoYW5kIHNoaWZ0IHRoZSBkZW5vbWluYXRvciB0byBtYXRjaCkuCisJICovCisJd2hpbGUgKChzdW0gPj4gMzIpICE9IDApIHsKKwkJc3VtID4+PSAxOworCQlzaGlmdCsrOworCX0KKwlzdW0zMiA9ICh1aW50MzJfdCkgc3VtOworCW51bSA+Pj0gc2hpZnQ7CisJcmV0dXJuIChzdW0zMiArIChudW0gPj4gMSkpIC8gbnVtOyAgICAgIC8qIHJvdW5kIHRvIG5lYXJlc3QgKi8KK30KKwordm9pZAorb2xfdHhfZGVsYXkob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCSAgICB1aW50MzJfdCAqcXVldWVfZGVsYXlfbWljcm9zZWMsCisJICAgIHVpbnQzMl90ICp0eF9kZWxheV9taWNyb3NlYywgaW50IGNhdGVnb3J5KQoreworCWludCBpbmRleDsKKwl1aW50MzJfdCBhdmdfZGVsYXlfdGlja3M7CisJc3RydWN0IG9sX3R4X2RlbGF5X2RhdGEgKmRhdGE7CisKKwljZGZfYXNzZXJ0KGNhdGVnb3J5ID49IDAgJiYgY2F0ZWdvcnkgPCBRQ0FfVFhfREVMQVlfTlVNX0NBVEVHT1JJRVMpOworCisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+dHhfZGVsYXkubXV0ZXgpOworCWluZGV4ID0gMSAtIHBkZXYtPnR4X2RlbGF5LmNhdHNbY2F0ZWdvcnldLmluX3Byb2dyZXNzX2lkeDsKKworCWRhdGEgPSAmcGRldi0+dHhfZGVsYXkuY2F0c1tjYXRlZ29yeV0uY29waWVzW2luZGV4XTsKKworCWlmIChkYXRhLT5hdmdzLnRyYW5zbWl0X251bSA+IDApIHsKKwkJYXZnX2RlbGF5X3RpY2tzID0KKwkJCW9sX3R4X2RlbGF5X2F2ZyhkYXRhLT5hdmdzLnRyYW5zbWl0X3N1bV90aWNrcywKKwkJCQkJZGF0YS0+YXZncy50cmFuc21pdF9udW0pOworCQkqdHhfZGVsYXlfbWljcm9zZWMgPQorCQkJY2RmX3N5c3RlbV90aWNrc190b19tc2VjcyhhdmdfZGVsYXlfdGlja3MgKiAxMDAwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGlzIGNhc2Ugc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZXJlJ3MgYSBxdWVyeQorCQkgKiB3aXRoaW4gNSBzZWMgYWZ0ZXIgdGhlIGZpcnN0IHR4IGRhdGEgZnJhbWUuCisJCSAqLworCQkqdHhfZGVsYXlfbWljcm9zZWMgPSAwOworCX0KKwlpZiAoZGF0YS0+YXZncy5xdWV1ZV9udW0gPiAwKSB7CisJCWF2Z19kZWxheV90aWNrcyA9CisJCQlvbF90eF9kZWxheV9hdmcoZGF0YS0+YXZncy5xdWV1ZV9zdW1fdGlja3MsCisJCQkJCWRhdGEtPmF2Z3MucXVldWVfbnVtKTsKKwkJKnF1ZXVlX2RlbGF5X21pY3Jvc2VjID0KKwkJCWNkZl9zeXN0ZW1fdGlja3NfdG9fbXNlY3MoYXZnX2RlbGF5X3RpY2tzICogMTAwMCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhpcyBjYXNlIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGVyZSdzIGEgcXVlcnkKKwkJICogd2l0aGluIDUgc2VjIGFmdGVyIHRoZSBmaXJzdCB0eCBkYXRhIGZyYW1lLgorCQkgKi8KKwkJKnF1ZXVlX2RlbGF5X21pY3Jvc2VjID0gMDsKKwl9CisKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnR4X2RlbGF5Lm11dGV4KTsKK30KKwordm9pZAorb2xfdHhfZGVsYXlfaGlzdChvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCSB1aW50MTZfdCAqcmVwb3J0X2Jpbl92YWx1ZXMsIGludCBjYXRlZ29yeSkKK3sKKwlpbnQgaW5kZXgsIGksIGo7CisJc3RydWN0IG9sX3R4X2RlbGF5X2RhdGEgKmRhdGE7CisKKwljZGZfYXNzZXJ0KGNhdGVnb3J5ID49IDAgJiYgY2F0ZWdvcnkgPCBRQ0FfVFhfREVMQVlfTlVNX0NBVEVHT1JJRVMpOworCisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+dHhfZGVsYXkubXV0ZXgpOworCWluZGV4ID0gMSAtIHBkZXYtPnR4X2RlbGF5LmNhdHNbY2F0ZWdvcnldLmluX3Byb2dyZXNzX2lkeDsKKworCWRhdGEgPSAmcGRldi0+dHhfZGVsYXkuY2F0c1tjYXRlZ29yeV0uY29waWVzW2luZGV4XTsKKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgUUNBX1RYX0RFTEFZX0hJU1RfUkVQT1JUX0JJTlMgLSAxOyBpKyspIHsKKwkJdWludDE2X3QgaW50ZXJuYWxfYmluX3N1bSA9IDA7CisJCXdoaWxlIChqIDwgKDEgPDwgaSkpCisJCQlpbnRlcm5hbF9iaW5fc3VtICs9IGRhdGEtPmhpc3RfYmluc19xdWV1ZVtqKytdOworCisJCXJlcG9ydF9iaW5fdmFsdWVzW2ldID0gaW50ZXJuYWxfYmluX3N1bTsKKwl9CisJcmVwb3J0X2Jpbl92YWx1ZXNbaV0gPSBkYXRhLT5oaXN0X2JpbnNfcXVldWVbal07ICAgICAgICAvKiBvdmVyZmxvdyAqLworCisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT50eF9kZWxheS5tdXRleCk7Cit9CisKKyNpZmRlZiBRQ0FfQ09NUFVURV9UWF9ERUxBWV9QRVJfVElECitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm9sX3R4X2Rlc3RfYWRkcl9maW5kKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJCQkJICAgIGNkZl9uYnVmX3QgdHhfbmJ1ZikKK3sKKwl1aW50OF90ICpoZHJfcHRyOworCXZvaWQgKmRhdGFwID0gY2RmX25idWZfZGF0YSh0eF9uYnVmKTsKKworCWlmIChwZGV2LT5mcmFtZV9mb3JtYXQgPT0gd2xhbl9mcm1fZm10X3JhdykgeworCQkvKiBhZGp1c3QgaGRyX3B0ciB0byBSQSAqLworCQlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopZGF0YXA7CisJCWhkcl9wdHIgPSB3aC0+aV9hZGRyMTsKKwl9IGVsc2UgaWYgKHBkZXYtPmZyYW1lX2Zvcm1hdCA9PSB3bGFuX2ZybV9mbXRfbmF0aXZlX3dpZmkpIHsKKwkJLyogYWRqdXN0IGhkcl9wdHIgdG8gUkEgKi8KKwkJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2ggPSAoc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKWRhdGFwOworCQloZHJfcHRyID0gd2gtPmlfYWRkcjE7CisJfSBlbHNlIGlmIChwZGV2LT5mcmFtZV9mb3JtYXQgPT0gd2xhbl9mcm1fZm10XzgwMl8zKSB7CisJCWhkcl9wdHIgPSBkYXRhcDsKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJJbnZhbGlkIHN0YW5kYXJkIGZyYW1lIHR5cGU6ICVkIiwKKwkJCSAgcGRldi0+ZnJhbWVfZm9ybWF0KTsKKwkJY2RmX2Fzc2VydCgwKTsKKwkJaGRyX3B0ciA9IE5VTEw7CisJfQorCXJldHVybiBoZHJfcHRyOworfQorCitzdGF0aWMgdWludDhfdAorb2xfdHhfZGVsYXlfdGlkX2Zyb21fbDNfaGRyKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJCSAgICBjZGZfbmJ1Zl90IG1zZHUsIHN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MpCit7CisJdWludDE2X3QgZXRoZXJ0eXBlOworCXVpbnQ4X3QgKmRlc3RfYWRkciwgKmwzX2hkcjsKKwlpbnQgaXNfbWdtdCwgaXNfbWNhc3Q7CisJaW50IGwyX2hkcl9zaXplOworCisJZGVzdF9hZGRyID0gb2xfdHhfZGVzdF9hZGRyX2ZpbmQocGRldiwgbXNkdSk7CisJaWYgKE5VTEwgPT0gZGVzdF9hZGRyKQorCQlyZXR1cm4gQURGX05CVUZfVFhfRVhUX1RJRF9JTlZBTElEOworCisJaXNfbWNhc3QgPSBJRUVFODAyMTFfSVNfTVVMVElDQVNUKGRlc3RfYWRkcik7CisJaXNfbWdtdCA9IHR4X2Rlc2MtPnBrdF90eXBlID49IE9MX1RYUlhfTUdNVF9UWVBFX0JBU0U7CisJaWYgKGlzX21nbXQpIHsKKwkJcmV0dXJuIChpc19tY2FzdCkgPworCQkgICAgICAgT0xfVFhfTlVNX1RJRFMgKyBPTF9UWF9WREVWX0RFRkFVTFRfTUdNVCA6CisJCSAgICAgICBIVFRfVFhfRVhUX1RJRF9NR01UOworCX0KKwlpZiAoaXNfbWNhc3QpCisJCXJldHVybiBPTF9UWF9OVU1fVElEUyArIE9MX1RYX1ZERVZfTUNBU1RfQkNBU1Q7CisKKwlpZiAocGRldi0+ZnJhbWVfZm9ybWF0ID09IHdsYW5fZnJtX2ZtdF84MDJfMykgeworCQlzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QgKmVuZXRfaGRyOworCQllbmV0X2hkciA9IChzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QgKiljZGZfbmJ1Zl9kYXRhKG1zZHUpOworCQlsMl9oZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QpOworCQlldGhlcnR5cGUgPQorCQkJKGVuZXRfaGRyLT5ldGhlcnR5cGVbMF0gPDwgOCkgfCBlbmV0X2hkci0+ZXRoZXJ0eXBlWzFdOworCQlpZiAoIUlTX0VUSEVSVFlQRShldGhlcnR5cGUpKSB7CisJCQlzdHJ1Y3QgbGxjX3NuYXBfaGRyX3QgKmxsY19oZHI7CisJCQlsbGNfaGRyID0gKHN0cnVjdCBsbGNfc25hcF9oZHJfdCAqKQorCQkJCSAgKGNkZl9uYnVmX2RhdGEobXNkdSkgKyBsMl9oZHJfc2l6ZSk7CisJCQlsMl9oZHJfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGxsY19zbmFwX2hkcl90KTsKKwkJCWV0aGVydHlwZSA9CisJCQkJKGxsY19oZHItPmV0aGVydHlwZVswXSA8PCA4KSB8IGxsY19oZHItPgorCQkJCWV0aGVydHlwZVsxXTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBsbGNfc25hcF9oZHJfdCAqbGxjX2hkcjsKKwkJbDJfaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9mcmFtZSk7CisJCWxsY19oZHIgPSAoc3RydWN0IGxsY19zbmFwX2hkcl90ICopKGNkZl9uYnVmX2RhdGEobXNkdSkKKwkJCQkJCSAgICArIGwyX2hkcl9zaXplKTsKKwkJbDJfaGRyX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHJfdCk7CisJCWV0aGVydHlwZSA9CisJCQkobGxjX2hkci0+ZXRoZXJ0eXBlWzBdIDw8IDgpIHwgbGxjX2hkci0+ZXRoZXJ0eXBlWzFdOworCX0KKwlsM19oZHIgPSBjZGZfbmJ1Zl9kYXRhKG1zZHUpICsgbDJfaGRyX3NpemU7CisJaWYgKEVUSEVSVFlQRV9JUFY0ID09IGV0aGVydHlwZSkgeworCQlyZXR1cm4gKCgoc3RydWN0IGlwdjRfaGRyX3QgKilsM19oZHIpLT50b3MgPj4gNSkgJiAweDc7CisJfSBlbHNlIGlmIChFVEhFUlRZUEVfSVBWNiA9PSBldGhlcnR5cGUpIHsKKwkJcmV0dXJuIChpcHY2X3RyYWZmaWNfY2xhc3MoKHN0cnVjdCBpcHY2X2hkcl90ICopbDNfaGRyKSA+PiA1KSAmCisJCSAgICAgICAweDc7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEFERl9OQlVGX1RYX0VYVF9USURfSU5WQUxJRDsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGludCBvbF90eF9kZWxheV9jYXRlZ29yeShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsIHVpbnQxNl90IG1zZHVfaWQpCit7CisjaWZkZWYgUUNBX0NPTVBVVEVfVFhfREVMQVlfUEVSX1RJRAorCXN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MgPSAmcGRldi0+dHhfZGVzYy5hcnJheVttc2R1X2lkXS50eF9kZXNjOworCXVpbnQ4X3QgdGlkOworCisJY2RmX25idWZfdCBtc2R1ID0gdHhfZGVzYy0+bmV0YnVmOworCXRpZCA9IGNkZl9uYnVmX2dldF90aWQobXNkdSk7CisJaWYgKHRpZCA9PSBBREZfTkJVRl9UWF9FWFRfVElEX0lOVkFMSUQpIHsKKwkJdGlkID0gb2xfdHhfZGVsYXlfdGlkX2Zyb21fbDNfaGRyKHBkZXYsIG1zZHUsIHR4X2Rlc2MpOworCQlpZiAodGlkID09IEFERl9OQlVGX1RYX0VYVF9USURfSU5WQUxJRCkgeworCQkJLyogVElEIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkCisJCQkgICAodGhpcyBpcyBub3QgYW4gSVAgZnJhbWU/KSAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIHRpZDsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQKK29sX3R4X2RlbGF5X2hpc3RfYmluKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwgdWludDMyX3QgZGVsYXlfdGlja3MpCit7CisJaW50IGJpbjsKKwkvKgorCSAqIEZvciBzcGVlZCwgbXVsdGlwbHkgYW5kIHNoaWZ0IHRvIGFwcHJveGltYXRlIGEgZGl2aWRlLiBUaGlzIGNhdXNlcworCSAqIGEgc21hbGwgZXJyb3IsIGJ1dCB0aGUgYXBwcm94aW1hdGlvbiBlcnJvciBzaG91bGQgYmUgbXVjaCBsZXNzCisJICogdGhhbiB0aGUgb3RoZXIgdW5jZXJ0YWludGllcyBpbiB0aGUgdHggZGVsYXkgY29tcHV0YXRpb24uCisJICovCisJYmluID0gKGRlbGF5X3RpY2tzICogcGRldi0+dHhfZGVsYXkuaGlzdF9pbnRlcm5hbF9iaW5fd2lkdGhfbXVsdCkgPj4KKwkgICAgICBwZGV2LT50eF9kZWxheS5oaXN0X2ludGVybmFsX2Jpbl93aWR0aF9zaGlmdDsKKwlpZiAoYmluID49IFFDQV9UWF9ERUxBWV9ISVNUX0lOVEVSTkFMX0JJTlMpCisJCWJpbiA9IFFDQV9UWF9ERUxBWV9ISVNUX0lOVEVSTkFMX0JJTlMgLSAxOworCisJcmV0dXJuIGJpbjsKK30KKworc3RhdGljIHZvaWQKK29sX3R4X2RlbGF5X2NvbXB1dGUoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkgICAgZW51bSBodHRfdHhfc3RhdHVzIHN0YXR1cywKKwkJICAgIHVpbnQxNl90ICpkZXNjX2lkcywgaW50IG51bV9tc2R1cykKK3sKKwlpbnQgaSwgaW5kZXgsIGNhdDsKKwl1aW50MzJfdCBub3dfdGlja3MgPSBjZGZfc3lzdGVtX3RpY2tzKCk7CisJdWludDMyX3QgdHhfZGVsYXlfdHJhbnNtaXRfdGlja3MsIHR4X2RlbGF5X3F1ZXVlX3RpY2tzOworCXVpbnQzMl90IGF2Z190aW1lX3RpY2tzOworCXN0cnVjdCBvbF90eF9kZWxheV9kYXRhICpkYXRhOworCisJY2RmX2Fzc2VydChudW1fbXNkdXMgPiAwKTsKKworCS8qCisJICoga2VlcCBzdGF0aWMgY291bnRlcnMgZm9yIHRvdGFsIHBhY2tldCBhbmQgbG9zdCBwYWNrZXRzCisJICogcmVzZXQgdGhlbSBpbiBvbF90eF9kZWxheSgpLCBmdW5jdGlvbiB1c2VkIHRvIGZldGNoIHRoZSBzdGF0cworCSAqLworCisJY2F0ID0gb2xfdHhfZGVsYXlfY2F0ZWdvcnkocGRldiwgZGVzY19pZHNbMF0pOworCWlmIChjYXQgPCAwIHx8IGNhdCA+PSBRQ0FfVFhfREVMQVlfTlVNX0NBVEVHT1JJRVMpCisJCXJldHVybjsKKworCXBkZXYtPnBhY2tldF9jb3VudFtjYXRdID0gcGRldi0+cGFja2V0X2NvdW50W2NhdF0gKyBudW1fbXNkdXM7CisJaWYgKHN0YXR1cyAhPSBodHRfdHhfc3RhdHVzX29rKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fbXNkdXM7IGkrKykgeworCQkJY2F0ID0gb2xfdHhfZGVsYXlfY2F0ZWdvcnkocGRldiwgZGVzY19pZHNbaV0pOworCQkJaWYgKGNhdCA8IDAgfHwgY2F0ID49IFFDQV9UWF9ERUxBWV9OVU1fQ0FURUdPUklFUykKKwkJCQlyZXR1cm47CisJCQlwZGV2LT5wYWNrZXRfbG9zc19jb3VudFtjYXRdKys7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIHNpbmNlIHdlIG1heSBzd2l0Y2ggdGhlIHBpbmctcG9uZyBpbmRleCwgcHJvdmlkZSBtdXRleCB3LiByZWFkZXJzICovCisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+dHhfZGVsYXkubXV0ZXgpOworCWluZGV4ID0gcGRldi0+dHhfZGVsYXkuY2F0c1tjYXRdLmluX3Byb2dyZXNzX2lkeDsKKworCWRhdGEgPSAmcGRldi0+dHhfZGVsYXkuY2F0c1tjYXRdLmNvcGllc1tpbmRleF07CisKKwlpZiAocGRldi0+dHhfZGVsYXkudHhfY29tcGxfdGltZXN0YW1wX3RpY2tzICE9IDApIHsKKwkJdHhfZGVsYXlfdHJhbnNtaXRfdGlja3MgPQorCQkJbm93X3RpY2tzIC0gcGRldi0+dHhfZGVsYXkudHhfY29tcGxfdGltZXN0YW1wX3RpY2tzOworCQkvKgorCQkgKiBXZSdkIGxpa2UgdG8gYWNjb3VudCBmb3IgdGhlIG51bWJlciBvZiBNU0RVcyB0aGF0IHdlcmUKKwkJICogdHJhbnNtaXR0ZWQgdG9nZXRoZXIsIGJ1dCB3ZSBkb24ndCBrbm93IHRoaXMuICBBbGwgd2Uga25vdworCQkgKiBpcyB0aGUgbnVtYmVyIG9mIE1TRFVzIHRoYXQgd2VyZSBhY2tlZCB0b2dldGhlci4KKwkJICogU2luY2UgdGhlIGZyYW1lIGVycm9yIHJhdGUgaXMgc21hbGwsIHRoaXMgaXMgbmVhcmx5IHRoZSBzYW1lCisJCSAqIGFzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIHRvZ2V0aGVyLgorCQkgKi8KKwkJZGF0YS0+YXZncy50cmFuc21pdF9zdW1fdGlja3MgKz0gdHhfZGVsYXlfdHJhbnNtaXRfdGlja3M7CisJCWRhdGEtPmF2Z3MudHJhbnNtaXRfbnVtICs9IG51bV9tc2R1czsKKwl9CisJcGRldi0+dHhfZGVsYXkudHhfY29tcGxfdGltZXN0YW1wX3RpY2tzID0gbm93X3RpY2tzOworCisJZm9yIChpID0gMDsgaSA8IG51bV9tc2R1czsgaSsrKSB7CisJCXVpbnQxNl90IGlkID0gZGVzY19pZHNbaV07CisJCXN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MgPSAmcGRldi0+dHhfZGVzYy5hcnJheVtpZF0udHhfZGVzYzsKKwkJaW50IGJpbjsKKworCQl0eF9kZWxheV9xdWV1ZV90aWNrcyA9CisJCQlub3dfdGlja3MgLSB0eF9kZXNjLT5lbnRyeV90aW1lc3RhbXBfdGlja3M7CisKKwkJZGF0YS0+YXZncy5xdWV1ZV9zdW1fdGlja3MgKz0gdHhfZGVsYXlfcXVldWVfdGlja3M7CisJCWRhdGEtPmF2Z3MucXVldWVfbnVtKys7CisJCWJpbiA9IG9sX3R4X2RlbGF5X2hpc3RfYmluKHBkZXYsIHR4X2RlbGF5X3F1ZXVlX3RpY2tzKTsKKwkJZGF0YS0+aGlzdF9iaW5zX3F1ZXVlW2Jpbl0rKzsKKwl9CisKKwkvKiBjaGVjayBpZiBpdCdzIHRpbWUgdG8gc3RhcnQgYSBuZXcgYXZlcmFnZSAqLworCWF2Z190aW1lX3RpY2tzID0KKwkJbm93X3RpY2tzIC0gcGRldi0+dHhfZGVsYXkuY2F0c1tjYXRdLmF2Z19zdGFydF90aW1lX3RpY2tzOworCWlmIChhdmdfdGltZV90aWNrcyA+IHBkZXYtPnR4X2RlbGF5LmF2Z19wZXJpb2RfdGlja3MpIHsKKwkJcGRldi0+dHhfZGVsYXkuY2F0c1tjYXRdLmF2Z19zdGFydF90aW1lX3RpY2tzID0gbm93X3RpY2tzOworCQlpbmRleCA9IDEgLSBpbmRleDsKKwkJcGRldi0+dHhfZGVsYXkuY2F0c1tjYXRdLmluX3Byb2dyZXNzX2lkeCA9IGluZGV4OworCQljZGZfbWVtX3plcm8oJnBkZXYtPnR4X2RlbGF5LmNhdHNbY2F0XS5jb3BpZXNbaW5kZXhdLAorCQkJICAgICBzaXplb2YocGRldi0+dHhfZGVsYXkuY2F0c1tjYXRdLmNvcGllc1tpbmRleF0pKTsKKwl9CisKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnR4X2RlbGF5Lm11dGV4KTsKK30KKworI2VuZGlmIC8qIFFDQV9DT01QVVRFX1RYX0RFTEFZICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfdHhfc2VuZC5oIGIvY29yZS9kcC90eHJ4L29sX3R4X3NlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQ4ODEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L29sX3R4X3NlbmQuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBAZmlsZSBvbF90eF9zZW5kLmgKKyAqIEBicmllZiBBUEkgZGVmaW5pdGlvbnMgZm9yIHRoZSB0eCBzZW5kcmlwdG9yIG1vZHVsZSB3aXRoaW4gdGhlIGRhdGEgU1cuCisgKi8KKyNpZm5kZWYgX09MX1RYX1NFTkRfX0hfCisjZGVmaW5lIF9PTF9UWF9TRU5EX19IXworCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX3QgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+ICAgICAgLyogb2xfdHhfc2VuZF90ICovCisKKy8qKgorICogQGZsdXNoIHRoZSBvbCB0eCB3aGVuIHN1cnByaXNlIHJlbW92ZS4KKyAqCisgKi8KK3ZvaWQgb2xfdHhfZGlzY2FyZF90YXJnZXRfZnJtcyhvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYpOworCisvKioKKyAqIEBicmllZiBTZW5kIGEgdHggZnJhbWUgdG8gdGhlIHRhcmdldC4KKyAqIEBkZXRhaWxzCisgKgorICogQHBhcmFtIHBkZXYgLSAgdGhlIHBoeSBkZXYKKyAqIEBwYXJhbSB2ZGV2IC0gdGhlIHZpcnR1YWwgZGV2aWNlIHNlbmRpbmcgdGhlIGRhdGEKKyAqICAgICAgKGZvciBzcGVjaWZ5aW5nIHRoZSB0cmFuc21pdHRlciBhZGRyZXNzIGZvciBtdWx0aWNhc3QgLyBicm9hZGNhc3QgZGF0YSkKKyAqIEBwYXJhbSBuZXRidWYgLSB0aGUgdHggZnJhbWUKKyAqLwordm9pZAorb2xfdHhfc2VuZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJICAgc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYywgY2RmX25idWZfdCBtc2R1KTsKKworLyoqCisgKiBAYnJpZWYgU2VuZCBhIHR4IGJhdGNoIGRvd25sb2FkIHRvIHRoZSB0YXJnZXQuCisgKiBAZGV0YWlscworICogICAgIFRoaXMgZnVuY3Rpb24gaXMgZGlmZmVyZW50IGZyb20gYWJvdmUgaW4gdGhhdAorICogICAgIGl0IGFjY2VwdHMgYSBsaXN0IG9mIG1zZHUncyB0byBiZSBkb3dubG9hZGVkIGFzIGEgYmF0Y2gKKyAqCisgKiBAcGFyYW0gcGRldiAtICB0aGUgcGh5IGRldgorICogQHBhcmFtIG1zZHVfbGlzdCAtIHRoZSBIZWFkIHBvaW50ZXIgdG8gdGhlIFR4IEJhdGNoCisgKiBAcGFyYW0gbnVtX21zZHVzIC0gVG90YWwgbXNkdXMgY2hhaW5lZCBpbiBtc2R1X2xpc3QKKyAqLworCitpbnQKK29sX3R4X3NlbmRfYmF0Y2goc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkgY2RmX25idWZfdCBtc2R1X2xpc3QsIGludCBudW1fbXNkdXMpOworCisvKioKKyAqIEBicmllZiBTZW5kIGEgdHggZnJhbWUgd2l0aCBhIG5vbi1zdGQgaGVhZGVyIG9yIHBheWxvYWQgdHlwZSB0byB0aGUgdGFyZ2V0LgorICogQGRldGFpbHMKKyAqCisgKiBAcGFyYW0gcGRldiAtICB0aGUgcGh5IGRldgorICogQHBhcmFtIHZkZXYgLSB0aGUgdmlydHVhbCBkZXZpY2Ugc2VuZGluZyB0aGUgZGF0YQorICogICAgICAoZm9yIHNwZWNpZnlpbmcgdGhlIHRyYW5zbWl0dGVyIGFkZHJlc3MgZm9yIG11bHRpY2FzdCAvIGJyb2FkY2FzdCBkYXRhKQorICogQHBhcmFtIG5ldGJ1ZiAtIHRoZSB0eCBmcmFtZQorICogQHBhcmFtIHBrdF90eXBlIC0gd2hhdCBraW5kIG9mIG5vbi1zdGQgZnJhbWUgaXMgYmVpbmcgc2VudAorICovCit2b2lkCitvbF90eF9zZW5kX25vbnN0ZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCSAgc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYywKKwkJICBjZGZfbmJ1Zl90IG1zZHUsIGVudW0gaHR0X3BrdF90eXBlIHBrdF90eXBlKTsKKyNlbmRpZiAvKiBfT0xfVFhfU0VORF9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF90eHJ4LmMgYi9jb3JlL2RwL3R4cngvb2xfdHhyeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NmE1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfdHhyeC5jCkBAIC0wLDAgKzEsMzE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT0gaW5jbHVkZXMgPT09Ki8KKy8qIGhlYWRlciBmaWxlcyBmb3IgT1MgcHJpbWl0aXZlcyAqLworI2luY2x1ZGUgPG9zZGVwLmg+ICAgICAgICAgICAgICAvKiB1aW50MzJfdCwgZXRjLiAqLworI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4gICAgICAgICAvKiBjZGZfbWVtX21hbGxvYyxmcmVlICovCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+ICAgICAgICAgIC8qIGNkZl9kZXZpY2VfdCwgY2RmX3ByaW50ICovCisjaW5jbHVkZSA8Y2RmX2xvY2suaD4gICAgICAgICAgIC8qIGNkZl9zcGlubG9jayAqLworI2luY2x1ZGUgPGNkZl9hdG9taWMuaD4gICAgICAgICAvKiBjZGZfYXRvbWljX3JlYWQgKi8KKworLyogUmVxdWlyZWQgZm9yIFdMQU5fRkVBVFVSRV9GQVNUUEFUSCAqLworI2luY2x1ZGUgPGNlX2FwaS5oPgorLyogaGVhZGVyIGZpbGVzIGZvciB1dGlsaXRpZXMgKi8KKyNpbmNsdWRlIDxjZHNfcXVldWUuaD4gICAgICAgICAgLyogVEFJTFEgKi8KKworLyogaGVhZGVyIGZpbGVzIGZvciBjb25maWd1cmF0aW9uIEFQSSAqLworI2luY2x1ZGUgPG9sX2NmZy5oPiAgICAgICAgICAgICAvKiBvbF9jZmdfaXNfaGlnaF9sYXRlbmN5ICovCisjaW5jbHVkZSA8b2xfaWZfYXRodmFyLmg+CisKKy8qIGhlYWRlciBmaWxlcyBmb3IgSFRUIEFQSSAqLworI2luY2x1ZGUgPG9sX2h0dF9hcGkuaD4KKyNpbmNsdWRlIDxvbF9odHRfdHhfYXBpLmg+CisKKy8qIGhlYWRlciBmaWxlcyBmb3IgT1Mgc2hpbSBBUEkgKi8KKyNpbmNsdWRlIDxvbF9vc2lmX2FwaS5oPgorCisvKiBoZWFkZXIgZmlsZXMgZm9yIG91ciBvd24gQVBJcyAqLworI2luY2x1ZGUgPG9sX3R4cnhfYXBpLmg+CisjaW5jbHVkZSA8b2xfdHhyeF9kYmcuaD4KKyNpbmNsdWRlIDxvbF90eHJ4X2N0cmxfYXBpLmg+CisjaW5jbHVkZSA8b2xfdHhyeF9vc2lmX2FwaS5oPgorLyogaGVhZGVyIGZpbGVzIGZvciBvdXIgaW50ZXJuYWwgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2ludGVybmFsLmg+ICAgLyogVFhSWF9BU1NFUlQsIGV0Yy4gKi8KKyNpbmNsdWRlIDx3ZGlfZXZlbnQuaD4gICAgICAgICAgLyogV0RJIGV2ZW50cyAqLworI2luY2x1ZGUgPG9sX3R4cnhfdHlwZXMuaD4gICAgICAvKiBvbF90eHJ4X3BkZXZfdCwgZXRjLiAqLworI2luY2x1ZGUgPG9sX2N0cmxfdHhyeF9hcGkuaD4KKyNpbmNsdWRlIDxvbF90eC5oPiAgICAgICAgICAgICAgLyogb2xfdHhfbGwgKi8KKyNpbmNsdWRlIDxvbF9yeC5oPiAgICAgICAgICAgICAgLyogb2xfcnhfZGVsaXZlciAqLworI2luY2x1ZGUgPG9sX3R4cnhfcGVlcl9maW5kLmg+ICAvKiBvbF90eHJ4X3BlZXJfZmluZF9hdHRhY2gsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF9yeF9wbi5oPiAgICAgICAgICAgLyogb2xfcnhfcG5fY2hlY2ssIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF9yeF9md2QuaD4gICAgICAgICAgLyogb2xfcnhfZndkX2NoZWNrLCBldGMuICovCisjaW5jbHVkZSA8b2xfcnhfcmVvcmRlcl90aW1lb3V0Lmg+ICAgICAgLyogT0xfUlhfUkVPUkRFUl9USU1FT1VUX0lOSVQsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF9yeF9yZW9yZGVyLmg+CisjaW5jbHVkZSA8b2xfdHhfc2VuZC5oPiAgICAgICAgIC8qIG9sX3R4X2Rpc2NhcmRfdGFyZ2V0X2ZybXMgKi8KKyNpbmNsdWRlIDxvbF90eF9kZXNjLmg+ICAgICAgICAgLyogb2xfdHhfZGVzY19mcmFtZV9mcmVlICovCisjaW5jbHVkZSA8b2xfdHhfcXVldWUuaD4KKyNpbmNsdWRlIDxvbF90eHJ4Lmg+CisjaW5jbHVkZSAid21hLmgiCisKKworCisvKj09PSBmdW5jdGlvbiBkZWZpbml0aW9ucyA9PT0qLworCisjaWZkZWYgUUNBX1NVUFBPUlRfVFhSWF9MT0NBTF9QRUVSX0lECitvbF90eHJ4X3BlZXJfaGFuZGxlCitvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyX2FuZF92ZGV2KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCQkgICBvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJCQkJICAgdWludDhfdCAqcGVlcl9hZGRyLCB1aW50OF90ICpwZWVyX2lkKQoreworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKworCXBlZXIgPSBvbF90eHJ4X3BlZXJfdmRldl9maW5kX2hhc2gocGRldiwgdmRldiwgcGVlcl9hZGRyLCAwLCAxKTsKKwlpZiAoIXBlZXIpCisJCXJldHVybiBOVUxMOworCSpwZWVyX2lkID0gcGVlci0+bG9jYWxfaWQ7CisJY2RmX2F0b21pY19kZWMoJnBlZXItPnJlZl9jbnQpOworCXJldHVybiBwZWVyOworfQorCitDREZfU1RBVFVTIG9sX3R4cnhfZ2V0X3ZkZXZpZChzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsIHVpbnQ4X3QgKnZkZXZfaWQpCit7CisJaWYgKCFwZWVyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJwZWVyIGFyZ3VtZW50IGlzIG51bGwhISIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJKnZkZXZfaWQgPSBwZWVyLT52ZGV2LT52ZGV2X2lkOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgKm9sX3R4cnhfZ2V0X3ZkZXZfYnlfc3RhX2lkKHVpbnQ4X3Qgc3RhX2lkKQoreworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciA9IE5VTEw7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2ID0gTlVMTDsKKworCWlmIChzdGFfaWQgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkludmFsaWQgc3RhIGlkIHBhc3NlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJaWYgKCFwZGV2KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICJQREVWIG5vdCBmb3VuZCBmb3Igc3RhX2lkIFslZF0iLCBzdGFfaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwZWVyID0gb2xfdHhyeF9wZWVyX2ZpbmRfYnlfbG9jYWxfaWQocGRldiwgc3RhX2lkKTsKKwlpZiAoIXBlZXIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIlBFRVIgWyVkXSBub3QgZm91bmQiLCBzdGFfaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcGVlci0+dmRldjsKK30KKworb2xfdHhyeF9wZWVyX2hhbmRsZSBvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCQkJICAgICAgdWludDhfdCAqcGVlcl9hZGRyLAorCQkJCQkgICAgICB1aW50OF90ICpwZWVyX2lkKQoreworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKworCXBlZXIgPSBvbF90eHJ4X3BlZXJfZmluZF9oYXNoX2ZpbmQocGRldiwgcGVlcl9hZGRyLCAwLCAxKTsKKwlpZiAoIXBlZXIpCisJCXJldHVybiBOVUxMOworCSpwZWVyX2lkID0gcGVlci0+bG9jYWxfaWQ7CisJY2RmX2F0b21pY19kZWMoJnBlZXItPnJlZl9jbnQpOworCXJldHVybiBwZWVyOworfQorCit1aW50MTZfdCBvbF90eHJ4X2xvY2FsX3BlZXJfaWQob2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyKQoreworCXJldHVybiBwZWVyLT5sb2NhbF9pZDsKK30KKworb2xfdHhyeF9wZWVyX2hhbmRsZQorb2xfdHhyeF9wZWVyX2ZpbmRfYnlfbG9jYWxfaWQoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJICAgICAgdWludDhfdCBsb2NhbF9wZWVyX2lkKQoreworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwlpZiAoKGxvY2FsX3BlZXJfaWQgPT0gT0xfVFhSWF9JTlZBTElEX0xPQ0FMX1BFRVJfSUQpIHx8CisJICAgIChsb2NhbF9wZWVyX2lkID49IE9MX1RYUlhfTlVNX0xPQ0FMX1BFRVJfSURTKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZwZGV2LT5sb2NhbF9wZWVyX2lkcy5sb2NrKTsKKwlwZWVyID0gcGRldi0+bG9jYWxfcGVlcl9pZHMubWFwW2xvY2FsX3BlZXJfaWRdOworCWNkZl9zcGluX3VubG9ja19iaCgmcGRldi0+bG9jYWxfcGVlcl9pZHMubG9jayk7CisJcmV0dXJuIHBlZXI7Cit9CisKK3N0YXRpYyB2b2lkIG9sX3R4cnhfbG9jYWxfcGVlcl9pZF9wb29sX2luaXQoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCWludCBpOworCisJLyogcG9pbnQgdGhlIGZyZWVsaXN0IHRvIHRoZSBmaXJzdCBJRCAqLworCXBkZXYtPmxvY2FsX3BlZXJfaWRzLmZyZWVsaXN0ID0gMDsKKworCS8qIGxpbmsgZWFjaCBJRCB0byB0aGUgbmV4dCBvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgT0xfVFhSWF9OVU1fTE9DQUxfUEVFUl9JRFM7IGkrKykgeworCQlwZGV2LT5sb2NhbF9wZWVyX2lkcy5wb29sW2ldID0gaSArIDE7CisJCXBkZXYtPmxvY2FsX3BlZXJfaWRzLm1hcFtpXSA9IE5VTEw7CisJfQorCisJLyogbGluayB0aGUgbGFzdCBJRCB0byBpdHNlbGYsIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgbGlzdCAqLworCWkgPSBPTF9UWFJYX05VTV9MT0NBTF9QRUVSX0lEUzsKKwlwZGV2LT5sb2NhbF9wZWVyX2lkcy5wb29sW2ldID0gaTsKKworCWNkZl9zcGlubG9ja19pbml0KCZwZGV2LT5sb2NhbF9wZWVyX2lkcy5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK29sX3R4cnhfbG9jYWxfcGVlcl9pZF9hbGxvYyhzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyKQoreworCWludCBpOworCisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+bG9jYWxfcGVlcl9pZHMubG9jayk7CisJaSA9IHBkZXYtPmxvY2FsX3BlZXJfaWRzLmZyZWVsaXN0OworCWlmIChwZGV2LT5sb2NhbF9wZWVyX2lkcy5wb29sW2ldID09IGkpIHsKKwkJLyogdGhlIGxpc3QgaXMgZW1wdHksIGV4Y2VwdCBmb3IgdGhlIGxpc3QtZW5kIG1hcmtlciAqLworCQlwZWVyLT5sb2NhbF9pZCA9IE9MX1RYUlhfSU5WQUxJRF9MT0NBTF9QRUVSX0lEOworCX0gZWxzZSB7CisJCS8qIHRha2UgdGhlIGhlYWQgSUQgYW5kIGFkdmFuY2UgdGhlIGZyZWVsaXN0ICovCisJCXBlZXItPmxvY2FsX2lkID0gaTsKKwkJcGRldi0+bG9jYWxfcGVlcl9pZHMuZnJlZWxpc3QgPSBwZGV2LT5sb2NhbF9wZWVyX2lkcy5wb29sW2ldOworCQlwZGV2LT5sb2NhbF9wZWVyX2lkcy5tYXBbaV0gPSBwZWVyOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPmxvY2FsX3BlZXJfaWRzLmxvY2spOworfQorCitzdGF0aWMgdm9pZAorb2xfdHhyeF9sb2NhbF9wZWVyX2lkX2ZyZWUoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJICAgc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyKQoreworCWludCBpID0gcGVlci0+bG9jYWxfaWQ7CisJaWYgKChpID09IE9MX1RYUlhfSU5WQUxJRF9MT0NBTF9QRUVSX0lEKSB8fAorCSAgICAoaSA+PSBPTF9UWFJYX05VTV9MT0NBTF9QRUVSX0lEUykpIHsKKwkJcmV0dXJuOworCX0KKwkvKiBwdXQgdGhpcyBJRCBvbiB0aGUgaGVhZCBvZiB0aGUgZnJlZWxpc3QgKi8KKwljZGZfc3Bpbl9sb2NrX2JoKCZwZGV2LT5sb2NhbF9wZWVyX2lkcy5sb2NrKTsKKwlwZGV2LT5sb2NhbF9wZWVyX2lkcy5wb29sW2ldID0gcGRldi0+bG9jYWxfcGVlcl9pZHMuZnJlZWxpc3Q7CisJcGRldi0+bG9jYWxfcGVlcl9pZHMuZnJlZWxpc3QgPSBpOworCXBkZXYtPmxvY2FsX3BlZXJfaWRzLm1hcFtpXSA9IE5VTEw7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT5sb2NhbF9wZWVyX2lkcy5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgb2xfdHhyeF9sb2NhbF9wZWVyX2lkX2NsZWFudXAoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCWNkZl9zcGlubG9ja19kZXN0cm95KCZwZGV2LT5sb2NhbF9wZWVyX2lkcy5sb2NrKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgb2xfdHhyeF9sb2NhbF9wZWVyX2lkX3Bvb2xfaW5pdChwZGV2KSAgIC8qIG5vLW9wICovCisjZGVmaW5lIG9sX3R4cnhfbG9jYWxfcGVlcl9pZF9hbGxvYyhwZGV2LCBwZWVyKSAvKiBuby1vcCAqLworI2RlZmluZSBvbF90eHJ4X2xvY2FsX3BlZXJfaWRfZnJlZShwZGV2LCBwZWVyKSAgLyogbm8tb3AgKi8KKyNkZWZpbmUgb2xfdHhyeF9sb2NhbF9wZWVyX2lkX2NsZWFudXAocGRldikgICAgIC8qIG5vLW9wICovCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorLyoqCisgKiBzZXR1cF9mYXN0cGF0aF9jZV9oYW5kbGVzKCkgVXBkYXRlIHBkZXYgd2l0aCBjZV9oYW5kbGUgZm9yIGZhc3RwYXRoIHVzZS4KKyAqCisgKiBAb3NjOiBwb2ludGVyIHRvIEhJRiBjb250ZXh0CisgKiBAcGRldjogcG9pbnRlciB0byBvbCBwZGV2CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0dXBfZmFzdHBhdGhfY2VfaGFuZGxlcyhzdHJ1Y3Qgb2xfc29mdGMgKm9zYywgc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCS8qCisJICogQmVmb3JlIHRoZSBIVFQgYXR0YWNoLCBzZXQgdXAgdGhlIENFIGhhbmRsZXMKKwkgKiBDRSBoYW5kbGVzIGFyZSAoc3RydWN0IENFX3N0YXRlICopCisJICogVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGluIHRoZSBmYXN0IHBhdGgKKwkgKi8KKwlwZGV2LT5jZV90eF9oZGwgPSAoc3RydWN0IENFX2hhbmRsZSAqKQorCQlvc2MtPmNlX2lkX3RvX3N0YXRlW0NFX0hUVF9IMlRfTVNHXTsKKworfQorCisvKioKKyAqIGluaXRfdHhkZXNjX2lkKCkgaW5pdGlhbGl6ZSBUeCBkZXNjIHdpdGggaWQKKyAqCisgKiBAcGRldjogaGFuZGxlIE9MIHBkZXYKKyAqIEBkZXNjX251bTogVHggZGVzY3JpcHRvciBudW1iZXIKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitpbml0X3R4ZGVzY19pZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsIGludCBkZXNjX251bSkKK3sKKwlwZGV2LT50eF9kZXNjLmFycmF5W2Rlc2NfbnVtXS50eF9kZXNjLmlkID0gZGVzY19udW07CisJY2RmX2F0b21pY19pbml0KCZwZGV2LT50eF9kZXNjLmFycmF5W2Rlc2NfbnVtXS50eF9kZXNjLnJlZl9jbnQpOworfQorI2Vsc2UgIC8qIG5vdCBXTEFOX0ZFQVRVUkVfRkFTVFBBVEggKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0dXBfZmFzdHBhdGhfY2VfaGFuZGxlcyhzdHJ1Y3Qgb2xfc29mdGMgKm9zYywgc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworfQorc3RhdGljIGlubGluZSB2b2lkCitpbml0X3R4ZGVzY19pZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsIGludCBkZXNjX251bSkKK3sKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfRkFTVFBBVEggKi8KKworI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKKy8qKgorICogb2xfdHhfc2V0X2Rlc2NfZ2xvYmFsX3Bvb2xfc2l6ZSgpIC0gc2V0IGdsb2JhbCBwb29sIHNpemUKKyAqIEBudW1fbXNkdV9kZXNjOiB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworaW5saW5lCit2b2lkIG9sX3R4X3NldF9kZXNjX2dsb2JhbF9wb29sX3NpemUodWludDMyX3QgbnVtX21zZHVfZGVzYykKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlpZiAoIXBkZXYpIHsKKwkJY2RmX3ByaW50KCIlczogcGRldiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJcGRldi0+bnVtX21zZHVfZGVzYyA9IG51bV9tc2R1X2Rlc2MgKyBUWF9GTE9XX01HTVRfUE9PTF9TSVpFOworCXJldHVybjsKK30KKworLyoqCisgKiBvbF90eF9nZXRfZGVzY19nbG9iYWxfcG9vbF9zaXplKCkgLSBnZXQgZ2xvYmFsIHBvb2wgc2l6ZQorICogQHBkZXY6IHBkZXYgaGFuZGxlCisgKgorICogUmV0dXJuOiBnbG9iYWwgcG9vbCBzaXplCisgKi8KK3N0YXRpYyBpbmxpbmUKK3VpbnQzMl90IG9sX3R4X2dldF9kZXNjX2dsb2JhbF9wb29sX3NpemUoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCXJldHVybiBwZGV2LT5udW1fbXNkdV9kZXNjOworfQorI2Vsc2UKKy8qKgorICogb2xfdHhfZ2V0X2Rlc2NfZ2xvYmFsX3Bvb2xfc2l6ZSgpIC0gZ2V0IGdsb2JhbCBwb29sIHNpemUKKyAqIEBwZGV2OiBwZGV2IGhhbmRsZQorICoKKyAqIFJldHVybjogZ2xvYmFsIHBvb2wgc2l6ZQorICovCitzdGF0aWMgaW5saW5lCit1aW50MzJfdCBvbF90eF9nZXRfZGVzY19nbG9iYWxfcG9vbF9zaXplKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwlyZXR1cm4gb2xfY2ZnX3RhcmdldF90eF9jcmVkaXQocGRldi0+Y3RybF9wZGV2KTsKK30KKyNlbmRpZgorCisvKioKKyAqIG9sX3R4cnhfcGRldl9hbGxvYygpIC0gYWxsb2NhdGUgdHhyeCBwZGV2CisgKiBAY3RybF9wZGV2OiBjZmcgcGRldgorICogQGh0Y19wZGV2OiBIVEMgcGRldgorICogQG9zZGV2OiBvcyBkZXYKKyAqCisgKiBSZXR1cm46IHR4cnggcGRldiBoYW5kbGUKKyAqCQkgIE5VTEwgZm9yIGZhaWx1cmUKKyAqLworb2xfdHhyeF9wZGV2X2hhbmRsZQorb2xfdHhyeF9wZGV2X2FsbG9jKG9sX3BkZXZfaGFuZGxlIGN0cmxfcGRldiwKKwkJICAgIEhUQ19IQU5ETEUgaHRjX3BkZXYsIGNkZl9kZXZpY2VfdCBvc2RldikKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXY7CisJaW50IGk7CisKKwlwZGV2ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwZGV2KSk7CisJaWYgKCFwZGV2KQorCQlnb3RvIGZhaWwwOworCWNkZl9tZW1femVybyhwZGV2LCBzaXplb2YoKnBkZXYpKTsKKworCXBkZXYtPmNmZy5kZWZhdWx0X3R4X2NvbXBfcmVxID0gIW9sX2NmZ190eF9mcmVlX2F0X2Rvd25sb2FkKGN0cmxfcGRldik7CisKKwkvKiBzdG9yZSBwcm92aWRlZCBwYXJhbXMgKi8KKwlwZGV2LT5jdHJsX3BkZXYgPSBjdHJsX3BkZXY7CisJcGRldi0+b3NkZXYgPSBvc2RldjsKKworCWZvciAoaSA9IDA7IGkgPCBodHRfbnVtX3NlY190eXBlczsgaSsrKQorCQlwZGV2LT5zZWNfdHlwZXNbaV0gPSAoZW51bSBvbF9zZWNfdHlwZSlpOworCisJVFhSWF9TVEFUU19JTklUKHBkZXYpOworCisJVEFJTFFfSU5JVCgmcGRldi0+dmRldl9saXN0KTsKKworCS8qIGRvIGluaXRpYWwgc2V0IHVwIG9mIHRoZSBwZWVyIElEIC0+IHBlZXIgb2JqZWN0IGxvb2t1cCBtYXAgKi8KKwlpZiAob2xfdHhyeF9wZWVyX2ZpbmRfYXR0YWNoKHBkZXYpKQorCQlnb3RvIGZhaWwxOworCisJcGRldi0+aHR0X3BkZXYgPQorCQlodHRfcGRldl9hbGxvYyhwZGV2LCBjdHJsX3BkZXYsIGh0Y19wZGV2LCBvc2Rldik7CisJaWYgKCFwZGV2LT5odHRfcGRldikKKwkJZ290byBmYWlsMjsKKworCXJldHVybiBwZGV2OworCitmYWlsMjoKKwlvbF90eHJ4X3BlZXJfZmluZF9kZXRhY2gocGRldik7CisKK2ZhaWwxOgorCWNkZl9tZW1fZnJlZShwZGV2KTsKKworZmFpbDA6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogb2xfdHhyeF9wZGV2X2F0dGFjaCgpIC0gYXR0YWNoIHR4cnggcGRldgorICogQHBkZXY6IHR4cnggcGRldgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcworICovCitpbnQKK29sX3R4cnhfcGRldl9hdHRhY2gob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KQoreworCWludCBpOworCWludCByZXQgPSAwOworCXVpbnQxNl90IGRlc2NfcG9vbF9zaXplOworCXN0cnVjdCBvbF9zb2Z0YyAqb3NjID0gIGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRik7CisKKwlpZiAoIW9zYykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWwwOworCX0KKworCS8qCisJICogRm9yIExMLCBsaW1pdCB0aGUgbnVtYmVyIG9mIGhvc3QncyB0eCBkZXNjcmlwdG9ycyB0byBtYXRjaAorCSAqIHRoZSBudW1iZXIgb2YgdGFyZ2V0IEZXIHR4IGRlc2NyaXB0b3JzLgorCSAqIFRoaXMgc2ltcGxpZmllcyB0aGUgRlcsIGJ5IGVuc3VyaW5nIHRoZSBob3N0IHdpbGwgbmV2ZXIKKwkgKiBkb3dubG9hZCBtb3JlIHR4IGRlc2NyaXB0b3JzIHRoYW4gdGhlIHRhcmdldCBoYXMgc3BhY2UgZm9yLgorCSAqIFRoZSBGVyB3aWxsIGRyb3AvZnJlZSBsb3ctcHJpb3JpdHkgdHggZGVzY3JpcHRvcnMgd2hlbiBpdAorCSAqIHN0YXJ0cyB0byBydW4gbG93LCBzbyB0aGF0IGluIHRoZW9yeSB0aGUgaG9zdCBzaG91bGQgbmV2ZXIKKwkgKiBydW4gb3V0IG9mIHR4IGRlc2NyaXB0b3JzLgorCSAqLworCisJLyogaW5pdGlhbGl6ZSB0aGUgY291bnRlciBvZiB0aGUgdGFyZ2V0J3MgdHggYnVmZmVyIGF2YWlsYWJpbGl0eSAqLworCWNkZl9hdG9taWNfaW5pdCgmcGRldi0+dGFyZ2V0X3R4X2NyZWRpdCk7CisJY2RmX2F0b21pY19pbml0KCZwZGV2LT5vcmlnX3RhcmdldF90eF9jcmVkaXQpOworCS8qCisJICogTEwgLSBpbml0aWFsaXplIHRoZSB0YXJnZXQgY3JlZGl0IG91dHNlbHZlcy4KKwkgKiBITCAtIHdhaXQgZm9yIGEgSFRUIHRhcmdldCBjcmVkaXQgaW5pdGlhbGl6YXRpb24gZHVyaW5nIGh0dF9hdHRhY2guCisJICovCisKKwljZGZfYXRvbWljX2FkZChvbF9jZmdfdGFyZ2V0X3R4X2NyZWRpdChwZGV2LT5jdHJsX3BkZXYpLAorCQkgICAmcGRldi0+dGFyZ2V0X3R4X2NyZWRpdCk7CisKKwlkZXNjX3Bvb2xfc2l6ZSA9IG9sX3R4X2dldF9kZXNjX2dsb2JhbF9wb29sX3NpemUocGRldik7CisKKwlzZXR1cF9mYXN0cGF0aF9jZV9oYW5kbGVzKG9zYywgcGRldik7CisKKwlyZXQgPSBodHRfYXR0YWNoKHBkZXYtPmh0dF9wZGV2LCBkZXNjX3Bvb2xfc2l6ZSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsMDsKKworCS8qIFVwZGF0ZSBDRSdzIHBrdCBkb3dubG9hZCBsZW5ndGggKi8KKwljZV9wa3RfZGxfbGVuX3NldCgodm9pZCAqKW9zYywgaHR0X3BrdF9kbF9sZW5fZ2V0KHBkZXYtPmh0dF9wZGV2KSk7CisKKwkvKiBBdHRhY2ggbWljcm8gY29udHJvbGxlciBkYXRhIHBhdGggb2ZmbG9hZCByZXNvdXJjZSAqLworCWlmIChvbF9jZmdfaXBhX3VjX29mZmxvYWRfZW5hYmxlZChwZGV2LT5jdHJsX3BkZXYpKQorCQlpZiAoaHR0X2lwYV91Y19hdHRhY2gocGRldi0+aHR0X3BkZXYpKQorCQkJZ290byBmYWlsMTsKKworCXBkZXYtPnR4X2Rlc2MuYXJyYXkgPQorCQljZGZfbWVtX21hbGxvYyhkZXNjX3Bvb2xfc2l6ZSAqCisJCQkgICAgICAgc2l6ZW9mKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QpKTsKKwlpZiAoIXBkZXYtPnR4X2Rlc2MuYXJyYXkpCisJCWdvdG8gZmFpbDI7CisJY2RmX21lbV9zZXQocGRldi0+dHhfZGVzYy5hcnJheSwKKwkJICAgIGRlc2NfcG9vbF9zaXplICogc2l6ZW9mKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QpLCAwKTsKKworCS8qCisJICogRWFjaCBTVyB0eCBkZXNjICh1c2VkIG9ubHkgd2l0aGluIHRoZSB0eCBkYXRhcGF0aCBTVykgaGFzIGEKKwkgKiBtYXRjaGluZyBIVFQgdHggZGVzYyAodXNlZCBmb3IgZG93bmxvYWRpbmcgdHggbWV0YS1kYXRhIHRvIEZXL0hXKS4KKwkgKiBHbyBhaGVhZCBhbmQgYWxsb2NhdGUgdGhlIEhUVCB0eCBkZXNjIGFuZCBsaW5rIGl0IHdpdGggdGhlIFNXIHR4CisJICogZGVzYyBub3csIHRvIGF2b2lkIGRvaW5nIGl0IGR1cmluZyB0aW1lLWNyaXRpY2FsIHRyYW5zbWl0LgorCSAqLworCXBkZXYtPnR4X2Rlc2MucG9vbF9zaXplID0gZGVzY19wb29sX3NpemU7CisJZm9yIChpID0gMDsgaSA8IGRlc2NfcG9vbF9zaXplOyBpKyspIHsKKwkJdm9pZCAqaHR0X3R4X2Rlc2M7CisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpCisJCXZvaWQgKmh0dF9mcmFnX2Rlc2M7CisJCXVpbnQzMl90IGZyYWdfcGFkZHJfbG87CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisJCXVpbnQzMl90IHBhZGRyX2xvOworCisJCWh0dF90eF9kZXNjID0gaHR0X3R4X2Rlc2NfYWxsb2MocGRldi0+aHR0X3BkZXYsICZwYWRkcl9sbyk7CisJCWlmICghaHR0X3R4X2Rlc2MpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCQkgICIlczogZmFpbGVkIHRvIGFsbG9jIEhUVCB0eCBkZXNjICglZCBvZiAlZCkiLAorCQkJCV9fZnVuY19fLCBpLCBkZXNjX3Bvb2xfc2l6ZSk7CisJCQl3aGlsZSAoLS1pID49IDApIHsKKwkJCQlodHRfdHhfZGVzY19mcmVlKHBkZXYtPmh0dF9wZGV2LAorCQkJCQkJIHBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0uCisJCQkJCQkgdHhfZGVzYy5odHRfdHhfZGVzYyk7CisJCQl9CisJCQlnb3RvIGZhaWwzOworCQl9CisJCXBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0udHhfZGVzYy5odHRfdHhfZGVzYyA9IGh0dF90eF9kZXNjOworCQlwZGV2LT50eF9kZXNjLmFycmF5W2ldLnR4X2Rlc2MuaHR0X3R4X2Rlc2NfcGFkZHIgPSBwYWRkcl9sbzsKKworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorCQlodHRfZnJhZ19kZXNjID0gaHR0X3R4X2ZyYWdfYWxsb2MocGRldi0+aHR0X3BkZXYsIGksCisJCQkJCQkgICZmcmFnX3BhZGRyX2xvKTsKKwkJaWYgKCFodHRfZnJhZ19kZXNjKSB7CisJCQljZGZfcHJpbnQoIiVzOiBmYWlsZWQgdG8gYWxsb2MgSFRUIGZyYWcgZHNjICglZC8lZClcbiIsCisJCQkJICBfX2Z1bmNfXywgaSwgZGVzY19wb29sX3NpemUpOworCQkJLyogSXMgdGhlcmUgYSBsZWFrIGhlcmUsIGlzIHRoaXMgaGFuZGxpbmcgY29ycmVjdD8gKi8KKwkJCWdvdG8gZmFpbDM7CisJCX0KKwkJLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgNiB3b3JkcyAoVFNPIGZsYWdzKQorCQkgICBvZiB0aGUgZnJhZyBkZXNjcmlwdG9yICovCisJCW1lbXNldChodHRfZnJhZ19kZXNjLCAwLCA2KnNpemVvZih1aW50MzJfdCkpOworCisJCXBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0udHhfZGVzYy5odHRfZnJhZ19kZXNjID0gaHR0X2ZyYWdfZGVzYzsKKyNpZiBkZWZpbmVkKEhFTElVTVBMVVNfREVCVUcpCisJCWNkZl9wcmludCgiJXM6JWQgJWQgJXBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCWksIHBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0udHhfZGVzYy5odHRfZnJhZ19kZXNjKTsKKyNlbmRpZiAvKiBIRUxJVU1QTFVTX0RFQlVHICovCisJCXBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0udHhfZGVzYy5odHRfZnJhZ19kZXNjX3BhZGRyID0KKwkJCWZyYWdfcGFkZHJfbG87CisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX0RFQlVHKQorCQljZGZfcHJpbnQoIiVzOiVkIC0gJWQgRlJBRyBWQSAweCVwIEZSQUcgUEEgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgaSwKKwkJCXBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0udHhfZGVzYy5odHRfZnJhZ19kZXNjLAorCQkJcGRldi0+dHhfZGVzYy5hcnJheVtpXS50eF9kZXNjLmh0dF9mcmFnX2Rlc2NfcGFkZHIpOworI2VuZGlmIC8qIEhFTElVTVBMVVNfREVCVUcgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKEhFTElVTVBMVVNfUEFERFI2NCkgKi8KKworCQlwZGV2LT50eF9kZXNjLmFycmF5W2ldLnR4X2Rlc2MuaW5kZXggPSBpOworI2lmZGVmIFFDQV9TVVBQT1JUX1RYREVTQ19TQU5JVFlfQ0hFQ0tTCisJCXBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0udHhfZGVzYy5wa3RfdHlwZSA9IDB4ZmY7CisjaWZkZWYgUUNBX0NPTVBVVEVfVFhfREVMQVkKKwkJcGRldi0+dHhfZGVzYy5hcnJheVtpXS50eF9kZXNjLmVudHJ5X3RpbWVzdGFtcF90aWNrcyA9CisJCQkweGZmZmZmZmZmOworI2VuZGlmCisjZW5kaWYKKwkJaW5pdF90eGRlc2NfaWQocGRldiwgaSk7CisJfQorCisJLyogbGluayBTVyB0eCBkZXNjcyBpbnRvIGEgZnJlZWxpc3QgKi8KKwlwZGV2LT50eF9kZXNjLm51bV9mcmVlID0gZGVzY19wb29sX3NpemU7CisJcGRldi0+dHhfZGVzYy5mcmVlbGlzdCA9ICZwZGV2LT50eF9kZXNjLmFycmF5WzBdOworCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMSwKKwkJICAgIiVzIGZpcnN0IHR4X2Rlc2M6MHglcCBMYXN0IHR4IGRlc2M6MHglcFxuIiwgX19mdW5jX18sCisJCSAgICh1aW50MzJfdCAqKSBwZGV2LT50eF9kZXNjLmZyZWVsaXN0LAorCQkgICAodWludDMyX3QgKikgKHBkZXYtPnR4X2Rlc2MuZnJlZWxpc3QgKyBkZXNjX3Bvb2xfc2l6ZSkpOworCWZvciAoaSA9IDA7IGkgPCBkZXNjX3Bvb2xfc2l6ZSAtIDE7IGkrKykKKwkJcGRldi0+dHhfZGVzYy5hcnJheVtpXS5uZXh0ID0gJnBkZXYtPnR4X2Rlc2MuYXJyYXlbaSArIDFdOworCisJcGRldi0+dHhfZGVzYy5hcnJheVtpXS5uZXh0ID0gTlVMTDsKKworCS8qIGNoZWNrIHdoYXQgZm9ybWF0IG9mIGZyYW1lcyBhcmUgZXhwZWN0ZWQgdG8gYmUgZGVsaXZlcmVkIGJ5IHRoZSBPUyAqLworCXBkZXYtPmZyYW1lX2Zvcm1hdCA9IG9sX2NmZ19mcmFtZV90eXBlKHBkZXYtPmN0cmxfcGRldik7CisJaWYgKHBkZXYtPmZyYW1lX2Zvcm1hdCA9PSB3bGFuX2ZybV9mbXRfbmF0aXZlX3dpZmkpCisJCXBkZXYtPmh0dF9wa3RfdHlwZSA9IGh0dF9wa3RfdHlwZV9uYXRpdmVfd2lmaTsKKwllbHNlIGlmIChwZGV2LT5mcmFtZV9mb3JtYXQgPT0gd2xhbl9mcm1fZm10XzgwMl8zKSB7CisJCWlmIChvbF9jZmdfaXNfY2VfY2xhc3NpZnlfZW5hYmxlZChwZGV2LT5jdHJsX3BkZXYpKQorCQkJcGRldi0+aHR0X3BrdF90eXBlID0gaHR0X3BrdF90eXBlX2V0aDI7CisJCWVsc2UKKwkJCXBkZXYtPmh0dF9wa3RfdHlwZSA9IGh0dF9wa3RfdHlwZV9ldGhlcm5ldDsKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlcyBJbnZhbGlkIHN0YW5kYXJkIGZyYW1lIHR5cGU6ICVkIiwKKwkJCSAgX19mdW5jX18sIHBkZXYtPmZyYW1lX2Zvcm1hdCk7CisJCWdvdG8gZmFpbDQ7CisJfQorCisJLyogc2V0dXAgdGhlIGdsb2JhbCByeCBkZWZyYWcgd2FpdGxpc3QgKi8KKwlUQUlMUV9JTklUKCZwZGV2LT5yeC5kZWZyYWcud2FpdGxpc3QpOworCisJLyogY29uZmlndXJlIHdoZXJlIGRlZnJhZyB0aW1lb3V0IGFuZCBkdXBsaWNhdGUgZGV0ZWN0aW9uIGlzIGhhbmRsZWQgKi8KKwlwZGV2LT5yeC5mbGFncy5kZWZyYWdfdGltZW91dF9jaGVjayA9CisJCXBkZXYtPnJ4LmZsYWdzLmR1cF9jaGVjayA9CisJCW9sX2NmZ19yeF9ob3N0X2RlZnJhZ190aW1lb3V0X2R1cGxpY2F0ZV9jaGVjayhwZGV2LT5jdHJsX3BkZXYpOworCisjaWZkZWYgUUNBX1NVUFBPUlRfU1dfVFhSWF9FTkNBUAorCS8qIE5lZWQgdG8gcmV2aXNpdCB0aGlzIHBhcnQuIEN1cnJlbnRseSxoYXJkY29kZSB0byByaXZhJ3MgY2FwcyAqLworCXBkZXYtPnRhcmdldF90eF90cmFuX2NhcHMgPSB3bGFuX2ZybV90cmFuX2NhcF9yYXc7CisJcGRldi0+dGFyZ2V0X3J4X3RyYW5fY2FwcyA9IHdsYW5fZnJtX3RyYW5fY2FwX3JhdzsKKwkvKgorCSAqIFRoZSBSaXZhIEhXIGRlLWFnZ3JlZ2F0ZSBkb2Vzbid0IGhhdmUgY2FwYWJpbGl0eSB0byBnZW5lcmF0ZSA4MDIuMTEKKwkgKiBoZWFkZXIgZm9yIG5vbi1maXJzdCBzdWJmcmFtZSBvZiBBLU1TRFUuCisJICovCisJcGRldi0+c3dfc3ViZnJtX2hkcl9yZWNvdmVyeV9lbmFibGUgPSAxOworCS8qCisJICogVGhlIFJpdmEgSFcgZG9lc24ndCBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIHNldCBQcm90ZWN0ZWQgRnJhbWUgYml0CisJICogaW4gdGhlIE1BQyBoZWFkZXIgZm9yIGVuY3J5cHRlZCBkYXRhIGZyYW1lLgorCSAqLworCXBkZXYtPnN3X3BmX3Byb2NfZW5hYmxlID0gMTsKKworCWlmIChwZGV2LT5mcmFtZV9mb3JtYXQgPT0gd2xhbl9mcm1fZm10XzgwMl8zKSB7CisJCS8qIHN3IGxsYyBwcm9jZXNzIGlzIG9ubHkgbmVlZGVkIGluCisJCSAgIDgwMi4zIHRvIDgwMi4xMSB0cmFuc2Zvcm0gY2FzZSAqLworCQlwZGV2LT5zd190eF9sbGNfcHJvY19lbmFibGUgPSAxOworCQlwZGV2LT5zd19yeF9sbGNfcHJvY19lbmFibGUgPSAxOworCX0gZWxzZSB7CisJCXBkZXYtPnN3X3R4X2xsY19wcm9jX2VuYWJsZSA9IDA7CisJCXBkZXYtPnN3X3J4X2xsY19wcm9jX2VuYWJsZSA9IDA7CisJfQorCisJc3dpdGNoIChwZGV2LT5mcmFtZV9mb3JtYXQpIHsKKwljYXNlIHdsYW5fZnJtX2ZtdF9yYXc6CisJCXBkZXYtPnN3X3R4X2VuY2FwID0KKwkJCXBkZXYtPnRhcmdldF90eF90cmFuX2NhcHMgJiB3bGFuX2ZybV90cmFuX2NhcF9yYXcKKwkJCT8gMCA6IDE7CisJCXBkZXYtPnN3X3J4X2RlY2FwID0KKwkJCXBkZXYtPnRhcmdldF9yeF90cmFuX2NhcHMgJiB3bGFuX2ZybV90cmFuX2NhcF9yYXcKKwkJCT8gMCA6IDE7CisJCWJyZWFrOworCWNhc2Ugd2xhbl9mcm1fZm10X25hdGl2ZV93aWZpOgorCQlwZGV2LT5zd190eF9lbmNhcCA9CisJCQlwZGV2LT4KKwkJCXRhcmdldF90eF90cmFuX2NhcHMgJiB3bGFuX2ZybV90cmFuX2NhcF9uYXRpdmVfd2lmaQorCQkJPyAwIDogMTsKKwkJcGRldi0+c3dfcnhfZGVjYXAgPQorCQkJcGRldi0+CisJCQl0YXJnZXRfcnhfdHJhbl9jYXBzICYgd2xhbl9mcm1fdHJhbl9jYXBfbmF0aXZlX3dpZmkKKwkJCT8gMCA6IDE7CisJCWJyZWFrOworCWNhc2Ugd2xhbl9mcm1fZm10XzgwMl8zOgorCQlwZGV2LT5zd190eF9lbmNhcCA9CisJCQlwZGV2LT50YXJnZXRfdHhfdHJhbl9jYXBzICYgd2xhbl9mcm1fdHJhbl9jYXBfODAyMworCQkJPyAwIDogMTsKKwkJcGRldi0+c3dfcnhfZGVjYXAgPQorCQkJcGRldi0+dGFyZ2V0X3J4X3RyYW5fY2FwcyAmIHdsYW5fZnJtX3RyYW5fY2FwXzgwMjMKKwkJCT8gMCA6IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkludmFsaWQgc3RkIGZyYW1lIHR5cGU7IFtlbi9kZV1jYXA6IGY6JXggdDoleCByOiV4IiwKKwkJCSAgcGRldi0+ZnJhbWVfZm9ybWF0LAorCQkJICBwZGV2LT50YXJnZXRfdHhfdHJhbl9jYXBzLCBwZGV2LT50YXJnZXRfcnhfdHJhbl9jYXBzKTsKKwkJZ290byBmYWlsNDsKKwl9CisjZW5kaWYKKworCS8qCisJICogRGV0ZXJtaW5lIHdoYXQgcnggcHJvY2Vzc2luZyBzdGVwcyBhcmUgZG9uZSB3aXRoaW4gdGhlIGhvc3QuCisJICogUG9zc2liaWxpdGllczoKKwkgKiAxLiAgTm90aGluZyAtIHJ4LT50eCBmb3J3YXJkaW5nIGFuZCByeCBQTiBlbnRpcmVseSB3aXRoaW4gdGFyZ2V0LgorCSAqICAgICAoVGhpcyBpcyB1bmxpa2VseTsgZXZlbiBpZiB0aGUgdGFyZ2V0IGlzIGRvaW5nIHJ4LT50eCBmb3J3YXJkaW5nLAorCSAqICAgICB0aGUgaG9zdCBzaG91bGQgYmUgZG9pbmcgcngtPnR4IGZvcndhcmRpbmcgdG9vLCBhcyBhIGJhY2sgdXAgZm9yCisJICogICAgIHRoZSB0YXJnZXQncyByeC0+dHggZm9yd2FyZGluZywgaW4gY2FzZSB0aGUgdGFyZ2V0IHJ1bnMgc2hvcnQgb24KKwkgKiAgICAgbWVtb3J5LCBhbmQgY2FuJ3Qgc3RvcmUgcngtPnR4IGZyYW1lcyB0aGF0IGFyZSB3YWl0aW5nIGZvcgorCSAqICAgICBtaXNzaW5nIHByaW9yIHJ4IGZyYW1lcyB0byBhcnJpdmUuKQorCSAqIDIuICBKdXN0IHJ4IC0+IHR4IGZvcndhcmRpbmcuCisJICogICAgIFRoaXMgaXMgdGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBmb3IgSEwsIGFuZCBhIGxpa2VseQorCSAqICAgICBjb25maWd1cmF0aW9uIGZvciBMTCBTVEEgb3Igc21hbGwgQVBzIChlLmcuIHJldGFpbCBBUHMpLgorCSAqIDMuICBCb3RoIFBOIGNoZWNrIGFuZCByeCAtPiB0eCBmb3J3YXJkaW5nLgorCSAqICAgICBUaGlzIGlzIHRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gZm9yIGxhcmdlIExMIEFQcy4KKwkgKiBIb3N0LXNpZGUgUE4gY2hlY2sgd2l0aG91dCByeC0+dHggZm9yd2FyZGluZyBpcyBub3QgYSB2YWxpZAorCSAqIGNvbmZpZ3VyYXRpb24sIHNpbmNlIHRoZSBQTiBjaGVjayBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvCisJICogdGhlIHJ4LT50eCBmb3J3YXJkaW5nLgorCSAqLworCWlmIChvbF9jZmdfaXNfZnVsbF9yZW9yZGVyX29mZmxvYWQocGRldi0+Y3RybF9wZGV2KSkgeworCQkvKiBQTiBjaGVjaywgcngtdHggZm9yd2FyZGluZyBhbmQgcnggcmVvcmRlciBpcyBkb25lIGJ5CisJCSAgIHRoZSB0YXJnZXQgKi8KKwkJaWYgKG9sX2NmZ19yeF9md2RfZGlzYWJsZWQocGRldi0+Y3RybF9wZGV2KSkKKwkJCXBkZXYtPnJ4X29wdF9wcm9jID0gb2xfcnhfaW5fb3JkZXJfZGVsaXZlcjsKKwkJZWxzZQorCQkJcGRldi0+cnhfb3B0X3Byb2MgPSBvbF9yeF9md2RfY2hlY2s7CisJfSBlbHNlIHsKKwkJaWYgKG9sX2NmZ19yeF9wbl9jaGVjayhwZGV2LT5jdHJsX3BkZXYpKSB7CisJCQlpZiAob2xfY2ZnX3J4X2Z3ZF9kaXNhYmxlZChwZGV2LT5jdHJsX3BkZXYpKSB7CisJCQkJLyoKKwkJCQkgKiBQTiBjaGVjayBkb25lIG9uIGhvc3QsCisJCQkJICogcngtPnR4IGZvcndhcmRpbmcgbm90IGRvbmUgYXQgYWxsLgorCQkJCSAqLworCQkJCXBkZXYtPnJ4X29wdF9wcm9jID0gb2xfcnhfcG5fY2hlY2tfb25seTsKKwkJCX0gZWxzZSBpZiAob2xfY2ZnX3J4X2Z3ZF9jaGVjayhwZGV2LT5jdHJsX3BkZXYpKSB7CisJCQkJLyoKKwkJCQkgKiBCb3RoIFBOIGNoZWNrIGFuZCByeC0+dHggZm9yd2FyZGluZyBkb25lCisJCQkJICogb24gaG9zdC4KKwkJCQkgKi8KKwkJCQlwZGV2LT5yeF9vcHRfcHJvYyA9IG9sX3J4X3BuX2NoZWNrOworCQkJfSBlbHNlIHsKKyNkZWZpbmUgVFJBQ0VTVFIwMSAiaW52YWxpZCBjb25maWc6IGlmIHJ4IFBOIGNoZWNrIGlzIG9uIHRoZSBob3N0LCJcCisicngtPnR4IGZvcndhcmRpbmcgY2hlY2sgbmVlZHMgdG8gYWxzbyBiZSBvbiB0aGUgaG9zdCIKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiJXM6ICVzIiwgX19mdW5jX18sIFRSQUNFU1RSMDEpOworI3VuZGVmIFRSQUNFU1RSMDEKKwkJCQlnb3RvIGZhaWw0OworCQkJfQorCQl9IGVsc2UgeworCQkJLyogUE4gY2hlY2sgZG9uZSBvbiB0YXJnZXQgKi8KKwkJCWlmICgoIW9sX2NmZ19yeF9md2RfZGlzYWJsZWQocGRldi0+Y3RybF9wZGV2KSkgJiYKKwkJCSAgICBvbF9jZmdfcnhfZndkX2NoZWNrKHBkZXYtPmN0cmxfcGRldikpIHsKKwkJCQkvKgorCQkJCSAqIHJ4LT50eCBmb3J3YXJkaW5nIGRvbmUgb24gaG9zdCAocG9zc2libHkgYXMKKwkJCQkgKiBiYWNrLXVwIGZvciB0YXJnZXQtc2lkZSBwcmltYXJ5IHJ4LT50eAorCQkJCSAqIGZvcndhcmRpbmcpCisJCQkJICovCisJCQkJcGRldi0+cnhfb3B0X3Byb2MgPSBvbF9yeF9md2RfY2hlY2s7CisJCQl9IGVsc2UgeworCQkJCS8qIHJ4LT50eCBmb3J3YXJkaW5nIGVpdGhlciBkb25lIGluIHRhcmdldCwKKwkJCQkgKiBvciBub3QgZG9uZSBhdCBhbGwgKi8KKwkJCQlwZGV2LT5yeF9vcHRfcHJvYyA9IG9sX3J4X2RlbGl2ZXI7CisJCQl9CisJCX0KKwl9CisKKwkvKiBpbml0aWFsaXplIG11dGV4ZXMgZm9yIHR4IGRlc2MgYWxsb2MgYW5kIHBlZXIgbG9va3VwICovCisJY2RmX3NwaW5sb2NrX2luaXQoJnBkZXYtPnR4X211dGV4KTsKKwljZGZfc3BpbmxvY2tfaW5pdCgmcGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCWNkZl9zcGlubG9ja19pbml0KCZwZGV2LT5yeC5tdXRleCk7CisJY2RmX3NwaW5sb2NrX2luaXQoJnBkZXYtPmxhc3RfcmVhbF9wZWVyX211dGV4KTsKKwlPTF9UWFJYX1BFRVJfU1RBVFNfTVVURVhfSU5JVChwZGV2KTsKKworCWlmIChPTF9SWF9SRU9SREVSX1RSQUNFX0FUVEFDSChwZGV2KSAhPSBBX09LKQorCQlnb3RvIGZhaWw1OworCisJaWYgKE9MX1JYX1BOX1RSQUNFX0FUVEFDSChwZGV2KSAhPSBBX09LKQorCQlnb3RvIGZhaWw2OworCisjaWZkZWYgUEVSRV9JUF9IRFJfQUxJR05NRU5UX1dBUgorCXBkZXYtPmhvc3RfODAyMTFfZW5hYmxlID0gb2xfc2NuX2hvc3RfODAyMTFfZW5hYmxlX2dldChwZGV2LT5jdHJsX3BkZXYpOworI2VuZGlmCisKKwkvKgorCSAqIFdESSBldmVudCBhdHRhY2gKKwkgKi8KKwl3ZGlfZXZlbnRfYXR0YWNoKHBkZXYpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHJ4IFBOIGNoZWNrIGNoYXJhY3RlcmlzdGljcyBmb3IgZGlmZmVyZW50IHNlY3VyaXR5IHR5cGVzLgorCSAqLworCWNkZl9tZW1fc2V0KCZwZGV2LT5yeF9wblswXSwgc2l6ZW9mKHBkZXYtPnJ4X3BuKSwgMCk7CisKKwkvKiBUS0lQOiA0OC1iaXQgVFNDLCBDQ01QOiA0OC1iaXQgUE4gKi8KKwlwZGV2LT5yeF9wbltodHRfc2VjX3R5cGVfdGtpcF0ubGVuID0KKwkJcGRldi0+cnhfcG5baHR0X3NlY190eXBlX3RraXBfbm9taWNdLmxlbiA9CisJCQlwZGV2LT5yeF9wbltodHRfc2VjX3R5cGVfYWVzX2NjbXBdLmxlbiA9IDQ4OworCXBkZXYtPnJ4X3BuW2h0dF9zZWNfdHlwZV90a2lwXS5jbXAgPQorCQlwZGV2LT5yeF9wbltodHRfc2VjX3R5cGVfdGtpcF9ub21pY10uY21wID0KKwkJCXBkZXYtPnJ4X3BuW2h0dF9zZWNfdHlwZV9hZXNfY2NtcF0uY21wID0gb2xfcnhfcG5fY21wNDg7CisKKwkvKiBXQVBJOiAxMjgtYml0IFBOICovCisJcGRldi0+cnhfcG5baHR0X3NlY190eXBlX3dhcGldLmxlbiA9IDEyODsKKwlwZGV2LT5yeF9wbltodHRfc2VjX3R5cGVfd2FwaV0uY21wID0gb2xfcnhfcG5fd2FwaV9jbXA7CisKKwlPTF9SWF9SRU9SREVSX1RJTUVPVVRfSU5JVChwZGV2KTsKKworCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMSwgIkNyZWF0ZWQgcGRldiAlcFxuIiwgcGRldik7CisKKwlwZGV2LT5jZmcuaG9zdF9hZGRiYSA9IG9sX2NmZ19ob3N0X2FkZGJhKHBkZXYtPmN0cmxfcGRldik7CisKKyNpZmRlZiBRQ0FfU1VQUE9SVF9QRUVSX0RBVEFfUlhfUlNTSQorI2RlZmluZSBPTF9UWFJYX1JTU0lfVVBEQVRFX1NISUZUX0RFRkFVTFQgMworCisvKiAjaWYgMSAtLSBUT0RPOiBjbGVhbiB0aGlzIHVwICovCisjZGVmaW5lIE9MX1RYUlhfUlNTSV9ORVdfV0VJR0hUX0RFRkFVTFQJXAorCS8qIGF2ZyA9IDEwMCUgKiBuZXcgKyAwJSAqIG9sZCAqLyBcCisJKDEgPDwgT0xfVFhSWF9SU1NJX1VQREFURV9TSElGVF9ERUZBVUxUKQorLyoKKyNlbHNlCisjZGVmaW5lIE9MX1RYUlhfUlNTSV9ORVdfV0VJR0hUX0RFRkFVTFQKKwkvL2F2ZyA9IDI1JSAqIG5ldyArIDI1JSAqIG9sZAorCSgxIDw8IChPTF9UWFJYX1JTU0lfVVBEQVRFX1NISUZUX0RFRkFVTFQtMikpCisjZW5kaWYKKyovCisJcGRldi0+cnNzaV91cGRhdGVfc2hpZnQgPSBPTF9UWFJYX1JTU0lfVVBEQVRFX1NISUZUX0RFRkFVTFQ7CisJcGRldi0+cnNzaV9uZXdfd2VpZ2h0ID0gT0xfVFhSWF9SU1NJX05FV19XRUlHSFRfREVGQVVMVDsKKyNlbmRpZgorCisJb2xfdHhyeF9sb2NhbF9wZWVyX2lkX3Bvb2xfaW5pdChwZGV2KTsKKworCXBkZXYtPmNmZy5sbF9wYXVzZV90eHFfbGltaXQgPQorCQlvbF90eF9jZmdfbWF4X3R4X3F1ZXVlX2RlcHRoX2xsKHBkZXYtPmN0cmxfcGRldik7CisKKyNpZmRlZiBRQ0FfQ09NUFVURV9UWF9ERUxBWQorCWNkZl9tZW1femVybygmcGRldi0+dHhfZGVsYXksIHNpemVvZihwZGV2LT50eF9kZWxheSkpOworCWNkZl9zcGlubG9ja19pbml0KCZwZGV2LT50eF9kZWxheS5tdXRleCk7CisKKwkvKiBpbml0aWFsaXplIGNvbXB1dGUgaW50ZXJ2YWwgd2l0aCA1IHNlY29uZHMgKEVTRSBkZWZhdWx0KSAqLworCXBkZXYtPnR4X2RlbGF5LmF2Z19wZXJpb2RfdGlja3MgPSBjZGZfc3lzdGVtX21zZWNzX3RvX3RpY2tzKDUwMDApOworCXsKKwkJdWludDMyX3QgYmluX3dpZHRoXzEwMDB0aWNrczsKKwkJYmluX3dpZHRoXzEwMDB0aWNrcyA9CisJCQljZGZfc3lzdGVtX21zZWNzX3RvX3RpY2tzCisJCQkJKFFDQV9UWF9ERUxBWV9ISVNUX0lOVEVSTkFMX0JJTl9XSURUSF9NUworCQkJCSAqIDEwMDApOworCQkvKgorCQkgKiBDb21wdXRlIGEgZmFjdG9yIGFuZCBzaGlmdCB0aGF0IHRvZ2V0aGVyIGFyZSBlcXVhbCB0byB0aGUKKwkJICogaW52ZXJzZSBvZiB0aGUgYmluX3dpZHRoIHRpbWUsIHNvIHRoYXQgcmF0aGVyIHRoYW4gZGl2aWRpbmcKKwkJICogYnkgdGhlIGJpbiB3aWR0aCB0aW1lLCBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIHJlc3VsdCBjYW4gYmUKKwkJICogb2J0YWluZWQgbXVjaCBtb3JlIGVmZmljaWVudGx5IGJ5IGEgbXVsdGlwbHkgKyBzaGlmdC4KKwkJICogbXVsdGlwbHlfZmFjdG9yID4+IHNoaWZ0ID0gMSAvIGJpbl93aWR0aF90aW1lLCBzbworCQkgKiBtdWx0aXBseV9mYWN0b3IgPSAoMSA8PCBzaGlmdCkgLyBiaW5fd2lkdGhfdGltZS4KKwkJICoKKwkJICogUGljayB0aGUgc2hpZnQgc2VtaS1hcmJpdHJhcmlseS4KKwkJICogSWYgd2Uga25ldyBzdGF0aWNhbGx5IHdoYXQgdGhlIGJpbl93aWR0aCB3b3VsZCBiZSwgd2UgY291bGQKKwkJICogY2hvb3NlIGEgc2hpZnQgdGhhdCBtaW5pbWl6ZXMgdGhlIGVycm9yLgorCQkgKiBTaW5jZSB0aGUgYmluX3dpZHRoIGlzIGRldGVybWluZWQgZHluYW1pY2FsbHksIHNpbXBseSB1c2UgYQorCQkgKiBzaGlmdCB0aGF0IGlzIGFib3V0IGhhbGYgb2YgdGhlIHVpbnQzMl90IHNpemUuICBUaGlzIHNob3VsZAorCQkgKiByZXN1bHQgaW4gYSByZWxhdGl2ZWx5IGxhcmdlIG11bHRpcGxpZXIgdmFsdWUsIHdoaWNoCisJCSAqIG1pbmltaXplcyBlcnJvciBmcm9tIHJvdW5kaW5nIHRoZSBtdWx0aXBsaWVyIHRvIGFuIGludGVnZXIuCisJCSAqIFRoZSByb3VuZGluZyBlcnJvciBvbmx5IGJlY29tZXMgc2lnbmlmaWNhbnQgaWYgdGhlIHRpY2sgdW5pdHMKKwkJICogYXJlIG9uIHRoZSBvcmRlciBvZiAxIG1pY3Jvc2Vjb25kLiAgSW4gbW9zdCBzeXN0ZW1zLCBpdCBpcworCQkgKiBleHBlY3RlZCB0aGF0IHRoZSB0aWNrIHVuaXRzIHdpbGwgYmUgcmVsYXRpdmVseSBsb3ctcmVzLAorCQkgKiBvbiB0aGUgb3JkZXIgb2YgMSBtaWxsaXNlY29uZC4gIEluIHN1Y2ggc3lzdGVtcyB0aGUgcm91bmRpbmcKKwkJICogZXJyb3IgaXMgbmVnbGlnaWJsZS4KKwkJICogSXQgd291bGQgYmUgbW9yZSBhY2N1cmF0ZSB0byBkeW5hbWljYWxseSB0cnkgb3V0IGRpZmZlcmVudAorCQkgKiBzaGlmdHMgYW5kIGNob29zZSB0aGUgb25lIHRoYXQgcmVzdWx0cyBpbiB0aGUgc21hbGxlc3QKKwkJICogcm91bmRpbmcgZXJyb3IsIGJ1dCB0aGF0IGV4dHJhIGxldmVsIG9mIGZpZGVsaXR5IGlzCisJCSAqIG5vdCBuZWVkZWQuCisJCSAqLworCQlwZGV2LT50eF9kZWxheS5oaXN0X2ludGVybmFsX2Jpbl93aWR0aF9zaGlmdCA9IDE2OworCQlwZGV2LT50eF9kZWxheS5oaXN0X2ludGVybmFsX2Jpbl93aWR0aF9tdWx0ID0KKwkJCSgoMSA8PCBwZGV2LT50eF9kZWxheS5oaXN0X2ludGVybmFsX2Jpbl93aWR0aF9zaGlmdCkgKgorCQkJIDEwMDAgKyAoYmluX3dpZHRoXzEwMDB0aWNrcyA+PiAxKSkgLworCQkJYmluX3dpZHRoXzEwMDB0aWNrczsKKwl9CisjZW5kaWYgLyogUUNBX0NPTVBVVEVfVFhfREVMQVkgKi8KKworI2lmZGVmIFFDQV9TVVBQT1JUX1RYX1RIUk9UVExFCisJLyogVGhlcm1hbCBNaXRpZ2F0aW9uICovCisJb2xfdHhfdGhyb3R0bGVfaW5pdChwZGV2KTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfVFNPKQorCW9sX3Rzb19zZWdfbGlzdF9pbml0KHBkZXYsIGRlc2NfcG9vbF9zaXplKTsKKyNlbmRpZgorCisJb2xfdHhfcmVnaXN0ZXJfZmxvd19jb250cm9sKHBkZXYpOworCisJcmV0dXJuIDA7ICAgICAgICAgICAgLyogc3VjY2VzcyAqLworCitmYWlsNjoKKwlPTF9SWF9SRU9SREVSX1RSQUNFX0RFVEFDSChwZGV2KTsKKworZmFpbDU6CisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJnBkZXYtPnR4X211dGV4KTsKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmcGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCWNkZl9zcGlubG9ja19kZXN0cm95KCZwZGV2LT5yeC5tdXRleCk7CisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJnBkZXYtPmxhc3RfcmVhbF9wZWVyX211dGV4KTsKKwlPTF9UWFJYX1BFRVJfU1RBVFNfTVVURVhfREVTVFJPWShwZGV2KTsKKworZmFpbDQ6CisJZm9yIChpID0gMDsgaSA8IGRlc2NfcG9vbF9zaXplOyBpKyspCisJCWh0dF90eF9kZXNjX2ZyZWUocGRldi0+aHR0X3BkZXYsCisJCQkJIHBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0udHhfZGVzYy5odHRfdHhfZGVzYyk7CisKK2ZhaWwzOgorCWNkZl9tZW1fZnJlZShwZGV2LT50eF9kZXNjLmFycmF5KTsKKworZmFpbDI6CisJaWYgKG9sX2NmZ19pcGFfdWNfb2ZmbG9hZF9lbmFibGVkKHBkZXYtPmN0cmxfcGRldikpCisJCWh0dF9pcGFfdWNfZGV0YWNoKHBkZXYtPmh0dF9wZGV2KTsKK2ZhaWwxOgorCWh0dF9kZXRhY2gocGRldi0+aHR0X3BkZXYpOworCitmYWlsMDoKKwlyZXR1cm4gcmV0OyAgICAgICAgICAgIC8qIGZhaWwgKi8KK30KKworQV9TVEFUVVMgb2xfdHhyeF9wZGV2X2F0dGFjaF90YXJnZXQob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KQoreworCXJldHVybiBodHRfYXR0YWNoX3RhcmdldChwZGV2LT5odHRfcGRldik7Cit9CisKK3ZvaWQgb2xfdHhyeF9wZGV2X2RldGFjaChvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIGludCBmb3JjZSkKK3sKKwlpbnQgaTsKKwkvKmNoZWNraW5nIHRvIGVuc3VyZSB0eHJ4IHBkZXYgc3RydWN0dXJlIGlzIG5vdCBOVUxMICovCisJaWYgKCFwZGV2KSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsICJOVUxMIHBkZXYgcGFzc2VkIHRvICVzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJLyogcHJlY29uZGl0aW9ucyAqLworCVRYUlhfQVNTRVJUMihwZGV2KTsKKworCS8qIGNoZWNrIHRoYXQgdGhlIHBkZXYgaGFzIG5vIHZkZXZzIGFsbG9jYXRlZCAqLworCVRYUlhfQVNTRVJUMShUQUlMUV9FTVBUWSgmcGRldi0+dmRldl9saXN0KSk7CisKKwlPTF9SWF9SRU9SREVSX1RJTUVPVVRfQ0xFQU5VUChwZGV2KTsKKworI2lmZGVmIFFDQV9TVVBQT1JUX1RYX1RIUk9UVExFCisJLyogVGhlcm1hbCBNaXRpZ2F0aW9uICovCisJY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKCZwZGV2LT50eF90aHJvdHRsZS5waGFzZV90aW1lcik7CisJY2RmX3NvZnRpcnFfdGltZXJfZnJlZSgmcGRldi0+dHhfdGhyb3R0bGUucGhhc2VfdGltZXIpOworI2lmZGVmIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MCisJY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKCZwZGV2LT50eF90aHJvdHRsZS50eF90aW1lcik7CisJY2RmX3NvZnRpcnFfdGltZXJfZnJlZSgmcGRldi0+dHhfdGhyb3R0bGUudHhfdGltZXIpOworI2VuZGlmCisjZW5kaWYKKworCW9sX3R4X2RlcmVnaXN0ZXJfZmxvd19jb250cm9sKHBkZXYpOworCisJaWYgKGZvcmNlKSB7CisJCS8qCisJCSAqIFRoZSBhc3NlcnRpb24gYWJvdmUgY29uZmlybXMgdGhhdCBhbGwgdmRldnMgd2l0aGluIHRoaXMgcGRldgorCQkgKiB3ZXJlIGRldGFjaGVkLiAgSG93ZXZlciwgdGhleSBtYXkgbm90IGhhdmUgYWN0dWFsbHkgYmVlbgorCQkgKiBkZWxldGVkLgorCQkgKiBJZiB0aGUgdmRldiBoYWQgcGVlcnMgd2hpY2ggbmV2ZXIgcmVjZWl2ZWQgYSBQRUVSX1VOTUFQIG1zZworCQkgKiBmcm9tIHRoZSB0YXJnZXQsIHRoZW4gdGhlcmUgYXJlIHN0aWxsIHpvbWJpZSBwZWVyIG9iamVjdHMsCisJCSAqIGFuZCB0aGUgdmRldiBwYXJlbnRzIG9mIHRoZSB6b21iaWUgcGVlcnMgYXJlIGFsc28gem9tYmllcywKKwkJICogaGFuZ2luZyBhcm91bmQgdW50aWwgdGhlaXIgZmluYWwgcGVlciBnZXRzIGRlbGV0ZWQuCisJCSAqIEdvIHRocm91Z2ggdGhlIHBlZXIgaGFzaCB0YWJsZSBhbmQgZGVsZXRlIGFueSBwZWVycyBsZWZ0LgorCQkgKiBBcyBhIHNpZGUgZWZmZWN0LCB0aGlzIHdpbGwgY29tcGxldGUgdGhlIGRlbGV0aW9uIG9mIGFueQorCQkgKiB2ZGV2cyB0aGF0IGFyZSB3YWl0aW5nIGZvciB0aGVpciBwZWVycyB0byBmaW5pc2ggZGVsZXRpb24uCisJCSAqLworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfSU5GTzEsICJGb3JjZSBkZWxldGUgZm9yIHBkZXYgJXBcbiIsCisJCQkgICBwZGV2KTsKKwkJb2xfdHhyeF9wZWVyX2ZpbmRfaGFzaF9lcmFzZShwZGV2KTsKKwl9CisKKwkvKiBTdG9wIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gSFRUIGFuZCB0YXJnZXQgYXQgZmlyc3QgKi8KKwlodHRfZGV0YWNoX3RhcmdldChwZGV2LT5odHRfcGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRldi0+dHhfZGVzYy5wb29sX3NpemU7IGkrKykgeworCQl2b2lkICpodHRfdHhfZGVzYzsKKworCQkvKgorCQkgKiBDb25maXJtIHRoYXQgZWFjaCB0eCBkZXNjcmlwdG9yIGlzICJlbXB0eSIsIGkuZS4gaXQgaGFzCisJCSAqIG5vIHR4IGZyYW1lIGF0dGFjaGVkLgorCQkgKiBJbiBwYXJ0aWN1bGFyLCBjaGVjayB0aGF0IHRoZXJlIGFyZSBubyBmcmFtZXMgdGhhdCBoYXZlCisJCSAqIGJlZW4gZ2l2ZW4gdG8gdGhlIHRhcmdldCB0byB0cmFuc21pdCwgZm9yIHdoaWNoIHRoZQorCQkgKiB0YXJnZXQgaGFzIG5ldmVyIHByb3ZpZGVkIGEgcmVzcG9uc2UuCisJCSAqLworCQlpZiAoY2RmX2F0b21pY19yZWFkKCZwZGV2LT50eF9kZXNjLmFycmF5W2ldLnR4X2Rlc2MucmVmX2NudCkpIHsKKwkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9XQVJOLAorCQkJCSAgICJXYXJuaW5nOiBmcmVlaW5nIHR4IGZyYW1lIChubyBjb21wbHRuKVxuIik7CisJCQlvbF90eF9kZXNjX2ZyYW1lX2ZyZWVfbm9uc3RkKHBkZXYsCisJCQkJCQkgICAgICZwZGV2LT50eF9kZXNjLmFycmF5W2ldLgorCQkJCQkJICAgICB0eF9kZXNjLCAxKTsKKwkJfQorCQlodHRfdHhfZGVzYyA9IHBkZXYtPnR4X2Rlc2MuYXJyYXlbaV0udHhfZGVzYy5odHRfdHhfZGVzYzsKKwkJaHR0X3R4X2Rlc2NfZnJlZShwZGV2LT5odHRfcGRldiwgaHR0X3R4X2Rlc2MpOworCX0KKworCWNkZl9tZW1fZnJlZShwZGV2LT50eF9kZXNjLmFycmF5KTsKKworCS8qIERldGFjaCBtaWNybyBjb250cm9sbGVyIGRhdGEgcGF0aCBvZmZsb2FkIHJlc291cmNlICovCisJaWYgKG9sX2NmZ19pcGFfdWNfb2ZmbG9hZF9lbmFibGVkKHBkZXYtPmN0cmxfcGRldikpCisJCWh0dF9pcGFfdWNfZGV0YWNoKHBkZXYtPmh0dF9wZGV2KTsKKworCWh0dF9kZXRhY2gocGRldi0+aHR0X3BkZXYpOworCWh0dF9wZGV2X2ZyZWUocGRldi0+aHR0X3BkZXYpOworCisJb2xfdHhyeF9wZWVyX2ZpbmRfZGV0YWNoKHBkZXYpOworCisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJnBkZXYtPnR4X211dGV4KTsKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmcGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCWNkZl9zcGlubG9ja19kZXN0cm95KCZwZGV2LT5sYXN0X3JlYWxfcGVlcl9tdXRleCk7CisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJnBkZXYtPnJ4Lm11dGV4KTsKKyNpZmRlZiBRQ0FfU1VQUE9SVF9UWF9USFJPVFRMRQorCS8qIFRoZXJtYWwgTWl0aWdhdGlvbiAqLworCWNkZl9zcGlubG9ja19kZXN0cm95KCZwZGV2LT50eF90aHJvdHRsZS5tdXRleCk7CisjZW5kaWYKKwlPTF9UWFJYX1BFRVJfU1RBVFNfTVVURVhfREVTVFJPWShwZGV2KTsKKworCU9MX1JYX1JFT1JERVJfVFJBQ0VfREVUQUNIKHBkZXYpOworCU9MX1JYX1BOX1RSQUNFX0RFVEFDSChwZGV2KTsKKwkvKgorCSAqIFdESSBldmVudCBkZXRhY2gKKwkgKi8KKwl3ZGlfZXZlbnRfZGV0YWNoKHBkZXYpOworCW9sX3R4cnhfbG9jYWxfcGVlcl9pZF9jbGVhbnVwKHBkZXYpOworCisjaWZkZWYgUUNBX0NPTVBVVEVfVFhfREVMQVkKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmcGRldi0+dHhfZGVsYXkubXV0ZXgpOworI2VuZGlmCit9CisKK29sX3R4cnhfdmRldl9oYW5kbGUKK29sX3R4cnhfdmRldl9hdHRhY2gob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgdWludDhfdCAqdmRldl9tYWNfYWRkciwKKwkJICAgIHVpbnQ4X3QgdmRldl9pZCwgZW51bSB3bGFuX29wX21vZGUgb3BfbW9kZSkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXY7CisKKwkvKiBwcmVjb25kaXRpb25zICovCisJVFhSWF9BU1NFUlQyKHBkZXYpOworCVRYUlhfQVNTRVJUMih2ZGV2X21hY19hZGRyKTsKKworCXZkZXYgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnZkZXYpKTsKKwlpZiAoIXZkZXYpCisJCXJldHVybiBOVUxMOyAgICAvKiBmYWlsdXJlICovCisKKwkvKiBzdG9yZSBwcm92aWRlZCBwYXJhbXMgKi8KKwl2ZGV2LT5wZGV2ID0gcGRldjsKKwl2ZGV2LT52ZGV2X2lkID0gdmRldl9pZDsKKwl2ZGV2LT5vcG1vZGUgPSBvcF9tb2RlOworCisJdmRldi0+ZGVsZXRlLnBlbmRpbmcgPSAwOworCXZkZXYtPnNhZmVtb2RlID0gMDsKKwl2ZGV2LT5kcm9wX3VuZW5jID0gMTsKKwl2ZGV2LT5udW1fZmlsdGVycyA9IDA7CisjaWYgZGVmaW5lZChDT05GSUdfUEVSX1ZERVZfVFhfREVTQ19QT09MKQorCWNkZl9hdG9taWNfaW5pdCgmdmRldi0+dHhfZGVzY19jb3VudCk7CisjZW5kaWYKKworCWNkZl9tZW1fY29weSgmdmRldi0+bWFjX2FkZHIucmF3WzBdLCB2ZGV2X21hY19hZGRyLAorCQkgICAgIE9MX1RYUlhfTUFDX0FERFJfTEVOKTsKKworCVRBSUxRX0lOSVQoJnZkZXYtPnBlZXJfbGlzdCk7CisJdmRldi0+bGFzdF9yZWFsX3BlZXIgPSBOVUxMOworCisjaWZkZWYgUUNBX0lCU1NfU1VQUE9SVAorCXZkZXYtPmlic3NfcGVlcl9udW0gPSAwOworCXZkZXYtPmlic3NfcGVlcl9oZWFydF9iZWF0X3RpbWVyID0gMDsKKyNlbmRpZgorCisJY2RmX3NwaW5sb2NrX2luaXQoJnZkZXYtPmxsX3BhdXNlLm11dGV4KTsKKwl2ZGV2LT5sbF9wYXVzZS5wYXVzZWRfcmVhc29uID0gMDsKKwl2ZGV2LT5sbF9wYXVzZS50eHEuaGVhZCA9IHZkZXYtPmxsX3BhdXNlLnR4cS50YWlsID0gTlVMTDsKKwl2ZGV2LT5sbF9wYXVzZS50eHEuZGVwdGggPSAwOworCWNkZl9zb2Z0aXJxX3RpbWVyX2luaXQocGRldi0+b3NkZXYsCisJCQkgICAgICAgJnZkZXYtPmxsX3BhdXNlLnRpbWVyLAorCQkJICAgICAgIG9sX3R4X3ZkZXZfbGxfcGF1c2VfcXVldWVfc2VuZCwgdmRldiwKKwkJCSAgICAgICBDREZfVElNRVJfVFlQRV9TVyk7CisJY2RmX2F0b21pY19pbml0KCZ2ZGV2LT5vc19xX3BhdXNlZCk7CisJY2RmX2F0b21pY19zZXQoJnZkZXYtPm9zX3FfcGF1c2VkLCAwKTsKKwl2ZGV2LT50eF9mbF9sd20gPSAwOworCXZkZXYtPnR4X2ZsX2h3bSA9IDA7CisJdmRldi0+d2FpdF9vbl9wZWVyX2lkID0gT0xfVFhSWF9JTlZBTElEX0xPQ0FMX1BFRVJfSUQ7CisJY2RmX3NwaW5sb2NrX2luaXQoJnZkZXYtPmZsb3dfY29udHJvbF9sb2NrKTsKKwl2ZGV2LT5vc2lmX2Zsb3dfY29udHJvbF9jYiA9IE5VTEw7CisJdmRldi0+b3NpZl9mY19jdHggPSBOVUxMOworCisJLyogRGVmYXVsdCBNQVggUSBkZXB0aCBmb3IgZXZlcnkgVkRFViAqLworCXZkZXYtPmxsX3BhdXNlLm1heF9xX2RlcHRoID0KKwkJb2xfdHhfY2ZnX21heF90eF9xdWV1ZV9kZXB0aF9sbCh2ZGV2LT5wZGV2LT5jdHJsX3BkZXYpOworCS8qIGFkZCB0aGlzIHZkZXYgaW50byB0aGUgcGRldidzIGxpc3QgKi8KKwlUQUlMUV9JTlNFUlRfVEFJTCgmcGRldi0+dmRldl9saXN0LCB2ZGV2LCB2ZGV2X2xpc3RfZWxlbSk7CisKKwlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfSU5GTzEsCisJCSAgICJDcmVhdGVkIHZkZXYgJXAgKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KVxuIiwKKwkJICAgdmRldiwKKwkJICAgdmRldi0+bWFjX2FkZHIucmF3WzBdLCB2ZGV2LT5tYWNfYWRkci5yYXdbMV0sCisJCSAgIHZkZXYtPm1hY19hZGRyLnJhd1syXSwgdmRldi0+bWFjX2FkZHIucmF3WzNdLAorCQkgICB2ZGV2LT5tYWNfYWRkci5yYXdbNF0sIHZkZXYtPm1hY19hZGRyLnJhd1s1XSk7CisKKwkvKgorCSAqIFdlJ3ZlIHZlcmlmaWVkIHRoYXQgaHR0X29wX21vZGUgPT0gd2xhbl9vcF9tb2RlLAorCSAqIHNvIG5vIHRyYW5zbGF0aW9uIGlzIG5lZWRlZC4KKwkgKi8KKwlodHRfdmRldl9hdHRhY2gocGRldi0+aHR0X3BkZXYsIHZkZXZfaWQsIG9wX21vZGUpOworCisJcmV0dXJuIHZkZXY7Cit9CisKK3ZvaWQgb2xfdHhyeF9vc2lmX3ZkZXZfcmVnaXN0ZXIob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LAorCQkJCXZvaWQgKm9zaWZfdmRldiwKKwkJCQlzdHJ1Y3Qgb2xfdHhyeF9vc2lmX29wcyAqdHhyeF9vcHMpCit7CisJdmRldi0+b3NpZl9kZXYgPSBvc2lmX3ZkZXY7CisJdHhyeF9vcHMtPnR4LnN0ZCA9IHZkZXYtPnR4ID0gT0xfVFhfTEw7CisJdHhyeF9vcHMtPnR4Lm5vbl9zdGQgPSBvbF90eF9ub25fc3RkX2xsOworfQorCit2b2lkIG9sX3R4cnhfc2V0X2N1cmNoYW4ob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LCB1aW50MzJfdCBjaGFuX21oeikKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgb2xfdHhyeF9zZXRfc2FmZW1vZGUob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCB1aW50MzJfdCB2YWwpCit7CisJdmRldi0+c2FmZW1vZGUgPSB2YWw7Cit9CisKK3ZvaWQKK29sX3R4cnhfc2V0X3ByaXZhY3lfZmlsdGVycyhvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJCQkgICAgdm9pZCAqZmlsdGVycywgdWludDMyX3QgbnVtKQoreworCWNkZl9tZW1fY29weSh2ZGV2LT5wcml2YWN5X2ZpbHRlcnMsIGZpbHRlcnMsCisJCSAgICAgbnVtICogc2l6ZW9mKHN0cnVjdCBwcml2YWN5X2V4ZW1wdGlvbikpOworCXZkZXYtPm51bV9maWx0ZXJzID0gbnVtOworfQorCit2b2lkIG9sX3R4cnhfc2V0X2Ryb3BfdW5lbmMob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LCB1aW50MzJfdCB2YWwpCit7CisJdmRldi0+ZHJvcF91bmVuYyA9IHZhbDsKK30KKwordm9pZAorb2xfdHhyeF92ZGV2X2RldGFjaChvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJCSAgICBvbF90eHJ4X3ZkZXZfZGVsZXRlX2NiIGNhbGxiYWNrLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHZkZXYtPnBkZXY7CisKKwkvKiBwcmVjb25kaXRpb25zICovCisJVFhSWF9BU1NFUlQyKHZkZXYpOworCisJY2RmX3NwaW5fbG9ja19iaCgmdmRldi0+bGxfcGF1c2UubXV0ZXgpOworCWNkZl9zb2Z0aXJxX3RpbWVyX2NhbmNlbCgmdmRldi0+bGxfcGF1c2UudGltZXIpOworCWNkZl9zb2Z0aXJxX3RpbWVyX2ZyZWUoJnZkZXYtPmxsX3BhdXNlLnRpbWVyKTsKKwl2ZGV2LT5sbF9wYXVzZS5pc19xX3RpbWVyX29uID0gZmFsc2U7CisJd2hpbGUgKHZkZXYtPmxsX3BhdXNlLnR4cS5oZWFkKSB7CisJCWNkZl9uYnVmX3QgbmV4dCA9IGNkZl9uYnVmX25leHQodmRldi0+bGxfcGF1c2UudHhxLmhlYWQpOworCQljZGZfbmJ1Zl9zZXRfbmV4dCh2ZGV2LT5sbF9wYXVzZS50eHEuaGVhZCwgTlVMTCk7CisJCWNkZl9uYnVmX3VubWFwKHBkZXYtPm9zZGV2LCB2ZGV2LT5sbF9wYXVzZS50eHEuaGVhZCwKKwkJCSAgICAgICBDREZfRE1BX1RPX0RFVklDRSk7CisJCWNkZl9uYnVmX3R4X2ZyZWUodmRldi0+bGxfcGF1c2UudHhxLmhlYWQsIE5CVUZfUEtUX0VSUk9SKTsKKwkJdmRldi0+bGxfcGF1c2UudHhxLmhlYWQgPSBuZXh0OworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPmxsX3BhdXNlLm11dGV4KTsKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmdmRldi0+bGxfcGF1c2UubXV0ZXgpOworCisJY2RmX3NwaW5fbG9ja19iaCgmdmRldi0+Zmxvd19jb250cm9sX2xvY2spOworCXZkZXYtPm9zaWZfZmxvd19jb250cm9sX2NiID0gTlVMTDsKKwl2ZGV2LT5vc2lmX2ZjX2N0eCA9IE5VTEw7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ2ZGV2LT5mbG93X2NvbnRyb2xfbG9jayk7CisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJnZkZXYtPmZsb3dfY29udHJvbF9sb2NrKTsKKworCS8qIHJlbW92ZSB0aGUgdmRldiBmcm9tIGl0cyBwYXJlbnQgcGRldidzIGxpc3QgKi8KKwlUQUlMUV9SRU1PVkUoJnBkZXYtPnZkZXZfbGlzdCwgdmRldiwgdmRldl9saXN0X2VsZW0pOworCisJLyoKKwkgKiBVc2UgcGVlcl9yZWZfbXV0ZXggd2hpbGUgYWNjZXNzaW5nIHBlZXJfbGlzdCwgaW4gY2FzZQorCSAqIGEgcGVlciBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyByZW1vdmVkIGZyb20gdGhlIGxpc3QuCisJICovCisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCS8qIGNoZWNrIHRoYXQgdGhlIHZkZXYgaGFzIG5vIHBlZXJzIGFsbG9jYXRlZCAqLworCWlmICghVEFJTFFfRU1QVFkoJnZkZXYtPnBlZXJfbGlzdCkpIHsKKwkJLyogZGVidWcgcHJpbnQgLSB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIgKi8KKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0lORk8xLAorCQkJICAgIiVzOiBub3QgZGVsZXRpbmcgdmRldiBvYmplY3QgJXAgKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KSIKKwkJCSAgICJ1bnRpbCBkZWxldGlvbiBmaW5pc2hlcyBmb3IgYWxsIGl0cyBwZWVyc1xuIiwKKwkJCSAgIF9fZnVuY19fLCB2ZGV2LAorCQkJICAgdmRldi0+bWFjX2FkZHIucmF3WzBdLCB2ZGV2LT5tYWNfYWRkci5yYXdbMV0sCisJCQkgICB2ZGV2LT5tYWNfYWRkci5yYXdbMl0sIHZkZXYtPm1hY19hZGRyLnJhd1szXSwKKwkJCSAgIHZkZXYtPm1hY19hZGRyLnJhd1s0XSwgdmRldi0+bWFjX2FkZHIucmF3WzVdKTsKKwkJLyogaW5kaWNhdGUgdGhhdCB0aGUgdmRldiBuZWVkcyB0byBiZSBkZWxldGVkICovCisJCXZkZXYtPmRlbGV0ZS5wZW5kaW5nID0gMTsKKwkJdmRldi0+ZGVsZXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7CisJCXZkZXYtPmRlbGV0ZS5jb250ZXh0ID0gY29udGV4dDsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT5wZWVyX3JlZl9tdXRleCk7CisJCXJldHVybjsKKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT5wZWVyX3JlZl9tdXRleCk7CisKKwlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfSU5GTzEsCisJCSAgICIlczogZGVsZXRpbmcgdmRldiBvYmogJXAgKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KVxuIiwKKwkJICAgX19mdW5jX18sIHZkZXYsCisJCSAgIHZkZXYtPm1hY19hZGRyLnJhd1swXSwgdmRldi0+bWFjX2FkZHIucmF3WzFdLAorCQkgICB2ZGV2LT5tYWNfYWRkci5yYXdbMl0sIHZkZXYtPm1hY19hZGRyLnJhd1szXSwKKwkJICAgdmRldi0+bWFjX2FkZHIucmF3WzRdLCB2ZGV2LT5tYWNfYWRkci5yYXdbNV0pOworCisJaHR0X3ZkZXZfZGV0YWNoKHBkZXYtPmh0dF9wZGV2LCB2ZGV2LT52ZGV2X2lkKTsKKworCS8qCisJICogRG9lc24ndCBtYXR0ZXIgaWYgdGhlcmUgYXJlIG91dHN0YW5kaW5nIHR4IGZyYW1lcyAtCisJICogdGhleSB3aWxsIGJlIGZyZWVkIG9uY2UgdGhlIHRhcmdldCBzZW5kcyBhIHR4IGNvbXBsZXRpb24KKwkgKiBtZXNzYWdlIGZvciB0aGVtLgorCSAqLworCWNkZl9tZW1fZnJlZSh2ZGV2KTsKKwlpZiAoY2FsbGJhY2spCisJCWNhbGxiYWNrKGNvbnRleHQpOworfQorCisvKioKKyAqIG9sX3R4cnhfZmx1c2hfcnhfZnJhbWVzKCkgLSBmbHVzaCBjYWNoZWQgcnggZnJhbWVzCisgKiBAcGVlcjogcGVlcgorICogQGRyb3A6IHNldCBmbGFnIHRvIGRyb3AgZnJhbWVzCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgb2xfdHhyeF9mbHVzaF9yeF9mcmFtZXMoc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyLAorCQkJCSAgICBib29sIGRyb3ApCit7CisJc3RydWN0IG9sX3J4X2NhY2hlZF9idWYgKmNhY2hlX2J1ZjsKKwlDREZfU1RBVFVTIHJldDsKKwlvbF9yeF9jYWxsYmFja19mcCBkYXRhX3J4ID0gTlVMTDsKKwl2b2lkICpjZHNfY3R4ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworCisJaWYgKGNkZl9hdG9taWNfaW5jX3JldHVybigmcGVlci0+Zmx1c2hfaW5fcHJvZ3Jlc3MpID4gMSkgeworCQljZGZfYXRvbWljX2RlYygmcGVlci0+Zmx1c2hfaW5fcHJvZ3Jlc3MpOworCQlyZXR1cm47CisJfQorCisJY2RmX2Fzc2VydChjZHNfY3R4KTsKKwljZGZfc3Bpbl9sb2NrX2JoKCZwZWVyLT5wZWVyX2luZm9fbG9jayk7CisJaWYgKHBlZXItPnN0YXRlID49IG9sX3R4cnhfcGVlcl9zdGF0ZV9jb25uKQorCQlkYXRhX3J4ID0gcGVlci0+b3NpZl9yeDsKKwllbHNlCisJCWRyb3AgPSB0cnVlOworCWNkZl9zcGluX3VubG9ja19iaCgmcGVlci0+cGVlcl9pbmZvX2xvY2spOworCisJY2RmX3NwaW5fbG9ja19iaCgmcGVlci0+YnVmcV9sb2NrKTsKKwljYWNoZV9idWYgPSBsaXN0X2VudHJ5KCgmcGVlci0+Y2FjaGVkX2J1ZnEpLT5uZXh0LAorCQkJCXR5cGVvZigqY2FjaGVfYnVmKSwgbGlzdCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwZWVyLT5jYWNoZWRfYnVmcSkpIHsKKwkJbGlzdF9kZWwoJmNhY2hlX2J1Zi0+bGlzdCk7CisJCWNkZl9zcGluX3VubG9ja19iaCgmcGVlci0+YnVmcV9sb2NrKTsKKwkJaWYgKGRyb3ApIHsKKwkJCWNkZl9uYnVmX2ZyZWUoY2FjaGVfYnVmLT5idWYpOworCQl9IGVsc2UgeworCQkJLyogRmx1c2ggdGhlIGNhY2hlZCBmcmFtZXMgdG8gSEREICovCisJCQlyZXQgPSBkYXRhX3J4KGNkc19jdHgsIGNhY2hlX2J1Zi0+YnVmLCBwZWVyLT5sb2NhbF9pZCk7CisJCQlpZiAocmV0ICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJCQljZGZfbmJ1Zl9mcmVlKGNhY2hlX2J1Zi0+YnVmKTsKKwkJfQorCQljZGZfbWVtX2ZyZWUoY2FjaGVfYnVmKTsKKwkJY2RmX3NwaW5fbG9ja19iaCgmcGVlci0+YnVmcV9sb2NrKTsKKwkJY2FjaGVfYnVmID0gbGlzdF9lbnRyeSgoJnBlZXItPmNhY2hlZF9idWZxKS0+bmV4dCwKKwkJCQl0eXBlb2YoKmNhY2hlX2J1ZiksIGxpc3QpOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBlZXItPmJ1ZnFfbG9jayk7CisJY2RmX2F0b21pY19kZWMoJnBlZXItPmZsdXNoX2luX3Byb2dyZXNzKTsKK30KKworb2xfdHhyeF9wZWVyX2hhbmRsZQorb2xfdHhyeF9wZWVyX2F0dGFjaChvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCSAgICBvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsIHVpbnQ4X3QgKnBlZXJfbWFjX2FkZHIpCit7CisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyOworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqdGVtcF9wZWVyOworCXVpbnQ4X3QgaTsKKwlpbnQgZGlmZmVyczsKKwlib29sIHdhaXRfb25fZGVsZXRpb24gPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIHJjOworCisJLyogcHJlY29uZGl0aW9ucyAqLworCVRYUlhfQVNTRVJUMihwZGV2KTsKKwlUWFJYX0FTU0VSVDIodmRldik7CisJVFhSWF9BU1NFUlQyKHBlZXJfbWFjX2FkZHIpOworCisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCS8qIGNoZWNrIGZvciBkdXBsaWNhdGUgZXhzaXN0aW5nIHBlZXIgKi8KKwlUQUlMUV9GT1JFQUNIKHRlbXBfcGVlciwgJnZkZXYtPnBlZXJfbGlzdCwgcGVlcl9saXN0X2VsZW0pIHsKKwkJaWYgKCFvbF90eHJ4X3BlZXJfZmluZF9tYWNfYWRkcl9jbXAoJnRlbXBfcGVlci0+bWFjX2FkZHIsCisJCQkodW5pb24gb2xfdHhyeF9hbGlnbl9tYWNfYWRkcl90ICopcGVlcl9tYWNfYWRkcikpIHsKKwkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkJInZkZXZfaWQgJWQgKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KSBhbHJlYWR5IGV4c2lzdC5cbiIsCisJCQkJdmRldi0+dmRldl9pZCwKKwkJCQlwZWVyX21hY19hZGRyWzBdLCBwZWVyX21hY19hZGRyWzFdLAorCQkJCXBlZXJfbWFjX2FkZHJbMl0sIHBlZXJfbWFjX2FkZHJbM10sCisJCQkJcGVlcl9tYWNfYWRkcls0XSwgcGVlcl9tYWNfYWRkcls1XSk7CisJCQlpZiAoY2RmX2F0b21pY19yZWFkKCZ0ZW1wX3BlZXItPmRlbGV0ZV9pbl9wcm9ncmVzcykpIHsKKwkJCQl2ZGV2LT53YWl0X29uX3BlZXJfaWQgPSB0ZW1wX3BlZXItPmxvY2FsX2lkOworCQkJCWNkZl9ldmVudF9pbml0KCZ2ZGV2LT53YWl0X2RlbGV0ZV9jb21wKTsKKwkJCQl3YWl0X29uX2RlbGV0aW9uID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT5wZWVyX3JlZl9tdXRleCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT5wZWVyX3JlZl9tdXRleCk7CisKKwlpZiAod2FpdF9vbl9kZWxldGlvbikgeworCQkvKiB3YWl0IGZvciBwZWVyIGRlbGV0aW9uICovCisJCXJjID0gY2RmX3dhaXRfc2luZ2xlX2V2ZW50KCZ2ZGV2LT53YWl0X2RlbGV0ZV9jb21wLAorCQkJY2RmX3N5c3RlbV9tc2Vjc190b190aWNrcyhQRUVSX0RFTEVUSU9OX1RJTUVPVVQpKTsKKwkJaWYgKCFyYykgeworCQkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJCQkidGltZWRvdXQgd2FpdGluZyBmb3IgcGVlciglZCkgZGVsZXRpb25cbiIsCisJCQkJdmRldi0+d2FpdF9vbl9wZWVyX2lkKTsKKwkJCXZkZXYtPndhaXRfb25fcGVlcl9pZCA9IE9MX1RYUlhfSU5WQUxJRF9MT0NBTF9QRUVSX0lEOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlwZWVyID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwZWVyKSk7CisJaWYgKCFwZWVyKQorCQlyZXR1cm4gTlVMTDsgICAgLyogZmFpbHVyZSAqLworCWNkZl9tZW1femVybyhwZWVyLCBzaXplb2YoKnBlZXIpKTsKKworCS8qIHN0b3JlIHByb3ZpZGVkIHBhcmFtcyAqLworCXBlZXItPnZkZXYgPSB2ZGV2OworCWNkZl9tZW1fY29weSgmcGVlci0+bWFjX2FkZHIucmF3WzBdLCBwZWVyX21hY19hZGRyLAorCQkgICAgIE9MX1RYUlhfTUFDX0FERFJfTEVOKTsKKworCUlOSVRfTElTVF9IRUFEKCZwZWVyLT5jYWNoZWRfYnVmcSk7CisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCS8qIGFkZCB0aGlzIHBlZXIgaW50byB0aGUgdmRldidzIGxpc3QgKi8KKwlUQUlMUV9JTlNFUlRfVEFJTCgmdmRldi0+cGVlcl9saXN0LCBwZWVyLCBwZWVyX2xpc3RfZWxlbSk7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT5wZWVyX3JlZl9tdXRleCk7CisJLyogY2hlY2sgd2hldGhlciB0aGlzIGlzIGEgcmVhbCBwZWVyIChwZWVyIG1hYyBhZGRyICE9IHZkZXYgbWFjIGFkZHIpICovCisJaWYgKG9sX3R4cnhfcGVlcl9maW5kX21hY19hZGRyX2NtcCgmdmRldi0+bWFjX2FkZHIsICZwZWVyLT5tYWNfYWRkcikpCisJCXZkZXYtPmxhc3RfcmVhbF9wZWVyID0gcGVlcjsKKworCXBlZXItPnJ4X29wdF9wcm9jID0gcGRldi0+cnhfb3B0X3Byb2M7CisKKwlvbF9yeF9wZWVyX2luaXQocGRldiwgcGVlcik7CisKKwkvKiBpbml0aWFsaXplIHRoZSBwZWVyX2lkICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fUEVFUl9JRF9QRVJfUEVFUjsgaSsrKQorCQlwZWVyLT5wZWVyX2lkc1tpXSA9IEhUVF9JTlZBTElEX1BFRVI7CisKKworCXBlZXItPm9zaWZfcnggPSBOVUxMOworCWNkZl9zcGlubG9ja19pbml0KCZwZWVyLT5wZWVyX2luZm9fbG9jayk7CisJY2RmX3NwaW5sb2NrX2luaXQoJnBlZXItPmJ1ZnFfbG9jayk7CisKKwljZGZfYXRvbWljX2luaXQoJnBlZXItPmRlbGV0ZV9pbl9wcm9ncmVzcyk7CisJY2RmX2F0b21pY19pbml0KCZwZWVyLT5mbHVzaF9pbl9wcm9ncmVzcyk7CisKKwljZGZfYXRvbWljX2luaXQoJnBlZXItPnJlZl9jbnQpOworCisJLyoga2VlcCBvbmUgcmVmZXJlbmNlIGZvciBhdHRhY2ggKi8KKwljZGZfYXRvbWljX2luYygmcGVlci0+cmVmX2NudCk7CisKKwkvKiBrZWVwIG9uZSByZWZlcmVuY2UgZm9yIG9sX3J4X3BlZXJfbWFwX2hhbmRsZXIgKi8KKwljZGZfYXRvbWljX2luYygmcGVlci0+cmVmX2NudCk7CisKKwlwZWVyLT52YWxpZCA9IDE7CisKKwlvbF90eHJ4X3BlZXJfZmluZF9oYXNoX2FkZChwZGV2LCBwZWVyKTsKKworCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMiwKKwkJICAgInZkZXYgJXAgY3JlYXRlZCBwZWVyICVwICglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCisJCSAgIHZkZXYsIHBlZXIsCisJCSAgIHBlZXItPm1hY19hZGRyLnJhd1swXSwgcGVlci0+bWFjX2FkZHIucmF3WzFdLAorCQkgICBwZWVyLT5tYWNfYWRkci5yYXdbMl0sIHBlZXItPm1hY19hZGRyLnJhd1szXSwKKwkJICAgcGVlci0+bWFjX2FkZHIucmF3WzRdLCBwZWVyLT5tYWNfYWRkci5yYXdbNV0pOworCS8qCisJICogRm9yIGV2ZXJ5IHBlZXIgTUFwIG1lc3NhZ2Ugc2VhcmNoIGFuZCBzZXQgaWYgYnNzX3BlZXIKKwkgKi8KKwlkaWZmZXJzID0KKwkJY2RmX21lbV9jb21wYXJlKHBlZXItPm1hY19hZGRyLnJhdywgdmRldi0+bWFjX2FkZHIucmF3LAorCQkJCU9MX1RYUlhfTUFDX0FERFJfTEVOKTsKKwlpZiAoIWRpZmZlcnMpCisJCXBlZXItPmJzc19wZWVyID0gMTsKKworCS8qCisJICogVGhlIHBlZXIgc3RhcnRzIGluIHRoZSAiZGlzYyIgc3RhdGUgd2hpbGUgYXNzb2NpYXRpb24gaXMgaW4gcHJvZ3Jlc3MuCisJICogT25jZSBhc3NvY2lhdGlvbiBjb21wbGV0ZXMsIHRoZSBwZWVyIHdpbGwgZ2V0IHVwZGF0ZWQgdG8gImF1dGgiIHN0YXRlCisJICogYnkgYSBjYWxsIHRvIG9sX3R4cnhfcGVlcl9zdGF0ZV91cGRhdGUgaWYgdGhlIHBlZXIgaXMgaW4gb3BlbiBtb2RlLAorCSAqIG9yIGVsc2UgdG8gdGhlICJjb25uIiBzdGF0ZS4gRm9yIG5vbi1vcGVuIG1vZGUsIHRoZSBwZWVyIHdpbGwKKwkgKiBwcm9ncmVzcyB0byAiYXV0aCIgc3RhdGUgb25jZSB0aGUgYXV0aGVudGljYXRpb24gY29tcGxldGVzLgorCSAqLworCXBlZXItPnN0YXRlID0gb2xfdHhyeF9wZWVyX3N0YXRlX2ludmFsaWQ7CisJb2xfdHhyeF9wZWVyX3N0YXRlX3VwZGF0ZShwZGV2LCBwZWVyLT5tYWNfYWRkci5yYXcsCisJCQkJICBvbF90eHJ4X3BlZXJfc3RhdGVfZGlzYyk7CisKKyNpZmRlZiBRQ0FfU1VQUE9SVF9QRUVSX0RBVEFfUlhfUlNTSQorCXBlZXItPnJzc2lfZGJtID0gSFRUX1JTU0lfSU5WQUxJRDsKKyNlbmRpZgorCisJb2xfdHhyeF9sb2NhbF9wZWVyX2lkX2FsbG9jKHBkZXYsIHBlZXIpOworCisJcmV0dXJuIHBlZXI7Cit9CisKKy8qCisgKiBEaXNjYXJkaW5nIHR4IGZpbHRlciAtIHJlbW92ZXMgYWxsIGRhdGEgZnJhbWVzIChkaXNjb25uZWN0ZWQgc3RhdGUpCisgKi8KK3N0YXRpYyBBX1NUQVRVUyBvbF90eF9maWx0ZXJfZGlzY2FyZChzdHJ1Y3Qgb2xfdHhyeF9tc2R1X2luZm9fdCAqdHhfbXNkdV9pbmZvKQoreworCXJldHVybiBBX0VSUk9SOworfQorCisvKgorICogTm9uLWF1dGVudGljYXRpb24gdHggZmlsdGVyIC0gZmlsdGVycyBvdXQgZGF0YSBmcmFtZXMgdGhhdCBhcmUgbm90CisgKiByZWxhdGVkIHRvIGF1dGhlbnRpY2F0aW9uLCBidXQgYWxsb3dzIEVBUE9MIChQQUUpIG9yIFdBUEkgKFdBSSkKKyAqIGRhdGEgZnJhbWVzIChjb25uZWN0ZWQgc3RhdGUpCisgKi8KK3N0YXRpYyBBX1NUQVRVUyBvbF90eF9maWx0ZXJfbm9uX2F1dGgoc3RydWN0IG9sX3R4cnhfbXNkdV9pbmZvX3QgKnR4X21zZHVfaW5mbykKK3sKKwlyZXR1cm4KKwkJKHR4X21zZHVfaW5mby0+aHR0LmluZm8uZXRoZXJ0eXBlID09IEVUSEVSVFlQRV9QQUUgfHwKKwkJIHR4X21zZHVfaW5mby0+aHR0LmluZm8uZXRoZXJ0eXBlID09CisJCSBFVEhFUlRZUEVfV0FJKSA/IEFfT0sgOiBBX0VSUk9SOworfQorCisvKgorICogUGFzcy10aHJvdWdoIHR4IGZpbHRlciAtIGxldHMgYWxsIGRhdGEgZnJhbWVzIHRocm91Z2ggKGF1dGhlbnRpY2F0ZWQgc3RhdGUpCisgKi8KK3N0YXRpYyBBX1NUQVRVUyBvbF90eF9maWx0ZXJfcGFzc190aHJ1KHN0cnVjdCBvbF90eHJ4X21zZHVfaW5mb190ICp0eF9tc2R1X2luZm8pCit7CisJcmV0dXJuIEFfT0s7Cit9CisKK0NERl9TVEFUVVMKK29sX3R4cnhfcGVlcl9zdGF0ZV91cGRhdGUoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LCB1aW50OF90ICpwZWVyX21hYywKKwkJCSAgZW51bSBvbF90eHJ4X3BlZXJfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyOworCisJaWYgKGNkZl91bmxpa2VseSghcGRldikpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwgIlBkZXYgaXMgTlVMTCIpOworCQljZGZfYXNzZXJ0KDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCXBlZXIgPSAgb2xfdHhyeF9wZWVyX2ZpbmRfaGFzaF9maW5kKHBkZXYsIHBlZXJfbWFjLCAwLCAxKTsKKwlpZiAoTlVMTCA9PSBwZWVyKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMiwgIiVzOiBwZWVyIGlzIG51bGwgZm9yIHBlZXJfbWFjIgorCQkJIiAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIiwgX19GVU5DVElPTl9fLAorCQkJcGVlcl9tYWNbMF0sIHBlZXJfbWFjWzFdLCBwZWVyX21hY1syXSwgcGVlcl9tYWNbM10sCisJCQlwZWVyX21hY1s0XSwgcGVlcl9tYWNbNV0pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCS8qIFRPRE86IFNob3VsZCB3ZSBzZW5kIFdNSSBjb21tYW5kIG9mIHRoZSBjb25uZWN0aW9uIHN0YXRlPyAqLworCS8qIGF2b2lkIG11bHRpcGxlIGF1dGggc3RhdGUgY2hhbmdlLiAqLworCWlmIChwZWVyLT5zdGF0ZSA9PSBzdGF0ZSkgeworI2lmZGVmIFRYUlhfUFJJTlRfVkVSQk9TRV9FTkFCTEUKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0lORk8zLAorCQkJICAgIiVzOiBubyBzdGF0ZSBjaGFuZ2UsIHJldHVybnMgZGlyZWN0bHlcbiIsCisJCQkgICBfX2Z1bmNfXyk7CisjZW5kaWYKKwkJY2RmX2F0b21pY19kZWMoJnBlZXItPnJlZl9jbnQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMiwgIiVzOiBjaGFuZ2UgZnJvbSAlZCB0byAlZFxuIiwKKwkJICAgX19mdW5jX18sIHBlZXItPnN0YXRlLCBzdGF0ZSk7CisKKwlwZWVyLT50eF9maWx0ZXIgPSAoc3RhdGUgPT0gb2xfdHhyeF9wZWVyX3N0YXRlX2F1dGgpCisJCT8gb2xfdHhfZmlsdGVyX3Bhc3NfdGhydQorCQk6ICgoc3RhdGUgPT0gb2xfdHhyeF9wZWVyX3N0YXRlX2Nvbm4pCisJCSAgID8gb2xfdHhfZmlsdGVyX25vbl9hdXRoCisJCSAgIDogb2xfdHhfZmlsdGVyX2Rpc2NhcmQpOworCisJaWYgKHBlZXItPnZkZXYtPnBkZXYtPmNmZy5ob3N0X2FkZGJhKSB7CisJCWlmIChzdGF0ZSA9PSBvbF90eHJ4X3BlZXJfc3RhdGVfYXV0aCkgeworCQkJaW50IHRpZDsKKwkJCS8qCisJCQkgKiBQYXVzZSBhbGwgcmVndWxhciAobm9uLWV4dGVuZGVkKSBUSUQgdHggcXVldWVzIHVudGlsCisJCQkgKiBkYXRhIGFycml2ZXMgYW5kIEFEREJBIG5lZ290aWF0aW9uIGhhcyBjb21wbGV0ZWQuCisJCQkgKi8KKwkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMiwKKwkJCQkgICAiJXM6IHBhdXNlIHBlZXIgYW5kIHVucGF1c2UgbWdtdC9ub24tcW9zXG4iLAorCQkJCSAgIF9fZnVuY19fKTsKKwkJCW9sX3R4cnhfcGVlcl9wYXVzZShwZWVyKTsgLyogcGF1c2UgYWxsIHR4IHF1ZXVlcyAqLworCQkJLyogdW5wYXVzZSBtZ210IGFuZCBub24tUW9TIHR4IHF1ZXVlcyAqLworCQkJZm9yICh0aWQgPSBPTF9UWF9OVU1fUU9TX1RJRFM7CisJCQkgICAgIHRpZCA8IE9MX1RYX05VTV9USURTOyB0aWQrKykKKwkJCQlvbF90eHJ4X3BlZXJfdGlkX3VucGF1c2UocGVlciwgdGlkKTsKKwkJfQorCX0KKwljZGZfYXRvbWljX2RlYygmcGVlci0+cmVmX2NudCk7CisKKwkvKiBTZXQgdGhlIHN0YXRlIGFmdGVyIHRoZSBQYXVzZSB0byBhdm9pZCB0aGUgcmFjZSBjb25kaWN0aW9uCisJICAgd2l0aCBBRERCQSBjaGVjayBpbiB0eCBwYXRoICovCisJcGVlci0+c3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCit2b2lkCitvbF90eHJ4X3BlZXJfa2V5aW5zdGFsbGVkX3N0YXRlX3VwZGF0ZShzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsIHVpbnQ4X3QgdmFsKQoreworCXBlZXItPmtleWluc3RhbGxlZCA9IHZhbDsKK30KKwordm9pZAorb2xfdHhyeF9wZWVyX3VwZGF0ZShvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJCSAgICB1aW50OF90ICpwZWVyX21hYywKKwkJICAgIHVuaW9uIG9sX3R4cnhfcGVlcl91cGRhdGVfcGFyYW1fdCAqcGFyYW0sCisJCSAgICBlbnVtIG9sX3R4cnhfcGVlcl91cGRhdGVfc2VsZWN0X3Qgc2VsZWN0KQoreworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKworCXBlZXIgPSBvbF90eHJ4X3BlZXJfZmluZF9oYXNoX2ZpbmQodmRldi0+cGRldiwgcGVlcl9tYWMsIDAsIDEpOworCWlmICghcGVlcikgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfSU5GTzIsICIlczogcGVlciBpcyBudWxsIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoc2VsZWN0KSB7CisJY2FzZSBvbF90eHJ4X3BlZXJfdXBkYXRlX3Fvc19jYXBhYmxlOgorCXsKKwkJLyogc2F2ZSBxb3NfY2FwYWJsZSBoZXJlIHR4cnggcGVlciwKKwkJICogd2hlbiBIVFRfSVNPQ19UMkhfTVNHX1RZUEVfUEVFUl9JTkZPIGNvbWVzIHRoZW4gc2F2ZS4KKwkJICovCisJCXBlZXItPnFvc19jYXBhYmxlID0gcGFyYW0tPnFvc19jYXBhYmxlOworCQkvKgorCQkgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgYXNzdW1lcyB0aGF0IHRoZSBwZWVyIGhhcyBhCisJCSAqIHNpbmdsZSBJRC4gVGhpcyBpcyBjdXJyZW50bHkgdHJ1ZSwgYW5kCisJCSAqIGlzIGV4cGVjdGVkIHRvIHJlbWFpbiB0cnVlLgorCQkgKi8KKwkJaHR0X3BlZXJfcW9zX3VwZGF0ZShwZWVyLT52ZGV2LT5wZGV2LT5odHRfcGRldiwKKwkJCQkgICAgcGVlci0+cGVlcl9pZHNbMF0sCisJCQkJICAgIHBlZXItPnFvc19jYXBhYmxlKTsKKwkJYnJlYWs7CisJfQorCWNhc2Ugb2xfdHhyeF9wZWVyX3VwZGF0ZV91YXBzZE1hc2s6CisJeworCQlwZWVyLT51YXBzZF9tYXNrID0gcGFyYW0tPnVhcHNkX21hc2s7CisJCWh0dF9wZWVyX3VhcHNkbWFza191cGRhdGUocGVlci0+dmRldi0+cGRldi0+aHR0X3BkZXYsCisJCQkJCSAgcGVlci0+cGVlcl9pZHNbMF0sCisJCQkJCSAgcGVlci0+dWFwc2RfbWFzayk7CisJCWJyZWFrOworCX0KKwljYXNlIG9sX3R4cnhfcGVlcl91cGRhdGVfcGVlcl9zZWN1cml0eToKKwl7CisJCWVudW0gb2xfc2VjX3R5cGUgc2VjX3R5cGUgPSBwYXJhbS0+c2VjX3R5cGU7CisJCWVudW0gaHR0X3NlY190eXBlIHBlZXJfc2VjX3R5cGUgPSBodHRfc2VjX3R5cGVfbm9uZTsKKworCQlzd2l0Y2ggKHNlY190eXBlKSB7CisJCWNhc2Ugb2xfc2VjX3R5cGVfbm9uZToKKwkJCXBlZXJfc2VjX3R5cGUgPSBodHRfc2VjX3R5cGVfbm9uZTsKKwkJCWJyZWFrOworCQljYXNlIG9sX3NlY190eXBlX3dlcDEyODoKKwkJCXBlZXJfc2VjX3R5cGUgPSBodHRfc2VjX3R5cGVfd2VwMTI4OworCQkJYnJlYWs7CisJCWNhc2Ugb2xfc2VjX3R5cGVfd2VwMTA0OgorCQkJcGVlcl9zZWNfdHlwZSA9IGh0dF9zZWNfdHlwZV93ZXAxMDQ7CisJCQlicmVhazsKKwkJY2FzZSBvbF9zZWNfdHlwZV93ZXA0MDoKKwkJCXBlZXJfc2VjX3R5cGUgPSBodHRfc2VjX3R5cGVfd2VwNDA7CisJCQlicmVhazsKKwkJY2FzZSBvbF9zZWNfdHlwZV90a2lwOgorCQkJcGVlcl9zZWNfdHlwZSA9IGh0dF9zZWNfdHlwZV90a2lwOworCQkJYnJlYWs7CisJCWNhc2Ugb2xfc2VjX3R5cGVfdGtpcF9ub21pYzoKKwkJCXBlZXJfc2VjX3R5cGUgPSBodHRfc2VjX3R5cGVfdGtpcF9ub21pYzsKKwkJCWJyZWFrOworCQljYXNlIG9sX3NlY190eXBlX2Flc19jY21wOgorCQkJcGVlcl9zZWNfdHlwZSA9IGh0dF9zZWNfdHlwZV9hZXNfY2NtcDsKKwkJCWJyZWFrOworCQljYXNlIG9sX3NlY190eXBlX3dhcGk6CisJCQlwZWVyX3NlY190eXBlID0gaHR0X3NlY190eXBlX3dhcGk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBlZXJfc2VjX3R5cGUgPSBodHRfc2VjX3R5cGVfbm9uZTsKKwkJCWJyZWFrOworCQl9CisKKwkJcGVlci0+c2VjdXJpdHlbdHhyeF9zZWNfdWNhc3RdLnNlY190eXBlID0KKwkJCXBlZXItPnNlY3VyaXR5W3R4cnhfc2VjX21jYXN0XS5zZWNfdHlwZSA9CisJCQkJcGVlcl9zZWNfdHlwZTsKKworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwl7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkVSUk9SOiB1bmtub3duIHBhcmFtICVkIGluICVzIiwgc2VsZWN0LAorCQkJICBfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KKwl9CisJY2RmX2F0b21pY19kZWMoJnBlZXItPnJlZl9jbnQpOworfQorCit1aW50OF90CitvbF90eHJ4X3BlZXJfdWFwc2RtYXNrX2dldChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnR4cnhfcGRldiwgdWludDE2X3QgcGVlcl9pZCkKK3sKKworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwlwZWVyID0gb2xfdHhyeF9wZWVyX2ZpbmRfYnlfaWQodHhyeF9wZGV2LCBwZWVyX2lkKTsKKwlpZiAocGVlcikKKwkJcmV0dXJuIHBlZXItPnVhcHNkX21hc2s7CisJcmV0dXJuIDA7Cit9CisKK3VpbnQ4X3QKK29sX3R4cnhfcGVlcl9xb3NjYXBhYmxlX2dldChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnR4cnhfcGRldiwgdWludDE2X3QgcGVlcl9pZCkKK3sKKworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcl90ID0KKwkJb2xfdHhyeF9wZWVyX2ZpbmRfYnlfaWQodHhyeF9wZGV2LCBwZWVyX2lkKTsKKwlpZiAocGVlcl90ICE9IE5VTEwpCisJCXJldHVybiBwZWVyX3QtPnFvc19jYXBhYmxlOworCXJldHVybiAwOworfQorCit2b2lkIG9sX3R4cnhfcGVlcl91bnJlZl9kZWxldGUob2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyKQoreworCXN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldjsKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXY7CisJaW50IGk7CisKKwkvKiBwcmVjb25kaXRpb25zICovCisJVFhSWF9BU1NFUlQyKHBlZXIpOworCisJdmRldiA9IHBlZXItPnZkZXY7CisJaWYgKE5VTEwgPT0gdmRldikgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfSU5GTzEsCisJCQkgICAiVGhlIHZkZXYgaXMgbm90IHByZXNlbnQgYW55bW9yZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlwZGV2ID0gdmRldi0+cGRldjsKKwlpZiAoTlVMTCA9PSBwZGV2KSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMSwKKwkJCSAgICJUaGUgcGRldiBpcyBub3QgcHJlc2VudCBhbnltb3JlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIHRoZSByZWZlcmVuY2UgY291bnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBwZWVyCisJICogYXMgd2Ugbm90aWNlZCB0aGF0IHNvbWV0aW1lcyB3ZSBhcmUgcmUtZW50ZXJpbmcgdGhpcworCSAqIGZ1bmN0aW9uIGFnYWluIHdoaWNoIGlzIGxlYWRpbmcgdG8gZGVhZC1sb2NrLgorCSAqIChBIGRvdWJsZS1mcmVlIHNob3VsZCBuZXZlciBoYXBwZW4sIHNvIGFzc2VydCBpZiBpdCBkb2VzLikKKwkgKi8KKworCWlmICgwID09IGNkZl9hdG9taWNfcmVhZCgmKHBlZXItPnJlZl9jbnQpKSkgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJICAgIlRoZSBQZWVyIGlzIG5vdCBwcmVzZW50IGFueW1vcmVcbiIpOworCQljZGZfYXNzZXJ0KDApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBIb2xkIHRoZSBsb2NrIGFsbCB0aGUgd2F5IGZyb20gY2hlY2tpbmcgaWYgdGhlIHBlZXIgcmVmIGNvdW50CisJICogaXMgemVybyB1bnRpbCB0aGUgcGVlciByZWZlcmVuY2VzIGFyZSByZW1vdmVkIGZyb20gdGhlIGhhc2gKKwkgKiB0YWJsZSBhbmQgdmRldiBsaXN0IChpZiB0aGUgcGVlciByZWYgY291bnQgaXMgemVybykuCisJICogVGhpcyBwcm90ZWN0cyBhZ2FpbnN0IGEgbmV3IEhMIHR4IG9wZXJhdGlvbiBzdGFydGluZyB0byB1c2UgdGhlCisJICogcGVlciBvYmplY3QganVzdCBhZnRlciB0aGlzIGZ1bmN0aW9uIGNvbmNsdWRlcyBpdCdzIGRvbmUgYmVpbmcgdXNlZC4KKwkgKiBGdXJ0aGVybW9yZSwgdGhlIGxvY2sgbmVlZHMgdG8gYmUgaGVsZCB3aGlsZSBjaGVja2luZyB3aGV0aGVyIHRoZQorCSAqIHZkZXYncyBsaXN0IG9mIHBlZXJzIGlzIGVtcHR5LCB0byBtYWtlIHN1cmUgdGhhdCBsaXN0IGlzIG5vdCBtb2RpZmllZAorCSAqIGNvbmN1cnJlbnRseSB3aXRoIHRoZSBlbXB0eSBjaGVjay4KKwkgKi8KKwljZGZfc3Bpbl9sb2NrX2JoKCZwZGV2LT5wZWVyX3JlZl9tdXRleCk7CisJaWYgKGNkZl9hdG9taWNfZGVjX2FuZF90ZXN0KCZwZWVyLT5yZWZfY250KSkgeworCQl1X2ludDE2X3QgcGVlcl9pZDsKKworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJICAgIkRlbGV0aW5nIHBlZXIgJXAgKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KVxuIiwKKwkJCSAgIHBlZXIsCisJCQkgICBwZWVyLT5tYWNfYWRkci5yYXdbMF0sIHBlZXItPm1hY19hZGRyLnJhd1sxXSwKKwkJCSAgIHBlZXItPm1hY19hZGRyLnJhd1syXSwgcGVlci0+bWFjX2FkZHIucmF3WzNdLAorCQkJICAgcGVlci0+bWFjX2FkZHIucmF3WzRdLCBwZWVyLT5tYWNfYWRkci5yYXdbNV0pOworCisJCXBlZXJfaWQgPSBwZWVyLT5sb2NhbF9pZDsKKwkJLyogcmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHBlZXIgZnJvbSB0aGUgaGFzaCB0YWJsZSAqLworCQlvbF90eHJ4X3BlZXJfZmluZF9oYXNoX3JlbW92ZShwZGV2LCBwZWVyKTsKKworCQkvKiByZW1vdmUgdGhlIHBlZXIgZnJvbSBpdHMgcGFyZW50IHZkZXYncyBsaXN0ICovCisJCVRBSUxRX1JFTU9WRSgmcGVlci0+dmRldi0+cGVlcl9saXN0LCBwZWVyLCBwZWVyX2xpc3RfZWxlbSk7CisKKwkJLyogY2xlYW51cCB0aGUgUnggcmVvcmRlciBxdWV1ZXMgZm9yIHRoaXMgcGVlciAqLworCQlvbF9yeF9wZWVyX2NsZWFudXAodmRldiwgcGVlcik7CisKKwkJLyogcGVlciBpcyByZW1vdmVkIGZyb20gcGVlcl9saXN0ICovCisJCWNkZl9hdG9taWNfc2V0KCZwZWVyLT5kZWxldGVfaW5fcHJvZ3Jlc3MsIDApOworCisJCS8qCisJCSAqIFNldCB3YWl0X2RlbGV0ZV9jb21wIGV2ZW50IGlmIHRoZSBjdXJyZW50IHBlZXIgaWQgbWF0Y2hlcworCQkgKiB3aXRoIHJlZ2lzdGVyZWQgcGVlciBpZC4KKwkJICovCisJCWlmIChwZWVyX2lkID09IHZkZXYtPndhaXRfb25fcGVlcl9pZCkgeworCQkJY2RmX2V2ZW50X3NldCgmdmRldi0+d2FpdF9kZWxldGVfY29tcCk7CisJCQl2ZGV2LT53YWl0X29uX3BlZXJfaWQgPSBPTF9UWFJYX0lOVkFMSURfTE9DQUxfUEVFUl9JRDsKKwkJfQorCisJCS8qIGNoZWNrIHdoZXRoZXIgdGhlIHBhcmVudCB2ZGV2IGhhcyBubyBwZWVycyBsZWZ0ICovCisJCWlmIChUQUlMUV9FTVBUWSgmdmRldi0+cGVlcl9saXN0KSkgeworCQkJLyoKKwkJCSAqIE5vdyB0aGF0IHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIHRvIHRoZSBwZWVyLCB3ZSBjYW4KKwkJCSAqIHJlbGVhc2UgdGhlIHBlZXIgcmVmZXJlbmNlIGxvY2suCisJCQkgKi8KKwkJCWNkZl9zcGluX3VubG9ja19iaCgmcGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCQkJLyoKKwkJCSAqIENoZWNrIGlmIHRoZSBwYXJlbnQgdmRldiB3YXMgd2FpdGluZyBmb3IgaXRzIHBlZXJzCisJCQkgKiB0byBiZSBkZWxldGVkLCBpbiBvcmRlciBmb3IgaXQgdG8gYmUgZGVsZXRlZCB0b28uCisJCQkgKi8KKwkJCWlmICh2ZGV2LT5kZWxldGUucGVuZGluZykgeworCQkJCW9sX3R4cnhfdmRldl9kZWxldGVfY2IgdmRldl9kZWxldGVfY2IgPQorCQkJCQl2ZGV2LT5kZWxldGUuY2FsbGJhY2s7CisJCQkJdm9pZCAqdmRldl9kZWxldGVfY29udGV4dCA9CisJCQkJCXZkZXYtPmRlbGV0ZS5jb250ZXh0OworCisJCQkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0lORk8xLAorCQkJCQkgICAiJXM6IGRlbGV0aW5nIHZkZXYgb2JqZWN0ICVwICIKKwkJCQkJICAgIiglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkiCisJCQkJCSAgICIgLSBpdHMgbGFzdCBwZWVyIGlzIGRvbmVcbiIsCisJCQkJCSAgIF9fZnVuY19fLCB2ZGV2LAorCQkJCQkgICB2ZGV2LT5tYWNfYWRkci5yYXdbMF0sCisJCQkJCSAgIHZkZXYtPm1hY19hZGRyLnJhd1sxXSwKKwkJCQkJICAgdmRldi0+bWFjX2FkZHIucmF3WzJdLAorCQkJCQkgICB2ZGV2LT5tYWNfYWRkci5yYXdbM10sCisJCQkJCSAgIHZkZXYtPm1hY19hZGRyLnJhd1s0XSwKKwkJCQkJICAgdmRldi0+bWFjX2FkZHIucmF3WzVdKTsKKwkJCQkvKiBhbGwgcGVlcnMgYXJlIGdvbmUsIGdvIGFoZWFkIGFuZCBkZWxldGUgaXQgKi8KKwkJCQljZGZfbWVtX2ZyZWUodmRldik7CisJCQkJaWYgKHZkZXZfZGVsZXRlX2NiKQorCQkJCQl2ZGV2X2RlbGV0ZV9jYih2ZGV2X2RlbGV0ZV9jb250ZXh0KTsKKwkJCX0KKwkJfSBlbHNlCisJCQljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnBlZXJfcmVmX211dGV4KTsKKworCQkvKgorCQkgKiAnYXJyYXknIGlzIGFsbG9jYXRlZCBpbiBhZGRiYSBoYW5kbGVyIGFuZCBpcyBzdXBwb3NlZCB0byBiZQorCQkgKiBmcmVlZCBpbiBkZWxiYSBoYW5kbGVyLiBUaGVyZSBpcyB0aGUgY2FzZSAoZm9yIGV4YW1wbGUsIGluCisJCSAqIFNTUikgd2hlcmUgZGVsYmEgaGFuZGxlciBpcyBub3QgY2FsbGVkLiBCZWNhdXNlIGFycmF5IHBvaW50cworCQkgKiB0byBhZGRyZXNzIG9mICdiYXNlJyBieSBkZWZhdWx0IGFuZCBpcyByZWFsbG9jYXRlZCBpbiBhZGRiYQorCQkgKiBoYW5kbGVyIGxhdGVyLCBvbmx5IGZyZWUgdGhlIG1lbW9yeSB3aGVuIHRoZSBhcnJheSBkb2VzIG5vdAorCQkgKiBwb2ludCB0byBiYXNlLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IE9MX1RYUlhfTlVNX0VYVF9USURTOyBpKyspIHsKKwkJCWlmIChwZWVyLT50aWRzX3J4X3Jlb3JkZXJbaV0uYXJyYXkgIT0KKwkJCSAgICAmcGVlci0+dGlkc19yeF9yZW9yZGVyW2ldLmJhc2UpIHsKKwkJCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfSU5GTzEsCisJCQkJCSAgICIlcywgZGVsZXRlIHJlb3JkZXIgYXJyLCB0aWQ6JWRcbiIsCisJCQkJCSAgIF9fZnVuY19fLCBpKTsKKwkJCQljZGZfbWVtX2ZyZWUocGVlci0+dGlkc19yeF9yZW9yZGVyW2ldLmFycmF5KTsKKwkJCQlvbF9yeF9yZW9yZGVyX2luaXQoJnBlZXItPnRpZHNfcnhfcmVvcmRlcltpXSwKKwkJCQkJCSAgICh1aW50OF90KSBpKTsKKwkJCX0KKwkJfQorCisJCWNkZl9tZW1fZnJlZShwZWVyKTsKKwl9IGVsc2UgeworCQljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnBlZXJfcmVmX211dGV4KTsKKwl9Cit9CisKK3ZvaWQgb2xfdHhyeF9wZWVyX2RldGFjaChvbF90eHJ4X3BlZXJfaGFuZGxlIHBlZXIpCit7CisJc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2ID0gcGVlci0+dmRldjsKKworCS8qIHJlZGlyZWN0IHBlZXIncyByeCBkZWxpdmVyeSBmdW5jdGlvbiB0byBwb2ludCB0byBhIGRpc2NhcmQgZnVuYyAqLworCXBlZXItPnJ4X29wdF9wcm9jID0gb2xfcnhfZGlzY2FyZDsKKworCXBlZXItPnZhbGlkID0gMDsKKworCW9sX3R4cnhfbG9jYWxfcGVlcl9pZF9mcmVlKHBlZXItPnZkZXYtPnBkZXYsIHBlZXIpOworCisJLyogZGVidWcgcHJpbnQgdG8gZHVtcCByeCByZW9yZGVyIHN0YXRlICovCisJLyogaHR0X3J4X3Jlb3JkZXJfbG9nX3ByaW50KHZkZXYtPnBkZXYtPmh0dF9wZGV2KTsgKi8KKworCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCSAgICIlczpwZWVyICVwICglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCisJCSAgIF9fZnVuY19fLCBwZWVyLAorCQkgICBwZWVyLT5tYWNfYWRkci5yYXdbMF0sIHBlZXItPm1hY19hZGRyLnJhd1sxXSwKKwkJICAgcGVlci0+bWFjX2FkZHIucmF3WzJdLCBwZWVyLT5tYWNfYWRkci5yYXdbM10sCisJCSAgIHBlZXItPm1hY19hZGRyLnJhd1s0XSwgcGVlci0+bWFjX2FkZHIucmF3WzVdKTsKKwlvbF90eHJ4X2ZsdXNoX3J4X2ZyYW1lcyhwZWVyLCAxKTsKKworCWlmIChwZWVyLT52ZGV2LT5sYXN0X3JlYWxfcGVlciA9PSBwZWVyKQorCQlwZWVyLT52ZGV2LT5sYXN0X3JlYWxfcGVlciA9IE5VTEw7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZ2ZGV2LT5wZGV2LT5sYXN0X3JlYWxfcGVlcl9tdXRleCk7CisJaWYgKHZkZXYtPmxhc3RfcmVhbF9wZWVyID09IHBlZXIpCisJCXZkZXYtPmxhc3RfcmVhbF9wZWVyID0gTlVMTDsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPnBkZXYtPmxhc3RfcmVhbF9wZWVyX211dGV4KTsKKwlodHRfcnhfcmVvcmRlcl9sb2dfcHJpbnQocGVlci0+dmRldi0+cGRldi0+aHR0X3BkZXYpOworCisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJnBlZXItPnBlZXJfaW5mb19sb2NrKTsKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmcGVlci0+YnVmcV9sb2NrKTsKKwkvKiBzZXQgZGVsZXRlX2luX3Byb2dyZXNzIHRvIGlkZW50aWZ5IHRoYXQgd21hCisJICogaXMgd2FpdGluZyBmb3IgdW5tYXAgbWFzc2FnZSBmb3IgdGhpcyBwZWVyICovCisJY2RmX2F0b21pY19zZXQoJnBlZXItPmRlbGV0ZV9pbl9wcm9ncmVzcywgMSk7CisJLyoKKwkgKiBSZW1vdmUgdGhlIHJlZmVyZW5jZSBhZGRlZCBkdXJpbmcgcGVlcl9hdHRhY2guCisJICogVGhlIHBlZXIgd2lsbCBzdGlsbCBiZSBsZWZ0IGFsbG9jYXRlZCB1bnRpbCB0aGUKKwkgKiBQRUVSX1VOTUFQIG1lc3NhZ2UgYXJyaXZlcyB0byByZW1vdmUgdGhlIG90aGVyCisJICogcmVmZXJlbmNlLCBhZGRlZCBieSB0aGUgUEVFUl9NQVAgbWVzc2FnZS4KKwkgKi8KKwlvbF90eHJ4X3BlZXJfdW5yZWZfZGVsZXRlKHBlZXIpOworfQorCitvbF90eHJ4X3BlZXJfaGFuZGxlCitvbF90eHJ4X3BlZXJfZmluZF9ieV9hZGRyKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwgdWludDhfdCAqcGVlcl9tYWNfYWRkcikKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisJcGVlciA9IG9sX3R4cnhfcGVlcl9maW5kX2hhc2hfZmluZChwZGV2LCBwZWVyX21hY19hZGRyLCAwLCAwKTsKKwlpZiAocGVlcikgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJICAgIiVzOiBEZWxldGUgZXh0cmEgcmVmZXJlbmNlICVwXG4iLCBfX2Z1bmNfXywgcGVlcik7CisJCS8qIHJlbGVhc2UgdGhlIGV4dHJhIHJlZmVyZW5jZSAqLworCQlvbF90eHJ4X3BlZXJfdW5yZWZfZGVsZXRlKHBlZXIpOworCX0KKwlyZXR1cm4gcGVlcjsKK30KKworLyoqCisgKiBvbF90eHJ4X2R1bXBfdHhfZGVzYygpIC0gZHVtcCB0eCBkZXNjIHRvdGFsIGFuZCBmcmVlIGNvdW50CisgKiBAdHhyeF9wZGV2OiBQb2ludGVyIHRvIHR4cnggcGRldgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBvbF90eHJ4X2R1bXBfdHhfZGVzYyhvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXZfaGFuZGxlKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IChvbF90eHJ4X3BkZXZfaGFuZGxlKSBwZGV2X2hhbmRsZTsKKwl1aW50MzJfdCB0b3RhbDsKKworCXRvdGFsID0gb2xfdHhfZ2V0X2Rlc2NfZ2xvYmFsX3Bvb2xfc2l6ZShwZGV2KTsKKworCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCSJ0b3RhbCB0eCBjcmVkaXQgJWQgbnVtX2ZyZWUgJWQiLAorCQl0b3RhbCwgcGRldi0+dHhfZGVzYy5udW1fZnJlZSk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogb2xfdHhyeF93YWl0X2Zvcl9wZW5kaW5nX3R4KCkgLSB3YWl0IGZvciB0eCBxdWV1ZSB0byBiZSBlbXB0eQorICogQHRpbWVvdXQ6IHRpbWVvdXQgaW4gbXMKKyAqCisgKiBXYWl0IGZvciB0eCBxdWV1ZSB0byBiZSBlbXB0eSwgcmV0dXJuIHRpbWVvdXQgZXJyb3IgaWYKKyAqIHF1ZXVlIGRvZXNuJ3QgZW1wdHkgYmVmb3JlIHRpbWVvdXQgb2NjdXJzLgorICoKKyAqIFJldHVybjoKKyAqICAgIENERl9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgcXVldWUgZW1wdGllcywKKyAqICAgIENERl9TVEFUVVNfRV9USU1FT1VUIGluIGNhc2Ugb2YgdGltZW91dCwKKyAqICAgIENERl9TVEFUVVNfRV9GQVVMVCBpbiBjYXNlIG9mIG1pc3NpbmcgaGFuZGxlCisgKi8KK0NERl9TVEFUVVMgb2xfdHhyeF93YWl0X2Zvcl9wZW5kaW5nX3R4KGludCB0aW1lb3V0KQoreworCW9sX3R4cnhfcGRldl9oYW5kbGUgdHhyeF9wZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisKKwlpZiAodHhyeF9wZGV2ID09IE5VTEwpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJCSAgICIlczogdHhyeCBjb250ZXh0IGlzIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJd2hpbGUgKG9sX3R4cnhfZ2V0X3R4X3BlbmRpbmcodHhyeF9wZGV2KSkgeworCQljZGZfc2xlZXAoT0xfQVRIX1RYX0RSQUlOX1dBSVRfREVMQVkpOworCQlpZiAodGltZW91dCA8PSAwKSB7CisJCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJCSIlczogdHggZnJhbWVzIGFyZSBwZW5kaW5nIiwgX19mdW5jX18pOworCQkJb2xfdHhyeF9kdW1wX3R4X2Rlc2ModHhyeF9wZGV2KTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfVElNRU9VVDsKKwkJfQorCQl0aW1lb3V0ID0gdGltZW91dCAtIE9MX0FUSF9UWF9EUkFJTl9XQUlUX0RFTEFZOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisjaWZuZGVmIFFDQV9XSUZJXzNfMF9FTVUKKyNkZWZpbmUgU1VTUEVORF9EUkFJTl9XQUlUIDUwMAorI2Vsc2UKKyNkZWZpbmUgU1VTUEVORF9EUkFJTl9XQUlUIDMwMDAKKyNlbmRpZgorCisvKioKKyAqIG9sX3R4cnhfYnVzX3N1c3BlbmQoKSAtIGJ1cyBzdXNwZW5kCisgKgorICogRW5zdXJlIHRoYXQgb2xfdHhyeCBpcyByZWFkeSBmb3IgYnVzIHN1c3BlbmQKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBvbF90eHJ4X2J1c19zdXNwZW5kKHZvaWQpCit7CisJcmV0dXJuIG9sX3R4cnhfd2FpdF9mb3JfcGVuZGluZ190eChTVVNQRU5EX0RSQUlOX1dBSVQpOworfQorCisvKioKKyAqIG9sX3R4cnhfYnVzX3Jlc3VtZSgpIC0gYnVzIHJlc3VtZQorICoKKyAqIER1bW15IGZ1bmN0aW9uIGZvciBzeW1ldHJ5CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MKKyAqLworQ0RGX1NUQVRVUyBvbF90eHJ4X2J1c19yZXN1bWUodm9pZCkKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitpbnQgb2xfdHhyeF9nZXRfdHhfcGVuZGluZyhvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXZfaGFuZGxlKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IChvbF90eHJ4X3BkZXZfaGFuZGxlKSBwZGV2X2hhbmRsZTsKKwl1aW50MzJfdCB0b3RhbDsKKworCXRvdGFsID0gb2xfdHhfZ2V0X2Rlc2NfZ2xvYmFsX3Bvb2xfc2l6ZShwZGV2KTsKKworCXJldHVybiB0b3RhbCAtIHBkZXYtPnR4X2Rlc2MubnVtX2ZyZWU7Cit9CisKK3ZvaWQgb2xfdHhyeF9kaXNjYXJkX3R4X3BlbmRpbmcob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2X2hhbmRsZSkKK3sKKwlvbF90eF9kZXNjX2xpc3QgdHhfZGVzY3M7CisJLyogRmlyc3QgbGV0IGhpZiBkbyB0aGUgY2RmX2F0b21pY19kZWNfYW5kX3Rlc3QoJnR4X2Rlc2MtPnJlZl9jbnQpCisJICogdGhlbiBsZXQgaHR0IGRvIHRoZSBjZGZfYXRvbWljX2RlY19hbmRfdGVzdCgmdHhfZGVzYy0+cmVmX2NudCkKKwkgKiB3aGljaCBpcyB0aGEgc2FtZSB3aXRoIG5vcm1hbCBkYXRhIHNlbmQgY29tcGxldGUgcGF0aCovCisJaHR0X3R4X3BlbmRpbmdfZGlzY2FyZChwZGV2X2hhbmRsZS0+aHR0X3BkZXYpOworCisJVEFJTFFfSU5JVCgmdHhfZGVzY3MpOworCW9sX3R4X3F1ZXVlX2Rpc2NhcmQocGRldl9oYW5kbGUsIHRydWUsICZ0eF9kZXNjcyk7CisJLyogRGlzY2FyZCBGcmFtZXMgaW4gRGlzY2FyZCBMaXN0ICovCisJb2xfdHhfZGVzY19mcmFtZV9saXN0X2ZyZWUocGRldl9oYW5kbGUsICZ0eF9kZXNjcywgMSAvKiBlcnJvciAqLyk7CisKKwlvbF90eF9kaXNjYXJkX3RhcmdldF9mcm1zKHBkZXZfaGFuZGxlKTsKK30KKworLyotLS0gZGVidWcgZmVhdHVyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1bnNpZ25lZCBnX3R4cnhfcHJpbnRfbGV2ZWwgPSBUWFJYX1BSSU5UX0xFVkVMX0VSUjsgICAgIC8qIGRlZmF1bHQgKi8KKwordm9pZCBvbF90eHJ4X3ByaW50X2xldmVsX3NldCh1bnNpZ25lZCBsZXZlbCkKK3sKKyNpZm5kZWYgVFhSWF9QUklOVF9FTkFCTEUKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCSAgIlRoZSBkcml2ZXIgaXMgY29tcGlsZWQgd2l0aG91dCBUWFJYIHByaW50cyBlbmFibGVkLlxuIgorCQkgICJUbyBlbmFibGUgdGhlbSwgcmVjb21waWxlIHdpdGggVFhSWF9QUklOVF9FTkFCTEUgZGVmaW5lZCIpOworI2Vsc2UKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiVFhSWCBwcmludG91dCBsZXZlbCBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAorCQkgIGdfdHhyeF9wcmludF9sZXZlbCwgbGV2ZWwpOworCWdfdHhyeF9wcmludF9sZXZlbCA9IGxldmVsOworI2VuZGlmCit9CisKK3N0cnVjdCBvbF90eHJ4X3N0YXRzX3JlcV9pbnRlcm5hbCB7CisJc3RydWN0IG9sX3R4cnhfc3RhdHNfcmVxIGJhc2U7CisJaW50IHNlcnZpY2VkOyAgICAgICAgICAgLyogc3RhdGUgb2YgdGhpcyByZXF1ZXN0ICovCisJaW50IG9mZnNldDsKK307CisKK3N0YXRpYyBpbmxpbmUKK3VpbnQ2NF90IG9sX3R4cnhfc3RhdHNfcHRyX3RvX3U2NChzdHJ1Y3Qgb2xfdHhyeF9zdGF0c19yZXFfaW50ZXJuYWwgKnJlcSkKK3sKKwlyZXR1cm4gKHVpbnQ2NF90KSAoKHNpemVfdCkgcmVxKTsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IG9sX3R4cnhfc3RhdHNfcmVxX2ludGVybmFsICpvbF90eHJ4X3U2NF90b19zdGF0c19wdHIodWludDY0X3QgY29va2llKQoreworCXJldHVybiAoc3RydWN0IG9sX3R4cnhfc3RhdHNfcmVxX2ludGVybmFsICopKChzaXplX3QpIGNvb2tpZSk7Cit9CisKKyNpZmRlZiBBVEhfUEVSRl9QV1JfT0ZGTE9BRAordm9pZAorb2xfdHhyeF9md19zdGF0c19jZmcob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LAorCQkgICAgIHVpbnQ4X3QgY2ZnX3N0YXRzX3R5cGUsIHVpbnQzMl90IGNmZ192YWwpCit7CisJdWludDY0X3QgZHVtbXlfY29va2llID0gMDsKKwlodHRfaDJ0X2RiZ19zdGF0c19nZXQodmRldi0+cGRldi0+aHR0X3BkZXYsIDAgLyogdXBsb2FkIG1hc2sgKi8sCisJCQkgICAgICAwIC8qIHJlc2V0IG1hc2sgKi8sCisJCQkgICAgICBjZmdfc3RhdHNfdHlwZSwgY2ZnX3ZhbCwgZHVtbXlfY29va2llKTsKK30KKworQV9TVEFUVVMKK29sX3R4cnhfZndfc3RhdHNfZ2V0KG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgc3RydWN0IG9sX3R4cnhfc3RhdHNfcmVxICpyZXEpCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gdmRldi0+cGRldjsKKwl1aW50NjRfdCBjb29raWU7CisJc3RydWN0IG9sX3R4cnhfc3RhdHNfcmVxX2ludGVybmFsICpub25fdm9sYXRpbGVfcmVxOworCisJaWYgKCFwZGV2IHx8CisJICAgIHJlcS0+c3RhdHNfdHlwZV91cGxvYWRfbWFzayA+PSAxIDw8IEhUVF9EQkdfTlVNX1NUQVRTIHx8CisJICAgIHJlcS0+c3RhdHNfdHlwZV9yZXNldF9tYXNrID49IDEgPDwgSFRUX0RCR19OVU1fU1RBVFMpIHsKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhIG5vbi10cmFuc2llbnQgc3RhdHMgcmVxdWVzdCBvYmplY3QuCisJICogKFRoZSBvbmUgcHJvdmlkZWQgYXMgYW4gYXJndW1lbnQgaXMgbGlrZWx5IGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suKQorCSAqLworCW5vbl92b2xhdGlsZV9yZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKm5vbl92b2xhdGlsZV9yZXEpKTsKKwlpZiAoIW5vbl92b2xhdGlsZV9yZXEpCisJCXJldHVybiBBX05PX01FTU9SWTsKKworCS8qIGNvcHkgdGhlIGNhbGxlcidzIHNwZWNpZmljYXRpb25zICovCisJbm9uX3ZvbGF0aWxlX3JlcS0+YmFzZSA9ICpyZXE7CisJbm9uX3ZvbGF0aWxlX3JlcS0+c2VydmljZWQgPSAwOworCW5vbl92b2xhdGlsZV9yZXEtPm9mZnNldCA9IDA7CisKKwkvKiB1c2UgdGhlIG5vbi12b2xhdGlsZSByZXF1ZXN0IG9iamVjdCdzIGFkZHJlc3MgYXMgdGhlIGNvb2tpZSAqLworCWNvb2tpZSA9IG9sX3R4cnhfc3RhdHNfcHRyX3RvX3U2NChub25fdm9sYXRpbGVfcmVxKTsKKworCWlmIChodHRfaDJ0X2RiZ19zdGF0c19nZXQocGRldi0+aHR0X3BkZXYsCisJCQkJICByZXEtPnN0YXRzX3R5cGVfdXBsb2FkX21hc2ssCisJCQkJICByZXEtPnN0YXRzX3R5cGVfcmVzZXRfbWFzaywKKwkJCQkgIEhUVF9IMlRfU1RBVFNfUkVRX0NGR19TVEFUX1RZUEVfSU5WQUxJRCwgMCwKKwkJCQkgIGNvb2tpZSkpIHsKKwkJY2RmX21lbV9mcmVlKG5vbl92b2xhdGlsZV9yZXEpOworCQlyZXR1cm4gQV9FUlJPUjsKKwl9CisKKwlpZiAocmVxLT53YWl0LmJsb2NraW5nKQorCQl3aGlsZSAoY2RmX3NlbWFwaG9yZV9hY3F1aXJlKHBkZXYtPm9zZGV2LCByZXEtPndhaXQuc2VtX3B0cikpCisJCQk7CisKKwlyZXR1cm4gQV9PSzsKK30KKyNlbmRpZgordm9pZAorb2xfdHhyeF9md19zdGF0c19oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCSB1aW50NjRfdCBjb29raWUsIHVpbnQ4X3QgKnN0YXRzX2luZm9fbGlzdCkKK3sKKwllbnVtIGh0dF9kYmdfc3RhdHNfdHlwZSB0eXBlOworCWVudW0gaHR0X2RiZ19zdGF0c19zdGF0dXMgc3RhdHVzOworCWludCBsZW5ndGg7CisJdWludDhfdCAqc3RhdHNfZGF0YTsKKwlzdHJ1Y3Qgb2xfdHhyeF9zdGF0c19yZXFfaW50ZXJuYWwgKnJlcTsKKwlpbnQgbW9yZSA9IDA7CisKKwlyZXEgPSBvbF90eHJ4X3U2NF90b19zdGF0c19wdHIoY29va2llKTsKKworCWRvIHsKKwkJaHR0X3QyaF9kYmdfc3RhdHNfaGRyX3BhcnNlKHN0YXRzX2luZm9fbGlzdCwgJnR5cGUsICZzdGF0dXMsCisJCQkJCSAgICAmbGVuZ3RoLCAmc3RhdHNfZGF0YSk7CisJCWlmIChzdGF0dXMgPT0gSFRUX0RCR19TVEFUU19TVEFUVVNfU0VSSUVTX0RPTkUpCisJCQlicmVhazsKKwkJaWYgKHN0YXR1cyA9PSBIVFRfREJHX1NUQVRTX1NUQVRVU19QUkVTRU5UIHx8CisJCSAgICBzdGF0dXMgPT0gSFRUX0RCR19TVEFUU19TVEFUVVNfUEFSVElBTCkgeworCQkJdWludDhfdCAqYnVmOworCQkJaW50IGJ5dGVzID0gMDsKKworCQkJaWYgKHN0YXR1cyA9PSBIVFRfREJHX1NUQVRTX1NUQVRVU19QQVJUSUFMKQorCQkJCW1vcmUgPSAxOworCQkJaWYgKHJlcS0+YmFzZS5wcmludC52ZXJib3NlIHx8IHJlcS0+YmFzZS5wcmludC5jb25jaXNlKQorCQkJCS8qIHByb3ZpZGUgdGhlIGhlYWRlciBhbG9uZyB3aXRoIHRoZSBkYXRhICovCisJCQkJaHR0X3QyaF9zdGF0c19wcmludChzdGF0c19pbmZvX2xpc3QsCisJCQkJCQkgICAgcmVxLT5iYXNlLnByaW50LmNvbmNpc2UpOworCisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgSFRUX0RCR19TVEFUU19XQUxfUERFVl9UWFJYOgorCQkJCWJ5dGVzID0gc2l6ZW9mKHN0cnVjdCB3bGFuX2RiZ19zdGF0cyk7CisJCQkJaWYgKHJlcS0+YmFzZS5jb3B5LmJ1ZikgeworCQkJCQlpbnQgbG10OworCisJCQkJCWxtdCA9IHNpemVvZihzdHJ1Y3Qgd2xhbl9kYmdfc3RhdHMpOworCQkJCQlpZiAocmVxLT5iYXNlLmNvcHkuYnl0ZV9saW1pdCA8IGxtdCkKKwkJCQkJCWxtdCA9IHJlcS0+YmFzZS5jb3B5LmJ5dGVfbGltaXQ7CisJCQkJCWJ1ZiA9IHJlcS0+YmFzZS5jb3B5LmJ1ZiArIHJlcS0+b2Zmc2V0OworCQkJCQljZGZfbWVtX2NvcHkoYnVmLCBzdGF0c19kYXRhLCBsbXQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgSFRUX0RCR19TVEFUU19SWF9SRU9SREVSOgorCQkJCWJ5dGVzID0gc2l6ZW9mKHN0cnVjdCByeF9yZW9yZGVyX3N0YXRzKTsKKwkJCQlpZiAocmVxLT5iYXNlLmNvcHkuYnVmKSB7CisJCQkJCWludCBsbXQ7CisKKwkJCQkJbG10ID0gc2l6ZW9mKHN0cnVjdCByeF9yZW9yZGVyX3N0YXRzKTsKKwkJCQkJaWYgKHJlcS0+YmFzZS5jb3B5LmJ5dGVfbGltaXQgPCBsbXQpCisJCQkJCQlsbXQgPSByZXEtPmJhc2UuY29weS5ieXRlX2xpbWl0OworCQkJCQlidWYgPSByZXEtPmJhc2UuY29weS5idWYgKyByZXEtPm9mZnNldDsKKwkJCQkJY2RmX21lbV9jb3B5KGJ1Ziwgc3RhdHNfZGF0YSwgbG10KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEhUVF9EQkdfU1RBVFNfUlhfUkFURV9JTkZPOgorCQkJCWJ5dGVzID0gc2l6ZW9mKHdsYW5fZGJnX3J4X3JhdGVfaW5mb190KTsKKwkJCQlpZiAocmVxLT5iYXNlLmNvcHkuYnVmKSB7CisJCQkJCWludCBsbXQ7CisKKwkJCQkJbG10ID0gc2l6ZW9mKHdsYW5fZGJnX3J4X3JhdGVfaW5mb190KTsKKwkJCQkJaWYgKHJlcS0+YmFzZS5jb3B5LmJ5dGVfbGltaXQgPCBsbXQpCisJCQkJCQlsbXQgPSByZXEtPmJhc2UuY29weS5ieXRlX2xpbWl0OworCQkJCQlidWYgPSByZXEtPmJhc2UuY29weS5idWYgKyByZXEtPm9mZnNldDsKKwkJCQkJY2RmX21lbV9jb3B5KGJ1Ziwgc3RhdHNfZGF0YSwgbG10KTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSFRUX0RCR19TVEFUU19UWF9SQVRFX0lORk86CisJCQkJYnl0ZXMgPSBzaXplb2Yod2xhbl9kYmdfdHhfcmF0ZV9pbmZvX3QpOworCQkJCWlmIChyZXEtPmJhc2UuY29weS5idWYpIHsKKwkJCQkJaW50IGxtdDsKKworCQkJCQlsbXQgPSBzaXplb2Yod2xhbl9kYmdfdHhfcmF0ZV9pbmZvX3QpOworCQkJCQlpZiAocmVxLT5iYXNlLmNvcHkuYnl0ZV9saW1pdCA8IGxtdCkKKwkJCQkJCWxtdCA9IHJlcS0+YmFzZS5jb3B5LmJ5dGVfbGltaXQ7CisJCQkJCWJ1ZiA9IHJlcS0+YmFzZS5jb3B5LmJ1ZiArIHJlcS0+b2Zmc2V0OworCQkJCQljZGZfbWVtX2NvcHkoYnVmLCBzdGF0c19kYXRhLCBsbXQpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBIVFRfREJHX1NUQVRTX1RYX1BQRFVfTE9HOgorCQkJCWJ5dGVzID0gMDsKKwkJCQkvKiBUTyBETzogc3BlY2lmeSBob3cgbWFueSBieXRlcyBhcmUgcHJlc2VudCAqLworCQkJCS8qIFRPIERPOiBhZGQgY29weWluZyB0byB0aGUgcmVxdWVzdG9yJ3MgYnVmICovCisKKwkJCWNhc2UgSFRUX0RCR19TVEFUU19SWF9SRU1PVEVfUklOR19CVUZGRVJfSU5GTzoKKwkJCQlieXRlcyA9IHNpemVvZihzdHJ1Y3QgcnhfcmVtb3RlX2J1ZmZlcl9tZ210X3N0YXRzKTsKKwkJCQlpZiAocmVxLT5iYXNlLmNvcHkuYnVmKSB7CisJCQkJCWludCBsaW1pdDsKKworCQkJCQlsaW1pdCA9IHNpemVvZihzdHJ1Y3QgcnhfcmVtb3RlX2J1ZmZlcl9tZ210X3N0YXRzKTsKKwkJCQkJaWYgKHJlcS0+YmFzZS5jb3B5LmJ5dGVfbGltaXQgPCBsaW1pdCkgeworCQkJCQkJbGltaXQgPSByZXEtPmJhc2UuY29weS5ieXRlX2xpbWl0OworCQkJCQl9CisJCQkJCWJ1ZiA9IHJlcS0+YmFzZS5jb3B5LmJ1ZiArIHJlcS0+b2Zmc2V0OworCQkJCQljZGZfbWVtX2NvcHkoYnVmLCBzdGF0c19kYXRhLCBsaW1pdCk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIEhUVF9EQkdfU1RBVFNfVFhCRl9JTkZPOgorCQkJCWJ5dGVzID0gc2l6ZW9mKHN0cnVjdCB3bGFuX2RiZ190eGJmX2RhdGFfc3RhdHMpOworCQkJCWlmIChyZXEtPmJhc2UuY29weS5idWYpIHsKKwkJCQkJaW50IGxpbWl0OworCisJCQkJCWxpbWl0ID0gc2l6ZW9mKHN0cnVjdCB3bGFuX2RiZ190eGJmX2RhdGFfc3RhdHMpOworCQkJCQlpZiAocmVxLT5iYXNlLmNvcHkuYnl0ZV9saW1pdCA8IGxpbWl0KQorCQkJCQkJbGltaXQgPSByZXEtPmJhc2UuY29weS5ieXRlX2xpbWl0OworCQkJCQlidWYgPSByZXEtPmJhc2UuY29weS5idWYgKyByZXEtPm9mZnNldDsKKwkJCQkJY2RmX21lbV9jb3B5KGJ1Ziwgc3RhdHNfZGF0YSwgbGltaXQpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBIVFRfREJHX1NUQVRTX1NORF9JTkZPOgorCQkJCWJ5dGVzID0gc2l6ZW9mKHN0cnVjdCB3bGFuX2RiZ190eGJmX3NuZF9zdGF0cyk7CisJCQkJaWYgKHJlcS0+YmFzZS5jb3B5LmJ1ZikgeworCQkJCQlpbnQgbGltaXQ7CisKKwkJCQkJbGltaXQgPSBzaXplb2Yoc3RydWN0IHdsYW5fZGJnX3R4YmZfc25kX3N0YXRzKTsKKwkJCQkJaWYgKHJlcS0+YmFzZS5jb3B5LmJ5dGVfbGltaXQgPCBsaW1pdCkKKwkJCQkJCWxpbWl0ID0gcmVxLT5iYXNlLmNvcHkuYnl0ZV9saW1pdDsKKwkJCQkJYnVmID0gcmVxLT5iYXNlLmNvcHkuYnVmICsgcmVxLT5vZmZzZXQ7CisJCQkJCWNkZl9tZW1fY29weShidWYsIHN0YXRzX2RhdGEsIGxpbWl0KTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSFRUX0RCR19TVEFUU19UWF9TRUxGR0VOX0lORk86CisJCQkJYnl0ZXMgPSBzaXplb2Yoc3RydWN0IHdsYW5fZGJnX3R4X3NlbGZnZW5fc3RhdHMpOworCQkJCWlmIChyZXEtPmJhc2UuY29weS5idWYpIHsKKwkJCQkJaW50IGxpbWl0OworCisJCQkJCWxpbWl0ID0gc2l6ZW9mKHN0cnVjdCB3bGFuX2RiZ190eF9zZWxmZ2VuX3N0YXRzKTsKKwkJCQkJaWYgKHJlcS0+YmFzZS5jb3B5LmJ5dGVfbGltaXQgPCBsaW1pdCkKKwkJCQkJCWxpbWl0ID0gcmVxLT5iYXNlLmNvcHkuYnl0ZV9saW1pdDsKKwkJCQkJYnVmID0gcmVxLT5iYXNlLmNvcHkuYnVmICsgcmVxLT5vZmZzZXQ7CisJCQkJCWNkZl9tZW1fY29weShidWYsIHN0YXRzX2RhdGEsIGxpbWl0KTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSFRUX0RCR19TVEFUU19FUlJPUl9JTkZPOgorCQkJCWJ5dGVzID0KKwkJCQkgIHNpemVvZihzdHJ1Y3Qgd2xhbl9kYmdfd2lmaTJfZXJyb3Jfc3RhdHMpOworCQkJCWlmIChyZXEtPmJhc2UuY29weS5idWYpIHsKKwkJCQkJaW50IGxpbWl0OworCisJCQkJCWxpbWl0ID0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB3bGFuX2RiZ193aWZpMl9lcnJvcl9zdGF0cyk7CisJCQkJCWlmIChyZXEtPmJhc2UuY29weS5ieXRlX2xpbWl0IDwgbGltaXQpCisJCQkJCQlsaW1pdCA9IHJlcS0+YmFzZS5jb3B5LmJ5dGVfbGltaXQ7CisJCQkJCWJ1ZiA9IHJlcS0+YmFzZS5jb3B5LmJ1ZiArIHJlcS0+b2Zmc2V0OworCQkJCQljZGZfbWVtX2NvcHkoYnVmLCBzdGF0c19kYXRhLCBsaW1pdCk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIEhUVF9EQkdfU1RBVFNfVFhCRl9NVVNVX05EUEFfUEtUOgorCQkJCWJ5dGVzID0KKwkJCQkgIHNpemVvZihzdHJ1Y3QgcnhfdHhiZl9tdXN1X25kcGFfcGt0c19zdGF0cyk7CisJCQkJaWYgKHJlcS0+YmFzZS5jb3B5LmJ1ZikgeworCQkJCQlpbnQgbGltaXQ7CisKKwkJCQkJbGltaXQgPSBzaXplb2Yoc3RydWN0CisJCQkJCQlyeF90eGJmX211c3VfbmRwYV9wa3RzX3N0YXRzKTsKKwkJCQkJaWYgKHJlcS0+YmFzZS5jb3B5LmJ5dGVfbGltaXQgPAlsaW1pdCkKKwkJCQkJCWxpbWl0ID0KKwkJCQkJCXJlcS0+YmFzZS5jb3B5LmJ5dGVfbGltaXQ7CisJCQkJCWJ1ZiA9IHJlcS0+YmFzZS5jb3B5LmJ1ZiArIHJlcS0+b2Zmc2V0OworCQkJCQljZGZfbWVtX2NvcHkoYnVmLCBzdGF0c19kYXRhLCBsaW1pdCk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJYnVmID0gcmVxLT5iYXNlLmNvcHkuYnVmCisJCQkJPyByZXEtPmJhc2UuY29weS5idWYKKwkJCQk6IHN0YXRzX2RhdGE7CisJCQlpZiAocmVxLT5iYXNlLmNhbGxiYWNrLmZwKQorCQkJCXJlcS0+YmFzZS5jYWxsYmFjay5mcChyZXEtPmJhc2UuY2FsbGJhY2suY3R4dCwKKwkJCQkJCSAgICAgIHR5cGUsIGJ1ZiwgYnl0ZXMpOworCQl9CisJCXN0YXRzX2luZm9fbGlzdCArPSBsZW5ndGg7CisJfSB3aGlsZSAoMSk7CisKKwlpZiAoIW1vcmUpIHsKKwkJaWYgKHJlcS0+YmFzZS53YWl0LmJsb2NraW5nKQorCQkJY2RmX3NlbWFwaG9yZV9yZWxlYXNlKHBkZXYtPm9zZGV2LAorCQkJCQkgICAgICByZXEtPmJhc2Uud2FpdC5zZW1fcHRyKTsKKwkJY2RmX21lbV9mcmVlKHJlcSk7CisJfQorfQorCisjaWZuZGVmIEFUSF9QRVJGX1BXUl9PRkZMT0FEIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBvbF90eHJ4X2RlYnVnKG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgaW50IGRlYnVnX3NwZWNzKQoreworCWlmIChkZWJ1Z19zcGVjcyAmIFRYUlhfREJHX01BU0tfT0JKUykgeworI2lmIGRlZmluZWQoVFhSWF9ERUJVR19MRVZFTCkgJiYgVFhSWF9ERUJVR19MRVZFTCA+IDUKKwkJb2xfdHhyeF9wZGV2X2Rpc3BsYXkodmRldi0+cGRldiwgMCk7CisjZWxzZQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICJUaGUgcGRldix2ZGV2LHBlZXIgZGlzcGxheSBmdW5jdGlvbnMgYXJlIGRpc2FibGVkLlxuIgorCQkJICAiVG8gZW5hYmxlIHRoZW0sIHJlY29tcGlsZSB3aXRoIFRYUlhfREVCVUdfTEVWRUwgPiA1Iik7CisjZW5kaWYKKwl9CisJaWYgKGRlYnVnX3NwZWNzICYgVFhSWF9EQkdfTUFTS19TVEFUUykgeworCQlvbF90eHJ4X3N0YXRzX2Rpc3BsYXkodmRldi0+cGRldik7CisJfQorCWlmIChkZWJ1Z19zcGVjcyAmIFRYUlhfREJHX01BU0tfUFJPVF9BTkFMWVpFKSB7CisjaWYgZGVmaW5lZChFTkFCTEVfVFhSWF9QUk9UX0FOQUxZWkUpCisJCW9sX3R4cnhfcHJvdF9hbnNfZGlzcGxheSh2ZGV2LT5wZGV2KTsKKyNlbHNlCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgInR4cnggcHJvdG9jb2wgYW5hbHlzaXMgaXMgZGlzYWJsZWQuXG4iCisJCQkgICJUbyBlbmFibGUgaXQsIHJlY29tcGlsZSB3aXRoICIKKwkJCSAgIkVOQUJMRV9UWFJYX1BST1RfQU5BTFlaRSBkZWZpbmVkIik7CisjZW5kaWYKKwl9CisJaWYgKGRlYnVnX3NwZWNzICYgVFhSWF9EQkdfTUFTS19SWF9SRU9SREVSX1RSQUNFKSB7CisjaWYgZGVmaW5lZChFTkFCTEVfUlhfUkVPUkRFUl9UUkFDRSkKKwkJb2xfcnhfcmVvcmRlcl90cmFjZV9kaXNwbGF5KHZkZXYtPnBkZXYsIDAsIDApOworI2Vsc2UKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAicnggcmVvcmRlciBzZXEgbnVtIHRyYWNlIGlzIGRpc2FibGVkLlxuIgorCQkJICAiVG8gZW5hYmxlIGl0LCByZWNvbXBpbGUgd2l0aCAiCisJCQkgICJFTkFCTEVfUlhfUkVPUkRFUl9UUkFDRSBkZWZpbmVkIik7CisjZW5kaWYKKworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgb2xfdHhyeF9hZ2dyX2NmZyhvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJCSAgICAgaW50IG1heF9zdWJmcm1zX2FtcGR1LCBpbnQgbWF4X3N1YmZybXNfYW1zZHUpCit7CisJcmV0dXJuIGh0dF9oMnRfYWdncl9jZmdfbXNnKHZkZXYtPnBkZXYtPmh0dF9wZGV2LAorCQkJCSAgICBtYXhfc3ViZnJtc19hbXBkdSwgbWF4X3N1YmZybXNfYW1zZHUpOworfQorCisjaWYgZGVmaW5lZChUWFJYX0RFQlVHX0xFVkVMKSAmJiBUWFJYX0RFQlVHX0xFVkVMID4gNQordm9pZCBvbF90eHJ4X3BkZXZfZGlzcGxheShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIGludCBpbmRlbnQpCit7CisJc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2OworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIlKnMlczpcbiIsIGluZGVudCwgIiAiLCAidHhyeCBwZGV2Iik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIlKnNwZGV2IG9iamVjdDogJXAiLCBpbmRlbnQgKyA0LCAiICIsIHBkZXYpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJSpzdmRldiBsaXN0OiIsIGluZGVudCArIDQsICIgIik7CisJVEFJTFFfRk9SRUFDSCh2ZGV2LCAmcGRldi0+dmRldl9saXN0LCB2ZGV2X2xpc3RfZWxlbSkgeworCQlvbF90eHJ4X3ZkZXZfZGlzcGxheSh2ZGV2LCBpbmRlbnQgKyA4KTsKKwl9CisJb2xfdHhyeF9wZWVyX2ZpbmRfZGlzcGxheShwZGV2LCBpbmRlbnQgKyA0KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiUqc3R4IGRlc2MgcG9vbDogJWQgZWxlbXMgQCAlcCIsIGluZGVudCArIDQsICIgIiwKKwkJICBwZGV2LT50eF9kZXNjLnBvb2xfc2l6ZSwgcGRldi0+dHhfZGVzYy5hcnJheSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAiICIpOworCWh0dF9kaXNwbGF5KHBkZXYtPmh0dF9wZGV2LCBpbmRlbnQpOworfQorCit2b2lkIG9sX3R4cnhfdmRldl9kaXNwbGF5KG9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiwgaW50IGluZGVudCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiUqc3R4cnggdmRldjogJXBcbiIsIGluZGVudCwgIiAiLCB2ZGV2KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiUqc0lEOiAlZFxuIiwgaW5kZW50ICsgNCwgIiAiLCB2ZGV2LT52ZGV2X2lkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiUqc01BQyBhZGRyOiAlZDolZDolZDolZDolZDolZCIsCisJCSAgaW5kZW50ICsgNCwgIiAiLAorCQkgIHZkZXYtPm1hY19hZGRyLnJhd1swXSwgdmRldi0+bWFjX2FkZHIucmF3WzFdLAorCQkgIHZkZXYtPm1hY19hZGRyLnJhd1syXSwgdmRldi0+bWFjX2FkZHIucmF3WzNdLAorCQkgIHZkZXYtPm1hY19hZGRyLnJhd1s0XSwgdmRldi0+bWFjX2FkZHIucmF3WzVdKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiUqc3BlZXIgbGlzdDoiLCBpbmRlbnQgKyA0LCAiICIpOworCVRBSUxRX0ZPUkVBQ0gocGVlciwgJnZkZXYtPnBlZXJfbGlzdCwgcGVlcl9saXN0X2VsZW0pIHsKKwkJb2xfdHhyeF9wZWVyX2Rpc3BsYXkocGVlciwgaW5kZW50ICsgOCk7CisJfQorfQorCit2b2lkIG9sX3R4cnhfcGVlcl9kaXNwbGF5KG9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlciwgaW50IGluZGVudCkKK3sKKwlpbnQgaTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJSpzdHhyeCBwZWVyOiAlcCIsIGluZGVudCwgIiAiLCBwZWVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9QRUVSX0lEX1BFUl9QRUVSOyBpKyspIHsKKwkJaWYgKHBlZXItPnBlZXJfaWRzW2ldICE9IEhUVF9JTlZBTElEX1BFRVIpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCQkgICIlKnNJRDogJWQiLCBpbmRlbnQgKyA0LCAiICIsCisJCQkJICBwZWVyLT5wZWVyX2lkc1tpXSk7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogVFhSWF9ERUJVR19MRVZFTCAqLworCisjaWYgZGVmaW5lZChGRUFUVVJFX1RTTykgJiYgZGVmaW5lZChGRUFUVVJFX1RTT19ERUJVRykKK3ZvaWQgb2xfdHhyeF9zdGF0c19kaXNwbGF5X3RzbyhvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYpCit7CisJaW50IG1zZHVfaWR4OworCWludCBzZWdfaWR4OworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkiVFNPIHBrdHMgJWxsZCwgYnl0ZXMgJWxsZFxuIiwKKwkJcGRldi0+c3RhdHMucHViLnR4LnRzby50c29fcGt0cy5wa3RzLAorCQlwZGV2LT5zdGF0cy5wdWIudHgudHNvLnRzb19wa3RzLmJ5dGVzKTsKKworCWZvciAobXNkdV9pZHggPSAwOyBtc2R1X2lkeCA8IE5VTV9NQVhfVFNPX01TRFVTOyBtc2R1X2lkeCsrKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJjdXJyIG1zZHUgaWR4OiAlZCBjdXJyIHNlZyBpZHg6ICVkIG51bSBzZWdzICVkXG4iLAorCQkJVFhSWF9TVEFUU19UU09fTVNEVV9JRFgocGRldiksCisJCQlUWFJYX1NUQVRTX1RTT19TRUdfSURYKHBkZXYpLAorCQkJVFhSWF9TVEFUU19UU09fTVNEVV9OVU1fU0VHKHBkZXYsIG1zZHVfaWR4KSk7CisJCWZvciAoc2VnX2lkeCA9IDA7CisJCQkgKChzZWdfaWR4IDwgVFhSWF9TVEFUU19UU09fTVNEVV9OVU1fU0VHKHBkZXYsIG1zZHVfaWR4KSkgJiYKKwkJCSAgKHNlZ19pZHggPCBOVU1fTUFYX1RTT19TRUdTKSk7CisJCQkgc2VnX2lkeCsrKSB7CisJCQlzdHJ1Y3QgY2RmX3Rzb19zZWdfdCB0c29fc2VnID0KKwkJCQkgVFhSWF9TVEFUU19UU09fU0VHKHBkZXYsIG1zZHVfaWR4LCBzZWdfaWR4KTsKKworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAibXNkdSBpZHg6ICVkIHNlZyBpZHg6ICVkXG4iLAorCQkJCSBtc2R1X2lkeCwgc2VnX2lkeCk7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICJ0c29fZW5hYmxlOiAlZFxuIiwKKwkJCQkgdHNvX3NlZy50c29fZmxhZ3MudHNvX2VuYWJsZSk7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICJmaW4gJWQgc3luICVkIHJzdCAlZCBwc2ggJWQgYWNrICVkXG4iCisJCQkJICJ1cmcgJWQgZWNlICVkIGN3ciAlZCBucyAlZFxuIiwKKwkJCQkgdHNvX3NlZy50c29fZmxhZ3MuZmluLCB0c29fc2VnLnRzb19mbGFncy5zeW4sCisJCQkJIHRzb19zZWcudHNvX2ZsYWdzLnJzdCwgdHNvX3NlZy50c29fZmxhZ3MucHNoLAorCQkJCSB0c29fc2VnLnRzb19mbGFncy5hY2ssIHRzb19zZWcudHNvX2ZsYWdzLnVyZywKKwkJCQkgdHNvX3NlZy50c29fZmxhZ3MuZWNlLCB0c29fc2VnLnRzb19mbGFncy5jd3IsCisJCQkJIHRzb19zZWcudHNvX2ZsYWdzLm5zKTsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgInRjcF9zZXFfbnVtOiAweCV4IGlwX2lkOiAlZFxuIiwKKwkJCQkgdHNvX3NlZy50c29fZmxhZ3MudGNwX3NlcV9udW0sCisJCQkJIHRzb19zZWcudHNvX2ZsYWdzLmlwX2lkKTsKKwkJfQorCX0KK30KKyNlbmRpZgorCisvKioKKyAqIG9sX3R4cnhfc3RhdHMoKSAtIHVwZGF0ZSBvbCBsYXllciBzdGF0cworICogQHZkZXZfaWQ6IHZkZXZfaWQKKyAqIEBidWZmZXI6IHBvaW50ZXIgdG8gYnVmZmVyCisgKiBAYnVmX2xlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqCisgKiBSZXR1cm46IGxlbmd0aCBvZiBzdHJpbmcKKyAqLworaW50CitvbF90eHJ4X3N0YXRzKHVpbnQ4X3QgdmRldl9pZCwgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBidWZfbGVuKQoreworCXVpbnQzMl90IGxlbiA9IDA7CisKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYgPSBvbF90eHJ4X2dldF92ZGV2X2Zyb21fdmRldl9pZCh2ZGV2X2lkKTsKKwlpZiAoIXZkZXYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJIiVzOiB2ZGV2IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXNucHJpbnRmKGJ1ZmZlciwgYnVmX2xlbiwgInZkZXYgbm90IGZvdW5kIik7CisJCXJldHVybiBsZW47CisJfQorCisJbGVuID0gc2NucHJpbnRmKGJ1ZmZlciwgYnVmX2xlbiwKKwkJIlxuVFhSWCBzdGF0czpcbiIKKwkJIlxubGxRdWV1ZSBTdGF0ZSA6ICVzIgorCQkiXG4gcGF1c2UgJXUgdW5wYXVzZSAldSIKKwkJIlxuIG92ZXJmbG93ICV1IgorCQkiXG5sbFF1ZXVlIHRpbWVyIHN0YXRlIDogJXNcbiIsCisJCSgodmRldi0+bGxfcGF1c2UuaXNfcV9wYXVzZWQgPT0gZmFsc2UpID8gIlVOUEFVU0VEIiA6ICJQQVVTRUQiKSwKKwkJdmRldi0+bGxfcGF1c2UucV9wYXVzZV9jbnQsCisJCXZkZXYtPmxsX3BhdXNlLnFfdW5wYXVzZV9jbnQsCisJCXZkZXYtPmxsX3BhdXNlLnFfb3ZlcmZsb3dfY250LAorCQkoKHZkZXYtPmxsX3BhdXNlLmlzX3FfdGltZXJfb24gPT0gZmFsc2UpCisJCQk/ICJOT1QtUlVOTklORyIgOiAiUlVOTklORyIpKTsKKwlyZXR1cm4gbGVuOworfQorCit2b2lkIG9sX3R4cnhfc3RhdHNfZGlzcGxheShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYpCit7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAidHhyeCBzdGF0czoiKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIiAgdHg6IHNlbnQgJWxsZCBtc2R1cyAoJWxsZCBCKSwgIgorCQkgICIgICAgICByZWplY3RlZCAlbGxkICglbGxkIEIpLCBkcm9wcGVkICVsbGQgKCVsbGQgQikiLAorCQkgIHBkZXYtPnN0YXRzLnB1Yi50eC5kZWxpdmVyZWQucGt0cywKKwkJICBwZGV2LT5zdGF0cy5wdWIudHguZGVsaXZlcmVkLmJ5dGVzLAorCQkgIHBkZXYtPnN0YXRzLnB1Yi50eC5kcm9wcGVkLmhvc3RfcmVqZWN0LnBrdHMsCisJCSAgcGRldi0+c3RhdHMucHViLnR4LmRyb3BwZWQuaG9zdF9yZWplY3QuYnl0ZXMsCisJCSAgcGRldi0+c3RhdHMucHViLnR4LmRyb3BwZWQuZG93bmxvYWRfZmFpbC5wa3RzCisJCSAgKyBwZGV2LT5zdGF0cy5wdWIudHguZHJvcHBlZC50YXJnZXRfZGlzY2FyZC5wa3RzCisJCSAgKyBwZGV2LT5zdGF0cy5wdWIudHguZHJvcHBlZC5ub19hY2sucGt0cywKKwkJICBwZGV2LT5zdGF0cy5wdWIudHguZHJvcHBlZC5kb3dubG9hZF9mYWlsLmJ5dGVzCisJCSAgKyBwZGV2LT5zdGF0cy5wdWIudHguZHJvcHBlZC50YXJnZXRfZGlzY2FyZC5ieXRlcworCQkgICsgcGRldi0+c3RhdHMucHViLnR4LmRyb3BwZWQubm9fYWNrLmJ5dGVzKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIiAgICBkb3dubG9hZCBmYWlsOiAlbGxkICglbGxkIEIpLCAiCisJCSAgInRhcmdldCBkaXNjYXJkOiAlbGxkICglbGxkIEIpLCAiCisJCSAgIm5vIGFjazogJWxsZCAoJWxsZCBCKSIsCisJCSAgcGRldi0+c3RhdHMucHViLnR4LmRyb3BwZWQuZG93bmxvYWRfZmFpbC5wa3RzLAorCQkgIHBkZXYtPnN0YXRzLnB1Yi50eC5kcm9wcGVkLmRvd25sb2FkX2ZhaWwuYnl0ZXMsCisJCSAgcGRldi0+c3RhdHMucHViLnR4LmRyb3BwZWQudGFyZ2V0X2Rpc2NhcmQucGt0cywKKwkJICBwZGV2LT5zdGF0cy5wdWIudHguZHJvcHBlZC50YXJnZXRfZGlzY2FyZC5ieXRlcywKKwkJICBwZGV2LT5zdGF0cy5wdWIudHguZHJvcHBlZC5ub19hY2sucGt0cywKKwkJICBwZGV2LT5zdGF0cy5wdWIudHguZHJvcHBlZC5ub19hY2suYnl0ZXMpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiVHggY29tcGxldGlvbiBwZXIgaW50ZXJydXB0OlxuIgorCQkgICJTaW5nbGUgUGFja2V0ICAlZFxuIgorCQkgICIgMi0xMCBQYWNrZXRzICAlZFxuIgorCQkgICIxMS0yMCBQYWNrZXRzICAlZFxuIgorCQkgICIyMS0zMCBQYWNrZXRzICAlZFxuIgorCQkgICIzMS00MCBQYWNrZXRzICAlZFxuIgorCQkgICI0MS01MCBQYWNrZXRzICAlZFxuIgorCQkgICI1MS02MCBQYWNrZXRzICAlZFxuIgorCQkgICIgIDYwKyBQYWNrZXRzICAlZFxuIiwKKwkJICBwZGV2LT5zdGF0cy5wdWIudHguY29tcF9oaXN0b2dyYW0ucGt0c18xLAorCQkgIHBkZXYtPnN0YXRzLnB1Yi50eC5jb21wX2hpc3RvZ3JhbS5wa3RzXzJfMTAsCisJCSAgcGRldi0+c3RhdHMucHViLnR4LmNvbXBfaGlzdG9ncmFtLnBrdHNfMTFfMjAsCisJCSAgcGRldi0+c3RhdHMucHViLnR4LmNvbXBfaGlzdG9ncmFtLnBrdHNfMjFfMzAsCisJCSAgcGRldi0+c3RhdHMucHViLnR4LmNvbXBfaGlzdG9ncmFtLnBrdHNfMzFfNDAsCisJCSAgcGRldi0+c3RhdHMucHViLnR4LmNvbXBfaGlzdG9ncmFtLnBrdHNfNDFfNTAsCisJCSAgcGRldi0+c3RhdHMucHViLnR4LmNvbXBfaGlzdG9ncmFtLnBrdHNfNTFfNjAsCisJCSAgcGRldi0+c3RhdHMucHViLnR4LmNvbXBfaGlzdG9ncmFtLnBrdHNfNjFfcGx1cyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICIgIHJ4OiAlbGxkIHBwZHVzLCAlbGxkIG1wZHVzLCAlbGxkIG1zZHVzLCAlbGxkIGJ5dGVzLCAlbGxkIGVycnMiLAorCQkgIHBkZXYtPnN0YXRzLnByaXYucngubm9ybWFsLnBwZHVzLAorCQkgIHBkZXYtPnN0YXRzLnByaXYucngubm9ybWFsLm1wZHVzLAorCQkgIHBkZXYtPnN0YXRzLnB1Yi5yeC5kZWxpdmVyZWQucGt0cywKKwkJICBwZGV2LT5zdGF0cy5wdWIucnguZGVsaXZlcmVkLmJ5dGVzLAorCQkgIHBkZXYtPnN0YXRzLnByaXYucnguZXJyLm1wZHVfYmFkKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiICBmd2QgdG8gc3RhY2sgJWQsIGZ3ZCB0byBmdyAlZCwgZndkIHRvIHN0YWNrICYgZncgICVkXG4iLAorCQkgIHBkZXYtPnN0YXRzLnB1Yi5yeC5pbnRyYV9ic3NfZndkLnBhY2tldHNfc3RhY2ssCisJCSAgcGRldi0+c3RhdHMucHViLnJ4LmludHJhX2Jzc19md2QucGFja2V0c19md2QsCisJCSAgcGRldi0+c3RhdHMucHViLnJ4LmludHJhX2Jzc19md2QucGFja2V0c19zdGFja19uX2Z3ZCk7Cit9CisKK3ZvaWQgb2xfdHhyeF9zdGF0c19jbGVhcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYpCit7CisJY2RmX21lbV96ZXJvKCZwZGV2LT5zdGF0cywgc2l6ZW9mKHBkZXYtPnN0YXRzKSk7Cit9CisKKyNpZiBkZWZpbmVkKEVOQUJMRV9UWFJYX1BST1RfQU5BTFlaRSkKKwordm9pZCBvbF90eHJ4X3Byb3RfYW5zX2Rpc3BsYXkob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KQoreworCW9sX3R4cnhfcHJvdF9hbl9kaXNwbGF5KHBkZXYtPnByb3RfYW5fdHhfc2VudCk7CisJb2xfdHhyeF9wcm90X2FuX2Rpc3BsYXkocGRldi0+cHJvdF9hbl9yeF9zZW50KTsKK30KKworI2VuZGlmIC8qIEVOQUJMRV9UWFJYX1BST1RfQU5BTFlaRSAqLworCisjaWZkZWYgUUNBX1NVUFBPUlRfUEVFUl9EQVRBX1JYX1JTU0kKK2ludDE2X3Qgb2xfdHhyeF9wZWVyX3Jzc2kob2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyKQoreworCXJldHVybiAocGVlci0+cnNzaV9kYm0gPT0gSFRUX1JTU0lfSU5WQUxJRCkgPworCSAgICAgICBPTF9UWFJYX1JTU0lfSU5WQUxJRCA6IHBlZXItPnJzc2lfZGJtOworfQorI2VuZGlmIC8qICNpZmRlZiBRQ0FfU1VQUE9SVF9QRUVSX0RBVEFfUlhfUlNTSSAqLworCisjaWZkZWYgUUNBX0VOQUJMRV9PTF9UWFJYX1BFRVJfU1RBVFMKK0FfU1RBVFVTCitvbF90eHJ4X3BlZXJfc3RhdHNfY29weShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCQlvbF90eHJ4X3BlZXJfaGFuZGxlIHBlZXIsIG9sX3R4cnhfcGVlcl9zdGF0c190ICpzdGF0cykKK3sKKwljZGZfYXNzZXJ0KHBkZXYgJiYgcGVlciAmJiBzdGF0cyk7CisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+cGVlcl9zdGF0X211dGV4KTsKKwljZGZfbWVtX2NvcHkoc3RhdHMsICZwZWVyLT5zdGF0cywgc2l6ZW9mKCpzdGF0cykpOworCWNkZl9zcGluX3VubG9ja19iaCgmcGRldi0+cGVlcl9zdGF0X211dGV4KTsKKwlyZXR1cm4gQV9PSzsKK30KKyNlbmRpZiAvKiBRQ0FfRU5BQkxFX09MX1RYUlhfUEVFUl9TVEFUUyAqLworCit2b2lkIG9sX3ZkZXZfcnhfc2V0X2ludHJhYnNzX2Z3ZChvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsIGJvb2wgdmFsKQoreworCWlmIChOVUxMID09IHZkZXYpCisJCXJldHVybjsKKworCXZkZXYtPmRpc2FibGVfaW50cmFic3NfZndkID0gdmFsOworfQorCisjaWZkZWYgUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wKKworLyoqCisgKiBvbF90eHJ4X2dldF92ZGV2X2Zyb21fc3RhX2lkKCkgLSBnZXQgdmRldiBmcm9tIHN0YV9pZAorICogQHN0YV9pZDogc3RhX2lkCisgKgorICogUmV0dXJuOiB2ZGV2IGhhbmRsZQorICogICAgICAgICAgICBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworc3RhdGljIG9sX3R4cnhfdmRldl9oYW5kbGUgb2xfdHhyeF9nZXRfdmRldl9mcm9tX3N0YV9pZCh1aW50OF90IHN0YV9pZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIgPSBOVUxMOworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiA9IE5VTEw7CisKKwlpZiAoc3RhX2lkID49IFdMQU5fTUFYX1NUQV9DT1VOVCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiSW52YWxpZCBzdGEgaWQgcGFzc2VkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlpZiAoIXBkZXYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJIlBERVYgbm90IGZvdW5kIGZvciBzdGFfaWQgWyVkXSIsIHN0YV9pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBlZXIgPSBvbF90eHJ4X3BlZXJfZmluZF9ieV9sb2NhbF9pZChwZGV2LCBzdGFfaWQpOworCisJaWYgKCFwZWVyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJQRUVSIFslZF0gbm90IGZvdW5kIiwgc3RhX2lkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHBlZXItPnZkZXY7Cit9CisKKy8qKgorICogb2xfdHhyeF9yZWdpc3Rlcl90eF9mbG93X2NvbnRyb2woKSAtIHJlZ2lzdGVyIHR4IGZsb3cgY29udHJvbCBjYWxsYmFjaworICogQHZkZXZfaWQ6IHZkZXZfaWQKKyAqIEBmbG93Q29udHJvbDogZmxvdyBjb250cm9sIGNhbGxiYWNrCisgKiBAb3NpZl9mY19jdHg6IGNhbGxiYWNrIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCBvbF90eHJ4X3JlZ2lzdGVyX3R4X2Zsb3dfY29udHJvbCAodWludDhfdCB2ZGV2X2lkLAorCW9sX3R4cnhfdHhfZmxvd19jb250cm9sX2ZwIGZsb3dDb250cm9sLAorCXZvaWQgKm9zaWZfZmNfY3R4KQoreworCW9sX3R4cnhfdmRldl9oYW5kbGUgdmRldiA9IG9sX3R4cnhfZ2V0X3ZkZXZfZnJvbV92ZGV2X2lkKHZkZXZfaWQpOworCWlmIChOVUxMID09IHZkZXYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJIiVzOiBJbnZhbGlkIHZkZXZfaWQgJWQiLCBfX2Z1bmNfXywgdmRldl9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNkZl9zcGluX2xvY2tfYmgoJnZkZXYtPmZsb3dfY29udHJvbF9sb2NrKTsKKwl2ZGV2LT5vc2lmX2Zsb3dfY29udHJvbF9jYiA9IGZsb3dDb250cm9sOworCXZkZXYtPm9zaWZfZmNfY3R4ID0gb3NpZl9mY19jdHg7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ2ZGV2LT5mbG93X2NvbnRyb2xfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogb2xfdHhyeF9kZV9yZWdpc3Rlcl90eF9mbG93X2NvbnRyb2xfY2IoKSAtIGRlcmVnaXN0ZXIgdHggZmxvdyBjb250cm9sIGNhbGxiYWNrCisgKiBAdmRldl9pZDogdmRldl9pZAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCBvbF90eHJ4X2RlcmVnaXN0ZXJfdHhfZmxvd19jb250cm9sX2NiKHVpbnQ4X3QgdmRldl9pZCkKK3sKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYgPSBvbF90eHJ4X2dldF92ZGV2X2Zyb21fdmRldl9pZCh2ZGV2X2lkKTsKKwlpZiAoTlVMTCA9PSB2ZGV2KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiJXM6IEludmFsaWQgdmRldl9pZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2RmX3NwaW5fbG9ja19iaCgmdmRldi0+Zmxvd19jb250cm9sX2xvY2spOworCXZkZXYtPm9zaWZfZmxvd19jb250cm9sX2NiID0gTlVMTDsKKwl2ZGV2LT5vc2lmX2ZjX2N0eCA9IE5VTEw7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ2ZGV2LT5mbG93X2NvbnRyb2xfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogb2xfdHhyeF9nZXRfdHhfcmVzb3VyY2UoKSAtIGlmIHR4IHJlc291cmNlIGxlc3MgdGhhbiBsb3dfd2F0ZXJtYXJrCisgKiBAc3RhX2lkOiBzdGEgaWQKKyAqIEBsb3dfd2F0ZXJtYXJrOiBsb3cgd2F0ZXJtYXJrCisgKiBAaGlnaF93YXRlcm1hcmtfb2Zmc2V0OiBoaWdoIHdhdGVybWFyayBvZmZzZXQgdmFsdWUKKyAqCisgKiBSZXR1cm46IHRydWUvZmFsc2UKKyAqLworYm9vbAorb2xfdHhyeF9nZXRfdHhfcmVzb3VyY2UodWludDhfdCBzdGFfaWQsCisJCQl1bnNpZ25lZCBpbnQgbG93X3dhdGVybWFyaywKKwkJCXVuc2lnbmVkIGludCBoaWdoX3dhdGVybWFya19vZmZzZXQpCit7CisJb2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2ID0gb2xfdHhyeF9nZXRfdmRldl9mcm9tX3N0YV9pZChzdGFfaWQpOworCWlmIChOVUxMID09IHZkZXYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJIiVzOiBJbnZhbGlkIHN0YV9pZCAlZCIsIF9fZnVuY19fLCBzdGFfaWQpOworCQkvKiBSZXR1cm4gdHJ1ZSBzbyBjYWxsZXIgZG8gbm90IHVuZGVyc3RhbmQgdGhhdCByZXNvdXJjZQorCQkgKiBpcyBsZXNzIHRoYW4gbG93X3dhdGVybWFyay4KKwkJICogc3RhX2lkIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGluIG9sX3R4X3NlbmRfZGF0YV9mcmFtZQorCQkgKiBhbmQgaWYgc3RhX2lkIGlzIG5vdCByZWdpc3RlcmVkIHRoZW4gaG9zdCB3aWxsIGRyb3AKKwkJICogcGFja2V0LgorCQkgKi8KKwkJcmV0dXJuIHRydWU7CisJfQorCisJY2RmX3NwaW5fbG9ja19iaCgmdmRldi0+cGRldi0+dHhfbXV0ZXgpOworCWlmICh2ZGV2LT5wZGV2LT50eF9kZXNjLm51bV9mcmVlIDwgKHVpbnQxNl90KSBsb3dfd2F0ZXJtYXJrKSB7CisJCXZkZXYtPnR4X2ZsX2x3bSA9ICh1aW50MTZfdCkgbG93X3dhdGVybWFyazsKKwkJdmRldi0+dHhfZmxfaHdtID0KKwkJCSh1aW50MTZfdCkgKGxvd193YXRlcm1hcmsgKyBoaWdoX3dhdGVybWFya19vZmZzZXQpOworCQkvKiBOb3QgZW5vdWdoIGZyZWUgcmVzb3VyY2UsIHN0b3AgVFggT1MgUSAqLworCQljZGZfYXRvbWljX3NldCgmdmRldi0+b3NfcV9wYXVzZWQsIDEpOworCQljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPnBkZXYtPnR4X211dGV4KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPnBkZXYtPnR4X211dGV4KTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBvbF90eHJ4X2xsX3NldF90eF9wYXVzZV9xX2RlcHRoKCkgLSBzZXQgcGF1c2UgcXVldWUgZGVwdGgKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAcGF1c2VfcV9kZXB0aDogcGF1c2UgcXVldWUgZGVwdGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQKK29sX3R4cnhfbGxfc2V0X3R4X3BhdXNlX3FfZGVwdGgodWludDhfdCB2ZGV2X2lkLCBpbnQgcGF1c2VfcV9kZXB0aCkKK3sKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYgPSBvbF90eHJ4X2dldF92ZGV2X2Zyb21fdmRldl9pZCh2ZGV2X2lkKTsKKwlpZiAoTlVMTCA9PSB2ZGV2KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSIlczogSW52YWxpZCB2ZGV2X2lkICVkIiwgX19mdW5jX18sIHZkZXZfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZ2ZGV2LT5sbF9wYXVzZS5tdXRleCk7CisJdmRldi0+bGxfcGF1c2UubWF4X3FfZGVwdGggPSBwYXVzZV9xX2RlcHRoOworCWNkZl9zcGluX3VubG9ja19iaCgmdmRldi0+bGxfcGF1c2UubXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogb2xfdHhyeF9mbG93X2NvbnRyb2xfY2IoKSAtIGNhbGwgb3NpZiBmbG93IGNvbnRyb2wgY2FsbGJhY2sKKyAqIEB2ZGV2OiB2ZGV2IGhhbmRsZQorICogQHR4X3Jlc3VtZTogdHggcmVzdW1lIGZsYWcKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworaW5saW5lIHZvaWQgb2xfdHhyeF9mbG93X2NvbnRyb2xfY2Iob2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LAorCWJvb2wgdHhfcmVzdW1lKQoreworCWNkZl9zcGluX2xvY2tfYmgoJnZkZXYtPmZsb3dfY29udHJvbF9sb2NrKTsKKwlpZiAoKHZkZXYtPm9zaWZfZmxvd19jb250cm9sX2NiKSAmJiAodmRldi0+b3NpZl9mY19jdHgpKQorCQl2ZGV2LT5vc2lmX2Zsb3dfY29udHJvbF9jYih2ZGV2LT5vc2lmX2ZjX2N0eCwgdHhfcmVzdW1lKTsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPmZsb3dfY29udHJvbF9sb2NrKTsKKworCXJldHVybjsKK30KKyNlbmRpZiAvKiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCAqLworCisjaWZkZWYgSVBBX09GRkxPQUQKK3ZvaWQKK29sX3R4cnhfaXBhX3VjX2dldF9yZXNvdXJjZShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsCisJCQkgICAgdWludDMyX3QgKmNlX3NyX2Jhc2VfcGFkZHIsCisJCQkgICAgdWludDMyX3QgKmNlX3NyX3Jpbmdfc2l6ZSwKKwkJCSAgICBjZGZfZG1hX2FkZHJfdCAqY2VfcmVnX3BhZGRyLAorCQkJICAgIHVpbnQzMl90ICp0eF9jb21wX3JpbmdfYmFzZV9wYWRkciwKKwkJCSAgICB1aW50MzJfdCAqdHhfY29tcF9yaW5nX3NpemUsCisJCQkgICAgdWludDMyX3QgKnR4X251bV9hbGxvY19idWZmZXIsCisJCQkgICAgdWludDMyX3QgKnJ4X3JkeV9yaW5nX2Jhc2VfcGFkZHIsCisJCQkgICAgdWludDMyX3QgKnJ4X3JkeV9yaW5nX3NpemUsCisJCQkgICAgdWludDMyX3QgKnJ4X3Byb2NfZG9uZV9pZHhfcGFkZHIpCit7CisJaHR0X2lwYV91Y19nZXRfcmVzb3VyY2UocGRldi0+aHR0X3BkZXYsCisJCQkJY2Vfc3JfYmFzZV9wYWRkciwKKwkJCQljZV9zcl9yaW5nX3NpemUsCisJCQkJY2VfcmVnX3BhZGRyLAorCQkJCXR4X2NvbXBfcmluZ19iYXNlX3BhZGRyLAorCQkJCXR4X2NvbXBfcmluZ19zaXplLAorCQkJCXR4X251bV9hbGxvY19idWZmZXIsCisJCQkJcnhfcmR5X3JpbmdfYmFzZV9wYWRkciwKKwkJCQlyeF9yZHlfcmluZ19zaXplLCByeF9wcm9jX2RvbmVfaWR4X3BhZGRyKTsKK30KKwordm9pZAorb2xfdHhyeF9pcGFfdWNfc2V0X2Rvb3JiZWxsX3BhZGRyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCQkgIHVpbnQzMl90IGlwYV90eF91Y19kb29yYmVsbF9wYWRkciwKKwkJCQkgIHVpbnQzMl90IGlwYV9yeF91Y19kb29yYmVsbF9wYWRkcikKK3sKKwlodHRfaXBhX3VjX3NldF9kb29yYmVsbF9wYWRkcihwZGV2LT5odHRfcGRldiwKKwkJCQkgICAgICBpcGFfdHhfdWNfZG9vcmJlbGxfcGFkZHIsCisJCQkJICAgICAgaXBhX3J4X3VjX2Rvb3JiZWxsX3BhZGRyKTsKK30KKwordm9pZAorb2xfdHhyeF9pcGFfdWNfc2V0X2FjdGl2ZShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIGJvb2wgdWNfYWN0aXZlLCBib29sIGlzX3R4KQoreworCWh0dF9oMnRfaXBhX3VjX3NldF9hY3RpdmUocGRldi0+aHR0X3BkZXYsIHVjX2FjdGl2ZSwgaXNfdHgpOworfQorCisvKioKKyAqIG9sX3R4cnhfaXBhX3VjX2Z3X29wX2V2ZW50X2hhbmRsZXIoKSAtIG9wY29kZSBldmVudCBoYW5kbGVyCisgKiBAY29udGV4dDogcGRldiBjb250ZXh0CisgKiBAcnhwa3Q6IHJlY2VpdmVkIHBhY2tldAorICogQHN0YWlkOiBwZWVyIGlkCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgb2xfdHhyeF9pcGFfdWNfZndfb3BfZXZlbnRfaGFuZGxlcih2b2lkICpjb250ZXh0LAorCQkJCQl2b2lkICpyeHBrdCwKKwkJCQkJdWludDE2X3Qgc3RhaWQpCit7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2ID0gKG9sX3R4cnhfcGRldl9oYW5kbGUpY29udGV4dDsKKworCWlmIChjZGZfdW5saWtlbHkoIXBkZXYpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICIlczogSW52YWxpZCBjb250ZXh0IiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHBkZXYtPmlwYV91Y19vcF9jYikKKwkJcGRldi0+aXBhX3VjX29wX2NiKHJ4cGt0LCBwZGV2LT5vc2lmX2Rldik7CisJZWxzZQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAiJXM6IGlwYV91Y19vcF9jYiBOVUxMIiwgX19mdW5jX18pOworfQorCisKK3ZvaWQgb2xfdHhyeF9pcGFfdWNfb3BfcmVzcG9uc2Uob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LCB1aW50OF90ICpvcF9tc2cpCit7CisJcF9jZHNfc2NoZWRfY29udGV4dCBzY2hlZF9jdHggPSBnZXRfY2RzX3NjaGVkX2N0eHQoKTsKKwlzdHJ1Y3QgY2RzX29sX3J4X3BrdCAqcGt0OworCisJaWYgKGNkZl91bmxpa2VseSghc2NoZWRfY3R4KSkKKwkJcmV0dXJuOworCisJcGt0ID0gY2RzX2FsbG9jX29sX3J4X3BrdChzY2hlZF9jdHgpOworCWlmIChjZGZfdW5saWtlbHkoIXBrdCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBjb250ZXh0IiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcGt0LT5jYWxsYmFjayA9IChjZHNfb2xfcnhfdGhyZWFkX2NiKSBvbF90eHJ4X2lwYV91Y19md19vcF9ldmVudF9oYW5kbGVyOworCXBrdC0+Y29udGV4dCA9IHBkZXY7CisJcGt0LT5SeHBrdCA9ICh2b2lkICopb3BfbXNnOworCXBrdC0+c3RhSWQgPSAwOworCWNkc19pbmRpY2F0ZV9yeHBrdChzY2hlZF9jdHgsIHBrdCk7Cit9CisKK3ZvaWQgb2xfdHhyeF9pcGFfdWNfcmVnaXN0ZXJfb3BfY2Iob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJCSAgIGlwYV91Y19vcF9jYl90eXBlIG9wX2NiLCB2b2lkICpvc2lmX2RldikKK3sKKwlwZGV2LT5pcGFfdWNfb3BfY2IgPSBvcF9jYjsKKwlwZGV2LT5vc2lmX2RldiA9IG9zaWZfZGV2OworfQorCit2b2lkIG9sX3R4cnhfaXBhX3VjX2dldF9zdGF0KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldikKK3sKKwlodHRfaDJ0X2lwYV91Y19nZXRfc3RhdHMocGRldi0+aHR0X3BkZXYpOworfQorI2VuZGlmIC8qIElQQV9VQ19PRkZMT0FEICovCisKK3ZvaWQgb2xfdHhyeF9kaXNwbGF5X3N0YXRzKHVpbnQxNl90IHZhbHVlKQoreworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldjsKKworCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlpZiAoIXBkZXYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJIiVzOiBwZGV2IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSBXTEFOX1RYUlhfU1RBVFM6CisJCW9sX3R4cnhfc3RhdHNfZGlzcGxheShwZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX1RYUlhfVFNPX1NUQVRTOgorI2lmIGRlZmluZWQoRkVBVFVSRV9UU08pICYmIGRlZmluZWQoRkVBVFVSRV9UU09fREVCVUcpCisJCW9sX3R4cnhfc3RhdHNfZGlzcGxheV90c28ocGRldik7CisjZWxzZQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSIlczogVFNPIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0RVTVBfVFhfRkxPV19QT09MX0lORk86CisJCW9sX3R4X2R1bXBfZmxvd19wb29sX2luZm8oKTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX1RYUlhfREVTQ19TVEFUUzoKKwkJY2RmX25idWZfdHhfZGVzY19jb3VudF9kaXNwbGF5KCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJIiVzOiBVbmtub3duIHZhbHVlIiwgX19mdW5jX18pOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgb2xfdHhyeF9jbGVhcl9zdGF0cyh1aW50MTZfdCB2YWx1ZSkKK3sKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXY7CisKKwlwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJaWYgKCFwZGV2KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSIlczogcGRldiBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgV0xBTl9UWFJYX1NUQVRTOgorCQlvbF90eHJ4X3N0YXRzX2NsZWFyKHBkZXYpOworCQlicmVhazsKKwljYXNlIFdMQU5fRFVNUF9UWF9GTE9XX1BPT0xfSU5GTzoKKwkJb2xfdHhfY2xlYXJfZmxvd19wb29sX3N0YXRzKCk7CisJCWJyZWFrOworCWNhc2UgV0xBTl9UWFJYX0RFU0NfU1RBVFM6CisJCWNkZl9uYnVmX3R4X2Rlc2NfY291bnRfY2xlYXIoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkiJXM6IFVua25vd24gdmFsdWUiLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBvbF9yeF9kYXRhX2NiKCkgLSBkYXRhIHJ4IGNhbGxiYWNrCisgKiBAcGVlcjogcGVlcgorICogQGJ1Zl9saXN0OiBidWZmZXIgbGlzdAorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBvbF9yeF9kYXRhX2NiKHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJCSAgY2RmX25idWZfdCBidWZfbGlzdCkKK3sKKwl2b2lkICpjZHNfY3R4ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworCWNkZl9uYnVmX3QgYnVmLCBuZXh0X2J1ZjsKKwlDREZfU1RBVFVTIHJldDsKKwlvbF9yeF9jYWxsYmFja19mcCBkYXRhX3J4ID0gTlVMTDsKKworCWlmIChjZGZfdW5saWtlbHkoIWNkc19jdHgpKQorCQlnb3RvIGZyZWVfYnVmOworCisJY2RmX3NwaW5fbG9ja19iaCgmcGVlci0+cGVlcl9pbmZvX2xvY2spOworCWlmIChjZGZfdW5saWtlbHkoIShwZWVyLT5zdGF0ZSA+PSBvbF90eHJ4X3BlZXJfc3RhdGVfY29ubikpKSB7CisJCWNkZl9zcGluX3VubG9ja19iaCgmcGVlci0+cGVlcl9pbmZvX2xvY2spOworCQlnb3RvIGZyZWVfYnVmOworCX0KKwlkYXRhX3J4ID0gcGVlci0+b3NpZl9yeDsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBlZXItPnBlZXJfaW5mb19sb2NrKTsKKworCWNkZl9zcGluX2xvY2tfYmgoJnBlZXItPmJ1ZnFfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZwZWVyLT5jYWNoZWRfYnVmcSkpIHsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZWVyLT5idWZxX2xvY2spOworCQkvKiBGbHVzaCB0aGUgY2FjaGVkIGZyYW1lcyB0byBIREQgYmVmb3JlIHBhc3NpbmcgbmV3IHJ4IGZyYW1lICovCisJCW9sX3R4cnhfZmx1c2hfcnhfZnJhbWVzKHBlZXIsIDApOworCX0gZWxzZQorCQljZGZfc3Bpbl91bmxvY2tfYmgoJnBlZXItPmJ1ZnFfbG9jayk7CisKKwlidWYgPSBidWZfbGlzdDsKKwl3aGlsZSAoYnVmKSB7CisJCW5leHRfYnVmID0gY2RmX25idWZfcXVldWVfbmV4dChidWYpOworCQljZGZfbmJ1Zl9zZXRfbmV4dChidWYsIE5VTEwpOyAgIC8qIEFkZCBOVUxMIHRlcm1pbmF0b3IgKi8KKwkJcmV0ID0gZGF0YV9yeChjZHNfY3R4LCBidWYsIHBlZXItPmxvY2FsX2lkKTsKKwkJaWYgKHJldCAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsICJGcmFtZSBSeCB0byBIREQgZmFpbGVkIik7CisJCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJCX0KKwkJYnVmID0gbmV4dF9idWY7CisJfQorCXJldHVybjsKKworZnJlZV9idWY6CisJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX1dBUk4sICIlczpEcm9wcGluZyBmcmFtZXMiLCBfX2Z1bmNfXyk7CisJYnVmID0gYnVmX2xpc3Q7CisJd2hpbGUgKGJ1ZikgeworCQluZXh0X2J1ZiA9IGNkZl9uYnVmX3F1ZXVlX25leHQoYnVmKTsKKwkJY2RmX25idWZfZnJlZShidWYpOworCQlidWYgPSBuZXh0X2J1ZjsKKwl9Cit9CisKKy8qKgorICogb2xfcnhfZGF0YV9wcm9jZXNzKCkgLSBwcm9jZXNzIHJ4IGZyYW1lCisgKiBAcGVlcjogcGVlcgorICogQHJ4X2J1Zl9saXN0OiByeCBidWZmZXIgbGlzdAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIG9sX3J4X2RhdGFfcHJvY2VzcyhzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJCQljZGZfbmJ1Zl90IHJ4X2J1Zl9saXN0KQoreworCS8qIEZpcm13YXJlIGRhdGEgcGF0aCBhY3RpdmUgcmVzcG9uc2Ugd2lsbCB1c2Ugc2hpbSBSWCB0aHJlYWQKKwkgKiBUMkggTVNHIHJ1bm5pbmcgb24gU0lSUSBjb250ZXh0LAorCSAqIElQQSBrZXJuZWwgbW9kdWxlIEFQSSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBTSVJRIENUWFQgKi8KKwljZGZfbmJ1Zl90IGJ1ZiwgbmV4dF9idWY7CisJb2xfcnhfY2FsbGJhY2tfZnAgZGF0YV9yeCA9IE5VTEw7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisKKwlpZiAoKCFwZWVyKSB8fCAoIXBkZXYpKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsICJwZWVyL3BkZXYgaXMgTlVMTCIpOworCQlnb3RvIGRyb3BfcnhfYnVmOworCX0KKworCWNkZl9zcGluX2xvY2tfYmgoJnBlZXItPnBlZXJfaW5mb19sb2NrKTsKKwlpZiAocGVlci0+c3RhdGUgPj0gb2xfdHhyeF9wZWVyX3N0YXRlX2Nvbm4pCisJCWRhdGFfcnggPSBwZWVyLT5vc2lmX3J4OworCWNkZl9zcGluX3VubG9ja19iaCgmcGVlci0+cGVlcl9pbmZvX2xvY2spOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIGRhdGEgZnJhbWUgZnJvbSBwZWVyIGJlZm9yZSB0aGUgcGVlciBpcworCSAqIHJlZ2lzdGVyZWQgZm9yIGRhdGEgc2VydmljZSwgZW5xdWV1ZSB0aGVtIG9uIHRvIHBlbmRpbmcgcXVldWUKKwkgKiB3aGljaCB3aWxsIGJlIGZsdXNoZWQgdG8gSEREIG9uY2UgdGhhdCBzdGF0aW9uIGlzIHJlZ2lzdGVyZWQuCisJICovCisJaWYgKCFkYXRhX3J4KSB7CisJCXN0cnVjdCBvbF9yeF9jYWNoZWRfYnVmICpjYWNoZV9idWY7CisJCWJ1ZiA9IHJ4X2J1Zl9saXN0OworCQl3aGlsZSAoYnVmKSB7CisJCQluZXh0X2J1ZiA9IGNkZl9uYnVmX3F1ZXVlX25leHQoYnVmKTsKKwkJCWNhY2hlX2J1ZiA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqY2FjaGVfYnVmKSk7CisJCQlpZiAoIWNhY2hlX2J1ZikgeworCQkJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmIHRvIGNhY2hlIHRoZSByeCBmcmFtZXMiKTsKKwkJCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJCQl9IGVsc2UgeworCQkJCS8qIEFkZCBOVUxMIHRlcm1pbmF0b3IgKi8KKwkJCQljZGZfbmJ1Zl9zZXRfbmV4dChidWYsIE5VTEwpOworCQkJCWNhY2hlX2J1Zi0+YnVmID0gYnVmOworCQkJCWNkZl9zcGluX2xvY2tfYmgoJnBlZXItPmJ1ZnFfbG9jayk7CisJCQkJbGlzdF9hZGRfdGFpbCgmY2FjaGVfYnVmLT5saXN0LAorCQkJCQkgICAgICAmcGVlci0+Y2FjaGVkX2J1ZnEpOworCQkJCWNkZl9zcGluX3VubG9ja19iaCgmcGVlci0+YnVmcV9sb2NrKTsKKwkJCX0KKwkJCWJ1ZiA9IG5leHRfYnVmOworCQl9CisJfSBlbHNlIHsKKyNpZmRlZiBRQ0FfQ09ORklHX1NNUAorCQkvKgorCQkgKiBJZiB0aGUga2VybmVsIGlzIFNNUCwgc2NoZWR1bGUgcnggdGhyZWFkIHRvCisJCSAqIGJldHRlciB1c2UgbXVsdGljb3Jlcy4KKwkJICovCisJCWlmICghb2xfY2ZnX2lzX3J4X3RocmVhZF9lbmFibGVkKHBkZXYtPmN0cmxfcGRldikpIHsKKwkJCW9sX3J4X2RhdGFfY2IocGVlciwgcnhfYnVmX2xpc3QpOworCQl9IGVsc2UgeworCQkJcF9jZHNfc2NoZWRfY29udGV4dCBzY2hlZF9jdHggPQorCQkJCWdldF9jZHNfc2NoZWRfY3R4dCgpOworCQkJc3RydWN0IGNkc19vbF9yeF9wa3QgKnBrdDsKKworCQkJaWYgKHVubGlrZWx5KCFzY2hlZF9jdHgpKQorCQkJCWdvdG8gZHJvcF9yeF9idWY7CisKKwkJCXBrdCA9IGNkc19hbGxvY19vbF9yeF9wa3Qoc2NoZWRfY3R4KTsKKwkJCWlmICghcGt0KSB7CisJCQkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJCQkJIk5vIGF2YWlsYWJsZSBSeCBtZXNzYWdlIGJ1ZmZlciIpOworCQkJCWdvdG8gZHJvcF9yeF9idWY7CisJCQl9CisJCQlwa3QtPmNhbGxiYWNrID0gKGNkc19vbF9yeF90aHJlYWRfY2IpCisJCQkJCW9sX3J4X2RhdGFfY2I7CisJCQlwa3QtPmNvbnRleHQgPSAodm9pZCAqKXBlZXI7CisJCQlwa3QtPlJ4cGt0ID0gKHZvaWQgKilyeF9idWZfbGlzdDsKKwkJCXBrdC0+c3RhSWQgPSBwZWVyLT5sb2NhbF9pZDsKKwkJCWNkc19pbmRpY2F0ZV9yeHBrdChzY2hlZF9jdHgsIHBrdCk7CisJCX0KKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUUNBX0NPTkZJR19TTVAgKi8KKwkJb2xfcnhfZGF0YV9jYihwZWVyLCByeF9idWZfbGlzdCwgMCk7CisjZW5kaWYgLyogUUNBX0NPTkZJR19TTVAgKi8KKwl9CisKKwlyZXR1cm47CisKK2Ryb3BfcnhfYnVmOgorCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsICJEcm9wcGluZyByeCBwYWNrZXRzIik7CisJYnVmID0gcnhfYnVmX2xpc3Q7CisJd2hpbGUgKGJ1ZikgeworCQluZXh0X2J1ZiA9IGNkZl9uYnVmX3F1ZXVlX25leHQoYnVmKTsKKwkJY2RmX25idWZfZnJlZShidWYpOworCQlidWYgPSBuZXh0X2J1ZjsKKwl9Cit9CisKKy8qKgorICogb2xfdHhyeF9yZWdpc3Rlcl9wZWVyKCkgLSByZWdpc3RlciBwZWVyCisgKiBAcnhjYjogcnggY2FsbGJhY2sKKyAqIEBzdGFfZGVzYzogc3RhIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm46IENERiBTdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBvbF90eHJ4X3JlZ2lzdGVyX3BlZXIob2xfcnhfY2FsbGJhY2tfZnAgcnhjYiwKKwkJCQkgc3RydWN0IG9sX3R4cnhfZGVzY190eXBlICpzdGFfZGVzYykKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJdW5pb24gb2xfdHhyeF9wZWVyX3VwZGF0ZV9wYXJhbV90IHBhcmFtOworCXN0cnVjdCBwcml2YWN5X2V4ZW1wdGlvbiBwcml2YWN5X2ZpbHRlcjsKKworCWlmICghcGRldikgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLCAiUGRldiBpcyBOVUxMIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJaWYgKHN0YV9kZXNjLT5zdGFfaWQgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsICJJbnZhbGlkIHN0YSBpZCA6JWQiLAorCQkJIHN0YV9kZXNjLT5zdGFfaWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCXBlZXIgPSBvbF90eHJ4X3BlZXJfZmluZF9ieV9sb2NhbF9pZChwZGV2LCBzdGFfZGVzYy0+c3RhX2lkKTsKKwlpZiAoIXBlZXIpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZwZWVyLT5wZWVyX2luZm9fbG9jayk7CisJcGVlci0+b3NpZl9yeCA9IHJ4Y2I7CisJcGVlci0+c3RhdGUgPSBvbF90eHJ4X3BlZXJfc3RhdGVfY29ubjsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBlZXItPnBlZXJfaW5mb19sb2NrKTsKKworCXBhcmFtLnFvc19jYXBhYmxlID0gc3RhX2Rlc2MtPmlzX3Fvc19lbmFibGVkOworCW9sX3R4cnhfcGVlcl91cGRhdGUocGVlci0+dmRldiwgcGVlci0+bWFjX2FkZHIucmF3LCAmcGFyYW0sCisJCQkgICAgb2xfdHhyeF9wZWVyX3VwZGF0ZV9xb3NfY2FwYWJsZSk7CisKKwlpZiAoc3RhX2Rlc2MtPmlzX3dhcGlfc3VwcG9ydGVkKSB7CisJCS8qUHJpdmFjeSBmaWx0ZXIgdG8gYWNjZXB0IHVuZW5jcnlwdGVkIFdBSSBmcmFtZXMgKi8KKwkJcHJpdmFjeV9maWx0ZXIuZXRoZXJfdHlwZSA9IEVUSEVSVFlQRV9XQUk7CisJCXByaXZhY3lfZmlsdGVyLmZpbHRlcl90eXBlID0gUFJJVkFDWV9GSUxURVJfQUxXQVlTOworCQlwcml2YWN5X2ZpbHRlci5wYWNrZXRfdHlwZSA9IFBSSVZBQ1lfRklMVEVSX1BBQ0tFVF9CT1RIOworCQlvbF90eHJ4X3NldF9wcml2YWN5X2ZpbHRlcnMocGVlci0+dmRldiwgJnByaXZhY3lfZmlsdGVyLCAxKTsKKwl9CisKKwlvbF90eHJ4X2ZsdXNoX3J4X2ZyYW1lcyhwZWVyLCAwKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIG9sX3R4cnhfY2xlYXJfcGVlcigpIC0gY2xlYXIgcGVlcgorICogQHN0YV9pZDogc3RhIGlkCisgKgorICogUmV0dXJuOiBDREYgU3RhdHVzCisgKi8KK0NERl9TVEFUVVMgb2xfdHhyeF9jbGVhcl9wZWVyKHVpbnQ4X3Qgc3RhX2lkKQoreworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKworCWlmICghcGRldikgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLCAiJXM6IFVuYWJsZSB0byBmaW5kIHBkZXYhIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChzdGFfaWQgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsICJJbnZhbGlkIHN0YSBpZCAlZCIsIHN0YV9pZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisjaWZkZWYgUUNBX0NPTkZJR19TTVAKKwl7CisJCXBfY2RzX3NjaGVkX2NvbnRleHQgc2NoZWRfY3R4ID0gZ2V0X2Nkc19zY2hlZF9jdHh0KCk7CisJCS8qIERyb3AgcGVuZGluZyBSeCBmcmFtZXMgaW4gQ0RTICovCisJCWlmIChzY2hlZF9jdHgpCisJCQljZHNfZHJvcF9yeHBrdF9ieV9zdGFpZChzY2hlZF9jdHgsIHN0YV9pZCk7CisJfQorI2VuZGlmCisKKwlwZWVyID0gb2xfdHhyeF9wZWVyX2ZpbmRfYnlfbG9jYWxfaWQocGRldiwgc3RhX2lkKTsKKwlpZiAoIXBlZXIpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisKKwkvKiBQdXJnZSB0aGUgY2FjaGVkIHJ4IGZyYW1lIHF1ZXVlICovCisJb2xfdHhyeF9mbHVzaF9yeF9mcmFtZXMocGVlciwgMSk7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZwZWVyLT5wZWVyX2luZm9fbG9jayk7CisJcGVlci0+b3NpZl9yeCA9IE5VTEw7CisJcGVlci0+c3RhdGUgPSBvbF90eHJ4X3BlZXJfc3RhdGVfZGlzYzsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBlZXItPnBlZXJfaW5mb19sb2NrKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogb2xfdHhyeF9yZWdpc3Rlcl9vY2JfcGVlciAtIEZ1bmN0aW9uIHRvIHJlZ2lzdGVyIHRoZSBPQ0IgcGVlcgorICogQGNkc19jdHg6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBPUyBjb250ZXh0CisgKiBAbWFjX2FkZHI6IE1BQyBhZGRyZXNzIG9mIHRoZSBzZWxmIHBlZXIKKyAqIEBwZWVyX2lkOiBQb2ludGVyIHRvIHRoZSBwZWVyIElECisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgb24gZmFpbHVyZQorICovCitDREZfU1RBVFVTIG9sX3R4cnhfcmVnaXN0ZXJfb2NiX3BlZXIodm9pZCAqY2RzX2N0eCwgdWludDhfdCAqbWFjX2FkZHIsCisJCQkJICAgICB1aW50OF90ICpwZWVyX2lkKQoreworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldjsKKwlvbF90eHJ4X3BlZXJfaGFuZGxlIHBlZXI7CisKKwlpZiAoIWNkc19jdHgpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwgIiVzOiBJbnZhbGlkIGNvbnRleHQiLAorCQkJICAgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCWlmICghcGRldikgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLCAiJXM6IFVuYWJsZSB0byBmaW5kIHBkZXYhIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBlZXIgPSBvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyKHBkZXYsIG1hY19hZGRyLCBwZWVyX2lkKTsKKwlpZiAoIXBlZXIpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwgIiVzOiBVbmFibGUgdG8gZmluZCBPQ0IgcGVlciEiLAorCQkJICAgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJb2xfdHhyeF9zZXRfb2NiX3BlZXIocGRldiwgcGVlcik7CisKKwkvKiBTZXQgcGVlciBzdGF0ZSB0byBjb25uZWN0ZWQgKi8KKwlvbF90eHJ4X3BlZXJfc3RhdGVfdXBkYXRlKHBkZXYsIHBlZXItPm1hY19hZGRyLnJhdywKKwkJCQkgIG9sX3R4cnhfcGVlcl9zdGF0ZV9hdXRoKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogb2xfdHhyeF9zZXRfb2NiX3BlZXIgLSBGdW5jdGlvbiB0byBzdG9yZSB0aGUgT0NCIHBlZXIKKyAqIEBwZGV2OiBIYW5kbGUgdG8gdGhlIEhUVCBpbnN0YW5jZQorICogQHBlZXI6IFBvaW50ZXIgdG8gdGhlIHBlZXIKKyAqLwordm9pZCBvbF90eHJ4X3NldF9vY2JfcGVlcihzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcikKK3sKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlwZGV2LT5vY2JfcGVlciA9IHBlZXI7CisJcGRldi0+b2NiX3BlZXJfdmFsaWQgPSAoTlVMTCAhPSBwZWVyKTsKK30KKworLyoqCisgKiBvbF90eHJ4X2dldF9vY2JfcGVlciAtIEZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBPQ0IgcGVlcgorICogQHBkZXY6IEhhbmRsZSB0byB0aGUgSFRUIGluc3RhbmNlCisgKiBAcGVlcjogUG9pbnRlciB0byB0aGUgcmV0dXJuZWQgcGVlcgorICoKKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcGVlciBpcyB2YWxpZCwgZmFsc2UgaWYgbm90CisgKi8KK2Jvb2wgb2xfdHhyeF9nZXRfb2NiX3BlZXIoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKipwZWVyKQoreworCWludCByYzsKKworCWlmICgocGRldiA9PSBOVUxMKSB8fCAocGVlciA9PSBOVUxMKSkgeworCQlyYyA9IGZhbHNlOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKHBkZXYtPm9jYl9wZWVyX3ZhbGlkKSB7CisJCSpwZWVyID0gcGRldi0+b2NiX3BlZXI7CisJCXJjID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlyYyA9IGZhbHNlOworCX0KKworZXhpdDoKKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyCisvKioKKyAqIG9sX3R4cnhfcmVnaXN0ZXJfcGF1c2VfY2IoKSAtIHJlZ2lzdGVyIHBhdXNlIGNhbGxiYWNrCisgKiBAcGF1c2VfY2I6IHBhdXNlIGNhbGxiYWNrCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgb2xfdHhyeF9yZWdpc3Rlcl9wYXVzZV9jYihvbF90eF9wYXVzZV9jYWxsYmFja19mcCBwYXVzZV9jYikKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlpZiAoIXBkZXYgfHwgIXBhdXNlX2NiKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsICJwZGV2IG9yIHBhdXNlX2NiIGlzIE5VTEwiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJcGRldi0+cGF1c2VfY2IgPSBwYXVzZV9jYjsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfTFJPKQordm9pZCBvbF90eHJ4X2xyb19mbHVzaF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsCisJIHZvaWQgKnJ4cGt0LAorCSB1aW50MTZfdCBzdGFpZCkKK3sKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYgPSAob2xfdHhyeF9wZGV2X2hhbmRsZSljb250ZXh0OworCisJaWYgKGNkZl91bmxpa2VseSghcGRldikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICIlczogSW52YWxpZCBjb250ZXh0IiwgX19mdW5jX18pOworCQljZGZfYXNzZXJ0KDApOworCQlyZXR1cm47CisJfQorCisJaWYgKHBkZXYtPmxyb19pbmZvLmxyb19mbHVzaF9jYikKKwkJcGRldi0+bHJvX2luZm8ubHJvX2ZsdXNoX2NiKHBkZXYtPmxyb19pbmZvLmxyb19kYXRhKTsKKwllbHNlCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAiJXM6IGxyb19mbHVzaF9jYiBOVUxMIiwgX19mdW5jX18pOworfQorCit2b2lkIG9sX3R4cnhfbHJvX2ZsdXNoKHZvaWQgKmRhdGEpCit7CisJcF9jZHNfc2NoZWRfY29udGV4dCBzY2hlZF9jdHggPSBnZXRfY2RzX3NjaGVkX2N0eHQoKTsKKwlzdHJ1Y3QgY2RzX29sX3J4X3BrdCAqcGt0OworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiA9IChvbF90eHJ4X3BkZXZfaGFuZGxlKWRhdGE7CisKKwlpZiAoY2RmX3VubGlrZWx5KCFzY2hlZF9jdHgpKQorCQlyZXR1cm47CisKKwlpZiAoIW9sX2NmZ19pc19yeF90aHJlYWRfZW5hYmxlZChwZGV2LT5jdHJsX3BkZXYpKSB7CisJCW9sX3R4cnhfbHJvX2ZsdXNoX2hhbmRsZXIoKHZvaWQgKilwZGV2LCBOVUxMLCAwKTsKKwl9IGVsc2UgeworCQlwa3QgPSBjZHNfYWxsb2Nfb2xfcnhfcGt0KHNjaGVkX2N0eCk7CisJCWlmIChjZGZfdW5saWtlbHkoIXBrdCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBjb250ZXh0IiwgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisKKwkJcGt0LT5jYWxsYmFjayA9IChjZHNfb2xfcnhfdGhyZWFkX2NiKSBvbF90eHJ4X2xyb19mbHVzaF9oYW5kbGVyOworCQlwa3QtPmNvbnRleHQgPSBwZGV2OworCQlwa3QtPlJ4cGt0ID0gTlVMTDsKKwkJcGt0LT5zdGFJZCA9IDA7CisJCWNkc19pbmRpY2F0ZV9yeHBrdChzY2hlZF9jdHgsIHBrdCk7CisJfQorfQorCit2b2lkIG9sX3JlZ2lzdGVyX2xyb19mbHVzaF9jYih2b2lkIChoYW5kbGVyKSh2b2lkICopLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqaGlmX2RldmljZSA9CisJCShzdHJ1Y3Qgb2xfc29mdGMgKiljZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCisJcGRldi0+bHJvX2luZm8ubHJvX2ZsdXNoX2NiID0gaGFuZGxlcjsKKwlwZGV2LT5scm9faW5mby5scm9fZGF0YSA9IGRhdGE7CisKKwljZV9scm9fZmx1c2hfY2JfcmVnaXN0ZXIoaGlmX2RldmljZSwgb2xfdHhyeF9scm9fZmx1c2gsIHBkZXYpOworfQorI2VuZGlmIC8qIEZFQVRVUkVfTFJPICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfdHhyeC5oIGIvY29yZS9kcC90eHJ4L29sX3R4cnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU5MDA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L29sX3R4cnguaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9PTF9UWFJYX19IXworI2RlZmluZSBfT0xfVFhSWF9fSF8KKworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90ICovCisjaW5jbHVkZSA8b2xfdHhyeF90eXBlcy5oPiAgICAgIC8qIG9sX3R4cnhfdmRldl90LCBldGMuICovCisjaW5jbHVkZSA8b2xfY3RybF9hcGkuaD4gICAgICAgIC8qIG9sX3BkZXZfaGFuZGxlICovCisjaW5jbHVkZSAiY2RzX3NjaGVkLmgiCisKK3ZvaWQgb2xfdHhyeF9wZWVyX3VucmVmX2RlbGV0ZShzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIpOworCisjaWZuZGVmIE9MX1RYX0FWR19GUk1fQllURVMKKyNkZWZpbmUgT0xfVFhfQVZHX0ZSTV9CWVRFUyAxMDAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QRVJfVkRFVl9UWF9ERVNDX1BPT0wKKyNkZWZpbmUgVFhSWF9ITF9UWF9GTE9XX0NUUkxfVkRFVl9MT1dfV0FURVJfTUFSSyA0MDAKKyNlbmRpZgorCisvKioKKyAqIG9sX3R4cnhfZ2V0X3ZkZXZfZnJvbV92ZGV2X2lkKCkgLSBnZXQgdmRldiBmcm9tIHZkZXZfaWQKKyAqIEB2ZGV2X2lkOiB2ZGV2X2lkCisgKgorICogUmV0dXJuOiB2ZGV2IGhhbmRsZQorICogICAgICAgICAgICBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworc3RhdGljIGlubGluZSBvbF90eHJ4X3ZkZXZfaGFuZGxlIG9sX3R4cnhfZ2V0X3ZkZXZfZnJvbV92ZGV2X2lkKHVpbnQ4X3QgdmRldl9pZCkKK3sKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYgPSBOVUxMOworCisJaWYgKGNkZl91bmxpa2VseSghcGRldikpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJVEFJTFFfRk9SRUFDSCh2ZGV2LCAmcGRldi0+dmRldl9saXN0LCB2ZGV2X2xpc3RfZWxlbSkgeworCQlpZiAodmRldi0+dmRldl9pZCA9PSB2ZGV2X2lkKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZkZXY7Cit9CisKKyNlbmRpZiAvKiBfT0xfVFhSWF9fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF90eHJ4X2VuY2FwLmMgYi9jb3JlL2RwL3R4cngvb2xfdHhyeF9lbmNhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDcxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfdHhyeF9lbmNhcC5jCkBAIC0wLDAgKzEsNTkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIG9sX3R4cnhfZW5jYXAuYworICogQGJyaWVmIFByb3ZpZGUgZnVuY3Rpb25zIHRvIGVuY2FwL2RlY2FwIG9uIHR4cnggZnJhbWVzLgorICogQGRldGFpbHMKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBkYXRhIGZyYW1lIGVuY2FwL2RlY2FwOgorICogIG9sX3R4X2VuY2FwOiBlbmNhcCBvdXRnb2luZyBkYXRhIGZyYW1lcy4KKyAqICBvbF9yeF9kZWNhcDogZGVjYXAgaW5jb21pbmcgZGF0YSBmcmFtZXMuCisgKi8KKyNpZmRlZiBRQ0FfU1VQUE9SVF9TV19UWFJYX0VOQ0FQCisKKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCwgZXRjLiAqLworI2luY2x1ZGUgPGNkc19pZWVlODAyMTFfY29tbW9uLmg+ICAgLyogaWVlZTgwMjExX2ZyYW1lICovCisjaW5jbHVkZSA8bmV0Lmg+ICAgICAgICAgICAgICAgIC8qIHN0cnVjdCBsbGMsIHN0cnVjdCBldGhlcl9oZWFkZXIsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2ludGVybmFsLmg+ICAgLyogVFhSWF9BU1NFUlQxICovCisjaW5jbHVkZSA8b2xfdHhyeF90eXBlcy5oPiAgICAgIC8qIHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCwgb2xfdHhyeF9wZGV2X3QsZXRjLiAqLworI2luY2x1ZGUgPG9sX3R4cnhfZW5jYXAuaD4gICAgICAvKiBzdHJ1Y3Qgb2xfcnhfZGVjYXBfaW5mb190ICovCisKKyNkZWZpbmUgT0xfVFhfQ09QWV9OQVRJVkVfV0lGSV9IRUFERVIod2gsIG1zZHUsIGhkc2l6ZSwgbG9jYWxidWYpCVwKKwlkbyB7CQkJCQkJCQlcCisJCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKiljZGZfbmJ1Zl9kYXRhKG1zZHUpOwlcCisJCWlmICgod2gtPmlfZmNbMV0gJgkJCQkJXAorCQkgICAgIElFRUU4MDIxMV9GQzFfRElSX01BU0spID09IElFRUU4MDIxMV9GQzFfRElSX0RTVE9EUykgeyBcCisJCQloZHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9mcmFtZV9hZGRyNCk7CVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQloZHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9mcmFtZSk7CVwKKwkJfQkJCQkJCQlcCisJCWlmIChjZGZfbmJ1Zl9sZW4obXNkdSkgPCBoZHNpemUpIHsJCQlcCisJCQlyZXR1cm4gQV9FUlJPUjsJCQkJCVwKKwkJfQkJCQkJCQlcCisJCWNkZl9tZW1fY29weShsb2NhbGJ1Ziwgd2gsIGhkc2l6ZSk7CQkJXAorCQl3aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopbG9jYWxidWY7CQlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBBX1NUQVRVUworb2xfdHhfY29weV9uYXRpdmVfd2lmaV9oZWFkZXIoY2RmX25idWZfdCBtc2R1LAorCQkJICAgICAgdWludDhfdCAqaGRzaXplLCB1aW50OF90ICpsb2NhbGJ1ZikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aCA9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopY2RmX25idWZfZGF0YShtc2R1KTsKKwlpZiAoKHdoLT5pX2ZjWzFdICYKKwkgICAgIElFRUU4MDIxMV9GQzFfRElSX01BU0spID09IElFRUU4MDIxMV9GQzFfRElSX0RTVE9EUykgeworCQkqaGRzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZnJhbWVfYWRkcjQpOworCX0gZWxzZSB7CisJCSpoZHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9mcmFtZSk7CisJfQorCWlmIChjZGZfbmJ1Zl9sZW4obXNkdSkgPCAqaGRzaXplKQorCQlyZXR1cm4gQV9FUlJPUjsKKworCWNkZl9tZW1fY29weShsb2NhbGJ1Ziwgd2gsICpoZHNpemUpOworCXJldHVybiBBX09LOworfQorCitzdGF0aWMgaW5saW5lIEFfU1RBVFVTCitvbF90eF9lbmNhcF9mcm9tX25hdGl2ZV93aWZpKHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwKKwkJCSAgICAgc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYywKKwkJCSAgICAgY2RmX25idWZfdCBtc2R1LAorCQkJICAgICBzdHJ1Y3Qgb2xfdHhyeF9tc2R1X2luZm9fdCAqdHhfbXNkdV9pbmZvKQoreworCXVpbnQ4X3QgbG9jYWxidWZbc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zZnJhbWVfaHRjX2FkZHI0KV07CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2g7CisJdWludDhfdCBoZHNpemUsIG5ld19oZHNpemU7CisJc3RydWN0IGllZWU4MDIxMV9xb3NjbnRsICpxb3NfY250bDsKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisKKwlpZiAodHhfbXNkdV9pbmZvLT5odHQuaW5mby5mcmFtZV90eXBlICE9IGh0dF9mcm1fdHlwZV9kYXRhKQorCQlyZXR1cm4gQV9PSzsKKworCXBlZXIgPSB0eF9tc2R1X2luZm8tPnBlZXI7CisJLyoKKwkgKiBmb3IgdW5pY2FzdCx0aGUgcGVlciBzaG91bGQgbm90IGJlIE5VTEwuCisJICogZm9yIG11bHRpY2FzdCwgdGhlIHBlZXIgaXMgQVAuCisJICovCisJaWYgKHR4X21zZHVfaW5mby0+aHR0LmluZm8uaXNfdW5pY2FzdCAmJiBwZWVyLT5xb3NfY2FwYWJsZSkgeworCQlpZiAoQV9PSyAhPQorCQkgICAgb2xfdHhfY29weV9uYXRpdmVfd2lmaV9oZWFkZXIobXNkdSwgJmhkc2l6ZSwgbG9jYWxidWYpKQorCQkJcmV0dXJuIEFfRVJST1I7CisJCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKilsb2NhbGJ1ZjsKKworCQkvKmFkZCBxb3MgY250bCAqLworCQlxb3NfY250bCA9IChzdHJ1Y3QgaWVlZTgwMjExX3Fvc2NudGwgKikobG9jYWxidWYgKyBoZHNpemUpOworCQlxb3NfY250bC0+aV9xb3NbMF0gPQorCQkJdHhfbXNkdV9pbmZvLT5odHQuaW5mby5leHRfdGlkICYgSUVFRTgwMjExX1FPU19USUQ7CisKKyNpZmRlZiBORVZFUkRFRklORUQKKwkJaWYgKHdtbVBhcmFtW2FjXS53bWVwX25vYWNrUG9saWN5KQorCQkJcW9zX2NudGwtPmlfcW9zWzBdIHw9IDEgPDwgSUVFRTgwMjExX1FPU19BQ0tQT0xJQ1lfUzsKKyNlbmRpZgorCisJCXFvc19jbnRsLT5pX3Fvc1sxXSA9IDA7CisJCXdoLT5pX2ZjWzBdIHw9IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1M7CisJCS8qIGNvdW50IGZvciBxb3MgZmllbGQgKi8KKwkJbmV3X2hkc2l6ZSA9CisJCQloZHNpemUgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NmcmFtZSkgLQorCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUpOworCisJCS8qYWRkIGh0IGNvbnRyb2wgZmllbGQgaWYgbmVlZGVkICovCisKKwkJLyogY29weSBuZXcgaGQgdG8gYmQgKi8KKwkJY2RmX21lbV9jb3B5KCh2b2lkICopCisJCQkgICAgIGh0dF90eF9kZXNjX21wZHVfaGVhZGVyKHR4X2Rlc2MtPmh0dF90eF9kZXNjLAorCQkJCQkJICAgICBuZXdfaGRzaXplKSwgbG9jYWxidWYsCisJCQkgICAgIG5ld19oZHNpemUpOworCQljZGZfbmJ1Zl9wdWxsX2hlYWQobXNkdSwgaGRzaXplKTsKKwkJdHhfbXNkdV9pbmZvLT5odHQuaW5mby5sM19oZHJfb2Zmc2V0ID0gbmV3X2hkc2l6ZTsKKwkJdHhfZGVzYy0+b3JpZ19sMl9oZHJfYnl0ZXMgPSBoZHNpemU7CisJfQorCS8qIFNldCBQcm90ZWN0ZWQgRnJhbWUgYml0IGluIE1BQyBoZWFkZXIgKi8KKwlpZiAodmRldi0+cGRldi0+c3dfcGZfcHJvY19lbmFibGUKKwkgICAgJiYgdHhfbXNkdV9pbmZvLT5odHQuYWN0aW9uLmRvX2VuY3J5cHQpIHsKKwkJaWYgKHR4X2Rlc2MtPm9yaWdfbDJfaGRyX2J5dGVzKSB7CisJCQl3aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopCisJCQkgICAgIGh0dF90eF9kZXNjX21wZHVfaGVhZGVyKHR4X2Rlc2MtPmh0dF90eF9kZXNjLAorCQkJCQkJICAgICB0eF9tc2R1X2luZm8tPmh0dC5pbmZvLgorCQkJCQkJICAgICBsM19oZHJfb2Zmc2V0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChBX09LICE9CisJCQkgICAgb2xfdHhfY29weV9uYXRpdmVfd2lmaV9oZWFkZXIobXNkdSwgJmhkc2l6ZSwKKwkJCQkJCQkgIGxvY2FsYnVmKSkKKwkJCQlyZXR1cm4gQV9FUlJPUjsKKwkJCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKikKKwkJCSAgICAgaHR0X3R4X2Rlc2NfbXBkdV9oZWFkZXIodHhfZGVzYy0+aHR0X3R4X2Rlc2MsCisJCQkJCQkgICAgIGhkc2l6ZSk7CisJCQljZGZfbWVtX2NvcHkoKHZvaWQgKil3aCwgbG9jYWxidWYsIGhkc2l6ZSk7CisJCQljZGZfbmJ1Zl9wdWxsX2hlYWQobXNkdSwgaGRzaXplKTsKKwkJCXR4X21zZHVfaW5mby0+aHR0LmluZm8ubDNfaGRyX29mZnNldCA9IGhkc2l6ZTsKKwkJCXR4X2Rlc2MtPm9yaWdfbDJfaGRyX2J5dGVzID0gaGRzaXplOworCQl9CisJCXdoLT5pX2ZjWzFdIHw9IElFRUU4MDIxMV9GQzFfV0VQOworCX0KKwlyZXR1cm4gQV9PSzsKK30KKworc3RhdGljIGlubGluZSBBX1NUQVRVUworb2xfdHhfZW5jYXBfZnJvbV84MDIzKHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwKKwkJICAgICAgc3RydWN0IG9sX3R4X2Rlc2NfdCAqdHhfZGVzYywKKwkJICAgICAgY2RmX25idWZfdCBtc2R1LCBzdHJ1Y3Qgb2xfdHhyeF9tc2R1X2luZm9fdCAqdHhfbXNkdV9pbmZvKQoreworCXVpbnQ4X3QgbG9jYWxidWZbc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zZnJhbWVfaHRjX2FkZHI0KQorCQkJICsgc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHJfdCldOworCXN0cnVjdCBsbGNfc25hcF9oZHJfdCAqbGxjX2hkcjsKKwlzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QgKmV0aF9oZHI7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2g7CisJdWludDhfdCBoZHNpemUsIG5ld19sMl9oZHNpemUsIG5ld19oZHNpemU7CisJc3RydWN0IGllZWU4MDIxMV9xb3NjbnRsICpxb3NfY250bDsKKwljb25zdCB1aW50OF90IGV0aGVybmV0X0lJX2xsY19zbmFwX2hlYWRlcl9wcmVmaXhbXSA9IHsKKwkJMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwl1aW50MTZfdCBldGhlcl90eXBlOworCisJaWYgKHR4X21zZHVfaW5mby0+aHR0LmluZm8uZnJhbWVfdHlwZSAhPSBodHRfZnJtX3R5cGVfZGF0YSkKKwkJcmV0dXJuIEFfT0s7CisKKwkvKgorCSAqIGZvciB1bmljYXN0LHRoZSBwZWVyIHNob3VsZCBub3QgYmUgTlVMTC4KKwkgKiBmb3IgbXVsdGljYXN0LCB0aGUgcGVlciBpcyBBUC4KKwkgKi8KKwlwZWVyID0gdHhfbXNkdV9pbmZvLT5wZWVyOworCisJZXRoX2hkciA9IChzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QgKiljZGZfbmJ1Zl9kYXRhKG1zZHUpOworCWhkc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QpOworCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKilsb2NhbGJ1ZjsKKwl3aC0+aV9mY1swXSA9IElFRUU4MDIxMV9GQzBfVkVSU0lPTl8wIHwgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEE7CisJKih1aW50MTZfdCAqKSB3aC0+aV9kdXIgPSAwOworCW5ld19oZHNpemUgPSAwOworCisJc3dpdGNoICh2ZGV2LT5vcG1vZGUpIHsKKwljYXNlIHdsYW5fb3BfbW9kZV9hcDoKKwkJLyogREEgLCBCU1NJRCAsIFNBICovCisJCWNkZl9tZW1fY29weSh3aC0+aV9hZGRyMSwgZXRoX2hkci0+ZGVzdF9hZGRyLAorCQkJICAgICBJRUVFODAyMTFfQUREUl9MRU4pOworCQljZGZfbWVtX2NvcHkod2gtPmlfYWRkcjIsICZ2ZGV2LT5tYWNfYWRkci5yYXcsCisJCQkgICAgIElFRUU4MDIxMV9BRERSX0xFTik7CisJCWNkZl9tZW1fY29weSh3aC0+aV9hZGRyMywgZXRoX2hkci0+c3JjX2FkZHIsCisJCQkgICAgIElFRUU4MDIxMV9BRERSX0xFTik7CisJCXdoLT5pX2ZjWzFdID0gSUVFRTgwMjExX0ZDMV9ESVJfRlJPTURTOworCQluZXdfaGRzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUpOworCQlicmVhazsKKwljYXNlIHdsYW5fb3BfbW9kZV9pYnNzOgorCQkvKiBEQSwgU0EsIEJTU0lEICovCisJCWNkZl9tZW1fY29weSh3aC0+aV9hZGRyMSwgZXRoX2hkci0+ZGVzdF9hZGRyLAorCQkJICAgICBJRUVFODAyMTFfQUREUl9MRU4pOworCQljZGZfbWVtX2NvcHkod2gtPmlfYWRkcjIsIGV0aF9oZHItPnNyY19hZGRyLAorCQkJICAgICBJRUVFODAyMTFfQUREUl9MRU4pOworCQkvKiBuZWVkIHRvIGNoZWNrIHRoZSBic3NpZCBiZWhhdmlvdXIgZm9yIElCU1MgdmRldiAqLworCQljZGZfbWVtX2NvcHkod2gtPmlfYWRkcjMsICZ2ZGV2LT5tYWNfYWRkci5yYXcsCisJCQkgICAgIElFRUU4MDIxMV9BRERSX0xFTik7CisJCXdoLT5pX2ZjWzFdID0gSUVFRTgwMjExX0ZDMV9ESVJfTk9EUzsKKwkJbmV3X2hkc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lKTsKKwkJYnJlYWs7CisJY2FzZSB3bGFuX29wX21vZGVfc3RhOgorCQkvKiBCU1NJRCwgU0EgLCBEQSAqLworCQljZGZfbWVtX2NvcHkod2gtPmlfYWRkcjEsICZwZWVyLT5tYWNfYWRkci5yYXcsCisJCQkgICAgIElFRUU4MDIxMV9BRERSX0xFTik7CisJCWNkZl9tZW1fY29weSh3aC0+aV9hZGRyMiwgZXRoX2hkci0+c3JjX2FkZHIsCisJCQkgICAgIElFRUU4MDIxMV9BRERSX0xFTik7CisJCWNkZl9tZW1fY29weSh3aC0+aV9hZGRyMywgZXRoX2hkci0+ZGVzdF9hZGRyLAorCQkJICAgICBJRUVFODAyMTFfQUREUl9MRU4pOworCQl3aC0+aV9mY1sxXSA9IElFRUU4MDIxMV9GQzFfRElSX1RPRFM7CisJCW5ld19oZHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9mcmFtZSk7CisJCWJyZWFrOworCWNhc2Ugd2xhbl9vcF9tb2RlX21vbml0b3I6CisJZGVmYXVsdDoKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCS8qYWRkIHFvcyBjbnRsICovCisJaWYgKHR4X21zZHVfaW5mby0+aHR0LmluZm8uaXNfdW5pY2FzdCAmJiBwZWVyLT5xb3NfY2FwYWJsZSkgeworCQlxb3NfY250bCA9IChzdHJ1Y3QgaWVlZTgwMjExX3Fvc2NudGwgKikobG9jYWxidWYgKyBuZXdfaGRzaXplKTsKKwkJcW9zX2NudGwtPmlfcW9zWzBdID0KKwkJCXR4X21zZHVfaW5mby0+aHR0LmluZm8uZXh0X3RpZCAmIElFRUU4MDIxMV9RT1NfVElEOworCQl3aC0+aV9mY1swXSB8PSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TOworI2lmZGVmIE5FVkVSREVGSU5FRAorCQlpZiAod21tUGFyYW1bYWNdLndtZXBfbm9hY2tQb2xpY3kpCisJCQlxb3NfY250bC0+aV9xb3NbMF0gfD0gMSA8PCBJRUVFODAyMTFfUU9TX0FDS1BPTElDWV9TOworI2VuZGlmCisJCXFvc19jbnRsLT5pX3Fvc1sxXSA9IDA7CisJCW5ld19oZHNpemUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zY250bCk7CisKKwkJLyphZGQgaHQgY29udHJvbCBmaWVsZCBpZiBuZWVkZWQgKi8KKwl9CisJLyogU2V0IFByb3RlY3RlZCBGcmFtZSBiaXQgaW4gTUFDIGhlYWRlciAqLworCWlmICh2ZGV2LT5wZGV2LT5zd19wZl9wcm9jX2VuYWJsZQorCSAgICAmJiB0eF9tc2R1X2luZm8tPmh0dC5hY3Rpb24uZG9fZW5jcnlwdCkgeworCQl3aC0+aV9mY1sxXSB8PSBJRUVFODAyMTFfRkMxX1dFUDsKKwl9CisJbmV3X2wyX2hkc2l6ZSA9IG5ld19oZHNpemU7CisJLyogYWRkIGxsYyBzbmFwIGlmIG5lZWRlZCAqLworCWlmICh2ZGV2LT5wZGV2LT5zd190eF9sbGNfcHJvY19lbmFibGUpIHsKKwkJbGxjX2hkciA9IChzdHJ1Y3QgbGxjX3NuYXBfaGRyX3QgKikobG9jYWxidWYgKyBuZXdfaGRzaXplKTsKKwkJZXRoZXJfdHlwZSA9CisJCQkoZXRoX2hkci0+ZXRoZXJ0eXBlWzBdIDw8IDgpIHwgKGV0aF9oZHItPmV0aGVydHlwZVsxXSk7CisJCWlmIChldGhlcl90eXBlID49IElFRUU4MDIzX01BWF9MRU4pIHsKKwkJCWNkZl9tZW1fY29weShsbGNfaGRyLAorCQkJCSAgICAgZXRoZXJuZXRfSUlfbGxjX3NuYXBfaGVhZGVyX3ByZWZpeCwKKwkJCQkgICAgIHNpemVvZgorCQkJCSAgICAgKGV0aGVybmV0X0lJX2xsY19zbmFwX2hlYWRlcl9wcmVmaXgpKTsKKwkJCWlmIChldGhlcl90eXBlID09IEVUSEVSVFlQRV9BQVJQCisJCQkgICAgfHwgZXRoZXJfdHlwZSA9PSBFVEhFUlRZUEVfSVBYKSB7CisJCQkJbGxjX2hkci0+b3JnX2NvZGVbMl0gPSBCVEVQX1NOQVBfT1JHQ09ERV8yOworCQkJCS8qIDB4Zjg7IGJyaWRnZSB0dW5uZWwgaGVhZGVyICovCisJCQl9CisJCQlsbGNfaGRyLT5ldGhlcnR5cGVbMF0gPSBldGhfaGRyLT5ldGhlcnR5cGVbMF07CisJCQlsbGNfaGRyLT5ldGhlcnR5cGVbMV0gPSBldGhfaGRyLT5ldGhlcnR5cGVbMV07CisJCQluZXdfaGRzaXplICs9IHNpemVvZihzdHJ1Y3QgbGxjX3NuYXBfaGRyX3QpOworCQl9IGVsc2UgeworCQkJLypsbGMgcmVhZHksIGFuZCBpdCdzIGluIHBheWxvYWQgcGR1LAorCQkJICBkbyB3ZSBuZWVkIHRvIG1vdmUgdG8gQkQgcGR1PyAqLworCQl9CisJfQorCWNkZl9tZW1fY29weSgodm9pZCAqKQorCQkgICAgIGh0dF90eF9kZXNjX21wZHVfaGVhZGVyKHR4X2Rlc2MtPmh0dF90eF9kZXNjLAorCQkJCQkgICAgIG5ld19sMl9oZHNpemUpLCBsb2NhbGJ1ZiwKKwkJICAgICBuZXdfaGRzaXplKTsKKwljZGZfbmJ1Zl9wdWxsX2hlYWQobXNkdSwgaGRzaXplKTsKKwl0eF9tc2R1X2luZm8tPmh0dC5pbmZvLmwzX2hkcl9vZmZzZXQgPSBuZXdfbDJfaGRzaXplOworCXR4X2Rlc2MtPm9yaWdfbDJfaGRyX2J5dGVzID0gaGRzaXplOworCXJldHVybiBBX09LOworfQorCitBX1NUQVRVUworb2xfdHhfZW5jYXAoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCSAgICBzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjLAorCSAgICBjZGZfbmJ1Zl90IG1zZHUsIHN0cnVjdCBvbF90eHJ4X21zZHVfaW5mb190ICptc2R1X2luZm8pCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gdmRldi0+cGRldjsKKworCWlmIChwZGV2LT5mcmFtZV9mb3JtYXQgPT0gd2xhbl9mcm1fZm10X25hdGl2ZV93aWZpKSB7CisJCXJldHVybiBvbF90eF9lbmNhcF9mcm9tX25hdGl2ZV93aWZpKHZkZXYsIHR4X2Rlc2MsIG1zZHUsCisJCQkJCQkgICAgbXNkdV9pbmZvKTsKKwl9IGVsc2UgaWYgKHBkZXYtPmZyYW1lX2Zvcm1hdCA9PSB3bGFuX2ZybV9mbXRfODAyXzMpIHsKKwkJcmV0dXJuIG9sX3R4X2VuY2FwX2Zyb21fODAyMyh2ZGV2LCB0eF9kZXNjLCBtc2R1LCBtc2R1X2luZm8pOworCX0gZWxzZSB7CisJCS8qIHRvZG8gZm9yIG90aGVyIHR5cGVzICovCisJCXJldHVybiBBX0VSUk9SOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitvbF9yeF9kZWNhcF90b19uYXRpdmVfd2lmaShzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCQkgICBjZGZfbmJ1Zl90IG1zZHUsCisJCQkgICBzdHJ1Y3Qgb2xfcnhfZGVjYXBfaW5mb190ICppbmZvLAorCQkJICAgc3RydWN0IGV0aGVybmV0X2hkcl90ICpldGhyX2hkcikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX2FkZHI0ICp3aDsKKwl1aW50MTZfdCBoZHNpemU7CisKKwkvKgorCSAqIHdlIG5lZWQgdG8gcmVtb3ZlIFFvcyBjb250cm9sIGZpZWxkIGFuZCBIVCBjb250cm9sLgorCSAqIE1TRlQ6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzLworCSAqIGhhcmR3YXJlL2ZmNTUyNjA4KHY9dnMuODUpLmFzcHgKKwkgKi8KKwl3aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX2FkZHI0ICopaW5mby0+aGRyOworCWlmICgod2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX0RJUl9NQVNLKSA9PQorCSAgICBJRUVFODAyMTFfRkMxX0RJUl9EU1RPRFMpCisJCWhkc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX2FkZHI0KTsKKwllbHNlCisJCWhkc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lKTsKKworCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWVfYWRkcjQgKiljZGZfbmJ1Zl9wdXNoX2hlYWQobXNkdSwgaGRzaXplKTsKKwlUWFJYX0FTU0VSVDIod2ggIT0gTlVMTCk7CisJVFhSWF9BU1NFUlQyKGhkc2l6ZSA8PSBpbmZvLT5oZHJfbGVuKTsKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgd2gsIGluZm8tPmhkciwgaGRzaXplKTsKKworCS8qIGFtc2R1IHN1YmZybSBoYW5kbGluZyBpZiBldGhyX2hkciBpcyBub3QgTlVMTCAgKi8KKwlpZiAoZXRocl9oZHIgIT0gTlVMTCkgeworCQlzd2l0Y2ggKHdoLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9ESVJfTUFTSykgeworCQljYXNlIElFRUU4MDIxMV9GQzFfRElSX05PRFM6CisJCQljZGZfbWVtX2NvcHkod2gtPmlfYWRkcjEsIGV0aHJfaGRyLT5kZXN0X2FkZHIsCisJCQkJICAgICBFVEhFUk5FVF9BRERSX0xFTik7CisJCQljZGZfbWVtX2NvcHkod2gtPmlfYWRkcjIsIGV0aHJfaGRyLT5zcmNfYWRkciwKKwkJCQkgICAgIEVUSEVSTkVUX0FERFJfTEVOKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9GQzFfRElSX1RPRFM6CisJCQljZGZfbWVtX2NvcHkod2gtPmlfYWRkcjIsIGV0aHJfaGRyLT5zcmNfYWRkciwKKwkJCQkgICAgIEVUSEVSTkVUX0FERFJfTEVOKTsKKwkJCWNkZl9tZW1fY29weSh3aC0+aV9hZGRyMywgZXRocl9oZHItPmRlc3RfYWRkciwKKwkJCQkgICAgIEVUSEVSTkVUX0FERFJfTEVOKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9GQzFfRElSX0ZST01EUzoKKwkJCWNkZl9tZW1fY29weSh3aC0+aV9hZGRyMSwgZXRocl9oZHItPmRlc3RfYWRkciwKKwkJCQkgICAgIEVUSEVSTkVUX0FERFJfTEVOKTsKKwkJCWNkZl9tZW1fY29weSh3aC0+aV9hZGRyMywgZXRocl9oZHItPnNyY19hZGRyLAorCQkJCSAgICAgRVRIRVJORVRfQUREUl9MRU4pOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTOgorCQkJY2RmX21lbV9jb3B5KHdoLT5pX2FkZHIzLCBldGhyX2hkci0+ZGVzdF9hZGRyLAorCQkJCSAgICAgRVRIRVJORVRfQUREUl9MRU4pOworCQkJY2RmX21lbV9jb3B5KHdoLT5pX2FkZHI0LCBldGhyX2hkci0+c3JjX2FkZHIsCisJCQkJICAgICBFVEhFUk5FVF9BRERSX0xFTik7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoSUVFRTgwMjExX1FPU19IQVNfU0VRKHdoKSkgeworCQlpZiAod2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX09SREVSKQorCQkJd2gtPmlfZmNbMV0gJj0gfklFRUU4MDIxMV9GQzFfT1JERVI7CisJCXdoLT5pX2ZjWzBdICY9IH5JRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitvbF9yeF9kZWNhcF90b184MDIzKHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwKKwkJICAgIGNkZl9uYnVmX3QgbXNkdSwKKwkJICAgIHN0cnVjdCBvbF9yeF9kZWNhcF9pbmZvX3QgKmluZm8sCisJCSAgICBzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QgKmV0aHJfaGRyKQoreworCXN0cnVjdCBsbGNfc25hcF9oZHJfdCAqbGxjX2hkcjsKKwl1aW50MTZfdCBldGhlcl90eXBlOworCXVpbnQxNl90IGwyX2hkcl9zcGFjZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX2FkZHI0ICp3aDsKKwl1aW50OF90IGxvY2FsX2J1ZltFVEhFUk5FVF9IRFJfTEVOXTsKKwl1aW50OF90ICpidWY7CisKKwkvKgorCSAqIHBvcHVsYXRlIEV0aGVybmV0IGhlYWRlciwKKwkgKiBpZiBldGhyX2hkciBpcyBudWxsLCByeCBmcmFtZSBpcyA4MDIuMTEgZm9ybWF0KEhXIGZ0IGRpc2FibGVkKQorCSAqIGlmIGV0aHJfaGRyIGlzIG5vdCBudWxsLCByeCBmcmFtZSBpcyAic3ViZnJtIG9mIGFtc2R1Ii4KKwkgKi8KKwlidWYgPSAodWludDhfdCAqKSBjZGZfbmJ1Zl9kYXRhKG1zZHUpOworCWxsY19oZHIgPSAoc3RydWN0IGxsY19zbmFwX2hkcl90ICopYnVmOworCWV0aGVyX3R5cGUgPSAobGxjX2hkci0+ZXRoZXJ0eXBlWzBdIDw8IDgpIHwgbGxjX2hkci0+ZXRoZXJ0eXBlWzFdOworCS8qIGRvIGxsYyByZW1vdmUgaWYgbmVlZGVkICovCisJbDJfaGRyX3NwYWNlID0gMDsKKwlpZiAoSVNfU05BUChsbGNfaGRyKSkgeworCQlpZiAoSVNfQlRFUChsbGNfaGRyKSkgeworCQkJLyogcmVtb3ZlIGxsYyAqLworCQkJbDJfaGRyX3NwYWNlICs9IHNpemVvZihzdHJ1Y3QgbGxjX3NuYXBfaGRyX3QpOworCQkJbGxjX2hkciA9IE5VTEw7CisJCX0gZWxzZSBpZiAoSVNfUkZDMTA0MihsbGNfaGRyKSkgeworCQkJaWYgKCEoZXRoZXJfdHlwZSA9PSBFVEhFUlRZUEVfQUFSUCB8fAorCQkJICAgICAgZXRoZXJfdHlwZSA9PSBFVEhFUlRZUEVfSVBYKSkgeworCQkJCS8qIHJlbW92ZSBsbGMgKi8KKwkJCQlsMl9oZHJfc3BhY2UgKz0gc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHJfdCk7CisJCQkJbGxjX2hkciA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisJaWYgKGwyX2hkcl9zcGFjZSA+IEVUSEVSTkVUX0hEUl9MRU4pCisJCWJ1ZiA9IGNkZl9uYnVmX3B1bGxfaGVhZChtc2R1LCBsMl9oZHJfc3BhY2UgLSBFVEhFUk5FVF9IRFJfTEVOKTsKKwllbHNlIGlmIChsMl9oZHJfc3BhY2UgPCBFVEhFUk5FVF9IRFJfTEVOKQorCQlidWYgPSBjZGZfbmJ1Zl9wdXNoX2hlYWQobXNkdSwgRVRIRVJORVRfSERSX0xFTiAtIGwyX2hkcl9zcGFjZSk7CisKKwkvKiBub3JtYWwgbXNkdShub24tc3ViZnJtIG9mIEEtTVNEVSkgaWYgZXRocl9oZHIgaXMgbnVsbCAqLworCWlmIChldGhyX2hkciA9PSBOVUxMKSB7CisJCS8qIG1wZHUgaGRyIHNob3VsZCBiZSBwcmVzZW50IGluIGluZm8sCisJCSAgIHJlLWNyZWF0ZSBldGhyX2hkciBiYXNlZCBvbiBtcGR1IGhkciAqLworCQlUWFJYX0FTU0VSVDIoaW5mby0+aGRyX2xlbiAhPSAwKTsKKwkJd2ggPSAoc3RydWN0IGllZWU4MDIxMV9mcmFtZV9hZGRyNCAqKWluZm8tPmhkcjsKKwkJZXRocl9oZHIgPSAoc3RydWN0IGV0aGVybmV0X2hkcl90ICopbG9jYWxfYnVmOworCQlzd2l0Y2ggKHdoLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9ESVJfTUFTSykgeworCQljYXNlIElFRUU4MDIxMV9GQzFfRElSX05PRFM6CisJCQljZGZfbWVtX2NvcHkoZXRocl9oZHItPmRlc3RfYWRkciwgd2gtPmlfYWRkcjEsCisJCQkJICAgICBFVEhFUk5FVF9BRERSX0xFTik7CisJCQljZGZfbWVtX2NvcHkoZXRocl9oZHItPnNyY19hZGRyLCB3aC0+aV9hZGRyMiwKKwkJCQkgICAgIEVUSEVSTkVUX0FERFJfTEVOKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9GQzFfRElSX1RPRFM6CisJCQljZGZfbWVtX2NvcHkoZXRocl9oZHItPmRlc3RfYWRkciwgd2gtPmlfYWRkcjMsCisJCQkJICAgICBFVEhFUk5FVF9BRERSX0xFTik7CisJCQljZGZfbWVtX2NvcHkoZXRocl9oZHItPnNyY19hZGRyLCB3aC0+aV9hZGRyMiwKKwkJCQkgICAgIEVUSEVSTkVUX0FERFJfTEVOKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9GQzFfRElSX0ZST01EUzoKKwkJCWNkZl9tZW1fY29weShldGhyX2hkci0+ZGVzdF9hZGRyLCB3aC0+aV9hZGRyMSwKKwkJCQkgICAgIEVUSEVSTkVUX0FERFJfTEVOKTsKKwkJCWNkZl9tZW1fY29weShldGhyX2hkci0+c3JjX2FkZHIsIHdoLT5pX2FkZHIzLAorCQkJCSAgICAgRVRIRVJORVRfQUREUl9MRU4pOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTOgorCQkJY2RmX21lbV9jb3B5KGV0aHJfaGRyLT5kZXN0X2FkZHIsIHdoLT5pX2FkZHIzLAorCQkJCSAgICAgRVRIRVJORVRfQUREUl9MRU4pOworCQkJY2RmX21lbV9jb3B5KGV0aHJfaGRyLT5zcmNfYWRkciwgd2gtPmlfYWRkcjQsCisJCQkJICAgICBFVEhFUk5FVF9BRERSX0xFTik7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobGxjX2hkciA9PSBOVUxMKSB7CisJCWV0aHJfaGRyLT5ldGhlcnR5cGVbMF0gPSAoZXRoZXJfdHlwZSA+PiA4KSAmIDB4ZmY7CisJCWV0aHJfaGRyLT5ldGhlcnR5cGVbMV0gPSAoZXRoZXJfdHlwZSkgJiAweGZmOworCX0gZWxzZSB7CisJCXVpbnQzMl90IHBrdGxlbiA9CisJCQljZGZfbmJ1Zl9sZW4obXNkdSkgLSBzaXplb2YoZXRocl9oZHItPmV0aGVydHlwZSk7CisJCVRYUlhfQVNTRVJUMihwa3RsZW4gPD0gRVRIRVJORVRfTVRVKTsKKwkJZXRoZXJfdHlwZSA9ICh1aW50MTZfdCkgcGt0bGVuOworCQlldGhlcl90eXBlID0gY2RmX25idWZfbGVuKG1zZHUpIC0gc2l6ZW9mKHN0cnVjdCBldGhlcm5ldF9oZHJfdCk7CisJCWV0aHJfaGRyLT5ldGhlcnR5cGVbMF0gPSAoZXRoZXJfdHlwZSA+PiA4KSAmIDB4ZmY7CisJCWV0aHJfaGRyLT5ldGhlcnR5cGVbMV0gPSAoZXRoZXJfdHlwZSkgJiAweGZmOworCX0KKwljZGZfbWVtX2NvcHkoYnVmLCBldGhyX2hkciwgRVRIRVJORVRfSERSX0xFTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgQV9TVEFUVVMKK29sX3J4X2RlY2FwX3N1YmZybV9hbXNkdShzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJCQkgY2RmX25idWZfdCBtc2R1LCBzdHJ1Y3Qgb2xfcnhfZGVjYXBfaW5mb190ICppbmZvKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHZkZXYtPnBkZXY7CisJdWludDhfdCAqc3ViZnJtX2hkcjsKKwl1aW50OF90IGxvY2FsYnVmW0VUSEVSTkVUX0hEUl9MRU5dOworCXN0cnVjdCBldGhlcm5ldF9oZHJfdCAqZXRoZXJfaGRyID0gKHN0cnVjdCBldGhlcm5ldF9oZHJfdCAqKWxvY2FsYnVmOworCisJc3ViZnJtX2hkciA9ICh1aW50OF90ICopIGNkZl9uYnVmX2RhdGEobXNkdSk7CisJaWYgKHBkZXYtPmZyYW1lX2Zvcm1hdCA9PSB3bGFuX2ZybV9mbXRfbmF0aXZlX3dpZmkpIHsKKwkJLyogZGVjYXAgdG8gbmF0aXZlIHdpZmkgKi8KKwkJY2RmX21lbV9jb3B5KGV0aGVyX2hkciwgc3ViZnJtX2hkciwgRVRIRVJORVRfSERSX0xFTik7CisJCWNkZl9uYnVmX3B1bGxfaGVhZChtc2R1LCBFVEhFUk5FVF9IRFJfTEVOKTsKKwkJb2xfcnhfZGVjYXBfdG9fbmF0aXZlX3dpZmkodmRldiwgbXNkdSwgaW5mbywgZXRoZXJfaGRyKTsKKwl9IGVsc2UgaWYgKHBkZXYtPmZyYW1lX2Zvcm1hdCA9PSB3bGFuX2ZybV9mbXRfODAyXzMpIHsKKwkJaWYgKHBkZXYtPnN3X3J4X2xsY19wcm9jX2VuYWJsZSkgeworCQkJLyogcmVtb3ZlIGxsYyBzbmFwIGhkciBpZiBpdCdzIG5lY2Vzc2FyeSBhY2NvcmRpbmcgdG8KKwkJCSAqIDgwMi4xMSB0YWJsZSBQLTMKKwkJCSAqLworCQkJY2RmX21lbV9jb3B5KGV0aGVyX2hkciwgc3ViZnJtX2hkciwgRVRIRVJORVRfSERSX0xFTik7CisJCQljZGZfbmJ1Zl9wdWxsX2hlYWQobXNkdSwgRVRIRVJORVRfSERSX0xFTik7CisJCQlvbF9yeF9kZWNhcF90b184MDIzKHZkZXYsIG1zZHUsIGluZm8sIGV0aGVyX2hkcik7CisJCX0gZWxzZSB7CisJCQkvKiBzdWJmcm0gb2YgQS1NU0RVIGlzIGFscmVhZHkgaW4gODAyLjMgZm9ybWF0LgorCQkJICogaWYgdGFyZ2V0IEhXIG9yIEZXIGhhcyBkb25lIExMQyBybXYgcHJvY2VzcywKKwkJCSAqIHdlIGRvIG5vdGhpbmcgaGVyZS4KKwkJCSAqLworCQl9CisJfSBlbHNlIHsKKwkJLyogdG9kbyBmb3Igb3RoZXJ0eXBlICovCisJfQorCXJldHVybiBBX09LOworCit9CisKK3N0YXRpYyBpbmxpbmUgQV9TVEFUVVMKK29sX3J4X2RlY2FwX21zZHUoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkgY2RmX25idWZfdCBtc2R1LCBzdHJ1Y3Qgb2xfcnhfZGVjYXBfaW5mb190ICppbmZvKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHZkZXYtPnBkZXY7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2g7CisJd2ggPSAoc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKWNkZl9uYnVmX2RhdGEobXNkdSk7CisKKwlpZiAocGRldi0+ZnJhbWVfZm9ybWF0ID09IHdsYW5fZnJtX2ZtdF9uYXRpdmVfd2lmaSkgeworCQkvKiBEZWNhcCB0byBuYXRpdmUgd2lmaSBiZWNhdXNlIGFjY29yZGluZyB0byBNU0ZUKAorCQkgKiBNU0ZUOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy8KKwkJICogaGFyZHdhcmUvZmY1NTI2MDgodj12cy44NSkuYXNweCksCisJCSAqIHdlIG5lZWQgdG8gcmVtb3ZlIFFvcyBhbmQgSFRDIGZpZWxkIGJlZm9yZSBpbmRpY2F0ZSB0byBPUy4KKwkJICovCisJCWlmIChJRUVFODAyMTFfUU9TX0hBU19TRVEod2gpKSB7CisJCQlpbmZvLT5oZHJfbGVuID0gb2xfdHhyeF9pZWVlODAyMTFfaGRyc2l6ZSh3aCk7CisJCQlUWFJYX0FTU0VSVDIoaW5mby0+aGRyX2xlbiA8PSBzaXplb2YoaW5mby0+aGRyKSk7CisJCQljZGZfbWVtX2NvcHkoaW5mby0+aGRyLCAvKiB1c2UgaW5mby0+aGRyIGFzIHRlbXAgYnVmLiAqLworCQkJCSAgICAgd2gsIGluZm8tPmhkcl9sZW4pOworCQkJY2RmX25idWZfcHVsbF9oZWFkKG1zZHUsIGluZm8tPmhkcl9sZW4pOworCQkJb2xfcnhfZGVjYXBfdG9fbmF0aXZlX3dpZmkodmRldiwgbXNkdSwgaW5mbywgTlVMTCk7CisJCQkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMi4xMSBoZHJeICBldGhfaGRyXiAqLworCQl9CisJfSBlbHNlIGlmIChwZGV2LT5mcmFtZV9mb3JtYXQgPT0gd2xhbl9mcm1fZm10XzgwMl8zKSB7CisJCWlmIChwZGV2LT5zd19yeF9sbGNfcHJvY19lbmFibGUpIHsKKwkJCWluZm8tPmhkcl9sZW4gPSBvbF90eHJ4X2llZWU4MDIxMV9oZHJzaXplKHdoKTsKKwkJCVRYUlhfQVNTRVJUMihpbmZvLT5oZHJfbGVuIDw9IHNpemVvZihpbmZvLT5oZHIpKTsKKwkJCWNkZl9tZW1fY29weShpbmZvLT5oZHIsIC8qIHVzZSBpbmZvLT5oZHIgYXMgdGVtcCBidWYuICovCisJCQkJICAgICB3aCwgaW5mby0+aGRyX2xlbik7CisJCQljZGZfbmJ1Zl9wdWxsX2hlYWQobXNkdSwgaW5mby0+aGRyX2xlbik7CisJCQkvKiByZW1vdmUgbGxjIHNuYXAgaGRyIGlmIGl0J3MgbmVjZXNzYXJ5IGFjY29yZGluZyB0bworCQkJICogODAyLjExIHRhYmxlIFAtMworCQkJICovCisJCQlvbF9yeF9kZWNhcF90b184MDIzKHZkZXYsIG1zZHUsIGluZm8sICAgLyogODAyLjExIGhkciAqLworCQkJCQkgICAgTlVMTCk7ICAgICAgLyogZXRoZXJuZXQgaGRyICovCisJCX0gZWxzZSB7CisJCQkvKiBTdWJmcm0gb2YgQS1NU0RVIGlzIGFscmVhZHkgaW4gODAyLjMgZm9ybWF0LgorCQkJICogQW5kIGlmIHRhcmdldCBIVyBvciBGVyBoYXMgZG9uZSBMTEMgcm12IHByb2Nlc3MgKAorCQkJICogc3dfcnhfbGNfcHJvY19lbmFibGUgPT0gMCksIHdlIGRvIG5vdGhpbmcgaGVyZS4KKwkJCSAqLworCQl9CisJfSBlbHNlIHsKKwkJLyogdG9kbyBmb3Igb3RoZXJ0eXBlICovCisJfQorCXJldHVybiBBX09LOworCit9CisKK0FfU1RBVFVTCitvbF9yeF9kZWNhcChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJICAgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkgICAgY2RmX25idWZfdCBtc2R1LCBzdHJ1Y3Qgb2xfcnhfZGVjYXBfaW5mb190ICppbmZvKQoreworCUFfU1RBVFVTIHN0YXR1czsKKwl1aW50OF90ICptcGR1X2hkcjsKKworCWlmICghaW5mby0+aXNfc3ViZnJtKSB7CisJCWlmIChpbmZvLT5pc19tc2R1X2NtcGxfbXBkdSAmJiAhaW5mby0+aXNfZmlyc3Rfc3ViZnJtKSB7CisJCQkvKiBJdCdzIG5vcm1hbCBNU0RVLiAqLworCQl9IGVsc2UgeworCQkJLyogSXQncyBhIGZpcnN0IHN1YmZybSBvZiBBLU1TRFUgYW5kCisJCQkgICBtYXkgYWxzbyBiZSB0aGUgbGFzdCBzdWJmcm0gb2YgQS1NU0RVICovCisJCQlpbmZvLT5pc19zdWJmcm0gPSAxOworCQkJaW5mby0+aGRyX2xlbiA9IDA7CisJCQlpZiAodmRldi0+cGRldi0+c3dfc3ViZnJtX2hkcl9yZWNvdmVyeV9lbmFibGUpIHsKKwkJCQkvKiB3ZSBzYXZlIHRoZSBmaXJzdCBzdWJmcm0gbXBkdSBoZHIgZm9yCisJCQkJICogc3Vic2VxdWVudCBzdWJmcm0gODAyLjExIGhlYWRlciByZWNvdmVyeQorCQkJCSAqIGluIGNlcnRhaW4gY2hpcChzdWNoIGFzIFJpdmEpLgorCQkJCSAqLworCQkJCW1wZHVfaGRyID0gY2RmX25idWZfZGF0YShtc2R1KTsKKwkJCQlpbmZvLT5oZHJfbGVuID0KKwkJCQkJb2xfdHhyeF9pZWVlODAyMTFfaGRyc2l6ZShtcGR1X2hkcik7CisJCQkJVFhSWF9BU1NFUlQyKGluZm8tPmhkcl9sZW4gPD0KKwkJCQkJICAgICBzaXplb2YoaW5mby0+aGRyKSk7CisJCQkJY2RmX21lbV9jb3B5KGluZm8tPmhkciwgbXBkdV9oZHIsCisJCQkJCSAgICAgaW5mby0+aGRyX2xlbik7CisJCQkJY2RmX25idWZfcHVsbF9oZWFkKG1zZHUsIGluZm8tPmhkcl9sZW4pOworCQkJfQorCQl9CisJfQorCisJaWYgKGluZm8tPmlzX3N1YmZybSAmJiB2ZGV2LT5wZGV2LT5zd19zdWJmcm1faGRyX3JlY292ZXJ5X2VuYWJsZSkgeworCQkvKgorCQkgKiBUaGlzIGNhc2UgaXMgZW5hYmxlZCBmb3Igc29tZSBIV3MgKHN1Y2ggYXMgUml2YSkuIFRoZSBIVworCQkgKiBkZS1hZ2dyZWdhdGUgZG9lc24ndCBoYXZlIGNhcGFiaWxpdHkgdG8gZ2VuZXJhdGUgODAyLjExCisJCSAqIGhlYWRlciBmb3Igbm9uLWZpcnN0IHN1YmZyYW1lIG9mIEEtTVNEVS4gVGhhdCBtZWFucyBzdyBuZWVkcworCQkgKiB0byBjYWNoZSB0aGUgZmlyc3Qgc3ViZnJtIG1wZHUgaGVhZGVyIHRvIGdlbmVyYXRlIHRoZQorCQkgKiBzdWJzZXF1ZW50IHN1YmZybSdzIDgwMi4xMSBoZWFkZXIuCisJCSAqLworCQlUWFJYX0FTU0VSVDIoaW5mby0+aGRyX2xlbiAhPSAwKTsKKwkJc3RhdHVzID0gb2xfcnhfZGVjYXBfc3ViZnJtX2Ftc2R1KHZkZXYsIG1zZHUsIGluZm8pOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IG9sX3J4X2RlY2FwX21zZHUodmRldiwgbXNkdSwgaW5mbyk7CisJfQorCisJaWYgKGluZm8tPmlzX21zZHVfY21wbF9tcGR1KQorCQlpbmZvLT5pc19zdWJmcm0gPSBpbmZvLT5pc19maXJzdF9zdWJmcm0gPSBpbmZvLT5oZHJfbGVuID0gMDsKKworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC9vbF90eHJ4X2VuY2FwLmggYi9jb3JlL2RwL3R4cngvb2xfdHhyeF9lbmNhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTViM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfdHhyeF9lbmNhcC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIG9sX3R4cnhfZW5jYXAuaAorICogQGJyaWVmIGRlZmluaXRpb25zIGZvciB0eHJ4IGVuY2FwL2RlY2FwIGZ1bmN0aW9uIGFuZCBzdHJ1Y3QKKyAqLworI2lmbmRlZiBfT0xfVFhSWF9FTkNBUF9fSF8KKyNkZWZpbmUgX09MX1RYUlhfRU5DQVBfX0hfCisKKyNpZmRlZiBRQ0FfU1VQUE9SVF9TV19UWFJYX0VOQ0FQCisKKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgICAgIC8qIGNkZl9uYnVmX3QgKi8KKyNpbmNsdWRlIDxjZHNfaWVlZTgwMjExX2NvbW1vbi5oPiAgIC8qIGllZWU4MDIxMV9xb3NmcmFtZV9odGNfYWRkcjQgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+ICAgICAgICAgIC8qIG9sX3R4X2Rlc2NfdCwgb2xfdHhyeF9tc2R1X2luZm9fdCAqLworCisvKioKKyAqIEBicmllZiBFbmNhcCBvdXRnb2luZyBmcm0gZnJvbSBPUyBkZXBlbmRlbnQgZm9ybWF0IHRvIFRhcmdldAorICogICAgICAgIGFjY2VwdGFibGUgZnJtIGZvcm1hdAorICogQGRldGFpbHMKKyAqICAgICBGb3IgbmF0aXZlIHdpZmkgZm9ybWF0LCB0aGUgZnVuY3Rpb24gd2lsbCBhZGQgUW9zIGNvbnRyb2wgZmllbGQKKyAqICBiYXNlZCBvbiBwZWVyJ3MgUU9TIGNhcGJhYmlsaXRpZXMgLgorICogICAgIEZvciA4MDIuMyBmb3JtYXQsIHRoZSBmdW5jdGlvbiB3aWxsIHRyYW5zZm9ybSB0byA4MDIuMTEgZm9ybWF0CisgKiAgd2l0aCBvciB3aXRob3V0IFFPUyBjb250cm9sIGZpZWxkIGJhc2VkIG9uIHBlZXIncyBRT1MgY2FwYWJpbGl0ZXMuCisgKiBAcGFyYW0gdmRldiAtIGhhbmRsZSB0byB2ZGV2IG9iamVjdAorICogQHBhcmFtIHR4X2Rlc2MgLSB0eCBkZXNjIHN0cnVjdCxzb21lIGZpZWxkcyB3aWxsIGJlIHVwZGF0ZWQuCisgKiBAcGFyYW0gbXNkdSAtIGNkZl9uYnVmX3QKKyAqIEBwYXJhbSBtc2R1X2luZm8gLSBpbmZvcm1hdGlvbnMgZnJvbSB0eCBjbGFzc2lmaWNhdGlvbi4KKyAqIEByZXR1cm4KKyAqICAgICBBX09LOiBlbmNhcCBvcGVyYXRpb24gc3VjZXNzZnVsCisgKiAgICAgb3RoZXI6IG9wZXJhdGlvbiBmYWlsZWQsdGhlIG1zZHUgbmVlZCBiZSBkcm9wcGVkLgorICovCitBX1NUQVRVUworb2xfdHhfZW5jYXAoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCSAgICBzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjLAorCSAgICBjZGZfbmJ1Zl90IG1zZHUsIHN0cnVjdCBvbF90eHJ4X21zZHVfaW5mb190ICptc2R1X2luZm8pOworCitzdHJ1Y3Qgb2xfcnhfZGVjYXBfaW5mb190IHsKKwl1aW50OF90IGhkcltzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NmcmFtZV9odGNfYWRkcjQpXTsKKwlpbnQgaGRyX2xlbjsKKwl1aW50OF90IGlzX3N1YmZybToxLCBpc19maXJzdF9zdWJmcm06MSwgaXNfbXNkdV9jbXBsX21wZHU6MTsKK307CisKKy8qKgorICogQGJyaWVmIGRlY2FwIGluY29taW5nIGZybSBmcm9tIFRhcmdldCB0byBIb3N0IE9TCisgKiAgICAgICAgYWNjZXB0YWJsZSBmcm0gZm9ybWF0CisgKiBAZGV0YWlscworICogICAgIEZvciBuYXRpdmUgd2lmaSBmb3JtYXQsIHRoZSBmdW5jdGlvbiB3aWxsIHJlbW92ZSBRb3MgY29udHJvbCBmaWVsZAorICogIGFuZCBIVCBjb250cm9sIGZpZWxkIGlmIGFueS4KKyAqICAgICBGb3IgODAyLjMgZm9ybWF0LCB0aGUgZnVuY3Rpb24gd2lsbCB3aWxsIGRvIGxsYyBzbmFwIGhlYWRlciBwcm9jZXNzCisgKiAgaWYgVGFyZ2V0IGhhdmVuJ3QgZG9uZSB0aGF0LgorICogQHBhcmFtIHZkZXYgLSBoYW5kbGUgdG8gdmRldiBvYmplY3QKKyAqIEBwYXJhbSBwZWVyIC0gdGhlIHBlZXIgb2JqZWN0LgorICogQHBhcmFtIG1zZHUgLSBjZGZfbmJ1Zl90CisgKiBAcGFyYW0gaW5mbyAtIG9sX3J4X2RlY2FwX2luZm9fdDogY29udGV4dCBpbmZvIGZvciBkZWNhcAorICogQHJldHVybgorICogICAgIEFfT0s6IGRlY2FwIG9wZXJhdGlvbiBzdWNlc3NmdWwKKyAqICAgICBvdGhlcjogb3BlcmF0aW9uIGZhaWxlZCx0aGUgbXNkdSBuZWVkIGJlIGRyb3BwZWQuCisgKi8KK0FfU1RBVFVTCitvbF9yeF9kZWNhcChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsCisJICAgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkgICAgY2RmX25idWZfdCBtc2R1LCBzdHJ1Y3Qgb2xfcnhfZGVjYXBfaW5mb190ICppbmZvKTsKKworc3RhdGljIGlubGluZSBBX1NUQVRVUworT0xfVFhfRU5DQVAoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCSAgICBzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjLAorCSAgICBjZGZfbmJ1Zl90IG1zZHUsIHN0cnVjdCBvbF90eHJ4X21zZHVfaW5mb190ICptc2R1X2luZm8pCit7CisJaWYgKHZkZXYtPnBkZXYtPnN3X3R4X2VuY2FwKQorCQlyZXR1cm4gb2xfdHhfZW5jYXAodmRldiwgdHhfZGVzYywgbXNkdSwgbXNkdV9pbmZvKTsKKwlyZXR1cm4gQV9PSzsKK30KKworc3RhdGljIGlubGluZSBBX1NUQVRVUworT0xfUlhfREVDQVAoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCSAgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJICAgIGNkZl9uYnVmX3QgbXNkdSwgc3RydWN0IG9sX3J4X2RlY2FwX2luZm9fdCAqaW5mbykKK3sKKwlpZiAodmRldi0+cGRldi0+c3dfcnhfZGVjYXApCisJCXJldHVybiBvbF9yeF9kZWNhcCh2ZGV2LCBwZWVyLCBtc2R1LCBpbmZvKTsKKwlyZXR1cm4gQV9PSzsKK30KKworI2RlZmluZSBPTF9UWF9SRVNUT1JFX0hEUihfX3R4X2Rlc2MsIF9fbXNkdSkgIFwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChfX3R4X2Rlc2MtPm9yaWdfbDJfaGRyX2J5dGVzICE9IDApCQkJXAorCQkJY2RmX25idWZfcHVzaF9oZWFkKF9fbXNkdSwJCQlcCisJCQkJCSAgIF9fdHhfZGVzYy0+b3JpZ19sMl9oZHJfYnl0ZXMpOyBcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIE9MX1RYX0VOQ0FQKHZkZXYsIHR4X2Rlc2MsIG1zZHUsIG1zZHVfaW5mbykgQV9PSworI2RlZmluZSBPTF9SWF9ERUNBUCh2ZGV2LCBwZWVyLCBtc2R1LCBpbmZvKSBBX09LCisjZGVmaW5lIE9MX1RYX1JFU1RPUkVfSERSKF9fdHhfZGVzYywgX19tc2R1KQorI2VuZGlmCisjZW5kaWYgLyogX09MX1RYUlhfRU5DQVBfX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfdHhyeF9ldmVudC5jIGIvY29yZS9kcC90eHJ4L29sX3R4cnhfZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDEwYTE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L29sX3R4cnhfZXZlbnQuYwpAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgIm9sX3R4cnhfdHlwZXMuaCIKKworI2lmZGVmIFdESV9FVkVOVF9FTkFCTEUKKworc3RhdGljIGlubGluZSB3ZGlfZXZlbnRfc3Vic2NyaWJlICp3ZGlfZXZlbnRfbmV4dF9zdWIod2RpX2V2ZW50X3N1YnNjcmliZSAqCisJCQkJCQkgICAgICB3ZGlfc3ViKQoreworCWlmICghd2RpX3N1YikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJJbnZhbGlkIHN1YnNjcmliZXIgaW4gJXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB3ZGlfc3ViLT5wcml2Lm5leHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord2RpX2V2ZW50X2RlbF9zdWJzKHdkaV9ldmVudF9zdWJzY3JpYmUgKndkaV9zdWIsIGludCBldmVudF9pbmRleCkKK3sKKwl3ZGlfZXZlbnRfbm90aWZ5IGRlYWxsb2NhdGVfc3ViOworCXdoaWxlICh3ZGlfc3ViKSB7CisJCXdkaV9ldmVudF9zdWJzY3JpYmUgKm5leHQgPSB3ZGlfZXZlbnRfbmV4dF9zdWIod2RpX3N1Yik7CisJCS8qCisJCSAqICBDb250ZXh0IGlzIE5VTEwgZm9yIHN0YXRpYyBhbGxvY2F0aW9uIG9mIHN1YnMKKwkJICogIEluIGR5bmFtaWMgYWxsb2NhdGlvbiBjYXNlIG5vdGlmeSB0aGUgdXNlcgorCQkgKi8KKwkJaWYgKHdkaV9zdWItPmNvbnRleHQpIHsKKwkJCWRlYWxsb2NhdGVfc3ViID0gd2RpX3N1Yi0+Y29udGV4dDsKKwkJCWRlYWxsb2NhdGVfc3ViKFdESV9FVkVOVF9TVUJfREVBTExPQ0FURSwKKwkJCQkgICAgICAgV0RJX0VWRU5UX0JBU0UgKyBldmVudF9pbmRleCk7CisJCX0KKwkJd2RpX3N1YiA9IG5leHQ7CisJfQorCS8qIGNkZl9tZW1fZnJlZSh3ZGlfc3ViKTsgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkCit3ZGlfZXZlbnRfaXRlcl9zdWIoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkgICB1aW50MzJfdCBldmVudF9pbmRleCwKKwkJICAgd2RpX2V2ZW50X3N1YnNjcmliZSAqd2RpX3N1Yiwgdm9pZCAqZGF0YSkKK3sKKwllbnVtIFdESV9FVkVOVCBldmVudCA9IGV2ZW50X2luZGV4ICsgV0RJX0VWRU5UX0JBU0U7CisKKwlpZiAod2RpX3N1YikgeworCQlkbyB7CisJCQl3ZGlfc3ViLT5jYWxsYmFjayhwZGV2LCBldmVudCwgZGF0YSk7CisJCX0gd2hpbGUgKCh3ZGlfc3ViID0gd2RpX2V2ZW50X25leHRfc3ViKHdkaV9zdWIpKSk7CisJfQorfQorCit2b2lkCit3ZGlfZXZlbnRfaGFuZGxlcihlbnVtIFdESV9FVkVOVCBldmVudCwKKwkJICBzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnR4cnhfcGRldiwgdm9pZCAqZGF0YSkKK3sKKwl1aW50MzJfdCBldmVudF9pbmRleDsKKwl3ZGlfZXZlbnRfc3Vic2NyaWJlICp3ZGlfc3ViOworCS8qCisJICogSW5wdXQgdmFsaWRhdGlvbgorCSAqLworCWlmICghZXZlbnQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW52YWxpZCBXREkgZXZlbnQgaW4gJXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXR4cnhfcGRldikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJJbnZhbGlkIHBkZXYgaW4gV0RJIGV2ZW50IGhhbmRsZXJcbiIpOworCQlyZXR1cm47CisJfQorCS8qCisJICogIFRoZXJlIGNhbiBiZSBOVUxMIGRhdGEsIHNvIG5vIHZhbGlkYXRpb24gZm9yIHRoZSBkYXRhCisJICogIFN1YnNjcmliZXJzIG11c3QgZG8gdGhlIHNhbml0eSBiYXNlZCBvbiB0aGUgcmVxdWlyZW1lbnRzCisJICovCisJZXZlbnRfaW5kZXggPSBldmVudCAtIFdESV9FVkVOVF9CQVNFOworCisJd2RpX3N1YiA9IHR4cnhfcGRldi0+d2RpX2V2ZW50X2xpc3RbZXZlbnRfaW5kZXhdOworCisJLyogRmluZCB0aGUgc3Vic2NyaWJlciAqLworCXdkaV9ldmVudF9pdGVyX3N1Yih0eHJ4X3BkZXYsIGV2ZW50X2luZGV4LCB3ZGlfc3ViLCBkYXRhKTsKK30KKworQV9TVEFUVVMKK3dkaV9ldmVudF9zdWIoc3RydWN0IG9sX3R4cnhfcGRldl90ICp0eHJ4X3BkZXYsCisJICAgICAgd2RpX2V2ZW50X3N1YnNjcmliZSAqZXZlbnRfY2Jfc3ViLCBlbnVtIFdESV9FVkVOVCBldmVudCkKK3sKKwl1aW50MzJfdCBldmVudF9pbmRleDsKKwl3ZGlfZXZlbnRfc3Vic2NyaWJlICp3ZGlfc3ViOworCS8qIElucHV0IHZhbGlkYXRpb24gKi8KKwlpZiAoIXR4cnhfcGRldikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJJbnZhbGlkIHR4cnhfcGRldiBpbiAlcyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCWlmICghZXZlbnRfY2Jfc3ViKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkludmFsaWQgY2FsbGJhY2sgaW4gJXMiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBBX0VSUk9SOworCX0KKwlpZiAoKCFldmVudCkgfHwgKGV2ZW50ID49IFdESV9FVkVOVF9MQVNUKSB8fCAoZXZlbnQgPCBXRElfRVZFTlRfQkFTRSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW52YWxpZCBldmVudCBpbiAlcyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCS8qIElucHV0IHZhbGlkYXRpb24gKi8KKwlldmVudF9pbmRleCA9IGV2ZW50IC0gV0RJX0VWRU5UX0JBU0U7CisKKwl3ZGlfc3ViID0gdHhyeF9wZGV2LT53ZGlfZXZlbnRfbGlzdFtldmVudF9pbmRleF07CisJLyoKKwkgKiAgQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IHN1YnNjcmliZXIgb2YgdGhlIGV2ZW50CisJICovCisJaWYgKCF3ZGlfc3ViKSB7CisJCXdkaV9zdWIgPSBldmVudF9jYl9zdWI7CisJCXdkaV9zdWItPnByaXYubmV4dCA9IE5VTEw7CisJCXdkaV9zdWItPnByaXYucHJldiA9IE5VTEw7CisJCXR4cnhfcGRldi0+d2RpX2V2ZW50X2xpc3RbZXZlbnRfaW5kZXhdID0gd2RpX3N1YjsKKwkJcmV0dXJuIEFfT0s7CisJfQorCWV2ZW50X2NiX3N1Yi0+cHJpdi5uZXh0ID0gd2RpX3N1YjsKKwlldmVudF9jYl9zdWItPnByaXYucHJldiA9IE5VTEw7CisJd2RpX3N1Yi0+cHJpdi5wcmV2ID0gZXZlbnRfY2Jfc3ViOworCXR4cnhfcGRldi0+d2RpX2V2ZW50X2xpc3RbZXZlbnRfaW5kZXhdID0gZXZlbnRfY2Jfc3ViOworCisJcmV0dXJuIEFfT0s7Cit9CisKK0FfU1RBVFVTCit3ZGlfZXZlbnRfdW5zdWIoc3RydWN0IG9sX3R4cnhfcGRldl90ICp0eHJ4X3BkZXYsCisJCXdkaV9ldmVudF9zdWJzY3JpYmUgKmV2ZW50X2NiX3N1YiwgZW51bSBXRElfRVZFTlQgZXZlbnQpCit7CisJdWludDMyX3QgZXZlbnRfaW5kZXggPSBldmVudCAtIFdESV9FVkVOVF9CQVNFOworCisJLyogSW5wdXQgdmFsaWRhdGlvbiAqLworCWlmICghZXZlbnRfY2Jfc3ViKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkludmFsaWQgY2FsbGJhY2sgaW4gJXMiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBBX0VSUk9SOworCX0KKwlpZiAoIWV2ZW50X2NiX3N1Yi0+cHJpdi5wcmV2KSB7CisJCXR4cnhfcGRldi0+d2RpX2V2ZW50X2xpc3RbZXZlbnRfaW5kZXhdID0KKwkJCWV2ZW50X2NiX3N1Yi0+cHJpdi5uZXh0OworCX0gZWxzZSB7CisJCWV2ZW50X2NiX3N1Yi0+cHJpdi5wcmV2LT5wcml2Lm5leHQgPSBldmVudF9jYl9zdWItPnByaXYubmV4dDsKKwl9CisJaWYgKGV2ZW50X2NiX3N1Yi0+cHJpdi5uZXh0KQorCQlldmVudF9jYl9zdWItPnByaXYubmV4dC0+cHJpdi5wcmV2ID0gZXZlbnRfY2Jfc3ViLT5wcml2LnByZXY7CisKKwkvKiBjZGZfbWVtX2ZyZWUoZXZlbnRfY2Jfc3ViKTsgKi8KKworCXJldHVybiBBX09LOworfQorCitBX1NUQVRVUyB3ZGlfZXZlbnRfYXR0YWNoKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqdHhyeF9wZGV2KQoreworCS8qIElucHV0IHZhbGlkYXRpb24gKi8KKwlpZiAoIXR4cnhfcGRldikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJJbnZhbGlkIGRldmljZSBpbiAlc1xuV0RJIGV2ZW50IGF0dGFjaCBmYWlsZWQiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiBBX0VSUk9SOworCX0KKwkvKiBTZXBhcmF0ZSBzdWJzY3JpYmVyIGxpc3QgZm9yIGVhY2ggZXZlbnQgKi8KKwl0eHJ4X3BkZXYtPndkaV9ldmVudF9saXN0ID0gKHdkaV9ldmVudF9zdWJzY3JpYmUgKiopCisJCQkJICAgIGNkZl9tZW1fbWFsbG9jKAorCQkJCQkgICAgc2l6ZW9mKHdkaV9ldmVudF9zdWJzY3JpYmUgKikgKgorCQkJCQkgICAgV0RJX05VTV9FVkVOVFMpOworCWlmICghdHhyeF9wZGV2LT53ZGlfZXZlbnRfbGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciB0aGUgV0RJIGV2ZW50IGxpc3RzXG4iKTsKKwkJcmV0dXJuIEFfTk9fTUVNT1JZOworCX0KKwlyZXR1cm4gQV9PSzsKK30KKworQV9TVEFUVVMgd2RpX2V2ZW50X2RldGFjaChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnR4cnhfcGRldikKK3sKKwlpbnQgaTsKKwl3ZGlfZXZlbnRfc3Vic2NyaWJlICp3ZGlfc3ViOworCWlmICghdHhyeF9wZGV2KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkludmFsaWQgZGV2aWNlIGluICVzXG5XREkgZGV0YWNoIGZhaWxlZCIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCWlmICghdHhyeF9wZGV2LT53ZGlfZXZlbnRfbGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogd2RpX2V2ZW50X2xpc3QgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFdESV9OVU1fRVZFTlRTOyBpKyspIHsKKwkJd2RpX3N1YiA9IHR4cnhfcGRldi0+d2RpX2V2ZW50X2xpc3RbaV07CisJCWlmICh3ZGlfc3ViKSB7CisJCQkvKiBEZWxldGUgYWxsIHRoZSBzdWJzY3JpYmVycyAqLworCQkJd2RpX2V2ZW50X2RlbF9zdWJzKHdkaV9zdWIsIGkpOworCQl9CisJfQorCS8qIHR4cnhfcGRldi0+d2RpX2V2ZW50X2xpc3Qgd291bGQgYmUgbm9uLW51bGwgKi8KKwljZGZfbWVtX2ZyZWUodHhyeF9wZGV2LT53ZGlfZXZlbnRfbGlzdCk7CisJcmV0dXJuIEFfT0s7Cit9CisKKyNlbmRpZiAvKiBXRElfRVZFTlRfRU5BQkxFICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfdHhyeF9mbG93X2NvbnRyb2wuYyBiL2NvcmUvZHAvdHhyeC9vbF90eHJ4X2Zsb3dfY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzU5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfdHhyeF9mbG93X2NvbnRyb2wuYwpAQCAtMCwwICsxLDcwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qIE9TIGFic3RyYWN0aW9uIGxpYnJhcmllcyAqLworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90LCBldGMuICovCisjaW5jbHVkZSA8Y2RmX2F0b21pYy5oPiAgICAgICAgIC8qIGNkZl9hdG9taWNfcmVhZCwgZXRjLiAqLworI2luY2x1ZGUgPGNkZl91dGlsLmg+ICAgICAgICAgICAvKiBjZGZfdW5saWtlbHkgKi8KKworLyogQVBJcyBmb3Igb3RoZXIgbW9kdWxlcyAqLworI2luY2x1ZGUgPGh0dC5oPiAgICAgICAgICAgICAgICAvKiBIVFRfVFhfRVhUX1RJRF9NR01UICovCisjaW5jbHVkZSA8b2xfaHR0X3R4X2FwaS5oPiAgICAgIC8qIGh0dF90eF9kZXNjX3RpZCAqLworI2luY2x1ZGUgPG9sX3R4cnhfYXBpLmg+ICAgICAgICAvKiBvbF90eHJ4X3ZkZXZfaGFuZGxlICovCisjaW5jbHVkZSA8b2xfdHhyeF9jdHJsX2FwaS5oPiAgIC8qIG9sX3R4cnhfc3luYyAqLworCisvKiBpbnRlcm5hbCBoZWFkZXIgZmlsZXMgcmVsZXZhbnQgZm9yIGFsbCBzeXN0ZW1zICovCisjaW5jbHVkZSA8b2xfdHhyeF9pbnRlcm5hbC5oPiAgIC8qIFRYUlhfQVNTRVJUMSAqLworI2luY2x1ZGUgPG9sX3R4cnhfdHlwZXMuaD4gICAgICAvKiBwZGV2IHN0YXRzICovCisjaW5jbHVkZSA8b2xfdHhfZGVzYy5oPiAgICAgICAgIC8qIG9sX3R4X2Rlc2MgKi8KKyNpbmNsdWRlIDxvbF90eF9zZW5kLmg+ICAgICAgICAgLyogb2xfdHhfc2VuZCAqLworI2luY2x1ZGUgPG9sX3R4cnguaD4KKworLyogaW50ZXJuYWwgaGVhZGVyIGZpbGVzIHJlbGV2YW50IG9ubHkgZm9yIEhMIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxvbF90eF9xdWV1ZS5oPiAgICAgICAgLyogb2xfdHhfZW5xdWV1ZSAqLworCisvKiBpbnRlcm5hbCBoZWFkZXIgZmlsZXMgcmVsZXZhbnQgb25seSBmb3Igc3BlY2lmaWMgc3lzdGVtcyAoUHJvbnRvKSAqLworI2luY2x1ZGUgPG9sX3R4cnhfZW5jYXAuaD4gICAgICAvKiBPTF9UWF9FTkNBUCwgZXRjICovCisjaW5jbHVkZSA8b2xfdHguaD4KKyNpbmNsdWRlIDxvbF9jZmcuaD4KKworI2RlZmluZSBUWF9GTE9XX1NUQVJUX1RIIDI1CisjZGVmaW5lIFRYX0ZMT1dfU1RPUF9USCAxMAorI2RlZmluZSBJTlZBTElEX0ZMT1dfSUQgMHhGRgorI2RlZmluZSBNQVhfSU5WQUxJRF9CSU4gMworCisKKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19HTE9CQUxfTUdNVF9QT09MCisjZGVmaW5lIFRYX0ZMT1dfTUdNVF9QT09MX0lECTB4RUYKKyNkZWZpbmUgVFhfRkxPV19NR01UX1BPT0xfU0laRSAgMzIKKworLyoqCisgKiBvbF90eF9yZWdpc3Rlcl9nbG9iYWxfbWdtdF9wb29sKCkgLSByZWdpc3RlciBnbG9iYWwgcG9vbCBmb3IgbWdtdCBwYWNrZXRzCisgKiBAcGRldjogcGRldiBoYW5kbGVyCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCitvbF90eF9yZWdpc3Rlcl9nbG9iYWxfbWdtdF9wb29sKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwlwZGV2LT5tZ210X3Bvb2wgPSBvbF90eF9jcmVhdGVfZmxvd19wb29sKFRYX0ZMT1dfTUdNVF9QT09MX0lELAorCQkJCQkJIFRYX0ZMT1dfTUdNVF9QT09MX1NJWkUpOworCWlmICghcGRldi0+bWdtdF9wb29sKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkgIk1hbmFnZW1lbnQgcG9vbCBjcmVhdGlvbiBmYWlsZWRcbiIpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogb2xfdHhfZGVyZWdpc3Rlcl9nbG9iYWxfbWdtdF9wb29sKCkgLSBEZXJlZ2lzdGVyIGdsb2JhbCBwb29sIGZvciBtZ210IHBhY2tldHMKKyAqIEBwZGV2OiBwZGV2IGhhbmRsZXIKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQKK29sX3R4X2RlcmVnaXN0ZXJfZ2xvYmFsX21nbXRfcG9vbChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpCit7CisJb2xfdHhfZGVsZXRlX2Zsb3dfcG9vbChwZGV2LT5tZ210X3Bvb2wpOworCXJldHVybjsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK29sX3R4X3JlZ2lzdGVyX2dsb2JhbF9tZ210X3Bvb2woc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZAorb2xfdHhfZGVyZWdpc3Rlcl9nbG9iYWxfbWdtdF9wb29sKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYKKworLyoqCisgKiBvbF90eF9yZWdpc3Rlcl9mbG93X2NvbnRyb2woKSAtIFJlZ2lzdGVyIGZ3IGJhc2VkIHR4IGZsb3cgY29udHJvbAorICogQHBkZXY6IHBkZXYgaGFuZGxlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgb2xfdHhfcmVnaXN0ZXJfZmxvd19jb250cm9sKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwljZGZfc3BpbmxvY2tfaW5pdCgmcGRldi0+dHhfZGVzYy5mbG93X3Bvb2xfbGlzdF9sb2NrKTsKKwlUQUlMUV9JTklUKCZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0KTsKKworCW9sX3R4X3JlZ2lzdGVyX2dsb2JhbF9tZ210X3Bvb2wocGRldik7Cit9CisKKy8qKgorICogb2xfdHhfZGVyZWdpc3Rlcl9mbG93X2NvbnRyb2woKSAtIERlcmVnaXN0ZXIgZncgYmFzZWQgdHggZmxvdyBjb250cm9sCisgKiBAcGRldjogcGRldiBoYW5kbGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBvbF90eF9kZXJlZ2lzdGVyX2Zsb3dfY29udHJvbChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpCit7CisJb2xfdHhfZGVyZWdpc3Rlcl9nbG9iYWxfbWdtdF9wb29sKHBkZXYpOworCisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJnBkZXYtPnR4X2Rlc2MuZmxvd19wb29sX2xpc3RfbG9jayk7CisJaWYgKCFUQUlMUV9FTVBUWSgmcGRldi0+dHhfZGVzYy5mbG93X3Bvb2xfbGlzdCkpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJCSJmbG93IHBvb2wgbGlzdCBpcyBub3QgZW1wdHkhISFcbiIpOworCX0KK30KKworLyoqCisgKiBvbF90eF9kdW1wX2Zsb3dfcG9vbF9pbmZvKCkgLSBkdW1wIGdsb2JhbF9wb29sIGFuZCBmbG93X3Bvb2wgaW5mbworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIG9sX3R4X2R1bXBfZmxvd19wb29sX2luZm8odm9pZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnBvb2wgPSBOVUxMOworCXN0cnVjdCBvbF90eF9mbG93X3Bvb2xfdCB0bXBfcG9vbDsKKworCisJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwgIkdsb2JhbCBQb29sXG4iKTsKKwlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLCAiVG90YWwgJWQgOjogQXZhaWxhYmxlICVkXG4iLAorCQlwZGV2LT50eF9kZXNjLnBvb2xfc2l6ZSwgcGRldi0+dHhfZGVzYy5udW1fZnJlZSk7CisJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwgIkludmFsaWQgZmxvd19wb29sICVkXG4iLAorCQlwZGV2LT50eF9kZXNjLm51bV9pbnZhbGlkX2Jpbik7CisKKwlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLCAiTm8gb2YgcG9vbCBtYXAgcmVjZWl2ZWQgJWRcbiIsCisJCXBkZXYtPnBvb2xfc3RhdHMucG9vbF9tYXBfY291bnQpOworCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsICJObyBvZiBwb29sIHVubWFwIHJlY2VpdmVkICVkXG4iLAorCQlwZGV2LT5wb29sX3N0YXRzLnBvb2xfdW5tYXBfY291bnQpOworCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCSJQa3QgZHJvcHBlZCBkdWUgdG8gdW5hdmFpbGFibGl0eSBvZiBwb29sICVkXG4iLAorCQlwZGV2LT5wb29sX3N0YXRzLnBrdF9kcm9wX25vX3Bvb2wpOworCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCSJQa3QgZHJvcHBlZCBkdWUgdG8gdW5hdmFpbGFibGl0eSBvZiBkZXNjcmlwdG9ycyAlZFxuIiwKKwkJcGRldi0+cG9vbF9zdGF0cy5wa3RfZHJvcF9ub19kZXNjKTsKKworCS8qCisJICogTmVzdGVkIHNwaW4gbG9jay4KKwkgKiBBbHdheXMgdGFrZSBpbiBiZWxvdyBvcmRlci4KKwkgKiBmbG93X3Bvb2xfbGlzdF9sb2NrIC0+IGZsb3dfcG9vbF9sb2NrCisJICovCisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+dHhfZGVzYy5mbG93X3Bvb2xfbGlzdF9sb2NrKTsKKwlUQUlMUV9GT1JFQUNIKHBvb2wsICZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0LAorCQkJCQkgZmxvd19wb29sX2xpc3RfZWxlbSkgeworCQljZGZfc3Bpbl9sb2NrX2JoKCZwb29sLT5mbG93X3Bvb2xfbG9jayk7CisJCWNkZl9tZW1fY29weSgmdG1wX3Bvb2wsIHBvb2wsIHNpemVvZih0bXBfcG9vbCkpOworCQljZGZfc3Bpbl91bmxvY2tfYmgoJnBvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0X2xvY2spOworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJIkZsb3dfcG9vbF9pZCAlZCA6OiBzdGF0dXMgJWRcbiIsCisJCQl0bXBfcG9vbC5mbG93X3Bvb2xfaWQsIHRtcF9wb29sLnN0YXR1cyk7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkiVG90YWwgJWQgOjogQXZhaWxhYmxlICVkIDo6IERlZmljaWVudCAlZFxuIiwKKwkJCXRtcF9wb29sLmZsb3dfcG9vbF9zaXplLCB0bXBfcG9vbC5hdmFpbF9kZXNjLAorCQkJdG1wX3Bvb2wuZGVmaWNpZW50X2Rlc2MpOworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJIlN0YXJ0X1RIICVkIDo6IFN0b3BfVEggJWRcbiIsCisJCQkgdG1wX3Bvb2wuc3RhcnRfdGgsIHRtcF9wb29sLnN0b3BfdGgpOworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJIk1lbWJlciBmbG93X2lkICAlZCA6OiBmbG93X3R5cGUgJWRcbiIsCisJCQl0bXBfcG9vbC5tZW1iZXJfZmxvd19pZCwgdG1wX3Bvb2wuZmxvd190eXBlKTsKKwkJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+dHhfZGVzYy5mbG93X3Bvb2xfbGlzdF9sb2NrKTsKKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0X2xvY2spOworCisJcmV0dXJuOworfQorCisvKioKKyAqIG9sX3R4X2NsZWFyX2Zsb3dfcG9vbF9zdGF0cygpIC0gY2xlYXIgZmxvdyBwb29sIHN0YXRpc3RpY3MKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBvbF90eF9jbGVhcl9mbG93X3Bvb2xfc3RhdHModm9pZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKworCWlmICghcGRldikgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLCAiJXM6IHBkZXYgaXMgbnVsbFxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV96ZXJvKCZwZGV2LT5wb29sX3N0YXRzLCBzaXplb2YocGRldi0+cG9vbF9zdGF0cykpOworfQorCisvKioKKyAqIG9sX3R4X21vdmVfZGVzY19uKCkgLSBNb3ZlIG4gZGVzY3JpcHRvcnMgZnJvbSBzcmNfcG9vbCB0byBkc3RfcG9vbC4KKyAqIEBzcmNfcG9vbDogc291cmNlIHBvb2wKKyAqIEBkc3RfcG9vbDogZGVzdGluYXRpb24gcG9vbAorICogQGRlc2NfbW92ZV9jb3VudDogZGVzY3JpcHRvciBtb3ZlIGNvdW50CisgKgorICogUmV0dXJuOiBhY3R1YWwgZGVzY3JpcHRvcnMgbW92ZWQKKyAqLworc3RhdGljIGludCBvbF90eF9tb3ZlX2Rlc2NfbihzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnNyY19wb29sLAorCQkgICAgICBzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKmRzdF9wb29sLAorCQkgICAgICBpbnQgZGVzY19tb3ZlX2NvdW50KQoreworCXVpbnQxNl90IGNvdW50ID0gMCwgaTsKKwlzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjOworCXVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKnRlbXBfbGlzdCA9IE5VTEw7CisKKwkvKiBUYWtlIGRlc2NyaXB0b3JzIGZyb20gc291cmNlIHBvb2wgYW5kIHB1dCBpdCBpbiB0ZW1wX2xpc3QgKi8KKwljZGZfc3Bpbl9sb2NrX2JoKCZzcmNfcG9vbC0+Zmxvd19wb29sX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBkZXNjX21vdmVfY291bnQ7IGkrKykgeworCQl0eF9kZXNjID0gJnNyY19wb29sLT5mcmVlbGlzdC0+dHhfZGVzYzsKKwkJc3JjX3Bvb2wtPmZyZWVsaXN0ID0gc3JjX3Bvb2wtPmZyZWVsaXN0LT5uZXh0OworCQlzcmNfcG9vbC0+YXZhaWxfZGVzYy0tOworCQkoKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKil0eF9kZXNjKS0+bmV4dCA9IHRlbXBfbGlzdDsKKwkJdGVtcF9saXN0ID0gKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKil0eF9kZXNjOworCisJfQorCWNkZl9zcGluX3VubG9ja19iaCgmc3JjX3Bvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKworCS8qIFRha2UgZGVzY3JpcHRvcnMgZnJvbSB0ZW1wX2xpc3QgYW5kIHB1dCBpdCBpbiBkZXN0aW5hdGlvbiBwb29sICovCisJY2RmX3NwaW5fbG9ja19iaCgmZHN0X3Bvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGVzY19tb3ZlX2NvdW50OyBpKyspIHsKKwkJaWYgKGRzdF9wb29sLT5kZWZpY2llbnRfZGVzYykKKwkJCWRzdF9wb29sLT5kZWZpY2llbnRfZGVzYy0tOworCQllbHNlCisJCQlicmVhazsKKwkJdHhfZGVzYyA9ICZ0ZW1wX2xpc3QtPnR4X2Rlc2M7CisJCXRlbXBfbGlzdCA9IHRlbXBfbGlzdC0+bmV4dDsKKwkJdHhfZGVzYy0+cG9vbCA9IGRzdF9wb29sOworCQkoKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKil0eF9kZXNjKS0+bmV4dCA9CisJCQkJCQkJZHN0X3Bvb2wtPmZyZWVsaXN0OworCQlkc3RfcG9vbC0+ZnJlZWxpc3QgPSAodW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCAqKXR4X2Rlc2M7CisJCWRzdF9wb29sLT5hdmFpbF9kZXNjKys7CisJCWNvdW50Kys7CisJfQorCWNkZl9zcGluX3VubG9ja19iaCgmZHN0X3Bvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKworCS8qIElmIGFueXRoaW5nIGlzIHRoZXJlIGluIHRlbXBfbGlzdCBwdXQgaXQgYmFjayB0byBzb3VyY2UgcG9vbCAqLworCWNkZl9zcGluX2xvY2tfYmgoJnNyY19wb29sLT5mbG93X3Bvb2xfbG9jayk7CisJd2hpbGUgKHRlbXBfbGlzdCkgeworCQl0eF9kZXNjID0gJnRlbXBfbGlzdC0+dHhfZGVzYzsKKwkJdGVtcF9saXN0ID0gdGVtcF9saXN0LT5uZXh0OworCQl0eF9kZXNjLT5wb29sID0gc3JjX3Bvb2w7CisJCSgodW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCAqKXR4X2Rlc2MpLT5uZXh0ID0KKwkJCQkJCQlzcmNfcG9vbC0+ZnJlZWxpc3Q7CisJCXNyY19wb29sLT5mcmVlbGlzdCA9ICh1bmlvbiBvbF90eF9kZXNjX2xpc3RfZWxlbV90ICopdHhfZGVzYzsKKwkJc3JjX3Bvb2wtPmF2YWlsX2Rlc2MrKzsKKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZzcmNfcG9vbC0+Zmxvd19wb29sX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisKKy8qKgorICogb2xfdHhfZGlzdHJpYnV0ZV9kZXNjc190b19kZWZpY2llbnRfcG9vbHMoKSAtIERpc3RyaWJ1dGUgZGVzY3JpcHRvcnMKKyAqIEBzcmNfcG9vbDogc291cmNlIHBvb2wKKyAqCisgKiBEaXN0cmlidXRlIGFsbCBkZXNjcmlwdG9ycyBvZiBzb3VyY2UgcG9vbCB0byBhbGwKKyAqIGRlZmljaWVudCBwb29scyBhcyBwZXIgZmxvd19wb29sX2xpc3QuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNlc3MKKyAqLworaW50CitvbF90eF9kaXN0cmlidXRlX2Rlc2NzX3RvX2RlZmljaWVudF9wb29scyhzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnNyY19wb29sKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCXN0cnVjdCBvbF90eF9mbG93X3Bvb2xfdCAqZHN0X3Bvb2wgPSBOVUxMOworCXVpbnQxNl90IGRlc2NfY291bnQgPSBzcmNfcG9vbC0+YXZhaWxfZGVzYzsKKwl1aW50MTZfdCBkZXNjX21vdmVfY291bnQgPSAwOworCisJaWYgKCFwZGV2KSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCSAgICIlczogcGRldiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljZGZfc3Bpbl9sb2NrX2JoKCZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0X2xvY2spOworCVRBSUxRX0ZPUkVBQ0goZHN0X3Bvb2wsICZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0LAorCQkJCQkgZmxvd19wb29sX2xpc3RfZWxlbSkgeworCQljZGZfc3Bpbl9sb2NrX2JoKCZkc3RfcG9vbC0+Zmxvd19wb29sX2xvY2spOworCQlpZiAoZHN0X3Bvb2wtPmRlZmljaWVudF9kZXNjKSB7CisJCQlkZXNjX21vdmVfY291bnQgPQorCQkJCShkc3RfcG9vbC0+ZGVmaWNpZW50X2Rlc2MgPiBkZXNjX2NvdW50KSA/CisJCQkJCWRlc2NfY291bnQgOiBkc3RfcG9vbC0+ZGVmaWNpZW50X2Rlc2M7CisJCQljZGZfc3Bpbl91bmxvY2tfYmgoJmRzdF9wb29sLT5mbG93X3Bvb2xfbG9jayk7CisJCQlkZXNjX21vdmVfY291bnQgPSBvbF90eF9tb3ZlX2Rlc2NfbihzcmNfcG9vbCwKKwkJCQkJCWRzdF9wb29sLCBkZXNjX21vdmVfY291bnQpOworCQkJZGVzY19jb3VudCAtPSBkZXNjX21vdmVfY291bnQ7CisJCQljZGZfc3Bpbl9sb2NrX2JoKCZkc3RfcG9vbC0+Zmxvd19wb29sX2xvY2spOworCQl9CisJCWNkZl9zcGluX3VubG9ja19iaCgmZHN0X3Bvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKwkJaWYgKGRlc2NfY291bnQgPT0gMCkKKwkJCWJyZWFrOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnR4X2Rlc2MuZmxvd19wb29sX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIG9sX3R4X2NyZWF0ZV9mbG93X3Bvb2woKSAtIGNyZWF0ZSBmbG93IHBvb2wKKyAqIEBmbG93X3Bvb2xfaWQ6IGZsb3cgcG9vbCBpZAorICogQGZsb3dfcG9vbF9zaXplOiBmbG93IHBvb2wgc2l6ZQorICoKKyAqIFJldHVybjogZmxvd19wb29sIHBvaW50ZXIgLyBOVUxMIGZvciBlcnJvcgorICovCitzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKm9sX3R4X2NyZWF0ZV9mbG93X3Bvb2wodWludDhfdCBmbG93X3Bvb2xfaWQsCisJCQkJCQkgdWludDE2X3QgZmxvd19wb29sX3NpemUpCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJc3RydWN0IG9sX3R4X2Zsb3dfcG9vbF90ICpwb29sOworCXVpbnQxNl90IHNpemUgPSAwLCBpOworCXN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2M7CisJdW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCAqdGVtcF9saXN0ID0gTlVMTDsKKwl1aW50MzJfdCBzdG9wX3RocmVzaG9sZCA9CisJCQlvbF9jZmdfZ2V0X3R4X2Zsb3dfc3RvcF9xdWV1ZV90aChwZGV2LT5jdHJsX3BkZXYpOworCXVpbnQzMl90IHN0YXJ0X3RocmVzaG9sZCA9IHN0b3BfdGhyZXNob2xkICsKKwkJCW9sX2NmZ19nZXRfdHhfZmxvd19zdGFydF9xdWV1ZV9vZmZzZXQocGRldi0+Y3RybF9wZGV2KTsKKworCWlmICghcGRldikgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkgICAiJXM6IHBkZXYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwb29sID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwb29sKSk7CisJaWYgKCFwb29sKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCSAgICIlczogbWFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwb29sLT5mbG93X3Bvb2xfaWQgPSBmbG93X3Bvb2xfaWQ7CisJcG9vbC0+Zmxvd19wb29sX3NpemUgPSBmbG93X3Bvb2xfc2l6ZTsKKwlwb29sLT5zdGF0dXMgPSBGTE9XX1BPT0xfQUNUSVZFX1VOUEFVU0VEOworCXBvb2wtPnN0YXJ0X3RoID0gKHN0YXJ0X3RocmVzaG9sZCAqIGZsb3dfcG9vbF9zaXplKS8xMDA7CisJcG9vbC0+c3RvcF90aCA9IChzdG9wX3RocmVzaG9sZCAqIGZsb3dfcG9vbF9zaXplKS8xMDA7CisJY2RmX3NwaW5sb2NrX2luaXQoJnBvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKworCS8qIFRha2UgVFggZGVzY3JpcHRvciBmcm9tIGdsb2JhbF9wb29sIGFuZCBwdXQgaXQgaW4gdGVtcF9saXN0Ki8KKwljZGZfc3Bpbl9sb2NrX2JoKCZwZGV2LT50eF9tdXRleCk7CisJaWYgKHBkZXYtPnR4X2Rlc2MubnVtX2ZyZWUgPj0gcG9vbC0+Zmxvd19wb29sX3NpemUpCisJCXNpemUgPSBwb29sLT5mbG93X3Bvb2xfc2l6ZTsKKwllbHNlCisJCXNpemUgPSBwZGV2LT50eF9kZXNjLm51bV9mcmVlOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlwZGV2LT50eF9kZXNjLm51bV9mcmVlLS07CisJCXR4X2Rlc2MgPSAmcGRldi0+dHhfZGVzYy5mcmVlbGlzdC0+dHhfZGVzYzsKKwkJcGRldi0+dHhfZGVzYy5mcmVlbGlzdCA9IHBkZXYtPnR4X2Rlc2MuZnJlZWxpc3QtPm5leHQ7CisJCXR4X2Rlc2MtPnBvb2wgPSBwb29sOworCQkoKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKil0eF9kZXNjKS0+bmV4dCA9IHRlbXBfbGlzdDsKKwkJdGVtcF9saXN0ID0gKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKil0eF9kZXNjOworCisJfQorCWNkZl9zcGluX3VubG9ja19iaCgmcGRldi0+dHhfbXV0ZXgpOworCisJLyogcHV0IHRlbXBfbGlzdCB0byBmbG93X3Bvb2wgKi8KKwlwb29sLT5mcmVlbGlzdCA9IHRlbXBfbGlzdDsKKwlwb29sLT5hdmFpbF9kZXNjID0gc2l6ZTsKKwlwb29sLT5kZWZpY2llbnRfZGVzYyA9IHBvb2wtPmZsb3dfcG9vbF9zaXplIC0gcG9vbC0+YXZhaWxfZGVzYzsKKworCS8qIEFkZCBmbG93X3Bvb2wgdG8gZmxvd19wb29sX2xpc3QgKi8KKwljZGZfc3Bpbl9sb2NrX2JoKCZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0X2xvY2spOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0LCBwb29sLAorCQkJIGZsb3dfcG9vbF9saXN0X2VsZW0pOworCWNkZl9zcGluX3VubG9ja19iaCgmcGRldi0+dHhfZGVzYy5mbG93X3Bvb2xfbGlzdF9sb2NrKTsKKworCXJldHVybiBwb29sOworfQorCisvKioKKyAqIG9sX3R4X2RlbGV0ZV9mbG93X3Bvb2woKSAtIGRlbGV0ZSBmbG93IHBvb2wKKyAqIEBwb29sOiBmbG93IHBvb2wgcG9pbnRlcgorICoKKyAqIERlbGV0ZSBmbG93X3Bvb2wgaWYgYWxsIHR4IGRlc2NyaXB0b3JzIGFyZSBhdmFpbGFibGUuCisgKiBPdGhlcndpc2UgcHV0IGl0IGluIEZMT1dfUE9PTF9JTlZBTElEIHN0YXRlLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvcgorICovCitpbnQgb2xfdHhfZGVsZXRlX2Zsb3dfcG9vbChzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnBvb2wpCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJdWludDE2X3QgaSwgc2l6ZTsKKwl1bmlvbiBvbF90eF9kZXNjX2xpc3RfZWxlbV90ICp0ZW1wX2xpc3QgPSBOVUxMOworCXN0cnVjdCBvbF90eF9kZXNjX3QgKnR4X2Rlc2MgPSBOVUxMOworCisJaWYgKCFwb29sKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCSAgICIlczogcG9vbCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNkZl9zcGluX2xvY2tfYmgoJnBkZXYtPnR4X2Rlc2MuZmxvd19wb29sX2xpc3RfbG9jayk7CisJVEFJTFFfUkVNT1ZFKCZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0LCBwb29sLCBmbG93X3Bvb2xfbGlzdF9lbGVtKTsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnR4X2Rlc2MuZmxvd19wb29sX2xpc3RfbG9jayk7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZwb29sLT5mbG93X3Bvb2xfbG9jayk7CisJaWYgKHBvb2wtPmF2YWlsX2Rlc2MgPT0gcG9vbC0+Zmxvd19wb29sX3NpemUpCisJCXBvb2wtPnN0YXR1cyA9IEZMT1dfUE9PTF9JTkFDVElWRTsKKwllbHNlCisJCXBvb2wtPnN0YXR1cyA9IEZMT1dfUE9PTF9JTlZBTElEOworCisJLyogVGFrZSBhbGwgZnJlZSBkZXNjcmlwdG9ycyBhbmQgcHV0IGl0IGluIHRlbXBfbGlzdCAqLworCXRlbXBfbGlzdCA9IHBvb2wtPmZyZWVsaXN0OworCXNpemUgPSBwb29sLT5hdmFpbF9kZXNjOworCXBvb2wtPmZyZWVsaXN0ID0gTlVMTDsKKwlwb29sLT5hdmFpbF9kZXNjID0gMDsKKworCWlmIChwb29sLT5zdGF0dXMgPT0gRkxPV19QT09MX0lOQUNUSVZFKSB7CisJCWNkZl9zcGluX3VubG9ja19iaCgmcG9vbC0+Zmxvd19wb29sX2xvY2spOworCQkvKiBGcmVlIGZsb3dfcG9vbCAqLworCQljZGZfc3BpbmxvY2tfZGVzdHJveSgmcG9vbC0+Zmxvd19wb29sX2xvY2spOworCQljZGZfbWVtX2ZyZWUocG9vbCk7CisJfSBlbHNlIHsgLyogRkxPV19QT09MX0lOVkFMSUQgY2FzZSovCisJCXBvb2wtPmZsb3dfcG9vbF9zaXplIC09IHNpemU7CisJCXBvb2wtPmZsb3dfcG9vbF9pZCA9IElOVkFMSURfRkxPV19JRDsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwb29sLT5mbG93X3Bvb2xfbG9jayk7CisKKwkJcGRldi0+dHhfZGVzYy5udW1faW52YWxpZF9iaW4rKzsKKwkJaWYgKHBkZXYtPnR4X2Rlc2MubnVtX2ludmFsaWRfYmluID4gTUFYX0lOVkFMSURfQklOKQorCQkJQVNTRVJUKDApOworCisJCWNkZl9zcGluX2xvY2tfYmgoJnBkZXYtPnR4X2Rlc2MuZmxvd19wb29sX2xpc3RfbG9jayk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0LCBwb29sLAorCQkJCSBmbG93X3Bvb2xfbGlzdF9lbGVtKTsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0X2xvY2spOworCX0KKworCS8qIHB1dCBmcmVlIGRlc2NyaXB0b3JzIHRvIGdsb2JhbCBwb29sICovCisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+dHhfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJdHhfZGVzYyA9ICZ0ZW1wX2xpc3QtPnR4X2Rlc2M7CisJCXRlbXBfbGlzdCA9IHRlbXBfbGlzdC0+bmV4dDsKKworCQkoKHVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKil0eF9kZXNjKS0+bmV4dCA9CisJCQlwZGV2LT50eF9kZXNjLmZyZWVsaXN0OworCQlwZGV2LT50eF9kZXNjLmZyZWVsaXN0ID0KKwkJCSAodW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCAqKXR4X2Rlc2M7CisJCXBkZXYtPnR4X2Rlc2MubnVtX2ZyZWUrKzsKKworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnR4X211dGV4KTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogb2xfdHhfZnJlZV9pbnZhbGlkX2Zsb3dfcG9vbCgpIC0gZnJlZSBpbnZhbGlkIHBvb2wKKyAqIEBwb29sOiBwb29sCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGZhaWx1cmUKKyAqLworaW50IG9sX3R4X2ZyZWVfaW52YWxpZF9mbG93X3Bvb2woc3RydWN0IG9sX3R4X2Zsb3dfcG9vbF90ICpwb29sKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCisJaWYgKCghcGRldikgfHwgKCFwb29sKSB8fCAocG9vbC0+c3RhdHVzICE9IEZMT1dfUE9PTF9JTlZBTElEKSkgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkgICAiJXM6IEludmFsaWQgcG9vbC9wZGV2XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGRpcmVjbHR5IGRpc3RyaWJ1dGUgdG8gb3RoZXIgZGVmaWNpZW50IHBvb2xzICovCisJb2xfdHhfZGlzdHJpYnV0ZV9kZXNjc190b19kZWZpY2llbnRfcG9vbHMocG9vbCk7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZwb29sLT5mbG93X3Bvb2xfbG9jayk7CisJcG9vbC0+Zmxvd19wb29sX3NpemUgPSBwb29sLT5hdmFpbF9kZXNjOworCWNkZl9zcGluX3VubG9ja19iaCgmcG9vbC0+Zmxvd19wb29sX2xvY2spOworCisJcGRldi0+dHhfZGVzYy5udW1faW52YWxpZF9iaW4tLTsKKworCXJldHVybiBvbF90eF9kZWxldGVfZmxvd19wb29sKHBvb2wpOworfQorCisvKioKKyAqIG9sX3R4X2dldF9mbG93X3Bvb2woKSAtIGdldCBmbG93X3Bvb2wgZnJvbSBmbG93X3Bvb2xfaWQKKyAqIEBmbG93X3Bvb2xfaWQ6IGZsb3cgcG9vbCBpZAorICoKKyAqIFJldHVybjogZmxvd19wb29sIHB0ciAvIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK3N0cnVjdCBvbF90eF9mbG93X3Bvb2xfdCAqb2xfdHhfZ2V0X2Zsb3dfcG9vbCh1aW50OF90IGZsb3dfcG9vbF9pZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnBvb2wgPSBOVUxMOworCWJvb2wgaXNfZm91bmQgPSBmYWxzZTsKKworCWNkZl9zcGluX2xvY2tfYmgoJnBkZXYtPnR4X2Rlc2MuZmxvd19wb29sX2xpc3RfbG9jayk7CisJVEFJTFFfRk9SRUFDSChwb29sLCAmcGRldi0+dHhfZGVzYy5mbG93X3Bvb2xfbGlzdCwKKwkJCQkJIGZsb3dfcG9vbF9saXN0X2VsZW0pIHsKKwkJY2RmX3NwaW5fbG9ja19iaCgmcG9vbC0+Zmxvd19wb29sX2xvY2spOworCQlpZiAocG9vbC0+Zmxvd19wb29sX2lkID09IGZsb3dfcG9vbF9pZCkgeworCQkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwb29sLT5mbG93X3Bvb2xfbG9jayk7CisJCQlpc19mb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQljZGZfc3Bpbl91bmxvY2tfYmgoJnBvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT50eF9kZXNjLmZsb3dfcG9vbF9saXN0X2xvY2spOworCisJaWYgKGlzX2ZvdW5kID09IGZhbHNlKQorCQlwb29sID0gTlVMTDsKKworCXJldHVybiBwb29sOworCit9CisKKworLyoqCisgKiBvbF90eF9mbG93X3Bvb2xfdmRldl9tYXAoKSAtIE1hcCBmbG93X3Bvb2wgd2l0aCB2ZGV2CisgKiBAcG9vbDogZmxvd19wb29sCisgKiBAdmRldl9pZDogZmxvd19pZCAvdmRldl9pZAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIG9sX3R4X2Zsb3dfcG9vbF92ZGV2X21hcChzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnBvb2wsCisJCQkgICAgICB1aW50OF90IHZkZXZfaWQpCit7CisJb2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2OworCisJdmRldiA9IG9sX3R4cnhfZ2V0X3ZkZXZfZnJvbV92ZGV2X2lkKHZkZXZfaWQpOworCWlmICghdmRldikgeworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkgICAiJXM6IGludmFsaWQgdmRldl9pZCAlZFxuIiwKKwkJICAgX19mdW5jX18sIHZkZXZfaWQpOworCQlyZXR1cm47CisJfQorCisJdmRldi0+cG9vbCA9IHBvb2w7CisJY2RmX3NwaW5fbG9ja19iaCgmcG9vbC0+Zmxvd19wb29sX2xvY2spOworCXBvb2wtPm1lbWJlcl9mbG93X2lkID0gdmRldl9pZDsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBvbF90eF9mbG93X3Bvb2xfdmRldl91bm1hcCgpIC0gVW5tYXAgZmxvd19wb29sIGZyb20gdmRldgorICogQHBvb2w6IGZsb3dfcG9vbAorICogQHZkZXZfaWQ6IGZsb3dfaWQgL3ZkZXZfaWQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBvbF90eF9mbG93X3Bvb2xfdmRldl91bm1hcChzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnBvb2wsCisJCQkJdWludDhfdCB2ZGV2X2lkKQoreworCW9sX3R4cnhfdmRldl9oYW5kbGUgdmRldjsKKworCXZkZXYgPSBvbF90eHJ4X2dldF92ZGV2X2Zyb21fdmRldl9pZCh2ZGV2X2lkKTsKKwlpZiAoIXZkZXYpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJICAgIiVzOiBpbnZhbGlkIHZkZXZfaWQgJWRcbiIsCisJCSAgIF9fZnVuY19fLCB2ZGV2X2lkKTsKKwkJcmV0dXJuOworCX0KKworCXZkZXYtPnBvb2wgPSBOVUxMOworCWNkZl9zcGluX2xvY2tfYmgoJnBvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKwlwb29sLT5tZW1iZXJfZmxvd19pZCA9IElOVkFMSURfRkxPV19JRDsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBvb2wtPmZsb3dfcG9vbF9sb2NrKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBvbF90eF9mbG93X3Bvb2xfbWFwX2hhbmRsZXIoKSAtIE1hcCBmbG93X2lkIHdpdGggcG9vbCBvZiBkZXNjcmlwdG9ycworICogQGZsb3dfaWQ6IGZsb3cgaWQKKyAqIEBmbG93X3R5cGU6IGZsb3cgdHlwZQorICogQGZsb3dfcG9vbF9pZDogcG9vbCBpZAorICogQGZsb3dfcG9vbF9zaXplOiBwb29sIHNpemUKKyAqCisgKiBQcm9jZXNzIGJlbG93IHRhcmdldCB0byBob3N0IG1lc3NhZ2UKKyAqIEhUVF9UMkhfTVNHX1RZUEVfRkxPV19QT09MX01BUAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIG9sX3R4X2Zsb3dfcG9vbF9tYXBfaGFuZGxlcih1aW50OF90IGZsb3dfaWQsIHVpbnQ4X3QgZmxvd190eXBlLAorCQkJCSB1aW50OF90IGZsb3dfcG9vbF9pZCwgdWludDE2X3QgZmxvd19wb29sX3NpemUpCit7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJc3RydWN0IG9sX3R4X2Zsb3dfcG9vbF90ICpwb29sOworCXVpbnQ4X3QgcG9vbF9jcmVhdGUgPSAwOworCWVudW0gaHR0X2Zsb3dfdHlwZSB0eXBlID0gZmxvd190eXBlOworCisKKwlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfSU5GTzEsCisJCSIlczogZmxvd19pZCAlZCBmbG93X3R5cGUgJWQgZmxvd19wb29sX2lkICVkIGZsb3dfcG9vbF9zaXplICVkXG4iLAorCQlfX2Z1bmNfXywgZmxvd19pZCwgZmxvd190eXBlLCBmbG93X3Bvb2xfaWQsIGZsb3dfcG9vbF9zaXplKTsKKworCWlmIChjZGZfdW5saWtlbHkoIXBkZXYpKSB7CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCQkiJXM6IHBkZXYgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlwZGV2LT5wb29sX3N0YXRzLnBvb2xfbWFwX2NvdW50Kys7CisKKwlwb29sID0gb2xfdHhfZ2V0X2Zsb3dfcG9vbChmbG93X3Bvb2xfaWQpOworCWlmICghcG9vbCkgeworCQlwb29sID0gb2xfdHhfY3JlYXRlX2Zsb3dfcG9vbChmbG93X3Bvb2xfaWQsIGZsb3dfcG9vbF9zaXplKTsKKwkJaWYgKHBvb2wgPT0gTlVMTCkgeworCQkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJCQkgICAiJXM6IGNyZWF0aW9uIG9mIGZsb3dfcG9vbCAlZCBzaXplICVkIGZhaWxlZFxuIiwKKwkJCQkgICBfX2Z1bmNfXywgZmxvd19wb29sX2lkLCBmbG93X3Bvb2xfc2l6ZSk7CisJCQlyZXR1cm47CisJCX0KKwkJcG9vbF9jcmVhdGUgPSAxOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCisJY2FzZSBGTE9XX1RZUEVfVkRFVjoKKwkJb2xfdHhfZmxvd19wb29sX3ZkZXZfbWFwKHBvb2wsIGZsb3dfaWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAocG9vbF9jcmVhdGUpCisJCQlvbF90eF9kZWxldGVfZmxvd19wb29sKHBvb2wpOworCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkgICAiJXM6IGZsb3cgdHlwZSAlZCBub3Qgc3VwcG9ydGVkICEhIVxuIiwKKwkJICAgX19mdW5jX18sIHR5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogb2xfdHhfZmxvd19wb29sX3VubWFwX2hhbmRsZXIoKSAtIFVubWFwIGZsb3dfaWQgZnJvbSBwb29sIG9mIGRlc2NyaXB0b3JzCisgKiBAZmxvd19pZDogZmxvdyBpZAorICogQGZsb3dfdHlwZTogZmxvdyB0eXBlCisgKiBAZmxvd19wb29sX2lkOiBwb29sIGlkCisgKgorICogUHJvY2VzcyBiZWxvdyB0YXJnZXQgdG8gaG9zdCBtZXNzYWdlCisgKiBIVFRfVDJIX01TR19UWVBFX0ZMT1dfUE9PTF9VTk1BUAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIG9sX3R4X2Zsb3dfcG9vbF91bm1hcF9oYW5kbGVyKHVpbnQ4X3QgZmxvd19pZCwgdWludDhfdCBmbG93X3R5cGUsCisJCQkJCQkJICB1aW50OF90IGZsb3dfcG9vbF9pZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnBvb2w7CisJZW51bSBodHRfZmxvd190eXBlIHR5cGUgPSBmbG93X3R5cGU7CisKKwlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfSU5GTzEsCisJCSIlczogZmxvd19pZCAlZCBmbG93X3R5cGUgJWQgZmxvd19wb29sX2lkICVkXG4iLAorCQlfX2Z1bmNfXywgZmxvd19pZCwgZmxvd190eXBlLCBmbG93X3Bvb2xfaWQpOworCisJaWYgKGNkZl91bmxpa2VseSghcGRldikpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJCSIlczogcGRldiBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXBkZXYtPnBvb2xfc3RhdHMucG9vbF91bm1hcF9jb3VudCsrOworCisJcG9vbCA9IG9sX3R4X2dldF9mbG93X3Bvb2woZmxvd19wb29sX2lkKTsKKwlpZiAoIXBvb2wpIHsKKwkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJICAgIiVzOiBmbG93X3Bvb2wgbm90IGF2YWlsYWJsZSBmbG93X3Bvb2xfaWQgJWRcbiIsCisJCSAgIF9fZnVuY19fLCB0eXBlKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCisJY2FzZSBGTE9XX1RZUEVfVkRFVjoKKwkJb2xfdHhfZmxvd19wb29sX3ZkZXZfdW5tYXAocG9vbCwgZmxvd19pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9FUlIsCisJCSAgICIlczogZmxvdyB0eXBlICVkIG5vdCBzdXBwb3J0ZWQgISEhXG4iLAorCQkgICBfX2Z1bmNfXywgdHlwZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBvbmx5IGRlbGV0ZSBpZiBhbGwgZGVzY3JpcHRvcnMgYXJlIGF2YWlsYWJsZSAqLworCW9sX3R4X2RlbGV0ZV9mbG93X3Bvb2wocG9vbCk7CisKKwlyZXR1cm47Cit9CisKKwpkaWZmIC0tZ2l0IGEvY29yZS9kcC90eHJ4L29sX3R4cnhfaW50ZXJuYWwuaCBiL2NvcmUvZHAvdHhyeC9vbF90eHJ4X2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzMTVlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZHAvdHhyeC9vbF90eHJ4X2ludGVybmFsLmgKQEAgLTAsMCArMSw3MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX09MX1RYUlhfSU5URVJOQUxfX0hfCisjZGVmaW5lIF9PTF9UWFJYX0lOVEVSTkFMX19IXworCisjaW5jbHVkZSA8Y2RmX3V0aWwuaD4gICAgICAgICAgICAgICAvKiBjZGZfYXNzZXJ0ICovCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgICAgICAvKiBjZGZfbmJ1Zl90ICovCisjaW5jbHVkZSA8Y2RmX21lbW9yeS5oPiAgICAgICAgICAgICAvKiBjZGZfbWVtX3NldCAqLworI2luY2x1ZGUgPGNkc19pZWVlODAyMTFfY29tbW9uLmg+ICAgLyogaWVlZTgwMjExX2ZyYW1lICovCisjaW5jbHVkZSA8b2xfaHR0X3J4X2FwaS5oPiAgICAgICAgICAvKiBodHRfcnhfbXNkdV9kZXNjX2NvbXBsZXRlc19tcGR1LCBldGMuICovCisKKyNpbmNsdWRlIDxvbF90eHJ4X3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvbF90eHJ4X2RiZy5oPgorI2luY2x1ZGUgPGVuZXQuaD4gICAgICAgICAgICAgICAvKiBFVEhFUk5FVF9IRFJfTEVOLCBldGMuICovCisjaW5jbHVkZSA8aXB2NC5oPiAgICAgICAgICAgICAgIC8qIElQVjRfSERSX0xFTiwgZXRjLiAqLworI2luY2x1ZGUgPGlwdjYuaD4gICAgICAgICAgICAgICAvKiBJUFY2X0hEUl9MRU4sIGV0Yy4gKi8KKyNpbmNsdWRlIDxpcF9wcm90Lmg+ICAgICAgICAgICAgLyogSVBfUFJPVE9DT0xfVENQLCBldGMuICovCisKKyNpZmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKKyNkZWZpbmUgT0xfVFhfREVTQ19OT19SRUZTKHR4X2Rlc2MpIDEKKyNkZWZpbmUgT0xfVFhfREVTQ19SRUZfSU5JVCh0eF9kZXNjKSAgICAvKiBuby1vcCAqLworI2RlZmluZSBPTF9UWF9ERVNDX1JFRl9JTkModHhfZGVzYykgICAgIC8qIG5vLW9wICovCisjZWxzZQorI2RlZmluZSBPTF9UWF9ERVNDX05PX1JFRlModHhfZGVzYykgXAorCWNkZl9hdG9taWNfZGVjX2FuZF90ZXN0KCZ0eF9kZXNjLT5yZWZfY250KQorI2RlZmluZSBPTF9UWF9ERVNDX1JFRl9JTklUKHR4X2Rlc2MpIGNkZl9hdG9taWNfaW5pdCgmdHhfZGVzYy0+cmVmX2NudCkKKyNkZWZpbmUgT0xfVFhfREVTQ19SRUZfSU5DKHR4X2Rlc2MpIGNkZl9hdG9taWNfaW5jKCZ0eF9kZXNjLT5yZWZfY250KQorI2VuZGlmCisKKyNpZm5kZWYgVFhSWF9BU1NFUlRfTEVWRUwKKyNkZWZpbmUgVFhSWF9BU1NFUlRfTEVWRUwgMworI2VuZGlmCisKKyNpZmRlZiBfX0tMT0NXT1JLX18KKyNkZWZpbmUgVFhSWF9BU1NFUlQxKHgpIGRvIHsgaWYgKCEoeCkpIGFib3J0KCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFRYUlhfQVNTRVJUMih4KSBkbyB7IGlmICghKHgpKSBhYm9ydCgpOyB9IHdoaWxlICgwKQorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAjaWZkZWYgX19LTE9DV09SS19fICovCisKKyNpZiBUWFJYX0FTU0VSVF9MRVZFTCA+IDAKKyNkZWZpbmUgVFhSWF9BU1NFUlQxKGNvbmRpdGlvbikgY2RmX2Fzc2VydCgoY29uZGl0aW9uKSkKKyNlbHNlCisjZGVmaW5lIFRYUlhfQVNTRVJUMShjb25kaXRpb24pCisjZW5kaWYKKworI2lmIFRYUlhfQVNTRVJUX0xFVkVMID4gMQorI2RlZmluZSBUWFJYX0FTU0VSVDIoY29uZGl0aW9uKSBjZGZfYXNzZXJ0KChjb25kaXRpb24pKQorI2Vsc2UKKyNkZWZpbmUgVFhSWF9BU1NFUlQyKGNvbmRpdGlvbikKKyNlbmRpZgorI2VuZGlmIC8qICNpZmRlZiBfX0tMT0NXT1JLX18gKi8KK2VudW0geworCS8qIEZBVEFMX0VSUiAtIHByaW50IG9ubHkgaXJyZWNvdmVyYWJsZSBlcnJvciBtZXNzYWdlcyAqLworCVRYUlhfUFJJTlRfTEVWRUxfRkFUQUxfRVJSLAorCisJLyogRVJSIC0gaW5jbHVkZSBub24tZmF0YWwgZXJyIG1lc3NhZ2VzICovCisJVFhSWF9QUklOVF9MRVZFTF9FUlIsCisKKwkvKiBXQVJOIC0gaW5jbHVkZSB3YXJuaW5ncyAqLworCVRYUlhfUFJJTlRfTEVWRUxfV0FSTiwKKworCS8qIElORk8xIC0gaW5jbHVkZSBmdW5kYW1lbnRhbCwgaW5mcmVxdWVudCBldmVudHMgKi8KKwlUWFJYX1BSSU5UX0xFVkVMX0lORk8xLAorCisJLyogSU5GTzIgLSBpbmNsdWRlIG5vbi1mdW5kYW1lbnRhbCBidXQgaW5mcmVxdWVudCBldmVudHMgKi8KKwlUWFJYX1BSSU5UX0xFVkVMX0lORk8yLAorCisJLyogSU5GTzMgLSBpbmNsdWRlIGZyZXF1ZW50IGV2ZW50cyAqLworCS8qIHRvIGF2b2lkIHBlcmZvcm1hbmNlIGltcGFjdCwgZG9uJ3QgdXNlIElORk8zCisJICAgdW5sZXNzIGV4cGxpY2l0bHkgZW5hYmxlZCAqLworI2lmZGVmIFRYUlhfUFJJTlRfVkVSQk9TRV9FTkFCTEUKKwlUWFJYX1BSSU5UX0xFVkVMX0lORk8zLAorI2VuZGlmIC8qIFRYUlhfUFJJTlRfVkVSQk9TRV9FTkFCTEUgKi8KK307CisKK2V4dGVybiB1bnNpZ25lZCBnX3R4cnhfcHJpbnRfbGV2ZWw7CisKKyNpZmRlZiBUWFJYX1BSSU5UX0VOQUJMRQorCisjaW5jbHVkZSA8c3RkYXJnLmg+ICAgICAgICAgICAgIC8qIHZhX2xpc3QgKi8KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4gICAgICAgICAgLyogY2RmX3ZwcmludCAqLworCisvKiBTdXByZXNzIDQyOTYgLSBleHByZXNzaW9uIGlzIGFsd2F5cyB0cnVlCisqIEl0IHdpbGwgZmlyZSBpZiBsZXZlbCBpcyBUWFJYX1BSSU5UX0xFVkVMX0ZBVEFMX0VSUiAoMCkKKyogYmVjYXVzZSBnX3R4cnhfcHJpbnRfbGV2ZWwgaXMgdW5zaWduZWQgKi8KKyNkZWZpbmUgb2xfdHhyeF9wcmludChsZXZlbCwgZm10LCAuLi4pICB7CQlcCisJCWlmIChsZXZlbCA8PSBnX3R4cnhfcHJpbnRfbGV2ZWwpCVwKKwkJCWNkZl9wcmludChmbXQsICMjIF9fVkFfQVJHU19fKTsgfQorI2RlZmluZSBUWFJYX1BSSU5UKGxldmVsLCBmbXQsIC4uLikgXAorCW9sX3R4cnhfcHJpbnQobGV2ZWwsICJUWFJYOiAiIGZtdCwgIyMgX19WQV9BUkdTX18pCisKKyNpZmRlZiBUWFJYX1BSSU5UX1ZFUkJPU0VfRU5BQkxFCisKKyNkZWZpbmUgb2xfdHhyeF9wcmludF92ZXJib3NlKGZtdCwgLi4uKSB7CQkgIFwKKwlpZiAoVFhSWF9QUklOVF9MRVZFTF9JTkZPMyA8PSBnX3R4cnhfcHJpbnRfbGV2ZWwpIFwKKwkJY2RmX3ByaW50KGZtdCwgIyMgX19WQV9BUkdTX18pOyB9CisjZGVmaW5lIFRYUlhfUFJJTlRfVkVSQk9TRShmbXQsIC4uLikgXAorCW9sX3R4cnhfcHJpbnRfdmVyYm9zZSgiVFhSWDogIiBmbXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgVFhSWF9QUklOVF9WRVJCT1NFKGZtdCwgLi4uKQorI2VuZGlmIC8qIFRYUlhfUFJJTlRfVkVSQk9TRV9FTkFCTEUgKi8KKworLyogZGVmaW5lIFBOIGNoZWNrIGZhaWx1cmUgbWVzc2FnZSBwcmludCByYXRlCisgICBhcyAxIHNlY29uZCAqLworI2RlZmluZSBUWFJYX1BOX0NIRUNLX0ZBSUxVUkVfUFJJTlRfUEVSSU9EX01TICAxMDAwCisKKyNlbHNlCisjZGVmaW5lIFRYUlhfUFJJTlQobGV2ZWwsIGZtdCwgLi4uKQorI2RlZmluZSBUWFJYX1BSSU5UX1ZFUkJPU0UoZm10LCAuLi4pCisjZW5kaWYgLyogVFhSWF9QUklOVF9FTkFCTEUgKi8KKworLyotLS0gdHggY3JlZGl0IGRlYnVnIHByaW50b3V0cyAtLS0qLworCisjaWZuZGVmIERFQlVHX0NSRURJVAorI2RlZmluZSBERUJVR19DUkVESVQgMAorI2VuZGlmCisKKyNpZiBERUJVR19DUkVESVQKKyNkZWZpbmUgVFhfQ1JFRElUX0RFQlVHX1BSSU5UKGZtdCwgLi4uKSBjZGZfcHJpbnQoZm10LCAjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIFRYX0NSRURJVF9ERUJVR19QUklOVChmbXQsIC4uLikKKyNlbmRpZgorCisvKi0tLSB0eCBzY2hlZHVsZXIgZGVidWcgcHJpbnRvdXRzIC0tLSovCisKKyNpZmRlZiBIT1NUX1RYX1NDSEVEX0RFQlVHCisjZGVmaW5lIFRYX1NDSEVEX0RFQlVHX1BSSU5UKGZtdCwgLi4uKSBjZGZfcHJpbnQoZm10LCAjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIFRYX1NDSEVEX0RFQlVHX1BSSU5UKGZtdCwgLi4uKQorI2VuZGlmCisjZGVmaW5lIFRYX1NDSEVEX0RFQlVHX1BSSU5UX0FMV0FZUyhmbXQsIC4uLikgY2RmX3ByaW50KGZtdCwgIyMgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgT0xfVFhSWF9MSVNUX0FQUEVORChoZWFkLCB0YWlsLCBlbGVtKSBcCisJZG8gewkJCQkJCVwKKwkJaWYgKCEoaGVhZCkpIHsJCQkJICAgIFwKKwkJCShoZWFkKSA9IChlbGVtKTsJCQlcCisJCX0gZWxzZSB7CQkJCSAgICBcCisJCQljZGZfbmJ1Zl9zZXRfbmV4dCgodGFpbCksIChlbGVtKSk7CVwKKwkJfQkJCQkJICAgIFwKKwkJKHRhaWwpID0gKGVsZW0pOwkJCSAgICBcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkCitvbF9yeF9tcGR1X2xpc3RfbmV4dChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCSAgICAgdm9pZCAqbXBkdV9saXN0LAorCQkgICAgIGNkZl9uYnVmX3QgKm1wZHVfdGFpbCwgY2RmX25idWZfdCAqbmV4dF9tcGR1KQoreworCWh0dF9wZGV2X2hhbmRsZSBodHRfcGRldiA9IHBkZXYtPmh0dF9wZGV2OworCWNkZl9uYnVmX3QgbXNkdTsKKworCS8qCisJICogRm9yIG5vdywgd2UgdXNlIGEgc2ltcGx5IGZsYXQgbGlzdCBvZiBNU0RVcy4KKwkgKiBTbywgdHJhdmVyc2UgdGhlIGxpc3QgdW50aWwgd2UgcmVhY2ggdGhlIGxhc3QgTVNEVSB3aXRoaW4gdGhlIE1QRFUuCisJICovCisJVFhSWF9BU1NFUlQyKG1wZHVfbGlzdCk7CisJbXNkdSA9IG1wZHVfbGlzdDsKKwl3aGlsZSAoIWh0dF9yeF9tc2R1X2Rlc2NfY29tcGxldGVzX21wZHUKKwkJICAgICAgIChodHRfcGRldiwgaHR0X3J4X21zZHVfZGVzY19yZXRyaWV2ZShodHRfcGRldiwgbXNkdSkpKSB7CisJCW1zZHUgPSBjZGZfbmJ1Zl9uZXh0KG1zZHUpOworCQlUWFJYX0FTU0VSVDIobXNkdSk7CisJfQorCS8qIG1zZHUgbm93IHBvaW50cyB0byB0aGUgbGFzdCBNU0RVIHdpdGhpbiB0aGUgZmlyc3QgTVBEVSAqLworCSptcGR1X3RhaWwgPSBtc2R1OworCSpuZXh0X21wZHUgPSBjZGZfbmJ1Zl9uZXh0KG1zZHUpOworfQorCisvKi0tLSB0eHJ4IHN0YXRzIG1hY3JvcyAtLS0qLworCisvKiB1bmNvbmRpdGlvbmFsIGRlZnMgKi8KKyNkZWZpbmUgVFhSWF9TVEFUU19JTkNSKHBkZXYsIGZpZWxkKSBUWFJYX1NUQVRTX0FERChwZGV2LCBmaWVsZCwgMSkKKworLyogZGVmYXVsdCBjb25kaXRpb25hbCBkZWZzIChtYXkgYmUgdW5kZWZlZCBiZWxvdykgKi8KKworI2RlZmluZSBUWFJYX1NUQVRTX0lOSVQoX3BkZXYpIFwKKwljZGZfbWVtX3NldCgmKChfcGRldiktPnN0YXRzKSwgc2l6ZW9mKChfcGRldiktPnN0YXRzKSwgMHgwKQorI2RlZmluZSBUWFJYX1NUQVRTX0FERChfcGRldiwgX2ZpZWxkLCBfZGVsdGEpIHsJCVwKKwkJX3BkZXYtPnN0YXRzLl9maWVsZCArPSBfZGVsdGE7IH0KKyNkZWZpbmUgVFhSWF9TVEFUU19NU0RVX0lOQ1IocGRldiwgZmllbGQsIG5ldGJ1ZikgXAorCWRvIHsgXAorCQlUWFJYX1NUQVRTX0lOQ1IoKHBkZXYpLCBwdWIuZmllbGQucGt0cyk7IFwKKwkJVFhSWF9TVEFUU19BREQoKHBkZXYpLCBwdWIuZmllbGQuYnl0ZXMsIGNkZl9uYnVmX2xlbihuZXRidWYpKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIGNvbmRpdGlvbmFsIGRlZnMgYmFzZWQgb24gdmVyYm9zaXR5IGxldmVsICovCisKKworI2RlZmluZSBUWFJYX1NUQVRTX01TRFVfTElTVF9JTkNSKHBkZXYsIGZpZWxkLCBuZXRidWZfbGlzdCkgXAorCWRvIHsgXAorCQljZGZfbmJ1Zl90IHRtcF9saXN0ID0gbmV0YnVmX2xpc3Q7IFwKKwkJd2hpbGUgKHRtcF9saXN0KSB7IFwKKwkJCVRYUlhfU1RBVFNfTVNEVV9JTkNSKHBkZXYsIGZpZWxkLCB0bXBfbGlzdCk7IFwKKwkJCXRtcF9saXN0ID0gY2RmX25idWZfbmV4dCh0bXBfbGlzdCk7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBUWFJYX1NUQVRTX01TRFVfSU5DUl9UWF9TVEFUVVMoc3RhdHVzLCBwZGV2LCBuZXRidWYpIGRvIHsJXAorCQlpZiAoc3RhdHVzID09IGh0dF90eF9zdGF0dXNfb2spCQkJCVwKKwkJCVRYUlhfU1RBVFNfTVNEVV9JTkNSKHBkZXYsIHR4LmRlbGl2ZXJlZCwgbmV0YnVmKTsgXAorCQllbHNlIGlmIChzdGF0dXMgPT0gaHR0X3R4X3N0YXR1c19kaXNjYXJkKQkJXAorCQkJVFhSWF9TVEFUU19NU0RVX0lOQ1IocGRldiwgdHguZHJvcHBlZC50YXJnZXRfZGlzY2FyZCwgXAorCQkJCQkgICAgIG5ldGJ1Zik7CQkJXAorCQllbHNlIGlmIChzdGF0dXMgPT0gaHR0X3R4X3N0YXR1c19ub19hY2spCQlcCisJCQlUWFJYX1NUQVRTX01TRFVfSU5DUihwZGV2LCB0eC5kcm9wcGVkLm5vX2FjaywgbmV0YnVmKTsgXAorCQllbHNlIGlmIChzdGF0dXMgPT0gaHR0X3R4X3N0YXR1c19kb3dubG9hZF9mYWlsKQkJXAorCQkJVFhSWF9TVEFUU19NU0RVX0lOQ1IocGRldiwgdHguZHJvcHBlZC5kb3dubG9hZF9mYWlsLCBcCisJCQkJCSAgICAgbmV0YnVmKTsJCQlcCisJCWVsc2UJCQkJCQkJXAorCQkJLyogTk8tT1AgKi87CQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBUWFJYX1NUQVRTX1VQREFURV9UWF9DT01QX0hJU1RPR1JBTShfcGRldiwgX3BfY250cnMpICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKF9wX2NudHJzID09IDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJVFhSWF9TVEFUU19BREQoX3BkZXYsIHB1Yi50eC5jb21wX2hpc3RvZ3JhbS5wa3RzXzEsIDEpO1wKKwkJfSBlbHNlIGlmIChfcF9jbnRycyA+IDIgJiYgX3BfY250cnMgPD0gMTApIHsgICAgICAgICAgICAgICAgICAgXAorCQkJVFhSWF9TVEFUU19BREQoX3BkZXYsCQkJCSAgICAgICBcCisJCQkJIHB1Yi50eC5jb21wX2hpc3RvZ3JhbS5wa3RzXzJfMTAsIDEpOyAgICAgICAgICBcCisJCX0gZWxzZSBpZiAoX3BfY250cnMgPiAxMCAmJiBfcF9jbnRycyA8PSAyMCkgeyAgICAgICAgICAgICAgICAgIFwKKwkJCVRYUlhfU1RBVFNfQUREKF9wZGV2LAkJCQkgICAgICAgXAorCQkJCSBwdWIudHguY29tcF9oaXN0b2dyYW0ucGt0c18xMV8yMCwgMSk7ICAgICAgICAgXAorCQl9IGVsc2UgaWYgKF9wX2NudHJzID4gMjAgJiYgX3BfY250cnMgPD0gMzApIHsgICAgICAgICAgICAgICAgICBcCisJCQlUWFJYX1NUQVRTX0FERChfcGRldiwJCQkJICAgICAgIFwKKwkJCQkgcHViLnR4LmNvbXBfaGlzdG9ncmFtLnBrdHNfMjFfMzAsIDEpOyAgICAgICAgIFwKKwkJfSBlbHNlIGlmIChfcF9jbnRycyA+IDMwICYmIF9wX2NudHJzIDw9IDQwKSB7ICAgICAgICAgICAgICAgICAgXAorCQkJVFhSWF9TVEFUU19BREQoX3BkZXYsCQkJCSAgICAgICBcCisJCQkJIHB1Yi50eC5jb21wX2hpc3RvZ3JhbS5wa3RzXzMxXzQwLCAxKTsgICAgICAgICBcCisJCX0gZWxzZSBpZiAoX3BfY250cnMgPiA0MCAmJiBfcF9jbnRycyA8PSA1MCkgeyAgICAgICAgICAgICAgICAgIFwKKwkJCVRYUlhfU1RBVFNfQUREKF9wZGV2LAkJCQkgICAgICAgXAorCQkJCSBwdWIudHguY29tcF9oaXN0b2dyYW0ucGt0c180MV81MCwgMSk7ICAgICAgICAgXAorCQl9IGVsc2UgaWYgKF9wX2NudHJzID4gNTAgJiYgX3BfY250cnMgPD0gNjApIHsgICAgICAgICAgICAgICAgICBcCisJCQlUWFJYX1NUQVRTX0FERChfcGRldiwJCQkJICAgICAgIFwKKwkJCQkgcHViLnR4LmNvbXBfaGlzdG9ncmFtLnBrdHNfNTFfNjAsIDEpOyAgICAgICAgIFwKKwkJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJVFhSWF9TVEFUU19BREQoX3BkZXYsCQkJCSAgICAgICBcCisJCQkJIHB1Yi50eC5jb21wX2hpc3RvZ3JhbS5wa3RzXzYxX3BsdXMsIDEpOyAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFRYUlhfU1RBVFNfVVBEQVRFX1RYX1NUQVRTKF9wZGV2LCBfc3RhdHVzLCBfcF9jbnRycywgX2JfY250cnMpICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlzd2l0Y2ggKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWNhc2UgaHR0X3R4X3N0YXR1c19vazogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCVRYUlhfU1RBVFNfQUREKF9wZGV2LAkJCQkgICAgICAgXAorCQkJCSBwdWIudHguZGVsaXZlcmVkLnBrdHMsIF9wX2NudHJzKTsgICAgICAgICAgICAgXAorCQkJVFhSWF9TVEFUU19BREQoX3BkZXYsCQkJCSAgICAgICBcCisJCQkJIHB1Yi50eC5kZWxpdmVyZWQuYnl0ZXMsIF9iX2NudHJzKTsgICAgICAgICAgICBcCisJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQljYXNlIGh0dF90eF9zdGF0dXNfZGlzY2FyZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlUWFJYX1NUQVRTX0FERChfcGRldiwJCQkJICAgICAgIFwKKwkJCQkgcHViLnR4LmRyb3BwZWQudGFyZ2V0X2Rpc2NhcmQucGt0cywgX3BfY250cnMpO1wKKwkJCVRYUlhfU1RBVFNfQUREKF9wZGV2LAkJCQkgICAgICAgXAorCQkJCXB1Yi50eC5kcm9wcGVkLnRhcmdldF9kaXNjYXJkLmJ5dGVzLCBfYl9jbnRycyk7XAorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJY2FzZSBodHRfdHhfc3RhdHVzX25vX2FjazogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJVFhSWF9TVEFUU19BREQoX3BkZXYsIHB1Yi50eC5kcm9wcGVkLm5vX2Fjay5wa3RzLCAgICAgIFwKKwkJCQkgX3BfY250cnMpOyAgICAgICAgICAgIAkJCSAgICAgICBcCisJCQlUWFJYX1NUQVRTX0FERChfcGRldiwgcHViLnR4LmRyb3BwZWQubm9fYWNrLmJ5dGVzLCAgICAgXAorCQkJCSBfYl9jbnRycyk7CQkJCSAgICAgICBcCisJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQljYXNlIGh0dF90eF9zdGF0dXNfZG93bmxvYWRfZmFpbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlUWFJYX1NUQVRTX0FERChfcGRldiwJCQkJICAgICAgIFwKKwkJCQkgcHViLnR4LmRyb3BwZWQuZG93bmxvYWRfZmFpbC5wa3RzLCBfcF9jbnRycyk7IFwKKwkJCVRYUlhfU1RBVFNfQUREKF9wZGV2LAkJCQkgICAgICAgXAorCQkJCSBwdWIudHguZHJvcHBlZC5kb3dubG9hZF9mYWlsLmJ5dGVzLCBfYl9jbnRycyk7XAorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlUWFJYX1NUQVRTX1VQREFURV9UWF9DT01QX0hJU1RPR1JBTShfcGRldiwgX3BfY250cnMpOyAgICAgICAgICBcCisJfSB3aGlsZSAoMCkKKworCisvKi0tLSB0eHJ4IHNlcXVlbmNlIG51bWJlciB0cmFjZSBtYWNyb3MgLS0tKi8KKworI2RlZmluZSBUWFJYX1NFUV9OVU1fRVJSKF9zdGF0dXMpICgweGZmZmYgLSBfc3RhdHVzKQorCisjaWYgZGVmaW5lZChFTkFCTEVfUlhfUkVPUkRFUl9UUkFDRSkKKworQV9TVEFUVVMgb2xfcnhfcmVvcmRlcl90cmFjZV9hdHRhY2gob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KTsKK3ZvaWQgb2xfcnhfcmVvcmRlcl90cmFjZV9kZXRhY2gob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KTsKK3ZvaWQgb2xfcnhfcmVvcmRlcl90cmFjZV9hZGQob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJICAgICB1aW50OF90IHRpZCwKKwkJCSAgICAgdWludDE2X3QgcmVvcmRlcl9pZHgsCisJCQkgICAgIHVpbnQxNl90IHNlcV9udW0sIGludCBudW1fbXBkdXMpOworCisjZGVmaW5lIE9MX1JYX1JFT1JERVJfVFJBQ0VfQVRUQUNIIG9sX3J4X3Jlb3JkZXJfdHJhY2VfYXR0YWNoCisjZGVmaW5lIE9MX1JYX1JFT1JERVJfVFJBQ0VfREVUQUNIIG9sX3J4X3Jlb3JkZXJfdHJhY2VfZGV0YWNoCisjZGVmaW5lIE9MX1JYX1JFT1JERVJfVFJBQ0VfQUREICAgIG9sX3J4X3Jlb3JkZXJfdHJhY2VfYWRkCisKKyNlbHNlCisKKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9UUkFDRV9BVFRBQ0goX3BkZXYpIEFfT0sKKyNkZWZpbmUgT0xfUlhfUkVPUkRFUl9UUkFDRV9ERVRBQ0goX3BkZXYpCisjZGVmaW5lIE9MX1JYX1JFT1JERVJfVFJBQ0VfQUREKHBkZXYsIHRpZCwgcmVvcmRlcl9pZHgsIHNlcV9udW0sIG51bV9tcGR1cykKKworI2VuZGlmIC8qIEVOQUJMRV9SWF9SRU9SREVSX1RSQUNFICovCisKKy8qLS0tIHR4cnggcGFja2V0IG51bWJlciB0cmFjZSBtYWNyb3MgLS0tKi8KKworI2lmIGRlZmluZWQoRU5BQkxFX1JYX1BOX1RSQUNFKQorCitBX1NUQVRVUyBvbF9yeF9wbl90cmFjZV9hdHRhY2gob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2KTsKK3ZvaWQgb2xfcnhfcG5fdHJhY2VfZGV0YWNoKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldik7Cit2b2lkIG9sX3J4X3BuX3RyYWNlX2FkZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsCisJCQl1aW50MTZfdCB0aWQsIHZvaWQgKnJ4X2Rlc2MpOworCisjZGVmaW5lIE9MX1JYX1BOX1RSQUNFX0FUVEFDSCBvbF9yeF9wbl90cmFjZV9hdHRhY2gKKyNkZWZpbmUgT0xfUlhfUE5fVFJBQ0VfREVUQUNIIG9sX3J4X3BuX3RyYWNlX2RldGFjaAorI2RlZmluZSBPTF9SWF9QTl9UUkFDRV9BREQgICAgb2xfcnhfcG5fdHJhY2VfYWRkCisKKyNlbHNlCisKKyNkZWZpbmUgT0xfUlhfUE5fVFJBQ0VfQVRUQUNIKF9wZGV2KSBBX09LCisjZGVmaW5lIE9MX1JYX1BOX1RSQUNFX0RFVEFDSChfcGRldikKKyNkZWZpbmUgT0xfUlhfUE5fVFJBQ0VfQUREKHBkZXYsIHBlZXIsIHRpZCwgcnhfZGVzYykKKworI2VuZGlmIC8qIEVOQUJMRV9SWF9QTl9UUkFDRSAqLworCitzdGF0aWMgaW5saW5lIGludCBvbF90eHJ4X2llZWU4MDIxMV9oZHJzaXplKGNvbnN0IHZvaWQgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2ggPSAoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKWRhdGE7CisJaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9mcmFtZSk7CisKKwkvKiBOQjogd2UgZG9uJ3QgaGFuZGxlIGNvbnRyb2wgZnJhbWVzICovCisJVFhSWF9BU1NFUlQxKCh3aC0+aV9mY1swXSAmIElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLKSAhPQorCQkgICAgIElFRUU4MDIxMV9GQzBfVFlQRV9DVEwpOworCWlmICgod2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX0RJUl9NQVNLKSA9PQorCSAgICBJRUVFODAyMTFfRkMxX0RJUl9EU1RPRFMpCisJCXNpemUgKz0gSUVFRTgwMjExX0FERFJfTEVOOworCWlmIChJRUVFODAyMTFfUU9TX0hBU19TRVEod2gpKSB7CisJCXNpemUgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwkJLyogUW9zIGZyYW1lIHdpdGggT3JkZXIgYml0IHNldCBpbmRpY2F0ZXMgYW4gSFRDIGZyYW1lICovCisJCWlmICh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfT1JERVIpCisJCQlzaXplICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0Yyk7CisJfQorCXJldHVybiBzaXplOworfQorCisvKi0tLSBmcmFtZSBkaXNwbGF5IHV0aWxpdHkgLS0tKi8KKworZW51bSBvbF90eHJ4X2ZybV9kdW1wX29wdGlvbnMgeworCW9sX3R4cnhfZnJtX2R1bXBfY29udGVudHMgPSAweDEsCisJb2xfdHhyeF9mcm1fZHVtcF90Y3Bfc2VxID0gMHgyLAorfTsKKworI2lmZGVmIFRYUlhfREVCVUdfREFUQQorc3RhdGljIGlubGluZSB2b2lkCitvbF90eHJ4X2ZybXNfZHVtcChjb25zdCBjaGFyICpuYW1lLAorCQkgIHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJICBjZGZfbmJ1Zl90IGZybSwKKwkJICBlbnVtIG9sX3R4cnhfZnJtX2R1bXBfb3B0aW9ucyBkaXNwbGF5X29wdGlvbnMsIGludCBtYXhfbGVuKQoreworI2RlZmluZSBUWFJYX0ZSTV9EVU1QX01BWF9MRU4gMTI4CisJdWludDhfdCBsb2NhbF9idWZbVFhSWF9GUk1fRFVNUF9NQVhfTEVOXSA9IHsgMCB9OworCXVpbnQ4X3QgKnA7CisKKwlpZiAobmFtZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzXG4iLAorCQkJICBuYW1lKTsKKwl9CisJd2hpbGUgKGZybSkgeworCQlwID0gY2RmX25idWZfZGF0YShmcm0pOworCQlpZiAoZGlzcGxheV9vcHRpb25zICYgb2xfdHhyeF9mcm1fZHVtcF90Y3Bfc2VxKSB7CisJCQlpbnQgdGNwX29mZnNldDsKKwkJCWludCBsMl9oZHJfc2l6ZTsKKwkJCXVpbnQxNl90IGV0aHR5cGU7CisJCQl1aW50OF90IGlwX3Byb3Q7CisKKwkJCWlmIChwZGV2LT5mcmFtZV9mb3JtYXQgPT0gd2xhbl9mcm1fZm10XzgwMl8zKSB7CisJCQkJc3RydWN0IGV0aGVybmV0X2hkcl90ICplbmV0X2hkciA9CisJCQkJCShzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QgKilwOworCQkJCWwyX2hkcl9zaXplID0gRVRIRVJORVRfSERSX0xFTjsKKworCQkJCS8qCisJCQkJICogTExDL1NOQVAgcHJlc2VudD8KKwkJCQkgKi8KKwkJCQlldGh0eXBlID0gKGVuZXRfaGRyLT5ldGhlcnR5cGVbMF0gPDwgOCkgfAorCQkJCQllbmV0X2hkci0+ZXRoZXJ0eXBlWzFdOworCQkJCWlmICghSVNfRVRIRVJUWVBFKGV0aGVydHlwZSkpIHsKKwkJCQkJLyogODAyLjMgZm9ybWF0ICovCisJCQkJCXN0cnVjdCBsbGNfc25hcF9oZHJfdCAqbGxjX2hkcjsKKworCQkJCQlsbGNfaGRyID0gKHN0cnVjdCBsbGNfc25hcF9oZHJfdCAqKQorCQkJCQkJKHAgKyBsMl9oZHJfc2l6ZSk7CisJCQkJCWwyX2hkcl9zaXplICs9IExMQ19TTkFQX0hEUl9MRU47CisJCQkJCWV0aHR5cGUgPSAobGxjX2hkci0+ZXRoZXJ0eXBlWzBdIDw8IDgpIHwKKwkJCQkJCWxsY19oZHItPmV0aGVydHlwZVsxXTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBsbGNfc25hcF9oZHJfdCAqbGxjX2hkcjsKKwkJCQkvKiAoZ2VuZXJpYz8pIDgwMi4xMSAqLworCQkJCWwyX2hkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUpOworCQkJCWxsY19oZHIgPSAoc3RydWN0IGxsY19zbmFwX2hkcl90ICopCisJCQkJCShwICsgbDJfaGRyX3NpemUpOworCQkJCWwyX2hkcl9zaXplICs9IExMQ19TTkFQX0hEUl9MRU47CisJCQkJZXRodHlwZSA9IChsbGNfaGRyLT5ldGhlcnR5cGVbMF0gPDwgOCkgfAorCQkJCQlsbGNfaGRyLT5ldGhlcnR5cGVbMV07CisJCQl9CisJCQlpZiAoZXRodHlwZSA9PSBFVEhFUlRZUEVfSVBWNCkgeworCQkJCXN0cnVjdCBpcHY0X2hkcl90ICppcHY0X2hkcjsKKwkJCQlpcHY0X2hkciA9CisJCQkJCShzdHJ1Y3QgaXB2NF9oZHJfdCAqKShwICsgbDJfaGRyX3NpemUpOworCQkJCWlwX3Byb3QgPSBpcHY0X2hkci0+cHJvdG9jb2w7CisJCQkJdGNwX29mZnNldCA9IGwyX2hkcl9zaXplICsgSVBWNF9IRFJfTEVOOworCQkJfSBlbHNlIGlmIChldGh0eXBlID09IEVUSEVSVFlQRV9JUFY2KSB7CisJCQkJc3RydWN0IGlwdjZfaGRyX3QgKmlwdjZfaGRyOworCQkJCWlwdjZfaGRyID0KKwkJCQkJKHN0cnVjdCBpcHY2X2hkcl90ICopKHAgKyBsMl9oZHJfc2l6ZSk7CisJCQkJaXBfcHJvdCA9IGlwdjZfaGRyLT5uZXh0X2hkcjsKKwkJCQl0Y3Bfb2Zmc2V0ID0gbDJfaGRyX3NpemUgKyBJUFY2X0hEUl9MRU47CisJCQl9IGVsc2UgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSAgImZyYW1lICVwIG5vbi1JUCBldGhlcnR5cGUgKCV4KVxuIiwKKwkJCQkJICBmcm0sIGV0aHR5cGUpOworCQkJCWdvdG8gTk9UX0lQX1RDUDsKKwkJCX0KKwkJCWlmIChpcF9wcm90ID09IElQX1BST1RPQ09MX1RDUCkgeworI2lmIE5FVkVSREVGSU5FRAorCQkJCXN0cnVjdCB0Y3BfaGRyX3QgKnRjcF9oZHI7CisJCQkJdWludDMyX3QgdGNwX3NlcV9udW07CisJCQkJdGNwX2hkciA9IChzdHJ1Y3QgdGNwX2hkcl90ICopKHAgKyB0Y3Bfb2Zmc2V0KTsKKwkJCQl0Y3Bfc2VxX251bSA9CisJCQkJCSh0Y3BfaGRyLT5zZXFfbnVtWzBdIDw8IDI0KSB8CisJCQkJCSh0Y3BfaGRyLT5zZXFfbnVtWzFdIDw8IDE2KSB8CisJCQkJCSh0Y3BfaGRyLT5zZXFfbnVtWzFdIDw8IDgpIHwKKwkJCQkJKHRjcF9oZHItPnNlcV9udW1bMV0gPDwgMCk7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICAiZnJhbWUgJXA6IFRDUCBzZXEgbnVtID0gJWRcbiIsIGZybSwKKwkJCQkJICB0Y3Bfc2VxX251bSk7CisjZWxzZQorCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSAgImZyYW1lICVwOiBUQ1Agc2VxIG51bSA9ICVkXG4iLCBmcm0sCisJCQkJCSAgKCgqKHAgKyB0Y3Bfb2Zmc2V0ICsgNCkpIDw8IDI0KSB8CisJCQkJCSAgKCgqKHAgKyB0Y3Bfb2Zmc2V0ICsgNSkpIDw8IDE2KSB8CisJCQkJCSAgKCgqKHAgKyB0Y3Bfb2Zmc2V0ICsgNikpIDw8IDgpIHwKKwkJCQkJICAoKihwICsgdGNwX29mZnNldCArIDcpKSk7CisjZW5kaWYKKwkJCX0gZWxzZSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICAiZnJhbWUgJXAgbm9uLVRDUCBJUCBwcm90b2NvbCAoJXgpXG4iLAorCQkJCQkgIGZybSwgaXBfcHJvdCk7CisJCQl9CisJCX0KK05PVF9JUF9UQ1A6CisJCWlmIChkaXNwbGF5X29wdGlvbnMgJiBvbF90eHJ4X2ZybV9kdW1wX2NvbnRlbnRzKSB7CisJCQlpbnQgaSwgZnJhZ19udW0sIGxlbl9saW07CisJCQlsZW5fbGltID0gbWF4X2xlbjsKKwkJCWlmIChsZW5fbGltID4gY2RmX25idWZfbGVuKGZybSkpCisJCQkJbGVuX2xpbSA9IGNkZl9uYnVmX2xlbihmcm0pOworCQkJaWYgKGxlbl9saW0gPiBUWFJYX0ZSTV9EVU1QX01BWF9MRU4pCisJCQkJbGVuX2xpbSA9IFRYUlhfRlJNX0RVTVBfTUFYX0xFTjsKKworCQkJLyoKKwkJCSAqIEdhdGhlciBmcmFtZSBjb250ZW50cyBmcm9tIG5ldGJ1ZiBmcmFnbWVudHMKKwkJCSAqIGludG8gYSBjb250aWd1b3VzIGJ1ZmZlci4KKwkJCSAqLworCQkJZnJhZ19udW0gPSAwOworCQkJaSA9IDA7CisJCQl3aGlsZSAoaSA8IGxlbl9saW0pIHsKKwkJCQlpbnQgZnJhZ19ieXRlczsKKwkJCQlmcmFnX2J5dGVzID0KKwkJCQkJY2RmX25idWZfZ2V0X2ZyYWdfbGVuKGZybSwgZnJhZ19udW0pOworCQkJCWlmIChmcmFnX2J5dGVzID4gbGVuX2xpbSAtIGkpCisJCQkJCWZyYWdfYnl0ZXMgPSBsZW5fbGltIC0gaTsKKwkJCQlpZiAoZnJhZ19ieXRlcyA+IDApIHsKKwkJCQkJcCA9IGNkZl9uYnVmX2dldF9mcmFnX3ZhZGRyKGZybSwKKwkJCQkJCQkJICAgIGZyYWdfbnVtKTsKKwkJCQkJY2RmX21lbV9jb3B5KCZsb2NhbF9idWZbaV0sIHAsCisJCQkJCQkgICAgIGZyYWdfYnl0ZXMpOworCQkJCX0KKwkJCQlmcmFnX251bSsrOworCQkJCWkgKz0gZnJhZ19ieXRlczsKKwkJCX0KKworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiZnJhbWUgJXAgZGF0YSAoJXApLCBoZXggZHVtcCBvZiBieXRlcyAwLSVkIG9mICVkOlxuIiwKKwkJCQlmcm0sIHAsIGxlbl9saW0gLSAxLCAoaW50KWNkZl9uYnVmX2xlbihmcm0pKTsKKwkJCXAgPSBsb2NhbF9idWY7CisJCQl3aGlsZSAobGVuX2xpbSA+IDE2KSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICAiICAiICAgICAgICAvKiBpbmRlbnQgKi8KKwkJCQkJICAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIKKwkJCQkJICAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCQkgICoocCArIDApLCAqKHAgKyAxKSwgKihwICsgMiksCisJCQkJCSAgKihwICsgMyksICoocCArIDQpLCAqKHAgKyA1KSwKKwkJCQkJICAqKHAgKyA2KSwgKihwICsgNyksICoocCArIDgpLAorCQkJCQkgICoocCArIDkpLCAqKHAgKyAxMCksICoocCArIDExKSwKKwkJCQkJICAqKHAgKyAxMiksICoocCArIDEzKSwgKihwICsgMTQpLAorCQkJCQkgICoocCArIDE1KSk7CisJCQkJcCArPSAxNjsKKwkJCQlsZW5fbGltIC09IDE2OworCQkJfQorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiICAiIC8qIGluZGVudCAqLyk7CisJCQl3aGlsZSAobGVuX2xpbSA+IDApIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJTAyeCAiLCAqcCk7CisJCQkJcCsrOworCQkJCWxlbl9saW0tLTsKKwkJCX0KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIlxuIik7CisJCX0KKwkJZnJtID0gY2RmX25idWZfbmV4dChmcm0pOworCX0KK30KKyNlbHNlCisjZGVmaW5lIG9sX3R4cnhfZnJtc19kdW1wKG5hbWUsIHBkZXYsIGZybXMsIGRpc3BsYXlfb3B0aW9ucywgbWF4X2xlbikKKyNlbmRpZiAvKiBUWFJYX0RFQlVHX0RBVEEgKi8KKworI2lmZGVmIFNVUFBPUlRfSE9TVF9TVEFUSVNUSUNTCisKKyNkZWZpbmUgT0xfUlhfRVJSX1NUQVRJU1RJQ1MocGRldiwgdmRldiwgZXJyX3R5cGUsIHNlY190eXBlLCBpc19tY2FzdCkgXAorCW9sX3J4X2Vycl9zdGF0aXN0aWNzKHBkZXYtPmN0cmxfcGRldiwgdmRldi0+dmRldl9pZCwgZXJyX3R5cGUsCSAgIFwKKwkJCSAgICAgc2VjX3R5cGUsIGlzX21jYXN0KTsKKworI2RlZmluZSBPTF9SWF9FUlJfU1RBVElTVElDU18xKHBkZXYsIHZkZXYsIHBlZXIsIHJ4X2Rlc2MsIGVycl90eXBlKQlcCisJZG8gewkJCQkJCQkJXAorCQlpbnQgaXNfbWNhc3Q7CQkJCQkJXAorCQllbnVtIGh0dF9zZWNfdHlwZSBzZWNfdHlwZTsJCQkJXAorCQlpc19tY2FzdCA9IGh0dF9yeF9tc2R1X2lzX3dsYW5fbWNhc3QoCQkJXAorCQkJcGRldi0+aHR0X3BkZXYsIHJ4X2Rlc2MpOwkJCVwKKwkJc2VjX3R5cGUgPSBwZWVyLT5zZWN1cml0eVtpc19tY2FzdAkJCVwKKwkJCQkJICA/IHR4cnhfc2VjX21jYXN0CQlcCisJCQkJCSAgOiB0eHJ4X3NlY191Y2FzdF0uc2VjX3R5cGU7CVwKKwkJT0xfUlhfRVJSX1NUQVRJU1RJQ1MocGRldiwgdmRldiwgZXJyX3R5cGUsCQlcCisJCQkJICAgICBwZGV2LT5zZWNfdHlwZXNbc2VjX3R5cGVdLAkJXAorCQkJCSAgICAgaXNfbWNhc3QpOwkJCQlcCisJfSB3aGlsZSAoZmFsc2UpCisKKyNkZWZpbmUgT0xfUlhfRVJSX0lOVl9QRUVSX1NUQVRJU1RJQ1MocGRldiwgcnhfbXNkdSkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aCA9IE5VTEw7CQkJXAorCQkvKkZJWCBUSElTIDogKi8JCQkJCQlcCisJCS8qIEhlcmUgaHR0X3J4X21wZHVfd2lmaV9oZHJfcmV0cmlldmUgc2hvdWxkIGJlIHVzZWQuICovIFwKKwkJLypCdXQgYXQgcHJlc2VudCBpdCBzZWVtcyBpdCBkb2VzIG5vdCB3b3JrLiovCQlcCisJCS8qd2ggPSAoc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKSAqLwkJCVwKKwkJLypodHRfcnhfbXBkdV93aWZpX2hkcl9yZXRyaWV2ZShwZGV2LT5odHRfcGRldiwgcnhfZGVzYyk7Ki8gXAorCQkvKiB0aGlzIG9ubHkgYXBwbHkgdG8gTEwgZGV2aWNlLiovCQkJXAorCQlpZiAob2xfY2ZnX2ZyYW1lX3R5cGUocGRldi0+Y3RybF9wZGV2KSA9PQkJXAorCQkgICAgd2xhbl9mcm1fZm10X25hdGl2ZV93aWZpKSB7CQkJCVwKKwkJCS8qIEZvciB3aW5kb3dzLCBpdCBpcyBhbHdheXMgbmF0aXZlIHdpZmkgaGVhZGVyIC4qLyBcCisJCQl3aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopY2RmX25idWZfZGF0YShyeF9tc2R1KTsgXAorCQl9CQkJCQkJCVwKKwkJb2xfcnhfZXJyX2ludl9wZWVyX3N0YXRpc3RpY3MocGRldi0+Y3RybF9wZGV2LAkJXAorCQkJCQkgICAgICB3aCwgT0xfUlhfRVJSX1VOS05PV05fUEVFUik7IFwKKwl9IHdoaWxlIChmYWxzZSkKKworI2RlZmluZSBPTF9SWF9FUlJfU1RBVElTVElDU18yKHBkZXYsIHZkZXYsIHBlZXIsIHJ4X2Rlc2MsIHJ4X21zZHUsIHJ4X3N0YXR1cykgXAorCWRvIHsJCQkJCQkJCVwKKwkJZW51bSBvbF9yeF9lcnJfdHlwZSBlcnJfdHlwZSA9IE9MX1JYX0VSUl9OT05FOwkJXAorCQlpZiAocnhfc3RhdHVzID09IGh0dF9yeF9zdGF0dXNfZGVjcnlwdF9lcnIpCQlcCisJCQllcnJfdHlwZSA9IE9MX1JYX0VSUl9ERUNSWVBUOwkJCVwKKwkJZWxzZSBpZiAocnhfc3RhdHVzID09IGh0dF9yeF9zdGF0dXNfdGtpcF9taWNfZXJyKQlcCisJCQllcnJfdHlwZSA9IE9MX1JYX0VSUl9US0lQX01JQzsJCQlcCisJCWVsc2UgaWYgKHJ4X3N0YXR1cyA9PSBodHRfcnhfc3RhdHVzX21wZHVfbGVuZ3RoX2VycikJXAorCQkJZXJyX3R5cGUgPSBPTF9SWF9FUlJfTVBEVV9MRU5HVEg7CQlcCisJCWVsc2UgaWYgKHJ4X3N0YXR1cyA9PSBodHRfcnhfc3RhdHVzX21wZHVfZW5jcnlwdF9yZXF1aXJlZF9lcnIpIFwKKwkJCWVycl90eXBlID0gT0xfUlhfRVJSX0VOQ1JZUFRfUkVRVUlSRUQ7CQlcCisJCWVsc2UgaWYgKHJ4X3N0YXR1cyA9PSBodHRfcnhfc3RhdHVzX2Vycl9kdXApCQlcCisJCQllcnJfdHlwZSA9IE9MX1JYX0VSUl9EVVA7CQkJXAorCQllbHNlIGlmIChyeF9zdGF0dXMgPT0gaHR0X3J4X3N0YXR1c19lcnJfZmNzKQkJXAorCQkJZXJyX3R5cGUgPSBPTF9SWF9FUlJfRkNTOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQllcnJfdHlwZSA9IE9MX1JYX0VSUl9VTktOT1dOOwkJCVwKKwkJCQkJCQkJCVwKKwkJaWYgKHZkZXYgIT0gTlVMTCAmJiBwZWVyICE9IE5VTEwpIHsJCQlcCisJCQlPTF9SWF9FUlJfU1RBVElTVElDU18xKHBkZXYsIHZkZXYsIHBlZXIsCVwKKwkJCQkJICAgICAgIHJ4X21wZHVfZGVzYywgZXJyX3R5cGUpOyBcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJT0xfUlhfRVJSX0lOVl9QRUVSX1NUQVRJU1RJQ1MocGRldiwgcnhfbXNkdSk7CVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoZmFsc2UpCisjZWxzZQorI2RlZmluZSBPTF9SWF9FUlJfU1RBVElTVElDUyhwZGV2LCB2ZGV2LCBlcnJfdHlwZSwgc2VjX3R5cGUsIGlzX21jYXN0KQorI2RlZmluZSBPTF9SWF9FUlJfU1RBVElTVElDU18xKHBkZXYsIHZkZXYsIHBlZXIsIHJ4X2Rlc2MsIGVycl90eXBlKQorI2RlZmluZSBPTF9SWF9FUlJfU1RBVElTVElDU18yKHBkZXYsIHZkZXYsIHBlZXIsIHJ4X2Rlc2MsIHJ4X21zZHUsIHJ4X3N0YXR1cykKKyNlbmRpZiAvKiBTVVBQT1JUX0hPU1RfU1RBVElTVElDUyAqLworCisjaWZkZWYgUUNBX0VOQUJMRV9PTF9UWFJYX1BFRVJfU1RBVFMKKyNkZWZpbmUgT0xfVFhSWF9QRUVSX1NUQVRTX1VQREFURV9CQVNFKHBlZXIsIHR4X29yX3J4LCB0eXBlLCBtc2R1KSBcCisJZG8geyBcCisJCWNkZl9zcGluX2xvY2tfYmgoJnBlZXItPnZkZXYtPnBkZXYtPnBlZXJfc3RhdF9tdXRleCk7IFwKKwkJcGVlci0+c3RhdHMudHhfb3JfcnguZnJtcy50eXBlICs9IDE7IFwKKwkJcGVlci0+c3RhdHMudHhfb3JfcnguYnl0ZXMudHlwZSArPSBjZGZfbmJ1Zl9sZW4obXNkdSk7IFwKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZWVyLT52ZGV2LT5wZGV2LT5wZWVyX3N0YXRfbXV0ZXgpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgT0xfVFhSWF9QRUVSX1NUQVRTX1VQREFURShwZWVyLCB0eF9vcl9yeCwgbXNkdSkJXAorCWRvIHsgXAorCQlzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYgPSBwZWVyLT52ZGV2OyBcCisJCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiA9IHZkZXYtPnBkZXY7IFwKKwkJdWludDhfdCAqZGVzdF9hZGRyOyBcCisJCWlmIChwZGV2LT5mcmFtZV9mb3JtYXQgPT0gd2xhbl9mcm1fZm10XzgwMl8zKSB7CVwKKwkJCWRlc3RfYWRkciA9IGNkZl9uYnVmX2RhdGEobXNkdSk7IFwKKwkJfSBlbHNlIHsgLyogODAyLjExIGZvcm1hdCAqLyBcCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICpmcm07IFwKKwkJCWZybSA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopIGNkZl9uYnVmX2RhdGEobXNkdSk7IFwKKwkJCWlmICh2ZGV2LT5vcG1vZGUgPT0gd2xhbl9vcF9tb2RlX2FwKSB7IFwKKwkJCQlkZXN0X2FkZHIgPSAodWludDhfdCAqKSAmKGZybS0+aV9hZGRyMVswXSk7IFwKKwkJCX0gZWxzZSB7IFwKKwkJCQlkZXN0X2FkZHIgPSAodWludDhfdCAqKSAmKGZybS0+aV9hZGRyM1swXSk7IFwKKwkJCX0gXAorCQl9IFwKKwkJaWYgKGNkZl91bmxpa2VseShJRUVFODAyMTFfSVNfQlJPQURDQVNUKGRlc3RfYWRkcikpKSB7IFwKKwkJCU9MX1RYUlhfUEVFUl9TVEFUU19VUERBVEVfQkFTRShwZWVyLCB0eF9vcl9yeCwJXAorCQkJCQkJICAgICAgIGJjYXN0LCBtc2R1KTsJXAorCQl9IGVsc2UgaWYgKGNkZl91bmxpa2VseShJRUVFODAyMTFfSVNfTVVMVElDQVNUKGRlc3RfYWRkcikpKSB7IFwKKwkJCU9MX1RYUlhfUEVFUl9TVEFUU19VUERBVEVfQkFTRShwZWVyLCB0eF9vcl9yeCwJXAorCQkJCQkJICAgICAgIG1jYXN0LCBtc2R1KTsJXAorCQl9IGVsc2UgeyBcCisJCQlPTF9UWFJYX1BFRVJfU1RBVFNfVVBEQVRFX0JBU0UocGVlciwgdHhfb3JfcngsCVwKKwkJCQkJCSAgICAgICB1Y2FzdCwgbXNkdSk7CVwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgT0xfVFhfUEVFUl9TVEFUU19VUERBVEUocGVlciwgbXNkdSkgXAorCU9MX1RYUlhfUEVFUl9TVEFUU19VUERBVEUocGVlciwgdHgsIG1zZHUpCisjZGVmaW5lIE9MX1JYX1BFRVJfU1RBVFNfVVBEQVRFKHBlZXIsIG1zZHUpIFwKKwlPTF9UWFJYX1BFRVJfU1RBVFNfVVBEQVRFKHBlZXIsIHJ4LCBtc2R1KQorI2RlZmluZSBPTF9UWFJYX1BFRVJfU1RBVFNfTVVURVhfSU5JVChwZGV2KSBcCisJY2RmX3NwaW5sb2NrX2luaXQoJnBkZXYtPnBlZXJfc3RhdF9tdXRleCkKKyNkZWZpbmUgT0xfVFhSWF9QRUVSX1NUQVRTX01VVEVYX0RFU1RST1kocGRldikgXAorCWNkZl9zcGlubG9ja19kZXN0cm95KCZwZGV2LT5wZWVyX3N0YXRfbXV0ZXgpCisjZWxzZQorI2RlZmluZSBPTF9UWF9QRUVSX1NUQVRTX1VQREFURShwZWVyLCBtc2R1KSAgICAgLyogbm8tb3AgKi8KKyNkZWZpbmUgT0xfUlhfUEVFUl9TVEFUU19VUERBVEUocGVlciwgbXNkdSkgICAgIC8qIG5vLW9wICovCisjZGVmaW5lIE9MX1RYUlhfUEVFUl9TVEFUU19NVVRFWF9JTklUKHBlZXIpICAgICAvKiBuby1vcCAqLworI2RlZmluZSBPTF9UWFJYX1BFRVJfU1RBVFNfTVVURVhfREVTVFJPWShwZWVyKSAgLyogbm8tb3AgKi8KKyNlbmRpZgorCisjaWZuZGVmIERFQlVHX0hUVF9DUkVESVQKKyNkZWZpbmUgREVCVUdfSFRUX0NSRURJVCAwCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVFVSRV9UU09fREVCVUcpCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX1JFU0VUX01TRFUocGRldikgXAorCWRvIHsgXAorCQlpbnQgaWR4ID0gVFhSWF9TVEFUU19UU09fTVNEVV9JRFgocGRldik7XAorCQlwZGV2LT5zdGF0cy5wdWIudHgudHNvLnRzb19pbmZvLnRzb19tc2R1X2luZm9baWR4XS5udW1fc2VnID0gMDsgXAorCQlwZGV2LT5zdGF0cy5wdWIudHgudHNvLnRzb19pbmZvLnRzb19tc2R1X2luZm9baWR4XS50c29fc2VnX2lkeCA9IDA7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX01TRFVfSURYKHBkZXYpIFwKKwlwZGV2LT5zdGF0cy5wdWIudHgudHNvLnRzb19pbmZvLnRzb19tc2R1X2lkeAorCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX01TRFUocGRldiwgaWR4KSBcCisJcGRldi0+c3RhdHMucHViLnR4LnRzby50c29faW5mby50c29fbXNkdV9pbmZvW2lkeF0KKworI2RlZmluZSBUWFJYX1NUQVRTX1RTT19NU0RVX05VTV9TRUcocGRldiwgaWR4KSBcCisJcGRldi0+c3RhdHMucHViLnR4LnRzby50c29faW5mby50c29fbXNkdV9pbmZvW2lkeF0ubnVtX3NlZworCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX0NVUlJfTVNEVShwZGV2KSBcCisJVFhSWF9TVEFUU19UU09fTVNEVShwZGV2LCBUWFJYX1NUQVRTX1RTT19NU0RVX0lEWChwZGV2KSkKKworI2RlZmluZSBUWFJYX1NUQVRTX1RTT19JTkNfTVNEVV9JRFgocGRldikgXAorCWRvIHsgXAorCQlUWFJYX1NUQVRTX1RTT19NU0RVX0lEWChwZGV2KSsrOyBcCisJCVRYUlhfU1RBVFNfVFNPX01TRFVfSURYKHBkZXYpICY9IE5VTV9NQVhfVFNPX01TRFVTX01BU0s7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX1NFR19JRFgocGRldikgXAorCVRYUlhfU1RBVFNfVFNPX0NVUlJfTVNEVShwZGV2KS50c29fc2VnX2lkeAorCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX0lOQ19TRUcocGRldikgXAorCVRYUlhfU1RBVFNfVFNPX0NVUlJfTVNEVShwZGV2KS5udW1fc2VnKysKKworI2RlZmluZSBUWFJYX1NUQVRTX1RTT19SU1RfU0VHKHBkZXYpIFwKKwlUWFJYX1NUQVRTX1RTT19DVVJSX01TRFUocGRldikubnVtX3NlZyA9IDAKKworI2RlZmluZSBUWFJYX1NUQVRTX1RTT19SU1RfU0VHX0lEWChwZGV2KSBcCisJVFhSWF9TVEFUU19UU09fQ1VSUl9NU0RVKHBkZXYpLnRzb19zZWdfaWR4ID0gMAorCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX1NFRyhwZGV2LCBtc2R1X2lkeCwgc2VnX2lkeCkgXAorCVRYUlhfU1RBVFNfVFNPX01TRFUocGRldiwgbXNkdV9pZHgpLnRzb19zZWdzW3NlZ19pZHhdCisKKyNkZWZpbmUgVFhSWF9TVEFUU19UU09fQ1VSUl9TRUcocGRldikgXAorCVRYUlhfU1RBVFNfVFNPX1NFRyhwZGV2LCBUWFJYX1NUQVRTX1RTT19NU0RVX0lEWChwZGV2KSwgXAorCSBUWFJYX1NUQVRTX1RTT19TRUdfSURYKHBkZXYpKSBcCisKKyNkZWZpbmUgVFhSWF9TVEFUU19UU09fSU5DX1NFR19JRFgocGRldikgXAorCWRvIHsgXAorCQlUWFJYX1NUQVRTX1RTT19TRUdfSURYKHBkZXYpKys7IFwKKwkJVFhSWF9TVEFUU19UU09fU0VHX0lEWChwZGV2KSAmPSBOVU1fTUFYX1RTT19TRUdTX01BU0s7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX1NFR19VUERBVEUocGRldiwgdHNvX3NlZykgXAorCShUWFJYX1NUQVRTX1RTT19DVVJSX1NFRyhwZGV2KSA9IHRzb19zZWcpCisKKyNlbHNlCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX1JFU0VUX01TRFUocGRldikgLyogbm8tb3AgKi8KKyNkZWZpbmUgVFhSWF9TVEFUU19UU09fTVNEVV9JRFgocGRldikgLyogbm8tb3AgKi8KKyNkZWZpbmUgVFhSWF9TVEFUU19UU09fTVNEVShwZGV2LCBpZHgpIC8qIG5vLW9wICovCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX01TRFVfTlVNX1NFRyhwZGV2LCBpZHgpIC8qIG5vLW9wICovCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX0NVUlJfTVNEVShwZGV2KSAvKiBuby1vcCAqLworI2RlZmluZSBUWFJYX1NUQVRTX1RTT19JTkNfTVNEVV9JRFgocGRldikgLyogbm8tb3AgKi8KKyNkZWZpbmUgVFhSWF9TVEFUU19UU09fU0VHX0lEWChwZGV2KSAvKiBuby1vcCAqLworI2RlZmluZSBUWFJYX1NUQVRTX1RTT19TRUcocGRldiwgbXNkdV9pZHgsIHNlZ19pZHgpIC8qIG5vLW9wICovCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX0NVUlJfU0VHKHBkZXYpIC8qIG5vLW9wICovCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX0lOQ19TRUdfSURYKHBkZXYpIC8qIG5vLW9wICovCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX1NFR19VUERBVEUocGRldiwgdHNvX3NlZykgLyogbm8tb3AgKi8KKyNkZWZpbmUgVFhSWF9TVEFUU19UU09fSU5DX1NFRyhwZGV2KSAvKiBuby1vcCAqLworI2RlZmluZSBUWFJYX1NUQVRTX1RTT19SU1RfU0VHKHBkZXYpIC8qIG5vLW9wICovCisjZGVmaW5lIFRYUlhfU1RBVFNfVFNPX1JTVF9TRUdfSURYKHBkZXYpIC8qIG5vLW9wICovCisKKyNlbmRpZiAvKiBGRUFUVVJFX1RTT19ERUJVRyAqLworCisjZW5kaWYgLyogX09MX1RYUlhfSU5URVJOQUxfX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfdHhyeF9wZWVyX2ZpbmQuYyBiL2NvcmUvZHAvdHhyeC9vbF90eHJ4X3BlZXJfZmluZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzQzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvb2xfdHhyeF9wZWVyX2ZpbmQuYwpAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT0gaW5jbHVkZXMgPT09Ki8KKy8qIGhlYWRlciBmaWxlcyBmb3IgT1MgcHJpbWl0aXZlcyAqLworI2luY2x1ZGUgPG9zZGVwLmg+ICAgICAgICAgICAgICAvKiB1aW50MzJfdCwgZXRjLiAqLworI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4gICAgICAgICAvKiBjZGZfbWVtX21hbGxvYywgZXRjLiAqLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPiAgICAgICAgICAvKiBjZGZfZGV2aWNlX3QsIGNkZl9wcmludCAqLworLyogaGVhZGVyIGZpbGVzIGZvciB1dGlsaXRpZXMgKi8KKyNpbmNsdWRlIDxjZHNfcXVldWUuaD4gICAgICAgICAgLyogVEFJTFEgKi8KKworLyogaGVhZGVyIGZpbGVzIGZvciBjb25maWd1cmF0aW9uIEFQSSAqLworI2luY2x1ZGUgPG9sX2NmZy5oPiAgICAgICAgICAgICAvKiBvbF9jZmdfbWF4X3BlZXJfaWQgKi8KKworLyogaGVhZGVyIGZpbGVzIGZvciBvdXIgaW50ZXJuYWwgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2FwaS5oPiAgICAgICAgLyogb2xfdHhyeF9wZGV2X3QsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvbF90eHJ4X2RiZy5oPiAgICAgICAgLyogVFhSWF9ERUJVR19MRVZFTCAqLworI2luY2x1ZGUgPG9sX3R4cnhfaW50ZXJuYWwuaD4gICAvKiBvbF90eHJ4X3BkZXZfdCwgZXRjLiAqLworI2luY2x1ZGUgPG9sX3R4cnguaD4gICAgICAgICAgICAvKiBvbF90eHJ4X3BlZXJfdW5yZWZfZGVsZXRlICovCisjaW5jbHVkZSA8b2xfdHhyeF9wZWVyX2ZpbmQuaD4gIC8qIG9sX3R4cnhfcGVlcl9maW5kX2F0dGFjaCwgZXRjLiAqLworI2luY2x1ZGUgPG9sX3R4X3F1ZXVlLmg+CisKKy8qPT09IG1pc2MuIC8gdXRpbGl0eSBmdW5jdGlvbiBkZWZpbml0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBvbF90eHJ4X2xvZzJfY2VpbCh1bnNpZ25lZCB2YWx1ZSkKK3sKKwkvKiBuZWVkIHRvIHN3aXRjaCB0byB1bnNpZ25lZCBtYXRoIHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzCisJICogd2lsbCByaWdodC1zaGlmdCB0b3dhcmRzIDAgaW5zdGVhZCBvZiAtMQorCSAqLworCXVuc2lnbmVkIHRtcCA9IHZhbHVlOworCWludCBsb2cyID0gLTE7CisKKwlpZiAodmFsdWUgPT0gMCkgeworCQlUWFJYX0FTU0VSVDIoMCk7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlICh0bXApIHsKKwkJbG9nMisrOworCQl0bXAgPj49IDE7CisJfQorCWlmICgxVSA8PCBsb2cyICE9IHZhbHVlKQorCQlsb2cyKys7CisKKwlyZXR1cm4gbG9nMjsKK30KKworc3RhdGljIGludAorb2xfdHhyeF9wZWVyX2ZpbmRfYWRkX2lkX3RvX29iaihzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIsIHVpbnQxNl90IHBlZXJfaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9QRUVSX0lEX1BFUl9QRUVSOyBpKyspIHsKKwkJaWYgKHBlZXItPnBlZXJfaWRzW2ldID09IEhUVF9JTlZBTElEX1BFRVIpIHsKKwkJCXBlZXItPnBlZXJfaWRzW2ldID0gcGVlcl9pZDsKKwkJCXJldHVybiAwOyAgICAgICAvKiBzdWNjZXNzICovCisJCX0KKwl9CisJcmV0dXJuIDE7ICAgICAgICAgICAgICAgLyogZmFpbHVyZSAqLworfQorCisvKj09PSBmdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgcGVlciBNQUMgYWRkciAtLT4gcGVlciBvYmplY3QgaGFzaCB0YWJsZSA9PT09PSovCisKKy8qCisgKiBUWFJYX1BFRVJfSEFTSF9MT0FEX0ZBQ1RPUjoKKyAqIE11bHRpcGx5IGJ5IDIgYW5kIGRpdmlkZSBieSAyXjAgKHNoaWZ0IGJ5IDApLCB0aGVuIHJvdW5kIHVwIHRvIGEKKyAqIHBvd2VyIG9mIHR3by4KKyAqIFRoaXMgcHJvdmlkZXMgYXQgbGVhc3QgdHdpY2UgYXMgbWFueSBiaW5zIGluIHRoZSBwZWVyIGhhc2ggdGFibGUKKyAqIGFzIHRoZXJlIHdpbGwgYmUgZW50cmllcy4KKyAqIEhhdmluZyBzdWJzdGFudGlhbGx5IG1vcmUgYmlucyB0aGFuIHNwYWNlcyBtaW5pbWl6ZXMgdGhlIHByb2JhYmlsaXR5IG9mCisgKiBoYXZpbmcgdG8gY29tcGFyZSBNQUMgYWRkcmVzc2VzLgorICogQmVjYXVzZSB0aGUgTUFDIGFkZHJlc3MgY29tcGFyaXNvbiBpcyBmYWlybHkgZWZmaWNpZW50LCBpdCBpcyBva2F5IGlmIHRoZQorICogaGFzaCB0YWJsZSBpcyBzcGFyc2VseSBsb2FkZWQsIGJ1dCBpdCdzIGdlbmVyYWxseSBiZXR0ZXIgdG8gdXNlIGV4dHJhIG1lbQorICogdG8ga2VlcCB0aGUgdGFibGUgc3BhcnNlLCB0byBrZWVwIHRoZSBsb29rdXBzIGFzIGZhc3QgYXMgcG9zc2libGUuCisgKiBBbiBvcHRpbWl6YXRpb24gd291bGQgYmUgdG8gYXBwbHkgYSBtb3JlIGNvbnNlcnZhdGl2ZSBsb2FkaW5nIGZhY3RvciBmb3IKKyAqIGhpZ2ggbGF0ZW5jeSwgd2hlcmUgdGhlIGxvb2t1cCBoYXBwZW5zIGR1cmluZyB0aGUgdHggY2xhc3NpZmljYXRpb24gb2YKKyAqIGV2ZXJ5IHR4IGZyYW1lLCB0aGFuIGZvciBsb3ctbGF0ZW5jeSwgd2hlcmUgdGhlIGxvb2t1cCBvbmx5IGhhcHBlbnMKKyAqIGR1cmluZyBhc3NvY2lhdGlvbiwgd2hlbiB0aGUgUEVFUl9NQVAgbWVzc2FnZSBpcyByZWNlaXZlZC4KKyAqLworI2RlZmluZSBUWFJYX1BFRVJfSEFTSF9MT0FEX01VTFQgIDIKKyNkZWZpbmUgVFhSWF9QRUVSX0hBU0hfTE9BRF9TSElGVCAwCisKK3N0YXRpYyBpbnQgb2xfdHhyeF9wZWVyX2ZpbmRfaGFzaF9hdHRhY2goc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCWludCBpLCBoYXNoX2VsZW1zLCBsb2cyOworCisJLyogYWxsb2NhdGUgdGhlIHBlZXIgTUFDIGFkZHJlc3MgLT4gcGVlciBvYmplY3QgaGFzaCB0YWJsZSAqLworCWhhc2hfZWxlbXMgPSBvbF9jZmdfbWF4X3BlZXJfaWQocGRldi0+Y3RybF9wZGV2KSArIDE7CisJaGFzaF9lbGVtcyAqPSBUWFJYX1BFRVJfSEFTSF9MT0FEX01VTFQ7CisJaGFzaF9lbGVtcyA+Pj0gVFhSWF9QRUVSX0hBU0hfTE9BRF9TSElGVDsKKwlsb2cyID0gb2xfdHhyeF9sb2cyX2NlaWwoaGFzaF9lbGVtcyk7CisJaGFzaF9lbGVtcyA9IDEgPDwgbG9nMjsKKworCXBkZXYtPnBlZXJfaGFzaC5tYXNrID0gaGFzaF9lbGVtcyAtIDE7CisJcGRldi0+cGVlcl9oYXNoLmlkeF9iaXRzID0gbG9nMjsKKwkvKiBhbGxvY2F0ZSBhbiBhcnJheSBvZiBUQUlMUSBwZWVyIG9iamVjdCBsaXN0cyAqLworCXBkZXYtPnBlZXJfaGFzaC5iaW5zID0KKwkJY2RmX21lbV9tYWxsb2MoaGFzaF9lbGVtcyAqCisJCQkgICAgICAgc2l6ZW9mKFRBSUxRX0hFQUQoYW5vbnltb3VzX3RhaWxfcSwKKwkJCQkJCSBvbF90eHJ4X3BlZXJfdCkpKTsKKwlpZiAoIXBkZXYtPnBlZXJfaGFzaC5iaW5zKQorCQlyZXR1cm4gMTsgICAgICAgLyogZmFpbHVyZSAqLworCisJZm9yIChpID0gMDsgaSA8IGhhc2hfZWxlbXM7IGkrKykKKwkJVEFJTFFfSU5JVCgmcGRldi0+cGVlcl9oYXNoLmJpbnNbaV0pOworCisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLworfQorCitzdGF0aWMgdm9pZCBvbF90eHJ4X3BlZXJfZmluZF9oYXNoX2RldGFjaChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYpCit7CisJY2RmX21lbV9mcmVlKHBkZXYtPnBlZXJfaGFzaC5iaW5zKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZAorb2xfdHhyeF9wZWVyX2ZpbmRfaGFzaF9pbmRleChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgICAgIHVuaW9uIG9sX3R4cnhfYWxpZ25fbWFjX2FkZHJfdCAqbWFjX2FkZHIpCit7CisJdW5zaWduZWQgaW5kZXg7CisKKwlpbmRleCA9CisJCW1hY19hZGRyLT5hbGlnbjIuYnl0ZXNfYWIgXgorCQltYWNfYWRkci0+YWxpZ24yLmJ5dGVzX2NkIF4gbWFjX2FkZHItPmFsaWduMi5ieXRlc19lZjsKKwlpbmRleCBePSBpbmRleCA+PiBwZGV2LT5wZWVyX2hhc2guaWR4X2JpdHM7CisJaW5kZXggJj0gcGRldi0+cGVlcl9oYXNoLm1hc2s7CisJcmV0dXJuIGluZGV4OworfQorCit2b2lkCitvbF90eHJ4X3BlZXJfZmluZF9oYXNoX2FkZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIpCit7CisJdW5zaWduZWQgaW5kZXg7CisKKwlpbmRleCA9IG9sX3R4cnhfcGVlcl9maW5kX2hhc2hfaW5kZXgocGRldiwgJnBlZXItPm1hY19hZGRyKTsKKwljZGZfc3Bpbl9sb2NrX2JoKCZwZGV2LT5wZWVyX3JlZl9tdXRleCk7CisJLyoKKwkgKiBJdCBpcyBpbXBvcnRhbnQgdG8gYWRkIHRoZSBuZXcgcGVlciBhdCB0aGUgdGFpbCBvZiB0aGUgcGVlciBsaXN0CisJICogd2l0aCB0aGUgYmluIGluZGV4LiAgVG9nZXRoZXIgd2l0aCBoYXZpbmcgdGhlIGhhc2hfZmluZCBmdW5jdGlvbgorCSAqIHNlYXJjaCBmcm9tIGhlYWQgdG8gdGFpbCwgdGhpcyBlbnN1cmVzIHRoYXQgaWYgdHdvIGVudHJpZXMgd2l0aAorCSAqIHRoZSBzYW1lIE1BQyBhZGRyZXNzIGFyZSBzdG9yZWQsIHRoZSBvbmUgYWRkZWQgZmlyc3Qgd2lsbCBiZQorCSAqIGZvdW5kIGZpcnN0LgorCSAqLworCVRBSUxRX0lOU0VSVF9UQUlMKCZwZGV2LT5wZWVyX2hhc2guYmluc1tpbmRleF0sIHBlZXIsIGhhc2hfbGlzdF9lbGVtKTsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnBlZXJfcmVmX211dGV4KTsKK30KKworc3RydWN0IG9sX3R4cnhfcGVlcl90ICpvbF90eHJ4X3BlZXJfdmRldl9maW5kX2hhc2goc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2LAorCQkJCQkJICAgc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkJCQkJICAgdWludDhfdCAqcGVlcl9tYWNfYWRkciwKKwkJCQkJCSAgIGludCBtYWNfYWRkcl9pc19hbGlnbmVkLAorCQkJCQkJICAgdWludDhfdCBjaGVja192YWxpZCkKK3sKKwl1bmlvbiBvbF90eHJ4X2FsaWduX21hY19hZGRyX3QgbG9jYWxfbWFjX2FkZHJfYWxpZ25lZCwgKm1hY19hZGRyOworCXVuc2lnbmVkIGluZGV4OworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKworCWlmIChtYWNfYWRkcl9pc19hbGlnbmVkKSB7CisJCW1hY19hZGRyID0gKHVuaW9uIG9sX3R4cnhfYWxpZ25fbWFjX2FkZHJfdCAqKXBlZXJfbWFjX2FkZHI7CisJfSBlbHNlIHsKKwkJY2RmX21lbV9jb3B5KCZsb2NhbF9tYWNfYWRkcl9hbGlnbmVkLnJhd1swXSwKKwkJCSAgICAgcGVlcl9tYWNfYWRkciwgT0xfVFhSWF9NQUNfQUREUl9MRU4pOworCQltYWNfYWRkciA9ICZsb2NhbF9tYWNfYWRkcl9hbGlnbmVkOworCX0KKwlpbmRleCA9IG9sX3R4cnhfcGVlcl9maW5kX2hhc2hfaW5kZXgocGRldiwgbWFjX2FkZHIpOworCWNkZl9zcGluX2xvY2tfYmgoJnBkZXYtPnBlZXJfcmVmX211dGV4KTsKKwlUQUlMUV9GT1JFQUNIKHBlZXIsICZwZGV2LT5wZWVyX2hhc2guYmluc1tpbmRleF0sIGhhc2hfbGlzdF9lbGVtKSB7CisJCWlmIChvbF90eHJ4X3BlZXJfZmluZF9tYWNfYWRkcl9jbXAobWFjX2FkZHIsICZwZWVyLT5tYWNfYWRkcikgPT0KKwkJICAgIDAgJiYgKGNoZWNrX3ZhbGlkID09IDAgfHwgcGVlci0+dmFsaWQpCisJCSAgICAmJiBwZWVyLT52ZGV2ID09IHZkZXYpIHsKKwkJCS8qIGZvdW5kIGl0IC0gaW5jcmVtZW50IHRoZSByZWYgY291bnQgYmVmb3JlIHJlbGVhc2luZworCQkJICAgdGhlIGxvY2sgKi8KKwkJCWNkZl9hdG9taWNfaW5jKCZwZWVyLT5yZWZfY250KTsKKwkJCWNkZl9zcGluX3VubG9ja19iaCgmcGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCQkJcmV0dXJuIHBlZXI7CisJCX0KKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT5wZWVyX3JlZl9tdXRleCk7CisJcmV0dXJuIE5VTEw7ICAgICAgICAgICAgLyogZmFpbHVyZSAqLworfQorCitzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKm9sX3R4cnhfcGVlcl9maW5kX2hhc2hfZmluZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkJCQkgICB1aW50OF90ICpwZWVyX21hY19hZGRyLAorCQkJCQkJICAgaW50IG1hY19hZGRyX2lzX2FsaWduZWQsCisJCQkJCQkgICB1aW50OF90IGNoZWNrX3ZhbGlkKQoreworCXVuaW9uIG9sX3R4cnhfYWxpZ25fbWFjX2FkZHJfdCBsb2NhbF9tYWNfYWRkcl9hbGlnbmVkLCAqbWFjX2FkZHI7CisJdW5zaWduZWQgaW5kZXg7CisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyOworCisJaWYgKG1hY19hZGRyX2lzX2FsaWduZWQpIHsKKwkJbWFjX2FkZHIgPSAodW5pb24gb2xfdHhyeF9hbGlnbl9tYWNfYWRkcl90ICopcGVlcl9tYWNfYWRkcjsKKwl9IGVsc2UgeworCQljZGZfbWVtX2NvcHkoJmxvY2FsX21hY19hZGRyX2FsaWduZWQucmF3WzBdLAorCQkJICAgICBwZWVyX21hY19hZGRyLCBPTF9UWFJYX01BQ19BRERSX0xFTik7CisJCW1hY19hZGRyID0gJmxvY2FsX21hY19hZGRyX2FsaWduZWQ7CisJfQorCWluZGV4ID0gb2xfdHhyeF9wZWVyX2ZpbmRfaGFzaF9pbmRleChwZGV2LCBtYWNfYWRkcik7CisJY2RmX3NwaW5fbG9ja19iaCgmcGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCVRBSUxRX0ZPUkVBQ0gocGVlciwgJnBkZXYtPnBlZXJfaGFzaC5iaW5zW2luZGV4XSwgaGFzaF9saXN0X2VsZW0pIHsKKwkJaWYgKG9sX3R4cnhfcGVlcl9maW5kX21hY19hZGRyX2NtcChtYWNfYWRkciwgJnBlZXItPm1hY19hZGRyKSA9PQorCQkgICAgMCAmJiAoY2hlY2tfdmFsaWQgPT0gMCB8fCBwZWVyLT52YWxpZCkpIHsKKwkJCS8qIGZvdW5kIGl0IC0gaW5jcmVtZW50IHRoZSByZWYgY291bnQgYmVmb3JlCisJCQkgICByZWxlYXNpbmcgdGhlIGxvY2sgKi8KKwkJCWNkZl9hdG9taWNfaW5jKCZwZWVyLT5yZWZfY250KTsKKwkJCWNkZl9zcGluX3VubG9ja19iaCgmcGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCQkJcmV0dXJuIHBlZXI7CisJCX0KKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwZGV2LT5wZWVyX3JlZl9tdXRleCk7CisJcmV0dXJuIE5VTEw7ICAgICAgICAgICAgLyogZmFpbHVyZSAqLworfQorCit2b2lkCitvbF90eHJ4X3BlZXJfZmluZF9oYXNoX3JlbW92ZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgICAgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIpCit7CisJdW5zaWduZWQgaW5kZXg7CisKKwlpbmRleCA9IG9sX3R4cnhfcGVlcl9maW5kX2hhc2hfaW5kZXgocGRldiwgJnBlZXItPm1hY19hZGRyKTsKKwkvKgorCSAqIERPIE5PVCB0YWtlIHRoZSBwZWVyX3JlZl9tdXRleCBsb2NrIGhlcmUgLSBpdCBuZWVkcyB0byBiZSB0YWtlbgorCSAqIGJ5IHRoZSBjYWxsZXIuCisJICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBsb2NrIGZyb20gdGhlIHRpbWUgdGhlIHBlZXIgb2JqZWN0J3MKKwkgKiByZWZlcmVuY2UgY291bnQgaXMgZGVjcmVtZW50ZWQgYW5kIHRlc3RlZCB1cCB0aHJvdWdoIHRoZSB0aW1lIHRoZQorCSAqIHJlZmVyZW5jZSB0byB0aGUgcGVlciBvYmplY3QgaXMgcmVtb3ZlZCBmcm9tIHRoZSBoYXNoIHRhYmxlLCBieQorCSAqIHRoaXMgZnVuY3Rpb24uCisJICogSG9sZGluZyB0aGUgbG9jayBvbmx5IHdoaWxlIHJlbW92aW5nIHRoZSBwZWVyIG9iamVjdCByZWZlcmVuY2UKKwkgKiBmcm9tIHRoZSBoYXNoIHRhYmxlIGtlZXBzIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQsIGJ1dCBkb2VzIG5vdAorCSAqIHByb3RlY3QgYWdhaW5zdCBhIG5ldyBITCB0eCBjb250ZXh0IHN0YXJ0aW5nIHRvIHVzZSB0aGUgcGVlciBvYmplY3QKKwkgKiBpZiBpdCBsb29rcyB1cCB0aGUgcGVlciBvYmplY3QgZnJvbSBpdHMgTUFDIGFkZHJlc3MganVzdCBhZnRlciB0aGUKKwkgKiBwZWVyIHJlZiBjb3VudCBpcyBkZWNyZW1lbnRlZCB0byB6ZXJvLCBidXQganVzdCBiZWZvcmUgdGhlIHBlZXIKKwkgKiBvYmplY3QgcmVmZXJlbmNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgaGFzaCB0YWJsZS4KKwkgKi8KKwkvKiBjZGZfc3Bpbl9sb2NrX2JoKCZwZGV2LT5wZWVyX3JlZl9tdXRleCk7ICovCisJVEFJTFFfUkVNT1ZFKCZwZGV2LT5wZWVyX2hhc2guYmluc1tpbmRleF0sIHBlZXIsIGhhc2hfbGlzdF9lbGVtKTsKKwkvKiBjZGZfc3Bpbl91bmxvY2tfYmgoJnBkZXYtPnBlZXJfcmVmX211dGV4KTsgKi8KK30KKwordm9pZCBvbF90eHJ4X3BlZXJfZmluZF9oYXNoX2VyYXNlKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwl1bnNpZ25lZCBpOworCS8qCisJICogTm90IHJlYWxseSBuZWNlc3NhcnkgdG8gdGFrZSBwZWVyX3JlZl9tdXRleCBsb2NrIC0gYnkgdGhpcyBwb2ludCwKKwkgKiBpdCdzIGtub3duIHRoYXQgdGhlIHBkZXYgaXMgbm8gbG9uZ2VyIGluIHVzZS4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPD0gcGRldi0+cGVlcl9oYXNoLm1hc2s7IGkrKykgeworCQlpZiAoIVRBSUxRX0VNUFRZKCZwZGV2LT5wZWVyX2hhc2guYmluc1tpXSkpIHsKKwkJCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwgKnBlZXJfbmV4dDsKKworCQkJLyoKKwkJCSAqIFRBSUxRX0ZPUkVBQ0hfU0FGRSBtdXN0IGJlIHVzZWQgaGVyZSB0byBhdm9pZCBhbnkKKwkJCSAqIG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uIGFmdGVyIHBlZXIgaXMgZnJlZWQKKwkJCSAqLworCQkJVEFJTFFfRk9SRUFDSF9TQUZFKHBlZXIsICZwZGV2LT5wZWVyX2hhc2guYmluc1tpXSwKKwkJCQkJICAgaGFzaF9saXN0X2VsZW0sIHBlZXJfbmV4dCkgeworCQkJCS8qCisJCQkJICogRG9uJ3QgcmVtb3ZlIHRoZSBwZWVyIGZyb20gdGhlIGhhc2ggdGFibGUgLQorCQkJCSAqIHRoYXQgd291bGQgbW9kaWZ5IHRoZSBsaXN0IHdlIGFyZSBjdXJyZW50bHkKKwkJCQkgKiB0cmF2ZXJzaW5nLAorCQkJCSAqIGFuZCBpdCdzIG5vdCBuZWNlc3NhcnkgYW55d2F5LgorCQkJCSAqLworCQkJCS8qCisJCQkJICogQXJ0aWZpY2lhbGx5IGFkanVzdCB0aGUgcGVlcidzIHJlZiBjb3VudCB0bworCQkJCSAqIDEsIHNvIGl0IHdpbGwgZ2V0IGRlbGV0ZWQgYnkKKwkJCQkgKiBvbF90eHJ4X3BlZXJfdW5yZWZfZGVsZXRlLgorCQkJCSAqLworCQkJCWNkZl9hdG9taWNfaW5pdCgmcGVlci0+cmVmX2NudCk7IC8qIHNldCB0byAwICovCisJCQkJY2RmX2F0b21pY19pbmMoJnBlZXItPnJlZl9jbnQpOyAvKiBpbmNyIHRvIDEgKi8KKwkJCQlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfRVJSLAorCQkJCQkgICAiJXM6IERlbGV0ZSBQZWVyICVwXG4iLCBfX2Z1bmNfXywKKwkJCQkJICAgcGVlcik7CisJCQkJb2xfdHhyeF9wZWVyX3VucmVmX2RlbGV0ZShwZWVyKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyo9PT0gZnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIHBlZXIgaWQgLS0+IHBlZXIgb2JqZWN0IG1hcCA9PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IG9sX3R4cnhfcGVlcl9maW5kX21hcF9hdHRhY2goc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCWludCBtYXhfcGVlcnMsIHBlZXJfbWFwX3NpemU7CisKKwkvKiBhbGxvY2F0ZSB0aGUgcGVlciBJRCAtPiBwZWVyIG9iamVjdCBtYXAgKi8KKwltYXhfcGVlcnMgPSBvbF9jZmdfbWF4X3BlZXJfaWQocGRldi0+Y3RybF9wZGV2KSArIDE7CisJcGVlcl9tYXBfc2l6ZSA9IG1heF9wZWVycyAqIHNpemVvZihwZGV2LT5wZWVyX2lkX3RvX29ial9tYXBbMF0pOworCXBkZXYtPnBlZXJfaWRfdG9fb2JqX21hcCA9IGNkZl9tZW1fbWFsbG9jKHBlZXJfbWFwX3NpemUpOworCWlmICghcGRldi0+cGVlcl9pZF90b19vYmpfbWFwKQorCQlyZXR1cm4gMTsgICAgICAgLyogZmFpbHVyZSAqLworCisJLyoKKwkgKiBUaGUgcGVlcl9pZF90b19vYmpfbWFwIGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQsCisJICogc2luY2UgZWxlbWVudHMgYXJlIG9ubHkgdXNlZCBhZnRlciB0aGV5IGhhdmUgYmVlbiBpbmRpdmlkdWFsbHkKKwkgKiBpbml0aWFsaXplZC4KKwkgKiBIb3dldmVyLCBpdCBpcyBjb252ZW5pZW50IGZvciBkZWJ1Z2dpbmcgdG8gaGF2ZSBhbGwgZWxlbWVudHMKKwkgKiB0aGF0IGFyZSBub3QgaW4gdXNlIHNldCB0byAwLgorCSAqLworCWNkZl9tZW1fc2V0KHBkZXYtPnBlZXJfaWRfdG9fb2JqX21hcCwgcGVlcl9tYXBfc2l6ZSwgMCk7CisKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCit9CisKK3N0YXRpYyB2b2lkIG9sX3R4cnhfcGVlcl9maW5kX21hcF9kZXRhY2goc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KQoreworCWNkZl9tZW1fZnJlZShwZGV2LT5wZWVyX2lkX3RvX29ial9tYXApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK29sX3R4cnhfcGVlcl9maW5kX2FkZF9pZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgdWludDhfdCAqcGVlcl9tYWNfYWRkciwgdWludDE2X3QgcGVlcl9pZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisKKwkvKiBjaGVjayBpZiB0aGVyZSdzIGFscmVhZHkgYSBwZWVyIG9iamVjdCB3aXRoIHRoaXMgTUFDIGFkZHJlc3MgKi8KKwlwZWVyID0KKwkJb2xfdHhyeF9wZWVyX2ZpbmRfaGFzaF9maW5kKHBkZXYsIHBlZXJfbWFjX2FkZHIsCisJCQkJCSAgICAxIC8qIGlzIGFsaWduZWQgKi8sIDApOworCVRYUlhfUFJJTlQoVFhSWF9QUklOVF9MRVZFTF9JTkZPMSwgIiVzOiBwZWVyICVwIElEICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgcGVlciwgcGVlcl9pZCk7CisJaWYgKHBlZXIpIHsKKwkJLyogcGVlcidzIHJlZiBjb3VudCB3YXMgYWxyZWFkeSBpbmNyZW1lbnRlZCBieQorCQkgICBwZWVyX2ZpbmRfaGFzaF9maW5kICovCisJCXBkZXYtPnBlZXJfaWRfdG9fb2JqX21hcFtwZWVyX2lkXSA9IHBlZXI7CisJCS8qCisJCSAqIHJlbW92ZSB0aGUgcmVmZXJlbmNlIGFkZGVkIGluIG9sX3R4cnhfcGVlcl9maW5kX2hhc2hfZmluZC4KKwkJICogdGhlIHJlZmVyZW5jZSBmb3IgdGhlIGZpcnN0IHBlZXIgaWQgaXMgYWxyZWFkeSBhZGRlZCBpbgorCQkgKiBvbF90eHJ4X3BlZXJfYXR0YWNoLgorCQkgKiBSaXZhL1Byb250byBoYXMgb25lIHBlZXIgaWQgZm9yIGVhY2ggcGVlci4KKwkJICogUGVyZWdyaW5lL1JvbWUgaGFzIHR3byBwZWVyIGlkIGZvciBlYWNoIHBlZXIuCisJCSAqLworCQlpZiAocGVlci0+cGVlcl9pZHNbMF0gPT0gSFRUX0lOVkFMSURfUEVFUikgeworCQkJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwgIiVzOiBEZWxldGUgUGVlciAlcFxuIiwKKwkJCQkgICBfX2Z1bmNfXywgcGVlcik7CisJCQlvbF90eHJ4X3BlZXJfdW5yZWZfZGVsZXRlKHBlZXIpOworCQl9CisJCWlmIChvbF90eHJ4X3BlZXJfZmluZF9hZGRfaWRfdG9fb2JqKHBlZXIsIHBlZXJfaWQpKSB7CisJCQkvKiBUQkRYWFg6IGFzc2VydCBmb3Igbm93ICovCisJCQljZGZfYXNzZXJ0KDApOworCQl9CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBDdXJyZW50bHkgcGVlciBJRHMgYXJlIGFzc2lnbmVkIGZvciB2ZGV2cyBhcyB3ZWxsIGFzIHBlZXJzLgorCSAqIElmIHRoZSBwZWVyIElEIGlzIGZvciBhIHZkZXYsIHRoZW4gd2Ugd2lsbCBmYWlsIHRvIGZpbmQgYSBwZWVyCisJICogd2l0aCBhIG1hdGNoaW5nIE1BQyBhZGRyZXNzLgorCSAqLworCS8qIFRYUlhfQVNTRVJUMigwKTsgKi8KK30KKworLyo9PT0gYWxsb2NhdGlvbiAvIGRlYWxsb2NhdGlvbiBmdW5jdGlvbiBkZWZpbml0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQgb2xfdHhyeF9wZWVyX2ZpbmRfYXR0YWNoKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwlpZiAob2xfdHhyeF9wZWVyX2ZpbmRfbWFwX2F0dGFjaChwZGV2KSkKKwkJcmV0dXJuIDE7CisJaWYgKG9sX3R4cnhfcGVlcl9maW5kX2hhc2hfYXR0YWNoKHBkZXYpKSB7CisJCW9sX3R4cnhfcGVlcl9maW5kX21hcF9kZXRhY2gocGRldik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCit9CisKK3ZvaWQgb2xfdHhyeF9wZWVyX2ZpbmRfZGV0YWNoKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldikKK3sKKwlvbF90eHJ4X3BlZXJfZmluZF9tYXBfZGV0YWNoKHBkZXYpOworCW9sX3R4cnhfcGVlcl9maW5kX2hhc2hfZGV0YWNoKHBkZXYpOworfQorCisvKj09PSBmdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgbWVzc2FnZSBoYW5kbGluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQKK29sX3J4X3BlZXJfbWFwX2hhbmRsZXIob2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkgICAgICAgdWludDE2X3QgcGVlcl9pZCwKKwkJICAgICAgIHVpbnQ4X3QgdmRldl9pZCwgdWludDhfdCAqcGVlcl9tYWNfYWRkciwgaW50IHR4X3JlYWR5KQoreworCW9sX3R4cnhfcGVlcl9maW5kX2FkZF9pZChwZGV2LCBwZWVyX21hY19hZGRyLCBwZWVyX2lkKTsKK30KKwordm9pZCBvbF90eHJ4X3BlZXJfdHhfcmVhZHlfaGFuZGxlcihvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIHVpbnQxNl90IHBlZXJfaWQpCit7Cit9CisKK3ZvaWQgb2xfcnhfcGVlcl91bm1hcF9oYW5kbGVyKG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgdWludDE2X3QgcGVlcl9pZCkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisJcGVlciA9IChwZWVyX2lkID09IEhUVF9JTlZBTElEX1BFRVIpID8gTlVMTCA6CisJICAgICAgIHBkZXYtPnBlZXJfaWRfdG9fb2JqX21hcFtwZWVyX2lkXTsKKwlUWFJYX1BSSU5UKFRYUlhfUFJJTlRfTEVWRUxfSU5GTzEsCisJCSAgICIlczogcGVlciAlcCB3aXRoIElEICVkIHRvIGJlIHVubWFwcGVkLlxuIiwgX19mdW5jX18sIHBlZXIsCisJCSAgIHBlZXJfaWQpOworCXBkZXYtPnBlZXJfaWRfdG9fb2JqX21hcFtwZWVyX2lkXSA9IE5VTEw7CisJLyoKKwkgKiBDdXJyZW50bHkgcGVlciBJRHMgYXJlIGFzc2lnbmVkIGZvciB2ZGV2cyBhcyB3ZWxsIGFzIHBlZXJzLgorCSAqIElmIHRoZSBwZWVyIElEIGlzIGZvciBhIHZkZXYsIHRoZW4gdGhlIHBlZXIgcG9pbnRlciBzdG9yZWQKKwkgKiBpbiBwZWVyX2lkX3RvX29ial9tYXAgd2lsbCBiZSBOVUxMLgorCSAqLworCWlmICghcGVlcikKKwkJcmV0dXJuOworCS8qCisJICogUmVtb3ZlIGEgcmVmZXJlbmNlIHRvIHRoZSBwZWVyLgorCSAqIElmIHRoZXJlIGFyZSBubyBtb3JlIHJlZmVyZW5jZXMsIGRlbGV0ZSB0aGUgcGVlciBvYmplY3QuCisJICovCisJVFhSWF9QUklOVChUWFJYX1BSSU5UX0xFVkVMX0VSUiwKKwkJICAgIiVzOiBSZW1vdmUgdGhlIElEICVkIHJlZmVyZW5jZSB0byBwZWVyICVwXG4iLAorCQkgICBfX2Z1bmNfXywgcGVlcl9pZCwgcGVlcik7CisJb2xfdHhyeF9wZWVyX3VucmVmX2RlbGV0ZShwZWVyKTsKK30KKworc3RydWN0IG9sX3R4cnhfcGVlcl90ICpvbF90eHJ4X2Fzc29jX3BlZXJfZmluZChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYpCit7CisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyOworCisJY2RmX3NwaW5fbG9ja19iaCgmdmRldi0+cGRldi0+bGFzdF9yZWFsX3BlZXJfbXV0ZXgpOworCS8qCisJICogQ2hlY2sgdGhlIFRYUlggUGVlciBpcyBpdHNlbGYgdmFsaWQgQW5kIGFsc28KKwkgKiBpZiBIVFQgUGVlciBJRCBoYXMgYmVlbiBzZXR1cCBmb3IgdGhpcyBwZWVyCisJICovCisJaWYgKHZkZXYtPmxhc3RfcmVhbF9wZWVyCisJICAgICYmIHZkZXYtPmxhc3RfcmVhbF9wZWVyLT5wZWVyX2lkc1swXSAhPSBIVFRfSU5WQUxJRF9QRUVSX0lEKSB7CisJCWNkZl9hdG9taWNfaW5jKCZ2ZGV2LT5sYXN0X3JlYWxfcGVlci0+cmVmX2NudCk7CisJCXBlZXIgPSB2ZGV2LT5sYXN0X3JlYWxfcGVlcjsKKwl9IGVsc2UgeworCQlwZWVyID0gTlVMTDsKKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ2ZGV2LT5wZGV2LT5sYXN0X3JlYWxfcGVlcl9tdXRleCk7CisJcmV0dXJuIHBlZXI7Cit9CisKKy8qPT09IGZ1bmN0aW9uIGRlZmluaXRpb25zIGZvciBkZWJ1ZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmIGRlZmluZWQoVFhSWF9ERUJVR19MRVZFTCkgJiYgVFhSWF9ERUJVR19MRVZFTCA+IDUKK3ZvaWQgb2xfdHhyeF9wZWVyX2ZpbmRfZGlzcGxheShvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXYsIGludCBpbmRlbnQpCit7CisJaW50IGksIG1heF9wZWVyczsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJSpzcGVlciBtYXA6XG4iLCBpbmRlbnQsICIgIik7CisJbWF4X3BlZXJzID0gb2xfY2ZnX21heF9wZWVyX2lkKHBkZXYtPmN0cmxfcGRldikgKyAxOworCWZvciAoaSA9IDA7IGkgPCBtYXhfcGVlcnM7IGkrKykgeworCQlpZiAocGRldi0+cGVlcl9pZF90b19vYmpfbWFwW2ldKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9UWFJYLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkJICAiJSpzaWQgJWQgLT4gJXBcbiIsCisJCQkJICBpbmRlbnQgKyA0LCAiICIsIGksCisJCQkJICBwZGV2LT5wZWVyX2lkX3RvX29ial9tYXBbaV0pOworCQl9CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1RYUlgsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJSpzcGVlciBoYXNoIHRhYmxlOlxuIiwgaW5kZW50LCAiICIpOworCWZvciAoaSA9IDA7IGkgPD0gcGRldi0+cGVlcl9oYXNoLm1hc2s7IGkrKykgeworCQlpZiAoIVRBSUxRX0VNUFRZKCZwZGV2LT5wZWVyX2hhc2guYmluc1tpXSkpIHsKKwkJCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwkJCVRBSUxRX0ZPUkVBQ0gocGVlciwgJnBkZXYtPnBlZXJfaGFzaC5iaW5zW2ldLAorCQkJCSAgICAgIGhhc2hfbGlzdF9lbGVtKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfVFhSWCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkJCSAgIiUqc2hhc2ggaWR4ICVkIC0+ICVwICglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCisJCQkJCWluZGVudCArIDQsICIgIiwgaSwgcGVlciwKKwkJCQkJcGVlci0+bWFjX2FkZHIucmF3WzBdLAorCQkJCQlwZWVyLT5tYWNfYWRkci5yYXdbMV0sCisJCQkJCXBlZXItPm1hY19hZGRyLnJhd1syXSwKKwkJCQkJcGVlci0+bWFjX2FkZHIucmF3WzNdLAorCQkJCQlwZWVyLT5tYWNfYWRkci5yYXdbNF0sCisJCQkJCXBlZXItPm1hY19hZGRyLnJhd1s1XSk7CisJCQl9CisJCX0KKwl9Cit9CisjZW5kaWYgLyogaWYgVFhSWF9ERUJVR19MRVZFTCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9kcC90eHJ4L29sX3R4cnhfcGVlcl9maW5kLmggYi9jb3JlL2RwL3R4cngvb2xfdHhyeF9wZWVyX2ZpbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTg4NmNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L29sX3R4cnhfcGVlcl9maW5kLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIG9sX3R4cnhfcGVlcl9maW5kLmgKKyAqIEBicmllZiBEZWZpbmUgdGhlIEFQSSBmb3IgdGhlIHJ4IHBlZXIgbG9va3VwIGRhdGFwYXRoIG1vZHVsZS4KKyAqLworI2lmbmRlZiBfT0xfVFhSWF9QRUVSX0ZJTkRfX0hfCisjZGVmaW5lIF9PTF9UWFJYX1BFRVJfRklORF9fSF8KKworI2luY2x1ZGUgPGh0dC5oPiAgICAgICAgICAgICAgICAvKiBIVFRfSU5WQUxJRF9QRUVSICovCisjaW5jbHVkZSA8b2xfdHhyeF90eXBlcy5oPiAgICAgIC8qIG9sX3R4cnhfcGRldl90LCBldGMuICovCisjaW5jbHVkZSA8b2xfdHhyeF9pbnRlcm5hbC5oPiAgIC8qIFRYUlhfQVNTRVJUICovCisKK2ludCBvbF90eHJ4X3BlZXJfZmluZF9hdHRhY2goc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KTsKKwordm9pZCBvbF90eHJ4X3BlZXJfZmluZF9kZXRhY2goc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KTsKKworc3RhdGljIGlubGluZQoraW50CitvbF90eHJ4X3BlZXJfZmluZF9tYWNfYWRkcl9jbXAodW5pb24gb2xfdHhyeF9hbGlnbl9tYWNfYWRkcl90ICptYWNfYWRkcjEsCisJCQkgICAgICAgdW5pb24gb2xfdHhyeF9hbGlnbl9tYWNfYWRkcl90ICptYWNfYWRkcjIpCit7CisJcmV0dXJuICEoKG1hY19hZGRyMS0+YWxpZ240LmJ5dGVzX2FiY2QgPT0gbWFjX2FkZHIyLT5hbGlnbjQuYnl0ZXNfYWJjZCkKKwkJIC8qCisJCSAgKiBJbnRlbnRpb25hbGx5IHVzZSAmIHJhdGhlciB0aGFuICYmLgorCQkgICogYmVjYXVzZSB0aGUgb3BlcmFuZHMgYXJlIGJpbmFyeSByYXRoZXIgdGhhbiBnZW5lcmljIGJvb2wsCisJCSAgKiB0aGUgZnVuY3Rpb25hbGl0eSBpcyBlcXVpdmFsZW50LgorCQkgICogVXNpbmcgJiYgaGFzIHRoZSBhZHZhbnRhZ2Ugb2Ygc2hvcnQtY2lyY3VpdGVkIGV2YWx1YXRpb24sCisJCSAgKiBidXQgdXNpbmcgJiBoYXMgdGhlIGFkdmFudGFnZSBvZiBubyBjb25kaXRpb25hbCBicmFuY2hpbmcsCisJCSAgKiB3aGljaCBpcyBhIG1vcmUgc2lnbmlmaWNhbnQgYmVuZWZpdC4KKwkJICAqLworCQkgJiAobWFjX2FkZHIxLT5hbGlnbjQuYnl0ZXNfZWYgPT0gbWFjX2FkZHIyLT5hbGlnbjQuYnl0ZXNfZWYpKTsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IG9sX3R4cnhfcGVlcl90ICpvbF90eHJ4X3BlZXJfZmluZF9ieV9pZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkJCSAgICAgICB1aW50MTZfdCBwZWVyX2lkKQoreworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwlwZWVyID0gKHBlZXJfaWQgPiBvbF9jZmdfbWF4X3BlZXJfaWQocGRldi0+Y3RybF9wZGV2KSkgPyBOVUxMIDoKKwkgICAgICAgcGRldi0+cGVlcl9pZF90b19vYmpfbWFwW3BlZXJfaWRdOworCS8qCisJICogQ3VycmVudGx5LCBwZWVyIElEcyBhcmUgYXNzaWduZWQgdG8gdmRldnMgYXMgd2VsbCBhcyBwZWVycy4KKwkgKiBJZiB0aGUgcGVlciBJRCBpcyBmb3IgYSB2ZGV2LCB0aGUgcGVlcl9pZF90b19vYmpfbWFwIGVudHJ5CisJICogd2lsbCBob2xkIE5VTEwgcmF0aGVyIHRoYW4gYSB2YWxpZCBwZWVyIHBvaW50ZXIuCisJICovCisJLyogVFhSWF9BU1NFUlQyKHBlZXIgIT0gTlVMTCk7ICovCisJLyoKKwkgKiBPbmx5IHJldHVybiB0aGUgcGVlciBvYmplY3QgaWYgaXQgaXMgdmFsaWQsCisJICogaS5lLiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBkZXRhY2hlZC4KKwkgKiBJZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRldGFjaGVkLCB0aGVuIHJldHVybmluZyB0aGUKKwkgKiBwZWVyIG9iamVjdCBjb3VsZCByZXN1bHQgaW4gdW5wYXVzaW5nIHRoZSBwZWVyJ3MgdHggcXVldWVzCisJICogaW4gSEwgc3lzdGVtcywgd2hpY2ggaXMgYW4gaW52YWxpZCBvcGVyYXRpb24gZm9sbG93aW5nIHBlZXJfZGV0YWNoLgorCSAqLworCWlmIChwZWVyICYmIHBlZXItPnZhbGlkKQorCQlyZXR1cm4gcGVlcjsKKworCXJldHVybiBOVUxMOworfQorCit2b2lkCitvbF90eHJ4X3BlZXJfZmluZF9oYXNoX2FkZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIpOworCitzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKm9sX3R4cnhfcGVlcl9maW5kX2hhc2hfZmluZChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkJCQkgICB1aW50OF90ICpwZWVyX21hY19hZGRyLAorCQkJCQkJICAgaW50IG1hY19hZGRyX2lzX2FsaWduZWQsCisJCQkJCQkgICB1aW50OF90IGNoZWNrX3ZhbGlkKTsKKworc3RydWN0CitvbF90eHJ4X3BlZXJfdCAqb2xfdHhyeF9wZWVyX3ZkZXZfZmluZF9oYXNoKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldiwKKwkJCQkJICAgIHN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldiwKKwkJCQkJICAgIHVpbnQ4X3QgKnBlZXJfbWFjX2FkZHIsCisJCQkJCSAgICBpbnQgbWFjX2FkZHJfaXNfYWxpZ25lZCwKKwkJCQkJICAgIHVpbnQ4X3QgY2hlY2tfdmFsaWQpOworCit2b2lkCitvbF90eHJ4X3BlZXJfZmluZF9oYXNoX3JlbW92ZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsCisJCQkgICAgICBzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXIpOworCit2b2lkIG9sX3R4cnhfcGVlcl9maW5kX2hhc2hfZXJhc2Uoc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2KTsKKworc3RydWN0IG9sX3R4cnhfcGVlcl90ICpvbF90eHJ4X2Fzc29jX3BlZXJfZmluZChzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYpOworCisjaWYgZGVmaW5lZChUWFJYX0RFQlVHX0xFVkVMKSAmJiBUWFJYX0RFQlVHX0xFVkVMID4gNQordm9pZCBvbF90eHJ4X3BlZXJfZmluZF9kaXNwbGF5KG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwgaW50IGluZGVudCk7CisjZWxzZQorI2RlZmluZSBvbF90eHJ4X3BlZXJfZmluZF9kaXNwbGF5KHBkZXYsIGluZGVudCkKKyNlbmRpZiAvKiBUWFJYX0RFQlVHX0xFVkVMICovCisKKyNlbmRpZiAvKiBfT0xfVFhSWF9QRUVSX0ZJTkRfX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvb2xfdHhyeF90eXBlcy5oIGIvY29yZS9kcC90eHJ4L29sX3R4cnhfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGE0YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L29sX3R4cnhfdHlwZXMuaApAQCAtMCwwICsxLDEwMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGZpbGUgb2xfdHhyeF90eXBlcy5oCisgKiBAYnJpZWYgRGVmaW5lIHRoZSBtYWpvciBkYXRhIHR5cGVzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgaG9zdCBkYXRhcGF0aCBTVy4KKyAqLworI2lmbmRlZiBfT0xfVFhSWF9UWVBFU19fSF8KKyNkZWZpbmUgX09MX1RYUlhfVFlQRVNfX0hfCisKKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCAqLworI2luY2x1ZGUgPGNkc19xdWV1ZS5oPiAgICAgICAgICAvKiBUQUlMUSAqLworI2luY2x1ZGUgPGFfdHlwZXMuaD4gICAgICAgICAgICAvKiBBX1VJTlQ4ICovCisjaW5jbHVkZSA8aHR0Lmg+ICAgICAgICAgICAgICAgIC8qIGh0dF9zZWNfdHlwZSwgaHR0X3BrdF90eXBlLCBldGMuICovCisjaW5jbHVkZSA8Y2RmX2F0b21pYy5oPiAgICAgICAgIC8qIGNkZl9hdG9taWNfdCAqLworI2luY2x1ZGUgPHdkaV9ldmVudF9hcGkuaD4gICAgICAvKiB3ZGlfZXZlbnRfc3Vic2NyaWJlICovCisjaW5jbHVkZSA8Y2RmX3NvZnRpcnFfdGltZXIuaD4gIC8qIGNkZl9zb2Z0aXJxX3RpbWVyX3QgKi8KKyNpbmNsdWRlIDxjZGZfbG9jay5oPiAgICAgICAgICAgLyogY2RmX3NwaW5sb2NrICovCisjaW5jbHVkZSA8cGt0bG9nLmg+ICAgICAgICAgICAgIC8qIG9sX3BrdGxvZ19kZXZfaGFuZGxlICovCisjaW5jbHVkZSA8b2xfdHhyeF9zdGF0cy5oPgorI2luY2x1ZGUgPHR4cnguaD4KKyNpbmNsdWRlICJvbF90eHJ4X2h0dF9hcGkuaCIKKyNpbmNsdWRlICJvbF9odHRfdHhfYXBpLmgiCisjaW5jbHVkZSAib2xfaHR0X3J4X2FwaS5oIgorI2luY2x1ZGUgPG9sX2N0cmxfdHhyeF9hcGkuaD4KKyNpbmNsdWRlIDxvbF90eHJ4X2N0cmxfYXBpLmg+CisKKworLyoKKyAqIFRoZSB0YXJnZXQgbWF5IGFsbG9jYXRlIG11bHRpcGxlIElEcyBmb3IgYSBwZWVyLgorICogSW4gcGFydGljdWxhciwgdGhlIHRhcmdldCBtYXkgYWxsb2NhdGUgb25lIElEIHRvIHJlcHJlc2VudCB0aGUKKyAqIG11bHRpY2FzdCBrZXkgdGhlIHBlZXIgdXNlcywgYW5kIGFub3RoZXIgSUQgdG8gcmVwcmVzZW50IHRoZQorICogdW5pY2FzdCBrZXkgdGhlIHBlZXIgdXNlcy4KKyAqLworI2RlZmluZSBNQVhfTlVNX1BFRVJfSURfUEVSX1BFRVIgOAorCisjZGVmaW5lIE9MX1RYUlhfTUFDX0FERFJfTEVOIDYKKworLyogT0xfVFhSWF9OVU1fRVhUX1RJRFMgLQorICogMTYgInJlYWwiIFRJRHMgKyAzIHBzZXVkby1USURzIGZvciBtZ210LCBtY2FzdC9iY2FzdCAmIG5vbi1Rb1MgZGF0YQorICovCisjZGVmaW5lIE9MX1RYUlhfTlVNX0VYVF9USURTIDE5CisKKyNkZWZpbmUgT0xfVFhfTlVNX1FPU19USURTIDE2ICAgLyogMTYgcmVndWxhciBUSURzICovCisjZGVmaW5lIE9MX1RYX05PTl9RT1NfVElEIDE2CisjZGVmaW5lIE9MX1RYX01HTVRfVElEICAgIDE3CisjZGVmaW5lIE9MX1RYX05VTV9USURTICAgIDE4CisjZGVmaW5lIE9MX1JYX01DQVNUX1RJRCAgIDE4ICAvKiBNY2FzdCBUSUQgb25seSBiZXR3ZWVuIGYvdyAmIGhvc3QgKi8KKworI2RlZmluZSBPTF9UWF9WREVWX01DQVNUX0JDQVNUICAgIDAgLy8gSFRUX1RYX0VYVF9USURfTUNBU1RfQkNBU1QKKyNkZWZpbmUgT0xfVFhfVkRFVl9ERUZBVUxUX01HTVQgICAxIC8vIEhUVF9UWF9FWFRfVElEX0RFRkFMVF9NR01UCisjZGVmaW5lIE9MX1RYX1ZERVZfTlVNX1FVRVVFUyAgICAgMgorCisjZGVmaW5lIE9MX1RYUlhfTUdNVF9UWVBFX0JBU0UgaHR0X3BrdF9udW1fdHlwZXMKKyNkZWZpbmUgT0xfVFhSWF9NR01UX05VTV9UWVBFUyA4CisKKyNkZWZpbmUgT0xfVFhfTVVURVhfVFlQRSBjZGZfc3BpbmxvY2tfdAorI2RlZmluZSBPTF9SWF9NVVRFWF9UWVBFIGNkZl9zcGlubG9ja190CisKKy8qIFRYUlggSGlzdG9ncmFtIGRlZmluZXMgKi8KKyNkZWZpbmUgVFhSWF9EQVRBX0hJU1RST0dSQU1fR1JBTlVMQVJJVFkgICAgICAxMDAwCisjZGVmaW5lIFRYUlhfREFUQV9ISVNUUk9HUkFNX05VTV9JTlRFUlZBTFMgICAgMTAwCisKK3N0cnVjdCBvbF90eHJ4X3BkZXZfdDsKK3N0cnVjdCBvbF90eHJ4X3ZkZXZfdDsKK3N0cnVjdCBvbF90eHJ4X3BlZXJfdDsKKworc3RydWN0IG9sX3BkZXZfdDsKK3R5cGVkZWYgc3RydWN0IG9sX3BkZXZfdCAqb2xfcGRldl9oYW5kbGU7CisKK3N0cnVjdCBvbF92ZGV2X3Q7Cit0eXBlZGVmIHN0cnVjdCBvbF92ZGV2X3QgKm9sX3ZkZXZfaGFuZGxlOworCitzdHJ1Y3Qgb2xfcGVlcl90OwordHlwZWRlZiBzdHJ1Y3Qgb2xfcGVlcl90ICpvbF9wZWVyX2hhbmRsZTsKKworLyogcnggZmlsdGVyIHJlbGF0ZWQgKi8KKyNkZWZpbmUgTUFYX1BSSVZBQ1lfRklMVEVSUyAgICAgICAgICAgNCAvKiBtYXggcHJpdmFjeSBmaWx0ZXJzICovCisKK2VudW0gcHJpdmFjeV9maWx0ZXIgeworCVBSSVZBQ1lfRklMVEVSX0FMV0FZUywKKwlQUklWQUNZX0ZJTFRFUl9LRVlfVU5BVkFJTEFCTEUsCit9OworCitlbnVtIHByaXZhY3lfZmlsdGVyX3BhY2tldF90eXBlIHsKKwlQUklWQUNZX0ZJTFRFUl9QQUNLRVRfVU5JQ0FTVCwKKwlQUklWQUNZX0ZJTFRFUl9QQUNLRVRfTVVMVElDQVNULAorCVBSSVZBQ1lfRklMVEVSX1BBQ0tFVF9CT1RICit9OworCitzdHJ1Y3QgcHJpdmFjeV9leGVtcHRpb24geworCS8qIGV0aGVydHlwZSAtCisJICogdHlwZSBvZiBldGhlcm5ldCBmcmFtZXMgdGhpcyBmaWx0ZXIgYXBwbGllcyB0bywgaW4gaG9zdCBieXRlIG9yZGVyCisJICovCisJdWludDE2X3QgZXRoZXJfdHlwZTsKKwllbnVtIHByaXZhY3lfZmlsdGVyIGZpbHRlcl90eXBlOworCWVudW0gcHJpdmFjeV9maWx0ZXJfcGFja2V0X3R5cGUgcGFja2V0X3R5cGU7Cit9OworCitlbnVtIG9sX3R4X2ZybV90eXBlIHsKKwlvbF90eF9mcm1fc3RkID0gMCwgLyogcmVndWxhciBmcmFtZSAtIG5vIGFkZGVkIGhlYWRlciBmcmFnbWVudHMgKi8KKwlvbF90eF9mcm1fdHNvLCAgICAgLyogVFNPIHNlZ21lbnQsIHdpdGggYSBtb2RpZmllZCBJUCBoZWFkZXIgYWRkZWQgKi8KKwlvbF90eF9mcm1fYXVkaW8sICAgLyogYXVkaW8gZnJhbWVzLCB3aXRoIGEgY3VzdG9tIExMQy9TTkFQIGhkciBhZGRlZCAqLworCW9sX3R4X2ZybV9ub19mcmVlLCAvKiBmcmFtZSByZXF1aXJlcyBzcGVjaWFsIHR4IGNvbXBsZXRpb24gY2FsbGJhY2sgKi8KK307CisKK3N0cnVjdCBvbF90eF9kZXNjX3QgeworCWNkZl9uYnVmX3QgbmV0YnVmOworCXZvaWQgKmh0dF90eF9kZXNjOworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorCXVpbnQxNl90IGlkOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9GQVNUUEFUSCAqLworCXVpbnQzMl90IGh0dF90eF9kZXNjX3BhZGRyOworI2lmIGRlZmluZWQoSEVMSVVNUExVU19QQUREUjY0KQorCXZvaWQgKmh0dF9mcmFnX2Rlc2M7IC8qIHN0cnVjdCBtc2R1X2V4dF9kZXNjX3QgKiAqLworCXVpbnQzMl90IGh0dF9mcmFnX2Rlc2NfcGFkZHI7CisjZW5kaWYgLyogZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpICovCisJdWludDMyX3QgaW5kZXg7CisJY2RmX2F0b21pY190IHJlZl9jbnQ7CisJZW51bSBodHRfdHhfc3RhdHVzIHN0YXR1czsKKworI2lmZGVmIFFDQV9DT01QVVRFX1RYX0RFTEFZCisJdWludDMyX3QgZW50cnlfdGltZXN0YW1wX3RpY2tzOworI2VuZGlmCisJLyoKKwkgKiBBbGxvdyB0eCBkZXNjcmlwdG9ycyB0byBiZSBzdG9yZWQgaW4gKGRvdWJseS1saW5rZWQpIGxpc3RzLgorCSAqIFRoaXMgaXMgbWFpbmx5IHVzZWQgZm9yIEhMIHR4IHF1ZXVpbmcgYW5kIHNjaGVkdWxpbmcsIGJ1dCBpcworCSAqIGFsc28gdXNlZCBieSBMTCtITCBmb3IgYmF0Y2ggcHJvY2Vzc2luZyBvZiB0eCBmcmFtZXMuCisJICovCisJVEFJTFFfRU5UUlkob2xfdHhfZGVzY190KSB0eF9kZXNjX2xpc3RfZWxlbTsKKworCS8qCisJICogUmVtZW1iZXIgd2hldGhlciB0aGUgdHggZnJhbWUgaXMgYSByZWd1bGFyIHBhY2tldCwgb3Igd2hldGhlcgorCSAqIHRoZSBkcml2ZXIgYWRkZWQgZXh0cmEgaGVhZGVyIGZyYWdtZW50cyAoZS5nLiBhIG1vZGlmaWVkIElQIGhlYWRlcgorCSAqIGZvciBUU08gZnJhZ21lbnRzLCBvciBhbiBhZGRlZCBMTEMvU05BUCBoZWFkZXIgZm9yIGF1ZGlvIGludGVyd29ya2luZworCSAqIGRhdGEpIHRoYXQgbmVlZCB0byBiZSBoYW5kbGVkIGluIGEgc3BlY2lhbCBtYW5uZXIuCisJICogVGhpcyBmaWVsZCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgb2xfdHhfZnJtX3R5cGUgZW51bS4KKwkgKi8KKwl1aW50OF90IHBrdF90eXBlOworI2lmZGVmIFFDQV9TVVBQT1JUX1NXX1RYUlhfRU5DQVAKKwkvKiB1c2VkIGJ5IHR4IGVuY2FwLCB0byByZXN0b3JlIHRoZSBvcyBidWYgc3RhcnQgb2Zmc2V0CisJICAgYWZ0ZXIgdHggY29tcGxldGUgKi8KKwl1aW50OF90IG9yaWdfbDJfaGRyX2J5dGVzOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfUEVSX1ZERVZfVFhfREVTQ19QT09MKQorCXN0cnVjdCBvbF90eHJ4X3ZkZXZfdCAqdmRldjsKKyNlbmRpZgorI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKKwlzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnBvb2w7CisjZW5kaWYKKwl2b2lkICp0c29fZGVzYzsKK307CisKK3R5cGVkZWYgVEFJTFFfSEVBRChzb21lX3N0cnVjdF9uYW1lLCBvbF90eF9kZXNjX3QpIG9sX3R4X2Rlc2NfbGlzdDsKKwordW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCB7CisJdW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCAqbmV4dDsKKwlzdHJ1Y3Qgb2xfdHhfZGVzY190IHR4X2Rlc2M7Cit9OworCit1bmlvbiBvbF90eHJ4X2FsaWduX21hY19hZGRyX3QgeworCXVpbnQ4X3QgcmF3W09MX1RYUlhfTUFDX0FERFJfTEVOXTsKKwlzdHJ1Y3QgeworCQl1aW50MTZfdCBieXRlc19hYjsKKwkJdWludDE2X3QgYnl0ZXNfY2Q7CisJCXVpbnQxNl90IGJ5dGVzX2VmOworCX0gYWxpZ24yOworCXN0cnVjdCB7CisJCXVpbnQzMl90IGJ5dGVzX2FiY2Q7CisJCXVpbnQxNl90IGJ5dGVzX2VmOworCX0gYWxpZ240OworfTsKKworc3RydWN0IG9sX3J4X3Jlb3JkZXJfdGltZW91dF9saXN0X2VsZW1fdCB7CisJVEFJTFFfRU5UUlkob2xfcnhfcmVvcmRlcl90aW1lb3V0X2xpc3RfZWxlbV90KQorCXJlb3JkZXJfdGltZW91dF9saXN0X2VsZW07CisJdWludDMyX3QgdGltZXN0YW1wX21zOworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwl1aW50OF90IHRpZDsKKwl1aW50OF90IGFjdGl2ZTsKK307CisKKyNkZWZpbmUgVFhSWF9USURfVE9fV01NX0FDKF90aWQpICggXAorCQkoKChfdGlkKSA+PiAxKSA9PSAzKSA/IFRYUlhfV01NX0FDX1ZPIDoJXAorCQkoKChfdGlkKSA+PiAxKSA9PSAyKSA/IFRYUlhfV01NX0FDX1ZJIDoJXAorCQkoKChfdGlkKSBeICgoX3RpZCkgPj4gMSkpICYgMHgxKSA/IFRYUlhfV01NX0FDX0JLIDogXAorCQlUWFJYX1dNTV9BQ19CRSkKKworc3RydWN0IG9sX3R4X3Jlb3JkZXJfY2F0X3RpbWVvdXRfdCB7CisJVEFJTFFfSEVBRCgsIG9sX3J4X3Jlb3JkZXJfdGltZW91dF9saXN0X2VsZW1fdCkgdmlydHVhbF90aW1lcl9saXN0OworCWNkZl9zb2Z0aXJxX3RpbWVyX3QgdGltZXI7CisJdWludDMyX3QgZHVyYXRpb25fbXM7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2OworfTsKKworZW51bSBvbF90eF9xdWV1ZV9zdGF0dXMgeworCW9sX3R4X3F1ZXVlX2VtcHR5ID0gMCwKKwlvbF90eF9xdWV1ZV9hY3RpdmUsCisJb2xfdHhfcXVldWVfcGF1c2VkLAorfTsKKworc3RydWN0IG9sX3R4cnhfbXNkdV9pbmZvX3QgeworCXN0cnVjdCBodHRfbXNkdV9pbmZvX3QgaHR0OworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwlzdHJ1Y3QgY2RmX3Rzb19pbmZvX3QgdHNvX2luZm87Cit9OworCitlbnVtIHsKKwlvbF90eF9hZ2dyX3VudHJpZWQgPSAwLAorCW9sX3R4X2FnZ3JfZW5hYmxlZCwKKwlvbF90eF9hZ2dyX2Rpc2FibGVkLAorCW9sX3R4X2FnZ3JfcmV0cnksCisJb2xfdHhfYWdncl9pbl9wcm9ncmVzcywKK307CisKK3N0cnVjdCBvbF90eF9mcm1zX3F1ZXVlX3QgeworCS8qIGxpc3RfZWxlbSAtCisJICogQWxsb3cgaW5kaXZpZHVhbCB0eCBmcmFtZSBxdWV1ZXMgdG8gYmUgbGlua2VkIHRvZ2V0aGVyIGludG8KKwkgKiBzY2hlZHVsZXIgcXVldWVzIG9mIHR4IGZyYW1lIHF1ZXVlcworCSAqLworCVRBSUxRX0VOVFJZKG9sX3R4X2ZybXNfcXVldWVfdCkgbGlzdF9lbGVtOworCXVpbnQ4X3QgYWdncl9zdGF0ZTsKKwlzdHJ1Y3QgeworCQl1aW50OF90IHRvdGFsOworCQkvKiBwYXVzZSByZXF1ZXN0ZWQgYnkgY3RybCBTVyByYXRoZXIgdGhhbiB0eHJ4IFNXICovCisJCXVpbnQ4X3QgYnlfY3RybDsKKwl9IHBhdXNlZF9jb3VudDsKKwl1aW50OF90IGV4dF90aWQ7CisJdWludDE2X3QgZnJtczsKKwl1aW50MzJfdCBieXRlczsKKwlvbF90eF9kZXNjX2xpc3QgaGVhZDsKKwllbnVtIG9sX3R4X3F1ZXVlX3N0YXR1cyBmbGFnOworfTsKKworZW51bSB7CisJb2xfdHhfbG9nX2VudHJ5X3R5cGVfaW52YWxpZCwKKwlvbF90eF9sb2dfZW50cnlfdHlwZV9xdWV1ZV9zdGF0ZSwKKwlvbF90eF9sb2dfZW50cnlfdHlwZV9lbnF1ZXVlLAorCW9sX3R4X2xvZ19lbnRyeV90eXBlX2RlcXVldWUsCisJb2xfdHhfbG9nX2VudHJ5X3R5cGVfZHJvcCwKKwlvbF90eF9sb2dfZW50cnlfdHlwZV9xdWV1ZV9mcmVlLAorCisJb2xfdHhfbG9nX2VudHJ5X3R5cGVfd3JhcCwKK307CisKK3N0cnVjdCBvbF90eF9sb2dfcXVldWVfc3RhdGVfdmFyX3N6X3QgeworCXVpbnQzMl90IGFjdGl2ZV9iaXRtYXA7CisJdWludDE2X3QgY3JlZGl0OworCXVpbnQ4X3QgbnVtX2NhdHNfYWN0aXZlOworCXVpbnQ4X3QgZGF0YVsxXTsKK307CisKK3N0cnVjdCBvbF90eF9sb2dfcXVldWVfYWRkX3QgeworCXVpbnQ4X3QgbnVtX2ZybXM7CisJdWludDhfdCB0aWQ7CisJdWludDE2X3QgcGVlcl9pZDsKKwl1aW50MTZfdCBudW1fYnl0ZXM7Cit9OworCitzdHJ1Y3Qgb2xfbWFjX2FkZHIgeworCXVpbnQ4X3QgbWFjX2FkZHJbT0xfVFhSWF9NQUNfQUREUl9MRU5dOworfTsKKworI2lmbmRlZiBPTF9UWFJYX05VTV9MT0NBTF9QRUVSX0lEUworI2RlZmluZSBPTF9UWFJYX05VTV9MT0NBTF9QRUVSX0lEUyAzMyAgIC8qIGRlZmF1bHQgKi8KKyNlbmRpZgorCisjaWZuZGVmIG9sX3R4cnhfbG9jYWxfcGVlcl9pZF90CisjZGVmaW5lIG9sX3R4cnhfbG9jYWxfcGVlcl9pZF90IHVpbnQ4X3QgLyogZGVmYXVsdCAqLworI2VuZGlmCisKKyNpZmRlZiBRQ0FfQ09NUFVURV9UWF9ERUxBWQorLyoKKyAqIERlbGF5IGhpc3RvZ3JhbSBiaW5zOiAxNiBiaW5zIG9mIDEwIG1zIGVhY2ggdG8gY291bnQgZGVsYXlzCisgKiBmcm9tIDAtMTYwIG1zLCBwbHVzIG9uZSBvdmVyZmxvdyBiaW4gZm9yIGRlbGF5cyA+IDE2MCBtcy4KKyAqLworI2RlZmluZSBRQ0FfVFhfREVMQVlfSElTVF9JTlRFUk5BTF9CSU5TIDE3CisjZGVmaW5lIFFDQV9UWF9ERUxBWV9ISVNUX0lOVEVSTkFMX0JJTl9XSURUSF9NUyAxMAorCitzdHJ1Y3Qgb2xfdHhfZGVsYXlfZGF0YSB7CisJc3RydWN0IHsKKwkJdWludDY0X3QgdHJhbnNtaXRfc3VtX3RpY2tzOworCQl1aW50NjRfdCBxdWV1ZV9zdW1fdGlja3M7CisJCXVpbnQzMl90IHRyYW5zbWl0X251bTsKKwkJdWludDMyX3QgcXVldWVfbnVtOworCX0gYXZnczsKKwl1aW50MTZfdCBoaXN0X2JpbnNfcXVldWVbUUNBX1RYX0RFTEFZX0hJU1RfSU5URVJOQUxfQklOU107Cit9OworCisjZW5kaWYgLyogUUNBX0NPTVBVVEVfVFhfREVMQVkgKi8KKworLyogVGhlcm1hbCBNaXRpZ2F0aW9uICovCisKK2VudW0gdGhyb3R0bGVfbGV2ZWwgeworCVRIUk9UVExFX0xFVkVMXzAsCisJVEhST1RUTEVfTEVWRUxfMSwKKwlUSFJPVFRMRV9MRVZFTF8yLAorCVRIUk9UVExFX0xFVkVMXzMsCisJLyogSW52YWxpZCAqLworCVRIUk9UVExFX0xFVkVMX01BWCwKK307CisKK2VudW0gdGhyb3R0bGVfcGhhc2UgeworCVRIUk9UVExFX1BIQVNFX09GRiwKKwlUSFJPVFRMRV9QSEFTRV9PTiwKKwkvKiBJbnZhbGlkICovCisJVEhST1RUTEVfUEhBU0VfTUFYLAorfTsKKworI2RlZmluZSBUSFJPVFRMRV9UWF9USFJFU0hPTEQgKDEwMCkKKwordHlwZWRlZiB2b2lkICgqaXBhX3VjX29wX2NiX3R5cGUpKHVpbnQ4X3QgKm9wX21zZywgdm9pZCAqb3NpZl9jdHh0KTsKKworI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKKworLyoqCisgKiBlbnVtIGZsb3dfcG9vbF9zdGF0dXMgLSBmbG93IHBvb2wgc3RhdHVzCisgKiBARkxPV19QT09MX0FDVElWRV9VTlBBVVNFRCA6IHBvb2wgaXMgYWN0aXZlIChjYW4gdGFrZS9wdXQgZGVzY3JpcHRvcnMpCisgKgkJCQlhbmQgbmV0d29yayBxdWV1ZXMgYXJlIHVucGF1c2VkCisgKiBARkxPV19QT09MX0FDVElWRV9QQVVTRUQ6IHBvb2wgaXMgYWN0aXZlIChjYW4gdGFrZS9wdXQgZGVzY3JpcHRvcnMpCisgKgkJCSAgIGFuZCBuZXR3b3JrIHF1ZXVlcyBhcmUgcGF1c2VkCisgKiBARkxPV19QT09MX0lOVkFMSUQ6IHBvb2wgaXMgaW52YWxpZCAocHV0IGRlc2NyaXB0b3IpCisgKiBARkxPV19QT09MX0lOQUNUSVZFOiBwb29sIGlzIGluYWN0aXZlIChwb29sIGlzIGZyZWUpCisgKi8KK2VudW0gZmxvd19wb29sX3N0YXR1cyB7CisJRkxPV19QT09MX0FDVElWRV9VTlBBVVNFRCA9IDAsCisJRkxPV19QT09MX0FDVElWRV9QQVVTRUQgPSAxLAorCUZMT1dfUE9PTF9JTlZBTElEID0gMiwKKwlGTE9XX1BPT0xfSU5BQ1RJVkUgPSAzLAorfTsKKworLyoqCisgKiBzdHJ1Y3Qgb2xfdHhyeF9wb29sX3N0YXRzIC0gZmxvdyBwb29sIHJlbGF0ZWQgc3RhdGlzdGljcworICogQHBvb2xfbWFwX2NvdW50OiBmbG93IHBvb2wgbWFwIHJlY2VpdmVkCisgKiBAcG9vbF91bm1hcF9jb3VudDogZmxvdyBwb29sIHVubWFwIHJlY2VpdmVkCisgKiBAcGt0X2Ryb3Bfbm9fcG9vbDogcGFja2V0cyBkcm9wcGVkIGR1ZSB0byB1bmF2YWlsYWJsaXR5IG9mIHBvb2wKKyAqIEBwa3RfZHJvcF9ub19kZXNjOiBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIHVuYXZhaWxhYmxpdHkgb2YgZGVzY3JpcHRvcnMKKyAqLworc3RydWN0IG9sX3R4cnhfcG9vbF9zdGF0cyB7CisJdWludDE2X3QgcG9vbF9tYXBfY291bnQ7CisJdWludDE2X3QgcG9vbF91bm1hcF9jb3VudDsKKwl1aW50MTZfdCBwa3RfZHJvcF9ub19wb29sOworCXVpbnQxNl90IHBrdF9kcm9wX25vX2Rlc2M7Cit9OworCisvKioKKyAqIHN0cnVjdCBvbF90eF9mbG93X3Bvb2xfdCAtIGZsb3dfcG9vbCBpbmZvCisgKiBAZmxvd19wb29sX2xpc3RfZWxlbTogZmxvd19wb29sX2xpc3QgZWxlbWVudAorICogQGZsb3dfcG9vbF9sb2NrOiBmbG93X3Bvb2wgbG9jaworICogQGZsb3dfcG9vbF9pZDogZmxvd19wb29sIGlkCisgKiBAZmxvd19wb29sX3NpemU6IGZsb3dfcG9vbCBzaXplCisgKiBAYXZhaWxfZGVzYzogYXZhaWxhYmxlIGRlc2NyaXB0b3JzCisgKiBAZGVmaWNpZW50X2Rlc2M6IGRlZmljaWVudCBkZXNjcmlwdG9ycworICogQHN0YXR1czogZmxvdyBwb29sIHN0YXR1cworICogQGZsb3dfdHlwZTogZmxvdyBwb29sIHR5cGUKKyAqIEBtZW1iZXJfZmxvd19pZDogbWVtYmVyIGZsb3cgaWQKKyAqIEBzdG9wX3RoOiBzdG9wIHRocmVzaG9sZAorICogQHN0YXJ0X3RoOiBzdGFydCB0aHJlc2hvbGQKKyAqIEBmcmVlbGlzdDogdHggZGVzY3JpcHRvciBmcmVlbGlzdAorICovCitzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgeworCVRBSUxRX0VOVFJZKG9sX3R4X2Zsb3dfcG9vbF90KSBmbG93X3Bvb2xfbGlzdF9lbGVtOworCWNkZl9zcGlubG9ja190IGZsb3dfcG9vbF9sb2NrOworCXVpbnQ4X3QgZmxvd19wb29sX2lkOworCXVpbnQxNl90IGZsb3dfcG9vbF9zaXplOworCXVpbnQxNl90IGF2YWlsX2Rlc2M7CisJdWludDE2X3QgZGVmaWNpZW50X2Rlc2M7CisJZW51bSBmbG93X3Bvb2xfc3RhdHVzIHN0YXR1czsKKwllbnVtIGh0dF9mbG93X3R5cGUgZmxvd190eXBlOworCXVpbnQ4X3QgbWVtYmVyX2Zsb3dfaWQ7CisJdWludDE2X3Qgc3RvcF90aDsKKwl1aW50MTZfdCBzdGFydF90aDsKKwl1bmlvbiBvbF90eF9kZXNjX2xpc3RfZWxlbV90ICpmcmVlbGlzdDsKK307CisKKyNlbmRpZgorCisvKgorICogQXMgZGVwaWN0ZWQgaW4gdGhlIGRpYWdyYW0gYmVsb3csIHRoZSBwZGV2IGNvbnRhaW5zIGFuIGFycmF5IG9mCisgKiBOVU1fRVhUX1RJRCBvbF90eF9hY3RpdmVfcXVldWVzX2luX3RpZF90IGVsZW1lbnRzLgorICogRWFjaCBlbGVtZW50IGlkZW50aWZpZXMgYWxsIHRoZSB0eCBxdWV1ZXMgdGhhdCBhcmUgYWN0aXZlIGZvcgorICogdGhlIFRJRCwgZnJvbSB0aGUgZGlmZmVyZW50IHBlZXJzLgorICoKKyAqIEVhY2ggcGVlciBjb250YWlucyBhbiBhcnJheSBvZiBOVU1fRVhUX1RJRCBvbF90eF9mcm1zX3F1ZXVlX3QgZWxlbWVudHMuCisgKiBFYWNoIGVsZW1lbnQgaWRlbnRpZmllcyB0aGUgdHggZnJhbWVzIGZvciB0aGUgVElEIHRoYXQgbmVlZCB0byBiZSBzZW50CisgKiB0byB0aGUgcGVlci4KKyAqCisgKgorICogIHBkZXY6IG9sX3R4X2FjdGl2ZV9xdWV1ZXNfaW5fdGlkX3QgYWN0aXZlX2luX3RpZHNbTlVNX0VYVF9USURTXQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJRAorICogICAgICAgMCAgICAgICAgICAgIDEgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgMTcKKyAqICArPT09PT09PT09PT09Kz09PT09PT09PT09PSs9PT09PT09PT09PT0rPT0gICAgPT0rPT09PT09PT09PT09KworICogIHwgYWN0aXZlICh5KSB8IGFjdGl2ZSAobikgfCBhY3RpdmUgKG4pIHwgICAgICAgIHwgYWN0aXZlICh5KSB8CisgKiAgfC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tICAgIC0tKy0tLS0tLS0tLS0tLXwKKyAqICB8IHF1ZXVlcyAgICAgfCBxdWV1ZXMgICAgIHwgcXVldWVzICAgICB8ICAgICAgICB8IHF1ZXVlcyAgICAgfAorICogICs9PT09PT09PT09PT0rPT09PT09PT09PT09Kz09PT09PT09PT09PSs9PSAgICA9PSs9PT09PT09PT09PT0rCisgKiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAuLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgKiAgICB8ICB8CisgKiAgICB8ICB8ICAgICBwZWVyIFg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXIgWToKKyAqICAgIHwgIHwgICAgIG9sX3R4X2ZybXNfcXVldWVfdCAgICAgICAgICAgICAgICAgb2xfdHhfZnJtc19xdWV1ZV90CisgKiAgICB8ICB8ICAgICB0eF9xdWV1ZXNbTlVNX0VYVF9USURTXSAgICAgICAgICAgIHR4X3F1ZXVlc1tOVU1fRVhUX1RJRFNdCisgKiAgICB8ICB8IFRJRCArPT09PT09KyAgICAgICAgICAgICAgICAgICAgICAgVElEICs9PT09PT0rCisgKiAgICB8ICBgLS0tLT58IG5leHQgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPnwgbmV4dCB8LS1YCisgKiAgICB8ICAgICAwICB8IHByZXYgfCAgIC4tLS0tLS0uICAgLi0tLS0tLS4gIDAgIHwgcHJldiB8ICAgLi0tLS0tLS4KKyAqICAgIHwgICAgICAgIHwgdHhxICB8LS0+fHR4ZGVzY3wtLT58dHhkZXNjfCAgICAgfCB0eHEgIHwtLT58dHhkZXNjfAorICogICAgfCAgICAgICAgKz09PT09PSsgICBgLS0tLS0tJyAgIGAtLS0tLS0nICAgICArPT09PT09KyAgIGAtLS0tLS0nCisgKiAgICB8ICAgICAgICB8IG5leHQgfCAgICAgIHwgICAgICAgICAgfCAgICAgIDEgIHwgbmV4dCB8ICAgICAgfAorICogICAgfCAgICAgMSAgfCBwcmV2IHwgICAgICB2ICAgICAgICAgIHYgICAgICAgICB8IHByZXYgfCAgICAgIHYKKyAqICAgIHwgICAgICAgIHwgdHhxICB8ICAgLi0tLS0tLS4gICAuLS0tLS0tLiAgICAgfCB0eHEgIHwgICAuLS0tLS0tLgorICogICAgfCAgICAgICAgKz09PT09PSsgICB8bmV0YnVmfCAgIHxuZXRidWZ8ICAgICArPT09PT09KyAgIHxuZXRidWZ8CisgKiAgICB8ICAgICAgICB8IG5leHQgfCAgIGAtLS0tLS0nICAgYC0tLS0tLScgICAgIHwgbmV4dCB8ICAgYC0tLS0tLScKKyAqICAgIHwgICAgIDIgIHwgcHJldiB8ICAgICAgICAgICAgICAgICAgICAgICAgMiAgfCBwcmV2IHwKKyAqICAgIHwgICAgICAgIHwgdHhxICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0eHEgIHwKKyAqICAgIHwgICAgICAgICs9PT09PT0rICAgICAgICAgICAgICAgICAgICAgICAgICAgKz09PT09PSsKKyAqICAgIHwgICAgICAgIHwgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwKKyAqICAgIHwKKyAqICAgIHwKKyAqICAgIHwgICAgICAgIHwgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwKKyAqICAgIHwgICAgICAgICs9PT09PT0rICAgICAgICAgICAgICAgICAgICAgICAgICAgKz09PT09PSsKKyAqICAgIGAtLS0tLS0tPnwgbmV4dCB8LS1YICAgICAgICAgICAgICAgICAgICAgICAgfCBuZXh0IHwKKyAqICAgICAgICAgIDE3IHwgcHJldiB8ICAgLi0tLS0tLS4gICAgICAgICAgICAgMTcgfCBwcmV2IHwKKyAqICAgICAgICAgICAgIHwgdHhxICB8LS0+fHR4ZGVzY3wgICAgICAgICAgICAgICAgfCB0eHEgIHwKKyAqICAgICAgICAgICAgICs9PT09PT0rICAgYC0tLS0tLScgICAgICAgICAgICAgICAgKz09PT09PSsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICB2CisgKiAgICAgICAgICAgICAgICAgICAgICAgIC4tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHxuZXRidWZ8CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGAtLS0tLS0nCisgKi8KK3N0cnVjdCBvbF90eHJ4X3BkZXZfdCB7CisJLyogY3RybF9wZGV2IC0gaGFuZGxlIGZvciBxdWVyeWluZyBjb25maWcgaW5mbyAqLworCW9sX3BkZXZfaGFuZGxlIGN0cmxfcGRldjsKKworCS8qIG9zZGV2IC0gaGFuZGxlIGZvciBtZW0gYWxsb2MgLyBmcmVlLCBtYXAgLyB1bm1hcCAqLworCWNkZl9kZXZpY2VfdCBvc2RldjsKKworCWh0dF9wZGV2X2hhbmRsZSBodHRfcGRldjsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorCXN0cnVjdCBDRV9oYW5kbGUgICAgKmNlX3R4X2hkbDsgLyogSGFuZGxlIHRvIFR4IHBhY2tldCBwb3N0aW5nIENFICovCisJc3RydWN0IENFX2hhbmRsZSAgICAqY2VfaHR0X21zZ19oZGw7IC8qIEhhbmRsZSB0byBUeFJ4IGNvbXBsZXRpb24gQ0UgKi8KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfRkFTVFBBVEggKi8KKworCXN0cnVjdCB7CisJCWludCBpc19oaWdoX2xhdGVuY3k7CisJCWludCBob3N0X2FkZGJhOworCQlpbnQgbGxfcGF1c2VfdHhxX2xpbWl0OworCQlpbnQgZGVmYXVsdF90eF9jb21wX3JlcTsKKwl9IGNmZzsKKworCS8qIFdESSBzdWJzY3JpYmVyJ3MgZXZlbnQgbGlzdCAqLworCXdkaV9ldmVudF9zdWJzY3JpYmUgKip3ZGlfZXZlbnRfbGlzdDsKKworI2lmbmRlZiBSRU1PVkVfUEtUX0xPRworCS8qIFBrdGxvZyBwZGV2ICovCisJc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2OworI2VuZGlmIC8qICNpZm5kZWYgUkVNT1ZFX1BLVF9MT0cgKi8KKworCWVudW0gb2xfc2VjX3R5cGUgc2VjX3R5cGVzW2h0dF9udW1fc2VjX3R5cGVzXTsKKwkvKiBzdGFuZGFyZCBmcmFtZSB0eXBlICovCisJZW51bSB3bGFuX2ZybV9mbXQgZnJhbWVfZm9ybWF0OworCWVudW0gaHR0X3BrdF90eXBlIGh0dF9wa3RfdHlwZTsKKworI2lmZGVmIFFDQV9TVVBQT1JUX1NXX1RYUlhfRU5DQVAKKwkvKiB0eHJ4IGVuY2FwL2RlY2FwICAgKi8KKwl1aW50OF90IHN3X3R4X2VuY2FwOworCXVpbnQ4X3Qgc3dfcnhfZGVjYXA7CisJdWludDhfdCB0YXJnZXRfdHhfdHJhbl9jYXBzOworCXVpbnQ4X3QgdGFyZ2V0X3J4X3RyYW5fY2FwczsKKwkvKiBsbGMgcHJvY2VzcyAqLworCXVpbnQ4X3Qgc3dfdHhfbGxjX3Byb2NfZW5hYmxlOworCXVpbnQ4X3Qgc3dfcnhfbGxjX3Byb2NfZW5hYmxlOworCS8qIEEtTVNEVSAqLworCXVpbnQ4X3Qgc3dfc3ViZnJtX2hkcl9yZWNvdmVyeV9lbmFibGU7CisJLyogUHJvdGVjdGVkIEZyYW1lIGJpdCBoYW5kbGluZyAqLworCXVpbnQ4X3Qgc3dfcGZfcHJvY19lbmFibGU7CisjZW5kaWYKKwkvKgorCSAqIHRhcmdldCB0eCBjcmVkaXQgLQorCSAqIG5vdCBuZWVkZWQgZm9yIExMLCBidXQgdXNlZCBmb3IgSEwgZG93bmxvYWQgc2NoZWR1bGVyIHRvIGtlZXAKKwkgKiB0cmFjayBvZiByb3VnaGx5IGhvdyBtdWNoIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiB0aGUgdGFyZ2V0IGZvcgorCSAqIHR4IGZyYW1lcworCSAqLworCWNkZl9hdG9taWNfdCB0YXJnZXRfdHhfY3JlZGl0OworCWNkZl9hdG9taWNfdCBvcmlnX3RhcmdldF90eF9jcmVkaXQ7CisKKwkvKiBQZWVyIG1hYyBhZGRyZXNzIHRvIHN0YWlkIG1hcHBpbmcgKi8KKwlzdHJ1Y3Qgb2xfbWFjX2FkZHIgbWFjX3RvX3N0YWlkW1dMQU5fTUFYX1NUQV9DT1VOVCArIDNdOworCisJLyogb2xfdHhyeF92ZGV2IGxpc3QgKi8KKwlUQUlMUV9IRUFEKCwgb2xfdHhyeF92ZGV2X3QpIHZkZXZfbGlzdDsKKworCS8qIHBlZXIgSUQgdG8gcGVlciBvYmplY3QgbWFwIChhcnJheSBvZiBwb2ludGVycyB0byBwZWVyIG9iamVjdHMpICovCisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICoqcGVlcl9pZF90b19vYmpfbWFwOworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgbWFzazsKKwkJdW5zaWduZWQgaWR4X2JpdHM7CisJCVRBSUxRX0hFQUQoLCBvbF90eHJ4X3BlZXJfdCkgKiBiaW5zOworCX0gcGVlcl9oYXNoOworCisJLyogcnggc3BlY2lmaWMgcHJvY2Vzc2luZyAqLworCXN0cnVjdCB7CisJCXN0cnVjdCB7CisJCQlUQUlMUV9IRUFEKCwgb2xfcnhfcmVvcmRlcl90KSB3YWl0bGlzdDsKKwkJCXVpbnQzMl90IHRpbWVvdXRfbXM7CisJCX0gZGVmcmFnOworCQlzdHJ1Y3QgeworCQkJaW50IGRlZnJhZ190aW1lb3V0X2NoZWNrOworCQkJaW50IGR1cF9jaGVjazsKKwkJfSBmbGFnczsKKworCQlzdHJ1Y3QgeworCQkJc3RydWN0IG9sX3R4X3Jlb3JkZXJfY2F0X3RpbWVvdXRfdAorCQkJCWFjY2Vzc19jYXRzW1RYUlhfTlVNX1dNTV9BQ107CisJCX0gcmVvcmRlcl90aW1lb3V0OworCQljZGZfc3BpbmxvY2tfdCBtdXRleDsKKwl9IHJ4OworCisJLyogcnggcHJvYyBmdW5jdGlvbiAqLworCXZvaWQgKCpyeF9vcHRfcHJvYykoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkJICAgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJCSAgICB1bnNpZ25lZCB0aWQsIGNkZl9uYnVmX3QgbXNkdV9saXN0KTsKKworCS8qIHR4IGRhdGEgZGVsaXZlcnkgbm90aWZpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJc3RydWN0IHsKKwkJb2xfdHhyeF9kYXRhX3R4X2NiIGZ1bmM7CisJCXZvaWQgKmN0eHQ7CisJfSB0eF9kYXRhX2NhbGxiYWNrOworCisJLyogdHggbWFuYWdlbWVudCBkZWxpdmVyeSBub3RpZmljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb25zICovCisJc3RydWN0IHsKKwkJc3RydWN0IHsKKwkJCW9sX3R4cnhfbWdtdF90eF9jYiBkb3dubG9hZF9jYjsKKwkJCW9sX3R4cnhfbWdtdF90eF9jYiBvdGFfYWNrX2NiOworCQkJdm9pZCAqY3R4dDsKKwkJfSBjYWxsYmFja3NbT0xfVFhSWF9NR01UX05VTV9UWVBFU107CisJfSB0eF9tZ210OworCisJc3RydWN0IHsKKwkJdWludDE2X3QgcG9vbF9zaXplOworCQl1aW50MTZfdCBudW1fZnJlZTsKKwkJdW5pb24gb2xfdHhfZGVzY19saXN0X2VsZW1fdCAqYXJyYXk7CisJCXVuaW9uIG9sX3R4X2Rlc2NfbGlzdF9lbGVtX3QgKmZyZWVsaXN0OworI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKKwkJdWludDhfdCBudW1faW52YWxpZF9iaW47CisJCWNkZl9zcGlubG9ja190IGZsb3dfcG9vbF9saXN0X2xvY2s7CisJCVRBSUxRX0hFQUQoZmxvd19wb29sX2xpc3RfdCwgb2xfdHhfZmxvd19wb29sX3QpIGZsb3dfcG9vbF9saXN0OworI2VuZGlmCisJfSB0eF9kZXNjOworCisjaWYgZGVmaW5lZChRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyKQorCXN0cnVjdCBvbF90eHJ4X3Bvb2xfc3RhdHMgcG9vbF9zdGF0czsKKwl1aW50MzJfdCBudW1fbXNkdV9kZXNjOworI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0dMT0JBTF9NR01UX1BPT0wKKwlzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKm1nbXRfcG9vbDsKKyNlbmRpZgorI2VuZGlmCisKKwlzdHJ1Y3QgeworCQlpbnQgKCpjbXApKHVuaW9uIGh0dF9yeF9wbl90ICpuZXcsCisJCQkgICB1bmlvbiBodHRfcnhfcG5fdCAqb2xkLAorCQkJICAgaW50IGlzX3VuaWNhc3QsIGludCBvcG1vZGUpOworCQlpbnQgbGVuOworCX0gcnhfcG5baHR0X251bV9zZWNfdHlwZXNdOworCisJLyogdHggbXV0ZXggKi8KKwlPTF9UWF9NVVRFWF9UWVBFIHR4X211dGV4OworCisJLyoKKwkgKiBwZWVyIHJlZiBtdXRleDoKKwkgKiAxLiBQcm90ZWN0IHBlZXIgb2JqZWN0IGxvb2t1cHMgdW50aWwgdGhlIHJldHVybmVkIHBlZXIgb2JqZWN0J3MKKwkgKiAgICByZWZlcmVuY2UgY291bnQgaXMgaW5jcmVtZW50ZWQuCisJICogMi4gUHJvdmlkZSBtdXRleCB3aGVuIGFjY2Vzc2luZyBwZWVyIG9iamVjdCBsb29rdXAgc3RydWN0dXJlcy4KKwkgKi8KKwlPTF9SWF9NVVRFWF9UWVBFIHBlZXJfcmVmX211dGV4OworCisJLyoKKwkgKiBsYXN0X3JlYWxfcGVlcl9tdXRleDoKKwkgKiBQcm90ZWN0IGxvb2t1cHMgb2YgYW55IHZkZXYncyBsYXN0X3JlYWxfcGVlciBwb2ludGVyIHVudGlsIHRoZQorCSAqIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIHBvaW50ZWQtdG8gcGVlciBvYmplY3QgaXMgaW5jcmVtZW50ZWQuCisJICogVGhpcyBtdXRleCBjb3VsZCBiZSBpbiB0aGUgdmRldiBzdHJ1Y3QsIGJ1dCBpdCdzIHNsaWdodGx5IHNpbXBsZXIKKwkgKiB0byBoYXZlIGEgc2luZ2xlIGxvY2sgaW4gdGhlIHBkZXYgc3RydWN0LiAgU2luY2UgdGhlIGxvY2sgaXMgb25seQorCSAqIGhlbGQgZm9yIGFuIGV4dHJlbWVseSBzaG9ydCB0aW1lLCBhbmQgc2luY2UgaXQncyB2ZXJ5IHVubGlrZWx5IGZvcgorCSAqIHR3byB2ZGV2J3MgdG8gY29uY3VycmVudGx5IGFjY2VzcyB0aGUgbG9jaywgdGhlcmUncyBubyByZWFsCisJICogYmVuZWZpdCB0byBoYXZpbmcgYSBwZXItdmRldiBsb2NrLgorCSAqLworCU9MX1JYX01VVEVYX1RZUEUgbGFzdF9yZWFsX3BlZXJfbXV0ZXg7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3QgeworCQkJCQl1aW50NjRfdCBwcGR1czsKKwkJCQkJdWludDY0X3QgbXBkdXM7CisJCQkJfSBub3JtYWw7CisJCQkJc3RydWN0IHsKKwkJCQkJLyoKKwkJCQkJICogbXBkdV9iYWQgaXMgZ2VuZXJhbCAtCisJCQkJCSAqIHJlcGxhY2UgaXQgd2l0aCB0aGUgc3BlY2lmaWMgY291bnRlcnMKKwkJCQkJICogYmVsb3cKKwkJCQkJICovCisJCQkJCXVpbnQ2NF90IG1wZHVfYmFkOworCQkJCQkvKiB1aW50NjRfdCBtcGR1X2ZjczsgKi8KKwkJCQkJLyogdWludDY0X3QgbXBkdV9kdXBsaWNhdGU7ICovCisJCQkJCS8qIHVpbnQ2NF90IG1wZHVfcG5fcmVwbGF5OyAqLworCQkJCQkvKiB1aW50NjRfdCBtcGR1X2JhZF9zZW5kZXI7ICovCisJCQkJCS8qIF4gY29tbWVudDogcGVlciBub3QgZm91bmQgKi8KKwkJCQkJLyogdWludDY0X3QgbXBkdV9mbHVzaGVkOyAqLworCQkJCQkvKiB1aW50NjRfdCBtc2R1X2RlZnJhZ19taWNfZXJyOyAqLworCQkJCQl1aW50NjRfdCBtc2R1X21jX2R1cF9kcm9wOworCQkJCX0gZXJyOworCQkJfSByeDsKKwkJfSBwcml2OworCQlzdHJ1Y3Qgb2xfdHhyeF9zdGF0cyBwdWI7CisJfSBzdGF0czsKKworI2lmIGRlZmluZWQoRU5BQkxFX1JYX1JFT1JERVJfVFJBQ0UpCisJc3RydWN0IHsKKwkJdWludDMyX3QgbWFzazsKKwkJdWludDMyX3QgaWR4OworCQl1aW50NjRfdCBjbnQ7CisjZGVmaW5lIFRYUlhfUlhfUkVPUkRFUl9UUkFDRV9TSVpFX0xPRzIgOCAgICAgICAvKiAyNTYgZW50cmllcyAqLworCQlzdHJ1Y3QgeworCQkJdWludDE2X3QgcmVvcmRlcl9pZHg7CisJCQl1aW50MTZfdCBzZXFfbnVtOworCQkJdWludDhfdCBudW1fbXBkdXM7CisJCQl1aW50OF90IHRpZDsKKwkJfSAqZGF0YTsKKwl9IHJ4X3Jlb3JkZXJfdHJhY2U7CisjZW5kaWYgLyogRU5BQkxFX1JYX1JFT1JERVJfVFJBQ0UgKi8KKworI2lmIGRlZmluZWQoRU5BQkxFX1JYX1BOX1RSQUNFKQorCXN0cnVjdCB7CisJCXVpbnQzMl90IG1hc2s7CisJCXVpbnQzMl90IGlkeDsKKwkJdWludDY0X3QgY250OworI2RlZmluZSBUWFJYX1JYX1BOX1RSQUNFX1NJWkVfTE9HMiA1ICAgIC8qIDMyIGVudHJpZXMgKi8KKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwkJCXVpbnQzMl90IHBuMzI7CisJCQl1aW50MTZfdCBzZXFfbnVtOworCQkJdWludDhfdCB1bmljYXN0OworCQkJdWludDhfdCB0aWQ7CisJCX0gKmRhdGE7CisJfSByeF9wbl90cmFjZTsKKyNlbmRpZiAvKiBFTkFCTEVfUlhfUE5fVFJBQ0UgKi8KKworI2lmIGRlZmluZWQoUEVSRV9JUF9IRFJfQUxJR05NRU5UX1dBUikKKwlib29sIGhvc3RfODAyMTFfZW5hYmxlOworI2VuZGlmCisKKwkvKgorCSAqIHR4X3F1ZXVlIG9ubHkgYXBwbGllcyBmb3IgSEwsIGJ1dCBpcyBkZWZpbmVkIHVuY29uZGl0aW9uYWxseSB0byBhdm9pZAorCSAqIHdyYXBwaW5nIHJlZmVyZW5jZXMgdG8gdHhfcXVldWUgaW4gImRlZmluZWQoQ09ORklHX0hMX1NVUFBPUlQpIgorCSAqIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLgorCSAqLworCXN0cnVjdCB7CisJCWNkZl9hdG9taWNfdCByc3JjX2NudDsKKwkJLyogdGhyZXNob2xkX2xvIC0gd2hlbiB0byBzdGFydCB0eCBkZXNjIG1hcmdpbiByZXBsZW5pc2htZW50ICovCisJCXVpbnQxNl90IHJzcmNfdGhyZXNob2xkX2xvOworCQkvKiB0aHJlc2hvbGRfaGkgLSB3aGVyZSB0byBzdG9wIGR1cmluZyB0eCBkZXNjIG1hcmdpbgorCQkgICByZXBsZW5pc2htZW50ICovCisJCXVpbnQxNl90IHJzcmNfdGhyZXNob2xkX2hpOworCX0gdHhfcXVldWU7CisKKyNpZmRlZiBRQ0FfRU5BQkxFX09MX1RYUlhfUEVFUl9TVEFUUworCWNkZl9zcGlubG9ja190IHBlZXJfc3RhdF9tdXRleDsKKyNlbmRpZgorCisJaW50IHJzc2lfdXBkYXRlX3NoaWZ0OworCWludCByc3NpX25ld193ZWlnaHQ7CisjaWZkZWYgUUNBX1NVUFBPUlRfVFhSWF9MT0NBTF9QRUVSX0lECisJc3RydWN0IHsKKwkJb2xfdHhyeF9sb2NhbF9wZWVyX2lkX3QgcG9vbFtPTF9UWFJYX05VTV9MT0NBTF9QRUVSX0lEUyArIDFdOworCQlvbF90eHJ4X2xvY2FsX3BlZXJfaWRfdCBmcmVlbGlzdDsKKwkJY2RmX3NwaW5sb2NrX3QgbG9jazsKKwkJb2xfdHhyeF9wZWVyX2hhbmRsZSBtYXBbT0xfVFhSWF9OVU1fTE9DQUxfUEVFUl9JRFNdOworCX0gbG9jYWxfcGVlcl9pZHM7CisjZW5kaWYKKworI2lmZGVmIFFDQV9DT01QVVRFX1RYX0RFTEFZCisjaWZkZWYgUUNBX0NPTVBVVEVfVFhfREVMQVlfUEVSX1RJRAorI2RlZmluZSBRQ0FfVFhfREVMQVlfTlVNX0NBVEVHT1JJRVMgXAorCShPTF9UWF9OVU1fVElEUyArIE9MX1RYX1ZERVZfTlVNX1FVRVVFUykKKyNlbHNlCisjZGVmaW5lIFFDQV9UWF9ERUxBWV9OVU1fQ0FURUdPUklFUyAxCisjZW5kaWYKKwlzdHJ1Y3QgeworCQljZGZfc3BpbmxvY2tfdCBtdXRleDsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBvbF90eF9kZWxheV9kYXRhIGNvcGllc1syXTsgLyogcGluZy1wb25nICovCisJCQlpbnQgaW5fcHJvZ3Jlc3NfaWR4OworCQkJdWludDMyX3QgYXZnX3N0YXJ0X3RpbWVfdGlja3M7CisJCX0gY2F0c1tRQ0FfVFhfREVMQVlfTlVNX0NBVEVHT1JJRVNdOworCQl1aW50MzJfdCB0eF9jb21wbF90aW1lc3RhbXBfdGlja3M7CisJCXVpbnQzMl90IGF2Z19wZXJpb2RfdGlja3M7CisJCXVpbnQzMl90IGhpc3RfaW50ZXJuYWxfYmluX3dpZHRoX211bHQ7CisJCXVpbnQzMl90IGhpc3RfaW50ZXJuYWxfYmluX3dpZHRoX3NoaWZ0OworCX0gdHhfZGVsYXk7CisKKwl1aW50MTZfdCBwYWNrZXRfY291bnRbUUNBX1RYX0RFTEFZX05VTV9DQVRFR09SSUVTXTsKKwl1aW50MTZfdCBwYWNrZXRfbG9zc19jb3VudFtRQ0FfVFhfREVMQVlfTlVNX0NBVEVHT1JJRVNdOworCisjZW5kaWYgLyogUUNBX0NPTVBVVEVfVFhfREVMQVkgKi8KKworCXN0cnVjdCB7CisJCWNkZl9zcGlubG9ja190IG11dGV4OworCQkvKiB0aW1lciB1c2VkIHRvIG1vbml0b3IgdGhlIHRocm90dGxlICJvbiIgcGhhc2UgYW5kCisJCSAgICJvZmYiIHBoYXNlICovCisJCWNkZl9zb2Z0aXJxX3RpbWVyX3QgcGhhc2VfdGltZXI7CisJCS8qIHRpbWVyIHVzZWQgdG8gc2VuZCB0eCBmcmFtZXMgKi8KKwkJY2RmX3NvZnRpcnFfdGltZXJfdCB0eF90aW1lcjsKKwkJLyogVGhpcyBpcyB0aGUgdGltZSBpbiBtcyBvZiB0aGUgdGhyb3R0bGluZyB3aW5kb3csIGl0IHdpbGwKKwkJICogaW5jbHVkZSBhbiAib24iIHBoYXNlIGFuZCBhbiAib2ZmIiBwaGFzZSAqLworCQl1aW50MzJfdCB0aHJvdHRsZV9wZXJpb2RfbXM7CisJCS8qIEN1cnJlbnQgdGhyb3R0bGUgbGV2ZWwgc2V0IGJ5IHRoZSBjbGllbnQgZXguIGxldmVsIDAsCisJCSAgIGxldmVsIDEsIGV0YyAqLworCQllbnVtIHRocm90dGxlX2xldmVsIGN1cnJlbnRfdGhyb3R0bGVfbGV2ZWw7CisJCS8qIEluZGV4IHRoYXQgcG9pbnRzIHRvIHRoZSBwaGFzZSB3aXRoaW4gdGhlIHRocm90dGxlIHBlcmlvZCAqLworCQllbnVtIHRocm90dGxlX3BoYXNlIGN1cnJlbnRfdGhyb3R0bGVfcGhhc2U7CisJCS8qIE1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyB0byBzZW5kIHRvIHRoZSB0YXJnZXQgYXQgb25lIHRpbWUgKi8KKwkJdWludDMyX3QgdHhfdGhyZXNob2xkOworCQkvKiBzdG9yZXMgdGltZSBpbiBtcyBvZiBvbi9vZmYgcGhhc2UgZm9yIGVhY2ggdGhyb3R0bGUgbGV2ZWwgKi8KKwkJaW50IHRocm90dGxlX3RpbWVfbXNbVEhST1RUTEVfTEVWRUxfTUFYXVtUSFJPVFRMRV9QSEFTRV9NQVhdOworCQkvKiBtYXJrIHRydWUgaWYgdHJhZmZpYyBpcyBwYXVzZWQgZHVlIHRvIHRoZXJtYWwgdGhyb3R0bGluZyAqLworCQlib29sIGlzX3BhdXNlZDsKKwl9IHR4X3Rocm90dGxlOworCisjaWZkZWYgSVBBX09GRkxPQUQKKwlpcGFfdWNfb3BfY2JfdHlwZSBpcGFfdWNfb3BfY2I7CisJdm9pZCAqb3NpZl9kZXY7CisjZW5kaWYgLyogSVBBX1VDX09GRkxPQUQgKi8KKworI2lmIGRlZmluZWQoRkVBVFVSRV9UU08pCisJc3RydWN0IHsKKwkJdWludDE2X3QgcG9vbF9zaXplOworCQl1aW50MTZfdCBudW1fZnJlZTsKKwkJc3RydWN0IGNkZl90c29fc2VnX2VsZW1fdCAqYXJyYXk7CisJCXN0cnVjdCBjZGZfdHNvX3NlZ19lbGVtX3QgKmZyZWVsaXN0OworCQkvKiB0c28gbXV0ZXggKi8KKwkJT0xfVFhfTVVURVhfVFlQRSB0c29fbXV0ZXg7CisJfSB0c29fc2VnX3Bvb2w7CisjZW5kaWYKKwl1aW50OF90IG9jYl9wZWVyX3ZhbGlkOworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqb2NiX3BlZXI7CisJb2xfdHhfcGF1c2VfY2FsbGJhY2tfZnAgcGF1c2VfY2I7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpscm9fZGF0YTsKKwkJdm9pZCAoKmxyb19mbHVzaF9jYikodm9pZCAqKTsKKwl9IGxyb19pbmZvOworfTsKKworc3RydWN0IG9sX3R4cnhfb2NiX2NoYW5faW5mbyB7CisJdWludDMyX3QgY2hhbl9mcmVxOworCXVpbnQxNl90IGRpc2FibGVfcnhfc3RhdHNfaGRyOjE7Cit9OworCitzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgeworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqcGRldjsgLyogcGRldiAtIHRoZSBwaHlzaWNhbCBkZXZpY2UgdGhhdCBpcworCQkJCQl0aGUgcGFyZW50IG9mIHRoaXMgdmlydHVhbCBkZXZpY2UgKi8KKwl1aW50OF90IHZkZXZfaWQ7ICAgICAgICAgICAgIC8qIElEIHVzZWQgdG8gc3BlY2lmeSBhIHBhcnRpY3VsYXIgdmRldgorCQkJCQl0byB0aGUgdGFyZ2V0ICovCisJdm9pZCAqb3NpZl9kZXY7CisJdW5pb24gb2xfdHhyeF9hbGlnbl9tYWNfYWRkcl90IG1hY19hZGRyOyAvKiBNQUMgYWRkcmVzcyAqLworCS8qIHR4IHBhdXNlZCAtIE5PIExPTkdFUiBORUVERUQ/ICovCisJVEFJTFFfRU5UUlkob2xfdHhyeF92ZGV2X3QpIHZkZXZfbGlzdF9lbGVtOyAvKiBub2RlIGluIHRoZSBwZGV2J3MgbGlzdAorCQkJCQkJICAgICAgIG9mIHZkZXZzICovCisJVEFJTFFfSEVBRChwZWVyX2xpc3RfdCwgb2xfdHhyeF9wZWVyX3QpIHBlZXJfbGlzdDsKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKmxhc3RfcmVhbF9wZWVyOyAvKiBsYXN0IHJlYWwgcGVlciBjcmVhdGVkIGZvcgorCQkJCQkJICB0aGlzIHZkZXYgKG5vdCAic2VsZiIKKwkJCQkJCSAgcHNldWRvLXBlZXIpICovCisJb2xfdHhyeF90eF9mcCB0eDsgLyogdHJhbnNtaXQgZnVuY3Rpb24gdXNlZCBieSB0aGlzIHZkZXYgKi8KKworCXN0cnVjdCB7CisJCS8qCisJCSAqIElmIHRoZSB2ZGV2IG9iamVjdCBjb3VsZG4ndCBiZSBkZWxldGVkIGltbWVkaWF0ZWx5IGJlY2F1c2UKKwkJICogaXQgc3RpbGwgaGFkIHNvbWUgcGVlciBvYmplY3RzIGxlZnQsIHJlbWVtYmVyIHRoYXQgYSBkZWxldGUKKwkJICogd2FzIHJlcXVlc3RlZCwgc28gaXQgY2FuIGJlIGRlbGV0ZWQgb25jZSBhbGwgaXRzIHBlZXJzIGhhdmUKKwkJICogYmVlbiBkZWxldGVkLgorCQkgKi8KKwkJaW50IHBlbmRpbmc7CisJCS8qCisJCSAqIFN0b3JlIGEgZnVuY3Rpb24gcG9pbnRlciBhbmQgYSBjb250ZXh0IGFyZ3VtZW50IHRvIHByb3ZpZGUgYQorCQkgKiBub3RpZmljYXRpb24gZm9yIHdoZW4gdGhlIHZkZXYgaXMgZGVsZXRlZC4KKwkJICovCisJCW9sX3R4cnhfdmRldl9kZWxldGVfY2IgY2FsbGJhY2s7CisJCXZvaWQgKmNvbnRleHQ7CisJfSBkZWxldGU7CisKKwkvKiBzYWZlIG1vZGUgY29udHJvbCB0byBieXBhc3MgdGhlIGVuY3J5cHQgYW5kIGRlY2lwaGVyIHByb2Nlc3MgKi8KKwl1aW50MzJfdCBzYWZlbW9kZTsKKworCS8qIHJ4IGZpbHRlciByZWxhdGVkICovCisJdWludDMyX3QgZHJvcF91bmVuYzsKKwlzdHJ1Y3QgcHJpdmFjeV9leGVtcHRpb24gcHJpdmFjeV9maWx0ZXJzW01BWF9QUklWQUNZX0ZJTFRFUlNdOworCXVpbnQzMl90IG51bV9maWx0ZXJzOworCisJZW51bSB3bGFuX29wX21vZGUgb3Btb2RlOworCisjaWZkZWYgUUNBX0lCU1NfU1VQUE9SVAorCS8qIGlic3MgbW9kZSByZWxhdGVkICovCisJaW50MTZfdCBpYnNzX3BlZXJfbnVtOyAgLyogdGhlIG51bWJlciBvZiBhY3RpdmUgcGVlcnMgKi8KKwlpbnQxNl90IGlic3NfcGVlcl9oZWFydF9iZWF0X3RpbWVyOyAvKiBmb3IgZGV0ZWN0aW5nIHBlZXIgZGVwYXJ0dXJlICovCisjZW5kaWYKKworCXN0cnVjdCB7CisJCXN0cnVjdCB7CisJCQljZGZfbmJ1Zl90IGhlYWQ7CisJCQljZGZfbmJ1Zl90IHRhaWw7CisJCQlpbnQgZGVwdGg7CisJCX0gdHhxOworCQl1aW50MzJfdCBwYXVzZWRfcmVhc29uOworCQljZGZfc3BpbmxvY2tfdCBtdXRleDsKKwkJY2RmX3NvZnRpcnFfdGltZXJfdCB0aW1lcjsKKwkJaW50IG1heF9xX2RlcHRoOworCQlib29sIGlzX3FfcGF1c2VkOworCQlib29sIGlzX3FfdGltZXJfb247CisJCXVpbnQzMl90IHFfcGF1c2VfY250OworCQl1aW50MzJfdCBxX3VucGF1c2VfY250OworCQl1aW50MzJfdCBxX292ZXJmbG93X2NudDsKKwl9IGxsX3BhdXNlOworCWJvb2wgZGlzYWJsZV9pbnRyYWJzc19md2Q7CisJY2RmX2F0b21pY190IG9zX3FfcGF1c2VkOworCXVpbnQxNl90IHR4X2ZsX2x3bTsKKwl1aW50MTZfdCB0eF9mbF9od207CisJY2RmX3NwaW5sb2NrX3QgZmxvd19jb250cm9sX2xvY2s7CisJb2xfdHhyeF90eF9mbG93X2NvbnRyb2xfZnAgb3NpZl9mbG93X2NvbnRyb2xfY2I7CisJdm9pZCAqb3NpZl9mY19jdHg7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QRVJfVkRFVl9UWF9ERVNDX1BPT0wpCisJY2RmX2F0b21pY190IHR4X2Rlc2NfY291bnQ7CisjZW5kaWYKKwl1aW50MTZfdCB3YWl0X29uX3BlZXJfaWQ7CisJY2RmX2V2ZW50X3Qgd2FpdF9kZWxldGVfY29tcDsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfVFNPKQorCXN0cnVjdCB7CisJCWludCBwb29sX2VsZW1zOyAvKiB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHBvb2wgKi8KKwkJaW50IGFsbG9jX2NudDsgLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCQl1aW50MzJfdCAqZnJlZWxpc3Q7IC8qIGZyZWUgbGlzdCBvZiBjZGZfdHNvX3NlZ19lbGVtX3QgKi8KKwl9IHRzb19wb29sX3Q7CisjZW5kaWYKKworCS8qIGxhc3QgY2hhbm5lbCBjaGFuZ2UgZXZlbnQgcmVjaWV2ZWQgKi8KKwlzdHJ1Y3QgeworCQlib29sIGlzX3ZhbGlkOyAgLyogd2hldGhlciB0aGUgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUgdmFsaWQgKi8KKwkJdWludDE2X3QgbWh6OworCQl1aW50MTZfdCBiYW5kX2NlbnRlcl9mcmVxMTsKKwkJdWludDE2X3QgYmFuZF9jZW50ZXJfZnJlcTI7CisJCVdMQU5fUEhZX01PREUgcGh5X21vZGU7CisJfSBvY2JfY2hhbm5lbF9ldmVudDsKKworCS8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBzY2hlZHVsZXMgaW4gdGhlIHNjaGVkdWxlICovCisJc3RydWN0IG9sX3R4cnhfb2NiX2NoYW5faW5mbyAqb2NiX2NoYW5uZWxfaW5mbzsKKwl1aW50MzJfdCBvY2JfY2hhbm5lbF9jb3VudDsKKworI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKKwlzdHJ1Y3Qgb2xfdHhfZmxvd19wb29sX3QgKnBvb2w7CisjZW5kaWYKK307CisKK3N0cnVjdCBvbF9yeF9yZW9yZGVyX2FycmF5X2VsZW1fdCB7CisJY2RmX25idWZfdCBoZWFkOworCWNkZl9uYnVmX3QgdGFpbDsKK307CisKK3N0cnVjdCBvbF9yeF9yZW9yZGVyX3QgeworCXVpbnQ4X3Qgd2luX3N6OworCXVpbnQ4X3Qgd2luX3N6X21hc2s7CisJdWludDhfdCBudW1fbXBkdXM7CisJc3RydWN0IG9sX3J4X3Jlb3JkZXJfYXJyYXlfZWxlbV90ICphcnJheTsKKwkvKiBiYXNlIC0gc2luZ2xlIHJ4IHJlb3JkZXIgZWxlbWVudCB1c2VkIGZvciBub24tYWdnciBjYXNlcyAqLworCXN0cnVjdCBvbF9yeF9yZW9yZGVyX2FycmF5X2VsZW1fdCBiYXNlOworI2lmIGRlZmluZWQoUUNBX1NVUFBPUlRfT0xfUlhfUkVPUkRFUl9USU1FT1VUKQorCXN0cnVjdCBvbF9yeF9yZW9yZGVyX3RpbWVvdXRfbGlzdF9lbGVtX3QgdGltZW91dDsKKyNlbmRpZgorCS8qIG9ubHkgdXNlZCBmb3IgZGVmcmFnIHJpZ2h0IG5vdyAqLworCVRBSUxRX0VOVFJZKG9sX3J4X3Jlb3JkZXJfdCkgZGVmcmFnX3dhaXRsaXN0X2VsZW07CisJdWludDMyX3QgZGVmcmFnX3RpbWVvdXRfbXM7CisJLyogZ2V0IGJhY2sgdG8gcGFyZW50IG9sX3R4cnhfcGVlcl90IHdoZW4gb2xfcnhfcmVvcmRlcl90IGlzIGluIGEKKwkgKiB3YWl0bGlzdCAqLworCXVpbnQxNl90IHRpZDsKK307CisKK2VudW0geworCXR4cnhfc2VjX21jYXN0ID0gMCwKKwl0eHJ4X3NlY191Y2FzdAorfTsKKwordHlwZWRlZiBBX1NUQVRVUyAoKm9sX3R4X2ZpbHRlcl9mdW5jKShzdHJ1Y3Qgb2xfdHhyeF9tc2R1X2luZm9fdCAqCisJCQkJICAgICAgdHhfbXNkdV9pbmZvKTsKKworc3RydWN0IG9sX3R4cnhfcGVlcl90IHsKKwlzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXY7CisKKwljZGZfYXRvbWljX3QgcmVmX2NudDsKKwljZGZfYXRvbWljX3QgZGVsZXRlX2luX3Byb2dyZXNzOworCWNkZl9hdG9taWNfdCBmbHVzaF9pbl9wcm9ncmVzczsKKworCS8qIFRoZSBwZWVyIHN0YXRlIHRyYWNraW5nIGlzIHVzZWQgZm9yIEhMIHN5c3RlbXMKKwkgKiB0aGF0IGRvbid0IHN1cHBvcnQgdHggYW5kIHJ4IGZpbHRlcmluZyB3aXRoaW4gdGhlIHRhcmdldC4KKwkgKiBJbiBzdWNoIHN5c3RlbXMsIHRoZSBwZWVyJ3Mgc3RhdGUgZGV0ZXJtaW5lcyB3aGF0IGtpbmQgb2YKKwkgKiB0eCBhbmQgcnggZmlsdGVyaW5nLCBpZiBhbnksIGlzIGRvbmUuCisJICogVGhpcyB2YXJpYWJsZSBkb2Vzbid0IGFwcGx5IHRvIExMIHN5c3RlbXMsIG9yIHRvIEhMIHN5c3RlbXMgZm9yCisJICogd2hpY2ggdGhlIHRhcmdldCBoYW5kbGVzIHR4IGFuZCByeCBmaWx0ZXJpbmcuIEhvd2V2ZXIsIGl0IGlzCisJICogc2ltcGxlc3QgdG8gZGVjbGFyZSBhbmQgdXBkYXRlIHRoaXMgdmFyaWFibGUgdW5jb25kaXRpb25hbGx5LAorCSAqIGZvciBhbGwgc3lzdGVtcy4KKwkgKi8KKwllbnVtIG9sX3R4cnhfcGVlcl9zdGF0ZSBzdGF0ZTsKKwljZGZfc3BpbmxvY2tfdCBwZWVyX2luZm9fbG9jazsKKwlvbF9yeF9jYWxsYmFja19mcCBvc2lmX3J4OworCWNkZl9zcGlubG9ja190IGJ1ZnFfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNhY2hlZF9idWZxOworCisJb2xfdHhfZmlsdGVyX2Z1bmMgdHhfZmlsdGVyOworCisJLyogcGVlciBJRChzKSBmb3IgdGhpcyBwZWVyICovCisJdWludDE2X3QgcGVlcl9pZHNbTUFYX05VTV9QRUVSX0lEX1BFUl9QRUVSXTsKKyNpZmRlZiBRQ0FfU1VQUE9SVF9UWFJYX0xPQ0FMX1BFRVJfSUQKKwl1aW50MTZfdCBsb2NhbF9pZDsKKyNlbmRpZgorCisJdW5pb24gb2xfdHhyeF9hbGlnbl9tYWNfYWRkcl90IG1hY19hZGRyOworCisJLyogbm9kZSBpbiB0aGUgdmRldidzIGxpc3Qgb2YgcGVlcnMgKi8KKwlUQUlMUV9FTlRSWShvbF90eHJ4X3BlZXJfdCkgcGVlcl9saXN0X2VsZW07CisJLyogbm9kZSBpbiB0aGUgaGFzaCB0YWJsZSBiaW4ncyBsaXN0IG9mIHBlZXJzICovCisJVEFJTFFfRU5UUlkob2xfdHhyeF9wZWVyX3QpIGhhc2hfbGlzdF9lbGVtOworCisJLyoKKwkgKiBwZXIgVElEIGluZm8gLQorCSAqIHN0b3JlZCBpbiBzZXBhcmF0ZSBhcnJheXMgdG8gYXZvaWQgYWxpZ25tZW50IHBhZGRpbmcgbWVtIG92ZXJoZWFkCisJICovCisJc3RydWN0IG9sX3J4X3Jlb3JkZXJfdCB0aWRzX3J4X3Jlb3JkZXJbT0xfVFhSWF9OVU1fRVhUX1RJRFNdOworCXVuaW9uIGh0dF9yeF9wbl90IHRpZHNfbGFzdF9wbltPTF9UWFJYX05VTV9FWFRfVElEU107CisJdWludDhfdCB0aWRzX2xhc3RfcG5fdmFsaWRbT0xfVFhSWF9OVU1fRVhUX1RJRFNdOworCXVpbnQxNl90IHRpZHNfbmV4dF9yZWxfaWR4W09MX1RYUlhfTlVNX0VYVF9USURTXTsKKwl1aW50MTZfdCB0aWRzX2xhc3Rfc2VxW09MX1RYUlhfTlVNX0VYVF9USURTXTsKKwl1aW50MTZfdCB0aWRzX21jYXN0X2xhc3Rfc2VxW09MX1RYUlhfTlVNX0VYVF9USURTXTsKKworCXN0cnVjdCB7CisJCWVudW0gaHR0X3NlY190eXBlIHNlY190eXBlOworCQl1aW50MzJfdCBtaWNoYWVsX2tleVsyXTsgICAgICAgIC8qIHJlbGV2YW50IGZvciBUS0lQICovCisJfSBzZWN1cml0eVsyXTsgICAgICAgICAgLyogMCAtPiBtdWx0aWNhc3QsIDEgLT4gdW5pY2FzdCAqLworCisJLyoKKwkgKiByeCBwcm9jIGZ1bmN0aW9uOiB0aGlzIGVpdGhlciBpcyBhIGNvcHkgb2YgcGRldidzIHJ4X29wdF9wcm9jIGZvcgorCSAqIHJlZ3VsYXIgcnggcHJvY2Vzc2luZywgb3IgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byBhIC9kZXYvbnVsbCBkaXNjYXJkCisJICogZnVuY3Rpb24gd2hlbiBwZWVyIGRlbGV0aW9uIGlzIGluIHByb2dyZXNzLgorCSAqLworCXZvaWQgKCpyeF9vcHRfcHJvYykoc3RydWN0IG9sX3R4cnhfdmRldl90ICp2ZGV2LAorCQkJICAgIHN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlciwKKwkJCSAgICB1bnNpZ25lZCB0aWQsIGNkZl9uYnVmX3QgbXNkdV9saXN0KTsKKworI2lmZGVmIFFDQV9FTkFCTEVfT0xfVFhSWF9QRUVSX1NUQVRTCisJb2xfdHhyeF9wZWVyX3N0YXRzX3Qgc3RhdHM7CisjZW5kaWYKKwlpbnQxNl90IHJzc2lfZGJtOworCisJLyogTkFXRFMgRmxhZyBhbmQgQnNzIFBlZXIgYml0ICovCisJdWludDE2X3QgbmF3ZHNfZW5hYmxlZDoxLCBic3NfcGVlcjoxLCB2YWxpZDoxOworCisJLyogUW9TIGluZm8gKi8KKwl1aW50OF90IHFvc19jYXBhYmxlOworCS8qIFUtQVBTRCB0aWQgbWFzayAqLworCXVpbnQ4X3QgdWFwc2RfbWFzazsKKwkvKmZsYWcgaW5kaWNhdGluZyBrZXkgaW5zdGFsbGVkICovCisJdWludDhfdCBrZXlpbnN0YWxsZWQ7CisKKwkvKiBCaXQgdG8gaW5kaWNhdGUgaWYgUE4gY2hlY2sgaXMgZG9uZSBpbiBmdyAqLworCWNkZl9hdG9taWNfdCBmd19wbl9jaGVjazsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkvKiBQTiBjb3VudGVyIGZvciBSb2J1c3QgTWFuYWdlbWVudCBGcmFtZXMgKi8KKwl1aW50NjRfdCBsYXN0X3JtZl9wbjsKKwl1aW50MzJfdCBybWZfcG5fcmVwbGF5czsKKwl1aW50OF90IGxhc3Rfcm1mX3BuX3ZhbGlkOworI2VuZGlmCisKKwkvKiBQcm9wZXJ0aWVzIG9mIHRoZSBsYXN0IHJlY2VpdmVkIFBQRFUgKi8KKwlpbnQxNl90IGxhc3RfcGt0X3Jzc2lfY21iOworCWludDE2X3QgbGFzdF9wa3RfcnNzaVs0XTsKKwl1aW50OF90IGxhc3RfcGt0X2xlZ2FjeV9yYXRlOworCXVpbnQ4X3QgbGFzdF9wa3RfbGVnYWN5X3JhdGVfc2VsOworCXVpbnQzMl90IGxhc3RfcGt0X3RpbWVzdGFtcF9taWNyb3NlYzsKKwl1aW50OF90IGxhc3RfcGt0X3RpbWVzdGFtcF9zdWJtaWNyb3NlYzsKKwl1aW50MzJfdCBsYXN0X3BrdF90c2Y7CisJdWludDhfdCBsYXN0X3BrdF90aWQ7CisJdWludDE2X3QgbGFzdF9wa3RfY2VudGVyX2ZyZXE7Cit9OworCisjZW5kaWYgLyogX09MX1RYUlhfVFlQRVNfX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2RwL3R4cngvdHhyeC5oIGIvY29yZS9kcC90eHJ4L3R4cnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTgwOGYxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kcC90eHJ4L3R4cnguaApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBUWFJYX0gKKyNkZWZpbmUgVFhSWF9ICisKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAiY2RmX25idWYuaCIKKyNpbmNsdWRlICJjc3JfYXBpLmgiCisjaW5jbHVkZSAic2FwX2FwaS5oIgorI2luY2x1ZGUgImNkZl9uYnVmLmgiCisjaW5jbHVkZSAib2xfdHhyeF9vc2lmX2FwaS5oIgorCisvKiB3YWl0IG9uIHBlZXIgZGVsZXRpb24gdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgUEVFUl9ERUxFVElPTl9USU1FT1VUIDUwMAorCitlbnVtIHR4cnhfd21tX2FjIHsKKwlUWFJYX1dNTV9BQ19WTywKKwlUWFJYX1dNTV9BQ19WSSwKKwlUWFJYX1dNTV9BQ19CSywKKwlUWFJYX1dNTV9BQ19CRSwKKworCVRYUlhfTlVNX1dNTV9BQworfTsKKworc3RydWN0IHR4cnhfcnhfbWV0YWluZm8geworCXU4IHVwOworCXUxNiBkZXN0X3N0YWlkOworfTsKKworZW51bSBidF9mcmFtZV90eXBlIHsKKwkvKiBCVC1BTVAgcGFja2V0IG9mIHR5cGUgZGF0YSAqLworCVRYUlhfQlRfQU1QX1RZUEVfREFUQSA9IDB4MDAwMSwKKworCS8qIEJULUFNUCBwYWNrZXQgb2YgdHlwZSBhY3Rpdml0eSByZXBvcnQgKi8KKwlUWFJYX0JUX0FNUF9UWVBFX0FSID0gMHgwMDAyLAorCisJLyogQlQtQU1QIHBhY2tldCBvZiB0eXBlIHNlY3VyaXR5IGZyYW1lICovCisJVFhSWF9CVF9BTVBfVFlQRV9TRUMgPSAweDAwMDMsCisKKwkvKiBCVC1BTVAgcGFja2V0IG9mIHR5cGUgTGluayBTdXBlcnZpc2lvbiByZXF1ZXN0IGZyYW1lICovCisJVFhSWF9CVF9BTVBfVFlQRV9MU19SRVEgPSAweDAwMDQsCisKKwkvKiBCVC1BTVAgcGFja2V0IG9mIHR5cGUgTGluayBTdXBlcnZpc2lvbiByZXBseSBmcmFtZSAqLworCVRYUlhfQlRfQU1QX1RZUEVfTFNfUkVQID0gMHgwMDA1LAorCisJLyogSW52YWxpZCBGcmFtZSAqLworCVRYUlhfQkFQX0lOVkFMSURfRlJBTUUKK307CisKK2VudW0gd2xhbl90c19kaXJlY3Rpb24geworCS8qIHVwbGluayAqLworCVdMQU5fVFhfRElSID0gMCwKKworCS8qIGRvd25saW5rICovCisJV0xBTl9SWF9ESVIgPSAxLAorCisJLypiaWRpcmVjdGlvbmFsICovCisJV0xBTl9CSV9ESVIgPSAyLAorfTsKKworZW51bSB3bGFuX3N0YV9zdGF0ZSB7CisJLyogVHJhbnNpdGlvbiBpbiB0aGlzIHN0YXRlIG1hZGUgdXBvbiBjcmVhdGlvbiAqLworCVdMQU5fU1RBX0lOSVQgPSAwLAorCisJLyogVHJhbnNpdGlvbiBoYXBwZW5zIGFmdGVyIEFzc29jIHN1Y2Nlc3MgaWYgc2Vjb25kIGxldmVsIGF1dGhlbnRpY2F0aW9uCisJICAgaXMgbmVlZGVkICovCisJV0xBTl9TVEFfQ09OTkVDVEVELAorCisJLyogVHJhbnNpdGlvbiBoYXBwZW5zIHdoZW4gc2Vjb25kIGxldmVsIGF1dGggaXMgc3VjY2Vzc2Z1bCBhbmQga2V5cyBhcmUKKwkgICBwcm9wZXJseSBpbnN0YWxsZWQgKi8KKwlXTEFOX1NUQV9BVVRIRU5USUNBVEVELAorCisJLyogVHJhbnNpdGlvbiBoYXBwZW5zIHdoZW4gY29ubmVjdGl2aXR5IGlzIGxvc3QgKi8KKwlXTEFOX1NUQV9ESVNDT05ORUNURUQsCisKKwlXTEFOX1NUQV9NQVhfU1RBVEUKK307CisKK3N0cnVjdCB3bGFuX3R4cnhfc3RhdHMgeworCS8qIERlZmluZSB2YXJpb3VzIHR4cnggc3RhdHMgaGVyZSAqLworfTsKKworc3RydWN0IG9sX3R4cnhfdmRldl90OworCitDREZfU1RBVFVTIHdsYW5fcmVnaXN0ZXJfbWdtdF9jbGllbnQodm9pZCAqcGRldl90eHJ4LAorCQkJCSAgICAgQ0RGX1NUQVRVUyAoKnJ4X21nbXQpKHZvaWQgKmdfY2RzY3R4LAorCQkJCQkJCSAgIHZvaWQgKmJ1ZikpOworCit0eXBlZGVmIHZvaWQgKCpvbF90eHJ4X3ZkZXZfZGVsZXRlX2NiKSh2b2lkICpjb250ZXh0KTsKKworLyoqCisgKiBAdHlwZWRlZiBvbF90eHJ4X3R4X2ZwCisgKiBAYnJpZWYgdG9wLWxldmVsIHRyYW5zbWl0IGZ1bmN0aW9uCisgKi8KK3R5cGVkZWYgY2RmX25idWZfdAorKCpvbF90eHJ4X3R4X2ZwKShzdHJ1Y3Qgb2xfdHhyeF92ZGV2X3QgKnZkZXYsIGNkZl9uYnVmX3QgbXNkdV9saXN0KTsKKwordHlwZWRlZiB2b2lkCisoKm9sX3R4cnhfbWdtdF90eF9jYikodm9pZCAqY3R4dCwgY2RmX25idWZfdCB0eF9tZ210X2ZybSwgaW50IGhhZF9lcnJvcik7CisKKy8qIElmIFJTU0kgcmVhbG0gaXMgY2hhbmdlZCwgc2VuZCBub3RpZmljYXRpb24gdG8gQ2xpZW50cywgU01FLCBIREQgKi8KK3R5cGVkZWYgQ0RGX1NUQVRVUyAoKndsYW5fdHhyeF9yc3NpX2Nyb3NzX3RocmVzaCkodm9pZCAqYWRhcHRlciwgdTggcnNzaSwKKwkJCQkJCSAgdm9pZCAqdXNyX2N0eCwKKwkJCQkJCSAgaW50OF90IGF2Z19yc3NpKTsKKworc3RydWN0IHdsYW5fdHhyeF9pbmRfcmVxIHsKKwl1MTYgbXNnVHlwZTsgICAgICAgICAgICAvKiBtZXNzYWdlIHR5cGUgaXMgc2FtZSBhcyB0aGUgcmVxdWVzdCB0eXBlICovCisJdTE2IG1zZ0xlbjsgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSBlbnRpcmUgcmVxdWVzdCAqLworCXU4IHNlc3Npb25JZDsgICAgICAgICAgIC8qIHNtZSBTZXNzaW9uIElkICovCisJdTggcnNzaU5vdGlmaWNhdGlvbjsKKwl1OCBhdmdSc3NpOworCXZvaWQgKnRsQ2FsbGJhY2s7CisJdm9pZCAqcEFkYXB0ZXI7CisJdm9pZCAqcFVzZXJDdHh0OworfTsKKworCisvKiBSeCBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggdHhyeCAqLwordHlwZWRlZiBpbnQgKCp3bGFuX3R4cnhfY2JfdHlwZSkodm9pZCAqZ19jZHNjdHgsIGNkZl9uYnVmX3QgYnVmLCB1OCBzdGFfaWQsCisJCQkJIHN0cnVjdCB0eHJ4X3J4X21ldGFpbmZvICpyeF9tZXRhX2luZm8pOworCitzdGF0aWMgaW5saW5lIGludCB3bGFuX3R4cnhfZ2V0X3Jzc2kodm9pZCAqZ19jZHNjdHgsIHU4IHN0YV9pZCwgaW50OF90ICpyc3NpKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bGFuX3R4cnhfZW5hYmxlX3VhcHNkX2FjKHZvaWQgKmdfY2RzY3R4LCB1OCBzdGFfaWQsCisJCQkJCSAgICBlbnVtIHR4cnhfd21tX2FjIGFjLCB1OCB0aWQsIHU4IHVwLAorCQkJCQkgICAgdTMyIHNydl9pbnQsIHUzMiBzdXNwZW5kX2ludCwKKwkJCQkJICAgIGVudW0gd2xhbl90c19kaXJlY3Rpb24gdHNfZGlyKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bGFuX3R4cnhfZGlzYWJsZV91YXBzZF9hYyh2b2lkICpnX2Nkc2N0eCwgdTggc3RhX2lkLAorCQkJCQkgICAgIGVudW0gdHhyeF93bW1fYWMgYWMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdsYW5fY2hhbmdlX3N0YV9zdGF0ZSh2b2lkICpnX2Nkc2N0eCwgdTggc3RhX2lkLAorCQkJCQllbnVtIHdsYW5fc3RhX3N0YXRlIHN0YXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bGFuX2RlcmVnaXN0ZXJfbWdtdF9jbGllbnQodm9pZCAqZ19jZHNjdHgpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bGFuX2Fzc29jX2ZhaWxlZCh1OCBzdGFpZCkKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgd2xhbl9nZXRfYXBfc3RhdHModm9pZCAqZ19jZHNjdHgsIHRTYXBfU29mdGFwU3RhdHMgKmJ1ZiwKKwkJCQkgICAgYm9vbCByZXNldCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2xhbl9nZXRfdHhyeF9zdGF0cyh2b2lkICpnX2Nkc2N0eCwKKwkJCQkgICAgICBzdHJ1Y3Qgd2xhbl90eHJ4X3N0YXRzICpzdGF0cywgdTggc3RhX2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bGFuX3R4cnhfdXBkYXRlX3Jzc2lfYm1wcyh2b2lkICpnX2Nkc2N0eCwgdTggc3RhX2lkLAorCQkJCQkgICAgIGludDhfdCByc3NpKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bGFuX3R4cnhfZGVyZWdpc3Rlcl9yc3NpX2luZGNiKHZvaWQgKmdfY2RzY3R4LAorCQkJCQkJICBpbnQ4X3QgcnNzaV92YWwsCisJCQkJCQkgIHU4IHRyaWdnZXJfZXZlbnQsCisJCQkJCQkgIHdsYW5fdHhyeF9yc3NpX2Nyb3NzX3RocmVzaAorCQkJCQkJICBjYiwgaW50IG1vZF9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2xhbl90eHJ4X3JlZ2lzdGVyX3Jzc2lfaW5kY2Iodm9pZCAqZ19jZHNjdHgsCisJCQkJCQlpbnQ4X3QgcnNzaV92YWwsCisJCQkJCQl1OCB0cmlnZ2VyX2V2ZW50LAorCQkJCQkJd2xhbl90eHJ4X3Jzc2lfY3Jvc3NfdGhyZXNoIGNiLAorCQkJCQkJaW50IG1vZF9pZCwgdm9pZCAqdXNyX2N0eCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogRklYTUU6IFRoZSBmb2xsb3dpbmcgc3R1YnMgd2lsbCBiZSByZW1vdmVkIGV2ZW50dWFsbHkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHdsYW5fdHhyeF9tY19wcm9jZXNzX21zZyh2b2lkICpnX2Nkc2N0eCwgY2RzX21zZ190ICptc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdsYW5fdHhyeF90eF9wcm9jZXNzX21zZyh2b2lkICpnX2Nkc2N0eCwgY2RzX21zZ190ICptc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bGFuX3R4cnhfbWNfZnJlZV9tc2codm9pZCAqZ19jZHNjdHgsIGNkc19tc2dfdCAqbXNnKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2xhbl90eHJ4X3R4X2ZyZWVfbXNnKHZvaWQgKmdfY2RzY3R4LCBjZHNfbXNnX3QgKm1zZykKK3sKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9kcC90eHJ4L3dkaV9ldmVudC5oIGIvY29yZS9kcC90eHJ4L3dkaV9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDE5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvd2RpX2V2ZW50LmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfV0RJX0VWRU5UX0hfCisjZGVmaW5lIF9XRElfRVZFTlRfSF8KKworI2luY2x1ZGUgImF0aGRlZnMuaCIKKyNpbmNsdWRlICJjZGZfbmJ1Zi5oIgorI2RlZmluZSBXRElfRVZFTlRfQkFTRSAweDEwMCAgICAvKiBFdmVudCBzdGFydGluZyBudW1iZXIgKi8KKworZW51bSBXRElfRVZFTlQgeworCVdESV9FVkVOVF9UWF9TVEFUVVMgPSBXRElfRVZFTlRfQkFTRSwKKwlXRElfRVZFTlRfUlhfREVTQywKKwlXRElfRVZFTlRfUlhfREVTQ19SRU1PVEUsCisJV0RJX0VWRU5UX1JBVEVfRklORCwKKwlXRElfRVZFTlRfUkFURV9VUERBVEUsCisJV0RJX0VWRU5UX1JYX1BFRVJfSU5WQUxJRCwKKwkvKiBFbmQgb2YgbmV3IGV2ZW50IGl0ZW1zICovCisKKwlXRElfRVZFTlRfTEFTVAorfTsKKworc3RydWN0IHdkaV9ldmVudF9yeF9wZWVyX2ludmFsaWRfbXNnIHsKKwljZGZfbmJ1Zl90IG1zZHU7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2g7CisJdWludDhfdCB2ZGV2X2lkOworfTsKKworI2RlZmluZSBXRElfTlVNX0VWRU5UUyAgKFdESV9FVkVOVF9MQVNUIC0gV0RJX0VWRU5UX0JBU0UpCisKKyNkZWZpbmUgV0RJX0VWRU5UX05PVElGWV9CQVNFICAgMHgyMDAKK2VudW0gV0RJX0VWRU5UX05PVElGWSB7CisJV0RJX0VWRU5UX1NVQl9ERUFMTE9DQVRFID0gV0RJX0VWRU5UX05PVElGWV9CQVNFLAorCS8qIEVuZCBvZiBuZXcgbm90aWZpY2F0aW9uIHR5cGVzICovCisKKwlXRElfRVZFTlRfTk9USUZZX0xBU1QKK307CisKKy8qIE9wYXF1ZSBldmVudCBjYWxsYmFjayAqLwordHlwZWRlZiB2b2lkICgqd2RpX2V2ZW50X2NiKSh2b2lkICpwZGV2LCBlbnVtIFdESV9FVkVOVCBldmVudCwgdm9pZCAqZGF0YSk7CisKKy8qIE9wYXF1ZSBldmVudCBub3RpZnkgKi8KK3R5cGVkZWYgdm9pZCAoKndkaV9ldmVudF9ub3RpZnkpKGVudW0gV0RJX0VWRU5UX05PVElGWSBub3RpZnksCisJCQkJIGVudW0gV0RJX0VWRU5UIGV2ZW50KTsKKworLyoqCisgKiBAdHlwZWRlZiB3ZGlfZXZlbnRfc3Vic2NyaWJlCisgKiBAYnJpZWYgVXNlZCBieSBjb25zdW1lcnMgdG8gc3Vic2NyaWJlIHRvIFdESSBldmVudCBub3RpZmljYXRpb25zLgorICogQGRldGFpbHMKKyAqICBUaGUgZXZlbnRfc3Vic2NyaWJlIHN0cnVjdCBpbmNsdWRlcyBwb2ludGVycyB0byBvdGhlciBldmVudF9zdWJzY3JpYmUKKyAqICBvYmplY3RzLiAgVGhlc2UgcG9pbnRlcnMgYXJlIHNpbXBseSB0byBzaW1wbGlmeSB0aGUgbWFuYWdlbWVudCBvZgorICogIGxpc3RzIG9mIGV2ZW50IHN1YnNjcmliZXJzLiAgVGhlc2UgcG9pbnRlcnMgYXJlIHNldCBkdXJpbmcgdGhlCisgKiAgZXZlbnRfc3ViKCkgZnVuY3Rpb24sIGFuZCBzaGFsbCBub3QgYmUgbW9kaWZpZWQgZXhjZXB0IGJ5IHRoZQorICogIFdESSBldmVudCBtYW5hZ2VtZW50IFNXLCB1bnRpbCBhZnRlciB0aGUgb2JqZWN0J3MgZXZlbnQgc3Vic2NyaXB0aW9uCisgKiAgaXMgY2FuY2VsZWQgYnkgY2FsbGluZyBldmVudF91bnN1YigpLgorICovCisKK3R5cGVkZWYgc3RydWN0IHdkaV9ldmVudF9zdWJzY3JpYmVfdCB7CisJd2RpX2V2ZW50X2NiIGNhbGxiYWNrOyAgLyogc3Vic2NyaWJlciBldmVudCBjYWxsYmFjayBzdHJ1Y3R1cmUgaGVhZCAqLworCXZvaWQgKmNvbnRleHQ7ICAgICAgICAgIC8qIHN1YnNjcmliZXIgb2JqZWN0IHRoYXQgcHJvY2Vzc2VzIHRoZSBldmVudCBjYWxsYmFjayAqLworCXN0cnVjdCB7CisJCS8qIHByaXZhdGUgLSB0aGUgZXZlbnQgc3Vic2NyaWJlciBTVyBzaGFsbCBub3QgdXNlIHRoaXMgc3RydWN0ICovCisJCXN0cnVjdCB3ZGlfZXZlbnRfc3Vic2NyaWJlX3QgKm5leHQ7CisJCXN0cnVjdCB3ZGlfZXZlbnRfc3Vic2NyaWJlX3QgKnByZXY7CisJfSBwcml2OworfSB3ZGlfZXZlbnRfc3Vic2NyaWJlOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZHAvdHhyeC93ZGlfZXZlbnRfYXBpLmggYi9jb3JlL2RwL3R4cngvd2RpX2V2ZW50X2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMmNlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RwL3R4cngvd2RpX2V2ZW50X2FwaS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1dESV9FVkVOVF9BUElfSF8KKyNkZWZpbmUgX1dESV9FVkVOVF9BUElfSF8KKworI2luY2x1ZGUgIndkaV9ldmVudC5oIgorCitzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3Q7CisKKy8qKgorICogQGJyaWVmIFN1YnNjcmliZSB0byBhIHNwZWNpZmllZCBXREkgZXZlbnQuCisgKiBAZGV0YWlscworICogIFRoaXMgZnVuY3Rpb24gYWRkcyB0aGUgcHJvdmlkZWQgd2RpX2V2ZW50X3N1YnNjcmliZSBvYmplY3QgdG8gYSBsaXN0IG9mCisgKiAgc3Vic2NyaWJlcnMgZm9yIHRoZSBzcGVjaWZpZWQgV0RJIGV2ZW50LgorICogIFdoZW4gdGhlIGV2ZW50IGluIHF1ZXN0aW9uIGhhcHBlbnMsIGVhY2ggc3Vic2NyaWJlciBmb3IgdGhlIGV2ZW50IHdpbGwKKyAqICBoYXZlIHRoZWlyIGNhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQuCisgKiAgVGhlIG9yZGVyIGluIHdoaWNoIGNhbGxiYWNrIGZ1bmN0aW9ucyBmcm9tIG11bHRpcGxlIHN1YnNjcmliZXJzIGFyZQorICogIGludm9rZWQgaXMgdW5zcGVjaWZpZWQuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZXZlbnQgcGh5c2ljYWwgZGV2aWNlLCB0aGF0IG1haW50YWlucyB0aGUgZXZlbnQgbGlzdHMKKyAqIEBwYXJhbSBldmVudF9jYl9zdWIgLSB0aGUgY2FsbGJhY2sgYW5kIGNvbnRleHQgZm9yIHRoZSBldmVudCBzdWJzY3JpYmVyCisgKiBAcGFyYW0gZXZlbnQgLSB3aGljaCBldmVudCdzIG5vdGlmaWNhdGlvbnMgYXJlIGJlaW5nIHN1YnNjcmliZWQgdG8KKyAqIEByZXR1cm4gZXJyb3IgY29kZSwgb3IgQV9PSyBmb3Igc3VjY2VzcworICovCitBX1NUQVRVUyB3ZGlfZXZlbnRfc3ViKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqdHhyeF9wZGV2LAorCQkgICAgICAgd2RpX2V2ZW50X3N1YnNjcmliZSAqZXZlbnRfY2Jfc3ViLAorCQkgICAgICAgZW51bSBXRElfRVZFTlQgZXZlbnQpOworCisvKioKKyAqIEBicmllZiBVbnN1YnNjcmliZSBmcm9tIGEgc3BlY2lmaWVkIFdESSBldmVudC4KKyAqIEBkZXRhaWxzCisgKiAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBwcm92aWRlZCBldmVudCBzdWJzY3JpcHRpb24gb2JqZWN0IGZyb20gdGhlCisgKiAgbGlzdCBvZiBzdWJzY3JpYmVycyBmb3IgaXRzIGV2ZW50LgorICogIFRoaXMgZnVuY3Rpb24gc2hhbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlcmUgd2FzIGEgc3VjY2Vzc2Z1bCBwcmlvciBjYWxsCisgKiAgdG8gZXZlbnRfc3ViKCkgb24gdGhlIHNhbWUgd2RpX2V2ZW50X3N1YnNjcmliZSBvYmplY3QuCisgKgorICogQHBhcmFtIHBkZXYgLSB0aGUgZXZlbnQgcGh5c2ljYWwgZGV2aWNlIHdpdGggdGhlIGxpc3Qgb2YgZXZlbnQgc3Vic2NyaWJlcnMKKyAqIEBwYXJhbSBldmVudF9jYl9zdWIgLSB0aGUgZXZlbnQgc3Vic2NyaXB0aW9uIG9iamVjdAorICogQHBhcmFtIGV2ZW50IC0gd2hpY2ggZXZlbnQgaXMgYmVpbmcgdW5zdWJzY3JpYmVkCisgKiBAcmV0dXJuIGVycm9yIGNvZGUsIG9yIEFfT0sgZm9yIHN1Y2Nlc3MKKyAqLworQV9TVEFUVVMgd2RpX2V2ZW50X3Vuc3ViKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqdHhyeF9wZGV2LAorCQkJIHdkaV9ldmVudF9zdWJzY3JpYmUgKmV2ZW50X2NiX3N1YiwKKwkJCSBlbnVtIFdESV9FVkVOVCBldmVudCk7CisKKyNpZmRlZiBXRElfRVZFTlRfRU5BQkxFCisKK3ZvaWQgd2RpX2V2ZW50X2hhbmRsZXIoZW51bSBXRElfRVZFTlQgZXZlbnQsCisJCSAgICAgICBzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnR4cnhfcGRldiwgdm9pZCAqZGF0YSk7CitBX1NUQVRVUyB3ZGlfZXZlbnRfYXR0YWNoKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqdHhyeF9wZGV2KTsKK0FfU1RBVFVTIHdkaV9ldmVudF9kZXRhY2goc3RydWN0IG9sX3R4cnhfcGRldl90ICp0eHJ4X3BkZXYpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2RpX2V2ZW50X2hhbmRsZXIoZW51bSBXRElfRVZFTlQgZXZlbnQsCisJCSAgICAgICBzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnR4cnhfcGRldiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIEFfU1RBVFVTIHdkaV9ldmVudF9hdHRhY2goc3RydWN0IG9sX3R4cnhfcGRldl90ICp0eHJ4X3BkZXYpCit7CisJcmV0dXJuIEFfT0s7Cit9CitzdGF0aWMgaW5saW5lIEFfU1RBVFVTIHdkaV9ldmVudF9kZXRhY2goc3RydWN0IG9sX3R4cnhfcGRldl90ICp0eHJ4X3BkZXYpCit7CisJcmV0dXJuIEFfT0s7Cit9CisjZW5kaWYgLyogV0RJX0VWRU5UX0VOQUJMRSAqLworCisjZW5kaWYgLyogX1dESV9FVkVOVF9BUElfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL2luYy9xY19zYXBfaW9jdGwuaCBiL2NvcmUvaGRkL2luYy9xY19zYXBfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmVlMDRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3FjX3NhcF9pb2N0bC5oCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9RQ19TQVBfSU9DVExfSF8KKyNkZWZpbmUgX1FDX1NBUF9JT0NUTF9IXworCisvKgorICogUUNTQVAgaW9jdGxzLgorICovCisKKy8qCisgKiBNYXggc2l6ZSBvZiBvcHRpb25hbCBpbmZvcm1hdGlvbiBlbGVtZW50cy4gIFdlIGFydGlmaWNpYWxseQorICogY29uc3RyYWluIHRoaXM7IGl0J3MgbGltaXRlZCBvbmx5IGJ5IHRoZSBtYXggZnJhbWUgc2l6ZSAoYW5kCisgKiB0aGUgbWF4IHBhcmFtZXRlciBzaXplIG9mIHRoZSB3aXJlbGVzcyBleHRlbnNpb25zKS4KKyAqLworI2RlZmluZSBRQ1NBUF9NQVhfT1BUX0lFICAgICAgICAyNTYKKyNkZWZpbmUgUUNTQVBfTUFYX1dTQ19JRSAgICAgICAgMjU2CisjZGVmaW5lIFFDU0FQX01BWF9HRVRfU1RBX0lORk8gIDUxMgorCit0eXBlZGVmIHN0cnVjdCBzU1NJRCB7CisJdWludDhfdCBsZW5ndGg7CisJdWludDhfdCBzc0lkWzMyXTsKK30gdFNTSUQ7CisKK3R5cGVkZWYgc3RydWN0IHNTU0lESW5mbyB7CisJdFNTSUQgc3NpZDsKKwl1aW50OF90IHNzaWRIaWRkZW47Cit9IHRTU0lESW5mbzsKKwordHlwZWRlZiBlbnVtIHsKKwllUUNfRE9UMTFfTU9ERV9BTEwgPSAwLAorCWVRQ19ET1QxMV9NT0RFX0FCRyA9IDB4MDAwMSwgICAgLyogMTFhL2IvZyBvbmx5LCBubyBIVCwgbm8gcHJvcHJpZXRhcnkgKi8KKwllUUNfRE9UMTFfTU9ERV8xMUEgPSAweDAwMDIsCisJZVFDX0RPVDExX01PREVfMTFCID0gMHgwMDA0LAorCWVRQ19ET1QxMV9NT0RFXzExRyA9IDB4MDAwOCwKKwllUUNfRE9UMTFfTU9ERV8xMU4gPSAweDAwMTAsCisJZVFDX0RPVDExX01PREVfMTFHX09OTFkgPSAweDAwMjAsCisJZVFDX0RPVDExX01PREVfMTFOX09OTFkgPSAweDAwNDAsCisJZVFDX0RPVDExX01PREVfMTFCX09OTFkgPSAweDAwODAsCisJZVFDX0RPVDExX01PREVfMTFBX09OTFkgPSAweDAxMDAsCisJLyogVGhpcyBpcyBmb3IgV0lGSSB0ZXN0LiBJdCBpcyBzYW1lIGFzIGVXTklBUElfTUFDX1BST1RPQ09MX0FMTCBleGNlcHQgd2hlbiBpdCBzdGFydHMgSUJTUyBpbiAxMUIgb2YgMi40R0h6ICovCisJLyogSXQgaXMgZm9yIENTUiBpbnRlcm5hbCB1c2UgKi8KKwllUUNfRE9UMTFfTU9ERV9BVVRPID0gMHgwMjAwLAorCit9IHRRY1BoeU1vZGU7CisKKyNkZWZpbmUgUUNTQVBfQUREUl9MRU4gIDYKKwordHlwZWRlZiB1aW50OF90IHFjbWFjYWRkcltRQ1NBUF9BRERSX0xFTl07CisKK3N0cnVjdCBxY19tYWNfYWNsX2VudHJ5IHsKKwlxY21hY2FkZHIgYWRkcjsKKwlpbnQgdmxhbl9pZDsKK307CisKK3R5cGVkZWYgZW51bSB7CisJZVFDX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSwKKwllUUNfQVVUSF9UWVBFX1NIQVJFRF9LRVksCisJZVFDX0FVVEhfVFlQRV9BVVRPX1NXSVRDSAorfSBlUWNBdXRoVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwllUUNfV1BTX0JFQUNPTl9JRSwKKwllUUNfV1BTX1BST0JFX1JTUF9JRSwKKwllUUNfV1BTX0FTU09DX1JTUF9JRQorfSBlUUNXUFNUeXBlOworCisvKgorICogUmV0cmlldmUgdGhlIFdQQS9SU04gaW5mb3JtYXRpb24gZWxlbWVudCBmb3IgYW4gYXNzb2NpYXRlZCBzdGF0aW9uLgorICovCitzdHJ1Y3Qgc1FjU2FwcmVxX3dwYWllIHsKKwl1aW50OF90IHdwYV9pZVtRQ1NBUF9NQVhfT1BUX0lFXTsKKwl1aW50OF90IHdwYV9tYWNhZGRyW1FDU0FQX0FERFJfTEVOXTsKK307CisKKy8qCisgKiBSZXRyaWV2ZSB0aGUgV1NDIGluZm9ybWF0aW9uIGVsZW1lbnQgZm9yIGFuIGFzc29jaWF0ZWQgc3RhdGlvbi4KKyAqLworc3RydWN0IHNRY1NhcHJlcV93c2NpZSB7CisJdWludDhfdCB3c2NfbWFjYWRkcltRQ1NBUF9BRERSX0xFTl07CisJdWludDhfdCB3c2NfaWVbUUNTQVBfTUFYX1dTQ19JRV07Cit9OworCisvKgorICogUmV0cmlldmUgdGhlIFdQUyBQQkMgUHJvYmUgUmVxdWVzdCBJRXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHNRY1NhcHJlcV9XUFNQQkNQcm9iZVJlcUlFUyB7CisJdWludDhfdCBtYWNhZGRyW1FDU0FQX0FERFJfTEVOXTsKKwl1aW50MTZfdCBwcm9iZVJlcUlFTGVuOworCXVpbnQ4X3QgcHJvYmVSZXFJRVs1MTJdOworfSBzUWNTYXByZXFfV1BTUEJDUHJvYmVSZXFJRVNfdDsKKworLyoKKyAqIENoYW5uZWwgTGlzdCBJbmZvCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgbnVtX2NoYW5uZWxzOworCXVpbnQ4X3QgY2hhbm5lbHNbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKK30gdENoYW5uZWxMaXN0SW5mbywgKnRwQ2hhbm5lbExpc3RJbmZvOworCisjaWZkZWYgX19saW51eF9fCisvKgorICogV2lyZWxlc3MgRXh0ZW5zaW9ucyBBUEksIHByaXZhdGUgaW9jdGwgaW50ZXJmYWNlcy4KKyAqCisgKiBOQjogRXZlbi1udW1iZXJlZCBpb2N0bCBudW1iZXJzIGhhdmUgc2V0IHNlbWFudGljcyBhbmQgYXJlIHByaXZpbGVnZWQhCisgKiAgICAgKHJlZ2FyZGxlc3Mgb2YgdGhlIGluY29ycmVjdCBjb21tZW50IGluIHdpcmVsZXNzLmghKQorICovCisKKyNkZWZpbmUgUUNTQVBfSU9DVExfU0VUUEFSQU0gICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViswKQorI2RlZmluZSBRQ1NBUF9JT0NUTF9HRVRQQVJBTSAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWKzEpCisvKiAoU0lPQ0lXRklSU1RQUklWKzIpIGlzIHVudXNlZCAqLworLyogKFNJT0NJV0ZJUlNUUFJJViszKSBpcyB1bnVzZWQgKi8KKyNkZWZpbmUgUUNTQVBfSU9DVExfR0VUX1NUQVdQQUlFICAgICAgKFNJT0NJV0ZJUlNUUFJJVis0KQorI2RlZmluZSBRQ1NBUF9JT0NUTF9TRVRXUEFJRSAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWKzUpCisjZGVmaW5lIFFDU0FQX0lPQ1RMX1NUT1BCU1MgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYrNikKKyNkZWZpbmUgUUNTQVBfSU9DVExfVkVSU0lPTiAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJVis3KQorI2RlZmluZSBRQ1NBUF9JT0NUTF9HRVRfV1BTX1BCQ19QUk9CRV9SRVFfSUVTICAgICAgIChTSU9DSVdGSVJTVFBSSVYrOCkKKyNkZWZpbmUgUUNTQVBfSU9DVExfR0VUX0NIQU5ORUwgICAgICAgKFNJT0NJV0ZJUlNUUFJJVis5KQorI2RlZmluZSBRQ1NBUF9JT0NUTF9BU1NPQ19TVEFfTUFDQUREUiAoU0lPQ0lXRklSU1RQUklWKzEwKQorI2RlZmluZSBRQ1NBUF9JT0NUTF9ESVNBU1NPQ19TVEEgICAgICAoU0lPQ0lXRklSU1RQUklWKzExKQorLyogKFNJT0NJV0ZJUlNUUFJJVisxMikgaXMgdW51c2VkICovCisvKiBQcml2YXRlIGlvY3RscyBhbmQgdGhlaXIgc3ViLWlvY3RscyAqLworI2RlZmluZSBRQ1NBUF9QUklWX0dFVF9DSEFSX1NFVF9OT05FICAgKFNJT0NJV0ZJUlNUUFJJViArIDEzKQorI2RlZmluZSBRQ1NBUF9HRVRfU1RBVFMgMQorI2RlZmluZSBRQ1NBUF9JT0NUTF9DTFJfU1RBVFMgICAgICAgICAoU0lPQ0lXRklSU1RQUklWKzE0KQorCisjZGVmaW5lIFFDU0FQX0lPQ1RMX1BSSVZfU0VUX1RIUkVFX0lOVF9HRVRfTk9ORSAoU0lPQ0lXRklSU1RQUklWKzE1KQorI2RlZmluZSBXRV9TRVRfV0xBTl9EQkcgMQorI2RlZmluZSBXRV9TRVRfRFBfVFJBQ0UgMgorI2RlZmluZSBXRV9TRVRfU0FQX0NIQU5ORUxTICAzCisjZGVmaW5lIFFDU0FQX0lPQ1RMX1BSSVZfU0VUX1ZBUl9JTlRfR0VUX05PTkUgKFNJT0NJV0ZJUlNUUFJJVisxNikKKyNkZWZpbmUgV0VfVU5JVF9URVNUX0NNRCAgIDcKKyNkZWZpbmUgUUNTQVBfSU9DVExfU0VUX0NIQU5ORUxfUkFOR0UgKFNJT0NJV0ZJUlNUUFJJVisxNykKKworI2RlZmluZSBXRV9QMlBfTk9BX0NNRCAgMgorCisjZGVmaW5lIFFDU0FQX0lPQ1RMX01PRElGWV9BQ0wgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJVisxOCkKKyNkZWZpbmUgUUNTQVBfSU9DVExfR0VUX0NIQU5ORUxfTElTVCAgICAoU0lPQ0lXRklSU1RQUklWKzE5KQorI2RlZmluZSBRQ1NBUF9JT0NUTF9TRVRfVFhfUE9XRVIgICAgICAgIChTSU9DSVdGSVJTVFBSSVYrMjApCisjZGVmaW5lIFFDU0FQX0lPQ1RMX0dFVF9TVEFfSU5GTyAgICAgICAgKFNJT0NJV0ZJUlNUUFJJVisyMSkKKyNkZWZpbmUgUUNTQVBfSU9DVExfU0VUX01BWF9UWF9QT1dFUiAgICAoU0lPQ0lXRklSU1RQUklWKzIyKQorI2RlZmluZSBRQ1NBUF9JT0NUTF9HRVRfSU5JX0NGRyAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYrMjUpCisjZGVmaW5lIFFDU0FQX0lPQ1RMX1NFVF9JTklfQ0ZHICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJVisyNikKKyNkZWZpbmUgUUNTQVBfSU9DVExfU0VUX1RXT19JTlRfR0VUX05PTkUgKFNJT0NJV0ZJUlNUUFJJViArIDI4KQorI2lmZGVmIERFQlVHCisjZGVmaW5lIFFDU0FQX0lPQ1RMX1NFVF9GV19DUkFTSF9JTkpFQ1QgMQorI2VuZGlmCisjZGVmaW5lIFFDU0FQX0lPQ1RMX0RVTVBfRFBfVFJBQ0VfTEVWRUwgMgorCisjZGVmaW5lIE1BWF9WQVJfQVJHUyAgICAgICAgIDcKKyNkZWZpbmUgUUNTQVBfSU9DVExfUFJJVl9HRVRfU09GVEFQX0xJTktfU1BFRUQgKFNJT0NJV0ZJUlNUUFJJViArIDMxKQorCisjZGVmaW5lIFFDU0FQX0lPQ1RMX01BWF9TVFJfTEVOIDEwMjQKKworI2RlZmluZSBSQ18yX1JBVEVfSURYKF9yYykgICAgICAgICAgICAgICgoX3JjKSAmIDB4NykKKyNkZWZpbmUgSFRfUkNfMl9TVFJFQU1TKF9yYykgICAgICAgICAgICAoKCgoX3JjKSAmIDB4NzgpID4+IDMpICsgMSkKKworI2RlZmluZSBSQ18yX1JBVEVfSURYXzExQUMoX3JjKSAgICAgICAgICgoX3JjKSAmIDB4ZikKKyNkZWZpbmUgSFRfUkNfMl9TVFJFQU1TXzExQUMoX3JjKSAgICAgICAoKCgoX3JjKSAmIDB4MzApID4+IDQpICsgMSkKKworZW51bSB7CisJUUNTQVBfUEFSQU1fTUFYX0FTU09DID0gMSwKKwlRQ1NBUF9QQVJBTV9HRVRfV0xBTl9EQkcsCisJUUNTQVBfUEFSQU1fQ0xSX0FDTCA9IDQsCisJUUNTQVBfUEFSQU1fQUNMX01PREUsCisJUUNTQVBfUEFSQU1fSElERV9TU0lELAorCVFDU0FQX1BBUkFNX0FVVE9fQ0hBTk5FTCwKKwlRQ1NBUF9QQVJBTV9TRVRfTUNfUkFURSwKKwlRQ1NBUF9QQVJBTV9TRVRfVFhSWF9GV19TVEFUUywKKwlRQ1NBUF9QQVJBTV9TRVRfTUNDX0NIQU5ORUxfTEFURU5DWSwKKwlRQ1NBUF9QQVJBTV9TRVRfTUNDX0NIQU5ORUxfUVVPVEEsCisJUUNTQVBfREJHTE9HX0xPR19MRVZFTCwKKwlRQ1NBUF9EQkdMT0dfVkFQX0VOQUJMRSwKKwlRQ1NBUF9EQkdMT0dfVkFQX0RJU0FCTEUsCisJUUNTQVBfREJHTE9HX01PRFVMRV9FTkFCTEUsCisJUUNTQVBfREJHTE9HX01PRFVMRV9ESVNBQkxFLAorCVFDU0FQX0RCR0xPR19NT0RfTE9HX0xFVkVMLAorCVFDU0FQX0RCR0xPR19UWVBFLAorCVFDU0FQX0RCR0xPR19SRVBPUlRfRU5BQkxFLAorCVFDQVNBUF9UWFJYX0ZXU1RBVFNfUkVTRVQsCisJUUNTQVBfUEFSQU1fUlRTQ1RTLAorCVFDQVNBUF9TRVRfMTFOX1JBVEUsCisJUUNBU0FQX1NFVF9WSFRfUkFURSwKKwlRQ0FTQVBfU0hPUlRfR0ksCisJUUNTQVBfU0VUX0FNUERVLAorCVFDU0FQX1NFVF9BTVNEVSwKKwlRQ1NBUF9HVFhfSFRfTUNTLAorCVFDU0FQX0dUWF9WSFRfTUNTLAorCVFDU0FQX0dUWF9VU1JDRkcsCisJUUNTQVBfR1RYX1RIUkUsCisJUUNTQVBfR1RYX01BUkdJTiwKKwlRQ1NBUF9HVFhfU1RFUCwKKwlRQ1NBUF9HVFhfTUlOVFBDLAorCVFDU0FQX0dUWF9CV01BU0ssCisjaWZkZWYgUUNBX1BLVF9QUk9UT19UUkFDRQorCVFDQVNBUF9TRVRfREVCVUdfTE9HLAorI2VuZGlmCisJUUNBU0FQX1NFVF9UTV9MRVZFTCwKKwlRQ0FTQVBfU0VUX0RGU19JR05PUkVfQ0FDLAorCVFDQVNBUF9HRVRfREZTX05PTCwKKwlRQ0FTQVBfU0VUX0RGU19OT0wsCisJUUNTQVBfUEFSQU1fU0VUX0NIQU5ORUxfQ0hBTkdFLAorCVFDQVNBUF9TRVRfREZTX1RBUkdFVF9DSE5MLAorCVFDQVNBUF9TRVRfUkFEQVJfQ01ELAorCVFDU0FQX0dFVF9BQ0wsCisJUUNBU0FQX1RYX0NIQUlOTUFTS19DTUQsCisJUUNBU0FQX1JYX0NIQUlOTUFTS19DTUQsCisJUUNBU0FQX05TU19DTUQsCisJUUNTQVBfSVBBX1VDX1NUQVQsCisJUUNBU0FQX1NFVF9QSFlNT0RFLAorCVFDQVNBUF9HRVRfVEVNUF9DTUQsCisJUUNBU0FQX0RVTVBfU1RBVFMsCisJUUNBU0FQX0NMRUFSX1NUQVRTLAorCVFDQVNBUF9TRVRfUkFEQVJfREJHLAorfTsKKworaW50IGl3X3NvZnRhcF9nZXRfY2hhbm5lbF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKworI2VuZGlmIC8qX1FDX1NBUF9JT0NUTF9IXyovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfYXNzb2MuaCBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9hc3NvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTM2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfYXNzb2MuaApAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKFdMQU5fSEREX0FTU09DX0hfXykKKyNkZWZpbmUgV0xBTl9IRERfQVNTT0NfSF9fCisKKy8qKgorICogRE9DOiB3bGFuX2hkZF9hc3NvYy5oCisgKgorICovCisKKy8qIEluY2x1ZGUgZmlsZXMgKi8KKyNpbmNsdWRlIDx3bGFuX2hkZF9taWIuaD4KKyNpbmNsdWRlIDxzbWVfYXBpLmg+CisjaW5jbHVkZSA8d2xhbl9kZWZzLmg+CisjaW5jbHVkZSAib2xfdHhyeF9jdHJsX2FwaS5oIgorCisvKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cyAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisjZGVmaW5lIEhERF9NQVhfTlVNX1RETFNfU1RBICAgICAgICAgIDgKKyNkZWZpbmUgSEREX01BWF9OVU1fVERMU19TVEFfUF9VQVBTRF9PRkZDSEFOICAxCisjZGVmaW5lIFRETFNfU1RBX0lOREVYX1ZBTElEKHN0YUlkKSBcCisJKCgoc3RhSWQpID49IDEpICYmICgoc3RhSWQpIDwgMHhGRikpCisjZW5kaWYKKyNkZWZpbmUgVEtJUF9DT1VOVEVSX01FQVNVUkVfU1RBUlRFRCAxCisjZGVmaW5lIFRLSVBfQ09VTlRFUl9NRUFTVVJFX1NUT1BFRCAgMAorLyogVGltZW91dCAoaW4gbXMpIGZvciBMaW5rIHRvIFVwIGJlZm9yZSBSZWdpc3RlcmluZyBTdGF0aW9uICovCisjZGVmaW5lIEFTU09DX0xJTktVUF9USU1FT1VUIDYwCisKKy8qIEluIHByb250byBjYXNlLCBJQlNTIG93bnMgdGhlIGZpcnN0IHBlZXIgZm9yIGJzcyBwZWVyLgorICAgSW4gUm9tZSBjYXNlLCBJQlNTIHVzZXMgdGhlIDJuZCBwZWVyIGFzIGJzcyBwZWVyICovCisjZGVmaW5lIElCU1NfQlJPQURDQVNUX1NUQUlEIDEKKworLyogVHlwZSBEZWNsYXJhdGlvbnMgKi8KKy8qKgorICogdHlwZWRlZiBlQ29ubmVjdGlvblN0YXRlIC0gQ29ubmVjdGlvbiBzdGF0ZXMKKyAqIEBlQ29ubmVjdGlvblN0YXRlX05vdENvbm5lY3RlZDogTm90IGFzc29jaWF0ZWQgaW4gSW5mcmEgb3IgcGFydGljaXBhdGluZworICoJCQlpbiBhbiBJQlNTIC8gQWQtaG9jIG5ldHdvcmsKKyAqIEBlQ29ubmVjdGlvblN0YXRlX0Nvbm5lY3Rpbmc6IFdoaWxlIGNvbm5lY3Rpb24gaW4gcHJvZ3Jlc3MKKyAqIEBlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQ6IEFzc29jaWF0ZWQgaW4gYW4gSW5mcmFzdHJ1Y3R1cmUgbmV0d29yaworICogQGVDb25uZWN0aW9uU3RhdGVfSWJzc0Rpc2Nvbm5lY3RlZDogUGFydGljaXBhdGluZyBpbiBhbiBJQlNTIG5ldHdvcmsgdGhvdWdoCisgKgkJCWRpc2Nvbm5lY3RlZCAobm8gcGFydG5lciBzdGF0aW9ucyBpbiB0aGUgSUJTUykKKyAqIEBlQ29ubmVjdGlvblN0YXRlX0lic3NDb25uZWN0ZWQ6IFBhcnRpY2lwYXRpbmcgaW4gYW4gSUJTUyBuZXR3b3JrIHdpdGgKKyAqCQkJcGFydG5lciBzdGF0aW9ucyBhbHNvIHByZXNlbnQKKyAqIGVDb25uZWN0aW9uU3RhdGVfRGlzY29ubmVjdGluZzogRGlzY29ubmVjdGluZyBpbiBhbiBJbmZyYXN0cnVjdHVyZSBuZXR3b3JrCisgKi8KK3R5cGVkZWYgZW51bSB7CisJZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQsCisJZUNvbm5lY3Rpb25TdGF0ZV9Db25uZWN0aW5nLAorCWVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCwKKwllQ29ubmVjdGlvblN0YXRlX0lic3NEaXNjb25uZWN0ZWQsCisJZUNvbm5lY3Rpb25TdGF0ZV9JYnNzQ29ubmVjdGVkLAorCWVDb25uZWN0aW9uU3RhdGVfRGlzY29ubmVjdGluZworfSBlQ29ubmVjdGlvblN0YXRlOworCisvKioKKyAqIHR5cGVkZWYgZVBlZXJTdGF0dXMgLSBQZWVyIHN0YXR1cworICogQGVQZWVyQ29ubmVjdGVkOiBwZWVyIGNvbm5lY3RlZAorICogQGVQZWVyRGlzY29ubmVjdGVkOiBwZWVyIGRpc2Nvbm5lY3RlZAorICovCit0eXBlZGVmIGVudW0geworCWVQZWVyQ29ubmVjdGVkID0gMSwKKwllUGVlckRpc2Nvbm5lY3RlZAorfSBlUGVlclN0YXR1czsKKworLyoqCisgKiB0eXBlZGVmIGNvbm5lY3Rpb25faW5mb190IC0gc3RydWN0dXJlIHRvIHN0b3JlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24KKyAqIEBjb25uU3RhdGU6IGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIE5JQworICogQGNvbm5Eb3QxMURlc2lyZWRCc3NUeXBlOiBCU1MgdHlwZSBvZiB0aGUgY3VycmVudCBjb25uZWN0aW9uLgorICoJCUNvbWVzIGZyb20gdGhlIE1JQiBhdCB0aGUgdGltZSB0aGUgY29ubmVjdCByZXF1ZXN0IGlzIGlzc3VlZAorICoJCWluIGNvbWJpbmF0aW9uIHdpdGggdGhlIEJzc0Rlc2NyaXB0aW9uIGZyb20gdGhlCisgKgkJYXNzb2NpYXRlZCBlbnRpdHkKKyAqIEBic3NJZDogQlNTSUQKKyAqIEBTU0lEOiBTU0lEIEluZm8KKyAqIEBzdGFJZDogU3RhdGlvbiBJRAorICogQHBlZXJNYWNBZGRyZXNzOlBlZXIgTWFjIEFkZHJlc3Mgb2YgdGhlIElCU1MgU3RhdGlvbnMKKyAqIEBhdXRoVHlwZTogQXV0aCBUeXBlCisgKiBAdWNFbmNyeXB0aW9uVHlwZTogVW5pY2FzdCBFbmNyeXB0aW9uIFR5cGUKKyAqIEBtY0VuY3J5cHRpb25UeXBlOiBNdWx0aWNhc3QgRW5jcnlwdGlvbiBUeXBlCisgKiBAS2V5czogS2V5cworICogQG9wZXJhdGlvbkNoYW5uZWw6IE9wZXJhdGlvbiBDaGFubmVsCisgKiBAdUlzQXV0aGVudGljYXRlZDogUmVtZW1iZXJzIGF1dGhlbnRpY2F0ZWQgc3RhdGUKKyAqIEBkb3QxMU1vZGU6IGRvdDExTW9kZQorICogQHByb3h5QVJQU2VydmljZTogcHJveHkgYXJwIHNlcnZpY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgY29ubmVjdGlvbl9pbmZvX3MgeworCWVDb25uZWN0aW9uU3RhdGUgY29ublN0YXRlOworCWVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZSBjb25uRG90MTFEZXNpcmVkQnNzVHlwZTsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkOworCXRDc3JTU0lESW5mbyBTU0lEOworCXVpbnQ4X3Qgc3RhSWRbTUFYX0lCU1NfUEVFUlNdOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgcGVlck1hY0FkZHJlc3NbTUFYX0lCU1NfUEVFUlNdOworCWVDc3JBdXRoVHlwZSBhdXRoVHlwZTsKKwllQ3NyRW5jcnlwdGlvblR5cGUgdWNFbmNyeXB0aW9uVHlwZTsKKwllQ3NyRW5jcnlwdGlvblR5cGUgbWNFbmNyeXB0aW9uVHlwZTsKKwl0Q3NyS2V5cyBLZXlzOworCXVpbnQ4X3Qgb3BlcmF0aW9uQ2hhbm5lbDsKKwl1aW50OF90IHVJc0F1dGhlbnRpY2F0ZWQ7CisJdWludDMyX3QgZG90MTFNb2RlOworCXVpbnQ4X3QgcHJveHlBUlBTZXJ2aWNlOworfSBjb25uZWN0aW9uX2luZm9fdDsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IGhkZF9hZGFwdGVyX3MgaGRkX2FkYXB0ZXJfdDsKK3R5cGVkZWYgc3RydWN0IGhkZF9jb250ZXh0X3MgaGRkX2NvbnRleHRfdDsKK3R5cGVkZWYgc3RydWN0IGhkZF9zdGF0aW9uX2N0eCBoZGRfc3RhdGlvbl9jdHhfdDsKK3R5cGVkZWYgc3RydWN0IGhkZF9hcF9jdHhfcyBoZGRfYXBfY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCBoZGRfbW9uX2N0eF9zIGhkZF9tb25fY3R4X3Q7CisKKy8qKgorICogaGRkX2lzX2Nvbm5lY3RpbmcoKSAtIEZ1bmN0aW9uIHRvIGNoZWNrIGNvbm5lY3Rpb24gcHJvZ3Jlc3MKKyAqIEBoZGRfc3RhX2N0eDogICAgcG9pbnRlciB0byBnbG9iYWwgSEREIFN0YXRpb24gY29udGV4dAorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBjb25uZWN0aW5nLCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCBoZGRfaXNfY29ubmVjdGluZyhoZGRfc3RhdGlvbl9jdHhfdCAqaGRkX3N0YV9jdHgpOworCisvKioKKyAqIGhkZF9jb25uX2lzX2Nvbm5lY3RlZCgpIC0gRnVuY3Rpb24gdG8gY2hlY2sgY29ubmVjdGlvbiBzdGF0dXMKKyAqIEBwSGRkU3RhQ3R4OiAgICBwb2ludGVyIHRvIGdsb2JhbCBIREQgU3RhdGlvbiBjb250ZXh0CisgKgorICogUmV0dXJuOiBmYWxzZSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCB0cnVlIG90aGVyd2lzZQorICovCitib29sIGhkZF9jb25uX2lzX2Nvbm5lY3RlZChoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCk7CisKKy8qKgorICogaGRkX2Nvbm5fZ2V0X2Nvbm5lY3RlZF9iYW5kKCkgLSBnZXQgY3VycmVudCBjb25uZWN0aW9uIHJhZGlvIGJhbmQKKyAqIEBwSGRkU3RhQ3R4OiAgICBwb2ludGVyIHRvIGdsb2JhbCBIREQgU3RhdGlvbiBjb250ZXh0CisgKgorICogUmV0dXJuOiBlQ1NSX0JBTkRfMjQgb3IgZUNTUl9CQU5EXzVHIGJhc2VkIG9uIGN1cnJlbnQgQVAgY29ubmVjdGlvbgorICogICAgICBlQ1NSX0JBTkRfQUxMIGlmIG5vdCBjb25uZWN0ZWQKKyAqLworZUNzckJhbmQgaGRkX2Nvbm5fZ2V0X2Nvbm5lY3RlZF9iYW5kKGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4KTsKKworLyoqCisgKiBoZGRfc21lX3JvYW1fY2FsbGJhY2soKSAtIGhkZCBzbWUgcm9hbSBjYWxsYmFjaworICogQHBDb250ZXh0OiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICogQHBSb2FtSW5mbzogcG9pbnRlciB0byByb2FtIGluZm8KKyAqIEByb2FtSWQ6IHJvYW0gaWQKKyAqIEByb2FtU3RhdHVzOiByb2FtIHN0YXR1cworICogQHJvYW1SZXN1bHQ6IHJvYW0gcmVzdWx0CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgaGRkX3NtZV9yb2FtX2NhbGxiYWNrKHZvaWQgKnBDb250ZXh0LCB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywKKwkJCQkgdWludDMyX3Qgcm9hbUlkLAorCQkJCSBlUm9hbUNtZFN0YXR1cyByb2FtU3RhdHVzLAorCQkJCSBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0KTsKKworLyoqCisgKiBoZGRfY29ubl9nZXRfY29ubmVjdGVkX2Jzc190eXBlKCkgLSBnZXQgY3VycmVudCBic3MgdHlwZQorICogQHBIZGRTdGFDdHg6ICAgICAgICAgcG9pbnRlciB0byBnbG9iYWwgSEREIFN0YXRpb24gY29udGV4dAorICogQHBDb25uZWN0ZWRCc3NUeXBlOiAgcG9pbnRlciB0byBjb25uZWN0ZWQgYnNzIHR5cGUKKyAqCisgKiBSZXR1cm46IGZhbHNlIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQsIHRydWUgb3RoZXJ3aXNlCisgKi8KK2Jvb2wKK2hkZF9jb25uX2dldF9jb25uZWN0ZWRfYnNzX3R5cGUoaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHgsCisJCQkJZU1pYl9kb3QxMURlc2lyZWRCc3NUeXBlICpwQ29ubmVjdGVkQnNzVHlwZSk7CisKKy8qKgorICogaGRkX3NldF9nZW5pZV90b19jc3IoKSAtIHNldCBnZW5pZSB0byBjc3IKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAUlNOQXV0aFR5cGU6IHBvaW50ZXIgdG8gYXV0aCB0eXBlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworaW50IGhkZF9zZXRfZ2VuaWVfdG9fY3NyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBlQ3NyQXV0aFR5cGUgKlJTTkF1dGhUeXBlKTsKKworLyoqCisgKiBoZGRfc2V0X2Nzcl9hdXRoX3R5cGUoKSAtIHNldCBjc3IgYXV0aCB0eXBlCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlcgorICogQFJTTkF1dGhUeXBlOiBhdXRoIHR5cGUKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitpbnQgaGRkX3NldF9jc3JfYXV0aF90eXBlKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBlQ3NyQXV0aFR5cGUgUlNOQXV0aFR5cGUpOworCisvKioKKyAqIGhkZF9yb2FtX3JlZ2lzdGVyX3RkbHNzdGEoKSAtIHJlZ2lzdGVyIG5ldyBURExTIHN0YXRpb24KKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAcGVlck1hYzogcG9pbnRlciB0byBwZWVyIE1BQyBhZGRyZXNzCisgKiBAc3RhSWQ6IHN0YXRpb24gaWRlbnRpZmllcgorICogQHVjYXN0U2lnOiB1bmljYXN0IHNpZ25hdHVyZQorICoKKyAqIENvbnN0cnVjdCB0aGUgc3RhRGVzYyBhbmQgcmVnaXN0ZXIgd2l0aCBUTCB0aGUgbmV3IFNUQS4KKyAqIFRoaXMgaXMgY2FsbGVkIGFzIHBhcnQgb2YgQUREX1NUQSBpbiB0aGUgVERMUyBzZXR1cC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyBoZGRfcm9hbV9yZWdpc3Rlcl90ZGxzc3RhKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgICAgY29uc3QgdWludDhfdCAqcGVlck1hYywgdWludDE2X3Qgc3RhSWQsCisJCQkJICAgICB1aW50OF90IHVjYXN0U2lnKTsKKworLyoqCisgKiBoZGRfcGVyZm9ybV9yb2FtX3NldF9rZXlfY29tcGxldGUoKSAtIHBlcmZvcm0gc2V0IGtleSBjb21wbGV0ZQorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfcGVyZm9ybV9yb2FtX3NldF9rZXlfY29tcGxldGUoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorLyoqCisgKiBoZGRfaW5kaWNhdGVfZXNlX2Jjbl9yZXBvcnRfbm9fcmVzdWx0cygpIC0gYmVhY29uIHJlcG9ydCBubyBzY2FuIHJlc3VsdHMKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAbWVhc3VyZW1lbnRUb2tlbjogbWVhc3VyZW1lbnQgdG9rZW4KKyAqIEBmbGFnOiBmbGFnCisgKiBAbnVtQnNzOiBudW1iZXIgb2YgYnNzCisgKgorICogSWYgdGhlIG1lYXN1cmVtZW50IGlzIG5vbmUgYW5kIG5vIHNjYW4gcmVzdWx0cyBmb3VuZCwKKyAqIGluZGljYXRlIHRoZSBzdXBwbGljYW50IGFib3V0IG1lYXN1cmVtZW50IGRvbmUuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQKK2hkZF9pbmRpY2F0ZV9lc2VfYmNuX3JlcG9ydF9ub19yZXN1bHRzKGNvbnN0IGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkgICAgY29uc3QgdWludDE2X3QgbWVhc3VyZW1lbnRUb2tlbiwKKwkJCQkJICAgIGNvbnN0IGJvb2wgZmxhZywKKwkJCQkJICAgIGNvbnN0IHVpbnQ4X3QgbnVtQnNzKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisKK0NERl9TVEFUVVMgaGRkX2NoYW5nZV9wZWVyX3N0YXRlKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSB1aW50OF90IHN0YV9pZCwKKwkJCQkgZW51bSBvbF90eHJ4X3BlZXJfc3RhdGUgc3RhX3N0YXRlLAorCQkJCSBib29sIHJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfY2ZnLmggYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4MDk1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9jZmcuaApAQCAtMCwwICsxLDMzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChIRERfQ09ORklHX0hfXykKKyNkZWZpbmUgSEREX0NPTkZJR19IX18KKworLyoqCisgKgorICogRE9DOiB3bGFuX2hkZF9jb25maWcuaAorICoKKyAqIFdMQU4gQWRhcHRlciBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICovCisKKy8qICRIRUFERVIkICovCisKKy8qIEluY2x1ZGUgZmlsZXMgKi8KKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dtbS5oPgorI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGNzcl9hcGkuaD4KKyNpbmNsdWRlIDxzYXBfYXBpLmg+CisjaW5jbHVkZSA8d21pX3VuaWZpZWQuaD4KKworI2RlZmluZSBGV19NT0RVTEVfTE9HX0xFVkVMX1NUUklOR19MRU5HVEggICgyNTUpCisKKyNpZmRlZiBESENQX1NFUlZFUl9PRkZMT0FECisjZGVmaW5lIElQQUREUl9OVU1fRU5UUklFUyAgICAgKDQpCisjZGVmaW5lIElQQUREUl9TVFJJTkdfTEVOR1RIICAgKDE2KQorI2VuZGlmCisKKy8qIE51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBjb25maWd1cmVkICovCisjZGVmaW5lIE1BWF9DRkdfSU5JX0lURU1TICAgNTEyCisKKy8qIERlZmluZXMgZm9yIGFsbCBvZiB0aGUgdGhpbmdzIHdlIHJlYWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiAocmVnaXN0cnkpLiAqLworCisjZGVmaW5lIENGR19SVFNfVEhSRVNIT0xEX05BTUUgICAgICAgICAgICAgICAgICJSVFNUaHJlc2hvbGQiCisjZGVmaW5lIENGR19SVFNfVEhSRVNIT0xEX01JTiAgICAgICAgICAgICAgICAgIFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFNSU4gICAgIC8qIG1pbiBpcyAwLCBtZWFuaW5nIGFsd2F5cyB1c2UgUlRTLiAqLworI2RlZmluZSBDRkdfUlRTX1RIUkVTSE9MRF9NQVggICAgICAgICAgICAgICAgICBXTklfQ0ZHX1JUU19USFJFU0hPTERfU1RBTUFYICAgICAvKiBtYXggaXMgdGhlIG1heCBmcmFtZSBzaXplICovCisjZGVmaW5lIENGR19SVFNfVEhSRVNIT0xEX0RFRkFVTFQgICAgICAgICAgICAgIFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFERUYKKworI2RlZmluZSBDRkdfRlJBR19USFJFU0hPTERfTkFNRSAgICAgICAgICAgICAgICAiZ0ZyYWdtZW50YXRpb25UaHJlc2hvbGQiCisjZGVmaW5lIENGR19GUkFHX1RIUkVTSE9MRF9NSU4gICAgICAgICAgICAgICAgIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBTUlOCisjZGVmaW5lIENGR19GUkFHX1RIUkVTSE9MRF9NQVggICAgICAgICAgICAgICAgIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBTUFYCisjZGVmaW5lIENGR19GUkFHX1RIUkVTSE9MRF9ERUZBVUxUICAgICAgICAgICAgIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBREVGCisKKyNkZWZpbmUgQ0ZHX09QRVJBVElOR19DSEFOTkVMX05BTUUgICAgICAgICAgICAgImdPcGVyYXRpbmdDaGFubmVsIgorI2RlZmluZSBDRkdfT1BFUkFUSU5HX0NIQU5ORUxfTUlOICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX09QRVJBVElOR19DSEFOTkVMX01BWCAgICAgICAgICAgICAgKDE0KQorI2RlZmluZSBDRkdfT1BFUkFUSU5HX0NIQU5ORUxfREVGQVVMVCAgICAgICAgICAoMSkKKworI2RlZmluZSBDRkdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfTkFNRSAgICAgICAiZ1Nob3J0U2xvdFRpbWVFbmFibGVkIgorI2RlZmluZSBDRkdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfTUlOICAgICAgICBXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRV9TVEFNSU4KKyNkZWZpbmUgQ0ZHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVEX01BWCAgICAgICAgV05JX0NGR19TSE9SVF9TTE9UX1RJTUVfU1RBTUFYCisjZGVmaW5lIENGR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9ERUZBVUxUICAgIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX1NUQURFRgorCisjZGVmaW5lIENGR18xMURfU1VQUE9SVF9FTkFCTEVEX05BTUUgICAgICAgICAgICJnMTFkU3VwcG9ydEVuYWJsZWQiCisjZGVmaW5lIENGR18xMURfU1VQUE9SVF9FTkFCTEVEX01JTiAgICAgICAgICAgIFdOSV9DRkdfMTFEX0VOQUJMRURfU1RBTUlOCisjZGVmaW5lIENGR18xMURfU1VQUE9SVF9FTkFCTEVEX01BWCAgICAgICAgICAgIFdOSV9DRkdfMTFEX0VOQUJMRURfU1RBTUFYCisjZGVmaW5lIENGR18xMURfU1VQUE9SVF9FTkFCTEVEX0RFRkFVTFQgICAgICAgIFdOSV9DRkdfMTFEX0VOQUJMRURfU1RBREVGICAgICAgIC8qIERlZmF1bHQgaXMgT04gKi8KKworI2RlZmluZSBDRkdfMTFIX1NVUFBPUlRfRU5BQkxFRF9OQU1FICAgICAgICAgICAiZzExaFN1cHBvcnRFbmFibGVkIgorI2RlZmluZSBDRkdfMTFIX1NVUFBPUlRfRU5BQkxFRF9NSU4gICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHXzExSF9TVVBQT1JUX0VOQUJMRURfTUFYICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR18xMUhfU1VQUE9SVF9FTkFCTEVEX0RFRkFVTFQgICAgICAgICgxKSAgICAvKiBEZWZhdWx0IGlzIE9OICovCisKKy8qIENPVU5UUlkgQ29kZSBQcmlvcml0eSAqLworI2RlZmluZSBDRkdfQ09VTlRSWV9DT0RFX1BSSU9SSVRZX05BTUUgICAgICAgICAiZ0NvdW50cnlDb2RlUHJpb3JpdHkiCisjZGVmaW5lIENGR19DT1VOVFJZX0NPREVfUFJJT1JJVFlfTUlOICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfQ09VTlRSWV9DT0RFX1BSSU9SSVRZX01BWCAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0NPVU5UUllfQ09ERV9QUklPUklUWV9ERUZBVUxUICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0hFQVJUQkVBVF9USFJFU0hfMjRfTkFNRSAgICAgICAgICAgImdIZWFydGJlYXQyNCIKKyNkZWZpbmUgQ0ZHX0hFQVJUQkVBVF9USFJFU0hfMjRfTUlOICAgICAgICAgICAgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRF9TVEFNSU4KKyNkZWZpbmUgQ0ZHX0hFQVJUQkVBVF9USFJFU0hfMjRfTUFYICAgICAgICAgICAgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRF9TVEFNQVgKKyNkZWZpbmUgQ0ZHX0hFQVJUQkVBVF9USFJFU0hfMjRfREVGQVVMVCAgICAgICAgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRF9TVEFERUYKKworI2RlZmluZSBDRkdfUE9XRVJfVVNBR0VfTkFNRSAgICAgICAgICAgICAgICAgICAiZ1Bvd2VyVXNhZ2UiCisjZGVmaW5lIENGR19QT1dFUl9VU0FHRV9NSU4gICAgICAgICAgICAgICAgICAgICJNaW4iICAgIC8qIE1pbmltdW0gUG93ZXIgU2F2ZSAqLworI2RlZmluZSBDRkdfUE9XRVJfVVNBR0VfTUFYICAgICAgICAgICAgICAgICAgICAiTWF4IiAgICAvKiBNYXhpbXVtIFBvd2VyIFNhdmUgKi8KKyNkZWZpbmUgQ0ZHX1BPV0VSX1VTQUdFX0RFRkFVTFQgICAgICAgICAgICAgICAgIk1vZCIgICAgLyogTW9kZXJhdGUgUG93ZXIgU2F2ZSAqLworCisjZGVmaW5lIENGR19XT1dMX1BBVFRFUk5fTkFNRSAgICAgICAgICAgICAgICAgICJnV293bFBhdHRlcm4iCisjZGVmaW5lIENGR19XT1dMX1BBVFRFUk5fREVGQVVMVCAgICAgICAgICAgICAgICIiCisKKy8qIElNUFMgPSBJZGxlTW9kZVBvd2VyU2F2ZSAqLworI2RlZmluZSBDRkdfRU5BQkxFX0lNUFNfTkFNRSAgICAgICAgICAgICAgICAgICAiZ0VuYWJsZUltcHMiCisjZGVmaW5lIENGR19FTkFCTEVfSU1QU19NSU4gICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0lNUFNfTUFYICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9JTVBTX0RFRkFVTFQgICAgICAgICAgICAgICAgKDEpCisKKy8qIFBTID0gUG93ZXJTYXZlICovCisjZGVmaW5lIENGR19FTkFCTEVfUFNfTkFNRSAgICAgICAgICAgICAgICAgICAgICJnRW5hYmxlQm1wcyIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9QU19NSU4gICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfUFNfTUFYICAgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX1BTX0RFRkFVTFQgICAgICAgICAgICAgICAgICAoMSkKKworI2RlZmluZSBDRkdfQk1QU19NSU5JTVVNX0xJX05BTUUgICAgICAgICAgICAgICAiZ0JtcHNNaW5MaXN0ZW5JbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX0JNUFNfTUlOSU1VTV9MSV9NSU4gICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19CTVBTX01JTklNVU1fTElfTUFYICAgICAgICAgICAgICAgICg2NTUzNSkKKyNkZWZpbmUgQ0ZHX0JNUFNfTUlOSU1VTV9MSV9ERUZBVUxUICAgICAgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX0JNUFNfTU9ERVJBVEVfTElfTkFNRSAgICAgICAgICAgICAgImdCbXBzTW9kTGlzdGVuSW50ZXJ2YWwiCisjZGVmaW5lIENGR19CTVBTX01PREVSQVRFX0xJX01JTiAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfQk1QU19NT0RFUkFURV9MSV9NQVggICAgICAgICAgICAgICAoNjU1MzUpCisjZGVmaW5lIENGR19CTVBTX01PREVSQVRFX0xJX0RFRkFVTFQgICAgICAgICAgICgxKQorCisjZGVmaW5lIENGR19CTVBTX01BWElNVU1fTElfTkFNRSAgICAgICAgICAgICAgICJnQm1wc01heExpc3RlbkludGVydmFsIgorI2RlZmluZSBDRkdfQk1QU19NQVhJTVVNX0xJX01JTiAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0JNUFNfTUFYSU1VTV9MSV9NQVggICAgICAgICAgICAgICAgKDY1NTM1KQorI2RlZmluZSBDRkdfQk1QU19NQVhJTVVNX0xJX0RFRkFVTFQgICAgICAgICAgICAoMSkKKworI2RlZmluZSBDRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9OQU1FICAgICAgICAgICAiZ01heFJ4QW1wZHVGYWN0b3IiCisjZGVmaW5lIENGR19NQVhfUlhfQU1QRFVfRkFDVE9SX01JTiAgICAgICAgICAgIFdOSV9DRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9TVEFNSU4KKyNkZWZpbmUgQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfTUFYICAgICAgICAgICAgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SX1NUQU1BWAorI2RlZmluZSBDRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9ERUZBVUxUICAgICAgICBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfU1RBREVGCisKKy8qIENvbmZpZ3VyYXRpb24gYWRkZWQgdG8gZW5hYmxlL2Rpc2FibGUgQ1RTMlNFTEYgaW4gKi8KKy8qIEFkYXB0aXZlIFJYIGRyYWluIGZlYXR1cmUgKi8KKyNkZWZpbmUgQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTl9OQU1FICAgICAiZ0VuYWJsZUFkYXB0UnhEcmFpbiIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTl9NSU4gICAgICAgV05JX0NGR19FTkFCTEVfQURBUFRfUlhfRFJBSU5fU1RBTUlOCisjZGVmaW5lIENGR19FTkFCTEVfQURBUFRfUlhfRFJBSU5fTUFYICAgICAgIFdOSV9DRkdfRU5BQkxFX0FEQVBUX1JYX0RSQUlOX1NUQU1BWAorI2RlZmluZSBDRkdfRU5BQkxFX0FEQVBUX1JYX0RSQUlOX0RFRkFVTFQgICBXTklfQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTl9TVEFERUYKKworI2RlZmluZSBDRkdfUkVHX0NIQU5HRV9ERUZfQ09VTlRSWV9OQU1FICAgICAgICAgICJnUmVndWxhdG9yeUNoYW5nZUNvdW50cnkiCisjZGVmaW5lIENGR19SRUdfQ0hBTkdFX0RFRl9DT1VOVFJZX0RFRkFVTFQgICAgICAgKDApCisjZGVmaW5lIENGR19SRUdfQ0hBTkdFX0RFRl9DT1VOVFJZX01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19SRUdfQ0hBTkdFX0RFRl9DT1VOVFJZX01BWCAgICAgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX0FEVkVSVElTRV9DT05DVVJSRU5UX09QRVJBVElPTl9OQU1FICAgICJnQWR2ZXJ0aXNlQ29uY3VycmVudE9wZXJhdGlvbiIKKyNkZWZpbmUgQ0ZHX0FEVkVSVElTRV9DT05DVVJSRU5UX09QRVJBVElPTl9ERUZBVUxUICgxKQorI2RlZmluZSBDRkdfQURWRVJUSVNFX0NPTkNVUlJFTlRfT1BFUkFUSU9OX01JTiAgICAgKDApCisjZGVmaW5lIENGR19BRFZFUlRJU0VfQ09OQ1VSUkVOVF9PUEVSQVRJT05fTUFYICAgICAoMSkKKwordHlwZWRlZiBlbnVtIHsKKwllSEREX0RPVDExX01PREVfQVVUTyA9IDAsICAgICAgIC8qIGNvdmVycyBhbGwgdGhpbmdzIHdlIHN1cHBvcnQgKi8KKwllSEREX0RPVDExX01PREVfYWJnLCAgICAvKiAxMWEvYi9nIG9ubHksIG5vIEhULCBubyBwcm9wcmlldGFyeSAqLworCWVIRERfRE9UMTFfTU9ERV8xMWIsCisJZUhERF9ET1QxMV9NT0RFXzExZywKKwllSEREX0RPVDExX01PREVfMTFuLAorCWVIRERfRE9UMTFfTU9ERV8xMWdfT05MWSwKKwllSEREX0RPVDExX01PREVfMTFuX09OTFksCisJZUhERF9ET1QxMV9NT0RFXzExYl9PTkxZLAorCWVIRERfRE9UMTFfTU9ERV8xMWFjX09OTFksCisJZUhERF9ET1QxMV9NT0RFXzExYWMsCisJZUhERF9ET1QxMV9NT0RFXzExYSwKK30gZUhkZERvdDExTW9kZTsKKworI2RlZmluZSBDRkdfRE9UMTFfTU9ERV9OQU1FICAgICAgICAgICAgICAgICAgICAiZ0RvdDExTW9kZSIKKyNkZWZpbmUgQ0ZHX0RPVDExX01PREVfTUlOICAgICAgICAgICAgICAgICAgICAgZUhERF9ET1QxMV9NT0RFX0FVVE8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworI2RlZmluZSBDRkdfRE9UMTFfTU9ERV9ERUZBVUxUICAgICAgICAgICAgICAgICBlSEREX0RPVDExX01PREVfMTFhYworI2Vsc2UKKyNkZWZpbmUgQ0ZHX0RPVDExX01PREVfREVGQVVMVCAgICAgICAgICAgICAgICAgZUhERF9ET1QxMV9NT0RFXzExbgorI2VuZGlmCisjZGVmaW5lIENGR19ET1QxMV9NT0RFX01BWCAgICAgICAgICAgICAgICAgICAgIGVIRERfRE9UMTFfTU9ERV8xMWEKKworI2RlZmluZSBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfMjRHSFpfTkFNRSAgICAiZ0NoYW5uZWxCb25kaW5nTW9kZTI0R0h6IgorI2RlZmluZSBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfTUlOICAgICAgICAgICBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX1NUQU1JTgorI2RlZmluZSBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfTUFYICAgICAgICAgICBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX1NUQU1BWAorI2RlZmluZSBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfREVGQVVMVCAgICAgICBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX1NUQURFRgorCisjZGVmaW5lIENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV81R0haX05BTUUgICAgICJnQ2hhbm5lbEJvbmRpbmdNb2RlNUdIeiIKKyNkZWZpbmUgQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX01JTiAgICAgICAgICAgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9TVEFNSU4KKyNkZWZpbmUgQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX01BWCAgICAgICAgICAgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9TVEFNQVgKKyNkZWZpbmUgQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RFRkFVTFQgICAgICAgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9TVEFERUYKKworI2RlZmluZSBDRkdfRklYRURfUkFURV9OQU1FICAgICAgICAgICAgICAgICAgICAiZ0ZpeGVkUmF0ZSIKKyNkZWZpbmUgQ0ZHX0ZJWEVEX1JBVEVfTUlOICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19GSVhFRF9SQVRFX1NUQU1JTgorI2RlZmluZSBDRkdfRklYRURfUkFURV9NQVggICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0ZJWEVEX1JBVEVfU1RBTUFYCisjZGVmaW5lIENGR19GSVhFRF9SQVRFX0RFRkFVTFQgICAgICAgICAgICAgICAgIFdOSV9DRkdfRklYRURfUkFURV9TVEFERUYKKworI2RlZmluZSBDRkdfU0hPUlRfR0lfMjBNSFpfTkFNRSAgICAgICAgICAgICAgICAiZ1Nob3J0R0kyME1oeiIKKyNkZWZpbmUgQ0ZHX1NIT1JUX0dJXzIwTUhaX01JTiAgICAgICAgICAgICAgICAgV05JX0NGR19TSE9SVF9HSV8yME1IWl9TVEFNSU4KKyNkZWZpbmUgQ0ZHX1NIT1JUX0dJXzIwTUhaX01BWCAgICAgICAgICAgICAgICAgV05JX0NGR19TSE9SVF9HSV8yME1IWl9TVEFNQVgKKyNkZWZpbmUgQ0ZHX1NIT1JUX0dJXzIwTUhaX0RFRkFVTFQgICAgICAgICAgICAgV05JX0NGR19TSE9SVF9HSV8yME1IWl9TVEFERUYKKworI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX0NPVU5UX05BTUUgICAgICAgICAiZ1NjYW5SZXN1bHRBZ2VDb3VudCIKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9DT1VOVF9NSU4gICAgICAgICAgKDEpCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfQ09VTlRfTUFYICAgICAgICAgICgxMDApCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfQ09VTlRfREVGQVVMVCAgICAgICgzKQorCisvKiBBbGwgaW4gc2Vjb25kcyAqLworLyogTm90IENvbm5lY3QsIE5vIFBvd2VyIFNhdmUgKi8KKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DTlBTX05BTUUgICAgImdTY2FuUmVzdWx0QWdlTkNOUFMiCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9OQ05QU19NSU4gICAgICgxMCkKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DTlBTX01BWCAgICAgKDEwMDAwKQorI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNOUFNfREVGQVVMVCAoNTApCisvKiBOb3QgQ29ubmVjdCwgUG93ZXIgU2F2ZSAqLworI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNQU19OQU1FICAgICAiZ1NjYW5SZXN1bHRBZ2VOQ1BTIgorI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNQU19NSU4gICAgICAoMTApCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9OQ1BTX01BWCAgICAgICgxMDAwMCkKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DUFNfREVGQVVMVCAgKDMwMCkKKy8qIENvbm5lY3QsIE5vIFBvd2VyIFNhdmUgKi8KKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NOUFNfTkFNRSAgICAgImdTY2FuUmVzdWx0QWdlQ05QUyIKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NOUFNfTUlOICAgICAgKDEwKQorI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfQ05QU19NQVggICAgICAoMTAwMDApCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DTlBTX0RFRkFVTFQgICgxNTApCisvKiBDb25uZWN0LCBQb3dlciBTYXZlICovCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DUFNfTkFNRSAgICAgICJnU2NhblJlc3VsdEFnZUNQUyIKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NQU19NSU4gICAgICAgKDEwKQorI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfQ1BTX01BWCAgICAgICAoMTAwMDApCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DUFNfREVGQVVMVCAgICg2MDApCisKKyNkZWZpbmUgQ0ZHX1JTU0lfQ0FURUdPUllfR0FQX05BTUUgICAgICAgICAgICAgImdSc3NpQ2F0R2FwIgorI2RlZmluZSBDRkdfUlNTSV9DQVRFR09SWV9HQVBfTUlOICAgICAgICAgICAgICAoNSkKKyNkZWZpbmUgQ0ZHX1JTU0lfQ0FURUdPUllfR0FQX01BWCAgICAgICAgICAgICAgKDEwMCkKKyNkZWZpbmUgQ0ZHX1JTU0lfQ0FURUdPUllfR0FQX0RFRkFVTFQgICAgICAgICAgKDUpCisKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKyNkZWZpbmUgQ0ZHX1JPQU1fUFJFRkVSXzVHSFogICAgICAgICAgICAgICAgICAgImdSb2FtUHJlZmVyNUdIeiIKKyNkZWZpbmUgQ0ZHX1JPQU1fUFJFRkVSXzVHSFpfTUlOICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1JPQU1fUFJFRkVSXzVHSFpfTUFYICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1JPQU1fUFJFRkVSXzVHSFpfREVGQVVMVCAgICAgICAgICAoMSkKKworLyoKKyAgICBUbyBlbmFibGUsIHNldCBnUm9hbUludHJhQmFuZD0xIChSb2FtaW5nIHdpdGhpbiBiYW5kKQorICAgIFRvIGRpc2FibGUsIHNldCBnUm9hbUludHJhQmFuZD0wIChSb2FtaW5nIGFjcm9zcyBiYW5kKQorICovCisjZGVmaW5lIENGR19ST0FNX0lOVFJBX0JBTkQgICAgICAgICAgICAgICAgICAgImdSb2FtSW50cmFCYW5kIgorI2RlZmluZSBDRkdfUk9BTV9JTlRSQV9CQU5EX01JTiAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUk9BTV9JTlRSQV9CQU5EX01BWCAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfUk9BTV9JTlRSQV9CQU5EX0RFRkFVTFQgICAgICAgICAgICgwKQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX1NIT1JUX1BSRUFNQkxFX05BTUUgICAgICAgICAgICAgICAgImdTaG9ydFByZWFtYmxlIgorI2RlZmluZSBDRkdfU0hPUlRfUFJFQU1CTEVfTUlOICAgICAgICAgICAgICAgICBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFX1NUQU1JTgorI2RlZmluZSBDRkdfU0hPUlRfUFJFQU1CTEVfTUFYICAgICAgICAgICAgICAgICBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFX1NUQU1BWAorI2RlZmluZSBDRkdfU0hPUlRfUFJFQU1CTEVfREVGQVVMVCAgICAgICAgICAgICBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFX1NUQURFRgorCisjZGVmaW5lIENGR19JQlNTX0JTU0lEX05BTUUgICAgICAgICAgICAgICAgICAgICJnSWJzc0Jzc2lkIgorI2RlZmluZSBDRkdfSUJTU19CU1NJRF9NSU4gICAgICAgICAgICAgICAgICAgICAiMDAwMDAwMDAwMDAwIgorI2RlZmluZSBDRkdfSUJTU19CU1NJRF9NQVggICAgICAgICAgICAgICAgICAgICAiZmZmZmZmZmZmZmZmIgorI2RlZmluZSBDRkdfSUJTU19CU1NJRF9ERUZBVUxUICAgICAgICAgICAgICAgICAiMDAwQUY1MDQwNTA2IgorCisjZGVmaW5lIENGR19JTlRGMF9NQUNfQUREUl9OQU1FICAgICAgICAgICAgICAgICAgIkludGYwTWFjQWRkcmVzcyIKKyNkZWZpbmUgQ0ZHX0lOVEYwX01BQ19BRERSX01JTiAgICAgICAgICAgICAgICAgICAiMDAwMDAwMDAwMDAwIgorI2RlZmluZSBDRkdfSU5URjBfTUFDX0FERFJfTUFYICAgICAgICAgICAgICAgICAgICJmZmZmZmZmZmZmZmYiCisjZGVmaW5lIENGR19JTlRGMF9NQUNfQUREUl9ERUZBVUxUICAgICAgICAgICAgICAgIjAwMEFGNTg5ODk4MCIKKworI2RlZmluZSBDRkdfSU5URjFfTUFDX0FERFJfTkFNRSAgICAgICAgICAgICAgICAgICJJbnRmMU1hY0FkZHJlc3MiCisjZGVmaW5lIENGR19JTlRGMV9NQUNfQUREUl9NSU4gICAgICAgICAgICAgICAgICAgIjAwMDAwMDAwMDAwMCIKKyNkZWZpbmUgQ0ZHX0lOVEYxX01BQ19BRERSX01BWCAgICAgICAgICAgICAgICAgICAiZmZmZmZmZmZmZmZmIgorI2RlZmluZSBDRkdfSU5URjFfTUFDX0FERFJfREVGQVVMVCAgICAgICAgICAgICAgICIwMDBBRjU4OTg5ODEiCisKKyNkZWZpbmUgQ0ZHX0lOVEYyX01BQ19BRERSX05BTUUgICAgICAgICAgICAgICAgICAiSW50ZjJNYWNBZGRyZXNzIgorI2RlZmluZSBDRkdfSU5URjJfTUFDX0FERFJfTUlOICAgICAgICAgICAgICAgICAgICIwMDAwMDAwMDAwMDAiCisjZGVmaW5lIENGR19JTlRGMl9NQUNfQUREUl9NQVggICAgICAgICAgICAgICAgICAgImZmZmZmZmZmZmZmZiIKKyNkZWZpbmUgQ0ZHX0lOVEYyX01BQ19BRERSX0RFRkFVTFQgICAgICAgICAgICAgICAiMDAwQUY1ODk4OTgyIgorCisjZGVmaW5lIENGR19JTlRGM19NQUNfQUREUl9OQU1FICAgICAgICAgICAgICAgICAgIkludGYzTWFjQWRkcmVzcyIKKyNkZWZpbmUgQ0ZHX0lOVEYzX01BQ19BRERSX01JTiAgICAgICAgICAgICAgICAgICAiMDAwMDAwMDAwMDAwIgorI2RlZmluZSBDRkdfSU5URjNfTUFDX0FERFJfTUFYICAgICAgICAgICAgICAgICAgICJmZmZmZmZmZmZmZmYiCisjZGVmaW5lIENGR19JTlRGM19NQUNfQUREUl9ERUZBVUxUICAgICAgICAgICAgICAgIjAwMEFGNTg5ODk4MyIKKworI2RlZmluZSBDRkdfQVBfUU9TX1VBUFNEX01PREVfTkFNRSAgICAgICAgICAgICAiZ0VuYWJsZUFwVWFwc2QiIC8qIEFDcyB0byBzZXR1cCBVLUFQU0QgZm9yIGF0IGFzc29jICovCisjZGVmaW5lIENGR19BUF9RT1NfVUFQU0RfTU9ERV9NSU4gICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfQVBfUU9TX1VBUFNEX01PREVfTUFYICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0FQX1FPU19VQVBTRF9NT0RFX0RFRkFVTFQgICAgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX0FQX0VOQUJMRV9SQU5ET01fQlNTSURfTkFNRSAgICAgICAgICAgICJnRW5hYmxlQXBSYW5kb21Cc3NpZCIKKyNkZWZpbmUgQ0ZHX0FQX0VOQUJMRV9SQU5ET01fQlNTSURfTUlOICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfQVBfRU5BQkxFX1JBTkRPTV9CU1NJRF9NQVggICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19BUF9FTkFCTEVfUkFORE9NX0JTU0lEX0RFRkFVTFQgICAgICAgICAoMCkKKworI2RlZmluZSBDRkdfQVBfRU5BQkxFX1BST1RFQ1RJT05fTU9ERV9OQU1FICAgICAgICAgICAgImdFbmFibGVBcFByb3QiCisjZGVmaW5lIENGR19BUF9FTkFCTEVfUFJPVEVDVElPTl9NT0RFX01JTiAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0FQX0VOQUJMRV9QUk9URUNUSU9OX01PREVfTUFYICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfQVBfRU5BQkxFX1BST1RFQ1RJT05fTU9ERV9ERUZBVUxUICAgICAgICAgKDEpCisKKy8qIEJpdCBtYXAgZm9yIENGR19BUF9QUk9URUNUSU9OX01PREVfREVGQVVMVCAqLworLyogTE9XRVIgYnl0ZSBmb3IgYXNzb2NpYXRlZCBzdGF0aW9ucyAqLworLyogVVBQRVIgYnl0ZSBmb3Igb3ZlcmxhcHBpbmcgc3RhdGlvbnMgKi8KKy8qIGVhY2ggYnl0ZSB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBpbmZvICovCisvKiBiaXQxNSBiaXQxNCBiaXQxMyAgICAgYml0MTIgIGJpdDExIGJpdDEwICAgIGJpdDkgICAgIGJpdDggKi8KKy8qIE9CU1MgIFJJRlMgIExTSUdfVFhPUCBOT05fR0YgSFQyMCAgRlJPTV8xMUcgRlJPTV8xMUIgRlJPTV8xMUEgKi8KKy8qIGJpdDcgIGJpdDYgIGJpdDUgICAgICBiaXQ0ICAgYml0MyAgYml0MiAgICAgYml0MSAgICAgYml0MCAqLworLyogT0JTUyAgUklGUyAgTFNJR19UWE9QIE5PTl9HRiBIVF8yMCBGUk9NXzExRyBGUk9NXzExQiBGUk9NXzExQSAqLworI2RlZmluZSBDRkdfQVBfUFJPVEVDVElPTl9NT0RFX05BTUUgICAgICAgICAgICAiZ0FwUHJvdGVjdGlvbiIKKyNkZWZpbmUgQ0ZHX0FQX1BST1RFQ1RJT05fTU9ERV9NSU4gICAgICAgICAgICAgKDB4MCkKKyNkZWZpbmUgQ0ZHX0FQX1BST1RFQ1RJT05fTU9ERV9NQVggICAgICAgICAgICAgKDB4RkZGRikKKyNkZWZpbmUgQ0ZHX0FQX1BST1RFQ1RJT05fTU9ERV9ERUZBVUxUICAgICAgICAgKDB4QkZGRikKKworI2RlZmluZSBDRkdfQVBfT0JTU19QUk9URUNUSU9OX01PREVfTkFNRSAgICAgICAiZ0VuYWJsZUFwT0JTU1Byb3QiCisjZGVmaW5lIENGR19BUF9PQlNTX1BST1RFQ1RJT05fTU9ERV9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfQVBfT0JTU19QUk9URUNUSU9OX01PREVfTUFYICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0FQX09CU1NfUFJPVEVDVElPTl9NT0RFX0RFRkFVTFQgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0FQX1NUQV9TRUNVUklUWV9TRVBFUkFUSU9OX05BTUUgICAgImdEaXNhYmxlSW50cmFCc3NGd2QiCisjZGVmaW5lIENGR19BUF9TVEFfU0VDVVJJVFlfU0VQRVJBVElPTl9NSU4gICAgICgwKQorI2RlZmluZSBDRkdfQVBfU1RBX1NFQ1VSSVRZX1NFUEVSQVRJT05fTUFYICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0FQX1NUQV9TRUNVUklUWV9TRVBFUkFUSU9OX0RFRkFVTFQgKDApCisKKyNkZWZpbmUgQ0ZHX0FQX0xJU1RFTl9NT0RFX05BTUUgICAgICAgICAgICAgICAiZ0VuYWJsZVBoeUFnY0xpc3Rlbk1vZGUiCisjZGVmaW5lIENGR19BUF9MSVNURU5fTU9ERV9NSU4gICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19BUF9MSVNURU5fTU9ERV9NQVggICAgICAgICAgICAgICAgKDEyOCkKKyNkZWZpbmUgQ0ZHX0FQX0xJU1RFTl9NT0RFX0RFRkFVTFQgICAgICAgICAgICAoMTI4KQorCisjZGVmaW5lIENGR19BUF9BVVRPX1NIVVRfT0ZGICAgICAgICAgICAgICAgICJnQVBBdXRvU2h1dE9mZiIKKyNkZWZpbmUgQ0ZHX0FQX0FVVE9fU0hVVF9PRkZfTUlOICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19BUF9BVVRPX1NIVVRfT0ZGX01BWCAgICAgICAgICAgICg0Mjk0OTY3Mjk1VUwpCisjZGVmaW5lIENGR19BUF9BVVRPX1NIVVRfT0ZGX0RFRkFVTFQgICAgICAgICgwKQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKyNkZWZpbmUgQ0ZHX1dMQU5fQVVUT19TSFVURE9XTiAgICAgICAgICAgICAgImdXbGFuQXV0b1NodXRkb3duIgorI2RlZmluZSBDRkdfV0xBTl9BVVRPX1NIVVRET1dOX01JTiAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1dMQU5fQVVUT19TSFVURE9XTl9NQVggICAgICAgICAgKDg2NDAwKSAgIC8qIE1heCAxIGRheSB0aW1lb3V0ICovCisjZGVmaW5lIENGR19XTEFOX0FVVE9fU0hVVERPV05fREVGQVVMVCAgICAgICgwKQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKyNkZWZpbmUgQ0ZHX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0hfTU9ERSAgICAgICAgICAiZ1dsYW5NY2NUb1NjY1N3aXRjaE1vZGUiCisjZGVmaW5lIENGR19XTEFOX01DQ19UT19TQ0NfU1dJVENIX01PREVfTUlOICAgICAgKENERl9NQ0NfVE9fU0NDX1NXSVRDSF9ESVNBQkxFKQorI2RlZmluZSBDRkdfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSF9NT0RFX01BWCAgICAgIChDREZfTUNDX1RPX1NDQ19TV0lUQ0hfRk9SQ0UpCisjZGVmaW5lIENGR19XTEFOX01DQ19UT19TQ0NfU1dJVENIX01PREVfREVGQVVMVCAgKENERl9NQ0NfVE9fU0NDX1NXSVRDSF9ESVNBQkxFKQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0RJU0FCTEVfUEFDS0VUX0ZJTFRFUiAiZ0Rpc2FibGVQYWNrZXRGaWx0ZXIiCisjZGVmaW5lIENGR19ESVNBQkxFX1BBQ0tFVF9GSUxURVJfTUlOICAgICAgICgwKQorI2RlZmluZSBDRkdfRElTQUJMRV9QQUNLRVRfRklMVEVSX01BWCAgICAgICAgICAgICAgICgweDEpCisjZGVmaW5lIENGR19ESVNBQkxFX1BBQ0tFVF9GSUxURVJfREVGQVVMVCAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9MVEVfQ09FWCAgICAgICAgICAgICAgImdFbmFibGVMVEVDb2V4IgorI2RlZmluZSBDRkdfRU5BQkxFX0xURV9DT0VYX01JTiAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0xURV9DT0VYX01BWCAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0xURV9DT0VYX0RFRkFVTFQgICAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19BUF9LRUVQX0FMSVZFX1BFUklPRF9OQU1FICAgICAgICAgICJnQXBLZWVwQWxpdmVQZXJpb2QiCisjZGVmaW5lIENGR19BUF9LRUVQX0FMSVZFX1BFUklPRF9NSU4gICAgICAgICAgIFdOSV9DRkdfQVBfS0VFUF9BTElWRV9USU1FT1VUX1NUQU1JTgorI2RlZmluZSBDRkdfQVBfS0VFUF9BTElWRV9QRVJJT0RfTUFYICAgICAgICAgICBXTklfQ0ZHX0FQX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFNQVgKKyNkZWZpbmUgQ0ZHX0FQX0tFRVBfQUxJVkVfUEVSSU9EX0RFRkFVTFQgICAgICAgV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVRfU1RBREVGCisKKyNkZWZpbmUgQ0ZHX0dPX0tFRVBfQUxJVkVfUEVSSU9EX05BTUUgICAgICAgICAgImdHb0tlZXBBbGl2ZVBlcmlvZCIKKyNkZWZpbmUgQ0ZHX0dPX0tFRVBfQUxJVkVfUEVSSU9EX01JTiAgICAgICAgICAgV05JX0NGR19HT19LRUVQX0FMSVZFX1RJTUVPVVRfU1RBTUlOCisjZGVmaW5lIENGR19HT19LRUVQX0FMSVZFX1BFUklPRF9NQVggICAgICAgICAgIFdOSV9DRkdfR09fS0VFUF9BTElWRV9USU1FT1VUX1NUQU1BWAorI2RlZmluZSBDRkdfR09fS0VFUF9BTElWRV9QRVJJT0RfREVGQVVMVCAgICAgICBXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFERUYKKworI2RlZmluZSBDRkdfQVBfTElOS19NT05JVE9SX1BFUklPRF9OQU1FICAgICAgICAgICJnQXBMaW5rTW9uaXRvclBlcmlvZCIKKyNkZWZpbmUgQ0ZHX0FQX0xJTktfTU9OSVRPUl9QRVJJT0RfTUlOICAgICAgICAgICAoMykKKyNkZWZpbmUgQ0ZHX0FQX0xJTktfTU9OSVRPUl9QRVJJT0RfTUFYICAgICAgICAgICAoNTApCisjZGVmaW5lIENGR19BUF9MSU5LX01PTklUT1JfUEVSSU9EX0RFRkFVTFQgICAgICAgKDEwKQorCisvKiBnR29MaW5rTW9uaXRvclBlcmlvZCBpcyBwZXJpb2Qgd2hlcmUgbGluayBpcyBpZGxlIGFuZCB3aGVyZQorICogd2Ugc2VuZCBOVUxMIGZyYW1lCisgKi8KKyNkZWZpbmUgQ0ZHX0dPX0xJTktfTU9OSVRPUl9QRVJJT0RfTkFNRSAgICAgICAgICAiZ0dvTGlua01vbml0b3JQZXJpb2QiCisjZGVmaW5lIENGR19HT19MSU5LX01PTklUT1JfUEVSSU9EX01JTiAgICAgICAgICAgKDMpCisjZGVmaW5lIENGR19HT19MSU5LX01PTklUT1JfUEVSSU9EX01BWCAgICAgICAgICAgKDUwKQorI2RlZmluZSBDRkdfR09fTElOS19NT05JVE9SX1BFUklPRF9ERUZBVUxUICAgICAgICgxMCkKKworI2RlZmluZSBDRkdfQkVBQ09OX0lOVEVSVkFMX05BTUUgICAgICAgICAgICAgICAiZ0JlYWNvbkludGVydmFsIgorI2RlZmluZSBDRkdfQkVBQ09OX0lOVEVSVkFMX01JTiAgICAgICAgICAgICAgICBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTF9TVEFNSU4KKyNkZWZpbmUgQ0ZHX0JFQUNPTl9JTlRFUlZBTF9NQVggICAgICAgICAgICAgICAgV05JX0NGR19CRUFDT05fSU5URVJWQUxfU1RBTUFYCisjZGVmaW5lIENGR19CRUFDT05fSU5URVJWQUxfREVGQVVMVCAgICAgICAgICAgIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMX1NUQURFRgorCisvKiBBZGRpdGlvbmFsIEhhbmRvZmYgcmVsYXRlZCBQYXJhbWV0ZXJzICovCisjZGVmaW5lIENGR19ST0FNSU5HX1RJTUVfTkFNRSAgICAgICAgICAgICAgICAgImdSb2FtaW5nVGltZSIKKyNkZWZpbmUgQ0ZHX1JPQU1JTkdfVElNRV9NSU4gICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1JPQU1JTkdfVElNRV9NQVggICAgICAgICAgICAgICAgICAoNDI5NDk2N1VMKQorI2RlZmluZSBDRkdfUk9BTUlOR19USU1FX0RFRkFVTFQgICAgICAgICAgICAgICgxMCkKKworI2RlZmluZSBDRkdfVkNDX1JTU0lfVFJJR0dFUl9OQU1FICAgICAgICAgICAgICJnVmNjUnNzaVRyaWdnZXIiCisjZGVmaW5lIENGR19WQ0NfUlNTSV9UUklHR0VSX01JTiAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WQ0NfUlNTSV9UUklHR0VSX01BWCAgICAgICAgICAgICAgKDgwKQorI2RlZmluZSBDRkdfVkNDX1JTU0lfVFJJR0dFUl9ERUZBVUxUICAgICAgICAgICg4MCkKKworI2RlZmluZSBDRkdfVkNDX1VMX01BQ19MT1NTX1RIUkVTSF9OQU1FICAgICAgICJnVmNjVWxNYWNMb3NzVGhyZXNoIgorI2RlZmluZSBDRkdfVkNDX1VMX01BQ19MT1NTX1RIUkVTSF9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfVkNDX1VMX01BQ19MT1NTX1RIUkVTSF9NQVggICAgICAgICg5KQorI2RlZmluZSBDRkdfVkNDX1VMX01BQ19MT1NTX1RIUkVTSF9ERUZBVUxUICAgICg5KQorCisjZGVmaW5lIENGR19QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfTkFNRSAgICAgICJnUGFzc2l2ZU1heENoYW5uZWxUaW1lIgorI2RlZmluZSBDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX01JTiAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1BBU1NJVkVfTUFYX0NIQU5ORUxfVElNRV9NQVggICAgICAgKDEwMDAwKQorI2RlZmluZSBDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX0RFRkFVTFQgICAoMTEwKQorCisjZGVmaW5lIENGR19QQVNTSVZFX01JTl9DSEFOTkVMX1RJTUVfTkFNRSAgICAgICJnUGFzc2l2ZU1pbkNoYW5uZWxUaW1lIgorI2RlZmluZSBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX01JTiAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9NQVggICAgICAgKDEwMDAwKQorI2RlZmluZSBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX0RFRkFVTFQgICAoNjApCisKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX05BTUUgICAgICAgImdBY3RpdmVNYXhDaGFubmVsVGltZSIKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX01JTiAgICAgICAgKDApCisjZGVmaW5lIENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9NQVggICAgICAgICgxMDAwMCkKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX0RFRkFVTFQgICAgKDQwKQorCisjZGVmaW5lIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9OQU1FICAgICAgICJnQWN0aXZlTWluQ2hhbm5lbFRpbWUiCisjZGVmaW5lIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfQUNUSVZFX01JTl9DSEFOTkVMX1RJTUVfTUFYICAgICAgICAoMTAwMDApCisjZGVmaW5lIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9ERUZBVUxUICAgICgyMCkKKworI2RlZmluZSBDRkdfUkVUUllfTElNSVRfWkVST19OQU1FICAgICAgICJnUmV0cnlMaW1pdFplcm8iCisjZGVmaW5lIENGR19SRVRSWV9MSU1JVF9aRVJPX01JTiAgICAgICAgKDApCisjZGVmaW5lIENGR19SRVRSWV9MSU1JVF9aRVJPX01BWCAgICAgICAgKDE1KQorI2RlZmluZSBDRkdfUkVUUllfTElNSVRfWkVST19ERUZBVUxUICAgICg1KQorCisjZGVmaW5lIENGR19SRVRSWV9MSU1JVF9PTkVfTkFNRSAgICAgICAiZ1JldHJ5TGltaXRPbmUiCisjZGVmaW5lIENGR19SRVRSWV9MSU1JVF9PTkVfTUlOICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1JFVFJZX0xJTUlUX09ORV9NQVggICAgICAgICgxNSkKKyNkZWZpbmUgQ0ZHX1JFVFJZX0xJTUlUX09ORV9ERUZBVUxUICAgICgxMCkKKworI2RlZmluZSBDRkdfUkVUUllfTElNSVRfVFdPX05BTUUgICAgICAgImdSZXRyeUxpbWl0VHdvIgorI2RlZmluZSBDRkdfUkVUUllfTElNSVRfVFdPX01JTiAgICAgICAgKDApCisjZGVmaW5lIENGR19SRVRSWV9MSU1JVF9UV09fTUFYICAgICAgICAoMTUpCisjZGVmaW5lIENGR19SRVRSWV9MSU1JVF9UV09fREVGQVVMVCAgICAoMTUpCisKKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorCisjZGVmaW5lIENGR19QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQ19OQU1FICAgICAgImdQYXNzaXZlTWF4Q2hhbm5lbFRpbWVDb25jIgorI2RlZmluZSBDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX0NPTkNfTUlOICAgICAgICgwKQorI2RlZmluZSBDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX0NPTkNfTUFYICAgICAgICgxMDAwMCkKKyNkZWZpbmUgQ0ZHX1BBU1NJVkVfTUFYX0NIQU5ORUxfVElNRV9DT05DX0RFRkFVTFQgICAoMTEwKQorCisjZGVmaW5lIENGR19QQVNTSVZFX01JTl9DSEFOTkVMX1RJTUVfQ09OQ19OQU1FICAgICAgImdQYXNzaXZlTWluQ2hhbm5lbFRpbWVDb25jIgorI2RlZmluZSBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX0NPTkNfTUlOICAgICAgICgwKQorI2RlZmluZSBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX0NPTkNfTUFYICAgICAgICgxMDAwMCkKKyNkZWZpbmUgQ0ZHX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DX0RFRkFVTFQgICAoNjApCisKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX0NPTkNfTkFNRSAgICAgICAiZ0FjdGl2ZU1heENoYW5uZWxUaW1lQ29uYyIKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX0NPTkNfTUlOICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX0NPTkNfTUFYICAgICAgICAoMTAwMDApCisjZGVmaW5lIENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9DT05DX0RFRkFVTFQgICAgKDQwKQorCisjZGVmaW5lIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DX05BTUUgICAgICAgImdBY3RpdmVNaW5DaGFubmVsVGltZUNvbmMiCisjZGVmaW5lIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DX01JTiAgICAgICAgKDApCisjZGVmaW5lIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DX01BWCAgICAgICAgKDEwMDAwKQorI2RlZmluZSBDRkdfQUNUSVZFX01JTl9DSEFOTkVMX1RJTUVfQ09OQ19ERUZBVUxUICAgICgyMCkKKworI2RlZmluZSBDRkdfUkVTVF9USU1FX0NPTkNfTkFNRSAgICAgICAgICAgICAgICAgICAgICJnUmVzdFRpbWVDb25jIgorI2RlZmluZSBDRkdfUkVTVF9USU1FX0NPTkNfTUlOICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUkVTVF9USU1FX0NPTkNfTUFYICAgICAgICAgICAgICAgICAgICAgICgxMDAwMCkKKyNkZWZpbmUgQ0ZHX1JFU1RfVElNRV9DT05DX0RFRkFVTFQgICAgICAgICAgICAgICAgICAoMTAwKQorCisjZGVmaW5lIENGR19OVU1fU1RBX0NIQU5fQ09NQklORURfQ09OQ19OQU1FICAgICAgICAgICAgICJnTnVtU3RhQ2hhbkNvbWJpbmVkQ29uYyIKKyNkZWZpbmUgQ0ZHX05VTV9TVEFfQ0hBTl9DT01CSU5FRF9DT05DX01JTiAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19OVU1fU1RBX0NIQU5fQ09NQklORURfQ09OQ19NQVggICAgICAgICAgICAgICgyNTUpCisjZGVmaW5lIENGR19OVU1fU1RBX0NIQU5fQ09NQklORURfQ09OQ19ERUZBVUxUICAgICAgICAgICgzKQorCisjZGVmaW5lIENGR19OVU1fUDJQX0NIQU5fQ09NQklORURfQ09OQ19OQU1FICAgICAgICAgICAgICJnTnVtUDJQQ2hhbkNvbWJpbmVkQ29uYyIKKyNkZWZpbmUgQ0ZHX05VTV9QMlBfQ0hBTl9DT01CSU5FRF9DT05DX01JTiAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19OVU1fUDJQX0NIQU5fQ09NQklORURfQ09OQ19NQVggICAgICAgICAgICAgICgyNTUpCisjZGVmaW5lIENGR19OVU1fUDJQX0NIQU5fQ09NQklORURfQ09OQ19ERUZBVUxUICAgICAgICAgICgxKQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX01BWF9QU19QT0xMX05BTUUgICAgICAgICAgICAgICAgICAgImdNYXhQc1BvbGwiCisjZGVmaW5lIENGR19NQVhfUFNfUE9MTF9NSU4gICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfTUFYX1BTX1BPTExfU1RBTUlOCisjZGVmaW5lIENGR19NQVhfUFNfUE9MTF9NQVggICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfTUFYX1BTX1BPTExfU1RBTUFYCisjZGVmaW5lIENGR19NQVhfUFNfUE9MTF9ERUZBVUxUICAgICAgICAgICAgICAgIFdOSV9DRkdfTUFYX1BTX1BPTExfU1RBREVGCisKKyNkZWZpbmUgQ0ZHX01BWF9UWF9QT1dFUl9OQU1FICAgICAgICAgICAgICAgICAgICJnVHhQb3dlckNhcCIKKyNkZWZpbmUgQ0ZHX01BWF9UWF9QT1dFUl9NSU4gICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9TVEFNSU4KKyNkZWZpbmUgQ0ZHX01BWF9UWF9QT1dFUl9NQVggICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9TVEFNQVgKKy8qIE5vdCB0byB1c2UgQ0ZHIGRlZmF1bHQgYmVjYXVzZSBpZiBubyByZWdpc3RyeSBzZXR0aW5nLCB0aGlzIGlzIGlnbm9yZWQgYnkgU01FLiAqLworI2RlZmluZSBDRkdfTUFYX1RYX1BPV0VSX0RFRkFVTFQgICAgICAgICAgICAgICAgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMX1NUQU1BWAorCisjZGVmaW5lIENGR19MT1dfR0FJTl9PVkVSUklERV9OQU1FICAgICAgICAgICAgICJnTG93R2Fpbk92ZXJyaWRlIgorI2RlZmluZSBDRkdfTE9XX0dBSU5fT1ZFUlJJREVfTUlOICAgICAgICAgICAgICBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQU1JTgorI2RlZmluZSBDRkdfTE9XX0dBSU5fT1ZFUlJJREVfTUFYICAgICAgICAgICAgICBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQU1BWAorI2RlZmluZSBDRkdfTE9XX0dBSU5fT1ZFUlJJREVfREVGQVVMVCAgICAgICAgICBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQURFRgorCisjZGVmaW5lIENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfTkFNRSAgICAgICAgICAgICJnUnNzaUZpbHRlclBlcmlvZCIKKyNkZWZpbmUgQ0ZHX1JTU0lfRklMVEVSX1BFUklPRF9NSU4gICAgICAgICAgICAgV05JX0NGR19SU1NJX0ZJTFRFUl9QRVJJT0RfU1RBTUlOCisjZGVmaW5lIENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfTUFYICAgICAgICAgICAgIFdOSV9DRkdfUlNTSV9GSUxURVJfUEVSSU9EX1NUQU1BWAorLyogSW5jcmVhc2VkIHRoaXMgdmFsdWUgZm9yIE5vbi1FU0UgQVAuIFRoaXMgaXMgY2F1c2UgRlcgUlNTSSBNb25pdG9yaW5nICovCisvKiB0aGUgY29uc3VtZXIgb2YgdGhpcyB2YWx1ZSBpcyBPTiBieSBkZWZhdWx0LiBTbyB0byBpbXBhY3QgcG93ZXIgbnVtYmVycyAqLworLyogd2UgYXJlIHNldHRpbmcgdGhpcyB0byBhIGhpZ2ggdmFsdWUuICovCisjZGVmaW5lIENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfREVGQVVMVCAgICAgICAgIFdOSV9DRkdfUlNTSV9GSUxURVJfUEVSSU9EX1NUQURFRgorCisjZGVmaW5lIENGR19JR05PUkVfRFRJTV9OQU1FICAgICAgICAgICAgICAgICAgICJnSWdub3JlRHRpbSIKKyNkZWZpbmUgQ0ZHX0lHTk9SRV9EVElNX01JTiAgICAgICAgICAgICAgICAgICAgV05JX0NGR19JR05PUkVfRFRJTV9TVEFNSU4KKyNkZWZpbmUgQ0ZHX0lHTk9SRV9EVElNX01BWCAgICAgICAgICAgICAgICAgICAgV05JX0NGR19JR05PUkVfRFRJTV9TVEFNQVgKKyNkZWZpbmUgQ0ZHX0lHTk9SRV9EVElNX0RFRkFVTFQgICAgICAgICAgICAgICAgV05JX0NGR19JR05PUkVfRFRJTV9TVEFERUYKKworI2RlZmluZSBDRkdfTUFYX0xJX01PRFVMQVRFRF9EVElNX05BTUUgICAgICAgICAiZ01heExJTW9kdWxhdGVkRFRJTSIKKyNkZWZpbmUgQ0ZHX01BWF9MSV9NT0RVTEFURURfRFRJTV9NSU4gICAgICAgICAgKDEpCisjZGVmaW5lIENGR19NQVhfTElfTU9EVUxBVEVEX0RUSU1fTUFYICAgICAgICAgICgxMCkKKyNkZWZpbmUgQ0ZHX01BWF9MSV9NT0RVTEFURURfRFRJTV9ERUZBVUxUICAgICAgKDEwKQorCisjZGVmaW5lIENGR19SWF9BTlRfQ09ORklHVVJBVElPTl9OQU1FICAgICAgICAgICJnTnVtUnhBbnQiCisjZGVmaW5lIENGR19SWF9BTlRfQ09ORklHVVJBVElPTl9OQU1FX01JTiAgICAgICgxKQorI2RlZmluZSBDRkdfUlhfQU5UX0NPTkZJR1VSQVRJT05fTkFNRV9NQVggICAgICAoMikKKyNkZWZpbmUgQ0ZHX1JYX0FOVF9DT05GSUdVUkFUSU9OX05BTUVfREVGQVVMVCAgKDIpCisKKyNkZWZpbmUgQ0ZHX0ZXX0hFQVJUX0JFQVRfTU9OSVRPUklOR19OQU1FICAgICAgImdFbmFibGVGV0hlYXJ0QmVhdE1vbml0b3JpbmciCisjZGVmaW5lIENGR19GV19IRUFSVF9CRUFUX01PTklUT1JJTkdfTUlOICAgICAgICgwKQorI2RlZmluZSBDRkdfRldfSEVBUlRfQkVBVF9NT05JVE9SSU5HX01BWCAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0ZXX0hFQVJUX0JFQVRfTU9OSVRPUklOR19ERUZBVUxUICAgKDEpCisKKyNkZWZpbmUgQ0ZHX0ZXX0JFQUNPTl9GSUxURVJJTkdfTkFNRSAgICAgICAgICAgImdFbmFibGVGV0JlYWNvbkZpbHRlcmluZyIKKyNkZWZpbmUgQ0ZHX0ZXX0JFQUNPTl9GSUxURVJJTkdfTUlOICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19GV19CRUFDT05fRklMVEVSSU5HX01BWCAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRldfQkVBQ09OX0ZJTFRFUklOR19ERUZBVUxUICAgICAgICAoMSkKKworI2RlZmluZSBDRkdfRldfUlNTSV9NT05JVE9SSU5HX05BTUUgICAgICAgICAgICAiZ0VuYWJsZUZXUnNzaU1vbml0b3JpbmciCisjZGVmaW5lIENGR19GV19SU1NJX01PTklUT1JJTkdfTUlOICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRldfUlNTSV9NT05JVE9SSU5HX01BWCAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0ZXX1JTU0lfTU9OSVRPUklOR19ERUZBVUxUICAgICAgICAgKDEpCisKKy8qIGVuYWJsZSB1c2Ugb2YgbG9uZyBkdXJhdGlvbiBSVFMtQ1RTIHByb3RlY3Rpb24gd2hlbiBTQVAgZ29lcyBvZmYgY2hhbm5lbAorICogaW4gTUNDIG1vZGUKKyAqLworI2RlZmluZSBDRkdfRldfTUNDX1JUU19DVFNfUFJPVF9OQU1FICAgICAgICAgICAiZ0ZXTWNjUnRzQ3RzUHJvdGVjdGlvbiIKKyNkZWZpbmUgQ0ZHX0ZXX01DQ19SVFNfQ1RTX1BST1RfTUlOICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19GV19NQ0NfUlRTX0NUU19QUk9UX01BWCAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRldfTUNDX1JUU19DVFNfUFJPVF9ERUZBVUxUICAgICAgICAoMCkKKworLyogRW5hYmxlIHVzZSBvZiBicm9hZGNhc3QgcHJvYmUgcmVzcG9uc2UgdG8gaW5jcmVhc2UgdGhlIGRldGVjdGFiaWxpdHkgb2YKKyAqIFNBUCBpbiBNQ0MgbW9kZQorICovCisjZGVmaW5lIENGR19GV19NQ0NfQkNBU1RfUFJPQl9SRVNQX05BTUUgICAgICAgICJnRldNY2NCQ2FzdFByb2JlUmVzcG9uc2UiCisjZGVmaW5lIENGR19GV19NQ0NfQkNBU1RfUFJPQl9SRVNQX01JTiAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRldfTUNDX0JDQVNUX1BST0JfUkVTUF9NQVggICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0ZXX01DQ19CQ0FTVF9QUk9CX1JFU1BfREVGQVVMVCAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUX05BTUUgICAgICAgImdEYXRhSW5hY3Rpdml0eVRpbWVvdXQiCisjZGVmaW5lIENGR19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9NSU4gICAgICAgICgxKQorI2RlZmluZSBDRkdfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfTUFYICAgICAgICAoMjU1KQorI2RlZmluZSBDRkdfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfREVGQVVMVCAgICAoMjApCisKKyNkZWZpbmUgQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLX05BTUUgICAgICAgICAgInJmU2V0dGxpbmdUaW1lVXMiCisjZGVmaW5lIENGR19SRl9TRVRUTElOR19USU1FX0NMS19NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUkZfU0VUVExJTkdfVElNRV9DTEtfTUFYICAgICAgICAgICAoNjAwMDApCisjZGVmaW5lIENGR19SRl9TRVRUTElOR19USU1FX0NMS19ERUZBVUxUICAgICAgICgxNTAwKQorCisjZGVmaW5lIENGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfTkFNRSAgICAgICAgICAiZ1N0YUtlZXBBbGl2ZVBlcmlvZCIKKyNkZWZpbmUgQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRF9NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EX01BWCAgICAgICAgICAgKDY1NTM1KQorI2RlZmluZSBDRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EX0RFRkFVTFQgICAgICAgKDApCisKKy8qIFdNTSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIENGR19RT1NfV01NX01PREVfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldtbUlzRW5hYmxlZCIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fTU9ERV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19RT1NfV01NX01PREVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyKSAgLyogSEREX1dNTV9OT19RT1MgKi8KKyNkZWZpbmUgQ0ZHX1FPU19XTU1fTU9ERV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApICAvKiBIRERfV01NX0FVVE8gKi8KKworI2RlZmluZSBDRkdfUU9TX1dNTV84MDIxMUVfRU5BQkxFRF9OQU1FICAgICAgICAgICAgICAgICAgICI4MDIxMWVJc0VuYWJsZWQiCisjZGVmaW5lIENGR19RT1NfV01NXzgwMjExRV9FTkFCTEVEX01JTiAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV84MDIxMUVfRU5BQkxFRF9NQVggICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fODAyMTFFX0VOQUJMRURfREVGQVVMVCAgICAgICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fVUFQU0RfTUFTS19OQU1FICAgICAgICAgICAgICAgICAgICAgICAgIlVhcHNkTWFzayIgIC8qIEFDcyB0byBzZXR1cCBVLUFQU0QgZm9yIGF0IGFzc29jICovCisjZGVmaW5lIENGR19RT1NfV01NX1VBUFNEX01BU0tfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9VQVBTRF9NQVNLX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRikKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fVUFQU0RfTUFTS19ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgKDB4MDApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1JWX0lOVFZfTkFNRSAgICAgICAgICAgIkluZnJhVWFwc2RWb1NydkludHYiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZPX1NSVl9JTlRWX01JTiAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1JWX0lOVFZfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VUwpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZPX1NSVl9JTlRWX0RFRkFVTFQgICAgICAgICAoMjApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1VTX0lOVFZfTkFNRSAgICAgICAgICAgIkluZnJhVWFwc2RWb1N1c3BJbnR2IgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TVVNfSU5UVl9NSU4gICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZPX1NVU19JTlRWX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVVMKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TVVNfSU5UVl9ERUZBVUxUICAgICAgICAgKDIwMDApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1JWX0lOVFZfTkFNRSAgICAgICAgICAgIkluZnJhVWFwc2RWaVNydkludHYiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZJX1NSVl9JTlRWX01JTiAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1JWX0lOVFZfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VUwpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZJX1NSVl9JTlRWX0RFRkFVTFQgICAgICAgICAoMzAwKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZJX1NVU19JTlRWX05BTUUgICAgICAgICAgICJJbmZyYVVhcHNkVmlTdXNwSW50diIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1VTX0lOVFZfTUlOICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TVVNfSU5UVl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVTCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1VTX0lOVFZfREVGQVVMVCAgICAgICAgICgyMDAwKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NSVl9JTlRWX05BTUUgICAgICAgICAgICJJbmZyYVVhcHNkQmVTcnZJbnR2IgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TUlZfSU5UVl9NSU4gICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NSVl9JTlRWX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVVMKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TUlZfSU5UVl9ERUZBVUxUICAgICAgICAgKDMwMCkKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TVVNfSU5UVl9OQU1FICAgICAgICAgICAiSW5mcmFVYXBzZEJlU3VzcEludHYiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NVU19JTlRWX01JTiAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQkVfU1VTX0lOVFZfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VUwpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NVU19JTlRWX0RFRkFVTFQgICAgICAgICAoMjAwMCkKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TUlZfSU5UVl9OQU1FICAgICAgICAgICAiSW5mcmFVYXBzZEJrU3J2SW50diIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1JWX0lOVFZfTUlOICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TUlZfSU5UVl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVTCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1JWX0lOVFZfREVGQVVMVCAgICAgICAgICgzMDApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1VTX0lOVFZfTkFNRSAgICAgICAgICAgIkluZnJhVWFwc2RCa1N1c3BJbnR2IgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TVVNfSU5UVl9NSU4gICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JLX1NVU19JTlRWX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVVMKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TVVNfSU5UVl9ERUZBVUxUICAgICAgICAgKDIwMDApCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0lOQUNUSVZJVFlfSU5URVJWQUxfTkFNRSAgICAgICAgICJJbmZyYUluYWN0aXZpdHlJbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfSU5BQ1RJVklUWV9JTlRFUlZBTF9NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9JTkFDVElWSVRZX0lOVEVSVkFMX01BWCAgICAgICAgICAgKDQyOTQ5NjcyOTVVTCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfSU5BQ1RJVklUWV9JTlRFUlZBTF9ERUZBVUxUICAgICAgICgwKSAvKiBkaXNhYmxlZCAqLworCisjZGVmaW5lIENGR19FU0VfRkVBVFVSRV9FTkFCTEVEX05BTUUgICAgICAgICAgICAgICAgICAgICAgICJFc2VFbmFibGVkIgorI2RlZmluZSBDRkdfRVNFX0ZFQVRVUkVfRU5BQkxFRF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FU0VfRkVBVFVSRV9FTkFCTEVEX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VTRV9GRUFUVVJFX0VOQUJMRURfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICgwKSAvKiBkaXNhYmxlZCAqLworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKyNkZWZpbmUgQ0ZHX0xGUl9GRUFUVVJFX0VOQUJMRURfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgIkZhc3RSb2FtRW5hYmxlZCIKKyNkZWZpbmUgQ0ZHX0xGUl9GRUFUVVJFX0VOQUJMRURfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19MRlJfRkVBVFVSRV9FTkFCTEVEX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAoMCkgLyogZGlzYWJsZWQgKi8KKworI2RlZmluZSBDRkdfTEZSX01BV0NfRkVBVFVSRV9FTkFCTEVEX05BTUUgICAgICAgICAgICAgICAgICAgIk1BV0NFbmFibGVkIgorI2RlZmluZSBDRkdfTEZSX01BV0NfRkVBVFVSRV9FTkFCTEVEX01JTiAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19MRlJfTUFXQ19GRUFUVVJFX0VOQUJMRURfTUFYICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0xGUl9NQVdDX0ZFQVRVUkVfRU5BQkxFRF9ERUZBVUxUICAgICAgICAgICAgICAgICgwKSAvKiBkaXNhYmxlZCAqLworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9MRlIgKi8KKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorLyogVGhpcyBmbGFnIHdpbGwgY29udHJvbCBmYXN0dHJhbnNpdGlvbiBpbiBjYXNlIG9mIDExciBhbmQgZXNlLiAqLworLyogQmFzaWNhbGx5IHdpdGggdGhpcyB0aGUgd2hvbGUgbmVpZ2hib3Igcm9hbSwgcHJlLWF1dGgsIHJlYXNzb2MgKi8KKy8qIGNhbiBiZSB0dXJuZWQgT04vT0ZGLiAqLworLyogV2l0aCB0aGlzIHR1cm5lZCBPRkYgMTFyIHdpbGwgY29tcGxldGVseSBub3Qgd29yay4gKi8KKy8qIEZvciAxMXIgdGhpcyBmbGFnIGhhcyB0byBiZSBPTi4gKi8KKy8qIEZvciBFU0UgZmFzdHJvYW0gd2lsbCBub3Qgd29yay4gKi8KKyNkZWZpbmUgQ0ZHX0ZBU1RfVFJBTlNJVElPTl9FTkFCTEVEX05BTUUgICAgICAgICAgICAgICAgICAgICJGYXN0VHJhbnNpdGlvbkVuYWJsZWQiCisjZGVmaW5lIENGR19GQVNUX1RSQU5TSVRJT05fRU5BQkxFRF9OQU1FX01JTiAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0ZBU1RfVFJBTlNJVElPTl9FTkFCTEVEX05BTUVfTUFYICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRkFTVF9UUkFOU0lUSU9OX0VOQUJMRURfTkFNRV9ERUZBVUxUICAgICAgICAgICAgKDEpIC8qIEVuYWJsZWQgKi8KKworLyogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBSb2FtIG9yIG5vdC4KKyAqIEFQMSBpcyB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgQVAgYW5kIEFQMiBpcyBjaG9zZW4gZm9yIHJvYW1pbmcuCisgKiBUaGUgUm9hbWluZyB3aWxsIGhhcHBlbiBvbmx5IGlmIEFQMiBoYXMgYmV0dGVyIFNpZ25hbCBRdWFsaXR5IGFuZCBpdCBoYXMgYSBSU1NJIGJldHRlciB0aGFuIEFQMQorICogaW4gdGVybXMgb2YgUm9hbVJzc2lEaWZmLGFuZCBSb2FtUnNzaURpZmYgaXMgdGhlIG51bWJlciBvZiB1bml0cyAodHlwaWNhbGx5IG1lYXN1cmVkIGluIGRCKSBBUDIKKyAqIGlzIGJldHRlciB0aGFuIEFQMS4KKyAqIFRoaXMgY2hlY2sgaXMgbm90IGRvbmUgaWYgdGhlIHZhbHVlIGlzIFplcm8gKi8KKyNkZWZpbmUgQ0ZHX1JPQU1fUlNTSV9ESUZGX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb2FtUnNzaURpZmYiCisjZGVmaW5lIENGR19ST0FNX1JTU0lfRElGRl9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1JPQU1fUlNTSV9ESUZGX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMCkKKyNkZWZpbmUgQ0ZHX1JPQU1fUlNTSV9ESUZGX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICg1KQorCisvKlRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gc2V0IFdpcmVsZXNzIEV4dGVuZGVkIFNlY3VyaXR5IE1vZGUuKi8KKyNkZWZpbmUgQ0ZHX0VOQUJMRV9XRVNfTU9ERV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnV0VTTW9kZUVuYWJsZWQiCisjZGVmaW5lIENGR19FTkFCTEVfV0VTX01PREVfTkFNRV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9XRVNfTU9ERV9OQU1FX01BWCAgICAgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX1dFU19NT0RFX05BTUVfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX1JPQU1fU0NBTl9OX1BST0JFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdSb2FtU2Nhbk5Qcm9iZXMiCisjZGVmaW5lIENGR19ST0FNX1NDQU5fTl9QUk9CRVNfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1JPQU1fU0NBTl9OX1BST0JFU19NQVggICAgICAgICAgICAgICAgICAgICAgICAgICgxMCkKKyNkZWZpbmUgQ0ZHX1JPQU1fU0NBTl9OX1BST0JFU19ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICgyKQorCisjZGVmaW5lIENGR19ST0FNX1NDQU5fSE9NRV9BV0FZX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAiZ1JvYW1TY2FuSG9tZUF3YXlUaW1lIgorI2RlZmluZSBDRkdfUk9BTV9TQ0FOX0hPTUVfQVdBWV9USU1FX01JTiAgICAgICAgICAgICAgICAgICAgKDApIC8qIDAgZm9yIGRpc2FibGUgKi8KKyNkZWZpbmUgQ0ZHX1JPQU1fU0NBTl9IT01FX0FXQVlfVElNRV9NQVggICAgICAgICAgICAgICAgICAgICgzMDApCisjZGVmaW5lIENGR19ST0FNX1NDQU5fSE9NRV9BV0FZX1RJTUVfREVGQVVMVCAgICAgICAgICAgICAgICAoQ0ZHX1JPQU1fU0NBTl9IT01FX0FXQVlfVElNRV9NSU4pCisvKiBkaXNhYmxlZCBieSBkZWZhdWx0ICovCisKKyNlbmRpZiAvKiAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9PS0MKKyNkZWZpbmUgQ0ZHX09LQ19GRUFUVVJFX0VOQUJMRURfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgIk9rY0VuYWJsZWQiCisjZGVmaW5lIENGR19PS0NfRkVBVFVSRV9FTkFCTEVEX01JTiAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfT0tDX0ZFQVRVUkVfRU5BQkxFRF9NQVggICAgICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX09LQ19GRUFUVVJFX0VOQUJMRURfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgKDEpCisjZW5kaWYKKworI2RlZmluZSBDRkdfUk9BTV9TQ0FOX09GRkxPQURfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgImdSb2FtU2Nhbk9mZmxvYWRFbmFibGVkIgorI2RlZmluZSBDRkdfUk9BTV9TQ0FOX09GRkxPQURfRU5BQkxFRF9NSU4gICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19ST0FNX1NDQU5fT0ZGTE9BRF9FTkFCTEVEX01BWCAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1JPQU1fU0NBTl9PRkZMT0FEX0VOQUJMRURfREVGQVVMVCAgICAgICAgICAgICAgICgxKQorCisjZGVmaW5lIENGR19RT1NfV01NX1BLVF9DTEFTU0lGWV9CQVNJU19OQU1FICAgICAgICAgICAgICAgICJQa3RDbGFzc2lmaWNhdGlvbkJhc2lzIiAgICAgLyogRFNDUCBvciA4MDIuMVEgKi8KKyNkZWZpbmUgQ0ZHX1FPU19XTU1fUEtUX0NMQVNTSUZZX0JBU0lTX01JTiAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9QS1RfQ0xBU1NJRllfQkFTSVNfTUFYICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19RT1NfV01NX1BLVF9DTEFTU0lGWV9CQVNJU19ERUZBVUxUICAgICAgICAgICAgICAoMCkgLyogRFNDUCAqLworCisvKiBkZWZhdWx0IFRTUEVDIHBhcmFtZXRlcnMgZm9yIEFDX1ZPICovCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WT19OQU1FICAgICAgICAgICAgICAgICAgICJJbmZyYURpckFjVm8iCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WT19NSU4gICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZPX01BWCAgICAgICAgICAgICAgICAgICAgICgzKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfVk9fREVGQVVMVCAgICAgICAgICAgICAgICAgKDMpIC8qIFdMQU5fUUNUX0NVU1RfV01NX1RTRElSX0JPVEggKi8KKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZPX05BTUUgICAgICAgICAiSW5mcmFOb21Nc2R1U2l6ZUFjVm8iCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVk9fTUlOICAgICAgICAgICAoMHgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZPX01BWCAgICAgICAgICAgKDB4RkZGRikKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19WT19ERUZBVUxUICAgICAgICgweDgwRDApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVk9fTkFNRSAgICAgICAgIkluZnJhTWVhbkRhdGFSYXRlQWNWbyIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVk9fTUlOICAgICAgICAgICgweDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX1ZPX01BWCAgICAgICAgICAoMHhGRkZGRkZGRikKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVk9fREVGQVVMVCAgICAgICgweDE0NTAwKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WT19OQU1FICAgICAgICAgICJJbmZyYU1pblBoeVJhdGVBY1ZvIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfVk9fTUlOICAgICAgICAgICAgKDB4MCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZPX01BWCAgICAgICAgICAgICgweEZGRkZGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfVk9fREVGQVVMVCAgICAgICAgKDB4NUI4RDgwKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WT19OQU1FICAgICAgICAgICAgICAgICAgICJJbmZyYVNiYUFjVm8iCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WT19NSU4gICAgICAgICAgICAgICAgICAgICAoMHgyMDAxKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVk9fTUFYICAgICAgICAgICAgICAgICAgICAgKDB4RkZGRikKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX1ZPX0RFRkFVTFQgICAgICAgICAgICAgICAgICgweDIwMDEpCisKKy8qIGRlZmF1bHQgVFNQRUMgcGFyYW1ldGVycyBmb3IgQUNfVkkgKi8KKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZJX05BTUUgICAgICAgICAgICAgICAgICAgIkluZnJhRGlyQWNWaSIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZJX01JTiAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfVklfTUFYICAgICAgICAgICAgICAgICAgICAgKDMpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WSV9ERUZBVUxUICAgICAgICAgICAgICAgICAoMykgLyogV0xBTl9RQ1RfQ1VTVF9XTU1fVFNESVJfQk9USCAqLworCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVklfTkFNRSAgICAgICAgICJJbmZyYU5vbU1zZHVTaXplQWNWaSIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19WSV9NSU4gICAgICAgICAgICgweDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVklfTUFYICAgICAgICAgICAoMHhGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZJX0RFRkFVTFQgICAgICAgKDB4ODVEQykKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WSV9OQU1FICAgICAgICAiSW5mcmFNZWFuRGF0YVJhdGVBY1ZpIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WSV9NSU4gICAgICAgICAgKDB4MCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVklfTUFYICAgICAgICAgICgweEZGRkZGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WSV9ERUZBVUxUICAgICAgKDB4NTdFNDApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZJX05BTUUgICAgICAgICAgIkluZnJhTWluUGh5UmF0ZUFjVmkiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WSV9NSU4gICAgICAgICAgICAoMHgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfVklfTUFYICAgICAgICAgICAgKDB4RkZGRkZGRkYpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WSV9ERUZBVUxUICAgICAgICAoMHg1QjhEODApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX1ZJX05BTUUgICAgICAgICAgICAgICAgICAgIkluZnJhU2JhQWNWaSIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX1ZJX01JTiAgICAgICAgICAgICAgICAgICAgICgweDIwMDEpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WSV9NQVggICAgICAgICAgICAgICAgICAgICAoMHhGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVklfREVGQVVMVCAgICAgICAgICAgICAgICAgKDB4MjAwMSkKKworLyogZGVmYXVsdCBUU1BFQyBwYXJhbWV0ZXJzIGZvciBBQ19CRSovCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CRV9OQU1FICAgICAgICAgICAgICAgICAgICJJbmZyYURpckFjQmUiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CRV9NSU4gICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX0JFX01BWCAgICAgICAgICAgICAgICAgICAgICgzKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQkVfREVGQVVMVCAgICAgICAgICAgICAgICAgKDMpIC8qIFdMQU5fUUNUX0NVU1RfV01NX1RTRElSX0JPVEggKi8KKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JFX05BTUUgICAgICAgICAiSW5mcmFOb21Nc2R1U2l6ZUFjQmUiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfQkVfTUlOICAgICAgICAgICAoMHgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JFX01BWCAgICAgICAgICAgKDB4RkZGRikKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CRV9ERUZBVUxUICAgICAgICgweDg1REMpCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfQkVfTkFNRSAgICAgICAgIkluZnJhTWVhbkRhdGFSYXRlQWNCZSIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfQkVfTUlOICAgICAgICAgICgweDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JFX01BWCAgICAgICAgICAoMHhGRkZGRkZGRikKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfQkVfREVGQVVMVCAgICAgICgweDQ5M0UwKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CRV9OQU1FICAgICAgICAgICJJbmZyYU1pblBoeVJhdGVBY0JlIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfQkVfTUlOICAgICAgICAgICAgKDB4MCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX0JFX01BWCAgICAgICAgICAgICgweEZGRkZGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfQkVfREVGQVVMVCAgICAgICAgKDB4NUI4RDgwKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19CRV9OQU1FICAgICAgICAgICAgICAgICAgICJJbmZyYVNiYUFjQmUiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19CRV9NSU4gICAgICAgICAgICAgICAgICAgICAoMHgyMDAxKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQkVfTUFYICAgICAgICAgICAgICAgICAgICAgKDB4RkZGRikKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JFX0RFRkFVTFQgICAgICAgICAgICAgICAgICgweDIwMDEpCisKKy8qIGRlZmF1bHQgVFNQRUMgcGFyYW1ldGVycyBmb3IgQUNfQmsqLworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQktfTkFNRSAgICAgICAgICAgICAgICAgICAiSW5mcmFEaXJBY0JrIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQktfTUlOICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CS19NQVggICAgICAgICAgICAgICAgICAgICAoMykKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX0JLX0RFRkFVTFQgICAgICAgICAgICAgICAgICgzKSAvKiBXTEFOX1FDVF9DVVNUX1dNTV9UU0RJUl9CT1RIICovCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CS19OQU1FICAgICAgICAgIkluZnJhTm9tTXNkdVNpemVBY0JrIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JLX01JTiAgICAgICAgICAgKDB4MCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CS19NQVggICAgICAgICAgICgweEZGRkYpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfQktfREVGQVVMVCAgICAgICAoMHg4NURDKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JLX05BTUUgICAgICAgICJJbmZyYU1lYW5EYXRhUmF0ZUFjQmsiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JLX01JTiAgICAgICAgICAoMHgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CS19NQVggICAgICAgICAgKDB4RkZGRkZGRkYpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JLX0RFRkFVTFQgICAgICAoMHg0OTNFMCkKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfQktfTkFNRSAgICAgICAgICAiSW5mcmFNaW5QaHlSYXRlQWNCayIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX0JLX01JTiAgICAgICAgICAgICgweDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CS19NQVggICAgICAgICAgICAoMHhGRkZGRkZGRikKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX0JLX0RFRkFVTFQgICAgICAgICgweDVCOEQ4MCkKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQktfTkFNRSAgICAgICAgICAgICAgICAgICAiSW5mcmFTYmFBY0JrIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQktfTUlOICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMSkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JLX01BWCAgICAgICAgICAgICAgICAgICAgICgweEZGRkYpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19CS19ERUZBVUxUICAgICAgICAgICAgICAgICAoMHgyMDAxKQorCisjZGVmaW5lIENGR19UTF9ERUxBWUVEX1RSR1JfRlJNX0lOVF9OQU1FICAgICAgICAgICAgICAgICAgICJEZWxheWVkVHJpZ2dlckZybUludCIKKyNkZWZpbmUgQ0ZHX1RMX0RFTEFZRURfVFJHUl9GUk1fSU5UX01JTiAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0ZHX1RMX0RFTEFZRURfVFJHUl9GUk1fSU5UX01BWCAgICAgICAgICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VUwpCisjZGVmaW5lIENGR19UTF9ERUxBWUVEX1RSR1JfRlJNX0lOVF9ERUZBVUxUICAgICAgICAgICAgICAgICAzMDAwCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNkZWZpbmUgQ0ZHX1JSTV9FTkFCTEVfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnUnJtRW5hYmxlIgorI2RlZmluZSBDRkdfUlJNX0VOQUJMRV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19SUk1fRU5BQkxFX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1JSTV9FTkFCTEVfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX05BTUUgICAgICAgICAiZ1JybU9wZXJDaGFuTWF4IiAgICAgIC8qIHNlY3Rpb24gMTEuMTAuMyBJRUVFIHN0ZC4gODAyLjExay0yMDA4ICovCisjZGVmaW5lIENGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX01JTiAgICAgICAgICAoMCkgICAgLyogTWF4ZHVyYXRpb24gPSAyXihtYXhEdXJhdGlvbiAtIDQpICogYmNuSW50dmwuICovCisjZGVmaW5lIENGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX01BWCAgICAgICAgICAoOCkKKyNkZWZpbmUgQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fREVGQVVMVCAgICAgICgzKSAgICAvKiBtYXggZHVyYXRpb24gPSAyXi0xICogYmNuSW50dmwgKDUwJSBvZiBiY24gaW50dmwpICovCisKKyNkZWZpbmUgQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX05BTUUgICAgICJnUnJtTm9uT3BlckNoYW5NYXgiICAgLyogU2FtZSBhcyBhYm92ZS4gKi8KKyNkZWZpbmUgQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX01JTiAgICAgICgwKQorI2RlZmluZSBDRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fTUFYICAgICAgKDgpCisjZGVmaW5lIENGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWF9EVVJBVElPTl9ERUZBVUxUICAoMykKKworI2RlZmluZSBDRkdfUlJNX01FQVNfUkFORE9NSVpBVElPTl9JTlRWTF9OQU1FICAgICAgICAgICAgImdScm1SYW5kbkludHZsIgorI2RlZmluZSBDRkdfUlJNX01FQVNfUkFORE9NSVpBVElPTl9JTlRWTF9NSU4gICAgICAgICAgICAgKDEwKQorI2RlZmluZSBDRkdfUlJNX01FQVNfUkFORE9NSVpBVElPTl9JTlRWTF9NQVggICAgICAgICAgICAgKDEwMCkKKyNkZWZpbmUgQ0ZHX1JSTV9NRUFTX1JBTkRPTUlaQVRJT05fSU5UVkxfREVGQVVMVCAgICAgICAgICgxMDApCisjZW5kaWYKKworI2RlZmluZSBDRkdfUU9TX0lNUExJQ0lUX1NFVFVQX0VOQUJMRURfTkFNRSAgICAgICAgICAgICAgICAgIkltcGxpY2l0UW9zSXNFbmFibGVkIgorI2RlZmluZSBDRkdfUU9TX0lNUExJQ0lUX1NFVFVQX0VOQUJMRURfTUlOICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19RT1NfSU1QTElDSVRfU0VUVVBfRU5BQkxFRF9NQVggICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1FPU19JTVBMSUNJVF9TRVRVUF9FTkFCTEVEX0RFRkFVTFQgICAgICAgICAgICAgICgxKQorCisjZGVmaW5lIENGR19FTkFCTEVfTE9HUF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ0VuYWJsZUxvZ3AiCisjZGVmaW5lIENGR19FTkFCTEVfTE9HUF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9MT0dQX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0xPR1BfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjZGVmaW5lIENGR19GVF9SRVNPVVJDRV9SRVFfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICJnRlRSZXNvdXJjZVJlcVN1cHBvcnRlZCIKKyNkZWZpbmUgQ0ZHX0ZUX1JFU09VUkNFX1JFUV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19GVF9SRVNPVVJDRV9SRVFfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRlRfUkVTT1VSQ0VfUkVRX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAoMCkKKyNlbmRpZgorCisjZGVmaW5lIENGR19URUxFX0JDTl9UUkFOU19MSV9OQU1FICAgICAgICAgICAgICAgICAgICJ0ZWxlc2NvcGljQmVhY29uVHJhbnNMaXN0ZW5JbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX01JTiAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19URUxFX0JDTl9UUkFOU19MSV9NQVggICAgICAgICAgICAgICAgICAgICg3KQorI2RlZmluZSBDRkdfVEVMRV9CQ05fVFJBTlNfTElfREVGQVVMVCAgICAgICAgICAgICAgICAoMykKKworI2RlZmluZSBDRkdfVEVMRV9CQ05fVFJBTlNfTElfTlVNX0lETEVfQkNOU19OQU1FICAgICAidGVsZXNjb3BpY0JlYWNvblRyYW5zTGlzdGVuSW50ZXJ2YWxOdW1JZGxlQmNucyIKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX05VTV9JRExFX0JDTlNfTUlOICAgICAgKDUpCisjZGVmaW5lIENGR19URUxFX0JDTl9UUkFOU19MSV9OVU1fSURMRV9CQ05TX01BWCAgICAgICgyNTUpCisjZGVmaW5lIENGR19URUxFX0JDTl9UUkFOU19MSV9OVU1fSURMRV9CQ05TX0RFRkFVTFQgICgxMCkKKworI2RlZmluZSBDRkdfVEVMRV9CQ05fTUFYX0xJX05BTUUgICAgICAgICAgICAgICAgICAgICAidGVsZXNjb3BpY0JlYWNvbk1heExpc3RlbkludGVydmFsIgorI2RlZmluZSBDRkdfVEVMRV9CQ05fTUFYX0xJX01JTiAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX01BWF9MSV9NQVggICAgICAgICAgICAgICAgICAgICAgKDcpCisjZGVmaW5lIENGR19URUxFX0JDTl9NQVhfTElfREVGQVVMVCAgICAgICAgICAgICAgICAgICg1KQorCisjZGVmaW5lIENGR19URUxFX0JDTl9NQVhfTElfTlVNX0lETEVfQkNOU19OQU1FICAgICAgICJ0ZWxlc2NvcGljQmVhY29uTWF4TGlzdGVuSW50ZXJ2YWxOdW1JZGxlQmNucyIKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX01BWF9MSV9OVU1fSURMRV9CQ05TX01JTiAgICAgICAgKDUpCisjZGVmaW5lIENGR19URUxFX0JDTl9NQVhfTElfTlVNX0lETEVfQkNOU19NQVggICAgICAgICgyNTUpCisjZGVmaW5lIENGR19URUxFX0JDTl9NQVhfTElfTlVNX0lETEVfQkNOU19ERUZBVUxUICAgICgxNSkKKworI2RlZmluZSBDRkdfQkNOX0VBUkxZX1RFUk1fV0FLRV9OQU1FICAgICAgICAgICAgICAgICAiYmVhY29uRWFybHlUZXJtaW5hdGlvbldha2VJbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX0JDTl9FQVJMWV9URVJNX1dBS0VfTUlOICAgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIENGR19CQ05fRUFSTFlfVEVSTV9XQUtFX01BWCAgICAgICAgICAgICAgICAgICgyNTUpCisjZGVmaW5lIENGR19CQ05fRUFSTFlfVEVSTV9XQUtFX0RFRkFVTFQgICAgICAgICAgICAgICgzKQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX1NDQU5fVElNRVJfUEVSSU9EX05BTUUgICAgICAgICAgICAgImdOZWlnaGJvclNjYW5UaW1lclBlcmlvZCIKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX1NDQU5fVElNRVJfUEVSSU9EX01JTiAgICAgICAgICAgICAgKDMpCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX1RJTUVSX1BFUklPRF9NQVggICAgICAgICAgICAgICgzMDApCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX1RJTUVSX1BFUklPRF9ERUZBVUxUICAgICAgICAgICgyMDApCisKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX0xPT0tVUF9SU1NJX1RIUkVTSE9MRF9OQU1FICAgICAgImdOZWlnaGJvckxvb2t1cFRocmVzaG9sZCIKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX0xPT0tVUF9SU1NJX1RIUkVTSE9MRF9NSU4gICAgICAgKDEwKQorI2RlZmluZSBDRkdfTkVJR0hCT1JfTE9PS1VQX1JTU0lfVEhSRVNIT0xEX01BWCAgICAgICAoMTIwKQorI2RlZmluZSBDRkdfTkVJR0hCT1JfTE9PS1VQX1JTU0lfVEhSRVNIT0xEX0RFRkFVTFQgICAoNzgpCisKKyNkZWZpbmUgQ0ZHX0RFTEFZX0JFRk9SRV9WREVWX1NUT1BfTkFNRSAgICAgICAgICAgICAgImdEZWxheUJlZm9yZVZkZXZTdG9wIgorI2RlZmluZSBDRkdfREVMQVlfQkVGT1JFX1ZERVZfU1RPUF9NSU4gICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgQ0ZHX0RFTEFZX0JFRk9SRV9WREVWX1NUT1BfTUFYICAgICAgICAgICAgICAgKDIwMCkKKyNkZWZpbmUgQ0ZHX0RFTEFZX0JFRk9SRV9WREVWX1NUT1BfREVGQVVMVCAgICAgICAgICAgKDIwKQorCisvKgorICogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGRyb3AgaW4gUlNTSSB2YWx1ZSB0aGF0IHdpbGwgdHJpZ2dlciBhIHByZWNhdXRpb25hcnkKKyAqIHNjYW4gYnkgZmlybXdhcmUuCisgKiBNQVggdmFsdWUgaXMgY2hvb3NlIHNvIHRoYXQgdGhpcyB0eXBlIG9mIHNjYW4gY2FuIGJlIGRpc2FibGVkIGJ5IHVzZXIuCisgKi8KKyNkZWZpbmUgQ0ZHX1JPQU1fUkVTQ0FOX1JTU0lfRElGRl9OQU1FICAgICAgICAgICAgICAgICAgImdSb2FtUmVzY2FuUnNzaURpZmYiCisjZGVmaW5lIENGR19ST0FNX1JFU0NBTl9SU1NJX0RJRkZfTUlOICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUk9BTV9SRVNDQU5fUlNTSV9ESUZGX01BWCAgICAgICAgICAgICAgICAgICAoMTAwKQorI2RlZmluZSBDRkdfUk9BTV9SRVNDQU5fUlNTSV9ESUZGX0RFRkFVTFQgICAgICAgICAgICAgICAoNSkKKworLyoKKyAqIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBSU1NJIGRpZmYgYWJvdmUgbmVpZ2hib3IgbG9va3VwIHRocmVzaG9sZCwgd2hlbgorICogb3Bwb3J0dW5pc3RpYyBzY2FuIHNob3VsZCBiZSB0cmlnZ2VyZWQuCisgKiBNQVggdmFsdWUgaXMgY2hvb3NlIHNvIHRoYXQgdGhpcyB0eXBlIG9mIHNjYW4gY2FuIGJlIGFsd2F5cyBlbmFibGVkIGJ5IHVzZXIuCisgKiBNSU4gdmFsdWUgd2lsbCBjYXVzZSBvcHBvcnR1bmlzdGljIHNjYW4gdG8gYmUgdHJpZ2dlcmVkIGluIG5laWdoYm9yIGxvb2t1cAorICogUlNTSSByYW5nZS4KKyAqLworI2RlZmluZSBDRkdfT1BQT1JUVU5JU1RJQ19TQ0FOX1RIUkVTSE9MRF9ESUZGX05BTUUgICAgICAgICAgICAiZ09wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmIgorI2RlZmluZSBDRkdfT1BQT1JUVU5JU1RJQ19TQ0FOX1RIUkVTSE9MRF9ESUZGX01JTiAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX09QUE9SVFVOSVNUSUNfU0NBTl9USFJFU0hPTERfRElGRl9NQVggICAgICAgICAgICAgKDEyNykKKyNkZWZpbmUgQ0ZHX09QUE9SVFVOSVNUSUNfU0NBTl9USFJFU0hPTERfRElGRl9ERUZBVUxUICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX1NDQU5fQ0hBTl9MSVNUX05BTUUgICAgICAgICAgICAgICAgICAgICAgImdOZWlnaGJvclNjYW5DaGFubmVsTGlzdCIKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX1NDQU5fQ0hBTl9MSVNUX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgIiIKKworI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9NSU5fQ0hBTl9USU1FX05BTUUgICAgICAgICAgICAgICAgICAiZ05laWdoYm9yU2NhbkNoYW5uZWxNaW5UaW1lIgorI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9NSU5fQ0hBTl9USU1FX01JTiAgICAgICAgICAgICAgICAgICAoMTApCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX01JTl9DSEFOX1RJTUVfTUFYICAgICAgICAgICAgICAgICAgICg0MCkKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX1NDQU5fTUlOX0NIQU5fVElNRV9ERUZBVUxUICAgICAgICAgICAgICAgKDIwKQorCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfTkFNRSAgICAgICAgICAgICAgICAgICJnTmVpZ2hib3JTY2FuQ2hhbm5lbE1heFRpbWUiCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfTUlOICAgICAgICAgICAgICAgICAgICgzKQorI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9NQVhfQ0hBTl9USU1FX01BWCAgICAgICAgICAgICAgICAgICAoMzAwKQorI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9NQVhfQ0hBTl9USU1FX0RFRkFVTFQgICAgICAgICAgICAgICAoMzApCisKKyNkZWZpbmUgQ0ZHXzExUl9ORUlHSEJPUl9SRVFfTUFYX1RSSUVTX05BTUUgICAgICAgICAgICJnTWF4TmVpZ2hib3JSZXFUcmllcyIKKyNkZWZpbmUgQ0ZHXzExUl9ORUlHSEJPUl9SRVFfTUFYX1RSSUVTX01JTiAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfMTFSX05FSUdIQk9SX1JFUV9NQVhfVFJJRVNfTUFYICAgICAgICAgICAgKDQpCisjZGVmaW5lIENGR18xMVJfTkVJR0hCT1JfUkVRX01BWF9UUklFU19ERUZBVUxUICAgICAgICAoMykKKworI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9SRVNVTFRTX1JFRlJFU0hfUEVSSU9EX05BTUUgICAgICAgICAiZ05laWdoYm9yU2NhblJlZnJlc2hQZXJpb2QiCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX1JFU1VMVFNfUkVGUkVTSF9QRVJJT0RfTUlOICAgICAgICAgICgxMDAwKQorI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9SRVNVTFRTX1JFRlJFU0hfUEVSSU9EX01BWCAgICAgICAgICAoNjAwMDApCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX1JFU1VMVFNfUkVGUkVTSF9QRVJJT0RfREVGQVVMVCAgICAgICgyMDAwMCkKKworI2RlZmluZSBDRkdfRU1QVFlfU0NBTl9SRUZSRVNIX1BFUklPRF9OQU1FICAgICAgICAgImdFbXB0eVNjYW5SZWZyZXNoUGVyaW9kIgorI2RlZmluZSBDRkdfRU1QVFlfU0NBTl9SRUZSRVNIX1BFUklPRF9NSU4gICAgICAgICAgKDApCisjZGVmaW5lIENGR19FTVBUWV9TQ0FOX1JFRlJFU0hfUEVSSU9EX01BWCAgICAgICAgICAoNjAwMDApCisjZGVmaW5lIENGR19FTVBUWV9TQ0FOX1JFRlJFU0hfUEVSSU9EX0RFRkFVTFQgICAgICAoMCkKKworI2RlZmluZSBDRkdfUk9BTV9CTUlTU19GSVJTVF9CQ05UX05BTUUgICAgICAgICAgICAgICAgICAiZ1JvYW1CbWlzc0ZpcnN0QmNudCIKKyNkZWZpbmUgQ0ZHX1JPQU1fQk1JU1NfRklSU1RfQkNOVF9NSU4gICAgICAgICAgICAgICAgICAgKDUpCisjZGVmaW5lIENGR19ST0FNX0JNSVNTX0ZJUlNUX0JDTlRfTUFYICAgICAgICAgICAgICAgICAgICgxMDApCisjZGVmaW5lIENGR19ST0FNX0JNSVNTX0ZJUlNUX0JDTlRfREVGQVVMVCAgICAgICAgICAgICAgICgxMCkKKworI2RlZmluZSBDRkdfUk9BTV9CTUlTU19GSU5BTF9CQ05UX05BTUUgICAgICAgICAgICAgICAgICAiZ1JvYW1CbWlzc0ZpbmFsQmNudCIKKyNkZWZpbmUgQ0ZHX1JPQU1fQk1JU1NfRklOQUxfQkNOVF9NSU4gICAgICAgICAgICAgICAgICAgKDUpCisjZGVmaW5lIENGR19ST0FNX0JNSVNTX0ZJTkFMX0JDTlRfTUFYICAgICAgICAgICAgICAgICAgICgxMDApCisjZGVmaW5lIENGR19ST0FNX0JNSVNTX0ZJTkFMX0JDTlRfREVGQVVMVCAgICAgICAgICAgICAgICgxMCkKKworI2RlZmluZSBDRkdfUk9BTV9CRUFDT05fUlNTSV9XRUlHSFRfTkFNRSAgICAgICAgICAgICAgICAiZ1JvYW1CZWFjb25Sc3NpV2VpZ2h0IgorI2RlZmluZSBDRkdfUk9BTV9CRUFDT05fUlNTSV9XRUlHSFRfTUlOICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1JPQU1fQkVBQ09OX1JTU0lfV0VJR0hUX01BWCAgICAgICAgICAgICAgICAgKDE2KQorI2RlZmluZSBDRkdfUk9BTV9CRUFDT05fUlNTSV9XRUlHSFRfREVGQVVMVCAgICAgICAgICAgICAoMTQpCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcgKi8KKworI2RlZmluZSBDRkdfUU9TX1dNTV9CVVJTVF9TSVpFX0RFRk5fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICJidXJzdFNpemVEZWZpbml0aW9uIgorI2RlZmluZSBDRkdfUU9TX1dNTV9CVVJTVF9TSVpFX0RFRk5fTUlOICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9CVVJTVF9TSVpFX0RFRk5fTUFYICAgICAgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfUU9TX1dNTV9CVVJTVF9TSVpFX0RFRk5fREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19RT1NfV01NX1RTX0lORk9fQUNLX1BPTElDWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgInRzSW5mb0Fja1BvbGljeSIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fVFNfSU5GT19BQ0tfUE9MSUNZX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fVFNfSU5GT19BQ0tfUE9MSUNZX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fVFNfSU5GT19BQ0tfUE9MSUNZX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKworI2RlZmluZSBDRkdfU0lOR0xFX1RJRF9SQ19OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2luZ2xlVElEUkMiCisjZGVmaW5lIENGR19TSU5HTEVfVElEX1JDX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkgLyogU2VwZXJhdGUgcmVwbGF5IGNvdW50ZXIgZm9yIGFsbCBUSUQgKi8KKyNkZWZpbmUgQ0ZHX1NJTkdMRV9USURfUkNfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKSAvKiBTaW5nbGUgcmVwbGF5IGNvdW50ZXIgZm9yIGFsbCBUSUQgKi8KKyNkZWZpbmUgQ0ZHX1NJTkdMRV9USURfUkNfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfTkFNRSAgICAgICAgICAiTWNhc3RCY2FzdEZpbHRlciIKKyNkZWZpbmUgQ0ZHX01DQVNUX0JDQVNUX0ZJTFRFUl9TRVRUSU5HX01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElOR19NQVggICAgICAgICAgICgzKQorI2RlZmluZSBDRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfREVGQVVMVCAgICAgICAoMCkKKworI2RlZmluZSBDRkdfRFlOQU1JQ19QU1BPTExfVkFMVUVfTkFNRSAgICAgICAgICAiZ0R5bmFtaWNQU1BvbGx2YWx1ZSIKKyNkZWZpbmUgQ0ZHX0RZTkFNSUNfUFNQT0xMX1ZBTFVFX01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19EWU5BTUlDX1BTUE9MTF9WQUxVRV9NQVggICAgICAgICAgICgyNTUpCisjZGVmaW5lIENGR19EWU5BTUlDX1BTUE9MTF9WQUxVRV9ERUZBVUxUICAgICAgICgwKQorCisjZGVmaW5lIENGR19URUxFX0JDTl9XQUtFVVBfRU5fTkFNRSAgICAgICAgICAgICJnVGVsZXNjb3BpY0JlYWNvbldha2V1cEVuIgorI2RlZmluZSBDRkdfVEVMRV9CQ05fV0FLRVVQX0VOX01JTiAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTl9NQVggICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19URUxFX0JDTl9XQUtFVVBfRU5fREVGQVVMVCAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19RT1NfQUREVFNfV0hFTl9BQ01fSVNfT0ZGX05BTUUgICAgICAgICAgICAgICAgICJnQWRkVFNXaGVuQUNNSXNPZmYiCisjZGVmaW5lIENGR19RT1NfQUREVFNfV0hFTl9BQ01fSVNfT0ZGX01JTiAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX0FERFRTX1dIRU5fQUNNX0lTX09GRl9NQVggICAgICAgICAgICAgICAgICAoMSkgIC8qIFNlbmQgQWRkVHMgZXZlbiB3aGVuIEFDTSBpcyBub3Qgc2V0IGZvciB0aGUgQUMgKi8KKyNkZWZpbmUgQ0ZHX1FPU19BRERUU19XSEVOX0FDTV9JU19PRkZfREVGQVVMVCAgICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX1ZBTElEQVRFX1NDQU5fTElTVF9OQU1FICAgICAgICAgICAgICAgICAiZ1ZhbGlkYXRlU2Nhbkxpc3QiCisjZGVmaW5lIENGR19WQUxJREFURV9TQ0FOX0xJU1RfTUlOICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WQUxJREFURV9TQ0FOX0xJU1RfTUFYICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19WQUxJREFURV9TQ0FOX0xJU1RfREVGQVVMVCAgICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVF9OQU1FICAgICAgICJnTnVsbERhdGFBcFJlc3BUaW1lb3V0IgorI2RlZmluZSBDRkdfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VUX01JTiAgICAgICAgKFdOSV9DRkdfUFNfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VUX1NUQU1JTikKKyNkZWZpbmUgQ0ZHX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVF9NQVggICAgICAgIChXTklfQ0ZHX1BTX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVF9TVEFNQVgpCisjZGVmaW5lIENGR19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfREVGQVVMVCAgICAoV05JX0NGR19QU19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfU1RBREVGKQorCisjZGVmaW5lIENGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX05BTUUgICAgICAiZ0FwRGF0YUF2YWlsUG9sbEludGVydmFsIgorI2RlZmluZSBDRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9NSU4gICAgICAgKFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9TVEFNSU4pCisjZGVmaW5lIENGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX01BWCAgICAgICAoV05JX0NGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX1NUQU1BWCkKKyNkZWZpbmUgQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfREVGQVVMVCAgIChXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfU1RBREVGKQorCisjZGVmaW5lIENGR19FTkFCTEVfSE9TVF9BUlBPRkZMT0FEX05BTUUgICAgICAgICAiaG9zdEFycE9mZmxvYWQiCisjZGVmaW5lIENGR19FTkFCTEVfSE9TVF9BUlBPRkZMT0FEX01JTiAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9IT1NUX0FSUE9GRkxPQURfTUFYICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0hPU1RfQVJQT0ZGTE9BRF9ERUZBVUxUICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9IT1NUX1NTRFBfTkFNRSAgICAgICAgICAgICAgInNzZHAiCisjZGVmaW5lIENGR19FTkFCTEVfSE9TVF9TU0RQX01JTiAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0hPU1RfU1NEUF9NQVggICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9IT1NUX1NTRFBfREVGQVVMVCAgICAgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9IT1NUX05TT0ZGTE9BRF9OQU1FICAgICAgICAgImhvc3ROU09mZmxvYWQiCisjZGVmaW5lIENGR19FTkFCTEVfSE9TVF9OU09GRkxPQURfTUlOICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0hPU1RfTlNPRkZMT0FEX01BWCAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9IT1NUX05TT0ZGTE9BRF9ERUZBVUxUICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0JBTkRfQ0FQQUJJTElUWV9OQU1FICAgICAgICAgICJCYW5kQ2FwYWJpbGl0eSIKKyNkZWZpbmUgQ0ZHX0JBTkRfQ0FQQUJJTElUWV9NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfQkFORF9DQVBBQklMSVRZX01BWCAgICAgICAgICAgKDIpCisjZGVmaW5lIENGR19CQU5EX0NBUEFCSUxJVFlfREVGQVVMVCAgICAgICAoMCkKKworI2RlZmluZSBDRkdfRU5BQkxFX0JFQUNPTl9FQVJMWV9URVJNSU5BVElPTl9OQU1FICAgICAgICAgICJlbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uIgorI2RlZmluZSBDRkdfRU5BQkxFX0JFQUNPTl9FQVJMWV9URVJNSU5BVElPTl9NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0JFQUNPTl9FQVJMWV9URVJNSU5BVElPTl9NQVggICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0JFQUNPTl9FQVJMWV9URVJNSU5BVElPTl9ERUZBVUxUICAgICAgICgwKQorCisjZGVmaW5lIENGR19FTkFCTEVfQ0xPU0VfTE9PUF9OQU1FICAgICAgICAgICAgICAgICAiZ0VuYWJsZUNsb3NlTG9vcCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX01JTiAgICAgICAgICAgICAgICAgIFdOSV9DRkdfRklYRURfUkFURV9TVEFNSU4KKyNkZWZpbmUgQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX01BWCAgICAgICAgICAgICAgICAgIFdOSV9DRkdfRklYRURfUkFURV9TVEFNQVgKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX0RFRkFVTFQgICAgICAgICAgICAgIFdOSV9DRkdfRklYRURfUkFURV9TVEFERUYKKworI2RlZmluZSBDRkdfRU5BQkxFX0JZUEFTU18xMURfTkFNRSAgICAgICAgICAgICAgICAgImdFbmFibGVCeXBhc3MxMWQiCisjZGVmaW5lIENGR19FTkFCTEVfQllQQVNTXzExRF9NSU4gICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9CWVBBU1NfMTFEX01BWCAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0JZUEFTU18xMURfREVGQVVMVCAgICAgICAgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9ERlNfQ0hOTF9TQ0FOX05BTUUgICAgICAgICAgICAgICJnRW5hYmxlREZTQ2hubFNjYW4iCisjZGVmaW5lIENGR19FTkFCTEVfREZTX0NITkxfU0NBTl9NSU4gICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9ERlNfQ0hOTF9TQ0FOX01BWCAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19DSE5MX1NDQU5fREVGQVVMVCAgICAgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9ERlNfUE5PX0NITkxfU0NBTl9OQU1FICAgICAgICAgICAgICAiZ0VuYWJsZURGU1Bub0NobmxTY2FuIgorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19QTk9fQ0hOTF9TQ0FOX01JTiAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19QTk9fQ0hOTF9TQ0FOX01BWCAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19QTk9fQ0hOTF9TQ0FOX0RFRkFVTFQgICAgICAgICAgICgxKQorCisjZGVmaW5lIENGR19FTkFCTEVfUkFNRFVNUF9DT0xMRUNUSU9OICAgICAgICAgICAgICAiZ0VuYWJsZUR1bXBDb2xsZWN0IgorI2RlZmluZSBDRkdfRU5BQkxFX1JBTURVTVBfQ09MTEVDVElPTl9NSU4gICAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfUkFNRFVNUF9DT0xMRUNUSU9OX01BWCAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9SQU1EVU1QX0NPTExFQ1RJT05fREVGQVVMVCAgICAgICgxKQorCit0eXBlZGVmIGVudW0geworCWVIRERfTElOS19TUEVFRF9SRVBPUlRfQUNUVUFMID0gMCwKKwllSEREX0xJTktfU1BFRURfUkVQT1JUX01BWCA9IDEsCisJZUhERF9MSU5LX1NQRUVEX1JFUE9SVF9NQVhfU0NBTEVEID0gMiwKK30gZUhkZExpbmtTcGVlZFJlcG9ydFR5cGU7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKyNkZWZpbmUgQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIICAgICAgICAgICAgICAgICJnVmh0Q2hhbm5lbFdpZHRoIgorI2RlZmluZSBDRkdfVkhUX0NIQU5ORUxfV0lEVEhfTUlOICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WSFRfQ0hBTk5FTF9XSURUSF9NQVggICAgICAgICAgICAoNCkKKyNkZWZpbmUgQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIX0RFRkFVTFQgICAgICAgICgzKQorCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX1JYX01DU184XzkgICAgICAgICAgICAgICAiZ1ZodFJ4TUNTIgorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9SWF9NQ1NfOF85X01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX1JYX01DU184XzlfTUFYICAgICAgICAgICAoMikKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfUlhfTUNTXzhfOV9ERUZBVUxUICAgICAgICgwKQorCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX1RYX01DU184XzkgICAgICAgICAgICAgICAiZ1ZodFR4TUNTIgorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9UWF9NQ1NfOF85X01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX1RYX01DU184XzlfTUFYICAgICAgICAgICAoMikKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfVFhfTUNTXzhfOV9ERUZBVUxUICAgICAgICgwKQorCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX1JYX01DUzJ4Ml84XzkgICAgICAgICAgICAgICAiZ1ZodFJ4TUNTMngyIgorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9SWF9NQ1MyeDJfOF85X01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX1JYX01DUzJ4Ml84XzlfTUFYICAgICAgICAgICAoMikKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfUlhfTUNTMngyXzhfOV9ERUZBVUxUICAgICAgICgwKQorCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX1RYX01DUzJ4Ml84XzkgICAgICAgICAgICAgICAiZ1ZodFR4TUNTMngyIgorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9UWF9NQ1MyeDJfOF85X01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX1RYX01DUzJ4Ml84XzlfTUFYICAgICAgICAgICAoMikKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfVFhfTUNTMngyXzhfOV9ERUZBVUxUICAgICAgICgwKQorCisjZGVmaW5lIENGR19WSFRfRU5BQkxFXzJ4Ml9DQVBfRkVBVFVSRSAgICAgICAgICJnRW5hYmxlMngyIgorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV8yeDJfQ0FQX0ZFQVRVUkVfTUlOICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfMngyX0NBUF9GRUFUVVJFX01BWCAgICAgKDEpCisjZGVmaW5lIENGR19WSFRfRU5BQkxFXzJ4Ml9DQVBfRkVBVFVSRV9ERUZBVUxUICgwKQorCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX01VX0JGT1JNRUVfQ0FQX0ZFQVRVUkUgICAgICAgICAiZ0VuYWJsZU11QmZvcm1lZSIKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfTVVfQkZPUk1FRV9DQVBfRkVBVFVSRV9NSU4gICAgICgwKQorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9NVV9CRk9STUVFX0NBUF9GRUFUVVJFX01BWCAgICAgKDEpCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX01VX0JGT1JNRUVfQ0FQX0ZFQVRVUkVfREVGQVVMVCAoMCkKKworI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9QQUlEX0ZFQVRVUkUgICAgICAgICAgICAgImdFbmFibGVQQUlEIgorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9QQUlEX0ZFQVRVUkVfTUlOICAgICAgICAgKDApCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX1BBSURfRkVBVFVSRV9NQVggICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfUEFJRF9GRUFUVVJFX0RFRkFVTFQgICAgICgwKQorCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX0dJRF9GRUFUVVJFICAgICAgICAgICAgICAiZ0VuYWJsZUdJRCIKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfR0lEX0ZFQVRVUkVfTUlOICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9HSURfRkVBVFVSRV9NQVggICAgICAgICAgKDEpCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX0dJRF9GRUFUVVJFX0RFRkFVTFQgICAgICAoMCkKKyNlbmRpZgorCisjZGVmaW5lIENGR19WSFRfRU5BQkxFXzF4MV9UWF9DSEFJTk1BU0sgICAgICAgICAiZ1NldFR4Q2hhaW5tYXNrMXgxIgorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV8xeDFfVFhfQ0hBSU5NQVNLX01JTiAgICAgKDEpCisjZGVmaW5lIENGR19WSFRfRU5BQkxFXzF4MV9UWF9DSEFJTk1BU0tfTUFYICAgICAoMikKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfMXgxX1RYX0NIQUlOTUFTS19ERUZBVUxUICgxKQorCisjZGVmaW5lIENGR19WSFRfRU5BQkxFXzF4MV9SWF9DSEFJTk1BU0sgICAgICAgICAiZ1NldFJ4Q2hhaW5tYXNrMXgxIgorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV8xeDFfUlhfQ0hBSU5NQVNLX01JTiAgICAgKDEpCisjZGVmaW5lIENGR19WSFRfRU5BQkxFXzF4MV9SWF9DSEFJTk1BU0tfTUFYICAgICAoMikKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfMXgxX1JYX0NIQUlOTUFTS19ERUZBVUxUICgxKQorCisjZGVmaW5lIENGR19FTkFCTEVfQU1QRFVQU19GRUFUVVJFICAgICAgICAgICAgICAiZ0VuYWJsZUFNUERVUFMiCisjZGVmaW5lIENGR19FTkFCTEVfQU1QRFVQU19GRUFUVVJFX01JTiAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9BTVBEVVBTX0ZFQVRVUkVfTUFYICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0FNUERVUFNfRkVBVFVSRV9ERUZBVUxUICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0hUX0VOQUJMRV9TTVBTX0NBUF9GRUFUVVJFICAgICAgICAgICJnRW5hYmxlSHRTTVBTIgorI2RlZmluZSBDRkdfSFRfRU5BQkxFX1NNUFNfQ0FQX0ZFQVRVUkVfTUlOICAgICAgKDApCisjZGVmaW5lIENGR19IVF9FTkFCTEVfU01QU19DQVBfRkVBVFVSRV9NQVggICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0hUX0VOQUJMRV9TTVBTX0NBUF9GRUFUVVJFX0RFRkFVTFQgICgwKQorCisjZGVmaW5lIENGR19IVF9TTVBTX0NBUF9GRUFUVVJFICAgICAgICAgICAgICAgICAiZ0h0U01QUyIKKyNkZWZpbmUgQ0ZHX0hUX1NNUFNfQ0FQX0ZFQVRVUkVfTUlOICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfSFRfU01QU19DQVBfRkVBVFVSRV9NQVggICAgICAgICAgICAgKDMpCisjZGVmaW5lIENGR19IVF9TTVBTX0NBUF9GRUFUVVJFX0RFRkFVTFQgICAgICAgICAoMykKKworI2RlZmluZSBDRkdfRElTQUJMRV9ERlNfQ0hfU1dJVENIICAgICAgICAgICAgICAgICAiZ0Rpc2FibGVERlNDaFN3aXRjaCIKKyNkZWZpbmUgQ0ZHX0RJU0FCTEVfREZTX0NIX1NXSVRDSF9NSU4gICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19ESVNBQkxFX0RGU19DSF9TV0lUQ0hfTUFYICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRElTQUJMRV9ERlNfQ0hfU1dJVENIX0RFRkFVTFQgICAgICAgICAoMCkKKworI2RlZmluZSBDRkdfRU5BQkxFX0RGU19NQVNURVJfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICJnRW5hYmxlREZTTWFzdGVyQ2FwIgorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19NQVNURVJfQ0FQQUJJTElUWV9NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19NQVNURVJfQ0FQQUJJTElUWV9NQVggICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19NQVNURVJfQ0FQQUJJTElUWV9ERUZBVUxUICAgICAgICgwKQorCisjZGVmaW5lIENGR19TQVBfUFJFRkVSUkVEX0NIQU5ORUxfTE9DQVRJT04gICAgICAgICAgImdTYXBQcmVmZXJyZWRDaGFuTG9jYXRpb24iCisjZGVmaW5lIENGR19TQVBfUFJFRkVSUkVEX0NIQU5ORUxfTE9DQVRJT05fTUlOICAgICAgKDApCisjZGVmaW5lIENGR19TQVBfUFJFRkVSUkVEX0NIQU5ORUxfTE9DQVRJT05fTUFYICAgICAgKDIpCisjZGVmaW5lIENGR19TQVBfUFJFRkVSUkVEX0NIQU5ORUxfTE9DQVRJT05fREVGQVVMVCAgKDApCisKKyNkZWZpbmUgQ0ZHX0RJU0FCTEVfREZTX0pBUEFOX1c1MyAgICAgICAgICAgICAgICAgICAgICAiZ0Rpc2FibGVEZnNKYXBhblc1MyIKKyNkZWZpbmUgQ0ZHX0RJU0FCTEVfREZTX0pBUEFOX1c1M19NSU4gICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0RJU0FCTEVfREZTX0pBUEFOX1c1M19NQVggICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0RJU0FCTEVfREZTX0pBUEFOX1c1M19ERUZBVUxUICAgICAgICAgICAgICAoMCkKKworI2RlZmluZSBDRkdfRU5BQkxFX0RGU19QSFlFUlJfRklMVEVST0ZGTE9BRF9OQU1FICAgICAgICJkZnNQaHllcnJGaWx0ZXJPZmZsb2FkIgorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19QSFlFUlJfRklMVEVST0ZGTE9BRF9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19QSFlFUlJfRklMVEVST0ZGTE9BRF9NQVggICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19QSFlFUlJfRklMVEVST0ZGTE9BRF9ERUZBVUxUICAgICgwKQorCisjZGVmaW5lIENGR19SRVBPUlRfTUFYX0xJTktfU1BFRUQgICAgICAgICAgICAgICAgICAiZ1JlcG9ydE1heExpbmtTcGVlZCIKKyNkZWZpbmUgQ0ZHX1JFUE9SVF9NQVhfTElOS19TUEVFRF9NSU4gICAgICAgICAgICAgIChlSEREX0xJTktfU1BFRURfUkVQT1JUX0FDVFVBTCkKKyNkZWZpbmUgQ0ZHX1JFUE9SVF9NQVhfTElOS19TUEVFRF9NQVggICAgICAgICAgICAgIChlSEREX0xJTktfU1BFRURfUkVQT1JUX01BWF9TQ0FMRUQpCisjZGVmaW5lIENGR19SRVBPUlRfTUFYX0xJTktfU1BFRURfREVGQVVMVCAgICAgICAgICAoZUhERF9MSU5LX1NQRUVEX1JFUE9SVF9NQVhfU0NBTEVEKQorCisvKgorICogUlNTSSBUaHJlc2hvbGRzCisgKiBVc2VkIHdoZW4gZUhERF9MSU5LX1NQRUVEX1JFUE9SVF9TQ0FMRUQgaXMgc2VsZWN0ZWQKKyAqLworI2RlZmluZSBDRkdfTElOS19TUEVFRF9SU1NJX0hJR0ggICAgICAgICAgICAgICAgICAgImdMaW5rU3BlZWRSc3NpSGlnaCIKKyNkZWZpbmUgQ0ZHX0xJTktfU1BFRURfUlNTSV9ISUdIX01JTiAgICAgICAgICAgICAgICgtMTI3KQorI2RlZmluZSBDRkdfTElOS19TUEVFRF9SU1NJX0hJR0hfTUFYICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19MSU5LX1NQRUVEX1JTU0lfSElHSF9ERUZBVUxUICAgICAgICAgICAoLTU1KQorCisjZGVmaW5lIENGR19MSU5LX1NQRUVEX1JTU0lfTUlEICAgICAgICAgICAgICAgICAgICAiZ0xpbmtTcGVlZFJzc2lNZWQiCisjZGVmaW5lIENGR19MSU5LX1NQRUVEX1JTU0lfTUlEX01JTiAgICAgICAgICAgICAgICAoLTEyNykKKyNkZWZpbmUgQ0ZHX0xJTktfU1BFRURfUlNTSV9NSURfTUFYICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfTElOS19TUEVFRF9SU1NJX01JRF9ERUZBVUxUICAgICAgICAgICAgKC02NSkKKworI2RlZmluZSBDRkdfTElOS19TUEVFRF9SU1NJX0xPVyAgICAgICAgICAgICAgICAgICAgImdMaW5rU3BlZWRSc3NpTG93IgorI2RlZmluZSBDRkdfTElOS19TUEVFRF9SU1NJX0xPV19NSU4gICAgICAgICAgICAgICAgKC0xMjcpCisjZGVmaW5lIENGR19MSU5LX1NQRUVEX1JTU0lfTE9XX01BWCAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0xJTktfU1BFRURfUlNTSV9MT1dfREVGQVVMVCAgICAgICAgICAgICgtODApCisKKyNkZWZpbmUgQ0ZHX1AyUF9ERVZJQ0VfQUREUkVTU19BRE1JTklTVFJBVEVEX05BTUUgICAgICAgICAgICAgICAgImlzUDJwRGV2aWNlQWRkckFkbWluaXN0cmF0ZWQiCisjZGVmaW5lIENGR19QMlBfREVWSUNFX0FERFJFU1NfQURNSU5JU1RSQVRFRF9NSU4gICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUDJQX0RFVklDRV9BRERSRVNTX0FETUlOSVNUUkFURURfTUFYICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1AyUF9ERVZJQ0VfQUREUkVTU19BRE1JTklTVFJBVEVEX0RFRkFVTFQgICAgICAgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TU1IgICAgICAgICAgICAgICAgICAgICAgImdFbmFibGVTU1IiCisjZGVmaW5lIENGR19FTkFCTEVfU1NSX01JTiAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX1NTUl9NQVggICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TU1JfREVGQVVMVCAgICAgICAgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9PVkVSTEFQX0NIICAgICAgICAgICAgICAgImdFbmFibGVPdmVyTGFwQ2giCisjZGVmaW5lIENGR19FTkFCTEVfT1ZFUkxBUF9DSF9NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX09WRVJMQVBfQ0hfTUFYICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9PVkVSTEFQX0NIX0RFRkFVTFQgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX1BQU19FTkFCTEVfNUdfRUJUICAgICAgICAgICAgICAgICAiZ0VuYWJsZTVnRUJUIgorI2RlZmluZSBDRkdfUFBTX0VOQUJMRV81R19FQlRfRkVBVFVSRV9NSU4gICAgICgwKQorI2RlZmluZSBDRkdfUFBTX0VOQUJMRV81R19FQlRfRkVBVFVSRV9NQVggICAgICgxKQorI2RlZmluZSBDRkdfUFBTX0VOQUJMRV81R19FQlRfRkVBVFVSRV9ERUZBVUxUICgwKQorCisjZGVmaW5lIENGR19FTkFCTEVfTUVNT1JZX0RFRVBfU0xFRVAgICAgICAgICAgImdFbmFibGVNZW1EZWVwU2xlZXAiCisjZGVmaW5lIENGR19FTkFCTEVfTUVNT1JZX0RFRVBfU0xFRVBfTUlOICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfTUVNT1JZX0RFRVBfU0xFRVBfTUFYICAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfTUVNT1JZX0RFRVBfU0xFRVBfREVGQVVMVCAgKDEpCisKKy8qIEluIGNmZy5kYXQgMT0xTUJQUywgMj0yTUJQUywgMz01XzVNQlBTLCA0PTExTUJQUywgNT02TUJQUywgNj05TUJQUywKKyAqIDc9MTJNQlBTLCA4PTE4TUJQUywgOT0yNE1CUFMuIEJ1dCA2PTlNQlBTIGFuZCA4PTE4TUJQUyBhcmUgbm90IGJhc2ljCisgKiAxMWcgcmF0ZXMgYW5kIHNob3VsZCBub3QgYmUgc2V0IGJ5IGdEZWZhdWx0UmF0ZUluZGV4MjRHaHouCisgKi8KKworI2RlZmluZSBDRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0ggICAgICAgICAgICAgICAiZ0RlZmF1bHRSYXRlSW5kZXgyNEdoeiIKKyNkZWZpbmUgQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIX01JTiAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSF9NQVggICAgICAgICAgICg5KQorI2RlZmluZSBDRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0hfREVGQVVMVCAgICAgICAoMSkKKworI2RlZmluZSBDRkdfRU5BQkxFX1BBQ0tFVF9MT0cgICAgICAgICAgICAiZ0VuYWJsZVBhY2tldExvZyIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9QQUNLRVRfTE9HX01JTiAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfUEFDS0VUX0xPR19NQVggICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX1BBQ0tFVF9MT0dfREVGQVVMVCAgICAoMSkKKworLyogZ0Z3RGVidWdMb2dUeXBlIHRha2VzIHZhbHVlcyBmcm9tIGVudW0gZGJnbG9nX3Byb2Nlc3NfdCwKKyAqIG1ha2UgZGVmYXVsdCB2YWx1ZSBhcyBEQkdMT0dfUFJPQ0VTU19ORVRfUkFXIHRvIGdpdmUgdGhlCisgKiBsb2dzIHRvIG5ldCBsaW5rIHNpbmNlIGNuc3NfZGlhZyBzZXJ2aWNlIGlzIHN0YXJ0ZWQgYXQgYm9vdAorICogdGltZSBieSBkZWZhdWx0LgorICovCisjZGVmaW5lIENGR19FTkFCTEVfRldfTE9HX1RZUEUgICAgICAgICAgICAiZ0Z3RGVidWdMb2dUeXBlIgorI2RlZmluZSBDRkdfRU5BQkxFX0ZXX0xPR19UWVBFX01JTiAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfRldfTE9HX1RZUEVfTUFYICAgICAgICAoMjU1KQorI2RlZmluZSBDRkdfRU5BQkxFX0ZXX0xPR19UWVBFX0RFRkFVTFQgICAgKDMpCisKKy8qIGdGd0RlYnVnTG9nTGV2ZWwgdGFrZXMgdmFsdWVzIGZyb20gZW51bSBEQkdMT0dfTE9HX0xWTCwKKyAqIG1ha2UgZGVmYXVsdCB2YWx1ZSBhcyBEQkdMT0dfV0FSTiB0byBlbmFibGUgZXJyb3IgYW5kCisgKiB3YXJuaW5nIGxvZ3MgYnkgZGVmYXVsdC4KKyAqLworI2RlZmluZSBDRkdfRU5BQkxFX0ZXX0RFQlVHX0xPR19MRVZFTCAgICAgICAgICAiZ0Z3RGVidWdMb2dMZXZlbCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9GV19ERUJVR19MT0dfTEVWRUxfTUlOICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfRldfREVCVUdfTE9HX0xFVkVMX01BWCAgICAgICgyNTUpCisjZGVmaW5lIENGR19FTkFCTEVfRldfREVCVUdfTE9HX0xFVkVMX0RFRkFVTFQgICg0KQorCisvKiBGb3IgdmFsaWQgdmFsdWVzIG9mIGxvZyBsZXZlbHMgY2hlY2sgZW51bSBEQkdMT0dfTE9HX0xWTCBhbmQKKyAqIGZvciB2YWxpZCB2YWx1ZXMgb2YgbW9kdWxlIGlkcyBjaGVjayBlbnVtIFdMQU5fTU9EVUxFX0lELgorICovCisjZGVmaW5lIENGR19FTkFCTEVfRldfTU9EVUxFX0xPR19MRVZFTCAgICAiZ0Z3RGVidWdNb2R1bGVMb2dsZXZlbCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9GV19NT0RVTEVfTE9HX0RFRkFVTFQgICIiCisKKyNpZmRlZiBGRUFUVVJFX0dSRUVOX0FQCisjZGVmaW5lIENGR19FTkFCTEVfR1JFRU5fQVBfRkVBVFVSRSAgICAgICAgICJnRW5hYmxlR3JlZW5BcCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9HUkVFTl9BUF9GRUFUVVJFX01JTiAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfR1JFRU5fQVBfRkVBVFVSRV9NQVggICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0dSRUVOX0FQX0ZFQVRVUkVfREVGQVVMVCAoMSkKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MKKyNkZWZpbmUgQ0ZHX1NBUF9TQ0NfQ0hBTl9BVk9JREFOQ0UgICAgICAgICAiZ1NhcFNjY0NoYW5Bdm9pZGFuY2UiCisjZGVmaW5lIENGR19TQVBfU0NDX0NIQU5fQVZPSURBTkNFX01JTiAgICAgKDApCisjZGVmaW5lIENGR19TQVBfU0NDX0NIQU5fQVZPSURBTkNFX01BWCAgICAgKDEpCisjZGVmaW5lIENGR19TQVBfU0NDX0NIQU5fQVZPSURBTkNFX0RFRkFVTFQgKDApCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MgKi8KKworLyoKKyAqIENERiBUcmFjZSBFbmFibGUgQ29udHJvbAorICogTm90ZXM6CisgKiAgdGhlIE1JTi9NQVgvREVGQVVMVCB2YWx1ZXMgYXBwbHkgZm9yIGFsbCBtb2R1bGVzCisgKiAgdGhlIERFRkFVTFQgdmFsdWUgaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UuICBpZiB0aGUgREVGQVVMVAorICogICAgdmFsdWUgaXMgbm90IG92ZXJyaWRkZW4sIHRoZW4gbm8gY2hhbmdlIHdpbGwgYmUgbWFkZSB0byB0aGUKKyAqICAgICJidWlsdCBpbiIgZGVmYXVsdCB2YWx1ZXMgY29tcGlsZWQgaW50byB0aGUgY29kZQorICogIHZhbHVlcyBhcmUgYSBiaXRtYXAgaW5kaWNhdGluZyB3aGljaCBsb2cgbGV2ZWxzIGFyZSB0byBlbmFibGVkCisgKiAgICAobXVzdCBtYXRjaCBvcmRlciBvZiBjZGZfdHJhY2VfbGV2ZWwgZW51bWVyYXRpb25zKQorICogICAgMDAwMDAwMDEgIEZBVEFMCisgKiAgICAwMDAwMDAxMCAgRVJST1IKKyAqICAgIDAwMDAwMTAwICBXQVJOCisgKiAgICAwMDAwMTAwMCAgSU5GTworICogICAgMDAwMTAwMDAgIElORk8gSElHSAorICogICAgMDAxMDAwMDAgIElORk8gTUVECisgKiAgICAwMTAwMDAwMCAgSU5GTyBMT1cKKyAqICAgIDEwMDAwMDAwICBERUJVRworICoKKyAqICBoZW5jZSBhIHZhbHVlIG9mIDB4RkYgd291bGQgc2V0IGFsbCBiaXRzIChlbmFibGUgYWxsIGxvZ3MpCisgKi8KKworI2RlZmluZSBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9XRElfTkFNRSAgICAgImNkZl90cmFjZV9lbmFibGVfd2RpIgorI2RlZmluZSBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9IRERfTkFNRSAgICAgImNkZl90cmFjZV9lbmFibGVfaGRkIgorI2RlZmluZSBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9TTUVfTkFNRSAgICAgImNkZl90cmFjZV9lbmFibGVfc21lIgorI2RlZmluZSBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9QRV9OQU1FICAgICAgImNkZl90cmFjZV9lbmFibGVfcGUiCisjZGVmaW5lIENGR19DREZfVFJBQ0VfRU5BQkxFX1BNQ19OQU1FICAgICAiY2RmX3RyYWNlX2VuYWJsZV9wbWMiCisjZGVmaW5lIENGR19DREZfVFJBQ0VfRU5BQkxFX1dNQV9OQU1FICAgICAiY2RmX3RyYWNlX2VuYWJsZV93bWEiCisjZGVmaW5lIENGR19DREZfVFJBQ0VfRU5BQkxFX1NZU19OQU1FICAgICAiY2RmX3RyYWNlX2VuYWJsZV9zeXMiCisjZGVmaW5lIENGR19DREZfVFJBQ0VfRU5BQkxFX0NERl9OQU1FICAgICAiY2RmX3RyYWNlX2VuYWJsZV9jZGYiCisjZGVmaW5lIENGR19DREZfVFJBQ0VfRU5BQkxFX1NBUF9OQU1FICAgICAiY2RmX3RyYWNlX2VuYWJsZV9zYXAiCisjZGVmaW5lIENGR19DREZfVFJBQ0VfRU5BQkxFX0hERF9TQVBfTkFNRSAiY2RmX3RyYWNlX2VuYWJsZV9oZGRfc2FwIgorI2RlZmluZSBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9CTUlfTkFNRSAgICAgImNkZl90cmFjZV9lbmFibGVfYm1pIgorCisjZGVmaW5lIENGR19DREZfVFJBQ0VfRU5BQkxFX01JTiAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0NERl9UUkFDRV9FTkFCTEVfTUFYICAgICAgICAgICgweGZmKQorI2RlZmluZSBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9ERUZBVUxUICAgICAgKDB4ZmZmZikKKworI2RlZmluZSBIRERfTUNBU1RCQ0FTVEZJTFRFUl9GSUxURVJfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBIRERfTUNBU1RCQ0FTVEZJTFRFUl9GSUxURVJfQUxMX01VTFRJQ0FTVCAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBIRERfTUNBU1RCQ0FTVEZJTFRFUl9GSUxURVJfQUxMX0JST0FEQ0FTVCAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBIRERfTUNBU1RCQ0FTVEZJTFRFUl9GSUxURVJfQUxMX01VTFRJQ0FTVF9CUk9BRENBU1QgICAgMHgwMworI2RlZmluZSBIRERfTVVMVElDQVNUX0ZJTFRFUl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBIRERfTVVMVElDQVNUX0ZJTFRFUl9MSVNUX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgMHgwNQorCisvKkJNUFMgTG9naWMKKyAqIE5vdGVzOgorICogMSAtIFRoZW4gSG9zdCBkcml2ZXIgYW5kIGFib3ZlIGxheWVycyBjb250cm9sIHRoZSBQUyBtZWNoYW5pc20KKyAqIDAgLSBEaXZlci9Db3JlIFN0YWNrIGludGVybmFsbHkgY29udHJvbCB0aGUgUG93ZXIgc2F2aW5nIG1lY2hhbmlzbQorICovCisjZGVmaW5lIENGR19BTkRSSU9EX1BPV0VSX1NBVkVfTkFNRSAgICAgICJpc0FuZHJvaWRQc0VuIgorI2RlZmluZSBDRkdfQU5EUklPRF9QT1dFUl9TQVZFX01JTiAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0FORFJJT0RfUE9XRVJfU0FWRV9NQVggICAgICAgKDEpCisjZGVmaW5lIENGR19BTkRSSU9EX1BPV0VSX1NBVkVfREVGQVVMVCAgICgwKQorCisvKgorICogRW5hYmxlIER5bmFtaWMgRFRJTQorICogT3B0aW9ucworICogMCAtRGlzYWJsZSBEeW5hbWljRFRJTQorICogMSB0byA1IC0gU0xNIHdpbGwgc3dpdGNoIHRvIERUSU0gc3BlY2lmaWVkIGhlcmUgd2hlbiBob3N0IHN1c3BlbmRzIGFuZAorICogICAgICAgICAgc3dpdGNoIERUSU0xIHdoZW4gaG9zdCByZXN1bWVzICovCisjZGVmaW5lIENGR19FTkFCTEVfRFlOQU1JQ19EVElNX05BTUUgICAgICAgICAgICAiZ0VuYWJsZUR5bmFtaWNEVElNIgorI2RlZmluZSBDRkdfRU5BQkxFX0RZTkFNSUNfRFRJTV9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0RZTkFNSUNfRFRJTV9NQVggICAgICAgICg1KQorI2RlZmluZSBDRkdfRU5BQkxFX0RZTkFNSUNfRFRJTV9ERUZBVUxUICAgICgwKQorCisvKgorICogRW5hYmxlIEZpcnN0IFNjYW4gMkcgT25seQorICogT3B0aW9ucworICogMCAtIERpc2FibGUgRmlyc3QgU2NhbiAyRyBPcHRpb24KKyAqIDEgLSBFbmFibGUgRmlyc3QgU2NhbiAyRyBPcHRpb24KKyAqLworI2RlZmluZSBDRkdfRU5BQkxFX0ZJUlNUX1NDQU5fMkdfT05MWV9OQU1FICAgICAgICAgICAgImdFbmFibGVGaXJzdFNjYW4yR09ubHkiCisjZGVmaW5lIENGR19FTkFCTEVfRklSU1RfU0NBTl8yR19PTkxZX01JTiAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfRklSU1RfU0NBTl8yR19PTkxZX01BWCAgICAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfRklSU1RfU0NBTl8yR19PTkxZX0RFRkFVTFQgICAgKDApCisKKy8qCisgKiBEcml2ZXIgRm9yY2UgQUNTIGlzIHJlaW50cm9kdWNlZCBmb3IgYW5kcm9pZCBTQVAgbGVnYWN5IGNvbmZpZ3VyYXRpb24gbWV0aG9kLgorICogSWYgRHJpdmVyIGZvcmNlIGFjcyBpcyBlbmFibGVkLCBjaGFubmVsLyBodyBjb25maWcgZnJvbSBob3N0YXBkIGlzIGlnbm9yZWQuCisgKiBEcml2ZXIgdXNlcyBJTkkgcGFyYW1zIGRvdDExTW9kZSwgY2hhbm5lbCBib25kaW5nIG1vZGUgYW5kIHZodCBjaGFuIHdpZHRoCisgKiB0byBkZXJpdmUgQUNTIEhXIG1vZGUgYW5kIG9wZXJhdGluZyBCVy4KKyAqCisgKiBOb24gYW5kcm9pZCBwbGF0Zm9ybXMgc2hhbGwgbm90IHVzZSBmb3JjZSBBQ1MgbWV0aG9kIGFuZCByZWx5IG9uIGhvc3RhcGQKKyAqIGRyaXZlbiBBQ1MgbWV0aG9kIGZvciBjb25jdXJyZW50IFNBUCBBQ1MgY29uZmlndXJhdGlvbiwgT0JTUyBldGMuCisgKi8KKyNkZWZpbmUgQ0ZHX0ZPUkNFX1NBUF9BQ1MgICAgICAgICAgICAgICAgICAiZ0FwQXV0b0NoYW5uZWxTZWxlY3Rpb24iCisjZGVmaW5lIENGR19GT1JDRV9TQVBfQUNTX01JTiAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19GT1JDRV9TQVBfQUNTX01BWCAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19GT1JDRV9TQVBfQUNTX0RFRkFVTFQgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0ZPUkNFX1NBUF9BQ1NfU1RBUlRfQ0ggICAgICAgICAiZ0FQQ2hhbm5lbFNlbGVjdFN0YXJ0Q2hhbm5lbCIKKyNkZWZpbmUgQ0ZHX0ZPUkNFX1NBUF9BQ1NfU1RBUlRfQ0hfTUlOICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0ZPUkNFX1NBUF9BQ1NfU1RBUlRfQ0hfTUFYICAgICAoMHhGRikKKyNkZWZpbmUgQ0ZHX0ZPUkNFX1NBUF9BQ1NfU1RBUlRfQ0hfREVGQVVMVCAoMSkKKworI2RlZmluZSBDRkdfRk9SQ0VfU0FQX0FDU19FTkRfQ0ggICAgICAgICAgICJnQVBDaGFubmVsU2VsZWN0RW5kQ2hhbm5lbCIKKyNkZWZpbmUgQ0ZHX0ZPUkNFX1NBUF9BQ1NfRU5EX0NIX01JTiAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0ZPUkNFX1NBUF9BQ1NfRU5EX0NIX01BWCAgICAgICAoMHhGRikKKyNkZWZpbmUgQ0ZHX0ZPUkNFX1NBUF9BQ1NfRU5EX0NIX0RFRkFVTFQgICAoMTEpCisKKy8qCisgKiBTa2lwIERGUyBDaGFubmVsIGluIGNhc2Ugb2YgUDJQIFNlYXJjaAorICogT3B0aW9ucworICogMCAtIERvbid0IFNraXAgREZTIENoYW5uZWwgaW4gY2FzZSBvZiBQMlAgU2VhcmNoCisgKiAxIC0gU2tpcCBERlMgQ2hhbm5lbCBpbiBjYXNlIG9mIFAyUCBTZWFyY2gKKyAqLworI2RlZmluZSBDRkdfRU5BQkxFX1NLSVBfREZTX0lOX1AyUF9TRUFSQ0hfTkFNRSAgICAgICAiZ1NraXBEZnNDaGFubmVsSW5QMnBTZWFyY2giCisjZGVmaW5lIENGR19FTkFCTEVfU0tJUF9ERlNfSU5fUDJQX1NFQVJDSF9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX1NLSVBfREZTX0lOX1AyUF9TRUFSQ0hfTUFYICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TS0lQX0RGU19JTl9QMlBfU0VBUkNIX0RFRkFVTFQgICAgKDEpCisKKy8qCisgKiBJZ25vcmUgRHluYW1pYyBEdGltIGluIGNhc2Ugb2YgUDJQCisgKiBPcHRpb25zCisgKiAwIC0gQ29uc2lkZXIgRHluYW1pYyBEdGltIGluY2FzZSBvZiBQMlAKKyAqIDEgLSBJZ25vcmUgRHluYW1pYyBEdGltIGluY2FzZSBvZiBQMlAKKyAqLworI2RlZmluZSBDRkdfSUdOT1JFX0RZTkFNSUNfRFRJTV9JTl9QMlBfTU9ERV9OQU1FICAgICAgICJnSWdub3JlRHluYW1pY0R0aW1JblAycE1vZGUiCisjZGVmaW5lIENGR19JR05PUkVfRFlOQU1JQ19EVElNX0lOX1AyUF9NT0RFX01JTiAgICAgICAgKDApCisjZGVmaW5lIENGR19JR05PUkVfRFlOQU1JQ19EVElNX0lOX1AyUF9NT0RFX01BWCAgICAgICAgKDEpCisjZGVmaW5lIENGR19JR05PUkVfRFlOQU1JQ19EVElNX0lOX1AyUF9NT0RFX0RFRkFVTFQgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9BVVRPTUFUSUNfVFhfUE9XRVJfQ09OVFJPTF9OQU1FICAiZ0VuYWJsZUF1dG9tYXRpY1R4UG93ZXJDb250cm9sIgorI2RlZmluZSBDRkdfRU5BQkxFX0FVVE9NQVRJQ19UWF9QT1dFUl9DT05UUk9MX01JTiAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfQVVUT01BVElDX1RYX1BPV0VSX0NPTlRST0xfTUFYICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9BVVRPTUFUSUNfVFhfUE9XRVJfQ09OVFJPTF9ERUZBVUxUICAgICgxKQorCisjZGVmaW5lIENGR19TSE9SVF9HSV80ME1IWl9OQU1FICAgICAgICAgICAgICAgICJnU2hvcnRHSTQwTWh6IgorI2RlZmluZSBDRkdfU0hPUlRfR0lfNDBNSFpfTUlOICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENGR19TSE9SVF9HSV80ME1IWl9NQVggICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0ZHX1NIT1JUX0dJXzQwTUhaX0RFRkFVTFQgICAgICAgICAgICAgMQorCisvKgorICogRW5hYmxlIC8gRGlzYWJsZSBNQ0MgZmVhdHVyZQorICogRGVmYXVsdDogRW5hYmxlCisgKi8KKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NQ0NfRU5BQkxFRF9OQU1FICAgICAgICAgICAgICJnRW5hYmxlTUNDTW9kZSIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NQ0NfRU5BQkxFRF9NSU4gICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX01DQ19FTkFCTEVEX01BWCAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfTUNDX0VOQUJMRURfREVGQVVMVCAgICAgICAgICAoMSkKKworLyoKKyAqIEFsbG93IEdPIGluIE1DQyBtb2RlIHRvIGFjY2VwdCBkaWZmZXJlbnQgYmVhY29uIGludGVydmFsIHRoYW4gU1RBJ3MuCisgKiBBZGRlZCBmb3IgV2ktRmkgQ2VydC4gNS4xLjEyCisgKiBEZWZhdWx0OiBnQWxsb3dNQ0NHT0RpZmZCSSA9IDIKKyAqIElmIGdBbGxvd01DQ0dPRGlmZkJJID0gMSAgLy8gU2V0IHRvIDEgZm9yIFdGQSBjZXJ0aWZpY2F0aW9uLiBHTyBCZWFjb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgaXMgbm90IGNoYW5nZWQuIE1DQyBHTworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2Vzbid0IHdvcmsgd2VsbCBpbiBvcHRpbWl6ZWQgd2F5LgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiB3b3JzdCBzY2VuYXJpbywgaXQgbWF5IGludml0ZSBTVEEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGlvbi4KKyAqIGdBbGxvd01DQ0dPRGlmZkJJID0gMiAgICAgLy9JZiBzZXQgdG8gMiB3b3JrYXJvdW5kIDEgZGlzYXNzb2MgYWxsIHRoZSBjbGllbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVwZGF0ZSBiZWFjb24gSW50ZXJ2YWwKKyAqIGdBbGxvd01DQ0dPRGlmZkJJID0gMyAgICAgLy9JZiBzZXQgdG8gMyB0ZWFyIGRvd24gdGhlIFAyUCBsaW5rIGluIGF1dG8vCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uLWF1dG9ub21vdXMgLUdPIGNhc2UKKyAqIGdBbGxvd01DQ0dPRGlmZkJJID0gNCAgICAgLy9JZiBzZXQgdG8gNCBkb24ndCBkaXNjb25uZWN0IHRoZSBQMlAgY2xpZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXV0b25vbW91cy9Ob24tYXV0b25vbW91cyAtR08gY2FzZSB1cGRhdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQkkgZHluYW1pY2FsbHkKKyAqLworI2RlZmluZSBDRkdfQUxMT1dfTUNDX0dPX0RJRkZfQklfTkFNRSAgICAgICAgICAgImdBbGxvd01DQ0dPRGlmZkJJIgorI2RlZmluZSBDRkdfQUxMT1dfTUNDX0dPX0RJRkZfQklfTUlOICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19BTExPV19NQ0NfR09fRElGRl9CSV9NQVggICAgICAgICAgICAoNCkKKyNkZWZpbmUgQ0ZHX0FMTE9XX01DQ19HT19ESUZGX0JJX0RFRkFVTFQgICAgICAgICg0KQorCisvKgorICogRW5hYmxlL0Rpc2FibGUgVGhlcm1hbCBNaXRpZ2F0aW9uIGZlYXR1cmUKKyAqIERlZmF1bHQ6IEVuYWJsZQorICovCisjZGVmaW5lIENGR19USEVSTUFMX01JR1JBVElPTl9FTkFCTEVfTkFNRSAgICAgICJnVGhlcm1hbE1pdGlnYXRpb25FbmFibGUiCisjZGVmaW5lIENGR19USEVSTUFMX01JR1JBVElPTl9FTkFCTEVfTUlOICAgICAgICgwKQorI2RlZmluZSBDRkdfVEhFUk1BTF9NSUdSQVRJT05fRU5BQkxFX01BWCAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1RIRVJNQUxfTUlHUkFUSU9OX0VOQUJMRV9ERUZBVUxUICAgKDEpCisKKyNkZWZpbmUgQ0ZHX1RIUk9UVExFX1BFUklPRF9OQU1FICAgICAgICAgICAgICAgImdUaHJvdHRsZVBlcmlvZCIKKyNkZWZpbmUgQ0ZHX1RIUk9UVExFX1BFUklPRF9NSU4gICAgICAgICAgICAgICAgKDEwKQorI2RlZmluZSBDRkdfVEhST1RUTEVfUEVSSU9EX01BWCAgICAgICAgICAgICAgICAoMTAwMDApCisjZGVmaW5lIENGR19USFJPVFRMRV9QRVJJT0RfREVGQVVMVCAgICAgICAgICAgICg0MDAwKQorCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUlOX0xFVkVMMF9OQU1FICAgICAgImdUaGVybWFsVGVtcE1pbkxldmVsMCIKKyNkZWZpbmUgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwwX01JTiAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwwX01BWCAgICAgICAoMTAwMCkKKyNkZWZpbmUgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwwX0RFRkFVTFQgICAoMCkKKworI2RlZmluZSBDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDBfTkFNRSAgICAgICJnVGhlcm1hbFRlbXBNYXhMZXZlbDAiCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUFYX0xFVkVMMF9NSU4gICAgICAgKDApCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUFYX0xFVkVMMF9NQVggICAgICAgKDEwMDApCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUFYX0xFVkVMMF9ERUZBVUxUICAgKDkwKQorCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUlOX0xFVkVMMV9OQU1FICAgICAgImdUaGVybWFsVGVtcE1pbkxldmVsMSIKKyNkZWZpbmUgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwxX01JTiAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwxX01BWCAgICAgICAoMTAwMCkKKyNkZWZpbmUgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwxX0RFRkFVTFQgICAoNzApCisKKyNkZWZpbmUgQ0ZHX1RIRVJNQUxfVEVNUF9NQVhfTEVWRUwxX05BTUUgICAgICAiZ1RoZXJtYWxUZW1wTWF4TGV2ZWwxIgorI2RlZmluZSBDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDFfTUlOICAgICAgICgwKQorI2RlZmluZSBDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDFfTUFYICAgICAgICgxMDAwKQorI2RlZmluZSBDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDFfREVGQVVMVCAgICgxMTApCisKKyNkZWZpbmUgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwyX05BTUUgICAgICAiZ1RoZXJtYWxUZW1wTWluTGV2ZWwyIgorI2RlZmluZSBDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDJfTUlOICAgICAgICgwKQorI2RlZmluZSBDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDJfTUFYICAgICAgICgxMDAwKQorI2RlZmluZSBDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDJfREVGQVVMVCAgICg5MCkKKworI2RlZmluZSBDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDJfTkFNRSAgICAgICJnVGhlcm1hbFRlbXBNYXhMZXZlbDIiCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUFYX0xFVkVMMl9NSU4gICAgICAgKDApCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUFYX0xFVkVMMl9NQVggICAgICAgKDEwMDApCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUFYX0xFVkVMMl9ERUZBVUxUICAgKDEyNSkKKworI2RlZmluZSBDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDNfTkFNRSAgICAgICJnVGhlcm1hbFRlbXBNaW5MZXZlbDMiCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUlOX0xFVkVMM19NSU4gICAgICAgKDApCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUlOX0xFVkVMM19NQVggICAgICAgKDEwMDApCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUlOX0xFVkVMM19ERUZBVUxUICAgKDExMCkKKworI2RlZmluZSBDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDNfTkFNRSAgICAgICJnVGhlcm1hbFRlbXBNYXhMZXZlbDMiCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUFYX0xFVkVMM19NSU4gICAgICAgKDApCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUFYX0xFVkVMM19NQVggICAgICAgKDEwMDApCisjZGVmaW5lIENGR19USEVSTUFMX1RFTVBfTUFYX0xFVkVMM19ERUZBVUxUICAgKDApCisKKy8qCisgKiBFbmFibGUvRGlzYWJsZSBNb2R1bGF0ZWQgRFRJTSBmZWF0dXJlCisgKiBEZWZhdWx0OiBEaXNhYmxlCisgKi8KKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NT0RVTEFURURfRFRJTV9OQU1FICAgICAgICJnRW5hYmxlTW9kdWxhdGVkRFRJTSIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NT0RVTEFURURfRFRJTV9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX01PRFVMQVRFRF9EVElNX01BWCAgICAgICAgKDUpCisjZGVmaW5lIENGR19FTkFCTEVfTU9EVUxBVEVEX0RUSU1fREVGQVVMVCAgICAoMCkKKworLyoKKyAqIEVuYWJsZS9EaXNhYmxlIE11bHRpY2FzdCBNQUMgQWRkcmVzcyBMaXN0IGZlYXR1cmUKKyAqIERlZmF1bHQ6IERpc2FibGUKKyAqLworI2RlZmluZSBDRkdfTUNfQUREUl9MSVNUX0VOQUJMRV9OQU1FICAgICAgICAgICJnTUNBZGRyTGlzdEVuYWJsZSIKKyNkZWZpbmUgQ0ZHX01DX0FERFJfTElTVF9FTkFCTEVfTUlOICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX01DX0FERFJfTElTVF9FTkFCTEVfTUFYICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX01DX0FERFJfTElTVF9FTkFCTEVfREVGQVVMVCAgICAgICAoMCkKKworI2RlZmluZSBDRkdfRU5BQkxFX1JYX1NUQkMgICAgICAgICAgICAgICAgICAgICAgICJnRW5hYmxlUlhTVEJDIgorI2RlZmluZSBDRkdfRU5BQkxFX1JYX1NUQkNfTUlOICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX1JYX1NUQkNfTUFYICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX1JYX1NUQkNfREVGQVVMVCAgICAgICAgICAgICAgICgxKQorCisjZGVmaW5lIENGR19FTkFCTEVfVFhfU1RCQyAgICAgICAgICAgICAgICAgICAgICAgImdFbmFibGVUWFNUQkMiCisjZGVmaW5lIENGR19FTkFCTEVfVFhfU1RCQ19NSU4gICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfVFhfU1RCQ19NQVggICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfVFhfU1RCQ19ERUZBVUxUICAgICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9SWF9MRFBDICAgICAgICAgICAgICAgICAgICAgICAiZ0VuYWJsZVJYTERQQyIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9SWF9MRFBDX01JTiAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9SWF9MRFBDX01BWCAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9SWF9MRFBDX0RFRkFVTFQgICAgICAgICAgICAgICAoMCkKKworLyoKKyAqIEVuYWJsZS9EaXNhYmxlIHZzdGEgYmFzZWQgb24gTUFYIEFzc29jIGxpbWl0CisgKiBkZWZpbmVkIGluIFdDTlNTX3Fjb21fY2ZnLmluaS4KKyAqLworI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQorI2RlZmluZSBDRkdfVlNUQV9TVVBQT1JUX0VOQUJMRSAgICAgICAgICAgICAgICJnRW5hYmxlVlNUQVN1cHBvcnQiCisjZGVmaW5lIENGR19WU1RBX1NVUFBPUlRfRU5BQkxFX01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WU1RBX1NVUFBPUlRfRU5BQkxFX01BWCAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19WU1RBX1NVUFBPUlRfRU5BQkxFX0RFRkFVTFQgICAgICAgKDApCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisjZGVmaW5lIENGR19URExTX1NVUFBPUlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgImdFbmFibGVURExTU3VwcG9ydCIKKyNkZWZpbmUgQ0ZHX1RETFNfU1VQUE9SVF9FTkFCTEVfTUlOICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RETFNfU1VQUE9SVF9FTkFCTEVfTUFYICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1RETFNfU1VQUE9SVF9FTkFCTEVfREVGQVVMVCAgICAgICAgICAgICAoMCkKKworI2RlZmluZSBDRkdfVERMU19JTVBMSUNJVF9UUklHR0VSICAgICAgICAgICAgICAgICAgICJnRW5hYmxlVERMU0ltcGxpY2l0VHJpZ2dlciIKKyNkZWZpbmUgQ0ZHX1RETFNfSU1QTElDSVRfVFJJR0dFUl9NSU4gICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RETFNfSU1QTElDSVRfVFJJR0dFUl9NQVggICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1RETFNfSU1QTElDSVRfVFJJR0dFUl9ERUZBVUxUICAgICAgICAgICAoMCkKKworI2RlZmluZSBDRkdfVERMU19UWF9TVEFUU19QRVJJT0QgICAgICAgICAgICAgICAgICAgICJnVERMU1R4U3RhdHNQZXJpb2QiCisjZGVmaW5lIENGR19URExTX1RYX1NUQVRTX1BFUklPRF9NSU4gICAgICAgICAgICAgICAgKDEwKQorI2RlZmluZSBDRkdfVERMU19UWF9TVEFUU19QRVJJT0RfTUFYICAgICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VUwpCisjZGVmaW5lIENGR19URExTX1RYX1NUQVRTX1BFUklPRF9ERUZBVUxUICAgICAgICAgICAgKDUwMDApCisKKyNkZWZpbmUgQ0ZHX1RETFNfVFhfUEFDS0VUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAiZ1RETFNUeFBhY2tldFRocmVzaG9sZCIKKyNkZWZpbmUgQ0ZHX1RETFNfVFhfUEFDS0VUX1RIUkVTSE9MRF9NSU4gICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RETFNfVFhfUEFDS0VUX1RIUkVTSE9MRF9NQVggICAgICAgICAgICAoNDI5NDk2NzI5NVVMKQorI2RlZmluZSBDRkdfVERMU19UWF9QQUNLRVRfVEhSRVNIT0xEX0RFRkFVTFQgICAgICAgICgxMDApCisKKyNkZWZpbmUgQ0ZHX1RETFNfTUFYX0RJU0NPVkVSWV9BVFRFTVBUICAgICAgICAgICAgICAiZ1RETFNNYXhEaXNjb3ZlcnlBdHRlbXB0IgorI2RlZmluZSBDRkdfVERMU19NQVhfRElTQ09WRVJZX0FUVEVNUFRfTUlOICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfVERMU19NQVhfRElTQ09WRVJZX0FUVEVNUFRfTUFYICAgICAgICAgICgxMDApCisjZGVmaW5lIENGR19URExTX01BWF9ESVNDT1ZFUllfQVRURU1QVF9ERUZBVUxUICAgICAgKDUpCisKKyNkZWZpbmUgQ0ZHX1RETFNfSURMRV9QQUNLRVRfVEhSRVNIT0xEICAgICAgICAgICAgICAiZ1RETFNJZGxlUGFja2V0VGhyZXNob2xkIgorI2RlZmluZSBDRkdfVERMU19JRExFX1BBQ0tFVF9USFJFU0hPTERfTUlOICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfVERMU19JRExFX1BBQ0tFVF9USFJFU0hPTERfTUFYICAgICAgICAgICg0MDAwMCkKKyNkZWZpbmUgQ0ZHX1RETFNfSURMRV9QQUNLRVRfVEhSRVNIT0xEX0RFRkFVTFQgICAgICAoNSkKKworI2RlZmluZSBDRkdfVERMU19SU1NJX1RSSUdHRVJfVEhSRVNIT0xEICAgICAgICAgICAgICJnVERMU1JTU0lUcmlnZ2VyVGhyZXNob2xkIgorI2RlZmluZSBDRkdfVERMU19SU1NJX1RSSUdHRVJfVEhSRVNIT0xEX01JTiAgICAgICAgICgtMTIwKQorI2RlZmluZSBDRkdfVERMU19SU1NJX1RSSUdHRVJfVEhSRVNIT0xEX01BWCAgICAgICAgICgwKQorI2RlZmluZSBDRkdfVERMU19SU1NJX1RSSUdHRVJfVEhSRVNIT0xEX0RFRkFVTFQgICAgICgtNzUpCisKKyNkZWZpbmUgQ0ZHX1RETFNfUlNTSV9URUFSRE9XTl9USFJFU0hPTEQgICAgICAgICAgICAiZ1RETFNSU1NJVGVhcmRvd25UaHJlc2hvbGQiCisjZGVmaW5lIENGR19URExTX1JTU0lfVEVBUkRPV05fVEhSRVNIT0xEX01JTiAgICAgICAgKC0xMjApCisjZGVmaW5lIENGR19URExTX1JTU0lfVEVBUkRPV05fVEhSRVNIT0xEX01BWCAgICAgICAgKDApCisjZGVmaW5lIENGR19URExTX1JTU0lfVEVBUkRPV05fVEhSRVNIT0xEX0RFRkFVTFQgICAgKC03NSkKKworI2RlZmluZSBDRkdfVERMU19SU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICJnVERMU1JTU0lEZWx0YSIKKyNkZWZpbmUgQ0ZHX1RETFNfUlNTSV9ERUxUQV9NSU4gICAgICAgICAgICAgICAgICAgICAoLTMwKQorI2RlZmluZSBDRkdfVERMU19SU1NJX0RFTFRBX01BWCAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfVERMU19SU1NJX0RFTFRBX0RFRkFVTFQgICAgICAgICAgICAgICAgICgtMjApCisKKyNkZWZpbmUgQ0ZHX1RETFNfUU9TX1dNTV9VQVBTRF9NQVNLX05BTUUgICAgICAgICAgICAiZ1RETFNVYXBzZE1hc2siICAgIC8qIEFDcyB0byBzZXR1cCBVLUFQU0QgZm9yIFRETFMgU3RhICovCisjZGVmaW5lIENGR19URExTX1FPU19XTU1fVUFQU0RfTUFTS19NSU4gICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19URExTX1FPU19XTU1fVUFQU0RfTUFTS19NQVggICAgICAgICAgICAgKDB4MEYpCisjZGVmaW5lIENGR19URExTX1FPU19XTU1fVUFQU0RfTUFTS19ERUZBVUxUICAgICAgICAgKDB4MEYpCisKKyNkZWZpbmUgQ0ZHX1RETFNfQlVGRkVSX1NUQV9TVVBQT1JUX0VOQUJMRSAgICAgICAgICAiZ0VuYWJsZVRETFNCdWZmZXJTdGEiCisjZGVmaW5lIENGR19URExTX0JVRkZFUl9TVEFfU1VQUE9SVF9FTkFCTEVfTUlOICAgICAgKDApCisjZGVmaW5lIENGR19URExTX0JVRkZFUl9TVEFfU1VQUE9SVF9FTkFCTEVfTUFYICAgICAgKDEpCisvKiBCdWZmZXIgU1RBIGlzIG5vdCBlbmFibGVkIGluIENMRCAyLjAgeWV0ICovCisjZGVmaW5lIENGR19URExTX0JVRkZFUl9TVEFfU1VQUE9SVF9FTkFCTEVfREVGQVVMVCAgKDEpCisKKyNkZWZpbmUgQ0ZHX1RETFNfUFVBUFNEX0lOQUNUSVZJVFlfVElNRSAgICAgICAgICAgICAiZ1RETFNQdWFwc2RJbmFjdGl2aXR5VGltZSIKKyNkZWZpbmUgQ0ZHX1RETFNfUFVBUFNEX0lOQUNUSVZJVFlfVElNRV9NSU4gICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RETFNfUFVBUFNEX0lOQUNUSVZJVFlfVElNRV9NQVggICAgICAgICAoMTApCisjZGVmaW5lIENGR19URExTX1BVQVBTRF9JTkFDVElWSVRZX1RJTUVfREVGQVVMVCAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX1RETFNfUFVBUFNEX1JYX0ZSQU1FX1RIUkVTSE9MRCAgICAgICAgICAiZ1RETFNQdWFwc2RSeEZyYW1lVGhyZXNob2xkIgorI2RlZmluZSBDRkdfVERMU19QVUFQU0RfUlhfRlJBTUVfVEhSRVNIT0xEX01JTiAgICAgICgxMCkKKyNkZWZpbmUgQ0ZHX1RETFNfUFVBUFNEX1JYX0ZSQU1FX1RIUkVTSE9MRF9NQVggICAgICAoMjApCisjZGVmaW5lIENGR19URExTX1BVQVBTRF9SWF9GUkFNRV9USFJFU0hPTERfREVGQVVMVCAgKDEwKQorCisjZGVmaW5lIENGR19URExTX1BVQVBTRF9QRUVSX1RSQUZGSUNfSU5EX1dJTkRPVyAgICAgICAgICAiZ1RETFNQdWFwc2RQVElXaW5kb3ciCisjZGVmaW5lIENGR19URExTX1BVQVBTRF9QRUVSX1RSQUZGSUNfSU5EX1dJTkRPV19NSU4gICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1RETFNfUFVBUFNEX1BFRVJfVFJBRkZJQ19JTkRfV0lORE9XX01BWCAgICAgICg1KQorI2RlZmluZSBDRkdfVERMU19QVUFQU0RfUEVFUl9UUkFGRklDX0lORF9XSU5ET1dfREVGQVVMVCAgKDIpCisKKyNkZWZpbmUgQ0ZHX1RETFNfUFVBUFNEX1BFRVJfVFJBRkZJQ19SU1BfVElNRU9VVCAgICAgICAgICJnVERMU1B1YXBzZFBUUlRpbWVvdXQiCisjZGVmaW5lIENGR19URExTX1BVQVBTRF9QRUVSX1RSQUZGSUNfUlNQX1RJTUVPVVRfTUlOICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RETFNfUFVBUFNEX1BFRVJfVFJBRkZJQ19SU1BfVElNRU9VVF9NQVggICAgICgxMDAwMCkKKyNkZWZpbmUgQ0ZHX1RETFNfUFVBUFNEX1BFRVJfVFJBRkZJQ19SU1BfVElNRU9VVF9ERUZBVUxUICg1MDAwKQorCisjZGVmaW5lIENGR19URExTX0VYVEVSTkFMX0NPTlRST0wgICAgICAgICAgICAgICAgICAgImdURExTRXh0ZXJuYWxDb250cm9sIgorI2RlZmluZSBDRkdfVERMU19FWFRFUk5BTF9DT05UUk9MX01JTiAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfVERMU19FWFRFUk5BTF9DT05UUk9MX01BWCAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfVERMU19FWFRFUk5BTF9DT05UUk9MX0RFRkFVTFQgICAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19URExTX09GRl9DSEFOTkVMX1NVUFBPUlRfRU5BQkxFICAgICAgICAgICJnRW5hYmxlVERMU09mZkNoYW5uZWwiCisjZGVmaW5lIENGR19URExTX09GRl9DSEFOTkVMX1NVUFBPUlRfRU5BQkxFX01JTiAgICAgICgwKQorI2RlZmluZSBDRkdfVERMU19PRkZfQ0hBTk5FTF9TVVBQT1JUX0VOQUJMRV9NQVggICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1RETFNfT0ZGX0NIQU5ORUxfU1VQUE9SVF9FTkFCTEVfREVGQVVMVCAgKDApCisKKyNkZWZpbmUgQ0ZHX1RETFNfV01NX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgImdFbmFibGVURExTV21tTW9kZSIKKyNkZWZpbmUgQ0ZHX1RETFNfV01NX01PREVfRU5BQkxFX01JTiAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19URExTX1dNTV9NT0RFX0VOQUJMRV9NQVggICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfVERMU19XTU1fTU9ERV9FTkFCTEVfREVGQVVMVCAgICAgICAgICAgICAoMSkKKworI2RlZmluZSBDRkdfVERMU19QUkVGRVJSRURfT0ZGX0NIQU5ORUxfTlVNICAgICAgICAgICJnVERMU1ByZWZPZmZDaGFuTnVtIgorI2RlZmluZSBDRkdfVERMU19QUkVGRVJSRURfT0ZGX0NIQU5ORUxfTlVNX01JTiAgICAgICgxKQorI2RlZmluZSBDRkdfVERMU19QUkVGRVJSRURfT0ZGX0NIQU5ORUxfTlVNX01BWCAgICAgICgxNjUpCisjZGVmaW5lIENGR19URExTX1BSRUZFUlJFRF9PRkZfQ0hBTk5FTF9OVU1fREVGQVVMVCAgKDM2KQorCisjZGVmaW5lIENGR19URExTX1BSRUZFUlJFRF9PRkZfQ0hBTk5FTF9CVyAgICAgICAgICAgImdURExTUHJlZk9mZkNoYW5CYW5kd2lkdGgiCisjZGVmaW5lIENGR19URExTX1BSRUZFUlJFRF9PRkZfQ0hBTk5FTF9CV19NSU4gICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RETFNfUFJFRkVSUkVEX09GRl9DSEFOTkVMX0JXX01BWCAgICAgICgweDBGKQorI2RlZmluZSBDRkdfVERMU19QUkVGRVJSRURfT0ZGX0NIQU5ORUxfQldfREVGQVVMVCAgKDB4MDcpCisKKy8qIEVuYWJsZSBURExTIFNjYW46IEFsbG93IHNjYW4gYW5kIG1haW50YWluIFRETFMgbGluay4KKyAqICAwOiBJZiBwZWVyIGlzIG5vdCBidWZmZXIgU1RBIGNhcGFibGUgYW5kIGRldmljZSBpcyBub3Qgc2xlZXAgU1RBCisgKiAgICAgY2FwYWJsZSwgdGhlbiB0ZWFyZG93biBURExTIGxpbmsgd2hlbiBzY2FuIGlzIGluaXRpYXRlZC4gSWYgcGVlcgorICogICAgIGlzIGJ1ZmZlciBTVEEgYW5kIHdlIGNhbiBiZSBzbGVlcCBTVEEgdGhlbiBURExTIGxpbmsgaXMgbWFpbnRhaW5lZAorICogICAgIGR1cmluZyBzY2FuLgorICogIDE6IE1haW50YWluIFRETFMgbGluayBhbmQgYWxsb3cgc2NhbiBldmVuIGlmIHBlZXIgaXMgbm90IGJ1ZmZlciBTVEEKKyAqICAgICBjYXBhYmxlIGFuZCBkZXZpY2UgaXMgbm90IHNsZWVwIFNUQSBjYXBhYmxlLiBUaGVyZSB3aWxsIGJlIGxvc3Mgb2YKKyAqICAgICBSeCBwa3RzIHNpbmNlIHBlZXIgd291bGQgbm90IGtub3cgd2hlbiBkZXZpY2UgbW92ZXMgYXdheSBmcm9tIHRkbHMKKyAqICAgICBjaGFubmVsLiBUeCBvbiBURExTIGxpbmsgd291bGQgc3RvcCB3aGVuIGRldmljZSBtb3ZlcyBhd2F5IGZyb20gdGRscworICogICAgIGNoYW5uZWwuCisgKi8KKyNkZWZpbmUgQ0ZHX1RETFNfU0NBTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICJnRW5hYmxlVERMU1NjYW4iCisjZGVmaW5lIENGR19URExTX1NDQU5fRU5BQkxFX01JTiAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RETFNfU0NBTl9FTkFCTEVfTUFYICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfVERMU19TQ0FOX0VOQUJMRV9ERUZBVUxUICAgICAgICAgICAgICAgKDApCisjZW5kaWYKKworLyogRW5hYmxlL0Rpc2FibGUgTFBXUiBJbWFnZShjTUVNIHVCU1ApIFRyYW5zaXRpb24gKi8KKyNkZWZpbmUgQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OX05BTUUgICAgICAgICJnRW5hYmxlTHB3ckltZ1RyYW5zaXRpb24iCisjZGVmaW5lIENGR19FTkFCTEVfTFBXUl9JTUdfVFJBTlNJVElPTl9NSU4gICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OX01BWCAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0xQV1JfSU1HX1RSQU5TSVRJT05fREVGQVVMVCAgICAgKDApCisKKy8qCisgKiBTY2FuIEFnaW5nIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcworICovCisjZGVmaW5lIENGR19TQ0FOX0FHSU5HX1BBUkFNX05BTUUgICAgICAgICAgImdTY2FuQWdpbmdUaW1lIgorI2RlZmluZSBDRkdfU0NBTl9BR0lOR19QQVJBTV9NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfU0NBTl9BR0lOR19QQVJBTV9NQVggICAgICAgICAgICgyMDApCisjZGVmaW5lIENGR19TQ0FOX0FHSU5HX1BBUkFNX0RFRkFVTFQgICAgICAgKDYwKQorCisvKiBDb25maWcgUGFyYW0gdG8gZW5hYmxlIHRoZSB0eExkcGMgY2FwYWJpbGl0eQorICogMCAtIGRpc2FibGUKKyAqIDEgLSBIVCBMRFBDIGVuYWJsZQorICogMiAtIFZIVCBMRFBDIGVuYWJsZQorICogMyAtIEhUICYgVkhUIExEUEMgZW5hYmxlICovCisjZGVmaW5lIENGR19UWF9MRFBDX0VOQUJMRV9GRUFUVVJFICAgICAgICAgImdUeExkcGNFbmFibGUiCisjZGVmaW5lIENGR19UWF9MRFBDX0VOQUJMRV9GRUFUVVJFX01JTiAgICAgKDApCisjZGVmaW5lIENGR19UWF9MRFBDX0VOQUJMRV9GRUFUVVJFX01BWCAgICAgKDMpCisjZGVmaW5lIENGR19UWF9MRFBDX0VOQUJMRV9GRUFUVVJFX0RFRkFVTFQgKDApCisKKy8qCisgKiBFbmFibGUgLyBEaXNhYmxlIE1DQyBBZGFwdGl2ZSBTY2hlZHVsZXIgZmVhdHVyZQorICogRGVmYXVsdDogRW5hYmxlCisgKi8KKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NQ0NfQURBVElWRV9TQ0hFRFVMRVJfRU5BQkxFRF9OQU1FICAgICAgICAgICAgICJnRW5hYmxlTUNDQWRhcHRpdmVTY2hlZHVsZXIiCisjZGVmaW5lIENGR19FTkFCTEVfTUNDX0FEQVRJVkVfU0NIRURVTEVSX0VOQUJMRURfTUlOICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NQ0NfQURBVElWRV9TQ0hFRFVMRVJfRU5BQkxFRF9NQVggICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX01DQ19BREFUSVZFX1NDSEVEVUxFUl9FTkFCTEVEX0RFRkFVTFQgICAgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX1ZIVF9TVV9CRUFNRk9STUVFX0NBUF9GRUFUVVJFICAgICAgICAgImdUeEJGRW5hYmxlIgorI2RlZmluZSBDRkdfVkhUX1NVX0JFQU1GT1JNRUVfQ0FQX0ZFQVRVUkVfTUlOICAgICAoV05JX0NGR19WSFRfU1VfQkVBTUZPUk1FRV9DQVBfU1RBTUlOKQorI2RlZmluZSBDRkdfVkhUX1NVX0JFQU1GT1JNRUVfQ0FQX0ZFQVRVUkVfTUFYICAgICAoV05JX0NGR19WSFRfU1VfQkVBTUZPUk1FRV9DQVBfU1RBTUFYKQorI2RlZmluZSBDRkdfVkhUX1NVX0JFQU1GT1JNRUVfQ0FQX0ZFQVRVUkVfREVGQVVMVCAoV05JX0NGR19WSFRfU1VfQkVBTUZPUk1FRV9DQVBfU1RBREVGKQorCisjZGVmaW5lIENGR19WSFRfQ1NOX0JFQU1GT1JNRUVfQU5UX1NVUFBPUlRFRCAgICAgICAgICJnVHhCRkNzblZhbHVlIgorI2RlZmluZSBDRkdfVkhUX0NTTl9CRUFNRk9STUVFX0FOVF9TVVBQT1JURURfTUlOICAgICAoV05JX0NGR19WSFRfQ1NOX0JFQU1GT1JNRUVfQU5UX1NVUFBPUlRFRF9TVEFNSU4pCisjZGVmaW5lIENGR19WSFRfQ1NOX0JFQU1GT1JNRUVfQU5UX1NVUFBPUlRFRF9NQVggICAgIChXTklfQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVEX1NUQU1BWCAtIDEpCisjZGVmaW5lIENGR19WSFRfQ1NOX0JFQU1GT1JNRUVfQU5UX1NVUFBPUlRFRF9ERUZBVUxUIChXTklfQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVEX1NUQU1BWCAtIDEpCisKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfVFhCRl9JTl8yME1IWiAgICAgICAgICAgICAgICJnRW5hYmxlVHhCRmluMjBNSHoiCisjZGVmaW5lIENGR19WSFRfRU5BQkxFX1RYQkZfSU5fMjBNSFpfTUlOICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfVFhCRl9JTl8yME1IWl9NQVggICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9UWEJGX0lOXzIwTUhaX0RFRkFVTFQgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX1ZIVF9FTkFCTEVfVFhfU1VfQkVBTV9GT1JNRVIgICAgICAgICAiZ0VuYWJsZVR4U1VCZWFtZm9ybWVyIgorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9UWF9TVV9CRUFNX0ZPUk1FUl9NSU4gICAgICgwKQorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9UWF9TVV9CRUFNX0ZPUk1FUl9NQVggICAgICgxKQorI2RlZmluZSBDRkdfVkhUX0VOQUJMRV9UWF9TVV9CRUFNX0ZPUk1FUl9ERUZBVUxUICgwKQorCisvKiBFbmFibGUgZGVidWcgZm9yIHJlbWFpbiBvbiBjaGFubmVsIGlzc3VlcyAqLworI2RlZmluZSBDRkdfREVCVUdfUDJQX1JFTUFJTl9PTl9DSEFOTkVMX05BTUUgICAgImdEZWJ1Z1AycFJlbWFpbk9uQ2hhbm5lbCIKKyNkZWZpbmUgQ0ZHX0RFQlVHX1AyUF9SRU1BSU5fT05fQ0hBTk5FTF9ERUZBVUxUICgwKQorI2RlZmluZSBDRkdfREVCVUdfUDJQX1JFTUFJTl9PTl9DSEFOTkVMX01JTiAgICAgKDApCisjZGVmaW5lIENGR19ERUJVR19QMlBfUkVNQUlOX09OX0NIQU5ORUxfTUFYICAgICAoMSkKKworLyoKKyAqIFNBUCBBTExPVyBBbGwgQ2hhbm5lbHMKKyAqLworI2RlZmluZSBDRkdfU0FQX0FMTE9XX0FMTF9DSEFOTkVMX1BBUkFNX05BTUUgICAgICAgICAgImdTYXBBbGxvd0FsbENoYW5uZWwiCisjZGVmaW5lIENGR19TQVBfQUxMT1dfQUxMX0NIQU5ORUxfUEFSQU1fTUlOICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1NBUF9BTExPV19BTExfQ0hBTk5FTF9QQVJBTV9NQVggICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfU0FQX0FMTE9XX0FMTF9DSEFOTkVMX1BBUkFNX0RFRkFVTFQgICAgICAgKDApCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworI2RlZmluZSBDRkdfRElTQUJMRV9MRFBDX1dJVEhfVFhCRl9BUCAgICAgICAgICAgICAiZ0Rpc2FibGVMRFBDV2l0aFR4YmZBUCIKKyNkZWZpbmUgQ0ZHX0RJU0FCTEVfTERQQ19XSVRIX1RYQkZfQVBfTUlOICAgICAgICAgKDApCisjZGVmaW5lIENGR19ESVNBQkxFX0xEUENfV0lUSF9UWEJGX0FQX01BWCAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRElTQUJMRV9MRFBDX1dJVEhfVFhCRl9BUF9ERUZBVUxUICAgICAoMCkKKyNlbmRpZgorCisvKgorICogSUJTUyBPcGVyYXRpbmcgQ2hhbm5lbHMgZm9yIDIuNEcgYW5kIDVHSHogY2hhbm5lbHMKKyAqLworI2RlZmluZSBDRkdfSUJTU19BREhPQ19DSEFOTkVMXzVHSFpfTkFNRSAgICAgICAgICAiZ0FkSG9jQ2hhbm5lbDVHIgorI2RlZmluZSBDRkdfSUJTU19BREhPQ19DSEFOTkVMXzVHSFpfTUlOICAgICAgICAgICAoMzYpCisjZGVmaW5lIENGR19JQlNTX0FESE9DX0NIQU5ORUxfNUdIWl9NQVggICAgICAgICAgICgxNjUpCisjZGVmaW5lIENGR19JQlNTX0FESE9DX0NIQU5ORUxfNUdIWl9ERUZBVUxUICAgICAgICg0NCkKKworI2RlZmluZSBDRkdfSUJTU19BREhPQ19DSEFOTkVMXzI0R0haX05BTUUgICAgICAgICAiZ0FkSG9jQ2hhbm5lbDI0RyIKKyNkZWZpbmUgQ0ZHX0lCU1NfQURIT0NfQ0hBTk5FTF8yNEdIWl9NSU4gICAgICAgICAgKDEpCisjZGVmaW5lIENGR19JQlNTX0FESE9DX0NIQU5ORUxfMjRHSFpfTUFYICAgICAgICAgICgxNCkKKyNkZWZpbmUgQ0ZHX0lCU1NfQURIT0NfQ0hBTk5FTF8yNEdIWl9ERUZBVUxUICAgICAgKDYpCisKKy8qIFBhcmFtZXRlciB0byBjb250cm9sIFZIVCBzdXBwb3J0IGluIDIuNCBHSHogYmFuZCAqLworI2RlZmluZSBDRkdfRU5BQkxFX1ZIVF9GT1JfMjRHSFpfTkFNRSAgICAgICAgICAgICAiZ0VuYWJsZVZodEZvcjI0R0h6QmFuZCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9WSFRfRk9SXzI0R0haX01JTiAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfVkhUX0ZPUl8yNEdIWl9NQVggICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX1ZIVF9GT1JfMjRHSFpfREVGQVVMVCAgICAgICAgICAoMCkKKworI2RlZmluZSBDRkdfTUFYX01FRElVTV9USU1FICAgICAgICAgICAgICAgICAgICAgICJnTWF4TWVkaXVtVGltZSIKKyNkZWZpbmUgQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFNSU4gICAgICAgICAgICAgICBXTklfQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFNSU4KKyNkZWZpbmUgQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFNQVggICAgICAgICAgICAgICBXTklfQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFNQVgKKyNkZWZpbmUgQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFERUZBVUxUICAgICAgICAgICBXTklfQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFERUYKKworLyoKKyAqIEVuYWJsZSBsZWdhY3kgZmFzdCByb2FtaW5nIChMRlIpIG9uIFNUQSBsaW5rIGR1cmluZyBjb25jdXJyZW50IHNlc3Npb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0VOQUJMRV9GQVNUX1JPQU1fSU5fQ09OQ1VSUkVOQ1kgICAgICAgICAgImdFbmFibGVGYXN0Um9hbUluQ29uY3VycmVuY3kiCisjZGVmaW5lIENGR19FTkFCTEVfRkFTVF9ST0FNX0lOX0NPTkNVUlJFTkNZX01JTiAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0ZBU1RfUk9BTV9JTl9DT05DVVJSRU5DWV9NQVggICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9GQVNUX1JPQU1fSU5fQ09OQ1VSUkVOQ1lfREVGQVVMVCAgKDEpCisKKy8qCisgKiBGbGV4Q29ubmVjdFBvd2VyRmFjdG9yIHBhcmFtZXRlcgorICogRGVmYXVsdDogRGlzYWJsZSAoMCkKKyAqLworI2RlZmluZSBDRkdfRkxFWF9DT05ORUNUX1BPV0VSX0ZBQ1RPUl9OQU1FICAgICAgICAgICJnRmxleENvbm5lY3RQb3dlckZhY3RvciIKKyNkZWZpbmUgQ0ZHX0ZMRVhfQ09OTkVDVF9QT1dFUl9GQUNUT1JfTUlOICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0ZMRVhfQ09OTkVDVF9QT1dFUl9GQUNUT1JfTUFYICAgICAgICAgICAoOSkKKyNkZWZpbmUgQ0ZHX0ZMRVhfQ09OTkVDVF9QT1dFUl9GQUNUT1JfREVGQVVMVCAgICAgICAoMCkKKworLyoKKyAqIEVuYWJsZSBoZWFydCBiZWF0IG1vbml0b3Jpbmcgb2ZmbG9hZCB0byBGVworICovCisjZGVmaW5lIENGR19FTkFCTEVfSEVBUlRfQkVBVF9PRkZMT0FEICAgICAgICAgICJnRW5hYmxlSWJzc0hlYXJ0QmVhdE9mZmxvYWQiCisjZGVmaW5lIENGR19FTkFCTEVfSEVBUlRfQkVBVF9PRkZMT0FEX01JTiAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0hFQVJUX0JFQVRfT0ZGTE9BRF9NQVggICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9IRUFSVF9CRUFUX09GRkxPQURfREVGQVVMVCAgKDEpCisKKyNkZWZpbmUgQ0ZHX0FOVEVOTkFfRElWRVJTSVRZX1BBUkFNX05BTUUgICAgICAgICAgImdBbnRlbm5hRGl2ZXJzaXR5IgorI2RlZmluZSBDRkdfQU5URU5OQV9ESVZFUlNJVFlfUEFSQU1fTUlOICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0FOVEVOTkFfRElWRVJTSVRZX1BBUkFNX01BWCAgICAgICAgICAgKDMpCisjZGVmaW5lIENGR19BTlRFTk5BX0RJVkVSU0lUWV9QQVJBTV9ERUZBVUxUICAgICAgICgwKQorCisjZGVmaW5lIENGR19FTkFCTEVfU05SX01PTklUT1JJTkdfTkFNRSAgICAgICAgICAgICAgImdFbmFibGVTTlJNb25pdG9yaW5nIgorI2RlZmluZSBDRkdfRU5BQkxFX1NOUl9NT05JVE9SSU5HX01JTiAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX1NOUl9NT05JVE9SSU5HX01BWCAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX1NOUl9NT05JVE9SSU5HX0RFRkFVTFQgICAgICAgICAgICgwKQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisjZGVmaW5lIENGR19QTk9fU0NBTl9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICJnUE5PU2NhblN1cHBvcnQiCisjZGVmaW5lIENGR19QTk9fU0NBTl9TVVBQT1JUX0VOQUJMRSAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfUE5PX1NDQU5fU1VQUE9SVF9ESVNBQkxFICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1BOT19TQ0FOX1NVUFBPUlRfREVGQVVMVCAgICAgICAgICAgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX1BOT19TQ0FOX1RJTUVSX1JFUEVBVF9WQUxVRSAgICAgICAgICAgICAgImdQTk9TY2FuVGltZXJSZXBlYXRWYWx1ZSIKKyNkZWZpbmUgQ0ZHX1BOT19TQ0FOX1RJTUVSX1JFUEVBVF9WQUxVRV9ERUZBVUxUICAgICAgKDYpCisjZGVmaW5lIENGR19QTk9fU0NBTl9USU1FUl9SRVBFQVRfVkFMVUVfTUlOICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUE5PX1NDQU5fVElNRVJfUkVQRUFUX1ZBTFVFX01BWCAgICAgICAgICAoMHhmZmZmZmZmZikKKyNlbmRpZgorCisjZGVmaW5lIENGR19BTVNEVV9TVVBQT1JUX0lOX0FNUERVX05BTUUgICAgICAgICAgICAgICAgImdBbXNkdVN1cHBvcnRJbkFNUERVIgorI2RlZmluZSBDRkdfQU1TRFVfU1VQUE9SVF9JTl9BTVBEVV9NSU4gICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfQU1TRFVfU1VQUE9SVF9JTl9BTVBEVV9NQVggICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfQU1TRFVfU1VQUE9SVF9JTl9BTVBEVV9ERUZBVUxUICAgICAgICAgICAgICgwKSAgICAgIC8qIGRpc2FibGVkICovCisKKy8qIFByZWZlciBjb25uZWN0aW5nIHRvIDVHIEFQIGV2ZW4gaWYgaXRzIFJTU0kgaXMgbG93ZXIgYnkKKyAgIGdTZWxlY3Q1R0h6TWFyZ2luIGRCbSB0aGFuIDIuNEcgQVAuCisgICBUaGlzIGZlYXR1cmUgcmVxdWlyZXMgdGhlIGRlcGVuZGVudCBjZmcuaW5pICJnUm9hbVByZWZlcjVHSHoiIHNldCB0byAxICovCisjZGVmaW5lIENGR19TVFJJQ1RfNUdIWl9QUkVGX0JZX01BUkdJTiAgICAgICAgICAgICAgICAgImdTZWxlY3Q1R0h6TWFyZ2luIgorI2RlZmluZSBDRkdfU1RSSUNUXzVHSFpfUFJFRl9CWV9NQVJHSU5fTUlOICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfU1RSSUNUXzVHSFpfUFJFRl9CWV9NQVJHSU5fTUFYICAgICAgICAgICAgICg2MCkKKyNkZWZpbmUgQ0ZHX1NUUklDVF81R0haX1BSRUZfQllfTUFSR0lOX0RFRkFVTFQgICAgICAgICAoMCkgICAgICAvKiBzZXQgMCB0byBkaXNhYmxlICovCisKKy8qIEl0IGVuYWJsZXMgSVAsIFRDUCBhbmQgVURQIGNoZWNrc3VtIG9mZmxvYWQgaW4gaGFyZHdhcmUKKyAqIGFuZCBhbHNvIGFkdmVydGlzZSBzYW1lIHRvIG5ldHdvcmsgc3RhY2suCisgKi8KKyNkZWZpbmUgQ0ZHX0VOQUJMRV9JUF9UQ1BfVURQX0NIS1NVTV9PRkZMT0FEICAgICAgICAgICAgImdFbmFibGVJcFRjcFVkcENoZWNrc3VtT2ZmbG9hZCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9JUF9UQ1BfVURQX0NIS1NVTV9PRkZMT0FEX0RJU0FCTEUgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfSVBfVENQX1VEUF9DSEtTVU1fT0ZGTE9BRF9FTkFCTEUgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0lQX1RDUF9VRFBfQ0hLU1VNX09GRkxPQURfREVGQVVMVCAgICAoQ0ZHX0VOQUJMRV9JUF9UQ1BfVURQX0NIS1NVTV9PRkZMT0FEX0VOQUJMRSkKKworLyoKKyAqIFBvd2VyIFNhdmUgT2ZmbG9hZAorICogUG93ZXIgU2F2ZSBPZmZsb2FkIGNvbmZpZ3VyYXRpb246CisgKiBDdXJyZW50IHZhbHVlcyBvZiBnRW5hYmxlUG93ZXJTYXZlT2ZmbG9hZDoKKyAqIDAgLT4gUG93ZXIgc2F2ZSBvZmZsb2FkIGlzIGRpc2FibGVkCisgKiAxIC0+IExlZ2FjeSBQb3dlciBzYXZlIGVuYWJsZWQgKyBEZWVwIHNsZWVwIERpc2FibGVkCisgKiAyIC0+IFFQb3dlciBlbmFibGVkICsgRGVlcCBzbGVlcCBEaXNhYmxlZAorICogMyAtPiBMZWdhY3kgUG93ZXIgc2F2ZSBlbmFibGVkICsgRGVlcCBzbGVlcCBFbmFibGVkCisgKiA0IC0+IFFQb3dlciBlbmFibGVkICsgRGVlcCBzbGVlcCBFbmFibGVkCisgKiA1IC0+IER1dHkgY3ljbGluZyBRUG93ZXIgZW5hYmxlZAorICovCisjZGVmaW5lIENGR19QT1dFUlNBVkVfT0ZGTE9BRF9OQU1FICAgICAgICAgICAgICAgICJnRW5hYmxlUG93ZXJTYXZlT2ZmbG9hZCIKKyNkZWZpbmUgQ0ZHX1BPV0VSU0FWRV9PRkZMT0FEX01JTiAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19QT1dFUlNBVkVfT0ZGTE9BRF9NQVggICAgICAgICAgICAgICAgIChQU19EVVRZX0NZQ0xJTkdfUVBPV0VSKQorI2RlZmluZSBDRkdfUE9XRVJTQVZFX09GRkxPQURfREVGQVVMVCAgICAgICAgICAgICAoQ0ZHX1BPV0VSU0FWRV9PRkZMT0FEX01JTikKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorI2RlZmluZSBDRkdfRU5BQkxFX0ZBU1RQQVRIICAgICAgICAgICAgICAgICAgICAgICJnRW5hYmxlRmFzdFBhdGgiCisjZGVmaW5lIENGR19FTkFCTEVfRkFTVFBBVEhfTUlOICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfRkFTVFBBVEhfTUFYICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfRkFTVFBBVEhfREVGQVVMVCAgICAgICAgICAgICAgKENGR19FTkFCTEVfRkFTVFBBVEhfTUlOKQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9GQVNUUEFUSCAqLworCisvKgorICogSVBBIE9mZmxvYWQgY29uZmlndXJhdGlvbiAtIEVhY2ggYml0IGVuYWJsZXMgYSBmZWF0dXJlCisgKiBiaXQwIC0gSVBBIEVuYWJsZQorICogYml0MSAtIElQQSBQcmUgZmlsdGVyIGVuYWJsZQorICogYml0MiAtIElQdjYgZW5hYmxlCisgKiBiaXQzIC0gSVBBIFJlc291cmNlIE1hbmFnZXIgKFJNKSBlbmFibGUKKyAqIGJpdDQgLSBJUEEgQ2xvY2sgc2NhbGluZyBlbmFibGUKKyAqLworI2RlZmluZSBDRkdfSVBBX09GRkxPQURfQ09ORklHX05BTUUgICAgICAgICAgICAgICJnSVBBQ29uZmlnIgorI2RlZmluZSBDRkdfSVBBX09GRkxPQURfQ09ORklHX01JTiAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfSVBBX09GRkxPQURfQ09ORklHX01BWCAgICAgICAgICAgICAgICgweEZGRkZGRkZGKQorI2RlZmluZSBDRkdfSVBBX09GRkxPQURfQ09ORklHX0RFRkFVTFQgICAgICAgICAgIChDRkdfSVBBX09GRkxPQURfQ09ORklHX01JTikKKworLyoKKyAqIElQQSBERVNDIFNJWkUKKyAqLworI2RlZmluZSBDRkdfSVBBX0RFU0NfU0laRV9OQU1FICAgICAgICAgICAgICAgICAgICJnSVBBRGVzY1NpemUiCisjZGVmaW5lIENGR19JUEFfREVTQ19TSVpFX01JTiAgICAgICAgICAgICAgICAgICAgKDgwMCkKKyNkZWZpbmUgQ0ZHX0lQQV9ERVNDX1NJWkVfTUFYICAgICAgICAgICAgICAgICAgICAoODAwMCkKKyNkZWZpbmUgQ0ZHX0lQQV9ERVNDX1NJWkVfREVGQVVMVCAgICAgICAgICAgICAgICAoODAwKQorCisjZGVmaW5lIENGR19JUEFfSElHSF9CQU5EV0lEVEhfTUJQUyAgICAgICAgICAgICAgImdJUEFIaWdoQmFuZHdpZHRoTWJwcyIKKyNkZWZpbmUgQ0ZHX0lQQV9ISUdIX0JBTkRXSURUSF9NQlBTX01JTiAgICAgICAgICAoMjAwKQorI2RlZmluZSBDRkdfSVBBX0hJR0hfQkFORFdJRFRIX01CUFNfTUFYICAgICAgICAgICgxMDAwKQorI2RlZmluZSBDRkdfSVBBX0hJR0hfQkFORFdJRFRIX01CUFNfREVGQVVMVCAgICAgICg0MDApCisKKyNkZWZpbmUgQ0ZHX0lQQV9NRURJVU1fQkFORFdJRFRIX01CUFMgICAgICAgICAgICAiZ0lQQU1lZGl1bUJhbmR3aWR0aE1icHMiCisjZGVmaW5lIENGR19JUEFfTUVESVVNX0JBTkRXSURUSF9NQlBTX01JTiAgICAgICAgKDEwMCkKKyNkZWZpbmUgQ0ZHX0lQQV9NRURJVU1fQkFORFdJRFRIX01CUFNfTUFYICAgICAgICAoNDAwKQorI2RlZmluZSBDRkdfSVBBX01FRElVTV9CQU5EV0lEVEhfTUJQU19ERUZBVUxUICAgICgyMDApCisKKyNkZWZpbmUgQ0ZHX0lQQV9MT1dfQkFORFdJRFRIX01CUFMgICAgICAgICAgICAgICAiZ0lQQUxvd0JhbmR3aWR0aE1icHMiCisjZGVmaW5lIENGR19JUEFfTE9XX0JBTkRXSURUSF9NQlBTX01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19JUEFfTE9XX0JBTkRXSURUSF9NQlBTX01BWCAgICAgICAgICAgKDEwMCkKKyNkZWZpbmUgQ0ZHX0lQQV9MT1dfQkFORFdJRFRIX01CUFNfREVGQVVMVCAgICAgICAoMTAwKQorCisvKgorICogRmlybXdhcmUgdWFydCBwcmludAorICovCisjZGVmaW5lIENGR19FTkFCTEVfRldfVUFSVF9QUklOVF9OQU1FICAgICAgICAgICAgICJnRW5hYmxlZndwcmludCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9GV19VQVJUX1BSSU5UX0RJU0FCTEUgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfRldfVUFSVF9QUklOVF9FTkFCTEUgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0ZXX1VBUlRfUFJJTlRfREVGQVVMVCAgICAgICAgICAoQ0ZHX0VOQUJMRV9GV19VQVJUX1BSSU5UX0RJU0FCTEUpCisKKy8qCisgKiBGaXJtd2FyZSBsb2cKKyAqLworI2RlZmluZSBDRkdfRU5BQkxFX0ZXX0xPR19OQU1FICAgICAgICAgICAgICAgICAgICJnRW5hYmxlZndsb2ciCisjZGVmaW5lIENGR19FTkFCTEVfRldfTE9HX0RJU0FCTEUgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfRldfTE9HX0VOQUJMRSAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfRldfTE9HX0RFRkFVTFQgICAgICAgICAgICAgICAgKENGR19FTkFCTEVfRldfTE9HX0RJU0FCTEUpCisKKy8qCisgKiBFbmFibGUvRGlzYWJsZSBTU1IgZm9yIFVTQgorICovCisjZGVmaW5lIENGR19FTkFCTEVfRldfU0VMRl9SRUNPVkVSWV9OQU1FICAgICAgICAgImdFbmFibGVGd1NlbGZSZWNvdmVyeSIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9GV19TRUxGX1JFQ09WRVJZX0RJU0FCTEUgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9GV19TRUxGX1JFQ09WRVJZX0VOQUJMRSAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9GV19TRUxGX1JFQ09WRVJZX0RFRkFVTFQgICAgICAoQ0ZHX0VOQUJMRV9GV19TRUxGX1JFQ09WRVJZX0RJU0FCTEUpCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworLyogTWFjcm8gdG8gaGFuZGxlIG1heGltdW0gcmVjZWl2ZSBBTVBEVSBzaXplIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQ0ZHX1ZIVF9BTVBEVV9MRU5fRVhQT05FTlRfTkFNRSAgICAgICAgICAgICAgICAiZ1ZodEFtcGR1TGVuRXhwb25lbnQiCisjZGVmaW5lIENGR19WSFRfQU1QRFVfTEVOX0VYUE9ORU5UX01JTiAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WSFRfQU1QRFVfTEVOX0VYUE9ORU5UX01BWCAgICAgICAgICAgICAgICAgKDcpCisjZGVmaW5lIENGR19WSFRfQU1QRFVfTEVOX0VYUE9ORU5UX0RFRkFVTFQgICAgICAgICAgICAgKDMpCisKKyNkZWZpbmUgQ0ZHX1ZIVF9NUERVX0xFTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAiZ1ZodE1wZHVMZW4iCisjZGVmaW5lIENGR19WSFRfTVBEVV9MRU5fTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WSFRfTVBEVV9MRU5fTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIENGR19WSFRfTVBEVV9MRU5fREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZW5kaWYKKworI2RlZmluZSBDRkdfTUFYX1dPV19GSUxURVJTX05BTUUgICAgICAgICAgICAgICAgICAgICAgICJnTWF4V29XRmlsdGVycyIKKyNkZWZpbmUgQ0ZHX01BWF9XT1dfRklMVEVSU19NSU4gICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX01BWF9XT1dfRklMVEVSU19NQVggICAgICAgICAgICAgICAgICAgICAgICAoV09XX01BWF9CSVRNQVBfRklMVEVSUykKKyNkZWZpbmUgQ0ZHX01BWF9XT1dfRklMVEVSU19ERUZBVUxUICAgICAgICAgICAgICAgICAgICAoV09XX01BWF9CSVRNQVBfRklMVEVSUykKKworLyoKKyAqIFdPVyBFbmFibGUvRGlzYWJsZS4KKyAqIDAgLSBEaXNhYmxlIGJvdGggbWFnaWMgcGF0dGVybiBtYXRjaCBhbmQgcGF0dGVybiBieXRlIG1hdGNoLgorICogMSAtIEVuYWJsZSBtYWdpYyBwYXR0ZXJuIG1hdGNoIG9uIGFsbCBpbnRlcmZhY2VzLgorICogMiAtIEVuYWJsZSBwYXR0ZXJuIGJ5dGUgbWF0Y2ggb24gYWxsIGludGVyZmFjZXMuCisgKiAzIC0gRW5hYmxlIGJvdGggbWFnaWMgcGF0dGVyIGFuZCBwYXR0ZXJuIGJ5dGUgbWF0Y2ggb24gYWxsIGludGVyZmFjZXMuCisgKi8KKyNkZWZpbmUgQ0ZHX1dPV19TVEFUVVNfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICJnRW5hYmxlV29XIgorI2RlZmluZSBDRkdfV09XX0VOQUJMRV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19XT1dfRU5BQkxFX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMykKKyNkZWZpbmUgQ0ZHX1dPV19TVEFUVVNfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICgzKQorCisjZGVmaW5lIENGR19DT0FMRVNJTkdfSU5fSUJTU19OQU1FICAgICAgICAgICAgICAgICJnQ29hbGVzaW5nSW5JQlNTIgorI2RlZmluZSBDRkdfQ09BTEVTSU5HX0lOX0lCU1NfTUlOICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0NPQUxFU0lOR19JTl9JQlNTX01BWCAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19DT0FMRVNJTkdfSU5fSUJTU19ERUZBVUxUICAgICAgICAgICAgICgwKSAgIC8qIGRpc2FibGVkICovCisKKyNkZWZpbmUgQ0ZHX0lCU1NfQVRJTV9XSU5fU0laRV9OQU1FICAgICAgICAgICAgICAgICJnSWJzc0FUSU1XaW5TaXplIgorI2RlZmluZSBDRkdfSUJTU19BVElNX1dJTl9TSVpFX01JTiAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19JQlNTX0FUSU1fV0lOX1NJWkVfTUFYICAgICAgICAgICAgICAgICAoNTApCisjZGVmaW5lIENGR19JQlNTX0FUSU1fV0lOX1NJWkVfREVGQVVMVCAgICAgICAgICAgICAoMCkKKworLyoKKyAqIEluZGljYXRlcyBpZiBJQlNTIFBvd2VyIFNhdmUgaXMKKyAqIHN1cHBvcnRlZCBvciBub3QuIFdoZW4gbm90IGFsbG93ZWQsCisgKiBJQlNTIHN0YXRpb24gaGFzIHRvIHN0YXkgYXdha2UgYWxsCisgKiB0aGUgdGltZSBhbmQgc2hvdWxkIG5ldmVyIHNldCBQTT0xCisgKiBpbiBpdHMgdHJhbnNtaXR0ZWQgZnJhbWVzLiBUaGlzCisgKiBwYXJhbWV0ZXIgaXMgbWVhbmluZ2Z1bC92YWxpZCBvbmx5CisgKiB3aGVuIGdJYnNzQVRJTVdpblNpemUgaXMgbm9uLXplcm8KKyAqLworI2RlZmluZSBDRkdfSUJTU19JU19QT1dFUl9TQVZFX0FMTE9XRURfTkFNRSAgICAgICAgImdJYnNzSXNQb3dlclNhdmVBbGxvd2VkIgorI2RlZmluZSBDRkdfSUJTU19JU19QT1dFUl9TQVZFX0FMTE9XRURfTUlOICAgICAgICAgKDApCisjZGVmaW5lIENGR19JQlNTX0lTX1BPV0VSX1NBVkVfQUxMT1dFRF9NQVggICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0lCU1NfSVNfUE9XRVJfU0FWRV9BTExPV0VEX0RFRkFVTFQgICAgICgxKQorCisvKgorICogSW5kaWNhdGVzIGlmIElCU1MgUG93ZXIgQ29sbGFwc2UKKyAqIGlzIGFsbG93ZWQgb3Igbm90LgorICovCisjZGVmaW5lIENGR19JQlNTX0lTX1BPV0VSX0NPTExBUFNFX0FMTE9XRURfTkFNRSAgICAiZ0lic3NJc1Bvd2VyQ29sbGFwc2VBbGxvd2VkIgorI2RlZmluZSBDRkdfSUJTU19JU19QT1dFUl9DT0xMQVBTRV9BTExPV0VEX01JTiAgICAgKDApCisjZGVmaW5lIENGR19JQlNTX0lTX1BPV0VSX0NPTExBUFNFX0FMTE9XRURfTUFYICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0lCU1NfSVNfUE9XRVJfQ09MTEFQU0VfQUxMT1dFRF9ERUZBVUxUICgxKQorCisvKgorICogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgSUJTUyBzdGF0aW9uCisgKiBjYW4gZXhpdCBwb3dlciBzYXZlIG1vZGUgYW5kIGVudGVyIHBvd2VyIGFjdGl2ZQorICogc3RhdGUgd2hlbmV2ZXIgdGhlcmUgaXMgYSBUWC9SWCBhY3Rpdml0eS4KKyAqLworI2RlZmluZSBDRkdfSUJTU19BV0FLRV9PTl9UWF9SWF9OQU1FICAgICAgICAgICAgICAgImdJYnNzQXdha2VPblR4UngiCisjZGVmaW5lIENGR19JQlNTX0FXQUtFX09OX1RYX1JYX01JTiAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0lCU1NfQVdBS0VfT05fVFhfUlhfTUFYICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfSUJTU19BV0FLRV9PTl9UWF9SWF9ERUZBVUxUICAgICAgICAgICAgKDApCisKKy8qCisgKiBJbiBJQlNTIG1vZGUgaWYgQXdha2Ugb24gVFgvUlggYWN0aXZpdHkgaXMgZW5hYmxlZAorICogSWJzcyBJbmFjdGl2aXR5IHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGRhdGEKKyAqIGluYWN0aXZpdHkgdGltZSBpbiBudW1iZXIgb2YgYmVhY29uIGludGVydmFscworICogYWZ0ZXIgd2hpY2ggSUJTUyBzdGF0aW9uIHJlLWludGVycyBwb3dlciBzYXZlCisgKiBieSBzZW5kaW5nIE51bGwgZnJhbWUgd2l0aCBQTT0xCisgKi8KKyNkZWZpbmUgQ0ZHX0lCU1NfSU5BQ1RJVklUWV9USU1FX05BTUUgICAgICAgICAgICAgICJnSWJzc0luYWN0aXZpdHlUaW1lIgorI2RlZmluZSBDRkdfSUJTU19JTkFDVElWSVRZX1RJTUVfTUlOICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19JQlNTX0lOQUNUSVZJVFlfVElNRV9NQVggICAgICAgICAgICAgICAoMTApCisjZGVmaW5lIENGR19JQlNTX0lOQUNUSVZJVFlfVElNRV9ERUZBVUxUICAgICAgICAgICAoMSkKKworLyoKKyAqIEluIElCU1MgbW9kZSBUeCBTZXJ2aWNlIFBlcmlvZCBJbmFjdGl2aXR5CisgKiB0aW1lIGluIG1zZWNzIGluZGljYXRlcyB0aGUgdGltZSBhZnRlcgorICogd2hpY2ggVFggU2VydmljZSBQZXJpb2QgaXMgdGVybWluYXRlZCBieQorICogc2VuZGluZyBhIFFvcyBOdWxsIGZyYW1lIHdpdGggRU9TUC4KKyAqIElmIHZhbHVlIGlzIDAsIFRYIFNQIGlzIHRlcm1pbmF0ZWQgd2l0aCB0aGUKKyAqIGxhc3QgYnVmZmVyZWQgcGFja2V0IGl0c2VsZiBpbnN0ZWFkIG9mIHdhaXRpbmcKKyAqIGZvciB0aGUgaW5hY3Rpdml0eQorICovCisjZGVmaW5lIENGR19JQlNTX1RYU1BfRU5EX0lOQUNUSVZJVFlfTkFNRSAgICAgICAgICAiZ0lic3NUeFNwRW5kSW5hY3Rpdml0eVRpbWUiCisjZGVmaW5lIENGR19JQlNTX1RYU1BfRU5EX0lOQUNUSVZJVFlfTUlOICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0lCU1NfVFhTUF9FTkRfSU5BQ1RJVklUWV9NQVggICAgICAgICAgICgxMDApCisjZGVmaW5lIENGR19JQlNTX1RYU1BfRU5EX0lOQUNUSVZJVFlfREVGQVVMVCAgICAgICAoMCkKKworLyoKKyAqIFdoZW4gSUJTUyBuZXR3b3JrIGlzIGluaXRpYWxpemVkLCBQUy1zdXBwb3J0aW5nIGRldmljZQorICogZG9lcyBub3QgZW50ZXIgcHJvdG9jb2wgc2xlZXAgc3RhdGUgZHVyaW5nIGZpcnN0CisgKiBnSWJzc1BzV2FybXVwVGltZSBzZWNvbmRzLgorICovCisjZGVmaW5lIENGR19JQlNTX1BTX1dBUk1VUF9USU1FX05BTUUgICAgICAgICAgICAgICAiZ0lic3NQc1dhcm11cFRpbWUiCisjZGVmaW5lIENGR19JQlNTX1BTX1dBUk1VUF9USU1FX01JTiAgICAgICAgICAgICAgICAoMCkKKy8qIEFsbG93IHVuc2lnbmVkIEludCBNYXggZm9yIG5vdyAqLworI2RlZmluZSBDRkdfSUJTU19QU19XQVJNVVBfVElNRV9NQVggICAgICAgICAgICAgICAgKDY1NTM1KQorI2RlZmluZSBDRkdfSUJTU19QU19XQVJNVVBfVElNRV9ERUZBVUxUICAgICAgICAgICAgKDApCisKKy8qCisgKiBJQlNTIFBvd2VyIFNhdmUgRW5hYmxlL0Rpc2FibGUgMSBSWAorICogY2hhaW4gdXNhZ2UgZHVyaW5nIHRoZSBBVElNIHdpbmRvdworICovCisjZGVmaW5lIENGR19JQlNTX1BTXzFSWF9DSEFJTl9JTl9BVElNX1dJTkRPV19OQU1FICAgICJnSWJzc1BzMVJ4Q2hhaW5JbkF0aW0iCisjZGVmaW5lIENGR19JQlNTX1BTXzFSWF9DSEFJTl9JTl9BVElNX1dJTkRPV19NSU4gICAgICgwKQorI2RlZmluZSBDRkdfSUJTU19QU18xUlhfQ0hBSU5fSU5fQVRJTV9XSU5ET1dfTUFYICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0lCU1NfUFNfMVJYX0NIQUlOX0lOX0FUSU1fV0lORE9XX0RFRkFVTFQgKDApCisKKyNkZWZpbmUgQ0ZHX1NBUF9NQVhfTk9fUEVFUlMgICAgICAgICAgICAgICAgICAgICAgICJnU29mdEFwTWF4UGVlcnMiCisjZGVmaW5lIENGR19TQVBfTUFYX05PX1BFRVJTX01JTiAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1NBUF9NQVhfTk9fUEVFUlNfTUFYICAgICAgICAgICAgICAgICAgICgzMikKKyNkZWZpbmUgQ0ZHX1NBUF9NQVhfTk9fUEVFUlNfREVGQVVMVCAgICAgICAgICAgICAgICgzMikKKworLyoKKyAqIENvbm5lY3Rpb24gcmVsYXRlZCBsb2cgRW5hYmxlL0Rpc2FibGUuCisgKiAweDEgLSBFbmFibGUgbWdtdCBwa3QgbG9ncyAobm8gcHJvYmUgcmVxL3JzcCkuCisgKiAweDIgLSBFbmFibGUgRUFQT0wgcGt0IGxvZ3MuCisgKiAweDQgLSBFbmFibGUgREhDUCBwa3QgbG9ncy4KKyAqIDB4MCAtIERpc2FibGUgYWxsIHRoZSBhYm92ZSBjb25uZWN0aW9uIHJlbGF0ZWQgbG9ncy4KKyAqLworI2RlZmluZSBDRkdfRU5BQkxFX0RFQlVHX0NPTk5FQ1RfSVNTVUUgICAgICAgICAgICAgImdFbmFibGVEZWJ1Z0xvZyIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9ERUJVR19DT05ORUNUX0lTU1VFX01JTiAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX0RFQlVHX0NPTk5FQ1RfSVNTVUVfTUFYICAgICAgICAgKDB4RkYpCisjZGVmaW5lIENGR19FTkFCTEVfREVCVUdfQ09OTkVDVF9JU1NVRV9ERUZBVUxUICAgICAoMCkKKworLyogVGhpcyB3aWxsIGJlIHVzZWQgb25seSBmb3IgZGVidWdnaW5nIHB1cnBvc2UsIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBzb21ldGltZSAqLworI2RlZmluZSBDRkdfRU5BQkxFX1JYX1RIUkVBRCAgICAgICAgICAgICAgICAgICAgICAgImdFbmFibGVSeFRocmVhZCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9SWF9USFJFQURfTUlOICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX1JYX1RIUkVBRF9NQVggICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfUlhfVEhSRUFEX0RFRkFVTFQgICAgICAgICAgICAgICAoMSkKKworLyogU0FSIFRoZXJtYWwgbGltaXQgdmFsdWVzIGZvciAyZyBhbmQgNWcgKi8KKworI2RlZmluZSBDRkdfU0VUX1RYUE9XRVJfTElNSVQyR19OQU1FICAgICAgICAgICAgICAgIlR4UG93ZXIyZyIKKyNkZWZpbmUgQ0ZHX1NFVF9UWFBPV0VSX0xJTUlUMkdfTUlOICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfU0VUX1RYUE9XRVJfTElNSVQyR19NQVggICAgICAgICAgICAgICAgKDMwKQorI2RlZmluZSBDRkdfU0VUX1RYUE9XRVJfTElNSVQyR19ERUZBVUxUICAgICAgICAgICAgKDE1KQorCisjZGVmaW5lIENGR19TRVRfVFhQT1dFUl9MSU1JVDVHX05BTUUgICAgICAgICAgICAgICAiVHhQb3dlcjVnIgorI2RlZmluZSBDRkdfU0VUX1RYUE9XRVJfTElNSVQ1R19NSU4gICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19TRVRfVFhQT1dFUl9MSU1JVDVHX01BWCAgICAgICAgICAgICAgICAoMzApCisjZGVmaW5lIENGR19TRVRfVFhQT1dFUl9MSU1JVDVHX0RFRkFVTFQgICAgICAgICAgICAoMTUpCisKKyNpZmRlZiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTAorI2RlZmluZSBDRkdfTExfVFhfRkxPV19MV00gICAgICAgICAgICAgICAgICAgICAgICAgIlR4Rmxvd0xvd1dhdGVyTWFyayIKKyNkZWZpbmUgQ0ZHX0xMX1RYX0ZMT1dfTFdNX01JTiAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfTExfVFhfRkxPV19MV01fTUFYICAgICAgICAgICAgICAgICAgICAgKDEwMDApCisKKyNkZWZpbmUgQ0ZHX0xMX1RYX0ZMT1dfTFdNX0RFRkFVTFQgICAgICAgICAgICAgICAgICgzMDApCisKKyNkZWZpbmUgQ0ZHX0xMX1RYX0ZMT1dfSFdNX09GRlNFVCAgICAgICAgICAgICAgICAgICJUeEZsb3dIaWdoV2F0ZXJNYXJrT2Zmc2V0IgorI2RlZmluZSBDRkdfTExfVFhfRkxPV19IV01fT0ZGU0VUX01JTiAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19MTF9UWF9GTE9XX0hXTV9PRkZTRVRfTUFYICAgICAgICAgICAgICAoMzAwKQorCisjZGVmaW5lIENGR19MTF9UWF9GTE9XX0hXTV9PRkZTRVRfREVGQVVMVCAgICAgICAgICAoOTQpCisKKyNkZWZpbmUgQ0ZHX0xMX1RYX0ZMT1dfTUFYX1FfREVQVEggICAgICAgICAgICAgICAgICJUeEZsb3dNYXhRdWV1ZURlcHRoIgorI2RlZmluZSBDRkdfTExfVFhfRkxPV19NQVhfUV9ERVBUSF9NSU4gICAgICAgICAgICAgKDQwMCkKKyNkZWZpbmUgQ0ZHX0xMX1RYX0ZMT1dfTUFYX1FfREVQVEhfTUFYICAgICAgICAgICAgICgzNTAwKQorI2RlZmluZSBDRkdfTExfVFhfRkxPV19NQVhfUV9ERVBUSF9ERUZBVUxUICAgICAgICAgKDE1MDApCisKKyNkZWZpbmUgQ0ZHX0xMX1RYX0xCV19GTE9XX0xXTSAgICAgICAgICAgICAgICAgICAgICJUeExid0Zsb3dMb3dXYXRlck1hcmsiCisjZGVmaW5lIENGR19MTF9UWF9MQldfRkxPV19MV01fTUlOICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0xMX1RYX0xCV19GTE9XX0xXTV9NQVggICAgICAgICAgICAgICAgICgxMDAwKQorCisjZGVmaW5lIENGR19MTF9UWF9MQldfRkxPV19MV01fREVGQVVMVCAgICAgICAgICAgICAoNDUwKQorCisjZGVmaW5lIENGR19MTF9UWF9MQldfRkxPV19IV01fT0ZGU0VUICAgICAgICAgICAgICAiVHhMYndGbG93SGlnaFdhdGVyTWFya09mZnNldCIKKyNkZWZpbmUgQ0ZHX0xMX1RYX0xCV19GTE9XX0hXTV9PRkZTRVRfTUlOICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfTExfVFhfTEJXX0ZMT1dfSFdNX09GRlNFVF9NQVggICAgICAgICAgKDMwMCkKKworI2RlZmluZSBDRkdfTExfVFhfTEJXX0ZMT1dfSFdNX09GRlNFVF9ERUZBVUxUICAgICAgKDUwKQorCisjZGVmaW5lIENGR19MTF9UWF9MQldfRkxPV19NQVhfUV9ERVBUSCAgICAgICAgICAgICAiVHhMYndGbG93TWF4UXVldWVEZXB0aCIKKyNkZWZpbmUgQ0ZHX0xMX1RYX0xCV19GTE9XX01BWF9RX0RFUFRIX01JTiAgICAgICAgICg0MDApCisjZGVmaW5lIENGR19MTF9UWF9MQldfRkxPV19NQVhfUV9ERVBUSF9NQVggICAgICAgICAoMzUwMCkKKyNkZWZpbmUgQ0ZHX0xMX1RYX0xCV19GTE9XX01BWF9RX0RFUFRIX0RFRkFVTFQgICAgICg3NTApCisKKyNkZWZpbmUgQ0ZHX0xMX1RYX0hCV19GTE9XX0xXTSAgICAgICAgICAgICAgICAgICAgICJUeEhid0Zsb3dMb3dXYXRlck1hcmsiCisjZGVmaW5lIENGR19MTF9UWF9IQldfRkxPV19MV01fTUlOICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0xMX1RYX0hCV19GTE9XX0xXTV9NQVggICAgICAgICAgICAgICAgICgxMDAwKQorCisjZGVmaW5lIENGR19MTF9UWF9IQldfRkxPV19MV01fREVGQVVMVCAgICAgICAgICAgICAoNDA2KQorCisjZGVmaW5lIENGR19MTF9UWF9IQldfRkxPV19IV01fT0ZGU0VUICAgICAgICAgICAgICAiVHhIYndGbG93SGlnaFdhdGVyTWFya09mZnNldCIKKyNkZWZpbmUgQ0ZHX0xMX1RYX0hCV19GTE9XX0hXTV9PRkZTRVRfTUlOICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfTExfVFhfSEJXX0ZMT1dfSFdNX09GRlNFVF9NQVggICAgICAgICAgKDMwMCkKKworI2RlZmluZSBDRkdfTExfVFhfSEJXX0ZMT1dfSFdNX09GRlNFVF9ERUZBVUxUICAgICAgKDk0KQorCisjZGVmaW5lIENGR19MTF9UWF9IQldfRkxPV19NQVhfUV9ERVBUSCAgICAgICAgICAgICAiVHhIYndGbG93TWF4UXVldWVEZXB0aCIKKyNkZWZpbmUgQ0ZHX0xMX1RYX0hCV19GTE9XX01BWF9RX0RFUFRIX01JTiAgICAgICAgICg0MDApCisjZGVmaW5lIENGR19MTF9UWF9IQldfRkxPV19NQVhfUV9ERVBUSF9NQVggICAgICAgICAoMzUwMCkKKyNkZWZpbmUgQ0ZHX0xMX1RYX0hCV19GTE9XX01BWF9RX0RFUFRIX0RFRkFVTFQgICAgICgxNTAwKQorI2VuZGlmIC8qIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MICovCisKKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyCisKKyNkZWZpbmUgQ0ZHX0xMX1RYX0ZMT1dfU1RPUF9RVUVVRV9USAkJICAgIlR4Rmxvd1N0b3BRdWV1ZVRocmVzaG9sZCIKKyNkZWZpbmUgQ0ZHX0xMX1RYX0ZMT1dfU1RPUF9RVUVVRV9USF9ERUZBVUxUCSAgICgxNSkKKyNkZWZpbmUgQ0ZHX0xMX1RYX0ZMT1dfU1RPUF9RVUVVRV9USF9NSU4JICAgKDApCisjZGVmaW5lIENGR19MTF9UWF9GTE9XX1NUT1BfUVVFVUVfVEhfTUFYCSAgICg1MCkKKworI2RlZmluZSBDRkdfTExfVFhfRkxPV19TVEFSVF9RVUVVRV9PRkZTRVQJICAgIlR4Rmxvd1N0YXJ0UXVldWVPZmZzZXQiCisjZGVmaW5lIENGR19MTF9UWF9GTE9XX1NUQVJUX1FVRVVFX09GRlNFVF9ERUZBVUxUICAoMTApCisjZGVmaW5lIENGR19MTF9UWF9GTE9XX1NUQVJUX1FVRVVFX09GRlNFVF9NSU4JICAgKDApCisjZGVmaW5lIENGR19MTF9UWF9GTE9XX1NUQVJUX1FVRVVFX09GRlNFVF9NQVgJICAgKDMwKQorCisjZW5kaWYgLyogUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMiAqLworCisjZGVmaW5lIENGR19TQVBfTUFYX09GRkxPQURfUEVFUlMgICAgICAgICAgICAgICAgICAiZ01heE9mZmxvYWRQZWVycyIKKyNkZWZpbmUgQ0ZHX1NBUF9NQVhfT0ZGTE9BRF9QRUVSU19NSU4gICAgICAgICAgICAgICgyKQorI2RlZmluZSBDRkdfU0FQX01BWF9PRkZMT0FEX1BFRVJTX01BWCAgICAgICAgICAgICAgKDUpCisjZGVmaW5lIENGR19TQVBfTUFYX09GRkxPQURfUEVFUlNfREVGQVVMVCAgICAgICAgICAoMikKKworI2RlZmluZSBDRkdfU0FQX01BWF9PRkZMT0FEX1JFT1JERVJfQlVGRlMgICAgICAgICAgImdNYXhPZmZsb2FkUmVvcmRlckJ1ZmZzIgorI2RlZmluZSBDRkdfU0FQX01BWF9PRkZMT0FEX1JFT1JERVJfQlVGRlNfTUlOICAgICAgKDApCisjZGVmaW5lIENGR19TQVBfTUFYX09GRkxPQURfUkVPUkRFUl9CVUZGU19NQVggICAgICAoMykKKyNkZWZpbmUgQ0ZHX1NBUF9NQVhfT0ZGTE9BRF9SRU9SREVSX0JVRkZTX0RFRkFVTFQgICgyKQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1JBX0ZJTFRFUklORworI2RlZmluZSBDRkdfUkFfRklMVEVSX0VOQUJMRV9OQU1FICAgICAgICAgICAgICAgICAgImdSQUZpbHRlckVuYWJsZSIKKyNkZWZpbmUgQ0ZHX1JBX0ZJTFRFUl9FTkFCTEVfTUlOICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUkFfRklMVEVSX0VOQUJMRV9NQVggICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19SQV9GSUxURVJfRU5BQkxFX0RFRkFVTFQgICAgICAgICAgICAgICAoMCkKKworI2RlZmluZSBDRkdfUkFfUkFURV9MSU1JVF9JTlRFUlZBTF9OQU1FICAgICAgICAgICAgImdSQXJhdGVMaW1pdEludGVydmFsIgorI2RlZmluZSBDRkdfUkFfUkFURV9MSU1JVF9JTlRFUlZBTF9NSU4gICAgICAgICAgICAgKDYwKQorI2RlZmluZSBDRkdfUkFfUkFURV9MSU1JVF9JTlRFUlZBTF9NQVggICAgICAgICAgICAgKDM2MDApCisjZGVmaW5lIENGR19SQV9SQVRFX0xJTUlUX0lOVEVSVkFMX0RFRkFVTFQgICAgICAgICAoNjApIC8qNjAgU0VDICovCisjZW5kaWYKKworI2RlZmluZSBDRkdfSUdOT1JFX1BFRVJfRVJQX0lORk9fTkFNRSAgICAgICJnSWdub3JlUGVlckVycEluZm8iCisjZGVmaW5lIENGR19JR05PUkVfUEVFUl9FUlBfSU5GT19NSU4gICAgICAgKDApCisjZGVmaW5lIENGR19JR05PUkVfUEVFUl9FUlBfSU5GT19NQVggICAgICAgKDEpCisjZGVmaW5lIENGR19JR05PUkVfUEVFUl9FUlBfSU5GT19ERUZBVUxUICAgKDApCisKKy8qIEVuYWJsZSBNZW1vcnkgRGVidWcgKi8KKyNpZmRlZiBNRU1PUllfREVCVUcKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NRU1PUllfREVCVUdfTkFNRSAgICAgICAgICAgICAiZ0VuYWJsZU1lbW9yeURlYnVnIgorI2RlZmluZSBDRkdfRU5BQkxFX01FTU9SWV9ERUJVR19NSU4gICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX01FTU9SWV9ERUJVR19NQVggICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX01FTU9SWV9ERUJVR19ERUZBVUxUICAgICAgICAgICgxKQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0lOSVRJQUxfRFdFTExfVElNRV9OQU1FICAgICAgICAgICAgImdJbml0aWFsRHdlbGxUaW1lIgorI2RlZmluZSBDRkdfSU5JVElBTF9EV0VMTF9USU1FX0RFRkFVTFQgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0lOSVRJQUxfRFdFTExfVElNRV9NSU4gICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19JTklUSUFMX0RXRUxMX1RJTUVfTUFYICAgICAgICAgICAgICgxMDApCisKKyNkZWZpbmUgQ0ZHX0lOSVRJQUxfU0NBTl9OT19ERlNfQ0hOTF9OQU1FICAgICAgICAgImdJbml0aWFsU2Nhbk5vREZTQ2hubCIKKyNkZWZpbmUgQ0ZHX0lOSVRJQUxfU0NBTl9OT19ERlNfQ0hOTF9ERUZBVUxUICAgICAgKDApCisjZGVmaW5lIENGR19JTklUSUFMX1NDQU5fTk9fREZTX0NITkxfTUlOICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfSU5JVElBTF9TQ0FOX05PX0RGU19DSE5MX01BWCAgICAgICAgICAoMSkKKworI2RlZmluZSBDRkdfUk9BTUlOR19ERlNfQ0hBTk5FTF9OQU1FICAgICAgICAgICAgICAgImdBbGxvd0RGU0NoYW5uZWxSb2FtIgorI2RlZmluZSBDRkdfUk9BTUlOR19ERlNfQ0hBTk5FTF9ESVNBQkxFRCAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19ST0FNSU5HX0RGU19DSEFOTkVMX0VOQUJMRURfTk9STUFMICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1JPQU1JTkdfREZTX0NIQU5ORUxfRU5BQkxFRF9BQ1RJVkUgICAgICgyKQorI2RlZmluZSBDRkdfUk9BTUlOR19ERlNfQ0hBTk5FTF9NSU4gICAgICAgICAgICAgICAgKENGR19ST0FNSU5HX0RGU19DSEFOTkVMX0RJU0FCTEVEKQorI2RlZmluZSBDRkdfUk9BTUlOR19ERlNfQ0hBTk5FTF9NQVggICAgICAgICAgICAgICAgKENGR19ST0FNSU5HX0RGU19DSEFOTkVMX0VOQUJMRURfQUNUSVZFKQorI2RlZmluZSBDRkdfUk9BTUlOR19ERlNfQ0hBTk5FTF9ERUZBVUxUICAgICAgICAgICAgKENGR19ST0FNSU5HX0RGU19DSEFOTkVMX0RJU0FCTEVEKQorCisjaWZkZWYgTVNNX1BMQVRGT1JNCisjZGVmaW5lIENGR19CVVNfQkFORFdJRFRIX0hJR0hfVEhSRVNIT0xEICAgICAgICAgICAiZ0J1c0JhbmR3aWR0aEhpZ2hUaHJlc2hvbGQiCisjZGVmaW5lIENGR19CVVNfQkFORFdJRFRIX0hJR0hfVEhSRVNIT0xEX0RFRkFVTFQgICAoMjAwMCkKKyNkZWZpbmUgQ0ZHX0JVU19CQU5EV0lEVEhfSElHSF9USFJFU0hPTERfTUlOICAgICAgICgwKQorI2RlZmluZSBDRkdfQlVTX0JBTkRXSURUSF9ISUdIX1RIUkVTSE9MRF9NQVggICAgICAgKDQyOTQ5NjcyOTVVTCkKKworI2RlZmluZSBDRkdfQlVTX0JBTkRXSURUSF9NRURJVU1fVEhSRVNIT0xEICAgICAgICAgImdCdXNCYW5kd2lkdGhNZWRpdW1UaHJlc2hvbGQiCisjZGVmaW5lIENGR19CVVNfQkFORFdJRFRIX01FRElVTV9USFJFU0hPTERfREVGQVVMVCAoNTAwKQorI2RlZmluZSBDRkdfQlVTX0JBTkRXSURUSF9NRURJVU1fVEhSRVNIT0xEX01JTiAgICAgKDApCisjZGVmaW5lIENGR19CVVNfQkFORFdJRFRIX01FRElVTV9USFJFU0hPTERfTUFYICAgICAoNDI5NDk2NzI5NVVMKQorCisjZGVmaW5lIENGR19CVVNfQkFORFdJRFRIX0xPV19USFJFU0hPTEQgICAgICAgICAgICAiZ0J1c0JhbmR3aWR0aExvd1RocmVzaG9sZCIKKyNkZWZpbmUgQ0ZHX0JVU19CQU5EV0lEVEhfTE9XX1RIUkVTSE9MRF9ERUZBVUxUICAgICgxNTApCisjZGVmaW5lIENGR19CVVNfQkFORFdJRFRIX0xPV19USFJFU0hPTERfTUlOICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0JVU19CQU5EV0lEVEhfTE9XX1RIUkVTSE9MRF9NQVggICAgICAgICg0Mjk0OTY3Mjk1VUwpCisKKyNkZWZpbmUgQ0ZHX0JVU19CQU5EV0lEVEhfQ09NUFVURV9JTlRFUlZBTCAgICAgICAgICJnQnVzQmFuZHdpZHRoQ29tcHV0ZUludGVydmFsIgorI2RlZmluZSBDRkdfQlVTX0JBTkRXSURUSF9DT01QVVRFX0lOVEVSVkFMX0RFRkFVTFQgKDEwMCkKKyNkZWZpbmUgQ0ZHX0JVU19CQU5EV0lEVEhfQ09NUFVURV9JTlRFUlZBTF9NSU4gICAgICgwKQorI2RlZmluZSBDRkdfQlVTX0JBTkRXSURUSF9DT01QVVRFX0lOVEVSVkFMX01BWCAgICAgKDEwMDAwKQorCisjZGVmaW5lIENGR19UQ1BfREVMQUNLX1RIUkVTSE9MRF9ISUdIICAgICAgICAgICAgICAiZ1RjcERlbEFja1RocmVzaG9sZEhpZ2giCisjZGVmaW5lIENGR19UQ1BfREVMQUNLX1RIUkVTSE9MRF9ISUdIX0RFRkFVTFQgICAgICAoNTAwKQorI2RlZmluZSBDRkdfVENQX0RFTEFDS19USFJFU0hPTERfSElHSF9NSU4gICAgICAgICAgKDApCisjZGVmaW5lIENGR19UQ1BfREVMQUNLX1RIUkVTSE9MRF9ISUdIX01BWCAgICAgICAgICAoMTYwMDApCisKKyNkZWZpbmUgQ0ZHX1RDUF9ERUxBQ0tfVEhSRVNIT0xEX0xPVyAgICAgICAgICAgICAgICJnVGNwRGVsQWNrVGhyZXNob2xkTG93IgorI2RlZmluZSBDRkdfVENQX0RFTEFDS19USFJFU0hPTERfTE9XX0RFRkFVTFQgICAgICAgKDEwMDApCisjZGVmaW5lIENGR19UQ1BfREVMQUNLX1RIUkVTSE9MRF9MT1dfTUlOICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RDUF9ERUxBQ0tfVEhSRVNIT0xEX0xPV19NQVggICAgICAgICAgICgxMDAwMCkKKyNlbmRpZiAvKiBNU01fUExBVEZPUk0gKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKyNkZWZpbmUgQ0ZHX1BNRl9TQV9RVUVSWV9NQVhfUkVUUklFU19OQU1FICAgICAgICAgICJwbWZTYVF1ZXJ5TWF4UmV0cmllcyIKKyNkZWZpbmUgQ0ZHX1BNRl9TQV9RVUVSWV9NQVhfUkVUUklFU19ERUZBVUxUICAgICAgICg1KQorI2RlZmluZSBDRkdfUE1GX1NBX1FVRVJZX01BWF9SRVRSSUVTX01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19QTUZfU0FfUVVFUllfTUFYX1JFVFJJRVNfTUFYICAgICAgICAgICAoMjApCisKKyNkZWZpbmUgQ0ZHX1BNRl9TQV9RVUVSWV9SRVRSWV9JTlRFUlZBTF9OQU1FICAgICAgICJwbWZTYVF1ZXJ5UmV0cnlJbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX1BNRl9TQV9RVUVSWV9SRVRSWV9JTlRFUlZBTF9ERUZBVUxUICAgICgyMDApCisjZGVmaW5lIENGR19QTUZfU0FfUVVFUllfUkVUUllfSU5URVJWQUxfTUlOICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1BNRl9TQV9RVUVSWV9SRVRSWV9JTlRFUlZBTF9NQVggICAgICAgICgyMDAwKQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX01BWF9DT05DVVJSRU5UX0NPTk5FQ1RJT05TX05BTUUgICAgICAgICJnTWF4Q29uY3VycmVudEFjdGl2ZVNlc3Npb25zIgorI2RlZmluZSBDRkdfTUFYX0NPTkNVUlJFTlRfQ09OTkVDVElPTlNfREVGQVVMVCAgICAgKDIpCisjZGVmaW5lIENGR19NQVhfQ09OQ1VSUkVOVF9DT05ORUNUSU9OU19NSU4gICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX01BWF9DT05DVVJSRU5UX0NPTk5FQ1RJT05TX01BWCAgICAgICAgICg0KQorCisjZGVmaW5lIENGR19JR05PUkVfQ0FDX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAiZ0lnbm9yZUNBQyIKKyNkZWZpbmUgQ0ZHX0lHTk9SRV9DQUNfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfSUdOT1JFX0NBQ19NQVggICAgICAgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19JR05PUkVfQ0FDX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAoMCkKKworI2RlZmluZSBDRkdfRU5BQkxFX1NBUF9ERlNfQ0hfU0lGU19CVVJTVF9OQU1FICAgICAgImdFbmFibGVTQVBEZnNDaFNpZnNCdXJzdCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TQVBfREZTX0NIX1NJRlNfQlVSU1RfTUlOICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX1NBUF9ERlNfQ0hfU0lGU19CVVJTVF9NQVggICAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfU0FQX0RGU19DSF9TSUZTX0JVUlNUX0RFRkFVTFQgICAoMSkKKworI2RlZmluZSBDRkdfREZTX1JBREFSX1BSSV9NVUxUSVBMSUVSX05BTUUgICAgICAgICAgImdERlNyYWRhck1hcHBpbmdQcmlNdWx0aXBsaWVyIgorI2RlZmluZSBDRkdfREZTX1JBREFSX1BSSV9NVUxUSVBMSUVSX0RFRkFVTFQgICAgICAgKDQpCisjZGVmaW5lIENGR19ERlNfUkFEQVJfUFJJX01VTFRJUExJRVJfTUlOICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0RGU19SQURBUl9QUklfTVVMVElQTElFUl9NQVggICAgICAgICAgICgxMCkKKyNkZWZpbmUgQ0ZHX1JFT1JERVJfT0ZGTE9BRF9TVVBQT1JUX05BTUUgICAgImdSZW9yZGVyT2ZmbG9hZFN1cHBvcnRlZCIKKyNkZWZpbmUgQ0ZHX1JFT1JERVJfT0ZGTE9BRF9TVVBQT1JUX01JTiAgICAgKDApCisjZGVmaW5lIENGR19SRU9SREVSX09GRkxPQURfU1VQUE9SVF9NQVggICAgICgxKQorI2RlZmluZSBDRkdfUkVPUkRFUl9PRkZMT0FEX1NVUFBPUlRfREVGQVVMVCAoMCkKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKyNkZWZpbmUgQ0ZHX1JPQU1JTkdfT0ZGTE9BRF9OQU1FICAgICAgICAgICAgICAgICJnUm9hbU9mZmxvYWRFbmFibGVkIgorI2RlZmluZSBDRkdfUk9BTUlOR19PRkZMT0FEX01JTiAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19ST0FNSU5HX09GRkxPQURfTUFYICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1JPQU1JTkdfT0ZGTE9BRF9ERUZBVUxUICAgICAgICAgICAgICgwKQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0lQQV9VQ19UWF9CVUZfQ09VTlRfTkFNRSAgICAgICAgICAgICAgICJJcGFVY1R4QnVmQ291bnQiCisjZGVmaW5lIENGR19JUEFfVUNfVFhfQlVGX0NPVU5UX01JTiAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0lQQV9VQ19UWF9CVUZfQ09VTlRfTUFYICAgICAgICAgICAgICAgICgyMDQ4KQorI2RlZmluZSBDRkdfSVBBX1VDX1RYX0JVRl9DT1VOVF9ERUZBVUxUICAgICAgICAgICAgKDUxMikKKworI2RlZmluZSBDRkdfSVBBX1VDX1RYX0JVRl9TSVpFX05BTUUgICAgICAgICAgICAgICAgIklwYVVjVHhCdWZTaXplIgorI2RlZmluZSBDRkdfSVBBX1VDX1RYX0JVRl9TSVpFX01JTiAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0lQQV9VQ19UWF9CVUZfU0laRV9NQVggICAgICAgICAgICAgICAgKDQwOTYpCisjZGVmaW5lIENGR19JUEFfVUNfVFhfQlVGX1NJWkVfREVGQVVMVCAgICAgICAgICAgICgyMDQ4KQorCisjZGVmaW5lIENGR19JUEFfVUNfUlhfSU5EX1JJTkdfQ09VTlRfTkFNRSAgICAgICAgICAiSXBhVWNSeEluZFJpbmdDb3VudCIKKyNkZWZpbmUgQ0ZHX0lQQV9VQ19SWF9JTkRfUklOR19DT1VOVF9NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfSVBBX1VDX1JYX0lORF9SSU5HX0NPVU5UX01BWCAgICAgICAgICAgKDIwNDgpCisjZGVmaW5lIENGR19JUEFfVUNfUlhfSU5EX1JJTkdfQ09VTlRfREVGQVVMVCAgICAgICAoMTAyNCkKKworI2RlZmluZSBDRkdfSVBBX1VDX1RYX1BBUlRJVElPTl9CQVNFX05BTUUgICAgICAgICAgIklwYVVjVHhQYXJ0aXRpb25CYXNlIgorI2RlZmluZSBDRkdfSVBBX1VDX1RYX1BBUlRJVElPTl9CQVNFX01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19JUEFfVUNfVFhfUEFSVElUSU9OX0JBU0VfTUFYICAgICAgICAgICAoOTAwMCkKKyNkZWZpbmUgQ0ZHX0lQQV9VQ19UWF9QQVJUSVRJT05fQkFTRV9ERUZBVUxUICAgICAgICgzMDAwKQorCisjaWZkZWYgV0xBTl9MT0dHSU5HX1NPQ0tfU1ZDX0VOQUJMRQorLyogRW5hYmxlIFdMQU4gTG9nZ2luZyB0byBhcHAgc3BhY2UgKi8KKyNkZWZpbmUgQ0ZHX1dMQU5fTE9HR0lOR19TVVBQT1JUX05BTUUgICAgICAgICAgICAgICAid2xhbkxvZ2dpbmdFbmFibGUiCisjZGVmaW5lIENGR19XTEFOX0xPR0dJTkdfU1VQUE9SVF9FTkFCTEUgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19XTEFOX0xPR0dJTkdfU1VQUE9SVF9ESVNBQkxFICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19XTEFOX0xPR0dJTkdfU1VQUE9SVF9ERUZBVUxUICAgICAgICAgICAgKDEpCisKKy8qIEVuYWJsZSBGQVRBTCBhbmQgRVJST1IgbG9ncyBmb3Iga21zZyBjb25zb2xlICovCisjZGVmaW5lIENGR19XTEFOX0xPR0dJTkdfRkVfQ09OU09MRV9TVVBQT1JUX05BTUUgICAgIndsYW5Mb2dnaW5nRkVUb0NvbnNvbGUiCisjZGVmaW5lIENGR19XTEFOX0xPR0dJTkdfRkVfQ09OU09MRV9TVVBQT1JUX0VOQUJMRSAgKDEpCisjZGVmaW5lIENGR19XTEFOX0xPR0dJTkdfRkVfQ09OU09MRV9TVVBQT1JUX0RJU0FCTEUgKDApCisjZGVmaW5lIENGR19XTEFOX0xPR0dJTkdfRkVfQ09OU09MRV9TVVBQT1JUX0RFRkFVTFQgKDEpCisKKy8qIE51bWJlciBvZiBidWZmZXJzIHRvIGJlIHVzZWQgZm9yIFdMQU4gbG9nZ2luZyAqLworI2RlZmluZSBDRkdfV0xBTl9MT0dHSU5HX05VTV9CVUZfTkFNRSAgICAgICAgICAgICAgICJ3bGFuTG9nZ2luZ051bUJ1ZiIKKyNkZWZpbmUgQ0ZHX1dMQU5fTE9HR0lOR19OVU1fQlVGX01JTiAgICAgICAgICAgICAgICAoNCkKKyNkZWZpbmUgQ0ZHX1dMQU5fTE9HR0lOR19OVU1fQlVGX01BWCAgICAgICAgICAgICAgICAoNTEyKQorI2RlZmluZSBDRkdfV0xBTl9MT0dHSU5HX05VTV9CVUZfREVGQVVMVCAgICAgICAgICAgICgyNTYpCisjZW5kaWYgLyogV0xBTl9MT0dHSU5HX1NPQ0tfU1ZDX0VOQUJMRSAqLworCisjZGVmaW5lIENGR19FTkFCTEVfU0lGU19CVVJTVCAgICAgICAgICAgICAgICAgICAgICAiZ0VuYWJsZVNpZnNCdXJzdCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TSUZTX0JVUlNUX01JTiAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX1NJRlNfQlVSU1RfTUFYICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfU0lGU19CVVJTVF9ERUZBVUxUICAgICAgICAgICAgICAoMCkKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisjZGVmaW5lIENGR19FTkFCTEVfTFBBU1NfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgImdFbmFibGVMcGFzc1N1cHBvcnQiCisjZGVmaW5lIENGR19FTkFCTEVfTFBBU1NfU1VQUE9SVF9ERUZBVUxUICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfTFBBU1NfU1VQUE9SVF9NSU4gICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfTFBBU1NfU1VQUE9SVF9NQVggICAgICAgICAgICAgICAgICAgICAgKDEpCisjZW5kaWYKKworLyoKKyAqIE5hTiBmZWF0dXJlIHN1cHBvcnQgY29uZmlndXJhdGlvbgorICogZ0VuYWJsZU5hblN1cHBvcnQgPSAwIG1lYW5zIE5hTiBpcyBub3Qgc3VwcG9ydGVkCisgKiBnRW5hYmxlTmFuU3VwcG9ydCA9IDEgbWVhbnMgTmFOIGlzIHN1cHBvcnRlZAorICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorI2RlZmluZSBDRkdfRU5BQkxFX05BTl9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAiZ0VuYWJsZU5hblN1cHBvcnQiCisjZGVmaW5lIENGR19FTkFCTEVfTkFOX1NVUFBPUlRfREVGQVVMVCAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX05BTl9TVVBQT1JUX01JTiAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9OQU5fU1VQUE9SVF9NQVggICAgICAgICAgICAgICAgICAgICAgKDEpCisjZW5kaWYKKworI2RlZmluZSBDRkdfRU5BQkxFX1NFTEZfUkVDT1ZFUlkgICAgICAgICAgICAgICAgICAgImdFbmFibGVTZWxmUmVjb3ZlcnkiCisjZGVmaW5lIENGR19FTkFCTEVfU0VMRl9SRUNPVkVSWV9NSU4gICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TRUxGX1JFQ09WRVJZX01BWCAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX1NFTEZfUkVDT1ZFUllfREVGQVVMVCAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TQVBfU1VTUEVORCAgICAgICAgICAgICAgICAgICAgICJnRW5hYmxlU2FwU3VzcGVuZCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TQVBfU1VTUEVORF9NSU4gICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX1NBUF9TVVNQRU5EX01BWCAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfU0FQX1NVU1BFTkRfREVGQVVMVCAgICAgICAgICAgICAoMSkKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9FWFRXT1dfU1VQUE9SVAorI2RlZmluZSBDRkdfRVhUV09XX0dPX1RPX1NVU1BFTkQgICAgICAgICAgICAgICAgICAgImdFeHRXb1dnb3RvU3VzcGVuZCIKKyNkZWZpbmUgQ0ZHX0VYVFdPV19HT19UT19TVVNQRU5EX01JTiAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRVhUV09XX0dPX1RPX1NVU1BFTkRfTUFYICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19FWFRXT1dfR09fVE9fU1VTUEVORF9ERUZBVUxUICAgICAgICAgICAoMSkKKworI2RlZmluZSBDRkdfRVhUV09XX0FQUDFfV0FLRV9QSU5fTlVNQkVSICAgICAgICAgICAgImdFeHRXb3dBcHAxV2FrZXVwUGluTnVtYmVyIgorI2RlZmluZSBDRkdfRVhUV09XX0FQUDFfV0FLRV9QSU5fTlVNQkVSX01JTiAgICAgICAgKDApCisjZGVmaW5lIENGR19FWFRXT1dfQVBQMV9XQUtFX1BJTl9OVU1CRVJfTUFYICAgICAgICAoMjU1KQorI2RlZmluZSBDRkdfRVhUV09XX0FQUDFfV0FLRV9QSU5fTlVNQkVSX0RFRkFVTFQgICAgKDEyKQorCisjZGVmaW5lIENGR19FWFRXT1dfQVBQMl9XQUtFX1BJTl9OVU1CRVIgICAgICAgICAgICAiZ0V4dFdvd0FwcDJXYWtldXBQaW5OdW1iZXIiCisjZGVmaW5lIENGR19FWFRXT1dfQVBQMl9XQUtFX1BJTl9OVU1CRVJfTUlOICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VYVFdPV19BUFAyX1dBS0VfUElOX05VTUJFUl9NQVggICAgICAgICgyNTUpCisjZGVmaW5lIENGR19FWFRXT1dfQVBQMl9XQUtFX1BJTl9OVU1CRVJfREVGQVVMVCAgICAoMTYpCisKKyNkZWZpbmUgQ0ZHX0VYVFdPV19LQV9JTklUX1BJTkdfSU5URVJWQUwgICAgICAgICAgICJnRXh0V29XQXBwMktBSW5pdFBpbmdJbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX0VYVFdPV19LQV9JTklUX1BJTkdfSU5URVJWQUxfTUlOICAgICAgICgwKQorI2RlZmluZSBDRkdfRVhUV09XX0tBX0lOSVRfUElOR19JTlRFUlZBTF9NQVggICAgICAgKDB4ZmZmZmZmZmYpCisjZGVmaW5lIENGR19FWFRXT1dfS0FfSU5JVF9QSU5HX0lOVEVSVkFMX0RFRkFVTFQgICAoMjQwKQorCisjZGVmaW5lIENGR19FWFRXT1dfS0FfTUlOX1BJTkdfSU5URVJWQUwgICAgICAgICAgICAiZ0V4dFdvV0FwcDJLQU1pblBpbmdJbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX0VYVFdPV19LQV9NSU5fUElOR19JTlRFUlZBTF9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfRVhUV09XX0tBX01JTl9QSU5HX0lOVEVSVkFMX01BWCAgICAgICAgKDB4ZmZmZmZmZmYpCisjZGVmaW5lIENGR19FWFRXT1dfS0FfTUlOX1BJTkdfSU5URVJWQUxfREVGQVVMVCAgICAoMjQwKQorCisjZGVmaW5lIENGR19FWFRXT1dfS0FfTUFYX1BJTkdfSU5URVJWQUwgICAgICAgICAgICAiZ0V4dFdvV0FwcDJLQU1heFBpbmdJbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX0VYVFdPV19LQV9NQVhfUElOR19JTlRFUlZBTF9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfRVhUV09XX0tBX01BWF9QSU5HX0lOVEVSVkFMX01BWCAgICAgICAgKDB4ZmZmZmZmZmYpCisjZGVmaW5lIENGR19FWFRXT1dfS0FfTUFYX1BJTkdfSU5URVJWQUxfREVGQVVMVCAgICAoMTI4MCkKKworI2RlZmluZSBDRkdfRVhUV09XX0tBX0lOQ19QSU5HX0lOVEVSVkFMICAgICAgICAgICAgImdFeHRXb1dBcHAyS0FJbmNQaW5nSW50ZXJ2YWwiCisjZGVmaW5lIENGR19FWFRXT1dfS0FfSU5DX1BJTkdfSU5URVJWQUxfTUlOICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VYVFdPV19LQV9JTkNfUElOR19JTlRFUlZBTF9NQVggICAgICAgICgweGZmZmZmZmZmKQorI2RlZmluZSBDRkdfRVhUV09XX0tBX0lOQ19QSU5HX0lOVEVSVkFMX0RFRkFVTFQgICAgKDQpCisKKyNkZWZpbmUgQ0ZHX0VYVFdPV19UQ1BfU1JDX1BPUlQgICAgICAgICAgICAgICAgICAgICJnRXh0V29XQXBwMlRjcFNyY1BvcnQiCisjZGVmaW5lIENGR19FWFRXT1dfVENQX1NSQ19QT1JUX01JTiAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VYVFdPV19UQ1BfU1JDX1BPUlRfTUFYICAgICAgICAgICAgICAgICg2NTUzNSkKKyNkZWZpbmUgQ0ZHX0VYVFdPV19UQ1BfU1JDX1BPUlRfREVGQVVMVCAgICAgICAgICAgICg1MDAwKQorCisjZGVmaW5lIENGR19FWFRXT1dfVENQX0RTVF9QT1JUICAgICAgICAgICAgICAgICAgICAiZ0V4dFdvV0FwcDJUY3BEc3RQb3J0IgorI2RlZmluZSBDRkdfRVhUV09XX1RDUF9EU1RfUE9SVF9NSU4gICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FWFRXT1dfVENQX0RTVF9QT1JUX01BWCAgICAgICAgICAgICAgICAoNjU1MzUpCisjZGVmaW5lIENGR19FWFRXT1dfVENQX0RTVF9QT1JUX0RFRkFVTFQgICAgICAgICAgICAoNTAwMSkKKworI2RlZmluZSBDRkdfRVhUV09XX1RDUF9UWF9USU1FT1VUICAgICAgICAgICAgICAgICAgImdFeHRXb1dBcHAyVGNwVHhUaW1lb3V0IgorI2RlZmluZSBDRkdfRVhUV09XX1RDUF9UWF9USU1FT1VUX01JTiAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19FWFRXT1dfVENQX1RYX1RJTUVPVVRfTUFYICAgICAgICAgICAgICAoMHhmZmZmZmZmZikKKyNkZWZpbmUgQ0ZHX0VYVFdPV19UQ1BfVFhfVElNRU9VVF9ERUZBVUxUICAgICAgICAgICgyMDApCisKKyNkZWZpbmUgQ0ZHX0VYVFdPV19UQ1BfUlhfVElNRU9VVCAgICAgICAgICAgICAgICAgICJnRXh0V29XQXBwMlRjcFJ4VGltZW91dCIKKyNkZWZpbmUgQ0ZHX0VYVFdPV19UQ1BfUlhfVElNRU9VVF9NSU4gICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfRVhUV09XX1RDUF9SWF9USU1FT1VUX01BWCAgICAgICAgICAgICAgKDB4ZmZmZmZmZmYpCisjZGVmaW5lIENGR19FWFRXT1dfVENQX1JYX1RJTUVPVVRfREVGQVVMVCAgICAgICAgICAoMjAwKQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9ERUFVVEhfVE9fRElTQVNTT0NfTUFQX05BTUUgICAgImdFbmFibGVEZWF1dGhUb0Rpc2Fzc29jTWFwIgorI2RlZmluZSBDRkdfRU5BQkxFX0RFQVVUSF9UT19ESVNBU1NPQ19NQVBfTUlOICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9ERUFVVEhfVE9fRElTQVNTT0NfTUFQX01BWCAgICAgKDEpCisjZGVmaW5lIENGR19FTkFCTEVfREVBVVRIX1RPX0RJU0FTU09DX01BUF9ERUZBVUxUICgwKQorCisjaWZkZWYgREhDUF9TRVJWRVJfT0ZGTE9BRAorI2RlZmluZSBDRkdfREhDUF9TRVJWRVJfT0ZGTE9BRF9TVVBQT1JUX05BTUUgICAgICAiZ0RIQ1BTZXJ2ZXJPZmZsb2FkRW5hYmxlIgorI2RlZmluZSBDRkdfREhDUF9TRVJWRVJfT0ZGTE9BRF9TVVBQT1JUX01JTiAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0RIQ1BfU0VSVkVSX09GRkxPQURfU1VQUE9SVF9NQVggICAgICAgKDEpCisjZGVmaW5lIENGR19ESENQX1NFUlZFUl9PRkZMT0FEX1NVUFBPUlRfREVGQVVMVCAgIChDRkdfREhDUF9TRVJWRVJfT0ZGTE9BRF9TVVBQT1JUX01JTikKKworI2RlZmluZSBDRkdfREhDUF9TRVJWRVJfT0ZGTE9BRF9OVU1fQ0xJRU5UX05BTUUgICAgICJnREhDUE1heE51bUNsaWVudHMiCisjZGVmaW5lIENGR19ESENQX1NFUlZFUl9PRkZMT0FEX05VTV9DTElFTlRfTUlOICAgICAgKDEpCisjZGVmaW5lIENGR19ESENQX1NFUlZFUl9PRkZMT0FEX05VTV9DTElFTlRfTUFYICAgICAgKDgpCisjZGVmaW5lIENGR19ESENQX1NFUlZFUl9PRkZMT0FEX05VTV9DTElFTlRfREVGQVVMVCAgKENGR19ESENQX1NFUlZFUl9PRkZMT0FEX05VTV9DTElFTlRfTUFYKQorCisjZGVmaW5lIENGR19ESENQX1NFUlZFUl9JUF9OQU1FICAgICAiZ0RIQ1BTZXJ2ZXJJUCIKKyNkZWZpbmUgQ0ZHX0RIQ1BfU0VSVkVSX0lQX0RFRkFVTFQgICIiCisjZW5kaWYgLyogREhDUF9TRVJWRVJfT0ZGTE9BRCAqLworCisvKgorICogSWYgbGFzdCBkaXNjb25uZWN0aW9uIHdhcyBkdWUgdG8gSEIgZmFpbHVyZSBhbmQgd2UgcmVjb25uZWN0CisgKiB0byBzYW1lIEFQIG5leHQgdGltZSwgc2VuZCBEZWF1dGggYmVmb3JlIHN0YXJ0aW5nIGNvbm5lY3Rpb24KKyAqLworI2RlZmluZSBDRkdfRU5BQkxFX0RFQVVUSF9CRUZPUkVfQ09OTkVDVElPTiAgICAgICAgICAgICAgICAgICJnU2VuZERlYXV0aEJlZm9yZUNvbiIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9ERUFVVEhfQkVGT1JFX0NPTk5FQ1RJT05fTUlOICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9ERUFVVEhfQkVGT1JFX0NPTk5FQ1RJT05fTUFYICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9ERUFVVEhfQkVGT1JFX0NPTk5FQ1RJT05fREVGQVVMVCAgICAgICAgICAoMCkKKworLyoKKyAqIEN1c3RvbSBjb25jdXJyZW5jeSBydWxlMToKKyAqIElmIFNBUCBjb21lcyB1cCBmaXJzdCBhbmQgU1RBIGNvbWVzIHVwIGxhdGVyIHRoZW4gU0FQCisgKiBuZWVkcyB0byBmb2xsb3cgU1RBJ3MgY2hhbm5lbC4KKyAqLworI2RlZmluZSBDRkdfRU5BQkxFX0NVU1RPTV9DT05DX1JVTEUxX05BTUUgICAgICAgICAiZ0VuYWJsZUN1c3RvbUNvbmNSdWxlMSIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9DVVNUT01fQ09OQ19SVUxFMV9OQU1FX01JTiAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfQ1VTVE9NX0NPTkNfUlVMRTFfTkFNRV9NQVggICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0NVU1RPTV9DT05DX1JVTEUxX05BTUVfREVGQVVMVCAoMCkKKworI2RlZmluZSBDRkdfRU5BQkxFX0NVU1RPTV9DT05DX1JVTEUyX05BTUUgICAgICAgICAiZ0VuYWJsZUN1c3RvbUNvbmNSdWxlMiIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9DVVNUT01fQ09OQ19SVUxFMl9OQU1FX01JTiAgICAgKDApCisjZGVmaW5lIENGR19FTkFCTEVfQ1VTVE9NX0NPTkNfUlVMRTJfTkFNRV9NQVggICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX0NVU1RPTV9DT05DX1JVTEUyX05BTUVfREVGQVVMVCAoMCkKKworI2RlZmluZSBDRkdfRU5BQkxFX1NUQV9DT05ORUNUSU9OX0lOXzVHSFogICAgICAgICAiZ0VuYWJsZVN0YUNvbm5lY3Rpb25JbjVHaHoiCisjZGVmaW5lIENGR19FTkFCTEVfU1RBX0NPTk5FQ1RJT05fSU5fNUdIWl9NSU4gICAgICgwKQorI2RlZmluZSBDRkdfRU5BQkxFX1NUQV9DT05ORUNUSU9OX0lOXzVHSFpfTUFYICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TVEFfQ09OTkVDVElPTl9JTl81R0haX0RFRkFVTFQgKDEpCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NQUNfQUREUl9TUE9PRklORyAgICAgICAgICAgICAgICAiZ0VuYWJsZU1hY0FkZHJTcG9vZiIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NQUNfQUREUl9TUE9PRklOR19NSU4gICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NQUNfQUREUl9TUE9PRklOR19NQVggICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NQUNfQUREUl9TUE9PRklOR19ERUZBVUxUICAgICAgICAoMSkKKworI2RlZmluZSBDRkdfUDJQX0xJU1RFTl9ERUZFUl9JTlRFUlZBTF9OQU1FICAgICAgICAiZ1AyUExpc3RlbkRlZmVySW50ZXJ2YWwiCisjZGVmaW5lIENGR19QMlBfTElTVEVOX0RFRkVSX0lOVEVSVkFMX01JTiAgICAgICAgICgxMDApCisjZGVmaW5lIENGR19QMlBfTElTVEVOX0RFRkVSX0lOVEVSVkFMX01BWCAgICAgICAgICgyMDApCisjZGVmaW5lIENGR19QMlBfTElTVEVOX0RFRkVSX0lOVEVSVkFMX0RFRkFVTFQgICAgICgxMDApCisKKyNkZWZpbmUgQ0ZHX1NUQV9NSVJBQ0FTVF9NQ0NfUkVTVF9USU1FX1ZBTCAgICAgICAgICAiZ1N0YU1pcmFjYXN0TWNjUmVzdFRpbWVWYWwiCisjZGVmaW5lIENGR19TVEFfTUlSQUNBU1RfTUNDX1JFU1RfVElNRV9WQUxfTUlOICAgICAoMTAwKQorI2RlZmluZSBDRkdfU1RBX01JUkFDQVNUX01DQ19SRVNUX1RJTUVfVkFMX01BWCAgICAgKDUwMCkKKyNkZWZpbmUgQ0ZHX1NUQV9NSVJBQ0FTVF9NQ0NfUkVTVF9USU1FX1ZBTF9ERUZBVUxUICg0MDApCisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKyNkZWZpbmUgQ0ZHX1NBUF9NQ0NfQ0hBTk5FTF9BVk9JREFOQ0VfTkFNRSAgICAgICAgICJnU2FwQ2hhbm5lbEF2b2lkYW5jZSIKKyNkZWZpbmUgQ0ZHX1NBUF9NQ0NfQ0hBTk5FTF9BVk9JREFOQ0VfTUlOICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfU0FQX01DQ19DSEFOTkVMX0FWT0lEQU5DRV9NQVggICAgICAgICAgKDEpCisjZGVmaW5lIENGR19TQVBfTUNDX0NIQU5ORUxfQVZPSURBTkNFX0RFRkFVTFQgICAgICAoMCkKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKworI2RlZmluZSBDRkdfU0FQX1AyUF8xMUFDX09WRVJSSURFX05BTUUgICAgICAgICAgICAgImdBUDExQUNPdmVycmlkZSIKKyNkZWZpbmUgQ0ZHX1NBUF9QMlBfMTFBQ19PVkVSUklERV9NSU4gICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfU0FQX1AyUF8xMUFDX09WRVJSSURFX01BWCAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19TQVBfUDJQXzExQUNfT1ZFUlJJREVfREVGQVVMVCAgICAgICAgICAoMSkKKworI2RlZmluZSBDRkdfU0FQX0RPVDExTUMgICAgICAgICAgICAgICAiZ1NhcERvdDExbWMiCisjZGVmaW5lIENGR19TQVBfRE9UMTFNQ19NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfU0FQX0RPVDExTUNfTUFYICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1NBUF9ET1QxMU1DX0RFRkFVTFQgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9OT05fREZTX0NIQU5fT05fUkFEQVIgICAgICAgICAgICJnUHJlZmVyTm9uRGZzQ2hhbk9uUmFkYXIiCisjZGVmaW5lIENGR19FTkFCTEVfTk9OX0RGU19DSEFOX09OX1JBREFSX01JTiAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9OT05fREZTX0NIQU5fT05fUkFEQVJfTUFYICAgICAgICgxKQorI2RlZmluZSBDRkdfRU5BQkxFX05PTl9ERlNfQ0hBTl9PTl9SQURBUl9ERUZBVUxUICAgKDApCisKKyNkZWZpbmUgQ0ZHX01VTFRJQ0FTVF9IT1NUX0ZXX01TR1MgICAgICAgICAgImdNdWx0aWNhc3RIb3N0RndNc2dzIgorI2RlZmluZSBDRkdfTVVMVElDQVNUX0hPU1RfRldfTVNHU19NSU4gICAgICAoMCkKKyNkZWZpbmUgQ0ZHX01VTFRJQ0FTVF9IT1NUX0ZXX01TR1NfTUFYICAgICAgKDEpCisjZGVmaW5lIENGR19NVUxUSUNBU1RfSE9TVF9GV19NU0dTX0RFRkFVTFQgICgxKQorCisvKgorICogd2xhbiBzeXN0ZW0gcHJlZmVyZW5jZSBvcHRpb24gdG8gaGVscCBwb2xpY3kgbWFuYWdlciBkZWNpZGUKKyAqIG9uIFByZWZlcnJlZCBDaGFubmVsIExpc3QgZm9yIGEgbmV3IGNvbm5lY3Rpb24uIEZvciBwb3NzaWJsZQorICogdmFsdWVzIHJlZmVyIHRvIGVudW0gaGRkX2NvbmNfcHJpb3JpdHlfbW9kZQorICovCisjZGVmaW5lIENGR19DT05DX1NZU1RFTV9QUkVGICAgICAgICAgICAgICAgImdTeXN0ZW1QcmVmIgorI2RlZmluZSBDRkdfQ09OQ19TWVNURU1fUFJFRl9NSU4gICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfQ09OQ19TWVNURU1fUFJFRl9NQVggICAgICAgICAgICgyKQorI2RlZmluZSBDRkdfQ09OQ19TWVNURU1fUFJFRl9ERUZBVUxUICAgICAgICgwKQorCisjZGVmaW5lIENGR19QT0xJQ1lfTU5HUl9FTkFCTEUgICAgICAgICAgICAgICJnUG9saWN5TWFuYWdlckVuYWJsZSIKKyNkZWZpbmUgQ0ZHX1BPTElDWV9NTkdSX0VOQUJMRV9NSU4gICAgICAgICAgKDApCisjZGVmaW5lIENGR19QT0xJQ1lfTU5HUl9FTkFCTEVfTUFYICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfUE9MSUNZX01OR1JfRU5BQkxFX0RFRkFVTFQgICAgICAoMSkKKworI2RlZmluZSBDRkdfVFNPX0VOQUJMRURfTkFNRSAgICAgICAgICAgIlRTT0VuYWJsZSIKKyNkZWZpbmUgQ0ZHX1RTT19FTkFCTEVEX01JTiAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfVFNPX0VOQUJMRURfTUFYICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19UU09fRU5BQkxFRF9ERUZBVUxUICAgICAgICAoMCkKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGVuYWJsZSBvciBkaXNhYmxlIExSTyAoTGFyZ2UgUmVjZWl2ZSBPZmZsb2FkKQorICogIGluIHRoZSBXTEFOIGRyaXZlcgorICogIFNldCAxIC0gZW5hYmxlLCAwIC0gZGlzYWJsZQorICovCisjZGVmaW5lIENGR19MUk9fRU5BQkxFRF9OQU1FICAgICAgICAgICAiTFJPRW5hYmxlIgorI2RlZmluZSBDRkdfTFJPX0VOQUJMRURfTUlOICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19MUk9fRU5BQkxFRF9NQVggICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0xST19FTkFCTEVEX0RFRkFVTFQgICAgICAgICgwKQorCisvKgorICogSW4gc3RhdGljIGRpc3BsYXkgdXNlIGNhc2Ugd2hlbiBBUFBTIGlzIGluIHN0YW5kIGFsb25lIHBvd2VyIHNhdmUgbW9kZSBlbmFibGUKKyAqIGFjdGl2ZSBvZmZsb2FkIG1vZGUgd2hpY2ggaGVscHMgRlcgdG8gZmlsdGVyIG91dCBNQy9CQyBkYXRhIHBhY2tldHMgdG8gYXZvaWQKKyAqIEFQUFMgd2FrZSB1cCBhbmQgc2F2ZSBtb3JlIHBvd2VyLgorICoKKyAqIEJ5IGRlZmF1bHQgZW5hYmxlIGFjdGl2ZSBtb2RlIG9mZmxvYWQgYXMgaXQgaGVscHMgdG8gc2F2ZSBtb3JlIHBvd2VyIGluCisgKiBzdGF0aWMgZGlzcGxheSB1c2VjYXNlKEFQUFMgc3RhbmQgYWxvbmUgcG93ZXIgY29sbGFwc2UpLgorICoKKyAqIElmIGFjdGl2ZSBtb2RlIG9mZmxvYWQoZ0FjdGl2ZU1vZGVPZmZsb2FkPTEpIGlzIGVuYWJsZWQgdGhlbiBhbGwgYXBwbGljYWJsZQorICogZGF0YSBvZmZsb2FkL2ZpbHRlcmluZyBpcyBlbmFibGVkIGltbWVkaWF0ZWx5IGluIEZXIG9uY2UgY29uZmlnIGlzIGF2YWlsYWJsZQorICogaW4gV0xBTiBkcml2ZXIgYW5kIEZXIGNhY2hlcyB0aGlzIGNvbmZpZ3VyYXRpb24gYWNjcm9zcyBzdXNwZW5kL3Jlc3VtZQorICoKKyAqIElmIGFjdGl2ZSBtb2RlIG9mZmxvYWQgaXMgZGlzYWJsZWQoZ0FjdGl2ZU1vZGVPZmZsb2FkPTApIHRoZW4gYWxsIGFwcGxpY2FibGUKKyAqIGRhdGEgb2ZmbG9hZC9maWx0ZXJpbmcgaXMgZW5hYmxlZCBkdXJpbmcgY2ZnODAyMTEgc3VzcGVuZCBhbmQgZGlzYWJsZWQKKyAqIGR1cmluZyBjZmc4MDIxMSByZXN1bWUKKyAqCisgKiBBY3RpdmUgbW9kZSBvZmZsb2FkIGZlYXR1cmUgaXMgYnlkZWZhdWx0IGVuYWJsZWQgZm9yIGFkcmFzdGVhIGFuZCBkaXNhYmxlZAorICogZm9yIG5vbiBhZHJhc3RlYSB0YXJnZXRzIGxpa2UgUk9NRQorICovCisKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NT0RFX09GRkxPQUQgICAgICAgICAgICAiZ0FjdGl2ZU1vZGVPZmZsb2FkIgorI2RlZmluZSBDRkdfQUNUSVZFX01PREVfT0ZGTE9BRF9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfQUNUSVZFX01PREVfT0ZGTE9BRF9NQVggICAgICAgICgxKQorI2lmZGVmIFFDQV9XSUZJXzNfMF9BRFJBU1RFQQorI2RlZmluZSBDRkdfQUNUSVZFX01PREVfT0ZGTE9BRF9ERUZBVUxUICAgICgxKQorI2Vsc2UKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NT0RFX09GRkxPQURfREVGQVVMVCAgICAoMCkKKyNlbmRpZgorCisvKgorICogMDogZGlzYWJsZSB0aGUgY2NrIHR4IGNoYWluIG1hc2sgKGRlZmF1bHQpCisgKiAxOiBlbmFibGUgdGhlIGNjayB0eCBjaGFpbiBtYXNrCisgKi8KKyNkZWZpbmUgQ0ZHX1RYX0NIQUlOX01BU0tfQ0NLICAgICAgICAgICJnQ2NrQ2hhaW5NYXNrRW5hYmxlIgorI2RlZmluZSBDRkdfVFhfQ0hBSU5fTUFTS19DQ0tfTUlOICAgICAgKDApCisjZGVmaW5lIENGR19UWF9DSEFJTl9NQVNLX0NDS19NQVggICAgICAoMSkKKyNkZWZpbmUgQ0ZHX1RYX0NIQUlOX01BU0tfQ0NLX0RFRkFVTFQgICgwKQorCisjZGVmaW5lIENGR19UWF9DSEFJTl9NQVNLXzFTUyAgICAgICAiZ1R4Q2hhaW5NYXNrMXNzIgorI2RlZmluZSBDRkdfVFhfQ0hBSU5fTUFTS18xU1NfTUlOICAgICAgKDApCisjZGVmaW5lIENGR19UWF9DSEFJTl9NQVNLXzFTU19NQVggICAgICAoMykKKyNkZWZpbmUgQ0ZHX1RYX0NIQUlOX01BU0tfMVNTX0RFRkFVTFQgICgxKQorCisvKgorICogc2V0IHRoZSBzZWxmIGdlbiBwb3dlciB2YWx1ZSBmcm9tCisgKiAwIHRvIDB4ZmZmZgorICovCisjZGVmaW5lIENGR19TRUxGX0dFTl9GUk1fUFdSICAgICAgICAiZ1NlbGZHZW5Gcm1Qd3IiCisjZGVmaW5lIENGR19TRUxGX0dFTl9GUk1fUFdSX01JTiAgICAgICgwKQorI2RlZmluZSBDRkdfU0VMRl9HRU5fRlJNX1BXUl9NQVggICAgICAoMHhmZmZmKQorI2RlZmluZSBDRkdfU0VMRl9HRU5fRlJNX1BXUl9ERUZBVUxUICAoMCkKKworLyoKKyAqIGZpbmUgdGltaW5nIG1lYXN1cmVtZW50IGNhcGFiaWxpdHkgaW5mb3JtYXRpb24KKyAqCisgKiA8LS0tLS0gZmluZV90aW1lX21lYXNfY2FwIChpbiBiaXRzKSAtLS0tLT4KKyAqKy0tLS0tLS0tLS0rLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0rLS0tLS0rCisgKnwgICA5LTMxICAgfCAgOCAgfCAgNyAgfCAgIDUgIHwgICA0ICB8ICAgMyAgIHwgICAyICAgfCAgMSAgfCAgMCAgfAorICorLS0tLS0tLS0tLSstLS0tLSstLS0tLSstLS0tLS0rLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLSstLS0tLSsKKyAqfCByZXNlcnZlZCB8IFNBUCB8IFNBUCB8UDJQLUdPfFAyUC1HT3xQMlAtQ0xJfFAyUC1DTEl8IFNUQSB8IFNUQSB8CisgKnwgICAgICAgICAgfHJlc3AgfGluaXQgfHJlc3AgIHxpbml0ICB8cmVzcCAgIHxpbml0ICAgfHJlc3AgfGluaXQgfAorICorLS0tLS0tLS0tLSstLS0tLSstLS0tLSstLS0tLS0rLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLSstLS0tLSsKKyAqCisgKiByZXNwIC0gcmVzcG9uZGVyIHJvbGU7IGluaXQtIGluaXRpYXRvciByb2xlCisgKgorICogQ0ZHX0ZJTkVfVElNRV9NRUFTX0NBUEFCSUxJVFlfTUFYIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSB0YWJsZQorICogKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICogfCAgRGV2aWNlIFJvbGUgICAgfCAgIEluaXRpYXRvciAgICAgfCBSZXNwb25kZXIgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICogfCAgIFN0YXRpb24gICAgICAgfCAgICAgICBZICAgICAgICAgfCAgICAgTiAgICAgfAorICogfCAgIFAyUC1DTEkgICAgICAgfCAgICAgICBZICAgICAgICAgfCAgICAgWSAgICAgfAorICogfCAgIFAyUC1HTyAgICAgICAgfCAgICAgICBZICAgICAgICAgfCAgICAgWSAgICAgfAorICogfCAgIFNBUCAgICAgICAgICAgfCAgICAgICBOICAgICAgICAgfCAgICAgWSAgICAgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICovCisjZGVmaW5lIENGR19GSU5FX1RJTUVfTUVBU19DQVBBQklMSVRZICAgICAgICAgICAgICAiZ2ZpbmVfdGltZV9tZWFzX2NhcCIKKyNkZWZpbmUgQ0ZHX0ZJTkVfVElNRV9NRUFTX0NBUEFCSUxJVFlfTUlOICAgICAgICAgICgweDAwMDApCisjZGVmaW5lIENGR19GSU5FX1RJTUVfTUVBU19DQVBBQklMSVRZX01BWCAgICAgICAgICAoMHgwMEJEKQorI2RlZmluZSBDRkdfRklORV9USU1FX01FQVNfQ0FQQUJJTElUWV9ERUZBVUxUICAgICAgKDB4MDAwRCkKKworLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIHNjYW5zIHRoYXQgaG9zdCBjYW4gcXVldWUgYXQgZmlybXdhcmUgaXMgY29udHJvbGxlZAorICogdGhyb3VnaCB0aGUgY29uZmlndXJhdGlvbiBpdGVtICAnbWF4X3NjYW5fY291bnQnLgorICoKKyAqIFJvbWUgLSBSb21lIGZpcm13YXJlIHN1cHBvcnQgOCBzY2FuIHF1ZXVlIHNpemUgYW5kIDQgYXJlIHJlc2VydmVkCisgKiBmb3IgaW50ZXJuYWwgc2NhbiByZXF1ZXN0cyBsaWtlIHJvYW1pbmcuIFNvIGhvc3QgY2FuIHNlbmQgNAorICogc2NhbiByZXF1ZXN0cy4KKyAqCisgKiBpaGVsaXVtIC0gVGhlcmUgaXMgbm8gY29uc3RyYWludCBpbiBudW1iZXIgb2Ygc2NhbiBxdWV1ZSBzaXplIGF0CisgKiBmaXJtd2FyZSBidXQgdGhlIGN1cnJlbnQgdXNlcyBjYXNlcyBuZWVkcyBzdXBwb3J0IG9mIG1heGltdW0KKyAqIG9mIDQgc2NhbiByZXF1ZXN0IGZyb20gaG9zdC4KKyAqLworI2RlZmluZSBDRkdfTUFYX1NDQU5fQ09VTlRfTkFNRSAgICAgICAgICAgIm1heF9zY2FuX2NvdW50IgorI2RlZmluZSBDRkdfTUFYX1NDQU5fQ09VTlRfTUlOICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19NQVhfU0NBTl9DT1VOVF9NQVggICAgICAgICAgICAoOCkKKyNkZWZpbmUgQ0ZHX01BWF9TQ0FOX0NPVU5UX0RFRkFVTFQgICAgICAgICg0KQorCisvKioKKyAqIGVudW0gZG90MTFwX21vZGUgLSBUaGUgODAyLjExcCBtb2RlIG9mIG9wZXJhdGlvbgorICogQFdMQU5fSEREXzExUF9ESVNBQkxFRDogICA4MDIuMTFwIG1vZGUgaXMgZGlzYWJsZWQKKyAqIEBXTEFOX0hERF8xMVBfU1RBTkRBTE9ORTogODAyLjExcC1vbmx5IG9wZXJhdGlvbgorICogQFdMQU5fSEREXzExUF9DT05DVVJSRU5UOiA4MDIuMTFwIGFuZCBXTEFOIG9wZXJhdGUgY29uY3VycmVudGx5CisgKi8KK2VudW0gZG90MTFwX21vZGUgeworCVdMQU5fSEREXzExUF9ESVNBQkxFRCA9IDAsCisJV0xBTl9IRERfMTFQX1NUQU5EQUxPTkUsCisJV0xBTl9IRERfMTFQX0NPTkNVUlJFTlQsCit9OworCisjZGVmaW5lIENGR19ET1QxMVBfTU9ERV9OQU1FICAgICAgICAgICAgICJnRG90MTFQTW9kZSIKKyNkZWZpbmUgQ0ZHX0RPVDExUF9NT0RFX0RFRkFVTFQgICAgICAgICAgKFdMQU5fSEREXzExUF9ESVNBQkxFRCkKKyNkZWZpbmUgQ0ZHX0RPVDExUF9NT0RFX01JTiAgICAgICAgICAgICAgKFdMQU5fSEREXzExUF9ESVNBQkxFRCkKKyNkZWZpbmUgQ0ZHX0RPVDExUF9NT0RFX01BWCAgICAgICAgICAgICAgKFdMQU5fSEREXzExUF9DT05DVVJSRU5UKQorCisjZGVmaW5lIENGR19OQVBJX05BTUUgICAgICAgImdFbmFibGVOQVBJIgorI2RlZmluZSBDRkdfTkFQSV9NSU4gICAgICAgICgwKQorI2RlZmluZSBDRkdfTkFQSV9NQVggICAgICAgICgxKQorI2RlZmluZSBDRkdfTkFQSV9ERUZBVUxUICAgICgwKQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKyNkZWZpbmUgQ0ZHX0VYVFNDQU5fUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX05BTUUgICAgICAiZ0V4dFNjYW5QYXNzaXZlTWF4Q2hhbm5lbFRpbWUiCisjZGVmaW5lIENGR19FWFRTQ0FOX1BBU1NJVkVfTUFYX0NIQU5ORUxfVElNRV9NSU4gICAgICAgKDExMCkKKyNkZWZpbmUgQ0ZHX0VYVFNDQU5fUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX01BWCAgICAgICAoNTAwKQorI2RlZmluZSBDRkdfRVhUU0NBTl9QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfREVGQVVMVCAgICgxMTApCisKKyNkZWZpbmUgQ0ZHX0VYVFNDQU5fUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX05BTUUgICAgICAiZ0V4dFNjYW5QYXNzaXZlTWluQ2hhbm5lbFRpbWUiCisjZGVmaW5lIENGR19FWFRTQ0FOX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9NSU4gICAgICAgKDYwKQorI2RlZmluZSBDRkdfRVhUU0NBTl9QQVNTSVZFX01JTl9DSEFOTkVMX1RJTUVfTUFYICAgICAgICg1MDApCisjZGVmaW5lIENGR19FWFRTQ0FOX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9ERUZBVUxUICAgKDYwKQorCisjZGVmaW5lIENGR19FWFRTQ0FOX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX05BTUUgICAgICAgImdFeHRTY2FuQWN0aXZlTWF4Q2hhbm5lbFRpbWUiCisjZGVmaW5lIENGR19FWFRTQ0FOX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX01JTiAgICAgICAgKDQwKQorI2RlZmluZSBDRkdfRVhUU0NBTl9BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9NQVggICAgICAgICgxMTApCisjZGVmaW5lIENGR19FWFRTQ0FOX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX0RFRkFVTFQgICAgKDQwKQorCisjZGVmaW5lIENGR19FWFRTQ0FOX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX05BTUUgICAgICAgImdFeHRTY2FuQWN0aXZlTWluQ2hhbm5lbFRpbWUiCisjZGVmaW5lIENGR19FWFRTQ0FOX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX01JTiAgICAgICAgKDIwKQorI2RlZmluZSBDRkdfRVhUU0NBTl9BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9NQVggICAgICAgICgxMTApCisjZGVmaW5lIENGR19FWFRTQ0FOX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX0RFRkFVTFQgICAgKDIwKQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0NFX0NMQVNTSUZZX0VOQUJMRV9OQU1FCSJnQ0VDbGFzc2lmeUVuYWJsZSIKKyNkZWZpbmUgQ0ZHX0NFX0NMQVNTSUZZX0VOQUJMRV9NSU4JKDApCisjZGVmaW5lIENGR19DRV9DTEFTU0lGWV9FTkFCTEVfTUFYCSgxKQorI2RlZmluZSBDRkdfQ0VfQ0xBU1NJRllfRU5BQkxFX0RFRkFVTFQJKDApCisKKyNkZWZpbmUgQ0ZHX0RVQUxfTUFDX0ZFQVRVUkVfRElTQUJMRSAgICAgICAgICAgICAgICJnRHVhbE1hY0ZlYXR1cmVEaXNhYmxlIgorI2RlZmluZSBDRkdfRFVBTF9NQUNfRkVBVFVSRV9ESVNBQkxFX01JTiAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0RVQUxfTUFDX0ZFQVRVUkVfRElTQUJMRV9NQVggICAgICAgICAgKDEpCisjZGVmaW5lIENGR19EVUFMX01BQ19GRUFUVVJFX0RJU0FCTEVfREVGQVVMVCAgICAgICgwKQorCisvKiBQYXJhbWV0ZXJzIGZvciByb2FtaW5nIHNjYW5zIHBlcmZvcm1lZCBhdCBoaWdoIFJTU0kgKi8KKworLyogTWF4aW11bSBudW1iZXIgb2Ygc2NhbnMgYWZ0ZXIgUlNTSSBjaGFuZ2UgKi8KKyNkZWZpbmUgQ0ZHX1JPQU1fU0NBTl9ISV9SU1NJX01BWENPVU5UX05BTUUgICAgICAgICAiZ1JvYW1TY2FuSGlSc3NpTWF4Q291bnQiCisjZGVmaW5lIENGR19ST0FNX1NDQU5fSElfUlNTSV9NQVhDT1VOVF9NSU4gICAgICAgICAgKDApCisjZGVmaW5lIENGR19ST0FNX1NDQU5fSElfUlNTSV9NQVhDT1VOVF9NQVggICAgICAgICAgKDEwKQorI2RlZmluZSBDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfTUFYQ09VTlRfREVGQVVMVCAgICAgICg1KQorCisvKiBDaGFuZ2UgaW4gUlNTSSBhdCB3aGljaCBzY2FuIGlzIHRyaWdnZXJlZCAqLworI2RlZmluZSBDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfREVMVEFfTkFNRSAgICAgICAgICAgImdSb2FtU2NhbkhpUnNzaURlbHRhIgorI2RlZmluZSBDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfREVMVEFfTUlOICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19ST0FNX1NDQU5fSElfUlNTSV9ERUxUQV9NQVggICAgICAgICAgICAoMTYpCisjZGVmaW5lIENGR19ST0FNX1NDQU5fSElfUlNTSV9ERUxUQV9ERUZBVUxUICAgICAgICAoMCkKKworLyogRGVsYXkgYmV0d2VlbiBjb25zZWN1dGl2ZSBzY2FucyBpbiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgQ0ZHX1JPQU1fU0NBTl9ISV9SU1NJX0RFTEFZX05BTUUgICAgICAgICAgICAiZ1JvYW1TY2FuSGlSc3NpRGVsYXkiCisjZGVmaW5lIENGR19ST0FNX1NDQU5fSElfUlNTSV9ERUxBWV9NSU4gICAgICAgICAgICAgKDUwMDApCisjZGVmaW5lIENGR19ST0FNX1NDQU5fSElfUlNTSV9ERUxBWV9NQVggICAgICAgICAgICAgKDE1MDAwKQorI2RlZmluZSBDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfREVMQVlfREVGQVVMVCAgICAgICAgICg1MDAwKQorCisvKiBVcHBlciBib3VuZCBhZnRlciB3aGljaCBzY2FuIHdpbGwgbm90IGJlIHBlcmZvcm1lZCAqLworI2RlZmluZSBDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfVUJfTkFNRSAgICAgICAgICAgICAgImdSb2FtU2NhbkhpUnNzaVVwcGVyQm91bmQiCisjZGVmaW5lIENGR19ST0FNX1NDQU5fSElfUlNTSV9VQl9NSU4gICAgICAgICAgICAgICAoLTc2KQorI2RlZmluZSBDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfVUJfTUFYICAgICAgICAgICAgICAgKC0zMCkKKyNkZWZpbmUgQ0ZHX1JPQU1fU0NBTl9ISV9SU1NJX1VCX0RFRkFVTFQgICAgICAgICAgICgtNDUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUeXBlIGRlY2xhcmF0aW9ucworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBoZGRfY29uZmlnIHsKKwkvKiBCaXRtYXAgdG8gdHJhY2sgd2hhdCBpcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgKi8KKwlERUNMQVJFX0JJVE1BUChiRXhwbGljaXRDZmcsIE1BWF9DRkdfSU5JX0lURU1TKTsKKworCS8qIENvbmZpZyBwYXJhbWV0ZXJzICovCisJdWludDMyX3QgUlRTVGhyZXNob2xkOworCXVpbnQzMl90IEZyYWdtZW50YXRpb25UaHJlc2hvbGQ7CisJdWludDhfdCBPcGVyYXRpbmdDaGFubmVsOworCWJvb2wgU2hvcnRTbG90VGltZUVuYWJsZWQ7CisJYm9vbCBJczExZFN1cHBvcnRFbmFibGVkOworCWJvb2wgSXMxMWhTdXBwb3J0RW5hYmxlZDsKKwlib29sIGZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eTsKKwl1aW50MzJfdCBIZWFydGJlYXRUaHJlc2gyNDsKKwljaGFyIFBvd2VyVXNhZ2VDb250cm9sWzRdOworCWJvb2wgZklzTG9ncEVuYWJsZWQ7CisJYm9vbCBmSXNJbXBzRW5hYmxlZDsKKwlib29sIGlzX3BzX2VuYWJsZWQ7CisJdWludDMyX3QgbkJtcHNNb2RMaXN0ZW5JbnRlcnZhbDsKKwl1aW50MzJfdCBuQm1wc01heExpc3RlbkludGVydmFsOworCXVpbnQzMl90IG5CbXBzTWluTGlzdGVuSW50ZXJ2YWw7CisJZUhkZERvdDExTW9kZSBkb3QxMU1vZGU7CisJdWludDMyX3QgbkNoYW5uZWxCb25kaW5nTW9kZTI0R0h6OworCXVpbnQzMl90IG5DaGFubmVsQm9uZGluZ01vZGU1R0h6OworCXVpbnQzMl90IE1heFJ4QW1wZHVGYWN0b3I7CisJdWludDE2X3QgVHhSYXRlOworCXVpbnQzMl90IFNob3J0R0kyME1oekVuYWJsZTsKKwl1aW50MzJfdCBTY2FuUmVzdWx0QWdlQ291bnQ7CisJdWludDMyX3QgblNjYW5BZ2VUaW1lTkNOUFM7CisJdWludDMyX3QgblNjYW5BZ2VUaW1lTkNQUzsKKwl1aW50MzJfdCBuU2NhbkFnZVRpbWVDTlBTOworCXVpbnQzMl90IG5TY2FuQWdlVGltZUNQUzsKKwl1aW50OF90IG5Sc3NpQ2F0R2FwOworCWJvb2wgZklzU2hvcnRQcmVhbWJsZTsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIElic3NCc3NpZDsKKwl1aW50MzJfdCBBZEhvY0NoYW5uZWw1RzsKKwl1aW50MzJfdCBBZEhvY0NoYW5uZWwyNEc7CisJdWludDhfdCBpbnRmQWRkck1hc2s7CisJc3RydWN0IGNkZl9tYWNfYWRkciBpbnRmTWFjQWRkcltDREZfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkFdOworCisJYm9vbCBhcFVhcHNkRW5hYmxlZDsKKwlib29sIGFwUmFuZG9tQnNzaWRFbmFibGVkOworCWJvb2wgYXBQcm90RW5hYmxlZDsKKwl1aW50MTZfdCBhcFByb3RlY3Rpb247CisJYm9vbCBhcE9CU1NQcm90RW5hYmxlZDsKKwlib29sIGFwRGlzYWJsZUludHJhQnNzRndkOworCXVpbnQ4X3QgbkVuYWJsZUxpc3Rlbk1vZGU7CisJdWludDMyX3QgbkFQQXV0b1NodXRPZmY7CisJdWludDhfdCBlbmFibGVMVEVDb2V4OworCXVpbnQzMl90IGFwS2VlcEFsaXZlUGVyaW9kOworCXVpbnQzMl90IGdvS2VlcEFsaXZlUGVyaW9kOworCXVpbnQzMl90IGFwTGlua01vbml0b3JQZXJpb2Q7CisJdWludDMyX3QgZ29MaW5rTW9uaXRvclBlcmlvZDsKKwl1aW50MzJfdCBuQmVhY29uSW50ZXJ2YWw7CisJdWludDhfdCBuVHhQb3dlckNhcDsgICAgLyogSW4gZEJtICovCisJYm9vbCBmSXNMb3dHYWluT3ZlcnJpZGU7CisJdWludDhfdCBkaXNhYmxlUGFja2V0RmlsdGVyOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCWJvb2wgZlJybUVuYWJsZTsKKwl1aW50OF90IG5JbkNoYW5NZWFzTWF4RHVyYXRpb247CisJdWludDhfdCBuT3V0Q2hhbk1lYXNNYXhEdXJhdGlvbjsKKwl1aW50MTZfdCBuUnJtUmFuZG5JbnR2bDsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkvKiBWb3dpZmkgMTFyIHBhcmFtcyAqLworCWJvb2wgZkZUUmVzb3VyY2VSZXFTdXBwb3J0ZWQ7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisJdWludDE2X3Qgbk5laWdoYm9yU2NhblBlcmlvZDsKKwl1aW50OF90IG5OZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQ7CisJdWludDhfdCBkZWxheV9iZWZvcmVfdmRldl9zdG9wOworCXVpbnQ4X3Qgbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmOworCXVpbnQ4X3QgblJvYW1SZXNjYW5Sc3NpRGlmZjsKKwl1aW50OF90IG5laWdoYm9yU2NhbkNoYW5MaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CisJdWludDE2X3Qgbk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lOworCXVpbnQxNl90IG5OZWlnaGJvclNjYW5NYXhDaGFuVGltZTsKKwl1aW50MTZfdCBuTWF4TmVpZ2hib3JSZXFUcmllczsKKwl1aW50MTZfdCBuTmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZDsKKwl1aW50MTZfdCBuRW1wdHlTY2FuUmVmcmVzaFBlcmlvZDsKKwl1aW50OF90IG5Sb2FtQm1pc3NGaXJzdEJjbnQ7CisJdWludDhfdCBuUm9hbUJtaXNzRmluYWxCY250OworCXVpbnQ4X3QgblJvYW1CZWFjb25Sc3NpV2VpZ2h0OworCXVpbnQzMl90IG5oaV9yc3NpX3NjYW5fbWF4X2NvdW50OworCXVpbnQzMl90IG5oaV9yc3NpX3NjYW5fcnNzaV9kZWx0YTsKKwl1aW50MzJfdCBuaGlfcnNzaV9zY2FuX2RlbGF5OworCWludDMyX3QgbmhpX3Jzc2lfc2Nhbl9yc3NpX3ViOworI2VuZGlmCisKKwkvKiBBZGRpdGlvbmFsIEhhbmRvZmYgcGFyYW1zICovCisJdWludDMyX3QgblJvYW1pbmdUaW1lOworCXVpbnQxNl90IG5WY2NSc3NpVHJpZ2dlcjsKKwl1aW50MzJfdCBuVmNjVWxNYWNMb3NzVGhyZXNob2xkOworCisJdWludDMyX3QgblBhc3NpdmVNaW5DaG5UaW1lOyAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBuUGFzc2l2ZU1heENoblRpbWU7ICAgIC8qIGluIHVuaXRzIG9mIG1pbGxpc2Vjb25kcyAqLworCXVpbnQzMl90IG5BY3RpdmVNaW5DaG5UaW1lOyAgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgbkFjdGl2ZU1heENoblRpbWU7ICAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKworCXVpbnQzMl90IG5Jbml0aWFsRHdlbGxUaW1lOyAgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJYm9vbCBpbml0aWFsX3NjYW5fbm9fZGZzX2Nobmw7CisKKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorCXVpbnQzMl90IG5QYXNzaXZlTWluQ2huVGltZUNvbmM7ICAgICAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBuUGFzc2l2ZU1heENoblRpbWVDb25jOyAgICAgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgbkFjdGl2ZU1pbkNoblRpbWVDb25jOyAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBuQWN0aXZlTWF4Q2huVGltZUNvbmM7IC8qIGluIHVuaXRzIG9mIG1pbGxpc2Vjb25kcyAqLworCXVpbnQzMl90IG5SZXN0VGltZUNvbmM7IC8qIGluIHVuaXRzIG9mIG1pbGxpc2Vjb25kcyAqLworCXVpbnQ4X3Qgbk51bVN0YUNoYW5Db21iaW5lZENvbmM7ICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgY29tYmluZWQgZm9yICovCisJLyogU1RBIGluIGVhY2ggc3BsaXQgc2NhbiBvcGVyYXRpb24gKi8KKwl1aW50OF90IG5OdW1QMlBDaGFuQ29tYmluZWRDb25jOyAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIGNvbWJpbmVkIGZvciAqLworCS8qIFAyUCBpbiBlYWNoIHNwbGl0IHNjYW4gb3BlcmF0aW9uICovCisjZW5kaWYKKworCXVpbnQ4X3Qgbk1heFBzUG9sbDsKKworCXVpbnQ4X3QgblJzc2lGaWx0ZXJQZXJpb2Q7CisJYm9vbCBmSWdub3JlRHRpbTsKKwl1aW50OF90IGZNYXhMSU1vZHVsYXRlZERUSU07CisKKwl1aW50OF90IG5SeEFudDsKKwl1aW50OF90IGZFbmFibGVGd0hlYXJ0QmVhdE1vbml0b3Jpbmc7CisJdWludDhfdCBmRW5hYmxlRndCZWFjb25GaWx0ZXJpbmc7CisJYm9vbCBmRW5hYmxlRndSc3NpTW9uaXRvcmluZzsKKwlib29sIG1jY19ydHNfY3RzX3Byb3RfZW5hYmxlOworCWJvb2wgbWNjX2JjYXN0X3Byb2JfcmVzcF9lbmFibGU7CisJdWludDhfdCBuRGF0YUluYWN0aXZpdHlUaW1lb3V0OworCisJLyogV01NIFFvUyBDb25maWd1cmF0aW9uICovCisJaGRkX3dtbV91c2VyX21vZGVfdCBXbW1Nb2RlOworCWJvb2wgYjgwMjExZUlzRW5hYmxlZDsKKwl1aW50OF90IFVhcHNkTWFzazsgICAgICAvKiB3aGF0IEFDcyB0byBzZXR1cCBVLUFQU0QgZm9yIGF0IGFzc29jICovCisJdWludDMyX3QgSW5mcmFVYXBzZFZvU3J2SW50djsKKwl1aW50MzJfdCBJbmZyYVVhcHNkVm9TdXNwSW50djsKKwl1aW50MzJfdCBJbmZyYVVhcHNkVmlTcnZJbnR2OworCXVpbnQzMl90IEluZnJhVWFwc2RWaVN1c3BJbnR2OworCXVpbnQzMl90IEluZnJhVWFwc2RCZVNydkludHY7CisJdWludDMyX3QgSW5mcmFVYXBzZEJlU3VzcEludHY7CisJdWludDMyX3QgSW5mcmFVYXBzZEJrU3J2SW50djsKKwl1aW50MzJfdCBJbmZyYVVhcHNkQmtTdXNwSW50djsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJYm9vbCBpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQ7CisJYm9vbCBNQVdDRW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwl1aW50MzJfdCBJbmZyYUluYWN0aXZpdHlJbnRlcnZhbDsKKwlib29sIGlzRXNlSW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwlib29sIGlzRmFzdFRyYW5zaXRpb25FbmFibGVkOworCXVpbnQ4X3QgUm9hbVJzc2lEaWZmOworCWJvb2wgaXNXRVNNb2RlRW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9PS0MKKwlib29sIGlzT2tjSW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKKwlib29sIGlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZDsKKwloZGRfd21tX2NsYXNzaWZpY2F0aW9uX3QgUGt0Q2xhc3NpZmljYXRpb25CYXNpczsgICAgICAgIC8qIERTQ1Agb3IgODAyLjFRICovCisJYm9vbCBiSW1wbGljaXRRb3NFbmFibGVkOworCisJLyogZGVmYXVsdCBUU1BFQyBwYXJhbWV0ZXJzIGZvciBBQ19WTyAqLworCXNtZV9Rb3NXbW1EaXJUeXBlIEluZnJhRGlyQWNWbzsKKwl1aW50MTZfdCBJbmZyYU5vbU1zZHVTaXplQWNWbzsKKwl1aW50MzJfdCBJbmZyYU1lYW5EYXRhUmF0ZUFjVm87CisJdWludDMyX3QgSW5mcmFNaW5QaHlSYXRlQWNWbzsKKwl1aW50MTZfdCBJbmZyYVNiYUFjVm87CisKKwkvKiBkZWZhdWx0IFRTUEVDIHBhcmFtZXRlcnMgZm9yIEFDX1ZJICovCisJc21lX1Fvc1dtbURpclR5cGUgSW5mcmFEaXJBY1ZpOworCXVpbnQxNl90IEluZnJhTm9tTXNkdVNpemVBY1ZpOworCXVpbnQzMl90IEluZnJhTWVhbkRhdGFSYXRlQWNWaTsKKwl1aW50MzJfdCBJbmZyYU1pblBoeVJhdGVBY1ZpOworCXVpbnQxNl90IEluZnJhU2JhQWNWaTsKKworCS8qIGRlZmF1bHQgVFNQRUMgcGFyYW1ldGVycyBmb3IgQUNfQkUgKi8KKwlzbWVfUW9zV21tRGlyVHlwZSBJbmZyYURpckFjQmU7CisJdWludDE2X3QgSW5mcmFOb21Nc2R1U2l6ZUFjQmU7CisJdWludDMyX3QgSW5mcmFNZWFuRGF0YVJhdGVBY0JlOworCXVpbnQzMl90IEluZnJhTWluUGh5UmF0ZUFjQmU7CisJdWludDE2X3QgSW5mcmFTYmFBY0JlOworCisJLyogZGVmYXVsdCBUU1BFQyBwYXJhbWV0ZXJzIGZvciBBQ19CSyAqLworCXNtZV9Rb3NXbW1EaXJUeXBlIEluZnJhRGlyQWNCazsKKwl1aW50MTZfdCBJbmZyYU5vbU1zZHVTaXplQWNCazsKKwl1aW50MzJfdCBJbmZyYU1lYW5EYXRhUmF0ZUFjQms7CisJdWludDMyX3QgSW5mcmFNaW5QaHlSYXRlQWNCazsKKwl1aW50MTZfdCBJbmZyYVNiYUFjQms7CisKKwl1aW50MzJfdCBEZWxheWVkVHJpZ2dlckZybUludDsKKworCS8qIFdvd2wgcGF0dGVybiAqLworCWNoYXIgd293bFBhdHRlcm5bMTAyNF07CisKKwkvKiBDb250cm9sIGZvciBSZXBsYXkgY291bmV0ci4gdmFsdWUgMSBtZWFucworCSAgIHNpbmdsZSByZXBsYXkgY291bnRlciBmb3IgYWxsIFRJRCAqLworCWJvb2wgYlNpbmdsZVRpZFJjOworCXVpbnQ4X3QgbWNhc3RCY2FzdEZpbHRlclNldHRpbmc7CisJYm9vbCBmaG9zdEFycE9mZmxvYWQ7CisJYm9vbCBzc2RwOworI2lmZGVmIEZFQVRVUkVfV0xBTl9SQV9GSUxURVJJTkcKKwlib29sIElzUkFyYXRlTGltaXRFbmFibGVkOworCXVpbnQxNl90IFJBcmF0ZUxpbWl0SW50ZXJ2YWw7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwlib29sIFBub09mZmxvYWQ7CisjZW5kaWYKKwlib29sIGZob3N0TlNPZmZsb2FkOworCWJvb2wgYnVyc3RTaXplRGVmaW5pdGlvbjsKKwl1aW50OF90IHRzSW5mb0Fja1BvbGljeTsKKworCS8qIFJGIFNldHRsaW5nIFRpbWUgQ2xvY2sgKi8KKwl1aW50MzJfdCByZlNldHRsaW5nVGltZVVzOworCisJdWludDhfdCBkeW5hbWljUHNQb2xsVmFsdWU7CisJYm9vbCBBZGRUU1doZW5BQ01Jc09mZjsKKwlib29sIGZWYWxpZGF0ZVNjYW5MaXN0OworCisJdWludDMyX3QgaW5mcmFTdGFLZWVwQWxpdmVQZXJpb2Q7CisJdWludDhfdCBuTnVsbERhdGFBcFJlc3BUaW1lb3V0OworCXVpbnQ4X3QgbkJhbmRDYXBhYmlsaXR5OworCisJdWludDMyX3QgYXBEYXRhQXZhaWxQb2xsUGVyaW9kSW5NczsKKwlib29sIGZFbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uOworCWJvb2wgdGVsZUJjbldha2V1cEVuOworCisvKiBDREYgVHJhY2UgQ29udHJvbCovCisJdWludDE2X3QgY2RmX3RyYWNlX2VuYWJsZV93ZGk7CisJdWludDE2X3QgY2RmX3RyYWNlX2VuYWJsZV9oZGQ7CisJdWludDE2X3QgY2RmX3RyYWNlX2VuYWJsZV9zbWU7CisJdWludDE2X3QgY2RmX3RyYWNlX2VuYWJsZV9wZTsKKwl1aW50MTZfdCBjZGZfdHJhY2VfZW5hYmxlX3BtYzsKKwl1aW50MTZfdCBjZGZfdHJhY2VfZW5hYmxlX3dtYTsKKwl1aW50MTZfdCBjZGZfdHJhY2VfZW5hYmxlX3N5czsKKwl1aW50MTZfdCBjZGZfdHJhY2VfZW5hYmxlX2NkZjsKKwl1aW50MTZfdCBjZGZfdHJhY2VfZW5hYmxlX3NhcDsKKwl1aW50MTZfdCBjZGZfdHJhY2VfZW5hYmxlX2hkZF9zYXA7CisJdWludDE2X3QgY2RmX3RyYWNlX2VuYWJsZV9ibWk7CisKKwl1aW50MTZfdCBuVGVsZUJjblRyYW5zTGlzdGVuSW50ZXJ2YWw7CisJdWludDE2X3QgblRlbGVCY25NYXhMaXN0ZW5JbnRlcnZhbDsKKwl1aW50MTZfdCBuVGVsZUJjblRyYW5zTGlOdW1JZGxlQmVhY29uczsKKwl1aW50MTZfdCBuVGVsZUJjbk1heExpTnVtSWRsZUJlYWNvbnM7CisJdWludDhfdCBiY25FYXJseVRlcm1XYWtlSW50ZXJ2YWw7CisJdWludDMyX3QgZW5hYmxlQ2xvc2VMb29wOworCXVpbnQ4X3QgZW5hYmxlQnlwYXNzMTFkOworCXVpbnQ4X3QgZW5hYmxlREZTQ2hubFNjYW47CisJdWludDhfdCBlbmFibGVfZGZzX3Bub19jaG5sX3NjYW47CisJdWludDhfdCBlbmFibGVEeW5hbWljRFRJTTsKKwl1aW50OF90IGVuYWJsZUF1dG9tYXRpY1R4UG93ZXJDb250cm9sOworCXVpbnQ4X3QgU2hvcnRHSTQwTWh6RW5hYmxlOworCWVIZGRMaW5rU3BlZWRSZXBvcnRUeXBlIHJlcG9ydE1heExpbmtTcGVlZDsKKwlpbnQzMl90IGxpbmtTcGVlZFJzc2lIaWdoOworCWludDMyX3QgbGlua1NwZWVkUnNzaU1pZDsKKwlpbnQzMl90IGxpbmtTcGVlZFJzc2lMb3c7CisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJYm9vbCBuUm9hbVByZWZlcjVHSHo7CisJYm9vbCBuUm9hbUludHJhQmFuZDsKKwl1aW50OF90IG5Qcm9iZXM7CisJdWludDE2X3QgblJvYW1TY2FuSG9tZUF3YXlUaW1lOworI2VuZGlmCisJdWludDhfdCBlbmFibGVNQ0M7CisJdWludDhfdCBhbGxvd01DQ0dPRGlmZkJJOworCWJvb2wgaXNQMnBEZXZpY2VBZGRyQWRtaW5pc3RyYXRlZDsKKwl1aW50OF90IHRoZXJtYWxNaXRpZ2F0aW9uRW5hYmxlOworCXVpbnQzMl90IHRocm90dGxlUGVyaW9kOworCXVpbnQ4X3Qgdmh0Q2hhbm5lbFdpZHRoOworCXVpbnQ4X3Qgdmh0UnhNQ1M7CisJdWludDhfdCB2aHRUeE1DUzsKKwlib29sIGVuYWJsZVR4QkY7CisJdWludDhfdCB0eEJGQ3NuVmFsdWU7CisJYm9vbCBlbmFibGVfc3VfdHhfYmZvcm1lcjsKKwl1aW50OF90IHZodFJ4TUNTMngyOworCXVpbnQ4X3Qgdmh0VHhNQ1MyeDI7CisJYm9vbCBlbmFibGUyeDI7CisJYm9vbCB0eGNoYWlubWFzazF4MTsKKwlib29sIHJ4Y2hhaW5tYXNrMXgxOworCWJvb2wgZW5hYmxlTXVCZm9ybWVlOworCWJvb2wgZW5hYmxlVmh0cEFpZDsKKwlib29sIGVuYWJsZVZodEdpZDsKKwlib29sIGVuYWJsZVR4QkZpbjIwTUh6OworCXVpbnQ4X3QgZW5hYmxlQW1wZHVQczsKKwl1aW50OF90IGVuYWJsZUh0U21wczsKKwl1aW50OF90IGh0U21wczsKKwl1aW50OF90IGVuYWJsZU1vZHVsYXRlZERUSU07CisJdWludDMyX3QgZkVuYWJsZU1DQWRkckxpc3Q7CisJYm9vbCBlbmFibGVGaXJzdFNjYW4yR09ubHk7CisJYm9vbCBza2lwRGZzQ2hubEluUDJwU2VhcmNoOworCWJvb2wgaWdub3JlRHluYW1pY0R0aW1JblAycE1vZGU7CisJYm9vbCBlbmFibGVSeFNUQkM7CisJYm9vbCBlbmFibGVUeFNUQkM7CisJYm9vbCBlbmFibGVSeExEUEM7CisJYm9vbCBlbmFibGU1Z0VCVDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWJvb2wgZkVuYWJsZVRETFNTdXBwb3J0OworCWJvb2wgZkVuYWJsZVRETFNJbXBsaWNpdFRyaWdnZXI7CisJdWludDMyX3QgZlRETFNUeFN0YXRzUGVyaW9kOworCXVpbnQzMl90IGZURExTVHhQYWNrZXRUaHJlc2hvbGQ7CisJdWludDMyX3QgZlRETFNNYXhEaXNjb3ZlcnlBdHRlbXB0OworCXVpbnQzMl90IGZURExTSWRsZVBhY2tldFRocmVzaG9sZDsKKwlpbnQzMl90IGZURExTUlNTSVRyaWdnZXJUaHJlc2hvbGQ7CisJaW50MzJfdCBmVERMU1JTU0lUZWFyZG93blRocmVzaG9sZDsKKwlpbnQzMl90IGZURExTUlNTSURlbHRhOworCXVpbnQzMl90IGZURExTVWFwc2RNYXNrOyAgICAgICAgLyogd2hhdCBBQ3MgdG8gc2V0dXAgVS1BUFNEIGZvciBURExTICovCisJdWludDMyX3QgZkVuYWJsZVRETFNCdWZmZXJTdGE7CisJdWludDMyX3QgZkVuYWJsZVRETFNTbGVlcFN0YTsKKwl1aW50MzJfdCBmVERMU1B1YXBzZEluYWN0aXZpdHlUaW1lcjsKKwl1aW50MzJfdCBmVERMU1J4RnJhbWVUaHJlc2hvbGQ7CisJdWludDMyX3QgZlRETFNQdWFwc2RQVElXaW5kb3c7CisJdWludDMyX3QgZlRETFNQdWFwc2RQVFJUaW1lb3V0OworCWJvb2wgZlRETFNFeHRlcm5hbENvbnRyb2w7CisJdWludDMyX3QgZkVuYWJsZVRETFNPZmZDaGFubmVsOworCXVpbnQzMl90IGZFbmFibGVURExTV21tTW9kZTsKKwl1aW50OF90IGZURExTUHJlZk9mZkNoYW5OdW07CisJdWludDhfdCBmVERMU1ByZWZPZmZDaGFuQmFuZHdpZHRoOworCXVpbnQ4X3QgZW5hYmxlX3RkbHNfc2NhbjsKKyNlbmRpZgorI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQorCWJvb2wgZkVuYWJsZVZTVEFTdXBwb3J0OworI2VuZGlmCisJdWludDMyX3QgZW5hYmxlTHB3ckltZ1RyYW5zaXRpb247CisJdWludDhfdCBzY2FuQWdpbmdUaW1lb3V0OworCWJvb2wgZW5hYmxlVHhMZHBjOworCXVpbnQ4X3QgZGlzYWJsZUxEUENXaXRoVHhiZkFQOworCXVpbnQ4X3QgZW5hYmxlTUNDQWRhcHRpdmVTY2hlZHVsZXI7CisJYm9vbCBpc0FuZHJvaWRQc0VuOworCWJvb2wgc2FwQWxsb3dBbGxDaGFubmVsOworCXVpbnQ4X3QgcmV0cnlMaW1pdFplcm87CisJdWludDhfdCByZXRyeUxpbWl0T25lOworCXVpbnQ4X3QgcmV0cnlMaW1pdFR3bzsKKwlib29sIGVuYWJsZVNTUjsKKwl1aW50MzJfdCBjZmdNYXhNZWRpdW1UaW1lOworCWJvb2wgZW5hYmxlVmh0Rm9yMjRHSHpCYW5kOworCS8qIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGxlZ2FjeSBmYXN0IHJvYW0gZHVyaW5nIGNvbmN1cnJlbmN5IGlzIGVuYWJsZWQgaW4gY2ZnLmluaSBvciBub3QgKi8KKwlib29sIGJGYXN0Um9hbUluQ29uSW5pRmVhdHVyZUVuYWJsZWQ7CisJYm9vbCBmRW5hYmxlQWRhcHRSeERyYWluOworCXVpbnQ4X3QgZmxleENvbm5lY3RQb3dlckZhY3RvcjsKKwlib29sIGVuYWJsZUlic3NIZWFydEJlYXRPZmZsb2FkOworCXVpbnQzMl90IGFudGVubmFEaXZlcnNpdHk7CisJYm9vbCBmRW5hYmxlU05STW9uaXRvcmluZzsKKwkvKlBOTyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwlib29sIGNvbmZpZ1BOT1NjYW5TdXBwb3J0OworCXVpbnQzMl90IGNvbmZpZ1BOT1NjYW5UaW1lclJlcGVhdFZhbHVlOworI2VuZGlmCisJdWludDhfdCBpc0Ftc2R1U3VwcG9ydEluQU1QRFU7CisJdWludDhfdCBuU2VsZWN0NUdIek1hcmdpbjsKKwl1aW50OF90IGlzQ29hbGVzaW5nSW5JQlNTQWxsb3dlZDsKKworCS8qIElCU1MgUG93ZXIgU2F2ZSByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKwl1aW50MzJfdCBpYnNzQVRJTVdpblNpemU7CisJdWludDhfdCBpc0lic3NQb3dlclNhdmVBbGxvd2VkOworCXVpbnQ4X3QgaXNJYnNzUG93ZXJDb2xsYXBzZUFsbG93ZWQ7CisJdWludDhfdCBpc0lic3NBd2FrZU9uVHhSeDsKKwl1aW50MzJfdCBpYnNzSW5hY3Rpdml0eUNvdW50OworCXVpbnQzMl90IGlic3NUeFNwRW5kSW5hY3Rpdml0eVRpbWU7CisJdWludDMyX3QgaWJzc1BzV2FybXVwVGltZTsKKwl1aW50MzJfdCBpYnNzUHMxUnhDaGFpbkluQXRpbUVuYWJsZTsKKworCWJvb2wgZW5hYmxlX2lwX3RjcF91ZHBfY2hlY2tzdW1fb2ZmbG9hZDsKKwlib29sIGVuYWJsZVBvd2Vyc2F2ZU9mZmxvYWQ7CisJYm9vbCBlbmFibGVmd3ByaW50OworCWJvb2wgZW5hYmxlZndsb2c7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwl1aW50OF90IGZWaHRBbXBkdUxlbkV4cG9uZW50OworCXVpbnQzMl90IHZodE1wZHVMZW47CisjZW5kaWYKKwl1aW50MzJfdCBJcGFDb25maWc7CisJYm9vbCBJcGFDbGtTY2FsaW5nRW5hYmxlOworCXVpbnQzMl90IElwYURlc2NTaXplOworCXVpbnQzMl90IElwYUhpZ2hCYW5kd2lkdGhNYnBzOworCXVpbnQzMl90IElwYU1lZGl1bUJhbmR3aWR0aE1icHM7CisJdWludDMyX3QgSXBhTG93QmFuZHdpZHRoTWJwczsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwl1aW50MzJfdCBXbGFuTWNjVG9TY2NTd2l0Y2hNb2RlOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKwl1aW50MzJfdCBXbGFuQXV0b1NodXRkb3duOworI2VuZGlmCisJdWludDhfdCBtYXhXb1dGaWx0ZXJzOworCXVpbnQ4X3Qgd293RW5hYmxlOworCXVpbnQ4X3QgbWF4TnVtYmVyT2ZQZWVyczsKKwl1aW50OF90IGRpc2FibGVERlNDaFN3aXRjaDsKKwl1aW50OF90IGVuYWJsZURGU01hc3RlckNhcDsKKwl1aW50MTZfdCB0aGVybWFsVGVtcE1pbkxldmVsMDsKKwl1aW50MTZfdCB0aGVybWFsVGVtcE1heExldmVsMDsKKwl1aW50MTZfdCB0aGVybWFsVGVtcE1pbkxldmVsMTsKKwl1aW50MTZfdCB0aGVybWFsVGVtcE1heExldmVsMTsKKwl1aW50MTZfdCB0aGVybWFsVGVtcE1pbkxldmVsMjsKKwl1aW50MTZfdCB0aGVybWFsVGVtcE1heExldmVsMjsKKwl1aW50MTZfdCB0aGVybWFsVGVtcE1pbkxldmVsMzsKKwl1aW50MTZfdCB0aGVybWFsVGVtcE1heExldmVsMzsKKwl1aW50MzJfdCBUeFBvd2VyMmc7CisJdWludDMyX3QgVHhQb3dlcjVnOworCXVpbnQzMl90IGdFbmFibGVEZWJ1Z0xvZzsKKwl1aW50OF90IGVuYWJsZVJ4VGhyZWFkOworCWJvb2wgZkRmc1BoeWVyckZpbHRlck9mZmxvYWQ7CisJdWludDhfdCBnU2FwUHJlZmVycmVkQ2hhbkxvY2F0aW9uOworCXVpbnQ4X3QgZ0Rpc2FibGVEZnNKYXBhblc1MzsKKwlib29sIGdFbmFibGVPdmVyTGFwQ2g7CisJYm9vbCBmUmVnQ2hhbmdlRGVmQ291bnRyeTsKKyNpZmRlZiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTAorCXVpbnQzMl90IFR4Rmxvd0xvd1dhdGVyTWFyazsKKwl1aW50MzJfdCBUeEZsb3dIaWdoV2F0ZXJNYXJrT2Zmc2V0OworCXVpbnQzMl90IFR4Rmxvd01heFF1ZXVlRGVwdGg7CisJdWludDMyX3QgVHhMYndGbG93TG93V2F0ZXJNYXJrOworCXVpbnQzMl90IFR4TGJ3Rmxvd0hpZ2hXYXRlck1hcmtPZmZzZXQ7CisJdWludDMyX3QgVHhMYndGbG93TWF4UXVldWVEZXB0aDsKKwl1aW50MzJfdCBUeEhid0Zsb3dMb3dXYXRlck1hcms7CisJdWludDMyX3QgVHhIYndGbG93SGlnaFdhdGVyTWFya09mZnNldDsKKwl1aW50MzJfdCBUeEhid0Zsb3dNYXhRdWV1ZURlcHRoOworI2VuZGlmIC8qIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MICovCisjaWZkZWYgUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMgorCXVpbnQzMl90IFR4Rmxvd1N0b3BRdWV1ZVRocmVzaG9sZDsKKwl1aW50MzJfdCBUeEZsb3dTdGFydFF1ZXVlT2Zmc2V0OworI2VuZGlmCisJdWludDhfdCBhcE1heE9mZmxvYWRQZWVyczsKKwl1aW50OF90IGFwTWF4T2ZmbG9hZFJlb3JkZXJCdWZmczsKKwlib29sIGFkdmVydGlzZUNvbmN1cnJlbnRPcGVyYXRpb247CisJYm9vbCBlbmFibGVNZW1EZWVwU2xlZXA7CisKKwl1aW50MzJfdCBkZWZhdWx0UmF0ZUluZGV4MjRHaHo7CisjaWZkZWYgTUVNT1JZX0RFQlVHCisJYm9vbCBJc01lbW9yeURlYnVnU3VwcG9ydEVuYWJsZWQ7CisjZW5kaWYKKworCXVpbnQ4X3QgYWxsb3dERlNDaGFubmVsUm9hbTsKKworCWJvb2wgZGVidWdQMnBSZW1haW5PbkNoYW5uZWw7CisKKwlib29sIGVuYWJsZVBhY2tldExvZzsKKyNpZmRlZiBNU01fUExBVEZPUk0KKwl1aW50MzJfdCBidXNCYW5kd2lkdGhIaWdoVGhyZXNob2xkOworCXVpbnQzMl90IGJ1c0JhbmR3aWR0aE1lZGl1bVRocmVzaG9sZDsKKwl1aW50MzJfdCBidXNCYW5kd2lkdGhMb3dUaHJlc2hvbGQ7CisJdWludDMyX3QgYnVzQmFuZHdpZHRoQ29tcHV0ZUludGVydmFsOworCXVpbnQzMl90IHRjcERlbGFja1RocmVzaG9sZEhpZ2g7CisJdWludDMyX3QgdGNwRGVsYWNrVGhyZXNob2xkTG93OworI2VuZGlmIC8qIE1TTV9QTEFURk9STSAqLworCisJLyogRlcgZGVidWcgbG9nIHBhcmFtZXRlcnMgKi8KKwl1aW50MzJfdCBlbmFibGVGd0xvZ1R5cGU7CisJdWludDMyX3QgZW5hYmxlRndMb2dMZXZlbDsKKwl1aW50OF90IGVuYWJsZUZ3TW9kdWxlTG9nTGV2ZWxbRldfTU9EVUxFX0xPR19MRVZFTF9TVFJJTkdfTEVOR1RIXTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwl1aW50MzJfdCBwbWZTYVF1ZXJ5TWF4UmV0cmllczsKKwl1aW50MzJfdCBwbWZTYVF1ZXJ5UmV0cnlJbnRlcnZhbDsKKyNlbmRpZgorCisJdWludDhfdCBnTWF4Q29uY3VycmVudEFjdGl2ZVNlc3Npb25zOworCisJdWludDhfdCBpZ25vcmVDQUM7CisJYm9vbCBJc1NhcERmc0NoU2lmc0J1cnN0RW5hYmxlZDsKKworI2lmZGVmIEZFQVRVUkVfR1JFRU5fQVAKKwlib29sIGVuYWJsZUdyZWVuQVA7CisjZW5kaWYKKwl1aW50OF90IGZvcmNlX3NhcF9hY3M7CisJdWludDhfdCBmb3JjZV9zYXBfYWNzX3N0X2NoOworCXVpbnQ4X3QgZm9yY2Vfc2FwX2Fjc19lbmRfY2g7CisKKwlpbnQzMl90IGRmc1JhZGFyUHJpTXVsdGlwbGllcjsKKwl1aW50OF90IHJlb3JkZXJPZmZsb2FkU3VwcG9ydDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlib29sIGlzUm9hbU9mZmxvYWRFbmFibGVkOworI2VuZGlmCisKKwl1aW50MzJfdCBJcGFVY1R4QnVmQ291bnQ7CisJdWludDMyX3QgSXBhVWNUeEJ1ZlNpemU7CisJdWludDMyX3QgSXBhVWNSeEluZFJpbmdDb3VudDsKKwl1aW50MzJfdCBJcGFVY1R4UGFydGl0aW9uQmFzZTsKKyNpZmRlZiBXTEFOX0xPR0dJTkdfU09DS19TVkNfRU5BQkxFCisJLyogV0xBTiBMb2dnaW5nICovCisJdWludDMyX3Qgd2xhbkxvZ2dpbmdFbmFibGU7CisJdWludDMyX3Qgd2xhbkxvZ2dpbmdGRVRvQ29uc29sZTsKKwl1aW50MzJfdCB3bGFuTG9nZ2luZ051bUJ1ZjsKKyNlbmRpZiAvKiBXTEFOX0xPR0dJTkdfU09DS19TVkNfRU5BQkxFICovCisKKwlib29sIGVuYWJsZVNpZnNCdXJzdDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisJYm9vbCBlbmFibGVscGFzc3N1cHBvcnQ7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkFOCisJYm9vbCBlbmFibGVfbmFuX3N1cHBvcnQ7CisjZW5kaWYKKwlib29sIGVuYWJsZVNlbGZSZWNvdmVyeTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRk9SQ0VfU0FQX1NDQworCXVpbnQ4X3QgU2FwU2NjQ2hhbkF2b2lkYW5jZTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRk9SQ0VfU0FQX1NDQyAqLworCisJYm9vbCBlbmFibGVTYXBTdXNwZW5kOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCisJdWludDhfdCBleHRXb3dHb3RvU3VzcGVuZDsKKwl1aW50OF90IGV4dFdvd0FwcDFXYWtldXBQaW5OdW1iZXI7CisJdWludDhfdCBleHRXb3dBcHAyV2FrZXVwUGluTnVtYmVyOworCXVpbnQzMl90IGV4dFdvd0FwcDJLQUluaXRQaW5nSW50ZXJ2YWw7CisJdWludDMyX3QgZXh0V293QXBwMktBTWluUGluZ0ludGVydmFsOworCXVpbnQzMl90IGV4dFdvd0FwcDJLQU1heFBpbmdJbnRlcnZhbDsKKwl1aW50MzJfdCBleHRXb3dBcHAyS0FJbmNQaW5nSW50ZXJ2YWw7CisJdWludDE2X3QgZXh0V293QXBwMlRjcFNyY1BvcnQ7CisJdWludDE2X3QgZXh0V293QXBwMlRjcERzdFBvcnQ7CisJdWludDMyX3QgZXh0V293QXBwMlRjcFR4VGltZW91dDsKKwl1aW50MzJfdCBleHRXb3dBcHAyVGNwUnhUaW1lb3V0OworI2VuZGlmCisJYm9vbCBnRW5hYmxlRGVhdXRoVG9EaXNhc3NvY01hcDsKKyNpZmRlZiBESENQX1NFUlZFUl9PRkZMT0FECisJYm9vbCBlbmFibGVESENQU2VydmVyT2ZmbG9hZDsKKwl1aW50MzJfdCBkaGNwTWF4TnVtQ2xpZW50czsKKwl1aW50OF90IGRoY3BTZXJ2ZXJJUFtJUEFERFJfU1RSSU5HX0xFTkdUSF07CisjZW5kaWYgLyogREhDUF9TRVJWRVJfT0ZGTE9BRCAqLworCWJvb2wgZW5hYmxlX21hY19zcG9vZmluZzsKKwl1aW50OF90IGNvbmNfY3VzdG9tX3J1bGUxOworCXVpbnQ4X3QgY29uY19jdXN0b21fcnVsZTI7CisJdWludDhfdCBpc19zdGFfY29ubmVjdGlvbl9pbl81Z3pfZW5hYmxlZDsKKwl1aW50MTZfdCBwMnBfbGlzdGVuX2RlZmVyX2ludGVydmFsOworCXVpbnQzMl90IHN0YV9taXJhY2FzdF9tY2NfcmVzdF90aW1lX3ZhbDsKKwlib29sIGlzX3JhbWR1bXBfZW5hYmxlZDsKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKwlib29sIHNhcF9jaGFubmVsX2F2b2lkYW5jZTsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKwl1aW50OF90IHNhcF9wMnBfMTFhY19vdmVycmlkZTsKKwl1aW50OF90IHNhcF9kb3QxMW1jOworCXVpbnQ4X3QgcHJlZmVyX25vbl9kZnNfb25fcmFkYXI7CisJYm9vbCBpZ25vcmVfcGVlcl9lcnBfaW5mbzsKKwl1aW50OF90IG11bHRpY2FzdF9ob3N0X2Z3X21zZ3M7CisJdWludDhfdCBjb25jX3N5c3RlbV9wcmVmOworCWJvb2wgc2VuZERlYXV0aEJlZm9yZUNvbjsKKwlib29sIHBvbGljeV9tYW5hZ2VyX2VuYWJsZWQ7CisJYm9vbCB0c29fZW5hYmxlOworCWJvb2wgbHJvX2VuYWJsZTsKKwlib29sIGFjdGl2ZV9tb2RlX29mZmxvYWQ7CisJdWludDMyX3QgZmluZV90aW1lX21lYXNfY2FwOworCXVpbnQ4X3QgbWF4X3NjYW5fY291bnQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0ZBU1RQQVRICisJYm9vbCBmYXN0cGF0aF9lbmFibGU7CisjZW5kaWYKKwl1aW50OF90IGRvdDExcF9tb2RlOworI2lmZGVmIEZFQVRVUkVfTkFQSQorCWJvb2wgbmFwaV9lbmFibGU7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCXVpbnQzMl90IGV4dHNjYW5fcGFzc2l2ZV9tYXhfY2huX3RpbWU7CisJdWludDMyX3QgZXh0c2Nhbl9wYXNzaXZlX21pbl9jaG5fdGltZTsKKwl1aW50MzJfdCBleHRzY2FuX2FjdGl2ZV9tYXhfY2huX3RpbWU7CisJdWludDMyX3QgZXh0c2Nhbl9hY3RpdmVfbWluX2Nobl90aW1lOworI2VuZGlmCisJYm9vbCBjZV9jbGFzc2lmeV9lbmFibGVkOworCXVpbnQzMl90IGR1YWxfbWFjX2ZlYXR1cmVfZGlzYWJsZTsKKwlib29sICAgICB0eF9jaGFpbl9tYXNrX2NjazsKKwl1aW50OF90ICB0eF9jaGFpbl9tYXNrXzFzczsKKwl1aW50MTZfdCAgc2VsZl9nZW5fZnJtX3B3cjsKK307CisKKyNkZWZpbmUgVkFSX09GRlNFVChfU3RydWN0LCBfVmFyKSAob2Zmc2V0b2YoX1N0cnVjdCwgX1ZhcikpCisjZGVmaW5lIFZBUl9TSVpFKF9TdHJ1Y3QsIF9WYXIpIChzaXplb2YoKChfU3RydWN0ICopMCktPl9WYXIpKQorCisjZGVmaW5lIFZBUl9GTEFHU19OT05FICAgICAgICAgKDApCisKKy8qIGJpdCAwIGlzIFJlcXVpcmVkIG9yIE9wdGlvbmFsICovCisjZGVmaW5lIFZBUl9GTEFHU19SRVFVSVJFRCAgICAgKDEgPDwgMCkKKyNkZWZpbmUgVkFSX0ZMQUdTX09QVElPTkFMICAgICAoMCA8PCAwKQorCisvKgorICogYml0IDEgdGVsbHMgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgcmVxdWlyZWQuCisgKiBJZiBsZXNzIHRoYW4gTUlOLCBhc3N1bWUgTUlOLgorICogSWYgZ3JlYXRlciB0aGFuIE1BWCwgYXNzdW1lIE1BWC4KKyAqLworI2RlZmluZSBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0sgICgxIDw8IDEpCisjZGVmaW5lIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfTUlOTUFYIChWQVJfRkxBR1NfUkFOR0VfQ0hFQ0spCisKKy8qCisgKiBiaXQgMiBpcyByYW5nZSBjaGVja2luZyB0aGF0IGFzc3VtZXMgdGhlIERFRkFVTFQgdmFsdWUKKyAqIElmIGxlc3MgdGhhbiBNSU4sIGFzc3VtZSBERUZBVUxULAorICogSWYgZ3JlYXRlciB0aGFuIE1BWCwgYXNzdW1lIERFRkFVTFQuCisgKi8KKyNkZWZpbmUgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxUICgxIDw8IDIpCisKKy8qCisgKiBCaXQgMyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29uZmlnIGl0ZW0gY2FuIGJlIG1vZGlmaWVkIGR5bmFtaWNpYWxseQorICogb24gYSBydW5uaW5nIHN5c3RlbQorICovCisjZGVmaW5lIFZBUl9GTEFHU19EWU5BTUlDX0NGRyAoMSA8PCAzKQorCit0eXBlZGVmIGVudW0geworCVdMQU5fUEFSQU1fSW50ZWdlciwKKwlXTEFOX1BBUkFNX1NpZ25lZEludGVnZXIsCisJV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorCVdMQU5fUEFSQU1fU3RyaW5nLAorCVdMQU5fUEFSQU1fTWFjQWRkciwKK30gV0xBTl9QQVJBTUVURVJfVFlQRTsKKworI2RlZmluZSBSRUdfVkFSSUFCTEUoX05hbWUsIF9UeXBlLCAgX1N0cnVjdCwgX1Zhck5hbWUsCQlcCisJCSAgICAgIF9GbGFncywgX0RlZmF1bHQsIF9NaW4sIF9NYXgpCQlcCisJewkJCQkJCQlcCisJCShfTmFtZSksCQkJCQlcCisJCShfVHlwZSksCQkJCQlcCisJCShfRmxhZ3MpLAkJCQkJXAorCQlWQVJfT0ZGU0VUKF9TdHJ1Y3QsIF9WYXJOYW1lKSwJCQlcCisJCVZBUl9TSVpFKF9TdHJ1Y3QsIF9WYXJOYW1lKSwJCQlcCisJCShfRGVmYXVsdCksCQkJCQlcCisJCShfTWluKSwJCQkJCQlcCisJCShfTWF4KSwJCQkJCQlcCisJCU5VTEwsCQkJCQkJXAorCQkwCQkJCQkJXAorCX0KKworI2RlZmluZSBSRUdfRFlOQU1JQ19WQVJJQUJMRShfTmFtZSwgX1R5cGUsICBfU3RydWN0LCBfVmFyTmFtZSwJXAorCQkJICAgICAgX0ZsYWdzLCBfRGVmYXVsdCwgX01pbiwgX01heCwJXAorCQkJICAgICAgX0NCRnVuYywgX0NCUGFyYW0pCQlcCisJewkJCQkJCQlcCisJCShfTmFtZSksCQkJCQlcCisJCShfVHlwZSksCQkJCQlcCisJCShWQVJfRkxBR1NfRFlOQU1JQ19DRkcgfCAoX0ZsYWdzKSksCQlcCisJCVZBUl9PRkZTRVQoX1N0cnVjdCwgX1Zhck5hbWUpLAkJCVwKKwkJVkFSX1NJWkUoX1N0cnVjdCwgX1Zhck5hbWUpLAkJCVwKKwkJKF9EZWZhdWx0KSwJCQkJCVwKKwkJKF9NaW4pLAkJCQkJCVwKKwkJKF9NYXgpLAkJCQkJCVwKKwkJKF9DQkZ1bmMpLAkJCQkJXAorCQkoX0NCUGFyYW0pCQkJCQlcCisJfQorCisjZGVmaW5lIFJFR19WQVJJQUJMRV9TVFJJTkcoX05hbWUsIF9UeXBlLCAgX1N0cnVjdCwgX1Zhck5hbWUsCVwKKwkJCSAgICAgX0ZsYWdzLCBfRGVmYXVsdCkJCQlcCisJewkJCQkJCQlcCisJCShfTmFtZSksCQkJCQlcCisJCShfVHlwZSksCQkJCQlcCisJCShfRmxhZ3MpLAkJCQkJXAorCQlWQVJfT0ZGU0VUKF9TdHJ1Y3QsIF9WYXJOYW1lKSwJCQlcCisJCVZBUl9TSVpFKF9TdHJ1Y3QsIF9WYXJOYW1lKSwJCQlcCisJCSh1bnNpZ25lZCBsb25nKShfRGVmYXVsdCksCQkJXAorCQkwLAkJCQkJCVwKKwkJMCwJCQkJCQlcCisJCU5VTEwsCQkJCQkJXAorCQkwCQkJCQkJXAorCX0KKwordHlwZWRlZiBzdHJ1Y3QgdFJFR19UQUJMRV9FTlRSWSB7CisKKwljaGFyICpSZWdOYW1lOyAgICAgICAgICAvKiB2YXJpYWJsZSBuYW1lIGluIHRoZSBxY29tX2NmZy5pbmkgZmlsZSAqLworCVdMQU5fUEFSQU1FVEVSX1RZUEUgUmVnVHlwZTsgICAgLyogdmFyaWFibGUgdHlwZSBpbiB0aGUgaGRkX2NvbmZpZ190IHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGxvbmcgRmxhZ3M7ICAgIC8qIFNwZWNpZnkgb3B0aW9uYWwgcGFybXMgYW5kIGlmIFJhbmdlQ2hlY2sgaXMgcGVyZm9ybWVkICovCisJdW5zaWduZWQgc2hvcnQgVmFyT2Zmc2V0OyAgICAgICAvKiBvZmZzZXQgdG8gZmllbGQgZnJvbSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwl1bnNpZ25lZCBzaG9ydCBWYXJTaXplOyAvKiBzaXplIChpbiBieXRlcykgb2YgdGhlIGZpZWxkICovCisJdW5zaWduZWQgbG9uZyBWYXJEZWZhdWx0OyAgICAgICAvKiBkZWZhdWx0IHZhbHVlIHRvIHVzZSAqLworCXVuc2lnbmVkIGxvbmcgVmFyTWluOyAgIC8qIG1pbmltdW0gdmFsdWUsIGZvciByYW5nZSBjaGVja2luZyAqLworCXVuc2lnbmVkIGxvbmcgVmFyTWF4OyAgIC8qIG1heGltdW0gdmFsdWUsIGZvciByYW5nZSBjaGVja2luZyAqLworCS8qIER5bmFtaWMgbW9kaWZpY2F0aW9uIG5vdGlmaWVyICovCisJdm9pZCAoKnBmbkR5bmFtaWNub3RpZnkpKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJIHVuc2lnbmVkIGxvbmcgbm90aWZ5SWQpOworCXVuc2lnbmVkIGxvbmcgbm90aWZ5SWQ7IC8qIER5bmFtaWMgbW9kaWZpY2F0aW9uIGlkZW50aWZpZXIgKi8KK30gUkVHX1RBQkxFX0VOVFJZOworCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgbG9uZyB1dGlsX21pbih1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYikKK3sKKwl1bnNpZ25lZCBsb25nIHI7CisKKwlyID0gKChhIDwgYikgPyBhIDogYik7CisJcmV0dXJuIHI7Cit9CisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uICovCitDREZfU1RBVFVTIGhkZF9wYXJzZV9jb25maWdfaW5pKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOworQ0RGX1NUQVRVUyBoZGRfdXBkYXRlX21hY19jb25maWcoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCk7CitDREZfU1RBVFVTIGhkZF9zZXRfc21lX2NvbmZpZyhoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK0NERl9TVEFUVVMgaGRkX3NldF9zbWVfY2hhbl9saXN0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworYm9vbCBoZGRfdXBkYXRlX2NvbmZpZ19kYXQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCk7CitDREZfU1RBVFVTIGhkZF9jZmdfZ2V0X2dsb2JhbF9jb25maWcoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgY2hhciAqcEJ1ZiwKKwkJCQkgICAgIGludCBidWZsZW4pOworCitlQ3NyUGh5TW9kZSBoZGRfY2ZnX3hsYXRlX3RvX2Nzcl9waHlfbW9kZShlSGRkRG90MTFNb2RlIGRvdDExTW9kZSk7CitDREZfU1RBVFVTIGhkZF9leGVjdXRlX2dsb2JhbF9jb25maWdfY29tbWFuZChoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJCQkgICAgIGNoYXIgKmNvbW1hbmQpOworCitib29sIGhkZF9pc19va2NfbW9kZV9lbmFibGVkKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOworQ0RGX1NUQVRVUyBoZGRfc2V0X2lkbGVfcHNfY29uZmlnKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIHVpbnQzMl90IHZhbCk7CisKK3ZvaWQgaGRkX3VwZGF0ZV90Z3RfY2ZnKHZvaWQgKmNvbnRleHQsIHZvaWQgKnBhcmFtKTsKK3ZvaWQgaGRkX2Rmc19pbmRpY2F0ZV9yYWRhcih2b2lkICpjb250ZXh0LCB2b2lkICpwYXJhbSk7CisKK0NERl9TVEFUVVMgaGRkX3N0cmluZ190b191OF9hcnJheShjaGFyICpzdHIsIHVpbnQ4X3QgKmludEFycmF5LCB1aW50OF90ICpsZW4sCisJCQkJICB1aW50OF90IGludEFycmF5TWF4TGVuKTsKK3ZvaWQgaGRkX2NmZ19wcmludChoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKKworQ0RGX1NUQVRVUyBoZGRfdXBkYXRlX25zcyhoZGRfY29udGV4dF90ICpoZGRfY3R4LCB1aW50OF90IG5zcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX2NvbmNfdXQuaCBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9jb25jX3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlMTNmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9jb25jX3V0LmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19XTEFOX0hERF9DT05DX1VUX0gKKyNkZWZpbmUgX19XTEFOX0hERF9DT05DX1VUX0gKKworLyogSW5jbHVkZSBmaWxlcyAqLworCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorI2luY2x1ZGUgImNkc19jb25jdXJyZW5jeS5oIgorI2lmZGVmIE1QQ19VVF9GUkFNRVdPUksKK3ZvaWQgY2xlYW5fcmVwb3J0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOwordm9pZCBmaWxsX3JlcG9ydChoZGRfY29udGV4dF90ICpoZGRfY3R4LCBjaGFyICp0aXRsZSwKKwl1aW50MzJfdCBmaXJzdF9wZXJzb25hLCB1aW50MzJfdCBzZWNvbmRfcGVyc29uYSwgdWludDMyX3QgdGhpcmRfcGVyc29uYSwKKwl1aW50MzJfdCBjaG5sXzFzdF9jb25uLCB1aW50MzJfdCBjaG5sXzJuZF9jb25uLCB1aW50MzJfdCBjaG5sXzNyZF9jb25uLAorCWJvb2wgc3RhdHVzLCBlbnVtIGNkc19wY2xfdHlwZSBwY2xfdHlwZSwgY2hhciAqcmVhc29uLCB1aW50OF90ICpwY2wpOwordm9pZCBwcmludF9yZXBvcnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCk7Cit2b2lkIHdsYW5faGRkX29uZV9jb25uZWN0aW9uX3NjZW5hcmlvKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOwordm9pZCB3bGFuX2hkZF90d29fY29ubmVjdGlvbnNfc2NlbmFyaW8oaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwl1aW50OF90IGZpcnN0X2NobmwsIGVudW0gY2RzX2NoYWluX21vZGUgZmlyc3RfY2hhaW5fbWFzayk7Cit2b2lkIHdsYW5faGRkX3RocmVlX2Nvbm5lY3Rpb25zX3NjZW5hcmlvKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJdWludDhfdCBmaXJzdF9jaG5sLCB1aW50OF90IHNlY29uZF9jaG5sLAorCWVudW0gY2RzX2NoYWluX21vZGUgY2hhaW5fbWFzaywgdWludDhfdCB1c2Vfc2FtZV9tYWMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhbl9yZXBvcnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpbGxfcmVwb3J0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGNoYXIgKnRpdGxlLAorCXVpbnQzMl90IGZpcnN0X3BlcnNvbmEsIHVpbnQzMl90IHNlY29uZF9wZXJzb25hLCB1aW50MzJfdCB0aGlyZF9wZXJzb25hLAorCXVpbnQzMl90IGNobmxfMXN0X2Nvbm4sIHVpbnQzMl90IGNobmxfMm5kX2Nvbm4sIHVpbnQzMl90IGNobmxfM3JkX2Nvbm4sCisJYm9vbCBzdGF0dXMsIGVudW0gaGRkX3BjbF90eXBlIHBjbF90eXBlLCBjaGFyICpyZWFzb24sIHVpbnQ4X3QgKnBjbCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByaW50X3JlcG9ydChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2xhbl9oZGRfb25lX2Nvbm5lY3Rpb25fc2NlbmFyaW8oaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsYW5faGRkX3R3b19jb25uZWN0aW9uc19zY2VuYXJpbyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQl1aW50OF90IGZpcnN0X2NobmwsIGVudW0gaGRkX2NoYWluX21vZGUgZmlyc3RfY2hhaW5fbWFzaykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsYW5faGRkX3RocmVlX2Nvbm5lY3Rpb25zX3NjZW5hcmlvKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCXVpbnQ4X3QgZmlyc3RfY2hubCwgdWludDhfdCBzZWNvbmRfY2hubCwKKwkJZW51bSBoZGRfY2hhaW5fbW9kZSBjaGFpbl9tYXNrLCB1aW50OF90IHVzZV9zYW1lX21hYykKK3sKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfZGVidWdmcy5oIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX2RlYnVnZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTUxMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX2RlYnVnZnMuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9XTEFOX0hERF9ERUJVR0ZTX0gKKyNkZWZpbmUgX1dMQU5fSEREX0RFQlVHRlNfSAorCisjaWZkZWYgV0xBTl9PUEVOX1NPVVJDRQorQ0RGX1NUQVRVUyBoZGRfZGVidWdmc19pbml0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKK3ZvaWQgaGRkX2RlYnVnZnNfZXhpdChoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKKyNlbHNlCitpbmxpbmUgQ0RGX1NUQVRVUyBoZGRfZGVidWdmc19pbml0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2lubGluZSB2b2lkIGhkZF9kZWJ1Z2ZzX2V4aXQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKK30KKyNlbmRpZiAvKiAjaWZkZWYgV0xBTl9PUEVOX1NPVVJDRSAqLworI2VuZGlmIC8qICNpZm5kZWYgX1dMQU5fSEREX0RFQlVHRlNfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX2RyaXZlcl9vcHMuaCBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9kcml2ZXJfb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxOWNmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9kcml2ZXJfb3BzLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19XTEFOX0hERF9EUklWRVJfT1BTX0hfXworI2RlZmluZSBfX1dMQU5fSEREX0RSSVZFUl9PUFNfSF9fCisKKy8qKgorICogRE9DOiB3bGFuX2hkZF9kcml2ZXJfb3BzLmgKKyAqCisgKiBGdW5jdGlvbnMgdG8gcmVnaXN0ZXIgdGhlIHdsYW4gZHJpdmVyLgorKi8KK2ludCB3bGFuX2hkZF9yZWdpc3Rlcl9kcml2ZXIodm9pZCk7Cit2b2lkIHdsYW5faGRkX3VucmVnaXN0ZXJfZHJpdmVyKHZvaWQpOworaW50IHdsYW5faGRkX2J1c19zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisjZW5kaWYgLyogX19XTEFOX0hERF9EUklWRVJfT1BTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX2V0aGVyLmggYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfZXRoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzIwYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX2V0aGVyLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1dMQU5fSEREX0VUSEVSX0gKKyNkZWZpbmUgX1dMQU5fSEREX0VUSEVSX0gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgQGZpbGUgd2xhbl9oZGRfZXRoZXIuaAorCisgICBUaGlzIG1vZHVsZSBkZXNjcmliZXMgRXRoZXJuZXQgcGFja2V0IGZvcm1hdHMgZm9yIHByb2Nlc3NpbmcgYnkgSERELgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0xBTl9TTkFQX09VSV9MRU4gMworI2RlZmluZSBXTEFOX1NOQVBfRFNBUCAweEFBVQorI2RlZmluZSBXTEFOX1NOQVBfU1NBUCAweEFBVQorI2RlZmluZSBXTEFOX1NOQVBfQ1RSTCAweDAzCisjZGVmaW5lIFdMQU5fTUlOX1BST1RPIDB4MDYwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCB3bGFuX3NuYXBfaGRyIHsKKwl1bnNpZ25lZCBjaGFyIGRzYXA7CisJdW5zaWduZWQgY2hhciBzc2FwOworCXVuc2lnbmVkIGNoYXIgY3RybDsKKwl1bnNpZ25lZCBjaGFyIG91aVtXTEFOX1NOQVBfT1VJX0xFTl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd2xhbl84MDIzIHsKKwl1bnNpZ25lZCBjaGFyIGhfZGVzdFtFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBoX3NvdXJjZVtFVEhfQUxFTl07CisJX19iZTE2IGhfbGVuOworCXN0cnVjdCB3bGFuX3NuYXBfaGRyIGhfc25hcDsKKwlfX2JlMTYgaF9wcm90bzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3bGFuXzgwMjNfdmxhbiB7CisJdW5zaWduZWQgY2hhciBoX2Rlc3RbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgaF9zb3VyY2VbRVRIX0FMRU5dOworCV9fYmUxNiBoX3ZsYW5fcHJvdG87CisJX19iZTE2IGhfdmxhbl9UQ0k7CisJX19iZTE2IGhfbGVuOworCXN0cnVjdCB3bGFuX3NuYXBfaGRyIGhfc25hcDsKKwlfX2JlMTYgaF9wcm90bzsKK30gX19wYWNrZWQ7CisKK3VuaW9uIGdlbmVyaWNfZXRoaGRyIHsKKwlzdHJ1Y3QgZXRoaGRyIGV0aF9JSTsKKwlzdHJ1Y3Qgdmxhbl9ldGhoZHIgZXRoX0lJdjsKKwlzdHJ1Y3Qgd2xhbl84MDIzIGV0aF84MDIzOworCXN0cnVjdCB3bGFuXzgwMjNfdmxhbiBldGhfODAyM3Y7Cit9OworCisjZW5kaWYgLyogI2lmbmRlZiBfV0xBTl9IRERfRVRIRVJfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX2Z0bS5oIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX2Z0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZWQzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfZnRtLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBXTEFOX0hERF9GVE1fSAorI2RlZmluZSBXTEFOX0hERF9GVE1fSAorCisvKioKKyAqIERPQzogd2xhbl9oZGRfZnRtLmgKKyAqCisgKiBXTEFOIEhvc3QgRGV2aWNlIERyaXZlciBGYWN0b3J5IFRlc3QgTW9kZSBoZWFkZXIgZmlsZQorICovCisKKyNpbmNsdWRlICJjZGZfc3RhdHVzLmgiCisjaW5jbHVkZSAiY2RzX21xLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgPHdsYW5fcHR0X3NvY2tfc3ZjLmg+CisKK2VudW0gd2xhbl9oZGRfZnRtX3N0YXRlIHsKKwlXTEFOX0ZUTV9JTklUSUFMSVpFRCwKKwlXTEFOX0ZUTV9TVE9QUEVELAorCVdMQU5fRlRNX1NUQVJURUQsCit9OworCisvKioKKyAqIHN0cnVjdCB3bGFuX2hkZF9mdG1fc3RhdHVzIC0gRlRNIHN0YXR1cworICogQGZ0bV9zdGF0ZTogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEZUTSBwcm9jZXNzCisgKi8KK3N0cnVjdCB3bGFuX2hkZF9mdG1fc3RhdHVzIHsKKwllbnVtIHdsYW5faGRkX2Z0bV9zdGF0ZSBmdG1fc3RhdGU7Cit9OworCitpbnQgd2xhbl9oZGRfZnRtX29wZW4oaGRkX2NvbnRleHRfdCAqaGRkX2N0eCk7CitpbnQgd2xhbl9oZGRfZnRtX2Nsb3NlKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworCisjaWYgIGRlZmluZWQoUUNBX1dJRklfRlRNKQorQ0RGX1NUQVRVUyB3bGFuX2hkZF9mdG1fdGVzdG1vZGVfY21kKHZvaWQgKmRhdGEsIGludCBsZW4pOworaW50IHdsYW5faGRkX3FjbWJyX3VuaWZpZWRfaW9jdGwoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IGlmcmVxICppZnIpOworaW50IGhkZF9mdG1fc3RhcnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCk7CitpbnQgaGRkX2Z0bV9zdG9wKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX2hvc3Rfb2ZmbG9hZC5oIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX2hvc3Rfb2ZmbG9hZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNWE4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfaG9zdF9vZmZsb2FkLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19XTEFOX0hERF9IT1NUX09GRkxPQURfSF9fCisjZGVmaW5lIF9fV0xBTl9IRERfSE9TVF9PRkZMT0FEX0hfXworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIHdsYW5faGRkX2hvc3Rfb2ZmbG9hZC5oCisKKyAgIFxicmllZiBBbmRyb2lkIFdMQU4gSEREIEhvc3QgT2ZmbG9hZCBBUEkKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBPZmZsb2FkIHR5cGVzLiAqLworI2RlZmluZSBXTEFOX0lQVjRfQVJQX1JFUExZX09GRkxPQUQgICAgICAgICAgIDAKKyNkZWZpbmUgV0xBTl9JUFY2X05FSUdIQk9SX0RJU0NPVkVSWV9PRkZMT0FEICAxCisKKy8qIEVuYWJsZSBvciBkaXNhYmxlIG9mZmxvYWQuICovCisjZGVmaW5lIFdMQU5fT0ZGTE9BRF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTEFOX09GRkxPQURfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBXTEFOX09GRkxPQURfQkNfRklMVEVSX0VOQUJMRSAgICAgICAgICAgIDB4MgorI2RlZmluZSBXTEFOX09GRkxPQURfQVJQX0FORF9CQ19GSUxURVJfRU5BQkxFICAgIChXTEFOX09GRkxPQURfRU5BQkxFIHwgV0xBTl9PRkZMT0FEX0JDX0ZJTFRFUl9FTkFCTEUpCisKKy8qIE9mZmxvYWQgcmVxdWVzdC4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IG9mZmxvYWRUeXBlOworCXVpbnQ4X3QgZW5hYmxlT3JEaXNhYmxlOworCXVuaW9uIHsKKwkJdWludDhfdCBob3N0SXB2NEFkZHJbNF07CisJCXVpbnQ4X3QgaG9zdElwdjZBZGRyWzE2XTsKKwl9IHBhcmFtczsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkOworfSB0SG9zdE9mZmxvYWRSZXF1ZXN0LCAqdHBIb3N0T2ZmbG9hZFJlcXVlc3Q7CisKKyNlbmRpZiAvKiBfX1dMQU5fSEREX0hPU1RfT0ZGTE9BRF9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL2luYy93bGFuX2hkZF9pbmNsdWRlcy5oIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX2luY2x1ZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyZTYzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9pbmNsdWRlcy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoSEREX0lOQ0xVREVTX0hfXykKKyNkZWZpbmUgSEREX0lOQ0xVREVTX0hfXworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIHdsYW5faGRkX2luY2x1ZGVzLmgKKworICAgXGJyaWVmIEludGVybmFsIGluY2x1ZGVzIGZvciB0aGUgTGludXggSERECisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhFQURFUiQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgZmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB0aHJvdyBhbGwgdGhlIGluY2x1ZGVzIGluIGhlcmUgZiB0byBnZXQgdGhlIC5jIGZpbGVzICBpbiB0aGUgSEREIHRvIGNvbXBpbGUuICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSAib2xfdHhyeF9jdHJsX2FwaS5oIgorI2luY2x1ZGUgPGNkc19hcGkuaD4KKyNpbmNsdWRlIDxzbWVfYXBpLmg+CisjaW5jbHVkZSAid2xhbl9oZGRfYXNzb2MuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9taWIuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF93ZXh0LmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorI2luY2x1ZGUgIndsYW5faGRkX3R4X3J4LmgiCisKKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorLyppbmNsdWRlIGZvciBvZW0gZGF0YSByZXEgc3BlY2lmaWMgc3RydWN0dXJlcyovCisvKmFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMqLworI2luY2x1ZGUgIndsYW5faGRkX29lbWRhdGEuaCIKKyNlbmRpZgorCisjZW5kaWYgLyogZW5kICNpZiAhZGVmaW5lZChIRERfSU5DTFVERVNfSF9fKSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX2lwYS5oIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX2lwYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjVmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfaXBhLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgSEREX0lQQV9IX18KKyNkZWZpbmUgSEREX0lQQV9IX18KKworLyoqCisgKiBET0M6IHdsYW5faGRkX2lwYS5oCisgKgorICogV0xBTiBJUEEgaW50ZXJmYWNlIG1vZHVsZSBoZWFkZXJzCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lwYS5oPgorCisjaWZkZWYgSVBBX09GRkxPQUQKKy8qIEluY2x1ZGUgZmlsZXMgKi8KK0NERl9TVEFUVVMgaGRkX2lwYV9pbml0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworQ0RGX1NUQVRVUyBoZGRfaXBhX2NsZWFudXAoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCk7CitDREZfU1RBVFVTIGhkZF9pcGFfcHJvY2Vzc19yeHQodm9pZCAqY2RzX2NvbnRleHQsIGNkZl9uYnVmX3QgcnhCdWYsCisJdWludDhfdCBzdGFfaWQpOworaW50IGhkZF9pcGFfd2xhbl9ldnQoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgdWludDhfdCBzdGFfaWQsCisJZW51bSBpcGFfd2xhbl9ldmVudCB0eXBlLCB1aW50OF90ICptYWNfYWRkcik7CitpbnQgaGRkX2lwYV9zZXRfcGVyZl9sZXZlbChoZGRfY29udGV4dF90ICpoZGRfY3R4LCB1aW50NjRfdCB0eF9wYWNrZXRzLAorCXVpbnQ2NF90IHJ4X3BhY2tldHMpOworaW50IGhkZF9pcGFfc3VzcGVuZChoZGRfY29udGV4dF90ICpoZGRfY3R4KTsKK2ludCBoZGRfaXBhX3Jlc3VtZShoZGRfY29udGV4dF90ICpoZGRfY3R4KTsKK3ZvaWQgaGRkX2lwYV91Y19zdGF0X3F1ZXJ5KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIHVpbnQzMl90ICppcGFfdHhfZGlmZiwKKwl1aW50MzJfdCAqaXBhX3J4X2RpZmYpOwordm9pZCBoZGRfaXBhX3VjX3J0X2RlYnVnX2hvc3RfZHVtcChoZGRfY29udGV4dF90ICpoZGRfY3R4KTsKK3ZvaWQgaGRkX2lwYV91Y19zdGF0X3JlcXVlc3QoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgdWludDhfdCByZWFzb24pOworYm9vbCBoZGRfaXBhX2lzX2VuYWJsZWQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCk7Citib29sIGhkZF9pcGFfdWNfaXNfZW5hYmxlZChoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK2ludCBoZGRfaXBhX3NlbmRfbWNjX3NjY19tc2coaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgYm9vbCBtY2NfbW9kZSk7CisjZWxzZQorc3RhdGljIGlubGluZSBDREZfU1RBVFVTIGhkZF9pcGFfaW5pdChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgQ0RGX1NUQVRVUyBoZGRfaXBhX2NsZWFudXAoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMgaGRkX2lwYV9wcm9jZXNzX3J4dCh2b2lkICpjZHNfY29udGV4dCwKKwljZGZfbmJ1Zl90IHJ4QnVmLCB1aW50OF90IHN0YV9pZCkKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZGRfaXBhX3dsYW5fZXZ0KGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIHVpbnQ4X3Qgc3RhX2lkLAorCWVudW0gaXBhX3dsYW5fZXZlbnQgdHlwZSwgdWludDhfdCAqbWFjX2FkZHIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhkZF9pcGFfc2VuZF9tY2Nfc2NjX21zZyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCWJvb2wgbWNjX21vZGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhkZF9pcGFfc2V0X3BlcmZfbGV2ZWwoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwl1aW50NjRfdCB0eF9wYWNrZXRzLAorCXVpbnQ2NF90IHJ4X3BhY2tldHMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhkZF9pcGFfc3VzcGVuZChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZGRfaXBhX3Jlc3VtZShoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGRkX2lwYV91Y19zdGF0X3F1ZXJ5KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJdWludDMyX3QgKmlwYV90eF9kaWZmLAorCXVpbnQzMl90ICppcGFfcnhfZGlmZikKK3sKKwkqaXBhX3R4X2RpZmYgPSAwOworCSppcGFfcnhfZGlmZiA9IDA7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGRkX2lwYV91Y19zdGF0X3JlcXVlc3QoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwl1aW50OF90IHJlYXNvbikKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGhkZF9pcGFfdWNfcnRfZGVidWdfaG9zdF9kdW1wKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaGRkX2lwYV9pc19lbmFibGVkKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaGRkX2lwYV91Y19pc19lbmFibGVkKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCisKKyNpZmRlZiBJUEFfVUNfT0ZGTE9BRAoraW50IGhkZF9pcGFfdWNfc3NyX3JlaW5pdCh2b2lkKTsKK2ludCBoZGRfaXBhX3VjX3Nzcl9kZWluaXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaGRkX2lwYV91Y19zc3JfcmVpbml0KHZvaWQpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZGRfaXBhX3VjX3Nzcl9kZWluaXQodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qICNpZm5kZWYgSEREX0lQQV9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL2luYy93bGFuX2hkZF9scm8uaCBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9scm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjRlYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX2xyby5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fV0xBTl9IRERfTFJPX0hfXworI2RlZmluZSBfX1dMQU5fSEREX0xST19IX18KKy8qKgorICogRE9DOiB3bGFuX2hkZF9scm8uaAorICoKKyAqIFdMQU4gTFJPIGludGVyZmFjZSBtb2R1bGUgaGVhZGVycworICovCisKKy8qKgorICogZW51bSBoZGRfbHJvX3J4X3N0YXR1cyAtIExSTyByZWNlaXZlIGZyYW1lIHN0YXR1cworICogQEhERF9MUk9fUlg6IGZyYW1lIHNlbnQgb3ZlciB0aGUgTFJPIGludGVyZmFjZQorICogQEhERF9MUk9fTk9fUlg6IGZyYW1lIG5vdCBzZW50IG92ZXIgdGhlIExSTyBpbnRlcmZhY2UKKyAqLworZW51bSBoZGRfbHJvX3J4X3N0YXR1cyB7CisJSEREX0xST19SWCA9IDAsCisJSEREX0xST19OT19SWCA9IDEsCit9OworCisjaWYgZGVmaW5lZChGRUFUVVJFX0xSTykKKworI2luY2x1ZGUgPGxpbnV4L2luZXRfbHJvLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisvKiBMUk9fREVTQ19UQUJMRV9TWiBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBMUk9fREVTQ19UQUJMRV9TWiAxNgorI2RlZmluZSBMUk9fREVTQ19UQUJMRV9TWl9NQVNLIChMUk9fREVTQ19UQUJMRV9TWiAtIDEpCisjZGVmaW5lIExST19ERVNDX1BPT0xfU1ogMTAKKworLyoqCisgKiBoZGRfbHJvX2Rlc2NfZW50cnkgLSBkZWZpbmVzIHRoZSBMUk8gZGVzY3JpcHRvcgorICogZWxlbWVudCBzdG9yZWQgaW4gdGhlIGxpc3QKKyAqIEBscm9fbm9kZTogbm9kZSBvZiB0aGUgbGlzdAorICogQGxyb19kZXNjOiB0aGUgTFJPIGRlc2NyaXB0b3IgY29udGFpbmVkIGluIHRoaXMgbGlzdCBlbnRyeQorICovCitzdHJ1Y3QgaGRkX2xyb19kZXNjX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxyb19ub2RlOworCXN0cnVjdCBuZXRfbHJvX2Rlc2MgKmxyb19kZXNjOworfTsKKworLyoqCisgKiBoZGRfbHJvX2Rlc2NfcG9vbCAtIHBvb2wgb2YgZnJlZSBMUk8gZGVzY3JpcHRvcnMKKyAqIEBscm9fZGVzY19hcnJheTogYXJyYXkgb2YgTFJPIGRlc2NyaXB0b3JzIGFsbG9jYXRlZAorICogQGxyb19mcmVlX2xpc3RfaGVhZDogaGVhZCBvZiB0aGUgbGlzdAorICogQGxyb19wb29sX2xvY2s6IGxvY2sgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIGxpc3QKKyAqLworc3RydWN0IGhkZF9scm9fZGVzY19wb29sIHsKKwlzdHJ1Y3QgaGRkX2xyb19kZXNjX2VudHJ5ICpscm9fZGVzY19hcnJheTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxyb19mcmVlX2xpc3RfaGVhZDsKKwljZGZfc3BpbmxvY2tfdCBscm9fcG9vbF9sb2NrOworfTsKKworLyoqCisgKiBoZGRfbHJvX2Rlc2NfdGFibGUgLSBkZWZpbmVzIGVhY2ggZW50cnkgb2YgdGhlIExSTworICogaGFzaCB0YWJsZQorICogQGxyb19kZXNjX2xpc3Q6IGxpc3Qgb2YgTFJPIGRlc2NyaXB0b3JzCisgKi8KK3N0cnVjdCBoZGRfbHJvX2Rlc2NfdGFibGUgeworCXN0cnVjdCBsaXN0X2hlYWQgbHJvX2Rlc2NfbGlzdDsKK307CisKKy8qKgorICogaGRkX2xyb19kZXNjX2luZm8gLSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgTFJPCisgKiBkZXNjcmlwdG9yIGluZm9ybWF0aW9uCisgKiBAbHJvX2hhc2hfdGFibGU6IGhhc2ggdGFibGUgdXNlZCBmb3IgYSBxdWljayBkZXNjLiBsb29rLXVwCisgKiBAbHJvX2hhc2hfbG9jazogbG9jayB0byBwcm90ZWN0IGFjY2VzcyB0byB0aGUgaGFzaCB0YWJsZQorICogQGxyb19kZXNjX3Bvb2w6IEZyZWUgcG9vbCBvZiBMUk8gZGVzY3JpcHRvcnMKKyAqLworc3RydWN0IGhkZF9scm9fZGVzY19pbmZvIHsKKwlzdHJ1Y3QgaGRkX2xyb19kZXNjX3RhYmxlICpscm9faGFzaF90YWJsZTsKKwljZGZfc3BpbmxvY2tfdCBscm9faGFzaF9sb2NrOworCXN0cnVjdCBoZGRfbHJvX2Rlc2NfcG9vbCBscm9fZGVzY19wb29sOworfTsKKworLyoqCisgKiBoZGRfbHJvX3MgLSBMUk8gaW5mb3JtYXRpb24gcGVyIEhERCBhZGFwdGVyCisgKiBAbHJvX21ncjogTFJPIG1hbmFnZXIKKyAqIEBscm9fZGVzY19pbmZvOiBMUk8gZGVzY3JpcHRvciBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgaGRkX2xyb19zIHsKKwlzdHJ1Y3QgbmV0X2xyb19tZ3IgKmxyb19tZ3I7CisJc3RydWN0IGhkZF9scm9fZGVzY19pbmZvIGxyb19kZXNjX2luZm87Cit9OworCitpbnQgaGRkX2xyb19pbml0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworCitpbnQgaGRkX2xyb19lbmFibGUoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcik7CisKK3ZvaWQgaGRkX2xyb19kaXNhYmxlKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpOworCitlbnVtIGhkZF9scm9fcnhfc3RhdHVzIGhkZF9scm9fcngoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3ZvaWQgaGRkX2xyb19mbHVzaF9hbGwoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcik7CisjZWxzZQorc3RydWN0IGhkZF9scm9fcyB7fTsKKworc3RhdGljIGlubGluZSBpbnQgaGRkX2xyb19lbmFibGUoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBlbnVtIGhkZF9scm9fcnhfc3RhdHVzIGhkZF9scm9fcngoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gSEREX0xST19OT19SWDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGRkX2xyb19pbml0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZGRfbHJvX2Rpc2FibGUoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcil7fQorI2VuZGlmIC8qIEZFQVRVUkVfTFJPICovCisjZW5kaWYgLyogX19XTEFOX0hERF9MUk9fSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfbWFpbi5oIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTRhZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX21haW4uaApAQCAtMCwwICsxLDE1MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChXTEFOX0hERF9NQUlOX0gpCisjZGVmaW5lIFdMQU5fSEREX01BSU5fSAorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICBXTEFOX0hERF9NQUlOX0guaAorCisgICBcYnJpZWYgTGludXggSEREIEFkYXB0ZXIgVHlwZQorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBJbmNsdWRlIGZpbGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2luY2x1ZGUgPGNkZl9saXN0Lmg+CisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSAic2lyX21hY19wcm90X2RlZi5oIgorI2luY2x1ZGUgImNzcl9hcGkuaCIKKyNpbmNsdWRlIDx3bGFuX2hkZF9hc3NvYy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dtbS5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2NmZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaWYgZGVmaW5lZChXTEFOX09QRU5fU09VUkNFKSAmJiBkZWZpbmVkKENPTkZJR19IQVNfV0FLRUxPQ0spCisjaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KKyNlbmRpZgorI2luY2x1ZGUgPHdsYW5faGRkX2Z0bS5oPgorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisjaW5jbHVkZSAid2xhbl9oZGRfdGRscy5oIgorI2VuZGlmCisjaW5jbHVkZSAid2xhbl9oZGRfY2ZnODAyMTEuaCIKKyNpbmNsdWRlIDxjZGZfZGVmZXIuaD4KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisjaW5jbHVkZSAic2FwX2FwaS5oIgorI2VuZGlmCisjaW5jbHVkZSAib2xfdHhyeF9vc2lmX2FwaS5oIgorI2luY2x1ZGUgIm9sX3R4cnhfY3RybF9hcGkuaCIKKyNpbmNsdWRlIDx3bGFuX2hkZF9scm8uaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBOdW1iZXIgb2YgVHggUXVldWVzICovCisjaWZkZWYgUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMgorI2RlZmluZSBOVU1fVFhfUVVFVUVTIDUKKyNlbHNlCisjZGVmaW5lIE5VTV9UWF9RVUVVRVMgNAorI2VuZGlmCisvKiogQnl0ZXMgdG8gcmVzZXJ2ZSBpbiB0aGUgaGVhZHJvb20gKi8KKyNkZWZpbmUgTElCUkFfSFdfTkVFREVEX0hFQURST09NICAgMTI4CisvKiogSGRkIFR4IFRpbWUgb3V0IHZhbHVlICovCisjaWZkZWYgTElCUkFfTElOVVhfUEMKKyNkZWZpbmUgSEREX1RYX1RJTUVPVVQgICAgICAgICAgKDgwMDApCisjZWxzZQorI2RlZmluZSBIRERfVFhfVElNRU9VVCAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKDUwMDApCisjZW5kaWYKKy8qKiBIZGQgRGVmYXVsdCBNVFUgKi8KKyNkZWZpbmUgSEREX0RFRkFVTFRfTVRVICAgICAgICAgKDE1MDApCisKKyNpZmRlZiBRQ0FfQ09ORklHX1NNUAorI2RlZmluZSBOVU1fQ1BVUyBOUl9DUFVTCisjZWxzZQorI2RlZmluZSBOVU1fQ1BVUyAxCisjZW5kaWYKKworLyoqZXZlbnQgZmxhZ3MgcmVnaXN0ZXJlZCBuZXQgZGV2aWNlKi8KKyNkZWZpbmUgTkVUX0RFVklDRV9SRUdJU1RFUkVEICAoMCkKKyNkZWZpbmUgU01FX1NFU1NJT05fT1BFTkVEICAgICAoMSkKKyNkZWZpbmUgSU5JVF9UWF9SWF9TVUNDRVNTICAgICAoMikKKyNkZWZpbmUgV01NX0lOSVRfRE9ORSAgICAgICAgICAoMykKKyNkZWZpbmUgU09GVEFQX0JTU19TVEFSVEVEICAgICAoNCkKKyNkZWZpbmUgREVWSUNFX0lGQUNFX09QRU5FRCAgICAoNSkKKyNkZWZpbmUgVERMU19JTklUX0RPTkUgICAgICAgICAoNikKKyNkZWZpbmUgQUNTX1BFTkRJTkcgICAgICAgICAgICAoNykKKworLyogSEREIGdsb2JhbCBldmVudCBmbGFncyAqLworI2RlZmluZSBBQ1NfSU5fUFJPR1JFU1MgICAgICAgICgwKQorCisvKiogTWF4aW11bSB0aW1lKG1zKXRvIHdhaXQgZm9yIGRpc2Nvbm5lY3QgdG8gY29tcGxldGUgKiovCisjaWZkZWYgUUNBX1dJRklfM18wX0VNVQorI2RlZmluZSBXTEFOX1dBSVRfVElNRV9ESVNDT05ORUNUICAzMDAwCisjZWxzZQorI2RlZmluZSBXTEFOX1dBSVRfVElNRV9ESVNDT05ORUNUICAyMDAwCisjZW5kaWYKKyNkZWZpbmUgV0xBTl9XQUlUX1RJTUVfU1RBVFMgICAgICAgODAwCisjZGVmaW5lIFdMQU5fV0FJVF9USU1FX1BPV0VSICAgICAgIDgwMAorI2RlZmluZSBXTEFOX1dBSVRfVElNRV9DT1VOVFJZICAgICAxMDAwCisjZGVmaW5lIFdMQU5fV0FJVF9USU1FX0xJTktfU1RBVFVTIDgwMAorLyogQW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3Igc21lIGNsb3NlIHNlc3Npb24gY2FsbGJhY2suCisgICBUaGlzIHZhbHVlIHNob3VsZCBiZSBsYXJnZXIgdGhhbiB0aGUgdGltZW91dCB1c2VkIGJ5IFdESSB0byB3YWl0IGZvcgorICAgYSByZXNwb25zZSBmcm9tIFdDTlNTICovCisjZGVmaW5lIFdMQU5fV0FJVF9USU1FX1NFU1NJT05PUEVOQ0xPU0UgIDE1MDAwCisjZGVmaW5lIFdMQU5fV0FJVF9USU1FX0FCT1JUU0NBTiAgICAgICAgIDIwMDAKKworLyoqIE1heGltdW0gdGltZShtcykgdG8gd2FpdCBmb3IgbWMgdGhyZWFkIHN1c3BlbmQgKiovCisjZGVmaW5lIFdMQU5fV0FJVF9USU1FX01DVEhSRUFEX1NVU1BFTkQgIDEyMDAKKworLyoqIE1heGltdW0gdGltZShtcykgdG8gd2FpdCBmb3IgdGFyZ2V0IHRvIGJlIHJlYWR5IGZvciBzdXNwZW5kICoqLworI2RlZmluZSBXTEFOX1dBSVRfVElNRV9SRUFEWV9UT19TVVNQRU5EICAyMDAwCisKKy8qKiBNYXhpbXVtIHRpbWUobXMpIHRvIHdhaXQgZm9yIHRkbHMgYWRkIHN0YSB0byBjb21wbGV0ZSAqKi8KKyNkZWZpbmUgV0FJVF9USU1FX1RETFNfQUREX1NUQSAgICAgIDE1MDAKKworLyoqIE1heGltdW0gdGltZShtcykgdG8gd2FpdCBmb3IgdGRscyBkZWwgc3RhIHRvIGNvbXBsZXRlICoqLworI2RlZmluZSBXQUlUX1RJTUVfVERMU19ERUxfU1RBICAgICAgMTUwMAorCisvKiogTWF4aW11bSB0aW1lKG1zKSB0byB3YWl0IGZvciBMaW5rIEVzdGFibGlzaCBSZXEgdG8gY29tcGxldGUgKiovCisjZGVmaW5lIFdBSVRfVElNRV9URExTX0xJTktfRVNUQUJMSVNIX1JFUSAgICAgIDE1MDAKKworLyoqIE1heGltdW0gdGltZShtcykgdG8gd2FpdCBmb3IgdGRscyBtZ210IHRvIGNvbXBsZXRlICoqLworI2RlZmluZSBXQUlUX1RJTUVfVERMU19NR01UICAgICAgICAgMTEwMDAKKworLyogU2NhbiBSZXEgVGltZW91dCAqLworI2RlZmluZSBXTEFOX1dBSVRfVElNRV9TQ0FOX1JFUSAxMDAKKworI2RlZmluZSBNQVhfTlVNQkVSX09GX0FEQVBURVJTIDQKKworI2RlZmluZSBNQVhfQ0ZHX1NUUklOR19MRU4gIDI1NQorCisjZGVmaW5lIE1BQ19BRERSX0FSUkFZKGEpIChhKVswXSwgKGEpWzFdLCAoYSlbMl0sIChhKVszXSwgKGEpWzRdLCAoYSlbNV0KKy8qKiBNYWMgQWRkcmVzcyBzdHJpbmcgKiovCisjZGVmaW5lIE1BQ19BRERSRVNTX1NUUiAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiCisjZGVmaW5lIE1BQ19BRERSRVNTX1NUUl9MRU4gMTggIC8qIEluY2x1ZGluZyBudWxsIHRlcm1pbmF0b3IgKi8KKyNkZWZpbmUgTUFYX0dFTklFX0xFTiAyNTUKKworI2RlZmluZSBXTEFOX0NISVBfVkVSU0lPTiAgICJXQ05TUyIKKworI2RlZmluZSBoZGRMb2cobGV2ZWwsIGFyZ3MgLi4uKSBDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIGxldmVsLCAjIyBhcmdzKQorCisjZGVmaW5lIGhkZF9sb2cobGV2ZWwsIGFyZ3MuLi4pIENERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgbGV2ZWwsICMjIGFyZ3MpCisjZGVmaW5lIGhkZF9sb2dmbChsZXZlbCwgZm9ybWF0LCBhcmdzLi4uKSBoZGRfbG9nKGxldmVsLCBGTChmb3JtYXQpLCAjIyBhcmdzKQorCisjZGVmaW5lIGhkZF9hbGVydChmb3JtYXQsIGFyZ3MuLi4pIFwKKwkJaGRkX2xvZ2ZsKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSBoZGRfZXJyKGZvcm1hdCwgYXJncy4uLikgXAorCQloZGRfbG9nZmwoQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIGhkZF93YXJuKGZvcm1hdCwgYXJncy4uLikgXAorCQloZGRfbG9nZmwoQ0RGX1RSQUNFX0xFVkVMX1dBUk4sIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgaGRkX25vdGljZShmb3JtYXQsIGFyZ3MuLi4pIFwKKwkJaGRkX2xvZ2ZsKENERl9UUkFDRV9MRVZFTF9JTkZPLCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIGhkZF9pbmZvKGZvcm1hdCwgYXJncy4uLikgXAorCQloZGRfbG9nZmwoQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSBoZGRfZGVidWcoZm9ybWF0LCBhcmdzLi4uKSBcCisJCWhkZF9sb2dmbChDREZfVFJBQ0VfTEVWRUxfREVCVUcsIGZvcm1hdCwgIyMgYXJncykKKworI2RlZmluZSBFTlRFUigpIGhkZF9sb2dmbChDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csICJlbnRlciIpCisjZGVmaW5lIEVYSVQoKSBoZGRfbG9nZmwoQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAiZXhpdCIpCisKKyNkZWZpbmUgV0xBTl9IRERfR0VUX1BSSVZfUFRSKF9fZGV2X18pIChoZGRfYWRhcHRlcl90ICopKG5ldGRldl9wcml2KChfX2Rldl9fKSkpCisKKyNkZWZpbmUgTUFYX05PX09GXzJfNF9DSEFOTkVMUyAxNAorCisjZGVmaW5lIFdMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUUgNAorI2RlZmluZSBXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX09GRlNFVCAyNAorI2RlZmluZSBXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX0JPRFlfT0ZGU0VUIDI0CisjZGVmaW5lIFdMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfVFlQRV9PRkZTRVQgMzAKKyNkZWZpbmUgV0xBTl9IRERfUFVCTElDX0FDVElPTl9GUkFNRV9DQVRFR09SWV9PRkZTRVQgMAorI2RlZmluZSBXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX0FDVElPTl9PRkZTRVQgMQorI2RlZmluZSBXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX09VSV9PRkZTRVQgMgorI2RlZmluZSBXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX09VSV9UWVBFX09GRlNFVCA1CisjZGVmaW5lIFdMQU5fSEREX1ZFTkRPUl9TUEVDSUZJQ19BQ1RJT04gMHgwOQorI2RlZmluZSBXTEFOX0hERF9XRkFfT1VJICAgMHg1MDZGOUEKKyNkZWZpbmUgV0xBTl9IRERfV0ZBX1AyUF9PVUlfVFlQRSAweDA5CisjZGVmaW5lIFdMQU5fSEREX1AyUF9TT0NJQUxfQ0hBTk5FTFMgMworI2RlZmluZSBXTEFOX0hERF9QMlBfU0lOR0xFX0NIQU5ORUxfU0NBTiAxCisjZGVmaW5lIFdMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfU1VCX1RZUEVfT0ZGU0VUIDYKKworI2RlZmluZSBXTEFOX0hERF9JU19TT0NJQUxfQ0hBTk5FTChjZW50ZXJfZnJlcSkJXAorCSgoKGNlbnRlcl9mcmVxKSA9PSAyNDEyKSB8fCAoKGNlbnRlcl9mcmVxKSA9PSAyNDM3KSB8fCAoKGNlbnRlcl9mcmVxKSA9PSAyNDYyKSkKKworI2RlZmluZSBXTEFOX0hERF9DSEFOTkVMX0lOX1VOSUlfMV9CQU5EKGNlbnRlcl9mcmVxKSBcCisJKCgoY2VudGVyX2ZyZXEpID09IDUxODApIHx8ICgoY2VudGVyX2ZyZXEpID09IDUyMDApIFwKKwkgfHwgKChjZW50ZXJfZnJlcSkgPT0gNTIyMCkgfHwgKChjZW50ZXJfZnJlcSkgPT0gNTI0MCkpCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisjZGVmaW5lIFdMQU5fSEREX1NBX1FVRVJZX0FDVElPTl9GUkFNRSA4CisjZW5kaWYKKworI2RlZmluZSBXTEFOX0hERF9QVUJMSUNfQUNUSU9OX1RETFNfRElTQ19SRVNQIDE0CisjZGVmaW5lIFdMQU5fSEREX1RETFNfQUNUSU9OX0ZSQU1FIDEyCisjaWZkZWYgV0xBTl9GRUFUVVJFX0hPTERfUlhfV0FLRUxPQ0sKKyNkZWZpbmUgSEREX1dBS0VfTE9DS19EVVJBVElPTiA1MCAgICAgICAvKiBpbiBtc2VjcyAqLworI2VuZGlmCisKKyNkZWZpbmUgV0xBTl9IRERfUU9TX0FDVElPTl9GUkFNRSAxCisjZGVmaW5lIFdMQU5fSEREX1FPU19NQVBfQ09ORklHVVJFIDQKKyNkZWZpbmUgSEREX1NBUF9XQUtFX0xPQ0tfRFVSQVRJT04gMTAwMDAgICAgICAgIC8qIGluIG1zZWNzICovCisKKyNkZWZpbmUgSEREX01PRF9FWElUX1NTUl9NQVhfUkVUUklFUyA3NQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisjZGVmaW5lIEdUS19PRkZMT0FEX0VOQUJMRSAgMAorI2RlZmluZSBHVEtfT0ZGTE9BRF9ESVNBQkxFIDEKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisjZGVmaW5lIEhERF9QTk9fU0NBTl9USU1FUlNfU0VUX09ORSAgICAgIDEKKy8qIHZhbHVlIHNob3VsZCBub3QgYmUgZ3JlYXRlciB0aGFuIFBOT19NQVhfU0NBTl9USU1FUlMgKi8KKyNkZWZpbmUgSEREX1BOT19TQ0FOX1RJTUVSU19TRVRfTVVMVElQTEUgNgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX1VTRVJfQ09NTUFORF9TSVpFIDQwOTYKKworI2RlZmluZSBIRERfTUlOX1RYX1BPV0VSICgtMTAwKSAvKiBtaW5pbXVtIHR4IHBvd2VyICovCisjZGVmaW5lIEhERF9NQVhfVFhfUE9XRVIgKCsxMDApIC8qIG1heGltdW0gdHggcG93ZXIgKi8KKworLyogSWYgSVBBIFVDIGRhdGEgcGF0aCBpcyBlbmFibGVkLCB0YXJnZXQgc2hvdWxkIHJlc2VydmUgZXh0cmEgdHggZGVzY3JpcHRvcnMKKyAqIGZvciBJUEEgZGF0YSBwYXRoLgorICogVGhlbiBob3N0IGRhdGEgcGF0aCBzaG91bGQgYWxsb3cgbGVzcyBUWCBwYWNrZXQgcHVtcGluZyBpbiBjYXNlCisgKiBJUEEgZGF0YSBwYXRoIGVuYWJsZWQKKyAqLworI2RlZmluZSBXTEFOX1RGQ19JUEFVQ19UWF9ERVNDX1JFU0VSVkUgICAxMDAKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTQsIDApKQorI2lmZGVmIENPTkZJR19DTlNTCisjZGVmaW5lIGNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkoc2tiKSBjbnNzX3ZlbmRvcl9jbWRfcmVwbHkoc2tiKQorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBCU1NfV0FJVF9USU1FT1VUIDEwMDAwCisKKy8qCisgKiBHZW5lcmljIGFzeW5jaHJvbm91cyByZXF1ZXN0L3Jlc3BvbnNlIHN1cHBvcnQKKyAqCisgKiBNYW55IG9mIHRoZSBBUElzIHN1cHBvcnRlZCBieSBIREQgcmVxdWlyZSBhIGNhbGwgdG8gU01FIHRvCisgKiBwZXJmb3JtIGFuIGFjdGlvbiBvciB0byByZXRyaWV2ZSBzb21lIGRhdGEuICBJbiBtb3N0IGNhc2VzIFNNRQorICogcGVyZm9ybXMgdGhlIG9wZXJhdGlvbiBhc3luY2hyb25vdXNseSwgYW5kIHdpbGwgZXhlY3V0ZSBhIHByb3ZpZGVkCisgKiBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQuICBJbiBvcmRlciB0bworICogc3luY2hyb25pemUgdGhpcyB0aGUgSEREIEFQSSBhbGxvY2F0ZXMgYSBjb250ZXh0IHdoaWNoIGlzIHRoZW4KKyAqIHBhc3NlZCB0byBTTUUsIGFuZCB3aGljaCBpcyB0aGVuLCBpbiB0dXJuLCBwYXNzZWQgYmFjayB0byB0aGUKKyAqIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuICBUaGUgY2FsbGJhY2sKKyAqIGZ1bmN0aW9uIHRoZW4gc2V0cyBhIGNvbXBsZXRpb24gdmFyaWFibGUgaW5zaWRlIHRoZSBjb250ZXh0IHdoaWNoCisgKiB0aGUgSEREIEFQSSBpcyB3YWl0aW5nIG9uLiAgSW4gYW4gaWRlYWwgd29ybGQgdGhlIEhERCBBUEkgd291bGQKKyAqIHdhaXQgZm9yZXZlciAob3IgYXQgbGVhc3QgZm9yIGEgbG9uZyB0aW1lKSBmb3IgdGhlIHJlc3BvbnNlIHRvIGJlCisgKiByZWNlaXZlZCBhbmQgZm9yIHRoZSBjb21wbGV0aW9uIHZhcmlhYmxlIHRvIGJlIHNldC4gIEhvd2V2ZXIgaW4KKyAqIG1vc3QgY2FzZXMgdGhlc2UgSEREIEFQSXMgYXJlIGJlaW5nIGludm9rZWQgaW4gdGhlIGNvbnRleHQgb2YgYQorICogdXNlciBzcGFjZSB0aHJlYWQgd2hpY2ggaGFzIGludm9rZWQgZWl0aGVyIGEgY2ZnODAyMTEgQVBJIG9yIGEKKyAqIHdpcmVsZXNzIGV4dGVuc2lvbnMgaW9jdGwgYW5kIHdoaWNoIGhhcyB0YWtlbiB0aGUga2VybmVsIHJ0bmxfbG9jay4KKyAqIFNpbmNlIHRoaXMgbG9jayBpcyB1c2VkIHRvIHN5bmNocm9uaXplIG1hbnkgb2YgdGhlIGtlcm5lbCB0YXNrcywgd2UKKyAqIGRvIG5vdCB3YW50IHRvIGhvbGQgaXQgZm9yIGEgbG9uZyB0aW1lLiAgSW4gYWRkaXRpb24gd2UgZG8gbm90IHdhbnQKKyAqIHRvIGJsb2NrIHVzZXIgc3BhY2UgdGhyZWFkcyAoc3VjaCBhcyB0aGUgd3BhIHN1cHBsaWNhbnQncyBtYWluCisgKiB0aHJlYWQpIGZvciBhbiBleHRlbmRlZCB0aW1lLiAgVGhlcmVmb3JlIHdlIG9ubHkgYmxvY2sgZm9yIGEgc2hvcnQKKyAqIHRpbWUgd2FpdGluZyBmb3IgdGhlIHJlc3BvbnNlIGJlZm9yZSB3ZSB0aW1lb3V0LiAgVGhpcyBtZWFucyB0aGF0CisgKiBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIEhERCBBUEkgdG8gdGltZW91dCwgYW5kIGZvciB0aGUgY2FsbGJhY2sgdG8KKyAqIGJlIGludm9rZWQgYWZ0ZXJ3YXJkcy4gIEluIG9yZGVyIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8KKyAqIGRldGVybWluZSBpZiB0aGUgSEREIEFQSSBpcyBzdGlsbCB3YWl0aW5nLCBhIG1hZ2ljIHZhbHVlIGlzIGFsc28KKyAqIHN0b3JlZCBpbiB0aGUgc2hhcmVkIGNvbnRleHQuICBPbmx5IGlmIHRoZSBjb250ZXh0IGhhcyBhIHZhbGlkCisgKiBtYWdpYyB3aWxsIHRoZSBjYWxsYmFjayByb3V0aW5lIGRvIGFueSB3b3JrLiAgSW4gb3JkZXIgdG8gZnVydGhlcgorICogc3luY2hyb25pemUgdGhlc2UgYWN0aXZpdGllcyBhIHNwaW5sb2NrIGlzIHVzZWQgc28gdGhhdCBpZiBhbnkgSERECisgKiBBUEkgdGltZW91dCBjb2luY2lkZXMgd2l0aCBpdHMgY2FsbGJhY2ssIHRoZSBvcGVyYXRpb25zIG9mIHRoZSB0d28KKyAqIHRocmVhZHMgd2lsbCBiZSBzZXJpYWxpemVkLgorICovCisKK3N0cnVjdCBzdGF0c0NvbnRleHQgeworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJdW5zaWduZWQgaW50IG1hZ2ljOworfTsKKworc3RydWN0IGxpbmtzcGVlZENvbnRleHQgeworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJdW5zaWduZWQgaW50IG1hZ2ljOworfTsKKworZXh0ZXJuIHNwaW5sb2NrX3QgaGRkX2NvbnRleHRfbG9jazsKKworI2RlZmluZSBTVEFUU19DT05URVhUX01BR0lDIDB4NTM1NDQxNTQgIC8qIFNUQVQgKi8KKyNkZWZpbmUgUlNTSV9DT05URVhUX01BR0lDICAweDUyNTM1MzQ5ICAvKiBSU1NJICovCisjZGVmaW5lIFBPV0VSX0NPTlRFWFRfTUFHSUMgMHg1MDRGNTc1MiAgLyogUE9XUiAqLworI2RlZmluZSBTTlJfQ09OVEVYVF9NQUdJQyAgIDB4NTM0RTUyMDAgIC8qIFNOUiAqLworI2RlZmluZSBMSU5LX0NPTlRFWFRfTUFHSUMgIDB4NEM0OTRFNEIgIC8qIExJTktTUEVFRCAqLworI2RlZmluZSBMSU5LX1NUQVRVU19NQUdJQyAgIDB4NEM0QjUzNTQgIC8qIExJTktTVEFUVVMoTE5TVCkgKi8KKyNkZWZpbmUgVEVNUF9DT05URVhUX01BR0lDICAweDc0NjU2ZDcwICAgLyogVEVNUCAodGVtcGVyYXR1cmUpICovCisKKy8qIE1BWCBPUyBRIGJsb2NrIHRpbWUgdmFsdWUgaW4gbXNlYworICogUHJldmVudCBmcm9tIHBlcm1hbmVudCBzdGFsbCwgcmVzdW1lIE9TIFEgaWYgdGltZXIgZXhwaXJlZCAqLworI2RlZmluZSBXTEFOX0hERF9UWF9GTE9XX0NPTlRST0xfT1NfUV9CTE9DS19USU1FIDEwMDAKKyNkZWZpbmUgV0xBTl9TQVBfSEREX1RYX0ZMT1dfQ09OVFJPTF9PU19RX0JMT0NLX1RJTUUgMTAwCisjZGVmaW5lIFdMQU5fSEREX1RYX0ZMT1dfQ09OVFJPTF9NQVhfMjRCQU5EX0NIICAgMTQKKworI2RlZmluZSBIRERfVkhUX1JYX0hJR0hFU1RfU1VQUE9SVEVEX0RBVEFfUkFURV8xXzEgICAgICAgMzkwCisjZGVmaW5lIEhERF9WSFRfVFhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFXzFfMSAgICAgICAzOTAKKyNkZWZpbmUgSEREX1ZIVF9SWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEVfMl8yICAgICAgIDc4MAorI2RlZmluZSBIRERfVkhUX1RYX0hJR0hFU1RfU1VQUE9SVEVEX0RBVEFfUkFURV8yXzIgICAgICAgNzgwCisKKworI2RlZmluZSBOVU1fVFhfUlhfSElTVE9HUkFNIDEwMjQKKyNkZWZpbmUgTlVNX1RYX1JYX0hJU1RPR1JBTV9NQVNLIChOVU1fVFhfUlhfSElTVE9HUkFNIC0gMSkKKworc3RydWN0IGhkZF90eF9yeF9oaXN0b2dyYW0geworCXVpbnQ2NF90IGludGVydmFsX3J4OworCXVpbnQ2NF90IGludGVydmFsX3R4OworCXVpbnQ2NF90IHRvdGFsX3J4OworCXVpbnQ2NF90IHRvdGFsX3R4OworCXVpbnQzMl90IG5leHRfdm90ZV9sZXZlbDsKKwl1aW50MzJfdCBuZXh0X3J4X2xldmVsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaGRkX3R4X3J4X3N0YXRzX3MgeworCS8qIHN0YXJ0X3htaXQgc3RhdHMgKi8KKwlfX3UzMiAgICB0eFhtaXRDYWxsZWQ7CisJX191MzIgICAgdHhYbWl0RHJvcHBlZDsKKwlfX3UzMiAgICB0eFhtaXRDbGFzc2lmaWVkQUNbTlVNX1RYX1FVRVVFU107CisJX191MzIgICAgdHhYbWl0RHJvcHBlZEFDW05VTV9UWF9RVUVVRVNdOworCS8qIGNvbXBsZXRlX2Nia19zdGF0cyAqLworCV9fdTMyICAgIHR4Q29tcGxldGVkOworCS8qIHJ4IHN0YXRzICovCisJX191MzIgcnhQYWNrZXRzW05VTV9DUFVTXTsKKwlfX3UzMiByeERyb3BwZWRbTlVNX0NQVVNdOworCV9fdTMyIHJ4RGVsaXZlcmVkW05VTV9DUFVTXTsKKwlfX3UzMiByeFJlZnVzZWRbTlVNX0NQVVNdOworCisJLyogdHhmbG93IHN0YXRzICovCisJYm9vbCAgICAgaXNfdHhmbG93X3BhdXNlZDsKKwlfX3UzMiAgICB0eGZsb3dfcGF1c2VfY250OworCV9fdTMyICAgIHR4Zmxvd191bnBhdXNlX2NudDsKKwlfX3UzMiAgICB0eGZsb3dfdGltZXJfY250OworfSBoZGRfdHhfcnhfc3RhdHNfdDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKK3R5cGVkZWYgc3RydWN0IGhkZF9wbWZfc3RhdHNfcyB7CisJdWludDhfdCBudW1VbnByb3REZWF1dGhSeDsKKwl1aW50OF90IG51bVVucHJvdERpc2Fzc29jUng7Cit9IGhkZF9wbWZfc3RhdHNfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBoZGRfc3RhdHNfcyB7CisJdENzclN1bW1hcnlTdGF0c0luZm8gc3VtbWFyeV9zdGF0OworCXRDc3JHbG9iYWxDbGFzc0FTdGF0c0luZm8gQ2xhc3NBX3N0YXQ7CisJdENzckdsb2JhbENsYXNzQlN0YXRzSW5mbyBDbGFzc0Jfc3RhdDsKKwl0Q3NyR2xvYmFsQ2xhc3NDU3RhdHNJbmZvIENsYXNzQ19zdGF0OworCXRDc3JHbG9iYWxDbGFzc0RTdGF0c0luZm8gQ2xhc3NEX3N0YXQ7CisJdENzclBlclN0YVN0YXRzSW5mbyBwZXJTdGFTdGF0czsKKwloZGRfdHhfcnhfc3RhdHNfdCBoZGRUeFJ4U3RhdHM7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWhkZF9wbWZfc3RhdHNfdCBoZGRQbWZTdGF0czsKKyNlbmRpZgorfSBoZGRfc3RhdHNfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlIRERfUk9BTV9TVEFURV9OT05FLAorCisJLyogSXNzdWluZyBhIGRpc2Nvbm5lY3QgZHVlIHRvIHRyYW5zaXRpb24gaW50byBsb3cgcG93ZXIgc3RhdGVzLiAqLworCUhERF9ST0FNX1NUQVRFX0RJU0NPTk5FQ1RJTkdfUE9XRVIsCisKKwkvKiBtb3ZlIHRvIHRoaXMgc3RhdGUgd2hlbiBIREQgc2V0cyBhIGtleSB3aXRoIFNNRS9DU1IuICBOb3RlIHRoaXMgaXMgKi8KKwkvKiBhbiBpbXBvcnRhbnQgc3RhdGUgdG8gZ2V0IHJpZ2h0IGJlY2F1c2Ugd2Ugd2lsbCBnZXQgY2FsbHMgaW50byBvdXIgU01FICovCisJLyogY2FsbGJhY2sgcm91dGluZSBmb3IgU2V0S2V5IGFjdGl2aXR5IHRoYXQgd2UgZGlkIG5vdCBpbml0aWF0ZSEgKi8KKwlIRERfUk9BTV9TVEFURV9TRVRUSU5HX0tFWSwKK30gSEREX1JPQU1fU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IHJvYW1pbmdfaW5mb19zIHsKKwlIRERfUk9BTV9TVEFURSByb2FtaW5nU3RhdGU7CisJY2RmX2V2ZW50X3Qgcm9hbWluZ0V2ZW50OworCisJdFNpck1hY0FkZHIgYnNzaWQ7CisJdFNpck1hY0FkZHIgcGVlck1hYzsKKwl1aW50MzJfdCByb2FtSWQ7CisJZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1czsKKwlib29sIGRlZmVyS2V5Q29tcGxldGU7CisKK30gcm9hbWluZ19pbmZvX3Q7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorLyogRGVmaW5lIFdBUEkgbWFjcm9zIGZvciBMZW5ndGgsIEJLSUQgY291bnQgZXRjKi8KKyNkZWZpbmUgTUFYX1dQSV9LRVlfTEVOR1RIICAgIDE2CisjZGVmaW5lIE1BWF9OVU1fUE4gICAgICAgICAgICAxNgorI2RlZmluZSBNQUNfQUREUl9MRU4gICAgICAgICAgIDYKKyNkZWZpbmUgTUFYX0FERFJfSU5ERVggICAgICAgIDEyCisjZGVmaW5lIE1BWF9OVU1fQUtNX1NVSVRFUyAgICAxNgorI2RlZmluZSBNQVhfTlVNX1VOSV9TVUlURVMgICAgMTYKKyNkZWZpbmUgTUFYX05VTV9CS0lEUyAgICAgICAgIDE2CisKKy8qKiBXQVBJIEFVVEggbW9kZSBkZWZpbml0aW9uICovCitlbnVtIF9XQVBJQXV0aE1vZGUgeworCVdBUElfQVVUSF9NT0RFX09QRU4gPSAwLAorCVdBUElfQVVUSF9NT0RFX1BTSyA9IDEsCisJV0FQSV9BVVRIX01PREVfQ0VSVAorfSBfX3BhY2tlZDsKK3R5cGVkZWYgZW51bSBfV0FQSUF1dGhNb2RlIFdBUElBdXRoTW9kZTsKKworLyoqIFdBUEkgV29yayBtb2RlIHN0cnVjdHVyZSBkZWZpbml0aW9uICovCisjZGVmaW5lICAgV1pDX09SSUdJTkFMICAgICAgMAorI2RlZmluZSAgIFdBUElfRVhURU5USU9OICAgIDEKKworc3RydWN0IF9XQVBJX0ZVTkNUSU9OX01PREUgeworCXVuc2lnbmVkIGNoYXIgd2FwaU1vZGU7Cit9IF9fcGFja2VkOworCit0eXBlZGVmIHN0cnVjdCBfV0FQSV9GVU5DVElPTl9NT0RFIFdBUElfRlVOQ1RJT05fTU9ERTsKKwordHlwZWRlZiBzdHJ1Y3QgX1dBUElfQktJRCB7CisJdWludDhfdCBia2lkWzE2XTsKK30gV0FQSV9CS0lELCAqcFdBUElfQktJRDsKKworLyoqIFdBUEkgQXNzb2NpYXRpb24gaW5mb3JtYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24gKi8KK3N0cnVjdCBfV0FQSV9Bc3NvY0luZm8geworCXVpbnQ4X3QgZWxlbWVudElEOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQxNl90IHZlcnNpb247CisJdWludDE2X3QgYWttU3VpdGVDb3VudDsKKwl1aW50MzJfdCBha21TdWl0ZVtNQVhfTlVNX0FLTV9TVUlURVNdOworCXVpbnQxNl90IHVuaWNhc3RTdWl0ZUNvdW50OworCXVpbnQzMl90IHVuaWNhc3RTdWl0ZVtNQVhfTlVNX1VOSV9TVUlURVNdOworCXVpbnQzMl90IG11bHRpY2FzdFN1aXRlOworCXVpbnQxNl90IHdhcGlDYWJpbGl0eTsKKwl1aW50MTZfdCBia2lkQ291bnQ7CisJV0FQSV9CS0lEIGJraWRMaXN0W01BWF9OVU1fQktJRFNdOworfSBfX3BhY2tlZDsKKwordHlwZWRlZiBzdHJ1Y3QgX1dBUElfQXNzb2NJbmZvIFdBUElfQXNzb2NJbmZvOwordHlwZWRlZiBzdHJ1Y3QgX1dBUElfQXNzb2NJbmZvICpwV0FQSV9JRUFzc29jSW5mbzsKKworLyoqIFdBUEkgS0VZIFR5cGUgZGVmaW5pdGlvbiAqLworZW51bSBfV0FQSUtleVR5cGUgeworCVBBSVJXSVNFX0tFWSwgICAgICAgICAgIC8qIDAgKi8KKwlHUk9VUF9LRVkgICAgICAgICAgICAgICAvKiAxICovCit9IF9fcGFja2VkOwordHlwZWRlZiBlbnVtIF9XQVBJS2V5VHlwZSBXQVBJS2V5VHlwZTsKKworLyoqIFdBUEkgS0VZIERpcmVjdGlvbiBkZWZpbml0aW9uICovCitlbnVtIF9LRVlfRElSRUNUSU9OIHsKKwlOb25lLAorCVJ4LAorCVR4LAorCVJ4X1R4Cit9IF9fcGFja2VkOworCit0eXBlZGVmIGVudW0gX0tFWV9ESVJFQ1RJT04gV0FQSV9LRVlfRElSRUNUSU9OOworCisvKiBXQVBJIEtFWSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLworc3RydWN0IFdMQU5fV0FQSV9LRVkgeworCVdBUElLZXlUeXBlIGtleVR5cGU7CisJV0FQSV9LRVlfRElSRUNUSU9OIGtleURpcmVjdGlvbjsgICAgICAgIC8qcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwl1aW50OF90IGtleUlkOworCXVpbnQ4X3QgYWRkckluZGV4W01BWF9BRERSX0lOREVYXTsgICAgICAvKnJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJaW50IHdwaWVrTGVuOworCXVpbnQ4X3Qgd3BpZWtbTUFYX1dQSV9LRVlfTEVOR1RIXTsKKwlpbnQgd3BpY2tMZW47CisJdWludDhfdCB3cGlja1tNQVhfV1BJX0tFWV9MRU5HVEhdOworCXVpbnQ4X3QgcG5bTUFYX05VTV9QTl07IC8qcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK30gX19wYWNrZWQ7CisKK3R5cGVkZWYgc3RydWN0IFdMQU5fV0FQSV9LRVkgV0xBTl9XQVBJX0tFWTsKK3R5cGVkZWYgc3RydWN0IFdMQU5fV0FQSV9LRVkgKnBXTEFOX1dBUElfS0VZOworCisjZGVmaW5lIFdQQV9HRVRfTEUxNihhKSAoKHUxNikgKCgoYSlbMV0gPDwgOCkgfCAoYSlbMF0pKQorI2RlZmluZSBXUEFfR0VUX0JFMjQoYSkgKCh1MzIpICgoYVswXSA8PCAxNikgfCAoYVsxXSA8PCA4KSB8IGFbMl0pKQorI2RlZmluZSBXTEFOX0VJRF9XQVBJIDY4CisjZGVmaW5lIFdBUElfUFNLX0FLTV9TVUlURSAgMHgwMjcyMTQwMAorI2RlZmluZSBXQVBJX0NFUlRfQUtNX1NVSVRFIDB4MDE3MjE0MDAKKworLyogV0FQSSBCS0lEIExpc3Qgc3RydWN0dXJlIGRlZmluaXRpb24gKi8KK3N0cnVjdCBfV0xBTl9CS0lEX0xJU1QgeworCXVpbnQzMl90IGxlbmd0aDsKKwl1aW50MzJfdCBCS0lEQ291bnQ7CisJV0FQSV9CS0lEIEJLSURbMV07Cit9IF9fcGFja2VkOworCit0eXBlZGVmIHN0cnVjdCBfV0xBTl9CS0lEX0xJU1QgV0xBTl9CS0lEX0xJU1Q7Cit0eXBlZGVmIHN0cnVjdCBfV0xBTl9CS0lEX0xJU1QgKnBXTEFOX0JLSURfTElTVDsKKworLyogV0FQSSBJbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLworc3RydWN0IGhkZF93YXBpX2luZm9fcyB7CisJdWludDMyX3QgbldhcGlNb2RlOworCWJvb2wgZklzV2FwaVN0YTsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGNhY2hlZE1hY0FkZHI7CisJdWludDhfdCB3YXBpQXV0aE1vZGU7Cit9IF9fcGFja2VkOwordHlwZWRlZiBzdHJ1Y3QgaGRkX3dhcGlfaW5mb19zIGhkZF93YXBpX2luZm9fdDsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCit0eXBlZGVmIHN0cnVjdCBiZWFjb25fZGF0YV9zIHsKKwl1OCAqaGVhZDsKKwl1OCAqdGFpbDsKKwl1OCAqcHJvYmVyZXNwX2llczsKKwl1OCAqYXNzb2NyZXNwX2llczsKKwlpbnQgaGVhZF9sZW47CisJaW50IHRhaWxfbGVuOworCWludCBwcm9iZXJlc3BfaWVzX2xlbjsKKwlpbnQgYXNzb2NyZXNwX2llc19sZW47CisJaW50IGR0aW1fcGVyaW9kOworfSBiZWFjb25fZGF0YV90OworCisvKiBNQUlOVEFJTiAxIC0gMSBDT1JSRVNQT05ERU5DRSBXSVRIIHRDREZfQ09OX01PREUgKi8KK3R5cGVkZWYgZW51bSBkZXZpY2VfbW9kZSB7CisJV0xBTl9IRERfSU5GUkFfU1RBVElPTiwKKwlXTEFOX0hERF9TT0ZUQVAsCisJV0xBTl9IRERfUDJQX0NMSUVOVCwKKwlXTEFOX0hERF9QMlBfR08sCisJLyogTW9kZSA1IGlzIHJlc2VydmVkIGZvciBGVE0gKi8KKwlXTEFOX0hERF9GVE0gPSA1LAorCVdMQU5fSEREX0lCU1MsCisJV0xBTl9IRERfUDJQX0RFVklDRSwKKwlXTEFOX0hERF9PQ0IKK30gZGV2aWNlX21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHJlbV9vbl9jaGFubmVsX3JlcXVlc3RfdHlwZSB7CisJUkVNQUlOX09OX0NIQU5ORUxfUkVRVUVTVCwKKwlPRkZfQ0hBTk5FTF9BQ1RJT05fVFgsCit9IHJlbV9vbl9jaGFubmVsX3JlcXVlc3RfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCBhY3Rpb25fcGt0X2J1ZmZlciB7CisJdWludDhfdCAqZnJhbWVfcHRyOworCXVpbnQzMl90IGZyYW1lX2xlbmd0aDsKKwl1aW50MTZfdCBmcmVxOworfSBhY3Rpb25fcGt0X2J1ZmZlcl90OworCit0eXBlZGVmIHN0cnVjdCBoZGRfcmVtYWluX29uX2NoYW5fY3R4IHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBjaGFuOworCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbl90eXBlOworCXVuc2lnbmVkIGludCBkdXJhdGlvbjsKKwl1NjQgY29va2llOworCXJlbV9vbl9jaGFubmVsX3JlcXVlc3RfdHlwZV90IHJlbV9vbl9jaGFuX3JlcXVlc3Q7CisJY2RmX21jX3RpbWVyX3QgaGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyOworCWFjdGlvbl9wa3RfYnVmZmVyX3QgYWN0aW9uX3BrdF9idWZmOworCWJvb2wgaGRkX3JlbWFpbl9vbl9jaGFuX2NhbmNlbF9pbl9wcm9ncmVzczsKKwl1aW50MzJfdCBzY2FuX2lkOworfSBoZGRfcmVtYWluX29uX2NoYW5fY3R4X3Q7CisKKy8qIFJvQyBSZXF1ZXN0IGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBoZGRfcm9jX3JlcSB7CisJY2RmX2xpc3Rfbm9kZV90IG5vZGU7ICAgLyogTVVTVCBiZSBmaXJzdCBlbGVtZW50ICovCisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJaGRkX3JlbWFpbl9vbl9jaGFuX2N0eF90ICpwUmVtYWluQ2hhbkN0eDsKK30gaGRkX3JvY19yZXFfdDsKKworLyoqCisgKiBzdHJ1Y3QgaGRkX3NjYW5fcmVxIC0gU2NhbiBSZXF1ZXN0IGVudHJ5CisgKiBAbm9kZSA6IExpc3QgZW50cnkgZWxlbWVudAorICogQGFkYXB0ZXI6IEFkYXB0ZXIgYWRkcmVzcworICogQHNjYW5fcmVxdWVzdDogc2NhbiByZXF1ZXN0IGhvbGRlcgorICogQHNjYW5faWQ6IHNjYW4gaWRlbnRpZmllciB1c2VkIGFjcm9zcyBob3N0IGxheWVycyB3aGljaCBpcyBnZW5lcmF0ZWQgYXQgV01JCisgKiBAY29va2llOiBzY2FuIHJlcXVlc3QgaWRlbnRpZmllciBzZW50IHRvIHVzZXJzcGFjZQorICogQHNvdXJjZTogc2NhbiByZXF1ZXN0IG9yaWdpbmF0b3IgKE5ML1ZlbmRvciBzY2FuKQorICogQHRpbWVzdGFtcDogc2NhbiByZXF1ZXN0IHRpbWVzdGFtcAorICoKKyAqIFNjYW4gcmVxdWVzdCBsaW5rZWQgbGlzdCBlbGVtZW50CisgKi8KK3N0cnVjdCBoZGRfc2Nhbl9yZXEgeworCWNkZl9saXN0X25vZGVfdCBub2RlOworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXF1ZXN0OworCXVpbnQzMl90IHNjYW5faWQ7CisJdWludDhfdCBzb3VyY2U7CisJdWludDMyX3QgdGltZXN0YW1wOworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlIRERfSURMRSwKKwlIRERfUERfUkVRX0FDS19QRU5ESU5HLAorCUhERF9HT19ORUdfUkVRX0FDS19QRU5ESU5HLAorCUhERF9JTlZBTElEX1NUQVRFLAorfSBlUDJQQWN0aW9uRnJhbWVTdGF0ZTsKKwordHlwZWRlZiBlbnVtIHsKKwlXTEFOX0hERF9HT19ORUdfUkVRLAorCVdMQU5fSEREX0dPX05FR19SRVNQLAorCVdMQU5fSEREX0dPX05FR19DTkYsCisJV0xBTl9IRERfSU5WSVRBVElPTl9SRVEsCisJV0xBTl9IRERfSU5WSVRBVElPTl9SRVNQLAorCVdMQU5fSEREX0RFVl9ESVNfUkVRLAorCVdMQU5fSEREX0RFVl9ESVNfUkVTUCwKKwlXTEFOX0hERF9QUk9WX0RJU19SRVEsCisJV0xBTl9IRERfUFJPVl9ESVNfUkVTUCwKK30gdEFjdGlvbkZybVR5cGU7CisKK3R5cGVkZWYgc3RydWN0IGhkZF9jZmc4MDIxMV9zdGF0ZV9zIHsKKwl1aW50MTZfdCBjdXJyZW50X2ZyZXE7CisJdTY0IGFjdGlvbl9jb29raWU7CisJdWludDhfdCAqYnVmOworCXNpemVfdCBsZW47CisJaGRkX3JlbWFpbl9vbl9jaGFuX2N0eF90ICpyZW1haW5fb25fY2hhbl9jdHg7CisJc3RydWN0IG11dGV4IHJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrOworCWVQMlBBY3Rpb25GcmFtZVN0YXRlIGFjdGlvbkZybVN0YXRlOworfSBoZGRfY2ZnODAyMTFfc3RhdGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlIRERfU1NSX05PVF9SRVFVSVJFRCwKKwlIRERfU1NSX1JFUVVJUkVELAorCUhERF9TU1JfRElTQUJMRUQsCit9IGVfaGRkX3Nzcl9yZXF1aXJlZDsKKworc3RydWN0IGhkZF9zdGF0aW9uX2N0eCB7CisJLyoqIEhhbmRsZSB0byB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIFN0YXRlICovCisJaGRkX3dleHRfc3RhdGVfdCBXZXh0U3RhdGU7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHg7CisjZW5kaWYKKworCS8qKkNvbm5lY3Rpb24gaW5mb3JtYXRpb24qLworCWNvbm5lY3Rpb25faW5mb190IGNvbm5faW5mbzsKKworCXJvYW1pbmdfaW5mb190IHJvYW1faW5mbzsKKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCWludCBmdF9jYXJyaWVyX29uOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKwl0U2lyR3RrT2ZmbG9hZFBhcmFtcyBndGtPZmZsb2FkUmVxUGFyYW1zOworI2VuZGlmCisJLypJbmNyZW1lbnQgd2hlbmV2ZXIgaWJzcyBOZXcgcGVlciBqb2lucyBhbmQgZGVwYXJ0cyB0aGUgbmV0d29yayAqLworCWludCBpYnNzX3N0YV9nZW5lcmF0aW9uOworCisJLyogSW5kaWNhdGlvbiBvZiB3ZXAvd3BhLW5vbmUga2V5cyBpbnN0YWxsYXRpb24gKi8KKwlib29sIGlic3NfZW5jX2tleV9pbnN0YWxsZWQ7CisKKwkvKlNhdmUgdGhlIHdlcC93cGEtbm9uZSBrZXlzICovCisJdENzclJvYW1TZXRLZXkgaWJzc19lbmNfa2V5OworCisJYm9vbCBoZGRfUmVhc3NvY1NjZW5hcmlvOworCisJLyogU1RBIGN0eCBkZWJ1ZyB2YXJpYWJsZXMgKi8KKwlpbnQgc3RhRGVidWdTdGF0ZTsKK307CisKKyNkZWZpbmUgQlNTX1NUT1AgICAgMAorI2RlZmluZSBCU1NfU1RBUlQgICAxCit0eXBlZGVmIHN0cnVjdCBoZGRfaG9zdGFwZF9zdGF0ZV9zIHsKKwlpbnQgYnNzU3RhdGU7CisJY2RmX2V2ZW50X3QgY2RmX2V2ZW50OworCWNkZl9ldmVudF90IGNkZl9zdG9wX2Jzc19ldmVudDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJYm9vbCBiQ29tbWl0OworCit9IGhkZF9ob3N0YXBkX3N0YXRlX3Q7CisKKy8qCisgKiBQZXIgc3RhdGlvbiBzdHJ1Y3R1cmUga2VwdCBpbiBIREQgZm9yIG11bHRpcGxlIHN0YXRpb24gc3VwcG9ydCBmb3IgU29mdEFQCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVGhlIHN0YXRpb24gZW50cnkgaXMgdXNlZCBvciBub3QgICovCisJYm9vbCBpc1VzZWQ7CisKKwkvKiogU3RhdGlvbiBJRCByZXBvcnRlZCBiYWNrIGZyb20gSEFMICh0aHJvdWdoIFNBUCkuIEJyb2FkY2FzdAorCSAqICB1c2VzIHN0YXRpb24gSUQgemVybyBieSBkZWZhdWx0IGluIGJvdGggbGlicmEgYW5kIHZvbGFucy4gKi8KKwl1aW50OF90IHVjU1RBSWQ7CisKKwkvKiogTUFDIGFkZHJlc3Mgb2YgdGhlIHN0YXRpb24gKi8KKwlzdHJ1Y3QgY2RmX21hY19hZGRyIG1hY0FkZHJTVEE7CisKKwkvKiogQ3VycmVudCBTdGF0aW9uIHN0YXRlIHNvIEhERCBrbm93cyBob3cgdG8gZGVhbCB3aXRoIHBhY2tldAorCSAqICBxdWV1ZS4gTW9zdCByZWNlbnQgc3RhdGVzIHVzZWQgdG8gY2hhbmdlIFRMU0hJTSBTVEEgc3RhdGUgKi8KKwllbnVtIG9sX3R4cnhfcGVlcl9zdGF0ZSB0bFNUQVN0YXRlOworCisJLyoqIFRyYWNrIFFvUyBzdGF0dXMgb2Ygc3RhdGlvbiAqLworCWJvb2wgaXNRb3NFbmFibGVkOworCisJLyoqIFRoZSBzdGF0aW9uIGVudHJ5IGZvciB3aGljaCBEZWF1dGggaXMgaW4gcHJvZ3Jlc3MgICovCisJYm9vbCBpc0RlYXV0aEluUHJvZ3Jlc3M7Cit9IGhkZF9zdGF0aW9uX2luZm9fdDsKKworc3RydWN0IGhkZF9hcF9jdHhfcyB7CisJaGRkX2hvc3RhcGRfc3RhdGVfdCBIb3N0YXBkU3RhdGU7CisKKwkvKiBNZW1vcnkgZGlmZmVyZW50aWF0aW9uIG1vZGUgaXMgZW5hYmxlZCAqLworCS8qIHVpbnQxNl90IHVNZW1vcnlEaWZmVGhyZXNob2xkOyAqLworCS8qIHVpbnQ4X3QgdU51bUFjdGl2ZUFDOyAqLworCS8qIHVpbnQ4X3QgdUFjdGl2ZUFDTWFzazsgKi8KKworCS8qKiBQYWNrZXQgQ291bnQgdG8gdXBkYXRlIHVOdW1BY3RpdmVBQyBhbmQgdUFjdGl2ZUFDTWFzayAqLworCS8qIHVpbnQxNl90IHVVcGRhdGVQa3RDb3VudDsgKi8KKworCS8qKiBTdGF0aW9uIElEIGFzc2lnbmVkIGFmdGVyIEJTUyBzdGFydHMgKi8KKwl1aW50OF90IHVCQ1N0YUlkOworCisJdWludDhfdCB1UHJpdmFjeTsgICAgICAgLyogVGhlIHByaXZhY3kgYml0cyBvZiBjb25maWd1cmF0aW9uICovCisKKwl0U2lyV1BTUEJDUHJvYmVSZXEgV1BTUEJDUHJvYmVSZXE7CisKKwl0c2FwX0NvbmZpZ190IHNhcENvbmZpZzsKKworCXN0cnVjdCBzZW1hcGhvcmUgc2VtV3BzUEJDT3ZlcmxhcEluZDsKKworCWJvb2wgYXBEaXNhYmxlSW50cmFCc3NGd2Q7CisKKwljZGZfbWNfdGltZXJfdCBoZGRfYXBfaW5hY3Rpdml0eV90aW1lcjsKKworCXVpbnQ4X3Qgb3BlcmF0aW5nQ2hhbm5lbDsKKworCWJvb2wgdUlzQXV0aGVudGljYXRlZDsKKworCWVDc3JFbmNyeXB0aW9uVHlwZSB1Y0VuY3J5cHRUeXBlOworCisJLyogVGhpcyB3aWxsIHBvaW50IHRvIGdyb3VwIGtleSBkYXRhLCBpZiBpdCBpcyByZWNlaXZlZCBiZWZvcmUgc3RhcnQgYnNzLiAqLworCXRDc3JSb2FtU2V0S2V5IGdyb3VwS2V5OworCS8qIFRoaXMgd2lsbCBoYXZlIFdFUCBrZXkgZGF0YSwgaWYgaXQgaXMgcmVjZWl2ZWQgYmVmb3JlIHN0YXJ0IGJzcyAqLworCXRDc3JSb2FtU2V0S2V5IHdlcEtleVtDU1JfTUFYX05VTV9LRVldOworCisJYmVhY29uX2RhdGFfdCAqYmVhY29uOworCisJYm9vbCBiQXBBY3RpdmU7CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCS8qIFNBUCBDb250ZXh0ICovCisJdm9pZCAqc2FwQ29udGV4dDsKKyNlbmRpZgorCWJvb2wgZGZzX2NhY19ibG9ja190eDsKK307CisKK3R5cGVkZWYgc3RydWN0IGhkZF9zY2FuaW5mb19zIHsKKwkvKiBUaGUgc2NhbiBwZW5kaW5nICAqLworCXVpbnQzMl90IG1TY2FuUGVuZGluZzsKKworCS8qIENvdW50ZXIgZm9yIG1TY2FuUGVuZGluZyBzbyB0aGF0IHRoZSBzY2FuIHBlbmRpbmcKKwkgICBlcnJvciBsb2cgaXMgbm90IHByaW50ZWQgZm9yIG1vcmUgdGhhbiA1IHRpbWVzICAgICovCisJdWludDMyX3QgbVNjYW5QZW5kaW5nQ291bnRlcjsKKworCS8qIEFkZGl0aW9uYWwgSUUgZm9yIHNjYW4gKi8KKwl0U2lyQWRkaWUgc2NhbkFkZElFOworCisJLyogU2NhbiBtb2RlICovCisJdFNpclNjYW5UeXBlIHNjYW5fbW9kZTsKKworCS8qIGNvbXBsZXRpb24gdmFyaWFibGUgZm9yIGFib3J0c2NhbiAqLworCXN0cnVjdCBjb21wbGV0aW9uIGFib3J0c2Nhbl9ldmVudF92YXI7CisKK30gaGRkX3NjYW5pbmZvX3Q7CisKKyNkZWZpbmUgV0xBTl9IRERfTUFYX01DX0FERFJfTElTVCAxMAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKK3R5cGVkZWYgc3RydWN0IG11bHRpY2FzdF9hZGRyX2xpc3QgeworCXVpbnQ4X3QgaXNGaWx0ZXJBcHBsaWVkOworCXVpbnQ4X3QgbWNfY250OworCXVpbnQ4X3QgYWRkcltXTEFOX0hERF9NQVhfTUNfQUREUl9MSVNUXVtFVEhfQUxFTl07Cit9IHRfbXVsdGljYXN0X2FkZF9saXN0OworI2VuZGlmCisKKyNkZWZpbmUgV0xBTl9IRERfTUFYX0hJU1RPUllfRU5UUlkJCTEwCisKKy8qKgorICogc3RydWN0IGhkZF9uZXRpZl9xdWV1ZV9zdGF0cyAtIG5ldGlmIHF1ZXVlIG9wZXJhdGlvbiBzdGF0aXN0aWNzCisgKiBAcGF1c2VfY291bnQgLSBwYXVzZSBjb3VudGVyCisgKiBAdW5wYXVzZV9jb3VudCAtIHVucGF1c2UgY291bnRlcgorICovCitzdHJ1Y3QgaGRkX25ldGlmX3F1ZXVlX3N0YXRzIHsKKwl1aW50MTZfdCBwYXVzZV9jb3VudDsKKwl1aW50MTZfdCB1bnBhdXNlX2NvdW50OworfTsKKworLyoqCisgKiBzdHJ1Y3QgaGRkX25ldGlmX3F1ZXVlX2hpc3RvcnkgLSBuZXRpZiBxdWV1ZSBvcGVyYXRpb24gaGlzdG9yeQorICogQHRpbWU6IHRpbWVzdGFtcAorICogQG5ldGlmX2FjdGlvbjogYWN0aW9uIHR5cGUKKyAqIEBuZXRpZl9yZWFzb246IHJlYXNvbiB0eXBlCisgKiBAcGF1c2VfbWFwOiBwYXVzZSBtYXAKKyAqLworc3RydWN0IGhkZF9uZXRpZl9xdWV1ZV9oaXN0b3J5IHsKKwljZGZfdGltZV90IHRpbWU7CisJdWludDE2X3QgbmV0aWZfYWN0aW9uOworCXVpbnQxNl90IG5ldGlmX3JlYXNvbjsKKwl1aW50MzJfdCBwYXVzZV9tYXA7Cit9OworCisKKyNkZWZpbmUgV0xBTl9IRERfQURBUFRFUl9NQUdJQyAweDU3NGM0MTRlICAgICAgIC8qIEFTQ0lJICJXTEFOIiAqLworCisKK3N0cnVjdCBoZGRfYWRhcHRlcl9zIHsKKwl2b2lkICpwSGRkQ3R4OworCisJZGV2aWNlX21vZGVfdCBkZXZpY2VfbW9kZTsKKworCS8qKiBIYW5kbGUgdG8gdGhlIG5ldHdvcmsgZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCS8qKiBJUHY0IG5vdGlmaWVyIGNhbGxiYWNrIGZvciBoYW5kbGluZyBBUlAgb2ZmbG9hZCBvbiBjaGFuZ2UgaW4gSVAgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaXB2NE5vdGlmaWVyV29ya1F1ZXVlOworI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorCS8qKiBJUHY2IG5vdGlmaWVyIGNhbGxiYWNrIGZvciBoYW5kbGluZyBOUyBvZmZsb2FkIG9uIGNoYW5nZSBpbiBJUCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBpcHY2Tm90aWZpZXJXb3JrUXVldWU7CisjZW5kaWYKKworCS8qIFRPRE8gTW92ZSB0aGlzIHRvIHN0YSBDdHggKi8KKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2IHdkZXY7CisJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdDsKKworCS8qKiBvcHMgY2hlY2tzIGlmIE9wcG9ydHVuaXN0aWMgUG93ZXIgU2F2ZSBpcyBFbmFibGUgb3IgTm90CisJICogY3R3IHN0b3JlcyBjdFdpbmRvdyB2YWx1ZSBvbmNlIHdlIHJlY2VpdmUgT3BwcyBjb21tYW5kIGZyb20KKwkgKiB3cGFfc3VwcGxpY2FudCB0aGVuIHVzaW5nIGN0V2luZG93IHZhbHVlIHdlIG5lZWQgdG8gRW5hYmxlCisJICogT3Bwb3J0dW5pc3RpYyBQb3dlciBTYXZlCisJICovCisJdWludDhfdCBvcHM7CisJdWludDMyX3QgY3R3OworCisJLyoqIEN1cnJlbnQgTUFDIEFkZHJlc3MgZm9yIHRoZSBhZGFwdGVyICAqLworCXN0cnVjdCBjZGZfbWFjX2FkZHIgbWFjQWRkcmVzc0N1cnJlbnQ7CisKKwkvKipFdmVudCBGbGFncyovCisJdW5zaWduZWQgbG9uZyBldmVudF9mbGFnczsKKworCS8qKkRldmljZSBUWC9SWCBzdGF0aXN0aWNzKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwkvKiogSEREIHN0YXRpc3RpY3MqLworCWhkZF9zdGF0c190IGhkZF9zdGF0czsKKwkvKiogbGlua3NwZWVkIHN0YXRpc3RpY3MgKi8KKwl0U2lyTGlua1NwZWVkSW5mbyBsc19zdGF0czsKKwkvKipNaWIgaW5mb3JtYXRpb24qLworCXNIZGRNaWJfdCBoZGRfbWliOworCisJdWludDhfdCBzZXNzaW9uSWQ7CisKKwkvKiBDb21wbGV0aW9uIHZhcmlhYmxlIGZvciBzZXNzaW9uIGNsb3NlICovCisJc3RydWN0IGNvbXBsZXRpb24gc2Vzc2lvbl9jbG9zZV9jb21wX3ZhcjsKKworCS8qIENvbXBsZXRpb24gdmFyaWFibGUgZm9yIHNlc3Npb24gb3BlbiAqLworCXN0cnVjdCBjb21wbGV0aW9uIHNlc3Npb25fb3Blbl9jb21wX3ZhcjsKKworCS8qIFRPRE86IG1vdmUgdGhlc2UgdG8gc3RhIGN0eC4gVGhlc2UgbWF5IG5vdCBiZSB1c2VkIGluIEFQICovCisJLyoqIGNvbXBsZXRpb24gdmFyaWFibGUgZm9yIGRpc2Nvbm5lY3QgY2FsbGJhY2sgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBkaXNjb25uZWN0X2NvbXBfdmFyOworCisJLyoqIENvbXBsZXRpb24gb2YgY2hhbmdlIGNvdW50cnkgY29kZSAqLworCXN0cnVjdCBjb21wbGV0aW9uIGNoYW5nZV9jb3VudHJ5X2NvZGU7CisKKwkvKiBjb21wbGV0aW9uIHZhcmlhYmxlIGZvciBMaW5rdXAgRXZlbnQgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBsaW5rdXBfZXZlbnRfdmFyOworCisJLyogY29tcGxldGlvbiB2YXJpYWJsZSBmb3IgY2FuY2VsIHJlbWFpbiBvbiBjaGFubmVsIEV2ZW50ICovCisJc3RydWN0IGNvbXBsZXRpb24gY2FuY2VsX3JlbV9vbl9jaGFuX3ZhcjsKKworCS8qIGNvbXBsZXRpb24gdmFyaWFibGUgZm9yIG9mZiBjaGFubmVsICByZW1haW4gb24gY2hhbm5lbCBFdmVudCAqLworCXN0cnVjdCBjb21wbGV0aW9uIG9mZmNoYW5uZWxfdHhfZXZlbnQ7CisJLyogQ29tcGxldGlvbiB2YXJpYWJsZSBmb3IgYWN0aW9uIGZyYW1lICovCisJc3RydWN0IGNvbXBsZXRpb24gdHhfYWN0aW9uX2NuZl9ldmVudDsKKwkvKiBDb21wbGV0aW9uIHZhcmlhYmxlIGZvciByZW1haW4gb24gY2hhbm5lbCByZWFkeSAqLworCXN0cnVjdCBjb21wbGV0aW9uIHJlbV9vbl9jaGFuX3JlYWR5X2V2ZW50OworCisJc3RydWN0IGNvbXBsZXRpb24gc3RhX2F1dGhvcml6ZWRfZXZlbnQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwlzdHJ1Y3QgY29tcGxldGlvbiB0ZGxzX2FkZF9zdGF0aW9uX2NvbXA7CisJc3RydWN0IGNvbXBsZXRpb24gdGRsc19kZWxfc3RhdGlvbl9jb21wOworCXN0cnVjdCBjb21wbGV0aW9uIHRkbHNfbWdtdF9jb21wOworCXN0cnVjdCBjb21wbGV0aW9uIHRkbHNfbGlua19lc3RhYmxpc2hfcmVxX2NvbXA7CisJQ0RGX1NUQVRVUyB0ZGxzQWRkU3RhU3RhdHVzOworI2VuZGlmCisKKwkvKiBUcmFjayB3aGV0aGVyIHRoZSBsaW5rdXAgaGFuZGxpbmcgaXMgbmVlZGVkICAqLworCWJvb2wgaXNMaW5rVXBTdmNOZWVkZWQ7CisKKwkvKiBNZ210IEZyYW1lcyBUWCBjb21wbGV0aW9uIHN0YXR1cyBjb2RlICovCisJdWludDMyX3QgbWdtdFR4Q29tcGxldGlvblN0YXR1czsKKworCS8qIFdNTSBTdGF0dXMgKi8KKwloZGRfd21tX3N0YXR1c190IGhkZFdtbVN0YXR1czsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUT0RPIC0gUmVtb3ZlIGl0IGxhdGVyCisgKi8KKwkvKiogTXVsdGlwbGUgc3RhdGlvbiBzdXBwb3J0cyAqLworCS8qKiBQZXItc3RhdGlvbiBzdHJ1Y3R1cmUgKi8KKwlzcGlubG9ja190IHN0YUluZm9fbG9jazsgICAgICAgIC8qIFRvIHByb3RlY3QgYWNjZXNzIHRvIHN0YXRpb24gSW5mbyAqLworCWhkZF9zdGF0aW9uX2luZm9fdCBhU3RhSW5mb1tXTEFOX01BWF9TVEFfQ09VTlRdOworCS8qIHVpbnQ4X3QgdU51bUFjdGl2ZVN0YXRpb247ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJaGRkX3dhcGlfaW5mb190IHdhcGlfaW5mbzsKKyNlbmRpZgorCisJaW50OF90IHJzc2k7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0xQU1MKKwlib29sIHJzc2lfc2VuZDsKKyNlbmRpZgorCisJdWludDhfdCBzbnI7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbW9uVHhXb3JrUXVldWU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl90b190eDsKKworCXVuaW9uIHsKKwkJaGRkX3N0YXRpb25fY3R4X3Qgc3RhdGlvbjsKKwkJaGRkX2FwX2N0eF90IGFwOworCX0gc2Vzc2lvbkN0eDsKKworCWhkZF9jZmc4MDIxMV9zdGF0ZV90IGNmZzgwMjExU3RhdGU7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCXRfbXVsdGljYXN0X2FkZF9saXN0IG1jX2FkZHJfbGlzdDsKKyNlbmRpZgorCXVpbnQ4X3QgYWRkcl9maWx0ZXJfcGF0dGVybjsKKworCS8qIE1hZ2ljIGNvb2tpZSBmb3IgYWRhcHRlciBzYW5pdHkgdmVyaWZpY2F0aW9uICovCisJdWludDMyX3QgbWFnaWM7CisJYm9vbCBoaWdoZXJEdGltVHJhbnNpdGlvbjsKKwlib29sIHN1cnZleV9pZHg7CisKKwloZGRfc2NhbmluZm9fdCBzY2FuX2luZm87CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorCXRBbmlUcmFmU3RybU1ldHJpY3MgdHNtU3RhdHM7CisjZW5kaWYKKwkvKiBGbGFnIHRvIGVuc3VyZSBQU0IgaXMgY29uZmlndXJlZCB0aHJvdWdoIGZyYW1ld29yayAqLworCXVpbnQ4X3QgcHNiQ2hhbmdlZDsKKwkvKiBVQVBTRCBwc2IgdmFsdWUgY29uZmlndXJlZCB0aHJvdWdoIGZyYW1ld29yayAqLworCXVpbnQ4X3QgY29uZmlndXJlZFBzYjsKKyNpZmRlZiBJUEFfT0ZGTE9BRAorCXZvaWQgKmlwYV9jb250ZXh0OworI2VuZGlmCisJLyogVXNlIGRlbGF5ZWQgd29yayBmb3IgU2VjIEFQIEFDUyBhcyBQcmkgQVAgU3RhcnR1cCBuZWVkIHRvIGNvbXBsZXRlCisJICogc2luY2UgQ1NSIChQTUFDIFN0cnVjdCkgQ29uZmlnIGlzIHNhbWUgZm9yIGJvdGggQVAKKwkgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFjc19wZW5kaW5nX3dvcms7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2Nhbl9ibG9ja193b3JrOworI2lmZGVmIE1TTV9QTEFURk9STQorCXVuc2lnbmVkIGxvbmcgcHJldl9yeF9wYWNrZXRzOworCXVuc2lnbmVkIGxvbmcgcHJldl90eF9wYWNrZXRzOworCWludCBjb25uZWN0aW9uOworI2VuZGlmCisJYm9vbCBpc19yb2NfaW5wcm9ncmVzczsKKworI2lmZGVmIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MCisJY2RmX21jX3RpbWVyX3QgdHhfZmxvd19jb250cm9sX3RpbWVyOworCWJvb2wgdHhfZmxvd190aW1lcl9pbml0aWFsaXplZDsKKwl1bnNpZ25lZCBpbnQgdHhfZmxvd19sb3dfd2F0ZXJtYXJrOworCXVuc2lnbmVkIGludCB0eF9mbG93X2hpZ2hfd2F0ZXJtYXJrX29mZnNldDsKKyNlbmRpZiAvKiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCAqLworCWJvb2wgb2ZmbG9hZHNfY29uZmlndXJlZDsKKworCS8qIERTQ1AgdG8gVVAgUW9TIE1hcHBpbmcgKi8KKwlzbWVfUW9zV21tVXBUeXBlIGhkZFdtbURzY3BUb1VwTWFwW1dMQU5fSEREX01BWF9EU0NQICsgMV07CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUworCWJvb2wgaXNMaW5rTGF5ZXJTdGF0c1NldDsKKyNlbmRpZgorCXVpbnQ4X3QgbGlua1N0YXR1czsKKworCS8qIHZhcmlhYmxlIGZvciB0ZW1wZXJhdHVyZSBpbiBDZWxzaXVzICovCisJaW50IHRlbXBlcmF0dXJlOworCisJLyogVGltZSBzdGFtcCBmb3IgbGFzdCBjb21wbGV0ZWQgUm9DIHJlcXVlc3QgKi8KKwl2X1RJTUVfdCBsYXN0X3JvY190czsKKworCS8qIFRpbWUgc3RhbXAgZm9yIHN0YXJ0IFJvQyByZXF1ZXN0ICovCisJdl9USU1FX3Qgc3RhcnRfcm9jX3RzOworCisJLyogU3RhdGUgZm9yIHN5bmNocm9ub3VzIE9DQiByZXF1ZXN0cyB0byBXTUkgKi8KKwlzdHJ1Y3Qgc2lyX29jYl9zZXRfY29uZmlnX3Jlc3BvbnNlIG9jYl9zZXRfY29uZmlnX3Jlc3A7CisJc3RydWN0IHNpcl9vY2JfZ2V0X3RzZl90aW1lcl9yZXNwb25zZSBvY2JfZ2V0X3RzZl90aW1lcl9yZXNwOworCXN0cnVjdCBzaXJfZGNjX2dldF9zdGF0c19yZXNwb25zZSAqZGNjX2dldF9zdGF0c19yZXNwOworCXN0cnVjdCBzaXJfZGNjX3VwZGF0ZV9uZGxfcmVzcG9uc2UgZGNjX3VwZGF0ZV9uZGxfcmVzcDsKKworCS8qIE1BQyBhZGRyZXNzZXMgdXNlZCBmb3IgT0NCIGludGVyZmFjZXMgKi8KKwl0U2lyTWFjQWRkciBvY2JfbWFjX2FkZHJlc3NbQ0RGX01BWF9DT05DVVJSRU5DWV9QRVJTT05BXTsKKwlpbnQgb2NiX21hY19hZGRyX2NvdW50OworCisJLyogQklUTUFQIGluZGljYXRpbmcgcGF1c2UgcmVhc29uICovCisJdWludDMyX3QgcGF1c2VfbWFwOworCXNwaW5sb2NrX3QgcGF1c2VfbWFwX2xvY2s7CisKKwl1aW50OF90IGhpc3RvcnlfaW5kZXg7CisJc3RydWN0IGhkZF9uZXRpZl9xdWV1ZV9oaXN0b3J5CisJCSBxdWV1ZV9vcGVyX2hpc3RvcnlbV0xBTl9IRERfTUFYX0hJU1RPUllfRU5UUlldOworCXN0cnVjdCBoZGRfbmV0aWZfcXVldWVfc3RhdHMgcXVldWVfb3Blcl9zdGF0c1tXTEFOX1JFQVNPTl9UWVBFX01BWF07CisJc3RydWN0IGhkZF9scm9fcyBscm9faW5mbzsKK307CisKKyNkZWZpbmUgV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikgKCYocEFkYXB0ZXIpLT5zZXNzaW9uQ3R4LnN0YXRpb24pCisjZGVmaW5lIFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBBZGFwdGVyKSAoJihwQWRhcHRlciktPnNlc3Npb25DdHguYXApCisjZGVmaW5lIFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcikgICgmKHBBZGFwdGVyKS0+c2Vzc2lvbkN0eC5zdGF0aW9uLldleHRTdGF0ZSkKKyNkZWZpbmUgV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikgKChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHgpCisjZGVmaW5lIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSAgKCgoaGRkX2NvbnRleHRfdCAqKShwQWRhcHRlci0+cEhkZEN0eCkpLT5oSGFsKQorI2RlZmluZSBXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihwQWRhcHRlcikgKCYocEFkYXB0ZXIpLT5zZXNzaW9uQ3R4LmFwLkhvc3RhcGRTdGF0ZSkKKyNkZWZpbmUgV0xBTl9IRERfR0VUX0NGR19TVEFURV9QVFIocEFkYXB0ZXIpICAoJihwQWRhcHRlciktPmNmZzgwMjExU3RhdGUpCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorI2RlZmluZSBXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIocEFkYXB0ZXIpIChwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb250ZXh0KQorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKyNkZWZpbmUgV0xBTl9IRERfSVNfVERMU19TVVBQT1JURURfQURBUFRFUihwQWRhcHRlcikgXAorCSgoKFdMQU5fSEREX0lORlJBX1NUQVRJT04gIT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSAmJiBcCisJICAoV0xBTl9IRERfUDJQX0NMSUVOVCAhPSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpKSA/IDAgOiAxKQorI2RlZmluZSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKSBcCisJKChXTEFOX0hERF9JU19URExTX1NVUFBPUlRFRF9BREFQVEVSKHBBZGFwdGVyKSkgPyBcCisJICh0ZGxzQ3R4X3QgKikocEFkYXB0ZXIpLT5zZXNzaW9uQ3R4LnN0YXRpb24ucEhkZFRkbHNDdHggOiBOVUxMKQorI2VuZGlmCisKKy8qIFNldCBtYWMgYWRkcmVzcyBsb2NhbGx5IGFkbWluaXN0ZXJlZCBiaXQgKi8KKyNkZWZpbmUgV0xBTl9IRERfUkVTRVRfTE9DQUxMWV9BRE1JTklTVEVSRURfQklUKG1hY2FkZHIpIChtYWNhZGRyWzBdICY9IDB4RkQpCisKKyNkZWZpbmUgSEREX0RFRkFVTFRfTUNDX1AyUF9RVU9UQSAgICA3MAorI2RlZmluZSBIRERfUkVTRVRfTUNDX1AyUF9RVU9UQSAgICAgIDUwCisKK3R5cGVkZWYgc3RydWN0IGhkZF9hZGFwdGVyX2xpc3Rfbm9kZSB7CisJY2RmX2xpc3Rfbm9kZV90IG5vZGU7ICAgLyogTVVTVCBiZSBmaXJzdCBlbGVtZW50ICovCisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7Cit9IGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90OworCit0eXBlZGVmIHN0cnVjdCBoZGRfcHJpdl9kYXRhX3MgeworCXVpbnQ4X3QgKmJ1ZjsKKwlpbnQgdXNlZF9sZW47CisJaW50IHRvdGFsX2xlbjsKK30gaGRkX3ByaXZfZGF0YV90OworCisjZGVmaW5lICBNQVhfTU9EX0xPR0xFVkVMIDEwCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbmFibGU7CisJdWludDhfdCBkbF90eXBlOworCXVpbnQ4X3QgZGxfcmVwb3J0OworCXVpbnQ4X3QgZGxfbG9nbGV2ZWw7CisJdWludDhfdCBpbmRleDsKKwl1aW50MzJfdCBkbF9tb2RfbG9nbGV2ZWxbTUFYX01PRF9MT0dMRVZFTF07CisKK30gZndfbG9nX2luZm87CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfT0ZGTE9BRF9QQUNLRVRTCisvKioKKyAqIHN0cnVjdCBoZGRfb2ZmbG9hZGVkX3BhY2tldHMgLSByZXF1ZXN0IGlkIHRvIHBhdHRlcm4gaWQgbWFwcGluZworICogQHJlcXVlc3RfaWQ6IHJlcXVlc3QgaWQKKyAqIEBwYXR0ZXJuX2lkOiBwYXR0ZXJuIGlkCisgKgorICovCitzdHJ1Y3QgaGRkX29mZmxvYWRlZF9wYWNrZXRzIHsKKwl1aW50MzJfdCByZXF1ZXN0X2lkOworCXVpbnQ4X3QgIHBhdHRlcm5faWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBoZGRfb2ZmbG9hZGVkX3BhY2tldHNfY3R4IC0gb2ZmbG9hZGVkIHBhY2tldHMgY29udGV4dAorICogQG9wX3RhYmxlOiByZXF1ZXN0IGlkIHRvIHBhdHRlcm4gaWQgdGFibGUKKyAqIEBvcF9sb2NrOiBtdXRleCBsb2NrCisgKi8KK3N0cnVjdCBoZGRfb2ZmbG9hZGVkX3BhY2tldHNfY3R4IHsKKwlzdHJ1Y3QgaGRkX29mZmxvYWRlZF9wYWNrZXRzIG9wX3RhYmxlW01BWE5VTV9QRVJJT0RJQ19UWF9QVFJOU107CisJc3RydWN0IG11dGV4IG9wX2xvY2s7Cit9OworI2VuZGlmCisKKy8qKiBBZGFwdGVyIHN0cnVjdHVyZSBkZWZpbml0aW9uICovCisKK3N0cnVjdCBoZGRfY29udGV4dF9zIHsKKwkvKiogR2xvYmFsIENEUyBjb250ZXh0ICAqLworCXZfQ09OVEVYVF90IHBjZHNfY29udGV4dDsKKworCS8qKiBIQUwgaGFuZGxlLi4uKi8KKwl0SGFsSGFuZGxlIGhIYWw7CisKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5OworCS8qIFRPRE8gUmVtb3ZlIHRoaXMgZnJvbSBoZXJlLiAqLworCisJY2RmX3NwaW5sb2NrX3QgaGRkX2FkYXB0ZXJfbG9jazsKKwljZGZfbGlzdF90IGhkZEFkYXB0ZXJzOyAvKiBMaXN0IG9mIGFkYXB0ZXJzICovCisKKwkvKiBPbmUgcGVyIFNUQTogMSBmb3IgQkNNQ19TVEFfSUQsIDEgZm9yIGVhY2ggU0FQX1NFTEZfU1RBX0lELCAxIGZvciBXRFNfU1RBSUQgKi8KKwloZGRfYWRhcHRlcl90ICpzdGFfdG9fYWRhcHRlcltXTEFOX01BWF9TVEFfQ09VTlQgKyBDREZfTUFYX05PX09GX1NBUF9NT0RFICsgMl07IC8qIE9uZSBwZXIgc3RhLiBGb3IgcXVpY2sgcmVmZXJlbmNlLiAqLworCisJLyoqIFBvaW50ZXIgZm9yIGZpcm13YXJlIGltYWdlIGRhdGEgKi8KKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCisJLyoqIFBvaW50ZXIgZm9yIGNvbmZpZ3VyYXRpb24gZGF0YSAqLworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqY2ZnOworCisJLyoqIFBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnRfZGV2OworCisJLyoqIENvbmZpZyB2YWx1ZXMgcmVhZCBmcm9tIHFjb21fY2ZnLmluaSBmaWxlICovCisJc3RydWN0IGhkZF9jb25maWcgKmNvbmZpZzsKKworCXN0cnVjdCB3bGFuX2hkZF9mdG1fc3RhdHVzIGZ0bTsKKworCS8qIENvbXBsZXRpb24gIHZhcmlhYmxlIHRvIGluZGljYXRlIE1jIFRocmVhZCBTdXNwZW5kZWQgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBtY19zdXNfZXZlbnRfdmFyOworCisJc3RydWN0IGNvbXBsZXRpb24gcmVnX2luaXQ7CisKKwlib29sIGlzTWNUaHJlYWRTdXNwZW5kZWQ7CisKKyNpZmRlZiBRQ0FfQ09ORklHX1NNUAorCWJvb2wgaXNfb2xfcnhfdGhyZWFkX3N1c3BlbmRlZDsKKyNlbmRpZgorCisJdm9sYXRpbGUgYm9vbCBpc0xvZ3BJblByb2dyZXNzOworCisJYm9vbCBpc0xvYWRJblByb2dyZXNzOworCisJYm9vbCBpc1VubG9hZEluUHJvZ3Jlc3M7CisKKwkvKiBUcmFjayB3aGV0aGVyIE1jYXN0L0JjYXN0IEZpbHRlciBpcyBlbmFibGVkLiAqLworCWJvb2wgaGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldDsKKworCWJvb2wgaGRkX3dsYW5fc3VzcGVuZGVkOworCWJvb2wgc3VzcGVuZGVkOworCisJLyogTG9jayB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiBkdXJpbmcgc3RhcnQvc3RvcCBic3MgKi8KKwlzdHJ1Y3QgbXV0ZXggc2FwX2xvY2s7CisKKyNpZmRlZiBXTEFOX0tEX1JFQURZX05PVElGSUVSCisJYm9vbCBrZF9ubF9pbml0OworI2VuZGlmIC8qIFdMQU5fS0RfUkVBRFlfTk9USUZJRVIgKi8KKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCS8qIE9FTSBBcHAgcmVnaXN0ZXJlZCBvciBub3QgKi8KKwlib29sIG9lbV9hcHBfcmVnaXN0ZXJlZDsKKworCS8qIE9FTSBBcHAgUHJvY2VzcyBJRCAqLworCWludDMyX3Qgb2VtX3BpZDsKKyNlbmRpZgorCisJLyoqIENvbmN1cnJlbmN5IFBhcmFtZXRlcnMqLworCXVpbnQzMl90IGNvbmN1cnJlbmN5X21vZGU7CisKKwl1aW50OF90IG5vX29mX29wZW5fc2Vzc2lvbnNbQ0RGX01BWF9OT19PRl9NT0RFXTsKKwl1aW50OF90IG5vX29mX2FjdGl2ZV9zZXNzaW9uc1tDREZfTUFYX05PX09GX01PREVdOworCisJLyoqIFAyUCBEZXZpY2UgTUFDIEFkZHJlc3MgZm9yIHRoZSBhZGFwdGVyICAqLworCXN0cnVjdCBjZGZfbWFjX2FkZHIgcDJwRGV2aWNlQWRkcmVzczsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9IT0xEX1JYX1dBS0VMT0NLCisJY2RmX3dha2VfbG9ja190IHJ4X3dha2VfbG9jazsKKyNlbmRpZgorCisJY2RmX3dha2VfbG9ja190IHNhcF93YWtlX2xvY2s7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWVURExTU3VwcG9ydE1vZGUgdGRsc19tb2RlOworCWVURExTU3VwcG9ydE1vZGUgdGRsc19tb2RlX2xhc3Q7CisJdGRsc0Nvbm5JbmZvX3QgdGRsc0Nvbm5JbmZvW0hERF9NQVhfTlVNX1RETFNfU1RBXTsKKwkvKiBtYXhpbXVtIFRETFMgc3RhdGlvbiBudW1iZXIgYWxsb3dlZCB1cG9uIHJ1bnRpbWUgY29uZGl0aW9uICovCisJdWludDE2X3QgbWF4X251bV90ZGxzX3N0YTsKKwkvKiBURExTIHBlZXIgY29ubmVjdGVkIGNvdW50ICovCisJdWludDE2X3QgY29ubmVjdGVkX3BlZXJfY291bnQ7CisJdGRsc19zY2FuX2NvbnRleHRfdCB0ZGxzX3NjYW5fY3R4dDsKKwkvKiBMb2NrIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIGR1cmluZyBURExTIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgbXV0ZXggdGRsc19sb2NrOworCXVpbnQ4X3QgdGRsc19vZmZfY2hhbm5lbDsKKwl1aW50MTZfdCB0ZGxzX2NoYW5uZWxfb2Zmc2V0OworI2VuZGlmCisKKyNpZmRlZiBJUEFfT0ZGTE9BRAorCXZvaWQgKmhkZF9pcGE7CisJLyogQ0UgcmVzb3VyY2VzICovCisJdWludDMyX3QgY2Vfc3JfYmFzZV9wYWRkcjsKKwl1aW50MzJfdCBjZV9zcl9yaW5nX3NpemU7CisJY2RmX2RtYV9hZGRyX3QgY2VfcmVnX3BhZGRyOworCisJLyogV0xBTiBUWDpJUEEtPldMQU4gKi8KKwl1aW50MzJfdCB0eF9jb21wX3JpbmdfYmFzZV9wYWRkcjsKKwl1aW50MzJfdCB0eF9jb21wX3Jpbmdfc2l6ZTsKKwl1aW50MzJfdCB0eF9udW1fYWxsb2NfYnVmZmVyOworCisJLyogV0xBTiBSWDpXTEFOLT5JUEEgKi8KKwl1aW50MzJfdCByeF9yZHlfcmluZ19iYXNlX3BhZGRyOworCXVpbnQzMl90IHJ4X3JkeV9yaW5nX3NpemU7CisJdWludDMyX3QgcnhfcHJvY19kb25lX2lkeF9wYWRkcjsKKworCS8qIElQQSBVQyBkb29yYmVsbCByZWdpc3RlcnMgcGFkZHIgKi8KKwl1aW50MzJfdCB0eF9jb21wX2Rvb3JiZWxsX3BhZGRyOworCXVpbnQzMl90IHJ4X3JlYWR5X2Rvb3JiZWxsX3BhZGRyOworI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCisKKwkvKiBNQy9CQyBGaWx0ZXIgc3RhdGUgdmFyaWFibGUKKwkgKiBUaGlzIGFsd2F5cyBjb250YWlucyB0aGUgdmFsdWUgdGhhdCBpcyBjdXJyZW50bHkKKwkgKiBjb25maWd1cmVkCisJICogKi8KKwl1aW50OF90IGNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyOworCisJdWludDhfdCBzdXNfcmVzX21jYXN0YmNhc3RfZmlsdGVyOworCisJYm9vbCBzdXNfcmVzX21jYXN0YmNhc3RfZmlsdGVyX3ZhbGlkOworCisJLyogZGVidWdmcyBlbnRyeSAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcGh5OworCisJLyogVXNlIGJlbG93IGxvY2sgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gaXNTY2hlZFNjYW5VcGRhdGVQZW5kaW5nCisJICogc2luY2UgaXQgd2lsbCBiZSBhY2Nlc3NlZCBpbiB0d28gZGlmZmVyZW50IGNvbnRleHRzLgorCSAqLworCXNwaW5sb2NrX3Qgc2NoZWRTY2FuX2xvY2s7CisKKwkvKiBGbGFnIGtlZXBzIHRyYWNrIG9mIHdpcGh5IHN1c3BlbmQvcmVzdW1lICovCisJYm9vbCBpc1dpcGh5U3VzcGVuZGVkOworCisJLyogSW5kaWNhdGVzIGFib3V0IHBlbmRpbmcgc2NoZWRfc2NhbiByZXN1bHRzICovCisJYm9vbCBpc1NjaGVkU2NhblVwZGF0ZVBlbmRpbmc7CisKKyNpZmRlZiBNU01fUExBVEZPUk0KKwkvKiBERFIgYnVzIGJhbmR3aWR0aCBjb21wdXRlIHRpbWVyCisJICovCisJY2RmX21jX3RpbWVyX3QgYnVzX2J3X3RpbWVyOworCWludCBjdXJfdm90ZV9sZXZlbDsKKwlzcGlubG9ja190IGJ1c19id19sb2NrOworCWludCBjdXJfcnhfbGV2ZWw7CisJdWludDY0X3QgcHJldl9yeDsKKyNlbmRpZgorCS8qIFZIVDgwIGFsbG93ZWQgKi8KKwlib29sIGlzVkhUODBBbGxvd2VkOworCisJc3RydWN0IGNvbXBsZXRpb24gcmVhZHlfdG9fc3VzcGVuZDsKKwkvKiBkZWZpbmluZyB0aGUgc29sdXRpb24gdHlwZSAqLworCXVpbnQzMl90IHRhcmdldF90eXBlOworCisJLyogZGVmaW5pbmcgdGhlIGZpcm13YXJlIHZlcnNpb24gKi8KKwl1aW50MzJfdCB0YXJnZXRfZndfdmVyc2lvbjsKKwl1aW50MzJfdCBkZnNfcmFkYXJfZm91bmQ7CisKKwkvKiBkZWZpbmluZyB0aGUgY2hpcC9yb20gdmVyc2lvbiAqLworCXVpbnQzMl90IHRhcmdldF9od192ZXJzaW9uOworCS8qIGRlZmluaW5nIHRoZSBjaGlwL3JvbSByZXZpc2lvbiAqLworCXVpbnQzMl90IHRhcmdldF9od19yZXZpc2lvbjsKKwkvKiBjaGlwL3JvbSBuYW1lICovCisJY29uc3QgY2hhciAqdGFyZ2V0X2h3X25hbWU7CisJc3RydWN0IHJlZ3VsYXRvcnkgcmVnOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAorCXVpbnQxNl90IHVuc2FmZV9jaGFubmVsX2NvdW50OworCXVpbnQxNl90IHVuc2FmZV9jaGFubmVsX2xpc3RbTlVNXzIwTUhaX1JGX0NIQU5ORUxTXTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgKi8KKworCXVpbnQ4X3QgbWF4X2ludGZfY291bnQ7CisJdWludDhfdCBjdXJyZW50X2ludGZfY291bnQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0xQU1MKKwl1aW50OF90IGxwc3Nfc3VwcG9ydDsKKyNlbmRpZgorCXVpbnQ4X3QgYXBfYXJwbnNfc3VwcG9ydDsKKwl0U2lyU2NhblR5cGUgaW9jdGxfc2Nhbl9tb2RlOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisJY2RmX3dvcmtfdCBzdGFfYXBfaW50Zl9jaGVja193b3JrOworI2VuZGlmCisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgIHNhcF9zdGFydF93b3JrOworCWJvb2wgaXNfc2FwX3Jlc3RhcnRfcmVxdWlyZWQ7CisJYm9vbCBpc19zdGFfY29ubmVjdGlvbl9wZW5kaW5nOworCXNwaW5sb2NrX3Qgc2FwX3VwZGF0ZV9pbmZvX2xvY2s7CisJc3BpbmxvY2tfdCBzdGFfdXBkYXRlX2luZm9fbG9jazsKKworCXVpbnQ4X3QgZGV2X2Rmc19jYWNfc3RhdHVzOworCisJYm9vbCBidENvZXhNb2RlU2V0OworI2lmZGVmIEZFQVRVUkVfR1JFRU5fQVAKKwlzdHJ1Y3QgaGRkX2dyZWVuX2FwX2N0eCAqZ3JlZW5fYXBfY3R4OworI2VuZGlmCisJZndfbG9nX2luZm8gZndfbG9nX3NldHRpbmdzOworI2lmZGVmIEZFQVRVUkVfV0xBTl9BUF9BUF9BQ1NfT1BUSU1JWkUKKwljZGZfbWNfdGltZXJfdCBza2lwX2Fjc19zY2FuX3RpbWVyOworCXVpbnQ4X3Qgc2tpcF9hY3Nfc2Nhbl9zdGF0dXM7CisjZW5kaWYKKworCWNkZl93YWtlX2xvY2tfdCBzYXBfZGZzX3dha2Vsb2NrOworCWF0b21pY190IHNhcF9kZnNfcmVmX2NudDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9FWFRXT1dfU1VQUE9SVAorCWJvb2wgaXNfZXh0d293X2FwcF90eXBlMV9wYXJhbV9zZXQ7CisJYm9vbCBpc19leHR3b3dfYXBwX3R5cGUyX3BhcmFtX3NldDsKKwlib29sIGV4dF93b3dfc2hvdWxkX3N1c3BlbmQ7CisJc3RydWN0IGNvbXBsZXRpb24gcmVhZHlfdG9fZXh0d293OworI2VuZGlmCisKKwkvKiBUaW1lIHNpbmNlIGJvb3QgdXAgdG8gZXh0c2NhbiBzdGFydCAoaW4gbWljcm8gc2Vjb25kcykgKi8KKwl1aW50NjRfdCBleHRfc2Nhbl9zdGFydF9zaW5jZV9ib290OworCXVuc2lnbmVkIGxvbmcgZ19ldmVudF9mbGFnczsKKwkvKiBSb0MgcmVxdWVzdCBxdWV1ZSBhbmQgd29yayAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsgcm9jX3JlcV93b3JrOworCWNkZl9zcGlubG9ja190IGhkZF9yb2NfcmVxX3FfbG9jazsKKwljZGZfbGlzdF90IGhkZF9yb2NfcmVxX3E7CisJY2RmX3NwaW5sb2NrX3QgaGRkX3NjYW5fcmVxX3FfbG9jazsKKwljZGZfbGlzdF90IGhkZF9zY2FuX3JlcV9xOworCXVpbnQ4X3QgbWlyYWNhc3RfdmFsdWU7CisjaWZkZWYgV0xBTl9OU19PRkZMT0FECisJLyogSVB2NiBub3RpZmllciBjYWxsYmFjayBmb3IgaGFuZGxpbmcgTlMgb2ZmbG9hZCBvbiBjaGFuZ2UgaW4gSVAgKi8KKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXB2Nl9ub3RpZmllcjsKKyNlbmRpZgorCS8qIElQdjQgbm90aWZpZXIgY2FsbGJhY2sgZm9yIGhhbmRsaW5nIEFSUCBvZmZsb2FkIG9uIGNoYW5nZSBpbiBJUCAqLworCXN0cnVjdCBub3RpZmllcl9ibG9jayBpcHY0X25vdGlmaWVyOworCisJLyogbnVtYmVyIG9mIHJmIGNoYWlucyBzdXBwb3J0ZWQgYnkgdGFyZ2V0ICovCisJdWludDMyX3QgIG51bV9yZl9jaGFpbnM7CisJLyogSXMgaHRUeFNUQkMgc3VwcG9ydGVkIGJ5IHRhcmdldCAqLworCXVpbnQ4X3QgICBodF90eF9zdGJjX3N1cHBvcnRlZDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfT0ZGTE9BRF9QQUNLRVRTCisJc3RydWN0IGhkZF9vZmZsb2FkZWRfcGFja2V0c19jdHggb3BfY3R4OworI2VuZGlmCisJYm9vbCBtY2NfbW9kZTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUVNRFVNUAorCXVpbnQ4X3QgKmZ3X2R1bXBfbG9jOworCXVpbnQzMl90IGR1bXBfbG9jX3BhZGRyOworCWNkZl9tY190aW1lcl90IG1lbWR1bXBfY2xlYW51cF90aW1lcjsKKwlzdHJ1Y3QgbXV0ZXggbWVtZHVtcF9sb2NrOworCWJvb2wgbWVtZHVtcF9pbl9wcm9ncmVzczsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTUVNRFVNUCAqLworCisJY2RmX21jX3RpbWVyX3QgZGJzX29wcG9ydHVuaXN0aWNfdGltZXI7CisJYm9vbCBjb25uZWN0aW9uX2luX3Byb2dyZXNzOworCXNwaW5sb2NrX3QgY29ubmVjdGlvbl9zdGF0dXNfbG9jazsKKwljZGZfbXV0ZXhfdCBoZGRfY29uY19saXN0X2xvY2s7CisKKwl1aW50MTZfdCBoZGRfdHhyeF9oaXN0X2lkeDsKKwlzdHJ1Y3QgaGRkX3R4X3J4X2hpc3RvZ3JhbSBoZGRfdHhyeF9oaXN0W05VTV9UWF9SWF9ISVNUT0dSQU1dOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbnRhdGlvbgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICit2b2lkIHdsYW5faGRkX2NoZWNrX3N0YV9hcF9jb25jdXJyZW50X2NoX2ludGYodm9pZCAqc3RhX3BBZGFwdGVyKTsKKyNlbmRpZgorCitjb25zdCBjaGFyICpoZGRfZGV2aWNlX21vZGVfdG9fc3RyaW5nKHVpbnQ4X3QgZGV2aWNlX21vZGUpOworCitDREZfU1RBVFVTIGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJCSBoZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqKnBwQWRhcHRlck5vZGUpOworCitDREZfU1RBVFVTIGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSwKKwkJCQloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqKnBOZXh0QWRhcHRlck5vZGUpOworCitDREZfU1RBVFVTIGhkZF9yZW1vdmVfYWRhcHRlcihoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJICAgICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSk7CisKK0NERl9TVEFUVVMgaGRkX3JlbW92ZV9mcm9udF9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJICAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICoqcHBBZGFwdGVyTm9kZSk7CisKK0NERl9TVEFUVVMgaGRkX2FkZF9hZGFwdGVyX2JhY2soaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcEFkYXB0ZXJOb2RlKTsKKworQ0RGX1NUQVRVUyBoZGRfYWRkX2FkYXB0ZXJfZnJvbnQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSk7CisKK2hkZF9hZGFwdGVyX3QgKmhkZF9vcGVuX2FkYXB0ZXIoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdWludDhfdCBzZXNzaW9uX3R5cGUsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgdFNpck1hY0FkZHIgbWFjQWRkciwKKwkJCQl1aW50OF90IHJ0bmxfaGVsZCk7CitDREZfU1RBVFVTIGhkZF9jbG9zZV9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJICAgICB1aW50OF90IHJ0bmxfaGVsZCk7CitDREZfU1RBVFVTIGhkZF9jbG9zZV9hbGxfYWRhcHRlcnMoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCk7CitDREZfU1RBVFVTIGhkZF9zdG9wX2FsbF9hZGFwdGVycyhoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK0NERl9TVEFUVVMgaGRkX3Jlc2V0X2FsbF9hZGFwdGVycyhoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK0NERl9TVEFUVVMgaGRkX3N0YXJ0X2FsbF9hZGFwdGVycyhoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK2hkZF9hZGFwdGVyX3QgKmhkZF9nZXRfYWRhcHRlcl9ieV92ZGV2KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJICAgICAgIHVpbnQzMl90IHZkZXZfaWQpOworaGRkX2FkYXB0ZXJfdCAqaGRkX2dldF9hZGFwdGVyX2J5X21hY2FkZHIoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJICB0U2lyTWFjQWRkciBtYWNBZGRyKTsKK0NERl9TVEFUVVMgaGRkX2luaXRfc3RhdGlvbl9tb2RlKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKK2hkZF9hZGFwdGVyX3QgKmhkZF9nZXRfYWRhcHRlcihoZGRfY29udGV4dF90ICpwSGRkQ3R4LCBkZXZpY2VfbW9kZV90IG1vZGUpOwordm9pZCBoZGRfZGVpbml0X2FkYXB0ZXIoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQlib29sIHJ0bmxfaGVsZCk7CitDREZfU1RBVFVTIGhkZF9zdG9wX2FkYXB0ZXIoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkgICAgY29uc3QgYm9vbCBiQ2xvc2VTZXNzaW9uKTsKK3ZvaWQgaGRkX3NldF9zdGF0aW9uX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqcFdsYW5EZXYpOwordWludDhfdCAqd2xhbl9oZGRfZ2V0X2ludGZfYWRkcihoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK3ZvaWQgd2xhbl9oZGRfcmVsZWFzZV9pbnRmX2FkZHIoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdWludDhfdCAqcmVsZWFzZUFkZHIpOwordWludDhfdCBoZGRfZ2V0X29wZXJhdGluZ19jaGFubmVsKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGRldmljZV9tb2RlX3QgbW9kZSk7CisKK3ZvaWQgaGRkX3NldF9jb25wYXJhbSh1aW50MzJfdCBuZXdQYXJhbSk7Cit0Q0RGX0NPTl9NT0RFIGhkZF9nZXRfY29ucGFyYW0odm9pZCk7CisKK3ZvaWQgaGRkX2Fib3J0X21hY19zY2FuKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJZUNzckFib3J0UmVhc29uIHJlYXNvbik7Cit2b2lkIGhkZF9jbGVhbnVwX2FjdGlvbmZyYW1lKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKKwordm9pZCBjcmRhX3JlZ3VsYXRvcnlfZW50cnlfZGVmYXVsdCh1aW50OF90ICpjb3VudHJ5Q29kZSwgaW50IGRvbWFpbl9pZCk7Cit2b2lkIHdsYW5faGRkX3Jlc2V0X3Byb2JfcnNwaWVzKGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlcik7Cit2b2lkIGhkZF9wcmV2ZW50X3N1c3BlbmQodWludDMyX3QgcmVhc29uKTsKK3ZvaWQgaGRkX2FsbG93X3N1c3BlbmQodWludDMyX3QgcmVhc29uKTsKK3ZvaWQgaGRkX3ByZXZlbnRfc3VzcGVuZF90aW1lb3V0KHVpbnQzMl90IHRpbWVvdXQsIHVpbnQzMl90IHJlYXNvbik7Citib29sIGhkZF9pc19zc3JfcmVxdWlyZWQodm9pZCk7Cit2b2lkIGhkZF9zZXRfc3NyX3JlcXVpcmVkKGVfaGRkX3Nzcl9yZXF1aXJlZCB2YWx1ZSk7CisKK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX3dpcGh5X2NhcHMoc3RydWN0IHdpcGh5ICp3aXBoeSk7CitDREZfU1RBVFVTIGhkZF9zZXRfaWJzc19wb3dlcl9zYXZlX3BhcmFtcyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CitDREZfU1RBVFVTIHdsYW5faGRkX3Jlc3RhcnRfZHJpdmVyKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOwordm9pZCBoZGRfZXhjaGFuZ2VfdmVyc2lvbl9hbmRfY2FwcyhoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK2ludCB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOworYm9vbCBoZGRfaXNfdmFsaWRfbWFjX2FkZHJlc3MoY29uc3QgdWludDhfdCAqcE1hY0FkZHIpOworQ0RGX1NUQVRVUyBoZGRfaXNzdGFfcDJwX2NsaWVudGNvbm5lY3RlZChoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKKwordm9pZCBoZGRfY2hlY2thbmR1cGRhdGVfcGh5bW9kZShoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKKworI2lmZGVmIE1TTV9QTEFURk9STQordm9pZCBoZGRfc3RhcnRfYnVzX2J3X2NvbXB1dGVfdGltZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOwordm9pZCBoZGRfc3RvcF9idXNfYndfY29tcHV0ZV90aW1lcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGhkZF9zdGFydF9idXNfYndfY29tcHV0ZV90aW1lcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZGRfc3RvcF9idXNfYndfY29tcHV0ZXJfdGltZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJcmV0dXJuOworfQorI2VuZGlmCisKK2ludCBoZGRfd2xhbl9zdGFydHVwKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqaGlmX3NjKTsKK3ZvaWQgX19oZGRfd2xhbl9leGl0KHZvaWQpOworaW50IGhkZF93bGFuX25vdGlmeV9tb2RlbV9wb3dlcl9zdGF0ZShpbnQgc3RhdGUpOworI2lmZGVmIFFDQV9IVF8yMDQwX0NPRVgKK2ludCBoZGRfd2xhbl9zZXRfaHQyMDQwX21vZGUoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVpbnQxNl90IHN0YUlkLAorCQkJICAgICBzdHJ1Y3QgY2RmX21hY19hZGRyIG1hY0FkZHJTVEEsIGludCB3aWR0aCk7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCit2b2lkIHdsYW5faGRkX3NlbmRfc3RhdHVzX3BrZyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCSAgICAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4LAorCQkJICAgICAgdWludDhfdCBpc19vbiwgdWludDhfdCBpc19jb25uZWN0ZWQpOwordm9pZCB3bGFuX2hkZF9zZW5kX3ZlcnNpb25fcGtnKHVpbnQzMl90IGZ3X3ZlcnNpb24sCisJCQkgICAgICAgdWludDMyX3QgY2hpcF9pZCwgY29uc3QgY2hhciAqY2hpcF9uYW1lKTsKK3ZvaWQgd2xhbl9oZGRfc2VuZF9hbGxfc2Nhbl9pbnRmX2luZm8oaGRkX2NvbnRleHRfdCAqcEhkZEN0eCk7CisjZW5kaWYKK3ZvaWQgd2xhbl9oZGRfc2VuZF9zdmNfbmxpbmtfbXNnKGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgordm9pZCB3bGFuX2hkZF9hdXRvX3NodXRkb3duX2VuYWJsZShoZGRfY29udGV4dF90ICpoZGRfY3R4LCBib29sIGVuYWJsZSk7CisjZW5kaWYKKworaGRkX2FkYXB0ZXJfdCAqaGRkX2dldF9jb25fc2FwX2FkYXB0ZXIoaGRkX2FkYXB0ZXJfdCAqdGhpc19zYXBfYWRhcHRlciwKKwkJCQkJCQlib29sIGNoZWNrX3N0YXJ0X2Jzcyk7CisKK2Jvb2wgaGRkX2lzXzVnX3N1cHBvcnRlZChoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKKworaW50IHdsYW5faGRkX3NjYW5fYWJvcnQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1NUQVRTX0VYVAordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9zdGF0c19leHRfaW5pdChoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfbGlua19sYXllcl9zdGF0c19pbml0KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOworc3RhdGljIGlubGluZSBib29sIGhkZF9saW5rX2xheWVyX3N0YXRzX3N1cHBvcnRlZCh2b2lkKQoreworCXJldHVybiB0cnVlOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBoZGRfbGlua19sYXllcl9zdGF0c19zdXBwb3J0ZWQodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMgKi8KKwordm9pZCBoZGRfZ2V0X2Z3X3ZlcnNpb24oaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCXVpbnQzMl90ICptYWpvcl9zcGlkLCB1aW50MzJfdCAqbWlub3Jfc3BpZCwKKwkJCXVpbnQzMl90ICpzaWlkLCB1aW50MzJfdCAqY3JtaWQpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX01FTURVTVAKKy8qKgorICogaGRkX2lzX21lbWR1bXBfc3VwcG9ydGVkKCkgLSB0byBjaGVjayBpZiBtZW1kdW1wIGZlYXR1cmUgc3VwcG9ydAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayBpZiBtZW1kdW1wIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGluCisgKiB0aGUgaG9zdCBkcml2ZXIKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgc3VwcG9ydGVkIGFuZCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIGhkZF9pc19tZW1kdW1wX3N1cHBvcnRlZCh2b2lkKQoreworCXJldHVybiB0cnVlOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBoZGRfaXNfbWVtZHVtcF9zdXBwb3J0ZWQodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX01FTURVTVAgKi8KKwordm9pZCBoZGRfdXBkYXRlX21hY2FkZHIoc3RydWN0IGhkZF9jb25maWcgKmNvbmZpZywKKwkJCXN0cnVjdCBjZGZfbWFjX2FkZHIgaHdfbWFjYWRkcik7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQordm9pZCB3bGFuX2hkZF9kaXNhYmxlX3JvYW1pbmcoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOwordm9pZCB3bGFuX2hkZF9lbmFibGVfcm9hbWluZyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisjZW5kaWYKKworQ0RGX1NUQVRVUyBoZGRfcG9zdF9jZHNfZW5hYmxlX2NvbmZpZyhoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKKworQ0RGX1NUQVRVUyBoZGRfYWJvcnRfbWFjX3NjYW5fYWxsX2FkYXB0ZXJzKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworCitDREZfU1RBVFVTIHdsYW5faGRkX2NoZWNrX2N1c3RvbV9jb25fY2hhbm5lbF9ydWxlcyhoZGRfYWRhcHRlcl90ICpzdGFfYWRhcHRlciwKKwkJCQkJCSAgaGRkX2FkYXB0ZXJfdCAqYXBfYWRhcHRlciwKKwkJCQkJCSAgdENzclJvYW1Qcm9maWxlICpyb2FtX3Byb2ZpbGUsCisJCQkJCQkgIHRTY2FuUmVzdWx0SGFuZGxlICpzY2FuX2NhY2hlLAorCQkJCQkJICBib29sICpjb25jdXJyZW50X2Nobmxfc2FtZSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAordm9pZCB3bGFuX2hkZF9zdG9wX3NhcChoZGRfYWRhcHRlcl90ICphcF9hZGFwdGVyKTsKK3ZvaWQgd2xhbl9oZGRfc3RhcnRfc2FwKGhkZF9hZGFwdGVyX3QgKmFwX2FkYXB0ZXIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bGFuX2hkZF9zdG9wX3NhcChoZGRfYWRhcHRlcl90ICphcF9hZGFwdGVyKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHdsYW5faGRkX3N0YXJ0X3NhcChoZGRfYWRhcHRlcl90ICphcF9hZGFwdGVyKSB7fQorI2VuZGlmCitjZGZfd2FrZV9sb2NrX3QgKmhkZF93bGFuX2dldF93YWtlX2xvY2tfcHRyKHZvaWQpOworCisjaWZkZWYgUUNBX0NPTkZJR19TTVAKK2ludCB3bGFuX2hkZF9nZXRfY3B1KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHdsYW5faGRkX2dldF9jcHUodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCit2b2lkIHdsYW5faGRkX3R4cnhfcGF1c2VfY2IodWludDhfdCB2ZGV2X2lkLAorCWVudW0gbmV0aWZfYWN0aW9uX3R5cGUgYWN0aW9uLCBlbnVtIG5ldGlmX3JlYXNvbl90eXBlIHJlYXNvbik7CisKK3ZvaWQgaGRkX3dsYW5fZHVtcF9zdGF0cyhoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgdmFsdWUpOwordm9pZCB3bGFuX2hkZF9kaXNwbGF5X3R4X3J4X2hpc3RvZ3JhbShoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK3ZvaWQgd2xhbl9oZGRfY2xlYXJfdHhfcnhfaGlzdG9ncmFtKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOwordm9pZCB3bGFuX2hkZF9kaXNwbGF5X25ldGlmX3F1ZXVlX2hpc3RvcnkoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCk7Cit2b2lkIHdsYW5faGRkX2NsZWFyX25ldGlmX3F1ZXVlX2hpc3RvcnkoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCk7Citjb25zdCBjaGFyICpoZGRfZ2V0X2Z3cGF0aCh2b2lkKTsKKworI2VuZGlmIC8qIGVuZCAjaWYgIWRlZmluZWQoV0xBTl9IRERfTUFJTl9IKSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX21lbWR1bXAuaCBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9tZW1kdW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmYTgzOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9tZW1kdW1wLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DIDogd2xhbl9oZGRfbWVtZHVtcC5oCisgKgorICogV0xBTiBIb3N0IERldmljZSBEcml2ZXIgZmlsZSBmb3IgZHVtcGluZyBmaXJtd2FyZSBtZW1vcnkKKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFdMQU5fSEREX01FTURVTVBfSCkKKyNkZWZpbmUgV0xBTl9IRERfTUVNRFVNUF9ICisKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUVNRFVNUAorLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX21lbW9yeV9kdW1wIC0gdmFsdWVzIGZvciBtZW1vcnkgZHVtcCBhdHRyaWJ1dGVzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTUVNT1JZX0RVTVBfSU5WQUxJRCAtIEludmFsaWQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SRVFVRVNUX0lEIC0gSW5kaWNhdGUgcmVxdWVzdCBJRAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX01FTURVTVBfU0laRSAtIEluZGljYXRlIHNpemUgb2YgdGhlIG1lbW9yeSBkdW1wCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTUVNT1JZX0RVTVBfQUZURVJfTEFTVCAtIFRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZW51bQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX01FTU9SWV9EVU1QX01BWCAtIG1heCB2YWx1ZSBwb3NzaWJsZSBmb3IgdGhpcyB0eXBlCisgKgorICogZW51bSB2YWx1ZXMgYXJlIHVzZWQgZm9yIE5MIGF0dHJpYnV0ZXMgZm9yIGRhdGEgdXNlZCBieQorICogUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9XSUZJX0xPR0dFUl9NRU1PUllfRFVNUCBzdWIgY29tbWFuZC4KKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9tZW1vcnlfZHVtcCB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTUVNT1JZX0RVTVBfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUkVRVUVTVF9JRCA9IDEsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTUVNRFVNUF9TSVpFID0gMiwKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX01FTU9SWV9EVU1QX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTUVNT1JZX0RVTVBfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTUVNT1JZX0RVTVBfQUZURVJfTEFTVCAtIDEsCit9OworCisvKiBTaXplIG9mIGZ3IG1lbW9yeSBkdW1wIGlzIGVzdGltYXRlZCB0byBiZSAzMjc2ODAgYnl0ZXMgKi8KKyNkZWZpbmUgRldfTUVNX0RVTVBfU0laRSAgICAzMjc2ODAKKyNkZWZpbmUgRldfRFJBTV9MT0NBVElPTiAgICAweDAwNDAwMDAwCisjZGVmaW5lIEZXX01FTV9EVU1QX1JFUV9JRCAgMQorI2RlZmluZSBGV19NRU1fRFVNUF9OVU1fU0VHIDEKKyNkZWZpbmUgTUVNRFVNUF9DT01QTEVUSU9OX1RJTUVfTVMgNTAwMAorCitpbnQgbWVtZHVtcF9pbml0KHZvaWQpOwordm9pZCBtZW1kdW1wX2RlaW5pdCh2b2lkKTsKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfZndfbWVtX2R1bXAoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbWVtZHVtcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbWR1bXBfZGVpbml0KHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdsYW5faGRkX2NmZzgwMjExX2dldF9md19tZW1fZHVtcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQljb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogaWYgIWRlZmluZWQoV0xBTl9IRERfTUVNRFVNUF9IKSovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfbWliLmggYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfbWliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlNDRhOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9taWIuaApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKFdMQU5fSEREX01JQl9oX18pCisjZGVmaW5lIFdMQU5fSEREX01JQl9oX18KKworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorCit0eXBlZGVmIGVudW0geworCWVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZV9pbmZyYXN0cnVjdHVyZSA9IDEsCisJZU1pYl9kb3QxMURlc2lyZWRCc3NUeXBlX2luZGVwZW5kZW50ID0gMiwKKwllTWliX2RvdDExRGVzaXJlZEJzc1R5cGVfaW5mcmFfYXAgPSAzLAorCWVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZV9hbnkgPSA0Cit9IGVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZTsKKworLyoqIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIEJTU0lEcyBzdXBwb3J0ZWQgaW4gdGhlCisgICAgICBkb3QxMURlc2lyZWRCc3NpZExpc3QuICBBbGwgdGhlIGNvZGUgb3BlcmF0ZXMgb2ZmIG9mCisgICAgICB0aGlzIG1heGltdW0gQlNTSUQgbGlzdCBjb3VudC4gICovCisjZGVmaW5lIE1JQl9ET1QxMV9ERVNJUkVEX0JTU0lEX0xJU1RfTUFYX0NPVU5UIDEKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGNFbnRyaWVzOworCisJc3RydWN0IGNkZl9tYWNfYWRkciBCU1NJRHNbTUlCX0RPVDExX0RFU0lSRURfQlNTSURfTElTVF9NQVhfQ09VTlRdOworCit9IHNNaWJfZG90MTFEZXNpcmVkQnNzaWRMaXN0OworCisvKiogVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgU1NJRHMgc3VwcG9ydGVkIGluIHRoZQorICAgICBkb3QxMURlc2lyZWRTc2lkTGlzdC4gIEFsbCB0aGUgY29kZSBvcGVyYXRlcyBvZmYgb2YKKyAgICAgdGhpcyBtYXhpbXVtIFNTSUQgbGlzdCBjb3VudC4gICovCisKKyNkZWZpbmUgTUlCX0RPVDExX0RFU0lSRURfU1NJRF9MSVNUX01BWF9DT1VOVCAxCisKKyNkZWZpbmUgTUlCX0RPVDExX1NTSURfTUFYX0xFTkdUSCAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3Qgc3NpZExlbmd0aDsKKwl1aW50OF90IHNzaWRbTUlCX0RPVDExX1NTSURfTUFYX0xFTkdUSF07CisKK30gc0RvdDExU3NpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGNFbnRyaWVzOworCisJc0RvdDExU3NpZCBTU0lEc1tNSUJfRE9UMTFfREVTSVJFRF9TU0lEX0xJU1RfTUFYX0NPVU5UXTsKKworfSBzTWliX2RvdDExRGVzaXJlZFNzaWRMaXN0OworCit0eXBlZGVmIGVudW0geworCS8qIHRoZXNlIGFyZSBiaXRtYXNrcy4uLi4gKi8KKwllTWliX2RvdDExQXV0b0NvbmZpZ0VuYWJsZWRfTm9uZSA9IDBVLAorCWVNaWJfZG90MTFBdXRvQ29uZmlnRW5hYmxlZF9QaHkgPSAweDAwMDAwMDAxVSwKKwllTWliX2RvdDExQXV0b0NvbmZpZ0VuYWJsZWRfTWFjID0gMHgwMDAwMDAwMlUKK30gZU1pYl9kb3QxMUF1dG9Db25maWdFbmFibGVkOworCisjZGVmaW5lIE1JQl9ET1QxMV9TVVBQT1JURURfUEhZX1RZUEVTX01BWF9DT1VOVCAzCisKK3R5cGVkZWYgZW51bSB0YWdNaWJfZG90MTFQaHlUeXBlIHsKKwllTWliX2RvdDExUGh5VHlwZV8xMWIsCisJZU1pYl9kb3QxMVBoeVR5cGVfMTFhLAorCWVNaWJfZG90MTFQaHlUeXBlXzExZywKKwllTWliX2RvdDExUGh5VHlwZV9hbGwKK30gZU1pYl9kb3QxMVBoeVR5cGU7CisKK3R5cGVkZWYgc3RydWN0IHRhZ01pYl9kb3QxMVN1cHBvcnRlZFBoeVR5cGVzIHsKKwl1aW50MzJfdCBjRW50cmllczsKKwllTWliX2RvdDExUGh5VHlwZSBwaHlUeXBlc1tNSUJfRE9UMTFfU1VQUE9SVEVEX1BIWV9UWVBFU19NQVhfQ09VTlRdOworfSBzTWliX2RvdDExU3VwcG9ydGVkUGh5VHlwZXM7CisKK3R5cGVkZWYgZW51bSB7CisJZU1pYl9EZXZpY2VQb3dlclN0YXRlX0QwLAorCWVNaWJfRGV2aWNlUG93ZXJTdGF0ZV9EMSwKKwllTWliX0RldmljZVBvd2VyU3RhdGVfRDIsCisJZU1pYl9EZXZpY2VQb3dlclN0YXRlX0QzCit9IGVNaWJfRGV2aWNlUG93ZXJTdGF0ZTsKKwordHlwZWRlZiBlbnVtIHsKKwllTWliX2RvdDExTklDUG93ZXJTdGF0ZV9PRkYgPSBmYWxzZSwKKwllTWliX2RvdDExTklDUG93ZXJTdGF0ZV9PTiA9IHRydWUKK30gZU1pYl9kb3QxMU5JQ1Bvd2VyU3RhdGU7CisKK3R5cGVkZWYgZW51bSB7CisJZU1pYl9kb3QxMUhhcmR3YXJlUEhZU3RhdGVfT0ZGID0gZmFsc2UsCisJZU1pYl9kb3QxMUhhcmR3YXJlUEhZU3RhdGVfT04gPSB0cnVlCit9IGVNaWJfZG90MTFIYXJkd2FyZVBIWVN0YXRlOworCit0eXBlZGVmIGVudW0geworCWVNaWJfZG90MTFQb3dlclNhdmluZ0xldmVsX05vbmUsCisJZU1pYl9kb3QxMVBvd2VyU2F2aW5nTGV2ZWxfTWF4UFMsCisJZU1pYl9kb3QxMVBvd2VyU2F2aW5nTGV2ZWxfRmFzdFBTLAorCWVNaWJfZG90MTFQb3dlclNhdmluZ0xldmVsX01heGltdW1MZXZlbAorfSBlTWliX2RvdDExUG93ZXJTYXZpbmdMZXZlbDsKKworI2RlZmluZSBNSUJfRE9UMTFfTUFDX0VYQ0xVU0lPTl9MSVNUX01BWF9DT1VOVCA0Cit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgY0VudHJpZXM7CisKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIG1hY0FkZHJzW01JQl9ET1QxMV9NQUNfRVhDTFVTSU9OX0xJU1RfTUFYX0NPVU5UXTsKKworfSBzTWliX2RvdDExTWFjRXhjbHVkZUxpc3Q7CisKKyNkZWZpbmUgTUlCX0RPVDExX1BSSVZBQ1lfRVhFTVBUX0xJU1RfTUFYX0NPVU5UIDMyCisKK3R5cGVkZWYgZW51bSB7CisJZU1pYl9kb3QxMUV4ZW1wdGlvbkFjdGlvbl9BbHdheXMsCisJZU1pYl9kb3QxMUV4ZW1wdGlvbkFjdGlvbl9PbktleU1hcFVuYXZhaWxhYmxlCit9IGVNaWJfZG90MTFFeGVtcHRBY3Rpb247CisKK3R5cGVkZWYgZW51bSB7CisJZU1pYl9kb3QxMUV4ZW1wdFBhY2tldF9VbmljYXN0LAorCWVNaWJfZG90MTFFeGVtcHRQYWNrZXRfTXVsdGljYXN0LAorCWVNaWJfZG90MTFFeGVtcHRQYWNrZXRfQm90aAorfSBlTWliX2RvdDExRXhlbXB0UGFja2V0OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgdUV0aGVyVHlwZTsKKwllTWliX2RvdDExRXhlbXB0QWN0aW9uIGV4ZW1wdEFjdGlvbjsKKwllTWliX2RvdDExRXhlbXB0UGFja2V0IGV4ZW1wdFBhY2tldDsKKworfSBzTWliX2RvdDExUHJpdmFjeUV4ZW1wdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGNFbnRyaWVzOworCisJc01pYl9kb3QxMVByaXZhY3lFeGVtcHRpb24KKwkJcHJpdmFjeUV4ZW1wdExpc3RbTUlCX0RPVDExX1BSSVZBQ1lfRVhFTVBUX0xJU1RfTUFYX0NPVU5UXTsKKworfSBzTWliX2RvdDExUHJpdmFjeUV4ZW1wdGlvbkxpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHNIZGRNaWJfcyB7CisJZU1pYl9kb3QxMURlc2lyZWRCc3NUeXBlIG1pYkRvdDExRGVzaXJlZEJzc1R5cGU7CisKKwlzTWliX2RvdDExRGVzaXJlZEJzc2lkTGlzdCBtaWJEb3QxMURlc2lyZWRCc3NpZExpc3Q7CisKKwlzTWliX2RvdDExRGVzaXJlZFNzaWRMaXN0IG1pYkRvdDExRGVzaXJlZFNzaWRMaXN0OworCisJZU1pYl9kb3QxMUF1dG9Db25maWdFbmFibGVkIG1pYkRvdDExQXV0b0NvbmZpZ0VuYWJsZWQ7CisKKwkvKiB0aGUgZGV2aWNlIHBvd2VyIHN0YXRlIGZvciB0aGUgZGV2aWNlICh0aGUgRC1zdGF0ZS4uLiB5b3Uga25vdyBEMCwgRDEsIEQyLCBldGMuICovCisJZU1pYl9EZXZpY2VQb3dlclN0YXRlIG1pYkRldmljZVBvd2VyU3RhdGU7CisKKwkvKiBkb3QxMU5JQ1Bvd2VyU3RhdGUgaXMgcmVhbGx5IHRoZSBvbi9vZmYgc3RhdGUgb2YgdGhlIFBIWS4gIFRoaXMgY2FuIGJlICovCisJLyogbWFtaXB1bGF0ZWQgdGhyb3VnaCBPSURzIGxpa2UgYSBzb2Z0d2FyZSBjb250cm9sIGZvciByYWRpbyBvbi9vZmYuICovCisJZU1pYl9kb3QxMU5JQ1Bvd2VyU3RhdGUgbWliRG90MTFOSUNQb3dlclN0YXRlOworCisJLyogSGFyZHdhcmUgUEhZIHN0YXRlIGlzIHRoZSBvbi9vZmYgc3RhdGUgb2YgdGhlIGhhcmR3YXJlIFBIWS4gKi8KKwllTWliX2RvdDExSGFyZHdhcmVQSFlTdGF0ZSBtaWJEb3QxMUhhcmR3YXJlUEhZU3RhdGU7CisKKwkvKiBkb3QxMSBQb3dlciBTYXZpbmcgbGV2ZWwgaXMgdGhlIDgwMi4xMSBwb3dlciBzYXZpbmcgbGV2ZWwvc3RhdGUgZm9yIHRoZSA4MDIuMTEgKi8KKwkvKiBOSUMuICBUeXBpY2FsbHkgdGhpcyBpcyBtYXBwZWQgdG8gODAyLjExIEJNUFMgaW4gc29tZSBmYXNoaW9uLiAgV2UgYXJlIG5vdCBnb2luZyAqLworCS8qIHRvIGRpc2FwcG9pbnQ7IHRoZSBMaWJyYSBOSUMgbWFwcyB0aGVzZSB0byBkaWZmZXJlbnQgQk1QUyBzZXR0aW5ncy4gKi8KKwllTWliX2RvdDExUG93ZXJTYXZpbmdMZXZlbCBtaWJEb3QxMVBvd2VyU2F2aW5nTGV2ZWw7CisKKwlzTWliX2RvdDExTWFjRXhjbHVkZUxpc3QgbWliRG90MTFNYWNFeGNsdWRlTGlzdDsKKworCXNNaWJfZG90MTFQcml2YWN5RXhlbXB0aW9uTGlzdCBtaWJEb3QxMVByaXZhY3lFeGVtcHRpb25MaXN0OworCisJc01pYl9kb3QxMVN1cHBvcnRlZFBoeVR5cGVzIG1pYkRvdDExU3VwcG9ydGVkUGh5VHlwZXM7CisJZU1pYl9kb3QxMVBoeVR5cGUgbWliRG90MTFDdXJyZW50UGh5VHlwZTsKKworCWJvb2wgZG90MTFJYnNzSm9pbk9ubHk7CisJYm9vbCBIaWRkZW5OZXR3b3JrRW5hYmxlZDsKKworfSBzSGRkTWliX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX21pc2MuaCBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9taXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhMGRiMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9taXNjLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBXTEFOX0hERF9NSVNDX0gKKyNkZWZpbmUgV0xBTl9IRERfTUlTQ19ICisKKyNpZmRlZiBNU01fUExBVEZPUk0KKyNkZWZpbmUgV0xBTl9JTklfRklMRSAgICAgICAgICAgICAgIndsYW4vcWNhX2NsZC9XQ05TU19xY29tX2NmZy5pbmkiCisjZGVmaW5lIFdMQU5fTUFDX0ZJTEUgICAgICAgICAgICAgICJ3bGFuL3FjYV9jbGQvd2xhbl9tYWMuYmluIgorI2Vsc2UKKyNkZWZpbmUgV0xBTl9JTklfRklMRSAgICAgICAgICAgICAgIndsYW4vcWNvbV9jZmcuaW5pIgorI2RlZmluZSBXTEFOX01BQ19GSUxFICAgICAgICAgICAgICAid2xhbi93bGFuX21hYy5iaW4iCisjZW5kaWYgLyogTVNNX1BMQVRGT1JNICovCisKKyNlbmRpZiAvKiBXTEFOX0hERF9NSVNDX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL2luYy93bGFuX2hkZF9uYW4uaCBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9uYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzJmNjJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX25hbi5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19XTEFOX0hERF9OQU5fSAorI2RlZmluZSBfX1dMQU5fSEREX05BTl9ICisKKy8qKgorICogRE9DOiB3bGFuX2hkZF9uYW4uaAorICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIE5BTiBBUEkgc3BlY2lmaWNhdGlvbgorICovCisKK3N0cnVjdCBoZGRfY29udGV4dF9zOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorc3RydWN0IHdpcGh5Oworc3RydWN0IHdpcmVsZXNzX2RldjsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX25hbl9yZXF1ZXN0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgIGludCBkYXRhX2xlbik7CisKK2Jvb2wgd2xhbl9oZGRfbmFuX2lzX3N1cHBvcnRlZCh2b2lkKTsKK3ZvaWQgd2xhbl9oZGRfbmFuX2luaXQoc3RydWN0IGhkZF9jb250ZXh0X3MgKmhkZF9jdHgpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCB3bGFuX2hkZF9uYW5faXNfc3VwcG9ydGVkKHZvaWQpCit7CisJcmV0dXJuIGZhbHNlOworfQorc3RhdGljIGlubGluZSB2b2lkIHdsYW5faGRkX25hbl9pbml0KHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KQoreworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9OQU4gKi8KKyNlbmRpZiAvKiBfX1dMQU5fSEREX05BTl9IICovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfbmFwaS5oIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX25hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzE2ODNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX25hcGkuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0hERF9OQVBJX0hfXworI2RlZmluZSBfX0hERF9OQVBJX0hfXworCisjaWZkZWYgRkVBVFVSRV9OQVBJCisvKioKKyAqIERPQzogd2xhbl9oZGRfbmFwaS5oCisgKgorICogV0xBTiBOQVBJIGludGVyZmFjZSBtb2R1bGUgaGVhZGVycworICovCisKKy8qIENMRCBoZWFkZXJzICovCisjaW5jbHVkZSAiaGlmX25hcGkuaCIKKy8qIExpbnV4IGhlYWRlcnMgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4gLyogbmV0X2RldmljZSAqLworCisjZGVmaW5lIEhERF9OQVBJX0FOWSAoLTEpCisKK2ludCBoZGRfbmFwaV9lbmFibGVkKGludCBpZCk7CitpbnQgaGRkX25hcGlfY3JlYXRlKHZvaWQpOworaW50IGhkZF9uYXBpX2Rlc3Ryb3koaW50IGZvcmNlKTsKKworaW50IGhkZF9uYXBpX3N0YXRzKGNoYXIgICAqYnVmLAorCQkgICBpbnQgICAgIG1heCwKKwkJICAgY2hhciAgICppbmRwLAorCQkgICBzdHJ1Y3QgcWNhX25hcGlfZGF0YSAqbmFwaWQpOworCisvKiB0aGUgZm9sbG93aW5nIHRyaWdnZXJzIG5hcGlfZW5hYmxlL2Rpc2FibGUgYXMgcmVxdWlyZWQgKi8KK2ludCBoZGRfbmFwaV9ldmVudChlbnVtIHFjYV9uYXBpX2V2ZW50IGV2ZW50LCB2b2lkICpkYXRhKTsKKworaW50IGhkZF9uYXBpX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KTsKKworc3RydWN0IHFjYV9uYXBpX2RhdGEgKmhkZF9uYXBpX2dldF9hbGwodm9pZCk7CisKKyNlbHNlIC8qICEgZGVmaW5lZChGRUFUVVJFX05BUEkpICovCisjaW5jbHVkZSAiaGlmX25hcGkuaCIKKy8qKgorICogU3R1YiBBUEkKKyAqCisgKi8KKworI2RlZmluZSBIRERfTkFQSV9BTlkgKC0xKQorCitzdGF0aWMgaW5saW5lIGludCBoZGRfbmFwaV9lbmFibGVkKGludCBpZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgaGRkX25hcGlfY3JlYXRlKHZvaWQpIHsgcmV0dXJuIC1FUEVSTTsgfQorc3RhdGljIGlubGluZSBpbnQgaGRkX25hcGlfZGVzdHJveShpbnQgZm9yY2UpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGhkZF9uYXBpX3N0YXRzKGNoYXIgKmJ1ZiwgaW50IG1heCwgY2hhciAqaW5kcCwKKwkJCQkgc3RydWN0IHFjYV9uYXBpX2RhdGEgKm5hcGlkKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgaGRkX25hcGlfZXZlbnQoZW51bSBxY2FfbmFwaV9ldmVudCBldmVudCwgdm9pZCAqZGF0YSkKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHFjYV9uYXBpX2RhdGEgKmhkZF9uYXBpX2dldF9hbGwodm9pZCkgeyByZXR1cm4gTlVMTDsgfQorCisjZW5kaWYgLyogRkVBVFVSRV9OQVBJICovCisKKyNlbmRpZiAvKiAgSEREX05BUElfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfb2VtZGF0YS5oIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX29lbWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTA3ZGMzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX29lbWRhdGEuaApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCisvKioKKyAqIERPQzogd2xhbl9oZGRfb2VtZGF0YS5oCisgKgorICogSW50ZXJuYWwgaW5jbHVkZXMgZm9yIHRoZSBvZW0gZGF0YQorICovCisKKyNpZm5kZWYgX19XTEFOX0hERF9PRU1fREFUQV9IX18KKyNkZWZpbmUgX19XTEFOX0hERF9PRU1fREFUQV9IX18KKworI2lmbmRlZiBPRU1fREFUQV9SRVFfU0laRQorI2RlZmluZSBPRU1fREFUQV9SRVFfU0laRSAyODAKKyNlbmRpZgorCisjaWZuZGVmIE9FTV9EQVRBX1JTUF9TSVpFCisjZGVmaW5lIE9FTV9EQVRBX1JTUF9TSVpFIDE3MjQKKyNlbmRpZgorCisjZGVmaW5lIE9FTV9BUFBfU0lHTkFUVVJFX0xFTiAgICAgIDE2CisjZGVmaW5lIE9FTV9BUFBfU0lHTkFUVVJFX1NUUiAgICAgICJRVUFMQ09NTS1PRU0tQVBQIgorCisjZGVmaW5lIE9FTV9UQVJHRVRfU0lHTkFUVVJFX0xFTiAgIDgKKyNkZWZpbmUgT0VNX1RBUkdFVF9TSUdOQVRVUkUgICAgICAgIlFVQUxDT01NIgorCisjZGVmaW5lIE9FTV9DQVBfTUFYX05VTV9DSEFOTkVMUyAgIDEyOAorCisvKioKKyAqIHR5cGVkZWYgZU9lbUVycm9yQ29kZSAtIE9FTSBlcnJvciBjb2RlcworICogQE9FTV9FUlJfTlVMTF9DT05URVhUOiAlTlVMTCBjb250ZXh0CisgKiBAT0VNX0VSUl9BUFBfTk9UX1JFR0lTVEVSRUQ6IE9FTSBBcHAgaXMgbm90IHJlZ2lzdGVyZWQKKyAqIEBPRU1fRVJSX0lOVkFMSURfU0lHTkFUVVJFOiBJbnZhbGlkIHNpZ25hdHVyZQorICogQE9FTV9FUlJfTlVMTF9NRVNTQUdFX0hFQURFUjogSW52YWxpZCBtZXNzYWdlIGhlYWRlcgorICogQE9FTV9FUlJfSU5WQUxJRF9NRVNTQUdFX1RZUEU6IEludmFsaWQgbWVzc2FnZSB0eXBlCisgKiBAT0VNX0VSUl9JTlZBTElEX01FU1NBR0VfTEVOR1RIOiBJbnZhbGlkIGxlbmd0aCBpbiBtZXNzYWdlIGJvZHkKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlPRU1fRVJSX05VTExfQ09OVEVYVCA9IDEsCisJT0VNX0VSUl9BUFBfTk9UX1JFR0lTVEVSRUQsCisJT0VNX0VSUl9JTlZBTElEX1NJR05BVFVSRSwKKwlPRU1fRVJSX05VTExfTUVTU0FHRV9IRUFERVIsCisJT0VNX0VSUl9JTlZBTElEX01FU1NBR0VfVFlQRSwKKwlPRU1fRVJSX0lOVkFMSURfTUVTU0FHRV9MRU5HVEgKK30gZU9lbUVycm9yQ29kZTsKKworLyoqCisgKiB0eXBlZGVmIHREcml2ZXJWZXJzaW9uIC0gRHJpdmVyIHZlcnNpb24gaWRlbnRpZmllciAody54LnkueikKKyAqIEBtYWpvcjogVmVyc2lvbiBJRCBtYWpvciBudW1iZXIKKyAqIEBtaW5vcjogVmVyc2lvbiBJRCBtaW5vciBudW1iZXIKKyAqIEBwYXRjaDogVmVyc2lvbiBJRCBwYXRjaCBudW1iZXIKKyAqIEBidWlsZDogVmVyc2lvbiBJRCBidWlsZCBudW1iZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgY2RmX3BhY2tlZCB7CisJdWludDhfdCBtYWpvcjsKKwl1aW50OF90IG1pbm9yOworCXVpbnQ4X3QgcGF0Y2g7CisJdWludDhfdCBidWlsZDsKK30gdERyaXZlclZlcnNpb247CisKKy8qKgorICogdHlwZWRlZiB0X2l3X29lbV9kYXRhX2NhcCAtIE9FTSBEYXRhIENhcGFiaWxpdGllcworICogQG9lbV90YXJnZXRfc2lnbmF0dXJlOiBTaWduYXR1cmUgb2YgY2hpcHNldCB2ZW5kb3IsIGUuZy4gUVVBTENPTU0KKyAqIEBvZW1fdGFyZ2V0X3R5cGU6IENoaXAgdHlwZQorICogQG9lbV9md192ZXJzaW9uOiBGaXJtd2FyZSB2ZXJzaW9uCisgKiBAZHJpdmVyX3ZlcnNpb246IEhvc3Qgc29mdHdhcmUgdmVyc2lvbgorICogQGFsbG93ZWRfZHdlbGxfdGltZV9taW46IENoYW5uZWwgZHdlbGwgdGltZSAtIGFsbG93ZWQgbWluaW11bQorICogQGFsbG93ZWRfZHdlbGxfdGltZV9tYXg6IENoYW5uZWwgZHdlbGwgdGltZSAtIGFsbG93ZWQgbWF4aW11bQorICogQGN1cnJfZHdlbGxfdGltZV9taW46IENoYW5uZWwgZHdlbGwgdGltZSAtIGN1cnJlbnQgbWluaW1pbQorICogQGN1cnJfZHdlbGxfdGltZV9tYXg6IENoYW5uZWwgZHdlbGwgdGltZSAtIGN1cnJlbnQgbWF4aW11bQorICogQHN1cHBvcnRlZF9iYW5kczogU3VwcG9ydGVkIGJhbmRzLCAyLjRHIG9yIDVHIEh6CisgKiBAbnVtX2NoYW5uZWxzOiBOdW0gb2YgY2hhbm5lbHMgSURzIHRvIGZvbGxvdworICogQGNoYW5uZWxfbGlzdDogTGlzdCBvZiBjaGFubmVsIElEcworICovCit0eXBlZGVmIHN0cnVjdCBjZGZfcGFja2VkIHsKKwl1aW50OF90IG9lbV90YXJnZXRfc2lnbmF0dXJlW09FTV9UQVJHRVRfU0lHTkFUVVJFX0xFTl07CisJdWludDMyX3Qgb2VtX3RhcmdldF90eXBlOworCXVpbnQzMl90IG9lbV9md192ZXJzaW9uOworCXREcml2ZXJWZXJzaW9uIGRyaXZlcl92ZXJzaW9uOworCXVpbnQxNl90IGFsbG93ZWRfZHdlbGxfdGltZV9taW47CisJdWludDE2X3QgYWxsb3dlZF9kd2VsbF90aW1lX21heDsKKwl1aW50MTZfdCBjdXJyX2R3ZWxsX3RpbWVfbWluOworCXVpbnQxNl90IGN1cnJfZHdlbGxfdGltZV9tYXg7CisJdWludDE2X3Qgc3VwcG9ydGVkX2JhbmRzOworCXVpbnQxNl90IG51bV9jaGFubmVsczsKKwl1aW50OF90IGNoYW5uZWxfbGlzdFtPRU1fQ0FQX01BWF9OVU1fQ0hBTk5FTFNdOworfSB0X2l3X29lbV9kYXRhX2NhcDsKKworLyoqCisgKiB0eXBlZGVmIHRIZGRDaGFubmVsSW5mbyAtIENoYW5uZWwgaW5mb3JtYXRpb24KKyAqIEBjaGFuX2lkOiBjaGFubmVsIGlkCisgKiBAcmVzZXJ2ZWQwOiByZXNlcnZlZCBmb3IgcGFkZGluZyBhbmQgZnV0dXJlIHVzZQorICogQG1oejogcHJpbWFyeSAyMCBNSHogY2hhbm5lbCBmcmVxdWVuY3kgaW4gbWh6CisgKiBAYmFuZF9jZW50ZXJfZnJlcTE6IENlbnRlciBmcmVxdWVuY3kgMSBpbiBNSHoKKyAqIEBiYW5kX2NlbnRlcl9mcmVxMjogQ2VudGVyIGZyZXF1ZW5jeSAyIGluIE1IeiwgdmFsaWQgb25seSBmb3IgMTFhYworICoJVkhUIDgwKzgwIG1vZGUKKyAqIEBpbmZvOiBjaGFubmVsIGluZm8KKyAqIEByZWdfaW5mb18xOiByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGZpZWxkIDEgd2hpY2ggY29udGFpbnMgbWluIHBvd2VyLAorICoJbWF4IHBvd2VyLCByZWcgcG93ZXIgYW5kIHJlZyBjbGFzcyBpZAorICogQHJlZ19pbmZvXzI6IHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gZmllbGQgMiB3aGljaCBjb250YWlucyBhbnRlbm5hbWF4CisgKi8KK3R5cGVkZWYgc3RydWN0IGNkZl9wYWNrZWQgeworCXVpbnQzMl90IGNoYW5faWQ7CisJdWludDMyX3QgcmVzZXJ2ZWQwOworCXVpbnQzMl90IG1oejsKKwl1aW50MzJfdCBiYW5kX2NlbnRlcl9mcmVxMTsKKwl1aW50MzJfdCBiYW5kX2NlbnRlcl9mcmVxMjsKKwl1aW50MzJfdCBpbmZvOworCXVpbnQzMl90IHJlZ19pbmZvXzE7CisJdWludDMyX3QgcmVnX2luZm9fMjsKK30gdEhkZENoYW5uZWxJbmZvOworCisvKioKKyAqIHR5cGVkZWYgdFBlZXJTdGF0dXNJbmZvIC0gU3RhdHVzIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIHBlZXIKKyAqIEBwZWVyX21hY19hZGRyOiBwZWVyIG1hYyBhZGRyZXNzCisgKiBAcGVlcl9zdGF0dXM6IHBlZXIgc3RhdHVzOiAxOiBDT05ORUNURUQsIDI6IERJU0NPTk5FQ1RFRAorICogQHZkZXZfaWQ6IHZkZXZfaWQgZm9yIHRoZSBwZWVyIG1hYworICogQHBlZXJfY2FwYWJpbGl0eTogcGVlciBjYXBhYmlsaXR5OiAwOiBSVFQvUlRUMiwgMTogUlRUMy4gRGVmYXVsdCBpcyAwCisgKiBAcmVzZXJ2ZWQwOiByZXNlcnZlZDAKKyAqIEBwZWVyX2NoYW5faW5mbzogY2hhbm5lbCBpbmZvIG9uIHdoaWNoIHBlZXIgaXMgY29ubmVjdGVkCisgKi8KK3R5cGVkZWYgc3RydWN0IGNkZl9wYWNrZWQgeworCXVpbnQ4X3QgcGVlcl9tYWNfYWRkcltFVEhfQUxFTl07CisJdWludDhfdCBwZWVyX3N0YXR1czsKKwl1aW50OF90IHZkZXZfaWQ7CisJdWludDMyX3QgcGVlcl9jYXBhYmlsaXR5OworCXVpbnQzMl90IHJlc2VydmVkMDsKKwl0SGRkQ2hhbm5lbEluZm8gcGVlcl9jaGFuX2luZm87Cit9IHRQZWVyU3RhdHVzSW5mbzsKKwordm9pZCBoZGRfc2VuZF9wZWVyX3N0YXR1c19pbmRfdG9fb2VtX2FwcChzdHJ1Y3QgY2RmX21hY19hZGRyICpwZWVyTWFjLAorCQkJCQkgdWludDhfdCBwZWVyU3RhdHVzLAorCQkJCQkgdWludDhfdCBwZWVyVGltaW5nTWVhc0NhcCwKKwkJCQkJIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgdFNpclNtZUNoYW5JbmZvICpjaGFuX2luZm8pOworCitpbnQgaXdfZ2V0X29lbV9kYXRhX2NhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitpbnQgb2VtX2FjdGl2YXRlX3NlcnZpY2Uoc3RydWN0IGhkZF9jb250ZXh0X3MgKmhkZF9jdHgpOworCit2b2lkIGhkZF9zZW5kX29lbV9kYXRhX3JzcF9tc2coaW50IGxlbmd0aCwgdWludDhfdCAqb2VtRGF0YVJzcCk7CisKKyNlbmRpZiAvKiBfX1dMQU5fSEREX09FTV9EQVRBX0hfXyAqLworCisjZW5kaWYgLyogRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUICovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfcDJwLmggYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfcDJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllZjM0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9wMnAuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX1AyUF9ICisjZGVmaW5lIF9fUDJQX0gKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgICAgICAgIHdsYW5faGRkX3AycC5oCisKKyAgIFxicmllZiAgICAgICBMaW51eCBIREQgUDJQIGluY2x1ZGUgZmlsZQorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIEFDVElPTl9GUkFNRV9UWF9USU1FT1VUIDIwMDAKKyNkZWZpbmUgV0FJVF9DQU5DRUxfUkVNX0NIQU4gICAgMTAwMAorI2RlZmluZSBXQUlUX1JFTV9DSEFOX1JFQURZICAgICAxMDAwCisjZGVmaW5lIFdBSVRfQ0hBTkdFX0NIQU5ORUxfRk9SX09GRkNIQU5ORUxfVFggMzAwMAorI2RlZmluZSBFU1RJTUFURURfUk9DX0RVUl9SRVFEX0ZPUl9BQ1RJT05fVFggMjAKKyNkZWZpbmUgQ09NUExFVEVfRVZFTlRfUFJPUE9HQVRFX1RJTUUgMTAKKworI2lmZGVmIFFDQV9XSUZJXzNfMF9FTVUKKyNkZWZpbmUgQUNUSU9OX0ZSQU1FX0RFRkFVTFRfV0FJVCA1MDAKKyNlbHNlCisjZGVmaW5lIEFDVElPTl9GUkFNRV9ERUZBVUxUX1dBSVQgMjAwCisjZW5kaWYKKworI2RlZmluZSBXTEFOX0hERF9HRVRfVFlQRV9GUk1fRkMoX19mY19fKSAgICAgICAgICgoKF9fZmNfXykgJiAweDBGKSA+PiAyKQorI2RlZmluZSBXTEFOX0hERF9HRVRfU1VCVFlQRV9GUk1fRkMoX19mY19fKSAgICAgICgoKF9fZmNfXykgJiAweEYwKSA+PiA0KQorI2RlZmluZSBXTEFOX0hERF84MDIxMV9GUk1fREFfT0ZGU0VUICAgICAgICAgICAgIDQKKyNkZWZpbmUgUDJQX1dJTERDQVJEX1NTSURfTEVOICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFAyUF9XSUxEQ0FSRF9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgIkRJUkVDVC0iCisKKyNpZmRlZiBRQ0FfV0lGSV8zXzBfRU1VCisjZGVmaW5lIFAyUF9ST0NfRFVSQVRJT05fTVVMVElQTElFUl9HT19QUkVTRU5UICAgMgorI2RlZmluZSBQMlBfUk9DX0RVUkFUSU9OX01VTFRJUExJRVJfR09fQUJTRU5UICAgIDMKKyNlbHNlCisjZGVmaW5lIFAyUF9ST0NfRFVSQVRJT05fTVVMVElQTElFUl9HT19QUkVTRU5UICAgMgorI2RlZmluZSBQMlBfUk9DX0RVUkFUSU9OX01VTFRJUExJRVJfR09fQUJTRU5UICAgIDUKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworI2RlZmluZSBXTEFOX0hERF9TRVRfV0VQX0ZSTV9GQyhfX2ZjX18pICAgICAoKF9fZmNfXykgPSAoKF9fZmNfXykgfCAweDQwKSkKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFXICovCisKKyNkZWZpbmUgSEREX1AyUF9NQVhfUk9DX0RVUkFUSU9OIDEwMDAKKyNkZWZpbmUgTUFYX1JPQ19SRVFfUVVFVUVfRU5UUlkgMTAKKworZW51bSBoZGRfcnhfZmxhZ3MgeworCUhERF9SWF9GTEFHX0RFQ1JZUFRFRCA9IDEgPDwgMCwKKwlIRERfUlhfRkxBR19NTUlDX1NUUklQUEVEID0gMSA8PCAxLAorCUhERF9SWF9GTEFHX0lWX1NUUklQUEVEID0gMSA8PCAyLAorfTsKKworI2RlZmluZSBQMlBfUE9XRVJfU0FWRV9UWVBFX09QUE9SVFVOSVNUSUMgICAgICAgICgxIDw8IDApCisjZGVmaW5lIFAyUF9QT1dFUl9TQVZFX1RZUEVfUEVSSU9ESUNfTk9BICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgUDJQX1BPV0VSX1NBVkVfVFlQRV9TSU5HTEVfTk9BICAgICAgICAgICAoMSA8PCAyKQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9ERUJVRwordHlwZWRlZiBlbnVtIHsgUDJQX05PVF9BQ1RJVkUsCisJICAgICAgIFAyUF9HT19ORUdfUFJPQ0VTUywKKwkgICAgICAgUDJQX0dPX05FR19DT01QTEVURUQsCisJICAgICAgIFAyUF9DTElFTlRfQ09OTkVDVElOR19TVEFURV8xLAorCSAgICAgICBQMlBfR09fQ09NUExFVEVEX1NUQVRFLAorCSAgICAgICBQMlBfQ0xJRU5UX0NPTk5FQ1RFRF9TVEFURV8xLAorCSAgICAgICBQMlBfQ0xJRU5UX0RJU0NPTk5FQ1RFRF9TVEFURSwKKwkgICAgICAgUDJQX0NMSUVOVF9DT05ORUNUSU5HX1NUQVRFXzIsCisJICAgICAgIFAyUF9DTElFTlRfQ09NUExFVEVEX1NUQVRFfSB0UDJQQ29ubmVjdGlvblN0YXR1czsKKworZXh0ZXJuIHRQMlBDb25uZWN0aW9uU3RhdHVzIGdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXM7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgcDJwX2FwcF9zZXRQMnBQcyB7CisJdWludDhfdCBvcHBfcHM7CisJdWludDMyX3QgY3RXaW5kb3c7CisJdWludDhfdCBjb3VudDsKKwl1aW50MzJfdCBkdXJhdGlvbjsKKwl1aW50MzJfdCBpbnRlcnZhbDsKKwl1aW50MzJfdCBzaW5nbGVfbm9hX2R1cmF0aW9uOworCXVpbnQ4X3QgcHNTZWxlY3Rpb247Cit9IHAycF9hcHBfc2V0UDJwUHNfdDsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX3JlbWFpbl9vbl9jaGFubmVsKHN0cnVjdCB3aXBoeSAqd2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwkJCQkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKyNlbHNlCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisjZW5kaWYKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA4LCAwKSkKKwkJCQkJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisjZW5kaWYKKwkJCQkJdW5zaWduZWQgaW50IGR1cmF0aW9uLCB1NjQgKmNvb2tpZSk7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCQkgICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKyNlbHNlCisJCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorI2VuZGlmCisJCQkJCSAgICAgICB1NjQgY29va2llKTsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX21nbXRfdHhfY2FuY2VsX3dhaXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCQkgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisjZWxzZQorCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisjZW5kaWYKKwkJCQkJICB1NjQgY29va2llKTsKKworaW50IGhkZF9zZXRfcDJwX3BzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKm1zZ0RhdGEpOworaW50IGhkZF9zZXRfcDJwX29wcHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDhfdCAqY29tbWFuZCk7CitpbnQgaGRkX3NldF9wMnBfbm9hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQ4X3QgKmNvbW1hbmQpOworCit2b2lkIGhkZF9pbmRpY2F0ZV9tZ210X2ZyYW1lKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJICAgICB1aW50MzJfdCBuRnJhbWVMZW5ndGgsIHVpbnQ4X3QgKnBiRnJhbWVzLAorCQkJICAgICB1aW50OF90IGZyYW1lVHlwZSwgdWludDMyX3QgcnhDaGFuLCBpbnQ4X3QgcnhSc3NpKTsKKwordm9pZCBoZGRfcmVtYWluX2NoYW5fcmVhZHlfaGFuZGxlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwl1aW50MzJfdCBzY2FuX2lkKTsKK3ZvaWQgaGRkX3NlbmRfYWN0aW9uX2NuZihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgYm9vbCBhY3Rpb25TZW5kU3VjY2Vzcyk7CitpbnQgd2xhbl9oZGRfY2hlY2tfcmVtYWluX29uX2NoYW5uZWwoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOwordm9pZCB3bGFuX2hkZF9jYW5jZWxfZXhpc3RpbmdfcmVtYWluX29uX2NoYW5uZWwoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNCwgMCkpCitpbnQgd2xhbl9oZGRfbWdtdF90eChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9tZ210X3R4X3BhcmFtcyAqcGFyYW1zLCB1NjQgKmNvb2tpZSk7CisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQoraW50IHdsYW5faGRkX21nbXRfdHgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sIGJvb2wgb2ZmY2hhbiwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkpCisJCSAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisJCSAgICAgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsCisjZW5kaWYKKwkJICAgICB1bnNpZ25lZCBpbnQgd2FpdCwKKwkJICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBib29sIG5vX2NjaywKKwkJICAgICBib29sIGRvbnRfd2FpdF9mb3JfYWNrLCB1NjQgKmNvb2tpZSk7CisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDMsIDApKQoraW50IHdsYW5faGRkX21nbXRfdHgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sIGJvb2wgb2ZmY2hhbiwKKwkJICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKKwkJICAgICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwgdW5zaWduZWQgaW50IHdhaXQsCisJCSAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCBub19jY2ssCisJCSAgICAgYm9vbCBkb250X3dhaXRfZm9yX2FjaywgdTY0ICpjb29raWUpOworI2Vsc2UKK2ludCB3bGFuX2hkZF9tZ210X3R4KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLCBib29sIG9mZmNoYW4sCisJCSAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisJCSAgICAgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsIHVuc2lnbmVkIGludCB3YWl0LAorCQkgICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sIHU2NCAqY29va2llKTsKKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA3LCAwKSkKK3N0cnVjdCB3aXJlbGVzc19kZXYgKndsYW5faGRkX2FkZF92aXJ0dWFsX2ludGYoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCisJCQkJCSAgICAgICB1MzIgKmZsYWdzLAorCQkJCQkgICAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcyk7CisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorc3RydWN0IHdpcmVsZXNzX2RldiAqd2xhbl9oZGRfYWRkX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjaGFyICpuYW1lLAorCQkJCQkgICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAorCQkJCQkgICAgICAgdTMyICpmbGFncywKKwkJCQkJICAgICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpOworI2Vsc2UKK3N0cnVjdCBuZXRfZGV2aWNlICp3bGFuX2hkZF9hZGRfdmlydHVhbF9pbnRmKHN0cnVjdCB3aXBoeSAqd2lwaHksIGNoYXIgKm5hbWUsCisJCQkJCSAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAorCQkJCQkgICAgIHUzMiAqZmxhZ3MsCisJCQkJCSAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCitpbnQgd2xhbl9oZGRfZGVsX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKKyNlbHNlCitpbnQgd2xhbl9oZGRfZGVsX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCit2b2lkIHdsYW5faGRkX2NsZWFudXBfcmVtYWluX29uX2NoYW5uZWxfY3R4KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKKwordm9pZCB3bGFuX2hkZF9yb2NfcmVxdWVzdF9kZXF1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZW5kaWYgLyogX19QMlBfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX3Bvd2VyLmggYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfcG93ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE1N2YwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX3Bvd2VyLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19XTEFOX0hERF9QT1dFUl9ICisjZGVmaW5lIF9fV0xBTl9IRERfUE9XRVJfSAorCisvKioKKyAqIERPQzogd2xhbl9oZGRfcG93ZXIuaAorICoKKyAqIEhERCBQb3dlciBNYW5hZ2VtZW50IEFQSQorICovCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisjZGVmaW5lIEhERF9NQVhfQ01QX1BFUl9QQUNLRVRfRklMVEVSICAgICA1CisjZGVmaW5lIEhERF9GSUxURVJfSVBWNl9NQ19VQyAgICAgICAgICAgICAxCisjZGVmaW5lIEhERF9GSUxURVJfSVBWNl9NQyAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhERF9GSUxURVJfSURfSVBWNl9NQyAgICAgICAgICAgICAxMAorI2RlZmluZSBIRERfRklMVEVSX0lEX0lQVjZfVUMgICAgICAgICAgICAgMTEKKworI2RlZmluZSBIRERfSVBWNl9NQ19DTVBfREFUQSAgICAgICAgICAgICAgMHgzMworI2RlZmluZSBIRERfSVBWNl9VQ19DTVBfREFUQSAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBIRERfSVBWNl9DTVBfREFUQV8wICAgICAgICAgICAgICAgMHg4NgorI2RlZmluZSBIRERfSVBWNl9DTVBfREFUQV8xICAgICAgICAgICAgICAgMHhERAorCisjZGVmaW5lIEhERF9XTEFOX01BQ19BRERSX0xFTiAgICAgICAgICAgICA2CisjZGVmaW5lIEhERF9NQVhfTlVNX01VTFRJQ0FTVF9BRERSRVNTICAgICAxMAorCisvKioKKyAqIGVudW0gcGt0X2ZpbHRlcl9wcm90b2NvbF9sYXllciAtIHBhY2tldCBmaWx0ZXIgcHJvdG9jb2wgbGF5ZXIKKyAqIEBIRERfRklMVEVSX1BST1RPX1RZUEVfSU5WQUxJRDogSW52YWxpZCBpbml0aWFsIHZhbHVlCisgKiBASEREX0ZJTFRFUl9QUk9UT19UWVBFX01BQzogTUFDIHByb3RvY29sCisgKiBASEREX0ZJTFRFUl9QUk9UT19UWVBFX0FSUDogQVJQIHByb3RvY29sCisgKiBASEREX0ZJTFRFUl9QUk9UT19UWVBFX0lQVjQ6IElQIFY0IHByb3RvY29sCisgKiBASEREX0ZJTFRFUl9QUk9UT19UWVBFX0lQVjY6IElQIFY2IHByb3RvY29sCisgKiBASEREX0ZJTFRFUl9QUk9UT19UWVBFX1VEUDogVURQIHByb3RvY29sCisgKiBASEREX0ZJTFRFUl9QUk9UT19UWVBFX0lOVkFMSUQ6IE1heCBwbGFjZSBob2xkZXIgdmFsdWUKKyAqLworZW51bSBwa3RfZmlsdGVyX3Byb3RvY29sX2xheWVyIHsKKwlIRERfRklMVEVSX1BST1RPX1RZUEVfSU5WQUxJRCA9IDAsCisJSEREX0ZJTFRFUl9QUk9UT19UWVBFX01BQyA9IDEsCisJSEREX0ZJTFRFUl9QUk9UT19UWVBFX0FSUCA9IDIsCisJSEREX0ZJTFRFUl9QUk9UT19UWVBFX0lQVjQgPSAzLAorCUhERF9GSUxURVJfUFJPVE9fVFlQRV9JUFY2ID0gNCwKKwlIRERfRklMVEVSX1BST1RPX1RZUEVfVURQID0gNSwKKwlIRERfRklMVEVSX1BST1RPX1RZUEVfTUFYCit9OworCisvKioKKyAqIGVudW0gcGt0X2ZpbHRlcl9hY3Rpb24gLSBwYWNrZXQgZmlsdGVyIGFjdGlvbgorICogQEhERF9SQ1ZfRklMVEVSX0lOVkFMSUQ6IEludmFsaWQgaW5pdGlhbCB2YWx1ZQorICogQEhERF9SQ1ZfRklMVEVSX1NFVDogUGFja2V0IGZpbHRlciBzZXQKKyAqIEBIRERfUkNWX0ZJTFRFUl9DTEVBUjogUGFja2V0IGZpbHRlciBjbGVhcgorICogQEhERF9SQ1ZfRklMVEVSX01BWDogTWF4IHBsYWNlIGhvbGRlciB2YWx1ZQorICovCitlbnVtIHBrdF9maWx0ZXJfYWN0aW9uIHsKKwlIRERfUkNWX0ZJTFRFUl9JTlZBTElEID0gMCwKKwlIRERfUkNWX0ZJTFRFUl9TRVQgPSAxLAorCUhERF9SQ1ZfRklMVEVSX0NMRUFSID0gMiwKKwlIRERfUkNWX0ZJTFRFUl9NQVgKK307CisKKy8qKgorICogZW51bSBwa3RfZmlsdGVyX2NvbXBhcmVfZmxhZyAtIHBhY2tldCBmaWx0ZXIgY29tcGFyZSBmbGFnCisgKiBASEREX0ZJTFRFUl9DTVBfVFlQRV9JTlZBTElEOiBJbnZhbGlkIGluaXRpYWwgdmFsdWUKKyAqIEBIRERfRklMVEVSX0NNUF9UWVBFX0VRVUFMOiBDb21wYXJlIGlmIGZpbHRlciBpcyBlcXVhbAorICogQEhERF9GSUxURVJfQ01QX1RZUEVfTUFTS19FUVVBTDogQ29tcGFyZSBpZiBmaWx0ZXIgbWFzayBpcyBlcXVhbAorICogQEhERF9GSUxURVJfQ01QX1RZUEVfTk9UX0VRVUFMOiBDb21wYXJlIGlmIGZpbHRlciBpcyBub3QgZXF1YWwKKyAqIEBIRERfRklMVEVSX0NNUF9UWVBFX01BU0tfTk9UX0VRVUFMOiBDb21wYXJlIGlmIGZpbHRlciBtYXNrIGlzIG5vdCBlcXVhbAorICogQEhERF9GSUxURVJfQ01QX1RZUEVfTUFYOiBNYXggcGxhY2UgaG9sZGVyIHZhbHVlCisgKi8KK2VudW0gcGt0X2ZpbHRlcl9jb21wYXJlX2ZsYWcgeworCUhERF9GSUxURVJfQ01QX1RZUEVfSU5WQUxJRCA9IDAsCisJSEREX0ZJTFRFUl9DTVBfVFlQRV9FUVVBTCA9IDEsCisJSEREX0ZJTFRFUl9DTVBfVFlQRV9NQVNLX0VRVUFMID0gMiwKKwlIRERfRklMVEVSX0NNUF9UWVBFX05PVF9FUVVBTCA9IDMsCisJSEREX0ZJTFRFUl9DTVBfVFlQRV9NQVNLX05PVF9FUVVBTCA9IDQsCisJSEREX0ZJTFRFUl9DTVBfVFlQRV9NQVgKK307CisKKy8qKgorICogc3RydWN0IHBrdF9maWx0ZXJfcGFyYW1fY2ZnIC0gcGFja2V0IGZpbHRlciBwYXJhbWV0ZXIgY29uZmlnCisgKiBAcHJvdG9jb2xfbGF5ZXI6IFByb3RvY29sIGxheWVyCisgKiBAY29tcGFyZV9mbGFnOiBDb21wYXJlIGZsYWcKKyAqIEBkYXRhX2ZmZnNldDogRGF0YSBvZmZzZXQKKyAqIEBkYXRhX2xlbmd0aDogRGF0YSBsZW5ndGgKKyAqIEBjb21wYXJlX2RhdGE6IENvbXBhcmUgZGF0YQorICogQGRhdGFfbWFzazogRGF0YSBtYXNrCisgKi8KK3N0cnVjdCBwa3RfZmlsdGVyX3BhcmFtX2NmZyB7CisJdWludDhfdCBwcm90b2NvbF9sYXllcjsKKwl1aW50OF90IGNvbXBhcmVfZmxhZzsKKwl1aW50OF90IGRhdGFfb2Zmc2V0OworCXVpbnQ4X3QgZGF0YV9sZW5ndGg7CisJdWludDhfdCBjb21wYXJlX2RhdGFbU0lSX01BWF9GSUxURVJfVEVTVF9EQVRBX0xFTl07CisJdWludDhfdCBkYXRhX21hc2tbU0lSX01BWF9GSUxURVJfVEVTVF9EQVRBX0xFTl07Cit9OworCisvKioKKyAqIHN0cnVjdCBwa3RfZmlsdGVyX2NmZyAtIHBhY2tldCBmaWx0ZXIgY29uZmlnIHJlY2VpdmVkIGZyb20gdXNlciBzcGFjZQorICogQGZpbHRlcl9hY3Rpb246IEZpbHRlciBhY3Rpb24KKyAqIEBmaWx0ZXJfaWQ6IEZpbHRlciBpZAorICogQG51bV9wYXJhbXM6IE51bWJlciBvZiBwYXJhbWV0ZXJzCisgKiBAcGFyYW1zX2RhdGE6IFBhY2tldCBmaWx0ZXIgcGFyYW1ldGVycyBkZXRhaWwKKyAqLworc3RydWN0IHBrdF9maWx0ZXJfY2ZnIHsKKwl1aW50OF90IGZpbHRlcl9hY3Rpb247CisJdWludDhfdCBmaWx0ZXJfaWQ7CisJdWludDhfdCBudW1fcGFyYW1zOworCXN0cnVjdCBwa3RfZmlsdGVyX3BhcmFtX2NmZyBwYXJhbXNfZGF0YVtIRERfTUFYX0NNUF9QRVJfUEFDS0VUX0ZJTFRFUl07Cit9OworCisjZW5kaWYKKworCisvKiBTU1Igc2h1dGRvd24gJiByZS1pbml0IGZ1bmN0aW9ucyAqLworQ0RGX1NUQVRVUyBoZGRfd2xhbl9zaHV0ZG93bih2b2lkKTsKK0NERl9TVEFUVVMgaGRkX3dsYW5fcmVfaW5pdCh2b2lkICpoaWZfc2MpOworCit2b2lkIGhkZF9jb25mX21jYXN0YmNhc3RfZmlsdGVyKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGJvb2wgc2V0ZmlsdGVyKTsKK0NERl9TVEFUVVMgaGRkX2NvbmZfYXJwX29mZmxvYWQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGJvb2wgZmVuYWJsZSk7Cit2b2lkIGhkZF9jb25mX2hvc3RvZmZsb2FkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBib29sIGZlbmFibGUpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKK3ZvaWQgd2xhbl9oZGRfc2V0X21jX2FkZHJfbGlzdChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdWludDhfdCBzZXQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAord2xhbl9oZGRfc2V0X21jX2FkZHJfbGlzdChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdWludDhfdCBzZXQpCit7Cit9CisjZW5kaWYKKworaW50IHdsYW5faGRkX2NmZzgwMjExX3N1c3BlbmRfd2xhbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdyk7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9yZXN1bWVfd2xhbihzdHJ1Y3Qgd2lwaHkgKndpcGh5KTsKKwordm9pZCBoZGRfaXB2NF9ub3RpZmllcl93b3JrX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjaWZkZWYgV0xBTl9OU19PRkZMT0FECit2b2lkIGhkZF9pcHY2X25vdGlmaWVyX3dvcmtfcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3R4cG93ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkKKwkJCQkgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisjZW5kaWYKKwkJCQkgIGludCAqZGJtKTsKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA4LCAwKQorCQkJCSAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKyNlbmRpZgorCQkJCSAgZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgdHlwZSwKKwkJCQkgIGludCBkYm0pOworaW50IHdsYW5faGRkX2NmZzgwMjExX3NldF9wb3dlcl9tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIG1vZGUsCisJCQkJICAgICBpbnQgdGltZW91dCk7CisKK2ludCB3bGFuX2hkZF9pcHY0X2NoYW5nZWQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQl1bnNpZ25lZCBsb25nIGRhdGEsIHZvaWQgKmFyZyk7CisKK2ludCB3bGFuX2hkZF9pcHY2X2NoYW5nZWQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQl1bnNpZ25lZCBsb25nIGRhdGEsIHZvaWQgKmFyZyk7CisKKyNlbmRpZiAvKiBfX1dMQU5fSEREX1BPV0VSX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL2luYy93bGFuX2hkZF9zb2Z0YXBfdHhfcnguaCBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF9zb2Z0YXBfdHhfcnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDYxZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX3NvZnRhcF90eF9yeC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChXTEFOX0hERF9TT0ZUQVBfVFhfUlhfSCkKKyNkZWZpbmUgV0xBTl9IRERfU09GVEFQX1RYX1JYX0gKKworLyoqCisgKiBET0M6IHdsYW5faGRkX3NvZnRhcF90eF9yeC5oCisgKgorICpMaW51eCBIREQgU09GVEFQIFR4L1JYIEFQSXMKKyAqLworCisjaW5jbHVkZSA8d2xhbl9oZGRfaG9zdGFwZC5oPgorCitpbnQgaGRkX3NvZnRhcF9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgaGRkX3NvZnRhcF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworQ0RGX1NUQVRVUyBoZGRfc29mdGFwX2luaXRfdHhfcngoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworQ0RGX1NUQVRVUyBoZGRfc29mdGFwX2RlaW5pdF90eF9yeChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CitDREZfU1RBVFVTIGhkZF9zb2Z0YXBfaW5pdF90eF9yeF9zdGEoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgICB1aW50OF90IFNUQUlkLAorCQkJCSAgICAgc3RydWN0IGNkZl9tYWNfYWRkciAqcG1hY0FkZHJTVEEpOworQ0RGX1NUQVRVUyBoZGRfc29mdGFwX2RlaW5pdF90eF9yeF9zdGEoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgICAgIHVpbnQ4X3QgU1RBSWQpOworQ0RGX1NUQVRVUyBoZGRfc29mdGFwX3J4X3BhY2tldF9jYmsodm9pZCAqY2RzX2NvbnRleHQsCisJCQkJICAgIGNkZl9uYnVmX3QgcnhCdWZDaGFpbiwKKwkJCQkgICAgdWludDhfdCBzdGFJZCk7CisjaWZkZWYgSVBBX09GRkxPQUQKK0NERl9TVEFUVVMgaGRkX3NvZnRhcF9yeF9tdWxfcGFja2V0X2Niayh2b2lkICpjZHNfY29udGV4dCwKKwkJCQkJY2RmX25idWZfdCByeF9idWZfbGlzdCwgdWludDhfdCBzdGFJZCk7CisjZW5kaWYgLyogSVBBX09GRkxPQUQgKi8KKworQ0RGX1NUQVRVUyBoZGRfc29mdGFwX2RlcmVnaXN0ZXJfc3RhKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgICAgdWludDhfdCBzdGFJZCk7CitDREZfU1RBVFVTIGhkZF9zb2Z0YXBfcmVnaXN0ZXJfc3RhKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgIGJvb2wgZkF1dGhSZXF1aXJlZCwKKwkJCQkgICBib29sIGZQcml2YWN5Qml0LAorCQkJCSAgIHVpbnQ4X3Qgc3RhSWQsCisJCQkJICAgdWludDhfdCB1Y2FzdFNpZywKKwkJCQkgICB1aW50OF90IGJjYXN0U2lnLAorCQkJCSAgIHN0cnVjdCBjZGZfbWFjX2FkZHIgKnBQZWVyTWFjQWRkcmVzcywKKwkJCQkgICBib29sIGZXbW1FbmFibGVkKTsKK0NERl9TVEFUVVMgaGRkX3NvZnRhcF9yZWdpc3Rlcl9iY19zdGEoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgICAgYm9vbCBmUHJpdmFjeUJpdCk7CitDREZfU1RBVFVTIGhkZF9zb2Z0YXBfZGVyZWdpc3Rlcl9iY19zdGEoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworQ0RGX1NUQVRVUyBoZGRfc29mdGFwX3N0b3BfYnNzKGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlcik7CitDREZfU1RBVFVTIGhkZF9zb2Z0YXBfY2hhbmdlX3N0YV9zdGF0ZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICAgc3RydWN0IGNkZl9tYWNfYWRkciAqcERlc3RNYWNBZGRyZXNzLAorCQkJCSAgICAgICBlbnVtIG9sX3R4cnhfcGVlcl9zdGF0ZSBzdGF0ZSk7CitDREZfU1RBVFVTIGhkZF9zb2Z0YXBfZ2V0X3N0YV9pZChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgc3RydWN0IGNkZl9tYWNfYWRkciAqcE1hY0FkZHJlc3MsCisJCQkJIHVpbnQ4X3QgKnN0YUlkKTsKKworI2lmZGVmIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MCit2b2lkIGhkZF9zb2Z0YXBfdHhfcmVzdW1lX3RpbWVyX2V4cGlyZWRfaGFuZGxlcih2b2lkICphZGFwdGVyX2NvbnRleHQpOwordm9pZCBoZGRfc29mdGFwX3R4X3Jlc3VtZV9jYih2b2lkICphZGFwdGVyX2NvbnRleHQsIGJvb2wgdHhfcmVzdW1lKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lCit2b2lkIGhkZF9zb2Z0YXBfdHhfcmVzdW1lX3RpbWVyX2V4cGlyZWRfaGFuZGxlcih2b2lkICphZGFwdGVyX2NvbnRleHQpCit7CisJcmV0dXJuOworfQorc3RhdGljIGlubGluZQordm9pZCBoZGRfc29mdGFwX3R4X3Jlc3VtZV9jYih2b2lkICphZGFwdGVyX2NvbnRleHQsIGJvb2wgdHhfcmVzdW1lKQoreworCXJldHVybjsKK30KKyNlbmRpZiAvKiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCAqLworCisjZW5kaWYgLyogZW5kICNpZiAhZGVmaW5lZChXTEFOX0hERF9TT0ZUQVBfVFhfUlhfSCkgKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL2luYy93bGFuX2hkZF90ZGxzLmggYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfdGRscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NWJiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfdGRscy5oCkBAIC0wLDAgKzEsNjMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fSEREX1RETFNfSAorI2RlZmluZSBfX0hERF9URExTX0gKKy8qKgorICogRE9DOiB3bGFuX2hkZF90ZGxzLmgKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIFRETFMgaW5jbHVkZSBmaWxlCisgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisKKyNkZWZpbmUgVERMU19TVUJfRElTQ09WRVJZX1BFUklPRCAgIDEwMAorCisjZGVmaW5lIFRETFNfTUFYX0RJU0NPVkVSX1JFUVNfUEVSX1RJTUVSIDEKKworI2RlZmluZSBURExTX0RJU0NPVkVSWV9QRVJJT0QgICAgICAgMzYwMDAwMAorCisjZGVmaW5lIFRETFNfVFhfU1RBVFNfUEVSSU9EICAgICAgICAzNjAwMDAwCisKKyNkZWZpbmUgVERMU19JTVBMSUNJVF9UUklHR0VSX1BLVF9USFJFU0hPTEQgICAgIDEwMAorCisjZGVmaW5lIFRETFNfUlhfSURMRV9USU1FT1VUICAgICAgICA1MDAwCisKKyNkZWZpbmUgVERMU19SU1NJX1RSSUdHRVJfSFlTVEVSRVNJUyA1MAorCisvKgorICogQmVmb3JlIFVwZGF0ZVRpbWVyIGV4cGlyZXMsIHdlIHdhbnQgdG8gdGltZW91dCBkaXNjb3ZlcnkgcmVzcG9uc2UKKyAqIHNob3VsZCBub3QgYmUgbW9yZSB0aGFuIDIwMDAuCisgKi8KKyNkZWZpbmUgVERMU19ESVNDT1ZFUllfVElNRU9VVF9CRUZPUkVfVVBEQVRFICAgICAxMDAwCisKKyNkZWZpbmUgVERMU19DVFhfTUFHSUMgMHg1NDQ0NGM1MyAgICAgICAvKiAiVERMUyIgKi8KKworI2RlZmluZSBURExTX01BWF9TQ0FOX1NDSEVEVUxFICAgICAgICAgIDEwCisjZGVmaW5lIFRETFNfTUFYX1NDQU5fUkVKRUNUICAgICAgICAgICAgNQorI2RlZmluZSBURExTX0RFTEFZX1NDQU5fUEVSX0NPTk5FQ1RJT04gMTAwCisjZGVmaW5lIFRETFNfTUFYX0NPTk5FQ1RFRF9QRUVSU19UT19BTExPV19TQ0FOICAgMQorCisjZGVmaW5lIFRETFNfSVNfQ09OTkVDVEVEKHBlZXIpCSBcCisJKChlVERMU19MSU5LX0NPTk5FQ1RFRCA9PSAocGVlciktPmxpbmtfc3RhdHVzKSB8fCBcCisJIChlVERMU19MSU5LX1RFQVJJTkcgPT0gKHBlZXIpLT5saW5rX3N0YXR1cykpCisKKy8qIEJpdCBtYXNrIGZsYWcgZm9yIHRkbHNfb3B0aW9uIHRvIEZXICovCisjZGVmaW5lIEVOQV9URExTX09GRkNIQU4gICAgICAoMSA8PCAwKSAgLyogVERMUyBPZmYgQ2hhbm5lbCBzdXBwb3J0ICovCisjZGVmaW5lIEVOQV9URExTX0JVRkZFUl9TVEEgICAoMSA8PCAxKSAgLyogVERMUyBCdWZmZXIgU1RBIHN1cHBvcnQgKi8KKyNkZWZpbmUgRU5BX1RETFNfU0xFRVBfU1RBICAgICgxIDw8IDIpICAvKiBURExTIFNsZWVwIFNUQSBzdXBwb3J0ICovCisjZGVmaW5lIFRETFNfU0VDX09GRkNIQU5fT0ZGU0VUXzAgICAgICAgIDAKKyNkZWZpbmUgVERMU19TRUNfT0ZGQ0hBTl9PRkZTRVRfNDBQTFVTICAgNDAKKyNkZWZpbmUgVERMU19TRUNfT0ZGQ0hBTl9PRkZTRVRfNDBNSU5VUyAgKC00MCkKKyNkZWZpbmUgVERMU19TRUNfT0ZGQ0hBTl9PRkZTRVRfODAgICAgICAgODAKKyNkZWZpbmUgVERMU19TRUNfT0ZGQ0hBTl9PRkZTRVRfMTYwICAgICAgMTYwCisKKyNkZWZpbmUgVERMU19QRUVSX0xJU1RfU0laRSAgIDI1NgorCisjZGVmaW5lIEVYVFRETFNfRVZFTlRfQlVGX1NJWkUgKDQwOTYpCisKKy8qKgorICogc3RydWN0IHRkbHNfY29uZmlnX3BhcmFtc190IC0gdGRscyBjb25maWcgcGFyYW1zCisgKgorICogQHRkbHM6IHRkbHMKKyAqIEB0eF9wZXJpb2RfdDogdHggcGVyaW9kCisgKiBAdHhfcGFja2V0X246IHR4IHBhY2tldHMgbnVtYmVyCisgKiBAZGlzY292ZXJ5X3RyaWVzX246IGRpc2NvdmVyeSB0cmllcworICogQGlkbGVfcGFja2V0X246IGlkbGUgcGFja2V0IG51bWJlcgorICogQHJzc2lfdHJpZ2dlcl90aHJlc2hvbGQ6IHJzc2kgdHJpZ2dlciB0aHJlc2hvbGQKKyAqIEByc3NpX3RlYXJkb3duX3RocmVzaG9sZDogcnNzaSB0ZWFyIGRvd24gdGhyZXNob2xkCisgKiBAcnNzaV9kZWx0YTogcnNzaSBkZWx0YQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgdGRsczsKKwl1aW50MzJfdCB0eF9wZXJpb2RfdDsKKwl1aW50MzJfdCB0eF9wYWNrZXRfbjsKKwl1aW50MzJfdCBkaXNjb3ZlcnlfdHJpZXNfbjsKKwl1aW50MzJfdCBpZGxlX3BhY2tldF9uOworCWludDMyX3QgcnNzaV90cmlnZ2VyX3RocmVzaG9sZDsKKwlpbnQzMl90IHJzc2lfdGVhcmRvd25fdGhyZXNob2xkOworCWludDMyX3QgcnNzaV9kZWx0YTsKK30gdGRsc19jb25maWdfcGFyYW1zX3Q7CisKKy8qKgorICogc3RydWN0IHRkbHNfc2Nhbl9jb250ZXh0X3QgLSB0ZGxzIHNjYW4gY29udGV4dAorICoKKyAqIEB3aXBoeTogcG9pbnRlciB0byB3aXBoeSBzdHJ1Y3R1cmUKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0ZGV2CisgKiBAc2Nhbl9yZXF1ZXN0OiBzY2FuIHJlcXVlc3QKKyAqIEBtYWdpYzogbWFnaWMKKyAqIEBhdHRlbXB0OiBhdHRlbXB0CisgKiBAcmVqZWN0OiByZWplY3QKKyAqIEB0ZGxzX3NjYW5fd29yazogZGVsYXllZCB0ZGxzIHNjYW4gd29yaworICovCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHdpcGh5ICp3aXBoeTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyNlbmRpZgorCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnNjYW5fcmVxdWVzdDsKKwlpbnQgbWFnaWM7CisJaW50IGF0dGVtcHQ7CisJaW50IHJlamVjdDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHRkbHNfc2Nhbl93b3JrOworfSB0ZGxzX3NjYW5fY29udGV4dF90OworCisvKioKKyAqIGVudW0gZVRETFNTdXBwb3J0TW9kZSAtIHRkbHMgc3VwcG9ydCBtb2RlCisgKgorICogQGVURExTX1NVUFBPUlRfTk9UX0VOQUJMRUQ6IHRkbHMgc3VwcG9ydCBub3QgZW5hYmxlZAorICogQGVURExTX1NVUFBPUlRfRElTQUJMRUQ6IHN1cHByZXNzIGltcGxpY2l0IHRyaWdnZXIgYW5kIG5vdAorICoJCQlyZXNwb25kIHRvIHRoZSBwZWVyCisgKiBAZVRETFNfU1VQUE9SVF9FWFBMSUNJVF9UUklHR0VSX09OTFk6IHN1cHByZXNzIGltcGxpY2l0IHRyaWdnZXIsCisgKgkJCWJ1dCByZXNwb25kIHRvIHRoZSBwZWVyCisgKiBAZVRETFNfU1VQUE9SVF9FTkFCTEVEOiBpbXBsaWNpdCB0cmlnZ2VyCisgKi8KK3R5cGVkZWYgZW51bSB7CisJZVRETFNfU1VQUE9SVF9OT1RfRU5BQkxFRCA9IDAsCisJZVRETFNfU1VQUE9SVF9ESVNBQkxFRCwKKwllVERMU19TVVBQT1JUX0VYUExJQ0lUX1RSSUdHRVJfT05MWSwKKwllVERMU19TVVBQT1JUX0VOQUJMRUQsCit9IGVURExTU3VwcG9ydE1vZGU7CisKKy8qKgorICogZW51bSB0VERMU0NhcFR5cGUgLSB0ZGxzIGNhcGFiaWxpdHkgdHlwZQorICoKKyAqIEBlVERMU19DQVBfTk9UX1NVUFBPUlRFRDogdGRscyBub3Qgc3VwcG9ydGVkCisgKiBAZVRETFNfQ0FQX1VOS05PV046IHVua25vd24gY2FwYWJpbGl0eQorICogQGVURExTX0NBUF9TVVBQT1JURUQ6IHRkbHMgY2FwYWJpbGl0eSBzdXBwb3J0ZWQKKyAqLwordHlwZWRlZiBlbnVtIGVURExTQ2FwVHlwZSB7CisJZVRETFNfQ0FQX05PVF9TVVBQT1JURUQgPSAtMSwKKwllVERMU19DQVBfVU5LTk9XTiA9IDAsCisJZVRETFNfQ0FQX1NVUFBPUlRFRCA9IDEsCit9IHRURExTQ2FwVHlwZTsKKworLyoqCisgKiBlbnVtIHRURExTTGlua1N0YXR1cyAtIHRkbHMgbGluayBzdGF0dXMKKyAqCisgKiBAZVRETFNfTElOS19JRExFOiB0ZGxzIGxpbmsgaWRsZQorICogQGVURExTX0xJTktfRElTQ09WRVJJTkc6IHRkbHMgbGluayBkaXNjb3ZlcmluZworICogQGVURExTX0xJTktfRElTQ09WRVJFRDogdGRscyBsaW5rIGRpc2NvdmVyZWQKKyAqIEBlVERMU19MSU5LX0NPTk5FQ1RJTkc6IHRkbHMgbGluayBjb25uZWN0aW5nCisgKiBAZVRETFNfTElOS19DT05ORUNURUQ6IHRkbHMgbGluayBjb25uZWN0ZWQKKyAqIEBlVERMU19MSU5LX1RFQVJJTkc6IHRkbHMgbGluayB0ZWFyaW5nCisgKi8KK3R5cGVkZWYgZW51bSBlVERMU0xpbmtTdGF0dXMgeworCWVURExTX0xJTktfSURMRSA9IDAsCisJZVRETFNfTElOS19ESVNDT1ZFUklORywKKwllVERMU19MSU5LX0RJU0NPVkVSRUQsCisJZVRETFNfTElOS19DT05ORUNUSU5HLAorCWVURExTX0xJTktfQ09OTkVDVEVELAorCWVURExTX0xJTktfVEVBUklORywKK30gdFRETFNMaW5rU3RhdHVzOworCisvKioKKyAqIGVudW0gdFRETFNMaW5rUmVhc29uIC0gdGRscyBsaW5rIHJlYXNvbgorICoKKyAqIEBlVERMU19MSU5LX1NVQ0NFU1M6IFN1Y2Nlc3MKKyAqIEBlVERMU19MSU5LX1VOU1BFQ0lGSUVEOiBVbnNwZWNpZmllZCByZWFzb24KKyAqIEBlVERMU19MSU5LX05PVF9TVVBQT1JURUQ6IFJlbW90ZSBzaWRlIGRvZXNuJ3Qgc3VwcG9ydCBURExTCisgKiBAZVRETFNfTElOS19VTlNVUFBPUlRFRF9CQU5EOiBSZW1vdGUgc2lkZSBkb2Vzbid0IHN1cHBvcnQgdGhpcyBiYW5kCisgKiBAZVRETFNfTElOS19OT1RfQkVORUZJQ0lBTDogR29pbmcgdG8gQVAgaXMgYmV0dGVyIHRoYW4gZGlyZWN0CisgKiBAZVRETFNfTElOS19EUk9QUEVEX0JZX1JFTU9URTogUmVtb3RlIHNpZGUgZG9lc24ndCB3YW50IGl0IGFueW1vcmUKKyAqLwordHlwZWRlZiBlbnVtIHsKKwllVERMU19MSU5LX1NVQ0NFU1MsCisJZVRETFNfTElOS19VTlNQRUNJRklFRCA9IC0xLAorCWVURExTX0xJTktfTk9UX1NVUFBPUlRFRCA9IC0yLAorCWVURExTX0xJTktfVU5TVVBQT1JURURfQkFORCA9IC0zLAorCWVURExTX0xJTktfTk9UX0JFTkVGSUNJQUwgPSAtNCwKKwllVERMU19MSU5LX0RST1BQRURfQllfUkVNT1RFID0gLTUKK30gdFRETFNMaW5rUmVhc29uOworCisvKioKKyAqIHN0cnVjdCB0ZGxzX3JlcV9wYXJhbXNfdCAtIHRkbHMgcmVxdWVzdCBwYXJhbWV0ZXJzCisgKgorICogQGNoYW5uZWw6IGNoYW5uZWwgaGludCwgaW4gY2hhbm5lbCBudW1iZXIgKE5PVCBmcmVxdWVuY3kpCisgKiBAZ2xvYmFsX29wZXJhdGluZ19jbGFzczogb3BlcmF0aW5nIGNsYXNzIHRvIHVzZQorICogQG1heF9sYXRlbmN5X21zOiBtYXggbGF0ZW5jeSB0aGF0IGNhbiBiZSB0b2xlcmF0ZWQgYnkgYXBwcworICogQG1pbl9iYW5kd2lkdGhfa2JwczogYmFuZHdpZHRoIHJlcXVpcmVkIGJ5IGFwcHMsIGluIGtpbG8gYml0cyBwZXIgc2Vjb25kCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgZ2xvYmFsX29wZXJhdGluZ19jbGFzczsKKwlpbnQgbWF4X2xhdGVuY3lfbXM7CisJaW50IG1pbl9iYW5kd2lkdGhfa2JwczsKK30gdGRsc19yZXFfcGFyYW1zX3Q7CisKKy8qKgorICogZW51bSB0ZGxzX3N0YXRlX3QgLSB0ZGxzIHN0YXRlCisgKgorICogQFFDQV9XSUZJX0hBTF9URExTX0RJU0FCTEVEOiBURExTIGlzIG5vdCBlbmFibGVkLCBvciBpcyBkaXNhYmxlZCBub3cKKyAqIEBRQ0FfV0lGSV9IQUxfVERMU19FTkFCTEVEOiBURExTIGlzIGVuYWJsZWQsIGJ1dCBub3QgeWV0IHRyaWVkCisgKiBAUUNBX1dJRklfSEFMX1RETFNfRVNUQUJMSVNIRUQ6IERpcmVjdCBsaW5rIGlzIGVzdGFibGlzaGVkCisgKiBAUUNBX1dJRklfSEFMX1RETFNfRVNUQUJMSVNIRURfT0ZGX0NIQU5ORUw6IERpcmVjdCBsaW5rIGVzdGFibGlzaGVkIHVzaW5nIE1DQworICogQFFDQV9XSUZJX0hBTF9URExTX0RST1BQRUQ6IERpcmVjdCBsaW5rIHdhcyBlc3RhYmxpc2hlZCwgYnV0IGlzIG5vdyBkcm9wcGVkCisgKiBAUUNBX1dJRklfSEFMX1RETFNfRkFJTEVEOiBEaXJlY3QgbGluayBmYWlsZWQKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlRQ0FfV0lGSV9IQUxfVERMU19ESVNBQkxFRCA9IDEsCisJUUNBX1dJRklfSEFMX1RETFNfRU5BQkxFRCwKKwlRQ0FfV0lGSV9IQUxfVERMU19FU1RBQkxJU0hFRCwKKwlRQ0FfV0lGSV9IQUxfVERMU19FU1RBQkxJU0hFRF9PRkZfQ0hBTk5FTCwKKwlRQ0FfV0lGSV9IQUxfVERMU19EUk9QUEVELAorCVFDQV9XSUZJX0hBTF9URExTX0ZBSUxFRAorfSB0ZGxzX3N0YXRlX3Q7CisKK3R5cGVkZWYgaW50ICgqY2ZnODAyMTFfZXh0dGRsc19jYWxsYmFjaykoY29uc3QgdWludDhfdCAqbWFjLAorCQkJCQkgdWludDMyX3Qgc3RhdGUsCisJCQkJCSBpbnQzMl90IHJlYXNvbiwgdm9pZCAqY3R4KTsKKworLyoqCisgKiBzdHJ1Y3QgdGRsc190eF90cHV0X2NvbmZpZ190IC0gdGRscyB0eCB0aHJvdWdocHV0IGNvbmZpZworICoKKyAqIEBwZXJpb2Q6IHBlcmlvZAorICogQGJ5dGVzOiBieXRlcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgcGVyaW9kOworCXVpbnQxNl90IGJ5dGVzOworfSB0ZGxzX3R4X3RwdXRfY29uZmlnX3Q7CisKKy8qKgorICogc3RydWN0IHRkbHNfZGlzY292ZXJ5X2NvbmZpZ190IC0gdGRscyBkaXNjb3ZlcnkgY29uZmlnCisgKgorICogQHBlcmlvZDogcGVyaW9kCisgKiBAdHJpZXM6IG51bWJlciBvZiB0cmllcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgcGVyaW9kOworCXVpbnQxNl90IHRyaWVzOworfSB0ZGxzX2Rpc2NvdmVyeV9jb25maWdfdDsKKworLyoqCisgKiBzdHJ1Y3QgdGRsc19yeF9pZGxlX2NvbmZpZ190IC0gdGRscyByeCBpZGxlIGNvbmZpZworICoKKyAqIEB0aW1lb3V0OiB0aW1lb3V0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCB0aW1lb3V0OworfSB0ZGxzX3J4X2lkbGVfY29uZmlnX3Q7CisKKy8qKgorICogc3RydWN0IHRkbHNfcnNzaV9jb25maWdfdCAtIHRkbHMgcnNzaSBjb25maWcKKyAqCisgKiBAcnNzaV90aHJlczogcnNzaV90aHJlcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgcnNzaV90aHJlczsKK30gdGRsc19yc3NpX2NvbmZpZ190OworCitzdHJ1Y3QgX2hkZFRkbHNQZWVyX3Q7CisKKy8qKgorICogc3RydWN0IHRkbHNDdHhfdCAtIHRkbHMgY29udGV4dAorICoKKyAqIEBwZWVyX2xpc3Q6IHBlZXIgbGlzdAorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwZWVyRGlzY292ZXJUaW1lcjogcGVlciBkaXNjb3ZlcnkgdGltZXIKKyAqIEBwZWVyRGlzY292ZXJ5VGltZW91dFRpbWVyOiBwZWVyIGRpc2NvdmVyeSB0aW1lb3V0IHRpbWVyCisgKiBAdGhyZXNob2xkX2NvbmZpZzogdGhyZXNob2xkIGNvbmZpZworICogQGRpc2NvdmVyeV9wZWVyX2NudDogZGlzY292ZXJ5IHBlZXIgY291bnQKKyAqIEBkaXNjb3Zlcnlfc2VudF9jbnQ6IGRpc2NvdmVyeSBzZW50IGNvdW50CisgKiBAYXBfcnNzaTogYXAgcnNzaQorICogQGN1cnJfY2FuZGlkYXRlOiBjdXJyZW50IGNhbmRpZGF0ZQorICogQGltcGxpY2l0X3NldHVwOiBpbXBsaWNpdCBzZXR1cCB3b3JrIHF1ZXVlCisgKiBAbWFnaWM6IG1hZ2ljCisgKgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IGxpc3RfaGVhZCBwZWVyX2xpc3RbVERMU19QRUVSX0xJU1RfU0laRV07CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJY2RmX21jX3RpbWVyX3QgcGVlckRpc2NvdmVyeVRpbWVvdXRUaW1lcjsKKwl0ZGxzX2NvbmZpZ19wYXJhbXNfdCB0aHJlc2hvbGRfY29uZmlnOworCWludDMyX3QgZGlzY292ZXJ5X3BlZXJfY250OworCXVpbnQzMl90IGRpc2NvdmVyeV9zZW50X2NudDsKKwlpbnQ4X3QgYXBfcnNzaTsKKwlzdHJ1Y3QgX2hkZFRkbHNQZWVyX3QgKmN1cnJfY2FuZGlkYXRlOworCXN0cnVjdCB3b3JrX3N0cnVjdCBpbXBsaWNpdF9zZXR1cDsKKwl1aW50MzJfdCBtYWdpYzsKK30gdGRsc0N0eF90OworCisvKioKKyAqIHN0cnVjdCBoZGRUZGxzUGVlcl90IC0gdGRscyBwZWVyIGRhdGEKKyAqCisgKiBAbm9kZTogbm9kZQorICogQHBIZGRUZGxzQ3R4OiBwb2ludGVyIHRvIHRkbHMgY29udGV4dAorICogQHBlZXJNYWM6IHBlZXIgbWFjIGFkZHJlc3MKKyAqIEBzdGFJZDogc3RhdGlvbiBpZGVudGlmaWVyCisgKiBAcnNzaTogcnNzaQorICogQHRkbHNfc3VwcG9ydDogdGRscyBzdXBwb3J0CisgKiBAbGlua19zdGF0dXM6IHRkbHMgbGluayBzdGF0dXMKKyAqIEBzaWduYXR1cmU6IHNpZ25hdHVyZQorICogQGlzX3Jlc3BvbmRlcjogaXMgcmVzcG9uZGVyCisgKiBAZGlzY292ZXJ5X3Byb2Nlc3NlZDogZGlzY292ZXJ5IHByb2Nlc3NlZCBmbGFnCisgKiBAZGlzY292ZXJ5X2F0dGVtcHQ6IGRpc2NvdmVyeSBhdHRlbXB0CisgKiBAdHhfcGt0OiB0eCBwYWNrZXQKKyAqIEByeF9wa3Q6IHJ4IHBhY2tldAorICogQHVhcHNkUXVldWVzOiB1YXBzZCBxdWV1ZXMKKyAqIEBtYXhTcDogbWF4IHNwCisgKiBAaXNCdWZTdGE6IGlzIGJ1ZmZlciBzdGEKKyAqIEBpc09mZkNoYW5uZWxTdXBwb3J0ZWQ6IGlzIG9mZmNoYW5uZWwgc3VwcG9ydGVkIGZsYWcKKyAqIEBzdXBwb3J0ZWRfY2hhbm5lbHNfbGVuOiBzdXBwb3J0ZWQgY2hhbm5lbHMgbGVuZ3RoCisgKiBAc3VwcG9ydGVkX2NoYW5uZWxzOiBzdXBwb3J0ZWQgY2hhbm5lbHMKKyAqIEBzdXBwb3J0ZWRfb3Blcl9jbGFzc2VzX2xlbjogc3VwcG9ydGVkIG9wZXJhdGlvbiBjbGFzc2VzIGxlbmd0aAorICogQHN1cHBvcnRlZF9vcGVyX2NsYXNzZXM6IHN1cHBvcnRlZCBvcGVyYXRpb24gY2xhc3NlcworICogQGlzRm9yY2VkUGVlcjogaXMgZm9yY2VkIHBlZXIKKyAqIEBvcF9jbGFzc19mb3JfcHJlZl9vZmZfY2hhbjogb3AgY2xhc3MgZm9yIHByZWZlcnJlZCBvZmYgY2hhbm5lbAorICogQHByZWZfb2ZmX2NoYW5fbnVtOiBwcmVmZXJyZWQgb2ZmIGNoYW5uZWwgbnVtYmVyCisgKiBAb3BfY2xhc3NfZm9yX3ByZWZfb2ZmX2NoYW5faXNfc2V0OiBvcCBjbGFzcyBmb3IgcHJlZmVycmVkIG9mZiBjaGFubmVsIHNldAorICogQHJlYXNvbjogcmVhc29uCisgKiBAc3RhdGVfY2hhbmdlX25vdGlmaWNhdGlvbjogc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCBfaGRkVGRsc1BlZXJfdCB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHg7CisJdFNpck1hY0FkZHIgcGVlck1hYzsKKwl1aW50MTZfdCBzdGFJZDsKKwlpbnQ4X3QgcnNzaTsKKwl0VERMU0NhcFR5cGUgdGRsc19zdXBwb3J0OworCXRURExTTGlua1N0YXR1cyBsaW5rX3N0YXR1czsKKwl1aW50OF90IHNpZ25hdHVyZTsKKwl1aW50OF90IGlzX3Jlc3BvbmRlcjsKKwl1aW50OF90IGRpc2NvdmVyeV9wcm9jZXNzZWQ7CisJdWludDE2X3QgZGlzY292ZXJ5X2F0dGVtcHQ7CisJdWludDE2X3QgdHhfcGt0OworCXVpbnQxNl90IHJ4X3BrdDsKKwl1aW50OF90IHVhcHNkUXVldWVzOworCXVpbnQ4X3QgbWF4U3A7CisJdWludDhfdCBpc0J1ZlN0YTsKKwl1aW50OF90IGlzT2ZmQ2hhbm5lbFN1cHBvcnRlZDsKKwl1aW50OF90IHN1cHBvcnRlZF9jaGFubmVsc19sZW47CisJdWludDhfdCBzdXBwb3J0ZWRfY2hhbm5lbHNbU0lSX01BQ19NQVhfU1VQUF9DSEFOTkVMU107CisJdWludDhfdCBzdXBwb3J0ZWRfb3Blcl9jbGFzc2VzX2xlbjsKKwl1aW50OF90IHN1cHBvcnRlZF9vcGVyX2NsYXNzZXNbU0lSX01BQ19NQVhfU1VQUF9PUEVSX0NMQVNTRVNdOworCWJvb2wgaXNGb3JjZWRQZWVyOworCXVpbnQ4X3Qgb3BfY2xhc3NfZm9yX3ByZWZfb2ZmX2NoYW47CisJdWludDhfdCBwcmVmX29mZl9jaGFuX251bTsKKwl1aW50OF90IG9wX2NsYXNzX2Zvcl9wcmVmX29mZl9jaGFuX2lzX3NldDsKKwl0VERMU0xpbmtSZWFzb24gcmVhc29uOworCWNmZzgwMjExX2V4dHRkbHNfY2FsbGJhY2sgc3RhdGVfY2hhbmdlX25vdGlmaWNhdGlvbjsKK30gaGRkVGRsc1BlZXJfdDsKKworLyoqCisgKiBzdHJ1Y3QgdGRsc0Nvbm5JbmZvX3QgLSB0ZGxzIGNvbm5lY3Rpb24gaW5mbworICoKKyAqIEBzZXNzaW9uSWQ6IFNlc3Npb24gSUQKKyAqIEBzdGFJZDogVERMUyBwZWVyIHN0YXRpb24gaWQKKyAqIEBwZWVyTWFjOiBwZWVyIG1hYyBhZGRyZXNzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IHN0YUlkOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgcGVlck1hYzsKK30gdGRsc0Nvbm5JbmZvX3Q7CisKKy8qKgorICogc3RydWN0IHRkbHNJbmZvX3QgLSB0ZGxzIGluZm8KKyAqCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHRkbHNfc3RhdGU6IHRkbHMgc3RhdGUKKyAqIEBub3RpZmljYXRpb25faW50ZXJ2YWxfbXM6IG5vdGlmaWNhdGlvbiBpbnRlcnZhbCBpbiBtcworICogQHR4X2Rpc2NvdmVyeV90aHJlc2hvbGQ6IHR4IGRpc2NvdmVyeSB0aHJlc2hvbGQKKyAqIEB0eF90ZWFyZG93bl90aHJlc2hvbGQ6IHR4IHRlYXJkb3duIHRocmVzaG9sZAorICogQHJzc2lfdGVhcmRvd25fdGhyZXNob2xkOiByeCB0ZWFyZG93biB0aHJlc2hvbGQKKyAqIEByc3NpX2RlbHRhOiByc3NpIGRlbHRhCisgKiBAdGRsc19vcHRpb25zOiB0ZGxzIG9wdGlvbnMKKyAqIEBwZWVyX3RyYWZmaWNfaW5kX3dpbmRvdzogcGVlciB0cmFmZmljIGluZGljYXRpb24gd2luZG93CisgKiBAcGVlcl90cmFmZmljX3Jlc3BvbnNlX3RpbWVvdXQ6IHBlZXIgdHJhZmZpYyByZXNwb25zZSB0aW1lb3V0CisgKiBAcHVhcHNkX21hc2s6IHB1YXBzZCBtYXNrCisgKiBAcHVhcHNkX2luYWN0aXZpdHlfdGltZTogcHVhcHNkIGluYWN0aXZpdHkgdGltZQorICogQHB1YXBzZF9yeF9mcmFtZV90aHJlc2hvbGQ6IHB1YXBzZCByeCBmcmFtZSB0aHJlc2hvbGQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3QgdGRsc19zdGF0ZTsKKwl1aW50MzJfdCBub3RpZmljYXRpb25faW50ZXJ2YWxfbXM7CisJdWludDMyX3QgdHhfZGlzY292ZXJ5X3RocmVzaG9sZDsKKwl1aW50MzJfdCB0eF90ZWFyZG93bl90aHJlc2hvbGQ7CisJaW50MzJfdCByc3NpX3RlYXJkb3duX3RocmVzaG9sZDsKKwlpbnQzMl90IHJzc2lfZGVsdGE7CisJdWludDMyX3QgdGRsc19vcHRpb25zOworCXVpbnQzMl90IHBlZXJfdHJhZmZpY19pbmRfd2luZG93OworCXVpbnQzMl90IHBlZXJfdHJhZmZpY19yZXNwb25zZV90aW1lb3V0OworCXVpbnQzMl90IHB1YXBzZF9tYXNrOworCXVpbnQzMl90IHB1YXBzZF9pbmFjdGl2aXR5X3RpbWU7CisJdWludDMyX3QgcHVhcHNkX3J4X2ZyYW1lX3RocmVzaG9sZDsKK30gdGRsc0luZm9fdDsKKworaW50IHdsYW5faGRkX3RkbHNfaW5pdChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKK3ZvaWQgd2xhbl9oZGRfdGRsc19leGl0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKKwordm9pZCB3bGFuX2hkZF90ZGxzX2V4dHJhY3RfZGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDhfdCAqbWFjKTsKKwordm9pZCB3bGFuX2hkZF90ZGxzX2V4dHJhY3Rfc2Eoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDhfdCAqbWFjKTsKKworaW50IHdsYW5faGRkX3RkbHNfaW5jcmVtZW50X3BrdF9jb3VudChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICBjb25zdCB1aW50OF90ICptYWMsIHVpbnQ4X3QgdHgpOworCitpbnQgd2xhbl9oZGRfdGRsc19zZXRfc3RhX2lkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBjb25zdCB1aW50OF90ICptYWMsCisJCQkgICAgIHVpbnQ4X3Qgc3RhSWQpOworCitoZGRUZGxzUGVlcl90ICp3bGFuX2hkZF90ZGxzX2ZpbmRfcGVlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICAgY29uc3QgdWludDhfdCAqbWFjLCBib29sIG11dGV4TG9jayk7CisKK2hkZFRkbHNQZWVyX3QgKndsYW5faGRkX3RkbHNfZmluZF9hbGxfcGVlcihoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJCQkgICBjb25zdCB1aW50OF90ICptYWMpOworCitpbnQgd2xhbl9oZGRfdGRsc19nZXRfbGlua19lc3RhYmxpc2hfcGFyYW1zKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkgICAgY29uc3QgdWludDhfdCAqbWFjLAorCQkJCQkgICAgdENzclRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zICoKKwkJCQkJICAgIHRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zKTsKK2hkZFRkbHNQZWVyX3QgKndsYW5faGRkX3RkbHNfZ2V0X3BlZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgICAgY29uc3QgdWludDhfdCAqbWFjKTsKKworaW50IHdsYW5faGRkX3RkbHNfc2V0X2NhcChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgY29uc3QgdWludDhfdCAqbWFjLAorCQkJICB0VERMU0NhcFR5cGUgY2FwKTsKKwordm9pZCB3bGFuX2hkZF90ZGxzX3NldF9wZWVyX2xpbmtfc3RhdHVzKGhkZFRkbHNQZWVyX3QgKmN1cnJfcGVlciwKKwkJCQkJdFRETFNMaW5rU3RhdHVzIHN0YXR1cywKKwkJCQkJdFRETFNMaW5rUmVhc29uIHJlYXNvbik7Cit2b2lkIHdsYW5faGRkX3RkbHNfc2V0X2xpbmtfc3RhdHVzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgIGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQkgICB0VERMU0xpbmtTdGF0dXMgbGlua1N0YXR1cywKKwkJCQkgICB0VERMU0xpbmtSZWFzb24gcmVhc29uKTsKKworaW50IHdsYW5faGRkX3RkbHNfcmVjdl9kaXNjb3ZlcnlfcmVzcChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICBjb25zdCB1aW50OF90ICptYWMpOworCitpbnQgd2xhbl9oZGRfdGRsc19zZXRfcGVlcl9jYXBzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCWNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQl0Q3NyU3RhUGFyYW1zICpTdGFQYXJhbXMsCisJCQkJYm9vbCBpc0J1ZlN0YSwgYm9vbCBpc09mZkNoYW5uZWxTdXBwb3J0ZWQpOworCitpbnQgd2xhbl9oZGRfdGRsc19zZXRfcnNzaShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgY29uc3QgdWludDhfdCAqbWFjLAorCQkJICAgaW50OF90IHJ4UnNzaSk7CisKK2ludCB3bGFuX2hkZF90ZGxzX3NldF9yZXNwb25kZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQl1aW50OF90IHJlc3BvbmRlcik7CisKK2ludCB3bGFuX2hkZF90ZGxzX3NldF9zaWduYXR1cmUoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQl1aW50OF90IHVTaWduYXR1cmUpOworCitpbnQgd2xhbl9oZGRfdGRsc19zZXRfcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHRkbHNfY29uZmlnX3BhcmFtc190ICpjb25maWcpOworCitpbnQgd2xhbl9oZGRfdGRsc19yZXNldF9wZWVyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBjb25zdCB1aW50OF90ICptYWMpOworCit1aW50MTZfdCB3bGFuX2hkZF90ZGxzX2Nvbm5lY3RlZF9wZWVycyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKK2ludCB3bGFuX2hkZF90ZGxzX2dldF9hbGxfcGVlcnMoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNoYXIgKmJ1ZiwKKwkJCQlpbnQgYnVmbGVuKTsKKwordm9pZCB3bGFuX2hkZF90ZGxzX2Nvbm5lY3Rpb25fY2FsbGJhY2soaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCit2b2lkIHdsYW5faGRkX3RkbHNfZGlzY29ubmVjdGlvbl9jYWxsYmFjayhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKK3ZvaWQgd2xhbl9oZGRfdGRsc19tZ210X2NvbXBsZXRpb25fY2FsbGJhY2soaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCSAgICB1aW50MzJfdCBzdGF0dXNDb2RlKTsKKwordm9pZCB3bGFuX2hkZF90ZGxzX3RuY3JlbWVudF9wZWVyX2NvdW50KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKKwordm9pZCB3bGFuX2hkZF90ZGxzX2RlY3JlbWVudF9wZWVyX2NvdW50KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKKworaGRkVGRsc1BlZXJfdCAqd2xhbl9oZGRfdGRsc19pc19wcm9ncmVzcyhoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJCQkgY29uc3QgdWludDhfdCAqbWFjLCB1aW50OF90IHNraXBfc2VsZik7CisKK2ludCB3bGFuX2hkZF90ZGxzX2NvcHlfc2Nhbl9jb250ZXh0KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJICAgIHN0cnVjdCB3aXBoeSAqd2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorI2VuZGlmCisJCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QpOworCitpbnQgd2xhbl9oZGRfdGRsc19zY2FuX2NhbGxiYWNrKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorI2VuZGlmCisJCQkJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCk7CisKK3ZvaWQgd2xhbl9oZGRfdGRsc19zY2FuX2RvbmVfY2FsbGJhY2soaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCit2b2lkIHdsYW5faGRkX3RkbHNfdGltZXJfcmVzdGFydChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgY2RmX21jX3RpbWVyX3QgKnRpbWVyLAorCQkJCSB1aW50MzJfdCBleHBpcmF0aW9uVGltZSk7Cit2b2lkIHdsYW5faGRkX3RkbHNfaW5kaWNhdGVfdGVhcmRvd24oaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgICBoZGRUZGxzUGVlcl90ICpjdXJyX3BlZXIsCisJCQkJICAgICB1aW50MTZfdCByZWFzb24pOworCit2b2lkIHdsYW5faGRkX3RkbHNfcHJlX3NldHVwX2luaXRfd29yayh0ZGxzQ3R4X3QgKnBIZGRUZGxzQ3R4LAorCQkJCSAgICAgICBoZGRUZGxzUGVlcl90ICpjdXJyX2NhbmRpZGF0ZSk7CisKK2ludCB3bGFuX2hkZF90ZGxzX3NldF9leHRjdHJsX3BhcmFtKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgICBjb25zdCB1aW50OF90ICptYWMsCisJCQkJICAgIHVpbnQzMl90IGNoYW4sCisJCQkJICAgIHVpbnQzMl90IG1heF9sYXRlbmN5LAorCQkJCSAgICB1aW50MzJfdCBvcF9jbGFzcywgdWludDMyX3QgbWluX2JhbmR3aWR0aCk7CitpbnQgd2xhbl9oZGRfdGRsc19zZXRfZm9yY2VfcGVlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgY29uc3QgdWludDhfdCAqbWFjLAorCQkJCSBib29sIGZvcmNlUGVlcik7CisKK2ludCB3bGFuX2hkZF90ZGxzX2V4dGN0cmxfZGVjb25maWdfcGVlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJY29uc3QgdWludDhfdCAqcGVlcik7CitpbnQgd2xhbl9oZGRfdGRsc19leHRjdHJsX2NvbmZpZ19wZWVyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgICAgIGNvbnN0IHVpbnQ4X3QgKnBlZXIsCisJCQkJICAgICAgY2ZnODAyMTFfZXh0dGRsc19jYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgICAgICB1aW50MzJfdCBjaGFuLAorCQkJCSAgICAgIHVpbnQzMl90IG1heF9sYXRlbmN5LAorCQkJCSAgICAgIHVpbnQzMl90IG9wX2NsYXNzLAorCQkJCSAgICAgIHVpbnQzMl90IG1pbl9iYW5kd2lkdGgpOworaW50IHdsYW5faGRkX3RkbHNfZ2V0X3N0YXR1cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCSAgICAgY29uc3QgdWludDhfdCAqbWFjLCBpbnQzMl90ICpzdGF0ZSwKKwkJCSAgICAgaW50MzJfdCAqcmVhc29uKTsKK3ZvaWQgd2xhbl9oZGRfdGRsc19nZXRfd2lmaV9oYWxfc3RhdGUoaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyLAorCQkJCSAgICAgIGludDMyX3QgKnN0YXRlLCBpbnQzMl90ICpyZWFzb24pOworaW50IHdsYW5faGRkX3NldF9jYWxsYmFjayhoZGRUZGxzUGVlcl90ICpjdXJyX3BlZXIsCisJCQkgIGNmZzgwMjExX2V4dHRkbHNfY2FsbGJhY2sgY2FsbGJhY2spOwordm9pZCB3bGFuX2hkZF91cGRhdGVfdGRsc19pbmZvKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIGJvb2wgdGRsc19wcm9oaWJpdGVkLAorCQkJICAgICAgIGJvb2wgdGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZCk7CisKK2ludCB3bGFuX2hkZF90ZGxzX2FkZF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1aW50OF90ICptYWMsCisJCQkgICAgICBib29sIHVwZGF0ZSwgdENzclN0YVBhcmFtcyAqU3RhUGFyYW1zKTsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX2V4dHRkbHNfZW5hYmxlKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgIGludCBkYXRhX2xlbik7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2Rpc2FibGUoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICAgaW50IGRhdGFfbGVuKTsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX2V4dHRkbHNfZ2V0X3N0YXR1cyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSBpbnQgZGF0YV9sZW4pOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19vcGVyKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQljb25zdCB1aW50OF90ICpwZWVyLAorCQkJCWVudW0gbmw4MDIxMV90ZGxzX29wZXJhdGlvbiBvcGVyKTsKKyNlbHNlCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19vcGVyKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQl1aW50OF90ICpwZWVyLAorCQkJCWVudW0gbmw4MDIxMV90ZGxzX29wZXJhdGlvbiBvcGVyKTsKKyNlbmRpZgorCisjaWZkZWYgVERMU19NR01UX1ZFUlNJT04yCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnBlZXIsCisJCQkJdTggYWN0aW9uX2NvZGUsIHU4IGRpYWxvZ190b2tlbiwKKwkJCQl1MTYgc3RhdHVzX2NvZGUsIHUzMiBwZWVyX2NhcGFiaWxpdHksCisJCQkJY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbik7CisjZWxzZQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTcsIDApKQoraW50IHdsYW5faGRkX2NmZzgwMjExX3RkbHNfbWdtdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHVpbnQ4X3QgKnBlZXIsCisJCQkJdWludDhfdCBhY3Rpb25fY29kZSwgdWludDhfdCBkaWFsb2dfdG9rZW4sCisJCQkJdWludDE2X3Qgc3RhdHVzX2NvZGUsIHVpbnQzMl90IHBlZXJfY2FwYWJpbGl0eSwKKwkJCQlib29sIGluaXRpYXRvciwgY29uc3QgdWludDhfdCAqYnVmLAorCQkJCXNpemVfdCBsZW4pOworI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdWludDhfdCAqcGVlciwKKwkJCQl1aW50OF90IGFjdGlvbl9jb2RlLCB1aW50OF90IGRpYWxvZ190b2tlbiwKKwkJCQl1aW50MTZfdCBzdGF0dXNfY29kZSwgdWludDMyX3QgcGVlcl9jYXBhYmlsaXR5LAorCQkJCWNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbik7CisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE1LCAwKSkKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV90ZGxzX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1aW50OF90ICpwZWVyLAorCQkJCXVpbnQ4X3QgYWN0aW9uX2NvZGUsIHVpbnQ4X3QgZGlhbG9nX3Rva2VuLAorCQkJCXVpbnQxNl90IHN0YXR1c19jb2RlLCB1aW50MzJfdCBwZWVyX2NhcGFiaWxpdHksCisJCQkJY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3QgbGVuKTsKKyNlbHNlCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDhfdCAqcGVlciwKKwkJCQl1aW50OF90IGFjdGlvbl9jb2RlLCB1aW50OF90IGRpYWxvZ190b2tlbiwKKwkJCQl1aW50MTZfdCBzdGF0dXNfY29kZSwgY29uc3QgdWludDhfdCAqYnVmLAorCQkJCXNpemVfdCBsZW4pOworI2VuZGlmCisjZW5kaWYKKwordm9pZCBoZGRfdGRsc19ub3RpZnlfbW9kZV9jaGFuZ2UoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQloZGRfY29udGV4dF90ICpoZGRjdHgpOwordm9pZCB3bGFuX2hkZF90ZGxzX2Rpc2FibGVfb2ZmY2hhbl9hbmRfdGVhcmRvd25fbGlua3MoaGRkX2NvbnRleHRfdCAqaGRkY3R4KTsKKworaGRkVGRsc1BlZXJfdCAqd2xhbl9oZGRfdGRsc19maW5kX2ZpcnN0X2Nvbm5lY3RlZF9wZWVyKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpOworaW50IGhkZF9zZXRfdGRsc19vZmZjaGFubmVsKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGludCBvZmZjaGFubmVsKTsKK2ludCBoZGRfc2V0X3RkbHNfc2Vjb2ZmY2hhbm5lbG9mZnNldChoZGRfY29udGV4dF90ICpoZGRfY3R4LCBpbnQgb2ZmY2hhbm9mZnNldCk7CitpbnQgaGRkX3NldF90ZGxzX29mZmNoYW5uZWxtb2RlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBvZmZjaGFubW9kZSk7CitpbnQgaGRkX3NldF90ZGxzX3NjYW5fdHlwZShoZGRfY29udGV4dF90ICpoZGRfY3R4LCBpbnQgdmFsKTsKKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZGRfdGRsc19ub3RpZnlfbW9kZV9jaGFuZ2UoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQloZGRfY29udGV4dF90ICpoZGRjdHgpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQKK3dsYW5faGRkX3RkbHNfZGlzYWJsZV9vZmZjaGFuX2FuZF90ZWFyZG93bl9saW5rcyhoZGRfY29udGV4dF90ICpoZGRjdHgpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgd2xhbl9oZGRfdGRsc19leGl0KGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7Cit9CisjZW5kaWYgLyogRW5kIG9mIEZFQVRVUkVfV0xBTl9URExTICovCisKKyNlbmRpZiAvKiBfX0hERF9URExTX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL2luYy93bGFuX2hkZF90cmFjZS5oIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyMDgxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF90cmFjZS5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fV0xBTl9IRERfVFJBQ0VfSF9fCisjZGVmaW5lIF9fV0xBTl9IRERfVFJBQ0VfSF9fCisKKyNpbmNsdWRlICJtYWNfdHJhY2UuaCIKKworI2RlZmluZSBOT19TRVNTSU9OIDB4RkYKKworI3VuZGVmIEVOVU1TCisjZGVmaW5lIEVOVU1TIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX09QRU5fUkVRVUVTVCkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfU1RPUF9SRVFVRVNUKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9UWF9USU1FT1VUKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9QMlBfREVWX0FERFJfSU9DVEwpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX1NFVFNVU1BFTkRNT0RFX0lPQ1RMKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9TRVRST0FNVFJJR0dFUl9JT0NUTCkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfR0VUUk9BTVRSSUdHRVJfSU9DVEwpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX1NFVFJPQU1TQ0FOUEVSSU9EX0lPQ1RMKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9HRVRST0FNU0NBTlBFUklPRF9JT0NUTCkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfU0VUUk9BTURFTFRBX0lPQ1RMKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9HRVRST0FNREVMVEFfSU9DVEwpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0dFVEJBTkRfSU9DVEwpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0dFVENPVU5UUllSRVZfSU9DVEwpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX1NFVFJPQU1TQ0FOQ0hBTk5FTFNfSU9DVEwpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0dFVFJPQU1TQ0FOQ0hBTk5FTFNfSU9DVEwpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0hPU1RBUERfT1BFTl9SRVFVRVNUKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9IT1NUQVBEX1NUT1BfUkVRVUVTVCkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfSE9TVEFQRF9VTklOSVRfUkVRVUVTVCkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfU09GVEFQX1RYX1RJTUVPVVQpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0hPU1RBUERfU0VUX01BQ19BRERSKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9IT1NUQVBEX1AyUF9TRVRfTk9BX0lPQ1RMKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9IT1NUQVBEX1AyUF9TRVRfUFNfSU9DVEwpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0hPU1RBUERfU0VUX1NBUF9DSEFOTkVMX0xJU1RfSU9DVEwpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0FERF9WSVJUVUFMX0lOVEYpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0RFTF9WSVJUVUFMX0lOVEYpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0NIQU5HRV9WSVJUVUFMX0lOVEYpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0NGRzgwMjExX1NUQVJUX0FQKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9DSEFOR0VfQkVBQ09OKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9TVE9QX0FQKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9DSEFOR0VfQlNTKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9BRERfS0VZKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9HRVRfS0VZKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9TRVRfREVGQVVMVF9LRVkpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0NPTk5FQ1QpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0RJU0NPTk5FQ1QpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0pPSU5fSUJTUykgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfTEVBVkVfSUJTUykgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0VUX1dJUEhZX1BBUkFNUykgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0VUX1RYUE9XRVIpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0dFVF9UWFBPV0VSKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9TRVRfQ0hBTk5FTCkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfQUREX0JFQUNPTikgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0VUX0JFQUNPTikgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfQ0hBTkdFX0lGQUNFKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DSEFOR0VfU1RBVElPTikgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfVVBEQVRFX0JTUykgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0NBTikgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfUkVNQUlOX09OX0NIQU5ORUwpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX1JFTUFJTkNIQU5SRUFEWUhBTkRMRVIpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0NBTkNFTF9SRU1BSU5fT05fQ0hBTk5FTCkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQUNUSU9OKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9NR01UX1RYX0NBTkNFTF9XQUlUKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9HRVRfU1RBKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9TRVRfUE9XRVJfTUdNVCkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfREVMX1NUQSkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfQUREX1NUQSkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0VUX1BNS1NBKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9VUERBVEVfRlRfSUVTKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9URExTX01HTVQpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0NGRzgwMjExX1RETFNfT1BFUikgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0VUX1JFS0VZX0RBVEEpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX1VOU1VQUE9SVEVEX0lPQ1RMKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9TRVRST0FNU0NBTkNIQU5ORUxNSU5USU1FX0lPQ1RMKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9HRVRST0FNU0NBTkNIQU5ORUxNSU5USU1FX0lPQ1RMKSBcCisJRU5VTShUUkFDRV9DT0RFX0hERF9TVE9SRV9KT0lOX1JFUSkgXAorCUVOVU0oVFJBQ0VfQ09ERV9IRERfQ0xFQVJfSk9JTl9SRVEpIFwKKwlFTlVNKFRSQUNFX0NPREVfSEREX0lTU1VFX0pPSU5fUkVRKQorCitlbnVtIHsKKyN1bmRlZiBFTlVNCisjZGVmaW5lIEVOVU0oZW51bSkgZW51bSwKKwlFTlVNUworfTsKKworLyoqCisgKiBoZGRfdHJhY2VfZXZlbnRfc3RyaW5nKCkgLSBDb252ZXJ0IHRyYWNlIGV2ZW50IHRvIHN0cmluZworICogQGNvZGU6IHRyYWNlIGV2ZW50IGVudW1lcmF0aW9uIHRvIGNvbnZlcnQKKyAqCisgKiBSZXR1cm46IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQgZW51bWVyYXRpb24KKyAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpoZGRfdHJhY2VfZXZlbnRfc3RyaW5nKHVpbnQzMl90IGNvZGUpCit7CisJc3dpdGNoIChjb2RlKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIjsKKwkJYnJlYWs7CisjdW5kZWYgRU5VTQorI2RlZmluZSBFTlVNKGVudW0pIENBU0VfUkVUVVJOX1NUUklORyhlbnVtKQorCUVOVU1TCisJfQorfQorCisjdW5kZWYgRU5VTVMKKyN1bmRlZiBFTlVNCisKKyNpZmRlZiBIRERfVFJBQ0VfUkVDT1JECit2b2lkIGhkZF90cmFjZV9pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZGRfdHJhY2VfaW5pdCh2b2lkKSB7fQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX3R4X3J4LmggYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfdHhfcnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGIyOWNjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvaW5jL3dsYW5faGRkX3R4X3J4LmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChXTEFOX0hERF9UWF9SWF9IKQorI2RlZmluZSBXTEFOX0hERF9UWF9SWF9ICisKKy8qKgorICoKKyAqIERPQzogd2xhbl9oZGRfdHhfcnguaAorICoKKyAqIExpbnV4IEhERCBUeC9SWCBBUElzCisgKi8KKworI2luY2x1ZGUgPHdsYW5faGRkX2luY2x1ZGVzLmg+CisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgIm9sX3R4cnhfb3NpZl9hcGkuaCIKKworI2RlZmluZSBIRERfRVRIRVJUWVBFXzgwMl8xX1ggICAgICAgICAgICAgIDB4ODg4RQorI2RlZmluZSBIRERfRVRIRVJUWVBFXzgwMl8xX1hfRlJBTUVfT0ZGU0VUIDEyCisjZGVmaW5lIEhERF9FVEhFUlRZUEVfODAyXzFfWF9TSVpFICAgICAgICAgMgorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisjZGVmaW5lIEhERF9FVEhFUlRZUEVfV0FJICAgICAgICAgICAgICAgICAgMHg4OGI0CisjZW5kaWYKKworI2RlZmluZSBIRERfODAyMTFfSEVBREVSX0xFTiAgICAgIDI0CisjZGVmaW5lIEhERF84MDIxMV9IRUFERVJfUU9TX0NUTCAgMgorI2RlZmluZSBIRERfTExDX0hEUl9MRU4gICAgICAgICAgIDYKKyNkZWZpbmUgSEREX0ZSQU1FX1RZUEVfTUFTSyAgICAgICAweDBjCisjZGVmaW5lIEhERF9GUkFNRV9TVUJUWVBFX01BU0sgICAgMHhmMAorI2RlZmluZSBIRERfRlJBTUVfVFlQRV9EQVRBICAgICAgIDB4MDgKKyNkZWZpbmUgSEREX0ZSQU1FX1RZUEVfTUdNVCAgICAgICAweDAwCisjZGVmaW5lIEhERF9GUkFNRV9TVUJUWVBFX1FPU0RBVEEgMHg4MAorI2RlZmluZSBIRERfRlJBTUVfU1VCVFlQRV9ERUFVVEggIDB4QzAKKyNkZWZpbmUgSEREX0ZSQU1FX1NVQlRZUEVfRElTQVNTT0MgMHhBMAorI2RlZmluZSBIRERfREVTVF9BRERSX09GRlNFVCAgICAgIDYKKworI2RlZmluZSBIRERfTUFDX0hEUl9TSVpFICAgICAgICAgIDYKKworI2RlZmluZSBIRERfUFNCX0NGR19JTlZBTElEICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgSEREX1BTQl9DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAweEZGCisjZGVmaW5lIFNNRV9RT1NfVUFQU0RfQ0ZHX0JLX0NIQU5HRURfTUFTSyAgICAgMHhGMQorI2RlZmluZSBTTUVfUU9TX1VBUFNEX0NGR19CRV9DSEFOR0VEX01BU0sgICAgIDB4RjIKKyNkZWZpbmUgU01FX1FPU19VQVBTRF9DRkdfVklfQ0hBTkdFRF9NQVNLICAgICAweEY0CisjZGVmaW5lIFNNRV9RT1NfVUFQU0RfQ0ZHX1ZPX0NIQU5HRURfTUFTSyAgICAgMHhGOAorCisjZGVmaW5lIEhERF9FVEhfSEVBREVSX0xFTiAgICAgMTQKKworaW50IGhkZF9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGhkZF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworQ0RGX1NUQVRVUyBoZGRfaW5pdF90eF9yeChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CitDREZfU1RBVFVTIGhkZF9kZWluaXRfdHhfcngoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworQ0RGX1NUQVRVUyBoZGRfcnhfcGFja2V0X2Niayh2b2lkICpjZHNfY29udGV4dCwgY2RmX25idWZfdCByeEJ1ZkNoYWluLAorCQkJICAgICB1aW50OF90IHN0YUlkKTsKKworI2lmZGVmIElQQV9PRkZMT0FECitDREZfU1RBVFVTIGhkZF9yeF9tdWxfcGFja2V0X2Niayh2b2lkICpjZHNfY29udGV4dCwKKwkJCQkgY2RmX25idWZfdCByeF9idWZfbGlzdCwgdWludDhfdCBzdGFJZCk7CisjZW5kaWYgLyogSVBBX09GRkxPQUQgKi8KKworQ0RGX1NUQVRVUyBoZGRfaWJzc19nZXRfc3RhX2lkKGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4LAorCQkJICAgICAgIHN0cnVjdCBjZGZfbWFjX2FkZHIgKnBNYWNBZGRyZXNzLAorCQkJICAgICAgIHVpbnQ4X3QgKnN0YUlkKTsKKworI2lmZGVmIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MCit2b2lkIGhkZF90eF9yZXN1bWVfY2Iodm9pZCAqYWRhcHRlcl9jb250ZXh0LCBib29sIHR4X3Jlc3VtZSk7Cit2b2lkIGhkZF90eF9yZXN1bWVfdGltZXJfZXhwaXJlZF9oYW5kbGVyKHZvaWQgKmFkYXB0ZXJfY29udGV4dCk7Cit2b2lkIGhkZF9yZWdpc3Rlcl90eF9mbG93X2NvbnRyb2woaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJY2RmX21jX3RpbWVyX2NhbGxiYWNrX3QgdGltZXJfY2FsbGJhY2ssCisJCW9sX3R4cnhfdHhfZmxvd19jb250cm9sX2ZwIGZsb3dDb250cm9sKTsKK3ZvaWQgaGRkX2RlcmVnaXN0ZXJfdHhfZmxvd19jb250cm9sKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpOwordm9pZCBoZGRfZ2V0X3R4X3Jlc291cmNlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQl1aW50OF90IFNUQUlkLCB1aW50MTZfdCB0aW1lcl92YWx1ZSk7CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgaGRkX3R4X3Jlc3VtZV9jYih2b2lkICphZGFwdGVyX2NvbnRleHQsIGJvb2wgdHhfcmVzdW1lKQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBoZGRfdHhfcmVzdW1lX3RpbWVyX2V4cGlyZWRfaGFuZGxlcih2b2lkICphZGFwdGVyX2NvbnRleHQpCit7CisJcmV0dXJuOworfQorc3RhdGljIGlubGluZSB2b2lkIGhkZF9yZWdpc3Rlcl90eF9mbG93X2NvbnRyb2woaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJY2RmX21jX3RpbWVyX2NhbGxiYWNrX3QgdGltZXJfY2FsbGJhY2ssCisJCW9sX3R4cnhfdHhfZmxvd19jb250cm9sX2ZwIGZsb3dDb250cm9sKQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBoZGRfZGVyZWdpc3Rlcl90eF9mbG93X2NvbnRyb2woaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgaGRkX2dldF90eF9yZXNvdXJjZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJdWludDhfdCBTVEFJZCwgdWludDE2X3QgdGltZXJfdmFsdWUpCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisvKioKKyAqIHdsYW5faGRkX2xvZ19lYXBvbCgpIC0gRnVuY3Rpb24gdG8gY2hlY2sgYW5kIGV4dHJhY3QgRUFQT0wgcGFyYW1zCisgKiBAc2tiOiAgICAgICAgICAgICAgIHNrYiBkYXRhCisgKiBAZXZlbnRfdHlwZTogICAgICAgIE9uZSBvZiBlbnVtIHdpZmlfY29ubmVjdGl2aXR5X2V2ZW50cyB0byBpbmRpY2F0ZSBUeC9SeAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBpbnB1dCBza2IgZGF0YSB0byBnZXQgdGhlIEVBUE9MIHBhcmFtcyxpZiB0aGUKKyAqIHBhY2tldCBpcyBFQVBPTCBhbmQgc3RvcmUgaXQgaW4gdGhlIHBvaW50ZXIgcGFzc2VkIGFzIGlucHV0CisgKgorICogUmV0dXJuOiBOb25lCisgKgorICovCit2b2lkIHdsYW5faGRkX2xvZ19lYXBvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQl1aW50OF90IGV2ZW50X3R5cGUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bGFuX2hkZF9sb2dfZWFwb2woc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJdWludDhfdCBldmVudF90eXBlKQoreworCit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisKK2NvbnN0IGNoYXIgKmhkZF9yZWFzb25fdHlwZV90b19zdHJpbmcoZW51bSBuZXRpZl9yZWFzb25fdHlwZSByZWFzb24pOworY29uc3QgY2hhciAqaGRkX2FjdGlvbl90eXBlX3RvX3N0cmluZyhlbnVtIG5ldGlmX2FjdGlvbl90eXBlIGFjdGlvbik7Cit2b2lkIHdsYW5faGRkX25ldGlmX3F1ZXVlX2NvbnRyb2woaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJZW51bSBuZXRpZl9hY3Rpb25fdHlwZSBhY3Rpb24sIGVudW0gbmV0aWZfcmVhc29uX3R5cGUgcmVhc29uKTsKKworCisjZW5kaWYgLyogZW5kICNpZiAhZGVmaW5lZChXTEFOX0hERF9UWF9SWF9IKSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvaW5jL3dsYW5faGRkX3dleHQuaCBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF93ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU2MWU5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF93ZXh0LmgKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19XRVhUX0lXX0hfXworI2RlZmluZSBfX1dFWFRfSVdfSF9fCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSAiY2RmX2V2ZW50LmgiCisKKy8qCisgKiBvcmRlciBvZiBwYXJhbWV0ZXJzIGluIGFkZFRzIHByaXZhdGUgaW9jdGwKKyAqLworI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fSEFORExFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9USUQgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fQVBTRCAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9VU0VSX1BSSU9SSVRZICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX05PTUlOQUxfTVNEVV9TSVpFICAgICAgICAgICAgNQorI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fTUFYSU1VTV9NU0RVX1NJWkUgICAgICAgICAgICA2CisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9NSU5JTVVNX0RBVEFfUkFURSAgICAgICAgICAgIDcKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX01FQU5fREFUQV9SQVRFICAgICAgICAgICAgICAgOAorI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fUEVBS19EQVRBX1JBVEUgICAgICAgICAgICAgICA5CisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9NQVhfQlVSU1RfU0laRSAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX01JTklNVU1fUEhZX1JBVEUgICAgICAgICAgICAxMQorI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fU1VSUExVU19CQU5EV0lEVEhfQUxMT1dBTkNFIDEyCisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9TRVJWSUNFX0lOVEVSVkFMICAgICAgICAgICAgMTMKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX1NVU1BFTlNJT05fSU5URVJWQUwgICAgICAgICAxNAorI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fQlVSU1RfU0laRV9ERUZOICAgICAgICAgICAgIDE1CisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9BQ0tfUE9MSUNZICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX0lOQUNUSVZJVFlfSU5URVJWQUwgICAgICAgICAxNworI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fTUFYX1NFUlZJQ0VfSU5URVJWQUwgICAgICAgIDE4CisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgMTkKKworI2RlZmluZSBNSFogNgorCisjZGVmaW5lIFdFX01BWF9TVFJfTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfUFJJVl9TSVpFX01BU0sKKyNkZWZpbmUgV0xBTl9IRERfVUlfQkFORF9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fSEREX1VJX0JBTkRfNV9HSFogICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTEFOX0hERF9VSV9CQU5EXzJfNF9HSFogICAgICAgICAgICAgICAgICAgICAgIDIKKy8qIFNFVEJBTkQgeCAqLworLyogMDEyMzQ1Njc4ICovCisjZGVmaW5lIFdMQU5fSEREX1VJX1NFVF9CQU5EX1ZBTFVFX09GRlNFVCAgICAgICAgICAgICAgOAorCit0eXBlZGVmIGVudW0geworCUhERF9XTEFOX1dNTV9ESVJFQ1RJT05fVVBTVFJFQU0gPSAwLAorCUhERF9XTEFOX1dNTV9ESVJFQ1RJT05fRE9XTlNUUkVBTSA9IDEsCisJSEREX1dMQU5fV01NX0RJUkVDVElPTl9CSURJUkVDVElPTkFMID0gMiwKK30gaGRkX3dsYW5fd21tX2RpcmVjdGlvbl9lOworCit0eXBlZGVmIGVudW0geworCUhERF9XTEFOX1dNTV9QT1dFUl9TQVZFX0xFR0FDWSA9IDAsCisJSEREX1dMQU5fV01NX1BPV0VSX1NBVkVfVUFQU0QgPSAxLAorfSBoZGRfd2xhbl93bW1fcG93ZXJfc2F2ZV9lOworCit0eXBlZGVmIGVudW0geworCS8qIFRTUEVDL3JlLWFzc29jIGRvbmUsIGFzeW5jICovCisJSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9TVUNDRVNTID0gMCwKKwkvKiBubyBuZWVkIHRvIHNldHVwIFRTUEVDIHNpbmNlIEFDTT0wIGFuZCBubyBVQVBTRCBkZXNpcmVkLCBzeW5jICsgYXN5bmMgKi8KKwlIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX1VBUFNEID0gMSwKKwkvKiBubyBuZWVkIHRvIHNldHVwIFRTUEVDIHNpbmNlIEFDTT0wIGFuZCBVQVBTRCBhbHJlYWR5IGV4aXN0cywgc3luYyArIGFzeW5jICovCisJSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9VQVBTRF9FWElTVElORyA9IDIsCisJLyogVFNQRUMgcmVzdWx0IHBlbmRpbmcsIHN5bmMgKi8KKwlIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX1BFTkRJTkcgPSAzLAorCS8qIFRTUEVDL3JlLWFzc29jIGZhaWxlZCwgc3luYyArIGFzeW5jICovCisJSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRUQgPSA0LAorCS8qIFJlcXVlc3QgcmVqZWN0ZWQgZHVlIHRvIGludmFsaWQgcGFyYW1zLCBzeW5jICsgYXN5bmMgKi8KKwlIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9CQURfUEFSQU0gPSA1LAorCS8qIFRTUEVDIHJlcXVlc3QgcmVqZWN0ZWQgc2luY2UgQVAhPVFBUCwgc3luYyAqLworCUhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEX05PX1dNTSA9IDYsCisKKwkvKiBUU1BFQyBtb2RpZmljYXRpb24vcmUtYXNzb2Mgc3VjY2Vzc2Z1bCwgYXN5bmMgKi8KKwlIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9TVUNDRVNTID0gNywKKwkvKiBUU1BFQyBtb2RpZmljYXRpb24gYSBuby1vcCBzaW5jZSBBQ009MCBhbmQgbm8gY2hhbmdlIGluIFVBUFNELCBzeW5jICsgYXN5bmMgKi8KKwlIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9TVUNDRVNTX05PX0FDTV9OT19VQVBTRCA9IDgsCisJLyogVFNQRUMgbW9kaWZpY2F0aW9uIGEgbm8tb3Agc2luY2UgQUNNPTAgYW5kIHJlcXVlc3RlZCBVLUFQU0QgYWxyZWFkeSBleGlzdHMsIHN5bmMgKyBhc3luYyAqLworCUhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX1NVQ0NFU1NfTk9fQUNNX1VBUFNEX0VYSVNUSU5HID0gOSwKKwkvKiBUU1BFQyByZXN1bHQgcGVuZGluZywgc3luYyAqLworCUhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX1BFTkRJTkcgPSAxMCwKKwkvKiBUU1BFQyBtb2RpZmljYXRpb24gZmFpbGVkLCBwcmV2IFRTUEVDIGluIGVmZmVjdCwgc3luYyArIGFzeW5jICovCisJSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfRkFJTEVEID0gMTEsCisJLyogVFNQRUMgbW9kaWZpY2F0aW9uIHJlcXVlc3QgcmVqZWN0ZWQgZHVlIHRvIGludmFsaWQgcGFyYW1zLCBzeW5jICsgYXN5bmMgKi8KKwlIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9GQUlMRURfQkFEX1BBUkFNID0gMTIsCisKKwkvKiBUU1BFQyByZWxlYXNlIHN1Y2Nlc3NmdWwsIHN5bmMgYW5kIGFsc28gYXN5bmMgKi8KKwlIRERfV0xBTl9XTU1fU1RBVFVTX1JFTEVBU0VfU1VDQ0VTUyA9IDEzLAorCS8qIFRTUEVDIHJlbGVhc2UgcGVuZGluZywgc3luYyAqLworCUhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9QRU5ESU5HID0gMTQsCisJLyogVFNQRUMgcmVsZWFzZSBmYWlsZWQsIHN5bmMgKyBhc3luYyAqLworCUhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9GQUlMRUQgPSAxNSwKKwkvKiBUU1BFQyByZWxlYXNlIHJlamVjdGVkIGR1ZSB0byBpbnZhbGlkIHBhcmFtcywgc3luYyAqLworCUhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9GQUlMRURfQkFEX1BBUkFNID0gMTYsCisJLyogVFNQRUMgbW9kaWZpZWQgZHVlIHRvIHRoZSBtdXgnaW5nIG9mIHJlcXVlc3RzIG9uIEFDcywgYXN5bmMgKi8KKworCUhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZJRUQgPSAxNywKKwkvKiBUU1BFQyByZXZva2VkIGJ5IEFQLCBhc3luYyAqLworCUhERF9XTEFOX1dNTV9TVEFUVVNfTE9TVCA9IDE4LAorCS8qIHNvbWUgaW50ZXJuYWwgZmFpbHVyZSBsaWtlIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsIGV0Yywgc3luYyAqLworCUhERF9XTEFOX1dNTV9TVEFUVVNfSU5URVJOQUxfRkFJTFVSRSA9IDE5LAorCisJLyogVS1BUFNEIGZhaWxlZCBkdXJpbmcgc2V0dXAgYnV0IE9UQSBzZXR1cCAod2hldGhlciBUU1BFQyBleGNobmFnZSBvciAqLworCS8qIHJlLWFzc29jKSB3YXMgZG9uZSBzbyBhcHAgc2hvdWxkIHJlbGVhc2UgdGhpcyBRb1MsIGFzeW5jICovCisJSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9VQVBTRF9TRVRfRkFJTEVEID0gMjAsCisJLyogVS1BUFNEIGZhaWxlZCBkdXJpbmcgbW9kaWZ5LCBidXQgT1RBIHNldHVwICh3aGV0aGVyIFRTUEVDIGV4Y2huYWdlIG9yICovCisJLyogcmUtYXNzb2MpIHdhcyBkb25lIHNvIGFwcCBzaG91bGQgcmVsZWFzZSB0aGlzIFFvUywgYXN5bmMgKi8KKwlIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9VQVBTRF9TRVRfRkFJTEVEID0gMjEKK30gaGRkX3dsYW5fd21tX3N0YXR1c19lOworCisvKiogVFMgSW5mbyBBY2sgUG9saWN5ICovCit0eXBlZGVmIGVudW0geworCUhERF9XTEFOX1dNTV9UU19JTkZPX0FDS19QT0xJQ1lfTk9STUFMX0FDSyA9IDAsCisJSEREX1dMQU5fV01NX1RTX0lORk9fQUNLX1BPTElDWV9IVF9JTU1FRElBVEVfQkxPQ0tfQUNLID0gMSwKK30gaGRkX3dsYW5fd21tX3RzX2luZm9fYWNrX3BvbGljeV9lOworCisvKiogTWF4aW11bSBMZW5ndGggb2YgV1BBL1JTTiBJRSAqLworI2RlZmluZSBNQVhfV1BBX1JTTl9JRV9MRU4gNDAKKworLyoqIE1heGltdW0gTnVtYmVyIG9mIFdFUCBLRVlTICovCisjZGVmaW5lIE1BWF9XRVBfS0VZUyA0CisKKy8qKiBFdGhlciBBZGRyZXNzIExlbmd0aCAqLworI2RlZmluZSBFVEhFUl9BRERSX0xFTiA2CisKKy8qKiBFbmFibGUgMTFkICovCisjZGVmaW5lIEVOQUJMRV8xMUQgIDEKKworLyoqIERpc2FibGUgMTFkICovCisjZGVmaW5lIERJU0FCTEVfMTFEIDAKKworLyoKKyAgIHJlZmVyIHdwYS5oIGluIHdwYSBzdXBwbGljYW50IGNvZGUgZm9yIFJFQVNPTl9NSUNIQUVMX01JQ19GQUlMVVJFCisKKyAgIHN1cHBsaWNhbnQgc2V0cyBSRUFTT05fTUlDSEFFTF9NSUNfRkFJTFVSRSBhcyB0aGUgcmVhc29uIGNvZGUgd2hlbiBpdCBzZW5kcyB0aGUgTUxNRSBkZWF1dGggSU9DVEwKKyAgIGZvciBUS0lQIGNvdW50ZXIgbWVhc3VyZXMKKyAqLworI2RlZmluZSBIRERfUkVBU09OX01JQ0hBRUxfTUlDX0ZBSUxVUkUgMTQKKworLyoKKyAqIFRoZXNlIGFyZSBmb3IgVExWIGZpZWxkcyBpbiBXUFMgSUUKKyAqLworI2RlZmluZSBIRERfV1BTX1VVSURfTEVOICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBIRERfV1BTX0VMRU1fVkVSU0lPTiAgICAgICAgICAgICAgICAweDEwNGEKKyNkZWZpbmUgSEREX1dQU19FTEVNX1JFUVVFU1RfVFlQRSAgICAgICAgICAgMHgxMDNhCisjZGVmaW5lIEhERF9XUFNfRUxFTV9DT05GSUdfTUVUSE9EUyAgICAgICAgIDB4MTAwOAorI2RlZmluZSBIRERfV1BTX0VMRU1fVVVJRF9FICAgICAgICAgICAgICAgICAweDEwNDcKKyNkZWZpbmUgSEREX1dQU19FTEVNX1BSSU1BUllfREVWSUNFX1RZUEUgICAgMHgxMDU0CisjZGVmaW5lIEhERF9XUFNfRUxFTV9SRl9CQU5EUyAgICAgICAgICAgICAgIDB4MTAzYworI2RlZmluZSBIRERfV1BTX0VMRU1fQVNTT0NJQVRJT05fU1RBVEUgICAgICAweDEwMDIKKyNkZWZpbmUgSEREX1dQU19FTEVNX0NPTkZJR1VSQVRJT05fRVJST1IgICAgMHgxMDA5CisjZGVmaW5lIEhERF9XUFNfRUxFTV9ERVZJQ0VfUEFTU1dPUkRfSUQgICAgIDB4MTAxMgorCisjZGVmaW5lIEhERF9XUEFfRUxFTV9WRU5ET1JfRVhURU5TSU9OICAgICAgIDB4MTA0OQorCisjZGVmaW5lIEhERF9XUFNfTUFOVUZBQ1RVUkVSX0xFTiAgICAgICAgICAgIDY0CisjZGVmaW5lIEhERF9XUFNfTU9ERUxfTkFNRV9MRU4gICAgICAgICAgICAgIDMyCisjZGVmaW5lIEhERF9XUFNfTU9ERUxfTlVNX0xFTiAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIEhERF9XUFNfU0VSSUFMX05VTV9MRU4gICAgICAgICAgICAgIDMyCisjZGVmaW5lIEhERF9XUFNfREVWSUNFX09VSV9MRU4gICAgICAgICAgICAgICA0CisjZGVmaW5lIEhERF9XUFNfREVWSUNFX05BTUVfTEVOICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgSEREX1dQU19FTEVNX1dQU19TVEFURSAgICAgICAgICAgICAgMHgxMDQ0CisjZGVmaW5lIEhERF9XUFNfRUxFTV9BUFNFVFVQTE9DSyAgICAgICAgICAgIDB4MTA1NworI2RlZmluZSBIRERfV1BTX0VMRU1fU0VMRUNURURSRUdJU1RSQSAgICAgICAweDEwNDEKKyNkZWZpbmUgSEREX1dQU19FTEVNX1JTUF9UWVBFICAgICAgICAgICAgICAgMHgxMDNCCisjZGVmaW5lIEhERF9XUFNfRUxFTV9NQU5VRkFDVFVSRVIgICAgICAgICAgIDB4MTAyMQorI2RlZmluZSBIRERfV1BTX0VMRU1fTU9ERUxfTkFNRSAgICAgICAgICAgICAweDEwMjMKKyNkZWZpbmUgSEREX1dQU19FTEVNX01PREVMX05VTSAgICAgICAgICAgICAgMHgxMDI0CisjZGVmaW5lIEhERF9XUFNfRUxFTV9TRVJJQUxfTlVNICAgICAgICAgICAgIDB4MTA0MgorI2RlZmluZSBIRERfV1BTX0VMRU1fREVWSUNFX05BTUUgICAgICAgICAgICAweDEwMTEKKyNkZWZpbmUgSEREX1dQU19FTEVNX1JFR0lTVFJBX0NPTkZfTUVUSE9EUyAgMHgxMDUzCisKKyNkZWZpbmUgSEREX1JUU0NUU19FTl9NQVNLICAgICAgICAgICAgICAgICAgMHhGCisjZGVmaW5lIEhERF9SVFNDVFNfRU5BQkxFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSEREX0NUU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIFdQU19PVUlfVFlQRSAgICJceDAwXHg1MFx4ZjJceDA0IgorI2RlZmluZSBXUFNfT1VJX1RZUEVfU0laRSAgNAorCisjZGVmaW5lIFNTX09VSV9UWVBFICAgICJceDAwXHgxNlx4MzIiCisjZGVmaW5lIFNTX09VSV9UWVBFX1NJWkUgICAzCisKKyNkZWZpbmUgUDJQX09VSV9UWVBFICAgIlx4NTBceDZmXHg5YVx4MDkiCisjZGVmaW5lIFAyUF9PVUlfVFlQRV9TSVpFICA0CisKKyNkZWZpbmUgSFMyMF9PVUlfVFlQRSAgICJceDUwXHg2Zlx4OWFceDEwIgorI2RlZmluZSBIUzIwX09VSV9UWVBFX1NJWkUgIDQKKworI2RlZmluZSBPU0VOX09VSV9UWVBFICAgIlx4NTBceDZmXHg5YVx4MTIiCisjZGVmaW5lIE9TRU5fT1VJX1RZUEVfU0laRSAgNAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1dGRAorI2RlZmluZSBXRkRfT1VJX1RZUEUgICAiXHg1MFx4NmZceDlhXHgwYSIKKyNkZWZpbmUgV0ZEX09VSV9UWVBFX1NJWkUgIDQKKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworCWVXRVhUX1dQU19PRkYgPSAwLAorCWVXRVhUX1dQU19PTiA9IDEsCit9IGhkZF93cHNfbW9kZV9lOworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGludGVyZmFjZSBsZXZlbCAoZ3JhbnVsYXJpdHkpCisgKiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGluIHN1cHBvcnQgb2Ygd2lyZWxlc3MgZXh0ZW5zaW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaGRkX3dleHRfc3RhdGVfcyB7CisJLyoqIFRoZSBDU1IgImRlc2lyZWQiIFByb2ZpbGUgKi8KKwl0Q3NyUm9hbVByb2ZpbGUgcm9hbVByb2ZpbGU7CisKKwkvKiogQlNTSUQgdG8gd2hpY2ggY29ubmVjdCByZXF1ZXN0IGlzIHJlY2VpdmVkICovCisJc3RydWN0IGNkZl9tYWNfYWRkciByZXFfYnNzSWQ7CisKKwkvKiogVGhlIGFzc29jaWF0aW9uIHN0YXR1cyBjb2RlICovCisJdWludDMyX3Qgc3RhdHVzQ29kZTsKKworCS8qKiB3cGEgdmVyc2lvbiBXUEEvV1BBMi9Ob25lKi8KKwlpbnQzMl90IHdwYVZlcnNpb247CisKKwkvKipXUEEgb3IgUlNOIElFKi8KKwl1aW50OF90IFdQQVJTTklFW01BWF9XUEFfUlNOX0lFX0xFTl07CisKKwkvKipnZW4gSUUgKi8KKwl0U2lyQWRkaWUgZ2VuSUU7CisKKwkvKipBZGRpdGlvbmFsIElFIGZvciBhc3NvYyAqLworCXRTaXJBZGRpZSBhc3NvY0FkZElFOworCisJLyoqYXV0aCBrZXkgbWdtdCAqLworCWludDMyX3QgYXV0aEtleU1nbXQ7CisKKwkvKiBjZGYgZXZlbnQgKi8KKwljZGZfZXZlbnRfdCBoZGRfY2RmX2V2ZW50OworCisJY2RmX2V2ZW50X3Qgc2NhbmV2ZW50OworCisJLyoqQ291bnRlciBtZWFzdXJlIHN0YXRlLCBTdGFydGVkL1N0b3BwZWQqLworCWJvb2wgbVRLSVBDb3VudGVyTWVhc3VyZXM7CisKKwkvKipDb21wbGV0aW9uIFZhcmlhYmxlKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uX3ZhcjsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkvKiBFU0Ugc3RhdGUgdmFyaWFibGVzICovCisJYm9vbCBpc0VTRUNvbm5lY3Rpb247CisJZUNzckF1dGhUeXBlIGNvbGxlY3RlZEF1dGhUeXBlOyAvKiBDb2xsZWN0ZWQgZnJvbSBBTEwgU0lPQ1NJV0FVVEggSW9jdGxzLiBXaWxsIGJlIG5lZ290aWF0ZWRBdXRoVHlwZSAtIGluIHRDc3JQcm9maWxlICovCisjZW5kaWYKK30gaGRkX3dleHRfc3RhdGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2NwX2ZyZXFfY2hhbl9tYXBfcyB7CisJLyogTGlzdCBvZiBmcmVxdWVuY2llcyAqLworCXVpbnQzMl90IGZyZXE7CisJdWludDMyX3QgY2hhbjsKK30gaGRkX2ZyZXFfY2hhbl9tYXBfdDsKKworLyogUGFja2V0IFR5cGVzLiAqLworI2RlZmluZSBXTEFOX0tFRVBfQUxJVkVfVU5TT0xJQ0lUX0FSUF9SU1AgICAgIDIKKyNkZWZpbmUgV0xBTl9LRUVQX0FMSVZFX05VTExfUEtUICAgICAgICAgICAgICAxCisKKy8qIE9mZmxvYWQgcmVxdWVzdC4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IHBhY2tldFR5cGU7CisJdWludDMyX3QgdGltZVBlcmlvZDsKKwl1aW50OF90IGhvc3RJcHY0QWRkcls0XTsKKwl1aW50OF90IGRlc3RJcHY0QWRkcls0XTsKKwl1aW50OF90IGRlc3RNYWNBZGRyW0VUSF9BTEVOXTsKKwl1aW50OF90IGJzc0lkeDsKK30gdEtlZXBBbGl2ZVJlcXVlc3QsICp0cEtlZXBBbGl2ZVJlcXVlc3Q7CisKKyNkZWZpbmUgd2xhbl9oZGRfZ2V0X3dwc19pZV9wdHIoaWUsIGllX2xlbikgXAorCXdsYW5faGRkX2dldF92ZW5kb3Jfb3VpX2llX3B0cihXUFNfT1VJX1RZUEUsIFdQU19PVUlfVFlQRV9TSVpFLCBpZSwgaWVfbGVuKQorCisjZGVmaW5lIHdsYW5faGRkX2dldF9wMnBfaWVfcHRyKGllLCBpZV9sZW4pIFwKKwl3bGFuX2hkZF9nZXRfdmVuZG9yX291aV9pZV9wdHIoUDJQX09VSV9UWVBFLCBQMlBfT1VJX1RZUEVfU0laRSwgaWUsIGllX2xlbikKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9XRkQKKyNkZWZpbmUgd2xhbl9oZGRfZ2V0X3dmZF9pZV9wdHIoaWUsIGllX2xlbikgXAorCXdsYW5faGRkX2dldF92ZW5kb3Jfb3VpX2llX3B0cihXRkRfT1VJX1RZUEUsIFdGRF9PVUlfVFlQRV9TSVpFLCBpZSwgaWVfbGVuKQorI2VuZGlmCisKK2V4dGVybiBpbnQgaGRkX3VucmVnaXN0ZXJfd2V4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgaGRkX3JlZ2lzdGVyX3dleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGhkZF93bGFuX2dldF9mcmVxKHVpbnQzMl90IGNoYW4sIHVpbnQzMl90ICpmcmVxKTsKK2V4dGVybiBpbnQgaGRkX3dsYW5fZ2V0X3J0c190aHJlc2hvbGQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSk7CitleHRlcm4gaW50IGhkZF93bGFuX2dldF9mcmFnX3RocmVzaG9sZChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSk7CitleHRlcm4gdm9pZCBoZGRfd2xhbl9nZXRfdmVyc2lvbihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gdm9pZCBoZGRfd2xhbl9nZXRfc3RhdHMoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVpbnQxNl90ICpsZW5ndGgsCisJCQkgICAgICAgY2hhciAqYnVmZmVyLCB1aW50MTZfdCBidWZfbGVuKTsKKworZXh0ZXJuIGludCBpd19zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaXdfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaXdfc2V0X2FwX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGl3X2dldF9hcF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpd19zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGl3X2dldF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaXdfc2V0X3Zhcl9pbnRzX2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpd19zZXRfdGhyZWVfaW50c19nZXRub25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGhkZF9wcml2X2dldF9kYXRhKHN0cnVjdCBpd19wb2ludCAqcF9wcml2X2RhdGEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUpOworCitleHRlcm4gdm9pZCAqbWVtX2FsbG9jX2NvcHlfZnJvbV91c2VyX2hlbHBlcihjb25zdCB2b2lkICp3cnF1X2RhdGEsIHNpemVfdCBsZW4pOworCitleHRlcm4gQ0RGX1NUQVRVUyB3bGFuX2hkZF9nZXRfbGlua3NwZWVkX2Zvcl9wZWVybWFjKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkJICAgICB0U2lyTWFjQWRkciBtYWNBZGRyZXNzKTsKK3ZvaWQgaGRkX2NsZWFyX3JvYW1fcHJvZmlsZV9pZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKK3VpbnQ4X3QgKndsYW5faGRkX2dldF92ZW5kb3Jfb3VpX2llX3B0cih1aW50OF90ICpvdWksIHVpbnQ4X3Qgb3VpX3NpemUsCisJCQkJCXVpbnQ4X3QgKmllLCBpbnQgaWVfbGVuKTsKKworQ0RGX1NUQVRVUyB3bGFuX2hkZF9nZXRfY2xhc3NfYXN0YXRzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKKworQ0RGX1NUQVRVUyB3bGFuX2hkZF9nZXRfc3RhdGlvbl9zdGF0cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKK0NERl9TVEFUVVMgd2xhbl9oZGRfZ2V0X3Jzc2koaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGludDhfdCAqcnNzaV92YWx1ZSk7CisKK0NERl9TVEFUVVMgd2xhbl9oZGRfZ2V0X3NucihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgaW50OF90ICpzbnIpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKK0NERl9TVEFUVVMgaXdfc2V0X3RkbHNfcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEsIGludCBuT2Zmc2V0KTsKKyNlbmRpZgorCit2b2lkIHdsYW5faGRkX2NoYW5nZV9jb3VudHJ5X2NvZGVfY2FsbGJhY2sodm9pZCAqcEFkYXB0ZXIpOworCitpbnQgaGRkX3NldF9iYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHVpX2JhbmQpOworaW50IGhkZF9zZXRfYmFuZF9oZWxwZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqY29tbWFuZCk7CitpbnQgd2xhbl9oZGRfdXBkYXRlX3BoeW1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgdEhhbEhhbmRsZSBoYWwsCisJCQkgICAgaW50IG5ld19waHltb2RlLCBoZGRfY29udGV4dF90ICpwaGRkY3R4KTsKKworaW50IHdsYW5faGRkX2dldF90ZW1wZXJhdHVyZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgaW50ICp0ZW1wZXJhdHVyZSk7CitpbnQgd2xhbl9oZGRfZ2V0X2xpbmtfc3BlZWQoaGRkX2FkYXB0ZXJfdCAqc3RhX2FkYXB0ZXIsIHVpbnQzMl90ICpsaW5rX3NwZWVkKTsKKyNlbmRpZiAvKiBfX1dFWFRfSVdfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfd21tLmggYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfd21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0YTFlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL2luYy93bGFuX2hkZF93bW0uaApAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9XTEFOX0hERF9XTU1fSAorI2RlZmluZSBfV0xBTl9IRERfV01NX0gKKworLyoqCisgKiBET0M6IEhERCBXTU0KKyAqCisgKiBUaGlzIG1vZHVsZSAod2xhbl9oZGRfd21tLmggaW50ZXJmYWNlICsgd2xhbl9oZGRfd21tLmMgaW1wbGVtZW50YXRpb24pCisgKiBob3VzZXMgYWxsIHRoZSBsb2dpYyBmb3IgV01NIGluIEhERC4KKyAqCisgKiBPbiB0aGUgY29udHJvbCBwYXRoLCBpdCBoYXMgdGhlIGxvZ2ljIHRvIHNldHVwIFFvUywgbW9kaWZ5IFFvUyBhbmQgZGVsZXRlCisgKiBRb1MgKFFvUyBoZXJlIHJlZmVycyB0byBhIFRTUEVDKS4gVGhlIHNldHVwIFFvUyBjb21lcyBpbiB0d28gZmxhdm9yczogYW4KKyAqIGV4cGxpY2l0IGFwcGxpY2F0aW9uIGludm9rZWQgYW5kIGFuIGludGVybmFsIEhERCBpbnZva2VkLiAgVGhlIGltcGxpY2l0IFFvUworICogaXMgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGRvIE5PVCBjYWxsIHRoZSBjdXN0b20gUUNUIFdMQU4gT0lEcyBmb3IgUW9TIGJ1dAorICogd2hpY2ggRE8gbWFyayB0aGVpciB0cmFmZmljIGZvciBwcmlvcnRpemF0aW9uLiBJdCBhbHNvIGhhcyBsb2dpYyB0byBzdGFydCwKKyAqIHVwZGF0ZSBhbmQgc3RvcCB0aGUgVS1BUFNEIHRyaWdnZXIgZnJhbWUgZ2VuZXJhdGlvbi4gSXQgYWxzbyBoYXMgbG9naWMgdG8KKyAqIHJlYWQgV01NIHJlbGF0ZWQgY29uZmlnIHBhcmFtZXRlcnMgZnJvbSB0aGUgcmVnaXN0cnkuCisgKgorICogT24gdGhlIGRhdGEgcGF0aCwgaXQgaGFzIHRoZSBsb2dpYyB0byBmaWd1cmUgb3V0IHRoZSBXTU0gQUMgb2YgYW4gZWdyZXNzCisgKiBwYWNrZXQgYW5kIHdoZW4gdG8gc2lnbmFsIFRMIHRvIHNlcnZlIGEgcGFydGljdWxhciBBQyBxdWV1ZS4gSXQgYWxzbyBoYXMgdGhlCisgKiBsb2dpYyB0byByZXRyaWV2ZSBhIHBhY2tldCBiYXNlZCBvbiBXTU0gcHJpb3JpdHkgaW4gcmVzcG9uc2UgdG8gYSBmZXRjaCBmcm9tCisgKiBUTC4KKyAqCisgKiBUaGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBhcmUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGluZm9ybWF0aW9uIGhpZGluZy4KKyAqLworCisvKiBJbmNsdWRlIGZpbGVzICovCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX21haW4uaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF93ZXh0Lmg+CisjaW5jbHVkZSA8c21lX3Fvc19hcGkuaD4KKworLypNYXhpbXVtIG51bWJlciBvZiBBQ3MgKi8KKyNkZWZpbmUgV0xBTl9NQVhfQUMgICAgICAgICAgICAgICAgICAgICAgICAgNAorCisKKy8qIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzICovCisKKy8qICNkZWZpbmUgSEREX1dNTV9ERUJVRyAxICovCisKKyNkZWZpbmUgSEREX1dNTV9DVFhfTUFHSUMgMHg1NzRkNGQ1OCAgICAvKiAiV01NWCIgKi8KKworI2RlZmluZSBIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAweEZGRkZGRkZGCisKKyNkZWZpbmUgSEREX1dMQU5fSU5WQUxJRF9TVEFfSUQgMHhGRgorCisvKiBUeXBlIERlY2xhcmF0aW9ucyAqLworCisvKioKKyAqIGVudW0gaGRkX3dtbV9jbGFzc2lmaWNhdGlvbjogdHlwZXMgb2YgY2xhc3NpZmljYXRpb24gc3VwcG9ydGVkCisgKi8KK3R5cGVkZWYgZW51bSBoZGRfd21tX2NsYXNzaWZpY2F0aW9uIHsKKwlIRERfV01NX0NMQVNTSUZJQ0FUSU9OX0RTQ1AgPSAwLAorCUhERF9XTU1fQ0xBU1NJRklDQVRJT05fODAyXzFRID0gMQorfSBoZGRfd21tX2NsYXNzaWZpY2F0aW9uX3Q7CisKKy8qKgorICogZW51bSBoZGRfd21tX3VzZXJfbW9kZSAtIFdNTSBtb2RlcyBvZiBvcGVyYXRpb24KKyAqCisgKiBASEREX1dNTV9VU0VSX01PREVfQVVUTzogU1RBIGNhbiBhc3NvY2lhdGUgd2l0aCBhbnkgQVAsICYgSEREIGxvb2tzIGF0CisgKgl0aGUgU01FIG5vdGlmaWNhdGlvbiBhZnRlciBhc3NvY2lhdGlvbiB0byBmaW5kIG91dCBpZiBhc3NvY2lhdGVkCisgKgl3aXRoIFFBUCBhbmQgYWN0cyBhY2NvcmRpbmdseQorICogQEhERF9XTU1fVVNFUl9NT0RFX1FCU1NfT05MWSAtIFNNRSB3aWxsIGFkZCB0aGUgZXh0cmEgbG9naWMgdG8gbWFrZSBzdXJlCisgKglTVEEgYXNzb2NpYXRlcyB3aXRoIGEgUUFQIG9ubHkKKyAqIEBIRERfV01NX1VTRVJfTU9ERV9OT19RT1MgLSBTTUUgd2lsbCBub3Qgam9pbiBhIFFvUyBBUCwgdW5sZXNzIHRoZSBwaHkKKyAqCW1vZGUgc2V0dGluZyBzYXlzICJBdXRvIi4gSW4gdGhhdCBjYXNlLCBTVEEgaXMgZnJlZSB0byBqb2luIDExbiBBUC4KKyAqCUFsdGhvdWdoIGZyb20gSEREIHBvaW50IG9mIHZpZXcsIGl0IHdpbGwgbm90IGJlIGRvaW5nIGFueSBwYWNrZXQKKyAqCWNsYXNzaWZpY2F0aW9ucy4KKyAqLwordHlwZWRlZiBlbnVtIGhkZF93bW1fdXNlcl9tb2RlIHsKKwlIRERfV01NX1VTRVJfTU9ERV9BVVRPID0gMCwKKwlIRERfV01NX1VTRVJfTU9ERV9RQlNTX09OTFkgPSAxLAorCUhERF9XTU1fVVNFUl9NT0RFX05PX1FPUyA9IDIsCit9IGhkZF93bW1fdXNlcl9tb2RlX3Q7CisKKy8qIFVBUFNEIE1hc2sgYml0cyAqLworLyogKEJpdDA6Vk87IEJpdDE6Vkk7IEJpdDI6Qks7IEJpdDM6QkUgYWxsIG90aGVyIGJpdHMgYXJlIGlnbm9yZWQpICovCisjZGVmaW5lIEhERF9BQ19WTyAweDEKKyNkZWZpbmUgSEREX0FDX1ZJIDB4MgorI2RlZmluZSBIRERfQUNfQksgMHg0CisjZGVmaW5lIEhERF9BQ19CRSAweDgKKworLyoqCisgKiBzdHJ1Y3QgaGRkX3dtbV9xb3NfY29udGV4dCAtIEhERCBXTU0gUW9TIENvbnRleHQKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgY29udGV4dCBmb3IgYSBzaW5nbGUgZmxvdyB3aGljaCBoYXMgZWl0aGVyCisgKiBiZWVuIGNvbmZndXJlZCBleHBsaWNpdGx5IGZyb20gdXNlcnNwYWNlIG9yIGltcGxpY2l0bHkgdmlhIHRoZQorICogSW1wbGljaXQgUW9TIGZlYXR1cmUuCisgKgorICogQG5vZGU6IGxpc3Qgbm9kZSB3aGljaCBjYW4gYmUgdXNlZCB0byBwdXQgdGhlIGNvbnRleHQgaW50byBhIGxpc3QKKyAqCW9mIGNvbnRleHRzCisgKiBAaGFuZGxlOiBpZGVudGlmZXIgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNvbnRleHQgdG8gdXNlcnNwYWNlCisgKiBAcW9zRmxvd0lEOiBpZGVudGlmaWVyIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBmbG93IHRvIFNNRQorICogQHBBZGFwdGVyOiBhZGFwdGVyIHVwb24gd2hpY2ggdGhpcyBmbG93IHdhcyBjb25maWd1cmVkCisgKiBAYWNUeXBlOiBhY2Nlc3MgY2F0ZWdvcnkgZm9yIHRoaXMgZmxvdworICogQGxhc3RTdGF0dXM6IHRoZSBzdGF0dXMgb2YgdGhlIGxhc3Qgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGlzIGZsb3cgYnkgU01FCisgKiBAd21tQWNTZXR1cEltcGxpY2l0UW9zOiB3b3JrIHN0cnVjdHVyZSB1c2VkIGZvciBkZWZlcnJpbmcgaW1wbGljaXQgUW9TIHdvcmsKKyAqCWZyb20gc29mdGlycSBjb250ZXh0IHRvIHRocmVhZCBjb250ZXh0CisgKiBAbWFnaWM6IG1hZ2ljIG51bWJlciB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2YWxpZCBjb250ZXh0IHdoZW4KKyAqCXJlZmVyZW5jZWQgYW5vbnltb3VzbHkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaGRkX3dtbV9xb3NfY29udGV4dCB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBxb3NGbG93SWQ7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJc21lX2FjX2VudW1fdHlwZSBhY1R5cGU7CisJaGRkX3dsYW5fd21tX3N0YXR1c19lIGxhc3RTdGF0dXM7CisJc3RydWN0IHdvcmtfc3RydWN0IHdtbUFjU2V0dXBJbXBsaWNpdFFvczsKKwl1aW50MzJfdCBtYWdpYzsKKwlib29sIGlzX2luYWN0aXZpdHlfdGltZXJfcnVubmluZzsKK30gaGRkX3dtbV9xb3NfY29udGV4dF90OworCisvKioKKyAqIHN0cnVjdCBoZGRfd21tX2FjX3N0YXR1cyAtIFdNTSByZWxhdGVkIHBlci1BQyBzdGF0ZSAmIHN0YXR1cyBpbmZvCisgKiBAd21tQWNBY2Nlc3NSZXF1aXJlZCAtIGRvZXMgdGhlIEFQIHJlcXVpcmUgYWNjZXNzIHRvIHRoaXMgQUM/CisgKiBAd21tQWNBY2Nlc3NOZWVkZWQgLSBkb2VzIHRoZSB3b3JrZXIgdGhyZWFkIG5lZWQgdG8gYWNxdWlyZSBhY2Nlc3MgdG8KKyAqCXRoaXMgQUM/CisgKiBAd21tQWNBY2Nlc3NQZW5kaW5nIC0gaXMgaW1wbGljaXQgUW9TIG5lZ290aWF0aW9uIGN1cnJlbnRseSB0YWtpbmcgcGxhY2U/CisgKiBAd21tQWNBY2Nlc3NGYWlsZWQgLSBoYXMgaW1wbGljaXQgUW9TIG5lZ290aWF0aW9uIGFscmVhZHkgZmFpbGVkPworICogQHdtbUFjQWNjZXNzR3JhbnRlZCAtIGhhcyBpbXBsaWNpdCBRb1MgbmVnb3RpYXRpb24gYWxyZWFkeSBzdWNjZWVkZWQ/CisgKiBAd21tQWNBY2Nlc3NBbGxvd2VkIC0gaXMgYWNjZXNzIHRvIHRoaXMgQUMgYWxsb3dlZCwgZWl0aGVyIGJlY2F1c2Ugd2UKKyAqCWFyZSBub3QgZG9pbmcgV01NLCB3ZSBhcmUgbm90IGRvaW5nIGltcGxpY2l0IFFvUywgaW1wbGljdCBRb1MgaGFzCisgKgljb21wbGV0ZWQsIG9yIGV4cGxpY2l0IFFvUyBoYXMgY29tcGxldGVkPworICogQHdtbUFjVHNwZWNWYWxpZCAtIGlzIHRoZSB3bW1BY1RzcGVjSW5mbyB2YWxpZD8KKyAqIEB3bW1BY1VhcHNkSW5mb1ZhbGlkIC0gYXJlIHRoZSB3bW1BY1VhcHNkKiBmaWVsZHMgdmFsaWQ/CisgKiBAd21tQWNUc3BlY0luZm8gLSBjdXJyZW50IChwb3NzaWJseSBhZ2dyZWdhdGUpIFRzcGVjIGZvciB0aGlzIEFDCisgKiBAd21tQWNJc1VhcHNkRW5hYmxlZCAtIGlzIFVBUFNEIGVuYWJsZWQgb24gdGhpcyBBQz8KKyAqIEB3bW1BY1VhcHNkU2VydmljZUludGVydmFsIC0gc2VydmljZSBpbnRlcnZhbCBmb3IgdGhpcyBBQworICogQHdtbUFjVWFwc2RTdXNwZW5zaW9uSW50ZXJ2YWwgLSBzdXNwZW5zaW9uIGludGVydmFsIGZvciB0aGlzIEFDCisgKiBAd21tQWNVYXBzZERpcmVjdGlvbiAtIGRpcmVjdGlvbiBmb3IgdGhpcyBBQworICogQHdtbUluYWN0aXZpdHlUaW1lIC0gaW5hY3Rpdml0eSB0aW1lIGZvciB0aGlzIEFDCisgKiBAd21tUHJldlRyYWZmaWNDbnQgLSBUWCBjb3VudGVyIHVzZWQgZm9yIGluYWN0aXZpdHkgZGV0ZWN0aW9uCisgKiBAd21tSW5hY3Rpdml0eVRpbWVyIC0gdGltZXIgdXNlZCBmb3IgaW5hY3Rpdml0eSBkZXRlY3Rpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaGRkX3dtbV9hY19zdGF0dXMgeworCWJvb2wgd21tQWNBY2Nlc3NSZXF1aXJlZDsKKwlib29sIHdtbUFjQWNjZXNzTmVlZGVkOworCWJvb2wgd21tQWNBY2Nlc3NQZW5kaW5nOworCWJvb2wgd21tQWNBY2Nlc3NGYWlsZWQ7CisJYm9vbCB3bW1BY0FjY2Vzc0dyYW50ZWQ7CisJYm9vbCB3bW1BY0FjY2Vzc0FsbG93ZWQ7CisJYm9vbCB3bW1BY1RzcGVjVmFsaWQ7CisJYm9vbCB3bW1BY1VhcHNkSW5mb1ZhbGlkOworCXNtZV9Rb3NXbW1Uc3BlY0luZm8gd21tQWNUc3BlY0luZm87CisJYm9vbCB3bW1BY0lzVWFwc2RFbmFibGVkOworCXVpbnQzMl90IHdtbUFjVWFwc2RTZXJ2aWNlSW50ZXJ2YWw7CisJdWludDMyX3Qgd21tQWNVYXBzZFN1c3BlbnNpb25JbnRlcnZhbDsKKwlzbWVfUW9zV21tRGlyVHlwZSB3bW1BY1VhcHNkRGlyZWN0aW9uOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXVpbnQzMl90IHdtbUluYWN0aXZpdHlUaW1lOworCXVpbnQzMl90IHdtbVByZXZUcmFmZmljQ250OworCWNkZl9tY190aW1lcl90IHdtbUluYWN0aXZpdHlUaW1lcjsKKyNlbmRpZgorCit9IGhkZF93bW1fYWNfc3RhdHVzX3Q7CisKKy8qKgorICogc3RydWN0IGhkZF93bW1fc3RhdHVzIC0gV01NIHN0YXR1cyBtYWludGFpbmVkIHBlci1hZGFwdGVyCisgKiBAd21tQ29udGV4dExpc3QgLSBsaXN0IG9mIFdNTSBjb250ZXh0cyBhY3RpdmUgb24gdGhlIGFkYXB0ZXIKKyAqIEB3bW1Mb2NrIC0gbXV0ZXggdXNlZCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGlzIGFkYXB0ZXIncyBXTU0gc3RhdHVzCisgKiBAd21tQUNTdGF0dXMgLSBwZXItQUMgV01NIHN0YXR1cworICogQHdtbVFhcCAtIGlzIHRoaXMgY29ubmVjdGVkIHRvIGEgUW9TLWVuYWJsZWQgQVA/CisgKiBAd21tUW9zQ29ubmVjdGlvbiAtIGlzIHRoaXMgYSBRb1MgY29ubmVjdGlvbj8KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaGRkX3dtbV9zdGF0dXMgeworCXN0cnVjdCBsaXN0X2hlYWQgd21tQ29udGV4dExpc3Q7CisJc3RydWN0IG11dGV4IHdtbUxvY2s7CisJaGRkX3dtbV9hY19zdGF0dXNfdCB3bW1BY1N0YXR1c1tXTEFOX01BWF9BQ107CisJYm9vbCB3bW1RYXA7CisJYm9vbCB3bW1Rb3NDb25uZWN0aW9uOworfSBoZGRfd21tX3N0YXR1c190OworCitleHRlcm4gY29uc3QgdWludDhfdCBoZGRfcWRpc2NfYWNfdG9fdGxfYWNbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGhkZF93bW1fdXBfdG9fYWNfbWFwW107CitleHRlcm4gY29uc3QgdWludDhfdCBoZGRfbGludXhfdXBfdG9fYWNfbWFwW107CisKKyNkZWZpbmUgV0xBTl9IRERfTUFYX0RTQ1AgMHgzZgorCisvKioKKyAqIGhkZF93bW1wc19oZWxwZXIoKSAtIEZ1bmN0aW9uIHRvIHNldCB1YXBzZCBwc2IgZHluYW1pY2FsbHkKKyAqCisgKiBAcEFkYXB0ZXI6IFtpbl0gcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdHVyZQorICogQHB0cjogW2luXSBwb2ludGVyIHRvIGNvbW1hbmQgYnVmZmVyCisgKgorICogUmV0dXJuOiBaZXJvIG9uIHN1Y2Nlc3MsIGFwcHJvcHJpYXRlIGVycm9yIG9uIGZhaWx1cmUuCisgKi8KK2ludCBoZGRfd21tcHNfaGVscGVyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90ICpwdHIpOworCisvKioKKyAqIGhkZF93bW1faW5pdCgpIC0gaW5pdGlhbGl6ZSB0aGUgV01NIERTQ1AgY29uZmlndWF0aW9uCisgKiBAcEFkYXB0ZXIgOiBbaW5dICBwb2ludGVyIHRvIEFkYXB0ZXIgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIHRoZSBXTU0gRFNDUCBjb25maWd1YXRpb24gb2YgYW4KKyAqIGFkYXB0ZXIgdG8gYW4gaW5pdGlhbCBzdGF0ZS4gIFRoZSBjb25maWd1cmF0aW9uIGNhbiBsYXRlciBiZQorICogb3ZlcndyaXR0ZW4gdmlhIGFwcGxpY2F0aW9uIEFQSXMgb3IgdmlhIFFvUyBNYXAgc2VudCBPVEEuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgaGRkX3dtbV9pbml0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKKworLyoqCisgKiBoZGRfd21tX2FkYXB0ZXJfaW5pdCgpIC0gaW5pdGlhbGl6ZSB0aGUgV01NIGNvbmZpZ3VyYXRpb24gb2YgYW4gYWRhcHRlcgorICogQHBBZGFwdGVyOiBbaW5dICBwb2ludGVyIHRvIEFkYXB0ZXIgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIHRoZSBXTU0gY29uZmlndWF0aW9uIGFuZCBzdGF0dXMgb2YgYW4KKyAqIGFkYXB0ZXIgdG8gYW4gaW5pdGlhbCBzdGF0ZS4gIFRoZSBjb25maWd1cmF0aW9uIGNhbiBsYXRlciBiZQorICogb3ZlcndyaXR0ZW4gdmlhIGFwcGxpY2F0aW9uIEFQSXMKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyBoZGRfd21tX2FkYXB0ZXJfaW5pdChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKKy8qKgorICogaGRkX3dtbV9jbG9zZSgpIC0gV01NIGNsb3NlIGZ1bmN0aW9uCisgKiBAcEFkYXB0ZXI6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKgorICogRnVuY3Rpb24gd2hpY2ggd2lsbCBwZXJmb3JtIGFueSBuZWNlc3Nhcnkgd29yayB0byB0byBjbGVhbiB1cCB0aGUKKyAqIFdNTSBmdW5jdGlvbmFsaXR5IHByaW9yIHRvIHRoZSBrZXJuZWwgbW9kdWxlIHVubG9hZC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyBoZGRfd21tX2FkYXB0ZXJfY2xvc2UoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCisvKioKKyAqIGhkZF93bW1fc2VsZWN0X3F1ZXVlKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGNsYXNzaWZ5IHRoZSBwYWNrZXQKKyAqICAgICAgIGFjY29yZGluZyB0byBsaW51eCBxZGlzYyBleHBlY3RhdGlvbi4KKyAqCisgKiBAZGV2OiBbaW5dIHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqIEBza2I6IFtpbl0gcG9pbnRlciB0byBvcyBwYWNrZXQKKyAqCisgKiBSZXR1cm46IFFkaXNjIHF1ZXVlIGluZGV4CisgKi8KK3VpbnQxNl90IGhkZF93bW1fc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCisvKioKKyAqIGhkZF9ob3N0YXBkX3NlbGVjdF9xdWV1ZSgpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBjbGFzc2lmeSB0aGUgcGFja2V0CisgKiAgICAgICBhY2NvcmRpbmcgdG8gbGludXggcWRpc2MgZXhwZWN0YXRpb24uCisgKgorICogQGRldjogW2luXSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiBAc2tiOiBbaW5dIHBvaW50ZXIgdG8gb3MgcGFja2V0CisgKgorICogUmV0dXJuOiBRZGlzYyBxdWV1ZSBpbmRleAorICovCit1aW50MTZfdCBoZGRfaG9zdGFwZF9zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTMsIDApKQorCQkJCSAgLCB2b2lkICphY2NlbF9wcml2CisjZW5kaWYKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE0LCAwKSkKKwkJCQkgICwgc2VsZWN0X3F1ZXVlX2ZhbGxiYWNrX3QgZmFsbGJhY2sKKyNlbmRpZgorKTsKKworLyoqCisgKiBoZGRfd21tX2FjcXVpcmVfYWNjZXNzX3JlcXVpcmVkKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGRldGVybWluZQorICogYWNxdWlyZSBhZG1pdHRhbmNlIGZvciBhIFdNTSBBQyBpcyByZXF1aXJlZCBvciBub3QgYmFzZWQgb24gcHNiIGNvbmZpZ3VyYXRpb24KKyAqIGRvbmUgaW4gZnJhbWV3b3JrCisgKgorICogQHBBZGFwdGVyOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBhY1R5cGU6IFtpbl0gV01NIEFDIHR5cGUgb2YgT1MgcGFja2V0CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgaGRkX3dtbV9hY3F1aXJlX2FjY2Vzc19yZXF1aXJlZChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgIHNtZV9hY19lbnVtX3R5cGUgYWNUeXBlKTsKKworLyoqCisgKiBoZGRfd21tX2FjcXVpcmVfYWNjZXNzKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGF0dGVtcHQgdG8gYWNxdWlyZQorICogYWRtaXR0YW5jZSBmb3IgYSBXTU0gQUMKKyAqCisgKiBAcEFkYXB0ZXI6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKiBAYWNUeXBlOiBbaW5dICBXTU0gQUMgdHlwZSBvZiBPUyBwYWNrZXQKKyAqIEBwR3JhbnRlZDogW291dF0gcG9pbnRlciB0byBib29sIGZsYWcgd2hlbiBpbmRpY2F0ZXMgaWYgYWNjZXNzCisgKgkgICAgICBoYXMgYmVlbiBncmFudGVkIG9yIG5vdAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitDREZfU1RBVFVTIGhkZF93bW1fYWNxdWlyZV9hY2Nlc3MoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICBzbWVfYWNfZW51bV90eXBlIGFjVHlwZSwgYm9vbCAqcEdyYW50ZWQpOworCisvKioKKyAqIGhkZF93bW1fYXNzb2MoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSBob3VzZWtlZXBpbmcKKyAqIHJlcXVpcmVkIGJ5IFdNTSB3aGVuIGFzc29jaWF0aW9uIHRha2VzIHBsYWNlCisgKgorICogQHBBZGFwdGVyOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICogQHBSb2FtSW5mbzogW2luXSAgcG9pbnRlciB0byByb2FtIGluZm9ybWF0aW9uCisgKiBAZUJzc1R5cGU6IFtpbl0gIHR5cGUgb2YgQlNTCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgaGRkX3dtbV9hc3NvYyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCSB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywgZUNzclJvYW1Cc3NUeXBlIGVCc3NUeXBlKTsKKworLyoqCisgKiBoZGRfd21tX2Nvbm5lY3QoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSBob3VzZWtlZXBpbmcKKyAqIHJlcXVpcmVkIGJ5IFdNTSB3aGVuIGEgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZAorICoKKyAqIEBwQWRhcHRlciA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKiBAcFJvYW1JbmZvOiBbaW5dICBwb2ludGVyIHRvIHJvYW0gaW5mb3JtYXRpb24KKyAqIEBlQnNzVHlwZSA6IFtpbl0gIHR5cGUgb2YgQlNTCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgaGRkX3dtbV9jb25uZWN0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8sIGVDc3JSb2FtQnNzVHlwZSBlQnNzVHlwZSk7CisKKy8qKgorICogaGRkX3dtbV9nZXRfdWFwc2RfbWFzaygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBjYWxjdWxhdGUgdGhlCisgKiBpbml0aWFsIHZhbHVlIG9mIHRoZSBVQVBTRCBtYXNrIGJhc2VkIHVwb24gdGhlIGRldmljZSBjb25maWd1cmF0aW9uCisgKgorICogQHBBZGFwdGVyICA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKiBAcFVhcHNkTWFzazogW291dF0gcG9pbnRlciB0byB3aGVyZSB0aGUgVUFQU0QgTWFzayBpcyB0byBiZSBzdG9yZWQKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyBoZGRfd21tX2dldF91YXBzZF9tYXNrKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgdWludDhfdCAqcFVhcHNkTWFzayk7CisKKy8qKgorICogaGRkX3dtbV9pc19hY3RpdmUoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIGlmIFdNTSBpcworICogYWN0aXZlIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KKyAqCisgKiBAcEFkYXB0ZXI6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKgorICogUmV0dXJuOiB0cnVlIGlmIFdNTSBpcyBlbmFibGVkLCBmYWxzZSBpZiBXTU0gaXMgbm90IGVuYWJsZWQKKyAqLworYm9vbCBoZGRfd21tX2lzX2FjdGl2ZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKKy8qKgorICogaGRkX3dtbV9hZGR0cygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBhZGQgYSB0cmFmZmljIHNwZWMgYXQgdGhlCisgKiByZXF1ZXN0IG9mIGFuIGFwcGxpY2F0aW9uCisgKgorICogQHBBZGFwdGVyICA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKiBAaGFuZGxlICAgIDogW2luXSAgaGFuZGxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgVFMKKyAqIEBwVHNwZWMgICAgOiBbaW5dICBwb2ludGVyIHRvIHRoZSB0cmFmZmljIHNwZWMKKyAqCisgKiBSZXR1cm46IEhERF9XTEFOX1dNTV9TVEFUVVNfKgorICovCitoZGRfd2xhbl93bW1fc3RhdHVzX2UgaGRkX3dtbV9hZGR0cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgdWludDMyX3QgaGFuZGxlLAorCQkJCSAgICBzbWVfUW9zV21tVHNwZWNJbmZvICpwVHNwZWMpOworCisvKioKKyAqIGhkZF93bW1fZGVsdHMoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZGVsZXRlIGEgdHJhZmZpYyBzcGVjIGF0IHRoZQorICogcmVxdWVzdCBvZiBhbiBhcHBsaWNhdGlvbgorICoKKyAqIEBwQWRhcHRlcjogW2luXSAgcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAqIEBoYW5kbGU6IFtpbl0gIGhhbmRsZSB0byB1bmlxdWVseSBpZGVudGlmeSBhIFRTCisgKgorICogUmV0dXJuOiBIRERfV0xBTl9XTU1fU1RBVFVTXyoKKyAqLworaGRkX3dsYW5fd21tX3N0YXR1c19lIGhkZF93bW1fZGVsdHMoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVpbnQzMl90IGhhbmRsZSk7CisKKy8qKgorICogaGRkX3dtbV9jaGVja3RzKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIHJldHVybiB0aGUgc3RhdHVzIG9mIGEgdHJhZmZpYworICogc3BlYyBhdCB0aGUgcmVxdWVzdCBvZiBhbiBhcHBsaWNhdGlvbgorICoKKyAqIEBwQWRhcHRlcjogW2luXSAgcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAqIEBoYW5kbGU6IFtpbl0gIGhhbmRsZSB0byB1bmlxdWVseSBpZGVudGlmeSBhIFRTCisgKgorICogUmV0dXJuOiBIRERfV0xBTl9XTU1fU1RBVFVTXyoKKyAqLworaGRkX3dsYW5fd21tX3N0YXR1c19lIGhkZF93bW1fY2hlY2t0cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICB1aW50MzJfdCBoYW5kbGUpOworLyoqCisgKiBoZGRfd21tX2FkYXB0ZXJfY2xlYXIoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgY2xlYXIgdGhlIFdNTSBzdGF0dXMKKyAqIGZvciBhbGwgdGhlIEFDcworICoKKyAqIEBwQWRhcHRlcjogW2luXSAgcG9pbnRlciB0byBBZGFwdGVyIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyBoZGRfd21tX2FkYXB0ZXJfY2xlYXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCit2b2lkIHdsYW5faGRkX3Byb2Nlc3NfcGVlcl91bmF1dGhvcmlzZWRfcGF1c2UoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcik7CisjZW5kaWYgLyogI2lmbmRlZiBfV0xBTl9IRERfV01NX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL2luYy93bGFuX2hkZF93b3dsLmggYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfd293bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzBmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9pbmMvd2xhbl9oZGRfd293bC5oCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9XTEFOX0hERF9XT1dMX0gKKyNkZWZpbmUgX1dMQU5fSEREX1dPV0xfSAorCisvKioKKyAqIERPQzogd2xhbl9oZGRfd293bAorICoKKyAqIFRoaXMgbW9kdWxlIGhvdXNlcyBhbGwgdGhlIGxvZ2ljIGZvciBXT1dMIGluIEhERC4KKyAqCisgKiBJdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIEFQSXMKKyAqCisgKiAtIEFiaWxpdHkgdG8gZW5hYmxlL2Rpc2FibGUgZm9sbG93aW5nIFdvV0wgbW9kZXMKKyAqICAxKSBNYWdpYyBwYWNrZXQgKE1QKSBtb2RlCisgKiAgMikgUGF0dGVybiBCeXRlIE1hdGNoaW5nIChQQk0pIG1vZGUKKyAqIC0gQWJpbGl0eSB0byBhZGQvcmVtb3ZlIHBhdHRlcm5zIGZvciBQQk0KKyAqCisgKiBBIE1hZ2ljIFBhY2tldCBpcyBhIHBhY2tldCB0aGF0IGNvbnRhaW5zIDYgMHhGRnMgZm9sbG93ZWQgYnkgMTYKKyAqIGNvbnRpZ3VvdXMgY29waWVzIG9mIHRoZSByZWNlaXZpbmcgTklDJ3MgRXRoZXJuZXQgYWRkcmVzcy4gVGhlcmUgaXMKKyAqIG5vIEFQSSB0byBjb25maWd1cmUgTWFnaWMgUGFja2V0IFBhdHRlcm4uCisgKgorICogV2FrZXVwIHBhdHRlcm4gKHVzZWQgZm9yIFBCTSkgaXMgZGVmaW5lZCBhcyBmb2xsb3dpbmc6CisgKiB0eXBlZGVmIHN0cnVjdAorICogeworICogIFU4ICBQYXR0ZXJuU2l6ZTsgICAgICAgICAgICAgICAgICAvLyBOb24tWmVybyBwYXR0ZXJuIHNpemUKKyAqICBVOCAgUGF0dGVybk1hc2tTaXplOyAgICAgICAgICAgICAgLy8gTm9uLXplcm8gcGF0dGVybiBtYXNrIHNpemUKKyAqICBVOCAgUGF0dGVybk1hc2tbUGF0dGVybk1hc2tTaXplXTsgLy8gUGF0dGVybiBtYXNrCisgKiAgVTggIFBhdHRlcm5bUGF0dGVyblNpemVdOyAgICAgICAgIC8vIFBhdHRlcm4KKyAqIH0gaGRkX3dvd2xfcHRybl90OworICoKKyAqIFBhdHRlcm5TaXplIGFuZCBQYXR0ZXJuTWFza1NpemUgaW5kaWNhdGUgc2l6ZSBvZiB0aGUgdmFyaWFibGUKKyAqIGxlbmd0aCBQYXR0ZXJuIGFuZCBQYXR0ZXJuTWFzay4gUGF0dGVybk1hc2sgaW5kaWNhdGVzIHdoaWNoIGJ5dGVzCisgKiBvZiBhbiBpbmNvbWluZyBwYWNrZXQgc2hvdWxkIGJlIGNvbXBhcmVkIHdpdGggY29ycmVzcG9uZGluZyBieXRlcworICogaW4gdGhlIHBhdHRlcm4uCisgKgorICogTWF4aW11bSBhbGxvd2VkIHBhdHRlcm4gc2l6ZSBpcyAxMjggYnl0ZXMuIE1heGltdW0gYWxsb3dlZAorICogUGF0dGVybk1hc2tTaXplIGlzIDE2IGJ5dGVzLgorICoKKyAqIE1heGltdW0gbnVtYmVyIG9mIHBhdHRlcm5zIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgaXMgOAorICoKKyAqIEhERCB3aWxsIGFkZCBmb2xsb3dpbmcgMiBjb21tb25seSB1c2VkIHBhdHRlcm5zIGZvciBQQk0gYnkgZGVmYXVsdDoKKyAqICAxKSBBUlAgQnJvYWRjYXN0IFBhdHRlcm4KKyAqICAyKSBVbmljYXN0IFBhdHRlcm4KKyAqCisgKiBIb3dldmVyIG5vdGUgdGhhdCBXb1dMIHdpbGwgbm90IGJlIGVuYWJsZWQgYnkgZGVmYXVsdCBieSBIREQuIFdvV0wKKyAqIG5lZWRzIHRvIGVuYWJsZWQgZXhwbGNpdGx5IGJ5IGV4ZXJjaXNpbmcgdGhlIGl3cHJpdiBjb21tYW5kLgorICoKKyAqIEhERCB3aWxsIGV4cG9zZSBhbiBBUEkgdGhhdCBhY2NlcHRzIHBhdHRlcm5zIGFzIEhleCBzdHJpbmcgaW4gdGhlCisgKiBmb2xsb3dpbmcgZm9ybWF0OgorICogIlBhdHRlcm5TaXplOlBhdHRlcm5NYXNrU2l6ZTpQYXR0ZXJuTWFzazpQYXR0ZXJuIgorICoKKyAqIE11bHRpcGxlIHBhdHRlcm5zIGNhbiBiZSBzcGVjaWZpZWQgYnkgZGVsZWltaXRpbmcgZWFjaCBwYXR0ZXJuIHdpdGgKKyAqIHRoZSAnOycgdG9rZW46CisgKiAiUGF0dGVyblNpemUxOlBhdHRlcm5NYXNrU2l6ZTE6UGF0dGVybk1hc2sxOlBhdHRlcm4xO1BhdHRlcm5TaXplMjouLi4iCisgKgorICogUGF0dGVybnMgY2FuIGJlIGNvbmZpZ3VyZWQgZHluYW1pY2FsbHkgdmlhIGl3cHJpdiBjbWQgb3Igc3RhdGljYWxseQorICogdmlhIHFjb21fY2ZnLmluaSBmaWxlCisgKgorICogUEJNICh3aGVuIGVuYWJsZWQpIGNhbiBwZXJmb3JtIGZpbHRlcmluZyBvbiB1bmljYXN0IGRhdGEgb3IKKyAqIGJyb2FkY2FzdCBkYXRhIG9yIGJvdGguIFRoZXNlIGNvbmZpZ3VyYXRpb25zIGFyZSBwYXJ0IG9mIGZhY3RvcnkKKyAqIGRlZmF1bHRzIChjZmcuZGF0KSBhbmQgdGhlIGRlYWZ1bHQgYmVoYXZpb3IgaXMgdG8gcGVyZm9ybSBmaWx0ZXJpbmcKKyAqIG9uIGJvdGggdW5pY2FzdCBhbmQgZGF0YSBmcmFtZXMuCisgKgorICogTVAgZmlsdGVyaW5nICh3aGVuIGVuYWJsZWQpIGlzIHBlcmZvcm1lZCBBTFdBWVMgb24gYm90aCB1bmljYXN0IGFuZAorICogYnJvYWRjYXN0IGRhdGEgZnJhbWVzLgorICoKKyAqIE1hbmdlbWVudCBmcmFtZXMgYXJlIG5vdCBzdWJqZWN0ZWQgdG8gV29XTCBmaWx0ZXJpbmcgYW5kIGFyZQorICogZGlzY2FyZGVkIHdoZW4gV29XTCBpcyBlbmFibGVkLgorICoKKyAqIFdoZW5ldmVyIGEgcGF0ZXJuIG1hdGNoIHN1Y2NlZWRzLCBSWCBwYXRoIGlzIHJlc3RvcmVkIGFuZCBwYWNrZXRzCisgKiAoYm90aCBtYW5hZ2VtZW50IGFuZCBkYXRhKSB3aWxsIGJlIHB1c2hlZCB0byB0aGUgaG9zdCBmcm9tIHRoYXQKKyAqIHBvaW50IG9ud2FyZHMuICBUaGVyZWZvcmUsIGV4aXQgZnJvbSBXb1dMIGlzIGltcGxpY2l0IGFuZCBoYXBwZW5zCisgKiBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGZpcnN0IHBhY2tldCBtYXRjaCBzdWNjZWVkcy4KKyAqCisgKiBXb1dMIHdvcmtzIG9uIHRvcCBvZiBCTVBTLiBTbyB3aGVuIFdvV0wgaXMgcmVxdWVzdGVkLCBTTUUgd2lsbAorICogYXR0ZW1wdCB0byBwdXQgdGhlIGRldmljZSBpbiBCTVBTIG1vZGUgKGlmIG5vdCBhbHJlYWR5IGluIEJNUFMpLiBJZgorICogYXR0ZW1wdCB0byBCTVBTIGZhaWxzLCByZXF1ZXN0IGZvciBXb1dMIHdpbGwgYmUgcmVqZWN0ZWQuCisgKi8KKworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorCisjZGVmaW5lIFdPV0xfUFRSTl9NQVhfU0laRSAgICAgICAgICAxNDYKKyNkZWZpbmUgV09XTF9QVFJOX01BU0tfTUFYX1NJWkUgICAgICAxOQorI2RlZmluZSBXT1dMX01BWF9QVFJOU19BTExPV0VEICAgICAgIENGR19NQVhfV09XX0ZJTFRFUlNfTUFYCisKKy8qKgorICogaGRkX2FkZF93b3dsX3B0cm4oKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgYWRkIHRoZSBXb1dMIHBhdHRlcm4gdG8gYmUKKyAqCQkJIHVzZWQgd2hlbiBQQk0gZmlsdGVyaW5nIGlzIGVuYWJsZWQKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byB0aGUgYWRhcHRlcgorICogQHB0cm46IHBvaW50ZXIgdG8gdGhlIHBhdHRlcm4gc3RyaW5nIHRvIGJlIGFkZGVkCisgKgorICogUmV0dXJuOiBmYWxzZSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCB0cnVlIG90aGVyd2lzZQorICovCitib29sIGhkZF9hZGRfd293bF9wdHJuKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBjb25zdCBjaGFyICpwdHJuKTsKKworLyoqCisgKiBoZGRfZGVsX3dvd2xfcHRybigpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCByZW1vdmUgYSBXb1dMIHBhdHRlcm4KKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byB0aGUgYWRhcHRlcgorICogQHB0cm46IHBvaW50ZXIgdG8gdGhlIHBhdHRlcm4gc3RyaW5nIHRvIGJlIHJlbW92ZWQKKyAqCisgKiBSZXR1cm46IGZhbHNlIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQsIHRydWUgb3RoZXJ3aXNlCisgKi8KK2Jvb2wgaGRkX2RlbF93b3dsX3B0cm4oaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IGNoYXIgKnB0cm4pOworCisvKioKKyAqIGhkZF9hZGRfd293bF9wdHJuX2RlYnVnZnMoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgYWRkIGEgV29XIHBhdHRlcm4KKyAqCQkJCSBzZW50IGZyb20gZGVidWdmcyBpbnRlcmZhY2UKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byB0aGUgYWRhcHRlcgorICogQHBhdHRlcm5faWR4OiBpbmRleCBvZiB0aGUgcGF0dGVybiB0byBiZSBhZGRlZAorICogQHBhdHRlcm5fb2Zmc2V0OiBvZmZzZXQgb2YgdGhlIHBhdHRlcm4gaW4gdGhlIGZyYW1lIHBheWxvYWQKKyAqIEBwYXR0ZXJuX2J1ZjogcG9pbnRlciB0byB0aGUgcGF0dGVybiBoZXggc3RyaW5nIHRvIGJlIGFkZGVkCisgKiBAcGF0dGVybl9tYXNrOiBwb2ludGVyIHRvIHRoZSBwYXR0ZXJuIG1hc2sgaGV4IHN0cmluZworICoKKyAqIFJldHVybjogZmFsc2UgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwgdHJ1ZSBvdGhlcndpc2UKKyAqLworYm9vbCBoZGRfYWRkX3dvd2xfcHRybl9kZWJ1Z2ZzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90IHBhdHRlcm5faWR4LAorCQkJICAgICAgIHVpbnQ4X3QgcGF0dGVybl9vZmZzZXQsIGNoYXIgKnBhdHRlcm5fYnVmLAorCQkJICAgICAgIGNoYXIgKnBhdHRlcm5fbWFzayk7CisKKy8qKgorICogaGRkX2RlbF93b3dsX3B0cm5fZGVidWdmcygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCByZW1vdmUgYSBXb1cgcGF0dGVybgorICoJCQkJIHNlbnQgZnJvbSBkZWJ1Z2ZzIGludGVyZmFjZQorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKiBAcGF0dGVybl9pZHg6IGluZGV4IG9mIHRoZSBwYXR0ZXJuIHRvIGJlIHJlbW92ZWQKKyAqCisgKiBSZXR1cm46IGZhbHNlIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQsIHRydWUgb3RoZXJ3aXNlCisgKi8KK2Jvb2wgaGRkX2RlbF93b3dsX3B0cm5fZGVidWdmcyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdWludDhfdCBwYXR0ZXJuX2lkeCk7CisKKy8qKgorICogaGRkX2VudGVyX3dvd2woKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZW5hYmxlIFdvV0wuIEF0IGxlYXN0IG9uZQorICoJCSAgICAgIG9mIE1QIGFuZCBQQk0gbXVzdCBiZSBlbmFibGVkCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIKKyAqIEBlbmFibGVfbXA6IFdoZXRoZXIgdG8gZW5hYmxlIG1hZ2ljIHBhY2tldCBXb1dMIG1vZGUKKyAqIEBlbmFibGVfcGJtOiBXaGV0aGVyIHRvIGVuYWJsZSBwYXR0ZXJuIGJ5dGUgbWF0Y2hpbmcgV29XTCBtb2RlCisgKgorICogUmV0dXJuOiBmYWxzZSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCB0cnVlIG90aGVyd2lzZQorICovCitib29sIGhkZF9lbnRlcl93b3dsKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBib29sIGVuYWJsZV9tcCwgYm9vbCBlbmFibGVfcGJtKTsKKworLyoqCisgKiBoZGRfZXhpdF93b3dsKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGRpc2FibGUgV29XTAorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKgorICogUmV0dXJuOiBmYWxzZSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCB0cnVlIG90aGVyd2lzZQorICovCitib29sIGhkZF9leGl0X3dvd2woaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCisvKioKKyAqIGhkZF9pbml0X3dvd2woKSAtIEluaXQgZnVuY3Rpb24gd2hpY2ggd2lsbCBpbml0aWFsaXplIHRoZSBXb1dMIG1vZHVsZQorICoJCSAgICAgYW5kIHBlcmZvcm0gYW55IHJlcXVpcmVkIGluaXRpYWwgY29uZmlndXJhdGlvbgorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKgorICogUmV0dXJuOiBmYWxzZSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCB0cnVlIG90aGVyd2lzZQorICovCitib29sIGhkZF9pbml0X3dvd2woaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCisjZW5kaWYgLyogI2lmbmRlZiBfV0xBTl9IRERfV09XTF9IICovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfYXNzb2MuYyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9hc3NvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNTk3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfYXNzb2MuYwpAQCAtMCwwICsxLDU0MjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogIERPQzogd2xhbl9oZGRfYXNzb2MuYworICoKKyAqICBXTEFOIEhvc3QgRGV2aWNlIERyaXZlciBpbXBsZW1lbnRhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSAid2xhbl9oZGRfaW5jbHVkZXMuaCIKKyNpbmNsdWRlIDxhbmlfZ2xvYmFsLmg+CisjaW5jbHVkZSAiZG90MTFmLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfcG93ZXIuaCIKKyNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisjaW5jbHVkZSAid2xhbl9oZGRfY2ZnODAyMTEuaCIKKyNpbmNsdWRlICJjc3JfaW5zaWRlX2FwaS5oIgorI2luY2x1ZGUgIndsYW5faGRkX3AycC5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisjaW5jbHVkZSAid2xhbl9oZGRfdGRscy5oIgorI2VuZGlmCisjaW5jbHVkZSAic21lX2FwaS5oIgorI2luY2x1ZGUgIndsYW5faGRkX2hvc3RhcGQuaCIKKyNpbmNsdWRlIDx3bGFuX2hkZF9pcGEuaD4KKyNpbmNsdWRlIDxjZHNfc2NoZWQuaD4KKyNpbmNsdWRlICJjZHNfY29uY3VycmVuY3kuaCIKKyNpbmNsdWRlICJzbWVfcG93ZXJfc2F2ZV9hcGkuaCIKKyNpbmNsdWRlICJvbF90eHJ4X2N0cmxfYXBpLmgiCisjaW5jbHVkZSAib2xfdHhyeF90eXBlcy5oIgorCisvKiBUaGVzZSBhcmUgbmVlZGVkIHRvIHJlY29nbml6ZSBXUEEgYW5kIFJTTiBzdWl0ZSB0eXBlcyAqLworI2RlZmluZSBIRERfV1BBX09VSV9TSVpFIDQKKyNkZWZpbmUgSEREX1JTTl9PVUlfU0laRSA0Cit1aW50OF90IGNjcF93cGFfb3VpMDBbSEREX1dQQV9PVUlfU0laRV0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDAgfTsKK3VpbnQ4X3QgY2NwX3dwYV9vdWkwMVtIRERfV1BBX09VSV9TSVpFXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSB9OwordWludDhfdCBjY3Bfd3BhX291aTAyW0hERF9XUEFfT1VJX1NJWkVdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAyIH07Cit1aW50OF90IGNjcF93cGFfb3VpMDNbSEREX1dQQV9PVUlfU0laRV0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDMgfTsKK3VpbnQ4X3QgY2NwX3dwYV9vdWkwNFtIRERfV1BBX09VSV9TSVpFXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCB9OwordWludDhfdCBjY3Bfd3BhX291aTA1W0hERF9XUEFfT1VJX1NJWkVdID0geyAweDAwLCAweDUwLCAweGYyLCAweDA1IH07CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisvKiBDQ0tNICovCit1aW50OF90IGNjcF93cGFfb3VpMDZbSEREX1dQQV9PVUlfU0laRV0gPSB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAgfTsKKy8qIENDS00gKi8KK3VpbnQ4X3QgY2NwX3Jzbl9vdWkwNltIRERfUlNOX09VSV9TSVpFXSA9IHsgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCB9OworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKworLyogZ3JvdXAgY2lwaGVyICovCit1aW50OF90IGNjcF9yc25fb3VpMDBbSEREX1JTTl9PVUlfU0laRV0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDAgfTsKKworLyogV0VQLTQwIG9yIFJTTiAqLwordWludDhfdCBjY3BfcnNuX291aTAxW0hERF9SU05fT1VJX1NJWkVdID0geyAweDAwLCAweDBGLCAweEFDLCAweDAxIH07CisKKy8qIFRLSVAgb3IgUlNOLVBTSyAqLwordWludDhfdCBjY3BfcnNuX291aTAyW0hERF9SU05fT1VJX1NJWkVdID0geyAweDAwLCAweDBGLCAweEFDLCAweDAyIH07CisKKy8qIFJlc2VydmVkICovCit1aW50OF90IGNjcF9yc25fb3VpMDNbSEREX1JTTl9PVUlfU0laRV0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDMgfTsKKworLyogQUVTLUNDTVAgKi8KK3VpbnQ4X3QgY2NwX3Jzbl9vdWkwNFtIRERfUlNOX09VSV9TSVpFXSA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwNCB9OworCisvKiBXRVAtMTA0ICovCit1aW50OF90IGNjcF9yc25fb3VpMDVbSEREX1JTTl9PVUlfU0laRV0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDUgfTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKy8qIFJTTi1QU0stU0hBMjU2ICovCit1aW50OF90IGNjcF9yc25fb3VpMDdbSEREX1JTTl9PVUlfU0laRV0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDYgfTsKKworLyogUlNOLTgwMjFYLVNIQTI1NiAqLwordWludDhfdCBjY3BfcnNuX291aTA4W0hERF9SU05fT1VJX1NJWkVdID0geyAweDAwLCAweDBGLCAweEFDLCAweDA1IH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpCisvKiBPZmZzZXQgd2hlcmUgdGhlIEVJRC1MZW4tSUUsIHN0YXJ0LiAqLworI2RlZmluZSBGVF9BU1NPQ19SU1BfSUVTX09GRlNFVCA2ICAvKiBDYXBhYmlsaXR5KDIpICsgQUlEKDIpICsgU3RhdHVzIENvZGUoMikgKi8KKyNkZWZpbmUgRlRfQVNTT0NfUkVRX0lFU19PRkZTRVQgNCAgLyogQ2FwYWJpbGl0eSgyKSArIExJKDIpICovCisjZW5kaWYKKworI2RlZmluZSBCRUFDT05fRlJBTUVfSUVTX09GRlNFVCAxMgorI2RlZmluZSBIRERfUEVFUl9BVVRIT1JJWkVfV0FJVCAxMAorCisvKioKKyAqIGhkZF9jb25uX3NldF9hdXRoZW50aWNhdGVkKCkgLSBzZXQgYXV0aGVudGljYXRpb24gc3RhdGUKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byB0aGUgYWRhcHRlcgorICogQGF1dGhTdGF0ZTogYXV0aGVudGljYXRpb24gc3RhdGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGdsb2JhbCBIREQgc3RhdGlvbiBjb250ZXh0CisgKiBhdXRoZW50aWNhdGlvbiBzdGF0ZS4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQKK2hkZF9jb25uX3NldF9hdXRoZW50aWNhdGVkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90IGF1dGhTdGF0ZSkKK3sKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCS8qIHNhdmUgdGhlIG5ldyBjb25uZWN0aW9uIHN0YXRlICovCisJaGRkTG9nKExPRzEsCisJICAgICAgIEZMKCJBdXRoZW50aWNhdGVkIHN0YXRlIENoYW5nZWQgZnJvbSBvbGRTdGF0ZTolZCB0byBTdGF0ZTolZCIpLAorCSAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8udUlzQXV0aGVudGljYXRlZCwgYXV0aFN0YXRlKTsKKwlwSGRkU3RhQ3R4LT5jb25uX2luZm8udUlzQXV0aGVudGljYXRlZCA9IGF1dGhTdGF0ZTsKKworCS8qIENoZWNrIGlzIHBlbmRpbmcgUk9DIHJlcXVlc3Qgb3Igbm90IHdoZW4gYXV0aCBzdGF0ZSBjaGFuZ2VkICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwSGRkQ3R4LT5yb2NfcmVxX3dvcmssIDApOworfQorCisvKioKKyAqIGhkZF9jb25uX3NldF9jb25uZWN0aW9uX3N0YXRlKCkgLSBzZXQgY29ubmVjdGlvbiBzdGF0ZQorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKiBAY29ublN0YXRlOiBjb25uZWN0aW9uIHN0YXRlCisgKgorICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBnbG9iYWwgSEREIHN0YXRpb24gY29udGV4dCBjb25uZWN0aW9uIHN0YXRlLgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGhkZF9jb25uX3NldF9jb25uZWN0aW9uX3N0YXRlKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgIGVDb25uZWN0aW9uU3RhdGUgY29ublN0YXRlKQoreworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisJLyogc2F2ZSB0aGUgbmV3IGNvbm5lY3Rpb24gc3RhdGUgKi8KKwloZGRMb2coTE9HMSwgRkwoIkNvbm5lY3Rpb25TdGF0ZSBDaGFuZ2VkIGZyb20gb2xkU3RhdGU6JWQgdG8gU3RhdGU6JWQiKSwKKwkgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSwgY29ublN0YXRlKTsKKwlwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID0gY29ublN0YXRlOworCisJLyogQ2hlY2sgaXMgcGVuZGluZyBST0MgcmVxdWVzdCBvciBub3Qgd2hlbiBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZWQgKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBIZGRDdHgtPnJvY19yZXFfd29yaywgMCk7Cit9CisKKy8qKgorICogaGRkX2Nvbm5fZ2V0X2Nvbm5lY3Rpb25fc3RhdGUoKSAtIGdldCBjb25uZWN0aW9uIHN0YXRlCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIKKyAqIEBwQ29ublN0YXRlOiBwb2ludGVyIHRvIGNvbm5lY3Rpb24gc3RhdGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGdsb2JhbCBIREQgc3RhdGlvbiBjb250ZXh0IGNvbm5lY3Rpb24gc3RhdGUuCisgKgorICogUmV0dXJuOiB0cnVlIGlmIChJbmZyYSBBc3NvY2lhdGVkIG9yIElCU1MgQ29ubmVjdGVkKQorICoJYW5kIHNldHMgb3V0cHV0IHBhcmFtZXRlciBwQ29ublN0YXRlOworICoJZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBoZGRfY29ubl9nZXRfY29ubmVjdGlvbl9zdGF0ZShoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCwKKwkJCQkJCSBlQ29ubmVjdGlvblN0YXRlICpwQ29ublN0YXRlKQoreworCWJvb2wgZkNvbm5lY3RlZCA9IGZhbHNlOworCWVDb25uZWN0aW9uU3RhdGUgY29ublN0YXRlOworCisJLyogZ2V0IHRoZSBjb25uZWN0aW9uIHN0YXRlLiAqLworCWNvbm5TdGF0ZSA9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGU7CisKKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09IGNvbm5TdGF0ZSB8fAorCSAgICBlQ29ubmVjdGlvblN0YXRlX0lic3NDb25uZWN0ZWQgPT0gY29ublN0YXRlIHx8CisJICAgIGVDb25uZWN0aW9uU3RhdGVfSWJzc0Rpc2Nvbm5lY3RlZCA9PSBjb25uU3RhdGUpIHsKKwkJZkNvbm5lY3RlZCA9IHRydWU7CisJfQorCisJaWYgKHBDb25uU3RhdGUpCisJCSpwQ29ublN0YXRlID0gY29ublN0YXRlOworCisJcmV0dXJuIGZDb25uZWN0ZWQ7Cit9CisKKy8qKgorICogaGRkX2lzX2Nvbm5lY3RpbmcoKSAtIEZ1bmN0aW9uIHRvIGNoZWNrIGNvbm5lY3Rpb24gcHJvZ3Jlc3MKKyAqIEBoZGRfc3RhX2N0eDogICAgcG9pbnRlciB0byBnbG9iYWwgSEREIFN0YXRpb24gY29udGV4dAorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBjb25uZWN0aW5nLCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCBoZGRfaXNfY29ubmVjdGluZyhoZGRfc3RhdGlvbl9jdHhfdCAqaGRkX3N0YV9jdHgpCit7CisJcmV0dXJuIGhkZF9zdGFfY3R4LT5jb25uX2luZm8uY29ublN0YXRlID09CisJCWVDb25uZWN0aW9uU3RhdGVfQ29ubmVjdGluZzsKK30KKworLyoqCisgKiBoZGRfY29ubl9pc19jb25uZWN0ZWQoKSAtIEZ1bmN0aW9uIHRvIGNoZWNrIGNvbm5lY3Rpb24gc3RhdHVzCisgKiBAcEhkZFN0YUN0eDogICAgcG9pbnRlciB0byBnbG9iYWwgSEREIFN0YXRpb24gY29udGV4dAorICoKKyAqIFJldHVybjogZmFsc2UgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwgdHJ1ZSBvdGhlcndpc2UKKyAqLworYm9vbCBoZGRfY29ubl9pc19jb25uZWN0ZWQoaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHgpCit7CisJcmV0dXJuIGhkZF9jb25uX2dldF9jb25uZWN0aW9uX3N0YXRlKHBIZGRTdGFDdHgsIE5VTEwpOworfQorCisvKioKKyAqIGhkZF9jb25uX2dldF9jb25uZWN0ZWRfYmFuZCgpIC0gZ2V0IGN1cnJlbnQgY29ubmVjdGlvbiByYWRpbyBiYW5kCisgKiBAcEhkZFN0YUN0eDogICAgcG9pbnRlciB0byBnbG9iYWwgSEREIFN0YXRpb24gY29udGV4dAorICoKKyAqIFJldHVybjogZUNTUl9CQU5EXzI0IG9yIGVDU1JfQkFORF81RyBiYXNlZCBvbiBjdXJyZW50IEFQIGNvbm5lY3Rpb24KKyAqCWVDU1JfQkFORF9BTEwgaWYgbm90IGNvbm5lY3RlZAorICovCitlQ3NyQmFuZCBoZGRfY29ubl9nZXRfY29ubmVjdGVkX2JhbmQoaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHgpCit7CisJdWludDhfdCBzdGFDaGFubmVsID0gMDsKKworCWlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKwkJc3RhQ2hhbm5lbCA9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5vcGVyYXRpb25DaGFubmVsOworCisJaWYgKHN0YUNoYW5uZWwgPiAwICYmIHN0YUNoYW5uZWwgPCAxNCkKKwkJcmV0dXJuIGVDU1JfQkFORF8yNDsKKwllbHNlIGlmIChzdGFDaGFubmVsID49IDM2ICYmIHN0YUNoYW5uZWwgPD0gMTg0KQorCQlyZXR1cm4gZUNTUl9CQU5EXzVHOworCWVsc2UgICAvKiBJZiBzdGF0aW9uIGlzIG5vdCBjb25uZWN0ZWQgcmV0dXJuIGFzIGVDU1JfQkFORF9BTEwgKi8KKwkJcmV0dXJuIGVDU1JfQkFORF9BTEw7Cit9CisKKy8qKgorICogaGRkX2Nvbm5fZ2V0X2Nvbm5lY3RlZF9jaXBoZXJfYWxnbygpIC0gZ2V0IGN1cnJlbnQgY29ubmVjdGlvbiBjaXBoZXIgdHlwZQorICogQHBIZGRTdGFDdHg6IHBvaW50ZXIgdG8gZ2xvYmFsIEhERCBTdGF0aW9uIGNvbnRleHQKKyAqIEBwQ29ubmVjdGVkQ2lwaGVyQWxnbzogcG9pbnRlciB0byBjb25uZWN0ZWQgY2lwaGVyIGFsZ28KKyAqCisgKiBSZXR1cm46IGZhbHNlIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQsIHRydWUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAoraGRkX2Nvbm5fZ2V0X2Nvbm5lY3RlZF9jaXBoZXJfYWxnbyhoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCwKKwkJCQkgICBlQ3NyRW5jcnlwdGlvblR5cGUgKnBDb25uZWN0ZWRDaXBoZXJBbGdvKQoreworCWJvb2wgZkNvbm5lY3RlZCA9IGZhbHNlOworCisJZkNvbm5lY3RlZCA9IGhkZF9jb25uX2dldF9jb25uZWN0aW9uX3N0YXRlKHBIZGRTdGFDdHgsIE5VTEwpOworCisJaWYgKHBDb25uZWN0ZWRDaXBoZXJBbGdvKQorCQkqcENvbm5lY3RlZENpcGhlckFsZ28gPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8udWNFbmNyeXB0aW9uVHlwZTsKKworCXJldHVybiBmQ29ubmVjdGVkOworfQorCisvKioKKyAqIGhkZF9jb25uX2dldF9jb25uZWN0ZWRfYnNzX3R5cGUoKSAtIGdldCBjdXJyZW50IGJzcyB0eXBlCisgKiBAcEhkZFN0YUN0eDogcG9pbnRlciB0byBnbG9iYWwgSEREIFN0YXRpb24gY29udGV4dAorICogQHBDb25uZWN0ZWRCc3NUeXBlOiBwb2ludGVyIHRvIGNvbm5lY3RlZCBic3MgdHlwZQorICoKKyAqIFJldHVybjogZmFsc2UgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwgdHJ1ZSBvdGhlcndpc2UKKyAqLworaW5saW5lIGJvb2wKK2hkZF9jb25uX2dldF9jb25uZWN0ZWRfYnNzX3R5cGUoaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHgsCisJCQkJZU1pYl9kb3QxMURlc2lyZWRCc3NUeXBlICpwQ29ubmVjdGVkQnNzVHlwZSkKK3sKKwlib29sIGZDb25uZWN0ZWQgPSBmYWxzZTsKKworCWZDb25uZWN0ZWQgPSBoZGRfY29ubl9nZXRfY29ubmVjdGlvbl9zdGF0ZShwSGRkU3RhQ3R4LCBOVUxMKTsKKworCWlmIChwQ29ubmVjdGVkQnNzVHlwZSkgeworCQkqcENvbm5lY3RlZEJzc1R5cGUgPQorCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5Eb3QxMURlc2lyZWRCc3NUeXBlOworCX0KKworCXJldHVybiBmQ29ubmVjdGVkOworfQorCisvKioKKyAqIGhkZF9jb25uX3NhdmVfY29ubmVjdGVkX2Jzc190eXBlKCkgLSBzZXQgY29ubmVjdGVkIGJzcyB0eXBlCisgKiBAcEhkZFN0YUN0eDogcG9pbnRlciB0byBnbG9iYWwgSEREIFN0YXRpb24gY29udGV4dAorICogQGNzcl9yb2FtQnNzVHlwZTogYnNzIHR5cGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitoZGRfY29ubl9zYXZlX2Nvbm5lY3RlZF9ic3NfdHlwZShoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCwKKwkJCQkgZUNzclJvYW1Cc3NUeXBlIGNzcl9yb2FtQnNzVHlwZSkKK3sKKwlzd2l0Y2ggKGNzcl9yb2FtQnNzVHlwZSkgeworCWNhc2UgZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRToKKwkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5Eb3QxMURlc2lyZWRCc3NUeXBlID0KKwkJCWVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZV9pbmZyYXN0cnVjdHVyZTsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfQlNTX1RZUEVfSUJTUzoKKwljYXNlIGVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUzoKKwkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5Eb3QxMURlc2lyZWRCc3NUeXBlID0KKwkJCWVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZV9pbmRlcGVuZGVudDsKKwkJYnJlYWs7CisKKwkvKiogV2Ugd2lsbCBuZXZlciBzZXQgdGhlIEJzc1R5cGUgdG8gJ2FueScgd2hlbiBhdHRlbXB0aW5nIGEgY29ubmVjdGlvbgorCSAgICAgIHNvIENTUiBzaG91bGQgbmV2ZXIgc2VuZCB0aGlzIGJhY2sgdG8gdXMuKi8KKwljYXNlIGVDU1JfQlNTX1RZUEVfQU5ZOgorCWRlZmF1bHQ6CisJCUNERl9BU1NFUlQoMCk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBoZGRfY29ubl9zYXZlX2Nvbm5lY3RfaW5mbygpIC0gc2F2ZSBjdXJyZW50IGNvbm5lY3Rpb24gaW5mb3JtYXRpb24KKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAcFJvYW1JbmZvOiBwb2ludGVyIHRvIHJvYW0gaW5mbworICogQGVCc3NUeXBlOiBic3MgdHlwZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAoraGRkX2Nvbm5fc2F2ZV9jb25uZWN0X2luZm8oaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLAorCQkJICAgZUNzclJvYW1Cc3NUeXBlIGVCc3NUeXBlKQoreworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJZUNzckVuY3J5cHRpb25UeXBlIGVuY3J5cHRUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKworCUNERl9BU1NFUlQocFJvYW1JbmZvKTsKKworCWlmIChwUm9hbUluZm8pIHsKKwkJLyogU2F2ZSB0aGUgQlNTSUQgZm9yIHRoZSBjb25uZWN0aW9uICovCisJCWlmIChlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFID09IGVCc3NUeXBlKSB7CisJCQlDREZfQVNTRVJUKHBSb2FtSW5mby0+cEJzc0Rlc2MpOworCQkJY2RmX2NvcHlfbWFjYWRkcigmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLAorCQkJCQkgJnBSb2FtSW5mby0+YnNzaWQpOworCisJCQkvKgorCQkJICogU2F2ZSB0aGUgU3RhdGlvbiBJRCBmb3IgdGhpcyBzdGF0aW9uIGZyb20KKwkJCSAqIHRoZSAnUm9hbSBJbmZvJy4gRm9yIElCU1MgbW9kZSwgc3RhSWQgaXMKKwkJCSAqIGFzc2lnbmVkIGluIE5FV19QRUVSX0lORC4gRm9yIHJlYXNzb2MsCisJCQkgKiB0aGUgc3RhSUQgZG9lc24ndCBjaGFuZ2UgYW5kIGl0IG1heSBiZSBpbnZhbGlkCisJCQkgKiBpbiB0aGlzIHN0cnVjdHVyZSBzbyBubyBjaGFuZ2UgaGVyZS4KKwkJCSAqLworCQkJaWYgKCFwUm9hbUluZm8tPmZSZWFzc29jUmVxKSB7CisJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdID0KKwkJCQkJcFJvYW1JbmZvLT5zdGFJZDsKKwkJCX0KKwkJfSBlbHNlIGlmIChlQ1NSX0JTU19UWVBFX0lCU1MgPT0gZUJzc1R5cGUpIHsKKwkJCWNkZl9jb3B5X21hY2FkZHIoJnBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZCwKKwkJCQkJICZwUm9hbUluZm8tPmJzc2lkKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBjYW4ndCBoYXBwZW4uIFdlIG5lZWQgYSB2YWxpZCBJQlNTIG9yIEluZnJhIHNldHRpbmcKKwkJCSAqIGluIHRoZSBCU1NEZXNjcmlwdGlvbiBvciB3ZSBjYW4ndCBmdW5jdGlvbi4KKwkJCSAqLworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJfQorCisJCS8qIG5vdGlmeSBXTU0gKi8KKwkJaGRkX3dtbV9jb25uZWN0KHBBZGFwdGVyLCBwUm9hbUluZm8sIGVCc3NUeXBlKTsKKworCQlpZiAoIXBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZSkgeworCQkJQ0RGX0FTU0VSVChwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUpOworCQl9IGVsc2UgeworCQkJLyogR2V0IE11bHRpY2FzdCBFbmNyeXB0aW9uIFR5cGUgKi8KKwkJCWVuY3J5cHRUeXBlID0KKwkJCSAgICBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGU7CisJCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8ubWNFbmNyeXB0aW9uVHlwZSA9IGVuY3J5cHRUeXBlOworCQkJLyogR2V0IFVuaWNhc3QgRW5jcnlwdGlvbiBUeXBlICovCisJCQllbmNyeXB0VHlwZSA9CisJCQkJcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5FbmNyeXB0aW9uVHlwZTsKKwkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby51Y0VuY3J5cHRpb25UeXBlID0gZW5jcnlwdFR5cGU7CisKKwkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSA9CisJCQkJcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5BdXRoVHlwZTsKKworCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWwgPQorCQkJICAgIHBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbDsKKworCQkJLyogU2F2ZSB0aGUgc3NpZCBmb3IgdGhlIGNvbm5lY3Rpb24gKi8KKwkJCWNkZl9tZW1fY29weSgmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLlNTSUQuU1NJRCwKKwkJCQkgICAgICZwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPlNTSUQsCisJCQkJICAgICBzaXplb2YodFNpck1hY1NTaWQpKTsKKworCQkJLyogU2F2ZSBkb3QxMW1vZGUgaW4gd2hpY2ggU1RBIGFzc29jaWF0ZWQgdG8gQVAgKi8KKwkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5kb3QxMU1vZGUgPQorCQkJCXBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZS0+ZG90MTFNb2RlOworCisJCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8ucHJveHlBUlBTZXJ2aWNlID0KKwkJCQlwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPnByb3h5QVJQU2VydmljZTsKKwkJfQorCX0KKwkvKiBzYXZlIHRoZSBjb25uZWN0ZWQgQnNzVHlwZSAqLworCWhkZF9jb25uX3NhdmVfY29ubmVjdGVkX2Jzc190eXBlKHBIZGRTdGFDdHgsIGVCc3NUeXBlKTsKK30KKworI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpCisvKioKKyAqIGhkZF9zZW5kX2Z0X2Fzc29jX3Jlc3BvbnNlKCkgLSBzZW5kIGZhc3QgdHJhbnNpdGlvbiBhc3NvYyByZXNwb25zZQorICogQGRldjogcG9pbnRlciB0byBuZXQgZGV2aWNlCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlcgorICogQHBDc3JSb2FtSW5mbzogcG9pbnRlciB0byByb2FtIGluZm8KKyAqCisgKiBTZW5kIHRoZSAxMVIga2V5IGluZm9ybWF0aW9uIHRvIHRoZSBzdXBwbGljYW50LiBPbmx5IHRoZW4gY2FuIHRoZSBzdXBwbGljYW50CisgKiBnZW5lcmF0ZSB0aGUgUE1LLVIxLiAoQlRXLCB0aGUgRVNFIHN1cHBsaWNhbnQgYWxzbyBuZWVkcyB0aGUgQXNzb2MgUmVzcCBJRXMKKyAqIGZvciB0aGUgc2FtZSBwdXJwb3NlLikKKyAqCisgKiBNYWlubHkgdGhlIEFzc29jIFJzcCBJRXMgYXJlIHBhc3NlZCBoZXJlLiBGb3IgdGhlIElNREEgdGhpcyBjb250YWlucyB0aGUKKyAqIFIxS0hJRCwgUjBLSElEIGFuZCB0aGUgTURJRC4gRm9yIEZULCB0aGlzIGNvbnNpc3RzIG9mIHRoZSBSZWFzc29jIFJzcCBGVElFcy4KKyAqIFRoaXMgaXMgdGhlIEFzc29jIFJlc3BvbnNlLgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAoraGRkX3NlbmRfZnRfYXNzb2NfcmVzcG9uc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJICAgdENzclJvYW1JbmZvICpwQ3NyUm9hbUluZm8pCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWNoYXIgKmJ1ZmY7CisJdW5zaWduZWQgaW50IGxlbiA9IDA7CisJdTggKnBGVEFzc29jUnNwID0gTlVMTDsKKworCWlmIChwQ3NyUm9hbUluZm8tPm5Bc3NvY1JzcExlbmd0aCA9PSAwKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoInBDc3JSb2FtSW5mby0+bkFzc29jUnNwTGVuZ3RoPSVkIiksCisJCSAgICAgICAoaW50KXBDc3JSb2FtSW5mby0+bkFzc29jUnNwTGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKworCXBGVEFzc29jUnNwID0KKwkJKHU4ICopIChwQ3NyUm9hbUluZm8tPnBiRnJhbWVzICsgcENzclJvYW1JbmZvLT5uQmVhY29uTGVuZ3RoICsKKwkJCXBDc3JSb2FtSW5mby0+bkFzc29jUmVxTGVuZ3RoKTsKKwlpZiAocEZUQXNzb2NSc3AgPT0gTlVMTCkgeworCQloZGRMb2coTE9HRSwgRkwoIkFzc29jUmVxIG9yIEFzc29jUnNwIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisJLyogcEZUQXNzb2NSc3AgbmVlZHMgdG8gcG9pbnQgdG8gdGhlIElFcyAqLworCXBGVEFzc29jUnNwICs9IEZUX0FTU09DX1JTUF9JRVNfT0ZGU0VUOworCWhkZExvZyhMT0cxLCBGTCgiQXNzb2NSc3AgaXMgbm93IGF0ICUwMnglMDJ4IiksCisJICAgICAgICh1bnNpZ25lZCBpbnQpcEZUQXNzb2NSc3BbMF0sICh1bnNpZ25lZCBpbnQpcEZUQXNzb2NSc3BbMV0pOworCisJLyogV2UgbmVlZCB0byBzZW5kIHRoZSBJRXMgdG8gdGhlIHN1cHBsaWNhbnQuICovCisJYnVmZiA9IGttYWxsb2MoSVdfR0VORVJJQ19JRV9NQVgsIEdGUF9BVE9NSUMpOworCWlmIChidWZmID09IE5VTEwpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJrbWFsbG9jIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKSk7CisJCXJldHVybjsKKwl9CisJLyogU2VuZCB0aGUgQXNzb2MgUmVzcCwgdGhlIHN1cHBsaWNhbnQgbmVlZHMgdGhpcyBmb3IgaW5pdGlhbCBBdXRoLiAqLworCWxlbiA9IHBDc3JSb2FtSW5mby0+bkFzc29jUnNwTGVuZ3RoIC0gRlRfQVNTT0NfUlNQX0lFU19PRkZTRVQ7CisJd3JxdS5kYXRhLmxlbmd0aCA9IGxlbjsKKwltZW1zZXQoYnVmZiwgMCwgSVdfR0VORVJJQ19JRV9NQVgpOworCW1lbWNweShidWZmLCBwRlRBc3NvY1JzcCwgbGVuKTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkFTU09DUkVTUElFLCAmd3JxdSwgYnVmZik7CisKKwlrZnJlZShidWZmKTsKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qKgorICogaGRkX3NlbmRfZnRfZXZlbnQoKSAtIHNlbmQgZmFzdCB0cmFuc2l0aW9uIGV2ZW50CisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlcgorICoKKyAqIFNlbmQgdGhlIEZUSUVzLCBSSUMgSUVzIGR1cmluZyBGVC4gVGhpcyBpcyBldmVudHVhbGx5IHVzZWQgdG8gc2VuZCB0aGUKKyAqIEZUIGV2ZW50cyB0byB0aGUgc3VwcGxpY2FudC4gQXQgdGhlIHJlY2VwdGlvbiBvZiBBdXRoMiB3ZSBzZW5kIHRoZSBSSUMKKyAqIGZvbGxvd2VkIGJ5IHRoZSBhdXRoIHJlc3BvbnNlIElFcyB0byB0aGUgc3VwcGxpY2FudC4KKyAqIE9uY2UgYm90aCBhcmUgcmVjZWl2ZWQgaW4gdGhlIHN1cHBsaWNhbnQsIGFuIEZUIGV2ZW50IGlzIGdlbmVyYXRlZAorICogdG8gdGhlIHN1cHBsaWNhbnQuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9zZW5kX2Z0X2V2ZW50KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXVpbnQxNl90IGF1dGhfcmVzcF9sZW4gPSAwOworCXVpbnQzMl90IHJpY19pZXNfbGVuZ3RoID0gMDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKyNpZiBkZWZpbmVkKEtFUk5FTF9TVVBQT1JUXzExUl9DRkc4MDIxMSkKKwlzdHJ1Y3QgY2ZnODAyMTFfZnRfZXZlbnRfcGFyYW1zIGZ0RXZlbnQ7CisJdWludDhfdCBmdEllW0RPVDExRl9JRV9GVElORk9fTUFYX0xFTl07CisJdWludDhfdCByaWNJZVtET1QxMUZfSUVfUklDREVTQ1JJUFRPUl9NQVhfTEVOXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcEFkYXB0ZXItPmRldjsKKyNlbHNlCisJY2hhciAqYnVmZjsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJdWludDE2X3Qgc3RyX2xlbjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLRVJORUxfU1VQUE9SVF8xMVJfQ0ZHODAyMTEpCisJY2RmX21lbV96ZXJvKGZ0SWUsIERPVDExRl9JRV9GVElORk9fTUFYX0xFTik7CisJY2RmX21lbV96ZXJvKHJpY0llLCBET1QxMUZfSUVfUklDREVTQ1JJUFRPUl9NQVhfTEVOKTsKKworCXNtZV9nZXRfcmljaV9lcyhwSGRkQ3R4LT5oSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLCAodTggKikgcmljSWUsCisJCQlET1QxMUZfSUVfUklDREVTQ1JJUFRPUl9NQVhfTEVOLCAmcmljX2llc19sZW5ndGgpOworCWlmIChyaWNfaWVzX2xlbmd0aCA9PSAwKSB7CisJCWhkZExvZyhMT0dXLAorCQkgICAgICAgRkwoIlJJQyBJRXMgaXMgb2YgbGVuZ3RoIDAgbm90IHNlbmRpbmcgUklDIEluZm9ybWF0aW9uIGZvciBub3ciKSk7CisJfQorCisJZnRFdmVudC5yaWNfaWVzID0gcmljSWU7CisJZnRFdmVudC5yaWNfaWVzX2xlbiA9IHJpY19pZXNfbGVuZ3RoOworCWhkZExvZyhMT0cxLCBGTCgiUklDIElFcyBpcyBvZiBsZW5ndGggJWQiKSwgKGludClyaWNfaWVzX2xlbmd0aCk7CisKKwlzbWVfZ2V0X2Z0X3ByZV9hdXRoX3Jlc3BvbnNlKHBIZGRDdHgtPmhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJICAgICAodTggKikgZnRJZSwgRE9UMTFGX0lFX0ZUSU5GT19NQVhfTEVOLAorCQkJCSAgICAgJmF1dGhfcmVzcF9sZW4pOworCisJaWYgKGF1dGhfcmVzcF9sZW4gPT0gMCkgeworCQloZGRMb2coTE9HRSwgRkwoIkF1dGhSc3AgRlRJRVMgaXMgb2YgbGVuZ3RoIDAiKSk7CisJCXJldHVybjsKKwl9CisKKwlzbWVfc2V0X2Z0X3ByZV9hdXRoX3N0YXRlKHBIZGRDdHgtPmhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsIHRydWUpOworCisJZnRFdmVudC50YXJnZXRfYXAgPSBmdEllOworCisJZnRFdmVudC5pZXMgPSAodTggKikgKGZ0SWUgKyBDREZfTUFDX0FERFJfU0laRSk7CisJZnRFdmVudC5pZXNfbGVuID0gYXV0aF9yZXNwX2xlbiAtIENERl9NQUNfQUREUl9TSVpFOworCisJaGRkTG9nKExPRzEsIEZMKCJmdEV2ZW50Lmllc19sZW4gJXp1IiksIGZ0RXZlbnQuaWVzX2xlbik7CisJaGRkTG9nKExPRzEsIEZMKCJmdEV2ZW50LnJpY19pZXNfbGVuICV6dSIpLCBmdEV2ZW50LnJpY19pZXNfbGVuKTsKKwloZGRMb2coTE9HMSwgRkwoImZ0RXZlbnQudGFyZ2V0X2FwICUyeC0lMngtJTJ4LSUyeC0lMngtJTJ4IiksCisJICAgICAgIGZ0RXZlbnQudGFyZ2V0X2FwWzBdLCBmdEV2ZW50LnRhcmdldF9hcFsxXSwKKwkgICAgICAgZnRFdmVudC50YXJnZXRfYXBbMl0sIGZ0RXZlbnQudGFyZ2V0X2FwWzNdLCBmdEV2ZW50LnRhcmdldF9hcFs0XSwKKwkgICAgICAgZnRFdmVudC50YXJnZXRfYXBbNV0pOworCisJKHZvaWQpY2ZnODAyMTFfZnRfZXZlbnQoZGV2LCAmZnRFdmVudCk7CisKKyNlbHNlCisJLyogV2UgbmVlZCB0byBzZW5kIHRoZSBJRXMgdG8gdGhlIHN1cHBsaWNhbnQgKi8KKwlidWZmID0ga21hbGxvYyhJV19DVVNUT01fTUFYLCBHRlBfQVRPTUlDKTsKKwlpZiAoYnVmZiA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLCBGTCgia21hbGxvYyB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworCQlyZXR1cm47CisJfQorCWNkZl9tZW1femVybyhidWZmLCBJV19DVVNUT01fTUFYKTsKKworCS8qIFNtZSBuZWVkcyB0byBzZW5kIHRoZSBSSUMgSUVzIGZpcnN0ICovCisJc3RyX2xlbiA9IHN0cmxjcHkoYnVmZiwgIlJJQz0iLCBJV19DVVNUT01fTUFYKTsKKwlzbWVfZ2V0X3JpY2lfZXMocEhkZEN0eC0+aEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCSh1OCAqKSAmKGJ1ZmZbc3RyX2xlbl0pLCAoSVdfQ1VTVE9NX01BWCAtIHN0cl9sZW4pLAorCQkJJnJpY19pZXNfbGVuZ3RoKTsKKwlpZiAocmljX2llc19sZW5ndGggPT0gMCkgeworCQloZGRMb2coTE9HVywKKwkJICAgICAgIEZMKCJSSUMgSUVzIGlzIG9mIGxlbmd0aCAwIG5vdCBzZW5kaW5nIFJJQyBJbmZvcm1hdGlvbiBmb3Igbm93IikpOworCX0gZWxzZSB7CisJCXdycXUuZGF0YS5sZW5ndGggPSBzdHJfbGVuICsgcmljX2llc19sZW5ndGg7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1ZmYpOworCX0KKworCS8qIFNtZSBuZWVkcyB0byBwcm92aWRlIHRoZSBBdXRoIFJlc3AgKi8KKwljZGZfbWVtX3plcm8oYnVmZiwgSVdfQ1VTVE9NX01BWCk7CisJc3RyX2xlbiA9IHN0cmxjcHkoYnVmZiwgIkFVVEg9IiwgSVdfQ1VTVE9NX01BWCk7CisJc21lX2dldF9mdF9wcmVfYXV0aF9yZXNwb25zZShwSGRkQ3R4LT5oSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCSAgICAgKHU4ICopICZidWZmW3N0cl9sZW5dLAorCQkJCSAgICAgKElXX0NVU1RPTV9NQVggLSBzdHJfbGVuKSwgJmF1dGhfcmVzcF9sZW4pOworCisJaWYgKGF1dGhfcmVzcF9sZW4gPT0gMCkgeworCQlrZnJlZShidWZmKTsKKwkJaGRkTG9nKExPR0UsIEZMKCJBdXRoUnNwIEZUSUVTIGlzIG9mIGxlbmd0aCAwIikpOworCQlyZXR1cm47CisJfQorCisJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cl9sZW4gKyBhdXRoX3Jlc3BfbGVuOworCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1ZmYpOworCisJa2ZyZWUoYnVmZik7CisjZW5kaWYKK30KKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisvKioKKyAqIGhkZF9zZW5kX25ld19hcF9jaGFubmVsX2luZm8oKSAtIHNlbmQgbmV3IGFwIGNoYW5uZWwgaW5mbworICogQGRldjogcG9pbnRlciB0byBuZXQgZGV2aWNlCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlcgorICogQHBDc3JSb2FtSW5mbzogcG9pbnRlciB0byByb2FtIGluZm8KKyAqCisgKiBTZW5kIHRoZSBFU0UgcmVxdWlyZWQgIm5ldyBBUCBDaGFubmVsIGluZm8iIHRvIHRoZSBzdXBwbGljYW50LgorICogKFRoaXMga2VlcHMgdGhlIHN1cHBsaWNhbnQgInVwIHRvIGRhdGUiIG9uIHRoZSBjdXJyZW50IGNoYW5uZWwuKQorICoKKyAqIFRoZSBjdXJyZW50IChuZXcgQVApIGNoYW5uZWwgaW5mb3JtYXRpb24gaXMgcGFzc2VkIGluLgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAoraGRkX3NlbmRfbmV3X2FwX2NoYW5uZWxfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCSAgICAgdENzclJvYW1JbmZvICpwQ3NyUm9hbUluZm8pCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCXRTaXJCc3NEZXNjcmlwdGlvbiAqZGVzY3JpcHRvciA9IHBDc3JSb2FtSW5mby0+cEJzc0Rlc2M7CisKKwlpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLCBGTCgicENzclJvYW1JbmZvLT5wQnNzRGVzYyglcCkiKSwgZGVzY3JpcHRvcik7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBTZW5kIHRoZSBDaGFubmVsIGV2ZW50LCB0aGUgc3VwcGxpY2FudCBuZWVkcyB0aGlzIHRvIGdlbmVyYXRlCisJICogdGhlIEFkamFjZW50IEFQIHJlcG9ydC4KKwkgKi8KKwloZGRMb2coTE9HVywgRkwoIlNlbmRpbmcgdXAgYW4gU0lPQ0dJV0ZSRVEsIGNoYW5uZWxJZCglZCkiKSwKKwkgICAgICAgZGVzY3JpcHRvci0+Y2hhbm5lbElkKTsKKwltZW1zZXQoJndycXUsICdcMCcsIHNpemVvZih3cnF1KSk7CisJd3JxdS5mcmVxLm0gPSBkZXNjcmlwdG9yLT5jaGFubmVsSWQ7CisJd3JxdS5mcmVxLmUgPSAwOworCXdycXUuZnJlcS5pID0gMDsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZGFwdGVyLT5kZXYsIFNJT0NHSVdGUkVRLCAmd3JxdSwgTlVMTCk7Cit9CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICovCisKKy8qKgorICogaGRkX3NlbmRfdXBkYXRlX2JlYWNvbl9pZXNfZXZlbnQoKSAtIHNlbmQgdXBkYXRlIGJlYWNvbnMgaWUgZXZlbnQKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAcENzclJvYW1JbmZvOiBwb2ludGVyIHRvIHJvYW0gaW5mbworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAoraGRkX3NlbmRfdXBkYXRlX2JlYWNvbl9pZXNfZXZlbnQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICB0Q3NyUm9hbUluZm8gKnBDc3JSb2FtSW5mbykKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJdTggKnBCZWFjb25JZXM7CisJdTggY3VycmVudExlbiA9IDA7CisJY2hhciAqYnVmZjsKKwlpbnQgdG90YWxJZUxlbiA9IDAsIGN1cnJlbnRPZmZzZXQgPSAwLCBzdHJMZW47CisKKwltZW1zZXQoJndycXUsICdcMCcsIHNpemVvZih3cnF1KSk7CisKKwlpZiAoMCA9PSBwQ3NyUm9hbUluZm8tPm5CZWFjb25MZW5ndGgpIHsKKwkJaGRkTG9nKExPR1csIEZMKCJwQ3NyUm9hbUluZm8tPm5CZWFjb25GcmFtZUxlbmd0aCA9IDAiKSk7CisJCXJldHVybjsKKwl9CisJcEJlYWNvbkllcyA9ICh1OCAqKSAocENzclJvYW1JbmZvLT5wYkZyYW1lcyArIEJFQUNPTl9GUkFNRV9JRVNfT0ZGU0VUKTsKKwlpZiAocEJlYWNvbkllcyA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dXLCBGTCgiQmVhY29uIElFcyBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCS8qIHBCZWFjb25JZXMgbmVlZHMgdG8gcG9pbnQgdG8gdGhlIElFcyAqLworCWhkZExvZyhMT0cxLCBGTCgiQmVhY29uIElFcyBpcyBub3cgYXQgJTAyeCUwMngiKSwKKwkgICAgICAgKHVuc2lnbmVkIGludClwQmVhY29uSWVzWzBdLCAodW5zaWduZWQgaW50KXBCZWFjb25JZXNbMV0pOworCWhkZExvZyhMT0cxLCBGTCgiQmVhY29uIElFcyBsZW5ndGggPSAlZCIpLAorCSAgICAgICBwQ3NyUm9hbUluZm8tPm5CZWFjb25MZW5ndGggLSBCRUFDT05fRlJBTUVfSUVTX09GRlNFVCk7CisKKwkvKiBXZSBuZWVkIHRvIHNlbmQgdGhlIElFcyB0byB0aGUgc3VwcGxpY2FudC4gKi8KKwlidWZmID0ga21hbGxvYyhJV19DVVNUT01fTUFYLCBHRlBfQVRPTUlDKTsKKwlpZiAoYnVmZiA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLCBGTCgia21hbGxvYyB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworCQlyZXR1cm47CisJfQorCWNkZl9tZW1femVybyhidWZmLCBJV19DVVNUT01fTUFYKTsKKworCXN0ckxlbiA9IHN0cmxjcHkoYnVmZiwgIkJFQUNPTklFcz0iLCBJV19DVVNUT01fTUFYKTsKKwljdXJyZW50TGVuID0gc3RyTGVuICsgMTsKKworCXRvdGFsSWVMZW4gPSBwQ3NyUm9hbUluZm8tPm5CZWFjb25MZW5ndGggLSBCRUFDT05fRlJBTUVfSUVTX09GRlNFVDsKKwlkbyB7CisJCS8qCisJCSAqIElmIHRoZSBiZWFjb24gc2l6ZSBleGNlZWRzIG1heCBDVVNUT00gZXZlbnQgc2l6ZSwgYnJlYWsgaXQKKwkJICogaW50byBjaHVua3Mgb2YgQ1VTVE9NIGV2ZW50IG1heCBzaXplIGFuZCBzZW5kIGl0IHRvCisJCSAqIHN1cHBsaWNhbnQuIENoYW5nZXMgYXJlIGRvbmUgaW4gc3VwcGxpY2FudCB0byBoYW5kbGUgdGhpcy4KKwkJICovCisJCWNkZl9tZW1femVybygmYnVmZltzdHJMZW4gKyAxXSwgSVdfQ1VTVE9NX01BWCAtIChzdHJMZW4gKyAxKSk7CisJCWN1cnJlbnRMZW4gPQorCQkJQ0RGX01JTih0b3RhbEllTGVuLCBJV19DVVNUT01fTUFYIC0gKHN0ckxlbiArIDEpIC0gMSk7CisJCWNkZl9tZW1fY29weSgmYnVmZltzdHJMZW4gKyAxXSwgcEJlYWNvbkllcyArIGN1cnJlbnRPZmZzZXQsCisJCQkgICAgIGN1cnJlbnRMZW4pOworCQljdXJyZW50T2Zmc2V0ICs9IGN1cnJlbnRMZW47CisJCXRvdGFsSWVMZW4gLT0gY3VycmVudExlbjsKKwkJd3JxdS5kYXRhLmxlbmd0aCA9IHN0ckxlbiArIDEgKyBjdXJyZW50TGVuOworCQlpZiAodG90YWxJZUxlbikKKwkJCWJ1ZmZbc3RyTGVuXSA9IDE7IC8qIG1vcmUgY2h1bmtzIHBlbmRpbmcgKi8KKwkJZWxzZQorCQkJYnVmZltzdHJMZW5dID0gMDsgLyogbGFzdCBjaHVuayAqLworCisJCWhkZExvZyhMT0cxLCBGTCgiQmVhY29uIElFcyBsZW5ndGggdG8gc3VwcGxpY2FudCA9ICVkIiksCisJCSAgICAgICBjdXJyZW50TGVuKTsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWRhcHRlci0+ZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmZik7CisJfSB3aGlsZSAodG90YWxJZUxlbiA+IDApOworCisJa2ZyZWUoYnVmZik7Cit9CisKKy8qKgorICogaGRkX3NlbmRfYXNzb2NpYXRpb25fZXZlbnQoKSAtIHNlbmQgYXNzb2NpYXRpb24gZXZlbnQKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0IGRldmljZQorICogQHBDc3JSb2FtSW5mbzogcG9pbnRlciB0byByb2FtIGluZm8KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX3NlbmRfYXNzb2NpYXRpb25fZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgdENzclJvYW1JbmZvICpwQ3NyUm9hbUluZm8pCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJaW50IHdlX2V2ZW50OworCWNoYXIgKm1zZzsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIHBlZXJNYWNBZGRyOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkvKiBBZGRlZCB0byBmaW5kIHRoZSBhdXRoIHR5cGUgb24gdGhlIGZseSBhdCBydW4gdGltZSAqLworCS8qIHJhdGhlciB0aGFuIHdpdGggY2ZnIHRvIHNlZSBpZiBGVCBpcyBlbmFibGVkICovCisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisJdENzclJvYW1Qcm9maWxlICpwUm9hbVByb2ZpbGUgPSAmKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlKTsKKyNlbmRpZgorCisJbWVtc2V0KCZ3cnF1LCAnXDAnLCBzaXplb2Yod3JxdSkpOworCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJd2VfZXZlbnQgPSBTSU9DR0lXQVA7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmIChOVUxMICE9IHBDc3JSb2FtSW5mbykKKwkJaWYgKHBDc3JSb2FtSW5mby0+cm9hbVN5bmNoSW5Qcm9ncmVzcykKKwkJCS8qIGNoYW5nZSBsb2dnaW5nIGJlZm9yZSByZWxlYXNlICovCisJCQloZGRMb2coTE9HNCwgIkxGUjM6aGRkX3NlbmRfYXNzb2NpYXRpb25fZXZlbnQiKTsKKyNlbmRpZgorCWlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgeworCQlpZiAoIXBDc3JSb2FtSW5mbykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJTVEEgaW4gYXNzb2NpYXRlZCBzdGF0ZSBidXQgcENzclJvYW1JbmZvIGlzIG51bGwiKSk7CisJCQlyZXR1cm47CisJCX0KKworCQljZHNfaW5jcl9hY3RpdmVfc2Vzc2lvbihwSGRkQ3R4LCBwQWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJCQlwQWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQ3NyUm9hbUluZm8tPnBCc3NEZXNjLT5ic3NJZCwKKwkJICAgICAgIHNpemVvZihwQ3NyUm9hbUluZm8tPnBCc3NEZXNjLT5ic3NJZCkpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9ERUJVRworCQlpZiAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9DTElFTlQpIHsKKwkJCWlmIChnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID09CisJCQkgICAgUDJQX0NMSUVOVF9DT05ORUNUSU5HX1NUQVRFXzEpIHsKKwkJCQlnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID0KKwkJCQkJUDJQX0NMSUVOVF9DT05ORUNURURfU1RBVEVfMTsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgIltQMlAgU3RhdGVdIENoYW5naW5nIHN0YXRlIGZyb20gQ29ubmVjdGluZyBzdGF0ZSB0byBDb25uZWN0ZWQgU3RhdGUgZm9yIDgtd2F5IEhhbmRzaGFrZSIpOworCQkJfSBlbHNlIGlmIChnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID09CisJCQkJICAgUDJQX0NMSUVOVF9DT05ORUNUSU5HX1NUQVRFXzIpIHsKKwkJCQlnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID0KKwkJCQkJUDJQX0NMSUVOVF9DT01QTEVURURfU1RBVEU7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgICJbUDJQIFN0YXRlXSBDaGFuZ2luZyBzdGF0ZSBmcm9tIENvbm5lY3Rpbmcgc3RhdGUgdG8gUDJQIENsaWVudCBDb25uZWN0aW9uIENvbXBsZXRlZCIpOworCQkJfQorCQl9CisjZW5kaWYKKwkJcHJfaW5mbygid2xhbjogIiBNQUNfQUREUkVTU19TVFIgIiBjb25uZWN0ZWQgdG8gIgorCQkJTUFDX0FERFJFU1NfU1RSICJcbiIsCisJCQlNQUNfQUREUl9BUlJBWShwQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMpLAorCQkJTUFDX0FERFJfQVJSQVkod3JxdS5hcF9hZGRyLnNhX2RhdGEpKTsKKwkJaGRkX3NlbmRfdXBkYXRlX2JlYWNvbl9pZXNfZXZlbnQocEFkYXB0ZXIsIHBDc3JSb2FtSW5mbyk7CisKKwkJLyoKKwkJICogU2VuZCBJV0VWQVNTT0NSRVNQSUUgRXZlbnQgaWYgV0xBTl9GRUFUVVJFX0NJUV9NRVRSSUNTCisJCSAqIGlzIEVuYWJsZWQgT3IgU2VuZCBJV0VWQVNTT0NSRVNQSUUgRXZlbnQgaWYKKwkJICogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgaXMgRW5hYmxlZCBhbmQgZkZURW5hYmxlIGlzIHRydWUuCisJCSAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCS8qIFNlbmQgRlQgS2V5cyB0byB0aGUgc3VwcGxpY2FudCB3aGVuIEZUIGlzIGVuYWJsZWQgKi8KKwkJaWYgKChwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID09CisJCSAgICAgZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSykKKwkJICAgIHx8IChwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID09CisJCQllQ1NSX0FVVEhfVFlQRV9GVF9SU04pCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQkgICAgfHwgKHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPT0KKwkJCWVDU1JfQVVUSF9UWVBFX0NDS01fUlNOKQorCQkgICAgfHwgKHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPT0KKwkJCWVDU1JfQVVUSF9UWVBFX0NDS01fV1BBKQorI2VuZGlmCisJCSAgICApIHsKKwkJCWhkZF9zZW5kX2Z0X2Fzc29jX3Jlc3BvbnNlKGRldiwgcEFkYXB0ZXIsIHBDc3JSb2FtSW5mbyk7CisJCX0KKyNlbmRpZgorCQlpZiAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9DTElFTlQpIHsKKwkJCXRTaXJTbWVDaGFuSW5mbyBjaGFuX2luZm87CisJCQljZGZfY29weV9tYWNhZGRyKCZwZWVyTWFjQWRkciwKKwkJCQkJICZwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQpOworCQkJY2hhbl9pbmZvLmNoYW5faWQgPSBwQ3NyUm9hbUluZm8tPmNoYW5faW5mby5jaGFuX2lkOworCQkJY2hhbl9pbmZvLm1oeiA9IHBDc3JSb2FtSW5mby0+Y2hhbl9pbmZvLm1oejsKKwkJCWNoYW5faW5mby5pbmZvID0gcENzclJvYW1JbmZvLT5jaGFuX2luZm8uaW5mbzsKKwkJCWNoYW5faW5mby5iYW5kX2NlbnRlcl9mcmVxMSA9CisJCQkJcENzclJvYW1JbmZvLT5jaGFuX2luZm8uYmFuZF9jZW50ZXJfZnJlcTE7CisJCQljaGFuX2luZm8uYmFuZF9jZW50ZXJfZnJlcTIgPQorCQkJCXBDc3JSb2FtSW5mby0+Y2hhbl9pbmZvLmJhbmRfY2VudGVyX2ZyZXEyOworCQkJY2hhbl9pbmZvLnJlZ19pbmZvXzEgPQorCQkJCXBDc3JSb2FtSW5mby0+Y2hhbl9pbmZvLnJlZ19pbmZvXzE7CisJCQljaGFuX2luZm8ucmVnX2luZm9fMiA9CisJCQkJcENzclJvYW1JbmZvLT5jaGFuX2luZm8ucmVnX2luZm9fMjsKKworCQkJLyogc2VuZCBwZWVyIHN0YXR1cyBpbmRpY2F0aW9uIHRvIG9lbSBhcHAgKi8KKwkJCWhkZF9zZW5kX3BlZXJfc3RhdHVzX2luZF90b19vZW1fYXBwKCZwZWVyTWFjQWRkciwKKwkJCQkJCQkgICAgZVBlZXJDb25uZWN0ZWQsCisJCQkJCQkJICAgIHBDc3JSb2FtSW5mby0+CisJCQkJCQkJICAgIHRpbWluZ01lYXNDYXAsCisJCQkJCQkJICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkJICAgICZjaGFuX2luZm8pOworCQl9CisjaWZkZWYgTVNNX1BMQVRGT1JNCisjaWZkZWYgQ09ORklHX0NOU1MKKwkJLyogc3RhcnQgdGltZXIgaW4gc3RhL3AycF9jbGkgKi8KKwkJc3Bpbl9sb2NrX2JoKCZwSGRkQ3R4LT5idXNfYndfbG9jayk7CisJCXBBZGFwdGVyLT5wcmV2X3R4X3BhY2tldHMgPSBwQWRhcHRlci0+c3RhdHMudHhfcGFja2V0czsKKwkJcEFkYXB0ZXItPnByZXZfcnhfcGFja2V0cyA9IHBBZGFwdGVyLT5zdGF0cy5yeF9wYWNrZXRzOworCQlzcGluX3VubG9ja19iaCgmcEhkZEN0eC0+YnVzX2J3X2xvY2spOworCQloZGRfc3RhcnRfYnVzX2J3X2NvbXB1dGVfdGltZXIocEFkYXB0ZXIpOworI2VuZGlmCisjZW5kaWYKKwl9IGVsc2UgaWYgKGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCA9PSAgICAvKiBJQnNzIEFzc29jaWF0ZWQgKi8KKwkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJY2RzX2luY3JfYWN0aXZlX3Nlc3Npb24ocEhkZEN0eCwgcEFkYXB0ZXItPmRldmljZV9tb2RlLAorCQkJCQkJcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLmJ5dGVzLAorCQkgICAgICAgRVRIX0FMRU4pOworCQlwcl9pbmZvKCJ3bGFuOiBuZXcgSUJTUyBjb25uZWN0aW9uIHRvICIgTUFDX0FERFJFU1NfU1RSICJcbiIsCisJCQlNQUNfQUREUl9BUlJBWShwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQuYnl0ZXMpKTsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBOb3QgQXNzb2NpYXRlZCAqLworCisJCXByX2luZm8oIndsYW46IGRpc2Nvbm5lY3RlZFxuIik7CisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgJ1wwJywgRVRIX0FMRU4pOworCQljZHNfZGVjcl9zZXNzaW9uX3NldF9wY2woCisJCQkJCQlwSGRkQ3R4LCBwQWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJCQlwQWRhcHRlci0+c2Vzc2lvbklkKTsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJCXdsYW5faGRkX2VuYWJsZV9yb2FtaW5nKHBBZGFwdGVyKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKwkJd2xhbl9oZGRfYXV0b19zaHV0ZG93bl9lbmFibGUocEhkZEN0eCwgdHJ1ZSk7CisjZW5kaWYKKworCQlpZiAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9DTElFTlQpIHsKKwkJCWNkZl9jb3B5X21hY2FkZHIoJnBlZXJNYWNBZGRyLAorCQkJCQkgJnBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZCk7CisKKwkJCS8qIHNlbmQgcGVlciBzdGF0dXMgaW5kaWNhdGlvbiB0byBvZW0gYXBwICovCisJCQloZGRfc2VuZF9wZWVyX3N0YXR1c19pbmRfdG9fb2VtX2FwcCgmcGVlck1hY0FkZHIsCisJCQkJCQkJICAgZVBlZXJEaXNjb25uZWN0ZWQsIDAsCisJCQkJCQkJICAgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCQkgICBOVUxMKTsKKwkJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisJCXBBZGFwdGVyLT5yc3NpX3NlbmQgPSBmYWxzZTsKKwkJd2xhbl9oZGRfc2VuZF9zdGF0dXNfcGtnKHBBZGFwdGVyLCBwSGRkU3RhQ3R4LCAxLCAwKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJCWlmICgocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX0lORlJBX1NUQVRJT04pICYmCisJCSAgICAocENzclJvYW1JbmZvKSkgeworCQkJaGRkTG9nKExPRzQsCisJCQkJRkwoInRkbHNfcHJvaGliaXRlZDogJWQsIHRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQ6ICVkIiksCisJCQkJcENzclJvYW1JbmZvLT50ZGxzX3Byb2hpYml0ZWQsCisJCQkJcENzclJvYW1JbmZvLT50ZGxzX2NoYW5fc3dpdF9wcm9oaWJpdGVkKTsKKworCQkJd2xhbl9oZGRfdXBkYXRlX3RkbHNfaW5mbyhwQWRhcHRlciwKKwkJCQlwQ3NyUm9hbUluZm8tPnRkbHNfcHJvaGliaXRlZCwKKwkJCQlwQ3NyUm9hbUluZm8tPnRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQpOworCQl9CisjZW5kaWYKKyNpZmRlZiBNU01fUExBVEZPUk0KKwkJLyogc3RvcCB0aW1lciBpbiBzdGEvcDJwX2NsaSAqLworCQlzcGluX2xvY2tfYmgoJnBIZGRDdHgtPmJ1c19id19sb2NrKTsKKwkJcEFkYXB0ZXItPnByZXZfdHhfcGFja2V0cyA9IDA7CisJCXBBZGFwdGVyLT5wcmV2X3J4X3BhY2tldHMgPSAwOworCQlzcGluX3VubG9ja19iaCgmcEhkZEN0eC0+YnVzX2J3X2xvY2spOworCQloZGRfc3RvcF9idXNfYndfY29tcHV0ZV90aW1lcihwQWRhcHRlcik7CisjZW5kaWYKKwl9CisJY2RzX2R1bXBfY29uY3VycmVuY3lfaW5mbyhwSGRkQ3R4KTsKKwkvKiBTZW5kIFNDQy9NQ0MgU3dpdGNoaW5nIGV2ZW50IHRvIElQQSAqLworCWhkZF9pcGFfc2VuZF9tY2Nfc2NjX21zZyhwSGRkQ3R4LCBwSGRkQ3R4LT5tY2NfbW9kZSk7CisKKwltc2cgPSBOVUxMOworCS8qRHVyaW5nIHRoZSBXTEFOIHVuaW5pdGlhbGl6YXRpb24sc3VwcGxpY2FudCBpcyBzdG9wcGVkIGJlZm9yZSB0aGUKKwkgICBkcml2ZXIgc28gbm90IHNlbmRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgY29ubmVjdGlvbiB0byBzdXBwbGljYW50ICovCisJaWYgKChwSGRkQ3R4LT5pc0xvYWRJblByb2dyZXNzICE9IHRydWUpICYmCisJICAgIChwSGRkQ3R4LT5pc1VubG9hZEluUHJvZ3Jlc3MgIT0gdHJ1ZSkpIHsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIHdlX2V2ZW50LCAmd3JxdSwgbXNnKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCWlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0KKwkJCSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSB7CisJCQlpZiAoKHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPT0KKwkJCSAgICAgZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU04pIHx8CisJCQkgICAgKHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPT0KKwkJCQllQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQSkpCisJCQkJaGRkX3NlbmRfbmV3X2FwX2NoYW5uZWxfaW5mbyhkZXYsIHBBZGFwdGVyLAorCQkJCQkJCSAgICAgcENzclJvYW1JbmZvKTsKKwkJfQorI2VuZGlmCisJfQorfQorCisvKioKKyAqIGhkZF9jb25uX3JlbW92ZV9jb25uZWN0X2luZm8oKSAtIHJlbW92ZSBjb25uZWN0aW9uIGluZm8KKyAqIEBwSGRkU3RhQ3R4OiBwb2ludGVyIHRvIGdsb2JhbCBIREQgc3RhdGlvbiBjb250ZXh0CisgKiBAcENzclJvYW1JbmZvOiBwb2ludGVyIHRvIHJvYW0gaW5mbworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfY29ubl9yZW1vdmVfY29ubmVjdF9pbmZvKGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4KQoreworCS8qIFJlbW92ZSBzdGFJZCwgYnNzSWQgYW5kIHBlZXJNYWNBZGRyZXNzICovCisJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdID0gMDsKKwljZGZfbWVtX3plcm8oJnBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZCwgQ0RGX01BQ19BRERSX1NJWkUpOworCWNkZl9tZW1femVybygmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnBlZXJNYWNBZGRyZXNzWzBdLAorCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKworCS8qIENsZWFyIGFsbCBzZWN1cml0eSBzZXR0aW5ncyAqLworCXBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOworCXBIZGRTdGFDdHgtPmNvbm5faW5mby5tY0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwlwSGRkU3RhQ3R4LT5jb25uX2luZm8udWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisKKwljZGZfbWVtX3plcm8oJnBIZGRTdGFDdHgtPmNvbm5faW5mby5LZXlzLCBzaXplb2YodENzcktleXMpKTsKKwljZGZfbWVtX3plcm8oJnBIZGRTdGFDdHgtPmlic3NfZW5jX2tleSwgc2l6ZW9mKHRDc3JSb2FtU2V0S2V5KSk7CisKKwkvKiBTZXQgbm90LWNvbm5lY3RlZCBzdGF0ZSAqLworCXBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uRG90MTFEZXNpcmVkQnNzVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworCXBIZGRTdGFDdHgtPmNvbm5faW5mby5wcm94eUFSUFNlcnZpY2UgPSAwOworCisJY2RmX21lbV96ZXJvKCZwSGRkU3RhQ3R4LT5jb25uX2luZm8uU1NJRCwgc2l6ZW9mKHRDc3JTU0lESW5mbykpOworfQorCisvKioKKyAqIGhkZF9yb2FtX2RlcmVnaXN0ZXJfc3RhKCkgLSBkZXJlZ2lzdGVyIHN0YXRpb24KKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAc3RhSWQ6IHN0YXRpb24gaWRlbnRpZmllcgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUworaGRkX3JvYW1fZGVyZWdpc3Rlcl9zdGEoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVpbnQ4X3Qgc3RhSWQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9JYnNzRGlzY29ubmVjdGVkID09CisJICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJLyoKKwkJICogRG8gbm90IHNldCB0aGUgY2FycmllciBvZmYgd2hlbiB0aGUgbGFzdCBwZWVyIGxlYXZlcy4KKwkJICogV2Ugd2lsbCBzZXQgdGhlIGNhcnJpZXIgb2ZmIHdoaWxlIHN0b3BwaW5nIHRoZSBJQlNTLgorCQkgKi8KKwl9CisKKwljZGZfc3RhdHVzID0gb2xfdHhyeF9jbGVhcl9wZWVyKHN0YUlkKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJvbF90eHJ4X2NsZWFyX3BlZXIoKSBmYWlsZWQgZm9yIHN0YUlEICVkLiBTdGF0dXMoJWQpIFsweCUwOFhdIiksCisJCQlzdGFJZCwgY2RmX3N0YXR1cywgY2RmX3N0YXR1cyk7CisJfQorCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIGhkZF9kaXNfY29ubmVjdF9oYW5kbGVyKCkgLSBkaXNjb25uZWN0IGV2ZW50IGhhbmRsZXIKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAcFJvYW1JbmZvOiBwb2ludGVyIHRvIHJvYW0gaW5mbworICogQHJvYW1JZDogcm9hbSBpZGVudGlmaWVyCisgKiBAcm9hbVN0YXR1czogcm9hbSBzdGF0dXMKKyAqIEByb2FtUmVzdWx0OiByb2FtIHJlc3VsdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBkaXNjb25uZWN0IGV2ZW50OgorICogMS4gRGlzYWJsZSB0cmFuc21pdCBxdWV1ZXM7CisgKiAyLiBDbGVhbiB1cCBpbnRlcm5hbCBjb25uZWN0aW9uIHN0YXRlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzOworICogMy4gU2VuZCBkaXNjb25uZWN0IGluZGljYXRpb24gdG8gc3VwcGxpY2FudC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworc3RhdGljIENERl9TVEFUVVMgaGRkX2Rpc19jb25uZWN0X2hhbmRsZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCSAgdENzclJvYW1JbmZvICpwUm9hbUluZm8sCisJCQkJCSAgdWludDMyX3Qgcm9hbUlkLAorCQkJCQkgIGVSb2FtQ21kU3RhdHVzIHJvYW1TdGF0dXMsCisJCQkJCSAgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIHZzdGF0dXM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBBZGFwdGVyLT5kZXY7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJdWludDhfdCBzdGFfaWQ7CisJYm9vbCBzZW5kRGlzY29uSW5kID0gdHJ1ZTsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQloZGRMb2coTE9HRSwgRkwoIm5ldF9kZXYgaXMgcmVsZWFzZWQgcmV0dXJuIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIG5vdGlmeSBhcHBzIHRoYXQgd2UgY2FuJ3QgcGFzcyB0cmFmZmljIGFueW1vcmUgKi8KKwloZGRMb2coTE9HMSwgRkwoIkRpc2FibGluZyBxdWV1ZXMiKSk7CisJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChwQWRhcHRlciwgV0xBTl9ORVRJRl9UWF9ESVNBQkxFX05fQ0FSUklFUiwKKwkJCQkgICBXTEFOX0NPTlRST0xfUEFUSCk7CisKKwlpZiAoaGRkX2lwYV9pc19lbmFibGVkKHBIZGRDdHgpKQorCQloZGRfaXBhX3dsYW5fZXZ0KHBBZGFwdGVyLCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbMF0sCisJCQkJIFdMQU5fU1RBX0RJU0NPTk5FQ1QsCisJCQkJIHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZC5ieXRlcyk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgorCXdsYW5faGRkX2F1dG9fc2h1dGRvd25fZW5hYmxlKHBIZGRDdHgsIHRydWUpOworI2VuZGlmCisKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisJLyogU1RBIGRpc2Nvbm5lY3RlZCwgdXBkYXRlIGludG8gdHJhY2UgYnVmZmVyICovCisJaWYgKHBIZGRDdHgtPmNvbmZpZy0+Z0VuYWJsZURlYnVnTG9nKQorCQljZHNfcGt0X3RyYWNlX2J1Zl91cGRhdGUoIlNUOkRJU0FTQyIpOworI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworCS8qIEhERCBoYXMgaW5pdGlhdGVkIGRpc2Nvbm5lY3QsIGRvIG5vdCBzZW5kIGRpc2Nvbm5lY3QgaW5kaWNhdGlvbgorCSAqIHRvIGtlcm5lbC4gU2VuZGluZyBkaXNjb25uZWN0ZWQgZXZlbnQgdG8ga2VybmVsIGZvciB1c2Vyc3BhY2UKKwkgKiBpbml0aWF0ZWQgZGlzY29ubmVjdCB3aWxsIGJlIGhhbmRsZWQgYnkgaGRkX0Rpc0Nvbm5lY3RIYW5kbGVyIGNhbGwKKwkgKiB0byBjZmc4MDIxMV9kaXNjb25uZWN0ZWQuCisJICovCisJaWYgKChlQ29ubmVjdGlvblN0YXRlX0Rpc2Nvbm5lY3RpbmcgPT0KKwkgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgfHwKKwkgICAgKGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkID09CisJICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpKSB7CisJCWhkZExvZyhMT0cxLAorCQkJRkwoIkhERCBoYXMgaW5pdGlhdGVkIGEgZGlzY29ubmVjdCwgbm8gbmVlZCB0byBzZW5kIGRpc2Nvbm5lY3QgaW5kaWNhdGlvbiB0byBrZXJuZWwiKSk7CisJCXNlbmREaXNjb25JbmQgPSBmYWxzZTsKKwl9CisKKwlpZiAocEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSAhPSBlQ29ubmVjdGlvblN0YXRlX0Rpc2Nvbm5lY3RpbmcpIHsKKwkJSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKwkJaGRkTG9nKExPRzEsCisJCQlGTCgiU2V0IEhERCBjb25uU3RhdGUgdG8gZUNvbm5lY3Rpb25TdGF0ZV9EaXNjb25uZWN0aW5nIikpOworCQloZGRfY29ubl9zZXRfY29ubmVjdGlvbl9zdGF0ZShwQWRhcHRlciwKKwkJCQkJICAgICAgZUNvbm5lY3Rpb25TdGF0ZV9EaXNjb25uZWN0aW5nKTsKKwl9CisKKwloZGRfY2xlYXJfcm9hbV9wcm9maWxlX2llKHBBZGFwdGVyKTsKKwloZGRfd21tX2luaXQocEFkYXB0ZXIpOworCisJLyogaW5kaWNhdGUgJ2Rpc2Nvbm5lY3QnIHN0YXR1cyB0byB3cGFfc3VwcGxpY2FudC4uLiAqLworCWhkZF9zZW5kX2Fzc29jaWF0aW9uX2V2ZW50KGRldiwgcFJvYW1JbmZvKTsKKwkvKiBpbmRpY2F0ZSBkaXNjb25uZWN0ZWQgZXZlbnQgdG8gbmw4MDIxMSAqLworCWlmIChyb2FtU3RhdHVzICE9IGVDU1JfUk9BTV9JQlNTX0xFQVZFKSB7CisJCS8qCisJCSAqIE9ubHkgc2VuZCBpbmRpY2F0aW9uIHRvIGtlcm5lbCBpZiBub3QgaW5pdGlhdGVkCisJCSAqIGJ5IGtlcm5lbAorCQkgKi8KKwkJaWYgKHNlbmREaXNjb25JbmQpIHsKKwkJCS8qCisJCQkgKiBUbyBhdm9pZCB3cGFfc3VwcGxpY2FudCBzZW5kaW5nICJIQU5HRUQiIENNRAorCQkJICogdG8gSUNTIFVJLgorCQkJICovCisJCQlpZiAoZUNTUl9ST0FNX0xPU1RMSU5LID09IHJvYW1TdGF0dXMpCisJCQkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKGRldiwgcFJvYW1JbmZvLT4KKwkJCQkJCSAgICAgIHJlYXNvbkNvZGUsIE5VTEwsCisJCQkJCQkgICAgICAwLCBHRlBfS0VSTkVMKTsKKwkJCWVsc2UKKwkJCQljZmc4MDIxMV9kaXNjb25uZWN0ZWQoZGV2LAorCQkJCQkgICAgICBXTEFOX1JFQVNPTl9VTlNQRUNJRklFRCwKKwkJCQkJICAgICAgTlVMTCwgMCwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisKKwkJCWhkZF9pbmZvKCJzZW50IGRpc2Nvbm5lY3RlZCBldmVudCB0byBubDgwMjExLCByc3NpOiAlZCIsCisJCQkJcEFkYXB0ZXItPnJzc2kpOworCQl9CisJCS8qCisJCSAqIER1cmluZyB0aGUgV0xBTiB1bmluaXRpYWxpemF0aW9uLHN1cHBsaWNhbnQgaXMgc3RvcHBlZAorCQkgKiBiZWZvcmUgdGhlIGRyaXZlciBzbyBub3Qgc2VuZGluZyB0aGUgc3RhdHVzIG9mIHRoZQorCQkgKiBjb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQuCisJCSAqLworCQlpZiAoKHBIZGRDdHgtPmlzTG9hZEluUHJvZ3Jlc3MgIT0gdHJ1ZSkgJiYKKwkJICAgIChwSGRkQ3R4LT5pc1VubG9hZEluUHJvZ3Jlc3MgIT0gdHJ1ZSkpIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0RFQlVHCisJCQlpZiAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9DTElFTlQpIHsKKwkJCQlpZiAoZ2xvYmFsX3AycF9jb25uZWN0aW9uX3N0YXR1cyA9PQorCQkJCSAgICBQMlBfQ0xJRU5UX0NPTk5FQ1RFRF9TVEFURV8xKSB7CisJCQkJCWdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXMgPQorCQkJCQkJUDJQX0NMSUVOVF9ESVNDT05ORUNURURfU1RBVEU7CisJCQkJCWhkZExvZyhMT0dFLAorCQkJCQkgICAgICAgIltQMlAgU3RhdGVdIDggd2F5IEhhbmRzaGFrZSBjb21wbGV0ZWQgYW5kIG1vdmVkIHRvIGRpc2Nvbm5lY3RlZCBzdGF0ZSIpOworCQkJCX0gZWxzZSBpZiAoZ2xvYmFsX3AycF9jb25uZWN0aW9uX3N0YXR1cyA9PQorCQkJCQkgICBQMlBfQ0xJRU5UX0NPTVBMRVRFRF9TVEFURSkgeworCQkJCQlnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID0KKwkJCQkJCVAyUF9OT1RfQUNUSVZFOworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgICJbUDJQIFN0YXRlXSBQMlAgQ2xpZW50IGlzIHJlbW92ZWQgYW5kIG1vdmVkIHRvIGluYWN0aXZlIHN0YXRlIik7CisJCQkJfQorCQkJfQorI2VuZGlmCisKKwkJfQorCX0KKworCWhkZF93bW1fYWRhcHRlcl9jbGVhcihwQWRhcHRlcik7CisjaWYgZGVmaW5lZChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikKKwlzbWVfZnRfcmVzZXQoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKyNlbmRpZgorCWlmIChlQ1NSX1JPQU1fSUJTU19MRUFWRSA9PSByb2FtU3RhdHVzKSB7CisJCXN0YV9pZCA9IElCU1NfQlJPQURDQVNUX1NUQUlEOworCQl2c3RhdHVzID0gaGRkX3JvYW1fZGVyZWdpc3Rlcl9zdGEocEFkYXB0ZXIsIHN0YV9pZCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHZzdGF0dXMpKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQlGTCgiaGRkX3JvYW1fZGVyZWdpc3Rlcl9zdGEoKSBmYWlsZWQgZm9yIHN0YUlEICVkIFN0YXR1cz0lZCBbMHgleF0iKSwKKwkJCQlzdGFfaWQsIHN0YXR1cywgc3RhdHVzKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXBIZGRDdHgtPnN0YV90b19hZGFwdGVyW3N0YV9pZF0gPSBOVUxMOworCX0KKwlzdGFfaWQgPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbMF07CisKKwkvKiBXZSBzaG91bGQgY2xlYXIgYWxsIHN0YSByZWdpc3RlciB3aXRoIFRMLCBmb3Igbm93LCBvbmx5IG9uZS4gKi8KKwl2c3RhdHVzID0gaGRkX3JvYW1fZGVyZWdpc3Rlcl9zdGEocEFkYXB0ZXIsIHN0YV9pZCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1ModnN0YXR1cykpIHsKKwkJaGRkTG9nKExPR0UsCisJCQkiaGRkX3JvYW1fZGVyZWdpc3Rlcl9zdGEoKSBmYWlsZWQgdG8gZm9yIHN0YUlEICVkLiBTdGF0dXM9ICVkIFsweCV4XSIsCisJCQkgc3RhX2lkLCBzdGF0dXMsIHN0YXR1cyk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBIZGRDdHgtPnN0YV90b19hZGFwdGVyW3N0YV9pZF0gPSBOVUxMOworCS8qIENsZWFyIHNhdmVkIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gaW4gSEREICovCisJaGRkX2Nvbm5fcmVtb3ZlX2Nvbm5lY3RfaW5mbyhwSGRkU3RhQ3R4KTsKKwloZGRMb2coTE9HMSwgRkwoIlNldCBIREQgY29ublN0YXRlIHRvIGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkIikpOworCWhkZF9jb25uX3NldF9jb25uZWN0aW9uX3N0YXRlKHBBZGFwdGVyLCBlQ29ubmVjdGlvblN0YXRlX05vdENvbm5lY3RlZCk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisJaWYgKChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkgICAgKFdMQU5fSEREX1AyUF9DTElFTlQgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSkgeworCQltZW1zZXQoJnBIZGRTdGFDdHgtPmd0a09mZmxvYWRSZXFQYXJhbXMsIDAsCisJCSAgICAgICBzaXplb2YodFNpckd0a09mZmxvYWRQYXJhbXMpKTsKKwkJcEhkZFN0YUN0eC0+Z3RrT2ZmbG9hZFJlcVBhcmFtcy51bEZsYWdzID0gR1RLX09GRkxPQURfRElTQUJMRTsKKwl9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJaWYgKGVDU1JfUk9BTV9JQlNTX0xFQVZFICE9IHJvYW1TdGF0dXMpCisJCXdsYW5faGRkX3RkbHNfZGlzY29ubmVjdGlvbl9jYWxsYmFjayhwQWRhcHRlcik7CisjZW5kaWYKKworCWlmICgoV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJCQkoV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpKSB7CisJCXNtZV9wc19kaXNhYmxlX2F1dG9fcHNfdGltZXIoV0xBTl9IRERfR0VUX0hBTF9DVFgKKwkJCQkocEFkYXB0ZXIpLAorCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQpOworCX0KKwkvKiBVbmJsb2NrIGFueW9uZSB3YWl0aW5nIGZvciBkaXNjb25uZWN0IHRvIGNvbXBsZXRlICovCisJY29tcGxldGUoJnBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGhkZF9zZXRfcGVlcl9hdXRob3JpemVkX2V2ZW50KCkgLSBzZXQgcGVlcl9hdXRob3JpemVkX2V2ZW50CisgKiBAdmRldl9pZDogdmRldmlkCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgaGRkX3NldF9wZWVyX2F1dGhvcml6ZWRfZXZlbnQodWludDMyX3QgdmRldl9pZCkKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gTlVMTDsKKworCWFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXJfYnlfdmRldihoZGRfY3R4LCB2ZGV2X2lkKTsKKwlpZiAoYWRhcHRlciA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLAorCQkJIiVzOiBJbnZhbGlkIHZkZXZfaWQiLCBfX2Z1bmNfXyk7CisJfQorCWNvbXBsZXRlKCZhZGFwdGVyLT5zdGFfYXV0aG9yaXplZF9ldmVudCk7Cit9CisKKy8qKgorICogaGRkX2NoYW5nZV9wZWVyX3N0YXRlKCkgLSBjaGFuZ2UgcGVlciBzdGF0ZQorICogQHBBZGFwdGVyOiBIREQgYWRhcHRlcgorICogQHN0YV9zdGF0ZTogcGVlciBzdGF0ZQorICogQHJvYW1fc3luY2hfaW5fcHJvZ3Jlc3M6IHJvYW0gc3luY2ggaW4gcHJvZ3Jlc3MKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBoZGRfY2hhbmdlX3BlZXJfc3RhdGUoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJIHVpbnQ4X3Qgc3RhX2lkLAorCQkJCSBlbnVtIG9sX3R4cnhfcGVlcl9zdGF0ZSBzdGFfc3RhdGUsCisJCQkJIGJvb2wgcm9hbV9zeW5jaF9pbl9wcm9ncmVzcykKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisJQ0RGX1NUQVRVUyBlcnI7CisJc3RydWN0IG9sX3R4cnhfcGRldl90ICpwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisKKwlpZiAoIXBkZXYpIHsKKwkJaGRkX2VycigiRmFpbGVkIHRvIGdldCB0eHJ4IGNvbnRleHQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlpZiAoc3RhX2lkID49IFdMQU5fTUFYX1NUQV9DT1VOVCkgeworCQloZGRMb2coTE9HRSwgIkludmFsaWQgc3RhIGlkIDolZCIsIHN0YV9pZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJcGVlciA9IG9sX3R4cnhfcGVlcl9maW5kX2J5X2xvY2FsX2lkKHBkZXYsIHN0YV9pZCk7CisJaWYgKCFwZWVyKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCisJZXJyID0gb2xfdHhyeF9wZWVyX3N0YXRlX3VwZGF0ZShwZGV2LAorCQkJKHVfaW50OF90ICopIHBlZXItPm1hY19hZGRyLnJhdywgc3RhX3N0YXRlKTsKKwlpZiAoZXJyICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQloZGRMb2coTE9HRSwgInBlZXIgc3RhdGUgdXBkYXRlIGZhaWxlZCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJaWYgKHJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MpCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisjZW5kaWYKKworCWlmIChzdGFfc3RhdGUgPT0gb2xfdHhyeF9wZWVyX3N0YXRlX2F1dGgpIHsKKyNpZmRlZiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTAorCQkvKiBtYWtlIHN1cmUgZXZlbnQgaXMgcmVzZXQgKi8KKwkJSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5zdGFfYXV0aG9yaXplZF9ldmVudCk7CisjZW5kaWYKKworCQllcnIgPSBzbWVfc2V0X3BlZXJfYXV0aG9yaXplZChwZWVyLT5tYWNfYWRkci5yYXcsCisJCQkJaGRkX3NldF9wZWVyX2F1dGhvcml6ZWRfZXZlbnQsCisJCQkJcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCWlmIChlcnIgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQloZGRMb2coTE9HRSwgIkZhaWxlZCB0byBzZXQgdGhlIHBlZXIgc3RhdGUgdG8gYXV0aG9yaXplZCIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJfQorCisJCWlmIChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTiB8fAorCQkgICAgcEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9DTElFTlQpIHsKKyNpZiBkZWZpbmVkKFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MKSB8fCBkZWZpbmVkKFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIpCisJCQl1bnNpZ25lZCBsb25nIHJjOworCisJCQkvKiB3YWl0IGZvciBldmVudCBmcm9tIGZpcm13YXJlIHRvIHNldCB0aGUgZXZlbnQgKi8KKwkJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAorCQkJCSZwQWRhcHRlci0+c3RhX2F1dGhvcml6ZWRfZXZlbnQsCisJCQkJbXNlY3NfdG9famlmZmllcyhIRERfUEVFUl9BVVRIT1JJWkVfV0FJVCkpOworCQkJaWYgKCFyYykgeworCQkJCWhkZExvZyhMT0cxLCAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3Igc3RhX2F1dGhvcml6ZWRfZXZlbnQiLAorCQkJCQlfX2Z1bmNfXyk7CisJCQl9CisJCQlvbF90eHJ4X3ZkZXZfdW5wYXVzZShwZWVyLT52ZGV2LAorCQkJCU9MX1RYUV9QQVVTRV9SRUFTT05fUEVFUl9VTkFVVEhPUklaRUQpOworI2VuZGlmCisJCX0KKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBoZGRfcm9hbV9yZWdpc3Rlcl9zdGEoKSAtIHJlZ2lzdGVyIHN0YXRpb24KKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAcFJvYW1JbmZvOiBwb2ludGVyIHRvIHJvYW0gaW5mbworICogQHN0YUlkOiBzdGF0aW9uIGlkZW50aWZpZXIKKyAqIEBwUGVlck1hY0FkZHJlc3M6IHBlZXIgTUFDIGFkZHJlc3MKKyAqIEBwQnNzRGVzYzogcG9pbnRlciB0byBCU1MgZGVzY3JpcHRpb24KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworc3RhdGljIENERl9TVEFUVVMgaGRkX3JvYW1fcmVnaXN0ZXJfc3RhKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQl0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywKKwkJCQkJdWludDhfdCBzdGFJZCwKKwkJCQkJc3RydWN0IGNkZl9tYWNfYWRkciAqcFBlZXJNYWNBZGRyZXNzLAorCQkJCQl0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXN0cnVjdCBvbF90eHJ4X2Rlc2NfdHlwZSBzdGFEZXNjID0geyAwIH07CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworCWlmIChOVUxMID09IHBCc3NEZXNjKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkvKiBHZXQgdGhlIFN0YXRpb24gSUQgZnJvbSB0aGUgb25lIHNhdmVkIGR1cmluZyB0aGUgYXNzb2NpYXRpb24gKi8KKwlzdGFEZXNjLnN0YV9pZCA9IHN0YUlkOworCisJLyogc2V0IHRoZSBRb1MgZmllbGQgYXBwcm9wcmlhdGVseSAqLworCWlmIChoZGRfd21tX2lzX2FjdGl2ZShwQWRhcHRlcikpCisJCXN0YURlc2MuaXNfcW9zX2VuYWJsZWQgPSAxOworCWVsc2UKKwkJc3RhRGVzYy5pc19xb3NfZW5hYmxlZCA9IDA7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCWhkZExvZyhMT0cxLCBGTCgiV0FQSSBTVEEgUmVnaXN0ZXJlZDogJWQiKSwKKwkgICAgICAgcEFkYXB0ZXItPndhcGlfaW5mby5mSXNXYXBpU3RhKTsKKwlpZiAocEFkYXB0ZXItPndhcGlfaW5mby5mSXNXYXBpU3RhKQorCQlzdGFEZXNjLmlzX3dhcGlfc3VwcG9ydGVkID0gMTsKKwllbHNlCisJCXN0YURlc2MuaXNfd2FwaV9zdXBwb3J0ZWQgPSAwOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKwljZGZfc3RhdHVzID0gb2xfdHhyeF9yZWdpc3Rlcl9wZWVyKGhkZF9yeF9wYWNrZXRfY2JrLAorCQkJCQkJJnN0YURlc2MpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWhkZExvZyhMT0dXLAorCQkJIm9sX3R4cnhfcmVnaXN0ZXJfcGVlcigpIGZhaWxlZCB0byByZWdpc3Rlci4gU3RhdHVzPSVkIFsweCUwOFhdIiwKKwkJCWNkZl9zdGF0dXMsIGNkZl9zdGF0dXMpOworCQlyZXR1cm4gY2RmX3N0YXR1czsKKwl9CisKKwlpZiAoIXBSb2FtSW5mby0+ZkF1dGhSZXF1aXJlZCkgeworCQkvKgorCQkgKiBDb25uZWN0aW9ucyB0aGF0IGRvIG5vdCBuZWVkIFVwcGVyIGxheWVyIGF1dGgsIHRyYW5zaXRpb24KKwkJICogVExTSElNIGRpcmVjdGx5IHRvICdBdXRoZW50aWNhdGVkJyBzdGF0ZQorCQkgKi8KKwkJY2RmX3N0YXR1cyA9CisJCQloZGRfY2hhbmdlX3BlZXJfc3RhdGUocEFkYXB0ZXIsIHN0YURlc2Muc3RhX2lkLAorCQkJCQkJb2xfdHhyeF9wZWVyX3N0YXRlX2F1dGgsCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQkJCQkJcFJvYW1JbmZvLT5yb2FtU3luY2hJblByb2dyZXNzCisjZWxzZQorCQkJCQkJZmFsc2UKKyNlbmRpZgorCQkJCQkJKTsKKworCQloZGRfY29ubl9zZXRfYXV0aGVudGljYXRlZChwQWRhcHRlciwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJaGRkTG9nKExPRzMsCisJCQkiVUxBIGF1dGggU3RhSWQ9ICVkLiBDaGFuZ2luZyBUTCBzdGF0ZSB0byBDT05ORUNURUQgYXQgSm9pbiB0aW1lIiwKKwkJCSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbMF0pOworCQljZGZfc3RhdHVzID0KKwkJCWhkZF9jaGFuZ2VfcGVlcl9zdGF0ZShwQWRhcHRlciwgc3RhRGVzYy5zdGFfaWQsCisJCQkJCQlvbF90eHJ4X3BlZXJfc3RhdGVfY29ubiwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJCQkJCQlwUm9hbUluZm8tPnJvYW1TeW5jaEluUHJvZ3Jlc3MKKyNlbHNlCisJCQkJCQlmYWxzZQorI2VuZGlmCisJCQkJCQkpOworCQloZGRfY29ubl9zZXRfYXV0aGVudGljYXRlZChwQWRhcHRlciwgZmFsc2UpOworCX0KKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiBoZGRfc2VuZF9yZV9hc3NvY19ldmVudCgpIC0gc2VuZCByZWFzc29jIGV2ZW50CisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldCBkZXZpY2UKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAcENzclJvYW1JbmZvOiBwb2ludGVyIHRvIHJvYW0gaW5mbworICogQHJlcVJzbkllOiBwb2ludGVyIHRvIFJTTiBJbmZvcm1hdGlvbiBlbGVtZW50CisgKiBAcmVxUnNuTGVuZ3RoOiBsZW5ndGggb2YgUlNOIElFCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9zZW5kX3JlX2Fzc29jX2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHRDc3JSb2FtSW5mbyAqcENzclJvYW1JbmZvLAorCXVpbnQ4X3QgKnJlcVJzbkllLCB1aW50MzJfdCByZXFSc25MZW5ndGgpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IDA7CisJdTggKnBGVEFzc29jUnNwID0gTlVMTDsKKwl1aW50OF90ICpyc3BSc25JZSA9IGttYWxsb2MoSVdfR0VORVJJQ19JRV9NQVgsIEdGUF9LRVJORUwpOworCXVpbnQzMl90IHJzcFJzbkxlbmd0aCA9IDA7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwl1aW50OF90IGJ1Zl9zc2lkX2llWzIgKyBTSVJfTUFDX1NTSURfRUlEX01BWF07IC8qIDIgYnl0ZXMtRUlEIGFuZCBsZW4gKi8KKwl1aW50OF90ICpidWZfcHRyLCBzc2lkX2llX2xlbjsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MgPSBOVUxMOworCXVpbnQ4X3QgKmZpbmFsX3JlcV9pZSA9IE5VTEw7CisJdENzclJvYW1Db25uZWN0ZWRQcm9maWxlIHJvYW1fcHJvZmlsZTsKKwl0SGFsSGFuZGxlIGhhbF9oYW5kbGUgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisKKwlpZiAoIXJzcFJzbkllKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIFJTTiBJRSIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQ3NyUm9hbUluZm8gPT0gTlVMTCkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgQ1NSIHJvYW0gaW5mbyIpKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChwQ3NyUm9hbUluZm8tPm5Bc3NvY1JzcExlbmd0aCA9PSAwKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBhc3NvYyByZXNwb25zZSBsZW5ndGgiKSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlwRlRBc3NvY1JzcCA9CisJCSh1OCAqKSAocENzclJvYW1JbmZvLT5wYkZyYW1lcyArIHBDc3JSb2FtSW5mby0+bkJlYWNvbkxlbmd0aCArCisJCQlwQ3NyUm9hbUluZm8tPm5Bc3NvY1JlcUxlbmd0aCk7CisJaWYgKHBGVEFzc29jUnNwID09IE5VTEwpCisJCWdvdG8gZG9uZTsKKworCS8qIHBGVEFzc29jUnNwIG5lZWRzIHRvIHBvaW50IHRvIHRoZSBJRXMgKi8KKwlwRlRBc3NvY1JzcCArPSBGVF9BU1NPQ19SU1BfSUVTX09GRlNFVDsKKwloZGRMb2coTE9HMSwgRkwoIkFzc29jUnNwIGlzIG5vdyBhdCAlMDJ4JTAyeCIpLAorCSAgICAgICAodW5zaWduZWQgaW50KXBGVEFzc29jUnNwWzBdLCAodW5zaWduZWQgaW50KXBGVEFzc29jUnNwWzFdKTsKKworCS8qCisJICogQWN0aXZlIHNlc3Npb24gY291bnQgaXMgZGVjcmVtZW50ZWQgdXBvbiBkaXNjb25uZWN0aW9uLCBidXQgZHVyaW5nCisJICogcm9hbWluZywgdGhlcmUgaXMgbm8gZGlzY29ubmVjdCBpbmRpY2F0aW9uIGFuZCBoZW5jZSBhY3RpdmUgc2Vzc2lvbgorCSAqIGNvdW50IGlzIG5vdCBkZWNyZW1lbnRlZC4KKwkgKiBBZnRlciByb2FtaW5nIGlzIGNvbXBsZXRlZCwgYWN0aXZlIHNlc3Npb24gY291bnQgaXMgaW5jcmVtZW50ZWQKKwkgKiBhcyBhIHBhcnQgb2YgY29ubmVjdCBpbmRpY2F0aW9uIGJ1dCBlZmZlY3RpdmVseSBhZnRlciByb2FtaW5nIHRoZQorCSAqIGFjdGl2ZSBzZXNzaW9uIGNvdW50IHNob3VsZCBzdGlsbCBiZSB0aGUgc2FtZSBhbmQgaGVuY2UgdXBvbgorCSAqIHN1Y2Nlc3NmdWwgcmVhc3NvYyBkZWNyZW1lbnQgdGhlIGFjdGl2ZSBzZXNzaW9uIGNvdW50IGhlcmUuCisJICovCisJY2RzX2RlY3Jfc2Vzc2lvbl9zZXRfcGNsKAorCQkJCQlwSGRkQ3R4LCBwQWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQpOworCisJLyogU2VuZCB0aGUgQXNzb2MgUmVzcCwgdGhlIHN1cHBsaWNhbnQgbmVlZHMgdGhpcyBmb3IgaW5pdGlhbCBBdXRoICovCisJbGVuID0gcENzclJvYW1JbmZvLT5uQXNzb2NSc3BMZW5ndGggLSBGVF9BU1NPQ19SU1BfSUVTX09GRlNFVDsKKwlyc3BSc25MZW5ndGggPSBsZW47CisJY2RmX21lbV9jb3B5KHJzcFJzbkllLCBwRlRBc3NvY1JzcCwgbGVuKTsKKwljZGZfbWVtX3plcm8ocnNwUnNuSWUgKyBsZW4sIElXX0dFTkVSSUNfSUVfTUFYIC0gbGVuKTsKKworCWNoYW4gPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwocEFkYXB0ZXItPndkZXYud2lwaHksCisJCQkJICAgICAoaW50KXBDc3JSb2FtSW5mby0+cEJzc0Rlc2MtPmNoYW5uZWxJZCk7CisJY2RmX21lbV96ZXJvKCZyb2FtX3Byb2ZpbGUsIHNpemVvZih0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUpKTsKKwlzbWVfcm9hbV9nZXRfY29ubmVjdF9wcm9maWxlKGhhbF9oYW5kbGUsIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCSZyb2FtX3Byb2ZpbGUpOworCWJzcyA9IGNmZzgwMjExX2dldF9ic3MocEFkYXB0ZXItPndkZXYud2lwaHksIGNoYW4sCisJCQlwQ3NyUm9hbUluZm8tPmJzc2lkLmJ5dGVzLAorCQkJJnJvYW1fcHJvZmlsZS5TU0lELnNzSWRbMF0sIHJvYW1fcHJvZmlsZS5TU0lELmxlbmd0aCwKKwkJCVdMQU5fQ0FQQUJJTElUWV9FU1MsIFdMQU5fQ0FQQUJJTElUWV9FU1MpOworCisJaWYgKGJzcyA9PSBOVUxMKQorCQloZGRMb2coTE9HRSwgRkwoIkdldCBCU1MgcmV0dXJuZWQgTlVMTCIpKTsKKwlidWZfcHRyID0gYnVmX3NzaWRfaWU7CisJKmJ1Zl9wdHIgPSBTSVJfTUFDX1NTSURfRUlEOworCWJ1Zl9wdHIrKzsKKwkqYnVmX3B0ciA9IHJvYW1fcHJvZmlsZS5TU0lELmxlbmd0aDsgLypsZW4gb2Ygc3NpZCovCisJYnVmX3B0cisrOworCWNkZl9tZW1fY29weShidWZfcHRyLCAmcm9hbV9wcm9maWxlLlNTSUQuc3NJZFswXSwKKwkJCXJvYW1fcHJvZmlsZS5TU0lELmxlbmd0aCk7CisJc3NpZF9pZV9sZW4gPSAyICsgcm9hbV9wcm9maWxlLlNTSUQubGVuZ3RoOworCWhkZExvZyhMT0cyLCBGTCgiU1NJRElFOiIpKTsKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBidWZfc3NpZF9pZSwgc3NpZF9pZV9sZW4pOworCWZpbmFsX3JlcV9pZSA9IGttYWxsb2MoSVdfR0VORVJJQ19JRV9NQVgsIEdGUF9LRVJORUwpOworCWlmIChmaW5hbF9yZXFfaWUgPT0gTlVMTCkKKwkJZ290byBkb25lOworCWJ1Zl9wdHIgPSBmaW5hbF9yZXFfaWU7CisJY2RmX21lbV9jb3B5KGJ1Zl9wdHIsIGJ1Zl9zc2lkX2llLCBzc2lkX2llX2xlbik7CisJYnVmX3B0ciArPSBzc2lkX2llX2xlbjsKKwljZGZfbWVtX2NvcHkoYnVmX3B0ciwgcmVxUnNuSWUsIHJlcVJzbkxlbmd0aCk7CisJY2RmX21lbV9jb3B5KHJzcFJzbkllLCBwRlRBc3NvY1JzcCwgbGVuKTsKKwljZGZfbWVtX3plcm8oZmluYWxfcmVxX2llICsgKHNzaWRfaWVfbGVuICsgcmVxUnNuTGVuZ3RoKSwKKwkJSVdfR0VORVJJQ19JRV9NQVggLSAoc3NpZF9pZV9sZW4gKyByZXFSc25MZW5ndGgpKTsKKwloZGRMb2coTE9HMiwgRkwoIlJlcSBSU04gSUU6IikpOworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfREVCVUcsIGZpbmFsX3JlcV9pZSwKKwkJKHNzaWRfaWVfbGVuICsgcmVxUnNuTGVuZ3RoKSk7CisJY2ZnODAyMTFfcm9hbWVkX2JzcyhkZXYsIGJzcywKKwkJCWZpbmFsX3JlcV9pZSwgKHNzaWRfaWVfbGVuICsgcmVxUnNuTGVuZ3RoKSwKKwkJCXJzcFJzbkllLCByc3BSc25MZW5ndGgsIEdGUF9LRVJORUwpOworCisJaWYgKHBIZGRDdHgtPmNvbmZpZy0+aXNSb2FtT2ZmbG9hZEVuYWJsZWQgJiYKKwkJcENzclJvYW1JbmZvLT5yb2FtU3luY2hJblByb2dyZXNzKQorCQl3bGFuX2hkZF9zZW5kX3JvYW1fYXV0aF9ldmVudChwSGRkQ3R4LAorCQkJCXBDc3JSb2FtSW5mby0+YnNzaWQuYnl0ZXMsCisJCQkJcmVxUnNuSWUsIHJlcVJzbkxlbmd0aCwgcnNwUnNuSWUsCisJCQkJcnNwUnNuTGVuZ3RoLCBwQ3NyUm9hbUluZm8pOworZG9uZToKKwlzbWVfcm9hbV9mcmVlX2Nvbm5lY3RfcHJvZmlsZShoYWxfaGFuZGxlLCAmcm9hbV9wcm9maWxlKTsKKwlpZiAoZmluYWxfcmVxX2llKQorCQlrZnJlZShmaW5hbF9yZXFfaWUpOworCWtmcmVlKHJzcFJzbkllKTsKK30KKworLyoqCisgKiBoZGRfcm9hbV9zZXRfa2V5X2NvbXBsZXRlX2hhbmRsZXIoKSAtIFVwZGF0ZSB0aGUgc2VjdXJpdHkgcGFyYW1ldGVycworICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IHBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKiBAcm9hbUlkOiByb2FtIGlkCisgKiBAcm9hbVN0YXR1czogcm9hbSBzdGF0dXMKKyAqIEByb2FtUmVzdWx0OiByb2FtIHJlc3VsdAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBoZGRfcm9hbV9zZXRfa2V5X2NvbXBsZXRlX2hhbmRsZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCQkgICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8sCisJCQkJCQkgICAgdWludDMyX3Qgcm9hbUlkLAorCQkJCQkJICAgIGVSb2FtQ21kU3RhdHVzIHJvYW1TdGF0dXMsCisJCQkJCQkgICAgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCkKK3sKKwllQ3NyRW5jcnlwdGlvblR5cGUgY29ubmVjdGVkQ2lwaGVyQWxnbzsKKwlib29sIGZDb25uZWN0ZWQgPSBmYWxzZTsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCUVOVEVSKCk7CisKKwlpZiAoTlVMTCA9PSBwUm9hbUluZm8pIHsKKwkJaGRkTG9nKExPRzIsIEZMKCJwUm9hbUluZm8gaXMgTlVMTCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwkvKgorCSAqIGlmIChXUEEpLCB0ZWxsIFRMIHRvIGdvIHRvICdhdXRoZW50aWNhdGVkJyBhZnRlciB0aGUga2V5cyBhcmUgc2V0LgorCSAqIHRoZW4gZ28gdG8gJ2F1dGhlbnRpY2F0ZWQnLiAgRm9yIGFsbCBvdGhlciBhdXRoZW50aWNhdGlvbiB0eXBlcworCSAqICh0aG9zZSB0aGF0IGRvIG5vdCByZXF1aXJlIHVwcGVyIGxheWVyIGF1dGhlbnRpY2F0aW9uKSB3ZSBjYW4gcHV0IFRMCisJICogZGlyZWN0bHkgaW50byAnYXV0aGVudGljYXRlZCcgc3RhdGUuCisJICovCisJaGRkTG9nKExPRzIsICJTZXQgS2V5IGNvbXBsZXRpb24gcm9hbVN0YXR1cyA9JWQgcm9hbVJlc3VsdD0lZCAiCisJCSAgTUFDX0FERFJFU1NfU1RSLCByb2FtU3RhdHVzLCByb2FtUmVzdWx0LAorCQkgIE1BQ19BRERSX0FSUkFZKHBSb2FtSW5mby0+cGVlck1hYy5ieXRlcykpOworCisJZkNvbm5lY3RlZCA9IGhkZF9jb25uX2dldF9jb25uZWN0ZWRfY2lwaGVyX2FsZ28ocEhkZFN0YUN0eCwKKwkJCQkJCSAgICZjb25uZWN0ZWRDaXBoZXJBbGdvKTsKKwlpZiAoZkNvbm5lY3RlZCkgeworCQlpZiAoV0xBTl9IRERfSUJTUyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHsKKwkJCXVpbnQ4X3Qgc3RhSWQ7CisKKwkJCWlmIChjZGZfaXNfbWFjYWRkcl9icm9hZGNhc3QoJnBSb2FtSW5mby0+cGVlck1hYykpIHsKKwkJCQlwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0KKwkJCQkJSEREX1JPQU1fU1RBVEVfTk9ORTsKKwkJCX0gZWxzZSB7CisJCQkJY2RmX3N0YXR1cyA9IGhkZF9pYnNzX2dldF9zdGFfaWQoCisJCQkJCQkJcEhkZFN0YUN0eCwKKwkJCQkJCQkmcFJvYW1JbmZvLT5wZWVyTWFjLAorCQkJCQkJCSZzdGFJZCk7CisJCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfc3RhdHVzKSB7CisJCQkJCWhkZExvZyhMT0cyLAorCQkJCQkJIldMQU4gVEwgU1RBIFB0ayBJbnN0YWxsZWQgZm9yIFNUQUlEPSVkIiwKKwkJCQkJCXN0YUlkKTsKKwkJCQkJcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1pbmdTdGF0ZSA9CisJCQkJCQlIRERfUk9BTV9TVEFURV9OT05FOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUT0RPOiBDb25zaWRlcmluZyBnZXR0aW5nIGEgc3RhdGUgbWFjaGluZSBpbgorCQkJICogSEREIGxhdGVyLiBUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCB0d2ljZS4KKwkJCSAqIDEpc2V0IFBUSyAyKXNldCBHVEsuCisJCQkgKiBUaGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCB3aWxsIGJlIHRydWUgd2hlbgorCQkJICogc2V0dGluZyBHVEsuIEF0IHRoaXMgdGltZSB3ZSBkb24ndCBoYW5kbGUgdGhlIHN0YXRlCisJCQkgKiBpbiBkZXRhaWwuIFJlbGF0ZWQgQ1I6IDE3NDA0OCAtIFRMIG5vdCBpbgorCQkJICogYXV0aGVudGljYXRlZCBzdGF0ZQorCQkJICovCisJCQljZGZfc3RhdHVzID0KKwkJCQloZGRfY2hhbmdlX3BlZXJfc3RhdGUocEFkYXB0ZXIsIHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFswXSwKKwkJCQkJCW9sX3R4cnhfcGVlcl9zdGF0ZV9hdXRoLAorI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJCQkJCXBSb2FtSW5mby0+cm9hbVN5bmNoSW5Qcm9ncmVzcworI2Vsc2UKKwkJCQkJCWZhbHNlCisjZW5kaWYKKwkJCQkJCSk7CisJCQloZGRfY29ubl9zZXRfYXV0aGVudGljYXRlZChwQWRhcHRlciwgdHJ1ZSk7CisJCQlpZiAoKGVDU1JfUk9BTV9SRVNVTFRfQVVUSEVOVElDQVRFRCA9PSByb2FtUmVzdWx0KSAmJgorCQkJICAgIChwUm9hbUluZm8gIT0gTlVMTCkgJiYgIXBSb2FtSW5mby0+ZkF1dGhSZXF1aXJlZCkgeworCQkJCWhkZExvZyhMT0czLAorCQkJCQkiS2V5IHNldCBmb3IgU3RhSWQ9ICVkLiBDaGFuZ2luZyBUTCBzdGF0ZSB0byBBVVRIRU5USUNBVEVEIiwKKwkJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdKTsKKworCQkJCS8qCisJCQkJICogQ29ubmVjdGlvbnMgdGhhdCBkbyBub3QgbmVlZCBVcHBlciBsYXllcgorCQkJCSAqIGF1dGhlbnRpY2F0aW9uLCB0cmFuc2l0aW9uIFRMIHRvCisJCQkJICogJ0F1dGhlbnRpY2F0ZWQnIHN0YXRlIGFmdGVyIHRoZSBrZXlzIGFyZSBzZXQuCisJCQkJICovCisJCQkJY2RmX3N0YXR1cyA9CisJCQkJCWhkZF9jaGFuZ2VfcGVlcl9zdGF0ZShwQWRhcHRlciwKKwkJCQkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFswXSwKKwkJCQkJCW9sX3R4cnhfcGVlcl9zdGF0ZV9hdXRoLAorI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJCQkJCXBSb2FtSW5mby0+cm9hbVN5bmNoSW5Qcm9ncmVzcworI2Vsc2UKKwkJCQkJCWZhbHNlCisjZW5kaWYKKwkJCQkJCSk7CisKKwkJCQloZGRfY29ubl9zZXRfYXV0aGVudGljYXRlZChwQWRhcHRlciwgdHJ1ZSk7CisJCQkJaWYgKChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09CisJCQkJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkJCQkJKFdMQU5fSEREX1AyUF9DTElFTlQgPT0KKwkJCQkJIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJCQkJc21lX3BzX2VuYWJsZV9hdXRvX3BzX3RpbWVyCisJCQkJCShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgcEhkZFN0YUN0eC0+aGRkX1JlYXNzb2NTY2VuYXJpbyk7CisJCQkJfQorCQkJfQorCisJCQlwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0KKwkJCQlIRERfUk9BTV9TVEFURV9OT05FOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogcG9zc2libGUgZGlzYXNzb2MgYWZ0ZXIgaXNzdWluZyBzZXQga2V5IGFuZCB3YWl0aW5nCisJCSAqIHNldCBrZXkgY29tcGxldGUuCisJCSAqLworCQlwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfTk9ORTsKKwl9CisKKwlFWElUKCk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBoZGRfcGVyZm9ybV9yb2FtX3NldF9rZXlfY29tcGxldGUoKSAtIHBlcmZvcm0gc2V0IGtleSBjb21wbGV0ZQorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfcGVyZm9ybV9yb2FtX3NldF9rZXlfY29tcGxldGUoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCXRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKwlyb2FtSW5mby5mQXV0aFJlcXVpcmVkID0gZmFsc2U7CisJY2RmX21lbV9jb3B5KHJvYW1JbmZvLmJzc2lkLmJ5dGVzLAorCQkgICAgIHBIZGRTdGFDdHgtPnJvYW1faW5mby5ic3NpZCwgQ0RGX01BQ19BRERSX1NJWkUpOworCWNkZl9tZW1fY29weShyb2FtSW5mby5wZWVyTWFjLmJ5dGVzLAorCQkgICAgIHBIZGRTdGFDdHgtPnJvYW1faW5mby5wZWVyTWFjLCBDREZfTUFDX0FERFJfU0laRSk7CisKKwljZGZfcmV0X3N0YXR1cyA9CisJCQloZGRfcm9hbV9zZXRfa2V5X2NvbXBsZXRlX2hhbmRsZXIocEFkYXB0ZXIsCisJCQkJCSAgICZyb2FtSW5mbywKKwkJCQkJICAgcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1JZCwKKwkJCQkJICAgcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1TdGF0dXMsCisJCQkJCSAgIGVDU1JfUk9BTV9SRVNVTFRfQVVUSEVOVElDQVRFRCk7CisJaWYgKGNkZl9yZXRfc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJaGRkTG9nKExPR0UsIEZMKCJTZXQgS2V5IGNvbXBsZXRlIGZhaWx1cmUiKSk7CisKKwlwSGRkU3RhQ3R4LT5yb2FtX2luZm8uZGVmZXJLZXlDb21wbGV0ZSA9IGZhbHNlOworfQorCisvKioKKyAqIGhkZF9hc3NvY2lhdGlvbl9jb21wbGV0aW9uX2hhbmRsZXIoKSAtIGFzc29jaWF0aW9uIGNvbXBsZXRpb24gaGFuZGxlcgorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IHBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKiBAcm9hbUlkOiByb2FtIGlkCisgKiBAcm9hbVN0YXR1czogcm9hbSBzdGF0dXMKKyAqIEByb2FtUmVzdWx0OiByb2FtIHJlc3VsdAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBoZGRfYXNzb2NpYXRpb25fY29tcGxldGlvbl9oYW5kbGVyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkJICAgICB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywKKwkJCQkJCSAgICAgdWludDMyX3Qgcm9hbUlkLAorCQkJCQkJICAgICBlUm9hbUNtZFN0YXR1cyByb2FtU3RhdHVzLAorCQkJCQkJICAgICBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwQWRhcHRlci0+ZGV2OworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXVpbnQ4X3QgcmVxUnNuSWVbRE9UMTFGX0lFX1JTTl9NQVhfTEVOXTsKKwl1aW50MzJfdCByZXFSc25MZW5ndGggPSBET1QxMUZfSUVfUlNOX01BWF9MRU47CisjaWYgIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKSB8fCBcCitkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKQorCWludCBmdF9jYXJyaWVyX29uID0gZmFsc2U7CisjZW5kaWYKKwlib29sIGhkZERpc2NvbkluUHJvZ3Jlc3MgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIHJjOworCisJaWYgKCFwSGRkQ3R4KSB7CisJCWhkZF9lcnIoIkhERCBjb250ZXh0IGlzIE5VTEwiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlpZiAocFJvYW1JbmZvICYmIHBSb2FtSW5mby0+cm9hbVN5bmNoSW5Qcm9ncmVzcykgeworCQkvKiBjaGFuZ2UgbG9nZ2luZyBiZWZvcmUgcmVsZWFzZSAqLworCQloZGRMb2coTE9HMywgIkxGUjM6aGRkX2Fzc29jaWF0aW9uX2NvbXBsZXRpb25faGFuZGxlciIpOworCX0KKyNlbmRpZgorCisJLyogSEREIGhhcyBpbml0aWF0ZWQgZGlzY29ubmVjdCwgZG8gbm90IHNlbmQgY29ubmVjdCByZXN1bHQgaW5kaWNhdGlvbgorCSAqIHRvIGtlcm5lbCBhcyBpdCB3aWxsIGJlIGhhbmRsZWQgYnkgX19jZmc4MDIxMV9kaXNjb25uZWN0LgorCSAqLworCWlmICgoZUNvbm5lY3Rpb25TdGF0ZV9EaXNjb25uZWN0aW5nID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpCisJICAgICYmICgoZUNTUl9ST0FNX1JFU1VMVF9BU1NPQ0lBVEVEID09IHJvYW1SZXN1bHQpCisJCXx8IChlQ1NSX1JPQU1fQVNTT0NJQVRJT05fRkFJTFVSRSA9PSByb2FtU3RhdHVzKSkpIHsKKwkJaGRkTG9nKExPRzEsIEZMKCJEaXNjb25uZWN0IGZyb20gSEREIGluIHByb2dyZXNzIikpOworCQloZGREaXNjb25JblByb2dyZXNzID0gdHJ1ZTsKKwl9CisKKwlpZiAoZUNTUl9ST0FNX1JFU1VMVF9BU1NPQ0lBVEVEID09IHJvYW1SZXN1bHQpIHsKKwkJaWYgKE5VTEwgPT0gcFJvYW1JbmZvKSB7CisJCQloZGRMb2coTE9HRSwgRkwoInBSb2FtSW5mbyBpcyBOVUxMIikpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCWlmICghaGRkRGlzY29uSW5Qcm9ncmVzcykgeworCQkJaGRkTG9nKExPRzEsIEZMKCJTZXQgSEREIGNvbm5TdGF0ZSB0byBlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQiKSk7CisJCQloZGRfY29ubl9zZXRfY29ubmVjdGlvbl9zdGF0ZShwQWRhcHRlciwKKwkJCQkJCSAgIGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCk7CisJCX0KKwkJLyogU2F2ZSB0aGUgY29ubmVjdGlvbiBpbmZvIGZyb20gQ1NSLi4uICovCisJCWhkZF9jb25uX3NhdmVfY29ubmVjdF9pbmZvKHBBZGFwdGVyLCBwUm9hbUluZm8sCisJCQkJCSAgIGVDU1JfQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJCWlmIChwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPkF1dGhUeXBlID09CisJCSAgICBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9DRVJUSUZJQ0FURQorCQkgICAgfHwgcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5BdXRoVHlwZSA9PQorCQkgICAgZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfUFNLKSB7CisJCQlwQWRhcHRlci0+d2FwaV9pbmZvLmZJc1dhcGlTdGEgPSAxOworCQl9IGVsc2UgeworCQkJcEFkYXB0ZXItPndhcGlfaW5mby5mSXNXYXBpU3RhID0gMDsKKwkJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKwkJLyogSW5kaWNhdGUgJ2Nvbm5lY3QnIHN0YXR1cyB0byB1c2VyIHNwYWNlICovCisJCWhkZF9zZW5kX2Fzc29jaWF0aW9uX2V2ZW50KGRldiwgcFJvYW1JbmZvKTsKKworCQlpZiAoY2RzX2lzX21jY19pbl8yNEcocEhkZEN0eCkpIHsKKwkJCWlmIChwSGRkQ3R4LT5taXJhY2FzdF92YWx1ZSkKKwkJCQljZHNfc2V0X21hcyhwQWRhcHRlciwgcEhkZEN0eC0+bWlyYWNhc3RfdmFsdWUpOworCQl9CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgTGlua3VwIGV2ZW50IGNvbXBsZXRpb24gdmFyaWFibGUgKi8KKwkJSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5saW5rdXBfZXZlbnRfdmFyKTsKKworCQkvKgorCQkgKiBTb21ldGltZXMgU3dpdGNoaW5nIE9OIHRoZSBDYXJyaWVyIGlzIHRha2luZyB0aW1lIHRvIGFjdGl2YXRlCisJCSAqIHRoZSBkZXZpY2UgcHJvcGVybHkuIEJlZm9yZSBhbGxvd2luZyBhbnkgcGFja2V0IHRvIGdvIHVwIHRvCisJCSAqIHRoZSBhcHBsaWNhdGlvbiwgZGV2aWNlIGFjdGl2YXRpb24gaGFzIHRvIGJlIGVuc3VyZWQgZm9yCisJCSAqIHByb3BlciBxdWV1ZSBtYXBwaW5nIGJ5IHRoZSBrZXJuZWwuIHdlIGhhdmUgcmVnaXN0ZXJlZCBuZXQKKwkJICogZGV2aWNlIG5vdGlmaWVyIGZvciBkZXZpY2UgY2hhbmdlIG5vdGlmaWNhdGlvbi4gV2l0aCB0aGlzIHdlCisJCSAqIHdpbGwgY29tZSB0byBrbm93IHRoYXQgdGhlIGRldmljZSBpcyBnZXR0aW5nCisJCSAqIGFjdGl2YXRlZCBwcm9wZXJseS4KKwkJICovCisjaWYgIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgXAorZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCQlpZiAocEhkZFN0YUN0eC0+ZnRfY2Fycmllcl9vbiA9PSBmYWxzZSkgeworI2VuZGlmCisJCS8qCisJCSAqIEVuYWJsZSBMaW5rdXAgRXZlbnQgU2VydmljaW5nIHdoaWNoIGFsbG93cyB0aGUgbmV0IGRldmljZQorCQkgKiBub3RpZmllciB0byBzZXQgdGhlIGxpbmt1cCBldmVudCB2YXJpYWJsZS4KKwkJICovCisJCXBBZGFwdGVyLT5pc0xpbmtVcFN2Y05lZWRlZCA9IHRydWU7CisKKwkJLyoKKwkJICogRW5hYmxlIExpbmt1cCBFdmVudCBTZXJ2aWNpbmcgd2hpY2ggYWxsb3dzIHRoZSBuZXQgZGV2aWNlCisJCSAqIG5vdGlmaWVyIHRvIHNldCB0aGUgbGlua3VwIGV2ZW50IHZhcmlhYmxlLgorCQkgKi8KKwkJcEFkYXB0ZXItPmlzTGlua1VwU3ZjTmVlZGVkID0gdHJ1ZTsKKworCQkvKiBTd2l0Y2ggb24gdGhlIENhcnJpZXIgdG8gYWN0aXZhdGUgdGhlIGRldmljZSAqLworCQl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLCBXTEFOX05FVElGX0NBUlJJRVJfT04sCisJCQkJCSAgIFdMQU5fQ09OVFJPTF9QQVRIKTsKKworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgTGluayB0byB1cCB0byBlbnN1cmUgYWxsIHRoZSBxdWV1ZXMgYXJlIHNldAorCQkgKiBwcm9wZXJseSBieSB0aGUga2VybmVsLgorCQkgKi8KKwkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnBBZGFwdGVyLT4KKwkJCQkJCSBsaW5rdXBfZXZlbnRfdmFyLAorCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCSAoQVNTT0NfTElOS1VQX1RJTUVPVVQpKTsKKwkJaWYgKCFyYykKKwkJCWhkZExvZyhMT0dXLCBGTCgiV2FybmluZzpBU1NPQ19MSU5LVVBfVElNRU9VVCIpKTsKKworCQkvKgorCQkgKiBEaXNhYmxlIExpbmt1cCBFdmVudCBTZXJ2aWNpbmcgLSBubyBtb3JlIHNlcnZpY2UgcmVxdWlyZWQKKwkJICogZnJvbSB0aGUgbmV0IGRldmljZSBub3RpZmllciBjYWxsLgorCQkgKi8KKwkJcEFkYXB0ZXItPmlzTGlua1VwU3ZjTmVlZGVkID0gZmFsc2U7CisjaWYgIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgXAorZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCX0gZWxzZSB7CisJCXBIZGRTdGFDdHgtPmZ0X2NhcnJpZXJfb24gPSBmYWxzZTsKKwkJZnRfY2Fycmllcl9vbiA9IHRydWU7CisJfQorI2VuZGlmCisJCWlmICgoV0xBTl9NQVhfU1RBX0NPVU5UICsgMykgPiBwUm9hbUluZm8tPnN0YUlkKQorCQkJcEhkZEN0eC0+c3RhX3RvX2FkYXB0ZXJbcFJvYW1JbmZvLT5zdGFJZF0gPSBwQWRhcHRlcjsKKwkJZWxzZQorCQkJaGRkTG9nKExPR0UsICIlczogV3JvbmcgU3RhaWQ6ICVkIiwgX19mdW5jX18sCisJCQkJCQlwUm9hbUluZm8tPnN0YUlkKTsKKworCQlwSGRkQ3R4LT5zdGFfdG9fYWRhcHRlcltwUm9hbUluZm8tPnN0YUlkXSA9IHBBZGFwdGVyOworCisJCWlmIChoZGRfaXBhX2lzX2VuYWJsZWQocEhkZEN0eCkpCisJCQloZGRfaXBhX3dsYW5fZXZ0KHBBZGFwdGVyLCBwUm9hbUluZm8tPnN0YUlkLAorCQkJCQkgV0xBTl9TVEFfQ09OTkVDVCwKKwkJCQkJIHBSb2FtSW5mby0+YnNzaWQuYnl0ZXMpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKwkJd2xhbl9oZGRfYXV0b19zaHV0ZG93bl9lbmFibGUocEhkZEN0eCwgZmFsc2UpOworI2VuZGlmCisKKwkJY2RzX2NoZWNrX2NvbmN1cnJlbnRfaW50Zl9hbmRfcmVzdGFydF9zYXAocEhkZEN0eCwKKwkJCQkJCQkgIHBIZGRTdGFDdHgsCisJCQkJCQkJICBwQWRhcHRlcik7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCQl3bGFuX2hkZF90ZGxzX2Nvbm5lY3Rpb25fY2FsbGJhY2socEFkYXB0ZXIpOworI2VuZGlmCisKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisJCS8qIFNUQSBBc3NvY2lhdGVkLCB1cGRhdGUgaW50byB0cmFjZSBidWZmZXIgKi8KKwkJaWYgKHBIZGRDdHgtPmNvbmZpZy0+Z0VuYWJsZURlYnVnTG9nKQorCQkJY2RzX3BrdF90cmFjZV9idWZfdXBkYXRlKCJTVDpBU1NPQyIpOworI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKwkJLyoKKwkJICogRm9yIHJlYXNzb2MsIHRoZSBzdGF0aW9uIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgYWxsIHdlIG5lZWQKKwkJICogaXMgdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgU1RBIGluIFRMLgorCQkgKiBJZiBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCAoV1BBL1dQQTIvRFdFUCksIGNoYW5nZSBUTCB0bworCQkgKiBDT05ORUNURUQgaW5zdGVhZCBvZiBBVVRIRU5USUNBVEVELgorCQkgKi8KKwkJaWYgKCFwUm9hbUluZm8tPmZSZWFzc29jUmVxKSB7CisJCQlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJCXU4ICpwRlRBc3NvY1JzcCA9IE5VTEw7CisJCQl1bnNpZ25lZCBpbnQgYXNzb2NSc3BsZW4gPSAwOworCQkJdTggKnBGVEFzc29jUmVxID0gTlVMTDsKKwkJCXVuc2lnbmVkIGludCBhc3NvY1JlcWxlbiA9IDA7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisjZW5kaWYKKwkJCXVpbnQ4X3QgcnNwUnNuSWVbRE9UMTFGX0lFX1JTTl9NQVhfTEVOXTsKKwkJCXVpbnQzMl90IHJzcFJzbkxlbmd0aCA9IERPVDExRl9JRV9SU05fTUFYX0xFTjsKKworCQkJLyogYWRkIGJzc19pZCB0byBjZmc4MDIxMSBkYXRhIGJhc2UgKi8KKwkJCWJzcyA9CisJCQkJd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Jzc19kYihwQWRhcHRlciwKKwkJCQkJCQkJcFJvYW1JbmZvKTsKKwkJCWlmIChOVUxMID09IGJzcykgeworCQkJCXByX2Vycigid2xhbjogTm90IGFibGUgdG8gY3JlYXRlIEJTUyBlbnRyeVxuIik7CisJCQkJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChwQWRhcHRlciwKKwkJCQkJV0xBTl9ORVRJRl9DQVJSSUVSX09GRiwKKwkJCQkJV0xBTl9DT05UUk9MX1BBVEgpOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQkJaWYgKHBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZS0+QXV0aFR5cGUgPT0KKwkJCSAgICBlQ1NSX0FVVEhfVFlQRV9GVF9SU04KKwkJCSAgICB8fCBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPkF1dGhUeXBlID09CisJCQkgICAgZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSykgeworCisJCQkJLyogQXNzb2NpYXRpb24gUmVzcG9uc2UgKi8KKwkJCQlwRlRBc3NvY1JzcCA9CisJCQkJCSh1OCAqKSAocFJvYW1JbmZvLT5wYkZyYW1lcyArCisJCQkJCQlwUm9hbUluZm8tPm5CZWFjb25MZW5ndGggKworCQkJCQkJcFJvYW1JbmZvLT5uQXNzb2NSZXFMZW5ndGgpOworCQkJCWlmIChwRlRBc3NvY1JzcCAhPSBOVUxMKSB7CisJCQkJCS8qCisJCQkJCSAqIHBGVEFzc29jUnNwIG5lZWRzIHRvIHBvaW50IHRvIHRoZSBJRXMKKwkJCQkJICovCisJCQkJCXBGVEFzc29jUnNwICs9IEZUX0FTU09DX1JTUF9JRVNfT0ZGU0VUOworCQkJCQloZGRMb2coTE9HMSwKKwkJCQkJICAgICAgIEZMKCJBc3NvY1JzcCBpcyBub3cgYXQgJTAyeCUwMngiKSwKKwkJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpcEZUQXNzb2NSc3BbMF0sCisJCQkJCSAgICAgICAodW5zaWduZWQgaW50KXBGVEFzc29jUnNwWzFdKTsKKwkJCQkJYXNzb2NSc3BsZW4gPQorCQkJCQkJcFJvYW1JbmZvLT5uQXNzb2NSc3BMZW5ndGggLQorCQkJCQkJRlRfQVNTT0NfUlNQX0lFU19PRkZTRVQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJaGRkTG9nKExPR0UsIEZMKCJBc3NvY1JzcCBpcyBOVUxMIikpOworCQkJCQlhc3NvY1JzcGxlbiA9IDA7CisJCQkJfQorCisJCQkJLyogQXNzb2NpYXRpb24gUmVxdWVzdCAqLworCQkJCXBGVEFzc29jUmVxID0gKHU4ICopIChwUm9hbUluZm8tPnBiRnJhbWVzICsKKwkJCQkJCSAgICAgIHBSb2FtSW5mby0+bkJlYWNvbkxlbmd0aCk7CisJCQkJaWYgKHBGVEFzc29jUmVxICE9IE5VTEwpIHsKKwkJCQkJaWYgKCFmdF9jYXJyaWVyX29uKSB7CisJCQkJCQkvKgorCQkJCQkJICogcEZUQXNzb2NSZXEgbmVlZHMgdG8gcG9pbnQgdG8KKwkJCQkJCSAqIHRoZSBJRXMKKwkJCQkJCSAqLworCQkJCQkJcEZUQXNzb2NSZXEgKz0KKwkJCQkJCQlGVF9BU1NPQ19SRVFfSUVTX09GRlNFVDsKKwkJCQkJCWhkZExvZyhMT0cxLAorCQkJCQkJCUZMKCJwRlRBc3NvY1JlcSBpcyBub3cgYXQgJTAyeCUwMngiKSwKKwkJCQkJCSAgICAgICAodW5zaWduZWQgaW50KQorCQkJCQkJICAgICAgIHBGVEFzc29jUmVxWzBdLAorCQkJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpCisJCQkJCQkgICAgICAgcEZUQXNzb2NSZXFbMV0pOworCQkJCQkJYXNzb2NSZXFsZW4gPQorCQkJCQkJICAgIHBSb2FtSW5mby0+bkFzc29jUmVxTGVuZ3RoIC0KKwkJCQkJCQlGVF9BU1NPQ19SRVFfSUVTX09GRlNFVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBUaGlzIHNob3VsZCBjb250YWluIG9ubHkgdGhlCisJCQkJCQkgKiBGVElFcworCQkJCQkJICovCisJCQkJCQlhc3NvY1JlcWxlbiA9CisJCQkJCQkgICAgcFJvYW1JbmZvLT5uQXNzb2NSZXFMZW5ndGg7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQloZGRMb2coTE9HRSwgRkwoIkFzc29jUmVxIGlzIE5VTEwiKSk7CisJCQkJCWFzc29jUmVxbGVuID0gMDsKKwkJCQl9CisKKwkJCQlpZiAoZnRfY2Fycmllcl9vbikgeworCQkJCQlpZiAoIWhkZERpc2NvbkluUHJvZ3Jlc3MpIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBBZnRlciByb2FtaW5nIGlzIGNvbXBsZXRlZCwKKwkJCQkJCSAqIGFjdGl2ZSBzZXNzaW9uIGNvdW50IGlzCisJCQkJCQkgKiBpbmNyZW1lbnRlZCBhcyBhIHBhcnQgb2YKKwkJCQkJCSAqIGNvbm5lY3QgaW5kaWNhdGlvbiBidXQKKwkJCQkJCSAqIGVmZmVjdGl2ZWx5IHRoZSBhY3RpdmUKKwkJCQkJCSAqIHNlc3Npb24gY291bnQgc2hvdWxkIHN0aWxsCisJCQkJCQkgKiBiZSB0aGUgc2FtZSBhbmQgaGVuY2UgdXBvbgorCQkJCQkJICogc3VjY2Vzc2Z1bCByZWFzc29jCisJCQkJCQkgKiBkZWNyZW1lbnQgdGhlIGFjdGl2ZSBzZXNzaW9uCisJCQkJCQkgKiBjb3VudCBoZXJlLgorCQkJCQkJICovCisJCQkJCQljZHNfZGVjcl9zZXNzaW9uX3NldF9wY2wKKwkJCQkJCQkocEhkZEN0eCwKKwkJCQkJCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJCQkJcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCQkJCQloZGRMb2coTE9HMSwKKwkJCQkJCSAgICAgICBGTCgiZnRfY2Fycmllcl9vbiBpcyAlZCwgc2VuZGluZyByb2FtZWQgaW5kaWNhdGlvbiIpLAorCQkJCQkJICAgICAgIGZ0X2NhcnJpZXJfb24pOworCQkJCQkJY2hhbiA9CisJCQkJCQkJaWVlZTgwMjExX2dldF9jaGFubmVsCisJCQkJCQkJCShwQWRhcHRlci0+d2Rldi53aXBoeSwKKwkJCQkJCQkJKGludClwUm9hbUluZm8tPnBCc3NEZXNjLT4KKwkJCQkJCQkJY2hhbm5lbElkKTsKKwkJCQkJCWhkZExvZyhMT0cxLAorCQkJCQkJICAgICAgICJhc3NvY1JlcWxlbiAlZCBhc3NvY1JzcGxlbiAlZCIsCisJCQkJCQkgICAgICAgYXNzb2NSZXFsZW4sCisJCQkJCQkgICAgICAgYXNzb2NSc3BsZW4pOworCQkJCQkJY2ZnODAyMTFfcm9hbWVkKGRldiwgY2hhbiwKKwkJCQkJCQkJcFJvYW1JbmZvLT4KKwkJCQkJCQkJYnNzaWQuYnl0ZXMsCisJCQkJCQkJCXBGVEFzc29jUmVxLAorCQkJCQkJCQlhc3NvY1JlcWxlbiwKKwkJCQkJCQkJcEZUQXNzb2NSc3AsCisJCQkJCQkJCWFzc29jUnNwbGVuLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQkJCWlmIChwUm9hbUluZm8tPnJvYW1TeW5jaEluUHJvZ3Jlc3MpCisJCQkJCQkJd2xhbl9oZGRfc2VuZF9yb2FtX2F1dGhfZXZlbnQoCisJCQkJCQkJIHBIZGRDdHgsCisJCQkJCQkJIHBSb2FtSW5mby0+YnNzaWQuYnl0ZXMsCisJCQkJCQkJIHBGVEFzc29jUmVxLAorCQkJCQkJCSBhc3NvY1JlcWxlbiwKKwkJCQkJCQkgcEZUQXNzb2NSc3AsCisJCQkJCQkJIGFzc29jUnNwbGVuLAorCQkJCQkJCSBwUm9hbUluZm8pOworCQkJCQl9CisJCQkJCWlmIChzbWVfZ2V0X2Z0cHRrX3N0YXRlCisJCQkJCQkgICAgKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJCSAgICBwQWRhcHRlci0+c2Vzc2lvbklkKSkgeworCQkJCQkJc21lX3NldF9mdHB0a19zdGF0ZQorCQkJCQkJCShXTEFOX0hERF9HRVRfSEFMX0NUWAorCQkJCQkJCQkocEFkYXB0ZXIpLAorCQkJCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkJZmFsc2UpOworCQkJCQkJcFJvYW1JbmZvLT5mQXV0aFJlcXVpcmVkID0KKwkJCQkJCQlmYWxzZTsKKworCQkJCQkJY2RmX21lbV9jb3B5KHBIZGRTdGFDdHgtPgorCQkJCQkJCSAgICAgcm9hbV9pbmZvLmJzc2lkLAorCQkJCQkJCSAgICAgcFJvYW1JbmZvLT5ic3NpZC5ieXRlcywKKwkJCQkJCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKwkJCQkJCWNkZl9tZW1fY29weShwSGRkU3RhQ3R4LT4KKwkJCQkJCQkgICAgIHJvYW1faW5mby5wZWVyTWFjLAorCQkJCQkJCSAgICAgcFJvYW1JbmZvLT5wZWVyTWFjLmJ5dGVzLAorCQkJCQkJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCQkJCQkJcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1JZCA9CisJCQkJCQkJcm9hbUlkOworCQkJCQkJcEhkZFN0YUN0eC0+cm9hbV9pbmZvLgorCQkJCQkJcm9hbVN0YXR1cyA9IHJvYW1TdGF0dXM7CisJCQkJCQlwSGRkU3RhQ3R4LT5yb2FtX2luZm8uCisJCQkJCQlkZWZlcktleUNvbXBsZXRlID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoIWhkZERpc2NvbkluUHJvZ3Jlc3MpIHsKKwkJCQkJaGRkTG9nKExPRzEsCisJCQkJCSAgICAgICBGTCgiZnRfY2Fycmllcl9vbiBpcyAlZCwgc2VuZGluZyBjb25uZWN0IGluZGljYXRpb24iKSwKKwkJCQkJICAgICAgIGZ0X2NhcnJpZXJfb24pOworCQkJCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChkZXYsCisJCQkJCQkJCXBSb2FtSW5mby0+CisJCQkJCQkJCWJzc2lkLmJ5dGVzLAorCQkJCQkJCQlwRlRBc3NvY1JlcSwKKwkJCQkJCQkJYXNzb2NSZXFsZW4sCisJCQkJCQkJCXBGVEFzc29jUnNwLAorCQkJCQkJCQlhc3NvY1JzcGxlbiwKKwkJCQkJCQkJV0xBTl9TVEFUVVNfU1VDQ0VTUywKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQkJfQorCQkJfSBlbHNlCisjZW5kaWYKKwkJCXsKKwkJCQkvKgorCQkJCSAqIHdwYSBzdXBwbGljYW50IGV4cGVjdGluZyBXUEEvUlNOIElFIGluCisJCQkJICogY29ubmVjdCByZXN1bHQuCisJCQkJICovCisJCQkJY3NyX3JvYW1fZ2V0X3dwYV9yc25fcmVxX2llKFdMQU5fSEREX0dFVF9IQUxfQ1RYCisJCQkJCQkJCSAgICAocEFkYXB0ZXIpLAorCQkJCQkJCSAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJCSAgICAmcmVxUnNuTGVuZ3RoLAorCQkJCQkJCSAgICByZXFSc25JZSk7CisKKwkJCQljc3Jfcm9hbV9nZXRfd3BhX3Jzbl9yc3BfaWUoV0xBTl9IRERfR0VUX0hBTF9DVFgKKwkJCQkJCQkJICAgIChwQWRhcHRlciksCisJCQkJCQkJICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkJICAgICZyc3BSc25MZW5ndGgsCisJCQkJCQkJICAgIHJzcFJzbkllKTsKKwkJCQlpZiAoIWhkZERpc2NvbkluUHJvZ3Jlc3MpIHsKKyNpZiAgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJCQkJCWlmIChmdF9jYXJyaWVyX29uKQorCQkJCQkJaGRkX3NlbmRfcmVfYXNzb2NfZXZlbnQoZGV2LAorCQkJCQkJCQkJcEFkYXB0ZXIsCisJCQkJCQkJCQlwUm9hbUluZm8sCisJCQkJCQkJCQlyZXFSc25JZSwKKwkJCQkJCQkJCXJlcVJzbkxlbmd0aCk7CisJCQkJCWVsc2UKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICovCisKKwkJCQkJeworCQkJCQkJaGRkTG9nKExPRzEsCisJCQkJCQkgICAgICAgRkwoInNlbmRpbmcgY29ubmVjdCBpbmRpY2F0aW9uIHRvIG5sODAyMTE6Zm9yIGJzc2lkICIKKwkJCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIKKwkJCQkJCSAgICAgICAiIHJlYXNvbjolZCBhbmQgU3RhdHVzOiVkIiksCisJCQkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkKKwkJCQkJCQkgICAgICAgKHBSb2FtSW5mby0+YnNzaWQuYnl0ZXMpLAorCQkJCQkJICAgICAgIHJvYW1SZXN1bHQsIHJvYW1TdGF0dXMpOworCisJCQkJCQkvKiBpbmZvcm0gY29ubmVjdCByZXN1bHQgdG8gbmw4MDIxMSAqLworCQkJCQkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQoZGV2LAorCQkJCQkJCQkJcFJvYW1JbmZvLT4KKwkJCQkJCQkJCWJzc2lkLmJ5dGVzLAorCQkJCQkJCQkJcmVxUnNuSWUsCisJCQkJCQkJCQlyZXFSc25MZW5ndGgsCisJCQkJCQkJCQlyc3BSc25JZSwKKwkJCQkJCQkJCXJzcFJzbkxlbmd0aCwKKwkJCQkJCQkJCVdMQU5fU1RBVFVTX1NVQ0NFU1MsCisJCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICghaGRkRGlzY29uSW5Qcm9ncmVzcykgeworCQkJCWNmZzgwMjExX3B1dF9ic3MoCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA5LCAwKSkKKwkJCQkJcEhkZEN0eC0+d2lwaHksCisjZW5kaWYKKwkJCQkJYnNzKTsKKworCQkJCS8qCisJCQkJICogUGVyZm9ybSBhbnkgV01NLXJlbGF0ZWQgYXNzb2NpYXRpb24KKwkJCQkgKiBwcm9jZXNzaW5nLgorCQkJCSAqLworCQkJCWhkZF93bW1fYXNzb2MocEFkYXB0ZXIsIHBSb2FtSW5mbywKKwkJCQkJICAgICAgZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSk7CisKKwkJCQkvKgorCQkJCSAqIFN0YXJ0IHRoZSBRdWV1ZSAtIFN0YXJ0IHR4IHF1ZXVlcyBiZWZvcmUKKwkJCQkgKiBoZGRfcm9hbV9yZWdpc3Rlcl9zdGEsIHNpbmNlCisJCQkJICogaGRkX3JvYW1fcmVnaXN0ZXJfc3RhIHdpbGwgZmx1c2ggYW55IGNhY2hlZAorCQkJCSAqIGRhdGEgZnJhbWVzIGltbWVkaWF0ZWx5LgorCQkJCSAqLworCQkJCWhkZExvZyhMT0cxLCBGTCgiRW5hYmxpbmcgcXVldWVzIikpOworCQkJCXdsYW5faGRkX25ldGlmX3F1ZXVlX2NvbnRyb2wocEFkYXB0ZXIsCisJCQkJCQlXTEFOX1dBS0VfQUxMX05FVElGX1FVRVVFLAorCQkJCQkJV0xBTl9DT05UUk9MX1BBVEgpOworCisJCQkJLyoKKwkJCQkgKiBSZWdpc3RlciB0aGUgU3RhdGlvbiB3aXRoIFRMIGFmdGVyIGFzc29jaWF0ZWQKKwkJCQkgKi8KKwkJCQljZGZfc3RhdHVzID0gaGRkX3JvYW1fcmVnaXN0ZXJfc3RhKHBBZGFwdGVyLAorCQkJCQkJCQkgICBwUm9hbUluZm8sCisJCQkJCQkJCSAgIHBIZGRTdGFDdHgtPgorCQkJCQkJCQkgICBjb25uX2luZm8uCisJCQkJCQkJCSAgIHN0YUlkWzBdLAorCQkJCQkJCQkgICBOVUxMLAorCQkJCQkJCQkgICBwUm9hbUluZm8tPgorCQkJCQkJCQkgICBwQnNzRGVzYyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogd3BhIHN1cHBsaWNhbnQgZXhwZWN0aW5nIFdQQS9SU04gSUUgaW4gY29ubmVjdCByZXN1bHQKKwkJCSAqIGluIGNhc2Ugb2YgcmVhc3NvY2lhdGlvbiBhbHNvIG5lZWQgdG8gaW5kaWNhdGUgaXQgdG8KKwkJCSAqIHN1cHBsaWNhbnQuCisJCQkgKi8KKwkJCWNzcl9yb2FtX2dldF93cGFfcnNuX3JlcV9pZSgKKwkJCQkJCVdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkmcmVxUnNuTGVuZ3RoLCByZXFSc25JZSk7CisKKwkJCWhkZF9zZW5kX3JlX2Fzc29jX2V2ZW50KGRldiwgcEFkYXB0ZXIsIHBSb2FtSW5mbywKKwkJCQkJCXJlcVJzbkllLCByZXFSc25MZW5ndGgpOworCQkJLyogUmVhc3NvYyBzdWNjZXNzZnVsbHkgKi8KKwkJCWlmIChwUm9hbUluZm8tPmZBdXRoUmVxdWlyZWQpIHsKKwkJCQljZGZfc3RhdHVzID0KKwkJCQkJaGRkX2NoYW5nZV9wZWVyX3N0YXRlKHBBZGFwdGVyLAorCQkJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdLAorCQkJCQkJb2xfdHhyeF9wZWVyX3N0YXRlX2Nvbm4sCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQkJCQkJcFJvYW1JbmZvLT5yb2FtU3luY2hJblByb2dyZXNzCisjZWxzZQorCQkJCQkJZmFsc2UKKyNlbmRpZgorCQkJCQkJKTsKKwkJCQloZGRfY29ubl9zZXRfYXV0aGVudGljYXRlZChwQWRhcHRlciwgZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQloZGRMb2coTE9HMiwKKwkJCQkJRkwoInN0YUlkOiAlZCBDaGFuZ2luZyBUTCBzdGF0ZSB0byBBVVRIRU5USUNBVEVEIiksCisJCQkJCSAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdKTsKKwkJCQljZGZfc3RhdHVzID0KKwkJCQkJaGRkX2NoYW5nZV9wZWVyX3N0YXRlKHBBZGFwdGVyLAorCQkJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdLAorCQkJCQkJb2xfdHhyeF9wZWVyX3N0YXRlX2F1dGgsCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQkJCQkJcFJvYW1JbmZvLT5yb2FtU3luY2hJblByb2dyZXNzCisjZWxzZQorCQkJCQkJZmFsc2UKKyNlbmRpZgorCQkJCQkJKTsKKwkJCQloZGRfY29ubl9zZXRfYXV0aGVudGljYXRlZChwQWRhcHRlciwgdHJ1ZSk7CisJCQl9CisKKwkJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCQkvKgorCQkJCSAqIFBlcmZvcm0gYW55IFdNTS1yZWxhdGVkIGFzc29jaWF0aW9uCisJCQkJICogcHJvY2Vzc2luZworCQkJCSAqLworCQkJCWhkZF93bW1fYXNzb2MocEFkYXB0ZXIsIHBSb2FtSW5mbywKKwkJCQkJICAgICAgZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSk7CisJCQl9CisKKwkJCS8qIFN0YXJ0IHRoZSB0eCBxdWV1ZXMgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJCQlpZiAocFJvYW1JbmZvLT5yb2FtU3luY2hJblByb2dyZXNzKQorCQkJCWhkZExvZyhMT0czLCAiTEZSMzpuZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMiKTsKKyNlbmRpZgorCQkJaGRkTG9nKExPRzEsIEZMKCJFbmFibGluZyBxdWV1ZXMiKSk7CisJCQl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLAorCQkJCQkJICAgV0xBTl9XQUtFX0FMTF9ORVRJRl9RVUVVRSwKKwkJCQkJCSAgIFdMQU5fQ09OVFJPTF9QQVRIKTsKKwkJfQorCisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQkiU1RBIHJlZ2lzdGVyIHdpdGggVEwgZmFpbGVkLiBzdGF0dXMoPSVkKSBbJTA4WF0iLAorCQkJCWNkZl9zdGF0dXMsIGNkZl9zdGF0dXMpOworCQl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQljZGZfbWVtX3plcm8oJnBBZGFwdGVyLT5oZGRfc3RhdHMuaGRkUG1mU3RhdHMsCisJCQkgICAgIHNpemVvZihwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFBtZlN0YXRzKSk7CisjZW5kaWYKKwl9IGVsc2UgeworCQloZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0KKwkJCVdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisJCWlmIChwUm9hbUluZm8pCisJCQlwcl9pbmZvKCJ3bGFuOiBjb25uZWN0aW9uIGZhaWxlZCB3aXRoICIgTUFDX0FERFJFU1NfU1RSCisJCQkJIiByZWFzb246JWQgYW5kIFN0YXR1czolZFxuIiwKKwkJCQlNQUNfQUREUl9BUlJBWShwUm9hbUluZm8tPmJzc2lkLmJ5dGVzKSwKKwkJCQlyb2FtUmVzdWx0LCByb2FtU3RhdHVzKTsKKwkJZWxzZQorCQkJcHJfaW5mbygid2xhbjogY29ubmVjdGlvbiBmYWlsZWQgd2l0aCAiIE1BQ19BRERSRVNTX1NUUgorCQkJCSIgcmVhc29uOiVkIGFuZCBTdGF0dXM6JWRcbiIsCisJCQkJTUFDX0FERFJfQVJSQVkocFdleHRTdGF0ZS0+cmVxX2Jzc0lkLmJ5dGVzKSwKKwkJCQlyb2FtUmVzdWx0LCByb2FtU3RhdHVzKTsKKworCQkvKgorCQkgKiBDUjQ2NTQ3ODogT25seSBzZW5kIHVwIGEgY29ubmVjdGlvbiBmYWlsdXJlIHJlc3VsdCB3aGVuIENTUgorCQkgKiBoYXMgY29tcGxldGVkIG9wZXJhdGlvbiAtIHdpdGggYSBBU1NPQ0lBVElPTl9GQUlMVVJFIHN0YXR1cy4KKwkJICovCisJCWlmIChlQ1NSX1JPQU1fQVNTT0NJQVRJT05fRkFJTFVSRSA9PSByb2FtU3RhdHVzCisJCSAgICAmJiAhaGRkRGlzY29uSW5Qcm9ncmVzcykgeworCQkJaWYgKHBSb2FtSW5mbykKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoInNlbmQgY29ubmVjdCBmYWlsdXJlIHRvIG5sODAyMTE6IGZvciBic3NpZCAiCisJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUgorCQkJCSAgICAgICAiIHJlYXNvbjolZCBhbmQgU3RhdHVzOiVkICIpLAorCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwUm9hbUluZm8tPmJzc2lkLmJ5dGVzKSwKKwkJCQkgICAgICAgcm9hbVJlc3VsdCwgcm9hbVN0YXR1cyk7CisJCQllbHNlCisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKCJjb25uZWN0IGZhaWxlZDogZm9yIGJzc2lkICIKKwkJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSCisJCQkJICAgICAgICIgcmVhc29uOiVkIGFuZCBTdGF0dXM6JWQgIiksCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBXZXh0U3RhdGUtPnJlcV9ic3NJZC5ieXRlcyksCisJCQkJICAgICAgIHJvYW1SZXN1bHQsIHJvYW1TdGF0dXMpOworCisJCQloZGRfY2xlYXJfcm9hbV9wcm9maWxlX2llKHBBZGFwdGVyKTsKKworCQkJLyogaW5mb3JtIGFzc29jaWF0aW9uIGZhaWx1cmUgZXZlbnQgdG8gbmw4MDIxMSAqLworCQkJaWYgKGVDU1JfUk9BTV9SRVNVTFRfQVNTT0NfRkFJTF9DT05fQ0hBTk5FTCA9PQorCQkJICAgIHJvYW1SZXN1bHQpIHsKKwkJCQlpZiAocFJvYW1JbmZvKQorCQkJCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChkZXYsCisJCQkJCQlwUm9hbUluZm8tPmJzc2lkLmJ5dGVzLAorCQkJCQkJTlVMTCwgMCwgTlVMTCwgMCwKKwkJCQkJCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9VTlNQRUMsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQllbHNlCisJCQkJCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KGRldiwKKwkJCQkJCXBXZXh0U3RhdGUtPnJlcV9ic3NJZC5ieXRlcywKKwkJCQkJCU5VTEwsIDAsIE5VTEwsIDAsCisJCQkJCQlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfVU5TUEVDLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChwUm9hbUluZm8pIHsKKwkJCQkJZUNzckF1dGhUeXBlIGF1dGhUeXBlID0KKwkJCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkF1dGhUeXBlLgorCQkJCQkJYXV0aFR5cGVbMF07CisJCQkJCWJvb2wgaXNXZXAgPQorCQkJCQkJKGF1dGhUeXBlID09CisJCQkJCQkgZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0pCisJCQkJCQl8fCAoYXV0aFR5cGUgPT0KKwkJCQkJCSAgICBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZKTsKKworCQkJCQkvKgorCQkJCQkgKiBJbiBjYXNlIG9mIE9QRU4tV0VQIG9yIFNIQVJFRC1XRVAKKwkJCQkJICogYXV0aGVudGljYXRpb24sIHNlbmQgZXhhY3QgcHJvdG9jb2wKKwkJCQkJICogcmVhc29uIGNvZGUuIFRoaXMgZW5hYmxlcyB1c2VyCisJCQkJCSAqIGFwcGxpY2F0aW9ucyB0byByZWNvbm5lY3QgdGhlIHN0YXRpb24KKwkJCQkJICogd2l0aCBjb3JyZWN0IGNvbmZpZ3VyYXRpb24uCisJCQkJCSAqLworCQkJCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChkZXYsCisJCQkJCQlwUm9hbUluZm8tPmJzc2lkLmJ5dGVzLCBOVUxMLCAwLAorCQkJCQkJTlVMTCwgMCwKKwkJCQkJCWlzV2VwID8gcFJvYW1JbmZvLT5yZWFzb25Db2RlIDoKKwkJCQkJCVdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQl9IGVsc2UKKwkJCQkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQoZGV2LAorCQkJCQkJcFdleHRTdGF0ZS0+cmVxX2Jzc0lkLmJ5dGVzLAorCQkJCQkJTlVMTCwgMCwgTlVMTCwgMCwKKwkJCQkJCVdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCX0KKwkJfQorCisJCWlmIChwUm9hbUluZm8pIHsKKwkJCWlmICgoZVNJUl9TTUVfSk9JTl9USU1FT1VUX1JFU1VMVF9DT0RFID09CisJCQkgICAgIHBSb2FtSW5mby0+c3RhdHVzQ29kZSkKKwkJCSAgICB8fCAoZVNJUl9TTUVfQVVUSF9USU1FT1VUX1JFU1VMVF9DT0RFID09CisJCQkJcFJvYW1JbmZvLT5zdGF0dXNDb2RlKQorCQkJICAgIHx8IChlU0lSX1NNRV9BU1NPQ19USU1FT1VUX1JFU1VMVF9DT0RFID09CisJCQkJcFJvYW1JbmZvLT5zdGF0dXNDb2RlKSkgeworCQkJCXdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9ic3NfbGlzdChwQWRhcHRlciwKKwkJCQkJCQkJICBwUm9hbUluZm8pOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogU2V0IGNvbm5lY3Rpb24gc3RhdGUgdG8gZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQgb25seQorCQkgKiB3aGVuIENTUiBoYXMgY29tcGxldGVkIG9wZXJhdGlvbiAtIHdpdGggYQorCQkgKiBBU1NPQ0lBVElPTl9GQUlMVVJFIHN0YXR1cy4KKwkJICovCisJCWlmIChlQ1NSX1JPQU1fQVNTT0NJQVRJT05fRkFJTFVSRSA9PSByb2FtU3RhdHVzCisJCSAgICAmJiAhaGRkRGlzY29uSW5Qcm9ncmVzcykgeworCQkJaGRkTG9nKExPRzEsCisJCQkJRkwoInN0YXRlIHRvIGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkIikpOworCQkJaGRkX2Nvbm5fc2V0X2Nvbm5lY3Rpb25fc3RhdGUocEFkYXB0ZXIsCisJCQkJCWVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkKTsKKwkJfQorCQloZGRfd21tX2luaXQocEFkYXB0ZXIpOworCisJCWhkZExvZyhMT0cxLCBGTCgiRGlzYWJsaW5nIHF1ZXVlcyIpKTsKKwkJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChwQWRhcHRlciwKKwkJCQkJICAgV0xBTl9ORVRJRl9UWF9ESVNBQkxFX05fQ0FSUklFUiwKKwkJCQkJICAgV0xBTl9DT05UUk9MX1BBVEgpOworCX0KKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RzX2NoZWNrX2FuZF9yZXN0YXJ0X3NhcChwSGRkQ3R4LAorCQkJCQlyb2FtUmVzdWx0LCBwSGRkU3RhQ3R4KSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJY2RzX2ZvcmNlX3NhcF9vbl9zY2MocEhkZEN0eCwgcm9hbVJlc3VsdCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGhkZF9yb2FtX2lic3NfaW5kaWNhdGlvbl9oYW5kbGVyKCkgLSB1cGRhdGUgdGhlIHN0YXR1cyBvZiB0aGUgSUJTUworICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IHBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKiBAcm9hbUlkOiByb2FtIGlkCisgKiBAcm9hbVN0YXR1czogcm9hbSBzdGF0dXMKKyAqIEByb2FtUmVzdWx0OiByb2FtIHJlc3VsdAorICoKKyAqIEhlcmUgd2UgdXBkYXRlIHRoZSBzdGF0dXMgb2YgdGhlIElic3Mgd2hlbiB3ZSByZWNlaXZlIGluZm9ybWF0aW9uIHRoYXQgd2UKKyAqIGhhdmUgc3RhcnRlZC9qb2luZWQgYW4gaWJzcyBzZXNzaW9uLgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfcm9hbV9pYnNzX2luZGljYXRpb25faGFuZGxlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJICAgICB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywKKwkJCQkJICAgICB1aW50MzJfdCByb2FtSWQsCisJCQkJCSAgICAgZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1cywKKwkJCQkJICAgICBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0KQoreworCWhkZExvZyhMT0cxLCAiJXM6IGlkICVkLCBzdGF0dXMgJWQsIHJlc3VsdCAlZCIsCisJICAgICAgIHBBZGFwdGVyLT5kZXYtPm5hbWUsIHJvYW1JZCwgcm9hbVN0YXR1cywgcm9hbVJlc3VsdCk7CisKKwlzd2l0Y2ggKHJvYW1SZXN1bHQpIHsKKwkvKiBib3RoIElCU1MgU3RhcnRlZCBhbmQgSUJTUyBKb2luIHNob3VsZCBjb21lIGluIGhlcmUuICovCisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfU1RBUlRFRDoKKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19KT0lOX1NVQ0NFU1M6CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfQ09BTEVTQ0VEOgorCXsKKwkJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9CisJCQkoaGRkX2NvbnRleHRfdCAqKSBwQWRhcHRlci0+cEhkZEN0eDsKKwkJc3RydWN0IGNkZl9tYWNfYWRkciBicm9hZGNhc3RNYWNBZGRyID0KKwkJCUNERl9NQUNfQUREUl9CUk9BRENBU1RfSU5JVElBTElaRVI7CisKKwkJaWYgKE5VTEwgPT0gcFJvYW1JbmZvKSB7CisJCQlDREZfQVNTRVJUKDApOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogV2hlbiBJQlNTIFN0YXJ0ZWQgY29tZXMgZnJvbSBDU1IsIHdlIG5lZWQgdG8gbW92ZQorCQkgKiBjb25uZWN0aW9uIHN0YXRlIHRvIElCU1MgRGlzY29ubmVjdGVkIChtZWFuaW5nIG5vIHBlZXJzCisJCSAqIGFyZSBpbiB0aGUgSUJTUykuCisJCSAqLworCQloZGRMb2coTE9HMSwKKwkJCUZMKCJTZXQgSEREIGNvbm5TdGF0ZSB0byBlQ29ubmVjdGlvblN0YXRlX0lic3NEaXNjb25uZWN0ZWQiKSk7CisJCWhkZF9jb25uX3NldF9jb25uZWN0aW9uX3N0YXRlKHBBZGFwdGVyLAorCQkJCSAgICAgIGVDb25uZWN0aW9uU3RhdGVfSWJzc0Rpc2Nvbm5lY3RlZCk7CisJCS8qIG5vdGlmeSB3bW0gKi8KKwkJaGRkX3dtbV9jb25uZWN0KHBBZGFwdGVyLCBwUm9hbUluZm8sCisJCQkJZUNTUl9CU1NfVFlQRV9JQlNTKTsKKwkJcEhkZEN0eC0+c3RhX3RvX2FkYXB0ZXJbSUJTU19CUk9BRENBU1RfU1RBSURdID0KKwkJCXBBZGFwdGVyOworCQloZGRfcm9hbV9yZWdpc3Rlcl9zdGEocEFkYXB0ZXIsIHBSb2FtSW5mbywKKwkJCQkgICAgICBJQlNTX0JST0FEQ0FTVF9TVEFJRCwKKwkJCQkgICAgICAmYnJvYWRjYXN0TWFjQWRkciwKKwkJCQkgICAgICBwUm9hbUluZm8tPnBCc3NEZXNjKTsKKworCQlpZiAocFJvYW1JbmZvLT5wQnNzRGVzYykgeworCQkJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTUsIDApKQorCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOworCQkJaW50IGNoYW5fbm87CisJCQl1bnNpZ25lZCBpbnQgZnJlcTsKKyNlbmRpZgorCQkJLyogd2UgY3JlYXRlZCB0aGUgSUJTUywgbm90aWZ5IHN1cHBsaWNhbnQgKi8KKwkJCWhkZExvZyhMT0cxLAorCQkJICAgICAgIEZMKCIlczogY3JlYXRlZCBpYnNzICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCSAgICAgICBwQWRhcHRlci0+ZGV2LT5uYW1lLAorCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBSb2FtSW5mby0+cEJzc0Rlc2MtPmJzc0lkKSk7CisKKwkJCS8qIHdlIG11c3QgZmlyc3QgZ2l2ZSBjZmc4MDIxMSB0aGUgQlNTIGluZm9ybWF0aW9uICovCisJCQlic3MgPSB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYnNzX2RiKHBBZGFwdGVyLAorCQkJCQkJCQlwUm9hbUluZm8pOworCQkJaWYgKE5VTEwgPT0gYnNzKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKCIlczogdW5hYmxlIHRvIGNyZWF0ZSBJQlNTIGVudHJ5IiksCisJCQkJICAgICAgIHBBZGFwdGVyLT5kZXYtPm5hbWUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWhkZExvZyhMT0cxLCBGTCgiRW5hYmxpbmcgcXVldWVzIikpOworCQkJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChwQWRhcHRlciwKKwkJCQkJV0xBTl9TVEFSVF9BTExfTkVUSUZfUVVFVUVfTl9DQVJSSUVSLAorCQkJCQlXTEFOX0NPTlRST0xfUEFUSCk7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE1LCAwKSkKKwkJCWNoYW5fbm8gPSBwUm9hbUluZm8tPnBCc3NEZXNjLT5jaGFubmVsSWQ7CisKKwkJCWlmIChjaGFuX25vIDw9IDE0KQorCQkJCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbl9ubywKKwkJCQkJICBJRUVFODAyMTFfQkFORF8yR0haKTsKKwkJCWVsc2UKKwkJCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5fbm8sCisJCQkJCSAgSUVFRTgwMjExX0JBTkRfNUdIWik7CisKKwkJCWNoYW4gPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwocEFkYXB0ZXItPndkZXYud2lwaHksIGZyZXEpOworCisJCQlpZiAoY2hhbikKKwkJCQljZmc4MDIxMV9pYnNzX2pvaW5lZChwQWRhcHRlci0+ZGV2LAorCQkJCQkJICAgICBic3MtPmJzc2lkLCBjaGFuLAorCQkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJCWVsc2UKKwkJCQloZGRMb2coTE9HRSwgRkwoIiVzOiBjaGFuSWQ6ICVkLCBjYW4ndCBmaW5kIGNoYW5uZWwiKSwKKwkJCQkJICAgcEFkYXB0ZXItPmRldi0+bmFtZSwKKwkJCQkJICAgKGludClwUm9hbUluZm8tPnBCc3NEZXNjLT5jaGFubmVsSWQpOworI2Vsc2UKKwkJCWNmZzgwMjExX2lic3Nfam9pbmVkKHBBZGFwdGVyLT5kZXYsIGJzcy0+YnNzaWQsCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisjZW5kaWYKKwkJCWNmZzgwMjExX3B1dF9ic3MoCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA5LCAwKSkKKwkJCQlwSGRkQ3R4LT53aXBoeSwKKyNlbmRpZgorCQkJCWJzcyk7CisJCX0KKworCQlicmVhazsKKwl9CisKKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19TVEFSVF9GQUlMRUQ6CisJeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCIlczogdW5hYmxlIHRvIGNyZWF0ZSBJQlNTIiksIHBBZGFwdGVyLT5kZXYtPm5hbWUpOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQloZGRMb2coTE9HRSwgRkwoIiVzOiB1bmV4cGVjdGVkIHJlc3VsdCAlZCIpLAorCQkgICAgICAgcEFkYXB0ZXItPmRldi0+bmFtZSwgKGludClyb2FtUmVzdWx0KTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIHJvYW1fc2F2ZV9pYnNzX3N0YXRpb24oKSAtIFNhdmUgdGhlIElCU1MgcGVlciBNQUMgYWRkcmVzcyBpbiB0aGUgYWRhcHRlcgorICogQHBIZGRTdGFDdHg6IHBvaW50ZXIgdG8gZ2xvYmFsIEhERCBzdGF0aW9uIGNvbnRleHQKKyAqIEBzdGFJZDogc3RhdGlvbiBpZAorICogQHBlZXJNYWNBZGRyZXNzOiBwb2ludGVyIHRvIHBlZXIgTUFDIGFkZHJlc3MKKyAqCisgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhc3NlZCB0byBpd2NvbmZpZyBsYXRlci4gVGhlIHBlZXIgdGhhdCBqb2luZWQKKyAqIGxhc3QgaXMgcGFzc2VkIGFzIGluZm9ybWF0aW9uIHRvIGl3Y29uZmlnLgorICoKKyAqIFJldHVybjoKKyAqCXRydWUgaWYgd2UgYWRkIE1BWF9JQlNTX1BFRVJTIG9yIGxlc3MgU1RBCisgKglmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBib29sIHJvYW1fc2F2ZV9pYnNzX3N0YXRpb24oaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHgsIHVpbnQ4X3Qgc3RhSWQsCisJCQkJICBzdHJ1Y3QgY2RmX21hY19hZGRyICpwZWVyTWFjQWRkcmVzcykKK3sKKwlib29sIGZTdWNjZXNzID0gZmFsc2U7CisJaW50IGlkeCA9IDA7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9JQlNTX1BFRVJTOyBpZHgrKykgeworCQlpZiAoMCA9PSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbaWR4XSkgeworCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkW2lkeF0gPSBzdGFJZDsKKworCQkJY2RmX2NvcHlfbWFjYWRkcigmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLgorCQkJCQkgcGVlck1hY0FkZHJlc3NbaWR4XSwgcGVlck1hY0FkZHJlc3MpOworCisJCQlmU3VjY2VzcyA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBmU3VjY2VzczsKK30KKworLyoqCisgKiByb2FtX3JlbW92ZV9pYnNzX3N0YXRpb24oKSAtIFJlbW92ZSB0aGUgSUJTUyBwZWVyIE1BQyBhZGRyZXNzIGluIHRoZSBhZGFwdGVyCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlcgorICogQHN0YUlkOiBzdGF0aW9uIGlkCisgKgorICogUmV0dXJuOgorICoJdHJ1ZSBpZiB3ZSByZW1vdmUgTUFYX0lCU1NfUEVFUlMgb3IgbGVzcyBTVEEKKyAqCWZhbHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGJvb2wgcm9hbV9yZW1vdmVfaWJzc19zdGF0aW9uKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90IHN0YUlkKQoreworCWJvb2wgZlN1Y2Nlc3MgPSBmYWxzZTsKKwlpbnQgaWR4ID0gMDsKKwl1aW50OF90IHZhbGlkX2lkeCA9IDA7CisJdWludDhfdCBkZWxfaWR4ID0gMDsKKwl1aW50OF90IGVtcHR5X3Nsb3RzID0gMDsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCisJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfSUJTU19QRUVSUzsgaWR4KyspIHsKKwkJaWYgKHN0YUlkID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFtpZHhdKSB7CisJCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbaWR4XSA9IDA7CisKKwkJCWNkZl96ZXJvX21hY2FkZHIoJnBIZGRTdGFDdHgtPmNvbm5faW5mby4KKwkJCQkJIHBlZXJNYWNBZGRyZXNzW2lkeF0pOworCisJCQlmU3VjY2VzcyA9IHRydWU7CisKKwkJCS8qCisJCQkgKiBOb3RlIHRoZSBkZWxldGVkIEluZGV4LCBpZiBpdHMgMCB3ZSBuZWVkIHNwZWNpYWwKKwkJCSAqIGhhbmRsaW5nLgorCQkJICovCisJCQlkZWxfaWR4ID0gaWR4OworCisJCQllbXB0eV9zbG90cysrOworCQl9IGVsc2UgeworCQkJaWYgKHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFtpZHhdICE9IDApIHsKKwkJCQl2YWxpZF9pZHggPSBpZHg7CisJCQl9IGVsc2UgeworCQkJCS8qIEZvdW5kIGFuIGVtcHR5IHNsb3QgKi8KKwkJCQllbXB0eV9zbG90cysrOworCQkJfQorCQl9CisJfQorCisJaWYgKE1BWF9JQlNTX1BFRVJTID09IGVtcHR5X3Nsb3RzKSB7CisJCS8qIExhc3QgcGVlciBkZXBhcnRlZCwgc2V0IHRoZSBJQlNTIHN0YXRlIGFwcHJvcHJpYXRlbHkgKi8KKwkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSA9CisJCQllQ29ubmVjdGlvblN0YXRlX0lic3NEaXNjb25uZWN0ZWQ7CisJCWhkZExvZyhMT0dFLCAiTGFzdCBJQlNTIFBlZXIgRGVwYXJ0ZWQhISEiKTsKKwl9CisJLyogRmluZCBuZXh0IGFjdGl2ZSBzdGFJZCwgdG8gaGF2ZSBhIHZhbGlkIHN0YSB0cmlnZ2VyIGZvciBUTC4gKi8KKwlpZiAoZlN1Y2Nlc3MgPT0gdHJ1ZSkgeworCQlpZiAoZGVsX2lkeCA9PSAwKSB7CisJCQlpZiAocEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkW3ZhbGlkX2lkeF0gIT0gMCkgeworCQkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFswXSA9CisJCQkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFt2YWxpZF9pZHhdOworCQkJCWNkZl9jb3B5X21hY2FkZHIoJnBIZGRTdGFDdHgtPmNvbm5faW5mby4KKwkJCQkJCSBwZWVyTWFjQWRkcmVzc1swXSwKKwkJCQkJCSAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLgorCQkJCQkJIHBlZXJNYWNBZGRyZXNzW3ZhbGlkX2lkeF0pOworCisJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkW3ZhbGlkX2lkeF0gPSAwOworCQkJCWNkZl96ZXJvX21hY2FkZHIoJnBIZGRTdGFDdHgtPmNvbm5faW5mby4KKwkJCQkJCSBwZWVyTWFjQWRkcmVzc1t2YWxpZF9pZHhdKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZlN1Y2Nlc3M7Cit9CisKKy8qKgorICogcm9hbV9pYnNzX2Nvbm5lY3RfaGFuZGxlcigpIC0gSUJTUyBjb25uZWN0aW9uIGhhbmRsZXIKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAcFJvYW1JbmZvOiBwb2ludGVyIHRvIHJvYW0gaW5mbworICoKKyAqIFdlIHVwZGF0ZSB0aGUgc3RhdHVzIG9mIHRoZSBJQlNTIHRvIGNvbm5lY3RlZCBpbiB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyByb2FtX2lic3NfY29ubmVjdF9oYW5kbGVyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkgICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8pCit7CisJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOworCWhkZExvZyhMT0cxLCBGTCgiSUJTUyBDb25uZWN0IEluZGljYXRpb24gZnJvbSBTTUUuIFNldCBIREQgY29ublN0YXRlIHRvIGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCIpKTsKKwkvKgorCSAqIFNldCB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbiBzdGF0ZSB0byBzaG93ICdJQlNTIENvbm5lY3RlZCcgKElCU1Mgd2l0aAorCSAqIGEgcGFydG5lciBzdGF0aW9ucykuCisJICovCisJaGRkX2Nvbm5fc2V0X2Nvbm5lY3Rpb25fc3RhdGUocEFkYXB0ZXIsIGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCk7CisKKwkvKiBTYXZlIHRoZSBjb25uZWN0aW9uIGluZm8gZnJvbSBDU1IuLi4gKi8KKwloZGRfY29ubl9zYXZlX2Nvbm5lY3RfaW5mbyhwQWRhcHRlciwgcFJvYW1JbmZvLCBlQ1NSX0JTU19UWVBFX0lCU1MpOworCisJLyogU2VuZCB0aGUgYnNzaWQgYWRkcmVzcyB0byB0aGUgd2V4dC4gKi8KKwloZGRfc2VuZF9hc3NvY2lhdGlvbl9ldmVudChwQWRhcHRlci0+ZGV2LCBwUm9hbUluZm8pOworCS8qIGFkZCBic3NfaWQgdG8gY2ZnODAyMTEgZGF0YSBiYXNlICovCisJYnNzID0gd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Jzc19kYihwQWRhcHRlciwgcFJvYW1JbmZvKTsKKwlpZiAoTlVMTCA9PSBic3MpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgiJXM6IHVuYWJsZSB0byBjcmVhdGUgSUJTUyBlbnRyeSIpLAorCQkgICAgICAgcEFkYXB0ZXItPmRldi0+bmFtZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJY2ZnODAyMTFfcHV0X2JzcygKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDksIDApKQorCQlXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKS0+d2lwaHksCisjZW5kaWYKKwkJYnNzKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogaGRkX3JvYW1fbWljX2Vycm9yX2luZGljYXRpb25faGFuZGxlcigpIC0gTUlDIGVycm9yIGluZGljYXRpb24gaGFuZGxlcgorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IHBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKiBAcm9hbUlkOiByb2FtIGlkCisgKiBAcm9hbVN0YXR1czogcm9hbSBzdGF0dXMKKyAqIEByb2FtUmVzdWx0OiByb2FtIHJlc3VsdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIHRoZSBNaWMgZmFpbHVyZSB0byB0aGUgc3VwcGxpY2FudAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUworaGRkX3JvYW1fbWljX2Vycm9yX2luZGljYXRpb25faGFuZGxlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywKKwkJCQkgICAgICB1aW50MzJfdCByb2FtSWQsCisJCQkJICAgICAgZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1cywKKwkJCQkgICAgICBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0KQoreworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUgJiYKKwkgICAgVEtJUF9DT1VOVEVSX01FQVNVUkVfU1RPUEVEID09CisJICAgIHBIZGRTdGFDdHgtPldleHRTdGF0ZS5tVEtJUENvdW50ZXJNZWFzdXJlcykgeworCQlzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgbXNnOworCQl1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisJCW1lbXNldCgmbXNnLCAnXDAnLCBzaXplb2YobXNnKSk7CisJCW1zZy5zcmNfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShtc2cuc3JjX2FkZHIuc2FfZGF0YSwKKwkJICAgICAgIHBSb2FtSW5mby0+dS5wTUlDRmFpbHVyZUluZm8tPnRhTWFjQWRkciwKKwkJICAgICAgIHNpemVvZihwUm9hbUluZm8tPnUucE1JQ0ZhaWx1cmVJbmZvLT50YU1hY0FkZHIpKTsKKwkJaGRkTG9nKExPRzEsICJNSUMgTUFDICIgTUFDX0FERFJFU1NfU1RSLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkobXNnLnNyY19hZGRyLnNhX2RhdGEpKTsKKworCQlpZiAocFJvYW1JbmZvLT51LnBNSUNGYWlsdXJlSW5mby0+bXVsdGljYXN0ID09IGVTSVJfVFJVRSkKKwkJCW1zZy5mbGFncyA9IElXX01JQ0ZBSUxVUkVfR1JPVVA7CisJCWVsc2UKKwkJCW1zZy5mbGFncyA9IElXX01JQ0ZBSUxVUkVfUEFJUldJU0U7CisJCW1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKwkJd3JlcS5kYXRhLmxlbmd0aCA9IHNpemVvZihtc2cpOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZGFwdGVyLT5kZXYsIElXRVZNSUNIQUVMTUlDRkFJTFVSRSwgJndyZXEsCisJCQkJICAgIChjaGFyICopJm1zZyk7CisJCS8qIGluZm9ybSBtaWMgZmFpbHVyZSB0byBubDgwMjExICovCisJCWNmZzgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUocEFkYXB0ZXItPmRldiwKKwkJCQkJICAgICBwUm9hbUluZm8tPnUucE1JQ0ZhaWx1cmVJbmZvLT4KKwkJCQkJICAgICB0YU1hY0FkZHIsCisJCQkJCSAgICAgKChwUm9hbUluZm8tPnUucE1JQ0ZhaWx1cmVJbmZvLT4KKwkJCQkJICAgICAgIG11bHRpY2FzdCA9PQorCQkJCQkgICAgICAgZVNJUl9UUlVFKSA/CisJCQkJCSAgICAgIE5MODAyMTFfS0VZVFlQRV9HUk9VUCA6CisJCQkJCSAgICAgIE5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRSksCisJCQkJCSAgICAgcFJvYW1JbmZvLT51LnBNSUNGYWlsdXJlSW5mby0+CisJCQkJCSAgICAga2V5SWQsCisJCQkJCSAgICAgcFJvYW1JbmZvLT51LnBNSUNGYWlsdXJlSW5mby0+VFNDLAorCQkJCQkgICAgIEdGUF9LRVJORUwpOworCisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiByb2FtX3JvYW1fY29ubmVjdF9zdGF0dXNfdXBkYXRlX2hhbmRsZXIoKSAtIElCU1MgY29ubmVjdCBzdGF0dXMgdXBkYXRlCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlcgorICogQHBSb2FtSW5mbzogcG9pbnRlciB0byByb2FtIGluZm8KKyAqIEByb2FtSWQ6IHJvYW0gaWQKKyAqIEByb2FtU3RhdHVzOiByb2FtIHN0YXR1cworICogQHJvYW1SZXN1bHQ6IHJvYW0gcmVzdWx0CisgKgorICogVGhlIElic3MgY29ubmVjdGlvbiBzdGF0dXMgaXMgdXBkYXRlZCByZWd1bGFybHkgaGVyZSBpbiB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUworcm9hbV9yb2FtX2Nvbm5lY3Rfc3RhdHVzX3VwZGF0ZV9oYW5kbGVyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQl0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywKKwkJCQkJdWludDMyX3Qgcm9hbUlkLAorCQkJCQllUm9hbUNtZFN0YXR1cyByb2FtU3RhdHVzLAorCQkJCQllQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0KQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlzd2l0Y2ggKHJvYW1SZXN1bHQpIHsKKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19ORVdfUEVFUjoKKwl7CisJCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0KKwkJCVdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCQlzdHJ1Y3Qgc3RhdGlvbl9pbmZvIHN0YUluZm87CisKKwkJcHJfaW5mbygiSUJTUyBOZXcgUGVlciBpbmRpY2F0aW9uIGZyb20gU01FICIKKwkJCSJ3aXRoIHBlZXJNYWMgIiBNQUNfQUREUkVTU19TVFIgIiBCU1NJRDogIgorCQkJTUFDX0FERFJFU1NfU1RSICIgYW5kIHN0YXRpb25JRD0gJWQiLAorCQkJTUFDX0FERFJfQVJSQVkocFJvYW1JbmZvLT5wZWVyTWFjLmJ5dGVzKSwKKwkJCU1BQ19BRERSX0FSUkFZKHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZC5ieXRlcyksCisJCQlwUm9hbUluZm8tPnN0YUlkKTsKKworCQlpZiAoIXJvYW1fc2F2ZV9pYnNzX3N0YXRpb24KKwkJCSAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlciksCisJCQkgICAgcFJvYW1JbmZvLT5zdGFJZCwKKwkJCSAgICAmcFJvYW1JbmZvLT5wZWVyTWFjKSkgeworCQkJaGRkTG9nKExPR1csICJNYXggcmVhY2hlZDogQ2FuJ3QgcmVnaXN0ZXIgbmV3IElCU1MgcGVlciIpOworCQkJYnJlYWs7CisJCX0KKworCQlwSGRkQ3R4LT5zdGFfdG9fYWRhcHRlcltwUm9hbUluZm8tPnN0YUlkXSA9IHBBZGFwdGVyOworCisJCXBIZGRDdHgtPnN0YV90b19hZGFwdGVyW0lCU1NfQlJPQURDQVNUX1NUQUlEXSA9CisJCQlwQWRhcHRlcjsKKworCQkvKiBSZWdpc3RlciB0aGUgU3RhdGlvbiB3aXRoIFRMIGZvciB0aGUgbmV3IHBlZXIuICovCisJCWNkZl9zdGF0dXMgPSBoZGRfcm9hbV9yZWdpc3Rlcl9zdGEocEFkYXB0ZXIsCisJCQkJCQkgICBwUm9hbUluZm8sCisJCQkJCQkgICBwUm9hbUluZm8tPnN0YUlkLAorCQkJCQkJICAgJnBSb2FtSW5mby0+cGVlck1hYywKKwkJCQkJCSAgIHBSb2FtSW5mby0+cEJzc0Rlc2MpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkJIkNhbm5vdCByZWdpc3RlciBTVEEgd2l0aCBUTCBmb3IgSUJTUy4gRmFpbGVkIHdpdGggY2RmX3N0YXR1cyA9ICVkIFslMDhYXSIsCisJCQkJY2RmX3N0YXR1cywgY2RmX3N0YXR1cyk7CisJCX0KKwkJcEhkZFN0YUN0eC0+aWJzc19zdGFfZ2VuZXJhdGlvbisrOworCQltZW1zZXQoJnN0YUluZm8sIDAsIHNpemVvZihzdGFJbmZvKSk7CisJCXN0YUluZm8uZmlsbGVkID0gMDsKKwkJc3RhSW5mby5nZW5lcmF0aW9uID0gcEhkZFN0YUN0eC0+aWJzc19zdGFfZ2VuZXJhdGlvbjsKKworCQljZmc4MDIxMV9uZXdfc3RhKHBBZGFwdGVyLT5kZXYsCisJCQkJIChjb25zdCB1OCAqKXBSb2FtSW5mby0+cGVlck1hYy5ieXRlcywKKwkJCQkgJnN0YUluZm8sIEdGUF9LRVJORUwpOworCisJCWlmIChlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVkgPT0KKwkJICAgIHBIZGRTdGFDdHgtPmlic3NfZW5jX2tleS5lbmNUeXBlCisJCSAgICB8fCBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZID09CisJCSAgICBwSGRkU3RhQ3R4LT5pYnNzX2VuY19rZXkuZW5jVHlwZQorCQkgICAgfHwgZUNTUl9FTkNSWVBUX1RZUEVfVEtJUCA9PQorCQkgICAgcEhkZFN0YUN0eC0+aWJzc19lbmNfa2V5LmVuY1R5cGUKKwkJICAgIHx8IGVDU1JfRU5DUllQVF9UWVBFX0FFUyA9PQorCQkgICAgcEhkZFN0YUN0eC0+aWJzc19lbmNfa2V5LmVuY1R5cGUpIHsKKwkJCXBIZGRTdGFDdHgtPmlic3NfZW5jX2tleS5rZXlEaXJlY3Rpb24gPQorCQkJCWVTSVJfVFhfUlg7CisJCQljZGZfY29weV9tYWNhZGRyKCZwSGRkU3RhQ3R4LT5pYnNzX2VuY19rZXkucGVlck1hYywKKwkJCQkJICZwUm9hbUluZm8tPnBlZXJNYWMpOworCisJCQloZGRMb2coTE9HMiwgIk5ldyBwZWVyIGpvaW5lZCBzZXQgUFRLIGVuY1R5cGU9JWQiLAorCQkJCSAgcEhkZFN0YUN0eC0+aWJzc19lbmNfa2V5LmVuY1R5cGUpOworCisJCQljZGZfc3RhdHVzID0KKwkJCQlzbWVfcm9hbV9zZXRfa2V5KFdMQU5fSEREX0dFVF9IQUxfQ1RYCisJCQkJCQkJIChwQWRhcHRlciksCisJCQkJCQkgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCSAmcEhkZFN0YUN0eC0+aWJzc19lbmNfa2V5LAorCQkJCQkJICZyb2FtSWQpOworCisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoInNtZV9yb2FtX3NldF9rZXkgZmFpbGVkLCBzdGF0dXM9JWQiKSwKKwkJCQkgICAgICAgY2RmX3N0YXR1cyk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJfQorCQl9CisJCWhkZExvZyhMT0cxLCBGTCgiRW5hYmxpbmcgcXVldWVzIikpOworCQl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLAorCQkJCQkgICBXTEFOX1NUQVJUX0FMTF9ORVRJRl9RVUVVRV9OX0NBUlJJRVIsCisJCQkJCSAgIFdMQU5fQ09OVFJPTF9QQVRIKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfQ09OTkVDVDoKKwl7CisKKwkJcm9hbV9pYnNzX2Nvbm5lY3RfaGFuZGxlcihwQWRhcHRlciwgcFJvYW1JbmZvKTsKKworCQlicmVhazsKKwl9CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfUEVFUl9ERVBBUlRFRDoKKwl7CisJCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0KKwkJCVdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCisJCWlmICghcm9hbV9yZW1vdmVfaWJzc19zdGF0aW9uKHBBZGFwdGVyLCBwUm9hbUluZm8tPnN0YUlkKSkKKwkJCWhkZExvZyhMT0dXLAorCQkJCSJJQlNTIHBlZXIgZGVwYXJ0ZWQgYnkgY2Fubm90IGZpbmQgcGVlciBpbiBvdXIgcmVnaXN0cmF0aW9uIHRhYmxlIHdpdGggVEwiKTsKKworCQlwcl9pbmZvKCJJQlNTIFBlZXIgRGVwYXJ0ZWQgZnJvbSBTTUUgIgorCQkJIndpdGggcGVlck1hYyAiIE1BQ19BRERSRVNTX1NUUiAiIEJTU0lEOiAiCisJCQlNQUNfQUREUkVTU19TVFIgIiBhbmQgc3RhdGlvbklEPSAlZCIsCisJCQlNQUNfQUREUl9BUlJBWShwUm9hbUluZm8tPnBlZXJNYWMuYnl0ZXMpLAorCQkJTUFDX0FERFJfQVJSQVkocEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLmJ5dGVzKSwKKwkJCXBSb2FtSW5mby0+c3RhSWQpOworCisJCWhkZF9yb2FtX2RlcmVnaXN0ZXJfc3RhKHBBZGFwdGVyLCBwUm9hbUluZm8tPnN0YUlkKTsKKworCQlwSGRkQ3R4LT5zdGFfdG9fYWRhcHRlcltwUm9hbUluZm8tPnN0YUlkXSA9IE5VTEw7CisJCXBIZGRTdGFDdHgtPmlic3Nfc3RhX2dlbmVyYXRpb24rKzsKKworCQljZmc4MDIxMV9kZWxfc3RhKHBBZGFwdGVyLT5kZXYsCisJCQkJIChjb25zdCB1OCAqKSZwUm9hbUluZm8tPnBlZXJNYWMuYnl0ZXMsCisJCQkJIEdGUF9LRVJORUwpOworCQlicmVhazsKKwl9CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfSU5BQ1RJVkU6CisJeworCQloZGRMb2coTE9HMywKKwkJCSAgIlJlY2VpdmVkIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19JTkFDVElWRSBmcm9tIFNNRSIpOworCQkvKiBTdG9wIG9ubHkgd2hlbiB3ZSBhcmUgaW5hY3RpdmUgKi8KKwkJaGRkTG9nKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCQl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLAorCQkJCQkgICBXTEFOX05FVElGX1RYX0RJU0FCTEVfTl9DQVJSSUVSLAorCQkJCQkgICBXTEFOX0NPTlRST0xfUEFUSCk7CisJCWhkZExvZyhMT0cxLAorCQkJRkwoIlNldCBIREQgY29ublN0YXRlIHRvIGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkIikpOworCQloZGRfY29ubl9zZXRfY29ubmVjdGlvbl9zdGF0ZShwQWRhcHRlciwKKwkJCQkJICAgICAgZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQpOworCisJCS8qIFNlbmQgdGhlIGJzc2lkIGFkZHJlc3MgdG8gdGhlIHdleHQuICovCisJCWhkZF9zZW5kX2Fzc29jaWF0aW9uX2V2ZW50KHBBZGFwdGVyLT5kZXYsIHBSb2FtSW5mbyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworLyoqCisgKiBoZGRfcm9hbV9yZWdpc3Rlcl90ZGxzc3RhKCkgLSByZWdpc3RlciBuZXcgVERMUyBzdGF0aW9uCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlcgorICogQHBlZXJNYWM6IHBvaW50ZXIgdG8gcGVlciBNQUMgYWRkcmVzcworICogQHN0YUlkOiBzdGF0aW9uIGlkZW50aWZpZXIKKyAqIEB1Y2FzdFNpZzogdW5pY2FzdCBzaWduYXR1cmUKKyAqCisgKiBDb25zdHJ1Y3QgdGhlIHN0YURlc2MgYW5kIHJlZ2lzdGVyIHdpdGggVEwgdGhlIG5ldyBTVEEuCisgKiBUaGlzIGlzIGNhbGxlZCBhcyBwYXJ0IG9mIEFERF9TVEEgaW4gdGhlIFRETFMgc2V0dXAuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgaGRkX3JvYW1fcmVnaXN0ZXJfdGRsc3N0YShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgIGNvbnN0IHVpbnQ4X3QgKnBlZXJNYWMsIHVpbnQxNl90IHN0YUlkLAorCQkJCSAgICAgdWludDhfdCB1Y2FzdFNpZykKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwlzdHJ1Y3Qgb2xfdHhyeF9kZXNjX3R5cGUgc3RhRGVzYyA9IHsgMCB9OworCisJLyoKKwkgKiBURExTIHN0YSBpbiBCU1Mgc2hvdWxkIGJlIHNldCBhcyBTVEEgdHlwZSBURExTIGFuZCBTVEEgTUFDIHNob3VsZAorCSAqIGJlIHBlZXIgTUFDLCBoZXJlIHdlIGFyZSB3b3JraW5nIG9uIGRpcmVjdCBMaW5rCisJICovCisJc3RhRGVzYy5zdGFfaWQgPSBzdGFJZDsKKworCS8qIHNldCB0aGUgUW9TIGZpZWxkIGFwcHJvcHJpYXRlbHkgLi4gKi8KKwkoaGRkX3dtbV9pc19hY3RpdmUocEFkYXB0ZXIpKSA/IChzdGFEZXNjLmlzX3Fvc19lbmFibGVkID0gMSkKKwk6IChzdGFEZXNjLmlzX3Fvc19lbmFibGVkID0gMCk7CisKKworCS8qIFJlZ2lzdGVyIHRoZSBTdGF0aW9uIHdpdGggVEwuLi4gICovCisJY2RmX3N0YXR1cyA9IG9sX3R4cnhfcmVnaXN0ZXJfcGVlcihoZGRfcnhfcGFja2V0X2NiaywKKwkJCQkJCSZzdGFEZXNjKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwgRkwoIm9sX3R4cnhfcmVnaXN0ZXJfcGVlcigpIGZhaWxlZCB0byByZWdpc3Rlci4gU3RhdHVzPSVkIFsweCUwOFhdIiksCisJCQljZGZfc3RhdHVzLCBjZGZfc3RhdHVzKTsKKwkJcmV0dXJuIGNkZl9zdGF0dXM7CisJfQorCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogaGRkX3JvYW1fZGVyZWdpc3Rlcl90ZGxzc3RhKCkgLSBkZXJlZ2lzdGVyIG5ldyBURExTIHN0YXRpb24KKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAc3RhSWQ6IHN0YXRpb24gaWRlbnRpZmllcgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBoZGRfcm9hbV9kZXJlZ2lzdGVyX3RkbHNzdGEoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCSAgICAgIHVpbnQ4X3Qgc3RhSWQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCWNkZl9zdGF0dXMgPSBvbF90eHJ4X2NsZWFyX3BlZXIoc3RhSWQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWhkZExvZyhMT0dXLCBGTCgib2xfdHhyeF9jbGVhcl9wZWVyKCkgZmFpbGVkIGZvciBzdGFJRCAlZC4gU3RhdHVzPSVkIFsweCUwOFhdIiksCisJCQlzdGFJZCwgY2RmX3N0YXR1cywgY2RmX3N0YXR1cyk7CisJfQorCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIGhkZF9yb2FtX3RkbHNfc3RhdHVzX3VwZGF0ZV9oYW5kbGVyKCkgLSBURExTIHN0YXR1cyB1cGRhdGUgaGFuZGxlcgorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IHBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKiBAcm9hbUlkOiByb2FtIGlkCisgKiBAcm9hbVN0YXR1czogcm9hbSBzdGF0dXMKKyAqIEByb2FtUmVzdWx0OiByb2FtIHJlc3VsdAorICoKKyAqIEhERCBpbnRlcmZhY2UgYmV0d2VlbiBTTUUgYW5kIFRMIHRvIGVuc3VyZSBURExTIGNsaWVudCByZWdpc3RyYXRpb24gd2l0aAorICogVEwgaW4gY2FzZSBvZiBuZXcgVERMUyBjbGllbnQgaXMgYWRkZWQgYW5kIGRlcmVnaXN0cmF0aW9uIGF0IHRoZSB0aW1lCisgKiBURExTIGNsaWVudCBpcyBkZWxldGVkLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUworaGRkX3JvYW1fdGRsc19zdGF0dXNfdXBkYXRlX2hhbmRsZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLAorCQkJCSAgICB1aW50MzJfdCByb2FtSWQsCisJCQkJICAgIGVSb2FtQ21kU3RhdHVzIHJvYW1TdGF0dXMsCisJCQkJICAgIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTsKKwl0U21lVGRsc1BlZXJTdGF0ZVBhcmFtcyBzbWVUZGxzUGVlclN0YXRlUGFyYW1zOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdWludDhfdCBzdGFJZHg7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCXVpbnQzMl90IHJlYXNvbjsKKworCWhkZExvZyhMT0cyLAorCQkgICgiaGRkX3RkbHNTdGF0dXNVcGRhdGU6ICVzIHN0YUlkeCAlZCAiIE1BQ19BRERSRVNTX1NUUiksCisJCSAgcm9hbVJlc3VsdCA9PQorCQkgIGVDU1JfUk9BTV9SRVNVTFRfQUREX1RETFNfUEVFUiA/ICJBRERfVERMU19QRUVSIiA6IHJvYW1SZXN1bHQKKwkJICA9PQorCQkgIGVDU1JfUk9BTV9SRVNVTFRfREVMRVRFX1RETFNfUEVFUiA/ICJERUxfVERMU19QRUVSIiA6CisJCSAgcm9hbVJlc3VsdCA9PQorCQkgIGVDU1JfUk9BTV9SRVNVTFRfVEVBUkRPV05fVERMU19QRUVSX0lORCA/ICJERUxfVERMU19QRUVSX0lORCIKKwkJICA6IHJvYW1SZXN1bHQgPT0KKwkJICBlQ1NSX1JPQU1fUkVTVUxUX0RFTEVURV9BTExfVERMU19QRUVSX0lORCA/CisJCSAgIkRFTF9BTExfVERMU19QRUVSX0lORCIgOiByb2FtUmVzdWx0ID09CisJCSAgZUNTUl9ST0FNX1JFU1VMVF9VUERBVEVfVERMU19QRUVSID8gIlVQREFURV9URExTX1BFRVIiIDoKKwkJICByb2FtUmVzdWx0ID09CisJCSAgZUNTUl9ST0FNX1JFU1VMVF9MSU5LX0VTVEFCTElTSF9SRVFfUlNQID8KKwkJICAiTElOS19FU1RBQkxJU0hfUkVRX1JTUCIgOiByb2FtUmVzdWx0ID09CisJCSAgZUNTUl9ST0FNX1JFU1VMVF9URExTX1NIT1VMRF9ESVNDT1ZFUiA/ICJURExTX1NIT1VMRF9ESVNDT1ZFUiIKKwkJICA6IHJvYW1SZXN1bHQgPT0KKwkJICBlQ1NSX1JPQU1fUkVTVUxUX1RETFNfU0hPVUxEX1RFQVJET1dOID8gIlRETFNfU0hPVUxEX1RFQVJET1dOIgorCQkgIDogcm9hbVJlc3VsdCA9PQorCQkgIGVDU1JfUk9BTV9SRVNVTFRfVERMU19TSE9VTERfUEVFUl9ESVNDT05ORUNURUQgPworCQkgICJURExTX1NIT1VMRF9QRUVSX0RJU0NPTk5FQ1RFRCIgOiAiVU5LTk9XTiIsIHBSb2FtSW5mby0+c3RhSWQsCisJCSAgTUFDX0FERFJfQVJSQVkocFJvYW1JbmZvLT5wZWVyTWFjLmJ5dGVzKSk7CisKKwlpZiAoIXBIZGRUZGxzQ3R4KSB7CisJCWhkZExvZyhMT0cxLAorCQkJRkwoIlRETFMgY3R4IGlzIG51bGwsIGlnbm9yZSByb2FtUmVzdWx0ICglZCkiKSwKKwkJCXJvYW1SZXN1bHQpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN3aXRjaCAocm9hbVJlc3VsdCkgeworCWNhc2UgZUNTUl9ST0FNX1JFU1VMVF9BRERfVERMU19QRUVSOgorCXsKKwkJaWYgKGVTSVJfU01FX1NVQ0NFU1MgIT0gcFJvYW1JbmZvLT5zdGF0dXNDb2RlKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIkFkZCBTdGEgZmFpbGVkLiBzdGF0dXMgY29kZSg9JWQpIiksCisJCQkJcFJvYW1JbmZvLT5zdGF0dXNDb2RlKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB0aGVyZSBpcyBhdmFpbGFibGUgaW5kZXggZm9yIHRoaXMgbmV3IFRETFMKKwkJCSAqIFNUQS4KKwkJCSAqLworCQkJZm9yIChzdGFJZHggPSAwOworCQkJICAgICBzdGFJZHggPCBwSGRkQ3R4LT5tYXhfbnVtX3RkbHNfc3RhOworCQkJICAgICBzdGFJZHgrKykgeworCQkJCWlmICgwID09CisJCQkJICAgIHBIZGRDdHgtPnRkbHNDb25uSW5mb1tzdGFJZHhdLgorCQkJCSAgICBzdGFJZCkgeworCQkJCQlwSGRkQ3R4LT50ZGxzQ29ubkluZm9bc3RhSWR4XS4KKwkJCQkJc2Vzc2lvbklkID0KKwkJCQkJCXBSb2FtSW5mby0+c2Vzc2lvbklkOworCQkJCQlwSGRkQ3R4LT50ZGxzQ29ubkluZm9bc3RhSWR4XS4KKwkJCQkJc3RhSWQgPSBwUm9hbUluZm8tPnN0YUlkOworCisJCQkJCWhkZExvZyhMT0dXLAorCQkJCQkJICAoIlRETFM6IFNUQSBJRFggYXQgJWQgaXMgJWQgIgorCQkJCQkJICAgIm9mIG1hYyAiCisJCQkJCQkgICBNQUNfQUREUkVTU19TVFIpLAorCQkJCQkJICBzdGFJZHgsCisJCQkJCQkgIHBIZGRDdHgtPgorCQkJCQkJICB0ZGxzQ29ubkluZm9bc3RhSWR4XS4KKwkJCQkJCSAgc3RhSWQsCisJCQkJCQkgIE1BQ19BRERSX0FSUkFZCisJCQkJCQkJICAocFJvYW1JbmZvLT5wZWVyTWFjLmJ5dGVzKSk7CisKKwkJCQkJY2RmX2NvcHlfbWFjYWRkcigmcEhkZEN0eC0+CisJCQkJCQkJIHRkbHNDb25uSW5mbworCQkJCQkJCSBbc3RhSWR4XS4KKwkJCQkJCQkgcGVlck1hYywKKwkJCQkJCQkgJnBSb2FtSW5mby0+CisJCQkJCQkJIHBlZXJNYWMpOworCQkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChzdGFJZHggPCBwSGRkQ3R4LT5tYXhfbnVtX3RkbHNfc3RhKSB7CisJCQkJaWYgKC0xID09CisJCQkJICAgIHdsYW5faGRkX3RkbHNfc2V0X3N0YV9pZChwQWRhcHRlciwKKwkJCQkJCQkgICAgIHBSb2FtSW5mby0+CisJCQkJCQkJICAgICBwZWVyTWFjLmJ5dGVzLAorCQkJCQkJCSAgICAgcFJvYW1JbmZvLT4KKwkJCQkJCQkgICAgIHN0YUlkKSkgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJCSJ3bGFuX2hkZF90ZGxzX3NldF9zdGFfaWQoKSBmYWlsZWQiKTsKKwkJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJCX0KKworCQkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPgorCQkJCXN0YV90b19hZGFwdGVyW3BSb2FtSW5mby0+c3RhSWRdID0KKwkJCQkJcEFkYXB0ZXI7CisJCQkJLyoKKwkJCQkgKiBzdG9yZSB0aGUgdWNhc3Qgc2lnbmF0dXJlLAorCQkJCSAqIGlmIHJlcXVpcmVkIGZvciBmdXJ0aGVyIHJlZmVyZW5jZS4KKwkJCQkgKi8KKworCQkJCXdsYW5faGRkX3RkbHNfc2V0X3NpZ25hdHVyZShwQWRhcHRlciwKKwkJCQkJCQkgICAgcFJvYW1JbmZvLT4KKwkJCQkJCQkgICAgcGVlck1hYy5ieXRlcywKKwkJCQkJCQkgICAgcFJvYW1JbmZvLT4KKwkJCQkJCQkgICAgdWNhc3RTaWcpOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJRkwoIm5vIGF2YWlsYWJsZSBzbG90IGluIGNvbm5faW5mby4gc3RhSWQgJWQgY2Fubm90IGJlIHN0b3JlZCIpLAorCQkJCQlwUm9hbUluZm8tPnN0YUlkKTsKKwkJCX0KKwkJCXBBZGFwdGVyLT50ZGxzQWRkU3RhU3RhdHVzID0gc3RhdHVzOworCQl9CisJCWNvbXBsZXRlKCZwQWRhcHRlci0+dGRsc19hZGRfc3RhdGlvbl9jb21wKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgZUNTUl9ST0FNX1JFU1VMVF9VUERBVEVfVERMU19QRUVSOgorCXsKKwkJaWYgKGVTSVJfU01FX1NVQ0NFU1MgIT0gcFJvYW1JbmZvLT5zdGF0dXNDb2RlKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQlGTCgiQWRkIFN0YSBmYWlsZWQuIHN0YXR1cyBjb2RlKD0lZCkiKSwKKwkJCQlwUm9hbUluZm8tPnN0YXR1c0NvZGUpOworCQl9CisJCS8qIHN0b3JlIHRoZSB1Y2FzdCBzaWduYXR1cmUgd2hpY2ggd2lsbCBiZSB1c2VkIGxhdGVyIHdoZW4KKwkJICogcmVnaXN0ZXJpbmcgdG8gVEwKKwkJICovCisJCXBBZGFwdGVyLT50ZGxzQWRkU3RhU3RhdHVzID0gcFJvYW1JbmZvLT5zdGF0dXNDb2RlOworCQljb21wbGV0ZSgmcEFkYXB0ZXItPnRkbHNfYWRkX3N0YXRpb25fY29tcCk7CisJCWJyZWFrOworCX0KKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfTElOS19FU1RBQkxJU0hfUkVRX1JTUDoKKwl7CisJCWlmIChlU0lSX1NNRV9TVUNDRVNTICE9IHBSb2FtSW5mby0+c3RhdHVzQ29kZSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoIkxpbmsgRXN0YWJsaXNoIFJlcXVlc3QgZmFpbGVkLiBzdGF0dXMoPSVkKSIpLAorCQkJCXBSb2FtSW5mby0+c3RhdHVzQ29kZSk7CisJCX0KKwkJY29tcGxldGUoJnBBZGFwdGVyLT50ZGxzX2xpbmtfZXN0YWJsaXNoX3JlcV9jb21wKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgZUNTUl9ST0FNX1JFU1VMVF9ERUxFVEVfVERMU19QRUVSOgorCXsKKwkJZm9yIChzdGFJZHggPSAwOyBzdGFJZHggPCBwSGRkQ3R4LT5tYXhfbnVtX3RkbHNfc3RhOworCQkgICAgIHN0YUlkeCsrKSB7CisJCQlpZiAoKHBIZGRDdHgtPnRkbHNDb25uSW5mb1tzdGFJZHhdLnNlc3Npb25JZCA9PQorCQkJICAgICBwUm9hbUluZm8tPnNlc3Npb25JZCkKKwkJCSAgICAmJiBwUm9hbUluZm8tPnN0YUlkID09CisJCQkgICAgcEhkZEN0eC0+dGRsc0Nvbm5JbmZvW3N0YUlkeF0uc3RhSWQpIHsKKwkJCQloZGRMb2coTE9HVywKKwkJCQkJICAoIkhERDogZGVsIFNUQSBJRFggPSAleCIpLAorCQkJCQkgIHBSb2FtSW5mby0+c3RhSWQpOworCisJCQkJY3Vycl9wZWVyID0KKwkJCQkJd2xhbl9oZGRfdGRsc19maW5kX3BlZXIocEFkYXB0ZXIsCisJCQkJCQkJCXBSb2FtSW5mby0+CisJCQkJCQkJCXBlZXJNYWMuYnl0ZXMsCisJCQkJCQkJCXRydWUpOworCQkJCWlmIChOVUxMICE9IGN1cnJfcGVlcgorCQkJCSAgICAmJiBURExTX0lTX0NPTk5FQ1RFRChjdXJyX3BlZXIpKSB7CisJCQkJCWhkZF9yb2FtX2RlcmVnaXN0ZXJfdGRsc3N0YQorCQkJCQkJKHBBZGFwdGVyLAorCQkJCQkJcFJvYW1JbmZvLT5zdGFJZCk7CisJCQkJCXdsYW5faGRkX3RkbHNfZGVjcmVtZW50X3BlZXJfY291bnQKKwkJCQkJCShwQWRhcHRlcik7CisJCQkJfQorCQkJCXdsYW5faGRkX3RkbHNfcmVzZXRfcGVlcihwQWRhcHRlciwKKwkJCQkJCQkgcFJvYW1JbmZvLT4KKwkJCQkJCQkgcGVlck1hYy5ieXRlcyk7CisKKwkJCQlwSGRkQ3R4LT50ZGxzQ29ubkluZm9bc3RhSWR4XS5zdGFJZCA9IDA7CisJCQkJcEhkZEN0eC0+dGRsc0Nvbm5JbmZvW3N0YUlkeF0uCisJCQkJc2Vzc2lvbklkID0gMjU1OworCQkJCWNkZl9tZW1femVybygmcEhkZEN0eC0+CisJCQkJCSAgICAgdGRsc0Nvbm5JbmZvW3N0YUlkeF0uCisJCQkJCSAgICAgcGVlck1hYywKKwkJCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWNvbXBsZXRlKCZwQWRhcHRlci0+dGRsc19kZWxfc3RhdGlvbl9jb21wKTsKKwl9CisJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX1RFQVJET1dOX1RETFNfUEVFUl9JTkQ6CisJeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJTZW5kaW5nIHRlYXJkb3duIHRvIHN1cHBsaWNhbnQgd2l0aCByZWFzb24gY29kZSAldSIpLAorCQkJcFJvYW1JbmZvLT5yZWFzb25Db2RlKTsKKworCQljdXJyX3BlZXIgPQorCQkJd2xhbl9oZGRfdGRsc19maW5kX3BlZXIocEFkYXB0ZXIsCisJCQkJCQlwUm9hbUluZm8tPnBlZXJNYWMuYnl0ZXMsIHRydWUpOworCQl3bGFuX2hkZF90ZGxzX2luZGljYXRlX3RlYXJkb3duKHBBZGFwdGVyLCBjdXJyX3BlZXIsCisJCQkJCQlwUm9hbUluZm8tPnJlYXNvbkNvZGUpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCX0KKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfREVMRVRFX0FMTF9URExTX1BFRVJfSU5EOgorCXsKKwkJLyogMCBzdGFJZHggaXMgYXNzaWduZWQgdG8gQVAgd2UgZG9udCB3YW50IHRvIHRvdWNoIHRoYXQgKi8KKwkJZm9yIChzdGFJZHggPSAwOyBzdGFJZHggPCBwSGRkQ3R4LT5tYXhfbnVtX3RkbHNfc3RhOworCQkgICAgIHN0YUlkeCsrKSB7CisJCQlpZiAoKHBIZGRDdHgtPnRkbHNDb25uSW5mb1tzdGFJZHhdLnNlc3Npb25JZCA9PQorCQkJICAgICBwUm9hbUluZm8tPnNlc3Npb25JZCkKKwkJCSAgICAmJiBwSGRkQ3R4LT50ZGxzQ29ubkluZm9bc3RhSWR4XS5zdGFJZCkgeworCQkJCWhkZExvZyhMT0dXLAorCQkJCQkgICgiaGRkX3RkbHNTdGF0dXNVcGRhdGU6IHN0YUlkeCAlZCAiCisJCQkJCSAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJCSAgcEhkZEN0eC0+dGRsc0Nvbm5JbmZvW3N0YUlkeF0uCisJCQkJCSAgc3RhSWQsCisJCQkJCSAgTUFDX0FERFJfQVJSQVkocEhkZEN0eC0+CisJCQkJCQkJIHRkbHNDb25uSW5mbworCQkJCQkJCSBbc3RhSWR4XS4KKwkJCQkJCQkgcGVlck1hYy4KKwkJCQkJCQkgYnl0ZXMpKTsKKwkJCQl3bGFuX2hkZF90ZGxzX3Jlc2V0X3BlZXIocEFkYXB0ZXIsCisJCQkJCQkJIHBIZGRDdHgtPgorCQkJCQkJCSB0ZGxzQ29ubkluZm8KKwkJCQkJCQkgW3N0YUlkeF0uCisJCQkJCQkJIHBlZXJNYWMuYnl0ZXMpOworCQkJCWhkZF9yb2FtX2RlcmVnaXN0ZXJfdGRsc3N0YShwQWRhcHRlciwKKwkJCQkJCQkgICAgcEhkZEN0eC0+CisJCQkJCQkJICAgIHRkbHNDb25uSW5mbworCQkJCQkJCSAgICBbc3RhSWR4XS4KKwkJCQkJCQkgICAgc3RhSWQpOworCQkJCWNkZl9tZW1femVybygmc21lVGRsc1BlZXJTdGF0ZVBhcmFtcywKKwkJCQkJICAgICBzaXplb2YKKwkJCQkJICAgICAoc21lVGRsc1BlZXJTdGF0ZVBhcmFtcykpOworCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMudmRldklkID0KKwkJCQkJcEhkZEN0eC0+dGRsc0Nvbm5JbmZvW3N0YUlkeF0uCisJCQkJCXNlc3Npb25JZDsKKwkJCQljZGZfbWVtX2NvcHkoJnNtZVRkbHNQZWVyU3RhdGVQYXJhbXMuCisJCQkJCSAgICAgcGVlck1hY0FkZHIsCisJCQkJCSAgICAgJnBIZGRDdHgtPgorCQkJCQkgICAgIHRkbHNDb25uSW5mb1tzdGFJZHhdLgorCQkJCQkgICAgIHBlZXJNYWMuYnl0ZXMsCisJCQkJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMucGVlclN0YXRlID0KKwkJCQkJZVNNRV9URExTX1BFRVJfU1RBVEVfVEVBUkRPV047CisKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkJRkwoImNhbGxpbmcgc21lX3VwZGF0ZV90ZGxzX3BlZXJfc3RhdGUgZm9yIHN0YUlkeCAlZCAiCisJCQkJCU1BQ19BRERSRVNTX1NUUiksCisJCQkJCXBIZGRDdHgtPnRkbHNDb25uSW5mb1tzdGFJZHhdLgorCQkJCQlzdGFJZCwKKwkJCQkJTUFDX0FERFJfQVJSQVkocEhkZEN0eC0+CisJCQkJCQkJIHRkbHNDb25uSW5mbworCQkJCQkJCSBbc3RhSWR4XS4KKwkJCQkJCQkgcGVlck1hYy4KKwkJCQkJCQkgYnl0ZXMpKTsKKwkJCQlzdGF0dXMgPQorCQkJCQlzbWVfdXBkYXRlX3RkbHNfcGVlcl9zdGF0ZSgKKwkJCQkJCXBIZGRDdHgtPmhIYWwsCisJCQkJCQkmc21lVGRsc1BlZXJTdGF0ZVBhcmFtcyk7CisJCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJCQkJaGRkTG9nKExPR0UsCisJCQkJCQkgIEZMKCJzbWVfdXBkYXRlX3RkbHNfcGVlcl9zdGF0ZSBmYWlsZWQgZm9yICIKKwkJCQkJCSAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJCSAgTUFDX0FERFJfQVJSQVkKKwkJCQkJCQkgIChwSGRkQ3R4LT4KKwkJCQkJCQkgIHRkbHNDb25uSW5mb1tzdGFJZHhdLgorCQkJCQkJCSAgcGVlck1hYy5ieXRlcykpOworCQkJCX0KKwkJCQl3bGFuX2hkZF90ZGxzX2RlY3JlbWVudF9wZWVyX2NvdW50CisJCQkJCShwQWRhcHRlcik7CisKKwkJCQljZGZfbWVtX3plcm8oJnBIZGRDdHgtPgorCQkJCQkgICAgIHRkbHNDb25uSW5mb1tzdGFJZHhdLgorCQkJCQkgICAgIHBlZXJNYWMsCisJCQkJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCQkJCXBIZGRDdHgtPnRkbHNDb25uSW5mb1tzdGFJZHhdLnN0YUlkID0gMDsKKwkJCQlwSGRkQ3R4LT50ZGxzQ29ubkluZm9bc3RhSWR4XS4KKwkJCQlzZXNzaW9uSWQgPSAyNTU7CisKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgZUNTUl9ST0FNX1JFU1VMVF9URExTX1NIT1VMRF9ESVNDT1ZFUjoKKwl7CisJCS8qIGlnbm9yZSBURExTX1NIT1VMRF9ESVNDT1ZFUiBpZiBhbnkgY29uY3VycmVuY3kgZGV0ZWN0ZWQgKi8KKwkJaWYgKCgoMSA8PCBDREZfU1RBX01PREUpICE9IHBIZGRDdHgtPmNvbmN1cnJlbmN5X21vZGUpIHx8CisJCSAgICAocEhkZEN0eC0+bm9fb2ZfYWN0aXZlX3Nlc3Npb25zW0NERl9TVEFfTU9ERV0gPiAxKSkgeworCQkJaGRkTG9nKExPRzIsCisJCQkJRkwoImNvbmN1cnJlbmN5IGRldGVjdGVkLiBpZ25vcmUgU0hPVUxEX0RJU0NPVkVSIGNvbmN1cnJlbmN5X21vZGU6IDB4JXgsIGFjdGl2ZV9zZXNzaW9uczogJWQiKSwKKwkJCQkgcEhkZEN0eC0+Y29uY3VycmVuY3lfbW9kZSwKKwkJCQkgcEhkZEN0eC0+bm9fb2ZfYWN0aXZlX3Nlc3Npb25zW0NERl9TVEFfTU9ERV0pOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCWN1cnJfcGVlciA9CisJCQl3bGFuX2hkZF90ZGxzX2dldF9wZWVyKHBBZGFwdGVyLAorCQkJCQkgICAgICAgcFJvYW1JbmZvLT5wZWVyTWFjLmJ5dGVzKTsKKwkJaWYgKCFjdXJyX3BlZXIpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiY3Vycl9wZWVyIGlzIG51bGwiKSk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChlVERMU19MSU5LX0NPTk5FQ1RFRCA9PQorCQkJICAgIGN1cnJfcGVlci0+bGlua19zdGF0dXMpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJRkwoIlRETFMgbGluayBzdGF0dXMgaXMgY29ubmVjdGVkLCBpZ25vcmUgU0hPVUxEX0RJU0NPVkVSIikpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIElmIGV4dGVybmFsIGNvbnRyb2wgaXMgZW5hYmxlZCB0aGVuIGluaXRpYXRlCisJCQkJICogVERMUyBvbmx5IGlmIGZvcmNlZCBwZWVyIGlzIHNldCBvdGhlcndpc2UKKwkJCQkgKiBpZ25vcmUgc2hvdWxkIERpc2NvdmVyIHRyaWdnZXIgZnJvbSBmdy4KKwkJCQkgKi8KKwkJCQlpZiAocEhkZEN0eC0+Y29uZmlnLT4KKwkJCQkgICAgZlRETFNFeHRlcm5hbENvbnRyb2wKKwkJCQkgICAgJiYgKGZhbHNlID09CisJCQkJCWN1cnJfcGVlci0+aXNGb3JjZWRQZWVyKSkgeworCQkJCQloZGRMb2coTE9HMiwKKwkJCQkJCUZMCisJCQkJCQkoIlRETFMgRXh0ZXJuYWxDb250cm9sIGVuYWJsZWQgYnV0IGN1cnJfcGVlciBpcyBub3QgZm9yY2VkLCBpZ25vcmUgU0hPVUxEX0RJU0NPVkVSIikpOworCQkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCWhkZExvZyhMT0cyLAorCQkJCQkJRkwKKwkJCQkJCSgiaW5pdGlhdGUgVERMUyBzZXR1cCBvbiBTSE9VTERfRElTQ09WRVIsIGZURExTRXh0ZXJuYWxDb250cm9sOiAlZCwgY3Vycl9wZWVyLT5pc0ZvcmNlZFBlZXI6ICVkLCByZWFzb246ICVkIiksCisJCQkJCQlwSGRkQ3R4LT5jb25maWctPgorCQkJCQkJZlRETFNFeHRlcm5hbENvbnRyb2wsCisJCQkJCQljdXJyX3BlZXItPmlzRm9yY2VkUGVlciwKKwkJCQkJCXBSb2FtSW5mby0+cmVhc29uQ29kZSk7CisJCQkJfQorCQkJCXdsYW5faGRkX3RkbHNfcHJlX3NldHVwX2luaXRfd29yaworCQkJCQkocEhkZFRkbHNDdHgsIGN1cnJfcGVlcik7CisJCQl9CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX1RETFNfU0hPVUxEX1RFQVJET1dOOgorCXsKKwkJY3Vycl9wZWVyID0KKwkJCXdsYW5faGRkX3RkbHNfZmluZF9wZWVyKHBBZGFwdGVyLAorCQkJCQkJcFJvYW1JbmZvLT5wZWVyTWFjLmJ5dGVzLCB0cnVlKTsKKwkJaWYgKCFjdXJyX3BlZXIpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiY3Vycl9wZWVyIGlzIG51bGwiKSk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChlVERMU19MSU5LX0NPTk5FQ1RFRCA9PQorCQkJICAgIGN1cnJfcGVlci0+bGlua19zdGF0dXMpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJICBGTAorCQkJCQkgICgiUmVjZWl2ZWQgU0hPVUxEX1RFQVJET1dOIGZvciBwZWVyICIKKwkJCQkJICBNQUNfQUREUkVTU19TVFIKKwkJCQkJICAiIHN0YUlkOiAlZCwgcmVhc29uOiAlZCIpLAorCQkJCQkgIE1BQ19BRERSX0FSUkFZKHBSb2FtSW5mby0+CisJCQkJCQkJIHBlZXJNYWMuYnl0ZXMpLAorCQkJCQkgIHBSb2FtSW5mby0+c3RhSWQsCisJCQkJCSAgcFJvYW1JbmZvLT5yZWFzb25Db2RlKTsKKworCQkJCWlmIChwUm9hbUluZm8tPnJlYXNvbkNvZGUgPT0KKwkJCQkgICAgZVdOSV9URExTX1RFQVJET1dOX1JFQVNPTl9SU1NJIHx8CisJCQkJICAgIHBSb2FtSW5mby0+cmVhc29uQ29kZSA9PQorCQkJCSAgICBlV05JX1RETFNfRElTQ09OTkVDVEVEX1JFQVNPTl9QRUVSX0RFTEVURSB8fAorCQkJCSAgICBwUm9hbUluZm8tPnJlYXNvbkNvZGUgPT0KKwkJCQkgICAgZVdOSV9URExTX1RFQVJET1dOX1JFQVNPTl9QVFJfVElNRU9VVCB8fAorCQkJCSAgICBwUm9hbUluZm8tPnJlYXNvbkNvZGUgPT0KKwkJCQkgICAgZVdOSV9URExTX1RFQVJET1dOX1JFQVNPTl9OT19SRVNQT05TRSkgeworCQkJCQlyZWFzb24gPQorCQkJCQkJZVNJUl9NQUNfVERMU19URUFSRE9XTl9QRUVSX1VOUkVBQ0hBQkxFOworCQkJCX0gZWxzZQorCQkJCQlyZWFzb24gPQorCQkJCQkJZVNJUl9NQUNfVERMU19URUFSRE9XTl9VTlNQRUNfUkVBU09OOworCisJCQkJd2xhbl9oZGRfdGRsc19pbmRpY2F0ZV90ZWFyZG93bgorCQkJCQkocEhkZFRkbHNDdHgtPnBBZGFwdGVyLCBjdXJyX3BlZXIsCisJCQkJCXJlYXNvbik7CisJCQl9IGVsc2UgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCQkgIEZMCisJCQkJCSAgKCJURExTIGxpbmsgaXMgbm90IGNvbm5lY3RlZCwgaWdub3JlIFNIT1VMRF9URUFSRE9XTiwgcmVhc29uOiAlZCIpLAorCQkJCQkgIHBSb2FtSW5mby0+cmVhc29uQ29kZSk7CisJCQl9CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX1RETFNfU0hPVUxEX1BFRVJfRElTQ09OTkVDVEVEOgorCXsKKwkJY3Vycl9wZWVyID0KKwkJCXdsYW5faGRkX3RkbHNfZmluZF9wZWVyKHBBZGFwdGVyLAorCQkJCQkJcFJvYW1JbmZvLT5wZWVyTWFjLmJ5dGVzLCB0cnVlKTsKKwkJaWYgKCFjdXJyX3BlZXIpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiY3Vycl9wZWVyIGlzIG51bGwiKSk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChlVERMU19MSU5LX0NPTk5FQ1RFRCA9PQorCQkJICAgIGN1cnJfcGVlci0+bGlua19zdGF0dXMpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJICBGTAorCQkJCQkgICgiUmVjZWl2ZWQgU0hPVUxEX1BFRVJfRElTQ09OTkVDVEVEIGZvciBwZWVyICIKKwkJCQkJICBNQUNfQUREUkVTU19TVFIKKwkJCQkJICAiIHN0YUlkOiAlZCwgcmVhc29uOiAlZCIpLAorCQkJCQkgIE1BQ19BRERSX0FSUkFZKHBSb2FtSW5mby0+cGVlck1hYy5ieXRlcyksCisJCQkJCSAgcFJvYW1JbmZvLT5zdGFJZCwKKwkJCQkJICBwUm9hbUluZm8tPnJlYXNvbkNvZGUpOworCisJCQkJaWYgKHBSb2FtSW5mby0+cmVhc29uQ29kZSA9PQorCQkJCSAgICBlV05JX1RETFNfVEVBUkRPV05fUkVBU09OX1JTU0kgfHwKKwkJCQkgICAgcFJvYW1JbmZvLT5yZWFzb25Db2RlID09CisJCQkJICAgIGVXTklfVERMU19ESVNDT05ORUNURURfUkVBU09OX1BFRVJfREVMRVRFIHx8CisJCQkJICAgICBwUm9hbUluZm8tPnJlYXNvbkNvZGUgPT0KKwkJCQkJZVdOSV9URExTX1RFQVJET1dOX1JFQVNPTl9QVFJfVElNRU9VVCB8fAorCQkJCSAgICBwUm9hbUluZm8tPnJlYXNvbkNvZGUgPT0KKwkJCQkJZVdOSV9URExTX1RFQVJET1dOX1JFQVNPTl9OT19SRVNQT05TRSkgeworCQkJCQlyZWFzb24gPQorCQkJCQkJZVNJUl9NQUNfVERMU19URUFSRE9XTl9QRUVSX1VOUkVBQ0hBQkxFOworCQkJCX0gZWxzZQorCQkJCQlyZWFzb24gPQorCQkJCQkJZVNJUl9NQUNfVERMU19URUFSRE9XTl9VTlNQRUNfUkVBU09OOworCisJCQkJd2xhbl9oZGRfdGRsc19pbmRpY2F0ZV90ZWFyZG93bgorCQkJCQkocEhkZFRkbHNDdHgtPnBBZGFwdGVyLCBjdXJyX3BlZXIsCisJCQkJCXJlYXNvbik7CisJCQl9IGVsc2UgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCQkgIEZMCisJCQkJCSAgKCJURExTIGxpbmsgaXMgbm90IGNvbm5lY3RlZCwgaWdub3JlIFNIT1VMRF9QRUVSX0RJU0NPTk5FQ1RFRCwgcmVhc29uOiAlZCIpLAorCQkJCQkgIHBSb2FtSW5mby0+cmVhc29uQ29kZSk7CisJCQl9CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJeworCQlicmVhazsKKwl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworLyoqCisgKiBoZGRfaW5kaWNhdGVfdW5wcm90X21nbXRfZnJhbWUoKSAtIGluZGljYXRlIHVucHJvdGVjdGVkIG1hbmFnZW1lbnQgZnJhbWUKKyAqIEBwQWRhcHRlcjogICAgIHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIKKyAqIEBuRnJhbWVMZW5ndGg6IExlbmd0aCBvZiB0aGUgdW5wcm90ZWN0ZWQgZnJhbWUgYmVpbmcgcGFzc2VkCisgKiBAcGJGcmFtZXM6ICAgICBQb2ludGVyIHRvIHRoZSBmcmFtZSBidWZmZXIKKyAqIEBmcmFtZVR5cGU6ICAgIDgwMi4xMSBmcmFtZSB0eXBlCisgKgorICogVGhpcyBmdW5jdGlvbiBmb3J3YXJkcyB0aGUgdW5wcm90ZWN0ZWQgbWFuYWdlbWVudCBmcmFtZSB0byB0aGUgc3VwcGxpY2FudC4KKyAqCisgKiBSZXR1cm46IG5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQKK2hkZF9pbmRpY2F0ZV91bnByb3RfbWdtdF9mcmFtZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdWludDMyX3QgbkZyYW1lTGVuZ3RoLAorCQkJICAgICAgIHVpbnQ4X3QgKnBiRnJhbWVzLCB1aW50OF90IGZyYW1lVHlwZSkKK3sKKwl1aW50OF90IHR5cGUgPSAwOworCXVpbnQ4X3Qgc3ViVHlwZSA9IDA7CisKKwloZGRMb2coTE9HMSwgRkwoIkZyYW1lIFR5cGUgPSAlZCBGcmFtZSBMZW5ndGggPSAlZCIpLAorCSAgICAgICBmcmFtZVR5cGUsIG5GcmFtZUxlbmd0aCk7CisKKwkvKiBTYW5pdHkgQ2hlY2tzICovCisJaWYgKE5VTEwgPT0gcEFkYXB0ZXIpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwQWRhcHRlciBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKE5VTEwgPT0gcEFkYXB0ZXItPmRldikgeworCQloZGRMb2coTE9HRSwgRkwoInBBZGFwdGVyLT5kZXYgaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IHBBZGFwdGVyLT5tYWdpYykgeworCQloZGRMb2coTE9HRSwgRkwoInBBZGFwdGVyIGhhcyBpbnZhbGlkIG1hZ2ljIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFuRnJhbWVMZW5ndGgpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJGcmFtZSBMZW5ndGggaXMgSW52YWxpZCBaRVJPIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKE5VTEwgPT0gcGJGcmFtZXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwYkZyYW1lcyBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJdHlwZSA9IFdMQU5fSEREX0dFVF9UWVBFX0ZSTV9GQyhwYkZyYW1lc1swXSk7CisJc3ViVHlwZSA9IFdMQU5fSEREX0dFVF9TVUJUWVBFX0ZSTV9GQyhwYkZyYW1lc1swXSk7CisKKwkvKiBHZXQgcEFkYXB0ZXIgZnJvbSBEZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUgKi8KKwlpZiAodHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUgJiYgc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfRElTQVNTT0MpIHsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDExLCAwKSkKKwkJY2ZnODAyMTFfcnhfdW5wcm90X21sbWVfbWdtdChwQWRhcHRlci0+ZGV2LCBwYkZyYW1lcywKKwkJCQkJICAgICBuRnJhbWVMZW5ndGgpOworI2Vsc2UKKwkJY2ZnODAyMTFfc2VuZF91bnByb3RfZGlzYXNzb2MocEFkYXB0ZXItPmRldiwgcGJGcmFtZXMsCisJCQkJCSAgICAgIG5GcmFtZUxlbmd0aCk7CisjZW5kaWYKKwkJcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRQbWZTdGF0cy5udW1VbnByb3REaXNhc3NvY1J4Kys7CisJfSBlbHNlIGlmICh0eXBlID09IFNJUl9NQUNfTUdNVF9GUkFNRSAmJgorCQkgICBzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9ERUFVVEgpIHsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDExLCAwKSkKKwkJY2ZnODAyMTFfcnhfdW5wcm90X21sbWVfbWdtdChwQWRhcHRlci0+ZGV2LCBwYkZyYW1lcywKKwkJCQkJICAgICBuRnJhbWVMZW5ndGgpOworI2Vsc2UKKwkJY2ZnODAyMTFfc2VuZF91bnByb3RfZGVhdXRoKHBBZGFwdGVyLT5kZXYsIHBiRnJhbWVzLAorCQkJCQkgICAgbkZyYW1lTGVuZ3RoKTsKKyNlbmRpZgorCQlwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFBtZlN0YXRzLm51bVVucHJvdERlYXV0aFJ4Kys7CisJfSBlbHNlIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJGcmFtZSB0eXBlICVkIGFuZCBzdWJ0eXBlICVkIGFyZSBub3QgdmFsaWQiKSwKKwkJICAgICAgIHR5cGUsIHN1YlR5cGUpOworCQlyZXR1cm47CisJfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisvKioKKyAqIGhkZF9pbmRpY2F0ZV90c21faWUoKSAtIHNlbmQgdHJhZmZpYyBzdHJlYW0gbWV0cmljcyBpZQorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEB0aWQ6IHRyYWZmaWMgaWRlbnRpZmllcgorICogQHN0YXRlOiBzdGF0ZQorICogQG1lYXNJbnRlcnZhbDogbWVhc3VyZW1lbnQgaW50ZXJ2YWwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRyYWZmaWMgc3RyZWFtIG1ldHJpY3MgSUUgaW5mb3JtYXRpb24gdG8KKyAqIHRoZSBzdXBwbGljYW50IHZpYSB3aXJlbGVzcyBldmVudC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQKK2hkZF9pbmRpY2F0ZV90c21faWUoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVpbnQ4X3QgdGlkLAorCQkgICAgdWludDhfdCBzdGF0ZSwgdWludDE2X3QgbWVhc0ludGVydmFsKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyIGJ1ZltJV19DVVNUT01fTUFYICsgMV07CisJaW50IG5CeXRlcyA9IDA7CisKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikKKwkJcmV0dXJuOworCisJLyogY3JlYXRlIHRoZSBldmVudCAqLworCW1lbXNldCgmd3JxdSwgJ1wwJywgc2l6ZW9mKHdycXUpKTsKKwltZW1zZXQoYnVmLCAnXDAnLCBzaXplb2YoYnVmKSk7CisKKwloZGRMb2coTE9HMSwgIlRTTSBJbmQgdGlkKCVkKSBzdGF0ZSglZCkgTWVhc0ludCglZCkiLAorCSAgICAgICB0aWQsIHN0YXRlLCBtZWFzSW50ZXJ2YWwpOworCisJbkJ5dGVzID0KKwkJc25wcmludGYoYnVmLCBJV19DVVNUT01fTUFYLCAiVFNNSUU9JWQ6JWQ6JWQiLCB0aWQsIHN0YXRlLAorCQkJIG1lYXNJbnRlcnZhbCk7CisKKwl3cnF1LmRhdGEucG9pbnRlciA9IGJ1ZjsKKwl3cnF1LmRhdGEubGVuZ3RoID0gbkJ5dGVzOworCS8qIHNlbmQgdGhlIGV2ZW50ICovCisJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWRhcHRlci0+ZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmKTsKK30KKworLyoqCisgKiBoZGRfaW5kaWNhdGVfY2NrbV9wcmVfYXV0aCgpIC0gc2VuZCBjY2ttIHByZWF1dGggaW5kaWNhdGlvbgorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IHBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBjY2ttIHByZWF1dGggaW5kaWNhdGlvbiB0byB0aGUgc3VwcGxpY2FudAorICogdmlhIHdpcmVsZXNzIGN1c3RvbSBldmVudC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQKK2hkZF9pbmRpY2F0ZV9jY2ttX3ByZV9hdXRoKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbykKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJY2hhciBidWZbSVdfQ1VTVE9NX01BWCArIDFdOworCWNoYXIgKnBvcyA9IGJ1ZjsKKwlpbnQgbkJ5dGVzID0gMCwgZnJlZUJ5dGVzID0gSVdfQ1VTVE9NX01BWDsKKworCWlmICgoTlVMTCA9PSBwQWRhcHRlcikgfHwgKE5VTEwgPT0gcFJvYW1JbmZvKSkKKwkJcmV0dXJuOworCisJLyogY3JlYXRlIHRoZSBldmVudCAqLworCW1lbXNldCgmd3JxdSwgJ1wwJywgc2l6ZW9mKHdycXUpKTsKKwltZW1zZXQoYnVmLCAnXDAnLCBzaXplb2YoYnVmKSk7CisKKwkvKiBUaW1lc3RhbXAwIGlzIGxvd2VyIDMyIGJpdHMgYW5kIFRpbWVzdGFtcDEgaXMgdXBwZXIgMzIgYml0cyAqLworCWhkZExvZyhMT0cxLAorCSAgICAgICAiQ0NYUFJFQVVUSE5PVElGWT0iIE1BQ19BRERSRVNTX1NUUiAiICVkOiVkIiwKKwkgICAgICAgTUFDX0FERFJfQVJSQVkocFJvYW1JbmZvLT5ic3NpZC5ieXRlcyksCisJICAgICAgIHBSb2FtSW5mby0+dGltZXN0YW1wWzBdLCBwUm9hbUluZm8tPnRpbWVzdGFtcFsxXSk7CisKKwluQnl0ZXMgPSBzbnByaW50Zihwb3MsIGZyZWVCeXRlcywgIkNDWFBSRUFVVEhOT1RJRlk9Iik7CisJcG9zICs9IG5CeXRlczsKKwlmcmVlQnl0ZXMgLT0gbkJ5dGVzOworCisJY2RmX21lbV9jb3B5KHBvcywgcFJvYW1JbmZvLT5ic3NpZC5ieXRlcywgQ0RGX01BQ19BRERSX1NJWkUpOworCXBvcyArPSBDREZfTUFDX0FERFJfU0laRTsKKwlmcmVlQnl0ZXMgLT0gQ0RGX01BQ19BRERSX1NJWkU7CisKKwluQnl0ZXMgPSBzbnByaW50Zihwb3MsIGZyZWVCeXRlcywgIiAldToldSIsCisJCQkgIHBSb2FtSW5mby0+dGltZXN0YW1wWzBdLCBwUm9hbUluZm8tPnRpbWVzdGFtcFsxXSk7CisJZnJlZUJ5dGVzIC09IG5CeXRlczsKKworCXdycXUuZGF0YS5wb2ludGVyID0gYnVmOworCXdycXUuZGF0YS5sZW5ndGggPSAoSVdfQ1VTVE9NX01BWCAtIGZyZWVCeXRlcyk7CisKKwkvKiBzZW5kIHRoZSBldmVudCAqLworCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1Zik7Cit9CisKKy8qKgorICogaGRkX2luZGljYXRlX2VzZV9hZGpfYXBfcmVwX2luZCgpIC0gc2VuZCBhZGphY2VudCBBUCByZXBvcnQgaW5kaWNhdGlvbgorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IHBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCitoZGRfaW5kaWNhdGVfZXNlX2Fkal9hcF9yZXBfaW5kKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCXRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyIGJ1ZltJV19DVVNUT01fTUFYICsgMV07CisJaW50IG5CeXRlcyA9IDA7CisKKwlpZiAoKE5VTEwgPT0gcEFkYXB0ZXIpIHx8IChOVUxMID09IHBSb2FtSW5mbykpCisJCXJldHVybjsKKworCS8qIGNyZWF0ZSB0aGUgZXZlbnQgKi8KKwltZW1zZXQoJndycXUsICdcMCcsIHNpemVvZih3cnF1KSk7CisJbWVtc2V0KGJ1ZiwgJ1wwJywgc2l6ZW9mKGJ1ZikpOworCisJaGRkTG9nKExPRzEsICJDQ1hBREpBUFJFUD0ldSIsIHBSb2FtSW5mby0+dHNtUm9hbURlbGF5KTsKKworCW5CeXRlcyA9CisJCXNucHJpbnRmKGJ1ZiwgSVdfQ1VTVE9NX01BWCwgIkNDWEFESkFQUkVQPSV1IiwKKwkJCSBwUm9hbUluZm8tPnRzbVJvYW1EZWxheSk7CisKKwl3cnF1LmRhdGEucG9pbnRlciA9IGJ1ZjsKKwl3cnF1LmRhdGEubGVuZ3RoID0gbkJ5dGVzOworCisJLyogc2VuZCB0aGUgZXZlbnQgKi8KKwl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZGFwdGVyLT5kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBidWYpOworfQorCisvKioKKyAqIGhkZF9pbmRpY2F0ZV9lc2VfYmNuX3JlcG9ydF9ub19yZXN1bHRzKCkgLSBiZWFjb24gcmVwb3J0IG5vIHNjYW4gcmVzdWx0cworICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBtZWFzdXJlbWVudFRva2VuOiBtZWFzdXJlbWVudCB0b2tlbgorICogQGZsYWc6IGZsYWcKKyAqIEBudW1Cc3M6IG51bWJlciBvZiBic3MKKyAqCisgKiBJZiB0aGUgbWVhc3VyZW1lbnQgaXMgbm9uZSBhbmQgbm8gc2NhbiByZXN1bHRzIGZvdW5kLAorICogaW5kaWNhdGUgdGhlIHN1cHBsaWNhbnQgYWJvdXQgbWVhc3VyZW1lbnQgZG9uZS4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZAoraGRkX2luZGljYXRlX2VzZV9iY25fcmVwb3J0X25vX3Jlc3VsdHMoY29uc3QgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgICAgIGNvbnN0IHVpbnQxNl90IG1lYXN1cmVtZW50VG9rZW4sCisJCQkJICAgICAgIGNvbnN0IGJvb2wgZmxhZywgY29uc3QgdWludDhfdCBudW1Cc3MpCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWNoYXIgYnVmW0lXX0NVU1RPTV9NQVhdOworCWNoYXIgKnBvcyA9IGJ1ZjsKKwlpbnQgbkJ5dGVzID0gMCwgZnJlZUJ5dGVzID0gSVdfQ1VTVE9NX01BWDsKKworCW1lbXNldCgmd3JxdSwgJ1wwJywgc2l6ZW9mKHdycXUpKTsKKwltZW1zZXQoYnVmLCAnXDAnLCBzaXplb2YoYnVmKSk7CisKKwloZGRMb2coTE9HMSwgRkwoIkNDWEJDTlJFUD0lZCAlZCAlZCIpLCBtZWFzdXJlbWVudFRva2VuLAorCSAgICAgICBmbGFnLCBudW1Cc3MpOworCisJbkJ5dGVzID0KKwkJc25wcmludGYocG9zLCBmcmVlQnl0ZXMsICJDQ1hCQ05SRVA9JWQgJWQgJWQiLCBtZWFzdXJlbWVudFRva2VuLAorCQkJIGZsYWcsIG51bUJzcyk7CisKKwl3cnF1LmRhdGEucG9pbnRlciA9IGJ1ZjsKKwl3cnF1LmRhdGEubGVuZ3RoID0gbkJ5dGVzOworCS8qIHNlbmQgdGhlIGV2ZW50ICovCisJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWRhcHRlci0+ZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmKTsKK30KKworLyoqCisgKiBoZGRfaW5kaWNhdGVfZXNlX2Jjbl9yZXBvcnRfaW5kKCkgLSBzZW5kIGJlYWNvbiByZXBvcnQgaW5kaWNhdGlvbgorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IHBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKgorICogSWYgdGhlIG1lYXN1cmVtZW50IGlzIG5vbmUgYW5kIG5vIHNjYW4gcmVzdWx0cyBmb3VuZCwKKyAqIGluZGljYXRlIHRoZSBzdXBwbGljYW50IGFib3V0IG1lYXN1cmVtZW50IGRvbmUuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCitoZGRfaW5kaWNhdGVfZXNlX2Jjbl9yZXBvcnRfaW5kKGNvbnN0IGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCWNvbnN0IHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyIGJ1ZltJV19DVVNUT01fTUFYXTsKKwljaGFyICpwb3MgPSBidWY7CisJaW50IG5CeXRlcyA9IDAsIGZyZWVCeXRlcyA9IElXX0NVU1RPTV9NQVg7CisJdWludDhfdCBpID0gMCwgbGVuID0gMDsKKwl1aW50OF90IHRvdF9iY25faWVMZW4gPSAwOyAgLyogdG90YWwgc2l6ZSBvZiB0aGUgYmVhY29uIHJlcG9ydCBkYXRhICovCisJdWludDhfdCBsYXN0U2VudCA9IDAsIHNlbmRCc3MgPSAwOworCWludCBiY25SZXBGaWVsZFNpemUgPQorCQlzaXplb2YocFJvYW1JbmZvLT5wRXNlQmNuUmVwb3J0UnNwLT5iY25SZXBCc3NJbmZvWzBdLgorCQkgICAgICAgYmNuUmVwb3J0RmllbGRzKTsKKwl1aW50OF90IGllTGVuQnl0ZSA9IDE7CisJLyoKKwkgKiBDQ1hCQ05SRVA9bWVhc190b2s8c3A+ZmxhZzxzcD5ub19vZl9ic3M8c3A+dG90X2Jjbl9pZV9sZW4gPSAxOCBieXRlcworCSAqLworI2RlZmluZSBFU0VCQ05SRVBIRUFERVJfTEVOICAoMTgpCisKKwlpZiAoKE5VTEwgPT0gcEFkYXB0ZXIpIHx8IChOVUxMID09IHBSb2FtSW5mbykpCisJCXJldHVybjsKKworCS8qCisJICogQ3VzdG9tIGV2ZW50IGNhbiBwYXNzIG1heGltdW0gb2YgMjU2IGJ5dGVzIG9mIGRhdGEsCisJICogYmFzZWQgb24gdGhlIElFIGxlbiB3ZSBuZWVkIHRvIGlkZW50aWZ5IGhvdyBtYW55IEJTUyBpbmZvIGNhbgorCSAqIGJlIGZpbGxlZCBpbiB0byBjdXN0b20gZXZlbnQgZGF0YS4KKwkgKi8KKwkvKgorCSAqIG1lYXNfdG9rPHNwPmZsYWc8c3A+bm9fb2ZfYnNzPHNwPnRvdF9iY25faWVfbGVuIGJjbl9yZXBfZGF0YQorCSAqIGJjbl9yZXBfZGF0YSB3aWxsIGhhdmUgYmNuX3JlcF9maWVsZHMsaWVfbGVuLGllIHdpdGhvdXQgYW55IHNwYWNlcworCSAqIENDWEJDTlJFUD1tZWFzX3RvazxzcD5mbGFnPHNwPm5vX29mX2JzczxzcD50b3RfYmNuX2llX2xlbiA9IDE4IGJ5dGVzCisJICovCisKKwlpZiAoKHBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+ZmxhZyA+PiAxKQorCSAgICAmJiAoIXBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+bnVtQnNzKSkgeworCQloZGRMb2coTE9HMSwKKwkJICAgICAgICJNZWFzdXJlbWVudCBEb25lIGJ1dCBubyBzY2FuIHJlc3VsdHMiKTsKKwkJLyogSWYgdGhlIG1lYXN1cmVtZW50IGlzIG5vbmUgYW5kIG5vIHNjYW4gcmVzdWx0cyBmb3VuZCwKKwkJICAgaW5kaWNhdGUgdGhlIHN1cHBsaWNhbnQgYWJvdXQgbWVhc3VyZW1lbnQgZG9uZSAqLworCQloZGRfaW5kaWNhdGVfZXNlX2Jjbl9yZXBvcnRfbm9fcmVzdWx0cygKKwkJCQlwQWRhcHRlciwKKwkJCQlwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPgorCQkJCW1lYXN1cmVtZW50VG9rZW4sCisJCQkJcFJvYW1JbmZvLT5wRXNlQmNuUmVwb3J0UnNwLT5mbGFnLAorCQkJCXBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+bnVtQnNzKTsKKwl9IGVsc2UgeworCQl3aGlsZSAobGFzdFNlbnQgPCBwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPm51bUJzcykgeworCQkJbWVtc2V0KCZ3cnF1LCAnXDAnLCBzaXplb2Yod3JxdSkpOworCQkJbWVtc2V0KGJ1ZiwgJ1wwJywgc2l6ZW9mKGJ1ZikpOworCQkJdG90X2Jjbl9pZUxlbiA9IDA7CisJCQlzZW5kQnNzID0gMDsKKwkJCXBvcyA9IGJ1ZjsKKwkJCWZyZWVCeXRlcyA9IElXX0NVU1RPTV9NQVg7CisKKwkJCWZvciAoaSA9IGxhc3RTZW50OworCQkJICAgICBpIDwgcFJvYW1JbmZvLT5wRXNlQmNuUmVwb3J0UnNwLT5udW1Cc3M7IGkrKykgeworCQkJCWxlbiA9CisJCQkJCWJjblJlcEZpZWxkU2l6ZSArIGllTGVuQnl0ZSArCisJCQkJCXBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+CisJCQkJCWJjblJlcEJzc0luZm9baV0uaWVMZW47CisJCQkJaWYgKChsZW4gKyB0b3RfYmNuX2llTGVuKSA+CisJCQkJICAgIChJV19DVVNUT01fTUFYIC0gRVNFQkNOUkVQSEVBREVSX0xFTikpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXRvdF9iY25faWVMZW4gKz0gbGVuOworCQkJCXNlbmRCc3MrKzsKKwkJCQloZGRMb2coTE9HMSwgImkoJWQpIHNpemVvZiBiY25SZXBvcnRGaWVsZHMoJWQpIEllTGVuZ3RoKCVkKSBMZW5ndGggb2YgSWUoJWQpIHRvdExlbiglZCkiLAorCQkJCSAgICAgICBpLCBiY25SZXBGaWVsZFNpemUsIDEsCisJCQkJICAgICAgIHBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+CisJCQkJICAgICAgIGJjblJlcEJzc0luZm9baV0uaWVMZW4sIHRvdF9iY25faWVMZW4pOworCQkJfQorCisJCQloZGRMb2coTE9HMSwgIlNlbmRpbmcgJWQgQlNTIEluZm8iLAorCQkJICAgICAgIHNlbmRCc3MpOworCQkJaGRkTG9nKExPRzEsICJDQ1hCQ05SRVA9JWQgJWQgJWQgJWQiLAorCQkJICAgICAgIHBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+bWVhc3VyZW1lbnRUb2tlbiwKKwkJCSAgICAgICBwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPmZsYWcsIHNlbmRCc3MsCisJCQkgICAgICAgdG90X2Jjbl9pZUxlbik7CisKKwkJCW5CeXRlcyA9IHNucHJpbnRmKHBvcywgZnJlZUJ5dGVzLCAiQ0NYQkNOUkVQPSVkICVkICVkICIsCisJCQkJCSAgcFJvYW1JbmZvLT5wRXNlQmNuUmVwb3J0UnNwLT4KKwkJCQkJICBtZWFzdXJlbWVudFRva2VuLAorCQkJCQkgIHBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+ZmxhZywKKwkJCQkJICBzZW5kQnNzKTsKKwkJCXBvcyArPSBuQnl0ZXM7CisJCQlmcmVlQnl0ZXMgLT0gbkJ5dGVzOworCisJCQkvKiBDb3B5IHRvdGFsIEJlYWNvbiByZXBvcnQgZGF0YSBsZW5ndGggKi8KKwkJCWNkZl9tZW1fY29weShwb3MsIChjaGFyICopJnRvdF9iY25faWVMZW4sCisJCQkJICAgICBzaXplb2YodG90X2Jjbl9pZUxlbikpOworCQkJcG9zICs9IHNpemVvZih0b3RfYmNuX2llTGVuKTsKKwkJCWZyZWVCeXRlcyAtPSBzaXplb2YodG90X2Jjbl9pZUxlbik7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBzZW5kQnNzOyBpKyspIHsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgIkNoYW5OdW0oJWQpIFNwYXJlKCVkKSBNZWFzRHVyYXRpb24oJWQpIgorCQkJCSAgICAgICAiIFBoeVR5cGUoJWQpIFJlY3ZTaWdQb3dlciglZCkgUGFyZW50VFNGKCV1KSIKKwkJCQkgICAgICAgIiBUYXJnZXRUU0ZbMF0oJXUpIFRhcmdldFRTRlsxXSgldSkgQmVhY29uSW50ZXJ2YWwoJXUpIgorCQkJCSAgICAgICAiIENhcGFiaWxpdHlJbmZvKCVkKSBCU1NJRCglMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCkiLAorCQkJCSAgICAgICBwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPgorCQkJCSAgICAgICBiY25SZXBCc3NJbmZvW2kgKworCQkJCQkJICAgICBsYXN0U2VudF0uYmNuUmVwb3J0RmllbGRzLgorCQkJCSAgICAgICBDaGFuTnVtLAorCQkJCSAgICAgICBwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPgorCQkJCSAgICAgICBiY25SZXBCc3NJbmZvW2kgKworCQkJCQkJICAgICBsYXN0U2VudF0uYmNuUmVwb3J0RmllbGRzLgorCQkJCSAgICAgICBTcGFyZSwKKwkJCQkgICAgICAgcFJvYW1JbmZvLT5wRXNlQmNuUmVwb3J0UnNwLT4KKwkJCQkgICAgICAgYmNuUmVwQnNzSW5mb1tpICsKKwkJCQkJCSAgICAgbGFzdFNlbnRdLmJjblJlcG9ydEZpZWxkcy4KKwkJCQkgICAgICAgTWVhc0R1cmF0aW9uLAorCQkJCSAgICAgICBwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPgorCQkJCSAgICAgICBiY25SZXBCc3NJbmZvW2kgKworCQkJCQkJICAgICBsYXN0U2VudF0uYmNuUmVwb3J0RmllbGRzLgorCQkJCSAgICAgICBQaHlUeXBlLAorCQkJCSAgICAgICBwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPgorCQkJCSAgICAgICBiY25SZXBCc3NJbmZvW2kgKworCQkJCQkJICAgICBsYXN0U2VudF0uYmNuUmVwb3J0RmllbGRzLgorCQkJCSAgICAgICBSZWN2U2lnUG93ZXIsCisJCQkJICAgICAgIHBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+CisJCQkJICAgICAgIGJjblJlcEJzc0luZm9baSArCisJCQkJCQkgICAgIGxhc3RTZW50XS5iY25SZXBvcnRGaWVsZHMuCisJCQkJICAgICAgIFBhcmVudFRzZiwKKwkJCQkgICAgICAgcFJvYW1JbmZvLT5wRXNlQmNuUmVwb3J0UnNwLT4KKwkJCQkgICAgICAgYmNuUmVwQnNzSW5mb1tpICsKKwkJCQkJCSAgICAgbGFzdFNlbnRdLmJjblJlcG9ydEZpZWxkcy4KKwkJCQkgICAgICAgVGFyZ2V0VHNmWzBdLAorCQkJCSAgICAgICBwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPgorCQkJCSAgICAgICBiY25SZXBCc3NJbmZvW2kgKworCQkJCQkJICAgICBsYXN0U2VudF0uYmNuUmVwb3J0RmllbGRzLgorCQkJCSAgICAgICBUYXJnZXRUc2ZbMV0sCisJCQkJICAgICAgIHBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+CisJCQkJICAgICAgIGJjblJlcEJzc0luZm9baSArCisJCQkJCQkgICAgIGxhc3RTZW50XS5iY25SZXBvcnRGaWVsZHMuCisJCQkJICAgICAgIEJjbkludGVydmFsLAorCQkJCSAgICAgICBwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPgorCQkJCSAgICAgICBiY25SZXBCc3NJbmZvW2kgKworCQkJCQkJICAgICBsYXN0U2VudF0uYmNuUmVwb3J0RmllbGRzLgorCQkJCSAgICAgICBDYXBhYmlsaXR5SW5mbywKKwkJCQkgICAgICAgcFJvYW1JbmZvLT5wRXNlQmNuUmVwb3J0UnNwLT4KKwkJCQkgICAgICAgYmNuUmVwQnNzSW5mb1tpICsKKwkJCQkJCSAgICAgbGFzdFNlbnRdLmJjblJlcG9ydEZpZWxkcy4KKwkJCQkgICAgICAgQnNzaWRbMF0sCisJCQkJICAgICAgIHBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+CisJCQkJICAgICAgIGJjblJlcEJzc0luZm9baSArCisJCQkJCQkgICAgIGxhc3RTZW50XS5iY25SZXBvcnRGaWVsZHMuCisJCQkJICAgICAgIEJzc2lkWzFdLAorCQkJCSAgICAgICBwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPgorCQkJCSAgICAgICBiY25SZXBCc3NJbmZvW2kgKworCQkJCQkJICAgICBsYXN0U2VudF0uYmNuUmVwb3J0RmllbGRzLgorCQkJCSAgICAgICBCc3NpZFsyXSwKKwkJCQkgICAgICAgcFJvYW1JbmZvLT5wRXNlQmNuUmVwb3J0UnNwLT4KKwkJCQkgICAgICAgYmNuUmVwQnNzSW5mb1tpICsKKwkJCQkJCSAgICAgbGFzdFNlbnRdLmJjblJlcG9ydEZpZWxkcy4KKwkJCQkgICAgICAgQnNzaWRbM10sCisJCQkJICAgICAgIHBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+CisJCQkJICAgICAgIGJjblJlcEJzc0luZm9baSArCisJCQkJCQkgICAgIGxhc3RTZW50XS5iY25SZXBvcnRGaWVsZHMuCisJCQkJICAgICAgIEJzc2lkWzRdLAorCQkJCSAgICAgICBwUm9hbUluZm8tPnBFc2VCY25SZXBvcnRSc3AtPgorCQkJCSAgICAgICBiY25SZXBCc3NJbmZvW2kgKworCQkJCQkJICAgICBsYXN0U2VudF0uYmNuUmVwb3J0RmllbGRzLgorCQkJCSAgICAgICBCc3NpZFs1XSk7CisKKwkJCQkvKiBiY24gcmVwb3J0IGZpZWxkcyBhcmUgY29waWVkICovCisJCQkJbGVuID0KKwkJCQkJc2l6ZW9mKHBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+CisJCQkJCSAgICAgICBiY25SZXBCc3NJbmZvW2kgKworCQkJCQkJCSAgICAgbGFzdFNlbnRdLgorCQkJCQkgICAgICAgYmNuUmVwb3J0RmllbGRzKTsKKwkJCQljZGZfbWVtX2NvcHkocG9zLAorCQkJCQkgICAgIChjaGFyICopJnBSb2FtSW5mby0+CisJCQkJCSAgICAgcEVzZUJjblJlcG9ydFJzcC0+YmNuUmVwQnNzSW5mb1tpICsKKwkJCQkJCQkJCSAgICAgbGFzdFNlbnRdLgorCQkJCQkgICAgIGJjblJlcG9ydEZpZWxkcywgbGVuKTsKKwkJCQlwb3MgKz0gbGVuOworCQkJCWZyZWVCeXRlcyAtPSBsZW47CisKKwkJCQkvKiBBZGQgMSBieXRlIG9mIGllIGxlbiAqLworCQkJCWxlbiA9CisJCQkJCXBSb2FtSW5mby0+cEVzZUJjblJlcG9ydFJzcC0+CisJCQkJCWJjblJlcEJzc0luZm9baSArIGxhc3RTZW50XS5pZUxlbjsKKwkJCQljZGZfbWVtX2NvcHkocG9zLCAoY2hhciAqKSZsZW4sIHNpemVvZihsZW4pKTsKKwkJCQlwb3MgKz0gc2l6ZW9mKGxlbik7CisJCQkJZnJlZUJ5dGVzIC09IHNpemVvZihsZW4pOworCisJCQkJLyogY29weSBJRSBmcm9tIHNjYW4gcmVzdWx0cyAqLworCQkJCWNkZl9tZW1fY29weShwb3MsCisJCQkJCSAgICAgKGNoYXIgKilwUm9hbUluZm8tPgorCQkJCQkgICAgIHBFc2VCY25SZXBvcnRSc3AtPmJjblJlcEJzc0luZm9baSArCisJCQkJCQkJCQkgICAgIGxhc3RTZW50XS4KKwkJCQkJICAgICBwQnVmLCBsZW4pOworCQkJCXBvcyArPSBsZW47CisJCQkJZnJlZUJ5dGVzIC09IGxlbjsKKwkJCX0KKworCQkJd3JxdS5kYXRhLnBvaW50ZXIgPSBidWY7CisJCQl3cnF1LmRhdGEubGVuZ3RoID0gSVdfQ1VTVE9NX01BWCAtIGZyZWVCeXRlczsKKworCQkJLyogc2VuZCB0aGUgZXZlbnQgKi8KKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsCisJCQkJCSAgICBidWYpOworCQkJbGFzdFNlbnQgKz0gc2VuZEJzczsKKwkJfQorCX0KK30KKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKworLyoqCisgKiBoZGRfc21lX3JvYW1fY2FsbGJhY2soKSAtIGhkZCBzbWUgcm9hbSBjYWxsYmFjaworICogQHBDb250ZXh0OiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICogQHBSb2FtSW5mbzogcG9pbnRlciB0byByb2FtIGluZm8KKyAqIEByb2FtSWQ6IHJvYW0gaWQKKyAqIEByb2FtU3RhdHVzOiByb2FtIHN0YXR1cworICogQHJvYW1SZXN1bHQ6IHJvYW0gcmVzdWx0CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMKK2hkZF9zbWVfcm9hbV9jYWxsYmFjayh2b2lkICpwQ29udGV4dCwgdENzclJvYW1JbmZvICpwUm9hbUluZm8sIHVpbnQzMl90IHJvYW1JZCwKKwkJICAgICAgZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1cywgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCkKK3sKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QgKikgcENvbnRleHQ7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IE5VTEw7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBOVUxMOworCisJaGRkTG9nKExPRzIsCisJCSAgIkNTUiBDYWxsYmFjazogc3RhdHVzPSAlZCByZXN1bHQ9ICVkIHJvYW1JRD0lZCIsCisJCSAgcm9hbVN0YXR1cywgcm9hbVJlc3VsdCwgcm9hbUlkKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICgoTlVMTCA9PSBwQWRhcHRlcikgfHwgKFdMQU5fSEREX0FEQVBURVJfTUFHSUMgIT0gcEFkYXB0ZXItPm1hZ2ljKSkgeworCQloZGRMb2coTE9HUCwgImludmFsaWQgYWRhcHRlciBvciBhZGFwdGVyIGhhcyBpbnZhbGlkIG1hZ2ljIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwlwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwlzd2l0Y2ggKHJvYW1TdGF0dXMpIHsKKwljYXNlIGVDU1JfUk9BTV9TRVNTSU9OX09QRU5FRDoKKwkJaWYgKHBBZGFwdGVyICE9IE5VTEwpIHsKKwkJCXNldF9iaXQoU01FX1NFU1NJT05fT1BFTkVELCAmcEFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKwkJCWNvbXBsZXRlKCZwQWRhcHRlci0+c2Vzc2lvbl9vcGVuX2NvbXBfdmFyKTsKKwkJfQorCQlicmVhazsKKworI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IFwKK2RlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwkvKgorCSAqIFdlIGRpZCBwcmUtYXV0aCx0aGVuIHdlIGF0dGVtcHRlZCBhIDExciBvciBlc2UgcmVhc3NvYy4KKwkgKiByZWFzc29jIGZhaWxlZCBkdWUgdG8gZmFpbHVyZSwgdGltZW91dCwgcmVqZWN0IGZyb20gYXAKKwkgKiBpbiBhbnkgY2FzZSB0ZWxsIHRoZSBPUywgb3VyIGNhcnJpZXIgaXMgb2ZmIGFuZCBtYXJrCisJICogaW50ZXJmYWNlIGRvd24uCisJICovCisJY2FzZSBlQ1NSX1JPQU1fRlRfUkVBU1NPQ19GQUlMRUQ6CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwKKwkJICAgICAgICgiUmVhc3NvYyBGYWlsZWQgd2l0aCByb2FtU3RhdHVzOiAlZCByb2FtUmVzdWx0OiAlZCBTZXNzaW9uSUQ6ICVkIiksCisJCSAgICAgICByb2FtU3RhdHVzLCByb2FtUmVzdWx0LCBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJY2RmX3JldF9zdGF0dXMgPQorCQkJaGRkX2Rpc19jb25uZWN0X2hhbmRsZXIocEFkYXB0ZXIsIHBSb2FtSW5mbywgcm9hbUlkLAorCQkJCQkJcm9hbVN0YXR1cywgcm9hbVJlc3VsdCk7CisJCS8qCisJCSAqIENoZWNrIGlmIE1jYXN0L0JjYXN0IEZpbHRlcnMgYXJlIHNldCwgaWYgeWVzCisJCSAqIGNsZWFyIHRoZSBmaWx0ZXJzIGhlcmUuCisJCSAqLworCQlpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldCA9PQorCQkgICAgdHJ1ZSkgeworCQkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+CisJCQloZGRfbWNhc3RiY2FzdF9maWx0ZXJfc2V0ID0gZmFsc2U7CisJCX0KKwkJcEhkZFN0YUN0eC0+ZnRfY2Fycmllcl9vbiA9IGZhbHNlOworCQlwSGRkU3RhQ3R4LT5oZGRfUmVhc3NvY1NjZW5hcmlvID0gZmFsc2U7CisJCWhkZExvZyhMT0cxLAorCQkgICAgICAgRkwoImhkZF9SZWFzc29jU2NlbmFyaW8gc2V0IHRvOiAlZCwgUmVBc3NvYyBGYWlsZWQsIHNlc3Npb246ICVkIiksCisJCSAgICAgICBwSGRkU3RhQ3R4LT5oZGRfUmVhc3NvY1NjZW5hcmlvLCBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfUk9BTV9GVF9TVEFSVDoKKwkJLyoKKwkJICogV2hlbiB3ZSByb2FtIGZvciBFU0UgYW5kIDExciwgd2UgZG9udCB3YW50IHRoZSBPUyB0byBiZQorCQkgKiBpbmZvcm1lZCB0aGF0IHRoZSBsaW5rIGlzIGRvd24uIFNvIG1hcmsgdGhlIGxpbmsgcmVhZHkgZm9yCisJCSAqIGZ0X3N0YXJ0LiBBZnRlciB0aGlzIHRoZSBlQ1NSX1JPQU1fU0hPVUxEX1JPQU0gd2lsbAorCQkgKiBiZSByZWNlaXZlZC4gV2hlcmUgaW4gd2Ugd2lsbCBub3QgbWFyayB0aGUgbGluayBkb3duCisJCSAqIEFsc28gd2Ugd2FudCB0byBzdG9wIHR4IGF0IHRoaXMgcG9pbnQgd2hlbiB3ZSB3aWxsIGJlCisJCSAqIGRvaW5nIGRpc2Fzc29jIGF0IHRoaXMgdGltZS4gVGhpcyBzYXZlcyAzMC02MCBtc2VjCisJCSAqIGFmdGVyIHJlYXNzb2MuCisJCSAqLworCXsKKwkJaGRkTG9nKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCQl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLCBXTEFOX05FVElGX1RYX0RJU0FCTEUsCisJCQkJCSAgIFdMQU5fQ09OVFJPTF9QQVRIKTsKKwkJc3RhdHVzID0KKwkJCWhkZF9yb2FtX2RlcmVnaXN0ZXJfc3RhKHBBZGFwdGVyLAorCQkJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLgorCQkJCQkJc3RhSWRbMF0pOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQloZGRMb2coTE9HVywKKwkJCQlGTAorCQkJCSgiaGRkX3JvYW1fZGVyZWdpc3Rlcl9zdGEoKSBmYWlsZWQgdG8gZm9yIHN0YUlEICVkLiBTdGF0dXM9JWQgWzB4JXhdIiksCisJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdLAorCQkJCXN0YXR1cywgc3RhdHVzKTsKKwkJCWNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwl9CisJCXBIZGRTdGFDdHgtPmZ0X2NhcnJpZXJfb24gPSB0cnVlOworCQlwSGRkU3RhQ3R4LT5oZGRfUmVhc3NvY1NjZW5hcmlvID0gdHJ1ZTsKKwkJaGRkTG9nKExPRzEsCisJCSAgICAgICBGTCgiaGRkX1JlYXNzb2NTY2VuYXJpbyBzZXQgdG86ICVkLCBkdWUgdG8gZUNTUl9ST0FNX0ZUX1NUQVJULCBzZXNzaW9uOiAlZCIpLAorCQkgICAgICAgcEhkZFN0YUN0eC0+aGRkX1JlYXNzb2NTY2VuYXJpbywgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIGVDU1JfUk9BTV9TSE9VTERfUk9BTToKKwkJLyogRG9udCBuZWVkIHRvIGRvIGFueXRoaW5nICovCisJeworCQloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9CisJCQlXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwkJLyogbm90aWZ5IGFwcHMgdGhhdCB3ZSBjYW4ndCBwYXNzIHRyYWZmaWMgYW55bW9yZSAqLworCQloZGRMb2coTE9HMSwgRkwoIkRpc2FibGluZyBxdWV1ZXMiKSk7CisJCXdsYW5faGRkX25ldGlmX3F1ZXVlX2NvbnRyb2wocEFkYXB0ZXIsCisJCQkJCSAgIFdMQU5fTkVUSUZfVFhfRElTQUJMRSwKKwkJCQkJICAgV0xBTl9DT05UUk9MX1BBVEgpOworI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IFwKK2RlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwkJaWYgKHBIZGRTdGFDdHgtPmZ0X2NhcnJpZXJfb24gPT0gZmFsc2UpIHsKKyNlbmRpZgorCQkJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChwQWRhcHRlciwKKwkJCQkJICAgV0xBTl9ORVRJRl9DQVJSSUVSX09GRiwKKwkJCQkJICAgV0xBTl9DT05UUk9MX1BBVEgpOworI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IFwKK2RlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwl9CisjZW5kaWYKKworI2lmICAhKGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgXAorZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKSkKKwkJLyoKKwkJICogV2Ugc2hvdWxkIGNsZWFyIGFsbCBzdGEgcmVnaXN0ZXIgd2l0aCBUTCwgZm9yIG5vdywgb25seSBvbmUuCisJCSAqLworCQlzdGF0dXMgPQorCQkJaGRkX3JvYW1fZGVyZWdpc3Rlcl9zdGEocEFkYXB0ZXIsCisJCQkJCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uCisJCQkJCQlzdGFJZFswXSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWhkZExvZyhMT0dXLAorCQkJCUZMCisJCQkJKCJoZGRfcm9hbV9kZXJlZ2lzdGVyX3N0YSgpIGZhaWxlZCB0byBmb3Igc3RhSUQgJWQuIFN0YXR1cz0lZCBbMHgleF0iKSwKKwkJCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbMF0sCisJCQkJc3RhdHVzLCBzdGF0dXMpOworCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorI2VuZGlmCisJfQorCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9MT1NUTElOSzoKKwkJaWYgKHJvYW1SZXN1bHQgPT0gZUNTUl9ST0FNX1JFU1VMVF9MT1NUTElOSykgeworCQkJaGRkTG9nKExPRzIsICJSb2FtaW5nIHN0YXJ0ZWQgZHVlIHRvIGNvbm5lY3Rpb24gbG9zdCIpOworCQkJaGRkTG9nKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCQkJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChwQWRhcHRlciwKKwkJCQkJV0xBTl9ORVRJRl9UWF9ESVNBQkxFX05fQ0FSUklFUiwKKwkJCQkJV0xBTl9DT05UUk9MX1BBVEgpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIGVDU1JfUk9BTV9ESVNBU1NPQ0lBVEVEOgorCXsKKwkJaGRkTG9nKExPRzEsICIqKioqZUNTUl9ST0FNX0RJU0FTU09DSUFURUQqKioqIik7CisJCWNkZl9yZXRfc3RhdHVzID0KKwkJCWhkZF9kaXNfY29ubmVjdF9oYW5kbGVyKHBBZGFwdGVyLCBwUm9hbUluZm8sIHJvYW1JZCwKKwkJCQkJCXJvYW1TdGF0dXMsIHJvYW1SZXN1bHQpOworCQkvKiBDaGVjayBpZiBNY2FzdC9CY2FzdCBGaWx0ZXJzIGFyZSBzZXQsIGlmIHllcyBjbGVhciB0aGUgZmlsdGVycyBoZXJlICovCisJCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwkJaWYgKHBIZGRDdHgtPmhkZF9tY2FzdGJjYXN0X2ZpbHRlcl9zZXQgPT0gdHJ1ZSkgeworCQkJaGRkX2NvbmZfbWNhc3RiY2FzdF9maWx0ZXIocEhkZEN0eCwgZmFsc2UpOworCisJCQlpZiAodHJ1ZSA9PQorCQkJICAgIHBIZGRDdHgtPnN1c19yZXNfbWNhc3RiY2FzdF9maWx0ZXJfdmFsaWQpIHsKKwkJCQlwSGRkQ3R4LT5jb25maWd1cmVkTWNhc3RCY2FzdEZpbHRlciA9CisJCQkJCXBIZGRDdHgtPnN1c19yZXNfbWNhc3RiY2FzdF9maWx0ZXI7CisJCQkJcEhkZEN0eC0+CisJCQkJc3VzX3Jlc19tY2FzdGJjYXN0X2ZpbHRlcl92YWxpZCA9CisJCQkJCWZhbHNlOworCQkJfQorCisJCQloZGRMb2coTE9HMSwKKwkJCSAgICAgICAib2ZmbG9hZDogZGlzYXNzb2NpYXRpb24gaGFwcGVuaW5nLCByZXN0b3JpbmcgY29uZmlndXJlZE1jYXN0QmNhc3RGaWx0ZXIiKTsKKwkJCWhkZExvZyhMT0cxLAorCQkJICAgICAgICJNY2FzdEJjYXN0RmlsdGVyID0gJWQiLAorCQkJICAgICAgIHBIZGRDdHgtPmNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyKTsKKwkJCWhkZExvZyhMT0cxLAorCQkJICAgICAgICJvZmZsb2FkOiBhbHJlYWR5IGNhbGxlZCBtY2FzdGJjYXN0IGZpbHRlciIpOworCQkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+CisJCQloZGRfbWNhc3RiY2FzdF9maWx0ZXJfc2V0ID0gZmFsc2U7CisJCX0KKwkJLyogQ2FsbCB0byBjbGVhciBhbnkgTUMgQWRkciBMaXN0IGZpbHRlciBhcHBsaWVkIGFmdGVyCisJCSAqIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbi4KKwkJICovCisJCXdsYW5faGRkX3NldF9tY19hZGRyX2xpc3QocEFkYXB0ZXIsIGZhbHNlKTsKKwl9CisJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fSUJTU19MRUFWRToKKwkJaGRkTG9nKExPRzEsICIqKioqZUNTUl9ST0FNX0lCU1NfTEVBVkUqKioqIik7CisJCWNkZl9yZXRfc3RhdHVzID0KKwkJCWhkZF9kaXNfY29ubmVjdF9oYW5kbGVyKHBBZGFwdGVyLCBwUm9hbUluZm8sIHJvYW1JZCwKKwkJCQkJCXJvYW1TdGF0dXMsIHJvYW1SZXN1bHQpOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OOgorCQloZGRMb2coTE9HMSwgIioqKiplQ1NSX1JPQU1fQVNTT0NJQVRJT05fQ09NUExFVElPTioqKioiKTsKKwkJLyoKKwkJICogVG8gRG8gLSBhZGRyZXNzIHByb2JhYmxlIG1lbW9yeSBsZWFrIHdpdGggV0VQIGVuY3J5cHRpb24gdXBvbgorCQkgKiBzdWNjZXNzZnVsIGFzc29jaWF0aW9uLgorCQkgKi8KKwkJaWYgKGVDU1JfUk9BTV9SRVNVTFRfQVNTT0NJQVRFRCAhPSByb2FtUmVzdWx0KSB7CisJCQkvKiBDbGVhciBzYXZlZCBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGluIEhERCAqLworCQkJaGRkX2Nvbm5fcmVtb3ZlX2Nvbm5lY3RfaW5mbygKKwkJCQlXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSk7CisJCX0KKwkJY2RmX3JldF9zdGF0dXMgPQorCQkJaGRkX2Fzc29jaWF0aW9uX2NvbXBsZXRpb25faGFuZGxlcihwQWRhcHRlciwgcFJvYW1JbmZvLAorCQkJCQkJCSAgIHJvYW1JZCwgcm9hbVN0YXR1cywKKwkJCQkJCQkgICByb2FtUmVzdWx0KTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJCWlmIChwUm9hbUluZm8pCisJCQlwUm9hbUluZm8tPnJvYW1TeW5jaEluUHJvZ3Jlc3MgPSBmYWxzZTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9GQUlMVVJFOgorCQljZGZfcmV0X3N0YXR1cyA9IGhkZF9hc3NvY2lhdGlvbl9jb21wbGV0aW9uX2hhbmRsZXIocEFkYXB0ZXIsCisJCQkJCQkJCSAgICBwUm9hbUluZm8sCisJCQkJCQkJCSAgICByb2FtSWQsCisJCQkJCQkJCSAgICByb2FtU3RhdHVzLAorCQkJCQkJCQkgICAgcm9hbVJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgZUNTUl9ST0FNX0lCU1NfSU5EOgorCQloZGRfcm9hbV9pYnNzX2luZGljYXRpb25faGFuZGxlcihwQWRhcHRlciwgcFJvYW1JbmZvLCByb2FtSWQsCisJCQkJCQkgcm9hbVN0YXR1cywgcm9hbVJlc3VsdCk7CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX1JPQU1fQ09OTkVDVF9TVEFUVVNfVVBEQVRFOgorCQljZGZfcmV0X3N0YXR1cyA9CisJCQlyb2FtX3JvYW1fY29ubmVjdF9zdGF0dXNfdXBkYXRlX2hhbmRsZXIocEFkYXB0ZXIsCisJCQkJCQkJCXBSb2FtSW5mbywKKwkJCQkJCQkJcm9hbUlkLAorCQkJCQkJCQlyb2FtU3RhdHVzLAorCQkJCQkJCQlyb2FtUmVzdWx0KTsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfUk9BTV9NSUNfRVJST1JfSU5EOgorCQljZGZfcmV0X3N0YXR1cyA9CisJCQloZGRfcm9hbV9taWNfZXJyb3JfaW5kaWNhdGlvbl9oYW5kbGVyKHBBZGFwdGVyLAorCQkJCQkJCSAgICAgIHBSb2FtSW5mbywKKwkJCQkJCQkgICAgICByb2FtSWQsCisJCQkJCQkJICAgICAgcm9hbVN0YXR1cywKKwkJCQkJCQkgICAgICByb2FtUmVzdWx0KTsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfUk9BTV9TRVRfS0VZX0NPTVBMRVRFOgorCXsKKwkJY2RmX3JldF9zdGF0dXMgPQorCQkJaGRkX3JvYW1fc2V0X2tleV9jb21wbGV0ZV9oYW5kbGVyKHBBZGFwdGVyLCBwUm9hbUluZm8sCisJCQkJCQkJICByb2FtSWQsIHJvYW1TdGF0dXMsCisJCQkJCQkJICByb2FtUmVzdWx0KTsKKwkJaWYgKGVDU1JfUk9BTV9SRVNVTFRfQVVUSEVOVElDQVRFRCA9PSByb2FtUmVzdWx0KSB7CisJCQlwSGRkU3RhQ3R4LT5oZGRfUmVhc3NvY1NjZW5hcmlvID0gZmFsc2U7CisJCQloZGRMb2coTE9HMSwKKwkJCSAgICAgICBGTCgiaGRkX1JlYXNzb2NTY2VuYXJpbyBzZXQgdG86ICVkLCBzZXQga2V5IGNvbXBsZXRlLCBzZXNzaW9uOiAlZCIpLAorCQkJICAgICAgIHBIZGRTdGFDdHgtPmhkZF9SZWFzc29jU2NlbmFyaW8sCisJCQkgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCX0KKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQlpZiAocFJvYW1JbmZvICE9IE5VTEwpCisJCQlwUm9hbUluZm8tPnJvYW1TeW5jaEluUHJvZ3Jlc3MgPSBmYWxzZTsKKyNlbmRpZgorCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWNhc2UgZUNTUl9ST0FNX0ZUX1JFU1BPTlNFOgorCQloZGRfc2VuZF9mdF9ldmVudChwQWRhcHRlcik7CisJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKSAmJiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQorCWNhc2UgZUNTUl9ST0FNX1BNS19OT1RJRlk6CisJCWlmIChlQ1NSX0FVVEhfVFlQRV9SU04gPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlIHx8CisJCQllQ1NSX0FVVEhfVFlQRV9SU05fODAyMVhfU0hBMjU2ID09CisJCQkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkgeworCQkJLyogbm90aWZ5IHRoZSBzdXBwbGljYW50IG9mIGEgbmV3IGNhbmRpZGF0ZSAqLworCQkJY2RmX3JldF9zdGF0dXMgPQorCQkJCXdsYW5faGRkX2NmZzgwMjExX3Bta3NhX2NhbmRpZGF0ZV9ub3RpZnkoCisJCQkJCQlwQWRhcHRlciwgcFJvYW1JbmZvLCAxLCBmYWxzZSk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlJfTUVUUklDUworCWNhc2UgZUNTUl9ST0FNX1BSRUFVVEhfSU5JVF9OT1RJRlk6CisJCS8qIFRoaXMgZXZlbnQgaXMgdG8gbm90aWZ5IHByZS1hdXRoIGluaXRpYXRpb24gKi8KKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkgICAgd2xhbl9oZGRfY2ZnODAyMTFfcm9hbV9tZXRyaWNzX3ByZWF1dGgocEFkYXB0ZXIsCisJCQkJCQkJICAgcFJvYW1JbmZvKSkgeworCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9QUkVBVVRIX1NUQVRVU19TVUNDRVNTOgorCQkvKgorCQkgKiBUaGlzIGV2ZW50IHdpbGwgbm90aWZ5IHByZS1hdXRoIGNvbXBsZXRpb24gaW4gY2FzZSBvZiBzdWNjZXNzCisJCSAqLworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCSAgICB3bGFuX2hkZF9jZmc4MDIxMV9yb2FtX21ldHJpY3NfcHJlYXV0aF9zdGF0dXMocEFkYXB0ZXIsCisJCQkJCQkJIHBSb2FtSW5mbywgMSkpIHsKKwkJCWNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fUFJFQVVUSF9TVEFUVVNfRkFJTFVSRToKKwkJLyoKKwkJICogVGhpcyBldmVudCB3aWxsIG5vdGlmeSBwcmUtYXV0aCBjb21wbGV0aW9uIGluY2FzZSBvZiBmYWlsdXJlLgorCQkgKi8KKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkgICAgd2xhbl9oZGRfY2ZnODAyMTFfcm9hbV9tZXRyaWNzX3ByZWF1dGhfc3RhdHVzKHBBZGFwdGVyLAorCQkJCQkJCQlwUm9hbUluZm8sIDApKSB7CisJCQljZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCWJyZWFrOworCWNhc2UgZUNTUl9ST0FNX0hBTkRPVkVSX1NVQ0NFU1M6CisJCS8qIFRoaXMgZXZlbnQgaXMgdG8gbm90aWZ5IGhhbmRvdmVyIHN1Y2Nlc3MuCisJCSAgIEl0IHdpbGwgYmUgb25seSBpbnZva2VkIG9uIHN1Y2Nlc3MgKi8KKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkgICAgd2xhbl9oZGRfY2ZnODAyMTFfcm9hbV9tZXRyaWNzX2hhbmRvdmVyKHBBZGFwdGVyLAorCQkJCQkJCSAgICBwUm9hbUluZm8pKSB7CisJCQljZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIGVDU1JfUk9BTV9JTkRJQ0FURV9NR01UX0ZSQU1FOgorCQloZGRfaW5kaWNhdGVfbWdtdF9mcmFtZShwQWRhcHRlciwKKwkJCQkJcFJvYW1JbmZvLT5uRnJhbWVMZW5ndGgsCisJCQkJCXBSb2FtSW5mby0+cGJGcmFtZXMsCisJCQkJCXBSb2FtSW5mby0+ZnJhbWVUeXBlLAorCQkJCQlwUm9hbUluZm8tPnJ4Q2hhbiwgcFJvYW1JbmZvLT5yeFJzc2kpOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9SRU1BSU5fQ0hBTl9SRUFEWToKKwkJaGRkX3JlbWFpbl9jaGFuX3JlYWR5X2hhbmRsZXIocEFkYXB0ZXIsIHBSb2FtSW5mby0+cm9jX3NjYW5faWQpOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9TRU5EX0FDVElPTl9DTkY6CisJCWhkZF9zZW5kX2FjdGlvbl9jbmYocEFkYXB0ZXIsCisJCQkJICAgIChyb2FtUmVzdWx0ID09CisJCQkJICAgICBlQ1NSX1JPQU1fUkVTVUxUX05PTkUpID8gdHJ1ZSA6IGZhbHNlKTsKKwkJYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwljYXNlIGVDU1JfUk9BTV9URExTX1NUQVRVU19VUERBVEU6CisJCWNkZl9yZXRfc3RhdHVzID0KKwkJCWhkZF9yb2FtX3RkbHNfc3RhdHVzX3VwZGF0ZV9oYW5kbGVyKHBBZGFwdGVyLCBwUm9hbUluZm8sCisJCQkJCQkJICAgIHJvYW1JZCwKKwkJCQkJCQkgICAgcm9hbVN0YXR1cywKKwkJCQkJCQkgICAgcm9hbVJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgZUNTUl9ST0FNX1JFU1VMVF9NR01UX1RYX0NPTVBMRVRFX0lORDoKKwkJd2xhbl9oZGRfdGRsc19tZ210X2NvbXBsZXRpb25fY2FsbGJhY2socEFkYXB0ZXIsCisJCQkJCQkgICAgICAgcFJvYW1JbmZvLT5yZWFzb25Db2RlKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJY2FzZSBlQ1NSX1JPQU1fVU5QUk9UX01HTVRfRlJBTUVfSU5EOgorCQloZGRfaW5kaWNhdGVfdW5wcm90X21nbXRfZnJhbWUocEFkYXB0ZXIsCisJCQkJCSAgICAgICBwUm9hbUluZm8tPm5GcmFtZUxlbmd0aCwKKwkJCQkJICAgICAgIHBSb2FtSW5mby0+cGJGcmFtZXMsCisJCQkJCSAgICAgICBwUm9hbUluZm8tPmZyYW1lVHlwZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorCWNhc2UgZUNTUl9ST0FNX1RTTV9JRV9JTkQ6CisJCWhkZF9pbmRpY2F0ZV90c21faWUocEFkYXB0ZXIsIHBSb2FtSW5mby0+dHNtSWUudHNpZCwKKwkJCQkgICAgcFJvYW1JbmZvLT50c21JZS5zdGF0ZSwKKwkJCQkgICAgcFJvYW1JbmZvLT50c21JZS5tc210X2ludGVydmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfUk9BTV9DQ0tNX1BSRUFVVEhfTk9USUZZOgorCXsKKwkJaWYgKGVDU1JfQVVUSF9UWVBFX0NDS01fV1BBID09CisJCSAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUKKwkJICAgIHx8IGVDU1JfQVVUSF9UWVBFX0NDS01fUlNOID09CisJCSAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUpIHsKKwkJCWhkZF9pbmRpY2F0ZV9jY2ttX3ByZV9hdXRoKHBBZGFwdGVyLCBwUm9hbUluZm8pOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgZUNTUl9ST0FNX0VTRV9BREpfQVBfUkVQT1JUX0lORDoKKwl7CisJCWhkZF9pbmRpY2F0ZV9lc2VfYWRqX2FwX3JlcF9pbmQocEFkYXB0ZXIsIHBSb2FtSW5mbyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgZUNTUl9ST0FNX0VTRV9CQ05fUkVQT1JUX0lORDoKKwl7CisJCWhkZF9pbmRpY2F0ZV9lc2VfYmNuX3JlcG9ydF9pbmQocEFkYXB0ZXIsIHBSb2FtSW5mbyk7CisJCWJyZWFrOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBjZGZfcmV0X3N0YXR1czsKK30KKworLyoqCisgKiBoZGRfdHJhbnNsYXRlX3Jzbl90b19jc3JfYXV0aF90eXBlKCkgLSBUcmFuc2xhdGUgUlNOIHRvIENTUiBhdXRoIHR5cGUKKyAqIEBhdXRoX3N1aXRlOiBhdXRoIHN1aXRlCisgKgorICogUmV0dXJuOiBlQ3NyQXV0aFR5cGUgZW51bWVyYXRpb24KKyAqLworZUNzckF1dGhUeXBlIGhkZF90cmFuc2xhdGVfcnNuX3RvX2Nzcl9hdXRoX3R5cGUodWludDhfdCBhdXRoX3N1aXRlWzRdKQoreworCWVDc3JBdXRoVHlwZSBhdXRoX3R5cGU7CisJLyogaXMgdGhlIGF1dGggdHlwZSBzdXBwb3J0ZWQ/ICovCisJaWYgKG1lbWNtcChhdXRoX3N1aXRlLCBjY3BfcnNuX291aTAxLCA0KSA9PSAwKSB7CisJCWF1dGhfdHlwZSA9IGVDU1JfQVVUSF9UWVBFX1JTTjsKKwl9IGVsc2UgaWYgKG1lbWNtcChhdXRoX3N1aXRlLCBjY3BfcnNuX291aTAyLCA0KSA9PSAwKSB7CisJCWF1dGhfdHlwZSA9IGVDU1JfQVVUSF9UWVBFX1JTTl9QU0s7CisJfSBlbHNlCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAobWVtY21wKGF1dGhfc3VpdGUsIGNjcF9yc25fb3VpMDQsIDQpID09IDApIHsKKwkJLyogQ2hlY2sgZm9yIDExciBGVCBBdXRoZW50aWNhdGlvbiB3aXRoIFBTSyAqLworCQlhdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9GVF9SU05fUFNLOworCX0gZWxzZSBpZiAobWVtY21wKGF1dGhfc3VpdGUsIGNjcF9yc25fb3VpMDMsIDQpID09IDApIHsKKwkJLyogQ2hlY2sgZm9yIDExUiBGVCBBdXRoZW50aWNhdGlvbiB3aXRoIDgwMi4xWCAqLworCQlhdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9GVF9SU047CisJfSBlbHNlCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJaWYgKG1lbWNtcChhdXRoX3N1aXRlLCBjY3BfcnNuX291aTA2LCA0KSA9PSAwKSB7CisJCWF1dGhfdHlwZSA9IGVDU1JfQVVUSF9UWVBFX0NDS01fUlNOOworCX0gZWxzZQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJaWYgKG1lbWNtcChhdXRoX3N1aXRlLCBjY3BfcnNuX291aTA3LCA0KSA9PSAwKSB7CisJCWF1dGhfdHlwZSA9IGVDU1JfQVVUSF9UWVBFX1JTTl9QU0tfU0hBMjU2OworCX0gZWxzZSBpZiAobWVtY21wKGF1dGhfc3VpdGUsIGNjcF9yc25fb3VpMDgsIDQpID09IDApIHsKKwkJYXV0aF90eXBlID0gZUNTUl9BVVRIX1RZUEVfUlNOXzgwMjFYX1NIQTI1NjsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJYXV0aF90eXBlID0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjsKKwl9CisJcmV0dXJuIGF1dGhfdHlwZTsKK30KKworLyoqCisgKiBoZGRfdHJhbnNsYXRlX3dwYV90b19jc3JfYXV0aF90eXBlKCkgLSBUcmFuc2xhdGUgV1BBIHRvIENTUiBhdXRoIHR5cGUKKyAqIEBhdXRoX3N1aXRlOiBhdXRoIHN1aXRlCisgKgorICogUmV0dXJuOiBlQ3NyQXV0aFR5cGUgZW51bWVyYXRpb24KKyAqLworZUNzckF1dGhUeXBlIGhkZF90cmFuc2xhdGVfd3BhX3RvX2Nzcl9hdXRoX3R5cGUodWludDhfdCBhdXRoX3N1aXRlWzRdKQoreworCWVDc3JBdXRoVHlwZSBhdXRoX3R5cGU7CisJLyogaXMgdGhlIGF1dGggdHlwZSBzdXBwb3J0ZWQ/ICovCisJaWYgKG1lbWNtcChhdXRoX3N1aXRlLCBjY3Bfd3BhX291aTAxLCA0KSA9PSAwKSB7CisJCWF1dGhfdHlwZSA9IGVDU1JfQVVUSF9UWVBFX1dQQTsKKwl9IGVsc2UgaWYgKG1lbWNtcChhdXRoX3N1aXRlLCBjY3Bfd3BhX291aTAyLCA0KSA9PSAwKSB7CisJCWF1dGhfdHlwZSA9IGVDU1JfQVVUSF9UWVBFX1dQQV9QU0s7CisJfSBlbHNlCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCWlmIChtZW1jbXAoYXV0aF9zdWl0ZSwgY2NwX3dwYV9vdWkwNiwgNCkgPT0gMCkgeworCQlhdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQTsKKwl9IGVsc2UKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICovCisJeworCQlhdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworCX0KKwloZGRMb2coTE9HMSwgRkwoImF1dGhfdHlwZTogJWQiKSwgYXV0aF90eXBlKTsKKwlyZXR1cm4gYXV0aF90eXBlOworfQorCisvKioKKyAqIGhkZF90cmFuc2xhdGVfcnNuX3RvX2Nzcl9lbmNyeXB0aW9uX3R5cGUoKSAtCisgKglUcmFuc2xhdGUgUlNOIHRvIENTUiBlbmNyeXB0aW9uIHR5cGUKKyAqIEBjaXBoZXJfc3VpdGU6IGNpcGhlciBzdWl0ZQorICoKKyAqIFJldHVybjogZUNzckVuY3J5cHRpb25UeXBlIGVudW1lcmF0aW9uCisgKi8KK2VDc3JFbmNyeXB0aW9uVHlwZQoraGRkX3RyYW5zbGF0ZV9yc25fdG9fY3NyX2VuY3J5cHRpb25fdHlwZSh1aW50OF90IGNpcGhlcl9zdWl0ZVs0XSkKK3sKKwllQ3NyRW5jcnlwdGlvblR5cGUgY2lwaGVyX3R5cGU7CisKKwlpZiAobWVtY21wKGNpcGhlcl9zdWl0ZSwgY2NwX3Jzbl9vdWkwNCwgNCkgPT0gMCkKKwkJY2lwaGVyX3R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM7CisJZWxzZSBpZiAobWVtY21wKGNpcGhlcl9zdWl0ZSwgY2NwX3Jzbl9vdWkwMiwgNCkgPT0gMCkKKwkJY2lwaGVyX3R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQOworCWVsc2UgaWYgKG1lbWNtcChjaXBoZXJfc3VpdGUsIGNjcF9yc25fb3VpMDAsIDQpID09IDApCisJCWNpcGhlcl90eXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwllbHNlIGlmIChtZW1jbXAoY2lwaGVyX3N1aXRlLCBjY3BfcnNuX291aTAxLCA0KSA9PSAwKQorCQljaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWTsKKwllbHNlIGlmIChtZW1jbXAoY2lwaGVyX3N1aXRlLCBjY3BfcnNuX291aTA1LCA0KSA9PSAwKQorCQljaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk7CisJZWxzZQorCQljaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0ZBSUxFRDsKKworCWhkZExvZyhMT0cxLCBGTCgiY2lwaGVyX3R5cGU6ICVkIiksIGNpcGhlcl90eXBlKTsKKwlyZXR1cm4gY2lwaGVyX3R5cGU7Cit9CisKKy8qKgorICogaGRkX3RyYW5zbGF0ZV93cGFfdG9fY3NyX2VuY3J5cHRpb25fdHlwZSgpIC0KKyAqCVRyYW5zbGF0ZSBXUEEgdG8gQ1NSIGVuY3J5cHRpb24gdHlwZQorICogQGNpcGhlcl9zdWl0ZTogY2lwaGVyIHN1aXRlCisgKgorICogUmV0dXJuOiBlQ3NyRW5jcnlwdGlvblR5cGUgZW51bWVyYXRpb24KKyAqLworZUNzckVuY3J5cHRpb25UeXBlCitoZGRfdHJhbnNsYXRlX3dwYV90b19jc3JfZW5jcnlwdGlvbl90eXBlKHVpbnQ4X3QgY2lwaGVyX3N1aXRlWzRdKQoreworCWVDc3JFbmNyeXB0aW9uVHlwZSBjaXBoZXJfdHlwZTsKKworCWlmIChtZW1jbXAoY2lwaGVyX3N1aXRlLCBjY3Bfd3BhX291aTA0LCA0KSA9PSAwKQorCQljaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0FFUzsKKwllbHNlIGlmIChtZW1jbXAoY2lwaGVyX3N1aXRlLCBjY3Bfd3BhX291aTAyLCA0KSA9PSAwKQorCQljaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1RLSVA7CisJZWxzZSBpZiAobWVtY21wKGNpcGhlcl9zdWl0ZSwgY2NwX3dwYV9vdWkwMCwgNCkgPT0gMCkKKwkJY2lwaGVyX3R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworCWVsc2UgaWYgKG1lbWNtcChjaXBoZXJfc3VpdGUsIGNjcF93cGFfb3VpMDEsIDQpID09IDApCisJCWNpcGhlcl90eXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOworCWVsc2UgaWYgKG1lbWNtcChjaXBoZXJfc3VpdGUsIGNjcF93cGFfb3VpMDUsIDQpID09IDApCisJCWNpcGhlcl90eXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWTsKKwllbHNlCisJCWNpcGhlcl90eXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfRkFJTEVEOworCisJaGRkTG9nKExPRzEsIEZMKCJjaXBoZXJfdHlwZTogJWQiKSwgY2lwaGVyX3R5cGUpOworCXJldHVybiBjaXBoZXJfdHlwZTsKK30KKworLyoqCisgKiBoZGRfcHJvY2Vzc19nZW5pZSgpIC0gcHJvY2VzcyBnZW4gaWUKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyCisgKiBAYnNzaWQ6IHBvaW50ZXIgdG8gbWFjIGFkZHJlc3MKKyAqIEBwRW5jcnlwdFR5cGU6IHBvaW50ZXIgdG8gZW5jcnlwdGlvbiB0eXBlCisgKiBAbWNFbmNyeXB0VHlwZTogcG9pbnRlciB0byBtdWx0aWNhc3QgZW5jcnlwdGlvbiB0eXBlCisgKiBAcEF1dGhUeXBlOiBwb2ludGVyIHRvIGF1dGggdHlwZQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQzMl90IGhkZF9wcm9jZXNzX2dlbmllKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSB1OCAqYnNzaWQsCisJCQkJIGVDc3JFbmNyeXB0aW9uVHlwZSAqcEVuY3J5cHRUeXBlLAorCQkJCSBlQ3NyRW5jcnlwdGlvblR5cGUgKm1jRW5jcnlwdFR5cGUsCisJCQkJIGVDc3JBdXRoVHlwZSAqcEF1dGhUeXBlLAorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJCQkgdWludDhfdCAqcE1mcFJlcXVpcmVkLCB1aW50OF90ICpwTWZwQ2FwYWJsZSwKKyNlbmRpZgorCQkJCSB1aW50MTZfdCBnZW5faWVfbGVuLCB1aW50OF90ICpnZW5faWUpCit7CisJdEhhbEhhbmRsZSBoYWxIYW5kbGUgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJQ0RGX1NUQVRVUyByZXN1bHQ7CisJdERvdDExZklFUlNOIGRvdDExUlNOSUU7CisJdERvdDExZklFV1BBIGRvdDExV1BBSUU7CisJdWludDMyX3QgaTsKKwl1aW50OF90ICpwUnNuSWU7CisJdWludDE2X3QgUlNOSWVMZW47CisJdFBta2lkQ2FjaGVJbmZvIFBNS0lEQ2FjaGVbNF07ICAvKiBMb2NhbCB0cmFuc2ZlciBtZW1vcnkgKi8KKwlib29sIHVwZGF0ZVBNS0NhY2hlID0gZmFsc2U7CisKKwkvKgorCSAqIENsZWFyIHN0cnVjdCBvZiB0RG90MTFmSUVSU04gYW5kIHREb3QxMWZJRVdQQSBzcGVjaWZpY2FsbHkKKwkgKiBzZXR0aW5nIHByZXNlbnQgZmxhZyB0byAwLgorCSAqLworCW1lbXNldCgmZG90MTFXUEFJRSwgMCwgc2l6ZW9mKHREb3QxMWZJRVdQQSkpOworCW1lbXNldCgmZG90MTFSU05JRSwgMCwgc2l6ZW9mKHREb3QxMWZJRVJTTikpOworCisJLyogVHlwZSBjaGVjayAqLworCWlmIChnZW5faWVbMF0gPT0gRE9UMTFGX0VJRF9SU04pIHsKKwkJLyogVmFsaWRpdHkgY2hlY2tzICovCisJCWlmICgoZ2VuX2llX2xlbiA8IERPVDExRl9JRV9SU05fTUlOX0xFTikgfHwKKwkJICAgIChnZW5faWVfbGVuID4gRE9UMTFGX0lFX1JTTl9NQVhfTEVOKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIERPVDExRiBSU04gSUUgbGVuZ3RoIDolZCIpLAorCQkJICAgICAgIGdlbl9pZV9sZW4pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogU2tpcCBwYXN0IHRoZSBFSUQgYnl0ZSBhbmQgbGVuZ3RoIGJ5dGUgKi8KKwkJcFJzbkllID0gZ2VuX2llICsgMjsKKwkJUlNOSWVMZW4gPSBnZW5faWVfbGVuIC0gMjsKKwkJLyogVW5wYWNrIHRoZSBSU04gSUUgKi8KKwkJZG90MTFmX3VucGFja19pZV9yc24oKHRwQW5pU2lyR2xvYmFsKSBoYWxIYW5kbGUsCisJCQkJICAgICBwUnNuSWUsIFJTTkllTGVuLCAmZG90MTFSU05JRSk7CisJCS8qIENvcHkgb3V0IHRoZSBlbmNyeXB0aW9uIGFuZCBhdXRoZW50aWNhdGlvbiB0eXBlcyAqLworCQloZGRMb2coTE9HMSwgRkwoInBhaXJ3aXNlIGNpcGhlciBzdWl0ZSBjb3VudDogJWQiKSwKKwkJICAgICAgIGRvdDExUlNOSUUucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50KTsKKwkJaGRkTG9nKExPRzEsIEZMKCJhdXRoZW50aWNhdGlvbiBzdWl0ZSBjb3VudDogJWQiKSwKKwkJICAgICAgIGRvdDExUlNOSUUuYWttX3N1aXRlX2NvdW50KTsKKwkJLypIZXJlIHdlIGhhdmUgZm9sbG93ZWQgdGhlIGFwcGxlIGJhc2UgY29kZSwKKwkJICAgYnV0IHByb2JhYmx5IEkgc3VzcGVjdCB3ZSBjYW4gZG8gc29tZXRoaW5nIGRpZmZlcmVudCAqLworCQkvKiBkb3QxMVJTTklFLmFrbV9zdWl0ZV9jb3VudCAqLworCQkvKiBKdXN0IHRyYW5zbGF0ZSB0aGUgRklSU1Qgb25lICovCisJCSpwQXV0aFR5cGUgPQorCQkJaGRkX3RyYW5zbGF0ZV9yc25fdG9fY3NyX2F1dGhfdHlwZSgKKwkJCQkJZG90MTFSU05JRS5ha21fc3VpdGVzWzBdKTsKKwkJLyogZG90MTFSU05JRS5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKi8KKwkJKnBFbmNyeXB0VHlwZSA9CisJCQloZGRfdHJhbnNsYXRlX3Jzbl90b19jc3JfZW5jcnlwdGlvbl90eXBlKAorCQkJCQlkb3QxMVJTTklFLnB3aXNlX2NpcGhlcl9zdWl0ZXNbMF0pOworCQkvKiBkb3QxMVJTTklFLmdwX2NpcGhlcl9zdWl0ZV9jb3VudCAqLworCQkqbWNFbmNyeXB0VHlwZSA9CisJCQloZGRfdHJhbnNsYXRlX3Jzbl90b19jc3JfZW5jcnlwdGlvbl90eXBlKAorCQkJCQlkb3QxMVJTTklFLmdwX2NpcGhlcl9zdWl0ZSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQkqcE1mcFJlcXVpcmVkID0gKGRvdDExUlNOSUUuUlNOX0NhcFswXSA+PiA2KSAmIDB4MTsKKwkJKnBNZnBDYXBhYmxlID0gKGRvdDExUlNOSUUuUlNOX0NhcFswXSA+PiA3KSAmIDB4MTsKKyNlbmRpZgorCQkvKiBTZXQgdGhlIFBNS1NBIElEIENhY2hlIGZvciB0aGlzIGludGVyZmFjZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgZG90MTFSU05JRS5wbWtpZF9jb3VudDsgaSsrKSB7CisJCQlpZiAoaXNfemVyb19ldGhlcl9hZGRyKGJzc2lkKSkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgiTUFDIGFkZHJlc3MgaXMgYWxsIHplcm9lcyIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVwZGF0ZVBNS0NhY2hlID0gdHJ1ZTsKKwkJCS8qCisJCQkgKiBGb3IgcmlnaHQgbm93LCBJIGFzc3VtZSBzZXRBU1NPQ0lBVEUoKSBoYXMgcGFzc2VkCisJCQkgKiBpbiB0aGUgYnNzaWQuCisJCQkgKi8KKwkJCWNkZl9tZW1fY29weShQTUtJRENhY2hlW2ldLkJTU0lELmJ5dGVzLAorCQkJCSAgICAgYnNzaWQsIEVUSEVSX0FERFJfTEVOKTsKKwkJCWNkZl9tZW1fY29weShQTUtJRENhY2hlW2ldLlBNS0lELAorCQkJCSAgICAgZG90MTFSU05JRS5wbWtpZFtpXSwgQ1NSX1JTTl9QTUtJRF9TSVpFKTsKKwkJfQorCisJCWlmICh1cGRhdGVQTUtDYWNoZSkgeworCQkJLyoKKwkJCSAqIENhbGxpbmcgY3NyX3JvYW1fc2V0X3Bta2lkX2NhY2hlIHRvIGNvbmZpZ3VyZSB0aGUKKwkJCSAqIFBNS0lEcyBpbnRvIHRoZSBjYWNoZS4KKwkJCSAqLworCQkJaGRkTG9nKExPRzEsCisJCQkJRkwoIkNhbGxpbmcgc21lX3JvYW1fc2V0X3Bta2lkX2NhY2hlIHdpdGggY2FjaGUgZW50cnkgJWQuIiksCisJCQkJaSk7CisJCQkvKiBGaW5hbGx5IHNldCB0aGUgUE1LU0EgSUQgQ2FjaGUgaW4gQ1NSICovCisJCQlyZXN1bHQgPQorCQkJCXNtZV9yb2FtX3NldF9wbWtpZF9jYWNoZShoYWxIYW5kbGUsCisJCQkJCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkJIFBNS0lEQ2FjaGUsCisJCQkJCQkJIGRvdDExUlNOSUUucG1raWRfY291bnQsCisJCQkJCQkJIGZhbHNlKTsKKwkJfQorCX0gZWxzZSBpZiAoZ2VuX2llWzBdID09IERPVDExRl9FSURfV1BBKSB7CisJCS8qIFZhbGlkaXR5IGNoZWNrcyAqLworCQlpZiAoKGdlbl9pZV9sZW4gPCBET1QxMUZfSUVfV1BBX01JTl9MRU4pIHx8CisJCSAgICAoZ2VuX2llX2xlbiA+IERPVDExRl9JRV9XUEFfTUFYX0xFTikpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBET1QxMUYgV1BBIElFIGxlbmd0aCA6JWQiKSwKKwkJCSAgICAgICBnZW5faWVfbGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIFNraXAgcGFzdCB0aGUgRUlEIGFuZCBsZW5ndGggYnl0ZSAtIGFuZCBmb3VyIGJ5dGUgV2lGaSBPVUkgKi8KKwkJcFJzbkllID0gZ2VuX2llICsgMiArIDQ7CisJCVJTTkllTGVuID0gZ2VuX2llX2xlbiAtICgyICsgNCk7CisJCS8qIFVucGFjayB0aGUgV1BBIElFICovCisJCWRvdDExZl91bnBhY2tfaWVfd3BhKCh0cEFuaVNpckdsb2JhbCkgaGFsSGFuZGxlLAorCQkJCSAgICAgcFJzbkllLCBSU05JZUxlbiwgJmRvdDExV1BBSUUpOworCQkvKiBDb3B5IG91dCB0aGUgZW5jcnlwdGlvbiBhbmQgYXV0aGVudGljYXRpb24gdHlwZXMgKi8KKwkJaGRkTG9nKExPRzEsIEZMKCJXUEEgdW5pY2FzdCBjaXBoZXIgc3VpdGUgY291bnQ6ICVkIiksCisJCSAgICAgICBkb3QxMVdQQUlFLnVuaWNhc3RfY2lwaGVyX2NvdW50KTsKKwkJaGRkTG9nKExPRzEsIEZMKCJXUEEgYXV0aGVudGljYXRpb24gc3VpdGUgY291bnQ6ICVkIiksCisJCSAgICAgICBkb3QxMVdQQUlFLmF1dGhfc3VpdGVfY291bnQpOworCQkvKiBkb3QxMVdQQUlFLmF1dGhfc3VpdGVfY291bnQgKi8KKwkJLyogSnVzdCB0cmFuc2xhdGUgdGhlIEZJUlNUIG9uZSAqLworCQkqcEF1dGhUeXBlID0KKwkJCWhkZF90cmFuc2xhdGVfd3BhX3RvX2Nzcl9hdXRoX3R5cGUoCisJCQkJCWRvdDExV1BBSUUuYXV0aF9zdWl0ZXNbMF0pOworCQkvKiBkb3QxMVdQQUlFLnVuaWNhc3RfY2lwaGVyX2NvdW50ICovCisJCSpwRW5jcnlwdFR5cGUgPQorCQkJaGRkX3RyYW5zbGF0ZV93cGFfdG9fY3NyX2VuY3J5cHRpb25fdHlwZSgKKwkJCQkJZG90MTFXUEFJRS51bmljYXN0X2NpcGhlcnNbMF0pOworCQkvKiBkb3QxMVdQQUlFLnVuaWNhc3RfY2lwaGVyX2NvdW50ICovCisJCSptY0VuY3J5cHRUeXBlID0KKwkJCWhkZF90cmFuc2xhdGVfd3BhX3RvX2Nzcl9lbmNyeXB0aW9uX3R5cGUoCisJCQkJCWRvdDExV1BBSUUubXVsdGljYXN0X2NpcGhlcik7CisJfSBlbHNlIHsKKwkJaGRkTG9nKExPR1csIEZMKCJnZW5faWVbMF06ICVkIiksIGdlbl9pZVswXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfc2V0X2dlbmllX3RvX2NzcigpIC0gc2V0IGdlbmllIHRvIGNzcgorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBSU05BdXRoVHlwZTogcG9pbnRlciB0byBhdXRoIHR5cGUKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitpbnQgaGRkX3NldF9nZW5pZV90b19jc3IoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGVDc3JBdXRoVHlwZSAqUlNOQXV0aFR5cGUpCit7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwllQ3NyRW5jcnlwdGlvblR5cGUgUlNORW5jcnlwdFR5cGU7CisJZUNzckVuY3J5cHRpb25UeXBlIG1jUlNORW5jcnlwdFR5cGU7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXVpbnQ4X3QgUlNOTWZwUmVxdWlyZWQgPSAwOworCXVpbnQ4X3QgUlNOTWZwQ2FwYWJsZSA9IDA7CisjZW5kaWYKKwl1OCBic3NpZFtFVEhfQUxFTl07ICAgICAgICAvKiBNQUMgYWRkcmVzcyBvZiBhc3NvYyBwZWVyICovCisJLyogTUFDIGFkZHJlc3Mgb2YgYXNzb2MgcGVlciAqLworCS8qIEJ1dCwgdGhpcyByb3V0aW5lIGlzIG9ubHkgY2FsbGVkIHdoZW4gd2UgYXJlIE5PVCBhc3NvY2lhdGVkLiAqLworCWNkZl9tZW1fY29weShic3NpZCwKKwkJICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5CU1NJRHMuYnNzaWQsCisJCSAgICAgc2l6ZW9mKGJzc2lkKSk7CisJaWYgKHBXZXh0U3RhdGUtPldQQVJTTklFWzBdID09IERPVDExRl9FSURfUlNOCisJICAgIHx8IHBXZXh0U3RhdGUtPldQQVJTTklFWzBdID09IERPVDExRl9FSURfV1BBKSB7CisJCS8qIGNvbnRpbnVlICovCisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCS8qIFRoZSBhY3R1YWwgcHJvY2Vzc2luZyBtYXkgZXZlbnR1YWxseSBiZSBtb3JlIGV4dGVuc2l2ZSB0aGFuIHRoaXMuICovCisJLyogUmlnaHQgbm93LCBqdXN0IGNvbnN1bWUgYW55IFBNS0lEcyB0aGF0IGFyZSAgc2VudCBpbiBieSB0aGUgYXBwLiAqLworCXN0YXR1cyA9IGhkZF9wcm9jZXNzX2dlbmllKHBBZGFwdGVyLCBic3NpZCwKKwkJCQkgICAmUlNORW5jcnlwdFR5cGUsCisJCQkJICAgJm1jUlNORW5jcnlwdFR5cGUsIFJTTkF1dGhUeXBlLAorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJCQkgICAmUlNOTWZwUmVxdWlyZWQsICZSU05NZnBDYXBhYmxlLAorI2VuZGlmCisJCQkJICAgcFdleHRTdGF0ZS0+V1BBUlNOSUVbMV0gKyAyLAorCQkJCSAgIHBXZXh0U3RhdGUtPldQQVJTTklFKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyoKKwkJICogTm93IGNvcHkgb3ZlciBhbGwgdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKwkJICogeW91IGhhdmUgcGFyc2VkIG91dC4KKwkJICovCisJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCisJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gUlNORW5jcnlwdFR5cGU7ICAgICAgLyogVXNlIHRoZSBjaXBoZXIgdHlwZSBpbiB0aGUgUlNOIElFICovCisJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm1jRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPQorCQkJbWNSU05FbmNyeXB0VHlwZTsKKworCQlpZiAoKFdMQU5fSEREX0lCU1MgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSAmJgorCQkgICAgKChlQ1NSX0VOQ1JZUFRfVFlQRV9BRVMgPT0gbWNSU05FbmNyeXB0VHlwZSkgfHwKKwkJICAgICAoZUNTUl9FTkNSWVBUX1RZUEVfVEtJUCA9PSBtY1JTTkVuY3J5cHRUeXBlKSkpIHsKKwkJCS8qCisJCQkgKiBGb3Igd3BhIG5vbmUgc3VwcGxpY2FudCBzZW5kcyB0aGUgV1BBIElFIHdpdGggdW5pY2FzdAorCQkJICogY2lwaGVyIGFzIGVDU1JfRU5DUllQVF9UWVBFX05PTkUgLHdoZXJlIGFzIHRoZQorCQkJICogbXVsdGljYXN0IGNpcGhlciBhcyBlaXRoZXIgQUVTL1RLSVAgYmFzZWQgb24gZ3JvdXAKKwkJCSAqIGNpcGhlciBjb25maWd1cmF0aW9uIG1lbnRpb25lZCBpbiB0aGUKKwkJCSAqIHdwYV9zdXBwbGljYW50LmNvbmYuCisJCQkgKi8KKworCQkJLyogU2V0IHRoZSB1bmljYXN0IGNpcGhlciBzYW1lIGFzIG11bHRpY2FzdCBjaXBoZXIgKi8KKwkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdCisJCQkJPSBtY1JTTkVuY3J5cHRUeXBlOworCQl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQloZGRMb2coTE9HMSwgRkwoIlJTTk1mcFJlcXVpcmVkID0gJWQsIFJTTk1mcENhcGFibGUgPSAlZCIpLAorCQkJCQkJUlNOTWZwUmVxdWlyZWQsIFJTTk1mcENhcGFibGUpOworCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5NRlBSZXF1aXJlZCA9IFJTTk1mcFJlcXVpcmVkOworCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5NRlBDYXBhYmxlID0gUlNOTWZwQ2FwYWJsZTsKKyNlbmRpZgorCQloZGRMb2coTE9HMSwKKwkJICAgICAgIEZMKCJDU1IgQXV0aFR5cGUgPSAlZCwgRW5jcnlwdGlvblR5cGUgPSAlZCBtY0VuY3J5cHRpb25UeXBlID0gJWQiKSwKKwkJICAgICAgICpSU05BdXRoVHlwZSwgUlNORW5jcnlwdFR5cGUsIG1jUlNORW5jcnlwdFR5cGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfc2V0X2Nzcl9hdXRoX3R5cGUoKSAtIHNldCBjc3IgYXV0aCB0eXBlCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlcgorICogQFJTTkF1dGhUeXBlOiBhdXRoIHR5cGUKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitpbnQgaGRkX3NldF9jc3JfYXV0aF90eXBlKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBlQ3NyQXV0aFR5cGUgUlNOQXV0aFR5cGUpCit7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisJdENzclJvYW1Qcm9maWxlICpwUm9hbVByb2ZpbGUgPSAmKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlKTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCUVOVEVSKCk7CisKKwlwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworCWhkZExvZyhMT0cxLCBGTCgicEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlID0gJWQiKSwKKwkgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlKTsKKworCXN3aXRjaCAocEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlKSB7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTToKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQToKKwljYXNlIGVDU1JfQVVUSF9UWVBFX0NDS01fUlNOOgorI2VuZGlmCisJCWlmIChwV2V4dFN0YXRlLT53cGFWZXJzaW9uICYgSVdfQVVUSF9XUEFfVkVSU0lPTl9ESVNBQkxFRCkgeworCisJCQlwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0KKwkJCQllQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKwkJfSBlbHNlIGlmIChwV2V4dFN0YXRlLT53cGFWZXJzaW9uICYgSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEpIHsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJCWlmICgoUlNOQXV0aFR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEEpICYmCisJCQkgICAgKChwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQorCQkJICAgICA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkpIHsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgRkwoInNldCBhdXRoVHlwZSB0byBDQ0tNIFdQQS4gQUtNIGFsc28gODAyLjFYLiIpKTsKKwkJCQlwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0KKwkJCQkJZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEE7CisJCQl9IGVsc2UgaWYgKFJTTkF1dGhUeXBlID09IGVDU1JfQVVUSF9UWVBFX0NDS01fV1BBKSB7CisJCQkJaGRkTG9nKExPRzEsCisJCQkJICAgICAgIEZMKCJMYXN0IGNoYW5jZSB0byBzZXQgYXV0aFR5cGUgdG8gQ0NLTSBXUEEuIikpOworCQkJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQkJCQllQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQTsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQlpZiAoKHBXZXh0U3RhdGUtPgorCQkJICAgICBhdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQorCQkJICAgID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSB7CisJCQkJcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9CisJCQkJCWVDU1JfQVVUSF9UWVBFX1dQQTsKKwkJCX0gZWxzZQorCQkJaWYgKChwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfUFNLKQorCQkJICAgID09IElXX0FVVEhfS0VZX01HTVRfUFNLKSB7CisJCQkJcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9CisJCQkJCWVDU1JfQVVUSF9UWVBFX1dQQV9QU0s7CisJCQl9IGVsc2UgeworCQkJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQkJCQllQ1NSX0FVVEhfVFlQRV9XUEFfTk9ORTsKKwkJCX0KKwkJfQorCQlpZiAocFdleHRTdGF0ZS0+d3BhVmVyc2lvbiAmIElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikgeworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJCWlmICgoUlNOQXV0aFR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU04pICYmCisJCQkgICAgKChwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQorCQkJICAgICA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkpIHsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgRkwoInNldCBhdXRoVHlwZSB0byBDQ0tNIFJTTi4gQUtNIGFsc28gODAyLjFYLiIpKTsKKwkJCQlwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0KKwkJCQkJZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU047CisJCQl9IGVsc2UgaWYgKFJTTkF1dGhUeXBlID09IGVDU1JfQVVUSF9UWVBFX0NDS01fUlNOKSB7CisJCQkJaGRkTG9nKExPRzEsCisJCQkJICAgICAgIEZMKCJMYXN0IGNoYW5jZSB0byBzZXQgYXV0aFR5cGUgdG8gQ0NLTSBSU04uIikpOworCQkJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQkJCQllQ1NSX0FVVEhfVFlQRV9DQ0tNX1JTTjsKKwkJCX0gZWxzZQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQkJaWYgKChSU05BdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9GVF9SU04pICYmCisJCQkgICAgKChwV2V4dFN0YXRlLT4KKwkJCSAgICAgIGF1dGhLZXlNZ210ICYgSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpCisJCQkgICAgID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSkgeworCQkJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQkJCQllQ1NSX0FVVEhfVFlQRV9GVF9SU047CisJCQl9IGVsc2UgaWYgKChSU05BdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9GVF9SU05fUFNLKQorCQkJCSAgICYmCisJCQkJICAgKChwV2V4dFN0YXRlLT4KKwkJCQkgICAgIGF1dGhLZXlNZ210ICYgSVdfQVVUSF9LRVlfTUdNVF9QU0spCisJCQkJICAgID09IElXX0FVVEhfS0VZX01HTVRfUFNLKSkgeworCQkJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQkJCQllQ1NSX0FVVEhfVFlQRV9GVF9SU05fUFNLOworCQkJfSBlbHNlCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJCWlmIChSU05BdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLX1NIQTI1NikgeworCQkJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQkJCQllQ1NSX0FVVEhfVFlQRV9SU05fUFNLX1NIQTI1NjsKKwkJCX0gZWxzZSBpZiAoUlNOQXV0aFR5cGUgPT0KKwkJCQkgICBlQ1NSX0FVVEhfVFlQRV9SU05fODAyMVhfU0hBMjU2KSB7CisJCQkJcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9CisJCQkJCWVDU1JfQVVUSF9UWVBFX1JTTl84MDIxWF9TSEEyNTY7CisJCQl9IGVsc2UKKyNlbmRpZgorCisJCQlpZiAoKHBXZXh0U3RhdGUtPgorCQkJICAgICBhdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQorCQkJICAgID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSB7CisJCQkJcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9CisJCQkJCWVDU1JfQVVUSF9UWVBFX1JTTjsKKwkJCX0gZWxzZQorCQkJaWYgKChwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfUFNLKQorCQkJICAgID09IElXX0FVVEhfS0VZX01HTVRfUFNLKSB7CisJCQkJcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9CisJCQkJCWVDU1JfQVVUSF9UWVBFX1JTTl9QU0s7CisJCQl9IGVsc2UgeworCQkJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQkJCQllQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOgorCisJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOworCQlicmVhazsKKwlkZWZhdWx0OgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQloZGRMb2coTE9HMSwgRkwoIkluIGRlZmF1bHQsIHVua25vd24gYXV0aCB0eXBlLiIpKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICovCisJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworCQlicmVhazsKKwl9CisKKwloZGRMb2coTE9HMSwgRkwoIlNldCByb2FtIEF1dGh0eXBlIHRvICVkIiksCisJICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkF1dGhUeXBlLmF1dGhUeXBlWzBdKTsKKworCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBfX2l3X3NldF9lc3NpZCgpIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzc2lkIHJlY2VpdmVkIGZyb20gd3BhX3N1cHBsaWNhbnQKKyAqCQkgICAgdG8gdGhlIENTUiByb2FtIHByb2ZpbGUuCisgKgorICogQGRldjoJIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAaW5mbzoJIFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1OgkgUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAqIEBleHRyYToJIFBvaW50ZXIgdG8gdGhlIGRhdGEuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBlcnJvciBudW1iZXIgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9faXdfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyByYzsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCXVpbnQzMl90IHJvYW1JZDsKKwl0Q3NyUm9hbVByb2ZpbGUgKnBSb2FtUHJvZmlsZTsKKwllTWliX2RvdDExRGVzaXJlZEJzc1R5cGUgY29ubmVjdGVkQnNzVHlwZTsKKwllQ3NyQXV0aFR5cGUgUlNOQXV0aFR5cGU7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocEFkYXB0ZXItPmRldmljZV9tb2RlICE9IFdMQU5fSEREX0lORlJBX1NUQVRJT04gJiYKKwkJcEFkYXB0ZXItPmRldmljZV9tb2RlICE9IFdMQU5fSEREX1AyUF9DTElFTlQpIHsKKwkJaGRkTG9nKExPR1csIEZMKCJkZXZpY2UgbW9kZSAlcyglZCkgaXMgbm90IGFsbG93ZWQiKSwKKwkJCWhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisJaWYgKHBXZXh0U3RhdGUtPm1US0lQQ291bnRlck1lYXN1cmVzID09IFRLSVBfQ09VTlRFUl9NRUFTVVJFX1NUQVJURUQpIHsKKwkJaGRkTG9nKExPRzIsIEZMKCJDb3VudGVyIG1lYXN1cmUgaXMgaW4gcHJvZ3Jlc3MiKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChTSVJfTUFDX01BWF9TU0lEX0xFTkdUSCA8IHdycXUtPmVzc2lkLmxlbmd0aCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisJaWYgKGhkZF9jb25uX2dldF9jb25uZWN0ZWRfYnNzX3R5cGUocEhkZFN0YUN0eCwgJmNvbm5lY3RlZEJzc1R5cGUpIHx8CisJICAgIChlTWliX2RvdDExRGVzaXJlZEJzc1R5cGVfaW5kZXBlbmRlbnQgPT0KKwkgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uRG90MTFEZXNpcmVkQnNzVHlwZSkpIHsKKwkJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCisJCS8qIE5lZWQgdG8gaXNzdWUgYSBkaXNjb25uZWN0IHRvIENTUi4gKi8KKwkJSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKwkJY2RmX3N0YXR1cyA9IHNtZV9yb2FtX2Rpc2Nvbm5lY3QoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gY2RmX3N0YXR1cykgeworCQkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnBBZGFwdGVyLT4KKwkJCQkJCSBkaXNjb25uZWN0X2NvbXBfdmFyLAorCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCSAoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworCQkJaWYgKCFyYykKKwkJCQloZGRMb2coTE9HRSwgRkwoIkRpc2Nvbm5lY3QgZXZlbnQgdGltZWQgb3V0IikpOworCQl9CisJfQorCisJLyoKKwkgKiB3aGVuIGNmZzgwMjExIGRlZmluZWQsIHdwYV9zdXBwbGljYW50IHdleHQgZHJpdmVyIHVzZXMKKwkgKiB6ZXJvLWxlbmd0aCwgbnVsbC1zdHJpbmcgc3NpZCBmb3IgZm9yY2UgZGlzY29ubmVjdGlvbi4KKwkgKiBhZnRlciBkaXNjb25uZWN0aW9uIChpZiBwcmV2aW91c2x5IGNvbm5lY3RlZCkgYW5kIGNsZWFuaW5nIHNzaWQsCisJICogZHJpdmVyIE1VU1QgcmV0dXJuIHN1Y2Nlc3MuCisJICovCisJaWYgKDAgPT0gd3JxdS0+ZXNzaWQubGVuZ3RoKQorCQlyZXR1cm4gMDsKKworCXN0YXR1cyA9IGhkZF93bW1fZ2V0X3VhcHNkX21hc2socEFkYXB0ZXIsCisJCQkJCSZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS51YXBzZF9tYXNrKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKwkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUudWFwc2RfbWFzayA9IDA7CisKKwlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5TU0lEcy5udW1PZlNTSURzID0gMTsKKworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0LT5TU0lELmxlbmd0aCA9CisJCXdycXUtPmVzc2lkLmxlbmd0aDsKKworCWNkZl9tZW1femVybyhwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5TU0lEcy5TU0lETGlzdC0+U1NJRC5zc0lkLAorCQkgICAgIHNpemVvZihwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5TU0lEcy5TU0lETGlzdC0+U1NJRC5zc0lkKSk7CisJY2RmX21lbV9jb3B5KCh2b2lkICopKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0LT5TU0lELgorCQkJICAgICAgc3NJZCksIGV4dHJhLCB3cnF1LT5lc3NpZC5sZW5ndGgpOworCWlmIChJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSA9PSBwV2V4dFN0YXRlLT53cGFWZXJzaW9uCisJICAgIHx8IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMiA9PSBwV2V4dFN0YXRlLT53cGFWZXJzaW9uKSB7CisKKwkJLyogc2V0IGdlbiBpZSAqLworCQloZGRfc2V0X2dlbmllX3RvX2NzcihwQWRhcHRlciwgJlJTTkF1dGhUeXBlKTsKKworCQkvKiBzZXQgYXV0aCAqLworCQloZGRfc2V0X2Nzcl9hdXRoX3R5cGUocEFkYXB0ZXIsIFJTTkF1dGhUeXBlKTsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwloZGRMb2coTE9HMSwgRkwoIlNldHRpbmcgV0FQSSBBVVRIIFR5cGUgYW5kIEVuY3J5cHRpb24gTW9kZSB2YWx1ZXMiKSk7CisJaWYgKHBBZGFwdGVyLT53YXBpX2luZm8ubldhcGlNb2RlKSB7CisJCXN3aXRjaCAocEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUpIHsKKwkJY2FzZSBXQVBJX0FVVEhfTU9ERV9QU0s6CisJCXsKKwkJCWhkZExvZyhMT0cxLCBGTCgiV0FQSSBBVVRIIFRZUEU6IFBTSzogJWQiKSwKKwkJCSAgICAgICBwQWRhcHRlci0+d2FwaV9pbmZvLndhcGlBdXRoTW9kZSk7CisJCQlwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworCQkJcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9CisJCQkJZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfUFNLOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBXQVBJX0FVVEhfTU9ERV9DRVJUOgorCQl7CisJCQloZGRMb2coTE9HMSwgRkwoIldBUEkgQVVUSCBUWVBFOiBDRVJUOiAlZCIpLAorCQkJICAgICAgIHBBZGFwdGVyLT53YXBpX2luZm8ud2FwaUF1dGhNb2RlKTsKKwkJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUubnVtRW50cmllcyA9IDE7CisJCQlwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0KKwkJCQllQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9DRVJUSUZJQ0FURTsKKwkJCWJyZWFrOworCQl9CisJCX0gLyogRW5kIG9mIHN3aXRjaCAqLworCQlpZiAocEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUgPT0gV0FQSV9BVVRIX01PREVfUFNLIHx8CisJCSAgICBwQWRhcHRlci0+d2FwaV9pbmZvLndhcGlBdXRoTW9kZSA9PSBXQVBJX0FVVEhfTU9ERV9DRVJUKSB7CisJCQloZGRMb2coTE9HMSwgRkwoIldBUEkgUEFJUldJU0UvR1JPVVAgRU5DUllQVElPTjogV1BJIikpOworCQkJcFJvYW1Qcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKwkJCXBSb2FtUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPQorCQkJCWVDU1JfRU5DUllQVF9UWVBFX1dQSTsKKwkJCXBSb2FtUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKwkJCXBSb2FtUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCQkJZUNTUl9FTkNSWVBUX1RZUEVfV1BJOworCQl9CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisJLyogaWYgcHJldmlvdXMgZ2VuSUUgaXMgbm90IE5VTEwsIHVwZGF0ZSBBc3NvY0lFICovCisJaWYgKDAgIT0gcFdleHRTdGF0ZS0+Z2VuSUUubGVuZ3RoKSB7CisJCW1lbXNldCgmcFdleHRTdGF0ZS0+YXNzb2NBZGRJRSwgMCwKKwkJICAgICAgIHNpemVvZihwV2V4dFN0YXRlLT5hc3NvY0FkZElFKSk7CisJCW1lbWNweShwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YSwKKwkJICAgICAgIHBXZXh0U3RhdGUtPmdlbklFLmFkZElFZGF0YSwgcFdleHRTdGF0ZS0+Z2VuSUUubGVuZ3RoKTsKKwkJcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggPSBwV2V4dFN0YXRlLT5nZW5JRS5sZW5ndGg7CisJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBBZGRJRUFzc29jID0KKwkJCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUuYWRkSUVkYXRhOworCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uQWRkSUVBc3NvY0xlbmd0aCA9CisJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aDsKKworCQkvKiBjbGVhciBwcmV2aW91cyBnZW5JRSBhZnRlciB1c2UgaXQgKi8KKwkJbWVtc2V0KCZwV2V4dFN0YXRlLT5nZW5JRSwgMCwgc2l6ZW9mKHBXZXh0U3RhdGUtPmdlbklFKSk7CisJfQorCisJLyoKKwkgKiBBc3N1bWVzIGl0IGlzIG5vdCBXUFMgQXNzb2NpYXRpb24gYnkgZGVmYXVsdCwgZXhjZXB0IHdoZW4KKwkgKiBwQWRkSUVBc3NvYyBoYXMgV1BTIElFLgorCSAqLworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLmJXUFNBc3NvY2lhdGlvbiA9IGZhbHNlOworCisJaWYgKE5VTEwgIT0gd2xhbl9oZGRfZ2V0X3dwc19pZV9wdHIocFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFQXNzb2MsCisJCQkJCSAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS4KKwkJCQkJICAgIG5BZGRJRUFzc29jTGVuZ3RoKSkKKwkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuYldQU0Fzc29jaWF0aW9uID0gdHJ1ZTsKKworCS8qIERpc2FibGUgYXV0byBCTVBTIGVudHJ5IGJ5IFBNQyB1bnRpbCBESENQIGlzIGRvbmUgKi8KKwlzbWVfc2V0X2RoY3BfdGlsbF9wb3dlcl9hY3RpdmVfZmxhZyhXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCQkgdHJ1ZSk7CisKKwlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5jc3JQZXJzb25hID0gcEFkYXB0ZXItPmRldmljZV9tb2RlOworCisJaWYgKGVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUyA9PSBwUm9hbVByb2ZpbGUtPkJTU1R5cGUpIHsKKwkJaGRkX3NlbGVjdF9jYm1vZGUocEFkYXB0ZXIsCisJCQkJICAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPgorCQkJCSAgQWRIb2NDaGFubmVsNUcpOworCX0KKwlzdGF0dXMgPSBzbWVfcm9hbV9jb25uZWN0KGhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJICAmKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlKSwgJnJvYW1JZCk7CisJcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisJcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKworCUVYSVQoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGl3X3NldF9lc3NpZCgpIC0gc2V0IGVzc2lkIGhhbmRsZXIgZnVuY3Rpb24KKyAqIEBkZXY6IFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAaW5mbzogUG9pbnRlciB0byB0aGUgaXdfcmVxdWVzdF9pbmZvLgorICogQHdycXU6IFBvaW50ZXIgdG8gdGhlIGl3cmVxX2RhdGEuCisgKiBAZXh0cmE6IFBvaW50ZXIgdG8gdGhlIGRhdGEuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBlcnJvciBudW1iZXIgb24gZmFpbHVyZQorICovCitpbnQgaXdfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfZXNzaWQoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X2dldF9lc3NpZCgpIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlc3NpZCB0byB0aGUgd3BhX3N1cHBsaWNhbnQKKyAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIHRoZSBpdyByZXF1ZXN0IGluZm8KKyAqIEBkd3JxOiBwb2ludGVyIHRvIGl3X3BvaW50CisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gdGhlIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaGRkX3dleHRfc3RhdGVfdCAqd2V4dEJ1ZiA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICgocEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSA9PSBlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgJiYKKwkgICAgIHdleHRCdWYtPnJvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0LT5TU0lELmxlbmd0aCA+IDApIHx8CisJICAgICgocEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSA9PSBlQ29ubmVjdGlvblN0YXRlX0lic3NDb25uZWN0ZWQKKwkgICAgICB8fCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID09CisJICAgICAgZUNvbm5lY3Rpb25TdGF0ZV9JYnNzRGlzY29ubmVjdGVkKQorCSAgICAgJiYgd2V4dEJ1Zi0+cm9hbVByb2ZpbGUuU1NJRHMuU1NJRExpc3QtPlNTSUQubGVuZ3RoID4gMCkpIHsKKwkJZHdycS0+bGVuZ3RoID0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLlNTSUQuU1NJRC5sZW5ndGg7CisJCW1lbWNweShleHRyYSwgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLlNTSUQuU1NJRC5zc0lkLAorCQkgICAgICAgZHdycS0+bGVuZ3RoKTsKKwkJZHdycS0+ZmxhZ3MgPSAxOworCX0gZWxzZSB7CisJCW1lbXNldChleHRyYSwgMCwgZHdycS0+bGVuZ3RoKTsKKwkJZHdycS0+bGVuZ3RoID0gMDsKKwkJZHdycS0+ZmxhZ3MgPSAwOworCX0KKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXdfZ2V0X2Vzc2lkKCkgLSBnZXQgZXNzaWQgaGFuZGxlciBmdW5jdGlvbgorICogQGRldjogUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAqIEBpbmZvOiBQb2ludGVyIHRvIHRoZSBpd19yZXF1ZXN0X2luZm8uCisgKiBAd3JxdTogUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAqIEBleHRyYTogUG9pbnRlciB0byB0aGUgZGF0YS4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvbiBmYWlsdXJlCisgKi8KK2ludCBpd19nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcG9pbnQgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X2Vzc2lkKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19zZXRfYXV0aCgpIC0KKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYXV0aCB0eXBlIHJlY2VpdmVkIGZyb20gdGhlIHdwYV9zdXBwbGljYW50CisgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byB0aGUgaXcgcmVxdWVzdCBpbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gdGhlIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IF9faXdfc2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJdENzclJvYW1Qcm9maWxlICpwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisJZUNzckVuY3J5cHRpb25UeXBlIG1jRW5jcnlwdGlvblR5cGU7CisJZUNzckVuY3J5cHRpb25UeXBlIHVjRW5jcnlwdGlvblR5cGU7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHdycXUtPnBhcmFtLmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKKwkJcFdleHRTdGF0ZS0+d3BhVmVyc2lvbiA9IHdycXUtPnBhcmFtLnZhbHVlOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisJeworCQlpZiAod3JxdS0+cGFyYW0udmFsdWUgJiBJV19BVVRIX0NJUEhFUl9OT05FKSB7CisJCQl1Y0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwkJfSBlbHNlIGlmICh3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfQ0lQSEVSX1RLSVApIHsKKwkJCXVjRW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQOworCQl9IGVsc2UgaWYgKHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9DSVBIRVJfQ0NNUCkgeworCQkJdWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0FFUzsKKwkJfSBlbHNlIGlmICh3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfQ0lQSEVSX1dFUDQwKSB7CisJCQlpZiAoKElXX0FVVEhfS0VZX01HTVRfODAyXzFYCisJCQkgICAgID09CisJCQkgICAgIChwV2V4dFN0YXRlLT4KKwkJCSAgICAgIGF1dGhLZXlNZ210ICYgSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpKQorCQkJICAgICYmIChlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSA9PQorCQkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkpCisJCQkJLypEeW5hbWljIFdFUCBrZXkgKi8KKwkJCQl1Y0VuY3J5cHRpb25UeXBlID0KKwkJCQkJZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA7CisJCQllbHNlCisJCQkJLypTdGF0aWMgV0VQIGtleSAqLworCQkJCXVjRW5jcnlwdGlvblR5cGUgPQorCQkJCQllQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk7CisJCX0gZWxzZSBpZiAod3JxdS0+cGFyYW0udmFsdWUgJiBJV19BVVRIX0NJUEhFUl9XRVAxMDQpIHsKKwkJCWlmICgoSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgKKwkJCSAgICAgPT0KKwkJCSAgICAgKHBXZXh0U3RhdGUtPgorCQkJICAgICAgYXV0aEtleU1nbXQgJiBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkpCisJCQkgICAgJiYgKGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNID09CisJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlKSkKKwkJCQkvKkR5bmFtaWMgV0VQIGtleSAqLworCQkJCXVjRW5jcnlwdGlvblR5cGUgPQorCQkJCQllQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ7CisJCQllbHNlCisJCQkJLypTdGF0aWMgV0VQIGtleSAqLworCQkJCXVjRW5jcnlwdGlvblR5cGUgPQorCQkJCQllQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOworCQl9IGVsc2UgeworCQkJaGRkTG9nKExPR1csIEZMKCJ2YWx1ZSAlZCBVTktOT1dOIElXX0FVVEhfQ0lQSEVSIiksCisJCQkJd3JxdS0+cGFyYW0udmFsdWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlwUm9hbVByb2ZpbGUtPkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCQlwUm9hbVByb2ZpbGUtPkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0KKwkJCXVjRW5jcnlwdGlvblR5cGU7CisJfQorCWJyZWFrOworCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CisJeworCQlpZiAod3JxdS0+cGFyYW0udmFsdWUgJiBJV19BVVRIX0NJUEhFUl9OT05FKSB7CisJCQltY0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwkJfSBlbHNlIGlmICh3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfQ0lQSEVSX1RLSVApIHsKKwkJCW1jRW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQOworCQl9IGVsc2UgaWYgKHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9DSVBIRVJfQ0NNUCkgeworCQkJbWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0FFUzsKKwkJfSBlbHNlIGlmICh3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfQ0lQSEVSX1dFUDQwKSB7CisJCQlpZiAoKElXX0FVVEhfS0VZX01HTVRfODAyXzFYCisJCQkgICAgID09CisJCQkgICAgIChwV2V4dFN0YXRlLT4KKwkJCSAgICAgIGF1dGhLZXlNZ210ICYgSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpKQorCQkJICAgICYmIChlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSA9PQorCQkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkpCisJCQkJbWNFbmNyeXB0aW9uVHlwZSA9CisJCQkJCWVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOworCQkJZWxzZQorCQkJCW1jRW5jcnlwdGlvblR5cGUgPQorCQkJCQllQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk7CisJCX0gZWxzZSBpZiAod3JxdS0+cGFyYW0udmFsdWUgJiBJV19BVVRIX0NJUEhFUl9XRVAxMDQpIHsKKwkJCS8qIER5bmFtaWMgV0VQIGtleXMgd29uJ3Qgd29yayB3aXRoIHNoYXJlZCBrZXlzICovCisJCQlpZiAoKElXX0FVVEhfS0VZX01HTVRfODAyXzFYCisJCQkgICAgID09CisJCQkgICAgIChwV2V4dFN0YXRlLT4KKwkJCSAgICAgIGF1dGhLZXlNZ210ICYgSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpKQorCQkJICAgICYmIChlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSA9PQorCQkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkpIHsKKwkJCQltY0VuY3J5cHRpb25UeXBlID0KKwkJCQkJZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OworCQkJfSBlbHNlIHsKKwkJCQltY0VuY3J5cHRpb25UeXBlID0KKwkJCQkJZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWhkZExvZyhMT0dXLCBGTCgidmFsdWUgJWQgVU5LTk9XTiBJV19BVVRIX0NJUEhFUiIpLAorCQkJCXdycXUtPnBhcmFtLnZhbHVlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcFJvYW1Qcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCQlwUm9hbVByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPQorCQkJbWNFbmNyeXB0aW9uVHlwZTsKKwl9CisJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJeworCQkvKiBTYXZlIHRoZSBhdXRoIGFsZ28gaGVyZSBhbmQgc2V0IGF1dGggdHlwZSB0byBTTUUgUm9hbSBwcm9maWxlCisJCSAgIGluIHRoZSBpd19zZXRfYXBfYWRkcmVzcyAqLworCQlpZiAod3JxdS0+cGFyYW0udmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkKKwkJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSA9CisJCQkJZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07CisKKwkJZWxzZSBpZiAod3JxdS0+cGFyYW0udmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQorCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlID0KKwkJCQllQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOworCisJCWVsc2UgaWYgKHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9BTEdfTEVBUCkKKwkJCS8qTm90IHN1cHBvcnRlZCAqLworCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlID0KKwkJCQllQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKwkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuQXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlOworCX0KKwlicmVhazsKKworCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKwl7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorI2RlZmluZSBJV19BVVRIX0tFWV9NR01UX0NDS00gICAgICAgOCAgIC8qIFNob3VsZCBiZSBpbiBsaW51eC93aXJlbGVzcy5oICovCisJCS8qQ2hlY2sgZm9yIENDS00gQUtNIHR5cGUgKi8KKwkJaWYgKHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9LRVlfTUdNVF9DQ0tNKSB7CisJCQloZGRMb2coTE9HMSwgRkwoIkNDS00gQUtNIFNldCAlZCIpLCB3cnF1LT5wYXJhbS52YWx1ZSk7CisJCQkvKiBTZXQgdGhlIENDS00gYml0IGluIGF1dGhLZXlNZ210ICovCisJCQkvKgorCQkJICogUmlnaHQgbm93LCB0aGlzIGJyZWFrcyBhbGwgcmVmIHRvIGF1dGhLZXlNZ210IGJlY2F1c2UKKwkJCSAqIG91ciBjb2RlIGRvZXNuJ3QgcmVhbGl6ZSBpdCBpcyBhICJiaXRmaWVsZCIKKwkJCSAqLworCQkJcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgfD0KKwkJCQlJV19BVVRIX0tFWV9NR01UX0NDS007CisJCQkvKiBTZXQgdGhlIGtleSBtYW5hZ2VtZW50IHRvIDgwMi4xWCAqLworCQkJLyogcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgPSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWDsgKi8KKwkJCXBXZXh0U3RhdGUtPmlzRVNFQ29ubmVjdGlvbiA9IHRydWU7CisJCQkvKgorCQkJICogVGhpcyBpcyB0ZXN0IGNvZGUuIEkgbmVlZCB0byBhY3R1YWxseSBLTk9XIHdoZXRoZXIKKwkJCSAqIHRoaXMgaXMgYW4gUlNOIEFzc29jIG9yIFdQQS4KKwkJCSAqLworCQkJcFdleHRTdGF0ZS0+Y29sbGVjdGVkQXV0aFR5cGUgPQorCQkJCWVDU1JfQVVUSF9UWVBFX0NDS01fUlNOOworCQl9IGVsc2UgaWYgKHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9LRVlfTUdNVF9QU0spIHsKKwkJCS8qIFNhdmUgdGhlIGtleSBtYW5hZ2VtZW50ICovCisJCQlwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCB8PSBJV19BVVRIX0tFWV9NR01UX1BTSzsKKwkJCXBXZXh0U3RhdGUtPmNvbGxlY3RlZEF1dGhUeXBlID0KKwkJCQllQ1NSX0FVVEhfVFlQRV9SU047CisJCX0gZWxzZQorCQlpZiAoISh3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSkgeworCQkJcFdleHRTdGF0ZS0+Y29sbGVjdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9OT05FOworCQkJLyogU2F2ZSB0aGUga2V5IG1hbmFnZW1lbnQgYW55d2F5ICovCisJCQlwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCA9IHdycXUtPnBhcmFtLnZhbHVlOworCQl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBJdCBtdXN0IGJlIElXX0FVVEhfS0VZX01HTVRfODAyXzFYICovCisJCQkvKiBTYXZlIHRoZSBrZXkgbWFuYWdlbWVudCAqLworCQkJcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgfD0KKwkJCQlJV19BVVRIX0tFWV9NR01UXzgwMl8xWDsKKwkJCXBXZXh0U3RhdGUtPmNvbGxlY3RlZEF1dGhUeXBlID0KKwkJCQllQ1NSX0FVVEhfVFlQRV9SU047CisJCX0KKyNlbHNlCisJCS8qIFNhdmUgdGhlIGtleSBtYW5hZ2VtZW50ICovCisJCXBXZXh0U3RhdGUtPmF1dGhLZXlNZ210ID0gd3JxdS0+cGFyYW0udmFsdWU7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAqLworCX0KKwlicmVhazsKKworCWNhc2UgSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFUzoKKwl7CisJCWlmICh3cnF1LT5wYXJhbS52YWx1ZSkgeworCQkJaGRkTG9nKExPRzIsCisJCQkgICAgICAgIkNvdW50ZXIgTWVhc3VyZSBzdGFydGVkICVkIiwKKwkJCSAgICAgICB3cnF1LT5wYXJhbS52YWx1ZSk7CisJCQlwV2V4dFN0YXRlLT5tVEtJUENvdW50ZXJNZWFzdXJlcyA9CisJCQkJVEtJUF9DT1VOVEVSX01FQVNVUkVfU1RBUlRFRDsKKwkJfSBlbHNlIHsKKwkJCWhkZExvZyhMT0cyLAorCQkJICAgICAgICJDb3VudGVyIE1lYXN1cmUgc3RvcHBlZD0lZCIsCisJCQkgICAgICAgd3JxdS0+cGFyYW0udmFsdWUpOworCQkJcFdleHRTdGF0ZS0+bVRLSVBDb3VudGVyTWVhc3VyZXMgPQorCQkJCVRLSVBfQ09VTlRFUl9NRUFTVVJFX1NUT1BFRDsKKwkJfQorCX0KKwlicmVhazsKKwljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKwljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorCWNhc2UgSVdfQVVUSF9ST0FNSU5HX0NPTlRST0w6CisJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKworCWRlZmF1bHQ6CisKKwkJaGRkTG9nKExPR1csIEZMKCJjYWxsZWQgd2l0aCB1bnN1cHBvcnRlZCBhdXRoIHR5cGUgJWQiKSwKKwkJCXdycXUtPnBhcmFtLmZsYWdzICYgSVdfQVVUSF9JTkRFWCk7CisJCWJyZWFrOworCX0KKworCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpd19zZXRfYXV0aCgpIC0gc2V0IGF1dGggY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBkZXY6IFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAaW5mbzogUG9pbnRlciB0byB0aGUgaXdfcmVxdWVzdF9pbmZvLgorICogQHdycXU6IFBvaW50ZXIgdG8gdGhlIGl3cmVxX2RhdGEuCisgKiBAZXh0cmE6IFBvaW50ZXIgdG8gdGhlIGRhdGEuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworaW50IGl3X3NldF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0X2F1dGgoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X2dldF9hdXRoKCkgLQorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhdXRoIHR5cGUgdG8gdGhlIHdwYV9zdXBwbGljYW50CisgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byB0aGUgaXcgcmVxdWVzdCBpbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gdGhlIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCXRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlID0gJnBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlOworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChwUm9hbVByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSkgeworCWNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBX05PTkU6CisJCXdycXUtPnBhcmFtLmZsYWdzID0gSVdfQVVUSF9XUEFfVkVSU0lPTjsKKwkJd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEOworCQlicmVhazsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1dQQToKKwkJd3JxdS0+cGFyYW0uZmxhZ3MgPSBJV19BVVRIX1dQQV9WRVJTSU9OOworCQl3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBOworCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfRlRfUlNOOgorI2VuZGlmCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU046CisJCXdycXUtPnBhcmFtLmZsYWdzID0gSVdfQVVUSF9XUEFfVkVSU0lPTjsKKwkJd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTI7CisJCWJyZWFrOworCWNhc2UgZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU06CisJCXdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCWJyZWFrOworCWNhc2UgZUNTUl9BVVRIX1RZUEVfU0hBUkVEX0tFWToKKwkJd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX0FMR19TSEFSRURfS0VZOworCQlicmVhazsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1VOS05PV046CisJCWhkZExvZyhMT0cxLCBGTCgiY2FsbGVkIHdpdGggdW5rbm93biBhdXRoIHR5cGUiKSk7CisJCXdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCWJyZWFrOworCWNhc2UgZUNTUl9BVVRIX1RZUEVfQVVUT1NXSVRDSDoKKwkJd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLOgorCQloZGRMb2coTE9HMSwgRkwoImNhbGxlZCB3aXRoIFdQQSBQU0sgYXV0aCB0eXBlIikpOworCQl3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlyZXR1cm4gLUVJTzsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSzoKKyNlbmRpZgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfUlNOX1BTSzoKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLX1NIQTI1NjoKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1JTTl84MDIxWF9TSEEyNTY6CisjZW5kaWYKKwkJaGRkTG9nKExPRzEsIEZMKCJjYWxsZWQgd2l0aCBSU04gUFNLIGF1dGggdHlwZSIpKTsKKwkJd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKKwkJcmV0dXJuIC1FSU87CisJZGVmYXVsdDoKKwkJaGRkTG9nKExPR0UsIEZMKCJjYWxsZWQgd2l0aCB1bmtub3duIGF1dGggdHlwZSIpKTsKKwkJd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICgoKHdycXUtPnBhcmFtLmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgPT0gSVdfQVVUSF9DSVBIRVJfUEFJUldJU0UpKSB7CisJCXN3aXRjaCAocFJvYW1Qcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSkgeworCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX05PTkU6CisJCQl3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfQ0lQSEVSX05PTkU7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDoKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk6CisJCQl3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfQ0lQSEVSX1dFUDQwOworCQkJYnJlYWs7CisJCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDoKKwkJCXdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9DSVBIRVJfVEtJUDsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDoKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorCQkJd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX0NJUEhFUl9XRVAxMDQ7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM6CisJCQl3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfQ0lQSEVSX0NDTVA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhkZExvZyhMT0cxLCBGTCgiY2FsbGVkIHdpdGggdW5rbm93biBhdXRoIHR5cGUgJWQiKSwKKwkJCSAgICAgICBwUm9hbVByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJaWYgKCgod3JxdS0+cGFyYW0uZmxhZ3MgJiBJV19BVVRIX0lOREVYKSA9PSBJV19BVVRIX0NJUEhFUl9HUk9VUCkpIHsKKwkJc3dpdGNoIChwUm9hbVByb2ZpbGUtPm5lZ290aWF0ZWRNQ0VuY3J5cHRpb25UeXBlKSB7CisJCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfTk9ORToKKwkJCXdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9DSVBIRVJfTk9ORTsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOgorCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWToKKwkJCXdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9DSVBIRVJfV0VQNDA7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQOgorCQkJd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX0NJUEhFUl9US0lQOworCQkJYnJlYWs7CisJCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OgorCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk6CisJCQl3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfQ0lQSEVSX1dFUDEwNDsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX0FFUzoKKwkJCXdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9DSVBIRVJfQ0NNUDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaGRkTG9nKExPRzEsIEZMKCJjYWxsZWQgd2l0aCB1bmtub3duIGF1dGggdHlwZSAlZCIpLAorCQkJICAgICAgIHBSb2FtUHJvZmlsZS0+bmVnb3RpYXRlZE1DRW5jcnlwdGlvblR5cGUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwloZGRMb2coTE9HMSwgRkwoImNhbGxlZCB3aXRoIGF1dGggdHlwZSAlZCIpLAorCQlwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdKTsKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXdfZ2V0X2F1dGgoKSAtIGdldCBhdXRoIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAZGV2OiBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICogQGluZm86IFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1OiBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICogQGV4dHJhOiBQb2ludGVyIHRvIHRoZSBkYXRhLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcywgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludCBpd19nZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X2dldF9hdXRoKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19zZXRfYXBfYWRkcmVzcygpIC0gc2V0IGFwIGFkZHJlc3MKKyAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIHRoZSBpdyByZXF1ZXN0IGluZm8KKyAqIEB3cnF1OiBwb2ludGVyIHRvIGl3cmVxX2RhdGEKKyAqIEBleHRyYTogcG9pbnRlciB0byB0aGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgSEREIGdsb2JhbCBzdGF0aW9uIGNvbnRleHQgY29ubmVjdGlvbiBpbmZvCisgKiBCU1NJRCB3aXRoIHRoZSBNQUMgYWRkcmVzcyByZWNlaXZlZCBmcm9tIHRoZSB3cGFfc3VwcGxpY2FudC4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IF9faXdfc2V0X2FwX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPQorCQlXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpKTsKKwl1aW50OF90ICpwTWFjQWRkcmVzcyA9IE5VTEw7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwlhZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBNYWNBZGRyZXNzID0gKHVpbnQ4X3QgKikgd3JxdS0+YXBfYWRkci5zYV9kYXRhOworCWhkZExvZyhMT0cxLCBGTCgiICIgTUFDX0FERFJFU1NfU1RSKSwgTUFDX0FERFJfQVJSQVkocE1hY0FkZHJlc3MpKTsKKwljZGZfbWVtX2NvcHkocEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLmJ5dGVzLCBwTWFjQWRkcmVzcywKKwkJICAgICBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCUVYSVQoKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X3NldF9hcF9hZGRyZXNzKCkgLSBzZXQgYXAgYWRkcmVzc2VzIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAZGV2OiBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICogQGluZm86IFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1OiBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICogQGV4dHJhOiBQb2ludGVyIHRvIHRoZSBkYXRhLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcywgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludCBpd19zZXRfYXBfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfYXBfYWRkcmVzcyhkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfZ2V0X2FwX2FkZHJlc3MoKSAtIGdldCBhcCBhZGRyZXNzCisgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byB0aGUgaXcgcmVxdWVzdCBpbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gdGhlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgY3VycmVudGx5IGFzc29jaWF0ZWQgQlNTSUQuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBfX2l3X2dldF9hcF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0KKwkJV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKTsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUgPT0gZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkIHx8CisJICAgIGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCA9PSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSB7CisJCWNkZl9tZW1fY29weSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsCisJCQkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLmJ5dGVzLAorCQkJCUNERl9NQUNfQUREUl9TSVpFKTsKKwl9IGVsc2UgeworCQltZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBzaXplb2Yod3JxdS0+YXBfYWRkci5zYV9kYXRhKSk7CisJfQorCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpd19nZXRfYXBfYWRkcmVzcygpIC0gZ2V0IGFwIGFkZHJlc3NlcyBjYWxsYmFjayBmdW5jdGlvbgorICogQGRldjogUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAqIEBpbmZvOiBQb2ludGVyIHRvIHRoZSBpd19yZXF1ZXN0X2luZm8uCisgKiBAd3JxdTogUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAqIEBleHRyYTogUG9pbnRlciB0byB0aGUgZGF0YS4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLgorICovCitpbnQgaXdfZ2V0X2FwX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X2FwX2FkZHJlc3MoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9jZmcuYyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9jZmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzRiZDRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX2NmZy5jCkBAIC0wLDAgKzEsNjYxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBET0M6ICB3bGFuX2hkZF9jZmcuYworICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisgKi8KKworLyogSW5jbHVkZSBGaWxlcyAqLworCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX21haW4uaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9hc3NvYy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2NmZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGNzcl9hcGkuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9taXNjLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfbmFwaS5oPgorCisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCitzdGF0aWMgdm9pZAorY2Jfbm90aWZ5X3NldF9yb2FtX3ByZWZlcjVfZ19oeihoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB1bnNpZ25lZCBsb25nIG5vdGlmeUlkKQoreworCXNtZV91cGRhdGVfcm9hbV9wcmVmZXI1X2dfaHoocEhkZEN0eC0+aEhhbCwKKwkJCQkgICAgIHBIZGRDdHgtPmNvbmZpZy0+blJvYW1QcmVmZXI1R0h6KTsKK30KKworc3RhdGljIHZvaWQKK2NiX25vdGlmeV9zZXRfcm9hbV9yc3NpX2RpZmYoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwlzbWVfdXBkYXRlX3JvYW1fcnNzaV9kaWZmKHBIZGRDdHgtPmhIYWwsCisJCQkJICAwLCBwSGRkQ3R4LT5jb25maWctPlJvYW1Sc3NpRGlmZik7Cit9CisKK3N0YXRpYyB2b2lkCitjYl9ub3RpZnlfc2V0X2Zhc3RfdHJhbnNpdGlvbl9lbmFibGVkKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwlzbWVfdXBkYXRlX2Zhc3RfdHJhbnNpdGlvbl9lbmFibGVkKHBIZGRDdHgtPmhIYWwsCisJCQkJCSAgIHBIZGRDdHgtPmNvbmZpZy0+CisJCQkJCSAgIGlzRmFzdFRyYW5zaXRpb25FbmFibGVkKTsKK30KKworc3RhdGljIHZvaWQKK2NiX25vdGlmeV9zZXRfcm9hbV9pbnRyYV9iYW5kKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIHVuc2lnbmVkIGxvbmcgbm90aWZ5SWQpCit7CisJc21lX3NldF9yb2FtX2ludHJhX2JhbmQocEhkZEN0eC0+aEhhbCwgcEhkZEN0eC0+Y29uZmlnLT5uUm9hbUludHJhQmFuZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNiX25vdGlmeV9zZXRfd2VzX21vZGUoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwkvKiBBdCB0aGUgcG9pbnQgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHZhbHVlIGluIHRoZSBoZGQgY29uZmlnCisJICAgdGFibGUgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkICovCisJc21lX3VwZGF0ZV93ZXNfbW9kZShwSGRkQ3R4LT5oSGFsLCBwSGRkQ3R4LT5jb25maWctPmlzV0VTTW9kZUVuYWJsZWQsIDApOworfQorCitzdGF0aWMgdm9pZAorY2Jfbm90aWZ5X3NldF9yb2FtX3NjYW5fbl9wcm9iZXMoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwlzbWVfdXBkYXRlX3JvYW1fc2Nhbl9uX3Byb2JlcyhwSGRkQ3R4LT5oSGFsLCAwLCBwSGRkQ3R4LT5jb25maWctPm5Qcm9iZXMpOworfQorCitzdGF0aWMgdm9pZAorY2Jfbm90aWZ5X3NldF9yb2FtX3NjYW5faG9tZV9hd2F5X3RpbWUoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwlzbWVfdXBkYXRlX3JvYW1fc2Nhbl9ob21lX2F3YXlfdGltZShwSGRkQ3R4LT5oSGFsLCAwLAorCQkJCQkgICAgcEhkZEN0eC0+Y29uZmlnLT5uUm9hbVNjYW5Ib21lQXdheVRpbWUsCisJCQkJCSAgICB0cnVlKTsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX09LQworc3RhdGljIHZvaWQKK2NiX25vdGlmeV9zZXRfb2tjX2ZlYXR1cmVfZW5hYmxlZChoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB1bnNpZ25lZCBsb25nIG5vdGlmeUlkKQoreworCS8qIEF0IHRoZSBwb2ludCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLCB0aGUgdmFsdWUgaW4gdGhlIGhkZCBjb25maWcKKwkgICB0YWJsZSBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQgKi8KK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorc3RhdGljIHZvaWQKK25vdGlmeV9pc19mYXN0X3JvYW1faW5pX2ZlYXR1cmVfZW5hYmxlZChoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJCQl1bnNpZ25lZCBsb25nIG5vdGlmeUlkKQoreworCS8qIEF0IHRoZSBwb2ludCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLCB0aGUgdmFsdWUgaW4gdGhlIGhkZCBjb25maWcKKwkgICB0YWJsZSBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQgKi8KKwlzbWVfdXBkYXRlX2lzX2Zhc3Rfcm9hbV9pbmlfZmVhdHVyZV9lbmFibGVkKHBIZGRDdHgtPmhIYWwsIDAsCisJCQkJCQkgICAgcEhkZEN0eC0+Y29uZmlnLT4KKwkJCQkJCSAgICBpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQpOworfQorCitzdGF0aWMgdm9pZAorbm90aWZ5X2lzX21hd2NfaW5pX2ZlYXR1cmVfZW5hYmxlZChoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB1bnNpZ25lZCBsb25nIG5vdGlmeUlkKQoreworCS8qIEF0IHRoZSBwb2ludCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLCB0aGUgdmFsdWUgaW4gdGhlIGhkZCBjb25maWcKKwkgICB0YWJsZSBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQgKi8KKwlzbWVfdXBkYXRlX2lzX21hd2NfaW5pX2ZlYXR1cmVfZW5hYmxlZChwSGRkQ3R4LT5oSGFsLAorCQkJCQkgICAgICAgcEhkZEN0eC0+Y29uZmlnLT5NQVdDRW5hYmxlZCk7Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKK3N0YXRpYyB2b2lkCitjYl9ub3RpZnlfc2V0X2VzZV9mZWF0dXJlX2VuYWJsZWQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwkvKiBBdCB0aGUgcG9pbnQgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHZhbHVlIGluIHRoZSBoZGQgY29uZmlnCisJICAgdGFibGUgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkICovCisJc21lX3VwZGF0ZV9pc19lc2VfZmVhdHVyZV9lbmFibGVkKHBIZGRDdHgtPmhIYWwsIDAsCisJCQkJCSAgcEhkZEN0eC0+Y29uZmlnLT5pc0VzZUluaUZlYXR1cmVFbmFibGVkKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorY2Jfbm90aWZ5X3NldF9md19yc3NpX21vbml0b3JpbmcoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwkvKiBBdCB0aGUgcG9pbnQgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHZhbHVlIGluIHRoZSBoZGQgY29uZmlnCisJICAgdGFibGUgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkICovCisJc21lX3VwZGF0ZV9jb25maWdfZndfcnNzaV9tb25pdG9yaW5nKHBIZGRDdHgtPmhIYWwsCisJCQkJCSAgICAgcEhkZEN0eC0+Y29uZmlnLT4KKwkJCQkJICAgICBmRW5hYmxlRndSc3NpTW9uaXRvcmluZyk7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworc3RhdGljIHZvaWQgY2Jfbm90aWZ5X3NldF9vcHBvcnR1bmlzdGljX3NjYW5fdGhyZXNob2xkX2RpZmYoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwkvKiBBdCB0aGUgcG9pbnQgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHZhbHVlIGluIHRoZSBoZGQgY29uZmlnCisJICAgdGFibGUgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkICovCisJc21lX3NldF9yb2FtX29wcG9ydHVuaXN0aWNfc2Nhbl90aHJlc2hvbGRfZGlmZihwSGRkQ3R4LT5oSGFsLCAwLAorCQkJCQkJICAgICAgIHBIZGRDdHgtPmNvbmZpZy0+CisJCQkJCQkgICAgICAgbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmKTsKK30KKworc3RhdGljIHZvaWQgY2Jfbm90aWZ5X3NldF9yb2FtX3Jlc2Nhbl9yc3NpX2RpZmYoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgbm90aWZ5SWQpCit7CisJLyogQXQgdGhlIHBvaW50IHRoaXMgcm91dGluZSBpcyBjYWxsZWQsIHRoZSB2YWx1ZSBpbiB0aGUgaGRkIGNvbmZpZworCSAgIHRhYmxlIGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZCAqLworCXNtZV9zZXRfcm9hbV9yZXNjYW5fcnNzaV9kaWZmKHBIZGRDdHgtPmhIYWwsCisJCQkJICAgICAgMCwgcEhkZEN0eC0+Y29uZmlnLT5uUm9hbVJlc2NhblJzc2lEaWZmKTsKK30KKworc3RhdGljIHZvaWQKK2NiX25vdGlmeV9zZXRfbmVpZ2hib3JfbG9va3VwX3Jzc2lfdGhyZXNob2xkKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwkvKiBBdCB0aGUgcG9pbnQgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHZhbHVlIGluIHRoZSBoZGQgY29uZmlnCisJICAgdGFibGUgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkICovCisJc21lX3NldF9uZWlnaGJvcl9sb29rdXBfcnNzaV90aHJlc2hvbGQocEhkZEN0eC0+aEhhbCwgMCwKKwkJCQkJICAgICAgIHBIZGRDdHgtPmNvbmZpZy0+CisJCQkJCSAgICAgICBuTmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkKTsKK30KKworc3RhdGljIHZvaWQKK2NiX25vdGlmeV9zZXRfZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcChoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBub3RpZnlfaWQpCit7CisJLyoKKwkgKiBBdCB0aGUgcG9pbnQgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHZhbHVlIGluIHRoZSBjZmdfaW5pCisJICogdGFibGUgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCisJICovCisJc21lX3NldF9kZWxheV9iZWZvcmVfdmRldl9zdG9wKGhkZF9jdHgtPmhIYWwsIDAsCisJCQkJaGRkX2N0eC0+Y29uZmlnLT5kZWxheV9iZWZvcmVfdmRldl9zdG9wKTsKK30KKworc3RhdGljIHZvaWQKK2NiX25vdGlmeV9zZXRfbmVpZ2hib3Jfc2Nhbl9wZXJpb2QoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwkvKiBBdCB0aGUgcG9pbnQgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHZhbHVlIGluIHRoZSBoZGQgY29uZmlnCisJICAgdGFibGUgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkICovCisJc21lX3NldF9uZWlnaGJvcl9zY2FuX3BlcmlvZChwSGRkQ3R4LT5oSGFsLCAwLAorCQkJCSAgICAgcEhkZEN0eC0+Y29uZmlnLT5uTmVpZ2hib3JTY2FuUGVyaW9kKTsKK30KKworc3RhdGljIHZvaWQKK2NiX25vdGlmeV9zZXRfbmVpZ2hib3JfcmVzdWx0c19yZWZyZXNoX3BlcmlvZChoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIG5vdGlmeUlkKQoreworCS8qIEF0IHRoZSBwb2ludCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLCB0aGUgdmFsdWUgaW4gdGhlIGhkZCBjb25maWcKKwkgICB0YWJsZSBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQgKi8KKwlzbWVfc2V0X25laWdoYm9yX3NjYW5fcmVmcmVzaF9wZXJpb2QocEhkZEN0eC0+aEhhbCwgMCwKKwkJCQkJICAgICBwSGRkQ3R4LT5jb25maWctPgorCQkJCQkgICAgIG5OZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kKTsKK30KKworc3RhdGljIHZvaWQKK2NiX25vdGlmeV9zZXRfZW1wdHlfc2Nhbl9yZWZyZXNoX3BlcmlvZChoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJCQl1bnNpZ25lZCBsb25nIG5vdGlmeUlkKQoreworCS8qIEF0IHRoZSBwb2ludCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLCB0aGUgdmFsdWUgaW4gdGhlIGhkZCBjb25maWcKKwkgICB0YWJsZSBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQgKi8KKwlzbWVfdXBkYXRlX2VtcHR5X3NjYW5fcmVmcmVzaF9wZXJpb2QocEhkZEN0eC0+aEhhbCwgMCwKKwkJCQkJICAgICBwSGRkQ3R4LT5jb25maWctPgorCQkJCQkgICAgIG5FbXB0eVNjYW5SZWZyZXNoUGVyaW9kKTsKK30KKworc3RhdGljIHZvaWQKK2NiX25vdGlmeV9zZXRfbmVpZ2hib3Jfc2Nhbl9taW5fY2hhbl90aW1lKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwkvKiBBdCB0aGUgcG9pbnQgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHZhbHVlIGluIHRoZSBoZGQgY29uZmlnCisJICAgdGFibGUgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkICovCisJc21lX3NldF9uZWlnaGJvcl9zY2FuX21pbl9jaGFuX3RpbWUocEhkZEN0eC0+aEhhbCwKKwkJCQkJICAgIHBIZGRDdHgtPmNvbmZpZy0+CisJCQkJCSAgICBuTmVpZ2hib3JTY2FuTWluQ2hhblRpbWUsIDApOworfQorCitzdGF0aWMgdm9pZAorY2Jfbm90aWZ5X3NldF9uZWlnaGJvcl9zY2FuX21heF9jaGFuX3RpbWUoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJICB1bnNpZ25lZCBsb25nIG5vdGlmeUlkKQoreworCXNtZV9zZXRfbmVpZ2hib3Jfc2Nhbl9tYXhfY2hhbl90aW1lKHBIZGRDdHgtPmhIYWwsIDAsCisJCQkJCSAgICBwSGRkQ3R4LT5jb25maWctPgorCQkJCQkgICAgbk5laWdoYm9yU2Nhbk1heENoYW5UaW1lKTsKK30KKworc3RhdGljIHZvaWQgY2Jfbm90aWZ5X3NldF9yb2FtX2JtaXNzX2ZpcnN0X2JjbnQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgbm90aWZ5SWQpCit7CisJLyogQXQgdGhlIHBvaW50IHRoaXMgcm91dGluZSBpcyBjYWxsZWQsIHRoZSB2YWx1ZSBpbiB0aGUgaGRkIGNvbmZpZworCSAgIHRhYmxlIGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZCAqLworCXNtZV9zZXRfcm9hbV9ibWlzc19maXJzdF9iY250KHBIZGRDdHgtPmhIYWwsCisJCQkJICAgICAgMCwgcEhkZEN0eC0+Y29uZmlnLT5uUm9hbUJtaXNzRmlyc3RCY250KTsKK30KKworc3RhdGljIHZvaWQgY2Jfbm90aWZ5X3NldF9yb2FtX2JtaXNzX2ZpbmFsX2JjbnQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgbm90aWZ5SWQpCit7CisJc21lX3NldF9yb2FtX2JtaXNzX2ZpbmFsX2JjbnQocEhkZEN0eC0+aEhhbCwgMCwKKwkJCQkgICAgICBwSGRkQ3R4LT5jb25maWctPm5Sb2FtQm1pc3NGaW5hbEJjbnQpOworfQorCitzdGF0aWMgdm9pZCBjYl9ub3RpZnlfc2V0X3JvYW1fYmVhY29uX3Jzc2lfd2VpZ2h0KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJCQkgIHVuc2lnbmVkIGxvbmcgbm90aWZ5SWQpCit7CisJc21lX3NldF9yb2FtX2JlYWNvbl9yc3NpX3dlaWdodChwSGRkQ3R4LT5oSGFsLCAwLAorCQkJCQlwSGRkQ3R4LT5jb25maWctPm5Sb2FtQmVhY29uUnNzaVdlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkCitjYl9ub3RpZnlfc2V0X2Rmc19zY2FuX21vZGUoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwkvKiBBdCB0aGUgcG9pbnQgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHZhbHVlIGluIHRoZSBoZGQgY29uZmlnCisJICAgdGFibGUgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkICovCisJc21lX3VwZGF0ZV9kZnNfc2Nhbl9tb2RlKHBIZGRDdHgtPmhIYWwsIDAsCisJCQkJIHBIZGRDdHgtPmNvbmZpZy0+YWxsb3dERlNDaGFubmVsUm9hbSk7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjYl9ub3RpZnlfc2V0X2VuYWJsZV9zc3IoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbm90aWZ5SWQpCit7CisJc21lX3VwZGF0ZV9lbmFibGVfc3NyKHBIZGRDdHgtPmhIYWwsIHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlU1NSKTsKK30KKworc3RhdGljIHZvaWQgY2Jfbm90aWZ5X3NldF9nX3NhcF9wcmVmZXJyZWRfY2hhbl9sb2NhdGlvbihoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgbm90aWZ5SWQpCit7CisJd2xhbnNhcF9zZXRfZGZzX3ByZWZlcnJlZF9jaGFubmVsX2xvY2F0aW9uKHBIZGRDdHgtPmhIYWwsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPgorCQkJCQkJICAgZ1NhcFByZWZlcnJlZENoYW5Mb2NhdGlvbik7Cit9CitzdGF0aWMgdm9pZCBjaF9ub3RpZnlfc2V0X2dfZGlzYWJsZV9kZnNfamFwYW5fdzUzKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJCQkgIHVuc2lnbmVkIGxvbmcgbm90aWZ5SWQpCit7CisJd2xhbnNhcF9zZXRfZGZzX3Jlc3RyaWN0X2phcGFuX3c1MyhwSGRkQ3R4LT5oSGFsLAorCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPgorCQkJCQkgICBnRGlzYWJsZURmc0phcGFuVzUzKTsKK30KK3N0YXRpYyB2b2lkCitjYl9ub3RpZnlfdXBkYXRlX3JvYW1fc2Nhbl9vZmZsb2FkX2VuYWJsZWQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwlzbWVfdXBkYXRlX3JvYW1fc2Nhbl9vZmZsb2FkX2VuYWJsZWQocEhkZEN0eC0+aEhhbCwKKwkJCQkJICAgICBwSGRkQ3R4LT5jb25maWctPgorCQkJCQkgICAgIGlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCk7CisJaWYgKDAgPT0gcEhkZEN0eC0+Y29uZmlnLT5pc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQpIHsKKwkJcEhkZEN0eC0+Y29uZmlnLT5iRmFzdFJvYW1JbkNvbkluaUZlYXR1cmVFbmFibGVkID0gMDsKKwkJc21lX3VwZGF0ZV9lbmFibGVfZmFzdF9yb2FtX2luX2NvbmN1cnJlbmN5KHBIZGRDdHgtPmhIYWwsCisJCQkJCQkJICAgcEhkZEN0eC0+Y29uZmlnLT4KKwkJCQkJCQkgICBiRmFzdFJvYW1JbkNvbkluaUZlYXR1cmVFbmFibGVkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjYl9ub3RpZnlfc2V0X2VuYWJsZV9mYXN0X3JvYW1faW5fY29uY3VycmVuY3koaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBub3RpZnlJZCkKK3sKKwlzbWVfdXBkYXRlX2VuYWJsZV9mYXN0X3JvYW1faW5fY29uY3VycmVuY3kocEhkZEN0eC0+aEhhbCwKKwkJCQkJCSAgIHBIZGRDdHgtPmNvbmZpZy0+CisJCQkJCQkgICBiRmFzdFJvYW1JbkNvbkluaUZlYXR1cmVFbmFibGVkKTsKK30KKworLyoqCisgKiBjYl9ub3RpZnlfc2V0X3JvYW1fc2Nhbl9oaV9yc3NpX3NjYW5fcGFyYW1zKCkgLSBjb25maWd1cmUgaGkgcnNzaQorICogc2NhbiBwYXJhbXMgZnJvbSBjZmcgdG8gc21lLgorICogQGhkZF9jdHg6IEhERCBjb250ZXh0IGRhdGEgc3RydWN0dXJlCisgKiBAbm90aWZ5X2lkOiBJZGVudGlmaWVzIDEgb2YgdGhlIDQgcGFyYW1ldGVycyB0byBiZSBtb2RpZmllZAorICoKKyAqIFBpY2tzIHVwIHRoZSB2YWx1ZSBmcm9tIGhkZCBjb25maWd1cmF0aW9uIGFuZCBwYXNzZXMgaXQgdG8gU01FLgorICogUmV0dXJuOiB2b2lkCisgKi8KKworc3RhdGljIHZvaWQKK2NiX25vdGlmeV9zZXRfcm9hbV9zY2FuX2hpX3Jzc2lfc2Nhbl9wYXJhbXMoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBub3RpZnlfaWQpCit7CisJaW50MzJfdCB2YWw7CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIGludmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKG5vdGlmeV9pZCkgeworCWNhc2UgZUNTUl9ISV9SU1NJX1NDQU5fTUFYQ09VTlRfSUQ6CisJCXZhbCA9IGhkZF9jdHgtPmNvbmZpZy0+bmhpX3Jzc2lfc2Nhbl9tYXhfY291bnQ7CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0hJX1JTU0lfU0NBTl9SU1NJX0RFTFRBX0lEOgorCQl2YWwgPSBoZGRfY3R4LT5jb25maWctPm5oaV9yc3NpX3NjYW5fcnNzaV9kZWx0YTsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfSElfUlNTSV9TQ0FOX0RFTEFZX0lEOgorCQl2YWwgPSBoZGRfY3R4LT5jb25maWctPm5oaV9yc3NpX3NjYW5fZGVsYXk7CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0hJX1JTU0lfU0NBTl9SU1NJX1VCX0lEOgorCQl2YWwgPSBoZGRfY3R4LT5jb25maWctPm5oaV9yc3NpX3NjYW5fcnNzaV91YjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJc21lX3VwZGF0ZV9yb2FtX3NjYW5faGlfcnNzaV9zY2FuX3BhcmFtcyhoZGRfY3R4LT5oSGFsLCAwLAorCQlub3RpZnlfaWQsIHZhbCk7Cit9CisKKworUkVHX1RBQkxFX0VOVFJZIGdfcmVnaXN0cnlfdGFibGVbXSA9IHsKKwlSRUdfVkFSSUFCTEUoQ0ZHX1JUU19USFJFU0hPTERfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBSVFNUaHJlc2hvbGQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19SVFNfVEhSRVNIT0xEX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JUU19USFJFU0hPTERfTUlOLAorCQkgICAgIENGR19SVFNfVEhSRVNIT0xEX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0ZSQUdfVEhSRVNIT0xEX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgRnJhZ21lbnRhdGlvblRocmVzaG9sZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0ZSQUdfVEhSRVNIT0xEX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0ZSQUdfVEhSRVNIT0xEX01JTiwKKwkJICAgICBDRkdfRlJBR19USFJFU0hPTERfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfT1BFUkFUSU5HX0NIQU5ORUxfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBPcGVyYXRpbmdDaGFubmVsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfT1BFUkFUSU5HX0NIQU5ORUxfREVGQVVMVCwKKwkJICAgICBDRkdfT1BFUkFUSU5HX0NIQU5ORUxfTUlOLAorCQkgICAgIENGR19PUEVSQVRJTkdfQ0hBTk5FTF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFNob3J0U2xvdFRpbWVFbmFibGVkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfREVGQVVMVCwKKwkJICAgICBDRkdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfTUlOLAorCQkgICAgIENGR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR18xMURfU1VQUE9SVF9FTkFCTEVEX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSXMxMWRTdXBwb3J0RW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHXzExRF9TVVBQT1JUX0VOQUJMRURfREVGQVVMVCwKKwkJICAgICBDRkdfMTFEX1NVUFBPUlRfRU5BQkxFRF9NSU4sCisJCSAgICAgQ0ZHXzExRF9TVVBQT1JUX0VOQUJMRURfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfMTFIX1NVUFBPUlRfRU5BQkxFRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIElzMTFoU3VwcG9ydEVuYWJsZWQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR18xMUhfU1VQUE9SVF9FTkFCTEVEX0RFRkFVTFQsCisJCSAgICAgQ0ZHXzExSF9TVVBQT1JUX0VOQUJMRURfTUlOLAorCQkgICAgIENGR18xMUhfU1VQUE9SVF9FTkFCTEVEX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0NPVU5UUllfQ09ERV9QUklPUklUWV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX0NPVU5UUllfQ09ERV9QUklPUklUWV9ERUZBVUxULAorCQkgICAgIENGR19DT1VOVFJZX0NPREVfUFJJT1JJVFlfTUlOLAorCQkgICAgIENGR19DT1VOVFJZX0NPREVfUFJJT1JJVFlfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSEVBUlRCRUFUX1RIUkVTSF8yNF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEhlYXJ0YmVhdFRocmVzaDI0LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfSEVBUlRCRUFUX1RIUkVTSF8yNF9ERUZBVUxULAorCQkgICAgIENGR19IRUFSVEJFQVRfVEhSRVNIXzI0X01JTiwKKwkJICAgICBDRkdfSEVBUlRCRUFUX1RIUkVTSF8yNF9NQVgpLAorCisJUkVHX1ZBUklBQkxFX1NUUklORyhDRkdfUE9XRVJfVVNBR0VfTkFNRSwgV0xBTl9QQVJBTV9TdHJpbmcsCisJCQkgICAgc3RydWN0IGhkZF9jb25maWcsIFBvd2VyVXNhZ2VDb250cm9sLAorCQkJICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKwkJCSAgICAodm9pZCAqKUNGR19QT1dFUl9VU0FHRV9ERUZBVUxUKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0xPR1BfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmSXNMb2dwRW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9MT0dQX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9MT0dQX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX0xPR1BfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0lNUFNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmSXNJbXBzRW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9JTVBTX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9JTVBTX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX0lNUFNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX1BTX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaXNfcHNfZW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9QU19ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfUFNfTUlOLAorCQkgICAgIENGR19FTkFCTEVfUFNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQk1QU19NSU5JTVVNX0xJX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbkJtcHNNaW5MaXN0ZW5JbnRlcnZhbCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0JNUFNfTUlOSU1VTV9MSV9ERUZBVUxULAorCQkgICAgIENGR19CTVBTX01JTklNVU1fTElfTUlOLAorCQkgICAgIENGR19CTVBTX01JTklNVU1fTElfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQk1QU19NQVhJTVVNX0xJX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbkJtcHNNYXhMaXN0ZW5JbnRlcnZhbCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0JNUFNfTUFYSU1VTV9MSV9ERUZBVUxULAorCQkgICAgIENGR19CTVBTX01BWElNVU1fTElfTUlOLAorCQkgICAgIENGR19CTVBTX01BWElNVU1fTElfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQk1QU19NT0RFUkFURV9MSV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5CbXBzTW9kTGlzdGVuSW50ZXJ2YWwsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19CTVBTX01PREVSQVRFX0xJX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0JNUFNfTU9ERVJBVEVfTElfTUlOLAorCQkgICAgIENGR19CTVBTX01PREVSQVRFX0xJX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0RPVDExX01PREVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBkb3QxMU1vZGUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR19ET1QxMV9NT0RFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0RPVDExX01PREVfTUlOLAorCQkgICAgIENGR19ET1QxMV9NT0RFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFXzI0R0haX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbkNoYW5uZWxCb25kaW5nTW9kZTI0R0h6LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfREVGQVVMVCwKKwkJICAgICBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfTUlOLAorCQkgICAgIENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV81R0haX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbkNoYW5uZWxCb25kaW5nTW9kZTVHSHosCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ERUZBVUxULAorCQkgICAgIENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9NSU4sCisJCSAgICAgQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBNYXhSeEFtcGR1RmFjdG9yLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9ERUZBVUxULAorCQkgICAgIENGR19NQVhfUlhfQU1QRFVfRkFDVE9SX01JTiwKKwkJICAgICBDRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19GSVhFRF9SQVRFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgVHhSYXRlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfRklYRURfUkFURV9ERUZBVUxULAorCQkgICAgIENGR19GSVhFRF9SQVRFX01JTiwKKwkJICAgICBDRkdfRklYRURfUkFURV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19TSE9SVF9HSV8yME1IWl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFNob3J0R0kyME1oekVuYWJsZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NIT1JUX0dJXzIwTUhaX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NIT1JUX0dJXzIwTUhaX01JTiwKKwkJICAgICBDRkdfU0hPUlRfR0lfMjBNSFpfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfU0NBTl9SRVNVTFRfQUdFX0NPVU5UX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgU2NhblJlc3VsdEFnZUNvdW50LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfU0NBTl9SRVNVTFRfQUdFX0NPVU5UX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9DT1VOVF9NSU4sCisJCSAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9DT1VOVF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9OQ05QU19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5TY2FuQWdlVGltZU5DTlBTLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNOUFNfREVGQVVMVCwKKwkJICAgICBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNOUFNfTUlOLAorCQkgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9OQ05QU19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9OQ1BTX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblNjYW5BZ2VUaW1lTkNQUywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DUFNfREVGQVVMVCwKKwkJICAgICBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNQU19NSU4sCisJCSAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DUFNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfQ05QU19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5TY2FuQWdlVGltZUNOUFMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DTlBTX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NOUFNfTUlOLAorCQkgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DTlBTX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NQU19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5TY2FuQWdlVGltZUNQUywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NQU19ERUZBVUxULAorCQkgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DUFNfTUlOLAorCQkgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DUFNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUlNTSV9DQVRFR09SWV9HQVBfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuUnNzaUNhdEdhcCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JTU0lfQ0FURUdPUllfR0FQX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JTU0lfQ0FURUdPUllfR0FQX01JTiwKKwkJICAgICBDRkdfUlNTSV9DQVRFR09SWV9HQVBfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfU0hPUlRfUFJFQU1CTEVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmSXNTaG9ydFByZWFtYmxlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfU0hPUlRfUFJFQU1CTEVfREVGQVVMVCwKKwkJICAgICBDRkdfU0hPUlRfUFJFQU1CTEVfTUlOLAorCQkgICAgIENGR19TSE9SVF9QUkVBTUJMRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFX1NUUklORyhDRkdfSUJTU19CU1NJRF9OQU1FLCBXTEFOX1BBUkFNX01hY0FkZHIsCisJCQkgICAgc3RydWN0IGhkZF9jb25maWcsIElic3NCc3NpZCwKKwkJCSAgICBWQVJfRkxBR1NfT1BUSU9OQUwsCisJCQkgICAgKHZvaWQgKilDRkdfSUJTU19CU1NJRF9ERUZBVUxUKSwKKworCVJFR19WQVJJQUJMRV9TVFJJTkcoQ0ZHX0lOVEYwX01BQ19BRERSX05BTUUsIFdMQU5fUEFSQU1fTWFjQWRkciwKKwkJCSAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaW50Zk1hY0FkZHJbMF0sCisJCQkgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkJICAgICh2b2lkICopQ0ZHX0lOVEYwX01BQ19BRERSX0RFRkFVTFQpLAorCisJUkVHX1ZBUklBQkxFX1NUUklORyhDRkdfSU5URjFfTUFDX0FERFJfTkFNRSwgV0xBTl9QQVJBTV9NYWNBZGRyLAorCQkJICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpbnRmTWFjQWRkclsxXSwKKwkJCSAgICBWQVJfRkxBR1NfT1BUSU9OQUwsCisJCQkgICAgKHZvaWQgKilDRkdfSU5URjFfTUFDX0FERFJfREVGQVVMVCksCisKKwlSRUdfVkFSSUFCTEVfU1RSSU5HKENGR19JTlRGMl9NQUNfQUREUl9OQU1FLCBXTEFOX1BBUkFNX01hY0FkZHIsCisJCQkgICAgc3RydWN0IGhkZF9jb25maWcsIGludGZNYWNBZGRyWzJdLAorCQkJICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKwkJCSAgICAodm9pZCAqKUNGR19JTlRGMl9NQUNfQUREUl9ERUZBVUxUKSwKKworCVJFR19WQVJJQUJMRV9TVFJJTkcoQ0ZHX0lOVEYzX01BQ19BRERSX05BTUUsIFdMQU5fUEFSQU1fTWFjQWRkciwKKwkJCSAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaW50Zk1hY0FkZHJbM10sCisJCQkgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkJICAgICh2b2lkICopQ0ZHX0lOVEYzX01BQ19BRERSX0RFRkFVTFQpLAorCisJUkVHX1ZBUklBQkxFKENGR19BUF9RT1NfVUFQU0RfTU9ERV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGFwVWFwc2RFbmFibGVkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQVBfUU9TX1VBUFNEX01PREVfREVGQVVMVCwKKwkJICAgICBDRkdfQVBfUU9TX1VBUFNEX01PREVfTUlOLAorCQkgICAgIENGR19BUF9RT1NfVUFQU0RfTU9ERV9NQVgpLAorCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0FQX0VOQUJMRV9SQU5ET01fQlNTSURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBhcFJhbmRvbUJzc2lkRW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FQX0VOQUJMRV9SQU5ET01fQlNTSURfREVGQVVMVCwKKwkJICAgICBDRkdfQVBfRU5BQkxFX1JBTkRPTV9CU1NJRF9NSU4sCisJCSAgICAgQ0ZHX0FQX0VOQUJMRV9SQU5ET01fQlNTSURfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQVBfRU5BQkxFX1BST1RFQ1RJT05fTU9ERV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGFwUHJvdEVuYWJsZWQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19BUF9FTkFCTEVfUFJPVEVDVElPTl9NT0RFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FQX0VOQUJMRV9QUk9URUNUSU9OX01PREVfTUlOLAorCQkgICAgIENGR19BUF9FTkFCTEVfUFJPVEVDVElPTl9NT0RFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0FQX1BST1RFQ1RJT05fTU9ERV9OQU1FLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGFwUHJvdGVjdGlvbiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FQX1BST1RFQ1RJT05fTU9ERV9ERUZBVUxULAorCQkgICAgIENGR19BUF9QUk9URUNUSU9OX01PREVfTUlOLAorCQkgICAgIENGR19BUF9QUk9URUNUSU9OX01PREVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQVBfT0JTU19QUk9URUNUSU9OX01PREVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBhcE9CU1NQcm90RW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FQX09CU1NfUFJPVEVDVElPTl9NT0RFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FQX09CU1NfUFJPVEVDVElPTl9NT0RFX01JTiwKKwkJICAgICBDRkdfQVBfT0JTU19QUk9URUNUSU9OX01PREVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQVBfU1RBX1NFQ1VSSVRZX1NFUEVSQVRJT05fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBhcERpc2FibGVJbnRyYUJzc0Z3ZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FQX1NUQV9TRUNVUklUWV9TRVBFUkFUSU9OX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FQX1NUQV9TRUNVUklUWV9TRVBFUkFUSU9OX01JTiwKKwkJICAgICBDRkdfQVBfU1RBX1NFQ1VSSVRZX1NFUEVSQVRJT05fTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0xURV9DT0VYLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZUxURUNvZXgsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTFRFX0NPRVhfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0xURV9DT0VYX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX0xURV9DT0VYX01BWCksCisJUkVHX1ZBUklBQkxFKENGR19GT1JDRV9TQVBfQUNTLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCXN0cnVjdCBoZGRfY29uZmlnLCBmb3JjZV9zYXBfYWNzLAorCQlWQVJfRkxBR1NfRFlOQU1JQ19DRkcgfAorCQlWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCUNGR19GT1JDRV9TQVBfQUNTX0RFRkFVTFQsCisJCUNGR19GT1JDRV9TQVBfQUNTX01JTiwKKwkJQ0ZHX0ZPUkNFX1NBUF9BQ1NfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRk9SQ0VfU0FQX0FDU19TVEFSVF9DSCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQlzdHJ1Y3QgaGRkX2NvbmZpZywgZm9yY2Vfc2FwX2Fjc19zdF9jaCwKKwkJVkFSX0ZMQUdTX0RZTkFNSUNfQ0ZHIHwKKwkJVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQlDRkdfRk9SQ0VfU0FQX0FDU19TVEFSVF9DSF9ERUZBVUxULAorCQlDRkdfRk9SQ0VfU0FQX0FDU19TVEFSVF9DSF9NSU4sCisJCUNGR19GT1JDRV9TQVBfQUNTX1NUQVJUX0NIX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0ZPUkNFX1NBUF9BQ1NfRU5EX0NILCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCXN0cnVjdCBoZGRfY29uZmlnLCBmb3JjZV9zYXBfYWNzX2VuZF9jaCwKKwkJVkFSX0ZMQUdTX0RZTkFNSUNfQ0ZHIHwKKwkJVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQlDRkdfRk9SQ0VfU0FQX0FDU19FTkRfQ0hfREVGQVVMVCwKKwkJQ0ZHX0ZPUkNFX1NBUF9BQ1NfRU5EX0NIX01JTiwKKwkJQ0ZHX0ZPUkNFX1NBUF9BQ1NfRU5EX0NIX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0FQX0tFRVBfQUxJVkVfUEVSSU9EX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgYXBLZWVwQWxpdmVQZXJpb2QsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19BUF9LRUVQX0FMSVZFX1BFUklPRF9ERUZBVUxULAorCQkgICAgIENGR19BUF9LRUVQX0FMSVZFX1BFUklPRF9NSU4sCisJCSAgICAgQ0ZHX0FQX0tFRVBfQUxJVkVfUEVSSU9EX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0dPX0tFRVBfQUxJVkVfUEVSSU9EX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZ29LZWVwQWxpdmVQZXJpb2QsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19HT19LRUVQX0FMSVZFX1BFUklPRF9ERUZBVUxULAorCQkgICAgIENGR19HT19LRUVQX0FMSVZFX1BFUklPRF9NSU4sCisJCSAgICAgQ0ZHX0dPX0tFRVBfQUxJVkVfUEVSSU9EX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0FQX0xJTktfTU9OSVRPUl9QRVJJT0RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBhcExpbmtNb25pdG9yUGVyaW9kLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQVBfTElOS19NT05JVE9SX1BFUklPRF9ERUZBVUxULAorCQkgICAgIENGR19BUF9MSU5LX01PTklUT1JfUEVSSU9EX01JTiwKKwkJICAgICBDRkdfQVBfTElOS19NT05JVE9SX1BFUklPRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19HT19MSU5LX01PTklUT1JfUEVSSU9EX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZ29MaW5rTW9uaXRvclBlcmlvZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0dPX0xJTktfTU9OSVRPUl9QRVJJT0RfREVGQVVMVCwKKwkJICAgICBDRkdfR09fTElOS19NT05JVE9SX1BFUklPRF9NSU4sCisJCSAgICAgQ0ZHX0dPX0xJTktfTU9OSVRPUl9QRVJJT0RfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRElTQUJMRV9QQUNLRVRfRklMVEVSLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGRpc2FibGVQYWNrZXRGaWx0ZXIsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19ESVNBQkxFX1BBQ0tFVF9GSUxURVJfREVGQVVMVCwKKwkJICAgICBDRkdfRElTQUJMRV9QQUNLRVRfRklMVEVSX01JTiwKKwkJICAgICBDRkdfRElTQUJMRV9QQUNLRVRfRklMVEVSX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0JFQUNPTl9JTlRFUlZBTF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5CZWFjb25JbnRlcnZhbCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX0JFQUNPTl9JTlRFUlZBTF9ERUZBVUxULAorCQkgICAgIENGR19CRUFDT05fSU5URVJWQUxfTUlOLAorCQkgICAgIENGR19CRUFDT05fSU5URVJWQUxfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUk9BTUlOR19USU1FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblJvYW1pbmdUaW1lLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUk9BTUlOR19USU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JPQU1JTkdfVElNRV9NSU4sCisJCSAgICAgQ0ZHX1JPQU1JTkdfVElNRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19WQ0NfUlNTSV9UUklHR0VSX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblZjY1Jzc2lUcmlnZ2VyLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVkNDX1JTU0lfVFJJR0dFUl9ERUZBVUxULAorCQkgICAgIENGR19WQ0NfUlNTSV9UUklHR0VSX01JTiwKKwkJICAgICBDRkdfVkNDX1JTU0lfVFJJR0dFUl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19WQ0NfVUxfTUFDX0xPU1NfVEhSRVNIX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblZjY1VsTWFjTG9zc1RocmVzaG9sZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZDQ19VTF9NQUNfTE9TU19USFJFU0hfREVGQVVMVCwKKwkJICAgICBDRkdfVkNDX1VMX01BQ19MT1NTX1RIUkVTSF9NSU4sCisJCSAgICAgQ0ZHX1ZDQ19VTF9NQUNfTE9TU19USFJFU0hfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblBhc3NpdmVNYXhDaG5UaW1lLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1BBU1NJVkVfTUFYX0NIQU5ORUxfVElNRV9NSU4sCisJCSAgICAgQ0ZHX1BBU1NJVkVfTUFYX0NIQU5ORUxfVElNRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19QQVNTSVZFX01JTl9DSEFOTkVMX1RJTUVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuUGFzc2l2ZU1pbkNoblRpbWUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19QQVNTSVZFX01JTl9DSEFOTkVMX1RJTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX01JTiwKKwkJICAgICBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbkFjdGl2ZU1heENoblRpbWUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9ERUZBVUxULAorCQkgICAgIENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9NSU4sCisJCSAgICAgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbkFjdGl2ZU1pbkNoblRpbWUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9ERUZBVUxULAorCQkgICAgIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9NSU4sCisJCSAgICAgQ0ZHX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1JFVFJZX0xJTUlUX1pFUk9fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCByZXRyeUxpbWl0WmVybywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JFVFJZX0xJTUlUX1pFUk9fREVGQVVMVCwKKwkJICAgICBDRkdfUkVUUllfTElNSVRfWkVST19NSU4sCisJCSAgICAgQ0ZHX1JFVFJZX0xJTUlUX1pFUk9fTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUkVUUllfTElNSVRfT05FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgcmV0cnlMaW1pdE9uZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JFVFJZX0xJTUlUX09ORV9ERUZBVUxULAorCQkgICAgIENGR19SRVRSWV9MSU1JVF9PTkVfTUlOLAorCQkgICAgIENGR19SRVRSWV9MSU1JVF9PTkVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUkVUUllfTElNSVRfVFdPX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgcmV0cnlMaW1pdFR3bywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JFVFJZX0xJTUlUX1RXT19ERUZBVUxULAorCQkgICAgIENGR19SRVRSWV9MSU1JVF9UV09fTUlOLAorCQkgICAgIENGR19SRVRSWV9MSU1JVF9UV09fTUFYKSwKKworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisJUkVHX1ZBUklBQkxFKENGR19QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQ19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5QYXNzaXZlTWF4Q2huVGltZUNvbmMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQ19ERUZBVUxULAorCQkgICAgIENGR19QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQ19NSU4sCisJCSAgICAgQ0ZHX1BBU1NJVkVfTUFYX0NIQU5ORUxfVElNRV9DT05DX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblBhc3NpdmVNaW5DaG5UaW1lQ29uYywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DX01JTiwKKwkJICAgICBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX0NPTkNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQUNUSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQ19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5BY3RpdmVNYXhDaG5UaW1lQ29uYywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX0NPTkNfREVGQVVMVCwKKwkJICAgICBDRkdfQUNUSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQ19NSU4sCisJCSAgICAgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX0NPTkNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQUNUSVZFX01JTl9DSEFOTkVMX1RJTUVfQ09OQ19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5BY3RpdmVNaW5DaG5UaW1lQ29uYywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX0NPTkNfREVGQVVMVCwKKwkJICAgICBDRkdfQUNUSVZFX01JTl9DSEFOTkVMX1RJTUVfQ09OQ19NSU4sCisJCSAgICAgQ0ZHX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX0NPTkNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUkVTVF9USU1FX0NPTkNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuUmVzdFRpbWVDb25jLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUkVTVF9USU1FX0NPTkNfREVGQVVMVCwKKwkJICAgICBDRkdfUkVTVF9USU1FX0NPTkNfTUlOLAorCQkgICAgIENGR19SRVNUX1RJTUVfQ09OQ19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19OVU1fU1RBX0NIQU5fQ09NQklORURfQ09OQ19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5OdW1TdGFDaGFuQ29tYmluZWRDb25jLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfTlVNX1NUQV9DSEFOX0NPTUJJTkVEX0NPTkNfREVGQVVMVCwKKwkJICAgICBDRkdfTlVNX1NUQV9DSEFOX0NPTUJJTkVEX0NPTkNfTUlOLAorCQkgICAgIENGR19OVU1fU1RBX0NIQU5fQ09NQklORURfQ09OQ19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19OVU1fUDJQX0NIQU5fQ09NQklORURfQ09OQ19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5OdW1QMlBDaGFuQ29tYmluZWRDb25jLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfTlVNX1AyUF9DSEFOX0NPTUJJTkVEX0NPTkNfREVGQVVMVCwKKwkJICAgICBDRkdfTlVNX1AyUF9DSEFOX0NPTUJJTkVEX0NPTkNfTUlOLAorCQkgICAgIENGR19OVU1fUDJQX0NIQU5fQ09NQklORURfQ09OQ19NQVgpLAorI2VuZGlmCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX01BWF9QU19QT0xMX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbk1heFBzUG9sbCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX01BWF9QU19QT0xMX0RFRkFVTFQsCisJCSAgICAgQ0ZHX01BWF9QU19QT0xMX01JTiwKKwkJICAgICBDRkdfTUFYX1BTX1BPTExfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfTUFYX1RYX1BPV0VSX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblR4UG93ZXJDYXAsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19NQVhfVFhfUE9XRVJfREVGQVVMVCwKKwkJICAgICBDRkdfTUFYX1RYX1BPV0VSX01JTiwKKwkJICAgICBDRkdfTUFYX1RYX1BPV0VSX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0xPV19HQUlOX09WRVJSSURFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZklzTG93R2Fpbk92ZXJyaWRlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfTE9XX0dBSU5fT1ZFUlJJREVfREVGQVVMVCwKKwkJICAgICBDRkdfTE9XX0dBSU5fT1ZFUlJJREVfTUlOLAorCQkgICAgIENGR19MT1dfR0FJTl9PVkVSUklERV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuUnNzaUZpbHRlclBlcmlvZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JTU0lfRklMVEVSX1BFUklPRF9ERUZBVUxULAorCQkgICAgIENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfTUlOLAorCQkgICAgIENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSUdOT1JFX0RUSU1fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmSWdub3JlRHRpbSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lHTk9SRV9EVElNX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lHTk9SRV9EVElNX01JTiwKKwkJICAgICBDRkdfSUdOT1JFX0RUSU1fTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfTUFYX0xJX01PRFVMQVRFRF9EVElNX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZk1heExJTW9kdWxhdGVkRFRJTSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX01BWF9MSV9NT0RVTEFURURfRFRJTV9ERUZBVUxULAorCQkgICAgIENGR19NQVhfTElfTU9EVUxBVEVEX0RUSU1fTUlOLAorCQkgICAgIENGR19NQVhfTElfTU9EVUxBVEVEX0RUSU1fTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUlhfQU5UX0NPTkZJR1VSQVRJT05fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuUnhBbnQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19SWF9BTlRfQ09ORklHVVJBVElPTl9OQU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JYX0FOVF9DT05GSUdVUkFUSU9OX05BTUVfTUlOLAorCQkgICAgIENGR19SWF9BTlRfQ09ORklHVVJBVElPTl9OQU1FX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0ZXX0hFQVJUX0JFQVRfTU9OSVRPUklOR19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZFbmFibGVGd0hlYXJ0QmVhdE1vbml0b3JpbmcsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19GV19IRUFSVF9CRUFUX01PTklUT1JJTkdfREVGQVVMVCwKKwkJICAgICBDRkdfRldfSEVBUlRfQkVBVF9NT05JVE9SSU5HX01JTiwKKwkJICAgICBDRkdfRldfSEVBUlRfQkVBVF9NT05JVE9SSU5HX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0ZXX0JFQUNPTl9GSUxURVJJTkdfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmRW5hYmxlRndCZWFjb25GaWx0ZXJpbmcsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19GV19CRUFDT05fRklMVEVSSU5HX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0ZXX0JFQUNPTl9GSUxURVJJTkdfTUlOLAorCQkgICAgIENGR19GV19CRUFDT05fRklMVEVSSU5HX01BWCksCisKKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfRldfUlNTSV9NT05JVE9SSU5HX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZFbmFibGVGd1Jzc2lNb25pdG9yaW5nLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19GV19SU1NJX01PTklUT1JJTkdfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX0ZXX1JTU0lfTU9OSVRPUklOR19NSU4sCisJCQkgICAgIENGR19GV19SU1NJX01PTklUT1JJTkdfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X2Z3X3Jzc2lfbW9uaXRvcmluZywgMCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0ZXX01DQ19SVFNfQ1RTX1BST1RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQlzdHJ1Y3QgaGRkX2NvbmZpZywgbWNjX3J0c19jdHNfcHJvdF9lbmFibGUsCisJCVZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJQ0ZHX0ZXX01DQ19SVFNfQ1RTX1BST1RfREVGQVVMVCwKKwkJQ0ZHX0ZXX01DQ19SVFNfQ1RTX1BST1RfTUlOLAorCQlDRkdfRldfTUNDX1JUU19DVFNfUFJPVF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19GV19NQ0NfQkNBU1RfUFJPQl9SRVNQX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJc3RydWN0IGhkZF9jb25maWcsIG1jY19iY2FzdF9wcm9iX3Jlc3BfZW5hYmxlLAorCQlWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCUNGR19GV19NQ0NfQkNBU1RfUFJPQl9SRVNQX0RFRkFVTFQsCisJCUNGR19GV19NQ0NfQkNBU1RfUFJPQl9SRVNQX01JTiwKKwkJQ0ZHX0ZXX01DQ19CQ0FTVF9QUk9CX1JFU1BfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuRGF0YUluYWN0aXZpdHlUaW1lb3V0LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfREVGQVVMVCwKKwkJICAgICBDRkdfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfTUlOLAorCQkgICAgIENGR19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX01PREVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBXbW1Nb2RlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9NT0RFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fTU9ERV9NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fTU9ERV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NXzgwMjExRV9FTkFCTEVEX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgYjgwMjExZUlzRW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fODAyMTFFX0VOQUJMRURfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV84MDIxMUVfRU5BQkxFRF9NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fODAyMTFFX0VOQUJMRURfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUU9TX1dNTV9VQVBTRF9NQVNLX05BTUUsIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgVWFwc2RNYXNrLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9VQVBTRF9NQVNLX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fVUFQU0RfTUFTS19NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fVUFQU0RfTUFTS19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZPX1NSVl9JTlRWX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYVVhcHNkVm9TcnZJbnR2LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TUlZfSU5UVl9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZPX1NSVl9JTlRWX01JTiwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TUlZfSU5UVl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZPX1NVU19JTlRWX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYVVhcHNkVm9TdXNwSW50diwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1VTX0lOVFZfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TVVNfSU5UVl9NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1VTX0lOVFZfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TUlZfSU5UVl9OQU1FLAorCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSW5mcmFVYXBzZFZpU3J2SW50diwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1JWX0lOVFZfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TUlZfSU5UVl9NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1JWX0lOVFZfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TVVNfSU5UVl9OQU1FLAorCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSW5mcmFVYXBzZFZpU3VzcEludHYsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZJX1NVU19JTlRWX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1VTX0lOVFZfTUlOLAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZJX1NVU19JTlRWX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQkVfU1JWX0lOVFZfTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEluZnJhVWFwc2RCZVNydkludHYsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NSVl9JTlRWX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQkVfU1JWX0lOVFZfTUlOLAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NSVl9JTlRWX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQkVfU1VTX0lOVFZfTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEluZnJhVWFwc2RCZVN1c3BJbnR2LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TVVNfSU5UVl9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NVU19JTlRWX01JTiwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TVVNfSU5UVl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JLX1NSVl9JTlRWX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYVVhcHNkQmtTcnZJbnR2LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TUlZfSU5UVl9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JLX1NSVl9JTlRWX01JTiwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TUlZfSU5UVl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JLX1NVU19JTlRWX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYVVhcHNkQmtTdXNwSW50diwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1VTX0lOVFZfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TVVNfSU5UVl9NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1VTX0lOVFZfTUFYKSwKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fSU5GUkFfSU5BQ1RJVklUWV9JTlRFUlZBTF9OQU1FLAorCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSW5mcmFJbmFjdGl2aXR5SW50ZXJ2YWwsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX0lOQUNUSVZJVFlfSU5URVJWQUxfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9JTkFDVElWSVRZX0lOVEVSVkFMX01JTiwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9JTkFDVElWSVRZX0lOVEVSVkFMX01BWCksCisKKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfRVNFX0ZFQVRVUkVfRU5BQkxFRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpc0VzZUluaUZlYXR1cmVFbmFibGVkLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19FU0VfRkVBVFVSRV9FTkFCTEVEX0RFRkFVTFQsCisJCQkgICAgIENGR19FU0VfRkVBVFVSRV9FTkFCTEVEX01JTiwKKwkJCSAgICAgQ0ZHX0VTRV9GRUFUVVJFX0VOQUJMRURfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X2VzZV9mZWF0dXJlX2VuYWJsZWQsIDApLAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwkvKiBmbGFnIHRvIHR1cm4gT04vT0ZGIExlZ2FjeSBGYXN0IFJvYW1pbmcgKi8KKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQsCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX0xGUl9GRUFUVVJFX0VOQUJMRURfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX0xGUl9GRUFUVVJFX0VOQUJMRURfTUlOLAorCQkJICAgICBDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9NQVgsCisJCQkgICAgIG5vdGlmeV9pc19mYXN0X3JvYW1faW5pX2ZlYXR1cmVfZW5hYmxlZCwgMCksCisKKwkvKiBmbGFnIHRvIHR1cm4gT04vT0ZGIE1vdGlvbiBhc3Npc3RhbmNlIGZvciBMZWdhY3kgRmFzdCBSb2FtaW5nICovCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX0xGUl9NQVdDX0ZFQVRVUkVfRU5BQkxFRF9OQU1FLAorCQkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBNQVdDRW5hYmxlZCwKKwkJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwKKwkJCSAgICAgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkJICAgICBDRkdfTEZSX01BV0NfRkVBVFVSRV9FTkFCTEVEX0RFRkFVTFQsCisJCQkgICAgIENGR19MRlJfTUFXQ19GRUFUVVJFX0VOQUJMRURfTUlOLAorCQkJICAgICBDRkdfTEZSX01BV0NfRkVBVFVSRV9FTkFCTEVEX01BWCwKKwkJCSAgICAgbm90aWZ5X2lzX21hd2NfaW5pX2ZlYXR1cmVfZW5hYmxlZCwgMCksCisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTEZSICovCisKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwkvKiBmbGFnIHRvIHR1cm4gT04vT0ZGIDExciBhbmQgRVNFIEZhc3RUcmFuc2l0aW9uICovCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX0ZBU1RfVFJBTlNJVElPTl9FTkFCTEVEX05BTUUsCisJCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGlzRmFzdFRyYW5zaXRpb25FbmFibGVkLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19GQVNUX1RSQU5TSVRJT05fRU5BQkxFRF9OQU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19GQVNUX1RSQU5TSVRJT05fRU5BQkxFRF9OQU1FX01JTiwKKwkJCSAgICAgQ0ZHX0ZBU1RfVFJBTlNJVElPTl9FTkFCTEVEX05BTUVfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X2Zhc3RfdHJhbnNpdGlvbl9lbmFibGVkLCAwKSwKKworCS8qIFZhcmlhYmxlIHRvIHNwZWNpZnkgdGhlIGRlbHRhL2RpZmZlcmVuY2UgYmV0d2VlbiB0aGUgUlNTSSBvZiBjdXJyZW50IEFQCisJICogYW5kIHJvYW1hYmxlIEFQIHdoaWxlIHJvYW1pbmcgKi8KKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfUk9BTV9SU1NJX0RJRkZfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgUm9hbVJzc2lEaWZmLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19ST0FNX1JTU0lfRElGRl9ERUZBVUxULAorCQkJICAgICBDRkdfUk9BTV9SU1NJX0RJRkZfTUlOLAorCQkJICAgICBDRkdfUk9BTV9SU1NJX0RJRkZfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X3JvYW1fcnNzaV9kaWZmLCAwKSwKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19FTkFCTEVfV0VTX01PREVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaXNXRVNNb2RlRW5hYmxlZCwKKwkJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwKKwkJCSAgICAgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkJICAgICBDRkdfRU5BQkxFX1dFU19NT0RFX05BTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX0VOQUJMRV9XRVNfTU9ERV9OQU1FX01JTiwKKwkJCSAgICAgQ0ZHX0VOQUJMRV9XRVNfTU9ERV9OQU1FX01BWCwKKwkJCSAgICAgY2Jfbm90aWZ5X3NldF93ZXNfbW9kZSwgMCksCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fT0tDCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX09LQ19GRUFUVVJFX0VOQUJMRURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaXNPa2NJbmlGZWF0dXJlRW5hYmxlZCwKKwkJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwKKwkJCSAgICAgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkJICAgICBDRkdfT0tDX0ZFQVRVUkVfRU5BQkxFRF9ERUZBVUxULAorCQkJICAgICBDRkdfT0tDX0ZFQVRVUkVfRU5BQkxFRF9NSU4sCisJCQkgICAgIENGR19PS0NfRkVBVFVSRV9FTkFCTEVEX01BWCwKKwkJCSAgICAgY2Jfbm90aWZ5X3NldF9va2NfZmVhdHVyZV9lbmFibGVkLCAwKSwKKyNlbmRpZgorCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19ST0FNX1NDQU5fT0ZGTE9BRF9FTkFCTEVELCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQsCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fU0NBTl9PRkZMT0FEX0VOQUJMRURfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fU0NBTl9PRkZMT0FEX0VOQUJMRURfTUlOLAorCQkJICAgICBDRkdfUk9BTV9TQ0FOX09GRkxPQURfRU5BQkxFRF9NQVgsCisJCQkgICAgIGNiX25vdGlmeV91cGRhdGVfcm9hbV9zY2FuX29mZmxvYWRfZW5hYmxlZCwgMCksCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX1BLVF9DTEFTU0lGWV9CQVNJU19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFBrdENsYXNzaWZpY2F0aW9uQmFzaXMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX1BLVF9DTEFTU0lGWV9CQVNJU19ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX1BLVF9DTEFTU0lGWV9CQVNJU19NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fUEtUX0NMQVNTSUZZX0JBU0lTX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZPX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSW5mcmFEaXJBY1ZvLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfVk9fREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfVk9fTUlOLAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WT19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVk9fTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0hleEludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEluZnJhTm9tTXNkdVNpemVBY1ZvLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZPX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19WT19NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19WT19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX1ZPX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYU1lYW5EYXRhUmF0ZUFjVm8sCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX1ZPX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVk9fTUlOLAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX1ZPX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZPX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYU1pblBoeVJhdGVBY1ZvLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfVk9fREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfVk9fTUlOLAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WT19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WT19OQU1FLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEluZnJhU2JhQWNWbywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX1ZPX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX1ZPX01JTiwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVk9fTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfVklfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYURpckFjVmksCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WSV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WSV9NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZJX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19WSV9OQU1FLAorCQkgICAgIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSW5mcmFOb21Nc2R1U2l6ZUFjVmksCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVklfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZJX01JTiwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZJX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVklfTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0hleEludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEluZnJhTWVhbkRhdGFSYXRlQWNWaSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVklfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WSV9NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVklfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfVklfTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0hleEludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEluZnJhTWluUGh5UmF0ZUFjVmksCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WSV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WSV9NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZJX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX1ZJX05BTUUsIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSW5mcmFTYmFBY1ZpLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVklfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVklfTUlOLAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WSV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEluZnJhRGlyQWNCZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX0JFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX0JFX01JTiwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQkVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JFX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYU5vbU1zZHVTaXplQWNCZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfQkVfTUlOLAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfQkVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CRV9OQU1FLAorCQkgICAgIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSW5mcmFNZWFuRGF0YVJhdGVBY0JlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JFX01JTiwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CRV9OQU1FLAorCQkgICAgIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSW5mcmFNaW5QaHlSYXRlQWNCZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX0JFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX0JFX01JTiwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfQkVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQkVfTkFNRSwgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYVNiYUFjQmUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19CRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19CRV9NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX0JLX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSW5mcmFEaXJBY0JrLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQktfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQktfTUlOLAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CS19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfQktfTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0hleEludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEluZnJhTm9tTXNkdVNpemVBY0JrLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JLX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CS19NSU4sCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CS19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JLX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYU1lYW5EYXRhUmF0ZUFjQmssCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JLX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfQktfTUlOLAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JLX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX0JLX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJbmZyYU1pblBoeVJhdGVBY0JrLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfQktfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfQktfTUlOLAorCQkgICAgIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CS19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19CS19OQU1FLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEluZnJhU2JhQWNCaywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JLX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JLX01JTiwKKwkJICAgICBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQktfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVExfREVMQVlFRF9UUkdSX0ZSTV9JTlRfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBEZWxheWVkVHJpZ2dlckZybUludCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RMX0RFTEFZRURfVFJHUl9GUk1fSU5UX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RMX0RFTEFZRURfVFJHUl9GUk1fSU5UX01JTiwKKwkJICAgICBDRkdfVExfREVMQVlFRF9UUkdSX0ZSTV9JTlRfTUFYKSwKKworCVJFR19WQVJJQUJMRV9TVFJJTkcoQ0ZHX1dPV0xfUEFUVEVSTl9OQU1FLCBXTEFOX1BBUkFNX1N0cmluZywKKwkJCSAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgd293bFBhdHRlcm4sCisJCQkgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkJICAgICh2b2lkICopQ0ZHX1dPV0xfUEFUVEVSTl9ERUZBVUxUKSwKKworCVJFR19WQVJJQUJMRShDRkdfUU9TX0lNUExJQ0lUX1NFVFVQX0VOQUJMRURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBiSW1wbGljaXRRb3NFbmFibGVkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX0lNUExJQ0lUX1NFVFVQX0VOQUJMRURfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX0lNUExJQ0lUX1NFVFVQX0VOQUJMRURfTUlOLAorCQkgICAgIENGR19RT1NfSU1QTElDSVRfU0VUVVBfRU5BQkxFRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19BUF9MSVNURU5fTU9ERV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5FbmFibGVMaXN0ZW5Nb2RlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQVBfTElTVEVOX01PREVfREVGQVVMVCwKKwkJICAgICBDRkdfQVBfTElTVEVOX01PREVfTUlOLAorCQkgICAgIENGR19BUF9MSVNURU5fTU9ERV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19BUF9BVVRPX1NIVVRfT0ZGLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5BUEF1dG9TaHV0T2ZmLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQVBfQVVUT19TSFVUX09GRl9ERUZBVUxULAorCQkgICAgIENGR19BUF9BVVRPX1NIVVRfT0ZGX01JTiwKKwkJICAgICBDRkdfQVBfQVVUT19TSFVUX09GRl9NQVgpLAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisJUkVHX1ZBUklBQkxFKENGR19XTEFOX01DQ19UT19TQ0NfU1dJVENIX01PREUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgV2xhbk1jY1RvU2NjU3dpdGNoTW9kZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0hfTU9ERV9ERUZBVUxULAorCQkgICAgIENGR19XTEFOX01DQ19UT19TQ0NfU1dJVENIX01PREVfTUlOLAorCQkgICAgIENGR19XTEFOX01DQ19UT19TQ0NfU1dJVENIX01PREVfTUFYKSwKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOCisJUkVHX1ZBUklBQkxFKENGR19XTEFOX0FVVE9fU0hVVERPV04sIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgV2xhbkF1dG9TaHV0ZG93biwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1dMQU5fQVVUT19TSFVURE9XTl9ERUZBVUxULAorCQkgICAgIENGR19XTEFOX0FVVE9fU0hVVERPV05fTUlOLAorCQkgICAgIENGR19XTEFOX0FVVE9fU0hVVERPV05fTUFYKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCVJFR19WQVJJQUJMRShDRkdfUlJNX0VOQUJMRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZScm1FbmFibGUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19SUk1fRU5BQkxFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JSTV9FTkFCTEVfTUlOLAorCQkgICAgIENGR19SUk1fRU5BQkxFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5JbkNoYW5NZWFzTWF4RHVyYXRpb24sCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fTUlOLAorCQkgICAgIENGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuT3V0Q2hhbk1lYXNNYXhEdXJhdGlvbiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX01JTiwKKwkJICAgICBDRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUlJNX01FQVNfUkFORE9NSVpBVElPTl9JTlRWTF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5Scm1SYW5kbkludHZsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUlJNX01FQVNfUkFORE9NSVpBVElPTl9JTlRWTF9ERUZBVUxULAorCQkgICAgIENGR19SUk1fTUVBU19SQU5ET01JWkFUSU9OX0lOVFZMX01JTiwKKwkJICAgICBDRkdfUlJNX01FQVNfUkFORE9NSVpBVElPTl9JTlRWTF9NQVgpLAorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCVJFR19WQVJJQUJMRShDRkdfRlRfUkVTT1VSQ0VfUkVRX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZkZUUmVzb3VyY2VSZXFTdXBwb3J0ZWQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19GVF9SRVNPVVJDRV9SRVFfREVGQVVMVCwKKwkJICAgICBDRkdfRlRfUkVTT1VSQ0VfUkVRX01JTiwKKwkJICAgICBDRkdfRlRfUkVTT1VSQ0VfUkVRX01BWCksCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX05FSUdIQk9SX1NDQU5fVElNRVJfUEVSSU9EX05BTUUsCisJCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5OZWlnaGJvclNjYW5QZXJpb2QsCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fVElNRVJfUEVSSU9EX0RFRkFVTFQsCisJCQkgICAgIENGR19ORUlHSEJPUl9TQ0FOX1RJTUVSX1BFUklPRF9NSU4sCisJCQkgICAgIENGR19ORUlHSEJPUl9TQ0FOX1RJTUVSX1BFUklPRF9NQVgsCisJCQkgICAgIGNiX25vdGlmeV9zZXRfbmVpZ2hib3Jfc2Nhbl9wZXJpb2QsIDApLAorCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX05FSUdIQk9SX0xPT0tVUF9SU1NJX1RIUkVTSE9MRF9OQU1FLAorCQkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuTmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19ORUlHSEJPUl9MT09LVVBfUlNTSV9USFJFU0hPTERfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX05FSUdIQk9SX0xPT0tVUF9SU1NJX1RIUkVTSE9MRF9NSU4sCisJCQkgICAgIENGR19ORUlHSEJPUl9MT09LVVBfUlNTSV9USFJFU0hPTERfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X25laWdoYm9yX2xvb2t1cF9yc3NpX3RocmVzaG9sZCwgMCksCisKKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfT1BQT1JUVU5JU1RJQ19TQ0FOX1RIUkVTSE9MRF9ESUZGX05BTUUsCisJCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZiwKKwkJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwKKwkJCSAgICAgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkJICAgICBDRkdfT1BQT1JUVU5JU1RJQ19TQ0FOX1RIUkVTSE9MRF9ESUZGX0RFRkFVTFQsCisJCQkgICAgIENGR19PUFBPUlRVTklTVElDX1NDQU5fVEhSRVNIT0xEX0RJRkZfTUlOLAorCQkJICAgICBDRkdfT1BQT1JUVU5JU1RJQ19TQ0FOX1RIUkVTSE9MRF9ESUZGX01BWCwKKwkJCSAgICAgY2Jfbm90aWZ5X3NldF9vcHBvcnR1bmlzdGljX3NjYW5fdGhyZXNob2xkX2RpZmYsIDApLAorCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX1JPQU1fUkVTQ0FOX1JTU0lfRElGRl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuUm9hbVJlc2NhblJzc2lEaWZmLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19ST0FNX1JFU0NBTl9SU1NJX0RJRkZfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fUkVTQ0FOX1JTU0lfRElGRl9NSU4sCisJCQkgICAgIENGR19ST0FNX1JFU0NBTl9SU1NJX0RJRkZfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X3JvYW1fcmVzY2FuX3Jzc2lfZGlmZiwgMCksCisKKwlSRUdfVkFSSUFCTEVfU1RSSU5HKENGR19ORUlHSEJPUl9TQ0FOX0NIQU5fTElTVF9OQU1FLCBXTEFOX1BBUkFNX1N0cmluZywKKwkJCSAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbmVpZ2hib3JTY2FuQ2hhbkxpc3QsCisJCQkgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkJICAgICh2b2lkICopQ0ZHX05FSUdIQk9SX1NDQU5fQ0hBTl9MSVNUX0RFRkFVTFQpLAorCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX05FSUdIQk9SX1NDQU5fTUlOX0NIQU5fVElNRV9OQU1FLAorCQkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuTmVpZ2hib3JTY2FuTWluQ2hhblRpbWUsCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fTUlOX0NIQU5fVElNRV9ERUZBVUxULAorCQkJICAgICBDRkdfTkVJR0hCT1JfU0NBTl9NSU5fQ0hBTl9USU1FX01JTiwKKwkJCSAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fTUlOX0NIQU5fVElNRV9NQVgsCisJCQkgICAgIGNiX25vdGlmeV9zZXRfbmVpZ2hib3Jfc2Nhbl9taW5fY2hhbl90aW1lLCAwKSwKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfTkFNRSwKKwkJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbk5laWdoYm9yU2Nhbk1heENoYW5UaW1lLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fTUFYX0NIQU5fVElNRV9NSU4sCisJCQkgICAgIENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X25laWdoYm9yX3NjYW5fbWF4X2NoYW5fdGltZSwgMCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHXzExUl9ORUlHSEJPUl9SRVFfTUFYX1RSSUVTX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbk1heE5laWdoYm9yUmVxVHJpZXMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR18xMVJfTkVJR0hCT1JfUkVRX01BWF9UUklFU19ERUZBVUxULAorCQkgICAgIENGR18xMVJfTkVJR0hCT1JfUkVRX01BWF9UUklFU19NSU4sCisJCSAgICAgQ0ZHXzExUl9ORUlHSEJPUl9SRVFfTUFYX1RSSUVTX01BWCksCisKKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfTkVJR0hCT1JfU0NBTl9SRVNVTFRTX1JFRlJFU0hfUEVSSU9EX05BTUUsCisJCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5OZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19ORUlHSEJPUl9TQ0FOX1JFU1VMVFNfUkVGUkVTSF9QRVJJT0RfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fUkVTVUxUU19SRUZSRVNIX1BFUklPRF9NSU4sCisJCQkgICAgIENGR19ORUlHSEJPUl9TQ0FOX1JFU1VMVFNfUkVGUkVTSF9QRVJJT0RfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X25laWdoYm9yX3Jlc3VsdHNfcmVmcmVzaF9wZXJpb2QsIDApLAorCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX0VNUFRZX1NDQU5fUkVGUkVTSF9QRVJJT0RfTkFNRSwKKwkJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbkVtcHR5U2NhblJlZnJlc2hQZXJpb2QsCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX0VNUFRZX1NDQU5fUkVGUkVTSF9QRVJJT0RfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX0VNUFRZX1NDQU5fUkVGUkVTSF9QRVJJT0RfTUlOLAorCQkJICAgICBDRkdfRU1QVFlfU0NBTl9SRUZSRVNIX1BFUklPRF9NQVgsCisJCQkgICAgIGNiX25vdGlmeV9zZXRfZW1wdHlfc2Nhbl9yZWZyZXNoX3BlcmlvZCwgMCksCisKKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfUk9BTV9CTUlTU19GSVJTVF9CQ05UX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5Sb2FtQm1pc3NGaXJzdEJjbnQsCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fQk1JU1NfRklSU1RfQkNOVF9ERUZBVUxULAorCQkJICAgICBDRkdfUk9BTV9CTUlTU19GSVJTVF9CQ05UX01JTiwKKwkJCSAgICAgQ0ZHX1JPQU1fQk1JU1NfRklSU1RfQkNOVF9NQVgsCisJCQkgICAgIGNiX25vdGlmeV9zZXRfcm9hbV9ibWlzc19maXJzdF9iY250LCAwKSwKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19ST0FNX0JNSVNTX0ZJTkFMX0JDTlRfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblJvYW1CbWlzc0ZpbmFsQmNudCwKKwkJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwKKwkJCSAgICAgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkJICAgICBDRkdfUk9BTV9CTUlTU19GSU5BTF9CQ05UX0RFRkFVTFQsCisJCQkgICAgIENGR19ST0FNX0JNSVNTX0ZJTkFMX0JDTlRfTUlOLAorCQkJICAgICBDRkdfUk9BTV9CTUlTU19GSU5BTF9CQ05UX01BWCwKKwkJCSAgICAgY2Jfbm90aWZ5X3NldF9yb2FtX2JtaXNzX2ZpbmFsX2JjbnQsIDApLAorCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX1JPQU1fQkVBQ09OX1JTU0lfV0VJR0hUX05BTUUsCisJCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5Sb2FtQmVhY29uUnNzaVdlaWdodCwKKwkJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwKKwkJCSAgICAgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkJICAgICBDRkdfUk9BTV9CRUFDT05fUlNTSV9XRUlHSFRfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fQkVBQ09OX1JTU0lfV0VJR0hUX01JTiwKKwkJCSAgICAgQ0ZHX1JPQU1fQkVBQ09OX1JTU0lfV0VJR0hUX01BWCwKKwkJCSAgICAgY2Jfbm90aWZ5X3NldF9yb2FtX2JlYWNvbl9yc3NpX3dlaWdodCwgMCksCisKKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfUk9BTUlOR19ERlNfQ0hBTk5FTF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBhbGxvd0RGU0NoYW5uZWxSb2FtLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19ST0FNSU5HX0RGU19DSEFOTkVMX0RFRkFVTFQsCisJCQkgICAgIENGR19ST0FNSU5HX0RGU19DSEFOTkVMX01JTiwKKwkJCSAgICAgQ0ZHX1JPQU1JTkdfREZTX0NIQU5ORUxfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X2Rmc19zY2FuX21vZGUsIDApLAorCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX0RFTEFZX0JFRk9SRV9WREVWX1NUT1BfTkFNRSwKKwkJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywKKwkJCSAgICAgZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcCwKKwkJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwKKwkJCQlWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19ERUxBWV9CRUZPUkVfVkRFVl9TVE9QX0RFRkFVTFQsCisJCQkgICAgIENGR19ERUxBWV9CRUZPUkVfVkRFVl9TVE9QX01JTiwKKwkJCSAgICAgQ0ZHX0RFTEFZX0JFRk9SRV9WREVWX1NUT1BfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X2RlbGF5X2JlZm9yZV92ZGV2X3N0b3AsCisJCQkgICAgIDApLAorCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX1JPQU1fU0NBTl9ISV9SU1NJX01BWENPVU5UX05BTUUsCisJCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsCisJCQkgICAgIG5oaV9yc3NpX3NjYW5fbWF4X2NvdW50LAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJCVZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fU0NBTl9ISV9SU1NJX01BWENPVU5UX0RFRkFVTFQsCisJCQkgICAgIENGR19ST0FNX1NDQU5fSElfUlNTSV9NQVhDT1VOVF9NSU4sCisJCQkgICAgIENGR19ST0FNX1NDQU5fSElfUlNTSV9NQVhDT1VOVF9NQVgsCisJCQkgICAgIGNiX25vdGlmeV9zZXRfcm9hbV9zY2FuX2hpX3Jzc2lfc2Nhbl9wYXJhbXMsCisJCQkgICAgIGVDU1JfSElfUlNTSV9TQ0FOX01BWENPVU5UX0lEKSwKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19ST0FNX1NDQU5fSElfUlNTSV9ERUxUQV9OQU1FLAorCQkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLAorCQkJICAgICBuaGlfcnNzaV9zY2FuX3Jzc2lfZGVsdGEsCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkJVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkJICAgICBDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfREVMVEFfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fU0NBTl9ISV9SU1NJX0RFTFRBX01JTiwKKwkJCSAgICAgQ0ZHX1JPQU1fU0NBTl9ISV9SU1NJX0RFTFRBX01BWCwKKwkJCSAgICAgY2Jfbm90aWZ5X3NldF9yb2FtX3NjYW5faGlfcnNzaV9zY2FuX3BhcmFtcywKKwkJCSAgICAgZUNTUl9ISV9SU1NJX1NDQU5fUlNTSV9ERUxUQV9JRCksCisKKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfREVMQVlfTkFNRSwKKwkJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywKKwkJCSAgICAgbmhpX3Jzc2lfc2Nhbl9kZWxheSwKKwkJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwKKwkJCQlWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19ST0FNX1NDQU5fSElfUlNTSV9ERUxBWV9ERUZBVUxULAorCQkJICAgICBDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfREVMQVlfTUlOLAorCQkJICAgICBDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfREVMQVlfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X3JvYW1fc2Nhbl9oaV9yc3NpX3NjYW5fcGFyYW1zLAorCQkJICAgICBlQ1NSX0hJX1JTU0lfU0NBTl9ERUxBWV9JRCksCisKKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfUk9BTV9TQ0FOX0hJX1JTU0lfVUJfTkFNRSwKKwkJCSAgICAgV0xBTl9QQVJBTV9TaWduZWRJbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywKKwkJCSAgICAgbmhpX3Jzc2lfc2Nhbl9yc3NpX3ViLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJCVZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fU0NBTl9ISV9SU1NJX1VCX0RFRkFVTFQsCisJCQkgICAgIENGR19ST0FNX1NDQU5fSElfUlNTSV9VQl9NSU4sCisJCQkgICAgIENGR19ST0FNX1NDQU5fSElfUlNTSV9VQl9NQVgsCisJCQkgICAgIGNiX25vdGlmeV9zZXRfcm9hbV9zY2FuX2hpX3Jzc2lfc2Nhbl9wYXJhbXMsCisJCQkgICAgIGVDU1JfSElfUlNTSV9TQ0FOX1JTU0lfVUJfSUQpLAorCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcgKi8KKworCVJFR19WQVJJQUJMRShDRkdfUU9TX1dNTV9CVVJTVF9TSVpFX0RFRk5fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBidXJzdFNpemVEZWZpbml0aW9uLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9CVVJTVF9TSVpFX0RFRk5fREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9CVVJTVF9TSVpFX0RFRk5fTUlOLAorCQkgICAgIENGR19RT1NfV01NX0JVUlNUX1NJWkVfREVGTl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElOR19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG1jYXN0QmNhc3RGaWx0ZXJTZXR0aW5nLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfREVGQVVMVCwKKwkJICAgICBDRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfTUlOLAorCQkgICAgIENGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElOR19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfSE9TVF9BUlBPRkZMT0FEX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZmhvc3RBcnBPZmZsb2FkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0hPU1RfQVJQT0ZGTE9BRF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfSE9TVF9BUlBPRkZMT0FEX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX0hPU1RfQVJQT0ZGTE9BRF9NQVgpLAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1JBX0ZJTFRFUklORworCVJFR19WQVJJQUJMRShDRkdfUkFfRklMVEVSX0VOQUJMRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIElzUkFyYXRlTGltaXRFbmFibGVkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUkFfRklMVEVSX0VOQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19SQV9GSUxURVJfRU5BQkxFX01JTiwKKwkJICAgICBDRkdfUkFfRklMVEVSX0VOQUJMRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19SQV9SQVRFX0xJTUlUX0lOVEVSVkFMX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgUkFyYXRlTGltaXRJbnRlcnZhbCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JBX1JBVEVfTElNSVRfSU5URVJWQUxfREVGQVVMVCwKKwkJICAgICBDRkdfUkFfUkFURV9MSU1JVF9JTlRFUlZBTF9NSU4sCisJCSAgICAgQ0ZHX1JBX1JBVEVfTElNSVRfSU5URVJWQUxfTUFYKSwKKyNlbmRpZgorCisJUkVHX1ZBUklBQkxFKENGR19JR05PUkVfUEVFUl9FUlBfSU5GT19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGlnbm9yZV9wZWVyX2VycF9pbmZvLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfSUdOT1JFX1BFRVJfRVJQX0lORk9fREVGQVVMVCwKKwkJICAgICBDRkdfSUdOT1JFX1BFRVJfRVJQX0lORk9fTUlOLAorCQkgICAgIENGR19JR05PUkVfUEVFUl9FUlBfSU5GT19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfSE9TVF9TU0RQX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgc3NkcCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9IT1NUX1NTRFBfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0hPU1RfU1NEUF9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9IT1NUX1NTRFBfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0hPU1RfTlNPRkZMT0FEX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZmhvc3ROU09mZmxvYWQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfSE9TVF9OU09GRkxPQURfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0hPU1RfTlNPRkZMT0FEX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX0hPU1RfTlNPRkZMT0FEX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1FPU19XTU1fVFNfSU5GT19BQ0tfUE9MSUNZX05BTUUsIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgdHNJbmZvQWNrUG9saWN5LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9UU19JTkZPX0FDS19QT0xJQ1lfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX1dNTV9UU19JTkZPX0FDS19QT0xJQ1lfTUlOLAorCQkgICAgIENGR19RT1NfV01NX1RTX0lORk9fQUNLX1BPTElDWV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19TSU5HTEVfVElEX1JDX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgYlNpbmdsZVRpZFJjLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfU0lOR0xFX1RJRF9SQ19ERUZBVUxULAorCQkgICAgIENGR19TSU5HTEVfVElEX1JDX01JTiwKKwkJICAgICBDRkdfU0lOR0xFX1RJRF9SQ19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19EWU5BTUlDX1BTUE9MTF9WQUxVRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGR5bmFtaWNQc1BvbGxWYWx1ZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0RZTkFNSUNfUFNQT0xMX1ZBTFVFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0RZTkFNSUNfUFNQT0xMX1ZBTFVFX01JTiwKKwkJICAgICBDRkdfRFlOQU1JQ19QU1BPTExfVkFMVUVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEVMRV9CQ05fV0FLRVVQX0VOX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgdGVsZUJjbldha2V1cEVuLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVEVMRV9CQ05fV0FLRVVQX0VOX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTl9NSU4sCisJCSAgICAgQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpbmZyYVN0YUtlZXBBbGl2ZVBlcmlvZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRF9ERUZBVUxULAorCQkgICAgIENGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfTUlOLAorCQkgICAgIENGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUU9TX0FERFRTX1dIRU5fQUNNX0lTX09GRl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIEFkZFRTV2hlbkFDTUlzT2ZmLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUU9TX0FERFRTX1dIRU5fQUNNX0lTX09GRl9ERUZBVUxULAorCQkgICAgIENGR19RT1NfQUREVFNfV0hFTl9BQ01fSVNfT0ZGX01JTiwKKwkJICAgICBDRkdfUU9TX0FERFRTX1dIRU5fQUNNX0lTX09GRl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19WQUxJREFURV9TQ0FOX0xJU1RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmVmFsaWRhdGVTY2FuTGlzdCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZBTElEQVRFX1NDQU5fTElTVF9ERUZBVUxULAorCQkgICAgIENGR19WQUxJREFURV9TQ0FOX0xJU1RfTUlOLAorCQkgICAgIENGR19WQUxJREFURV9TQ0FOX0xJU1RfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VUX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbk51bGxEYXRhQXBSZXNwVGltZW91dCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVF9ERUZBVUxULAorCQkgICAgIENGR19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfTUlOLAorCQkgICAgIENGR19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGFwRGF0YUF2YWlsUG9sbFBlcmlvZEluTXMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfTUlOLAorCQkgICAgIENGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0JBTkRfQ0FQQUJJTElUWV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5CYW5kQ2FwYWJpbGl0eSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0JBTkRfQ0FQQUJJTElUWV9ERUZBVUxULAorCQkgICAgIENGR19CQU5EX0NBUEFCSUxJVFlfTUlOLAorCQkgICAgIENGR19CQU5EX0NBUEFCSUxJVFlfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0JFQUNPTl9FQVJMWV9URVJNSU5BVElPTl9OQU1FLAorCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZkVuYWJsZUJlYWNvbkVhcmx5VGVybWluYXRpb24sCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfQkVBQ09OX0VBUkxZX1RFUk1JTkFUSU9OX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9CRUFDT05fRUFSTFlfVEVSTUlOQVRJT05fTUlOLAorCQkgICAgIENGR19FTkFCTEVfQkVBQ09OX0VBUkxZX1RFUk1JTkFUSU9OX01BWCksCisKKy8qIENGR19DREZfVFJBQ0VfRU5BQkxFIFBhcmFtZXRlcnMgKi8KKwlSRUdfVkFSSUFCTEUoQ0ZHX0NERl9UUkFDRV9FTkFCTEVfV0RJX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgY2RmX3RyYWNlX2VuYWJsZV93ZGksCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0NERl9UUkFDRV9FTkFCTEVfTUlOLAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0NERl9UUkFDRV9FTkFCTEVfSEREX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgY2RmX3RyYWNlX2VuYWJsZV9oZGQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0NERl9UUkFDRV9FTkFCTEVfTUlOLAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0NERl9UUkFDRV9FTkFCTEVfQk1JX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgY2RmX3RyYWNlX2VuYWJsZV9ibWksCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0NERl9UUkFDRV9FTkFCTEVfTUlOLAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0NERl9UUkFDRV9FTkFCTEVfU01FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgY2RmX3RyYWNlX2VuYWJsZV9zbWUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0NERl9UUkFDRV9FTkFCTEVfTUlOLAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0NERl9UUkFDRV9FTkFCTEVfUEVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBjZGZfdHJhY2VfZW5hYmxlX3BlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKwkJICAgICBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX01JTiwKKwkJICAgICBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19DREZfVFJBQ0VfRU5BQkxFX1dNQV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGNkZl90cmFjZV9lbmFibGVfd21hLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKwkJICAgICBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX01JTiwKKwkJICAgICBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19DREZfVFJBQ0VfRU5BQkxFX1NZU19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGNkZl90cmFjZV9lbmFibGVfc3lzLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKwkJICAgICBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX01JTiwKKwkJICAgICBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19DREZfVFJBQ0VfRU5BQkxFX0NERl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGNkZl90cmFjZV9lbmFibGVfY2RmLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKwkJICAgICBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX01JTiwKKwkJICAgICBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19DREZfVFJBQ0VfRU5BQkxFX1NBUF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGNkZl90cmFjZV9lbmFibGVfc2FwLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKwkJICAgICBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX01JTiwKKwkJICAgICBDRkdfQ0RGX1RSQUNFX0VOQUJMRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19DREZfVFJBQ0VfRU5BQkxFX0hERF9TQVBfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBjZGZfdHJhY2VfZW5hYmxlX2hkZF9zYXAsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0NERl9UUkFDRV9FTkFCTEVfTUlOLAorCQkgICAgIENGR19DREZfVFJBQ0VfRU5BQkxFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblRlbGVCY25UcmFuc0xpc3RlbkludGVydmFsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVEVMRV9CQ05fVFJBTlNfTElfREVGQVVMVCwKKwkJICAgICBDRkdfVEVMRV9CQ05fVFJBTlNfTElfTUlOLAorCQkgICAgIENGR19URUxFX0JDTl9UUkFOU19MSV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19URUxFX0JDTl9UUkFOU19MSV9OVU1fSURMRV9CQ05TX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuVGVsZUJjblRyYW5zTGlOdW1JZGxlQmVhY29ucywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX05VTV9JRExFX0JDTlNfREVGQVVMVCwKKwkJICAgICBDRkdfVEVMRV9CQ05fVFJBTlNfTElfTlVNX0lETEVfQkNOU19NSU4sCisJCSAgICAgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX05VTV9JRExFX0JDTlNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEVMRV9CQ05fTUFYX0xJX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblRlbGVCY25NYXhMaXN0ZW5JbnRlcnZhbCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RFTEVfQkNOX01BWF9MSV9ERUZBVUxULAorCQkgICAgIENGR19URUxFX0JDTl9NQVhfTElfTUlOLAorCQkgICAgIENGR19URUxFX0JDTl9NQVhfTElfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEVMRV9CQ05fTUFYX0xJX05VTV9JRExFX0JDTlNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuVGVsZUJjbk1heExpTnVtSWRsZUJlYWNvbnMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19URUxFX0JDTl9NQVhfTElfTlVNX0lETEVfQkNOU19ERUZBVUxULAorCQkgICAgIENGR19URUxFX0JDTl9NQVhfTElfTlVNX0lETEVfQkNOU19NSU4sCisJCSAgICAgQ0ZHX1RFTEVfQkNOX01BWF9MSV9OVU1fSURMRV9CQ05TX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0JDTl9FQVJMWV9URVJNX1dBS0VfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBiY25FYXJseVRlcm1XYWtlSW50ZXJ2YWwsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19CQ05fRUFSTFlfVEVSTV9XQUtFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0JDTl9FQVJMWV9URVJNX1dBS0VfTUlOLAorCQkgICAgIENGR19CQ05fRUFSTFlfVEVSTV9XQUtFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBhcERhdGFBdmFpbFBvbGxQZXJpb2RJbk1zLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9ERUZBVUxULAorCQkgICAgIENGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX01JTiwKKwkJICAgICBDRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfQ0xPU0VfTE9PUF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZUNsb3NlTG9vcCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX0NMT1NFX0xPT1BfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0JZUEFTU18xMURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVCeXBhc3MxMWQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfQllQQVNTXzExRF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfQllQQVNTXzExRF9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9CWVBBU1NfMTFEX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9ERlNfQ0hOTF9TQ0FOX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlREZTQ2hubFNjYW4sCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfREZTX0NITkxfU0NBTl9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfREZTX0NITkxfU0NBTl9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9ERlNfQ0hOTF9TQ0FOX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9ERlNfUE5PX0NITkxfU0NBTl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZV9kZnNfcG5vX2Nobmxfc2NhbiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9ERlNfUE5PX0NITkxfU0NBTl9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfREZTX1BOT19DSE5MX1NDQU5fTUlOLAorCQkgICAgIENGR19FTkFCTEVfREZTX1BOT19DSE5MX1NDQU5fTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0RZTkFNSUNfRFRJTV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZUR5bmFtaWNEVElNLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0RZTkFNSUNfRFRJTV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfRFlOQU1JQ19EVElNX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX0RZTkFNSUNfRFRJTV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfQVVUT01BVElDX1RYX1BPV0VSX0NPTlRST0xfTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZUF1dG9tYXRpY1R4UG93ZXJDb250cm9sLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0FVVE9NQVRJQ19UWF9QT1dFUl9DT05UUk9MX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9BVVRPTUFUSUNfVFhfUE9XRVJfQ09OVFJPTF9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9BVVRPTUFUSUNfVFhfUE9XRVJfQ09OVFJPTF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19TSE9SVF9HSV80ME1IWl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFNob3J0R0k0ME1oekVuYWJsZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NIT1JUX0dJXzQwTUhaX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NIT1JUX0dJXzQwTUhaX01JTiwKKwkJICAgICBDRkdfU0hPUlRfR0lfNDBNSFpfTUFYKSwKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19SRVBPUlRfTUFYX0xJTktfU1BFRUQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIHJlcG9ydE1heExpbmtTcGVlZCwKKwkJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwKKwkJCSAgICAgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkJICAgICBDRkdfUkVQT1JUX01BWF9MSU5LX1NQRUVEX0RFRkFVTFQsCisJCQkgICAgIENGR19SRVBPUlRfTUFYX0xJTktfU1BFRURfTUlOLAorCQkJICAgICBDRkdfUkVQT1JUX01BWF9MSU5LX1NQRUVEX01BWCwKKwkJCSAgICAgTlVMTCwgMCksCisKKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfTElOS19TUEVFRF9SU1NJX0hJR0gsIFdMQU5fUEFSQU1fU2lnbmVkSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGxpbmtTcGVlZFJzc2lIaWdoLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19MSU5LX1NQRUVEX1JTU0lfSElHSF9ERUZBVUxULAorCQkJICAgICBDRkdfTElOS19TUEVFRF9SU1NJX0hJR0hfTUlOLAorCQkJICAgICBDRkdfTElOS19TUEVFRF9SU1NJX0hJR0hfTUFYLAorCQkJICAgICBOVUxMLCAwKSwKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19MSU5LX1NQRUVEX1JTU0lfTUlELCBXTEFOX1BBUkFNX1NpZ25lZEludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBsaW5rU3BlZWRSc3NpTWlkLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19MSU5LX1NQRUVEX1JTU0lfTUlEX0RFRkFVTFQsCisJCQkgICAgIENGR19MSU5LX1NQRUVEX1JTU0lfTUlEX01JTiwKKwkJCSAgICAgQ0ZHX0xJTktfU1BFRURfUlNTSV9NSURfTUFYLAorCQkJICAgICBOVUxMLCAwKSwKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19MSU5LX1NQRUVEX1JTU0lfTE9XLCBXTEFOX1BBUkFNX1NpZ25lZEludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBsaW5rU3BlZWRSc3NpTG93LAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19MSU5LX1NQRUVEX1JTU0lfTE9XX0RFRkFVTFQsCisJCQkgICAgIENGR19MSU5LX1NQRUVEX1JTU0lfTE9XX01JTiwKKwkJCSAgICAgQ0ZHX0xJTktfU1BFRURfUlNTSV9MT1dfTUFYLAorCQkJICAgICBOVUxMLCAwKSwKKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19ST0FNX1BSRUZFUl81R0haLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuUm9hbVByZWZlcjVHSHosCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fUFJFRkVSXzVHSFpfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fUFJFRkVSXzVHSFpfTUlOLAorCQkJICAgICBDRkdfUk9BTV9QUkVGRVJfNUdIWl9NQVgsCisJCQkgICAgIGNiX25vdGlmeV9zZXRfcm9hbV9wcmVmZXI1X2dfaHosIDApLAorCisJUkVHX0RZTkFNSUNfVkFSSUFCTEUoQ0ZHX1JPQU1fSU5UUkFfQkFORCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgblJvYW1JbnRyYUJhbmQsCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fSU5UUkFfQkFORF9ERUZBVUxULAorCQkJICAgICBDRkdfUk9BTV9JTlRSQV9CQU5EX01JTiwKKwkJCSAgICAgQ0ZHX1JPQU1fSU5UUkFfQkFORF9NQVgsCisJCQkgICAgIGNiX25vdGlmeV9zZXRfcm9hbV9pbnRyYV9iYW5kLCAwKSwKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19ST0FNX1NDQU5fTl9QUk9CRVMsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5Qcm9iZXMsCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1JPQU1fU0NBTl9OX1BST0JFU19ERUZBVUxULAorCQkJICAgICBDRkdfUk9BTV9TQ0FOX05fUFJPQkVTX01JTiwKKwkJCSAgICAgQ0ZHX1JPQU1fU0NBTl9OX1BST0JFU19NQVgsCisJCQkgICAgIGNiX25vdGlmeV9zZXRfcm9hbV9zY2FuX25fcHJvYmVzLCAwKSwKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19ST0FNX1NDQU5fSE9NRV9BV0FZX1RJTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5Sb2FtU2NhbkhvbWVBd2F5VGltZSwKKwkJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwKKwkJCSAgICAgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkJICAgICBDRkdfUk9BTV9TQ0FOX0hPTUVfQVdBWV9USU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19ST0FNX1NDQU5fSE9NRV9BV0FZX1RJTUVfTUlOLAorCQkJICAgICBDRkdfUk9BTV9TQ0FOX0hPTUVfQVdBWV9USU1FX01BWCwKKwkJCSAgICAgY2Jfbm90aWZ5X3NldF9yb2FtX3NjYW5faG9tZV9hd2F5X3RpbWUsIDApLAorCisjZW5kaWYKKworCVJFR19WQVJJQUJMRShDRkdfUDJQX0RFVklDRV9BRERSRVNTX0FETUlOSVNUUkFURURfTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGlzUDJwRGV2aWNlQWRkckFkbWluaXN0cmF0ZWQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19QMlBfREVWSUNFX0FERFJFU1NfQURNSU5JU1RSQVRFRF9ERUZBVUxULAorCQkgICAgIENGR19QMlBfREVWSUNFX0FERFJFU1NfQURNSU5JU1RSQVRFRF9NSU4sCisJCSAgICAgQ0ZHX1AyUF9ERVZJQ0VfQUREUkVTU19BRE1JTklTVFJBVEVEX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9NQ0NfRU5BQkxFRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZU1DQywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9NQ0NfRU5BQkxFRF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTUNDX0VOQUJMRURfTUlOLAorCQkgICAgIENGR19FTkFCTEVfTUNDX0VOQUJMRURfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQUxMT1dfTUNDX0dPX0RJRkZfQklfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBhbGxvd01DQ0dPRGlmZkJJLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQUxMT1dfTUNDX0dPX0RJRkZfQklfREVGQVVMVCwKKwkJICAgICBDRkdfQUxMT1dfTUNDX0dPX0RJRkZfQklfTUlOLAorCQkgICAgIENGR19BTExPV19NQ0NfR09fRElGRl9CSV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19USEVSTUFMX01JR1JBVElPTl9FTkFCTEVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0aGVybWFsTWl0aWdhdGlvbkVuYWJsZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfTUlHUkFUSU9OX0VOQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19USEVSTUFMX01JR1JBVElPTl9FTkFCTEVfTUlOLAorCQkgICAgIENGR19USEVSTUFMX01JR1JBVElPTl9FTkFCTEVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEhST1RUTEVfUEVSSU9EX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgdGhyb3R0bGVQZXJpb2QsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19USFJPVFRMRV9QRVJJT0RfREVGQVVMVCwKKwkJICAgICBDRkdfVEhST1RUTEVfUEVSSU9EX01JTiwKKwkJICAgICBDRkdfVEhST1RUTEVfUEVSSU9EX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9NT0RVTEFURURfRFRJTV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZU1vZHVsYXRlZERUSU0sCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTU9EVUxBVEVEX0RUSU1fREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX01PRFVMQVRFRF9EVElNX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX01PRFVMQVRFRF9EVElNX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX01DX0FERFJfTElTVF9FTkFCTEVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmRW5hYmxlTUNBZGRyTGlzdCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX01DX0FERFJfTElTVF9FTkFCTEVfREVGQVVMVCwKKwkJICAgICBDRkdfTUNfQUREUl9MSVNUX0VOQUJMRV9NSU4sCisJCSAgICAgQ0ZHX01DX0FERFJfTElTVF9FTkFCTEVfTUFYKSwKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJUkVHX1ZBUklBQkxFKENGR19WSFRfQ0hBTk5FTF9XSURUSCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB2aHRDaGFubmVsV2lkdGgsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR19WSFRfQ0hBTk5FTF9XSURUSF9ERUZBVUxULAorCQkgICAgIENGR19WSFRfQ0hBTk5FTF9XSURUSF9NSU4sCisJCSAgICAgQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1ZIVF9FTkFCTEVfUlhfTUNTXzhfOSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB2aHRSeE1DUywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfUlhfTUNTXzhfOV9ERUZBVUxULAorCQkgICAgIENGR19WSFRfRU5BQkxFX1JYX01DU184XzlfTUlOLAorCQkgICAgIENGR19WSFRfRU5BQkxFX1JYX01DU184XzlfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVkhUX0VOQUJMRV9UWF9NQ1NfOF85LCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIHZodFR4TUNTLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfVkhUX0VOQUJMRV9UWF9NQ1NfOF85X0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfVFhfTUNTXzhfOV9NSU4sCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfVFhfTUNTXzhfOV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19WSFRfRU5BQkxFX1JYX01DUzJ4Ml84XzksIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgdmh0UnhNQ1MyeDIsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR19WSFRfRU5BQkxFX1JYX01DUzJ4Ml84XzlfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV9SWF9NQ1MyeDJfOF85X01JTiwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV9SWF9NQ1MyeDJfOF85X01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1ZIVF9FTkFCTEVfVFhfTUNTMngyXzhfOSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB2aHRUeE1DUzJ4MiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfVFhfTUNTMngyXzhfOV9ERUZBVUxULAorCQkgICAgIENGR19WSFRfRU5BQkxFX1RYX01DUzJ4Ml84XzlfTUlOLAorCQkgICAgIENGR19WSFRfRU5BQkxFX1RYX01DUzJ4Ml84XzlfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVkhUX0VOQUJMRV8yeDJfQ0FQX0ZFQVRVUkUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlMngyLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV8yeDJfQ0FQX0ZFQVRVUkVfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV8yeDJfQ0FQX0ZFQVRVUkVfTUlOLAorCQkgICAgIENGR19WSFRfRU5BQkxFXzJ4Ml9DQVBfRkVBVFVSRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19WSFRfRU5BQkxFX01VX0JGT1JNRUVfQ0FQX0ZFQVRVUkUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlTXVCZm9ybWVlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV9NVV9CRk9STUVFX0NBUF9GRUFUVVJFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfTVVfQkZPUk1FRV9DQVBfRkVBVFVSRV9NSU4sCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfTVVfQkZPUk1FRV9DQVBfRkVBVFVSRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19WSFRfRU5BQkxFX1BBSURfRkVBVFVSRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVWaHRwQWlkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV9QQUlEX0ZFQVRVUkVfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV9QQUlEX0ZFQVRVUkVfTUlOLAorCQkgICAgIENGR19WSFRfRU5BQkxFX1BBSURfRkVBVFVSRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19WSFRfRU5BQkxFX0dJRF9GRUFUVVJFLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZVZodEdpZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfR0lEX0ZFQVRVUkVfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV9HSURfRkVBVFVSRV9NSU4sCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfR0lEX0ZFQVRVUkVfTUFYKSwKKyNlbmRpZgorCisJUkVHX1ZBUklBQkxFKENGR19WSFRfRU5BQkxFXzF4MV9UWF9DSEFJTk1BU0ssIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgdHhjaGFpbm1hc2sxeDEsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19WSFRfRU5BQkxFXzF4MV9UWF9DSEFJTk1BU0tfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV8xeDFfVFhfQ0hBSU5NQVNLX01JTiwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV8xeDFfVFhfQ0hBSU5NQVNLX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1ZIVF9FTkFCTEVfMXgxX1JYX0NIQUlOTUFTSywgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCByeGNoYWlubWFzazF4MSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfMXgxX1JYX0NIQUlOTUFTS19ERUZBVUxULAorCQkgICAgIENGR19WSFRfRU5BQkxFXzF4MV9SWF9DSEFJTk1BU0tfTUlOLAorCQkgICAgIENGR19WSFRfRU5BQkxFXzF4MV9SWF9DSEFJTk1BU0tfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0FNUERVUFNfRkVBVFVSRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVBbXBkdVBzLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0FNUERVUFNfRkVBVFVSRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfQU1QRFVQU19GRUFUVVJFX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX0FNUERVUFNfRkVBVFVSRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19IVF9FTkFCTEVfU01QU19DQVBfRkVBVFVSRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVIdFNtcHMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19IVF9FTkFCTEVfU01QU19DQVBfRkVBVFVSRV9ERUZBVUxULAorCQkgICAgIENGR19IVF9FTkFCTEVfU01QU19DQVBfRkVBVFVSRV9NSU4sCisJCSAgICAgQ0ZHX0hUX0VOQUJMRV9TTVBTX0NBUF9GRUFUVVJFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0hUX1NNUFNfQ0FQX0ZFQVRVUkUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaHRTbXBzLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfSFRfU01QU19DQVBfRkVBVFVSRV9ERUZBVUxULAorCQkgICAgIENGR19IVF9TTVBTX0NBUF9GRUFUVVJFX01JTiwKKwkJICAgICBDRkdfSFRfU01QU19DQVBfRkVBVFVSRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19ESVNBQkxFX0RGU19DSF9TV0lUQ0gsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZGlzYWJsZURGU0NoU3dpdGNoLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRElTQUJMRV9ERlNfQ0hfU1dJVENIX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0RJU0FCTEVfREZTX0NIX1NXSVRDSF9NSU4sCisJCSAgICAgQ0ZHX0RJU0FCTEVfREZTX0NIX1NXSVRDSF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfREZTX01BU1RFUl9DQVBBQklMSVRZLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZURGU01hc3RlckNhcCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9ERlNfTUFTVEVSX0NBUEFCSUxJVFlfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0RGU19NQVNURVJfQ0FQQUJJTElUWV9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9ERlNfTUFTVEVSX0NBUEFCSUxJVFlfTUFYKSwKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19TQVBfUFJFRkVSUkVEX0NIQU5ORUxfTE9DQVRJT04sCisJCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGdTYXBQcmVmZXJyZWRDaGFuTG9jYXRpb24sCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX1NBUF9QUkVGRVJSRURfQ0hBTk5FTF9MT0NBVElPTl9ERUZBVUxULAorCQkJICAgICBDRkdfU0FQX1BSRUZFUlJFRF9DSEFOTkVMX0xPQ0FUSU9OX01JTiwKKwkJCSAgICAgQ0ZHX1NBUF9QUkVGRVJSRURfQ0hBTk5FTF9MT0NBVElPTl9NQVgsCisJCQkgICAgIGNiX25vdGlmeV9zZXRfZ19zYXBfcHJlZmVycmVkX2NoYW5fbG9jYXRpb24sIDApLAorCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19ESVNBQkxFX0RGU19KQVBBTl9XNTMsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGdEaXNhYmxlRGZzSmFwYW5XNTMsCisJCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8CisJCQkgICAgIFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJCSAgICAgQ0ZHX0RJU0FCTEVfREZTX0pBUEFOX1c1M19ERUZBVUxULAorCQkJICAgICBDRkdfRElTQUJMRV9ERlNfSkFQQU5fVzUzX01JTiwKKwkJCSAgICAgQ0ZHX0RJU0FCTEVfREZTX0pBUEFOX1c1M19NQVgsCisJCQkgICAgIGNoX25vdGlmeV9zZXRfZ19kaXNhYmxlX2Rmc19qYXBhbl93NTMsIDApLAorCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0ZJUlNUX1NDQU5fMkdfT05MWV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZUZpcnN0U2NhbjJHT25seSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9GSVJTVF9TQ0FOXzJHX09OTFlfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0ZJUlNUX1NDQU5fMkdfT05MWV9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9GSVJTVF9TQ0FOXzJHX09OTFlfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX1NLSVBfREZTX0lOX1AyUF9TRUFSQ0hfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBza2lwRGZzQ2hubEluUDJwU2VhcmNoLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX1NLSVBfREZTX0lOX1AyUF9TRUFSQ0hfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX1NLSVBfREZTX0lOX1AyUF9TRUFSQ0hfTUlOLAorCQkgICAgIENGR19FTkFCTEVfU0tJUF9ERlNfSU5fUDJQX1NFQVJDSF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19JR05PUkVfRFlOQU1JQ19EVElNX0lOX1AyUF9NT0RFX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpZ25vcmVEeW5hbWljRHRpbUluUDJwTW9kZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lHTk9SRV9EWU5BTUlDX0RUSU1fSU5fUDJQX01PREVfREVGQVVMVCwKKwkJICAgICBDRkdfSUdOT1JFX0RZTkFNSUNfRFRJTV9JTl9QMlBfTU9ERV9NSU4sCisJCSAgICAgQ0ZHX0lHTk9SRV9EWU5BTUlDX0RUSU1fSU5fUDJQX01PREVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX1JYX1NUQkMsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlUnhTVEJDLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX1JYX1NUQkNfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX1JYX1NUQkNfTUlOLAorCQkgICAgIENGR19FTkFCTEVfUlhfU1RCQ19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfVFhfU1RCQywgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVUeFNUQkMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfVFhfU1RCQ19ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfVFhfU1RCQ19NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9UWF9TVEJDX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9SWF9MRFBDLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZVJ4TERQQywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9SWF9MRFBDX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9SWF9MRFBDX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX1JYX0xEUENfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUFBTX0VOQUJMRV81R19FQlQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlNWdFQlQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19QUFNfRU5BQkxFXzVHX0VCVF9GRUFUVVJFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1BQU19FTkFCTEVfNUdfRUJUX0ZFQVRVUkVfTUlOLAorCQkgICAgIENGR19QUFNfRU5BQkxFXzVHX0VCVF9GRUFUVVJFX01BWCksCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCVJFR19WQVJJQUJMRShDRkdfVERMU19TVVBQT1JUX0VOQUJMRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmRW5hYmxlVERMU1N1cHBvcnQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19URExTX1NVUFBPUlRfRU5BQkxFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RETFNfU1VQUE9SVF9FTkFCTEVfTUlOLAorCQkgICAgIENGR19URExTX1NVUFBPUlRfRU5BQkxFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1RETFNfSU1QTElDSVRfVFJJR0dFUiwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmRW5hYmxlVERMU0ltcGxpY2l0VHJpZ2dlciwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RETFNfSU1QTElDSVRfVFJJR0dFUl9ERUZBVUxULAorCQkgICAgIENGR19URExTX0lNUExJQ0lUX1RSSUdHRVJfTUlOLAorCQkgICAgIENGR19URExTX0lNUExJQ0lUX1RSSUdHRVJfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVERMU19UWF9TVEFUU19QRVJJT0QsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZlRETFNUeFN0YXRzUGVyaW9kLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19UWF9TVEFUU19QRVJJT0RfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19UWF9TVEFUU19QRVJJT0RfTUlOLAorCQkgICAgIENGR19URExTX1RYX1NUQVRTX1BFUklPRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19URExTX1RYX1BBQ0tFVF9USFJFU0hPTEQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZlRETFNUeFBhY2tldFRocmVzaG9sZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RETFNfVFhfUEFDS0VUX1RIUkVTSE9MRF9ERUZBVUxULAorCQkgICAgIENGR19URExTX1RYX1BBQ0tFVF9USFJFU0hPTERfTUlOLAorCQkgICAgIENGR19URExTX1RYX1BBQ0tFVF9USFJFU0hPTERfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVERMU19NQVhfRElTQ09WRVJZX0FUVEVNUFQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZlRETFNNYXhEaXNjb3ZlcnlBdHRlbXB0LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19NQVhfRElTQ09WRVJZX0FUVEVNUFRfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19NQVhfRElTQ09WRVJZX0FUVEVNUFRfTUlOLAorCQkgICAgIENGR19URExTX01BWF9ESVNDT1ZFUllfQVRURU1QVF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19URExTX0lETEVfUEFDS0VUX1RIUkVTSE9MRCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmVERMU0lkbGVQYWNrZXRUaHJlc2hvbGQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19URExTX0lETEVfUEFDS0VUX1RIUkVTSE9MRF9ERUZBVUxULAorCQkgICAgIENGR19URExTX0lETEVfUEFDS0VUX1RIUkVTSE9MRF9NSU4sCisJCSAgICAgQ0ZHX1RETFNfSURMRV9QQUNLRVRfVEhSRVNIT0xEX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1RETFNfUlNTSV9UUklHR0VSX1RIUkVTSE9MRCwgV0xBTl9QQVJBTV9TaWduZWRJbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmVERMU1JTU0lUcmlnZ2VyVGhyZXNob2xkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19SU1NJX1RSSUdHRVJfVEhSRVNIT0xEX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RETFNfUlNTSV9UUklHR0VSX1RIUkVTSE9MRF9NSU4sCisJCSAgICAgQ0ZHX1RETFNfUlNTSV9UUklHR0VSX1RIUkVTSE9MRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19URExTX1JTU0lfVEVBUkRPV05fVEhSRVNIT0xELCBXTEFOX1BBUkFNX1NpZ25lZEludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZURExTUlNTSVRlYXJkb3duVGhyZXNob2xkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19SU1NJX1RFQVJET1dOX1RIUkVTSE9MRF9ERUZBVUxULAorCQkgICAgIENGR19URExTX1JTU0lfVEVBUkRPV05fVEhSRVNIT0xEX01JTiwKKwkJICAgICBDRkdfVERMU19SU1NJX1RFQVJET1dOX1RIUkVTSE9MRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19URExTX1JTU0lfREVMVEEsIFdMQU5fUEFSQU1fU2lnbmVkSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZlRETFNSU1NJRGVsdGEsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19URExTX1JTU0lfREVMVEFfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19SU1NJX0RFTFRBX01JTiwKKwkJICAgICBDRkdfVERMU19SU1NJX0RFTFRBX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1RETFNfUU9TX1dNTV9VQVBTRF9NQVNLX05BTUUsIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZlRETFNVYXBzZE1hc2ssCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19URExTX1FPU19XTU1fVUFQU0RfTUFTS19ERUZBVUxULAorCQkgICAgIENGR19URExTX1FPU19XTU1fVUFQU0RfTUFTS19NSU4sCisJCSAgICAgQ0ZHX1RETFNfUU9TX1dNTV9VQVBTRF9NQVNLX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1RETFNfQlVGRkVSX1NUQV9TVVBQT1JUX0VOQUJMRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmRW5hYmxlVERMU0J1ZmZlclN0YSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RETFNfQlVGRkVSX1NUQV9TVVBQT1JUX0VOQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19URExTX0JVRkZFUl9TVEFfU1VQUE9SVF9FTkFCTEVfTUlOLAorCQkgICAgIENGR19URExTX0JVRkZFUl9TVEFfU1VQUE9SVF9FTkFCTEVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVERMU19PRkZfQ0hBTk5FTF9TVVBQT1JUX0VOQUJMRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmRW5hYmxlVERMU09mZkNoYW5uZWwsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19URExTX09GRl9DSEFOTkVMX1NVUFBPUlRfRU5BQkxFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RETFNfT0ZGX0NIQU5ORUxfU1VQUE9SVF9FTkFCTEVfTUlOLAorCQkgICAgIENGR19URExTX09GRl9DSEFOTkVMX1NVUFBPUlRfRU5BQkxFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1RETFNfUFJFRkVSUkVEX09GRl9DSEFOTkVMX05VTSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmVERMU1ByZWZPZmZDaGFuTnVtLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19QUkVGRVJSRURfT0ZGX0NIQU5ORUxfTlVNX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RETFNfUFJFRkVSUkVEX09GRl9DSEFOTkVMX05VTV9NSU4sCisJCSAgICAgQ0ZHX1RETFNfUFJFRkVSUkVEX09GRl9DSEFOTkVMX05VTV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19URExTX1BSRUZFUlJFRF9PRkZfQ0hBTk5FTF9CVywgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmVERMU1ByZWZPZmZDaGFuQmFuZHdpZHRoLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19QUkVGRVJSRURfT0ZGX0NIQU5ORUxfQldfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19QUkVGRVJSRURfT0ZGX0NIQU5ORUxfQldfTUlOLAorCQkgICAgIENGR19URExTX1BSRUZFUlJFRF9PRkZfQ0hBTk5FTF9CV19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19URExTX1BVQVBTRF9JTkFDVElWSVRZX1RJTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZlRETFNQdWFwc2RJbmFjdGl2aXR5VGltZXIsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19URExTX1BVQVBTRF9JTkFDVElWSVRZX1RJTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19QVUFQU0RfSU5BQ1RJVklUWV9USU1FX01JTiwKKwkJICAgICBDRkdfVERMU19QVUFQU0RfSU5BQ1RJVklUWV9USU1FX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1RETFNfUFVBUFNEX1JYX0ZSQU1FX1RIUkVTSE9MRCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmVERMU1J4RnJhbWVUaHJlc2hvbGQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19URExTX1BVQVBTRF9SWF9GUkFNRV9USFJFU0hPTERfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19QVUFQU0RfUlhfRlJBTUVfVEhSRVNIT0xEX01JTiwKKwkJICAgICBDRkdfVERMU19QVUFQU0RfUlhfRlJBTUVfVEhSRVNIT0xEX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1RETFNfUFVBUFNEX1BFRVJfVFJBRkZJQ19JTkRfV0lORE9XLAorCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZlRETFNQdWFwc2RQVElXaW5kb3csCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19URExTX1BVQVBTRF9QRUVSX1RSQUZGSUNfSU5EX1dJTkRPV19ERUZBVUxULAorCQkgICAgIENGR19URExTX1BVQVBTRF9QRUVSX1RSQUZGSUNfSU5EX1dJTkRPV19NSU4sCisJCSAgICAgQ0ZHX1RETFNfUFVBUFNEX1BFRVJfVFJBRkZJQ19JTkRfV0lORE9XX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1RETFNfUFVBUFNEX1BFRVJfVFJBRkZJQ19SU1BfVElNRU9VVCwKKwkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZURExTUHVhcHNkUFRSVGltZW91dCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RETFNfUFVBUFNEX1BFRVJfVFJBRkZJQ19SU1BfVElNRU9VVF9ERUZBVUxULAorCQkgICAgIENGR19URExTX1BVQVBTRF9QRUVSX1RSQUZGSUNfUlNQX1RJTUVPVVRfTUlOLAorCQkgICAgIENGR19URExTX1BVQVBTRF9QRUVSX1RSQUZGSUNfUlNQX1RJTUVPVVRfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVERMU19FWFRFUk5BTF9DT05UUk9MLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZURExTRXh0ZXJuYWxDb250cm9sLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19FWFRFUk5BTF9DT05UUk9MX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RETFNfRVhURVJOQUxfQ09OVFJPTF9NSU4sCisJCSAgICAgQ0ZHX1RETFNfRVhURVJOQUxfQ09OVFJPTF9NQVgpLAorCVJFR19WQVJJQUJMRShDRkdfVERMU19XTU1fTU9ERV9FTkFCTEUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZkVuYWJsZVRETFNXbW1Nb2RlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19XTU1fTU9ERV9FTkFCTEVfREVGQVVMVCwKKwkJICAgICBDRkdfVERMU19XTU1fTU9ERV9FTkFCTEVfTUlOLAorCQkgICAgIENGR19URExTX1dNTV9NT0RFX0VOQUJMRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19URExTX1NDQU5fRU5BQkxFLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZV90ZGxzX3NjYW4sCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19URExTX1NDQU5fRU5BQkxFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RETFNfU0NBTl9FTkFCTEVfTUlOLAorCQkgICAgIENGR19URExTX1NDQU5fRU5BQkxFX01BWCksCisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQorCVJFR19WQVJJQUJMRShDRkdfVlNUQV9TVVBQT1JUX0VOQUJMRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmRW5hYmxlVlNUQVN1cHBvcnQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19WU1RBX1NVUFBPUlRfRU5BQkxFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZTVEFfU1VQUE9SVF9FTkFCTEVfTUlOLAorCQkgICAgIENGR19WU1RBX1NVUFBPUlRfRU5BQkxFX01BWCksCisjZW5kaWYKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlTHB3ckltZ1RyYW5zaXRpb24sCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTFBXUl9JTUdfVFJBTlNJVElPTl9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTFBXUl9JTUdfVFJBTlNJVElPTl9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlTHB3ckltZ1RyYW5zaXRpb24sCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTFBXUl9JTUdfVFJBTlNJVElPTl9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTFBXUl9JTUdfVFJBTlNJVElPTl9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1NDQU5fQUdJTkdfUEFSQU1fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBzY2FuQWdpbmdUaW1lb3V0LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKwkJICAgICBDRkdfU0NBTl9BR0lOR19QQVJBTV9ERUZBVUxULAorCQkgICAgIENGR19TQ0FOX0FHSU5HX1BBUkFNX01JTiwKKwkJICAgICBDRkdfU0NBTl9BR0lOR19QQVJBTV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19UWF9MRFBDX0VOQUJMRV9GRUFUVVJFLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZVR4TGRwYywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RYX0xEUENfRU5BQkxFX0ZFQVRVUkVfREVGQVVMVCwKKwkJICAgICBDRkdfVFhfTERQQ19FTkFCTEVfRkVBVFVSRV9NSU4sCisJCSAgICAgQ0ZHX1RYX0xEUENfRU5BQkxFX0ZFQVRVUkVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX01DQ19BREFUSVZFX1NDSEVEVUxFUl9FTkFCTEVEX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVNQ0NBZGFwdGl2ZVNjaGVkdWxlciwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9NQ0NfQURBVElWRV9TQ0hFRFVMRVJfRU5BQkxFRF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTUNDX0FEQVRJVkVfU0NIRURVTEVSX0VOQUJMRURfTUlOLAorCQkgICAgIENGR19FTkFCTEVfTUNDX0FEQVRJVkVfU0NIRURVTEVSX0VOQUJMRURfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfQU5EUklPRF9QT1dFUl9TQVZFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaXNBbmRyb2lkUHNFbiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FORFJJT0RfUE9XRVJfU0FWRV9ERUZBVUxULAorCQkgICAgIENGR19BTkRSSU9EX1BPV0VSX1NBVkVfTUlOLAorCQkgICAgIENGR19BTkRSSU9EX1BPV0VSX1NBVkVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSUJTU19BREhPQ19DSEFOTkVMXzVHSFpfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBBZEhvY0NoYW5uZWw1RywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfQURIT0NfQ0hBTk5FTF81R0haX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfQURIT0NfQ0hBTk5FTF81R0haX01JTiwKKwkJICAgICBDRkdfSUJTU19BREhPQ19DSEFOTkVMXzVHSFpfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSUJTU19BREhPQ19DSEFOTkVMXzI0R0haX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgQWRIb2NDaGFubmVsMjRHLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfSUJTU19BREhPQ19DSEFOTkVMXzI0R0haX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfQURIT0NfQ0hBTk5FTF8yNEdIWl9NSU4sCisJCSAgICAgQ0ZHX0lCU1NfQURIT0NfQ0hBTk5FTF8yNEdIWl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19WSFRfU1VfQkVBTUZPUk1FRV9DQVBfRkVBVFVSRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVUeEJGLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX1NVX0JFQU1GT1JNRUVfQ0FQX0ZFQVRVUkVfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX1NVX0JFQU1GT1JNRUVfQ0FQX0ZFQVRVUkVfTUlOLAorCQkgICAgIENGR19WSFRfU1VfQkVBTUZPUk1FRV9DQVBfRkVBVFVSRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19WSFRfRU5BQkxFX1RYQkZfSU5fMjBNSFosIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlVHhCRmluMjBNSHosCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19WSFRfRU5BQkxFX1RYQkZfSU5fMjBNSFpfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV9UWEJGX0lOXzIwTUhaX01JTiwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV9UWEJGX0lOXzIwTUhaX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVELCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIHR4QkZDc25WYWx1ZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVEX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVEX01JTiwKKwkJICAgICBDRkdfVkhUX0NTTl9CRUFNRk9STUVFX0FOVF9TVVBQT1JURURfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVkhUX0VOQUJMRV9UWF9TVV9CRUFNX0ZPUk1FUiwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVfc3VfdHhfYmZvcm1lciwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfVFhfU1VfQkVBTV9GT1JNRVJfREVGQVVMVCwKKwkJICAgICBDRkdfVkhUX0VOQUJMRV9UWF9TVV9CRUFNX0ZPUk1FUl9NSU4sCisJCSAgICAgQ0ZHX1ZIVF9FTkFCTEVfVFhfU1VfQkVBTV9GT1JNRVJfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfU0FQX0FMTE9XX0FMTF9DSEFOTkVMX1BBUkFNX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgc2FwQWxsb3dBbGxDaGFubmVsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKwkJICAgICBDRkdfU0FQX0FMTE9XX0FMTF9DSEFOTkVMX1BBUkFNX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NBUF9BTExPV19BTExfQ0hBTk5FTF9QQVJBTV9NSU4sCisJCSAgICAgQ0ZHX1NBUF9BTExPV19BTExfQ0hBTk5FTF9QQVJBTV9NQVgpLAorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlSRUdfVkFSSUFCTEUoQ0ZHX0RJU0FCTEVfTERQQ19XSVRIX1RYQkZfQVAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZGlzYWJsZUxEUENXaXRoVHhiZkFQLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRElTQUJMRV9MRFBDX1dJVEhfVFhCRl9BUF9ERUZBVUxULAorCQkgICAgIENGR19ESVNBQkxFX0xEUENfV0lUSF9UWEJGX0FQX01JTiwKKwkJICAgICBDRkdfRElTQUJMRV9MRFBDX1dJVEhfVFhCRl9BUF9NQVgpLAorI2VuZGlmCisKKwlSRUdfRFlOQU1JQ19WQVJJQUJMRShDRkdfRU5BQkxFX1NTUiwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlU1NSLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19FTkFCTEVfU1NSX0RFRkFVTFQsCisJCQkgICAgIENGR19FTkFCTEVfU1NSX01JTiwKKwkJCSAgICAgQ0ZHX0VOQUJMRV9TU1JfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X2VuYWJsZV9zc3IsIDApLAorCisJUkVHX1ZBUklBQkxFKENGR19NQVhfTUVESVVNX1RJTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgY2ZnTWF4TWVkaXVtVGltZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFERUZBVUxULAorCQkgICAgIENGR19NQVhfTUVESVVNX1RJTUVfU1RBTUlOLAorCQkgICAgIENGR19NQVhfTUVESVVNX1RJTUVfU1RBTUFYKSwKKworCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX1ZIVF9GT1JfMjRHSFpfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVWaHRGb3IyNEdIekJhbmQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkgICAgIENGR19FTkFCTEVfVkhUX0ZPUl8yNEdIWl9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfVkhUX0ZPUl8yNEdIWl9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9WSFRfRk9SXzI0R0haX01BWCksCisjZW5kaWYKKworCVJFR19EWU5BTUlDX1ZBUklBQkxFKENGR19FTkFCTEVfRkFTVF9ST0FNX0lOX0NPTkNVUlJFTkNZLAorCQkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBiRmFzdFJvYW1JbkNvbkluaUZlYXR1cmVFbmFibGVkLAorCQkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJICAgICBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQkgICAgIENGR19FTkFCTEVfRkFTVF9ST0FNX0lOX0NPTkNVUlJFTkNZX0RFRkFVTFQsCisJCQkgICAgIENGR19FTkFCTEVfRkFTVF9ST0FNX0lOX0NPTkNVUlJFTkNZX01JTiwKKwkJCSAgICAgQ0ZHX0VOQUJMRV9GQVNUX1JPQU1fSU5fQ09OQ1VSUkVOQ1lfTUFYLAorCQkJICAgICBjYl9ub3RpZnlfc2V0X2VuYWJsZV9mYXN0X3JvYW1faW5fY29uY3VycmVuY3ksIDApLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfQURBUFRfUlhfRFJBSU5fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmRW5hYmxlQWRhcHRSeERyYWluLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfRU5BQkxFX0FEQVBUX1JYX0RSQUlOX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTl9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19GTEVYX0NPTk5FQ1RfUE9XRVJfRkFDVE9SX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZmxleENvbm5lY3RQb3dlckZhY3RvciwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX01JTk1BWCwKKwkJICAgICBDRkdfRkxFWF9DT05ORUNUX1BPV0VSX0ZBQ1RPUl9ERUZBVUxULAorCQkgICAgIENGR19GTEVYX0NPTk5FQ1RfUE9XRVJfRkFDVE9SX01JTiwKKwkJICAgICBDRkdfRkxFWF9DT05ORUNUX1BPV0VSX0ZBQ1RPUl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfSEVBUlRfQkVBVF9PRkZMT0FELCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZUlic3NIZWFydEJlYXRPZmZsb2FkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0hFQVJUX0JFQVRfT0ZGTE9BRF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfSEVBUlRfQkVBVF9PRkZMT0FEX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX0hFQVJUX0JFQVRfT0ZGTE9BRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19BTlRFTk5BX0RJVkVSU0lUWV9QQVJBTV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGFudGVubmFEaXZlcnNpdHksCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19BTlRFTk5BX0RJVkVSU0lUWV9QQVJBTV9ERUZBVUxULAorCQkgICAgIENGR19BTlRFTk5BX0RJVkVSU0lUWV9QQVJBTV9NSU4sCisJCSAgICAgQ0ZHX0FOVEVOTkFfRElWRVJTSVRZX1BBUkFNX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9TTlJfTU9OSVRPUklOR19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZFbmFibGVTTlJNb25pdG9yaW5nLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfRU5BQkxFX1NOUl9NT05JVE9SSU5HX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9TTlJfTU9OSVRPUklOR19NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9TTlJfTU9OSVRPUklOR19NQVgpLAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisJUkVHX1ZBUklBQkxFKENGR19QTk9fU0NBTl9TVVBQT1JULCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGNvbmZpZ1BOT1NjYW5TdXBwb3J0LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUE5PX1NDQU5fU1VQUE9SVF9ERUZBVUxULAorCQkgICAgIENGR19QTk9fU0NBTl9TVVBQT1JUX0RJU0FCTEUsCisJCSAgICAgQ0ZHX1BOT19TQ0FOX1NVUFBPUlRfRU5BQkxFKSwKKworCVJFR19WQVJJQUJMRShDRkdfUE5PX1NDQU5fVElNRVJfUkVQRUFUX1ZBTFVFLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGNvbmZpZ1BOT1NjYW5UaW1lclJlcGVhdFZhbHVlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUE5PX1NDQU5fVElNRVJfUkVQRUFUX1ZBTFVFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1BOT19TQ0FOX1RJTUVSX1JFUEVBVF9WQUxVRV9NSU4sCisJCSAgICAgQ0ZHX1BOT19TQ0FOX1RJTUVSX1JFUEVBVF9WQUxVRV9NQVgpLAorI2VuZGlmCisJUkVHX1ZBUklBQkxFKENGR19BTVNEVV9TVVBQT1JUX0lOX0FNUERVX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaXNBbXNkdVN1cHBvcnRJbkFNUERVLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQU1TRFVfU1VQUE9SVF9JTl9BTVBEVV9ERUZBVUxULAorCQkgICAgIENGR19BTVNEVV9TVVBQT1JUX0lOX0FNUERVX01JTiwKKwkJICAgICBDRkdfQU1TRFVfU1VQUE9SVF9JTl9BTVBEVV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19TVFJJQ1RfNUdIWl9QUkVGX0JZX01BUkdJTiwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBuU2VsZWN0NUdIek1hcmdpbiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NUUklDVF81R0haX1BSRUZfQllfTUFSR0lOX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NUUklDVF81R0haX1BSRUZfQllfTUFSR0lOX01JTiwKKwkJICAgICBDRkdfU1RSSUNUXzVHSFpfUFJFRl9CWV9NQVJHSU5fTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0lQX1RDUF9VRFBfQ0hLU1VNX09GRkxPQUQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlX2lwX3RjcF91ZHBfY2hlY2tzdW1fb2ZmbG9hZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwsCisJCSAgICAgQ0ZHX0VOQUJMRV9JUF9UQ1BfVURQX0NIS1NVTV9PRkZMT0FEX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9JUF9UQ1BfVURQX0NIS1NVTV9PRkZMT0FEX0RJU0FCTEUsCisJCSAgICAgQ0ZHX0VOQUJMRV9JUF9UQ1BfVURQX0NIS1NVTV9PRkZMT0FEX0VOQUJMRSksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1BPV0VSU0FWRV9PRkZMT0FEX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlUG93ZXJzYXZlT2ZmbG9hZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX1BPV0VSU0FWRV9PRkZMT0FEX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1BPV0VSU0FWRV9PRkZMT0FEX01JTiwKKwkJICAgICBDRkdfUE9XRVJTQVZFX09GRkxPQURfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0ZXX1VBUlRfUFJJTlRfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVmd3ByaW50LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0ZXX1VBUlRfUFJJTlRfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0ZXX1VBUlRfUFJJTlRfRElTQUJMRSwKKwkJICAgICBDRkdfRU5BQkxFX0ZXX1VBUlRfUFJJTlRfRU5BQkxFKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0ZXX0xPR19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZWZ3bG9nLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0ZXX0xPR19ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfRldfTE9HX0RJU0FCTEUsCisJCSAgICAgQ0ZHX0VOQUJMRV9GV19MT0dfRU5BQkxFKSwKKworI2lmZGVmIElQQV9PRkZMT0FECisJUkVHX1ZBUklBQkxFKENGR19JUEFfT0ZGTE9BRF9DT05GSUdfTkFNRSwgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJcGFDb25maWcsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19JUEFfT0ZGTE9BRF9DT05GSUdfREVGQVVMVCwKKwkJICAgICBDRkdfSVBBX09GRkxPQURfQ09ORklHX01JTiwKKwkJICAgICBDRkdfSVBBX09GRkxPQURfQ09ORklHX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0lQQV9ERVNDX1NJWkVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJcGFEZXNjU2l6ZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lQQV9ERVNDX1NJWkVfREVGQVVMVCwKKwkJICAgICBDRkdfSVBBX0RFU0NfU0laRV9NSU4sCisJCSAgICAgQ0ZHX0lQQV9ERVNDX1NJWkVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSVBBX0hJR0hfQkFORFdJRFRIX01CUFMsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSXBhSGlnaEJhbmR3aWR0aE1icHMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19JUEFfSElHSF9CQU5EV0lEVEhfTUJQU19ERUZBVUxULAorCQkgICAgIENGR19JUEFfSElHSF9CQU5EV0lEVEhfTUJQU19NSU4sCisJCSAgICAgQ0ZHX0lQQV9ISUdIX0JBTkRXSURUSF9NQlBTX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0lQQV9NRURJVU1fQkFORFdJRFRIX01CUFMsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSXBhTWVkaXVtQmFuZHdpZHRoTWJwcywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lQQV9NRURJVU1fQkFORFdJRFRIX01CUFNfREVGQVVMVCwKKwkJICAgICBDRkdfSVBBX01FRElVTV9CQU5EV0lEVEhfTUJQU19NSU4sCisJCSAgICAgQ0ZHX0lQQV9NRURJVU1fQkFORFdJRFRIX01CUFNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSVBBX0xPV19CQU5EV0lEVEhfTUJQUywgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJcGFMb3dCYW5kd2lkdGhNYnBzLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfSVBBX0xPV19CQU5EV0lEVEhfTUJQU19ERUZBVUxULAorCQkgICAgIENGR19JUEFfTE9XX0JBTkRXSURUSF9NQlBTX01JTiwKKwkJICAgICBDRkdfSVBBX0xPV19CQU5EV0lEVEhfTUJQU19NQVgpLAorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCVJFR19WQVJJQUJMRShDRkdfVkhUX0FNUERVX0xFTl9FWFBPTkVOVF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZWaHRBbXBkdUxlbkV4cG9uZW50LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfVkhUX0FNUERVX0xFTl9FWFBPTkVOVF9ERUZBVUxULAorCQkgICAgIENGR19WSFRfQU1QRFVfTEVOX0VYUE9ORU5UX01JTiwKKwkJICAgICBDRkdfVkhUX0FNUERVX0xFTl9FWFBPTkVOVF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19WSFRfTVBEVV9MRU5fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB2aHRNcGR1TGVuLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfVkhUX01QRFVfTEVOX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1ZIVF9NUERVX0xFTl9NSU4sCisJCSAgICAgQ0ZHX1ZIVF9NUERVX0xFTl9NQVgpLAorI2VuZGlmCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX01BWF9XT1dfRklMVEVSU19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG1heFdvV0ZpbHRlcnMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR19NQVhfV09XX0ZJTFRFUlNfREVGQVVMVCwKKwkJICAgICBDRkdfTUFYX1dPV19GSUxURVJTX01JTiwKKwkJICAgICBDRkdfTUFYX1dPV19GSUxURVJTX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1dPV19TVEFUVVNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB3b3dFbmFibGUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19XT1dfU1RBVFVTX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1dPV19FTkFCTEVfTUlOLAorCQkgICAgIENGR19XT1dfRU5BQkxFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0NPQUxFU0lOR19JTl9JQlNTX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaXNDb2FsZXNpbmdJbklCU1NBbGxvd2VkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQ09BTEVTSU5HX0lOX0lCU1NfREVGQVVMVCwKKwkJICAgICBDRkdfQ09BTEVTSU5HX0lOX0lCU1NfTUlOLAorCQkgICAgIENGR19DT0FMRVNJTkdfSU5fSUJTU19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19JQlNTX0FUSU1fV0lOX1NJWkVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpYnNzQVRJTVdpblNpemUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19JQlNTX0FUSU1fV0lOX1NJWkVfREVGQVVMVCwKKwkJICAgICBDRkdfSUJTU19BVElNX1dJTl9TSVpFX01JTiwKKwkJICAgICBDRkdfSUJTU19BVElNX1dJTl9TSVpFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1NBUF9NQVhfTk9fUEVFUlMsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbWF4TnVtYmVyT2ZQZWVycywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NBUF9NQVhfTk9fUEVFUlNfREVGQVVMVCwKKwkJICAgICBDRkdfU0FQX01BWF9OT19QRUVSU19NSU4sCisJCSAgICAgQ0ZHX1NBUF9NQVhfTk9fUEVFUlNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSUJTU19JU19QT1dFUl9TQVZFX0FMTE9XRURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpc0lic3NQb3dlclNhdmVBbGxvd2VkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfSUJTU19JU19QT1dFUl9TQVZFX0FMTE9XRURfREVGQVVMVCwKKwkJICAgICBDRkdfSUJTU19JU19QT1dFUl9TQVZFX0FMTE9XRURfTUlOLAorCQkgICAgIENGR19JQlNTX0lTX1BPV0VSX1NBVkVfQUxMT1dFRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19JQlNTX0lTX1BPV0VSX0NPTExBUFNFX0FMTE9XRURfTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGlzSWJzc1Bvd2VyQ29sbGFwc2VBbGxvd2VkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfSUJTU19JU19QT1dFUl9DT0xMQVBTRV9BTExPV0VEX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfSVNfUE9XRVJfQ09MTEFQU0VfQUxMT1dFRF9NSU4sCisJCSAgICAgQ0ZHX0lCU1NfSVNfUE9XRVJfQ09MTEFQU0VfQUxMT1dFRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19JQlNTX0FXQUtFX09OX1RYX1JYX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaXNJYnNzQXdha2VPblR4UngsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19JQlNTX0FXQUtFX09OX1RYX1JYX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfQVdBS0VfT05fVFhfUlhfTUlOLAorCQkgICAgIENGR19JQlNTX0FXQUtFX09OX1RYX1JYX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0lCU1NfSU5BQ1RJVklUWV9USU1FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaWJzc0luYWN0aXZpdHlDb3VudCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfSU5BQ1RJVklUWV9USU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfSU5BQ1RJVklUWV9USU1FX01JTiwKKwkJICAgICBDRkdfSUJTU19JTkFDVElWSVRZX1RJTUVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSUJTU19UWFNQX0VORF9JTkFDVElWSVRZX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgaWJzc1R4U3BFbmRJbmFjdGl2aXR5VGltZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfVFhTUF9FTkRfSU5BQ1RJVklUWV9ERUZBVUxULAorCQkgICAgIENGR19JQlNTX1RYU1BfRU5EX0lOQUNUSVZJVFlfTUlOLAorCQkgICAgIENGR19JQlNTX1RYU1BfRU5EX0lOQUNUSVZJVFlfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSUJTU19QU19XQVJNVVBfVElNRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGlic3NQc1dhcm11cFRpbWUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19JQlNTX1BTX1dBUk1VUF9USU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfUFNfV0FSTVVQX1RJTUVfTUlOLAorCQkgICAgIENGR19JQlNTX1BTX1dBUk1VUF9USU1FX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0lCU1NfUFNfMVJYX0NIQUlOX0lOX0FUSU1fV0lORE9XX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpYnNzUHMxUnhDaGFpbkluQXRpbUVuYWJsZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfUFNfMVJYX0NIQUlOX0lOX0FUSU1fV0lORE9XX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lCU1NfUFNfMVJYX0NIQUlOX0lOX0FUSU1fV0lORE9XX01JTiwKKwkJICAgICBDRkdfSUJTU19QU18xUlhfQ0hBSU5fSU5fQVRJTV9XSU5ET1dfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDBfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0aGVybWFsVGVtcE1pbkxldmVsMCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwwX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwwX01JTiwKKwkJICAgICBDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDBfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDBfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0aGVybWFsVGVtcE1heExldmVsMCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NQVhfTEVWRUwwX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NQVhfTEVWRUwwX01JTiwKKwkJICAgICBDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDBfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDFfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0aGVybWFsVGVtcE1pbkxldmVsMSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwxX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwxX01JTiwKKwkJICAgICBDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDFfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDFfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0aGVybWFsVGVtcE1heExldmVsMSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NQVhfTEVWRUwxX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NQVhfTEVWRUwxX01JTiwKKwkJICAgICBDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDFfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDJfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0aGVybWFsVGVtcE1pbkxldmVsMiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwyX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwyX01JTiwKKwkJICAgICBDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDJfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDJfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0aGVybWFsVGVtcE1heExldmVsMiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NQVhfTEVWRUwyX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NQVhfTEVWRUwyX01JTiwKKwkJICAgICBDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDJfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0aGVybWFsVGVtcE1pbkxldmVsMywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwzX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NSU5fTEVWRUwzX01JTiwKKwkJICAgICBDRkdfVEhFUk1BTF9URU1QX01JTl9MRVZFTDNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0aGVybWFsVGVtcE1heExldmVsMywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NQVhfTEVWRUwzX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RIRVJNQUxfVEVNUF9NQVhfTEVWRUwzX01JTiwKKwkJICAgICBDRkdfVEhFUk1BTF9URU1QX01BWF9MRVZFTDNfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfU0VUX1RYUE9XRVJfTElNSVQyR19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFR4UG93ZXIyZywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NFVF9UWFBPV0VSX0xJTUlUMkdfREVGQVVMVCwKKwkJICAgICBDRkdfU0VUX1RYUE9XRVJfTElNSVQyR19NSU4sCisJCSAgICAgQ0ZHX1NFVF9UWFBPV0VSX0xJTUlUMkdfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfU0VUX1RYUE9XRVJfTElNSVQ1R19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFR4UG93ZXI1ZywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NFVF9UWFBPV0VSX0xJTUlUNUdfREVGQVVMVCwKKwkJICAgICBDRkdfU0VUX1RYUE9XRVJfTElNSVQ1R19NSU4sCisJCSAgICAgQ0ZHX1NFVF9UWFBPV0VSX0xJTUlUNUdfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0RFQlVHX0NPTk5FQ1RfSVNTVUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZ0VuYWJsZURlYnVnTG9nLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0RFQlVHX0NPTk5FQ1RfSVNTVUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0RFQlVHX0NPTk5FQ1RfSVNTVUVfTUlOLAorCQkgICAgIENGR19FTkFCTEVfREVCVUdfQ09OTkVDVF9JU1NVRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfUlhfVEhSRUFELCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZVJ4VGhyZWFkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX1JYX1RIUkVBRF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfUlhfVEhSRUFEX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX1JYX1RIUkVBRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfREZTX1BIWUVSUl9GSUxURVJPRkZMT0FEX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBmRGZzUGh5ZXJyRmlsdGVyT2ZmbG9hZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9ERlNfUEhZRVJSX0ZJTFRFUk9GRkxPQURfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0RGU19QSFlFUlJfRklMVEVST0ZGTE9BRF9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9ERlNfUEhZRVJSX0ZJTFRFUk9GRkxPQURfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX09WRVJMQVBfQ0gsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZ0VuYWJsZU92ZXJMYXBDaCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX0VOQUJMRV9PVkVSTEFQX0NIX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9PVkVSTEFQX0NIX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX09WRVJMQVBfQ0hfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfUkVHX0NIQU5HRV9ERUZfQ09VTlRSWV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZSZWdDaGFuZ2VEZWZDb3VudHJ5LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUkVHX0NIQU5HRV9ERUZfQ09VTlRSWV9ERUZBVUxULAorCQkgICAgIENGR19SRUdfQ0hBTkdFX0RFRl9DT1VOVFJZX01JTiwKKwkJICAgICBDRkdfUkVHX0NIQU5HRV9ERUZfQ09VTlRSWV9NQVgpLAorCisjaWZkZWYgUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wKKwlSRUdfVkFSSUFCTEUoQ0ZHX0xMX1RYX0ZMT1dfTFdNLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFR4Rmxvd0xvd1dhdGVyTWFyaywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0xMX1RYX0ZMT1dfTFdNX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0xMX1RYX0ZMT1dfTFdNX01JTiwKKwkJICAgICBDRkdfTExfVFhfRkxPV19MV01fTUFYKSwKKwlSRUdfVkFSSUFCTEUoQ0ZHX0xMX1RYX0ZMT1dfSFdNX09GRlNFVCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBUeEZsb3dIaWdoV2F0ZXJNYXJrT2Zmc2V0LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfTExfVFhfRkxPV19IV01fT0ZGU0VUX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0xMX1RYX0ZMT1dfSFdNX09GRlNFVF9NSU4sCisJCSAgICAgQ0ZHX0xMX1RYX0ZMT1dfSFdNX09GRlNFVF9NQVgpLAorCVJFR19WQVJJQUJMRShDRkdfTExfVFhfRkxPV19NQVhfUV9ERVBUSCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBUeEZsb3dNYXhRdWV1ZURlcHRoLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfTExfVFhfRkxPV19NQVhfUV9ERVBUSF9ERUZBVUxULAorCQkgICAgIENGR19MTF9UWF9GTE9XX01BWF9RX0RFUFRIX01JTiwKKwkJICAgICBDRkdfTExfVFhfRkxPV19NQVhfUV9ERVBUSF9NQVgpLAorCVJFR19WQVJJQUJMRShDRkdfTExfVFhfTEJXX0ZMT1dfTFdNLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFR4TGJ3Rmxvd0xvd1dhdGVyTWFyaywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0xMX1RYX0xCV19GTE9XX0xXTV9ERUZBVUxULAorCQkgICAgIENGR19MTF9UWF9MQldfRkxPV19MV01fTUlOLAorCQkgICAgIENGR19MTF9UWF9MQldfRkxPV19MV01fTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfTExfVFhfTEJXX0ZMT1dfSFdNX09GRlNFVCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBUeExid0Zsb3dIaWdoV2F0ZXJNYXJrT2Zmc2V0LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfTExfVFhfTEJXX0ZMT1dfSFdNX09GRlNFVF9ERUZBVUxULAorCQkgICAgIENGR19MTF9UWF9MQldfRkxPV19IV01fT0ZGU0VUX01JTiwKKwkJICAgICBDRkdfTExfVFhfTEJXX0ZMT1dfSFdNX09GRlNFVF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19MTF9UWF9MQldfRkxPV19NQVhfUV9ERVBUSCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBUeExid0Zsb3dNYXhRdWV1ZURlcHRoLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfTExfVFhfTEJXX0ZMT1dfTUFYX1FfREVQVEhfREVGQVVMVCwKKwkJICAgICBDRkdfTExfVFhfTEJXX0ZMT1dfTUFYX1FfREVQVEhfTUlOLAorCQkgICAgIENGR19MTF9UWF9MQldfRkxPV19NQVhfUV9ERVBUSF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19MTF9UWF9IQldfRkxPV19MV00sIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgVHhIYndGbG93TG93V2F0ZXJNYXJrLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfTExfVFhfSEJXX0ZMT1dfTFdNX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0xMX1RYX0hCV19GTE9XX0xXTV9NSU4sCisJCSAgICAgQ0ZHX0xMX1RYX0hCV19GTE9XX0xXTV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19MTF9UWF9IQldfRkxPV19IV01fT0ZGU0VULCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFR4SGJ3Rmxvd0hpZ2hXYXRlck1hcmtPZmZzZXQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19MTF9UWF9IQldfRkxPV19IV01fT0ZGU0VUX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0xMX1RYX0hCV19GTE9XX0hXTV9PRkZTRVRfTUlOLAorCQkgICAgIENGR19MTF9UWF9IQldfRkxPV19IV01fT0ZGU0VUX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0xMX1RYX0hCV19GTE9XX01BWF9RX0RFUFRILCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFR4SGJ3Rmxvd01heFF1ZXVlRGVwdGgsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19MTF9UWF9IQldfRkxPV19NQVhfUV9ERVBUSF9ERUZBVUxULAorCQkgICAgIENGR19MTF9UWF9IQldfRkxPV19NQVhfUV9ERVBUSF9NSU4sCisJCSAgICAgQ0ZHX0xMX1RYX0hCV19GTE9XX01BWF9RX0RFUFRIX01BWCksCisjZW5kaWYgLyogUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wgKi8KKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0xMX1RYX0ZMT1dfU1RPUF9RVUVVRV9USCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBUeEZsb3dTdG9wUXVldWVUaHJlc2hvbGQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19MTF9UWF9GTE9XX1NUT1BfUVVFVUVfVEhfREVGQVVMVCwKKwkJICAgICBDRkdfTExfVFhfRkxPV19TVE9QX1FVRVVFX1RIX01JTiwKKwkJICAgICBDRkdfTExfVFhfRkxPV19TVE9QX1FVRVVFX1RIX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0xMX1RYX0ZMT1dfU1RBUlRfUVVFVUVfT0ZGU0VULCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIFR4Rmxvd1N0YXJ0UXVldWVPZmZzZXQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19MTF9UWF9GTE9XX1NUQVJUX1FVRVVFX09GRlNFVF9ERUZBVUxULAorCQkgICAgIENGR19MTF9UWF9GTE9XX1NUQVJUX1FVRVVFX09GRlNFVF9NSU4sCisJCSAgICAgQ0ZHX0xMX1RYX0ZMT1dfU1RBUlRfUVVFVUVfT0ZGU0VUX01BWCksCisKKyNlbmRpZgorCVJFR19WQVJJQUJMRShDRkdfSU5JVElBTF9EV0VMTF9USU1FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgbkluaXRpYWxEd2VsbFRpbWUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19JTklUSUFMX0RXRUxMX1RJTUVfREVGQVVMVCwKKwkJICAgICBDRkdfSU5JVElBTF9EV0VMTF9USU1FX01JTiwKKwkJICAgICBDRkdfSU5JVElBTF9EV0VMTF9USU1FX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0lOSVRJQUxfU0NBTl9OT19ERlNfQ0hOTF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGluaXRpYWxfc2Nhbl9ub19kZnNfY2hubCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lOSVRJQUxfU0NBTl9OT19ERlNfQ0hOTF9ERUZBVUxULAorCQkgICAgIENGR19JTklUSUFMX1NDQU5fTk9fREZTX0NITkxfTUlOLAorCQkgICAgIENGR19JTklUSUFMX1NDQU5fTk9fREZTX0NITkxfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfU0FQX01BWF9PRkZMT0FEX1BFRVJTLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGFwTWF4T2ZmbG9hZFBlZXJzLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfU0FQX01BWF9PRkZMT0FEX1BFRVJTX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NBUF9NQVhfT0ZGTE9BRF9QRUVSU19NSU4sCisJCSAgICAgQ0ZHX1NBUF9NQVhfT0ZGTE9BRF9QRUVSU19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19TQVBfTUFYX09GRkxPQURfUkVPUkRFUl9CVUZGUywgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBhcE1heE9mZmxvYWRSZW9yZGVyQnVmZnMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR19TQVBfTUFYX09GRkxPQURfUkVPUkRFUl9CVUZGU19ERUZBVUxULAorCQkgICAgIENGR19TQVBfTUFYX09GRkxPQURfUkVPUkRFUl9CVUZGU19NSU4sCisJCSAgICAgQ0ZHX1NBUF9NQVhfT0ZGTE9BRF9SRU9SREVSX0JVRkZTX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0FEVkVSVElTRV9DT05DVVJSRU5UX09QRVJBVElPTl9OQU1FLAorCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgYWR2ZXJ0aXNlQ29uY3VycmVudE9wZXJhdGlvbiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwsCisJCSAgICAgQ0ZHX0FEVkVSVElTRV9DT05DVVJSRU5UX09QRVJBVElPTl9ERUZBVUxULAorCQkgICAgIENGR19BRFZFUlRJU0VfQ09OQ1VSUkVOVF9PUEVSQVRJT05fTUlOLAorCQkgICAgIENGR19BRFZFUlRJU0VfQ09OQ1VSUkVOVF9PUEVSQVRJT05fTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX01FTU9SWV9ERUVQX1NMRUVQLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZU1lbURlZXBTbGVlcCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9NRU1PUllfREVFUF9TTEVFUF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTUVNT1JZX0RFRVBfU0xFRVBfTUlOLAorCQkgICAgIENGR19FTkFCTEVfTUVNT1JZX0RFRVBfU0xFRVBfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0gsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZGVmYXVsdFJhdGVJbmRleDI0R2h6LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0hfREVGQVVMVCwKKwkJICAgICBDRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0hfTUlOLAorCQkgICAgIENGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSF9NQVgpLAorCisjaWZkZWYgTUVNT1JZX0RFQlVHCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfTUVNT1JZX0RFQlVHX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSXNNZW1vcnlEZWJ1Z1N1cHBvcnRFbmFibGVkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX01FTU9SWV9ERUJVR19ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTUVNT1JZX0RFQlVHX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX01FTU9SWV9ERUJVR19NQVgpLAorI2VuZGlmCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0RFQlVHX1AyUF9SRU1BSU5fT05fQ0hBTk5FTF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGRlYnVnUDJwUmVtYWluT25DaGFubmVsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKwkJICAgICBDRkdfREVCVUdfUDJQX1JFTUFJTl9PTl9DSEFOTkVMX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0RFQlVHX1AyUF9SRU1BSU5fT05fQ0hBTk5FTF9NSU4sCisJCSAgICAgQ0ZHX0RFQlVHX1AyUF9SRU1BSU5fT05fQ0hBTk5FTF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfUEFDS0VUX0xPRywgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVQYWNrZXRMb2csCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfUEFDS0VUX0xPR19ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfUEFDS0VUX0xPR19NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9QQUNLRVRfTE9HX01BWCksCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJUkVHX1ZBUklBQkxFKENGR19ST0FNSU5HX09GRkxPQURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpc1JvYW1PZmZsb2FkRW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX1JPQU1JTkdfT0ZGTE9BRF9ERUZBVUxULAorCQkgICAgIENGR19ST0FNSU5HX09GRkxPQURfTUlOLAorCQkgICAgIENGR19ST0FNSU5HX09GRkxPQURfTUFYKSwKKyNlbmRpZgorI2lmZGVmIE1TTV9QTEFURk9STQorCVJFR19WQVJJQUJMRShDRkdfQlVTX0JBTkRXSURUSF9ISUdIX1RIUkVTSE9MRCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBidXNCYW5kd2lkdGhIaWdoVGhyZXNob2xkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQlVTX0JBTkRXSURUSF9ISUdIX1RIUkVTSE9MRF9ERUZBVUxULAorCQkgICAgIENGR19CVVNfQkFORFdJRFRIX0hJR0hfVEhSRVNIT0xEX01JTiwKKwkJICAgICBDRkdfQlVTX0JBTkRXSURUSF9ISUdIX1RIUkVTSE9MRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19CVVNfQkFORFdJRFRIX01FRElVTV9USFJFU0hPTEQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgYnVzQmFuZHdpZHRoTWVkaXVtVGhyZXNob2xkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQlVTX0JBTkRXSURUSF9NRURJVU1fVEhSRVNIT0xEX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0JVU19CQU5EV0lEVEhfTUVESVVNX1RIUkVTSE9MRF9NSU4sCisJCSAgICAgQ0ZHX0JVU19CQU5EV0lEVEhfTUVESVVNX1RIUkVTSE9MRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19CVVNfQkFORFdJRFRIX0xPV19USFJFU0hPTEQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgYnVzQmFuZHdpZHRoTG93VGhyZXNob2xkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQlVTX0JBTkRXSURUSF9MT1dfVEhSRVNIT0xEX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0JVU19CQU5EV0lEVEhfTE9XX1RIUkVTSE9MRF9NSU4sCisJCSAgICAgQ0ZHX0JVU19CQU5EV0lEVEhfTE9XX1RIUkVTSE9MRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19CVVNfQkFORFdJRFRIX0NPTVBVVEVfSU5URVJWQUwsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgYnVzQmFuZHdpZHRoQ29tcHV0ZUludGVydmFsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfQlVTX0JBTkRXSURUSF9DT01QVVRFX0lOVEVSVkFMX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0JVU19CQU5EV0lEVEhfQ09NUFVURV9JTlRFUlZBTF9NSU4sCisJCSAgICAgQ0ZHX0JVU19CQU5EV0lEVEhfQ09NUFVURV9JTlRFUlZBTF9NQVgpLAorCVJFR19WQVJJQUJMRShDRkdfVENQX0RFTEFDS19USFJFU0hPTERfSElHSCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0Y3BEZWxhY2tUaHJlc2hvbGRIaWdoLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVENQX0RFTEFDS19USFJFU0hPTERfSElHSF9ERUZBVUxULAorCQkgICAgIENGR19UQ1BfREVMQUNLX1RIUkVTSE9MRF9ISUdIX01JTiwKKwkJICAgICBDRkdfVENQX0RFTEFDS19USFJFU0hPTERfSElHSF9NQVgpLAorCVJFR19WQVJJQUJMRShDRkdfVENQX0RFTEFDS19USFJFU0hPTERfTE9XLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIHRjcERlbGFja1RocmVzaG9sZExvdywKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1RDUF9ERUxBQ0tfVEhSRVNIT0xEX0xPV19ERUZBVUxULAorCQkgICAgIENGR19UQ1BfREVMQUNLX1RIUkVTSE9MRF9MT1dfTUlOLAorCQkgICAgIENGR19UQ1BfREVMQUNLX1RIUkVTSE9MRF9MT1dfTUFYKSwKKyNlbmRpZgorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfRldfTE9HX1RZUEUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlRndMb2dUeXBlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0ZXX0xPR19UWVBFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9GV19MT0dfVFlQRV9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9GV19MT0dfVFlQRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfRldfREVCVUdfTE9HX0xFVkVMLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZUZ3TG9nTGV2ZWwsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfRldfREVCVUdfTE9HX0xFVkVMX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9GV19ERUJVR19MT0dfTEVWRUxfTUlOLAorCQkgICAgIENGR19FTkFCTEVfRldfREVCVUdfTE9HX0xFVkVMX01BWCksCisKKwlSRUdfVkFSSUFCTEVfU1RSSU5HKENGR19FTkFCTEVfRldfTU9EVUxFX0xPR19MRVZFTCwgV0xBTl9QQVJBTV9TdHJpbmcsCisJCQkgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZUZ3TW9kdWxlTG9nTGV2ZWwsCisJCQkgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkJICAgICh2b2lkICopQ0ZHX0VOQUJMRV9GV19NT0RVTEVfTE9HX0RFRkFVTFQpLAorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCVJFR19WQVJJQUJMRShDRkdfUE1GX1NBX1FVRVJZX01BWF9SRVRSSUVTX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgcG1mU2FRdWVyeU1heFJldHJpZXMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19QTUZfU0FfUVVFUllfTUFYX1JFVFJJRVNfREVGQVVMVCwKKwkJICAgICBDRkdfUE1GX1NBX1FVRVJZX01BWF9SRVRSSUVTX01JTiwKKwkJICAgICBDRkdfUE1GX1NBX1FVRVJZX01BWF9SRVRSSUVTX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1BNRl9TQV9RVUVSWV9SRVRSWV9JTlRFUlZBTF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIHBtZlNhUXVlcnlSZXRyeUludGVydmFsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfUE1GX1NBX1FVRVJZX1JFVFJZX0lOVEVSVkFMX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1BNRl9TQV9RVUVSWV9SRVRSWV9JTlRFUlZBTF9NSU4sCisJCSAgICAgQ0ZHX1BNRl9TQV9RVUVSWV9SRVRSWV9JTlRFUlZBTF9NQVgpLAorI2VuZGlmCisJUkVHX1ZBUklBQkxFKENGR19NQVhfQ09OQ1VSUkVOVF9DT05ORUNUSU9OU19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGdNYXhDb25jdXJyZW50QWN0aXZlU2Vzc2lvbnMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19NQVhfQ09OQ1VSUkVOVF9DT05ORUNUSU9OU19ERUZBVUxULAorCQkgICAgIENGR19NQVhfQ09OQ1VSUkVOVF9DT05ORUNUSU9OU19NSU4sCisJCSAgICAgQ0ZHX01BWF9DT05DVVJSRU5UX0NPTk5FQ1RJT05TX01BWCksCisKKyNpZmRlZiBGRUFUVVJFX0dSRUVOX0FQCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfR1JFRU5fQVBfRkVBVFVSRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVHcmVlbkFQLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0dSRUVOX0FQX0ZFQVRVUkVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX0dSRUVOX0FQX0ZFQVRVUkVfTUlOLAorCQkgICAgIENGR19FTkFCTEVfR1JFRU5fQVBfRkVBVFVSRV9NQVgpLAorI2VuZGlmCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0lHTk9SRV9DQUNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpZ25vcmVDQUMsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19JR05PUkVfQ0FDX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lHTk9SRV9DQUNfTUlOLAorCQkgICAgIENGR19JR05PUkVfQ0FDX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9TQVBfREZTX0NIX1NJRlNfQlVSU1RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBJc1NhcERmc0NoU2lmc0J1cnN0RW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9TQVBfREZTX0NIX1NJRlNfQlVSU1RfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX1NBUF9ERlNfQ0hfU0lGU19CVVJTVF9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9TQVBfREZTX0NIX1NJRlNfQlVSU1RfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfREZTX1JBREFSX1BSSV9NVUxUSVBMSUVSX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZGZzUmFkYXJQcmlNdWx0aXBsaWVyLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfREZTX1JBREFSX1BSSV9NVUxUSVBMSUVSX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0RGU19SQURBUl9QUklfTVVMVElQTElFUl9NSU4sCisJCSAgICAgQ0ZHX0RGU19SQURBUl9QUklfTVVMVElQTElFUl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19SRU9SREVSX09GRkxPQURfU1VQUE9SVF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIHJlb3JkZXJPZmZsb2FkU3VwcG9ydCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JFT1JERVJfT0ZGTE9BRF9TVVBQT1JUX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1JFT1JERVJfT0ZGTE9BRF9TVVBQT1JUX01JTiwKKwkJICAgICBDRkdfUkVPUkRFUl9PRkZMT0FEX1NVUFBPUlRfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSVBBX1VDX1RYX0JVRl9DT1VOVF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIElwYVVjVHhCdWZDb3VudCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX0lQQV9VQ19UWF9CVUZfQ09VTlRfREVGQVVMVCwKKwkJICAgICBDRkdfSVBBX1VDX1RYX0JVRl9DT1VOVF9NSU4sCisJCSAgICAgQ0ZHX0lQQV9VQ19UWF9CVUZfQ09VTlRfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfSVBBX1VDX1RYX0JVRl9TSVpFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgSXBhVWNUeEJ1ZlNpemUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR19JUEFfVUNfVFhfQlVGX1NJWkVfREVGQVVMVCwKKwkJICAgICBDRkdfSVBBX1VDX1RYX0JVRl9TSVpFX01JTiwKKwkJICAgICBDRkdfSVBBX1VDX1RYX0JVRl9TSVpFX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0lQQV9VQ19SWF9JTkRfUklOR19DT1VOVF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIElwYVVjUnhJbmRSaW5nQ291bnQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR19JUEFfVUNfUlhfSU5EX1JJTkdfQ09VTlRfREVGQVVMVCwKKwkJICAgICBDRkdfSVBBX1VDX1JYX0lORF9SSU5HX0NPVU5UX01JTiwKKwkJICAgICBDRkdfSVBBX1VDX1JYX0lORF9SSU5HX0NPVU5UX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0lQQV9VQ19UWF9QQVJUSVRJT05fQkFTRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIElwYVVjVHhQYXJ0aXRpb25CYXNlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfSVBBX1VDX1RYX1BBUlRJVElPTl9CQVNFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0lQQV9VQ19UWF9QQVJUSVRJT05fQkFTRV9NSU4sCisJCSAgICAgQ0ZHX0lQQV9VQ19UWF9QQVJUSVRJT05fQkFTRV9NQVgpLAorI2lmZGVmIFdMQU5fTE9HR0lOR19TT0NLX1NWQ19FTkFCTEUKKwlSRUdfVkFSSUFCTEUoQ0ZHX1dMQU5fTE9HR0lOR19TVVBQT1JUX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgd2xhbkxvZ2dpbmdFbmFibGUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19XTEFOX0xPR0dJTkdfU1VQUE9SVF9ERUZBVUxULAorCQkgICAgIENGR19XTEFOX0xPR0dJTkdfU1VQUE9SVF9ESVNBQkxFLAorCQkgICAgIENGR19XTEFOX0xPR0dJTkdfU1VQUE9SVF9FTkFCTEUpLAorCisJUkVHX1ZBUklBQkxFKENGR19XTEFOX0xPR0dJTkdfRkVfQ09OU09MRV9TVVBQT1JUX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB3bGFuTG9nZ2luZ0ZFVG9Db25zb2xlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfV0xBTl9MT0dHSU5HX0ZFX0NPTlNPTEVfU1VQUE9SVF9ERUZBVUxULAorCQkgICAgIENGR19XTEFOX0xPR0dJTkdfRkVfQ09OU09MRV9TVVBQT1JUX0RJU0FCTEUsCisJCSAgICAgQ0ZHX1dMQU5fTE9HR0lOR19GRV9DT05TT0xFX1NVUFBPUlRfRU5BQkxFKSwKKworCVJFR19WQVJJQUJMRShDRkdfV0xBTl9MT0dHSU5HX05VTV9CVUZfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB3bGFuTG9nZ2luZ051bUJ1ZiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1dMQU5fTE9HR0lOR19OVU1fQlVGX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1dMQU5fTE9HR0lOR19OVU1fQlVGX01JTiwKKwkJICAgICBDRkdfV0xBTl9MT0dHSU5HX05VTV9CVUZfTUFYKSwKKyNlbmRpZiAvKiBXTEFOX0xPR0dJTkdfU09DS19TVkNfRU5BQkxFICovCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9TSUZTX0JVUlNULCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGVuYWJsZVNpZnNCdXJzdCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9TSUZTX0JVUlNUX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9TSUZTX0JVUlNUX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX1NJRlNfQlVSU1RfTUFYKSwKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfTFBBU1NfU1VQUE9SVCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVscGFzc3N1cHBvcnQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTFBBU1NfU1VQUE9SVF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTFBBU1NfU1VQUE9SVF9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9MUEFTU19TVVBQT1JUX01BWCksCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9OQU4KKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9OQU5fU1VQUE9SVCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVfbmFuX3N1cHBvcnQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTkFOX1NVUFBPUlRfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX05BTl9TVVBQT1JUX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX05BTl9TVVBQT1JUX01BWCksCisjZW5kaWYKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX1NFTEZfUkVDT1ZFUlksIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlU2VsZlJlY292ZXJ5LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX1NFTEZfUkVDT1ZFUllfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX1NFTEZfUkVDT1ZFUllfTUlOLAorCQkgICAgIENGR19FTkFCTEVfU0VMRl9SRUNPVkVSWV9NQVgpLAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MKKwlSRUdfVkFSSUFCTEUoQ0ZHX1NBUF9TQ0NfQ0hBTl9BVk9JREFOQ0UsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgU2FwU2NjQ2hhbkF2b2lkYW5jZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NBUF9TQ0NfQ0hBTl9BVk9JREFOQ0VfREVGQVVMVCwKKwkJICAgICBDRkdfU0FQX1NDQ19DSEFOX0FWT0lEQU5DRV9NSU4sCisJCSAgICAgQ0ZHX1NBUF9TQ0NfQ0hBTl9BVk9JREFOQ0VfTUFYKSwKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRk9SQ0VfU0FQX1NDQyAqLworCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfU0FQX1NVU1BFTkQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlU2FwU3VzcGVuZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9TQVBfU1VTUEVORF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfU0FQX1NVU1BFTkRfTUlOLAorCQkgICAgIENGR19FTkFCTEVfU0FQX1NVU1BFTkRfTUFYKSwKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9FWFRXT1dfU1VQUE9SVAorCVJFR19WQVJJQUJMRShDRkdfRVhUV09XX0dPX1RPX1NVU1BFTkQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZXh0V293R290b1N1c3BlbmQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FWFRXT1dfR09fVE9fU1VTUEVORF9ERUZBVUxULAorCQkgICAgIENGR19FWFRXT1dfR09fVE9fU1VTUEVORF9NSU4sCisJCSAgICAgQ0ZHX0VYVFdPV19HT19UT19TVVNQRU5EX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VYVFdPV19BUFAxX1dBS0VfUElOX05VTUJFUiwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBleHRXb3dBcHAxV2FrZXVwUGluTnVtYmVyLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUV09XX0FQUDFfV0FLRV9QSU5fTlVNQkVSX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VYVFdPV19BUFAxX1dBS0VfUElOX05VTUJFUl9NSU4sCisJCSAgICAgQ0ZHX0VYVFdPV19BUFAxX1dBS0VfUElOX05VTUJFUl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FWFRXT1dfQVBQMl9XQUtFX1BJTl9OVU1CRVIsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZXh0V293QXBwMldha2V1cFBpbk51bWJlciwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VYVFdPV19BUFAyX1dBS0VfUElOX05VTUJFUl9ERUZBVUxULAorCQkgICAgIENGR19FWFRXT1dfQVBQMl9XQUtFX1BJTl9OVU1CRVJfTUlOLAorCQkgICAgIENGR19FWFRXT1dfQVBQMl9XQUtFX1BJTl9OVU1CRVJfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRVhUV09XX0tBX0lOSVRfUElOR19JTlRFUlZBTCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBleHRXb3dBcHAyS0FJbml0UGluZ0ludGVydmFsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUV09XX0tBX0lOSVRfUElOR19JTlRFUlZBTF9ERUZBVUxULAorCQkgICAgIENGR19FWFRXT1dfS0FfSU5JVF9QSU5HX0lOVEVSVkFMX01JTiwKKwkJICAgICBDRkdfRVhUV09XX0tBX0lOSVRfUElOR19JTlRFUlZBTF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FWFRXT1dfS0FfTUlOX1BJTkdfSU5URVJWQUwsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZXh0V293QXBwMktBTWluUGluZ0ludGVydmFsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUV09XX0tBX01JTl9QSU5HX0lOVEVSVkFMX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VYVFdPV19LQV9NSU5fUElOR19JTlRFUlZBTF9NSU4sCisJCSAgICAgQ0ZHX0VYVFdPV19LQV9NSU5fUElOR19JTlRFUlZBTF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FWFRXT1dfS0FfTUFYX1BJTkdfSU5URVJWQUwsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZXh0V293QXBwMktBTWF4UGluZ0ludGVydmFsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUV09XX0tBX01BWF9QSU5HX0lOVEVSVkFMX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VYVFdPV19LQV9NQVhfUElOR19JTlRFUlZBTF9NSU4sCisJCSAgICAgQ0ZHX0VYVFdPV19LQV9NQVhfUElOR19JTlRFUlZBTF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FWFRXT1dfS0FfSU5DX1BJTkdfSU5URVJWQUwsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZXh0V293QXBwMktBSW5jUGluZ0ludGVydmFsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUV09XX0tBX0lOQ19QSU5HX0lOVEVSVkFMX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VYVFdPV19LQV9JTkNfUElOR19JTlRFUlZBTF9NSU4sCisJCSAgICAgQ0ZHX0VYVFdPV19LQV9JTkNfUElOR19JTlRFUlZBTF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FWFRXT1dfVENQX1NSQ19QT1JULCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGV4dFdvd0FwcDJUY3BTcmNQb3J0LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUV09XX1RDUF9TUkNfUE9SVF9ERUZBVUxULAorCQkgICAgIENGR19FWFRXT1dfVENQX1NSQ19QT1JUX01JTiwKKwkJICAgICBDRkdfRVhUV09XX1RDUF9TUkNfUE9SVF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FWFRXT1dfVENQX0RTVF9QT1JULCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGV4dFdvd0FwcDJUY3BEc3RQb3J0LAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUV09XX1RDUF9EU1RfUE9SVF9ERUZBVUxULAorCQkgICAgIENGR19FWFRXT1dfVENQX0RTVF9QT1JUX01JTiwKKwkJICAgICBDRkdfRVhUV09XX1RDUF9EU1RfUE9SVF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FWFRXT1dfVENQX1RYX1RJTUVPVVQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZXh0V293QXBwMlRjcFR4VGltZW91dCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VYVFdPV19UQ1BfVFhfVElNRU9VVF9ERUZBVUxULAorCQkgICAgIENGR19FWFRXT1dfVENQX1RYX1RJTUVPVVRfTUlOLAorCQkgICAgIENGR19FWFRXT1dfVENQX1RYX1RJTUVPVVRfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRVhUV09XX1RDUF9SWF9USU1FT1VULCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGV4dFdvd0FwcDJUY3BSeFRpbWVvdXQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FWFRXT1dfVENQX1JYX1RJTUVPVVRfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUV09XX1RDUF9SWF9USU1FT1VUX01JTiwKKwkJICAgICBDRkdfRVhUV09XX1RDUF9SWF9USU1FT1VUX01BWCksCisjZW5kaWYKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9ERUFVVEhfVE9fRElTQVNTT0NfTUFQX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZ0VuYWJsZURlYXV0aFRvRGlzYXNzb2NNYXAsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfREVBVVRIX1RPX0RJU0FTU09DX01BUF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfREVBVVRIX1RPX0RJU0FTU09DX01BUF9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9ERUFVVEhfVE9fRElTQVNTT0NfTUFQX01BWCksCisjaWZkZWYgREhDUF9TRVJWRVJfT0ZGTE9BRAorCVJFR19WQVJJQUJMRShDRkdfREhDUF9TRVJWRVJfT0ZGTE9BRF9TVVBQT1JUX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZW5hYmxlREhDUFNlcnZlck9mZmxvYWQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19ESENQX1NFUlZFUl9PRkZMT0FEX1NVUFBPUlRfREVGQVVMVCwKKwkJICAgICBDRkdfREhDUF9TRVJWRVJfT0ZGTE9BRF9TVVBQT1JUX01JTiwKKwkJICAgICBDRkdfREhDUF9TRVJWRVJfT0ZGTE9BRF9TVVBQT1JUX01BWCksCisJUkVHX1ZBUklBQkxFKENGR19ESENQX1NFUlZFUl9PRkZMT0FEX05VTV9DTElFTlRfTkFNRSwKKwkJICAgICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGRoY3BNYXhOdW1DbGllbnRzLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfREhDUF9TRVJWRVJfT0ZGTE9BRF9OVU1fQ0xJRU5UX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0RIQ1BfU0VSVkVSX09GRkxPQURfTlVNX0NMSUVOVF9NSU4sCisJCSAgICAgQ0ZHX0RIQ1BfU0VSVkVSX09GRkxPQURfTlVNX0NMSUVOVF9NQVgpLAorCVJFR19WQVJJQUJMRV9TVFJJTkcoQ0ZHX0RIQ1BfU0VSVkVSX0lQX05BTUUsIFdMQU5fUEFSQU1fU3RyaW5nLAorCQkJICAgIHN0cnVjdCBoZGRfY29uZmlnLCBkaGNwU2VydmVySVAsCisJCQkgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorCQkJICAgICh2b2lkICopQ0ZHX0RIQ1BfU0VSVkVSX0lQX0RFRkFVTFQpLAorI2VuZGlmIC8qIERIQ1BfU0VSVkVSX09GRkxPQUQgKi8KKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0RFQVVUSF9CRUZPUkVfQ09OTkVDVElPTiwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQlzdHJ1Y3QgaGRkX2NvbmZpZywgc2VuZERlYXV0aEJlZm9yZUNvbiwKKwkJVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQlDRkdfRU5BQkxFX0RFQVVUSF9CRUZPUkVfQ09OTkVDVElPTl9ERUZBVUxULAorCQlDRkdfRU5BQkxFX0RFQVVUSF9CRUZPUkVfQ09OTkVDVElPTl9NSU4sCisJCUNGR19FTkFCTEVfREVBVVRIX0JFRk9SRV9DT05ORUNUSU9OX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9NQUNfQUREUl9TUE9PRklORywgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBlbmFibGVfbWFjX3Nwb29maW5nLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX01BQ19BRERSX1NQT09GSU5HX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9NQUNfQUREUl9TUE9PRklOR19NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9NQUNfQUREUl9TUE9PRklOR19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfQ1VTVE9NX0NPTkNfUlVMRTFfTkFNRSwgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgY29uY19jdXN0b21fcnVsZTEsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLAorCQkgICAgIENGR19FTkFCTEVfQ1VTVE9NX0NPTkNfUlVMRTFfTkFNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfQ1VTVE9NX0NPTkNfUlVMRTFfTkFNRV9NSU4sCisJCSAgICAgQ0ZHX0VOQUJMRV9DVVNUT01fQ09OQ19SVUxFMV9OQU1FX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0VOQUJMRV9DVVNUT01fQ09OQ19SVUxFMl9OQU1FLCAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBjb25jX2N1c3RvbV9ydWxlMiwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX0VOQUJMRV9DVVNUT01fQ09OQ19SVUxFMl9OQU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9DVVNUT01fQ09OQ19SVUxFMl9OQU1FX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX0NVU1RPTV9DT05DX1JVTEUyX05BTUVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX1NUQV9DT05ORUNUSU9OX0lOXzVHSFosICBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGlzX3N0YV9jb25uZWN0aW9uX2luXzVnel9lbmFibGVkLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywKKwkJICAgICBDRkdfRU5BQkxFX1NUQV9DT05ORUNUSU9OX0lOXzVHSFpfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX1NUQV9DT05ORUNUSU9OX0lOXzVHSFpfTUlOLAorCQkgICAgIENGR19FTkFCTEVfU1RBX0NPTk5FQ1RJT05fSU5fNUdIWl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19TVEFfTUlSQUNBU1RfTUNDX1JFU1RfVElNRV9WQUwsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgc3RhX21pcmFjYXN0X21jY19yZXN0X3RpbWVfdmFsLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfU1RBX01JUkFDQVNUX01DQ19SRVNUX1RJTUVfVkFMX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NUQV9NSVJBQ0FTVF9NQ0NfUkVTVF9USU1FX1ZBTF9NSU4sCisJCSAgICAgQ0ZHX1NUQV9NSVJBQ0FTVF9NQ0NfUkVTVF9USU1FX1ZBTF9NQVgpLAorCisjaWZkZWYgRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFCisJUkVHX1ZBUklBQkxFKENGR19TQVBfTUNDX0NIQU5ORUxfQVZPSURBTkNFX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLAorCQkgICAgIHNhcF9jaGFubmVsX2F2b2lkYW5jZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssCisJCSAgICAgQ0ZHX1NBUF9NQ0NfQ0hBTk5FTF9BVk9JREFOQ0VfREVGQVVMVCwKKwkJICAgICBDRkdfU0FQX01DQ19DSEFOTkVMX0FWT0lEQU5DRV9NSU4sCisJCSAgICAgQ0ZHX1NBUF9NQ0NfQ0hBTk5FTF9BVk9JREFOQ0VfTUFYKSwKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKworCVJFR19WQVJJQUJMRShDRkdfU0FQX1AyUF8xMUFDX09WRVJSSURFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJCXN0cnVjdCBoZGRfY29uZmlnLCBzYXBfcDJwXzExYWNfb3ZlcnJpZGUsCisJCQlWQVJfRkxBR1NfT1BUSU9OQUwgfAorCQkJCQlWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCQlDRkdfU0FQX1AyUF8xMUFDX09WRVJSSURFX0RFRkFVTFQsCisJCQlDRkdfU0FQX1AyUF8xMUFDX09WRVJSSURFX01JTiwKKwkJCUNGR19TQVBfUDJQXzExQUNfT1ZFUlJJREVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX1JBTURVTVBfQ09MTEVDVElPTiwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBpc19yYW1kdW1wX2VuYWJsZWQsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfUkFNRFVNUF9DT0xMRUNUSU9OX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9SQU1EVU1QX0NPTExFQ1RJT05fTUlOLAorCQkgICAgIENGR19FTkFCTEVfUkFNRFVNUF9DT0xMRUNUSU9OX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1NBUF9ET1QxMU1DLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIHNhcF9kb3QxMW1jLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfU0FQX0RPVDExTUNfREVGQVVMVCwKKwkJICAgICBDRkdfU0FQX0RPVDExTUNfTUlOLAorCQkgICAgIENGR19TQVBfRE9UMTFNQ19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FTkFCTEVfTk9OX0RGU19DSEFOX09OX1JBREFSLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIHByZWZlcl9ub25fZGZzX29uX3JhZGFyLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRU5BQkxFX05PTl9ERlNfQ0hBTl9PTl9SQURBUl9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfTk9OX0RGU19DSEFOX09OX1JBREFSX01JTiwKKwkJICAgICBDRkdfRU5BQkxFX05PTl9ERlNfQ0hBTl9PTl9SQURBUl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19NVUxUSUNBU1RfSE9TVF9GV19NU0dTLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG11bHRpY2FzdF9ob3N0X2Z3X21zZ3MsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19NVUxUSUNBU1RfSE9TVF9GV19NU0dTX0RFRkFVTFQsCisJCSAgICAgQ0ZHX01VTFRJQ0FTVF9IT1NUX0ZXX01TR1NfTUlOLAorCQkgICAgIENGR19NVUxUSUNBU1RfSE9TVF9GV19NU0dTX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0NPTkNfU1lTVEVNX1BSRUYsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgc3RydWN0IGhkZF9jb25maWcsIGNvbmNfc3lzdGVtX3ByZWYsCisJCSAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgQ0ZHX0NPTkNfU1lTVEVNX1BSRUZfREVGQVVMVCwKKwkJICAgQ0ZHX0NPTkNfU1lTVEVNX1BSRUZfTUlOLAorCQkgICBDRkdfQ09OQ19TWVNURU1fUFJFRl9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19QT0xJQ1lfTU5HUl9FTkFCTEUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgcG9saWN5X21hbmFnZXJfZW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1BPTElDWV9NTkdSX0VOQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19QT0xJQ1lfTU5HUl9FTkFCTEVfTUlOLAorCQkgICAgIENGR19QT0xJQ1lfTU5HUl9FTkFCTEVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVFNPX0VOQUJMRURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCB0c29fZW5hYmxlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVFNPX0VOQUJMRURfREVGQVVMVCwKKwkJICAgICBDRkdfVFNPX0VOQUJMRURfTUlOLAorCQkgICAgIENGR19UU09fRU5BQkxFRF9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19MUk9fRU5BQkxFRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGxyb19lbmFibGUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19MUk9fRU5BQkxFRF9ERUZBVUxULAorCQkgICAgIENGR19MUk9fRU5BQkxFRF9NSU4sCisJCSAgICAgQ0ZHX0xST19FTkFCTEVEX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX0FDVElWRV9NT0RFX09GRkxPQUQsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgYWN0aXZlX21vZGVfb2ZmbG9hZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0FDVElWRV9NT0RFX09GRkxPQURfREVGQVVMVCwKKwkJICAgICBDRkdfQUNUSVZFX01PREVfT0ZGTE9BRF9NSU4sCisJCSAgICAgQ0ZHX0FDVElWRV9NT0RFX09GRkxPQURfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRklORV9USU1FX01FQVNfQ0FQQUJJTElUWSwgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorCQlzdHJ1Y3QgaGRkX2NvbmZpZywgZmluZV90aW1lX21lYXNfY2FwLAorCQlWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCUNGR19GSU5FX1RJTUVfTUVBU19DQVBBQklMSVRZX0RFRkFVTFQsCisJCUNGR19GSU5FX1RJTUVfTUVBU19DQVBBQklMSVRZX01JTiwKKwkJQ0ZHX0ZJTkVfVElNRV9NRUFTX0NBUEFCSUxJVFlfTUFYKSwKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorCVJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0ZBU1RQQVRILCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGZhc3RwYXRoX2VuYWJsZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VOQUJMRV9GQVNUUEFUSF9ERUZBVUxULAorCQkgICAgIENGR19FTkFCTEVfRkFTVFBBVEhfTUlOLAorCQkgICAgIENGR19FTkFCTEVfRkFTVFBBVEhfTUFYKSwKKyNlbmRpZgorCVJFR19WQVJJQUJMRShDRkdfTUFYX1NDQU5fQ09VTlRfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBtYXhfc2Nhbl9jb3VudCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX01BWF9TQ0FOX0NPVU5UX0RFRkFVTFQsCisJCSAgICAgQ0ZHX01BWF9TQ0FOX0NPVU5UX01JTiwKKwkJICAgICBDRkdfTUFYX1NDQU5fQ09VTlRfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRE9UMTFQX01PREVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBkb3QxMXBfbW9kZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0RPVDExUF9NT0RFX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0RPVDExUF9NT0RFX01JTiwKKwkJICAgICBDRkdfRE9UMTFQX01PREVfTUFYKSwKKworI2lmZGVmIEZFQVRVUkVfTkFQSQorCVJFR19WQVJJQUJMRShDRkdfTkFQSV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIG5hcGlfZW5hYmxlLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfTkFQSV9ERUZBVUxULAorCQkgICAgIENGR19OQVBJX01JTiwKKwkJICAgICBDRkdfTkFQSV9NQVgpLAorI2VuZGlmIC8qIEZFQVRVUkVfTkFQSSAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwlSRUdfVkFSSUFCTEUoQ0ZHX0VYVFNDQU5fUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBleHRzY2FuX3Bhc3NpdmVfbWF4X2Nobl90aW1lLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUU0NBTl9QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUU0NBTl9QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfTUlOLAorCQkgICAgIENGR19FWFRTQ0FOX1BBU1NJVkVfTUFYX0NIQU5ORUxfVElNRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FWFRTQ0FOX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9OQU1FLAorCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZXh0c2Nhbl9wYXNzaXZlX21pbl9jaG5fdGltZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VYVFNDQU5fUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VYVFNDQU5fUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX01JTiwKKwkJICAgICBDRkdfRVhUU0NBTl9QQVNTSVZFX01JTl9DSEFOTkVMX1RJTUVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRVhUU0NBTl9BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9OQU1FLAorCQkgICAgIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgZXh0c2Nhbl9hY3RpdmVfbWF4X2Nobl90aW1lLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfRVhUU0NBTl9BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9ERUZBVUxULAorCQkgICAgIENGR19FWFRTQ0FOX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX01JTiwKKwkJICAgICBDRkdfRVhUU0NBTl9BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19FWFRTQ0FOX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX05BTUUsCisJCSAgICAgV0xBTl9QQVJBTV9JbnRlZ2VyLAorCQkgICAgIHN0cnVjdCBoZGRfY29uZmlnLCBleHRzY2FuX2FjdGl2ZV9taW5fY2huX3RpbWUsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19FWFRTQ0FOX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0VYVFNDQU5fQUNUSVZFX01JTl9DSEFOTkVMX1RJTUVfTUlOLAorCQkgICAgIENGR19FWFRTQ0FOX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX01BWCksCisjZW5kaWYKKworCVJFR19WQVJJQUJMRShDRkdfQ0VfQ0xBU1NJRllfRU5BQkxFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgY2VfY2xhc3NpZnlfZW5hYmxlZCwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0NFX0NMQVNTSUZZX0VOQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19DRV9DTEFTU0lGWV9FTkFCTEVfTUlOLAorCQkgICAgIENGR19DRV9DTEFTU0lGWV9FTkFCTEVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfRFVBTF9NQUNfRkVBVFVSRV9ESVNBQkxFLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIGR1YWxfbWFjX2ZlYXR1cmVfZGlzYWJsZSwKKwkJICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisJCSAgICAgQ0ZHX0RVQUxfTUFDX0ZFQVRVUkVfRElTQUJMRV9ERUZBVUxULAorCQkgICAgIENGR19EVUFMX01BQ19GRUFUVVJFX0RJU0FCTEVfTUlOLAorCQkgICAgIENGR19EVUFMX01BQ19GRUFUVVJFX0RJU0FCTEVfTUFYKSwKKworCVJFR19WQVJJQUJMRShDRkdfVFhfQ0hBSU5fTUFTS19DQ0ssIFdMQU5fUEFSQU1fSW50ZWdlciwKKwkJICAgICBzdHJ1Y3QgaGRkX2NvbmZpZywgdHhfY2hhaW5fbWFza19jY2ssCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19UWF9DSEFJTl9NQVNLX0NDS19ERUZBVUxULAorCQkgICAgIENGR19UWF9DSEFJTl9NQVNLX0NDS19NSU4sCisJCSAgICAgQ0ZHX1RYX0NIQUlOX01BU0tfQ0NLX01BWCksCisKKwlSRUdfVkFSSUFCTEUoQ0ZHX1RYX0NIQUlOX01BU0tfMVNTLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIHR4X2NoYWluX21hc2tfMXNzLAorCQkgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKwkJICAgICBDRkdfVFhfQ0hBSU5fTUFTS18xU1NfREVGQVVMVCwKKwkJICAgICBDRkdfVFhfQ0hBSU5fTUFTS18xU1NfTUlOLAorCQkgICAgIENGR19UWF9DSEFJTl9NQVNLXzFTU19NQVgpLAorCisJUkVHX1ZBUklBQkxFKENGR19TRUxGX0dFTl9GUk1fUFdSLCBXTEFOX1BBUkFNX0ludGVnZXIsCisJCSAgICAgc3RydWN0IGhkZF9jb25maWcsIHNlbGZfZ2VuX2ZybV9wd3IsCisJCSAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorCQkgICAgIENGR19TRUxGX0dFTl9GUk1fUFdSX0RFRkFVTFQsCisJCSAgICAgQ0ZHX1NFTEZfR0VOX0ZSTV9QV1JfTUlOLAorCQkgICAgIENGR19TRUxGX0dFTl9GUk1fUFdSX01BWCksCisKK307CisKKworLyoqCisgKiBnZXRfbmV4dF9saW5lKCkgLSBmaW5kIGFuZCBsb2NhdGUgdGhlIG5ldyBsaW5lIHBvaW50ZXIKKyAqIEBzdHI6IHBvaW50ZXIgdG8gc3RyaW5nCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBvY2N1cmVuY2UKKyAqIG9mIGEgbmV3IGxpbmUgY2hhcmFjdGVyLiBJdCBhbHNvIG1vZGlmaWVzIHRoZSBvcmlnaW5hbCBzdHJpbmcgYnkgcmVwbGFjaW5nCisgKiB0aGUgJ1xuJyBjaGFyYWN0ZXIgd2l0aCB0aGUgbnVsbCBjaGFyYWN0ZXIuCisgKgorICogUmV0dXJuOiB0aGUgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGF0IG5ldyBsaW5lLAorICogICAgICAgICAgICBvciBOVUxMIGlmIG5vIG5ldyBsaW5lIGNoYXJhY3RlciB3YXMgZm91bmQKKyAqLworc3RhdGljIGNoYXIgKmdldF9uZXh0X2xpbmUoY2hhciAqc3RyKQoreworCWNoYXIgYzsKKworCWlmIChzdHIgPT0gTlVMTCB8fCAqc3RyID09ICdcMCcpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYyA9ICpzdHI7CisJd2hpbGUgKGMgIT0gJ1xuJyAmJiBjICE9ICdcMCcgJiYgYyAhPSAweGQpIHsKKwkJc3RyID0gc3RyICsgMTsKKwkJYyA9ICpzdHI7CisJfQorCisJaWYgKGMgPT0gJ1wwJykgeworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgeworCQkqc3RyID0gJ1wwJzsKKwkJcmV0dXJuIHN0ciArIDE7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKiBsb29rIGZvciBzcGFjZS4gQXNjaWkgdmFsdWVzIHRvIGxvb2sgYXJlCisgKiAweDA5ID09IGhvcml6b250YWwgdGFiCisgKiAweDBhID09IE5ld2xpbmUgKCJcbiIpCisgKiAweDBiID09IHZlcnRpY2FsIHRhYgorICogMHgwYyA9PSBOZXdwYWdlIG9yIGZlZWQgZm9ybS4KKyAqIDB4MGQgPT0gY2FycmlhZ2UgcmV0dXJuIChDUiBvciAiXHIiKQorICogTnVsbCAoJ1wwJykgc2hvdWxkIG5vdCBjb25zaWRlcmVkIGFzIHNwYWNlLgorICovCisjZGVmaW5lIGlfaXNzcGFjZShjaCkgICgoKGNoKSA+PSAweDA5ICYmIChjaCkgPD0gMHgwZCkgfHwgKGNoKSA9PSAnICcpCisKKy8qKgorICogaV90cmltKCkgLSB0cmltcyBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGUgc3BhY2VzCisgKiBAc3RyOiBwb2ludGVyIHRvIHN0cmluZworICoKKyAqIFJldHVybjogdGhlIHBvaW50ZXIgb2YgdGhlIHN0cmluZworICovCitzdGF0aWMgY2hhciAqaV90cmltKGNoYXIgKnN0cikKK3sKKwljaGFyICpwdHI7CisKKwlpZiAoKnN0ciA9PSAnXDAnKQorCQlyZXR1cm4gc3RyOworCisJLyogRmluZCB0aGUgZmlyc3Qgbm9uIHdoaXRlLXNwYWNlICovCisJcHRyID0gc3RyOworCXdoaWxlIChpX2lzc3BhY2UoKnB0cikpCisJCXB0cisrOworCisJaWYgKCpwdHIgPT0gJ1wwJykKKwkJcmV0dXJuIHN0cjsKKworCS8qIFRoaXMgaXMgdGhlIG5ldyBzdGFydCBvZiB0aGUgc3RyaW5nICovCisJc3RyID0gcHRyOworCisJLyogRmluZCB0aGUgbGFzdCBub24gd2hpdGUtc3BhY2UgKi8KKwlwdHIgKz0gc3RybGVuKHB0cikgLSAxOworCisJd2hpbGUgKHB0ciAhPSBzdHIgJiYgaV9pc3NwYWNlKCpwdHIpKQorCQlwdHItLTsKKworCS8qIE51bGwgdGVybWluYXRlIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyICovCisJcHRyWzFdID0gJ1wwJzsKKworCXJldHVybiBzdHI7Cit9CisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBjb25mZ2l1cmF0aW9uIG5hbWUgYW5kIHZhbHVlICovCisjZGVmaW5lIENGR19WQUxVRV9NQVhfTEVOIDI1NgorI2RlZmluZSBDRkdfRU5UUllfTUFYX0xFTiAoMzIrQ0ZHX1ZBTFVFX01BWF9MRU4pCisKKy8qKgorICogaGRkX2NmZ19nZXRfY29uZmlnKCkgLSBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gY29udGVudAorICogQHJlZ190YWJsZTogcG9pbnRlciB0byBjb25maWd1cmF0aW9uIHRhYmxlCisgKiBAY1JlZ1RhYmxlRW50cmllczogbnVtYmVyIG9mIHRoZSBjb25maWd1cmF0aW9uIGVudHJpZXMKKyAqIEBpbmlfc3RydWN0OiBwb2ludGVyIHRvIHRoZSBoZGQgY29uZmlnIGtub2IKKyAqIEBwSGRkQ3R4OiBwb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKiBAcEJ1ZjogYnVmZmVyIHRvIHN0b3JlIHRoZSBjb25maWd1cmF0aW9uCisgKiBAYnVmbGVuOiBzaXplIG9mIHRoZSBidWZmZXIKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgY29uZmlndXJhdGlvbiBhbmQgYnVmZmVyIHNpemUgY2FuIGNhcnJ5CisgKgkJdGhlIGNvbnRlbnQsIG90aGVyd2lzZSBDREZfU1RBVFVTX0VfUkVTT1VSQ0VTCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIGhkZF9jZmdfZ2V0X2NvbmZpZyhSRUdfVEFCTEVfRU5UUlkgKnJlZ190YWJsZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY1JlZ1RhYmxlRW50cmllcywKKwkJCQkgICAgIHVpbnQ4X3QgKmluaV9zdHJ1Y3QsCisJCQkJICAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCBjaGFyICpwQnVmLAorCQkJCSAgICAgaW50IGJ1ZmxlbikKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCVJFR19UQUJMRV9FTlRSWSAqcFJlZ0VudHJ5ID0gcmVnX3RhYmxlOworCXVpbnQzMl90IHZhbHVlOworCWNoYXIgdmFsdWVTdHJbQ0ZHX1ZBTFVFX01BWF9MRU5dOworCWNoYXIgY29uZmlnU3RyW0NGR19FTlRSWV9NQVhfTEVOXTsKKwljaGFyICpmbXQ7CisJdm9pZCAqcEZpZWxkOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgKnBNYWNBZGRyOworCWNoYXIgKnBDdXIgPSBwQnVmOworCWludCBjdXJsZW47CisKKwkvKiBzdGFydCB3aXRoIGFuIGVtcHR5IHN0cmluZyAqLworCSpwQ3VyID0gJ1wwJzsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgY1JlZ1RhYmxlRW50cmllczsgaWR4KyssIHBSZWdFbnRyeSsrKSB7CisJCXBGaWVsZCA9IGluaV9zdHJ1Y3QgKyBwUmVnRW50cnktPlZhck9mZnNldDsKKworCQlpZiAoKFdMQU5fUEFSQU1fSW50ZWdlciA9PSBwUmVnRW50cnktPlJlZ1R5cGUpIHx8CisJCSAgICAoV0xBTl9QQVJBTV9TaWduZWRJbnRlZ2VyID09IHBSZWdFbnRyeS0+UmVnVHlwZSkgfHwKKwkJICAgIChXTEFOX1BBUkFNX0hleEludGVnZXIgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlKSkgeworCQkJdmFsdWUgPSAwOworCQkJbWVtY3B5KCZ2YWx1ZSwgcEZpZWxkLCBwUmVnRW50cnktPlZhclNpemUpOworCQkJaWYgKFdMQU5fUEFSQU1fSGV4SW50ZWdlciA9PSBwUmVnRW50cnktPlJlZ1R5cGUpIHsKKwkJCQlmbXQgPSAiJXgiOworCQkJfSBlbHNlIGlmIChXTEFOX1BBUkFNX1NpZ25lZEludGVnZXIgPT0KKwkJCQkgICBwUmVnRW50cnktPlJlZ1R5cGUpIHsKKwkJCQlmbXQgPSAiJWQiOworCQkJfSBlbHNlIHsKKwkJCQlmbXQgPSAiJXUiOworCQkJfQorCQkJc25wcmludGYodmFsdWVTdHIsIENGR19WQUxVRV9NQVhfTEVOLCBmbXQsIHZhbHVlKTsKKwkJfSBlbHNlIGlmIChXTEFOX1BBUkFNX1N0cmluZyA9PSBwUmVnRW50cnktPlJlZ1R5cGUpIHsKKwkJCXNucHJpbnRmKHZhbHVlU3RyLCBDRkdfVkFMVUVfTUFYX0xFTiwgIiVzIiwKKwkJCQkgKGNoYXIgKilwRmllbGQpOworCQl9IGVsc2UgaWYgKFdMQU5fUEFSQU1fTWFjQWRkciA9PSBwUmVnRW50cnktPlJlZ1R5cGUpIHsKKwkJCXBNYWNBZGRyID0gKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgcEZpZWxkOworCQkJc25wcmludGYodmFsdWVTdHIsIENGR19WQUxVRV9NQVhfTEVOLAorCQkJCSAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCSBwTWFjQWRkci0+Ynl0ZXNbMF0sCisJCQkJIHBNYWNBZGRyLT5ieXRlc1sxXSwKKwkJCQkgcE1hY0FkZHItPmJ5dGVzWzJdLAorCQkJCSBwTWFjQWRkci0+Ynl0ZXNbM10sCisJCQkJIHBNYWNBZGRyLT5ieXRlc1s0XSwgcE1hY0FkZHItPmJ5dGVzWzVdKTsKKwkJfSBlbHNlIHsKKwkJCXNucHJpbnRmKHZhbHVlU3RyLCBDRkdfVkFMVUVfTUFYX0xFTiwgIih1bmhhbmRsZWQpIik7CisJCX0KKwkJY3VybGVuID0gc2NucHJpbnRmKGNvbmZpZ1N0ciwgQ0ZHX0VOVFJZX01BWF9MRU4sCisJCQkJICAgIiVzPVslc10lc1xuIiwKKwkJCQkgICBwUmVnRW50cnktPlJlZ05hbWUsCisJCQkJICAgdmFsdWVTdHIsCisJCQkJICAgdGVzdF9iaXQoaWR4LAorCQkJCQkgICAgKHZvaWQgKikmcEhkZEN0eC0+Y29uZmlnLT4KKwkJCQkJICAgIGJFeHBsaWNpdENmZykgPyAiKiIgOiAiIik7CisKKwkJLyogSWRlYWxseSB3ZSB3YW50IHRvIHJldHVybiB0aGUgY29uZmlnIHRvIHRoZSBhcHBsaWNhdGlvbiwKKwkJICogaG93ZXZlciB0aGUgY29uZmlnIGlzIHRvbyBiaWcgc28gd2UganVzdCBwcmludGsoKSBmb3Igbm93CisJCSAqLworI2lmZGVmIFJFVFVSTl9JTl9CVUZGRVIKKwkJaWYgKGN1cmxlbiA8PSBidWZsZW4pIHsKKwkJCS8qIGNvcHkgc3RyaW5nICsgJ1wwJyAqLworCQkJbWVtY3B5KHBDdXIsIGNvbmZpZ1N0ciwgY3VybGVuICsgMSk7CisKKwkJCS8qIGFjY291bnQgZm9yIGFkZGl0aW9uOyAqLworCQkJcEN1ciArPSBjdXJsZW47CisJCQlidWZsZW4gLT0gY3VybGVuOworCQl9IGVsc2UgeworCQkJLyogYnVmZmVyIHNwYWNlIGV4aGF1c3RlZCwgcmV0dXJuIHdoYXQgd2UgaGF2ZSAqLworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJCX0KKyNlbHNlCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgY29uZmlnU3RyKTsKKyNlbmRpZiAvKiBSRVRVUk5fSU5fQlVGRkVSICovCisKKwl9CisKKyNpZm5kZWYgUkVUVVJOX0lOX0JVRkZFUgorCS8qIG5vdGlmeSBhcHBsaWNhdGlvbiB0aGF0IG91dHB1dCBpcyBpbiBzeXN0ZW0gbG9nICovCisJc25wcmludGYocEN1ciwgYnVmbGVuLCAiV0xBTiBjb25maWd1cmF0aW9uIHdyaXR0ZW4gdG8gc3lzdGVtIGxvZyIpOworI2VuZGlmIC8qIFJFVFVSTl9JTl9CVUZGRVIgKi8KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKiBzdHJ1Y3QgdENmZ0luaUVudHJ5IC0gaW5pIGNvbmZpZ3VyYXRpb24gZW50cnkKKyAqCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgZW50cnkKKyAqIEB2YWx1ZTogdmFsdWUgb2YgdGhlIGVudHJ5CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyICpuYW1lOworCWNoYXIgKnZhbHVlOworfSB0Q2ZnSW5pRW50cnk7CisKKy8qKgorICogZmluZF9jZmdfaXRlbSgpIC0gZmluZCB0aGUgY29uZmlndXJhdGlvbiBpdGVtCisgKiBAaW5pVGFibGU6IHBvaW50ZXIgdG8gY29uZmlndXJhdGlvbiB0YWJsZQorICogQGVudHJpZXM6IG51bWJlciBmbyB0aGUgY29uZmlndXJhdGlvbiBlbnRyaWVzCisgKiBAbmFtZTogdGhlIGludGVyZXN0ZWQgY29uZmlndXJhdGlvbiB0byBmaW5kCisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byByZWFkIGJhY2sKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgaW50ZXJlc3RlZCBjb25maWd1cmF0aW9uIGlzIGZvdW5kLAorICoJCW90aGVyd2lzZSBDREZfU1RBVFVTX0VfRkFJTFVSRQorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBmaW5kX2NmZ19pdGVtKHRDZmdJbmlFbnRyeSAqaW5pVGFibGUsIHVuc2lnbmVkIGxvbmcgZW50cmllcywKKwkJCQljaGFyICpuYW1lLCBjaGFyICoqdmFsdWUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCWlmIChzdHJjbXAoaW5pVGFibGVbaV0ubmFtZSwgbmFtZSkgPT0gMCkgeworCQkJKnZhbHVlID0gaW5pVGFibGVbaV0udmFsdWU7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJICAiRm91bmQgJXMgZW50cnkgZm9yIE5hbWU9WyVzXSBWYWx1ZT1bJXNdICIsCisJCQkJICBXTEFOX0lOSV9GSUxFLCBuYW1lLCAqdmFsdWUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogcGFyc2VfaGV4X2RpZ2l0KCkgLSBjb252ZXJzaW9uIHRvIGhleCB2YWx1ZQorICogQGM6IHRoZSBjaGFyYWN0ZXIgdG8gY29udmVydAorICoKKyAqIFJldHVybjogdGhlIGhleCB2YWx1ZSwgb3RoZXJ3aXNlIDAKKyAqLworc3RhdGljIGludCBwYXJzZV9oZXhfZGlnaXQoY2hhciBjKQoreworCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKwkJcmV0dXJuIGMgLSAnMCc7CisJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCQlyZXR1cm4gYyAtICdhJyArIDEwOworCWlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwkJcmV0dXJuIGMgLSAnQScgKyAxMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHVwZGF0ZV9tYWNfZnJvbV9zdHJpbmcoKSAtIGNvbnZlcnQgc3RyaW5nIHRvIDYgYnl0ZXMgbWFjIGFkZHJlc3MKKyAqIEBwSGRkQ3R4OiB0aGUgcG9pbnRlciB0byBoZGQgY29udGV4dAorICogQG1hY1RhYmxlOiB0aGUgbWFjVGFibGUgdG8gY2FycnkgdGhlIGNvbnZlcnNpb24KKyAqIEBudW06IG51bWJlciBvZiB0aGUgaW50ZXJmYWNlCisgKgorICogMDBBQTAwQkIwMENDIC0+IDB4MDAgMHhBQSAweDAwIDB4QkIgMHgwMCAweENDCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9tYWNfZnJvbV9zdHJpbmcoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkgICB0Q2ZnSW5pRW50cnkgKm1hY1RhYmxlLCBpbnQgbnVtKQoreworCWludCBpID0gMCwgaiA9IDAsIHJlcyA9IDA7CisJY2hhciAqY2FuZGlkYXRlID0gTlVMTDsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIG1hY2FkZHJbQ0RGX01BWF9DT05DVVJSRU5DWV9QRVJTT05BXTsKKworCW1lbXNldChtYWNhZGRyLCAwLCBzaXplb2YobWFjYWRkcikpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWNhbmRpZGF0ZSA9IG1hY1RhYmxlW2ldLnZhbHVlOworCQlmb3IgKGogPSAwOyBqIDwgQ0RGX01BQ19BRERSX1NJWkU7IGorKykgeworCQkJcmVzID0KKwkJCQloZXgyYmluKCZtYWNhZGRyW2ldLmJ5dGVzW2pdLCAmY2FuZGlkYXRlWyhqIDw8IDEpXSwKKwkJCQkJMSk7CisJCQlpZiAocmVzIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAocmVzID09IDAgJiYgIWNkZl9pc19tYWNhZGRyX3plcm8oJm1hY2FkZHJbaV0pKSB7CisJCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBIZGRDdHgtPmNvbmZpZy0+CisJCQkJICAgICBpbnRmTWFjQWRkcltpXS5ieXRlc1swXSwKKwkJCQkgICAgICh1aW50OF90ICopICZtYWNhZGRyW2ldLmJ5dGVzWzBdLAorCQkJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCQl9CisJfQorfQorCisvKioKKyAqIGhkZF9hcHBseV9jZmdfaW5pKCkgLSBhcHBseSB0aGUgaW5pIGNvbmZpZ3VyYXRpb24gZmlsZQorICogQHBIZGRDdHg6IHRoZSBwb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKiBAaW5pVGFibGU6IHBvaW50ZXIgdG8gY29uZmlndXJhdGlvbiB0YWJsZQorICogQGVudHJpZXM6IG51bWJlciBmbyB0aGUgY29uZmlndXJhdGlvbiBlbnRyaWVzCisgKiBJdCBvdmVyd3JpdGVzIHRoZSBNQUMgYWRkcmVzcyBpZiBjb25maWcgZmlsZSBleGlzdC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgaW5pIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBjb3JyZWN0bHkgcGFyc2VkLAorICoJCW90aGVyd2lzZSBDREZfU1RBVFVTX0VfSU5WQUwKKyAqLworc3RhdGljIENERl9TVEFUVVMgaGRkX2FwcGx5X2NmZ19pbmkoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkgICAgdENmZ0luaUVudHJ5ICppbmlUYWJsZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBlbnRyaWVzKQoreworCUNERl9TVEFUVVMgbWF0Y2hfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJQ0RGX1NUQVRVUyByZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVuc2lnbmVkIGludCBpZHg7CisJdm9pZCAqcEZpZWxkOworCWNoYXIgKnZhbHVlX3N0ciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBsZW5fdmFsdWVfc3RyOworCWNoYXIgKmNhbmRpZGF0ZTsKKwl1aW50MzJfdCB2YWx1ZTsKKwlpbnQzMl90IHN2YWx1ZTsKKwl2b2lkICpwU3RydWN0QmFzZSA9IHBIZGRDdHgtPmNvbmZpZzsKKwlSRUdfVEFCTEVfRU5UUlkgKnBSZWdFbnRyeSA9IGdfcmVnaXN0cnlfdGFibGU7CisJdW5zaWduZWQgbG9uZyBjUmVnVGFibGVFbnRyaWVzID0gQ0RGX0FSUkFZX1NJWkUoZ19yZWdpc3RyeV90YWJsZSk7CisJdWludDMyX3QgY2JPdXRTdHJpbmc7CisJaW50IGk7CisJaW50IHJ2OworCisJLyogc2FuaXR5IHRlc3QgKi8KKwlpZiAoTUFYX0NGR19JTklfSVRFTVMgPCBjUmVnVGFibGVFbnRyaWVzKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIiVzOiBNQVhfQ0ZHX0lOSV9JVEVNUyB0b28gc21hbGwsIG11c3QgYmUgYXQgbGVhc3QgJWxkIiwKKwkJICAgICAgIF9fZnVuY19fLCBjUmVnVGFibGVFbnRyaWVzKTsKKwl9CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNSZWdUYWJsZUVudHJpZXM7IGlkeCsrLCBwUmVnRW50cnkrKykgeworCQkvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc3RpbmF0aW9uIGZpZWxkIGluIHRoZSBzdHJ1Y3R1cmUuICovCisJCXBGaWVsZCA9ICgodWludDhfdCAqKSBwU3RydWN0QmFzZSkgKyBwUmVnRW50cnktPlZhck9mZnNldDsKKworCQltYXRjaF9zdGF0dXMgPQorCQkJZmluZF9jZmdfaXRlbShpbmlUYWJsZSwgZW50cmllcywgcFJlZ0VudHJ5LT5SZWdOYW1lLAorCQkJCSAgICAgICZ2YWx1ZV9zdHIpOworCisJCWlmICgobWF0Y2hfc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJICAgICYmIChwUmVnRW50cnktPkZsYWdzICYgVkFSX0ZMQUdTX1JFUVVJUkVEKSkgeworCQkJLyogSWYgd2UgY291bGQgbm90IHJlYWQgdGhlIGNmZyBpdGVtIGFuZCBpdCBpcyByZXF1aXJlZCwgdGhpcyBpcyBhbiBlcnJvci4gKi8KKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICIlczogRmFpbGVkIHRvIHJlYWQgcmVxdWlyZWQgY29uZmlnIHBhcmFtZXRlciAlcyIsCisJCQkgICAgICAgX19mdW5jX18sIHBSZWdFbnRyeS0+UmVnTmFtZSk7CisJCQlyZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgoV0xBTl9QQVJBTV9JbnRlZ2VyID09IHBSZWdFbnRyeS0+UmVnVHlwZSkgfHwKKwkJICAgIChXTEFOX1BBUkFNX0hleEludGVnZXIgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlKSkgeworCQkJLyogSWYgc3VjY2Vzc2Z1bGx5IHJlYWQgZnJvbSB0aGUgcmVnaXN0cnksIHVzZSB0aGUgdmFsdWUgcmVhZC4KKwkJCSAqIElmIG5vdCwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlLgorCQkJICovCisJCQlpZiAobWF0Y2hfc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUworCQkJICAgICYmIChXTEFOX1BBUkFNX0ludGVnZXIgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlKSkgeworCQkJCXJ2ID0ga3N0cnRvdTMyKHZhbHVlX3N0ciwgMTAsICZ2YWx1ZSk7CisJCQkJaWYgKHJ2IDwgMCkgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgICIlczogUmVnIFBhcmFtZXRlciAlcyBpbnZhbGlkLiBFbmZvcmNpbmcgZGVmYXVsdCIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgcFJlZ0VudHJ5LT5SZWdOYW1lKTsKKwkJCQkJdmFsdWUgPSBwUmVnRW50cnktPlZhckRlZmF1bHQ7CisJCQkJfQorCQkJfSBlbHNlIGlmIChtYXRjaF9zdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTCisJCQkJICAgJiYgKFdMQU5fUEFSQU1fSGV4SW50ZWdlciA9PQorCQkJCSAgICAgICBwUmVnRW50cnktPlJlZ1R5cGUpKSB7CisJCQkJcnYgPSBrc3RydG91MzIodmFsdWVfc3RyLCAxNiwgJnZhbHVlKTsKKwkJCQlpZiAocnYgPCAwKSB7CisJCQkJCWhkZExvZyhMT0dFLAorCQkJCQkgICAgICAgIiVzOiBSZWcgcGFyYW10ZXIgJXMgaW52YWxpZC4gRW5mb3JjaW5nIGRlZmF1bHQiLAorCQkJCQkgICAgICAgX19mdW5jX18sIHBSZWdFbnRyeS0+UmVnTmFtZSk7CisJCQkJCXZhbHVlID0gcFJlZ0VudHJ5LT5WYXJEZWZhdWx0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdmFsdWUgPSBwUmVnRW50cnktPlZhckRlZmF1bHQ7CisJCQl9CisKKwkJCS8qIElmIHRoaXMgcGFyYW1ldGVyIG5lZWRzIHJhbmdlIGNoZWNraW5nLCBkbyBpdCBoZXJlLiAqLworCQkJaWYgKHBSZWdFbnRyeS0+RmxhZ3MgJiBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0spIHsKKwkJCQlpZiAodmFsdWUgPiBwUmVnRW50cnktPlZhck1heCkgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgICIlczogUmVnIFBhcmFtZXRlciAlcyA+IGFsbG93ZWQgTWF4aW11bSBbJXUgPiAlbHVdLiBFbmZvcmNpbmcgTWF4aW11bSIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgcFJlZ0VudHJ5LT5SZWdOYW1lLAorCQkJCQkgICAgICAgdmFsdWUsIHBSZWdFbnRyeS0+VmFyTWF4KTsKKwkJCQkJdmFsdWUgPSBwUmVnRW50cnktPlZhck1heDsKKwkJCQl9CisKKwkJCQlpZiAodmFsdWUgPCBwUmVnRW50cnktPlZhck1pbikgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgICIlczogUmVnIFBhcmFtZXRlciAlcyA8IGFsbG93ZWQgTWluaW11bSBbJXUgPCAlbHVdLiBFbmZvcmNpbmcgTWluaW11bSIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgcFJlZ0VudHJ5LT5SZWdOYW1lLAorCQkJCQkgICAgICAgdmFsdWUsIHBSZWdFbnRyeS0+VmFyTWluKTsKKwkJCQkJdmFsdWUgPSBwUmVnRW50cnktPlZhck1pbjsKKwkJCQl9CisJCQl9CisJCQkvKiBJZiB0aGlzIHBhcmFtZXRlciBuZWVkcyByYW5nZSBjaGVja2luZywgZG8gaXQgaGVyZS4gKi8KKwkJCWVsc2UgaWYgKHBSZWdFbnRyeS0+CisJCQkJIEZsYWdzICYgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxUKSB7CisJCQkJaWYgKHZhbHVlID4gcFJlZ0VudHJ5LT5WYXJNYXgpIHsKKwkJCQkJaGRkTG9nKExPR0UsCisJCQkJCSAgICAgICAiJXM6IFJlZyBQYXJhbWV0ZXIgJXMgPiBhbGxvd2VkIE1heGltdW0gWyV1ID4gJWx1XS4gRW5mb3JjaW5nIERlZmF1bHQ9ICVsdSIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgcFJlZ0VudHJ5LT5SZWdOYW1lLAorCQkJCQkgICAgICAgdmFsdWUsIHBSZWdFbnRyeS0+VmFyTWF4LAorCQkJCQkgICAgICAgcFJlZ0VudHJ5LT5WYXJEZWZhdWx0KTsKKwkJCQkJdmFsdWUgPSBwUmVnRW50cnktPlZhckRlZmF1bHQ7CisJCQkJfQorCisJCQkJaWYgKHZhbHVlIDwgcFJlZ0VudHJ5LT5WYXJNaW4pIHsKKwkJCQkJaGRkTG9nKExPR0UsCisJCQkJCSAgICAgICAiJXM6IFJlZyBQYXJhbWV0ZXIgJXMgPCBhbGxvd2VkIE1pbmltdW0gWyV1IDwgJWx1XS4gRW5mb3JjaW5nIERlZmF1bHQ9ICVsdSIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgcFJlZ0VudHJ5LT5SZWdOYW1lLAorCQkJCQkgICAgICAgdmFsdWUsIHBSZWdFbnRyeS0+VmFyTWluLAorCQkJCQkgICAgICAgcFJlZ0VudHJ5LT5WYXJEZWZhdWx0KTsKKwkJCQkJdmFsdWUgPSBwUmVnRW50cnktPlZhckRlZmF1bHQ7CisJCQkJfQorCQkJfQorCQkJLyogTW92ZSB0aGUgdmFyaWFibGUgaW50byB0aGUgb3V0cHV0IGZpZWxkLiAqLworCQkJbWVtY3B5KHBGaWVsZCwgJnZhbHVlLCBwUmVnRW50cnktPlZhclNpemUpOworCQl9IGVsc2UgaWYgKFdMQU5fUEFSQU1fU2lnbmVkSW50ZWdlciA9PSBwUmVnRW50cnktPlJlZ1R5cGUpIHsKKwkJCS8qIElmIHN1Y2Nlc3NmdWxseSByZWFkIGZyb20gdGhlIHJlZ2lzdHJ5LCB1c2UgdGhlIHZhbHVlIHJlYWQuCisJCQkgKiBJZiBub3QsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZS4KKwkJCSAqLworCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBtYXRjaF9zdGF0dXMpIHsKKwkJCQlydiA9IGtzdHJ0b3MzMih2YWx1ZV9zdHIsIDEwLCAmc3ZhbHVlKTsKKwkJCQlpZiAocnYgPCAwKSB7CisJCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJICAgICAgICIlczogUmVnIFBhcmFtZXRlciAlcyBpbnZhbGlkLiBFbmZvcmNpbmcgRGVmYXVsdCIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgcFJlZ0VudHJ5LT5SZWdOYW1lKTsKKwkJCQkJc3ZhbHVlID0KKwkJCQkJCShpbnQzMl90KSBwUmVnRW50cnktPlZhckRlZmF1bHQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzdmFsdWUgPSAoaW50MzJfdCkgcFJlZ0VudHJ5LT5WYXJEZWZhdWx0OworCQkJfQorCisJCQkvKiBJZiB0aGlzIHBhcmFtZXRlciBuZWVkcyByYW5nZSBjaGVja2luZywgZG8gaXQgaGVyZS4gKi8KKwkJCWlmIChwUmVnRW50cnktPkZsYWdzICYgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLKSB7CisJCQkJaWYgKHN2YWx1ZSA+IChpbnQzMl90KSBwUmVnRW50cnktPlZhck1heCkgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgICIlczogUmVnIFBhcmFtZXRlciAlcyA+IGFsbG93ZWQgTWF4aW11bSAiCisJCQkJCSAgICAgICAiWyVkID4gJWRdLiBFbmZvcmNpbmcgTWF4aW11bSIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgcFJlZ0VudHJ5LT5SZWdOYW1lLAorCQkJCQkgICAgICAgc3ZhbHVlLCAoaW50KXBSZWdFbnRyeS0+VmFyTWF4KTsKKwkJCQkJc3ZhbHVlID0gKGludDMyX3QpIHBSZWdFbnRyeS0+VmFyTWF4OworCQkJCX0KKworCQkJCWlmIChzdmFsdWUgPCAoaW50MzJfdCkgcFJlZ0VudHJ5LT5WYXJNaW4pIHsKKwkJCQkJaGRkTG9nKExPR0UsCisJCQkJCSAgICAgICAiJXM6IFJlZyBQYXJhbWV0ZXIgJXMgPCBhbGxvd2VkIE1pbmltdW0gIgorCQkJCQkgICAgICAgIlslZCA8ICVkXS4gRW5mb3JjaW5nIE1pbmltdW0iLAorCQkJCQkgICAgICAgX19mdW5jX18sIHBSZWdFbnRyeS0+UmVnTmFtZSwKKwkJCQkJICAgICAgIHN2YWx1ZSwgKGludClwUmVnRW50cnktPlZhck1pbik7CisJCQkJCXN2YWx1ZSA9IChpbnQzMl90KSBwUmVnRW50cnktPlZhck1pbjsKKwkJCQl9CisJCQl9CisJCQkvKiBJZiB0aGlzIHBhcmFtZXRlciBuZWVkcyByYW5nZSBjaGVja2luZywgZG8gaXQgaGVyZS4gKi8KKwkJCWVsc2UgaWYgKHBSZWdFbnRyeS0+CisJCQkJIEZsYWdzICYgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxUKSB7CisJCQkJaWYgKHN2YWx1ZSA+IChpbnQzMl90KSBwUmVnRW50cnktPlZhck1heCkgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgICIlczogUmVnIFBhcmFtZXRlciAlcyA+IGFsbG93ZWQgTWF4aW11bSAiCisJCQkJCSAgICAgICAiWyVkID4gJWRdLiBFbmZvcmNpbmcgRGVmYXVsdD0gJWQiLAorCQkJCQkgICAgICAgX19mdW5jX18sIHBSZWdFbnRyeS0+UmVnTmFtZSwKKwkJCQkJICAgICAgIHN2YWx1ZSwgKGludClwUmVnRW50cnktPlZhck1heCwKKwkJCQkJICAgICAgIChpbnQpcFJlZ0VudHJ5LT5WYXJEZWZhdWx0KTsKKwkJCQkJc3ZhbHVlID0KKwkJCQkJCShpbnQzMl90KSBwUmVnRW50cnktPlZhckRlZmF1bHQ7CisJCQkJfQorCisJCQkJaWYgKHN2YWx1ZSA8IChpbnQzMl90KSBwUmVnRW50cnktPlZhck1pbikgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgICIlczogUmVnIFBhcmFtZXRlciAlcyA8IGFsbG93ZWQgTWluaW11bSAiCisJCQkJCSAgICAgICAiWyVkIDwgJWRdLiBFbmZvcmNpbmcgRGVmYXVsdD0gJWQiLAorCQkJCQkgICAgICAgX19mdW5jX18sIHBSZWdFbnRyeS0+UmVnTmFtZSwKKwkJCQkJICAgICAgIHN2YWx1ZSwgKGludClwUmVnRW50cnktPlZhck1pbiwKKwkJCQkJICAgICAgIChpbnQpcFJlZ0VudHJ5LT5WYXJEZWZhdWx0KTsKKwkJCQkJc3ZhbHVlID0gcFJlZ0VudHJ5LT5WYXJEZWZhdWx0OworCQkJCX0KKwkJCX0KKwkJCS8qIE1vdmUgdGhlIHZhcmlhYmxlIGludG8gdGhlIG91dHB1dCBmaWVsZC4gKi8KKwkJCW1lbWNweShwRmllbGQsICZzdmFsdWUsIHBSZWdFbnRyeS0+VmFyU2l6ZSk7CisJCX0KKwkJLyogSGFuZGxlIHN0cmluZyBwYXJhbWV0ZXJzICovCisJCWVsc2UgaWYgKFdMQU5fUEFSQU1fU3RyaW5nID09IHBSZWdFbnRyeS0+UmVnVHlwZSkgeworI2lmZGVmIFdMQU5fQ0ZHX0RFQlVHCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJICAiUmVnTmFtZSA9ICVzLCBWYXJPZmZzZXQgJXUgVmFyU2l6ZSAldSBWYXJEZWZhdWx0ICVzIiwKKwkJCQkgIHBSZWdFbnRyeS0+UmVnTmFtZSwgcFJlZ0VudHJ5LT5WYXJPZmZzZXQsCisJCQkJICBwUmVnRW50cnktPlZhclNpemUsCisJCQkJICAoY2hhciAqKXBSZWdFbnRyeS0+VmFyRGVmYXVsdCk7CisjZW5kaWYKKworCQkJaWYgKG1hdGNoX3N0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlsZW5fdmFsdWVfc3RyID0gc3RybGVuKHZhbHVlX3N0cik7CisKKwkJCQlpZiAobGVuX3ZhbHVlX3N0ciA+IChwUmVnRW50cnktPlZhclNpemUgLSAxKSkgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgICIlczogSW52YWxpZCBWYWx1ZT1bJXNdIHNwZWNpZmllZCBmb3IgTmFtZT1bJXNdIGluICVzIiwKKwkJCQkJICAgICAgIF9fZnVuY19fLCB2YWx1ZV9zdHIsCisJCQkJCSAgICAgICBwUmVnRW50cnktPlJlZ05hbWUsCisJCQkJCSAgICAgICBXTEFOX0lOSV9GSUxFKTsKKwkJCQkJY2JPdXRTdHJpbmcgPQorCQkJCQkJdXRpbF9taW4oc3RybGVuCisJCQkJCQkJCSAoKGNoYXIgKilwUmVnRW50cnktPgorCQkJCQkJCQkgVmFyRGVmYXVsdCksCisJCQkJCQkJIHBSZWdFbnRyeS0+VmFyU2l6ZSAtIDEpOworCQkJCQltZW1jcHkocEZpZWxkLAorCQkJCQkgICAgICAgKHZvaWQgKikocFJlZ0VudHJ5LT5WYXJEZWZhdWx0KSwKKwkJCQkJICAgICAgIGNiT3V0U3RyaW5nKTsKKwkJCQkJKCh1aW50OF90ICopIHBGaWVsZClbY2JPdXRTdHJpbmddID0KKwkJCQkJCSdcMCc7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWVtY3B5KHBGaWVsZCwgKHZvaWQgKikodmFsdWVfc3RyKSwKKwkJCQkJICAgICAgIGxlbl92YWx1ZV9zdHIpOworCQkJCQkoKHVpbnQ4X3QgKikgcEZpZWxkKVtsZW5fdmFsdWVfc3RyXSA9CisJCQkJCQknXDAnOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogRmFpbGVkIHRvIHJlYWQgdGhlIHN0cmluZyBwYXJhbWV0ZXIgZnJvbSB0aGUgcmVnaXN0cnkuICBVc2UgdGhlIGRlZmF1bHQuICovCisJCQkJY2JPdXRTdHJpbmcgPQorCQkJCQl1dGlsX21pbihzdHJsZW4oKGNoYXIgKilwUmVnRW50cnktPlZhckRlZmF1bHQpLAorCQkJCQkJIHBSZWdFbnRyeS0+VmFyU2l6ZSAtIDEpOworCQkJCW1lbWNweShwRmllbGQsICh2b2lkICopKHBSZWdFbnRyeS0+VmFyRGVmYXVsdCksCisJCQkJICAgICAgIGNiT3V0U3RyaW5nKTsKKwkJCQkoKHVpbnQ4X3QgKikgcEZpZWxkKVtjYk91dFN0cmluZ10gPSAnXDAnOworCQkJfQorCQl9IGVsc2UgaWYgKFdMQU5fUEFSQU1fTWFjQWRkciA9PSBwUmVnRW50cnktPlJlZ1R5cGUpIHsKKwkJCWlmIChwUmVnRW50cnktPlZhclNpemUgIT0gQ0RGX01BQ19BRERSX1NJWkUpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgIiVzOiBJbnZhbGlkIFZhclNpemUgJXUgZm9yIE5hbWU9WyVzXSIsCisJCQkJICAgICAgIF9fZnVuY19fLCBwUmVnRW50cnktPlZhclNpemUsCisJCQkJICAgICAgIHBSZWdFbnRyeS0+UmVnTmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQljYW5kaWRhdGUgPSAoY2hhciAqKXBSZWdFbnRyeS0+VmFyRGVmYXVsdDsKKwkJCWlmIChtYXRjaF9zdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJbGVuX3ZhbHVlX3N0ciA9IHN0cmxlbih2YWx1ZV9zdHIpOworCQkJCWlmIChsZW5fdmFsdWVfc3RyICE9IChDREZfTUFDX0FERFJfU0laRSAqIDIpKSB7CisJCQkJCWhkZExvZyhMT0dFLAorCQkJCQkgICAgICAgIiVzOiBJbnZhbGlkIE1BQyBhZGRyIFslc10gc3BlY2lmaWVkIGZvciBOYW1lPVslc10gaW4gJXMiLAorCQkJCQkgICAgICAgX19mdW5jX18sIHZhbHVlX3N0ciwKKwkJCQkJICAgICAgIHBSZWdFbnRyeS0+UmVnTmFtZSwKKwkJCQkJICAgICAgIFdMQU5fSU5JX0ZJTEUpOworCQkJCX0gZWxzZQorCQkJCQljYW5kaWRhdGUgPSB2YWx1ZV9zdHI7CisJCQl9CisJCQkvKiBwYXJzZSB0aGUgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiB0aGUgYnl0ZSBhcnJheSAqLworCQkJZm9yIChpID0gMDsgaSA8IENERl9NQUNfQUREUl9TSVpFOyBpKyspIHsKKwkJCQkoKGNoYXIgKilwRmllbGQpW2ldID0KKwkJCQkJKGNoYXIpKHBhcnNlX2hleF9kaWdpdChjYW5kaWRhdGVbaSAqIDJdKSAqCisJCQkJCSAgICAgICAxNiArCisJCQkJCSAgICAgICBwYXJzZV9oZXhfZGlnaXQoY2FuZGlkYXRlW2kgKiAyICsgMV0pKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICIlczogVW5rbm93biBwYXJhbSB0eXBlIGZvciBuYW1lWyVzXSBpbiByZWdpc3RyeSB0YWJsZSIsCisJCQkgICAgICAgX19mdW5jX18sIHBSZWdFbnRyeS0+UmVnTmFtZSk7CisJCX0KKworCQkvKiBkaWQgd2Ugc3VjY2Vzc2Z1bGx5IHBhcnNlIGEgY2ZnIGl0ZW0gZm9yIHRoaXMgcGFyYW1ldGVyPyAqLworCQlpZiAoKG1hdGNoX3N0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpICYmCisJCSAgICAoaWR4IDwgTUFYX0NGR19JTklfSVRFTVMpKSB7CisJCQlzZXRfYml0KGlkeCwgKHZvaWQgKikmcEhkZEN0eC0+Y29uZmlnLT5iRXhwbGljaXRDZmcpOworCQl9CisJfQorCisJcmV0dXJuIHJldF9zdGF0dXM7Cit9CisKKy8qKgorICogaGRkX2V4ZWN1dGVfY29uZmlnX2NvbW1hbmQoKSAtIGV4ZWN1dGVzIGFuIGFyYml0cmFyeSBjb25maWd1cmF0aW9uIGNvbW1hbmQKKyAqIEByZWdfdGFibGU6IHRoZSBwb2ludGVyIHRvIGNvbmZpZ3VyYXRpb24gdGFibGUKKyAqIEB0YWJsZVNpemU6IHRoZSBzaXplIG9mIHRoZSBjb25maWd1cmF0aW9uIHRhYmxlCisgKiBAaW5pX3N0cnVjdDogcG9pbnRlciB0byB0aGUgaGRkIGNvbmZpZyBrbm9iCisgKiBAcEhkZEN0eDogdGhlIHBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqIEBjb21tYW5kOiB0aGUgY29tbWFuZCB0byBydW4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgY29tbWFuZCBpcyBmb3VuZCBhbmQgYWJsZSB0byBleGVjdXRlLAorICoJCW90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgQ0RGX1NUQVRVUyB3aWxsIGJlIHJldHVybmVkCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIGhkZF9leGVjdXRlX2NvbmZpZ19jb21tYW5kKFJFR19UQUJMRV9FTlRSWSAqcmVnX3RhYmxlLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdGFibGVTaXplLAorCQkJCQkgICAgIHVpbnQ4X3QgKmluaV9zdHJ1Y3QsCisJCQkJCSAgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJICAgICBjaGFyICpjb21tYW5kKQoreworCVJFR19UQUJMRV9FTlRSWSAqcFJlZ0VudHJ5OworCWNoYXIgKmNsb25lOworCWNoYXIgKnBDbWQ7CisJdm9pZCAqcEZpZWxkOworCWNoYXIgKm5hbWU7CisJY2hhciAqdmFsdWVfc3RyOworCXVpbnQzMl90IHZhbHVlOworCWludDMyX3Qgc3ZhbHVlOworCXNpemVfdCBsZW5fdmFsdWVfc3RyOworCXVuc2lnbmVkIGludCBpZHg7CisJdW5zaWduZWQgaW50IGk7CisJQ0RGX1NUQVRVUyB2c3RhdHVzOworCWludCBydjsKKworCS8qIGFzc3VtZSBmYWlsdXJlIHVudGlsIHByb3ZlbiBvdGhlcndpc2UgKi8KKwl2c3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkvKiBjbG9uZSB0aGUgY29tbWFuZCBzbyB0aGF0IHdlIGNhbiBtYW5pcHVsYXRlIGl0ICovCisJY2xvbmUgPSBrc3RyZHVwKGNvbW1hbmQsIEdGUF9BVE9NSUMpOworCWlmIChOVUxMID09IGNsb25lKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIiVzOiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLCB1bmFibGUgdG8gcHJvY2VzcyBbJXNdIiwKKwkJICAgICAgIF9fZnVuY19fLCBjb21tYW5kKTsKKwkJcmV0dXJuIHZzdGF0dXM7CisJfQorCS8qICdjbG9uZScgd2lsbCBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcgc28gaXQgY2FuIGJlIGZyZWVkCisJICogJ3BDbWQnIHdpbGwgYmUgdXNlZCB0byB3YWxrL3BhcnNlIHRoZSBjb21tYW5kCisJICovCisJcENtZCA9IGNsb25lOworCisJLyogZ2V0IHJpZCBvZiBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKwlwQ21kID0gaV90cmltKHBDbWQpOworCWlmICgnXDAnID09ICpwQ21kKSB7CisJCS8qIG9ubHkgd2hpdGVzcGFjZSAqLworCQloZGRMb2coTE9HRSwgIiVzOiBpbnZhbGlkIGNvbW1hbmQsIG9ubHkgd2hpdGVzcGFjZTpbJXNdIiwKKwkJICAgICAgIF9fZnVuY19fLCBjb21tYW5kKTsKKwkJZ290byBkb25lOworCX0KKwkvKiBwYXJzZSB0aGUgPG5hbWU+ID0gPHZhbHVlPiAqLworCW5hbWUgPSBwQ21kOworCXdoaWxlICgoJz0nICE9ICpwQ21kKSAmJiAoJ1wwJyAhPSAqcENtZCkpIHsKKwkJcENtZCsrOworCX0KKwlpZiAoJ1wwJyA9PSAqcENtZCkgeworCQkvKiBkaWQgbm90IGZpbmQgJz0nICovCisJCWhkZExvZyhMT0dFLCAiJXM6IGludmFsaWQgY29tbWFuZCwgbm8gJz0nOlslc10iLAorCQkgICAgICAgX19mdW5jX18sIGNvbW1hbmQpOworCQlnb3RvIGRvbmU7CisJfQorCS8qIHJlcGxhY2UgJz0nIHdpdGggTlVMIHRvIHRlcm1pbmF0ZSB0aGUgPG5hbWU+ICovCisJKnBDbWQrKyA9ICdcMCc7CisJbmFtZSA9IGlfdHJpbShuYW1lKTsKKwlpZiAoJ1wwJyA9PSAqbmFtZSkgeworCQkvKiBkaWQgbm90IGZpbmQgYSBuYW1lICovCisJCWhkZExvZyhMT0dFLCAiJXM6IGludmFsaWQgY29tbWFuZCwgbm8gPG5hbWU+Olslc10iLAorCQkgICAgICAgX19mdW5jX18sIGNvbW1hbmQpOworCQlnb3RvIGRvbmU7CisJfQorCisJdmFsdWVfc3RyID0gaV90cmltKHBDbWQpOworCWlmICgnXDAnID09ICp2YWx1ZV9zdHIpIHsKKwkJLyogZGlkIG5vdCBmaW5kIGEgdmFsdWUgKi8KKwkJaGRkTG9nKExPR0UsICIlczogaW52YWxpZCBjb21tYW5kLCBubyA8dmFsdWU+Olslc10iLAorCQkgICAgICAgX19mdW5jX18sIGNvbW1hbmQpOworCQlnb3RvIGRvbmU7CisJfQorCS8qIGxvb2t1cCB0aGUgY29uZmlndXJhdGlvbiBpdGVtICovCisJZm9yIChpZHggPSAwOyBpZHggPCB0YWJsZVNpemU7IGlkeCsrKSB7CisJCWlmICgwID09IHN0cmNtcChuYW1lLCByZWdfdGFibGVbaWR4XS5SZWdOYW1lKSkgeworCQkJLyogZm91bmQgYSBtYXRjaCAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHRhYmxlU2l6ZSA9PSBpZHgpIHsKKwkJLyogZGlkIG5vdCBtYXRjaCB0aGUgbmFtZSAqLworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICIlczogaW52YWxpZCBjb21tYW5kLCB1bmtub3duIGNvbmZpZ3VyYXRpb24gaXRlbTpbJXNdIiwKKwkJICAgICAgIF9fZnVuY19fLCBjb21tYW5kKTsKKwkJZ290byBkb25lOworCX0KKworCXBSZWdFbnRyeSA9ICZyZWdfdGFibGVbaWR4XTsKKwlpZiAoIShwUmVnRW50cnktPkZsYWdzICYgVkFSX0ZMQUdTX0RZTkFNSUNfQ0ZHKSkgeworCQkvKiBkb2VzIG5vdCBzdXBwb3J0IGR5bmFtaWMgY29uZmlndXJhdGlvbiAqLworCQloZGRMb2coTE9HRSwgIiVzOiBHbG9iYWxfUmVnaXN0cnlfVGFibGUuJXMgZG9lcyBub3Qgc3VwcG9ydCAiCisJCSAgICAgICAiZHluYW1pYyBjb25maWd1cmF0aW9uIiwgX19mdW5jX18sIG5hbWUpOworCQl2c3RhdHVzID0gQ0RGX1NUQVRVU19FX1BFUk07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlwRmllbGQgPSBpbmlfc3RydWN0ICsgcFJlZ0VudHJ5LT5WYXJPZmZzZXQ7CisKKwlzd2l0Y2ggKHBSZWdFbnRyeS0+UmVnVHlwZSkgeworCWNhc2UgV0xBTl9QQVJBTV9JbnRlZ2VyOgorCQlydiA9IGtzdHJ0b3UzMih2YWx1ZV9zdHIsIDEwLCAmdmFsdWUpOworCQlpZiAocnYgPCAwKQorCQkJZ290byBkb25lOworCQlpZiAodmFsdWUgPCBwUmVnRW50cnktPlZhck1pbikgeworCQkJLyogb3V0IG9mIHJhbmdlICovCisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICAiJXM6IGludmFsaWQgY29tbWFuZCwgdmFsdWUgJXUgPCBtaW4gdmFsdWUgJWx1IiwKKwkJCSAgICAgICBfX2Z1bmNfXywgdmFsdWUsIHBSZWdFbnRyeS0+VmFyTWluKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlpZiAodmFsdWUgPiBwUmVnRW50cnktPlZhck1heCkgeworCQkJLyogb3V0IG9mIHJhbmdlICovCisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICAiJXM6IGludmFsaWQgY29tbWFuZCwgdmFsdWUgJXUgPiBtYXggdmFsdWUgJWx1IiwKKwkJCSAgICAgICBfX2Z1bmNfXywgdmFsdWUsIHBSZWdFbnRyeS0+VmFyTWF4KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQltZW1jcHkocEZpZWxkLCAmdmFsdWUsIHBSZWdFbnRyeS0+VmFyU2l6ZSk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX1BBUkFNX0hleEludGVnZXI6CisJCXJ2ID0ga3N0cnRvdTMyKHZhbHVlX3N0ciwgMTYsICZ2YWx1ZSk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGRvbmU7CisJCWlmICh2YWx1ZSA8IHBSZWdFbnRyeS0+VmFyTWluKSB7CisJCQkvKiBvdXQgb2YgcmFuZ2UgKi8KKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICIlczogaW52YWxpZCBjb21tYW5kLCB2YWx1ZSAleCA8IG1pbiB2YWx1ZSAlbHgiLAorCQkJICAgICAgIF9fZnVuY19fLCB2YWx1ZSwgcFJlZ0VudHJ5LT5WYXJNaW4pOworCQkJZ290byBkb25lOworCQl9CisJCWlmICh2YWx1ZSA+IHBSZWdFbnRyeS0+VmFyTWF4KSB7CisJCQkvKiBvdXQgb2YgcmFuZ2UgKi8KKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICIlczogaW52YWxpZCBjb21tYW5kLCB2YWx1ZSAleCA+IG1heCB2YWx1ZSAlbHgiLAorCQkJICAgICAgIF9fZnVuY19fLCB2YWx1ZSwgcFJlZ0VudHJ5LT5WYXJNYXgpOworCQkJZ290byBkb25lOworCQl9CisJCW1lbWNweShwRmllbGQsICZ2YWx1ZSwgcFJlZ0VudHJ5LT5WYXJTaXplKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fUEFSQU1fU2lnbmVkSW50ZWdlcjoKKwkJcnYgPSBrc3RydG9zMzIodmFsdWVfc3RyLCAxMCwgJnN2YWx1ZSk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGRvbmU7CisJCWlmIChzdmFsdWUgPCAoaW50MzJfdCkgcFJlZ0VudHJ5LT5WYXJNaW4pIHsKKwkJCS8qIG91dCBvZiByYW5nZSAqLworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIiVzOiBpbnZhbGlkIGNvbW1hbmQsIHZhbHVlICVkIDwgbWluIHZhbHVlICVkIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgc3ZhbHVlLCAoaW50KXBSZWdFbnRyeS0+VmFyTWluKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlpZiAoc3ZhbHVlID4gKGludDMyX3QpIHBSZWdFbnRyeS0+VmFyTWF4KSB7CisJCQkvKiBvdXQgb2YgcmFuZ2UgKi8KKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICIlczogaW52YWxpZCBjb21tYW5kLCB2YWx1ZSAlZCA+IG1heCB2YWx1ZSAlZCIsCisJCQkgICAgICAgX19mdW5jX18sIHN2YWx1ZSwgKGludClwUmVnRW50cnktPlZhck1heCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJbWVtY3B5KHBGaWVsZCwgJnN2YWx1ZSwgcFJlZ0VudHJ5LT5WYXJTaXplKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fUEFSQU1fU3RyaW5nOgorCQlsZW5fdmFsdWVfc3RyID0gc3RybGVuKHZhbHVlX3N0cik7CisJCWlmIChsZW5fdmFsdWVfc3RyID4gKHBSZWdFbnRyeS0+VmFyU2l6ZSAtIDEpKSB7CisJCQkvKiB0b28gYmlnICovCisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICAiJXM6IGludmFsaWQgY29tbWFuZCwgc3RyaW5nIFslc10gbGVuZ3RoICIKKwkJCSAgICAgICAiJXp1IGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggJXUiLAorCQkJICAgICAgIF9fZnVuY19fLCB2YWx1ZV9zdHIsCisJCQkgICAgICAgbGVuX3ZhbHVlX3N0ciwgKHBSZWdFbnRyeS0+VmFyU2l6ZSAtIDEpKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQkvKiBjb3B5IHN0cmluZyBwbHVzIE5VTCAqLworCQltZW1jcHkocEZpZWxkLCB2YWx1ZV9zdHIsIChsZW5fdmFsdWVfc3RyICsgMSkpOworCQlicmVhazsKKworCWNhc2UgV0xBTl9QQVJBTV9NYWNBZGRyOgorCQlsZW5fdmFsdWVfc3RyID0gc3RybGVuKHZhbHVlX3N0cik7CisJCWlmIChsZW5fdmFsdWVfc3RyICE9IChDREZfTUFDX0FERFJfU0laRSAqIDIpKSB7CisJCQkvKiBvdXQgb2YgcmFuZ2UgKi8KKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICIlczogaW52YWxpZCBjb21tYW5kLCBNQUMgYWRkcmVzcyBbJXNdIGxlbmd0aCAiCisJCQkgICAgICAgIiV6dSBpcyBub3QgZXhwZWN0ZWQgbGVuZ3RoICV1IiwKKwkJCSAgICAgICBfX2Z1bmNfXywgdmFsdWVfc3RyLAorCQkJICAgICAgIGxlbl92YWx1ZV9zdHIsIChDREZfTUFDX0FERFJfU0laRSAqIDIpKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQkvKiBwYXJzZSB0aGUgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiB0aGUgYnl0ZSBhcnJheSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQ0RGX01BQ19BRERSX1NJWkU7IGkrKykgeworCQkJKChjaGFyICopcEZpZWxkKVtpXSA9IChjaGFyKQorCQkJCQkgICAgICAoKHBhcnNlX2hleF9kaWdpdCh2YWx1ZV9zdHJbKGkgKiAyKV0pICogMTYpICsKKwkJCQkJICAgICAgIHBhcnNlX2hleF9kaWdpdCh2YWx1ZV9zdHJbKGkgKiAyKSArIDFdKSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlnb3RvIGRvbmU7CisJfQorCisJLyogaWYgd2UgZ2V0IGhlcmUsIHdlIGhhZCBhIHN1Y2Nlc3NmdWwgbW9kaWZpY2F0aW9uICovCisJdnN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCS8qIGNvbmZpZyB0YWJsZSBoYXMgYmVlbiBtb2RpZmllZCwgaXMgdGhlcmUgYSBub3RpZmllcj8gKi8KKwlpZiAoTlVMTCAhPSBwUmVnRW50cnktPnBmbkR5bmFtaWNub3RpZnkpIHsKKwkJKHBSZWdFbnRyeS0+cGZuRHluYW1pY25vdGlmeSkocEhkZEN0eCwgcFJlZ0VudHJ5LT5ub3RpZnlJZCk7CisJfQorCS8qIG5vdGUgdGhhdCB0aGlzIGl0ZW0gd2FzIGV4cGxpY2l0bHkgY29uZmlndXJlZCAqLworCWlmIChpZHggPCBNQVhfQ0ZHX0lOSV9JVEVNUykgeworCQlzZXRfYml0KGlkeCwgKHZvaWQgKikmcEhkZEN0eC0+Y29uZmlnLT5iRXhwbGljaXRDZmcpOworCX0KK2RvbmU6CisJa2ZyZWUoY2xvbmUpOworCXJldHVybiB2c3RhdHVzOworfQorCisvKioKKyAqIGhkZF9zZXRfcG93ZXJfc2F2ZV9vZmZsb2FkX2NvbmZpZygpIC0gc2V0IHBvd2VyIHNhdmUgb2ZmbG9hZCBjb25maWd1cmF0aW9uCisgKiBAcEhkZEN0eDogdGhlIHBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX3NldF9wb3dlcl9zYXZlX29mZmxvYWRfY29uZmlnKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisJc3RydWN0IGhkZF9jb25maWcgKnBDb25maWcgPSBwSGRkQ3R4LT5jb25maWc7CisJdWludDMyX3QgbGlzdGVuSW50ZXJ2YWwgPSAwOworCisJaWYgKHN0cmNtcChwQ29uZmlnLT5Qb3dlclVzYWdlQ29udHJvbCwgIk1pbiIpID09IDApIHsKKwkJbGlzdGVuSW50ZXJ2YWwgPSBwQ29uZmlnLT5uQm1wc01pbkxpc3RlbkludGVydmFsOworCX0gZWxzZSBpZiAoc3RyY21wKHBDb25maWctPlBvd2VyVXNhZ2VDb250cm9sLCAiTWF4IikgPT0gMCkgeworCQlsaXN0ZW5JbnRlcnZhbCA9IHBDb25maWctPm5CbXBzTWF4TGlzdGVuSW50ZXJ2YWw7CisJfSBlbHNlIGlmIChzdHJjbXAocENvbmZpZy0+UG93ZXJVc2FnZUNvbnRyb2wsICJNb2QiKSA9PSAwKSB7CisJCWxpc3RlbkludGVydmFsID0gcENvbmZpZy0+bkJtcHNNb2RMaXN0ZW5JbnRlcnZhbDsKKwl9CisKKwkvKgorCSAqIEJhc2VkIG9uIE1vZGUgU2V0IHRoZSBMSQorCSAqIE90aGVyd2lzZSBkZWZhdWx0IExJIHZhbHVlIG9mIDEgd2lsbAorCSAqIGJlIHRha2VuCisJICovCisJaWYgKGxpc3RlbkludGVydmFsKSB7CisJCS8qCisJCSAqIHNldGNmZyBmb3IgbGlzdGVuSW50ZXJ2YWwuCisJCSAqIE1ha2Ugc3VyZSBDRkcgaXMgdXBkYXRlZCBiZWNhdXNlIFBFIHJlYWRzIHRoaXMKKwkJICogZnJvbSBDRkcgYXQgdGhlIHRpbWUgb2YgYXNzb2Mgb3IgcmVhc3NvYworCQkgKi8KKwkJc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMLAorCQkJCWxpc3RlbkludGVydmFsKTsKKwl9CisKK30KKworLyoqCisgKiBoZGRfY2ZnX3ByaW50KCkgLSBwcmludCB0aGUgaGRkIGNvbmZpZ3VyYXRpb24KKyAqIEBpbmlUYWJsZTogcG9pbnRlciB0byBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGhkZF9jZmdfcHJpbnQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKwlpbnQgaTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiKioqKioqKioqQ29uZmlnIHZhbHVlcyBpbiBIREQgQWRhcHRlcioqKioqKioiKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbUlRTVGhyZXNob2xkXSBWYWx1ZSA9ICV1IiwKKwkJICBwSGRkQ3R4LT5jb25maWctPlJUU1RocmVzaG9sZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW09wZXJhdGluZ0NoYW5uZWxdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5PcGVyYXRpbmdDaGFubmVsKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbUG93ZXJVc2FnZUNvbnRyb2xdIFZhbHVlID0gWyVzXSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5Qb3dlclVzYWdlQ29udHJvbCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2ZJc0ltcHNFbmFibGVkXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZklzSW1wc0VuYWJsZWQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtuVmNjUnNzaVRyaWdnZXJdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5uVmNjUnNzaVRyaWdnZXIpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnSWJzc0Jzc2lkXSBWYWx1ZSA9WyIgTUFDX0FERFJFU1NfU1RSICJdIiwKKwkJICBNQUNfQUREUl9BUlJBWShwSGRkQ3R4LT5jb25maWctPklic3NCc3NpZC5ieXRlcykpOworCisJZm9yIChpID0gMDsgaSA8IENERl9NQVhfQ09OQ1VSUkVOQ1lfUEVSU09OQTsgaSsrKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIk5hbWUgPSBbSW50ZiVkTWFjQWRkcmVzc10gVmFsdWUgPVsiIE1BQ19BRERSRVNTX1NUUiAiXSIsCisJCQkgIGksIE1BQ19BRERSX0FSUkFZKHBIZGRDdHgtPmNvbmZpZy0+aW50Zk1hY0FkZHJbaV0uYnl0ZXMpKTsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0FwRW5hYmxlVWFwc2RdIHZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5hcFVhcHNkRW5hYmxlZCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0VuYWJsZUFwUHJvdF0gdmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmFwUHJvdEVuYWJsZWQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnQVBBdXRvU2h1dE9mZl0gVmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5BUEF1dG9TaHV0T2ZmKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ1dsYW5NY2NUb1NjY1N3aXRjaE1vZGVdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5XbGFuTWNjVG9TY2NTd2l0Y2hNb2RlKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dXbGFuQXV0b1NodXRkb3duXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+V2xhbkF1dG9TaHV0ZG93bik7CisjZW5kaWYKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0VuYWJsZUxpc3Rlbk1vZGVdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5uRW5hYmxlTGlzdGVuTW9kZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dBcFByb3RlY3Rpb25dIHZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5hcFByb3RlY3Rpb24pOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnRW5hYmxlQXBPQlNTUHJvdF0gdmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmFwT0JTU1Byb3RFbmFibGVkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSJOYW1lID0gWyVzXSB2YWx1ZSA9IFsldV0iLCBDRkdfRk9SQ0VfU0FQX0FDUywKKwkJcEhkZEN0eC0+Y29uZmlnLT5mb3JjZV9zYXBfYWNzKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSJOYW1lID0gWyVzXSB2YWx1ZSA9IFsldV0iLCBDRkdfRk9SQ0VfU0FQX0FDU19TVEFSVF9DSCwKKwkJcEhkZEN0eC0+Y29uZmlnLT5mb3JjZV9zYXBfYWNzX3N0X2NoKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSJOYW1lID0gWyVzXSB2YWx1ZSA9IFsldV0iLCBDRkdfRk9SQ0VfU0FQX0FDU19FTkRfQ0gsCisJCXBIZGRDdHgtPmNvbmZpZy0+Zm9yY2Vfc2FwX2Fjc19lbmRfY2gpOworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW3NhcF9jaGFubmVsX2F2b2lkYW5jZV0gdmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPnNhcF9jaGFubmVsX2F2b2lkYW5jZSk7CisjZW5kaWYgLyogRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkiTmFtZSA9IFslc10gdmFsdWUgPSBbJXVdIiwgQ0ZHX1NBUF9QMlBfMTFBQ19PVkVSUklERV9OQU1FLAorCQkJCXBIZGRDdHgtPmNvbmZpZy0+c2FwX3AycF8xMWFjX292ZXJyaWRlKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbQ2hhbm5lbEJvbmRpbmdNb2RlXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+bkNoYW5uZWxCb25kaW5nTW9kZTI0R0h6KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbQ2hhbm5lbEJvbmRpbmdNb2RlXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+bkNoYW5uZWxCb25kaW5nTW9kZTVHSHopOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtkb3QxMU1vZGVdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5kb3QxMU1vZGUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtXbW1Nb2RlXSBWYWx1ZSA9IFsldV0gIiwgcEhkZEN0eC0+Y29uZmlnLT5XbW1Nb2RlKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbVWFwc2RNYXNrXSBWYWx1ZSA9IFsweCV4XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+VWFwc2RNYXNrKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbUGt0Q2xhc3NpZmljYXRpb25CYXNpc10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5Qa3RDbGFzc2lmaWNhdGlvbkJhc2lzKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbSW1wbGljaXRRb3NJc0VuYWJsZWRdIFZhbHVlID0gWyV1XSIsCisJCSAgKGludClwSGRkQ3R4LT5jb25maWctPmJJbXBsaWNpdFFvc0VuYWJsZWQpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhVWFwc2RWb1NydkludHZdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFVYXBzZFZvU3J2SW50dik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhVWFwc2RWb1N1c3BJbnR2XSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RWb1N1c3BJbnR2KTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtJbmZyYVVhcHNkVmlTcnZJbnR2XSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RWaVNydkludHYpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtJbmZyYVVhcHNkVmlTdXNwSW50dl0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5JbmZyYVVhcHNkVmlTdXNwSW50dik7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbSW5mcmFVYXBzZEJlU3J2SW50dl0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5JbmZyYVVhcHNkQmVTcnZJbnR2KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbSW5mcmFVYXBzZEJlU3VzcEludHZdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFVYXBzZEJlU3VzcEludHYpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhVWFwc2RCa1NydkludHZdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFVYXBzZEJrU3J2SW50dik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhVWFwc2RCa1N1c3BJbnR2XSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RCa1N1c3BJbnR2KTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhSW5hY3Rpdml0eUludGVydmFsXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhSW5hY3Rpdml0eUludGVydmFsKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbRXNlRW5hYmxlZF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5pc0VzZUluaUZlYXR1cmVFbmFibGVkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbRmFzdFRyYW5zaXRpb25FbmFibGVkXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmlzRmFzdFRyYW5zaXRpb25FbmFibGVkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ1R4UG93ZXJDYXBdIFZhbHVlID0gWyV1XSBkQm0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5UeFBvd2VyQ2FwKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbRmFzdFJvYW1FbmFibGVkXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW01BV0NFbmFibGVkXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPk1BV0NFbmFibGVkKTsKKyNlbmRpZgorI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtSb2FtUnNzaURpZmZdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+Um9hbVJzc2lEaWZmKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbaXNXRVNNb2RlRW5hYmxlZF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5pc1dFU01vZGVFbmFibGVkKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9PS0MKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbT2tjRW5hYmxlZF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5pc09rY0luaUZlYXR1cmVFbmFibGVkKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtjb25maWdQTk9TY2FuU3VwcG9ydF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5jb25maWdQTk9TY2FuU3VwcG9ydCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2NvbmZpZ1BOT1NjYW5UaW1lclJlcGVhdFZhbHVlXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmNvbmZpZ1BOT1NjYW5UaW1lclJlcGVhdFZhbHVlKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2ZFbmFibGVURExTU3VwcG9ydF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU1N1cHBvcnQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtmRW5hYmxlVERMU0ltcGxpY2l0VHJpZ2dlcl0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU0ltcGxpY2l0VHJpZ2dlcik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2ZURExTRXh0ZXJuYWxDb250cm9sXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmZURExTRXh0ZXJuYWxDb250cm9sKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZlRETFNVYXBzZE1hc2tdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZlRETFNVYXBzZE1hc2spOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtmRW5hYmxlVERMU0J1ZmZlclN0YV0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU0J1ZmZlclN0YSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2ZFbmFibGVURExTV21tTW9kZV0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU1dtbU1vZGUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtlbmFibGVfdGRsc19zY2FuXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlX3RkbHNfc2Nhbik7CisjZW5kaWYKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbSW5mcmFEaXJBY1ZvXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhRGlyQWNWbyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhTm9tTXNkdVNpemVBY1ZvXSBWYWx1ZSA9IFsweCV4XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFOb21Nc2R1U2l6ZUFjVm8pOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtJbmZyYU1lYW5EYXRhUmF0ZUFjVm9dIFZhbHVlID0gWzB4JXhdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5JbmZyYU1lYW5EYXRhUmF0ZUFjVm8pOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtJbmZyYU1pblBoeVJhdGVBY1ZvXSBWYWx1ZSA9IFsweCV4XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFNaW5QaHlSYXRlQWNWbyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhU2JhQWNWb10gVmFsdWUgPSBbMHgleF0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhU2JhQWNWbyk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbSW5mcmFEaXJBY1ZpXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhRGlyQWNWaSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhTm9tTXNkdVNpemVBY1ZpXSBWYWx1ZSA9IFsweCV4XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFOb21Nc2R1U2l6ZUFjVmkpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtJbmZyYU1lYW5EYXRhUmF0ZUFjVmldIFZhbHVlID0gWzB4JXhdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5JbmZyYU1lYW5EYXRhUmF0ZUFjVmkpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtJbmZyYU1pblBoeVJhdGVBY1ZpXSBWYWx1ZSA9IFsweCV4XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFNaW5QaHlSYXRlQWNWaSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhU2JhQWNWaV0gVmFsdWUgPSBbMHgleF0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhU2JhQWNWaSk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbSW5mcmFEaXJBY0JlXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhRGlyQWNCZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhTm9tTXNkdVNpemVBY0JlXSBWYWx1ZSA9IFsweCV4XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFOb21Nc2R1U2l6ZUFjQmUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtJbmZyYU1lYW5EYXRhUmF0ZUFjQmVdIFZhbHVlID0gWzB4JXhdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5JbmZyYU1lYW5EYXRhUmF0ZUFjQmUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtJbmZyYU1pblBoeVJhdGVBY0JlXSBWYWx1ZSA9IFsweCV4XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFNaW5QaHlSYXRlQWNCZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhU2JhQWNCZV0gVmFsdWUgPSBbMHgleF0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhU2JhQWNCZSk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbSW5mcmFEaXJBY0JrXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhRGlyQWNCayk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhTm9tTXNkdVNpemVBY0JrXSBWYWx1ZSA9IFsweCV4XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFOb21Nc2R1U2l6ZUFjQmspOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtJbmZyYU1lYW5EYXRhUmF0ZUFjQmtdIFZhbHVlID0gWzB4JXhdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5JbmZyYU1lYW5EYXRhUmF0ZUFjQmspOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtJbmZyYU1pblBoeVJhdGVBY0JrXSBWYWx1ZSA9IFsweCV4XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SW5mcmFNaW5QaHlSYXRlQWNCayk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0luZnJhU2JhQWNCa10gVmFsdWUgPSBbMHgleF0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkluZnJhU2JhQWNCayk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbRGVsYXllZFRyaWdnZXJGcm1JbnRdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+RGVsYXllZFRyaWdnZXJGcm1JbnQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFttY2FzdEJjYXN0RmlsdGVyU2V0dGluZ10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5tY2FzdEJjYXN0RmlsdGVyU2V0dGluZyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2Zob3N0QXJwT2ZmbG9hZF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5maG9zdEFycE9mZmxvYWQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtzc2RwXSBWYWx1ZSA9IFsldV0gIiwgcEhkZEN0eC0+Y29uZmlnLT5zc2RwKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fUkFfRklMVEVSSU5HCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW1JBcmF0ZUxpbWl0SW50ZXJ2YWxdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+UkFyYXRlTGltaXRJbnRlcnZhbCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0lzUkFyYXRlTGltaXRFbmFibGVkXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPklzUkFyYXRlTGltaXRFbmFibGVkKTsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2ZGVFJlc291cmNlUmVxU3VwcG9ydGVkXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmZGVFJlc291cmNlUmVxU3VwcG9ydGVkKTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbbk5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5uTmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5kZWxheV9iZWZvcmVfdmRldl9zdG9wKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW25Sb2FtUmVzY2FuUnNzaURpZmZdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+blJvYW1SZXNjYW5Sc3NpRGlmZik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW25OZWlnaGJvclNjYW5NaW5DaGFuVGltZV0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5uTmVpZ2hib3JTY2FuTWluQ2hhblRpbWUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtuTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWVdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+bk5laWdoYm9yU2Nhbk1heENoYW5UaW1lKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbbk1heE5laWdoYm9yUmV0cmllc10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5uTWF4TmVpZ2hib3JSZXFUcmllcyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW25OZWlnaGJvclNjYW5QZXJpb2RdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+bk5laWdoYm9yU2NhblBlcmlvZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW25OZWlnaGJvclNjYW5SZXN1bHRzUmVmcmVzaFBlcmlvZF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5uTmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW25FbXB0eVNjYW5SZWZyZXNoUGVyaW9kXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5FbXB0eVNjYW5SZWZyZXNoUGVyaW9kKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbblJvYW1CbWlzc0ZpcnN0QmNudF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5uUm9hbUJtaXNzRmlyc3RCY250KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbblJvYW1CbWlzc0ZpbmFsQmNudF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5uUm9hbUJtaXNzRmluYWxCY250KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbblJvYW1CZWFjb25Sc3NpV2VpZ2h0XSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5Sb2FtQmVhY29uUnNzaVdlaWdodCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2FsbG93REZTQ2hhbm5lbFJvYW1dIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+YWxsb3dERlNDaGFubmVsUm9hbSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW25oaV9yc3NpX3NjYW5fbWF4X2NvdW50XSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5oaV9yc3NpX3NjYW5fbWF4X2NvdW50KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbbmhpX3Jzc2lfc2Nhbl9yc3NpX2RlbHRhXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5oaV9yc3NpX3NjYW5fcnNzaV9kZWx0YSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW25oaV9yc3NpX3NjYW5fZGVsYXldIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+bmhpX3Jzc2lfc2Nhbl9kZWxheSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW25oaV9yc3NpX3NjYW5fcnNzaV91Yl0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5uaGlfcnNzaV9zY2FuX3Jzc2lfdWIpOworI2VuZGlmCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2J1cnN0U2l6ZURlZmluaXRpb25dIFZhbHVlID0gWzB4JXhdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5idXJzdFNpemVEZWZpbml0aW9uKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbdHNJbmZvQWNrUG9saWN5XSBWYWx1ZSA9IFsweCV4XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+dHNJbmZvQWNrUG9saWN5KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbcmZTZXR0bGluZ1RpbWVVc10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5yZlNldHRsaW5nVGltZVVzKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbYlNpbmdsZVRpZFJjXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmJTaW5nbGVUaWRSYyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dEeW5hbWljUFNQb2xsdmFsdWVdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZHluYW1pY1BzUG9sbFZhbHVlKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0FkZFRTV2hlbkFDTUlzT2ZmXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPkFkZFRTV2hlbkFDTUlzT2ZmKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ1ZhbGlkYXRlU2Nhbkxpc3RdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZlZhbGlkYXRlU2Nhbkxpc3QpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dTdGFLZWVwQWxpdmVQZXJpb2RdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+aW5mcmFTdGFLZWVwQWxpdmVQZXJpb2QpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnQXBEYXRhQXZhaWxQb2xsSW50ZXJWYWxdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+YXBEYXRhQXZhaWxQb2xsUGVyaW9kSW5Ncyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0JhbmRDYXBhYmlsaXR5XSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5CYW5kQ2FwYWJpbGl0eSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2ZFbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmZFbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbdGVsZUJjbldha2V1cEVuYWJsZV0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT50ZWxlQmNuV2FrZXVwRW4pOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFt0cmFuc0xpc3RlbkludGVydmFsXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5UZWxlQmNuVHJhbnNMaXN0ZW5JbnRlcnZhbCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW3RyYW5zTGlOdW1JZGxlQmVhY29uc10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5uVGVsZUJjblRyYW5zTGlOdW1JZGxlQmVhY29ucyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW21heExpc3RlbkludGVydmFsXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5UZWxlQmNuTWF4TGlzdGVuSW50ZXJ2YWwpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFttYXhMaU51bUlkbGVCZWFjb25zXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5UZWxlQmNuTWF4TGlOdW1JZGxlQmVhY29ucyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2JjbkVhcmx5VGVybVdha2VJbnRlcnZhbF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5iY25FYXJseVRlcm1XYWtlSW50ZXJ2YWwpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnQXBEYXRhQXZhaWxQb2xsSW50ZXJWYWxdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+YXBEYXRhQXZhaWxQb2xsUGVyaW9kSW5Ncyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFbmFibGVCeXBhc3MxMWRdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlQnlwYXNzMTFkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0VuYWJsZURGU0NobmxTY2FuXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmVuYWJsZURGU0NobmxTY2FuKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0VuYWJsZURGU1Bub0NobmxTY2FuXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmVuYWJsZV9kZnNfcG5vX2Nobmxfc2Nhbik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dSZXBvcnRNYXhMaW5rU3BlZWRdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+cmVwb3J0TWF4TGlua1NwZWVkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbdGhlcm1hbE1pdGlnYXRpb25FbmFibGVdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+dGhlcm1hbE1pdGlnYXRpb25FbmFibGUpOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dWaHRDaGFubmVsV2lkdGhdIHZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT52aHRDaGFubmVsV2lkdGgpOworI2VuZGlmCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2VuYWJsZUZpcnN0U2NhbjJHT25seV0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5lbmFibGVGaXJzdFNjYW4yR09ubHkpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtza2lwRGZzQ2hubEluUDJwU2VhcmNoXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPnNraXBEZnNDaG5sSW5QMnBTZWFyY2gpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtpZ25vcmVEeW5hbWljRHRpbUluUDJwTW9kZV0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5pZ25vcmVEeW5hbWljRHRpbUluUDJwTW9kZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2VuYWJsZVJ4U1RCQ10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5lbmFibGVSeFNUQkMpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnRW5hYmxlTHB3ckltZ1RyYW5zaXRpb25dIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlTHB3ckltZ1RyYW5zaXRpb24pOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnRW5hYmxlU1NSXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmVuYWJsZVNTUik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFbmFibGVWaHRGb3IyNEdIekJhbmRdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlVmh0Rm9yMjRHSHpCYW5kKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnRmxleENvbm5lY3RQb3dlckZhY3Rvcl0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5mbGV4Q29ubmVjdFBvd2VyRmFjdG9yKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0VuYWJsZUlic3NIZWFydEJlYXRPZmZsb2FkXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmVuYWJsZUlic3NIZWFydEJlYXRPZmZsb2FkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0FudGVubmFEaXZlcnNpdHldIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+YW50ZW5uYURpdmVyc2l0eSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dHb0xpbmtNb25pdG9yUGVyaW9kXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+Z29MaW5rTW9uaXRvclBlcmlvZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dBcExpbmtNb25pdG9yUGVyaW9kXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+YXBMaW5rTW9uaXRvclBlcmlvZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dHb0tlZXBBbGl2ZVBlcmlvZF0gVmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmdvS2VlcEFsaXZlUGVyaW9kKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0FwS2VlcEFsaXZlUGVyaW9kXVZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5hcEtlZXBBbGl2ZVBlcmlvZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dBbXNkdVN1cHBvcnRJbkFNUERVXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmlzQW1zZHVTdXBwb3J0SW5BTVBEVSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW25TZWxlY3Q1R0h6TWFyZ2luXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPm5TZWxlY3Q1R0h6TWFyZ2luKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0NvYWxlc2luZ0luSUJTU10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5pc0NvYWxlc2luZ0luSUJTU0FsbG93ZWQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnSWJzc0FUSU1XaW5TaXplXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmlic3NBVElNV2luU2l6ZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dJYnNzSXNQb3dlclNhdmVBbGxvd2VkXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmlzSWJzc1Bvd2VyU2F2ZUFsbG93ZWQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnSWJzc0lzUG93ZXJDb2xsYXBzZUFsbG93ZWRdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+aXNJYnNzUG93ZXJDb2xsYXBzZUFsbG93ZWQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnSWJzc0F3YWtlT25UeFJ4XSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmlzSWJzc0F3YWtlT25UeFJ4KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0lic3NJbmFjdGl2aXR5VGltZV0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5pYnNzSW5hY3Rpdml0eUNvdW50KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0lic3NUeFNwRW5kSW5hY3Rpdml0eVRpbWVdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+aWJzc1R4U3BFbmRJbmFjdGl2aXR5VGltZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dJYnNzUHNXYXJtdXBUaW1lXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmlic3NQc1dhcm11cFRpbWUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnSWJzc1BzMVJ4Q2hhaW5JbkF0aW1dIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+aWJzc1BzMVJ4Q2hhaW5JbkF0aW1FbmFibGUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtmRGZzUGh5ZXJyRmlsdGVyT2ZmbG9hZF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5mRGZzUGh5ZXJyRmlsdGVyT2ZmbG9hZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dJZ25vcmVQZWVyRXJwSW5mb10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5pZ25vcmVfcGVlcl9lcnBfaW5mbyk7CisjaWZkZWYgSVBBX09GRkxPQUQKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0lQQUNvbmZpZ10gVmFsdWUgPSBbMHgleF0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPklwYUNvbmZpZyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dJUEFEZXNjU2l6ZV0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5JcGFEZXNjU2l6ZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0lwYUhpZ2hCYW5kd2lkdGhNYnBzZ10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5JcGFIaWdoQmFuZHdpZHRoTWJwcyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0lwYU1lZGl1bUJhbmR3aWR0aE1icHNdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SXBhTWVkaXVtQmFuZHdpZHRoTWJwcyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW0lwYUxvd0JhbmR3aWR0aE1icHNdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+SXBhTG93QmFuZHdpZHRoTWJwcyk7CisjZW5kaWYKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0VuYWJsZU92ZXJMYXBDaF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5nRW5hYmxlT3ZlckxhcENoKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ01heE9mZmxvYWRQZWVyc10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5hcE1heE9mZmxvYWRQZWVycyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dNYXhPZmZsb2FkUmVvcmRlckJ1ZmZzXSB2YWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmFwTWF4T2ZmbG9hZFJlb3JkZXJCdWZmcyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dBbGxvd0RGU0NoYW5uZWxSb2FtXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmFsbG93REZTQ2hhbm5lbFJvYW0pOworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCSAgICAgICAiTmFtZSA9IFtnTWF4Q29uY3VycmVudEFjdGl2ZVNlc3Npb25zXSBWYWx1ZSA9IFsldV0gIiwKKwkgICAgICAgcEhkZEN0eC0+Y29uZmlnLT5nTWF4Q29uY3VycmVudEFjdGl2ZVNlc3Npb25zKTsKKworI2lmZGVmIE1TTV9QTEFURk9STQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnQnVzQmFuZHdpZHRoSGlnaFRocmVzaG9sZF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5idXNCYW5kd2lkdGhIaWdoVGhyZXNob2xkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0J1c0JhbmR3aWR0aE1lZGl1bVRocmVzaG9sZF0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5idXNCYW5kd2lkdGhNZWRpdW1UaHJlc2hvbGQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnQnVzQmFuZHdpZHRoTG93VGhyZXNob2xkXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmJ1c0JhbmR3aWR0aExvd1RocmVzaG9sZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2didXNCYW5kd2lkdGhDb21wdXRlSW50ZXJ2YWxdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+YnVzQmFuZHdpZHRoQ29tcHV0ZUludGVydmFsKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ1RjcERlbEFja1RocmVzaG9sZEhpZ2hdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+dGNwRGVsYWNrVGhyZXNob2xkSGlnaCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dUY3BEZWxBY2tUaHJlc2hvbGRMb3ddIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+dGNwRGVsYWNrVGhyZXNob2xkTG93KTsKKyNlbmRpZgorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dJZ25vcmVDQUNdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+aWdub3JlQ0FDKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ1NhcFByZWZlcnJlZENoYW5Mb2NhdGlvbl0gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5nU2FwUHJlZmVycmVkQ2hhbkxvY2F0aW9uKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0Rpc2FibGVEZnNKYXBhblc1M10gVmFsdWUgPSBbJXVdICIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5nRGlzYWJsZURmc0phcGFuVzUzKTsKKyNpZmRlZiBGRUFUVVJFX0dSRUVOX0FQCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFbmFibGVHcmVlbkFwXSBWYWx1ZSA9IFsldV0gIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmVuYWJsZUdyZWVuQVApOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtpc1JvYW1PZmZsb2FkRW5hYmxlZF0gVmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmlzUm9hbU9mZmxvYWRFbmFibGVkKTsKKyNlbmRpZgorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnRW5hYmxlU2lmc0J1cnN0XSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlU2lmc0J1cnN0KTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFbmFibGVMcGFzc1N1cHBvcnRdIFZhbHVlID0gWyV1XSAiLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlbHBhc3NzdXBwb3J0KTsKKyNlbmRpZgorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFbmFibGVTZWxmUmVjb3ZlcnldIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5lbmFibGVTZWxmUmVjb3ZlcnkpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFbmFibGVTYXBTdXNwZW5kXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlU2FwU3VzcGVuZCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRVhUV09XX1NVUFBPUlQKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0V4dFdvV2dvdG9TdXNwZW5kXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZXh0V293R290b1N1c3BlbmQpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFeHRXb3dBcHAxV2FrZXVwUGluTnVtYmVyXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZXh0V293QXBwMVdha2V1cFBpbk51bWJlcik7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0V4dFdvd0FwcDJXYWtldXBQaW5OdW1iZXJdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5leHRXb3dBcHAyV2FrZXVwUGluTnVtYmVyKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnRXh0V29XQXBwMktBSW5pdFBpbmdJbnRlcnZhbF0gVmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmV4dFdvd0FwcDJLQUluaXRQaW5nSW50ZXJ2YWwpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFeHRXb1dBcHAyS0FNaW5QaW5nSW50ZXJ2YWxdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5leHRXb3dBcHAyS0FNaW5QaW5nSW50ZXJ2YWwpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFeHRXb1dBcHAyS0FNYXhQaW5nSW50ZXJ2YWxdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5leHRXb3dBcHAyS0FNYXhQaW5nSW50ZXJ2YWwpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFeHRXb1dBcHAyS0FJbmNQaW5nSW50ZXJ2YWxdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5leHRXb3dBcHAyS0FJbmNQaW5nSW50ZXJ2YWwpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFeHRXb1dBcHAyVGNwU3JjUG9ydF0gVmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmV4dFdvd0FwcDJUY3BTcmNQb3J0KTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnRXh0V29XQXBwMlRjcERzdFBvcnRdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5leHRXb3dBcHAyVGNwRHN0UG9ydCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0V4dFdvV0FwcDJUY3BUeFRpbWVvdXRdIFZhbHVlID0gWyV1XSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5leHRXb3dBcHAyVGNwVHhUaW1lb3V0KTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnRXh0V29XQXBwMlRjcFJ4VGltZW91dF0gVmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmV4dFdvd0FwcDJUY3BSeFRpbWVvdXQpOworI2VuZGlmCisKKyNpZmRlZiBESENQX1NFUlZFUl9PRkZMT0FECisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dESENQU2VydmVyT2ZmbG9hZEVuYWJsZV0gVmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmVuYWJsZURIQ1BTZXJ2ZXJPZmZsb2FkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZ0RIQ1BNYXhOdW1DbGllbnRzXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZGhjcE1heE51bUNsaWVudHMpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnREhDUFNlcnZlcklQXSBWYWx1ZSA9IFslc10iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZGhjcFNlcnZlcklQKTsKKyNlbmRpZgorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJOYW1lID0gW2dFbmFibGVEdW1wQ29sbGVjdF0gVmFsdWUgPSBbJXVdIiwKKwkJCXBIZGRDdHgtPmNvbmZpZy0+aXNfcmFtZHVtcF9lbmFibGVkKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFtnUDJQTGlzdGVuRGVmZXJJbnRlcnZhbF0gVmFsdWUgPSBbJXVdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPnAycF9saXN0ZW5fZGVmZXJfaW50ZXJ2YWwpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICJOYW1lID0gW2lzX3BzX2VuYWJsZWRdIHZhbHVlID0gWyVkXSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5pc19wc19lbmFibGVkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiTmFtZSA9IFtwb2xpY3lfbWFuYWdlcl9lbmFibGVkXSB2YWx1ZSA9IFslZF0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+cG9saWN5X21hbmFnZXJfZW5hYmxlZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIk5hbWUgPSBbdHNvX2VuYWJsZV0gdmFsdWUgPSBbJWRdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPnRzb19lbmFibGUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICJOYW1lID0gW0xST0VuYWJsZV0gdmFsdWUgPSBbJWRdIiwKKwkJICBwSGRkQ3R4LT5jb25maWctPmxyb19lbmFibGUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICJOYW1lID0gW2FjdGl2ZV9tb2RlX29mZmxvYWRdIHZhbHVlID0gWyVkXSIsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5hY3RpdmVfbW9kZV9vZmZsb2FkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiTmFtZSA9IFtnZmluZV90aW1lX21lYXNfY2FwXSB2YWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZmluZV90aW1lX21lYXNfY2FwKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRkFTVFBBVEgKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk5hbWUgPSBbZmFzdHBhdGhfZW5hYmxlXSBWYWx1ZSA9IFsldV0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZmFzdHBhdGhfZW5hYmxlKTsKKyNlbmRpZgorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICJOYW1lID0gW21heF9zY2FuX2NvdW50XSB2YWx1ZSA9IFslZF0iLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+bWF4X3NjYW5fY291bnQpOworI2lmZGVmIEZFQVRVUkVfTkFQSV9ERUJVRworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICJOYW1lID0gWyVzXSB2YWx1ZSA9IFslZF0iLAorCQkgIENGR19FTkFCTEVfUlhfVEhSRUFELCBwSGRkQ3R4LT5jb25maWctPmVuYWJsZVJ4VGhyZWFkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiTmFtZSA9IFslc10gdmFsdWUgPSBbJWRdIiwKKwkJICBDRkdfTkFQSV9OQU1FLCBwSGRkQ3R4LT5jb25maWctPm5hcGlfZW5hYmxlKTsKKyNlbmRpZgorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTmFtZSA9IFslc10gVmFsdWUgPSBbJXVdIiwKKwkJICBDRkdfQ0VfQ0xBU1NJRllfRU5BQkxFX05BTUUsCisJCSAgcEhkZEN0eC0+Y29uZmlnLT5jZV9jbGFzc2lmeV9lbmFibGVkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiTmFtZSA9IFslc10gdmFsdWUgPSBbJXVdIiwKKwkJICBDRkdfRFVBTF9NQUNfRkVBVFVSRV9ESVNBQkxFLAorCQkgIHBIZGRDdHgtPmNvbmZpZy0+ZHVhbF9tYWNfZmVhdHVyZV9kaXNhYmxlKTsKK30KKworCisvKioKKyAqIGhkZF91cGRhdGVfbWFjX2NvbmZpZygpIC0gdXBkYXRlIE1BQyBhZGRyZXNzIGZyb20gY2ZnIGZpbGUKKyAqIEBwSGRkQ3R4OiB0aGUgcG9pbnRlciB0byBoZGQgY29udGV4dAorICoKKyAqIEl0IG92ZXJ3cml0ZXMgdGhlIE1BQyBhZGRyZXNzIGlmIGNvbmZpZyBmaWxlIGV4aXN0LgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBNQUMgYWRkcmVzcyBpcyBmb3VuZCBmcm9tIGNmZyBmaWxlCisgKiAgICAgIGFuZCBvdmVyd3JpdHRlbiwgb3RoZXJ3aXNlIENERl9TVEFUVVNfRV9JTlZBTAorICovCitDREZfU1RBVFVTIGhkZF91cGRhdGVfbWFjX2NvbmZpZyhoZGRfY29udGV4dF90ICpwSGRkQ3R4KQoreworCWludCBzdGF0dXMsIGkgPSAwOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworCWNoYXIgKmxpbmUsICpidWZmZXIgPSBOVUxMOworCWNoYXIgKm5hbWUsICp2YWx1ZTsKKwl0Q2ZnSW5pRW50cnkgbWFjVGFibGVbQ0RGX01BWF9DT05DVVJSRU5DWV9QRVJTT05BXTsKKwl0U2lyTWFjQWRkciBjdXN0b21NYWNBZGRyOworCisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJbWVtc2V0KG1hY1RhYmxlLCAwLCBzaXplb2YobWFjVGFibGUpKTsKKwlzdGF0dXMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgV0xBTl9NQUNfRklMRSwgcEhkZEN0eC0+cGFyZW50X2Rldik7CisKKwlpZiAoc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwgIiVzOiByZXF1ZXN0X2Zpcm13YXJlIGZhaWxlZCAlZCIsCisJCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlyZXR1cm4gY2RmX3N0YXR1czsKKwl9CisJaWYgKCFmdyB8fCAhZnctPmRhdGEgfHwgIWZ3LT5zaXplKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogaW52YWxpZCBmaXJtd2FyZSIsIF9fZnVuY19fKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJZ290byBjb25maWdfZXhpdDsKKwl9CisKKwlidWZmZXIgPSAoY2hhciAqKWZ3LT5kYXRhOworCisJLyogZGF0YSBmb3JtYXQ6CisJICogSW50ZjBNYWNBZGRyZXNzPTAwQUEwMEJCMDBDQworCSAqIEludGYxTWFjQWRkcmVzcz0wMEFBMDBCQjAwQ0QKKwkgKiBFTkQKKwkgKi8KKwl3aGlsZSAoYnVmZmVyICE9IE5VTEwpIHsKKwkJbGluZSA9IGdldF9uZXh0X2xpbmUoYnVmZmVyKTsKKwkJYnVmZmVyID0gaV90cmltKGJ1ZmZlcik7CisKKwkJaWYgKHN0cmxlbigoY2hhciAqKWJ1ZmZlcikgPT0gMCB8fCAqYnVmZmVyID09ICcjJykgeworCQkJYnVmZmVyID0gbGluZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJuY21wKGJ1ZmZlciwgIkVORCIsIDMpID09IDApCisJCQlicmVhazsKKworCQluYW1lID0gYnVmZmVyOworCQlidWZmZXIgPSBzdHJuY2hyKGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksICc9Jyk7CisJCWlmIChidWZmZXIpIHsKKwkJCSpidWZmZXIrKyA9ICdcMCc7CisJCQlpX3RyaW0obmFtZSk7CisJCQlpZiAoc3RybGVuKG5hbWUpICE9IDApIHsKKwkJCQlidWZmZXIgPSBpX3RyaW0oYnVmZmVyKTsKKwkJCQlpZiAoc3RybGVuKGJ1ZmZlcikgPT0gMTIpIHsKKwkJCQkJdmFsdWUgPSBidWZmZXI7CisJCQkJCW1hY1RhYmxlW2ldLm5hbWUgPSBuYW1lOworCQkJCQltYWNUYWJsZVtpKytdLnZhbHVlID0gdmFsdWU7CisJCQkJCWlmIChpID49IENERl9NQVhfQ09OQ1VSUkVOQ1lfUEVSU09OQSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlidWZmZXIgPSBsaW5lOworCX0KKwlpZiAoaSA8PSBDREZfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkEpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJXM6ICVkIE1hYyBhZGRyZXNzZXMgcHJvdmlkZWQiLAorCQkgICAgICAgX19mdW5jX18sIGkpOworCX0gZWxzZSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IGludmFsaWQgbnVtYmVyIG9mIE1hYyBhZGRyZXNzIHByb3ZpZGVkLCBuTWFjID0gJWQiLAorCQkgICAgICAgX19mdW5jX18sIGkpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQlnb3RvIGNvbmZpZ19leGl0OworCX0KKworCXVwZGF0ZV9tYWNfZnJvbV9zdHJpbmcocEhkZEN0eCwgJm1hY1RhYmxlWzBdLCBpKTsKKworCWNkZl9tZW1fY29weSgmY3VzdG9tTWFjQWRkciwKKwkJICAgICAmcEhkZEN0eC0+Y29uZmlnLT5pbnRmTWFjQWRkclswXS5ieXRlc1swXSwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlzbWVfc2V0X2N1c3RvbV9tYWNfYWRkcihjdXN0b21NYWNBZGRyKTsKKworY29uZmlnX2V4aXQ6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogaGRkX3BhcnNlX2NvbmZpZ19pbmkoKSAtIHBhcnNlIHRoZSBpbmkgY29uZmlndXJhdGlvbiBmaWxlCisgKiBAcEhkZEN0eDogdGhlIHBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBxY29tX2NmZy5pbmkgZmlsZSBhbmQKKyAqIHBhcnNlcyBlYWNoICdOYW1lPVZhbHVlJyBwYWlyIGluIHRoZSBpbmkgZmlsZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBxY29tX2NmZy5pbmkgaXMgY29ycmVjdGx5IHJlYWQsCisgKgkJb3RoZXJ3aXNlIENERl9TVEFUVVNfRV9JTlZBTAorICovCitDREZfU1RBVFVTIGhkZF9wYXJzZV9jb25maWdfaW5pKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisJaW50IHN0YXR1cywgaSA9IDA7CisJLyoqIFBvaW50ZXIgZm9yIGZpcm13YXJlIGltYWdlIGRhdGEgKi8KKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKKwljaGFyICpidWZmZXIsICpsaW5lLCAqcFRlbXAgPSBOVUxMOworCXNpemVfdCBzaXplOworCWNoYXIgKm5hbWUsICp2YWx1ZTsKKwkvKiBjZmdJbmlUYWJsZSBpcyBzdGF0aWMgdG8gYXZvaWQgZXhjZXNzIHN0YWNrIHVzYWdlICovCisJc3RhdGljIHRDZmdJbmlFbnRyeSBjZmdJbmlUYWJsZVtNQVhfQ0ZHX0lOSV9JVEVNU107CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJbWVtc2V0KGNmZ0luaVRhYmxlLCAwLCBzaXplb2YoY2ZnSW5pVGFibGUpKTsKKworCXN0YXR1cyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBXTEFOX0lOSV9GSUxFLCBwSGRkQ3R4LT5wYXJlbnRfZGV2KTsKKworCWlmIChzdGF0dXMpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiByZXF1ZXN0X2Zpcm13YXJlIGZhaWxlZCAlZCIsCisJCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIGNvbmZpZ19leGl0OworCX0KKwlpZiAoIWZ3IHx8ICFmdy0+ZGF0YSB8fCAhZnctPnNpemUpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiAlcyBkb3dubG9hZCBmYWlsZWQiLAorCQkgICAgICAgX19mdW5jX18sIFdMQU5fSU5JX0ZJTEUpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gY29uZmlnX2V4aXQ7CisJfQorCisJaGRkTG9nKExPRzEsICIlczogcWNvbV9jZmcuaW5pIFNpemUgJXp1IiwgX19mdW5jX18sIGZ3LT5zaXplKTsKKworCWJ1ZmZlciA9IChjaGFyICopY2RmX21lbV9tYWxsb2MoZnctPnNpemUpOworCisJaWYgKE5VTEwgPT0gYnVmZmVyKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsIEZMKCJjZGZfbWVtX21hbGxvYyBmYWlsdXJlIikpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJcFRlbXAgPSBidWZmZXI7CisKKwljZGZfbWVtX2NvcHkoKHZvaWQgKilidWZmZXIsICh2b2lkICopZnctPmRhdGEsIGZ3LT5zaXplKTsKKwlzaXplID0gZnctPnNpemU7CisKKwl3aGlsZSAoYnVmZmVyICE9IE5VTEwpIHsKKwkJbGluZSA9IGdldF9uZXh0X2xpbmUoYnVmZmVyKTsKKwkJYnVmZmVyID0gaV90cmltKGJ1ZmZlcik7CisKKwkJaGRkTG9nKExPRzEsICIlczogaXRlbSIsIGJ1ZmZlcik7CisKKwkJaWYgKHN0cmxlbigoY2hhciAqKWJ1ZmZlcikgPT0gMCB8fCAqYnVmZmVyID09ICcjJykgeworCQkJYnVmZmVyID0gbGluZTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHN0cm5jbXAoYnVmZmVyLCAiRU5EIiwgMykgPT0gMCkgeworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQluYW1lID0gYnVmZmVyOworCQkJd2hpbGUgKCpidWZmZXIgIT0gJz0nICYmICpidWZmZXIgIT0gJ1wwJykKKwkJCQlidWZmZXIrKzsKKwkJCWlmICgqYnVmZmVyICE9ICdcMCcpIHsKKwkJCQkqYnVmZmVyKysgPSAnXDAnOworCQkJCWlfdHJpbShuYW1lKTsKKwkJCQlpZiAoc3RybGVuKG5hbWUpICE9IDApIHsKKwkJCQkJYnVmZmVyID0gaV90cmltKGJ1ZmZlcik7CisJCQkJCWlmIChzdHJsZW4oYnVmZmVyKSA+IDApIHsKKwkJCQkJCXZhbHVlID0gYnVmZmVyOworCQkJCQkJd2hpbGUgKCFpX2lzc3BhY2UoKmJ1ZmZlcikKKwkJCQkJCSAgICAgICAmJiAqYnVmZmVyICE9ICdcMCcpCisJCQkJCQkJYnVmZmVyKys7CisJCQkJCQkqYnVmZmVyID0gJ1wwJzsKKwkJCQkJCWNmZ0luaVRhYmxlW2ldLm5hbWUgPSBuYW1lOworCQkJCQkJY2ZnSW5pVGFibGVbaSsrXS52YWx1ZSA9IHZhbHVlOworCQkJCQkJaWYgKGkgPj0gTUFYX0NGR19JTklfSVRFTVMpIHsKKwkJCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJCQkgICAgICAgIiVzOiBOdW1iZXIgb2YgaXRlbXMgaW4gJXMgPiAlZCIsCisJCQkJCQkJICAgICAgIF9fZnVuY19fLAorCQkJCQkJCSAgICAgICBXTEFOX0lOSV9GSUxFLAorCQkJCQkJCSAgICAgICBNQVhfQ0ZHX0lOSV9JVEVNUyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJYnVmZmVyID0gbGluZTsKKwl9CisKKwkvKiBMb29wIHRocm91Z2ggdGhlIHJlZ2lzdHJ5IHRhYmxlIGFuZCBhcHBseSBhbGwgdGhlc2UgY29uZmlncyAqLworCWNkZl9zdGF0dXMgPSBoZGRfYXBwbHlfY2ZnX2luaShwSGRkQ3R4LCBjZmdJbmlUYWJsZSwgaSk7CisjaWZkZWYgRkVBVFVSRV9OQVBJCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfc3RhdHVzKQorCQloZGRfbmFwaV9ldmVudChOQVBJX0VWVF9JTklfRklMRSwKKwkJCSAgICAgICAodm9pZCAqKXBIZGRDdHgtPmNvbmZpZy0+bmFwaV9lbmFibGUpOworI2VuZGlmIC8qIEZFQVRVUkVfTkFQSSAqLworCitjb25maWdfZXhpdDoKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwljZGZfbWVtX2ZyZWUocFRlbXApOworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIGhkZF9jZmdfeGxhdGVfdG9fY3NyX3BoeV9tb2RlKCkgLSBjb252ZXJ0IFBIWSBtb2RlCisgKiBAZG90MTFNb2RlOiB0aGUgbW9kZSB0byBjb252ZXJ0CisgKgorICogQ29udmVydCB0aGUgY29uZmlndXJhdGlvbiBQSFkgbW9kZSB0byBDU1IgUEhZIG1vZGUKKyAqCisgKiBSZXR1cm46IHRoZSBDU1IgcGh5IG1vZGUgdmFsdWUKKyAqLworZUNzclBoeU1vZGUgaGRkX2NmZ194bGF0ZV90b19jc3JfcGh5X21vZGUoZUhkZERvdDExTW9kZSBkb3QxMU1vZGUpCit7CisJc3dpdGNoIChkb3QxMU1vZGUpIHsKKwljYXNlIChlSEREX0RPVDExX01PREVfYWJnKToKKwkJcmV0dXJuIGVDU1JfRE9UMTFfTU9ERV9hYmc7CisJY2FzZSAoZUhERF9ET1QxMV9NT0RFXzExYik6CisJCXJldHVybiBlQ1NSX0RPVDExX01PREVfMTFiOworCWNhc2UgKGVIRERfRE9UMTFfTU9ERV8xMWcpOgorCQlyZXR1cm4gZUNTUl9ET1QxMV9NT0RFXzExZzsKKwlkZWZhdWx0OgorCWNhc2UgKGVIRERfRE9UMTFfTU9ERV8xMW4pOgorCQlyZXR1cm4gZUNTUl9ET1QxMV9NT0RFXzExbjsKKwljYXNlIChlSEREX0RPVDExX01PREVfMTFnX09OTFkpOgorCQlyZXR1cm4gZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZOworCWNhc2UgKGVIRERfRE9UMTFfTU9ERV8xMW5fT05MWSk6CisJCXJldHVybiBlQ1NSX0RPVDExX01PREVfMTFuX09OTFk7CisJY2FzZSAoZUhERF9ET1QxMV9NT0RFXzExYl9PTkxZKToKKwkJcmV0dXJuIGVDU1JfRE9UMTFfTU9ERV8xMWJfT05MWTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWNhc2UgKGVIRERfRE9UMTFfTU9ERV8xMWFjX09OTFkpOgorCQlyZXR1cm4gZUNTUl9ET1QxMV9NT0RFXzExYWNfT05MWTsKKwljYXNlIChlSEREX0RPVDExX01PREVfMTFhYyk6CisJCXJldHVybiBlQ1NSX0RPVDExX01PREVfMTFhYzsKKyNlbHNlCisJLyogSWYgMTFBQyBzdXBwb3J0IGlzIG5vdCBjb21waWxlZCBzZXQgQXV0byBtb2RlICovCisJY2FzZSAoZUhERF9ET1QxMV9NT0RFXzExYWMpOgorCWNhc2UgKGVIRERfRE9UMTFfTU9ERV8xMWFjX09OTFkpOgorCQlyZXR1cm4gZUNTUl9ET1QxMV9NT0RFX0FVVE87CisjZW5kaWYKKwljYXNlIChlSEREX0RPVDExX01PREVfQVVUTyk6CisJCXJldHVybiBlQ1NSX0RPVDExX01PREVfQVVUTzsKKwljYXNlIChlSEREX0RPVDExX01PREVfMTFhKToKKwkJcmV0dXJuIGVDU1JfRE9UMTFfTU9ERV8xMWE7CisJfQorCit9CisKKy8qKgorICogaGRkX3NldF9pZGxlX3BzX2NvbmZpZygpIC0gc2V0IGlkbGUgcG93ZXIgc2F2ZSBjb25maWd1cmF0aW9uCisgKiBAcEhkZEN0eDogdGhlIHBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqIEB2YWw6IHRoZSB2YWx1ZSB0byBjb25maWd1cmUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBpZiBjb21tYW5kIHNldCBjb3JyZWN0bHksCisgKgkJb3RoZXJ3aXNlIHRoZSBDREZfU1RBVFVTIHJldHVybiBmcm9tIFNNRSBsYXllcgorICovCitDREZfU1RBVFVTIGhkZF9zZXRfaWRsZV9wc19jb25maWcoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdWludDMyX3QgdmFsKQoreworCXN0cnVjdCBoZGRfY29uZmlnICpwQ29uZmlnID0gcEhkZEN0eC0+Y29uZmlnOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaGRkTG9nKExPRzEsICJoZGRfc2V0X2lkbGVfcHNfY29uZmlnOiBFbnRlciBWYWwgJWQiLCB2YWwpOworCisJaWYgKHBDb25maWctPmZJc0ltcHNFbmFibGVkKSB7CisJCXN0YXR1cyA9IHNtZV9zZXRfaWRsZV9wb3dlcnNhdmVfY29uZmlnKHBIZGRDdHgtPnBjZHNfY29udGV4dCwKKwkJCQkJCXBIZGRDdHgtPmhIYWwsIHZhbCk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQloZGRMb2coTE9HRSwgIkZhaWwgdG8gU2V0IElkbGUgUFMgQ29uZmlnIHZhbCAlZCIsIHZhbCk7CisJCX0KKwl9IGVsc2UgeworCQloZGRMb2coTE9HMSwgImhkZF9zZXRfaWRsZV9wc19jb25maWc6IElNUFMgbm90IGVuYWJsZWQgaW4gaW5pIik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaGRkX3NldF9maW5lX3RpbWVfbWVhc19jYXAoKSAtIHNldCBmaW5lIHRpbWluZyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5CisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqIEBzbWVfY29uZmlnOiBwb2ludGVyIHRvIFNNRSBjb25maWcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFzcyBmaW5lIHRpbWluZyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5IGNvbWluZworICogZnJvbSBJTkkgdG8gU01FLiBUaGlzIGZ1bmN0aW9uIG1ha2Ugc3VyZSB0aGF0IGNvbmZpZ3VyZSBJTkkgaXMgc3VwcG9ydGVkCisgKiBieSB0aGUgZGV2aWNlLiBVc2UgYml0IG1hc2sgdG8gbWFzayBvdXQgdGhlIHVuc3VwcG9ydGVkIGNhcGFiaWxpdGllcy4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX3NldF9maW5lX3RpbWVfbWVhc19jYXAoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgICAgdFNtZUNvbmZpZ1BhcmFtcyAqc21lX2NvbmZpZykKK3sKKwlzdHJ1Y3QgaGRkX2NvbmZpZyAqY29uZmlnID0gaGRkX2N0eC0+Y29uZmlnOworCXVpbnQzMl90IGNhcGFiaWxpdHkgPSBjb25maWctPmZpbmVfdGltZV9tZWFzX2NhcDsKKworCS8qIE1ha2Ugc3VyZSBvbmx5IHN1cHBvcnRlZCBjYXBhYmlsaXRpZXMgYXJlIGVuYWJsZWQgaW4gSU5JICovCisJY2FwYWJpbGl0eSAmPSBDRkdfRklORV9USU1FX01FQVNfQ0FQQUJJTElUWV9NQVg7CisJc21lX2NvbmZpZy0+ZmluZV90aW1lX21lYXNfY2FwID0gY2FwYWJpbGl0eTsKKworCWhkZExvZyhMT0cxLCBGTCgiZmluZSB0aW1lIG1lYXMgY2FwYWJpbGl0eSAtIElOSTogJTA0eCBFbmFibGVkOiAlMDR4IiksCisJCWNvbmZpZy0+ZmluZV90aW1lX21lYXNfY2FwLCBzbWVfY29uZmlnLT5maW5lX3RpbWVfbWVhc19jYXApOworCisJcmV0dXJuOworfQorCisvKioKKyAqIGhkZF9zdHJpbmdfdG9fdThfYXJyYXkoKSAtIHNjYW4gdGhlIHN0cmluZyBhbmQgY29udmVydCB0byB1OCBhcnJheQorICogQHN0cjogdGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZworICogQGludEFycmF5OiB0aGUgcG9pbnRlciBvZiBidWZmZXIgdG8gc3RvcmUgdGhlIHU4IHZhbHVlCisgKiBAbGVuOiBzaXplIG9mIHRoZSBidWZmZXIKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgY29udmVyc2lvbiBpcyBkb25lLAorICogICAgICBvdGhlcndpc2UgQ0RGX1NUQVRVU19FX0lOVkFMCisgKi8KK0NERl9TVEFUVVMgaGRkX3N0cmluZ190b191OF9hcnJheShjaGFyICpzdHIsIHVpbnQ4X3QgKmludEFycmF5LCB1aW50OF90ICpsZW4sCisJCQkJICB1aW50OF90IGludEFycmF5TWF4TGVuKQoreworCWNoYXIgKnMgPSBzdHI7CisKKwlpZiAoc3RyID09IE5VTEwgfHwgaW50QXJyYXkgPT0gTlVMTCB8fCBsZW4gPT0gTlVMTCkgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKwkqbGVuID0gMDsKKworCXdoaWxlICgocyAhPSBOVUxMKSAmJiAoKmxlbiA8IGludEFycmF5TWF4TGVuKSkgeworCQlpbnQgdmFsOworCQkvKiBJbmNyZW1lbnQgbGVuZ3RoIG9ubHkgaWYgc3NjYW5mIHN1Y2Nlc2Z1bGx5IGV4dHJhY3RlZCBvbmUgZWxlbWVudC4KKwkJICogQW55IG90aGVyIHJldHVybiB2YWx1ZSBtZWFucyBlcnJvci4gSWdub3JlIGl0LgorCQkgKi8KKwkJaWYgKHNzY2FuZihzLCAiJWQiLCAmdmFsKSA9PSAxKSB7CisJCQlpbnRBcnJheVsqbGVuXSA9ICh1aW50OF90KSB2YWw7CisJCQkqbGVuICs9IDE7CisJCX0KKwkJcyA9IHN0cnBicmsocywgIiwiKTsKKwkJaWYgKHMpCisJCQlzKys7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworfQorCisvKioKKyAqIGhkZF91cGRhdGVfY29uZmlnX2RhdCgpIC0gc2NhbiB0aGUgc3RyaW5nIGFuZCBjb252ZXJ5IHRvIHU4IGFycmF5CisgKiBAc3RyOiB0aGUgcG9pbnRlciB0byB0aGUgc3RyaW5nCisgKiBAaW50QXJyYXk6IHRoZSBwb2ludGVyIG9mIGJ1ZmZlciB0byBzdG9yZSB0aGUgdTggdmFsdWUKKyAqIEBsZW46IHNpemUgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBjb25maWd1cmF0aW9uIGNvdWxkIGJlIHVwZGF0ZWQgY29yZWN0bHksCisgKgkJb3RoZXJ3aXNlIENERl9TVEFUVVNfRV9JTlZBTAorICovCitib29sIGhkZF91cGRhdGVfY29uZmlnX2RhdChoZGRfY29udGV4dF90ICpwSGRkQ3R4KQoreworCWJvb2wgZlN0YXR1cyA9IHRydWU7CisJdWludDMyX3QgdmFsOworCXVpbnQxNl90IHZhbDE2OworCisJc3RydWN0IGhkZF9jb25maWcgKnBDb25maWcgPSBwSGRkQ3R4LT5jb25maWc7CisJdFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gKnBodENhcEluZm87CisKKwlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFosCisJCQkgICAgcENvbmZpZy0+U2hvcnRHSTIwTWh6RW5hYmxlKSA9PQorCQkJQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFogdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0ZJWEVEX1JBVEUsIHBDb25maWctPlR4UmF0ZSkKKwkJCSAgICA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19GSVhFRF9SQVRFIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SLAorCQkJICAgIHBDb25maWctPk1heFJ4QW1wZHVGYWN0b3IpID09CisJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TX01BWF9SWF9BTVBEVV9GQUNUT1IgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEUsCisJCSAgICAgcENvbmZpZy0+ZklzU2hvcnRQcmVhbWJsZSkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJCSJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwKKwkJCQlXTklfQ0ZHX1BBU1NJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUsCisJCQkJcENvbmZpZy0+blBhc3NpdmVNaW5DaG5UaW1lKQorCQkJCT09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19QQVNTSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FIgorCQkgICAgICAgIiB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsCisJCQkJV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FLAorCQkJCXBDb25maWctPm5QYXNzaXZlTWF4Q2huVGltZSkKKwkJCQk9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSIKKwkJICAgICAgICIgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMLAorCQkgICAgIHBDb25maWctPm5CZWFjb25JbnRlcnZhbCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTCB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19NQVhfUFNfUE9MTCwKKwkJICAgICBwQ29uZmlnLT5uTWF4UHNQb2xsKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19NQVhfUFNfUE9MTCB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19DVVJSRU5UX1JYX0FOVEVOTkEsCisJCSAgICAgcENvbmZpZy0+blJ4QW50KSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfTE9XX0dBSU5fT1ZFUlJJREUsCisJCSAgICBwQ29uZmlnLT5mSXNMb3dHYWluT3ZlcnJpZGUpID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19MT1dfR0FJTl9PVkVSUklERSB0byBIQUwiKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19SU1NJX0ZJTFRFUl9QRVJJT0QsCisJCSAgICBwQ29uZmlnLT5uUnNzaUZpbHRlclBlcmlvZCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1JTU0lfRklMVEVSX1BFUklPRCB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19JR05PUkVfRFRJTSwKKwkJICAgICBwQ29uZmlnLT5mSWdub3JlRHRpbSkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfSUdOT1JFX0RUSU0gdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUFNfRU5BQkxFX0hFQVJUX0JFQVQsCisJCSAgICBwQ29uZmlnLT5mRW5hYmxlRndIZWFydEJlYXRNb25pdG9yaW5nKQorCQkgICAgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1BTX0hFQVJUX0JFQVQgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVIsCisJCSAgICBwQ29uZmlnLT5mRW5hYmxlRndCZWFjb25GaWx0ZXJpbmcpID09CisJCSAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUFNfQkNOX0ZJTFRFUiB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19QU19FTkFCTEVfUlNTSV9NT05JVE9SLAorCQkgICAgcENvbmZpZy0+ZkVuYWJsZUZ3UnNzaU1vbml0b3JpbmcpID09CisJCSAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUFNfUlNTSV9NT05JVE9SIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VULAorCQkgICAgcENvbmZpZy0+bkRhdGFJbmFjdGl2aXR5VGltZW91dCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWCwKKwkJICAgICBwQ29uZmlnLT5lbmFibGVMVEVDb2V4KSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfRU5BQkxFX0xURV9DT0VYIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0VOQUJMRV9QSFlfQUdDX0xJU1RFTl9NT0RFLAorCQkgICAgcENvbmZpZy0+bkVuYWJsZUxpc3Rlbk1vZGUpID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERSB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVQsCisJCSAgICBwQ29uZmlnLT5hcEtlZXBBbGl2ZVBlcmlvZCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0FQX0tFRVBfQUxJVkVfVElNRU9VVCB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19HT19LRUVQX0FMSVZFX1RJTUVPVVQsCisJCSAgICBwQ29uZmlnLT5nb0tlZXBBbGl2ZVBlcmlvZCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVCB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19BUF9MSU5LX01PTklUT1JfVElNRU9VVCwKKwkJICAgIHBDb25maWctPmFwTGlua01vbml0b3JQZXJpb2QpID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19BUF9MSU5LX01PTklUT1JfVElNRU9VVCB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19HT19MSU5LX01PTklUT1JfVElNRU9VVCwKKwkJICAgIHBDb25maWctPmdvTGlua01vbml0b3JQZXJpb2QpID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19HT19MSU5LX01PTklUT1JfVElNRU9VVCB0byBDRkciKTsKKwl9CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19SUk1fRU5BQkxFRCwgcENvbmZpZy0+ZlJybUVuYWJsZSkKKwkJICAgID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19SUk1fRU5BQkxFIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVgsCisJCSAgICBwQ29uZmlnLT5uSW5DaGFuTWVhc01heER1cmF0aW9uKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUlJNX09QRVJBVElOR19DSEFOX01BWCB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWCwKKwkJICAgIHBDb25maWctPm5PdXRDaGFuTWVhc01heER1cmF0aW9uKSA9PQorCQkgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1JSTV9PVVRfQ0hBTl9NQVggdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkcsCisJCSAgICBwQ29uZmlnLT5tY2FzdEJjYXN0RmlsdGVyU2V0dGluZykgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpCisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElORyB0byBDRkciKTsKKyNlbmRpZgorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfU0lOR0xFX1RJRF9SQywKKwkJICAgIHBDb25maWctPmJTaW5nbGVUaWRSYykgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1NJTkdMRV9USURfUkMgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOLAorCQkgICAgcENvbmZpZy0+dGVsZUJjbldha2V1cEVuKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJLAorCQkgICAgcENvbmZpZy0+blRlbGVCY25UcmFuc0xpc3RlbkludGVydmFsKSA9PQorCQkgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSSwKKwkJICAgIHBDb25maWctPm5UZWxlQmNuTWF4TGlzdGVuSW50ZXJ2YWwpID09CisJCSAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0lETEVfQkNOUywKKwkJICAgIHBDb25maWctPm5UZWxlQmNuVHJhbnNMaU51bUlkbGVCZWFjb25zKSA9PQorCQkgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0lETEVfQkNOUyB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TLAorCQkgICAgcENvbmZpZy0+blRlbGVCY25NYXhMaU51bUlkbGVCZWFjb25zKSA9PQorCQkgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlMgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUkZfU0VUVExJTkdfVElNRV9DTEssCisJCSAgICBwQ29uZmlnLT5yZlNldHRsaW5nVGltZVVzKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUkZfU0VUVExJTkdfVElNRV9DTEsgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9ELAorCQkgICAgcENvbmZpZy0+aW5mcmFTdGFLZWVwQWxpdmVQZXJpb2QpID09CisJCSAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EIHRvIENGRyIpOworCX0KKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19EWU5BTUlDX1BTX1BPTExfVkFMVUUsCisJCSAgICBwQ29uZmlnLT5keW5hbWljUHNQb2xsVmFsdWUpID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19EWU5BTUlDX1BTX1BPTExfVkFMVUUgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUFNfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VULAorCQkgICAgcENvbmZpZy0+bk51bGxEYXRhQXBSZXNwVGltZW91dCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1BTX05VTExEQVRBX0RFTEFZX1RJTUVPVVQgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRCwKKwkJICAgIHBDb25maWctPmFwRGF0YUF2YWlsUG9sbFBlcmlvZEluTXMpID09CisJCSAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRCB0byBDRkciKTsKKwl9CisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsCisJCSAgICBwQ29uZmlnLT5GcmFnbWVudGF0aW9uVGhyZXNob2xkKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgdG8gQ0ZHIik7CisJfQorCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsCisJCSAgICAgcENvbmZpZy0+UlRTVGhyZXNob2xkKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUlRTX1RIUkVTSE9MRCB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR18xMURfRU5BQkxFRCwKKwkJICAgICBwQ29uZmlnLT5JczExZFN1cHBvcnRFbmFibGVkKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfMTFEX0VOQUJMRUQgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0RGU19NQVNURVJfRU5BQkxFRCwKKwkJCSAgICBwQ29uZmlnLT5lbmFibGVERlNNYXN0ZXJDYXApID09CisJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkZhaWx1cmU6IENvdWxkIG5vdCBzZXQgdmFsdWUgZm9yIFdOSV9DRkdfREZTX01BU1RFUl9FTkFCTEVEIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1ZIVF9FTkFCTEVfVFhCRl8yME1IWiwKKwkJCSAgICBwQ29uZmlnLT5lbmFibGVUeEJGaW4yME1IeikgPT0KKwkJCUNERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHNldCB2YWx1ZSBmb3IgV05JX0NGR19WSFRfRU5BQkxFX1RYQkZfMjBNSFoiKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCwKKwkJICAgIHBDb25maWctPkhlYXJ0YmVhdFRocmVzaDI0KSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRCwKKwkJICAgIHBDb25maWctPmFwRGF0YUF2YWlsUG9sbFBlcmlvZEluTXMpID09CisJCSAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRCB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfRU5BQkxFX0NMT1NFX0xPT1AsCisJCQkgICAgcENvbmZpZy0+ZW5hYmxlQ2xvc2VMb29wKSA9PQorCQkJQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEUsCisJCQkgICAgcENvbmZpZy0+ZW5hYmxlQXV0b21hdGljVHhQb3dlckNvbnRyb2wpCisJCQk9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVFhfUFdSX0NUUkxfRU5BQkxFIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19TSE9SVF9HSV80ME1IWiwKKwkJCSAgICBwQ29uZmlnLT5TaG9ydEdJNDBNaHpFbmFibGUpID09CisJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19TSE9SVF9HSV80ME1IWiB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19FTkFCTEVfTUNfQUREUl9MSVNULAorCQkgICAgcENvbmZpZy0+ZkVuYWJsZU1DQWRkckxpc3QpID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19FTkFCTEVfTUNfQUREUl9MSVNUIHRvIENGRyIpOworCX0KKwkvKiBCYXNlZCBvbiBjZmcuaW5pLCB1cGRhdGUgdGhlIEJhc2ljIE1DUyBzZXQsIFJYL1RYIE1DUyBtYXAKKwkgKiBpbiB0aGUgY2ZnLmRhdC4gVmFsaWQgdmFsdWVzIGFyZSAwKE1DUzAtNyksIDEoTUNTMC04KSwgMihNQ1MwLTkpCisJICogd2UgdXBkYXRlIG9ubHkgdGhlIGxlYXN0IHNpZ25pZmljYW50IDIgYml0cyBpbiB0aGUKKwkgKiBjb3JyZXNwb25kaW5nIGZpZWxkcy4KKwkgKi8KKwlpZiAoKHBDb25maWctPmRvdDExTW9kZSA9PSBlSEREX0RPVDExX01PREVfQVVUTykgfHwKKwkgICAgKHBDb25maWctPmRvdDExTW9kZSA9PSBlSEREX0RPVDExX01PREVfMTFhY19PTkxZKSB8fAorCSAgICAocENvbmZpZy0+ZG90MTFNb2RlID09IGVIRERfRE9UMTFfTU9ERV8xMWFjKSkgeworCQl1aW50MzJfdCB0ZW1wID0gMDsKKworCQlzbWVfY2ZnX2dldF9pbnQocEhkZEN0eC0+aEhhbCwKKwkJCQlXTklfQ0ZHX1ZIVF9CQVNJQ19NQ1NfU0VULCAmdGVtcCk7CisJCXRlbXAgPSAodGVtcCAmIDB4RkZGQykgfCBwQ29uZmlnLT52aHRSeE1DUzsKKwkJaWYgKHBDb25maWctPmVuYWJsZTJ4MikKKwkJCXRlbXAgPSAodGVtcCAmIDB4RkZGMykgfCAocENvbmZpZy0+dmh0UnhNQ1MyeDIgPDwgMik7CisJCQlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsCisJCQkJCVdOSV9DRkdfVkhUX0JBU0lDX01DU19TRVQsIHRlbXApID09CisJCQkJCUNERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQlmU3RhdHVzID0gZmFsc2U7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19WSFRfQkFTSUNfTUNTX1NFVCB0byBDRkciKTsKKwkJfQorCisJCXNtZV9jZmdfZ2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1ZIVF9SWF9NQ1NfTUFQLAorCQkJCSZ0ZW1wKTsKKwkJdGVtcCA9ICh0ZW1wICYgMHhGRkZDKSB8IHBDb25maWctPnZodFJ4TUNTOworCQlpZiAocENvbmZpZy0+ZW5hYmxlMngyKQorCQkJdGVtcCA9ICh0ZW1wICYgMHhGRkYzKSB8IChwQ29uZmlnLT52aHRSeE1DUzJ4MiA8PCAyKTsKKwkJCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwKKwkJCQkJV05JX0NGR19WSFRfUlhfTUNTX01BUCwgdGVtcCkKKwkJCQk9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJZlN0YXR1cyA9IGZhbHNlOworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVkhUX1JYX01DU19NQVAgdG8gQ0ZHIik7CisJCX0KKwkJc21lX2NmZ19nZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfVkhUX1RYX01DU19NQVAsICZ0ZW1wKTsKKwkJdGVtcCA9ICh0ZW1wICYgMHhGRkZDKSB8IHBDb25maWctPnZodFR4TUNTOworCQlpZiAocENvbmZpZy0+ZW5hYmxlMngyKQorCQkJdGVtcCA9ICh0ZW1wICYgMHhGRkYzKSB8IChwQ29uZmlnLT52aHRUeE1DUzJ4MiA8PCAyKTsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgInZodFJ4TUNTMngyIC0gJXggdGVtcCAtICV1IGVuYWJsZTJ4MiAlZCIsCisJCQkgIHBDb25maWctPnZodFJ4TUNTMngyLCB0ZW1wLAorCQkJICBwQ29uZmlnLT5lbmFibGUyeDIpOworCisJCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19WSFRfVFhfTUNTX01BUCwKKwkJCQkJdGVtcCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJCWZTdGF0dXMgPSBmYWxzZTsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1ZIVF9UWF9NQ1NfTUFQIHRvIENGRyIpOworCQl9CisJCS8qIEN1cnJlbnRseSBzaG9ydEdJNDBNaHogaXMgdXNlZCBmb3Igc2hvcnRHSTgwTWh6ICovCisJCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19WSFRfU0hPUlRfR0lfODBNSFosCisJCQkgICAgcENvbmZpZy0+U2hvcnRHSTQwTWh6RW5hYmxlKSA9PQorCQkJICAgIENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQlmU3RhdHVzID0gZmFsc2U7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICAiQ291bGQgbm90IHBhc3MgV05JX1ZIVF9TSE9SVF9HSV84ME1IWiB0byBDRkciKTsKKwkJfQorCQkvKiBIYXJkd2FyZSBpcyBjYXBhYmxlIG9mIGRvaW5nCisJCSAqIDEyOEsgQU1QRFUgaW4gMTFBQyBtb2RlICovCisJCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwKKwkJCSAgICAgV05JX0NGR19WSFRfQU1QRFVfTEVOX0VYUE9ORU5ULAorCQkJICAgICBwQ29uZmlnLT5mVmh0QW1wZHVMZW5FeHBvbmVudCkgPT0KKwkJCSAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJZlN0YXR1cyA9IGZhbHNlOworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVkhUX0FNUERVX0xFTl9FWFBPTkVOVCB0byBDRkciKTsKKwkJfQorCQkvKiBDaGFuZ2UgTVUgQmZvcm1lZSBvbmx5IHdoZW4gVHhCRiBpcyBlbmFibGVkICovCisJCWlmIChwQ29uZmlnLT5lbmFibGVUeEJGKSB7CisJCQlzbWVfY2ZnX2dldF9pbnQocEhkZEN0eC0+aEhhbCwKKwkJCQlXTklfQ0ZHX1ZIVF9NVV9CRUFNRk9STUVFX0NBUCwgJnRlbXApOworCisJCQlpZiAodGVtcCAhPSBwQ29uZmlnLT5lbmFibGVNdUJmb3JtZWUpIHsKKwkJCQlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsCisJCQkJCSAgICBXTklfQ0ZHX1ZIVF9NVV9CRUFNRk9STUVFX0NBUCwKKwkJCQkJICAgIHBDb25maWctPmVuYWJsZU11QmZvcm1lZQorCQkJCQkgICAgKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJCQlmU3RhdHVzID0gZmFsc2U7CisJCQkJCWhkZExvZyhMT0dFLAorCQkJCQkJIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRUVfQ0FQIHRvIENGRyIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfVkhUX01BWF9NUERVX0xFTkdUSCwKKwkJCSAgICBwQ29uZmlnLT52aHRNcGR1TGVuKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJZlN0YXR1cyA9IGZhbHNlOworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVkhUX01BWF9NUERVX0xFTkdUSCB0byBDRkciKTsKKwkJfQorCisJCWlmIChwQ29uZmlnLT5lbmFibGUyeDIgJiYgcENvbmZpZy0+ZW5hYmxlX3N1X3R4X2Jmb3JtZXIpIHsKKwkJCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwKKwkJCQkJV05JX0NGR19WSFRfU1VfQkVBTUZPUk1FUl9DQVAsCisJCQkJCXBDb25maWctPmVuYWJsZV9zdV90eF9iZm9ybWVyKSA9PQorCQkJCUNERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQkJZlN0YXR1cyA9IGZhbHNlOworCQkJCWhkZF9lcnIoInNldCBTVV9CRUFNRk9STUVSX0NBUCB0byBDRkcgZmFpbGVkIik7CisJCQl9CisJCQlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsCisJCQkJCVdOSV9DRkdfVkhUX05VTV9TT1VORElOR19ESU1FTlNJT05TLAorCQkJCQlOVU1fT0ZfU09VTkRJTkdfRElNRU5TSU9OUykgPT0KKwkJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJCWZTdGF0dXMgPSBmYWxzZTsKKwkJCQloZGRfZXJyKCJmYWlsZWQgdG8gc2V0IE5VTV9PRl9TT1VORElOR19ESU0iKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19IVF9SWF9TVEJDLAorCQkJICAgIHBDb25maWctPmVuYWJsZVJ4U1RCQykgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfSFRfUlhfU1RCQyB0byBDRkciKTsKKwl9CisKKwlzbWVfY2ZnX2dldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19IVF9DQVBfSU5GTywgJnZhbCk7CisJdmFsMTYgPSAodWludDE2X3QpIHZhbDsKKwlwaHRDYXBJbmZvID0gKHRTaXJNYWNIVENhcGFiaWxpdHlJbmZvICopICZ2YWwxNjsKKwlwaHRDYXBJbmZvLT5yeFNUQkMgPSBwQ29uZmlnLT5lbmFibGVSeFNUQkM7CisJcGh0Q2FwSW5mby0+YWR2Q29kaW5nQ2FwID0gcENvbmZpZy0+ZW5hYmxlUnhMRFBDOworCXZhbCA9IHZhbDE2OworCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19IVF9DQVBfSU5GTywgdmFsKQorCQkJPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfSFRfQ0FQX0lORk8gdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1ZIVF9SWFNUQkMsCisJCQkgICAgcENvbmZpZy0+ZW5hYmxlUnhTVEJDKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19WSFRfUlhTVEJDIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19WSFRfVFhTVEJDLAorCQkJICAgIHBDb25maWctPmVuYWJsZVR4U1RCQykgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVkhUX1RYU1RCQyB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfVkhUX0xEUENfQ09ESU5HX0NBUCwKKwkJCSAgICBwQ29uZmlnLT5lbmFibGVSeExEUEMpID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19WSFRfTERQQ19DT0RJTkdfQ0FQIHRvIENGRyIpOworCX0KKyNpZmRlZiBXTEFOX1NPRlRBUF9WU1RBX0ZFQVRVUkUKKwlpZiAocENvbmZpZy0+ZkVuYWJsZVZTVEFTdXBwb3J0KSB7CisJCXNtZV9jZmdfZ2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVCwgJnZhbCk7CisJCWlmICh2YWwgPD0gV05JX0NGR19BU1NPQ19TVEFfTElNSVRfU1RBREVGKQorCQkJdmFsID0gV05JX0NGR19BU1NPQ19TVEFfTElNSVRfU1RBTUFYOworCX0gZWxzZSB7CisJCXZhbCA9IHBDb25maWctPm1heE51bWJlck9mUGVlcnM7CisKKwl9CisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVCwgdmFsKSA9PQorCQkJQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVCB0byBDRkciKTsKKwl9CisjZW5kaWYKKwlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfRU5BQkxFX0xQV1JfSU1HX1RSQU5TSVRJT04sCisJCQkgICAgcENvbmZpZy0+ZW5hYmxlTHB3ckltZ1RyYW5zaXRpb24pCisJCQk9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfRU5BQkxFX0xQV1JfSU1HX1RSQU5TSVRJT04gdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfRU5BQkxFX01DQ19BREFQVElWRV9TQ0hFRCwKKwkJICAgIHBDb25maWctPmVuYWJsZU1DQ0FkYXB0aXZlU2NoZWR1bGVyKSA9PQorCQkgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0VOQUJMRV9NQ0NfQURBUFRJVkVfU0NIRUQgdG8gQ0ZHIik7CisJfQorCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0RJU0FCTEVfTERQQ19XSVRIX1RYQkZfQVAsCisJCSAgICBwQ29uZmlnLT5kaXNhYmxlTERQQ1dpdGhUeGJmQVApID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19ESVNBQkxFX0xEUENfV0lUSF9UWEJGX0FQIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk8sCisJCSAgICBwQ29uZmlnLT5yZXRyeUxpbWl0WmVybykgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk8gdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FLAorCQkgICAgcENvbmZpZy0+cmV0cnlMaW1pdE9uZSkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORSB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50CisJCSAgICAocEhkZEN0eC0+aEhhbCwgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV08sCisJCSAgICBwQ29uZmlnLT5yZXRyeUxpbWl0VHdvKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfVFdPIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQKKwkJICAgIChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX01BWF9NRURJVU1fVElNRSwKKwkJICAgICBwQ29uZmlnLT5jZmdNYXhNZWRpdW1UaW1lKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfTUFYX01FRElVTV9USU1FIHRvIENGRyIpOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RETFNfUU9TX1dNTV9VQVBTRF9NQVNLLAorCQkJICAgIHBDb25maWctPmZURExTVWFwc2RNYXNrKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVERMU19RT1NfV01NX1VBUFNEX01BU0sgdG8gQ0ZHIik7CisJfQorCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19URExTX0JVRl9TVEFfRU5BQkxFRCwKKwkJCSAgICBwQ29uZmlnLT5mRW5hYmxlVERMU0J1ZmZlclN0YSkgPT0KKwkJCUNERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19URExTX0JVRl9TVEFfRU5BQkxFRCB0byBDRkciKTsKKwl9CisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RETFNfUFVBUFNEX0lOQUNUX1RJTUUsCisJCQkgICAgcENvbmZpZy0+ZlRETFNQdWFwc2RJbmFjdGl2aXR5VGltZXIpID09CisJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVERMU19QVUFQU0RfSU5BQ1RfVElNRSB0byBDRkciKTsKKwl9CisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RETFNfUlhfRlJBTUVfVEhSRVNIT0xELAorCQkJICAgIHBDb25maWctPmZURExTUnhGcmFtZVRocmVzaG9sZCkgPT0KKwkJCUNERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19URExTX1JYX0ZSQU1FX1RIUkVTSE9MRCB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfVERMU19PRkZfQ0hBTk5FTF9FTkFCTEVELAorCQkJICAgIHBDb25maWctPmZFbmFibGVURExTT2ZmQ2hhbm5lbCkgPT0KKwkJCUNERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19URExTX0JVRl9TVEFfRU5BQkxFRCB0byBDRkciKTsKKwl9CisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RETFNfV01NX01PREVfRU5BQkxFRCwKKwkJCSAgICBwQ29uZmlnLT5mRW5hYmxlVERMU1dtbU1vZGUpID09CisJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVERMU19XTU1fTU9ERV9FTkFCTEVEIHRvIENGRyIpOworCX0KKyNlbmRpZgorCisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTiwKKwkJCSAgICBwQ29uZmlnLT5mRW5hYmxlQWRhcHRSeERyYWluKSA9PQorCQkJQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTiB0byBDRkciKTsKKwl9CisKKwlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfRkxFWF9DT05ORUNUX1BPV0VSX0ZBQ1RPUiwKKwkJCSAgICBwQ29uZmlnLT5mbGV4Q29ubmVjdFBvd2VyRmFjdG9yKSA9PQorCQkJQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwgIkZhaWx1cmU6IENvdWxkIG5vdCBwYXNzIG9uICIKKwkJICAgICAgICJXTklfQ0ZHX0ZMRVhfQ09OTkVDVF9QT1dFUl9GQUNUT1IgdG8gQ0ZHIik7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0FOVEVOTkFfRElWRVNJVFksCisJCQkgICAgcENvbmZpZy0+YW50ZW5uYURpdmVyc2l0eSkgPT0KKwkJCUNERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19BTlRFTk5BX0RJVkVTSVRZIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwKKwkJCSAgICBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWiwKKwkJCSAgICBwQ29uZmlnLT5kZWZhdWx0UmF0ZUluZGV4MjRHaHopID09CisJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwKKwkJCSAgICBXTklfQ0ZHX0RFQlVHX1AyUF9SRU1BSU5fT05fQ0hBTk5FTCwKKwkJCSAgICBwQ29uZmlnLT5kZWJ1Z1AycFJlbWFpbk9uQ2hhbm5lbCkgPT0KKwkJCUNERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19ERUJVR19QMlBfUkVNQUlOX09OX0NIQU5ORUwgdG8gQ0ZHIik7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUE1GX1NBX1FVRVJZX01BWF9SRVRSSUVTLAorCQkJICAgIHBDb25maWctPnBtZlNhUXVlcnlNYXhSZXRyaWVzKSA9PQorCQkJQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJZlN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1NBX1FVRVJZX01BWF9SRVRSSUVTIHRvIENGRyIpOworCX0KKworCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19QTUZfU0FfUVVFUllfUkVUUllfSU5URVJWQUwsCisJCQkgICAgcENvbmZpZy0+cG1mU2FRdWVyeVJldHJ5SW50ZXJ2YWwpID09CisJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlmU3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfU0FfUVVFUllfUkVUUllfSU5URVJWQUwgdG8gQ0ZHIik7CisJfQorI2VuZGlmCisKKwlpZiAoc21lX2NmZ19zZXRfaW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfSUJTU19BVElNX1dJTl9TSVpFLAorCQkJICAgIHBDb25maWctPmlic3NBVElNV2luU2l6ZSkgPT0KKwkJCUNERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWZTdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19JQlNTX0FUSU1fV0lOX1NJWkUgdG8gQ0ZHIik7CisJfQorCXJldHVybiBmU3RhdHVzOworfQorCisvKioKKyAqIGhkZF9zZXRfc21lX2NvbmZpZygpIC1pbml0aWFsaXplcyB0aGUgc21lIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoKKyAqIEBwSGRkQ3R4OiB0aGUgcG9pbnRlciB0byBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGlmIGNvbmZpZ3VyYXRpb24gaXMgY29ycmVjdGx5IGFwcGxpZWQsCisgKgkJb3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBDREZfU1RBVFVTIHdvdWxkIGJlIHJldHVybmVkCisgKi8KK0NERl9TVEFUVVMgaGRkX3NldF9zbWVfY29uZmlnKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNtZUNvbmZpZ1BhcmFtcyAqc21lQ29uZmlnOworCisJc3RydWN0IGhkZF9jb25maWcgKnBDb25maWcgPSBwSGRkQ3R4LT5jb25maWc7CisKKwlzbWVDb25maWcgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnNtZUNvbmZpZykpOworCWlmIChOVUxMID09IHNtZUNvbmZpZykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgc21lQ29uZmlnIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwljZGZfbWVtX3plcm8oc21lQ29uZmlnLCBzaXplb2YoKnNtZUNvbmZpZykpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlcyBiV21tSXNFbmFibGVkPSVkIDgwMl8xMWVfZW5hYmxlZD0lZCBkb3QxMU1vZGU9JWQiLAorCQkgIF9fZnVuY19fLCBwQ29uZmlnLT5XbW1Nb2RlLCBwQ29uZmlnLT5iODAyMTFlSXNFbmFibGVkLAorCQkgIHBDb25maWctPmRvdDExTW9kZSk7CisKKwkvKiBDb25maWcgcGFyYW1zIG9idGFpbmVkIGZyb20gdGhlIHJlZ2lzdHJ5CisJICogVG8gRG86IHNldCByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGhlcmUKKwkgKi8KKworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLlJUU1RocmVzaG9sZCA9IHBDb25maWctPlJUU1RocmVzaG9sZDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5GcmFnbWVudGF0aW9uVGhyZXNob2xkID0KKwkJcENvbmZpZy0+RnJhZ21lbnRhdGlvblRocmVzaG9sZDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5zaG9ydFNsb3RUaW1lID0gcENvbmZpZy0+U2hvcnRTbG90VGltZUVuYWJsZWQ7CisJc21lQ29uZmlnLT5jc3JDb25maWcuSXMxMWRTdXBwb3J0RW5hYmxlZCA9IHBDb25maWctPklzMTFkU3VwcG9ydEVuYWJsZWQ7CisJc21lQ29uZmlnLT5jc3JDb25maWcuSGVhcnRiZWF0VGhyZXNoMjQgPSBwQ29uZmlnLT5IZWFydGJlYXRUaHJlc2gyNDsKKworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLnBoeU1vZGUgPQorCQloZGRfY2ZnX3hsYXRlX3RvX2Nzcl9waHlfbW9kZShwQ29uZmlnLT5kb3QxMU1vZGUpOworCisJaWYgKHBDb25maWctPmRvdDExTW9kZSA9PSBlSEREX0RPVDExX01PREVfYWJnIHx8CisJICAgIHBDb25maWctPmRvdDExTW9kZSA9PSBlSEREX0RPVDExX01PREVfMTFiIHx8CisJICAgIHBDb25maWctPmRvdDExTW9kZSA9PSBlSEREX0RPVDExX01PREVfMTFnIHx8CisJICAgIHBDb25maWctPmRvdDExTW9kZSA9PSBlSEREX0RPVDExX01PREVfMTFiX09OTFkgfHwKKwkgICAgcENvbmZpZy0+ZG90MTFNb2RlID09IGVIRERfRE9UMTFfTU9ERV8xMWdfT05MWSkgeworCQlzbWVDb25maWctPmNzckNvbmZpZy5jaGFubmVsQm9uZGluZ01vZGUyNEdIeiA9IDA7CisJCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmNoYW5uZWxCb25kaW5nTW9kZTVHSHogPSAwOworCX0gZWxzZSB7CisJCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmNoYW5uZWxCb25kaW5nTW9kZTI0R0h6ID0KKwkJCXBDb25maWctPm5DaGFubmVsQm9uZGluZ01vZGUyNEdIejsKKwkJc21lQ29uZmlnLT5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlNUdIeiA9CisJCQlwQ29uZmlnLT5uQ2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKKwl9CisJc21lQ29uZmlnLT5jc3JDb25maWcuVHhSYXRlID0gcENvbmZpZy0+VHhSYXRlOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5TY2FuUmVzdWx0QWdlQ291bnQgPSBwQ29uZmlnLT5TY2FuUmVzdWx0QWdlQ291bnQ7CisJc21lQ29uZmlnLT5jc3JDb25maWcuc2NhbkFnZVRpbWVOQ05QUyA9IHBDb25maWctPm5TY2FuQWdlVGltZU5DTlBTOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLnNjYW5BZ2VUaW1lTkNQUyA9IHBDb25maWctPm5TY2FuQWdlVGltZU5DUFM7CisJc21lQ29uZmlnLT5jc3JDb25maWcuc2NhbkFnZVRpbWVDTlBTID0gcENvbmZpZy0+blNjYW5BZ2VUaW1lQ05QUzsKKwlzbWVDb25maWctPmNzckNvbmZpZy5zY2FuQWdlVGltZUNQUyA9IHBDb25maWctPm5TY2FuQWdlVGltZUNQUzsKKwlzbWVDb25maWctPmNzckNvbmZpZy5BZEhvY0NoYW5uZWwyNCA9IHBDb25maWctPk9wZXJhdGluZ0NoYW5uZWw7CisJc21lQ29uZmlnLT5jc3JDb25maWcuZlN1cHBsaWNhbnRDb3VudHJ5Q29kZUhhc1ByaW9yaXR5ID0KKwkJcENvbmZpZy0+ZlN1cHBsaWNhbnRDb3VudHJ5Q29kZUhhc1ByaW9yaXR5OworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmJDYXRSc3NpT2Zmc2V0ID0gcENvbmZpZy0+blJzc2lDYXRHYXA7CisJc21lQ29uZmlnLT5jc3JDb25maWcudmNjUnNzaVRocmVzaG9sZCA9IHBDb25maWctPm5WY2NSc3NpVHJpZ2dlcjsKKwlzbWVDb25maWctPmNzckNvbmZpZy52Y2NVbE1hY0xvc3NUaHJlc2hvbGQgPQorCQlwQ29uZmlnLT5uVmNjVWxNYWNMb3NzVGhyZXNob2xkOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5Sb2FtaW5nVGltZSA9IHBDb25maWctPm5Sb2FtaW5nVGltZTsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uSW5pdGlhbER3ZWxsVGltZSA9IHBDb25maWctPm5Jbml0aWFsRHdlbGxUaW1lOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmluaXRpYWxfc2Nhbl9ub19kZnNfY2hubCA9CisJCQkJCXBDb25maWctPmluaXRpYWxfc2Nhbl9ub19kZnNfY2hubDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uQWN0aXZlTWF4Q2huVGltZSA9IHBDb25maWctPm5BY3RpdmVNYXhDaG5UaW1lOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5BY3RpdmVNaW5DaG5UaW1lID0gcENvbmZpZy0+bkFjdGl2ZU1pbkNoblRpbWU7CisJc21lQ29uZmlnLT5jc3JDb25maWcublBhc3NpdmVNYXhDaG5UaW1lID0gcENvbmZpZy0+blBhc3NpdmVNYXhDaG5UaW1lOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5QYXNzaXZlTWluQ2huVGltZSA9IHBDb25maWctPm5QYXNzaXZlTWluQ2huVGltZTsKKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5BY3RpdmVNYXhDaG5UaW1lQ29uYyA9CisJCXBDb25maWctPm5BY3RpdmVNYXhDaG5UaW1lQ29uYzsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uQWN0aXZlTWluQ2huVGltZUNvbmMgPQorCQlwQ29uZmlnLT5uQWN0aXZlTWluQ2huVGltZUNvbmM7CisJc21lQ29uZmlnLT5jc3JDb25maWcublBhc3NpdmVNYXhDaG5UaW1lQ29uYyA9CisJCXBDb25maWctPm5QYXNzaXZlTWF4Q2huVGltZUNvbmM7CisJc21lQ29uZmlnLT5jc3JDb25maWcublBhc3NpdmVNaW5DaG5UaW1lQ29uYyA9CisJCXBDb25maWctPm5QYXNzaXZlTWluQ2huVGltZUNvbmM7CisJc21lQ29uZmlnLT5jc3JDb25maWcublJlc3RUaW1lQ29uYyA9IHBDb25maWctPm5SZXN0VGltZUNvbmM7CisJc21lQ29uZmlnLT5jc3JDb25maWcubk51bVN0YUNoYW5Db21iaW5lZENvbmMgPQorCQlwQ29uZmlnLT5uTnVtU3RhQ2hhbkNvbWJpbmVkQ29uYzsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uTnVtUDJQQ2hhbkNvbWJpbmVkQ29uYyA9CisJCXBDb25maWctPm5OdW1QMlBDaGFuQ29tYmluZWRDb25jOworCisjZW5kaWYKKwlzbWVDb25maWctPmNzckNvbmZpZy5JczExZVN1cHBvcnRFbmFibGVkID0gcENvbmZpZy0+YjgwMjExZUlzRW5hYmxlZDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5XTU1TdXBwb3J0TW9kZSA9IHBDb25maWctPldtbU1vZGU7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlzbWVDb25maWctPnJybUNvbmZpZy5ycm1FbmFibGVkID0gcENvbmZpZy0+ZlJybUVuYWJsZTsKKwlzbWVDb25maWctPnJybUNvbmZpZy5tYXhSYW5kbkludGVydmFsID0gcENvbmZpZy0+blJybVJhbmRuSW50dmw7CisjZW5kaWYKKwkvKiBSZW1haW5pbmcgY29uZmlnIHBhcmFtcyBub3Qgb2J0YWluZWQgZnJvbSByZWdpc3RyeQorCSAqIE9uIFJGIEVWQiBiZWFjb24gdXNpbmcgY2hhbm5lbCAxLgorCSAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJc21lQ29uZmlnLT5jc3JDb25maWcublZodENoYW5uZWxXaWR0aCA9IHBDb25maWctPnZodENoYW5uZWxXaWR0aDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5lbmFibGVUeEJGID0gcENvbmZpZy0+ZW5hYmxlVHhCRjsKKwlzbWVDb25maWctPmNzckNvbmZpZy50eEJGQ3NuVmFsdWUgPSBwQ29uZmlnLT50eEJGQ3NuVmFsdWU7CisJc21lQ29uZmlnLT5jc3JDb25maWcuZW5hYmxlMngyID0gcENvbmZpZy0+ZW5hYmxlMngyOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmVuYWJsZVZodEZvcjI0R0h6ID0gcENvbmZpZy0+ZW5hYmxlVmh0Rm9yMjRHSHpCYW5kOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmVuYWJsZU11QmZvcm1lZSA9IHBDb25maWctPmVuYWJsZU11QmZvcm1lZTsKKwlzbWVDb25maWctPmNzckNvbmZpZy5lbmFibGVWaHRwQWlkID0gcENvbmZpZy0+ZW5hYmxlVmh0cEFpZDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5lbmFibGVWaHRHaWQgPSBwQ29uZmlnLT5lbmFibGVWaHRHaWQ7CisjZW5kaWYKKwlzbWVDb25maWctPmNzckNvbmZpZy5lbmFibGVBbXBkdVBzID0gcENvbmZpZy0+ZW5hYmxlQW1wZHVQczsKKwlzbWVDb25maWctPmNzckNvbmZpZy5lbmFibGVIdFNtcHMgPSBwQ29uZmlnLT5lbmFibGVIdFNtcHM7CisJc21lQ29uZmlnLT5jc3JDb25maWcuaHRTbXBzID0gcENvbmZpZy0+aHRTbXBzOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLkFkSG9jQ2hhbm5lbDVHID0gcENvbmZpZy0+QWRIb2NDaGFubmVsNUc7CisJc21lQ29uZmlnLT5jc3JDb25maWcuQWRIb2NDaGFubmVsMjQgPSBwQ29uZmlnLT5BZEhvY0NoYW5uZWwyNEc7CisJc21lQ29uZmlnLT5jc3JDb25maWcuUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQgPSAwOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLkhlYXJ0YmVhdFRocmVzaDUwID0gNDA7CisJc21lQ29uZmlnLT5jc3JDb25maWcuYmFuZENhcGFiaWxpdHkgPSBwQ29uZmlnLT5uQmFuZENhcGFiaWxpdHk7CisJaWYgKHBDb25maWctPm5CYW5kQ2FwYWJpbGl0eSA9PSBlQ1NSX0JBTkRfMjQpIHsKKwkJc21lQ29uZmlnLT5jc3JDb25maWcuSXMxMWhTdXBwb3J0RW5hYmxlZCA9IDA7CisJfSBlbHNlIHsKKwkJc21lQ29uZmlnLT5jc3JDb25maWcuSXMxMWhTdXBwb3J0RW5hYmxlZCA9CisJCQlwQ29uZmlnLT5JczExaFN1cHBvcnRFbmFibGVkOworCX0KKwlzbWVDb25maWctPmNzckNvbmZpZy5jYkNob2ljZSA9IDA7CisJc21lQ29uZmlnLT5jc3JDb25maWcuZUJhbmQgPSBwQ29uZmlnLT5uQmFuZENhcGFiaWxpdHk7CisJc21lQ29uZmlnLT5jc3JDb25maWcublR4UG93ZXJDYXAgPSBwQ29uZmlnLT5uVHhQb3dlckNhcDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5mRW5hYmxlQnlwYXNzMTFkID0gcENvbmZpZy0+ZW5hYmxlQnlwYXNzMTFkOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmZFbmFibGVERlNDaG5sU2NhbiA9IHBDb25maWctPmVuYWJsZURGU0NobmxTY2FuOworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5Sb2FtUHJlZmVyNUdIeiA9IHBDb25maWctPm5Sb2FtUHJlZmVyNUdIejsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uUm9hbUludHJhQmFuZCA9IHBDb25maWctPm5Sb2FtSW50cmFCYW5kOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5Qcm9iZXMgPSBwQ29uZmlnLT5uUHJvYmVzOworCisJc21lQ29uZmlnLT5jc3JDb25maWcublJvYW1TY2FuSG9tZUF3YXlUaW1lID0KKwkJcENvbmZpZy0+blJvYW1TY2FuSG9tZUF3YXlUaW1lOworI2VuZGlmCisJc21lQ29uZmlnLT5jc3JDb25maWcuZkZpcnN0U2Nhbk9ubHkyR0NobmwgPQorCQlwQ29uZmlnLT5lbmFibGVGaXJzdFNjYW4yR09ubHk7CisKKwkvKiBGSVhNRSAxMWQgY29uZmlnIGlzIGhhcmRjb2RlZCAqLworCWlmIChDREZfU0FQX01PREUgIT0gaGRkX2dldF9jb25wYXJhbSgpKQorCQlzbWVDb25maWctPmNzckNvbmZpZy5Dc3IxMWRpbmZvLkNoYW5uZWxzLm51bUNoYW5uZWxzID0gMDsKKworCWhkZF9zZXRfcG93ZXJfc2F2ZV9vZmZsb2FkX2NvbmZpZyhwSGRkQ3R4KTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJc21lQ29uZmlnLT5jc3JDb25maWcuY3NyMTFyQ29uZmlnLklzRlRSZXNvdXJjZVJlcVN1cHBvcnRlZCA9CisJCXBDb25maWctPmZGVFJlc291cmNlUmVxU3VwcG9ydGVkOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCA9CisJCXBDb25maWctPmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5NQVdDRW5hYmxlZCA9IHBDb25maWctPk1BV0NFbmFibGVkOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmlzRXNlSW5pRmVhdHVyZUVuYWJsZWQgPQorCQlwQ29uZmlnLT5pc0VzZUluaUZlYXR1cmVFbmFibGVkOworCWlmIChwQ29uZmlnLT5pc0VzZUluaUZlYXR1cmVFbmFibGVkKSB7CisJCXBDb25maWctPmlzRmFzdFRyYW5zaXRpb25FbmFibGVkID0gdHJ1ZTsKKwl9CisjZW5kaWYKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwlzbWVDb25maWctPmNzckNvbmZpZy5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZCA9CisJCXBDb25maWctPmlzRmFzdFRyYW5zaXRpb25FbmFibGVkOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLlJvYW1Sc3NpRGlmZiA9IHBDb25maWctPlJvYW1Sc3NpRGlmZjsKKwlzbWVDb25maWctPmNzckNvbmZpZy5pc1dFU01vZGVFbmFibGVkID0gcENvbmZpZy0+aXNXRVNNb2RlRW5hYmxlZDsKKyNlbmRpZgorCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCA9CisJCXBDb25maWctPmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5iRmFzdFJvYW1JbkNvbkluaUZlYXR1cmVFbmFibGVkID0KKwkJcENvbmZpZy0+YkZhc3RSb2FtSW5Db25JbmlGZWF0dXJlRW5hYmxlZDsKKworCWlmICgwID09IHNtZUNvbmZpZy0+Y3NyQ29uZmlnLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkgeworCQkvKiBEaXNhYmxlIHJvYW1pbmcgaW4gY29uY3VycmVuY3kgaWYgcm9hbSBzY2FuIG9mZmxvYWQgaXMgZGlzYWJsZWQgKi8KKwkJc21lQ29uZmlnLT5jc3JDb25maWcuYkZhc3RSb2FtSW5Db25JbmlGZWF0dXJlRW5hYmxlZCA9IDA7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisJc21lQ29uZmlnLT5jc3JDb25maWcubmVpZ2hib3JSb2FtQ29uZmlnLm5OZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQgPQorCQlwQ29uZmlnLT5uTmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5kZWxheV9iZWZvcmVfdmRldl9zdG9wID0KKwkJcENvbmZpZy0+ZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uZWlnaGJvclJvYW1Db25maWcubk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmID0KKwkJcENvbmZpZy0+bk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5uUm9hbVJlc2NhblJzc2lEaWZmID0KKwkJcENvbmZpZy0+blJvYW1SZXNjYW5Sc3NpRGlmZjsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yU2Nhbk1heENoYW5UaW1lID0KKwkJcENvbmZpZy0+bk5laWdoYm9yU2Nhbk1heENoYW5UaW1lOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JTY2FuTWluQ2hhblRpbWUgPQorCQlwQ29uZmlnLT5uTmVpZ2hib3JTY2FuTWluQ2hhblRpbWU7CisJc21lQ29uZmlnLT5jc3JDb25maWcubmVpZ2hib3JSb2FtQ29uZmlnLm5OZWlnaGJvclNjYW5UaW1lclBlcmlvZCA9CisJCXBDb25maWctPm5OZWlnaGJvclNjYW5QZXJpb2Q7CisJc21lQ29uZmlnLT5jc3JDb25maWcubmVpZ2hib3JSb2FtQ29uZmlnLm5NYXhOZWlnaGJvclJldHJpZXMgPQorCQlwQ29uZmlnLT5uTWF4TmVpZ2hib3JSZXFUcmllczsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2QgPQorCQlwQ29uZmlnLT5uTmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uZWlnaGJvclJvYW1Db25maWcubkVtcHR5U2NhblJlZnJlc2hQZXJpb2QgPQorCQlwQ29uZmlnLT5uRW1wdHlTY2FuUmVmcmVzaFBlcmlvZDsKKwloZGRfc3RyaW5nX3RvX3U4X2FycmF5KHBDb25maWctPm5laWdoYm9yU2NhbkNoYW5MaXN0LAorCQkJICAgICAgIHNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCSAgICAgICBuZWlnaGJvclNjYW5DaGFuTGlzdC5jaGFubmVsTGlzdCwKKwkJCSAgICAgICAmc21lQ29uZmlnLT5jc3JDb25maWcubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJICAgICAgIG5laWdoYm9yU2NhbkNoYW5MaXN0Lm51bUNoYW5uZWxzLAorCQkJICAgICAgIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTik7CisJc21lQ29uZmlnLT5jc3JDb25maWcubmVpZ2hib3JSb2FtQ29uZmlnLm5Sb2FtQm1pc3NGaXJzdEJjbnQgPQorCQlwQ29uZmlnLT5uUm9hbUJtaXNzRmlyc3RCY250OworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5uUm9hbUJtaXNzRmluYWxCY250ID0KKwkJcENvbmZpZy0+blJvYW1CbWlzc0ZpbmFsQmNudDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uZWlnaGJvclJvYW1Db25maWcublJvYW1CZWFjb25Sc3NpV2VpZ2h0ID0KKwkJcENvbmZpZy0+blJvYW1CZWFjb25Sc3NpV2VpZ2h0OworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5uaGlfcnNzaV9zY2FuX21heF9jb3VudCA9CisJCXBDb25maWctPm5oaV9yc3NpX3NjYW5fbWF4X2NvdW50OworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5uaGlfcnNzaV9zY2FuX3Jzc2lfZGVsdGEgPQorCQlwQ29uZmlnLT5uaGlfcnNzaV9zY2FuX3Jzc2lfZGVsdGE7CisJc21lQ29uZmlnLT5jc3JDb25maWcubmVpZ2hib3JSb2FtQ29uZmlnLm5oaV9yc3NpX3NjYW5fZGVsYXkgPQorCQlwQ29uZmlnLT5uaGlfcnNzaV9zY2FuX2RlbGF5OworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5uaGlfcnNzaV9zY2FuX3Jzc2lfdWIgPQorCQlwQ29uZmlnLT5uaGlfcnNzaV9zY2FuX3Jzc2lfdWI7CisjZW5kaWYKKwlzbWVDb25maWctPmNzckNvbmZpZy5hZGRUU1doZW5BQ01Jc09mZiA9IHBDb25maWctPkFkZFRTV2hlbkFDTUlzT2ZmOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmZWYWxpZGF0ZUxpc3QgPSBwQ29uZmlnLT5mVmFsaWRhdGVTY2FuTGlzdDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5hbGxvd0RGU0NoYW5uZWxSb2FtID0gcENvbmZpZy0+YWxsb3dERlNDaGFubmVsUm9hbTsKKworCS8qIEVuYWJsZS9EaXNhYmxlIE1DQyAqLworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmZFbmFibGVNQ0NNb2RlID0gcENvbmZpZy0+ZW5hYmxlTUNDOworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLm1jY19ydHNfY3RzX3Byb3RfZW5hYmxlID0KKwkJCQkJcENvbmZpZy0+bWNjX3J0c19jdHNfcHJvdF9lbmFibGU7CisJc21lQ29uZmlnLT5jc3JDb25maWcubWNjX2JjYXN0X3Byb2JfcmVzcF9lbmFibGUgPQorCQkJCQlwQ29uZmlnLT5tY2NfYmNhc3RfcHJvYl9yZXNwX2VuYWJsZTsKKwlzbWVDb25maWctPmNzckNvbmZpZy5mQWxsb3dNQ0NHT0RpZmZCSSA9IHBDb25maWctPmFsbG93TUNDR09EaWZmQkk7CisKKwkvKiBTY2FuIFJlc3VsdHMgQWdpbmcgVGltZSBvdXQgdmFsdWUgKi8KKwlzbWVDb25maWctPmNzckNvbmZpZy5zY2FuQ2ZnQWdpbmdUaW1lID0gcENvbmZpZy0+c2NhbkFnaW5nVGltZW91dDsKKworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmVuYWJsZVR4TGRwYyA9IHBDb25maWctPmVuYWJsZVR4TGRwYzsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwlzbWVDb25maWctPmNzckNvbmZpZy5jY19zd2l0Y2hfbW9kZSA9IHBDb25maWctPldsYW5NY2NUb1NjY1N3aXRjaE1vZGU7CisjZW5kaWYKKworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmlzQW1zZHVTdXBwb3J0SW5BTVBEVSA9CisJCXBDb25maWctPmlzQW1zZHVTdXBwb3J0SW5BTVBEVTsKKwlzbWVDb25maWctPmNzckNvbmZpZy5uU2VsZWN0NUdIek1hcmdpbiA9IHBDb25maWctPm5TZWxlY3Q1R0h6TWFyZ2luOworCisJc21lQ29uZmlnLT5jc3JDb25maWcuaXNDb2FsZXNpbmdJbklCU1NBbGxvd2VkID0KKwkJcEhkZEN0eC0+Y29uZmlnLT5pc0NvYWxlc2luZ0luSUJTU0FsbG93ZWQ7CisJc21lQ29uZmlnLT5jc3JDb25maWcuaWdub3JlX3BlZXJfZXJwX2luZm8gPQorCQkJCQkJcENvbmZpZy0+aWdub3JlX3BlZXJfZXJwX2luZm87CisJLyogdXBkYXRlIFNTUiBjb25maWcgKi8KKwlzbWVfdXBkYXRlX2VuYWJsZV9zc3IoKHRIYWxIYW5kbGUpIChwSGRkQ3R4LT5oSGFsKSwKKwkJCSAgICAgIHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlU1NSKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCS8qIFVwZGF0ZSBQTk8gb2Zmb2FkIHN0YXR1cyAqLworCXNtZUNvbmZpZy0+cG5vT2ZmbG9hZCA9IHBIZGRDdHgtPmNvbmZpZy0+UG5vT2ZmbG9hZDsKKyNlbmRpZgorCisJLyogVXBkYXRlIG1heGltdW0gaW50ZXJmYWNlcyBpbmZvcm1hdGlvbiAqLworCXNtZUNvbmZpZy0+bWF4X2ludGZfY291bnQgPSBwSGRkQ3R4LT5tYXhfaW50Zl9jb3VudDsKKworCXNtZUNvbmZpZy0+ZkVuYWJsZURlYnVnTG9nID0gcEhkZEN0eC0+Y29uZmlnLT5nRW5hYmxlRGVidWdMb2c7CisKKwlzbWVDb25maWctPmVuYWJsZTVnRUJUID0gcEhkZEN0eC0+Y29uZmlnLT5lbmFibGU1Z0VCVDsKKworCXNtZUNvbmZpZy0+ZW5hYmxlU2VsZlJlY292ZXJ5ID0gcEhkZEN0eC0+Y29uZmlnLT5lbmFibGVTZWxmUmVjb3Zlcnk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmlzUm9hbU9mZmxvYWRFbmFibGVkID0KKwkJcEhkZEN0eC0+Y29uZmlnLT5pc1JvYW1PZmZsb2FkRW5hYmxlZDsKKyNlbmRpZgorCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLmNvbmNfY3VzdG9tX3J1bGUxID0KKwkJcEhkZEN0eC0+Y29uZmlnLT5jb25jX2N1c3RvbV9ydWxlMTsKKwlzbWVDb25maWctPmNzckNvbmZpZy5jb25jX2N1c3RvbV9ydWxlMiA9CisJCXBIZGRDdHgtPmNvbmZpZy0+Y29uY19jdXN0b21fcnVsZTI7CisJc21lQ29uZmlnLT5jc3JDb25maWcuaXNfc3RhX2Nvbm5lY3Rpb25faW5fNWd6X2VuYWJsZWQgPQorCQlwSGRkQ3R4LT5jb25maWctPmlzX3N0YV9jb25uZWN0aW9uX2luXzVnel9lbmFibGVkOworCisJc21lQ29uZmlnLT5mX3N0YV9taXJhY2FzdF9tY2NfcmVzdF90aW1lX3ZhbCA9CisJCXBIZGRDdHgtPmNvbmZpZy0+c3RhX21pcmFjYXN0X21jY19yZXN0X3RpbWVfdmFsOworCisjaWZkZWYgRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFCisJc21lQ29uZmlnLT5zYXBfY2hhbm5lbF9hdm9pZGFuY2UgPQorCQlwSGRkQ3R4LT5jb25maWctPnNhcF9jaGFubmVsX2F2b2lkYW5jZTsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKworCXNtZUNvbmZpZy0+Zl9wcmVmZXJfbm9uX2Rmc19vbl9yYWRhciA9CisJCXBIZGRDdHgtPmNvbmZpZy0+cHJlZmVyX25vbl9kZnNfb25fcmFkYXI7CisKKwlzbWVDb25maWctPmlzX3BzX2VuYWJsZWQgPSBwSGRkQ3R4LT5jb25maWctPmlzX3BzX2VuYWJsZWQ7CisJaGRkX3NldF9maW5lX3RpbWVfbWVhc19jYXAocEhkZEN0eCwgc21lQ29uZmlnKTsKKworCWNkc19zZXRfbXVsdGljYXN0X2xvZ2dpbmcocEhkZEN0eC0+Y29uZmlnLT5tdWx0aWNhc3RfaG9zdF9md19tc2dzKTsKKworCXNtZUNvbmZpZy0+Y3NyQ29uZmlnLnNlbmREZWF1dGhCZWZvcmVDb24gPSBwQ29uZmlnLT5zZW5kRGVhdXRoQmVmb3JlQ29uOworCisJc21lQ29uZmlnLT5wb2xpY3lfbWFuYWdlcl9lbmFibGVkID0KKwkJCXBIZGRDdHgtPmNvbmZpZy0+cG9saWN5X21hbmFnZXJfZW5hYmxlZDsKKwlzbWVDb25maWctPmNzckNvbmZpZy5tYXhfc2Nhbl9jb3VudCA9CisJCQlwSGRkQ3R4LT5jb25maWctPm1heF9zY2FuX2NvdW50OworCisJLyogVXBkYXRlIDgwMi4xMXAgY29uZmlnICovCisJc21lQ29uZmlnLT5jc3JDb25maWcuZW5hYmxlX2RvdDExcCA9CisJCShwSGRkQ3R4LT5jb25maWctPmRvdDExcF9tb2RlICE9IFdMQU5fSEREXzExUF9ESVNBQkxFRCk7CisKKwlzbWVDb25maWctPmR1YWxfbWFjX2ZlYXR1cmVfZGlzYWJsZSA9CisJCXBIZGRDdHgtPmNvbmZpZy0+ZHVhbF9tYWNfZmVhdHVyZV9kaXNhYmxlOworCisJc3RhdHVzID0gc21lX3VwZGF0ZV9jb25maWcocEhkZEN0eC0+aEhhbCwgc21lQ29uZmlnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLCAic21lX3VwZGF0ZV9jb25maWcoKSByZXR1cm4gZmFpbHVyZSAlZCIsCisJCSAgICAgICBzdGF0dXMpOworCX0KKworCWNkZl9tZW1fZnJlZShzbWVDb25maWcpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaGRkX2V4ZWN1dGVfZ2xvYmFsX2NvbmZpZ19jb21tYW5kKCkgLSBleGVjdXRlIHRoZSBnbG9iYWwgY29uZmlnIGNvbW1hbmQKKyAqIEBwSGRkQ3R4OiB0aGUgcG9pbnRlciB0byBoZGQgY29udGV4dAorICogQGNvbW1hbmQ6IHRoZSBjb21tYW5kIHRvIHJ1bgorICoKKyAqIFJldHVybjogdGhlIENERl9TVEFUVVMgcmV0dXJuIGZyb20gaGRkX2V4ZWN1dGVfY29uZmlnX2NvbW1hbmQKKyAqLworQ0RGX1NUQVRVUyBoZGRfZXhlY3V0ZV9nbG9iYWxfY29uZmlnX2NvbW1hbmQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJICAgICBjaGFyICpjb21tYW5kKQoreworCXJldHVybiBoZGRfZXhlY3V0ZV9jb25maWdfY29tbWFuZChnX3JlZ2lzdHJ5X3RhYmxlLAorCQkJCQkgIEFSUkFZX1NJWkUoZ19yZWdpc3RyeV90YWJsZSksCisJCQkJCSAgKHVpbnQ4X3QgKikgcEhkZEN0eC0+Y29uZmlnLAorCQkJCQkgIHBIZGRDdHgsIGNvbW1hbmQpOworfQorCisvKioKKyAqIGhkZF9jZmdfZ2V0X2dsb2JhbF9jb25maWcoKSAtIGdldCB0aGUgY29uZmlndXJhdGlvbiB0YWJsZQorICogQHBIZGRDdHg6IHBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqIEBwQnVmOiBidWZmZXIgdG8gc3RvcmUgdGhlIGNvbmZpZ3VyYXRpb24KKyAqIEBidWZsZW46IHNpemUgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBjb25maWd1cmF0aW9uIGFuZCBidWZmZXIgc2l6ZSBjYW4gY2FycnkKKyAqCQl0aGUgY29udGVudCwgb3RoZXJ3aXNlIENERl9TVEFUVVNfRV9SRVNPVVJDRVMKKyAqLworQ0RGX1NUQVRVUyBoZGRfY2ZnX2dldF9nbG9iYWxfY29uZmlnKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGNoYXIgKnBCdWYsCisJCQkJICAgICBpbnQgYnVmbGVuKQoreworCXJldHVybiBoZGRfY2ZnX2dldF9jb25maWcoZ19yZWdpc3RyeV90YWJsZSwKKwkJCQkgIEFSUkFZX1NJWkUoZ19yZWdpc3RyeV90YWJsZSksCisJCQkJICAodWludDhfdCAqKSBwSGRkQ3R4LT5jb25maWcsIHBIZGRDdHgsIHBCdWYsCisJCQkJICBidWZsZW4pOworfQorCisvKioKKyAqIGhkZF9pc19va2NfbW9kZV9lbmFibGVkKCkgLSByZXR1cm5zIHdoZXRoZXIgT0tDIG1vZGUgaXMgZW5hYmxlZCBvciBub3QKKyAqIEBwSGRkQ3R4OiB0aGUgcG9pbnRlciB0byBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBPS0MgaXMgZW5hYmxlZCwgb3RoZXJ3aXNlIGZhbHNlCisgKi8KK2Jvb2wgaGRkX2lzX29rY19tb2RlX2VuYWJsZWQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKwlpZiAoTlVMTCA9PSBwSGRkQ3R4KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogcEhkZEN0eCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX09LQworCXJldHVybiBwSGRkQ3R4LT5jb25maWctPmlzT2tjSW5pRmVhdHVyZUVuYWJsZWQ7CisjZWxzZQorCXJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCisvKioKKyAqIGhkZF91cGRhdGVfbnNzKCkgLSBVcGRhdGUgdGhlIG51bWJlciBvZiBzcGF0aWFsIHN0cmVhbXMgc3VwcG9ydGVkLgorICogRW5zdXJlIHRoYXQgbnNzIGlzIGVpdGhlciAxIG9yIDIgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBAaGRkX2N0eDogdGhlIHBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqIEBuc3M6IHRoZSBudW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zIHRvIGJlIHVwZGF0ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSBudW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zCisgKiBzdXBwb3J0ZWQgd2hlbiBub3QgaW4gY29ubmVjdGVkIHN0YXRlLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGlmIG5zcyBpcyBjb3JyZWN0bHkgdXBkYXRlZCwKKyAqICAgICAgICAgICAgICBvdGhlcndpc2UgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgd291bGQgYmUgcmV0dXJuZWQKKyAqLworQ0RGX1NUQVRVUyBoZGRfdXBkYXRlX25zcyhoZGRfY29udGV4dF90ICpoZGRfY3R4LCB1aW50OF90IG5zcykKK3sKKwlzdHJ1Y3QgaGRkX2NvbmZpZyAqaGRkX2NvbmZpZyA9IGhkZF9jdHgtPmNvbmZpZzsKKwl1aW50MzJfdCB0ZW1wID0gMDsKKwl1aW50MzJfdCByeF9zdXBwX2RhdGFfcmF0ZSwgdHhfc3VwcF9kYXRhX3JhdGU7CisJYm9vbCBzdGF0dXMgPSB0cnVlOworCXRTaXJNYWNIVENhcGFiaWxpdHlJbmZvICpodF9jYXBfaW5mbzsKKwl1aW50OF90IG1jc19zZXRbU0laRV9PRl9TVVBQT1JURURfTUNTX1NFVF0gPSB7MH07CisJdWludDhfdCBtY3Nfc2V0X3RlbXBbU0laRV9PRl9TVVBQT1JURURfTUNTX1NFVF07CisJdWludDMyX3QgdmFsOworCXVpbnQxNl90IHZhbDE2OworCXVpbnQ4X3QgZW5hYmxlMngyOworCisJaWYgKChuc3MgPT0gMikgJiYgKGhkZF9jdHgtPm51bV9yZl9jaGFpbnMgIT0gMikpIHsKKwkJaGRkTG9nKExPR0UsICJObyBzdXBwb3J0IGZvciAyIHNwYXRpYWwgc3RyZWFtcyIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWVuYWJsZTJ4MiA9IChuc3MgPT0gMSkgPyAwIDogMTsKKworCWlmIChoZGRfY29uZmlnLT5lbmFibGUyeDIgPT0gZW5hYmxlMngyKSB7CisJCWhkZExvZyhMT0dFLCAiTlNTIHNhbWUgYXMgcmVxdWVzdGVkIik7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJaWYgKHRydWUgPT0gc21lX2lzX2FueV9zZXNzaW9uX2luX2Nvbm5lY3RlZF9zdGF0ZShoZGRfY3R4LT5oSGFsKSkgeworCQloZGRMb2coTE9HRSwgIkNvbm5lY3RlZCBzZXNzaW9ucyBwcmVzZW50LCBEbyBub3QgY2hhbmdlIE5TUyIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWhkZF9jb25maWctPmVuYWJsZTJ4MiA9IGVuYWJsZTJ4MjsKKworCWlmICghaGRkX2NvbmZpZy0+ZW5hYmxlMngyKSB7CisJCS8qIDF4MSAqLworCQlyeF9zdXBwX2RhdGFfcmF0ZSA9IEhERF9WSFRfUlhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFXzFfMTsKKwkJdHhfc3VwcF9kYXRhX3JhdGUgPSBIRERfVkhUX1RYX0hJR0hFU1RfU1VQUE9SVEVEX0RBVEFfUkFURV8xXzE7CisJfSBlbHNlIHsKKwkJLyogMngyICovCisJCXJ4X3N1cHBfZGF0YV9yYXRlID0gSEREX1ZIVF9SWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEVfMl8yOworCQl0eF9zdXBwX2RhdGFfcmF0ZSA9IEhERF9WSFRfVFhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFXzJfMjsKKwl9CisKKwkvKiBVcGRhdGUgUnggSGlnaGVzdCBMb25nIEdJIGRhdGEgUmF0ZSAqLworCWlmIChzbWVfY2ZnX3NldF9pbnQoaGRkX2N0eC0+aEhhbCwKKwkJCSAgICBXTklfQ0ZHX1ZIVF9SWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEUsCisJCQkgICAgcnhfc3VwcF9kYXRhX3JhdGUpID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCXN0YXR1cyA9IGZhbHNlOworCQloZGRMb2coTE9HRSwKKwkJCSJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1ZIVF9SWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEUgdG8gQ0ZHIik7CisJfQorCisJLyogVXBkYXRlIFR4IEhpZ2hlc3QgTG9uZyBHSSBkYXRhIFJhdGUgKi8KKwlpZiAoc21lX2NmZ19zZXRfaW50KGhkZF9jdHgtPmhIYWwsCisJCQkgICAgV05JX0NGR19WSFRfVFhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFLAorCQkJICAgIHR4X3N1cHBfZGF0YV9yYXRlKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlzdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCQkiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19WSFRfVFhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFIHRvIENGRyIpOworCX0KKworCXNtZV9jZmdfZ2V0X2ludChoZGRfY3R4LT5oSGFsLCBXTklfQ0ZHX0hUX0NBUF9JTkZPLCAmdGVtcCk7CisJdmFsMTYgPSAodWludDE2X3QpdGVtcDsKKwlodF9jYXBfaW5mbyA9ICh0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyAqKSZ2YWwxNjsKKwlpZiAoIShoZGRfY3R4LT5odF90eF9zdGJjX3N1cHBvcnRlZCAmJiBoZGRfY29uZmlnLT5lbmFibGUyeDIpKQorCQlodF9jYXBfaW5mby0+dHhTVEJDID0gMDsKKwllbHNlCisJCWh0X2NhcF9pbmZvLT50eFNUQkMgPSBoZGRfY29uZmlnLT5lbmFibGVUeFNUQkM7CisJdGVtcCA9IHZhbDE2OworCWlmIChzbWVfY2ZnX3NldF9pbnQoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19IVF9DQVBfSU5GTywKKwkJCSAgICB0ZW1wKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlzdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0hUX0NBUF9JTkZPIHRvIENGRyIpOworCX0KKworCXNtZV9jZmdfZ2V0X2ludChoZGRfY3R4LT5oSGFsLCBXTklfQ0ZHX1ZIVF9CQVNJQ19NQ1NfU0VULCAmdGVtcCk7CisJdGVtcCA9ICh0ZW1wICYgMHhGRkZDKSB8IGhkZF9jb25maWctPnZodFJ4TUNTOworCWlmIChoZGRfY29uZmlnLT5lbmFibGUyeDIpCisJCXRlbXAgPSAodGVtcCAmIDB4RkZGMykgfCAoaGRkX2NvbmZpZy0+dmh0UnhNQ1MyeDIgPDwgMik7CisJZWxzZQorCQl0ZW1wIHw9IDB4MDAwQzsKKworCWlmIChzbWVfY2ZnX3NldF9pbnQoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19WSFRfQkFTSUNfTUNTX1NFVCwKKwkJCSAgICB0ZW1wKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlzdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsCisJCQkiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19WSFRfQkFTSUNfTUNTX1NFVCB0byBDRkciKTsKKwl9CisKKwlzbWVfY2ZnX2dldF9pbnQoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19WSFRfUlhfTUNTX01BUCwgJnRlbXApOworCXRlbXAgPSAodGVtcCAmIDB4RkZGQykgfCBoZGRfY29uZmlnLT52aHRSeE1DUzsKKwlpZiAoaGRkX2NvbmZpZy0+ZW5hYmxlMngyKQorCQl0ZW1wID0gKHRlbXAgJiAweEZGRjMpIHwgKGhkZF9jb25maWctPnZodFJ4TUNTMngyIDw8IDIpOworCWVsc2UKKwkJdGVtcCB8PSAweDAwMEM7CisKKwlpZiAoc21lX2NmZ19zZXRfaW50KGhkZF9jdHgtPmhIYWwsIFdOSV9DRkdfVkhUX1JYX01DU19NQVAsCisJCQkgICAgdGVtcCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJc3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19WSFRfUlhfTUNTX01BUCB0byBDRkciKTsKKwl9CisKKwlzbWVfY2ZnX2dldF9pbnQoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19WSFRfVFhfTUNTX01BUCwgJnRlbXApOworCXRlbXAgPSAodGVtcCAmIDB4RkZGQykgfCBoZGRfY29uZmlnLT52aHRUeE1DUzsKKwlpZiAoaGRkX2NvbmZpZy0+ZW5hYmxlMngyKQorCQl0ZW1wID0gKHRlbXAgJiAweEZGRjMpIHwgKGhkZF9jb25maWctPnZodFR4TUNTMngyIDw8IDIpOworCWVsc2UKKwkJdGVtcCB8PSAweDAwMEM7CisKKwlpZiAoc21lX2NmZ19zZXRfaW50KGhkZF9jdHgtPmhIYWwsIFdOSV9DRkdfVkhUX1RYX01DU19NQVAsCisJCQkgICAgdGVtcCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJc3RhdHVzID0gZmFsc2U7CisJCWhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19WSFRfVFhfTUNTX01BUCB0byBDRkciKTsKKwl9CisKKyNkZWZpbmUgV0xBTl9IRERfUlhfTUNTX0FMTF9OU1RSRUFNX1JBVEVTIDB4ZmYKKwl2YWwgPSBTSVpFX09GX1NVUFBPUlRFRF9NQ1NfU0VUOworCXNtZV9jZmdfZ2V0X3N0cihoZGRfY3R4LT5oSGFsLCBXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorCQkJbWNzX3NldF90ZW1wLCAmdmFsKTsKKworCW1jc19zZXRbMF0gPSBtY3Nfc2V0X3RlbXBbMF07CisJaWYgKGhkZF9jb25maWctPmVuYWJsZTJ4MikKKwkJZm9yICh2YWwgPSAwOyB2YWwgPCBuc3M7IHZhbCsrKQorCQkJbWNzX3NldFt2YWxdID0gV0xBTl9IRERfUlhfTUNTX0FMTF9OU1RSRUFNX1JBVEVTOworCisJaWYgKHNtZV9jZmdfc2V0X3N0cihoZGRfY3R4LT5oSGFsLCBXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorCQkJICAgIG1jc19zZXQsCisJCQkgICAgU0laRV9PRl9TVVBQT1JURURfTUNTX1NFVCkgPT0KKwkJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQlzdGF0dXMgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsICJDb3VsZCBub3QgcGFzcyBvbiBNQ1MgU0VUIHRvIENGRyIpOworCX0KKyN1bmRlZiBXTEFOX0hERF9SWF9NQ1NfQUxMX05TVFJFQU1fUkFURVMKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX3VwZGF0ZV9uc3MoaGRkX2N0eC0+aEhhbCwgbnNzKSkKKwkJc3RhdHVzID0gZmFsc2U7CisKKwlyZXR1cm4gKHN0YXR1cyA9PSBmYWxzZSkgPyBDREZfU1RBVFVTX0VfRkFJTFVSRSA6IENERl9TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9jZmc4MDIxMS5jIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX2NmZzgwMjExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxMjYyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9jZmc4MDIxMS5jCkBAIC0wLDAgKzEsMTA3MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiB3bGFuX2hkZF9jZmc4MDIxMS5jCisgKgorICogV0xBTiBIb3N0IERldmljZSBEcml2ZXIgY2ZnODAyMTEgQVBJcyBpbXBsZW1lbnRhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaW5jbHVkZXMuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisjaW5jbHVkZSA8Y2RmX3RyYWNlLmg+CisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8d2xhbl9oZGRfd293bC5oPgorI2luY2x1ZGUgPGFuaV9nbG9iYWwuaD4KKyNpbmNsdWRlICJzaXJfcGFyYW1zLmgiCisjaW5jbHVkZSAiZG90MTFmLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfYXNzb2MuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF93ZXh0LmgiCisjaW5jbHVkZSAic21lX2FwaS5oIgorI2luY2x1ZGUgIndsYW5faGRkX3AycC5oIgorI2luY2x1ZGUgIndsYW5faGRkX2NmZzgwMjExLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfaG9zdGFwZC5oIgorI2luY2x1ZGUgIndsYW5faGRkX3NvZnRhcF90eF9yeC5oIgorI2luY2x1ZGUgIndsYW5faGRkX21haW4uaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9wb3dlci5oIgorI2luY2x1ZGUgIndsYW5faGRkX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RzX3V0aWxzLmgiCisjaW5jbHVkZSAiY2RzX3NjaGVkLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfc2Nhbi5oIgorI2luY2x1ZGUgPHFjX3NhcF9pb2N0bC5oPgorI2luY2x1ZGUgIndsYW5faGRkX3RkbHMuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF93bW0uaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9taXNjLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbmFuLmgiCisjaW5jbHVkZSA8d2xhbl9oZGRfaXBhLmg+CisjaW5jbHVkZSAid2xhbl9sb2dnaW5nX3NvY2tfc3ZjLmgiCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorI2luY2x1ZGUgIndsYW5faGRkX2V4dF9zY2FuLmgiCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCisjaW5jbHVkZSAid2xhbl9oZGRfc3RhdHMuaCIKKyNlbmRpZgorI2luY2x1ZGUgImNkc19jb25jdXJyZW5jeS5oIgorI2luY2x1ZGUgInF3bGFuX3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9tZW1kdW1wLmgiCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9vY2IuaCIKKworI2RlZmluZSBnX21vZGVfcmF0ZXNfc2l6ZSAoMTIpCisjZGVmaW5lIGFfbW9kZV9yYXRlc19zaXplICg4KQorI2RlZmluZSBGUkVRX0JBU0VfODAyMTFHICAgICAgICAgICgyNDA3KQorI2RlZmluZSBGUkVRX0JBTkRfRElGRl84MDIxMUcgICAgICg1KQorI2RlZmluZSBHRVRfSUVfTEVOX0lOX0JTU19ERVNDKGxlbkluQnNzKSAobGVuSW5Cc3MgKyBzaXplb2YobGVuSW5Cc3MpIC0gXAorCQkJCQkgICAoKHVpbnRwdHJfdClPRkZTRVRfT0YodFNpckJzc0Rlc2NyaXB0aW9uLCBpZUZpZWxkcykpKQorCisvKgorICogQW5kcm9pZCBDVFMgdmVyaWZpZXIgbmVlZHMgYXRsZWFzdCB0aGlzIG11Y2ggd2FpdCB0aW1lIChpbiBtc2VjKQorICovCisjZGVmaW5lIE1BWF9SRU1BSU5fT05fQ0hBTk5FTF9EVVJBVElPTiAoNTAwMCkKKworLyoKKyAqIFJlZmVyIEB0Q2ZnUHJvdGVjdGlvbiBzdHJ1Y3R1cmUgZm9yIGRlZmluaXRpb24gb2YgdGhlIGJpdCBtYXAuCisgKiBiZWxvdyB2YWx1ZSBpcyBvYnRhaW5lZCBieSBzZXR0aW5nIHRoZSBmb2xsb3dpbmcgYml0LWZpZWxkcy4KKyAqIGVuYWJsZSBvYnNzLCBmcm9tbGxiLCBvdmVybGFwT0JTUyBhbmQgb3ZlcmxhcEZyb21sbGIgcHJvdGVjdGlvbi4KKyAqLworI2RlZmluZSBJQlNTX0NGR19QUk9URUNUSU9OX0VOQUJMRV9NQVNLIDB4ODI4MgorCisjZGVmaW5lIEhERDJHSFpDSEFOKGZyZXEsIGNoYW4sIGZsYWcpICAgeyAgICAgXAorCQkuYmFuZCA9ICBJRUVFODAyMTFfQkFORF8yR0haLCBcCisJCS5jZW50ZXJfZnJlcSA9IChmcmVxKSwgXAorCQkuaHdfdmFsdWUgPSAoY2hhbiksIFwKKwkJLmZsYWdzID0gKGZsYWcpLCBcCisJCS5tYXhfYW50ZW5uYV9nYWluID0gMCwgXAorCQkubWF4X3Bvd2VyID0gMzAsIFwKK30KKworI2RlZmluZSBIREQ1R0haQ0hBTihmcmVxLCBjaGFuLCBmbGFnKSAgIHsgICAgIFwKKwkJLmJhbmQgPSAgSUVFRTgwMjExX0JBTkRfNUdIWiwgXAorCQkuY2VudGVyX2ZyZXEgPSAoZnJlcSksIFwKKwkJLmh3X3ZhbHVlID0gKGNoYW4pLCBcCisJCS5mbGFncyA9IChmbGFnKSwgXAorCQkubWF4X2FudGVubmFfZ2FpbiA9IDAsIFwKKwkJLm1heF9wb3dlciA9IDMwLCBcCit9CisKKyNkZWZpbmUgSEREX0dfTU9ERV9SQVRFVEFCKHJhdGUsIHJhdGVfaWQsIGZsYWcpCVwKKwl7IFwKKwkJLmJpdHJhdGUgPSByYXRlLCBcCisJCS5od192YWx1ZSA9IHJhdGVfaWQsIFwKKwkJLmZsYWdzID0gZmxhZywgXAorCX0KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjZGVmaW5lIFdMQU5fQUtNX1NVSVRFX0ZUXzgwMjFYICAgICAgICAgMHgwMDBGQUMwMworI2RlZmluZSBXTEFOX0FLTV9TVUlURV9GVF9QU0sgICAgICAgICAgIDB4MDAwRkFDMDQKKyNlbmRpZgorCisjZGVmaW5lIEhERF9DSEFOTkVMXzE0IDE0CisjZGVmaW5lIENPTk5FQ1RJT05fVVBEQVRFX1RJTUVPVVQgNTAwCisKK3N0YXRpYyBjb25zdCB1MzIgaGRkX2NpcGhlcl9zdWl0ZXNbXSA9IHsKKwlXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCwKKwlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQsCisJV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisjZGVmaW5lIFdMQU5fQ0lQSEVSX1NVSVRFX0JUSyAweDAwNDA5NmZlICAgICAgICAvKiB1c2UgZm9yIEJUSyAqLworI2RlZmluZSBXTEFOX0NJUEhFUl9TVUlURV9LUksgMHgwMDQwOTZmZiAgICAgICAgLyogdXNlIGZvciBLUksgKi8KKwlXTEFOX0NJUEhFUl9TVUlURV9CVEssCisJV0xBTl9DSVBIRVJfU1VJVEVfS1JLLAorCVdMQU5fQ0lQSEVSX1NVSVRFX0NDTVAsCisjZWxzZQorCVdMQU5fQ0lQSEVSX1NVSVRFX0NDTVAsCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCVdMQU5fQ0lQSEVSX1NVSVRFX1NNUzQsCisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUMsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgaGRkX2NoYW5uZWxzXzJfNF9naHpbXSA9IHsKKwlIREQyR0haQ0hBTigyNDEyLCAxLCAwKSwKKwlIREQyR0haQ0hBTigyNDE3LCAyLCAwKSwKKwlIREQyR0haQ0hBTigyNDIyLCAzLCAwKSwKKwlIREQyR0haQ0hBTigyNDI3LCA0LCAwKSwKKwlIREQyR0haQ0hBTigyNDMyLCA1LCAwKSwKKwlIREQyR0haQ0hBTigyNDM3LCA2LCAwKSwKKwlIREQyR0haQ0hBTigyNDQyLCA3LCAwKSwKKwlIREQyR0haQ0hBTigyNDQ3LCA4LCAwKSwKKwlIREQyR0haQ0hBTigyNDUyLCA5LCAwKSwKKwlIREQyR0haQ0hBTigyNDU3LCAxMCwgMCksCisJSEREMkdIWkNIQU4oMjQ2MiwgMTEsIDApLAorCUhERDJHSFpDSEFOKDI0NjcsIDEyLCAwKSwKKwlIREQyR0haQ0hBTigyNDcyLCAxMywgMCksCisJSEREMkdIWkNIQU4oMjQ4NCwgMTQsIDApLAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBoZGRfc29jaWFsX2NoYW5uZWxzXzJfNF9naHpbXSA9IHsKKwlIREQyR0haQ0hBTigyNDEyLCAxLCAwKSwKKwlIREQyR0haQ0hBTigyNDM3LCA2LCAwKSwKKwlIREQyR0haQ0hBTigyNDYyLCAxMSwgMCksCit9OworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGhkZF9jaGFubmVsc181X2doeltdID0geworCUhERDVHSFpDSEFOKDQ5MjAsIDI0MCwgMCksCisJSERENUdIWkNIQU4oNDk0MCwgMjQ0LCAwKSwKKwlIREQ1R0haQ0hBTig0OTYwLCAyNDgsIDApLAorCUhERDVHSFpDSEFOKDQ5ODAsIDI1MiwgMCksCisJSERENUdIWkNIQU4oNTA0MCwgMjA4LCAwKSwKKwlIREQ1R0haQ0hBTig1MDYwLCAyMTIsIDApLAorCUhERDVHSFpDSEFOKDUwODAsIDIxNiwgMCksCisJSERENUdIWkNIQU4oNTE4MCwgMzYsIDApLAorCUhERDVHSFpDSEFOKDUyMDAsIDQwLCAwKSwKKwlIREQ1R0haQ0hBTig1MjIwLCA0NCwgMCksCisJSERENUdIWkNIQU4oNTI0MCwgNDgsIDApLAorCUhERDVHSFpDSEFOKDUyNjAsIDUyLCAwKSwKKwlIREQ1R0haQ0hBTig1MjgwLCA1NiwgMCksCisJSERENUdIWkNIQU4oNTMwMCwgNjAsIDApLAorCUhERDVHSFpDSEFOKDUzMjAsIDY0LCAwKSwKKwlIREQ1R0haQ0hBTig1NTAwLCAxMDAsIDApLAorCUhERDVHSFpDSEFOKDU1MjAsIDEwNCwgMCksCisJSERENUdIWkNIQU4oNTU0MCwgMTA4LCAwKSwKKwlIREQ1R0haQ0hBTig1NTYwLCAxMTIsIDApLAorCUhERDVHSFpDSEFOKDU1ODAsIDExNiwgMCksCisJSERENUdIWkNIQU4oNTYwMCwgMTIwLCAwKSwKKwlIREQ1R0haQ0hBTig1NjIwLCAxMjQsIDApLAorCUhERDVHSFpDSEFOKDU2NDAsIDEyOCwgMCksCisJSERENUdIWkNIQU4oNTY2MCwgMTMyLCAwKSwKKwlIREQ1R0haQ0hBTig1NjgwLCAxMzYsIDApLAorCUhERDVHSFpDSEFOKDU3MDAsIDE0MCwgMCksCisJSERENUdIWkNIQU4oNTcyMCwgMTQ0LCAwKSwKKwlIREQ1R0haQ0hBTig1NzQ1LCAxNDksIDApLAorCUhERDVHSFpDSEFOKDU3NjUsIDE1MywgMCksCisJSERENUdIWkNIQU4oNTc4NSwgMTU3LCAwKSwKKwlIREQ1R0haQ0hBTig1ODA1LCAxNjEsIDApLAorCUhERDVHSFpDSEFOKDU4MjUsIDE2NSwgMCksCisjaWZuZGVmIEZFQVRVUkVfU1RBVElDQUxMWV9BRERfMTFQX0NIQU5ORUxTCisJSERENUdIWkNIQU4oNTg1MiwgMTcwLCAwKSwKKwlIREQ1R0haQ0hBTig1ODU1LCAxNzEsIDApLAorCUhERDVHSFpDSEFOKDU4NjAsIDE3MiwgMCksCisJSERENUdIWkNIQU4oNTg2NSwgMTczLCAwKSwKKwlIREQ1R0haQ0hBTig1ODcwLCAxNzQsIDApLAorCUhERDVHSFpDSEFOKDU4NzUsIDE3NSwgMCksCisJSERENUdIWkNIQU4oNTg4MCwgMTc2LCAwKSwKKwlIREQ1R0haQ0hBTig1ODg1LCAxNzcsIDApLAorCUhERDVHSFpDSEFOKDU4OTAsIDE3OCwgMCksCisJSERENUdIWkNIQU4oNTg5NSwgMTc5LCAwKSwKKwlIREQ1R0haQ0hBTig1OTAwLCAxODAsIDApLAorCUhERDVHSFpDSEFOKDU5MDUsIDE4MSwgMCksCisJSERENUdIWkNIQU4oNTkxMCwgMTgyLCAwKSwKKwlIREQ1R0haQ0hBTig1OTE1LCAxODMsIDApLAorCUhERDVHSFpDSEFOKDU5MjAsIDE4NCwgMCksCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgZ19tb2RlX3JhdGVzW10gPSB7CisJSEREX0dfTU9ERV9SQVRFVEFCKDEwLCAweDEsIDApLAorCUhERF9HX01PREVfUkFURVRBQigyMCwgMHgyLCAwKSwKKwlIRERfR19NT0RFX1JBVEVUQUIoNTUsIDB4NCwgMCksCisJSEREX0dfTU9ERV9SQVRFVEFCKDExMCwgMHg4LCAwKSwKKwlIRERfR19NT0RFX1JBVEVUQUIoNjAsIDB4MTAsIDApLAorCUhERF9HX01PREVfUkFURVRBQig5MCwgMHgyMCwgMCksCisJSEREX0dfTU9ERV9SQVRFVEFCKDEyMCwgMHg0MCwgMCksCisJSEREX0dfTU9ERV9SQVRFVEFCKDE4MCwgMHg4MCwgMCksCisJSEREX0dfTU9ERV9SQVRFVEFCKDI0MCwgMHgxMDAsIDApLAorCUhERF9HX01PREVfUkFURVRBQigzNjAsIDB4MjAwLCAwKSwKKwlIRERfR19NT0RFX1JBVEVUQUIoNDgwLCAweDQwMCwgMCksCisJSEREX0dfTU9ERV9SQVRFVEFCKDU0MCwgMHg4MDAsIDApLAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBhX21vZGVfcmF0ZXNbXSA9IHsKKwlIRERfR19NT0RFX1JBVEVUQUIoNjAsIDB4MTAsIDApLAorCUhERF9HX01PREVfUkFURVRBQig5MCwgMHgyMCwgMCksCisJSEREX0dfTU9ERV9SQVRFVEFCKDEyMCwgMHg0MCwgMCksCisJSEREX0dfTU9ERV9SQVRFVEFCKDE4MCwgMHg4MCwgMCksCisJSEREX0dfTU9ERV9SQVRFVEFCKDI0MCwgMHgxMDAsIDApLAorCUhERF9HX01PREVfUkFURVRBQigzNjAsIDB4MjAwLCAwKSwKKwlIRERfR19NT0RFX1JBVEVUQUIoNDgwLCAweDQwMCwgMCksCisJSEREX0dfTU9ERV9SQVRFVEFCKDU0MCwgMHg4MDAsIDApLAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgd2xhbl9oZGRfYmFuZF8yXzRfZ2h6ID0geworCS5jaGFubmVscyA9IGhkZF9jaGFubmVsc18yXzRfZ2h6LAorCS5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShoZGRfY2hhbm5lbHNfMl80X2doeiksCisJLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haLAorCS5iaXRyYXRlcyA9IGdfbW9kZV9yYXRlcywKKwkubl9iaXRyYXRlcyA9IGdfbW9kZV9yYXRlc19zaXplLAorCS5odF9jYXAuaHRfc3VwcG9ydGVkID0gMSwKKwkuaHRfY2FwLmNhcCA9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwCisJCSAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxECisJCSAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDAKKwkJICAgICAgfCBJRUVFODAyMTFfSFRfQ0FQX0xTSUdfVFhPUF9QUk9UCisJCSAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfCBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCwKKwkuaHRfY2FwLmFtcGR1X2ZhY3RvciA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorCS5odF9jYXAuYW1wZHVfZGVuc2l0eSA9IElFRUU4MDIxMV9IVF9NUERVX0RFTlNJVFlfMTYsCisJLmh0X2NhcC5tY3MucnhfbWFzayA9IHsweGZmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLH0sCisJLmh0X2NhcC5tY3MucnhfaGlnaGVzdCA9IGNwdV90b19sZTE2KDcyKSwKKwkuaHRfY2FwLm1jcy50eF9wYXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUQsCit9OworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCB3bGFuX2hkZF9iYW5kX3AycF8yXzRfZ2h6ID0geworCS5jaGFubmVscyA9IGhkZF9zb2NpYWxfY2hhbm5lbHNfMl80X2doeiwKKwkubl9jaGFubmVscyA9IEFSUkFZX1NJWkUoaGRkX3NvY2lhbF9jaGFubmVsc18yXzRfZ2h6KSwKKwkuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFosCisJLmJpdHJhdGVzID0gZ19tb2RlX3JhdGVzLAorCS5uX2JpdHJhdGVzID0gZ19tb2RlX3JhdGVzX3NpemUsCisJLmh0X2NhcC5odF9zdXBwb3J0ZWQgPSAxLAorCS5odF9jYXAuY2FwID0gSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAKKwkJICAgICAgfCBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQKKwkJICAgICAgfCBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MCB8IElFRUU4MDIxMV9IVF9DQVBfTFNJR19UWE9QX1BST1QsCisJLmh0X2NhcC5hbXBkdV9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKKwkuaHRfY2FwLmFtcGR1X2RlbnNpdHkgPSBJRUVFODAyMTFfSFRfTVBEVV9ERU5TSVRZXzE2LAorCS5odF9jYXAubWNzLnJ4X21hc2sgPSB7MHhmZiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCx9LAorCS5odF9jYXAubWNzLnJ4X2hpZ2hlc3QgPSBjcHVfdG9fbGUxNig3MiksCisJLmh0X2NhcC5tY3MudHhfcGFyYW1zID0gSUVFRTgwMjExX0hUX01DU19UWF9ERUZJTkVELAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgd2xhbl9oZGRfYmFuZF81X2doeiA9IHsKKwkuY2hhbm5lbHMgPSBoZGRfY2hhbm5lbHNfNV9naHosCisJLm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGhkZF9jaGFubmVsc181X2doeiksCisJLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLAorCS5iaXRyYXRlcyA9IGFfbW9kZV9yYXRlcywKKwkubl9iaXRyYXRlcyA9IGFfbW9kZV9yYXRlc19zaXplLAorCS5odF9jYXAuaHRfc3VwcG9ydGVkID0gMSwKKwkuaHRfY2FwLmNhcCA9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwCisJCSAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxECisJCSAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDAKKwkJICAgICAgfCBJRUVFODAyMTFfSFRfQ0FQX0xTSUdfVFhPUF9QUk9UCisJCSAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfCBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCwKKwkuaHRfY2FwLmFtcGR1X2ZhY3RvciA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorCS5odF9jYXAuYW1wZHVfZGVuc2l0eSA9IElFRUU4MDIxMV9IVF9NUERVX0RFTlNJVFlfMTYsCisJLmh0X2NhcC5tY3MucnhfbWFzayA9IHsweGZmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLH0sCisJLmh0X2NhcC5tY3MucnhfaGlnaGVzdCA9IGNwdV90b19sZTE2KDcyKSwKKwkuaHRfY2FwLm1jcy50eF9wYXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUQsCisJLnZodF9jYXAudmh0X3N1cHBvcnRlZCA9IDEsCit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBjb250YWluIGluZm9ybWF0aW9uIHdoYXQga2luZCBvZiBmcmFtZSBhcmUgZXhwZWN0ZWQgaW4KKyAgICAgVFgvUlggZGlyZWN0aW9uIGZvciBlYWNoIGtpbmQgb2YgaW50ZXJmYWNlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eHJ4X3N0eXBlcworCXdsYW5faGRkX3R4cnhfc3R5cGVzW05VTV9OTDgwMjExX0lGVFlQRVNdID0geworCVtOTDgwMjExX0lGVFlQRV9TVEFUSU9OXSA9IHsKKwkJLnR4ID0gMHhmZmZmLAorCQkucnggPSBCSVQoU0lSX01BQ19NR01UX0FDVElPTikgfAorCQkgICAgICBCSVQoU0lSX01BQ19NR01UX1BST0JFX1JFUSksCisJfSwKKwlbTkw4MDIxMV9JRlRZUEVfQVBdID0geworCQkudHggPSAweGZmZmYsCisJCS5yeCA9IEJJVChTSVJfTUFDX01HTVRfQVNTT0NfUkVRKSB8CisJCSAgICAgIEJJVChTSVJfTUFDX01HTVRfUkVBU1NPQ19SRVEpIHwKKwkJICAgICAgQklUKFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpIHwKKwkJICAgICAgQklUKFNJUl9NQUNfTUdNVF9ESVNBU1NPQykgfAorCQkgICAgICBCSVQoU0lSX01BQ19NR01UX0FVVEgpIHwKKwkJICAgICAgQklUKFNJUl9NQUNfTUdNVF9ERUFVVEgpIHwKKwkJICAgICAgQklUKFNJUl9NQUNfTUdNVF9BQ1RJT04pLAorCX0sCisJW05MODAyMTFfSUZUWVBFX0FESE9DXSA9IHsKKwkJLnR4ID0gMHhmZmZmLAorCQkucnggPSBCSVQoU0lSX01BQ19NR01UX0FTU09DX1JFUSkgfAorCQkgICAgICBCSVQoU0lSX01BQ19NR01UX1JFQVNTT0NfUkVRKSB8CisJCSAgICAgIEJJVChTSVJfTUFDX01HTVRfUFJPQkVfUkVRKSB8CisJCSAgICAgIEJJVChTSVJfTUFDX01HTVRfRElTQVNTT0MpIHwKKwkJICAgICAgQklUKFNJUl9NQUNfTUdNVF9BVVRIKSB8CisJCSAgICAgIEJJVChTSVJfTUFDX01HTVRfREVBVVRIKSB8CisJCSAgICAgIEJJVChTSVJfTUFDX01HTVRfQUNUSU9OKSwKKwl9LAorCVtOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UXSA9IHsKKwkJLnR4ID0gMHhmZmZmLAorCQkucnggPSBCSVQoU0lSX01BQ19NR01UX0FDVElPTikgfAorCQkgICAgICBCSVQoU0lSX01BQ19NR01UX1BST0JFX1JFUSksCisJfSwKKwlbTkw4MDIxMV9JRlRZUEVfUDJQX0dPXSA9IHsKKwkJLyogVGhpcyBpcyBhbHNvIHNhbWUgYXMgZm9yIFNvZnRBUCAqLworCQkudHggPSAweGZmZmYsCisJCS5yeCA9IEJJVChTSVJfTUFDX01HTVRfQVNTT0NfUkVRKSB8CisJCSAgICAgIEJJVChTSVJfTUFDX01HTVRfUkVBU1NPQ19SRVEpIHwKKwkJICAgICAgQklUKFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpIHwKKwkJICAgICAgQklUKFNJUl9NQUNfTUdNVF9ESVNBU1NPQykgfAorCQkgICAgICBCSVQoU0lSX01BQ19NR01UX0FVVEgpIHwKKwkJICAgICAgQklUKFNJUl9NQUNfTUdNVF9ERUFVVEgpIHwKKwkJICAgICAgQklUKFNJUl9NQUNfTUdNVF9BQ1RJT04pLAorCX0sCit9OworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA0LCAwKSkKKy8qIEludGVyZmFjZSBsaW1pdHMgYW5kIGNvbWJpbmF0aW9ucyByZWdpc3RlcmVkIGJ5IHRoZSBkcml2ZXIgKi8KKworLyogU1RBICggKyBTVEEgKSBjb21iaW5hdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQKKwl3bGFuX2hkZF9zdGFfaWZhY2VfbGltaXRbXSA9IHsKKwl7CisJCS5tYXggPSAzLCAgICAgICAvKiBwMnAwIGlzIGEgU1RBIGFzIHdlbGwgKi8KKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAorCX0sCit9OworCisvKiBBREhPQyAoSUJTUykgbGltaXQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0CisJd2xhbl9oZGRfYWRob2NfaWZhY2VfbGltaXRbXSA9IHsKKwl7CisJCS5tYXggPSAxLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCisJfSwKKwl7CisJCS5tYXggPSAxLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpLAorCX0sCit9OworCisvKiBBUCAoICsgQVAgKSBjb21iaW5hdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQKKwl3bGFuX2hkZF9hcF9pZmFjZV9saW1pdFtdID0geworCXsKKwkJLm1heCA9IChDREZfTUFYX05PX09GX1NBUF9NT0RFICsgU0FQX01BWF9PQlNTX1NUQV9DTlQpLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApLAorCX0sCit9OworCisvKiBQMlAgbGltaXQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0CisJd2xhbl9oZGRfcDJwX2lmYWNlX2xpbWl0W10gPSB7CisJeworCQkubWF4ID0gMSwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpLAorCX0sCisJeworCQkubWF4ID0gMSwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1AyUF9HTyksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0CisJd2xhbl9oZGRfc3RhX2FwX2lmYWNlX2xpbWl0W10gPSB7CisJeworCQkvKiBXZSBuZWVkIDEgZXh0cmEgU1RBIGludGVyZmFjZSBmb3IgT0JTUyBzY2FuIHdoZW4gU0FQIHN0YXJ0cworCQkgKiB3aXRoIEhUNDAgaW4gU1RBK1NBUCBjb25jdXJyZW5jeSBtb2RlCisJCSAqLworCQkubWF4ID0gKDEgKyBTQVBfTUFYX09CU1NfU1RBX0NOVCksCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSwKKwl9LAorCXsKKwkJLm1heCA9IENERl9NQVhfTk9fT0ZfU0FQX01PREUsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9BUCksCisJfSwKK307CisKKy8qIFNUQSArIFAyUCBjb21iaW5hdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQKKwl3bGFuX2hkZF9zdGFfcDJwX2lmYWNlX2xpbWl0W10gPSB7CisJeworCQkvKiBPbmUgcmVzZXJ2ZWQgZm9yIGRlZGljYXRlZCBQMlBERVYgdXNhZ2UgKi8KKwkJLm1heCA9IDIsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCX0sCisJeworCQkvKiBTdXBwb3J0IGZvciB0d28gaWRlbnRpY2FsIChHTyArIEdPIG9yIENMSSArIENMSSkKKwkJICogb3IgZGlzc2ltaWxhciAoR08gKyBDTEkpIFAyUCBpbnRlcmZhY2VzCisJCSAqLworCQkubWF4ID0gMiwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1AyUF9HTykgfCBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCksCisJfSwKK307CisKKy8qIFNUQSArIEFQICsgUDJQR08gY29tYmluYXRpb24gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0Cit3bGFuX2hkZF9zdGFfYXBfcDJwZ29faWZhY2VfbGltaXRbXSA9IHsKKwkvKiBTdXBwb3J0IGZvciBBUCtQMlBHTyBpbnRlcmZhY2VzICovCisJeworCSAgIC5tYXggPSAyLAorCSAgIC50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCX0sCisJeworCSAgIC5tYXggPSAxLAorCSAgIC50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pCisJfSwKKwl7CisJICAgLm1heCA9IDEsCisJICAgLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX0FQKQorCX0KK307CisKKy8qIFNBUCArIFAyUCBjb21iaW5hdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQKK3dsYW5faGRkX3NhcF9wMnBfaWZhY2VfbGltaXRbXSA9IHsKKwl7CisJICAgLyogMSBkZWRpY2F0ZWQgZm9yIHAycDAgd2hpY2ggaXMgYSBTVEEgdHlwZSAqLworCSAgIC5tYXggPSAxLAorCSAgIC50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCX0sCisJeworCSAgIC8qIFRoZSBwMnAgaW50ZXJmYWNlIGluIFNBUCtQMlAgY2FuIGJlIEdPL0NMSS4KKwkgICAgKiBUaGUgcDJwIGNvbm5lY3Rpb24gY2FuIGJlIGZvcm1lZCBvbiBwMnAwIG9yIHAycC1wMnAwLXguCisJICAgICovCisJICAgLm1heCA9IDEsCisJICAgLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1AyUF9HTykgfCBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkKKwl9LAorCXsKKwkgICAvKiBTQVArR08gdG8gc3VwcG9ydCBvbmx5IG9uZSBTQVAgaW50ZXJmYWNlICovCisJICAgLm1heCA9IDEsCisJICAgLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX0FQKQorCX0KK307CisKKy8qIFAyUCArIFAyUCBjb21iaW5hdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQKK3dsYW5faGRkX3AycF9wMnBfaWZhY2VfbGltaXRbXSA9IHsKKwl7CisJICAgLyogMSBkZWRpY2F0ZWQgZm9yIHAycDAgd2hpY2ggaXMgYSBTVEEgdHlwZSAqLworCSAgIC5tYXggPSAxLAorCSAgIC50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCX0sCisJeworCSAgIC8qIFRoZSBwMnAgaW50ZXJmYWNlIGluIFAyUCtQMlAgY2FuIGJlIEdPL0NMSS4KKwkgICAgKiBGb3IgUDJQK1AyUCwgdGhlIG5ldyBpbnRlcmZhY2VzIGFyZSBmb3JtZWQgb24gcDJwLXAycDAteC4KKwkgICAgKi8KKwkgICAubWF4ID0gMiwKKwkgICAudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB8IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKQorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9jb21iaW5hdGlvbgorCXdsYW5faGRkX2lmYWNlX2NvbWJpbmF0aW9uW10gPSB7CisJLyogU1RBICovCisJeworCQkubGltaXRzID0gd2xhbl9oZGRfc3RhX2lmYWNlX2xpbWl0LAorCQkubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDIsCisJCS5tYXhfaW50ZXJmYWNlcyA9IDMsCisJCS5uX2xpbWl0cyA9IEFSUkFZX1NJWkUod2xhbl9oZGRfc3RhX2lmYWNlX2xpbWl0KSwKKwl9LAorCS8qIEFESE9DICovCisJeworCQkubGltaXRzID0gd2xhbl9oZGRfYWRob2NfaWZhY2VfbGltaXQsCisJCS5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMSwKKwkJLm1heF9pbnRlcmZhY2VzID0gMiwKKwkJLm5fbGltaXRzID0gQVJSQVlfU0laRSh3bGFuX2hkZF9hZGhvY19pZmFjZV9saW1pdCksCisJfSwKKwkvKiBBUCAqLworCXsKKwkJLmxpbWl0cyA9IHdsYW5faGRkX2FwX2lmYWNlX2xpbWl0LAorCQkubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDIsCisJCS5tYXhfaW50ZXJmYWNlcyA9IChTQVBfTUFYX09CU1NfU1RBX0NOVCArIENERl9NQVhfTk9fT0ZfU0FQX01PREUpLAorCQkubl9saW1pdHMgPSBBUlJBWV9TSVpFKHdsYW5faGRkX2FwX2lmYWNlX2xpbWl0KSwKKwl9LAorCS8qIFAyUCAqLworCXsKKwkJLmxpbWl0cyA9IHdsYW5faGRkX3AycF9pZmFjZV9saW1pdCwKKwkJLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAyLAorCQkubWF4X2ludGVyZmFjZXMgPSAyLAorCQkubl9saW1pdHMgPSBBUlJBWV9TSVpFKHdsYW5faGRkX3AycF9pZmFjZV9saW1pdCksCisJfSwKKwkvKiBTVEEgKyBBUCAqLworCXsKKwkJLmxpbWl0cyA9IHdsYW5faGRkX3N0YV9hcF9pZmFjZV9saW1pdCwKKwkJLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAyLAorCQkubWF4X2ludGVyZmFjZXMgPSAoMSArIFNBUF9NQVhfT0JTU19TVEFfQ05UICsgQ0RGX01BWF9OT19PRl9TQVBfTU9ERSksCisJCS5uX2xpbWl0cyA9IEFSUkFZX1NJWkUod2xhbl9oZGRfc3RhX2FwX2lmYWNlX2xpbWl0KSwKKwkJLmJlYWNvbl9pbnRfaW5mcmFfbWF0Y2ggPSB0cnVlLAorCX0sCisJLyogU1RBICsgUDJQICovCisJeworCQkubGltaXRzID0gd2xhbl9oZGRfc3RhX3AycF9pZmFjZV9saW1pdCwKKwkJLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAyLAorCQkvKiBvbmUgaW50ZXJmYWNlIHJlc2VydmVkIGZvciBQMlBERVYgZGVkaWNhdGVkIHVzYWdlICovCisJCS5tYXhfaW50ZXJmYWNlcyA9IDQsCisJCS5uX2xpbWl0cyA9IEFSUkFZX1NJWkUod2xhbl9oZGRfc3RhX3AycF9pZmFjZV9saW1pdCksCisJCS5iZWFjb25faW50X2luZnJhX21hdGNoID0gdHJ1ZSwKKwl9LAorCS8qIFNUQSArIFAyUCBHTyArIFNBUCAqLworCXsKKwkJLmxpbWl0cyA9IHdsYW5faGRkX3N0YV9hcF9wMnBnb19pZmFjZV9saW1pdCwKKwkJLyogd2UgY2FuIGFsbG93IDMgY2hhbm5lbHMgZm9yIHRocmVlIGRpZmZlcmVudCBwZXJzb25hCisJCSAqIGJ1dCBkdWUgdG8gZmlybXdhcmUgbGltaXRhdGlvbiwgYWxsb3cgbWF4IDIgY29uY3JudCBjaGFubmVscy4KKwkJICovCisJCS5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMiwKKwkJLyogb25lIGludGVyZmFjZSByZXNlcnZlZCBmb3IgUDJQREVWIGRlZGljYXRlZCB1c2FnZSAqLworCQkubWF4X2ludGVyZmFjZXMgPSA0LAorCQkubl9saW1pdHMgPSBBUlJBWV9TSVpFKHdsYW5faGRkX3N0YV9hcF9wMnBnb19pZmFjZV9saW1pdCksCisJCS5iZWFjb25faW50X2luZnJhX21hdGNoID0gdHJ1ZSwKKwl9LAorCS8qIFNBUCArIFAyUCAqLworCXsKKwkJLmxpbWl0cyA9IHdsYW5faGRkX3NhcF9wMnBfaWZhY2VfbGltaXQsCisJCS5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMiwKKwkJLyogMS1wMnAwICsgMS1TQVAgKyAxLVAyUCAob24gcDJwMCBvciBwMnAtcDJwMC14KSAqLworCQkubWF4X2ludGVyZmFjZXMgPSAzLAorCQkubl9saW1pdHMgPSBBUlJBWV9TSVpFKHdsYW5faGRkX3NhcF9wMnBfaWZhY2VfbGltaXQpLAorCQkuYmVhY29uX2ludF9pbmZyYV9tYXRjaCA9IHRydWUsCisJfSwKKwkvKiBQMlAgKyBQMlAgKi8KKwl7CisJCS5saW1pdHMgPSB3bGFuX2hkZF9wMnBfcDJwX2lmYWNlX2xpbWl0LAorCQkubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDIsCisJCS8qIDEtcDJwMCArIDItUDJQIChvbiBwMnAtcDJwMC14KSAqLworCQkubWF4X2ludGVyZmFjZXMgPSAzLAorCQkubl9saW1pdHMgPSBBUlJBWV9TSVpFKHdsYW5faGRkX3AycF9wMnBfaWZhY2VfbGltaXQpLAorCQkuYmVhY29uX2ludF9pbmZyYV9tYXRjaCA9IHRydWUsCisJfSwKK307CisjZW5kaWYgLyogKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA0LCAwKSkgKi8KKworc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9vcHMgd2xhbl9oZGRfY2ZnODAyMTFfb3BzOworCisKKyNpZmRlZiBXTEFOX05MODAyMTFfVEVTVE1PREUKK2VudW0gd2xhbl9oZGRfdG1fYXR0ciB7CisJV0xBTl9IRERfVE1fQVRUUl9JTlZBTElEID0gMCwKKwlXTEFOX0hERF9UTV9BVFRSX0NNRCA9IDEsCisJV0xBTl9IRERfVE1fQVRUUl9EQVRBID0gMiwKKwlXTEFOX0hERF9UTV9BVFRSX1NUUkVBTV9JRCA9IDMsCisJV0xBTl9IRERfVE1fQVRUUl9UWVBFID0gNCwKKwkvKiBrZWVwIGxhc3QgKi8KKwlXTEFOX0hERF9UTV9BVFRSX0FGVEVSX0xBU1QsCisJV0xBTl9IRERfVE1fQVRUUl9NQVggPSBXTEFOX0hERF9UTV9BVFRSX0FGVEVSX0xBU1QgLSAxLAorfTsKKworZW51bSB3bGFuX2hkZF90bV9jbWQgeworCVdMQU5fSEREX1RNX0NNRF9XTEFOX0ZUTSA9IDAsCisJV0xBTl9IRERfVE1fQ01EX1dMQU5fSEIgPSAxLAorfTsKKworI2RlZmluZSBXTEFOX0hERF9UTV9EQVRBX01BWF9MRU4gICAgNTAwMAorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgd2xhbl9oZGRfdG1fcG9saWN5W1dMQU5fSEREX1RNX0FUVFJfTUFYICsgMV0gPSB7CisJW1dMQU5fSEREX1RNX0FUVFJfQ01EXSA9IHsudHlwZSA9IE5MQV9VMzJ9LAorCVtXTEFOX0hERF9UTV9BVFRSX0RBVEFdID0gey50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgICAubGVuID0gV0xBTl9IRERfVE1fREFUQV9NQVhfTEVOfSwKK307CisjZW5kaWYgLyogV0xBTl9OTDgwMjExX1RFU1RNT0RFICovCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDExLCAwKSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2lwaHlfd293bGFuX3N1cHBvcnQgd293bGFuX3N1cHBvcnRfY2ZnODAyMTFfaW5pdCA9IHsKKwkuZmxhZ3MgPSBXSVBIWV9XT1dMQU5fTUFHSUNfUEtULAorCS5uX3BhdHRlcm5zID0gV09XTF9NQVhfUFRSTlNfQUxMT1dFRCwKKwkucGF0dGVybl9taW5fbGVuID0gMSwKKwkucGF0dGVybl9tYXhfbGVuID0gV09XTF9QVFJOX01BWF9TSVpFLAorfTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKworLyogVERMUyBjYXBhYmlsaXRpZXMgcGFyYW1zICovCisjZGVmaW5lIFBBUkFNX01BWF9URExTX1NFU1NJT04gXAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9DQVBTX01BWF9DT05DX1NFU1NJT05TCisjZGVmaW5lIFBBUkFNX1RETFNfRkVBVFVSRV9TVVBQT1JUIFwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfQ0FQU19GRUFUVVJFU19TVVBQT1JURUQKKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2dldF90ZGxzX2NhcGFiaWxpdGllcygpIC0gUHJvdmlkZSBURExTIENhcGFiaWxpdGVzLgorICogQHdpcGh5OiAgICBXSVBIWSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogQHdkZXY6ICAgICBXaXJlbGVzcyBkZXZpY2Ugc3RydWN0dXJlIHBvaW50ZXIKKyAqIEBkYXRhOiAgICAgUG9pbnRlciB0byB0aGUgZGF0YSByZWNlaXZlZAorICogQGRhdGFfbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEgcmVjZWl2ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIFRETFMgY2FwYWJpbGl0aWVzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2dldF90ZGxzX2NhcGFiaWxpdGllcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkJICAgICBpbnQgZGF0YV9sZW4pCit7CisJaW50IHN0YXR1czsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1aW50MzJfdCBzZXQgPSAwOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiKHdpcGh5LCAoMiAqIHNpemVvZih1MzIpKSArCisJCQkJCQkgICBOTE1TR19IRFJMRU4pOworCWlmICghc2tiKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2IgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKGZhbHNlID09IGhkZF9jdHgtPmNvbmZpZy0+ZkVuYWJsZVRETFNTdXBwb3J0KSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoIlRETFMgZmVhdHVyZSBub3QgRW5hYmxlZCBvciBOb3Qgc3VwcG9ydGVkIGluIEZXIikpOworCQlpZiAobmxhX3B1dF91MzIoc2tiLCBQQVJBTV9NQVhfVERMU19TRVNTSU9OLCAwKSB8fAorCQkJbmxhX3B1dF91MzIoc2tiLCBQQVJBTV9URExTX0ZFQVRVUkVfU1VQUE9SVCwgMCkpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgibmxhIHB1dCBmYWlsIikpOworCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlIHsKKwkJc2V0ID0gc2V0IHwgV0lGSV9URExTX1NVUFBPUlQ7CisJCXNldCA9IHNldCB8IChoZGRfY3R4LT5jb25maWctPmZURExTRXh0ZXJuYWxDb250cm9sID8KKwkJCQkJV0lGSV9URExTX0VYVEVSTkFMX0NPTlRST0xfU1VQUE9SVCA6IDApOworCQlzZXQgPSBzZXQgfCAoaGRkX2N0eC0+Y29uZmlnLT5mRW5hYmxlVERMU09mZkNoYW5uZWwgPworCQkJCQlXSUlGX1RETFNfT0ZGQ0hBTk5FTF9TVVBQT1JUIDogMCk7CisJCWhkZExvZyhMT0cxLCBGTCgiVERMUyBGZWF0dXJlIHN1cHBvcnRlZCB2YWx1ZSAleCIpLCBzZXQpOworCQlpZiAobmxhX3B1dF91MzIoc2tiLCBQQVJBTV9NQVhfVERMU19TRVNTSU9OLAorCQkJCSBoZGRfY3R4LT5tYXhfbnVtX3RkbHNfc3RhKSB8fAorCQkJbmxhX3B1dF91MzIoc2tiLCBQQVJBTV9URExTX0ZFQVRVUkVfU1VQUE9SVCwKKwkJCQkgc2V0KSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJubGEgcHV0IGZhaWwiKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJcmV0dXJuIGNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkoc2tiKTsKK2ZhaWw6CisJaWYgKHNrYikKKwkJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3RkbHNfY2FwYWJpbGl0aWVzKCkgLSBQcm92aWRlIFRETFMgQ2FwYWJpbGl0ZXMuCisgKiBAd2lwaHk6ICAgIFdJUEhZIHN0cnVjdHVyZSBwb2ludGVyCisgKiBAd2RldjogICAgIFdpcmVsZXNzIGRldmljZSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogQGRhdGE6ICAgICBQb2ludGVyIHRvIHRoZSBkYXRhIHJlY2VpdmVkCisgKiBAZGF0YV9sZW46IExlbmd0aCBvZiB0aGUgZGF0YSByZWNlaXZlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgVERMUyBjYXBhYmlsaXRpZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgZXJybm8gb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50Cit3bGFuX2hkZF9jZmc4MDIxMV9nZXRfdGRsc19jYXBhYmlsaXRpZXMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3RkbHNfY2FwYWJpbGl0aWVzKHdpcGh5LCB3ZGV2LAorCQkJCQkJCWRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZmRlZiBRQ0FfSFRfMjA0MF9DT0VYCitzdGF0aWMgdm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9wZW5kaW5nX2FjcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9DSF9BVk9JRCkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fRk9SQ0VfU0FQX1NDQykKKy8qCisgKiBGVU5DVElPTjogd2xhbl9oZGRfc2VuZF9hdm9pZF9mcmVxX2V2ZW50CisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdsYW4gZHJpdmVyIG5lZWRzIHRvIHNlbmQgdmVuZG9yIHNwZWNpZmljCisgKiBhdm9pZCBmcmVxdWVuY3kgcmFuZ2UgZXZlbnQgdG8gdXNlcnNwYWNlCisgKi8KK2ludCB3bGFuX2hkZF9zZW5kX2F2b2lkX2ZyZXFfZXZlbnQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkgICB0SGRkQXZvaWRGcmVxTGlzdCAqcEF2b2lkRnJlcUxpc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnZlbmRvcl9ldmVudDsKKworCUVOVEVSKCk7CisKKwlpZiAoIXBIZGRDdHgpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBudWxsIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXBBdm9pZEZyZXFMaXN0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgicEF2b2lkRnJlcUxpc3QgaXMgbnVsbCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmVuZG9yX2V2ZW50ID0gY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jKHBIZGRDdHgtPndpcGh5LAorCQkJCQkJICAgTlVMTCwKKwkJCQkJCSAgIHNpemVvZih0SGRkQXZvaWRGcmVxTGlzdCksCisJCQkJCQkgICBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0FWT0lEX0ZSRVFVRU5DWV9JTkRFWCwKKwkJCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghdmVuZG9yX2V2ZW50KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtY3B5KHNrYl9wdXQodmVuZG9yX2V2ZW50LCBzaXplb2YodEhkZEF2b2lkRnJlcUxpc3QpKSwKKwkgICAgICAgKHZvaWQgKilwQXZvaWRGcmVxTGlzdCwgc2l6ZW9mKHRIZGRBdm9pZEZyZXFMaXN0KSk7CisKKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQodmVuZG9yX2V2ZW50LCBHRlBfS0VSTkVMKTsKKworCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgfHwgRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MgKi8KKworLyogdmVuZG9yIHNwZWNpZmljIGV2ZW50cyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBubDgwMjExX3ZlbmRvcl9jbWRfaW5mbyB3bGFuX2hkZF9jZmc4MDIxMV92ZW5kb3JfZXZlbnRzW10gPSB7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NIX0FWT0lECisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfQVZPSURfRlJFUVVFTkNZX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9BVk9JRF9GUkVRVUVOQ1kKKwl9LAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DSF9BVk9JRCAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX05BTl9JTkRFWF0gPSB7CisJCS52ZW5kb3JfaWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuc3ViY21kID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTkFOCisJfSwKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1NUQVRTX0VYVAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1NUQVRTX0VYVF9JTkRFWF0gPSB7CisJCS52ZW5kb3JfaWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuc3ViY21kID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfU1RBVFNfRVhUCisJfSwKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NUQVJUX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NUQVJUCisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NUT1BfSU5ERVhdID0geworCQkudmVuZG9yX2lkID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU1RPUAorCX0sCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX0lOREVYXSA9IHsKKwkJLgorCQl2ZW5kb3JfaWQKKwkJCT0KKwkJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX0dFVF9DQVBBQklMSVRJRVMKKwl9LAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX0NBQ0hFRF9SRVNVTFRTX0lOREVYXSA9IHsKKwkJLgorCQl2ZW5kb3JfaWQKKwkJCT0KKwkJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS4KKwkJc3ViY21kID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9HRVRfQ0FDSEVEX1JFU1VMVFMKKwl9LAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9JTkRFWF0gPSB7CisJCS4KKwkJdmVuZG9yX2lkCisJCQk9CisJCQkJUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuCisJCXN1YmNtZAorCQkJPQorCQkJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFCisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX0ZVTExfU0NBTl9SRVNVTFRfSU5ERVhdID0geworCQkuCisJCXZlbmRvcl9pZAorCQkJPQorCQkJCVFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fRlVMTF9TQ0FOX1JFU1VMVAorCX0sCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TQ0FOX0VWRU5UX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NDQU5fRVZFTlQKKwl9LAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9BUF9GT1VORF9JTkRFWF0gPSB7CisJCS4KKwkJdmVuZG9yX2lkCisJCQk9CisJCQkJUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuc3ViY21kID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX0FQX0ZPVU5ECisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NFVF9CU1NJRF9IT1RMSVNUX0lOREVYXSA9IHsKKwkJLgorCQl2ZW5kb3JfaWQKKwkJCT0KKwkJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NFVF9CU1NJRF9IT1RMSVNUCisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1JFU0VUX0JTU0lEX0hPVExJU1RfSU5ERVhdID0geworCQkuCisJCXZlbmRvcl9pZAorCQkJPQorCQkJCVFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLgorCQlzdWJjbWQKKwkJCT0KKwkJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUkVTRVRfQlNTSURfSE9UTElTVAorCX0sCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0VfSU5ERVhdID0geworCQkuCisJCXZlbmRvcl9pZAorCQkJPQorCQkJCVFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLgorCQlzdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRQorCX0sCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TRVRfU0lHTklGSUNBTlRfQ0hBTkdFX0lOREVYXSA9IHsKKwkJLgorCQl2ZW5kb3JfaWQKKwkJCT0KKwkJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS4KKwkJc3ViY21kCisJCQk9CisJCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NFVF9TSUdOSUZJQ0FOVF9DSEFOR0UKKwl9LAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUkVTRVRfU0lHTklGSUNBTlRfQ0hBTkdFX0lOREVYXSA9IHsKKwkJLgorCQl2ZW5kb3JfaWQKKwkJCT0KKwkJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS4KKwkJc3ViY21kCisJCQk9CisJCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1JFU0VUX1NJR05JRklDQU5UX0NIQU5HRQorCX0sCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX1NTSURfRk9VTkRfSU5ERVhdID0geworCQkudmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX0hPVExJU1RfU1NJRF9GT1VORAorCX0sCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX1NTSURfTE9TVF9JTkRFWF0gPSB7CisJCS52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9TU0lEX0xPU1QKKwl9LAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FWFRTQ0FOICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUworCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX1NUQVRTX1NFVF9JTkRFWF0gPSB7CisJCS52ZW5kb3JfaWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuc3ViY21kID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTExfU1RBVFNfU0VUCisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19HRVRfSU5ERVhdID0geworCQkudmVuZG9yX2lkID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX1NUQVRTX0dFVAorCX0sCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTExfU1RBVFNfQ0xSX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19DTFIKKwl9LAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX1JBRElPX1NUQVRTX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19SQURJT19SRVNVTFRTCisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9JRkFDRV9TVEFUU19JTkRFWF0gPSB7CisJCS52ZW5kb3JfaWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuc3ViY21kID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTExfU1RBVFNfSUZBQ0VfUkVTVUxUUworCX0sCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTExfUEVFUl9JTkZPX1NUQVRTX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19QRUVSU19SRVNVTFRTCisJfSwKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUyAqLworCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1RETFNfU1RBVEVfQ0hBTkdFX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9URExTX1NUQVRFCisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ET19BQ1NfSU5ERVhdID0geworCQkudmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ET19BQ1MKKwl9LAorI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9LRVlfTUdNVF9ST0FNX0FVVEhfSU5ERVhdID0geworCQkudmVuZG9yX2lkID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0tFWV9NR01UX1JPQU1fQVVUSAorCX0sCisjZW5kaWYKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9DQUNfU1RBUlRFRF9JTkRFWF0gPSAgeworCQkudmVuZG9yX2lkID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19PRkZMT0FEX0NBQ19TVEFSVEVECisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9DQUNfRklOSVNIRURfSU5ERVhdID0gIHsKKwkJLnZlbmRvcl9pZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9DQUNfRklOSVNIRUQKKwl9LAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19PRkZMT0FEX0NBQ19BQk9SVEVEX0lOREVYXSA9ICB7CisJCS52ZW5kb3JfaWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuc3ViY21kID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfREZTX09GRkxPQURfQ0FDX0FCT1JURUQKKwl9LAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19PRkZMT0FEX0NBQ19OT1BfRklOSVNIRURfSU5ERVhdID0gIHsKKwkJLnZlbmRvcl9pZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9DQUNfTk9QX0ZJTklTSEVECisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9SQURBUl9ERVRFQ1RFRF9JTkRFWF0gPSAgeworCQkudmVuZG9yX2lkID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19PRkZMT0FEX1JBREFSX0RFVEVDVEVECisJfSwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUE5PX05FVFdPUktfRk9VTkRfSU5ERVhdID0geworCQkudmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1BOT19ORVRXT1JLX0ZPVU5ECisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1BOT19QQVNTUE9JTlRfTkVUV09SS19GT1VORF9JTkRFWF0gPSB7CisJCS52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUE5PX1BBU1NQT0lOVF9ORVRXT1JLX0ZPVU5ECisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NFVF9TU0lEX0hPVExJU1RfSU5ERVhdID0geworCQkudmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NFVF9TU0lEX0hPVExJU1QKKwl9LAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUkVTRVRfU1NJRF9IT1RMSVNUX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9SRVNFVF9TU0lEX0hPVExJU1QKKwl9LAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9BUF9MT1NUX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX0FQX0xPU1QKKwl9LAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FWFRTQ0FOICovCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTU9OSVRPUl9SU1NJX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTU9OSVRPUl9SU1NJCisJfSwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUVNRFVNUAorCVtRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1dJRklfTE9HR0VSX01FTU9SWV9EVU1QX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfV0lGSV9MT0dHRVJfTUVNT1JZX0RVTVAKKwl9LAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9NRU1EVU1QICovCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfU0NBTl9ET05FX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfU0NBTl9ET05FCisJfSwKKwlbUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TQ0FOX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfVFJJR0dFUl9TQ0FOCisJfSwKKwkvKiBPQ0IgZXZlbnRzICovCisJW1FDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRENDX1NUQVRTX0VWRU5UX0lOREVYXSA9IHsKKwkJLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRENDX1NUQVRTX0VWRU5UCisJfSwKK307CisKKy8qKgorICogX19pc19kcml2ZXJfZGZzX2NhcGFibGUoKSAtIGdldCBkcml2ZXIgREZTIGNhcGFiaWxpdHkKKyAqIEB3aXBoeTogICBwb2ludGVyIHRvIHdpcmVsZXNzIHdpcGh5IHN0cnVjdHVyZS4KKyAqIEB3ZGV2OiAgICBwb2ludGVyIHRvIHdpcmVsZXNzX2RldiBzdHJ1Y3R1cmUuCisgKiBAZGF0YTogICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBwYXNzZWQgdmlhIHZlbmRvciBpbnRlcmZhY2UKKyAqIEBkYXRhX2xlbjpMZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgcGFzc2VkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdXNlcnNwYWNlIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90CisgKiB0aGUgZHJpdmVyIHN1cHBvcnRzIERGUyBvZmZsb2FkLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX19pc19kcml2ZXJfZGZzX2NhcGFibGUoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgaW50IGRhdGFfbGVuKQoreworCXUzMiBkZnNfY2FwYWJpbGl0eSA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnRlbXBfc2tidWZmOworCWludCByZXRfdmFsOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKworCUVOVEVSKCk7CisKKwlyZXRfdmFsID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQorCWRmc19jYXBhYmlsaXR5ID0gISEod2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19ERlNfT0ZGTE9BRCk7CisjZW5kaWYKKworCXRlbXBfc2tidWZmID0gY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2Iod2lwaHksIHNpemVvZih1MzIpICsKKwkJCQkJCQkgIE5MTVNHX0hEUkxFTik7CisKKwlpZiAodGVtcF9za2J1ZmYgIT0gTlVMTCkgeworCQlyZXRfdmFsID0gbmxhX3B1dF91MzIodGVtcF9za2J1ZmYsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RGUywKKwkJCQkgICAgICBkZnNfY2FwYWJpbGl0eSk7CisJCWlmIChyZXRfdmFsKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIlFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RGUyBwdXQgZmFpbCIpKTsKKwkJCWtmcmVlX3NrYih0ZW1wX3NrYnVmZik7CisKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisKKwkJcmV0dXJuIGNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkodGVtcF9za2J1ZmYpOworCX0KKworCWhkZExvZyhMT0dFLCBGTCgiZGZzIGNhcGFiaWxpdHk6IGJ1ZmZlciBhbGxvYyBmYWlsIikpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKioKKyAqIGlzX2RyaXZlcl9kZnNfY2FwYWJsZSgpIC0gZ2V0IGRyaXZlciBERlMgY2FwYWJpbGl0eQorICogQHdpcGh5OiAgIHBvaW50ZXIgdG8gd2lyZWxlc3Mgd2lwaHkgc3RydWN0dXJlLgorICogQHdkZXY6ICAgIHBvaW50ZXIgdG8gd2lyZWxlc3NfZGV2IHN0cnVjdHVyZS4KKyAqIEBkYXRhOiAgICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHBhc3NlZCB2aWEgdmVuZG9yIGludGVyZmFjZQorICogQGRhdGFfbGVuOkxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSBwYXNzZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB1c2Vyc3BhY2UgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QKKyAqIHRoZSBkcml2ZXIgc3VwcG9ydHMgREZTIG9mZmxvYWQuICBUaGlzIGlzIGFuIFNTUi1wcm90ZWN0ZWQKKyAqIHdyYXBwZXIgZnVuY3Rpb24uCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBpc19kcml2ZXJfZGZzX2NhcGFibGUoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXNfZHJpdmVyX2Rmc19jYXBhYmxlKHdpcGh5LCB3ZGV2LCBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9zYXBfY2ZnX2Rmc19vdmVycmlkZSgpIC0gREZTIE1DQyByZXN0cmljdGlvbiBjaGVjaworICoKKyAqIEBhZGFwdGVyOiBTQVAgYWRhcHRlciBwb2ludGVyCisgKgorICogREZTIGluIE1DQyBpcyBub3Qgc3VwcG9ydGVkIGZvciBNdWx0aSBic3NpZCBTQVAgbW9kZSBkdWUgdG8gc2luZ2xlIHBoeXNpY2FsCisgKiByYWRpby4gU28gaW4gY2FzZSBvZiBERlMgTUNDIHNjZW5hcmlvIG92ZXJyaWRlIGN1cnJlbnQgU0FQIGdpdmVuIGNvbmZpZworICogdG8gZm9sbG93IGNvbmN1cnJlbnQgU0FQIERGUyBjb25maWcKKyAqCisgKiBSZXR1cm46IDAgLSBObyBERlMgaXNzdWUsIDEgLSBPdmVycmlkZSBkb25lIGFuZCBuZWdhdGl2ZSBlcnJvciBjb2RlcworICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECitpbnQgd2xhbl9oZGRfc2FwX2NmZ19kZnNfb3ZlcnJpZGUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwloZGRfYWRhcHRlcl90ICpjb25fc2FwX2FkYXB0ZXI7CisJdHNhcF9Db25maWdfdCAqc2FwX2NvbmZpZywgKmNvbl9zYXBfY29uZmlnOworCWludCBjb25fY2g7CisKKwkvKgorCSAqIENoZWNrIGlmIEFQK0FQIGNhc2UsIG9uY2UgcHJpbWFyeSBBUCBjaG9vc2VzIGEgREZTCisJICogY2hhbm5lbCBzZWNvbmRhcnkgQVAgc2hvdWxkIGFsd2F5cyBmb2xsb3cgcHJpbWFyeSBBUHMgY2hhbm5lbAorCSAqLworCWlmICghY2RzX2NvbmN1cnJlbnRfYmVhY29uaW5nX3Nlc3Npb25zX3J1bm5pbmcoKSkKKwkJcmV0dXJuIDA7CisKKwljb25fc2FwX2FkYXB0ZXIgPSBoZGRfZ2V0X2Nvbl9zYXBfYWRhcHRlcihhZGFwdGVyLCB0cnVlKTsKKwlpZiAoIWNvbl9zYXBfYWRhcHRlcikKKwkJcmV0dXJuIDA7CisKKwlzYXBfY29uZmlnID0gJmFkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnOworCWNvbl9zYXBfY29uZmlnID0gJmNvbl9zYXBfYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWc7CisJY29uX2NoID0gY29uX3NhcF9hZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLm9wZXJhdGluZ0NoYW5uZWw7CisKKwlpZiAoIUNEU19JU19ERlNfQ0goY29uX2NoKSkKKwkJcmV0dXJuIDA7CisKKwloZGRMb2coTE9HRSwgRkwoIk9ubHkgU0NDIEFQLUFQIERGUyBQZXJtaXR0ZWQgKGNoPSVkLCBjb25fY2g9JWQpIiksCisJCQkJCQlzYXBfY29uZmlnLT5jaGFubmVsLCBjb25fY2gpOworCWhkZExvZyhMT0cxLCBGTCgiT3ZlcnJpZGluZyBndWVzdCBBUCdzIGNoYW5uZWwiKSk7CisJc2FwX2NvbmZpZy0+Y2hhbm5lbCA9IGNvbl9jaDsKKworCWlmIChjb25fc2FwX2NvbmZpZy0+YWNzX2NmZy5hY3NfbW9kZSA9PSB0cnVlKSB7CisJCWlmIChjb25fY2ggIT0gY29uX3NhcF9jb25maWctPmFjc19jZmcucHJpX2NoICYmCisJCQkJY29uX2NoICE9IGNvbl9zYXBfY29uZmlnLT5hY3NfY2ZnLmh0X3NlY19jaCkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJQcmltYXJ5IEFQIGNoYW5uZWwgY29uZmlnIGVycm9yIikpOworCQkJaGRkTG9nKExPR0UsIEZMKCJPcGVyYXRpbmcgY2g6ICVkIEFDUyBjaDogJWQgJWQiKSwKKwkJCQljb25fY2gsIGNvbl9zYXBfY29uZmlnLT5hY3NfY2ZnLnByaV9jaCwKKwkJCQljb25fc2FwX2NvbmZpZy0+YWNzX2NmZy5odF9zZWNfY2gpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogU2VjIEFQIEFDUyBpbmZvIGlzIG92ZXJ3cml0dGVuIHdpdGggUHJpIEFQIGR1ZSB0byBERlMKKwkJICogTUNDIHJlc3RyaWN0aW9uLiBTbyBmcmVlIGNoIGxpc3QgYWxsb2NhdGVkIGluIGRvX2FjcworCQkgKiBmdW5jIGZvciBTZWMgQVAgYW5kIHJlYWxsb2MgZm9yIFByaSBBUCBjaCBsaXN0IHNpemUKKwkJICovCisJCWlmIChzYXBfY29uZmlnLT5hY3NfY2ZnLmNoX2xpc3QpCisJCQljZGZfbWVtX2ZyZWUoc2FwX2NvbmZpZy0+YWNzX2NmZy5jaF9saXN0KTsKKworCQljZGZfbWVtX2NvcHkoJnNhcF9jb25maWctPmFjc19jZmcsCisJCQkJCSZjb25fc2FwX2NvbmZpZy0+YWNzX2NmZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzYXBfYWNzX2NmZykpOworCQlzYXBfY29uZmlnLT5hY3NfY2ZnLmNoX2xpc3QgPSBjZGZfbWVtX21hbGxvYygKKwkJCQkJc2l6ZW9mKHVpbnQ4X3QpICoKKwkJCQkJY29uX3NhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdF9jb3VudCk7CisJCWlmICghc2FwX2NvbmZpZy0+YWNzX2NmZy5jaF9saXN0KSB7CisJCQloZGRMb2coTE9HRSwgRkwoIkFDUyBjb25maWcgYWxsb2MgZmFpbCIpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJY2RmX21lbV9jb3B5KHNhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdCwKKwkJCQkJY29uX3NhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdCwKKwkJCQkJY29uX3NhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdF9jb3VudCk7CisKKwl9IGVsc2UgeworCQlzYXBfY29uZmlnLT5hY3NfY2ZnLnByaV9jaCA9IGNvbl9jaDsKKwkJaWYgKHNhcF9jb25maWctPmFjc19jZmcuY2hfd2lkdGggPiBlSFRfQ0hBTk5FTF9XSURUSF8yME1IWikKKwkJCXNhcF9jb25maWctPmFjc19jZmcuaHRfc2VjX2NoID0gY29uX3NhcF9jb25maWctPnNlY19jaDsKKwl9CisKKwlyZXR1cm4gY29uX2NoOworfQorI2Vsc2UKK2ludCB3bGFuX2hkZF9zYXBfY2ZnX2Rmc19vdmVycmlkZShoZGRfYWRhcHRlcl90ICphZGFwdGVyKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qKgorICogd2xhbl9oZGRfc2V0X2Fjc19jaF9yYW5nZSA6IFN0YXJ0IEFDUyBjaGFubmVsIHJhbmdlIHZhbHVlcworICogQHNhcF9jZmc6IHBvaW50ZXIgdG8gU0FQIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGRlZmF1bHQgQUNTIHN0YXJ0IGFuZCBlbmQgY2hhbm5lbCBmb3IgdGhlIGdpdmVuIGJhbmQKKyAqIGFuZCBhbHNvIHBhcnNlcyB0aGUgZ2l2ZW4gQUNTIGNoYW5uZWwgbGlzdC4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCB3bGFuX2hkZF9zZXRfYWNzX2NoX3JhbmdlKHRzYXBfQ29uZmlnX3QgKnNhcF9jZmcsIGJvb2wgaHRfZW5hYmxlZCwKKwkJCQkJCQlib29sIHZodF9lbmFibGVkKQoreworCWludCBpOworCWlmIChzYXBfY2ZnLT5hY3NfY2ZnLmh3X21vZGUgPT0gUUNBX0FDU19NT0RFX0lFRUU4MDIxMUIpIHsKKwkJc2FwX2NmZy0+YWNzX2NmZy5od19tb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYjsKKwkJc2FwX2NmZy0+YWNzX2NmZy5zdGFydF9jaCA9IHJmX2NoYW5uZWxzW1JGX0NIQU5fMV0uY2hhbm5lbE51bTsKKwkJc2FwX2NmZy0+YWNzX2NmZy5lbmRfY2ggPSByZl9jaGFubmVsc1tSRl9DSEFOXzE0XS5jaGFubmVsTnVtOworCX0gZWxzZSBpZiAoc2FwX2NmZy0+YWNzX2NmZy5od19tb2RlID09IFFDQV9BQ1NfTU9ERV9JRUVFODAyMTFHKSB7CisJCXNhcF9jZmctPmFjc19jZmcuaHdfbW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWc7CisJCXNhcF9jZmctPmFjc19jZmcuc3RhcnRfY2ggPSByZl9jaGFubmVsc1tSRl9DSEFOXzFdLmNoYW5uZWxOdW07CisJCXNhcF9jZmctPmFjc19jZmcuZW5kX2NoID0gcmZfY2hhbm5lbHNbUkZfQ0hBTl8xM10uY2hhbm5lbE51bTsKKwl9IGVsc2UgaWYgKHNhcF9jZmctPmFjc19jZmcuaHdfbW9kZSA9PSBRQ0FfQUNTX01PREVfSUVFRTgwMjExQSkgeworCQlzYXBfY2ZnLT5hY3NfY2ZnLmh3X21vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFhOworCQlzYXBfY2ZnLT5hY3NfY2ZnLnN0YXJ0X2NoID0gcmZfY2hhbm5lbHNbUkZfQ0hBTl8zNl0uY2hhbm5lbE51bTsKKwkJc2FwX2NmZy0+YWNzX2NmZy5lbmRfY2ggPSByZl9jaGFubmVsc1tSRl9DSEFOXzE2NV0uY2hhbm5lbE51bTsKKwl9IGVsc2UgaWYgKHNhcF9jZmctPmFjc19jZmcuaHdfbW9kZSA9PSBRQ0FfQUNTX01PREVfSUVFRTgwMjExQU5ZKSB7CisJCXNhcF9jZmctPmFjc19jZmcuaHdfbW9kZSA9IGVDU1JfRE9UMTFfTU9ERV9hYmc7CisJCXNhcF9jZmctPmFjc19jZmcuc3RhcnRfY2ggPSByZl9jaGFubmVsc1tSRl9DSEFOXzFdLmNoYW5uZWxOdW07CisJCXNhcF9jZmctPmFjc19jZmcuZW5kX2NoID0gcmZfY2hhbm5lbHNbUkZfQ0hBTl8xNjVdLmNoYW5uZWxOdW07CisJfQorCisJaWYgKGh0X2VuYWJsZWQpCisJCXNhcF9jZmctPmFjc19jZmcuaHdfbW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMW47CisKKwlpZiAodmh0X2VuYWJsZWQpCisJCXNhcF9jZmctPmFjc19jZmcuaHdfbW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWFjOworCisKKwkvKiBQYXJzZSBBQ1MgQ2hhbiBsaXN0IGZyb20gaG9zdGFwZCAqLworCWlmICghc2FwX2NmZy0+YWNzX2NmZy5jaF9saXN0KQorCQlyZXR1cm47CisKKwlzYXBfY2ZnLT5hY3NfY2ZnLnN0YXJ0X2NoID0gc2FwX2NmZy0+YWNzX2NmZy5jaF9saXN0WzBdOworCXNhcF9jZmctPmFjc19jZmcuZW5kX2NoID0KKwkJc2FwX2NmZy0+YWNzX2NmZy5jaF9saXN0W3NhcF9jZmctPmFjc19jZmcuY2hfbGlzdF9jb3VudCAtIDFdOworCWZvciAoaSA9IDA7IGkgPCBzYXBfY2ZnLT5hY3NfY2ZnLmNoX2xpc3RfY291bnQ7IGkrKykgeworCQlpZiAoc2FwX2NmZy0+YWNzX2NmZy5zdGFydF9jaCA+IHNhcF9jZmctPmFjc19jZmcuY2hfbGlzdFtpXSkKKwkJCXNhcF9jZmctPmFjc19jZmcuc3RhcnRfY2ggPSBzYXBfY2ZnLT5hY3NfY2ZnLmNoX2xpc3RbaV07CisJCWlmIChzYXBfY2ZnLT5hY3NfY2ZnLmVuZF9jaCA8IHNhcF9jZmctPmFjc19jZmcuY2hfbGlzdFtpXSkKKwkJCXNhcF9jZmctPmFjc19jZmcuZW5kX2NoID0gc2FwX2NmZy0+YWNzX2NmZy5jaF9saXN0W2ldOworCX0KK30KKworCitzdGF0aWMgdm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9wZW5kaW5nX2FjcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3N0YXJ0X2FjcyA6IFN0YXJ0IEFDUyBQcm9jZWR1cmUgZm9yIFNBUAorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gU0FQIGFkYXB0ZXIgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIEFDUyBwcm9jZWR1cmUgaWYgdGhlcmUgYXJlIG5vCisgKiBjb25zdHJhaW50cyBsaWtlIE1CU1NJRCBERlMgcmVzdHJpY3Rpb25zLgorICoKKyAqIFJldHVybjogU3RhdHVzIG9mIEFDUyBTdGFydCBwcm9jZWR1cmUKKyAqLworCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX3N0YXJ0X2FjcyhoZGRfYWRhcHRlcl90ICphZGFwdGVyKQoreworCisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisJdHNhcF9Db25maWdfdCAqc2FwX2NvbmZpZzsKKwl0cFdMQU5fU0FQRXZlbnRDQiBhY3NfZXZlbnRfY2FsbGJhY2s7CisJaW50IHN0YXR1czsKKworCXNhcF9jb25maWcgPSAmYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWc7CisJc2FwX2NvbmZpZy0+Y2hhbm5lbCA9IEFVVE9fQ0hBTk5FTF9TRUxFQ1Q7CisKKwlzdGF0dXMgPSB3bGFuX2hkZF9zYXBfY2ZnX2Rmc19vdmVycmlkZShhZGFwdGVyKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0gZWxzZSB7CisJCWlmIChzdGF0dXMgPiAwKSB7CisJCQkvKm5vdGlmeSBob3N0YXBkIGFib3V0IGNoYW5uZWwgb3ZlcnJpZGUgKi8KKwkJCXdsYW5faGRkX2NmZzgwMjExX2Fjc19jaF9zZWxlY3RfZXZ0KGFkYXB0ZXIpOworCQkJY2xlYXJfYml0KEFDU19JTl9QUk9HUkVTUywgJmhkZF9jdHgtPmdfZXZlbnRfZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJc3RhdHVzID0gd2xhbl9oZGRfY29uZmlnX2FjcyhoZGRfY3R4LCBhZGFwdGVyKTsKKwlpZiAoc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQUNTIGNvbmZpZyBmYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFjc19ldmVudF9jYWxsYmFjayA9IGhkZF9ob3N0YXBkX3NhcF9ldmVudF9jYjsKKworCWNkZl9tZW1fY29weShzYXBfY29uZmlnLT5zZWxmX21hY2FkZHIuYnl0ZXMsCisJCWFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLCBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCWhkZExvZyhMT0cxLCBGTCgiQUNTIFN0YXJ0ZWQgZm9yIHdsYW4lZCIpLCBhZGFwdGVyLT5kZXYtPmlmaW5kZXgpOworCXN0YXR1cyA9IHdsYW5zYXBfYWNzX2Noc2VsZWN0KAorI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJV0xBTl9IRERfR0VUX1NBUF9DVFhfUFRSKGFkYXB0ZXIpLAorI2Vsc2UKKwkJaGRkX2N0eC0+cGNkc19jb250ZXh0LAorI2VuZGlmCisJCWFjc19ldmVudF9jYWxsYmFjaywgc2FwX2NvbmZpZywgYWRhcHRlci0+ZGV2KTsKKworCisJaWYgKHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkFDUyBjaGFubmVsIHNlbGVjdCBmYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzYXBfY29uZmlnLT5hY3NfY2ZnLmFjc19tb2RlID0gdHJ1ZTsKKwlzZXRfYml0KEFDU19JTl9QUk9HUkVTUywgJmhkZF9jdHgtPmdfZXZlbnRfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9kb19hY3MgOiBDRkc4MDIxMSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBET19BQ1MgVmVuZG9yIENNRAorICogQHdpcGh5OiAgTGludXggd2lwaHkgc3RydWN0IHBvaW50ZXIKKyAqIEB3ZGV2OiAgIExpbnV4IHdpcmVsZXNzIGRldmljZSBzdHJ1Y3QgcG9pbnRlcgorICogQGRhdGE6ICAgQUNTIGluZm9ybWF0aW9uIGZyb20gaG9zdGFwZAorICogQGRhdGFfbGVuOiBBQ1MgaW5mb3JtYXRpb24gbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGUgRE9fQUNTIFZlbmRvciBjb21tYW5kIGZyb20gaG9zdGFwZCwgcGFyc2VzIEFDUyBjb25maWcKKyAqIGFuZCBzdGFydHMgQUNTIHByb2NlZHVyZS4KKyAqCisgKiBSZXR1cm46IEFDUyBwcm9jZWR1cmUgc3RhcnQgc3RhdHVzCisgKi8KKworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2RvX2FjcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQljb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihuZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJdHNhcF9Db25maWdfdCAqc2FwX2NvbmZpZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdGVtcF9za2J1ZmY7CisJaW50IHN0YXR1cyA9IC1FSU5WQUwsIGkgPSAwOworCXN0cnVjdCBubGF0dHIgKnRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19NQVggKyAxXTsKKwlib29sIGh0X2VuYWJsZWQsIGh0NDBfZW5hYmxlZCwgdmh0X2VuYWJsZWQ7CisJdWludDhfdCBjaF93aWR0aDsKKworCS8qICoqKk5vdGUqKiogRG9ub3Qgc2V0IFNNRSBjb25maWcgcmVsYXRlZCB0byBBQ1Mgb3BlcmF0aW9uIGhlcmUgYmVjYXVzZQorCSAqIEFDUyBvcGVyYXRpb24gaXMgbm90IHN5bmNocm9ub3VzZSBhbmQgQUNTIGZvciBTZWNvbmQgQVAgbWF5IGNvbWUgd2hlbgorCSAqIEFDUyBvcGVyYXRpb24gZm9yIGZpcnN0IEFQIGlzIGdvaW5nIG9uLiBTbyBvbmx5IGRvX2FjcyBpcyBzcGxpdCB0bworCSAqIHNlcGVyYXRlIHN0YXJ0X2FjcyByb3V0aW5lLiBBbHNvIFNNRS1QTUFDIHN0cnVjdCB0aGF0IGlzIHVzZWQgdG8KKwkgKiBwYXNzIHBhcmVtZXRlcnMgZnJvbSBIREQgdG8gU0FQIGlzIGdsb2JhbC4gVGh1cyBBbGwgQUNTIHJlbGF0ZWQgU01FCisJICogY29uZmlnIHNoYWxsIGJlIHNldCBvbmx5IGZyb20gc3RhcnRfYWNzLgorCSAqLworCisJLyogbmxhX3BvbGljeSBQb2xpY3kgdGVtcGxhdGUuIFBvbGljeSBub3QgYXBwbGllZCBhcyBzb21lIGF0dHJpYnV0ZXMgYXJlCisJICogb3B0aW9uYWwgYW5kIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19DSF9MSVNUIGhhcyB2YXJpYWJsZSBsZW5ndGgKKwkgKgorCSAqIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfSFdfTU9ERV0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJICogW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19IVF9FTkFCTEVEXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCSAqIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfSFQ0MF9FTkFCTEVEXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCSAqIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfVkhUX0VOQUJMRURdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJICogW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19DSFdJRFRIXSA9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJICogW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19DSF9MSVNUXSA9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCisJICovCisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKGhkZF9jdHgtPmNvbmZpZy0+Zm9yY2Vfc2FwX2FjcykgeworCQloZGRMb2coTE9HRSwgRkwoIkhvc3RhcGQgQUNTIHJlamVjdGVkIGFzIERyaXZlciBBQ1MgZW5hYmxlZCIpKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJZ290byBvdXQ7CisJfQorCXNhcF9jb25maWcgPSAmYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWc7CisJY2RmX21lbV96ZXJvKCZzYXBfY29uZmlnLT5hY3NfY2ZnLCBzaXplb2Yoc3RydWN0IHNhcF9hY3NfY2ZnKSk7CisKKwlzdGF0dXMgPSBubGFfcGFyc2UodGIsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19NQVgsIGRhdGEsIGRhdGFfbGVuLAorCQkJCQkJTlVMTCk7CisJaWYgKHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiSW52YWxpZCBBVFRSIikpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19IV19NT0RFXSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiQXR0ciBod19tb2RlIGZhaWxlZCIpKTsKKwkJZ290byBvdXQ7CisJfQorCXNhcF9jb25maWctPmFjc19jZmcuaHdfbW9kZSA9IG5sYV9nZXRfdTgoCisJCQkJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19IV19NT0RFXSk7CisKKwlpZiAodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0hUX0VOQUJMRURdKQorCQlodF9lbmFibGVkID0KKwkJCW5sYV9nZXRfZmxhZyh0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfSFRfRU5BQkxFRF0pOworCWVsc2UKKwkJaHRfZW5hYmxlZCA9IDA7CisKKwlpZiAodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0hUNDBfRU5BQkxFRF0pCisJCWh0NDBfZW5hYmxlZCA9CisJCQlubGFfZ2V0X2ZsYWcodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0hUNDBfRU5BQkxFRF0pOworCWVsc2UKKwkJaHQ0MF9lbmFibGVkID0gMDsKKworCWlmICh0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfVkhUX0VOQUJMRURdKQorCQl2aHRfZW5hYmxlZCA9CisJCQlubGFfZ2V0X2ZsYWcodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX1ZIVF9FTkFCTEVEXSk7CisJZWxzZQorCQl2aHRfZW5hYmxlZCA9IDA7CisKKwlpZiAodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0NIV0lEVEhdKSB7CisJCWNoX3dpZHRoID0gbmxhX2dldF91MTYodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0NIV0lEVEhdKTsKKwl9IGVsc2UgeworCQlpZiAoaHRfZW5hYmxlZCAmJiBodDQwX2VuYWJsZWQpCisJCQljaF93aWR0aCA9IDQwOworCQllbHNlCisJCQljaF93aWR0aCA9IDIwOworCX0KKwlpZiAoY2hfd2lkdGggPT0gODApCisJCXNhcF9jb25maWctPmFjc19jZmcuY2hfd2lkdGggPSBDSF9XSURUSF84ME1IWjsKKwllbHNlIGlmIChjaF93aWR0aCA9PSA0MCkKKwkJc2FwX2NvbmZpZy0+YWNzX2NmZy5jaF93aWR0aCA9IENIX1dJRFRIXzQwTUhaOworCWVsc2UKKwkJc2FwX2NvbmZpZy0+YWNzX2NmZy5jaF93aWR0aCA9IENIX1dJRFRIXzIwTUhaOworCisJLyogaHdfbW9kZSA9IGEvYi9nOiBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfQ0hfTElTVCBhbmQKKwkgKiBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfRlJFUV9MSVNUIGF0dHJzIGFyZSBwcmVzZW50LCBhbmQKKwkgKiBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfQ0hfTElTVCBpcyB1c2VkIGZvciBvYnRhaW5pbmcgdGhlCisJICogY2hhbm5lbCBsaXN0LCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfRlJFUV9MSVNUIGlzIGlnbm9yZWQKKwkgKiBzaW5jZSBpdCBjb250YWlucyB0aGUgZnJlcXVlbmN5IHZhbHVlcyBvZiB0aGUgY2hhbm5lbHMgaW4KKwkgKiB0aGUgY2hhbm5lbCBsaXN0LgorCSAqIGh3X21vZGUgPSBhbnk6IG9ubHkgUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0ZSRVFfTElTVCBhdHRyCisJICogaXMgcHJlc2VudAorCSAqLworCWlmICh0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfQ0hfTElTVF0pIHsKKwkJY2hhciAqdG1wID0gbmxhX2RhdGEodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0NIX0xJU1RdKTsKKwkJc2FwX2NvbmZpZy0+YWNzX2NmZy5jaF9saXN0X2NvdW50ID0gbmxhX2xlbigKKwkJCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0NIX0xJU1RdKTsKKwkJaWYgKHNhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdF9jb3VudCkgeworCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5jaF9saXN0ID0gY2RmX21lbV9tYWxsb2MoCisJCQkJCXNpemVvZih1aW50OF90KSAqCisJCQkJCXNhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdF9jb3VudCk7CisJCQlpZiAoc2FwX2NvbmZpZy0+YWNzX2NmZy5jaF9saXN0ID09IE5VTEwpCisJCQkJZ290byBvdXQ7CisKKwkJCWNkZl9tZW1fY29weShzYXBfY29uZmlnLT5hY3NfY2ZnLmNoX2xpc3QsIHRtcCwKKwkJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5jaF9saXN0X2NvdW50KTsKKwkJfQorCX0gZWxzZSBpZiAodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0ZSRVFfTElTVF0pIHsKKwkJdWludDMyX3QgKmZyZXEgPQorCQkJbmxhX2RhdGEodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0ZSRVFfTElTVF0pOworCQlzYXBfY29uZmlnLT5hY3NfY2ZnLmNoX2xpc3RfY291bnQgPSBubGFfbGVuKAorCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0ZSRVFfTElTVF0pIC8KKwkJCQlzaXplb2YodWludDMyX3QpOworCQlpZiAoc2FwX2NvbmZpZy0+YWNzX2NmZy5jaF9saXN0X2NvdW50KSB7CisJCQlzYXBfY29uZmlnLT5hY3NfY2ZnLmNoX2xpc3QgPSBjZGZfbWVtX21hbGxvYygKKwkJCQlzYXBfY29uZmlnLT5hY3NfY2ZnLmNoX2xpc3RfY291bnQpOworCQkJaWYgKHNhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdCA9PSBOVUxMKSB7CisJCQkJaGRkTG9nKExPR0UsIEZMKCJBQ1MgY29uZmlnIGFsbG9jIGZhaWwiKSk7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJLyogY29udmVydCBmcmVxdWVuY3kgdG8gY2hhbm5lbCAqLworCQkJZm9yIChpID0gMDsgaSA8IHNhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdF9jb3VudDsgaSsrKQorCQkJCXNhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdFtpXSA9CisJCQkJCWllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChmcmVxW2ldKTsKKwkJfQorCX0KKworCWhkZF9kZWJ1ZygiZ2V0IHBjbCBmb3IgRE9fQUNTIHZlbmRvciBjb21tYW5kIik7CisKKwkvKiBjb25zdWx0IHBvbGljeSBtYW5hZ2VyIHRvIGdldCBQQ0wgKi8KKwlzdGF0dXMgPSBjZHNfZ2V0X3BjbChoZGRfY3R4LCBDRFNfU0FQX01PREUsCisJCQkJCXNhcF9jb25maWctPmFjc19jZmcucGNsX2NoYW5uZWxzLAorCQkJCQkmc2FwX2NvbmZpZy0+YWNzX2NmZy5wY2xfY2hfY291bnQpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQloZGRMb2coTE9HRSwgRkwoIkdldCBQQ0wgZmFpbGVkIikpOworCisJd2xhbl9oZGRfc2V0X2Fjc19jaF9yYW5nZShzYXBfY29uZmlnLCBodF9lbmFibGVkLCB2aHRfZW5hYmxlZCk7CisKKwkvKiBBQ1Mgb3ZlcnJpZGUgZm9yIGFuZHJvaWQgKi8KKwlpZiAoaGRkX2N0eC0+Y29uZmlnLT5zYXBfcDJwXzExYWNfb3ZlcnJpZGUgJiYgaHRfZW5hYmxlZCkgeworCQloZGRMb2coTE9HMSwgRkwoIkFDUyBDb25maWcgb3ZlcnJpZGUgZm9yIDExQUMiKSk7CisJCXZodF9lbmFibGVkID0gMTsKKwkJc2FwX2NvbmZpZy0+YWNzX2NmZy5od19tb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYWM7CisJCXNhcF9jb25maWctPmFjc19jZmcuY2hfd2lkdGggPQorCQkJCQloZGRfY3R4LT5jb25maWctPnZodENoYW5uZWxXaWR0aDsKKwkJLyogTm8gVkhUODAgaW4gMi40RyBzbyBwZXJmb3JtIEFDUyBhY2NvcmRpbmdseSAqLworCQlpZiAoc2FwX2NvbmZpZy0+YWNzX2NmZy5lbmRfY2ggPD0gMTQgJiYKKwkJCXNhcF9jb25maWctPmFjc19jZmcuY2hfd2lkdGggPT0gZUhUX0NIQU5ORUxfV0lEVEhfODBNSFopCisJCQlzYXBfY29uZmlnLT5hY3NfY2ZnLmNoX3dpZHRoID0gZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFo7CisJfQorCisJaGRkTG9nKExPRzEsIEZMKCJBQ1MgQ29uZmlnIGZvciB3bGFuJWQ6IEhXX01PREU6ICVkIEFDU19CVzogJWQgSFQ6ICVkIFZIVDogJWQgU1RBUlRfQ0g6ICVkIEVORF9DSDogJWQiKSwKKwkJYWRhcHRlci0+ZGV2LT5pZmluZGV4LCBzYXBfY29uZmlnLT5hY3NfY2ZnLmh3X21vZGUsCisJCWNoX3dpZHRoLCBodF9lbmFibGVkLCB2aHRfZW5hYmxlZCwKKwkJc2FwX2NvbmZpZy0+YWNzX2NmZy5zdGFydF9jaCwgc2FwX2NvbmZpZy0+YWNzX2NmZy5lbmRfY2gpOworCisJaWYgKHNhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdF9jb3VudCkgeworCQloZGRMb2coTE9HMSwgRkwoIkFDUyBjaGFubmVsIGxpc3Q6IGxlbjogJWQiKSwKKwkJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5jaF9saXN0X2NvdW50KTsKKwkJZm9yIChpID0gMDsgaSA8IHNhcF9jb25maWctPmFjc19jZmcuY2hfbGlzdF9jb3VudDsgaSsrKQorCQkJaGRkTG9nKExPRzEsICIlZCAiLCBzYXBfY29uZmlnLT5hY3NfY2ZnLmNoX2xpc3RbaV0pOworCX0KKwlzYXBfY29uZmlnLT5hY3NfY2ZnLmFjc19tb2RlID0gdHJ1ZTsKKwlpZiAodGVzdF9iaXQoQUNTX0lOX1BST0dSRVNTLCAmaGRkX2N0eC0+Z19ldmVudF9mbGFncykpIHsKKwkJLyogKioqTm90ZSoqKiBDb21wbGV0aW9uIHZhcmlhYmxlIHVzYWdlIGlzIG5vdCBhbGxvd2VkIGhlcmUgc2luY2UKKwkJICogQUNTIHNjYW4gb3BlcmF0aW9uIG1heSB0YWtlIG1heCAyLjIgc2VjIGZvciA1RyBiYW5kLgorCQkgKiA5IEFjdGl2ZSBjaGFubmVsIFggNDAgbXMgYWN0aXZlIHNjYW4gdGltZSArCisJCSAqIDE2IFBhc3NpdmUgY2hhbm5lbCBYIDExMG1zIHBhc3NpdmUgc2NhbiB0aW1lCisJCSAqIFNpbmNlIHRoaXMgQ0ZHODAyMTEgY2FsbCBsb2NrIHJ0bmwgbXV0ZXgsIHdlIGNhbm5vdCBob2xkIG9uCisJCSAqIGZvciB0aGlzIGxvbmcuIFNvIHdlIHNwbGl0IHVwIHRoZSBzY2FubmluZyBwYXJ0LgorCQkgKi8KKwkJc2V0X2JpdChBQ1NfUEVORElORywgJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKwkJaGRkTG9nKExPRzEsIEZMKCJBQ1MgUGVuZGluZyBmb3Igd2xhbiVkIiksCisJCQkJCQkJYWRhcHRlci0+ZGV2LT5pZmluZGV4KTsKKwkJc3RhdHVzID0gMDsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9hY3MoYWRhcHRlcik7CisJfQorCitvdXQ6CisJaWYgKDAgPT0gc3RhdHVzKSB7CisJCXRlbXBfc2tidWZmID0gY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2Iod2lwaHksCisJCQkJCQkJICAgICAgTkxNU0dfSERSTEVOKTsKKwkJaWYgKHRlbXBfc2tidWZmICE9IE5VTEwpCisJCQlyZXR1cm4gY2ZnODAyMTFfdmVuZG9yX2NtZF9yZXBseSh0ZW1wX3NrYnVmZik7CisJfQorCisJY2xlYXJfYml0KEFDU19JTl9QUk9HUkVTUywgJmhkZF9jdHgtPmdfZXZlbnRfZmxhZ3MpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworIC8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZG9fYWNzIDogQ0ZHODAyMTEgaGFuZGxlciBmdW5jdGlvbiBmb3IgRE9fQUNTIFZlbmRvciBDTUQKKyAqIEB3aXBoeTogIExpbnV4IHdpcGh5IHN0cnVjdCBwb2ludGVyCisgKiBAd2RldjogICBMaW51eCB3aXJlbGVzcyBkZXZpY2Ugc3RydWN0IHBvaW50ZXIKKyAqIEBkYXRhOiAgIEFDUyBpbmZvcm1hdGlvbiBmcm9tIGhvc3RhcGQKKyAqIEBkYXRhX2xlbjogQUNTIGluZm9ybWF0aW9uIGxlbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlIERPX0FDUyBWZW5kb3IgY29tbWFuZCBmcm9tIGhvc3RhcGQsIHBhcnNlcyBBQ1MgY29uZmlnCisgKiBhbmQgc3RhcnRzIEFDUyBwcm9jZWR1cmUuCisgKgorICogUmV0dXJuOiBBQ1MgcHJvY2VkdXJlIHN0YXJ0IHN0YXR1cworICovCisKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZG9fYWNzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2RvX2Fjcyh3aXBoeSwgd2RldiwgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc3RhcnRfcGVuZGluZ19hY3MgOiBTdGFydCBwZW5kaW5nIEFDUyBwcm9jZWR1cmUgZm9yIFNBUAorICogQHdvcms6ICBMaW51eCB3b3JrcXVldWUgc3RydWN0IHBvaW50ZXIgZm9yIEFDUyB3b3JrCisgKgorICogVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIEFDUyBwcm9jZWR1cmUgd2hpY2ggd2FzIG1hcmtlZCBwZW5kaW5nIHdoZW4gYW4gQUNTCisgKiBwcm9jZWR1cmUgd2FzIGluIHByb2dyZXNzIGZvciBhIGNvbmN1cnJlbnQgU0FQIGludGVyZmFjZS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9wZW5kaW5nX2FjcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBoZGRfYWRhcHRlcl90LAorCQkJCQkJCWFjc19wZW5kaW5nX3dvcmsud29yayk7CisJd2xhbl9oZGRfY2ZnODAyMTFfc3RhcnRfYWNzKGFkYXB0ZXIpOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2Fjc19jaF9zZWxlY3RfZXZ0OiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgQUNTIGV2dAorICogQGFkYXB0ZXI6IFBvaW50ZXIgdG8gU0FQIGFkYXB0ZXIgc3RydWN0CisgKiBAcHJpX2NoYW5uZWw6IFNBUCBBQ1MgcHJvY2VkdXJlIHNlbGVjdGVkIFByaW1hcnkgY2hhbm5lbAorICogQHNlY19jaGFubmVsOiBTQVAgQUNTIHByb2NlZHVyZSBzZWxlY3RlZCBzZWNvbmRhcnkgY2hhbm5lbAorICoKKyAqIFRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiBmcm9tIFNBUCBtb2R1bGUgb24gQUNTIHByb2NlZHVyZSBpcyBjb21wbGV0ZWQuCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmQgdGhlIEFDUyBzZWxlY3RlZCBjaGFubmVsIGluZm9ybWF0aW9uIHRvIGhvc3RhcGQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworCit2b2lkIHdsYW5faGRkX2NmZzgwMjExX2Fjc19jaF9zZWxlY3RfZXZ0KGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisJdHNhcF9Db25maWdfdCAqc2FwX2NmZyA9ICYoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIoYWRhcHRlcikpLT5zYXBDb25maWc7CisJc3RydWN0IHNrX2J1ZmYgKnZlbmRvcl9ldmVudDsKKwlpbnQgcmV0X3ZhbDsKKwloZGRfYWRhcHRlcl90ICpjb25fc2FwX2FkYXB0ZXI7CisJdWludDE2X3QgY2hfd2lkdGg7CisKKwl2ZW5kb3JfZXZlbnQgPSBjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MoaGRkX2N0eC0+d2lwaHksCisJCQlOVUxMLAorCQkJNCAqIHNpemVvZih1OCkgKyAxICogc2l6ZW9mKHUxNikgKyA0ICsgTkxNU0dfSERSTEVOLAorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ET19BQ1NfSU5ERVgsCisJCQlHRlBfS0VSTkVMKTsKKworCWlmICghdmVuZG9yX2V2ZW50KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKworCXJldF92YWwgPSBoZGRfdmVuZG9yX3B1dF9pZmluZGV4KHZlbmRvcl9ldmVudCwgYWRhcHRlci0+ZGV2LT5pZmluZGV4KTsKKwlpZiAocmV0X3ZhbCkgeworCQloZGRMb2coTE9HRSwgRkwoIk5MODAyMTFfQVRUUl9JRklOREVYIHB1dCBmYWlsIikpOworCQlrZnJlZV9za2IodmVuZG9yX2V2ZW50KTsKKwkJcmV0dXJuOworCX0KKworCXJldF92YWwgPSBubGFfcHV0X3U4KHZlbmRvcl9ldmVudCwKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfUFJJTUFSWV9DSEFOTkVMLAorCQkJCXNhcF9jZmctPmFjc19jZmcucHJpX2NoKTsKKwlpZiAocmV0X3ZhbCkgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfUFJJTUFSWV9DSEFOTkVMIHB1dCBmYWlsIikpOworCQlrZnJlZV9za2IodmVuZG9yX2V2ZW50KTsKKwkJcmV0dXJuOworCX0KKworCXJldF92YWwgPSBubGFfcHV0X3U4KHZlbmRvcl9ldmVudCwKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfU0VDT05EQVJZX0NIQU5ORUwsCisJCQkJc2FwX2NmZy0+YWNzX2NmZy5odF9zZWNfY2gpOworCWlmIChyZXRfdmFsKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoCisJCQkiUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX1NFQ09OREFSWV9DSEFOTkVMIHB1dCBmYWlsIikpOworCQlrZnJlZV9za2IodmVuZG9yX2V2ZW50KTsKKwkJcmV0dXJuOworCX0KKworCXJldF92YWwgPSBubGFfcHV0X3U4KHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19WSFRfU0VHMF9DRU5URVJfQ0hBTk5FTCwKKwkJCXNhcF9jZmctPmFjc19jZmcudmh0X3NlZzBfY2VudGVyX2NoKTsKKwlpZiAocmV0X3ZhbCkgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKAorCQkJIlFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19WSFRfU0VHMF9DRU5URVJfQ0hBTk5FTCBwdXQgZmFpbCIpKTsKKwkJa2ZyZWVfc2tiKHZlbmRvcl9ldmVudCk7CisJCXJldHVybjsKKwl9CisKKwlyZXRfdmFsID0gbmxhX3B1dF91OCh2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfVkhUX1NFRzFfQ0VOVEVSX0NIQU5ORUwsCisJCQlzYXBfY2ZnLT5hY3NfY2ZnLnZodF9zZWcxX2NlbnRlcl9jaCk7CisJaWYgKHJldF92YWwpIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgKKwkJCSJRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfVkhUX1NFRzFfQ0VOVEVSX0NIQU5ORUwgcHV0IGZhaWwiKSk7CisJCWtmcmVlX3NrYih2ZW5kb3JfZXZlbnQpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNhcF9jZmctPmFjc19jZmcuY2hfd2lkdGggPT0gQ0hfV0lEVEhfODBNSFopCisJCWNoX3dpZHRoID0gODA7CisJZWxzZSBpZiAoc2FwX2NmZy0+YWNzX2NmZy5jaF93aWR0aCA9PSBDSF9XSURUSF80ME1IWikKKwkJY2hfd2lkdGggPSA0MDsKKwllbHNlCisJCWNoX3dpZHRoID0gMjA7CisKKwlyZXRfdmFsID0gbmxhX3B1dF91MTYodmVuZG9yX2V2ZW50LAorCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19DSFdJRFRILAorCQkJCWNoX3dpZHRoKTsKKwlpZiAocmV0X3ZhbCkgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKAorCQkJIlFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19DSFdJRFRIIHB1dCBmYWlsIikpOworCQlrZnJlZV9za2IodmVuZG9yX2V2ZW50KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc2FwX2NmZy0+YWNzX2NmZy5wcmlfY2ggPiAxNCkKKwkJcmV0X3ZhbCA9IG5sYV9wdXRfdTgodmVuZG9yX2V2ZW50LAorCQkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfSFdfTU9ERSwKKwkJCQkJUUNBX0FDU19NT0RFX0lFRUU4MDIxMUEpOworCWVsc2UKKwkJcmV0X3ZhbCA9IG5sYV9wdXRfdTgodmVuZG9yX2V2ZW50LAorCQkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfSFdfTU9ERSwKKwkJCQkJUUNBX0FDU19NT0RFX0lFRUU4MDIxMUcpOworCisJaWYgKHJldF92YWwpIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgKKwkJCSJRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfSFdfTU9ERSBwdXQgZmFpbCIpKTsKKwkJa2ZyZWVfc2tiKHZlbmRvcl9ldmVudCk7CisJCXJldHVybjsKKwl9CisKKwloZGRMb2coTE9HMSwKKwkJRkwoIkFDUyByZXN1bHQgZm9yIHdsYW4lZDogUFJJX0NIOiAlZCBTRUNfQ0g6ICVkIFZIVF9TRUcwOiAlZCBWSFRfU0VHMTogJWQgQUNTX0JXOiAlZCIpLAorCQlhZGFwdGVyLT5kZXYtPmlmaW5kZXgsIHNhcF9jZmctPmFjc19jZmcucHJpX2NoLAorCQlzYXBfY2ZnLT5hY3NfY2ZnLmh0X3NlY19jaCwgc2FwX2NmZy0+YWNzX2NmZy52aHRfc2VnMF9jZW50ZXJfY2gsCisJCXNhcF9jZmctPmFjc19jZmcudmh0X3NlZzFfY2VudGVyX2NoLCBjaF93aWR0aCk7CisKKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQodmVuZG9yX2V2ZW50LCBHRlBfS0VSTkVMKTsKKwkvKiAqKipOb3RlKioqIEFzIGFscmVhZHkgbWVudGlvbmVkIENvbXBsZXRpb24gdmFyaWFibGUgdXNhZ2UgaXMgbm90CisJICogYWxsb3dlZCBoZXJlIHNpbmNlIEFDUyBzY2FuIG9wZXJhdGlvbiBtYXkgdGFrZSBtYXggMi4yIHNlYy4KKwkgKiBGdXJ0aGVyIGluIEFQLUFQIG1vZGUgcGVuZGluZyBBQ1MgaXMgcmVzdW1lZCBoZXJlIHRvIHNlcmFpbGl6ZSBBQ1MKKwkgKiBvcGVyYXRpb24uCisJICogVE9ETzogRGVsYXllZCBvcGVyYXRpb24gaXMgdXNlZCBzaW5jZSBTTUUtUE1BQyBzdHJ1dCBpcyBnbG9iYWwuIFRodXMKKwkgKiB3aGVuIFByaW1hcnkgQVAgQUNTIGlzIGNvbXBsZXRlIGFuZCBzZWNvbmRhcnkgQVAgQUNTIGlzIHN0YXJ0ZWQgaGVyZQorCSAqIGltbWVkaWF0ZWx5LCBQcmltYXJ5IEFQIHN0YXJ0X2JzcyBtYXkgY29tZSBpbmJldHdlZW4gQUNTIG9wZXJhdGlvbgorCSAqIGFuZCBvdmVyd3JpdGUgU2VjIEFQIEFDUyBwYXJhbXRlcnMuIFRodXMgU2VjIEFQIEFDUyBpcyBleGVjdXRlZCB3aXRoCisJICogZGVsYXkuIFRoaXMgcGF0aCBhbmQgYmVsb3cgY29uc3RyYWludCB3aWxsIGJlIHJlbW92ZWQgb24gc2Vzc2lvbml6aW5nCisJICogU0FQIGFjcyBwYXJhbWV0ZXJzIGFuZCBkZWNvdXBsaW5nIFNBUCBmcm9tIFBNQUMgKFdJUCkuCisJICogQXMgcGVyIGRlc2lnbiBjb25zdHJhaW50IHVzZXIgc3BhY2UgY29udHJvbCBhcHBsaWNhdGlvbiBtdXN0IHRha2UKKwkgKiBjYXJlIG9mIHNlcmFpbGl6aW5nIGhvc3RhcGQgc3RhcnQgZm9yIGVhY2ggVklGIGluIEFQLUFQIG1vZGUgdG8gYXZvaWQKKwkgKiB0aGlzIGNvZGUgcGF0aC4gU2VjIEFQIGhvc3RhcGQgc2hvdWxkIGJlIHN0YXJ0ZWQgYWZ0ZXIgUHJpbWFyeSBBUAorCSAqIHN0YXJ0IGJlYWNvbmluZyB3aGljaCBjYW4gYmUgY29uZmlybWVkIGJ5IGdldGNoYW5uZWwgaXdwcml2IGNvbW1hbmQKKwkgKi8KKworCWNvbl9zYXBfYWRhcHRlciA9IGhkZF9nZXRfY29uX3NhcF9hZGFwdGVyKGFkYXB0ZXIsIGZhbHNlKTsKKwlpZiAoY29uX3NhcF9hZGFwdGVyICYmCisJCXRlc3RfYml0KEFDU19QRU5ESU5HLCAmY29uX3NhcF9hZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKyNpZmRlZiBDT05GSUdfQ05TUworCQljbnNzX2luaXRfZGVsYXllZF93b3JrKCZjb25fc2FwX2FkYXB0ZXItPmFjc19wZW5kaW5nX3dvcmssCisJCQkJICAgICAgd2xhbl9oZGRfY2ZnODAyMTFfc3RhcnRfcGVuZGluZ19hY3MpOworI2Vsc2UKKwkJSU5JVF9ERUxBWUVEX1dPUksoJmNvbl9zYXBfYWRhcHRlci0+YWNzX3BlbmRpbmdfd29yaywKKwkJCQkgICAgICB3bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9wZW5kaW5nX2Fjcyk7CisjZW5kaWYKKwkJLyogTGV0cyBnaXZlIDUwMG1zIGZvciBPQlNTICsgU1RBUlRfQlNTIHRvIGNvbXBsZXRlICovCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29uX3NhcF9hZGFwdGVyLT5hY3NfcGVuZGluZ193b3JrLAorCQkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CisJCWNsZWFyX2JpdChBQ1NfUEVORElORywgJmNvbl9zYXBfYWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV9nZXRfc3VwcG9ydGVkX2ZlYXR1cmVzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJIGludCBkYXRhX2xlbikKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdWludDMyX3QgZnNldCA9IDA7CisJaW50IHJldDsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZF9lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhkZCBjb250ZXh0IG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdpcGh5LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikpIHsKKwkJaGRkTG9nKExPRzEsIEZMKCJJbmZyYSBTdGF0aW9uIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IGRyaXZlciIpKTsKKwkJZnNldCB8PSBXSUZJX0ZFQVRVUkVfSU5GUkE7CisJfQorCWlmICh0cnVlID09IGhkZF9pc181Z19zdXBwb3J0ZWQocEhkZEN0eCkpIHsKKwkJaGRkTG9nKExPRzEsIEZMKCJJTkZSQV81RyBpcyBzdXBwb3J0ZWQgYnkgZmlybXdhcmUiKSk7CisJCWZzZXQgfD0gV0lGSV9GRUFUVVJFX0lORlJBXzVHOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisJaWYgKCh3aXBoeS0+aW50ZXJmYWNlX21vZGVzICYgQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpKSAmJgorCSAgICAod2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pKSkgeworCQloZGRMb2coTE9HMSwgRkwoIldpRmktRGlyZWN0IGlzIHN1cHBvcnRlZCBieSBkcml2ZXIiKSk7CisJCWZzZXQgfD0gV0lGSV9GRUFUVVJFX1AyUDsKKwl9CisjZW5kaWYKKwlmc2V0IHw9IFdJRklfRkVBVFVSRV9TT0ZUX0FQOworCisJLyogSE9UU1BPVCBpcyBhIHN1cHBsaWNhbnQgZmVhdHVyZSwgZW5hYmxlIGl0IGJ5IGRlZmF1bHQgKi8KKwlmc2V0IHw9IFdJRklfRkVBVFVSRV9IT1RTUE9UOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwlpZiAoc21lX2lzX2ZlYXR1cmVfc3VwcG9ydGVkX2J5X2Z3KEVYVEVOREVEX1NDQU4pKSB7CisJCWhkZExvZyhMT0cxLCBGTCgiRVhUU2NhbiBpcyBzdXBwb3J0ZWQgYnkgZmlybXdhcmUiKSk7CisJCWZzZXQgfD0gV0lGSV9GRUFUVVJFX0VYVFNDQU4gfCBXSUZJX0ZFQVRVUkVfSEFMX0VQTk87CisJfQorI2VuZGlmCisJaWYgKHdsYW5faGRkX25hbl9pc19zdXBwb3J0ZWQoKSkgeworCQloZGRMb2coTE9HMSwgRkwoIk5BTiBpcyBzdXBwb3J0ZWQgYnkgZmlybXdhcmUiKSk7CisJCWZzZXQgfD0gV0lGSV9GRUFUVVJFX05BTjsKKwl9CisJaWYgKHNtZV9pc19mZWF0dXJlX3N1cHBvcnRlZF9ieV9mdyhSVFQpKSB7CisJCWhkZExvZyhMT0cxLCBGTCgiUlRUIGlzIHN1cHBvcnRlZCBieSBmaXJtd2FyZSIpKTsKKwkJZnNldCB8PSBXSUZJX0ZFQVRVUkVfRDJEX1JUVDsKKwkJZnNldCB8PSBXSUZJX0ZFQVRVUkVfRDJBUF9SVFQ7CisJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCWlmIChwSGRkQ3R4LT5jb25maWctPmNvbmZpZ1BOT1NjYW5TdXBwb3J0ICYmCisJICAgIHNtZV9pc19mZWF0dXJlX3N1cHBvcnRlZF9ieV9mdyhQTk8pKSB7CisJCWhkZExvZyhMT0cxLCBGTCgiUE5PIGlzIHN1cHBvcnRlZCBieSBmaXJtd2FyZSIpKTsKKwkJZnNldCB8PSBXSUZJX0ZFQVRVUkVfUE5POworCX0KKyNlbmRpZgorCWZzZXQgfD0gV0lGSV9GRUFUVVJFX0FERElUSU9OQUxfU1RBOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJaWYgKCh0cnVlID09IHBIZGRDdHgtPmNvbmZpZy0+ZkVuYWJsZVRETFNTdXBwb3J0KSAmJgorCSAgICBzbWVfaXNfZmVhdHVyZV9zdXBwb3J0ZWRfYnlfZncoVERMUykpIHsKKwkJaGRkTG9nKExPRzEsIEZMKCJURExTIGlzIHN1cHBvcnRlZCBieSBmaXJtd2FyZSIpKTsKKwkJZnNldCB8PSBXSUZJX0ZFQVRVUkVfVERMUzsKKwl9CisJaWYgKHNtZV9pc19mZWF0dXJlX3N1cHBvcnRlZF9ieV9mdyhURExTKSAmJgorCSAgICAodHJ1ZSA9PSBwSGRkQ3R4LT5jb25maWctPmZFbmFibGVURExTT2ZmQ2hhbm5lbCkgJiYKKwkgICAgc21lX2lzX2ZlYXR1cmVfc3VwcG9ydGVkX2J5X2Z3KFRETFNfT0ZGX0NIQU5ORUwpKSB7CisJCWhkZExvZyhMT0cxLCBGTCgiVERMUyBvZmYtY2hhbm5lbCBpcyBzdXBwb3J0ZWQgYnkgZmlybXdhcmUiKSk7CisJCWZzZXQgfD0gV0lGSV9GRUFUVVJFX1RETFNfT0ZGQ0hBTk5FTDsKKwl9CisjZW5kaWYKKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorCWZzZXQgfD0gV0lGSV9GRUFUVVJFX0FQX1NUQTsKKyNlbmRpZgorCWZzZXQgfD0gV0lGSV9GRUFUVVJFX1JTU0lfTU9OSVRPUjsKKworCWlmIChoZGRfbGlua19sYXllcl9zdGF0c19zdXBwb3J0ZWQoKSkKKwkJZnNldCB8PSBXSUZJX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUzsKKworCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiKHdpcGh5LCBzaXplb2YoZnNldCkgKworCQkJCQkJICBOTE1TR19IRFJMRU4pOworCWlmICghc2tiKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2IgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaGRkTG9nKExPRzEsIEZMKCJTdXBwb3J0ZWQgRmVhdHVyZXMgOiAweCV4IiksIGZzZXQpOworCWlmIChubGFfcHV0X3UzMihza2IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0ZFQVRVUkVfU0VULCBmc2V0KSkgeworCQloZGRMb2coTE9HRSwgRkwoIm5sYSBwdXQgZmFpbCIpKTsKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQorCXJldHVybiBjZmc4MDIxMV92ZW5kb3JfY21kX3JlcGx5KHNrYik7CitubGFfcHV0X2ZhaWx1cmU6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3N1cHBvcnRlZF9mZWF0dXJlcygpIC0gZ2V0IHN1cHBvcnRlZCBmZWF0dXJlcworICogQHdpcGh5OiAgIHBvaW50ZXIgdG8gd2lyZWxlc3Mgd2lwaHkgc3RydWN0dXJlLgorICogQHdkZXY6ICAgIHBvaW50ZXIgdG8gd2lyZWxlc3NfZGV2IHN0cnVjdHVyZS4KKyAqIEBkYXRhOiAgICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHBhc3NlZCB2aWEgdmVuZG9yIGludGVyZmFjZQorICogQGRhdGFfbGVuOkxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSBwYXNzZWQKKyAqCisgKiBSZXR1cm46ICAgUmV0dXJuIHRoZSBTdWNjZXNzIG9yIEZhaWx1cmUgY29kZS4KKyAqLworc3RhdGljIGludAord2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3N1cHBvcnRlZF9mZWF0dXJlcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQljb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3N1cHBvcnRlZF9mZWF0dXJlcyh3aXBoeSwgd2RldiwKKwkJCQkJCWRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3NjYW5uaW5nX21hY19vdWkoKSAtIHNldCBzY2FuIE1BQworICogQHdpcGh5OiAgIHBvaW50ZXIgdG8gd2lyZWxlc3Mgd2lwaHkgc3RydWN0dXJlLgorICogQHdkZXY6ICAgIHBvaW50ZXIgdG8gd2lyZWxlc3NfZGV2IHN0cnVjdHVyZS4KKyAqIEBkYXRhOiAgICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHBhc3NlZCB2aWEgdmVuZG9yIGludGVyZmFjZQorICogQGRhdGFfbGVuOkxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSBwYXNzZWQKKyAqCisgKiBTZXQgdGhlIE1BQyBhZGRyZXNzIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3Igc2Nhbm5pbmcuCisgKgorICogUmV0dXJuOiAgIFJldHVybiB0aGUgU3VjY2VzcyBvciBGYWlsdXJlIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQKK19fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3NjYW5uaW5nX21hY19vdWkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCSBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgaW50IGRhdGFfbGVuKQoreworCXRwU2lyU2Nhbk1hY091aSBwUmVxTXNnID0gTlVMTDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX1NDQU5OSU5HX01BQ19PVUlfTUFYICsgMV07CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGZhbHNlID09IHBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlX21hY19zcG9vZmluZykgeworCQloZGRMb2coTE9HVywgRkwoIk1BQyBhZGRyZXNzIHNwb29maW5nIGlzIG5vdCBlbmFibGVkIikpOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKworCWlmIChubGFfcGFyc2UodGIsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NFVF9TQ0FOTklOR19NQUNfT1VJX01BWCwKKwkJICAgICAgZGF0YSwgZGF0YV9sZW4sIE5VTEwpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBBVFRSIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcFJlcU1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcFJlcU1zZykpOworCWlmICghcFJlcU1zZykgeworCQloZGRMb2coTE9HRSwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX1NDQU5OSU5HX01BQ19PVUldKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBtYWMgb3VpIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKwlubGFfbWVtY3B5KCZwUmVxTXNnLT5vdWlbMF0sCisJCSAgIHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1NFVF9TQ0FOTklOR19NQUNfT1VJXSwKKwkJICAgc2l6ZW9mKHBSZXFNc2ctPm91aSkpOworCWhkZExvZyhMT0cxLCBGTCgiT3VpICglMDJ4OiUwMng6JTAyeCkiKSwgcFJlcU1zZy0+b3VpWzBdLAorCSAgICAgICBwUmVxTXNnLT5vdWlbMV0sIHBSZXFNc2ctPm91aVsyXSk7CisJc3RhdHVzID0gc21lX3NldF9zY2FubmluZ19tYWNfb3VpKHBIZGRDdHgtPmhIYWwsIHBSZXFNc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJzbWVfc2V0X3NjYW5uaW5nX21hY19vdWkgZmFpbGVkKGVycj0lZCkiKSwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gMDsKK2ZhaWw6CisJY2RmX21lbV9mcmVlKHBSZXFNc2cpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3NldF9zY2FubmluZ19tYWNfb3VpKCkgLSBzZXQgc2NhbiBNQUMKKyAqIEB3aXBoeTogICBwb2ludGVyIHRvIHdpcmVsZXNzIHdpcGh5IHN0cnVjdHVyZS4KKyAqIEB3ZGV2OiAgICBwb2ludGVyIHRvIHdpcmVsZXNzX2RldiBzdHJ1Y3R1cmUuCisgKiBAZGF0YTogICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBwYXNzZWQgdmlhIHZlbmRvciBpbnRlcmZhY2UKKyAqIEBkYXRhX2xlbjpMZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgcGFzc2VkCisgKgorICogU2V0IHRoZSBNQUMgYWRkcmVzcyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHNjYW5uaW5nLiAgVGhpcyBpcyBhbgorICogU1NSLXByb3RlY3Rpbmcgd3JhcHBlciBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm46ICAgUmV0dXJuIHRoZSBTdWNjZXNzIG9yIEZhaWx1cmUgY29kZS4KKyAqLworc3RhdGljIGludAord2xhbl9oZGRfY2ZnODAyMTFfc2V0X3NjYW5uaW5nX21hY19vdWkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgICAgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3NjYW5uaW5nX21hY19vdWkod2lwaHksIHdkZXYsCisJCQkJCQkgICAgICAgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2ZlYXR1cmUoKSAtIFNldCB0aGUgYml0bWFzayBmb3Igc3VwcG9ydGVkIGZlYXR1cmVzCisgKiBAZmVhdHVyZV9mbGFnczogcG9pbnRlciB0byB0aGUgYnl0ZSBhcnJheSBvZiBmZWF0dXJlcy4KKyAqIEBmZWF0dXJlOiBGZWF0dXJlIHRvIGJlIHR1cm5lZCBPTiBpbiB0aGUgYnl0ZSBhcnJheS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB0byB0dXJuIE9OIG9yIFNFVCB0aGUgZmVhdHVyZSBmbGFnIGZvciB0aGUgcmVxdWVzdGVkIGZlYXR1cmUuCisgKiovCisjZGVmaW5lIE5VTV9CSVRTX0lOX0JZVEUgICAgICAgOAordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfZmVhdHVyZSh1aW50OF90ICpmZWF0dXJlX2ZsYWdzLCB1aW50OF90IGZlYXR1cmUpCit7CisJdWludDMyX3QgaW5kZXg7CisJdWludDhfdCBiaXRfbWFzazsKKworCWluZGV4ID0gZmVhdHVyZSAvIE5VTV9CSVRTX0lOX0JZVEU7CisJYml0X21hc2sgPSAxIDw8IChmZWF0dXJlICUgTlVNX0JJVFNfSU5fQllURSk7CisJZmVhdHVyZV9mbGFnc1tpbmRleF0gfD0gYml0X21hc2s7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9nZXRfZmVhdHVyZXMoKSAtIEdldCB0aGUgRHJpdmVyIFN1cHBvcnRlZCBmZWF0dXJlcworICogQHdpcGh5OiBwb2ludGVyIHRvIHdpcmVsZXNzIHdpcGh5IHN0cnVjdHVyZS4KKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHdpcmVsZXNzX2RldiBzdHJ1Y3R1cmUuCisgKiBAZGF0YTogUG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBwYXNzZWQgdmlhIHZlbmRvciBpbnRlcmZhY2UKKyAqIEBkYXRhX2xlbjpMZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgcGFzc2VkCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3bGFuIGRyaXZlciBuZWVkcyB0byBzZW5kIHN1cHBvcnRlZCBmZWF0dXJlIHNldCB0bworICogc3VwcGxpY2FudCB1cG9uIGEgcmVxdWVzdC9xdWVyeSBmcm9tIHRoZSBzdXBwbGljYW50LgorICoKKyAqIFJldHVybjogUmV0dXJuIHRoZSBTdWNjZXNzIG9yIEZhaWx1cmUgY29kZS4KKyAqKi8KKyNkZWZpbmUgTUFYX0NPTkNVUlJFTlRfQ0hBTl9PTl8yNEcgICAgMgorI2RlZmluZSBNQVhfQ09OQ1VSUkVOVF9DSEFOX09OXzVHICAgICAyCitzdGF0aWMgaW50CitfX3dsYW5faGRkX2NmZzgwMjExX2dldF9mZWF0dXJlcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSBjb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdWludDMyX3QgZGJzX2NhcGFiaWxpdHkgPSAwOworCWJvb2wgb25lX2J5X29uZV9kYnMsIHR3b19ieV90d29fZGJzOworCUNERl9TVEFUVVMgcmV0ID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJaW50IHJldF92YWw7CisKKwl1aW50OF90IGZlYXR1cmVfZmxhZ3NbKE5VTV9RQ0FfV0xBTl9WRU5ET1JfRkVBVFVSRVMgKyA3KSAvIDhdID0gezB9OworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHhfcHRyID0gd2lwaHlfcHJpdih3aXBoeSk7CisKKwlyZXRfdmFsID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4X3B0cik7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChoZGRfY3R4X3B0ci0+Y29uZmlnLT5pc1JvYW1PZmZsb2FkRW5hYmxlZCkgeworCQloZGRMb2coTE9HMSwgRkwoIktleSBNZ210IE9mZmxvYWQgaXMgc3VwcG9ydGVkIikpOworCQl3bGFuX2hkZF9jZmc4MDIxMV9zZXRfZmVhdHVyZShmZWF0dXJlX2ZsYWdzLAorCQkJCVFDQV9XTEFOX1ZFTkRPUl9GRUFUVVJFX0tFWV9NR01UX09GRkxPQUQpOworCX0KKworCXdsYW5faGRkX2NmZzgwMjExX3NldF9mZWF0dXJlKGZlYXR1cmVfZmxhZ3MsCisJCQkJUUNBX1dMQU5fVkVORE9SX0ZFQVRVUkVfU1VQUE9SVF9IV19NT0RFX0FOWSk7CisJaWYgKHdtYV9pc19zY2FuX3NpbXVsdGFuZW91c19jYXBhYmxlKCkpCisJCXdsYW5faGRkX2NmZzgwMjExX3NldF9mZWF0dXJlKGZlYXR1cmVfZmxhZ3MsCisJCQlRQ0FfV0xBTl9WRU5ET1JfRkVBVFVSRV9PRkZDSEFOTkVMX1NJTVVMVEFORU9VUyk7CisJc2tiID0gY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2Iod2lwaHksIHNpemVvZihmZWF0dXJlX2ZsYWdzKSArCisJCQlOTE1TR19IRFJMRU4pOworCisJaWYgKCFza2IpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjZmc4MDIxMV92ZW5kb3JfY21kX2FsbG9jX3JlcGx5X3NrYiBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChubGFfcHV0KHNrYiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfRkVBVFVSRV9GTEFHUywKKwkJCXNpemVvZihmZWF0dXJlX2ZsYWdzKSwgZmVhdHVyZV9mbGFncykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJcmV0ID0gd21hX2dldF9kYnNfaHdfbW9kZXMoJm9uZV9ieV9vbmVfZGJzLCAmdHdvX2J5X3R3b19kYnMpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gcmV0KSB7CisJCWlmIChvbmVfYnlfb25lX2RicykKKwkJCWRic19jYXBhYmlsaXR5ID0gRFJWX0RCU19DQVBBQklMSVRZXzFYMTsKKworCQlpZiAodHdvX2J5X3R3b19kYnMpCisJCQlkYnNfY2FwYWJpbGl0eSA9IERSVl9EQlNfQ0FQQUJJTElUWV8yWDI7CisKKwkJaWYgKCFvbmVfYnlfb25lX2RicyAmJiAhdHdvX2J5X3R3b19kYnMpCisJCQlkYnNfY2FwYWJpbGl0eSA9IERSVl9EQlNfQ0FQQUJJTElUWV9ESVNBQkxFRDsKKwl9IGVsc2UgeworCQloZGRfZXJyKCJ3bWFfZ2V0X2Ric19od19tb2RlIGZhaWxlZCIpOworCQlkYnNfY2FwYWJpbGl0eSA9IERSVl9EQlNfQ0FQQUJJTElUWV9ESVNBQkxFRDsKKwl9CisKKwloZGRfaW5mbygiZGJzX2NhcGFiaWxpdHkgaXMgJWQiLCBkYnNfY2FwYWJpbGl0eSk7CisKKwlpZiAobmxhX3B1dF91MzIoc2tiLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTUFYX0NPTkNVUlJFTlRfQ0hBTk5FTFNfMl80X0JBTkQsCisJCQlNQVhfQ09OQ1VSUkVOVF9DSEFOX09OXzI0RykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKG5sYV9wdXRfdTMyKHNrYiwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX01BWF9DT05DVVJSRU5UX0NIQU5ORUxTXzVfMF9CQU5ELAorCQkJTUFYX0NPTkNVUlJFTlRfQ0hBTl9PTl81RykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJcmV0dXJuIGNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkoc2tiKTsKKworbmxhX3B1dF9mYWlsdXJlOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2dldF9mZWF0dXJlcygpIC0gR2V0IHRoZSBEcml2ZXIgU3VwcG9ydGVkIGZlYXR1cmVzCisgKiBAd2lwaHk6ICAgcG9pbnRlciB0byB3aXJlbGVzcyB3aXBoeSBzdHJ1Y3R1cmUuCisgKiBAd2RldjogICAgcG9pbnRlciB0byB3aXJlbGVzc19kZXYgc3RydWN0dXJlLgorICogQGRhdGE6ICAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgcGFzc2VkIHZpYSB2ZW5kb3IgaW50ZXJmYWNlCisgKiBAZGF0YV9sZW46TGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHBhc3NlZAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2xhbiBkcml2ZXIgbmVlZHMgdG8gc2VuZCBzdXBwb3J0ZWQgZmVhdHVyZSBzZXQgdG8KKyAqIHN1cHBsaWNhbnQgdXBvbiBhIHJlcXVlc3QvcXVlcnkgZnJvbSB0aGUgc3VwcGxpY2FudC4KKyAqCisgKiBSZXR1cm46ICAgUmV0dXJuIHRoZSBTdWNjZXNzIG9yIEZhaWx1cmUgY29kZS4KKyAqLworc3RhdGljIGludAord2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2ZlYXR1cmVzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCWNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2dldF9mZWF0dXJlcyh3aXBoeSwgd2RldiwKKwkJCQkJICAgICAgIGRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfZXh0X3JvYW1fcGFyYW1zKCkgLSBTZXR0aW5ncyBmb3Igcm9hbWluZyBwYXJhbWV0ZXJzCisgKiBAd2lwaHk6ICAgICAgICAgICAgICAgICBUaGUgd2lwaHkgc3RydWN0dXJlCisgKiBAd2RldjogICAgICAgICAgICAgICAgICBUaGUgd2lyZWxlc3MgZGV2aWNlCisgKiBAZGF0YTogICAgICAgICAgICAgICAgICBEYXRhIHBhc3NlZCBieSBmcmFtZXdvcmsKKyAqIEBkYXRhX2xlbjogICAgICAgICAgICAgIFBhcmFtZXRlcnMgdG8gYmUgY29uZmlndXJlZCBwYXNzZWQgYXMgZGF0YQorICoKKyAqIFRoZSByb2FtaW5nIHJlbGF0ZWQgcGFyYW1ldGVycyBhcmUgY29uZmlndXJlZCBieSB0aGUgZnJhbWV3b3JrCisgKiB1c2luZyB0aGlzIGludGVyZmFjZS4KKyAqCisgKiBSZXR1cm46IFJldHVybiBlaXRoZXIgc3VjY2VzcyBvciBmYWlsdXJlIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQKK19fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2V4dF9yb2FtX3BhcmFtcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsKKwlzdHJ1Y3Qgcm9hbV9leHRfcGFyYW1zIHJvYW1fcGFyYW1zOworCXVpbnQzMl90IGNtZF90eXBlLCByZXFfaWQ7CisJc3RydWN0IG5sYXR0ciAqY3Vycl9hdHRyOworCXN0cnVjdCBubGF0dHIgKnRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fTUFYICsgMV07CisJc3RydWN0IG5sYXR0ciAqdGIyW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fTUFYICsgMV07CisJaW50IHJlbSwgaTsKKwl1aW50MzJfdCBidWZfbGVuID0gMDsKKwlpbnQgcmV0OworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX01BWCwKKwkJZGF0YSwgZGF0YV9sZW4sCisJCU5VTEwpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBBVFRSIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogUGFyc2UgYW5kIGZldGNoIENvbW1hbmQgVHlwZSovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1NVQkNNRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJyb2FtIGNtZCB0eXBlIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKwlzZXNzaW9uX2lkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsKKwljZGZfbWVtX3NldCgmcm9hbV9wYXJhbXMsIHNpemVvZihyb2FtX3BhcmFtcyksIDApOworCWNtZF90eXBlID0gbmxhX2dldF91MzIodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19TVUJDTURdKTsKKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUkVRX0lEXSkgeworCQloZGRMb2coTE9HRSwgRkwoImF0dHIgcmVxdWVzdCBpZCBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJcmVxX2lkID0gbmxhX2dldF91MzIoCisJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUkVRX0lEXSk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgRkwoIlJlcSBJZCAoJWQpIiksIHJlcV9pZCk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgRkwoIkNtZCBUeXBlICglZCkiKSwgY21kX3R5cGUpOworCXN3aXRjaCAoY21kX3R5cGUpIHsKKwljYXNlIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fU1VCQ01EX1NTSURfV0hJVEVfTElTVDoKKwkJaSA9IDA7CisJCW5sYV9mb3JfZWFjaF9uZXN0ZWQoY3Vycl9hdHRyLAorCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9XSElURV9MSVNUX1NTSURfTElTVF0sCisJCQlyZW0pIHsKKwkJCWlmIChubGFfcGFyc2UodGIyLAorCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fU1VCQ01EX01BWCwKKwkJCQlubGFfZGF0YShjdXJyX2F0dHIpLCBubGFfbGVuKGN1cnJfYXR0ciksCisJCQkJTlVMTCkpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJRkwoIm5sYV9wYXJzZSBmYWlsZWQiKSk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJLyogUGFyc2UgYW5kIEZldGNoIGFsbG93ZWQgU1NJRCBsaXN0Ki8KKwkJCWlmICghdGIyW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fV0hJVEVfTElTVF9TU0lEXSkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBhbGxvd2VkIHNzaWQgZmFpbGVkIikpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCWJ1Zl9sZW4gPSBubGFfbGVuKHRiMltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1dISVRFX0xJU1RfU1NJRF0pOworCQkJLyoKKwkJCSAqIFVwcGVyIExheWVycyBpbmNsdWRlIGEgbnVsbCB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuCisJCQkgKiBDaGVjayBmb3IgdGhlIGFjdHVhbCBwZXJtaXNzaWJsZSBsZW5ndGggb2YgU1NJRCBhbmQKKwkJCSAqIGFsc28gZW5zdXJlIG5vdCB0byBjb3B5IHRoZSBOVUxMIHRlcm1pbmF0aW9uCisJCQkgKiBjaGFyYWN0ZXIgdG8gdGhlIGRyaXZlciBidWZmZXIuCisJCQkgKi8KKwkJCWlmIChidWZfbGVuICYmIChpIDwgTUFYX1NTSURfQUxMT1dFRF9MSVNUKSAmJgorCQkJCSgoYnVmX2xlbiAtIDEpIDw9IFNJUl9NQUNfTUFYX1NTSURfTEVOR1RIKSkgeworCQkJCW5sYV9tZW1jcHkoCisJCQkJCXJvYW1fcGFyYW1zLnNzaWRfYWxsb3dlZF9saXN0W2ldLnNzSWQsCisJCQkJCXRiMltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1dISVRFX0xJU1RfU1NJRF0sCisJCQkJCWJ1Zl9sZW4gLSAxKTsKKwkJCQlyb2FtX3BhcmFtcy5zc2lkX2FsbG93ZWRfbGlzdFtpXS5sZW5ndGggPQorCQkJCQlidWZfbGVuIC0gMTsKKwkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCQlGTCgiU1NJRFslZF06ICUuKnMsbGVuZ3RoID0gJWQiKSwgaSwKKwkJCQkJcm9hbV9wYXJhbXMuc3NpZF9hbGxvd2VkX2xpc3RbaV0ubGVuZ3RoLAorCQkJCQlyb2FtX3BhcmFtcy5zc2lkX2FsbG93ZWRfbGlzdFtpXS5zc0lkLAorCQkJCQlyb2FtX3BhcmFtcy5zc2lkX2FsbG93ZWRfbGlzdFtpXS5sZW5ndGgpOworCQkJCWkrKzsKKwkJCX0gZWxzZSB7CisJCQkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIGJ1ZmZlciBsZW5ndGgiKSk7CisJCQl9CisJCX0KKwkJcm9hbV9wYXJhbXMubnVtX3NzaWRfYWxsb3dlZF9saXN0ID0gaTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgRkwoIk51bSBvZiBBbGxvd2VkIFNTSUQgJWQiKSwKKwkJCXJvYW1fcGFyYW1zLm51bV9zc2lkX2FsbG93ZWRfbGlzdCk7CisJCXNtZV91cGRhdGVfcm9hbV9wYXJhbXMocEhkZEN0eC0+aEhhbCwgc2Vzc2lvbl9pZCwKKwkJCQlyb2FtX3BhcmFtcywgUkVBU09OX1JPQU1fU0VUX1NTSURfQUxMT1dFRCk7CisJCWJyZWFrOworCWNhc2UgUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfU0VUX0VYVFNDQU5fUk9BTV9QQVJBTVM6CisJCS8qIFBhcnNlIGFuZCBmZXRjaCA1RyBCb29zdCBUaHJlc2hvbGQgKi8KKwkJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FfQkFORF9CT09TVF9USFJFU0hPTERdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIjVHIGJvb3N0IHRocmVzaG9sZCBmYWlsZWQiKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcm9hbV9wYXJhbXMucmFpc2VfcnNzaV90aHJlc2hfNWcgPSBubGFfZ2V0X3MzMigKKwkJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fQV9CQU5EX0JPT1NUX1RIUkVTSE9MRF0pOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBGTCgiNUcgQm9vc3QgVGhyZXNob2xkICglZCkiKSwKKwkJCXJvYW1fcGFyYW1zLnJhaXNlX3Jzc2lfdGhyZXNoXzVnKTsKKwkJLyogUGFyc2UgYW5kIGZldGNoIDVHIFBlbmFsdHkgVGhyZXNob2xkICovCisJCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9BX0JBTkRfUEVOQUxUWV9USFJFU0hPTERdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIjVHIHBlbmFsdHkgdGhyZXNob2xkIGZhaWxlZCIpKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlyb2FtX3BhcmFtcy5kcm9wX3Jzc2lfdGhyZXNoXzVnID0gbmxhX2dldF9zMzIoCisJCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FfQkFORF9QRU5BTFRZX1RIUkVTSE9MRF0pOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBGTCgiNUcgUGVuYWx0eSBUaHJlc2hvbGQgKCVkKSIpLAorCQkJcm9hbV9wYXJhbXMuZHJvcF9yc3NpX3RocmVzaF81Zyk7CisJCS8qIFBhcnNlIGFuZCBmZXRjaCA1RyBCb29zdCBGYWN0b3IgKi8KKwkJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FfQkFORF9CT09TVF9GQUNUT1JdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIjVHIGJvb3N0IEZhY3RvciBmYWlsZWQiKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcm9hbV9wYXJhbXMucmFpc2VfZmFjdG9yXzVnID0gbmxhX2dldF91MzIoCisJCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FfQkFORF9CT09TVF9GQUNUT1JdKTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgRkwoIjVHIEJvb3N0IEZhY3RvciAoJWQpIiksCisJCQlyb2FtX3BhcmFtcy5yYWlzZV9mYWN0b3JfNWcpOworCQkvKiBQYXJzZSBhbmQgZmV0Y2ggNUcgUGVuYWx0eSBmYWN0b3IgKi8KKwkJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FfQkFORF9QRU5BTFRZX0ZBQ1RPUl0pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiNUcgUGVuYWx0eSBGYWN0b3IgZmFpbGVkIikpOworCQkJZ290byBmYWlsOworCQl9CisJCXJvYW1fcGFyYW1zLmRyb3BfZmFjdG9yXzVnID0gbmxhX2dldF91MzIoCisJCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FfQkFORF9QRU5BTFRZX0ZBQ1RPUl0pOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBGTCgiNUcgUGVuYWx0eSBmYWN0b3IgKCVkKSIpLAorCQkJcm9hbV9wYXJhbXMuZHJvcF9mYWN0b3JfNWcpOworCQkvKiBQYXJzZSBhbmQgZmV0Y2ggNUcgTWF4IEJvb3N0ICovCisJCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9BX0JBTkRfTUFYX0JPT1NUXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCI1RyBNYXggQm9vc3QgZmFpbGVkIikpOworCQkJZ290byBmYWlsOworCQl9CisJCXJvYW1fcGFyYW1zLm1heF9yYWlzZV9yc3NpXzVnID0gbmxhX2dldF91MzIoCisJCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FfQkFORF9NQVhfQk9PU1RdKTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgRkwoIjVHIE1heCBCb29zdCAoJWQpIiksCisJCQlyb2FtX3BhcmFtcy5tYXhfcmFpc2VfcnNzaV81Zyk7CisJCS8qIFBhcnNlIGFuZCBmZXRjaCBSc3NpIERpZmYgKi8KKwkJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0xBWllfUk9BTV9ISVNURVJFU1lTXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJSc3NpIERpZmYgZmFpbGVkIikpOworCQkJZ290byBmYWlsOworCQl9CisJCXJvYW1fcGFyYW1zLnJzc2lfZGlmZiA9IG5sYV9nZXRfczMyKAorCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9MQVpZX1JPQU1fSElTVEVSRVNZU10pOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBGTCgiUlNTSSBEaWZmICglZCkiKSwKKwkJCXJvYW1fcGFyYW1zLnJzc2lfZGlmZik7CisJCS8qIFBhcnNlIGFuZCBmZXRjaCBBbGVydCBSc3NpIFRocmVzaG9sZCAqLworCQlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fQUxFUlRfUk9BTV9SU1NJX1RSSUdHRVJdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIkFsZXJ0IFJzc2kgVGhyZXNob2xkIGZhaWxlZCIpKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlyb2FtX3BhcmFtcy5hbGVydF9yc3NpX3RocmVzaG9sZCA9IG5sYV9nZXRfdTMyKAorCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9BTEVSVF9ST0FNX1JTU0lfVFJJR0dFUl0pOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBGTCgiQWxlcnQgUlNTSSBUaHJlc2hvbGQgKCVkKSIpLAorCQkJcm9hbV9wYXJhbXMuYWxlcnRfcnNzaV90aHJlc2hvbGQpOworCQlzbWVfdXBkYXRlX3JvYW1fcGFyYW1zKHBIZGRDdHgtPmhIYWwsIHNlc3Npb25faWQsCisJCQlyb2FtX3BhcmFtcywKKwkJCVJFQVNPTl9ST0FNX0VYVF9TQ0FOX1BBUkFNU19DSEFOR0VEKTsKKwkJYnJlYWs7CisJY2FzZSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX1NVQkNNRF9TRVRfTEFaWV9ST0FNOgorCQkvKiBQYXJzZSBhbmQgZmV0Y2ggQWN0aXZhdGUgR29vZCBSc3NpIFJvYW0gKi8KKwkJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1NFVF9MQVpZX1JPQU1fRU5BQkxFXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJBY3RpdmF0ZSBHb29kIFJzc2kgUm9hbSBmYWlsZWQiKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcm9hbV9wYXJhbXMuZ29vZF9yc3NpX3JvYW0gPSBubGFfZ2V0X3MzMigKKwkJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fU0VUX0xBWllfUk9BTV9FTkFCTEVdKTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgRkwoIkFjdGl2YXRlIEdvb2QgUnNzaSBSb2FtICglZCkiKSwKKwkJCXJvYW1fcGFyYW1zLmdvb2RfcnNzaV9yb2FtKTsKKwkJc21lX3VwZGF0ZV9yb2FtX3BhcmFtcyhwSGRkQ3R4LT5oSGFsLCBzZXNzaW9uX2lkLAorCQkJcm9hbV9wYXJhbXMsIFJFQVNPTl9ST0FNX0dPT0RfUlNTSV9DSEFOR0VEKTsKKwkJYnJlYWs7CisJY2FzZSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX1NVQkNNRF9TRVRfQlNTSURfUFJFRlM6CisJCS8qIFBhcnNlIGFuZCBmZXRjaCBudW1iZXIgb2YgcHJlZmVycmVkIEJTU0lEICovCisJCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9TRVRfTEFaWV9ST0FNX05VTV9CU1NJRF0pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBudW0gb2YgcHJlZmVycmVkIGJzc2lkIGZhaWxlZCIpKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlyb2FtX3BhcmFtcy5udW1fYnNzaWRfZmF2b3JlZCA9IG5sYV9nZXRfdTMyKAorCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9TRVRfTEFaWV9ST0FNX05VTV9CU1NJRF0pOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBGTCgiTnVtIG9mIFByZWZlcnJlZCBCU1NJRCAoJWQpIiksCisJCQlyb2FtX3BhcmFtcy5udW1fYnNzaWRfZmF2b3JlZCk7CisJCWkgPSAwOworCQlubGFfZm9yX2VhY2hfbmVzdGVkKGN1cnJfYXR0ciwKKwkJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fU0VUX0JTU0lEX1BSRUZTXSwKKwkJCXJlbSkgeworCQkJaWYgKG5sYV9wYXJzZSh0YjIsCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9NQVgsCisJCQkJbmxhX2RhdGEoY3Vycl9hdHRyKSwgbmxhX2xlbihjdXJyX2F0dHIpLAorCQkJCU5VTEwpKSB7CisJCQkJaGRkTG9nKExPR0UsIEZMKCJubGFfcGFyc2UgZmFpbGVkIikpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCS8qIFBhcnNlIGFuZCBmZXRjaCBNQUMgYWRkcmVzcyAqLworCQkJaWYgKCF0YjJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9TRVRfTEFaWV9ST0FNX0JTU0lEXSkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBtYWMgYWRkcmVzcyBmYWlsZWQiKSk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJbmxhX21lbWNweShyb2FtX3BhcmFtcy5ic3NpZF9mYXZvcmVkW2ldLAorCQkJCXRiMltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1NFVF9MQVpZX1JPQU1fQlNTSURdLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgTUFDX0FERFJFU1NfU1RSLAorCQkJCU1BQ19BRERSX0FSUkFZKHJvYW1fcGFyYW1zLmJzc2lkX2Zhdm9yZWRbaV0pKTsKKwkJCS8qIFBhcnNlIGFuZCBmZXRjaCBwcmVmZXJlbmNlIGZhY3RvciovCisJCQlpZiAoIXRiMltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1NFVF9MQVpZX1JPQU1fUlNTSV9NT0RJRklFUl0pIHsKKwkJCQloZGRMb2coTE9HRSwgRkwoIkJTU0lEIFByZWZlcmVuY2Ugc2NvcmUgZmFpbGVkIikpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCXJvYW1fcGFyYW1zLmJzc2lkX2Zhdm9yZWRfZmFjdG9yW2ldID0gbmxhX2dldF91MzIoCisJCQkJdGIyW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fU0VUX0xBWllfUk9BTV9SU1NJX01PRElGSUVSXSk7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBGTCgiQlNTSUQgUHJlZmVyZW5jZSBzY29yZSAoJWQpIiksCisJCQkJcm9hbV9wYXJhbXMuYnNzaWRfZmF2b3JlZF9mYWN0b3JbaV0pOworCQkJaSsrOworCQl9CisJCXNtZV91cGRhdGVfcm9hbV9wYXJhbXMocEhkZEN0eC0+aEhhbCwgc2Vzc2lvbl9pZCwKKwkJCXJvYW1fcGFyYW1zLCBSRUFTT05fUk9BTV9TRVRfRkFWT1JFRF9CU1NJRCk7CisJCWJyZWFrOworCWNhc2UgUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfU0VUX0JMQUNLTElTVF9CU1NJRDoKKwkJLyogUGFyc2UgYW5kIGZldGNoIG51bWJlciBvZiBibGFja2xpc3QgQlNTSUQgKi8KKwkJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1NFVF9CU1NJRF9QQVJBTVNfTlVNX0JTU0lEXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIG51bSBvZiBibGFja2xpc3QgYnNzaWQgZmFpbGVkIikpOworCQkJZ290byBmYWlsOworCQl9CisJCXJvYW1fcGFyYW1zLm51bV9ic3NpZF9hdm9pZF9saXN0ID0gbmxhX2dldF91MzIoCisJCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1NFVF9CU1NJRF9QQVJBTVNfTlVNX0JTU0lEXSk7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfREVCVUcsIEZMKCJOdW0gb2YgYmxhY2tsaXN0IEJTU0lEICglZCkiKSwKKwkJCXJvYW1fcGFyYW1zLm51bV9ic3NpZF9hdm9pZF9saXN0KTsKKwkJaSA9IDA7CisJCW5sYV9mb3JfZWFjaF9uZXN0ZWQoY3Vycl9hdHRyLAorCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9TRVRfQlNTSURfUEFSQU1TXSwKKwkJCXJlbSkgeworCQkJaWYgKG5sYV9wYXJzZSh0YjIsCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9NQVgsCisJCQkJbmxhX2RhdGEoY3Vycl9hdHRyKSwgbmxhX2xlbihjdXJyX2F0dHIpLAorCQkJCU5VTEwpKSB7CisJCQkJaGRkTG9nKExPR0UsIEZMKCJubGFfcGFyc2UgZmFpbGVkIikpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCS8qIFBhcnNlIGFuZCBmZXRjaCBNQUMgYWRkcmVzcyAqLworCQkJaWYgKCF0YjJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9TRVRfQlNTSURfUEFSQU1TX0JTU0lEXSkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBibGFja2xpc3QgYWRkciBmYWlsZWQiKSk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJbmxhX21lbWNweShyb2FtX3BhcmFtcy5ic3NpZF9hdm9pZF9saXN0W2ldLAorCQkJCXRiMltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1NFVF9CU1NJRF9QQVJBTVNfQlNTSURdLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgTUFDX0FERFJFU1NfU1RSLAorCQkJCU1BQ19BRERSX0FSUkFZKAorCQkJCXJvYW1fcGFyYW1zLmJzc2lkX2F2b2lkX2xpc3RbaV0pKTsKKwkJCWkrKzsKKwkJfQorCQlzbWVfdXBkYXRlX3JvYW1fcGFyYW1zKHBIZGRDdHgtPmhIYWwsIHNlc3Npb25faWQsCisJCQlyb2FtX3BhcmFtcywgUkVBU09OX1JPQU1fU0VUX0JMQUNLTElTVF9CU1NJRCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2V4dF9yb2FtX3BhcmFtcygpIC0gc2V0IGV4dCBzY2FuIHJvYW0gcGFyYW1zCisgKiBAd2lwaHk6ICAgcG9pbnRlciB0byB3aXJlbGVzcyB3aXBoeSBzdHJ1Y3R1cmUuCisgKiBAd2RldjogICAgcG9pbnRlciB0byB3aXJlbGVzc19kZXYgc3RydWN0dXJlLgorICogQGRhdGE6ICAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgcGFzc2VkIHZpYSB2ZW5kb3IgaW50ZXJmYWNlCisgKiBAZGF0YV9sZW46TGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHBhc3NlZAorICoKKyAqIFJldHVybjogICBSZXR1cm4gdGhlIFN1Y2Nlc3Mgb3IgRmFpbHVyZSBjb2RlLgorICovCitzdGF0aWMgaW50Cit3bGFuX2hkZF9jZmc4MDIxMV9zZXRfZXh0X3JvYW1fcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQljb25zdCB2b2lkICpkYXRhLAorCQkJCWludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9leHRfcm9hbV9wYXJhbXMod2lwaHksIHdkZXYsCisJCQkJCQkJZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeQord2xhbl9oZGRfc2V0X25vX2Rmc19mbGFnX2NvbmZpZ19wb2xpY3lbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX05PX0RGU19GTEFHX01BWAorCQkJCSAgICAgICArMV0gPSB7CisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1NFVF9OT19ERlNfRkxBR10gPSB7LnR5cGUgPSBOTEFfVTMyIH0sCit9OworCisvKioKKyAqICB3bGFuX2hkZF9jaGVja19kZnNfY2hhbm5lbF9mb3JfYWRhcHRlcigpIC0gY2hlY2sgZGZzIGNoYW5uZWwgaW4gYWRhcHRlcgorICogIEBoZGRfY3R4OiAgICAgIEhERCBjb250ZXh0CisgKiAgQGRldmljZV9tb2RlOiAgICBkZXZpY2UgbW9kZQorICogIFJldHVybjogICAgICAgICBib29sCisgKi8KK3N0YXRpYyBib29sIHdsYW5faGRkX2NoZWNrX2Rmc19jaGFubmVsX2Zvcl9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCQkgICBkZXZpY2VfbW9kZV90IGRldmljZV9tb2RlKQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJfbm9kZSA9IE5VTEwsICpuZXh0ID0gTlVMTDsKKwloZGRfYXBfY3R4X3QgKmFwX2N0eDsKKwloZGRfc3RhdGlvbl9jdHhfdCAqc3RhX2N0eDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisKKwljZGZfc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKGhkZF9jdHgsCisJCQkJCSAgICZhZGFwdGVyX25vZGUpOworCisJd2hpbGUgKChOVUxMICE9IGFkYXB0ZXJfbm9kZSkgJiYKKwkgICAgICAgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfc3RhdHVzKSkgeworCQlhZGFwdGVyID0gYWRhcHRlcl9ub2RlLT5wQWRhcHRlcjsKKworCQlpZiAoKGRldmljZV9tb2RlID09IGFkYXB0ZXItPmRldmljZV9tb2RlKSAmJgorCQkgICAgKGRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCkpIHsKKwkJCWFwX2N0eCA9CisJCQkJV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIoYWRhcHRlcik7CisKKwkJCS8qCisJCQkgKiAgaWYgdGhlcmUgaXMgU0FQIGFscmVhZHkgcnVubmluZyBvbiBERlMgY2hhbm5lbCwKKwkJCSAqICBkbyBub3QgZGlzYWJsZSBzY2FuIG9uIGRmcyBjaGFubmVscy4gTm90ZSB0aGF0CisJCQkgKiAgd2l0aCBTQVAgb24gREZTLCB0aGVyZSBjYW5ub3QgYmUgY29udXJyZW5jeSBvbgorCQkJICogIHNpbmdsZSByYWRpby4gQnV0IHRoZW4gd2UgY2FuIGhhdmUgbXVsdGlwbGUKKwkJCSAqICByYWRpb3MgISEKKwkJCSAqLworCQkJaWYgKENIQU5ORUxfU1RBVEVfREZTID09CisJCQkgICAgY2RzX2dldF9jaGFubmVsX3N0YXRlKAorCQkJCSAgICBhcF9jdHgtPm9wZXJhdGluZ0NoYW5uZWwpKSB7CisJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICAgICAgRkwoIlNBUCBydW5uaW5nIG9uIERGUyBjaGFubmVsIikpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisKKwkJaWYgKChkZXZpY2VfbW9kZSA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkgJiYKKwkJICAgIChkZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKSkgeworCQkJc3RhX2N0eCA9CisJCQkJV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKTsKKworCQkJLyoKKwkJCSAqICBpZiBTVEEgaXMgYWxyZWFkeSBjb25uZWN0ZWQgb24gREZTIGNoYW5uZWwsCisJCQkgKiAgZG8gbm90IGRpc2FibGUgc2NhbiBvbiBkZnMgY2hhbm5lbHMKKwkJCSAqLworCQkJaWYgKGhkZF9jb25uX2lzX2Nvbm5lY3RlZChzdGFfY3R4KSAmJgorCQkJICAgIChDSEFOTkVMX1NUQVRFX0RGUyA9PQorCQkJICAgICBjZHNfZ2V0X2NoYW5uZWxfc3RhdGUoCisJCQkJICAgICBzdGFfY3R4LT5jb25uX2luZm8ub3BlcmF0aW9uQ2hhbm5lbCkpKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKCJjbGllbnQgY29ubmVjdGVkIG9uIERGUyBjaGFubmVsIikpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisKKwkJY2RmX3N0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsCisJCQkJCQkgIGFkYXB0ZXJfbm9kZSwKKwkJCQkJCSAgJm5leHQpOworCQlhZGFwdGVyX25vZGUgPSBuZXh0OworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiAgX193bGFuX2hkZF9jZmc4MDIxMV9kaXNhYmxlX2Rmc19jaGFuX3NjYW4oKSAtIERGUyBjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyAqICBAd2lwaHk6ICAgICAgICAgIGNvcmVzdGFjayBoYW5kbGVyCisgKiAgQHdkZXY6ICAgICAgICAgICB3aXJlbGVzcyBkZXZpY2UKKyAqICBAZGF0YTogICAgICAgICAgIGRhdGEKKyAqICBAZGF0YV9sZW46ICAgICAgIGRhdGEgbGVuZ3RoCisgKiAgUmV0dXJuOiAgICAgICAgIHN1Y2Nlc3MoMCkgb3IgcmVhc29uIGNvZGUgZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2Rpc2FibGVfZGZzX2NoYW5fc2NhbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkJICAgICBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJdEhhbEhhbmRsZSBoX2hhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX05PX0RGU19GTEFHX01BWCArIDFdOworCUNERl9TVEFUVVMgc3RhdHVzOworCWludCByZXRfdmFsID0gLUVQRVJNOworCXVpbnQzMl90IG5vX2Rmc19mbGFnID0gMDsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZF9lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX05PX0RGU19GTEFHX01BWCwKKwkJICAgICAgZGF0YSwgZGF0YV9sZW4sCisJCSAgICAgIHdsYW5faGRkX3NldF9ub19kZnNfZmxhZ19jb25maWdfcG9saWN5KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiaW52YWxpZCBhdHRyIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1NFVF9OT19ERlNfRkxBR10pIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoImF0dHIgZGZzIGZsYWcgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlub19kZnNfZmxhZyA9IG5sYV9nZXRfdTMyKAorCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TRVRfTk9fREZTX0ZMQUddKTsKKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgRkwoIiBERlMgZmxhZyA9ICVkIiksCisJICAgICAgIG5vX2Rmc19mbGFnKTsKKworCWlmIChub19kZnNfZmxhZyA+IDEpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoImludmFsaWQgdmFsdWUgb2YgZGZzIGZsYWciKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChub19kZnNfZmxhZyA9PSBoZGRfY3R4LT5jb25maWctPmVuYWJsZURGU0NobmxTY2FuKSB7CisJCWlmIChub19kZnNfZmxhZykgeworCQkJc3RhdHVzID0gd2xhbl9oZGRfY2hlY2tfZGZzX2NoYW5uZWxfZm9yX2FkYXB0ZXIoCisJCQkJaGRkX2N0eCwgV0xBTl9IRERfSU5GUkFfU1RBVElPTik7CisKKwkJCWlmICh0cnVlID09IHN0YXR1cykKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkJCXN0YXR1cyA9IHdsYW5faGRkX2NoZWNrX2Rmc19jaGFubmVsX2Zvcl9hZGFwdGVyKAorCQkJCWhkZF9jdHgsIFdMQU5fSEREX1NPRlRBUCk7CisKKwkJCWlmICh0cnVlID09IHN0YXR1cykKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKworCQloZGRfY3R4LT5jb25maWctPmVuYWJsZURGU0NobmxTY2FuID0gIW5vX2Rmc19mbGFnOworCisJCWhkZF9hYm9ydF9tYWNfc2Nhbl9hbGxfYWRhcHRlcnMoaGRkX2N0eCk7CisKKwkJLyoKKwkJICogIGNhbGwgdGhlIFNNRSBBUEkgdG8gdHVubmVsIGRvd24gdGhlIG5ldyBjaGFubmVsIGxpc3QKKwkJICogIHRvIHRoZSBmaXJtd2FyZQorCQkgKi8KKwkJc3RhdHVzID0gc21lX2hhbmRsZV9kZnNfY2hhbl9zY2FuKAorCQkJaF9oYWwsIGhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlREZTQ2hubFNjYW4pOworCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCQlyZXRfdmFsID0gMDsKKworCQkJLyoKKwkJCSAqIENsZWFyIHRoZSBTTUUgc2NhbiBjYWNoZSBhbHNvLiBOb3RlIHRoYXQgdGhlCisJCQkgKiBjbGVhcmluZyBvZiBzY2FuIHJlc3VsdHMgaXMgaW5kZXBlbmRlbnQgb2Ygc2Vzc2lvbjsKKwkJCSAqIHNvIG5vIG5lZWQgdG8gaXRlcmF0ZSBvdmVyCisJCQkgKiBhbGwgc2Vzc2lvbnMKKwkJCSAqLworCQkJc3RhdHVzID0gc21lX3NjYW5fZmx1c2hfcmVzdWx0KGhfaGFsKTsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQkJCXJldF92YWwgPSAtRVBFUk07CisJCX0KKworCX0gZWxzZSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAgICAgIEZMKCIgdGhlIERGUyBmbGFnIGhhcyBub3QgY2hhbmdlZCIpKTsKKwkJcmV0X3ZhbCA9IDA7CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZGlzYWJsZV9kZnNfY2hhbl9zY2FuICgpIC0gREZTIHNjYW4gdmVuZG9yIGNvbW1hbmQKKyAqCisgKiBAd2lwaHk6IHdpcGh5IGRldmljZSBwb2ludGVyCisgKiBAd2Rldjogd2lyZWxlc3MgZGV2aWNlIHBvaW50ZXIKKyAqIEBkYXRhOiBWZW5kb2YgY29tbWFuZCBkYXRhIGJ1ZmZlcgorICogQGRhdGFfbGVuOiBCdWZmZXIgbGVuZ3RoCisgKgorICogSGFuZGxlcyBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TRVRfTk9fREZTX0ZMQUdfTUFYLiBWYWxpZGF0ZSBpdCBhbmQKKyAqIGNhbGwgd2xhbl9oZGRfZGlzYWJsZV9kZnNfY2hhbl9zY2FuIHRvIHNlbmQgaXQgdG8gZmlybXdhcmUuCisgKgorICogUmV0dXJuOiBFT0sgb3Igb3RoZXIgZXJyb3IgY29kZXMuCisgKi8KKworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9kaXNhYmxlX2Rmc19jaGFuX3NjYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCSAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCQkgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkJICAgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZGlzYWJsZV9kZnNfY2hhbl9zY2FuKHdpcGh5LCB3ZGV2LAorCQkJCQkJCWRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2tleW1nbXRfc2V0X2tleSgpIC0gU3RvcmUgdGhlIEtleXMgaW4gdGhlIGRyaXZlciBzZXNzaW9uCisgKiBAd2lwaHk6IHBvaW50ZXIgdG8gd2lyZWxlc3Mgd2lwaHkgc3RydWN0dXJlLgorICogQHdkZXY6IHBvaW50ZXIgdG8gd2lyZWxlc3NfZGV2IHN0cnVjdHVyZS4KKyAqIEBkYXRhOiBQb2ludGVyIHRvIHRoZSBLZXkgZGF0YQorICogQGRhdGFfbGVuOkxlbmd0aCBvZiB0aGUgZGF0YSBwYXNzZWQKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdsYW4gZHJpdmVyIG5lZWRzIHRvIHNhdmUgdGhlIGtleXMgcmVjZWl2ZWQgdmlhCisgKiB2ZW5kb3Igc3BlY2lmaWMgY29tbWFuZC4KKyAqCisgKiBSZXR1cm46IFJldHVybiB0aGUgU3VjY2VzcyBvciBGYWlsdXJlIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9rZXltZ210X3NldF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJdWludDhfdCBsb2NhbF9wbWtbU0lSX1JPQU1fU0NBTl9QU0tfU0laRV07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICpoZGRfYWRhcHRlcl9wdHIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4X3B0cjsKKwlpbnQgc3RhdHVzOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmICgoZGF0YSA9PSBOVUxMKSB8fCAoZGF0YV9sZW4gPT0gMCkgfHwKKwkJCShkYXRhX2xlbiA+IFNJUl9ST0FNX1NDQU5fUFNLX1NJWkUpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBkYXRhIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZGRfY3R4X3B0ciA9IFdMQU5fSEREX0dFVF9DVFgoaGRkX2FkYXB0ZXJfcHRyKTsKKwlpZiAoIWhkZF9jdHhfcHRyKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbnVsbCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4X3B0cik7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgaW52YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJc21lX3VwZGF0ZV9yb2FtX2tleV9tZ210X29mZmxvYWRfZW5hYmxlZChoZGRfY3R4X3B0ci0+aEhhbCwKKwkJCWhkZF9hZGFwdGVyX3B0ci0+c2Vzc2lvbklkLAorCQkJdHJ1ZSk7CisJY2RmX21lbV96ZXJvKCZsb2NhbF9wbWssIFNJUl9ST0FNX1NDQU5fUFNLX1NJWkUpOworCWNkZl9tZW1fY29weShsb2NhbF9wbWssIGRhdGEsIGRhdGFfbGVuKTsKKwlzbWVfcm9hbV9zZXRfcHNrX3BtayhXTEFOX0hERF9HRVRfSEFMX0NUWChoZGRfYWRhcHRlcl9wdHIpLAorCQkJaGRkX2FkYXB0ZXJfcHRyLT5zZXNzaW9uSWQsIGxvY2FsX3BtaywgZGF0YV9sZW4pOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2tleW1nbXRfc2V0X2tleSgpIC0gU3RvcmUgdGhlIEtleXMgaW4gdGhlIGRyaXZlciBzZXNzaW9uCisgKiBAd2lwaHk6ICAgcG9pbnRlciB0byB3aXJlbGVzcyB3aXBoeSBzdHJ1Y3R1cmUuCisgKiBAd2RldjogICAgcG9pbnRlciB0byB3aXJlbGVzc19kZXYgc3RydWN0dXJlLgorICogQGRhdGE6ICAgIFBvaW50ZXIgdG8gdGhlIEtleSBkYXRhCisgKiBAZGF0YV9sZW46TGVuZ3RoIG9mIHRoZSBkYXRhIHBhc3NlZAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2xhbiBkcml2ZXIgbmVlZHMgdG8gc2F2ZSB0aGUga2V5cyByZWNlaXZlZCB2aWEKKyAqIHZlbmRvciBzcGVjaWZpYyBjb21tYW5kLgorICoKKyAqIFJldHVybjogICBSZXR1cm4gdGhlIFN1Y2Nlc3Mgb3IgRmFpbHVyZSBjb2RlLgorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2tleW1nbXRfc2V0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfa2V5bWdtdF9zZXRfa2V5KHdpcGh5LCB3ZGV2LCBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHFjYV93bGFuX3ZlbmRvcl9nZXRfd2lmaV9pbmZvX3BvbGljeVsKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfSU5GT19HRVRfTUFYICsgMV0gPSB7CisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfSU5GT19EUklWRVJfVkVSU0lPTl0gPSB7LnR5cGUgPSBOTEFfVTggfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9JTkZPX0ZJUk1XQVJFX1ZFUlNJT05dID0gey50eXBlID0gTkxBX1U4IH0sCit9OworCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3dpZmlfaW5mbygpIC0gR2V0IHRoZSB3aWZpIGRyaXZlciByZWxhdGVkIGluZm8KKyAqIEB3aXBoeTogICBwb2ludGVyIHRvIHdpcmVsZXNzIHdpcGh5IHN0cnVjdHVyZS4KKyAqIEB3ZGV2OiAgICBwb2ludGVyIHRvIHdpcmVsZXNzX2RldiBzdHJ1Y3R1cmUuCisgKiBAZGF0YTogICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBwYXNzZWQgdmlhIHZlbmRvciBpbnRlcmZhY2UKKyAqIEBkYXRhX2xlbjpMZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgcGFzc2VkCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3bGFuIGRyaXZlciBuZWVkcyB0byBzZW5kIHdpZmkgZHJpdmVyIHJlbGF0ZWQgaW5mbworICogKGRyaXZlci9mdyB2ZXJzaW9uKSB0byB0aGUgdXNlciBzcGFjZSBhcHBsaWNhdGlvbiB1cG9uIHJlcXVlc3QuCisgKgorICogUmV0dXJuOiAgIFJldHVybiB0aGUgU3VjY2VzcyBvciBGYWlsdXJlIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQKK19fd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3dpZmlfaW5mbyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqdGJfdmVuZG9yW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfSU5GT19HRVRfTUFYICsgMV07CisJdFNpclZlcnNpb25TdHJpbmcgdmVyc2lvbjsKKwl1aW50MzJfdCB2ZXJzaW9uX2xlbjsKKwl1aW50MzJfdCBtYWpvcl9zcGlkID0gMCwgbWlub3Jfc3BpZCA9IDAsIHNpaWQgPSAwLCBjcm1pZCA9IDA7CisJdWludDhfdCBhdHRyOworCWludCBzdGF0dXM7CisJc3RydWN0IHNrX2J1ZmYgKnJlcGx5X3NrYiA9IE5VTEw7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChubGFfcGFyc2UodGJfdmVuZG9yLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0lORk9fR0VUX01BWCwgZGF0YSwKKwkJICAgICAgZGF0YV9sZW4sIHFjYV93bGFuX3ZlbmRvcl9nZXRfd2lmaV9pbmZvX3BvbGljeSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJXSUZJX0lORk9fR0VUIE5MIENNRCBwYXJzaW5nIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRiX3ZlbmRvcltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0lORk9fRFJJVkVSX1ZFUlNJT05dKSB7CisJCWhkZExvZyhMT0cxLCBGTCgiUmN2ZCByZXEgZm9yIERyaXZlciB2ZXJzaW9uIikpOworCQlzdHJsY3B5KHZlcnNpb24sIFFXTEFOX1ZFUlNJT05TVFIsIHNpemVvZih2ZXJzaW9uKSk7CisJCWF0dHIgPSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0lORk9fRFJJVkVSX1ZFUlNJT047CisJfSBlbHNlIGlmICh0Yl92ZW5kb3JbUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9JTkZPX0ZJUk1XQVJFX1ZFUlNJT05dKSB7CisJCWhkZExvZyhMT0cxLCBGTCgiUmN2ZCByZXEgZm9yIEZXIHZlcnNpb24iKSk7CisJCWhkZF9nZXRfZndfdmVyc2lvbihoZGRfY3R4LCAmbWFqb3Jfc3BpZCwgJm1pbm9yX3NwaWQsICZzaWlkLAorCQkJCSAgICZjcm1pZCk7CisJCXNucHJpbnRmKHZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSwgIiVkOiVkOiVkOiVkIiwKKwkJCSBtYWpvcl9zcGlkLCBtaW5vcl9zcGlkLCBzaWlkLCBjcm1pZCk7CisJCWF0dHIgPSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0lORk9fRklSTVdBUkVfVkVSU0lPTjsKKwl9IGVsc2UgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgYXR0cmlidXRlIGluIGdldCB3aWZpIGluZm8gcmVxdWVzdCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmVyc2lvbl9sZW4gPSBzdHJsZW4odmVyc2lvbik7CisJcmVwbHlfc2tiID0gY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2Iod2lwaHksCisJCQl2ZXJzaW9uX2xlbiArIE5MQV9IRFJMRU4gKyBOTE1TR19IRFJMRU4pOworCWlmICghcmVwbHlfc2tiKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2IgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAobmxhX3B1dChyZXBseV9za2IsIGF0dHIsIHZlcnNpb25fbGVuLCB2ZXJzaW9uKSkgeworCQloZGRMb2coTE9HRSwgRkwoIm5sYSBwdXQgZmFpbCIpKTsKKwkJa2ZyZWVfc2tiKHJlcGx5X3NrYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBjZmc4MDIxMV92ZW5kb3JfY21kX3JlcGx5KHJlcGx5X3NrYik7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3dpZmlfaW5mbygpIC0gR2V0IHRoZSB3aWZpIGRyaXZlciByZWxhdGVkIGluZm8KKyAqIEB3aXBoeTogICBwb2ludGVyIHRvIHdpcmVsZXNzIHdpcGh5IHN0cnVjdHVyZS4KKyAqIEB3ZGV2OiAgICBwb2ludGVyIHRvIHdpcmVsZXNzX2RldiBzdHJ1Y3R1cmUuCisgKiBAZGF0YTogICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBwYXNzZWQgdmlhIHZlbmRvciBpbnRlcmZhY2UKKyAqIEBkYXRhX2xlbjpMZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgcGFzc2VkCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3bGFuIGRyaXZlciBuZWVkcyB0byBzZW5kIHdpZmkgZHJpdmVyIHJlbGF0ZWQgaW5mbworICogKGRyaXZlci9mdyB2ZXJzaW9uKSB0byB0aGUgdXNlciBzcGFjZSBhcHBsaWNhdGlvbiB1cG9uIHJlcXVlc3QuCisgKgorICogUmV0dXJuOiAgIFJldHVybiB0aGUgU3VjY2VzcyBvciBGYWlsdXJlIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQKK3dsYW5faGRkX2NmZzgwMjExX2dldF93aWZpX2luZm8oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3dpZmlfaW5mbyh3aXBoeSwgd2RldiwgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9nZXRfbG9nZ2VyX3N1cHBfZmVhdHVyZSgpIC0gR2V0IHRoZSB3aWZpIGxvZ2dlciBmZWF0dXJlcworICogQHdpcGh5OiAgIHBvaW50ZXIgdG8gd2lyZWxlc3Mgd2lwaHkgc3RydWN0dXJlLgorICogQHdkZXY6ICAgIHBvaW50ZXIgdG8gd2lyZWxlc3NfZGV2IHN0cnVjdHVyZS4KKyAqIEBkYXRhOiAgICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHBhc3NlZCB2aWEgdmVuZG9yIGludGVyZmFjZQorICogQGRhdGFfbGVuOkxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSBwYXNzZWQKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBieSB1c2Vyc3BhY2UgdG8ga25vdyB0aGUgc3VwcG9ydGVkIGxvZ2dlciBmZWF0dXJlcworICoKKyAqIFJldHVybjogICBSZXR1cm4gdGhlIFN1Y2Nlc3Mgb3IgRmFpbHVyZSBjb2RlLgorICovCitzdGF0aWMgaW50CitfX3dsYW5faGRkX2NmZzgwMjExX2dldF9sb2dnZXJfc3VwcF9mZWF0dXJlKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCWNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCBmZWF0dXJlczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHlfc2tiID0gTlVMTDsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZF9lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmVhdHVyZXMgPSAwOworCisJaWYgKGhkZF9pc19tZW1kdW1wX3N1cHBvcnRlZCgpKQorCQlmZWF0dXJlcyB8PSBXSUZJX0xPR0dFUl9NRU1PUllfRFVNUF9TVVBQT1JURUQ7CisJZmVhdHVyZXMgfD0gV0lGSV9MT0dHRVJfUEVSX1BBQ0tFVF9UWF9SWF9TVEFUVVNfU1VQUE9SVEVEOworCWZlYXR1cmVzIHw9IFdJRklfTE9HR0VSX0NPTk5FQ1RfRVZFTlRfU1VQUE9SVEVEOworCWZlYXR1cmVzIHw9IFdJRklfTE9HR0VSX1dBS0VfTE9DS19TVVBQT1JURUQ7CisKKwlyZXBseV9za2IgPSBjZmc4MDIxMV92ZW5kb3JfY21kX2FsbG9jX3JlcGx5X3NrYih3aXBoeSwKKwkJCXNpemVvZih1aW50MzJfdCkgKyBOTEFfSERSTEVOICsgTkxNU0dfSERSTEVOKTsKKwlpZiAoIXJlcGx5X3NrYikgeworCQloZGRMb2coTE9HRSwgRkwoImNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaGRkTG9nKExPRzEsIEZMKCJTdXBwb3J0ZWQgbG9nZ2VyIGZlYXR1cmVzOiAweCUweCIpLCBmZWF0dXJlcyk7CisJaWYgKG5sYV9wdXRfdTMyKHJlcGx5X3NrYiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfTE9HR0VSX1NVUFBPUlRFRCwKKwkJCQkgICBmZWF0dXJlcykpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJubGEgcHV0IGZhaWwiKSk7CisJCWtmcmVlX3NrYihyZXBseV9za2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gY2ZnODAyMTFfdmVuZG9yX2NtZF9yZXBseShyZXBseV9za2IpOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2dldF9sb2dnZXJfc3VwcF9mZWF0dXJlKCkgLSBHZXQgdGhlIHdpZmkgbG9nZ2VyIGZlYXR1cmVzCisgKiBAd2lwaHk6ICAgcG9pbnRlciB0byB3aXJlbGVzcyB3aXBoeSBzdHJ1Y3R1cmUuCisgKiBAd2RldjogICAgcG9pbnRlciB0byB3aXJlbGVzc19kZXYgc3RydWN0dXJlLgorICogQGRhdGE6ICAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgcGFzc2VkIHZpYSB2ZW5kb3IgaW50ZXJmYWNlCisgKiBAZGF0YV9sZW46TGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHBhc3NlZAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHVzZXJzcGFjZSB0byBrbm93IHRoZSBzdXBwb3J0ZWQgbG9nZ2VyIGZlYXR1cmVzCisgKgorICogUmV0dXJuOiAgIFJldHVybiB0aGUgU3VjY2VzcyBvciBGYWlsdXJlIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQKK3dsYW5faGRkX2NmZzgwMjExX2dldF9sb2dnZXJfc3VwcF9mZWF0dXJlKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCWNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2dldF9sb2dnZXJfc3VwcF9mZWF0dXJlKHdpcGh5LCB3ZGV2LAorCQkJCQkJCSAgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfc2VuZF9yb2FtX2F1dGhfZXZlbnQoKSAtIFNlbmQgdGhlIHJvYW1lZCBhbmQgYXV0aG9yaXplZCBldmVudAorICogQGhkZF9jdHhfcHRyOiBwb2ludGVyIHRvIEhERCBDb250ZXh0LgorICogQGJzc2lkOiBwb2ludGVyIHRvIGJzc2lkIG9mIHJvYW1lZCBBUC4KKyAqIEByZXFfcnNuX2llOiBQb2ludGVyIHRvIHJlcXVlc3QgUlNOIElFCisgKiBAcmVxX3Jzbl9sZW46IExlbmd0aCBvZiB0aGUgcmVxdWVzdCBSU04gSUUKKyAqIEByc3BfcnNuX2llOiBQb2ludGVyIHRvIHJlc3BvbnNlIFJTTiBJRQorICogQHJzcF9yc25fbGVuOiBMZW5ndGggb2YgdGhlIHJlc3BvbnNlIFJTTiBJRQorICogQHJvYW1faW5mb19wdHI6IFBvaW50ZXIgdG8gdGhlIHJvYW1pbmcgcmVsYXRlZCBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2xhbiBkcml2ZXIgbmVlZHMgdG8gc2VuZCB0aGUgcm9hbWluZyBhbmQKKyAqIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24gYWZ0ZXIgcm9hbWluZy4KKyAqCisgKiBUaGUgaW5mb3JtYXRpb24gdGhhdCB3b3VsZCBiZSBzZW50IGlzIHRoZSByZXF1ZXN0IFJTTiBJRSwgcmVzcG9uc2UKKyAqIFJTTiBJRSBhbmQgQlNTSUQgb2YgdGhlIG5ld2x5IHJvYW1lZCBBUC4KKyAqCisgKiBJZiB0aGUgQXV0aG9yaXplZCBzdGF0dXMgaXMgYXV0aGVudGljYXRlZCwgdGhlbiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKKyAqIGxpa2UgUFRLJ3MgS0NLIGFuZCBLRUsgYW5kIFJlcGxheSBDb3VudGVyIHdvdWxkIGFsc28gYmUgcGFzc2VkIHRvIHRoZQorICogc3VwcGxpY2FudC4KKyAqCisgKiBUaGUgc3VwcGxpY2FudCB1cG9uIHJlY2VpdmluZyB0aGlzIGV2ZW50IHdvdWxkIGlnbm9yZSB0aGUgbGVnYWN5CisgKiBjZmc4MDIxMV9yb2FtZWQgY2FsbCBhbmQgdXNlIHRoZSBlbnRpcmUgaW5mb3JtYXRpb24gZnJvbSB0aGlzIGV2ZW50LgorICogVGhlIGNmZzgwMjExX3JvYW1lZCBzaG91bGQgc3RpbGwgY28tZXhpc3Qgc2luY2UgdGhlIGtlcm5lbCB3aWxsCisgKiBtYWtlIHVzZSBvZiB0aGUgcGFyYW1ldGVycyBldmVuIGlmIHRoZSBzdXBwbGljYW50IGlnbm9yZXMgaXQuCisgKgorICogUmV0dXJuOiBSZXR1cm4gdGhlIFN1Y2Nlc3Mgb3IgRmFpbHVyZSBjb2RlLgorICovCitpbnQgd2xhbl9oZGRfc2VuZF9yb2FtX2F1dGhfZXZlbnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eF9wdHIsIHVpbnQ4X3QgKmJzc2lkLAorCQl1aW50OF90ICpyZXFfcnNuX2llLCB1aW50MzJfdCByZXFfcnNuX2xlbiwgdWludDhfdCAqcnNwX3Jzbl9pZSwKKwkJdWludDMyX3QgcnNwX3Jzbl9sZW4sIHRDc3JSb2FtSW5mbyAqcm9hbV9pbmZvX3B0cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlFTlRFUigpOworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eF9wdHIpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQgIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlza2IgPSBjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MoaGRkX2N0eF9wdHItPndpcGh5LAorCQkJTlVMTCwKKwkJCUVUSF9BTEVOICsgcmVxX3Jzbl9sZW4gKyByc3BfcnNuX2xlbiArCisJCQlzaXplb2YodWludDhfdCkgKyBTSVJfUkVQTEFZX0NUUl9MRU4gKworCQkJU0lSX0tDS19LRVlfTEVOICsgU0lSX0tDS19LRVlfTEVOICsKKwkJCSg3ICogTkxNU0dfSERSTEVOKSwKKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfS0VZX01HTVRfUk9BTV9BVVRIX0lOREVYLAorCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXNrYikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMKCJjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmxhX3B1dChza2IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fQVVUSF9CU1NJRCwKKwkJCQlFVEhfQUxFTiwgYnNzaWQpIHx8CisJCQlubGFfcHV0KHNrYiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9BVVRIX1JFUV9JRSwKKwkJCQlyZXFfcnNuX2xlbiwgcmVxX3Jzbl9pZSkgfHwKKwkJCW5sYV9wdXQoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX0FVVEhfUkVTUF9JRSwKKwkJCQlyc3BfcnNuX2xlbiwgcnNwX3Jzbl9pZSkpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIm5sYSBwdXQgZmFpbCIpKTsKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQorCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfREVCVUcsIEZMKCJBdXRoIFN0YXR1cyA9ICVkIiksCisJCQlyb2FtX2luZm9fcHRyLT5zeW5jaEF1dGhTdGF0dXMpOworCWlmIChyb2FtX2luZm9fcHRyLT5zeW5jaEF1dGhTdGF0dXMgPT0KKwkJCUNTUl9ST0FNX0FVVEhfU1RBVFVTX0FVVEhFTlRJQ0FURUQpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgRkwoIkluY2x1ZGUgQXV0aCBQYXJhbXMgVExWJ3MiKSk7CisJCWlmIChubGFfcHV0X3U4KHNrYiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9BVVRIX0FVVEhPUklaRUQsCisJCQl0cnVlKSB8fAorCQkJbmxhX3B1dChza2IsCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9BVVRIX0tFWV9SRVBMQVlfQ1RSLAorCQkJCVNJUl9SRVBMQVlfQ1RSX0xFTiwgcm9hbV9pbmZvX3B0ci0+cmVwbGF5X2N0cikKKwkJCXx8IG5sYV9wdXQoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX0FVVEhfUFRLX0tDSywKKwkJCQlTSVJfS0NLX0tFWV9MRU4sIHJvYW1faW5mb19wdHItPmtjaykKKwkJCXx8IG5sYV9wdXQoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX0FVVEhfUFRLX0tFSywKKwkJCQlTSVJfS0VLX0tFWV9MRU4sIHJvYW1faW5mb19wdHItPmtlaykpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJubGEgcHV0IGZhaWwiKSk7CisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJfQorCX0gZWxzZSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfREVCVUcsIEZMKCJObyBBdXRoIFBhcmFtcyBUTFYncyIpKTsKKwkJaWYgKG5sYV9wdXRfdTgoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX0FVVEhfQVVUSE9SSVpFRCwKKwkJCQkJZmFsc2UpKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgibmxhIHB1dCBmYWlsIikpOworCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJCX0KKwl9CisKKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQoc2tiLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeQord2xhbl9oZGRfd2lmaV9jb25maWdfcG9saWN5W1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19NQVggKyAxXSA9IHsKKworCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05GSUdfTU9EVUxBVEVEX0RUSU1dID0gey50eXBlID0gTkxBX1UzMiB9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05GSUdfU1RBVFNfQVZHX0ZBQ1RPUl0gPSB7LnR5cGUgPSBOTEFfVTE2IH0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19HVUFSRF9USU1FXSA9IHsudHlwZSA9IE5MQV9VMzIgfSwKK307CisKKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3dpZmlfY29uZmlndXJhdGlvbl9zZXQoKSAtIFdpZmkgY29uZmlndXJhdGlvbgorICogdmVuZG9yIGNvbW1hbmQKKyAqCisgKiBAd2lwaHk6IHdpcGh5IGRldmljZSBwb2ludGVyCisgKiBAd2Rldjogd2lyZWxlc3MgZGV2aWNlIHBvaW50ZXIKKyAqIEBkYXRhOiBWZW5kb3IgY29tbWFuZCBkYXRhIGJ1ZmZlcgorICogQGRhdGFfbGVuOiBCdWZmZXIgbGVuZ3RoCisgKgorICogSGFuZGxlcyBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05GSUdfTUFYLgorICoKKyAqIFJldHVybjogRXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV93aWZpX2NvbmZpZ3VyYXRpb25fc2V0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ICA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBubGF0dHIgKnRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19NQVggKyAxXTsKKwlpbnQgcmV0X3ZhbCA9IDA7CisJdTMyIG1vZHVsYXRlZF9kdGltOworCXUxNiBzdGF0c19hdmdfZmFjdG9yOworCXUzMiBndWFyZF90aW1lOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldF92YWwgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmIChyZXRfdmFsKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05GSUdfTUFYLAorCQkgICAgICBkYXRhLCBkYXRhX2xlbiwKKwkJICAgICAgd2xhbl9oZGRfd2lmaV9jb25maWdfcG9saWN5KSkgeworCQloZGRMb2coTE9HRSwgRkwoImludmFsaWQgYXR0ciIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19NT0RVTEFURURfRFRJTV0pIHsKKwkJbW9kdWxhdGVkX2R0aW0gPSBubGFfZ2V0X3UzMigKKwkJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19NT0RVTEFURURfRFRJTV0pOworCisJCXN0YXR1cyA9IHNtZV9jb25maWd1cmVfbW9kdWxhdGVkX2R0aW0oaGRkX2N0eC0+aEhhbCwKKwkJCQkJCSAgICAgIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCSAgICAgIG1vZHVsYXRlZF9kdGltKTsKKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKwkJCXJldF92YWwgPSAtRVBFUk07CisJfQorCisJaWYgKHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19TVEFUU19BVkdfRkFDVE9SXSkgeworCQlzdGF0c19hdmdfZmFjdG9yID0gbmxhX2dldF91MTYoCisJCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05GSUdfU1RBVFNfQVZHX0ZBQ1RPUl0pOworCQlzdGF0dXMgPSBzbWVfY29uZmlndXJlX3N0YXRzX2F2Z19mYWN0b3IoaGRkX2N0eC0+aEhhbCwKKwkJCQkJCQlhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkJc3RhdHNfYXZnX2ZhY3Rvcik7CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisJCQlyZXRfdmFsID0gLUVQRVJNOworCX0KKworCisJaWYgKHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19HVUFSRF9USU1FXSkgeworCQlndWFyZF90aW1lID0gbmxhX2dldF91MzIoCisJCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05GSUdfR1VBUkRfVElNRV0pOworCQlzdGF0dXMgPSBzbWVfY29uZmlndXJlX2d1YXJkX3RpbWUoaGRkX2N0eC0+aEhhbCwKKwkJCQkJCSAgYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJICBndWFyZF90aW1lKTsKKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKwkJCXJldF92YWwgPSAtRVBFUk07CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfd2lmaV9jb25maWd1cmF0aW9uX3NldCgpIC0gV2lmaSBjb25maWd1cmF0aW9uCisgKiB2ZW5kb3IgY29tbWFuZAorICoKKyAqIEB3aXBoeTogd2lwaHkgZGV2aWNlIHBvaW50ZXIKKyAqIEB3ZGV2OiB3aXJlbGVzcyBkZXZpY2UgcG9pbnRlcgorICogQGRhdGE6IFZlbmRvciBjb21tYW5kIGRhdGEgYnVmZmVyCisgKiBAZGF0YV9sZW46IEJ1ZmZlciBsZW5ndGgKKyAqCisgKiBIYW5kbGVzIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19NQVguCisgKgorICogUmV0dXJuOiBFT0sgb3Igb3RoZXIgZXJyb3IgY29kZXMuCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfd2lmaV9jb25maWd1cmF0aW9uX3NldChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCSAgICBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV93aWZpX2NvbmZpZ3VyYXRpb25fc2V0KHdpcGh5LCB3ZGV2LAorCQkJCQkJCSBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdAorbmxhX3BvbGljeQorcWNhX3dsYW5fdmVuZG9yX3dpZmlfbG9nZ2VyX3N0YXJ0X3BvbGljeQorW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX1NUQVJUX01BWCArIDFdID0geworCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9SSU5HX0lEXQorCQk9IHsudHlwZSA9IE5MQV9VMzIgfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9MT0dHRVJfVkVSQk9TRV9MRVZFTF0KKwkJPSB7LnR5cGUgPSBOTEFfVTMyIH0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX0ZMQUdTXQorCQk9IHsudHlwZSA9IE5MQV9VMzIgfSwKK307CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV93aWZpX2xvZ2dlcl9zdGFydCgpIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGVuYWJsZQorICogb3IgZGlzYWJsZSB0aGUgY29sbGVjdGlvbiBvZiBwYWNrZXQgc3RhdGlzdGljcyBmcm9tIHRoZSBmaXJtd2FyZQorICogQHdpcGh5OiAgICBXSVBIWSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogQHdkZXY6ICAgICBXaXJlbGVzcyBkZXZpY2Ugc3RydWN0dXJlIHBvaW50ZXIKKyAqIEBkYXRhOiAgICAgUG9pbnRlciB0byB0aGUgZGF0YSByZWNlaXZlZAorICogQGRhdGFfbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEgcmVjZWl2ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGNvbGxlY3Rpb24gb2YgcGFja2V0IHN0YXRpc3RpY3MgZnJvbQorICogdGhlIGZpcm13YXJlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3dpZmlfbG9nZ2VyX3N0YXJ0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCWNvbnN0IHZvaWQgKmRhdGEsCisJCWludCBkYXRhX2xlbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9MT0dHRVJfU1RBUlRfTUFYICsgMV07CisJc3RydWN0IHNpcl93aWZpX3N0YXJ0X2xvZyBzdGFydF9sb2c7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChubGFfcGFyc2UodGIsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX1NUQVJUX01BWCwKKwkJCQlkYXRhLCBkYXRhX2xlbiwKKwkJCQlxY2Ffd2xhbl92ZW5kb3Jfd2lmaV9sb2dnZXJfc3RhcnRfcG9saWN5KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgYXR0cmlidXRlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggcmluZyBpZCAqLworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9MT0dHRVJfUklOR19JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIEFUVFIgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3RhcnRfbG9nLnJpbmdfaWQgPSBubGFfZ2V0X3UzMigKKwkJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX1JJTkdfSURdKTsKKwloZGRMb2coTE9HRSwgRkwoIlJpbmcgSUQ9JWQiKSwgc3RhcnRfbG9nLnJpbmdfaWQpOworCisJLyogUGFyc2UgYW5kIGZldGNoIHZlcmJvc2UgbGV2ZWwgKi8KKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX1ZFUkJPU0VfTEVWRUxdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciB2ZXJib3NlX2xldmVsIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN0YXJ0X2xvZy52ZXJib3NlX2xldmVsID0gbmxhX2dldF91MzIoCisJCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9WRVJCT1NFX0xFVkVMXSk7CisJaGRkTG9nKExPR0UsIEZMKCJ2ZXJib3NlX2xldmVsPSVkIiksIHN0YXJ0X2xvZy52ZXJib3NlX2xldmVsKTsKKworCS8qIFBhcnNlIGFuZCBmZXRjaCBmbGFnICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9GTEFHU10pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIGZsYWcgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3RhcnRfbG9nLmZsYWcgPSBubGFfZ2V0X3UzMigKKwkJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX0ZMQUdTXSk7CisJaGRkTG9nKExPR0UsIEZMKCJmbGFnPSVkIiksIHN0YXJ0X2xvZy5mbGFnKTsKKworCWNkc19zZXRfcmluZ19sb2dfbGV2ZWwoc3RhcnRfbG9nLnJpbmdfaWQsIHN0YXJ0X2xvZy52ZXJib3NlX2xldmVsKTsKKworCWlmIChzdGFydF9sb2cucmluZ19pZCA9PSBSSU5HX0lEX1dBS0VMT0NLKSB7CisJCS8qIFN0YXJ0L3N0b3Agd2FrZWxvY2sgZXZlbnRzICovCisJCWlmIChzdGFydF9sb2cudmVyYm9zZV9sZXZlbCA+IFdMQU5fTE9HX0xFVkVMX09GRikKKwkJCWNkc19zZXRfd2FrZWxvY2tfbG9nZ2luZyh0cnVlKTsKKwkJZWxzZQorCQkJY2RzX3NldF93YWtlbG9ja19sb2dnaW5nKGZhbHNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3RhdHVzID0gc21lX3dpZmlfc3RhcnRfbG9nZ2VyKGhkZF9jdHgtPmhIYWwsIHN0YXJ0X2xvZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwgRkwoInNtZV93aWZpX3N0YXJ0X2xvZ2dlciBmYWlsZWQoZXJyPSVkKSIpLAorCQkJCXN0YXR1cyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV93aWZpX2xvZ2dlcl9zdGFydCgpIC0gV3JhcHBlciBmdW5jdGlvbiB1c2VkIHRvIGVuYWJsZQorICogb3IgZGlzYWJsZSB0aGUgY29sbGVjdGlvbiBvZiBwYWNrZXQgc3RhdGlzdGljcyBmcm9tIHRoZSBmaXJtd2FyZQorICogQHdpcGh5OiAgICBXSVBIWSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogQHdkZXY6ICAgICBXaXJlbGVzcyBkZXZpY2Ugc3RydWN0dXJlIHBvaW50ZXIKKyAqIEBkYXRhOiAgICAgUG9pbnRlciB0byB0aGUgZGF0YSByZWNlaXZlZAorICogQGRhdGFfbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEgcmVjZWl2ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGNvbGxlY3Rpb24gb2YgcGFja2V0CisgKiBzdGF0aXN0aWNzIGZyb20gdGhlIGZpcm13YXJlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV93aWZpX2xvZ2dlcl9zdGFydChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQljb25zdCB2b2lkICpkYXRhLAorCQlpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfd2lmaV9sb2dnZXJfc3RhcnQod2lwaHksCisJCQl3ZGV2LCBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdAorbmxhX3BvbGljeQorcWNhX3dsYW5fdmVuZG9yX3dpZmlfbG9nZ2VyX2dldF9yaW5nX2RhdGFfcG9saWN5CitbUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9MT0dHRVJfR0VUX1JJTkdfREFUQV9NQVggKyAxXSA9IHsKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9MT0dHRVJfR0VUX1JJTkdfREFUQV9JRF0KKwkJPSB7LnR5cGUgPSBOTEFfVTMyIH0sCit9OworCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfd2lmaV9sb2dnZXJfZ2V0X3JpbmdfZGF0YSgpIC0gRmx1c2ggcGVyIHBhY2tldCBzdGF0cworICogQHdpcGh5OiAgICBXSVBIWSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogQHdkZXY6ICAgICBXaXJlbGVzcyBkZXZpY2Ugc3RydWN0dXJlIHBvaW50ZXIKKyAqIEBkYXRhOiAgICAgUG9pbnRlciB0byB0aGUgZGF0YSByZWNlaXZlZAorICogQGRhdGFfbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEgcmVjZWl2ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZmx1c2ggb3IgcmV0cmlldmUgdGhlIHBlciBwYWNrZXQgc3RhdGlzdGljcyBmcm9tCisgKiB0aGUgZHJpdmVyCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3dpZmlfbG9nZ2VyX2dldF9yaW5nX2RhdGEoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJY29uc3Qgdm9pZCAqZGF0YSwKKwkJaW50IGRhdGFfbGVuKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQzMl90IHJpbmdfaWQ7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBubGF0dHIgKnRiCisJCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9HRVRfUklOR19EQVRBX01BWCArIDFdOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9HRVRfUklOR19EQVRBX01BWCwKKwkJCWRhdGEsIGRhdGFfbGVuLAorCQkJcWNhX3dsYW5fdmVuZG9yX3dpZmlfbG9nZ2VyX2dldF9yaW5nX2RhdGFfcG9saWN5KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgYXR0cmlidXRlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggcmluZyBpZCAqLworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9MT0dHRVJfR0VUX1JJTkdfREFUQV9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIEFUVFIgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyaW5nX2lkID0gbmxhX2dldF91MzIoCisJCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9HRVRfUklOR19EQVRBX0lEXSk7CisKKwlpZiAocmluZ19pZCA9PSBSSU5HX0lEX1BFUl9QQUNLRVRfU1RBVFMpIHsKKwkJd2xhbl9sb2dnaW5nX3NldF9wZXJfcGt0X3N0YXRzKCk7CisJCWhkZExvZyhMT0cxLCBGTCgiRmx1c2hpbmcvUmV0cmlldmluZyBwYWNrZXQgc3RhdHMiKSk7CisJfQorCisJaGRkTG9nKExPRzEsIEZMKCJCdWcgcmVwb3J0IHRyaWdnZXJlZCBieSBmcmFtZXdvcmsiKSk7CisKKwlzdGF0dXMgPSBjZHNfZmx1c2hfbG9ncyhXTEFOX0xPR19UWVBFX05PTl9GQVRBTCwKKwkJCVdMQU5fTE9HX0lORElDQVRPUl9GUkFNRVdPUkssCisJCQlXTEFOX0xPR19SRUFTT05fQ09ERV9VTlVTRUQpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkIHRvIHRyaWdnZXIgYnVnIHJlcG9ydCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfd2lmaV9sb2dnZXJfZ2V0X3JpbmdfZGF0YSgpIC0gV3JhcHBlciB0byBmbHVzaCBwYWNrZXQgc3RhdHMKKyAqIEB3aXBoeTogICAgV0lQSFkgc3RydWN0dXJlIHBvaW50ZXIKKyAqIEB3ZGV2OiAgICAgV2lyZWxlc3MgZGV2aWNlIHN0cnVjdHVyZSBwb2ludGVyCisgKiBAZGF0YTogICAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgcmVjZWl2ZWQKKyAqIEBkYXRhX2xlbjogTGVuZ3RoIG9mIHRoZSBkYXRhIHJlY2VpdmVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZsdXNoIG9yIHJldHJpZXZlIHRoZSBwZXIgcGFja2V0IHN0YXRpc3RpY3MgZnJvbQorICogdGhlIGRyaXZlcgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIGFuZCBlcnJubyBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfd2lmaV9sb2dnZXJfZ2V0X3JpbmdfZGF0YShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQljb25zdCB2b2lkICpkYXRhLAorCQlpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfd2lmaV9sb2dnZXJfZ2V0X3JpbmdfZGF0YSh3aXBoeSwKKwkJCXdkZXYsIGRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX09GRkxPQURfUEFDS0VUUworLyoqCisgKiBoZGRfbWFwX3JlcV9pZF90b19wYXR0ZXJuX2lkKCkgLSBtYXAgcmVxdWVzdCBpZCB0byBwYXR0ZXJuIGlkCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqIEByZXF1ZXN0X2lkOiBbaW5wdXRdIHJlcXVlc3QgaWQKKyAqIEBwYXR0ZXJuX2lkOiBbb3V0cHV0XSBwYXR0ZXJuIGlkCisgKgorICogVGhpcyBmdW5jdGlvbiBsb29wcyB0aHJvdWdoIHJlcXVlc3QgaWQgdG8gcGF0dGVybiBpZCBhcnJheQorICogaWYgdGhlIHNsb3QgaXMgYXZhaWxhYmxlLCBzdG9yZSB0aGUgcmVxdWVzdCBpZCBhbmQgcmV0dXJuIHBhdHRlcm4gaWQKKyAqIGlmIGVudHJ5IGV4aXN0cywgcmV0dXJuIHRoZSBwYXR0ZXJuIGlkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoZGRfbWFwX3JlcV9pZF90b19wYXR0ZXJuX2lkKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCSAgdWludDMyX3QgcmVxdWVzdF9pZCwKKwkJCQkJICB1aW50OF90ICpwYXR0ZXJuX2lkKQoreworCXVpbnQzMl90IGk7CisKKwltdXRleF9sb2NrKCZoZGRfY3R4LT5vcF9jdHgub3BfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IE1BWE5VTV9QRVJJT0RJQ19UWF9QVFJOUzsgaSsrKSB7CisJCWlmIChoZGRfY3R4LT5vcF9jdHgub3BfdGFibGVbaV0ucmVxdWVzdF9pZCA9PSBNQVhfUkVRVUVTVF9JRCkgeworCQkJaGRkX2N0eC0+b3BfY3R4Lm9wX3RhYmxlW2ldLnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCQkJKnBhdHRlcm5faWQgPSBoZGRfY3R4LT5vcF9jdHgub3BfdGFibGVbaV0ucGF0dGVybl9pZDsKKwkJCW11dGV4X3VubG9jaygmaGRkX2N0eC0+b3BfY3R4Lm9wX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoaGRkX2N0eC0+b3BfY3R4Lm9wX3RhYmxlW2ldLnJlcXVlc3RfaWQgPT0KKwkJCQkJcmVxdWVzdF9pZCkgeworCQkJKnBhdHRlcm5faWQgPSBoZGRfY3R4LT5vcF9jdHgub3BfdGFibGVbaV0ucGF0dGVybl9pZDsKKwkJCW11dGV4X3VubG9jaygmaGRkX2N0eC0+b3BfY3R4Lm9wX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZoZGRfY3R4LT5vcF9jdHgub3BfbG9jayk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogaGRkX3VubWFwX3JlcV9pZF90b19wYXR0ZXJuX2lkKCkgLSB1bm1hcCByZXF1ZXN0IGlkIHRvIHBhdHRlcm4gaWQKKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQHJlcXVlc3RfaWQ6IFtpbnB1dF0gcmVxdWVzdCBpZAorICogQHBhdHRlcm5faWQ6IFtvdXRwdXRdIHBhdHRlcm4gaWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGxvb3BzIHRocm91Z2ggcmVxdWVzdCBpZCB0byBwYXR0ZXJuIGlkIGFycmF5CisgKiByZXNldCByZXF1ZXN0IGlkIHRvIDAgKHNsb3QgYXZhaWxhYmxlIGFnYWluKSBhbmQKKyAqIHJldHVybiBwYXR0ZXJuIGlkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoZGRfdW5tYXBfcmVxX2lkX3RvX3BhdHRlcm5faWQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJICB1aW50MzJfdCByZXF1ZXN0X2lkLAorCQkJCQkgIHVpbnQ4X3QgKnBhdHRlcm5faWQpCit7CisJdWludDMyX3QgaTsKKworCW11dGV4X2xvY2soJmhkZF9jdHgtPm9wX2N0eC5vcF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYTlVNX1BFUklPRElDX1RYX1BUUk5TOyBpKyspIHsKKwkJaWYgKGhkZF9jdHgtPm9wX2N0eC5vcF90YWJsZVtpXS5yZXF1ZXN0X2lkID09IHJlcXVlc3RfaWQpIHsKKwkJCWhkZF9jdHgtPm9wX2N0eC5vcF90YWJsZVtpXS5yZXF1ZXN0X2lkID0gTUFYX1JFUVVFU1RfSUQ7CisJCQkqcGF0dGVybl9pZCA9IGhkZF9jdHgtPm9wX2N0eC5vcF90YWJsZVtpXS5wYXR0ZXJuX2lkOworCQkJbXV0ZXhfdW5sb2NrKCZoZGRfY3R4LT5vcF9jdHgub3BfbG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmhkZF9jdHgtPm9wX2N0eC5vcF9sb2NrKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCisvKgorICogZGVmaW5lIHNob3J0IG5hbWVzIGZvciB0aGUgZ2xvYmFsIHZlbmRvciBwYXJhbXMKKyAqIHVzZWQgYnkgX193bGFuX2hkZF9jZmc4MDIxMV9vZmZsb2FkZWRfcGFja2V0cygpCisgKi8KKyNkZWZpbmUgUEFSQU1fTUFYIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX09GRkxPQURFRF9QQUNLRVRTX01BWAorI2RlZmluZSBQQVJBTV9SRVFVRVNUX0lEIFwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0ZGTE9BREVEX1BBQ0tFVFNfUkVRVUVTVF9JRAorI2RlZmluZSBQQVJBTV9DT05UUk9MIFwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0ZGTE9BREVEX1BBQ0tFVFNfU0VORElOR19DT05UUk9MCisjZGVmaW5lIFBBUkFNX0lQX1BBQ0tFVCBcCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09GRkxPQURFRF9QQUNLRVRTX0lQX1BBQ0tFVF9EQVRBCisjZGVmaW5lIFBBUkFNX1NSQ19NQUNfQUREUiBcCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09GRkxPQURFRF9QQUNLRVRTX1NSQ19NQUNfQUREUgorI2RlZmluZSBQQVJBTV9EU1RfTUFDX0FERFIgXAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PRkZMT0FERURfUEFDS0VUU19EU1RfTUFDX0FERFIKKyNkZWZpbmUgUEFSQU1fUEVSSU9EIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX09GRkxPQURFRF9QQUNLRVRTX1BFUklPRAorCisvKioKKyAqIHdsYW5faGRkX2FkZF90eF9wdHJuKCkgLSBhZGQgdHggcGF0dGVybgorICogQGFkYXB0ZXI6IGFkYXB0ZXIgcG9pbnRlcgorICogQGhkZF9jdHg6IGhkZCBjb250ZXh0CisgKiBAdGI6IG5sIGF0dHJpYnV0ZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBOTCBhdHRyaWJ1dGVzIGFuZCBmb3JtcyBhIEFkZFR4UHRybiBtZXNzYWdlCisgKiBwb3N0cyBpdCB0byBTTUUuCisgKgorICovCitzdGF0aWMgaW50Cit3bGFuX2hkZF9hZGRfdHhfcHRybihoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXN0cnVjdCBzU2lyQWRkUGVyaW9kaWNUeFB0cm4gKmFkZF9yZXE7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3QgcmVxdWVzdF9pZCwgcmV0LCBsZW47CisJdWludDhfdCBwYXR0ZXJuX2lkID0gMDsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGRzdF9hZGRyOworCXVpbnQxNl90IGV0aF90eXBlID0gaHRvbnMoRVRIX1BfSVApOworCisJaWYgKCFoZGRfY29ubl9pc19jb25uZWN0ZWQoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJOb3QgaW4gQ29ubmVjdGVkIHN0YXRlISIpKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlhZGRfcmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCphZGRfcmVxKSk7CisJaWYgKCFhZGRfcmVxKSB7CisJCWhkZExvZyhMT0dFLCBGTCgibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggcmVxdWVzdCBJZCAqLworCWlmICghdGJbUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmVxdWVzdF9pZCA9IG5sYV9nZXRfdTMyKHRiW1BBUkFNX1JFUVVFU1RfSURdKTsKKwlpZiAocmVxdWVzdF9pZCA9PSBNQVhfUkVRVUVTVF9JRCkgeworCQloZGRMb2coTE9HRSwgRkwoInJlcXVlc3RfaWQgY2Fubm90IGJlIE1BWCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWhkZExvZyhMT0cxLCBGTCgiUmVxdWVzdCBJZDogJXUiKSwgcmVxdWVzdF9pZCk7CisKKwlpZiAoIXRiW1BBUkFNX1BFUklPRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHBlcmlvZCBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJYWRkX3JlcS0+dXNQdHJuSW50ZXJ2YWxNcyA9IG5sYV9nZXRfdTMyKHRiW1BBUkFNX1BFUklPRF0pOworCWhkZExvZyhMT0cxLCBGTCgiUGVyaW9kOiAldSBtcyIpLCBhZGRfcmVxLT51c1B0cm5JbnRlcnZhbE1zKTsKKwlpZiAoYWRkX3JlcS0+dXNQdHJuSW50ZXJ2YWxNcyA9PSAwKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBpbnRlcnZhbCB6ZXJvLCByZXR1cm4gZmFpbHVyZSIpKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICghdGJbUEFSQU1fU1JDX01BQ19BRERSXSkgeworCQloZGRMb2coTE9HRSwgRkwoImF0dHIgc291cmNlIG1hYyBhZGRyZXNzIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKwlubGFfbWVtY3B5KGFkZF9yZXEtPm1hY0FkZHJlc3MsIHRiW1BBUkFNX1NSQ19NQUNfQUREUl0sCisJCQlDREZfTUFDX0FERFJfU0laRSk7CisJaGRkTG9nKExPRzEsICJpbnB1dCBzcmMgbWFjIGFkZHJlc3M6ICJNQUNfQUREUkVTU19TVFIsCisJCQlNQUNfQUREUl9BUlJBWShhZGRfcmVxLT5tYWNBZGRyZXNzKSk7CisKKwlpZiAobWVtY21wKGFkZF9yZXEtPm1hY0FkZHJlc3MsIGFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLAorCQlDREZfTUFDX0FERFJfU0laRSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJpbnB1dCBzcmMgbWFjIGFkZHJlc3MgYW5kIGNvbm5lY3RlZCBhcCBic3NpZCBhcmUgZGlmZmVyZW50IikpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCF0YltQQVJBTV9EU1RfTUFDX0FERFJdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBkc3QgbWFjIGFkZHJlc3MgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCW5sYV9tZW1jcHkoZHN0X2FkZHIuYnl0ZXMsIHRiW1BBUkFNX0RTVF9NQUNfQUREUl0sIENERl9NQUNfQUREUl9TSVpFKTsKKwloZGRMb2coTE9HMSwgImlucHV0IGRzdCBtYWMgYWRkcmVzczogIk1BQ19BRERSRVNTX1NUUiwKKwkJCU1BQ19BRERSX0FSUkFZKGRzdF9hZGRyLmJ5dGVzKSk7CisKKwlpZiAoIXRiW1BBUkFNX0lQX1BBQ0tFVF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIGlwIHBhY2tldCBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJYWRkX3JlcS0+dWNQdHJuU2l6ZSA9IG5sYV9sZW4odGJbUEFSQU1fSVBfUEFDS0VUXSk7CisJaGRkTG9nKExPRzEsIEZMKCJJUCBwYWNrZXQgbGVuOiAldSIpLCBhZGRfcmVxLT51Y1B0cm5TaXplKTsKKworCWlmIChhZGRfcmVxLT51Y1B0cm5TaXplIDwgMCB8fAorCQlhZGRfcmVxLT51Y1B0cm5TaXplID4gKFBFUklPRElDX1RYX1BUUk5fTUFYX1NJWkUgLQorCQkJCQlFVEhfSExFTikpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIElQIHBhY2tldCBsZW46ICVkIiksCisJCQkJYWRkX3JlcS0+dWNQdHJuU2l6ZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlsZW4gPSAwOworCWNkZl9tZW1fY29weSgmYWRkX3JlcS0+dWNQYXR0ZXJuWzBdLCBkc3RfYWRkci5ieXRlcywgQ0RGX01BQ19BRERSX1NJWkUpOworCWxlbiArPSBDREZfTUFDX0FERFJfU0laRTsKKwljZGZfbWVtX2NvcHkoJmFkZF9yZXEtPnVjUGF0dGVybltsZW5dLCBhZGRfcmVxLT5tYWNBZGRyZXNzLAorCQkJQ0RGX01BQ19BRERSX1NJWkUpOworCWxlbiArPSBDREZfTUFDX0FERFJfU0laRTsKKwljZGZfbWVtX2NvcHkoJmFkZF9yZXEtPnVjUGF0dGVybltsZW5dLCAmZXRoX3R5cGUsIDIpOworCWxlbiArPSAyOworCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBJUCBwYWNrZXQsIGFkZCAxNCBieXRlcyBFdGhlcm5ldCAoODAyLjMpIGhlYWRlcgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIHwgMTQgYnl0ZXMgRXRoZXJuZXQgKDgwMi4zKSBoZWFkZXIgfCBJUCBoZWFkZXIgYW5kIHBheWxvYWQgfAorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqLworCWNkZl9tZW1fY29weSgmYWRkX3JlcS0+dWNQYXR0ZXJuW2xlbl0sCisJCQlubGFfZGF0YSh0YltQQVJBTV9JUF9QQUNLRVRdKSwKKwkJCWFkZF9yZXEtPnVjUHRyblNpemUpOworCWFkZF9yZXEtPnVjUHRyblNpemUgKz0gbGVuOworCisJcmV0ID0gaGRkX21hcF9yZXFfaWRfdG9fcGF0dGVybl9pZChoZGRfY3R4LCByZXF1ZXN0X2lkLCAmcGF0dGVybl9pZCk7CisJaWYgKHJldCkgeworCQloZGRMb2coTE9HVywgRkwoInJlcSBpZCB0byBwYXR0ZXJuIGlkIGZhaWxlZCAocmV0PSVkKSIpLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCWFkZF9yZXEtPnVjUHRybklkID0gcGF0dGVybl9pZDsKKwloZGRMb2coTE9HMSwgRkwoInBhdHRlcm4gaWQ6ICVkIiksIGFkZF9yZXEtPnVjUHRybklkKTsKKworCXN0YXR1cyA9IHNtZV9hZGRfcGVyaW9kaWNfdHhfcHRybihoZGRfY3R4LT5oSGFsLCBhZGRfcmVxKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoInNtZV9hZGRfcGVyaW9kaWNfdHhfcHRybiBmYWlsZWQgKGVycj0lZCkiKSwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0KKworCUVYSVQoKTsKKwljZGZfbWVtX2ZyZWUoYWRkX3JlcSk7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJY2RmX21lbV9mcmVlKGFkZF9yZXEpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHdsYW5faGRkX2RlbF90eF9wdHJuKCkgLSBkZWxldGUgdHggcGF0dGVybgorICogQGFkYXB0ZXI6IGFkYXB0ZXIgcG9pbnRlcgorICogQGhkZF9jdHg6IGhkZCBjb250ZXh0CisgKiBAdGI6IG5sIGF0dHJpYnV0ZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBOTCBhdHRyaWJ1dGVzIGFuZCBmb3JtcyBhIERlbFR4UHRybiBtZXNzYWdlCisgKiBwb3N0cyBpdCB0byBTTUUuCisgKgorICovCitzdGF0aWMgaW50Cit3bGFuX2hkZF9kZWxfdHhfcHRybihoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXN0cnVjdCBzU2lyRGVsUGVyaW9kaWNUeFB0cm4gKmRlbF9yZXE7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3QgcmVxdWVzdF9pZCwgcmV0OworCXVpbnQ4X3QgcGF0dGVybl9pZCA9IDA7CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggcmVxdWVzdCBJZCAqLworCWlmICghdGJbUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVxdWVzdF9pZCA9IG5sYV9nZXRfdTMyKHRiW1BBUkFNX1JFUVVFU1RfSURdKTsKKwlpZiAocmVxdWVzdF9pZCA9PSBNQVhfUkVRVUVTVF9JRCkgeworCQloZGRMb2coTE9HRSwgRkwoInJlcXVlc3RfaWQgY2Fubm90IGJlIE1BWCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gaGRkX3VubWFwX3JlcV9pZF90b19wYXR0ZXJuX2lkKGhkZF9jdHgsIHJlcXVlc3RfaWQsICZwYXR0ZXJuX2lkKTsKKwlpZiAocmV0KSB7CisJCWhkZExvZyhMT0dXLCBGTCgicmVxIGlkIHRvIHBhdHRlcm4gaWQgZmFpbGVkIChyZXQ9JWQpIiksIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRlbF9yZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKmRlbF9yZXEpKTsKKwlpZiAoIWRlbF9yZXEpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNkZl9tZW1fY29weShkZWxfcmVxLT5tYWNBZGRyZXNzLCBhZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcywKKwkJCUNERl9NQUNfQUREUl9TSVpFKTsKKwloZGRMb2coTE9HMSwgTUFDX0FERFJFU1NfU1RSLCBNQUNfQUREUl9BUlJBWShkZWxfcmVxLT5tYWNBZGRyZXNzKSk7CisJZGVsX3JlcS0+dWNQdHJuSWQgPSBwYXR0ZXJuX2lkOworCWhkZExvZyhMT0cxLCBGTCgiUmVxdWVzdCBJZDogJXUgUGF0dGVybiBpZDogJWQiKSwKKwkJCSByZXF1ZXN0X2lkLCBkZWxfcmVxLT51Y1B0cm5JZCk7CisKKwlzdGF0dXMgPSBzbWVfZGVsX3BlcmlvZGljX3R4X3B0cm4oaGRkX2N0eC0+aEhhbCwgZGVsX3JlcSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJzbWVfZGVsX3BlcmlvZGljX3R4X3B0cm4gZmFpbGVkIChlcnI9JWQpIiksIHN0YXR1cyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlFWElUKCk7CisJY2RmX21lbV9mcmVlKGRlbF9yZXEpOworCXJldHVybiAwOworCitmYWlsOgorCWNkZl9tZW1fZnJlZShkZWxfcmVxKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfb2ZmbG9hZGVkX3BhY2tldHMoKSAtIHNlbmQgb2ZmbG9hZGVkIHBhY2tldHMKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXJlbGVzcyBwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdpcmVsZXNzIGRldmljZQorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK19fd2xhbl9oZGRfY2ZnODAyMTFfb2ZmbG9hZGVkX3BhY2tldHMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltQQVJBTV9NQVggKyAxXTsKKwl1aW50OF90IGNvbnRyb2w7CisJaW50IHJldDsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgcG9saWN5W1BBUkFNX01BWCArIDFdID0geworCQkJW1BBUkFNX1JFUVVFU1RfSURdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwkJCVtQQVJBTV9DT05UUk9MXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJCQlbUEFSQU1fU1JDX01BQ19BRERSXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAorCQkJCQkJLmxlbiA9IENERl9NQUNfQUREUl9TSVpFIH0sCisJCQlbUEFSQU1fRFNUX01BQ19BRERSXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAorCQkJCQkJLmxlbiA9IENERl9NQUNfQUREUl9TSVpFIH0sCisJCQlbUEFSQU1fUEVSSU9EXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJfTsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFzbWVfaXNfZmVhdHVyZV9zdXBwb3J0ZWRfYnlfZncoV0xBTl9QRVJJT0RJQ19UWF9QVFJOKSkgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJQZXJpb2RpYyBUeCBQYXR0ZXJuIE9mZmxvYWQgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGluIEZXISIpKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiLCBQQVJBTV9NQVgsIGRhdGEsIGRhdGFfbGVuLCBwb2xpY3kpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBBVFRSIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXRiW1BBUkFNX0NPTlRST0xdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBjb250cm9sIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNvbnRyb2wgPSBubGFfZ2V0X3UzMih0YltQQVJBTV9DT05UUk9MXSk7CisJaGRkTG9nKExPRzEsIEZMKCJDb250cm9sOiAlZCIpLCBjb250cm9sKTsKKworCWlmIChjb250cm9sID09IFdMQU5fU1RBUlRfT0ZGTE9BREVEX1BBQ0tFVFMpCisJCXJldHVybiB3bGFuX2hkZF9hZGRfdHhfcHRybihhZGFwdGVyLCBoZGRfY3R4LCB0Yik7CisJZWxzZSBpZiAoY29udHJvbCA9PSBXTEFOX1NUT1BfT0ZGTE9BREVEX1BBQ0tFVFMpCisJCXJldHVybiB3bGFuX2hkZF9kZWxfdHhfcHRybihhZGFwdGVyLCBoZGRfY3R4LCB0Yik7CisJZWxzZSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBjb250cm9sOiAlZCIpLCBjb250cm9sKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKgorICogZG9uZSB3aXRoIHNob3J0IG5hbWVzIGZvciB0aGUgZ2xvYmFsIHZlbmRvciBwYXJhbXMKKyAqIHVzZWQgYnkgX193bGFuX2hkZF9jZmc4MDIxMV9vZmZsb2FkZWRfcGFja2V0cygpCisgKi8KKyN1bmRlZiBQQVJBTV9NQVgKKyN1bmRlZiBQQVJBTV9SRVFVRVNUX0lECisjdW5kZWYgUEFSQU1fQ09OVFJPTAorI3VuZGVmIFBBUkFNX0lQX1BBQ0tFVAorI3VuZGVmIFBBUkFNX1NSQ19NQUNfQUREUgorI3VuZGVmIFBBUkFNX0RTVF9NQUNfQUREUgorI3VuZGVmIFBBUkFNX1BFUklPRAorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX29mZmxvYWRlZF9wYWNrZXRzKCkgLSBXcmFwcGVyIHRvIG9mZmxvYWQgcGFja2V0cworICogQHdpcGh5OiAgICB3aXBoeSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogQHdkZXY6ICAgICBXaXJlbGVzcyBkZXZpY2Ugc3RydWN0dXJlIHBvaW50ZXIKKyAqIEBkYXRhOiAgICAgUG9pbnRlciB0byB0aGUgZGF0YSByZWNlaXZlZAorICogQGRhdGFfbGVuOiBMZW5ndGggb2YgQGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgZXJybm8gb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX29mZmxvYWRlZF9wYWNrZXRzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkJY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCWludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9vZmZsb2FkZWRfcGFja2V0cyh3aXBoeSwKKwkJCQkJd2RldiwgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoKKyAqIGRlZmluZSBzaG9ydCBuYW1lcyBmb3IgdGhlIGdsb2JhbCB2ZW5kb3IgcGFyYW1zCisgKiB1c2VkIGJ5IF9fd2xhbl9oZGRfY2ZnODAyMTFfbW9uaXRvcl9yc3NpKCkKKyAqLworI2RlZmluZSBQQVJBTV9NQVggUUNBX1dMQU5fVkVORE9SX0FUVFJfUlNTSV9NT05JVE9SSU5HX01BWAorI2RlZmluZSBQQVJBTV9SRVFVRVNUX0lEIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JTU0lfTU9OSVRPUklOR19SRVFVRVNUX0lECisjZGVmaW5lIFBBUkFNX0NPTlRST0wgUUNBX1dMQU5fVkVORE9SX0FUVFJfUlNTSV9NT05JVE9SSU5HX0NPTlRST0wKKyNkZWZpbmUgUEFSQU1fTUlOX1JTU0kgUUNBX1dMQU5fVkVORE9SX0FUVFJfUlNTSV9NT05JVE9SSU5HX01JTl9SU1NJCisjZGVmaW5lIFBBUkFNX01BWF9SU1NJIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JTU0lfTU9OSVRPUklOR19NQVhfUlNTSQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfbW9uaXRvcl9yc3NpKCkgLSBtb25pdG9yIHJzc2kKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXJlbGVzcyBwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdpcmVsZXNzIGRldmljZQorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK19fd2xhbl9oZGRfY2ZnODAyMTFfbW9uaXRvcl9yc3NpKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqdGJbUEFSQU1fTUFYICsgMV07CisJc3RydWN0IHJzc2lfbW9uaXRvcl9yZXEgcmVxOworCUNERl9TVEFUVVMgc3RhdHVzOworCWludCByZXQ7CisJdWludDMyX3QgY29udHJvbDsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgcG9saWN5W1BBUkFNX01BWCArIDFdID0geworCQkJW1BBUkFNX1JFUVVFU1RfSURdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwkJCVtQQVJBTV9DT05UUk9MXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJCQlbUEFSQU1fTUlOX1JTU0ldID0geyAudHlwZSA9IE5MQV9TOCB9LAorCQkJW1BBUkFNX01BWF9SU1NJXSA9IHsgLnR5cGUgPSBOTEFfUzggfSwKKwl9OworCisJRU5URVIoKTsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWhkZF9jb25uX2lzX2Nvbm5lY3RlZChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpKSkgeworCQloZGRMb2coTE9HRSwgRkwoIk5vdCBpbiBDb25uZWN0ZWQgc3RhdGUhIikpOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKworCWlmIChubGFfcGFyc2UodGIsIFBBUkFNX01BWCwgZGF0YSwgZGF0YV9sZW4sIHBvbGljeSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIEFUVFIiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghdGJbUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXRiW1BBUkFNX0NPTlRST0xdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBjb250cm9sIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxLnJlcXVlc3RfaWQgPSBubGFfZ2V0X3UzMih0YltQQVJBTV9SRVFVRVNUX0lEXSk7CisJcmVxLnNlc3Npb25faWQgPSBhZGFwdGVyLT5zZXNzaW9uSWQ7CisJY29udHJvbCA9IG5sYV9nZXRfdTMyKHRiW1BBUkFNX0NPTlRST0xdKTsKKworCWlmIChjb250cm9sID09IFFDQV9XTEFOX1JTU0lfTU9OSVRPUklOR19TVEFSVCkgeworCQlyZXEuY29udHJvbCA9IHRydWU7CisJCWlmICghdGJbUEFSQU1fTUlOX1JTU0ldKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgbWluIHJzc2kgZmFpbGVkIikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoIXRiW1BBUkFNX01BWF9SU1NJXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIG1heCByc3NpIGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcmVxLm1pbl9yc3NpID0gbmxhX2dldF9zOCh0YltQQVJBTV9NSU5fUlNTSV0pOworCQlyZXEubWF4X3Jzc2kgPSBubGFfZ2V0X3M4KHRiW1BBUkFNX01BWF9SU1NJXSk7CisKKwkJaWYgKCEocmVxLm1pbl9yc3NpIDwgcmVxLm1heF9yc3NpKSkgeworCQkJaGRkTG9nKExPR1csIEZMKCJtaW5fcnNzaTogJWQgbXVzdCBiZSBsZXNzIHRoYW4gbWF4X3Jzc2k6ICVkIiksCisJCQkJCXJlcS5taW5fcnNzaSwgcmVxLm1heF9yc3NpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWhkZExvZyhMT0cxLCBGTCgiTWluX3Jzc2k6ICVkIE1heF9yc3NpOiAlZCIpLAorCQkJcmVxLm1pbl9yc3NpLCByZXEubWF4X3Jzc2kpOworCisJfSBlbHNlIGlmIChjb250cm9sID09IFFDQV9XTEFOX1JTU0lfTU9OSVRPUklOR19TVE9QKQorCQlyZXEuY29udHJvbCA9IGZhbHNlOworCWVsc2UgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgY29udHJvbCBjbWQ6ICVkIiksIGNvbnRyb2wpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaGRkTG9nKExPRzEsIEZMKCJSZXF1ZXN0IElkOiAldSBTZXNzaW9uX2lkOiAlZCBDb250cm9sOiAlZCIpLAorCQkJcmVxLnJlcXVlc3RfaWQsIHJlcS5zZXNzaW9uX2lkLCByZXEuY29udHJvbCk7CisKKwlzdGF0dXMgPSBzbWVfc2V0X3Jzc2lfbW9uaXRvcmluZyhoZGRfY3R4LT5oSGFsLCAmcmVxKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoInNtZV9zZXRfcnNzaV9tb25pdG9yaW5nIGZhaWxlZChlcnI9JWQpIiksIHN0YXR1cyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZG9uZSB3aXRoIHNob3J0IG5hbWVzIGZvciB0aGUgZ2xvYmFsIHZlbmRvciBwYXJhbXMKKyAqIHVzZWQgYnkgX193bGFuX2hkZF9jZmc4MDIxMV9tb25pdG9yX3Jzc2koKQorICovCisjdW5kZWYgUEFSQU1fTUFYCisjdW5kZWYgUEFSQU1fQ09OVFJPTAorI3VuZGVmIFBBUkFNX1JFUVVFU1RfSUQKKyN1bmRlZiBQQVJBTV9NQVhfUlNTSQorI3VuZGVmIFBBUkFNX01JTl9SU1NJCisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfbW9uaXRvcl9yc3NpKCkgLSBTU1Igd3JhcHBlciB0byByc3NpIG1vbml0b3JpbmcKKyAqIEB3aXBoeTogICAgd2lwaHkgc3RydWN0dXJlIHBvaW50ZXIKKyAqIEB3ZGV2OiAgICAgV2lyZWxlc3MgZGV2aWNlIHN0cnVjdHVyZSBwb2ludGVyCisgKiBAZGF0YTogICAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgcmVjZWl2ZWQKKyAqIEBkYXRhX2xlbjogTGVuZ3RoIG9mIEBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludAord2xhbl9oZGRfY2ZnODAyMTFfbW9uaXRvcl9yc3NpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfbW9uaXRvcl9yc3NpKHdpcGh5LCB3ZGV2LCBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBoZGRfcnNzaV90aHJlc2hvbGRfYnJlYWNoZWQoKSAtIHJzc2kgYnJlYWNoZWQgTkwgZXZlbnQKKyAqIEBoZGRjdHg6IEhERCBjb250ZXh0CisgKiBAZGF0YTogcnNzaSBicmVhY2hlZCBldmVudCBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgcnNzaSBicmVhY2hlZCBldmVudCAlZGF0YSBhbmQgZmlsbCBpbiB0aGUgc2tiIHdpdGgKKyAqIE5MIGF0dHJpYnV0ZXMgYW5kIHNlbmQgdXAgdGhlIE5MIGV2ZW50LgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGhkZF9yc3NpX3RocmVzaG9sZF9icmVhY2hlZCh2b2lkICpoZGRjdHgsCisJCQkJIHN0cnVjdCByc3NpX2JyZWFjaF9ldmVudCAqZGF0YSkKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ICA9IGhkZGN0eDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJRU5URVIoKTsKKworCWlmICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpIHx8ICFkYXRhKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgaW52YWxpZCBvciBkYXRhKCVwKSBpcyBudWxsIiksCisJCQlkYXRhKTsKKwkJcmV0dXJuOworCX0KKworCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyhoZGRfY3R4LT53aXBoeSwKKwkJCQkgIE5VTEwsCisJCQkJICBFWFRTQ0FOX0VWRU5UX0JVRl9TSVpFICsgTkxNU0dfSERSTEVOLAorCQkJCSAgUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9NT05JVE9SX1JTU0lfSU5ERVgsCisJCQkJICBHRlBfS0VSTkVMKTsKKworCWlmICghc2tiKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWhkZExvZyhMT0cxLCAiUmVxIElkOiAldSBDdXJyZW50IHJzc2k6ICVkIiwKKwkJCWRhdGEtPnJlcXVlc3RfaWQsIGRhdGEtPmN1cnJfcnNzaSk7CisJaGRkTG9nKExPRzEsICJDdXJyZW50IEJTU0lEOiAiTUFDX0FERFJFU1NfU1RSLAorCQkJTUFDX0FERFJfQVJSQVkoZGF0YS0+Y3Vycl9ic3NpZC5ieXRlcykpOworCisJaWYgKG5sYV9wdXRfdTMyKHNrYiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfUlNTSV9NT05JVE9SSU5HX1JFUVVFU1RfSUQsCisJCWRhdGEtPnJlcXVlc3RfaWQpIHx8CisJICAgIG5sYV9wdXQoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SU1NJX01PTklUT1JJTkdfQ1VSX0JTU0lELAorCQlzaXplb2YoZGF0YS0+Y3Vycl9ic3NpZCksIGRhdGEtPmN1cnJfYnNzaWQuYnl0ZXMpIHx8CisJICAgIG5sYV9wdXRfczgoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SU1NJX01PTklUT1JJTkdfQ1VSX1JTU0ksCisJCWRhdGEtPmN1cnJfcnNzaSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJubGEgcHV0IGZhaWwiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQoc2tiLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm47CisKK2ZhaWw6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuOworfQorCisvKiogX193bGFuX2hkZF9jZmc4MDIxMV9nZXRfcHJlZmVycmVkX2ZyZXFfbGlzdCgpIC0gZ2V0IHByZWZlcnJlZCBmcmVxdWVuY3kgbGlzdAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcmVsZXNzIHBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gd2lyZWxlc3MgZGV2aWNlCisgKiBAZGF0YTogUG9pbnRlciB0byBkYXRhCisgKiBAZGF0YV9sZW46IERhdGEgbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm4gdGhlIHByZWZlcnJlZCBmcmVxdWVuY3kgbGlzdCBnZW5lcmF0ZWQgYnkgdGhlIHBvbGljeQorICogbWFuYWdlci4KKyAqCisgKiBSZXR1cm46IHN1Y2Nlc3Mgb3IgZmFpbHVyZSBjb2RlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9nZXRfcHJlZmVycmVkX2ZyZXFfbGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYKKwkJCQkJCSAqd2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCSBpbnQgZGF0YV9sZW4pCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCWludCBpLCByZXQgPSAwOworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQ4X3QgcGNsW01BWF9OVU1fQ0hBTl07CisJdWludDMyX3QgcGNsX2xlbiA9IDA7CisJdWludDMyX3QgZnJlcV9saXN0W01BWF9OVU1fQ0hBTl07CisJZW51bSBjZHNfY29uX21vZGUgaW50Zl9tb2RlOworCXN0cnVjdCBubGF0dHIgKnRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0dFVF9QUkVGRVJSRURfRlJFUV9MSVNUX01BWCArIDFdOworCXN0cnVjdCBza19idWZmICpyZXBseV9za2I7CisKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX1BSRUZFUlJFRF9GUkVRX0xJU1RfTUFYLAorCQkgICAgICBkYXRhLCBkYXRhX2xlbiwgTlVMTCkpIHsKKwkJaGRkX2VycigiSW52YWxpZCBBVFRSIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX1BSRUZFUlJFRF9GUkVRX0xJU1RfSUZBQ0VfVFlQRV0pIHsKKwkJaGRkX2VycigiYXR0ciBpbnRlcmZhY2UgdHlwZSBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW50Zl9tb2RlID0gbmxhX2dldF91MzIodGIKKwkJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfUFJFRkVSUkVEX0ZSRVFfTElTVF9JRkFDRV9UWVBFXSk7CisKKwlpZiAoaW50Zl9tb2RlIDwgQ0RTX1NUQV9NT0RFIHx8IGludGZfbW9kZSA+PSBDRFNfTUFYX05VTV9PRl9NT0RFKSB7CisJCWhkZF9lcnIoIkludmFsaWQgaW50ZXJmYWNlIHR5cGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGRkX2RlYnVnKCJVc2Vyc3BhY2UgcmVxdWVzdGVkIHByZWYgZnJlcSBsaXN0Iik7CisKKwlzdGF0dXMgPSBjZHNfZ2V0X3BjbChoZGRfY3R4LCBpbnRmX21vZGUsIHBjbCwgJnBjbF9sZW4pOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZF9lcnIoIkdldCBwY2wgZmFpbGVkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNvbnZlcnQgY2hhbm5lbCBudW1iZXIgdG8gZnJlcXVlbmN5ICovCisJZm9yIChpID0gMDsgaSA8IHBjbF9sZW47IGkrKykgeworCQlpZiAocGNsW2ldIDw9IEFSUkFZX1NJWkUoaGRkX2NoYW5uZWxzXzJfNF9naHopKQorCQkJZnJlcV9saXN0W2ldID0KKwkJCQlpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kocGNsW2ldLAorCQkJCQkJCUlFRUU4MDIxMV9CQU5EXzJHSFopOworCQllbHNlCisJCQlmcmVxX2xpc3RbaV0gPQorCQkJCWllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShwY2xbaV0sCisJCQkJCQkJSUVFRTgwMjExX0JBTkRfNUdIWik7CisJfQorCisJLyogc2VuZCB0aGUgZnJlcV9saXN0IGJhY2sgdG8gc3VwcGxpY2FudCAqLworCXJlcGx5X3NrYiA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiKHdpcGh5LCBzaXplb2YodTMyKSArCisJCQkJCQkJc2l6ZW9mKHUzMikgKgorCQkJCQkJCXBjbF9sZW4gKworCQkJCQkJCU5MTVNHX0hEUkxFTik7CisKKwlpZiAoIXJlcGx5X3NrYikgeworCQloZGRfZXJyKCJBbGxvY2F0ZSByZXBseV9za2IgZmFpbGVkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChubGFfcHV0X3UzMihyZXBseV9za2IsCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0dFVF9QUkVGRVJSRURfRlJFUV9MSVNUX0lGQUNFX1RZUEUsCisJCQlpbnRmX21vZGUpIHx8CisJCW5sYV9wdXQocmVwbHlfc2tiLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX1BSRUZFUlJFRF9GUkVRX0xJU1QsCisJCQlzaXplb2YodWludDMyX3QpICogcGNsX2xlbiwKKwkJCWZyZXFfbGlzdCkpIHsKKwkJaGRkX2VycigibmxhIHB1dCBmYWlsIik7CisJCWtmcmVlX3NrYihyZXBseV9za2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gY2ZnODAyMTFfdmVuZG9yX2NtZF9yZXBseShyZXBseV9za2IpOworfQorCisvKiogd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3ByZWZlcnJlZF9mcmVxX2xpc3QgKCkgLSBnZXQgcHJlZmVycmVkIGZyZXF1ZW5jeSBsaXN0CisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3aXJlbGVzcyBkZXZpY2UKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybiB0aGUgcHJlZmVycmVkIGZyZXF1ZW5jeSBsaXN0IGdlbmVyYXRlZCBieSB0aGUgcG9saWN5CisgKiBtYW5hZ2VyLgorICoKKyAqIFJldHVybjogc3VjY2VzcyBvciBmYWlsdXJlIGNvZGUKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfcHJlZmVycmVkX2ZyZXFfbGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYKKwkJCQkJCSAqd2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCSBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3ByZWZlcnJlZF9mcmVxX2xpc3Qod2lwaHksIHdkZXYsCisJCQkJCQlkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9wcm9iYWJsZV9vcGVyX2NoYW5uZWwgKCkgLSBzZXQgcHJvYmFibGUgY2hhbm5lbAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcmVsZXNzIHBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gd2lyZWxlc3MgZGV2aWNlCisgKiBAZGF0YTogUG9pbnRlciB0byBkYXRhCisgKiBAZGF0YV9sZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9wcm9iYWJsZV9vcGVyX2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCQljb25zdCB2b2lkICpkYXRhLAorCQkJCQkJaW50IGRhdGFfbGVuKQoreworCisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCWludCByZXQgPSAwOworCWVudW0gY2RzX2Nvbl9tb2RlIGludGZfbW9kZTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfUFJFRkVSUkVEX0ZSRVFfTElTVF9NQVggKyAxXTsKKwl1aW50MzJfdCBjaGFubmVsX2hpbnQ7CisJcF9jZHNfY29udGV4dFR5cGUgcF9jZHNfY29udGV4dDsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFwX2Nkc19jb250ZXh0KSB7CisJCWhkZF9lcnIoIkludmFsaWQgQ0RTIGNvbnRleHQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfUFJPQkFCTEVfT1BFUl9DSEFOTkVMX01BWCwKKwkJICAgICAgZGF0YSwgZGF0YV9sZW4sIE5VTEwpKSB7CisJCWhkZF9lcnIoIkludmFsaWQgQVRUUiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1BST0JBQkxFX09QRVJfQ0hBTk5FTF9JRkFDRV9UWVBFXSkgeworCQloZGRfZXJyKCJhdHRyIGludGVyZmFjZSB0eXBlIGZhaWxlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbnRmX21vZGUgPSBubGFfZ2V0X3UzMih0YgorCQkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1BST0JBQkxFX09QRVJfQ0hBTk5FTF9JRkFDRV9UWVBFXSk7CisKKwlpZiAoaW50Zl9tb2RlIDwgQ0RTX1NUQV9NT0RFIHx8IGludGZfbW9kZSA+PSBDRFNfTUFYX05VTV9PRl9NT0RFKSB7CisJCWhkZF9lcnIoIkludmFsaWQgaW50ZXJmYWNlIHR5cGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QUk9CQUJMRV9PUEVSX0NIQU5ORUxfRlJFUV0pIHsKKwkJaGRkX2VycigiYXR0ciBwcm9iYWJsZSBmcmVxIGZhaWxlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljaGFubmVsX2hpbnQgPSBjZHNfZnJlcV90b19jaGFuKG5sYV9nZXRfdTMyKHRiCisJCQlbUUNBX1dMQU5fVkVORE9SX0FUVFJfUFJPQkFCTEVfT1BFUl9DSEFOTkVMX0ZSRVFdKSk7CisKKwkvKiBjaGVjayBwY2wgdGFibGUgKi8KKwlpZiAoIWNkc19hbGxvd19jb25jdXJyZW5jeShoZGRfY3R4LCBpbnRmX21vZGUsCisJCQkJCWNoYW5uZWxfaGludCwgSFdfTU9ERV8yMF9NSFopKSB7CisJCWhkZF9lcnIoIlNldCBjaGFubmVsIGhpbnQgZmFpbGVkIGR1ZSB0byBjb25jdXJyZW5jeSBjaGVjayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaGRkX2N0eC0+Y29uZmlnLT5wb2xpY3lfbWFuYWdlcl9lbmFibGVkKSB7CisJCXJldCA9IGNkZl9ldmVudF9yZXNldCgKKwkJCQkmcF9jZHNfY29udGV4dC0+Y29ubmVjdGlvbl91cGRhdGVfZG9uZV9ldnQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhyZXQpKQorCQkJaGRkX2VycigiY2xlYXJpbmcgZXZlbnQgZmFpbGVkIik7CisKKwkJcmV0ID0gY2RzX2N1cnJlbnRfY29ubmVjdGlvbnNfdXBkYXRlKGhkZF9jdHgsCisJCQkJY2hhbm5lbF9oaW50KTsKKwkJaWYgKENERl9TVEFUVVNfRV9GQUlMVVJFID09IHJldCkgeworCQkJLyogcmV0dXJuIGluIHRoZSBmYWlsdXJlIGNhc2UgKi8KKwkJCWhkZF9lcnIoIkVSUk9SOiBjb25uZWN0aW9ucyB1cGRhdGUgZmFpbGVkISEiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSByZXQpIHsKKwkJCS8qCisJCQkgKiBTdWNjZXNzIGlzIHRoZSBvbmx5IGNhc2UgZm9yIHdoaWNoIHdlIGV4cGVjdCBodyBtb2RlCisJCQkgKiBjaGFuZ2UgdG8gdGFrZSBwbGFjZSwgaGVuY2Ugd2UgbmVlZCB0byB3YWl0LgorCQkJICogRm9yIGFueSBvdGhlciByZXR1cm4gdmFsdWUgaXQgc2hvdWxkIGJlIGEgcGFzcworCQkJICogdGhyb3VnaAorCQkJICovCisJCQlyZXQgPSBjZGZfd2FpdF9zaW5nbGVfZXZlbnQoCisJCQkJJnBfY2RzX2NvbnRleHQtPmNvbm5lY3Rpb25fdXBkYXRlX2RvbmVfZXZ0LAorCQkJCUNPTk5FQ1RJT05fVVBEQVRFX1RJTUVPVVQpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MocmV0KSkgeworCQkJCWhkZF9lcnIoIkVSUk9SOiBjZGYgd2FpdCBmb3IgZXZlbnQgZmFpbGVkISEiKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Byb2JhYmxlX29wZXJfY2hhbm5lbCAoKSAtIHNldCBwcm9iYWJsZSBjaGFubmVsCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3aXJlbGVzcyBkZXZpY2UKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX3NldF9wcm9iYWJsZV9vcGVyX2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCQljb25zdCB2b2lkICpkYXRhLAorCQkJCQkJaW50IGRhdGFfbGVuKQoreworCWludCByZXQgPSAwOworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9wcm9iYWJsZV9vcGVyX2NoYW5uZWwod2lwaHksIHdkZXYsCisJCQkJCQlkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworY29uc3Qgc3RydWN0IHdpcGh5X3ZlbmRvcl9jb21tYW5kIGhkZF93aXBoeV92ZW5kb3JfY29tbWFuZHNbXSA9IHsKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfQ0FQQUJJTElUWSwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfCBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSBpc19kcml2ZXJfZGZzX2NhcGFibGUKKwl9LAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX05BTiwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfCBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9uYW5fcmVxdWVzdAorCX0sCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9TVEFUU19FWFQKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TVEFUU19FWFQsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCSBXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWIHwgV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfc3RhdHNfZXh0X3JlcXVlc3QKKwl9LAorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NUQVJULAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc3RhcnQKKwl9LAorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU1RPUCwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfCBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3N0b3AKKwl9LAorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX1ZBTElEX0NIQU5ORUxTLAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZXRfdmFsaWRfY2hhbm5lbHMKKwl9LAorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX0NBUEFCSUxJVElFUywKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfCBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2dldF9jYXBhYmlsaXRpZXMKKwl9LAorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX0NBQ0hFRF9SRVNVTFRTLAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fZ2V0X2NhY2hlZF9yZXN1bHRzCisJfSwKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NFVF9CU1NJRF9IT1RMSVNULAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc2V0X2Jzc2lkX2hvdGxpc3QKKwl9LAorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUkVTRVRfQlNTSURfSE9UTElTVCwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfCBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3Jlc2V0X2Jzc2lkX2hvdGxpc3QKKwl9LAorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NFVF9TSUdOSUZJQ0FOVF9DSEFOR0UsCisJCS5mbGFncyA9CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zZXRfc2lnbmlmaWNhbnRfY2hhbmdlCisJfSwKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0KKwkJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9SRVNFVF9TSUdOSUZJQ0FOVF9DSEFOR0UsCisJCS5mbGFncyA9CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9zaWduaWZpY2FudF9jaGFuZ2UKKwl9LAorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUE5PX1NFVF9MSVNULAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWIHwKKwkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX3NldF9lcG5vX2xpc3QKKwl9LAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FWFRTQ0FOICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUworCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX1NUQVRTX0NMUiwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfCBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9sbF9zdGF0c19jbGVhcgorCX0sCisKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19TRVQsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCSBXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWIHwgV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfbGxfc3RhdHNfc2V0CisJfSwKKworCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX1NUQVRTX0dFVCwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfCBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9sbF9zdGF0c19nZXQKKwl9LAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9URExTX0VOQUJMRSwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfCBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2VuYWJsZQorCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfVERMU19ESVNBQkxFLAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX2V4dHRkbHNfZGlzYWJsZQorCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfVERMU19HRVRfU1RBVFVTLAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfZXh0dGRsc19nZXRfc3RhdHVzCisJfSwKKyNlbmRpZgorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0dFVF9TVVBQT1JURURfRkVBVFVSRVMsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwgV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViwKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfc3VwcG9ydGVkX2ZlYXR1cmVzCisJfSwKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TQ0FOTklOR19NQUNfT1VJLAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3NjYW5uaW5nX21hY19vdWkKKwl9LAorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0dFVF9DT05DVVJSRU5DWV9NQVRSSVgsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwgV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViwKKwkJLmRvaXQgPSBjZHNfY2ZnODAyMTFfZ2V0X2NvbmN1cnJlbmN5X21hdHJpeAorCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTk9fREZTX0ZMQUcsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfZGlzYWJsZV9kZnNfY2hhbl9zY2FuCisJfSwKKworCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RPX0FDUywKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX2RvX2FjcworCX0sCisKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfRkVBVFVSRVMsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2ZlYXR1cmVzCisJfSwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfS0VZX01HTVRfU0VUX0tFWSwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9rZXltZ210X3NldF9rZXkKKwl9LAorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1BOT19TRVRfUEFTU1BPSU5UX0xJU1QsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Bhc3Nwb2ludF9saXN0CisJfSwKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1BOT19SRVNFVF9QQVNTUE9JTlRfTElTVCwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9yZXNldF9wYXNzcG9pbnRfbGlzdAorCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TRVRfU1NJRF9IT1RMSVNULAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWIHwKKwkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc2V0X3NzaWRfaG90bGlzdAorCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9SRVNFVF9TU0lEX0hPVExJU1QsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9zc2lkX2hvdGxpc3QKKwl9LAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FWFRTQ0FOICovCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfR0VUX1dJRklfSU5GTywKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3dpZmlfaW5mbworCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfU0VUX1dJRklfQ09ORklHVVJBVElPTiwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV93aWZpX2NvbmZpZ3VyYXRpb25fc2V0CisJfSwKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ST0FNLAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX3NldF9leHRfcm9hbV9wYXJhbXMKKwl9LAorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1dJRklfTE9HR0VSX1NUQVJULAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX3dpZmlfbG9nZ2VyX3N0YXJ0CisJfSwKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfUklOR19EQVRBLAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX3dpZmlfbG9nZ2VyX2dldF9yaW5nX2RhdGEKKwl9LAorCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPQorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfUFJFRkVSUkVEX0ZSRVFfTElTVCwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfcHJlZmVycmVkX2ZyZXFfbGlzdAorCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1NFVF9QUk9CQUJMRV9PUEVSX0NIQU5ORUwsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Byb2JhYmxlX29wZXJfY2hhbm5lbAorCX0sCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9URExTX0dFVF9DQVBBQklMSVRJRVMsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3RkbHNfY2FwYWJpbGl0aWVzCisJfSwKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9PRkZMT0FEX1BBQ0tFVFMKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9PRkZMT0FERURfUEFDS0VUUywKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9vZmZsb2FkZWRfcGFja2V0cworCX0sCisjZW5kaWYKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9NT05JVE9SX1JTU0ksCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfbW9uaXRvcl9yc3NpCisJfSwKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfTE9HR0VSX0ZFQVRVUkVfU0VULAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8CisJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2xvZ2dlcl9zdXBwX2ZlYXR1cmUKKwl9LAorI2lmZGVmIFdMQU5fRkVBVFVSRV9NRU1EVU1QCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfV0lGSV9MT0dHRVJfTUVNT1JZX0RVTVAsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCSBXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWIHwKKwkJCSBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfZndfbWVtX2R1bXAKKwl9LAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9NRU1EVU1QICovCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfVFJJR0dFUl9TQ0FOLAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQlXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWIHwKKwkJCVdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX3ZlbmRvcl9zY2FuCisJfSwKKworCS8qIE9DQiBjb21tYW5kcyAqLworCXsKKwkJLmluZm8udmVuZG9yX2lkID0gUUNBX05MODAyMTFfVkVORE9SX0lELAorCQkuaW5mby5zdWJjbWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX09DQl9TRVRfQ09ORklHLAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJCSBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc2V0X2NvbmZpZworCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfT0NCX1NFVF9VVENfVElNRSwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJCSBXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWIHwKKwkJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfb2NiX3NldF91dGNfdGltZQorCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9CisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX09DQl9TVEFSVF9USU1JTkdfQURWRVJULAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJCSBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydAorCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfT0NCX1NUT1BfVElNSU5HX0FEVkVSVCwKKwkJLmZsYWdzID0gV0lQSFlfVkVORE9SX0NNRF9ORUVEX1dERVYgfAorCQkJCSBXSVBIWV9WRU5ET1JfQ01EX05FRURfTkVUREVWIHwKKwkJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX1JVTk5JTkcsCisJCS5kb2l0ID0gd2xhbl9oZGRfY2ZnODAyMTFfb2NiX3N0b3BfdGltaW5nX2FkdmVydAorCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfT0NCX0dFVF9UU0ZfVElNRVIsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8CisJCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX29jYl9nZXRfdHNmX3RpbWVyCisJfSwKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9EQ0NfR0VUX1NUQVRTLAorCQkuZmxhZ3MgPSBXSVBIWV9WRU5ET1JfQ01EX05FRURfV0RFViB8CisJCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYgfAorCQkJCSBXSVBIWV9WRU5ET1JfQ01EX05FRURfUlVOTklORywKKwkJLmRvaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9kY2NfZ2V0X3N0YXRzCisJfSwKKwl7CisJCS5pbmZvLnZlbmRvcl9pZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKwkJLmluZm8uc3ViY21kID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9EQ0NfQ0xFQVJfU1RBVFMsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8CisJCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX2RjY19jbGVhcl9zdGF0cworCX0sCisJeworCQkuaW5mby52ZW5kb3JfaWQgPSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQsCisJCS5pbmZvLnN1YmNtZCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRENDX1VQREFURV9OREwsCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9XREVWIHwKKwkJCQkgV0lQSFlfVkVORE9SX0NNRF9ORUVEX05FVERFViB8CisJCQkJIFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9SVU5OSU5HLAorCQkuZG9pdCA9IHdsYW5faGRkX2NmZzgwMjExX2RjY191cGRhdGVfbmRsCisJfSwKK307CisKKy8qCisgKiBGVU5DVElPTjogd2xhbl9oZGRfY2ZnODAyMTFfd2lwaHlfYWxsb2MKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGhkZF93bGFuX3N0YXJ0dXAoKQorICogZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFsbG9jYXRlIHdpcGh5IHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHdpcGh5ICp3bGFuX2hkZF9jZmc4MDIxMV93aXBoeV9hbGxvYyhpbnQgcHJpdl9zaXplKQoreworCXN0cnVjdCB3aXBoeSAqd2lwaHk7CisJRU5URVIoKTsKKworCS8qCisJICogICBDcmVhdGUgd2lwaHkgZGV2aWNlCisJICovCisJd2lwaHkgPSB3aXBoeV9uZXcoJndsYW5faGRkX2NmZzgwMjExX29wcywgcHJpdl9zaXplKTsKKworCWlmICghd2lwaHkpIHsKKwkJLyogUHJpbnQgZXJyb3IgYW5kIGp1bXAgaW50byBlcnIgbGFiZWwgYW5kIGZyZWUgdGhlIG1lbW9yeSAqLworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHdpcGh5IGluaXQgZmFpbGVkIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHdpcGh5OworfQorCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9iYW5kCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBzdXBwbGljYW50IHRocm91Z2ggYQorICogcHJpdmF0ZSBpb2N0bCB0byBjaGFuZ2UgdGhlIGJhbmQgdmFsdWUKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9iYW5kKHN0cnVjdCB3aXBoeSAqd2lwaHksIGVDc3JCYW5kIGVCYW5kKQoreworCWludCBpLCBqOworCUNIQU5ORUxfU1RBVEUgY2hhbm5lbEVuYWJsZWRTdGF0ZTsKKworCUVOVEVSKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgaSsrKSB7CisKKwkJaWYgKE5VTEwgPT0gd2lwaHktPmJhbmRzW2ldKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgICIlczogd2lwaHktPmJhbmRzW2ldIGlzIE5VTEwsIGkgPSAlZCIsIF9fZnVuY19fLAorCQkJICAgICAgIGkpOworCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgd2lwaHktPmJhbmRzW2ldLT5uX2NoYW5uZWxzOyBqKyspIHsKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmJhbmQgPSB3aXBoeS0+YmFuZHNbaV07CisKKwkJCWNoYW5uZWxFbmFibGVkU3RhdGUgPQorCQkJCWNkc19nZXRfY2hhbm5lbF9zdGF0ZShiYW5kLT5jaGFubmVsc1tqXS4KKwkJCQkJCQkJIGh3X3ZhbHVlKTsKKworCQkJaWYgKElFRUU4MDIxMV9CQU5EXzJHSFogPT0gaSAmJiBlQ1NSX0JBTkRfNUcgPT0gZUJhbmQpIHsKKwkJCQkvKiA1RyBvbmx5ICovCisjaWZkZWYgV0xBTl9FTkFCTEVfU09DSUFMX0NIQU5ORUxTXzVHX09OTFkKKwkJCQkvKiBFbmFibGUgU29jaWFsIGNoYW5uZWxzIGZvciBQMlAgKi8KKwkJCQlpZiAoV0xBTl9IRERfSVNfU09DSUFMX0NIQU5ORUwKKwkJCQkJICAgIChiYW5kLT5jaGFubmVsc1tqXS5jZW50ZXJfZnJlcSkKKwkJCQkgICAgJiYgQ0hBTk5FTF9TVEFURV9FTkFCTEUgPT0KKwkJCQkgICAgY2hhbm5lbEVuYWJsZWRTdGF0ZSkKKwkJCQkJYmFuZC0+Y2hhbm5lbHNbal0uZmxhZ3MgJj0KKwkJCQkJCX5JRUVFODAyMTFfQ0hBTl9ESVNBQkxFRDsKKwkJCQllbHNlCisjZW5kaWYKKwkJCQliYW5kLT5jaGFubmVsc1tqXS5mbGFncyB8PQorCQkJCQlJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoSUVFRTgwMjExX0JBTkRfNUdIWiA9PSBpICYmCisJCQkJCWVDU1JfQkFORF8yNCA9PSBlQmFuZCkgeworCQkJCS8qIDJHIG9ubHkgKi8KKwkJCQliYW5kLT5jaGFubmVsc1tqXS5mbGFncyB8PQorCQkJCQlJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKENIQU5ORUxfU1RBVEVfRElTQUJMRSA9PSBjaGFubmVsRW5hYmxlZFN0YXRlIHx8CisJCQkgICAgQ0hBTk5FTF9TVEFURV9JTlZBTElEID09IGNoYW5uZWxFbmFibGVkU3RhdGUpIHsKKwkJCQliYW5kLT5jaGFubmVsc1tqXS5mbGFncyB8PQorCQkJCQlJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRDsKKwkJCX0gZWxzZSBpZiAoQ0hBTk5FTF9TVEFURV9ERlMgPT0gY2hhbm5lbEVuYWJsZWRTdGF0ZSkgeworCQkJCWJhbmQtPmNoYW5uZWxzW2pdLmZsYWdzICY9CisJCQkJCX5JRUVFODAyMTFfQ0hBTl9ESVNBQkxFRDsKKwkJCQliYW5kLT5jaGFubmVsc1tqXS5mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9SQURBUjsKKwkJCX0gZWxzZSB7CisJCQkJYmFuZC0+Y2hhbm5lbHNbal0uZmxhZ3MgJj0KKwkJCQkJfihJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCB8CisJCQkJCSAgSUVFRTgwMjExX0NIQU5fUkFEQVIpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX2luaXQKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGhkZF93bGFuX3N0YXJ0dXAoKQorICogZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIHdpcGh5IHN0cnVjdHVyZS4KKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IGhkZF9jb25maWcgKnBDZmcpCit7CisJaW50IGksIGo7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCisJRU5URVIoKTsKKworCS8qIE5vdyBiaW5kIHRoZSB1bmRlcmx5aW5nIHdsYW4gZGV2aWNlIHdpdGggd2lwaHkgKi8KKwlzZXRfd2lwaHlfZGV2KHdpcGh5LCBkZXYpOworCisJd2lwaHktPm1nbXRfc3R5cGVzID0gd2xhbl9oZGRfdHhyeF9zdHlwZXM7CisKKwkvKiBUaGlzIHdpbGwgZGlzYWJsZSB1cGRhdGluZyBvZiBOTCBjaGFubmVscyBmcm9tIHBhc3NpdmUgdG8KKwkgKiBhY3RpdmUgaWYgYSBiZWFjb24gaXMgcmVjZWl2ZWQgb24gcGFzc2l2ZSBjaGFubmVsLiAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTQsIDApKQorCXdpcGh5LT5yZWd1bGF0b3J5X2ZsYWdzIHw9IFJFR1VMQVRPUllfRElTQUJMRV9CRUFDT05fSElOVFM7CisjZWxzZQorCXdpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0RJU0FCTEVfQkVBQ09OX0hJTlRTOworI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQorCXdpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0hBVkVfQVBfU01FCisJCQl8IFdJUEhZX0ZMQUdfQVBfUFJPQkVfUkVTUF9PRkZMT0FECisJCQl8IFdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NUQV80QUREUl9TQ0hFTUUKKwkJCXwgV0lQSFlfRkxBR180QUREUl9TVEFUSU9OCisjZW5kaWYKKwkJCXwgV0lQSFlfRkxBR19PRkZDSEFOX1RYOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNCwgMCkpCisJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgPSBSRUdVTEFUT1JZX0NPVU5UUllfSUVfSUdOT1JFOworI2Vsc2UKKwl3aXBoeS0+Y291bnRyeV9pZV9wcmVmID0gTkw4MDIxMV9DT1VOVFJZX0lFX0lHTk9SRV9DT1JFOworI2VuZGlmCisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTEsIDApKQorCXdpcGh5LT53b3dsYW4gPSAmd293bGFuX3N1cHBvcnRfY2ZnODAyMTFfaW5pdDsKKyNlbHNlCisJd2lwaHktPndvd2xhbi5mbGFncyA9IFdJUEhZX1dPV0xBTl9NQUdJQ19QS1Q7CisJd2lwaHktPndvd2xhbi5uX3BhdHRlcm5zID0gV09XTF9NQVhfUFRSTlNfQUxMT1dFRDsKKwl3aXBoeS0+d293bGFuLnBhdHRlcm5fbWluX2xlbiA9IDE7CisJd2lwaHktPndvd2xhbi5wYXR0ZXJuX21heF9sZW4gPSBXT1dMX1BUUk5fTUFYX1NJWkU7CisjZW5kaWYKKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCWlmIChwQ2ZnLT5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZAorI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwkgICAgfHwgcENmZy0+aXNGYXN0Um9hbUluaUZlYXR1cmVFbmFibGVkCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJICAgIHx8IHBDZmctPmlzRXNlSW5pRmVhdHVyZUVuYWJsZWQKKyNlbmRpZgorCSAgICApIHsKKwkJd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfU1VQUE9SVFNfRldfUk9BTTsKKwl9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXdpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMKKwkJCXwgV0lQSFlfRkxBR19URExTX0VYVEVSTkFMX1NFVFVQOworI2VuZGlmCisKKwl3aXBoeS0+ZmVhdHVyZXMgfD0gTkw4MDIxMV9GRUFUVVJFX0hUX0lCU1M7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwlpZiAocENmZy0+Y29uZmlnUE5PU2NhblN1cHBvcnQpIHsKKwkJd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfU1VQUE9SVFNfU0NIRURfU0NBTjsKKwkJd2lwaHktPm1heF9zY2hlZF9zY2FuX3NzaWRzID0gU0lSX1BOT19NQVhfU1VQUF9ORVRXT1JLUzsKKwkJd2lwaHktPm1heF9tYXRjaF9zZXRzID0gU0lSX1BOT19NQVhfU1VQUF9ORVRXT1JLUzsKKwkJd2lwaHktPm1heF9zY2hlZF9zY2FuX2llX2xlbiA9IFNJUl9NQUNfTUFYX0lFX0xFTkdUSDsKKwl9CisjZW5kaWYgLypGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKworI2lmICBkZWZpbmVkIFFDQV9XSUZJX0ZUTQorCWlmIChjZHNfZ2V0X2NvbnBhcmFtKCkgIT0gQ0RGX0ZUTV9NT0RFKSB7CisjZW5kaWYKKworCS8qIGV2ZW4gd2l0aCBXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZLAorCSAgIGRyaXZlciBjYW4gc3RpbGwgcmVnaXN0ZXIgcmVndWxhdG9yeSBjYWxsYmFjayBhbmQKKwkgICBpdCB3aWxsIGdldCByZWd1bGF0b3J5IHNldHRpbmdzIGluIHdpcGh5LT5iYW5kW10sIGJ1dAorCSAgIGRyaXZlciBuZWVkIHRvIGRldGVybWluZSB3aGF0IHRvIGRvIHdpdGggYm90aAorCSAgIHJlZ3VsYXRvcnkgc2V0dGluZ3MgKi8KKworCXdpcGh5LT5yZWdfbm90aWZpZXIgPSBoZGRfcmVnX25vdGlmaWVyOworCisjaWYgIGRlZmluZWQgUUNBX1dJRklfRlRNCit9CisjZW5kaWYKKworCXdpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IE1BWF9TQ0FOX1NTSUQ7CisKKwl3aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gU0lSX01BQ19NQVhfQUREX0lFX0xFTkdUSDsKKworCXdpcGh5LT5tYXhfYWNsX21hY19hZGRycyA9IE1BWF9BQ0xfTUFDX0FERFJFU1M7CisKKwkvKiBTdXBwb3J0cyBTVEFUSU9OICYgQUQtSE9DIG1vZGVzIHJpZ2h0IG5vdyAqLworCXdpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKKwkJCQkgfCBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCQkJIHwgQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpCisJCQkJIHwgQklUKE5MODAyMTFfSUZUWVBFX1AyUF9HTykKKwkJCQkgfCBCSVQoTkw4MDIxMV9JRlRZUEVfQVApOworCisJaWYgKHBDZmctPmFkdmVydGlzZUNvbmN1cnJlbnRPcGVyYXRpb24pIHsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQorCQlpZiAocENmZy0+ZW5hYmxlTUNDKSB7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdsYW5faGRkX2lmYWNlX2NvbWJpbmF0aW9uKTsKKwkJCSAgICAgaSsrKSB7CisJCQkJaWYgKCFwQ2ZnLT5hbGxvd01DQ0dPRGlmZkJJKQorCQkJCQl3bGFuX2hkZF9pZmFjZV9jb21iaW5hdGlvbltpXS4KKwkJCQkJYmVhY29uX2ludF9pbmZyYV9tYXRjaCA9IHRydWU7CisJCQl9CisJCX0KKwkJd2lwaHktPm5faWZhY2VfY29tYmluYXRpb25zID0KKwkJCUFSUkFZX1NJWkUod2xhbl9oZGRfaWZhY2VfY29tYmluYXRpb24pOworCQl3aXBoeS0+aWZhY2VfY29tYmluYXRpb25zID0gd2xhbl9oZGRfaWZhY2VfY29tYmluYXRpb247CisjZW5kaWYKKwl9CisKKwkvKiBCZWZvcmUgcmVnaXN0ZXJpbmcgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGh0IGNhcGFiaWxpdGllZCBiYXNlZAorCSAqIG9uIGluaSB2YWx1ZXMqLworCWlmICghcENmZy0+U2hvcnRHSTIwTWh6RW5hYmxlKSB7CisJCXdsYW5faGRkX2JhbmRfMl80X2doei5odF9jYXAuY2FwICY9IH5JRUVFODAyMTFfSFRfQ0FQX1NHSV8yMDsKKwkJd2xhbl9oZGRfYmFuZF81X2doei5odF9jYXAuY2FwICY9IH5JRUVFODAyMTFfSFRfQ0FQX1NHSV8yMDsKKwkJd2xhbl9oZGRfYmFuZF9wMnBfMl80X2doei5odF9jYXAuY2FwICY9CisJCQl+SUVFRTgwMjExX0hUX0NBUF9TR0lfMjA7CisJfQorCisJaWYgKCFwQ2ZnLT5TaG9ydEdJNDBNaHpFbmFibGUpIHsKKwkJd2xhbl9oZGRfYmFuZF81X2doei5odF9jYXAuY2FwICY9IH5JRUVFODAyMTFfSFRfQ0FQX1NHSV80MDsKKwl9CisKKwlpZiAoIXBDZmctPm5DaGFubmVsQm9uZGluZ01vZGU1R0h6KSB7CisJCXdsYW5faGRkX2JhbmRfNV9naHouaHRfY2FwLmNhcCAmPQorCQkJfklFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOworCX0KKworCXdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZ3bGFuX2hkZF9iYW5kXzJfNF9naHo7CisJaWYgKHRydWUgPT0gaGRkX2lzXzVnX3N1cHBvcnRlZChwSGRkQ3R4KSkgeworCQl3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSAmd2xhbl9oZGRfYmFuZF81X2doejsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgaSsrKSB7CisKKwkJaWYgKE5VTEwgPT0gd2lwaHktPmJhbmRzW2ldKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgICIlczogd2lwaHktPmJhbmRzW2ldIGlzIE5VTEwsIGkgPSAlZCIsIF9fZnVuY19fLAorCQkJICAgICAgIGkpOworCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgd2lwaHktPmJhbmRzW2ldLT5uX2NoYW5uZWxzOyBqKyspIHsKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmJhbmQgPSB3aXBoeS0+YmFuZHNbaV07CisKKwkJCWlmIChJRUVFODAyMTFfQkFORF8yR0haID09IGkgJiYKKwkJCQllQ1NSX0JBTkRfNUcgPT0gcENmZy0+bkJhbmRDYXBhYmlsaXR5KSB7CisJCQkJLyogNUcgb25seSAqLworI2lmZGVmIFdMQU5fRU5BQkxFX1NPQ0lBTF9DSEFOTkVMU181R19PTkxZCisJCQkJLyogRW5hYmxlIHNvY2lhbCBjaGFubmVscyBmb3IgUDJQICovCisJCQkJaWYgKFdMQU5fSEREX0lTX1NPQ0lBTF9DSEFOTkVMCisJCQkJCSAgICAoYmFuZC0+Y2hhbm5lbHNbal0uY2VudGVyX2ZyZXEpKQorCQkJCQliYW5kLT5jaGFubmVsc1tqXS5mbGFncyAmPQorCQkJCQkJfklFRUU4MDIxMV9DSEFOX0RJU0FCTEVEOworCQkJCWVsc2UKKyNlbmRpZgorCQkJCWJhbmQtPmNoYW5uZWxzW2pdLmZsYWdzIHw9CisJCQkJCUlFRUU4MDIxMV9DSEFOX0RJU0FCTEVEOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChJRUVFODAyMTFfQkFORF81R0haID09IGkgJiYKKwkJCQkJZUNTUl9CQU5EXzI0ID09IHBDZmctPm5CYW5kQ2FwYWJpbGl0eSkgeworCQkJCS8qIDJHIG9ubHkgKi8KKwkJCQliYW5kLT5jaGFubmVsc1tqXS5mbGFncyB8PQorCQkJCQlJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCX0KKwkvKkluaXRpYWxpc2UgdGhlIHN1cHBvcnRlZCBjaXBoZXIgc3VpdGUgZGV0YWlscyAqLworCXdpcGh5LT5jaXBoZXJfc3VpdGVzID0gaGRkX2NpcGhlcl9zdWl0ZXM7CisJd2lwaHktPm5fY2lwaGVyX3N1aXRlcyA9IEFSUkFZX1NJWkUoaGRkX2NpcGhlcl9zdWl0ZXMpOworCisJLypzaWduYWwgc3RyZW5ndGggaW4gbUJtICgxMDAqZEJtKSAqLworCXdpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX01CTTsKKwl3aXBoeS0+bWF4X3JlbWFpbl9vbl9jaGFubmVsX2R1cmF0aW9uID0gTUFYX1JFTUFJTl9PTl9DSEFOTkVMX0RVUkFUSU9OOworCisJaWYgKGNkc19nZXRfY29ucGFyYW0oKSAhPSBDREZfRlRNX01PREUpIHsKKwkJd2lwaHktPm5fdmVuZG9yX2NvbW1hbmRzID0KKwkJCQlBUlJBWV9TSVpFKGhkZF93aXBoeV92ZW5kb3JfY29tbWFuZHMpOworCQl3aXBoeS0+dmVuZG9yX2NvbW1hbmRzID0gaGRkX3dpcGh5X3ZlbmRvcl9jb21tYW5kczsKKworCQl3aXBoeS0+dmVuZG9yX2V2ZW50cyA9IHdsYW5faGRkX2NmZzgwMjExX3ZlbmRvcl9ldmVudHM7CisJCXdpcGh5LT5uX3ZlbmRvcl9ldmVudHMgPQorCQkJCUFSUkFZX1NJWkUod2xhbl9oZGRfY2ZnODAyMTFfdmVuZG9yX2V2ZW50cyk7CisJfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQorCWlmIChwQ2ZnLT5lbmFibGVERlNNYXN0ZXJDYXApIHsKKwkJd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfREZTX09GRkxPQUQ7CisJfQorI2VuZGlmCisKKwl3aXBoeS0+bWF4X2FwX2Fzc29jX3N0YSA9IHBDZmctPm1heE51bWJlck9mUGVlcnM7CisKKyNpZmRlZiBRQ0FfSFRfMjA0MF9DT0VYCisJd2lwaHktPmZlYXR1cmVzIHw9IE5MODAyMTFfRkVBVFVSRV9BUF9NT0RFX0NIQU5fV0lEVEhfQ0hBTkdFOworI2VuZGlmCisKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbiB0aGlzIGZ1bmN0aW9uLCB3aXBoeSBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCBhZnRlciBDREYKKyAqIGluaXRpYWxpemF0aW9uLiBJbiB3bGFuX2hkZF9jZmc4MDIxMV9pbml0LCBvbmx5IHRoZQorICogZGVmYXVsdCB2YWx1ZXMgd2lsbCBiZSBpbml0aWFsaXplZC4gVGhlIGZpbmFsIGluaXRpYWxpemF0aW9uCisgKiBvZiBhbGwgcmVxdWlyZWQgbWVtYmVycyBjYW4gYmUgZG9uZSBoZXJlLgorICovCit2b2lkIHdsYW5faGRkX3VwZGF0ZV93aXBoeShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgaGRkX2NvbmZpZyAqcENmZykKK3sKKwl3aXBoeS0+bWF4X2FwX2Fzc29jX3N0YSA9IHBDZmctPm1heE51bWJlck9mUGVlcnM7Cit9CisKKy8qIEluIHRoaXMgZnVuY3Rpb24gd2UgYXJlIHJlZ2lzdGVyaW5nIHdpcGh5LiAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3JlZ2lzdGVyKHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJRU5URVIoKTsKKwkvKiBSZWdpc3RlciBvdXIgd2lwaHkgZGV2IHdpdGggY2ZnODAyMTEgKi8KKwlpZiAoMCA+IHdpcGh5X3JlZ2lzdGVyKHdpcGh5KSkgeworCQkvKiBwcmludCBlcnJvciAqLworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHdpcGh5IHJlZ2lzdGVyIGZhaWxlZCIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgIEhERCBmdW5jdGlvbiB0byB1cGRhdGUgd2lwaHkgY2FwYWJpbGl0eSBiYXNlZCBvbiB0YXJnZXQgb2ZmbG9hZCBzdGF0dXMuCisKKyAgIHdsYW5faGRkX2NmZzgwMjExX2luaXQoKSBkb2VzIGluaXRpYWxpemF0aW9uIG9mIGFsbCB3aXBoeSByZWxhdGVkCisgICBjYXBhYmlsaXR5IGV2ZW4gYmVmb3JlIGRvd25sb2FkaW5nIGZpcm13YXJlIHRvIHRoZSB0YXJnZXQuIEluIGRpc2NyZXRlCisgICBjYXNlLCBob3N0IHdpbGwgZ2V0IGtub3cgY2VydGFpbiBvZmZsb2FkIGNhcGFiaWxpdHkgKHNheSBzY2hlZF9zY2FuCisgICBjYXBzKSBvbmx5IGFmdGVyIGRvd25sb2FkaW5nIGZpcm13YXJlIHRvIHRoZSB0YXJnZXQgYW5kIHRhcmdldCBib290cyB1cC4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBvdmVycmlkZSBzZXR0aW5nIGRvbmUgaW4gd2xhbl9oZGRfY2ZnODAyMTFfaW5pdCgpCisgICBiYXNlZCBvbiB0YXJnZXQgY2FwYWJpbGl0eS4KKyAqLwordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfd2lwaHlfY2FwcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgaGRkX2NvbmZpZyAqcENmZyA9IHBIZGRDdHgtPmNvbmZpZzsKKworCS8qIHdsYW5faGRkX2NmZzgwMjExX2luaXQoKSBzZXRzIHNjaGVkX3NjYW4gY2FwcyBhbHJlYWR5IGluIHdpcGh5IGJlZm9yZQorCSAqIGNvbnRyb2wgY29tZXMgaGVyZS4gSGVyZSBqdXN0IHdlIG5lZWQgdG8gY2xlYXIgaXQgaWYgZmlybXdhcmUgZG9lc24ndAorCSAqIGhhdmUgUE5PIHN1cHBvcnQuICovCisJaWYgKCFwQ2ZnLT5Qbm9PZmZsb2FkKSB7CisJCXdpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19TVVBQT1JUU19TQ0hFRF9TQ0FOOworCQl3aXBoeS0+bWF4X3NjaGVkX3NjYW5fc3NpZHMgPSAwOworCQl3aXBoeS0+bWF4X21hdGNoX3NldHMgPSAwOworCQl3aXBoeS0+bWF4X3NjaGVkX3NjYW5faWVfbGVuID0gMDsKKwl9CisjZW5kaWYKK30KKworLyogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgZm9yIGFsbCBmcmFtZSB3aGljaCBzdXBwbGljYW50IGlzIGludGVyZXN0ZWQgaW4gKi8KK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfcmVnaXN0ZXJfZnJhbWVzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwkvKiBSZWdpc3RlciBmb3IgYWxsIFAyUCBhY3Rpb24sIHB1YmxpYyBhY3Rpb24gZXRjIGZyYW1lcyAqLworCXVpbnQxNl90IHR5cGUgPSAoU0lSX01BQ19NR01UX0ZSQU1FIDw8IDIpIHwgKFNJUl9NQUNfTUdNVF9BQ1RJT04gPDwgNCk7CisKKwlFTlRFUigpOworCisJLyogUmlnaHQgbm93IHdlIGFyZSByZWdpc3RlcmluZyB0aGVzZSBmcmFtZSB3aGVuIGRyaXZlciBpcyBnZXR0aW5nCisJICAgaW5pdGlhbGl6ZWQuIE9uY2Ugd2Ugd2lsbCBtb3ZlIHRvIDIuNi4zNyBrZXJuZWwsIGluIHdoaWNoIHdlIGhhdmUKKwkgICBmcmFtZSByZWdpc3RlciBvcHMsIHdlIHdpbGwgbW92ZSB0aGlzIGNvZGUgYXMgYSBwYXJ0IG9mIHRoYXQgKi8KKwkvKiBHQVMgSW5pdGlhbCBSZXF1ZXN0ICovCisJc21lX3JlZ2lzdGVyX21nbXRfZnJhbWUoaEhhbCwgU01FX1NFU1NJT05fSURfQU5ZLCB0eXBlLAorCQkJCSh1aW50OF90ICopIEdBU19JTklUSUFMX1JFUSwKKwkJCQlHQVNfSU5JVElBTF9SRVFfU0laRSk7CisKKwkvKiBHQVMgSW5pdGlhbCBSZXNwb25zZSAqLworCXNtZV9yZWdpc3Rlcl9tZ210X2ZyYW1lKGhIYWwsIFNNRV9TRVNTSU9OX0lEX0FOWSwgdHlwZSwKKwkJCQkodWludDhfdCAqKSBHQVNfSU5JVElBTF9SU1AsCisJCQkJR0FTX0lOSVRJQUxfUlNQX1NJWkUpOworCisJLyogR0FTIENvbWViYWNrIFJlcXVlc3QgKi8KKwlzbWVfcmVnaXN0ZXJfbWdtdF9mcmFtZShoSGFsLCBTTUVfU0VTU0lPTl9JRF9BTlksIHR5cGUsCisJCQkJKHVpbnQ4X3QgKikgR0FTX0NPTUVCQUNLX1JFUSwKKwkJCQlHQVNfQ09NRUJBQ0tfUkVRX1NJWkUpOworCisJLyogR0FTIENvbWViYWNrIFJlc3BvbnNlICovCisJc21lX3JlZ2lzdGVyX21nbXRfZnJhbWUoaEhhbCwgU01FX1NFU1NJT05fSURfQU5ZLCB0eXBlLAorCQkJCSh1aW50OF90ICopIEdBU19DT01FQkFDS19SU1AsCisJCQkJR0FTX0NPTUVCQUNLX1JTUF9TSVpFKTsKKworCS8qIFAyUCBQdWJsaWMgQWN0aW9uICovCisJc21lX3JlZ2lzdGVyX21nbXRfZnJhbWUoaEhhbCwgU01FX1NFU1NJT05fSURfQU5ZLCB0eXBlLAorCQkJCSh1aW50OF90ICopIFAyUF9QVUJMSUNfQUNUSU9OX0ZSQU1FLAorCQkJCVAyUF9QVUJMSUNfQUNUSU9OX0ZSQU1FX1NJWkUpOworCisJLyogUDJQIEFjdGlvbiAqLworCXNtZV9yZWdpc3Rlcl9tZ210X2ZyYW1lKGhIYWwsIFNNRV9TRVNTSU9OX0lEX0FOWSwgdHlwZSwKKwkJCQkodWludDhfdCAqKSBQMlBfQUNUSU9OX0ZSQU1FLAorCQkJCVAyUF9BQ1RJT05fRlJBTUVfU0laRSk7CisKKwkvKiBXTk0gQlNTIFRyYW5zaXRpb24gUmVxdWVzdCBmcmFtZSAqLworCXNtZV9yZWdpc3Rlcl9tZ210X2ZyYW1lKGhIYWwsIFNNRV9TRVNTSU9OX0lEX0FOWSwgdHlwZSwKKwkJCQkodWludDhfdCAqKSBXTk1fQlNTX0FDVElPTl9GUkFNRSwKKwkJCQlXTk1fQlNTX0FDVElPTl9GUkFNRV9TSVpFKTsKKworCS8qIFdOTS1Ob3RpZmljYXRpb24gKi8KKwlzbWVfcmVnaXN0ZXJfbWdtdF9mcmFtZShoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLCB0eXBlLAorCQkJCSh1aW50OF90ICopIFdOTV9OT1RJRklDQVRJT05fRlJBTUUsCisJCQkJV05NX05PVElGSUNBVElPTl9GUkFNRV9TSVpFKTsKK30KKwordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9kZXJlZ2lzdGVyX2ZyYW1lcyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJLyogUmVnaXN0ZXIgZm9yIGFsbCBQMlAgYWN0aW9uLCBwdWJsaWMgYWN0aW9uIGV0YyBmcmFtZXMgKi8KKwl1aW50MTZfdCB0eXBlID0gKFNJUl9NQUNfTUdNVF9GUkFNRSA8PCAyKSB8IChTSVJfTUFDX01HTVRfQUNUSU9OIDw8IDQpOworCisJRU5URVIoKTsKKworCS8qIFJpZ2h0IG5vdyB3ZSBhcmUgcmVnaXN0ZXJpbmcgdGhlc2UgZnJhbWUgd2hlbiBkcml2ZXIgaXMgZ2V0dGluZworCSAgIGluaXRpYWxpemVkLiBPbmNlIHdlIHdpbGwgbW92ZSB0byAyLjYuMzcga2VybmVsLCBpbiB3aGljaCB3ZSBoYXZlCisJICAgZnJhbWUgcmVnaXN0ZXIgb3BzLCB3ZSB3aWxsIG1vdmUgdGhpcyBjb2RlIGFzIGEgcGFydCBvZiB0aGF0ICovCisJLyogR0FTIEluaXRpYWwgUmVxdWVzdCAqLworCisJc21lX2RlcmVnaXN0ZXJfbWdtdF9mcmFtZShoSGFsLCBTTUVfU0VTU0lPTl9JRF9BTlksIHR5cGUsCisJCQkJICAodWludDhfdCAqKSBHQVNfSU5JVElBTF9SRVEsCisJCQkJICBHQVNfSU5JVElBTF9SRVFfU0laRSk7CisKKwkvKiBHQVMgSW5pdGlhbCBSZXNwb25zZSAqLworCXNtZV9kZXJlZ2lzdGVyX21nbXRfZnJhbWUoaEhhbCwgU01FX1NFU1NJT05fSURfQU5ZLCB0eXBlLAorCQkJCSAgKHVpbnQ4X3QgKikgR0FTX0lOSVRJQUxfUlNQLAorCQkJCSAgR0FTX0lOSVRJQUxfUlNQX1NJWkUpOworCisJLyogR0FTIENvbWViYWNrIFJlcXVlc3QgKi8KKwlzbWVfZGVyZWdpc3Rlcl9tZ210X2ZyYW1lKGhIYWwsIFNNRV9TRVNTSU9OX0lEX0FOWSwgdHlwZSwKKwkJCQkgICh1aW50OF90ICopIEdBU19DT01FQkFDS19SRVEsCisJCQkJICBHQVNfQ09NRUJBQ0tfUkVRX1NJWkUpOworCisJLyogR0FTIENvbWViYWNrIFJlc3BvbnNlICovCisJc21lX2RlcmVnaXN0ZXJfbWdtdF9mcmFtZShoSGFsLCBTTUVfU0VTU0lPTl9JRF9BTlksIHR5cGUsCisJCQkJICAodWludDhfdCAqKSBHQVNfQ09NRUJBQ0tfUlNQLAorCQkJCSAgR0FTX0NPTUVCQUNLX1JTUF9TSVpFKTsKKworCS8qIFAyUCBQdWJsaWMgQWN0aW9uICovCisJc21lX2RlcmVnaXN0ZXJfbWdtdF9mcmFtZShoSGFsLCBTTUVfU0VTU0lPTl9JRF9BTlksIHR5cGUsCisJCQkJICAodWludDhfdCAqKSBQMlBfUFVCTElDX0FDVElPTl9GUkFNRSwKKwkJCQkgIFAyUF9QVUJMSUNfQUNUSU9OX0ZSQU1FX1NJWkUpOworCisJLyogUDJQIEFjdGlvbiAqLworCXNtZV9kZXJlZ2lzdGVyX21nbXRfZnJhbWUoaEhhbCwgU01FX1NFU1NJT05fSURfQU5ZLCB0eXBlLAorCQkJCSAgKHVpbnQ4X3QgKikgUDJQX0FDVElPTl9GUkFNRSwKKwkJCQkgIFAyUF9BQ1RJT05fRlJBTUVfU0laRSk7CisKKwkvKiBXTk0tTm90aWZpY2F0aW9uICovCisJc21lX2RlcmVnaXN0ZXJfbWdtdF9mcmFtZShoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLCB0eXBlLAorCQkJCSAgKHVpbnQ4X3QgKikgV05NX05PVElGSUNBVElPTl9GUkFNRSwKKwkJCQkgIFdOTV9OT1RJRklDQVRJT05fRlJBTUVfU0laRSk7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfa2V5X3dhcGkoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVpbnQ4X3Qga2V5X2luZGV4LAorCQkJCSAgICBjb25zdCB1aW50OF90ICptYWNfYWRkciwgY29uc3QgdWludDhfdCAqa2V5LAorCQkJCSAgICBpbnQga2V5X0xlbikKK3sKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCXRDc3JSb2FtU2V0S2V5IHNldEtleTsKKwlib29sIGlzQ29ubmVjdGVkID0gdHJ1ZTsKKwlpbnQgc3RhdHVzID0gMDsKKwl1aW50MzJfdCByb2FtSWQgPSAweEZGOworCXVpbnQ4X3QgKnBLZXlQdHIgPSBOVUxMOworCWludCBuID0gMDsKKworCWhkZExvZyhMT0cxLCAiRGV2aWNlX21vZGUgJXMoJWQpIiwKKwkJaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhwQWRhcHRlci0+ZGV2aWNlX21vZGUpLAorCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCisJY2RmX21lbV96ZXJvKCZzZXRLZXksIHNpemVvZih0Q3NyUm9hbVNldEtleSkpOworCXNldEtleS5rZXlJZCA9IGtleV9pbmRleDsgICAgICAgLyogU3RvcmUgS2V5IElEICovCisJc2V0S2V5LmVuY1R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk7IC8qIFNFVCBXQVBJIEVuY3J5cHRpb24gKi8KKwlzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9UWF9SWDsgICAgICAgLyogS2V5IERpcmVjdGlvbm4gYm90aCBUWCBhbmQgUlggKi8KKwlzZXRLZXkucGFlUm9sZSA9IDA7ICAgICAvKiB0aGUgUEFFIHJvbGUgKi8KKwlpZiAoIW1hY19hZGRyIHx8IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hY19hZGRyKSkgeworCQljZGZfc2V0X21hY2FkZHJfYnJvYWRjYXN0KCZzZXRLZXkucGVlck1hYyk7CisJfSBlbHNlIHsKKwkJY2RmX21lbV9jb3B5KHNldEtleS5wZWVyTWFjLmJ5dGVzLCBtYWNfYWRkciwgQ0RGX01BQ19BRERSX1NJWkUpOworCX0KKwlzZXRLZXkua2V5TGVuZ3RoID0ga2V5X0xlbjsKKwlwS2V5UHRyID0gc2V0S2V5LktleTsKKwltZW1jcHkocEtleVB0ciwga2V5LCBrZXlfTGVuKTsKKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBXQVBJIEtFWSBMRU5HVEg6MHglMDR4IiwKKwkgICAgICAgX19mdW5jX18sIGtleV9MZW4pOworCWZvciAobiA9IDA7IG4gPCBrZXlfTGVuOyBuKyspCisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIFdBUEkgS0VZIERhdGFbJWRdOiUwMnggIiwKKwkJICAgICAgIF9fZnVuY19fLCBuLCBzZXRLZXkuS2V5W25dKTsKKworCXBIZGRTdGFDdHgtPnJvYW1faW5mby5yb2FtaW5nU3RhdGUgPSBIRERfUk9BTV9TVEFURV9TRVRUSU5HX0tFWTsKKwlpZiAoaXNDb25uZWN0ZWQpIHsKKwkJc3RhdHVzID0gc21lX3JvYW1fc2V0X2tleShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCSAgcEFkYXB0ZXItPnNlc3Npb25JZCwgJnNldEtleSwgJnJvYW1JZCk7CisJfQorCWlmIChzdGF0dXMgIT0gMCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIlslNGRdIHNtZV9yb2FtX3NldF9rZXkgcmV0dXJuZWQgRVJST1Igc3RhdHVzPSAlZCIsCisJCQkgIF9fTElORV9fLCBzdGF0dXMpOworCQlwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfTk9ORTsKKwl9Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKwordWludDhfdCAqd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2llX3B0cihjb25zdCB1aW50OF90ICppZXNfcHRyLCBpbnQgbGVuZ3RoLAorCQkJCSAgICAgIHVpbnQ4X3QgZWlkKQoreworCWludCBsZWZ0ID0gbGVuZ3RoOworCXVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopaWVzX3B0cjsKKwl1aW50OF90IGVsZW1faWQsIGVsZW1fbGVuOworCisJd2hpbGUgKGxlZnQgPj0gMikgeworCQllbGVtX2lkID0gcHRyWzBdOworCQllbGVtX2xlbiA9IHB0clsxXTsKKwkJbGVmdCAtPSAyOworCQlpZiAoZWxlbV9sZW4gPiBsZWZ0KSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgICAgIEZMKCJJbnZhbGlkIElFcyBlaWQgPSAlZCBlbGVtX2xlbj0lZCBsZWZ0PSVkIiksCisJCQkgICAgICAgZWlkLCBlbGVtX2xlbiwgbGVmdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoZWxlbV9pZCA9PSBlaWQpIHsKKwkJCXJldHVybiBwdHI7CisJCX0KKworCQlsZWZ0IC09IGVsZW1fbGVuOworCQlwdHIgKz0gKGVsZW1fbGVuICsgMik7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX3ZhbGlkYXRlX29wZXJhdGlvbl9jaGFubmVsCisgKiBjYWxsZWQgYnkgd2xhbl9oZGRfY2ZnODAyMTFfc3RhcnRfYnNzKCkgYW5kCisgKiB3bGFuX2hkZF9zZXRfY2hhbm5lbCgpCisgKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB3aGV0aGVyIGdpdmVuIGNoYW5uZWwgaXMgcGFydCBvZiB2YWxpZAorICogY2hhbm5lbCBsaXN0LgorICovCitDREZfU1RBVFVTIHdsYW5faGRkX3ZhbGlkYXRlX29wZXJhdGlvbl9jaGFubmVsKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkgICAgICAgaW50IGNoYW5uZWwpCit7CisKKwl1aW50MzJfdCBudW1fY2ggPSAwOworCXU4IHZhbGlkX2NoW1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CisJdTMyIGluZHggPSAwOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwl1aW50OF90IGZWYWxpZENoYW5uZWwgPSBmYWxzZSwgY291bnQgPSAwOworCXN0cnVjdCBoZGRfY29uZmlnICpoZGRfcENvbmZpZ19pbmkgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWc7CisKKwludW1fY2ggPSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU47CisKKwlpZiAoaGRkX3BDb25maWdfaW5pLT5zYXBBbGxvd0FsbENoYW5uZWwpIHsKKwkJLyogVmFsaWRhdGUgdGhlIGNoYW5uZWwgKi8KKwkJZm9yIChjb3VudCA9IFJGX0NIQU5fMTsgY291bnQgPD0gUkZfQ0hBTl8xNjU7IGNvdW50KyspIHsKKwkJCWlmIChjaGFubmVsID09IHJmX2NoYW5uZWxzW2NvdW50XS5jaGFubmVsTnVtKSB7CisJCQkJZlZhbGlkQ2hhbm5lbCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGZWYWxpZENoYW5uZWwgIT0gdHJ1ZSkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICAiJXM6IEludmFsaWQgQ2hhbm5lbCBbJWRdIiwgX19mdW5jX18sIGNoYW5uZWwpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKDAgIT0gc21lX2NmZ19nZXRfc3RyKGhIYWwsIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNULAorCQkJCQkgdmFsaWRfY2gsICZudW1fY2gpKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgICIlczogZmFpbGVkIHRvIGdldCB2YWxpZCBjaGFubmVsIGxpc3QiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlmb3IgKGluZHggPSAwOyBpbmR4IDwgbnVtX2NoOyBpbmR4KyspIHsKKwkJCWlmIChjaGFubmVsID09IHZhbGlkX2NoW2luZHhdKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoaW5keCA+PSBudW1fY2gpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBJbnZhbGlkIENoYW5uZWwgWyVkXSIsIF9fZnVuY19fLCBjaGFubmVsKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCit9CisKKyNpZmRlZiBESENQX1NFUlZFUl9PRkZMT0FECitzdGF0aWMgdm9pZCB3bGFuX2hkZF9zZXRfZGhjcF9zZXJ2ZXJfb2ZmbG9hZChoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwl0cFNpckRoY3BTcnZPZmZsb2FkSW5mbyBwRGhjcFNydkluZm87CisJdWludDhfdCBudW1FbnRyaWVzID0gMDsKKwl1aW50OF90IHNydl9pcFtJUEFERFJfTlVNX0VOVFJJRVNdOworCXVpbnQ4X3QgbnVtOworCXVpbnQzMl90IHRlbXA7CisJcERoY3BTcnZJbmZvID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwRGhjcFNydkluZm8pKTsKKwlpZiAoTlVMTCA9PSBwRGhjcFNydkluZm8pIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgICIlczogY291bGQgbm90IGFsbG9jYXRlIHREaGNwU3J2T2ZmbG9hZEluZm8hIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWNkZl9tZW1femVybyhwRGhjcFNydkluZm8sIHNpemVvZigqcERoY3BTcnZJbmZvKSk7CisJcERoY3BTcnZJbmZvLT52ZGV2X2lkID0gcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQ7CisJcERoY3BTcnZJbmZvLT5kaGNwU3J2T2ZmbG9hZEVuYWJsZWQgPSB0cnVlOworCXBEaGNwU3J2SW5mby0+ZGhjcENsaWVudE51bSA9IHBIZGRDdHgtPmNvbmZpZy0+ZGhjcE1heE51bUNsaWVudHM7CisJaGRkX3N0cmluZ190b191OF9hcnJheShwSGRkQ3R4LT5jb25maWctPmRoY3BTZXJ2ZXJJUCwKKwkJCSAgICAgICBzcnZfaXAsICZudW1FbnRyaWVzLCBJUEFERFJfTlVNX0VOVFJJRVMpOworCWlmIChudW1FbnRyaWVzICE9IElQQUREUl9OVU1fRU5UUklFUykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBpbmNvcnJlY3QgSVAgYWRkcmVzcyAoJXMpIGFzc2lnbmVkIGZvciBESENQIHNlcnZlciEiLAorCQkgICAgICAgX19mdW5jX18sIHBIZGRDdHgtPmNvbmZpZy0+ZGhjcFNlcnZlcklQKTsKKwkJZ290byBlbmQ7CisJfQorCWlmICgoc3J2X2lwWzBdID49IDIyNCkgJiYgKHNydl9pcFswXSA8PSAyMzkpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IGludmFsaWQgSVAgYWRkcmVzcyAoJXMpISBJdCBjb3VsZCBOT1QgYmUgbXVsdGljYXN0IElQIGFkZHJlc3MhIiwKKwkJICAgICAgIF9fZnVuY19fLCBwSGRkQ3R4LT5jb25maWctPmRoY3BTZXJ2ZXJJUCk7CisJCWdvdG8gZW5kOworCX0KKwlpZiAoc3J2X2lwW0lQQUREUl9OVU1fRU5UUklFUyAtIDFdID49IDEwMCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBpbnZhbGlkIElQIGFkZHJlc3MgKCVzKSEgVGhlIGxhc3QgZmllbGQgbXVzdCBiZSBsZXNzIHRoYW4gMTAwISIsCisJCSAgICAgICBfX2Z1bmNfXywgcEhkZEN0eC0+Y29uZmlnLT5kaGNwU2VydmVySVApOworCQlnb3RvIGVuZDsKKwl9CisJZm9yIChudW0gPSAwOyBudW0gPCBudW1FbnRyaWVzOyBudW0rKykgeworCQl0ZW1wID0gc3J2X2lwW251bV07CisJCXBEaGNwU3J2SW5mby0+ZGhjcFNydklQIHw9ICh0ZW1wIDw8ICg4ICogbnVtKSk7CisJfQorCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkgICAgc21lX3NldF9kaGNwX3Nydl9vZmZsb2FkKHBIZGRDdHgtPmhIYWwsIHBEaGNwU3J2SW5mbykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgICIlczogc21lX3NldERIQ1BTcnZPZmZsb2FkIGZhaWwhIiwgX19mdW5jX18pOworCQlnb3RvIGVuZDsKKwl9CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJICAgICAgICIlczogZW5hYmxlIERIQ1AgU2VydmVyIG9mZmxvYWQgc3VjY2Vzc2Z1bGx5ISIsIF9fZnVuY19fKTsKK2VuZDoKKwljZGZfbWVtX2ZyZWUocERoY3BTcnZJbmZvKTsKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogREhDUF9TRVJWRVJfT0ZGTE9BRCAqLworCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfY2hhbmdlX2JzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGJzc19wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJaW50IHJldCA9IDA7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1czsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfQ0hBTkdFX0JTUywKKwkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLCBwYXJhbXMtPmFwX2lzb2xhdGUpKTsKKwloZGRMb2coTE9HMSwgRkwoIkRldmljZV9tb2RlICVzKCVkKSwgYXBfaXNvbGF0ZSA9ICVkIiksCisJCWhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJcEFkYXB0ZXItPmRldmljZV9tb2RlLCBwYXJhbXMtPmFwX2lzb2xhdGUpOworCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCEocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCB8fAorCSAgICAgIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pKSB7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBhcF9pc29sYXRlID09IC0xIG1lYW5zIHRoYXQgaW4gY2hhbmdlIGJzcywgdXBwZXIgbGF5ZXIgZG9lc24ndAorCSAqIHdhbnQgdG8gdXBkYXRlIHRoaXMgcGFyYW1ldGVyICovCisJaWYgKC0xICE9IHBhcmFtcy0+YXBfaXNvbGF0ZSkgeworCQlwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5hcERpc2FibGVJbnRyYUJzc0Z3ZCA9CisJCQkhIXBhcmFtcy0+YXBfaXNvbGF0ZTsKKworCQljZGZfcmV0X3N0YXR1cyA9IHNtZV9hcF9kaXNhYmxlX2ludHJhX2Jzc19md2QocEhkZEN0eC0+aEhhbCwKKwkJCQkJCQkgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJCSAgICAgIHBBZGFwdGVyLT5zZXNzaW9uQ3R4LgorCQkJCQkJCSAgICAgIGFwLgorCQkJCQkJCSAgICAgIGFwRGlzYWJsZUludHJhQnNzRndkKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3JldF9zdGF0dXMpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfQorCisJRVhJVCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3dsYW5faGRkX2NoYW5nZV9pZmFjZV90b19hZGhvYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCSAgICAgICB0Q3NyUm9hbVByb2ZpbGUgKnBSb2FtUHJvZmlsZSwKKwkJCSAgICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIobmRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXN0cnVjdCBoZGRfY29uZmlnICpwQ29uZmlnID0gcEhkZEN0eC0+Y29uZmlnOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBuZGV2LT5pZWVlODAyMTFfcHRyOworCisJcFJvYW1Qcm9maWxlLT5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTOworCXBSb2FtUHJvZmlsZS0+cGh5TW9kZSA9CisJCWhkZF9jZmdfeGxhdGVfdG9fY3NyX3BoeV9tb2RlKHBDb25maWctPmRvdDExTW9kZSk7CisJcEFkYXB0ZXItPmRldmljZV9tb2RlID0gV0xBTl9IRERfSUJTUzsKKwl3ZGV2LT5pZnR5cGUgPSB0eXBlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2hhbmdlX2lmYWNlX3RvX3N0YV9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCQkgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihuZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJaGRkX3dleHRfc3RhdGVfdCAqd2V4dDsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OworCUNERl9TVEFUVVMgc3RhdHVzOworCisJRU5URVIoKTsKKworCWlmICh0ZXN0X2JpdChBQ1NfSU5fUFJPR1JFU1MsICZwSGRkQ3R4LT5nX2V2ZW50X2ZsYWdzKSkgeworCQloZGRMb2coTE9HMSwgRkwoIkFDUyBpcyBpbiBwcm9ncmVzcywgZG9uJ3QgY2hhbmdlIGlmYWNlISIpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2RldiA9IG5kZXYtPmllZWU4MDIxMV9wdHI7CisJaGRkX3N0b3BfYWRhcHRlcihwSGRkQ3R4LCBwQWRhcHRlciwgdHJ1ZSk7CisJaGRkX2RlaW5pdF9hZGFwdGVyKHBIZGRDdHgsIHBBZGFwdGVyLCB0cnVlKTsKKwl3ZGV2LT5pZnR5cGUgPSB0eXBlOworCS8qQ2hlY2sgZm9yIHN1Yi1zdHJpbmcgcDJwIHRvIGNvbmZpcm0gaXRzIGEgcDJwIGludGVyZmFjZSAqLworCWlmIChOVUxMICE9IHN0cm5zdHIobmRldi0+bmFtZSwgInAycCIsIDMpKSB7CisJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9CisJCQkodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSA/CisJCQlXTEFOX0hERF9QMlBfREVWSUNFIDogV0xBTl9IRERfUDJQX0NMSUVOVDsKKwl9IGVsc2UgeworCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUgPQorCQkJKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgPworCQkJV0xBTl9IRERfSU5GUkFfU1RBVElPTiA6IFdMQU5fSEREX1AyUF9DTElFTlQ7CisJfQorCisJLyogc2V0IGNvbl9tb2RlIHRvIFNUQSBvbmx5IHdoZW4gbm8gU0FQIGNvbmN1cnJlbmN5IG1vZGUgKi8KKwlpZiAoIShjZHNfZ2V0X2NvbmN1cnJlbmN5X21vZGUoKSAmIChDREZfU0FQX01BU0sgfCBDREZfUDJQX0dPX01BU0spKSkKKwkJaGRkX3NldF9jb25wYXJhbSgwKTsKKwltZW1zZXQoJnBBZGFwdGVyLT5zZXNzaW9uQ3R4LCAwLCBzaXplb2YocEFkYXB0ZXItPnNlc3Npb25DdHgpKTsKKwloZGRfc2V0X3N0YXRpb25fb3BzKHBBZGFwdGVyLT5kZXYpOworCXN0YXR1cyA9IGhkZF9pbml0X3N0YXRpb25fbW9kZShwQWRhcHRlcik7CisJd2V4dCA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisJd2V4dC0+cm9hbVByb2ZpbGUucEFkZElFU2NhbiA9IHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmFkZElFZGF0YTsKKwl3ZXh0LT5yb2FtUHJvZmlsZS5uQWRkSUVTY2FuTGVuZ3RoID0KKwkJcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuQWRkSUUubGVuZ3RoOworCUVYSVQoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2NoYW5nZV9ic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGJzc19wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9jaGFuZ2VfYnNzKHdpcGh5LCBkZXYsIHBhcmFtcyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyogRlVOQ1RJT046IHdsYW5faGRkX2NoYW5nZV9jb3VudHJ5X2NvZGVfY2QKKyAqICB0byB3YWl0IGZvciBjb250cnkgY29kZSBjb21wbGV0aW9uCisgKi8KK3ZvaWQgKndsYW5faGRkX2NoYW5nZV9jb3VudHJ5X2NvZGVfY2Iodm9pZCAqcEFkYXB0ZXIpCit7CisJaGRkX2FkYXB0ZXJfdCAqY2FsbF9iYWNrX3BBZGFwdGVyID0gcEFkYXB0ZXI7CisJY29tcGxldGUoJmNhbGxfYmFja19wQWRhcHRlci0+Y2hhbmdlX2NvdW50cnlfY29kZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBGVU5DVElPTjogX193bGFuX2hkZF9jZmc4MDIxMV9jaGFuZ2VfaWZhY2UKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGludGVyZmFjZSB0eXBlIChJTkZSQVNUUlVDVFVSRS9BREhPQykKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2NoYW5nZV9pZmFjZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJCSAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCisJCQkJCSAgICB1MzIgKmZsYWdzLAorCQkJCQkgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKG5kZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJdENzclJvYW1Qcm9maWxlICpwUm9hbVByb2ZpbGUgPSBOVUxMOworCWVDc3JSb2FtQnNzVHlwZSBMYXN0QlNTVHlwZTsKKwlzdHJ1Y3QgaGRkX2NvbmZpZyAqcENvbmZpZyA9IE5VTEw7CisJZU1pYl9kb3QxMURlc2lyZWRCc3NUeXBlIGNvbm5lY3RlZEJzc1R5cGU7CisJdW5zaWduZWQgbG9uZyByYzsKKwlDREZfU1RBVFVTIHZzdGF0dXM7CisJaW50IHN0YXR1czsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0NIQU5HRV9JRkFDRSwKKwkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLCB0eXBlKSk7CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sIEZMKCJEZXZpY2VfbW9kZSA9ICVkLCBJRlRZUEUgPSAweCV4IiksCisJICAgICAgIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSwgdHlwZSk7CisKKwlpZiAoIWNkc19hbGxvd19jb25jdXJyZW5jeShwSGRkQ3R4LAorCQkJCXdsYW5faGRkX2NvbnZlcnRfbmxfaWZ0eXBlX3RvX2hkZF90eXBlKHR5cGUpLAorCQkJCTAsIEhXX01PREVfMjBfTUhaKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJRkwoIlRoaXMgY29uY3VycmVuY3kgY29tYmluYXRpb24gaXMgbm90IGFsbG93ZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBDb25maWcgPSBwSGRkQ3R4LT5jb25maWc7CisJd2RldiA9IG5kZXYtPmllZWU4MDIxMV9wdHI7CisKKwkvKiBSZXNldCB0aGUgY3VycmVudCBkZXZpY2UgbW9kZSBiaXQgbWFzayAqLworCWNkc19jbGVhcl9jb25jdXJyZW5jeV9tb2RlKHBIZGRDdHgsIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKwloZGRfdGRsc19ub3RpZnlfbW9kZV9jaGFuZ2UocEFkYXB0ZXIsIHBIZGRDdHgpOworCisJaWYgKChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikgfHwKKwkgICAgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfQ0xJRU5UKSB8fAorCSAgICAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9ERVZJQ0UpKSB7CisJCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPQorCQkJV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKworCQlwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisJCUxhc3RCU1NUeXBlID0gcFJvYW1Qcm9maWxlLT5CU1NUeXBlOworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKKwkJCXZzdGF0dXMgPSB3bGFuX2hkZF9jaGFuZ2VfaWZhY2VfdG9fc3RhX21vZGUobmRldiwgdHlwZSk7CisJCQlpZiAodnN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWhkZF9yZWdpc3Rlcl90eF9mbG93X2NvbnRyb2wocEFkYXB0ZXIsCisJCQkJCWhkZF90eF9yZXN1bWVfdGltZXJfZXhwaXJlZF9oYW5kbGVyLAorCQkJCQloZGRfdHhfcmVzdW1lX2NiKTsKKworCQkJZ290byBkb25lOworCisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCQl3bGFuX2hkZF90ZGxzX2V4aXQocEFkYXB0ZXIpOworCQkJaGRkTG9nKExPRzEsIEZMKCJTZXR0aW5nIGludGVyZmFjZSBUeXBlIHRvIEFESE9DIikpOworCQkJd2xhbl9oZGRfY2hhbmdlX2lmYWNlX3RvX2FkaG9jKG5kZXYsIHBSb2FtUHJvZmlsZSwKKwkJCQkJCSAgICAgICB0eXBlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgorCQl7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgICAgICBGTCgiU2V0dGluZyBpbnRlcmZhY2UgVHlwZSB0byAlcyIpLAorCQkJICAgICAgICh0eXBlID09CisJCQkJTkw4MDIxMV9JRlRZUEVfQVApID8gIlNvZnRBUCIgOgorCQkJICAgICAgICJQMnBHbyIpOworCisJCQkvKiBDYW5jZWwgYW55IHJlbWFpbiBvbiBjaGFubmVsIGZvciBHTyBtb2RlICovCisJCQlpZiAoTkw4MDIxMV9JRlRZUEVfUDJQX0dPID09IHR5cGUpIHsKKwkJCQl3bGFuX2hkZF9jYW5jZWxfZXhpc3RpbmdfcmVtYWluX29uX2NoYW5uZWwKKwkJCQkJKHBBZGFwdGVyKTsKKwkJCX0KKworCQkJaWYgKE5MODAyMTFfSUZUWVBFX0FQID09IHR5cGUpIHsKKwkJCQkvKiBBcyBMb2FkaW5nIFdMQU4gRHJpdmVyIG9uZSBpbnRlcmZhY2UgYmVpbmcgY3JlYXRlZCBmb3IKKwkJCQkgKiBwMnAgZGV2aWNlIGFkZHJlc3MuIFRoaXMgd2lsbCB0YWtlIG9uZSBIVyBTVEEgYW5kIHRoZQorCQkJCSAqIG1heCBudW1iZXIgb2YgY2xpZW50cyB0aGF0IGNhbiBjb25uZWN0IHRvIHNvZnRBUCB3aWxsIGJlCisJCQkJICogcmVkdWNlZCBieSBvbmUuIHNvIHdoaWxlIGNoYW5naW5nIHRoZSBpbnRlcmZhY2UgdHlwZSB0bworCQkJCSAqIE5MODAyMTFfSUZUWVBFX0FQIChTb2Z0QVApIHJlbW92ZSBwMnAwIGludGVyZmFjZSBhcyBpdCBpcworCQkJCSAqIG5vdCByZXF1aXJlZCBpbiBTb2Z0QVAgbW9kZS4KKwkJCQkgKi8KKworCQkJCS8qIEdldCBQMlAgQWRhcHRlciAqLworCQkJCWhkZF9hZGFwdGVyX3QgKnBQMnBBZGFwdGVyID0gTlVMTDsKKwkJCQlwUDJwQWRhcHRlciA9CisJCQkJCWhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LAorCQkJCQkJCVdMQU5fSEREX1AyUF9ERVZJQ0UpOworCisJCQkJaWYgKHBQMnBBZGFwdGVyKSB7CisJCQkJCWhkZF9zdG9wX2FkYXB0ZXIocEhkZEN0eCwKKwkJCQkJCQkgcFAycEFkYXB0ZXIsCisJCQkJCQkJIHRydWUpOworCQkJCQloZGRfZGVpbml0X2FkYXB0ZXIocEhkZEN0eCwKKwkJCQkJCQkgICBwUDJwQWRhcHRlciwgdHJ1ZSk7CisJCQkJCWhkZF9jbG9zZV9hZGFwdGVyKHBIZGRDdHgsCisJCQkJCQkJICBwUDJwQWRhcHRlciwKKwkJCQkJCQkgIHRydWUpOworCQkJCX0KKwkJCX0KKwkJCWhkZF9zdG9wX2FkYXB0ZXIocEhkZEN0eCwgcEFkYXB0ZXIsIHRydWUpOworCisJCQkvKiBEZS1pbml0IHRoZSBhZGFwdGVyICovCisJCQloZGRfZGVpbml0X2FkYXB0ZXIocEhkZEN0eCwgcEFkYXB0ZXIsIHRydWUpOworCQkJbWVtc2V0KCZwQWRhcHRlci0+c2Vzc2lvbkN0eCwgMCwKKwkJCSAgICAgICBzaXplb2YocEFkYXB0ZXItPnNlc3Npb25DdHgpKTsKKwkJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9CisJCQkJKHR5cGUgPT0KKwkJCQkgTkw4MDIxMV9JRlRZUEVfQVApID8gV0xBTl9IRERfU09GVEFQIDoKKwkJCQlXTEFOX0hERF9QMlBfR087CisKKwkJCS8qCisJCQkgKiBGdyB3aWxsIHRha2UgY2FyZSBpbmNhc2Ugb2YgY29uY3VycmVuY3kKKwkJCSAqLworCisJCQlpZiAoKFdMQU5fSEREX1NPRlRBUCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpCisJCQkgICAgJiYgKHBDb25maWctPmFwUmFuZG9tQnNzaWRFbmFibGVkKSkgeworCQkJCS8qIFRvIG1lZXQgQW5kcm9pZCByZXF1aXJlbWVudHMgY3JlYXRlIGEgcmFuZG9taXplZAorCQkJCSAgIE1BQyBhZGRyZXNzIG9mIHRoZSBmb3JtIDAyOjFBOjExOkZ4Onh4Onh4ICovCisJCQkJZ2V0X3JhbmRvbV9ieXRlcygmbmRldi0+ZGV2X2FkZHJbM10sIDMpOworCQkJCW5kZXYtPmRldl9hZGRyWzBdID0gMHgwMjsKKwkJCQluZGV2LT5kZXZfYWRkclsxXSA9IDB4MUE7CisJCQkJbmRldi0+ZGV2X2FkZHJbMl0gPSAweDExOworCQkJCW5kZXYtPmRldl9hZGRyWzNdIHw9IDB4RjA7CisJCQkJbWVtY3B5KHBBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC4KKwkJCQkgICAgICAgYnl0ZXMsIG5kZXYtPmRldl9hZGRyLAorCQkJCSAgICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJCQkJcHJfaW5mbygid2xhbjogR2VuZXJhdGVkIEhvdFNwb3QgQlNTSUQgIgorCQkJCQlNQUNfQUREUkVTU19TVFIgIlxuIiwKKwkJCQkJTUFDX0FERFJfQVJSQVkobmRldi0+ZGV2X2FkZHIpKTsKKwkJCX0KKworCQkJaGRkX3NldF9hcF9vcHMocEFkYXB0ZXItPmRldik7CisKKwkJCXZzdGF0dXMgPSBoZGRfaW5pdF9hcF9tb2RlKHBBZGFwdGVyKTsKKwkJCWlmICh2c3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJCWhkZExvZyhMT0dQLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJFcnJvciBpbml0aWFsaXppbmcgdGhlIGFwIG1vZGUiKSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQloZGRfc2V0X2NvbnBhcmFtKDEpOworCisJCQloZGRfcmVnaXN0ZXJfdHhfZmxvd19jb250cm9sKHBBZGFwdGVyLAorCQkJCWhkZF9zb2Z0YXBfdHhfcmVzdW1lX3RpbWVyX2V4cGlyZWRfaGFuZGxlciwKKwkJCQloZGRfc29mdGFwX3R4X3Jlc3VtZV9jYik7CisKKwkJCS8qIEludGVyZmFjZSB0eXBlIGNoYW5nZWQgdXBkYXRlIGluIHdpcGh5IHN0cnVjdHVyZSAqLworCQkJaWYgKHdkZXYpIHsKKwkJCQl3ZGV2LT5pZnR5cGUgPSB0eXBlOworCQkJfSBlbHNlIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoIldpcmVsZXNzIGRldiBpcyBOVUxMIikpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJZ290byBkb25lOworCQl9CisKKwkJZGVmYXVsdDoKKwkJCWhkZExvZyhMT0dFLCBGTCgiVW5zdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGUgKCVkKSIpLAorCQkJICAgICAgIHR5cGUpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJfSBlbHNlIGlmICgocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCkgfHwKKwkJICAgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pKSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJCXN0YXR1cyA9IHdsYW5faGRkX2NoYW5nZV9pZmFjZV90b19zdGFfbW9kZShuZGV2LCB0eXBlKTsKKwkJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybiBzdGF0dXM7CisKKwkJCWlmICgoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCA9PSB0eXBlKSB8fAorCQkJICAgIChOTDgwMjExX0lGVFlQRV9TVEFUSU9OID09IHR5cGUpKSB7CisKKwkJCQloZGRfcmVnaXN0ZXJfdHhfZmxvd19jb250cm9sKHBBZGFwdGVyLAorCQkJCQloZGRfdHhfcmVzdW1lX3RpbWVyX2V4cGlyZWRfaGFuZGxlciwKKwkJCQkJaGRkX3R4X3Jlc3VtZV9jYik7CisJCQl9CisJCQlnb3RvIGRvbmU7CisKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CisJCQl3ZGV2LT5pZnR5cGUgPSB0eXBlOworCQkJcEFkYXB0ZXItPmRldmljZV9tb2RlID0gKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApID8KKwkJCQkJCVdMQU5fSEREX1NPRlRBUCA6IFdMQU5fSEREX1AyUF9HTzsKKworCQkJaGRkX3JlZ2lzdGVyX3R4X2Zsb3dfY29udHJvbChwQWRhcHRlciwKKwkJCQloZGRfc29mdGFwX3R4X3Jlc3VtZV90aW1lcl9leHBpcmVkX2hhbmRsZXIsCisJCQkJaGRkX3NvZnRhcF90eF9yZXN1bWVfY2IpOworCQkJZ290byBkb25lOworCisJCWRlZmF1bHQ6CisJCQloZGRMb2coTE9HRSwgRkwoIlVuc3VwcG9ydGVkIGludGVyZmFjZSB0eXBlKCVkKSIpLAorCQkJICAgICAgIHR5cGUpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJfSBlbHNlIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJVbnN1cHBvcnRlZCBkZXZpY2UgbW9kZSglZCkiKSwKKwkJICAgICAgIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlpZiAoTGFzdEJTU1R5cGUgIT0gcFJvYW1Qcm9maWxlLT5CU1NUeXBlKSB7CisJCS8qIEludGVyZmFjZSB0eXBlIGNoYW5nZWQgdXBkYXRlIGluIHdpcGh5IHN0cnVjdHVyZSAqLworCQl3ZGV2LT5pZnR5cGUgPSB0eXBlOworCisJCS8qIFRoZSBCU1MgbW9kZSBjaGFuZ2VkLCBXZSBuZWVkIHRvIGlzc3VlIGRpc2Nvbm5lY3QKKwkJICAgaWYgY29ubmVjdGVkIG9yIGluIElCU1MgZGlzY29ubmVjdCBzdGF0ZSAqLworCQlpZiAoaGRkX2Nvbm5fZ2V0X2Nvbm5lY3RlZF9ic3NfdHlwZQorCQkJICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSwgJmNvbm5lY3RlZEJzc1R5cGUpCisJCSAgICB8fCAoZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTID09IExhc3RCU1NUeXBlKSkgeworCQkJLyogTmVlZCB0byBpc3N1ZSBhIGRpc2Nvbm5lY3QgdG8gQ1NSLiAqLworCQkJSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0KKwkJCSAgICBzbWVfcm9hbV9kaXNjb25uZWN0KFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQllQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKSkgeworCQkJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwQWRhcHRlci0+CisJCQkJCQkJCSBkaXNjb25uZWN0X2NvbXBfdmFyLAorCQkJCQkJCQkgbXNlY3NfdG9famlmZmllcworCQkJCQkJCQkJIChXTEFOX1dBSVRfVElNRV9ESVNDT05ORUNUKSk7CisJCQkJaWYgKCFyYykgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgIEZMCisJCQkJCQkgICAgICAgKCJXYWl0IG9uIGRpc2Nvbm5lY3RfY29tcF92YXIgZmFpbGVkIikpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworZG9uZToKKwkvKiBTZXQgYml0bWFzayBiYXNlZCBvbiB1cGRhdGVkIHZhbHVlICovCisJY2RzX3NldF9jb25jdXJyZW5jeV9tb2RlKHBIZGRDdHgsIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTFBTUworCXdsYW5faGRkX3NlbmRfYWxsX3NjYW5faW50Zl9pbmZvKHBIZGRDdHgpOworI2VuZGlmCisKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogd2xhbl9oZGRfY2ZnODAyMTFfY2hhbmdlX2lmYWNlCisgKiB3cmFwcGVyIGZ1bmN0aW9uIHRvIHByb3RlY3QgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBmcm9tIFNTUi4KKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9jaGFuZ2VfaWZhY2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkJICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCisJCQkJCSAgdTMyICpmbGFncywKKwkJCQkJICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9CisJCV9fd2xhbl9oZGRfY2ZnODAyMTFfY2hhbmdlX2lmYWNlKHdpcGh5LCBuZGV2LCB0eXBlLCBmbGFncywgcGFyYW1zKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKK3N0YXRpYyBib29sIHdsYW5faGRkX2lzX2R1cGxpY2F0ZV9jaGFubmVsKHVpbnQ4X3QgKmFyciwKKwkJCQkJICBpbnQgaW5kZXgsIHVpbnQ4X3QgbWF0Y2gpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKKwkJaWYgKGFycltpXSA9PSBtYXRjaCkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworLyoqCisgKiBfX3dsYW5faGRkX2NoYW5nZV9zdGF0aW9uKCkgLSBjaGFuZ2Ugc3RhdGlvbgorICogQHdpcGh5OiBQb2ludGVyIHRvIHRoZSB3aXBoeSBzdHJ1Y3R1cmUKKyAqIEBkZXY6IFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAbWFjOiBic3NpZAorICogQHBhcmFtczogUG9pbnRlciB0byBzdGF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLgorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2hhbmdlX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQkgICBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCisjZWxzZQorc3RhdGljIGludCBfX3dsYW5faGRkX2NoYW5nZV9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICB1aW50OF90ICptYWMsCisJCQkJICAgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQorI2VuZGlmCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4OworCXN0cnVjdCBjZGZfbWFjX2FkZHIgU1RBTWFjQWRkcmVzczsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXRDc3JTdGFQYXJhbXMgU3RhUGFyYW1zID0geyAwIH07CisJdWludDhfdCBpc0J1ZlN0YSA9IDA7CisJdWludDhfdCBpc09mZkNoYW5uZWxTdXBwb3J0ZWQgPSAwOworI2VuZGlmCisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0hBTkdFX1NUQVRJT04sCisJCQkgcEFkYXB0ZXItPnNlc3Npb25JZCwgcGFyYW1zLT5saXN0ZW5faW50ZXJ2YWwpKTsKKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworCWNkZl9tZW1fY29weShTVEFNYWNBZGRyZXNzLmJ5dGVzLCBtYWMsIENERl9NQUNfQUREUl9TSVpFKTsKKworCWlmICgocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCkgfHwKKwkgICAgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pKSB7CisJCWlmIChwYXJhbXMtPnN0YV9mbGFnc19zZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEKSkgeworCQkJc3RhdHVzID0KKwkJCQloZGRfc29mdGFwX2NoYW5nZV9zdGFfc3RhdGUocEFkYXB0ZXIsCisJCQkJCQkJICAgICZTVEFNYWNBZGRyZXNzLAorCQkJCQkJCSAgICBvbF90eHJ4X3BlZXJfc3RhdGVfYXV0aCk7CisKKwkJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJOb3QgYWJsZSB0byBjaGFuZ2UgVEwgc3RhdGUgdG8gQVVUSEVOVElDQVRFRCIpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKSB8fAorCQkgICAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9DTElFTlQpKSB7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwkJaWYgKHBhcmFtcy0+c3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpIHsKKwkJCVN0YVBhcmFtcy5jYXBhYmlsaXR5ID0gcGFyYW1zLT5jYXBhYmlsaXR5OworCQkJU3RhUGFyYW1zLnVhcHNkX3F1ZXVlcyA9IHBhcmFtcy0+dWFwc2RfcXVldWVzOworCQkJU3RhUGFyYW1zLm1heF9zcCA9IHBhcmFtcy0+bWF4X3NwOworCisJCQkvKiBDb252ZXJ0IChmaXJzdCBjaGFubmVsICwgbnVtYmVyIG9mIGNoYW5uZWxzKSB0dXBsZSB0bworCQkJICogdGhlIHRvdGFsIGxpc3Qgb2YgY2hhbm5lbHMuIFRoaXMgZ29lcyB3aXRoIHRoZSBhc3N1bXB0aW9uCisJCQkgKiB0aGF0IGlmIHRoZSBmaXJzdCBjaGFubmVsIGlzIDwgMTQsIHRoZW4gdGhlIG5leHQgY2hhbm5lbHMKKwkJCSAqIGFyZSBhbiBpbmNyZW1lbnRhbCBvZiAxIGVsc2UgYW4gaW5jcmVtZW50YWwgb2YgNCB0aWxsIHRoZSBudW1iZXIKKwkJCSAqIG9mIGNoYW5uZWxzLgorCQkJICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiBwYXJhbXMtPnN1cHBvcnRlZF9jaGFubmVsc19sZW46ICVkIiwKKwkJCQkgIF9fZnVuY19fLCBwYXJhbXMtPnN1cHBvcnRlZF9jaGFubmVsc19sZW4pOworCQkJaWYgKDAgIT0gcGFyYW1zLT5zdXBwb3J0ZWRfY2hhbm5lbHNfbGVuKSB7CisJCQkJaW50IGkgPSAwLCBqID0gMCwgayA9IDAsIG5vX29mX2NoYW5uZWxzID0gMDsKKwkJCQlpbnQgbnVtX3VuaXF1ZV9jaGFubmVsczsKKwkJCQlpbnQgbmV4dDsKKwkJCQlmb3IgKGkgPSAwOworCQkJCSAgICAgaSA8IHBhcmFtcy0+c3VwcG9ydGVkX2NoYW5uZWxzX2xlbgorCQkJCSAgICAgJiYgaiA8IFNJUl9NQUNfTUFYX1NVUFBfQ0hBTk5FTFM7IGkgKz0gMikgeworCQkJCQlpbnQgd2lmaV9jaGFuX2luZGV4OworCQkJCQlpZiAoIXdsYW5faGRkX2lzX2R1cGxpY2F0ZV9jaGFubmVsCisJCQkJCQkgICAgKFN0YVBhcmFtcy5zdXBwb3J0ZWRfY2hhbm5lbHMsIGosCisJCQkJCQkgICAgcGFyYW1zLT5zdXBwb3J0ZWRfY2hhbm5lbHNbaV0pKSB7CisJCQkJCQlTdGFQYXJhbXMuCisJCQkJCQlzdXBwb3J0ZWRfY2hhbm5lbHNbal0gPQorCQkJCQkJCXBhcmFtcy0+CisJCQkJCQkJc3VwcG9ydGVkX2NoYW5uZWxzW2ldOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJd2lmaV9jaGFuX2luZGV4ID0KKwkJCQkJCSgoU3RhUGFyYW1zLnN1cHBvcnRlZF9jaGFubmVsc1tqXSA8PQorCQkJCQkJICBIRERfQ0hBTk5FTF8xNCkgPyAxIDogNCk7CisJCQkJCW5vX29mX2NoYW5uZWxzID0KKwkJCQkJCXBhcmFtcy0+c3VwcG9ydGVkX2NoYW5uZWxzW2kgKyAxXTsKKworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkJICAiJXM6IGk6ICVkLCBqOiAlZCwgazogJWQsIFN0YVBhcmFtcy5zdXBwb3J0ZWRfY2hhbm5lbHNbJWRdOiAlZCwgd2lmaV9jaGFuX2luZGV4OiAlZCwgbm9fb2ZfY2hhbm5lbHM6ICVkIiwKKwkJCQkJCSAgX19mdW5jX18sIGksIGosIGssIGosCisJCQkJCQkgIFN0YVBhcmFtcy4KKwkJCQkJCSAgc3VwcG9ydGVkX2NoYW5uZWxzW2pdLAorCQkJCQkJICB3aWZpX2NoYW5faW5kZXgsCisJCQkJCQkgIG5vX29mX2NoYW5uZWxzKTsKKwkJCQkJZm9yIChrID0gMTsgayA8PSBub19vZl9jaGFubmVscyAmJgorCQkJCQkgICAgIGogPCBTSVJfTUFDX01BWF9TVVBQX0NIQU5ORUxTIC0gMTsKKwkJCQkJICAgICBrKyspIHsKKwkJCQkJCW5leHQgPQorCQkJCQkJCQlTdGFQYXJhbXMuCisJCQkJCQkJCXN1cHBvcnRlZF9jaGFubmVsc1tqXSArCisJCQkJCQkJCXdpZmlfY2hhbl9pbmRleDsKKwkJCQkJCWlmICghd2xhbl9oZGRfaXNfZHVwbGljYXRlX2NoYW5uZWwoU3RhUGFyYW1zLnN1cHBvcnRlZF9jaGFubmVscywgaiArIDEsIG5leHQpKSB7CisJCQkJCQkJU3RhUGFyYW1zLgorCQkJCQkJCXN1cHBvcnRlZF9jaGFubmVsc1tqCisJCQkJCQkJCQkgICArCisJCQkJCQkJCQkgICAxXQorCQkJCQkJCQk9IG5leHQ7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCQkJICAiJXM6IGk6ICVkLCBqOiAlZCwgazogJWQsIFN0YVBhcmFtcy5zdXBwb3J0ZWRfY2hhbm5lbHNbJWRdOiAlZCIsCisJCQkJCQkJICBfX2Z1bmNfXywgaSwgaiwgaywKKwkJCQkJCQkgIGogKyAxLAorCQkJCQkJCSAgU3RhUGFyYW1zLgorCQkJCQkJCSAgc3VwcG9ydGVkX2NoYW5uZWxzW2ogKworCQkJCQkJCQkJICAgICAxXSk7CisJCQkJCQlqICs9IDE7CisJCQkJCX0KKwkJCQl9CisJCQkJbnVtX3VuaXF1ZV9jaGFubmVscyA9IGogKyAxOworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICAiJXM6IFVuaXF1ZSBDaGFubmVsIExpc3QiLCBfX2Z1bmNfXyk7CisJCQkJZm9yIChpID0gMDsgaSA8IG51bV91bmlxdWVfY2hhbm5lbHM7IGkrKykgeworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkJICAiJXM6IFN0YVBhcmFtcy5zdXBwb3J0ZWRfY2hhbm5lbHNbJWRdOiAlZCwiLAorCQkJCQkJICBfX2Z1bmNfXywgaSwKKwkJCQkJCSAgU3RhUGFyYW1zLgorCQkJCQkJICBzdXBwb3J0ZWRfY2hhbm5lbHNbaV0pOworCQkJCX0KKwkJCQlpZiAoTUFYX0NIQU5ORUwgPCBudW1fdW5pcXVlX2NoYW5uZWxzKQorCQkJCQludW1fdW5pcXVlX2NoYW5uZWxzID0gTUFYX0NIQU5ORUw7CisJCQkJU3RhUGFyYW1zLnN1cHBvcnRlZF9jaGFubmVsc19sZW4gPQorCQkJCQludW1fdW5pcXVlX2NoYW5uZWxzOworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICAiJXM6IEFmdGVyIHJlbW92aW5nIGR1cGxjYXRlcyBTdGFQYXJhbXMuc3VwcG9ydGVkX2NoYW5uZWxzX2xlbjogJWQiLAorCQkJCQkgIF9fZnVuY19fLAorCQkJCQkgIFN0YVBhcmFtcy5zdXBwb3J0ZWRfY2hhbm5lbHNfbGVuKTsKKwkJCX0KKwkJCWNkZl9tZW1fY29weShTdGFQYXJhbXMuc3VwcG9ydGVkX29wZXJfY2xhc3NlcywKKwkJCQkgICAgIHBhcmFtcy0+c3VwcG9ydGVkX29wZXJfY2xhc3NlcywKKwkJCQkgICAgIHBhcmFtcy0+c3VwcG9ydGVkX29wZXJfY2xhc3Nlc19sZW4pOworCQkJU3RhUGFyYW1zLnN1cHBvcnRlZF9vcGVyX2NsYXNzZXNfbGVuID0KKwkJCQlwYXJhbXMtPnN1cHBvcnRlZF9vcGVyX2NsYXNzZXNfbGVuOworCisJCQlpZiAoMCAhPSBwYXJhbXMtPmV4dF9jYXBhYl9sZW4pCisJCQkJY2RmX21lbV9jb3B5KFN0YVBhcmFtcy5leHRuX2NhcGFiaWxpdHksCisJCQkJCSAgICAgcGFyYW1zLT5leHRfY2FwYWIsCisJCQkJCSAgICAgc2l6ZW9mKFN0YVBhcmFtcy5leHRuX2NhcGFiaWxpdHkpKTsKKworCQkJaWYgKE5VTEwgIT0gcGFyYW1zLT5odF9jYXBhKSB7CisJCQkJU3RhUGFyYW1zLmh0Y2FwX3ByZXNlbnQgPSAxOworCQkJCWNkZl9tZW1fY29weSgmU3RhUGFyYW1zLkhUQ2FwLCBwYXJhbXMtPmh0X2NhcGEsCisJCQkJCSAgICAgc2l6ZW9mKHRTaXJIVENhcCkpOworCQkJfQorCisJCQlTdGFQYXJhbXMuc3VwcG9ydGVkX3JhdGVzX2xlbiA9CisJCQkJcGFyYW1zLT5zdXBwb3J0ZWRfcmF0ZXNfbGVuOworCisJCQkvKiBOb3RlIDogVGhlIE1heGltdW0gc2l6ZW9mIHN1cHBvcnRlZF9yYXRlcyBzZW50IGJ5IHRoZSBTdXBwbGljYW50IGlzIDMyLgorCQkJICogVGhlIHN1cHBvcnRlZF9yYXRlcyBhcnJheSAsIGZvciBhbGwgdGhlIHN0cnVjdHVyZXMgcHJvcG9nYXRpbmcgdGlsbCBBZGQgU3RhCisJCQkgKiB0byB0aGUgZmlybXdhcmUgaGFzIHRvIGJlIG1vZGlmaWVkICwgaWYgdGhlIHN1cHBsaWNhbnQgKGllZWU4MDIxMSkgaXMKKwkJCSAqIG1vZGlmaWVkIHRvIHNlbmQgbW9yZSByYXRlcy4KKwkJCSAqLworCisJCQkvKiBUbyBhdm9pZCBEYXRhIEN1cnJwdGlvbiAsIHNldCB0byBtYXggbGVuZ3RoIHRvIFNJUl9NQUNfTUFYX1NVUFBfUkFURVMKKwkJCSAqLworCQkJaWYgKFN0YVBhcmFtcy5zdXBwb3J0ZWRfcmF0ZXNfbGVuID4KKwkJCSAgICBTSVJfTUFDX01BWF9TVVBQX1JBVEVTKQorCQkJCVN0YVBhcmFtcy5zdXBwb3J0ZWRfcmF0ZXNfbGVuID0KKwkJCQkJU0lSX01BQ19NQVhfU1VQUF9SQVRFUzsKKworCQkJaWYgKDAgIT0gU3RhUGFyYW1zLnN1cHBvcnRlZF9yYXRlc19sZW4pIHsKKwkJCQlpbnQgaSA9IDA7CisJCQkJY2RmX21lbV9jb3B5KFN0YVBhcmFtcy5zdXBwb3J0ZWRfcmF0ZXMsCisJCQkJCSAgICAgcGFyYW1zLT5zdXBwb3J0ZWRfcmF0ZXMsCisJCQkJCSAgICAgU3RhUGFyYW1zLnN1cHBvcnRlZF9yYXRlc19sZW4pOworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICAiU3VwcG9ydGVkIFJhdGVzIHdpdGggTGVuZ3RoICVkIiwKKwkJCQkJICBTdGFQYXJhbXMuc3VwcG9ydGVkX3JhdGVzX2xlbik7CisJCQkJZm9yIChpID0gMDsgaSA8IFN0YVBhcmFtcy5zdXBwb3J0ZWRfcmF0ZXNfbGVuOworCQkJCSAgICAgaSsrKQorCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkJICAiWyVkXTogJTB4IiwgaSwKKwkJCQkJCSAgU3RhUGFyYW1zLnN1cHBvcnRlZF9yYXRlc1tpXSk7CisJCQl9CisKKwkJCWlmIChOVUxMICE9IHBhcmFtcy0+dmh0X2NhcGEpIHsKKwkJCQlTdGFQYXJhbXMudmh0Y2FwX3ByZXNlbnQgPSAxOworCQkJCWNkZl9tZW1fY29weSgmU3RhUGFyYW1zLlZIVENhcCwKKwkJCQkJICAgICBwYXJhbXMtPnZodF9jYXBhLAorCQkJCQkgICAgIHNpemVvZih0U2lyVkhUQ2FwKSk7CisJCQl9CisKKwkJCWlmICgwICE9IHBhcmFtcy0+ZXh0X2NhcGFiX2xlbikgeworCQkJCS8qRGVmaW5lIEEgTWFjcm8gOiBUT0RPIFN1bmlsICovCisJCQkJaWYgKCgxIDw8IDQpICYgU3RhUGFyYW1zLmV4dG5fY2FwYWJpbGl0eVszXSkgeworCQkJCQlpc0J1ZlN0YSA9IDE7CisJCQkJfQorCQkJCS8qIFRETFMgQ2hhbm5lbCBTd2l0Y2hpbmcgU3VwcG9ydCAqLworCQkJCWlmICgoMSA8PCA2KSAmIFN0YVBhcmFtcy5leHRuX2NhcGFiaWxpdHlbM10pIHsKKwkJCQkJaXNPZmZDaGFubmVsU3VwcG9ydGVkID0gMTsKKwkJCQl9CisJCQl9CisKKwkJCXN0YXR1cyA9IHdsYW5faGRkX3RkbHNfc2V0X3BlZXJfY2FwcyhwQWRhcHRlciwgbWFjLAorCQkJCQkJCSAgICAgJlN0YVBhcmFtcywKKwkJCQkJCQkgICAgIGlzQnVmU3RhLAorCQkJCQkJCSAgICAgaXNPZmZDaGFubmVsU3VwcG9ydGVkKTsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgid2xhbl9oZGRfdGRsc19zZXRfcGVlcl9jYXBzIGZhaWxlZCEiKSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCXN0YXR1cyA9CisJCQkJd2xhbl9oZGRfdGRsc19hZGRfc3RhdGlvbih3aXBoeSwgZGV2LCBtYWMsIDEsCisJCQkJCQkJICAmU3RhUGFyYW1zKTsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICAgICAgRkwoIndsYW5faGRkX3RkbHNfYWRkX3N0YXRpb24gZmFpbGVkISIpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorCUVYSVQoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdsYW5faGRkX2NoYW5nZV9zdGF0aW9uKCkgLSBjZmc4MDIxMSBjaGFuZ2Ugc3RhdGlvbiBoYW5kbGVyIGZ1bmN0aW9uCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gdGhlIHdpcGh5IHN0cnVjdHVyZQorICogQGRldjogUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAqIEBtYWM6IGJzc2lkCisgKiBAcGFyYW1zOiBQb2ludGVyIHRvIHN0YXRpb24gcGFyYW1ldGVycworICoKKyAqIFRoaXMgaXMgdGhlIGNmZzgwMjExIGNoYW5nZSBzdGF0aW9uIGhhbmRsZXIgZnVuY3Rpb24gd2hpY2ggaW52b2tlcworICogdGhlIGludGVybmFsIGZ1bmN0aW9uIEBfX3dsYW5faGRkX2NoYW5nZV9zdGF0aW9uIHdpdGgKKyAqIFNTUiBwcm90ZWN0aW9uLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcywgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE2LCAwKSkgfHwgZGVmaW5lZChXSVRIX0JBQ0tQT1JUUykKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2hhbmdlX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIGNvbnN0IHU4ICptYWMsCisJCQkJICAgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQorI2Vsc2UKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2hhbmdlX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIHU4ICptYWMsCisJCQkJICAgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQorI2VuZGlmCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jaGFuZ2Vfc3RhdGlvbih3aXBoeSwgZGV2LCBtYWMsIHBhcmFtcyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBfX3dsYW5faGRkX2NmZzgwMjExX2FkZF9rZXkKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBrZXkgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2FkZF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICAgICAgIHU4IGtleV9pbmRleCwgYm9vbCBwYWlyd2lzZSwKKwkJCQkgICAgICAgY29uc3QgdTggKm1hY19hZGRyLAorCQkJCSAgICAgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKG5kZXYpOworCXRDc3JSb2FtU2V0S2V5IHNldEtleTsKKwlpbnQgc3RhdHVzOworCXVpbnQzMl90IHJvYW1JZCA9IDB4RkY7CisjaWZuZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwl2X0NPTlRFWFRfdCBwX2Nkc19jb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cGNkc19jb250ZXh0OworI2VuZGlmCisJaGRkX2hvc3RhcGRfc3RhdGVfdCAqcEhvc3RhcGRTdGF0ZTsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJaGRkX2FwX2N0eF90ICphcF9jdHggPSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwQWRhcHRlcik7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0FERF9LRVksCisJCQkgcEFkYXB0ZXItPnNlc3Npb25JZCwgcGFyYW1zLT5rZXlfbGVuKSk7CisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIiwgX19mdW5jX18pOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWhkZExvZyhMT0cxLCBGTCgiRGV2aWNlX21vZGUgJXMoJWQpIiksCisJCWhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKworCWlmIChDU1JfTUFYX05VTV9LRVkgPD0ga2V5X2luZGV4KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogSW52YWxpZCBrZXkgaW5kZXggJWQiLAorCQkgICAgICAgX19mdW5jX18sIGtleV9pbmRleCk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKENTUl9NQVhfS0VZX0xFTiA8IHBhcmFtcy0+a2V5X2xlbikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEludmFsaWQga2V5IGxlbmd0aCAlZCIsCisJCSAgICAgICBfX2Z1bmNfXywgcGFyYW1zLT5rZXlfbGVuKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJICAgICAgICIlczogY2FsbGVkIHdpdGgga2V5IGluZGV4ID0gJWQgJiBrZXkgbGVuZ3RoICVkIiwKKwkgICAgICAgX19mdW5jX18sIGtleV9pbmRleCwgcGFyYW1zLT5rZXlfbGVuKTsKKworCS8qZXh0cmFjdCBrZXkgaWR4LCBrZXkgbGVuIGFuZCBrZXkgKi8KKwljZGZfbWVtX3plcm8oJnNldEtleSwgc2l6ZW9mKHRDc3JSb2FtU2V0S2V5KSk7CisJc2V0S2V5LmtleUlkID0ga2V5X2luZGV4OworCXNldEtleS5rZXlMZW5ndGggPSBwYXJhbXMtPmtleV9sZW47CisJY2RmX21lbV9jb3B5KCZzZXRLZXkuS2V5WzBdLCBwYXJhbXMtPmtleSwgcGFyYW1zLT5rZXlfbGVuKTsKKworCXN3aXRjaCAocGFyYW1zLT5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCQlzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKKwkJc2V0S2V5LmVuY1R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKKwl7CisJCXU4ICpwS2V5ID0gJnNldEtleS5LZXlbMF07CisJCXNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDsKKworCQljZGZfbWVtX3plcm8ocEtleSwgQ1NSX01BWF9LRVlfTEVOKTsKKworCQkvKlN1cHBsaWNhbnQgc2VuZHMgdGhlIDMyYnl0ZXMga2V5IGluIHRoaXMgb3JkZXIKKworCQkgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorCQkgfCAgIFRrMSAgICAgICAgfFRYLU1JQyAgICB8ICBSWCBNaWMgIHwKKwkJIHx8fC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKwkJICAgPC0tLTE2Ynl0ZXMtLS0+PC0tOGJ5dGVzLS0+PC0tOGJ5dGVzLS0+CisKKwkJICovCisJCS8qU21lIGV4cGVjdHMgdGhlIDMyIGJ5dGVzIGtleSB0byBiZSBpbiB0aGUgYmVsb3cgb3JkZXIKKworCQkgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorCQkgfCAgIFRrMSAgICAgICAgfFJYLU1JQyAgICB8ICBUWCBNaWMgIHwKKwkJIHx8fC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKwkJICAgPC0tLTE2Ynl0ZXMtLS0+PC0tOGJ5dGVzLS0+PC0tOGJ5dGVzLS0+CisJCSAqLworCQkvKiBDb3B5IHRoZSBUZW1wb3JhbCBLZXkgMSAoVEsxKSAqLworCQljZGZfbWVtX2NvcHkocEtleSwgcGFyYW1zLT5rZXksIDE2KTsKKworCQkvKkNvcHkgdGhlIHJ4IG1pYyBmaXJzdCAqLworCQljZGZfbWVtX2NvcHkoJnBLZXlbMTZdLCAmcGFyYW1zLT5rZXlbMjRdLCA4KTsKKworCQkvKkNvcHkgdGhlIHR4IG1pYyAqLworCQljZGZfbWVtX2NvcHkoJnBLZXlbMjRdLCAmcGFyYW1zLT5rZXlbMTZdLCA4KTsKKworCQlicmVhazsKKwl9CisKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCXNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworCQlicmVhazsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0OgorCXsKKwkJY2RmX21lbV96ZXJvKCZzZXRLZXksIHNpemVvZih0Q3NyUm9hbVNldEtleSkpOworCQl3bGFuX2hkZF9jZmc4MDIxMV9zZXRfa2V5X3dhcGkocEFkYXB0ZXIsIGtleV9pbmRleCwKKwkJCQkJICAgICAgIG1hY19hZGRyLCBwYXJhbXMtPmtleSwKKwkJCQkJICAgICAgIHBhcmFtcy0+a2V5X2xlbik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfS1JLOgorCQlzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0tSSzsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQlRLOgorCQlzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0JUSzsKKwkJYnJlYWs7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUM6CisJCXNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTX0NNQUM7CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHVuc3VwcG9ydGVkIGNpcGhlciB0eXBlICV1IiwKKwkJICAgICAgIF9fZnVuY19fLCBwYXJhbXMtPmNpcGhlcik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELCAiJXM6IGVuY3J5cHRpb24gdHlwZSAlZCIsCisJICAgICAgIF9fZnVuY19fLCBzZXRLZXkuZW5jVHlwZSk7CisKKwlpZiAoIXBhaXJ3aXNlKSB7CisJCS8qIHNldCBncm91cCBrZXkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzLSAlZDogc2V0dGluZyBCcm9hZGNhc3Qga2V5IiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJc2V0S2V5LmtleURpcmVjdGlvbiA9IGVTSVJfUlhfT05MWTsKKwkJY2RmX3NldF9tYWNhZGRyX2Jyb2FkY2FzdCgmc2V0S2V5LnBlZXJNYWMpOworCX0gZWxzZSB7CisJCS8qIHNldCBwYWlyd2lzZSBrZXkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzLSAlZDogc2V0dGluZyBwYWlyd2lzZSBrZXkiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9UWF9SWDsKKwkJY2RmX21lbV9jb3B5KHNldEtleS5wZWVyTWFjLmJ5dGVzLCBtYWNfYWRkciwgQ0RGX01BQ19BRERSX1NJWkUpOworCX0KKwlpZiAoKFdMQU5fSEREX0lCU1MgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSAmJiAhcGFpcndpc2UpIHsKKwkJLyogaWYgYSBrZXkgaXMgYWxyZWFkeSBpbnN0YWxsZWQsIGJsb2NrIGFsbCBzdWJzZXF1ZW50IG9uZXMgKi8KKwkJaWYgKHBBZGFwdGVyLT5zZXNzaW9uQ3R4LnN0YXRpb24uaWJzc19lbmNfa2V5X2luc3RhbGxlZCkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgICAgICAiJXM6IElCU1Mga2V5IGluc3RhbGxlZCBhbHJlYWR5IiwgX19mdW5jX18pOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9UWF9SWDsKKwkJLypTZXQgdGhlIGdyb3VwIGtleSAqLworCQlzdGF0dXMgPSBzbWVfcm9hbV9zZXRfa2V5KFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJICBwQWRhcHRlci0+c2Vzc2lvbklkLCAmc2V0S2V5LCAmcm9hbUlkKTsKKworCQlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBzbWVfcm9hbV9zZXRfa2V5IGZhaWxlZCwgcmV0dXJuZWQgJWQiLAorCQkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLypTYXZlIHRoZSBrZXlzIGhlcmUgYW5kIGNhbGwgc21lX3JvYW1fc2V0X2tleSBmb3Igc2V0dGluZworCQkgICB0aGUgUFRLIGFmdGVyIHBlZXIgam9pbnMgdGhlIElCU1MgbmV0d29yayAqLworCQljZGZfbWVtX2NvcHkoJnBBZGFwdGVyLT5zZXNzaW9uQ3R4LnN0YXRpb24uaWJzc19lbmNfa2V5LAorCQkJICAgICAmc2V0S2V5LCBzaXplb2YodENzclJvYW1TZXRLZXkpKTsKKworCQlwQWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLmlic3NfZW5jX2tleV9pbnN0YWxsZWQgPSAxOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAoKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9TT0ZUQVApIHx8CisJICAgIChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKSkgeworCQlwSG9zdGFwZFN0YXRlID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEFkYXB0ZXIpOworCQlpZiAocEhvc3RhcGRTdGF0ZS0+YnNzU3RhdGUgPT0gQlNTX1NUQVJUKSB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQkJc3RhdHVzID0KKwkJCQl3bGFuc2FwX3NldF9rZXlfc3RhKFdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUgorCQkJCQkJCSAgICAocEFkYXB0ZXIpLCAmc2V0S2V5KTsKKyNlbHNlCisJCQlzdGF0dXMgPSB3bGFuc2FwX3NldF9rZXlfc3RhKHBfY2RzX2NvbnRleHQsICZzZXRLZXkpOworI2VuZGlmCisJCQlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgIlslNGRdIHdsYW5zYXBfc2V0X2tleV9zdGEgcmV0dXJuZWQgRVJST1Igc3RhdHVzPSAlZCIsCisJCQkJCSAgX19MSU5FX18sIHN0YXR1cyk7CisJCQl9CisJCX0KKworCQkvKiBTYXZlIHRoZSBrZXkgaW4gYXAgY3R4IGZvciB1c2Ugb24gU1RBUlRfQkFTUyBhbmQgcmVzdGFydCAqLworCQlpZiAocGFpcndpc2UgfHwKKwkJCWVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWSA9PSBzZXRLZXkuZW5jVHlwZSB8fAorCQkJZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWSA9PSBzZXRLZXkuZW5jVHlwZSkKKwkJCWNkZl9tZW1fY29weSgmYXBfY3R4LT53ZXBLZXlba2V5X2luZGV4XSwgJnNldEtleSwKKwkJCQkgICAgIHNpemVvZih0Q3NyUm9hbVNldEtleSkpOworCQllbHNlCisJCQljZGZfbWVtX2NvcHkoJmFwX2N0eC0+Z3JvdXBLZXksICZzZXRLZXksCisJCQkJICAgICBzaXplb2YodENzclJvYW1TZXRLZXkpKTsKKworCX0gZWxzZSBpZiAoKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKSB8fAorCQkgICAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9DTElFTlQpKSB7CisJCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPQorCQkJV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwkJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPQorCQkJV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwkJaWYgKCFwYWlyd2lzZSkgeworCQkJLyogc2V0IGdyb3VwIGtleSAqLworCQkJaWYgKHBIZGRTdGFDdHgtPnJvYW1faW5mby5kZWZlcktleUNvbXBsZXRlKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICIlcy0gJWQ6IFBlcmZvcm0gU2V0IGtleSBDb21wbGV0ZSIsCisJCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJCQloZGRfcGVyZm9ybV9yb2FtX3NldF9rZXlfY29tcGxldGUocEFkYXB0ZXIpOworCQkJfQorCQl9CisKKwkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy5LZXlMZW5ndGhba2V5X2luZGV4XSA9CisJCQkodTgpIHBhcmFtcy0+a2V5X2xlbjsKKworCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5LZXlzLmRlZmF1bHRJbmRleCA9IGtleV9pbmRleDsKKworCQljZGZfbWVtX2NvcHkoJnBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLktleXMuCisJCQkgICAgIEtleU1hdGVyaWFsW2tleV9pbmRleF1bMF0sIHBhcmFtcy0+a2V5LAorCQkJICAgICBwYXJhbXMtPmtleV9sZW4pOworCisJCXBIZGRTdGFDdHgtPnJvYW1faW5mby5yb2FtaW5nU3RhdGUgPSBIRERfUk9BTV9TVEFURV9TRVRUSU5HX0tFWTsKKworCQloZGRMb2coTE9HMiwKKwkJICAgICAgIEZMKCJTZXQga2V5IGZvciBwZWVyTWFjICJNQUNfQUREUkVTU19TVFIiIGRpcmVjdGlvbiAlZCIpLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkoc2V0S2V5LnBlZXJNYWMuYnl0ZXMpLAorCQkgICAgICAgc2V0S2V5LmtleURpcmVjdGlvbik7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQkvKiBUaGUgc3VwcGxpY2FudCBtYXkgYXR0ZW1wdCB0byBzZXQgdGhlIFBUSyBvbmNlIHByZS1hdXRoZW50aWNhdGlvbgorCQkgICBpcyBkb25lLiBTYXZlIHRoZSBrZXkgaW4gdGhlIFVNQUMgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIEFERCBCU1MKKwkJICAgcmVxdWVzdCAqLworCQljZGZfcmV0X3N0YXR1cyA9IHNtZV9mdF91cGRhdGVfa2V5KFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsICZzZXRLZXkpOworCQlpZiAoY2RmX3JldF9zdGF0dXMgPT0gQ0RGX1NUQVRVU19GVF9QUkVBVVRIX0tFWV9TVUNDRVNTKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJICAgICAgICIlczogVXBkYXRlIFByZUF1dGggS2V5IHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChjZGZfcmV0X3N0YXR1cyA9PSBDREZfU1RBVFVTX0ZUX1BSRUFVVEhfS0VZX0ZBSUxFRCkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICAiJXM6IFVwZGF0ZSBQcmVBdXRoIEtleSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKwkJLyogaXNzdWUgc2V0IGtleSByZXF1ZXN0IHRvIFNNRSAqLworCQlzdGF0dXMgPSBzbWVfcm9hbV9zZXRfa2V5KFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJICBwQWRhcHRlci0+c2Vzc2lvbklkLCAmc2V0S2V5LCAmcm9hbUlkKTsKKworCQlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBzbWVfcm9hbV9zZXRfa2V5IGZhaWxlZCwgcmV0dXJuZWQgJWQiLAorCQkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQkJcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1pbmdTdGF0ZSA9CisJCQkJSEREX1JPQU1fU1RBVEVfTk9ORTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogaW4gY2FzZSBvZiBJQlNTIGFzIHRoZXJlIHdhcyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYWJvdXQgV0VQIGtleXMgZHVyaW5nCisJCSAqIElCU1Mgam9pbiwgZ3JvdXAga2V5IGludGlhbGl6ZWQgd2l0aCBOVUxMIGtleSwgc28gcmUtaW5pdGlhbGl6ZSBncm91cCBrZXkKKwkJICogd2l0aCBjb3JyZWN0IHZhbHVlKi8KKwkJaWYgKChlQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1MgPT0KKwkJICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5CU1NUeXBlKQorCQkgICAgJiYKKwkJICAgICEoKElXX0FVVEhfS0VZX01HTVRfODAyXzFYID09CisJCSAgICAgICAocFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgJiBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkpCisJCSAgICAgICYmIChlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSA9PQorCQkJICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUpCisJCSAgICAgICkKKwkJICAgICYmICgoV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgPT0gcGFyYW1zLT5jaXBoZXIpCisJCQl8fCAoV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0ID09IHBhcmFtcy0+Y2lwaGVyKQorCQkJKQorCQkgICAgKSB7CisJCQlzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9SWF9PTkxZOworCQkJY2RmX3NldF9tYWNhZGRyX2Jyb2FkY2FzdCgmc2V0S2V5LnBlZXJNYWMpOworCisJCQloZGRMb2coTE9HMiwKKwkJCSAgICAgICBGTCgiU2V0IGtleSBwZWVyTWFjICJNQUNfQUREUkVTU19TVFIiIGRpcmVjdGlvbiAlZCIpLAorCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHNldEtleS5wZWVyTWFjLmJ5dGVzKSwKKwkJCSAgICAgICBzZXRLZXkua2V5RGlyZWN0aW9uKTsKKworCQkJc3RhdHVzID0gc21lX3JvYW1fc2V0X2tleShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCQkgIHBBZGFwdGVyLT5zZXNzaW9uSWQsICZzZXRLZXksCisJCQkJCQkgICZyb2FtSWQpOworCisJCQlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgICAgICAiJXM6IHNtZV9yb2FtX3NldF9rZXkgZmFpbGVkIGZvciBncm91cCBrZXkgKElCU1MpLCByZXR1cm5lZCAlZCIsCisJCQkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQkJCXBIZGRTdGFDdHgtPnJvYW1faW5mby5yb2FtaW5nU3RhdGUgPQorCQkJCQlIRERfUk9BTV9TVEFURV9OT05FOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfYWRkX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICAgICB1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsCisJCQkJICAgICBjb25zdCB1OCAqbWFjX2FkZHIsCisJCQkJICAgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQoreworCWludCByZXQ7CisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2FkZF9rZXkod2lwaHksIG5kZXYsIGtleV9pbmRleCwgcGFpcndpc2UsCisJCQkJCSAgbWFjX2FkZHIsIHBhcmFtcyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBfX3dsYW5faGRkX2NmZzgwMjExX2dldF9rZXkKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgdGhlIGtleSBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgICAgICAgdTgga2V5X2luZGV4LCBib29sIHBhaXJ3aXNlLAorCQkJCSAgICAgICBjb25zdCB1OCAqbWFjX2FkZHIsIHZvaWQgKmNvb2tpZSwKKwkJCQkgICAgICAgdm9pZCAoKmNhbGxiYWNrKSh2b2lkICpjb29raWUsCisJCQkJCQkJc3RydWN0IGtleV9wYXJhbXMgKikKKwkJCQkgICAgICAgKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKG5kZXYpOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCXRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlID0gJihwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZSk7CisJc3RydWN0IGtleV9wYXJhbXMgcGFyYW1zOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGRkTG9nKExPRzEsIEZMKCJEZXZpY2VfbW9kZSAlcyglZCkiKSwKKwkJaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhwQWRhcHRlci0+ZGV2aWNlX21vZGUpLAorCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCisJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKworCWlmIChDU1JfTUFYX05VTV9LRVkgPD0ga2V5X2luZGV4KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJpbnZhbGlkIGtleSBpbmRleCAlZCIpLAorCQkgICAgICAga2V5X2luZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChwUm9hbVByb2ZpbGUtPkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdKSB7CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOgorCQlwYXJhbXMuY2lwaGVyID0gSVdfQVVUSF9DSVBIRVJfTk9ORTsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWToKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOgorCQlwYXJhbXMuY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OgorCQlwYXJhbXMuY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OworCQlicmVhazsKKworCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDoKKwkJcGFyYW1zLmNpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA7CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM6CisJCXBhcmFtcy5jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwYXJhbXMuY2lwaGVyID0gSVdfQVVUSF9DSVBIRVJfTk9ORTsKKwkJYnJlYWs7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9HRVRfS0VZLAorCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsIHBhcmFtcy5jaXBoZXIpKTsKKworCXBhcmFtcy5rZXlfbGVuID0gcFJvYW1Qcm9maWxlLT5LZXlzLktleUxlbmd0aFtrZXlfaW5kZXhdOworCXBhcmFtcy5zZXFfbGVuID0gMDsKKwlwYXJhbXMuc2VxID0gTlVMTDsKKwlwYXJhbXMua2V5ID0gJnBSb2FtUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFtrZXlfaW5kZXhdWzBdOworCWNhbGxiYWNrKGNvb2tpZSwgJnBhcmFtcyk7CisKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICAgICB1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsCisJCQkJICAgICBjb25zdCB1OCAqbWFjX2FkZHIsIHZvaWQgKmNvb2tpZSwKKwkJCQkgICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqY29va2llLAorCQkJCQkJICAgICAgc3RydWN0IGtleV9wYXJhbXMgKikKKwkJCQkgICAgICkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2dldF9rZXkod2lwaHksIG5kZXYsIGtleV9pbmRleCwgcGFpcndpc2UsCisJCQkJCSAgbWFjX2FkZHIsIGNvb2tpZSwgY2FsbGJhY2spOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9kZWxfa2V5KCkgLSBEZWxldGUgdGhlIGVuY3J5cHRpb24ga2V5IGZvciBzdGF0aW9uCisgKiBAd2lwaHk6IHdpcGh5IGludGVyZmFjZSBjb250ZXh0CisgKiBAbmRldjogcG9pbnRlciB0byBuZXQgZGV2aWNlCisgKiBAa2V5X2luZGV4OiBLZXkgaW5kZXggdXNlZCBpbiA4MDIuMTEgZnJhbWVzCisgKiBAdW5pY2FzdDogdHJ1ZSBpZiBpdCBpcyB1bmljYXN0IGtleQorICogQG11bHRpY2FzdDogdHJ1ZSBpZiBpdCBpcyBtdWx0aWNhc3Qga2V5CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgY2ZnODAyMTFfb3BzIEFQSS4KKyAqIEl0IGlzIHVzZWQgdG8gZGVsZXRlIHRoZSBrZXkgaW5mb3JtYXRpb24KKyAqIFVuZGVybHlpbmcgaGFyZHdhcmUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGF2ZSBBUEkgdG8gZGVsZXRlIHRoZQorICogZW5jcnlwdGlvbiBrZXkuIEl0IGlzIGF1dG9tYXRpY2FsbHkgZGVsZXRlZCB3aGVuIHRoZSBwZWVyIGlzCisgKiByZW1vdmVkLiBIZW5jZSB0aGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBkb2VzIG5vdGhpbmcuCisgKiBGdXR1cmUgaW1wbGVtZW50YXRpb24gbWF5IGludGVycHJldGUgZGVsZXRlIGtleSBvcGVyYXRpb24gdG8KKyAqIHJlcGxhY2luZyB0aGUga2V5IHdpdGggYSByYW5kb20ganVuayB2YWx1ZSwgZWZmZWN0aXZlbHkgbWFraW5nIGl0CisgKiB1c2VsZXNzLgorICoKKyAqIFJldHVybjogc3RhdHVzIGNvZGUsIGFsd2F5cyAwLgorICovCisKK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9kZWxfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgICAgIHU4IGtleV9pbmRleCwKKwkJCQkgICAgIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkcikKK3sKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZGVsX2tleSgpIC0gY2ZnODAyMTEgZGVsZXRlIGtleSBoYW5kbGVyIGZ1bmN0aW9uCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkgc3RydWN0dXJlLgorICogQGRldjogUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KKyAqIEBrZXlfaW5kZXg6IGtleSBpbmRleAorICogQHBhaXJ3aXNlOiBwYWlyd2lzZQorICogQG1hY19hZGRyOiBtYWMgYWRkcmVzcworICoKKyAqIFRoaXMgaXMgdGhlIGNmZzgwMjExIGRlbGV0ZSBrZXkgaGFuZGxlciBmdW5jdGlvbiB3aGljaCBpbnZva2VzCisgKiB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gQF9fd2xhbl9oZGRfY2ZnODAyMTFfZGVsX2tleSB3aXRoCisgKiBTU1IgcHJvdGVjdGlvbi4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2RlbF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJdTgga2V5X2luZGV4LAorCQkJCQlib29sIHBhaXJ3aXNlLCBjb25zdCB1OCAqbWFjX2FkZHIpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9kZWxfa2V5KHdpcGh5LCBkZXYsIGtleV9pbmRleCwKKwkJCQkJICBwYWlyd2lzZSwgbWFjX2FkZHIpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGVU5DVElPTjogX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfZGVmYXVsdF9rZXkKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQgdHgga2V5IGluZGV4CisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfZGVmYXVsdF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCQkgICAgICAgdTgga2V5X2luZGV4LAorCQkJCQkgICAgICAgYm9vbCB1bmljYXN0LCBib29sIG11bHRpY2FzdCkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihuZGV2KTsKKwloZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJaW50IHN0YXR1czsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0VUX0RFRkFVTFRfS0VZLAorCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsIGtleV9pbmRleCkpOworCisJaGRkTG9nKExPRzEsIEZMKCJEZXZpY2VfbW9kZSAlcyglZCkga2V5X2luZGV4ID0gJWQiKSwKKwkJaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhwQWRhcHRlci0+ZGV2aWNlX21vZGUpLAorCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUsIGtleV9pbmRleCk7CisKKwlpZiAoQ1NSX01BWF9OVU1fS0VZIDw9IGtleV9pbmRleCkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQga2V5IGluZGV4ICVkIiksIGtleV9pbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmICgocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX0lORlJBX1NUQVRJT04pIHx8CisJICAgIChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0NMSUVOVCkpIHsKKwkJaWYgKChlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQICE9CisJCSAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnVjRW5jcnlwdGlvblR5cGUpICYmCisJCSAgICAoZUNTUl9FTkNSWVBUX1RZUEVfQUVTICE9CisJCSAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnVjRW5jcnlwdGlvblR5cGUpKSB7CisJCQkvKiBJZiBkZWZhdWx0IGtleSBpbmRleCBpcyBub3Qgc2FtZSBhcyBwcmV2aW91cyBvbmUsCisJCQkgKiB0aGVuIHVwZGF0ZSB0aGUgZGVmYXVsdCBrZXkgaW5kZXggKi8KKworCQkJdENzclJvYW1TZXRLZXkgc2V0S2V5OworCQkJdWludDMyX3Qgcm9hbUlkID0gMHhGRjsKKwkJCXRDc3JLZXlzICpLZXlzID0gJnBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLktleXM7CisKKwkJCWhkZExvZyhMT0cyLCBGTCgiRGVmYXVsdCB0eCBrZXkgaW5kZXggJWQiKSwga2V5X2luZGV4KTsKKworCQkJS2V5cy0+ZGVmYXVsdEluZGV4ID0gKHU4KSBrZXlfaW5kZXg7CisJCQljZGZfbWVtX3plcm8oJnNldEtleSwgc2l6ZW9mKHRDc3JSb2FtU2V0S2V5KSk7CisJCQlzZXRLZXkua2V5SWQgPSBrZXlfaW5kZXg7CisJCQlzZXRLZXkua2V5TGVuZ3RoID0gS2V5cy0+S2V5TGVuZ3RoW2tleV9pbmRleF07CisKKwkJCWNkZl9tZW1fY29weSgmc2V0S2V5LktleVswXSwKKwkJCQkgICAgICZLZXlzLT5LZXlNYXRlcmlhbFtrZXlfaW5kZXhdWzBdLAorCQkJCSAgICAgS2V5cy0+S2V5TGVuZ3RoW2tleV9pbmRleF0pOworCisJCQlzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9UWF9SWDsKKworCQkJY2RmX2NvcHlfbWFjYWRkcigmc2V0S2V5LnBlZXJNYWMsCisJCQkJCSAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkKTsKKworCQkJaWYgKEtleXMtPktleUxlbmd0aFtrZXlfaW5kZXhdID09IENTUl9XRVA0MF9LRVlfTEVOICYmCisJCQkgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUuCisJCQkgICAgZW5jcnlwdGlvblR5cGVbMF0gPT0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0KSB7CisJCQkJLyogSW4gdGhlIGNhc2Ugb2YgZHluYW1pYyB3ZXAgc3VwcGxpY2FudCBoYXJkY29kZXMgRFdFUCB0eXBlCisJCQkJKiB0byBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQgZXZlbiB0aG91Z2ggYXAgaXMgY29uZmlndXJlZCBmb3IKKwkJCQkqIFdFUC00MCBlbmNyeXB0aW9uLiBJbiB0aGlzIGNhbnNlIHRoZSBrZXkgbGVuZ3RoIGlzIDUgYnV0IHRoZQorCQkJCSogZW5jcnlwdGlvbiB0eXBlIGlzIDEwNCBoZW5jZSBjaGVja2luZyB0aGUga2V5IGxhbmdodCg1KSBhbmQKKwkJCQkqIGVuY3J5cHRpb24gdHlwZSgxMDQpIGFuZCBzd2l0Y2hpbmcgZW5jcnlwdGlvbiB0eXBlIHRvIDQwKi8KKwkJCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS4KKwkJCQllbmNyeXB0aW9uVHlwZVswXSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOworCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm1jRW5jcnlwdGlvblR5cGUuCisJCQkJZW5jcnlwdGlvblR5cGVbMF0gPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDsKKwkJCX0KKworCQkJc2V0S2V5LmVuY1R5cGUgPQorCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLgorCQkJCWVuY3J5cHRpb25UeXBlWzBdOworCisJCQkvKiBJc3N1ZSBzZXQga2V5IHJlcXVlc3QgKi8KKwkJCXN0YXR1cyA9IHNtZV9yb2FtX3NldF9rZXkoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCQkJICBwQWRhcHRlci0+c2Vzc2lvbklkLCAmc2V0S2V5LAorCQkJCQkJICAmcm9hbUlkKTsKKworCQkJaWYgKDAgIT0gc3RhdHVzKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKCJzbWVfcm9hbV9zZXRfa2V5IGZhaWxlZCwgcmV0dXJuZWQgJWQiKSwKKwkJCQkgICAgICAgc3RhdHVzKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoV0xBTl9IRERfU09GVEFQID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQkvKiBJbiBTb2Z0QXAgbW9kZSBzZXR0aW5nIGtleSBkaXJlY3Rpb24gZm9yIGRlZmF1bHQgbW9kZSAqLworCQlpZiAoKGVDU1JfRU5DUllQVF9UWVBFX1RLSVAgIT0KKwkJICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSkKKwkJICAgICYmIChlQ1NSX0VOQ1JZUFRfVFlQRV9BRVMgIT0KKwkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLgorCQkJZW5jcnlwdGlvblR5cGVbMF0pKSB7CisJCQkvKiBTYXZpbmcga2V5IGRpcmVjdGlvbiBmb3IgZGVmYXVsdCBrZXkgaW5kZXggdG8gVFggZGVmYXVsdCAqLworCQkJaGRkX2FwX2N0eF90ICpwQVBDdHggPQorCQkJCVdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBBZGFwdGVyKTsKKwkJCXBBUEN0eC0+d2VwS2V5W2tleV9pbmRleF0ua2V5RGlyZWN0aW9uID0KKwkJCQllU0lSX1RYX0RFRkFVTFQ7CisJCX0KKwl9CisKKwlFWElUKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfZGVmYXVsdF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkJICAgICB1OCBrZXlfaW5kZXgsCisJCQkJCSAgICAgYm9vbCB1bmljYXN0LCBib29sIG11bHRpY2FzdCkKK3sKKwlpbnQgcmV0OworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0KKwkJX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfZGVmYXVsdF9rZXkod2lwaHksIG5kZXYsIGtleV9pbmRleCwgdW5pY2FzdCwKKwkJCQkJCSAgICBtdWx0aWNhc3QpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Jzc19saXN0KCkgLSB1cGRhdGUgYnNzIGxpc3QgdG8gTkw4MDIxMQorICogQHBBZGFwdGVyOiBQb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IFBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKgorICogUmV0dXJuOiBzdHJ1Y3QgY2ZnODAyMTFfYnNzIHBvaW50ZXIKKyAqLworc3RydWN0IGNmZzgwMjExX2JzcyAqd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Jzc19saXN0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkJICAgICAgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwQWRhcHRlci0+ZGV2OworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OworCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MgPSBwUm9hbUluZm8tPnBCc3NEZXNjOworCWludCBjaGFuX25vOworCXVuc2lnbmVkIGludCBmcmVxOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MgPSBOVUxMOworCisJRU5URVIoKTsKKworCWlmIChOVUxMID09IHBCc3NEZXNjKSB7CisJCWhkZExvZyhMT0dFLCBGTCgicEJzc0Rlc2MgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIGJzczsKKwl9CisKKwlpZiAoTlVMTCA9PSBwUm9hbUluZm8tPnBQcm9maWxlKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiUm9hbSBwcm9maWxlIGlzIE5VTEwiKSk7CisJCXJldHVybiBic3M7CisJfQorCisJY2hhbl9ubyA9IHBCc3NEZXNjLT5jaGFubmVsSWQ7CisKKwlpZiAoY2hhbl9ubyA8PSBBUlJBWV9TSVpFKGhkZF9jaGFubmVsc18yXzRfZ2h6KSkgeworCQlmcmVxID0KKwkJCWllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFuX25vLAorCQkJCQkJICAgICAgIElFRUU4MDIxMV9CQU5EXzJHSFopOworCX0gZWxzZSB7CisJCWZyZXEgPQorCQkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5fbm8sCisJCQkJCQkgICAgICAgSUVFRTgwMjExX0JBTkRfNUdIWik7CisJfQorCisJY2hhbiA9IF9faWVlZTgwMjExX2dldF9jaGFubmVsKHdpcGh5LCBmcmVxKTsKKworCWlmICghY2hhbikgeworCQloZGRMb2coTE9HRSwgRkwoImNoYW4gcG9pbnRlciBpcyBOVUxMIikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHdpcGh5LCBjaGFuLCBwQnNzRGVzYy0+YnNzSWQsCisJCQkgICAgICAgJnBSb2FtSW5mby0+cFByb2ZpbGUtPlNTSURzLlNTSURMaXN0LT5TU0lELgorCQkJICAgICAgIHNzSWRbMF0sCisJCQkgICAgICAgcFJvYW1JbmZvLT5wUHJvZmlsZS0+U1NJRHMuU1NJRExpc3QtPlNTSUQubGVuZ3RoLAorCQkJICAgICAgIFdMQU5fQ0FQQUJJTElUWV9FU1MsIFdMQU5fQ0FQQUJJTElUWV9FU1MpOworCWlmIChic3MgPT0gTlVMTCkgeworCQloZGRMb2coTE9HRSwgRkwoIkJTUyBub3QgcHJlc2VudCIpKTsKKwl9IGVsc2UgeworCQloZGRMb2coTE9HMSwgRkwoImNmZzgwMjExX3VubGlua19ic3MgY2FsbGVkIGZvciBCU1NJRCAiCisJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBCc3NEZXNjLT5ic3NJZCkpOworCQljZmc4MDIxMV91bmxpbmtfYnNzKHdpcGh5LCBic3MpOworCX0KKwlyZXR1cm4gYnNzOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUoKSAtIGluZm9ybSBic3MgZGV0YWlscyB0byBOTDgwMjExCisgKiBAcEFkYXB0ZXI6IFBvaW50ZXIgdG8gYWRhcHRlcgorICogQGJzc19kZXNjOiBQb2ludGVyIHRvIGJzcyBkZXNjcmlwdG9yCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluZm9ybSB0aGUgQlNTIGRldGFpbHMgdG8gbmw4MDIxMSBpbnRlcmZhY2UuCisgKgorICogUmV0dXJuOiBzdHJ1Y3QgY2ZnODAyMTFfYnNzIHBvaW50ZXIKKyAqLworc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9ic3MgKgord2xhbl9oZGRfY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICB0U2lyQnNzRGVzY3JpcHRpb24gKmJzc19kZXNjKQoreworCS8qCisJICogY2ZnODAyMTFfaW5mb3JtX2JzcygpIGlzIG5vdCB1cGRhdGluZyBpZSBmaWVsZCBvZiBic3MgZW50cnksIGlmIGVudHJ5CisJICogYWxyZWFkeSBleGlzdHMgaW4gYnNzIGRhdGEgYmFzZSBvZiBjZmc4MDIxMSBmb3IgdGhhdCBwYXJ0aWN1bGFyIEJTUworCSAqIElELiBVc2luZyBjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lIHRvIHVwZGF0ZSB0aGUgYnNzIGVudHJ5IGluc3RlYWQKKwkgKiBvZiBjZmc4MDIxMV9pbmZvcm1fYnNzLCBCdXQgdGhpcyBjYWxsIGV4cGVjdHMgbWdtdCBwYWNrZXQgYXMgaW5wdXQuCisJICogQXMgb2Ygbm93IHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IHRvIGdldCB0aGUgbWdtdChwcm9iZSByZXNwb25zZSkKKwkgKiBmcmFtZSBmcm9tIFBFLCBjb252ZXJ0aW5nIGJzc19kZXNjIHRvIGllZWU4MDIxMV9tZ210KHByb2JlIHJlc3BvbnNlKQorCSAqIGFuZCBwYXNzaW5nIHRvIGNmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUuCisJICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBBZGFwdGVyLT5kZXY7CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7CisJaW50IGNoYW5fbm8gPSBic3NfZGVzYy0+Y2hhbm5lbElkOworI2lmZGVmIFdMQU5fRU5BQkxFX0FHRUlFX09OX1NDQU5fUkVTVUxUUworCXFjb21faWVfYWdlICpxaWVfYWdlID0gTlVMTDsKKwlpbnQgaWVfbGVuZ3RoID0KKwkJR0VUX0lFX0xFTl9JTl9CU1NfREVTQyhic3NfZGVzYy0+bGVuZ3RoKSArIHNpemVvZihxY29tX2llX2FnZSk7CisjZWxzZQorCWludCBpZV9sZW5ndGggPSBHRVRfSUVfTEVOX0lOX0JTU19ERVNDKGJzc19kZXNjLT5sZW5ndGgpOworI2VuZGlmCisJY29uc3QgY2hhciAqaWUgPQorCQkoKGllX2xlbmd0aCAhPSAwKSA/IChjb25zdCBjaGFyICopJmJzc19kZXNjLT5pZUZpZWxkcyA6IE5VTEwpOworCXVuc2lnbmVkIGludCBmcmVxOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSBOVUxMOworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzc19zdGF0dXMgPSBOVUxMOworCXNpemVfdCBmcmFtZV9sZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9tZ210KSArIGllX2xlbmd0aDsKKwlpbnQgcnNzaSA9IDA7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwlpbnQgc3RhdHVzOworI2lmZGVmIENPTkZJR19DTlNTCisJc3RydWN0IHRpbWVzcGVjIHRzOworI2VuZGlmCisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCW1nbXQgPSBremFsbG9jKChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9tZ210KSArIGllX2xlbmd0aCksIEdGUF9LRVJORUwpOworCWlmICghbWdtdCkgeworCQloZGRMb2coTE9HRSwgRkwoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtY3B5KG1nbXQtPmJzc2lkLCBic3NfZGVzYy0+YnNzSWQsIEVUSF9BTEVOKTsKKworI2lmZGVmIENPTkZJR19DTlNTCisJLyogQW5kcm9pZCBkb2VzIG5vdCB3YW50IHRoZSB0aW1lc3RhbXAgZnJvbSB0aGUgZnJhbWUuCisJICAgSW5zdGVhZCBpdCB3YW50cyBhIG1vbm90b25pYyBpbmNyZWFzaW5nIHZhbHVlICovCisJY25zc19nZXRfbW9ub3RvbmljX2Jvb3R0aW1lKCZ0cyk7CisJbWdtdC0+dS5wcm9iZV9yZXNwLnRpbWVzdGFtcCA9CisJCSgodTY0KSB0cy50dl9zZWMgKiAxMDAwMDAwKSArICh0cy50dl9uc2VjIC8gMTAwMCk7CisjZWxzZQorCS8qIGtlZXAgb2xkIGJlaGF2aW9yIGZvciBub24tb3BlbiBzb3VyY2UgKGZvciBub3cpICovCisJbWVtY3B5KCZtZ210LT51LnByb2JlX3Jlc3AudGltZXN0YW1wLCBic3NfZGVzYy0+dGltZVN0YW1wLAorCSAgICAgICBzaXplb2YoYnNzX2Rlc2MtPnRpbWVTdGFtcCkpOworCisjZW5kaWYKKworCW1nbXQtPnUucHJvYmVfcmVzcC5iZWFjb25faW50ID0gYnNzX2Rlc2MtPmJlYWNvbkludGVydmFsOworCW1nbXQtPnUucHJvYmVfcmVzcC5jYXBhYl9pbmZvID0gYnNzX2Rlc2MtPmNhcGFiaWxpdHlJbmZvOworCisjaWZkZWYgV0xBTl9FTkFCTEVfQUdFSUVfT05fU0NBTl9SRVNVTFRTCisJLyogR1BTIFJlcXVpcmVtZW50OiBuZWVkIGFnZSBpZSBwZXIgZW50cnkuIFVzaW5nIHZlbmRvciBzcGVjaWZpYy4gKi8KKwkvKiBBc3N1bWluZyB0aGlzIGlzIHRoZSBsYXN0IElFLCBjb3B5IGF0IHRoZSBlbmQgKi8KKwlpZV9sZW5ndGggLT0gc2l6ZW9mKHFjb21faWVfYWdlKTsKKwlxaWVfYWdlID0gKHFjb21faWVfYWdlICopIChtZ210LT51LnByb2JlX3Jlc3AudmFyaWFibGUgKyBpZV9sZW5ndGgpOworCXFpZV9hZ2UtPmVsZW1lbnRfaWQgPSBRQ09NX1ZFTkRPUl9JRV9JRDsKKwlxaWVfYWdlLT5sZW4gPSBRQ09NX1ZFTkRPUl9JRV9BR0VfTEVOOworCXFpZV9hZ2UtPm91aV8xID0gUUNPTV9PVUkxOworCXFpZV9hZ2UtPm91aV8yID0gUUNPTV9PVUkyOworCXFpZV9hZ2UtPm91aV8zID0gUUNPTV9PVUkzOworCXFpZV9hZ2UtPnR5cGUgPSBRQ09NX1ZFTkRPUl9JRV9BR0VfVFlQRTsKKwlxaWVfYWdlLT5hZ2UgPQorCQljZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpIC0gYnNzX2Rlc2MtPm5SZWNlaXZlZFRpbWU7CisJcWllX2FnZS0+dHNmX2RlbHRhID0gYnNzX2Rlc2MtPnRzZl9kZWx0YTsKKyNlbmRpZgorCisJbWVtY3B5KG1nbXQtPnUucHJvYmVfcmVzcC52YXJpYWJsZSwgaWUsIGllX2xlbmd0aCk7CisJaWYgKGJzc19kZXNjLT5mUHJvYmVSc3ApIHsKKwkJbWdtdC0+ZnJhbWVfY29udHJvbCB8PQorCQkJKHUxNikgKElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApOworCX0gZWxzZSB7CisJCW1nbXQtPmZyYW1lX2NvbnRyb2wgfD0KKwkJCSh1MTYpIChJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOworCX0KKworCWlmIChjaGFuX25vIDw9IEFSUkFZX1NJWkUoaGRkX2NoYW5uZWxzXzJfNF9naHopICYmCisJICAgICh3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gIT0gTlVMTCkpIHsKKwkJZnJlcSA9CisJCQlpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbl9ubywKKwkJCQkJCSAgICAgICBJRUVFODAyMTFfQkFORF8yR0haKTsKKwl9IGVsc2UgaWYgKChjaGFuX25vID4gQVJSQVlfU0laRShoZGRfY2hhbm5lbHNfMl80X2doeikpCisJCSAgICYmICh3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gIT0gTlVMTCkpIHsKKwkJZnJlcSA9CisJCQlpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbl9ubywKKwkJCQkJCSAgICAgICBJRUVFODAyMTFfQkFORF81R0haKTsKKwl9IGVsc2UgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgY2hhbl9ubyAlZCIpLCBjaGFuX25vKTsKKwkJa2ZyZWUobWdtdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWNoYW4gPSBfX2llZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwgZnJlcSk7CisJLyogV2hlbiB0aGUgYmFuZCBpcyBjaGFuZ2VkIG9uIHRoZSBmbHkgdXNpbmcgdGhlIEdVSSwgdGhyZWUgdGhpbmdzIGFyZSBkb25lCisJICogMS4gc2NhbiBhYm9ydAorCSAqIDIuIGZsdXNoIHNjYW4gcmVzdWx0cyBmcm9tIGNhY2hlCisJICogMy4gdXBkYXRlIHRoZSBiYW5kIHdpdGggdGhlIG5ldyBiYW5kIHVzZXIgc3BlY2lmaWVkIChyZWZlciB0byB0aGUKKwkgKiBoZGRfc2V0X2JhbmRfaGVscGVyIGZ1bmN0aW9uKSBhcyBwYXJ0IG9mIHRoZSBzY2FuIGFib3J0LCBtZXNzYWdlIHdpbGwgYmUKKwkgKiBxdWV1ZWQgdG8gUEUgYW5kIHdlIHByb2NlZWQgd2l0aCBmbHVzaGluZyBhbmQgY2hhbmdpbmggdGhlIGJhbmQuCisJICogUEUgd2lsbCBzdG9wIHRoZSBzY2FubmluZyBmdXJ0aGVyIGFuZCByZXBvcnQgYmFjayB0aGUgcmVzdWx0cyB3aGF0IGV2ZXIKKwkgKiBpdCBoYWQgdGlsbCBub3cgYnkgY2FsbGluZyB0aGUgY2FsbCBiYWNrIGZ1bmN0aW9uLgorCSAqIGlmIHRoZSB0aW1lIGJldHdlZW4gdXBkYXRlIGJhbmQgYW5kIHNjYW5kb25lIGNhbGwgYmFjayBpcyBzdWZmaWNpZW50CisJICogZW5vdWdoIHRoZSBiYW5kIGNoYW5nZSByZWZsZWN0cyBpbiBTTUUsIFNNRSB2YWxpZGF0ZXMgdGhlIGNoYW5uZWxzCisJICogYW5kIGRpc2NhcmRzIHRoZSBjaGFubmVscyBjb3JyZXBvbmRpbmcgdG8gcHJldmlvdXMgYmFuZCBhbmQgY2FsbHMgYmFjaworCSAqIHdpdGggemVybyBic3MgcmVzdWx0cy4gYnV0IGlmIHRoZSB0aW1lIGJldHdlZW4gYmFuZCB1cGRhdGUgYW5kIHNjYW4gZG9uZQorCSAqIGNhbGxiYWNrIGlzIHZlcnkgc21hbGwgdGhlbiBiYW5kIGNoYW5nZSB3aWxsIG5vdCByZWZsZWN0IGluIFNNRSBhbmQgU01FCisJICogcmVwb3J0cyB0byBIREQgYWxsIHRoZSBjaGFubmVscyBjb3JyZXBvbmRpbmcgdG8gcHJldmlvdXMgYmFuZC50aGlzIGlzIGR1ZQorCSAqIHRvIHJhY2UgY29uZGl0aW9uLmJ1dCB0aG9zZSBjaGFubmVscyBhcmUgaW52YWxpZCB0byB0aGUgbmV3IGJhbmQgYW5kIHNvCisJICogdGhpcyBmdW5jdGlvbiBfX2llZWU4MDIxMV9nZXRfY2hhbm5lbCB3aWxsIHJldHVybiBOVUxMLkVhY2ggdGltZSB3ZQorCSAqIHJlcG9ydCBzY2FuIHJlc3VsdCB3aXRoIHRoaXMgcG9pbnRlciBudWxsIHdhcm5pbmcga2VybmVsIHRyYWNlIGlzIHByaW50ZWQuCisJICogaWYgdGhlIHNjYW4gcmVzdWx0cyBjb250YWluIGxhcmdlIG51bWJlciBvZiBBUHMgY29udGludW9zbHkga2VybmVsCisJICogd2FybmluZyB0cmFjZSBpcyBwcmludGVkIGFuZCBpdCB3aWxsIGxlYWQgdG8gYXBwcyB3YXRjaCBkb2cgYmFyay4KKwkgKiBTbyBkcm9wIHRoZSBic3MgYW5kIGNvbnRpbnVlIHRvIG5leHQgYnNzLgorCSAqLworCWlmIChjaGFuID09IE5VTEwpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjaGFuIHBvaW50ZXIgaXMgTlVMTCIpKTsKKwkJa2ZyZWUobWdtdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFN1cHBsaWNhbnQgdGFrZXMgdGhlIHNpZ25hbCBzdHJlbmd0aCBpbiB0ZXJtcyBvZiBtQm0oMTAwKmRCbSkgKi8KKwlyc3NpID0gKENERl9NSU4oKGJzc19kZXNjLT5yc3NpICsgYnNzX2Rlc2MtPnNpbnIpLCAwKSkgKiAxMDA7CisKKwloZGRMb2coTE9HMSwgRkwoIkJTU0lEOiAiIE1BQ19BRERSRVNTX1NUUiAiIENoYW5uZWw6JWQgUlNTSTolZCIpLAorCSAgICAgICBNQUNfQUREUl9BUlJBWShtZ210LT5ic3NpZCksIGNoYW4tPmNlbnRlcl9mcmVxLAorCSAgICAgICAoaW50KShyc3NpIC8gMTAwKSk7CisKKwlic3Nfc3RhdHVzID0KKwkJY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZSh3aXBoeSwgY2hhbiwgbWdtdCwgZnJhbWVfbGVuLCByc3NpLAorCQkJCQkgIEdGUF9LRVJORUwpOworCWtmcmVlKG1nbXQpOworCXJldHVybiBic3Nfc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9ic3NfZGIoKSAtIHVwZGF0ZSBic3MgZGF0YWJhc2Ugb2YgQ0Y4MDIxMQorICogQHBBZGFwdGVyOiBQb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IFBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgQlNTIGRhdGEgYmFzZSBvZiBDRkc4MDExCisgKgorICogUmV0dXJuOiBzdHJ1Y3QgY2ZnODAyMTFfYnNzIHBvaW50ZXIKKyAqLworc3RydWN0IGNmZzgwMjExX2JzcyAqd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Jzc19kYihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJCSAgICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8pCit7CisJdENzclJvYW1Db25uZWN0ZWRQcm9maWxlIHJvYW1Qcm9maWxlOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MgPSBOVUxMOworCisJRU5URVIoKTsKKworCW1lbXNldCgmcm9hbVByb2ZpbGUsIDAsIHNpemVvZih0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUpKTsKKwlzbWVfcm9hbV9nZXRfY29ubmVjdF9wcm9maWxlKGhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsICZyb2FtUHJvZmlsZSk7CisKKwlpZiAoTlVMTCAhPSByb2FtUHJvZmlsZS5wQnNzRGVzYykgeworCQlic3MgPSB3bGFuX2hkZF9jZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lKHBBZGFwdGVyLAorCQkJCQkJCSByb2FtUHJvZmlsZS5wQnNzRGVzYyk7CisKKwkJaWYgKE5VTEwgPT0gYnNzKQorCQkJaGRkTG9nKExPRzEsCisJCQkJRkwoIndsYW5faGRkX2NmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUgcmV0dXJuZWQgTlVMTCIpKTsKKworCQlzbWVfcm9hbV9mcmVlX2Nvbm5lY3RfcHJvZmlsZShoSGFsLCAmcm9hbVByb2ZpbGUpOworCX0gZWxzZSB7CisJCWhkZExvZyhMT0dFLCBGTCgicm9hbVByb2ZpbGUucEJzc0Rlc2MgaXMgTlVMTCIpKTsKKwl9CisJRVhJVCgpOworCXJldHVybiBic3M7Cit9CisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9ic3MoKSAtIHVwZGF0ZSBic3MKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQHBBZGFwdGVyOiBQb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBzY2FuX3RpbWU6IHNjYW4gcmVxdWVzdCB0aW1lc3RhbXAKKyAqCisgKiBSZXR1cm46IHplcm8gaWYgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSB1aW50MzJfdCBzY2FuX3RpbWUpCit7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCXRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQ7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSAwOworCXRTY2FuUmVzdWx0SGFuZGxlIHBSZXN1bHQ7CisJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzX3N0YXR1cyA9IE5VTEw7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfVVBEQVRFX0JTUywKKwkJCSBOT19TRVNTSU9OLCBwQWRhcHRlci0+c2Vzc2lvbklkKSk7CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc3RhcnQgZ2V0dGluZyBzY2FuIHJlc3VsdHMgYW5kIHBvcHVsYXRlIGNnZjgwMjExIEJTUyBkYXRhYmFzZSAqLworCXN0YXR1cyA9IHNtZV9zY2FuX2dldF9yZXN1bHQoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwgTlVMTCwgJnBSZXN1bHQpOworCisJLyogbm8gc2NhbiByZXN1bHRzICovCisJaWYgKE5VTEwgPT0gcFJlc3VsdCkgeworCQloZGRMb2coTE9HRSwgRkwoIk5vIHNjYW4gcmVzdWx0IFN0YXR1cyAlZCIpLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXBTY2FuUmVzdWx0ID0gc21lX3NjYW5fcmVzdWx0X2dldF9maXJzdChoSGFsLCBwUmVzdWx0KTsKKworCXdoaWxlIChwU2NhblJlc3VsdCkgeworCQkvKgorCQkgKiAtIGNmZzgwMjExX2luZm9ybV9ic3MoKSBpcyBub3QgdXBkYXRpbmcgaWUgZmllbGQgb2YgYnNzCisJCSAqIGVudHJ5IGlmIGVudHJ5IGFscmVhZHkgZXhpc3RzIGluIGJzcyBkYXRhIGJhc2Ugb2YgY2ZnODAyMTEKKwkJICogZm9yIHRoYXQgcGFydGljdWxhciBCU1MgSUQuICBVc2luZyBjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lCisJCSAqIHRvIHVwZGF0ZSB0aGVic3MgZW50cnkgaW5zdGVhZCBvZiBjZmc4MDIxMV9pbmZvcm1fYnNzLAorCQkgKiBCdXQgdGhpcyBjYWxsIGV4cGVjdHMgbWdtdCBwYWNrZXQgYXMgaW5wdXQuIEFzIG9mIG5vdworCQkgKiB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eSB0byBnZXQgdGhlIG1nbXQocHJvYmUgcmVzcG9uc2UpCisJCSAqIGZyYW1lIGZyb20gUEUsIGNvbnZlcnRpbmcgYnNzX2Rlc2MgdG8KKwkJICogaWVlZTgwMjExX21nbXQocHJvYmUgcmVzcG9uc2UpIGFuZCBwYXNzaW5nIHRvIGMKKwkJICogZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lLgorCQkgKiAtIFVwZGF0ZSBCU1Mgb25seSBpZiBiZWFjb24gdGltZXN0YW1wIGlzIGxhdGVyIHRoYW4KKwkJICogc2NhbiByZXF1ZXN0IHRpbWVzdGFtcC4KKwkJICovCisJCWlmICgoc2Nhbl90aW1lID09IDApIHx8CisJCQkoc2Nhbl90aW1lIDwKKwkJCQlwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5uUmVjZWl2ZWRUaW1lKSkgeworCQkJYnNzX3N0YXR1cyA9CisJCQkJd2xhbl9oZGRfY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZShwQWRhcHRlciwKKwkJCQkJCSZwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvcik7CisKKwkJCWlmIChOVUxMID09IGJzc19zdGF0dXMpIHsKKwkJCQloZGRfaW5mbygiTlVMTCByZXR1cm5lZCBieSBjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lIik7CisJCQl9IGVsc2UgeworCQkJCWNmZzgwMjExX3B1dF9ic3MoCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA5LCAwKSkKKwkJCQkJd2lwaHksCisjZW5kaWYKKwkJCQkJYnNzX3N0YXR1cyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQloZGRfaW5mbygiQlNTSUQ6ICIgTUFDX0FERFJFU1NfU1RSICIgU2tpcHBlZCIsCisJCQlNQUNfQUREUl9BUlJBWShwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5ic3NJZCkpOworCQl9CisJCXBTY2FuUmVzdWx0ID0gc21lX3NjYW5fcmVzdWx0X2dldF9uZXh0KGhIYWwsIHBSZXN1bHQpOworCX0KKworCXNtZV9zY2FuX3Jlc3VsdF9wdXJnZShoSGFsLCBwUmVzdWx0KTsKKwkvKgorCSAqIEZvciBTQVAgbW9kZSwgc2NhbiBpcyBpbnZva2VkIGJ5IGhvc3RhcGQgZHVyaW5nIFNBUCBzdGFydAorCSAqIGlmIGhvc3RhcGQgaXMgcmVzdGFydGVkLCB3ZSBuZWVkIHRvIGZsdXNoIHByZXZpb3VzIHNjYW4KKwkgKiByZXN1bHQgc28gdGhhdCBpdCB3aWxsIHJlZmxlY3QgZW52aXJvbm1lbnQgY2hhbmdlCisJICovCisJaWYgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9TT0ZUQVAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVBfQVBfQUNTX09QVElNSVpFCisJCSYmIHBIZGRDdHgtPnNraXBfYWNzX3NjYW5fc3RhdHVzICE9IGVTQVBfU0tJUF9BQ1NfU0NBTgorI2VuZGlmCisJKQorCQlzbWVfc2Nhbl9mbHVzaF9yZXN1bHQoaEhhbCk7CisKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpICYmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNCwgMCkpCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3Bta3NhX2NhbmRpZGF0ZV9ub3RpZnkoKSAtIG5vdGlmeSBhIG5ldyBQTVNLQSBjYW5kaWRhdGUKKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBhZGFwdGVyCisgKiBAcFJvYW1JbmZvOiBQb2ludGVyIHRvIHJvYW0gaW5mbworICogQGluZGV4OiBJbmRleAorICogQHByZWF1dGg6IFByZWF1dGggZmxhZworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBub3RpZnkgdGhlIHN1cHBsaWNhbnQgb2YgYSBuZXcgUE1LU0EgY2FuZGlkYXRlLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3Bta3NhX2NhbmRpZGF0ZV9ub3RpZnkoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCSAgICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8sCisJCQkJCSAgICAgaW50IGluZGV4LCBib29sIHByZWF1dGgpCit7CisjaWZkZWYgRkVBVFVSRV9XTEFOX09LQworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwQWRhcHRlci0+ZGV2OworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKSBwQWRhcHRlci0+cEhkZEN0eDsKKworCUVOVEVSKCk7CisJaGRkTG9nKExPRzEsIEZMKCJpcyBnb2luZyB0byBub3RpZnkgc3VwcGxpY2FudCBvZjoiKSk7CisKKwlpZiAoTlVMTCA9PSBwUm9hbUluZm8pIHsKKwkJaGRkTG9nKExPR1AsIEZMKCJwUm9hbUluZm8gaXMgTlVMTCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRydWUgPT0gaGRkX2lzX29rY19tb2RlX2VuYWJsZWQocEhkZEN0eCkpIHsKKwkJaGRkTG9nKExPRzEsIE1BQ19BRERSRVNTX1NUUiwKKwkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBSb2FtSW5mby0+YnNzaWQuYnl0ZXMpKTsKKwkJY2ZnODAyMTFfcG1rc2FfY2FuZGlkYXRlX25vdGlmeShkZXYsIGluZGV4LAorCQkJCQkJcFJvYW1JbmZvLT5ic3NpZC5ieXRlcywKKwkJCQkJCXByZWF1dGgsIEdGUF9LRVJORUwpOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fT0tDICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0xGUiAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUl9NRVRSSUNTCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3JvYW1fbWV0cmljc19wcmVhdXRoKCkgLSByb2FtIG1ldHJpY3MgcHJlYXV0aAorICogQHBBZGFwdGVyOiBQb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBwUm9hbUluZm86IFBvaW50ZXIgdG8gcm9hbSBpbmZvCisgKgorICogODAyLjExci9MRlIgbWV0cmljcyByZXBvcnRpbmcgZnVuY3Rpb24gdG8gcmVwb3J0IHByZWF1dGggaW5pdGlhdGlvbgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCisjZGVmaW5lIE1BWF9MRlJfTUVUUklDU19FVkVOVF9MRU5HVEggMTAwCitDREZfU1RBVFVTIHdsYW5faGRkX2NmZzgwMjExX3JvYW1fbWV0cmljc19wcmVhdXRoKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkJICB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIG1ldHJpY3Nfbm90aWZpY2F0aW9uW01BWF9MRlJfTUVUUklDU19FVkVOVF9MRU5HVEggKyAxXTsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisKKwlFTlRFUigpOworCisJaWYgKE5VTEwgPT0gcEFkYXB0ZXIpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwQWRhcHRlciBpcyBOVUxMISIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIGNyZWF0ZSB0aGUgZXZlbnQgKi8KKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJbWVtc2V0KG1ldHJpY3Nfbm90aWZpY2F0aW9uLCAwLCBzaXplb2YobWV0cmljc19ub3RpZmljYXRpb24pKTsKKworCXdycXUuZGF0YS5wb2ludGVyID0gbWV0cmljc19ub3RpZmljYXRpb247CisJd3JxdS5kYXRhLmxlbmd0aCA9IHNjbnByaW50ZihtZXRyaWNzX25vdGlmaWNhdGlvbiwKKwkJCQkgICAgIHNpemVvZihtZXRyaWNzX25vdGlmaWNhdGlvbiksCisJCQkJICAgICAiUUNPTTogTEZSX1BSRUFVVEhfSU5JVCAiIE1BQ19BRERSRVNTX1NUUiwKKwkJCQkgICAgIE1BQ19BRERSX0FSUkFZKHBSb2FtSW5mby0+YnNzaWQpKTsKKworCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsCisJCQkgICAgbWV0cmljc19ub3RpZmljYXRpb24pOworCisJRVhJVCgpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9yb2FtX21ldHJpY3NfaGFuZG92ZXIoKSAtIHJvYW0gbWV0cmljcyBoYW5kIG92ZXIKKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBhZGFwdGVyCisgKiBAcFJvYW1JbmZvOiBQb2ludGVyIHRvIHJvYW0gaW5mbworICogQHByZWF1dGhfc3RhdHVzOiBQcmVhdXRoIHN0YXR1cworICoKKyAqIDgwMi4xMXIvTEZSIG1ldHJpY3MgcmVwb3J0aW5nIGZ1bmN0aW9uIHRvIHJlcG9ydCBoYW5kb3ZlciBpbml0aWF0aW9uCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMKK3dsYW5faGRkX2NmZzgwMjExX3JvYW1fbWV0cmljc19wcmVhdXRoX3N0YXR1cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJICAgICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8sCisJCQkJCSAgICAgIGJvb2wgcHJlYXV0aF9zdGF0dXMpCit7CisJdW5zaWduZWQgY2hhciBtZXRyaWNzX25vdGlmaWNhdGlvbltNQVhfTEZSX01FVFJJQ1NfRVZFTlRfTEVOR1RIICsgMV07CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCisJRU5URVIoKTsKKworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCWhkZExvZyhMT0dFLCBGTCgicEFkYXB0ZXIgaXMgTlVMTCEiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwkvKiBjcmVhdGUgdGhlIGV2ZW50ICovCisJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCW1lbXNldChtZXRyaWNzX25vdGlmaWNhdGlvbiwgMCwgc2l6ZW9mKG1ldHJpY3Nfbm90aWZpY2F0aW9uKSk7CisKKwlzY25wcmludGYobWV0cmljc19ub3RpZmljYXRpb24sIHNpemVvZihtZXRyaWNzX25vdGlmaWNhdGlvbiksCisJCSAgIlFDT006IExGUl9QUkVBVVRIX1NUQVRVUyAiIE1BQ19BRERSRVNTX1NUUiwKKwkJICBNQUNfQUREUl9BUlJBWShwUm9hbUluZm8tPmJzc2lkKSk7CisKKwlpZiAoMSA9PSBwcmVhdXRoX3N0YXR1cykKKwkJc3RybGNhdChtZXRyaWNzX25vdGlmaWNhdGlvbiwgIiB0cnVlIiwKKwkJCQlzaXplb2YobWV0cmljc19ub3RpZmljYXRpb24pKTsKKwllbHNlCisJCXN0cmxjYXQobWV0cmljc19ub3RpZmljYXRpb24sICIgZmFsc2UiLAorCQkJCXNpemVvZihtZXRyaWNzX25vdGlmaWNhdGlvbikpOworCisJd3JxdS5kYXRhLnBvaW50ZXIgPSBtZXRyaWNzX25vdGlmaWNhdGlvbjsKKwl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKG1ldHJpY3Nfbm90aWZpY2F0aW9uKTsKKworCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsCisJCQkgICAgbWV0cmljc19ub3RpZmljYXRpb24pOworCisJRVhJVCgpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9yb2FtX21ldHJpY3NfaGFuZG92ZXIoKSAtIHJvYW0gbWV0cmljcyBoYW5kIG92ZXIKKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBhZGFwdGVyCisgKiBAcFJvYW1JbmZvOiBQb2ludGVyIHRvIHJvYW0gaW5mbworICoKKyAqIDgwMi4xMXIvTEZSIG1ldHJpY3MgcmVwb3J0aW5nIGZ1bmN0aW9uIHRvIHJlcG9ydCBoYW5kb3ZlciBpbml0aWF0aW9uCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd2xhbl9oZGRfY2ZnODAyMTFfcm9hbV9tZXRyaWNzX2hhbmRvdmVyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkJICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8pCit7CisJdW5zaWduZWQgY2hhciBtZXRyaWNzX25vdGlmaWNhdGlvbltNQVhfTEZSX01FVFJJQ1NfRVZFTlRfTEVOR1RIICsgMV07CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCisJRU5URVIoKTsKKworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCWhkZExvZyhMT0dFLCBGTCgicEFkYXB0ZXIgaXMgTlVMTCEiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwkvKiBjcmVhdGUgdGhlIGV2ZW50ICovCisJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCW1lbXNldChtZXRyaWNzX25vdGlmaWNhdGlvbiwgMCwgc2l6ZW9mKG1ldHJpY3Nfbm90aWZpY2F0aW9uKSk7CisKKwl3cnF1LmRhdGEucG9pbnRlciA9IG1ldHJpY3Nfbm90aWZpY2F0aW9uOworCXdycXUuZGF0YS5sZW5ndGggPSBzY25wcmludGYobWV0cmljc19ub3RpZmljYXRpb24sCisJCQkJICAgICBzaXplb2YobWV0cmljc19ub3RpZmljYXRpb24pLAorCQkJCSAgICAgIlFDT006IExGUl9QUkVBVVRIX0hBTkRPVkVSICIKKwkJCQkgICAgIE1BQ19BRERSRVNTX1NUUiwKKwkJCQkgICAgIE1BQ19BRERSX0FSUkFZKHBSb2FtSW5mby0+YnNzaWQpKTsKKworCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsCisJCQkgICAgbWV0cmljc19ub3RpZmljYXRpb24pOworCisJRVhJVCgpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisvKioKKyAqIGhkZF9zZWxlY3RfY2Jtb2RlKCkgLSBzZWxlY3QgY2hhbm5lbCBib25kaW5nIG1vZGUKKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBhZGFwdGVyCisgKiBAb3BlcmF0aW5nQ2hhbm5lbDogT3BlcmF0aW5nIGNoYW5uZWwKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfc2VsZWN0X2NibW9kZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdWludDhfdCBvcGVyYXRpb25DaGFubmVsKQoreworCXVpbnQ4X3QgaW5pRG90MTFNb2RlID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5kb3QxMU1vZGU7CisJZUhkZERvdDExTW9kZSBoZGREb3QxMU1vZGUgPSBpbmlEb3QxMU1vZGU7CisJY2hhbl9wYXJhbXNfdCBjaF9wYXJhbXM7CisJY2hfcGFyYW1zLmNoX3dpZHRoID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+dmh0Q2hhbm5lbFdpZHRoOworCisJaGRkTG9nKExPRzEsIEZMKCJDaGFubmVsIEJvbmRpbmcgTW9kZSBTZWxlY3RlZCBpcyAldSIpLCBpbmlEb3QxMU1vZGUpOworCXN3aXRjaCAoaW5pRG90MTFNb2RlKSB7CisJY2FzZSBlSEREX0RPVDExX01PREVfQVVUTzoKKwljYXNlIGVIRERfRE9UMTFfTU9ERV8xMWFjOgorCWNhc2UgZUhERF9ET1QxMV9NT0RFXzExYWNfT05MWToKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQlpZiAoc21lX2lzX2ZlYXR1cmVfc3VwcG9ydGVkX2J5X2Z3KERPVDExQUMpKQorCQkJaGRkRG90MTFNb2RlID0gZUhERF9ET1QxMV9NT0RFXzExYWM7CisJCWVsc2UKKwkJCWhkZERvdDExTW9kZSA9IGVIRERfRE9UMTFfTU9ERV8xMW47CisjZWxzZQorCQloZGREb3QxMU1vZGUgPSBlSEREX0RPVDExX01PREVfMTFuOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgZUhERF9ET1QxMV9NT0RFXzExbjoKKwljYXNlIGVIRERfRE9UMTFfTU9ERV8xMW5fT05MWToKKwkJaGRkRG90MTFNb2RlID0gZUhERF9ET1QxMV9NT0RFXzExbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaGRkRG90MTFNb2RlID0gaW5pRG90MTFNb2RlOworCQlicmVhazsKKwl9CisJLyogVGhpcyBjYWxsIGRlY2lkZXMgcmVxdWlyZWQgY2hhbm5lbCBib25kaW5nIG1vZGUgKi8KKwlzbWVfc2V0X2NoX3BhcmFtcygoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlciktPmhIYWwpLAorCQkJCWhkZF9jZmdfeGxhdGVfdG9fY3NyX3BoeV9tb2RlKGhkZERvdDExTW9kZSksCisJCQkJb3BlcmF0aW9uQ2hhbm5lbCwgMCwKKwkJCQkmY2hfcGFyYW1zKTsKK30KKworCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX2Nvbm5lY3Rfc3RhcnQKKyAqIHdsYW5faGRkX2NmZzgwMjExX2Nvbm5lY3Rfc3RhcnQoKSAtIHN0YXJ0IGNvbm5lY3Rpb24KKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBhZGFwdGVyCisgKiBAc3NpZDogUG9pbnRlciBvdCBzc2lkCisgKiBAc3NpZF9sZW46IExlbmd0aCBvZiBzc2lkCisgKiBAYnNzaWQ6IFBvaW50ZXIgdG8gYnNzaWQKKyAqIEBvcGVyYXRpbmdDaGFubmVsOiBPcGVyYXRpbmcgY2hhbm5lbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCB0aGUgYXNzb2NpYXRpb24gcHJvY2VzcworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX2Nvbm5lY3Rfc3RhcnQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgIGNvbnN0IHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4sCisJCQkJICAgIGNvbnN0IHU4ICpic3NpZF9oaW50LCBjb25zdCB1OCAqYnNzaWQsCisJCQkJICAgIHU4IG9wZXJhdGluZ0NoYW5uZWwpCit7CisJaW50IHN0YXR1cyA9IDA7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCXVpbnQzMl90IHJvYW1JZDsKKwl0Q3NyUm9hbVByb2ZpbGUgKnBSb2FtUHJvZmlsZTsKKwllQ3NyQXV0aFR5cGUgUlNOQXV0aFR5cGU7CisJdFNtZUNvbmZpZ1BhcmFtcyAqc21lX2NvbmZpZzsKKworCUVOVEVSKCk7CisKKwlwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmIChzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkISIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoU0lSX01BQ19NQVhfU1NJRF9MRU5HVEggPCBzc2lkX2xlbikgeworCQloZGRMb2coTE9HRSwgRkwoIndyb25nIFNTSUQgbGVuIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisKKwlpZiAocFJvYW1Qcm9maWxlKSB7CisJCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4OworCQlwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwkJaWYgKEhERF9XTU1fVVNFUl9NT0RFX05PX1FPUyA9PQorCQkgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5XbW1Nb2RlKSB7CisJCQkvKlFvUyBub3QgZW5hYmxlZCBpbiBjZmcgZmlsZSAqLworCQkJcFJvYW1Qcm9maWxlLT51YXBzZF9tYXNrID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qUW9TIGVuYWJsZWQsIHVwZGF0ZSB1YXBzZCBtYXNrIGZyb20gY2ZnIGZpbGUgKi8KKwkJCXBSb2FtUHJvZmlsZS0+dWFwc2RfbWFzayA9CisJCQkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5VYXBzZE1hc2s7CisJCX0KKworCQlwUm9hbVByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMgPSAxOworCQlwUm9hbVByb2ZpbGUtPlNTSURzLlNTSURMaXN0LT5TU0lELmxlbmd0aCA9IHNzaWRfbGVuOworCQljZGZfbWVtX3plcm8ocFJvYW1Qcm9maWxlLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5zc0lkLAorCQkJICAgICBzaXplb2YocFJvYW1Qcm9maWxlLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5zc0lkKSk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKShwUm9hbVByb2ZpbGUtPlNTSURzLlNTSURMaXN0LT5TU0lELnNzSWQpLAorCQkJICAgICBzc2lkLCBzc2lkX2xlbik7CisKKwkJaWYgKGJzc2lkKSB7CisJCQlwUm9hbVByb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEcyA9IDE7CisJCQljZGZfbWVtX2NvcHkoKHZvaWQgKikocFJvYW1Qcm9maWxlLT5CU1NJRHMuYnNzaWQpLAorCQkJCSAgICAgYnNzaWQsIENERl9NQUNfQUREUl9TSVpFKTsKKwkJCS8qIFNhdmUgQlNTSUQgaW4gc2VwZXJhdGUgdmFyaWFibGUgYXMgd2VsbCwgYXMgUm9hbVByb2ZpbGUKKwkJCSAgIEJTU0lEIGlzIGdldHRpbmcgemVyb2VkIG91dCBpbiB0aGUgYXNzb2NpYXRpb24gcHJvY2Vzcy4gQW5kIGluCisJCQkgICBjYXNlIG9mIGpvaW4gZmFpbHVyZSB3ZSBzaG91bGQgc2VuZCB2YWxpZCBCU1NJRCB0byBzdXBwbGljYW50CisJCQkgKi8KKwkJCWNkZl9tZW1fY29weSgodm9pZCAqKShwV2V4dFN0YXRlLT5yZXFfYnNzSWQuYnl0ZXMpLAorCQkJCQlic3NpZCwgQ0RGX01BQ19BRERSX1NJWkUpOworCQl9IGVsc2UgaWYgKGJzc2lkX2hpbnQpIHsKKwkJCXBSb2FtUHJvZmlsZS0+QlNTSURzLm51bU9mQlNTSURzID0gMTsKKwkJCWNkZl9tZW1fY29weSgodm9pZCAqKShwUm9hbVByb2ZpbGUtPkJTU0lEcy5ic3NpZCksCisJCQkJCQlic3NpZF9oaW50LCBDREZfTUFDX0FERFJfU0laRSk7CisJCQkvKiBTYXZlIEJTU0lEIGluIHNlcGFyYXRlIHZhcmlhYmxlIGFzIHdlbGwsIGFzCisJCQkgICBSb2FtUHJvZmlsZSBCU1NJRCBpcyBnZXR0aW5nIHplcm9lZCBvdXQgaW4gdGhlCisJCQkgICBhc3NvY2lhdGlvbiBwcm9jZXNzLiBBbmQgaW4gY2FzZSBvZiBqb2luIGZhaWx1cmUKKwkJCSAgIHdlIHNob3VsZCBzZW5kIHZhbGlkIEJTU0lEIHRvIHN1cHBsaWNhbnQKKwkJCSAqLworCQkJY2RmX21lbV9jb3B5KCh2b2lkICopKHBXZXh0U3RhdGUtPnJlcV9ic3NJZC5ieXRlcyksCisJCQkJCWJzc2lkX2hpbnQsIENERl9NQUNfQUREUl9TSVpFKTsKKwkJCWhkZExvZyhMT0dXLCBGTCgiIGJzc2lkX2hpbnQgIk1BQ19BRERSRVNTX1NUUiksCisJCQkJCU1BQ19BRERSX0FSUkFZKGJzc2lkX2hpbnQpKTsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1femVybygodm9pZCAqKShwUm9hbVByb2ZpbGUtPkJTU0lEcy5ic3NpZCksCisJCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJCX0KKworCQloZGRMb2coTE9HMSwgRkwoIkNvbm5lY3QgdG8gU1NJRDogJS4qcyBvcGVyYXRpbmcgQ2hhbm5lbDogJXUiKSwKKwkJICAgICAgIHBSb2FtUHJvZmlsZS0+U1NJRHMuU1NJRExpc3QtPlNTSUQubGVuZ3RoLAorCQkgICAgICAgcFJvYW1Qcm9maWxlLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5zc0lkLAorCQkgICAgICAgb3BlcmF0aW5nQ2hhbm5lbCk7CisKKwkJaWYgKChJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSA9PSBwV2V4dFN0YXRlLT53cGFWZXJzaW9uKSB8fAorCQkgICAgKElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMiA9PSBwV2V4dFN0YXRlLT53cGFWZXJzaW9uKSkgeworCQkJLypzZXQgZ2VuIGllICovCisJCQloZGRfc2V0X2dlbmllX3RvX2NzcihwQWRhcHRlciwgJlJTTkF1dGhUeXBlKTsKKwkJCS8qc2V0IGF1dGggKi8KKwkJCWhkZF9zZXRfY3NyX2F1dGhfdHlwZShwQWRhcHRlciwgUlNOQXV0aFR5cGUpOworCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwkJaWYgKHBBZGFwdGVyLT53YXBpX2luZm8ubldhcGlNb2RlKSB7CisJCQloZGRMb2coTE9HMSwKKwkJCQlGTCgiU2V0dGluZyBXQVBJIEFVVEggVHlwZSBhbmQgRW5jcnlwdGlvbiBNb2RlIHZhbHVlcyIpKTsKKwkJCXN3aXRjaCAocEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUpIHsKKwkJCWNhc2UgV0FQSV9BVVRIX01PREVfUFNLOgorCQkJeworCQkJCWhkZExvZyhMT0cxLAorCQkJCSAgICAgICBGTCgiV0FQSSBBVVRIIFRZUEU6IFBTSzogJWQiKSwKKwkJCQkgICAgICAgcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUpOworCQkJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQkJCQllQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9QU0s7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIFdBUElfQVVUSF9NT0RFX0NFUlQ6CisJCQl7CisJCQkJaGRkTG9nKExPRzEsCisJCQkJICAgICAgIEZMKCJXQVBJIEFVVEggVFlQRTogQ0VSVDogJWQiKSwKKwkJCQkgICAgICAgcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUpOworCQkJCXBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQkJCQllQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9DRVJUSUZJQ0FURTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCX0gLyogRW5kIG9mIHN3aXRjaCAqLworCQkJaWYgKHBBZGFwdGVyLT53YXBpX2luZm8ud2FwaUF1dGhNb2RlID09CisJCQkgICAgV0FQSV9BVVRIX01PREVfUFNLCisJCQkgICAgfHwgcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUgPT0KKwkJCSAgICBXQVBJX0FVVEhfTU9ERV9DRVJUKSB7CisJCQkJaGRkTG9nKExPRzEsCisJCQkJICAgICAgIEZMKCJXQVBJIFBBSVJXSVNFL0dST1VQIEVOQ1JZUFRJT046IFdQSSIpKTsKKwkJCQlwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworCQkJCXBSb2FtUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisJCQkJcFJvYW1Qcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCQkJCWVDU1JfRU5DUllQVF9UWVBFX1dQSTsKKwkJCQlwUm9hbVByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisJCQkJcFJvYW1Qcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlLgorCQkJCWVuY3J5cHRpb25UeXBlWzBdID0gZUNTUl9FTkNSWVBUX1RZUEVfV1BJOworCQkJfQorCQl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKwkJLyogSW5pdGlhbGl6aW5nIGd0a09mZmxvYWRSZXFQYXJhbXMgKi8KKwkJaWYgKChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkJICAgIChXTEFOX0hERF9QMlBfQ0xJRU5UID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJCW1lbXNldCgmcEhkZFN0YUN0eC0+Z3RrT2ZmbG9hZFJlcVBhcmFtcywgMCwKKwkJCSAgICAgICBzaXplb2YodFNpckd0a09mZmxvYWRQYXJhbXMpKTsKKwkJCXBIZGRTdGFDdHgtPmd0a09mZmxvYWRSZXFQYXJhbXMudWxGbGFncyA9CisJCQkJR1RLX09GRkxPQURfRElTQUJMRTsKKwkJfQorI2VuZGlmCisJCXBSb2FtUHJvZmlsZS0+Y3NyUGVyc29uYSA9IHBBZGFwdGVyLT5kZXZpY2VfbW9kZTsKKworCQlpZiAob3BlcmF0aW5nQ2hhbm5lbCkgeworCQkJcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9CisJCQkJJm9wZXJhdGluZ0NoYW5uZWw7CisJCQlwUm9hbVByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAxOworCQl9IGVsc2UgeworCQkJcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisJCQlwUm9hbVByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworCQl9CisJCWlmICgoV0xBTl9IRERfSUJTUyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpCisJCSAgICAmJiBvcGVyYXRpbmdDaGFubmVsKSB7CisJCQkvKgorCQkJICogTmVlZCB0byBwb3N0IHRoZSBJQlNTIHBvd2VyIHNhdmUgcGFyYW1ldGVycworCQkJICogdG8gV01BLiBXTUEgd2lsbCBjb25maWd1cmUgdGhpcyBwYXJhbWV0ZXJzCisJCQkgKiB0byBmaXJtd2FyZSBpZiBwb3dlciBzYXZlIGlzIGVuYWJsZWQgYnkgdGhlCisJCQkgKiBmaXJtd2FyZS4KKwkJCSAqLworCQkJc3RhdHVzID0gaGRkX3NldF9pYnNzX3Bvd2VyX3NhdmVfcGFyYW1zKHBBZGFwdGVyKTsKKworCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoIlNldCBJQlNTIFBvd2VyIFNhdmUgUGFyYW1zIEZhaWxlZCIpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWhkZF9zZWxlY3RfY2Jtb2RlKHBBZGFwdGVyLCBvcGVyYXRpbmdDaGFubmVsKTsKKwkJfQorCisJCWlmIChwSGRkQ3R4LT5jb25maWctPnBvbGljeV9tYW5hZ2VyX2VuYWJsZWQgJiYKKwkJCSh0cnVlID09IGNkc19pc19jb25uZWN0aW9uX2luX3Byb2dyZXNzKHBIZGRDdHgpKSkgeworCQkJaGRkX2VycigiQ29ubmVjdGlvbiByZWZ1c2VkOiBjb25uIGluIHByb2dyZXNzIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIGNoYW5nZSBjb25uX3N0YXRlIHRvIGNvbm5lY3RpbmcgYmVmb3JlIHNtZV9yb2FtX2Nvbm5lY3QoKSwgYmVjYXVzZSBzbWVfcm9hbV9jb25uZWN0KCkKKwkJICogaGFzIGEgZGlyZWN0IHBhdGggdG8gY2FsbCBoZGRfc21lX3JvYW1fY2FsbGJhY2soKSwgd2hpY2ggd2lsbCBjaGFuZ2UgdGhlIGNvbm5fc3RhdGUKKwkJICogSWYgZGlyZWN0IHBhdGgsIGNvbm5fc3RhdGUgd2lsbCBiZSBhY2NvcmRpbmdseSBjaGFuZ2VkIHRvIE5vdENvbm5lY3RlZCBvciBBc3NvY2lhdGVkCisJCSAqIGJ5IGVpdGhlciBoZGRfYXNzb2NpYXRpb25fY29tcGxldGlvbl9oYW5kbGVyKCkgb3IgaGRkX2Rpc19jb25uZWN0X2hhbmRsZXIoKSBpbiBzbWVfUm9hbUNhbGxiYWNrKCkKKwkJICogaWYgc21lX1JvbUNvbm5lY3QgaXMgdG8gYmUgcXVldWVkLCBDb25uZWN0aW5nIHN0YXRlIHdpbGwgcmVtYWluIHVudGlsIGl0IGlzIGNvbXBsZXRlZC4KKwkJICovCisJCWlmIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSB8fAorCQkgICAgV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHsKKwkJCWhkZExvZyhMT0cxLAorCQkJCUZMKCJTZXQgSEREIGNvbm5TdGF0ZSB0byBlQ29ubmVjdGlvblN0YXRlX0Nvbm5lY3RpbmciKSk7CisJCQloZGRfY29ubl9zZXRfY29ubmVjdGlvbl9zdGF0ZShwQWRhcHRlciwKKwkJCQkJCSAgICAgIGVDb25uZWN0aW9uU3RhdGVfQ29ubmVjdGluZyk7CisJCX0KKworCQkvKiBBZnRlciA4LXdheSBoYW5kc2hha2Ugc3VwcGxpY2FudCBzaG91bGQgZ2l2ZSB0aGUgc2NhbiBjb21tYW5kCisJCSAqIGluIHRoYXQgaXQgdXBkYXRlIHRoZSBhZGRpdGlvbmFsIElFcywgQnV0IGJlY2F1c2Ugb2Ygc2NhbgorCQkgKiBlbmhhbmNlbWVudHMsIHRoZSBzdXBwbGljYW50IGlzIG5vdCBpc3N1aW5nIHRoZSBzY2FuIGNvbW1hbmQgbm93LgorCQkgKiBTbyB0aGUgdW5pY2FzdCBmcmFtZXMgd2hpY2ggYXJlIHNlbnQgZnJvbSB0aGUgaG9zdCBhcmUgbm90IGhhdmluZworCQkgKiB0aGUgYWRkaXRpb25hbCBJRXMuIElmIGl0IGlzIFAyUCBDTElFTlQgYW5kIHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwKKwkJICogSUUgcHJlc2VudCBpbiByb2FtUHJvZmlsZSwgdGhlbiB1c2UgdGhlIGFkZHRpb25hbCBJRSBmb3JtIHNjYW5faW5mbworCQkgKi8KKworCQlpZiAoKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfQ0xJRU5UKSAmJgorCQkgICAgKCFwUm9hbVByb2ZpbGUtPnBBZGRJRVNjYW4pKSB7CisJCQlwUm9hbVByb2ZpbGUtPnBBZGRJRVNjYW4gPQorCQkJCSZwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5hZGRJRWRhdGFbMF07CisJCQlwUm9hbVByb2ZpbGUtPm5BZGRJRVNjYW5MZW5ndGggPQorCQkJCXBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmxlbmd0aDsKKwkJfQorCQkvKgorCQkgKiBXaGVuIHBvbGljeSBtYW5hZ2VyIGlzIGVuYWJsZWQgZnJvbSBpbmkgZmlsZSwgd2Ugc2hvdWxkbid0CisJCSAqIGNoZWNrIGZvciBvdGhlciBjb25jdXJyZW5jeSBydWxlcy4KKwkJICovCisJCWlmICghcEhkZEN0eC0+Y29uZmlnLT5wb2xpY3lfbWFuYWdlcl9lbmFibGVkKSB7CisJCQljZHNfaGFuZGxlX2NvbmNfcnVsZTEocEhkZEN0eCwgcEFkYXB0ZXIsCisJCQkJCXBSb2FtUHJvZmlsZSk7CisJCQlpZiAodHJ1ZSAhPSBjZHNfaGFuZGxlX2NvbmNfcnVsZTIocEhkZEN0eCwKKwkJCQkJcEFkYXB0ZXIsIHBSb2FtUHJvZmlsZSwgJnJvYW1JZCkpCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQlzbWVfY29uZmlnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpzbWVfY29uZmlnKSk7CisJCWlmICghc21lX2NvbmZpZykgeworCQkJaGRkX2VycigidW5hYmxlIHRvIGFsbG9jYXRlIHNtZV9jb25maWciKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWNkZl9tZW1femVybyhzbWVfY29uZmlnLCBzaXplb2YoKnNtZV9jb25maWcpKTsKKwkJc21lX2dldF9jb25maWdfcGFyYW0ocEhkZEN0eC0+aEhhbCwgc21lX2NvbmZpZyk7CisJCS8qIFRoZXNlIHZhbHVlcyBhcmUgbm90IHNlc3Npb25pemVkLiBTbywgYW55IGNoYW5nZSBpbiB0aGVzZSBTTUUKKwkJICogY29uZmlncyBvbiBhbiBvbGRlciBvciBwYXJhbGxlbCBpbnRlcmZhY2Ugd2lsbCBhZmZlY3QgdGhlCisJCSAqIGNiIG1vZGUuIFNvLCByZXN0b3JpbmcgdGhlIGRlZmF1bHQgSU5JIHBhcmFtcyBiZWZvcmUgc3RhcnRpbmcKKwkJICogaW50ZXJmYWNlcyBzdWNoIGFzIHN0YSwgY2xpIGV0Yy4sCisJCSAqLworCQlzbWVfY29uZmlnLT5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlNUdIeiA9CisJCQlwSGRkQ3R4LT5jb25maWctPm5DaGFubmVsQm9uZGluZ01vZGU1R0h6OworCQlzbWVfY29uZmlnLT5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPQorCQkJcEhkZEN0eC0+Y29uZmlnLT5uQ2hhbm5lbEJvbmRpbmdNb2RlMjRHSHo7CisJCXNtZV91cGRhdGVfY29uZmlnKHBIZGRDdHgtPmhIYWwsIHNtZV9jb25maWcpOworCQljZGZfbWVtX2ZyZWUoc21lX2NvbmZpZyk7CisKKwkJc3RhdHVzID0gc21lX3JvYW1fY29ubmVjdChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCSAgcEFkYXB0ZXItPnNlc3Npb25JZCwgcFJvYW1Qcm9maWxlLAorCQkJCQkgICZyb2FtSWQpOworCisJCWlmICgoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgJiYKKwkJICAgIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSB8fAorCQkgICAgIFdMQU5fSEREX1AyUF9DTElFTlQgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoInNtZV9yb2FtX2Nvbm5lY3QgKHNlc3Npb24gJWQpIGZhaWxlZCB3aXRoICIKKwkJCSAgICAgICAic3RhdHVzICVkLiAtPiBOb3RDb25uZWN0ZWQiKSwKKwkJCSAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCBzdGF0dXMpOworCQkJLyogY2hhbmdlIGJhY2sgdG8gTm90QXNzb2NpYXRlZCAqLworCQkJaGRkX2Nvbm5fc2V0X2Nvbm5lY3Rpb25fc3RhdGUocEFkYXB0ZXIsCisJCQkJCQkgICAgICBlQ29ubmVjdGlvblN0YXRlX05vdENvbm5lY3RlZCk7CisJCX0KKworCQlwUm9hbVByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKwkJcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKworCX0gZWxzZSB7CisJCWhkZExvZyhMT0dFLCBGTCgiTm8gdmFsaWQgUm9hbSBwcm9maWxlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJRVhJVCgpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2F1dGhfdHlwZSgpIC0gc2V0IGF1dGggdHlwZQorICogQHBBZGFwdGVyOiBQb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBhdXRoX3R5cGU6IEF1dGggdHlwZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgKE9QRU4vU0hBUkVEKS4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2F1dGhfdHlwZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJICAgZW51bSBubDgwMjExX2F1dGhfdHlwZSBhdXRoX3R5cGUpCit7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworCUVOVEVSKCk7CisKKwkvKnNldCBhdXRoZW50aWNhdGlvbiB0eXBlICovCisJc3dpdGNoIChhdXRoX3R5cGUpIHsKKwljYXNlIE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDOgorCQloZGRMb2coTE9HMSwKKwkJICAgICAgIEZMKCJzZXQgYXV0aGVudGljYXRpb24gdHlwZSB0byBBVVRPU1dJVENIIikpOworCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9BVVRPU1dJVENIOworCQlicmVhazsKKworCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTToKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9GVDoKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCQloZGRMb2coTE9HMSwKKwkJICAgICAgIEZMKCJzZXQgYXV0aGVudGljYXRpb24gdHlwZSB0byBPUEVOIikpOworCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKwkJYnJlYWs7CisKKwljYXNlIE5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWToKKwkJaGRkTG9nKExPRzEsCisJCSAgICAgICBGTCgic2V0IGF1dGhlbnRpY2F0aW9uIHR5cGUgdG8gU0hBUkVEIikpOworCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOworCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJY2FzZSBOTDgwMjExX0FVVEhUWVBFX05FVFdPUktfRUFQOgorCQloZGRMb2coTE9HMSwKKwkJICAgICAgIEZMKCJzZXQgYXV0aGVudGljYXRpb24gdHlwZSB0byBDQ0tNIFdQQSIpKTsKKwkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEE7CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJVbnN1cHBvcnRlZCBhdXRoZW50aWNhdGlvbiB0eXBlICVkIiksIGF1dGhfdHlwZSk7CisJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX1VOS05PV047CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkF1dGhUeXBlLmF1dGhUeXBlWzBdID0KKwkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX3NldF9ha21fc3VpdGUoKSAtIHNldCBrZXkgbWFuYWdlbWVudCB0eXBlCisgKiBAcEFkYXB0ZXI6IFBvaW50ZXIgdG8gYWRhcHRlcgorICogQGtleV9tZ210OiBLZXkgbWFuYWdlbWVudCB0eXBlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUga2V5IG1nbXQgdHlwZShQU0svODAyMXgpLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9zZXRfYWttX3N1aXRlKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1MzIga2V5X21nbXQpCit7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisKKwlFTlRFUigpOworCisjZGVmaW5lIFdMQU5fQUtNX1NVSVRFXzgwMjFYX1NIQTI1NiAweDAwMEZBQzA1CisjZGVmaW5lIFdMQU5fQUtNX1NVSVRFX1BTS19TSEEyNTYgICAweDAwMEZBQzA2CisJLypzZXQga2V5IG1nbXQgdHlwZSAqLworCXN3aXRjaCAoa2V5X21nbXQpIHsKKwljYXNlIFdMQU5fQUtNX1NVSVRFX1BTSzoKKwljYXNlIFdMQU5fQUtNX1NVSVRFX1BTS19TSEEyNTY6CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwljYXNlIFdMQU5fQUtNX1NVSVRFX0ZUX1BTSzoKKyNlbmRpZgorCQloZGRMb2coTE9HMSwgRkwoInNldHRpbmcga2V5IG1nbXQgdHlwZSB0byBQU0siKSk7CisJCXBXZXh0U3RhdGUtPmF1dGhLZXlNZ210IHw9IElXX0FVVEhfS0VZX01HTVRfUFNLOworCQlicmVhazsKKworCWNhc2UgV0xBTl9BS01fU1VJVEVfODAyMVhfU0hBMjU2OgorCWNhc2UgV0xBTl9BS01fU1VJVEVfODAyMVg6CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwljYXNlIFdMQU5fQUtNX1NVSVRFX0ZUXzgwMjFYOgorI2VuZGlmCisJCWhkZExvZyhMT0cxLAorCQkgICAgICAgRkwoInNldHRpbmcga2V5IG1nbXQgdHlwZSB0byA4MDIxeCIpKTsKKwkJcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgfD0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVg7CisJCWJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKyNkZWZpbmUgV0xBTl9BS01fU1VJVEVfQ0NLTSAgICAgICAgIDB4MDA0MDk2MDAgIC8qIFNob3VsZCBiZSBpbiBpZWVlODAyXzExX2RlZnMuaCAqLworI2RlZmluZSBJV19BVVRIX0tFWV9NR01UX0NDS00gICAgICAgOCAgIC8qIFNob3VsZCBiZSBpbiBsaW51eC93aXJlbGVzcy5oICovCisJY2FzZSBXTEFOX0FLTV9TVUlURV9DQ0tNOgorCQloZGRMb2coTE9HMSwKKwkJICAgICAgIEZMKCJzZXR0aW5nIGtleSBtZ210IHR5cGUgdG8gQ0NLTSIpKTsKKwkJcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgfD0gSVdfQVVUSF9LRVlfTUdNVF9DQ0tNOworCQlicmVhazsKKyNlbmRpZgorI2lmbmRlZiBXTEFOX0FLTV9TVUlURV9PU0VOCisjZGVmaW5lIFdMQU5fQUtNX1NVSVRFX09TRU4gICAgICAgICAweDUwNmY5YTAxICAvKiBTaG91bGQgYmUgaW4gaWVlZTgwMl8xMV9kZWZzLmggKi8KKyNlbmRpZgorCWNhc2UgV0xBTl9BS01fU1VJVEVfT1NFTjoKKwkJaGRkTG9nKExPRzEsCisJCSAgICAgICBGTCgic2V0dGluZyBrZXkgbWdtdCB0eXBlIHRvIE9TRU4iKSk7CisJCXBXZXh0U3RhdGUtPmF1dGhLZXlNZ210IHw9IElXX0FVVEhfS0VZX01HTVRfODAyXzFYOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIlVuc3VwcG9ydGVkIGtleSBtZ210IHR5cGUgJWQiKSwga2V5X21nbXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfY2lwaGVyKCkgLSBzZXQgZW5jcnlwdGlvbiB0eXBlCisgKiBAcEFkYXB0ZXI6IFBvaW50ZXIgdG8gYWRhcHRlcgorICogQGNpcGhlcjogQ2lwaGVyIHR5cGUKKyAqIEB1Y2FzdDogVW5pY2FzdCBmbGFnCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgZW5jcnlwdGlvbiB0eXBlCisgKiAoTk9ORS9XRVA0MC9XRVAxMDQvVEtJUC9DQ01QKS4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2NpcGhlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJdTMyIGNpcGhlciwgYm9vbCB1Y2FzdCkKK3sKKwllQ3NyRW5jcnlwdGlvblR5cGUgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwlFTlRFUigpOworCisJaWYgKCFjaXBoZXIpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgicmVjZWl2ZWQgY2lwaGVyICVkIC0gY29uc2lkZXJpbmcgbm9uZSIpLCBjaXBoZXIpOworCQllbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisJfSBlbHNlIHsKKworCQkvKnNldCBlbmNyeXB0aW9uIG1ldGhvZCAqLworCQlzd2l0Y2ggKGNpcGhlcikgeworCQljYXNlIElXX0FVVEhfQ0lQSEVSX05PTkU6CisJCQllbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCQkJZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgorCQkJZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCQllbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1RLSVA7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCQllbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0FFUzsKKwkJCWJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfU01TNDoKKwkJCWVuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV1BJOworCQkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9LUks6CisJCQllbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0tSSzsKKwkJCWJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9CVEs6CisJCQllbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0JUSzsKKwkJCWJyZWFrOworI2VuZGlmCisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgIEZMKCJVbnN1cHBvcnRlZCBjaXBoZXIgdHlwZSAlZCIpLCBjaXBoZXIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJfQorCisJaWYgKHVjYXN0KSB7CisJCWhkZExvZyhMT0cxLAorCQkgICAgICAgRkwoInNldHRpbmcgdW5pY2FzdCBjaXBoZXIgdHlwZSB0byAlZCIpLCBlbmNyeXB0aW9uVHlwZSk7CisJCXBIZGRTdGFDdHgtPmNvbm5faW5mby51Y0VuY3J5cHRpb25UeXBlID0gZW5jcnlwdGlvblR5cGU7CisJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCQllbmNyeXB0aW9uVHlwZTsKKwl9IGVsc2UgeworCQloZGRMb2coTE9HMSwKKwkJICAgICAgIEZMKCJzZXR0aW5nIG1jYXN0IGNpcGhlciB0eXBlIHRvICVkIiksIGVuY3J5cHRpb25UeXBlKTsKKwkJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm1jRW5jcnlwdGlvblR5cGUgPSBlbmNyeXB0aW9uVHlwZTsKKwkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKwkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCQllbmNyeXB0aW9uVHlwZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfaWUoKSAtIHNldCBJRXMKKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBhZGFwdGVyCisgKiBAaWU6IFBvaW50ZXIgb3QgaWUKKyAqIEBpZTogSUUgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2llKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBjb25zdCB1aW50OF90ICppZSwKKwkJCSAgICAgc2l6ZV90IGllX2xlbikKK3sKKwloZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwljb25zdCB1aW50OF90ICpnZW5pZSA9IGllOworCXVpbnQxNl90IHJlbUxlbiA9IGllX2xlbjsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCXVpbnQzMl90IGFrbXN1aXRlW01BWF9OVU1fQUtNX1NVSVRFU107CisJdTE2ICp0bXA7CisJdWludDE2X3QgYWttc3VpdGVDb3VudDsKKwlpbnQgKmFrbWxpc3Q7CisjZW5kaWYKKwlFTlRFUigpOworCisJLyogY2xlYXIgcHJldmlvdXMgYXNzb2NBZGRJRSAqLworCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoID0gMDsKKwlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5iV1BTQXNzb2NpYXRpb24gPSBmYWxzZTsKKwlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5iT1NFTkFzc29jaWF0aW9uID0gZmFsc2U7CisKKwl3aGlsZSAocmVtTGVuID49IDIpIHsKKwkJdWludDE2X3QgZUxlbiA9IDA7CisJCXVpbnQ4X3QgZWxlbWVudElkOworCQllbGVtZW50SWQgPSAqZ2VuaWUrKzsKKwkJZUxlbiA9ICpnZW5pZSsrOworCQlyZW1MZW4gLT0gMjsKKworCQloZGRMb2coTE9HMSwgRkwoIklFWzB4JVhdLCBMRU5bJWRdIiksIGVsZW1lbnRJZCwgZUxlbik7CisKKwkJc3dpdGNoIChlbGVtZW50SWQpIHsKKwkJY2FzZSBET1QxMUZfRUlEX1dQQToKKwkJCWlmICg0ID4gZUxlbikgeyAvKiBzaG91bGQgaGF2ZSBhdCBsZWFzdCBPVUkgd2hpY2ggaXMgNCBieXRlcyBzbyBleHRyYSAyIGJ5dGVzIG5vdCBuZWVkZWQgKi8KKwkJCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgV1BBIElFIikpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIGlmICgwID09CisJCQkJICAgbWVtY21wKCZnZW5pZVswXSwgIlx4MDBceDUwXHhmMlx4MDQiLCA0KSkgeworCQkJCXVpbnQxNl90IGN1ckFkZElFTGVuID0KKwkJCQkJcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGg7CisJCQkJaGRkTG9nKExPRzEsCisJCQkJCUZMKCJTZXQgV1BTIElFKGxlbiAlZCkiKSwgZUxlbiArIDIpOworCisJCQkJaWYgKFNJUl9NQUNfTUFYX0FERF9JRV9MRU5HVEggPAorCQkJCSAgICAocFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggKyBlTGVuKSkgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgIEZMKCJDYW5ub3QgYWNjb21tb2RhdGUgYXNzb2NBZGRJRS4gTmVlZCBiaWdnZXIgYnVmZmVyIHNwYWNlIikpOworCQkJCQlDREZfQVNTRVJUKDApOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQkJLyogV1NDIElFIGlzIHNhdmVkIHRvIEFkZGl0aW9uYWwgSUUgOyBpdCBzaG91bGQgYmUgYWNjdW11bGF0ZWQgdG8gaGFuZGxlIFdQUyBJRSArIFAyUCBJRSAqLworCQkJCW1lbWNweShwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YSArCisJCQkJICAgICAgIGN1ckFkZElFTGVuLCBnZW5pZSAtIDIsIGVMZW4gKyAyKTsKKwkJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aCArPSBlTGVuICsgMjsKKworCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLmJXUFNBc3NvY2lhdGlvbiA9IHRydWU7CisJCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFQXNzb2MgPQorCQkJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YTsKKwkJCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uQWRkSUVBc3NvY0xlbmd0aCA9CisJCQkJCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoOworCQkJfSBlbHNlIGlmICgwID09IG1lbWNtcCgmZ2VuaWVbMF0sICJceDAwXHg1MFx4ZjIiLCAzKSkgeworCQkJCWhkZExvZyhMT0cxLAorCQkJCSAgICAgICBGTCgiU2V0IFdQQSBJRSAobGVuICVkKSIpLCBlTGVuICsgMik7CisJCQkJbWVtc2V0KHBXZXh0U3RhdGUtPldQQVJTTklFLCAwLAorCQkJCSAgICAgICBNQVhfV1BBX1JTTl9JRV9MRU4pOworCQkJCW1lbWNweShwV2V4dFN0YXRlLT5XUEFSU05JRSwgZ2VuaWUgLSAyLAorCQkJCSAgICAgICAoZUxlbiArIDIpKTsKKwkJCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5wV1BBUmVxSUUgPQorCQkJCQlwV2V4dFN0YXRlLT5XUEFSU05JRTsKKwkJCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uV1BBUmVxSUVMZW5ndGggPSBlTGVuICsgMjsgICAgIC8qIGllX2xlbjsgKi8KKwkJCX0gZWxzZSBpZiAoKDAgPT0gbWVtY21wKCZnZW5pZVswXSwgUDJQX09VSV9UWVBFLAorCQkJCQkJUDJQX09VSV9UWVBFX1NJWkUpKSkgeworCQkJCXVpbnQxNl90IGN1ckFkZElFTGVuID0KKwkJCQkJcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGg7CisJCQkJaGRkTG9nKExPRzEsCisJCQkJICAgICAgIEZMKCJTZXQgUDJQIElFKGxlbiAlZCkiKSwgZUxlbiArIDIpOworCisJCQkJaWYgKFNJUl9NQUNfTUFYX0FERF9JRV9MRU5HVEggPAorCQkJCSAgICAocFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggKyBlTGVuKSkgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgIEZMKCJDYW5ub3QgYWNjb21tb2RhdGUgYXNzb2NBZGRJRSBOZWVkIGJpZ2dlciBidWZmZXIgc3BhY2UiKSk7CisJCQkJCUNERl9BU1NFUlQoMCk7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCX0KKwkJCQkvKiBQMlAgSUUgaXMgc2F2ZWQgdG8gQWRkaXRpb25hbCBJRSA7IGl0IHNob3VsZCBiZSBhY2N1bXVsYXRlZCB0byBoYW5kbGUgV1BTIElFICsgUDJQIElFICovCisJCQkJbWVtY3B5KHBXZXh0U3RhdGUtPmFzc29jQWRkSUUuYWRkSUVkYXRhICsKKwkJCQkgICAgICAgY3VyQWRkSUVMZW4sIGdlbmllIC0gMiwgZUxlbiArIDIpOworCQkJCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoICs9IGVMZW4gKyAyOworCisJCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFQXNzb2MgPQorCQkJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YTsKKwkJCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uQWRkSUVBc3NvY0xlbmd0aCA9CisJCQkJCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoOworCQkJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9XRkQKKwkJCWVsc2UgaWYgKCgwID09IG1lbWNtcCgmZ2VuaWVbMF0sIFdGRF9PVUlfVFlQRSwKKwkJCQkJICAgICAgV0ZEX09VSV9UWVBFX1NJWkUpKSAmJgorCQkJCS8qIENvbnNpZGVyIFdGRCBJRSwgb25seSBmb3IgUDJQIENsaWVudCAqLworCQkJCSAoV0xBTl9IRERfUDJQX0NMSUVOVCA9PQorCQkJCSAgICAgcEFkYXB0ZXItPmRldmljZV9tb2RlKSkgeworCQkJCXVpbnQxNl90IGN1ckFkZElFTGVuID0KKwkJCQkJcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGg7CisJCQkJaGRkTG9nKExPRzEsCisJCQkJICAgICAgIEZMKCJTZXQgV0ZEIElFKGxlbiAlZCkiKSwgZUxlbiArIDIpOworCisJCQkJaWYgKFNJUl9NQUNfTUFYX0FERF9JRV9MRU5HVEggPAorCQkJCSAgICAocFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggKyBlTGVuKSkgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJCUZMKCJDYW5ub3QgYWNjb21tb2RhdGUgYXNzb2NBZGRJRSBOZWVkIGJpZ2dlciBidWZmZXIgc3BhY2UiKSk7CisJCQkJCUNERl9BU1NFUlQoMCk7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCX0KKwkJCQkvKiBXRkQgSUUgaXMgc2F2ZWQgdG8gQWRkaXRpb25hbCBJRSA7IGl0IHNob3VsZAorCQkJCSAqIGJlIGFjY3VtdWxhdGVkIHRvIGhhbmRsZSBXUFMgSUUgKyBQMlAgSUUgKworCQkJCSAqIFdGRCBJRSAqLworCQkJCW1lbWNweShwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YSArCisJCQkJICAgICAgIGN1ckFkZElFTGVuLCBnZW5pZSAtIDIsIGVMZW4gKyAyKTsKKwkJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aCArPSBlTGVuICsgMjsKKworCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBBZGRJRUFzc29jID0KKwkJCQkJcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5hZGRJRWRhdGE7CisJCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubkFkZElFQXNzb2NMZW5ndGggPQorCQkJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aDsKKwkJCX0KKyNlbmRpZgorCQkJLyogQXBwZW5kaW5nIEhTIDIuMCBJbmRpY2F0aW9uIEVsZW1lbnQgaW4gQXNzaWNpYXRpb24gUmVxdWVzdCAqLworCQkJZWxzZSBpZiAoKDAgPT0gbWVtY21wKCZnZW5pZVswXSwgSFMyMF9PVUlfVFlQRSwKKwkJCQkJICAgICAgSFMyMF9PVUlfVFlQRV9TSVpFKSkpIHsKKwkJCQl1aW50MTZfdCBjdXJBZGRJRUxlbiA9CisJCQkJCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoOworCQkJCWhkZExvZyhMT0cxLAorCQkJCSAgICAgICBGTCgiU2V0IEhTMjAgSUUobGVuICVkKSIpLCBlTGVuICsgMik7CisKKwkJCQlpZiAoU0lSX01BQ19NQVhfQUREX0lFX0xFTkdUSCA8CisJCQkJICAgIChwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aCArIGVMZW4pKSB7CisJCQkJCWhkZExvZyhMT0dFLAorCQkJCQkgICAgICAgRkwoIkNhbm5vdCBhY2NvbW1vZGF0ZSBhc3NvY0FkZElFIE5lZWQgYmlnZ2VyIGJ1ZmZlciBzcGFjZSIpKTsKKwkJCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJCW1lbWNweShwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YSArCisJCQkJICAgICAgIGN1ckFkZElFTGVuLCBnZW5pZSAtIDIsIGVMZW4gKyAyKTsKKwkJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aCArPSBlTGVuICsgMjsKKworCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBBZGRJRUFzc29jID0KKwkJCQkJcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5hZGRJRWRhdGE7CisJCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubkFkZElFQXNzb2NMZW5ndGggPQorCQkJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aDsKKwkJCX0KKwkJCS8qIEFwcGVuZGluZyBPU0VOIEluZm9ybWF0aW9uICBFbGVtZW50IGluIEFzc2ljaWF0aW9uIFJlcXVlc3QgKi8KKwkJCWVsc2UgaWYgKCgwID09IG1lbWNtcCgmZ2VuaWVbMF0sIE9TRU5fT1VJX1RZUEUsCisJCQkJCSAgICAgIE9TRU5fT1VJX1RZUEVfU0laRSkpKSB7CisJCQkJdWludDE2X3QgY3VyQWRkSUVMZW4gPQorCQkJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aDsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgRkwoIlNldCBPU0VOIElFKGxlbiAlZCkiKSwgZUxlbiArIDIpOworCisJCQkJaWYgKFNJUl9NQUNfTUFYX0FERF9JRV9MRU5HVEggPAorCQkJCSAgICAocFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggKyBlTGVuKSkgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgIEZMKCJDYW5ub3QgYWNjb21tb2RhdGUgYXNzb2NBZGRJRSBOZWVkIGJpZ2dlciBidWZmZXIgc3BhY2UiKSk7CisJCQkJCUNERl9BU1NFUlQoMCk7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCX0KKwkJCQltZW1jcHkocFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5hZGRJRWRhdGEgKworCQkJCSAgICAgICBjdXJBZGRJRUxlbiwgZ2VuaWUgLSAyLCBlTGVuICsgMik7CisJCQkJcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggKz0gZUxlbiArIDI7CisKKwkJCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5iT1NFTkFzc29jaWF0aW9uID0gdHJ1ZTsKKwkJCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5wQWRkSUVBc3NvYyA9CisJCQkJCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUuYWRkSUVkYXRhOworCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5BZGRJRUFzc29jTGVuZ3RoID0KKwkJCQkJcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGg7CisJCQl9IGVsc2UgeworCQkJCXVpbnQxNl90IGFkZF9pZV9sZW4gPQorCQkJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aDsKKworCQkJCWhkZF9pbmZvKCJTZXQgT1NFTiBJRShsZW4gJWQpIiwgZUxlbiArIDIpOworCisJCQkJaWYgKFNJUl9NQUNfTUFYX0FERF9JRV9MRU5HVEggPAorCQkJCSAgICAocFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggKyBlTGVuKSkgeworCQkJCQloZGRfZXJyKCJDYW5ub3QgYWNjb21tb2RhdGUgYXNzb2NBZGRJRSBOZWVkIGJpZ2dlciBidWZmZXIgc3BhY2UiKTsKKwkJCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCisJCQkJbWVtY3B5KHBXZXh0U3RhdGUtPmFzc29jQWRkSUUuYWRkSUVkYXRhICsKKwkJCQkgICAgICAgYWRkX2llX2xlbiwgZ2VuaWUgLSAyLCBlTGVuICsgMik7CisJCQkJcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggKz0gZUxlbiArIDI7CisKKwkJCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5wQWRkSUVBc3NvYyA9CisJCQkJCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUuYWRkSUVkYXRhOworCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5BZGRJRUFzc29jTGVuZ3RoID0KKwkJCQkJcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGg7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBET1QxMUZfRUlEX1JTTjoKKwkJCWhkZExvZyhMT0cxLCBGTCgiU2V0IFJTTiBJRShsZW4gJWQpIiksIGVMZW4gKyAyKTsKKwkJCW1lbXNldChwV2V4dFN0YXRlLT5XUEFSU05JRSwgMCwgTUFYX1dQQV9SU05fSUVfTEVOKTsKKwkJCW1lbWNweShwV2V4dFN0YXRlLT5XUEFSU05JRSwgZ2VuaWUgLSAyLAorCQkJICAgICAgIChlTGVuICsgMikpOworCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucFJTTlJlcUlFID0KKwkJCQlwV2V4dFN0YXRlLT5XUEFSU05JRTsKKwkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5SU05SZXFJRUxlbmd0aCA9IGVMZW4gKyAyOyAgICAgLyogaWVfbGVuOyAqLworCQkJYnJlYWs7CisJCS8qCisJCSAqIEFwcGVuZGluZyBFeHRlbmRlZCBDYXBhYmlsaXRpZXMgd2l0aCBJbnRlcndvcmtpbmcgYml0IHNldAorCQkgKiBpbiBBc3NvYyBSZXEuCisJCSAqCisJCSAqIEluIGFzc29jIHJlcSB0aGlzIEVYVCBDYXAgd2lsbCBvbmx5IGJlIHRha2VuIGludG8gYWNjb3VudCBpZgorCQkgKiBpbnRlcndvcmtpbmdTZXJ2aWNlIGJpdCBpcyBzZXQgdG8gMS4gQ3VycmVudGx5CisJCSAqIGRyaXZlciBpcyBvbmx5IGludGVyZXN0ZWQgaW4gaW50ZXJ3b3JraW5nU2VydmljZSBjYXBhYmlsaXR5CisJCSAqIGZyb20gc3VwcGxpY2FudC4gSWYgaW4gZnV0dXJlIGFueSBvdGhlciBFWFQgQ2FwIGluZm8gaXMKKwkJICogcmVxdWlyZWQgZnJvbSBzdXBwbGljYXQsIGl0IG5lZWRzIHRvIGJlIGhhbmRsZWQgd2hpbGUKKwkJICogc2VuZGluZyBBc3NvYyBSZXEgaW4gTElNLgorCQkgKi8KKwkJY2FzZSBET1QxMUZfRUlEX0VYVENBUDoKKwkJeworCQkJdWludDE2X3QgY3VyQWRkSUVMZW4gPQorCQkJCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoOworCQkJaGRkTG9nKExPRzEsCisJCQkgICAgICAgRkwoIlNldCBFeHRlbmRlZCBDQVBTIElFKGxlbiAlZCkiKSwgZUxlbiArIDIpOworCisJCQlpZiAoU0lSX01BQ19NQVhfQUREX0lFX0xFTkdUSCA8CisJCQkgICAgKHBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoICsgZUxlbikpIHsKKwkJCQloZGRMb2coTE9HRSwgRkwoIkNhbm5vdCBhY2NvbW1vZGF0ZSBhc3NvY0FkZElFIE5lZWQgYmlnZ2VyIGJ1ZmZlciBzcGFjZSIpKTsKKwkJCQlDREZfQVNTRVJUKDApOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJbWVtY3B5KHBXZXh0U3RhdGUtPmFzc29jQWRkSUUuYWRkSUVkYXRhICsKKwkJCSAgICAgICBjdXJBZGRJRUxlbiwgZ2VuaWUgLSAyLCBlTGVuICsgMik7CisJCQlwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aCArPSBlTGVuICsgMjsKKworCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFQXNzb2MgPQorCQkJCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUuYWRkSUVkYXRhOworCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubkFkZElFQXNzb2NMZW5ndGggPQorCQkJCXBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoOworCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCQljYXNlIFdMQU5fRUlEX1dBUEk6CisJCQkvKiBTZXR0aW5nIFdBUEkgTW9kZSB0byBPTj0xICovCisJCQlwQWRhcHRlci0+d2FwaV9pbmZvLm5XYXBpTW9kZSA9IDE7CisJCQloZGRMb2coTE9HMSwKKwkJCQlGTCgiV0FQSSBNT0RFIElTICV1IiksIHBBZGFwdGVyLT53YXBpX2luZm8ubldhcGlNb2RlKTsKKwkJCXRtcCA9ICh1MTYgKikgaWU7CisJCQl0bXAgPSB0bXAgKyAyOyAgLyogU2tpcCBlbGVtZW50IElkIGFuZCBMZW4sIFZlcnNpb24gKi8KKwkJCWFrbXN1aXRlQ291bnQgPSBXUEFfR0VUX0xFMTYodG1wKTsKKwkJCXRtcCA9IHRtcCArIDE7CisJCQlha21saXN0ID0gKGludCAqKSh0bXApOworCQkJaWYgKGFrbXN1aXRlQ291bnQgPD0gTUFYX05VTV9BS01fU1VJVEVTKSB7CisJCQkJbWVtY3B5KGFrbXN1aXRlLCBha21saXN0LCAoNCAqIGFrbXN1aXRlQ291bnQpKTsKKwkJCX0gZWxzZSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKCJJbnZhbGlkIGFrbVN1aXRlIGNvdW50IikpOworCQkJCUNERl9BU1NFUlQoMCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmIChXQVBJX1BTS19BS01fU1VJVEUgPT0gYWttc3VpdGVbMF0pIHsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgRkwoIldBUEkgQVVUSCBNT0RFIFNFVCBUTyBQU0siKSk7CisJCQkJcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUgPQorCQkJCQlXQVBJX0FVVEhfTU9ERV9QU0s7CisJCQl9CisJCQlpZiAoV0FQSV9DRVJUX0FLTV9TVUlURSA9PSBha21zdWl0ZVswXSkgeworCQkJCWhkZExvZyhMT0cxLAorCQkJCSAgICAgICBGTCgiV0FQSSBBVVRIIE1PREUgU0VUIFRPIENFUlRJRklDQVRFIikpOworCQkJCXBBZGFwdGVyLT53YXBpX2luZm8ud2FwaUF1dGhNb2RlID0KKwkJCQkJV0FQSV9BVVRIX01PREVfQ0VSVDsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTCgiU2V0IFVOS05PV04gSUUgJVgiKSwgZWxlbWVudElkKTsKKwkJCS8qIHdoZW4gVW5rbm93biBJRSBpcyByZWNlaXZlZCB3ZSBzaG91bGQgYnJlYWsgYW5kIGNvbnRpbnVlCisJCQkgKiB0byB0aGUgbmV4dCBJRSBpbiB0aGUgYnVmZmVyIGluc3RlYWQgd2Ugd2VyZSByZXR1cm5pbmcKKwkJCSAqIHNvIGNoYW5naW5nIHRoaXMgdG8gYnJlYWsgKi8KKwkJCWJyZWFrOworCQl9CisJCWdlbmllICs9IGVMZW47CisJCXJlbUxlbiAtPSBlTGVuOworCX0KKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX2lzX3dwYWllX3ByZXNlbnQoKSAtIGNoZWNrIGZvciBXUEEgaWUKKyAqIEBpZTogUG9pbnRlciB0byBpZQorICogQGllX2xlbjogSWUgbGVuZ3RoCisgKgorICogUGFyc2UgdGhlIHJlY2VpdmVkIElFIHRvIGZpbmQgdGhlIFdQQSBJRQorICoKKyAqIFJldHVybjogdHJ1ZSBpZiB3cGEgaWUgaXMgZm91bmQgZWxzZSBmYWxzZQorICovCitzdGF0aWMgYm9vbCBoZGRfaXNfd3BhaWVfcHJlc2VudChjb25zdCB1aW50OF90ICppZSwgdWludDhfdCBpZV9sZW4pCit7CisJdWludDhfdCBlTGVuID0gMDsKKwl1aW50MTZfdCByZW1MZW4gPSBpZV9sZW47CisJdWludDhfdCBlbGVtZW50SWQgPSAwOworCisJd2hpbGUgKHJlbUxlbiA+PSAyKSB7CisJCWVsZW1lbnRJZCA9ICppZSsrOworCQllTGVuID0gKmllKys7CisJCXJlbUxlbiAtPSAyOworCQlpZiAoZUxlbiA+IHJlbUxlbikgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICAiJXM6IElFIGxlbmd0aCBpcyB3cm9uZyAlZCIsIF9fZnVuY19fLCBlTGVuKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoKGVsZW1lbnRJZCA9PSBET1QxMUZfRUlEX1dQQSkgJiYgKHJlbUxlbiA+IDUpKSB7CisJCQkvKiBPVUkgLSAweDAwIDBYNTAgMFhGMgorCQkJICogV1BBIEluZm9ybWF0aW9uIEVsZW1lbnQgLSAweDAxCisJCQkgKiBXUEEgdmVyc2lvbiAtIDB4MDEKKwkJCSAqLworCQkJaWYgKDAgPT0gbWVtY21wKCZpZVswXSwgIlx4MDBceDUwXHhmMlx4MDFceDAxIiwgNSkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWUgKz0gZUxlbjsKKwkJcmVtTGVuIC09IGVMZW47CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcHJpdmFjeSgpIC0gc2V0IHNlY3VyaXR5IHBhcmFtZXRlcnMgZHVyaW5nIGNvbm5lY3Rpb24KKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBhZGFwdGVyCisgKiBAcmVxOiBQb2ludGVyIHRvIHNlY3VyaXR5IHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcHJpdmFjeShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgIHN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqcmVxKQoreworCWludCBzdGF0dXMgPSAwOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCUVOVEVSKCk7CisKKwkvKnNldCB3cGEgdmVyc2lvbiAqLworCXBXZXh0U3RhdGUtPndwYVZlcnNpb24gPSBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEOworCisJaWYgKHJlcS0+Y3J5cHRvLndwYV92ZXJzaW9ucykgeworCQlpZiAoTkw4MDIxMV9XUEFfVkVSU0lPTl8xID09IHJlcS0+Y3J5cHRvLndwYV92ZXJzaW9ucykgeworCQkJcFdleHRTdGF0ZS0+d3BhVmVyc2lvbiA9IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBOworCQl9IGVsc2UgaWYgKE5MODAyMTFfV1BBX1ZFUlNJT05fMiA9PSByZXEtPmNyeXB0by53cGFfdmVyc2lvbnMpIHsKKwkJCXBXZXh0U3RhdGUtPndwYVZlcnNpb24gPSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTI7CisJCX0KKwl9CisKKwloZGRMb2coTE9HMSwgRkwoInNldCB3cGEgdmVyc2lvbiB0byAlZCIpLCBwV2V4dFN0YXRlLT53cGFWZXJzaW9uKTsKKworCS8qc2V0IGF1dGhlbnRpY2F0aW9uIHR5cGUgKi8KKwlzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfYXV0aF90eXBlKHBBZGFwdGVyLCByZXEtPmF1dGhfdHlwZSk7CisKKwlpZiAoMCA+IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoImZhaWxlZCB0byBzZXQgYXV0aGVudGljYXRpb24gdHlwZSAiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLypzZXQga2V5IG1nbXQgdHlwZSAqLworCWlmIChyZXEtPmNyeXB0by5uX2FrbV9zdWl0ZXMpIHsKKwkJc3RhdHVzID0KKwkJCXdsYW5faGRkX3NldF9ha21fc3VpdGUocEFkYXB0ZXIsIHJlcS0+Y3J5cHRvLmFrbV9zdWl0ZXNbMF0pOworCQlpZiAoMCA+IHN0YXR1cykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJmYWlsZWQgdG8gc2V0IGFrbSBzdWl0ZSIpKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisKKwkvKnNldCBwYWlyd2lzZSBjaXBoZXIgdHlwZSAqLworCWlmIChyZXEtPmNyeXB0by5uX2NpcGhlcnNfcGFpcndpc2UpIHsKKwkJc3RhdHVzID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2NpcGhlcihwQWRhcHRlciwKKwkJCQkJCSAgICAgIHJlcS0+Y3J5cHRvLgorCQkJCQkJICAgICAgY2lwaGVyc19wYWlyd2lzZVswXSwKKwkJCQkJCSAgICAgIHRydWUpOworCQlpZiAoMCA+IHN0YXR1cykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJmYWlsZWQgdG8gc2V0IHVuaWNhc3QgY2lwaGVyIHR5cGUiKSk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJfSBlbHNlIHsKKwkJLypSZXNldCBwcmV2aW91cyBjaXBoZXIgc3VpdGUgdG8gbm9uZSAqLworCQlzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfY2lwaGVyKHBBZGFwdGVyLCAwLCB0cnVlKTsKKwkJaWYgKDAgPiBzdGF0dXMpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiZmFpbGVkIHRvIHNldCB1bmljYXN0IGNpcGhlciB0eXBlIikpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCS8qc2V0IGdyb3VwIGNpcGhlciB0eXBlICovCisJc3RhdHVzID0KKwkJd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2NpcGhlcihwQWRhcHRlciwgcmVxLT5jcnlwdG8uY2lwaGVyX2dyb3VwLAorCQkJCQkgICAgIGZhbHNlKTsKKworCWlmICgwID4gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiZmFpbGVkIHRvIHNldCBtY2FzdCBjaXBoZXIgdHlwZSIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLk1GUEVuYWJsZWQgPSAocmVxLT5tZnAgPT0gTkw4MDIxMV9NRlBfUkVRVUlSRUQpOworI2VuZGlmCisKKwkvKnBhcnNlIFdQQS9SU04gSUUsIGFuZCBzZXQgdGhlIGNvcnJlc3BvaW5nIGZpbGVkcyBpbiBSb2FtIHByb2ZpbGUgKi8KKwlpZiAocmVxLT5pZV9sZW4pIHsKKwkJc3RhdHVzID0KKwkJCXdsYW5faGRkX2NmZzgwMjExX3NldF9pZShwQWRhcHRlciwgcmVxLT5pZSwgcmVxLT5pZV9sZW4pOworCQlpZiAoMCA+IHN0YXR1cykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJmYWlsZWQgdG8gcGFyc2UgdGhlIFdQQS9SU04gSUUiKSk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJfQorCisJLyppbmNhc2Ugb2YgV0VQIHNldCBkZWZhdWx0IGtleSBpbmZvcm1hdGlvbiAqLworCWlmIChyZXEtPmtleSAmJiByZXEtPmtleV9sZW4pIHsKKwkJaWYgKChXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCA9PSByZXEtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdKQorCQkgICAgfHwgKFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCA9PQorCQkJcmVxLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSkKKwkJICAgICkgeworCQkJaWYgKElXX0FVVEhfS0VZX01HTVRfODAyXzFYCisJCQkgICAgPT0KKwkJCSAgICAocFdleHRTdGF0ZS0+CisJCQkgICAgIGF1dGhLZXlNZ210ICYgSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKCJEeW5hbWljIFdFUCBub3Qgc3VwcG9ydGVkIikpOworCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCX0gZWxzZSB7CisJCQkJdTgga2V5X2xlbiA9IHJlcS0+a2V5X2xlbjsKKwkJCQl1OCBrZXlfaWR4ID0gcmVxLT5rZXlfaWR4OworCisJCQkJaWYgKChlQ1NSX1NFQ1VSSVRZX1dFUF9LRVlTSVpFX01BWF9CWVRFUyA+PQorCQkJCSAgICAga2V5X2xlbikKKwkJCQkgICAgJiYgKENTUl9NQVhfTlVNX0tFWSA+IGtleV9pZHgpCisJCQkJICAgICkgeworCQkJCQloZGRMb2coTE9HMSwKKwkJCQkJCUZMKCJzZXR0aW5nIGRlZmF1bHQgd2VwIGtleSwga2V5X2lkeCA9ICVodSBrZXlfbGVuICVodSIpLAorCQkJCQkJa2V5X2lkeCwga2V5X2xlbik7CisJCQkJCWNkZl9tZW1fY29weSgmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuCisJCQkJCQkgICAgIEtleXMuCisJCQkJCQkgICAgIEtleU1hdGVyaWFsW2tleV9pZHhdWzBdLAorCQkJCQkJICAgICByZXEtPmtleSwga2V5X2xlbik7CisJCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLktleXMuCisJCQkJCUtleUxlbmd0aFtrZXlfaWR4XSA9ICh1OCkga2V5X2xlbjsKKwkJCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy4KKwkJCQkJZGVmYXVsdEluZGV4ID0gKHU4KSBrZXlfaWR4OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdHJ5X2Rpc2Nvbm5lY3QoKSAtIHRyeSBkaXNjb25ubmVjdCBmcm9tIHByZXZpb3VzIGNvbm5lY3Rpb24KKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBhZGFwdGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRpc2Nvbm5lY3QgZnJvbSBwcmV2aW91cyBjb25uZWN0aW9uCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IHdsYW5faGRkX3RyeV9kaXNjb25uZWN0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXVuc2lnbmVkIGxvbmcgcmM7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHg7CisJZU1pYl9kb3QxMURlc2lyZWRCc3NUeXBlIGNvbm5lY3RlZEJzc1R5cGU7CisKKwlwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwloZGRfY29ubl9nZXRfY29ubmVjdGVkX2Jzc190eXBlKHBIZGRTdGFDdHgsICZjb25uZWN0ZWRCc3NUeXBlKTsKKworCWlmICgoZU1pYl9kb3QxMURlc2lyZWRCc3NUeXBlX2luZGVwZW5kZW50ID09IGNvbm5lY3RlZEJzc1R5cGUpIHx8CisJICAgIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgfHwKKwkgICAgKGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCA9PSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSkgeworCQloZGRfY29ubl9zZXRfY29ubmVjdGlvbl9zdGF0ZShwQWRhcHRlciwKKwkJCQkJCWVDb25uZWN0aW9uU3RhdGVfRGlzY29ubmVjdGluZyk7CisJCS8qIElzc3VlIGRpc2Nvbm5lY3QgdG8gQ1NSICovCisJCUlOSVRfQ09NUExFVElPTihwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3Zhcik7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0KKwkJICAgIHNtZV9yb2FtX2Rpc2Nvbm5lY3QoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCQlwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQllQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKSkgeworCQkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnBBZGFwdGVyLT4KKwkJCQkJCQkgZGlzY29ubmVjdF9jb21wX3ZhciwKKwkJCQkJCQkgbXNlY3NfdG9famlmZmllcworCQkJCQkJCQkgKFdMQU5fV0FJVF9USU1FX0RJU0NPTk5FQ1QpKTsKKwkJCWlmICghcmMpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoIlNtZSBkaXNjb25uZWN0IGV2ZW50IHRpbWVkIG91dCBzZXNzaW9uIElkICVkIHN0YURlYnVnU3RhdGUgJWQiKSwKKwkJCQkgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkgICAgICAgcEhkZFN0YUN0eC0+c3RhRGVidWdTdGF0ZSk7CisJCQkJcmV0dXJuIC1FQUxSRUFEWTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZUNvbm5lY3Rpb25TdGF0ZV9EaXNjb25uZWN0aW5nID09CisJCSAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyLAorCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCQkgKFdMQU5fV0FJVF9USU1FX0RJU0NPTk5FQ1QpKTsKKwkJaWYgKCFyYykgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoIkRpc2Nvbm5lY3QgZXZlbnQgdGltZWQgb3V0IHNlc3Npb24gSWQgJWQgc3RhRGVidWdTdGF0ZSAlZCIpLAorCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsIHBIZGRTdGFDdHgtPnN0YURlYnVnU3RhdGUpOworCQkJcmV0dXJuIC1FQUxSRUFEWTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfY29ubmVjdCgpIC0gY2ZnODAyMTEgY29ubmVjdCBhcGkKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQHJlcTogUG9pbnRlciB0byBjZmc4MDIxMSBjb25uZWN0IHJlcXVlc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgdGhlIGFzc29jaWF0aW9uIHByb2Nlc3MKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9jb25uZWN0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKnJlcSkKK3sKKwlpbnQgc3RhdHVzOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKG5kZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0NPTk5FQ1QsCisJCQkgcEFkYXB0ZXItPnNlc3Npb25JZCwgcEFkYXB0ZXItPmRldmljZV9tb2RlKSk7CisJaGRkTG9nKExPRzEsIEZMKCJEZXZpY2VfbW9kZSAlcyglZCkiKSwKKwkJaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhwQWRhcHRlci0+ZGV2aWNlX21vZGUpLAorCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCisJaWYgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSAhPSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OICYmCisJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSAhPSBXTEFOX0hERF9QMlBfQ0xJRU5UKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRGV2aWNlX21vZGUgJXMoJWQpIGlzIG5vdCBzdXBwb3J0ZWQiKSwKKwkJCWhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlpZiAoIXBIZGRDdHgpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBudWxsIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKHJlcS0+Y2hhbm5lbCkgeworCQlpZiAoIWNkc19hbGxvd19jb25jdXJyZW5jeShwSGRkQ3R4LAorCQkJCWNkc19jb252ZXJ0X2RldmljZV9tb2RlX3RvX2hkZF90eXBlKAorCQkJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQkJcmVxLT5jaGFubmVsLT5od192YWx1ZSwgSFdfTU9ERV8yMF9NSFopKSB7CisJCQloZGRfZXJyKCJUaGlzIGNvbmN1cnJlbmN5IGNvbWJpbmF0aW9uIGlzIG5vdCBhbGxvd2VkIik7CisJCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghY2RzX2FsbG93X2NvbmN1cnJlbmN5KHBIZGRDdHgsCisJCQkJY2RzX2NvbnZlcnRfZGV2aWNlX21vZGVfdG9faGRkX3R5cGUoCisJCQkJcEFkYXB0ZXItPmRldmljZV9tb2RlKSwgMCwgSFdfTU9ERV8yMF9NSFopKSB7CisJCQloZGRfZXJyKCJUaGlzIGNvbmN1cnJlbmN5IGNvbWJpbmF0aW9uIGlzIG5vdCBhbGxvd2VkIik7CisJCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKKwkJfQorCX0KKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJd2xhbl9oZGRfZGlzYWJsZV9yb2FtaW5nKHBBZGFwdGVyKTsKKyNlbmRpZgorCisJLypUcnkgZGlzY29ubmVjdGluZyBpZiBhbHJlYWR5IGluIGNvbm5lY3RlZCBzdGF0ZSAqLworCXN0YXR1cyA9IHdsYW5faGRkX3RyeV9kaXNjb25uZWN0KHBBZGFwdGVyKTsKKwlpZiAoMCA+IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gZGlzY29ubmVjdCB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiIpKTsKKwkJcmV0dXJuIC1FQUxSRUFEWTsKKwl9CisKKwkvKmluaXRpYWxpc2Ugc2VjdXJpdHkgcGFyYW1ldGVycyAqLworCXN0YXR1cyA9IHdsYW5faGRkX2NmZzgwMjExX3NldF9wcml2YWN5KHBBZGFwdGVyLCByZXEpOworCisJaWYgKDAgPiBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiZmFpbGVkIHRvIHNldCBzZWN1cml0eSBwYXJhbXMiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaWYgKHJlcS0+Y2hhbm5lbCkgeworCQlzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9jb25uZWN0X3N0YXJ0KHBBZGFwdGVyLCByZXEtPnNzaWQsCisJCQkJCQkJIHJlcS0+c3NpZF9sZW4sCisJCQkJCQkJIHJlcS0+YnNzaWQsCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNSwgMCkpIHx8IFwKKwkJZGVmaW5lZChDRkc4MDIxMV9CU1NJRF9ISU5UX0JBQ0tQT1JUKQorCQkJCQkJCSByZXEtPmJzc2lkX2hpbnQsCisjZWxzZQorCQkJCQkJCSBOVUxMLAorI2VuZGlmCisJCQkJCQkJIHJlcS0+Y2hhbm5lbC0+CisJCQkJCQkJIGh3X3ZhbHVlKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9jb25uZWN0X3N0YXJ0KHBBZGFwdGVyLCByZXEtPnNzaWQsCisJCQkJCQkJIHJlcS0+c3NpZF9sZW4sCisJCQkJCQkJIHJlcS0+YnNzaWQsCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNSwgMCkpIHx8IFwKKwkJZGVmaW5lZChDRkc4MDIxMV9CU1NJRF9ISU5UX0JBQ0tQT1JUKQorCQkJCQkJCSByZXEtPmJzc2lkX2hpbnQsCisjZWxzZQorCQkJCQkJCSBOVUxMLAorI2VuZGlmCisJCQkJCQkJIDApOworCX0KKworCWlmICgwID4gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY29ubmVjdCBmYWlsZWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCUVYSVQoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2Nvbm5lY3QoKSAtIGNmZzgwMjExIGNvbm5lY3QgYXBpCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqIEByZXE6IFBvaW50ZXIgdG8gY2ZnODAyMTEgY29ubmVjdCByZXF1ZXN0CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2Nvbm5lY3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgICAgc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpyZXEpCit7CisJaW50IHJldDsKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfY29ubmVjdCh3aXBoeSwgbmRldiwgcmVxKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdsYW5faGRkX2Rpc2Nvbm5lY3QoKSAtIGhkZCBkaXNjb25uZWN0IGFwaQorICogQHBBZGFwdGVyOiBQb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEByZWFzb246IERpc2Nvbm5lY3QgcmVhc29uIGNvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaXNzdWUgYSBkaXNjb25uZWN0IHJlcXVlc3QgdG8gU01FCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgd2xhbl9oZGRfZGlzY29ubmVjdChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdTE2IHJlYXNvbikKK3sKKwlpbnQgc3RhdHVzLCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGxvbmcgcmM7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKnN0b3AgdHggcXVldWVzICovCisJaGRkTG9nKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCXdsYW5faGRkX25ldGlmX3F1ZXVlX2NvbnRyb2wocEFkYXB0ZXIsIFdMQU5fTkVUSUZfVFhfRElTQUJMRV9OX0NBUlJJRVIsCisJCQkJICAgV0xBTl9DT05UUk9MX1BBVEgpOworCWhkZExvZyhMT0cxLAorCQlGTCgiU2V0IEhERCBjb25uU3RhdGUgdG8gZUNvbm5lY3Rpb25TdGF0ZV9EaXNjb25uZWN0aW5nIikpOworCXBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUgPSBlQ29ubmVjdGlvblN0YXRlX0Rpc2Nvbm5lY3Rpbmc7CisJSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKworCS8qaXNzdWUgZGlzY29ubmVjdCAqLworCisJc3RhdHVzID0gc21lX3JvYW1fZGlzY29ubmVjdChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCByZWFzb24pOworCWlmIChDREZfU1RBVFVTX0NNRF9OT1RfUVVFVUVEID09IHN0YXR1cykgeworCQloZGRMb2coTE9HMSwgRkwoInN0YXR1cyA9ICVkLCBhbHJlYWR5IGRpc2Nvbm5lY3RlZCIpLAorCQkgICAgICAgKGludClzdGF0dXMpOworCQlnb3RvIGRpc2Nvbm5lY3RlZDsKKwl9IGVsc2UgaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoImNzcl9yb2FtX2Rpc2Nvbm5lY3QgZmFpbHVyZSwgcmV0dXJuZWQgJWQiKSwKKwkJCShpbnQpc3RhdHVzKTsKKwkJcEhkZFN0YUN0eC0+c3RhRGVidWdTdGF0ZSA9IHN0YXR1czsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkaXNjb25uZWN0ZWQ7CisJfQorCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3ZhciwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCSAoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworCisJaWYgKCFyYykgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gZGlzY29ubmVjdCwgdGltZWQgb3V0IikpOworCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCX0KK2Rpc2Nvbm5lY3RlZDoKKwloZGRMb2coTE9HMSwKKwkJRkwoIlNldCBIREQgY29ublN0YXRlIHRvIGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkIikpOworCWhkZF9jb25uX3NldF9jb25uZWN0aW9uX3N0YXRlKHBBZGFwdGVyLCBlQ29ubmVjdGlvblN0YXRlX05vdENvbm5lY3RlZCk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDExLCAwKQorCS8qIFNlbmRpbmcgZGlzY29ubmVjdCBldmVudCB0byB1c2Vyc3BhY2UgZm9yIGtlcm5lbCB2ZXJzaW9uIDwgMy4xMQorCSAqIGlzIGhhbmRsZWQgYnkgX19jZmc4MDIxMV9kaXNjb25uZWN0IGNhbGwgdG8gX19jZmc4MDIxMV9kaXNjb25uZWN0ZWQKKwkgKi8KKwloZGRMb2coTE9HMSwgRkwoIlNlbmQgZGlzY29ubmVjdGVkIGV2ZW50IHRvIHVzZXJzcGFjZSIpKTsKKwljZmc4MDIxMV9kaXNjb25uZWN0ZWQocEFkYXB0ZXItPmRldiwgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQsCisJCQkJTlVMTCwgMCwgR0ZQX0tFUk5FTCk7CisjZW5kaWYKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9kaXNjb25uZWN0KCkgLSBjZmc4MDIxMSBkaXNjb25uZWN0IGFwaQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKiBAcmVhc29uOiBEaXNjb25uZWN0IHJlYXNvbiBjb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGlzc3VlIGEgZGlzY29ubmVjdCByZXF1ZXN0IHRvIFNNRQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2Rpc2Nvbm5lY3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcmVhc29uKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaW50IHN0YXR1czsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXVpbnQ4X3Qgc3RhSWR4OworI2VuZGlmCisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0RJU0NPTk5FQ1QsCisJCQkgcEFkYXB0ZXItPnNlc3Npb25JZCwgcmVhc29uKSk7CisJaGRkTG9nKExPRzEsIEZMKCJEZXZpY2VfbW9kZSAlcyglZCkgcmVhc29uIGNvZGUoJWQpIiksCisJCWhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJcEFkYXB0ZXItPmRldmljZV9tb2RlLCByZWFzb24pOworCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBJc3N1ZSBkaXNjb25uZWN0IHJlcXVlc3QgdG8gU01FLCBpZiBzdGF0aW9uIGlzIGluIGNvbm5lY3RlZCBzdGF0ZSAqLworCWlmICgocEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSA9PSBlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQpIHx8CisJICAgIChwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID09IGVDb25uZWN0aW9uU3RhdGVfQ29ubmVjdGluZykpIHsKKwkJZUNzclJvYW1EaXNjb25uZWN0UmVhc29uIHJlYXNvbkNvZGUgPQorCQkJZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRDsKKwkJaGRkX3NjYW5pbmZvX3QgKnBTY2FuSW5mbzsKKworCQlzd2l0Y2ggKHJlYXNvbikgeworCQljYXNlIFdMQU5fUkVBU09OX01JQ19GQUlMVVJFOgorCQkJcmVhc29uQ29kZSA9IGVDU1JfRElTQ09OTkVDVF9SRUFTT05fTUlDX0VSUk9SOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWToKKwkJY2FzZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19BUF9CVVNZOgorCQljYXNlIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQToKKwkJCXJlYXNvbkNvZGUgPSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0RJU0FTU09DOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEOgorCQljYXNlIFdMQU5fUkVBU09OX0NMQVNTMl9GUkFNRV9GUk9NX05PTkFVVEhfU1RBOgorCQkJcmVhc29uQ29kZSA9IGVDU1JfRElTQ09OTkVDVF9SRUFTT05fREVBVVRIOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORzoKKwkJCXJlYXNvbkNvZGUgPQorCQkJCXBIZGRDdHgtPmNvbmZpZy0+CisJCQkJZ0VuYWJsZURlYXV0aFRvRGlzYXNzb2NNYXAgPworCQkJCWVDU1JfRElTQ09OTkVDVF9SRUFTT05fU1RBX0hBU19MRUZUIDoKKwkJCQllQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0RFQVVUSDsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVDoKKwkJCXJlYXNvbkNvZGUgPSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1NUQV9IQVNfTEVGVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVhc29uQ29kZSA9IGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQ7CisJCQlicmVhazsKKwkJfQorCQloZGRMb2coTE9HMSwKKwkJCUZMKCJjb252ZXJ0IHRvIGludGVybmFsIHJlYXNvbiAlZCB0byByZWFzb25Db2RlICVkIiksCisJCQlyZWFzb24sIHJlYXNvbkNvZGUpOworCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID0gZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQ7CisJCXBTY2FuSW5mbyA9ICZwQWRhcHRlci0+c2Nhbl9pbmZvOworCQlpZiAocFNjYW5JbmZvLT5tU2NhblBlbmRpbmcpIHsKKwkJCWhkZExvZyhMT0cxLAorCQkJCUZMKCJEaXNjb25uZWN0IGlzIGluIHByb2dyZXNzLCBBYm9ydGluZyBTY2FuIikpOworCQkJaGRkX2Fib3J0X21hY19zY2FuKHBIZGRDdHgsIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgIGVDU1JfU0NBTl9BQk9SVF9ERUZBVUxUKTsKKwkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJCS8qIEZpcnN0IGNsZWFuIHVwIHRoZSB0ZGxzIHBlZXJzIGlmIGFueSAqLworCQlmb3IgKHN0YUlkeCA9IDA7IHN0YUlkeCA8IHBIZGRDdHgtPm1heF9udW1fdGRsc19zdGE7IHN0YUlkeCsrKSB7CisJCQlpZiAoKHBIZGRDdHgtPnRkbHNDb25uSW5mb1tzdGFJZHhdLnNlc3Npb25JZCA9PQorCQkJICAgICBwQWRhcHRlci0+c2Vzc2lvbklkKQorCQkJICAgICYmIChwSGRkQ3R4LT50ZGxzQ29ubkluZm9bc3RhSWR4XS5zdGFJZCkpIHsKKwkJCQl1aW50OF90ICptYWM7CisJCQkJbWFjID0KKwkJCQkJcEhkZEN0eC0+dGRsc0Nvbm5JbmZvW3N0YUlkeF0ucGVlck1hYy5ieXRlczsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgIiVzOiBjYWxsIHNtZV9kZWxldGVfdGRsc19wZWVyX3N0YSBzdGFJZCAlZCBzZXNzaW9uSWQgJWQgIgorCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIsIF9fZnVuY19fLAorCQkJCSAgICAgICBwSGRkQ3R4LT50ZGxzQ29ubkluZm9bc3RhSWR4XS5zdGFJZCwKKwkJCQkgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkobWFjKSk7CisJCQkJc21lX2RlbGV0ZV90ZGxzX3BlZXJfc3RhKFdMQU5fSEREX0dFVF9IQUxfQ1RYCisJCQkJCQkJCSAocEFkYXB0ZXIpLAorCQkJCQkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLCBtYWMpOworCQkJfQorCQl9CisjZW5kaWYKKwkJaGRkTG9nKExPRzEsIEZMKCJEaXNjb25uZWN0aW5nIHdpdGggcmVhc29uY29kZToldSIpLAorCQkgICAgICAgcmVhc29uQ29kZSk7CisJCXN0YXR1cyA9IHdsYW5faGRkX2Rpc2Nvbm5lY3QocEFkYXB0ZXIsIHJlYXNvbkNvZGUpOworCQlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgIEZMKCJmYWlsdXJlLCByZXR1cm5lZCAlZCIpLCBzdGF0dXMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJ1bmV4cGVjdGVkIGNmZyBkaXNjb25uZWN0IGNhbGxlZCB3aGlsZSBpbiBzdGF0ZSAoJWQpIiksCisJCSAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2Rpc2Nvbm5lY3QoKSAtIGNmZzgwMjExIGRpc2Nvbm5lY3QgYXBpCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqIEByZWFzb246IERpc2Nvbm5lY3QgcmVhc29uIGNvZGUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZGlzY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcmVhc29uKQoreworCWludCByZXQ7CisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2Rpc2Nvbm5lY3Qod2lwaHksIGRldiwgcmVhc29uKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3NldF9wcml2YWN5X2lic3MoKSAtIHNldCBpYnNzIHByaXZhY3kKKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBhZGFwdGVyCisgKiBAcGFyYW06IFBvaW50ZXIgdG8gSUJTUyBwYXJhbWV0ZXJzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlY3VyaXR5IHNldHRpbmdzIGluIElCU1MgbW9kZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcHJpdmFjeV9pYnNzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMKKwkJCQkJICAgICAgKnBhcmFtcykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwloZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwllQ3NyRW5jcnlwdGlvblR5cGUgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwlFTlRFUigpOworCisJcFdleHRTdGF0ZS0+d3BhVmVyc2lvbiA9IElXX0FVVEhfV1BBX1ZFUlNJT05fRElTQUJMRUQ7CisJY2RmX21lbV96ZXJvKCZwSGRkU3RhQ3R4LT5pYnNzX2VuY19rZXksIHNpemVvZih0Q3NyUm9hbVNldEtleSkpOworCXBIZGRTdGFDdHgtPmlic3NfZW5jX2tleV9pbnN0YWxsZWQgPSAwOworCisJaWYgKHBhcmFtcy0+aWVfbGVuICYmIChOVUxMICE9IHBhcmFtcy0+aWUpKSB7CisJCWlmICh3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWVfcHRyKHBhcmFtcy0+aWUsCisJCQkJCSBwYXJhbXMtPmllX2xlbiwgV0xBTl9FSURfUlNOKSkgeworCQkJcFdleHRTdGF0ZS0+d3BhVmVyc2lvbiA9IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMjsKKwkJCWVuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworCQl9IGVsc2UgaWYgKGhkZF9pc193cGFpZV9wcmVzZW50KHBhcmFtcy0+aWUsIHBhcmFtcy0+aWVfbGVuKSkgeworCQkJdERvdDExZklFV1BBIGRvdDExV1BBSUU7CisJCQl0SGFsSGFuZGxlIGhhbEhhbmRsZSA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwkJCXU4ICppZTsKKworCQkJbWVtc2V0KCZkb3QxMVdQQUlFLCAwLCBzaXplb2YoZG90MTFXUEFJRSkpOworCQkJaWUgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWVfcHRyKHBhcmFtcy0+aWUsCisJCQkJCQkJICBwYXJhbXMtPmllX2xlbiwKKwkJCQkJCQkgIERPVDExRl9FSURfV1BBKTsKKwkJCWlmIChOVUxMICE9IGllKSB7CisJCQkJcFdleHRTdGF0ZS0+d3BhVmVyc2lvbiA9CisJCQkJCUlXX0FVVEhfV1BBX1ZFUlNJT05fV1BBOworCQkJCS8qIFVucGFjayB0aGUgV1BBIElFICovCisJCQkJLyogU2tpcCBwYXN0IHRoZSBFSUQgYnl0ZSBhbmQgbGVuZ3RoIGJ5dGUgLSBhbmQgZm91ciBieXRlIFdpRmkgT1VJICovCisJCQkJZG90MTFmX3VucGFja19pZV93cGEoKHRwQW5pU2lyR2xvYmFsKSBoYWxIYW5kbGUsCisJCQkJCQkgICAgICZpZVsyICsgNF0sCisJCQkJCQkgICAgIGllWzFdIC0gNCwgJmRvdDExV1BBSUUpOworCQkJCS8qRXh0cmFjdCB0aGUgbXVsdGljYXN0IGNpcGhlciwgdGhlIGVuY1R5cGUgZm9yIHVuaWNhc3QKKwkJCQkgICBjaXBoZXIgZm9yIHdwYS1ub25lIGlzIG5vbmUgKi8KKwkJCQllbmNyeXB0aW9uVHlwZSA9CisJCQkJCWhkZF90cmFuc2xhdGVfd3BhX3RvX2Nzcl9lbmNyeXB0aW9uX3R5cGUKKwkJCQkJCShkb3QxMVdQQUlFLm11bHRpY2FzdF9jaXBoZXIpOworCQkJfQorCQl9CisKKwkJc3RhdHVzID0KKwkJCXdsYW5faGRkX2NmZzgwMjExX3NldF9pZShwQWRhcHRlciwgcGFyYW1zLT5pZSwKKwkJCQkJCSBwYXJhbXMtPmllX2xlbik7CisKKwkJaWYgKDAgPiBzdGF0dXMpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiZmFpbGVkIHRvIHBhcnNlIFdQQS9SU04gSUUiKSk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJfQorCisJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuQXV0aFR5cGUuYXV0aFR5cGVbMF0gPQorCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKworCWlmIChwYXJhbXMtPnByaXZhY3kpIHsKKwkJLyogU2VjdXJpdHkgZW5hYmxlZCBJQlNTLCBBdCB0aGlzIHRpbWUgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24KKwkJICogYXZhaWxhYmxlIGFib3V0IHRoZSBzZWN1cml0eSBwYXJhbXRlcnMsIHNvIGluaXRpYWxpc2UgdGhlCisJCSAqIGVuY3J5cHRpb24gdHlwZSB0byBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVkuCisJCSAqIFRoZSBjb3JyZWN0IHNlY3VyaXR5IHBhcmFtZXRlcnMgd2lsbCBiZSB1cGRhdGVkIGxhdGVyIGluCisJCSAqIHdsYW5faGRkX2NmZzgwMjExX2FkZF9rZXkgSGFsIGV4cGVjdHMgZW5jcnlwdGlvbiB0eXBlIHRvIGJlCisJCSAqIHNldCBpbm9yZGVyIGVuYWJsZSBwcml2YWN5IGJpdCBpbiBiZWFjb25zCisJCSAqLworCisJCWVuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOworCX0KKwloZGRMb2coTE9HMiwgRkwoImVuY3J5cHRpb25UeXBlPSVkIiksIGVuY3J5cHRpb25UeXBlKTsKKwlwSGRkU3RhQ3R4LT5jb25uX2luZm8udWNFbmNyeXB0aW9uVHlwZSA9IGVuY3J5cHRpb25UeXBlOworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0KKwkJZW5jcnlwdGlvblR5cGU7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2pvaW5faWJzcygpIC0gam9pbiBpYnNzCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqIEBwYXJhbTogUG9pbnRlciB0byBJQlNTIGpvaW4gcGFyYW1ldGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUvam9pbiBhbiBJQlNTIG5ldHdvcmsKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9qb2luX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgKnBhcmFtcykKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCXRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlOworCWludCBzdGF0dXM7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJc3RydWN0IGNkZl9tYWNfYWRkciBic3NpZDsKKwl1OCBjaGFubmVsTnVtID0gMDsKKwlwX2Nkc19jb250ZXh0VHlwZSBwX2Nkc19jb250ZXh0OworCisJRU5URVIoKTsKKworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFwX2Nkc19jb250ZXh0KSB7CisJCWhkZF9lcnIoIkludmFsaWQgQ0RTIGNvbnRleHQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0pPSU5fSUJTUywKKwkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLCBwQWRhcHRlci0+ZGV2aWNlX21vZGUpKTsKKwloZGRMb2coTE9HMSwgRkwoIkRldmljZV9tb2RlICVzKCVkKSIpLAorCQloZGRfZGV2aWNlX21vZGVfdG9fc3RyaW5nKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmIChOVUxMICE9CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA4LCAwKSkKKwkJcGFyYW1zLT5jaGFuZGVmLmNoYW4pCisjZWxzZQorCQlwYXJhbXMtPmNoYW5uZWwpCisjZW5kaWYKKwl7CisJCXVpbnQzMl90IG51bUNoYW5zID0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOOworCQl1aW50OF90IHZhbGlkQ2hhbltXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworCQl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJCWludCBpbmR4OworCisJCS8qIEdldCBjaGFubmVsIG51bWJlciAqLworCQljaGFubmVsTnVtID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkpCisJCQlwYXJhbXMtPgorCQkJY2hhbmRlZi4KKwkJCWNoYW4tPgorCQkJY2VudGVyX2ZyZXEpOworI2Vsc2UKKwkJCXBhcmFtcy0+CisJCQljaGFubmVsLT4KKwkJCWNlbnRlcl9mcmVxKTsKKyNlbmRpZgorCisJCWlmICgwICE9IHNtZV9jZmdfZ2V0X3N0cihoSGFsLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCwKKwkJCQkJIHZhbGlkQ2hhbiwgJm51bUNoYW5zKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJObyB2YWxpZCBjaGFubmVsIGxpc3QiKSk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKworCQlmb3IgKGluZHggPSAwOyBpbmR4IDwgbnVtQ2hhbnM7IGluZHgrKykgeworCQkJaWYgKGNoYW5uZWxOdW0gPT0gdmFsaWRDaGFuW2luZHhdKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGluZHggPj0gbnVtQ2hhbnMpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJOb3QgdmFsaWQgQ2hhbm5lbCAlZCIpLCBjaGFubmVsTnVtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKCFjZHNfYWxsb3dfY29uY3VycmVuY3kocEhkZEN0eCwgQ0RTX0lCU1NfTU9ERSwgY2hhbm5lbE51bSwKKwkJSFdfTU9ERV8yMF9NSFopKSB7CisJCWhkZF9lcnIoIlRoaXMgY29uY3VycmVuY3kgY29tYmluYXRpb24gaXMgbm90IGFsbG93ZWQiKTsKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisJfQorCWlmIChwSGRkQ3R4LT5jb25maWctPnBvbGljeV9tYW5hZ2VyX2VuYWJsZWQpIHsKKwkJc3RhdHVzID0gY2RmX2V2ZW50X3Jlc2V0KAorCQkJCSZwX2Nkc19jb250ZXh0LT5jb25uZWN0aW9uX3VwZGF0ZV9kb25lX2V2dCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQloZGRfZXJyKCJFUlI6IGNsZWFyIGV2ZW50IGZhaWxlZCIpOworCisJCXN0YXR1cyA9IGNkc19jdXJyZW50X2Nvbm5lY3Rpb25zX3VwZGF0ZShwSGRkQ3R4LAorCQkJCQkJCQljaGFubmVsTnVtKTsKKwkJaWYgKENERl9TVEFUVVNfRV9GQUlMVVJFID09IHN0YXR1cykgeworCQkJaGRkX2VycigiRVJST1I6IGNvbm5lY3Rpb25zIHVwZGF0ZSBmYWlsZWQhISIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQkJc3RhdHVzID0gY2RmX3dhaXRfc2luZ2xlX2V2ZW50KAorCQkJCSAgICAmcF9jZHNfY29udGV4dC0+Y29ubmVjdGlvbl91cGRhdGVfZG9uZV9ldnQsCisJCQkJICAgIENPTk5FQ1RJT05fVVBEQVRFX1RJTUVPVVQpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCWhkZF9lcnIoIkVSUk9SOiBjZGYgd2FpdCBmb3IgZXZlbnQgZmFpbGVkISEiKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCS8qVHJ5IGRpc2Nvbm5lY3RpbmcgaWYgYWxyZWFkeSBpbiBjb25uZWN0ZWQgc3RhdGUgKi8KKwlzdGF0dXMgPSB3bGFuX2hkZF90cnlfZGlzY29ubmVjdChwQWRhcHRlcik7CisJaWYgKDAgPiBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgiRmFpbGVkIHRvIGRpc2Nvbm5lY3QgdGhlIGV4aXN0aW5nIElCU1MgY29ubmVjdGlvbiIpKTsKKwkJcmV0dXJuIC1FQUxSRUFEWTsKKwl9CisKKwlwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisKKwlpZiAoZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTICE9IHBSb2FtUHJvZmlsZS0+QlNTVHlwZSkgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJJbnRlcmZhY2UgdHlwZSBpcyBub3Qgc2V0IHRvIElCU1MiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGVuYWJsZSBzZWxlY3RlZCBwcm90ZWN0aW9uIGNoZWNrcyBpbiBJQlNTIG1vZGUgKi8KKwlwUm9hbVByb2ZpbGUtPmNmZ19wcm90ZWN0aW9uID0gSUJTU19DRkdfUFJPVEVDVElPTl9FTkFCTEVfTUFTSzsKKworCWlmIChDREZfU1RBVFVTX0VfRkFJTFVSRSA9PSBzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwKKwkJCQkJCSAgICBXTklfQ0ZHX0lCU1NfQVRJTV9XSU5fU0laRSwKKwkJCQkJCSAgICBwSGRkQ3R4LT5jb25maWctPgorCQkJCQkJICAgIGlic3NBVElNV2luU2l6ZSkpIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19JQlNTX0FUSU1fV0lOX1NJWkUgdG8gQ0NNIikpOworCX0KKworCS8qIEJTU0lEIGlzIHByb3ZpZGVkIGJ5IHVwcGVyIGxheWVycyBoZW5jZSBubyBuZWVkIHRvIEFVVE8gZ2VuZXJhdGUgKi8KKwlpZiAoTlVMTCAhPSBwYXJhbXMtPmJzc2lkKSB7CisJCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19JQlNTX0FVVE9fQlNTSUQsIDApCisJCQkJPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJjY21DZmdTdEludCBmYWlsZWQgZm9yIFdOSV9DRkdfSUJTU19BVVRPX0JTU0lEIikpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJY2RmX21lbV9jb3B5KGJzc2lkLmJ5dGVzLCBwYXJhbXMtPmJzc2lkLCBDREZfTUFDX0FERFJfU0laRSk7CisJfSBlbHNlIGlmIChwSGRkQ3R4LT5jb25maWctPmlzQ29hbGVzaW5nSW5JQlNTQWxsb3dlZCA9PSAwKSB7CisJCWlmIChzbWVfY2ZnX3NldF9pbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19JQlNTX0FVVE9fQlNTSUQsIDApCisJCQkJPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJjY21DZmdTdEludCBmYWlsZWQgZm9yIFdOSV9DRkdfSUJTU19BVVRPX0JTU0lEIikpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJY2RmX2NvcHlfbWFjYWRkcigmYnNzaWQsICZwSGRkQ3R4LT5jb25maWctPklic3NCc3NpZCk7CisJfQorCWlmICgocGFyYW1zLT5iZWFjb25faW50ZXJ2YWwgPiBDRkdfQkVBQ09OX0lOVEVSVkFMX01JTikKKwkgICAgJiYgKHBhcmFtcy0+YmVhY29uX2ludGVydmFsIDw9IENGR19CRUFDT05fSU5URVJWQUxfTUFYKSkKKwkJcFJvYW1Qcm9maWxlLT5iZWFjb25JbnRlcnZhbCA9IHBhcmFtcy0+YmVhY29uX2ludGVydmFsOworCWVsc2UgeworCQlwUm9hbVByb2ZpbGUtPmJlYWNvbkludGVydmFsID0gQ0ZHX0JFQUNPTl9JTlRFUlZBTF9ERUZBVUxUOworCQloZGRMb2coTE9HMiwKKwkJICAgICAgIEZMKCJpbnB1dCBiZWFjb24gaW50ZXJ2YWwgJWQgVFUgaXMgaW52YWxpZCwgdXNlIGRlZmF1bHQgJWQgVFUiKSwKKwkJCXBhcmFtcy0+YmVhY29uX2ludGVydmFsLCBwUm9hbVByb2ZpbGUtPmJlYWNvbkludGVydmFsKTsKKwl9CisKKwkvKiBTZXQgQ2hhbm5lbCAqLworCWlmIChjaGFubmVsTnVtKQl7CisJCS8qIFNldCB0aGUgT3BlcmF0aW9uYWwgQ2hhbm5lbCAqLworCQloZGRMb2coTE9HMiwgRkwoInNldCBjaGFubmVsICVkIiksIGNoYW5uZWxOdW0pOworCQlwUm9hbVByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAxOworCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8ub3BlcmF0aW9uQ2hhbm5lbCA9IGNoYW5uZWxOdW07CisJCXBSb2FtUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPQorCQkJJnBIZGRTdGFDdHgtPmNvbm5faW5mby5vcGVyYXRpb25DaGFubmVsOworCX0KKworCS8qIEluaXRpYWxpemUgc2VjdXJpdHkgcGFyYW1ldGVycyAqLworCXN0YXR1cyA9IHdsYW5faGRkX2NmZzgwMjExX3NldF9wcml2YWN5X2lic3MocEFkYXB0ZXIsIHBhcmFtcyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiZmFpbGVkIHRvIHNldCBzZWN1cml0eSBwYXJhbWV0ZXJzIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIElzc3VlIGNvbm5lY3Qgc3RhcnQgKi8KKwlzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9jb25uZWN0X3N0YXJ0KHBBZGFwdGVyLCBwYXJhbXMtPnNzaWQsCisJCQkJCQkgcGFyYW1zLT5zc2lkX2xlbiwKKwkJCQkJCSBic3NpZC5ieXRlcywKKwkJCQkJCSBOVUxMLAorCQkJCQkJIHBIZGRTdGFDdHgtPmNvbm5faW5mby4KKwkJCQkJCSBvcGVyYXRpb25DaGFubmVsKTsKKworCWlmICgwID4gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY29ubmVjdCBmYWlsZWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfam9pbl9pYnNzKCkgLSBqb2luIGlic3MKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQHBhcmFtOiBQb2ludGVyIHRvIElCU1Mgam9pbiBwYXJhbWV0ZXJzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZS9qb2luIGFuIElCU1MgbmV0d29yaworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9qb2luX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGNmZzgwMjExX2lic3NfcGFyYW1zICpwYXJhbXMpCit7CisJaW50IHJldCA9IDA7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfam9pbl9pYnNzKHdpcGh5LCBkZXYsIHBhcmFtcyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2xlYXZlX2lic3MoKSAtIGxlYXZlIGlic3MKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsZWF2ZSBhbiBJQlNTIG5ldHdvcmsKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9sZWF2ZV9pYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCXRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlpbnQgc3RhdHVzOworCUNERl9TVEFUVVMgaGFsX3N0YXR1czsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfTEVBVkVfSUJTUywKKwkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fSUJTU19MRUFWRSkpOworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWhkZExvZyhMT0cxLCBGTCgiRGV2aWNlX21vZGUgJXMoJWQpIiksCisJCWhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKwlpZiAoTlVMTCA9PSBwV2V4dFN0YXRlKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRGF0YSBTdG9yYWdlIENvcnJ1cHRpb24iKSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXBSb2FtUHJvZmlsZSA9ICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZTsKKworCS8qIElzc3VlIGRpc2Nvbm5lY3Qgb25seSBpZiBpbnRlcmZhY2UgdHlwZSBpcyBzZXQgdG8gSUJTUyAqLworCWlmIChlQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1MgIT0gcFJvYW1Qcm9maWxlLT5CU1NUeXBlKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIkJTUyBUeXBlIGlzIG5vdCBzZXQgdG8gSUJTUyIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSXNzdWUgRGlzY29ubmVjdCByZXF1ZXN0ICovCisJSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKwloYWxfc3RhdHVzID0gc21lX3JvYW1fZGlzY29ubmVjdChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9JQlNTX0xFQVZFKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhoYWxfc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJzbWVfcm9hbV9kaXNjb25uZWN0IGZhaWxlZCBoYWxfc3RhdHVzKCVkKSIpLAorCQkgICAgICAgaGFsX3N0YXR1cyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2xlYXZlX2lic3MoKSAtIGxlYXZlIGlic3MKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsZWF2ZSBhbiBJQlNTIG5ldHdvcmsKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfbGVhdmVfaWJzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQgPSAwOworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2xlYXZlX2lic3Mod2lwaHksIGRldik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3NldF93aXBoeV9wYXJhbXMoKSAtIHNldCB3aXBoeSBwYXJhbWV0ZXJzCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBjaGFuZ2VkOiBQYXJhbWV0ZXJzIGNoYW5nZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBwaHkgcGFyYW1ldGVycy4gUlRTIFRocmVzaG9sZC9GUkFHCisgKiBUaHJlc2hvbGQvUmV0cnkgQ291bnQgZXRjLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3NldF93aXBoeV9wYXJhbXMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCXUzMiBjaGFuZ2VkKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwl0SGFsSGFuZGxlIGhIYWwgPSBwSGRkQ3R4LT5oSGFsOworCWludCBzdGF0dXM7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX0NGRzgwMjExX1NFVF9XSVBIWV9QQVJBTVMsCisJCQkgTk9fU0VTU0lPTiwgd2lwaHktPnJ0c190aHJlc2hvbGQpKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoY2hhbmdlZCAmIFdJUEhZX1BBUkFNX1JUU19USFJFU0hPTEQpIHsKKwkJdTMyIHJ0c190aHJlc2hvbGQgPSAod2lwaHktPnJ0c190aHJlc2hvbGQgPT0gLTEpID8KKwkJCQkgICAgV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1BWCA6IHdpcGh5LT5ydHNfdGhyZXNob2xkOworCisJCWlmICgoV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1JTiA+IHJ0c190aHJlc2hvbGQpIHx8CisJCSAgICAoV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1BWCA8IHJ0c190aHJlc2hvbGQpKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQlGTCgiSW52YWxpZCBSVFMgVGhyZXNob2xkIHZhbHVlICV1IiksCisJCQkJcnRzX3RocmVzaG9sZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICgwICE9IHNtZV9jZmdfc2V0X2ludChoSGFsLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsCisJCQkJCXJ0c190aHJlc2hvbGQpKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQlGTCgic21lX2NmZ19zZXRfaW50IGZhaWxlZCBmb3IgcnRzX3RocmVzaG9sZCB2YWx1ZSAldSIpLAorCQkJCXJ0c190aHJlc2hvbGQpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQloZGRMb2coTE9HMiwgRkwoInNldCBydHMgdGhyZXNob2xkICV1IiksIHJ0c190aHJlc2hvbGQpOworCX0KKworCWlmIChjaGFuZ2VkICYgV0lQSFlfUEFSQU1fRlJBR19USFJFU0hPTEQpIHsKKwkJdTE2IGZyYWdfdGhyZXNob2xkID0gKHdpcGh5LT5mcmFnX3RocmVzaG9sZCA9PSAtMSkgPworCQkJCSAgICAgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNQVggOgorCQkJCSAgICAgd2lwaHktPmZyYWdfdGhyZXNob2xkOworCisJCWlmICgoV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNSU4gPiBmcmFnX3RocmVzaG9sZCkgfHwKKwkJICAgIChXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX1NUQU1BWCA8IGZyYWdfdGhyZXNob2xkKSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoIkludmFsaWQgZnJhZ190aHJlc2hvbGQgdmFsdWUgJWh1IiksCisJCQkJZnJhZ190aHJlc2hvbGQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoMCAhPSBzbWVfY2ZnX3NldF9pbnQoaEhhbCwgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwKKwkJCQkJIGZyYWdfdGhyZXNob2xkKSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoInNtZV9jZmdfc2V0X2ludCBmYWlsZWQgZm9yIGZyYWdfdGhyZXNob2xkIHZhbHVlICVodSIpLAorCQkJCWZyYWdfdGhyZXNob2xkKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaGRkTG9nKExPRzIsIEZMKCJzZXQgZnJhZyB0aHJlc2hvbGQgJWh1IiksIGZyYWdfdGhyZXNob2xkKTsKKwl9CisKKwlpZiAoKGNoYW5nZWQgJiBXSVBIWV9QQVJBTV9SRVRSWV9TSE9SVCkKKwkgICAgfHwgKGNoYW5nZWQgJiBXSVBIWV9QQVJBTV9SRVRSWV9MT05HKSkgeworCQl1OCByZXRyeV92YWx1ZSA9IChjaGFuZ2VkICYgV0lQSFlfUEFSQU1fUkVUUllfU0hPUlQpID8KKwkJCQkgd2lwaHktPnJldHJ5X3Nob3J0IDogd2lwaHktPnJldHJ5X2xvbmc7CisKKwkJaWYgKChXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVRfU1RBTUlOID4gcmV0cnlfdmFsdWUpIHx8CisJCSAgICAoV05JX0NGR19MT05HX1JFVFJZX0xJTUlUX1NUQU1BWCA8IHJldHJ5X3ZhbHVlKSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoIkludmFsaWQgUmV0cnkgY291bnQgJWh1IiksIHJldHJ5X3ZhbHVlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNoYW5nZWQgJiBXSVBIWV9QQVJBTV9SRVRSWV9TSE9SVCkgeworCQkJaWYgKDAgIT0gc21lX2NmZ19zZXRfaW50KGhIYWwsCisJCQkJCQlXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVQsCisJCQkJCQlyZXRyeV92YWx1ZSkpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJRkwoInNtZV9jZmdfc2V0X2ludCBmYWlsZWQgZm9yIGxvbmcgcmV0cnkgY291bnQgJWh1IiksCisJCQkJCXJldHJ5X3ZhbHVlKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWhkZExvZyhMT0cyLAorCQkJCUZMKCJzZXQgbG9uZyByZXRyeSBjb3VudCAlaHUiKSwgcmV0cnlfdmFsdWUpOworCQl9IGVsc2UgaWYgKGNoYW5nZWQgJiBXSVBIWV9QQVJBTV9SRVRSWV9TSE9SVCkgeworCQkJaWYgKDAgIT0gc21lX2NmZ19zZXRfaW50KGhIYWwsCisJCQkJCQlXTklfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlULAorCQkJCQkJcmV0cnlfdmFsdWUpKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJCUZMKCJzbWVfY2ZnX3NldF9pbnQgZmFpbGVkIGZvciBzaG9ydCByZXRyeSBjb3VudCAlaHUiKSwKKwkJCQkJcmV0cnlfdmFsdWUpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaGRkTG9nKExPRzIsCisJCQkgICAgICAgRkwoInNldCBzaG9ydCByZXRyeSBjb3VudCAlaHUiKSwgcmV0cnlfdmFsdWUpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3dpcGh5X3BhcmFtcygpIC0gc2V0IHdpcGh5IHBhcmFtZXRlcnMKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGNoYW5nZWQ6IFBhcmFtZXRlcnMgY2hhbmdlZAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfd2lwaHlfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksIHUzMiBjaGFuZ2VkKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3dpcGh5X3BhcmFtcyh3aXBoeSwgY2hhbmdlZCk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX3NldF9kZWZhdWx0X21nbXRfa2V5KCkgLSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiBzZXQgZGVmYXVsdCBtZ210CisgKgkJCQkgICAgIGtleQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKiBAa2V5X2luZGV4OiBLZXkgaW5kZXgKKyAqCisgKiBSZXR1cm46IDAKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX3NldF9kZWZhdWx0X21nbXRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCQkgdTgga2V5X2luZGV4KQoreworCUVOVEVSKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfc2V0X2RlZmF1bHRfbWdtdF9rZXkoKSAtIFNTUiB3cmFwcGVyIGZvcgorICoJCQkJd2xhbl9oZGRfc2V0X2RlZmF1bHRfbWdtdF9rZXkKKyAqIEB3aXBoeTogcG9pbnRlciB0byB3aXBoeQorICogQG5ldGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogQGtleV9pbmRleDoga2V5IGluZGV4CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfc2V0X2RlZmF1bHRfbWdtdF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkJICAgdTgga2V5X2luZGV4KQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfc2V0X2RlZmF1bHRfbWdtdF9rZXkod2lwaHksIG5ldGRldiwga2V5X2luZGV4KTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA0LCAwKSkKKy8qKgorICogX193bGFuX2hkZF9zZXRfdHhxX3BhcmFtcygpIC0gZHVtbXkgaW1wbGVtZW50YXRpb24gb2Ygc2V0IHR4IHF1ZXVlIHBhcmFtcworICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKiBAcGFyYW1zOiBQb2ludGVyIHRvIHR4IHF1ZXVlIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IDAKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX3NldF90eHFfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3R4cV9wYXJhbXMgKnBhcmFtcykKK3sKKwlFTlRFUigpOworCXJldHVybiAwOworfQorI2Vsc2UKKy8qKgorICogX193bGFuX2hkZF9zZXRfdHhxX3BhcmFtcygpIC0gZHVtbXkgaW1wbGVtZW50YXRpb24gb2Ygc2V0IHR4IHF1ZXVlIHBhcmFtcworICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAcGFyYW1zOiBQb2ludGVyIHRvIHR4IHF1ZXVlIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IDAKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX3NldF90eHFfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV90eHFfcGFyYW1zICpwYXJhbXMpCit7CisJRU5URVIoKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBMSU5VWF9WRVJTSU9OX0NPREUgKi8KKworLyoqCisgKiB3bGFuX2hkZF9zZXRfdHhxX3BhcmFtcygpIC0gU1NSIHdyYXBwZXIgZm9yIHdsYW5faGRkX3NldF90eHFfcGFyYW1zCisgKiBAd2lwaHk6IHBvaW50ZXIgdG8gd2lwaHkKKyAqIEBuZXRkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbXM6IHBvaW50ZXIgdG8gaWVlZTgwMjExX3R4cV9wYXJhbXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUKKyAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNCwgMCkpIHx8IGRlZmluZWQoV0lUSF9CQUNLUE9SVFMpCitzdGF0aWMgaW50IHdsYW5faGRkX3NldF90eHFfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3R4cV9wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX3NldF90eHFfcGFyYW1zKHdpcGh5LCBkZXYsIHBhcmFtcyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKyNlbHNlCitzdGF0aWMgaW50IHdsYW5faGRkX3NldF90eHFfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV90eHFfcGFyYW1zICpwYXJhbXMpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9zZXRfdHhxX3BhcmFtcyh3aXBoeSwgcGFyYW1zKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSAqLworCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3N0YXRpb24oKSAtIGRlbGV0ZSBzdGF0aW9uIHYyCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBwYXJhbTogUG9pbnRlciB0byBkZWxldGUgc3RhdGlvbiBwYXJhbWV0ZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYworaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IHRhZ0NzckRlbFN0YVBhcmFtcyAqcERlbFN0YVBhcmFtcykKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJaGRkX2hvc3RhcGRfc3RhdGVfdCAqaGFwZF9zdGF0ZTsKKwlpbnQgc3RhdHVzOworCXVpbnQ4X3Qgc3RhSWQ7CisJdWludDhfdCAqbWFjOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9ERUxfU1RBLAorCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkpOworCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJbWFjID0gKHVpbnQ4X3QgKikgcERlbFN0YVBhcmFtcy0+cGVlck1hY0FkZHIuYnl0ZXM7CisKKwlpZiAoKFdMQU5fSEREX1NPRlRBUCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJICAgIChXTEFOX0hERF9QMlBfR08gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSkgeworCisJCWhhcGRfc3RhdGUgPSBXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihwQWRhcHRlcik7CisJCWlmICghaGFwZF9zdGF0ZSkgeworCQkJaGRkTG9nKExPR0UsICIlczogSG9zdGFwZCBTdGF0ZSBpcyBOdWxsIiwgX19mdW5jX18pOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoY2RmX2lzX21hY2FkZHJfYnJvYWRjYXN0KChzdHJ1Y3QgY2RmX21hY19hZGRyICopIG1hYykpIHsKKwkJCXVpbnQxNl90IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspIHsKKwkJCQlpZiAoKHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5pc1VzZWQpICYmCisJCQkJICAgICghcEFkYXB0ZXItPmFTdGFJbmZvW2ldLgorCQkJCSAgICAgaXNEZWF1dGhJblByb2dyZXNzKSkgeworCQkJCQljZGZfbWVtX2NvcHkoCisJCQkJCQltYWMsCisJCQkJCQlwQWRhcHRlci0+YVN0YUluZm9baV0uCisJCQkJCQkJbWFjQWRkclNUQS5ieXRlcywKKwkJCQkJCUVUSEVSX0FERFJfTEVOKTsKKwkJCQkJaWYgKGhkZF9pcGFfdWNfaXNfZW5hYmxlZChwSGRkQ3R4KSkgeworCQkJCQkJaGRkX2lwYV93bGFuX2V2dChwQWRhcHRlciwKKwkJCQkJCQlwQWRhcHRlci0+CisJCQkJCQkJCSBhU3RhSW5mb1tpXS4KKwkJCQkJCQkJIHVjU1RBSWQsCisJCQkJCQkJV0xBTl9DTElFTlRfRElTQ09OTkVDVCwKKwkJCQkJCQltYWMpOworCQkJCQl9CisJCQkJCWhkZExvZyhMT0cxLAorCQkJCQkgICAgICAgRkwoIkRlbGV0ZSBTVEEgd2l0aCBNQUM6OiIKKwkJCQkJCSAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKG1hYykpOworCisJCQkJCWlmIChwSGRkQ3R4LT5kZXZfZGZzX2NhY19zdGF0dXMgPT0KKwkJCQkJCQlERlNfQ0FDX0lOX1BST0dSRVNTKQorCQkJCQkJZ290byBmbl9lbmQ7CisKKwkJCQkJY2RmX2V2ZW50X3Jlc2V0KCZoYXBkX3N0YXRlLT5jZGZfZXZlbnQpOworCQkJCQloZGRfc29mdGFwX3N0YV9kaXNhc3NvYyhwQWRhcHRlciwKKwkJCQkJCQkJbWFjKTsKKwkJCQkJY2RmX3N0YXR1cyA9CisJCQkJCQloZGRfc29mdGFwX3N0YV9kZWF1dGgocEFkYXB0ZXIsCisJCQkJCQkJcERlbFN0YVBhcmFtcyk7CisJCQkJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCQkJCXBBZGFwdGVyLT5hU3RhSW5mb1tpXS4KKwkJCQkJCWlzRGVhdXRoSW5Qcm9ncmVzcyA9IHRydWU7CisJCQkJCQljZGZfc3RhdHVzID0KKwkJCQkJCQljZGZfd2FpdF9zaW5nbGVfZXZlbnQoCisJCQkJCQkJCSZoYXBkX3N0YXRlLT5jZGZfZXZlbnQsCisJCQkJCQkJCTEwMDApOworCQkJCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoCisJCQkJCQkJCWNkZl9zdGF0dXMpKQorCQkJCQkJCWhkZExvZyhMT0dFLAorCQkJCQkJCQkiJXM6IERlYXV0aCB3YWl0IHRpbWUgZXhwaXJlZCIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNkZl9zdGF0dXMgPQorCQkJCWhkZF9zb2Z0YXBfZ2V0X3N0YV9pZChwQWRhcHRlciwKKwkJCQkJICAgICAgKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgbWFjLAorCQkJCQkgICAgICAmc3RhSWQpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgRkwoIlNraXAgREVMIFNUQSBhcyB0aGlzIGlzIG5vdCB1c2VkOjoiCisJCQkJCSAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkobWFjKSk7CisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQl9CisKKwkJCWlmIChoZGRfaXBhX3VjX2lzX2VuYWJsZWQocEhkZEN0eCkpIHsKKwkJCQloZGRfaXBhX3dsYW5fZXZ0KHBBZGFwdGVyLCBzdGFJZCwKKwkJCQkJCSBXTEFOX0NMSUVOVF9ESVNDT05ORUNULCBtYWMpOworCQkJfQorCisJCQlpZiAocEFkYXB0ZXItPmFTdGFJbmZvW3N0YUlkXS5pc0RlYXV0aEluUHJvZ3Jlc3MgPT0KKwkJCSAgICB0cnVlKSB7CisJCQkJaGRkTG9nKExPRzEsCisJCQkJICAgICAgIEZMKCJTa2lwIERFTCBTVEEgYXMgZGVhdXRoIGlzIGluIHByb2dyZXNzOjoiCisJCQkJCSAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJICBNQUNfQUREUl9BUlJBWShtYWMpKTsKKwkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCX0KKworCQkJcEFkYXB0ZXItPmFTdGFJbmZvW3N0YUlkXS5pc0RlYXV0aEluUHJvZ3Jlc3MgPSB0cnVlOworCisJCQloZGRMb2coTE9HMSwKKwkJCSAgICAgICBGTCgiRGVsZXRlIFNUQSB3aXRoIE1BQzo6IiBNQUNfQUREUkVTU19TVFIpLAorCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKG1hYykpOworCisJCQkvKiBDYXNlOiBTQVAgaW4gQUNTIHNlbGVjdGVkIERGUyBjaCBhbmQgY2xpZW50IGNvbm5lY3RlZAorCQkJICogTm93IFJhZGFyIGRldGVjdGVkLiBUaGVuIGlmIHJhbmRvbSBjaGFubmVsIGlzIGFub3RoZXIKKwkJCSAqIERGUyBjaCB0aGVuIG5ldyBDQUMgaXMgaW5pdGlhdGVkIGFuZCBubyBUWCBhbGxvd2VkLgorCQkJICogU28gZG8gbm90IHNlbmQgYW55IG1nbXQgZnJhbWVzIGFzIGl0IHdpbGwgdGltZW91dAorCQkJICogZHVyaW5nIENBQy4KKwkJCSAqLworCisJCQlpZiAocEhkZEN0eC0+ZGV2X2Rmc19jYWNfc3RhdHVzID09IERGU19DQUNfSU5fUFJPR1JFU1MpCisJCQkJZ290byBmbl9lbmQ7CisKKwkJCWNkZl9ldmVudF9yZXNldCgmaGFwZF9zdGF0ZS0+Y2RmX2V2ZW50KTsKKwkJCWhkZF9zb2Z0YXBfc3RhX2Rpc2Fzc29jKHBBZGFwdGVyLCBtYWMpOworCQkJY2RmX3N0YXR1cyA9IGhkZF9zb2Z0YXBfc3RhX2RlYXV0aChwQWRhcHRlciwKKwkJCQkJCQkgICBwRGVsU3RhUGFyYW1zKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQkJcEFkYXB0ZXItPmFTdGFJbmZvW3N0YUlkXS5pc0RlYXV0aEluUHJvZ3Jlc3MgPQorCQkJCQlmYWxzZTsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgRkwoIlNUQSByZW1vdmFsIGZhaWxlZCBmb3IgOjoiCisJCQkJCSAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkobWFjKSk7CisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQl9IGVsc2UgeworCQkJCWNkZl9zdGF0dXMgPSBjZGZfd2FpdF9zaW5nbGVfZXZlbnQoCisJCQkJCQkJJmhhcGRfc3RhdGUtPmNkZl9ldmVudCwKKwkJCQkJCQkxMDAwKTsKKwkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCQkJaGRkTG9nKExPR0UsCisJCQkJCQkiJXM6IERlYXV0aCB3YWl0IHRpbWUgZXhwaXJlZCIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQl9CisJCX0KKwl9CisKK2ZuX2VuZDoKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDRkc4MDIxMV9ERUxfU1RBX1YyCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2RlbF9zdGF0aW9uKCkgLSBkZWxldGUgc3RhdGlvbiB2MgorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAcGFyYW06IFBvaW50ZXIgdG8gZGVsZXRlIHN0YXRpb24gcGFyYW1ldGVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3Qgc3RhdGlvbl9kZWxfcGFyYW1ldGVycyAqcGFyYW0pCisjZWxzZQorLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfc3RhdGlvbigpIC0gZGVsZXRlIHN0YXRpb24KKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQG1hYzogUG9pbnRlciB0byBzdGF0aW9uIG1hYyBhZGRyZXNzCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBjb25zdCB1aW50OF90ICptYWMpCisjZWxzZQoraW50IHdsYW5faGRkX2NmZzgwMjExX2RlbF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgdWludDhfdCAqbWFjKQorI2VuZGlmCisjZW5kaWYKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB0YWdDc3JEZWxTdGFQYXJhbXMgZGVsU3RhUGFyYW1zOworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKyNpZmRlZiBDRkc4MDIxMV9ERUxfU1RBX1YyCisJaWYgKE5VTEwgPT0gcGFyYW0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIGFyZ3VtZXQgcGFzc2VkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd2xhbnNhcF9wb3B1bGF0ZV9kZWxfc3RhX3BhcmFtcyhwYXJhbS0+bWFjLCBwYXJhbS0+cmVhc29uX2NvZGUsCisJCQkJCXBhcmFtLT5zdWJ0eXBlLCAmZGVsU3RhUGFyYW1zKTsKKyNlbHNlCisJd2xhbnNhcF9wb3B1bGF0ZV9kZWxfc3RhX3BhcmFtcyhtYWMsIGVTSVJfTUFDX0RFQVVUSF9MRUFWSU5HX0JTU19SRUFTT04sCisJCQkJCShTSVJfTUFDX01HTVRfREVBVVRIID4+IDQpLAorCQkJCQkmZGVsU3RhUGFyYW1zKTsKKyNlbmRpZgorCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3N0YXRpb24od2lwaHksIGRldiwgJmRlbFN0YVBhcmFtcyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2FkZF9zdGF0aW9uKCkgLSBhZGQgc3RhdGlvbgorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAbWFjOiBQb2ludGVyIHRvIHN0YXRpb24gbWFjIGFkZHJlc3MKKyAqIEBwbWtzYTogUG9pbnRlciB0byBhZGQgc3RhdGlvbiBwYXJhbWV0ZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9hZGRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICBjb25zdCB1aW50OF90ICptYWMsCisJCQkJCSAgIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlpbnQgc3RhdHVzID0gLUVQRVJNOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJdTMyIG1hc2ssIHNldDsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfQUREX1NUQSwKKwkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLCBwYXJhbXMtPmxpc3Rlbl9pbnRlcnZhbCkpOworCisJaWYgKDAgIT0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWFzayA9IHBhcmFtcy0+c3RhX2ZsYWdzX21hc2s7CisKKwlzZXQgPSBwYXJhbXMtPnN0YV9mbGFnc19zZXQ7CisKKwloZGRMb2coTE9HMSwgRkwoIm1hc2sgMHgleCBzZXQgMHgleCAiIE1BQ19BRERSRVNTX1NUUiksIG1hc2ssIHNldCwKKwkJTUFDX0FERFJfQVJSQVkobWFjKSk7CisKKwlpZiAobWFzayAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpIHsKKwkJaWYgKHNldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpIHsKKwkJCXN0YXR1cyA9CisJCQkJd2xhbl9oZGRfdGRsc19hZGRfc3RhdGlvbih3aXBoeSwgZGV2LCBtYWMsIDAsIE5VTEwpOworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9hZGRfc3RhdGlvbigpIC0gYWRkIHN0YXRpb24KKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQG1hYzogUG9pbnRlciB0byBzdGF0aW9uIG1hYyBhZGRyZXNzCisgKiBAcG1rc2E6IFBvaW50ZXIgdG8gYWRkIHN0YXRpb24gcGFyYW1ldGVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2FkZF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgY29uc3QgdWludDhfdCAqbWFjLAorCQkJCQkgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQorI2Vsc2UKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfYWRkX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQ4X3QgKm1hYywKKwkJCQkJIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcykKKyNlbmRpZgoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfYWRkX3N0YXRpb24od2lwaHksIGRldiwgbWFjLCBwYXJhbXMpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Bta3NhKCkgLSBzZXQgcG1rc2EKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQHBta3NhOiBQb2ludGVyIHRvIHNldCBwbWtzYSBwYXJhbWV0ZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfcG1rc2Eoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgY2ZnODAyMTFfcG1rc2EgKnBta3NhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXRIYWxIYW5kbGUgaGFsSGFuZGxlOworCUNERl9TVEFUVVMgcmVzdWx0ID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWludCBzdGF0dXM7CisJdFBta2lkQ2FjaGVJbmZvIHBta19pZDsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFwbWtzYSkgeworCQloZGRMb2coTE9HRSwgRkwoInBta3NhIGlzIE5VTEwiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcG1rc2EtPmJzc2lkIHx8ICFwbWtzYS0+cG1raWQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwbWtzYS0+YnNzaWQoJXApIG9yIHBta3NhLT5wbWtpZCglcCkgaXMgTlVMTCIpLAorCQkgICAgICAgcG1rc2EtPmJzc2lkLCBwbWtzYS0+cG1raWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZGRMb2coTE9HVywgRkwoInNldCBQTUtTQSBmb3IgIiBNQUNfQUREUkVTU19TVFIpLAorCQlNQUNfQUREUl9BUlJBWShwbWtzYS0+YnNzaWQpKTsKKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaGFsSGFuZGxlID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCisJY2RmX21lbV9jb3B5KHBta19pZC5CU1NJRC5ieXRlcywgcG1rc2EtPmJzc2lkLCBFVEhFUl9BRERSX0xFTik7CisJY2RmX21lbV9jb3B5KHBta19pZC5QTUtJRCwgcG1rc2EtPnBta2lkLCBDU1JfUlNOX1BNS0lEX1NJWkUpOworCisJLyogQWRkIHRvIHRoZSBQTUtTQSBJRCBDYWNoZSBpbiBDU1IgKi8KKwlyZXN1bHQgPSBzbWVfcm9hbV9zZXRfcG1raWRfY2FjaGUoaGFsSGFuZGxlLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICZwbWtfaWQsIDEsIGZhbHNlKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0VUX1BNS1NBLAorCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsIHJlc3VsdCkpOworCisJcmV0dXJuIENERl9JU19TVEFUVVNfU1VDQ0VTUyhyZXN1bHQpID8gMCA6IC1FSU5WQUw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Bta3NhKCkgLSBzZXQgcG1rc2EKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQHBta3NhOiBQb2ludGVyIHRvIHNldCBwbWtzYSBwYXJhbWV0ZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Bta3NhKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9wbWtzYSAqcG1rc2EpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfcG1rc2Eod2lwaHksIGRldiwgcG1rc2EpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9kZWxfcG1rc2EoKSAtIGRlbGV0ZSBwbWtzYQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKiBAcG1rc2E6IFBvaW50ZXIgdG8gcG1rc2EgcGFyYW1ldGVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3Bta3NhKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGNmZzgwMjExX3Bta3NhICpwbWtzYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwl0SGFsSGFuZGxlIGhhbEhhbmRsZTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFwbWtzYSkgeworCQloZGRMb2coTE9HRSwgRkwoInBta3NhIGlzIE5VTEwiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcG1rc2EtPmJzc2lkKSB7CisJCWhkZExvZyhMT0dFLCBGTCgicG1rc2EtPmJzc2lkIGlzIE5VTEwiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfREVCVUcsIEZMKCJEZWxldGluZyBQTUtTQSBmb3IgIiBNQUNfQUREUkVTU19TVFIpLAorCSAgICAgICBNQUNfQUREUl9BUlJBWShwbWtzYS0+YnNzaWQpKTsKKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaGFsSGFuZGxlID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCisJLyogRGVsZXRlIHRoZSBQTUtJRCBDU1IgY2FjaGUgKi8KKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJICAgIHNtZV9yb2FtX2RlbF9wbWtpZF9mcm9tX2NhY2hlKGhhbEhhbmRsZSwKKwkJCQkJICBwQWRhcHRlci0+c2Vzc2lvbklkLCBwbWtzYS0+YnNzaWQsCisJCQkJCSAgZmFsc2UpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkIHRvIGRlbGV0ZSBQTUtTQSBmb3IgIiBNQUNfQUREUkVTU19TVFIpLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkocG1rc2EtPmJzc2lkKSk7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfcG1rc2EoKSAtIGRlbGV0ZSBwbWtzYQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKiBAcG1rc2E6IFBvaW50ZXIgdG8gcG1rc2EgcGFyYW1ldGVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2RlbF9wbWtzYShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfcG1rc2EgKnBta3NhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3Bta3NhKHdpcGh5LCBkZXYsIHBta3NhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworCit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9mbHVzaF9wbWtzYSgpIC0gZmx1c2ggcG1rc2EKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2ZsdXNoX3Bta3NhKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJdEhhbEhhbmRsZSBoYWxIYW5kbGU7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhkZExvZyhMT0dXLCBGTCgiRmx1c2hpbmcgUE1LU0EiKSk7CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBSZXRyaWV2ZSBoYWxIYW5kbGUgKi8KKwloYWxIYW5kbGUgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisKKwkvKiBGbHVzaCB0aGUgUE1LSUQgY2FjaGUgaW4gQ1NSICovCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCSAgICBzbWVfcm9hbV9kZWxfcG1raWRfZnJvbV9jYWNoZShoYWxIYW5kbGUsIHBBZGFwdGVyLT5zZXNzaW9uSWQsIE5VTEwsCisJCQkJCSAgdHJ1ZSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDYW5ub3QgZmx1c2ggUE1LSURDYWNoZSIpKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2ZsdXNoX3Bta3NhKCkgLSBmbHVzaCBwbWtzYQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2ZsdXNoX3Bta3NhKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZmx1c2hfcG1rc2Eod2lwaHksIGRldik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgJiYgZGVmaW5lZChLRVJORUxfU1VQUE9SVF8xMVJfQ0ZHODAyMTEpCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Z0X2llcygpIC0gdXBkYXRlIGZhc3QgdHJhbnNpdGlvbiBpZXMKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQGZ0aWU6IFBvaW50ZXIgdG8gZmFzdCB0cmFuc2l0aW9uIGllIHBhcmFtZXRlcgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfZnRfaWVzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGNmZzgwMjExX3VwZGF0ZV9mdF9pZXNfcGFyYW1zICpmdGllKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9VUERBVEVfRlRfSUVTLAorCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpKTsKKwkvKiBBZGRlZCBmb3IgZGVidWcgb24gcmVjZXB0aW9uIG9mIFJlLWFzc29jIFJlcS4gKi8KKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgiQ2FsbGVkIHdpdGggSWUgb2YgbGVuZ3RoID0gJXp1IHdoZW4gbm90IGFzc29jaWF0ZWQiKSwKKwkJICAgICAgIGZ0aWUtPmllX2xlbik7CisJCWhkZExvZyhMT0dFLCBGTCgiU2hvdWxkIGJlIFJlLWFzc29jIFJlcSBJRXMiKSk7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJaGRkTG9nKExPRzEsIEZMKCIlcyBjYWxsZWQgd2l0aCBJZSBvZiBsZW5ndGggPSAlenUiKSwgX19mdW5jX18sCisJICAgICAgIGZ0aWUtPmllX2xlbik7CisjZW5kaWYKKworCS8qIFBhc3MgdGhlIHJlY2VpdmVkIEZUIElFcyB0byBTTUUgKi8KKwlzbWVfc2V0X2Z0X2llcyhXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCSAgICAgICAoY29uc3QgdTggKilmdGllLT5pZSwgZnRpZS0+aWVfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfZnRfaWVzKCkgLSB1cGRhdGUgZmFzdCB0cmFuc2l0aW9uIGllcworICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKiBAZnRpZTogUG9pbnRlciB0byBmYXN0IHRyYW5zaXRpb24gaWUgcGFyYW1ldGVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50Cit3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfZnRfaWVzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY2ZnODAyMTFfdXBkYXRlX2Z0X2llc19wYXJhbXMgKmZ0aWUpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfZnRfaWVzKHdpcGh5LCBkZXYsIGZ0aWUpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfcmVwbGF5X2NvdW50ZXJfY2FsbGJhY2soKSAtIHJlcGxheSBjb3VudGVyIGNhbGxiYWNrCisgKiBAY2FsbGJhY2tDb250ZXh0OiBDYWxsYmFjayBjb250ZXh0CisgKiBAcEd0a09mZmxvYWRHZXRJbmZvUnNwOiBQb2ludGVyIHRvIGd0ayBvZmZsb2FkIHJlc3BvbnNlIHBhcmFtZXRlcgorICoKKyAqIENhbGxiYWNrIHJvdW50aW5lIGNhbGxlZCB1cG9uIHJlY2VpdmluZyByZXNwb25zZSBmb3IgZ2V0IG9mZmxvYWQgaW5mbworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9yZXBsYXlfY291bnRlcl9jYWxsYmFjayh2b2lkICpjYWxsYmFja0NvbnRleHQsCisJCQkJCQl0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zCisJCQkJCQlwR3RrT2ZmbG9hZEdldEluZm9Sc3ApCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCAqKSBjYWxsYmFja0NvbnRleHQ7CisJdWludDhfdCB0ZW1wUmVwbGF5Q291bnRlcls4XTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eDsKKworCUVOVEVSKCk7CisKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBhZGFwdGVyIGlzIE51bGwiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTlVMTCA9PSBwR3RrT2ZmbG9hZEdldEluZm9Sc3ApIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwR3RrT2ZmbG9hZEdldEluZm9Sc3AgaXMgTnVsbCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gcEd0a09mZmxvYWRHZXRJbmZvUnNwLT51bFN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIndsYW4gRmFpbGVkIHRvIGdldCByZXBsYXkgY291bnRlciB2YWx1ZSIpKTsKKwkJcmV0dXJuOworCX0KKworCXBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwkvKiBVcGRhdGUgcmVwbGF5IGNvdW50ZXIgKi8KKwlwSGRkU3RhQ3R4LT5ndGtPZmZsb2FkUmVxUGFyYW1zLnVsbEtleVJlcGxheUNvdW50ZXIgPQorCQlwR3RrT2ZmbG9hZEdldEluZm9Sc3AtPnVsbEtleVJlcGxheUNvdW50ZXI7CisKKwl7CisJCS8qIGNoYW5naW5nIGZyb20gbGl0dGxlIHRvIGJpZyBlbmRpYW4gc2luY2Ugc3VwcGxpY2FudAorCQkgKiB3b3JrcyBvbiBiaWcgZW5kaWFuIGZvcm1hdAorCQkgKi8KKwkJaW50IGk7CisJCXVpbnQ4X3QgKnAgPQorCQkJKHVpbnQ4X3QgKikgJnBHdGtPZmZsb2FkR2V0SW5mb1JzcC0+dWxsS2V5UmVwbGF5Q291bnRlcjsKKworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQl0ZW1wUmVwbGF5Q291bnRlcls3IC0gaV0gPSAodWludDhfdCkgcFtpXTsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSByZXBsYXkgY291bnRlciB0byBOTCAqLworCWNmZzgwMjExX2d0a19yZWtleV9ub3RpZnkocEFkYXB0ZXItPmRldiwgcEd0a09mZmxvYWRHZXRJbmZvUnNwLT5ic3NJZCwKKwkJCQkgIHRlbXBSZXBsYXlDb3VudGVyLCBHRlBfS0VSTkVMKTsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9yZWtleV9kYXRhKCkgLSBzZXQgcmVrZXkgZGF0YQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKiBAZGF0YTogUG9pbnRlciB0byByZWtleSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG9mZmxvYWQgR1RLIHJla2V5aW5nIGpvYiB0byB0aGUgZmlybXdhcmUuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfcmVrZXlfZGF0YShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfZ3RrX3Jla2V5X2RhdGEgKmRhdGEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHg7CisJdEhhbEhhbmRsZSBoSGFsOworCWludCByZXN1bHQ7CisJdFNpckd0a09mZmxvYWRQYXJhbXMgaGRkR3RrT2ZmbG9hZFJlcVBhcmFtczsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9TRVRfUkVLRVlfREFUQSwKKwkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLCBwQWRhcHRlci0+ZGV2aWNlX21vZGUpKTsKKworCXJlc3VsdCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSByZXN1bHQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCWhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJaWYgKE5VTEwgPT0gaEhhbCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhBTCBjb250ZXh0IGlzIE51bGwhISEiKSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXBIZGRTdGFDdHgtPmd0a09mZmxvYWRSZXFQYXJhbXMudWxGbGFncyA9IEdUS19PRkZMT0FEX0VOQUJMRTsKKwltZW1jcHkocEhkZFN0YUN0eC0+Z3RrT2ZmbG9hZFJlcVBhcmFtcy5hS0NLLCBkYXRhLT5rY2ssCisJICAgICAgIE5MODAyMTFfS0NLX0xFTik7CisJbWVtY3B5KHBIZGRTdGFDdHgtPmd0a09mZmxvYWRSZXFQYXJhbXMuYUtFSywgZGF0YS0+a2VrLAorCSAgICAgICBOTDgwMjExX0tFS19MRU4pOworCW1lbWNweShwSGRkU3RhQ3R4LT5ndGtPZmZsb2FkUmVxUGFyYW1zLmJzc0lkLAorCSAgICAgICAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLCBDREZfTUFDX0FERFJfU0laRSk7CisJeworCQkvKiBjaGFuZ2luZyBmcm9tIGJpZyB0byBsaXR0bGUgZW5kaWFuIHNpbmNlIGRyaXZlcgorCQkgKiB3b3JrcyBvbiBsaXR0bGUgZW5kaWFuIGZvcm1hdAorCQkgKi8KKwkJdWludDhfdCAqcCA9CisJCQkodWludDhfdCAqKSAmcEhkZFN0YUN0eC0+Z3RrT2ZmbG9hZFJlcVBhcmFtcy4KKwkJCXVsbEtleVJlcGxheUNvdW50ZXI7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBbNyAtIGldID0gZGF0YS0+cmVwbGF5X2N0cltpXTsKKwkJfQorCX0KKworCWlmICh0cnVlID09IHBIZGRDdHgtPmhkZF93bGFuX3N1c3BlbmRlZCkgeworCQkvKiBpZiB3bGFuIGlzIHN1c3BlbmRlZCwgZW5hYmxlIEdUSyBvZmZsb2FkIGRpcmVjdGx5IGZyb20gaGVyZSAqLworCQltZW1jcHkoJmhkZEd0a09mZmxvYWRSZXFQYXJhbXMsCisJCSAgICAgICAmcEhkZFN0YUN0eC0+Z3RrT2ZmbG9hZFJlcVBhcmFtcywKKwkJICAgICAgIHNpemVvZih0U2lyR3RrT2ZmbG9hZFBhcmFtcykpOworCQlzdGF0dXMgPQorCQkJc21lX3NldF9ndGtfb2ZmbG9hZChoSGFsLCAmaGRkR3RrT2ZmbG9hZFJlcVBhcmFtcywKKwkJCQkJICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQpOworCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQloZGRMb2coTE9HRSwgRkwoInNtZV9zZXRfZ3RrX29mZmxvYWQgZmFpbGVkLCBzdGF0dXMoJWQpIiksCisJCQkgICAgICAgc3RhdHVzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWhkZExvZyhMT0cxLCBGTCgic21lX3NldF9ndGtfb2ZmbG9hZCBzdWNjZXNzZnVsIikpOworCX0gZWxzZSB7CisJCWhkZExvZyhMT0cxLAorCQkgICAgICAgRkwoIndsYW4gbm90IHN1c3BlbmRlZCBHVEtPZmZsb2FkIHJlcXVlc3QgaXMgc3RvcmVkIikpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Jla2V5X2RhdGEoKSAtIHNldCByZWtleSBkYXRhCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqIEBkYXRhOiBQb2ludGVyIHRvIHJla2V5IGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gb2ZmbG9hZCBHVEsgcmVrZXlpbmcgam9iIHRvIHRoZSBmaXJtd2FyZS4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcmVrZXlfZGF0YShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9ndGtfcmVrZXlfZGF0YSAqZGF0YSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9yZWtleV9kYXRhKHdpcGh5LCBkZXYsIGRhdGEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLypXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQgKi8KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9tYWNfYWNsKCkgLSBzZXQgYWNjZXNzIGNvbnRyb2wgcG9saWN5CisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqIEBwYXJhbTogUG9pbnRlciB0byBhY2Nlc3MgY29udHJvbCBwYXJhbWV0ZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfbWFjX2FjbChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9hY2xfZGF0YSAqcGFyYW1zKQoreworCWludCBpOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2hvc3RhcGRfc3RhdGVfdCAqcEhvc3RhcGRTdGF0ZTsKKwl0c2FwX0NvbmZpZ190ICpwQ29uZmlnOworCXZfQ09OVEVYVF90IHBfY2RzX2NvbnRleHQgPSBOVUxMOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJaW50IHN0YXR1czsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoTlVMTCA9PSBwYXJhbXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwYXJhbXMgaXMgTnVsbCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcF9jZHNfY29udGV4dCA9IHBIZGRDdHgtPnBjZHNfY29udGV4dDsKKwlwSG9zdGFwZFN0YXRlID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisJaWYgKE5VTEwgPT0gcEhvc3RhcGRTdGF0ZSkgeworCQloZGRMb2coTE9HRSwgRkwoInBIb3N0YXBkU3RhdGUgaXMgTnVsbCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGRkTG9nKExPR0UsICJhY2wgcG9saWN5OiA9ICVkIG5vIGFjbCBlbnRyaWVzID0gJWQiLCBwYXJhbXMtPmFjbF9wb2xpY3ksCisJCXBhcmFtcy0+bl9hY2xfZW50cmllcyk7CisKKwlpZiAoV0xBTl9IRERfU09GVEFQID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQlwQ29uZmlnID0gJnBBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnNhcENvbmZpZzsKKworCQkvKiBkZWZhdWx0IHZhbHVlICovCisJCXBDb25maWctPm51bV9hY2NlcHRfbWFjID0gMDsKKwkJcENvbmZpZy0+bnVtX2RlbnlfbWFjID0gMDsKKworCQkvKioKKwkJICogYWNjZXNzIGNvbnRyb2wgcG9saWN5CisJCSAqIEBOTDgwMjExX0FDTF9QT0xJQ1lfQUNDRVBUX1VOTEVTU19MSVNURUQ6IERlbnkgc3RhdGlvbnMgd2hpY2ggYXJlCisJCSAqICAgbGlzdGVkIGluIGhvc3RhcGQuZGVueSBmaWxlLgorCQkgKiBATkw4MDIxMV9BQ0xfUE9MSUNZX0RFTllfVU5MRVNTX0xJU1RFRDogQWxsb3cgc3RhdGlvbnMgd2hpY2ggYXJlCisJCSAqICAgbGlzdGVkIGluIGhvc3RhcGQuYWNjZXB0IGZpbGUuCisJCSAqLworCQlpZiAoTkw4MDIxMV9BQ0xfUE9MSUNZX0RFTllfVU5MRVNTX0xJU1RFRCA9PSBwYXJhbXMtPmFjbF9wb2xpY3kpIHsKKwkJCXBDb25maWctPlNhcE1hY2FkZHJfYWNsID0gZVNBUF9ERU5ZX1VOTEVTU19BQ0NFUFRFRDsKKwkJfSBlbHNlIGlmIChOTDgwMjExX0FDTF9QT0xJQ1lfQUNDRVBUX1VOTEVTU19MSVNURUQgPT0KKwkJCSAgIHBhcmFtcy0+YWNsX3BvbGljeSkgeworCQkJcENvbmZpZy0+U2FwTWFjYWRkcl9hY2wgPSBlU0FQX0FDQ0VQVF9VTkxFU1NfREVOSUVEOworCQl9IGVsc2UgeworCQkJaGRkTG9nKExPR0UsIEZMKCJBY2wgUG9saWN5IDogJWQgaXMgbm90IHN1cHBvcnRlZCIpLAorCQkJCXBhcmFtcy0+YWNsX3BvbGljeSk7CisJCQlyZXR1cm4gLUVOT1RTVVBQOworCQl9CisKKwkJaWYgKGVTQVBfREVOWV9VTkxFU1NfQUNDRVBURUQgPT0gcENvbmZpZy0+U2FwTWFjYWRkcl9hY2wpIHsKKwkJCXBDb25maWctPm51bV9hY2NlcHRfbWFjID0gcGFyYW1zLT5uX2FjbF9lbnRyaWVzOworCQkJZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+bl9hY2xfZW50cmllczsgaSsrKSB7CisJCQkJaGRkTG9nKExPRzEsCisJCQkJCUZMKCIqKiBBZGQgQUNMIE1BQyBlbnRyeSAlaSBpbiBXaGlsZXRMaXN0IDoiCisJCQkJCU1BQ19BRERSRVNTX1NUUiksIGksCisJCQkJCU1BQ19BRERSX0FSUkFZKAorCQkJCQkJcGFyYW1zLT5tYWNfYWRkcnNbaV0uYWRkcikpOworCisJCQkJY2RmX21lbV9jb3B5KCZwQ29uZmlnLT5hY2NlcHRfbWFjW2ldLAorCQkJCQkgICAgIHBhcmFtcy0+bWFjX2FkZHJzW2ldLmFkZHIsCisJCQkJCSAgICAgc2l6ZW9mKHFjbWFjYWRkcikpOworCQkJfQorCQl9IGVsc2UgaWYgKGVTQVBfQUNDRVBUX1VOTEVTU19ERU5JRUQgPT0gcENvbmZpZy0+U2FwTWFjYWRkcl9hY2wpIHsKKwkJCXBDb25maWctPm51bV9kZW55X21hYyA9IHBhcmFtcy0+bl9hY2xfZW50cmllczsKKwkJCWZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPm5fYWNsX2VudHJpZXM7IGkrKykgeworCQkJCWhkZExvZyhMT0cxLAorCQkJCQlGTCgiKiogQWRkIEFDTCBNQUMgZW50cnkgJWkgaW4gQmxhY2tMaXN0IDoiCisJCQkJCU1BQ19BRERSRVNTX1NUUiksIGksCisJCQkJCU1BQ19BRERSX0FSUkFZKAorCQkJCQkJcGFyYW1zLT5tYWNfYWRkcnNbaV0uYWRkcikpOworCisJCQkJY2RmX21lbV9jb3B5KCZwQ29uZmlnLT5kZW55X21hY1tpXSwKKwkJCQkJICAgICBwYXJhbXMtPm1hY19hZGRyc1tpXS5hZGRyLAorCQkJCQkgICAgIHNpemVvZihxY21hY2FkZHIpKTsKKwkJCX0KKwkJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJY2RmX3N0YXR1cyA9CisJCQl3bGFuc2FwX3NldF9tYWNfYWNsKFdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUihwQWRhcHRlciksCisJCQkJCSAgICBwQ29uZmlnKTsKKyNlbHNlCisJCWNkZl9zdGF0dXMgPSB3bGFuc2FwX3NldF9tYWNfYWNsKHBfY2RzX2NvbnRleHQsIHBDb25maWcpOworI2VuZGlmCisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIlNBUCBTZXQgTWFjIEFjbCBmYWlsIikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQloZGRMb2coTE9HMSwgRkwoIkludmFsaWQgZGV2aWNlX21vZGUgJXMoJWQpIiksCisJCQloZGRfZGV2aWNlX21vZGVfdG9fc3RyaW5nKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfbWFjX2FjbCgpIC0gU1NSIHdyYXBwZXIgZm9yCisgKgkJCQlfX3dsYW5faGRkX2NmZzgwMjExX3NldF9tYWNfYWNsCisgKiBAd2lwaHk6IHBvaW50ZXIgdG8gd2lwaHkgc3RydWN0dXJlCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBwYXJhbXM6IHBvaW50ZXIgdG8gY2ZnODAyMTFfYWNsX2RhdGEKKyAqCisgKiBSZXR1cm47IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50Cit3bGFuX2hkZF9jZmc4MDIxMV9zZXRfbWFjX2FjbChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9hY2xfZGF0YSAqcGFyYW1zKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X21hY19hY2wod2lwaHksIGRldiwgcGFyYW1zKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgV0xBTl9OTDgwMjExX1RFU1RNT0RFCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xQSEIKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfbHBoYl9pbmRfaGFuZGxlcigpIC0gaGFuZGxlIGxvdyBwb3dlciBoZWFydCBiZWF0IGluZGljYXRpb24KKyAqIEBwSGRkQ3R4OiBQb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKiBAbHBoYkluZDogUG9pbnRlciB0byBsb3cgcG93ZXIgaGVhcnQgYmVhdCBpbmRpY2F0aW9uIHBhcmFtZXRlcgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdsYW5faGRkX2NmZzgwMjExX2xwaGJfaW5kX2hhbmRsZXIodm9pZCAqcEhkZEN0eCwgdFNpckxQSEJJbmQgKmxwaGJJbmQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWhkZExvZyhMT0dFLCBGTCgiTFBIQiBpbmRpY2F0aW9uIGFycml2ZWQiKSk7CisKKwlpZiAoMCAhPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KChoZGRfY29udGV4dF90ICopIHBIZGRDdHgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiaW52YWxpZCBhcmd1bWVudCBwSGRkQ3R4IikpOworCQlyZXR1cm47CisJfQorCisJaWYgKE5VTEwgPT0gbHBoYkluZCkgeworCQloZGRMb2coTE9HRSwgRkwoImludmFsaWQgYXJndW1lbnQgbHBoYkluZCIpKTsKKwkJcmV0dXJuOworCX0KKworCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX2V2ZW50X3NrYigoKGhkZF9jb250ZXh0X3QgKikgcEhkZEN0eCktPgorCQkJCQkJd2lwaHksIHNpemVvZih0U2lyTFBIQkluZCksCisJCQkJCQlHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQloZGRMb2coTE9HRSwgRkwoIkxQSEIgdGltZW91dCwgTkwgYnVmZmVyIGFsbG9jIGZhaWwiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobmxhX3B1dF91MzIoc2tiLCBXTEFOX0hERF9UTV9BVFRSX0NNRCwgV0xBTl9IRERfVE1fQ01EX1dMQU5fSEIpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiV0xBTl9IRERfVE1fQVRUUl9DTUQgcHV0IGZhaWwiKSk7CisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KKwlpZiAobmxhX3B1dF91MzIoc2tiLCBXTEFOX0hERF9UTV9BVFRSX1RZUEUsIGxwaGJJbmQtPnByb3RvY29sVHlwZSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJXTEFOX0hERF9UTV9BVFRSX1RZUEUgcHV0IGZhaWwiKSk7CisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KKwlpZiAobmxhX3B1dChza2IsIFdMQU5fSEREX1RNX0FUVFJfREFUQSwgc2l6ZW9mKHRTaXJMUEhCSW5kKSwgbHBoYkluZCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJXTEFOX0hERF9UTV9BVFRSX0RBVEEgcHV0IGZhaWwiKSk7CisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KKwljZmc4MDIxMV90ZXN0bW9kZV9ldmVudChza2IsIEdGUF9BVE9NSUMpOworCXJldHVybjsKKworbmxhX3B1dF9mYWlsdXJlOgorCWhkZExvZyhMT0dFLCBGTCgiTkxBIFB1dCBmYWlsIikpOworCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9MUEhCICovCisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV90ZXN0bW9kZSgpIC0gdGVzdCBtb2RlCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkYXRhOiBEYXRhIHBvaW50ZXIKKyAqIEBsZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfdGVzdG1vZGUoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmxhdHRyICp0YltXTEFOX0hERF9UTV9BVFRSX01BWCArIDFdOworCWludCBlcnI7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCisJZXJyID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbmxhX3BhcnNlKHRiLCBXTEFOX0hERF9UTV9BVFRSX01BWCwgZGF0YSwKKwkJCWxlbiwgd2xhbl9oZGRfdG1fcG9saWN5KTsKKwlpZiAoZXJyKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiVGVzdG1vZGUgSU5WIEFUVFIiKSk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCF0YltXTEFOX0hERF9UTV9BVFRSX0NNRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJUZXN0bW9kZSBJTlYgQ01EIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKG5sYV9nZXRfdTMyKHRiW1dMQU5fSEREX1RNX0FUVFJfQ01EXSkpIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTFBIQgorCS8qIExvdyBQb3dlciBIZWFydGJlYXQgY29uZmlndXJhdGlvbiByZXF1ZXN0ICovCisJY2FzZSBXTEFOX0hERF9UTV9DTURfV0xBTl9IQjoKKwl7CisJCWludCBidWZfbGVuOworCQl2b2lkICpidWY7CisJCXRTaXJMUEhCUmVxICpoYl9wYXJhbXMgPSBOVUxMOworCQl0U2lyTFBIQlJlcSAqaGJfcGFyYW1zX3RlbXAgPSBOVUxMOworCQlDREZfU1RBVFVTIHNtZVN0YXR1czsKKworCQlpZiAoIXRiW1dMQU5fSEREX1RNX0FUVFJfREFUQV0pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiVGVzdG1vZGUgSU5WIERBVEEiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWJ1ZiA9IG5sYV9kYXRhKHRiW1dMQU5fSEREX1RNX0FUVFJfREFUQV0pOworCQlidWZfbGVuID0gbmxhX2xlbih0YltXTEFOX0hERF9UTV9BVFRSX0RBVEFdKTsKKworCQloYl9wYXJhbXNfdGVtcCA9ICh0U2lyTFBIQlJlcSAqKSBidWY7CisJCWlmICgoaGJfcGFyYW1zX3RlbXAtPmNtZCA9PSBMUEhCX1NFVF9UQ1BfUEFSQU1TX0lORElEKQorCQkgICAgJiYgKGhiX3BhcmFtc190ZW1wLT5wYXJhbXMubHBoYlRjcFBhcmFtUmVxLgorCQkJdGltZVBlcmlvZFNlYyA9PSAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWhiX3BhcmFtcyA9CisJCQkodFNpckxQSEJSZXEgKikgY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJMUEhCUmVxKSk7CisJCWlmIChOVUxMID09IGhiX3BhcmFtcykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJSZXF1ZXN0IEJ1ZmZlciBBbGxvYyBGYWlsIikpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQljZGZfbWVtX2NvcHkoaGJfcGFyYW1zLCBidWYsIGJ1Zl9sZW4pOworCQlzbWVTdGF0dXMgPQorCQkJc21lX2xwaGJfY29uZmlnX3JlcSgodEhhbEhhbmRsZSkgKHBIZGRDdHgtPmhIYWwpLAorCQkJCQkgICAgaGJfcGFyYW1zLAorCQkJCQkgICAgd2xhbl9oZGRfY2ZnODAyMTFfbHBoYl9pbmRfaGFuZGxlcik7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc21lU3RhdHVzKSB7CisJCQloZGRMb2coTE9HRSwgIkxQSEIgQ29uZmlnIEZhaWwsIGRpc2FibGUiKTsKKwkJCWNkZl9tZW1fZnJlZShoYl9wYXJhbXMpOworCQl9CisJCXJldHVybiAwOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTFBIQiAqLworCisjaWYgIGRlZmluZWQoUUNBX1dJRklfRlRNKQorCWNhc2UgV0xBTl9IRERfVE1fQ01EX1dMQU5fRlRNOgorCXsKKwkJaW50IGJ1Zl9sZW47CisJCXZvaWQgKmJ1ZjsKKwkJQ0RGX1NUQVRVUyBzdGF0dXM7CisJCWlmICghdGJbV0xBTl9IRERfVE1fQVRUUl9EQVRBXSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJXTEFOX0hERF9UTV9BVFRSX0RBVEEgYXR0cmlidXRlIGlzIGludmFsaWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWJ1ZiA9IG5sYV9kYXRhKHRiW1dMQU5fSEREX1RNX0FUVFJfREFUQV0pOworCQlidWZfbGVuID0gbmxhX2xlbih0YltXTEFOX0hERF9UTV9BVFRSX0RBVEFdKTsKKworCQlwcl9pbmZvKCIqKioqRlRNIFR4IGNtZCBsZW4gPSAlZCoqKioqXG4iLCBidWZfbGVuKTsKKworCQlzdGF0dXMgPSB3bGFuX2hkZF9mdG1fdGVzdG1vZGVfY21kKGJ1ZiwgYnVmX2xlbik7CisKKwkJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQllcnIgPSAtRUJVU1k7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJaGRkTG9nKExPR0UsIEZMKCJjb21tYW5kICVkIG5vdCBzdXBwb3J0ZWQiKSwKKwkJICAgICAgIG5sYV9nZXRfdTMyKHRiW1dMQU5fSEREX1RNX0FUVFJfQ01EXSkpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV90ZXN0bW9kZSgpIC0gdGVzdCBtb2RlCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqIEBkYXRhOiBEYXRhIHBvaW50ZXIKKyAqIEBsZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX3Rlc3Rtb2RlKHN0cnVjdCB3aXBoeSAqd2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxMiwgMCkpCisJCQkJICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKyNlbmRpZgorCQkJCSAgICAgIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV90ZXN0bW9kZSh3aXBoeSwgZGF0YSwgbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWYgIGRlZmluZWQoUUNBX1dJRklfRlRNKQorLyoqCisgKiB3bGFuX2hkZF90ZXN0bW9kZV9yeF9ldmVudCgpIC0gdGVzdCBtb2RlIHJ4IGV2ZW50IGhhbmRsZXIKKyAqIEBidWY6IFBvaW50ZXIgdG8gYnVmZmVyCisgKiBAYnVmX2xlbjogQnVmZmVyIGxlbmd0aAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdsYW5faGRkX3Rlc3Rtb2RlX3J4X2V2ZW50KHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCisJaWYgKCFidWYgfHwgIWJ1Zl9sZW4pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogYnVmIG9yIGJ1Zl9sZW4gaW52YWxpZCwgYnVmID0gJXAgYnVmX2xlbiA9ICV6dSIsCisJCQkgIF9fZnVuY19fLCBidWYsIGJ1Zl9sZW4pOworCQlyZXR1cm47CisJfQorCisJaGRkX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJaWYgKCFoZGRfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGhkZCBjb250ZXh0IGludmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlza2IgPSBjZmc4MDIxMV90ZXN0bW9kZV9hbGxvY19ldmVudF9za2IoaGRkX2N0eC0+d2lwaHksCisJCQkJCQlidWZfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgdGVzdG1vZGUgcnggc2tiISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChubGFfcHV0X3UzMihza2IsIFdMQU5fSEREX1RNX0FUVFJfQ01ELCBXTEFOX0hERF9UTV9DTURfV0xBTl9GVE0pIHx8CisJICAgIG5sYV9wdXQoc2tiLCBXTEFOX0hERF9UTV9BVFRSX0RBVEEsIGJ1Zl9sZW4sIGJ1ZikpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJcHJfaW5mbygiKioqKkZUTSBSeCBjbWQgbGVuID0gJXp1KioqKipcbiIsIGJ1Zl9sZW4pOworCisJY2ZnODAyMTFfdGVzdG1vZGVfZXZlbnQoc2tiLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm47CisKK25sYV9wdXRfZmFpbHVyZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiJXM6IG5sYV9wdXQgZmFpbGVkIG9uIHRlc3Rtb2RlIHJ4IHNrYiEiLCBfX2Z1bmNfXyk7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfTkw4MDIxMV9URVNUTU9ERSAqLworCisjaWZkZWYgUUNBX0hUXzIwNDBfQ09FWAorLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9hcF9jaGFubmVsX3dpZHRoKCkgLSBzZXQgYXAgY2hhbm5lbCBiYW5kd2lkdGgKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQGNoYW5kZWY6IFBvaW50ZXIgdG8gY2hhbm5lbCBkZWZpbml0aW9uIHBhcmFtZXRlcgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfYXBfY2hhbm5lbF93aWR0aChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZikKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdFNtZUNvbmZpZ1BhcmFtcyBzbWVfY29uZmlnOworCWJvb2wgY2JNb2RlQ2hhbmdlOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwljZGZfbWVtX3plcm8oJnNtZV9jb25maWcsIHNpemVvZih0U21lQ29uZmlnUGFyYW1zKSk7CisJc21lX2dldF9jb25maWdfcGFyYW0ocEhkZEN0eC0+aEhhbCwgJnNtZV9jb25maWcpOworCXN3aXRjaCAoY2hhbmRlZi0+d2lkdGgpIHsKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF8yMDoKKwkJaWYgKHNtZV9jb25maWcuY3NyQ29uZmlnLmNoYW5uZWxCb25kaW5nTW9kZTI0R0h6ICE9CisJCSAgICBlQ1NSX0lOSV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRCkgeworCQkJc21lX2NvbmZpZy5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPQorCQkJCWVDU1JfSU5JX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCQkJc21lX3VwZGF0ZV9jb25maWcocEhkZEN0eC0+aEhhbCwgJnNtZV9jb25maWcpOworCQkJY2JNb2RlQ2hhbmdlID0gdHJ1ZTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzQwOgorCQlpZiAoc21lX2NvbmZpZy5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPT0KKwkJICAgIGVDU1JfSU5JX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEKSB7CisJCQlpZiAoTkw4MDIxMV9DSEFOX0hUNDBNSU5VUyA9PQorCQkJICAgIGNmZzgwMjExX2dldF9jaGFuZGVmX3R5cGUoY2hhbmRlZikpCisJCQkJc21lX2NvbmZpZy5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPQorCQkJCQllQ1NSX0lOSV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlk7CisJCQllbHNlCisJCQkJc21lX2NvbmZpZy5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPQorCQkJCQllQ1NSX0lOSV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWTsKKwkJCXNtZV91cGRhdGVfY29uZmlnKHBIZGRDdHgtPmhIYWwsICZzbWVfY29uZmlnKTsKKwkJCWNiTW9kZUNoYW5nZSA9IHRydWU7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQloZGRMb2coTE9HRSwgRkwoIkVycm9yISEhIEludmFsaWQgSFQyMC80MCBtb2RlICEiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghY2JNb2RlQ2hhbmdlKQorCQlyZXR1cm4gMDsKKworCWlmIChXTEFOX0hERF9TT0ZUQVAgIT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorCQlyZXR1cm4gMDsKKworCWhkZExvZyhMT0cxLCBGTCgiQ2hhbm5lbCBib25kaW5nIGNoYW5nZWQgdG8gJWQiKSwKKwkgICAgICAgc21lX2NvbmZpZy5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHopOworCisJLyogQ2hhbmdlIFNBUCBodDIwNDAgbW9kZSAqLworCXN0YXR1cyA9IGhkZF9zZXRfc2FwX2h0MjA0MF9tb2RlKHBBZGFwdGVyLAorCQkJCQkgY2ZnODAyMTFfZ2V0X2NoYW5kZWZfdHlwZShjaGFuZGVmKSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJFcnJvciEhISBDYW5ub3Qgc2V0IFNBUCBIVDIwLzQwIG1vZGUhIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfYXBfY2hhbm5lbF93aWR0aCgpIC0gc2V0IGFwIGNoYW5uZWwgYmFuZHdpZHRoCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqIEBjaGFuZGVmOiBQb2ludGVyIHRvIGNoYW5uZWwgZGVmaW5pdGlvbiBwYXJhbWV0ZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK3dsYW5faGRkX2NmZzgwMjExX3NldF9hcF9jaGFubmVsX3dpZHRoKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9hcF9jaGFubmVsX3dpZHRoKHdpcGh5LCBkZXYsIGNoYW5kZWYpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoqCisgKiB3bGFuX2hkZF9jb252ZXJ0X25sX2lmdHlwZV90b19oZGRfdHlwZSgpIC0gcHJvdmlkZXMgdGhlIHR5cGUKKyAqIHRyYW5zbGF0aW9uIGZyb20gTkwgdG8gcG9saWN5IG1hbmFnZXIgdHlwZQorICogQHR5cGU6IEdlbmVyaWMgY29ubmVjdGlvbiBtb2RlIHR5cGUgZGVmaW5lZCBpbiBOTAorICoKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSB0eXBlIHRyYW5zbGF0aW9uCisgKgorICogUmV0dXJuOiBjZHNfY29uX21vZGUgZW51bQorICovCitlbnVtIGNkc19jb25fbW9kZSB3bGFuX2hkZF9jb252ZXJ0X25sX2lmdHlwZV90b19oZGRfdHlwZSgKKwkJCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSkKK3sKKwllbnVtIGNkc19jb25fbW9kZSBtb2RlID0gQ0RTX01BWF9OVU1fT0ZfTU9ERTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCW1vZGUgPSBDRFNfU1RBX01PREU7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKKwkJbW9kZSA9IENEU19QMlBfQ0xJRU5UX01PREU7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgorCQltb2RlID0gQ0RTX1AyUF9HT19NT0RFOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQltb2RlID0gQ0RTX1NBUF9NT0RFOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQltb2RlID0gQ0RTX0lCU1NfTU9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaGRkTG9nKExPR0UsIEZMKCJVbnN1cHBvcnRlZCBpbnRlcmZhY2UgdHlwZSAoJWQpIiksCisJCQkgICB0eXBlKTsKKwl9CisJcmV0dXJuIG1vZGU7Cit9CisKKy8qKgorICogc3RydWN0IGNmZzgwMjExX29wcyAtIGNmZzgwMjExX29wcworICoKKyAqIEBhZGRfdmlydHVhbF9pbnRmOiBBZGQgdmlydHVhbCBpbnRlcmZhY2UKKyAqIEBkZWxfdmlydHVhbF9pbnRmOiBEZWxldGUgdmlydHVhbCBpbnRlcmZhY2UKKyAqIEBjaGFuZ2VfdmlydHVhbF9pbnRmOiBDaGFuZ2UgdmlydHVhbCBpbnRlcmZhY2UKKyAqIEBjaGFuZ2Vfc3RhdGlvbjogQ2hhbmdlIHN0YXRpb24KKyAqIEBhZGRfYmVhY29uOiBBZGQgYmVhY29uIGluIHNhcCBtb2RlCisgKiBAZGVsX2JlYWNvbjogRGVsZXRlIGJlYWNvbiBpbiBzYXAgbW9kZQorICogQHNldF9iZWFjb246IFNldCBiZWFjb24gaW4gc2FwIG1vZGUKKyAqIEBzdGFydF9hcDogU3RhcnQgYXAKKyAqIEBjaGFuZ2VfYmVhY29uOiBDaGFuZ2UgYmVhY29uCisgKiBAc3RvcF9hcDogU3RvcCBhcAorICogQGNoYW5nZV9ic3M6IENoYW5nZSBic3MKKyAqIEBhZGRfa2V5OiBBZGQga2V5CisgKiBAZ2V0X2tleTogR2V0IGtleQorICogQGRlbF9rZXk6IERlbGV0ZSBrZXkKKyAqIEBzZXRfZGVmYXVsdF9rZXk6IFNldCBkZWZhdWx0IGtleQorICogQHNldF9jaGFubmVsOiBTZXQgY2hhbm5lbAorICogQHNjYW46IFNjYW4KKyAqIEBjb25uZWN0OiBDb25uZWN0CisgKiBAZGlzY29ubmVjdDogRGlzY29ubmVjdAorICogQGpvaW5faWJzcyA9IEpvaW4gaWJzcworICogQGxlYXZlX2lic3MgPSBMZWF2ZSBpYnNzCisgKiBAc2V0X3dpcGh5X3BhcmFtcyA9IFNldCB3aXBoeSBwYXJhbXMKKyAqIEBzZXRfdHhfcG93ZXIgPSBTZXQgdHggcG93ZXIKKyAqIEBnZXRfdHhfcG93ZXIgPSBnZXQgdHggcG93ZXIKKyAqIEByZW1haW5fb25fY2hhbm5lbCA9IFJlbWFpbiBvbiBjaGFubmVsCisgKiBAY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsID0gQ2FuY2VsIHJlbWFpbiBvbiBjaGFubmVsCisgKiBAbWdtdF90eCA9IFR4IG1hbmFnZW1lbnQgZnJhbWUKKyAqIEBtZ210X3R4X2NhbmNlbF93YWl0ID0gQ2FuY2VsIG1hbmFnZW1lbnQgdHggd2FpdAorICogQHNldF9kZWZhdWx0X21nbXRfa2V5ID0gU2V0IGRlZmF1bHQgbWFuYWdlbWVudCBrZXkKKyAqIEBzZXRfdHhxX3BhcmFtcyA9IFNldCB0eCBxdWV1ZSBwYXJhbWV0ZXJzCisgKiBAZ2V0X3N0YXRpb24gPSBHZXQgc3RhdGlvbgorICogQHNldF9wb3dlcl9tZ210ID0gU2V0IHBvd2VyIG1hbmFnZW1lbnQKKyAqIEBkZWxfc3RhdGlvbiA9IERlbGV0ZSBzdGF0aW9uCisgKiBAYWRkX3N0YXRpb24gPSBBZGQgc3RhdGlvbgorICogQHNldF9wbWtzYSA9IFNldCBwbWtzYQorICogQGRlbF9wbWtzYSA9IERlbGV0ZSBwbWtzYQorICogQGZsdXNoX3Bta3NhID0gRmx1c2ggcG1rc2EKKyAqIEB1cGRhdGVfZnRfaWVzID0gVXBkYXRlIEZUIElFcworICogQHRkbHNfbWdtdCA9IFRkbHMgbWFuYWdlbWVudAorICogQHRkbHNfb3BlciA9IFRkbHMgb3BlcmF0aW9uCisgKiBAc2V0X3Jla2V5X2RhdGEgPSBTZXQgcmVrZXkgZGF0YQorICogQHNjaGVkX3NjYW5fc3RhcnQgPSBTY2hlZHVsZWQgc2NhbiBzdGFydAorICogQHNjaGVkX3NjYW5fc3RvcCA9IFNjaGVkdWxlZCBzY2FuIHN0b3AKKyAqIEByZXN1bWUgPSBSZXN1bWUgd2xhbgorICogQHN1c3BlbmQgPSBTdXNwZW5kIHdsYW4KKyAqIEBzZXRfbWFjX2FjbCA9IFNldCBtYWMgYWNsCisgKiBAdGVzdG1vZGVfY21kID0gVGVzdCBtb2RlIGNvbW1hbmQKKyAqIEBzZXRfYXBfY2hhbndpZHRoID0gU2V0IEFQIGNoYW5uZWwgYmFuZHdpZHRoCisgKiBAZHVtcF9zdXJ2ZXkgPSBEdW1wIHN1cnZleQorICogQGtleV9tZ210X3NldF9wbWsgPSBTZXQgcG1rIGtleSBtYW5hZ2VtZW50CisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfb3BzIHdsYW5faGRkX2NmZzgwMjExX29wcyA9IHsKKwkuYWRkX3ZpcnR1YWxfaW50ZiA9IHdsYW5faGRkX2FkZF92aXJ0dWFsX2ludGYsCisJLmRlbF92aXJ0dWFsX2ludGYgPSB3bGFuX2hkZF9kZWxfdmlydHVhbF9pbnRmLAorCS5jaGFuZ2VfdmlydHVhbF9pbnRmID0gd2xhbl9oZGRfY2ZnODAyMTFfY2hhbmdlX2lmYWNlLAorCS5jaGFuZ2Vfc3RhdGlvbiA9IHdsYW5faGRkX2NoYW5nZV9zdGF0aW9uLAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA0LCAwKSkKKwkuYWRkX2JlYWNvbiA9IHdsYW5faGRkX2NmZzgwMjExX2FkZF9iZWFjb24sCisJLmRlbF9iZWFjb24gPSB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfYmVhY29uLAorCS5zZXRfYmVhY29uID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2JlYWNvbiwKKyNlbHNlCisJLnN0YXJ0X2FwID0gd2xhbl9oZGRfY2ZnODAyMTFfc3RhcnRfYXAsCisJLmNoYW5nZV9iZWFjb24gPSB3bGFuX2hkZF9jZmc4MDIxMV9jaGFuZ2VfYmVhY29uLAorCS5zdG9wX2FwID0gd2xhbl9oZGRfY2ZnODAyMTFfc3RvcF9hcCwKKyNlbmRpZgorCS5jaGFuZ2VfYnNzID0gd2xhbl9oZGRfY2ZnODAyMTFfY2hhbmdlX2JzcywKKwkuYWRkX2tleSA9IHdsYW5faGRkX2NmZzgwMjExX2FkZF9rZXksCisJLmdldF9rZXkgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfa2V5LAorCS5kZWxfa2V5ID0gd2xhbl9oZGRfY2ZnODAyMTFfZGVsX2tleSwKKwkuc2V0X2RlZmF1bHRfa2V5ID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2RlZmF1bHRfa2V5LAorCS5zY2FuID0gd2xhbl9oZGRfY2ZnODAyMTFfc2NhbiwKKwkuY29ubmVjdCA9IHdsYW5faGRkX2NmZzgwMjExX2Nvbm5lY3QsCisJLmRpc2Nvbm5lY3QgPSB3bGFuX2hkZF9jZmc4MDIxMV9kaXNjb25uZWN0LAorCS5qb2luX2lic3MgPSB3bGFuX2hkZF9jZmc4MDIxMV9qb2luX2lic3MsCisJLmxlYXZlX2lic3MgPSB3bGFuX2hkZF9jZmc4MDIxMV9sZWF2ZV9pYnNzLAorCS5zZXRfd2lwaHlfcGFyYW1zID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3dpcGh5X3BhcmFtcywKKwkuc2V0X3R4X3Bvd2VyID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3R4cG93ZXIsCisJLmdldF90eF9wb3dlciA9IHdsYW5faGRkX2NmZzgwMjExX2dldF90eHBvd2VyLAorCS5yZW1haW5fb25fY2hhbm5lbCA9IHdsYW5faGRkX2NmZzgwMjExX3JlbWFpbl9vbl9jaGFubmVsLAorCS5jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwgPSB3bGFuX2hkZF9jZmc4MDIxMV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwsCisJLm1nbXRfdHggPSB3bGFuX2hkZF9tZ210X3R4LAorCS5tZ210X3R4X2NhbmNlbF93YWl0ID0gd2xhbl9oZGRfY2ZnODAyMTFfbWdtdF90eF9jYW5jZWxfd2FpdCwKKwkuc2V0X2RlZmF1bHRfbWdtdF9rZXkgPSB3bGFuX2hkZF9zZXRfZGVmYXVsdF9tZ210X2tleSwKKwkuc2V0X3R4cV9wYXJhbXMgPSB3bGFuX2hkZF9zZXRfdHhxX3BhcmFtcywKKwkuZ2V0X3N0YXRpb24gPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfc3RhdGlvbiwKKwkuc2V0X3Bvd2VyX21nbXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcG93ZXJfbWdtdCwKKwkuZGVsX3N0YXRpb24gPSB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfc3RhdGlvbiwKKwkuYWRkX3N0YXRpb24gPSB3bGFuX2hkZF9jZmc4MDIxMV9hZGRfc3RhdGlvbiwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJLnNldF9wbWtzYSA9IHdsYW5faGRkX2NmZzgwMjExX3NldF9wbWtzYSwKKwkuZGVsX3Bta3NhID0gd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3Bta3NhLAorCS5mbHVzaF9wbWtzYSA9IHdsYW5faGRkX2NmZzgwMjExX2ZsdXNoX3Bta3NhLAorI2VuZGlmCisjaWYgZGVmaW5lZChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgJiYgZGVmaW5lZChLRVJORUxfU1VQUE9SVF8xMVJfQ0ZHODAyMTEpCisJLnVwZGF0ZV9mdF9pZXMgPSB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfZnRfaWVzLAorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwkudGRsc19tZ210ID0gd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210LAorCS50ZGxzX29wZXIgPSB3bGFuX2hkZF9jZmc4MDIxMV90ZGxzX29wZXIsCisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKwkuc2V0X3Jla2V5X2RhdGEgPSB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcmVrZXlfZGF0YSwKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwkuc2NoZWRfc2Nhbl9zdGFydCA9IHdsYW5faGRkX2NmZzgwMjExX3NjaGVkX3NjYW5fc3RhcnQsCisJLnNjaGVkX3NjYW5fc3RvcCA9IHdsYW5faGRkX2NmZzgwMjExX3NjaGVkX3NjYW5fc3RvcCwKKyNlbmRpZiAvKkZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCS5yZXN1bWUgPSB3bGFuX2hkZF9jZmc4MDIxMV9yZXN1bWVfd2xhbiwKKwkuc3VzcGVuZCA9IHdsYW5faGRkX2NmZzgwMjExX3N1c3BlbmRfd2xhbiwKKwkuc2V0X21hY19hY2wgPSB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfbWFjX2FjbCwKKyNpZmRlZiBXTEFOX05MODAyMTFfVEVTVE1PREUKKwkudGVzdG1vZGVfY21kID0gd2xhbl9oZGRfY2ZnODAyMTFfdGVzdG1vZGUsCisjZW5kaWYKKyNpZmRlZiBRQ0FfSFRfMjA0MF9DT0VYCisJLnNldF9hcF9jaGFud2lkdGggPSB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfYXBfY2hhbm5lbF93aWR0aCwKKyNlbmRpZgorCS5kdW1wX3N1cnZleSA9IHdsYW5faGRkX2NmZzgwMjExX2R1bXBfc3VydmV5LAorfTsKZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9jZmc4MDIxMS5oIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX2NmZzgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM1NzQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9jZmc4MDIxMS5oCkBAIC0wLDAgKzEsMjI3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBET0M6IHdsYW5faGRkX2NmZzgwMjExLmgKKyAqCisgKiBXTEFOIGhvc3QgZGV2aWNlIGRyaXZlciBjZmc4MDIxMSBmdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworCisjaWYgIWRlZmluZWQoSEREX0NGRzgwMjExX0hfXykKKyNkZWZpbmUgSEREX0NGRzgwMjExX0hfXworCisvKiB2YWx1ZSBmb3IgaW5pdGlhbCBwYXJ0IG9mIGZyYW1lcyBhbmQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvbXBhcmVkICovCisjZGVmaW5lIEdBU19JTklUSUFMX1JFUSAiXHgwNFx4MGEiCisjZGVmaW5lIEdBU19JTklUSUFMX1JFUV9TSVpFIDIKKworI2RlZmluZSBHQVNfSU5JVElBTF9SU1AgIlx4MDRceDBiIgorI2RlZmluZSBHQVNfSU5JVElBTF9SU1BfU0laRSAyCisKKyNkZWZpbmUgR0FTX0NPTUVCQUNLX1JFUSAiXHgwNFx4MGMiCisjZGVmaW5lIEdBU19DT01FQkFDS19SRVFfU0laRSAyCisKKyNkZWZpbmUgR0FTX0NPTUVCQUNLX1JTUCAiXHgwNFx4MGQiCisjZGVmaW5lIEdBU19DT01FQkFDS19SU1BfU0laRSAyCisKKyNkZWZpbmUgUDJQX1BVQkxJQ19BQ1RJT05fRlJBTUUgIlx4MDRceDA5XHg1MFx4NmZceDlhXHgwOSIKKyNkZWZpbmUgUDJQX1BVQkxJQ19BQ1RJT05fRlJBTUVfU0laRSA2CisKKyNkZWZpbmUgUDJQX0FDVElPTl9GUkFNRSAiXHg3Zlx4NTBceDZmXHg5YVx4MDkiCisjZGVmaW5lIFAyUF9BQ1RJT05fRlJBTUVfU0laRSA1CisKKyNkZWZpbmUgU0FfUVVFUllfRlJBTUVfUkVRICJceDA4XHgwMCIKKyNkZWZpbmUgU0FfUVVFUllfRlJBTUVfUkVRX1NJWkUgMgorCisjZGVmaW5lIFNBX1FVRVJZX0ZSQU1FX1JTUCAiXHgwOFx4MDEiCisjZGVmaW5lIFNBX1FVRVJZX0ZSQU1FX1JTUF9TSVpFIDIKKworI2RlZmluZSBIRERfUDJQX1dJTERDQVJEX1NTSUQgIkRJUkVDVC0iCisjZGVmaW5lIEhERF9QMlBfV0lMRENBUkRfU1NJRF9MRU4gNworCisjZGVmaW5lIFdOTV9CU1NfQUNUSU9OX0ZSQU1FICJceDBhXHgwNyIKKyNkZWZpbmUgV05NX0JTU19BQ1RJT05fRlJBTUVfU0laRSAyCisKKyNkZWZpbmUgV05NX05PVElGSUNBVElPTl9GUkFNRSAiXHgwYVx4MWEiCisjZGVmaW5lIFdOTV9OT1RJRklDQVRJT05fRlJBTUVfU0laRSAyCisKKyNkZWZpbmUgV1BBX09VSV9UWVBFICAgIlx4MDBceDUwXHhmMlx4MDEiCisjZGVmaW5lIEJMQUNLTElTVF9PVUlfVFlQRSAgICJceDAwXHg1MFx4MDBceDAwIgorI2RlZmluZSBXSElURUxJU1RfT1VJX1RZUEUgICAiXHgwMFx4NTBceDAwXHgwMSIKKyNkZWZpbmUgV1BBX09VSV9UWVBFX1NJWkUgIDQKKyNkZWZpbmUgV01NX09VSV9UWVBFICAgIlx4MDBceDUwXHhmMlx4MDJceDAxIgorI2RlZmluZSBXTU1fT1VJX1RZUEVfU0laRSAgNQorCisjZGVmaW5lIFdMQU5fQlNTX01FTUJFUlNISVBfU0VMRUNUT1JfVkhUX1BIWSAxMjYKKyNkZWZpbmUgV0xBTl9CU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9IVF9QSFkgMTI3CisjZGVmaW5lIEJBU0lDX1JBVEVfTUFTSyAgIDB4ODAKKyNkZWZpbmUgUkFURV9NQVNLICAgICAgICAgMHg3ZgorCisjaWZkZWYgV0xBTl9FTkFCTEVfQUdFSUVfT05fU0NBTl9SRVNVTFRTCisvKiBHUFMgYXBwbGljYXRpb24gcmVxdWlyZW1lbnQgKi8KKyNkZWZpbmUgUUNPTV9WRU5ET1JfSUVfSUQgMjIxCisjZGVmaW5lIFFDT01fT1VJMSAgICAgICAgIDB4MDAKKyNkZWZpbmUgUUNPTV9PVUkyICAgICAgICAgMHhBMAorI2RlZmluZSBRQ09NX09VSTMgICAgICAgICAweEM2CisjZGVmaW5lIFFDT01fVkVORE9SX0lFX0FHRV9UWVBFICAweDEwMAorI2RlZmluZSBRQ09NX1ZFTkRPUl9JRV9BR0VfTEVOICAgKHNpemVvZihxY29tX2llX2FnZSkgLSAyKQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKyNkZWZpbmUgV0xBTl9JU19URExTX1NFVFVQX0FDVElPTihhY3Rpb24pIFwKKwkoKFNJUl9NQUNfVERMU19TRVRVUF9SRVEgPD0gYWN0aW9uKSAmJiBcCisJKFNJUl9NQUNfVERMU19TRVRVUF9DTkYgPj0gYWN0aW9uKSkKKyNpZiAhZGVmaW5lZCAoVERMU19NR01UX1ZFUlNJT04yKQorI2RlZmluZSBURExTX01HTVRfVkVSU0lPTjIgMAorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBNQVhfQ0hBTk5FTCAoTlVNXzI0R0haX0NIQU5ORUxTICsgTlVNXzVHSFpfQ0hBTk5FTFMpCisjZGVmaW5lIE1BWF9TQ0FOX1NTSUQgMTAKKworLyoqCisgKiB0eXBlZGVmIHN0cnVjdCBxY29tX2llX2FnZSAtIGFnZSBpZQorICoKKyAqIEBlbGVtZW50X2lkOiBFbGVtZW50IGlkCisgKiBAbGVuOiBMZW5ndGgKKyAqIEBvdWlfMTogT1VJIDEKKyAqIEBvdWlfMjogT1VJIDIKKyAqIEBvdWlfMzogT1VJIDMKKyAqIEB0eXBlOiBUeXBlCisgKiBAYWdlOiBBZ2UKKyAqIEB0c2ZfZGVsdGE6IHRzZiBkZWx0YSBmcm9tIEZXCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OCBlbGVtZW50X2lkOworCXU4IGxlbjsKKwl1OCBvdWlfMTsKKwl1OCBvdWlfMjsKKwl1OCBvdWlfMzsKKwl1MzIgdHlwZTsKKwl1MzIgYWdlOworCXUzMiB0c2ZfZGVsdGE7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBxY29tX2llX2FnZTsKKyNlbmRpZgorCisvKioKKyAqIGVudW0gZURGU19DQUNfU1RBVFVTOiBDQUMgc3RhdHVzCisgKgorICogQERGU19DQUNfTkVWRVJfRE9ORTogQ0FDIG5ldmVyIGRvbmUKKyAqIEBERlNfQ0FDX0lOX1BST0dSRVNTOiBDQUMgaXMgaW4gcHJvZ3Jlc3MKKyAqIEBERlNfQ0FDX0lOX1BST0dSRVNTOiBDQUMgYWxyZWFkeSBkb25lCisgKi8KK3R5cGVkZWYgZW51bSB7CisJREZTX0NBQ19ORVZFUl9ET05FLAorCURGU19DQUNfSU5fUFJPR1JFU1MsCisJREZTX0NBQ19BTFJFQURZX0RPTkUsCit9IGVERlNfQ0FDX1NUQVRVUzsKKworLyogVmVuZG9yIGlkIHRvIGJlIHVzZWQgaW4gdmVuZG9yIHNwZWNpZmljIGNvbW1hbmQgYW5kIGV2ZW50cworICogdG8gdXNlciBzcGFjZS4KKyAqIE5PVEU6IFRoZSBhdXRob3JpdGF0aXZlIHBsYWNlIGZvciBkZWZpbml0aW9uIG9mIFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwKKyAqIHZlbmRvciBzdWJjbWQgZGVmaW5pdGlvbnMgcHJlZml4ZWQgd2l0aCBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01ELCBhbmQKKyAqIHFjYV93bGFuX3ZlbmRvcl9hdHRyIGlzIG9wZW4gc291cmNlIGZpbGUgc3JjL2NvbW1vbi9xY2EtdmVuZG9yLmggaW4KKyAqIGdpdDovL3cxLmZpL3Nydi9naXQvaG9zdGFwLmdpdDsgdGhlIHZhbHVlcyBoZXJlIGFyZSBqdXN0IGEgY29weSBvZiB0aGF0CisgKi8KKworI2RlZmluZSBRQ0FfTkw4MDIxMV9WRU5ET1JfSUQgICAgICAgICAgIDB4MDAxMzc0CisjZGVmaW5lIE1BWF9SRVFVRVNUX0lECQkJMHhGRkZGRkZGRgorCisvKioKKyAqIGVudW0gcWNhX25sODAyMTFfdmVuZG9yX3N1YmNtZHM6IE5MIDgwMjExIHZlbmRvciBzdWIgY29tbWFuZAorICoKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1VOU1BFQzogVW5zcGVjaWZpZWQKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1RFU1Q6IFRlc3QKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0FWT0lEX0ZSRVFVRU5DWTogQXZvaWQgZnJlcXVlbmN5LgorICoJU3ViIGNvbW1hbmRzIDIgdG8gOSBhcmUgbm90IHVzZWQKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19DQVBBQklMSVRZOiBERlMgY2FwYWJpbGl0eQorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTkFOOiBOYW4KKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1NUQVRTX0VYVDogRXh0IHN0YXRzCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19TRVQ6IExpbmsgbGF5ZXIgc3RhdHMgc2V0CisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19HRVQ6IExpbmsgbGF5ZXIgc3RhdHMgZ2V0CisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19DTFI6IExpbmsgbGF5ZXIgc3RhdHMgY2xlYXIKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX1NUQVRTX1JBRElPX1JFU1VMVFM6IExpbmsgbGF5ZXIgc3RhdHMgcmFkaW8KKyAqCXJlc3VsdHMKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX1NUQVRTX0lGQUNFX1JFU1VMVFM6IExpbmsgbGF5ZXIgc3RhdHMgaW50ZXJmYWNlCisgKglyZXN1bHRzCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19QRUVSU19SRVNVTFRTOiBMaW5rIGxheWVyIHN0YXRzIHBlZXIKKyAqCXJlc3VsdHMKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU1RBUlQ6IEV4dCBzY2FuIHN0YXJ0CisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NUT1A6IEV4dCBzY2FuIHN0b3AKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX1ZBTElEX0NIQU5ORUxTOiBFeHQgc2NhbiBnZXQgdmFsaWQKKyAqCWNoYW5uZWxzCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX0dFVF9DQVBBQklMSVRJRVM6IEV4dCBzY2FuIGdldCBjYXBhYmlsaXR5CisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX0dFVF9DQUNIRURfUkVTVUxUUzogRXh0IHNjYW4gZ2V0IGNhY2hlZAorICoJcmVzdWx0cworICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFOiBFeHQgc2NhbiByZXN1bHRzCisgKglhdmFpbGFibGUuIFVzZWQgd2hlbiByZXBvcnRfdGhyZXNob2xkIGlzIHJlYWNoZWQgaW4gc2NhbiBjYWNoZS4KKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fRlVMTF9TQ0FOX1JFU1VMVDogRXh0IHNjYW4gZnVsbCBzY2FuCisgKglyZXN1bHQuIFVzZWQgdG8gcmVwb3J0IHNjYW4gcmVzdWx0cyB3aGVuIGVhY2ggcHJvYmUgcnNwLiBpcyByZWNlaXZlZCwKKyAqCWlmIHJlcG9ydF9ldmVudHMgZW5hYmxlZCBpbiB3aWZpX3NjYW5fY21kX3BhcmFtcy4KKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU0NBTl9FVkVOVDogRXh0IHNjYW4gZXZlbnQgZnJvbSB0YXJnZXQuCisgKglJbmRpY2F0ZXMgcHJvZ3Jlc3Mgb2Ygc2Nhbm5pbmcgc3RhdGUtbWFjaGluZS4KKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9BUF9GT1VORDogRXh0IHNjYW4gaG90bGlzdAorICoJYXAgZm91bmQKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU0VUX0JTU0lEX0hPVExJU1Q6IEV4dCBzY2FuIHNldCBob3RsaXN0CisgKglic3NpZAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9SRVNFVF9CU1NJRF9IT1RMSVNUOiBFeHQgc2NhbiByZXNldAorICoJaG90bGlzdCBic3NpZAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0U6IEV4dCBzY2FuIHNpZ25pZmljYW50CisgKgljaGFuZ2UKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU0VUX1NJR05JRklDQU5UX0NIQU5HRTogRXh0IHNjYW4gc2V0CisgKglzaWduaWZpY2FudCBjaGFuZ2UKKyAqCWFwIGZvdW5kCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1JFU0VUX1NJR05JRklDQU5UX0NIQU5HRTogRXh0IHNjYW4gcmVzZXQKKyAqCXNpZ25pZmljYW50IGNoYW5nZQorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfVERMU19FTkFCTEU6IEV4dCB0ZGxzIGVuYWJsZQorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfVERMU19ESVNBQkxFOiBFeHQgdGRscyBkaXNhYmxlCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9URExTX0dFVF9TVEFUVVM6IEV4dCB0ZGxzIGdldCBzdGF0dXMKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1RETFNfU1RBVEU6IEV4dCB0ZGxzIHN0YXRlCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfU1VQUE9SVEVEX0ZFQVRVUkVTOiBHZXQgc3VwcG9ydGVkIGZlYXR1cmVzCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TQ0FOTklOR19NQUNfT1VJOiBTZXQgc2Nhbm5pbmdfbWFjX291aQorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTk9fREZTX0ZMQUc6IE5vIERGUyBmbGFnCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYOiBHZXQgQ29uY3VycmVuY3kgTWF0cml4CisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9LRVlfTUdNVF9TRVRfS0VZOiBHZXQgdGhlIGtleSBtZ210IG9mZmxvYWQga2V5cworICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfS0VZX01HTVRfUk9BTV9BVVRIOiBBZnRlciByb2FtaW5nLCBzZW5kIHRoZQorICogcm9hbWluZyBhbmQgYXV0aCBpbmZvcm1hdGlvbi4KKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX09DQl9TRVRfU0NIRUQ6IFNldCBPQ0Igc2NoZWR1bGUKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RPX0FDUzogQUNTIG9mZmxvYWQgZmxhZworICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfR0VUX0ZFQVRVUkVTOiBHZXQgdGhlIHN1cHBvcnRlZCBmZWF0dXJlcyBieSB0aGUKKyAqIGRyaXZlci4KKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19PRkZMT0FEX0NBQ19TVEFSVEVEOiBJbmRpY2F0ZSB0aGF0IGRyaXZlcgorICoJc3RhcnRlZCBDQUMgb24gREZTIGNoYW5uZWwKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19PRkZMT0FEX0NBQ19GSU5JU0hFRDogSW5kaWNhdGUgdGhhdCBkcml2ZXIKKyAqIAljb21wbGV0ZWQgdGhlIENBQyBjaGVjayBvbiBERlMgY2hhbm5lbAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfREZTX09GRkxPQURfQ0FDX0FCT1JURUQ6IEluZGljYXRlIHRoYXQgdGhlIENBQworICogCWNoZWNrIHdhcyBhYm9ydGVkIGJ5IHRoZSBkcml2ZXIKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19PRkZMT0FEX0NBQ19OT1BfRklOSVNIRUQ6IEluZGljYXRlIHRoYXQgdGhlCisgKiAJZHJpdmVyIGNvbXBsZXRlZCBOT1AKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19PRkZMT0FEX1JBREFSX0RFVEVDVEVEOiBJbmRpY2F0ZSB0aGF0IHRoZQorICogCWRyaXZlciBkZXRlY3RlZCByYWRhciBzaWduYWwgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0dFVF9XSUZJX0lORk86IGdldCB3bGFuIGRyaXZlciBpbmZvcm1hdGlvbgorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfV0lGSV9MT0dHRVJfU1RBUlQ6IHN0YXJ0IHdpZmkgbG9nZ2VyCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9XSUZJX0xPR0dFUl9NRU1PUllfRFVNUDogbWVtb3J5IGR1bXAgcmVxdWVzdAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfR0VUX0xPR0dFUl9GRUFUVVJFX1NFVDogZ2V0IGxvZ2dlciBmZWF0dXJlIHNldAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfUk9BTTogcm9hbQorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TRVRfU1NJRF9IT1RMSVNUOiBleHRzY2FuIHNldCBzc2lkIGhvdGxpc3QKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUkVTRVRfU1NJRF9IT1RMSVNUOgorICoJZXh0c2NhbiByZXNldCBzc2lkIGhvdGxpc3QKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9TU0lEX0ZPVU5EOiBob3RsaXN0IHNzaWQgZm91bmQKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9TU0lEX0xPU1Q6IGhvdGxpc3Qgc3NpZCBsb3N0CisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1BOT19TRVRfTElTVDogc2V0IHBubyBsaXN0CisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1BOT19TRVRfUEFTU1BPSU5UX0xJU1Q6IHNldCBwYXNzcG9pbnQgbGlzdAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9QTk9fUkVTRVRfUEFTU1BPSU5UX0xJU1Q6CisgKglyZXNldCBwYXNzcG9pbnQgbGlzdAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9QTk9fTkVUV09SS19GT1VORDogcG5vIG5ldHdvcmsgZm91bmQKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUE5PX1BBU1NQT0lOVF9ORVRXT1JLX0ZPVU5EOgorICoJcGFzc3BvaW50IG5ldHdvcmsgZm91bmQKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1NFVF9XSUZJX0NPTkZJR1VSQVRJT046IHNldCB3aWZpIGNvbmZpZworICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfR0VUX1dJRklfQ09ORklHVVJBVElPTjogZ2V0IHdpZmkgY29uZmlnCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfTE9HR0VSX0ZFQVRVUkVfU0VUOiBnZXQgbG9nZ2luZyBmZWF0dXJlcworICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfVFJJR0dFUl9TQ0FOOiB2ZW5vZHIgc2NhbiBjb21tYW5kCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TQ0FOX0RPTkU6IHZlbmRvciBzY2FuIGNvbXBsZXRlCisgKi8KKworZW51bSBxY2Ffbmw4MDIxMV92ZW5kb3Jfc3ViY21kcyB7CisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9VTlNQRUMgPSAwLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfVEVTVCA9IDEsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9BVk9JRF9GUkVRVUVOQ1kgPSAxMCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19DQVBBQklMSVRZID0gMTEsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9OQU4gPSAxMiwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1NUQVRTX0VYVCA9IDEzLAorCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19TRVQgPSAxNCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX1NUQVRTX0dFVCA9IDE1LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTExfU1RBVFNfQ0xSID0gMTYsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19SQURJT19SRVNVTFRTID0gMTcsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19JRkFDRV9SRVNVTFRTID0gMTgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19QRUVSU19SRVNVTFRTID0gMTksCisKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU1RBUlQgPSAyMCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU1RPUCA9IDIxLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9HRVRfVkFMSURfQ0hBTk5FTFMgPSAyMiwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX0NBUEFCSUxJVElFUyA9IDIzLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9HRVRfQ0FDSEVEX1JFU1VMVFMgPSAyNCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSA9IDI1LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9GVUxMX1NDQU5fUkVTVUxUID0gMjYsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NDQU5fRVZFTlQgPSAyNywKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9BUF9GT1VORCA9IDI4LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TRVRfQlNTSURfSE9UTElTVCA9IDI5LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9SRVNFVF9CU1NJRF9IT1RMSVNUID0gMzAsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRSA9IDMxLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TRVRfU0lHTklGSUNBTlRfQ0hBTkdFID0gMzIsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1JFU0VUX1NJR05JRklDQU5UX0NIQU5HRSA9IDMzLAorCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9URExTX0VOQUJMRSA9IDM0LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfVERMU19ESVNBQkxFID0gMzUsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9URExTX0dFVF9TVEFUVVMgPSAzNiwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1RETFNfU1RBVEUgPSAzNywKKworCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfR0VUX1NVUFBPUlRFRF9GRUFUVVJFUyA9IDM4LAorCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TQ0FOTklOR19NQUNfT1VJID0gMzksCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9OT19ERlNfRkxBRyA9IDQwLAorCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX0hPVExJU1RfQVBfTE9TVCA9IDQxLAorCisJLyogR2V0IENvbmN1cnJlbmN5IE1hdHJpeCAqLworCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfR0VUX0NPTkNVUlJFTkNZX01BVFJJWCA9IDQyLAorCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9LRVlfTUdNVF9TRVRfS0VZID0gNTAsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9LRVlfTUdNVF9ST0FNX0FVVEggPSA1MSwKKworCS8qIERlcHJlY2F0ZWQgKi8KKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX09DQl9TRVRfU0NIRUQgPSA1MywKKworCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRE9fQUNTID0gNTQsCisKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0dFVF9GRUFUVVJFUyA9IDU1LAorCisJLyogT2ZmIGxvYWRlZCBERlMgZXZlbnRzICovCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9DQUNfU1RBUlRFRCA9IDU2LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfREZTX09GRkxPQURfQ0FDX0ZJTklTSEVEID0gNTcsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9DQUNfQUJPUlRFRCA9IDU4LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfREZTX09GRkxPQURfQ0FDX05PUF9GSU5JU0hFRCA9IDU5LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfREZTX09GRkxPQURfUkFEQVJfREVURUNURUQgPSA2MCwKKworCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfR0VUX1dJRklfSU5GTyA9IDYxLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfV0lGSV9MT0dHRVJfU1RBUlQgPSA2MiwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1dJRklfTE9HR0VSX01FTU9SWV9EVU1QID0gNjMsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ST0FNID0gNjQsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NFVF9TU0lEX0hPVExJU1QgPSA2NSwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUkVTRVRfU1NJRF9IT1RMSVNUID0gNjYsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX0hPVExJU1RfU1NJRF9GT1VORCA9IDY3LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX1NTSURfTE9TVCA9IDY4LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9QTk9fU0VUX0xJU1QgPSA2OSwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUE5PX1NFVF9QQVNTUE9JTlRfTElTVCA9IDcwLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9QTk9fUkVTRVRfUEFTU1BPSU5UX0xJU1QgPSA3MSwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUE5PX05FVFdPUktfRk9VTkQgPSA3MiwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUE5PX1BBU1NQT0lOVF9ORVRXT1JLX0ZPVU5EID0gNzMsCisKKwkvKiBXaS1GaSBDb25maWd1cmF0aW9uIHN1YmNvbW1hbmRzICovCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TRVRfV0lGSV9DT05GSUdVUkFUSU9OID0gNzQsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfV0lGSV9DT05GSUdVUkFUSU9OID0gNzUsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfTE9HR0VSX0ZFQVRVUkVfU0VUID0gNzYsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfUklOR19EQVRBID0gNzcsCisKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1RETFNfR0VUX0NBUEFCSUxJVElFUyA9IDc4LAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfT0ZGTE9BREVEX1BBQ0tFVFMgPSA3OSwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX01PTklUT1JfUlNTSSA9IDgwLAorCisJLyogT0NCIGNvbW1hbmRzICovCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9PQ0JfU0VUX0NPTkZJRyA9IDkyLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfT0NCX1NFVF9VVENfVElNRSA9IDkzLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlQgPSA5NCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX09DQl9TVE9QX1RJTUlOR19BRFZFUlQgPSA5NSwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX09DQl9HRVRfVFNGX1RJTUVSID0gOTYsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9EQ0NfR0VUX1NUQVRTID0gOTcsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9EQ0NfQ0xFQVJfU1RBVFMgPSA5OCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RDQ19VUERBVEVfTkRMID0gOTksCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9EQ0NfU1RBVFNfRVZFTlQgPSAxMDAsCisKKwkvKiBEQlMgc3ViY29tbWFuZHMgKi8KKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0dFVF9QUkVGRVJSRURfRlJFUV9MSVNUID0gMTAzLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfU0VUX1BST0JBQkxFX09QRVJfQ0hBTk5FTCA9IDEwNCwKKworCS8qIFZlbmRvciBzY2FuIGNvbW1hbmRzICovCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9UUklHR0VSX1NDQU4gPSAxMDYsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TQ0FOX0RPTkUgPSAxMDcsCit9OworCisvKioKKyAqIGVudW0gcWNhX25sODAyMTFfdmVuZG9yX3N1YmNtZHNfaW5kZXggLSB2ZW5kb3Igc3ViIGNvbW1hbmRzIGluZGV4CisgKgorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfQVZPSURfRlJFUVVFTkNZX0lOREVYOiBBdm9pZCBmcmVxdWVuY3kKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX05BTl9JTkRFWDogTmFuCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TVEFUU19FWFRfSU5ERVg6IEV4dCBzdGF0cworICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TVEFSVF9JTkRFWDogRXh0IHNjYW4gc3RhcnQKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU1RPUF9JTkRFWDogRXh0IHNjYW4gc3RvcAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX0lOREVYOiBFeHQgc2NhbiBnZXQKKyAqCWNhcGFiaWxpdHkKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX0NBQ0hFRF9SRVNVTFRTX0lOREVYOiBFeHQgc2NhbiBnZXQKKyAqCWNhY2hlZCByZXN1bHRzCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NDQU5fUkVTVUxUU19BVkFJTEFCTEVfSU5ERVg6IEV4dCBzY2FuCisgKglyZXN1bHRzIGF2YWlsYWJsZQorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9GVUxMX1NDQU5fUkVTVUxUX0lOREVYOiBFeHQgc2NhbiBmdWxsCisgKglzY2FuIHJlc3VsdAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TQ0FOX0VWRU5UX0lOREVYOiBFeHQgc2NhbiBldmVudAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX0FQX0ZPVU5EX0lOREVYOiBFeHQgc2NhbiBob3QgbGlzdAorICoJQVAgZm91bmQKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU0VUX0JTU0lEX0hPVExJU1RfSU5ERVg6IEV4dCBzY2FuIHNldAorICoJYnNzaWQgaG90bGlzdAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9SRVNFVF9CU1NJRF9IT1RMSVNUX0lOREVYOiBFeHQgc2NhbiByZXNldAorICoJYnNzaWQgaG90bGlzdAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0VfSU5ERVg6IEV4dCBzY2FuCisgKglzaWduaWZpY2FudCBjaGFuZ2UKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU0VUX1NJR05JRklDQU5UX0NIQU5HRV9JTkRFWDogRXh0IHNjYW4KKyAqCXNldCBzaWduaWZpY2FudCBjaGFuZ2UKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUkVTRVRfU0lHTklGSUNBTlRfQ0hBTkdFX0lOREVYOiBFeHQgc2NhbgorICoJcmVzZXQgc2lnbmlmaWNhbnQgY2hhbmdlCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19TRVRfSU5ERVg6IFNldCBzdGF0cworICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTExfU1RBVFNfR0VUX0lOREVYOiBHZXQgc3RhdHMKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX1NUQVRTX0NMUl9JTkRFWDogQ2xlYXIgc3RhdHMKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX1JBRElPX1NUQVRTX0lOREVYOiBSYWRpbyBzdGF0cworICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTExfSUZBQ0VfU1RBVFNfSU5ERVg6IElmYWNlIHN0YXRzCisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9QRUVSX0lORk9fU1RBVFNfSU5ERVg6IFBlZXIgaW5mbyBzdGF0cworICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfVERMU19TVEFURV9DSEFOR0VfSU5ERVg6IEV4dCB0ZGxzIHN0YXRlIGNoYW5nZQorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRE9fQUNTX0lOREVYOiBBQ1MgY29tbWFuZAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfS0VZX01HTVRfUk9BTV9BVVRIX0lOREVYOiBQYXNzIFJvYW0gYW5kIEF1dGggaW5mbworICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX0FQX0xPU1RfSU5ERVg6IGhvdGxpc3QgYXAgbG9zdAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9QTk9fTkVUV09SS19GT1VORF9JTkRFWDoKKyAqCXBubyBuZXR3b3JrIGZvdW5kIGluZGV4CisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1BOT19QQVNTUE9JTlRfTkVUV09SS19GT1VORF9JTkRFWDoKKyAqCXBhc3Nwb2ludCBtYXRjaCBmb3VuZCBpbmRleAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TRVRfU1NJRF9IT1RMSVNUX0lOREVYOgorICoJc2V0IHNzaWQgaG90bGlzdCBpbmRleAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9SRVNFVF9TU0lEX0hPVExJU1RfSU5ERVg6CisgKglyZXNldCBzc2lkIGhvdGxpc3QgaW5kZXgKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9TU0lEX0ZPVU5EX0lOREVYOgorICoJaG90bGlzdCBzc2lkIGZvdW5kIGluZGV4CisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX0hPVExJU1RfU1NJRF9MT1NUX0lOREVYOgorICoJaG90bGlzdCBzc2lkIGxvc3QgaW5kZXgKKyAqIEBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RDQ19TVEFUU19FVkVOVF9JTkRFWAorICoJZGNjIHN0YXRzIGV2ZW50IGluZGV4CisgKiBAUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TQ0FOX0lOREVYOiB2ZW5kb3Igc2NhbiBpbmRleAorICogQFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfU0NBTl9ET05FX0lOREVYOgorICoJdmVuZG9yIHNjYW4gY29tcGxldGUgZXZlbnQgIGluZGV4CisgKi8KKworZW51bSBxY2Ffbmw4MDIxMV92ZW5kb3Jfc3ViY21kc19pbmRleCB7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fQ0hfQVZPSUQpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MpCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9BVk9JRF9GUkVRVUVOQ1lfSU5ERVggPSAwLAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DSF9BVk9JRCB8fCBGRUFUVVJFX1dMQU5fRk9SQ0VfU0FQX1NDQyAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTkFOX0lOREVYLAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9OQU4gKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9TVEFUU19FWFQKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1NUQVRTX0VYVF9JTkRFWCwKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TVEFSVF9JTkRFWCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU1RPUF9JTkRFWCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX0NBUEFCSUxJVElFU19JTkRFWCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX0NBQ0hFRF9SRVNVTFRTX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9GVUxMX1NDQU5fUkVTVUxUX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TQ0FOX0VWRU5UX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX0FQX0ZPVU5EX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TRVRfQlNTSURfSE9UTElTVF9JTkRFWCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUkVTRVRfQlNTSURfSE9UTElTVF9JTkRFWCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fU0lHTklGSUNBTlRfQ0hBTkdFX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TRVRfU0lHTklGSUNBTlRfQ0hBTkdFX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9SRVNFVF9TSUdOSUZJQ0FOVF9DSEFOR0VfSU5ERVgsCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VYVFNDQU4gKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19TRVRfSU5ERVgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19HRVRfSU5ERVgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9TVEFUU19DTFJfSU5ERVgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9MTF9SQURJT19TVEFUU19JTkRFWCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0xMX0lGQUNFX1NUQVRTX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTExfUEVFUl9JTkZPX1NUQVRTX0lOREVYLAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICovCisKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1RETFNfU1RBVEVfQ0hBTkdFX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRE9fQUNTX0lOREVYLAorI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0tFWV9NR01UX1JPQU1fQVVUSF9JTkRFWCwKKyNlbmRpZgorCS8qIERGUyAqLworCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfREZTX09GRkxPQURfQ0FDX1NUQVJURURfSU5ERVgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9DQUNfRklOSVNIRURfSU5ERVgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9DQUNfQUJPUlRFRF9JTkRFWCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19PRkZMT0FEX0NBQ19OT1BfRklOSVNIRURfSU5ERVgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9SQURBUl9ERVRFQ1RFRF9JTkRFWCwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX0FQX0xPU1RfSU5ERVgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1BOT19ORVRXT1JLX0ZPVU5EX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9QTk9fUEFTU1BPSU5UX05FVFdPUktfRk9VTkRfSU5ERVgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NFVF9TU0lEX0hPVExJU1RfSU5ERVgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1JFU0VUX1NTSURfSE9UTElTVF9JTkRFWCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9TU0lEX0ZPVU5EX0lOREVYLAorCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX1NTSURfTE9TVF9JTkRFWCwKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVhUU0NBTiAqLworCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTU9OSVRPUl9SU1NJX0lOREVYLAorI2lmZGVmIFdMQU5fRkVBVFVSRV9NRU1EVU1QCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9XSUZJX0xPR0dFUl9NRU1PUllfRFVNUF9JTkRFWCwKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTUVNRFVNUCAqLworCS8qIE9DQiBldmVudHMgKi8KKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RDQ19TVEFUU19FVkVOVF9JTkRFWCwKKwlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1NDQU5fSU5ERVgsCisJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9TQ0FOX0RPTkVfSU5ERVgsCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfdGRsc19lbmFibGUgLSBURExTIGVuYWJsZSBhdHRyaWJ1dGUKKyAqCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfSU5WQUxJRDogSW52YWxpZCBpbml0aWFsIHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfTUFDX0FERFI6IEFuIGFycmF5IG9mIDYgeCBVbnNpZ25lZCA4LWJpdAorICoJdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0VOQUJMRV9DSEFOTkVMOiBTaWduZWQgMzItYml0IHZhbHVlLCBidXQgbGV0cworICoJa2VlcCBhcyB1bnNpZ25lZCBmb3Igbm93CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfR0xPQkFMX09QRVJBVElOR19DTEFTUzogb3BlcmF0aW5nIGNsYXNzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfTUFYX0xBVEVOQ1lfTVM6IEVuYWJsZSBtYXggbGF0ZW5jeSBpbiBtcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRU5BQkxFX01JTl9CQU5EV0lEVEhfS0JQUzogRW5hYmxlIG1pbiBiYW5kd2lkdGgKKyAqCWluIEtCUFMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0VOQUJMRV9BRlRFUl9MQVNUOiBBZnRlciBsYXN0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfTUFYOiBNYXggdmFsdWUKKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl90ZGxzX2VuYWJsZSB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfTUFDX0FERFIsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfQ0hBTk5FTCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0VOQUJMRV9HTE9CQUxfT1BFUkFUSU5HX0NMQVNTLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRU5BQkxFX01BWF9MQVRFTkNZX01TLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRU5BQkxFX01JTl9CQU5EV0lEVEhfS0JQUywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0VOQUJMRV9BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRU5BQkxFX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRU5BQkxFX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX3RkbHNfZGlzYWJsZTogdGRscyBkaXNhYmxlIGF0dHJpYnV0ZQorICoKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0RJU0FCTEVfSU5WQUxJRDogSW52YWxpZCBpbml0aWFsIHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19ESVNBQkxFX01BQ19BRERSOiBBbiBhcnJheSBvZiA2IHggVW5zaWduZWQKKyAqCTgtYml0IHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19ESVNBQkxFX0FGVEVSX0xBU1Q6IEFmdGVyIGxhc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0RJU0FCTEVfTUFYOiBNYXggdmFsdWUKKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl90ZGxzX2Rpc2FibGUgeworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRElTQUJMRV9JTlZBTElEID0gMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0RJU0FCTEVfTUFDX0FERFIsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19ESVNBQkxFX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19ESVNBQkxFX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRElTQUJMRV9BRlRFUl9MQVNUIC0gMSwKK307CisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl90ZGxzX2dldF9zdGF0dXMgLSB0ZGxzIGdldCBzdGF0dXMgYXR0cmlidXRlCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19JTlZBTElEOiBJbnZhbGlkIGluaXRpYWwgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9TVEFUVVNfTUFDX0FERFI6IEFuIGFycmF5IG9mIDYgeCBVbnNpZ25lZAorICoJOC1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9TVEFUVVNfU1RBVEU6IGdldCBzdGF0dXMgc3RhdGUsCisgKgl1bnNpZ25lZCAzMi1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9TVEFUVVNfUkVBU09OOiBnZXQgc3RhdHVzIHJlYXNvbgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19DSEFOTkVMOiBnZXQgc3RhdHVzIGNoYW5uZWwsCisgKgl1bnNpZ25lZCAzMi1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9TVEFUVVNfR0xPQkFMX09QRVJBVElOR19DTEFTUzogZ2V0IG9wZXJhdGluZworICoJY2xhc3MsIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19BRlRFUl9MQVNUOiBBZnRlciBsYXN0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfU1RBVFVTX01BWDogTWF4IHZhbHVlCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfdGRsc19nZXRfc3RhdHVzIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9TVEFUVVNfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfU1RBVFVTX01BQ19BRERSLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19TVEFURSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9TVEFUVVNfUkVBU09OLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19DSEFOTkVMLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19HTE9CQUxfT1BFUkFUSU5HX0NMQVNTLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9TVEFUVVNfQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfdGRsc19zdGF0ZSAtIHRkbHMgc3RhdGUgYXR0cmlidXRlCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfU1RBVEVfSU5WQUxJRDogSW5pdGlhbCBpbnZhbGlkIHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9NQUNfQUREUjogQW4gYXJyYXkgb2YgNiB4IFVuc2lnbmVkCisgKgk4LWJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfTkVXX1NUQVRFOiBURExTIG5ldyBzdGF0ZSwKKyAqCXVuc2lnbmVkIDMyLWJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfU1RBVEVfUkVBU09OOiBURExTIHN0YXRlIHJlYXNvbgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfU1RBVEVfQ0hBTk5FTDogVERMUyBzdGF0ZSBjaGFubmVsLAorICoJdW5zaWduZWQgMzItYml0IHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9HTE9CQUxfT1BFUkFUSU5HX0NMQVNTOiBURExTIHN0YXRlCisgKglvcGVyYXRpbmcgY2xhc3MsIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfU1RBVEVfQUZURVJfTEFTVDogQWZ0ZXIgbGFzdAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfU1RBVEVfTUFYOiBNYXggdmFsdWUKKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl90ZGxzX3N0YXRlIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX1NUQVRFX0lOVkFMSUQgPSAwLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfU1RBVEVfTUFDX0FERFIsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19ORVdfU1RBVEUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9SRUFTT04sCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9DSEFOTkVMLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfU1RBVEVfR0xPQkFMX09QRVJBVElOR19DTEFTUywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX1NUQVRFX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX1NUQVRFX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyogZW51bSdzIHRvIHByb3ZpZGUgVERMUyBjYXBhYmlsaXRlcyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9nZXRfdGRsc19jYXBhYmlsaXRpZXMgeworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX0NBUFNfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfQ0FQU19NQVhfQ09OQ19TRVNTSU9OUyA9IDEsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfQ0FQU19GRUFUVVJFU19TVVBQT1JURUQgPSAyLAorCisJLyoga2VlcCBsYXN0ICovCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfQ0FQU19BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX0NBUFNfTUFYID0KKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9DQVBTX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyIC0gd2xhbiB2ZW5kb3IgYXR0cmlidXRlCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0lOVkFMSUQ6IEluaXRpYWwgaW52YWxpZCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RGUzogREZTIGF0dHJpYnV0ZSB3aGljaCBpcyB1c2VkIGJ5CisgKglRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19DQVBBQklMSVRZCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTkFOOiBOQU4gYXR0cmlidXRlIHdoaWNoIGlzIHVzZWQgYnkKKyAqCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTkFOCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfU1RBVFNfRVhUOiBFeHQgc3RhdHMgYXR0cmlidXRlIHdoaWNoIGlzIHVzZWQgYnkKKyAqCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfU1RBVFNfRVhUCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfSUZJTkRFWDogQWZ0ZXIgSUZJTkRFWAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0ZFQVRVUkVfRkxBR1M6IFN1cHBvcnRlZCBGZWF0dXJlcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FGVEVSX0xBU1Q6IEFmdGVyIGxhc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9NQVg6IE1heCB2YWx1ZQorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9JTlZBTElEID0gMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ERlMgPSAxLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX05BTiA9IDIsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfU1RBVFNfRVhUID0gMywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9JRklOREVYID0gNCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9GRUFUVVJFX0ZMQUdTID0gNywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05DVVJSRU5DWV9DQVBBID0gOSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9NQVhfQ09OQ1VSUkVOVF9DSEFOTkVMU18yXzRfQkFORCA9IDEwLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX01BWF9DT05DVVJSRU5UX0NIQU5ORUxTXzVfMF9CQU5EID0gMTEsCisJLyoga2VlcCBsYXN0ICovCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9NQVggPSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfZXh0c2Nhbl9jb25maWdfcGFyYW1zIC0gZXh0IHNjYW4gY29uZmlnIHBhcmFtcworICoKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fSU5WQUxJRDogSW52YWxpZCBpbml0aWFsCisgKgkJCQkJCQkJdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRDoKKyAqCVVuc2lnbmVkIDMyLWJpdCB2YWx1ZTsgTWlkZGxld2FyZSBwcm92aWRlcyBpdCB0byB0aGUgZHJpdmVyLiBNaWRkbGUgd2FyZQorICoJZWl0aGVyIGdldHMgaXQgZnJvbSBjYWxsZXIsIGUuZy4sIGZyYW1ld29yaywgb3IgZ2VuZXJhdGVzIG9uZSBpZgorICoJZnJhbWV3b3JrIGRvZXNuJ3QgcHJvdmlkZSBpdC4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0dFVF9WQUxJRF9DSEFOTkVMU19DT05GSUdfUEFSQU1fV0lGSV9CQU5EOgorICoJTkwgYXR0cmlidXRlcyBmb3IgZGF0YSB1c2VkIGJ5CisgKglRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX1ZBTElEX0NIQU5ORUxTIHN1YiBjb21tYW5kLgorICoJSXQgaXMgdW5zaWduZWQgMzItYml0IHZhbHVlLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fR0VUX1ZBTElEX0NIQU5ORUxTX0NPTkZJR19QQVJBTV9NQVhfQ0hBTk5FTFM6CisgKglVbnNpZ25lZCAzMi1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NIQU5ORUxfU1BFQ19DSEFOTkVMOgorICoJTkwgYXR0cmlidXRlcyBmb3IgaW5wdXQgcGFyYW1zIHVzZWQgYnkKKyAqCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TVEFSVCBzdWIgY29tbWFuZC4gVW5zaWduZWQgMzItYml0CisgKgl2YWx1ZTsgY2hhbm5lbCBmcmVxdWVuY3kKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NIQU5ORUxfU1BFQ19EV0VMTF9USU1FOiBVbnNpZ25lZCAzMi1iaXQgdmFsdWU7CisgKglkd2VsbCB0aW1lIGluIG1zCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DSEFOTkVMX1NQRUNfUEFTU0lWRTogVW5zaWduZWQgOC1iaXQgdmFsdWU6CisgKgkwOiBhY3RpdmU7IDE6IHBhc3NpdmU7IE4vQSBmb3IgREZTCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DSEFOTkVMX1NQRUNfQ0xBU1M6IFVuc2lnbmVkIDgtYml0IHZhbHVlCisgKgljaGFubmVsIGNsYXNzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19JTkRFWDogVW5zaWduZWQgOC1iaXQgdmFsdWUKKyAqCWJ1Y2tldCBpbmRleCwgMCBiYXNlZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfQkFORDogVW5zaWduZWQgOC1iaXQgdmFsdWU7IGJhbmQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDX1BFUklPRDogVW5zaWduZWQgMzItYml0IHZhbHVlOworICoJZGVzaXJlZCBwZXJpb2QsIGluIG1zCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19SRVBPUlRfRVZFTlRTOiBVbnNpZ25lZCA4LWJpdAorICoJdmFsdWU7IHJlcG9ydCBldmVudHMgc2VtYW50aWNzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19OVU1fQ0hBTk5FTF9TUEVDUzogVW5zaWduZWQgMzItYml0CisgKgl2YWx1ZS4gRm9sbG93ZWQgYnkgYSBuZXN0ZWQgYXJyYXkgb2YgRVhUU0NBTl9DSEFOTkVMX1NQRUNfKiBhdHRyaWJ1dGVzLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQ0hBTk5FTF9TUEVDOgorICoJQXJyYXkgb2YgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DSEFOTkVMX1NQRUNfKiBhdHRyaWJ1dGVzLgorICoJQXJyYXkgc2l6ZTogUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19OVU1fQ0hBTk5FTF9TUEVDUworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0NBTl9DTURfUEFSQU1TX0JBU0VfUEVSSU9EOiBVbnNpZ25lZCAzMi1iaXQKKyAqCXZhbHVlOyBiYXNlIHRpbWVyIHBlcmlvZCBpbiBtcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0NBTl9DTURfUEFSQU1TX01BWF9BUF9QRVJfU0NBTjogVW5zaWduZWQKKyAqCTMyLWJpdCB2YWx1ZTsgbnVtYmVyIG9mIEFQcyB0byBzdG9yZSBpbiBlYWNoIHNjYW4gaW4gdGhlCisgKglCU1NJRC9SU1NJIGhpc3RvcnkgYnVmZmVyIChrZWVwIHRoZSBoaWdoZXN0IFJTU0kgQVBzKQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0NBTl9DTURfUEFSQU1TX1JFUE9SVF9USFJFU0hPTERfUEVSQ0VOVDoKKyAqCVVuc2lnbmVkIDgtYml0IHZhbHVlOyBpbiAlLCB3aGVuIHNjYW4gYnVmZmVyIGlzIHRoaXMgbXVjaCBmdWxsLAorICoJd2FrZSB1cCBBUFBTLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0NBTl9DTURfUEFSQU1TX05VTV9CVUNLRVRTOiBVbnNpZ25lZCA4LWJpdAorICoJdmFsdWU7IG51bWJlciBvZiBzY2FuIGJ1Y2tldCBzcGVjczsgZm9sbG93ZWQgYnkgYSBuZXN0ZWQgYXJyYXkKKyAqCW9mX0VYVFNDQU5fQlVDS0VUX1NQRUNfKiBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXMuIFRoZSBzaXplIG9mIHRoZSBhcnJheQorICoJaXMgZGV0ZXJtaW5lZCBieSBOVU1fQlVDS0VUUworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUM6IEFycmF5IG9mCisgKglRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDXyogYXR0cmlidXRlcy4gQXJyYXkgc2l6ZToKKyAqCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0NBTl9DTURfUEFSQU1TX05VTV9CVUNLRVRTCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9HRVRfQ0FDSEVEX1NDQU5fUkVTVUxUU19DT05GSUdfUEFSQU1fRkxVU0g6CisgKglVbnNpZ25lZCA4LWJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fR0VUX0NBQ0hFRF9TQ0FOX1JFU1VMVFNfQ09ORklHX1BBUkFNX01BWDoKKyAqCVVuc2lnbmVkIDMyLWJpdCB2YWx1ZTsgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byBiZSByZXR1cm5lZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNX0JTU0lEOiBBbiBhcnJheSBvZgorICoJNiB4IFVuc2lnbmVkIDgtYml0IHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9BUF9USFJFU0hPTERfUEFSQU1fUlNTSV9MT1c6IFNpZ25lZCAzMi1iaXQKKyAqCXZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9BUF9USFJFU0hPTERfUEFSQU1fUlNTSV9ISUdIOiBTaWduZWQgMzItYml0CisgKgl2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNX0NIQU5ORUw6IFNpZ25lZCAzMi1iaXQKKyAqCXZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CU1NJRF9IT1RMSVNUX1BBUkFNU19OVU1fQVA6IE51bWJlciBvZiBob3RsaXN0CisgKglBUHMgYXMgdW5zaWduZWQgMzItYml0IHZhbHVlLCBmb2xsb3dlZCBieSBhIG5lc3RlZCBhcnJheSBvZgorICoJQVBfVEhSRVNIT0xEX1BBUkFNIGF0dHJpYnV0ZXMgYW5kIHZhbHVlcy4gVGhlIHNpemUgb2YgdGhlIGFycmF5IGlzCisgKglkZXRlcm1pbmVkIGJ5IE5VTV9BUC4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0FQX1RIUkVTSE9MRF9QQVJBTTogQXJyYXkgb2YKKyAqCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNXyogYXR0cmlidXRlcy4KKyAqCUFycmF5IHNpemU6IFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfTlVNX0NIQU5ORUxfU1BFQ1MKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRV9QQVJBTVNfUlNTSV9TQU1QTEVfU0laRToKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlOyBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgYXZlcmFnaW5nIFJTU0kKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRV9QQVJBTVNfTE9TVF9BUF9TQU1QTEVfU0laRToKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlOyBudW1iZXIgb2Ygc2FtcGxlcyB0byBjb25maXJtIEFQIGxvc3MKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRV9QQVJBTVNfTUlOX0JSRUFDSElORzoKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlOyBudW1iZXIgb2YgQVBzIGJyZWFjaGluZyB0aHJlc2hvbGQuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0VfUEFSQU1TX05VTV9BUDoKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlOyBudW1iZXIgb2YgQVBzLiBGb2xsb3dlZCBieSBhbiBhcnJheSBvZgorICoJQVBfVEhSRVNIT0xEX1BBUkFNIGF0dHJpYnV0ZXMuIFNpemUgb2YgdGhlIGFycmF5IGlzIE5VTV9BUC4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JTU0lEX0hPVExJU1RfUEFSQU1TX0xPU1RfQVBfU0FNUExFX1NJWkU6CisgKglVbnNpZ25lZCAzMmJpdCB2YWx1ZTsgbnVtYmVyIG9mIHNhbXBsZXMgdG8gY29uZmlybSBBUCBsb3NzLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfTUFYX1BFUklPRDoKKyAqCVVuc2lnbmVkIDMyLWJpdCB2YWx1ZS4gSWYgbWF4X3BlcmlvZCBpcyBub24gemVybyBvciBkaWZmZXJlbnQgdGhhbgorICoJcGVyaW9kLCB0aGVuIHRoaXMgYnVja2V0IGlzIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYgYnVja2V0LgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfRVhQT05FTlQ6CisgKglVbnNpZ25lZCAzMi1iaXQgdmFsdWUuIEZvciBleHBvbmVudGlhbCBiYWNrIG9mZiBidWNrZXQsCisgKgludW1iZXIgb2Ygc2NhbnMgcGVyZm9ybWVkIGF0IGEgZ2l2ZW4gcGVyaW9kIGFuZCB1bnRpbCB0aGUKKyAqCWV4cG9uZW50IGlzIGFwcGxpZWQuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19TVEVQX0NPVU5UOgorICoJVW5zaWduZWQgOC1iaXQgdmFsdWU7IGluIG51bWJlciBvZiBzY2Fucywgd2FrZSB1cCBBUCBhZnRlciB0aGVzZQorICoJbWFueSBzY2Fucy4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NDQU5fQ01EX1BBUkFNU19SRVBPUlRfVEhSRVNIT0xEX05VTV9TQ0FOUzoKKyAqCVVuc2lnbmVkIDgtYml0IHZhbHVlOyBpbiBudW1iZXIgb2Ygc2NhbnMsIHdha2UgdXAgQVAgYWZ0ZXIgdGhlc2UKKyAqCW1hbnkgc2NhbnMuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TU0lEX0hPVExJU1RfUEFSQU1TX0xPU1RfU1NJRF9TQU1QTEVfU0laRToKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlOyBudW1iZXIgb2Ygc2FtcGxlcyB0byBjb25maXJtIFNTSUQgbG9zcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1NJRF9IT1RMSVNUX1BBUkFNU19OVU1fU1NJRDoKKyAqCU51bWJlciBvZiBob3RsaXN0IFNTSURzIGFzIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZSwgZm9sbG93ZWQgYnkgYSBuZXN0ZWQKKyAqCWFycmF5IG9mIFNTSURfVEhSRVNIT0xEX1BBUkFNXyogYXR0cmlidXRlcyBhbmQgdmFsdWVzLiBUaGUgc2l6ZSBvZiB0aGUKKyAqCWFycmF5IGlzIGRldGVybWluZWQgYnkgTlVNX1NTSUQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NTSURfVEhSRVNIT0xEX1BBUkFNOgorICoJQXJyYXkgb2YgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TU0lEX1RIUkVTSE9MRF9QQVJBTV8qIGF0dHJpYnV0ZXMKKyAqCUFycmF5IHNpemU6IFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1NJRF9IT1RMSVNUX1BBUkFNU19OVU1fU1NJRAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1NJRF9USFJFU0hPTERfUEFSQU1fU1NJRDoKKyAqCUFuIGFycmF5IG9mIDMzIHggVW5zaWduZWQgOC1iaXQgdmFsdWU7IE5VTEwgdGVybWluYXRlZCBTU0lECisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TU0lEX1RIUkVTSE9MRF9QQVJBTV9CQU5EOgorICoJIFNpZ25lZCAzMi1iaXQgdmFsdWU7IGJhbmQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NTSURfVEhSRVNIT0xEX1BBUkFNX1JTU0lfTE9XOgorICoJU2lnbmVkIDMyLWJpdCB2YWx1ZTsgbG93IHJzc2kKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NTSURfVEhSRVNIT0xEX1BBUkFNX1JTU0lfSElHSDoKKyAqCVNpZ25lZCAzMi1iaXQgdmFsdWU7IGhpZ2ggcnNzaQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQ09ORklHVVJBVElPTl9GTEFHUzoKKyAqCVVuc2lnbmVkIDMyLWJpdCB2YWx1ZTsgYSBiaXRtYXNrIHcvYWRkaXRpb25hbCBleHRzY2FuIGNvbmZpZyBmbGFnLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9BRlRFUl9MQVNUOiBBZnRlciBsYXN0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWDogTWF4IHZhbHVlCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfZXh0c2Nhbl9jb25maWdfcGFyYW1zIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fSU5WQUxJRCA9IDAsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRCwKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fR0VUX1ZBTElEX0NIQU5ORUxTX0NPTkZJR19QQVJBTV9XSUZJX0JBTkQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9HRVRfVkFMSURfQ0hBTk5FTFNfQ09ORklHX1BBUkFNX01BWF9DSEFOTkVMUywKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQ0hBTk5FTF9TUEVDX0NIQU5ORUwsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DSEFOTkVMX1NQRUNfRFdFTExfVElNRSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NIQU5ORUxfU1BFQ19QQVNTSVZFLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQ0hBTk5FTF9TUEVDX0NMQVNTLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19JTkRFWCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDX0JBTkQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19QRVJJT0QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19SRVBPUlRfRVZFTlRTLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfTlVNX0NIQU5ORUxfU1BFQ1MsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NIQU5ORUxfU1BFQywKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0NBTl9DTURfUEFSQU1TX0JBU0VfUEVSSU9ELAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0NBTl9DTURfUEFSQU1TX01BWF9BUF9QRVJfU0NBTiwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NDQU5fQ01EX1BBUkFNU19SRVBPUlRfVEhSRVNIT0xEX1BFUkNFTlQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TQ0FOX0NNRF9QQVJBTVNfTlVNX0JVQ0tFVFMsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9HRVRfQ0FDSEVEX1NDQU5fUkVTVUxUU19DT05GSUdfUEFSQU1fRkxVU0gsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9HRVRfQ0FDSEVEX1NDQU5fUkVTVUxUU19DT05GSUdfUEFSQU1fTUFYLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9BUF9USFJFU0hPTERfUEFSQU1fQlNTSUQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9BUF9USFJFU0hPTERfUEFSQU1fUlNTSV9MT1csCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9BUF9USFJFU0hPTERfUEFSQU1fUlNTSV9ISUdILAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNX0NIQU5ORUwsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JTU0lEX0hPVExJU1RfUEFSQU1TX05VTV9BUCwKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0VfUEFSQU1TX1JTU0lfU0FNUExFX1NJWkUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0VfUEFSQU1TX0xPU1RfQVBfU0FNUExFX1NJWkUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0VfUEFSQU1TX01JTl9CUkVBQ0hJTkcsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0VfUEFSQU1TX05VTV9BUCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JTU0lEX0hPVExJU1RfUEFSQU1TX0xPU1RfQVBfU0FNUExFX1NJWkUsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDX01BWF9QRVJJT0QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19FWFBPTkVOVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDX1NURVBfQ09VTlQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TQ0FOX0NNRF9QQVJBTVNfUkVQT1JUX1RIUkVTSE9MRF9OVU1fU0NBTlMsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NTSURfSE9UTElTVF9QQVJBTVNfTE9TVF9TU0lEX1NBTVBMRV9TSVpFLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1NJRF9IT1RMSVNUX1BBUkFNU19OVU1fU1NJRCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NTSURfVEhSRVNIT0xEX1BBUkFNLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TU0lEX1RIUkVTSE9MRF9QQVJBTV9TU0lELAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1NJRF9USFJFU0hPTERfUEFSQU1fQkFORCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NTSURfVEhSRVNIT0xEX1BBUkFNX1JTU0lfTE9XLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1NJRF9USFJFU0hPTERfUEFSQU1fUlNTSV9ISUdILAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DT05GSUdVUkFUSU9OX0ZMQUdTLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9BRlRFUl9MQVNUIC0gMSwKK307CisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9leHRzY2FuX3Jlc3VsdHMgLSB2ZW5kb3IgYXR0cmlidXRlIGV4dCBzY2FuIHJlc3VsdHMKKyAqCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0lOVkFMSUQ6IEludmFsaWQgaW5pdGlhbCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19SRVFVRVNUX0lEOiBVbnNpZ25lZCAzMi1iaXQgdmFsdWUKKyAqCW11c3QgbWF0Y2ggdGhlIHJlcXVlc3QgSWQgc3VwcGxpZWQgYnkgV2ktRmkgSEFMIGluIHRoZSBjb3JyZXNwb25kaW5nCisgKglzdWJjbWQgTkwgbXNnCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVEFUVVM6IFVuc2lnbmVkIDMyLWJpdCB2YWx1ZSB1c2VkIHRvCisgKglpbmRpY2F0ZSB0aGUgc3RhdHVzIHJlc3BvbnNlIGZyb20gZmlybXdhcmUvZHJpdmVyIGZvciB0aGUgdmVuZG9yCisgKglzdWItY29tbWFuZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19OVU1fQ0hBTk5FTFM6IEVYVFNDQU4gVmFsaWQgQ2hhbm5lbHMKKyAqCWF0dHJpYnV0ZXMuIFVuc2lnbmVkIDMyYml0IHZhbHVlIGZvbGxvd2VkIGJ5IGEgbmVzdGVkIGFycmF5IG9mIENIQU5ORUxTCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NIQU5ORUxTOiBBbiBhcnJheSBvZiBOVU1fQ0hBTk5FTFMgeAorICoJVW5zaWduZWQgMzJiaXQgdmFsdWUgaW50ZWdlcnMgcmVwcmVzZW50aW5nIGNoYW5uZWwgbnVtYmVycy4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQ0FQQUJJTElUSUVTX01BWF9TQ0FOX0NBQ0hFX1NJWkU6CisgKglVbnNpZ25lZCAzMmJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX1NDQU5fQlVDS0VUUzoKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfQVBfQ0FDSEVfUEVSX1NDQU46CisgKglVbnNpZ25lZCAzMmJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX1JTU0lfU0FNUExFX1NJWkU6CisgKglVbnNpZ25lZCAzMmJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX1NDQU5fUkVQT1JUSU5HX1RIUkVTSE9MRDoKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfSE9UTElTVF9BUFM6CisgKglVbnNpZ25lZCAzMmJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX1NJR05JRklDQU5UX1dJRklfQ0hBTkdFX0FQUzoKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfQlNTSURfSElTVE9SWV9FTlRSSUVTOgorICoJVW5zaWduZWQgMzJiaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX05VTV9SRVNVTFRTX0FWQUlMQUJMRTogVW5zaWduZWQgMzItYml0CisgKgl2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19MSVNUOiBBbiBhcnJheSBvZgorICoJTlVNX1JFU1VMVFNfQVZBSUxBQkxFIHggUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUXyoKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfVElNRV9TVEFNUDogVW5zaWduZWQKKyAqCTY0LWJpdCB2YWx1ZSBhZ2Ugb2Ygc2FtcGxlIGF0IHRoZSB0aW1lIG9mIHJldHJpZXZhbAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9TU0lEOiAzMyB4IHVuc2lnbmVkIDgtYml0CisgKgl2YWx1ZTsgTlVMTCB0ZXJtaW5hdGVkIFNTSUQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfQlNTSUQ6IEFuIGFycmF5IG9mIDYgeAorICoJVW5zaWduZWQgOC1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfQ0hBTk5FTDogVW5zaWduZWQgMzItYml0CisgKgl2YWx1ZTsgY2hhbm5lbCBmcmVxdWVuY3kgaW4gTUh6CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX1JTU0k6IFNpZ25lZCAzMi1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfUlRUOiBVbnNpZ25lZCAzMi1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfUlRUX1NEOiBVbnNpZ25lZCAzMi1iaXQKKyAqCXZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX0JFQUNPTl9QRVJJT0Q6CisgKglVbnNpZ25lZCAxNi1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfQ0FQQUJJTElUWToKKyAqCVVuc2lnbmVkIDE2LWJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9JRV9MRU5HVEg6CisgKglVbnNpZ25lZCAzMi1iaXQgdmFsdWU7IHNpemUgb2YgdGhlIElFIERBVEEgYmxvYgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9JRV9EQVRBOgorICoJQW4gYXJyYXkgb2YgSUVfTEVOR1RIIHggVW5zaWduZWQgOC1iaXQgdmFsdWU7IGJsb2Igb2YgYWxsIHRoZQorICoJaW5mb3JtYXRpb24gZWxlbWVudHMgZm91bmQgaW4gdGhlIGJlYWNvbjsgdGhpcyBkYXRhIHNob3VsZCBiZQorICoJYSBwYWNrZWQgbGlzdCBvZiB3aWZpX2luZm9ybWF0aW9uX2VsZW1lbnQgb2JqZWN0cywgb25lIGFmdGVyCisgKgl0aGUgb3RoZXIuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX01PUkVfREFUQToKKyAqCVVuc2lnbmVkIDgtYml0IHZhbHVlOyBzZXQgYnkgZHJpdmVyIHRvIGluZGljYXRlIG1vcmUgc2NhbiByZXN1bHRzIGFyZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX0VWRU5UX1RZUEU6IFVuc2lnbmVkIDgtYml0IHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fRVZFTlRfU1RBVFVTOiBVbnNpZ25lZCAzMi1iaXQKKyAqCXZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NJR05JRklDQU5UX0NIQU5HRV9SRVNVTFRfQlNTSUQ6CisgKglBbiBhcnJheSBvZiA2IHggVW5zaWduZWQgOC1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0lHTklGSUNBTlRfQ0hBTkdFX1JFU1VMVF9DSEFOTkVMOgorICoJVW5zaWduZWQgMzItYml0IHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NJR05JRklDQU5UX0NIQU5HRV9SRVNVTFRfTlVNX1JTU0k6CisgKglVbnNpZ25lZCAzMi1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0lHTklGSUNBTlRfQ0hBTkdFX1JFU1VMVF9SU1NJX0xJU1Q6CisgKglBIG5lc3RlZCBhcnJheSBvZiBzaWduZWQgMzItYml0IFJTU0kgdmFsdWVzLiBTaXplIG9mIHRoZSBhcnJheSBpcworICoJZGV0ZXJtaW5lZCBieSAoTlVNX1JTU0kgb2YgU0lHTklGSUNBTlRfQ0hBTkdFX1JFU1VMVF9OVU1fUlNTSS4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX0xJU1Q6CisgKglBbiBhcnJheSBvZiBOVU1fUkVTVUxUU19BVkFJTEFCTEUgeAorICoJUUNBX05MODAyMTFfVkVORE9SX0FUVFJfRVhUU0NBTl9DQUNIRURfUkVTVUxUU18qCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19TQ0FOX0lEOgorICoJVW5zaWduZWQgMzItYml0IHZhbHVlOyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2NhbiB1bml0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19GTEFHUzoKKyAqCVVuc2lnbmVkIDMyLWJpdCB2YWx1ZTsgYSBiaXRtYXNrIHcvYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBzY2FuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9QTk9fUkVTVUxUU19QQVNTUE9JTlRfTkVUV09SS19GT1VORF9OVU1fTUFUQ0hFUzoKKyAqCSBVbnNpZ25lZCAzMi1iaXQgdmFsdWU7IG51bWJlciBvZiBmb3VuZCBuZXR3b3JrIG1hdGNoZXMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1BOT19SRVNVTFRTX1BBU1NQT0lOVF9NQVRDSF9SRVNVTFRfTElTVDoKKyAqCUEgbmVzdGVkIGFycmF5IG9mCisgKglRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1BOT19SRVNVTFRTX1BBU1NQT0lOVF9NQVRDSF8qCisgKglhdHRyaWJ1dGVzLiBBcnJheSBzaXplID0KKyAqCSpfQVRUUl9FWFRTQ0FOX1BOT19SRVNVTFRTX1BBU1NQT0lOVF9ORVRXT1JLX0ZPVU5EX05VTV9NQVRDSEVTLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUE5PX1JFU1VMVFNfUEFTU1BPSU5UX01BVENIX0lEOgorICoJVW5zaWduZWQgMzItYml0IHZhbHVlOyBuZXR3b3JrIGJsb2NrIGlkIGZvciB0aGUgbWF0Y2hlZCBuZXR3b3JrCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9QTk9fUkVTVUxUU19QQVNTUE9JTlRfTUFUQ0hfQU5RUF9MRU46CisgKglVbnNpZ25lZCAzMi1iaXQgdmFsdWU7IEFOUVAgbGVuZ3RoCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9QTk9fUkVTVUxUU19QQVNTUE9JTlRfTUFUQ0hfQU5RUDoKKyAqCUFuIGFycmF5IHNpemUgb2YgUEFTU1BPSU5UX01BVENIX0FOUVBfTEVOIG9mIHVuc2lnbmVkIDgtYml0IHZhbHVlczsKKyAqCUFOUVAgZGF0YSBpbiB0aGUgaW5mb3JtYXRpb25fZWxlbWVudCBmb3JtYXQuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfSE9UTElTVF9TU0lEUzoKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlOyBNYXggaG90bGlzdCBzc2lkcy4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQ0FQQUJJTElUSUVTX01BWF9OVU1fRVBOT19ORVRTOgorICoJVW5zaWduZWQgMzJiaXQgdmFsdWU7IE1heCBudW1iZXIgb2YgZXBubyBuZXR3b3JrcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX05VTV9FUE5PX05FVFNfQllfU1NJRDoKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlOyBNYXggbnVtYmVyIG9mIGVwbm8gbmV0d29ya3MgYnkgc3NpZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX05VTV9XSElURUxJU1RFRF9TU0lEOgorICoJVW5zaWduZWQgMzJiaXQgdmFsdWU7IE1heCBudW1iZXIgb2Ygd2hpdGVsaXN0ZWQgc3NpZHMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQUZURVJfTEFTVDogQWZ0ZXIgbGFzdAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19NQVg6IE1heCB2YWx1ZQorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2V4dHNjYW5fcmVzdWx0cyB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0lOVkFMSUQgPSAwLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1JFUVVFU1RfSUQsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NUQVRVUywKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19OVU1fQ0hBTk5FTFMsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NIQU5ORUxTLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfU0NBTl9DQUNIRV9TSVpFLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX1NDQU5fQlVDS0VUUywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQ0FQQUJJTElUSUVTX01BWF9BUF9DQUNIRV9QRVJfU0NBTiwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQ0FQQUJJTElUSUVTX01BWF9SU1NJX1NBTVBMRV9TSVpFLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX1NDQU5fUkVQT1JUSU5HX1RIUkVTSE9MRCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQ0FQQUJJTElUSUVTX01BWF9IT1RMSVNUX0JTU0lEUywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQ0FQQUJJTElUSUVTX01BWF9TSUdOSUZJQ0FOVF9XSUZJX0NIQU5HRV9BUFMsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfQlNTSURfSElTVE9SWV9FTlRSSUVTLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9OVU1fUkVTVUxUU19BVkFJTEFCTEUsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfTElTVCwKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9USU1FX1NUQU1QLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9TU0lELAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9CU1NJRCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfQ0hBTk5FTCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfUlNTSSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfUlRULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9SVFRfU0QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX0JFQUNPTl9QRVJJT0QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX0NBUEFCSUxJVFksCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX0lFX0xFTkdUSCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfSUVfREFUQSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfTU9SRV9EQVRBLAorCisJLyogVXNlIGF0dHIgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9OVU1fUkVTVUxUU19BVkFJTEFCTEUKKwkgKiB0byBpbmRpY2F0ZSBudW1iZXIgb2Ygd2lmaSBzY2FuIHJlc3VsdHMvYnNzaWRzIHJldHJpZXZlZCBieSB0aGUgc2Nhbi4KKwkgKiBBbHNvLCB1c2UgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0xJU1QgdG8gaW5kaWNhdGUgdGhlCisJICogbGlzdCBvZiB3aWZpIHNjYW4gcmVzdWx0cyByZXR1cm5lZCBmb3IgZWFjaCBjYWNoZWQgcmVzdWx0IGJsb2NrLgorCSAqLworCisJLyogRVhUU0NBTiBhdHRyaWJ1dGVzIGZvcgorCSAqIFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TQ0FOX0VWRU5UIHN1Yi1jb21tYW5kLgorCSAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX0VWRU5UX1RZUEUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fRVZFTlRfU1RBVFVTLAorCisJLyogRVhUU0NBTiBhdHRyaWJ1dGVzIGZvcgorCSAqIFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX0FQX0ZPVU5EIHN1Yi1jb21tYW5kLgorCSAqLworCS8qIFVzZSBhdHRyIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fTlVNX1JFU1VMVFNfQVZBSUxBQkxFCisJICogdG8gaW5kaWNhdGUgbnVtYmVyIG9mIHJlc3VsdHMuCisJICovCisKKwkvKiBFWFRTQ0FOIGF0dHJpYnV0ZXMgZm9yCisJICogUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRSBzdWItY29tbWFuZC4KKwkgKi8KKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0lHTklGSUNBTlRfQ0hBTkdFX1JFU1VMVF9CU1NJRCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0lHTklGSUNBTlRfQ0hBTkdFX1JFU1VMVF9DSEFOTkVMLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TSUdOSUZJQ0FOVF9DSEFOR0VfUkVTVUxUX05VTV9SU1NJLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TSUdOSUZJQ0FOVF9DSEFOR0VfUkVTVUxUX1JTU0lfTElTVCwKKworCS8qIEVYVFNDQU4gYXR0cmlidXRlcyB1c2VkIHdpdGgKKwkgKiBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fR0VUX0NBQ0hFRF9SRVNVTFRTIHN1Yi1jb21tYW5kLgorCSAqLworCS8qIFVzZSBhdHRyIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fTlVNX1JFU1VMVFNfQVZBSUxBQkxFCisJICogdG8gaW5kaWNhdGUgbnVtYmVyIG9mIGdzY2FuIGNhY2hlZCByZXN1bHRzIHJldHVybmVkLgorCSAqIEFsc28sIHVzZSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX0xJU1QgdG8KKwkgKiBpbmRpY2F0ZSB0aGUgbGlzdCBvZiBnc2NhbiBjYWNoZWQgcmVzdWx0cy4KKwkgKi8KKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQ0FDSEVEX1JFU1VMVFNfTElTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX1NDQU5fSUQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19GTEFHUywKKwkvKiBVc2UgYXR0ciBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX05VTV9SRVNVTFRTX0FWQUlMQUJMRQorCSAqIHRvIGluZGljYXRlIG51bWJlciBvZiB3aWZpIHNjYW4gcmVzdWx0cy9ic3NpZHMgcmV0cmlldmVkIGJ5IHRoZSBzY2FuLgorCSAqIEFsc28sIHVzZSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfTElTVCB0byBpbmRpY2F0ZSB0aGUKKwkgKiBsaXN0IG9mIHdpZmkgc2NhbiByZXN1bHRzIHJldHVybmVkIGZvciBlYWNoIGNhY2hlZCByZXN1bHQgYmxvY2suCisJICovCisKKwkvKiBFWFRTQ0FOIGF0dHJpYnV0ZXMgZm9yCisJICogUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9QTk9fTkVUV09SS19GT1VORCBzdWItY29tbWFuZC4KKwkgKi8KKwkvKiBVc2UgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9OVU1fUkVTVUxUU19BVkFJTEFCTEUgZm9yIG51bWJlcgorCSAqIG9mIHJlc3VsdHMuCisJICogVXNlIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19MSVNUIHRvIGluZGljYXRlIHRoZSBuZXN0ZWQKKwkgKiBsaXN0IG9mIHdpZmkgc2NhbiByZXN1bHRzIHJldHVybmVkIGZvciBlYWNoCisJICogd2lmaV9wYXNzcG9pbnRfbWF0Y2hfcmVzdWx0IGJsb2NrLgorCSAqIEFycmF5IHNpemU6IFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fTlVNX1JFU1VMVFNfQVZBSUxBQkxFLgorCSAqLworCisJLyogRVhUU0NBTiBhdHRyaWJ1dGVzIGZvcgorCSAqIFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfUE5PX1BBU1NQT0lOVF9ORVRXT1JLX0ZPVU5EIHN1Yi1jb21tYW5kLgorCSAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUE5PX1JFU1VMVFNfUEFTU1BPSU5UX05FVFdPUktfRk9VTkRfTlVNX01BVENIRVMsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9QTk9fUkVTVUxUU19QQVNTUE9JTlRfTUFUQ0hfUkVTVUxUX0xJU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9QTk9fUkVTVUxUU19QQVNTUE9JTlRfTUFUQ0hfSUQsCisJLyogVXNlIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19MSVNUIHRvIGluZGljYXRlIHRoZSBuZXN0ZWQKKwkgKiBsaXN0IG9mIHdpZmkgc2NhbiByZXN1bHRzIHJldHVybmVkIGZvciBlYWNoCisJICogd2lmaV9wYXNzcG9pbnRfbWF0Y2hfcmVzdWx0IGJsb2NrLgorCSAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUE5PX1JFU1VMVFNfUEFTU1BPSU5UX01BVENIX0FOUVBfTEVOLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUE5PX1JFU1VMVFNfUEFTU1BPSU5UX01BVENIX0FOUVAsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQ0FQQUJJTElUSUVTX01BWF9IT1RMSVNUX1NTSURTLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX05VTV9FUE5PX05FVFMsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfTlVNX0VQTk9fTkVUU19CWV9TU0lELAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX05VTV9XSElURUxJU1RFRF9TU0lELAorCisJLyogRVhUU0NBTiBhdHRyaWJ1dGVzIGZvcgorCSAqIFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX1NTSURfRk9VTkQgc3ViLWNvbW1hbmQgJgorCSAqIFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX1NTSURfTE9TVCBzdWItY29tbWFuZAorCSAqLworCS8qIFVzZSBhdHRyIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fTlVNX1JFU1VMVFNfQVZBSUxBQkxFCisJICogdG8gaW5kaWNhdGUgbnVtYmVyIG9mIHJlc3VsdHMuCisJICovCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0FGVEVSX0xBU1QgLSAxLAorfTsKKworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfbGxfc3RhdHNfc2V0IC0gdmVuZG9yIGF0dHJpYnV0ZSBzZXQgc3RhdHMKKyAqCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfU0VUX0lOVkFMSUQ6IEludmFsaWQgaW5pdGlhbCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1NFVF9DT05GSUdfTVBEVV9TSVpFX1RIUkVTSE9MRDogU2l6ZSB0aHJlc2hvbGQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19TRVRfQ09ORklHX0FHR1JFU1NJVkVfU1RBVFNfR0FUSEVSSU5HOgorICoJQWdncmVzaXZlIHN0YXRzIGdhdGhlcmluZworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1NFVF9BRlRFUl9MQVNUOiBBZnRlciBsYXN0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfU0VUX01BWDogTWF4IHZhbHVlCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfbGxfc3RhdHNfc2V0IHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19TRVRfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfU0VUX0NPTkZJR19NUERVX1NJWkVfVEhSRVNIT0xEID0gMSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19TRVRfQ09ORklHX0FHR1JFU1NJVkVfU1RBVFNfR0FUSEVSSU5HLAorCS8qIGtlZXAgbGFzdCAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1NFVF9BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1NFVF9NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19TRVRfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9sbF9zdGF0c19nZXQgLSB2ZW5kb3IgYXR0cmlidXRlIGdldCBzdGF0cworICoKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19HRVRfSU5WQUxJRDogSW52YWxpZCBpbml0aWFsIHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfR0VUX0NPTkZJR19SRVFfSUQ6IFVuc2lnbmVkIDMyYml0IHZhbHVlCisgKglwcm92aWRlZCBieSB0aGUgY2FsbGVyIGlzc3VpbmcgdGhlIEdFVCBzdGF0cyBjb21tYW5kLiBXaGVuIHJlcG9ydGluZworICoJdGhlIHN0YXRzIHJlc3VsdHMsIHRoZSBkcml2ZXIgdXNlcyB0aGUgc2FtZSB2YWx1ZSB0byBpbmRpY2F0ZSB3aGljaAorICoJR0VUIHJlcXVlc3QgdGhlIHJlc3VsdHMgY29ycmVzcG9uZCB0by4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19HRVRfQ09ORklHX1JFUV9NQVNLOiBHZXQgY29uZmlnIHJlcXVlc3QgbWFzaworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NMUl9DT05GSUdfUlNQX01BU0s6IENvbmZpZyByZXNwb25zZSBtYXNrCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX0NPTkZJR19TVE9QX1JTUDogQ29uZmlnIHN0b3AgcmVzcG9uc2UKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19HRVRfQUZURVJfTEFTVDogQWZ0ZXIgbGFzdAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0dFVF9NQVg6IE1heCB2YWx1ZQorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2xsX3N0YXRzX2dldCB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfR0VUX0lOVkFMSUQgPSAwLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0dFVF9DT05GSUdfUkVRX0lELAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0dFVF9DT05GSUdfUkVRX01BU0ssCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfR0VUX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfR0VUX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0dFVF9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2xsX3N0YXRzX2NsciAtIHZlbmRvciBhdHRyaWJ1dGUgY2xlYXIgc3RhdHMKKyAqCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX0lOVkFMSUQ6IEludmFsaWQgaW5pdGlhbCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NMUl9DT05GSUdfUkVRX01BU0s6IENvbmZpZyByZXF1ZXN0IG1hc2sKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DTFJfQ09ORklHX1NUT1BfUkVROiBDb25maWcgc3RvcCBtYXNrCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX0NPTkZJR19SU1BfTUFTSzogQ29uZmlnIHJlc3BvbnNlIG1hc2sKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DTFJfQ09ORklHX1NUT1BfUlNQOiBDb25maWcgc3RvcCByZXNwb25zZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NMUl9BRlRFUl9MQVNUOiBBZnRlciBsYXN0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX01BWDogTWF4IHZhbHVlCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfbGxfc3RhdHNfY2xyIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DTFJfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX0NPTkZJR19SRVFfTUFTSywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DTFJfQ09ORklHX1NUT1BfUkVRLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NMUl9DT05GSUdfUlNQX01BU0ssCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX0NPTkZJR19TVE9QX1JTUCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DTFJfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DTFJfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfbGxfc3RhdHNfcmVzdWx0c190eXBlIC0gbGwgc3RhdHMgcmVzdWx0IHR5cGUKKyAqCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfVFlQRV9JTlZBTElEOiBJbml0aWFsIGludmFsaWQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19UWVBFX1JBRElPOiBMaW5rIGxheWVyIHN0YXRzIHR5cGUgcmFkaW8KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19UWVBFX0lGQUNFOiBMaW5rIGxheWVyIHN0YXRzIHR5cGUgaW50ZXJmYWNlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfVFlQRV9QRUVSOiBMaW5rIGxheWVyIHN0YXRzIHR5cGUgcGVlcgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1RZUEVfQUZURVJfTEFTVDogTGFzdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1RZUEVfTUFYOiBNYXggdmFsdWUKKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9sbF9zdGF0c19yZXN1bHRzX3R5cGUgeworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1RZUEVfSU5WQUxJRCA9IDAsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19UWVBFX1JBRElPID0gMSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19UWVBFX0lGQUNFLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1RZUEVfUEVFUiwKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1RZUEVfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19UWVBFX01BWCA9CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfVFlQRV9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2xsX3N0YXRzX3Jlc3VsdHMgLSB2ZW5kb3IgYXR0cmlidXRlIHN0YXRzIHJlc3VsdHMKKyAqCisgKiBBdHRyaWJ1dGVzIG9mIHR5cGUgUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfSU5GT18qIGFyZSBuZXN0ZWQKKyAqIHdpdGhpbiB0aGUgaW50ZXJmYWNlIHN0YXRzLgorICoKKyAqIEF0dHJpYnV0ZXMgb2YgdHlwZSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfKiBjb3VsZCBiZSBuZXN0ZWQKKyAqIHdpdGhpbiB0aGUgaW50ZXJmYWNlIHN0YXRzLgorICoKKyAqIEF0dHJpYnV0ZXMgb2YgdHlwZSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19QRUVSX0lORk9fKiBhcmUgbmVzdGVkCisgKiB3aXRoaW4gdGhlIGludGVyZmFjZSBzdGF0cy4KKyAqCisgKiBBdHRyaWJ1dGVzIG9mIHR5cGUgUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV8qIGNvdWxkIGJlIG5lc3RlZAorICogd2l0aGluIHRoZSBwZWVyIGluZm8gc3RhdHMuCisgKgorICogQXR0cmlidXRlcyBvZiB0eXBlIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfSU5GT18qIGNvdWxkIGJlCisgKiBuZXN0ZWQgd2l0aGluIHRoZSBjaGFubmVsIHN0YXRzLgorICoKKyAqIEF0dHJpYnV0ZXMgb2YgdHlwZSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DSEFOTkVMXyBjb3VsZCBiZSBuZXN0ZWQKKyAqIHdpdGhpbiB0aGUgcmFkaW8gc3RhdHMuCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lOVkFMSUQ6IEludmFsaWQgaW5pdGlhbCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JFU1VMVFNfUkVRX0lEOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0JFQUNPTl9SWDogVW5zaWduZWQgMzJiaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9NR01UX1JYOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX01HTVRfQUNUSU9OX1JYOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX01HTVRfQUNUSU9OX1RYOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX1JTU0lfTUdNVDogVW5zaWduZWQgMzJiaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9SU1NJX0RBVEE6IFVuc2lnbmVkIDMyYml0IHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfUlNTSV9BQ0s6IFVuc2lnbmVkIDMyYml0IHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfSU5GT19NT0RFOiBJbnRlcmZhY2UgbW9kZSwgZS5nLiwgU1RBLAorICoJU09GVEFQLCBJQlNTLCBldGMuIFR5cGUgPSBlbnVtIHdpZmlfaW50ZXJmYWNlX21vZGUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9JTkZPX01BQ19BRERSOiBJbnRlcmZhY2UgTUFDIGFkZHJlc3MuCisgKglBbiBhcnJheSBvZiA2IFVuc2lnbmVkIGludDhfdAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0lORk9fU1RBVEU6CisgKglUeXBlID0gZW51bSB3aWZpX2Nvbm5lY3Rpb25fc3RhdGUsICBlLmcuLCBESVNDT05ORUNURUQsIEFVVEhFTlRJQ0FUSU5HLAorICoJZXRjLiBWYWxpZCBmb3IgU1RBLCBDTEkgb25seQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0lORk9fUk9BTUlORzoKKyAqCVR5cGUgPSBlbnVtIHdpZmlfcm9hbV9zdGF0ZS4gUm9hbWluZyBzdGF0ZSwgZS5nLiwgSURMRSBvciBBQ1RJVkUKKyAqCShpcyB0aGF0IHZhbGlkIGZvciBTVEEgb25seT8pCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfSU5GT19DQVBBQklMSVRJRVM6IFVuc2lnbmVkIDMyYml0IHZhbHVlLgorICoJV0lGSV9DQVBBQklMSVRZX1hYWAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0lORk9fU1NJRDogTlVMTCB0ZXJtaW5hdGVkIFNTSUQuIEFuCisgKglhcnJheSBvZiAzMyBVbnNpZ25lZCA4Yml0IHZhbHVlcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0lORk9fQlNTSUQ6IEJTU0lELiBBbiBhcnJheSBvZiA2CisgKglVbnNpZ25lZCA4Yml0IHZhbHVlcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0lORk9fQVBfQ09VTlRSWV9TVFI6IENvdW50cnkgc3RyaW5nCisgKglhZHZlcnRpc2VkIGJ5IEFQLiBBbiBhcnJheSBvZiAzIFVuc2lnbmVkIDhiaXQgdmFsdWVzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfSU5GT19DT1VOVFJZX1NUUjogQ291bnRyeSBzdHJpbmcgZm9yCisgKgl0aGlzIGFzc29jaWF0aW9uLiBBbiBhcnJheSBvZiAzIFVuc2lnbmVkIDhiaXQgdmFsdWVzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX0FDOiBUeXBlID0gZW51bSB3aWZpX3RyYWZmaWNfYWMgZS5nLgorICoJVjAsIFZJLCBCRSBhbmQgQksKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfVFhfTVBEVTogVW5zaWduZWQgaW50IDMyIHZhbHVlCisgKgljb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgQUMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfUlhfTVBEVTogVW5zaWduZWQgaW50IDMyIHZhbHVlCisgKgljb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgQUMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfVFhfTUNBU1Q6IFVuc2lnbmVkIGludCAzMiB2YWx1ZQorICoJY29ycmVzcG9uZGluZyB0byByZXNwZWN0aXZlIEFDCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX1JYX01DQVNUOiBVbnNpZ25lZCBpbnQgMzIgdmFsdWUKKyAqCWNvcnJlc3BvbmRpbmcgdG8gcmVzcGVjdGl2ZSBBQworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1dNTV9BQ19SWF9BTVBEVTogVW5zaWduZWQgaW50IDMyIHZhbHVlCisgKgljb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgQUMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfVFhfQU1QRFU6IFVuc2lnbmVkIGludCAzMiB2YWx1ZQorICoJY29ycmVzcG9uZGluZyB0byByZXNwZWN0aXZlIEFDCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX01QRFVfTE9TVDogVW5zaWduZWQgaW50IDMyIHZhbHVlCisgKgljb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgQUMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfUkVUUklFUzogVW5zaWduZWQgaW50IDMyIHZhbHVlCisgKgljb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgQUMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfUkVUUklFU19TSE9SVDogVW5zaWduZWQgaW50IDMyIHZhbHVlCisgKgljb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgQUMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfQ09OVEVOVElPTl9USU1FX01JTjogVW5zaWduZWQgaW50IDMyCisgKgl2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgQUMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfQ09OVEVOVElPTl9USU1FX01BWDogVW5zaWduZWQgaW50IDMyCisgKgl2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgQUMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfQ09OVEVOVElPTl9USU1FX0FWRzogVW5zaWduZWQgaW50IDMyCisgKgl2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgQUMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfQ09OVEVOVElPTl9OVU1fU0FNUExFUzogVW5zaWduZWQgaW50IDMyCisgKgl2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgQUMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9OVU1fUEVFUlM6IFVuc2lnbmVkIGludCAzMgorICoJdmFsdWUgY29ycmVzcG9uZGluZyB0byByZXNwZWN0aXZlIEFDCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUEVFUl9JTkZPX1RZUEU6IFR5cGUgPSBlbnVtIHdpZmlfcGVlcl90eXBlCisgKglQZWVyIHR5cGUsIGUuZy4sIFNUQSwgQVAsIFAyUCBHTyBldGMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19QRUVSX0lORk9fTUFDX0FERFJFU1M6IE1BQyBhZGRyIGNvcnJlc3BvbmRpbmcKKyAqCXRvIHJlc3BlY3RpdmUgcGVlci4gQW4gYXJyYXkgb2YgNiBVbnNpZ25lZCA4Yml0IHZhbHVlcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1BFRVJfSU5GT19DQVBBQklMSVRJRVM6IFVuc2lnbmVkIGludCAzMmJpdAorICoJdmFsdWUgcmVwcmVzZW50aW5nIGNhcGFiaWxpdGllcyBjb3JyZXNwb25kaW5nIHRvIHJlc3BlY3RpdmUgcGVlci4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19QRUVSX0lORk9fTlVNX1JBVEVTOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZS4KKyAqCU51bWJlciBvZiByYXRlcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBVEVfUFJFQU1CTEU6IFVuc2lnbmVkIGludCA4Yml0IHZhbHVlOgorICoJMDogT0ZETSwgMTpDQ0ssIDI6SFQgMzpWSFQgNC4uNyByZXNlcnZlZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBVEVfTlNTOiBVbnNpZ25lZCBpbnQgOGJpdCB2YWx1ZToKKyAqCTA6MXgxLCAxOjJ4MiwgMzozeDMsIDQ6NHg0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9CVzogVW5zaWduZWQgaW50IDhiaXQgdmFsdWU6CisgKgkwOjIwTUh6LCAxOjQwTWh6LCAyOjgwTWh6LCAzOjE2ME1oegorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBVEVfTUNTX0lOREVYOiBVbnNpZ25lZCBpbnQgOGJpdCB2YWx1ZToKKyAqCU9GRE0vQ0NLIHJhdGUgY29kZSB3b3VsZCBiZSBhcyBwZXIgSUVFRSBTdGQgaW4gdGhlIHVuaXRzIG9mIDAuNW1icHMKKyAqCUhUL1ZIVCBpdCB3b3VsZCBiZSBtY3MgaW5kZXgKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX0JJVF9SQVRFOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZS4KKyAqCUJpdCByYXRlIGluIHVuaXRzIG9mIDEwMEticHMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX1RYX01QRFU6IFVuc2lnbmVkIGludCAzMmJpdCB2YWx1ZS4KKyAqCU51bWJlciBvZiBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgZGF0YSBwa3RzIGkuZS4sIHdpdGggQUNLIHJlY2VpdmVkCisgKgljb3JyZXNwb25kaW5nIHRvIHRoZSByZXNwZWN0aXZlIHJhdGUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX1JYX01QRFU6IFVuc2lnbmVkIGludCAzMmJpdCB2YWx1ZS4KKyAqCU51bWJlciBvZiByZWNlaXZlZCBkYXRhIHBrdHMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzcGVjdGl2ZSByYXRlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9NUERVX0xPU1Q6IFVuc2lnbmVkIGludCAzMmJpdCB2YWx1ZS4KKyAqCU51bWJlciBvZiBkYXRhIHBrdHMgbG9zc2VzLCBpLmUuLCBubyBBQ0sgcmVjZWl2ZWQgY29ycmVzcG9uZGluZyB0bworICoJdGhlIHJlc3BlY3RpdmUgcmF0ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBVEVfUkVUUklFUzogVW5zaWduZWQgaW50IDMyYml0IHZhbHVlLgorICoJVG90YWwgbnVtYmVyIG9mIGRhdGEgcGt0IHJldHJpZXMgZm9yIHRoZSByZXNwZWN0aXZlIHJhdGUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX1JFVFJJRVNfU0hPUlQ6IFVuc2lnbmVkIGludCAzMmJpdCB2YWx1ZS4KKyAqCVRvdGFsIG51bWJlciBvZiBzaG9ydCBkYXRhIHBrdCByZXRyaWVzIGZvciB0aGUgcmVzcGVjdGl2ZSByYXRlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9SRVRSSUVTX0xPTkc6IFVuc2lnbmVkIGludCAzMmJpdCB2YWx1ZS4KKyAqCVRvdGFsIG51bWJlciBvZiBsb25nIGRhdGEgcGt0IHJldHJpZXMgZm9yIHRoZSByZXNwZWN0aXZlIHJhdGUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19JRDogUmFkaW8gaWQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19PTl9USU1FOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZS4KKyAqCVRvdGFsIG51bWJlciBvZiBtc2VjcyB0aGUgcmFkaW8gaXMgYXdha2UgYWNjcnVpbmcgb3ZlciB0aW1lCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fVFhfVElNRTogVW5zaWduZWQgMzJiaXQgdmFsdWUuCisgKglUb3RhbCBudW1iZXIgb2YgbXNlY3MgdGhlIHJhZGlvIGlzIHRyYW5zbWl0dGluZyBhY2NydWluZyBvdmVyIHRpbWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19SWF9USU1FOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZS4KKyAqCVRvdGFsIG51bWJlciBvZiBtc2VjcyB0aGUgcmFkaW8gaXMgaW4gYWN0aXZlIHJlY2VpdmUgYWNjcnVpbmcgb3ZlciB0aW1lCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fT05fVElNRV9TQ0FOOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZS4KKyAqCVRvdGFsIG51bWJlciBvZiBtc2VjcyB0aGUgcmFkaW8gaXMgYXdha2UgZHVlIHRvIGFsbCBzY2FuIGFjY3J1aW5nCisgKglvdmVyIHRpbWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19PTl9USU1FX05CRDogVW5zaWduZWQgMzJiaXQgdmFsdWUuCisgKglUb3RhbCBudW1iZXIgb2YgbXNlY3MgdGhlIHJhZGlvIGlzIGF3YWtlIGR1ZSB0byBOQU4gYWNjcnVpbmcgb3ZlciB0aW1lLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBRElPX09OX1RJTUVfR1NDQU46IFVuc2lnbmVkIDMyYml0IHZhbHVlLgorICoJVG90YWwgbnVtYmVyIG9mIG1zZWNzIHRoZSByYWRpbyBpcyBhd2FrZSBkdWUgdG8gR1NDQU4gYWNjcnVpbmcgb3ZlciB0aW1lCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fT05fVElNRV9ST0FNX1NDQU46IFVuc2lnbmVkIDMyYml0IHZhbHVlLgorICoJVG90YWwgbnVtYmVyIG9mIG1zZWNzIHRoZSByYWRpbyBpcyBhd2FrZSBkdWUgdG8gcm9hbSBzY2FuIGFjY3J1aW5nIG92ZXIKKyAqCXRpbWUuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fT05fVElNRV9QTk9fU0NBTjogVW5zaWduZWQgMzJiaXQgdmFsdWUuCisgKglUb3RhbCBudW1iZXIgb2YgbXNlY3MgdGhlIHJhZGlvIGlzIGF3YWtlIGR1ZSB0byBQTk8gc2NhbiBhY2NydWluZyBvdmVyCisgKgl0aW1lLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBRElPX09OX1RJTUVfSFMyMDogVW5zaWduZWQgMzJiaXQgdmFsdWUuCisgKglUb3RhbCBudW1iZXIgb2YgbXNlY3MgdGhlIHJhZGlvIGlzIGF3YWtlIGR1ZSB0byBIUzIuMCBzY2FucyBhbmQgR0FTCisgKglleGNoYW5nZSBhY2NydWluZyBvdmVyIHRpbWUuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fTlVNX0NIQU5ORUxTOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZS4KKyAqCU51bWJlciBvZiBjaGFubmVscworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfSU5GT19XSURUSDoKKyAqCVR5cGUgPSBlbnVtIHdpZmlfY2hhbm5lbF93aWR0aC4gQ2hhbm5lbCB3aWR0aCwgZS5nLiwgMjAsIDQwLCA4MCwgZXRjLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfSU5GT19DRU5URVJfRlJFUToKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlLiBQcmltYXJ5IDIwTUh6IGNoYW5uZWwuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0hBTk5FTF9JTkZPX0NFTlRFUl9GUkVRMDoKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlLiBDZW50ZXIgZnJlcXVlbmN5IChNSHopIGZpcnN0IHNlZ21lbnQuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0hBTk5FTF9JTkZPX0NFTlRFUl9GUkVRMToKKyAqCVVuc2lnbmVkIDMyYml0IHZhbHVlLiBDZW50ZXIgZnJlcXVlbmN5IChNSHopIHNlY29uZCBzZWdtZW50LgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfT05fVElNRTogVW5zaWduZWQgaW50IDMyYml0IHZhbHVlCisgKglyZXByZXNlbnRpbmcgdG90YWwgbnVtYmVyIG9mIG1zZWNzIHRoZSByYWRpbyBpcyBhd2FrZSBvbiB0aGF0IGNoYW5uZWwKKyAqCWFjY3J1aW5nIG92ZXIgdGltZSwgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzcGVjdGl2ZSBjaGFubmVsLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfQ0NBX0JVU1lfVElNRTogIFVuc2lnbmVkIGludCAzMmJpdAorICoJdmFsdWUgcmVwcmVzZW50aW5nIHRvdGFsIG51bWJlciBvZiBtc2VjcyB0aGUgQ0NBIHJlZ2lzdGVyIGlzIGJ1c3kKKyAqCWFjY3J1aW5nICBvdmVyIHRpbWUgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzcGVjdGl2ZSBjaGFubmVsLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX05VTV9SQURJT1M6IE51bWJlciBvZiByYWRpb3MKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DSF9JTkZPOiBDaGFubmVsIGluZm8KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19QRUVSX0lORk86IFBlZXIgaW5mbworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1BFRVJfSU5GT19SQVRFX0lORk86IFBlZXIgcmF0ZSBpbmZvCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0lORk86IFdNTSBpbmZvCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkVTVUxUU19NT1JFX0RBVEE6IFVuc2lnbmVkIDhiaXQgdmFsdWUuCisgKglVc2VkIGJ5IHRoZSBkcml2ZXI7IGlmIHNldCB0byAxLCBpdCBpbmRpY2F0ZXMgdGhhdCBtb3JlIHN0YXRzLCBlLmcuLAorICoJcGVlcnMgb3IgcmFkaW8sIGFyZSB0byBmb2xsb3cgaW4gdGhlIG5leHQKKyAqCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTExfU1RBVFNfKl9SRVNVTFRTIGV2ZW50LiBPdGhlcndpc2UsIGl0CisgKglpcyBzZXQgdG8gMC4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9BVkVSQUdFX1RTRl9PRkZTRVQ6IHRzZiBvZmZzZXQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9MRUFLWV9BUF9ERVRFQ1RFRDogbGVha3kgYXAgZGV0ZWN0ZWQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9MRUFLWV9BUF9BVkdfTlVNX0ZSQU1FU19MRUFLRUQ6CisgKglhdmVyYWdlIG51bWJlciBvZiBmcmFtZXMgbGVha2VkCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfTEVBS1lfQVBfR1VBUkRfVElNRTogZ3VhcmQgdGltZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0FGVEVSX0xBU1Q6IEFmdGVyIGxhc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9GRUFUVVJFX1NFVF9NQVg6IE1heCB2YWx1ZQorICovCisKK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfbGxfc3RhdHNfcmVzdWx0cyB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkVTVUxUU19SRVFfSUQgPSAxLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfQkVBQ09OX1JYLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX01HTVRfUlgsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfTUdNVF9BQ1RJT05fUlgsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfTUdNVF9BQ1RJT05fVFgsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfUlNTSV9NR01ULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX1JTU0lfREFUQSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9SU1NJX0FDSywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9JTkZPX01PREUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfSU5GT19NQUNfQUREUiwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9JTkZPX1NUQVRFLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0lORk9fUk9BTUlORywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9JTkZPX0NBUEFCSUxJVElFUywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9JTkZPX1NTSUQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfSU5GT19CU1NJRCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9JTkZPX0FQX0NPVU5UUllfU1RSLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0lORk9fQ09VTlRSWV9TVFIsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfQUMsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX1RYX01QRFUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX1JYX01QRFUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX1RYX01DQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1dNTV9BQ19SWF9NQ0FTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfUlhfQU1QRFUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX1RYX0FNUERVLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1dNTV9BQ19NUERVX0xPU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX1JFVFJJRVMsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX1JFVFJJRVNfU0hPUlQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX1JFVFJJRVNfTE9ORywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfQ09OVEVOVElPTl9USU1FX01JTiwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfQ09OVEVOVElPTl9USU1FX01BWCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfQ09OVEVOVElPTl9USU1FX0FWRywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfQ09OVEVOVElPTl9OVU1fU0FNUExFUywKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX05VTV9QRUVSUywKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1BFRVJfSU5GT19UWVBFLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1BFRVJfSU5GT19NQUNfQUREUkVTUywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19QRUVSX0lORk9fQ0FQQUJJTElUSUVTLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1BFRVJfSU5GT19OVU1fUkFURVMsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX1BSRUFNQkxFLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBVEVfTlNTLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBVEVfQlcsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9NQ1NfSU5ERVgsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9CSVRfUkFURSwKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBVEVfVFhfTVBEVSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX1JYX01QRFUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9NUERVX0xPU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9SRVRSSUVTLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBVEVfUkVUUklFU19TSE9SVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX1JFVFJJRVNfTE9ORywKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBRElPX0lELAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBRElPX09OX1RJTUUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fVFhfVElNRSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19SWF9USU1FLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBRElPX09OX1RJTUVfU0NBTiwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19PTl9USU1FX05CRCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19PTl9USU1FX0dTQ0FOLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBRElPX09OX1RJTUVfUk9BTV9TQ0FOLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBRElPX09OX1RJTUVfUE5PX1NDQU4sCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fT05fVElNRV9IUzIwLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBRElPX05VTV9DSEFOTkVMUywKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfSU5GT19XSURUSCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DSEFOTkVMX0lORk9fQ0VOVEVSX0ZSRVEsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0hBTk5FTF9JTkZPX0NFTlRFUl9GUkVRMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DSEFOTkVMX0lORk9fQ0VOVEVSX0ZSRVExLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0hBTk5FTF9PTl9USU1FLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfQ0NBX0JVU1lfVElNRSwKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX05VTV9SQURJT1MsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0hfSU5GTywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19QRUVSX0lORk8sCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUEVFUl9JTkZPX1JBVEVfSU5GTywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fSU5GTywKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JFU1VMVFNfTU9SRV9EQVRBLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfQVZFUkFHRV9UU0ZfT0ZGU0VULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0xFQUtZX0FQX0RFVEVDVEVELAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0xFQUtZX0FQX0FWR19OVU1fRlJBTUVTX0xFQUtFRCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9MRUFLWV9BUF9HVUFSRF9USU1FLAorCisJLyogVW5zaWduZWQgMzJiaXQgdmFsdWUgdG8gaW5kaWNhdGUgbGwgc3RhdHMgcmVzdWx0IHR5cGUgKi8KKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19UWVBFLAorCisJLyoga2VlcCBsYXN0ICovCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19BRlRFUl9MQVNUIC0gMQorfTsKKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICovCisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9nZXRfc3VwcG9ydGVkX2ZlYXR1cmVzIC0gZ2V0IHN1cHBvcnRlZCBmZWF0dXJlCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0ZFQVRVUkVfU0VUX0lOVkFMSUQ6IEludmFsaWQgaW5pdGlhbCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0ZFQVRVUkVfU0VUOiBVbnNpZ25lZCAzMmJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0ZFQVRVUkVfU0VUX0FGVEVSX0xBU1Q6IEFmdGVyIGxhc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9GRUFUVVJFX1NFVF9NQVg6IE1heCB2YWx1ZQorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2dldF9zdXBwb3J0ZWRfZmVhdHVyZXMgeworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0ZFQVRVUkVfU0VUX0lOVkFMSUQgPSAwLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0ZFQVRVUkVfU0VUID0gMSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9GRUFUVVJFX1NFVF9BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0ZFQVRVUkVfU0VUX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0ZFQVRVUkVfU0VUX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX3NldF9zY2FubmluZ19tYWNfb3VpIC0gc2V0IHNjYW5uaW5nIG1hYyBvdWkKKyAqCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX1NDQU5OSU5HX01BQ19PVUlfSU5WQUxJRDogSW52YWxpZCBpbml0aWFsIHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX1NDQU5OSU5HX01BQ19PVUk6IEFuIGFycmF5IG9mIDMgeCBVbnNpZ25lZCA4LWJpdAorICoJdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TRVRfU0NBTk5JTkdfTUFDX09VSV9BRlRFUl9MQVNUOiBBZnRlciBsYXN0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX1NDQU5OSU5HX01BQ19PVUlfTUFYOiBNYXggdmFsdWUKKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9zZXRfc2Nhbm5pbmdfbWFjX291aSB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX1NDQU5OSU5HX01BQ19PVUlfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX1NDQU5OSU5HX01BQ19PVUkgPSAxLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NFVF9TQ0FOTklOR19NQUNfT1VJX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX1NDQU5OSU5HX01BQ19PVUlfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX1NDQU5OSU5HX01BQ19PVUlfQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfc2NhbiAtIFNwZWNpZmllcyB2ZW5kb3Igc2NhbiBhdHRyaWJ1dGVzCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fSUU6IElFcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBhcyBwYXJ0IG9mIHNjYW4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX0ZSRVFVRU5DSUVTOiBOZXN0ZWQgdW5zaWduZWQgMzItYml0IGF0dHJpYnV0ZXMKKyAqCXdpdGggZnJlcXVlbmNpZXMgdG8gYmUgc2Nhbm5lZCAoaW4gTUh6KQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fU1NJRFM6IE5lc3RlZCBhdHRyaWJ1dGUgd2l0aCBTU0lEcyB0byBiZSBzY2FubmVkCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9TVVBQX1JBVEVTOiBOZXN0ZWQgYXJyYXkgYXR0cmlidXRlIG9mIHN1cHBvcnRlZAorICoJcmF0ZXMgdG8gYmUgaW5jbHVkZWQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX1RYX05PX0NDS19SQVRFOiBmbGFnIHVzZWQgdG8gc2VuZCBwcm9iZSByZXF1ZXN0cworICoJYXQgbm9uIENDSyByYXRlIGluIDJHSHogYmFuZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fRkxBR1M6IFVuc2lnbmVkIDMyLWJpdCBzY2FuIGZsYWdzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9DT09LSUU6IFVuc2lnbmVkIDY0LWJpdCBjb29raWUgcHJvdmlkZWQgYnkgdGhlCisgKglkcml2ZXIgZm9yIHRoZSBzcGVjaWZpYyBzY2FuIHJlcXVlc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX1NUQVRVUzogVW5zaWduZWQgOC1iaXQgc3RhdHVzIG9mIHRoZSBzY2FuCisgKglyZXF1ZXN0IGRlY29kZWQgYXMgaW4gZW51bSBzY2FuX3N0YXR1cworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fTUFDOiA2LWJ5dGUgTUFDIGFkZHJlc3MgdG8gdXNlIHdoZW4gcmFuZG9taXNhdGlvbgorICoJc2NhbiBmbGFnIGlzIHNldAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fTUFDX01BU0s6IDYtYnl0ZSBNQUMgYWRkcmVzcyBtYXNrIHRvIGJlIHVzZWQgd2l0aAorICoJcmFuZG9taXNhdGlvbgorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX3NjYW4geworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fSU5WQUxJRF9QQVJBTSA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9JRSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX0ZSRVFVRU5DSUVTLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fU1NJRFMsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9TVVBQX1JBVEVTLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fVFhfTk9fQ0NLX1JBVEUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9GTEFHUywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX0NPT0tJRSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX1NUQVRVUywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX01BQywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX01BQ19NQVNLLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBzY2FuX3N0YXR1cyAtIFNwZWNpZmllcyB0aGUgdmFsaWQgdmFsdWVzIHRoZSB2ZW5kb3Igc2NhbiBhdHRyaWJ1dGUKKyAqCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fU1RBVFVTIGNhbiB0YWtlCisgKiBAVkVORE9SX1NDQU5fU1RBVFVTX05FV19SRVNVTFRTOiBpbXBsaWVzIHRoZSB2ZW5kb3Igc2NhbiBpcyBzdWNjZXNzZnVsIHdpdGgKKyAqCW5ldyBzY2FuIHJlc3VsdHMKKyAqIEBWRU5ET1JfU0NBTl9TVEFUVVNfQUJPUlRFRDogaW1wbGllcyB0aGUgdmVuZG9yIHNjYW4gd2FzIGFib3J0ZWQgaW4tYmV0d2VlbgorICovCitlbnVtIHNjYW5fc3RhdHVzIHsKKwlWRU5ET1JfU0NBTl9TVEFUVVNfTkVXX1JFU1VMVFMsCisJVkVORE9SX1NDQU5fU1RBVFVTX0FCT1JURUQsCisJVkVORE9SX1NDQU5fU1RBVFVTX01BWCwKK307CisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9nZXRfY29uY3VycmVuY3lfbWF0cml4IC0gZ2V0IGNvbmN1cnJlbmN5IG1hdHJpeAorICoKKyAqIE5MIGF0dHJpYnV0ZXMgZm9yIGRhdGEgdXNlZCBieQorICogUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYIHN1YiBjb21tYW5kLgorICoKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYX0lOVkFMSUQ6IEludmFsaWQgaW5pdGlhbCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0dFVF9DT05DVVJSRU5DWV9NQVRSSVhfQ09ORklHX1BBUkFNX1NFVF9TSVpFX01BWDoKKyAqCVVuc2lnbmVkIDMyLWJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0dFVF9DT05DVVJSRU5DWV9NQVRSSVhfUkVTVUxUU19TRVRfU0laRToKKyAqCVVuc2lnbmVkIDMyLWJpdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0dFVF9DT05DVVJSRU5DWV9NQVRSSVhfUkVTVUxUU19TRVQ6IFNldCByZXN1bHRzLiBBbgorICoJYXJyYXkgb2YgU0VUX1NJWkUgeCBVbnNpZ25lZCAzMmJpdCB2YWx1ZXMgcmVwcmVzZW50aW5nIGNvbmN1cnJlbmN5CisgKgljb21iaW5hdGlvbnMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYX0FGVEVSX0xBU1Q6IEFmdGVyIGxhc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYX01BWDogTWF4IHZhbHVlCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfZ2V0X2NvbmN1cnJlbmN5X21hdHJpeCB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX0NPTkNVUlJFTkNZX01BVFJJWF9JTlZBTElEID0gMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYX0NPTkZJR19QQVJBTV9TRVRfU0laRV9NQVgKKwkJCQkJCQkJCT0gMSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYX1JFU1VMVFNfU0VUX1NJWkUgPSAyLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0dFVF9DT05DVVJSRU5DWV9NQVRSSVhfUkVTVUxUU19TRVQgPSAzLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0dFVF9DT05DVVJSRU5DWV9NQVRSSVhfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfQ09OQ1VSUkVOQ1lfTUFUUklYX01BWCA9CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX0NPTkNVUlJFTkNZX01BVFJJWF9BRlRFUl9MQVNUIC0gMSwKK307CisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9zZXRfbm9fZGZzX2ZsYWcgLSB2ZW5kb3IgYXR0cmlidXRlIHNldCBubyBkZnMgZmxhZworICoKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TRVRfTk9fREZTX0ZMQUdfSU5WQUxJRDogSW52YWxpZCBpbml0aWFsIHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX05PX0RGU19GTEFHOiBVbnNpZ25lZCAzMi1iaXQgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TRVRfTk9fREZTX0ZMQUdfQUZURVJfTEFTVDogQWZ0ZXIgbGFzdAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NFVF9OT19ERlNfRkxBR19NQVg6IE1heCB2YWx1ZQorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX3NldF9ub19kZnNfZmxhZyB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX05PX0RGU19GTEFHX0lOVkFMSUQgPSAwLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NFVF9OT19ERlNfRkxBRyA9IDEsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX05PX0RGU19GTEFHX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfU0VUX05PX0RGU19GTEFHX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NFVF9OT19ERlNfRkxBR19BRlRFUl9MQVNUIC0gMSwKK307CisKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX3JvYW1fYXV0aCAtIHZlbmRvciBldmVudCBmb3Igcm9hbWluZworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fQVVUSF9CU1NJRDogQlNTSUQgb2YgdGhlIHJvYW1lZCBBUAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fQVVUSF9SRVFfSUU6IFJlcXVlc3QgSUUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX0FVVEhfUkVTUF9JRTogUmVzcG9uc2UgSUUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX0FVVEhfQVVUSE9SSVpFRDogQXV0aG9yaXphdGlvbiBTdGF0dXMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX0FVVEhfS0VZX1JFUExBWV9DVFI6IFJlcGxheSBDb3VudGVyCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9BVVRIX1BUS19LQ0s6IEtDSyBvZiB0aGUgUFRLCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9BVVRIX1BUS19LRUs6IEtFSyBvZiB0aGUgUFRLCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfcm9hbV9hdXRoIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX0FVVEhfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9BVVRIX0JTU0lELAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fQVVUSF9SRVFfSUUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9BVVRIX1JFU1BfSUUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9BVVRIX0FVVEhPUklaRUQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9BVVRIX0tFWV9SRVBMQVlfQ1RSLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fQVVUSF9QVEtfS0NLLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fQVVUSF9QVEtfS0VLLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fQVVUSF9BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fQVVUSF9NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX0FVVEhfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl93aWZpX2NvbmZpZyAtIHdpZmkgY29uZmlnCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfQ09ORklHX0lOVkFMSUQ6IEludmFsaWQgaW5pdGlhbCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfQ09ORklHX0RZTkFNSUNfRFRJTTogZHluYW1pYyBEVElNCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9DT05GSUdfU1RBVFNfQVZHX0ZBQ1RPUjogYXZnIGZhY3RvcgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfQ09ORklHX0dVQVJEX1RJTUU6IGd1YXJkIHRpbWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0NPTkZJR19BRlRFUl9MQVNUOiBhZnRlciBsYXN0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9DT05GSUdfTUFYOiBtYXggdmFsdWUKKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl93aWZpX2NvbmZpZyB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9DT05GSUdfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9DT05GSUdfRFlOQU1JQ19EVElNID0gMSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0NPTkZJR19TVEFUU19BVkdfRkFDVE9SID0gMiwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0NPTkZJR19HVUFSRF9USU1FID0gMywKKworCS8qIGtlZXAgbGFzdCAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfQ09ORklHX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9DT05GSUdfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9DT05GSUdfQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fZXBub190eXBlIC0gdGhlIHR5cGUgb2YgcmVxdWVzdCB0byB0aGUgRVBOTyBjb21tYW5kCisgKiBAUUNBX1dMQU5fRVBOTzogZXBubyB0eXBlIHJlcXVlc3QKKyAqIEBRQ0FfV0xBTl9QTk86IHBubyB0eXBlIHJlcXVlc3QKKyAqLworZW51bSBxY2Ffd2xhbl9lcG5vX3R5cGUgeworCVFDQV9XTEFOX0VQTk8sCisJUUNBX1dMQU5fUE5PCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfcG5vX2NvbmZpZ19wYXJhbXMgLSBwbm8gY29uZmlnIHBhcmFtcworICoKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fSU5WQUxJRCAtIEludmFsaWQgaW5pdGlhbCB2YWx1ZQorICoKKyAqCU5MIGF0dHJpYnV0ZXMgZm9yIGRhdGEgdXNlZCBieQorICoJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9QTk9fU0VUX1BBU1NQT0lOVF9MSVNUIHN1YiBjb21tYW5kLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19QQVNTUE9JTlRfTElTVF9QQVJBTV9OVU06CisgKglVbnNpZ25lZCAzMi1iaXQgdmFsdWU7IHBubyBwYXNzcG9pbnQgbnVtYmVyIG9mIG5ldHdvcmtzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9MSVNUX1BBUkFNX05FVFdPUktfQVJSQVk6CisgKglBcnJheSBvZiBuZXN0ZWQgUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9ORVRXT1JLX1BBUkFNXyoKKyAqCWF0dHJpYnV0ZXMuIEFycmF5IHNpemUgPQorICoJUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9MSVNUX1BBUkFNX05VTS4KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX05FVFdPUktfUEFSQU1fSUQ6CisgKglVbnNpZ25lZCAzMi1iaXQgdmFsdWU7IG5ldHdvcmsgaWQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX05FVFdPUktfUEFSQU1fUkVBTE06CisgKglBbiBhcnJheSBvZiAyNTYgeCBVbnNpZ25lZCA4LWJpdCB2YWx1ZTsgTlVMTCB0ZXJtaW5hdGVkIFVURjggZW5jb2RlZAorICoJcmVhbG0sIDAgaWYgdW5zcGVjaWZpZWQuCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9ORVRXT1JLX1BBUkFNX1JPQU1fQ05TUlRNX0lEOgorICoJQW4gYXJyYXkgb2YgMTYgeCBVbnNpZ25lZCAzMi1iaXQgdmFsdWU7IHJvYW1pbmcgY29uc29ydGl1bSBpZHMKKyAqCXRvIG1hdGNoLCAwIGlmIHVuc3BlY2lmaWVkLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19QQVNTUE9JTlRfTkVUV09SS19QQVJBTV9ST0FNX1BMTU46CisgKglBbiBhcnJheSBvZiA2IHggVW5zaWduZWQgOC1iaXQgdmFsdWU7IG1jYy9tbmMgY29tYmluYXRpb24sIDBzIGlmCisgKgl1bnNwZWNpZmllZC4KKyAqCisgKglOTCBhdHRyaWJ1dGVzIGZvciBkYXRhIHVzZWQgYnkKKyAqCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfUE5PX1NFVF9MSVNUIHN1YiBjb21tYW5kLgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19TRVRfTElTVF9QQVJBTV9OVU1fTkVUV09SS1M6CisgKglVbnNpZ25lZCAzMi1iaXQgdmFsdWU7IHNldCBwbm8gbnVtYmVyIG9mIG5ldHdvcmtzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1NFVF9MSVNUX1BBUkFNX0VQTk9fTkVUV09SS1NfTElTVDoKKyAqCUFycmF5IG9mIG5lc3RlZAorICoJUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1NFVF9MSVNUX1BBUkFNX0VQTk9fTkVUV09SS18qCisgKglhdHRyaWJ1dGVzLiBBcnJheSBzaXplID0KKyAqCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fTlVNX05FVFdPUktTCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1NFVF9MSVNUX1BBUkFNX0VQTk9fTkVUV09SS19TU0lEOgorICoJQW4gYXJyYXkgb2YgMzMgeCBVbnNpZ25lZCA4LWJpdCB2YWx1ZTsgTlVMTCB0ZXJtaW5hdGVkIFNTSUQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX1JTU0lfVEhSRVNIT0xEOgorICoJU2lnbmVkIDgtYml0IHZhbHVlOyB0aHJlc2hvbGQgZm9yIGNvbnNpZGVyaW5nIHRoaXMgU1NJRCBhcyBmb3VuZCwKKyAqCXJlcXVpcmVkIGdyYW51bGFyaXR5IGZvciB0aGlzIHRocmVzaG9sZCBpcyA0ZEJtIHRvIDhkQm0KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX0ZMQUdTOgorICoJVW5zaWduZWQgOC1iaXQgdmFsdWU7IFdJRklfUE5PX0ZMQUdfWFhYCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1NFVF9MSVNUX1BBUkFNX0VQTk9fTkVUV09SS19BVVRIX0JJVDoKKyAqCVVuc2lnbmVkIDgtYml0IHZhbHVlOyBhdXRoIGJpdCBmaWVsZCBmb3IgbWF0Y2hpbmcgV1BBIElFCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1NFVF9MSVNUX1BBUkFNX0VQTk9fVFlQRQorICoJVW5zaWduZWQgOC1iaXQgdG8gaW5kaWNhdGUgZVBOTyB0eXBlOyB2YWx1ZXMgZnJvbSBxY2Ffd2xhbl9lcG5vX3R5cGUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fQUZURVJfTEFTVDogQWZ0ZXIgbGFzdAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19NQVg6IG1heAorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX3Bub19jb25maWdfcGFyYW1zIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fSU5WQUxJRCA9IDAsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX0xJU1RfUEFSQU1fTlVNID0gMSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX0xJU1RfUEFSQU1fTkVUV09SS19BUlJBWSA9IDIsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9ORVRXT1JLX1BBUkFNX0lEID0gMywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX05FVFdPUktfUEFSQU1fUkVBTE0gPSA0LAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19QQVNTUE9JTlRfTkVUV09SS19QQVJBTV9ST0FNX0NOU1JUTV9JRCA9IDUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9ORVRXT1JLX1BBUkFNX1JPQU1fUExNTiA9IDYsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fTlVNX05FVFdPUktTID0gNywKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLU19MSVNUID0gOCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX1NTSUQgPSA5LAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19TRVRfTElTVF9QQVJBTV9FUE5PX05FVFdPUktfUlNTSV9USFJFU0hPTEQgPSAxMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX0ZMQUdTID0gMTEsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1NFVF9MSVNUX1BBUkFNX0VQTk9fTkVUV09SS19BVVRIX0JJVCA9IDEyLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19TRVRfTElTVF9QQVJBTV9FUE5PX1RZUEUgPSAxMywKKworCS8qIGtlZXAgbGFzdCAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfcm9hbWluZ19jb25maWdfcGFyYW1zIC0gcm9hbWluZyBjb25maWcgcGFyYW1zCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fSU5WQUxJRDogSW52YWxpZCBpbml0aWFsIHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19TVUJDTUQ6IHJvYW1pbmcgc3ViIGNvbW1hbmQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1JFUV9JRDogUmVxdWVzdCBpZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fV0hJVEVfTElTVF9TU0lEX05VTV9ORVRXT1JLUzoKKyAqCW51bWJlciBvZiB3aGl0ZWxpc3QgbmV0d29ya3MKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1dISVRFX0xJU1RfU1NJRF9MSVNUOgorICoJV2hpdGVsaXN0IHNzaWQgbGlzdAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fV0hJVEVfTElTVF9TU0lEOgorICoJd2hpdGUgbGlzdCBzc2lkCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9BX0JBTkRfQk9PU1RfVEhSRVNIT0xEOgorICoJJ2EnIGJhbmQgYm9vc3QgdGhyZXNob2xkCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9BX0JBTkRfUEVOQUxUWV9USFJFU0hPTEQ6CisgKgknYScgYmFuZCBwZW5hbHR5IHRocmVzaG9sZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fQV9CQU5EX0JPT1NUX0ZBQ1RPUjoKKyAqCSdhJyBiYW5kIGJvb3N0IGZhY3RvcgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fQV9CQU5EX1BFTkFMVFlfRkFDVE9SOgorICoJJ2EnIGJhbmQgcGVuYWx0eSBmYWN0b3IKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FfQkFORF9NQVhfQk9PU1Q6CisgKgknYScgYmFuZCBtYXggYm9vc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0xBWllfUk9BTV9ISVNURVJFU1lTOgorICoJbGF6eSByb2FtIGhpc3RlcmVzeXMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FMRVJUX1JPQU1fUlNTSV9UUklHR0VSOgorICoJYWxlcnQgcm9hbSByc3NpIHRyaWdnZXIKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1NFVF9MQVpZX1JPQU1fRU5BQkxFOgorICoJc2V0IGxhenkgcm9hbSBlbmFibGUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1NFVF9CU1NJRF9QUkVGUzoKKyAqCXNldCBic3NpZCBwcmVmZXJlbmNlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9TRVRfTEFaWV9ST0FNX05VTV9CU1NJRDoKKyAqCXNldCBsYXp5IHJvYW0gbnVtYmVyIG9mIGJzc2lkCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9TRVRfTEFaWV9ST0FNX0JTU0lEOgorICoJc2V0IGxhenkgcm9hbSBic3NpZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fU0VUX0xBWllfUk9BTV9SU1NJX01PRElGSUVSOgorICoJc2V0IGxhenkgcm9hbSByc3NpIG1vZGlmaWVyCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9TRVRfQlNTSURfUEFSQU1TOgorICoJc2V0IGJzc2lkIHBhcmFtcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fU0VUX0JTU0lEX1BBUkFNU19OVU1fQlNTSUQ6CisgKglzZXQgYnNzaWQgcGFyYW1zIG51bSBic3NpZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fU0VUX0JTU0lEX1BBUkFNU19CU1NJRDoKKyAqCXNldCBic3NpZCBwYXJhbXMgYnNzaWQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FGVEVSX0xBU1Q6IEFmdGVyIGxhc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX01BWDogTWF4CisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfcm9hbWluZ19jb25maWdfcGFyYW1zIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0lOVkFMSUQgPSAwLAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19TVUJDTUQgPSAxLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUkVRX0lEID0gMiwKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fV0hJVEVfTElTVF9TU0lEX05VTV9ORVRXT1JLUyA9IDMsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9XSElURV9MSVNUX1NTSURfTElTVCA9IDQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9XSElURV9MSVNUX1NTSUQgPSA1LAorCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9BX0JBTkRfQk9PU1RfVEhSRVNIT0xEID0gNiwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FfQkFORF9QRU5BTFRZX1RIUkVTSE9MRCA9IDcsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9BX0JBTkRfQk9PU1RfRkFDVE9SID0gOCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FfQkFORF9QRU5BTFRZX0ZBQ1RPUiA9IDksCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9BX0JBTkRfTUFYX0JPT1NUID0gMTAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9MQVpZX1JPQU1fSElTVEVSRVNZUyA9IDExLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fQUxFUlRfUk9BTV9SU1NJX1RSSUdHRVIgPSAxMiwKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fU0VUX0xBWllfUk9BTV9FTkFCTEUgPSAxMywKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fU0VUX0JTU0lEX1BSRUZTID0gMTQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9TRVRfTEFaWV9ST0FNX05VTV9CU1NJRCA9IDE1LAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fU0VUX0xBWllfUk9BTV9CU1NJRCA9IDE2LAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1JTkdfUEFSQU1fU0VUX0xBWllfUk9BTV9SU1NJX01PRElGSUVSID0gMTcsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1NFVF9CU1NJRF9QQVJBTVMgPSAxOCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX1NFVF9CU1NJRF9QQVJBTVNfTlVNX0JTU0lEID0gMTksCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9TRVRfQlNTSURfUEFSQU1TX0JTU0lEID0gMjAsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTUlOR19QQVJBTV9NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNSU5HX1BBUkFNX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX3JvYW1fc3ViY21kIC0gcm9hbSBzdWIgY29tbWFuZHMKKyAqCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfSU5WQUxJRDogSW52YWxpZCBpbml0aWFsIHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfU1NJRF9XSElURV9MSVNUOiBzc2lkIHdoaXRlIGxpc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX1NVQkNNRF9TRVRfRVhUU0NBTl9ST0FNX1BBUkFNUzogcm9hbSBwYXJhbXMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX1NVQkNNRF9TRVRfTEFaWV9ST0FNOiBzZXQgbGF6eSByb2FtCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfU0VUX0JTU0lEX1BSRUZTOiBzZXQgYnNzaWQgcHJlZnMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX1NVQkNNRF9TRVRfQlNTSURfUEFSQU1TOiBzZXQgYnNzaWQgcGFyYW1zCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfU0VUX0JMQUNLTElTVF9CU1NJRDogc2V0IGJsYWNrbGlzdCBic3NpZAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fU1VCQ01EX0FGVEVSX0xBU1Q6IGFmdGVyIGxhc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX1NVQkNNRF9NQVg6IHN1YmNtZCBtYXgKKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9yb2FtX3N1YmNtZCB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfU1NJRF9XSElURV9MSVNUID0gMSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX1NVQkNNRF9TRVRfRVhUU0NBTl9ST0FNX1BBUkFNUyA9IDIsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfU0VUX0xBWllfUk9BTSA9IDMsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfU0VUX0JTU0lEX1BSRUZTID0gNCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX1NVQkNNRF9TRVRfQlNTSURfUEFSQU1TID0gNSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9ST0FNX1NVQkNNRF9TRVRfQkxBQ0tMSVNUX0JTU0lEID0gNiwKKworCS8qIEtFRVAgTEFTVCAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JPQU1fU1VCQ01EX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfUk9BTV9TVUJDTURfQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfZ2V0X3dpZmlfaW5mbyAtIHdpZmkgZHJpdmVyIGluZm9ybWF0aW9uCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfSU5GT19HRVRfSU5WQUxJRDogSW52YWxpZCBpbml0aWFsIHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9JTkZPX0RSSVZFUl9WRVJTSU9OOiBnZXQgaG9zdCBkcml2ZXIgdmVyc2lvbgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfSU5GT19GSVJNV0FSRV9WRVJTSU9OOiBnZXIgZmlybXdhcmUgdmVyc2lvbgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfSU5GT19HRVRfQUZURVJfTEFTVDogYWZ0ZXIgbGFzdAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfSU5GT19HRVRfTUFYOiBzdWJjbWQgbWF4CisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfZ2V0X3dpZmlfaW5mbyB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9JTkZPX0dFVF9JTlZBTElEID0gMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0lORk9fRFJJVkVSX1ZFUlNJT04gICAgID0gMSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0lORk9fRklSTVdBUkVfVkVSU0lPTiAgID0gMiwKKworCS8qIEtFRVAgTEFTVCAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfSU5GT19HRVRfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0lORk9fR0VUX01BWCAgPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0lORk9fR0VUX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2dldF9sb2dnZXJfZmVhdHVyZXMgLSB2YWx1ZSBmb3IgbG9nZ2VyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgZmVhdHVyZXMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MT0dHRVJfSU5WQUxJRCAtIEludmFsaWQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MT0dHRVJfU1VQUE9SVEVEIC0gSW5kaWNhdGUgdGhlIHN1cHBvcnRlZCBmZWF0dXJlcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xPR0dFUl9BRlRFUl9MQVNUIC0gVG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBlbnVtCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfTE9HR0VSX01BWCAtIG1heCB2YWx1ZSBwb3NzaWJsZSBmb3IgdGhpcyB0eXBlCisgKgorICogZW51bSB2YWx1ZXMgYXJlIHVzZWQgZm9yIE5MIGF0dHJpYnV0ZXMgZm9yIGRhdGEgdXNlZCBieQorICogUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9HRVRfTE9HR0VSX0ZFQVRVUkVfU0VUIHN1YiBjb21tYW5kLgorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2dldF9sb2dnZXJfZmVhdHVyZXMgeworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xPR0dFUl9JTlZBTElEID0gMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MT0dHRVJfU1VQUE9SVEVEID0gMSwKKworCS8qIGtlZXAgbGFzdCAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xPR0dFUl9BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xPR0dFUl9NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MT0dHRVJfQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2ZlYXR1cmVzIC0gdmVuZG9yIGRldmljZS9kcml2ZXIgZmVhdHVyZXMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfRkVBVFVSRV9LRVlfTUdNVF9PRkZMT0FEOiBEZXZpY2Ugc3VwcG9ydHMga2V5CisgKiBtYW5hZ2VtZW50IG9mZmxvYWQsIGEgbWVjaGFuaXNtIHdoZXJlIHRoZSBzdGF0aW9uJ3MgZmlybXdhcmUKKyAqIGRvZXMgdGhlIGV4Y2hhbmdlIHdpdGggdGhlIEFQIHRvIGVzdGFibGlzaCB0aGUgdGVtcG9yYWwga2V5cworICogYWZ0ZXIgcm9hbWluZywgcmF0aGVyIHRoYW4gaGF2aW5nIHRoZSBzdXBwbGljYW50IGRvIGl0LgorICogQFFDQV9XTEFOX1ZFTkRPUl9GRUFUVVJFX09GRkNIQU5ORUxfU0lNVUxUQU5FT1VTOiBEZXZpY2Ugc3VwcG9ydHMKKyAqICAgICAgICBzaW11bHRhbmVvdXMgb2ZmLWNoYW5uZWwgb3BlcmF0aW9ucy4KKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfZmVhdHVyZXMgeworCVFDQV9XTEFOX1ZFTkRPUl9GRUFUVVJFX0tFWV9NR01UX09GRkxPQUQgPSAwLAorCVFDQV9XTEFOX1ZFTkRPUl9GRUFUVVJFX1NVUFBPUlRfSFdfTU9ERV9BTlkgPSAxLAorCVFDQV9XTEFOX1ZFTkRPUl9GRUFUVVJFX09GRkNIQU5ORUxfU0lNVUxUQU5FT1VTID0gMiwKKwkvKiBBZGRpdGlvbmFsIGZlYXR1cmVzIG5lZWQgdG8gYmUgYWRkZWQgYWJvdmUgdGhpcyAqLworCU5VTV9RQ0FfV0xBTl9WRU5ET1JfRkVBVFVSRVMKK307CisKKy8qIEZlYXR1cmUgZGVmaW5lcyAqLworI2RlZmluZSBXSUZJX0ZFQVRVUkVfSU5GUkEgICAgICAgICAgICAgIDB4MDAwMSAgLyogQmFzaWMgaW5mcmFzdHJ1Y3R1cmUgbW9kZSAqLworI2RlZmluZSBXSUZJX0ZFQVRVUkVfSU5GUkFfNUcgICAgICAgICAgIDB4MDAwMiAgLyogU3VwcG9ydCBmb3IgNSBHSHogQmFuZCAqLworI2RlZmluZSBXSUZJX0ZFQVRVUkVfSE9UU1BPVCAgICAgICAgICAgIDB4MDAwNCAgLyogU3VwcG9ydCBmb3IgR0FTL0FOUVAgKi8KKyNkZWZpbmUgV0lGSV9GRUFUVVJFX1AyUCAgICAgICAgICAgICAgICAweDAwMDggIC8qIFdpZmktRGlyZWN0ICovCisjZGVmaW5lIFdJRklfRkVBVFVSRV9TT0ZUX0FQICAgICAgICAgICAgMHgwMDEwICAvKiBTb2Z0IEFQICovCisjZGVmaW5lIFdJRklfRkVBVFVSRV9FWFRTQ0FOICAgICAgICAgICAgMHgwMDIwICAvKiBFeHRlbmRlZCBTY2FuIEFQSXMgKi8KKyNkZWZpbmUgV0lGSV9GRUFUVVJFX05BTiAgICAgICAgICAgICAgICAweDAwNDAgIC8qIE5laWdoYm9yIEF3YXJlbmVzcworCQkJCQkJICAgTmV0d29ya2luZyAqLworI2RlZmluZSBXSUZJX0ZFQVRVUkVfRDJEX1JUVAkJMHgwMDgwICAvKiBEZXZpY2UtdG8tZGV2aWNlIFJUVCAqLworI2RlZmluZSBXSUZJX0ZFQVRVUkVfRDJBUF9SVFQgICAgICAgICAgIDB4MDEwMCAgLyogRGV2aWNlLXRvLUFQIFJUVCAqLworI2RlZmluZSBXSUZJX0ZFQVRVUkVfQkFUQ0hfU0NBTiAgICAgICAgIDB4MDIwMCAgLyogQmF0Y2hlZCBTY2FuIChsZWdhY3kpICovCisjZGVmaW5lIFdJRklfRkVBVFVSRV9QTk8gICAgICAgICAgICAgICAgMHgwNDAwICAvKiBQcmVmZXJyZWQgbmV0d29yayBvZmZsb2FkICovCisjZGVmaW5lIFdJRklfRkVBVFVSRV9BRERJVElPTkFMX1NUQSAgICAgMHgwODAwICAvKiBTdXBwb3J0IGZvciB0d28gU1RBcyAqLworI2RlZmluZSBXSUZJX0ZFQVRVUkVfVERMUyAgICAgICAgICAgICAgIDB4MTAwMCAgLyogVHVubmVsIGRpcmVjdGVkIGxpbmsKKwkJCQkJCSAgIHNldHVwICovCisjZGVmaW5lIFdJRklfRkVBVFVSRV9URExTX09GRkNIQU5ORUwJMHgyMDAwICAvKiBTdXBwb3J0IGZvciBURExTIG9mZgorCQkJCQkJICAgY2hhbm5lbCAqLworI2RlZmluZSBXSUZJX0ZFQVRVUkVfRVBSICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogRW5oYW5jZWQgcG93ZXIgcmVwb3J0aW5nICovCisjZGVmaW5lIFdJRklfRkVBVFVSRV9BUF9TVEEgICAgICAgICAgICAgMHg4MDAwICAvKiBTdXBwb3J0IGZvciBBUCBTVEEKKwkJCQkJCSAgIENvbmN1cnJlbmN5ICovCisjZGVmaW5lIFdJRklfRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICAgMHgxMDAwMCAgLyogTGluayBsYXllciBzdGF0cyAqLworI2RlZmluZSBXSUZJX0ZFQVRVUkVfTE9HR0VSICAgICAgICAgICAgIDB4MjAwMDAgIC8qIFdpRmkgTG9nZ2VyICovCisjZGVmaW5lIFdJRklfRkVBVFVSRV9IQUxfRVBOTyAgICAgICAgICAgMHg0MDAwMCAgLyogV2lGaSBQTk8gZW5oYW5jZWQgKi8KKyNkZWZpbmUgV0lGSV9GRUFUVVJFX1JTU0lfTU9OSVRPUiAgICAgICAweDgwMDAwICAvKiBSU1NJIE1vbml0b3IgKi8KKworLyoqCisgKiBlbnVtIHdpZmlfbG9nZ2VyX3N1cHBvcnRlZF9mZWF0dXJlcyAtIHZhbHVlcyBmb3Igc3VwcG9ydGVkIGxvZ2dlciBmZWF0dXJlcworICogQFdJRklfTE9HR0VSX01FTU9SWV9EVU1QX1NVUFBPUlRFRCAtIE1lbW9yeSBkdW1wIG9mIEZXCisgKiBAV0lGSV9MT0dHRVJfUEVSX1BBQ0tFVF9UWF9SWF9TVEFUVVNfU1VQUE9SVEVEIC0gUGVyIHBhY2tldCBzdGF0aXN0aWNzCisgKiBAV0lGSV9MT0dHRVJfQ09OTkVDVF9FVkVOVF9TVVBQT1JURUQgLSBMb2dnaW5nIG9mIENvbm5lY3Rpdml0eSBldmVudHMKKyAqIEBXSUZJX0xPR0dFUl9QT1dFUl9FVkVOVF9TVVBQT1JURUQgLSBQb3dlciBvZiBkcml2ZXIKKyAqIEBXSUZJX0xPR0dFUl9XQUtFX0xPQ0tfU1VQUE9SVEVEIC0gV2FrZWxvY2sgb2YgZHJpdmVyCisgKiBAV0lGSV9MT0dHRVJfV0FUQ0hET0dfVElNRVJfU1VQUE9SVEVEIC0gbW9uaXRvciBGVyBoZWFsdGgKKyAqLworZW51bSB3aWZpX2xvZ2dlcl9zdXBwb3J0ZWRfZmVhdHVyZXMgeworCVdJRklfTE9HR0VSX01FTU9SWV9EVU1QX1NVUFBPUlRFRCA9ICgxIDw8ICgwKSksCisJV0lGSV9MT0dHRVJfUEVSX1BBQ0tFVF9UWF9SWF9TVEFUVVNfU1VQUE9SVEVEID0gKDEgPDwgKDEpKSwKKwlXSUZJX0xPR0dFUl9DT05ORUNUX0VWRU5UX1NVUFBPUlRFRCA9ICgxIDw8ICgyKSksCisJV0lGSV9MT0dHRVJfUE9XRVJfRVZFTlRfU1VQUE9SVEVEID0gKDEgPDwgKDMpKSwKKwlXSUZJX0xPR0dFUl9XQUtFX0xPQ0tfU1VQUE9SVEVEID0gKDEgPDwgKDQpKSwKKwlXSUZJX0xPR0dFUl9WRVJCT1NFX1NVUFBPUlRFRCA9ICgxIDw8ICg1KSksCisJV0lGSV9MT0dHRVJfV0FUQ0hET0dfVElNRVJfU1VQUE9SVEVEID0gKDEgPDwgKDYpKSwKK307CisKKy8qIEFkZCBtb3JlIGZlYXR1cmVzIGhlcmUgKi8KKyNkZWZpbmUgV0lGSV9URExTX1NVUFBPUlQJCQlCSVQoMCkKKyNkZWZpbmUgV0lGSV9URExTX0VYVEVSTkFMX0NPTlRST0xfU1VQUE9SVAlCSVQoMSkKKyNkZWZpbmUgV0lJRl9URExTX09GRkNIQU5ORUxfU1VQUE9SVAkJQklUKDIpCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9DSF9BVk9JRCkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fRk9SQ0VfU0FQX1NDQykKKyNkZWZpbmUgSEREX01BWF9BVk9JRF9GUkVRX1JBTkdFUyAgIDQKKy8qKgorICogdHlwZWRlZiBzdHJ1Y3Qgc0hkZEF2b2lkRnJlcVJhbmdlIC0gYXZvaWQgZnJlcXVlbmN5IHJhbmdlCisgKgorICogQHN0YXJ0RnJlcTogU3RhcnQgZnJlcXVlbmN5IHJhbmdlCisgKiBAZW5kRnJlcTogRW5kIGZyZXF1ZW5jeSByYW5nZQorICovCit0eXBlZGVmIHN0cnVjdCBzSGRkQXZvaWRGcmVxUmFuZ2UgeworCXUzMiBzdGFydEZyZXE7CisJdTMyIGVuZEZyZXE7Cit9IHRIZGRBdm9pZEZyZXFSYW5nZTsKKworLyoqCisgKiB0eXBlZGVmIHN0cnVjdCBzSGRkQXZvaWRGcmVxTGlzdCAtIGF2b2lkIGZyZXF1ZW5jeSBsaXN0CisgKgorICogQGF2b2lkRnJlcVJhbmdlQ291bnQ6IEF2b2lkIGZyZXF1ZW5jeSByYW5nZSBjb3VudAorICogQGF2b2lkRnJlcVJhbmdlOiBBdm9pZCBmcmVxdWVuY3kgbGlzdAorICovCit0eXBlZGVmIHN0cnVjdCBzSGRkQXZvaWRGcmVxTGlzdCB7CisJdTMyIGF2b2lkRnJlcVJhbmdlQ291bnQ7CisJdEhkZEF2b2lkRnJlcVJhbmdlIGF2b2lkRnJlcVJhbmdlW0hERF9NQVhfQVZPSURfRlJFUV9SQU5HRVNdOworfSB0SGRkQXZvaWRGcmVxTGlzdDsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgfHwgRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MgKi8KKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2Fjc19vZmZsb2FkCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19QUklNQVJZX0NIQU5ORUw6IEFDUyBzZWxlY3RlZCBwcmltYXJ5IGNoYW5uZWwKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfU0VDT05EQVJZX0NIQU5ORUw6IEFDUyBzZWxlY3RlZCBzZWNvbmRhcnkgY2hhbm5lbAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19IV19NT0RFOiBod19tb2RlIGZvciBBQ1MKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfSFRfRU5BQkxFRDogaW5kaWNhdGUgaWYgSFQgY2FwYWJpbGl0eSBpcyBlbmFibGVkCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0hUNDBfRU5BQkxFRDogaW5kaWNhdGUgSFQgY2FwYWJpbGl0eQorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2Fjc19vZmZsb2FkIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfQ0hBTk5FTF9JTlZBTElEID0gMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfUFJJTUFSWV9DSEFOTkVMLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19TRUNPTkRBUllfQ0hBTk5FTCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfSFdfTU9ERSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfSFRfRU5BQkxFRCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfSFQ0MF9FTkFCTEVELAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19WSFRfRU5BQkxFRCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfQ0hXSURUSCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfQ0hfTElTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9BQ1NfVkhUX1NFRzBfQ0VOVEVSX0NIQU5ORUwsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX1ZIVF9TRUcxX0NFTlRFUl9DSEFOTkVMLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0FDU19GUkVRX0xJU1QsCisJLyoga2VlcCBsYXN0ICovCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX01BWCA9CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfQUNTX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2Fjc19od19tb2RlCisgKgorICogQFFDQV9BQ1NfTU9ERV9JRUVFODAyMTFCOiAxMWIgbW9kZQorICogQFFDQV9BQ1NfTU9ERV9JRUVFODAyMTFHOiAxMWcgbW9kZQorICogQFFDQV9BQ1NfTU9ERV9JRUVFODAyMTFBOiAxMWEgbW9kZQorICogQFFDQV9BQ1NfTU9ERV9JRUVFODAyMTFBRDogMTFhZCBtb2RlCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2Fjc19od19tb2RlIHsKKwlRQ0FfQUNTX01PREVfSUVFRTgwMjExQiwKKwlRQ0FfQUNTX01PREVfSUVFRTgwMjExRywKKwlRQ0FfQUNTX01PREVfSUVFRTgwMjExQSwKKwlRQ0FfQUNTX01PREVfSUVFRTgwMjExQUQsCisJUUNBX0FDU19NT0RFX0lFRUU4MDIxMUFOWSwKK307CisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfY29uZmlnOiB3aWZpIGNvbmZpZyBhdHRyCisgKgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19JTlZBTElEOiBpbnZhbGlkIGNvbmZpZworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19NT0RVTEFURURfRFRJTTogbW9kdWxhdGVkIGR0aW0KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05GSUdfU1RBVFNfQVZHX0ZBQ1RPUjogc3RhdHMgYXZnLiBmYWN0b3IKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05GSUdfR1VBUkRfVElNRTogZ3VhcmQgdGltZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19MQVNUOiBsYXN0IGNvbmZpZworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19NQVg6IG1heCBjb25maWcKKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfY29uZmlnIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05GSUdfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfQ09ORklHX01PRFVMQVRFRF9EVElNLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19TVEFUU19BVkdfRkFDVE9SLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19HVUFSRF9USU1FLAorCS8qIGtlZXAgbGFzdCAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0NPTkZJR19NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9DT05GSUdfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl93aWZpX2xvZ2dlcl9zdGFydCAtIEVudW0gZm9yIHdpZmkgbG9nZ2VyIHN0YXJ0aW5nCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9MT0dHRVJfU1RBUlRfSU5WQUxJRDogSW52YWxpZCBhdHRyaWJ1dGUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9SSU5HX0lEOiBSaW5nIElECisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9MT0dHRVJfVkVSQk9TRV9MRVZFTDogVmVyYm9zZSBsZXZlbAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX0ZMQUdTOiBGbGFnCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9MT0dHRVJfU1RBUlRfQUZURVJfTEFTVDogTGFzdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX1NUQVJUX01BWDogTWF4IHZhbHVlCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfd2lmaV9sb2dnZXJfc3RhcnQgeworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX1NUQVJUX0lOVkFMSUQgPSAwLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX1JJTkdfSUQgPSAxLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX1ZFUkJPU0VfTEVWRUwgPSAyLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX0ZMQUdTID0gMywKKwkvKiBrZWVwIGxhc3QgKi8KKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9TVEFSVF9BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX1NUQVJUX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX1NUQVJUX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfd2lmaV9sb2dnZXJfZ2V0X3JpbmdfZGF0YSAtIEdldCByaW5nIGRhdGEKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9HRVRfUklOR19EQVRBX0lOVkFMSUQ6IEludmFsaWQgYXR0cmlidXRlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfV0lGSV9MT0dHRVJfR0VUX1JJTkdfREFUQV9JRDogUmluZyBJRAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX0dFVF9SSU5HX0RBVEFfQUZURVJfTEFTVDogTGFzdCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX0dFVF9SSU5HX0RBVEFfTUFYOiBNYXggdmFsdWUKKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl93aWZpX2xvZ2dlcl9nZXRfcmluZ19kYXRhIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9HRVRfUklOR19EQVRBX0lOVkFMSUQgPSAwLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX0dFVF9SSU5HX0RBVEFfSUQgPSAxLAorCS8qIGtlZXAgbGFzdCAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX0dFVF9SSU5HX0RBVEFfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9XSUZJX0xPR0dFUl9HRVRfUklOR19EQVRBX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1dJRklfTE9HR0VSX0dFVF9SSU5HX0RBVEFfQUZURVJfTEFTVCAtIDEsCit9OworCisjaWZkZWYgV0xBTl9GRUFUVVJFX09GRkxPQURfUEFDS0VUUworLyoqCisgKiBlbnVtIHdsYW5fb2ZmbG9hZGVkX3BhY2tldHNfY29udHJvbCAtIGNvbnRyb2wgY29tbWFuZHMKKyAqIEBXTEFOX1NUQVJUX09GRkxPQURFRF9QQUNLRVRTOiBzdGFydCBvZmZsb2FkZWQgcGFja2V0cworICogQFdMQU5fU1RPUF9PRkZMT0FERURfUEFDS0VUUzogc3RvcCBvZmZsb2FkZWQgcGFja2V0cworICoKKyAqLworZW51bSB3bGFuX29mZmxvYWRlZF9wYWNrZXRzX2NvbnRyb2wgeworCVdMQU5fU1RBUlRfT0ZGTE9BREVEX1BBQ0tFVFMgPSAxLAorCVdMQU5fU1RPUF9PRkZMT0FERURfUEFDS0VUUyAgPSAyCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfb2ZmbG9hZGVkX3BhY2tldHMgLSBvZmZsb2FkZWQgcGFja2V0cworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX09GRkxPQURFRF9QQUNLRVRTX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PRkZMT0FERURfUEFDS0VUU19TRU5ESU5HX0NPTlRST0w6IGNvbnRyb2wKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PRkZMT0FERURfUEFDS0VUU19SRVFVRVNUX0lEOiByZXF1ZXN0IGlkCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfT0ZGTE9BREVEX1BBQ0tFVFNfSVBfUEFDS0VUX0RBVEE6IGlwIHBhY2tldCBkYXRhCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfT0ZGTE9BREVEX1BBQ0tFVFNfU1JDX01BQ19BRERSOiBzcmMgbWFjIGFkZHJlc3MKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PRkZMT0FERURfUEFDS0VUU19EU1RfTUFDX0FERFI6IGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfT0ZGTE9BREVEX1BBQ0tFVFNfUEVSSU9EOiBwZXJpb2QgaW4gbWlsbGkgc2Vjb25kcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX09GRkxPQURFRF9QQUNLRVRTX0FGVEVSX0xBU1Q6IGFmdGVyIGxhc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PRkZMT0FERURfUEFDS0VUU19NQVg6IG1heAorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX29mZmxvYWRlZF9wYWNrZXRzIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PRkZMT0FERURfUEFDS0VUU19JTlZBTElEID0gMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PRkZMT0FERURfUEFDS0VUU19TRU5ESU5HX0NPTlRST0wsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0ZGTE9BREVEX1BBQ0tFVFNfUkVRVUVTVF9JRCwKKworCS8qIFBhY2tldCBpbiBoZXggZm9ybWF0ICovCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0ZGTE9BREVEX1BBQ0tFVFNfSVBfUEFDS0VUX0RBVEEsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0ZGTE9BREVEX1BBQ0tFVFNfU1JDX01BQ19BRERSLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09GRkxPQURFRF9QQUNLRVRTX0RTVF9NQUNfQUREUiwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PRkZMT0FERURfUEFDS0VUU19QRVJJT0QsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PRkZMT0FERURfUEFDS0VUU19BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09GRkxPQURFRF9QQUNLRVRTX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09GRkxPQURFRF9QQUNLRVRTX0FGVEVSX0xBU1QgLSAxLAorfTsKKyNlbmRpZgorCisvKioKKyAqIGVudW0gcWNhX3dsYW5fcnNzaV9tb25pdG9yaW5nX2NvbnRyb2wgLSByc3NpIGNvbnRyb2wgY29tbWFuZHMKKyAqIEBRQ0FfV0xBTl9SU1NJX01PTklUT1JJTkdfQ09OVFJPTF9JTlZBTElEOiBpbnZhbGlkCisgKiBAUUNBX1dMQU5fUlNTSV9NT05JVE9SSU5HX1NUQVJUOiByc3NpIG1vbml0b3Jpbmcgc3RhcnQKKyAqIEBRQ0FfV0xBTl9SU1NJX01PTklUT1JJTkdfU1RPUDogcnNzaSBtb25pdG9yaW5nIHN0b3AKKyAqLworZW51bSBxY2Ffd2xhbl9yc3NpX21vbml0b3JpbmdfY29udHJvbCB7CisJUUNBX1dMQU5fUlNTSV9NT05JVE9SSU5HX0NPTlRST0xfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fUlNTSV9NT05JVE9SSU5HX1NUQVJULAorCVFDQV9XTEFOX1JTU0lfTU9OSVRPUklOR19TVE9QLAorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX3Jzc2lfbW9uaXRvcmluZyAtIHJzc2kgbW9uaXRvcmluZworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JTU0lfTU9OSVRPUklOR19JTlZBTElEOiBJbnZhbGlkCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUlNTSV9NT05JVE9SSU5HX0NPTlRST0w6IGNvbnRyb2wKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SU1NJX01PTklUT1JJTkdfTUFYX1JTU0k6IG1heCByc3NpCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUlNTSV9NT05JVE9SSU5HX01JTl9SU1NJOiBtaW4gcnNzaQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JTU0lfTU9OSVRPUklOR19DVVJfQlNTSUQ6IGN1cnJlbnQgYnNzaWQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SU1NJX01PTklUT1JJTkdfQ1VSX1JTU0k6IGN1cnJlbnQgcnNzaQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JTU0lfTU9OSVRPUklOR19BRlRFUl9MQVNUOiBhZnRlciBsYXN0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUlNTSV9NT05JVE9SSU5HX01BWDogbWF4CisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfcnNzaV9tb25pdG9yaW5nIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SU1NJX01PTklUT1JJTkdfSU5WQUxJRCA9IDAsCisKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SU1NJX01PTklUT1JJTkdfQ09OVFJPTCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SU1NJX01PTklUT1JJTkdfUkVRVUVTVF9JRCwKKworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JTU0lfTU9OSVRPUklOR19NQVhfUlNTSSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SU1NJX01PTklUT1JJTkdfTUlOX1JTU0ksCisKKwkvKiBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQvcmVjZWl2ZWQgaW4gY2FsbGJhY2sgKi8KKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SU1NJX01PTklUT1JJTkdfQ1VSX0JTU0lELAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JTU0lfTU9OSVRPUklOR19DVVJfUlNTSSwKKworCS8qIGtlZXAgbGFzdCAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JTU0lfTU9OSVRPUklOR19BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1JTU0lfTU9OSVRPUklOR19NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9SU1NJX01PTklUT1JJTkdfQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gcWNhX3ZlbmRvcl9hdHRyX2dldF9wcmVmZXJyZWRfZnJlcV9saXN0IC0gZ2V0IHByZWZlcnJlZCBjaGFubmVsIGxpc3QKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfUFJFRkVSUkVEX0ZSRVFfTElTVF9JTlZBTElEOiBpbnZhbGlkIHZhbHVlCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX1BSRUZFUlJFRF9GUkVRX0xJU1RfSUZBQ0VfVFlQRTogaW50ZXJmYWNlIHR5cGUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfUFJFRkVSUkVEX0ZSRVFfTElTVDogcHJlZmVycmVkIGZyZXF1ZW5jeSBsaXN0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX1BSRUZFUlJFRF9GUkVRX0xJU1RfQUZURVJfTEFTVDogYWZ0ZXIgbGFzdAorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0dFVF9QUkVGRVJSRURfRlJFUV9MSVNUX01BWDogbWF4CisgKi8KK2VudW0gcWNhX3ZlbmRvcl9hdHRyX2dldF9wcmVmZXJyZWRfZnJlcV9saXN0IHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfUFJFRkVSUkVEX0ZSRVFfTElTVF9JTlZBTElELAorCS8qIEEgMzItdW5zaWduZWQgdmFsdWU7IHRoZSBpbnRlcmZhY2UgdHlwZS9tb2RlIGZvciB3aGljaCB0aGUgcHJlZmVycmVkCisJICogZnJlcXVlbmN5IGxpc3QgaXMgcmVxdWVzdGVkIChzZWUgZW51bSBxY2FfaWZhY2VfdHlwZSBmb3IgcG9zc2libGUKKwkgKiB2YWx1ZXMpOyB1c2VkIGluIGJvdGggc291dGgtIGFuZCBub3J0aC1ib3VuZC4KKwkgKi8KKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfUFJFRkVSUkVEX0ZSRVFfTElTVF9JRkFDRV9UWVBFLAorCS8qIEFuIGFycmF5IG9mIDMyLXVuc2lnbmVkIHZhbHVlczsgdmFsdWVzIGFyZSBmcmVxdWVuY3kgKE1Ieik7IHVzZWQKKwkgKiBpbiBub3J0aC1ib3VuZCBvbmx5LgorCSAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0dFVF9QUkVGRVJSRURfRlJFUV9MSVNULAorCS8qIGtlZXAgbGFzdCAqLworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0dFVF9QUkVGRVJSRURfRlJFUV9MSVNUX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfR0VUX1BSRUZFUlJFRF9GUkVRX0xJU1RfTUFYID0KKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9HRVRfUFJFRkVSUkVEX0ZSRVFfTElTVF9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIHFjYV92ZW5kb3JfYXR0cl9wcm9iYWJsZV9vcGVyX2NoYW5uZWwgLSBjaGFubmVsIGhpbnQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QUk9CQUJMRV9PUEVSX0NIQU5ORUxfSU5WQUxJRDogaW52YWxpZCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BST0JBQkxFX09QRVJfQ0hBTk5FTF9JRkFDRV9UWVBFOiBpbnRlcmZhY2UgdHlwZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BST0JBQkxFX09QRVJfQ0hBTk5FTF9GUkVROiBmcmVxdWVuY3kgaGludCB2YWx1ZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BST0JBQkxFX09QRVJfQ0hBTk5FTF9BRlRFUl9MQVNUOiBsYXN0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfUFJPQkFCTEVfT1BFUl9DSEFOTkVMX01BWDogbWF4CisgKi8KK2VudW0gcWNhX3ZlbmRvcl9hdHRyX3Byb2JhYmxlX29wZXJfY2hhbm5lbCB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUFJPQkFCTEVfT1BFUl9DSEFOTkVMX0lOVkFMSUQsCisJLyogMzItYml0IHVuc2lnbmVkIHZhbHVlOyBpbmRpY2F0ZXMgdGhlIGNvbm5lY3Rpb24vaWZhY2UgdHlwZSBsaWtlbHkgdG8KKwkgICogY29tZSBvbiB0aGlzIGNoYW5uZWwgKHNlZSBlbnVtIHFjYV9pZmFjZV90eXBlKS4KKwkgICovCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUFJPQkFCTEVfT1BFUl9DSEFOTkVMX0lGQUNFX1RZUEUsCisJLyogMzItYml0IHVuc2lnbmVkIHZhbHVlOyB0aGUgZnJlcXVlbmN5IChNSHopIG9mIHRoZSBwcm9iYWJsZSBjaGFubmVsICovCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUFJPQkFCTEVfT1BFUl9DSEFOTkVMX0ZSRVEsCisJLyoga2VlcCBsYXN0ICovCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUFJPQkFCTEVfT1BFUl9DSEFOTkVMX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUFJPQkFCTEVfT1BFUl9DSEFOTkVMX01BWCA9CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfUFJPQkFCTEVfT1BFUl9DSEFOTkVMX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gZHJ2X2Ric19jYXBhYmlsaXR5IC0gREJTIGNhcGFiaWxpdHkKKyAqIEBEUlZfREJTX0NBUEFCSUxJVFlfRElTQUJMRUQ6IERCUyBkaXNhYmxlZAorICogQERSVl9EQlNfQ0FQQUJJTElUWV8xWDE6IDF4MQorICogQERSVl9EQlNfQ0FQQUJJTElUWV8yWDI6IDJ4MgorICovCitlbnVtIGRydl9kYnNfY2FwYWJpbGl0eSB7CisJRFJWX0RCU19DQVBBQklMSVRZX0RJU0FCTEVELCAvKiBub3Qgc3VwcG9ydGVkIG9yIGRpc2FibGVkICovCisJRFJWX0RCU19DQVBBQklMSVRZXzFYMSwKKwlEUlZfREJTX0NBUEFCSUxJVFlfMlgyLAorfTsKKworc3RydWN0IGNmZzgwMjExX2JzcyAqd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Jzc19kYihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJCXRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9wbWtzYV9jYW5kaWRhdGVfbm90aWZ5KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQl0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywKKwkJCQkJaW50IGluZGV4LCBib29sIHByZWF1dGgpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSX01FVFJJQ1MKK0NERl9TVEFUVVMgd2xhbl9oZGRfY2ZnODAyMTFfcm9hbV9tZXRyaWNzX3ByZWF1dGgoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCQl0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbyk7CisKK0NERl9TVEFUVVMgd2xhbl9oZGRfY2ZnODAyMTFfcm9hbV9tZXRyaWNzX3ByZWF1dGhfc3RhdHVzKGhkZF9hZGFwdGVyX3QgKgorCQkJCQkJCSBwQWRhcHRlciwKKwkJCQkJCQkgdENzclJvYW1JbmZvICoKKwkJCQkJCQkgcFJvYW1JbmZvLAorCQkJCQkJCSBib29sIHByZWF1dGhfc3RhdHVzKTsKKworQ0RGX1NUQVRVUyB3bGFuX2hkZF9jZmc4MDIxMV9yb2FtX21ldHJpY3NfaGFuZG92ZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCQkgICB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbyk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCit2b2lkIHdsYW5faGRkX2NmZzgwMjExX3NldF9rZXlfd2FwaShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdWludDhfdCBrZXlfaW5kZXgsCisJCQkJICAgIGNvbnN0IHVpbnQ4X3QgKm1hY19hZGRyLCBjb25zdCB1aW50OF90ICprZXksCisJCQkJICAgIGludCBrZXlfTGVuKTsKKyNlbmRpZgorc3RydWN0IHdpcGh5ICp3bGFuX2hkZF9jZmc4MDIxMV93aXBoeV9hbGxvYyhpbnQgcHJpdl9zaXplKTsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX3NjYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorI2VuZGlmCisJCQkgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0KTsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IGhkZF9jb25maWcgKnBDZmcpOworCit2b2lkIHdsYW5faGRkX3VwZGF0ZV93aXBoeShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgaGRkX2NvbmZpZyAqcENmZyk7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9yZWdpc3RlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5KTsKK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfcmVnaXN0ZXJfZnJhbWVzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKKwordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9kZXJlZ2lzdGVyX2ZyYW1lcyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDksIDApKQordm9pZCBoZGRfcmVnX25vdGlmaWVyKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJIHN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKnJlcXVlc3QpOworI2Vsc2UKK2ludCBoZGRfcmVnX25vdGlmaWVyKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgaGRkX2Nvbm5fc2V0X2Nvbm5lY3Rpb25fc3RhdGUoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCSAgZUNvbm5lY3Rpb25TdGF0ZSBjb25uU3RhdGUpOworQ0RGX1NUQVRVUyB3bGFuX2hkZF92YWxpZGF0ZV9vcGVyYXRpb25fY2hhbm5lbChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJICAgICAgIGludCBjaGFubmVsKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworaW50IHdsYW5faGRkX2NmZzgwMjExX3NlbmRfdGRsc19kaXNjb3Zlcl9yZXEoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqcGVlcik7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKK2V4dGVybiB2b2lkIHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9yZXBsYXlfY291bnRlcl9jYWxsYmFjayh2b2lkCisJCQkJCQkJICAgICAqY2FsbGJhY2tDb250ZXh0LAorCQkJCQkJCSAgICAgdHBTaXJHdGtPZmZsb2FkR2V0SW5mb1JzcFBhcmFtcworCQkJCQkJCSAgICAgcEd0a09mZmxvYWRHZXRJbmZvUnNwKTsKKyNlbmRpZgordm9pZCAqd2xhbl9oZGRfY2hhbmdlX2NvdW50cnlfY29kZV9jYih2b2lkICpwQWRhcHRlcik7Cit2b2lkIGhkZF9zZWxlY3RfY2Jtb2RlKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90IG9wZXJhdGlvbkNoYW5uZWwpOworCit1aW50OF90ICp3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWVfcHRyKGNvbnN0IHVpbnQ4X3QgKmllc19wdHIsIGludCBsZW5ndGgsCisJCQkJICAgICAgdWludDhfdCBlaWQpOworCisjaWZkZWYgQ0ZHODAyMTFfREVMX1NUQV9WMgoraW50IHdsYW5faGRkX2NmZzgwMjExX2RlbF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IHN0YXRpb25fZGVsX3BhcmFtZXRlcnMgKnBhcmFtKTsKKyNlbHNlCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBjb25zdCB1aW50OF90ICptYWMpOworI2Vsc2UKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHVpbnQ4X3QgKm1hYyk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgIGRlZmluZWQoUUNBX1dJRklfRlRNKSAgICAgJiYgZGVmaW5lZChDT05GSUdfTkw4MDIxMV9URVNUTU9ERSkKK3ZvaWQgd2xhbl9oZGRfdGVzdG1vZGVfcnhfZXZlbnQodm9pZCAqYnVmLCBzaXplX3QgYnVmX2xlbik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0NIX0FWT0lEKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9GT1JDRV9TQVBfU0NDKQoraW50IHdsYW5faGRkX3NlbmRfYXZvaWRfZnJlcV9ldmVudChoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJCXRIZGRBdm9pZEZyZXFMaXN0ICogcEF2b2lkRnJlcUxpc3QpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DSF9BVk9JRCB8fCBGRUFUVVJFX1dMQU5fRk9SQ0VfU0FQX1NDQyAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9jYWxsYmFjayh2b2lkICpjdHgsCisJCQkJCWNvbnN0IHVpbnQxNl90IGV2VHlwZSwgdm9pZCAqcE1zZyk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VYVFNDQU4gKi8KKwordm9pZCBoZGRfcnNzaV90aHJlc2hvbGRfYnJlYWNoZWQodm9pZCAqaGRkY3R4LAorCQkJCSBzdHJ1Y3QgcnNzaV9icmVhY2hfZXZlbnQgKmRhdGEpOworCitzdHJ1Y3QgY2ZnODAyMTFfYnNzICp3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYnNzX2xpc3QoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCQkgICAgICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8pOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2JzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCQl1aW50MzJfdCBzY2FuX3RpbWVzdGFtcCk7CisKK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfYWNzX2NoX3NlbGVjdF9ldnQoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcik7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECitpbnQgd2xhbl9oZGRfc2VuZF9yb2FtX2F1dGhfZXZlbnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eF9wdHIsIHVpbnQ4X3QgKmJzc2lkLAorCQkJCXVpbnQ4X3QgKnJlcV9yc25faWUsIHVpbnQzMl90IHJlcV9yc25fbGVuZ3RoLAorCQkJCXVpbnQ4X3QgKnJzcF9yc25faWUsIHVpbnQzMl90IHJzcF9yc25fbGVuZ3RoLAorCQkJCXRDc3JSb2FtSW5mbyAqcm9hbV9pbmZvX3B0cik7CisjZW5kaWYKKworaW50IHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9hcGllcyhoZGRfYWRhcHRlcl90ICphZGFwdGVyKTsKKworI2lmICEoZGVmaW5lZCAoU1VQUE9SVF9XREVWX0NGRzgwMjExX1ZFTkRPUl9FVkVOVF9BTExPQykpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKK2JhY2twb3J0ZWRfY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCWludCBhcHByb3hsZW4sCisJCQkJCWludCBldmVudF9pZHgsIGdmcF90IGdmcCkKK3sKKwlyZXR1cm4gY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jKHdpcGh5LCBhcHByb3hsZW4sIGV2ZW50X2lkeCwgZ2ZwKTsKK30KKyNkZWZpbmUgY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jIGJhY2twb3J0ZWRfY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jCisjZW5kaWYKK2ludCB3bGFuX2hkZF9zYXBfY2ZnX2Rmc19vdmVycmlkZShoZGRfYWRhcHRlcl90ICphZGFwdGVyKTsKKworZW51bSBjZHNfY29uX21vZGUgd2xhbl9oZGRfY29udmVydF9ubF9pZnR5cGVfdG9faGRkX3R5cGUoCisJCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX2NvbmNfdXQuYyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9jb25jX3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkNzFkZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9jb25jX3V0LmMKQEAgLTAsMCArMSw4NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qIEluY2x1ZGUgZmlsZXMgKi8KKworI2luY2x1ZGUgPHdsYW5faGRkX2luY2x1ZGVzLmg+CisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgPGNkc19zY2hlZC5oPgorI2luY2x1ZGUgPHduaV9hcGkuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9jZmcuaD4KKyNpbmNsdWRlICJ3bGFuX2hkZF90cmFjZS5oIgorI2luY2x1ZGUgImNkc19jb25jdXJyZW5jeS5oIgorI2luY2x1ZGUgIndsYW5faGRkX2NvbmNfdXQuaCIKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKyNpbmNsdWRlICJjZHNfdXRpbHMuaCIKKyNpbmNsdWRlICJjZHNfcmVnX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJ3bWEuaCIKKyNpbmNsdWRlICJ3bWFfYXBpLmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX1NDRU5BUklPIDMwMAorI2RlZmluZSBNQVhfQUxMT1dFRF9DSEFSX0lOX1JFUE9SVCA1MAorCisvKioKKyAqIHN0cnVjdCByZXBvcnRfdDogRGF0YSBzdHJ1Y3R1cmUgdG8gZmlsbCByZXBvcnQKKyAqCisgKiBAdGl0bGU6IHRpdGxlIG9mIHRoZSBjb25jdXJyZW5jeSBjYXNlIHNjZW5hcmlvCisgKiBAZmlyc3RfcGVyc29uYTogZGV2aWNlIHR5cGUgb2YgZmlyc3QgcGVyc29uYQorICogQHNlY29uZF9wZXJzb25hOiBkZXZpY2UgdHlwZSBvZiBzZWNvbmQgcGVyc29uYQorICogQHRoaXJkX3BlcnNvbmE6IGRldmljZSB0eXBlIG9mIHRoaXJkIHBlcnNvbmEKKyAqIEBkYnNfdmFsdWU6IHN0cmluZyB0byBtZW50aW9uIHdoZXRoZXIgZGJzIGVuYWJsZSBvciBkaXNhYmxlCisgKiBAc3lzdGVtX2NvbmY6IHN0cmluZyB0byBtZW50aW9uIHdoYXQgaXMgc3lzdGVtJ3MgY29uZmlndXJhdGlvbgorICogQHN0YXR1czogc3RhdHVzIGZpZWxkCisgKiBAcmVzdWx0X2NvZGU6IHN0cmluZyB0byBtZW50aW9uIHdoZXRoZXIgdGVzdCBjYXNlIHBhc3NlZCBvciBmYWlsZWQKKyAqIEByZWFzb246IHJlYXNvbiB3aHkgdGVzdCBjYXNlIGZhaWxlZAorICogQHBjbDogcHJlZmVycmVkIGNoYW5uZWwgbGlzdAorICoKKyAqIFRoaXMgc3RydWN0dXJlIHdpbGwgYmUgdXNlZCBieSB1bml0IHRlc3QgZnJhbWV3b3JrIHRvIGZpbGwKKyAqIHJlcG9ydCBhZnRlciBydW5uaW5nIHZhcmlvdXMgY29uY3VycmVuY3kgc2NlbmFyaW9zLgorICovCitzdHJ1Y3QgcmVwb3J0X3QgeworCWNoYXIgdGl0bGVbMiAqIE1BWF9BTExPV0VEX0NIQVJfSU5fUkVQT1JUXTsKKwljaGFyIGZpcnN0X3BlcnNvbmFbTUFYX0FMTE9XRURfQ0hBUl9JTl9SRVBPUlRdOworCWNoYXIgc2Vjb25kX3BlcnNvbmFbTUFYX0FMTE9XRURfQ0hBUl9JTl9SRVBPUlRdOworCWNoYXIgdGhpcmRfcGVyc29uYVtNQVhfQUxMT1dFRF9DSEFSX0lOX1JFUE9SVF07CisJY2hhciBkYnNfdmFsdWVbTUFYX0FMTE9XRURfQ0hBUl9JTl9SRVBPUlRdOworCWNoYXIgc3lzdGVtX2NvbmZbTUFYX0FMTE9XRURfQ0hBUl9JTl9SRVBPUlRdOworCWJvb2wgc3RhdHVzOworCWNoYXIgcmVzdWx0X2NvZGVbTUFYX0FMTE9XRURfQ0hBUl9JTl9SRVBPUlRdOworCWNoYXIgcmVhc29uW01BWF9BTExPV0VEX0NIQVJfSU5fUkVQT1JUXTsKKwljaGFyIHBjbFsyICogTUFYX05VTV9DSEFOXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVwb3J0X3QgcmVwb3J0W05VTUJFUl9PRl9TQ0VOQVJJT107CitzdGF0aWMgdWludDMyX3QgcmVwb3J0X2lkeDsKKworc3RhdGljIHVpbnQ4X3Qgd2xhbl9oZGRfdmFsaWRfdHlwZV9vZl9wZXJzb25hKHVpbnQzMl90IHN1Yl90eXBlKQoreworCXN3aXRjaCAoc3ViX3R5cGUpIHsKKwljYXNlIENEU19TVEFfTU9ERToKKwkJcmV0dXJuIFdNSV9WREVWX1RZUEVfU1RBOworCWNhc2UgQ0RTX0lCU1NfTU9ERToKKwkJcmV0dXJuIFdNSV9WREVWX1RZUEVfSUJTUzsKKwljYXNlIENEU19TQVBfTU9ERToKKwljYXNlIENEU19QMlBfQ0xJRU5UX01PREU6CisJY2FzZSBDRFNfUDJQX0dPX01PREU6CisJCXJldHVybiBXTUlfVkRFVl9UWVBFX0FQOworCWRlZmF1bHQ6CisJCXJldHVybiBXTUlfVkRFVl9UWVBFX1NUQTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzeXN0ZW1fY29uZmlnX3RvX3N0cmluZyh1aW50OF90IGlkeCkKK3sKKwlzd2l0Y2ggKGlkeCkgeworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfVEhST1VHSFBVVCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKENEU19QT1dFUlNBVkUpOworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfTEFURU5DWSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVbmtub3duIjsKKwl9CisKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRldmljZV9tb2RlX3RvX3N0cmluZyh1aW50OF90IGlkeCkKK3sKKwlzd2l0Y2ggKGlkeCkgeworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfU1RBX01PREUpOworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfU0FQX01PREUpOworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfUDJQX0NMSUVOVF9NT0RFKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoQ0RTX1AyUF9HT19NT0RFKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoQ0RTX0lCU1NfTU9ERSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJub25lIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwY2xfdHlwZV90b19zdHJpbmcodWludDhfdCBpZHgpCit7CisJc3dpdGNoIChpZHgpIHsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoQ0RTX05PTkUpOworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfMjRHKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoQ0RTXzVHKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoQ0RTX1NDQ19DSCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKENEU19NQ0NfQ0gpOworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfU0NDX0NIXzI0Ryk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKENEU19TQ0NfQ0hfNUcpOworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfMjRHX1NDQ19DSCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKENEU181R19TQ0NfQ0gpOworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfU0NDX09OXzVfU0NDX09OXzI0XzI0Ryk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKENEU19TQ0NfT05fNV9TQ0NfT05fMjRfNUcpOworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfU0NDX09OXzI0X1NDQ19PTl81XzI0Ryk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKENEU19TQ0NfT05fMjRfU0NDX09OXzVfNUcpOworCUNBU0VfUkVUVVJOX1NUUklORyhDRFNfU0NDX09OXzVfU0NDX09OXzI0KTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoQ0RTX1NDQ19PTl8yNF9TQ0NfT05fNSk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKENEU19NQ0NfQ0hfMjRHKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoQ0RTX01DQ19DSF81Ryk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKENEU18yNEdfTUNDX0NIKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoQ0RTXzVHX01DQ19DSCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVbmtub3duIjsKKwl9Cit9CisKK3ZvaWQgY2xlYW5fcmVwb3J0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJdWludDMyX3QgaWR4ID0gMDsKKwl3aGlsZSAoaWR4IDwgTlVNQkVSX09GX1NDRU5BUklPKSB7CisJCWNkZl9tZW1femVybygmcmVwb3J0W2lkeF0sIHNpemVvZihzdHJ1Y3QgcmVwb3J0X3QpKTsKKwkJaWR4Kys7CisJfQorCXJlcG9ydF9pZHggPSAwOworfQorCit2b2lkIHByaW50X3JlcG9ydChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXVpbnQzMl90IGlkeCA9IDA7CisJcHJfaW5mbygiKy0tLS0tLS0tLS1SZXBvcnQgc3RhcnQgLS0tLS0tLS0tLS0rXG4iKTsKKwl3aGlsZSAoaWR4IDwgcmVwb3J0X2lkeCkgeworCQlwcl9pbmZvKCJJZHg6WyVkXVxuVGl0bGU6JXNcblJlc3VsdDpbJXNdXG5cdDFzdF9wZXJzb25bJXNdXG5cdDJuZF9wZXJzb25hWyVzXVxuXHQzcmRfcGVyc29uYVslc11cblx0REJTWyVzXVxuXHRzeXN0ZW1fY29uZmlnWyVzXVxuXHRyZWFzb25bJXNdXG5cdHBjbFslc11cbiIsCisJCQlpZHgsCisJCQlyZXBvcnRbaWR4XS50aXRsZSwgcmVwb3J0W2lkeF0ucmVzdWx0X2NvZGUsCisJCQlyZXBvcnRbaWR4XS5maXJzdF9wZXJzb25hLCByZXBvcnRbaWR4XS5zZWNvbmRfcGVyc29uYSwKKwkJCXJlcG9ydFtpZHhdLnRoaXJkX3BlcnNvbmEsIHJlcG9ydFtpZHhdLmRic192YWx1ZSwKKwkJCXJlcG9ydFtpZHhdLnN5c3RlbV9jb25mLCByZXBvcnRbaWR4XS5yZWFzb24sCisJCQlyZXBvcnRbaWR4XS5wY2wpOworCQlpZHgrKzsKKwl9CisJcHJfaW5mbygiKy0tLS0tLS0tLS1SZXBvcnQgZW5kIC0tLS0tLS0tLS0tK1xuIik7Cit9CisKK3ZvaWQgZmlsbF9yZXBvcnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgY2hhciAqdGl0bGUsCisJdWludDMyX3QgZmlyc3RfcGVyc29uYSwgdWludDMyX3Qgc2Vjb25kX3BlcnNvbmEsIHVpbnQzMl90IHRoaXJkX3BlcnNvbmEsCisJdWludDMyX3QgY2hubF8xc3RfY29ubiwgdWludDMyX3QgY2hubF8ybmRfY29ubiwgdWludDMyX3QgY2hubF8zcmRfY29ubiwKKwlib29sIHN0YXR1cywgZW51bSBjZHNfcGNsX3R5cGUgcGNsX3R5cGUsIGNoYXIgKnJlYXNvbiwgdWludDhfdCAqcGNsKQoreworCWludCBpOworCWNoYXIgYnVmWzRdID0gezB9OworCisJaWYgKHJlcG9ydF9pZHggPj0gTlVNQkVSX09GX1NDRU5BUklPKQorCQlyZXR1cm47CisJc25wcmludGYocmVwb3J0W3JlcG9ydF9pZHhdLnRpdGxlLAorCQkyICogTUFYX0FMTE9XRURfQ0hBUl9JTl9SRVBPUlQsICJwY2wgZm9yWyVzXSBwY2xfdHlwZVslc10iLAorCQl0aXRsZSwgcGNsX3R5cGVfdG9fc3RyaW5nKHBjbF90eXBlKSk7CisJaWYgKGNobmxfMXN0X2Nvbm4gPT0gMCkKKwkJc25wcmludGYocmVwb3J0W3JlcG9ydF9pZHhdLmZpcnN0X3BlcnNvbmEsCisJCQlNQVhfQUxMT1dFRF9DSEFSX0lOX1JFUE9SVCwKKwkJCWRldmljZV9tb2RlX3RvX3N0cmluZyhmaXJzdF9wZXJzb25hKSk7CisJZWxzZQorCQlzbnByaW50ZihyZXBvcnRbcmVwb3J0X2lkeF0uZmlyc3RfcGVyc29uYSwKKwkJCU1BWF9BTExPV0VEX0NIQVJfSU5fUkVQT1JULAorCQkJIiVzLWNobmx7JWR9IiwKKwkJCWRldmljZV9tb2RlX3RvX3N0cmluZyhmaXJzdF9wZXJzb25hKSwgY2hubF8xc3RfY29ubik7CisJaWYgKGNobmxfMm5kX2Nvbm4gPT0gMCkKKwkJc25wcmludGYocmVwb3J0W3JlcG9ydF9pZHhdLnNlY29uZF9wZXJzb25hLAorCQkJTUFYX0FMTE9XRURfQ0hBUl9JTl9SRVBPUlQsCisJCQlkZXZpY2VfbW9kZV90b19zdHJpbmcoc2Vjb25kX3BlcnNvbmEpKTsKKwllbHNlCisJCXNucHJpbnRmKHJlcG9ydFtyZXBvcnRfaWR4XS5zZWNvbmRfcGVyc29uYSwKKwkJCU1BWF9BTExPV0VEX0NIQVJfSU5fUkVQT1JULAorCQkJIiVzLWNobmx7JWR9IiwKKwkJCWRldmljZV9tb2RlX3RvX3N0cmluZyhzZWNvbmRfcGVyc29uYSksIGNobmxfMm5kX2Nvbm4pOworCWlmIChjaG5sXzNyZF9jb25uID09IDApCisJCXNucHJpbnRmKHJlcG9ydFtyZXBvcnRfaWR4XS50aGlyZF9wZXJzb25hLAorCQkJTUFYX0FMTE9XRURfQ0hBUl9JTl9SRVBPUlQsCisJCQlkZXZpY2VfbW9kZV90b19zdHJpbmcodGhpcmRfcGVyc29uYSkpOworCWVsc2UKKwkJc25wcmludGYocmVwb3J0W3JlcG9ydF9pZHhdLnRoaXJkX3BlcnNvbmEsCisJCQlNQVhfQUxMT1dFRF9DSEFSX0lOX1JFUE9SVCwKKwkJCSIlcy1jaG5seyVkfSIsCisJCQlkZXZpY2VfbW9kZV90b19zdHJpbmcodGhpcmRfcGVyc29uYSksIGNobmxfM3JkX2Nvbm4pOworCisJcmVwb3J0W3JlcG9ydF9pZHhdLnN0YXR1cyA9IHN0YXR1czsKKwlzbnByaW50ZihyZXBvcnRbcmVwb3J0X2lkeF0uZGJzX3ZhbHVlLAorCQlNQVhfQUxMT1dFRF9DSEFSX0lOX1JFUE9SVCwKKwkJd21hX2lzX2h3X2Ric19jYXBhYmxlKCkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJc25wcmludGYocmVwb3J0W3JlcG9ydF9pZHhdLnN5c3RlbV9jb25mLAorCQlNQVhfQUxMT1dFRF9DSEFSX0lOX1JFUE9SVCwKKwkJc3lzdGVtX2NvbmZpZ190b19zdHJpbmcoaGRkX2N0eC0+Y29uZmlnLT5jb25jX3N5c3RlbV9wcmVmKSk7CisJc25wcmludGYocmVwb3J0W3JlcG9ydF9pZHhdLnJlc3VsdF9jb2RlLAorCQlNQVhfQUxMT1dFRF9DSEFSX0lOX1JFUE9SVCwKKwkJc3RhdHVzID8gIlBBU1MiIDogIkZBSUwiKTsKKwlzbnByaW50ZihyZXBvcnRbcmVwb3J0X2lkeF0ucmVhc29uLAorCQlNQVhfQUxMT1dFRF9DSEFSX0lOX1JFUE9SVCwKKwkJcmVhc29uKTsKKwlpZiAocGNsKSB7CisJCWNkZl9tZW1femVybyhyZXBvcnRbcmVwb3J0X2lkeF0ucGNsLAorCQkJCXNpemVvZihyZXBvcnRbcmVwb3J0X2lkeF0ucGNsKSk7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0NIQU47IGkrKykgeworCQkJaWYgKHBjbFtpXSA9PSAwKQorCQkJCWJyZWFrOworCQkJY2RmX21lbV96ZXJvKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkICIsIHBjbFtpXSk7CisJCQlzdHJsY2F0KHJlcG9ydFtyZXBvcnRfaWR4XS5wY2wsIGJ1ZiwKKwkJCQlzaXplb2YocmVwb3J0W3JlcG9ydF9pZHhdLnBjbCkpOworCQkJc3RybGNhdChyZXBvcnRbcmVwb3J0X2lkeF0ucGNsLCAiLCAiLAorCQkJCXNpemVvZihyZXBvcnRbcmVwb3J0X2lkeF0ucGNsKSk7CisJCX0KKwl9CisJcmVwb3J0X2lkeCsrOworfQorCitzdGF0aWMgYm9vbCB3bGFuX2hkZF92YWxpZGF0ZV9wY2woaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwllbnVtIGNkc19wY2xfdHlwZSBwY2xfdHlwZSwgdWludDhfdCAqcGNsLCB1aW50MzJfdCBwY2xfbGVuLAorCXVpbnQ4X3QgZmlyc3RfY29ubmVjdGlvbl9jaG5sLCB1aW50OF90IHNlY29uZF9jb25uZWN0aW9uX2NobmwsCisJY2hhciAqcmVhc29uLCB1aW50MzJfdCByZWFzb25fbGVuZ3RoKQoreworCWJvb2wgc3RhdHVzID0gdHJ1ZTsKKwl1aW50MzJfdCBmaXJzdF9pZHggPSAwOworCisJaWYgKChwY2xfdHlwZSAhPSBDRFNfTk9ORSkgJiYgKHBjbF9sZW4gPT0gMCkpIHsKKwkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLCAibm8gb2YgY2hhbm5lbHMgPSAwIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzd2l0Y2ggKHBjbF90eXBlKSB7CisJY2FzZSBDRFNfTk9ORToKKwkJaWYgKHBjbF9sZW4gIT0gMCkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLCAibm8gb2YgY2hhbm5lbHM+MCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0RTXzVHOgorCQlmb3IgKGZpcnN0X2lkeCA9IDA7IGZpcnN0X2lkeCA8IHBjbF9sZW47IGZpcnN0X2lkeCsrKSB7CisJCQlpZiAoIUNEU19JU19DSEFOTkVMXzVHSFoocGNsW2ZpcnN0X2lkeF0pKSB7CisJCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCQkiMkcgY2hhbm5lbCBmb3VuZCIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIENEU18yNEc6CisJCWZvciAoZmlyc3RfaWR4ID0gMDsgZmlyc3RfaWR4IDwgcGNsX2xlbjsgZmlyc3RfaWR4KyspIHsKKwkJCWlmICghQ0RTX0lTX0NIQU5ORUxfMjRHSFoocGNsW2ZpcnN0X2lkeF0pKSB7CisJCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCQkiNUcgY2hhbm5lbCBmb3VuZCIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIENEU19TQ0NfQ0g6CisJCWlmIChzZWNvbmRfY29ubmVjdGlvbl9jaG5sID4gMCAmJgorCQkJKGZpcnN0X2Nvbm5lY3Rpb25fY2hubCAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJpbnZhbGlkIGNvbm5lY3Rpb25zIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKHBjbFswXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gU0NDIGZvdW5kIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDRFNfTUNDX0NIOgorCQlpZiAoKHBjbFswXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwpICYmCisJCQkJKChzZWNvbmRfY29ubmVjdGlvbl9jaG5sID4gMCkgJiYKKwkJCQkgKHBjbFswXSAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTUNDIGludmFsaWQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoKHNlY29uZF9jb25uZWN0aW9uX2NobmwgPiAwKSAmJgorCQkJCShwY2xbMV0gIT0gZmlyc3RfY29ubmVjdGlvbl9jaG5sICYmCisJCQkJIHBjbFsxXSAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJNQ0MgaW52YWxpZCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0RTX1NDQ19DSF8yNEc6CisJCWlmIChzZWNvbmRfY29ubmVjdGlvbl9jaG5sID4gMCAmJgorCQkJKGZpcnN0X2Nvbm5lY3Rpb25fY2hubCAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJpbnZhbGlkIGNvbm5lY3Rpb25zIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKHBjbFswXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gU0NDIGZvdW5kIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKCFDRFNfSVNfQ0hBTk5FTF8yNEdIWihwY2xbcGNsX2xlbi0xXSkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gMi40R2h6IGNobmwiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENEU19TQ0NfQ0hfNUc6CisJCWlmIChzZWNvbmRfY29ubmVjdGlvbl9jaG5sID4gMCAmJgorCQkJKGZpcnN0X2Nvbm5lY3Rpb25fY2hubCAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJpbnZhbGlkIGNvbm5lY3Rpb25zIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKHBjbFswXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gU0NDIGZvdW5kIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKCFDRFNfSVNfQ0hBTk5FTF81R0haKHBjbFtwY2xfbGVuLTFdKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJObyA1R2h6IGNobmwiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENEU18yNEdfU0NDX0NIOgorCQlpZiAoIUNEU19JU19DSEFOTkVMXzI0R0haKHBjbFswXSkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gMi40R2h6IGNobmwiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCA+IDAgJiYKKwkJCShmaXJzdF9jb25uZWN0aW9uX2NobmwgIT0gc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiaW52YWxpZCBjb25uZWN0aW9ucyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChwY2xbcGNsX2xlbi0xXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gU0NDIGZvdW5kIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDRFNfNUdfU0NDX0NIOgorCQlpZiAoIUNEU19JU19DSEFOTkVMXzVHSFoocGNsWzBdKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJObyA1R2h6IGNobmwiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCA+IDAgJiYKKwkJCShmaXJzdF9jb25uZWN0aW9uX2NobmwgIT0gc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiaW52YWxpZCBjb25uZWN0aW9ucyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChwY2xbcGNsX2xlbi0xXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gU0NDIGZvdW5kIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDRFNfTUNDX0NIXzI0RzoKKwkJaWYgKChwY2xbMF0gIT0gZmlyc3RfY29ubmVjdGlvbl9jaG5sKSAmJgorCQkJKChzZWNvbmRfY29ubmVjdGlvbl9jaG5sID4gMCkgJiYKKwkJCSAocGNsWzBdICE9IHNlY29uZF9jb25uZWN0aW9uX2NobmwpKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJNQ0MgaW52YWxpZCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICgoc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCA+IDApICYmCisJCQkocGNsWzFdICE9IGZpcnN0X2Nvbm5lY3Rpb25fY2hubCAmJgorCQkJIHBjbFsxXSAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJNQ0MgaW52YWxpZCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghQ0RTX0lTX0NIQU5ORUxfMjRHSFoocGNsW3BjbF9sZW4tMV0pKSB7CisJCQlzbnByaW50ZihyZWFzb24sIHJlYXNvbl9sZW5ndGgsCisJCQkJIk5vIDI0R2h6IGNobmwiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENEU19NQ0NfQ0hfNUc6CisJCWlmICgocGNsWzBdICE9IGZpcnN0X2Nvbm5lY3Rpb25fY2hubCkgJiYKKwkJCSgoc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCA+IDApICYmCisJCQkgKHBjbFswXSAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTUNDIGludmFsaWQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoKHNlY29uZF9jb25uZWN0aW9uX2NobmwgPiAwKSAmJgorCQkJKHBjbFsxXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwgJiYKKwkJCSBwY2xbMV0gIT0gc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTUNDIGludmFsaWQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoIUNEU19JU19DSEFOTkVMXzVHSFoocGNsW3BjbF9sZW4tMV0pKSB7CisJCQlzbnByaW50ZihyZWFzb24sIHJlYXNvbl9sZW5ndGgsCisJCQkJIk5vIDVHaHogY2hubCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0RTXzI0R19NQ0NfQ0g6CisJCWlmICghQ0RTX0lTX0NIQU5ORUxfMjRHSFoocGNsWzBdKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJObyAyNEdoeiBjaG5sIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKChwY2xbcGNsX2xlbi0xXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwpICYmCisJCQkoKHNlY29uZF9jb25uZWN0aW9uX2NobmwgPiAwKSAmJgorCQkJIChwY2xbcGNsX2xlbi0xXSAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTUNDIGludmFsaWQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoKHNlY29uZF9jb25uZWN0aW9uX2NobmwgPiAwKSAmJgorCQkJKHBjbFtwY2xfbGVuLTJdICE9IGZpcnN0X2Nvbm5lY3Rpb25fY2hubCAmJgorCQkJIHBjbFtwY2xfbGVuLTJdICE9IHNlY29uZF9jb25uZWN0aW9uX2NobmwpKSB7CisJCQlzbnByaW50ZihyZWFzb24sIHJlYXNvbl9sZW5ndGgsCisJCQkJIk1DQyBpbnZhbGlkIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDRFNfNUdfTUNDX0NIOgorCQlpZiAoIUNEU19JU19DSEFOTkVMXzVHSFoocGNsWzBdKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJObyA1R2h6IGNobmwiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoKHBjbFtwY2xfbGVuLTFdICE9IGZpcnN0X2Nvbm5lY3Rpb25fY2hubCkgJiYKKwkJCSgoc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCA+IDApICYmCisJCQkgKHBjbFtwY2xfbGVuLTFdICE9IHNlY29uZF9jb25uZWN0aW9uX2NobmwpKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJNQ0MgaW52YWxpZCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICgoc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCA+IDApICYmCisJCQkocGNsW3BjbF9sZW4tMl0gIT0gZmlyc3RfY29ubmVjdGlvbl9jaG5sICYmCisJCQkgcGNsW3BjbF9sZW4tMl0gIT0gc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTUNDIGludmFsaWQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENEU19TQ0NfT05fNV9TQ0NfT05fMjRfMjRHOgorCQlpZiAoIUNEU19JU19DSEFOTkVMXzVHSFoocGNsWzBdKSB8fAorCQkJKHBjbFswXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwgJiYKKwkJCSBwY2xbMF0gIT0gc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gNUdoeiBjaG5sL3NjYyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghQ0RTX0lTX0NIQU5ORUxfMjRHSFoocGNsWzFdKSB8fAorCQkJKHBjbFsxXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwgJiYKKwkJCSBwY2xbMV0gIT0gc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gMjRHaHogY2hubC9zY2MiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoIUNEU19JU19DSEFOTkVMXzI0R0haKHBjbFtwY2xfbGVuLTFdKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJObyAyNEdoeiBjaG5scyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNF81RzoKKwkJaWYgKCFDRFNfSVNfQ0hBTk5FTF81R0haKHBjbFswXSkgfHwKKwkJCShwY2xbMF0gIT0gZmlyc3RfY29ubmVjdGlvbl9jaG5sICYmCisJCQkgcGNsWzBdICE9IHNlY29uZF9jb25uZWN0aW9uX2NobmwpKSB7CisJCQlzbnByaW50ZihyZWFzb24sIHJlYXNvbl9sZW5ndGgsCisJCQkJIk5vIDVHaHogY2hubC9zY2MiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoIUNEU19JU19DSEFOTkVMXzI0R0haKHBjbFsxXSkgfHwKKwkJCShwY2xbMV0gIT0gZmlyc3RfY29ubmVjdGlvbl9jaG5sICYmCisJCQkgcGNsWzFdICE9IHNlY29uZF9jb25uZWN0aW9uX2NobmwpKSB7CisJCQlzbnByaW50ZihyZWFzb24sIHJlYXNvbl9sZW5ndGgsCisJCQkJIk5vIDI0R2h6IGNobmwvc2NjIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKCFDRFNfSVNfQ0hBTk5FTF81R0haKHBjbFtwY2xfbGVuLTFdKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJObyA1R2h6IGNobmxzIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDRFNfU0NDX09OXzI0X1NDQ19PTl81XzI0RzoKKwkJaWYgKCFDRFNfSVNfQ0hBTk5FTF8yNEdIWihwY2xbMF0pIHx8CisJCQkocGNsWzBdICE9IGZpcnN0X2Nvbm5lY3Rpb25fY2hubCAmJgorCQkJIHBjbFswXSAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJObyAyNEdoeiBjaG5sL3NjYyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghQ0RTX0lTX0NIQU5ORUxfNUdIWihwY2xbMV0pIHx8CisJCQkocGNsWzFdICE9IGZpcnN0X2Nvbm5lY3Rpb25fY2hubCAmJgorCQkJIHBjbFsxXSAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJObyA1R2h6IGNobmwvc2NjIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKCFDRFNfSVNfQ0hBTk5FTF8yNEdIWihwY2xbcGNsX2xlbi0xXSkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gMjRHaHogY2hubHMiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENEU19TQ0NfT05fMjRfU0NDX09OXzVfNUc6CisJCWlmICghQ0RTX0lTX0NIQU5ORUxfMjRHSFoocGNsWzBdKSB8fAorCQkJKHBjbFswXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwgJiYKKwkJCSBwY2xbMF0gIT0gc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gMjRHaHogY2hubC9zY2MiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoIUNEU19JU19DSEFOTkVMXzVHSFoocGNsWzFdKSB8fAorCQkJKHBjbFsxXSAhPSBmaXJzdF9jb25uZWN0aW9uX2NobmwgJiYKKwkJCSBwY2xbMV0gIT0gc2Vjb25kX2Nvbm5lY3Rpb25fY2hubCkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gNUdoeiBjaG5sL3NjYyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghQ0RTX0lTX0NIQU5ORUxfNUdIWihwY2xbcGNsX2xlbi0xXSkpIHsKKwkJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCQkiTm8gNUdoeiBjaG5scyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0RTX1NDQ19PTl81X1NDQ19PTl8yNDoKKwkJaWYgKCFDRFNfSVNfQ0hBTk5FTF81R0haKHBjbFswXSkgfHwKKwkJCShwY2xbMF0gIT0gZmlyc3RfY29ubmVjdGlvbl9jaG5sICYmCisJCQkgcGNsWzBdICE9IHNlY29uZF9jb25uZWN0aW9uX2NobmwpKSB7CisJCQlzbnByaW50ZihyZWFzb24sIHJlYXNvbl9sZW5ndGgsCisJCQkJIk5vIDVHaHogY2hubC9zY2MiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoIUNEU19JU19DSEFOTkVMXzI0R0haKHBjbFsxXSkgfHwKKwkJCShwY2xbMV0gIT0gZmlyc3RfY29ubmVjdGlvbl9jaG5sICYmCisJCQkgcGNsWzFdICE9IHNlY29uZF9jb25uZWN0aW9uX2NobmwpKSB7CisJCQlzbnByaW50ZihyZWFzb24sIHJlYXNvbl9sZW5ndGgsCisJCQkJIk5vIDI0R2h6IGNobmwvc2NjIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKHBjbF9sZW4gIT0gMikgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJtb3JlIHRoYW4gMiBjaG5scyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0RTX1NDQ19PTl8yNF9TQ0NfT05fNToKKwkJaWYgKCFDRFNfSVNfQ0hBTk5FTF8yNEdIWihwY2xbMF0pIHx8CisJCQkocGNsWzBdICE9IGZpcnN0X2Nvbm5lY3Rpb25fY2hubCAmJgorCQkJIHBjbFswXSAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJObyAyNEdoeiBjaG5sL3NjYyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghQ0RTX0lTX0NIQU5ORUxfNUdIWihwY2xbMV0pIHx8CisJCQkocGNsWzFdICE9IGZpcnN0X2Nvbm5lY3Rpb25fY2hubCAmJgorCQkJIHBjbFsxXSAhPSBzZWNvbmRfY29ubmVjdGlvbl9jaG5sKSkgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJObyA1R2h6IGNobmwvc2NjIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKHBjbF9sZW4gIT0gMikgeworCQkJc25wcmludGYocmVhc29uLCByZWFzb25fbGVuZ3RoLAorCQkJCSJtb3JlIHRoYW4gMiBjaG5scyIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCSJVbmtub3duIG9wdGlvbiIpOworCQlzdGF0dXMgPSBmYWxzZTsKKwl9CisJaWYgKHN0YXR1cyA9PSB0cnVlKSB7CisJCXNucHJpbnRmKHJlYXNvbiwgcmVhc29uX2xlbmd0aCwKKwkJCSJzdWNjZXNzIik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHdsYW5faGRkX21hcF9zdWJ0eXBlc19oZGRfd21hKGVudW0gY2RzX2Nvbl9tb2RlICpkc3QsCisJCWVudW0gY2RzX2Nvbl9tb2RlICpzcmMpCit7CisJLyoKKwkgKiB3bWEgZGVmaW5lZCBzYXAgc3VidHlwZSBhcyAwCisJICogUmVzdCBvZiB0aGUgbWFwcGluZ3MgYXJlIHNhbWUKKwkgKiBJbiBmdXR1cmUsIGlmIG1hcHBpbmcgZ2V0cyBjaGFuZ2VkIHRoZW4gcmUtbWFwIGl0IGhlcmUKKwkgKi8KKwlpZiAoKnNyYyA9PSBDRFNfU0FQX01PREUpCisJCSpkc3QgPSAwOworCWVsc2UKKwkJKmRzdCA9ICpzcmM7Cit9CisKK3ZvaWQgd2xhbl9oZGRfb25lX2Nvbm5lY3Rpb25fc2NlbmFyaW8oaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwllbnVtIGNkc19jb25fbW9kZSBzdWJfdHlwZTsKKwllbnVtIGNkc19jb25jX3ByaW9yaXR5X21vZGUgc3lzdGVtX3ByZWYgPQorCQkJaGRkX2N0eC0+Y29uZmlnLT5jb25jX3N5c3RlbV9wcmVmOworCXVpbnQ4X3QgcGNsW01BWF9OVU1fQ0hBTl0gPSB7MH07CisJdWludDMyX3QgcGNsX2xlbiA9IDA7CisJYm9vbCBzdGF0dXMgPSBmYWxzZTsKKwllbnVtIGNkc19wY2xfdHlwZSBwY2xfdHlwZTsKKwljaGFyIHJlYXNvblsyMF0gPSB7MH07CisJQ0RGX1NUQVRVUyByZXQ7CisKKwkvKiBmbHVzaCB0aGUgZW50aXJlIHRhYmxlIGZpcnN0ICovCisJcmV0ID0gY2RzX2luaXRfcG9saWN5X21ncihoZGRfY3R4KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhyZXQpKSB7CisJCWhkZF9lcnIoIlBvbGljeSBtYW5hZ2VyIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChzdWJfdHlwZSA9IDA7IHN1Yl90eXBlIDwgQ0RTX01BWF9OVU1fT0ZfTU9ERTsgc3ViX3R5cGUrKykgeworCQkvKiB2YWxpZGF0ZSBvbmUgY29ubmVjdGlvbiBpcyBjcmVhdGVkIG9yIG5vICovCisJCWlmIChjZHNfZ2V0X2Nvbm5lY3Rpb25fY291bnQoaGRkX2N0eCkgIT0gMCkgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoIlRlc3QgZmFpbGVkIC0gTm8uIG9mIGNvbm5lY3Rpb24gaXMgbm90IDAiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJY2RmX21lbV96ZXJvKHBjbCwgc2l6ZW9mKHBjbCkpOworCQlwY2xfbGVuID0gMDsKKwkJcGNsX3R5cGUgPSBnZXRfcGNsX2Zyb21fZmlyc3RfY29ubl90YWJsZShzdWJfdHlwZSwgc3lzdGVtX3ByZWYpOworCisJCS8qIGNoZWNrIFBDTCB2YWx1ZSBmb3Igc2Vjb25kIGNvbm5lY3Rpb24gaXMgY29ycmVjdCBvciBubyAqLworCQljZHNfZ2V0X3BjbChoZGRfY3R4LCBzdWJfdHlwZSwgcGNsLCAmcGNsX2xlbik7CisJCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX3BjbChoZGRfY3R4LAorCQkJCXBjbF90eXBlLCBwY2wsIHBjbF9sZW4sIDAsIDAsCisJCQkJcmVhc29uLCBzaXplb2YocmVhc29uKSk7CisJCWlmICgocGNsX3R5cGUgPT0gQ0RTX01BWF9QQ0xfVFlQRSkgJiYgKHBjbFswXSA9PSAwKSkKKwkJCWNvbnRpbnVlOworCisJCWZpbGxfcmVwb3J0KGhkZF9jdHgsICIxIGNvbm5lY3Rpb24iLCBzdWJfdHlwZSwKKwkJCQlDRFNfTUFYX05VTV9PRl9NT0RFLAorCQkJCUNEU19NQVhfTlVNX09GX01PREUsCisJCQkJMCwgMCwgMCwKKwkJCQlzdGF0dXMsIHBjbF90eXBlLCByZWFzb24sIHBjbCk7CisJfQorfQorCit2b2lkIHdsYW5faGRkX3R3b19jb25uZWN0aW9uc19zY2VuYXJpbyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQl1aW50OF90IGZpcnN0X2NobmwsIGVudW0gY2RzX2NoYWluX21vZGUgZmlyc3RfY2hhaW5fbWFzaykKK3sKKwl1aW50OF90IHZkZXZpZCA9IDAsIHR4X3N0cmVhbSA9IDIsIHJ4X3N0cmVhbSA9IDI7CisJdWludDhfdCB0eXBlID0gV01JX1ZERVZfVFlQRV9TVEEsIGNoYW5uZWxfaWQgPSBmaXJzdF9jaG5sLCBtYWNfaWQgPSAxOworCXVpbnQ4X3QgcGNsW01BWF9OVU1fQ0hBTl0gPSB7MH07CisJdWludDMyX3QgcGNsX2xlbiA9IDA7CisJZW51bSBjZHNfY2hhaW5fbW9kZSBjaGFpbl9tYXNrID0gZmlyc3RfY2hhaW5fbWFzazsKKwllbnVtIGNkc19jb25fbW9kZSBzdWJfdHlwZSwgbmV4dF9zdWJfdHlwZSwgZHVtbXlfdHlwZTsKKwllbnVtIGNkc19jb25jX3ByaW9yaXR5X21vZGUgc3lzdGVtX3ByZWYgPQorCQkJaGRkX2N0eC0+Y29uZmlnLT5jb25jX3N5c3RlbV9wcmVmOworCWVudW0gY2RzX3BjbF90eXBlIHBjbF90eXBlOworCWVudW0gY2RzX29uZV9jb25uZWN0aW9uX21vZGUgc2Vjb25kX2luZGV4OworCWNoYXIgcmVhc29uWzIwXSA9IHswfTsKKwlib29sIHN0YXR1cyA9IGZhbHNlOworCUNERl9TVEFUVVMgcmV0OworCisJZm9yIChzdWJfdHlwZSA9IENEU19TVEFfTU9ERTsKKwkJc3ViX3R5cGUgPCBDRFNfTUFYX05VTV9PRl9NT0RFOyBzdWJfdHlwZSsrKSB7CisJCXR5cGUgPSB3bGFuX2hkZF92YWxpZF90eXBlX29mX3BlcnNvbmEoc3ViX3R5cGUpOworCisJCS8qIGZsdXNoIHRoZSBlbnRpcmUgdGFibGUgZmlyc3QgKi8KKwkJcmV0ID0gY2RzX2luaXRfcG9saWN5X21ncihoZGRfY3R4KTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MocmV0KSkgeworCQkJaGRkX2VycigiUG9saWN5IG1hbmFnZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBzdWJfdHlwZSBtYXBwaW5nIGJldHdlZW4gSEREIGFuZCBXTUEgYXJlIGRpZmZlcmVudCAqLworCQl3bGFuX2hkZF9tYXBfc3VidHlwZXNfaGRkX3dtYSgmZHVtbXlfdHlwZSwgJnN1Yl90eXBlKTsKKwkJLyogYWRkIGZpcnN0IGNvbm5lY3Rpb24gYXMgU1RBICovCisJCWNkc19pbmNyX2Nvbm5lY3Rpb25fY291bnRfdXRmdyhoZGRfY3R4LCB2ZGV2aWQsIHR4X3N0cmVhbSwKKwkJCQlyeF9zdHJlYW0sIGNoYWluX21hc2ssIHR5cGUsIGR1bW15X3R5cGUsCisJCQkJY2hhbm5lbF9pZCwgbWFjX2lkKTsKKwkJLyogdmFsaWRhdGUgb25lIGNvbm5lY3Rpb24gaXMgY3JlYXRlZCBvciBubyAqLworCQlpZiAoY2RzX2dldF9jb25uZWN0aW9uX2NvdW50KGhkZF9jdHgpICE9IDEpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJUZXN0IGZhaWxlZCAtIE5vLiBvZiBjb25uZWN0aW9uIGlzIG5vdCAxIikpOworCQkJcmV0dXJuOworCQl9CisJCW5leHRfc3ViX3R5cGUgPSBDRFNfU1RBX01PREU7CisJCXdoaWxlIChuZXh0X3N1Yl90eXBlIDwgQ0RTX01BWF9OVU1fT0ZfTU9ERSkgeworCQkJLyogZ2V0IHRoZSBQQ0wgdmFsdWUgJiBjaGVjayB0aGUgY2hhbm5lbHMgYWNjb3JkaW5nbHkgKi8KKwkJCXNlY29uZF9pbmRleCA9CisJCQkJY2RzX2dldF9zZWNvbmRfY29ubmVjdGlvbl9wY2xfdGFibGVfaW5kZXgoCisJCQkJCQloZGRfY3R4KTsKKwkJCWlmIChDRFNfTUFYX09ORV9DT05ORUNUSU9OX01PREUgPT0gc2Vjb25kX2luZGV4KSB7CisJCQkJLyogbm90IHZhbGlkIGNvbWJpbmF0aW9uKi8KKwkJCQloZGRMb2coTE9HRSwgRkwoImNvdWxkbid0IGZpbmQgaW5kZXggZm9yIDJuZCBjb25uZWN0aW9uIHBjbCB0YWJsZSIpKTsKKwkJCQluZXh0X3N1Yl90eXBlKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQljZGZfbWVtX3plcm8ocGNsLCBzaXplb2YocGNsKSk7CisJCQlwY2xfbGVuID0gMDsKKwkJCXBjbF90eXBlID0gZ2V0X3BjbF9mcm9tX3NlY29uZF9jb25uX3RhYmxlKHNlY29uZF9pbmRleCwKKwkJCQkJbmV4dF9zdWJfdHlwZSwgc3lzdGVtX3ByZWYsCisJCQkJCXdtYV9pc19od19kYnNfY2FwYWJsZSgpKTsKKwkJCS8qIGNoZWNrIFBDTCBmb3Igc2Vjb25kIGNvbm5lY3Rpb24gaXMgY29ycmVjdCBvciBubyAqLworCQkJY2RzX2dldF9wY2woaGRkX2N0eCwgbmV4dF9zdWJfdHlwZSwgcGNsLCAmcGNsX2xlbik7CisJCQlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9wY2woaGRkX2N0eCwKKwkJCQkJcGNsX3R5cGUsIHBjbCwgcGNsX2xlbiwgY2hhbm5lbF9pZCwgMCwKKwkJCQkJcmVhc29uLCBzaXplb2YocmVhc29uKSk7CisJCQlpZiAoKHBjbF90eXBlID09IENEU19NQVhfUENMX1RZUEUpICYmIChwY2xbMF0gPT0gMCkpIHsKKwkJCQluZXh0X3N1Yl90eXBlKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmaWxsX3JlcG9ydChoZGRfY3R4LCAiMiBjb25uZWN0aW9ucyIsIHN1Yl90eXBlLAorCQkJCQluZXh0X3N1Yl90eXBlLAorCQkJCQlDRFNfTUFYX05VTV9PRl9NT0RFLCBmaXJzdF9jaG5sLAorCQkJCQkwLCAwLCBzdGF0dXMsIHBjbF90eXBlLCByZWFzb24sIHBjbCk7CisJCQluZXh0X3N1Yl90eXBlKys7CisJCX0KKwl9Cit9CisKK3ZvaWQgd2xhbl9oZGRfdGhyZWVfY29ubmVjdGlvbnNfc2NlbmFyaW8oaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJdWludDhfdCBmaXJzdF9jaG5sLCB1aW50OF90IHNlY29uZF9jaG5sLAorCQllbnVtIGNkc19jaGFpbl9tb2RlIGNoYWluX21hc2ssIHVpbnQ4X3QgdXNlX3NhbWVfbWFjKQoreworCXVpbnQ4X3QgdmRldmlkXzEgPSAwLCB0eF9zdHJlYW1fMSA9IDIsIHJ4X3N0cmVhbV8xID0gMjsKKwl1aW50OF90IHZkZXZpZF8yID0gMSwgdHhfc3RyZWFtXzIgPSAyLCByeF9zdHJlYW1fMiA9IDI7CisJdWludDhfdCBjaGFubmVsX2lkXzEgPSBmaXJzdF9jaG5sLCBjaGFubmVsX2lkXzIgPSBzZWNvbmRfY2hubDsKKwl1aW50OF90IG1hY19pZF8xLCBtYWNfaWRfMjsKKwl1aW50OF90IHR5cGVfMSA9IFdNSV9WREVWX1RZUEVfU1RBLCB0eXBlXzIgPSBXTUlfVkRFVl9UWVBFX1NUQTsKKwl1aW50OF90IHBjbFtNQVhfTlVNX0NIQU5dID0gezB9OworCXVpbnQzMl90IHBjbF9sZW4gPSAwOworCWVudW0gY2RzX2NoYWluX21vZGUgY2hhaW5fbWFza18xOworCWVudW0gY2RzX2NoYWluX21vZGUgY2hhaW5fbWFza18yOworCWVudW0gY2RzX2Nvbl9tb2RlIHN1Yl90eXBlXzEsIHN1Yl90eXBlXzIsIG5leHRfc3ViX3R5cGU7CisJZW51bSBjZHNfY29uX21vZGUgZHVtbXlfdHlwZV8xLCBkdW1teV90eXBlXzI7CisJZW51bSBjZHNfY29uY19wcmlvcml0eV9tb2RlIHN5c3RlbV9wcmVmID0KKwkJCWhkZF9jdHgtPmNvbmZpZy0+Y29uY19zeXN0ZW1fcHJlZjsKKwllbnVtIGNkc19wY2xfdHlwZSBwY2xfdHlwZTsKKwllbnVtIGNkc190d29fY29ubmVjdGlvbl9tb2RlIHRoaXJkX2luZGV4OworCWNoYXIgcmVhc29uWzIwXSA9IHswfTsKKwlib29sIHN0YXR1cyA9IGZhbHNlOworCUNERl9TVEFUVVMgcmV0OworCisJLyogbGV0J3Mgc2V0IHRoZSBjaGFpbl9tYXNrLCBtYWNfaWRzKi8KKwlpZiAoY2hhaW5fbWFzayA9PSBDRFNfVFdPX1RXTykgeworCQltYWNfaWRfMSA9IDE7CisJCW1hY19pZF8yID0gMTsKKwkJY2hhaW5fbWFza18xID0gQ0RTX1RXT19UV087CisJCWNoYWluX21hc2tfMiA9IENEU19UV09fVFdPOworCX0gZWxzZSBpZiAodXNlX3NhbWVfbWFjID09IDEpIHsKKwkJbWFjX2lkXzEgPSAxOworCQltYWNfaWRfMiA9IDE7CisJCWNoYWluX21hc2tfMSA9IENEU19PTkVfT05FOworCQljaGFpbl9tYXNrXzIgPSBDRFNfT05FX09ORTsKKwl9IGVsc2UgeworCQltYWNfaWRfMSA9IDE7CisJCW1hY19pZF8yID0gMjsKKwkJY2hhaW5fbWFza18xID0gQ0RTX09ORV9PTkU7CisJCWNoYWluX21hc2tfMiA9IENEU19PTkVfT05FOworCX0KKworCWZvciAoc3ViX3R5cGVfMSA9IENEU19TVEFfTU9ERTsKKwkJc3ViX3R5cGVfMSA8IENEU19NQVhfTlVNX09GX01PREU7IHN1Yl90eXBlXzErKykgeworCisJCXR5cGVfMSA9IHdsYW5faGRkX3ZhbGlkX3R5cGVfb2ZfcGVyc29uYShzdWJfdHlwZV8xKTsKKwkJLyogZmx1c2ggdGhlIGVudGlyZSB0YWJsZSBmaXJzdCAqLworCQlyZXQgPSBjZHNfaW5pdF9wb2xpY3lfbWdyKGhkZF9jdHgpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhyZXQpKSB7CisJCQloZGRfZXJyKCJQb2xpY3kgbWFuYWdlciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIHN1Yl90eXBlIG1hcHBpbmcgYmV0d2VlbiBIREQgYW5kIFdNQSBhcmUgZGlmZmVyZW50ICovCisJCXdsYW5faGRkX21hcF9zdWJ0eXBlc19oZGRfd21hKCZkdW1teV90eXBlXzEsICZzdWJfdHlwZV8xKTsKKwkJLyogYWRkIGZpcnN0IGNvbm5lY3Rpb24gYXMgU1RBICovCisJCWNkc19pbmNyX2Nvbm5lY3Rpb25fY291bnRfdXRmdyhoZGRfY3R4LCB2ZGV2aWRfMSwKKwkJCXR4X3N0cmVhbV8xLCByeF9zdHJlYW1fMSwgY2hhaW5fbWFza18xLCB0eXBlXzEsCisJCQlkdW1teV90eXBlXzEsIGNoYW5uZWxfaWRfMSwgbWFjX2lkXzEpOworCQkvKiB2YWxpZGF0ZSBvbmUgY29ubmVjdGlvbiBpcyBjcmVhdGVkIG9yIG5vICovCisJCWlmIChjZHNfZ2V0X2Nvbm5lY3Rpb25fY291bnQoaGRkX2N0eCkgIT0gMSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoIlRlc3QgZmFpbCAtIE5vLiBvZiBjb25uZWN0aW9uIG5vdCAxIikpOworCQkJcmV0dXJuOworCQl9CisJCWZvciAoc3ViX3R5cGVfMiA9IENEU19TVEFfTU9ERTsKKwkJCXN1Yl90eXBlXzIgPCBDRFNfTUFYX05VTV9PRl9NT0RFOyBzdWJfdHlwZV8yKyspIHsKKworCQkJdHlwZV8yID0gd2xhbl9oZGRfdmFsaWRfdHlwZV9vZl9wZXJzb25hKHN1Yl90eXBlXzIpOworCQkJLyogc3ViX3R5cGUgbWFwcGluZyBiZXR3ZWVuIEhERCBhbmQgV01BIGFyZSBkaWZmZXJlbnQgKi8KKwkJCXdsYW5faGRkX21hcF9zdWJ0eXBlc19oZGRfd21hKCZkdW1teV90eXBlXzIsCisJCQkJCSZzdWJfdHlwZV8yKTsKKwkJCWNkc19pbmNyX2Nvbm5lY3Rpb25fY291bnRfdXRmdyhoZGRfY3R4LCB2ZGV2aWRfMiwKKwkJCQl0eF9zdHJlYW1fMiwgcnhfc3RyZWFtXzIsIGNoYWluX21hc2tfMiwgdHlwZV8yLAorCQkJCWR1bW15X3R5cGVfMiwgY2hhbm5lbF9pZF8yLCBtYWNfaWRfMik7CisJCQkvKiB2YWxpZGF0ZSB0d28gY29ubmVjdGlvbnMgYXJlIGNyZWF0ZWQgb3Igbm8gKi8KKwkJCWlmIChjZHNfZ2V0X2Nvbm5lY3Rpb25fY291bnQoaGRkX2N0eCkgIT0gMikgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCQlGTCgiVGVzdCBmYWlsIC0gTm8uIGNvbm5lY3Rpb24gbm90IDIiKSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJbmV4dF9zdWJfdHlwZSA9IENEU19TVEFfTU9ERTsKKwkJCXdoaWxlIChuZXh0X3N1Yl90eXBlIDwgQ0RTX01BWF9OVU1fT0ZfTU9ERSkgeworCQkJCXRoaXJkX2luZGV4ID0KKwkJCQkgIGNkc19nZXRfdGhpcmRfY29ubmVjdGlvbl9wY2xfdGFibGVfaW5kZXgoCisJCQkJCQkJCWhkZF9jdHgpOworCQkJCWlmIChDRFNfTUFYX1RXT19DT05ORUNUSU9OX01PREUgPT0KKwkJCQkJCXRoaXJkX2luZGV4KSB7CisJCQkJCS8qIG5vdCB2YWxpZCBjb21iaW5hdGlvbiAqLworCQkJCQluZXh0X3N1Yl90eXBlKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQljZGZfbWVtX3plcm8ocGNsLCBzaXplb2YocGNsKSk7CisJCQkJcGNsX2xlbiA9IDA7CisJCQkJcGNsX3R5cGUgPQorCQkJCQlnZXRfcGNsX2Zyb21fdGhpcmRfY29ubl90YWJsZSgKKwkJCQkJICAgdGhpcmRfaW5kZXgsIG5leHRfc3ViX3R5cGUsCisJCQkJCSAgIHN5c3RlbV9wcmVmLAorCQkJCQkgICB3bWFfaXNfaHdfZGJzX2NhcGFibGUoKSk7CisJCQkJY2RzX2dldF9wY2woaGRkX2N0eCwgbmV4dF9zdWJfdHlwZSwKKwkJCQkJCXBjbCwgJnBjbF9sZW4pOworCQkJCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX3BjbChoZGRfY3R4LAorCQkJCQkJcGNsX3R5cGUsIHBjbCwgcGNsX2xlbiwKKwkJCQkJCWNoYW5uZWxfaWRfMSwgY2hhbm5lbF9pZF8yLAorCQkJCQkJcmVhc29uLCBzaXplb2YocmVhc29uKSk7CisJCQkJaWYgKChwY2xfdHlwZSA9PSBDRFNfTUFYX1BDTF9UWVBFKSAmJgorCQkJCQkocGNsWzBdID09IDApKSB7CisJCQkJCW5leHRfc3ViX3R5cGUrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWZpbGxfcmVwb3J0KGhkZF9jdHgsICIzIGNvbm5lY3Rpb25zIiwKKwkJCQkJc3ViX3R5cGVfMSwgc3ViX3R5cGVfMiwKKwkJCQkJbmV4dF9zdWJfdHlwZSwgZmlyc3RfY2hubCwKKwkJCQkJc2Vjb25kX2NobmwsIDAsIHN0YXR1cywKKwkJCQkJcGNsX3R5cGUsIHJlYXNvbiwgcGNsKTsKKwkJCQluZXh0X3N1Yl90eXBlKys7CisJCQl9CisJCQkvKiByZW1vdmUgZW50cnkgdG8gbWFrZSBhIHJvb20gZm9yIG5leHQgaXRlcmF0aW9uICovCisJCQljZHNfZGVjcl9jb25uZWN0aW9uX2NvdW50KGhkZF9jdHgsIHZkZXZpZF8yKTsKKwkJfQorCQluZXh0X3N1Yl90eXBlID0gQ0RTX1NUQV9NT0RFOworCX0KK30KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9kZWJ1Z2ZzLmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzc0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZGVidWdmcy5jCkBAIC0wLDAgKzEsNjQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogd2xhbl9oZGRfZGVidWdmcy5jCisgKgorICogVGhpcyBkcml2ZXIgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZGVidWdmcyBmaWxlczoKKyAqIHdsYW5fd2Nuc3Mvd293X2VuYWJsZSB0byBlbmFibGUvZGlzYWJsZSBXb1dMLgorICogd2xhbl93Y25zcy93b3dfcGF0dGVybiB0byBjb25maWd1cmUgV29XTCBwYXR0ZXJucy4KKyAqIHdsYW5fd2Nuc3MvcGF0dGVybl9nZW4gdG8gY29uZmlndXJlIHBlcmlvZGljIFRYIHBhdHRlcm5zLgorICovCisKKyNpZmRlZiBXTEFOX09QRU5fU09VUkNFCisjaW5jbHVkZSA8d2xhbl9oZGRfaW5jbHVkZXMuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF93b3dsLmg+CisjaW5jbHVkZSA8Y2RzX3NjaGVkLmg+CisKKyNkZWZpbmUgTUFYX1VTRVJfQ09NTUFORF9TSVpFX1dPV0xfRU5BQkxFIDgKKyNkZWZpbmUgTUFYX1VTRVJfQ09NTUFORF9TSVpFX1dPV0xfUEFUVEVSTiA1MTIKKyNkZWZpbmUgTUFYX1VTRVJfQ09NTUFORF9TSVpFX0ZSQU1FIDQwOTYKKworLyoqCisgKiBfX3djbnNzX3dvd2VuYWJsZV93cml0ZSgpIC0gd293X2VuYWJsZSBkZWJ1Z2ZzIGhhbmRsZXIKKyAqIEBmaWxlOiBkZWJ1Z2ZzIGZpbGUgaGFuZGxlCisgKiBAYnVmOiB0ZXh0IGJlaW5nIHdyaXR0ZW4gdG8gdGhlIGRlYnVnZnMKKyAqIEBjb3VudDogc2l6ZSBvZiBAYnVmCisgKiBAcHBvczogKHVudXNlZCkgb2Zmc2V0IGludG8gdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0KKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQKKyAqLworc3RhdGljIHNzaXplX3QgX193Y25zc193b3dlbmFibGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJICAgICBsb2ZmX3QgKnBwb3MpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwljaGFyIGNtZFtNQVhfVVNFUl9DT01NQU5EX1NJWkVfV09XTF9FTkFCTEUgKyAxXTsKKwljaGFyICpzcHRyLCAqdG9rZW47CisJdWludDhfdCB3b3dfZW5hYmxlID0gMDsKKwl1aW50OF90IHdvd19tcCA9IDA7CisJdWludDhfdCB3b3dfcGJtID0gMDsKKwlpbnQgcmV0OworCisJcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKE5VTEwgPT0gcEFkYXB0ZXIpIHx8IChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IHBBZGFwdGVyLT5tYWdpYykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogSW52YWxpZCBhZGFwdGVyIG9yIGFkYXB0ZXIgaGFzIGludmFsaWQgbWFnaWMuIiwKKwkJCSAgX19mdW5jX18pOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCisJaWYgKCFzbWVfaXNfZmVhdHVyZV9zdXBwb3J0ZWRfYnlfZncoV09XKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBXYWtlLW9uLVdpcmVsZXNzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBpbiBmaXJtd2FyZSEiLAorCQkJICBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvdW50ID4gTUFYX1VTRVJfQ09NTUFORF9TSVpFX1dPV0xfRU5BQkxFKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IENvbW1hbmQgbGVuZ3RoIGlzIGxhcmdlciB0aGFuICVkIGJ5dGVzLiIsCisJCQkgIF9fZnVuY19fLCBNQVhfVVNFUl9DT01NQU5EX1NJWkVfV09XTF9FTkFCTEUpOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEdldCBjb21tYW5kIGZyb20gdXNlciAqLworCWlmIChjb3B5X2Zyb21fdXNlcihjbWQsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwljbWRbY291bnRdID0gJ1wwJzsKKwlzcHRyID0gY21kOworCisJLyogR2V0IGVuYWJsZSBvciBkaXNhYmxlIHdvdyAqLworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJndvd19lbmFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERpc2FibGUgd293ICovCisJaWYgKCF3b3dfZW5hYmxlKSB7CisJCWlmICghaGRkX2V4aXRfd293bChwQWRhcHRlcikpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBoZGRfZXhpdF93b3dsIGZhaWxlZCEiLCBfX2Z1bmNfXyk7CisKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qIEdldCBlbmFibGUgb3IgZGlzYWJsZSBtYWdpYyBwYWNrZXQgbW9kZSAqLworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJndvd19tcCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh3b3dfbXAgPiAxKQorCQl3b3dfbXAgPSAxOworCisJLyogR2V0IGVuYWJsZSBvciBkaXNhYmxlIHBhdHRlcm4gYnl0ZSBtYXRjaGluZyBtb2RlICovCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3U4KHRva2VuLCAwLCAmd293X3BibSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh3b3dfcGJtID4gMSkKKwkJd293X3BibSA9IDE7CisKKwlpZiAoIWhkZF9lbnRlcl93b3dsKHBBZGFwdGVyLCB3b3dfbXAsIHdvd19wYm0pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGhkZF9lbnRlcl93b3dsIGZhaWxlZCEiLCBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIHdjbnNzX3dvd2VuYWJsZV93cml0ZSgpIC0gU1NSIHdyYXBwZXIgZm9yIHdjbnNzX3dvd2VuYWJsZV93cml0ZQorICogQGZpbGU6IGZpbGUgcG9pbnRlcgorICogQGJ1ZjogYnVmZmVyCisgKiBAY291bnQ6IGNvdW50CisgKiBAcHBvczogcG9zaXRpb24gcG9pbnRlcgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdjbnNzX3dvd2VuYWJsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2Nuc3Nfd293ZW5hYmxlX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX193Y25zc193b3dwYXR0ZXJuX3dyaXRlKCkgLSB3b3dfcGF0dGVybiBkZWJ1Z2ZzIGhhbmRsZXIKKyAqIEBmaWxlOiBkZWJ1Z2ZzIGZpbGUgaGFuZGxlCisgKiBAYnVmOiB0ZXh0IGJlaW5nIHdyaXR0ZW4gdG8gdGhlIGRlYnVnZnMKKyAqIEBjb3VudDogc2l6ZSBvZiBAYnVmCisgKiBAcHBvczogKHVudXNlZCkgb2Zmc2V0IGludG8gdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0KKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQKKyAqLworc3RhdGljIHNzaXplX3QgX193Y25zc193b3dwYXR0ZXJuX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCQkgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwljaGFyIGNtZFtNQVhfVVNFUl9DT01NQU5EX1NJWkVfV09XTF9QQVRURVJOICsgMV07CisJY2hhciAqc3B0ciwgKnRva2VuOworCXVpbnQ4X3QgcGF0dGVybl9pZHggPSAwOworCXVpbnQ4X3QgcGF0dGVybl9vZmZzZXQgPSAwOworCWNoYXIgKnBhdHRlcm5fYnVmOworCWNoYXIgKnBhdHRlcm5fbWFzazsKKwlpbnQgcmV0OworCisJaWYgKChOVUxMID09IHBBZGFwdGVyKSB8fCAoV0xBTl9IRERfQURBUFRFUl9NQUdJQyAhPSBwQWRhcHRlci0+bWFnaWMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEludmFsaWQgYWRhcHRlciBvciBhZGFwdGVyIGhhcyBpbnZhbGlkIG1hZ2ljLiIsCisJCQkgIF9fZnVuY19fKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIXNtZV9pc19mZWF0dXJlX3N1cHBvcnRlZF9ieV9mdyhXT1cpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFdha2Utb24tV2lyZWxlc3MgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGluIGZpcm13YXJlISIsCisJCQkgIF9fZnVuY19fKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY291bnQgPiBNQVhfVVNFUl9DT01NQU5EX1NJWkVfV09XTF9QQVRURVJOKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IENvbW1hbmQgbGVuZ3RoIGlzIGxhcmdlciB0aGFuICVkIGJ5dGVzLiIsCisJCQkgIF9fZnVuY19fLCBNQVhfVVNFUl9DT01NQU5EX1NJWkVfV09XTF9QQVRURVJOKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBHZXQgY29tbWFuZCBmcm9tIHVzZXIgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoY21kLCBidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY21kW2NvdW50XSA9ICdcMCc7CisJc3B0ciA9IGNtZDsKKworCS8qIEdldCBwYXR0ZXJuIGlkeCAqLworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGtzdHJ0b3U4KHRva2VuLCAwLCAmcGF0dGVybl9pZHgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEdldCBwYXR0ZXJuIG9mZnNldCAqLworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCisJLyogRGVsZXRlIHBhdHRlcm4gaWYgbm8gZnVydGhlciBhcmd1bWVudCAqLworCWlmICghdG9rZW4pIHsKKwkJaGRkX2RlbF93b3dsX3B0cm5fZGVidWdmcyhwQWRhcHRlciwgcGF0dGVybl9pZHgpOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwlpZiAoa3N0cnRvdTgodG9rZW4sIDAsICZwYXR0ZXJuX29mZnNldCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogR2V0IHBhdHRlcm4gKi8KKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhdHRlcm5fYnVmID0gdG9rZW47CisKKwkvKiBHZXQgcGF0dGVybiBtYXNrICovCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXR0ZXJuX21hc2sgPSB0b2tlbjsKKwlwYXR0ZXJuX21hc2tbc3RybGVuKHBhdHRlcm5fbWFzaykgLSAxXSA9ICdcMCc7CisKKwloZGRfYWRkX3dvd2xfcHRybl9kZWJ1Z2ZzKHBBZGFwdGVyLCBwYXR0ZXJuX2lkeCwgcGF0dGVybl9vZmZzZXQsCisJCQkJICBwYXR0ZXJuX2J1ZiwgcGF0dGVybl9tYXNrKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiB3Y25zc193b3dwYXR0ZXJuX3dyaXRlKCkgLSBTU1Igd3JhcHBlciBmb3IgX193Y25zc193b3dwYXR0ZXJuX3dyaXRlCisgKiBAZmlsZTogZmlsZSBwb2ludGVyCisgKiBAYnVmOiBidWZmZXIKKyAqIEBjb3VudDogY291bnQKKyAqIEBwcG9zOiBwb3NpdGlvbiBwb2ludGVyCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIHNzaXplX3Qgd2Nuc3Nfd293cGF0dGVybl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXNzaXplX3QgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3djbnNzX3dvd3BhdHRlcm5fd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3Y25zc19wYXR0ZXJuZ2VuX3dyaXRlKCkgLSBwYXR0ZXJuX2dlbiBkZWJ1Z2ZzIGhhbmRsZXIKKyAqIEBmaWxlOiBkZWJ1Z2ZzIGZpbGUgaGFuZGxlCisgKiBAYnVmOiB0ZXh0IGJlaW5nIHdyaXR0ZW4gdG8gdGhlIGRlYnVnZnMKKyAqIEBjb3VudDogc2l6ZSBvZiBAYnVmCisgKiBAcHBvczogKHVudXNlZCkgb2Zmc2V0IGludG8gdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0KKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQKKyAqLworc3RhdGljIHNzaXplX3QgX193Y25zc19wYXR0ZXJuZ2VuX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCQkgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwl0U2lyQWRkUGVyaW9kaWNUeFB0cm4gKmFkZFBlcmlvZGljVHhQdHJuUGFyYW1zOworCXRTaXJEZWxQZXJpb2RpY1R4UHRybiAqZGVsUGVyaW9kaWNUeFB0cm5QYXJhbXM7CisKKwljaGFyICpjbWQsICpzcHRyLCAqdG9rZW47CisJdWludDhfdCBwYXR0ZXJuX2lkeCA9IDA7CisJdWludDhfdCBwYXR0ZXJuX2R1cmF0aW9uID0gMDsKKwljaGFyICpwYXR0ZXJuX2J1ZjsKKwl1aW50MTZfdCBwYXR0ZXJuX2xlbiA9IDA7CisJdWludDE2X3QgaSA9IDA7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaW50IHJldDsKKworCisJcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKE5VTEwgPT0gcEFkYXB0ZXIpIHx8IChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IHBBZGFwdGVyLT5tYWdpYykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogSW52YWxpZCBhZGFwdGVyIG9yIGFkYXB0ZXIgaGFzIGludmFsaWQgbWFnaWMuIiwKKwkJCSAgX19mdW5jX18pOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghc21lX2lzX2ZlYXR1cmVfc3VwcG9ydGVkX2J5X2Z3KFdMQU5fUEVSSU9ESUNfVFhfUFRSTikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogUGVyaW9kaWMgVHggUGF0dGVybiBPZmZsb2FkIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBpbiBmaXJtd2FyZSEiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEdldCBjb21tYW5kIGZyb20gdXNlciAqLworCWlmIChjb3VudCA8PSBNQVhfVVNFUl9DT01NQU5EX1NJWkVfRlJBTUUpCisJCWNtZCA9IGNkZl9tZW1fbWFsbG9jKGNvdW50ICsgMSk7CisJZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IENvbW1hbmQgbGVuZ3RoIGlzIGxhcmdlciB0aGFuICVkIGJ5dGVzLiIsCisJCQkgIF9fZnVuY19fLCBNQVhfVVNFUl9DT01NQU5EX1NJWkVfRlJBTUUpOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghY21kKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiTWVtb3J5IGFsbG9jYXRpb24gZm9yIGNtZCBmYWlsZWQhIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoY21kLCBidWYsIGNvdW50KSkgeworCQljZGZfbWVtX2ZyZWUoY21kKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWNtZFtjb3VudF0gPSAnXDAnOworCXNwdHIgPSBjbWQ7CisKKwkvKiBHZXQgcGF0dGVybiBpZHggKi8KKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlnb3RvIGZhaWx1cmU7CisJaWYgKGtzdHJ0b3U4KHRva2VuLCAwLCAmcGF0dGVybl9pZHgpKQorCQlnb3RvIGZhaWx1cmU7CisKKwlpZiAocGF0dGVybl9pZHggPiAoTUFYTlVNX1BFUklPRElDX1RYX1BUUk5TIC0gMSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogUGF0dGVybiBpbmRleCAlZCBpcyBub3QgaW4gdGhlIHJhbmdlICgwIH4gJWQpLiIsCisJCQkgIF9fZnVuY19fLCBwYXR0ZXJuX2lkeCwgTUFYTlVNX1BFUklPRElDX1RYX1BUUk5TIC0gMSk7CisKKwkJZ290byBmYWlsdXJlOworCX0KKworCS8qIEdldCBwYXR0ZXJuIGR1cmF0aW9uICovCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJZ290byBmYWlsdXJlOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnBhdHRlcm5fZHVyYXRpb24pKQorCQlnb3RvIGZhaWx1cmU7CisKKwkvKiBEZWxldGUgcGF0dGVybiB1c2luZyBpbmRleCBpZiBkdXJhdGlvbiBpcyAwICovCisJaWYgKCFwYXR0ZXJuX2R1cmF0aW9uKSB7CisJCWRlbFBlcmlvZGljVHhQdHJuUGFyYW1zID0KKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyRGVsUGVyaW9kaWNUeFB0cm4pKTsKKwkJaWYgKCFkZWxQZXJpb2RpY1R4UHRyblBhcmFtcykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTCgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkISIpKTsKKwkJCWNkZl9tZW1fZnJlZShjbWQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJZGVsUGVyaW9kaWNUeFB0cm5QYXJhbXMtPnVjUHRybklkID0gcGF0dGVybl9pZHg7CisJCWRlbFBlcmlvZGljVHhQdHJuUGFyYW1zLT51Y1BhdHRlcm5JZEJpdG1hcCA9IDEgPDwgcGF0dGVybl9pZHg7CisJCWNkZl9tZW1fY29weShkZWxQZXJpb2RpY1R4UHRyblBhcmFtcy0+bWFjQWRkcmVzcywKKwkJCSAgICAgcEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLCA2KTsKKworCQkvKiBEZWxldGUgcGF0dGVybiAqLworCQlzdGF0dXMgPSBzbWVfZGVsX3BlcmlvZGljX3R4X3B0cm4ocEhkZEN0eC0+aEhhbCwKKwkJCQkJCSAgZGVsUGVyaW9kaWNUeFB0cm5QYXJhbXMpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IHNtZV9kZWxfcGVyaW9kaWNfdHhfcHRybigpIGZhaWxlZCEiLAorCQkJCSAgX19mdW5jX18pOworCisJCQljZGZfbWVtX2ZyZWUoZGVsUGVyaW9kaWNUeFB0cm5QYXJhbXMpOworCQkJZ290byBmYWlsdXJlOworCQl9CisJCWNkZl9tZW1fZnJlZShjbWQpOworCQljZGZfbWVtX2ZyZWUoZGVsUGVyaW9kaWNUeFB0cm5QYXJhbXMpOworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoKKwkgKiBJbiBTQVAgbW9kZSBhbGxvdyBjb25maWd1cmF0aW9uIHdpdGhvdXQgYW55IGNvbm5lY3Rpb24gY2hlY2sKKwkgKiBJbiBTVEEgbW9kZSBjaGVjayBpZiBpdCdzIGluIGNvbm5lY3RlZCBzdGF0ZSBiZWZvcmUgYWRkaW5nCisJICogcGF0dGVybnMKKwkgKi8KKwloZGRfaW5mbygiZGV2aWNlIG1vZGUgJWQiLCBwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCWlmICgoV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpICYmCisJICAgICghaGRkX2Nvbm5faXNfY29ubmVjdGVkKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKSkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSIlczogTm90IGluIENvbm5lY3RlZCBzdGF0ZSEiLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGZhaWx1cmU7CisJfQorCisJLyogR2V0IHBhdHRlcm4gKi8KKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlnb3RvIGZhaWx1cmU7CisKKwlwYXR0ZXJuX2J1ZiA9IHRva2VuOworCXBhdHRlcm5fYnVmW3N0cmxlbihwYXR0ZXJuX2J1ZikgLSAxXSA9ICdcMCc7CisJcGF0dGVybl9sZW4gPSBzdHJsZW4ocGF0dGVybl9idWYpOworCisJLyogU2luY2UgdGhlIHBhdHRlcm4gaXMgYSBoZXggc3RyaW5nLCAyIGNoYXJhY3RlcnMgcmVwcmVzZW50IDEgYnl0ZS4gKi8KKwlpZiAocGF0dGVybl9sZW4gJSAyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE1hbGZvcm1lZCBwYXR0ZXJuISIsIF9fZnVuY19fKTsKKworCQlnb3RvIGZhaWx1cmU7CisJfSBlbHNlCisJCXBhdHRlcm5fbGVuID4+PSAxOworCisJaWYgKHBhdHRlcm5fbGVuIDwgMTQgfHwgcGF0dGVybl9sZW4gPiBQRVJJT0RJQ19UWF9QVFJOX01BWF9TSVpFKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE5vdCBhbiA4MDIuMyBmcmFtZSEiLCBfX2Z1bmNfXyk7CisKKwkJZ290byBmYWlsdXJlOworCX0KKworCWFkZFBlcmlvZGljVHhQdHJuUGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJBZGRQZXJpb2RpY1R4UHRybikpOworCWlmICghYWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQhIikpOworCQljZGZfbWVtX2ZyZWUoY21kKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMtPnVjUHRybklkID0gcGF0dGVybl9pZHg7CisJYWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMtPnVzUHRybkludGVydmFsTXMgPSBwYXR0ZXJuX2R1cmF0aW9uICogNTAwOworCWFkZFBlcmlvZGljVHhQdHJuUGFyYW1zLT51Y1B0cm5TaXplID0gcGF0dGVybl9sZW47CisJY2RmX21lbV9jb3B5KGFkZFBlcmlvZGljVHhQdHJuUGFyYW1zLT5tYWNBZGRyZXNzLAorCQkgICAgIHBBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcywgNik7CisKKwkvKiBFeHRyYWN0IHRoZSBwYXR0ZXJuICovCisJZm9yIChpID0gMDsgaSA8IGFkZFBlcmlvZGljVHhQdHJuUGFyYW1zLT51Y1B0cm5TaXplOyBpKyspIHsKKwkJYWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMtPnVjUGF0dGVybltpXSA9CisJCQkoaGV4X3RvX2JpbihwYXR0ZXJuX2J1ZlswXSkgPDwgNCkgKworCQkJaGV4X3RvX2JpbihwYXR0ZXJuX2J1ZlsxXSk7CisKKwkJLyogU2tpcCB0byBuZXh0IGJ5dGUgKi8KKwkJcGF0dGVybl9idWYgKz0gMjsKKwl9CisKKwkvKiBBZGQgcGF0dGVybiAqLworCXN0YXR1cyA9IHNtZV9hZGRfcGVyaW9kaWNfdHhfcHRybihwSGRkQ3R4LT5oSGFsLAorCQkJCQkgIGFkZFBlcmlvZGljVHhQdHJuUGFyYW1zKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBzbWVfYWRkX3BlcmlvZGljX3R4X3B0cm4oKSBmYWlsZWQhIiwgX19mdW5jX18pOworCisJCWNkZl9tZW1fZnJlZShhZGRQZXJpb2RpY1R4UHRyblBhcmFtcyk7CisJCWdvdG8gZmFpbHVyZTsKKwl9CisJY2RmX21lbV9mcmVlKGNtZCk7CisJY2RmX21lbV9mcmVlKGFkZFBlcmlvZGljVHhQdHJuUGFyYW1zKTsKKwlyZXR1cm4gY291bnQ7CisKK2ZhaWx1cmU6CisJY2RmX21lbV9mcmVlKGNtZCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogd2Nuc3NfcGF0dGVybmdlbl93cml0ZSgpIC0gU1NSIHdyYXBwZXIgZm9yIF9fd2Nuc3NfcGF0dGVybmdlbl93cml0ZQorICogQGZpbGU6IGZpbGUgcG9pbnRlcgorICogQGJ1ZjogYnVmZmVyCisgKiBAY291bnQ6IGNvdW50CisgKiBAcHBvczogcG9zaXRpb24gcG9pbnRlcgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdjbnNzX3BhdHRlcm5nZW5fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193Y25zc19wYXR0ZXJuZ2VuX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX193Y25zc19kZWJ1Z2ZzX29wZW4oKSAtIEdlbmVyaWMgZGVidWdmcyBvcGVuKCkgaGFuZGxlcgorICogQGlub2RlOiBpbm9kZSBvZiB0aGUgZGVidWdmcyBmaWxlCisgKiBAZmlsZTogZmlsZSBoYW5kbGUgb2YgdGhlIGRlYnVnZnMgZmlsZQorICoKKyAqIFJldHVybjogMAorICovCitzdGF0aWMgaW50IF9fd2Nuc3NfZGVidWdmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWlmIChpbm9kZS0+aV9wcml2YXRlKQorCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCisJYWRhcHRlciA9IChoZGRfYWRhcHRlcl90ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoTlVMTCA9PSBhZGFwdGVyKSB8fCAoV0xBTl9IRERfQURBUFRFUl9NQUdJQyAhPSBhZGFwdGVyLT5tYWdpYykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogSW52YWxpZCBhZGFwdGVyIG9yIGFkYXB0ZXIgaGFzIGludmFsaWQgbWFnaWMuIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdjbnNzX2RlYnVnZnNfb3BlbigpIC0gU1NSIHdyYXBwZXIgZm9yIF9fd2Nuc3NfZGVidWdmc19vcGVuCisgKiBAaW5vZGU6IGlub2RlIHBvaW50ZXIKKyAqIEBmaWxlOiBmaWxlIHBvaW50ZXIKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHdjbnNzX2RlYnVnZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3djbnNzX2RlYnVnZnNfb3Blbihpbm9kZSwgZmlsZSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc193b3dlbmFibGUgPSB7CisJLndyaXRlID0gd2Nuc3Nfd293ZW5hYmxlX3dyaXRlLAorCS5vcGVuID0gd2Nuc3NfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfd293cGF0dGVybiA9IHsKKwkud3JpdGUgPSB3Y25zc193b3dwYXR0ZXJuX3dyaXRlLAorCS5vcGVuID0gd2Nuc3NfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcGF0dGVybmdlbiA9IHsKKwkud3JpdGUgPSB3Y25zc19wYXR0ZXJuZ2VuX3dyaXRlLAorCS5vcGVuID0gd2Nuc3NfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKKy8qKgorICogaGRkX2RlYnVnZnNfaW5pdCgpIC0gSW5pdGlhbGl6ZSBkZWJ1Z2ZzIGludGVyZmFjZQorICogQHBBZGFwdGVyOiBwcmltYXJ5IHdsYW4gYWRhcHRlcgorICoKKyAqIFJlZ2lzdGVyIHN1cHBvcnQgZm9yIHRoZSBkZWJ1Z2ZzIGZpbGVzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLgorICoKKyAqIE5COiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIGRlYnVnZnMgb3BlcmF0aW9ucworICogb24gdGhlIHByaW1hcnkgaW50ZXJmYWNlLCBpLmUuIHdsYW4wCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgaWYgYWxsIGZpbGVzIHJlZ2lzdGVyZWQsCisgKgkgICBDREZfU1RBVFVTX0VfRkFJTFVSRSBvbiBmYWlsdXJlCisgKi8KK0NERl9TVEFUVVMgaGRkX2RlYnVnZnNfaW5pdChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcEhkZEN0eC0+ZGVidWdmc19waHkgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIndsYW5fd2Nuc3MiLCAwKTsKKworCWlmIChOVUxMID09IHBIZGRDdHgtPmRlYnVnZnNfcGh5KQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAoTlVMTCA9PSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ3b3dfZW5hYmxlIiwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkJCXBIZGRDdHgtPmRlYnVnZnNfcGh5LCBwQWRhcHRlciwKKwkJCQkJJmZvcHNfd293ZW5hYmxlKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKE5VTEwgPT0gZGVidWdmc19jcmVhdGVfZmlsZSgid293X3BhdHRlcm4iLCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCQkJcEhkZEN0eC0+ZGVidWdmc19waHksIHBBZGFwdGVyLAorCQkJCQkmZm9wc193b3dwYXR0ZXJuKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKE5VTEwgPT0gZGVidWdmc19jcmVhdGVfZmlsZSgicGF0dGVybl9nZW4iLCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCQkJcEhkZEN0eC0+ZGVidWdmc19waHksIHBBZGFwdGVyLAorCQkJCQkmZm9wc19wYXR0ZXJuZ2VuKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBoZGRfZGVidWdmc19leGl0KCkgLSBTaHV0ZG93biBkZWJ1Z2ZzIGludGVyZmFjZQorICogQHBIZGRDdHg6IHRoZSBnbG9iYWwgSEREIGNvbnRleHQKKyAqCisgKiBVbnJlZ2lzdGVyIHN1cHBvcnQgZm9yIHRoZSBkZWJ1Z2ZzIGZpbGVzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGhkZF9kZWJ1Z2ZzX2V4aXQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUocEhkZEN0eC0+ZGVidWdmc19waHkpOworfQorI2VuZGlmIC8qICNpZmRlZiBXTEFOX09QRU5fU09VUkNFICovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZHJpdmVyX29wcy5jIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX2RyaXZlcl9vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGExZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX2RyaXZlcl9vcHMuYwpAQCAtMCwwICsxLDY0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpZmRlZiBISUZfUENJCisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2VuZGlmIC8qIENPTkZJR19DTlNTICovCisjZWxzZQorI2luY2x1ZGUgPHNvYy9xY29tL2ljbnNzLmg+CisjZW5kaWYgLyogSElGX1BDSSAqLworI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJjZGZfc3RhdHVzLmgiCisjaW5jbHVkZSAiY2RmX2xvY2suaCIKKyNpbmNsdWRlICJjZHNfc2NoZWQuaCIKKyNpbmNsdWRlICJvc2RlcC5oIgorI2luY2x1ZGUgImhpZi5oIgorI2luY2x1ZGUgImVwcGluZ19tYWluLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorI2luY2x1ZGUgIndsYW5faGRkX3Bvd2VyLmgiCisjaW5jbHVkZSAid2xhbl9sb2dnaW5nX3NvY2tfc3ZjLmgiCisjaW5jbHVkZSAid21hX2FwaS5oIgorI2luY2x1ZGUgIndsYW5faGRkX25hcGkuaCIKKworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBXTEFOX01PRFVMRV9OQU1FICBtb2R1bGVfbmFtZShUSElTX01PRFVMRSkKKyNlbHNlCisjZGVmaW5lIFdMQU5fTU9EVUxFX05BTUUgICJ3bGFuIgorI2VuZGlmCisKKyNpZmRlZiBISUZfUENJCisjaWZkZWYgQ09ORklHX0NOU1MKKyNkZWZpbmUgV0xBTl9IRERfUkVHSVNURVJfRFJJVkVSKHdsYW5fZHJ2X29wcykgXAorCWNuc3Nfd2xhbl9yZWdpc3Rlcl9kcml2ZXIod2xhbl9kcnZfb3BzKQorI2RlZmluZSBXTEFOX0hERF9VTlJFR0lTVEVSX0RSSVZFUih3bGFuX2Rydl9vcHMpIFwKKwljbnNzX3dsYW5fdW5yZWdpc3Rlcl9kcml2ZXIod2xhbl9kcnZfb3BzKQorI2Vsc2UKKyNkZWZpbmUgV0xBTl9IRERfUkVHSVNURVJfRFJJVkVSKHdsYW5fZHJ2X29wcykgXAorCXBjaV9yZWdpc3Rlcl9kcml2ZXIod2xhbl9kcnZfb3BzKQorI2RlZmluZSBXTEFOX0hERF9VTlJFR0lTVEVSX0RSSVZFUih3bGFuX2Rydl9vcHMpIFwKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIod2xhbl9kcnZfb3BzKQorI2VuZGlmIC8qIENPTkZJR19DTlNTICovCisjZWxzZQorI2RlZmluZSBXTEFOX0hERF9SRUdJU1RFUl9EUklWRVIod2xhbl9kcnZfb3BzKSBcCisJaWNuc3NfcmVnaXN0ZXJfZHJpdmVyKHdsYW5fZHJ2X29wcykKKyNkZWZpbmUgV0xBTl9IRERfVU5SRUdJU1RFUl9EUklWRVIod2xhbl9kcnZfb3BzKSBcCisJaWNuc3NfdW5yZWdpc3Rlcl9kcml2ZXIod2xhbl9kcnZfb3BzKQorI2VuZGlmIC8qIEhJRl9QQ0kgKi8KKworLyoqCisgKiB3bGFuX2hkZF9wcm9iZSgpIC0gaGFuZGxlcyBwcm9iZSByZXF1ZXN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvYmUgdGhlIHdsYW4gZHJpdmVyCisgKgorICogQGRldjogd2xhbiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYmRldjogYnVzIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBiaWQ6IGJ1cyBpZGVudGlmaWVyIGZvciBzaGFyZWQgYnVzc2VzCisgKiBAYnVzX3R5cGU6IHVuZGVybHlpbmcgYnVzIHR5cGUKKyAqIEByZWluaXQ6IHRydWUgaWYgd2UgYXJlIHJlaW5pdGlhbGxpemluZyB0aGUgZHJpdmVyIGFmdGVyIGEgc3Vic3lzdGVtIHJlc3RhcnQKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzc2Z1bGwgcHJvYmUKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmJkZXYsIGNvbnN0IGhpZl9idXNfaWQgKmJpZCwKKwllbnVtIGF0aF9oYWxfYnVzX3R5cGUgYnVzX3R5cGUsIGJvb2wgcmVpbml0KQoreworCXZvaWQgKmhpZl9jdHg7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaW50IHJldDsKKworCWlmIChXTEFOX0lTX0VQUElOR19FTkFCTEVEKGNkc19nZXRfY29ucGFyYW0oKSkpIHsKKwkJc3RhdHVzID0gZXBwaW5nX29wZW4oKTsKKwkJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGhpZl9vcGVuKCk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJoaWZfb3BlbiBlcnJvciA9ICVkIiksIHN0YXR1cyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwloaWZfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKwlpZiAocmVpbml0KQorCQloZGRfbmFwaV9kZXN0cm95KHRydWUpOworCXN0YXR1cyA9IGhkZF9uYXBpX2NyZWF0ZSgpOworCWlmIChoZGRfbmFwaV9lbmFibGVkKEhERF9OQVBJX0FOWSkpIHsKKwkJaGRkX2luZm8oImhkZF9uYXBpX2NyZWF0ZSByZXR1cm5lZDogJWRcbiIsIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgPD0gMCkgeworCQkJaGRkX2VycigiTkFQSSBjcmVhdGlvbiBlcnJvciwgcmM6IDB4JXgsIHJlaW5pdCA9ICVkIiwKKwkJCXN0YXR1cywgcmVpbml0KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJc3RhdHVzID0gaGlmX2VuYWJsZShoaWZfY3R4LCBkZXYsIGJkZXYsIGJpZCwKKwkJCQlidXNfdHlwZSwgKHJlaW5pdCA9PSB0cnVlKSA/CisJCQkJSElGX0VOQUJMRV9UWVBFX1JFSU5JVCA6IEhJRl9FTkFCTEVfVFlQRV9QUk9CRSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkX2VycigiaGlmX2VuYWJsZSBlcnJvciA9ICVkLCByZWluaXQgPSAlZCIsCisJCQlzdGF0dXMsIHJlaW5pdCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZW5kOworCX0KKworCWlmIChyZWluaXQpCisJCXJldCA9IGhkZF93bGFuX3JlX2luaXQoaGlmX2N0eCk7CisJZWxzZQorCQlyZXQgPSBoZGRfd2xhbl9zdGFydHVwKGRldiwgaGlmX2N0eCk7CisKK2VuZDoKKwlpZiAocmV0KSB7CisJCWlmIChXTEFOX0lTX0VQUElOR19FTkFCTEVEKGNkc19nZXRfY29ucGFyYW0oKSkpIHsKKwkJCWhpZl9wa3Rsb2dtb2RfZXhpdChoaWZfY3R4KTsKKwkJCWVwcGluZ19kaXNhYmxlKCk7CisJCQlodGNfZGVzdHJveShjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9IVEMpKTsKKwkJCWhpZl9kaXNhYmxlKGhpZl9jdHgsIChyZWluaXQgPT0gdHJ1ZSkgPworCQkJCUhJRl9FTkFCTEVfVFlQRV9SRUlOSVQgOiBISUZfRU5BQkxFX1RZUEVfUFJPQkUpOworCQkJY2RzX2ZyZWVfY29udGV4dChOVUxMLCBDREZfTU9EVUxFX0lEX0hUQywgTlVMTCk7CisJCQllcHBpbmdfY2xvc2UoKTsKKwkJfSBlbHNlIHsKKwkJCWhpZl9wa3Rsb2dtb2RfZXhpdChoaWZfY3R4KTsKKwkJCV9faGRkX3dsYW5fZXhpdCgpOworCQkJaGlmX2Rpc2FibGUoaGlmX2N0eCwgSElGX0RJU0FCTEVfVFlQRV9SRU1PVkUpOworCQl9CisJCWhpZl9jbG9zZShoaWZfY3R4KTsKKwl9CisKKwlpZiAocmVpbml0KQorCQljZHNfc2V0X2xvZ3BfaW5fcHJvZ3Jlc3MoZmFsc2UpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9yZW1vdmUoKSAtIHdsYW5faGRkX3JlbW92ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBwbGF0Zm9ybSBkcml2ZXIgdG8gcmVtb3ZlIHRoZQorICogZHJpdmVyCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5faGRkX3JlbW92ZSh2b2lkKQoreworCXZvaWQgKmhpZl9jdHg7CisJdl9DT05URVhUX3QgcF9jZHNfY29udGV4dCA9IE5VTEw7CisKKwkvKiBHZXQgdGhlIGdsb2JhbCBjZHMgY29udGV4dCAqLworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisKKwloaWZfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKworCWlmIChXTEFOX0lTX0VQUElOR19FTkFCTEVEKGNkc19nZXRfY29ucGFyYW0oKSkpIHsKKwkJaGlmX3BrdGxvZ21vZF9leGl0KGhpZl9jdHgpOworCQllcHBpbmdfZGlzYWJsZSgpOworCQlodGNfZGVzdHJveShjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9IVEMpKTsKKwkJaGlmX2Rpc2FibGUoaGlmX2N0eCwgSElGX0RJU0FCTEVfVFlQRV9SRU1PVkUpOworCQljZHNfZnJlZV9jb250ZXh0KE5VTEwsIENERl9NT0RVTEVfSURfSFRDLCBOVUxMKTsKKwkJZXBwaW5nX2Nsb3NlKCk7CisJfSBlbHNlIHsKKwkJaGlmX3BrdGxvZ21vZF9leGl0KGhpZl9jdHgpOworCQlfX2hkZF93bGFuX2V4aXQoKTsKKwkJaGlmX2Rpc2FibGUoaGlmX2N0eCwgSElGX0RJU0FCTEVfVFlQRV9SRU1PVkUpOworCX0KKworCWhkZF9uYXBpX2Rlc3Ryb3kodHJ1ZSk7CisJaGlmX2Nsb3NlKGhpZl9jdHgpOworCisJY2RzX2ZyZWVfZ2xvYmFsX2NvbnRleHQoJnBfY2RzX2NvbnRleHQpOworCisjaWZkZWYgV0xBTl9MT0dHSU5HX1NPQ0tfU1ZDX0VOQUJMRQorCXdsYW5fbG9nZ2luZ19zb2NrX2RlaW5pdF9zdmMoKTsKKyNlbmRpZgorCisJY2RmX3dha2VfbG9ja19kZXN0cm95KGhkZF93bGFuX2dldF93YWtlX2xvY2tfcHRyKCkpOworCisJcHJfaW5mbygiJXM6IGRyaXZlciB1bmxvYWRlZFxuIiwgV0xBTl9NT0RVTEVfTkFNRSk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfc2h1dGRvd24oKSAtIHdsYW5faGRkX3NodXRkb3duCisgKgorICogVGhpcyBpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBwbGF0Zm9ybSBkcml2ZXIgdG8gc2h1dGRvd24gdGhlCisgKiBkcml2ZXIKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfc2h1dGRvd24odm9pZCkKK3sKKwl2b2lkICpoaWZfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKworCWlmIChjZHNfaXNfbG9hZF91bmxvYWRfaW5fcHJvZ3Jlc3MoKSkgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJMb2FkL3VubG9hZCBpbiBwcm9ncmVzcywgaWdub3JlIFNTUiBzaHV0ZG93biIpKTsKKwkJcmV0dXJuOworCX0KKwkvKiB0aGlzIGlzIGZvciBjYXNlcywgd2hlcmUgc2h1dGRvd24gaW52b2tlZCBmcm9tIENOU1MgKi8KKwljZHNfc2V0X2xvZ3BfaW5fcHJvZ3Jlc3ModHJ1ZSk7CisKKwlpZiAoY2RzX2dldF9jb25wYXJhbSgpICE9IENERl9GVE1fTU9ERSAmJgorCSAgICAhV0xBTl9JU19FUFBJTkdfRU5BQkxFRChjZHNfZ2V0X2NvbnBhcmFtKCkpKQorCQloaWZfcGt0bG9nbW9kX2V4aXQoaGlmX2N0eCk7CisKKwlpZiAoIWNkc19pc19zc3JfcmVhZHkoX19mdW5jX18pKQorCQloZGRMb2coTE9HRSwKKwkJCUZMKCJIb3N0IGlzIG5vdCByZWFkeSBmb3IgU1NSLCBhdHRlbXB0aW5nIGFueXdheSIpKTsKKworCWlmICghV0xBTl9JU19FUFBJTkdfRU5BQkxFRChjZHNfZ2V0X2NvbnBhcmFtKCkpKQorCQloZGRfd2xhbl9zaHV0ZG93bigpOworCisJaGlmX2Rpc2FibGUoaGlmX2N0eCwgSElGX0RJU0FCTEVfVFlQRV9TSFVURE9XTik7CisJaGlmX2Nsb3NlKGhpZl9jdHgpOworfQorCisvKioKKyAqIHdsYW5faGRkX2NyYXNoX3NodXRkb3duKCkgLSB3bGFuX2hkZF9jcmFzaF9zaHV0ZG93bgorICoKKyAqIEhERCBjcmFzaCBzaHV0ZG93biBmdW50aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieQorICogcGxhdGZyb20gZHJpdmVyJ3MgY3Jhc2ggc2h1dGRvd24gcm91dGluZQorICoKKyAqIFJldHVybjogdm9pZAorICovCit2b2lkIHdsYW5faGRkX2NyYXNoX3NodXRkb3duKHZvaWQpCit7CisJaGlmX2NyYXNoX3NodXRkb3duKGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRikpOworfQorCisvKioKKyAqIHdsYW5faGRkX25vdGlmeV9oYW5kbGVyKCkgLSB3bGFuX2hkZF9ub3RpZnlfaGFuZGxlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBwbGF0Zm9ybSBkcml2ZXIgdG8gbm90aWZ5IHRoZQorICogQ09FWAorICoKKyAqIEBzdGF0ZTogc3RhdGUKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF9ub3RpZnlfaGFuZGxlcihpbnQgc3RhdGUpCit7CisJaWYgKCFXTEFOX0lTX0VQUElOR19FTkFCTEVEKGNkc19nZXRfY29ucGFyYW0oKSkpIHsKKwkJaW50IHJldCA9IDA7CisJCXJldCA9IGhkZF93bGFuX25vdGlmeV9tb2RlbV9wb3dlcl9zdGF0ZShzdGF0ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJaGRkTG9nKExPR0UsIEZMKCJGYWlsIHRvIHNlbmQgbm90aWZ5IikpOworCX0KK30KKworLyoqCisgKiBfX3dsYW5faGRkX2J1c19zdXNwZW5kKCkgLSBoYW5kbGVzIHBsYXRmb3JtIHN1cHNlbmQKKyAqIEBzdGF0ZTogc3VzcGVuZCBtZXNzYWdlIGZyb20gdGhlIGtlcm5lbAorICoKKyAqIERvZXMgcHJlY29uZHRpb24gdmFsaWRhdGlvbi4gRW5zdXJlcyB0aGF0IGEgc3Vic3lzdGVtIHJlc3RhcnQgaXNuJ3QgaW4KKyAqIHByb2dyZXNzLiAgRW5zdXJlcyB0aGF0IG5vIGxvYWQgb3IgdW5sb2FkIGlzIGluIHByb2dyZXNzLgorICogQ2FsbHMgb2xfdHhyeF9idXNfc3VzcGVuZCB0byBlbnN1cmUgdGhlIGxheWVyIGlzIHJlYWR5IGZvciBhIGJ1cyBzdXNwZW5kLgorICogQ2FsbHMgd21hX3N1c3BlbmQgdG8gY29uZmlndXJlIG9mZmxvYWRzLgorICogQ2FsbHMgaGlmX3N1c3BlbmQgdG8gc3VzcGVuZCB0aGUgYnVzLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcywgLUVGQVVMVCBmb3IgbnVsbCBwb2ludGVycywKKyAqICAgICAtRUJVU1kgb3IgLUVBR0FJTiBpZiBhbm90aGVyIG9wcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MgYW5kCisgKiAgICAgd2xhbiB3aWxsIG5vdCBiZSByZWFkeSB0byBzdXNwZW5kIGluIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9idXNfc3VzcGVuZChwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJdm9pZCAqaGRkX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJaW50IGVyciA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaW50IHN0YXR1czsKKworCWhkZF9pbmZvKCJldmVudCAlZCIsIHN0YXRlLmV2ZW50KTsKKworCWlmIChlcnIpCisJCWdvdG8gZG9uZTsKKworCWVyciA9IGNkZl9zdGF0dXNfdG9fb3NfcmV0dXJuKAorCQkJb2xfdHhyeF9idXNfc3VzcGVuZCgpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwllcnIgPSB3bWFfYnVzX3N1c3BlbmQoKTsKKwlpZiAoZXJyKQorCQlnb3RvIHJlc3VtZV9vbHR4cng7CisKKwllcnIgPSBoaWZfYnVzX3N1c3BlbmQoKTsKKwlpZiAoZXJyKQorCQlnb3RvIHJlc3VtZV93bWE7CisKKwloZGRfaW5mbygic3VzcGVuZCBkb25lLCBzdGF0dXMgPSAlZCIsIGVycik7CisJcmV0dXJuIGVycjsKKworcmVzdW1lX3dtYToKKwlzdGF0dXMgPSB3bWFfYnVzX3Jlc3VtZSgpOworCUNERl9CVUcoIXN0YXR1cyk7CityZXN1bWVfb2x0eHJ4OgorCXN0YXR1cyA9IG9sX3R4cnhfYnVzX3Jlc3VtZSgpOworCUNERl9CVUcoIXN0YXR1cyk7Citkb25lOgorCWhkZF9lcnIoInN1c3BlbmQgZG9uZSwgc3RhdHVzID0gJWQiLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogd2xhbl9oZGRfYnVzX3N1c3BlbmQoKSAtIHN1c3BlbmQgdGhlIHdsYW4gYnVzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHBsYXRmb3JtIGRyaXZlciB0byBzdXNwZW5kIHRoZQorICogd2xhbiBidXMKKyAqCisgKiBAc3RhdGU6IHN0YXRlCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK2ludCB3bGFuX2hkZF9idXNfc3VzcGVuZChwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9idXNfc3VzcGVuZChzdGF0ZSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2J1c19yZXN1bWUoKSAtIGhhbmRsZXMgcGxhdGZvcm0gcmVzdW1lCisgKgorICogRG9lcyBwcmVjb25kdGlvbiB2YWxpZGF0aW9uLiBFbnN1cmVzIHRoYXQgYSBzdWJzeXN0ZW0gcmVzdGFydCBpc24ndCBpbgorICogcHJvZ3Jlc3MuICBFbnN1cmVzIHRoYXQgbm8gbG9hZCBvciB1bmxvYWQgaXMgaW4gcHJvZ3Jlc3MuICBFbnN1cmVzIHRoYXQKKyAqIGl0IGhhcyB2YWxpZCBwb2ludGVycyBmb3IgdGhlIHJlcXVpcmVkIGNvbnRleHRzLgorICogQ2FsbHMgaW50byBoaWYgdG8gcmVzdW1lIHRoZSBidXMgb3BwZXJhdGlvbi4KKyAqIENhbGxzIGludG8gd21hIHRvIGhhbmRzaGFrZSB3aXRoIGZpcm13YXJlIGFuZCBub3RpZnkgaXQgdGhhdCB0aGUgYnVzIGlzIHVwLgorICogQ2FsbHMgaW50byBvbF90eHJ4IGZvciBzeW1ldHJ5LgorICogRmFpbHVyZXMgYXJlIHRyZWF0ZWQgYXMgY2F0YXN0cm9waGljLgorICoKKyAqIHJldHVybjogZXJyb3IgY29kZSBvciAwIGZvciBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9idXNfcmVzdW1lKHZvaWQpCit7CisJdm9pZCAqaGRkX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJaW50IHN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gaGlmX2J1c19yZXN1bWUoKTsKKwlDREZfQlVHKCFzdGF0dXMpOworCisJc3RhdHVzID0gd21hX2J1c19yZXN1bWUoKTsKKwlDREZfQlVHKCFzdGF0dXMpOworCisJc3RhdHVzID0gb2xfdHhyeF9idXNfcmVzdW1lKCk7CisJQ0RGX0JVRyghc3RhdHVzKTsKKworCWhkZF9pbmZvKCJyZXN1bWUgZG9uZSIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogd2xhbl9oZGRfYnVzX3Jlc3VtZSgpOiB3YWtlIHVwIHRoZSBidXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgcGxhdGZvcm0gZHJpdmVyIHRvIHJlc3VtZSB3bGFuCisgKiBidXMKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9idXNfcmVzdW1lKHZvaWQpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9idXNfcmVzdW1lKCk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIEhJRl9QQ0kKKy8qKgorICogd2xhbl9oZGRfcGNpX3Byb2JlKCkgLSBwcm9iZSBjYWxsYmFjayBmb3IgcGNpIHBsYXRmb3JtIGRyaXZlcgorICogQHBkZXY6IGJ1cyBkZXYKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiB3bGFuX2hkZF9wcm9iZSgmcGRldi0+ZGV2LCBwZGV2LCAodm9pZCAqKWlkLAorCQkJSEFMX0JVU19UWVBFX1BDSSwgZmFsc2UpOworfQorCisvKioKKyAqIHdsYW5faGRkX3BjaV9yZW1vdmUoKSAtIHdsYW5faGRkX3BjaV9yZW1vdmUKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXdsYW5faGRkX3JlbW92ZSgpOworfQorCisvKioKKyAqIHdsYW5faGRkX3BjaV9yZWluaXQoKSAtIHdsYW5faGRkX3BjaV9yZWluaXQKKyAqIEBwZGV2OiBidXMgZGV2CisgKiBAaWQ6IGJ1cyBpZAorICoKKyAqIFJldHVybjogaW50CisgKi8KK2ludCB3bGFuX2hkZF9wY2lfcmVpbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gd2xhbl9oZGRfcHJvYmUoJnBkZXYtPmRldiwgcGRldiwgaWQsCisJCQlIQUxfQlVTX1RZUEVfUENJLCB0cnVlKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9wY2lfc2h1dGRvd24oKSAtIHdsYW5faGRkX3BjaV9zaHV0ZG93bgorICogQHBkZXY6IHBkZXYKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF9wY2lfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJd2xhbl9oZGRfc2h1dGRvd24oKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9wY2lfY3Jhc2hfc2h1dGRvd24oKSAtIHdsYW5faGRkX3BjaV9jcmFzaF9zaHV0ZG93bgorICogQHBkZXY6IHBkZXYKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF9wY2lfY3Jhc2hfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJd2xhbl9oZGRfY3Jhc2hfc2h1dGRvd24oKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9wY2lfbm90aWZ5X2hhbmRsZXIoKSAtIHdsYW5faGRkX3BjaV9ub3RpZnlfaGFuZGxlcgorICogQHBkZXY6IHBkZXYKKyAqIEBzdGF0ZTogc3RhdGUKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF9wY2lfbm90aWZ5X2hhbmRsZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBzdGF0ZSkKK3sKKwl3bGFuX2hkZF9ub3RpZnlfaGFuZGxlcihzdGF0ZSk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfcGNpX3N1c3BlbmQoKSAtIHdsYW5faGRkX3BjaV9zdXNwZW5kCisgKiBAcGRldjogcGRldgorICogQHN0YXRlOiBzdGF0ZQorICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgaW50IHdsYW5faGRkX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcmV0dXJuIHdsYW5faGRkX2J1c19zdXNwZW5kKHN0YXRlKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9wY2lfcmVzdW1lKCkgLSB3bGFuX2hkZF9wY2lfcmVzdW1lCisgKiBAcGRldjogcGRldgorICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgaW50IHdsYW5faGRkX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcmV0dXJuIHdsYW5faGRkX2J1c19yZXN1bWUoKTsKK30KKyNlbHNlCisvKioKKyAqIHdsYW5faGRkX3Nub2NfcHJvYmUoKSAtIHdsYW5faGRkX3Nub2NfcHJvYmUKKyAqIEBkZXY6IGRldgorICoKKyAqIFJldHVybjogaW50CisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfc25vY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHdsYW5faGRkX3Byb2JlKGRldiwgTlVMTCwgTlVMTCwgSEFMX0JVU19UWVBFX1NOT0MsIGZhbHNlKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9zbm9jX3JlbW92ZSgpIC0gd2xhbl9oZGRfc25vY19yZW1vdmUKKyAqIEBkZXY6IGRldgorICoKKyAqIFJldHVybjogdm9pZAorICovCit2b2lkIHdsYW5faGRkX3Nub2NfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl3bGFuX2hkZF9yZW1vdmUoKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9zbm9jX3NodXRkb3duKCkgLSB3bGFuX2hkZF9zbm9jX3NodXRkb3duCisgKiBAZGV2OiBkZXYKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF9zbm9jX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl3bGFuX2hkZF9zaHV0ZG93bigpOworfQorCisvKioKKyAqIHdsYW5faGRkX3Nub2NfcmVpbml0KCkgLSB3bGFuX2hkZF9zbm9jX3JlaW5pdAorICogQGRldjogZGV2CisgKgorICogUmV0dXJuOiBpbnQKKyAqLworaW50IHdsYW5faGRkX3Nub2NfcmVpbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gd2xhbl9oZGRfcHJvYmUoZGV2LCBOVUxMLCBOVUxMLCBIQUxfQlVTX1RZUEVfU05PQywgdHJ1ZSk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfc25vY19jcmFzaF9zaHV0ZG93bigpIC0gd2xhbl9oZGRfc25vY19jcmFzaF9zaHV0ZG93bgorICogQGRldjogZGV2CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgd2xhbl9oZGRfc25vY19jcmFzaF9zaHV0ZG93bih2b2lkICpwZGV2KQoreworCXdsYW5faGRkX2NyYXNoX3NodXRkb3duKCk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfc25vY19zdXNwZW5kKCkgLSB3bGFuX2hkZF9zbm9jX3N1c3BlbmQKKyAqIEBkZXY6IGRldgorICogQHN0YXRlOiBzdGF0ZQorICoKKyAqIFJldHVybjogaW50CisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfc25vY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJldHVybiB3bGFuX2hkZF9idXNfc3VzcGVuZChzdGF0ZSk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfc25vY19yZXN1bWUoKSAtIHdsYW5faGRkX3Nub2NfcmVzdW1lCisgKiBAZGV2OiBkZXYKKyAqCisgKiBSZXR1cm46IGludAorICovCitzdGF0aWMgaW50IHdsYW5faGRkX3Nub2NfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gd2xhbl9oZGRfYnVzX3Jlc3VtZSgpOworfQorI2VuZGlmIC8qIEhJRl9QQ0kgKi8KKworI2lmZGVmIEhJRl9QQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3bGFuX2hkZF9wY2lfaWRfdGFibGVbXSA9IHsKKwl7IDB4MTY4YywgMHgwMDNjLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJeyAweDE2OGMsIDB4MDAzZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgMHgxNjhjLCAweDAwNDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IDB4MTY4YywgMHhhYmNkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJeyAweDE2OGMsIDB4NzAyMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgMCB9Cit9OworCisjaWZkZWYgQ09ORklHX0NOU1MKK3N0cnVjdCBjbnNzX3dsYW5fZHJpdmVyIHdsYW5fZHJ2X29wcyA9IHsKKwkubmFtZSAgICAgICA9ICJ3bGFuX2hkZF9wY2kiLAorCS5pZF90YWJsZSAgID0gd2xhbl9oZGRfcGNpX2lkX3RhYmxlLAorCS5wcm9iZSAgICAgID0gd2xhbl9oZGRfcGNpX3Byb2JlLAorCS5yZW1vdmUgICAgID0gd2xhbl9oZGRfcGNpX3JlbW92ZSwKKwkucmVpbml0ICAgICA9IHdsYW5faGRkX3BjaV9yZWluaXQsCisJLnNodXRkb3duICAgPSB3bGFuX2hkZF9wY2lfc2h1dGRvd24sCisJLmNyYXNoX3NodXRkb3duID0gd2xhbl9oZGRfcGNpX2NyYXNoX3NodXRkb3duLAorCS5tb2RlbV9zdGF0dXMgICA9IHdsYW5faGRkX3BjaV9ub3RpZnlfaGFuZGxlciwKKyNpZmRlZiBBVEhfQlVTX1BNCisJLnN1c3BlbmQgICAgPSB3bGFuX2hkZF9wY2lfc3VzcGVuZCwKKwkucmVzdW1lICAgICA9IHdsYW5faGRkX3BjaV9yZXN1bWUsCisjZW5kaWYgLyogQVRIX0JVU19QTSAqLworfTsKKyNlbHNlCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgd2xhbl9oZGRfcGNpX2lkX3RhYmxlKTsKK3N0cnVjdCBwY2lfZHJpdmVyIHdsYW5fZHJ2X29wcyA9IHsKKwkubmFtZSAgICAgICA9ICJ3bGFuX2hkZF9wY2kiLAorCS5pZF90YWJsZSAgID0gd2xhbl9oZGRfcGNpX2lkX3RhYmxlLAorCS5wcm9iZSAgICAgID0gd2xhbl9oZGRfcGNpX3Byb2JlLAorCS5yZW1vdmUgICAgID0gd2xhbl9oZGRfcGNpX3JlbW92ZSwKKyNpZmRlZiBBVEhfQlVTX1BNCisJLnN1c3BlbmQgICAgPSB3bGFuX2hkZF9wY2lfc3VzcGVuZCwKKwkucmVzdW1lICAgICA9IHdsYW5faGRkX3BjaV9yZXN1bWUsCisjZW5kaWYgLyogQVRIX0JVU19QTSAqLworfTsKKyNlbmRpZiAvKiBDT05GSUdfQ05TUyAqLworI2Vsc2UKK3N0cnVjdCBpY25zc19kcml2ZXJfb3BzIHdsYW5fZHJ2X29wcyA9IHsKKwkubmFtZSAgICAgICA9ICJ3bGFuX2hkZF9kcnYiLAorCS5wcm9iZSAgICAgID0gd2xhbl9oZGRfc25vY19wcm9iZSwKKwkucmVtb3ZlICAgICA9IHdsYW5faGRkX3Nub2NfcmVtb3ZlLAorCS5zaHV0ZG93biAgID0gd2xhbl9oZGRfc25vY19zaHV0ZG93biwKKwkucmVpbml0ICAgICA9IHdsYW5faGRkX3Nub2NfcmVpbml0LAorCS5jcmFzaF9zaHV0ZG93biA9IHdsYW5faGRkX3Nub2NfY3Jhc2hfc2h1dGRvd24sCisJLnN1c3BlbmQgICAgPSB3bGFuX2hkZF9zbm9jX3N1c3BlbmQsCisJLnJlc3VtZSAgICAgPSB3bGFuX2hkZF9zbm9jX3Jlc3VtZSwKK307CisjZW5kaWYKKworLyoqCisgKiB3bGFuX2hkZF9yZWdpc3Rlcl9kcml2ZXIoKSAtIHdsYW5faGRkX3JlZ2lzdGVyX2RyaXZlcgorICoKKyAqIFJldHVybjogaW50CisgKi8KK2ludCB3bGFuX2hkZF9yZWdpc3Rlcl9kcml2ZXIodm9pZCkKK3sKKwlyZXR1cm4gV0xBTl9IRERfUkVHSVNURVJfRFJJVkVSKCZ3bGFuX2Rydl9vcHMpOworfQorCisvKioKKyAqIHdsYW5faGRkX3VucmVnaXN0ZXJfZHJpdmVyKCkgLSB3bGFuX2hkZF91bnJlZ2lzdGVyX2RyaXZlcgorICoKKyAqIFJldHVybjogdm9pZAorICovCit2b2lkIHdsYW5faGRkX3VucmVnaXN0ZXJfZHJpdmVyKHZvaWQpCit7CisJV0xBTl9IRERfVU5SRUdJU1RFUl9EUklWRVIoJndsYW5fZHJ2X29wcyk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZXh0X3NjYW4uYyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9leHRfc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Y2Y3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZXh0X3NjYW4uYwpAQCAtMCwwICsxLDQ2MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBET0M6IHdsYW5faGRkX2V4dF9zY2FuLmMKKyAqCisgKiBXTEFOIEhvc3QgRGV2aWNlIERyaXZlciBFWFQgU0NBTiBmZWF0dXJlIGltcGxlbWVudGF0aW9uCisgKgorICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCisjaW5jbHVkZSAid2xhbl9oZGRfZXh0X3NjYW4uaCIKKyNpbmNsdWRlICJjZHNfdXRpbHMuaCIKKyNpbmNsdWRlICJjZHNfc2NoZWQuaCIKKworLyogYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3IgYSBzeW5jaHJvbm91cyByZXF1ZXN0L3Jlc3BvbnNlIG9wZXJhdGlvbiAqLworI2RlZmluZSBXTEFOX1dBSVRfVElNRV9FWFRTQ0FOICAxMDAwCisKKy8qKgorICogc3RydWN0IGhkZF9leHRfc2Nhbl9jb250ZXh0IC0gaGRkIGV4dCBzY2FuIGNvbnRleHQKKyAqIEByZXF1ZXN0X2lkOiB1c2Vyc3BhY2UtYXNzaWduZWQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CisgKiBAcmVzcG9uc2VfZXZlbnQ6IEV4dCBzY2FuIHdhaXQgZXZlbnQKKyAqIEByZXNwb25zZV9zdGF0dXM6IFN0YXR1cyByZXR1cm5lZCBieSBGVyBpbiByZXNwb25zZSB0byBhIHJlcXVlc3QKKyAqIEBpZ25vcmVfY2FjaGVkX3Jlc3VsdHM6IEZsYWcgdG8gaWdub3JlIGNhY2hlZCByZXN1bHRzIG9yIG5vdAorICogQGNvbnRleHRfbG9jazogU3BpbmxvY2sgdG8gc2VyaWFsaXplIGFsbCBjb250ZXh0IGFjY2Vzc2VzCisgKiBAY2FwYWJpbGl0eV9yZXNwb25zZTogRXh0IHNjYW4gY2FwYWJpbGl0eSByZXNwb25zZSBkYXRhIGZyb20gdGFyZ2V0CisgKi8KK3N0cnVjdCBoZGRfZXh0X3NjYW5fY29udGV4dCB7CisJdWludDMyX3QgcmVxdWVzdF9pZDsKKwlpbnQgcmVzcG9uc2Vfc3RhdHVzOworCWJvb2wgaWdub3JlX2NhY2hlZF9yZXN1bHRzOworCXN0cnVjdCBjb21wbGV0aW9uIHJlc3BvbnNlX2V2ZW50OworCXNwaW5sb2NrX3QgY29udGV4dF9sb2NrOworCXN0cnVjdCBleHRfc2Nhbl9jYXBhYmlsaXRpZXNfcmVzcG9uc2UgY2FwYWJpbGl0eV9yZXNwb25zZTsKK307CitzdGF0aWMgc3RydWN0IGhkZF9leHRfc2Nhbl9jb250ZXh0IGV4dF9zY2FuX2NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSB3bGFuX2hkZF9leHRzY2FuX2NvbmZpZ19wb2xpY3kKK1tRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fTUFYICsgMV0gPSB7CisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9SRVFVRVNUX0lEXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0dFVF9WQUxJRF9DSEFOTkVMU19DT05GSUdfUEFSQU1fV0lGSV9CQU5EXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NIQU5ORUxfU1BFQ19DSEFOTkVMXSA9IHsudHlwZSA9IE5MQV9VMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NIQU5ORUxfU1BFQ19EV0VMTF9USU1FXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NIQU5ORUxfU1BFQ19QQVNTSVZFXSA9IHsudHlwZSA9IE5MQV9VOH0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQ0hBTk5FTF9TUEVDX0NMQVNTXSA9IHsudHlwZSA9IE5MQV9VOH0sCisKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19JTkRFWF0gPSB7LnR5cGUgPSBOTEFfVTh9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDX0JBTkRdID0gey50eXBlID0gTkxBX1U4fSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19QRVJJT0RdID0gey50eXBlID0gTkxBX1UzMn0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfUkVQT1JUX0VWRU5UU10gPSB7CisJCQkJLnR5cGUgPSBOTEFfVTh9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDX05VTV9DSEFOTkVMX1NQRUNTXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NDQU5fQ01EX1BBUkFNU19CQVNFX1BFUklPRF0gPSB7CisJCQkJLnR5cGUgPSBOTEFfVTMyfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TQ0FOX0NNRF9QQVJBTVNfTUFYX0FQX1BFUl9TQ0FOXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NDQU5fQ01EX1BBUkFNU19SRVBPUlRfVEhSRVNIT0xEX1BFUkNFTlRdID0geworCQkJCS50eXBlID0gTkxBX1U4fSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TQ0FOX0NNRF9QQVJBTVNfUkVQT1JUX1RIUkVTSE9MRF9OVU1fU0NBTlNdID0geworCQkJCS50eXBlID0gTkxBX1U4IH0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0NBTl9DTURfUEFSQU1TX05VTV9CVUNLRVRTXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VOH0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fR0VUX0NBQ0hFRF9TQ0FOX1JFU1VMVFNfQ09ORklHX1BBUkFNX0ZMVVNIXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VOH0sCisKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9HRVRfQ0FDSEVEX1NDQU5fUkVTVUxUU19DT05GSUdfUEFSQU1fTUFYXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0FQX1RIUkVTSE9MRF9QQVJBTV9CU1NJRF0gPSB7CisJCQkJLnR5cGUgPSBOTEFfVU5TUEVDfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9BUF9USFJFU0hPTERfUEFSQU1fUlNTSV9MT1ddID0geworCQkJCS50eXBlID0gTkxBX1MzMn0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNX1JTU0lfSElHSF0gPSB7CisJCQkJLnR5cGUgPSBOTEFfUzMyfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9BUF9USFJFU0hPTERfUEFSQU1fQ0hBTk5FTF0gPSB7CisJCQkJLnR5cGUgPSBOTEFfVTMyfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CU1NJRF9IT1RMSVNUX1BBUkFNU19OVU1fQVBdID0geworCQkJCS50eXBlID0gTkxBX1UzMn0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0lHTklGSUNBTlRfQ0hBTkdFX1BBUkFNU19SU1NJX1NBTVBMRV9TSVpFXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRV9QQVJBTVNfTE9TVF9BUF9TQU1QTEVfU0laRV0gPSB7CisJCQkJLnR5cGUgPSBOTEFfVTMyfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0VfUEFSQU1TX01JTl9CUkVBQ0hJTkddID0geworCQkJCS50eXBlID0gTkxBX1UzMn0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0lHTklGSUNBTlRfQ0hBTkdFX1BBUkFNU19OVU1fQVBdID0geworCQkJCS50eXBlID0gTkxBX1UzMn0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19TRVRfTElTVF9QQVJBTV9OVU1fTkVUV09SS1NdID0geworCQkJCS50eXBlID0gTkxBX1UzMiB9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX1NTSURdID0geworCQkJCS50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkubGVuID0gSUVFRTgwMjExX01BWF9TU0lEX0xFTiB9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX1JTU0lfVEhSRVNIT0xEXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9TOCB9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX0ZMQUdTXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VOCB9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX0FVVEhfQklUXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VOCB9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NTSURfVEhSRVNIT0xEX1BBUkFNX1NTSURdID0geworCQkJCS50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkubGVuID0gSUVFRTgwMjExX01BWF9TU0lEX0xFTiArIDEgfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TU0lEX0hPVExJU1RfUEFSQU1TX0xPU1RfU1NJRF9TQU1QTEVfU0laRV0gPSB7CisJCQkJLnR5cGUgPSBOTEFfVTMyIH0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1NJRF9IT1RMSVNUX1BBUkFNU19OVU1fU1NJRF0gPSB7CisJCQkJLnR5cGUgPSBOTEFfVTMyIH0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1NJRF9USFJFU0hPTERfUEFSQU1fQkFORF0gPSB7CisJCQkJLnR5cGUgPSBOTEFfVTggfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TU0lEX1RIUkVTSE9MRF9QQVJBTV9SU1NJX0xPV10gPSB7CisJCQkJLnR5cGUgPSBOTEFfUzMyIH0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1NJRF9USFJFU0hPTERfUEFSQU1fUlNTSV9ISUdIXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9TMzIgfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DT05GSUdVUkFUSU9OX0ZMQUdTXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VMzIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeQord2xhbl9oZGRfZXh0c2Nhbl9yZXN1bHRzX3BvbGljeVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfTUFYICsgMV0gPSB7CisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9CRUFDT05fUEVSSU9EXSA9IHsKKwkJCQkudHlwZSA9IE5MQV9VMTZ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfQ0FQQUJJTElUWV0gPSB7CisJCQkJLnR5cGUgPSBOTEFfVTE2fSwKK307CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZXRfY2FwYWJpbGl0aWVzX3JzcCgpIC0gcmVzcG9uc2UgZnJvbSB0YXJnZXQKKyAqIEBjdHg6IFBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGV4dCBzY2FuIGNhcGFiaWxpdGllcyByZXNwb25zZSBmcm9tIGZ3CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCit3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2dldF9jYXBhYmlsaXRpZXNfcnNwKHZvaWQgKmN0eCwKKwlzdHJ1Y3QgZXh0X3NjYW5fY2FwYWJpbGl0aWVzX3Jlc3BvbnNlICpkYXRhKQoreworCXN0cnVjdCBoZGRfZXh0X3NjYW5fY29udGV4dCAqY29udGV4dDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ICA9IGN0eDsKKworCUVOVEVSKCk7CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KSB8fCAhZGF0YSkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIGludmFsaWQgb3IgZGF0YSglcCkgaXMgbnVsbCIpLAorCQkJZGF0YSk7CisJCXJldHVybjsKKwl9CisKKwljb250ZXh0ID0gJmV4dF9zY2FuX2NvbnRleHQ7CisKKwlzcGluX2xvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisJLyogdmFsaWRhdGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSB0YXJnZXQqLworCWlmIChjb250ZXh0LT5yZXF1ZXN0X2lkICE9IGRhdGEtPnJlcXVlc3RJZCkgeworCQlzcGluX3VubG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiVGFyZ2V0IHJlc3BvbnNlIGlkIGRpZCBub3QgbWF0Y2g6IHJlcXVlc3RfaWQgJWQgcmVzcG9uc2VfaWQgJWQiKSwKKwkJCWNvbnRleHQtPnJlcXVlc3RfaWQsIGRhdGEtPnJlcXVlc3RJZCk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQljb250ZXh0LT5jYXBhYmlsaXR5X3Jlc3BvbnNlID0gKmRhdGE7CisJCWNvbXBsZXRlKCZjb250ZXh0LT5yZXNwb25zZV9ldmVudCk7CisJfQorCisJc3Bpbl91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBkZWZpbmUgc2hvcnQgbmFtZXMgZm9yIHRoZSBnbG9iYWwgdmVuZG9yIHBhcmFtcworICogdXNlZCBieSBoZGRfZXh0c2Nhbl9ubF9maWxsX2JzcygpCisgKi8KKyNkZWZpbmUgUEFSQU1fVElNRV9TVEFNUCBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX1RJTUVfU1RBTVAKKyNkZWZpbmUgUEFSQU1fU1NJRCBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX1NTSUQKKyNkZWZpbmUgUEFSQU1fQlNTSUQgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9CU1NJRAorI2RlZmluZSBQQVJBTV9DSEFOTkVMIFwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfQ0hBTk5FTAorI2RlZmluZSBQQVJBTV9SU1NJIFwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfUlNTSQorI2RlZmluZSBQQVJBTV9SVFQgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9SVFQKKyNkZWZpbmUgUEFSQU1fUlRUX1NEIFwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfUlRUX1NECisjZGVmaW5lIFBBUkFNX0JFQUNPTl9QRVJJT0QgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9CRUFDT05fUEVSSU9ECisjZGVmaW5lIFBBUkFNX0NBUEFCSUxJVFkgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9DQVBBQklMSVRZCisjZGVmaW5lIFBBUkFNX0lFX0xFTkdUSCBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX0lFX0xFTkdUSAorI2RlZmluZSBQQVJBTV9JRV9EQVRBIFwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfSUVfREFUQQorCisvKiogaGRkX2V4dHNjYW5fbmxfZmlsbF9ic3MoKSAtIGV4dHNjYW4gbmwgZmlsbCBic3MKKyAqIEBza2I6IHNvY2tldCBidWZmZXIKKyAqIEBhcDogYnNzIGluZm9ybWF0aW9uCisgKiBAaWR4OiBuZXN0aW5nIGluZGV4CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBoZGRfZXh0c2Nhbl9ubF9maWxsX2JzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB0U2lyV2lmaVNjYW5SZXN1bHQgKmFwLAorCQkJCQlpbnQgaWR4KQoreworCXN0cnVjdCBubGF0dHIgKm5sYV9hcDsKKworCW5sYV9hcCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgaWR4KTsKKwlpZiAoIW5sYV9hcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobmxhX3B1dF91NjQoc2tiLCBQQVJBTV9USU1FX1NUQU1QLCBhcC0+dHMpIHx8CisJICAgIG5sYV9wdXQoc2tiLCBQQVJBTV9TU0lELCBzaXplb2YoYXAtPnNzaWQpLCBhcC0+c3NpZCkgfHwKKwkgICAgbmxhX3B1dChza2IsIFBBUkFNX0JTU0lELCBzaXplb2YoYXAtPmJzc2lkKSwgYXAtPmJzc2lkLmJ5dGVzKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIFBBUkFNX0NIQU5ORUwsIGFwLT5jaGFubmVsKSB8fAorCSAgICBubGFfcHV0X3MzMihza2IsIFBBUkFNX1JTU0ksIGFwLT5yc3NpKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIFBBUkFNX1JUVCwgYXAtPnJ0dCkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBQQVJBTV9SVFRfU0QsIGFwLT5ydHRfc2QpIHx8CisJICAgIG5sYV9wdXRfdTE2KHNrYiwgUEFSQU1fQkVBQ09OX1BFUklPRCwgYXAtPmJlYWNvblBlcmlvZCkgfHwKKwkgICAgbmxhX3B1dF91MTYoc2tiLCBQQVJBTV9DQVBBQklMSVRZLCBhcC0+Y2FwYWJpbGl0eSkgfHwKKwkgICAgbmxhX3B1dF91MTYoc2tiLCBQQVJBTV9JRV9MRU5HVEgsIGFwLT5pZUxlbmd0aCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwdXQgZmFpbCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFwLT5pZUxlbmd0aCkKKwkJaWYgKG5sYV9wdXQoc2tiLCBQQVJBTV9JRV9EQVRBLCBhcC0+aWVMZW5ndGgsIGFwLT5pZURhdGEpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoInB1dCBmYWlsIikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCW5sYV9uZXN0X2VuZChza2IsIG5sYV9hcCk7CisKKwlyZXR1cm4gMDsKK30KKy8qCisgKiBkb25lIHdpdGggc2hvcnQgbmFtZXMgZm9yIHRoZSBnbG9iYWwgdmVuZG9yIHBhcmFtcworICogdXNlZCBieSBoZGRfZXh0c2Nhbl9ubF9maWxsX2JzcygpCisgKi8KKyN1bmRlZiBQQVJBTV9USU1FX1NUQU1QCisjdW5kZWYgUEFSQU1fU1NJRAorI3VuZGVmIFBBUkFNX0JTU0lECisjdW5kZWYgUEFSQU1fQ0hBTk5FTAorI3VuZGVmIFBBUkFNX1JTU0kKKyN1bmRlZiBQQVJBTV9SVFQKKyN1bmRlZiBQQVJBTV9SVFRfU0QKKyN1bmRlZiBQQVJBTV9CRUFDT05fUEVSSU9ECisjdW5kZWYgUEFSQU1fQ0FQQUJJTElUWQorI3VuZGVmIFBBUkFNX0lFX0xFTkdUSAorI3VuZGVmIFBBUkFNX0lFX0RBVEEKKworLyoqIHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fY2FjaGVkX3Jlc3VsdHNfaW5kKCkgLSBnZXQgY2FjaGVkIHJlc3VsdHMKKyAqIEBjdHg6IGhkZCBnbG9iYWwgY29udGV4dAorICogQGRhdGE6IGNhY2hlZCByZXN1bHRzCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgY2FjaGVkIHJlc3VsdHMgJWRhdGEsIHBvcHVsYXRlZCB0aGUgTkwKKyAqIGF0dHJpYnV0ZXMgYW5kIHNlbmRzIHRoZSBOTCBldmVudCB0byB0aGUgdXBwZXIgbGF5ZXIuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCit3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2luZCh2b2lkICpjdHgsCisJCQkJc3RydWN0IGV4dHNjYW5fY2FjaGVkX3NjYW5fcmVzdWx0cyAqZGF0YSkKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gY3R4OworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBoZGRfZXh0X3NjYW5fY29udGV4dCAqY29udGV4dDsKKwlzdHJ1Y3QgZXh0c2Nhbl9jYWNoZWRfc2Nhbl9yZXN1bHQgKnJlc3VsdDsKKwl0U2lyV2lmaVNjYW5SZXN1bHQgKmFwOworCXVpbnQzMl90IGksIGosIG5sX2J1Zl9sZW47CisJYm9vbCBpZ25vcmVfY2FjaGVkX3Jlc3VsdHMgPSBmYWxzZTsKKworCUVOVEVSKCk7CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KSB8fCAhZGF0YSkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjdHggaW52YWxpZCBvciBkYXRhKCVwKSBpcyBudWxsIiksIGRhdGEpOworCQlyZXR1cm47CisJfQorCisJY29udGV4dCA9ICZleHRfc2Nhbl9jb250ZXh0OworCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwlpZ25vcmVfY2FjaGVkX3Jlc3VsdHMgPSBjb250ZXh0LT5pZ25vcmVfY2FjaGVkX3Jlc3VsdHM7CisJc3Bpbl91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisKKwlpZiAoaWdub3JlX2NhY2hlZF9yZXN1bHRzKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoIklnbm9yZSB0aGUgY2FjaGVkIHJlc3VsdHMgcmVjZWl2ZWQgYWZ0ZXIgdGltZW91dCIpKTsKKwkJcmV0dXJuOworCX0KKworI2RlZmluZSBFWFRTQ0FOX0NBQ0hFRF9ORVNUX0hEUkxFTiBOTEFfSERSTEVOCisjZGVmaW5lIEVYVFNDQU5fQ0FDSEVEX05MX0ZJWEVEX1RMViBcCisJCSgoc2l6ZW9mKGRhdGEtPnJlcXVlc3RfaWQpICsgTkxBX0hEUkxFTikgKyBcCisJCShzaXplb2YoZGF0YS0+bnVtX3NjYW5faWRzKSArIE5MQV9IRFJMRU4pICsgXAorCQkoc2l6ZW9mKGRhdGEtPm1vcmVfZGF0YSkgKyBOTEFfSERSTEVOKSkKKyNkZWZpbmUgRVhUU0NBTl9DQUNIRURfTkxfU0NBTl9JRF9UTFYgXAorCQkoKHNpemVvZihyZXN1bHQtPnNjYW5faWQpICsgTkxBX0hEUkxFTikgKyBcCisJCShzaXplb2YocmVzdWx0LT5mbGFncykgKyBOTEFfSERSTEVOKSArIFwKKwkJKHNpemVvZihyZXN1bHQtPm51bV9yZXN1bHRzKSArIE5MQV9IRFJMRU4pKQorI2RlZmluZSBFWFRTQ0FOX0NBQ0hFRF9OTF9TQ0FOX1JFU1VMVFNfVExWIFwKKwkJKChzaXplb2YoYXAtPnRzKSArIE5MQV9IRFJMRU4pICsgXAorCQkoc2l6ZW9mKGFwLT5zc2lkKSArIE5MQV9IRFJMRU4pICsgXAorCQkoc2l6ZW9mKGFwLT5ic3NpZCkgKyBOTEFfSERSTEVOKSArIFwKKwkJKHNpemVvZihhcC0+Y2hhbm5lbCkgKyBOTEFfSERSTEVOKSArIFwKKwkJKHNpemVvZihhcC0+cnNzaSkgKyBOTEFfSERSTEVOKSArIFwKKwkJKHNpemVvZihhcC0+cnR0KSArIE5MQV9IRFJMRU4pICsgXAorCQkoc2l6ZW9mKGFwLT5ydHRfc2QpICsgTkxBX0hEUkxFTikgKyBcCisJCShzaXplb2YoYXAtPmJlYWNvblBlcmlvZCkgKyBOTEFfSERSTEVOKSArIFwKKwkJKHNpemVvZihhcC0+Y2FwYWJpbGl0eSkgKyBOTEFfSERSTEVOKSArIFwKKwkJKHNpemVvZihhcC0+aWVMZW5ndGgpICsgTkxBX0hEUkxFTikpCisjZGVmaW5lIEVYVFNDQU5fQ0FDSEVEX05MX1NDQU5fUkVTVUxUU19JRV9EQVRBX1RMViBcCisJCShhcC0+aWVMZW5ndGggKyBOTEFfSERSTEVOKQorCisJbmxfYnVmX2xlbiA9IE5MTVNHX0hEUkxFTjsKKwlubF9idWZfbGVuICs9IEVYVFNDQU5fQ0FDSEVEX05MX0ZJWEVEX1RMVjsKKwlpZiAoZGF0YS0+bnVtX3NjYW5faWRzKSB7CisJCW5sX2J1Zl9sZW4gKz0gc2l6ZW9mKHJlc3VsdC0+c2Nhbl9pZCkgKyBOTEFfSERSTEVOOworCQlubF9idWZfbGVuICs9IEVYVFNDQU5fQ0FDSEVEX05FU1RfSERSTEVOOworCQlyZXN1bHQgPSAmZGF0YS0+cmVzdWx0WzBdOworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnVtX3NjYW5faWRzOyBpKyspIHsKKwkJCW5sX2J1Zl9sZW4gKz0gRVhUU0NBTl9DQUNIRURfTkVTVF9IRFJMRU47CisJCQlubF9idWZfbGVuICs9IEVYVFNDQU5fQ0FDSEVEX05MX1NDQU5fSURfVExWOworCQkJbmxfYnVmX2xlbiArPSBFWFRTQ0FOX0NBQ0hFRF9ORVNUX0hEUkxFTjsKKworCQkJYXAgPSAmcmVzdWx0LT5hcFswXTsKKwkJCWZvciAoaiA9IDA7IGogPCByZXN1bHQtPm51bV9yZXN1bHRzOyBqKyspIHsKKwkJCQlubF9idWZfbGVuICs9IEVYVFNDQU5fQ0FDSEVEX05FU1RfSERSTEVOOworCQkJCW5sX2J1Zl9sZW4gKz0KKwkJCQkJRVhUU0NBTl9DQUNIRURfTkxfU0NBTl9SRVNVTFRTX1RMVjsKKwkJCQlpZiAoYXAtPmllTGVuZ3RoKQorCQkJCQlubF9idWZfbGVuICs9CisJCQkJCUVYVFNDQU5fQ0FDSEVEX05MX1NDQU5fUkVTVUxUU19JRV9EQVRBX1RMVjsKKwkJCQlhcCsrOworCQkJfQorCQkJcmVzdWx0Kys7CisJCX0KKwl9CisKKwloZGRMb2coTE9HMSwgRkwoIm5sX2J1Zl9sZW4gPSAldSIpLCBubF9idWZfbGVuKTsKKwlza2IgPSBjZmc4MDIxMV92ZW5kb3JfY21kX2FsbG9jX3JlcGx5X3NrYihwSGRkQ3R4LT53aXBoeSwgbmxfYnVmX2xlbik7CisKKwlpZiAoIXNrYikgeworCQloZGRMb2coTE9HRSwgRkwoImNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKwloZGRMb2coTE9HMSwgIlJlcSBJZCAldSBOdW1fc2Nhbl9pZHMgJXUgTW9yZSBEYXRhICV1IiwKKwkJZGF0YS0+cmVxdWVzdF9pZCwgZGF0YS0+bnVtX3NjYW5faWRzLCBkYXRhLT5tb3JlX2RhdGEpOworCisJcmVzdWx0ID0gJmRhdGEtPnJlc3VsdFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnVtX3NjYW5faWRzOyBpKyspIHsKKwkJaGRkTG9nKExPRzEsICJbaT0lZF0gc2Nhbl9pZCAldSBmbGFncyAldSBudW1fcmVzdWx0cyAldSIsCisJCQlpLCByZXN1bHQtPnNjYW5faWQsIHJlc3VsdC0+ZmxhZ3MsIHJlc3VsdC0+bnVtX3Jlc3VsdHMpOworCisJCWFwID0gJnJlc3VsdC0+YXBbMF07CisJCWZvciAoaiA9IDA7IGogPCByZXN1bHQtPm51bV9yZXN1bHRzOyBqKyspIHsKKwkJCS8qCisJCQkgKiBGaXJtd2FyZSByZXR1cm5zIHRpbWVzdGFtcCBmcm9tIGV4dCBzY2FuIHN0YXJ0IHRpbGwKKwkJCSAqIEJTU0lEIHdhcyBjYWNoZWQgKGluIG1pY3JvIHNlY29uZHMpLiBBZGQgdGhpcyB3aXRoCisJCQkgKiB0aW1lIGdhcCBiZXR3ZWVuIHN5c3RlbSBib290IHVwIHRvIGV4dCBzY2FuIHN0YXJ0CisJCQkgKiB0byBkZXJpdmUgdGhlIHRpbWUgc2luY2UgYm9vdCB3aGVuIHRoZQorCQkJICogQlNTSUQgd2FzIGNhY2hlZC4KKwkJCSAqLworCQkJYXAtPnRzICs9IHBIZGRDdHgtPmV4dF9zY2FuX3N0YXJ0X3NpbmNlX2Jvb3Q7CisJCQloZGRMb2coTE9HMSwgIlRpbWVzdGFtcCAlbGx1ICIKKwkJCQkiU3NpZDogJXMgIgorCQkJCSJCc3NpZCAoIiBNQUNfQUREUkVTU19TVFIgIikgIgorCQkJCSJDaGFubmVsICV1ICIKKwkJCQkiUnNzaSAlZCAiCisJCQkJIlJUVCAldSAiCisJCQkJIlJUVF9TRCAldSAiCisJCQkJIkJlYWNvbiBQZXJpb2QgJXUgIgorCQkJCSJDYXBhYmlsaXR5IDB4JXggIgorCQkJCSJJZSBsZW5ndGggJWQiLAorCQkJCWFwLT50cywKKwkJCQlhcC0+c3NpZCwKKwkJCQlNQUNfQUREUl9BUlJBWShhcC0+YnNzaWQuYnl0ZXMpLAorCQkJCWFwLT5jaGFubmVsLAorCQkJCWFwLT5yc3NpLAorCQkJCWFwLT5ydHQsCisJCQkJYXAtPnJ0dF9zZCwKKwkJCQlhcC0+YmVhY29uUGVyaW9kLAorCQkJCWFwLT5jYXBhYmlsaXR5LAorCQkJCWFwLT5pZUxlbmd0aCk7CisJCQlhcCsrOworCQl9CisJCXJlc3VsdCsrOworCX0KKworCWlmIChubGFfcHV0X3UzMihza2IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19SRVFVRVNUX0lELAorCQlkYXRhLT5yZXF1ZXN0X2lkKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fTlVNX1JFU1VMVFNfQVZBSUxBQkxFLAorCQlkYXRhLT5udW1fc2Nhbl9pZHMpIHx8CisJICAgIG5sYV9wdXRfdTgoc2tiLAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfTU9SRV9EQVRBLAorCQlkYXRhLT5tb3JlX2RhdGEpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgicHV0IGZhaWwiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoZGF0YS0+bnVtX3NjYW5faWRzKSB7CisJCXN0cnVjdCBubGF0dHIgKm5sYV9yZXN1bHRzOworCQlyZXN1bHQgPSAmZGF0YS0+cmVzdWx0WzBdOworCisJCWlmIChubGFfcHV0X3UzMihza2IsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX1NDQU5fSUQsCisJCQlyZXN1bHQtPnNjYW5faWQpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoInB1dCBmYWlsIikpOworCQkJZ290byBmYWlsOworCQl9CisJCW5sYV9yZXN1bHRzID0gbmxhX25lc3Rfc3RhcnQoc2tiLAorCQkJICAgICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19MSVNUKTsKKwkJaWYgKCFubGFfcmVzdWx0cykKKwkJCWdvdG8gZmFpbDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnVtX3NjYW5faWRzOyBpKyspIHsKKwkJCXN0cnVjdCBubGF0dHIgKm5sYV9yZXN1bHQ7CisJCQlzdHJ1Y3QgbmxhdHRyICpubGFfYXBzOworCisJCQlubGFfcmVzdWx0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBpKTsKKwkJCWlmICghbmxhX3Jlc3VsdCkKKwkJCQlnb3RvIGZhaWw7CisKKwkJCWlmIChubGFfcHV0X3UzMihza2IsCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19TQ0FOX0lELAorCQkJCXJlc3VsdC0+c2Nhbl9pZCkgfHwKKwkJCSAgICBubGFfcHV0X3UzMihza2IsCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19GTEFHUywKKwkJCQlyZXN1bHQtPmZsYWdzKSB8fAorCQkJICAgIG5sYV9wdXRfdTMyKHNrYiwKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX05VTV9SRVNVTFRTX0FWQUlMQUJMRSwKKwkJCQlyZXN1bHQtPm51bV9yZXN1bHRzKSkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgicHV0IGZhaWwiKSk7CisJCQkJZ290byBmYWlsOworCQkJfQorCisJCQlubGFfYXBzID0gbmxhX25lc3Rfc3RhcnQoc2tiLAorCQkJCSAgICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0xJU1QpOworCQkJaWYgKCFubGFfYXBzKQorCQkJCWdvdG8gZmFpbDsKKworCQkJYXAgPSAmcmVzdWx0LT5hcFswXTsKKwkJCWZvciAoaiA9IDA7IGogPCByZXN1bHQtPm51bV9yZXN1bHRzOyBqKyspIHsKKwkJCQlpZiAoaGRkX2V4dHNjYW5fbmxfZmlsbF9ic3Moc2tiLCBhcCwgaikpCisJCQkJCWdvdG8gZmFpbDsKKworCQkJCWFwKys7CisJCQl9CisJCQlubGFfbmVzdF9lbmQoc2tiLCBubGFfYXBzKTsKKwkJCW5sYV9uZXN0X2VuZChza2IsIG5sYV9yZXN1bHQpOworCQkJcmVzdWx0Kys7CisJCX0KKwkJbmxhX25lc3RfZW5kKHNrYiwgbmxhX3Jlc3VsdHMpOworCX0KKworCWNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkoc2tiKTsKKworCWlmICghZGF0YS0+bW9yZV9kYXRhKSB7CisJCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwkJY29udGV4dC0+cmVzcG9uc2Vfc3RhdHVzID0gMDsKKwkJY29tcGxldGUoJmNvbnRleHQtPnJlc3BvbnNlX2V2ZW50KTsKKwkJc3Bpbl91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisJfQorCXJldHVybjsKKworZmFpbDoKKwlpZiAoc2tiKQorCQlrZnJlZV9za2Ioc2tiKTsKKworCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwljb250ZXh0LT5yZXNwb25zZV9zdGF0dXMgPSAtRUlOVkFMOworCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJcmV0dXJuOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5faG90bGlzdF9tYXRjaF9pbmQoKSAtIGhvdCBsaXN0IG1hdGNoIGluZAorICogQGN0eDogUG9pbnRlciB0byBoZGQgY29udGV4dAorICogQHBEYXRhOiBQb2ludGVyIHRvIGV4dCBzY2FuIHJlc3VsdCBldmVudAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAord2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9ob3RsaXN0X21hdGNoX2luZCh2b2lkICpjdHgsCisJCQkJCSAgICBzdHJ1Y3QgZXh0c2Nhbl9ob3RsaXN0X21hdGNoICpkYXRhKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBjdHg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdWludDMyX3QgaSwgaW5kZXg7CisKKwlFTlRFUigpOworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkgfHwgIWRhdGEpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY3R4IGludmFsaWQgb3IgZGF0YSglcCkgaXMgbnVsbCIpLCBkYXRhKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkYXRhLT5hcF9mb3VuZCkKKwkJaW5kZXggPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9BUF9GT1VORF9JTkRFWDsKKwllbHNlCisJCWluZGV4ID0gUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX0hPVExJU1RfQVBfTE9TVF9JTkRFWDsKKworCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYygKKwkJICBwSGRkQ3R4LT53aXBoeSwKKwkJICBOVUxMLAorCQkgIEVYVFNDQU5fRVZFTlRfQlVGX1NJWkUgKyBOTE1TR19IRFJMRU4sCisJCSAgaW5kZXgsIEdGUF9LRVJORUwpOworCisJaWYgKCFza2IpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCWhkZF9pbmZvKCJSZXEgSWQ6ICV1IE51bV9BUHM6ICV1IE1vcmVEYXRhOiAldSBhcF9mb3VuZDogJXUiLAorCQkJZGF0YS0+cmVxdWVzdElkLCBkYXRhLT5udW1PZkFwcywgZGF0YS0+bW9yZURhdGEsCisJCQlkYXRhLT5hcF9mb3VuZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnVtT2ZBcHM7IGkrKykgeworCQlkYXRhLT5hcFtpXS50cyA9IGNkZl9nZXRfbW9ub3RvbmljX2Jvb3R0aW1lKCk7CisKKwkJaGRkTG9nKExPRzEsICJbaT0lZF0gVGltZXN0YW1wICVsbHUgIgorCQkgICAgICAgIlNzaWQ6ICVzICIKKwkJICAgICAgICJCc3NpZCAoIiBNQUNfQUREUkVTU19TVFIgIikgIgorCQkgICAgICAgIkNoYW5uZWwgJXUgIgorCQkgICAgICAgIlJzc2kgJWQgIgorCQkgICAgICAgIlJUVCAldSAiCisJCSAgICAgICAiUlRUX1NEICV1IiwKKwkJICAgICAgIGksCisJCSAgICAgICBkYXRhLT5hcFtpXS50cywKKwkJICAgICAgIGRhdGEtPmFwW2ldLnNzaWQsCisJCSAgICAgICBNQUNfQUREUl9BUlJBWShkYXRhLT5hcFtpXS5ic3NpZC5ieXRlcyksCisJCSAgICAgICBkYXRhLT5hcFtpXS5jaGFubmVsLAorCQkgICAgICAgZGF0YS0+YXBbaV0ucnNzaSwKKwkJICAgICAgIGRhdGEtPmFwW2ldLnJ0dCwgZGF0YS0+YXBbaV0ucnR0X3NkKTsKKwl9CisKKwlpZiAobmxhX3B1dF91MzIoc2tiLAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfUkVRVUVTVF9JRCwKKwkJZGF0YS0+cmVxdWVzdElkKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fTlVNX1JFU1VMVFNfQVZBSUxBQkxFLAorCQlkYXRhLT5udW1PZkFwcykpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwdXQgZmFpbCIpKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChkYXRhLT5udW1PZkFwcykgeworCQlzdHJ1Y3QgbmxhdHRyICphcHM7CisKKwkJYXBzID0gbmxhX25lc3Rfc3RhcnQoc2tiLAorCQkJICAgICAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19MSVNUKTsKKwkJaWYgKCFhcHMpCisJCQlnb3RvIGZhaWw7CisKKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bU9mQXBzOyBpKyspIHsKKwkJCXN0cnVjdCBubGF0dHIgKmFwOworCisJCQlhcCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgaSk7CisJCQlpZiAoIWFwKQorCQkJCWdvdG8gZmFpbDsKKworCQkJaWYgKG5sYV9wdXRfdTY0KHNrYiwKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfVElNRV9TVEFNUCwKKwkJCQlkYXRhLT5hcFtpXS50cykgfHwKKwkJCSAgICBubGFfcHV0KHNrYiwKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfU1NJRCwKKwkJCQlzaXplb2YoZGF0YS0+YXBbaV0uc3NpZCksCisJCQkJZGF0YS0+YXBbaV0uc3NpZCkgfHwKKwkJCSAgICBubGFfcHV0KHNrYiwKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfQlNTSUQsCisJCQkJc2l6ZW9mKGRhdGEtPmFwW2ldLmJzc2lkKSwKKwkJCQlkYXRhLT5hcFtpXS5ic3NpZC5ieXRlcykgfHwKKwkJCSAgICBubGFfcHV0X3UzMihza2IsCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX0NIQU5ORUwsCisJCQkJZGF0YS0+YXBbaV0uY2hhbm5lbCkgfHwKKwkJCSAgICBubGFfcHV0X3MzMihza2IsCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX1JTU0ksCisJCQkJZGF0YS0+YXBbaV0ucnNzaSkgfHwKKwkJCSAgICBubGFfcHV0X3UzMihza2IsCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX1JUVCwKKwkJCQlkYXRhLT5hcFtpXS5ydHQpIHx8CisJCQkgICAgbmxhX3B1dF91MzIoc2tiLAorCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9SVFRfU0QsCisJCQkJZGF0YS0+YXBbaV0ucnR0X3NkKSkKKwkJCQlnb3RvIGZhaWw7CisKKwkJCW5sYV9uZXN0X2VuZChza2IsIGFwKTsKKwkJfQorCQlubGFfbmVzdF9lbmQoc2tiLCBhcHMpOworCisJCWlmIChubGFfcHV0X3U4KHNrYiwKKwkJICAgICAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9NT1JFX0RBVEEsCisJCSAgICAgICBkYXRhLT5tb3JlRGF0YSkpCisJCQlnb3RvIGZhaWw7CisJfQorCisJY2ZnODAyMTFfdmVuZG9yX2V2ZW50KHNrYiwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuOworCitmYWlsOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybjsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NpZ25pZl93aWZpX2NoYW5nZV9yZXN1bHRzX2luZCgpIC0KKyAqCXNpZ25pZmljYW50IHdpZmkgY2hhbmdlIHJlc3VsdHMgaW5kaWNhdGlvbgorICogQGN0eDogUG9pbnRlciB0byBoZGQgY29udGV4dAorICogQHBEYXRhOiBQb2ludGVyIHRvIHNpZ25pZiB3aWZpIGNoYW5nZSBldmVudAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAord2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zaWduaWZfd2lmaV9jaGFuZ2VfcmVzdWx0c19pbmQoCisJCQl2b2lkICpjdHgsCisJCQl0cFNpcldpZmlTaWduaWZpY2FudENoYW5nZUV2ZW50IHBEYXRhKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKSBjdHg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdFNpcldpZmlTaWduaWZpY2FudENoYW5nZSAqYXBfaW5mbzsKKwlpbnQzMl90ICpyc3NpOworCXVpbnQzMl90IGksIGo7CisKKwlFTlRFUigpOworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkgfHwgIXBEYXRhKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGN0eCBpbnZhbGlkIG9yIHBEYXRhKCVwKSBpcyBudWxsIiksIHBEYXRhKTsKKwkJcmV0dXJuOworCX0KKworCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYygKKwkJcEhkZEN0eC0+d2lwaHksCisJCU5VTEwsCisJCUVYVFNDQU5fRVZFTlRfQlVGX1NJWkUgKyBOTE1TR19IRFJMRU4sCisJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0VfSU5ERVgsCisJCUdGUF9LRVJORUwpOworCisJaWYgKCFza2IpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCWhkZExvZyhMT0cxLCAiUmVxIElkICV1IE51bSByZXN1bHRzICV1IE1vcmUgRGF0YSAldSIsCisJCXBEYXRhLT5yZXF1ZXN0SWQsIHBEYXRhLT5udW1SZXN1bHRzLCBwRGF0YS0+bW9yZURhdGEpOworCisJYXBfaW5mbyA9ICZwRGF0YS0+YXBbMF07CisJZm9yIChpID0gMDsgaSA8IHBEYXRhLT5udW1SZXN1bHRzOyBpKyspIHsKKwkJaGRkTG9nKExPRzEsICJbaT0lZF0gIgorCQkgICAgICAgIkJzc2lkICgiIE1BQ19BRERSRVNTX1NUUiAiKSAiCisJCSAgICAgICAiQ2hhbm5lbCAldSAiCisJCSAgICAgICAibnVtT2ZSc3NpICVkIiwKKwkJICAgICAgIGksCisJCSAgICAgICBNQUNfQUREUl9BUlJBWShhcF9pbmZvLT5ic3NpZC5ieXRlcyksCisJCSAgICAgICBhcF9pbmZvLT5jaGFubmVsLCBhcF9pbmZvLT5udW1PZlJzc2kpOworCQlyc3NpID0gJihhcF9pbmZvKS0+cnNzaVswXTsKKwkJZm9yIChqID0gMDsgaiA8IGFwX2luZm8tPm51bU9mUnNzaTsgaisrKQorCQkJaGRkTG9nKExPRzEsICJSc3NpICVkIiwgKnJzc2krKyk7CisKKwkJYXBfaW5mbyArPSBhcF9pbmZvLT5udW1PZlJzc2kgKiBzaXplb2YoKnJzc2kpOworCX0KKworCWlmIChubGFfcHV0X3UzMihza2IsCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19SRVFVRVNUX0lELAorCQlwRGF0YS0+cmVxdWVzdElkKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fTlVNX1JFU1VMVFNfQVZBSUxBQkxFLAorCQlwRGF0YS0+bnVtUmVzdWx0cykpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwdXQgZmFpbCIpKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChwRGF0YS0+bnVtUmVzdWx0cykgeworCQlzdHJ1Y3QgbmxhdHRyICphcHM7CisKKwkJYXBzID0gbmxhX25lc3Rfc3RhcnQoc2tiLAorCQkJICAgICAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19MSVNUKTsKKwkJaWYgKCFhcHMpCisJCQlnb3RvIGZhaWw7CisKKwkJYXBfaW5mbyA9ICZwRGF0YS0+YXBbMF07CisJCWZvciAoaSA9IDA7IGkgPCBwRGF0YS0+bnVtUmVzdWx0czsgaSsrKSB7CisJCQlzdHJ1Y3QgbmxhdHRyICphcDsKKworCQkJYXAgPSBubGFfbmVzdF9zdGFydChza2IsIGkpOworCQkJaWYgKCFhcCkKKwkJCQlnb3RvIGZhaWw7CisKKwkJCWlmIChubGFfcHV0KHNrYiwKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0lHTklGSUNBTlRfQ0hBTkdFX1JFU1VMVF9CU1NJRCwKKwkJCQlDREZfTUFDX0FERFJfU0laRSwgYXBfaW5mby0+YnNzaWQuYnl0ZXMpIHx8CisJCQkgICAgbmxhX3B1dF91MzIoc2tiLAorCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TSUdOSUZJQ0FOVF9DSEFOR0VfUkVTVUxUX0NIQU5ORUwsCisJCQkJYXBfaW5mby0+Y2hhbm5lbCkgfHwKKwkJCSAgICBubGFfcHV0X3UzMihza2IsCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NJR05JRklDQU5UX0NIQU5HRV9SRVNVTFRfTlVNX1JTU0ksCisJCQkJYXBfaW5mby0+bnVtT2ZSc3NpKSB8fAorCQkJICAgIG5sYV9wdXQoc2tiLAorCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TSUdOSUZJQ0FOVF9DSEFOR0VfUkVTVUxUX1JTU0lfTElTVCwKKwkJCQlzaXplb2YoczMyKSAqIGFwX2luZm8tPm51bU9mUnNzaSwKKwkJCQkmKGFwX2luZm8pLT5yc3NpWzBdKSkKKwkJCQlnb3RvIGZhaWw7CisKKwkJCW5sYV9uZXN0X2VuZChza2IsIGFwKTsKKworCQkJYXBfaW5mbyArPSBhcF9pbmZvLT5udW1PZlJzc2kgKiBzaXplb2YoKnJzc2kpOworCQl9CisJCW5sYV9uZXN0X2VuZChza2IsIGFwcyk7CisKKwkJaWYgKG5sYV9wdXRfdTgoc2tiLAorCQkgICAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9NT1JFX0RBVEEsCisJCSAgICAgcERhdGEtPm1vcmVEYXRhKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQoc2tiLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm47CisKK2ZhaWw6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuOworCit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9mdWxsX3NjYW5fcmVzdWx0X2V2ZW50KCkgLSBmdWxsIHNjYW4gcmVzdWx0IGV2ZW50CisgKiBAY3R4OiBQb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKiBAcERhdGE6IFBvaW50ZXIgdG8gZnVsbCBzY2FuIHJlc3VsdCBldmVudAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAord2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9mdWxsX3NjYW5fcmVzdWx0X2V2ZW50KHZvaWQgKmN0eCwKKwkJCQkJCSB0cFNpcldpZmlGdWxsU2NhblJlc3VsdEV2ZW50CisJCQkJCQkgcERhdGEpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopIGN0eDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKyNpZmRlZiBDT05GSUdfQ05TUworCXN0cnVjdCB0aW1lc3BlYyB0czsKKyNlbmRpZgorCisJRU5URVIoKTsKKworCWlmICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpIHx8ICFwRGF0YSkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjdHggaW52YWxpZCBvciBwRGF0YSglcCkgaXMgbnVsbCIpLCBwRGF0YSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHNpemVvZigqcERhdGEpICsgcERhdGEtPmFwLmllTGVuZ3RoKSA+PSBFWFRTQ0FOX0VWRU5UX0JVRl9TSVpFKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIkZyYW1lIGV4Y2VlZGVkIE5MIHNpemUgbGltaXRhdGlvbiwgZHJvcCBpdCEhIikpOworCQlyZXR1cm47CisJfQorCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYygKKwkJICBwSGRkQ3R4LT53aXBoeSwKKwkJICBOVUxMLAorCQkgIEVYVFNDQU5fRVZFTlRfQlVGX1NJWkUgKyBOTE1TR19IRFJMRU4sCisJCSAgUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX0ZVTExfU0NBTl9SRVNVTFRfSU5ERVgsCisJCSAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXNrYikgeworCQloZGRMb2coTE9HRSwgRkwoImNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybjsKKwl9CisKKwlwRGF0YS0+YXAuY2hhbm5lbCA9IGNkc19jaGFuX3RvX2ZyZXEocERhdGEtPmFwLmNoYW5uZWwpOworI2lmZGVmIENPTkZJR19DTlNTCisJLyogQW5kcm9pZCBkb2VzIG5vdCB3YW50IHRoZSB0aW1lIHN0YW1wIGZyb20gdGhlIGZyYW1lLgorCSAgIEluc3RlYWQgaXQgd2FudHMgYSBtb25vdG9uaWMgaW5jcmVhc2luZyB2YWx1ZSBzaW5jZSBib290ICovCisJY25zc19nZXRfbW9ub3RvbmljX2Jvb3R0aW1lKCZ0cyk7CisJcERhdGEtPmFwLnRzID0gKCh1NjQpdHMudHZfc2VjICogMTAwMDAwMCkgKyAodHMudHZfbnNlYyAvIDEwMDApOworI2VuZGlmCisJaGRkTG9nKExPRzEsICJSZXEgSWQgJXUgTW9yZSBEYXRhICV1IiwgcERhdGEtPnJlcXVlc3RJZCwKKwkgICAgICAgcERhdGEtPm1vcmVEYXRhKTsKKwloZGRMb2coTE9HMSwgIkFQIEluZm86IFRpbWVzdGFtcCAlbGx1IFNzaWQ6ICVzICIKKwkgICAgICAgIkJzc2lkICgiIE1BQ19BRERSRVNTX1NUUiAiKSAiCisJICAgICAgICJDaGFubmVsICV1ICIKKwkgICAgICAgIlJzc2kgJWQgIgorCSAgICAgICAiUlRUICV1ICIKKwkgICAgICAgIlJUVF9TRCAldSAiCisJICAgICAgICJCY24gUGVyaW9kICVkICIKKwkgICAgICAgIkNhcGFiaWxpdHkgMHglWCAiCisJICAgICAgICJJRSBMZW5ndGggJWQiLAorCSAgICAgICBwRGF0YS0+YXAudHMsCisJICAgICAgIHBEYXRhLT5hcC5zc2lkLAorCSAgICAgICBNQUNfQUREUl9BUlJBWShwRGF0YS0+YXAuYnNzaWQuYnl0ZXMpLAorCSAgICAgICBwRGF0YS0+YXAuY2hhbm5lbCwKKwkgICAgICAgcERhdGEtPmFwLnJzc2ksCisJICAgICAgIHBEYXRhLT5hcC5ydHQsCisJICAgICAgIHBEYXRhLT5hcC5ydHRfc2QsCisJICAgICAgIHBEYXRhLT5hcC5iZWFjb25QZXJpb2QsCisJICAgICAgIHBEYXRhLT5hcC5jYXBhYmlsaXR5LCBwRGF0YS0+YXAuaWVMZW5ndGgpOworCisJaWYgKG5sYV9wdXRfdTMyKHNrYiwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1JFUVVFU1RfSUQsCisJCXBEYXRhLT5yZXF1ZXN0SWQpIHx8CisJICAgIG5sYV9wdXRfdTY0KHNrYiwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX1RJTUVfU1RBTVAsCisJCXBEYXRhLT5hcC50cykgfHwKKwkgICAgbmxhX3B1dChza2IsCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9TU0lELAorCQlzaXplb2YocERhdGEtPmFwLnNzaWQpLAorCQlwRGF0YS0+YXAuc3NpZCkgfHwKKwkgICAgbmxhX3B1dChza2IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9CU1NJRCwKKwkJc2l6ZW9mKHBEYXRhLT5hcC5ic3NpZCksCisJCXBEYXRhLT5hcC5ic3NpZC5ieXRlcykgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfQ0hBTk5FTCwKKwkJcERhdGEtPmFwLmNoYW5uZWwpIHx8CisJICAgIG5sYV9wdXRfczMyKHNrYiwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX1JTU0ksCisJCXBEYXRhLT5hcC5yc3NpKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9SVFQsCisJCXBEYXRhLT5hcC5ydHQpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX1JUVF9TRCwKKwkJcERhdGEtPmFwLnJ0dF9zZCkgfHwKKwkgICAgbmxhX3B1dF91MTYoc2tiLAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfQkVBQ09OX1BFUklPRCwKKwkJcERhdGEtPmFwLmJlYWNvblBlcmlvZCkgfHwKKwkgICAgbmxhX3B1dF91MTYoc2tiLAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfQ0FQQUJJTElUWSwKKwkJcERhdGEtPmFwLmNhcGFiaWxpdHkpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX0lFX0xFTkdUSCwKKwkJcERhdGEtPmFwLmllTGVuZ3RoKSB8fAorCSAgICBubGFfcHV0X3U4KHNrYiwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fUkVTVUxUX01PUkVfREFUQSwKKwkJcERhdGEtPm1vcmVEYXRhKSkgeworCQloZGRMb2coTE9HRSwgRkwoIm5sYSBwdXQgZmFpbCIpKTsKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQorCisJaWYgKHBEYXRhLT5hcC5pZUxlbmd0aCkgeworCQlpZiAobmxhX3B1dChza2IsCisJCSAgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfSUVfREFUQSwKKwkJICAgIHBEYXRhLT5hcC5pZUxlbmd0aCwgcERhdGEtPmFwLmllRGF0YSkpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CisKKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQoc2tiLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm47CisKK25sYV9wdXRfZmFpbHVyZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zY2FuX3Jlc19hdmFpbGFibGVfZXZlbnQoKSAtIHNjYW4gcmVzdWx0IGV2ZW50CisgKiBAY3R4OiBQb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKiBAcERhdGE6IFBvaW50ZXIgdG8gc2NhbiByZXN1bHRzIGF2YWlsYWJsZSBpbmRpY2F0aW9uIHBhcmFtCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCit3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NjYW5fcmVzX2F2YWlsYWJsZV9ldmVudCgKKwkJCXZvaWQgKmN0eCwKKwkJCXRwU2lyRXh0U2NhblJlc3VsdHNBdmFpbGFibGVJbmRQYXJhbXMgcERhdGEpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopIGN0eDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKworCUVOVEVSKCk7CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KSB8fCAhcERhdGEpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY3R4IGludmFsaWQgb3IgcERhdGEoJXApIGlzIG51bGwiKSwgcERhdGEpOworCQlyZXR1cm47CisJfQorCisJc2tiID0gY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jKAorCQkgcEhkZEN0eC0+d2lwaHksCisJCSBOVUxMLAorCQkgRVhUU0NBTl9FVkVOVF9CVUZfU0laRSArIE5MTVNHX0hEUkxFTiwKKwkJIFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0lOREVYLAorCQkgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXNrYikgeworCQloZGRMb2coTE9HRSwgRkwoImNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybjsKKwl9CisKKwloZGRMb2coTE9HMSwgIlJlcSBJZCAldSBOdW0gcmVzdWx0cyAldSIsCisJICAgICAgIHBEYXRhLT5yZXF1ZXN0SWQsIHBEYXRhLT5udW1SZXN1bHRzQXZhaWxhYmxlKTsKKwlpZiAobmxhX3B1dF91MzIoc2tiLAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfUkVRVUVTVF9JRCwKKwkJcERhdGEtPnJlcXVlc3RJZCkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX05VTV9SRVNVTFRTX0FWQUlMQUJMRSwKKwkJcERhdGEtPm51bVJlc3VsdHNBdmFpbGFibGUpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgibmxhIHB1dCBmYWlsIikpOworCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CisKKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQoc2tiLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm47CisKK25sYV9wdXRfZmFpbHVyZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zY2FuX3Byb2dyZXNzX2V2ZW50KCkgLSBzY2FuIHByb2dyZXNzIGV2ZW50CisgKiBAY3R4OiBQb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKiBAcERhdGE6IFBvaW50ZXIgdG8gc2NhbiBldmVudCBpbmRpY2F0aW9uIHBhcmFtCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCit3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NjYW5fcHJvZ3Jlc3NfZXZlbnQodm9pZCAqY3R4LAorCQkJCQkgICAgICB0cFNpckV4dFNjYW5PblNjYW5FdmVudEluZFBhcmFtcworCQkJCQkgICAgICBwRGF0YSkKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKikgY3R4OworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisJRU5URVIoKTsKKworCWlmICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpIHx8ICFwRGF0YSkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjdHggaW52YWxpZCBvciBwRGF0YSglcCkgaXMgbnVsbCIpLCBwRGF0YSk7CisJCXJldHVybjsKKwl9CisKKwlza2IgPSBjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MoCisJCQlwSGRkQ3R4LT53aXBoeSwKKwkJCU5VTEwsCisJCQlFWFRTQ0FOX0VWRU5UX0JVRl9TSVpFICsgTkxNU0dfSERSTEVOLAorCQkJUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9FWFRTQ0FOX1NDQU5fRVZFTlRfSU5ERVgsCisJCQlHRlBfS0VSTkVMKTsKKworCWlmICghc2tiKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKwloZGRMb2coTE9HMSwgIlJlcSBJZCAldSBTY2FuIGV2ZW50IHR5cGUgJXUgU2NhbiBldmVudCBzdGF0dXMgJXUiLAorCQlwRGF0YS0+cmVxdWVzdElkLCBwRGF0YS0+c2NhbkV2ZW50VHlwZSwgcERhdGEtPnN0YXR1cyk7CisKKwlpZiAobmxhX3B1dF91MzIoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfUkVRVUVTVF9JRCwKKwkJCXBEYXRhLT5yZXF1ZXN0SWQpIHx8CisJICAgIG5sYV9wdXRfdTgoc2tiLAorCQkgICAgICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1NDQU5fRVZFTlRfVFlQRSwKKwkJICAgICAgIHBEYXRhLT5zY2FuRXZlbnRUeXBlKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9FVkVOVF9TVEFUVVMsCisJCQlwRGF0YS0+c3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwgRkwoIm5sYSBwdXQgZmFpbCIpKTsKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQorCisJY2ZnODAyMTFfdmVuZG9yX2V2ZW50KHNrYiwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuOworCitubGFfcHV0X2ZhaWx1cmU6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fZXBub19tYXRjaF9mb3VuZCgpIC0gcG5vIG1hdGNoIGZvdW5kCisgKiBAaGRkY3R4OiBIREQgY29udGV4dAorICogQGRhdGE6IG1hdGNoZWQgbmV0d29yayBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbWF0Y2hlZCBuZXR3b3JrIGRhdGEgYW5kIGZpbGxzIE5MIHZlbmRvciBhdHRyaWJ1dGVzCisgKiBhbmQgc2VuZCBpdCB0byB1cHBlciBsYXllci4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgdm9pZAord2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9lcG5vX21hdGNoX2ZvdW5kKHZvaWQgKmN0eCwKKwkJCQkJc3RydWN0IHBub19tYXRjaF9mb3VuZCAqZGF0YSkKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ICA9IChoZGRfY29udGV4dF90ICopY3R4OworCXN0cnVjdCBza19idWZmICpza2IgICAgID0gTlVMTDsKKwl1aW50MzJfdCBsZW4sIGk7CisKKwlFTlRFUigpOworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkgfHwgIWRhdGEpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBpbnZhbGlkIG9yIGRhdGEoJXApIGlzIG51bGwiKSwKKwkJCWRhdGEpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGUgbnVtYmVyIG9mIG1hdGNoIGZvdW5kIEFQcyBpbmNsdWRpbmcgSUUgZGF0YSBleGNlZWRzIE5MIDRLIHNpemUKKwkgKiBsaW1pdGF0aW9uLCBkcm9wIHRoYXQgYmVhY29uL3Byb2JlIHJzcCBmcmFtZS4KKwkgKi8KKwlsZW4gPSBzaXplb2YoKmRhdGEpICsKKwkJCShkYXRhLT5udW1fcmVzdWx0cyArIHNpemVvZih0U2lyV2lmaVNjYW5SZXN1bHQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnVtX3Jlc3VsdHM7IGkrKykKKwkJbGVuICs9IGRhdGEtPmFwW2ldLmllTGVuZ3RoOworCisJaWYgKGxlbiA+PSBFWFRTQ0FOX0VWRU5UX0JVRl9TSVpFKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRnJhbWUgZXhjZWVkZWQgTkwgc2l6ZSBsaW1pdGF0aW9uLCBkcm9wIGl0ISIpKTsKKwkJcmV0dXJuOworCX0KKworCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyhwSGRkQ3R4LT53aXBoeSwKKwkJICBOVUxMLAorCQkgIEVYVFNDQU5fRVZFTlRfQlVGX1NJWkUgKyBOTE1TR19IRFJMRU4sCisJCVFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9QTk9fTkVUV09SS19GT1VORF9JTkRFWCwKKwkJICBHRlBfS0VSTkVMKTsKKworCWlmICghc2tiKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWhkZExvZyhMT0cxLCAiUmVxIElkICV1IE1vcmUgRGF0YSAldSBudW1fcmVzdWx0cyAlZCIsCisJCWRhdGEtPnJlcXVlc3RfaWQsIGRhdGEtPm1vcmVfZGF0YSwgZGF0YS0+bnVtX3Jlc3VsdHMpOworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW1fcmVzdWx0czsgaSsrKSB7CisJCWRhdGEtPmFwW2ldLmNoYW5uZWwgPSBjZHNfY2hhbl90b19mcmVxKGRhdGEtPmFwW2ldLmNoYW5uZWwpOworCQloZGRMb2coTE9HMSwgIkFQIEluZm86IFRpbWVzdGFtcCAlbGx1KSBTc2lkOiAlcyAiCisJCQkJCSJCc3NpZCAoIiBNQUNfQUREUkVTU19TVFIgIikgIgorCQkJCQkiQ2hhbm5lbCAldSAiCisJCQkJCSJSc3NpICVkICIKKwkJCQkJIlJUVCAldSAiCisJCQkJCSJSVFRfU0QgJXUgIgorCQkJCQkiQmNuIFBlcmlvZCAlZCAiCisJCQkJCSJDYXBhYmlsaXR5IDB4JVggIgorCQkJCQkiSUUgTGVuZ3RoICVkIiwKKwkJCQkJZGF0YS0+YXBbaV0udHMsCisJCQkJCWRhdGEtPmFwW2ldLnNzaWQsCisJCQkJCU1BQ19BRERSX0FSUkFZKGRhdGEtPmFwW2ldLmJzc2lkLmJ5dGVzKSwKKwkJCQkJZGF0YS0+YXBbaV0uY2hhbm5lbCwKKwkJCQkJZGF0YS0+YXBbaV0ucnNzaSwKKwkJCQkJZGF0YS0+YXBbaV0ucnR0LAorCQkJCQlkYXRhLT5hcFtpXS5ydHRfc2QsCisJCQkJCWRhdGEtPmFwW2ldLmJlYWNvblBlcmlvZCwKKwkJCQkJZGF0YS0+YXBbaV0uY2FwYWJpbGl0eSwKKwkJCQkJZGF0YS0+YXBbaV0uaWVMZW5ndGgpOworCX0KKworCWlmIChubGFfcHV0X3UzMihza2IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19SRVFVRVNUX0lELAorCQlkYXRhLT5yZXF1ZXN0X2lkKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fTlVNX1JFU1VMVFNfQVZBSUxBQkxFLAorCQlkYXRhLT5udW1fcmVzdWx0cykgfHwKKwkgICAgbmxhX3B1dF91OChza2IsCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9NT1JFX0RBVEEsCisJCWRhdGEtPm1vcmVfZGF0YSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJubGEgcHV0IGZhaWwiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoZGF0YS0+bnVtX3Jlc3VsdHMpIHsKKwkJc3RydWN0IG5sYXR0ciAqbmxhX2FwczsKKwkJbmxhX2FwcyA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19MSVNUKTsKKwkJaWYgKCFubGFfYXBzKQorCQkJZ290byBmYWlsOworCisJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW1fcmVzdWx0czsgaSsrKSB7CisJCQlpZiAoaGRkX2V4dHNjYW5fbmxfZmlsbF9ic3Moc2tiLCAmZGF0YS0+YXBbaV0sIGkpKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCQlubGFfbmVzdF9lbmQoc2tiLCBubGFfYXBzKTsKKwl9CisKKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQoc2tiLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm47CisKK2ZhaWw6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3Bhc3Nwb2ludF9tYXRjaF9mb3VuZCgpIC0gcGFzc3BvaW50IG1hdGNoIGZvdW5kCisgKiBAaGRkY3R4OiBIREQgY29udGV4dAorICogQGRhdGE6IG1hdGNoZWQgbmV0d29yayBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbWF0Y2ggbmV0d29yayAlZGF0YSBhbmQgZmlsbCBpbiB0aGUgc2tiIHdpdGgKKyAqIE5MIGF0dHJpYnV0ZXMgYW5kIHNlbmQgdXAgdGhlIE5MIGV2ZW50CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCit3bGFuX2hkZF9jZmc4MDIxMV9wYXNzcG9pbnRfbWF0Y2hfZm91bmQodm9pZCAqY3R4LAorCQkJCQlzdHJ1Y3Qgd2lmaV9wYXNzcG9pbnRfbWF0Y2ggKmRhdGEpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCAgPSBjdHg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiAgICAgPSBOVUxMOworCXVpbnQzMl90IGxlbiwgaSwgbnVtX21hdGNoZXMgPSAxLCBtb3JlX2RhdGEgPSAwOworCXN0cnVjdCBubGF0dHIgKm5sYV9hcHM7CisJc3RydWN0IG5sYXR0ciAqbmxhX2JzczsKKworCUVOVEVSKCk7CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KSB8fCAhZGF0YSkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIGludmFsaWQgb3IgZGF0YSglcCkgaXMgbnVsbCIpLAorCQkJZGF0YSk7CisJCXJldHVybjsKKwl9CisKKwlsZW4gPSBzaXplb2YoKmRhdGEpICsgZGF0YS0+YXAuaWVMZW5ndGggKyBkYXRhLT5hbnFwX2xlbjsKKwlpZiAobGVuID49IEVYVFNDQU5fRVZFTlRfQlVGX1NJWkUpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJSZXN1bHQgZXhjZWVkZWQgTkwgc2l6ZSBsaW1pdGF0aW9uLCBkcm9wIGl0IikpOworCQlyZXR1cm47CisJfQorCisJc2tiID0gY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jKHBIZGRDdHgtPndpcGh5LAorCQkgIE5VTEwsCisJCSAgRVhUU0NBTl9FVkVOVF9CVUZfU0laRSArIE5MTVNHX0hEUkxFTiwKKwkJICBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fUE5PX1BBU1NQT0lOVF9ORVRXT1JLX0ZPVU5EX0lOREVYLAorCQkgIEdGUF9LRVJORUwpOworCisJaWYgKCFza2IpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCisJaGRkTG9nKExPRzEsICJSZXEgSWQgJXUgSWQgJXUgQU5RUCBsZW5ndGggJXUgbnVtX21hdGNoZXMgJXUiLAorCQlkYXRhLT5yZXF1ZXN0X2lkLCBkYXRhLT5pZCwgZGF0YS0+YW5xcF9sZW4sIG51bV9tYXRjaGVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21hdGNoZXM7IGkrKykgeworCQloZGRMb2coTE9HMSwgIkFQIEluZm86IFRpbWVzdGFtcCAlbGx1IFNzaWQ6ICVzICIKKwkJCQkJIkJzc2lkICgiIE1BQ19BRERSRVNTX1NUUiAiKSAiCisJCQkJCSJDaGFubmVsICV1ICIKKwkJCQkJIlJzc2kgJWQgIgorCQkJCQkiUlRUICV1ICIKKwkJCQkJIlJUVF9TRCAldSAiCisJCQkJCSJCY24gUGVyaW9kICVkICIKKwkJCQkJIkNhcGFiaWxpdHkgMHglWCAiCisJCQkJCSJJRSBMZW5ndGggJWQiLAorCQkJCQlkYXRhLT5hcC50cywKKwkJCQkJZGF0YS0+YXAuc3NpZCwKKwkJCQkJTUFDX0FERFJfQVJSQVkoZGF0YS0+YXAuYnNzaWQuYnl0ZXMpLAorCQkJCQlkYXRhLT5hcC5jaGFubmVsLAorCQkJCQlkYXRhLT5hcC5yc3NpLAorCQkJCQlkYXRhLT5hcC5ydHQsCisJCQkJCWRhdGEtPmFwLnJ0dF9zZCwKKwkJCQkJZGF0YS0+YXAuYmVhY29uUGVyaW9kLAorCQkJCQlkYXRhLT5hcC5jYXBhYmlsaXR5LAorCQkJCQlkYXRhLT5hcC5pZUxlbmd0aCk7CisJfQorCisJaWYgKG5sYV9wdXRfdTMyKHNrYiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX1JFUVVFU1RfSUQsCisJCWRhdGEtPnJlcXVlc3RfaWQpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9QTk9fUkVTVUxUU19QQVNTUE9JTlRfTkVUV09SS19GT1VORF9OVU1fTUFUQ0hFUywKKwkJbnVtX21hdGNoZXMpIHx8CisJICAgIG5sYV9wdXRfdTgoc2tiLAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfTU9SRV9EQVRBLAorCQltb3JlX2RhdGEpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgibmxhIHB1dCBmYWlsIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJbmxhX2FwcyA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9QTk9fUkVTVUxUU19QQVNTUE9JTlRfTUFUQ0hfUkVTVUxUX0xJU1QpOworCWlmICghbmxhX2FwcykKKwkJZ290byBmYWlsOworCisJZm9yIChpID0gMDsgaSA8IG51bV9tYXRjaGVzOyBpKyspIHsKKwkJc3RydWN0IG5sYXR0ciAqbmxhX2FwOworCisJCW5sYV9hcCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgaSk7CisJCWlmICghbmxhX2FwKQorCQkJZ290byBmYWlsOworCisJCWlmIChubGFfcHV0X3UzMihza2IsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1BOT19SRVNVTFRTX1BBU1NQT0lOVF9NQVRDSF9JRCwKKwkJCWRhdGEtPmlkKSB8fAorCQkgICAgbmxhX3B1dF91MzIoc2tiLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9QTk9fUkVTVUxUU19QQVNTUE9JTlRfTUFUQ0hfQU5RUF9MRU4sCisJCQlkYXRhLT5hbnFwX2xlbikpIHsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmIChkYXRhLT5hbnFwX2xlbikKKwkJCWlmIChubGFfcHV0KHNrYiwKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1BOT19SRVNVTFRTX1BBU1NQT0lOVF9NQVRDSF9BTlFQLAorCQkJCWRhdGEtPmFucXBfbGVuLCBkYXRhLT5hbnFwKSkKKwkJCQlnb3RvIGZhaWw7CisKKwkJbmxhX2JzcyA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfTElTVCk7CisJCWlmICghbmxhX2JzcykKKwkJCWdvdG8gZmFpbDsKKworCQlpZiAoaGRkX2V4dHNjYW5fbmxfZmlsbF9ic3Moc2tiLCAmZGF0YS0+YXAsIDApKQorCQkJZ290byBmYWlsOworCisJCW5sYV9uZXN0X2VuZChza2IsIG5sYV9ic3MpOworCQlubGFfbmVzdF9lbmQoc2tiLCBubGFfYXApOworCX0KKwlubGFfbmVzdF9lbmQoc2tiLCBubGFfYXBzKTsKKworCWNmZzgwMjExX3ZlbmRvcl9ldmVudChza2IsIEdGUF9LRVJORUwpOworCXJldHVybjsKKworZmFpbDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9ob3RsaXN0X3NzaWRfbWF0Y2hfaW5kKCkgLQorICoJSGFuZGxlIGFuIFNTSUQgaG90bGlzdCBtYXRjaCBldmVudAorICogQGN0eDogSEREIGNvbnRleHQgcmVnaXN0ZXJlZCB3aXRoIFNNRQorICogQGV2ZW50OiBUaGUgU1NJRCBob3RsaXN0IG1hdGNoIGV2ZW50CisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgYW4gU1NJRCBtYXRjaCBldmVudCB0aGF0IHdhcyBnZW5lcmF0ZWQgYnkKKyAqIGZpcm13YXJlIGFuZCB3aWxsIGNvbnZlcnQgaXQgaW50byBhIGNmZzgwMjExIHZlbmRvciBldmVudCB3aGljaCBpcworICogc2VudCB0byB1c2Vyc3BhY2UuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCit3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2hvdGxpc3Rfc3NpZF9tYXRjaF9pbmQodm9pZCAqY3R4LAorCQkJCQkJIHRwU2lyV2lmaVNjYW5SZXN1bHRFdmVudCBldmVudCkKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gY3R4OworCXN0cnVjdCBza19idWZmICpza2I7CisJdWludDMyX3QgaSwgaW5kZXg7CisKKwlFTlRFUigpOworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCkgfHwgIWV2ZW50KSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCBvciBldmVudCglcCkgaXMgbnVsbCIpLAorCQkgICAgICAgZXZlbnQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGV2ZW50LT5hcF9mb3VuZCkgeworCQlpbmRleCA9IFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfRVhUU0NBTl9IT1RMSVNUX1NTSURfRk9VTkRfSU5ERVg7CisJCWhkZExvZyhMT0cxLCAiU1NJRCBob3RsaXN0IGZvdW5kIik7CisJfSBlbHNlIHsKKwkJaW5kZXggPSBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0VYVFNDQU5fSE9UTElTVF9TU0lEX0xPU1RfSU5ERVg7CisJCWhkZExvZyhMT0cxLCAiU1NJRCBob3RsaXN0IGxvc3QiKTsKKwl9CisKKwlza2IgPSBjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MoaGRkX2N0eC0+d2lwaHksCisJCU5VTEwsCisJCUVYVFNDQU5fRVZFTlRfQlVGX1NJWkUgKyBOTE1TR19IRFJMRU4sCisJCWluZGV4LAorCQlHRlBfS0VSTkVMKTsKKworCWlmICghc2tiKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKwloZGRMb2coTE9HMSwgIlJlcSBJZCAldSwgTnVtIHJlc3VsdHMgJXUsIE1vcmUgRGF0YSAldSIsCisJICAgICAgIGV2ZW50LT5yZXF1ZXN0SWQsIGV2ZW50LT5udW1PZkFwcywgZXZlbnQtPm1vcmVEYXRhKTsKKworCWZvciAoaSA9IDA7IGkgPCBldmVudC0+bnVtT2ZBcHM7IGkrKykgeworCQloZGRMb2coTE9HMSwgIltpPSVkXSBUaW1lc3RhbXAgJWxsdSAiCisJCSAgICAgICAiU3NpZDogJXMgIgorCQkgICAgICAgIkJzc2lkICgiIE1BQ19BRERSRVNTX1NUUiAiKSAiCisJCSAgICAgICAiQ2hhbm5lbCAldSAiCisJCSAgICAgICAiUnNzaSAlZCAiCisJCSAgICAgICAiUlRUICV1ICIKKwkJICAgICAgICJSVFRfU0QgJXUiLAorCQkgICAgICAgaSwKKwkJICAgICAgIGV2ZW50LT5hcFtpXS50cywKKwkJICAgICAgIGV2ZW50LT5hcFtpXS5zc2lkLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkoZXZlbnQtPmFwW2ldLmJzc2lkLmJ5dGVzKSwKKwkJICAgICAgIGV2ZW50LT5hcFtpXS5jaGFubmVsLAorCQkgICAgICAgZXZlbnQtPmFwW2ldLnJzc2ksCisJCSAgICAgICBldmVudC0+YXBbaV0ucnR0LAorCQkgICAgICAgZXZlbnQtPmFwW2ldLnJ0dF9zZCk7CisJfQorCisJaWYgKG5sYV9wdXRfdTMyKHNrYiwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19SRVFVRVNUX0lELAorCQkJZXZlbnQtPnJlcXVlc3RJZCkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9OVU1fUkVTVUxUU19BVkFJTEFCTEUsCisJCQlldmVudC0+bnVtT2ZBcHMpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgicHV0IGZhaWwiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoZXZlbnQtPm51bU9mQXBzKSB7CisJCXN0cnVjdCBubGF0dHIgKmFwczsKKwkJYXBzID0gbmxhX25lc3Rfc3RhcnQoc2tiLAorCQkJCSAgICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0xJU1QpOworCQlpZiAoIWFwcykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJuZXN0IGZhaWwiKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgZXZlbnQtPm51bU9mQXBzOyBpKyspIHsKKwkJCXN0cnVjdCBubGF0dHIgKmFwOworCisJCQlhcCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgaSk7CisJCQlpZiAoIWFwKSB7CisJCQkJaGRkTG9nKExPR0UsIEZMKCJuZXN0IGZhaWwiKSk7CisJCQkJZ290byBmYWlsOworCQkJfQorCisJCQlpZiAobmxhX3B1dF91NjQoc2tiLAorCQkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfVElNRV9TVEFNUCwKKwkJCQkJZXZlbnQtPmFwW2ldLnRzKSB8fAorCQkJICAgIG5sYV9wdXQoc2tiLAorCQkJCSAgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfU1NJRCwKKwkJCQkgICAgc2l6ZW9mKGV2ZW50LT5hcFtpXS5zc2lkKSwKKwkJCQkgICAgZXZlbnQtPmFwW2ldLnNzaWQpIHx8CisJCQkgICAgbmxhX3B1dChza2IsCisJCQkJICAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9CU1NJRCwKKwkJCQkgICAgc2l6ZW9mKGV2ZW50LT5hcFtpXS5ic3NpZCksCisJCQkJICAgIGV2ZW50LT5hcFtpXS5ic3NpZC5ieXRlcykgfHwKKwkJCSAgICBubGFfcHV0X3UzMihza2IsCisJCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9DSEFOTkVMLAorCQkJCQlldmVudC0+YXBbaV0uY2hhbm5lbCkgfHwKKwkJCSAgICBubGFfcHV0X3MzMihza2IsCisJCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9SU1NJLAorCQkJCQlldmVudC0+YXBbaV0ucnNzaSkgfHwKKwkJCSAgICBubGFfcHV0X3UzMihza2IsCisJCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9SVFQsCisJCQkJCWV2ZW50LT5hcFtpXS5ydHQpIHx8CisJCQkgICAgbmxhX3B1dF91MzIoc2tiLAorCQkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfU0NBTl9SRVNVTFRfUlRUX1NELAorCQkJCQlldmVudC0+YXBbaV0ucnR0X3NkKSkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgicHV0IGZhaWwiKSk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJbmxhX25lc3RfZW5kKHNrYiwgYXApOworCQl9CisJCW5sYV9uZXN0X2VuZChza2IsIGFwcyk7CisKKwkJaWYgKG5sYV9wdXRfdTgoc2tiLAorCQkJICAgICAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19TQ0FOX1JFU1VMVF9NT1JFX0RBVEEsCisJCQkgICAgICAgZXZlbnQtPm1vcmVEYXRhKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJwdXQgZmFpbCIpKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWNmZzgwMjExX3ZlbmRvcl9ldmVudChza2IsIEdGUF9LRVJORUwpOworCXJldHVybjsKKworZmFpbDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZW5lcmljX3JzcCgpIC0KKyAqCUhhbmRsZSBhIGdlbmVyaWMgRXh0U2NhbiBSZXNwb25zZSBtZXNzYWdlCisgKiBAY3R4OiBIREQgY29udGV4dCByZWdpc3RlcmVkIHdpdGggU01FCisgKiBAcmVzcG9uc2U6IFRoZSBFeHRTY2FuIHJlc3BvbnNlIGZyb20gZmlybXdhcmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIGEgZ2VuZXJpYyBFeHRTY2FuIHJlc3BvbnNlIG1lc3NhZ2UgZnJvbQorICogZmlybXdhcmUgYW5kIHdpbGwgY29tbXVuaWNhdGUgdGhlIHJlc3VsdCB0byB0aGUgdXNlcnNwYWNlIHRocmVhZAorICogdGhhdCBpcyB3YWl0aW5nIGZvciB0aGUgcmVzcG9uc2UuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCit3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2dlbmVyaWNfcnNwCisJKHZvaWQgKmN0eCwKKwkgc3RydWN0IHNpcl9leHRzY2FuX2dlbmVyaWNfcmVzcG9uc2UgKnJlc3BvbnNlKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBjdHg7CisJc3RydWN0IGhkZF9leHRfc2Nhbl9jb250ZXh0ICpjb250ZXh0OworCisJRU5URVIoKTsKKworCWlmICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpIHx8ICFyZXNwb25zZSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQgb3IgcmVzcG9uc2UoJXApIGlzIG51bGwiKSwKKwkJICAgICAgIHJlc3BvbnNlKTsKKwkJcmV0dXJuOworCX0KKworCWhkZExvZyhMT0cxLCBGTCgicmVxdWVzdCAldSBzdGF0dXMgJXUiKSwKKwkgICAgICAgcmVzcG9uc2UtPnJlcXVlc3RfaWQsIHJlc3BvbnNlLT5zdGF0dXMpOworCisJY29udGV4dCA9ICZleHRfc2Nhbl9jb250ZXh0OworCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwlpZiAoY29udGV4dC0+cmVxdWVzdF9pZCA9PSByZXNwb25zZS0+cmVxdWVzdF9pZCkgeworCQljb250ZXh0LT5yZXNwb25zZV9zdGF0dXMgPSByZXNwb25zZS0+c3RhdHVzID8gLUVJTlZBTCA6IDA7CisJCWNvbXBsZXRlKCZjb250ZXh0LT5yZXNwb25zZV9ldmVudCk7CisJfQorCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJcmV0dXJuOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fY2FsbGJhY2soKSAtIGV4dCBzY2FuIGNhbGxiYWNrCisgKiBAY3R4OiBQb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKiBAZXZUeXBlOiBFdmVudCB0eXBlCisgKiBAcE1hZzogUG9pbnRlciB0byBtZXNzYWdlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9jYWxsYmFjayh2b2lkICpjdHgsIGNvbnN0IHVpbnQxNl90IGV2VHlwZSwKKwkJCQkJdm9pZCAqcE1zZykKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKikgY3R4OworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY3R4IGludmFsaWQgcmVjZWl2ZWQgZXZlbnQ6ICVkIiksIGV2VHlwZSk7CisJCXJldHVybjsKKwl9CisKKwloZGRMb2coTE9HMSwgRkwoIlJjdmQgRXZlbnQgJWQiKSwgZXZUeXBlKTsKKworCXN3aXRjaCAoZXZUeXBlKSB7CisJY2FzZSBlU0lSX0VYVFNDQU5fQ0FDSEVEX1JFU1VMVFNfUlNQOgorCQkvKiBUaGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgdGhpcyByZXNwb25zZSB0byB1cHBlciBsYXllcgorCQkgICBKdXN0IGxvZyB0aGUgbWVzc2FnZSAqLworCQloZGRMb2coTE9HMSwKKwkJICAgICAgIEZMKCJSY3ZkIGVTSVJfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19SU1AiKSk7CisJCWJyZWFrOworCisJY2FzZSBlU0lSX0VYVFNDQU5fR0VUX0NBUEFCSUxJVElFU19JTkQ6CisJCXdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fZ2V0X2NhcGFiaWxpdGllc19yc3AoY3R4LAorCQkJKHN0cnVjdCBleHRfc2Nhbl9jYXBhYmlsaXRpZXNfcmVzcG9uc2UgKikgcE1zZyk7CisJCWJyZWFrOworCisJY2FzZSBlU0lSX0VYVFNDQU5fSE9UTElTVF9NQVRDSF9JTkQ6CisJCXdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5faG90bGlzdF9tYXRjaF9pbmQoY3R4LCBwTXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTSVJfRVhUU0NBTl9TSUdOSUZJQ0FOVF9XSUZJX0NIQU5HRV9SRVNVTFRTX0lORDoKKwkJd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zaWduaWZfd2lmaV9jaGFuZ2VfcmVzdWx0c19pbmQoY3R4LAorCQkJCQkodHBTaXJXaWZpU2lnbmlmaWNhbnRDaGFuZ2VFdmVudCkgcE1zZyk7CisJCWJyZWFrOworCisJY2FzZSBlU0lSX0VYVFNDQU5fQ0FDSEVEX1JFU1VMVFNfSU5EOgorCQl3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2luZChjdHgsIHBNc2cpOworCQlicmVhazsKKworCWNhc2UgZVNJUl9FWFRTQ0FOX1NDQU5fUkVTX0FWQUlMQUJMRV9JTkQ6CisJCXdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc2Nhbl9yZXNfYXZhaWxhYmxlX2V2ZW50KGN0eCwKKwkJCSAgICh0cFNpckV4dFNjYW5SZXN1bHRzQXZhaWxhYmxlSW5kUGFyYW1zKSBwTXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTSVJfRVhUU0NBTl9GVUxMX1NDQU5fUkVTVUxUX0lORDoKKwkJd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9mdWxsX3NjYW5fcmVzdWx0X2V2ZW50KGN0eCwKKwkJCQkJICh0cFNpcldpZmlGdWxsU2NhblJlc3VsdEV2ZW50KSBwTXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTSVJfRVBOT19ORVRXT1JLX0ZPVU5EX0lORDoKKwkJd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9lcG5vX21hdGNoX2ZvdW5kKGN0eCwKKwkJCQkJKHN0cnVjdCBwbm9fbWF0Y2hfZm91bmQgKilwTXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTSVJfRVhUU0NBTl9IT1RMSVNUX1NTSURfTUFUQ0hfSU5EOgorCQl3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2hvdGxpc3Rfc3NpZF9tYXRjaF9pbmQoY3R4LAorCQkJCQkodHBTaXJXaWZpU2NhblJlc3VsdEV2ZW50KXBNc2cpOworCQlicmVhazsKKworCWNhc2UgZVNJUl9FWFRTQ0FOX1NDQU5fUFJPR1JFU1NfRVZFTlRfSU5EOgorCQl3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NjYW5fcHJvZ3Jlc3NfZXZlbnQoY3R4LAorCQkJICAgICAgKHRwU2lyRXh0U2Nhbk9uU2NhbkV2ZW50SW5kUGFyYW1zKSBwTXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTSVJfUEFTU1BPSU5UX05FVFdPUktfRk9VTkRfSU5EOgorCQl3bGFuX2hkZF9jZmc4MDIxMV9wYXNzcG9pbnRfbWF0Y2hfZm91bmQoY3R4LAorCQkJCQkoc3RydWN0IHdpZmlfcGFzc3BvaW50X21hdGNoICopIHBNc2cpOworCQlicmVhazsKKworCWNhc2UgZVNJUl9FWFRTQ0FOX1NUQVJUX1JTUDoKKwljYXNlIGVTSVJfRVhUU0NBTl9TVE9QX1JTUDoKKwljYXNlIGVTSVJfRVhUU0NBTl9TRVRfQlNTSURfSE9UTElTVF9SU1A6CisJY2FzZSBlU0lSX0VYVFNDQU5fUkVTRVRfQlNTSURfSE9UTElTVF9SU1A6CisJY2FzZSBlU0lSX0VYVFNDQU5fU0VUX1NJR05JRklDQU5UX1dJRklfQ0hBTkdFX1JTUDoKKwljYXNlIGVTSVJfRVhUU0NBTl9SRVNFVF9TSUdOSUZJQ0FOVF9XSUZJX0NIQU5HRV9SU1A6CisJY2FzZSBlU0lSX0VYVFNDQU5fU0VUX1NTSURfSE9UTElTVF9SU1A6CisJY2FzZSBlU0lSX0VYVFNDQU5fUkVTRVRfU1NJRF9IT1RMSVNUX1JTUDoKKwkJd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZW5lcmljX3JzcChjdHgsIHBNc2cpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWhkZExvZyhMT0dFLCBGTCgiVW5rbm93biBldmVudCB0eXBlICV1IiksIGV2VHlwZSk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIGRlZmluZSBzaG9ydCBuYW1lcyBmb3IgdGhlIGdsb2JhbCB2ZW5kb3IgcGFyYW1zCisgKiB1c2VkIGJ5IHdsYW5faGRkX3NlbmRfZXh0X3NjYW5fY2FwYWJpbGl0eSgpCisgKi8KKyNkZWZpbmUgUEFSQU1fUkVRVUVTVF9JRCBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX1JFUVVFU1RfSUQKKyNkZWZpbmUgUEFSQU1fU1RBVFVTIFwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NUQVRVUworI2RlZmluZSBNQVhfU0NBTl9DQUNIRV9TSVpFIFwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQ0FQQUJJTElUSUVTX01BWF9TQ0FOX0NBQ0hFX1NJWkUKKyNkZWZpbmUgTUFYX1NDQU5fQlVDS0VUUyBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfU0NBTl9CVUNLRVRTCisjZGVmaW5lIE1BWF9BUF9DQUNIRV9QRVJfU0NBTiBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfQVBfQ0FDSEVfUEVSX1NDQU4KKyNkZWZpbmUgTUFYX1JTU0lfU0FNUExFX1NJWkUgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX1JTU0lfU0FNUExFX1NJWkUKKyNkZWZpbmUgTUFYX1NDQU5fUlBUX1RIUkhPTEQgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX1NDQU5fUkVQT1JUSU5HX1RIUkVTSE9MRAorI2RlZmluZSBNQVhfSE9UTElTVF9CU1NJRFMgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX0hPVExJU1RfQlNTSURTCisjZGVmaW5lIE1BWF9TSUdOSUZJQ0FOVF9XSUZJX0NIQU5HRV9BUFMgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX1NJR05JRklDQU5UX1dJRklfQ0hBTkdFX0FQUworI2RlZmluZSBNQVhfQlNTSURfSElTVE9SWV9FTlRSSUVTIFwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1JFU1VMVFNfQ0FQQUJJTElUSUVTX01BWF9CU1NJRF9ISVNUT1JZX0VOVFJJRVMKKyNkZWZpbmUgTUFYX0hPVExJU1RfU1NJRFMgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX0hPVExJU1RfU1NJRFMKKyNkZWZpbmUgTUFYX05VTV9FUE5PX05FVFMgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DQVBBQklMSVRJRVNfTUFYX05VTV9FUE5PX05FVFMKKyNkZWZpbmUgTUFYX05VTV9FUE5PX05FVFNfQllfU1NJRCBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfTlVNX0VQTk9fTkVUU19CWV9TU0lECisjZGVmaW5lIE1BWF9OVU1fV0hJVEVMSVNURURfU1NJRCBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9SRVNVTFRTX0NBUEFCSUxJVElFU19NQVhfTlVNX1dISVRFTElTVEVEX1NTSUQKKworLyoqCisgKiB3bGFuX2hkZF9zZW5kX2V4dF9zY2FuX2NhcGFiaWxpdHkgLSBzZW5kIGV4dCBzY2FuIGNhcGFiaWxpdHkgdG8gdXNlciBzcGFjZQorICogQGhkZF9jdHg6IFBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfc2VuZF9leHRfc2Nhbl9jYXBhYmlsaXR5KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBleHRfc2Nhbl9jYXBhYmlsaXRpZXNfcmVzcG9uc2UgKmRhdGE7CisJdWludDMyX3QgbmxfYnVmX2xlbjsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiaGRkX2NvbnRleHQgaXMgaW52YWxpZCIpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkYXRhID0gJihleHRfc2Nhbl9jb250ZXh0LmNhcGFiaWxpdHlfcmVzcG9uc2UpOworCisJbmxfYnVmX2xlbiA9IE5MTVNHX0hEUkxFTjsKKwlubF9idWZfbGVuICs9IChzaXplb2YoZGF0YS0+cmVxdWVzdElkKSArIE5MQV9IRFJMRU4pICsKKwkoc2l6ZW9mKGRhdGEtPnN0YXR1cykgKyBOTEFfSERSTEVOKSArCisJKHNpemVvZihkYXRhLT5tYXhfc2Nhbl9jYWNoZV9zaXplKSArIE5MQV9IRFJMRU4pICsKKwkoc2l6ZW9mKGRhdGEtPm1heF9zY2FuX2J1Y2tldHMpICsgTkxBX0hEUkxFTikgKworCShzaXplb2YoZGF0YS0+bWF4X2FwX2NhY2hlX3Blcl9zY2FuKSArIE5MQV9IRFJMRU4pICsKKwkoc2l6ZW9mKGRhdGEtPm1heF9yc3NpX3NhbXBsZV9zaXplKSArIE5MQV9IRFJMRU4pICsKKwkoc2l6ZW9mKGRhdGEtPm1heF9zY2FuX3JlcG9ydGluZ190aHJlc2hvbGQpICsgTkxBX0hEUkxFTikgKworCShzaXplb2YoZGF0YS0+bWF4X2hvdGxpc3RfYnNzaWRzKSArIE5MQV9IRFJMRU4pICsKKwkoc2l6ZW9mKGRhdGEtPm1heF9zaWduaWZpY2FudF93aWZpX2NoYW5nZV9hcHMpICsgTkxBX0hEUkxFTikgKworCShzaXplb2YoZGF0YS0+bWF4X2Jzc2lkX2hpc3RvcnlfZW50cmllcykgKyBOTEFfSERSTEVOKSArCisJKHNpemVvZihkYXRhLT5tYXhfaG90bGlzdF9zc2lkcykgKyBOTEFfSERSTEVOKSArCisJKHNpemVvZihkYXRhLT5tYXhfbnVtYmVyX2Vwbm9fbmV0d29ya3MpICsgTkxBX0hEUkxFTikgKworCShzaXplb2YoZGF0YS0+bWF4X251bWJlcl9lcG5vX25ldHdvcmtzX2J5X3NzaWQpICsgTkxBX0hEUkxFTikgKworCShzaXplb2YoZGF0YS0+bWF4X251bWJlcl9vZl93aGl0ZV9saXN0ZWRfc3NpZCkgKyBOTEFfSERSTEVOKTsKKworCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiKGhkZF9jdHgtPndpcGh5LCBubF9idWZfbGVuKTsKKworCWlmICghc2tiKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2IgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKworCWhkZExvZyhMT0cxLCAiUmVxIElkICV1IiwgZGF0YS0+cmVxdWVzdElkKTsKKwloZGRMb2coTE9HMSwgIlN0YXR1cyAldSIsIGRhdGEtPnN0YXR1cyk7CisJaGRkTG9nKExPRzEsICJTY2FuIGNhY2hlIHNpemUgJXUiLAorCSAgICAgICBkYXRhLT5tYXhfc2Nhbl9jYWNoZV9zaXplKTsKKwloZGRMb2coTE9HMSwgIlNjYW4gYnVja2V0cyAldSIsIGRhdGEtPm1heF9zY2FuX2J1Y2tldHMpOworCWhkZExvZyhMT0cxLCAiTWF4IEFQIHBlciBzY2FuICV1IiwKKwkgICAgICAgZGF0YS0+bWF4X2FwX2NhY2hlX3Blcl9zY2FuKTsKKwloZGRMb2coTE9HMSwgIm1heF9yc3NpX3NhbXBsZV9zaXplICV1IiwKKwkgICAgICAgZGF0YS0+bWF4X3Jzc2lfc2FtcGxlX3NpemUpOworCWhkZExvZyhMT0cxLCAibWF4X3NjYW5fcmVwb3J0aW5nX3RocmVzaG9sZCAldSIsCisJICAgICAgIGRhdGEtPm1heF9zY2FuX3JlcG9ydGluZ190aHJlc2hvbGQpOworCWhkZExvZyhMT0cxLCAibWF4X2hvdGxpc3RfYnNzaWRzICV1IiwKKwkgICAgICAgZGF0YS0+bWF4X2hvdGxpc3RfYnNzaWRzKTsKKwloZGRMb2coTE9HMSwgIm1heF9zaWduaWZpY2FudF93aWZpX2NoYW5nZV9hcHMgJXUiLAorCSAgICAgICBkYXRhLT5tYXhfc2lnbmlmaWNhbnRfd2lmaV9jaGFuZ2VfYXBzKTsKKwloZGRMb2coTE9HMSwgIm1heF9ic3NpZF9oaXN0b3J5X2VudHJpZXMgJXUiLAorCSAgICAgICBkYXRhLT5tYXhfYnNzaWRfaGlzdG9yeV9lbnRyaWVzKTsKKwloZGRMb2coTE9HMSwgIm1heF9ob3RsaXN0X3NzaWRzICV1IiwgZGF0YS0+bWF4X2hvdGxpc3Rfc3NpZHMpOworCWhkZExvZyhMT0cxLCAibWF4X251bWJlcl9lcG5vX25ldHdvcmtzICV1IiwKKwkJCQkJZGF0YS0+bWF4X251bWJlcl9lcG5vX25ldHdvcmtzKTsKKwloZGRMb2coTE9HMSwgIm1heF9udW1iZXJfZXBub19uZXR3b3Jrc19ieV9zc2lkICV1IiwKKwkJCQkJZGF0YS0+bWF4X251bWJlcl9lcG5vX25ldHdvcmtzX2J5X3NzaWQpOworCWhkZExvZyhMT0cxLCAibWF4X251bWJlcl9vZl93aGl0ZV9saXN0ZWRfc3NpZCAldSIsCisJCQkJCWRhdGEtPm1heF9udW1iZXJfb2Zfd2hpdGVfbGlzdGVkX3NzaWQpOworCisJaWYgKG5sYV9wdXRfdTMyKHNrYiwgUEFSQU1fUkVRVUVTVF9JRCwgZGF0YS0+cmVxdWVzdElkKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIFBBUkFNX1NUQVRVUywgZGF0YS0+c3RhdHVzKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIE1BWF9TQ0FOX0NBQ0hFX1NJWkUsIGRhdGEtPm1heF9zY2FuX2NhY2hlX3NpemUpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgTUFYX1NDQU5fQlVDS0VUUywgZGF0YS0+bWF4X3NjYW5fYnVja2V0cykgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBNQVhfQVBfQ0FDSEVfUEVSX1NDQU4sCisJCQlkYXRhLT5tYXhfYXBfY2FjaGVfcGVyX3NjYW4pIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgTUFYX1JTU0lfU0FNUExFX1NJWkUsCisJCQlkYXRhLT5tYXhfcnNzaV9zYW1wbGVfc2l6ZSkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBNQVhfU0NBTl9SUFRfVEhSSE9MRCwKKwkJCWRhdGEtPm1heF9zY2FuX3JlcG9ydGluZ190aHJlc2hvbGQpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgTUFYX0hPVExJU1RfQlNTSURTLCBkYXRhLT5tYXhfaG90bGlzdF9ic3NpZHMpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgTUFYX1NJR05JRklDQU5UX1dJRklfQ0hBTkdFX0FQUywKKwkJCWRhdGEtPm1heF9zaWduaWZpY2FudF93aWZpX2NoYW5nZV9hcHMpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgTUFYX0JTU0lEX0hJU1RPUllfRU5UUklFUywKKwkJCWRhdGEtPm1heF9ic3NpZF9oaXN0b3J5X2VudHJpZXMpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgTUFYX0hPVExJU1RfU1NJRFMsCWRhdGEtPm1heF9ob3RsaXN0X3NzaWRzKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIE1BWF9OVU1fRVBOT19ORVRTLAorCQkJZGF0YS0+bWF4X251bWJlcl9lcG5vX25ldHdvcmtzKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIE1BWF9OVU1fRVBOT19ORVRTX0JZX1NTSUQsCisJCQlkYXRhLT5tYXhfbnVtYmVyX2Vwbm9fbmV0d29ya3NfYnlfc3NpZCkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBNQVhfTlVNX1dISVRFTElTVEVEX1NTSUQsCisJCWRhdGEtPm1heF9udW1iZXJfb2Zfd2hpdGVfbGlzdGVkX3NzaWQpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIm5sYSBwdXQgZmFpbCIpKTsKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KKworCWNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkoc2tiKTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAtRUlOVkFMOworfQorLyoKKyAqIGRvbmUgd2l0aCBzaG9ydCBuYW1lcyBmb3IgdGhlIGdsb2JhbCB2ZW5kb3IgcGFyYW1zCisgKiB1c2VkIGJ5IHdsYW5faGRkX3NlbmRfZXh0X3NjYW5fY2FwYWJpbGl0eSgpCisgKi8KKyN1bmRlZiBQQVJBTV9SRVFVRVNUX0lECisjdW5kZWYgUEFSQU1fU1RBVFVTCisjdW5kZWYgTUFYX1NDQU5fQ0FDSEVfU0laRQorI3VuZGVmIE1BWF9TQ0FOX0JVQ0tFVFMKKyN1bmRlZiBNQVhfQVBfQ0FDSEVfUEVSX1NDQU4KKyN1bmRlZiBNQVhfUlNTSV9TQU1QTEVfU0laRQorI3VuZGVmIE1BWF9TQ0FOX1JQVF9USFJIT0xECisjdW5kZWYgTUFYX0hPVExJU1RfQlNTSURTCisjdW5kZWYgTUFYX1NJR05JRklDQU5UX1dJRklfQ0hBTkdFX0FQUworI3VuZGVmIE1BWF9CU1NJRF9ISVNUT1JZX0VOVFJJRVMKKyN1bmRlZiBNQVhfSE9UTElTVF9TU0lEUworI3VuZGVmIE1BWF9OVU1fRVBOT19ORVRTCisjdW5kZWYgTUFYX05VTV9FUE5PX05FVFNfQllfU1NJRAorI3VuZGVmIE1BWF9OVU1fV0hJVEVMSVNURURfU1NJRAorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZXRfY2FwYWJpbGl0aWVzKCkgLSBnZXQgZXh0IHNjYW4gY2FwYWJpbGl0aWVzCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3aXJlbGVzcyBkZXZpY2UKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fZ2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgcmM7CisJc3RydWN0IGhkZF9leHRfc2Nhbl9jb250ZXh0ICpjb250ZXh0OworCXRwU2lyR2V0RXh0U2NhbkNhcGFiaWxpdGllc1JlcVBhcmFtcyBwUmVxTXNnID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBubGF0dHIgKnRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9NQVggKworCQkJICAxXTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChubGFfcGFyc2UodGIsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9NQVgsCisJCSAgICAgIGRhdGEsIGRhdGFfbGVuLCB3bGFuX2hkZF9leHRzY2FuX2NvbmZpZ19wb2xpY3kpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBBVFRSIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwUmVxTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwUmVxTXNnKSk7CisJaWYgKCFwUmVxTXNnKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggcmVxdWVzdCBJZCAqLworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX1JFUVVFU1RfSURdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciByZXF1ZXN0IGlkIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKworCXBSZXFNc2ctPnJlcXVlc3RJZCA9CisJCW5sYV9nZXRfdTMyKHRiCisJCSBbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX1JFUVVFU1RfSURdKTsKKwlwUmVxTXNnLT5zZXNzaW9uSWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCWhkZExvZyhMT0cxLCBGTCgiUmVxIElkICVkIFNlc3Npb24gSWQgJWQiKSwKKwkJcFJlcU1zZy0+cmVxdWVzdElkLCBwUmVxTXNnLT5zZXNzaW9uSWQpOworCisJY29udGV4dCA9ICZleHRfc2Nhbl9jb250ZXh0OworCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwljb250ZXh0LT5yZXF1ZXN0X2lkID0gcFJlcU1zZy0+cmVxdWVzdElkOworCUlOSVRfQ09NUExFVElPTihjb250ZXh0LT5yZXNwb25zZV9ldmVudCk7CisJc3Bpbl91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisKKwlzdGF0dXMgPSBzbWVfZXh0X3NjYW5fZ2V0X2NhcGFiaWxpdGllcyhwSGRkQ3R4LT5oSGFsLCBwUmVxTXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgic21lX2V4dF9zY2FuX2dldF9jYXBhYmlsaXRpZXMgZmFpbGVkKGVycj0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udGV4dC0+cmVzcG9uc2VfZXZlbnQsCisJCW1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRVhUU0NBTikpOworCWlmICghcmMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJUYXJnZXQgcmVzcG9uc2UgdGltZWQgb3V0IikpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXQgPSB3bGFuX2hkZF9zZW5kX2V4dF9zY2FuX2NhcGFiaWxpdHkocEhkZEN0eCk7CisJaWYgKHJldCkKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gc2VuZCBleHQgc2NhbiBjYXBhYmlsaXR5IHRvIHVzZXIgc3BhY2UiKSk7CisKKwlyZXR1cm4gcmV0OworZmFpbDoKKwljZGZfbWVtX2ZyZWUocFJlcU1zZyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZXRfY2FwYWJpbGl0aWVzKCkgLSBnZXQgZXh0IHNjYW4gY2FwYWJpbGl0aWVzCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdkZXYKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2dldF9jYXBhYmlsaXRpZXMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCQljb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZXRfY2FwYWJpbGl0aWVzKHdpcGh5LCB3ZGV2LCBkYXRhLAorCQlkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGRlZmluZSBzaG9ydCBuYW1lcyBmb3IgdGhlIGdsb2JhbCB2ZW5kb3IgcGFyYW1zCisgKiB1c2VkIGJ5IHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fZ2V0X2NhY2hlZF9yZXN1bHRzKCkKKyAqLworI2RlZmluZSBQQVJBTV9NQVggXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9NQVgKKyNkZWZpbmUgUEFSQU1fUkVRVUVTVF9JRCBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX1JFUVVFU1RfSUQKKyNkZWZpbmUgUEFSQU1fRkxVU0ggXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fR0VUX0NBQ0hFRF9TQ0FOX1JFU1VMVFNfQ09ORklHX1BBUkFNX0ZMVVNICisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHMoKSAtIGV4dHNjYW4gZ2V0IGNhY2hlZCByZXN1bHRzCisgKiBAd2lwaHk6IHdpcGh5IHBvaW50ZXIKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHN0cnVjdCB3aXJlbGVzc19kZXYKKyAqIEBkYXRhOiBwb2ludGVyIHRvIGluY29taW5nIE5MIHZlbmRvciBkYXRhCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZiBAZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBpbmNvbWluZyBOTCB2ZW5kb3IgY29tbWFuZCBkYXRhIGF0dHJpYnV0ZXMgYW5kCisgKiBpbnZva2VzIHRoZSBTTUUgQXBpIGFuZCBibG9ja3Mgb24gYSBjb21wbGV0aW9uIHZhcmlhYmxlLgorICogRWFjaCBXTUkgZXZlbnQgd2l0aCBjYWNoZWQgc2NhbiByZXN1bHRzIGRhdGEgY2h1bmsgcmVzdWx0cyBpbgorICogZnVuY3Rpb24gY2FsbCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2luZCBhbmQgZWFjaAorICogZGF0YSBjaHVuayBpcyBzZW50IHVwIHRoZSBsYXllciBpbiBjZmc4MDIxMV92ZW5kb3JfY21kX2FsbG9jX3JlcGx5X3NrYi4KKyAqCisgKiBJZiB0aW1lb3V0IGhhcHBlbnMgYmVmb3JlIHJlY2VpdmluZyBhbGwgb2YgdGhlIGRhdGEsIHRoaXMgZnVuY3Rpb24gc2V0cworICogYSBjb250ZXh0IHZhcmlhYmxlIEBpZ25vcmVfY2FjaGVkX3Jlc3VsdHMgdG8gJXRydWUsIGFsbCBvZiB0aGUgbmV4dCBkYXRhCisgKiBjaHVua3MgYXJlIGNoZWNrZWQgYWdhaW5zdCB0aGlzIHZhcmlhYmxlIGFuZCBkcm9wcGVkLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBlcnJvciBudW1iZXIgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2CisJCQkJCQkgKndkZXYsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCQkgaW50IGRhdGFfbGVuKQoreworCXRwU2lyRXh0U2NhbkdldENhY2hlZFJlc3VsdHNSZXFQYXJhbXMgcFJlcU1zZyA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fTUFYICsKKwkJCSAgMV07CisJc3RydWN0IGhkZF9leHRfc2Nhbl9jb250ZXh0ICpjb250ZXh0OworCUNERl9TVEFUVVMgc3RhdHVzOworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgcmM7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldHZhbCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gcmV0dmFsKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiLCBQQVJBTV9NQVgsIGRhdGEsIGRhdGFfbGVuLAorCQl3bGFuX2hkZF9leHRzY2FuX2NvbmZpZ19wb2xpY3kpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBBVFRSIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwUmVxTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwUmVxTXNnKSk7CisJaWYgKCFwUmVxTXNnKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggcmVxdWVzdCBJZCAqLworCWlmICghdGJbUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJcFJlcU1zZy0+cmVxdWVzdElkID0gbmxhX2dldF91MzIodGJbUEFSQU1fUkVRVUVTVF9JRF0pOworCXBSZXFNc2ctPnNlc3Npb25JZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisJaGRkTG9nKExPRzEsIEZMKCJSZXEgSWQgJWQgU2Vzc2lvbiBJZCAlZCIpLAorCQlwUmVxTXNnLT5yZXF1ZXN0SWQsIHBSZXFNc2ctPnNlc3Npb25JZCk7CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggZmx1c2ggcGFyYW1ldGVyICovCisJaWYgKCF0YltQQVJBTV9GTFVTSF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIGZsdXNoIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKwlwUmVxTXNnLT5mbHVzaCA9IG5sYV9nZXRfdTgodGJbUEFSQU1fRkxVU0hdKTsKKwloZGRMb2coTE9HMSwgRkwoIkZsdXNoICVkIiksIHBSZXFNc2ctPmZsdXNoKTsKKworCWNvbnRleHQgPSAmZXh0X3NjYW5fY29udGV4dDsKKwlzcGluX2xvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisJY29udGV4dC0+cmVxdWVzdF9pZCA9IHBSZXFNc2ctPnJlcXVlc3RJZDsKKwljb250ZXh0LT5pZ25vcmVfY2FjaGVkX3Jlc3VsdHMgPSBmYWxzZTsKKwlJTklUX0NPTVBMRVRJT04oY29udGV4dC0+cmVzcG9uc2VfZXZlbnQpOworCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJc3RhdHVzID0gc21lX2dldF9jYWNoZWRfcmVzdWx0cyhwSGRkQ3R4LT5oSGFsLCBwUmVxTXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoInNtZV9nZXRfY2FjaGVkX3Jlc3VsdHMgZmFpbGVkKGVycj0lZCkiKSwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0KKworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb250ZXh0LT5yZXNwb25zZV9ldmVudCwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRVhUU0NBTikpOworCWlmICghcmMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJUYXJnZXQgcmVzcG9uc2UgdGltZWQgb3V0IikpOworCQlyZXR2YWwgPSAtRVRJTUVET1VUOworCQlzcGluX2xvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisJCWNvbnRleHQtPmlnbm9yZV9jYWNoZWRfcmVzdWx0cyA9IHRydWU7CisJCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwkJcmV0dmFsID0gY29udGV4dC0+cmVzcG9uc2Vfc3RhdHVzOworCQlzcGluX3VubG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworCitmYWlsOgorCWNkZl9tZW1fZnJlZShwUmVxTXNnKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKy8qCisgKiBkb25lIHdpdGggc2hvcnQgbmFtZXMgZm9yIHRoZSBnbG9iYWwgdmVuZG9yIHBhcmFtcworICogdXNlZCBieSB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2dldF9jYWNoZWRfcmVzdWx0cygpCisgKi8KKyN1bmRlZiBQQVJBTV9NQVgKKyN1bmRlZiBQQVJBTV9SRVFVRVNUX0lECisjdW5kZWYgUEFSQU1fRkxVU0gKKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2dldF9jYWNoZWRfcmVzdWx0cygpIC0gZXh0c2NhbiBnZXQgY2FjaGVkIHJlc3VsdHMKKyAqIEB3aXBoeTogd2lwaHkgcG9pbnRlcgorICogQHdkZXY6IHBvaW50ZXIgdG8gc3RydWN0IHdpcmVsZXNzX2RldgorICogQGRhdGE6IHBvaW50ZXIgdG8gaW5jb21pbmcgTkwgdmVuZG9yIGRhdGEKKyAqIEBkYXRhX2xlbjogbGVuZ3RoIG9mIEBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIGluY29taW5nIE5MIHZlbmRvciBjb21tYW5kIGRhdGEgYXR0cmlidXRlcyBhbmQKKyAqIGludm9rZXMgdGhlIFNNRSBBcGkgYW5kIGJsb2NrcyBvbiBhIGNvbXBsZXRpb24gdmFyaWFibGUuCisgKiBFYWNoIFdNSSBldmVudCB3aXRoIGNhY2hlZCBzY2FuIHJlc3VsdHMgZGF0YSBjaHVuayByZXN1bHRzIGluCisgKiBmdW5jdGlvbiBjYWxsIHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fY2FjaGVkX3Jlc3VsdHNfaW5kIGFuZCBlYWNoCisgKiBkYXRhIGNodW5rIGlzIHNlbnQgdXAgdGhlIGxheWVyIGluIGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiLgorICoKKyAqIElmIHRpbWVvdXQgaGFwcGVucyBiZWZvcmUgcmVjZWl2aW5nIGFsbCBvZiB0aGUgZGF0YSwgdGhpcyBmdW5jdGlvbiBzZXRzCisgKiBhIGNvbnRleHQgdmFyaWFibGUgQGlnbm9yZV9jYWNoZWRfcmVzdWx0cyB0byAldHJ1ZSwgYWxsIG9mIHRoZSBuZXh0IGRhdGEKKyAqIGNodW5rcyBhcmUgY2hlY2tlZCBhZ2FpbnN0IHRoaXMgdmFyaWFibGUgYW5kIGRyb3BwZWQuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IGVycm9yIG51bWJlciBvdGhlcndpc2UuCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2dldF9jYWNoZWRfcmVzdWx0cyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQljb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHMod2lwaHksIHdkZXYsIGRhdGEsCisJCQkJCQkJCWRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zZXRfYnNzaWRfaG90bGlzdCgpIC0gc2V0IGJzc2lkIGhvdCBsaXN0CisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3aXJlbGVzcyBkZXZpY2UKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NldF9ic3NpZF9ob3RsaXN0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2CisJCQkJCQkqd2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCWludCBkYXRhX2xlbikKK3sKKwl0cFNpckV4dFNjYW5TZXRCc3NpZEhvdExpc3RSZXFQYXJhbXMgcFJlcU1zZyA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fTUFYICsKKwkJCSAgMV07CisJc3RydWN0IG5sYXR0ciAqdGIyW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9NQVgKKwkJCSAgICsgMV07CisJc3RydWN0IG5sYXR0ciAqYXBUaDsKKwlzdHJ1Y3QgaGRkX2V4dF9zY2FuX2NvbnRleHQgKmNvbnRleHQ7CisJdWludDMyX3QgcmVxdWVzdF9pZDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl1aW50OF90IGk7CisJaW50IHJlbSwgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgcmM7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldHZhbCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gcmV0dmFsKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fTUFYLAorCQkgICAgICBkYXRhLCBkYXRhX2xlbiwgd2xhbl9oZGRfZXh0c2Nhbl9jb25maWdfcG9saWN5KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcFJlcU1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcFJlcU1zZykpOworCWlmICghcFJlcU1zZykgeworCQloZGRMb2coTE9HRSwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUGFyc2UgYW5kIGZldGNoIHJlcXVlc3QgSWQgKi8KKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9SRVFVRVNUX0lEXSkgeworCQloZGRMb2coTE9HRSwgRkwoImF0dHIgcmVxdWVzdCBpZCBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwUmVxTXNnLT5yZXF1ZXN0SWQgPQorCQlubGFfZ2V0X3UzMih0YgorCQkgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9SRVFVRVNUX0lEXSk7CisJaGRkTG9nKExPRzEsIEZMKCJSZXEgSWQgJWQiKSwgcFJlcU1zZy0+cmVxdWVzdElkKTsKKworCS8qIFBhcnNlIGFuZCBmZXRjaCBudW1iZXIgb2YgQVBzICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JTU0lEX0hPVExJU1RfUEFSQU1TX05VTV9BUF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIG51bWJlciBvZiBBUCBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJcFJlcU1zZy0+bnVtQXAgPQorCQlubGFfZ2V0X3UzMih0YgorCQkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlNTSURfSE9UTElTVF9QQVJBTVNfTlVNX0FQXSk7CisJcFJlcU1zZy0+c2Vzc2lvbklkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsKKwloZGRMb2coTE9HMSwgRkwoIk51bWJlciBvZiBBUCAlZCBTZXNzaW9uIElkICVkIiksCisJCXBSZXFNc2ctPm51bUFwLCBwUmVxTXNnLT5zZXNzaW9uSWQpOworCisJLyogUGFyc2UgYW5kIGZldGNoIGxvc3QgYXAgc2FtcGxlIHNpemUgKi8KKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlNTSURfSE9UTElTVF9QQVJBTVNfTE9TVF9BUF9TQU1QTEVfU0laRV0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIGxvc3QgYXAgc2FtcGxlIHNpemUgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJcFJlcU1zZy0+bG9zdF9hcF9zYW1wbGVfc2l6ZSA9IG5sYV9nZXRfdTMyKAorCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JTU0lEX0hPVExJU1RfUEFSQU1TX0xPU1RfQVBfU0FNUExFX1NJWkVdKTsKKwloZGRMb2coTE9HMSwgRkwoIkxvc3QgYXAgc2FtcGxlIHNpemUgJWQiKSwKKwkJCXBSZXFNc2ctPmxvc3RfYXBfc2FtcGxlX3NpemUpOworCisJaSA9IDA7CisJbmxhX2Zvcl9lYWNoX25lc3RlZChhcFRoLAorCQkJICAgIHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNXSwKKwkJCSAgICByZW0pIHsKKwkJaWYgKG5sYV9wYXJzZQorCQkgICAgKHRiMiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCwKKwkJICAgIG5sYV9kYXRhKGFwVGgpLCBubGFfbGVuKGFwVGgpLAorCQkgICAgd2xhbl9oZGRfZXh0c2Nhbl9jb25maWdfcG9saWN5KSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJubGFfcGFyc2UgZmFpbGVkIikpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJLyogUGFyc2UgYW5kIGZldGNoIE1BQyBhZGRyZXNzICovCisJCWlmICghdGIyW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNX0JTU0lEXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIG1hYyBhZGRyZXNzIGZhaWxlZCIpKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlubGFfbWVtY3B5KHBSZXFNc2ctPmFwW2ldLmJzc2lkLmJ5dGVzLAorCQkJdGIyCisJCQlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9BUF9USFJFU0hPTERfUEFSQU1fQlNTSURdLAorCQkJICAgQ0RGX01BQ19BRERSX1NJWkUpOworCQloZGRMb2coTE9HMSwgTUFDX0FERFJFU1NfU1RSLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkocFJlcU1zZy0+YXBbaV0uYnNzaWQuYnl0ZXMpKTsKKworCQkvKiBQYXJzZSBhbmQgZmV0Y2ggbG93IFJTU0kgKi8KKwkJaWYgKCF0YjIKKwkJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0FQX1RIUkVTSE9MRF9QQVJBTV9SU1NJX0xPV10pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBsb3cgUlNTSSBmYWlsZWQiKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcFJlcU1zZy0+YXBbaV0ubG93ID0KKwkJCW5sYV9nZXRfczMyKHRiMgorCQkJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0FQX1RIUkVTSE9MRF9QQVJBTV9SU1NJX0xPV10pOworCQloZGRMb2coTE9HMSwgRkwoIlJTU0kgbG93ICVkIiksIHBSZXFNc2ctPmFwW2ldLmxvdyk7CisKKwkJLyogUGFyc2UgYW5kIGZldGNoIGhpZ2ggUlNTSSAqLworCQlpZiAoIXRiMgorCQkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNX1JTU0lfSElHSF0pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBoaWdoIFJTU0kgZmFpbGVkIikpOworCQkJZ290byBmYWlsOworCQl9CisJCXBSZXFNc2ctPmFwW2ldLmhpZ2ggPQorCQkJbmxhX2dldF9zMzIodGIyCisJCQkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNX1JTU0lfSElHSF0pOworCQloZGRMb2coTE9HMSwgRkwoIlJTU0kgSGlnaCAlZCIpLCBwUmVxTXNnLT5hcFtpXS5oaWdoKTsKKworCQlpKys7CisJfQorCisJY29udGV4dCA9ICZleHRfc2Nhbl9jb250ZXh0OworCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwlJTklUX0NPTVBMRVRJT04oY29udGV4dC0+cmVzcG9uc2VfZXZlbnQpOworCWNvbnRleHQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkID0gcFJlcU1zZy0+cmVxdWVzdElkOworCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJc3RhdHVzID0gc21lX3NldF9ic3NfaG90bGlzdChwSGRkQ3R4LT5oSGFsLCBwUmVxTXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgic21lX3NldF9ic3NfaG90bGlzdCBmYWlsZWQoZXJyPSVkKSIpLCBzdGF0dXMpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogcmVxdWVzdCB3YXMgc2VudCAtLSB3YWl0IGZvciB0aGUgcmVzcG9uc2UgKi8KKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dAorCQkoJmNvbnRleHQtPnJlc3BvbnNlX2V2ZW50LAorCQkgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9FWFRTQ0FOKSk7CisKKwlpZiAoIXJjKSB7CisJCWhkZExvZyhMT0dFLCBGTCgic21lX3NldF9ic3NfaG90bGlzdCB0aW1lZCBvdXQiKSk7CisJCXJldHZhbCA9IC1FVElNRURPVVQ7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCQlpZiAoY29udGV4dC0+cmVxdWVzdF9pZCA9PSByZXF1ZXN0X2lkKQorCQkJcmV0dmFsID0gY29udGV4dC0+cmVzcG9uc2Vfc3RhdHVzOworCQllbHNlCisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQlzcGluX3VubG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworCitmYWlsOgorCWNkZl9tZW1fZnJlZShwUmVxTXNnKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NldF9ic3NpZF9ob3RsaXN0KCkgLSBzZXQgZXh0IHNjYW4gYnNzaWQgaG90bGlzdAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3ZGV2CisgKiBAZGF0YTogUG9pbnRlciB0byBkYXRhCisgKiBAZGF0YV9sZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zZXRfYnNzaWRfaG90bGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQljb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zZXRfYnNzaWRfaG90bGlzdCh3aXBoeSwgd2RldiwgZGF0YSwKKwkJCQkJZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc2V0X3NpZ25pZmljYW50X2NoYW5nZSAoKSAtIHNldCBzaWduaWZpY2FudCBjaGFuZ2UKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXJlbGVzcyBwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdpcmVsZXNzIGRldmljZQorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW50CitfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc2V0X3NpZ25pZmljYW50X2NoYW5nZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2CisJCQkJCQkgICAgICp3ZGV2LCBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkJICAgICBpbnQgZGF0YV9sZW4pCit7CisJdHBTaXJFeHRTY2FuU2V0U2lnQ2hhbmdlUmVxUGFyYW1zIHBSZXFNc2cgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCArCisJCQkgIDFdOworCXN0cnVjdCBubGF0dHIgKnRiMltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fTUFYCisJCQkgICArIDFdOworCXN0cnVjdCBubGF0dHIgKmFwVGg7CisJc3RydWN0IGhkZF9leHRfc2Nhbl9jb250ZXh0ICpjb250ZXh0OworCXVpbnQzMl90IHJlcXVlc3RfaWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCBpOworCWludCByZW0sIHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIHJjOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZF9lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR2YWwgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHJldHZhbCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCwKKwkJICAgICAgZGF0YSwgZGF0YV9sZW4sIHdsYW5faGRkX2V4dHNjYW5fY29uZmlnX3BvbGljeSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIEFUVFIiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBSZXFNc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnBSZXFNc2cpKTsKKwlpZiAoIXBSZXFNc2cpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjZGZfbWVtX21hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFBhcnNlIGFuZCBmZXRjaCByZXF1ZXN0IElkICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJcFJlcU1zZy0+cmVxdWVzdElkID0KKwkJbmxhX2dldF91MzIodGIKKwkJIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRF0pOworCWhkZExvZyhMT0cxLCBGTCgiUmVxIElkICVkIiksIHBSZXFNc2ctPnJlcXVlc3RJZCk7CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggUlNTSSBzYW1wbGUgc2l6ZSAqLworCWlmICghdGIKKwkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0lHTklGSUNBTlRfQ0hBTkdFX1BBUkFNU19SU1NJX1NBTVBMRV9TSVpFXSkgeworCQloZGRMb2coTE9HRSwgRkwoImF0dHIgUlNTSSBzYW1wbGUgc2l6ZSBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJcFJlcU1zZy0+cnNzaVNhbXBsZVNpemUgPQorCQlubGFfZ2V0X3UzMih0YgorCQkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0lHTklGSUNBTlRfQ0hBTkdFX1BBUkFNU19SU1NJX1NBTVBMRV9TSVpFXSk7CisJaGRkTG9nKExPRzEsIEZMKCJSU1NJIHNhbXBsZSBzaXplICV1IiksIHBSZXFNc2ctPnJzc2lTYW1wbGVTaXplKTsKKworCS8qIFBhcnNlIGFuZCBmZXRjaCBsb3N0IEFQIHNhbXBsZSBzaXplICovCisJaWYgKCF0YgorCSAgICBbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TSUdOSUZJQ0FOVF9DSEFOR0VfUEFSQU1TX0xPU1RfQVBfU0FNUExFX1NJWkVdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBsb3N0IEFQIHNhbXBsZSBzaXplIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKwlwUmVxTXNnLT5sb3N0QXBTYW1wbGVTaXplID0KKwkJbmxhX2dldF91MzIodGIKKwkJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRV9QQVJBTVNfTE9TVF9BUF9TQU1QTEVfU0laRV0pOworCWhkZExvZyhMT0cxLCBGTCgiTG9zdCBBUCBzYW1wbGUgc2l6ZSAldSIpLCBwUmVxTXNnLT5sb3N0QXBTYW1wbGVTaXplKTsKKworCS8qIFBhcnNlIGFuZCBmZXRjaCBBUCBtaW4gYnJlYWNpbmcgKi8KKwlpZiAoIXRiCisJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRV9QQVJBTVNfTUlOX0JSRUFDSElOR10pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIEFQIG1pbiBicmVhY2hpbmciKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJcFJlcU1zZy0+bWluQnJlYWNoaW5nID0KKwkJbmxhX2dldF91MzIodGIKKwkJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRV9QQVJBTVNfTUlOX0JSRUFDSElOR10pOworCWhkZExvZyhMT0cxLCBGTCgiQVAgbWluIGJyZWFjaGluZyAldSIpLCBwUmVxTXNnLT5taW5CcmVhY2hpbmcpOworCisJLyogUGFyc2UgYW5kIGZldGNoIG51bWJlciBvZiBBUHMgKi8KKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0lHTklGSUNBTlRfQ0hBTkdFX1BBUkFNU19OVU1fQVBdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBudW1iZXIgb2YgQVAgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCXBSZXFNc2ctPm51bUFwID0KKwkJbmxhX2dldF91MzIodGIKKwkJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NJR05JRklDQU5UX0NIQU5HRV9QQVJBTVNfTlVNX0FQXSk7CisJcFJlcU1zZy0+c2Vzc2lvbklkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsKKwloZGRMb2coTE9HMSwgRkwoIk51bWJlciBvZiBBUCAlZCBTZXNzaW9uIElkICVkIiksCisJCXBSZXFNc2ctPm51bUFwLCBwUmVxTXNnLT5zZXNzaW9uSWQpOworCisJaSA9IDA7CisJbmxhX2Zvcl9lYWNoX25lc3RlZChhcFRoLAorCQkJICAgIHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNXSwKKwkJCSAgICByZW0pIHsKKwkJaWYgKG5sYV9wYXJzZQorCQkgICAgKHRiMiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCwKKwkJICAgIG5sYV9kYXRhKGFwVGgpLCBubGFfbGVuKGFwVGgpLAorCQkgICAgd2xhbl9oZGRfZXh0c2Nhbl9jb25maWdfcG9saWN5KSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJubGFfcGFyc2UgZmFpbGVkIikpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJLyogUGFyc2UgYW5kIGZldGNoIE1BQyBhZGRyZXNzICovCisJCWlmICghdGIyW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNX0JTU0lEXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIG1hYyBhZGRyZXNzIGZhaWxlZCIpKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlubGFfbWVtY3B5KHBSZXFNc2ctPmFwW2ldLmJzc2lkLmJ5dGVzLAorCQkJICAgdGIyCisJCQkgICBbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9BUF9USFJFU0hPTERfUEFSQU1fQlNTSURdLAorCQkJICAgQ0RGX01BQ19BRERSX1NJWkUpOworCQloZGRMb2coTE9HMSwgTUFDX0FERFJFU1NfU1RSLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkocFJlcU1zZy0+YXBbaV0uYnNzaWQuYnl0ZXMpKTsKKworCQkvKiBQYXJzZSBhbmQgZmV0Y2ggbG93IFJTU0kgKi8KKwkJaWYgKCF0YjIKKwkJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0FQX1RIUkVTSE9MRF9QQVJBTV9SU1NJX0xPV10pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBsb3cgUlNTSSBmYWlsZWQiKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcFJlcU1zZy0+YXBbaV0ubG93ID0KKwkJCW5sYV9nZXRfczMyKHRiMgorCQkJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0FQX1RIUkVTSE9MRF9QQVJBTV9SU1NJX0xPV10pOworCQloZGRMb2coTE9HMSwgRkwoIlJTU0kgbG93ICVkIiksIHBSZXFNc2ctPmFwW2ldLmxvdyk7CisKKwkJLyogUGFyc2UgYW5kIGZldGNoIGhpZ2ggUlNTSSAqLworCQlpZiAoIXRiMgorCQkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNX1JTU0lfSElHSF0pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBoaWdoIFJTU0kgZmFpbGVkIikpOworCQkJZ290byBmYWlsOworCQl9CisJCXBSZXFNc2ctPmFwW2ldLmhpZ2ggPQorCQkJbmxhX2dldF9zMzIodGIyCisJCQkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQVBfVEhSRVNIT0xEX1BBUkFNX1JTU0lfSElHSF0pOworCQloZGRMb2coTE9HMSwgRkwoIlJTU0kgSGlnaCAlZCIpLCBwUmVxTXNnLT5hcFtpXS5oaWdoKTsKKworCQlpKys7CisJfQorCisJY29udGV4dCA9ICZleHRfc2Nhbl9jb250ZXh0OworCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwlJTklUX0NPTVBMRVRJT04oY29udGV4dC0+cmVzcG9uc2VfZXZlbnQpOworCWNvbnRleHQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkID0gcFJlcU1zZy0+cmVxdWVzdElkOworCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJc3RhdHVzID0gc21lX3NldF9zaWduaWZpY2FudF9jaGFuZ2UocEhkZEN0eC0+aEhhbCwgcFJlcU1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJzbWVfc2V0X3NpZ25pZmljYW50X2NoYW5nZSBmYWlsZWQoZXJyPSVkKSIpLCBzdGF0dXMpOworCQljZGZfbWVtX2ZyZWUocFJlcU1zZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHJlcXVlc3Qgd2FzIHNlbnQgLS0gd2FpdCBmb3IgdGhlIHJlc3BvbnNlICovCisJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNvbnRleHQtPnJlc3BvbnNlX2V2ZW50LAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX0VYVFNDQU4pKTsKKworCWlmICghcmMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJzbWVfc2V0X3NpZ25pZmljYW50X2NoYW5nZSB0aW1lZCBvdXQiKSk7CisJCXJldHZhbCA9IC1FVElNRURPVVQ7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCQlpZiAoY29udGV4dC0+cmVxdWVzdF9pZCA9PSByZXF1ZXN0X2lkKQorCQkJcmV0dmFsID0gY29udGV4dC0+cmVzcG9uc2Vfc3RhdHVzOworCQllbHNlCisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQlzcGluX3VubG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworCitmYWlsOgorCWNkZl9tZW1fZnJlZShwUmVxTXNnKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NldF9zaWduaWZpY2FudF9jaGFuZ2UoKSAtIHNldCBzaWduaWZpY2FudCBjaGFuZ2UKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXJlbGVzcyBwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdpcmVsZXNzIGRldmljZQorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NldF9zaWduaWZpY2FudF9jaGFuZ2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCWNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NldF9zaWduaWZpY2FudF9jaGFuZ2Uod2lwaHksIHdkZXYsCisJCQkJCWRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9yZW1vdmVfZHNyY19jaGFubmVscyAoKSAtIHJlbW92ZSBkc3JjIGNoYW5lbHMKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXJlbGVzcyBwaHkKKyAqIEBjaGFuX2xpc3Q6IGNoYW5uZWwgbGlzdAorICogQG51bV9jaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaGRkX3JlbW92ZV9kc3JjX2NoYW5uZWxzKHN0cnVjdCB3aXBoeSAqd2lwaHksIHVpbnQzMl90ICpjaGFuX2xpc3QsCisJCQkJIHVpbnQ4X3QgKm51bV9jaGFubmVscykKK3sKKwl1aW50OF90IG51bV9jaGFuX3RlbXAgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8ICpudW1fY2hhbm5lbHM7IGkrKykgeworCQlpZiAoIWNkc19pc19kc3JjX2NoYW5uZWwoY2hhbl9saXN0W2ldKSkgeworCQkJY2hhbl9saXN0W251bV9jaGFuX3RlbXBdID0gY2hhbl9saXN0W2ldOworCQkJbnVtX2NoYW5fdGVtcCsrOworCQl9CisJfQorCisJKm51bV9jaGFubmVscyA9IG51bV9jaGFuX3RlbXA7Cit9CisKKy8qKgorICogaGRkX3JlbW92ZV9pbmRvb3JfY2hhbm5lbHMgKCkgLSByZW1vdmUgaW5kb29yIGNoYW5uZWxzCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5CisgKiBAY2hhbl9saXN0OiBjaGFubmVsIGxpc3QKKyAqIEBudW1fY2hhbm5lbHM6IG51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJldHVybjogbm9uZQorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCit2b2lkIGhkZF9yZW1vdmVfaW5kb29yX2NoYW5uZWxzKHN0cnVjdCB3aXBoeSAqd2lwaHksIHVpbnQzMl90ICpjaGFuX2xpc3QsCisJCQkJIHVpbnQ4X3QgKm51bV9jaGFubmVscykKK3sKKwl1aW50OF90IG51bV9jaGFuX3RlbXAgPSAwOworCWludCBpLCBqLCBrOworCisJZm9yIChpID0gMDsgaSA8ICpudW1fY2hhbm5lbHM7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGorKykgeworCQkJaWYgKHdpcGh5LT5iYW5kc1tqXSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChrID0gMDsgayA8IHdpcGh5LT5iYW5kc1tqXS0+bl9jaGFubmVsczsgaysrKSB7CisJCQkJaWYgKChjaGFuX2xpc3RbaV0gPT0KKwkJCQkgICAgIHdpcGh5LT5iYW5kc1tqXS0+Y2hhbm5lbHNba10uY2VudGVyX2ZyZXEpCisJCQkJICAgICYmICghKHdpcGh5LT5iYW5kc1tqXS0+Y2hhbm5lbHNba10uZmxhZ3MgJgorCQkJCSAgICAgICBJRUVFODAyMTFfQ0hBTl9JTkRPT1JfT05MWSkpCisJCQkJKSB7CisJCQkJCWNoYW5fbGlzdFtudW1fY2hhbl90ZW1wXSA9IGNoYW5fbGlzdFtpXTsKKwkJCQkJbnVtX2NoYW5fdGVtcCsrOworCQkJCX0KKwkJCX0KKwkJfQorCisJKm51bV9jaGFubmVscyA9IG51bV9jaGFuX3RlbXA7Cit9CisjZWxzZQordm9pZCBoZGRfcmVtb3ZlX2luZG9vcl9jaGFubmVscyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCB1aW50MzJfdCAqY2hhbl9saXN0LAorCQkJCSB1aW50OF90ICpudW1fY2hhbm5lbHMpCit7CisJKm51bV9jaGFubmVscyA9IDA7Cit9CisjZW5kaWYKKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fZ2V0X3ZhbGlkX2NoYW5uZWxzICgpIC0gZ2V0IHZhbGlkIGNoYW5uZWxzCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3aXJlbGVzcyBkZXZpY2UKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2dldF92YWxpZF9jaGFubmVscyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYKKwkJCQkJCSAqd2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCSBpbnQgZGF0YV9sZW4pCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwl1aW50MzJfdCBjaGFuX2xpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXSA9IHswfTsKKwl1aW50OF90IG51bV9jaGFubmVscyAgPSAwOworCXN0cnVjdCBubGF0dHIgKnRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9NQVggKworCQkJICAxXTsKKwl1aW50MzJfdCByZXF1ZXN0SWQsIG1heENoYW5uZWxzOworCXRXaWZpQmFuZCB3aWZpQmFuZDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHlfc2tiOworCXVpbnQ4X3QgaTsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZF9lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCwKKwkJICAgICAgZGF0YSwgZGF0YV9sZW4sIHdsYW5faGRkX2V4dHNjYW5fY29uZmlnX3BvbGljeSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIEFUVFIiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFBhcnNlIGFuZCBmZXRjaCByZXF1ZXN0IElkICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVxdWVzdElkID0KKwkJbmxhX2dldF91MzIodGIKKwkJIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRF0pOworCWhkZExvZyhMT0cxLCBGTCgiUmVxIElkICVkIiksIHJlcXVlc3RJZCk7CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggd2lmaSBiYW5kICovCisJaWYgKCF0YgorCSAgICBbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9HRVRfVkFMSURfQ0hBTk5FTFNfQ09ORklHX1BBUkFNX1dJRklfQkFORF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHdpZmkgYmFuZCBmYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl3aWZpQmFuZCA9CisJCW5sYV9nZXRfdTMyKHRiCisJCSAgICBbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9HRVRfVkFMSURfQ0hBTk5FTFNfQ09ORklHX1BBUkFNX1dJRklfQkFORF0pOworCWhkZExvZyhMT0cxLCBGTCgiV2lmaSBiYW5kICVkIiksIHdpZmlCYW5kKTsKKworCWlmICghdGIKKwkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fR0VUX1ZBTElEX0NIQU5ORUxTX0NPTkZJR19QQVJBTV9NQVhfQ0hBTk5FTFNdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBtYXggY2hhbm5lbHMgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbWF4Q2hhbm5lbHMgPQorCQlubGFfZ2V0X3UzMih0YgorCQkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fR0VUX1ZBTElEX0NIQU5ORUxTX0NPTkZJR19QQVJBTV9NQVhfQ0hBTk5FTFNdKTsKKwloZGRMb2coTE9HMSwgRkwoIk1heCBjaGFubmVscyAlZCIpLCBtYXhDaGFubmVscyk7CisJc3RhdHVzID0gc21lX2dldF92YWxpZF9jaGFubmVsc19ieV9iYW5kKCh0SGFsSGFuZGxlKSAocEhkZEN0eC0+aEhhbCksCisJCQkJCQl3aWZpQmFuZCwgY2hhbl9saXN0LAorCQkJCQkJJm51bV9jaGFubmVscyk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgic21lX2dldF92YWxpZF9jaGFubmVsc19ieV9iYW5kIGZhaWxlZCAoZXJyPSVkKSIpLAorCQkgICAgICAgc3RhdHVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbnVtX2NoYW5uZWxzID0gQ0RGX01JTihudW1fY2hhbm5lbHMsIG1heENoYW5uZWxzKTsKKworCWhkZF9yZW1vdmVfZHNyY19jaGFubmVscyh3aXBoeSwgY2hhbl9saXN0LCAmbnVtX2NoYW5uZWxzKTsKKworCWlmICgoV0xBTl9IRERfU09GVEFQID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkgICAgIXN0cm5jbXAoaGRkX2dldF9md3BhdGgoKSwgImFwIiwgMikpCisJCWhkZF9yZW1vdmVfaW5kb29yX2NoYW5uZWxzKHdpcGh5LCBjaGFuX2xpc3QsICZudW1fY2hhbm5lbHMpOworCisJaGRkTG9nKExPRzEsIEZMKCJOdW1iZXIgb2YgY2hhbm5lbHMgJWQiKSwgbnVtX2NoYW5uZWxzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoYW5uZWxzOyBpKyspCisJCWhkZExvZyhMT0cxLCAiQ2hhbm5lbDogJXUgIiwgY2hhbl9saXN0W2ldKTsKKworCXJlcGx5X3NrYiA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiKHdpcGh5LCBzaXplb2YodTMyKSArCisJCQkJCQkJc2l6ZW9mKHUzMikgKgorCQkJCQkJCW51bV9jaGFubmVscyArCisJCQkJCQkJTkxNU0dfSERSTEVOKTsKKworCWlmIChyZXBseV9za2IpIHsKKwkJaWYgKG5sYV9wdXRfdTMyKHJlcGx5X3NrYiwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19OVU1fQ0hBTk5FTFMsCisJCQludW1fY2hhbm5lbHMpIHx8CisJCSAgICBubGFfcHV0KHJlcGx5X3NrYiwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fUkVTVUxUU19DSEFOTkVMUywKKwkJCXNpemVvZih1MzIpICogbnVtX2NoYW5uZWxzLCBjaGFuX2xpc3QpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIm5sYSBwdXQgZmFpbCIpKTsKKwkJCWtmcmVlX3NrYihyZXBseV9za2IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXR1cm4gY2ZnODAyMTFfdmVuZG9yX2NtZF9yZXBseShyZXBseV9za2IpOworCX0KKworCWhkZExvZyhMT0dFLCBGTCgidmFsaWQgY2hhbm5lbHM6IGJ1ZmZlciBhbGxvYyBmYWlsIikpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fZ2V0X3ZhbGlkX2NoYW5uZWxzKCkgLSBnZXQgZXh0IHNjYW4gdmFsaWQgY2hhbm5lbHMKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXJlbGVzcyBwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdpcmVsZXNzIGRldmljZQorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2dldF92YWxpZF9jaGFubmVscyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQljb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZXRfdmFsaWRfY2hhbm5lbHMod2lwaHksIHdkZXYsIGRhdGEsCisJCQlkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBoZGRfZXh0c2Nhbl91cGRhdGVfZHdlbGxfdGltZV9saW1pdHMoKSAtIHVwZGF0ZSBkd2VsbCB0aW1lcworICogQHJlcV9tc2c6IFBvaW50ZXIgdG8gcmVxdWVzdCBtZXNzYWdlCisgKiBAYmt0X2lkeDogSW5kZXggb2YgY3VycmVudCBidWNrZXQgYmVpbmcgcHJvY2Vzc2VkCisgKiBAYWN0aXZlX21pbjogbWluaW11bSBhY3RpdmUgZHdlbGwgdGltZQorICogQGFjdGl2ZV9tYXg6IG1heGltdW0gYWN0aXZlIGR3ZWxsIHRpbWUKKyAqIEBwYXNzaXZlX21pbjogbWluaW11bSBwYXNzaXZlIGR3ZWxsIHRpbWUKKyAqIEBwYXNzaXZlX21heDogbWF4aW11bSBwYXNzaXZlIGR3ZWxsIHRpbWUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2V4dHNjYW5fdXBkYXRlX2R3ZWxsX3RpbWVfbGltaXRzKAorCQkJdHBTaXJXaWZpU2NhbkNtZFJlcVBhcmFtcyByZXFfbXNnLCB1aW50MzJfdCBia3RfaWR4LAorCQkJdWludDMyX3QgYWN0aXZlX21pbiwgdWludDMyX3QgYWN0aXZlX21heCwKKwkJCXVpbnQzMl90IHBhc3NpdmVfbWluLCB1aW50MzJfdCBwYXNzaXZlX21heCkKK3sKKwkvKiB1cGRhdGUgcGVyLWJ1Y2tldCBkd2VsbCB0aW1lcyAqLworCWlmIChyZXFfbXNnLT5idWNrZXRzW2JrdF9pZHhdLm1pbl9kd2VsbF90aW1lX2FjdGl2ZSA+CisJCQlhY3RpdmVfbWluKSB7CisJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2lkeF0ubWluX2R3ZWxsX3RpbWVfYWN0aXZlID0KKwkJCWFjdGl2ZV9taW47CisJfQorCWlmIChyZXFfbXNnLT5idWNrZXRzW2JrdF9pZHhdLm1heF9kd2VsbF90aW1lX2FjdGl2ZSA8CisJCQlhY3RpdmVfbWF4KSB7CisJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2lkeF0ubWF4X2R3ZWxsX3RpbWVfYWN0aXZlID0KKwkJCWFjdGl2ZV9tYXg7CisJfQorCWlmIChyZXFfbXNnLT5idWNrZXRzW2JrdF9pZHhdLm1pbl9kd2VsbF90aW1lX3Bhc3NpdmUgPgorCQkJcGFzc2l2ZV9taW4pIHsKKwkJcmVxX21zZy0+YnVja2V0c1tia3RfaWR4XS5taW5fZHdlbGxfdGltZV9wYXNzaXZlID0KKwkJCXBhc3NpdmVfbWluOworCX0KKwlpZiAocmVxX21zZy0+YnVja2V0c1tia3RfaWR4XS5tYXhfZHdlbGxfdGltZV9wYXNzaXZlIDwKKwkJCXBhc3NpdmVfbWF4KSB7CisJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2lkeF0ubWF4X2R3ZWxsX3RpbWVfcGFzc2l2ZSA9CisJCQlwYXNzaXZlX21heDsKKwl9CisJLyogdXBkYXRlIGR3ZWxsLXRpbWUgYWNyb3NzIGFsbCBidWNrZXRzICovCisJaWYgKHJlcV9tc2ctPm1pbl9kd2VsbF90aW1lX2FjdGl2ZSA+CisJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pZHhdLm1pbl9kd2VsbF90aW1lX2FjdGl2ZSkgeworCQlyZXFfbXNnLT5taW5fZHdlbGxfdGltZV9hY3RpdmUgPQorCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaWR4XS5taW5fZHdlbGxfdGltZV9hY3RpdmU7CisJfQorCWlmIChyZXFfbXNnLT5tYXhfZHdlbGxfdGltZV9hY3RpdmUgPAorCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaWR4XS5tYXhfZHdlbGxfdGltZV9hY3RpdmUpIHsKKwkJcmVxX21zZy0+bWF4X2R3ZWxsX3RpbWVfYWN0aXZlID0KKwkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2lkeF0ubWF4X2R3ZWxsX3RpbWVfYWN0aXZlOworCX0KKwlpZiAocmVxX21zZy0+bWluX2R3ZWxsX3RpbWVfcGFzc2l2ZSA+CisJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pZHhdLm1pbl9kd2VsbF90aW1lX3Bhc3NpdmUpIHsKKwkJcmVxX21zZy0+bWluX2R3ZWxsX3RpbWVfcGFzc2l2ZSA9CisJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pZHhdLm1pbl9kd2VsbF90aW1lX3Bhc3NpdmU7CisJfQorCWlmIChyZXFfbXNnLT5tYXhfZHdlbGxfdGltZV9wYXNzaXZlID4KKwkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2lkeF0ubWF4X2R3ZWxsX3RpbWVfcGFzc2l2ZSkgeworCQlyZXFfbXNnLT5tYXhfZHdlbGxfdGltZV9wYXNzaXZlID0KKwkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2lkeF0ubWF4X2R3ZWxsX3RpbWVfcGFzc2l2ZTsKKwl9Cit9CisKKy8qKgorICogaGRkX2V4dHNjYW5fY2hhbm5lbF9tYXhfcmVhY2hlZCgpIC0gY2hhbm5lbCBtYXggcmVhY2hlZAorICogQHJlcTogZXh0c2NhbiByZXF1ZXN0IHN0cnVjdHVyZQorICogQHRvdGFsX2NoYW5uZWxzOiB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgdG90YWwgY2hhbm5lbHMgcmVhY2hlZCBtYXgsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgYm9vbCBoZGRfZXh0c2Nhbl9jaGFubmVsX21heF9yZWFjaGVkKHRTaXJXaWZpU2NhbkNtZFJlcVBhcmFtcyAqcmVxLAorCQkJCQkgICAgdWludDhfdCB0b3RhbF9jaGFubmVscykKK3sKKwlpZiAodG90YWxfY2hhbm5lbHMgPT0gV0xBTl9FWFRTQ0FOX01BWF9DSEFOTkVMUykgeworCQloZGRfd2FybigKKwkJICAgIm1heCAjb2YgY2hhbm5lbHMgJWQgcmVhY2hlZCwgdGFrZSBvbmx5IGZpcnN0ICVkIGJ1Y2tldChzKSIsCisJCSAgIHRvdGFsX2NoYW5uZWxzLCByZXEtPm51bUJ1Y2tldHMpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIGhkZF9leHRzY2FuX3N0YXJ0X2ZpbGxfYnVja2V0X2NoYW5uZWxfc3BlYygpIC0gZmlsbCBidWNrZXQgY2hhbm5lbCBzcGVjCisgKiBAaGRkX2N0eDogSEREIGdsb2JhbCBjb250ZXh0CisgKiBAcmVxX21zZzogUG9pbnRlciB0byByZXF1ZXN0IHN0cnVjdHVyZQorICogQHRiOiBwb2ludGVyIHRvIE5MIGF0dHJpYnV0ZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGhkZF9leHRzY2FuX3N0YXJ0X2ZpbGxfYnVja2V0X2NoYW5uZWxfc3BlYygKKwkJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQl0cFNpcldpZmlTY2FuQ21kUmVxUGFyYW1zIHJlcV9tc2csCisJCQlzdHJ1Y3QgbmxhdHRyICoqdGIpCit7CisJc3RydWN0IG5sYXR0ciAqYnVja2V0WworCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fTUFYICsgMV07CisJc3RydWN0IG5sYXR0ciAqY2hhbm5lbFsKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCArIDFdOworCXN0cnVjdCBubGF0dHIgKmJ1Y2tldHM7CisJc3RydWN0IG5sYXR0ciAqY2hhbm5lbHM7CisJaW50IHJlbTEsIHJlbTI7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCBia3RfaW5kZXgsIGosIG51bV9jaGFubmVscywgdG90YWxfY2hhbm5lbHMgPSAwOworCXVpbnQzMl90IGNoYW5fbGlzdFtXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dID0gezB9OworCisJdWludDMyX3QgbWluX2R3ZWxsX3RpbWVfYWN0aXZlX2J1Y2tldCA9CisJCWhkZF9jdHgtPmNvbmZpZy0+ZXh0c2Nhbl9hY3RpdmVfbWF4X2Nobl90aW1lOworCXVpbnQzMl90IG1heF9kd2VsbF90aW1lX2FjdGl2ZV9idWNrZXQgPQorCQloZGRfY3R4LT5jb25maWctPmV4dHNjYW5fYWN0aXZlX21heF9jaG5fdGltZTsKKwl1aW50MzJfdCBtaW5fZHdlbGxfdGltZV9wYXNzaXZlX2J1Y2tldCA9CisJCWhkZF9jdHgtPmNvbmZpZy0+ZXh0c2Nhbl9wYXNzaXZlX21heF9jaG5fdGltZTsKKwl1aW50MzJfdCBtYXhfZHdlbGxfdGltZV9wYXNzaXZlX2J1Y2tldCA9CisJCWhkZF9jdHgtPmNvbmZpZy0+ZXh0c2Nhbl9wYXNzaXZlX21heF9jaG5fdGltZTsKKworCWJrdF9pbmRleCA9IDA7CisJcmVxX21zZy0+bWluX2R3ZWxsX3RpbWVfYWN0aXZlID0KKwkJcmVxX21zZy0+bWF4X2R3ZWxsX3RpbWVfYWN0aXZlID0KKwkJCWhkZF9jdHgtPmNvbmZpZy0+ZXh0c2Nhbl9hY3RpdmVfbWF4X2Nobl90aW1lOworCisJcmVxX21zZy0+bWluX2R3ZWxsX3RpbWVfcGFzc2l2ZSA9CisJCXJlcV9tc2ctPm1heF9kd2VsbF90aW1lX3Bhc3NpdmUgPQorCQkJaGRkX2N0eC0+Y29uZmlnLT5leHRzY2FuX3Bhc3NpdmVfbWF4X2Nobl90aW1lOworCXJlcV9tc2ctPm51bUJ1Y2tldHMgPSAwOworCisJbmxhX2Zvcl9lYWNoX25lc3RlZChidWNrZXRzLAorCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ10sIHJlbTEpIHsKKwkJaWYgKG5sYV9wYXJzZShidWNrZXQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fTUFYLAorCQkJbmxhX2RhdGEoYnVja2V0cyksIG5sYV9sZW4oYnVja2V0cyksIE5VTEwpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIm5sYV9wYXJzZSBmYWlsZWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIFBhcnNlIGFuZCBmZXRjaCBidWNrZXQgc3BlYyAqLworCQlpZiAoIWJ1Y2tldFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDX0lOREVYXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIGJ1Y2tldCBpbmRleCBmYWlsZWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uYnVja2V0ID0gbmxhX2dldF91OCgKKwkJCWJ1Y2tldFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDX0lOREVYXSk7CisJCWhkZExvZyhMT0cxLCBGTCgiQnVja2V0IHNwZWMgSW5kZXggJWQiKSwKKwkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uYnVja2V0KTsKKworCQkvKiBQYXJzZSBhbmQgZmV0Y2ggd2lmaSBiYW5kICovCisJCWlmICghYnVja2V0W1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfQkFORF0pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciB3aWZpIGJhbmQgZmFpbGVkIikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmJhbmQgPSBubGFfZ2V0X3U4KAorCQkJYnVja2V0W1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfQkFORF0pOworCQloZGRMb2coTE9HMSwgRkwoIldpZmkgYmFuZCAlZCIpLAorCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmJhbmQpOworCisJCS8qIFBhcnNlIGFuZCBmZXRjaCBwZXJpb2QgKi8KKwkJaWYgKCFidWNrZXRbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19QRVJJT0RdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgcGVyaW9kIGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5wZXJpb2QgPSBubGFfZ2V0X3UzMigKKwkJYnVja2V0W1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfUEVSSU9EXSk7CisJCWhkZExvZyhMT0cxLCBGTCgicGVyaW9kICVkIiksCisJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0ucGVyaW9kKTsKKworCQkvKiBQYXJzZSBhbmQgZmV0Y2ggcmVwb3J0IGV2ZW50cyAqLworCQlpZiAoIWJ1Y2tldFsKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfUkVQT1JUX0VWRU5UU10pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciByZXBvcnQgZXZlbnRzIGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5yZXBvcnRFdmVudHMgPSBubGFfZ2V0X3U4KAorCQkJYnVja2V0WworCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19SRVBPUlRfRVZFTlRTXSk7CisJCWhkZExvZyhMT0cxLCBGTCgicmVwb3J0IGV2ZW50cyAlZCIpLAorCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5yZXBvcnRFdmVudHMpOworCisJCS8qIFBhcnNlIGFuZCBmZXRjaCBtYXggcGVyaW9kICovCisJCWlmICghYnVja2V0W1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfTUFYX1BFUklPRF0pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBtYXggcGVyaW9kIGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5tYXhfcGVyaW9kID0gbmxhX2dldF91MzIoCisJCQlidWNrZXRbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19NQVhfUEVSSU9EXSk7CisJCWhkZExvZyhMT0cxLCBGTCgibWF4IHBlcmlvZCAldSIpLAorCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLm1heF9wZXJpb2QpOworCisJCS8qIFBhcnNlIGFuZCBmZXRjaCBleHBvbmVudCAqLworCQlpZiAoIWJ1Y2tldFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDX0VYUE9ORU5UXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIGV4cG9uZW50IGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5leHBvbmVudCA9IG5sYV9nZXRfdTMyKAorCQkJYnVja2V0W1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfRVhQT05FTlRdKTsKKwkJaGRkTG9nKExPRzEsIEZMKCJleHBvbmVudCAldSIpLAorCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmV4cG9uZW50KTsKKworCQkvKiBQYXJzZSBhbmQgZmV0Y2ggc3RlcCBjb3VudCAqLworCQlpZiAoIWJ1Y2tldFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0JVQ0tFVF9TUEVDX1NURVBfQ09VTlRdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgc3RlcCBjb3VudCBmYWlsZWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uc3RlcF9jb3VudCA9IG5sYV9nZXRfdTMyKAorCQkJYnVja2V0W1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfU1RFUF9DT1VOVF0pOworCQloZGRMb2coTE9HMSwgRkwoIlN0ZXAgY291bnQgJXUiKSwKKwkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5zdGVwX2NvdW50KTsKKworCQkvKiBzdGFydCB3aXRoIGtub3duIGdvb2QgdmFsdWVzIGZvciBidWNrZXQgZHdlbGwgdGltZXMgKi8KKwkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLm1pbl9kd2VsbF90aW1lX2FjdGl2ZSA9CisJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5tYXhfZHdlbGxfdGltZV9hY3RpdmUgPQorCQkJaGRkX2N0eC0+Y29uZmlnLT5leHRzY2FuX2FjdGl2ZV9tYXhfY2huX3RpbWU7CisKKwkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLm1pbl9kd2VsbF90aW1lX3Bhc3NpdmUgPQorCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0ubWF4X2R3ZWxsX3RpbWVfcGFzc2l2ZSA9CisJCQloZGRfY3R4LT5jb25maWctPmV4dHNjYW5fcGFzc2l2ZV9tYXhfY2huX3RpbWU7CisKKwkJLyogRnJhbWV3b3JrIHNoYWxsIHBhc3MgdGhlIGNoYW5uZWwgbGlzdCBpZiB0aGUgaW5wdXQgV2lGaSBiYW5kCisJCSAqIGlzIFdJRklfQkFORF9VTlNQRUNJRklFRC4KKwkJICogSWYgdGhlIGlucHV0IFdpRmkgYmFuZCBpcyBzcGVjaWZpZWQgKGFueSB2YWx1ZSBvdGhlciB0aGFuCisJCSAqIFdJRklfQkFORF9VTlNQRUNJRklFRCkgdGhlbiBkcml2ZXIgcG9wdWxhdGVzIHRoZSBjaGFubmVsIGxpc3QKKwkJICovCisJCWlmIChyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uYmFuZCAhPSBXSUZJX0JBTkRfVU5TUEVDSUZJRUQpIHsKKwkJCWlmIChoZGRfZXh0c2Nhbl9jaGFubmVsX21heF9yZWFjaGVkKHJlcV9tc2csCisJCQkJCQkJICAgIHRvdGFsX2NoYW5uZWxzKSkKKwkJCQlyZXR1cm4gMDsKKworCQkJbnVtX2NoYW5uZWxzID0gMDsKKwkJCWhkZExvZyhMT0cxLCAiV2lGaSBiYW5kIGlzIHNwZWNpZmllZCwgZHJpdmVyIHRvIGZpbGwgY2hhbm5lbCBsaXN0Iik7CisJCQlzdGF0dXMgPSBzbWVfZ2V0X3ZhbGlkX2NoYW5uZWxzX2J5X2JhbmQoaGRkX2N0eC0+aEhhbCwKKwkJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5iYW5kLAorCQkJCQkJY2hhbl9saXN0LCAmbnVtX2NoYW5uZWxzKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoInNtZV9HZXRWYWxpZENoYW5uZWxzQnlCYW5kIGZhaWxlZCAoZXJyPSVkKSIpLAorCQkJCSAgICAgICBzdGF0dXMpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaGRkTG9nKExPRzEsIEZMKCJiZWZvcmUgdHJpbW1pbmcsIG51bV9jaGFubmVsczogJWQiKSwKKwkJCQludW1fY2hhbm5lbHMpOworCisJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0ubnVtQ2hhbm5lbHMgPQorCQkJCUNERl9NSU4obnVtX2NoYW5uZWxzLAorCQkJCQkoV0xBTl9FWFRTQ0FOX01BWF9DSEFOTkVMUyAtCisJCQkJCQl0b3RhbF9jaGFubmVscykpOworCQkJaGRkX2luZm8oIkFkaiBOdW0gY2hhbm5lbHMvYnVja2V0OiAlZCB0b3RhbF9jaGFubmVsczogJWQiLAorCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5udW1DaGFubmVscywKKwkJCQl0b3RhbF9jaGFubmVscyk7CisJCQl0b3RhbF9jaGFubmVscyArPQorCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5udW1DaGFubmVsczsKKworCQkJZm9yIChqID0gMDsgaiA8IHJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5udW1DaGFubmVsczsKKwkJCQlqKyspIHsKKwkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uY2hhbm5lbCA9CisJCQkJCQkJY2hhbl9saXN0W2pdOworCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS4KKwkJCQkJCQljaG5sQ2xhc3MgPSAwOworCQkJCWlmIChDRFNfSVNfUEFTU0lWRV9PUl9ESVNBQkxFX0NIKAorCQkJCQljZHNfZnJlcV90b19jaGFuKGNoYW5fbGlzdFtqXSkpKSB7CisJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS4KKwkJCQkJCQkJcGFzc2l2ZSA9IDE7CisJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS4KKwkJCQkJZHdlbGxUaW1lTXMgPQorCQkJCQkJaGRkX2N0eC0+Y29uZmlnLT4KKwkJCQkJCWV4dHNjYW5fcGFzc2l2ZV9tYXhfY2huX3RpbWU7CisJCQkJCS8qIHJlY29uZmlndXJlIHBlci1idWNrZXQgZHdlbGwgdGltZSAqLworCQkJCQlpZiAobWluX2R3ZWxsX3RpbWVfcGFzc2l2ZV9idWNrZXQgPgorCQkJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5kd2VsbFRpbWVNcykgeworCQkJCQkJbWluX2R3ZWxsX3RpbWVfcGFzc2l2ZV9idWNrZXQgPQorCQkJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5kd2VsbFRpbWVNczsKKwkJCQkJfQorCQkJCQlpZiAobWF4X2R3ZWxsX3RpbWVfcGFzc2l2ZV9idWNrZXQgPAorCQkJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5kd2VsbFRpbWVNcykgeworCQkJCQkJbWF4X2R3ZWxsX3RpbWVfcGFzc2l2ZV9idWNrZXQgPQorCQkJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5kd2VsbFRpbWVNczsKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsKKwkJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmNoYW5uZWxzW2pdLgorCQkJCQkJCXBhc3NpdmUgPSAwOworCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uCisJCQkJCWR3ZWxsVGltZU1zID0KKwkJCQkJCWhkZF9jdHgtPmNvbmZpZy0+ZXh0c2Nhbl9hY3RpdmVfbWF4X2Nobl90aW1lOworCQkJCQkvKiByZWNvbmZpZ3VyZSBwZXItYnVja2V0IGR3ZWxsIHRpbWVzICovCisJCQkJCWlmIChtaW5fZHdlbGxfdGltZV9hY3RpdmVfYnVja2V0ID4KKwkJCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uZHdlbGxUaW1lTXMpIHsKKwkJCQkJCW1pbl9kd2VsbF90aW1lX2FjdGl2ZV9idWNrZXQgPQorCQkJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5kd2VsbFRpbWVNczsKKwkJCQkJfQorCQkJCQlpZiAobWF4X2R3ZWxsX3RpbWVfYWN0aXZlX2J1Y2tldCA8CisJCQkJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmNoYW5uZWxzW2pdLmR3ZWxsVGltZU1zKSB7CisJCQkJCQltYXhfZHdlbGxfdGltZV9hY3RpdmVfYnVja2V0ID0KKwkJCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uZHdlbGxUaW1lTXM7CisJCQkJCX0KKworCQkJCX0KKworCQkJCWhkZExvZyhMT0cxLAorCQkJCQkiQ2hhbm5lbDogJXUgUGFzc2l2ZTogJXUgRHdlbGwgdGltZTogJXUgbXMgQ2xhc3M6ICV1IiwKKwkJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmNoYW5uZWxzW2pdLmNoYW5uZWwsCisJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5wYXNzaXZlLAorCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uZHdlbGxUaW1lTXMsCisJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5jaG5sQ2xhc3MpOworCQkJfQorCisJCQloZGRfZXh0c2Nhbl91cGRhdGVfZHdlbGxfdGltZV9saW1pdHMoCisJCQkJCXJlcV9tc2csIGJrdF9pbmRleCwKKwkJCQkJbWluX2R3ZWxsX3RpbWVfYWN0aXZlX2J1Y2tldCwKKwkJCQkJbWF4X2R3ZWxsX3RpbWVfYWN0aXZlX2J1Y2tldCwKKwkJCQkJbWluX2R3ZWxsX3RpbWVfcGFzc2l2ZV9idWNrZXQsCisJCQkJCW1heF9kd2VsbF90aW1lX3Bhc3NpdmVfYnVja2V0KTsKKworCQkJaGRkTG9nKExPRzEsIEZMKCJia3RfaW5kZXg6JWQgYWN0dl9taW46JWQgYWN0dl9tYXg6JWQgcGFzc19taW46JWQgcGFzc19tYXg6JWQiKSwKKwkJCQkJYmt0X2luZGV4LAorCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0ubWluX2R3ZWxsX3RpbWVfYWN0aXZlLAorCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0ubWF4X2R3ZWxsX3RpbWVfYWN0aXZlLAorCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0ubWluX2R3ZWxsX3RpbWVfcGFzc2l2ZSwKKwkJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLm1heF9kd2VsbF90aW1lX3Bhc3NpdmUpOworCisJCQlia3RfaW5kZXgrKzsKKwkJCXJlcV9tc2ctPm51bUJ1Y2tldHMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUGFyc2UgYW5kIGZldGNoIG51bWJlciBvZiBjaGFubmVscyAqLworCQlpZiAoIWJ1Y2tldFsKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNfTlVNX0NIQU5ORUxfU1BFQ1NdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgbnVtIGNoYW5uZWxzIGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5udW1DaGFubmVscyA9CisJCW5sYV9nZXRfdTMyKGJ1Y2tldFsKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9CVUNLRVRfU1BFQ19OVU1fQ0hBTk5FTF9TUEVDU10pOworCQloZGRfaW5mbygiYmVmb3JlIHRyaW1taW5nOiBudW0gY2hhbm5lbHMgJWQiLAorCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLm51bUNoYW5uZWxzKTsKKworCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0ubnVtQ2hhbm5lbHMgPQorCQkJQ0RGX01JTihyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0ubnVtQ2hhbm5lbHMsCisJCQkJKFdMQU5fRVhUU0NBTl9NQVhfQ0hBTk5FTFMgLSB0b3RhbF9jaGFubmVscykpOworCQloZGRfaW5mbygiTnVtIGNoYW5uZWxzL2J1Y2tldDogJWQgdG90YWxfY2hhbm5lbHM6ICVkIiwKKwkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5udW1DaGFubmVscywKKwkJCXRvdGFsX2NoYW5uZWxzKTsKKwkJaWYgKGhkZF9leHRzY2FuX2NoYW5uZWxfbWF4X3JlYWNoZWQocmVxX21zZywgdG90YWxfY2hhbm5lbHMpKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKCFidWNrZXRbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DSEFOTkVMX1NQRUNdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgY2hhbm5lbCBzcGVjIGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaiA9IDA7CisJCW5sYV9mb3JfZWFjaF9uZXN0ZWQoY2hhbm5lbHMsCisJCQlidWNrZXRbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9DSEFOTkVMX1NQRUNdLCByZW0yKSB7CisJCQlpZiAobmxhX3BhcnNlKGNoYW5uZWwsCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCwKKwkJCQlubGFfZGF0YShjaGFubmVscyksIG5sYV9sZW4oY2hhbm5lbHMpLAorCQkJCXdsYW5faGRkX2V4dHNjYW5fY29uZmlnX3BvbGljeSkpIHsKKwkJCQloZGRMb2coTE9HRSwgRkwoIm5sYV9wYXJzZSBmYWlsZWQiKSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmIChoZGRfZXh0c2Nhbl9jaGFubmVsX21heF9yZWFjaGVkKHJlcV9tc2csCisJCQkJCQkJICAgIHRvdGFsX2NoYW5uZWxzKSkKKwkJCQlicmVhazsKKworCQkJLyogUGFyc2UgYW5kIGZldGNoIGNoYW5uZWwgKi8KKwkJCWlmICghY2hhbm5lbFsKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NIQU5ORUxfU1BFQ19DSEFOTkVMXSkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBjaGFubmVsIGZhaWxlZCIpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5jaGFubmVsID0KKwkJCQlubGFfZ2V0X3UzMihjaGFubmVsWworCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQ0hBTk5FTF9TUEVDX0NIQU5ORUxdKTsKKwkJCWhkZExvZyhMT0cxLCBGTCgiY2hhbm5lbCAldSIpLAorCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5jaGFubmVsKTsKKworCQkJLyogUGFyc2UgYW5kIGZldGNoIGR3ZWxsIHRpbWUgKi8KKwkJCWlmICghY2hhbm5lbFsKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NIQU5ORUxfU1BFQ19EV0VMTF9USU1FXSkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBkd2VsbHRpbWUgZmFpbGVkIikpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmNoYW5uZWxzW2pdLmR3ZWxsVGltZU1zID0KKwkJCQlubGFfZ2V0X3UzMihjaGFubmVsWworCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQ0hBTk5FTF9TUEVDX0RXRUxMX1RJTUVdKTsKKworCQkJLyogT3ZlcnJpZGUgZHdlbGwgdGltZSBpZiByZXF1aXJlZCAqLworCQkJaWYgKHJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5kd2VsbFRpbWVNcyA8CisJCQkJaGRkX2N0eC0+Y29uZmlnLT5leHRzY2FuX2FjdGl2ZV9taW5fY2huX3RpbWUgfHwKKwkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uZHdlbGxUaW1lTXMgPgorCQkJCWhkZF9jdHgtPmNvbmZpZy0+ZXh0c2Nhbl9hY3RpdmVfbWF4X2Nobl90aW1lKSB7CisJCQkJaGRkTG9nKExPRzEsIEZMKCJXaUZpIGJhbmQgaXMgdW5zcGVjaWZpZWQsIGR3ZWxsVGltZTolZCIpLAorCQkJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmNoYW5uZWxzW2pdLmR3ZWxsVGltZU1zKTsKKworCQkJCWlmIChDRFNfSVNfUEFTU0lWRV9PUl9ESVNBQkxFX0NIKAorCQkJCQljZHNfZnJlcV90b19jaGFuKAorCQkJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmNoYW5uZWxzW2pdLmNoYW5uZWwpKSkgeworCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uZHdlbGxUaW1lTXMgPQorCQkJCQkJaGRkX2N0eC0+Y29uZmlnLT5leHRzY2FuX3Bhc3NpdmVfbWF4X2Nobl90aW1lOworCQkJCX0gZWxzZSB7CisJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5kd2VsbFRpbWVNcyA9CisJCQkJCQloZGRfY3R4LT5jb25maWctPmV4dHNjYW5fYWN0aXZlX21heF9jaG5fdGltZTsKKwkJCQl9CisJCQl9CisKKwkJCWhkZExvZyhMT0cxLCBGTCgiTmV3IER3ZWxsIHRpbWUgJXUgbXMiKSwKKwkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uZHdlbGxUaW1lTXMpOworCisJCQlpZiAoQ0RTX0lTX1BBU1NJVkVfT1JfRElTQUJMRV9DSCgKKwkJCQkJCWNkc19mcmVxX3RvX2NoYW4oCisJCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uY2hhbm5lbCkpKSB7CisJCQkJaWYgKG1pbl9kd2VsbF90aW1lX3Bhc3NpdmVfYnVja2V0ID4KKwkJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5kd2VsbFRpbWVNcykgeworCQkJCQltaW5fZHdlbGxfdGltZV9wYXNzaXZlX2J1Y2tldCA9CisJCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uZHdlbGxUaW1lTXM7CisJCQkJfQorCQkJCWlmIChtYXhfZHdlbGxfdGltZV9wYXNzaXZlX2J1Y2tldCA8CisJCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uZHdlbGxUaW1lTXMpIHsKKwkJCQkJbWF4X2R3ZWxsX3RpbWVfcGFzc2l2ZV9idWNrZXQgPQorCQkJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmNoYW5uZWxzW2pdLmR3ZWxsVGltZU1zOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKG1pbl9kd2VsbF90aW1lX2FjdGl2ZV9idWNrZXQgPgorCQkJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmNoYW5uZWxzW2pdLmR3ZWxsVGltZU1zKSB7CisJCQkJCW1pbl9kd2VsbF90aW1lX2FjdGl2ZV9idWNrZXQgPQorCQkJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLmNoYW5uZWxzW2pdLmR3ZWxsVGltZU1zOworCQkJCX0KKwkJCQlpZiAobWF4X2R3ZWxsX3RpbWVfYWN0aXZlX2J1Y2tldCA8CisJCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uZHdlbGxUaW1lTXMpIHsKKwkJCQkJbWF4X2R3ZWxsX3RpbWVfYWN0aXZlX2J1Y2tldCA9CisJCQkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0uZHdlbGxUaW1lTXM7CisJCQkJfQorCQkJfQorCisJCQkvKiBQYXJzZSBhbmQgZmV0Y2ggY2hhbm5lbCBzcGVjIHBhc3NpdmUgKi8KKwkJCWlmICghY2hhbm5lbFsKKwkJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NIQU5ORUxfU1BFQ19QQVNTSVZFXSkgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCQlGTCgiYXR0ciBjaGFubmVsIHNwZWMgcGFzc2l2ZSBmYWlsZWQiKSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0ucGFzc2l2ZSA9CisJCQkJbmxhX2dldF91OChjaGFubmVsWworCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQ0hBTk5FTF9TUEVDX1BBU1NJVkVdKTsKKwkJCWhkZExvZyhMT0cxLCBGTCgiQ2hubCBzcGVjIHBhc3NpdmUgJXUiKSwKKwkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0ucGFzc2l2ZSk7CisJCQkvKiBPdmVycmlkZSBzY2FuIHR5cGUgaWYgcmVxdWlyZWQgKi8KKwkJCWlmIChDRFNfSVNfUEFTU0lWRV9PUl9ESVNBQkxFX0NIKAorCQkJCWNkc19mcmVxX3RvX2NoYW4oCisJCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5jaGFubmVsKSkpIHsKKwkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0uY2hhbm5lbHNbal0ucGFzc2l2ZSA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5jaGFubmVsc1tqXS5wYXNzaXZlID0gZmFsc2U7CisJCQl9CisJCQlqKys7CisJCQl0b3RhbF9jaGFubmVscysrOworCQl9CisKKwkJaGRkX2V4dHNjYW5fdXBkYXRlX2R3ZWxsX3RpbWVfbGltaXRzKAorCQkJCQlyZXFfbXNnLCBia3RfaW5kZXgsCisJCQkJCW1pbl9kd2VsbF90aW1lX2FjdGl2ZV9idWNrZXQsCisJCQkJCW1heF9kd2VsbF90aW1lX2FjdGl2ZV9idWNrZXQsCisJCQkJCW1pbl9kd2VsbF90aW1lX3Bhc3NpdmVfYnVja2V0LAorCQkJCQltYXhfZHdlbGxfdGltZV9wYXNzaXZlX2J1Y2tldCk7CisKKwkJaGRkTG9nKExPRzEsIEZMKCJia3RJbmRleDolZCBhY3R2X21pbjolZCBhY3R2X21heDolZCBwYXNzX21pbjolZCBwYXNzX21heDolZCIpLAorCQkJCWJrdF9pbmRleCwKKwkJCQlyZXFfbXNnLT5idWNrZXRzW2JrdF9pbmRleF0ubWluX2R3ZWxsX3RpbWVfYWN0aXZlLAorCQkJCXJlcV9tc2ctPmJ1Y2tldHNbYmt0X2luZGV4XS5tYXhfZHdlbGxfdGltZV9hY3RpdmUsCisJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLm1pbl9kd2VsbF90aW1lX3Bhc3NpdmUsCisJCQkJcmVxX21zZy0+YnVja2V0c1tia3RfaW5kZXhdLm1heF9kd2VsbF90aW1lX3Bhc3NpdmUpOworCisJCWJrdF9pbmRleCsrOworCQlyZXFfbXNnLT5udW1CdWNrZXRzKys7CisJfQorCisJaGRkTG9nKExPRzEsIEZMKCJHbG9iYWw6IGFjdHZfbWluOiVkIGFjdHZfbWF4OiVkIHBhc3NfbWluOiVkIHBhc3NfbWF4OiVkIiksCisJCQkJcmVxX21zZy0+bWluX2R3ZWxsX3RpbWVfYWN0aXZlLAorCQkJCXJlcV9tc2ctPm1heF9kd2VsbF90aW1lX2FjdGl2ZSwKKwkJCQlyZXFfbXNnLT5taW5fZHdlbGxfdGltZV9wYXNzaXZlLAorCQkJCXJlcV9tc2ctPm1heF9kd2VsbF90aW1lX3Bhc3NpdmUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoZGRfZXh0c2Nhbl9tYXBfdXNyX2Rydl9jb25maWdfZmxhZ3MoKSAtIG1hcCB1c2Vyc3BhY2UgdG8gZHJpdmVyIGNvbmZpZyBmbGFncworICogQGNvbmZpZ19mbGFncyAtIFtpbnB1dF0gY29uZmlndXJhdGlvbiBmbGFncy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1hcHMgdXNlciBzcGFjZSByZWNlaXZlZCBjb25maWd1cmF0aW9uIGZsYWdzIHRvCisgKiBkcml2ZXIgcmVwcmVzZW50YXRpb24uCisgKgorICogUmV0dXJuOiBjb25maWd1cmF0aW9uIGZsYWdzCisgKi8KK3N0YXRpYyB1aW50MzJfdCBoZGRfZXh0c2Nhbl9tYXBfdXNyX2Rydl9jb25maWdfZmxhZ3ModWludDMyX3QgY29uZmlnX2ZsYWdzKQoreworCXVpbnQzMl90IGNvbmZpZ3VyYXRpb25fZmxhZ3MgPSAwOworCisJaWYgKGNvbmZpZ19mbGFncyAmIEVYVFNDQU5fTFBfRVhURU5ERURfQkFUQ0hJTkcpCisJCWNvbmZpZ3VyYXRpb25fZmxhZ3MgfD0gRVhUU0NBTl9MUF9FWFRFTkRFRF9CQVRDSElORzsKKworCXJldHVybiBjb25maWd1cmF0aW9uX2ZsYWdzOworfQorCisvKgorICogZGVmaW5lIHNob3J0IG5hbWVzIGZvciB0aGUgZ2xvYmFsIHZlbmRvciBwYXJhbXMKKyAqIHVzZWQgYnkgX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3N0YXJ0KCkKKyAqLworI2RlZmluZSBQQVJBTV9NQVggXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9NQVgKKyNkZWZpbmUgUEFSQU1fUkVRVUVTVF9JRCBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX1JFUVVFU1RfSUQKKyNkZWZpbmUgUEFSQU1fQkFTRV9QRVJJT0QgXAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU0NBTl9DTURfUEFSQU1TX0JBU0VfUEVSSU9ECisjZGVmaW5lIFBBUkFNX01BWF9BUF9QRVJfU0NBTiBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TQ0FOX0NNRF9QQVJBTVNfTUFYX0FQX1BFUl9TQ0FOCisjZGVmaW5lIFBBUkFNX1JQVF9USFJITERfUEVSQ0VOVCBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TQ0FOX0NNRF9QQVJBTVNfUkVQT1JUX1RIUkVTSE9MRF9QRVJDRU5UCisjZGVmaW5lIFBBUkFNX1JQVF9USFJITERfTlVNX1NDQU5TIFwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NDQU5fQ01EX1BBUkFNU19SRVBPUlRfVEhSRVNIT0xEX05VTV9TQ0FOUworI2RlZmluZSBQQVJBTV9OVU1fQlVDS0VUUyBcCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TQ0FOX0NNRF9QQVJBTVNfTlVNX0JVQ0tFVFMKKyNkZWZpbmUgUEFSQU1fQ09ORklHX0ZMQUdTIFwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX0NPTkZJR1VSQVRJT05fRkxBR1MKKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc3RhcnQoKSAtIGV4dCBzY2FuIHN0YXJ0CisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3aXJlbGVzcyBkZXZpY2UKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogTGVuZ3RoIG9mIEBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3N0YXJ0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgIGludCBkYXRhX2xlbikKK3sKKwl0cFNpcldpZmlTY2FuQ21kUmVxUGFyYW1zIHBSZXFNc2cgICAgICAgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgICAgICAgICAgICAgICAgICA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciAgICAgICAgICAgICAgICAgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ICAgICAgICAgICAgICAgICAgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltQQVJBTV9NQVggKyAxXTsKKwlzdHJ1Y3QgaGRkX2V4dF9zY2FuX2NvbnRleHQgKmNvbnRleHQ7CisJdWludDMyX3QgcmVxdWVzdF9pZCwgbnVtX2J1Y2tldHM7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIHJjOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZF9lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR2YWwgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHJldHZhbCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5sYV9wYXJzZSh0YiwgUEFSQU1fTUFYLCBkYXRhLCBkYXRhX2xlbiwKKwkJd2xhbl9oZGRfZXh0c2Nhbl9jb25maWdfcG9saWN5KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcFJlcU1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcFJlcU1zZykpOworCWlmICghcFJlcU1zZykgeworCQloZGRMb2coTE9HRSwgRkwoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUGFyc2UgYW5kIGZldGNoIHJlcXVlc3QgSWQgKi8KKwlpZiAoIXRiW1BBUkFNX1JFUVVFU1RfSURdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciByZXF1ZXN0IGlkIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKworCXBSZXFNc2ctPnJlcXVlc3RJZCA9IG5sYV9nZXRfdTMyKHRiW1BBUkFNX1JFUVVFU1RfSURdKTsKKwlwUmVxTXNnLT5zZXNzaW9uSWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCWhkZExvZyhMT0cxLCBGTCgiUmVxIElkICVkIFNlc3Npb24gSWQgJWQiKSwKKwkJCXBSZXFNc2ctPnJlcXVlc3RJZCwKKwkJCXBSZXFNc2ctPnNlc3Npb25JZCk7CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggYmFzZSBwZXJpb2QgKi8KKwlpZiAoIXRiW1BBUkFNX0JBU0VfUEVSSU9EXSkgeworCQloZGRMb2coTE9HRSwgRkwoImF0dHIgYmFzZSBwZXJpb2QgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCXBSZXFNc2ctPmJhc2VQZXJpb2QgPSBubGFfZ2V0X3UzMih0YltQQVJBTV9CQVNFX1BFUklPRF0pOworCWhkZExvZyhMT0cxLCBGTCgiQmFzZSBQZXJpb2QgJWQiKSwKKwkJCQlwUmVxTXNnLT5iYXNlUGVyaW9kKTsKKworCS8qIFBhcnNlIGFuZCBmZXRjaCBtYXggQVAgcGVyIHNjYW4gKi8KKwlpZiAoIXRiW1BBUkFNX01BWF9BUF9QRVJfU0NBTl0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIG1heF9hcF9wZXJfc2NhbiBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJcFJlcU1zZy0+bWF4QVBwZXJTY2FuID0gbmxhX2dldF91MzIodGJbUEFSQU1fTUFYX0FQX1BFUl9TQ0FOXSk7CisJaGRkTG9nKExPRzEsIEZMKCJNYXggQVAgcGVyIFNjYW4gJWQiKSwgcFJlcU1zZy0+bWF4QVBwZXJTY2FuKTsKKworCS8qIFBhcnNlIGFuZCBmZXRjaCByZXBvcnQgdGhyZXNob2xkIHBlcmNlbnQgKi8KKwlpZiAoIXRiW1BBUkFNX1JQVF9USFJITERfUEVSQ0VOVF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcG9ydF90aHJlc2hvbGQgcGVyY2VudCBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJcFJlcU1zZy0+cmVwb3J0X3RocmVzaG9sZF9wZXJjZW50ID0gbmxhX2dldF91OCh0YltQQVJBTV9SUFRfVEhSSExEX1BFUkNFTlRdKTsKKwloZGRMb2coTE9HMSwgRkwoIlJlcG9ydCBUaHJlc2hvbGQgcGVyY2VudCAlZCIpLAorCQkJcFJlcU1zZy0+cmVwb3J0X3RocmVzaG9sZF9wZXJjZW50KTsKKworCS8qIFBhcnNlIGFuZCBmZXRjaCByZXBvcnQgdGhyZXNob2xkIG51bSBzY2FucyAqLworCWlmICghdGJbUEFSQU1fUlBUX1RIUkhMRF9OVU1fU0NBTlNdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciByZXBvcnRfdGhyZXNob2xkIG51bSBzY2FucyBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJcFJlcU1zZy0+cmVwb3J0X3RocmVzaG9sZF9udW1fc2NhbnMgPSBubGFfZ2V0X3U4KHRiW1BBUkFNX1JQVF9USFJITERfTlVNX1NDQU5TXSk7CisJaGRkTG9nKExPRzEsIEZMKCJSZXBvcnQgVGhyZXNob2xkIG51bSBzY2FucyAlZCIpLAorCQlwUmVxTXNnLT5yZXBvcnRfdGhyZXNob2xkX251bV9zY2Fucyk7CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggbnVtYmVyIG9mIGJ1Y2tldHMgKi8KKwlpZiAoIXRiW1BBUkFNX05VTV9CVUNLRVRTXSkgeworCQloZGRMb2coTE9HRSwgRkwoImF0dHIgbnVtYmVyIG9mIGJ1Y2tldHMgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCW51bV9idWNrZXRzID0gbmxhX2dldF91OCh0YltQQVJBTV9OVU1fQlVDS0VUU10pOworCWlmIChudW1fYnVja2V0cyA+IFdMQU5fRVhUU0NBTl9NQVhfQlVDS0VUUykgeworCQloZGRfd2FybigiRXhjZWVkZWQgTUFYIG51bWJlciBvZiBidWNrZXRzOiAlZCIsCisJCQkJV0xBTl9FWFRTQ0FOX01BWF9CVUNLRVRTKTsKKwl9CisJaGRkX2luZm8oIklucHV0OiBOdW1iZXIgb2YgQnVja2V0cyAlZCIsIG51bV9idWNrZXRzKTsKKworCS8qIFRoaXMgaXMgb3B0aW9uYWwgYXR0cmlidXRlLCBpZiBub3QgcHJlc2VudCBzZXQgaXQgdG8gMCAqLworCWlmICghdGJbUEFSQU1fQ09ORklHX0ZMQUdTXSkKKwkJcFJlcU1zZy0+Y29uZmlndXJhdGlvbl9mbGFncyA9IDA7CisJZWxzZQorCQlwUmVxTXNnLT5jb25maWd1cmF0aW9uX2ZsYWdzID0KKwkJCWhkZF9leHRzY2FuX21hcF91c3JfZHJ2X2NvbmZpZ19mbGFncygKKwkJCQlubGFfZ2V0X3UzMih0YltQQVJBTV9DT05GSUdfRkxBR1NdKSk7CisKKwloZGRMb2coTE9HMSwgRkwoIkNvbmZpZ3VyYXRpb24gZmxhZ3M6ICV1IiksCisJCQkJcFJlcU1zZy0+Y29uZmlndXJhdGlvbl9mbGFncyk7CisKKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fQlVDS0VUX1NQRUNdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBidWNrZXQgc3BlYyBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoaGRkX2V4dHNjYW5fc3RhcnRfZmlsbF9idWNrZXRfY2hhbm5lbF9zcGVjKHBIZGRDdHgsIHBSZXFNc2csIHRiKSkKKwkJZ290byBmYWlsOworCisJY29udGV4dCA9ICZleHRfc2Nhbl9jb250ZXh0OworCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwlJTklUX0NPTVBMRVRJT04oY29udGV4dC0+cmVzcG9uc2VfZXZlbnQpOworCWNvbnRleHQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkID0gcFJlcU1zZy0+cmVxdWVzdElkOworCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJc3RhdHVzID0gc21lX2V4dF9zY2FuX3N0YXJ0KHBIZGRDdHgtPmhIYWwsIHBSZXFNc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgic21lX2V4dF9zY2FuX3N0YXJ0IGZhaWxlZChlcnI9JWQpIiksIHN0YXR1cyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwSGRkQ3R4LT5leHRfc2Nhbl9zdGFydF9zaW5jZV9ib290ID0gY2RmX2dldF9tb25vdG9uaWNfYm9vdHRpbWUoKTsKKwloZGRMb2coTE9HMSwgRkwoIlRpbWVzdGFtcCBzaW5jZSBib290OiAlbGx1IiksCisJCQlwSGRkQ3R4LT5leHRfc2Nhbl9zdGFydF9zaW5jZV9ib290KTsKKworCS8qIHJlcXVlc3Qgd2FzIHNlbnQgLS0gd2FpdCBmb3IgdGhlIHJlc3BvbnNlICovCisJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNvbnRleHQtPnJlc3BvbnNlX2V2ZW50LAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRVhUU0NBTikpOworCisJaWYgKCFyYykgeworCQloZGRMb2coTE9HRSwgRkwoInNtZV9leHRfc2Nhbl9zdGFydCB0aW1lZCBvdXQiKSk7CisJCXJldHZhbCA9IC1FVElNRURPVVQ7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCQlpZiAoY29udGV4dC0+cmVxdWVzdF9pZCA9PSByZXF1ZXN0X2lkKQorCQkJcmV0dmFsID0gY29udGV4dC0+cmVzcG9uc2Vfc3RhdHVzOworCQllbHNlCisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQlzcGluX3VubG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworCitmYWlsOgorCWNkZl9tZW1fZnJlZShwUmVxTXNnKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKy8qCisgKiBkb25lIHdpdGggc2hvcnQgbmFtZXMgZm9yIHRoZSBnbG9iYWwgdmVuZG9yIHBhcmFtcworICogdXNlZCBieSBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc3RhcnQoKQorICovCisjdW5kZWYgUEFSQU1fTUFYCisjdW5kZWYgUEFSQU1fUkVRVUVTVF9JRAorI3VuZGVmIFBBUkFNX0JBU0VfUEVSSU9ECisjdW5kZWYgUEFSQU1TX01BWF9BUF9QRVJfU0NBTgorI3VuZGVmIFBBUkFNU19SUFRfVEhSSExEX1BFUkNFTlQKKyN1bmRlZiBQQVJBTVNfUlBUX1RIUkhMRF9OVU1fU0NBTlMKKyN1bmRlZiBQQVJBTVNfTlVNX0JVQ0tFVFMKKyN1bmRlZiBQQVJBTV9DT05GSUdfRkxBR1MKKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3N0YXJ0KCkgLSBzdGFydCBleHRzY2FuCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5LgorICogQHdkZXY6IFBvaW50ZXIgdG8gd2lyZWxlc3MgZGV2aWNlLgorICogQGRhdGE6IFBvaW50ZXIgdG8gaW5wdXQgZGF0YS4KKyAqIEBkYXRhX2xlbjogTGVuZ3RoIG9mIEBkYXRhLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3N0YXJ0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCWNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3N0YXJ0KHdpcGh5LCB3ZGV2LCBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogZGVmaW5lIHNob3J0IG5hbWVzIGZvciB0aGUgZ2xvYmFsIHZlbmRvciBwYXJhbXMKKyAqIHVzZWQgYnkgX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3N0b3AoKQorICovCisjZGVmaW5lIFBBUkFNX01BWCBcCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9NQVgKKyNkZWZpbmUgUEFSQU1fUkVRVUVTVF9JRCBcCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9SRVFVRVNUX0lECisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3N0b3AoKSAtIGV4dCBzY2FuIHN0b3AKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXJlbGVzcyBwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdpcmVsZXNzIGRldmljZQorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW50CitfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc3RvcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFfbGVuKQoreworCXRwU2lyRXh0U2NhblN0b3BSZXFQYXJhbXMgcFJlcU1zZyA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltQQVJBTV9NQVggKyAxXTsKKwlzdHJ1Y3QgaGRkX2V4dF9zY2FuX2NvbnRleHQgKmNvbnRleHQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3QgcmVxdWVzdF9pZDsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgcmM7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldHZhbCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gcmV0dmFsKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiLCBQQVJBTV9NQVgsIGRhdGEsIGRhdGFfbGVuLAorCQkJd2xhbl9oZGRfZXh0c2Nhbl9jb25maWdfcG9saWN5KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcFJlcU1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcFJlcU1zZykpOworCWlmICghcFJlcU1zZykgeworCQloZGRMb2coTE9HRSwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUGFyc2UgYW5kIGZldGNoIHJlcXVlc3QgSWQgKi8KKwlpZiAoIXRiW1BBUkFNX1JFUVVFU1RfSURdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciByZXF1ZXN0IGlkIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKworCXBSZXFNc2ctPnJlcXVlc3RJZCA9IG5sYV9nZXRfdTMyKHRiW1BBUkFNX1JFUVVFU1RfSURdKTsKKwlwUmVxTXNnLT5zZXNzaW9uSWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCWhkZExvZyhMT0cxLCBGTCgiUmVxIElkICVkIFNlc3Npb24gSWQgJWQiKSwKKwkJcFJlcU1zZy0+cmVxdWVzdElkLCBwUmVxTXNnLT5zZXNzaW9uSWQpOworCisJY29udGV4dCA9ICZleHRfc2Nhbl9jb250ZXh0OworCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwlJTklUX0NPTVBMRVRJT04oY29udGV4dC0+cmVzcG9uc2VfZXZlbnQpOworCWNvbnRleHQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkID0gcFJlcU1zZy0+cmVxdWVzdElkOworCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJc3RhdHVzID0gc21lX2V4dF9zY2FuX3N0b3AocEhkZEN0eC0+aEhhbCwgcFJlcU1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJzbWVfZXh0X3NjYW5fc3RvcCBmYWlsZWQoZXJyPSVkKSIpLCBzdGF0dXMpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogcmVxdWVzdCB3YXMgc2VudCAtLSB3YWl0IGZvciB0aGUgcmVzcG9uc2UgKi8KKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udGV4dC0+cmVzcG9uc2VfZXZlbnQsCisJCQkJbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9FWFRTQ0FOKSk7CisKKwlpZiAoIXJjKSB7CisJCWhkZExvZyhMT0dFLCBGTCgic21lX2V4dF9zY2FuX3N0b3AgdGltZWQgb3V0IikpOworCQlyZXR2YWwgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwkJaWYgKGNvbnRleHQtPnJlcXVlc3RfaWQgPT0gcmVxdWVzdF9pZCkKKwkJCXJldHZhbCA9IGNvbnRleHQtPnJlc3BvbnNlX3N0YXR1czsKKwkJZWxzZQorCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJc3Bpbl91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKKworZmFpbDoKKwljZGZfbWVtX2ZyZWUocFJlcU1zZyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisvKgorICogZG9uZSB3aXRoIHNob3J0IG5hbWVzIGZvciB0aGUgZ2xvYmFsIHZlbmRvciBwYXJhbXMKKyAqIHVzZWQgYnkgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zdG9wKCkKKyAqLworI3VuZGVmIFBBUkFNX01BWAorI3VuZGVmIFBBUkFNX1JFUVVFU1RfSUQKKworCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc3RvcCgpIC0gc3RvcCBleHRzY2FuCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5LgorICogQHdkZXY6IFBvaW50ZXIgdG8gd2lyZWxlc3MgZGV2aWNlLgorICogQGRhdGE6IFBvaW50ZXIgdG8gaW5wdXQgZGF0YS4KKyAqIEBkYXRhX2xlbjogTGVuZ3RoIG9mIEBkYXRhLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3N0b3Aoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCWNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3N0b3Aod2lwaHksIHdkZXYsIGRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3Jlc2V0X2Jzc2lkX2hvdGxpc3QoKSAtIHJlc2V0IGJzc2lkIGhvdGxpc3QKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXJlbGVzcyBwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdpcmVsZXNzIGRldmljZQorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW50CitfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fcmVzZXRfYnNzaWRfaG90bGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2CisJCQkJCQkgICp3ZGV2LCBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkJICBpbnQgZGF0YV9sZW4pCit7CisJdHBTaXJFeHRTY2FuUmVzZXRCc3NpZEhvdGxpc3RSZXFQYXJhbXMgcFJlcU1zZyA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fTUFYICsKKwkJCSAgMV07CisJc3RydWN0IGhkZF9leHRfc2Nhbl9jb250ZXh0ICpjb250ZXh0OworCXVpbnQzMl90IHJlcXVlc3RfaWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIHJjOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZF9lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR2YWwgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHJldHZhbCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCwKKwkJICAgICAgZGF0YSwgZGF0YV9sZW4sIHdsYW5faGRkX2V4dHNjYW5fY29uZmlnX3BvbGljeSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIEFUVFIiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBSZXFNc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnBSZXFNc2cpKTsKKwlpZiAoIXBSZXFNc2cpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjZGZfbWVtX21hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFBhcnNlIGFuZCBmZXRjaCByZXF1ZXN0IElkICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJcFJlcU1zZy0+cmVxdWVzdElkID0KKwkJbmxhX2dldF91MzIodGIKKwkJIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRF0pOworCXBSZXFNc2ctPnNlc3Npb25JZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisJaGRkTG9nKExPRzEsIEZMKCJSZXEgSWQgJWQgU2Vzc2lvbiBJZCAlZCIpLAorCQlwUmVxTXNnLT5yZXF1ZXN0SWQsIHBSZXFNc2ctPnNlc3Npb25JZCk7CisKKwljb250ZXh0ID0gJmV4dF9zY2FuX2NvbnRleHQ7CisJc3Bpbl9sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCUlOSVRfQ09NUExFVElPTihjb250ZXh0LT5yZXNwb25zZV9ldmVudCk7CisJY29udGV4dC0+cmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQgPSBwUmVxTXNnLT5yZXF1ZXN0SWQ7CisJc3Bpbl91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisKKwlzdGF0dXMgPSBzbWVfcmVzZXRfYnNzX2hvdGxpc3QocEhkZEN0eC0+aEhhbCwgcFJlcU1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJzbWVfcmVzZXRfYnNzX2hvdGxpc3QgZmFpbGVkKGVycj0lZCkiKSwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIHJlcXVlc3Qgd2FzIHNlbnQgLS0gd2FpdCBmb3IgdGhlIHJlc3BvbnNlICovCisJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQKKwkJKCZjb250ZXh0LT5yZXNwb25zZV9ldmVudCwKKwkJIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRVhUU0NBTikpOworCWlmICghcmMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJzbWVfcmVzZXRfYnNzX2hvdGxpc3QgdGltZWQgb3V0IikpOworCQlyZXR2YWwgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwkJaWYgKGNvbnRleHQtPnJlcXVlc3RfaWQgPT0gcmVxdWVzdF9pZCkKKwkJCXJldHZhbCA9IGNvbnRleHQtPnJlc3BvbnNlX3N0YXR1czsKKwkJZWxzZQorCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJc3Bpbl91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKKworZmFpbDoKKwljZGZfbWVtX2ZyZWUocFJlcU1zZyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9ic3NpZF9ob3RsaXN0KCkgLSByZXNldCBic3NpZCBob3QgbGlzdAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcmVsZXNzIHBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gd2lyZWxlc3MgZGV2aWNlCisgKiBAZGF0YTogUG9pbnRlciB0byBkYXRhCisgKiBAZGF0YV9sZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fcmVzZXRfYnNzaWRfaG90bGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQljb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9ic3NpZF9ob3RsaXN0KHdpcGh5LCB3ZGV2LAorCQkJCQkJCQlkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fcmVzZXRfc2lnbmlmaWNhbnRfY2hhbmdlKCkgLQorICoJCXJlc2V0IHNpZ25pZmljYW50IGNoYW5nZQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcmVsZXNzIHBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gd2lyZWxlc3MgZGV2aWNlCisgKiBAZGF0YTogUG9pbnRlciB0byBkYXRhCisgKiBAZGF0YV9sZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbnQKK19fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9zaWduaWZpY2FudF9jaGFuZ2Uoc3RydWN0IHdpcGh5CisJCQkJCQkgICAgICAgKndpcGh5LAorCQkJCQkJICAgICAgIHN0cnVjdAorCQkJCQkJICAgICAgIHdpcmVsZXNzX2RldgorCQkJCQkJICAgICAgICp3ZGV2LCBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkJICAgICAgIGludCBkYXRhX2xlbikKK3sKKwl0cFNpckV4dFNjYW5SZXNldFNpZ25pZmljYW50Q2hhbmdlUmVxUGFyYW1zIHBSZXFNc2cgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCArCisJCQkgIDFdOworCXN0cnVjdCBoZGRfZXh0X3NjYW5fY29udGV4dCAqY29udGV4dDsKKwl1aW50MzJfdCByZXF1ZXN0X2lkOworCUNERl9TVEFUVVMgc3RhdHVzOworCWludCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyByYzsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmV0dmFsID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSByZXR2YWwpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChubGFfcGFyc2UodGIsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9NQVgsCisJCSAgICAgIGRhdGEsIGRhdGFfbGVuLCB3bGFuX2hkZF9leHRzY2FuX2NvbmZpZ19wb2xpY3kpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBBVFRSIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwUmVxTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwUmVxTXNnKSk7CisJaWYgKCFwUmVxTXNnKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggcmVxdWVzdCBJZCAqLworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX1JFUVVFU1RfSURdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciByZXF1ZXN0IGlkIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKworCXBSZXFNc2ctPnJlcXVlc3RJZCA9CisJCW5sYV9nZXRfdTMyKHRiCisJCSBbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX1JFUVVFU1RfSURdKTsKKwlwUmVxTXNnLT5zZXNzaW9uSWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCWhkZExvZyhMT0cxLCBGTCgiUmVxIElkICVkIFNlc3Npb24gSWQgJWQiKSwKKwkJcFJlcU1zZy0+cmVxdWVzdElkLCBwUmVxTXNnLT5zZXNzaW9uSWQpOworCisJY29udGV4dCA9ICZleHRfc2Nhbl9jb250ZXh0OworCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwlJTklUX0NPTVBMRVRJT04oY29udGV4dC0+cmVzcG9uc2VfZXZlbnQpOworCWNvbnRleHQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkID0gcFJlcU1zZy0+cmVxdWVzdElkOworCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJc3RhdHVzID0gc21lX3Jlc2V0X3NpZ25pZmljYW50X2NoYW5nZShwSGRkQ3R4LT5oSGFsLCBwUmVxTXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgic21lX3Jlc2V0X3NpZ25pZmljYW50X2NoYW5nZSBmYWlsZWQoZXJyPSVkKSIpLAorCQkJc3RhdHVzKTsKKwkJY2RmX21lbV9mcmVlKHBSZXFNc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiByZXF1ZXN0IHdhcyBzZW50IC0tIHdhaXQgZm9yIHRoZSByZXNwb25zZSAqLworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb250ZXh0LT5yZXNwb25zZV9ldmVudCwKKwkJCQltc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX0VYVFNDQU4pKTsKKworCWlmICghcmMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJzbWVfUmVzZXRTaWduaWZpY2FudENoYW5nZSB0aW1lZCBvdXQiKSk7CisJCXJldHZhbCA9IC1FVElNRURPVVQ7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCQlpZiAoY29udGV4dC0+cmVxdWVzdF9pZCA9PSByZXF1ZXN0X2lkKQorCQkJcmV0dmFsID0gY29udGV4dC0+cmVzcG9uc2Vfc3RhdHVzOworCQllbHNlCisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQlzcGluX3VubG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworCitmYWlsOgorCWNkZl9tZW1fZnJlZShwUmVxTXNnKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3Jlc2V0X3NpZ25pZmljYW50X2NoYW5nZSgpIC0gcmVzZXQgc2lnbmlmaWNhbnQKKyAqCQkJCQkJCWNoYW5nZQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcmVsZXNzIHBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gd2lyZWxlc3MgZGV2aWNlCisgKiBAZGF0YTogUG9pbnRlciB0byBkYXRhCisgKiBAZGF0YV9sZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fcmVzZXRfc2lnbmlmaWNhbnRfY2hhbmdlKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkJY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFfbGVuKQoreworCWludCByZXQgPSAwOworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fcmVzZXRfc2lnbmlmaWNhbnRfY2hhbmdlKHdpcGh5LCB3ZGV2LAorCQkJCQkJZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiBoZGRfZXh0c2Nhbl9lcG5vX2ZpbGxfbmV0d29ya19saXN0KCkgLSBlcG5vIGZpbGwgbmV0d29yayBsaXN0CisgKiBAaGRkY3R4OiBIREQgY29udGV4dAorICogQHJlcV9tc2c6IHJlcXVlc3QgbWVzc2FnZQorICogQHRiOiB2ZW5kb3IgYXR0cmlidXRlIHRhYmxlCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbmV0d29yayBibG9jayBOTCB2ZW5kb3IgYXR0cmlidXRlcyBmcm9tICV0YiBhbmQKKyAqIGZpbGwgaW4gdGhlIGVwbm8gcmVxdWVzdCBtZXNzYWdlLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaGRkX2V4dHNjYW5fZXBub19maWxsX25ldHdvcmtfbGlzdCgKKwkJCWhkZF9jb250ZXh0X3QgKmhkZGN0eCwKKwkJCXN0cnVjdCB3aWZpX2Vwbm9fcGFyYW1zICpyZXFfbXNnLAorCQkJc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXN0cnVjdCBubGF0dHIgKm5ldHdvcmtbCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1VCQ01EX0NPTkZJR19QQVJBTV9NQVggKyAxXTsKKwlzdHJ1Y3QgbmxhdHRyICpuZXR3b3JrczsKKwlpbnQgcmVtMSwgc3NpZF9sZW47CisJdWludDhfdCBpbmRleCwgKnNzaWQ7CisKKwlpbmRleCA9IDA7CisJbmxhX2Zvcl9lYWNoX25lc3RlZChuZXR3b3JrcywKKwkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1NFVF9MSVNUX1BBUkFNX0VQTk9fTkVUV09SS1NfTElTVF0sCisJCXJlbTEpIHsKKwkJaWYgKG5sYV9wYXJzZShuZXR3b3JrLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX01BWCwKKwkJCW5sYV9kYXRhKG5ldHdvcmtzKSwgbmxhX2xlbihuZXR3b3JrcyksIE5VTEwpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIm5sYV9wYXJzZSBmYWlsZWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIFBhcnNlIGFuZCBmZXRjaCBzc2lkICovCisJCWlmICghbmV0d29ya1tRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX1NTSURdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgbmV0d29yayBzc2lkIGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXNzaWRfbGVuID0gbmxhX2xlbigKKwkJCW5ldHdvcmtbUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1NFVF9MSVNUX1BBUkFNX0VQTk9fTkVUV09SS19TU0lEXSk7CisKKwkJLyogRGVjcmVtZW50IGJ5IDEsIGRvbid0IGNvdW50IG51bGwgY2hhcmFjdGVyICovCisJCXNzaWRfbGVuLS07CisKKwkJcmVxX21zZy0+bmV0d29ya3NbaW5kZXhdLnNzaWQubGVuZ3RoID0gc3NpZF9sZW47CisJCWhkZExvZyhMT0cxLCBGTCgibmV0d29yayBzc2lkIGxlbmd0aCAlZCIpLCBzc2lkX2xlbik7CisJCXNzaWQgPSBubGFfZGF0YShuZXR3b3JrW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19TRVRfTElTVF9QQVJBTV9FUE5PX05FVFdPUktfU1NJRF0pOworCQljZGZfbWVtX2NvcHkocmVxX21zZy0+bmV0d29ya3NbaW5kZXhdLnNzaWQuc3NJZCwKKwkJCQlzc2lkLCBzc2lkX2xlbik7CisJCWhkZExvZyhMT0cxLCBGTCgiU3NpZCAoJS4qcykiKSwKKwkJCXJlcV9tc2ctPm5ldHdvcmtzW2luZGV4XS5zc2lkLmxlbmd0aCwKKwkJCXJlcV9tc2ctPm5ldHdvcmtzW2luZGV4XS5zc2lkLnNzSWQpOworCisJCS8qIFBhcnNlIGFuZCBmZXRjaCByc3NpIHRocmVzaG9sZCAqLworCQlpZiAoIW5ldHdvcmtbUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1NFVF9MSVNUX1BBUkFNX0VQTk9fTkVUV09SS19SU1NJX1RIUkVTSE9MRF0pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciByc3NpIHRocmVzaG9sZCBmYWlsZWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXFfbXNnLT5uZXR3b3Jrc1tpbmRleF0ucnNzaV90aHJlc2hvbGQgPSBubGFfZ2V0X3M4KAorCQkJbmV0d29ya1tRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX1JTU0lfVEhSRVNIT0xEXSk7CisJCWhkZExvZyhMT0cxLCBGTCgicnNzaSB0aHJlc2hvbGQgJWQiKSwKKwkJCXJlcV9tc2ctPm5ldHdvcmtzW2luZGV4XS5yc3NpX3RocmVzaG9sZCk7CisKKwkJLyogUGFyc2UgYW5kIGZldGNoIGVwbm8gZmxhZ3MgKi8KKwkJaWYgKCFuZXR3b3JrW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19TRVRfTElTVF9QQVJBTV9FUE5PX05FVFdPUktfRkxBR1NdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgZXBubyBmbGFncyBmYWlsZWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXFfbXNnLT5uZXR3b3Jrc1tpbmRleF0uZmxhZ3MgPSBubGFfZ2V0X3U4KAorCQkJbmV0d29ya1tRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fRVBOT19ORVRXT1JLX0ZMQUdTXSk7CisJCWhkZExvZyhMT0cxLCBGTCgiZmxhZ3MgJXUiKSwgcmVxX21zZy0+bmV0d29ya3NbaW5kZXhdLmZsYWdzKTsKKworCQkvKiBQYXJzZSBhbmQgZmV0Y2ggYXV0aCBiaXQgKi8KKwkJaWYgKCFuZXR3b3JrW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19TRVRfTElTVF9QQVJBTV9FUE5PX05FVFdPUktfQVVUSF9CSVRdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgYXV0aCBiaXQgZmFpbGVkIikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVxX21zZy0+bmV0d29ya3NbaW5kZXhdLmF1dGhfYml0X2ZpZWxkID0gbmxhX2dldF91OCgKKwkJCW5ldHdvcmtbUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1NFVF9MSVNUX1BBUkFNX0VQTk9fTkVUV09SS19BVVRIX0JJVF0pOworCQloZGRMb2coTE9HMSwgRkwoImF1dGggYml0ICV1IiksCisJCQlyZXFfbXNnLT5uZXR3b3Jrc1tpbmRleF0uYXV0aF9iaXRfZmllbGQpOworCisJCWluZGV4Kys7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2Vwbm9fbGlzdCgpIC0gZXBubyBzZXQgbmV0d29yayBsaXN0CisgKiBAd2lwaHk6IHdpcGh5CisgKiBAd2RldjogcG9pbnRlciB0byB3aXJlbGVzcyBkZXYKKyAqIEBkYXRhOiBkYXRhIHBvaW50ZXIKKyAqIEBkYXRhX2xlbjogZGF0YSBsZW5ndGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBOTCB2ZW5kb3IgYXR0cmlidXRlcyBmcm9tICV0YiBhbmQKKyAqIGZpbGwgaW4gdGhlIGVwbm8gcmVxdWVzdCBtZXNzYWdlLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfZXBub19saXN0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3Qgd2lmaV9lcG5vX3BhcmFtcyAqcmVxX21zZyA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiAgICAgICAgICAgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciAgICAgICAgICAgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ICAgICAgICAgICA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBubGF0dHIgKnRiWworCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fTUFYICsgMV07CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3QgbnVtX25ldHdvcmtzLCBsZW47CisJaW50IHJldF92YWw7CisKKwlFTlRFUigpOworCisJcmV0X3ZhbCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChubGFfcGFyc2UodGIsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19NQVgsCisJCWRhdGEsIGRhdGFfbGVuLAorCQl3bGFuX2hkZF9leHRzY2FuX2NvbmZpZ19wb2xpY3kpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBBVFRSIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggbnVtYmVyIG9mIG5ldHdvcmtzICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fTlVNX05FVFdPUktTXSkgeworCQloZGRMb2coTE9HRSwgRkwoImF0dHIgbnVtIG5ldHdvcmtzIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW51bV9uZXR3b3JrcyA9IG5sYV9nZXRfdTMyKAorCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fU0VUX0xJU1RfUEFSQU1fTlVNX05FVFdPUktTXSk7CisJaGRkTG9nKExPRzEsIEZMKCJudW0gbmV0d29ya3MgJXUiKSwgbnVtX25ldHdvcmtzKTsKKworCWxlbiA9IHNpemVvZigqcmVxX21zZykgKworCQkobnVtX25ldHdvcmtzICogc2l6ZW9mKHN0cnVjdCB3aWZpX2Vwbm9fbmV0d29yaykpOworCXJlcV9tc2cgPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCWlmICghcmVxX21zZykgeworCQloZGRMb2coTE9HRSwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNkZl9tZW1femVybyhyZXFfbXNnLCBsZW4pOworCXJlcV9tc2ctPm51bV9uZXR3b3JrcyA9IG51bV9uZXR3b3JrczsKKworCS8qIFBhcnNlIGFuZCBmZXRjaCByZXF1ZXN0IElkICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCXJlcV9tc2ctPnJlcXVlc3RfaWQgPSBubGFfZ2V0X3UzMigKKwkgICAgdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX1JFUVVFU1RfSURdKTsKKwloZGRMb2coTE9HMSwgRkwoIlJlcSBJZCAldSIpLCByZXFfbXNnLT5yZXF1ZXN0X2lkKTsKKworCXJlcV9tc2ctPnNlc3Npb25faWQgPSBhZGFwdGVyLT5zZXNzaW9uSWQ7CisJaGRkTG9nKExPRzEsIEZMKCJTZXNzaW9uIElkICVkIiksIHJlcV9tc2ctPnNlc3Npb25faWQpOworCisJaWYgKGhkZF9leHRzY2FuX2Vwbm9fZmlsbF9uZXR3b3JrX2xpc3QoaGRkX2N0eCwgcmVxX21zZywgdGIpKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBzbWVfc2V0X2Vwbm9fbGlzdChoZGRfY3R4LT5oSGFsLCByZXFfbXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgic21lX3NldF9lcG5vX2xpc3QgZmFpbGVkKGVycj0lZCkiKSwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0KKworCUVYSVQoKTsKKwljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJY2RmX21lbV9mcmVlKHJlcV9tc2cpOworCXJldHVybiAtRUlOVkFMOworfQorCisgLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfZXBub19saXN0KCkgLSBlcG5vIHNldCBuZXR3b3JrIGxpc3QKKyAqIEB3aXBoeTogd2lwaHkKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHdpcmVsZXNzIGRldgorICogQGRhdGE6IGRhdGEgcG9pbnRlcgorICogQGRhdGFfbGVuOiBkYXRhIGxlbmd0aAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIE5MIHZlbmRvciBhdHRyaWJ1dGVzIGZyb20gJXRiIGFuZAorICogZmlsbCBpbiB0aGUgZXBubyByZXF1ZXN0IG1lc3NhZ2UuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3NldF9lcG5vX2xpc3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2Vwbm9fbGlzdCh3aXBoeSwgd2RldiwKKwkJCQkJCWRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9leHRzY2FuX3Bhc3Nwb2ludF9maWxsX25ldHdvcmtfbGlzdCgpIC0gcGFzc3BvaW50IGZpbGwgbmV0d29yayBsaXN0CisgKiBAaGRkY3R4OiBIREQgY29udGV4dAorICogQHJlcV9tc2c6IHJlcXVlc3QgbWVzc2FnZQorICogQHRiOiB2ZW5kb3IgYXR0cmlidXRlIHRhYmxlCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbmV0d29yayBibG9jayBOTCB2ZW5kb3IgYXR0cmlidXRlcyBmcm9tICV0YiBhbmQKKyAqIGZpbGwgaW4gdGhlIHBhc3Nwb2ludCByZXF1ZXN0IG1lc3NhZ2UuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBoZGRfZXh0c2Nhbl9wYXNzcG9pbnRfZmlsbF9uZXR3b3JrX2xpc3QoCisJCQloZGRfY29udGV4dF90ICpoZGRjdHgsCisJCQlzdHJ1Y3Qgd2lmaV9wYXNzcG9pbnRfcmVxICpyZXFfbXNnLAorCQkJc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXN0cnVjdCBubGF0dHIgKm5ldHdvcmtbUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX01BWCArIDFdOworCXN0cnVjdCBubGF0dHIgKm5ldHdvcmtzOworCWludCByZW0xLCBsZW47CisJdWludDhfdCBpbmRleDsKKworCWluZGV4ID0gMDsKKwlubGFfZm9yX2VhY2hfbmVzdGVkKG5ldHdvcmtzLAorCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX0xJU1RfUEFSQU1fTkVUV09SS19BUlJBWV0sCisJCXJlbTEpIHsKKwkJaWYgKG5sYV9wYXJzZShuZXR3b3JrLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX01BWCwKKwkJCW5sYV9kYXRhKG5ldHdvcmtzKSwgbmxhX2xlbihuZXR3b3JrcyksIE5VTEwpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIm5sYV9wYXJzZSBmYWlsZWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIFBhcnNlIGFuZCBmZXRjaCBpZGVudGlmaWVyICovCisJCWlmICghbmV0d29ya1tRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX05FVFdPUktfUEFSQU1fSURdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgcGFzc3BvaW50IGlkIGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJlcV9tc2ctPm5ldHdvcmtzW2luZGV4XS5pZCA9IG5sYV9nZXRfdTMyKAorCQkJbmV0d29ya1tRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX05FVFdPUktfUEFSQU1fSURdKTsKKwkJaGRkTG9nKExPRzEsIEZMKCJJZCAldSIpLCByZXFfbXNnLT5uZXR3b3Jrc1tpbmRleF0uaWQpOworCisJCS8qIFBhcnNlIGFuZCBmZXRjaCByZWFsbSAqLworCQlpZiAoIW5ldHdvcmtbUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9ORVRXT1JLX1BBUkFNX1JFQUxNXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlYWxtIGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWxlbiA9IG5sYV9sZW4oCisJCQluZXR3b3JrW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1BOT19QQVNTUE9JTlRfTkVUV09SS19QQVJBTV9SRUFMTV0pOworCQlpZiAobGVuIDwgMCB8fCBsZW4gPiBTSVJfUEFTU1BPSU5UX1JFQUxNX0xFTikgeworCQkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIHJlYWxtIHNpemUgJWQiKSwgbGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWNkZl9tZW1fY29weShyZXFfbXNnLT5uZXR3b3Jrc1tpbmRleF0ucmVhbG0sCisJCQkJbmxhX2RhdGEobmV0d29ya1tRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX05FVFdPUktfUEFSQU1fUkVBTE1dKSwKKwkJCQlsZW4pOworCQloZGRMb2coTE9HMSwgRkwoInJlYWxtIGxlbiAlZCIpLCBsZW4pOworCQloZGRMb2coTE9HMSwgRkwoInJlYWxtOiAlcyIpLCByZXFfbXNnLT5uZXR3b3Jrc1tpbmRleF0ucmVhbG0pOworCisJCS8qIFBhcnNlIGFuZCBmZXRjaCByb2FtaW5nIGNvbnNvcnRpdW0gaWRzICovCisJCWlmICghbmV0d29ya1tRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX05FVFdPUktfUEFSQU1fUk9BTV9DTlNSVE1fSURdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgcm9hbWluZyBjb25zb3J0aXVtIGlkcyBmYWlsZWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlubGFfbWVtY3B5KCZyZXFfbXNnLT5uZXR3b3Jrc1tpbmRleF0ucm9hbWluZ19jb25zb3J0aXVtX2lkcywKKwkJCW5ldHdvcmtbUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9ORVRXT1JLX1BBUkFNX1JPQU1fQ05TUlRNX0lEXSwKKwkJCXNpemVvZihyZXFfbXNnLT5uZXR3b3Jrc1swXS5yb2FtaW5nX2NvbnNvcnRpdW1faWRzKSk7CisJCWhkZExvZyhMT0cxLCBGTCgicm9hbWluZyBjb25zb3J0aXVtIGlkcyIpKTsKKworCQkvKiBQYXJzZSBhbmQgZmV0Y2ggcGxtbiAqLworCQlpZiAoIW5ldHdvcmtbUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9ORVRXT1JLX1BBUkFNX1JPQU1fUExNTl0pIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBwbG1uIGZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW5sYV9tZW1jcHkoJnJlcV9tc2ctPm5ldHdvcmtzW2luZGV4XS5wbG1uLAorCQkJbmV0d29ya1tRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fUEFTU1BPSU5UX05FVFdPUktfUEFSQU1fUk9BTV9QTE1OXSwKKwkJCVNJUl9QQVNTUE9JTlRfUExNTl9MRU4pOworCQloZGRMb2coTE9HMSwgRkwoInBsbW4gJTAyeDolMDJ4OiUwMngpIiksCisJCQlyZXFfbXNnLT5uZXR3b3Jrc1tpbmRleF0ucGxtblswXSwKKwkJCXJlcV9tc2ctPm5ldHdvcmtzW2luZGV4XS5wbG1uWzFdLAorCQkJcmVxX21zZy0+bmV0d29ya3NbaW5kZXhdLnBsbW5bMl0pOworCisJCWluZGV4Kys7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Bhc3Nwb2ludF9saXN0KCkgLSBzZXQgcGFzc3BvaW50IG5ldHdvcmsgbGlzdAorICogQHdpcGh5OiB3aXBoeQorICogQHdkZXY6IHBvaW50ZXIgdG8gd2lyZWxlc3MgZGV2CisgKiBAZGF0YTogZGF0YSBwb2ludGVyCisgKiBAZGF0YV9sZW46IGRhdGEgbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgTkwgdmVuZG9yIGF0dHJpYnV0ZXMgZnJvbSAldGIgYW5kCisgKiBmaWxsIGluIHRoZSBwYXNzcG9pbnQgcmVxdWVzdCBtZXNzYWdlLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfcGFzc3BvaW50X2xpc3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCSAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJCSAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCSAgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKnJlcV9tc2cgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgICAgICAgICAgICAgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciAgICAgICAgICAgICA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggICAgICAgICAgICAgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fTUFYICsgMV07CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3QgbnVtX25ldHdvcmtzID0gMDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZF9lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fTUFYLCBkYXRhLCBkYXRhX2xlbiwKKwkJd2xhbl9oZGRfZXh0c2Nhbl9jb25maWdfcG9saWN5KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUGFyc2UgYW5kIGZldGNoIG51bWJlciBvZiBuZXR3b3JrcyAqLworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9MSVNUX1BBUkFNX05VTV0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIG51bSBuZXR3b3JrcyBmYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwludW1fbmV0d29ya3MgPSBubGFfZ2V0X3UzMigKKwkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX1BBU1NQT0lOVF9MSVNUX1BBUkFNX05VTV0pOworCWhkZExvZyhMT0cxLCBGTCgibnVtIG5ldHdvcmtzICV1IiksIG51bV9uZXR3b3Jrcyk7CisKKwlyZXFfbXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpyZXFfbXNnKSArCisJCQkobnVtX25ldHdvcmtzICogc2l6ZW9mKHJlcV9tc2ctPm5ldHdvcmtzWzBdKSkpOworCWlmICghcmVxX21zZykgeworCQloZGRMb2coTE9HRSwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJlcV9tc2ctPm51bV9uZXR3b3JrcyA9IG51bV9uZXR3b3JrczsKKworCS8qIFBhcnNlIGFuZCBmZXRjaCByZXF1ZXN0IElkICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCXJlcV9tc2ctPnJlcXVlc3RfaWQgPSBubGFfZ2V0X3UzMigKKwkgICAgdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX1JFUVVFU1RfSURdKTsKKworCXJlcV9tc2ctPnNlc3Npb25faWQgPSBhZGFwdGVyLT5zZXNzaW9uSWQ7CisJaGRkTG9nKExPRzEsIEZMKCJSZXEgSWQgJXUgU2Vzc2lvbiBJZCAlZCIpLCByZXFfbXNnLT5yZXF1ZXN0X2lkLAorCQkJcmVxX21zZy0+c2Vzc2lvbl9pZCk7CisKKwlpZiAoaGRkX2V4dHNjYW5fcGFzc3BvaW50X2ZpbGxfbmV0d29ya19saXN0KGhkZF9jdHgsIHJlcV9tc2csIHRiKSkKKwkJZ290byBmYWlsOworCisJc3RhdHVzID0gc21lX3NldF9wYXNzcG9pbnRfbGlzdChoZGRfY3R4LT5oSGFsLCByZXFfbXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoInNtZV9zZXRfcGFzc3BvaW50X2xpc3QgZmFpbGVkKGVycj0lZCkiKSwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0KKworCUVYSVQoKTsKKwljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJY2RmX21lbV9mcmVlKHJlcV9tc2cpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3NldF9wYXNzcG9pbnRfbGlzdCgpIC0gc2V0IHBhc3Nwb2ludCBuZXR3b3JrIGxpc3QKKyAqIEB3aXBoeTogd2lwaHkKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHdpcmVsZXNzIGRldgorICogQGRhdGE6IGRhdGEgcG9pbnRlcgorICogQGRhdGFfbGVuOiBkYXRhIGxlbmd0aAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIE5MIHZlbmRvciBhdHRyaWJ1dGVzIGZyb20gJXRiIGFuZAorICogZmlsbCBpbiB0aGUgcGFzc3BvaW50IHJlcXVlc3QgbWVzc2FnZS4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Bhc3Nwb2ludF9saXN0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9wYXNzcG9pbnRfbGlzdCh3aXBoeSwgd2RldiwKKwkJCQkJCSAgICAgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9yZXNldF9wYXNzcG9pbnRfbGlzdCgpIC0gcmVzZXQgcGFzc3BvaW50IG5ldHdvcmsgbGlzdAorICogQHdpcGh5OiB3aXBoeQorICogQHdkZXY6IHBvaW50ZXIgdG8gd2lyZWxlc3MgZGV2CisgKiBAZGF0YTogZGF0YSBwb2ludGVyCisgKiBAZGF0YV9sZW46IGRhdGEgbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgcGFzc3BvaW50IG5ldHdvcmtzIGxpc3QKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfcmVzZXRfcGFzc3BvaW50X2xpc3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCSAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCQkgICAgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKnJlcV9tc2cgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgICAgICAgICAgICAgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciAgICAgICAgICAgICA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggICAgICAgICAgICAgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9QTk9fTUFYICsgMV07CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfUE5PX01BWCwgZGF0YSwgZGF0YV9sZW4sCisJCXdsYW5faGRkX2V4dHNjYW5fY29uZmlnX3BvbGljeSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIEFUVFIiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcV9tc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnJlcV9tc2cpKTsKKwlpZiAoIXJlcV9tc2cpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjZGZfbWVtX21hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFBhcnNlIGFuZCBmZXRjaCByZXF1ZXN0IElkICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCXJlcV9tc2ctPnJlcXVlc3RfaWQgPSBubGFfZ2V0X3UzMigKKwkgICAgdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TVUJDTURfQ09ORklHX1BBUkFNX1JFUVVFU1RfSURdKTsKKworCXJlcV9tc2ctPnNlc3Npb25faWQgPSBhZGFwdGVyLT5zZXNzaW9uSWQ7CisJaGRkTG9nKExPRzEsIEZMKCJSZXEgSWQgJXUgU2Vzc2lvbiBJZCAlZCIpLAorCQkJcmVxX21zZy0+cmVxdWVzdF9pZCwgcmVxX21zZy0+c2Vzc2lvbl9pZCk7CisKKwlzdGF0dXMgPSBzbWVfcmVzZXRfcGFzc3BvaW50X2xpc3QoaGRkX2N0eC0+aEhhbCwgcmVxX21zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJzbWVfcmVzZXRfcGFzc3BvaW50X2xpc3QgZmFpbGVkKGVycj0lZCkiKSwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0KKworCUVYSVQoKTsKKwljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJY2RmX21lbV9mcmVlKHJlcV9tc2cpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3Jlc2V0X3Bhc3Nwb2ludF9saXN0KCkgLSByZXNldCBwYXNzcG9pbnQgbmV0d29yayBsaXN0CisgKiBAd2lwaHk6IHdpcGh5CisgKiBAd2RldjogcG9pbnRlciB0byB3aXJlbGVzcyBkZXYKKyAqIEBkYXRhOiBkYXRhIHBvaW50ZXIKKyAqIEBkYXRhX2xlbjogZGF0YSBsZW5ndGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBwYXNzcG9pbnQgbmV0d29ya3MgbGlzdAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9yZXNldF9wYXNzcG9pbnRfbGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9yZXNldF9wYXNzcG9pbnRfbGlzdCh3aXBoeSwgd2RldiwKKwkJCQkJCSAgICAgICBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGRlZmluZSBzaG9ydCBuYW1lcyBmb3IgdGhlIGdsb2JhbCB2ZW5kb3IgcGFyYW1zCisgKiB1c2VkIGJ5IF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zZXRfc3NpZF9ob3RsaXN0KCkKKyAqLworI2RlZmluZSBQQVJBTV9NQVggXAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fTUFYCisjZGVmaW5lIFBBUkFNX1JFUVVFU1RfSUQgXAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRAorI2RlZmluZSBQQVJBTVNfTE9TVF9TU0lEX1NBTVBMRV9TSVpFIFwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TU0lEX0hPVExJU1RfUEFSQU1TX0xPU1RfU1NJRF9TQU1QTEVfU0laRQorI2RlZmluZSBQQVJBTVNfTlVNX1NTSUQgXAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NTSURfSE9UTElTVF9QQVJBTVNfTlVNX1NTSUQKKyNkZWZpbmUgVEhSRVNIT0xEX1BBUkFNIFwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TU0lEX1RIUkVTSE9MRF9QQVJBTQorI2RlZmluZSBQQVJBTV9TU0lEIFwKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRVhUU0NBTl9TU0lEX1RIUkVTSE9MRF9QQVJBTV9TU0lECisjZGVmaW5lIFBBUkFNX0JBTkQgXAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NTSURfVEhSRVNIT0xEX1BBUkFNX0JBTkQKKyNkZWZpbmUgUEFSQU1fUlNTSV9MT1cgXAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NTSURfVEhSRVNIT0xEX1BBUkFNX1JTU0lfTE9XCisjZGVmaW5lIFBBUkFNX1JTU0lfSElHSCBcCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0VYVFNDQU5fU1NJRF9USFJFU0hPTERfUEFSQU1fUlNTSV9ISUdICisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NldF9zc2lkX2hvdGxpc3QoKSAtIHNldCBzc2lkIGhvdCBsaXN0CisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3aXJlbGVzcyBkZXZpY2UKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50CitfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc2V0X3NzaWRfaG90bGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IHNpcl9zZXRfc3NpZF9ob3RsaXN0X3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBubGF0dHIgKnRiW1BBUkFNX01BWCArIDFdOworCXN0cnVjdCBubGF0dHIgKnRiMltQQVJBTV9NQVggKyAxXTsKKwlzdHJ1Y3QgbmxhdHRyICpzc2lkczsKKwlzdHJ1Y3QgaGRkX2V4dF9zY2FuX2NvbnRleHQgKmNvbnRleHQ7CisJdWludDMyX3QgcmVxdWVzdF9pZDsKKwljaGFyIHNzaWRfc3RyaW5nW1NJUl9NQUNfTUFYX1NTSURfTEVOR1RIICsgMV07CisJaW50IHNzaWRfbGVuLCBpLCByZW07CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIHJjOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZF9lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR2YWwgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldHZhbCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5sYV9wYXJzZSh0YiwgUEFSQU1fTUFYLAorCQkgICAgICBkYXRhLCBkYXRhX2xlbiwKKwkJICAgICAgd2xhbl9oZGRfZXh0c2Nhbl9jb25maWdfcG9saWN5KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghcmVxdWVzdCkgeworCQloZGRMb2coTE9HRSwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUGFyc2UgYW5kIGZldGNoIHJlcXVlc3QgSWQgKi8KKwlpZiAoIXRiW1BBUkFNX1JFUVVFU1RfSURdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciByZXF1ZXN0IGlkIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKworCXJlcXVlc3QtPnJlcXVlc3RfaWQgPSBubGFfZ2V0X3UzMih0YltQQVJBTV9SRVFVRVNUX0lEXSk7CisJaGRkTG9nKExPRzEsIEZMKCJSZXF1ZXN0IElkICVkIiksIHJlcXVlc3QtPnJlcXVlc3RfaWQpOworCisJLyogUGFyc2UgYW5kIGZldGNoIGxvc3QgU1NJRCBzYW1wbGUgc2l6ZSAqLworCWlmICghdGJbUEFSQU1TX0xPU1RfU1NJRF9TQU1QTEVfU0laRV0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIG51bWJlciBvZiBTc2lkIGZhaWxlZCIpKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXF1ZXN0LT5sb3N0X3NzaWRfc2FtcGxlX3NpemUgPQorCQlubGFfZ2V0X3UzMih0YltQQVJBTVNfTE9TVF9TU0lEX1NBTVBMRV9TSVpFXSk7CisJaGRkTG9nKExPRzEsIEZMKCJMb3N0IFNTSUQgU2FtcGxlIFNpemUgJWQiKSwKKwkgICAgICAgcmVxdWVzdC0+bG9zdF9zc2lkX3NhbXBsZV9zaXplKTsKKworCS8qIFBhcnNlIGFuZCBmZXRjaCBudW1iZXIgb2YgaG90bGlzdCBTU0lEICovCisJaWYgKCF0YltQQVJBTVNfTlVNX1NTSURdKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiYXR0ciBudW1iZXIgb2YgU3NpZCBmYWlsZWQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJcmVxdWVzdC0+c3NpZF9jb3VudCA9IG5sYV9nZXRfdTMyKHRiW1BBUkFNU19OVU1fU1NJRF0pOworCWhkZExvZyhMT0cxLCBGTCgiTnVtYmVyIG9mIFNTSUQgJWQiKSwgcmVxdWVzdC0+c3NpZF9jb3VudCk7CisKKwlyZXF1ZXN0LT5zZXNzaW9uX2lkID0gYWRhcHRlci0+c2Vzc2lvbklkOworCWhkZExvZyhMT0cxLCBGTCgiU2Vzc2lvbiBJZCAlZCIpLCByZXF1ZXN0LT5zZXNzaW9uX2lkKTsKKworCWkgPSAwOworCW5sYV9mb3JfZWFjaF9uZXN0ZWQoc3NpZHMsIHRiW1RIUkVTSE9MRF9QQVJBTV0sIHJlbSkgeworCQlpZiAoaSA+PSBXTEFOX0VYVFNDQU5fTUFYX0hPVExJU1RfU1NJRFMpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgIEZMKCJUb28gTWFueSBTU0lEcywgJWQgZXhjZWVkcyAlZCIpLAorCQkJICAgICAgIGksIFdMQU5fRVhUU0NBTl9NQVhfSE9UTElTVF9TU0lEUyk7CisJCQlicmVhazsKKwkJfQorCQlpZiAobmxhX3BhcnNlKHRiMiwgUEFSQU1fTUFYLAorCQkJICAgICAgbmxhX2RhdGEoc3NpZHMpLCBubGFfbGVuKHNzaWRzKSwKKwkJCSAgICAgIHdsYW5faGRkX2V4dHNjYW5fY29uZmlnX3BvbGljeSkpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgibmxhX3BhcnNlIGZhaWxlZCIpKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCS8qIFBhcnNlIGFuZCBmZXRjaCBTU0lEICovCisJCWlmICghdGIyW1BBUkFNX1NTSURdKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgc3NpZCBmYWlsZWQiKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJbmxhX21lbWNweShzc2lkX3N0cmluZywKKwkJCSAgIHRiMltQQVJBTV9TU0lEXSwKKwkJCSAgIHNpemVvZihzc2lkX3N0cmluZykpOworCQloZGRMb2coTE9HMSwgRkwoIlNTSUQgJXMiKSwKKwkJICAgICAgIHNzaWRfc3RyaW5nKTsKKwkJc3NpZF9sZW4gPSBzdHJsZW4oc3NpZF9zdHJpbmcpOworCQltZW1jcHkocmVxdWVzdC0+c3NpZHNbaV0uc3NpZC5zc0lkLCBzc2lkX3N0cmluZywgc3NpZF9sZW4pOworCQlyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLmxlbmd0aCA9IHNzaWRfbGVuOworCisJCS8qIFBhcnNlIGFuZCBmZXRjaCBsb3cgUlNTSSAqLworCQlpZiAoIXRiMltQQVJBTV9CQU5EXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIGJhbmQgZmFpbGVkIikpOworCQkJZ290byBmYWlsOworCQl9CisJCXJlcXVlc3QtPnNzaWRzW2ldLmJhbmQgPSBubGFfZ2V0X3U4KHRiMltQQVJBTV9CQU5EXSk7CisJCWhkZExvZyhMT0cxLCBGTCgiYmFuZCAlZCIpLCByZXF1ZXN0LT5zc2lkc1tpXS5iYW5kKTsKKworCQkvKiBQYXJzZSBhbmQgZmV0Y2ggbG93IFJTU0kgKi8KKwkJaWYgKCF0YjJbUEFSQU1fUlNTSV9MT1ddKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImF0dHIgbG93IFJTU0kgZmFpbGVkIikpOworCQkJZ290byBmYWlsOworCQl9CisJCXJlcXVlc3QtPnNzaWRzW2ldLnJzc2lfbG93ID0gbmxhX2dldF9zMzIodGIyW1BBUkFNX1JTU0lfTE9XXSk7CisJCWhkZExvZyhMT0cxLCBGTCgiUlNTSSBsb3cgJWQiKSwgcmVxdWVzdC0+c3NpZHNbaV0ucnNzaV9sb3cpOworCisJCS8qIFBhcnNlIGFuZCBmZXRjaCBoaWdoIFJTU0kgKi8KKwkJaWYgKCF0YjJbUEFSQU1fUlNTSV9ISUdIXSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIGhpZ2ggUlNTSSBmYWlsZWQiKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcmVxdWVzdC0+c3NpZHNbaV0ucnNzaV9oaWdoID0gbmxhX2dldF91MzIodGIyW1BBUkFNX1JTU0lfSElHSF0pOworCQloZGRMb2coTE9HMSwgRkwoIlJTU0kgaGlnaCAlZCIpLCByZXF1ZXN0LT5zc2lkc1tpXS5yc3NpX2hpZ2gpOworCQlpKys7CisJfQorCisJY29udGV4dCA9ICZleHRfc2Nhbl9jb250ZXh0OworCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwlJTklUX0NPTVBMRVRJT04oY29udGV4dC0+cmVzcG9uc2VfZXZlbnQpOworCWNvbnRleHQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkID0gcmVxdWVzdC0+cmVxdWVzdF9pZDsKKwlzcGluX3VubG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKworCXN0YXR1cyA9IHNtZV9zZXRfc3NpZF9ob3RsaXN0KGhkZF9jdHgtPmhIYWwsIHJlcXVlc3QpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgic21lX3NldF9zc2lkX2hvdGxpc3QgZmFpbGVkKGVycj0lZCkiKSwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0KKworCWNkZl9tZW1fZnJlZShyZXF1ZXN0KTsKKworCS8qIHJlcXVlc3Qgd2FzIHNlbnQgLS0gd2FpdCBmb3IgdGhlIHJlc3BvbnNlICovCisJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNvbnRleHQtPnJlc3BvbnNlX2V2ZW50LAorCQkJCQkgbXNlY3NfdG9famlmZmllcworCQkJCQkJKFdMQU5fV0FJVF9USU1FX0VYVFNDQU4pKTsKKwlpZiAoIXJjKSB7CisJCWhkZExvZyhMT0dFLCBGTCgic21lX3NldF9zc2lkX2hvdGxpc3QgdGltZWQgb3V0IikpOworCQlyZXR2YWwgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwkJaWYgKGNvbnRleHQtPnJlcXVlc3RfaWQgPT0gcmVxdWVzdF9pZCkKKwkJCXJldHZhbCA9IGNvbnRleHQtPnJlc3BvbnNlX3N0YXR1czsKKwkJZWxzZQorCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJc3Bpbl91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKKworZmFpbDoKKwljZGZfbWVtX2ZyZWUocmVxdWVzdCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBkb25lIHdpdGggc2hvcnQgbmFtZXMgZm9yIHRoZSBnbG9iYWwgdmVuZG9yIHBhcmFtcworICogdXNlZCBieSB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NldF9zc2lkX2hvdGxpc3QoKQorICovCisjdW5kZWYgUEFSQU1fTUFYCisjdW5kZWYgUEFSQU1fUkVRVUVTVF9JRAorI3VuZGVmIFBBUkFNU19OVU1fU1NJRAorI3VuZGVmIFRIUkVTSE9MRF9QQVJBTQorI3VuZGVmIFBBUkFNX1NTSUQKKyN1bmRlZiBQQVJBTV9CQU5ECisjdW5kZWYgUEFSQU1fUlNTSV9MT1cKKyN1bmRlZiBQQVJBTV9SU1NJX0hJR0gKKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NldF9zc2lkX2hvdGxpc3QoKSAtIHNldCBzc2lkIGhvdCBsaXN0CisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lyZWxlc3MgcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3aXJlbGVzcyBkZXZpY2UKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZQorICovCitpbnQKK3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc2V0X3NzaWRfaG90bGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NldF9zc2lkX2hvdGxpc3Qod2lwaHksIHdkZXYsIGRhdGEsCisJCQkJCQkJZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBkZWZpbmUgc2hvcnQgbmFtZXMgZm9yIHRoZSBnbG9iYWwgdmVuZG9yIHBhcmFtcworICogdXNlZCBieSBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fcmVzZXRfc3NpZF9ob3RsaXN0KCkKKyAqLworI2RlZmluZSBQQVJBTV9NQVggXAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fTUFYCisjZGVmaW5lIFBBUkFNX1JFUVVFU1RfSUQgXAorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9FWFRTQ0FOX1NVQkNNRF9DT05GSUdfUEFSQU1fUkVRVUVTVF9JRAorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9zc2lkX2hvdGxpc3QoKSAtIHJlc2V0IHNzaWQgaG90IGxpc3QKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXJlbGVzcyBwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdpcmVsZXNzIGRldmljZQorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK19fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9zc2lkX2hvdGxpc3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgICAgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCBzaXJfc2V0X3NzaWRfaG90bGlzdF9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltQQVJBTV9NQVggKyAxXTsKKwlzdHJ1Y3QgaGRkX2V4dF9zY2FuX2NvbnRleHQgKmNvbnRleHQ7CisJdWludDMyX3QgcmVxdWVzdF9pZDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgcmM7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldHZhbCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0dmFsKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiLCBQQVJBTV9NQVgsCisJCSAgICAgIGRhdGEsIGRhdGFfbGVuLAorCQkgICAgICB3bGFuX2hkZF9leHRzY2FuX2NvbmZpZ19wb2xpY3kpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBBVFRSIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXF1ZXN0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFyZXF1ZXN0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBQYXJzZSBhbmQgZmV0Y2ggcmVxdWVzdCBJZCAqLworCWlmICghdGJbUEFSQU1fUkVRVUVTVF9JRF0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhdHRyIHJlcXVlc3QgaWQgZmFpbGVkIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmVxdWVzdC0+cmVxdWVzdF9pZCA9IG5sYV9nZXRfdTMyKHRiW1BBUkFNX1JFUVVFU1RfSURdKTsKKwloZGRMb2coTE9HMSwgRkwoIlJlcXVlc3QgSWQgJWQiKSwgcmVxdWVzdC0+cmVxdWVzdF9pZCk7CisKKwlyZXF1ZXN0LT5zZXNzaW9uX2lkID0gYWRhcHRlci0+c2Vzc2lvbklkOworCWhkZExvZyhMT0cxLCBGTCgiU2Vzc2lvbiBJZCAlZCIpLCByZXF1ZXN0LT5zZXNzaW9uX2lkKTsKKworCXJlcXVlc3QtPmxvc3Rfc3NpZF9zYW1wbGVfc2l6ZSA9IDA7CisJcmVxdWVzdC0+c3NpZF9jb3VudCA9IDA7CisKKwljb250ZXh0ID0gJmV4dF9zY2FuX2NvbnRleHQ7CisJc3Bpbl9sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCUlOSVRfQ09NUExFVElPTihjb250ZXh0LT5yZXNwb25zZV9ldmVudCk7CisJY29udGV4dC0+cmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQgPSByZXF1ZXN0LT5yZXF1ZXN0X2lkOworCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJc3RhdHVzID0gc21lX3NldF9zc2lkX2hvdGxpc3QoaGRkX2N0eC0+aEhhbCwgcmVxdWVzdCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJzbWVfcmVzZXRfc3NpZF9ob3RsaXN0IGZhaWxlZChlcnI9JWQpIiksIHN0YXR1cyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwljZGZfbWVtX2ZyZWUocmVxdWVzdCk7CisKKwkvKiByZXF1ZXN0IHdhcyBzZW50IC0tIHdhaXQgZm9yIHRoZSByZXNwb25zZSAqLworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb250ZXh0LT5yZXNwb25zZV9ldmVudCwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCShXTEFOX1dBSVRfVElNRV9FWFRTQ0FOKSk7CisJaWYgKCFyYykgeworCQloZGRMb2coTE9HRSwgRkwoInNtZV9yZXNldF9zc2lkX2hvdGxpc3QgdGltZWQgb3V0IikpOworCQlyZXR2YWwgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwkJaWYgKGNvbnRleHQtPnJlcXVlc3RfaWQgPT0gcmVxdWVzdF9pZCkKKwkJCXJldHZhbCA9IGNvbnRleHQtPnJlc3BvbnNlX3N0YXR1czsKKwkJZWxzZQorCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJc3Bpbl91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKKworZmFpbDoKKwljZGZfbWVtX2ZyZWUocmVxdWVzdCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBkb25lIHdpdGggc2hvcnQgbmFtZXMgZm9yIHRoZSBnbG9iYWwgdmVuZG9yIHBhcmFtcworICogdXNlZCBieSB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3Jlc2V0X3NzaWRfaG90bGlzdCgpCisgKi8KKyN1bmRlZiBQQVJBTV9NQVgKKyN1bmRlZiBQQVJBTV9SRVFVRVNUX0lECisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9zc2lkX2hvdGxpc3QoKSAtIHJlc2V0IHNzaWQgaG90IGxpc3QKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXJlbGVzcyBwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdpcmVsZXNzIGRldmljZQorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK2ludAord2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9zc2lkX2hvdGxpc3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgICAgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9zc2lkX2hvdGxpc3Qod2lwaHksIHdkZXYsCisJCQkJCQkJZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfaW5pdF9jb21wbGV0aW9uX2V4dHdvdygpIC0gSW5pdGlhbGl6ZSBleHQgd293IHZhcmlhYmxlCisgKiBAaGRkX2N0eDogR2xvYmFsIEhERCBjb250ZXh0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRVhUV09XX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bGFuX2hkZF9pbml0X2NvbXBsZXRpb25fZXh0d293KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisJaW5pdF9jb21wbGV0aW9uKCZwSGRkQ3R4LT5yZWFkeV90b19leHR3b3cpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bGFuX2hkZF9pbml0X2NvbXBsZXRpb25fZXh0d293KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9pbml0KCkgLSBJbml0aWFsaXplIHRoZSBFeHRTY2FuIGZlYXR1cmUKKyAqIEBoZGRfY3R4OiBHbG9iYWwgSEREIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2luaXQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwl3bGFuX2hkZF9pbml0X2NvbXBsZXRpb25fZXh0d293KGhkZF9jdHgpOworCWluaXRfY29tcGxldGlvbigmZXh0X3NjYW5fY29udGV4dC5yZXNwb25zZV9ldmVudCk7CisJc3Bpbl9sb2NrX2luaXQoJmV4dF9zY2FuX2NvbnRleHQuY29udGV4dF9sb2NrKTsKK30KKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FWFRTQ0FOICovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZXh0X3NjYW4uaCBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9leHRfc2Nhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NzJhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZXh0X3NjYW4uaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoV0xBTl9IRERfRVhUX1NDQU5fSCkKKyNkZWZpbmUgV0xBTl9IRERfRVhUX1NDQU5fSAorCisvKioKKyAqIERPQzogd2xhbl9oZGRfZXh0X3NjYW4uaAorICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIEVYVCBTQ0FOIGZlYXR1cmUgaW1wbGVtZW50YXRpb24KKyAqCisgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisKKy8qCisgKiBVc2VkIHRvIGFsbG9jYXRlIHRoZSBzaXplIG9mIDQwOTYgZm9yIHRoZSBFWFRTY2FuIE5MIGRhdGEuCisgKiBUaGUgc2l6ZSBvZiA0MDk2IGlzIGNvbnNpZGVyZWQgYXNzdW1pbmcgdGhhdCBhbGwgZGF0YSBwZXIKKyAqIHJlc3BlY3RpdmUgZXZlbnQgZml0IHdpdGggaW4gdGhlIGxpbWl0LlBsZWFzZSB0YWtlIGEgY2FsbAorICogb24gdGhlIGxpbWl0IGJhc2VkIG9uIHRoZSBkYXRhIHJlcXVpcmVtZW50cy4KKyAqLworCisjZGVmaW5lIEVYVFNDQU5fRVZFTlRfQlVGX1NJWkUgNDA5NgorCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zdGFydChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zdG9wKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9nZXRfdmFsaWRfY2hhbm5lbHMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2CisJCQkJCQkgKndkZXYsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCQkgaW50IGRhdGFfbGVuKTsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fZ2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbik7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2dldF9jYWNoZWRfcmVzdWx0cyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYKKwkJCQkJCSAqd2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCSBpbnQgZGF0YV9sZW4pOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9zZXRfYnNzaWRfaG90bGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJc3RydWN0IHdpcmVsZXNzX2RldgorCQkJCQkJKndkZXYsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCQlpbnQgZGF0YV9sZW4pOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9yZXNldF9ic3NpZF9ob3RsaXN0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCQkgIHN0cnVjdCB3aXJlbGVzc19kZXYKKwkJCQkJCSAgKndkZXYsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCQkgIGludCBkYXRhX2xlbik7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX3NldF9zaWduaWZpY2FudF9jaGFuZ2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldgorCQkJCQkJICAgICAqd2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCSAgICAgaW50IGRhdGFfbGVuKTsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fcmVzZXRfc2lnbmlmaWNhbnRfY2hhbmdlKHN0cnVjdCB3aXBoeQorCQkJCQkJICAgICAgICp3aXBoeSwKKwkJCQkJCSAgICAgICBzdHJ1Y3QKKwkJCQkJCSAgICAgICB3aXJlbGVzc19kZXYKKwkJCQkJCSAgICAgICAqd2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCSAgICAgICBpbnQgZGF0YV9sZW4pOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2Vwbm9fbGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICBpbnQgZGF0YV9sZW4pOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Bhc3Nwb2ludF9saXN0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkJY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCWludCBkYXRhX2xlbik7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9yZXNldF9wYXNzcG9pbnRfbGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJCWNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCQlpbnQgZGF0YV9sZW4pOworCitpbnQKK3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fc2V0X3NzaWRfaG90bGlzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICBpbnQgZGF0YV9sZW4pOworCitpbnQKK3dsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5fcmVzZXRfc3NpZF9ob3RsaXN0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgIGludCBkYXRhX2xlbik7CisKK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9pbml0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworCisjZWxzZSAvKiBGRUFUVVJFX1dMQU5fRVhUU0NBTiAqLworCitzdGF0aWMgdm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2luaXQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKK30KKworI2VuZGlmIC8qIEVuZCBvZiBGRUFUVVJFX1dMQU5fRVhUU0NBTiAqLworCisjZW5kaWYgLyogZW5kICNpZiAhZGVmaW5lZChXTEFOX0hERF9FWFRfU0NBTl9IKSAqLworCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZnRtLmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZnRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwMjk5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9mdG0uYwpAQCAtMCwwICsxLDEwNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiB3bGFuX2hkZF9mdG0uYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgV0xBTiBmYWN0b3J5IHRlc3QgbW9kZSBpbXBsZW1lbnRhdGlvbgorICovCisKKyNpbmNsdWRlIDxjZHNfbXEuaD4KKyNpbmNsdWRlICJjZHNfc2NoZWQuaCIKKyNpbmNsdWRlIDxjZHNfYXBpLmg+CisjaW5jbHVkZSAic2lyX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorI2luY2x1ZGUgInNpcl9tYWNfcHJvdF9kZWYuaCIKKyNpbmNsdWRlICJzbWVfYXBpLmgiCisjaW5jbHVkZSAibWFjX2luaXRfYXBpLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfc3lzLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbWlzYy5oIgorI2luY2x1ZGUgImlfY2RzX3BhY2tldC5oIgorI2luY2x1ZGUgImNkc19yZWdfc2VydmljZS5oIgorI2luY2x1ZGUgIndsYW5faGRkX21haW4uaCIKKyNpbmNsdWRlICJxd2xhbl92ZXJzaW9uLmgiCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorCisjaWYgIGRlZmluZWQoUUNBX1dJRklfRlRNKQorI2luY2x1ZGUgImJtaS5oIgorI2luY2x1ZGUgIm9sX2Z3LmgiCisjaW5jbHVkZSAid2xhbl9oZGRfY2ZnODAyMTEuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisjaW5jbHVkZSAiaGlmLmgiCisjZW5kaWYKKworI2RlZmluZSBIRERfRlRNX1dNQV9QUkVfU1RBUlRfVElNRU9VVCAoMzAwMDApIC8qIDMwIHNlY29uZHMgKi8KKworI2lmICBkZWZpbmVkKFFDQV9XSUZJX0ZUTSkKKyNpZiBkZWZpbmVkKExJTlVYX1FDTUJSKQorI2RlZmluZSBBVEhfWElPQ1RMX1VOSUZJRURfVVRGX0NNRCAgMHgxMDAwCisjZGVmaW5lIEFUSF9YSU9DVExfVU5JRklFRF9VVEZfUlNQICAweDEwMDEKKyNkZWZpbmUgTUFYX1VURl9MRU5HVEggICAgICAgICAgICAgIDEwMjQKK3R5cGVkZWYgc3RydWN0IHFjbWJyX2RhdGFfcyB7CisJdW5zaWduZWQgaW50IGNtZDsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgYnVmW01BWF9VVEZfTEVOR1RIICsgNF07CisJdW5zaWduZWQgaW50IGNvcHlfdG9fdXNlcjsKK30gcWNtYnJfZGF0YV90OwordHlwZWRlZiBzdHJ1Y3QgcWNtYnJfcXVldWVfcyB7CisJdW5zaWduZWQgY2hhciB1dGZfYnVmW01BWF9VVEZfTEVOR1RIICsgNF07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfSBxY21icl9xdWV1ZV90OworTElTVF9IRUFEKHFjbWJyX3F1ZXVlX2hlYWQpOworREVGSU5FX1NQSU5MT0NLKHFjbWJyX3F1ZXVlX2xvY2spOworI2VuZGlmCisjZW5kaWYKKworLyoqCisgKiB3bGFuX2Z0bV9wb3N0bXNnKCkgLSBQb3N0IEZUTSBtZXNzYWdlCisgKiBAY21kX3B0cjogUG9pbnRlciB0byBGVE0gY29tbWFuZCBidWZmZXIKKyAqIEBjbWRfbGVuOiBMZW5ndGggb2YgY29tbWFuZCBpbiBAY21kX3B0cgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIEZUTSBjb21tYW5kcyB0byBmaXJtd2FyZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIHVpbnQzMl90IHdsYW5fZnRtX3Bvc3Rtc2codWludDhfdCAqY21kX3B0ciwgdWludDE2X3QgY21kX2xlbikKK3sKKwljZHNfbXNnX3QgZnRtTXNnOworCisJRU5URVIoKTsKKworCWZ0bU1zZy50eXBlID0gV01BX0ZUTV9DTURfUkVROworCWZ0bU1zZy5yZXNlcnZlZCA9IDA7CisJZnRtTXNnLmJvZHlwdHIgPSAodWludDhfdCAqKSBjbWRfcHRyOworCWZ0bU1zZy5ib2R5dmFsID0gMDsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwKKwkJCQkJCSAgICAgICZmdG1Nc2cpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogOiBGYWlsZWQgdG8gcG9zdCBNc2cgdG8gSEFMIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJRVhJVCgpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd2xhbl9oZGRfZnRtX3VwZGF0ZV90Z3RfY2ZnKCkgLSBVcGRhdGUgdGFyZ2V0IGNvbmZpZ3VyYXRpb24KKyAqIEBjb250ZXh0OiBjb250ZXh0IHJlZ2lzdGVyZWQgd2l0aCBXTUEKKyAqIEBwYXJhbTogdGFyZ2V0IGNvbmZpZ3VyYXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgd2l0aCBXTUEgdmlhIHdtYV9vcGVuKCksIGFuZCBpcworICogaW52b2tlZCB2aWEgY2FsbGJhY2sgd2hlbiB0YXJnZXQgcGFyYW1ldGVycyBhcmUgcmVjZWl2ZWQKKyAqIGZyb20gZmlybXdhcmUuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5faGRkX2Z0bV91cGRhdGVfdGd0X2NmZyh2b2lkICpjb250ZXh0LCB2b2lkICpwYXJhbSkKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gKGhkZF9jb250ZXh0X3QgKikgY29udGV4dDsKKwlzdHJ1Y3Qgd21hX3RndF9jZmcgKmNmZyA9IChzdHJ1Y3Qgd21hX3RndF9jZmcgKilwYXJhbTsKKworCWlmICghY2RmX2lzX21hY2FkZHJfemVybygmY2ZnLT5od19tYWNhZGRyKSkgeworCQloZGRfdXBkYXRlX21hY2FkZHIoaGRkX2N0eC0+Y29uZmlnLCBjZmctPmh3X21hY2FkZHIpOworCX0gZWxzZSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IEludmFsaWQgTUFDIHBhc3NlZCBmcm9tIHRhcmdldCwgdXNpbmcgTUFDIGZyb20gaW5pIGZpbGUiCisJCSAgICAgICBNQUNfQUREUkVTU19TVFIsIF9fZnVuY19fLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkoaGRkX2N0eC0+Y29uZmlnLT5pbnRmTWFjQWRkclswXS5ieXRlcykpOworCX0KK30KKworLyoqCisgKiB3bGFuX2Z0bV9jZHNfb3BlbigpIC0gT3BlbiB0aGUgQ0RTIE1vZHVsZSBpbiBGVE0gbW9kZQorICogQHBfY2RzX2NvbnRleHQ6IHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBDRFMgY29udGV4dAorICogQGhkZENvbnRleHRTaXplOiBTaXplIG9mIHRoZSBIREQgY29udGV4dCB0byBhbGxvY2F0ZS4KKyAqCisgKiBUaGUgd2xhbl9mdG1fY2RzX29wZW4oKSBmdW5jdGlvbiBvcGVucyB0aGUgQ0RGIFNjaGVkdWxlcgorICogVXBvbiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uOgorICogLSBBbGwgQ0RTIHN1Ym1vZHVsZXMgc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZAorICogLSBUaGUgQ0RTIHNjaGVkdWxlciBzaG91bGQgaGF2ZSBvcGVuZWQKKyAqIC0gQWxsIHRoZSBXTEFOIFNXIGNvbXBvbmVudHMgc2hvdWxkIGhhdmUgYmVlbiBvcGVuZWQuIFRoaXMgaW5jbHVkZXMgTUFDLgorICoKKyAqIFJldHVybnM6CisgKglDREZfU1RBVFVTX1NVQ0NFU1MgLSBTY2hlZHVsZXIgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQKKyAqCWlzIHJlYWR5IHRvIGJlIHVzZWQuCisgKglDREZfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpCisgKglhcmUgdW5hdmFpbGFibGUgdG8gaW5pdGlhbGl6ZSB0aGUgc2NoZWR1bGVyCisgKglDREZfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgc2NoZWR1bGVyCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdsYW5fZnRtX2Nkc19vcGVuKHZfQ09OVEVYVF90IHBfY2RzX2NvbnRleHQsCisJCQkJICAgIHVpbnQzMl90IGhkZENvbnRleHRTaXplKQoreworCUNERl9TVEFUVVMgdlN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlpbnQgaXRlciA9IDA7CisJdFNpclJldFN0YXR1cyBzaXJTdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisJdE1hY09wZW5QYXJhbWV0ZXJzIG1hY19vcGVuUGFybXM7CisJcF9jZHNfY29udGV4dFR5cGUgZ3BfY2RzX2NvbnRleHQgPSAocF9jZHNfY29udGV4dFR5cGUpIHBfY2RzX2NvbnRleHQ7CisjaWYgIGRlZmluZWQoUUNBX1dJRklfRlRNKQorCWNkZl9kZXZpY2VfdCBjZGZfY3R4OworCUhUQ19JTklUX0lORk8gaHRjSW5mbzsKKwl2b2lkICpwSGlmQ29udGV4dCA9IE5VTEw7CisJdm9pZCAqcEh0Y0NvbnRleHQgPSBOVUxMOworI2VuZGlmCisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6IE9wZW5pbmcgQ0RTIiwgX19mdW5jX18pOworCisJaWYgKE5VTEwgPT0gZ3BfY2RzX2NvbnRleHQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogVHJ5aW5nIHRvIG9wZW4gQ0RTIHdpdGhvdXQgYSBQcmVPcGVuIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgcHJvYmUgZXZlbnQgKi8KKwlpZiAoY2RmX2V2ZW50X2luaXQoJmdwX2Nkc19jb250ZXh0LT5Qcm9iZUV2ZW50KSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogVW5hYmxlIHRvIGluaXQgcHJvYmVFdmVudCIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChjZGZfZXZlbnRfaW5pdCgmKGdwX2Nkc19jb250ZXh0LT53bWFDb21wbGV0ZUV2ZW50KSkgIT0KKwkgICAgQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFVuYWJsZSB0byBpbml0IHdtYUNvbXBsZXRlRXZlbnQiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisKKwkJZ290byBlcnJfcHJvYmVfZXZlbnQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgZnJlZSBtZXNzYWdlIHF1ZXVlICovCisJdlN0YXR1cyA9IGNkc19tcV9pbml0KCZncF9jZHNfY29udGV4dC0+ZnJlZVZvc01xKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkgeworCisJCS8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBDRFMgZnJlZSBtZXNzYWdlIHF1ZXVlICVkIiwKKwkJCSAgX19mdW5jX18sIHZTdGF0dXMpOworCQlDREZfQVNTRVJUKDApOworCQlnb3RvIGVycl93bWFfY29tcGxldGVfZXZlbnQ7CisJfQorCisJZm9yIChpdGVyID0gMDsgaXRlciA8IENEU19DT1JFX01BWF9NRVNTQUdFUzsgaXRlcisrKSB7CisJCShncF9jZHNfY29udGV4dC0+YU1zZ1dyYXBwZXJzW2l0ZXJdKS5wVm9zTXNnID0KKwkJCSYoZ3BfY2RzX2NvbnRleHQtPmFNc2dCdWZmZXJzW2l0ZXJdKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmdwX2Nkc19jb250ZXh0LT5hTXNnV3JhcHBlcnNbaXRlcl0ubXNnTm9kZSk7CisJCWNkc19tcV9wdXQoJmdwX2Nkc19jb250ZXh0LT5mcmVlVm9zTXEsCisJCQkgICAmKGdwX2Nkc19jb250ZXh0LT5hTXNnV3JhcHBlcnNbaXRlcl0pKTsKKwl9CisKKwkvKiBOb3cgT3BlbiB0aGUgQ0RTIFNjaGVkdWxlciAqLworCXZTdGF0dXMgPSBjZHNfc2NoZWRfb3BlbihncF9jZHNfY29udGV4dCwgJmdwX2Nkc19jb250ZXh0LT5jZGZfc2NoZWQsCisJCQkJIHNpemVvZihjZHNfc2NoZWRfY29udGV4dCkpOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpIHsKKwkJLyogQ3JpdGljYWwgRXJyb3IgLi4uICBDYW5ub3QgcHJvY2VlZCBmdXJ0aGVyICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBvcGVuIENEUyBTY2hlZHVsZXIgJWQiLCBfX2Z1bmNfXywKKwkJCSAgdlN0YXR1cyk7CisJCUNERl9BU1NFUlQoMCk7CisJCWdvdG8gZXJyX21zZ19xdWV1ZTsKKwl9CisjaWYgIGRlZmluZWQoUUNBX1dJRklfRlRNKQorCS8qIEluaXRpYWxpemUgQk1JIGFuZCBEb3dubG9hZCBmaXJtd2FyZSAqLworCXBIaWZDb250ZXh0ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKwlpZiAoIXBIaWZDb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IGZhaWxlZCB0byBnZXQgSElGIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3NjaGVkX2Nsb3NlOworCX0KKworCWlmIChibWlfZG93bmxvYWRfZmlybXdhcmUocEhpZkNvbnRleHQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEJNSSBmYWlsZWQgdG8gZG93bmxvYWQgdGFyZ2V0IiwgX19mdW5jX18pOworCQlnb3RvIGVycl9ibWlfY2xvc2U7CisJfQorCWh0Y0luZm8ucENvbnRleHQgPSBncF9jZHNfY29udGV4dC0+cEhJRkNvbnRleHQ7CisJaHRjSW5mby5UYXJnZXRGYWlsdXJlID0gb2xfdGFyZ2V0X2ZhaWx1cmU7CisJaHRjSW5mby5UYXJnZXRTZW5kU3VzcGVuZENvbXBsZXRlID0gd21hX3RhcmdldF9zdXNwZW5kX2Fja25vd2xlZGdlOworCWNkZl9jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9DREZfREVWSUNFKTsKKworCS8qIENyZWF0ZSBIVEMgKi8KKwlncF9jZHNfY29udGV4dC0+aHRjX2N0eCA9CisJCWh0Y19jcmVhdGUoaHRjSW5mby5wQ29udGV4dCwgJmh0Y0luZm8sIGNkZl9jdHgpOworCWlmICghZ3BfY2RzX2NvbnRleHQtPmh0Y19jdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRmFpbGVkIHRvIENyZWF0ZSBIVEMiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2JtaV9jbG9zZTsKKwl9CisKKwlpZiAoYm1pX2RvbmUocEhpZkNvbnRleHQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEZhaWxlZCB0byBjb21wbGV0ZSBCTUkgcGhhc2UiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2h0Y19jbG9zZTsKKwl9CisjZW5kaWYgLyogUUNBX1dJRklfRlRNICovCisKKwkvKk9wZW4gdGhlIFdNQSBtb2R1bGUgKi8KKwljZGZfbWVtX3NldCgmbWFjX29wZW5QYXJtcywgc2l6ZW9mKG1hY19vcGVuUGFybXMpLCAwKTsKKwltYWNfb3BlblBhcm1zLmRyaXZlclR5cGUgPSBlRFJJVkVSX1RZUEVfTUZHOworCisJaGRkX2N0eCA9IChoZGRfY29udGV4dF90ICopIChncF9jZHNfY29udGV4dC0+cEhERENvbnRleHQpOworCWlmICgoTlVMTCA9PSBoZGRfY3R4KSB8fCAoTlVMTCA9PSBoZGRfY3R4LT5jb25maWcpKSB7CisJCS8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBIZGQgQ29udGV4dCBpcyBOdWxsIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlnb3RvIGVycl9odGNfY2xvc2U7CisJfQorCisJbWFjX29wZW5QYXJtcy5wb3dlcnNhdmVPZmZsb2FkRW5hYmxlZCA9CisJCWhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlUG93ZXJzYXZlT2ZmbG9hZDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisJbWFjX29wZW5QYXJtcy5pc19scGFzc19lbmFibGVkID0gaGRkX2N0eC0+Y29uZmlnLT5lbmFibGVscGFzc3N1cHBvcnQ7CisjZW5kaWYKKworCXZTdGF0dXMgPSB3bWFfb3BlbihncF9jZHNfY29udGV4dCwKKwkJCSAgIHdsYW5faGRkX2Z0bV91cGRhdGVfdGd0X2NmZywgTlVMTCwgJm1hY19vcGVuUGFybXMpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKSB7CisJCS8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gb3BlbiBXTUEgbW9kdWxlICVkIiwgX19mdW5jX18sCisJCQkgIHZTdGF0dXMpOworCQlDREZfQVNTRVJUKDApOworCQlnb3RvIGVycl9odGNfY2xvc2U7CisJfQorI2lmICBkZWZpbmVkKFFDQV9XSUZJX0ZUTSkKKwkoKHN0cnVjdCBvbF9zb2Z0YyAqKXBIaWZDb250ZXh0KS0+ZW5hYmxlX3JhbWR1bXBfY29sbGVjdGlvbiA9CisJCQkJaGRkX2N0eC0+Y29uZmlnLT5pc19yYW1kdW1wX2VuYWJsZWQ7CisKKwlwSHRjQ29udGV4dCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hUQyk7CisJaWYgKCFwSHRjQ29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBmYWlsZWQgdG8gZ2V0IEhUQyBjb250ZXh0IiwgX19mdW5jX18pOworCQlnb3RvIGVycl93bWFfY2xvc2U7CisJfQorCWlmIChodGNfd2FpdF90YXJnZXQocEh0Y0NvbnRleHQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEZhaWxlZCB0byBjb21wbGV0ZSBCTUkgcGhhc2UiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3dtYV9jbG9zZTsKKwl9CisjZW5kaWYKKworCS8qIE5vdyBwcm9jZWVkIHRvIG9wZW4gdGhlIE1BQyAqLworCisJLyogVU1BIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZSBmb3IgcGVyZm9ybWluZyB0aGUKKwkgKiBmcmFtZSB0cmFuc2xhdGlvbiA4MDIuMTEgPC0+IDgwMi4zCisJICovCisJbWFjX29wZW5QYXJtcy5mcmFtZVRyYW5zUmVxdWlyZWQgPSAxOworCisJc2lyU3RhdHVzID0KKwkJbWFjX29wZW4oJihncF9jZHNfY29udGV4dC0+cE1BQ0NvbnRleHQpLAorCQkJIGdwX2Nkc19jb250ZXh0LT5wSEREQ29udGV4dCwKKwkJCSAmbWFjX29wZW5QYXJtcyk7CisKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHNpclN0YXR1cykgeworCQkvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIG9wZW4gTUFDICVkIiwgX19mdW5jX18sIHNpclN0YXR1cyk7CisJCUNERl9BU1NFUlQoMCk7CisJCWdvdG8gZXJyX3dtYV9jbG9zZTsKKwl9CisjaWZuZGVmIFFDQV9XSUZJX0ZUTQorCS8qIE5vdyBwcm9jZWVkIHRvIG9wZW4gdGhlIFNNRSAqLworCXZTdGF0dXMgPSBzbWVfb3BlbihncF9jZHNfY29udGV4dC0+cE1BQ0NvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKSB7CisJCS8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gb3BlbiBTTUUgJWQiLCBfX2Z1bmNfXywgdlN0YXR1cyk7CisJCWdvdG8gZXJyX21hY19jbG9zZTsKKwl9CisKKwl2U3RhdHVzID0gc21lX2luaXRfY2hhbl9saXN0KGdwX2Nkc19jb250ZXh0LT5wTUFDQ29udGV4dCwKKwkJCQkgICAgIGhkZF9jdHgtPnJlZy5hbHBoYTIsIGhkZF9jdHgtPnJlZy5jY19zcmMpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBpbml0IHNtZSBjaGFubmVsIGxpc3QiLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiJXM6IENEUyBzdWNjZXNzZnVsbHkgT3BlbmVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKyNlbHNlCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKyNlbmRpZgorCisjaWZuZGVmIFFDQV9XSUZJX0ZUTQorZXJyX21hY19jbG9zZToKKyNlbmRpZgorCW1hY19jbG9zZShncF9jZHNfY29udGV4dC0+cE1BQ0NvbnRleHQpOworCitlcnJfd21hX2Nsb3NlOgorCXdtYV9jbG9zZShncF9jZHNfY29udGV4dCk7CisKK2Vycl9odGNfY2xvc2U6CisjaWYgIGRlZmluZWQoUUNBX1dJRklfRlRNKQorCWlmIChncF9jZHNfY29udGV4dC0+aHRjX2N0eCkgeworCQlodGNfZGVzdHJveShncF9jZHNfY29udGV4dC0+aHRjX2N0eCk7CisJCWdwX2Nkc19jb250ZXh0LT5odGNfY3R4ID0gTlVMTDsKKwl9CisKK2Vycl9ibWlfY2xvc2U6CisJYm1pX2NsZWFudXAocEhpZkNvbnRleHQpOworI2VuZGlmIC8qIFFDQV9XSUZJX0ZUTSAqLworCitlcnJfc2NoZWRfY2xvc2U6CisJY2RzX3NjaGVkX2Nsb3NlKGdwX2Nkc19jb250ZXh0KTsKK2Vycl9tc2dfcXVldWU6CisJY2RzX21xX2RlaW5pdCgmZ3BfY2RzX2NvbnRleHQtPmZyZWVWb3NNcSk7CisKK2Vycl93bWFfY29tcGxldGVfZXZlbnQ6CisJY2RmX2V2ZW50X2Rlc3Ryb3koJmdwX2Nkc19jb250ZXh0LT53bWFDb21wbGV0ZUV2ZW50KTsKKworZXJyX3Byb2JlX2V2ZW50OgorCWNkZl9ldmVudF9kZXN0cm95KCZncF9jZHNfY29udGV4dC0+UHJvYmVFdmVudCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKK30gLyogd2xhbl9mdG1fY2RzX29wZW4oKSAqLworCisvKioKKyAqIHdsYW5fZnRtX2Nkc19jbG9zZSgpIC0gQ2xvc2UgdGhlIENERiBNb2R1bGUgaW4gRlRNIG1vZGUKKyAqIEBjZHNfY29udGV4dDogIGNvbnRleHQgb2YgY2RzCisgKgorICogVGhlIHdsYW5fZnRtX2Nkc19jbG9zZSgpIGZ1bmN0aW9uIGNsb3NlcyB0aGUgQ0RGIE1vZHVsZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzc2Z1bGx5IGNsb3NlZAorICovCitzdGF0aWMgQ0RGX1NUQVRVUyB3bGFuX2Z0bV9jZHNfY2xvc2Uodl9DT05URVhUX3QgY2RzX2NvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXBfY2RzX2NvbnRleHRUeXBlIGdwX2Nkc19jb250ZXh0ID0gKHBfY2RzX2NvbnRleHRUeXBlKSBjZHNfY29udGV4dDsKKworI2lmbmRlZiBRQ0FfV0lGSV9GVE0KKwljZGZfc3RhdHVzID0gc21lX2Nsb3NlKCgocF9jZHNfY29udGV4dFR5cGUpIGNkc19jb250ZXh0KS0+cE1BQ0NvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBjbG9zZSBTTUUgJWQiLCBfX2Z1bmNfXywgY2RmX3N0YXR1cyk7CisJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKwl9CisjZW5kaWYKKworCWNkZl9zdGF0dXMgPSBtYWNfY2xvc2UoKChwX2Nkc19jb250ZXh0VHlwZSkgY2RzX2NvbnRleHQpLT5wTUFDQ29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGNsb3NlIE1BQyAlZCIsIF9fZnVuY19fLCBjZGZfc3RhdHVzKTsKKwkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCX0KKworCSgocF9jZHNfY29udGV4dFR5cGUpIGNkc19jb250ZXh0KS0+cE1BQ0NvbnRleHQgPSBOVUxMOworCisKKwljZGZfc3RhdHVzID0gd21hX2Nsb3NlKGNkc19jb250ZXh0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gY2xvc2UgV01BICVkIiwgX19mdW5jX18sIGNkZl9zdGF0dXMpOworCQlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSk7CisJfQorI2lmICBkZWZpbmVkKFFDQV9XSUZJX0ZUTSkKKwlpZiAoZ3BfY2RzX2NvbnRleHQtPmh0Y19jdHgpIHsKKwkJaHRjX3N0b3AoZ3BfY2RzX2NvbnRleHQtPmh0Y19jdHgpOworCQlodGNfZGVzdHJveShncF9jZHNfY29udGV4dC0+aHRjX2N0eCk7CisJCWdwX2Nkc19jb250ZXh0LT5odGNfY3R4ID0gTlVMTDsKKwl9CisJY2RmX3N0YXR1cyA9IHdtYV93bWlfc2VydmljZV9jbG9zZShjZHNfY29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGNsb3NlIHdtYV93bWlfc2VydmljZSIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCX0KKworCWhpZl9kaXNhYmxlX2lzcihncF9jZHNfY29udGV4dC0+cEhJRkNvbnRleHQpOworI2VuZGlmCisKKwljZHNfbXFfZGVpbml0KCYoKHBfY2RzX2NvbnRleHRUeXBlKSBjZHNfY29udGV4dCktPmZyZWVWb3NNcSk7CisKKwljZGZfc3RhdHVzID0gY2RmX2V2ZW50X2Rlc3Ryb3koJmdwX2Nkc19jb250ZXh0LT5Qcm9iZUV2ZW50KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gZGVzdHJveSBQcm9iZUV2ZW50ICVkIiwgX19mdW5jX18sCisJCQkgIGNkZl9zdGF0dXMpOworCQlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSk7CisJfQorCisJY2RmX3N0YXR1cyA9IGNkZl9ldmVudF9kZXN0cm95KCZncF9jZHNfY29udGV4dC0+d21hQ29tcGxldGVFdmVudCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGRlc3Ryb3kgd21hQ29tcGxldGVFdmVudCAlZCIsIF9fZnVuY19fLAorCQkJICBjZGZfc3RhdHVzKTsKKwkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY2RzX2Z0bV9wcmVfc3RhcnQoKSAtIFByZS1zdGFydCBDRFMgTW9kdWxlIGluIEZUTSBNb2RlCisgKiBAY2RzX2NvbnRleHQ6IFRoZSBDRFMgY29udGV4dAorICoKKyAqIFRoZSBjZHNfZnRtX3ByZV9zdGFydCgpIGZ1bmN0aW9uIHBlcmZvcm1zIGFsbCBwcmUtc3RhcnQgYWN0aXZpdGllcworICogaW4gRlRNIG1vZGUuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgaWYgcHJlLXN0YXJ0IHdhcyBzdWNjZXNzZnVsLCBhbgorICoJICAgYXBwcm9wcmlhdGUgQ0RGX1NUQVRVU19FXyogZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqLworc3RhdGljIENERl9TVEFUVVMgY2RzX2Z0bV9wcmVfc3RhcnQodl9DT05URVhUX3QgY2RzX2NvbnRleHQpCit7CisJQ0RGX1NUQVRVUyB2U3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXBfY2RzX2NvbnRleHRUeXBlIHBfY2RzX2NvbnRleHQgPSAocF9jZHNfY29udGV4dFR5cGUpIGNkc19jb250ZXh0OworI2lmICBkZWZpbmVkKFFDQV9XSUZJX0ZUTSkKKwlwX2Nkc19jb250ZXh0VHlwZSBncF9jZHNfY29udGV4dCA9CisJCWNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKTsKKyNlbmRpZgorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgImNkcyBwcmVzdGFydCIpOworCWlmIChOVUxMID09IHBfY2RzX2NvbnRleHQtPnBXTUFDb250ZXh0KSB7CisJCUNERl9BU1NFUlQoMCk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFdNQSBOVUxMIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwkvKiBSZXNldCBXTUEgd2FpdCBldmVudCAqLworCWNkZl9ldmVudF9yZXNldCgmcF9jZHNfY29udGV4dC0+d21hQ29tcGxldGVFdmVudCk7CisKKwkvKmNhbGwgV01BIHByZSBzdGFydCAqLworCXZTdGF0dXMgPSB3bWFfcHJlX3N0YXJ0KHBfY2RzX2NvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiRmFpbGVkIHRvIFdNQSBwcmVzdGFydCAiKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIE5lZWQgdG8gdXBkYXRlIHRpbWUgb3V0IG9mIGNvbXBsZXRlICovCisJdlN0YXR1cyA9IGNkZl93YWl0X3NpbmdsZV9ldmVudCgmcF9jZHNfY29udGV4dC0+d21hQ29tcGxldGVFdmVudCwKKwkJCQkJSEREX0ZUTV9XTUFfUFJFX1NUQVJUX1RJTUVPVVQpOworCWlmICh2U3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlpZiAodlN0YXR1cyA9PSBDREZfU1RBVFVTX0VfVElNRU9VVCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IFRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIFdNQSBjb21wbGV0ZSIsCisJCQkJICBfX2Z1bmNfXyk7CisJCX0gZWxzZSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogd21hX3ByZV9zdGFydCByZXBvcnRpbmcgIG90aGVyIGVycm9yIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJfQorCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorI2lmICBkZWZpbmVkKFFDQV9XSUZJX0ZUTSkKKwl2U3RhdHVzID0gaHRjX3N0YXJ0KGdwX2Nkc19jb250ZXh0LT5odGNfY3R4KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIkZhaWxlZCB0byBTdGFydCBIVEMiKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwl3bWFfd2FpdF9mb3JfcmVhZHlfZXZlbnQoZ3BfY2RzX2NvbnRleHQtPnBXTUFDb250ZXh0KTsKKyNlbmRpZiAvKiBRQ0FfV0lGSV9GVE0gKi8KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd2xhbl9oZGRfZnRtX29wZW4oKSAtIE9wZW4gSEREIGluIEZUTSBNb2RlCisgKiBAaGRkX2N0eDogZ2xvYmFsIEhERCBjb250ZXh0CisgKgorICogVGhlIGZ1bmN0aW9uIGhkZF93bGFuX3N0YXJ0dXAgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZQorICogRlRNIHNwZWNpZmljIG1vZHVsZXMuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK2ludCB3bGFuX2hkZF9mdG1fb3BlbihoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCUNERl9TVEFUVVMgdlN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlwX2Nkc19jb250ZXh0VHlwZSBwX2Nkc19jb250ZXh0ID0gTlVMTDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6IE9wZW5pbmcgQ0RTIiwgX19mdW5jX18pOworCisJcF9jZHNfY29udGV4dCA9IGNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKTsKKworCWlmIChOVUxMID09IHBfY2RzX2NvbnRleHQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogVHJ5aW5nIHRvIG9wZW4gQ0RTIHdpdGhvdXQgYSBQcmVPcGVuIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlnb3RvIGVycl9jZGZfc3RhdHVzX2ZhaWx1cmU7CisJfQorCisJdlN0YXR1cyA9IHdsYW5fZnRtX2Nkc19vcGVuKHBfY2RzX2NvbnRleHQsIDApOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBjZHNfb3BlbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2NkZl9zdGF0dXNfZmFpbHVyZTsKKwl9CisKKwkvKgorCSAqIG9ubHkgbmVlZGVkIHRvIHN0YXJ0IFdNQSwgd2hpY2ggaGFwcGVucyBpbiB3bGFuX2hkZF9mdG1fc3RhcnQoKQorCSAqLworCisJLyogU2F2ZSB0aGUgaGFsIGNvbnRleHQgaW4gQWRhcHRlciAqLworCWhkZF9jdHgtPmhIYWwgPQorCQkodEhhbEhhbmRsZSkgY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfU01FKTsKKworCWlmIChOVUxMID09IGhkZF9jdHgtPmhIYWwpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBIQUwgY29udGV4dCBpcyBudWxsIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJZ290byBlcnJfZnRtX2Nsb3NlOworCX0KKworCXJldHVybiAwOworCitlcnJfZnRtX2Nsb3NlOgorCXdsYW5fZnRtX2Nkc19jbG9zZShwX2Nkc19jb250ZXh0KTsKKworZXJyX2NkZl9zdGF0dXNfZmFpbHVyZToKKwlyZXR1cm4gLUVQRVJNOworfQorCisvKioKKyAqIGhkZF9mdG1fc2VydmljZV9yZWdpc3RyYXRpb24oKSAtIFJlZ2lzdGVyIEZUTSBzZXJ2aWNlCisgKiBAaGRkX2N0eDogZ2xvYmFsIEhERCBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoZGRfZnRtX3NlcnZpY2VfcmVnaXN0cmF0aW9uKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwlhZGFwdGVyID0gaGRkX29wZW5fYWRhcHRlcihoZGRfY3R4LCBXTEFOX0hERF9GVE0sICJ3bGFuJWQiLAorCQkJCSAgICB3bGFuX2hkZF9nZXRfaW50Zl9hZGRyKGhkZF9jdHgpLCBmYWxzZSk7CisJaWYgKE5VTEwgPT0gYWRhcHRlcikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGhkZF9vcGVuX2FkYXB0ZXIgZmFpbGVkIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJZ290byBlcnJfYWRhcHRlcl9vcGVuX2ZhaWx1cmU7CisJfQorCisJaGRkX2N0eC0+ZnRtLmZ0bV9zdGF0ZSA9IFdMQU5fRlRNX0lOSVRJQUxJWkVEOworCisJcmV0dXJuIDA7CisKK2Vycl9hZGFwdGVyX29wZW5fZmFpbHVyZToKKworCXJldHVybiAtRVBFUk07Cit9CisKKy8qKgorICogd2xhbl9mdG1fc3RvcCgpIC0gU3RvcCBIREQgaW4gRlRNIG1vZGUKKyAqIEBoZGRfY3R4OiBwb2ludGVyIHRvIEhERCBjb250ZXh0CisgKgorICogVGhpcyBmdW5jdGlvbiBzdG9wcyB0aGUgZm9sbG93aW5nIG1vZHVsZXMKKyAqIDEuIE1BQworICogMi4gV01BCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bGFuX2Z0bV9zdG9wKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCisJaWYgKGhkZF9jdHgtPmZ0bS5mdG1fc3RhdGUgIT0gV0xBTl9GVE1fU1RBUlRFRCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJeworCQkvKiAgU1RPUCBNQUMgb25seSAqLworCQl2b2lkICpoSGFsOworCQloSGFsID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfU01FKTsKKwkJaWYgKE5VTEwgPT0gaEhhbCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IE5VTEwgaEhhbCIsIF9fZnVuY19fKTsKKwkJfSBlbHNlIHsKKwkJCWNkZl9zdGF0dXMgPQorCQkJCW1hY19zdG9wKGhIYWwsIEhBTF9TVE9QX1RZUEVfU1lTX0RFRVBfU0xFRVApOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICIlczogRmFpbGVkIHRvIHN0b3AgU1lTIiwgX19mdW5jX18pOworCQkJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKwkJCX0KKwkJfQorCQl3bWFfc3RvcChoZGRfY3R4LT5wY2RzX2NvbnRleHQsIEhBTF9TVE9QX1RZUEVfUkZfS0lMTCk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX2Z0bV9jbG9zZSgpIC0gQ2xvc2UgSEREIGluIEZUTSBtb2RlCisgKiBAaGRkX2N0eDogcG9pbnRlciB0byBIREQgY29udGV4dAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9mdG1fY2xvc2UoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdl9DT05URVhUX3QgY2RzX2NvbnRleHQgPSBoZGRfY3R4LT5wY2RzX2NvbnRleHQ7CisKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKGhkZF9jdHgsIFdMQU5fSEREX0ZUTSk7CisJRU5URVIoKTsKKwlpZiAoYWRhcHRlciA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6YWRhcHRlciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWlmIChXTEFOX0ZUTV9TVEFSVEVEID09IGhkZF9jdHgtPmZ0bS5mdG1fc3RhdGUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRnRtIGhhcyBiZWVuIHN0YXJ0ZWQuIHN0b3BwaW5nIGZ0bSIsIF9fZnVuY19fKTsKKwkJd2xhbl9mdG1fc3RvcChoZGRfY3R4KTsKKwl9CisKKwloZGRfY2xvc2VfYWxsX2FkYXB0ZXJzKGhkZF9jdHgpOworCisJY2RmX3N0YXR1cyA9IGNkc19zY2hlZF9jbG9zZShjZHNfY29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIGNsb3NlIENEUyBTY2hlZHVsZXIiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKwl9CisJLyogQ2xvc2UgQ0RTICovCisJd2xhbl9mdG1fY2RzX2Nsb3NlKGNkc19jb250ZXh0KTsKKworI2lmIGRlZmluZWQoUUNBX1dJRklfRlRNKSAmJiBkZWZpbmVkKExJTlVYX1FDTUJSKQorCXNwaW5fbG9ja19iaCgmcWNtYnJfcXVldWVfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZxY21icl9xdWV1ZV9oZWFkKSkgeworCQlxY21icl9xdWV1ZV90ICptc2dfYnVmLCAqdG1wX2J1ZjsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZ19idWYsIHRtcF9idWYsICZxY21icl9xdWV1ZV9oZWFkLAorCQkJCQkgbGlzdCkgeworCQkJbGlzdF9kZWwoJm1zZ19idWYtPmxpc3QpOworCQkJa2ZyZWUobXNnX2J1Zik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJnFjbWJyX3F1ZXVlX2xvY2spOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworfQorCisKKy8qKgorICogaGRkX2Z0bV9tY19wcm9jZXNzX21zZygpIC0gUHJvY2VzcyBGVE0gbWFpbGJveCBtZXNzYWdlCisgKiBAbWVzc2FnZTogRlRNIHJlc3BvbnNlIG1lc3NhZ2UKKyAqCisgKiBQcm9jZXNzIEZUTSBtYWlsYm94IG1lc3NhZ2UKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIHZvaWQgaGRkX2Z0bV9tY19wcm9jZXNzX21zZyh2b2lkICptZXNzYWdlKQoreworCXZvaWQgKmRhdGE7CisJdWludDMyX3QgZGF0YV9sZW47CisKKwlpZiAoIW1lc3NhZ2UpIHsKKwkJaGRkX2VycigiTWVzc2FnZSBpcyBOVUxMLCBub3RoaW5nIHRvIHByb2Nlc3MuIik7CisJCXJldHVybjsKKwl9CisKKwlkYXRhX2xlbiA9ICooKHVpbnQzMl90ICopIG1lc3NhZ2UpOworCWRhdGEgPSAodWludDMyX3QgKikgbWVzc2FnZSArIDE7CisKKyNpZiBkZWZpbmVkKExJTlVYX1FDTUJSKQorCXdsYW5xY21icl9tY19wcm9jZXNzX21zZyhtZXNzYWdlKTsKKyNlbHNlCisjaWZkZWYgQ09ORklHX05MODAyMTFfVEVTVE1PREUKKwl3bGFuX2hkZF90ZXN0bW9kZV9yeF9ldmVudChkYXRhLCAoc2l6ZV90KSBkYXRhX2xlbik7CisjZW5kaWYKKyNlbmRpZgorCXJldHVybjsKK30KKworLyoqCisgKiB3bGFuX2hkZF9mdG1fc3RhcnQoKSAtIFN0YXJ0IEhERCBpbiBGVE0gbW9kZQorICogQGhkZF9jdHg6IEdsb2JhbCBIREQgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gIHN0YXJ0cyB0aGUgZm9sbG93aW5nIG1vZHVsZXMuCisgKiAxKSBXTUEgU3RhcnQuCisgKiAyKSBIVEMgU3RhcnQuCisgKiAzKSBNQUMgU3RhcnQgdG8gZG93bmxvYWQgdGhlIGZpcm13YXJlLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9mdG1fc3RhcnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlDREZfU1RBVFVTIHZTdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJcF9jZHNfY29udGV4dFR5cGUgcF9jZHNfY29udGV4dCA9CisJCShwX2Nkc19jb250ZXh0VHlwZSkgKGhkZF9jdHgtPnBjZHNfY29udGV4dCk7CisKKwlpZiAoV0xBTl9GVE1fU1RBUlRFRCA9PSBoZGRfY3R4LT5mdG0uZnRtX3N0YXRlKSB7CisJCXJldHVybiAwOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBTdGFydGluZyBDTEQgU1ciLCBfX2Z1bmNfXyk7CisKKwkvKiBXZSBzdXBwb3J0IG9ubHkgb25lIGluc3RhbmNlIGZvciBub3cgLi4uICovCisJaWYgKHBfY2RzX2NvbnRleHQgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBtaXNtYXRjaCBpbiBjb250ZXh0IiwgX19mdW5jX18pOworCQlnb3RvIGVycl9zdGF0dXNfZmFpbHVyZTsKKwl9CisKKwlpZiAocF9jZHNfY29udGV4dC0+cE1BQ0NvbnRleHQgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBNQUMgTlVMTCBjb250ZXh0IiwgX19mdW5jX18pOworCQlnb3RvIGVycl9zdGF0dXNfZmFpbHVyZTsKKwl9CisKKwkvKiBWb3MgcHJlU3RhcnQgaXMgY2FsbGluZyAqLworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkc19mdG1fcHJlX3N0YXJ0KGhkZF9jdHgtPnBjZHNfY29udGV4dCkpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogY2RzX3ByZV9lbmFibGUgZmFpbGVkIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJZ290byBlcnJfc3RhdHVzX2ZhaWx1cmU7CisJfQorCisJc21lX3JlZ2lzdGVyX2Z0bV9tc2dfcHJvY2Vzc29yKGhkZF9jdHgtPmhIYWwsIGhkZF9mdG1fbWNfcHJvY2Vzc19tc2cpOworCisJdlN0YXR1cyA9IHdtYV9zdGFydChwX2Nkc19jb250ZXh0KTsKKwlpZiAodlN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIHN0YXJ0IFdNQSIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfc3RhdHVzX2ZhaWx1cmU7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IE1BQyBjb3JyZWN0bHkgc3RhcnRlZCIsIF9fZnVuY19fKTsKKworCWlmIChoZGRfZnRtX3NlcnZpY2VfcmVnaXN0cmF0aW9uKGhkZF9jdHgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfZnRtX3NlcnZpY2VfcmVnOworCX0KKworCWhkZF9jdHgtPmZ0bS5mdG1fc3RhdGUgPSBXTEFOX0ZUTV9TVEFSVEVEOworCisJcmV0dXJuIDA7CisKK2Vycl9mdG1fc2VydmljZV9yZWc6CisJd2xhbl9oZGRfZnRtX2Nsb3NlKGhkZF9jdHgpOworCitlcnJfc3RhdHVzX2ZhaWx1cmU6CisKKwlyZXR1cm4gLUVQRVJNOworCit9CisKKyNpZiAgZGVmaW5lZChRQ0FfV0lGSV9GVE0pCisvKioKKyAqIGhkZF9mdG1fc3RhcnQoKSAtIFN0YXJ0IEhERCBpbiBGVE0gbW9kZQorICogQGhkZF9jdHg6IEdsb2JhbCBIREQgY29udGV4dAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworaW50IGhkZF9mdG1fc3RhcnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlyZXR1cm4gd2xhbl9oZGRfZnRtX3N0YXJ0KGhkZF9jdHgpOworfQorI2VuZGlmCisKKyNpZiAgZGVmaW5lZChRQ0FfV0lGSV9GVE0pCisvKioKKyAqIGhkZF9mdG1fc3RvcCgpIC0gU3RvcCBIREQgaW4gRlRNIG1vZGUKKyAqIEBoZGRfY3R4OiBHbG9iYWwgSEREIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCBoZGRfZnRtX3N0b3AoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlyZXR1cm4gd2xhbl9mdG1fc3RvcChoZGRfY3R4KTsKK30KKyNlbmRpZgorCisjaWYgIGRlZmluZWQoUUNBX1dJRklfRlRNKQorI2lmIGRlZmluZWQoTElOVVhfUUNNQlIpCisvKioKKyAqIHdsYW5faGRkX3FjbWJyX2NvbW1hbmQoKSAtIFFDTUJSIGNvbW1hbmQgaGFuZGxlcgorICogQGFkYXB0ZXI6IGFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgY29tbWFuZCB3YXMgcmVjZWl2ZWQKKyAqIEBwcWNtYnJfZGF0YTogUUNNQlIgY29tbWFuZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHdsYW5faGRkX3FjbWJyX2NvbW1hbmQoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgIHFjbWJyX2RhdGFfdCAqcHFjbWJyX2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJcWNtYnJfcXVldWVfdCAqcWNtYnJfYnVmID0gTlVMTDsKKworCXN3aXRjaCAocHFjbWJyX2RhdGEtPmNtZCkgeworCWNhc2UgQVRIX1hJT0NUTF9VTklGSUVEX1VURl9DTUQ6IHsKKwkJcHFjbWJyX2RhdGEtPmNvcHlfdG9fdXNlciA9IDA7CisJCWlmIChwcWNtYnJfZGF0YS0+bGVuZ3RoKSB7CisJCQlpZiAod2xhbl9oZGRfZnRtX3Rlc3Rtb2RlX2NtZChwcWNtYnJfZGF0YS0+YnVmLAorCQkJCQkJICAgICAgcHFjbWJyX2RhdGEtPgorCQkJCQkJICAgICAgbGVuZ3RoKQorCQkJICAgICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJCXJldCA9IC1FQlVTWTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gMDsKKwkJCX0KKwkJfQorCX0KKwlicmVhazsKKworCWNhc2UgQVRIX1hJT0NUTF9VTklGSUVEX1VURl9SU1A6IHsKKwkJcHFjbWJyX2RhdGEtPmNvcHlfdG9fdXNlciA9IDE7CisJCWlmICghbGlzdF9lbXB0eSgmcWNtYnJfcXVldWVfaGVhZCkpIHsKKwkJCXNwaW5fbG9ja19iaCgmcWNtYnJfcXVldWVfbG9jayk7CisJCQlxY21icl9idWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZxY21icl9xdWV1ZV9oZWFkLAorCQkJCQkJICAgICBxY21icl9xdWV1ZV90LAorCQkJCQkJICAgICBsaXN0KTsKKwkJCWxpc3RfZGVsKCZxY21icl9idWYtPmxpc3QpOworCQkJc3Bpbl91bmxvY2tfYmgoJnFjbWJyX3F1ZXVlX2xvY2spOworCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC0xOworCQl9CisKKwkJaWYgKCFyZXQpIHsKKwkJCW1lbWNweShwcWNtYnJfZGF0YS0+YnVmLCBxY21icl9idWYtPnV0Zl9idWYsCisJCQkgICAgICAgKE1BWF9VVEZfTEVOR1RIICsgNCkpOworCQkJa2ZyZWUocWNtYnJfYnVmKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCX0KKwl9CisJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKKy8qKgorICogd2xhbl9oZGRfcWNtYnJfaW9jdGwoKSAtIENvbXBhdGFiaWxpdHktbW9kZSBRQ01CUiBpb2N0bCBoYW5kbGVyCisgKiBAYWRhcHRlcjogYWRhcHRlciB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpZnI6IHRoZSBpb2N0bCByZXF1ZXN0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfcWNtYnJfY29tcGF0X2lvY3RsKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgICAgIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXFjbWJyX2RhdGFfdCAqcWNtYnJfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCXFjbWJyX2RhdGEgPSBremFsbG9jKHNpemVvZihxY21icl9kYXRhX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAocWNtYnJfZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihxY21icl9kYXRhLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoKnFjbWJyX2RhdGEpKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0ID0gd2xhbl9oZGRfcWNtYnJfY29tbWFuZChhZGFwdGVyLCBxY21icl9kYXRhKTsKKwlpZiAocWNtYnJfZGF0YS0+Y29weV90b191c2VyKSB7CisJCXJldCA9IGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBxY21icl9kYXRhLT5idWYsCisJCQkJICAgKE1BWF9VVEZfTEVOR1RIICsgNCkpOworCX0KKworZXhpdDoKKwlrZnJlZShxY21icl9kYXRhKTsKKwlyZXR1cm4gcmV0OworfQorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDT05GSUdfQ09NUEFUICovCitzdGF0aWMgaW50IHdsYW5faGRkX3FjbWJyX2NvbXBhdF9pb2N0bChoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgICBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCisKKy8qKgorICogd2xhbl9oZGRfcWNtYnJfaW9jdGwoKSAtIFN0YW5kYXJkIFFDTUJSIGlvY3RsIGhhbmRsZXIKKyAqIEBhZGFwdGVyOiBhZGFwdGVyIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGlmcjogdGhlIGlvY3RsIHJlcXVlc3QKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9xY21icl9pb2N0bChoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlxY21icl9kYXRhX3QgKnFjbWJyX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlxY21icl9kYXRhID0ga3phbGxvYyhzaXplb2YocWNtYnJfZGF0YV90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHFjbWJyX2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIocWNtYnJfZGF0YSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKCpxY21icl9kYXRhKSkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBleGl0OworCX0KKworCXJldCA9IHdsYW5faGRkX3FjbWJyX2NvbW1hbmQoYWRhcHRlciwgcWNtYnJfZGF0YSk7CisJaWYgKHFjbWJyX2RhdGEtPmNvcHlfdG9fdXNlcikgeworCQlyZXQgPSBjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgcWNtYnJfZGF0YS0+YnVmLAorCQkJCSAgIChNQVhfVVRGX0xFTkdUSCArIDQpKTsKKwl9CisKK2V4aXQ6CisJa2ZyZWUocWNtYnJfZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9xY21icl91bmlmaWVkX2lvY3RsKCkgLSBVbmlmaWVkIFFDTUJSIGlvY3RsIGhhbmRsZXIKKyAqIEBhZGFwdGVyOiBhZGFwdGVyIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGlmcjogdGhlIGlvY3RsIHJlcXVlc3QKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworaW50IHdsYW5faGRkX3FjbWJyX3VuaWZpZWRfaW9jdGwoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IGlmcmVxICppZnIpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaXNfY29tcGF0X3Rhc2soKSkgeworCQlyZXQgPSB3bGFuX2hkZF9xY21icl9jb21wYXRfaW9jdGwoYWRhcHRlciwgaWZyKTsKKwl9IGVsc2UgeworCQlyZXQgPSB3bGFuX2hkZF9xY21icl9pb2N0bChhZGFwdGVyLCBpZnIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbnFjbWJyX21jX3Byb2Nlc3NfbXNnKCkgLSBQcm9jZXNzIFFDTUJSIHJlc3BvbnNlIG1lc3NhZ2UKKyAqIEBtZXNzYWdlOiBRQ01CUiBtZXNzYWdlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5xY21icl9tY19wcm9jZXNzX21zZyh2b2lkICptZXNzYWdlKQoreworCXFjbWJyX3F1ZXVlX3QgKnFjbWJyX2J1ZiA9IE5VTEw7CisJdWludDMyX3QgZGF0YV9sZW47CisKKwlkYXRhX2xlbiA9ICooKHVpbnQzMl90ICopIG1lc3NhZ2UpICsgc2l6ZW9mKHVpbnQzMl90KTsKKwlxY21icl9idWYgPSBremFsbG9jKHNpemVvZihxY21icl9xdWV1ZV90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHFjbWJyX2J1ZiAhPSBOVUxMKSB7CisJCW1lbWNweShxY21icl9idWYtPnV0Zl9idWYsIG1lc3NhZ2UsIGRhdGFfbGVuKTsKKwkJc3Bpbl9sb2NrX2JoKCZxY21icl9xdWV1ZV9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmKHFjbWJyX2J1Zi0+bGlzdCksICZxY21icl9xdWV1ZV9oZWFkKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnFjbWJyX3F1ZXVlX2xvY2spOworCX0KK30KKyNlbmRpZiAvKkxJTlVYX1FDTUJSICovCisKKy8qKgorICogd2xhbl9oZGRfZnRtX3Rlc3Rtb2RlX2NtZCgpIC0gUHJvY2VzcyBGVE0gdGVzdG1vZGUgY29tbWFuZAorICogQGRhdGE6IEZUTSB0ZXN0bW9kZSBjb21tYW5kCisgKiBAbGVuOiBsZW5ndGggb2YgQGRhdGEKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBDREZfU1RBVFVTX0VfKiBvbiBlcnJvcgorICovCitDREZfU1RBVFVTIHdsYW5faGRkX2Z0bV90ZXN0bW9kZV9jbWQodm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgYXI2a190ZXN0bW9kZV9jbWRfZGF0YSAqY21kX2RhdGE7CisKKwljbWRfZGF0YSA9IChzdHJ1Y3QgYXI2a190ZXN0bW9kZV9jbWRfZGF0YSAqKQorCQkgICBjZGZfbWVtX21hbGxvYyhzaXplb2YoKmNtZF9kYXRhKSk7CisKKwlpZiAoIWNtZF9kYXRhKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAoIkZhaWxlZCB0byBhbGxvY2F0ZSBGVE0gY29tbWFuZCBkYXRhIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNtZF9kYXRhLT5kYXRhID0gY2RmX21lbV9tYWxsb2MobGVuKTsKKworCWlmICghY21kX2RhdGEtPmRhdGEpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICgiRmFpbGVkIHRvIGFsbG9jYXRlIEZUTSBjb21tYW5kIGRhdGEgYnVmZmVyIikpOworCQljZGZfbWVtX2ZyZWUoY21kX2RhdGEpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNtZF9kYXRhLT5sZW4gPSBsZW47CisJY2RmX21lbV9jb3B5KGNtZF9kYXRhLT5kYXRhLCBkYXRhLCBsZW4pOworCisJaWYgKHdsYW5fZnRtX3Bvc3Rtc2coKHVpbnQ4X3QgKikgY21kX2RhdGEsIHNpemVvZigqY21kX2RhdGEpKSkgeworCQljZGZfbWVtX2ZyZWUoY21kX2RhdGEtPmRhdGEpOworCQljZGZfbWVtX2ZyZWUoY21kX2RhdGEpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKlFDQV9XSUZJX0ZUTSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX2dyZWVuX2FwLmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZ3JlZW5fYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2YyYzIzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX2dyZWVuX2FwLmMKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiAgRE9DOiB3bGFuX2hkZF9ncmVlbl9hcC5jCisgKgorICogIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIEdyZWVuIEFQIGltcGxlbWVudGF0aW9uCisgKgorICovCisKKy8qIEluY2x1ZGUgRmlsZXMgKi8KKyNpbmNsdWRlIDx3bGFuX2hkZF9tYWluLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfbWlzYy5oPgorI2luY2x1ZGUgIndsYW5faGRkX2dyZWVuX2FwLmgiCisjaW5jbHVkZSAid21hX2FwaS5oIgorI2luY2x1ZGUgImNkc19jb25jdXJyZW5jeS5oIgorCisjZGVmaW5lIEdSRUVOX0FQX1BTX09OX1RJTUUgICAgICAgICgwKQorI2RlZmluZSBHUkVFTl9BUF9QU19ERUxBWV9USU1FICAgICAoMjApCisKKy8qKgorICogZW51bSBoZGRfZ3JlZW5fYXBfcHNfc3RhdGUgLSBHcmVlbi1BUCBwb3dlciBzYXZlIHN0YXRlcworICogQEdSRUVOX0FQX1BTX0lETEVfU1RBVEU6IHRoZSBHcmVlbl9BUCBpcyBub3QgZW5hYmxlZAorICogQEdSRUVOX0FQX1BTX09GRl9TVEFURTogaW4gUG93ZXIgU2F2aW5nIE9GRiBzdGF0ZQorICogQEdSRUVOX0FQX1BTX1dBSVRfU1RBVEU6IGluIHRyYW5zaXRpb24gdG8gUG93ZXIgU2F2aW5nIE9OIHN0YXRlCisgKiBAR1JFRU5fQVBfUFNfT05fU1RBVEU6IGluIFBvd2VyIFNhdmluZyBPTiBzdGF0ZQorICovCitlbnVtIGhkZF9ncmVlbl9hcF9wc19zdGF0ZSB7CisJR1JFRU5fQVBfUFNfSURMRV9TVEFURSA9IDEsCisJR1JFRU5fQVBfUFNfT0ZGX1NUQVRFLAorCUdSRUVOX0FQX1BTX1dBSVRfU1RBVEUsCisJR1JFRU5fQVBfUFNfT05fU1RBVEUsCit9OworCisvKioKKyAqIGVudW0gaGRkX2dyZWVuX2FwX2V2ZW50IC0gR3JlZW4tQVAgcG93ZXIgc2F2ZSBldmVudHMKKyAqIEBHUkVFTl9BUF9QU19TVEFSVF9FVkVOVDogZXZlbnQgdG8gaW5kaWNhdGUgdG8gZW5hYmxlIEdyZWVuX0FQCisgKiBAR1JFRU5fQVBfUFNfU1RBUlRfRVZFTlQ6IGV2ZW50IHRvIGluZGljYXRlIHRvIGRpc2FibGUgR3JlZW5fQVAKKyAqIEBHUkVFTl9BUF9BRERfU1RBX0VWRU5UOiBldmVudCB0byBpbmRpY2F0ZSBhIG5ldyBTVEEgY29ubmVjdGVkCisgKiBAR1JFRU5fQVBfREVMX1NUQV9FVkVOVDogZXZlbnQgdG8gaW5kaWNhdGUgYSBTVEEgZGlzY29ubmVjdGVkCisgKiBAR1JFRU5fQVBfUFNfT05fRVZFTlQ6IGV2ZW50IHRvIGluZGljYXRlIHRvIGVudGVyIFBvd2VyIFNhdmluZyBzdGF0ZQorICogQEdSRUVOX0FQX1BTX1dBSVRfRVZFTlQ6IGV2ZW50IHRvIGluZGljYXRlIGluIHRoZSB0cmFuc2l0aW9uIHRvIFBvd2VyIFNhdmluZworICovCitlbnVtIGhkZF9ncmVlbl9hcF9ldmVudCB7CisJR1JFRU5fQVBfUFNfU1RBUlRfRVZFTlQgPSAxLAorCUdSRUVOX0FQX1BTX1NUT1BfRVZFTlQsCisJR1JFRU5fQVBfQUREX1NUQV9FVkVOVCwKKwlHUkVFTl9BUF9ERUxfU1RBX0VWRU5ULAorCUdSRUVOX0FQX1BTX09OX0VWRU5ULAorCUdSRUVOX0FQX1BTX1dBSVRfRVZFTlQsCit9OworCisvKioKKyAqIHN0cnVjdCBoZGRfZ3JlZW5fYXBfY3R4IC0gR3JlZW4tQVAgY29udGV4dAorICogQHBzX2VuYWJsZTogV2hldGhlciBvciBub3QgR3JlZW4gQVAgaXMgZW5hYmxlZAorICogQHBzX29uX3RpbWU6IEFtb3VudCBvZiB0aW1lIHRvIHN0YXkgaW4gR3JlZW4gQVAgcG93ZXIgc2F2aW5nIHN0YXRlCisgKiBAcHNfZGVsYXlfdGltZTogQW1vdW50IG9mIHRpbWUgdG8gZGVsYXkgd2hlbiBjaGFuZ2luZyBzdGF0ZXMKKyAqIEBudW1fbm9kZXM6IE51bWJlciBvZiBjb25uZWN0ZWQgY2xpZW50cworICogQHBzX3N0YXRlOiBDdXJyZW50IHN0YXRlCisgKiBAcHNfZXZlbnQ6IEV2ZW50IHRvIHRyaWdnZXIgd2hlbiB0aW1lciBleHBpcmVzCisgKiBAcHNfdGltZXI6IEV2ZW50IHRpbWVyCisgKi8KK3N0cnVjdCBoZGRfZ3JlZW5fYXBfY3R4IHsKKwl1aW50OF90IHBzX2VuYWJsZTsKKwl1aW50MzJfdCBwc19vbl90aW1lOworCXVpbnQzMl90IHBzX2RlbGF5X3RpbWU7CisJdWludDMyX3QgbnVtX25vZGVzOworCisJZW51bSBoZGRfZ3JlZW5fYXBfcHNfc3RhdGUgcHNfc3RhdGU7CisJZW51bSBoZGRfZ3JlZW5fYXBfZXZlbnQgcHNfZXZlbnQ7CisKKwljZGZfbWNfdGltZXJfdCBwc190aW1lcjsKK307CisKKy8qKgorICogaGRkX3dsYW5fZ3JlZW5fYXBfdXBkYXRlKCkgLSB1cGRhdGUgdGhlIGN1cnJlbnQgU3RhdGUgYW5kIEV2ZW50CisgKiBAaGRkX2N0eDogR2xvYmFsIEhERCBjb250ZXh0CisgKiBAc3RhdGU6IE5ldyBzdGF0ZQorICogQGV2ZW50OiBOZXcgZXZlbnQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX3dsYW5fZ3JlZW5fYXBfdXBkYXRlKHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4LAorCQkJCSAgICAgZW51bSBoZGRfZ3JlZW5fYXBfcHNfc3RhdGUgc3RhdGUsCisJCQkJICAgICBlbnVtIGhkZF9ncmVlbl9hcF9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgaGRkX2dyZWVuX2FwX2N0eCAqZ3JlZW5fYXAgPSBoZGRfY3R4LT5ncmVlbl9hcF9jdHg7CisKKwlncmVlbl9hcC0+cHNfc3RhdGUgPSBzdGF0ZTsKKwlncmVlbl9hcC0+cHNfZXZlbnQgPSBldmVudDsKK30KKworLyoqCisgKiBoZGRfd2xhbl9ncmVlbl9hcF9lbmFibGUoKSAtIFNlbmQgR3JlZW4gQVAgY29uZmlndXJhdGlvbiB0byBmaXJtd2FyZQorICogQGFkYXB0ZXI6IEFkYXB0ZXIgdXBvbiB3aGljaCBHcmVlbiBBUCBpcyBiZWluZyBjb25maWd1cmVkCisgKiBAZW5hYmxlOiBGbGFnIHdoaWNoIGluZGljYXRlcyBpZiBHcmVlbiBBUCBpcyBiZWluZyBlbmFibGVkIG9yIGRpc2FibGVkCisgKgorICogUmV0dXJuOiAwIHVwb24gc3VjY2Vzcywgbm9uLXplcm8gdXBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgaGRkX3dsYW5fZ3JlZW5fYXBfZW5hYmxlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgIHVpbnQ4X3QgZW5hYmxlKQoreworCWludCByZXQ7CisKKwloZGRMb2coTE9HMSwgRkwoIlNldCBHcmVlbi1BUCB2YWw6ICVkIiksIGVuYWJsZSk7CisKKwlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkgIFdNSV9QREVWX0dSRUVOX0FQX1BTX0VOQUJMRV9DTURJRCwKKwkJCQkgIGVuYWJsZSwgREJHX0NNRCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF93bGFuX2dyZWVuX2FwX21jKCkgLSBHcmVlbiBBUCBzdGF0ZSBtYWNoaW5lCisgKiBAaGRkX2N0eDogSEREIGdsb2JhbCBjb250ZXh0CisgKiBAZXZlbnQ6IE5ldyBldmVudCBiZWluZyBwcm9jZXNzZWQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX3dsYW5fZ3JlZW5fYXBfbWMoc3RydWN0IGhkZF9jb250ZXh0X3MgKmhkZF9jdHgsCisJCQkJIGVudW0gaGRkX2dyZWVuX2FwX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBoZGRfZ3JlZW5fYXBfY3R4ICpncmVlbl9hcDsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyOworCisJZ3JlZW5fYXAgPSBoZGRfY3R4LT5ncmVlbl9hcF9jdHg7CisJaWYgKGdyZWVuX2FwID09IE5VTEwpCisJCXJldHVybjsKKworCWhkZExvZyhMT0cxLCBGTCgiR3JlZW4tQVAgZXZlbnQ6ICVkLCBzdGF0ZTogJWQsIG51bV9ub2RlczogJWQiKSwKKwkgICAgICAgZXZlbnQsIGdyZWVuX2FwLT5wc19zdGF0ZSwgZ3JlZW5fYXAtPm51bV9ub2Rlcyk7CisKKwkvKiBoYW5kbGUgdGhlIGdyZWVuIGFwIHBzIGV2ZW50ICovCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgR1JFRU5fQVBfUFNfU1RBUlRfRVZFTlQ6CisJCWdyZWVuX2FwLT5wc19lbmFibGUgPSAxOworCQlicmVhazsKKworCWNhc2UgR1JFRU5fQVBfUFNfU1RPUF9FVkVOVDoKKwkJaWYgKCEoY2RzX2dldF9jb25jdXJyZW5jeV9tb2RlKCkgJiBDREZfU0FQX01BU0spKQorCQkJZ3JlZW5fYXAtPnBzX2VuYWJsZSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBHUkVFTl9BUF9BRERfU1RBX0VWRU5UOgorCQlncmVlbl9hcC0+bnVtX25vZGVzKys7CisJCWJyZWFrOworCisJY2FzZSBHUkVFTl9BUF9ERUxfU1RBX0VWRU5UOgorCQlpZiAoZ3JlZW5fYXAtPm51bV9ub2RlcykKKwkJCWdyZWVuX2FwLT5udW1fbm9kZXMtLTsKKwkJYnJlYWs7CisKKwljYXNlIEdSRUVOX0FQX1BTX09OX0VWRU5UOgorCWNhc2UgR1JFRU5fQVBfUFNfV0FJVF9FVkVOVDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQloZGRMb2coTE9HRSwgRkwoImludmFsaWQgZXZlbnQgJWQiKSwgZXZlbnQpOworCQlicmVhazsKKwl9CisKKwkvKiBDb25maXJtIHRoYXQgcG93ZXIgc2F2ZSBpcyBlbmFibGVkIGJlZm9yZSBkb2luZyBzdGF0ZSB0cmFuc2l0aW9ucyAqLworCWlmICghZ3JlZW5fYXAtPnBzX2VuYWJsZSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sIEZMKCJHcmVlbi1BUCBpcyBkaXNhYmxlZCIpKTsKKwkJaGRkX3dsYW5fZ3JlZW5fYXBfdXBkYXRlKGhkZF9jdHgsCisJCQkJCSBHUkVFTl9BUF9QU19JRExFX1NUQVRFLAorCQkJCQkgR1JFRU5fQVBfUFNfV0FJVF9FVkVOVCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlhZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKGhkZF9jdHgsIFdMQU5fSEREX1NPRlRBUCk7CisJaWYgKGFkYXB0ZXIgPT0gTlVMTCkgeworCQloZGRMb2coTE9HRSwgRkwoIkdyZWVuLUFQIG5vIFNBUCBhZGFwdGVyIikpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogaGFuZGxlIHRoZSBncmVlbiBhcCBwcyBzdGF0ZSAqLworCXN3aXRjaCAoZ3JlZW5fYXAtPnBzX3N0YXRlKSB7CisJY2FzZSBHUkVFTl9BUF9QU19JRExFX1NUQVRFOgorCQloZGRfd2xhbl9ncmVlbl9hcF91cGRhdGUoaGRkX2N0eCwKKwkJCQkJIEdSRUVOX0FQX1BTX09GRl9TVEFURSwKKwkJCQkJIEdSRUVOX0FQX1BTX1dBSVRfRVZFTlQpOworCQlicmVhazsKKworCWNhc2UgR1JFRU5fQVBfUFNfT0ZGX1NUQVRFOgorCQlpZiAoIWdyZWVuX2FwLT5udW1fbm9kZXMpIHsKKwkJCWhkZF93bGFuX2dyZWVuX2FwX3VwZGF0ZShoZGRfY3R4LAorCQkJCQkJIEdSRUVOX0FQX1BTX1dBSVRfU1RBVEUsCisJCQkJCQkgR1JFRU5fQVBfUFNfV0FJVF9FVkVOVCk7CisJCQljZGZfbWNfdGltZXJfc3RhcnQoJmdyZWVuX2FwLT5wc190aW1lciwKKwkJCQkJICAgZ3JlZW5fYXAtPnBzX2RlbGF5X3RpbWUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBHUkVFTl9BUF9QU19XQUlUX1NUQVRFOgorCQlpZiAoIWdyZWVuX2FwLT5udW1fbm9kZXMpIHsKKwkJCWhkZF93bGFuX2dyZWVuX2FwX3VwZGF0ZShoZGRfY3R4LAorCQkJCQkJIEdSRUVOX0FQX1BTX09OX1NUQVRFLAorCQkJCQkJIEdSRUVOX0FQX1BTX1dBSVRfRVZFTlQpOworCisJCQloZGRfd2xhbl9ncmVlbl9hcF9lbmFibGUoYWRhcHRlciwgMSk7CisKKwkJCWlmIChncmVlbl9hcC0+cHNfb25fdGltZSkgeworCQkJCWhkZF93bGFuX2dyZWVuX2FwX3VwZGF0ZShoZGRfY3R4LAorCQkJCQkJCSAwLAorCQkJCQkJCSBHUkVFTl9BUF9QU19XQUlUX0VWRU5UKTsKKwkJCQljZGZfbWNfdGltZXJfc3RhcnQoJmdyZWVuX2FwLT5wc190aW1lciwKKwkJCQkJCSAgIGdyZWVuX2FwLT5wc19vbl90aW1lKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWhkZF93bGFuX2dyZWVuX2FwX3VwZGF0ZShoZGRfY3R4LAorCQkJCQkJIEdSRUVOX0FQX1BTX09GRl9TVEFURSwKKwkJCQkJCSBHUkVFTl9BUF9QU19XQUlUX0VWRU5UKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgR1JFRU5fQVBfUFNfT05fU1RBVEU6CisJCWlmIChncmVlbl9hcC0+bnVtX25vZGVzKSB7CisJCQlpZiAoaGRkX3dsYW5fZ3JlZW5fYXBfZW5hYmxlKGFkYXB0ZXIsIDApKSB7CisJCQkJaGRkTG9nKExPR0UsIEZMKCJGQUlMRUQgVE8gU0VUIEdSRUVOLUFQIG1vZGUiKSk7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJaGRkX3dsYW5fZ3JlZW5fYXBfdXBkYXRlKGhkZF9jdHgsCisJCQkJCQkgR1JFRU5fQVBfUFNfT0ZGX1NUQVRFLAorCQkJCQkJIEdSRUVOX0FQX1BTX1dBSVRfRVZFTlQpOworCQl9IGVsc2UgaWYgKChncmVlbl9hcC0+cHNfZXZlbnQgPT0gR1JFRU5fQVBfUFNfV0FJVF9FVkVOVCkKKwkJCSAgICYmIChncmVlbl9hcC0+cHNfb25fdGltZSkpIHsKKworCQkJLyogcHNfb25fdGltZSB0aW1lb3V0LCBzd2l0Y2ggdG8gcHMgb2ZmICovCisJCQloZGRfd2xhbl9ncmVlbl9hcF91cGRhdGUoaGRkX2N0eCwKKwkJCQkJCSBHUkVFTl9BUF9QU19XQUlUX1NUQVRFLAorCQkJCQkJIEdSRUVOX0FQX1BTX09OX0VWRU5UKTsKKworCQkJaWYgKGhkZF93bGFuX2dyZWVuX2FwX2VuYWJsZShhZGFwdGVyLCAwKSkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgiRkFJTEVEIFRPIFNFVCBHUkVFTi1BUCBtb2RlIikpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKworCQkJY2RmX21jX3RpbWVyX3N0YXJ0KCZncmVlbl9hcC0+cHNfdGltZXIsCisJCQkJCSAgIGdyZWVuX2FwLT5wc19kZWxheV90aW1lKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWhkZExvZyhMT0dFLCBGTCgiaW52YWxpZCBzdGF0ZSAlZCIpLCBncmVlbl9hcC0+cHNfc3RhdGUpOworCQloZGRfd2xhbl9ncmVlbl9hcF91cGRhdGUoaGRkX2N0eCwgR1JFRU5fQVBfUFNfT0ZGX1NUQVRFLAorCQkJCQkgR1JFRU5fQVBfUFNfV0FJVF9FVkVOVCk7CisJCWJyZWFrOworCX0KKworZG9uZToKKwlyZXR1cm47Cit9CisKKy8qKgorICogaGRkX3dsYW5fZ3JlZW5fYXBfdGltZXJfZm4oKSAtIEdyZWVuIEFQIFRpbWVyIGhhbmRsZXIKKyAqIEBjdHg6IEdsb2JhbCBIREQgY29udGV4dAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfd2xhbl9ncmVlbl9hcF90aW1lcl9mbih2b2lkICpjdHgpCit7CisJc3RydWN0IGhkZF9jb250ZXh0X3MgKmhkZF9jdHggPSBjdHg7CisJc3RydWN0IGhkZF9ncmVlbl9hcF9jdHggKmdyZWVuX2FwOworCisJaWYgKDAgIT0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm47CisJfQorCisJZ3JlZW5fYXAgPSBoZGRfY3R4LT5ncmVlbl9hcF9jdHg7CisJaWYgKGdyZWVuX2FwKQorCQloZGRfd2xhbl9ncmVlbl9hcF9tYyhoZGRfY3R4LCBncmVlbl9hcC0+cHNfZXZlbnQpOworfQorCisvKioKKyAqIGhkZF93bGFuX2dyZWVuX2FwX2F0dGFjaCgpIC0gQXR0YWNoIEdyZWVuIEFQIGNvbnRleHQgdG8gSEREIGNvbnRleHQKKyAqIEBoZGRfY3R4OiBHbG9iYWwgSEREIGNvbnRlY3QKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgQ0RGX1NUQVRVU19FXyogZXJyb3IKKyAqLworc3RhdGljIENERl9TVEFUVVMgaGRkX3dsYW5fZ3JlZW5fYXBfYXR0YWNoKHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KQoreworCXN0cnVjdCBoZGRfZ3JlZW5fYXBfY3R4ICpncmVlbl9hcDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCUVOVEVSKCk7CisKKwlncmVlbl9hcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqZ3JlZW5fYXApKTsKKwlpZiAoIWdyZWVuX2FwKSB7CisJCWhkZExvZyhMT0dQLCBGTCgiTWVtb3J5IGFsbG9jYXRpb24gZm9yIEdyZWVuLUFQIGZhaWxlZCEiKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwljZGZfbWVtX3plcm8oZ3JlZW5fYXAsIHNpemVvZigqZ3JlZW5fYXApKTsKKwlncmVlbl9hcC0+cHNfc3RhdGUgPSBHUkVFTl9BUF9QU19PRkZfU1RBVEU7CisJZ3JlZW5fYXAtPnBzX2V2ZW50ID0gMDsKKwlncmVlbl9hcC0+bnVtX25vZGVzID0gMDsKKwlncmVlbl9hcC0+cHNfb25fdGltZSA9IEdSRUVOX0FQX1BTX09OX1RJTUU7CisJZ3JlZW5fYXAtPnBzX2RlbGF5X3RpbWUgPSBHUkVFTl9BUF9QU19ERUxBWV9USU1FOworCisJY2RmX21jX3RpbWVyX2luaXQoJmdyZWVuX2FwLT5wc190aW1lciwKKwkJCSAgQ0RGX1RJTUVSX1RZUEVfU1csCisJCQkgIGhkZF93bGFuX2dyZWVuX2FwX3RpbWVyX2ZuLCBoZGRfY3R4KTsKKworZXJyb3I6CisJaGRkX2N0eC0+Z3JlZW5fYXBfY3R4ID0gZ3JlZW5fYXA7CisKKwlFWElUKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBoZGRfd2xhbl9ncmVlbl9hcF9kZWF0dGFjaCgpIC0gRGV0YWNoIEdyZWVuIEFQIGNvbnRleHQgZnJvbSBIREQgY29udGV4dAorICogQGhkZF9jdHg6IEdsb2JhbCBIREQgY29udGVjdAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBDREZfU1RBVFVTX0VfKiBlcnJvcgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBoZGRfd2xhbl9ncmVlbl9hcF9kZWF0dGFjaChzdHJ1Y3QgaGRkX2NvbnRleHRfcyAqaGRkX2N0eCkKK3sKKwlzdHJ1Y3QgaGRkX2dyZWVuX2FwX2N0eCAqZ3JlZW5fYXAgPSBoZGRfY3R4LT5ncmVlbl9hcF9jdHg7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlFTlRFUigpOworCisJaWYgKGdyZWVuX2FwID09IE5VTEwpIHsKKwkJaGRkTG9nKExPRzEsIEZMKCJHcmVlbi1BUCBpcyBub3QgZW5hYmxlZCIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PU1VQUE9SVDsKKwkJZ290byBkb25lOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSB0aW1lciBzdGF0dXMgaXMgZGVzdHJveWVkICovCisJaWYgKENERl9USU1FUl9TVEFURV9SVU5OSU5HID09CisJICAgIGNkZl9tY190aW1lcl9nZXRfY3VycmVudF9zdGF0ZSgmZ3JlZW5fYXAtPnBzX3RpbWVyKSkKKwkJY2RmX21jX3RpbWVyX3N0b3AoJmdyZWVuX2FwLT5wc190aW1lcik7CisKKwkvKiBEZXN0cm95IHRoZSBHcmVlbiBBUCB0aW1lciAqLworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9tY190aW1lcl9kZXN0cm95KCZncmVlbl9hcC0+cHNfdGltZXIpKSkKKwkJaGRkTG9nKExPRzEsIEZMKCJDYW5ub3QgZGVhbGxvY2F0ZSBHcmVlbi1BUCdzIHRpbWVyIikpOworCisJLyogcmVsZWFzZSBtZW1vcnkgKi8KKwljZGZfbWVtX3plcm8oZ3JlZW5fYXAsIHNpemVvZigqZ3JlZW5fYXApKTsKKwljZGZfbWVtX2ZyZWUoZ3JlZW5fYXApOworCWhkZF9jdHgtPmdyZWVuX2FwX2N0eCA9IE5VTEw7CisKK2RvbmU6CisKKwlFWElUKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBoZGRfd2xhbl9ncmVlbl9hcF9pbml0KCkgLSBJbml0aWFsaXplIEdyZWVuIEFQIGZlYXR1cmUKKyAqIEBoZGRfY3R4OiBIREQgZ2xvYmFsIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfd2xhbl9ncmVlbl9hcF9pbml0KHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KQoreworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGhkZF93bGFuX2dyZWVuX2FwX2F0dGFjaChoZGRfY3R4KSkpCisJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIEdyZWVuLUFQIHJlc291cmNlIikpOworfQorCisvKioKKyAqIGhkZF93bGFuX2dyZWVuX2FwX2RlaW5pdCgpIC0gRGUtaW5pdGlhbGl6ZSBHcmVlbiBBUCBmZWF0dXJlCisgKiBAaGRkX2N0eDogSEREIGdsb2JhbCBjb250ZXh0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaGRkX3dsYW5fZ3JlZW5fYXBfZGVpbml0KHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KQoreworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGhkZF93bGFuX2dyZWVuX2FwX2RlYXR0YWNoKGhkZF9jdHgpKSkKKwkJaGRkTG9nKExPR0UsIEZMKCJDYW5ub3QgZGVhbGxvY2F0ZSBHcmVlbi1BUCByZXNvdXJjZSIpKTsKK30KKworLyoqCisgKiBoZGRfd2xhbl9ncmVlbl9hcF9zdGFydF9ic3MoKSAtIE5vdGlmeSBHcmVlbiBBUCBvZiBTdGFydCBCU1MgZXZlbnQKKyAqIEBoZGRfY3R4OiBIREQgZ2xvYmFsIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfd2xhbl9ncmVlbl9hcF9zdGFydF9ic3Moc3RydWN0IGhkZF9jb250ZXh0X3MgKmhkZF9jdHgpCit7CisJc3RydWN0IGhkZF9jb25maWcgKmNmZyA9IGhkZF9jdHgtPmNvbmZpZzsKKworCWlmICghKENERl9TVEFfTUFTSyAmIGhkZF9jdHgtPmNvbmN1cnJlbmN5X21vZGUpICYmCisJICAgIGNmZy0+ZW5hYmxlMngyICYmIGNmZy0+ZW5hYmxlR3JlZW5BUCkgeworCQloZGRfd2xhbl9ncmVlbl9hcF9tYyhoZGRfY3R4LCBHUkVFTl9BUF9QU19TVEFSVF9FVkVOVCk7CisJfSBlbHNlIHsKKwkJaGRkX3dsYW5fZ3JlZW5fYXBfbWMoaGRkX2N0eCwgR1JFRU5fQVBfUFNfU1RPUF9FVkVOVCk7CisJCWhkZExvZyhMT0cxLAorCQkgICAgICAgIkdyZWVuLUFQOiBpcyBkaXNhYmxlZCwgZHVlIHRvIHN0YV9jb25jdXJyZW5jeTogJWQsIGVuYWJsZTJ4MjogJWQsIGVuYWJsZUdyZWVuQVA6ICVkIiwKKwkJICAgICAgIENERl9TVEFfTUFTSyAmIGhkZF9jdHgtPmNvbmN1cnJlbmN5X21vZGUsCisJCSAgICAgICBjZmctPmVuYWJsZTJ4MiwgY2ZnLT5lbmFibGVHcmVlbkFQKTsKKwl9Cit9CisKKy8qKgorICogaGRkX3dsYW5fZ3JlZW5fYXBfc3RvcF9ic3MoKSAtIE5vdGlmeSBHcmVlbiBBUCBvZiBTdG9wIEJTUyBldmVudAorICogQGhkZF9jdHg6IEhERCBnbG9iYWwgY29udGV4dAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGhkZF93bGFuX2dyZWVuX2FwX3N0b3BfYnNzKHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KQoreworCWhkZF93bGFuX2dyZWVuX2FwX21jKGhkZF9jdHgsIEdSRUVOX0FQX1BTX1NUT1BfRVZFTlQpOworfQorCisvKioKKyAqIGhkZF93bGFuX2dyZWVuX2FwX2FkZF9zdGEoKSAtIE5vdGlmeSBHcmVlbiBBUCBvZiBBZGQgU3RhdGlvbiAgZXZlbnQKKyAqIEBoZGRfY3R4OiBIREQgZ2xvYmFsIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfd2xhbl9ncmVlbl9hcF9hZGRfc3RhKHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KQoreworCWhkZF93bGFuX2dyZWVuX2FwX21jKGhkZF9jdHgsIEdSRUVOX0FQX0FERF9TVEFfRVZFTlQpOworfQorCisvKioKKyAqIGhkZF93bGFuX2dyZWVuX2FwX2RlbF9zdGEoKSAtIE5vdGlmeSBHcmVlbiBBUCBvZiBEZWxldGUgU3RhdGlvbiBldmVudAorICogQGhkZF9jdHg6IEhERCBnbG9iYWwgY29udGV4dAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGhkZF93bGFuX2dyZWVuX2FwX2RlbF9zdGEoc3RydWN0IGhkZF9jb250ZXh0X3MgKmhkZF9jdHgpCit7CisJaGRkX3dsYW5fZ3JlZW5fYXBfbWMoaGRkX2N0eCwgR1JFRU5fQVBfREVMX1NUQV9FVkVOVCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZ3JlZW5fYXAuaCBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9ncmVlbl9hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDRkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfZ3JlZW5fYXAuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fV0xBTl9IRERfR1JFRU5fQVBfSAorI2RlZmluZSBfX1dMQU5fSEREX0dSRUVOX0FQX0gKKworLyoqCisgKiBET0M6IHdsYW5faGRkX2dyZWVuX2FwLmgKKyAqCisgKiBXTEFOIEhvc3QgRGV2aWNlIERyaXZlciBHcmVlbiBBUCBBUEkgc3BlY2lmaWNhdGlvbgorICovCisKK3N0cnVjdCBoZGRfY29udGV4dF9zOworCisjaWZkZWYgRkVBVFVSRV9HUkVFTl9BUAordm9pZCBoZGRfd2xhbl9ncmVlbl9hcF9pbml0KHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KTsKK3ZvaWQgaGRkX3dsYW5fZ3JlZW5fYXBfZGVpbml0KHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KTsKK3ZvaWQgaGRkX3dsYW5fZ3JlZW5fYXBfc3RhcnRfYnNzKHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KTsKK3ZvaWQgaGRkX3dsYW5fZ3JlZW5fYXBfc3RvcF9ic3Moc3RydWN0IGhkZF9jb250ZXh0X3MgKmhkZF9jdHgpOwordm9pZCBoZGRfd2xhbl9ncmVlbl9hcF9hZGRfc3RhKHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KTsKK3ZvaWQgaGRkX3dsYW5fZ3JlZW5fYXBfZGVsX3N0YShzdHJ1Y3QgaGRkX2NvbnRleHRfcyAqaGRkX2N0eCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGhkZF93bGFuX2dyZWVuX2FwX2luaXQoc3RydWN0IGhkZF9jb250ZXh0X3MgKmhkZF9jdHgpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgaGRkX3dsYW5fZ3JlZW5fYXBfZGVpbml0KHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KSB7fQorc3RhdGljIGlubGluZSB2b2lkIGhkZF93bGFuX2dyZWVuX2FwX3N0YXJ0X2JzcyhzdHJ1Y3QgaGRkX2NvbnRleHRfcyAqaGRkX2N0eCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBoZGRfd2xhbl9ncmVlbl9hcF9zdG9wX2JzcyhzdHJ1Y3QgaGRkX2NvbnRleHRfcyAqaGRkX2N0eCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBoZGRfd2xhbl9ncmVlbl9hcF9hZGRfc3RhKHN0cnVjdCBoZGRfY29udGV4dF9zICpoZGRfY3R4KSB7fQorc3RhdGljIGlubGluZSB2b2lkIGhkZF93bGFuX2dyZWVuX2FwX2RlbF9zdGEoc3RydWN0IGhkZF9jb250ZXh0X3MgKmhkZF9jdHgpIHt9CisjZW5kaWYgLyogRkVBVFVSRV9HUkVFTl9BUCAqLworI2VuZGlmIC8qIF9fV0xBTl9IRERfR1JFRU5fQVBfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX2hvc3RhcGQuYyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9ob3N0YXBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyNDUzOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9ob3N0YXBkLmMKQEAgLTAsMCArMSw4NDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogIHdsYW5faGRkX2hvc3RhcGQuYworICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIGltcGxlbWVudGF0aW9uCisgKi8KKworLyogSW5jbHVkZSBGaWxlcyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGNkc19hcGkuaD4KKyNpbmNsdWRlIDxjZHNfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2luY2x1ZGVzLmg+CisjaW5jbHVkZSA8cWNfc2FwX2lvY3RsLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaG9zdGFwZC5oPgorI2luY2x1ZGUgPHNhcF9hcGkuaD4KKyNpbmNsdWRlIDxzYXBfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9zb2Z0YXBfdHhfcnguaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9tYWluLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaW9jdGwuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KKyNpbmNsdWRlICJ3bGFuX2hkZF9wMnAuaCIKKyNpbmNsdWRlIDx3bGFuX2hkZF9pcGEuaD4KKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgIndsYW5faGRkX21pc2MuaCIKKyNpbmNsdWRlIDxjZHNfdXRpbHMuaD4KKyNpZiBkZWZpbmVkIENPTkZJR19DTlNTCisjaW5jbHVkZSA8bmV0L2Nuc3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAid21hLmgiCisjaWZkZWYgREVCVUcKKyNpbmNsdWRlICJ3bWFfYXBpLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ3bGFuX2hkZF90cmFjZS5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgImNkZl90cmFjZS5oIgorI2luY2x1ZGUgIndsYW5faGRkX2NmZy5oIgorI2luY2x1ZGUgImNkc19jb25jdXJyZW5jeS5oIgorI2luY2x1ZGUgIndsYW5faGRkX2dyZWVuX2FwLmgiCisKKyNkZWZpbmUgICAgSVNfVVAoX2RldikgXAorCSgoKF9kZXYpLT5mbGFncyAmIChJRkZfUlVOTklOR3xJRkZfVVApKSA9PSAoSUZGX1JVTk5JTkd8SUZGX1VQKSkKKyNkZWZpbmUgICAgSVNfVVBfQVVUTyhfaWMpIFwKKwkoSVNfVVAoKF9pYyktPmljX2RldikgJiYgKF9pYyktPmljX3JvYW1pbmcgPT0gSUVFRTgwMjExX1JPQU1JTkdfQVVUTykKKyNkZWZpbmUgV0VfV0xBTl9WRVJTSU9OICAgICAxCisjZGVmaW5lIFdFX0dFVF9TVEFfSU5GT19TSVpFIDMwCisvKiBXRVhUIGxpbWl0YXRpb246IE1BWCBhbGxvd2VkIGJ1ZiBsZW4gZm9yIGFueSAqCisgKiBJV19QUklWX1RZUEVfQ0hBUiBpcyAyS2J5dGVzICoKKyAqLworI2RlZmluZSBXRV9TQVBfTUFYX1NUQV9JTkZPIDB4N0ZGCisKKyNkZWZpbmUgUkNfMl9SQVRFX0lEWChfcmMpICAgICAgICAoKF9yYykgJiAweDcpCisjZGVmaW5lIEhUX1JDXzJfU1RSRUFNUyhfcmMpICAgICgoKChfcmMpICYgMHg3OCkgPj4gMykgKyAxKQorI2RlZmluZSBSQ18yX1JBVEVfSURYXzExQUMoX3JjKSAgICAgICAgKChfcmMpICYgMHhmKQorI2RlZmluZSBIVF9SQ18yX1NUUkVBTVNfMTFBQyhfcmMpICAgICgoKChfcmMpICYgMHgzMCkgPj4gNCkgKyAxKQorCisjZGVmaW5lIFNBUF8yNEdIWl9DSF9DT1VOVCAoMTQpCisjZGVmaW5lIEFDU19TQ0FOX0VYUElSWV9USU1FT1VUX1MgNAorI2RlZmluZSBDT05ORUNUSU9OX1VQREFURV9USU1FT1VUIDUwMAorCisjZGVmaW5lIERVTVBfRFBfVFJBQ0UgICAgICAgMAorCisvKiBGdW5jdGlvbiBkZWZpbml0aW9ucyAqLworCisvKioKKyAqIGhkZF9ob3N0YXBkX2NoYW5uZWxfd2FrZWxvY2tfaW5pdCgpIC0gaW5pdCB0aGUgY2hhbm5lbCB3YWtlbG9jaworICogQHBIZGRDdHg6IHBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBoZGRfaG9zdGFwZF9jaGFubmVsX3dha2Vsb2NrX2luaXQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKwkvKiBJbml0aWFsaXplIHRoZSB3YWtlbG9jayAqLworCWNkZl93YWtlX2xvY2tfaW5pdCgmcEhkZEN0eC0+c2FwX2Rmc193YWtlbG9jaywgInNhcF9kZnNfd2FrZWxvY2siKTsKKwlhdG9taWNfc2V0KCZwSGRkQ3R4LT5zYXBfZGZzX3JlZl9jbnQsIDApOworfQorCisvKioKKyAqIGhkZF9ob3N0YXBkX2NoYW5uZWxfYWxsb3dfc3VzcGVuZCgpIC0gYWxsb3cgc3VzcGVuZCBpbiBhIGNoYW5uZWwuCisgKiBDYWxsZWQgd2hlbiwgMS4gYnNzIHN0b3BwZWQsIDIuIGNoYW5uZWwgc3dpdGNoCisgKgorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGhkZCBhZGFwdGVyCisgKiBAY2hhbm5lbDogY3VycmVudCBjaGFubmVsCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgaGRkX2hvc3RhcGRfY2hhbm5lbF9hbGxvd19zdXNwZW5kKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgICAgICB1aW50OF90IGNoYW5uZWwpCit7CisKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKikgKHBBZGFwdGVyLT5wSGRkQ3R4KTsKKwloZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlID0KKwkJV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisJaGRkTG9nKExPRzEsIEZMKCJic3NTdGF0ZTogJWQsIGNoYW5uZWw6ICVkLCBkZnNfcmVmX2NudDogJWQiKSwKKwkgICAgICAgcEhvc3RhcGRTdGF0ZS0+YnNzU3RhdGUsIGNoYW5uZWwsCisJICAgICAgIGF0b21pY19yZWFkKCZwSGRkQ3R4LT5zYXBfZGZzX3JlZl9jbnQpKTsKKworCS8qIFJldHVybiBpZiBCU1MgaXMgYWxyZWFkeSBzdG9wcGVkICovCisJaWYgKHBIb3N0YXBkU3RhdGUtPmJzc1N0YXRlID09IEJTU19TVE9QKQorCQlyZXR1cm47CisKKwkvKiBSZWxlYXNlIHdha2Vsb2NrIHdoZW4gbm8gbW9yZSBERlMgY2hhbm5lbHMgYXJlIHVzZWQgKi8KKwlpZiAoQ0hBTk5FTF9TVEFURV9ERlMgPT0gY2RzX2dldF9jaGFubmVsX3N0YXRlKGNoYW5uZWwpKSB7CisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwSGRkQ3R4LT5zYXBfZGZzX3JlZl9jbnQpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIkRGUzogYWxsb3dpbmcgc3VzcGVuZCAoY2hhbiAlZCkiKSwKKwkJCSAgICAgICBjaGFubmVsKTsKKwkJCWNkZl93YWtlX2xvY2tfcmVsZWFzZSgmcEhkZEN0eC0+c2FwX2Rmc193YWtlbG9jaywKKwkJCQkJICAgICAgV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19ERlMpOworCQl9CisJfQorfQorCisvKioKKyAqIGhkZF9ob3N0YXBkX2NoYW5uZWxfcHJldmVudF9zdXNwZW5kKCkgLSBwcmV2ZW50IHN1c3BlbmQgaW4gYSBjaGFubmVsLgorICogQ2FsbGVkIHdoZW4sIDEuIGJzcyBzdGFydGVkLCAyLiBjaGFubmVsIHN3aXRjaAorICoKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBoZGQgYWRhcHRlcgorICogQGNoYW5uZWw6IGN1cnJlbnQgY2hhbm5lbAorICoKKyAqIFJldHVybiAtIE5vbmUKKyAqLwordm9pZCBoZGRfaG9zdGFwZF9jaGFubmVsX3ByZXZlbnRfc3VzcGVuZChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJIHVpbnQ4X3QgY2hhbm5lbCkKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKikgKHBBZGFwdGVyLT5wSGRkQ3R4KTsKKwloZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlID0KKwkJV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisJaGRkTG9nKExPRzEsIEZMKCJic3NTdGF0ZTogJWQsIGNoYW5uZWw6ICVkLCBkZnNfcmVmX2NudDogJWQiKSwKKwkgICAgICAgcEhvc3RhcGRTdGF0ZS0+YnNzU3RhdGUsIGNoYW5uZWwsCisJICAgICAgIGF0b21pY19yZWFkKCZwSGRkQ3R4LT5zYXBfZGZzX3JlZl9jbnQpKTsKKworCS8qIFJldHVybiBpZiBCU1MgaXMgYWxyZWFkeSBzdGFydGVkICYmIHdha2Vsb2NrIGlzIGFjcXVpcmVkICovCisJaWYgKChwSG9zdGFwZFN0YXRlLT5ic3NTdGF0ZSA9PSBCU1NfU1RBUlQpICYmCisJCShhdG9taWNfcmVhZCgmcEhkZEN0eC0+c2FwX2Rmc19yZWZfY250KSA+PSAxKSkKKwkJcmV0dXJuOworCisJLyogQWNxdWlyZSB3YWtlbG9jayBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBERlMgY2hhbm5lbCBpbiB1c2UgKi8KKwlpZiAoQ0hBTk5FTF9TVEFURV9ERlMgPT0gY2RzX2dldF9jaGFubmVsX3N0YXRlKGNoYW5uZWwpKSB7CisJCWlmIChhdG9taWNfaW5jX3JldHVybigmcEhkZEN0eC0+c2FwX2Rmc19yZWZfY250KSA9PSAxKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIkRGUzogcHJldmVudGluZyBzdXNwZW5kIChjaGFuICVkKSIpLAorCQkJICAgICAgIGNoYW5uZWwpOworCQkJY2RmX3dha2VfbG9ja19hY3F1aXJlKCZwSGRkQ3R4LT5zYXBfZGZzX3dha2Vsb2NrLAorCQkJCQkgICAgICBXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX0RGUyk7CisJCX0KKwl9Cit9CisKKy8qKgorICogaGRkX2hvc3RhcGRfY2hhbm5lbF93YWtlbG9ja19kZWluaXQoKSAtIGRlc3Ryb3kgdGhlIGNoYW5uZWwgd2FrZWxvY2sKKyAqCisgKiBAcEhkZEN0eDogcG9pbnRlciB0byBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGhkZF9ob3N0YXBkX2NoYW5uZWxfd2FrZWxvY2tfZGVpbml0KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisJaWYgKGF0b21pY19yZWFkKCZwSGRkQ3R4LT5zYXBfZGZzX3JlZl9jbnQpKSB7CisJCS8qIFJlbGVhc2Ugd2FrZWxvY2sgKi8KKwkJY2RmX3dha2VfbG9ja19yZWxlYXNlKCZwSGRkQ3R4LT5zYXBfZGZzX3dha2Vsb2NrLAorCQkJCSAgICAgIFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfRFJJVkVSX0VYSVQpOworCQkvKiBSZXNldCB0aGUgcmVmZXJlbmNlIGNvdW50ICovCisJCWF0b21pY19zZXQoJnBIZGRDdHgtPnNhcF9kZnNfcmVmX2NudCwgMCk7CisJCWhkZExvZyhMT0dFLCBGTCgiREZTOiBhbGxvd2luZyBzdXNwZW5kIikpOworCX0KKworCS8qIERlc3Ryb3kgbG9jayAqLworCWNkZl93YWtlX2xvY2tfZGVzdHJveSgmcEhkZEN0eC0+c2FwX2Rmc193YWtlbG9jayk7Cit9CisKKy8qKgorICogX19oZGRfaG9zdGFwZF9vcGVuKCkgLSBoZGQgb3BlbiBmdW5jdGlvbiBmb3IgaG9zdGFwZCBpbnRlcmZhY2UKKyAqIFRoaXMgaXMgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGlmY29uZmlnIHVwCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJuIC0gMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9faGRkX2hvc3RhcGRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCUVOVEVSKCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX0hPU1RBUERfT1BFTl9SRVFVRVNULCBOT19TRVNTSU9OLCAwKSk7CisKKwlpZiAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlciktPmlzTG9hZEluUHJvZ3Jlc3MgfHwKKwkJV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlciktPmlzVW5sb2FkSW5Qcm9ncmVzcykgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJEcml2ZXIgbG9hZC91bmxvYWQgaW4gcHJvZ3Jlc3MsIGlnbm9yZSBhZGFwdGVyIG9wZW4iKSk7CisJCWdvdG8gZG9uZTsKKwl9CisJLyogRW5hYmxlIGFsbCBUeCBxdWV1ZXMgKi8KKwloZGRMb2coTE9HMSwgRkwoIkVuYWJsaW5nIHF1ZXVlcyIpKTsKKwl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLAorCQkJCSAgIFdMQU5fU1RBUlRfQUxMX05FVElGX1FVRVVFX05fQ0FSUklFUiwKKwkJCQkgICBXTEFOX0NPTlRST0xfUEFUSCk7Citkb25lOgorCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfaG9zdGFwZF9vcGVuKCkgLSBTU1Igd3JhcHBlciBmb3IgX19oZGRfaG9zdGFwZF9vcGVuCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldCBkZXZpY2UKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGhkZF9ob3N0YXBkX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2hkZF9ob3N0YXBkX29wZW4oZGV2KTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faGRkX2hvc3RhcGRfc3RvcCgpIC0gaGRkIHN0b3AgZnVuY3Rpb24gZm9yIGhvc3RhcGQgaW50ZXJmYWNlCisgKiBUaGlzIGlzIGNhbGxlZCBpbiByZXNwb25zZSB0byBpZmNvbmZpZyBkb3duCisgKgorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiAtIDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX2hkZF9ob3N0YXBkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJRU5URVIoKTsKKworCS8qIFN0b3AgYWxsIHR4IHF1ZXVlcyAqLworCWhkZExvZyhMT0cxLCBGTCgiRGlzYWJsaW5nIHF1ZXVlcyIpKTsKKwl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKGFkYXB0ZXIsIFdMQU5fTkVUSUZfVFhfRElTQUJMRV9OX0NBUlJJRVIsCisJCQkJICAgV0xBTl9DT05UUk9MX1BBVEgpOworCisJRVhJVCgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9ob3N0YXBkX3N0b3AoKSAtIFNTUiB3cmFwcGVyIGZvcl9faGRkX2hvc3RhcGRfc3RvcAorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKgorICogVGhpcyBpcyBjYWxsZWQgaW4gcmVzcG9uc2UgdG8gaWZjb25maWcgZG93bgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK2ludCBoZGRfaG9zdGFwZF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19oZGRfaG9zdGFwZF9zdG9wKGRldik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2hkZF9ob3N0YXBkX3VuaW5pdCgpIC0gaGRkIHVuaW5pdCBmdW5jdGlvbgorICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBuZXRkZXYgdW5yZWdpc3RlciB0byB1bmluaXRpYWxpemUgYWxsIGRhdGEKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgX19oZGRfaG9zdGFwZF91bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCisJRU5URVIoKTsKKworCWlmIChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IGFkYXB0ZXItPm1hZ2ljKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBtYWdpYyIpKTsKKwkJcmV0dXJuOworCX0KKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCWlmIChOVUxMID09IGhkZF9jdHgpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJOVUxMIGhkZF9jdHgiKSk7CisJCXJldHVybjsKKwl9CisKKwloZGRfZGVpbml0X2FkYXB0ZXIoaGRkX2N0eCwgYWRhcHRlciwgdHJ1ZSk7CisKKwkvKiBhZnRlciB1bmluaXQgb3VyIGFkYXB0ZXIgc3RydWN0dXJlIHdpbGwgbm8gbG9uZ2VyIGJlIHZhbGlkICovCisJYWRhcHRlci0+ZGV2ID0gTlVMTDsKKwlhZGFwdGVyLT5tYWdpYyA9IDA7CisKKwlFWElUKCk7Cit9CisKKy8qKgorICogaGRkX2hvc3RhcGRfdW5pbml0KCkgLSBTU1Igd3JhcHBlciBmb3IgX19oZGRfaG9zdGFwZF91bmluaXQKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9ob3N0YXBkX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJX19oZGRfaG9zdGFwZF91bmluaXQoZGV2KTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7Cit9CisKKy8qKgorICogX19oZGRfaG9zdGFwZF9jaGFuZ2VfbXR1KCkgLSBjaGFuZ2UgbXR1CisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBuZXdfbXR1OiBuZXcgbXR1CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBfX2hkZF9ob3N0YXBkX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX2hvc3RhcGRfY2hhbmdlX210dSgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faGRkX2hvc3RhcGRfY2hhbmdlX210dQorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAbmV3X210dTogbmV3IG10dQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaGRkX2hvc3RhcGRfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2hkZF9ob3N0YXBkX2NoYW5nZV9tdHUoZGV2LCBuZXdfbXR1KTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgUUNBX0hUXzIwNDBfQ09FWAorQ0RGX1NUQVRVUyBoZGRfc2V0X3NhcF9odDIwNDBfbW9kZShoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIsCisJCQkJICAgdWludDhfdCBjaGFubmVsX3R5cGUpCit7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXZvaWQgKmhIYWwgPSBOVUxMOworCisJaGRkTG9nKExPR0UsIEZMKCJjaGFuZ2UgSFQyMC80MCBtb2RlIikpOworCisJaWYgKFdMQU5fSEREX1NPRlRBUCA9PSBwSG9zdGFwZEFkYXB0ZXItPmRldmljZV9tb2RlKSB7CisJCWhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCQlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIkhhbCBjdHggaXMgbnVsbCIpKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKwkJY2RmX3JldF9zdGF0dXMgPQorCQkJc21lX3NldF9odDIwNDBfbW9kZShoSGFsLCBwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJY2hhbm5lbF90eXBlLCB0cnVlKTsKKwkJaWYgKGNkZl9yZXRfc3RhdHVzID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBjaGFuZ2UgSFQyMC80MCBtb2RlIikpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworLyoqCisgKiBfX2hkZF9ob3N0YXBkX3NldF9tYWNfYWRkcmVzcygpIC0KKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbWFjIGFkZHJlc3MgdXNpbmcKKyAqIHRoZSBjb21tYW5kIGlmY29uZmlnIHdsYW5YIGh3IGV0aGVyIDxtYWMgYWRkcmVzcz4uCisgKgorICogQGRldjogcG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAqIEBhZGRyOiBwb2ludGVyIHRvIHRoZSBzb2NrYWRkci4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX19oZGRfaG9zdGFwZF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnBzdGFfbWFjX2FkZHIgPSBhZGRyOworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlhZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgcHN0YV9tYWNfYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfaG9zdGFwZF9zZXRfbWFjX2FkZHJlc3MoKSAtIHNldCBtYWMgYWRkcmVzcworICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAYWRkcjogbWFjIGFkZHJlc3MKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGhkZF9ob3N0YXBkX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faGRkX2hvc3RhcGRfc2V0X21hY19hZGRyZXNzKGRldiwgYWRkcik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBoZGRfaG9zdGFwZF9pbmFjdGl2aXR5X3RpbWVyX2NiKHZvaWQgKnVzckRhdGFGb3JDYWxsYmFjaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopdXNyRGF0YUZvckNhbGxiYWNrOworCXVpbnQ4X3Qgd2VfY3VzdG9tX2V2ZW50WzY0XTsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisjaWZkZWYgRElTQUJMRV9DT05DVVJSRU5DWV9BVVRPU0FWRQorCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwloZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXI7CisJaGRkX2FwX2N0eF90ICpwSGRkQXBDdHg7CisjZW5kaWYgLyogRElTQUJMRV9DT05DVVJSRU5DWV9BVVRPU0FWRSAqLworCisJLyogZXZlbnRfbmFtZSBzcGFjZS1kZWxpbWl0ZXIgZHJpdmVyX21vZHVsZV9uYW1lCisJICogRm9ybWF0IG9mIHRoZSBldmVudCBpcyAiQVVUTy1TSFVULmluZGljYXRpb24iICIgIiAibW9kdWxlX25hbWUiCisJICovCisJY2hhciAqYXV0b1NodXRFdmVudCA9ICJBVVRPLVNIVVQuaW5kaWNhdGlvbiIgIiAiIEtCVUlMRF9NT0ROQU1FOworCisJLyogRm9yIHRoZSBOVUxMIGF0IHRoZSBlbmQgKi8KKwlpbnQgZXZlbnRfbGVuID0gc3RybGVuKGF1dG9TaHV0RXZlbnQpICsgMTsKKworCUVOVEVSKCk7CisKKyNpZmRlZiBESVNBQkxFX0NPTkNVUlJFTkNZX0FVVE9TQVZFCisJaWYgKGNkc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSB7CisJCS8qCisJCSAqIFRoaXMgdGltZXIgcm91dGluZSBpcyBnb2luZyB0byBiZSBjYWxsZWQgb25seSB3aGVuIEFQCisJCSAqIHBlcnNvbmEgaXMgdXAuCisJCSAqIElmIHRoZXJlIGFyZSBjb25jdXJyZW50IHNlc3Npb25zIHJ1bm5pbmcgd2UgZG8gbm90IHdhbnQKKwkJICogdG8gc2h1dCBkb3duIHRoZSBCc3MuSW5zdGVhZCB3ZSBydW4gdGhlIHRpbWVyIGFnYWluIHNvCisJCSAqIHRoYXQgaWYgQXV0b3NhdmUgaXMgZW5hYmxlZCBuZXh0IHRpbWUgYW5kIG90aGVyIHNlc3Npb24KKwkJICAgd2FzIGRvd24gb25seSB0aGVuIHdlIGJyaW5nIGRvd24gQVAKKwkJICovCisJCXBIb3N0YXBkQWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJCXBIZGRBcEN0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcik7CisJCWNkZl9zdGF0dXMgPQorCQkJY2RmX21jX3RpbWVyX3N0YXJ0KCZwSGRkQXBDdHgtPmhkZF9hcF9pbmFjdGl2aXR5X3RpbWVyLAorCQkJCQkoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+CisJCQkJCWNvbmZpZy0+bkFQQXV0b1NodXRPZmYgKiAxMDAwKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkIHRvIGluaXQgQVAgaW5hY3Rpdml0eSB0aW1lciIpKTsKKwkJfQorCQlFWElUKCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLyogRElTQUJMRV9DT05DVVJSRU5DWV9BVVRPU0FWRSAqLworCW1lbXNldCgmd2VfY3VzdG9tX2V2ZW50LCAnXDAnLCBzaXplb2Yod2VfY3VzdG9tX2V2ZW50KSk7CisJbWVtY3B5KCZ3ZV9jdXN0b21fZXZlbnQsIGF1dG9TaHV0RXZlbnQsIGV2ZW50X2xlbik7CisKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJd3JxdS5kYXRhLmxlbmd0aCA9IGV2ZW50X2xlbjsKKworCWhkZExvZyhMT0cxLCBGTCgiU2h1dHRpbmcgZG93biBBUCBpbnRlcmZhY2UgZHVlIHRvIGluYWN0aXZpdHkiKSk7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZDVVNUT00sICZ3cnF1LCAoY2hhciAqKXdlX2N1c3RvbV9ldmVudCk7CisKKwlFWElUKCk7Cit9CisKK3ZvaWQgaGRkX2NsZWFyX2FsbF9zdGEoaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyLAorCQkgICAgICAgdm9pZCAqdXNyRGF0YUZvckNhbGxiYWNrKQoreworCXVpbnQ4X3Qgc3RhSWQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopdXNyRGF0YUZvckNhbGxiYWNrOworCisJaGRkTG9nKExPR0UsIEZMKCJDbGVhcmluZyBhbGwgdGhlIFNUQSBlbnRyeS4uLi4iKSk7CisJZm9yIChzdGFJZCA9IDA7IHN0YUlkIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBzdGFJZCsrKSB7CisJCWlmIChwSG9zdGFwZEFkYXB0ZXItPmFTdGFJbmZvW3N0YUlkXS5pc1VzZWQgJiYKKwkJICAgIChzdGFJZCAhPQorCQkgICAgIChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpKS0+dUJDU3RhSWQpKSB7CisJCQkvKiBEaXNjb25uZWN0IGFsbCB0aGUgc3RhdGlvbnMgKi8KKwkJCWhkZF9zb2Z0YXBfc3RhX2Rpc2Fzc29jKHBIb3N0YXBkQWRhcHRlciwKKwkJCQkJCSZwSG9zdGFwZEFkYXB0ZXItPgorCQkJCQkJYVN0YUluZm9bc3RhSWRdLm1hY0FkZHJTVEEuCisJCQkJCQlieXRlc1swXSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaGRkX3N0b3BfYnNzX2xpbmsoaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyLAorCQkJICAgICB2b2lkICp1c3JEYXRhRm9yQ2FsbGJhY2spCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKil1c3JEYXRhRm9yQ2FsbGJhY2s7CisJRU5URVIoKTsKKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAodGVzdF9iaXQoU09GVEFQX0JTU19TVEFSVEVELCAmcEhvc3RhcGRBZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJCXN0YXR1cyA9CisJCQl3bGFuc2FwX3N0b3BfYnNzKFdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUigKKwkJCQkJIHBIb3N0YXBkQWRhcHRlcikpOworI2Vsc2UKKwkJc3RhdHVzID0KKwkJCXdsYW5zYXBfc3RvcF9ic3MoKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPgorCQkJCQkgcGNkc19jb250ZXh0KTsKKyNlbmRpZgorCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQloZGRMb2coTE9HRSwgRkwoIkRlbGV0aW5nIFNBUC9QMlAgbGluayEhISEhISIpKTsKKworCQljbGVhcl9iaXQoU09GVEFQX0JTU19TVEFSVEVELCAmcEhvc3RhcGRBZGFwdGVyLT5ldmVudF9mbGFncyk7CisJCWNkc19kZWNyX3Nlc3Npb25fc2V0X3BjbChwSGRkQ3R4LAorCQkJCQkgICAgIHBIb3N0YXBkQWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJCSAgICAgcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQpOworCX0KKwlFWElUKCk7CisJcmV0dXJuIChzdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSA/IDAgOiAtRUJVU1k7Cit9CisKKy8qKgorICogaGRkX2lzc3VlX3N0b3JlZF9qb2lucmVxKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJpZ2dlciBzdGF0aW9ucydzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZCBjb25uZWN0IHJlcXVlc3QgdG8gcHJvY2VlZC4KKyAqIEBoZGRfY3R4OiBwb2ludGVyIHRvIGhkZCBjb250ZXh0LgorICogQHN0YV9hZGF0ZXI6IHBvaW50ZXIgdG8gc3RhdGlvbiBhZGFwdGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIFNNRSB0byByZWxlYXNlIHN0YXRpb24ncyBzdG9yZWQvY2FjaGVkIGNvbm5lY3QKKyAqIHJlcXVlc3QgdG8gcHJvY2VlZC4KKyAqCisgKiBSZXR1cm46IG5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pc3N1ZV9zdG9yZWRfam9pbnJlcShoZGRfYWRhcHRlcl90ICpzdGFfYWRhcHRlciwKKwkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwl0SGFsSGFuZGxlIGhhbF9oYW5kbGU7CisJdWludDMyX3Qgcm9hbV9pZDsKKworCWlmIChOVUxMID09IHN0YV9hZGFwdGVyKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwKKwkJCSgiSW52YWxpZCBzdGF0aW9uIGFkYXB0ZXIsIGlnbm9yZSBpc3N1ZWluZyBqb2luIHJlcSIpKTsKKwkJcmV0dXJuOworCX0KKwloYWxfaGFuZGxlID0gV0xBTl9IRERfR0VUX0hBTF9DVFgoc3RhX2FkYXB0ZXIpOworCisJaWYgKHRydWUgPT0gIGNkc19pc19zdGFfY29ubmVjdGlvbl9wZW5kaW5nKGhkZF9jdHgpKSB7CisJCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJVFJBQ0VfQ09ERV9IRERfSVNTVUVfSk9JTl9SRVEsCisJCQkJc3RhX2FkYXB0ZXItPnNlc3Npb25JZCwgcm9hbV9pZCkpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCQlzbWVfaXNzdWVfc3RvcmVkX2pvaW5yZXEoaGFsX2hhbmRsZSwKKwkJCQkmcm9hbV9pZCwKKwkJCQlzdGFfYWRhcHRlci0+c2Vzc2lvbklkKSkgeworCQkJLyogY2hhbmdlIGJhY2sgdG8gTm90QXNzb2NpYXRlZCAqLworCQkJaGRkX2Nvbm5fc2V0X2Nvbm5lY3Rpb25fc3RhdGUoc3RhX2FkYXB0ZXIsCisJCQkJZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQpOworCQl9CisJCWNkc19jaGFuZ2Vfc3RhX2Nvbm5fcGVuZGluZ19zdGF0dXMoaGRkX2N0eCwgZmFsc2UpOworCX0KK30KKworLyoqCisgKiBoZGRfY2hhbl9jaGFuZ2Vfbm90aWZ5KCkgLSBGdW5jdGlvbiB0byBub3RpZnkgaG9zdGFwZCBhYm91dCBjaGFubmVsIGNoYW5nZQorICogQGhvc3RhcGRfYWRhcHRlcglob3N0YXBkIGFkYXB0ZXIKKyAqIEBkZXY6CQlOZXQgZGV2aWNlIHN0cnVjdHVyZQorICogQG9wZXJfY2hhbjoJCU5ldyBvcGVyYXRpbmcgY2hhbm5lbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBub3RpZnkgaG9zdGFwZCBhYm91dCB0aGUgY2hhbm5lbCBjaGFuZ2UKKyAqCisgKiBSZXR1cm46IFN1Y2Nlc3Mgb24gaW50aW1hdGluZyB1c2Vyc3BhY2UKKyAqCisgKi8KK0NERl9TVEFUVVMgaGRkX2NoYW5fY2hhbmdlX25vdGlmeShoZGRfYWRhcHRlcl90ICpob3N0YXBkX2FkYXB0ZXIsCisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXVpbnQ4X3Qgb3Blcl9jaGFuKQoreworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgY2hhbmRlZjsKKwllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZTsKKwllQ3NyUGh5TW9kZSBwaHlfbW9kZTsKKwllUGh5Q2hhbkJvbmRTdGF0ZSBjYl9tb2RlOworCXVpbnQzMl90IGZyZXE7CisJdEhhbEhhbmRsZSAgaGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgoaG9zdGFwZF9hZGFwdGVyKTsKKworCWlmIChOVUxMID09IGhhbCkgeworCQloZGRfZXJyKCJoYWwgaXMgTlVMTCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJZnJlcSA9IGNkc19jaGFuX3RvX2ZyZXEob3Blcl9jaGFuKTsKKworCWNoYW4gPSBfX2llZWU4MDIxMV9nZXRfY2hhbm5lbChob3N0YXBkX2FkYXB0ZXItPndkZXYud2lwaHksIGZyZXEpOworCisJaWYgKCFjaGFuKSB7CisJCWhkZF9lcnIoIkludmFsaWQgaW5wdXQgZnJlcXVlbmN5IGZvciBjaGFubmVsIGNvbnZlcnNpb24iKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBoeV9tb2RlID0gc21lX2dldF9waHlfbW9kZShoYWwpOworCisJaWYgKG9wZXJfY2hhbiA8PSAxNCkKKwkJY2JfbW9kZSA9IHNtZV9nZXRfY2JfcGh5X3N0YXRlX2Zyb21fY2JfaW5pX3ZhbHVlKAorCQkJCXNtZV9nZXRfY2hhbm5lbF9ib25kaW5nX21vZGUyNF9nKGhhbCkpOworCWVsc2UKKwkJY2JfbW9kZSA9IHNtZV9nZXRfY2JfcGh5X3N0YXRlX2Zyb21fY2JfaW5pX3ZhbHVlKAorCQkJCXNtZV9nZXRfY2hhbm5lbF9ib25kaW5nX21vZGU1X2coaGFsKSk7CisKKwlzd2l0Y2ggKHBoeV9tb2RlKSB7CisJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFuOgorCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExbl9PTkxZOgorCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYWM6CisJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFhY19PTkxZOgorCQlpZiAoY2JfbW9kZSA9PSBQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQpCisJCQljaGFubmVsX3R5cGUgPSBOTDgwMjExX0NIQU5fSFQyMDsKKwkJZWxzZSBpZiAoY2JfbW9kZSA9PSBQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZKQorCQkJY2hhbm5lbF90eXBlID0gTkw4MDIxMV9DSEFOX0hUNDBNSU5VUzsKKwkJZWxzZSBpZiAoY2JfbW9kZSA9PSBQSFlfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlkpCisJCQljaGFubmVsX3R5cGUgPSBOTDgwMjExX0NIQU5fSFQ0MFBMVVM7CisJCWVsc2UKKwkJCWNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9IVDQwUExVUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2hhbm5lbF90eXBlID0gTkw4MDIxMV9DSEFOX05PX0hUOworCQlicmVhazsKKwl9CisKKwljZmc4MDIxMV9jaGFuZGVmX2NyZWF0ZSgmY2hhbmRlZiwgY2hhbiwgY2hhbm5lbF90eXBlKTsKKworCWNmZzgwMjExX2NoX3N3aXRjaF9ub3RpZnkoZGV2LCAmY2hhbmRlZik7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGhkZF9zZW5kX3JhZGFyX2V2ZW50KCkgLSBGdW5jdGlvbiB0byBzZW5kIHJhZGFyIGV2ZW50cyB0byB1c2VyIHNwYWNlCisgKiBAaGRkX2NvbnRleHQ6CUhERCBjb250ZXh0CisgKiBAZXZlbnQ6CQlUeXBlIG9mIHJhZGFyIGV2ZW50CisgKiBAZGZzX2luZm86CQlTdHJ1Y3R1cmUgY29udGFpbmluZyBERlMgY2hhbm5lbCBhbmQgY291bnRyeQorICogQHdkZXY6CQlXaXJlbGVzcyBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgcmFkYXIgZXZlbnRzIHN1Y2ggYXMgQ0FDIHN0YXJ0LCBDQUMKKyAqIGVuZCBldGMuLCB0byB1c2Vyc3BhY2UKKyAqCisgKiBSZXR1cm46IFN1Y2Nlc3Mgb24gc2VuZGluZyBub3RpZnlpbmcgdXNlcnNwYWNlCisgKgorICovCitDREZfU1RBVFVTIGhkZF9zZW5kX3JhZGFyX2V2ZW50KGhkZF9jb250ZXh0X3QgKmhkZF9jb250ZXh0LAorCQllU2FwSGRkRXZlbnQgZXZlbnQsCisJCXN0cnVjdCB3bGFuX2Rmc19pbmZvIGRmc19pbmZvLAorCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQoreworCisJc3RydWN0IHNrX2J1ZmYgKnZlbmRvcl9ldmVudDsKKwllbnVtIHFjYV9ubDgwMjExX3ZlbmRvcl9zdWJjbWRzX2luZGV4IGluZGV4OworCXVpbnQzMl90IGZyZXEsIHJldDsKKwl1aW50MzJfdCBkYXRhX3NpemU7CisKKwlpZiAoIWhkZF9jb250ZXh0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWZyZXEgPSBjZHNfY2hhbl90b19mcmVxKGRmc19pbmZvLmNoYW5uZWwpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgZVNBUF9ERlNfQ0FDX1NUQVJUOgorCQlpbmRleCA9CisJCSAgICBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RGU19PRkZMT0FEX0NBQ19TVEFSVEVEX0lOREVYOworCQlkYXRhX3NpemUgPSBzaXplb2YodWludDMyX3QpOworCQlicmVhazsKKwljYXNlIGVTQVBfREZTX0NBQ19FTkQ6CisJCWluZGV4ID0KKwkJICAgIFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfREZTX09GRkxPQURfQ0FDX0ZJTklTSEVEX0lOREVYOworCQlkYXRhX3NpemUgPSBzaXplb2YodWludDMyX3QpOworCQlicmVhazsKKwljYXNlIGVTQVBfREZTX1JBREFSX0RFVEVDVDoKKwkJaW5kZXggPQorCQkgICAgUUNBX05MODAyMTFfVkVORE9SX1NVQkNNRF9ERlNfT0ZGTE9BRF9SQURBUl9ERVRFQ1RFRF9JTkRFWDsKKwkJZGF0YV9zaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXZlbmRvcl9ldmVudCA9IGNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyhoZGRfY29udGV4dC0+d2lwaHksCisJCQl3ZGV2LAorCQkJZGF0YV9zaXplICsgTkxNU0dfSERSTEVOLAorCQkJaW5kZXgsCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXZlbmRvcl9ldmVudCkgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MgZmFpbGVkIGZvciAlZCIpLCBpbmRleCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXQgPSBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsIE5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLCBmcmVxKTsKKworCWlmIChyZXQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSBwdXQgZmFpbCIpKTsKKwkJa2ZyZWVfc2tiKHZlbmRvcl9ldmVudCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQodmVuZG9yX2V2ZW50LCBHRlBfS0VSTkVMKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitDREZfU1RBVFVTIGhkZF9ob3N0YXBkX3NhcF9ldmVudF9jYih0cFNhcF9FdmVudCBwU2FwRXZlbnQsCisJCQkJICAgIHZvaWQgKnVzckRhdGFGb3JDYWxsYmFjaykKK3sKKwloZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXI7CisJaGRkX2FwX2N0eF90ICpwSGRkQXBDdHg7CisJaGRkX2hvc3RhcGRfc3RhdGVfdCAqcEhvc3RhcGRTdGF0ZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWVTYXBIZGRFdmVudCBzYXBFdmVudDsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJdWludDhfdCAqd2VfY3VzdG9tX2V2ZW50X2dlbmVyaWMgPSBOVUxMOworCWludCB3ZV9ldmVudCA9IDA7CisJaW50IGkgPSAwOworCXVpbnQ4X3Qgc3RhSWQ7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCWJvb2wgYldQU1N0YXRlOworCWJvb2wgYkF1dGhSZXF1aXJlZCA9IHRydWU7CisJdHBTYXBfQXNzb2NNYWNBZGRyIHBBc3NvY1N0YXNBcnJheSA9IE5VTEw7CisJY2hhciB1bmtub3duU1RBRXZlbnRbSVdfQ1VTVE9NX01BWCArIDFdOworCWNoYXIgbWF4QXNzb2NFeGNlZWRlZEV2ZW50W0lXX0NVU1RPTV9NQVggKyAxXTsKKwl1aW50OF90IHdlX2N1c3RvbV9zdGFydF9ldmVudFs2NF07CisJY2hhciAqc3RhcnRCc3NFdmVudDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCWhkZF9zY2FuaW5mb190ICpwU2NhbkluZm8gPSBOVUxMOworCXN0cnVjdCBpd19taWNoYWVsbWljZmFpbHVyZSBtc2c7CisJdWludDhfdCBpZ25vcmVDQUMgPSAwOworCXN0cnVjdCBoZGRfY29uZmlnICpjZmcgPSBOVUxMOworCXN0cnVjdCB3bGFuX2Rmc19pbmZvIGRmc19pbmZvOworCXVpbnQ4X3QgY2NfbGVuID0gV0xBTl9TVkNfQ09VTlRSWV9DT0RFX0xFTjsKKwloZGRfYWRhcHRlcl90ICpjb25fc2FwX2FkYXB0ZXI7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisjaWYgZGVmaW5lZCBDT05GSUdfQ05TUworCWludCByZXQgPSAwOworI2VuZGlmCisKKwlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKil1c3JEYXRhRm9yQ2FsbGJhY2s7CisJaWYgKCFkZXYpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJ1c3JEYXRhRm9yQ2FsbGJhY2sgaXMgbnVsbCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBIb3N0YXBkQWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoKE5VTEwgPT0gcEhvc3RhcGRBZGFwdGVyKSB8fAorCSAgICAoV0xBTl9IRERfQURBUFRFUl9NQUdJQyAhPSBwSG9zdGFwZEFkYXB0ZXItPm1hZ2ljKSkgeworCQloZGRMb2coTE9HRSwgImludmFsaWQgYWRhcHRlciBvciBhZGFwdGVyIGhhcyBpbnZhbGlkIG1hZ2ljIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwSG9zdGFwZFN0YXRlID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEhvc3RhcGRBZGFwdGVyKTsKKwlwSGRkQXBDdHggPSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpOworCisJaWYgKCFwU2FwRXZlbnQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwU2FwRXZlbnQgaXMgbnVsbCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXNhcEV2ZW50ID0gcFNhcEV2ZW50LT5zYXBIZGRFdmVudENvZGU7CisJbWVtc2V0KCZ3cnF1LCAnXDAnLCBzaXplb2Yod3JxdSkpOworCXBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKSAocEhvc3RhcGRBZGFwdGVyLT5wSGRkQ3R4KTsKKworCWlmICghcEhkZEN0eCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG51bGwiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZmcgPSBwSGRkQ3R4LT5jb25maWc7CisKKwlpZiAoIWNmZykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb25maWcgaXMgbnVsbCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWRmc19pbmZvLmNoYW5uZWwgPSBwSGRkQXBDdHgtPm9wZXJhdGluZ0NoYW5uZWw7CisJc21lX2dldF9jb3VudHJ5X2NvZGUocEhkZEN0eC0+aEhhbCwgZGZzX2luZm8uY291bnRyeV9jb2RlLCAmY2NfbGVuKTsKKworCXN3aXRjaCAoc2FwRXZlbnQpIHsKKwljYXNlIGVTQVBfU1RBUlRfQlNTX0VWRU5UOgorCQloZGRMb2coTE9HMSwKKwkJICAgICAgIEZMKCJCU1Mgc3RhdHVzID0gJXMsIGNoYW5uZWwgPSAldSwgYmMgc3RhIElkID0gJWQiKSwKKwkJICAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXJ0QnNzQ29tcGxldGVFdmVudC4KKwkJICAgICAgIHN0YXR1cyA/ICJlU0FQX1NUQVRVU19GQUlMVVJFIiA6ICJlU0FQX1NUQVRVU19TVUNDRVNTIiwKKwkJICAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXJ0QnNzQ29tcGxldGVFdmVudC4KKwkJICAgICAgIG9wZXJhdGluZ0NoYW5uZWwsCisJCSAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGFydEJzc0NvbXBsZXRlRXZlbnQuc3RhSWQpOworCisJCXBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkID0KKwkJCXBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXJ0QnNzQ29tcGxldGVFdmVudC5zZXNzaW9uSWQ7CisKKwkJcEhvc3RhcGRTdGF0ZS0+Y2RmX3N0YXR1cyA9CisJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGFydEJzc0NvbXBsZXRlRXZlbnQuc3RhdHVzOworCQljZGZfc3RhdHVzID0gY2RmX2V2ZW50X3NldCgmcEhvc3RhcGRTdGF0ZS0+Y2RmX2V2ZW50KTsKKworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKQorCQkgICAgfHwgcEhvc3RhcGRTdGF0ZS0+Y2RmX3N0YXR1cykgeworCQkJaGRkTG9nKExPR0UsICgiRVJST1I6IHN0YXJ0YnNzIGV2ZW50IGZhaWxlZCEhIikpOworCQkJZ290byBzdG9wYnNzOworCQl9IGVsc2UgeworCQkJc21lX2NoX2F2b2lkX3VwZGF0ZV9yZXEocEhkZEN0eC0+aEhhbCk7CisKKwkJCXBIZGRBcEN0eC0+dUJDU3RhSWQgPQorCQkJCXBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXJ0QnNzQ29tcGxldGVFdmVudC5zdGFJZDsKKworCQkJaGRkX3JlZ2lzdGVyX3R4X2Zsb3dfY29udHJvbChwSG9zdGFwZEFkYXB0ZXIsCisJCQkJaGRkX3NvZnRhcF90eF9yZXN1bWVfdGltZXJfZXhwaXJlZF9oYW5kbGVyLAorCQkJCWhkZF9zb2Z0YXBfdHhfcmVzdW1lX2NiKTsKKworCQkJLyogQEBAIG5lZWQgd2VwIGxvZ2ljIGhlcmUgdG8gc2V0IHByaXZhY3kgYml0ICovCisJCQljZGZfc3RhdHVzID0KKwkJCQloZGRfc29mdGFwX3JlZ2lzdGVyX2JjX3N0YShwSG9zdGFwZEFkYXB0ZXIsCisJCQkJCQkJICAgcEhkZEFwQ3R4LT51UHJpdmFjeSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJCWhkZExvZyhMT0dXLCBGTCgiRmFpbGVkIHRvIHJlZ2lzdGVyIEJDIFNUQSAlZCIpLAorCQkJCSAgICAgICBjZGZfc3RhdHVzKTsKKwkJCQloZGRfc3RvcF9ic3NfbGluayhwSG9zdGFwZEFkYXB0ZXIsCisJCQkJCQkgIHVzckRhdGFGb3JDYWxsYmFjayk7CisJCQl9CisJCX0KKworCQlpZiAoaGRkX2lwYV9pc19lbmFibGVkKHBIZGRDdHgpKSB7CisJCQlzdGF0dXMgPSBoZGRfaXBhX3dsYW5fZXZ0KHBIb3N0YXBkQWRhcHRlciwKKwkJCQkJcEhkZEFwQ3R4LT51QkNTdGFJZCwKKwkJCQkJV0xBTl9BUF9DT05ORUNULAorCQkJCQlwSG9zdGFwZEFkYXB0ZXItPmRldi0+ZGV2X2FkZHIpOworCQkJaWYgKHN0YXR1cykgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCQkoIldMQU5fQVBfQ09OTkVDVCBldmVudCBmYWlsZWQhISIpKTsKKwkJCQlnb3RvIHN0b3Bic3M7CisJCQl9CisJCX0KKworCQlpZiAoMCAhPQorCQkgICAgKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPmNvbmZpZy0+CisJCSAgICAgbkFQQXV0b1NodXRPZmYpIHsKKwkJCS8qIEFQIEluYWN0aXZpdHkgdGltZXIgaW5pdCBhbmQgc3RhcnQgKi8KKwkJCWNkZl9zdGF0dXMgPQorCQkJCWNkZl9tY190aW1lcl9pbml0KCZwSGRkQXBDdHgtPgorCQkJCQkJICBoZGRfYXBfaW5hY3Rpdml0eV90aW1lciwKKwkJCQkJCSAgQ0RGX1RJTUVSX1RZUEVfU1csCisJCQkJCQkgIGhkZF9ob3N0YXBkX2luYWN0aXZpdHlfdGltZXJfY2IsCisJCQkJCQkgIGRldik7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJRkwoIkZhaWxlZCB0byBpbml0IGluYWN0aXZpdHkgdGltZXIiKSk7CisKKwkJCWNkZl9zdGF0dXMgPQorCQkJCWNkZl9tY190aW1lcl9zdGFydCgmcEhkZEFwQ3R4LT4KKwkJCQkJCSAgIGhkZF9hcF9pbmFjdGl2aXR5X3RpbWVyLAorCQkJCQkJICAgKFdMQU5fSEREX0dFVF9DVFgKKwkJCQkJCSAgICAocEhvc3RhcGRBZGFwdGVyKSktPmNvbmZpZy0+CisJCQkJCQkgICAgbkFQQXV0b1NodXRPZmYgKiAxMDAwKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJCWhkZExvZyhMT0dFLAorCQkJCQlGTCgiRmFpbGVkIHRvIGluaXQgaW5hY3Rpdml0eSB0aW1lciIpKTsKKworCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKwkJd2xhbl9oZGRfYXV0b19zaHV0ZG93bl9lbmFibGUocEhkZEN0eCwgdHJ1ZSk7CisjZW5kaWYKKwkJcEhkZEFwQ3R4LT5vcGVyYXRpbmdDaGFubmVsID0KKwkJCXBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXJ0QnNzQ29tcGxldGVFdmVudC5vcGVyYXRpbmdDaGFubmVsOworCisJCWhkZF9ob3N0YXBkX2NoYW5uZWxfcHJldmVudF9zdXNwZW5kKHBIb3N0YXBkQWRhcHRlciwKKwkJCQkJCSAgICBwSGRkQXBDdHgtPgorCQkJCQkJICAgIG9wZXJhdGluZ0NoYW5uZWwpOworCisJCXBIb3N0YXBkU3RhdGUtPmJzc1N0YXRlID0gQlNTX1NUQVJUOworCQloZGRfd2xhbl9ncmVlbl9hcF9zdGFydF9ic3MocEhkZEN0eCk7CisKKwkJLyogU2V0IGdyb3VwIGtleSAvIFdFUCBrZXkgZXZlcnkgdGltZSB3aGVuIEJTUyBpcyByZXN0YXJ0ZWQgKi8KKwkJaWYgKHBIZGRBcEN0eC0+Z3JvdXBLZXkua2V5TGVuZ3RoKSB7CisJCQlzdGF0dXMgPSB3bGFuc2FwX3NldF9rZXlfc3RhKAorI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJCQlXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIKKwkJCQkJKHBIb3N0YXBkQWRhcHRlciksCisjZWxzZQorCQkJCShXTEFOX0hERF9HRVRfQ1RYCisJCQkJCSAocEhvc3RhcGRBZGFwdGVyKSktPgorCQkJCXBjZHNfY29udGV4dCwKKyNlbmRpZgorCQkJCSZwSGRkQXBDdHgtPmdyb3VwS2V5KTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQkJaGRkTG9nKExPR0UsIEZMKCJ3bGFuc2FwX3NldF9rZXlfc3RhIGZhaWxlZCIpKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBDU1JfTUFYX05VTV9LRVk7IGkrKykgeworCQkJCWlmICghcEhkZEFwQ3R4LT53ZXBLZXlbaV0ua2V5TGVuZ3RoKQorCQkJCQljb250aW51ZTsKKworCQkJCXN0YXR1cyA9IHdsYW5zYXBfc2V0X2tleV9zdGEoCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQkJCQlXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIKKwkJCQkJCShwSG9zdGFwZEFkYXB0ZXIpLAorI2Vsc2UKKwkJCQkJKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPgorCQkJCQkgcGNkc19jb250ZXh0LAorI2VuZGlmCisJCQkJCSZwSGRkQXBDdHgtPgorCQkJCQl3ZXBLZXlbaV0pOworCQkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQkJaGRkTG9nKExPR0UsCisJCQkJCSAgICAgICBGTCgic2V0X2tleSBmYWlsZWQgaWR4ICVkIiksIGkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXBIZGRDdHgtPmRmc19yYWRhcl9mb3VuZCA9IGZhbHNlOworCQl3bGFuc2FwX2dldF9kZnNfaWdub3JlX2NhYyhwSGRkQ3R4LT5oSGFsLCAmaWdub3JlQ0FDKTsKKworCQkvKiBERlMgcmVxdWlyZW1lbnQ6IERPIE5PVCB0cmFuc21pdCBkdXJpbmcgQ0FDLiAqLworCQlpZiAoKENIQU5ORUxfU1RBVEVfREZTICE9CisJCQljZHNfZ2V0X2NoYW5uZWxfc3RhdGUocEhkZEFwQ3R4LT5vcGVyYXRpbmdDaGFubmVsKSkKKwkJCXx8IGlnbm9yZUNBQworCQkJfHwgcEhkZEN0eC0+ZGV2X2Rmc19jYWNfc3RhdHVzID09IERGU19DQUNfQUxSRUFEWV9ET05FKQorCQkJcEhkZEFwQ3R4LT5kZnNfY2FjX2Jsb2NrX3R4ID0gZmFsc2U7CisJCWVsc2UKKwkJCXBIZGRBcEN0eC0+ZGZzX2NhY19ibG9ja190eCA9IHRydWU7CisKKwkJaGRkTG9nKExPRzMsICJUaGUgdmFsdWUgb2YgZGZzX2NhY19ibG9ja190eFslZF0gZm9yIEFwQ3R4WyVwXSIsCisJCSAgICAgICBwSGRkQXBDdHgtPmRmc19jYWNfYmxvY2tfdHgsIHBIZGRBcEN0eCk7CisKKwkJaWYgKChDSEFOTkVMX1NUQVRFX0RGUyA9PQorCQkgICAgIGNkc19nZXRfY2hhbm5lbF9zdGF0ZShwSGRkQXBDdHgtPm9wZXJhdGluZ0NoYW5uZWwpKQorCQkgICAgJiYgKHBIZGRDdHgtPmNvbmZpZy0+SXNTYXBEZnNDaFNpZnNCdXJzdEVuYWJsZWQgPT0gMCkpIHsKKworCQkJaGRkTG9nKExPRzEsCisJCQkgICAgICAgRkwoIlNldCBTSUZTIEJ1cnN0IGRpc2FibGUgZm9yIERGUyBjaGFubmVsICVkIiksCisJCQkgICAgICAgcEhkZEFwQ3R4LT5vcGVyYXRpbmdDaGFubmVsKTsKKworCQkJaWYgKHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQlXTUlfUERFVl9QQVJBTV9CVVJTVF9FTkFCTEUsCisJCQkJCQkwLCBQREVWX0NNRCkpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoIkZhaWxlZCB0byBTZXQgU0lGUyBCdXJzdCAlZCIpLAorCQkJCSAgICAgICBwSGRkQXBDdHgtPm9wZXJhdGluZ0NoYW5uZWwpOworCQkJfQorCQl9CisJCS8qIEZpbGwgdGhlIHBhcmFtcyBmb3Igc2VuZGluZyBJV0VWQ1VTVE9NIEV2ZW50IHdpdGggU09GVEFQLmVuYWJsZWQgKi8KKwkJc3RhcnRCc3NFdmVudCA9ICJTT0ZUQVAuZW5hYmxlZCI7CisJCW1lbXNldCgmd2VfY3VzdG9tX3N0YXJ0X2V2ZW50LCAnXDAnLAorCQkgICAgICAgc2l6ZW9mKHdlX2N1c3RvbV9zdGFydF9ldmVudCkpOworCQltZW1jcHkoJndlX2N1c3RvbV9zdGFydF9ldmVudCwgc3RhcnRCc3NFdmVudCwKKwkJICAgICAgIHN0cmxlbihzdGFydEJzc0V2ZW50KSk7CisJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihzdGFydEJzc0V2ZW50KTsKKwkJd2VfZXZlbnQgPSBJV0VWQ1VTVE9NOworCQl3ZV9jdXN0b21fZXZlbnRfZ2VuZXJpYyA9IHdlX2N1c3RvbV9zdGFydF9ldmVudDsKKwkJY2RzX2R1bXBfY29uY3VycmVuY3lfaW5mbyhwSGRkQ3R4KTsKKwkJLyogU2VuZCBTQ0MvTUNDIFN3aXRjaGluZyBldmVudCB0byBJUEEgKi8KKwkJaGRkX2lwYV9zZW5kX21jY19zY2NfbXNnKHBIZGRDdHgsIHBIZGRDdHgtPm1jY19tb2RlKTsKKwkJYnJlYWs7ICAgICAgICAgIC8qIEV2ZW50IHdpbGwgYmUgc2VudCBhZnRlciBTd2l0Y2gtQ2FzZSBzdG10ICovCisKKwljYXNlIGVTQVBfU1RPUF9CU1NfRVZFTlQ6CisJCWhkZExvZyhMT0cxLCBGTCgiQlNTIHN0b3Agc3RhdHVzID0gJXMiKSwKKwkJICAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0b3BCc3NDb21wbGV0ZUV2ZW50LgorCQkgICAgICAgc3RhdHVzID8gImVTQVBfU1RBVFVTX0ZBSUxVUkUiIDogImVTQVBfU1RBVFVTX1NVQ0NFU1MiKTsKKworCQloZGRfaG9zdGFwZF9jaGFubmVsX2FsbG93X3N1c3BlbmQocEhvc3RhcGRBZGFwdGVyLAorCQkJCQkJICBwSGRkQXBDdHgtPm9wZXJhdGluZ0NoYW5uZWwpOworCisJCWhkZF93bGFuX2dyZWVuX2FwX3N0b3BfYnNzKHBIZGRDdHgpOworCisJCS8qIEZyZWUgdXAgQ2hhbm5lbCBMaXN0IGluY2FzZSBpZiBpdCBpcyBzZXQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJCXNhcF9jbGVhbnVwX2NoYW5uZWxfbGlzdChXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIKKwkJCQkJIChwSG9zdGFwZEFkYXB0ZXIpKTsKKyNlbHNlCisJCXNhcF9jbGVhbnVwX2NoYW5uZWxfbGlzdCgpOworI2VuZGlmCisJCS8qIEludmFsaWRhdGUgdGhlIGNoYW5uZWwgaW5mby4gKi8KKwkJcEhkZEFwQ3R4LT5vcGVyYXRpbmdDaGFubmVsID0gMDsKKwkJaWYgKGhkZF9pcGFfaXNfZW5hYmxlZChwSGRkQ3R4KSkgeworCQkJc3RhdHVzID0gaGRkX2lwYV93bGFuX2V2dChwSG9zdGFwZEFkYXB0ZXIsCisJCQkJCXBIZGRBcEN0eC0+dUJDU3RhSWQsCisJCQkJCVdMQU5fQVBfRElTQ09OTkVDVCwKKwkJCQkJcEhvc3RhcGRBZGFwdGVyLT5kZXYtPmRldl9hZGRyKTsKKwkJCWlmIChzdGF0dXMpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgKCJXTEFOX0FQX0RJU0NPTk5FQ1QgZXZlbnQgZmFpbGVkISEiKSk7CisJCQkJZ290byBzdG9wYnNzOworCQkJfQorCQl9CisKKwkJLyogcmVzZXQgdGhlIGRmc19jYWNfc3RhdHVzIGFuZCBkZnNfY2FjX2Jsb2NrX3R4IGZsYWcgb25seSB3aGVuCisJCSAqIHRoZSBsYXN0IEJTUyBpcyBzdG9wcGVkCisJCSAqLworCQljb25fc2FwX2FkYXB0ZXIgPSBoZGRfZ2V0X2Nvbl9zYXBfYWRhcHRlcihwSG9zdGFwZEFkYXB0ZXIsIHRydWUpOworCQlpZiAoIWNvbl9zYXBfYWRhcHRlcikgeworCQkJcEhkZEFwQ3R4LT5kZnNfY2FjX2Jsb2NrX3R4ID0gdHJ1ZTsKKwkJCXBIZGRDdHgtPmRldl9kZnNfY2FjX3N0YXR1cyA9IERGU19DQUNfTkVWRVJfRE9ORTsKKwkJfQorCQlpZiAocEhkZEN0eC0+Y29uZmlnLT5jb25jX2N1c3RvbV9ydWxlMiAmJgorCQkJKFdMQU5fSEREX1AyUF9HTyA9PSBwSG9zdGFwZEFkYXB0ZXItPmRldmljZV9tb2RlKSkgeworCQkJaGRkX2FkYXB0ZXJfdCAqc3RhX2FkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwKKwkJCQkJV0xBTl9IRERfSU5GUkFfU1RBVElPTik7CisJCQloZGRMb2coTE9HMiwKKwkJCQlGTCgiUDJQR08gaXMgZ29pbmcgZG93biBub3ciKSk7CisJCQloZGRfaXNzdWVfc3RvcmVkX2pvaW5yZXEoc3RhX2FkYXB0ZXIsIHBIZGRDdHgpOworCQl9CisJCWdvdG8gc3RvcGJzczsKKworCWNhc2UgZVNBUF9ERlNfQ0FDX1NUQVJUOgorCQl3bGFuX2hkZF9zZW5kX3N2Y19ubGlua19tc2coV0xBTl9TVkNfREZTX0NBQ19TVEFSVF9JTkQsCisJCQkJCSAgICAmZGZzX2luZm8sCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHdsYW5fZGZzX2luZm8pKTsKKwkJcEhkZEN0eC0+ZGV2X2Rmc19jYWNfc3RhdHVzID0gREZTX0NBQ19JTl9QUk9HUkVTUzsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkJaGRkX3NlbmRfcmFkYXJfZXZlbnQocEhkZEN0eCwgZVNBUF9ERlNfQ0FDX1NUQVJULAorCQkJCWRmc19pbmZvLCAmcEhvc3RhcGRBZGFwdGVyLT53ZGV2KSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJVbmFibGUgdG8gaW5kaWNhdGUgQ0FDIHN0YXJ0IE5MIGV2ZW50IikpOworCQl9IGVsc2UgeworCQkJaGRkX2luZm8oIlNlbnQgQ0FDIHN0YXJ0IHRvIHVzZXIgc3BhY2UiKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGVTQVBfREZTX0NBQ19JTlRFUlJVUFRFRDoKKwkJLyoKKwkJICogVGhlIENBQyB0aW1lciBkaWQgbm90IHJ1biBjb21wbGV0ZWx5IGFuZCBhIHJhZGFyIHdhcyBkZXRlY3RlZAorCQkgKiBkdXJpbmcgdGhlIENBQyB0aW1lLiBUaGlzIG5ldyBzdGF0ZSB3aWxsIGtlZXAgdGhlIHR4IHBhdGgKKwkJICogYmxvY2tlZCBzaW5jZSB3ZSBkbyBub3Qgd2FudCBhbnkgdHJhbnNtaXNzaW9uIG9uIHRoZSBERlMKKwkJICogY2hhbm5lbC4gQ0FDIGVuZCB3aWxsIG9ubHkgYmUgcmVwb3J0ZWQgaGVyZSBzaW5jZSB0aGUgdXNlcgorCQkgKiBzcGFjZSBhcHBsaWNhdGlvbnMgYXJlIHdhaXRpbmcgb24gQ0FDIGVuZCBmb3IgdGhlaXIgc3RhdGUKKwkJICogbWFuYWdlbWVudC4KKwkJICovCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJCWhkZF9zZW5kX3JhZGFyX2V2ZW50KHBIZGRDdHgsIGVTQVBfREZTX0NBQ19FTkQsCisJCQkJZGZzX2luZm8sICZwSG9zdGFwZEFkYXB0ZXItPndkZXYpKSB7CisJCQloZGRfZXJyKCJVbmFibGUgdG8gaW5kaWNhdGUgQ0FDIGVuZCAoaW50ZXJydXB0ZWQpIGV2ZW50Iik7CisJCX0gZWxzZSB7CisJCQloZGRfaW5mbygiU2VudCBDQUMgZW5kIChpbnRlcnJ1cHRlZCkgdG8gdXNlciBzcGFjZSIpOworCQl9CisJCWJyZWFrOworCWNhc2UgZVNBUF9ERlNfQ0FDX0VORDoKKwkJd2xhbl9oZGRfc2VuZF9zdmNfbmxpbmtfbXNnKFdMQU5fU1ZDX0RGU19DQUNfRU5EX0lORCwKKwkJCQkJICAgICZkZnNfaW5mbywKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3Qgd2xhbl9kZnNfaW5mbykpOworCQlwSGRkQXBDdHgtPmRmc19jYWNfYmxvY2tfdHggPSBmYWxzZTsKKwkJcEhkZEN0eC0+ZGV2X2Rmc19jYWNfc3RhdHVzID0gREZTX0NBQ19BTFJFQURZX0RPTkU7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJCWhkZF9zZW5kX3JhZGFyX2V2ZW50KHBIZGRDdHgsIGVTQVBfREZTX0NBQ19FTkQsCisJCQkJZGZzX2luZm8sICZwSG9zdGFwZEFkYXB0ZXItPndkZXYpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIlVuYWJsZSB0byBpbmRpY2F0ZSBDQUMgZW5kIE5MIGV2ZW50IikpOworCQl9IGVsc2UgeworCQkJaGRkX2luZm8oIlNlbnQgQ0FDIGVuZCB0byB1c2VyIHNwYWNlIik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGVTQVBfREZTX1JBREFSX0RFVEVDVDoKKwkJd2xhbl9oZGRfc2VuZF9zdmNfbmxpbmtfbXNnKFdMQU5fU1ZDX0RGU19SQURBUl9ERVRFQ1RfSU5ELAorCQkJCQkgICAgJmRmc19pbmZvLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB3bGFuX2Rmc19pbmZvKSk7CisJCXBIZGRDdHgtPmRldl9kZnNfY2FjX3N0YXR1cyA9IERGU19DQUNfTkVWRVJfRE9ORTsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkJaGRkX3NlbmRfcmFkYXJfZXZlbnQocEhkZEN0eCwgZVNBUF9ERlNfUkFEQVJfREVURUNULAorCQkJCWRmc19pbmZvLCAmcEhvc3RhcGRBZGFwdGVyLT53ZGV2KSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJVbmFibGUgdG8gaW5kaWNhdGUgUmFkYXIgZGV0ZWN0IE5MIGV2ZW50IikpOworCQl9IGVsc2UgeworCQkJaGRkX2luZm8oIlNlbnQgcmFkYXIgZGV0ZWN0ZWQgdG8gdXNlciBzcGFjZSIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBlU0FQX0RGU19OT19BVkFJTEFCTEVfQ0hBTk5FTDoKKwkJd2xhbl9oZGRfc2VuZF9zdmNfbmxpbmtfbXNnCisJCQkoV0xBTl9TVkNfREZTX0FMTF9DSEFOTkVMX1VOQVZBSUxfSU5ELCAmZGZzX2luZm8sCisJCQlzaXplb2Yoc3RydWN0IHdsYW5fZGZzX2luZm8pKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTQVBfU1RBX1NFVF9LRVlfRVZFTlQ6CisJCS8qIFRPRE86CisJCSAqIGZvcndhcmQgdGhlIG1lc3NhZ2UgdG8gaG9zdGFwZCBvbmNlIGltcGxlbWVudGF0aW9uCisJCSAqIGlzIGRvbmUgZm9yIG5vdyBqdXN0IHByaW50CisJCSAqLworCQloZGRMb2coTE9HMSwgRkwoIlNFVCBLZXk6IGNvbmZpZ3VyZWQgc3RhdHVzID0gJXMiKSwKKwkJICAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXRpb25TZXRLZXlDb21wbGV0ZUV2ZW50LgorCQkgICAgICAgc3RhdHVzID8gImVTQVBfU1RBVFVTX0ZBSUxVUkUiIDogImVTQVBfU1RBVFVTX1NVQ0NFU1MiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwljYXNlIGVTQVBfU1RBX01JQ19GQUlMVVJFX0VWRU5UOgorCXsKKwkJbWVtc2V0KCZtc2csICdcMCcsIHNpemVvZihtc2cpKTsKKwkJbXNnLnNyY19hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KG1zZy5zcmNfYWRkci5zYV9kYXRhLAorCQkgICAgICAgJnBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXRpb25NSUNGYWlsdXJlRXZlbnQuCisJCSAgICAgICBzdGFNYWMsIENERl9NQUNfQUREUl9TSVpFKTsKKwkJaGRkTG9nKExPRzEsICJNSUMgTUFDICIgTUFDX0FERFJFU1NfU1RSLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkobXNnLnNyY19hZGRyLnNhX2RhdGEpKTsKKwkJaWYgKHBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXRpb25NSUNGYWlsdXJlRXZlbnQuCisJCSAgICBtdWx0aWNhc3QgPT0gZVNBUF9UUlVFKQorCQkJbXNnLmZsYWdzID0gSVdfTUlDRkFJTFVSRV9HUk9VUDsKKwkJZWxzZQorCQkJbXNnLmZsYWdzID0gSVdfTUlDRkFJTFVSRV9QQUlSV0lTRTsKKwkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQl3cnF1LmRhdGEubGVuZ3RoID0gc2l6ZW9mKG1zZyk7CisJCXdlX2V2ZW50ID0gSVdFVk1JQ0hBRUxNSUNGQUlMVVJFOworCQl3ZV9jdXN0b21fZXZlbnRfZ2VuZXJpYyA9ICh1aW50OF90ICopICZtc2c7CisJfQorCQkvKiBpbmZvcm0gbWljIGZhaWx1cmUgdG8gbmw4MDIxMSAqLworCQljZmc4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKGRldiwKKwkJCQkJICAgICBwU2FwRXZlbnQtPgorCQkJCQkgICAgIHNhcGV2dC5zYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50LgorCQkJCQkgICAgIHN0YU1hYy5ieXRlcywKKwkJCQkJICAgICAoKHBTYXBFdmVudC0+c2FwZXZ0LgorCQkJCQkgICAgICAgc2FwU3RhdGlvbk1JQ0ZhaWx1cmVFdmVudC4KKwkJCQkJICAgICAgIG11bHRpY2FzdCA9PQorCQkJCQkgICAgICAgZVNBUF9UUlVFKSA/CisJCQkJCSAgICAgIE5MODAyMTFfS0VZVFlQRV9HUk9VUCA6CisJCQkJCSAgICAgIE5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRSksCisJCQkJCSAgICAgcFNhcEV2ZW50LT5zYXBldnQuCisJCQkJCSAgICAgc2FwU3RhdGlvbk1JQ0ZhaWx1cmVFdmVudC5rZXlJZCwKKwkJCQkJICAgICBwU2FwRXZlbnQtPnNhcGV2dC4KKwkJCQkJICAgICBzYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50LlRTQywKKwkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTQVBfU1RBX0FTU09DX0VWRU5UOgorCWNhc2UgZVNBUF9TVEFfUkVBU1NPQ19FVkVOVDoKKwkJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLAorCQkgICAgICAgJnBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LgorCQkgICAgICAgc3RhTWFjLCBDREZfTUFDX0FERFJfU0laRSk7CisJCWhkZExvZyhMT0cxLCAiIGFzc29jaWF0ZWQgIiBNQUNfQUREUkVTU19TVFIsCisJCSAgICAgICBNQUNfQUREUl9BUlJBWSh3cnF1LmFkZHIuc2FfZGF0YSkpOworCQl3ZV9ldmVudCA9IElXRVZSRUdJU1RFUkVEOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQl3bGFuc2FwX2dldF93cHNfc3RhdGUoV0xBTl9IRERfR0VUX1NBUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlciksCisJCQkJICAgICAgJmJXUFNTdGF0ZSk7CisjZWxzZQorCQl3bGFuc2FwX2dldF93cHNfc3RhdGUoKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPgorCQkJCSAgICAgIHBjZHNfY29udGV4dCwgJmJXUFNTdGF0ZSk7CisjZW5kaWYKKworCQlpZiAoKGVDU1JfRU5DUllQVF9UWVBFX05PTkUgPT0gcEhkZEFwQ3R4LT51Y0VuY3J5cHRUeXBlKSB8fAorCQkgICAgKGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWSA9PQorCQkgICAgIHBIZGRBcEN0eC0+dWNFbmNyeXB0VHlwZSkKKwkJICAgIHx8IChlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZID09CisJCQlwSGRkQXBDdHgtPnVjRW5jcnlwdFR5cGUpKSB7CisJCQliQXV0aFJlcXVpcmVkID0gZmFsc2U7CisJCX0KKworCQlpZiAoYkF1dGhSZXF1aXJlZCB8fCBiV1BTU3RhdGUgPT0gdHJ1ZSkgeworCQkJY2RmX3N0YXR1cyA9IGhkZF9zb2Z0YXBfcmVnaXN0ZXJfc3RhKAorCQkJCQkJcEhvc3RhcGRBZGFwdGVyLAorCQkJCQkJdHJ1ZSwKKwkJCQkJCXBIZGRBcEN0eC0+dVByaXZhY3ksCisJCQkJCQlwU2FwRXZlbnQtPnNhcGV2dC4KKwkJCQkJCXNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LgorCQkJCQkJc3RhSWQsIDAsIDAsCisJCQkJCQkoc3RydWN0IGNkZl9tYWNfYWRkciAqKQorCQkJCQkJd3JxdS5hZGRyLnNhX2RhdGEsCisJCQkJCQlwU2FwRXZlbnQtPnNhcGV2dC4KKwkJCQkJCXNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LgorCQkJCQkJd21tRW5hYmxlZCk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCQloZGRMb2coTE9HVywKKwkJCQkgICAgICAgRkwoIkZhaWxlZCB0byByZWdpc3RlciBTVEEgJWQgIgorCQkJCQkgIE1BQ19BRERSRVNTX1NUUiAiIiksIGNkZl9zdGF0dXMsCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHdycXUuYWRkci5zYV9kYXRhKSk7CisJCX0gZWxzZSB7CisJCQljZGZfc3RhdHVzID0gaGRkX3NvZnRhcF9yZWdpc3Rlcl9zdGEoCisJCQkJCQlwSG9zdGFwZEFkYXB0ZXIsCisJCQkJCQlmYWxzZSwKKwkJCQkJCXBIZGRBcEN0eC0+dVByaXZhY3ksCisJCQkJCQlwU2FwRXZlbnQtPnNhcGV2dC4KKwkJCQkJCXNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LgorCQkJCQkJc3RhSWQsIDAsIDAsCisJCQkJCQkoc3RydWN0IGNkZl9tYWNfYWRkciAqKQorCQkJCQkJd3JxdS5hZGRyLnNhX2RhdGEsCisJCQkJCQlwU2FwRXZlbnQtPnNhcGV2dC4KKwkJCQkJCXNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LgorCQkJCQkJd21tRW5hYmxlZCk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCQloZGRMb2coTE9HVywKKwkJCQkgICAgICAgRkwoIkZhaWxlZCB0byByZWdpc3RlciBTVEEgJWQgIgorCQkJCQkgIE1BQ19BRERSRVNTX1NUUiAiIiksIGNkZl9zdGF0dXMsCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHdycXUuYWRkci5zYV9kYXRhKSk7CisJCX0KKworCQlpZiAoaGRkX2lwYV9pc19lbmFibGVkKHBIZGRDdHgpKSB7CisJCQlzdGF0dXMgPSBoZGRfaXBhX3dsYW5fZXZ0KHBIb3N0YXBkQWRhcHRlciwKKwkJCQkJcFNhcEV2ZW50LT5zYXBldnQuCisJCQkJCXNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LgorCQkJCQlzdGFJZCwgV0xBTl9DTElFTlRfQ09OTkVDVF9FWCwKKwkJCQkJcFNhcEV2ZW50LT5zYXBldnQuCisJCQkJCXNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LgorCQkJCQlzdGFNYWMuYnl0ZXMpOworCQkJaWYgKHN0YXR1cykgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgRkwoIldMQU5fQ0xJRU5UX0NPTk5FQ1RfRVggZXZlbnQgZmFpbGVkIikpOworCQkJCWdvdG8gc3RvcGJzczsKKwkJCX0KKwkJfQorCisjaWZkZWYgUUNBX1BLVF9QUk9UT19UUkFDRQorCQkvKiBQZWVyIGFzc29jaWF0ZWQsIHVwZGF0ZSBpbnRvIHRyYWNlIGJ1ZmZlciAqLworCQlpZiAocEhkZEN0eC0+Y29uZmlnLT5nRW5hYmxlRGVidWdMb2cpIHsKKwkJCWNkc19wa3RfdHJhY2VfYnVmX3VwZGF0ZSgiSEE6QVNTT0MiKTsKKwkJfQorI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworI2lmZGVmIE1TTV9QTEFURk9STQorCQkvKiBzdGFydCB0aW1lciBpbiBzYXAvcDJwX2dvICovCisJCWlmIChwSGRkQXBDdHgtPmJBcEFjdGl2ZSA9PSBmYWxzZSkgeworCQkJc3Bpbl9sb2NrX2JoKCZwSGRkQ3R4LT5idXNfYndfbG9jayk7CisJCQlwSG9zdGFwZEFkYXB0ZXItPnByZXZfdHhfcGFja2V0cyA9CisJCQkJcEhvc3RhcGRBZGFwdGVyLT5zdGF0cy50eF9wYWNrZXRzOworCQkJcEhvc3RhcGRBZGFwdGVyLT5wcmV2X3J4X3BhY2tldHMgPQorCQkJCXBIb3N0YXBkQWRhcHRlci0+c3RhdHMucnhfcGFja2V0czsKKwkJCXNwaW5fdW5sb2NrX2JoKCZwSGRkQ3R4LT5idXNfYndfbG9jayk7CisJCQloZGRfc3RhcnRfYnVzX2J3X2NvbXB1dGVfdGltZXIocEhvc3RhcGRBZGFwdGVyKTsKKwkJfQorI2VuZGlmCisJCXBIZGRBcEN0eC0+YkFwQWN0aXZlID0gdHJ1ZTsKKwkJLyogU3RvcCBBUCBpbmFjdGl2aXR5IHRpbWVyICovCisJCWlmIChwSGRkQXBDdHgtPmhkZF9hcF9pbmFjdGl2aXR5X3RpbWVyLnN0YXRlID09CisJCSAgICBDREZfVElNRVJfU1RBVEVfUlVOTklORykgeworCQkJY2RmX3N0YXR1cyA9CisJCQkJY2RmX21jX3RpbWVyX3N0b3AoJnBIZGRBcEN0eC0+CisJCQkJCQkgIGhkZF9hcF9pbmFjdGl2aXR5X3RpbWVyKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKCJGYWlsZWQgdG8gc3RhcnQgaW5hY3Rpdml0eSB0aW1lciIpKTsKKwkJCX0KKwkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOCisJCXdsYW5faGRkX2F1dG9fc2h1dGRvd25fZW5hYmxlKHBIZGRDdHgsIGZhbHNlKTsKKyNlbmRpZgorCQljZGZfd2FrZV9sb2NrX3RpbWVvdXRfYWNxdWlyZSgmcEhkZEN0eC0+c2FwX3dha2VfbG9jaywKKwkJCQkJICAgICAgSEREX1NBUF9XQUtFX0xPQ0tfRFVSQVRJT04sCisJCQkJCSAgICAgIFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfU0FQKTsKKwkJeworCQkJc3RydWN0IHN0YXRpb25faW5mbyBzdGFJbmZvOworCQkJdWludDE2X3QgaWVzTGVuID0KKwkJCQlwU2FwRXZlbnQtPnNhcGV2dC4KKwkJCQlzYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudC5pZXNMZW47CisKKwkJCW1lbXNldCgmc3RhSW5mbywgMCwgc2l6ZW9mKHN0YUluZm8pKTsKKwkJCWlmIChpZXNMZW4gPD0gTUFYX0FTU09DX0lORF9JRV9MRU4pIHsKKwkJCQlzdGFJbmZvLmFzc29jX3JlcV9pZXMgPQorCQkJCQkoY29uc3QgdTggKikmcFNhcEV2ZW50LT5zYXBldnQuCisJCQkJCXNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50Lmllc1swXTsKKwkJCQlzdGFJbmZvLmFzc29jX3JlcV9pZXNfbGVuID0gaWVzTGVuOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMCwgMzEpKQorCQkJCXN0YUluZm8uZmlsbGVkIHw9IFNUQVRJT05fSU5GT19BU1NPQ19SRVFfSUVTOworI2VuZGlmCisJCQkJY2ZnODAyMTFfbmV3X3N0YShkZXYsCisJCQkJCQkgKGNvbnN0IHU4ICopJnBTYXBFdmVudC0+c2FwZXZ0LgorCQkJCQkJIHNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LgorCQkJCQkJIHN0YU1hYy5ieXRlc1swXSwgJnN0YUluZm8sCisJCQkJCQkgR0ZQX0tFUk5FTCk7CisJCQl9IGVsc2UgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgiQXNzb2MgSWUgbGVuZ3RoIGlzIHRvbyBsb25nIikpOworCQkJfQorCQl9CisKKwkJcFNjYW5JbmZvID0gJnBIb3N0YXBkQWRhcHRlci0+c2Nhbl9pbmZvOworCQkvKiBMZXRzIGRvIGFib3J0IHNjYW4gdG8gZW5zdXJlIHNtb290aCBhdXRoZW50aWNhdGlvbiBmb3IgY2xpZW50ICovCisJCWlmICgocFNjYW5JbmZvICE9IE5VTEwpICYmIHBTY2FuSW5mby0+bVNjYW5QZW5kaW5nKSB7CisJCQloZGRfYWJvcnRfbWFjX3NjYW4ocEhkZEN0eCwgcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgIGVDU1JfU0NBTl9BQk9SVF9ERUZBVUxUKTsKKwkJfQorCQlpZiAocEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pIHsKKwkJCS8qIHNlbmQgcGVlciBzdGF0dXMgaW5kaWNhdGlvbiB0byBvZW0gYXBwICovCisJCQloZGRfc2VuZF9wZWVyX3N0YXR1c19pbmRfdG9fb2VtX2FwcCgmcFNhcEV2ZW50LT5zYXBldnQuCisJCQkJCQkJICAgIHNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LgorCQkJCQkJCSAgICBzdGFNYWMsIGVQZWVyQ29ubmVjdGVkLAorCQkJCQkJCSAgICBwU2FwRXZlbnQtPnNhcGV2dC4KKwkJCQkJCQkgICAgc2FwU3RhdGlvbkFzc29jUmVhc3NvY0NvbXBsZXRlRXZlbnQuCisJCQkJCQkJICAgIHRpbWluZ01lYXNDYXAsCisJCQkJCQkJICAgIHBIb3N0YXBkQWRhcHRlci0+CisJCQkJCQkJICAgIHNlc3Npb25JZCwKKwkJCQkJCQkgICAgJnBTYXBFdmVudC0+c2FwZXZ0LgorCQkJCQkJCSAgICBzYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudC4KKwkJCQkJCQkgICAgY2hhbl9pbmZvKTsKKwkJfQorCQloZGRfd2xhbl9ncmVlbl9hcF9hZGRfc3RhKHBIZGRDdHgpOworCQlicmVhazsKKworCWNhc2UgZVNBUF9TVEFfRElTQVNTT0NfRVZFTlQ6CisJCW1lbWNweSh3cnF1LmFkZHIuc2FfZGF0YSwKKwkJICAgICAgICZwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uRGlzYXNzb2NDb21wbGV0ZUV2ZW50LgorCQkgICAgICAgc3RhTWFjLCBDREZfTUFDX0FERFJfU0laRSk7CisJCWhkZExvZyhMT0cxLCAiIGRpc2Fzc29jaWF0ZWQgIiBNQUNfQUREUkVTU19TVFIsCisJCSAgICAgICBNQUNfQUREUl9BUlJBWSh3cnF1LmFkZHIuc2FfZGF0YSkpOworCisJCWNkZl9zdGF0dXMgPSBjZGZfZXZlbnRfc2V0KCZwSG9zdGFwZFN0YXRlLT5jZGZfZXZlbnQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCWhkZExvZyhMT0dFLCAiRVJSOiBTdGF0aW9uIERlYXV0aCBldmVudCBTZXQgZmFpbGVkIik7CisKKwkJaWYgKHBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXRpb25EaXNhc3NvY0NvbXBsZXRlRXZlbnQucmVhc29uID09CisJCSAgICBlU0FQX1VTUl9JTklUQVRFRF9ESVNBU1NPQykKKwkJCWhkZExvZyhMT0cxLCAiIFVzZXIgaW5pdGlhdGVkIGRpc2Fzc29jaWF0aW9uIik7CisJCWVsc2UKKwkJCWhkZExvZyhMT0cxLCAiIE1BQyBpbml0aWF0ZWQgZGlzYXNzb2NpYXRpb24iKTsKKwkJd2VfZXZlbnQgPSBJV0VWRVhQSVJFRDsKKwkJY2RmX3N0YXR1cyA9CisJCQloZGRfc29mdGFwX2dldF9zdGFfaWQocEhvc3RhcGRBZGFwdGVyLAorCQkJCQkgICAgICAmcFNhcEV2ZW50LT5zYXBldnQuCisJCQkJCSAgICAgIHNhcFN0YXRpb25EaXNhc3NvY0NvbXBsZXRlRXZlbnQuc3RhTWFjLAorCQkJCQkgICAgICAmc3RhSWQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJFUlJPUjogSEREIEZhaWxlZCB0byBmaW5kIHN0YSBpZCEhIikpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisjaWZkZWYgSVBBX09GRkxPQUQKKwkJaWYgKGhkZF9pcGFfaXNfZW5hYmxlZChwSGRkQ3R4KSkgeworCQkJc3RhdHVzID0gaGRkX2lwYV93bGFuX2V2dChwSG9zdGFwZEFkYXB0ZXIsIHN0YUlkLAorCQkJCQlXTEFOX0NMSUVOVF9ESVNDT05ORUNULAorCQkJCQlwU2FwRXZlbnQtPnNhcGV2dC4KKwkJCQkJc2FwU3RhdGlvbkRpc2Fzc29jQ29tcGxldGVFdmVudC4KKwkJCQkJc3RhTWFjLmJ5dGVzKTsKKworCQkJaWYgKHN0YXR1cykgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICAoIkVSUk9SOiBXTEFOX0NMSUVOVF9ESVNDT05ORUNUIGV2ZW50IGZhaWxlZCEhIikpOworCQkJCWdvdG8gc3RvcGJzczsKKwkJCX0KKwkJfQorI2VuZGlmCisjaWZkZWYgUUNBX1BLVF9QUk9UT19UUkFDRQorCQkvKiBQZWVyIGRpcy1hc3NvY2lhdGVkLCB1cGRhdGUgaW50byB0cmFjZSBidWZmZXIgKi8KKwkJaWYgKHBIZGRDdHgtPmNvbmZpZy0+Z0VuYWJsZURlYnVnTG9nKSB7CisJCQljZHNfcGt0X3RyYWNlX2J1Zl91cGRhdGUoIkhBOkRJU0FTQyIpOworCQl9CisjZW5kaWYgLyogUUNBX1BLVF9QUk9UT19UUkFDRSAqLworCQloZGRfc29mdGFwX2RlcmVnaXN0ZXJfc3RhKHBIb3N0YXBkQWRhcHRlciwgc3RhSWQpOworCisJCXBIZGRBcEN0eC0+YkFwQWN0aXZlID0gZmFsc2U7CisJCXNwaW5fbG9ja19iaCgmcEhvc3RhcGRBZGFwdGVyLT5zdGFJbmZvX2xvY2spOworCQlmb3IgKGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspIHsKKwkJCWlmIChwSG9zdGFwZEFkYXB0ZXItPmFTdGFJbmZvW2ldLmlzVXNlZAorCQkJICAgICYmIGkgIT0KKwkJCSAgICAoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKSktPgorCQkJICAgIHVCQ1N0YUlkKSB7CisJCQkJcEhkZEFwQ3R4LT5iQXBBY3RpdmUgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZwSG9zdGFwZEFkYXB0ZXItPnN0YUluZm9fbG9jayk7CisKKwkJLyogU3RhcnQgQVAgaW5hY3Rpdml0eSB0aW1lciBpZiBubyBzdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggaXQgKi8KKwkJaWYgKCgwICE9CisJCSAgICAgKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPmNvbmZpZy0+CisJCSAgICAgbkFQQXV0b1NodXRPZmYpKSB7CisJCQlpZiAocEhkZEFwQ3R4LT5iQXBBY3RpdmUgPT0gZmFsc2UpIHsKKwkJCQlpZiAocEhkZEFwQ3R4LT5oZGRfYXBfaW5hY3Rpdml0eV90aW1lci5zdGF0ZSA9PQorCQkJCSAgICBDREZfVElNRVJfU1RBVEVfU1RPUFBFRCkgeworCQkJCQljZGZfc3RhdHVzID0KKwkJCQkJCWNkZl9tY190aW1lcl9zdGFydCgmcEhkZEFwQ3R4LT4KKwkJCQkJCQkJICAgaGRkX2FwX2luYWN0aXZpdHlfdGltZXIsCisJCQkJCQkJCSAgIChXTEFOX0hERF9HRVRfQ1RYCisJCQkJCQkJCSAgICAocEhvc3RhcGRBZGFwdGVyKSktPgorCQkJCQkJCQkgICBjb25maWctPgorCQkJCQkJCQkgICBuQVBBdXRvU2h1dE9mZiAqCisJCQkJCQkJCSAgIDEwMDApOworCQkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCQkJCWhkZExvZyhMT0dFLAorCQkJCQkJICAgICAgIEZMKCJGYWlsZWQgdG8gaW5pdCBBUCBpbmFjdGl2aXR5IHRpbWVyIikpOworCQkJCX0gZWxzZQorCQkJCQlDREZfQVNTRVJUCisJCQkJCQkoY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlCisJCQkJCQkJKCZwSGRkQXBDdHgtPgorCQkJCQkJCWhkZF9hcF9pbmFjdGl2aXR5X3RpbWVyKSA9PQorCQkJCQkJQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQpOworCQkJfQorCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKwkJd2xhbl9oZGRfYXV0b19zaHV0ZG93bl9lbmFibGUocEhkZEN0eCwgdHJ1ZSk7CisjZW5kaWYKKworCQljZmc4MDIxMV9kZWxfc3RhKGRldiwKKwkJCQkgKGNvbnN0IHU4ICopJnBTYXBFdmVudC0+c2FwZXZ0LgorCQkJCSBzYXBTdGF0aW9uRGlzYXNzb2NDb21wbGV0ZUV2ZW50LnN0YU1hYy4KKwkJCQkgYnl0ZXNbMF0sIEdGUF9LRVJORUwpOworCisJCS8qIFVwZGF0ZSB0aGUgYmVhY29uIEludGVydmFsIGlmIGl0IGlzIFAyUCBHTyAqLworCQljZGZfc3RhdHVzID0gY2RzX2NoYW5nZV9tY2NfZ29fYmVhY29uX2ludGVydmFsKHBIb3N0YXBkQWRhcHRlcik7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RmX3N0YXR1cykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJmYWlsZWQgdG8gdXBkYXRlIEJlYWNvbiBpbnRlcnZhbCAlZCIpLAorCQkJCWNkZl9zdGF0dXMpOworCQl9CisJCWlmIChwSG9zdGFwZEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9HTykgeworCQkJLyogc2VuZCBwZWVyIHN0YXR1cyBpbmRpY2F0aW9uIHRvIG9lbSBhcHAgKi8KKwkJCWhkZF9zZW5kX3BlZXJfc3RhdHVzX2luZF90b19vZW1fYXBwKCZwU2FwRXZlbnQtPnNhcGV2dC4KKwkJCQkJCQkgICAgc2FwU3RhdGlvbkRpc2Fzc29jQ29tcGxldGVFdmVudC4KKwkJCQkJCQkgICAgc3RhTWFjLCBlUGVlckRpc2Nvbm5lY3RlZCwKKwkJCQkJCQkgICAgMCwKKwkJCQkJCQkgICAgcEhvc3RhcGRBZGFwdGVyLT4KKwkJCQkJCQkgICAgc2Vzc2lvbklkLCBOVUxMKTsKKwkJfQorI2lmZGVmIE1TTV9QTEFURk9STQorCQkvKnN0b3AgdGltZXIgaW4gc2FwL3AycF9nbyAqLworCQlpZiAocEhkZEFwQ3R4LT5iQXBBY3RpdmUgPT0gZmFsc2UpIHsKKwkJCXNwaW5fbG9ja19iaCgmcEhkZEN0eC0+YnVzX2J3X2xvY2spOworCQkJcEhvc3RhcGRBZGFwdGVyLT5wcmV2X3R4X3BhY2tldHMgPSAwOworCQkJcEhvc3RhcGRBZGFwdGVyLT5wcmV2X3J4X3BhY2tldHMgPSAwOworCQkJc3Bpbl91bmxvY2tfYmgoJnBIZGRDdHgtPmJ1c19id19sb2NrKTsKKwkJCWhkZF9zdG9wX2J1c19id19jb21wdXRlX3RpbWVyKHBIb3N0YXBkQWRhcHRlcik7CisJCX0KKyNlbmRpZgorCQloZGRfd2xhbl9ncmVlbl9hcF9kZWxfc3RhKHBIZGRDdHgpOworCQlicmVhazsKKworCWNhc2UgZVNBUF9XUFNfUEJDX1BST0JFX1JFUV9FVkVOVDoKKwl7CisJCXN0YXRpYyBjb25zdCBjaGFyICptZXNzYWdlID0KKwkJCSJNTE1FV1BTUEJDUFJPQkVSRVEuaW5kaWNhdGlvbiI7CisJCXVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKworCQlkb3duKCZwSGRkQXBDdHgtPnNlbVdwc1BCQ092ZXJsYXBJbmQpOworCQlwSGRkQXBDdHgtPldQU1BCQ1Byb2JlUmVxLnByb2JlUmVxSUVMZW4gPQorCQkJcFNhcEV2ZW50LT5zYXBldnQuc2FwUEJDUHJvYmVSZXFFdmVudC4KKwkJCVdQU1BCQ1Byb2JlUmVxLnByb2JlUmVxSUVMZW47CisKKwkJY2RmX21lbV9jb3B5KHBIZGRBcEN0eC0+V1BTUEJDUHJvYmVSZXEucHJvYmVSZXFJRSwKKwkJCSAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwUEJDUHJvYmVSZXFFdmVudC4KKwkJCSAgICAgV1BTUEJDUHJvYmVSZXEucHJvYmVSZXFJRSwKKwkJCSAgICAgcEhkZEFwQ3R4LT5XUFNQQkNQcm9iZVJlcS5wcm9iZVJlcUlFTGVuKTsKKworCQljZGZfbWVtX2NvcHkocEhkZEFwQ3R4LT5XUFNQQkNQcm9iZVJlcS5wZWVyTWFjQWRkciwKKwkJCSAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwUEJDUHJvYmVSZXFFdmVudC4KKwkJCSAgICAgV1BTUEJDUHJvYmVSZXEucGVlck1hY0FkZHIsCisJCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKwkJaGRkTG9nKExPRzEsICJXUFMgUEJDIHByb2JlIHJlcSAiIE1BQ19BRERSRVNTX1NUUiwKKwkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZGRBcEN0eC0+V1BTUEJDUHJvYmVSZXEuCisJCQkJICAgICAgcGVlck1hY0FkZHIpKTsKKwkJbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworCQl3cmVxLmRhdGEubGVuZ3RoID0gc3RybGVuKG1lc3NhZ2UpOyAgICAgICAgICAgICAvKiBUaGlzIGlzIGxlbmd0aCBvZiBtZXNzYWdlICovCisJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWQ1VTVE9NLCAmd3JlcSwKKwkJCQkgICAgKGNoYXIgKiltZXNzYWdlKTsKKworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKwljYXNlIGVTQVBfQVNTT0NfU1RBX0NBTExCQUNLX0VWRU5UOgorCQlwQXNzb2NTdGFzQXJyYXkgPQorCQkJcFNhcEV2ZW50LT5zYXBldnQuc2FwQXNzb2NTdGFMaXN0RXZlbnQucEFzc29jU3RhczsKKwkJaWYgKHBTYXBFdmVudC0+c2FwZXZ0LnNhcEFzc29jU3RhTGlzdEV2ZW50Lm5vT2ZBc3NvY1N0YSAhPSAwKSB7IC8qIExpc3Qgb2YgYXNzb2NpYXRlZCBzdGF0aW9ucyAqLworCQkJZm9yIChpID0gMDsKKwkJCSAgICAgaSA8CisJCQkgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcEFzc29jU3RhTGlzdEV2ZW50LgorCQkJICAgICBub09mQXNzb2NTdGE7IGkrKykgeworCQkJCWhkZExvZyhMT0cxLAorCQkJCSAgICAgICAiQXNzb2NpYXRlZCBTdGEgTnVtICVkOmFzc29jSWQ9JWQsIHN0YUlkPSVkLCBzdGFNYWM9IgorCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIsIGkgKyAxLAorCQkJCSAgICAgICBwQXNzb2NTdGFzQXJyYXktPmFzc29jSWQsCisJCQkJICAgICAgIHBBc3NvY1N0YXNBcnJheS0+c3RhSWQsCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBBc3NvY1N0YXNBcnJheS0+c3RhTWFjLgorCQkJCQkJICAgICAgYnl0ZXMpKTsKKwkJCQlwQXNzb2NTdGFzQXJyYXkrKzsKKwkJCX0KKwkJfQorCQljZGZfbWVtX2ZyZWUocFNhcEV2ZW50LT5zYXBldnQuc2FwQXNzb2NTdGFMaXN0RXZlbnQucEFzc29jU3Rhcyk7ICAgICAgICAvKiBSZWxlYXNlIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IGhlcmUgKi8KKwkJcFNhcEV2ZW50LT5zYXBldnQuc2FwQXNzb2NTdGFMaXN0RXZlbnQucEFzc29jU3RhcyA9IE5VTEw7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJY2FzZSBlU0FQX0lORElDQVRFX01HTVRfRlJBTUU6CisJCWhkZF9pbmRpY2F0ZV9tZ210X2ZyYW1lKHBIb3N0YXBkQWRhcHRlciwKKwkJCQkJcFNhcEV2ZW50LT5zYXBldnQuc2FwTWFuYWdlbWVudEZyYW1lSW5mby4KKwkJCQkJbkZyYW1lTGVuZ3RoLAorCQkJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBNYW5hZ2VtZW50RnJhbWVJbmZvLgorCQkJCQlwYkZyYW1lcywKKwkJCQkJcFNhcEV2ZW50LT5zYXBldnQuc2FwTWFuYWdlbWVudEZyYW1lSW5mby4KKwkJCQkJZnJhbWVUeXBlLAorCQkJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBNYW5hZ2VtZW50RnJhbWVJbmZvLgorCQkJCQlyeENoYW4sIDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCWNhc2UgZVNBUF9SRU1BSU5fQ0hBTl9SRUFEWToKKwkJaGRkX3JlbWFpbl9jaGFuX3JlYWR5X2hhbmRsZXIocEhvc3RhcGRBZGFwdGVyLAorCQkJcFNhcEV2ZW50LT5zYXBldnQuc2FwX3JvY19pbmQuc2Nhbl9pZCk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJY2FzZSBlU0FQX1NFTkRfQUNUSU9OX0NORjoKKwkJaGRkX3NlbmRfYWN0aW9uX2NuZihwSG9zdGFwZEFkYXB0ZXIsCisJCQkJICAgIChlU0FQX1NUQVRVU19TVUNDRVNTID09CisJCQkJICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBBY3Rpb25DbmYuCisJCQkJICAgICBhY3Rpb25TZW5kU3VjY2VzcykgPyB0cnVlIDogZmFsc2UpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCWNhc2UgZVNBUF9VTktOT1dOX1NUQV9KT0lOOgorCQlzbnByaW50Zih1bmtub3duU1RBRXZlbnQsIElXX0NVU1RPTV9NQVgsCisJCQkgIkpPSU5fVU5LTk9XTl9TVEEtJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJIHBTYXBFdmVudC0+c2FwZXZ0LnNhcFVua25vd25TVEFKb2luLm1hY2FkZHIuYnl0ZXNbMF0sCisJCQkgcFNhcEV2ZW50LT5zYXBldnQuc2FwVW5rbm93blNUQUpvaW4ubWFjYWRkci5ieXRlc1sxXSwKKwkJCSBwU2FwRXZlbnQtPnNhcGV2dC5zYXBVbmtub3duU1RBSm9pbi5tYWNhZGRyLmJ5dGVzWzJdLAorCQkJIHBTYXBFdmVudC0+c2FwZXZ0LnNhcFVua25vd25TVEFKb2luLm1hY2FkZHIuYnl0ZXNbM10sCisJCQkgcFNhcEV2ZW50LT5zYXBldnQuc2FwVW5rbm93blNUQUpvaW4ubWFjYWRkci5ieXRlc1s0XSwKKwkJCSBwU2FwRXZlbnQtPnNhcGV2dC5zYXBVbmtub3duU1RBSm9pbi5tYWNhZGRyLmJ5dGVzWzVdKTsKKwkJd2VfZXZlbnQgPSBJV0VWQ1VTVE9NOyAgLyogRGlzY292ZXJlZCBhIG5ldyBub2RlIChBUCBtb2RlKS4gKi8KKwkJd3JxdS5kYXRhLnBvaW50ZXIgPSB1bmtub3duU1RBRXZlbnQ7CisJCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4odW5rbm93blNUQUV2ZW50KTsKKwkJd2VfY3VzdG9tX2V2ZW50X2dlbmVyaWMgPSAodWludDhfdCAqKSB1bmtub3duU1RBRXZlbnQ7CisJCWhkZExvZyhMT0dFLCAiJXMiLCB1bmtub3duU1RBRXZlbnQpOworCQlicmVhazsKKworCWNhc2UgZVNBUF9NQVhfQVNTT0NfRVhDRUVERUQ6CisJCXNucHJpbnRmKG1heEFzc29jRXhjZWVkZWRFdmVudCwgSVdfQ1VTVE9NX01BWCwKKwkJCSAiUGVlciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBkZW5pZWQiCisJCQkgIiBhc3NvYyBkdWUgdG8gTWF4aW11bSBNb2JpbGUgSG90c3BvdCBjb25uZWN0aW9ucyByZWFjaGVkLiBQbGVhc2UgZGlzY29ubmVjdCIKKwkJCSAiIG9uZSBvciBtb3JlIGRldmljZXMgdG8gZW5hYmxlIHRoZSBuZXcgZGV2aWNlIGNvbm5lY3Rpb24iLAorCQkJIHBTYXBFdmVudC0+c2FwZXZ0LnNhcE1heEFzc29jRXhjZWVkZWQubWFjYWRkci5ieXRlc1swXSwKKwkJCSBwU2FwRXZlbnQtPnNhcGV2dC5zYXBNYXhBc3NvY0V4Y2VlZGVkLm1hY2FkZHIuYnl0ZXNbMV0sCisJCQkgcFNhcEV2ZW50LT5zYXBldnQuc2FwTWF4QXNzb2NFeGNlZWRlZC5tYWNhZGRyLmJ5dGVzWzJdLAorCQkJIHBTYXBFdmVudC0+c2FwZXZ0LnNhcE1heEFzc29jRXhjZWVkZWQubWFjYWRkci5ieXRlc1szXSwKKwkJCSBwU2FwRXZlbnQtPnNhcGV2dC5zYXBNYXhBc3NvY0V4Y2VlZGVkLm1hY2FkZHIuYnl0ZXNbNF0sCisJCQkgcFNhcEV2ZW50LT5zYXBldnQuc2FwTWF4QXNzb2NFeGNlZWRlZC5tYWNhZGRyLgorCQkJIGJ5dGVzWzVdKTsKKwkJd2VfZXZlbnQgPSBJV0VWQ1VTVE9NOyAgLyogRGlzY292ZXJlZCBhIG5ldyBub2RlIChBUCBtb2RlKS4gKi8KKwkJd3JxdS5kYXRhLnBvaW50ZXIgPSBtYXhBc3NvY0V4Y2VlZGVkRXZlbnQ7CisJCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4obWF4QXNzb2NFeGNlZWRlZEV2ZW50KTsKKwkJd2VfY3VzdG9tX2V2ZW50X2dlbmVyaWMgPSAodWludDhfdCAqKSBtYXhBc3NvY0V4Y2VlZGVkRXZlbnQ7CisJCWhkZExvZyhMT0cxLCAiJXMiLCBtYXhBc3NvY0V4Y2VlZGVkRXZlbnQpOworCQlicmVhazsKKwljYXNlIGVTQVBfU1RBX0FTU09DX0lORDoKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWNhc2UgZVNBUF9ESVNDT05ORUNUX0FMTF9QMlBfQ0xJRU5UOgorCQloZGRMb2coTE9HMSwgRkwoIiBEaXNjb25uZWN0aW5nIGFsbCB0aGUgUDJQIENsaWVudHMuLi4uIikpOworCQloZGRfY2xlYXJfYWxsX3N0YShwSG9zdGFwZEFkYXB0ZXIsIHVzckRhdGFGb3JDYWxsYmFjayk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwljYXNlIGVTQVBfTUFDX1RSSUdfU1RPUF9CU1NfRVZFTlQ6CisJCWNkZl9zdGF0dXMgPQorCQkJaGRkX3N0b3BfYnNzX2xpbmsocEhvc3RhcGRBZGFwdGVyLCB1c3JEYXRhRm9yQ2FsbGJhY2spOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJaGRkTG9nKExPR1csIEZMKCJoZGRfc3RvcF9ic3NfbGluayBmYWlsZWQgJWQiKSwKKwkJCSAgICAgICBjZGZfc3RhdHVzKTsKKwkJfQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJY2FzZSBlU0FQX0NIQU5ORUxfQ0hBTkdFX0VWRU5UOgorCQloZGRMb2coTE9HMSwgRkwoIlJlY2VpdmVkIGVTQVBfQ0hBTk5FTF9DSEFOR0VfRVZFTlQgZXZlbnQiKSk7CisJCS8qIFByZXZlbnQgc3VzcGVuZCBmb3IgbmV3IGNoYW5uZWwgKi8KKwkJaGRkX2hvc3RhcGRfY2hhbm5lbF9wcmV2ZW50X3N1c3BlbmQocEhvc3RhcGRBZGFwdGVyLAorCQkJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQucHJpX2NoKTsKKwkJLyogQWxsb3cgc3VzcGVuZCBmb3Igb2xkIGNoYW5uZWwgKi8KKwkJaGRkX2hvc3RhcGRfY2hhbm5lbF9hbGxvd19zdXNwZW5kKHBIb3N0YXBkQWRhcHRlciwKKwkJCQkJcEhkZEFwQ3R4LT5vcGVyYXRpbmdDaGFubmVsKTsKKwkJLyogU01FL1BFIGlzIGFscmVhZHkgdXBkYXRlZCBmb3IgbmV3IG9wZXJhdGlvbiBjaGFubmVsLiBTbyB1cGRhdGUKKwkJKiBIREQgbGF5ZXIgYWxzbyBoZXJlLiBUaGlzIHJlc29sdmVzIGlzc3VlIGluIEFQLUFQIG1vZGUgd2hlcmUKKwkJKiBBUDEgY2hhbm5lbCBpcyBjaGFuZ2VkIGR1ZSB0byBSQURBUiB0aGVuIENBQyBpcyBnb2luZyBvbiBhbmQKKwkJKiBTVEFSVF9CU1Mgb24gbmV3IGNoYW5uZWwgaGFzIG5vdCBjb21lIHRvIEhERC4gQXQgdGhpcyBjYXNlIGlmCisJCSogQVAyIGlzIHN0YXJ0IGl0IG5lZWRzIGN1cnJlbnQgb3BlcmF0aW9uIGNoYW5uZWwgZm9yIE1DQyBERlMKKwkJKiByZXN0aWN0aW9uCisJCSovCisJCXBIZGRBcEN0eC0+b3BlcmF0aW5nQ2hhbm5lbCA9CisJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQucHJpX2NoOworCQlwSGRkQXBDdHgtPnNhcENvbmZpZy5hY3NfY2ZnLnByaV9jaCA9CisJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQucHJpX2NoOworCQlwSGRkQXBDdHgtPnNhcENvbmZpZy5hY3NfY2ZnLmh0X3NlY19jaCA9CisJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQuaHRfc2VjX2NoOworCQlwSGRkQXBDdHgtPnNhcENvbmZpZy5hY3NfY2ZnLnZodF9zZWcwX2NlbnRlcl9jaCA9CisJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQudmh0X3NlZzBfY2VudGVyX2NoOworCQlwSGRkQXBDdHgtPnNhcENvbmZpZy5hY3NfY2ZnLnZodF9zZWcxX2NlbnRlcl9jaCA9CisJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQudmh0X3NlZzFfY2VudGVyX2NoOworCQlwSGRkQXBDdHgtPnNhcENvbmZpZy5hY3NfY2ZnLmNoX3dpZHRoID0KKwkJCXBTYXBFdmVudC0+c2FwZXZ0LnNhcF9jaF9zZWxlY3RlZC5jaF93aWR0aDsKKworCQkvKiBJbmRpY2F0ZSBvcGVyYXRpbmcgY2hhbm5lbCBjaGFuZ2UgdG8gaG9zdGFwZAorCQkgKiBvbmx5IGZvciBub24gZHJpdmVyIG92ZXJyaWRlIGFjcworCQkgKi8KKwkJaWYgKHBIb3N0YXBkQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQICYmCisJCQkJCQlwSGRkQ3R4LT5jb25maWctPmZvcmNlX3NhcF9hY3MpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQllbHNlCisJCQlyZXR1cm4gaGRkX2NoYW5fY2hhbmdlX25vdGlmeShwSG9zdGFwZEFkYXB0ZXIsIGRldiwKKwkJCQkgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQucHJpX2NoKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9BUF9BUF9BQ1NfT1BUSU1JWkUKKwljYXNlIGVTQVBfQUNTX1NDQU5fU1VDQ0VTU19FVkVOVDoKKwkJcEhkZEN0eC0+c2tpcF9hY3Nfc2Nhbl9zdGF0dXMgPSBlU0FQX1NLSVBfQUNTX1NDQU47CisJCWhkZExvZyhMT0cxLCBGTCgiUmV1c2luZyBMYXN0IEFDUyBzY2FuIHJlc3VsdCBmb3IgJWQgc2VjIiksCisJCSAgICAgICBBQ1NfU0NBTl9FWFBJUllfVElNRU9VVF9TKTsKKwkJY2RmX21jX3RpbWVyX3N0b3AoJnBIZGRDdHgtPnNraXBfYWNzX3NjYW5fdGltZXIpOworCQljZGZfc3RhdHVzID0gY2RmX21jX3RpbWVyX3N0YXJ0KCZwSGRkQ3R4LT5za2lwX2Fjc19zY2FuX3RpbWVyLAorCQkJCQkJQUNTX1NDQU5fRVhQSVJZX1RJTUVPVVRfUyAqCisJCQkJCQkxMDAwKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTCgiRmFpbGVkIHRvIHN0YXJ0IEFDUyBzY2FuIGV4cGlyeSB0aW1lciIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKyNlbmRpZgorCisJY2FzZSBlU0FQX0RGU19OT0xfR0VUOgorCQloZGRMb2coTE9HMSwKKwkJICAgICAgIEZMKCJSZWNlaXZlZCBlU0FQX0RGU19OT0xfR0VUIGV2ZW50IikpOworI2lmIGRlZmluZWQgQ09ORklHX0NOU1MKKwkJLyogZ2V0IHRoZSBkZnMgbm9sIGZyb20gY25zcyAqLworCQlyZXQgPQorCQkJY25zc193bGFuX2dldF9kZnNfbm9sKHBTYXBFdmVudC0+c2FwZXZ0LnNhcERmc05vbEluZm8uCisJCQkJCSAgICAgIHBEZnNMaXN0LAorCQkJCQkgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBEZnNOb2xJbmZvLgorCQkJCQkgICAgICBzRGZzTGlzdCk7CisKKwkJaWYgKHJldCA+IDApIHsKKwkJCWhkZExvZyhMT0cyLAorCQkJCUZMKCJHZXQgJWQgYnl0ZXMgb2YgZGZzIG5vbCBmcm9tIGNuc3MiKSwgcmV0KTsKKwkJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQloZGRMb2coTE9HMiwKKwkJCQlGTCgiTm8gZGZzIG5vbCBlbnRyeSBpbiBDTlNTLCByZXQ6ICVkIiksIHJldCk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQl9CisjZWxzZQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisjZW5kaWYKKwljYXNlIGVTQVBfREZTX05PTF9TRVQ6CisJCWhkZExvZyhMT0cxLCBGTCgiUmVjZWl2ZWQgZVNBUF9ERlNfTk9MX1NFVCBldmVudCIpKTsKKyNpZiBkZWZpbmVkIENPTkZJR19DTlNTCisJCS8qIHNldCB0aGUgZGZzIG5vbCB0byBjbnNzICovCisJCXJldCA9CisJCQljbnNzX3dsYW5fc2V0X2Rmc19ub2wocFNhcEV2ZW50LT5zYXBldnQuc2FwRGZzTm9sSW5mby4KKwkJCQkJICAgICAgcERmc0xpc3QsCisJCQkJCSAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcERmc05vbEluZm8uCisJCQkJCSAgICAgIHNEZnNMaXN0KTsKKworCQlpZiAocmV0KSB7CisJCQloZGRMb2coTE9HMiwKKwkJCSAgICAgICBGTCgiRmFpbGVkIHRvIHNldCBkZnMgbm9sIC0gcmV0OiAlZCIpLAorCQkJICAgICAgIHJldCk7CisJCX0gZWxzZSB7CisJCQloZGRMb2coTE9HMiwgRkwoIiBTZXQgJWQgYnl0ZXMgZGZzIG5vbCB0byBjbnNzIiksCisJCQkgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwRGZzTm9sSW5mby5zRGZzTGlzdCk7CisJCX0KKyNlbHNlCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKyNlbmRpZgorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCWNhc2UgZVNBUF9BQ1NfQ0hBTk5FTF9TRUxFQ1RFRDoKKwkJaGRkTG9nKExPRzEsIEZMKCJBQ1MgQ29tcGxldGVkIGZvciB3bGFuJWQiKSwKKwkJCQkJcEhvc3RhcGRBZGFwdGVyLT5kZXYtPmlmaW5kZXgpOworCQljbGVhcl9iaXQoQUNTX1BFTkRJTkcsICZwSG9zdGFwZEFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKwkJY2xlYXJfYml0KEFDU19JTl9QUk9HUkVTUywgJnBIZGRDdHgtPmdfZXZlbnRfZmxhZ3MpOworCQlwSGRkQXBDdHgtPnNhcENvbmZpZy5hY3NfY2ZnLnByaV9jaCA9CisJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQucHJpX2NoOworCQlwSGRkQXBDdHgtPnNhcENvbmZpZy5hY3NfY2ZnLmh0X3NlY19jaCA9CisJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQuaHRfc2VjX2NoOworCQlwSGRkQXBDdHgtPnNhcENvbmZpZy5hY3NfY2ZnLnZodF9zZWcwX2NlbnRlcl9jaCA9CisJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQudmh0X3NlZzBfY2VudGVyX2NoOworCQlwSGRkQXBDdHgtPnNhcENvbmZpZy5hY3NfY2ZnLnZodF9zZWcxX2NlbnRlcl9jaCA9CisJCQlwU2FwRXZlbnQtPnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQudmh0X3NlZzFfY2VudGVyX2NoOworCQlwSGRkQXBDdHgtPnNhcENvbmZpZy5hY3NfY2ZnLmNoX3dpZHRoID0KKwkJCXBTYXBFdmVudC0+c2FwZXZ0LnNhcF9jaF9zZWxlY3RlZC5jaF93aWR0aDsKKwkJLyogc2VuZCB2ZW5kb3IgZXZlbnQgdG8gaG9zdGFwZCBvbmx5IGZvciBob3N0YXBkIGJhc2VkIGFjcyovCisJCWlmICghcEhkZEN0eC0+Y29uZmlnLT5mb3JjZV9zYXBfYWNzKQorCQkJd2xhbl9oZGRfY2ZnODAyMTFfYWNzX2NoX3NlbGVjdF9ldnQocEhvc3RhcGRBZGFwdGVyKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQloZGRMb2coTE9HMSwgIlNBUCBtZXNzYWdlIGlzIG5vdCBoYW5kbGVkIik7CisJCWdvdG8gc3RvcGJzczsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIHdlX2V2ZW50LCAmd3JxdSwKKwkJCSAgICAoY2hhciAqKXdlX2N1c3RvbV9ldmVudF9nZW5lcmljKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCitzdG9wYnNzOgorCXsKKwkJdWludDhfdCB3ZV9jdXN0b21fZXZlbnRbNjRdOworCQljaGFyICpzdG9wQnNzRXZlbnQgPSAiU1RPUC1CU1MucmVzcG9uc2UiOyAgICAgICAvKiAxNyAqLworCQlpbnQgZXZlbnRfbGVuID0gc3RybGVuKHN0b3BCc3NFdmVudCk7CisKKwkJaGRkTG9nKExPRzEsIEZMKCJCU1Mgc3RvcCBzdGF0dXMgPSAlcyIpLAorCQkgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwU3RvcEJzc0NvbXBsZXRlRXZlbnQuc3RhdHVzID8KKwkJICAgICAgICJlU0FQX1NUQVRVU19GQUlMVVJFIiA6ICJlU0FQX1NUQVRVU19TVUNDRVNTIik7CisKKwkJLyogQ2hhbmdlIHRoZSBCU1Mgc3RhdGUgbm93IHNpbmNlLCBhcyB3ZSBhcmUgc2h1dHRpbmcgdGhpbmdzIGRvd24sCisJCSAqIHdlIGRvbid0IHdhbnQgaW50ZXJmYWNlcyB0byBiZWNvbWUgcmUtZW5hYmxlZCAqLworCQlwSG9zdGFwZFN0YXRlLT5ic3NTdGF0ZSA9IEJTU19TVE9QOworCisJCWlmICgwICE9CisJCSAgICAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+Y29uZmlnLT4KKwkJICAgIG5BUEF1dG9TaHV0T2ZmKSB7CisJCQlpZiAoQ0RGX1RJTUVSX1NUQVRFX1JVTk5JTkcgPT0KKwkJCSAgICBwSGRkQXBDdHgtPmhkZF9hcF9pbmFjdGl2aXR5X3RpbWVyLnN0YXRlKSB7CisJCQkJY2RmX3N0YXR1cyA9CisJCQkJCWNkZl9tY190aW1lcl9zdG9wKCZwSGRkQXBDdHgtPgorCQkJCQkJCSAgaGRkX2FwX2luYWN0aXZpdHlfdGltZXIpOworCQkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQkJCWhkZExvZyhMT0dFLAorCQkJCQkgICAgICAgRkwoIkZhaWxlZCB0byBzdG9wIEFQIGluYWN0aXZpdHkgdGltZXIiKSk7CisJCQkJfQorCQkJfQorCisJCQljZGZfc3RhdHVzID0KKwkJCQljZGZfbWNfdGltZXJfZGVzdHJveSgmcEhkZEFwQ3R4LT4KKwkJCQkJCWhkZF9hcF9pbmFjdGl2aXR5X3RpbWVyKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkIHRvIERlc3Ryb3kgQVAgaW5hY3Rpdml0eSB0aW1lciIpKTsKKwkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOCisJCXdsYW5faGRkX2F1dG9fc2h1dGRvd25fZW5hYmxlKHBIZGRDdHgsIHRydWUpOworI2VuZGlmCisKKwkJLyogU3RvcCB0aGUgcGt0cyBmcm9tIG4vdyBzdGFjayBhcyB3ZSBhcmUgZ29pbmcgdG8gZnJlZSBhbGwgb2YKKwkJICogdGhlIFRYIFdNTSBxdWV1ZXMgZm9yIGFsbCBTVEFJRCdzICovCisJCWhkZF9ob3N0YXBkX3N0b3AoZGV2KTsKKworCQkvKiByZWNsYWltIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIHRvIHRoZSBCU1MgKi8KKwkJY2RmX3N0YXR1cyA9IGhkZF9zb2Z0YXBfc3RvcF9ic3MocEhvc3RhcGRBZGFwdGVyKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCWhkZExvZyhMT0dXLAorCQkJICAgICAgIEZMKCJoZGRfc29mdGFwX3N0b3BfYnNzIGZhaWxlZCAlZCIpLAorCQkJICAgICAgIGNkZl9zdGF0dXMpOworCQl9CisKKwkJLyogb25jZSB0aGUgZXZlbnQgaXMgc2V0LCBzdHJ1Y3R1cmUgZGV2L3BIb3N0YXBkQWRhcHRlciBzaG91bGQKKwkJICogbm90IGJlIHRvdWNoZWQgc2luY2UgdGhleSBhcmUgbm93IHN1YmplY3QgdG8gYmVpbmcgZGVsZXRlZAorCQkgKiBieSBhbm90aGVyIHRocmVhZCAqLworCQlpZiAoZVNBUF9TVE9QX0JTU19FVkVOVCA9PSBzYXBFdmVudCkKKwkJCWNkZl9ldmVudF9zZXQoJnBIb3N0YXBkU3RhdGUtPmNkZl9zdG9wX2Jzc19ldmVudCk7CisKKwkJLyogbm90aWZ5IHVzZXJzcGFjZSB0aGF0IHRoZSBCU1MgaGFzIHN0b3BwZWQgKi8KKwkJbWVtc2V0KCZ3ZV9jdXN0b21fZXZlbnQsICdcMCcsIHNpemVvZih3ZV9jdXN0b21fZXZlbnQpKTsKKwkJbWVtY3B5KCZ3ZV9jdXN0b21fZXZlbnQsIHN0b3BCc3NFdmVudCwgZXZlbnRfbGVuKTsKKwkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQl3cnF1LmRhdGEubGVuZ3RoID0gZXZlbnRfbGVuOworCQl3ZV9ldmVudCA9IElXRVZDVVNUT007CisJCXdlX2N1c3RvbV9ldmVudF9nZW5lcmljID0gd2VfY3VzdG9tX2V2ZW50OworCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgd2VfZXZlbnQsICZ3cnF1LAorCQkJCSAgICAoY2hhciAqKXdlX2N1c3RvbV9ldmVudF9nZW5lcmljKTsKKwkJY2RzX2R1bXBfY29uY3VycmVuY3lfaW5mbyhwSGRkQ3R4KTsKKwkJLyogU2VuZCBTQ0MvTUNDIFN3aXRjaGluZyBldmVudCB0byBJUEEgKi8KKwkJaGRkX2lwYV9zZW5kX21jY19zY2NfbXNnKHBIZGRDdHgsIHBIZGRDdHgtPm1jY19tb2RlKTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IGhkZF9zb2Z0YXBfdW5wYWNrX2llKHRIYWxIYW5kbGUgaGFsSGFuZGxlLAorCQkJIGVDc3JFbmNyeXB0aW9uVHlwZSAqcEVuY3J5cHRUeXBlLAorCQkJIGVDc3JFbmNyeXB0aW9uVHlwZSAqbWNFbmNyeXB0VHlwZSwKKwkJCSBlQ3NyQXV0aFR5cGUgKnBBdXRoVHlwZSwKKwkJCSBib29sICpwTUZQQ2FwYWJsZSwKKwkJCSBib29sICpwTUZQUmVxdWlyZWQsCisJCQkgdWludDE2X3QgZ2VuX2llX2xlbiwgdWludDhfdCAqZ2VuX2llKQoreworCXREb3QxMWZJRVJTTiBkb3QxMVJTTklFOworCXREb3QxMWZJRVdQQSBkb3QxMVdQQUlFOworCisJdWludDhfdCAqcFJzbkllOworCXVpbnQxNl90IFJTTkllTGVuOworCisJaWYgKE5VTEwgPT0gaGFsSGFuZGxlKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRXJyb3IgaGFIYW5kbGUgcmV0dXJuZWQgTlVMTCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIFZhbGlkaXR5IGNoZWNrcyAqLworCWlmICgoZ2VuX2llX2xlbiA8IENERl9NSU4oRE9UMTFGX0lFX1JTTl9NSU5fTEVOLCBET1QxMUZfSUVfV1BBX01JTl9MRU4pKQorCSAgICB8fCAoZ2VuX2llX2xlbiA+CisJCUNERl9NQVgoRE9UMTFGX0lFX1JTTl9NQVhfTEVOLCBET1QxMUZfSUVfV1BBX01BWF9MRU4pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogVHlwZSBjaGVjayAqLworCWlmIChnZW5faWVbMF0gPT0gRE9UMTFGX0VJRF9SU04pIHsKKwkJLyogVmFsaWRpdHkgY2hlY2tzICovCisJCWlmICgoZ2VuX2llX2xlbiA8IERPVDExRl9JRV9SU05fTUlOX0xFTikgfHwKKwkJICAgIChnZW5faWVfbGVuID4gRE9UMTFGX0lFX1JTTl9NQVhfTEVOKSkgeworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCS8qIFNraXAgcGFzdCB0aGUgRUlEIGJ5dGUgYW5kIGxlbmd0aCBieXRlICovCisJCXBSc25JZSA9IGdlbl9pZSArIDI7CisJCVJTTkllTGVuID0gZ2VuX2llX2xlbiAtIDI7CisJCS8qIFVucGFjayB0aGUgUlNOIElFICovCisJCW1lbXNldCgmZG90MTFSU05JRSwgMCwgc2l6ZW9mKHREb3QxMWZJRVJTTikpOworCQlkb3QxMWZfdW5wYWNrX2llX3JzbigodHBBbmlTaXJHbG9iYWwpIGhhbEhhbmRsZSwKKwkJCQkgICAgIHBSc25JZSwgUlNOSWVMZW4sICZkb3QxMVJTTklFKTsKKwkJLyogQ29weSBvdXQgdGhlIGVuY3J5cHRpb24gYW5kIGF1dGhlbnRpY2F0aW9uIHR5cGVzICovCisJCWhkZExvZyhMT0cxLCBGTCgicGFpcndpc2UgY2lwaGVyIHN1aXRlIGNvdW50OiAlZCIpLAorCQkgICAgICAgZG90MTFSU05JRS5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQpOworCQloZGRMb2coTE9HMSwgRkwoImF1dGhlbnRpY2F0aW9uIHN1aXRlIGNvdW50OiAlZCIpLAorCQkgICAgICAgZG90MTFSU05JRS5ha21fc3VpdGVfY291bnQpOworCQkvKkhlcmUgd2UgaGF2ZSBmb2xsb3dlZCB0aGUgYXBwbGUgYmFzZSBjb2RlLAorCQkgICBidXQgcHJvYmFibHkgSSBzdXNwZWN0IHdlIGNhbiBkbyBzb21ldGhpbmcgZGlmZmVyZW50ICovCisJCS8qIGRvdDExUlNOSUUuYWttX3N1aXRlX2NvdW50ICovCisJCS8qIEp1c3QgdHJhbnNsYXRlIHRoZSBGSVJTVCBvbmUgKi8KKwkJKnBBdXRoVHlwZSA9CisJCQloZGRfdHJhbnNsYXRlX3Jzbl90b19jc3JfYXV0aF90eXBlKGRvdDExUlNOSUUuYWttX3N1aXRlc1swXSk7CisJCS8qIGRvdDExUlNOSUUucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ICovCisJCSpwRW5jcnlwdFR5cGUgPQorCQkJaGRkX3RyYW5zbGF0ZV9yc25fdG9fY3NyX2VuY3J5cHRpb25fdHlwZShkb3QxMVJTTklFLgorCQkJCQkJCQkgcHdpc2VfY2lwaGVyX3N1aXRlc1swXSk7CisJCS8qIGRvdDExUlNOSUUuZ3BfY2lwaGVyX3N1aXRlX2NvdW50ICovCisJCSptY0VuY3J5cHRUeXBlID0KKwkJCWhkZF90cmFuc2xhdGVfcnNuX3RvX2Nzcl9lbmNyeXB0aW9uX3R5cGUoZG90MTFSU05JRS4KKwkJCQkJCQkJIGdwX2NpcGhlcl9zdWl0ZSk7CisJCS8qIFNldCB0aGUgUE1LU0EgSUQgQ2FjaGUgZm9yIHRoaXMgaW50ZXJmYWNlICovCisJCSpwTUZQQ2FwYWJsZSA9IDAgIT0gKGRvdDExUlNOSUUuUlNOX0NhcFswXSAmIDB4ODApOworCQkqcE1GUFJlcXVpcmVkID0gMCAhPSAoZG90MTFSU05JRS5SU05fQ2FwWzBdICYgMHg0MCk7CisJCS8qIENhbGxpbmcgY3NyX3JvYW1fc2V0X3Bta2lkX2NhY2hlIHRvIGNvbmZpZ3VyZSB0aGUgUE1LSURzIGludG8gdGhlIGNhY2hlICovCisJfSBlbHNlIGlmIChnZW5faWVbMF0gPT0gRE9UMTFGX0VJRF9XUEEpIHsKKwkJLyogVmFsaWRpdHkgY2hlY2tzICovCisJCWlmICgoZ2VuX2llX2xlbiA8IERPVDExRl9JRV9XUEFfTUlOX0xFTikgfHwKKwkJICAgIChnZW5faWVfbGVuID4gRE9UMTFGX0lFX1dQQV9NQVhfTEVOKSkgeworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCS8qIFNraXAgcGFzdCB0aGUgRUlEIGJ5dGUgYW5kIGxlbmd0aCBieXRlIC0gYW5kIGZvdXIgYnl0ZSBXaUZpIE9VSSAqLworCQlwUnNuSWUgPSBnZW5faWUgKyAyICsgNDsKKwkJUlNOSWVMZW4gPSBnZW5faWVfbGVuIC0gKDIgKyA0KTsKKwkJLyogVW5wYWNrIHRoZSBXUEEgSUUgKi8KKwkJbWVtc2V0KCZkb3QxMVdQQUlFLCAwLCBzaXplb2YodERvdDExZklFV1BBKSk7CisJCWRvdDExZl91bnBhY2tfaWVfd3BhKCh0cEFuaVNpckdsb2JhbCkgaGFsSGFuZGxlLAorCQkJCSAgICAgcFJzbkllLCBSU05JZUxlbiwgJmRvdDExV1BBSUUpOworCQkvKiBDb3B5IG91dCB0aGUgZW5jcnlwdGlvbiBhbmQgYXV0aGVudGljYXRpb24gdHlwZXMgKi8KKwkJaGRkTG9nKExPRzEsIEZMKCJXUEEgdW5pY2FzdCBjaXBoZXIgc3VpdGUgY291bnQ6ICVkIiksCisJCSAgICAgICBkb3QxMVdQQUlFLnVuaWNhc3RfY2lwaGVyX2NvdW50KTsKKwkJaGRkTG9nKExPRzEsIEZMKCJXUEEgYXV0aGVudGljYXRpb24gc3VpdGUgY291bnQ6ICVkIiksCisJCSAgICAgICBkb3QxMVdQQUlFLmF1dGhfc3VpdGVfY291bnQpOworCQkvKiBkb3QxMVdQQUlFLmF1dGhfc3VpdGVfY291bnQgKi8KKwkJLyogSnVzdCB0cmFuc2xhdGUgdGhlIEZJUlNUIG9uZSAqLworCQkqcEF1dGhUeXBlID0KKwkJCWhkZF90cmFuc2xhdGVfd3BhX3RvX2Nzcl9hdXRoX3R5cGUoZG90MTFXUEFJRS5hdXRoX3N1aXRlc1swXSk7CisJCS8qIGRvdDExV1BBSUUudW5pY2FzdF9jaXBoZXJfY291bnQgKi8KKwkJKnBFbmNyeXB0VHlwZSA9CisJCQloZGRfdHJhbnNsYXRlX3dwYV90b19jc3JfZW5jcnlwdGlvbl90eXBlKGRvdDExV1BBSUUuCisJCQkJCQkJCSB1bmljYXN0X2NpcGhlcnNbMF0pOworCQkvKiBkb3QxMVdQQUlFLnVuaWNhc3RfY2lwaGVyX2NvdW50ICovCisJCSptY0VuY3J5cHRUeXBlID0KKwkJCWhkZF90cmFuc2xhdGVfd3BhX3RvX2Nzcl9lbmNyeXB0aW9uX3R5cGUoZG90MTFXUEFJRS4KKwkJCQkJCQkJIG11bHRpY2FzdF9jaXBoZXIpOworCQkqcE1GUENhcGFibGUgPSBmYWxzZTsKKwkJKnBNRlBSZXF1aXJlZCA9IGZhbHNlOworCX0gZWxzZSB7CisJCWhkZExvZyhMT0dXLCBGTCgiZ2VuX2llWzBdOiAlZCIpLCBnZW5faWVbMF0pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogaGRkX3NvZnRhcF9zZXRfY2hhbm5lbF9jaGFuZ2UoKSAtCisgKiBUaGlzIGZ1bmN0aW9uIHRvIHN1cHBvcnQgU0FQIGNoYW5uZWwgY2hhbmdlIHdpdGggQ1NBIElFCisgKiBzZXQgaW4gdGhlIGJlYWNvbnMuCisgKgorICogQGRldjogcG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAqIEB0YXJnZXRfY2hhbm5lbDogdGFyZ2V0IGNoYW5uZWwgbnVtYmVyLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljCitpbnQgaGRkX3NvZnRhcF9zZXRfY2hhbm5lbF9jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHRhcmdldF9jaGFubmVsKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCWludCByZXQgPSAwOworCWhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJdl9DT05URVhUX3QgcF9jZHNfY29udGV4dCA9CisJCShXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5wY2RzX2NvbnRleHQ7CisjZW5kaWYKKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAocmV0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiaW52YWxpZCBIREQgY29udGV4dCIpKTsKKwkJcmV0ID0gLUVCVVNZOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChwSGRkQ3R4LT5kZnNfcmFkYXJfZm91bmQgPT0gdHJ1ZSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNoYW5uZWwgc3dpdGNoIGluIHByb2dyZXNzISEiKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCS8qCisJICogU2V0IHRoZSBkZnNfcmFkYXJfZm91bmQgZmxhZyB0byBtaW1pYyBjaGFubmVsIGNoYW5nZQorCSAqIHdoZW4gYSByYWRhciBpcyBmb3VuZC4gVGhpcyB3aWxsIGVuYWJsZSBzeW5jaHJvbml6aW5nCisJICogU0FQIGFuZCBIREQgc3RhdGVzIHNpbWlsYXIgdG8gdGhhdCBvZiByYWRhciBpbmRpY2F0aW9uLgorCSAqIFN1c3BlbmQgdGhlIG5ldGlmIHF1ZXVlcyB0byBzdG9wIHF1ZXVpbmcgVHggZnJhbWVzCisJICogZnJvbSB1cHBlciBsYXllcnMuICBuZXRpZiBxdWV1ZXMgd2lsbCBiZSByZXN1bWVkCisJICogb25jZSB0aGUgY2hhbm5lbCBjaGFuZ2UgaXMgY29tcGxldGVkIGFuZCBTQVAgd2lsbAorCSAqIHBvc3QgZVNBUF9TVEFSVF9CU1NfRVZFTlQgc3VjY2VzcyBldmVudCB0byBIREQuCisJICovCisJcEhkZEN0eC0+ZGZzX3JhZGFyX2ZvdW5kID0gdHJ1ZTsKKworCS8qCisJICogUG9zdCB0aGUgQ2hhbm5lbCBDaGFuZ2UgcmVxdWVzdCB0byBTQVAuCisJICovCisJc3RhdHVzID0gd2xhbnNhcF9zZXRfY2hhbm5lbF9jaGFuZ2Vfd2l0aF9jc2EoCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQlXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIKKwkJCShwSG9zdGFwZEFkYXB0ZXIpLAorI2Vsc2UKKwkJcF9jZHNfY29udGV4dCwKKyNlbmRpZgorCQkodWludDMyX3QpCisJCXRhcmdldF9jaGFubmVsKTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIlNBUCBzZXQgY2hhbm5lbCBmYWlsZWQgZm9yIGNoYW5uZWwgPSAlZCIpLAorCQkgICAgICAgdGFyZ2V0X2NoYW5uZWwpOworCQkvKgorCQkgKiBJZiBjaGFubmVsIGNoYW5nZSBjb21tYW5kIGZhaWxzIHRoZW4gY2xlYXIgdGhlCisJCSAqIHJhZGFyIGZvdW5kIGZsYWcgYW5kIGFsc28gcmVzdGFydCB0aGUgbmV0aWYKKwkJICogcXVldWVzLgorCQkgKi8KKworCQlwSGRkQ3R4LT5kZnNfcmFkYXJfZm91bmQgPSBmYWxzZTsKKworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludAorc3RhdGljIF9faXdfc29mdGFwX3NldF9pbmlfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlDREZfU1RBVFVTIHZzdGF0dXM7CisJaW50IHJldCA9IDA7ICAgICAgICAgICAgLyogc3VjY2VzcyAqLworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkgeworCQloZGRMb2coTE9HRSwgRkwoInBBZGFwdGVyIGlzIE5VTEwhIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaGRkTG9nKExPRzEsIEZMKCJSZWNlaXZlZCBkYXRhICVzIiksIGV4dHJhKTsKKworCXZzdGF0dXMgPSBoZGRfZXhlY3V0ZV9nbG9iYWxfY29uZmlnX2NvbW1hbmQocEhkZEN0eCwgZXh0cmEpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gdnN0YXR1cykgeworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludAorc3RhdGljIGl3X3NvZnRhcF9zZXRfaW5pX2NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NvZnRhcF9zZXRfaW5pX2NmZyhkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK3N0YXRpYyBfX2l3X3NvZnRhcF9nZXRfaW5pX2NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCWludCByZXQgPSAwOworCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gcmV0OworCX0KKwloZGRMb2coTE9HMSwgRkwoIlByaW50aW5nIENMRCBnbG9iYWwgSU5JIENvbmZpZyIpKTsKKwloZGRfY2ZnX2dldF9nbG9iYWxfY29uZmlnKHBIZGRDdHgsIGV4dHJhLCBRQ1NBUF9JT0NUTF9NQVhfU1RSX0xFTik7CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKworCXJldHVybiAwOworfQorCitpbnQKK3N0YXRpYyBpd19zb2Z0YXBfZ2V0X2luaV9jZmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zb2Z0YXBfZ2V0X2luaV9jZmcoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2l3X3NvZnRhcF9zZXRfdHdvX2ludHNfZ2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwlpbnQgKnZhbHVlID0gKGludCAqKWV4dHJhOworCWludCBzdWJfY21kID0gdmFsdWVbMF07CisJaW50IHJldCA9IDA7CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQhIikpOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKHN1Yl9jbWQpIHsKKyNpZmRlZiBERUJVRworCWNhc2UgUUNTQVBfSU9DVExfU0VUX0ZXX0NSQVNIX0lOSkVDVDoKKwkJaGRkTG9nKExPR0UsICJXRV9TRVRfRldfQ1JBU0hfSU5KRUNUOiAlZCAlZCIsCisJCSAgICAgICB2YWx1ZVsxXSwgdmFsdWVbMl0pOworCQlyZXQgPSB3bWFfY2xpX3NldDJfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICBHRU5fUEFSQU1fQ1JBU0hfSU5KRUNULAorCQkJCQkgICB2YWx1ZVsxXSwgdmFsdWVbMl0sCisJCQkJCSAgIEdFTl9DTUQpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgUUNTQVBfSU9DVExfRFVNUF9EUF9UUkFDRV9MRVZFTDoKKwkJaGRkX2luZm8oIldFX0RVTVBfRFBfVFJBQ0U6ICVkICVkIiwKKwkJICAgICAgIHZhbHVlWzFdLCB2YWx1ZVsyXSk7CisJCWlmICh2YWx1ZVsxXSA9PSBEVU1QX0RQX1RSQUNFKQorCQkJY2RmX2RwX3RyYWNlX2R1bXBfYWxsKHZhbHVlWzJdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIElPQ1RMIGNvbW1hbmQgJWQiKSwgc3ViX2NtZCk7CisJCWJyZWFrOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXdfc29mdGFwX3NldF90d29faW50c19nZXRub25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NvZnRhcF9zZXRfdHdvX2ludHNfZ2V0bm9uZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwcmludF9tYWNfbGlzdChzdHJ1Y3QgY2RmX21hY19hZGRyICptYWNMaXN0LCB1aW50OF90IHNpemUpCit7CisJaW50IGk7CisJdWludDhfdCAqbWFjQXJyYXk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCW1hY0FycmF5ID0gKG1hY0xpc3QgKyBpKS0+Ynl0ZXM7CisJCXByX2luZm8oIioqIEFDTCBlbnRyeSAlaSAtICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKwkJCWksIE1BQ19BRERSX0FSUkFZKG1hY0FycmF5KSk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIENERl9TVEFUVVMgaGRkX3ByaW50X2FjbChoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIpCit7CisJZVNhcE1hY0FkZHJBQ0wgYWNsX21vZGU7CisJc3RydWN0IGNkZl9tYWNfYWRkciBNYWNMaXN0W01BWF9BQ0xfTUFDX0FERFJFU1NdOworCXVpbnQ4X3QgbGlzdG51bTsKKwl2b2lkICpwX2Nkc19nY3R4ID0gTlVMTDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwlwX2Nkc19nY3R4ID0gV0xBTl9IRERfR0VUX1NBUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcik7CisjZWxzZQorCXBfY2RzX2djdHggPSAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+cGNkc19jb250ZXh0OworI2VuZGlmCisJY2RmX21lbV96ZXJvKCZNYWNMaXN0WzBdLCBzaXplb2YoTWFjTGlzdCkpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gd2xhbnNhcF9nZXRfYWNsX21vZGUocF9jZHNfZ2N0eCwgJmFjbF9tb2RlKSkgeworCQlwcl9pbmZvKCIqKioqKioqKiBBQ0wgTU9ERSAqKioqKioqKipcbiIpOworCQlzd2l0Y2ggKGFjbF9tb2RlKSB7CisJCWNhc2UgZVNBUF9BQ0NFUFRfVU5MRVNTX0RFTklFRDoKKwkJCXByX2luZm8oIkFDTCBNb2RlID0gQUNDRVBUX1VOTEVTU19ERU5JRURcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgZVNBUF9ERU5ZX1VOTEVTU19BQ0NFUFRFRDoKKwkJCXByX2luZm8oIkFDTCBNb2RlID0gREVOWV9VTkxFU1NfQUNDRVBURURcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgZVNBUF9TVVBQT1JUX0FDQ0VQVF9BTkRfREVOWToKKwkJCXByX2luZm8oIkFDTCBNb2RlID0gQUNDRVBUX0FORF9ERU5ZXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIGVTQVBfQUxMT1dfQUxMOgorCQkJcHJfaW5mbygiQUNMIE1vZGUgPSBBTExPV19BTExcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9pbmZvKCJJbnZhbGlkIFNBUCBBQ0wgTW9kZSA9ICVkXG4iLCBhY2xfbW9kZSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSB3bGFuc2FwX2dldF9hY2xfYWNjZXB0X2xpc3QocF9jZHNfZ2N0eCwKKwkJCQkJCQkgICAgICAmTWFjTGlzdFswXSwKKwkJCQkJCQkgICAgICAmbGlzdG51bSkpIHsKKwkJcHJfaW5mbygiKioqKioqKiBXSElURSBMSVNUICoqKioqKioqKioqXG4iKTsKKwkJaWYgKGxpc3RudW0gPD0gTUFYX0FDTF9NQUNfQUREUkVTUykKKwkJCXByaW50X21hY19saXN0KCZNYWNMaXN0WzBdLCBsaXN0bnVtKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSB3bGFuc2FwX2dldF9hY2xfZGVueV9saXN0KHBfY2RzX2djdHgsCisJCQkJCQkJICAgICZNYWNMaXN0WzBdLAorCQkJCQkJCSAgICAmbGlzdG51bSkpIHsKKwkJcHJfaW5mbygiKioqKioqKiBCTEFDSyBMSVNUICoqKioqKioqKioqXG4iKTsKKwkJaWYgKGxpc3RudW0gPD0gTUFYX0FDTF9NQUNfQUREUkVTUykKKwkJCXByaW50X21hY19saXN0KCZNYWNMaXN0WzBdLCBsaXN0bnVtKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludAorc3RhdGljIF9faXdfc29mdGFwX3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisJdEhhbEhhbmRsZSBoSGFsOworCWludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisJaW50IHN1Yl9jbWQgPSB2YWx1ZVswXTsKKwlpbnQgc2V0X3ZhbHVlID0gdmFsdWVbMV07CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaW50IHJldCA9IDA7ICAgICAgICAgICAgLyogc3VjY2VzcyAqLworCXZfQ09OVEVYVF90IHBfY2RzX2NvbnRleHQ7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQgcmV0OiVkIiksIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCWlmICghaEhhbCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhhbCBjdHggaXMgbnVsbCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcF9jZHNfY29udGV4dCA9IGhkZF9jdHgtPnBjZHNfY29udGV4dDsKKwlpZiAoIXBfY2RzX2NvbnRleHQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjZHMgY3R4IGlzIG51bGwiKSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXN3aXRjaCAoc3ViX2NtZCkgeworCWNhc2UgUUNBU0FQX1NFVF9SQURBUl9EQkc6CisJCWhkZExvZyhMT0cxLCBGTCgiUUNBU0FQX1NFVF9SQURBUl9EQkcgY2FsbGVkIHdpdGg6IHZhbHVlOiAlZCIpLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJd2xhbl9zYXBfZW5hYmxlX3BoeV9lcnJvcl9sb2dzKGhIYWwsIChib29sKSBzZXRfdmFsdWUpOworCQlicmVhazsKKworCWNhc2UgUUNTQVBfUEFSQU1fQ0xSX0FDTDoKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSB3bGFuc2FwX2NsZWFyX2FjbCgKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJCQkgICAgV0xBTl9IRERfR0VUX1NBUF9DVFhfUFRSCisJCQkJICAgIChwSG9zdGFwZEFkYXB0ZXIpCisjZWxzZQorCQkJICAgIHBfY2RzX2NvbnRleHQKKyNlbmRpZgorCQkJICAgICkpIHsKKwkJCXJldCA9IC1FSU87CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFFDU0FQX1BBUkFNX0FDTF9NT0RFOgorCQlpZiAoKGVTQVBfQUxMT1dfQUxMIDwgKGVTYXBNYWNBZGRyQUNMKSBzZXRfdmFsdWUpIHx8CisJCSAgICAoZVNBUF9BQ0NFUFRfVU5MRVNTX0RFTklFRCA+IChlU2FwTWFjQWRkckFDTCkgc2V0X3ZhbHVlKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIEFDTCBNb2RlIHZhbHVlICVkIiksCisJCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0gZWxzZSB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQkJd2xhbnNhcF9zZXRfbW9kZShXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIKKwkJCQkJCSAocEhvc3RhcGRBZGFwdGVyKSwgc2V0X3ZhbHVlKTsKKyNlbHNlCisJCQl3bGFuc2FwX3NldF9tb2RlKHBfY2RzX2NvbnRleHQsIHNldF92YWx1ZSk7CisjZW5kaWYKKworCQl9CisJCWJyZWFrOworCisJY2FzZSBRQ1NBUF9QQVJBTV9TRVRfQ0hBTk5FTF9DSEFOR0U6CisJCWlmIChXTEFOX0hERF9TT0ZUQVAgPT0gcEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQkJaGRkTG9nKExPRzEsCisJCQkgICAgICAgIlNFVCBTQVAgQ2hhbm5lbCBDaGFuZ2UgdG8gbmV3IGNoYW5uZWw9ICVkIiwKKwkJCSAgICAgICBzZXRfdmFsdWUpOworCQkJcmV0ID0gaGRkX3NvZnRhcF9zZXRfY2hhbm5lbF9jaGFuZ2UoZGV2LCBzZXRfdmFsdWUpOworCQl9IGVsc2UgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoIkNoYW5uZWwgQ2hhbmdlIEZhaWxlZCwgRGV2aWNlIGluIHRlc3QgbW9kZSIpKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBRQ1NBUF9QQVJBTV9BVVRPX0NIQU5ORUw6CisJCWlmIChzZXRfdmFsdWUgPT0gMCB8fCBzZXRfdmFsdWUgPT0gMSkKKwkJCShXTEFOX0hERF9HRVRfQ1RYKAorCQkJCXBIb3N0YXBkQWRhcHRlcikpLT5jb25maWctPmZvcmNlX3NhcF9hY3MgPQorCQkJCQkJCQlzZXRfdmFsdWU7CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBRQ1NBUF9QQVJBTV9NQVhfQVNTT0M6CisJCWlmIChXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVF9TVEFNSU4gPiBzZXRfdmFsdWUpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBzZXRNYXhBc3NvYyB2YWx1ZSAlZCIpLAorCQkJICAgICAgIHNldF92YWx1ZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJaWYgKFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQU1BWCA8IHNldF92YWx1ZSkgeworCQkJCWhkZExvZyhMT0dXLAorCQkJCSAgICAgICBGTCgic2V0TWF4QXNzb2MgJWQgPiBtYXggYWxsb3dlZCAlZC4iKSwKKwkJCQkgICAgICAgc2V0X3ZhbHVlLAorCQkJCSAgICAgICBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVF9TVEFNQVgpOworCQkJCWhkZExvZyhMT0dXLAorCQkJCSAgICAgICBGTCgiU2V0dGluZyBpdCB0byBtYXggYWxsb3dlZCBhbmQgY29udGludWluZyIpKTsKKwkJCQlzZXRfdmFsdWUgPSBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVF9TVEFNQVg7CisJCQl9CisJCQlzdGF0dXMgPSBzbWVfY2ZnX3NldF9pbnQoaEhhbCwgV05JX0NGR19BU1NPQ19TVEFfTElNSVQsCisJCQkJCXNldF92YWx1ZSk7CisJCQlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgic2V0TWF4QXNzb2MgZmFpbHVyZSwgc3RhdHVzICVkIiksCisJCQkJICAgICAgIHN0YXR1cyk7CisJCQkJcmV0ID0gLUVJTzsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgUUNTQVBfUEFSQU1fSElERV9TU0lEOgorCXsKKwkJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCXN0YXR1cyA9CisJCQlzbWVfaGlkZV9zc2lkKGhIYWwsIHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCSAgICAgIHNldF92YWx1ZSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQloZGRMb2coTE9HRSwgRkwoIlFDU0FQX1BBUkFNX0hJREVfU1NJRCBmYWlsZWQiKSk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFFDU0FQX1BBUkFNX1NFVF9NQ19SQVRFOgorCXsKKwkJdFNpclJhdGVVcGRhdGVJbmQgcmF0ZVVwZGF0ZSA9IHswfTsKKwkJc3RydWN0IGhkZF9jb25maWcgKnBDb25maWcgPSBoZGRfY3R4LT5jb25maWc7CisKKwkJaGRkTG9nKExPRzEsICJNQyBUYXJnZXQgcmF0ZSAlZCIsIHNldF92YWx1ZSk7CisJCW1lbWNweShyYXRlVXBkYXRlLmJzc2lkLAorCQkgICAgICAgcEhvc3RhcGRBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcywKKwkJICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlyYXRlVXBkYXRlLm5zcyA9IChwQ29uZmlnLT5lbmFibGUyeDIgPT0gMCkgPyAwIDogMTsKKwkJcmF0ZVVwZGF0ZS5kZXZfbW9kZSA9IHBIb3N0YXBkQWRhcHRlci0+ZGV2aWNlX21vZGU7CisJCXJhdGVVcGRhdGUubWNhc3REYXRhUmF0ZTI0R0h6ID0gc2V0X3ZhbHVlOworCQlyYXRlVXBkYXRlLm1jYXN0RGF0YVJhdGUyNEdIelR4RmxhZyA9IDE7CisJCXJhdGVVcGRhdGUubWNhc3REYXRhUmF0ZTVHSHogPSBzZXRfdmFsdWU7CisJCXJhdGVVcGRhdGUuYmNhc3REYXRhUmF0ZSA9IC0xOworCQlzdGF0dXMgPSBzbWVfc2VuZF9yYXRlX3VwZGF0ZV9pbmQoaEhhbCwgJnJhdGVVcGRhdGUpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJTRVRfTUNfUkFURSBmYWlsZWQiKSk7CisJCQlyZXQgPSAtMTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX1BBUkFNX1NFVF9UWFJYX0ZXX1NUQVRTOgorCXsKKwkJaGRkTG9nKExPRzEsICJRQ1NBUF9QQVJBTV9TRVRfVFhSWF9GV19TVEFUUyB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNQV9WREVWX1RYUlhfRldTVEFUU19FTkFCTEVfQ01ESUQsCisJCQkJCSAgc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJCWJyZWFrOworCX0KKwkvKiBGaXJtd2FyZSBkZWJ1ZyBsb2cgKi8KKwljYXNlIFFDU0FQX0RCR0xPR19MT0dfTEVWRUw6CisJeworCQloZGRMb2coTE9HMSwgIlFDU0FQX0RCR0xPR19MT0dfTEVWRUwgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfREJHTE9HX0xPR19MRVZFTCwKKwkJCQkJICBzZXRfdmFsdWUsIERCR19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0RCR0xPR19WQVBfRU5BQkxFOgorCXsKKwkJaGRkTG9nKExPRzEsICJRQ1NBUF9EQkdMT0dfVkFQX0VOQUJMRSB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9EQkdMT0dfVkFQX0VOQUJMRSwKKwkJCQkJICBzZXRfdmFsdWUsIERCR19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0RCR0xPR19WQVBfRElTQUJMRToKKwl7CisJCWhkZExvZyhMT0cxLCAiUUNTQVBfREJHTE9HX1ZBUF9ESVNBQkxFIHZhbCAlZCIsIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX0RCR0xPR19WQVBfRElTQUJMRSwKKwkJCQkJICBzZXRfdmFsdWUsIERCR19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0RCR0xPR19NT0RVTEVfRU5BQkxFOgorCXsKKwkJaGRkTG9nKExPRzEsICJRQ1NBUF9EQkdMT0dfTU9EVUxFX0VOQUJMRSB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9EQkdMT0dfTU9EVUxFX0VOQUJMRSwKKwkJCQkJICBzZXRfdmFsdWUsIERCR19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0RCR0xPR19NT0RVTEVfRElTQUJMRToKKwl7CisJCWhkZExvZyhMT0cxLCAiUUNTQVBfREJHTE9HX01PRFVMRV9ESVNBQkxFIHZhbCAlZCIsIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX0RCR0xPR19NT0RVTEVfRElTQUJMRSwKKwkJCQkJICBzZXRfdmFsdWUsIERCR19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0RCR0xPR19NT0RfTE9HX0xFVkVMOgorCXsKKwkJaGRkTG9nKExPRzEsICJRQ1NBUF9EQkdMT0dfTU9EX0xPR19MRVZFTCB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9EQkdMT0dfTU9EX0xPR19MRVZFTCwKKwkJCQkJICBzZXRfdmFsdWUsIERCR19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0RCR0xPR19UWVBFOgorCXsKKwkJaGRkTG9nKExPRzEsICJRQ1NBUF9EQkdMT0dfVFlQRSB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9EQkdMT0dfVFlQRSwKKwkJCQkJICBzZXRfdmFsdWUsIERCR19DTUQpOworCQlicmVhazsKKwl9CisJY2FzZSBRQ1NBUF9EQkdMT0dfUkVQT1JUX0VOQUJMRToKKwl7CisJCWhkZExvZyhMT0cxLCAiUUNTQVBfREJHTE9HX1JFUE9SVF9FTkFCTEUgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfREJHTE9HX1JFUE9SVF9FTkFCTEUsCisJCQkJCSAgc2V0X3ZhbHVlLCBEQkdfQ01EKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgUUNTQVBfUEFSQU1fU0VUX01DQ19DSEFOTkVMX0xBVEVOQ1k6CisJeworCQljZHNfc2V0X21jY19sYXRlbmN5KHBIb3N0YXBkQWRhcHRlciwgc2V0X3ZhbHVlKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ1NBUF9QQVJBTV9TRVRfTUNDX0NIQU5ORUxfUVVPVEE6CisJeworCQloZGRMb2coTE9HMSwKKwkJICAgICAgIEZMKCJpd3ByaXYgY21kIHRvIHNldCBNQ0MgcXVvdGEgdmFsdWUgJWRtcyIpLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gY2RzX2dvX3NldF9tY2NfcDJwX3F1b3RhKHBIb3N0YXBkQWRhcHRlciwKKwkJCQkJCSAgICBzZXRfdmFsdWUpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDQVNBUF9UWFJYX0ZXU1RBVFNfUkVTRVQ6CisJeworCQloZGRMb2coTE9HMSwgIldFX1RYUlhfRldTVEFUU19SRVNFVCB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNQV9WREVWX1RYUlhfRldTVEFUU19SRVNFVF9DTURJRCwKKwkJCQkJICBzZXRfdmFsdWUsIFZERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ1NBUF9QQVJBTV9SVFNDVFM6CisJeworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BBUkFNX0VOQUJMRV9SVFNDVFMsCisJCQkJCSAgc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJCWlmIChyZXQpIHsKKwkJCWhkZExvZyhMT0dFLCAiRkFJTEVEIFRPIFNFVCBSVFNDVFMgYXQgU0FQIik7CisJCQlyZXQgPSAtRUlPOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFFDQVNBUF9TRVRfMTFOX1JBVEU6CisJeworCQl1aW50OF90IHByZWFtYmxlID0gMCwgbnNzID0gMCwgcml4ID0gMDsKKwkJdHNhcF9Db25maWdfdCAqcENvbmZpZyA9CisJCQkmcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnNhcENvbmZpZzsKKworCQloZGRMb2coTE9HMSwgIlNFVF9IVF9SQVRFIHZhbCAlZCIsIHNldF92YWx1ZSk7CisKKwkJaWYgKHNldF92YWx1ZSAhPSAweGZmKSB7CisJCQlyaXggPSBSQ18yX1JBVEVfSURYKHNldF92YWx1ZSk7CisJCQlpZiAoc2V0X3ZhbHVlICYgMHg4MCkgeworCQkJCWlmIChwQ29uZmlnLT5TYXBId19tb2RlID09CisJCQkJICAgIGVDU1JfRE9UMTFfTU9ERV8xMWIKKwkJCQkgICAgfHwgcENvbmZpZy0+U2FwSHdfbW9kZSA9PQorCQkJCSAgICBlQ1NSX0RPVDExX01PREVfMTFiX09OTFkKKwkJCQkgICAgfHwgcENvbmZpZy0+U2FwSHdfbW9kZSA9PQorCQkJCSAgICBlQ1NSX0RPVDExX01PREVfMTFnCisJCQkJICAgIHx8IHBDb25maWctPlNhcEh3X21vZGUgPT0KKwkJCQkgICAgZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZCisJCQkJICAgIHx8IHBDb25maWctPlNhcEh3X21vZGUgPT0KKwkJCQkgICAgZUNTUl9ET1QxMV9NT0RFX2FiZworCQkJCSAgICB8fCBwQ29uZmlnLT5TYXBId19tb2RlID09CisJCQkJICAgIGVDU1JfRE9UMTFfTU9ERV8xMWEpIHsKKwkJCQkJaGRkTG9nKExPR0UsCisJCQkJCSAgICAgICAiTm90IHZhbGlkIG1vZGUgZm9yIEhUIik7CisJCQkJCXJldCA9IC1FSU87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwcmVhbWJsZSA9IFdNSV9SQVRFX1BSRUFNQkxFX0hUOworCQkJCW5zcyA9IEhUX1JDXzJfU1RSRUFNUyhzZXRfdmFsdWUpIC0gMTsKKwkJCX0gZWxzZSBpZiAoc2V0X3ZhbHVlICYgMHgxMCkgeworCQkJCWlmIChwQ29uZmlnLT5TYXBId19tb2RlID09CisJCQkJICAgIGVDU1JfRE9UMTFfTU9ERV8xMWEpIHsKKwkJCQkJaGRkTG9nKExPR0UsICJOb3QgdmFsaWQgZm9yIGNjayIpOworCQkJCQlyZXQgPSAtRUlPOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcHJlYW1ibGUgPSBXTUlfUkFURV9QUkVBTUJMRV9DQ0s7CisJCQkJLyogRW5hYmxlIFNob3J0IHByZWFtYmxlIGFsd2F5cworCQkJCSAqIGZvciBDQ0sgZXhjZXB0IDFtYnBzCisJCQkJICovCisJCQkJaWYgKHJpeCAhPSAweDMpCisJCQkJCXJpeCB8PSAweDQ7CisJCQl9IGVsc2UgeworCQkJCWlmIChwQ29uZmlnLT5TYXBId19tb2RlID09CisJCQkJICAgIGVDU1JfRE9UMTFfTU9ERV8xMWIKKwkJCQkgICAgfHwgcENvbmZpZy0+U2FwSHdfbW9kZSA9PQorCQkJCSAgICBlQ1NSX0RPVDExX01PREVfMTFiX09OTFkpIHsKKwkJCQkJaGRkTG9nKExPR0UsICJOb3QgdmFsaWQgZm9yIE9GRE0iKTsKKwkJCQkJcmV0ID0gLUVJTzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXByZWFtYmxlID0gV01JX1JBVEVfUFJFQU1CTEVfT0ZETTsKKwkJCX0KKwkJCXNldF92YWx1ZSA9IChwcmVhbWJsZSA8PCA2KSB8IChuc3MgPDwgNCkgfCByaXg7CisJCX0KKwkJaGRkTG9nKExPRzEsICJTRVRfSFRfUkFURSB2YWwgJWQgcml4ICVkIHByZWFtYmxlICV4IG5zcyAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUsIHJpeCwgcHJlYW1ibGUsIG5zcyk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fRklYRURfUkFURSwKKwkJCQkJICBzZXRfdmFsdWUsIFZERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ0FTQVBfU0VUX1ZIVF9SQVRFOgorCXsKKwkJdWludDhfdCBwcmVhbWJsZSA9IDAsIG5zcyA9IDAsIHJpeCA9IDA7CisJCXRzYXBfQ29uZmlnX3QgKnBDb25maWcgPQorCQkJJnBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWc7CisKKwkJaWYgKHBDb25maWctPlNhcEh3X21vZGUgIT0gZUNTUl9ET1QxMV9NT0RFXzExYWMgJiYKKwkJICAgIHBDb25maWctPlNhcEh3X21vZGUgIT0gZUNTUl9ET1QxMV9NT0RFXzExYWNfT05MWSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoIlNFVF9WSFRfUkFURSBlcnJvcjogU2FwSHdfbW9kZT0gMHgleCwgY2ggPSAlZCIpLAorCQkJICAgICAgIHBDb25maWctPlNhcEh3X21vZGUsIHBDb25maWctPmNoYW5uZWwpOworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNldF92YWx1ZSAhPSAweGZmKSB7CisJCXJpeCA9IFJDXzJfUkFURV9JRFhfMTFBQyhzZXRfdmFsdWUpOworCQlwcmVhbWJsZSA9IFdNSV9SQVRFX1BSRUFNQkxFX1ZIVDsKKwkJbnNzID0gSFRfUkNfMl9TVFJFQU1TXzExQUMoc2V0X3ZhbHVlKSAtIDE7CisKKwkJCXNldF92YWx1ZSA9IChwcmVhbWJsZSA8PCA2KSB8IChuc3MgPDwgNCkgfCByaXg7CisJCX0KKwkJaGRkTG9nKExPRzEsICJTRVRfVkhUX1JBVEUgdmFsICVkIHJpeCAlZCBwcmVhbWJsZSAleCBuc3MgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlLCByaXgsIHByZWFtYmxlLCBuc3MpOworCisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fRklYRURfUkFURSwKKwkJCQkJICBzZXRfdmFsdWUsIFZERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ0FTQVBfU0hPUlRfR0k6CisJeworCQloZGRMb2coTE9HMSwgIlFDQVNBUF9TRVRfU0hPUlRfR0kgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKworCQkvKiBzYW1lIGFzIDQwTUhaICovCisJCXJldCA9IHNtZV91cGRhdGVfaHRfY29uZmlnKGhIYWwsIHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NIT1JUX0dJXzIwTUhaLAorCQkJCQkgICBzZXRfdmFsdWUpOworCQlpZiAocmV0KQorCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIkZhaWxlZCB0byBzZXQgU2hvcnRHSSB2YWx1ZSByZXQoJWQpIiwgcmV0KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ1NBUF9TRVRfQU1QRFU6CisJeworCQloZGRMb2coTE9HMSwgIlFDU0FQX1NFVF9BTVBEVSAlZCIsIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgR0VOX1ZERVZfUEFSQU1fQU1QRFUsCisJCQkJCSAgc2V0X3ZhbHVlLCBHRU5fQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ1NBUF9TRVRfQU1TRFU6CisJeworCQloZGRMb2coTE9HMSwgIlFDU0FQX1NFVF9BTVNEVSAlZCIsIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgR0VOX1ZERVZfUEFSQU1fQU1TRFUsCisJCQkJCSAgc2V0X3ZhbHVlLCBHRU5fQ01EKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgUUNTQVBfR1RYX0hUX01DUzoKKwl7CisJCWhkZExvZyhMT0cxLCAiV01JX1ZERVZfUEFSQU1fR1RYX0hUX01DUyAlZCIsIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fR1RYX0hUX01DUywKKwkJCQkJICBzZXRfdmFsdWUsIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0dUWF9WSFRfTUNTOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfVkRFVl9QQVJBTV9HVFhfVkhUX01DUyAlZCIsIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fR1RYX1ZIVF9NQ1MsCisJCQkJCQlzZXRfdmFsdWUsIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0dUWF9VU1JDRkc6CisJeworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BBUkFNX0dUWF9VU1JfQ0ZHICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfVkRFVl9QQVJBTV9HVFhfVVNSX0NGRywKKwkJCQkJICBzZXRfdmFsdWUsIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0dUWF9USFJFOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfVkRFVl9QQVJBTV9HVFhfVEhSRSAlZCIsIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fR1RYX1RIUkUsCisJCQkJCSAgc2V0X3ZhbHVlLCBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ1NBUF9HVFhfTUFSR0lOOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfVkRFVl9QQVJBTV9HVFhfTUFSR0lOICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfVkRFVl9QQVJBTV9HVFhfTUFSR0lOLAorCQkJCQkgIHNldF92YWx1ZSwgR1RYX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgUUNTQVBfR1RYX1NURVA6CisJeworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BBUkFNX0dUWF9TVEVQICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfVkRFVl9QQVJBTV9HVFhfU1RFUCwKKwkJCQkJICBzZXRfdmFsdWUsIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0dUWF9NSU5UUEM6CisJeworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BBUkFNX0dUWF9NSU5UUEMgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BBUkFNX0dUWF9NSU5UUEMsCisJCQkJCSAgc2V0X3ZhbHVlLCBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ1NBUF9HVFhfQldNQVNLOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfVkRFVl9QQVJBTV9HVFhfQldNQVNLICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfVkRFVl9QQVJBTV9HVFhfQldfTUFTSywKKwkJCQkJICBzZXRfdmFsdWUsIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisJY2FzZSBRQ0FTQVBfU0VUX0RFQlVHX0xPRzoKKwl7CisJCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPQorCQkJV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCisJCWhkZExvZyhMT0cxLCAiUUNBU0FQX1NFVF9ERUJVR19MT0cgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJLyogVHJhY2UgYnVmZmVyIGR1bXAgb25seSAqLworCQlpZiAoQ0RTX1BLVF9UUkFDX0RVTVBfQ01EID09IHNldF92YWx1ZSkgeworCQkJY2RzX3BrdF90cmFjZV9idWZfZHVtcCgpOworCQkJYnJlYWs7CisJCX0KKwkJcEhkZEN0eC0+Y29uZmlnLT5nRW5hYmxlRGVidWdMb2cgPSBzZXRfdmFsdWU7CisJCWJyZWFrOworCX0KKyNlbmRpZiAvKiBRQ0FfUEtUX1BST1RPX1RSQUNFICovCisKKwljYXNlIFFDQVNBUF9TRVRfVE1fTEVWRUw6CisJeworCQloZGRMb2coTE9HMSwgIlNldCBUaGVybWFsIE1pdGlnYXRpb24gTGV2ZWwgJWQiLCBzZXRfdmFsdWUpOworCQkodm9pZClzbWVfc2V0X3RoZXJtYWxfbGV2ZWwoaEhhbCwgc2V0X3ZhbHVlKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ0FTQVBfU0VUX0RGU19JR05PUkVfQ0FDOgorCXsKKwkJaGRkTG9nKExPRzEsICJTZXQgRGZzIGlnbm9yZSBDQUMgICVkIiwgc2V0X3ZhbHVlKTsKKworCQlpZiAocEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZSAhPSBXTEFOX0hERF9TT0ZUQVApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXQgPSB3bGFuc2FwX3NldF9kZnNfaWdub3JlX2NhYyhoSGFsLCBzZXRfdmFsdWUpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDQVNBUF9TRVRfREZTX1RBUkdFVF9DSE5MOgorCXsKKwkJaGRkTG9nKExPRzEsICJTZXQgRGZzIHRhcmdldCBjaGFubmVsICAlZCIsIHNldF92YWx1ZSk7CisKKwkJaWYgKHBIb3N0YXBkQWRhcHRlci0+ZGV2aWNlX21vZGUgIT0gV0xBTl9IRERfU09GVEFQKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0ID0gd2xhbnNhcF9zZXRfZGZzX3RhcmdldF9jaG5sKGhIYWwsIHNldF92YWx1ZSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgUUNBU0FQX1NFVF9ERlNfTk9MOgorCQl3bGFuc2FwX3NldF9kZnNfbm9sKAorI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJCVdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUgorCQkJCShwSG9zdGFwZEFkYXB0ZXIpLAorI2Vsc2UKKwkJCXBfY2RzX2NvbnRleHQsCisjZW5kaWYKKwkJCShlU2FwRGZzTm9sVHlwZSkgc2V0X3ZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIFFDQVNBUF9TRVRfUkFEQVJfQ01EOgorCXsKKwkJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9CisJCQlXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJCXVpbnQ4X3QgY2ggPQorCQkJKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcikpLT4KKwkJCW9wZXJhdGluZ0NoYW5uZWw7CisJCWJvb2wgaXNEZnNjaDsKKworCQlpc0Rmc2NoID0gKENIQU5ORUxfU1RBVEVfREZTID09CisJCQkgICBjZHNfZ2V0X2NoYW5uZWxfc3RhdGUoY2gpKTsKKworCQloZGRMb2coTE9HMSwgRkwoIlNldCBRQ0FTQVBfU0VUX1JBREFSX0NNRCB2YWwgJWQiKSwgc2V0X3ZhbHVlKTsKKworCQlpZiAoIXBIZGRDdHgtPmRmc19yYWRhcl9mb3VuZCAmJiBpc0Rmc2NoKSB7CisJCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJICBXTUFfVkRFVl9ERlNfQ09OVFJPTF9DTURJRCwKKwkJCQkJCSAgc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJCX0gZWxzZSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTCgiSWdub3JlLCByYWRhcl9mb3VuZDogJWQsICBkZnNfY2hhbm5lbDogJWQiKSwKKwkJCSAgICAgICBwSGRkQ3R4LT5kZnNfcmFkYXJfZm91bmQsIGlzRGZzY2gpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFFDQVNBUF9UWF9DSEFJTk1BU0tfQ01EOgorCXsKKwkJaGRkTG9nKExPRzEsICJRQ0FTQVBfVFhfQ0hBSU5NQVNLX0NNRCB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9QREVWX1BBUkFNX1RYX0NIQUlOX01BU0ssCisJCQkJCSAgc2V0X3ZhbHVlLCBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgUUNBU0FQX1JYX0NIQUlOTUFTS19DTUQ6CisJeworCQloZGRMb2coTE9HMSwgIlFDQVNBUF9SWF9DSEFJTk1BU0tfQ01EIHZhbCAlZCIsIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1BERVZfUEFSQU1fUlhfQ0hBSU5fTUFTSywKKwkJCQkJICBzZXRfdmFsdWUsIFBERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ0FTQVBfTlNTX0NNRDoKKwl7CisJCWhkZExvZyhMT0cxLCAiUUNBU0FQX05TU19DTUQgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfVkRFVl9QQVJBTV9OU1MsCisJCQkJCSAgc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgUUNTQVBfSVBBX1VDX1NUQVQ6CisJeworCQkvKiBJZiBpbnB1dCB2YWx1ZSBpcyBub24temVybyBnZXQgc3RhdHMgKi8KKwkJc3dpdGNoIChzZXRfdmFsdWUpIHsKKwkJY2FzZSAxOgorCQkJaGRkX2lwYV91Y19zdGF0X3JlcXVlc3QocEhvc3RhcGRBZGFwdGVyLCBzZXRfdmFsdWUpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWhkZF9pcGFfdWNfcnRfZGVidWdfaG9zdF9kdW1wKAorCQkJCQlXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBwbGFjZSBob2xkZXIgZm9yIHN0YXRzIGNsZWFuIHVwCisJCQkgKiBTdGF0cyBjbGVhbiBub3QgaW1wbGVtZW50ZWQgeWV0IG9uIGZpcm13YXJlIGFuZCBpcGEKKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwljYXNlIFFDQVNBUF9TRVRfUEhZTU9ERToKKwl7CisJCWhkZF9jb250ZXh0X3QgKnBoZGRjdHggPQorCQkJV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCisJCXJldCA9CisJCQl3bGFuX2hkZF91cGRhdGVfcGh5bW9kZShkZXYsIGhIYWwsIHNldF92YWx1ZSwKKwkJCQkJCXBoZGRjdHgpOworCQlicmVhazsKKwl9CisJY2FzZSBRQ0FTQVBfRFVNUF9TVEFUUzoKKwl7CisJCWhkZExvZyhMT0cxLCAiUUNBU0FQX0RVTVBfU1RBVFMgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJaGRkX3dsYW5fZHVtcF9zdGF0cyhwSG9zdGFwZEFkYXB0ZXIsIHNldF92YWx1ZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFFDQVNBUF9DTEVBUl9TVEFUUzoKKwl7CisJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPQorCQkJV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCQloZGRMb2coTE9HMSwgIlFDQVNBUF9DTEVBUl9TVEFUUyB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlzd2l0Y2ggKHNldF92YWx1ZSkgeworCQljYXNlIFdMQU5fSEREX1NUQVRTOgorCQkJbWVtc2V0KCZwSG9zdGFwZEFkYXB0ZXItPnN0YXRzLCAwLAorCQkJCQkJc2l6ZW9mKHBIb3N0YXBkQWRhcHRlci0+c3RhdHMpKTsKKwkJCW1lbXNldCgmcEhvc3RhcGRBZGFwdGVyLT5oZGRfc3RhdHMsIDAsCisJCQkJCXNpemVvZihwSG9zdGFwZEFkYXB0ZXItPmhkZF9zdGF0cykpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9UWFJYX0hJU1RfU1RBVFM6CisJCQl3bGFuX2hkZF9jbGVhcl90eF9yeF9oaXN0b2dyYW0oaGRkX2N0eCk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0hERF9ORVRJRl9PUEVSX0hJU1RPUlk6CisJCQl3bGFuX2hkZF9jbGVhcl9uZXRpZl9xdWV1ZV9oaXN0b3J5KGhkZF9jdHgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlvbF90eHJ4X2NsZWFyX3N0YXRzKHNldF92YWx1ZSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBzZXRwYXJhbSBjb21tYW5kICVkIHZhbHVlICVkIiksCisJCSAgICAgICBzdWJfY21kLCBzZXRfdmFsdWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK3N0YXRpYyBpd19zb2Z0YXBfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zb2Z0YXBfc2V0cGFyYW0oZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworaW50CitzdGF0aWMgX19pd19zb2Z0YXBfZ2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCWludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisJaW50IHN1Yl9jbWQgPSB2YWx1ZVswXTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlpbnQgcmV0OworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChzdWJfY21kKSB7CisJY2FzZSBRQ1NBUF9QQVJBTV9NQVhfQVNTT0M6CisJCXN0YXR1cyA9CisJCQlzbWVfY2ZnX2dldF9pbnQoaEhhbCwgV05JX0NGR19BU1NPQ19TVEFfTElNSVQsCisJCQkJCSh1aW50MzJfdCAqKSB2YWx1ZSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTCgiZmFpbGVkIHRvIGdldCBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVCBmcm9tIGNmZyAlZCIpLAorCQkJICAgICAgIHN0YXR1cyk7CisJCQlyZXQgPSAtRUlPOworCQl9CisJCWJyZWFrOworCisJY2FzZSBRQ1NBUF9QQVJBTV9BVVRPX0NIQU5ORUw6CisJCSp2YWx1ZSA9IChXTEFOX0hERF9HRVRfQ1RYCisJCQkocEhvc3RhcGRBZGFwdGVyKSktPmNvbmZpZy0+Zm9yY2Vfc2FwX2FjczsKKwkJYnJlYWs7CisKKwljYXNlIFFDU0FQX1BBUkFNX0dFVF9XTEFOX0RCRzoKKwl7CisJCWNkZl90cmFjZV9kaXNwbGF5KCk7CisJCSp2YWx1ZSA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUUNTQVBfUEFSQU1fUlRTQ1RTOgorCXsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9FTkFCTEVfUlRTQ1RTLAorCQkJCQkgICAgIFZERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ0FTQVBfU0hPUlRfR0k6CisJeworCQkqdmFsdWUgPSAoaW50KXNtZV9nZXRfaHRfY29uZmlnKGhIYWwsCisJCQkJCQlwSG9zdGFwZEFkYXB0ZXItPgorCQkJCQkJc2Vzc2lvbklkLAorCQkJCQkJV05JX0NGR19IVF9DQVBfSU5GT19TSE9SVF9HSV8yME1IWik7CisJCWJyZWFrOworCX0KKworCWNhc2UgUUNTQVBfR1RYX0hUX01DUzoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BBUkFNX0dUWF9IVF9NQ1MiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9HVFhfSFRfTUNTLAorCQkJCQkgICAgIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0dUWF9WSFRfTUNTOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1ZERVZfUEFSQU1fR1RYX1ZIVF9NQ1MiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9HVFhfVkhUX01DUywKKwkJCQkJICAgICBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ1NBUF9HVFhfVVNSQ0ZHOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1ZERVZfUEFSQU1fR1RYX1VTUl9DRkciKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9HVFhfVVNSX0NGRywKKwkJCQkJICAgICBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ1NBUF9HVFhfVEhSRToKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BBUkFNX0dUWF9USFJFIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1ZERVZfUEFSQU1fR1RYX1RIUkUsCisJCQkJCSAgICAgR1RYX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgUUNTQVBfR1RYX01BUkdJTjoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BBUkFNX0dUWF9NQVJHSU4iKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9HVFhfTUFSR0lOLAorCQkJCQkgICAgIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDU0FQX0dUWF9TVEVQOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1ZERVZfUEFSQU1fR1RYX1NURVAiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9HVFhfU1RFUCwKKwkJCQkJICAgICBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBRQ1NBUF9HVFhfTUlOVFBDOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1ZERVZfUEFSQU1fR1RYX01JTlRQQyIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9WREVWX1BBUkFNX0dUWF9NSU5UUEMsCisJCQkJCSAgICAgR1RYX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgUUNTQVBfR1RYX0JXTUFTSzoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BBUkFNX0dUWF9CV19NQVNLIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1ZERVZfUEFSQU1fR1RYX0JXX01BU0ssCisJCQkJCSAgICAgR1RYX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgUUNBU0FQX0dFVF9ERlNfTk9MOgorCXsKKwkJd2xhbnNhcF9nZXRfZGZzX25vbCgKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJCQlXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIKKwkJCQkocEhvc3RhcGRBZGFwdGVyKQorI2Vsc2UKKwkJCXBIZGRDdHgtPnBjZHNfY29udGV4dAorI2VuZGlmCisJCQkpOworCX0KKwlicmVhazsKKworCWNhc2UgUUNTQVBfR0VUX0FDTDoKKwl7CisJCWhkZExvZyhMT0cxLCBGTCgiUUNTQVBfR0VUX0FDTCIpKTsKKwkJaWYgKGhkZF9wcmludF9hY2wocEhvc3RhcGRBZGFwdGVyKSAhPQorCQkgICAgQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTAorCQkJICAgICAgICgiUUNTQVBfR0VUX0FDTCByZXR1cm5lZCBFcnJvcjogbm90IGNvbXBsZXRlZCIpKTsKKwkJfQorCQkqdmFsdWUgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDQVNBUF9UWF9DSEFJTk1BU0tfQ01EOgorCXsKKwkJaGRkTG9nKExPRzEsICJRQ0FTQVBfVFhfQ0hBSU5NQVNLX0NNRCIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9QREVWX1BBUkFNX1RYX0NIQUlOX01BU0ssCisJCQkJCSAgICAgUERFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDQVNBUF9SWF9DSEFJTk1BU0tfQ01EOgorCXsKKwkJaGRkTG9nKExPRzEsICJRQ0FTQVBfUlhfQ0hBSU5NQVNLX0NNRCIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9QREVWX1BBUkFNX1JYX0NIQUlOX01BU0ssCisJCQkJCSAgICAgUERFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFFDQVNBUF9OU1NfQ01EOgorCXsKKwkJaGRkTG9nKExPRzEsICJRQ0FTQVBfTlNTX0NNRCIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9WREVWX1BBUkFNX05TUywKKwkJCQkJICAgICBWREVWX0NNRCk7CisJCWJyZWFrOworCX0KKwljYXNlIFFDQVNBUF9HRVRfVEVNUF9DTUQ6CisJeworCQloZGRMb2coTE9HMSwgIlFDQVNBUF9HRVRfVEVNUF9DTUQiKTsKKwkJcmV0ID0gd2xhbl9oZGRfZ2V0X3RlbXBlcmF0dXJlKHBIb3N0YXBkQWRhcHRlciwgdmFsdWUpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIGdldHBhcmFtIGNvbW1hbmQgJWQiKSwgc3ViX2NtZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50CitzdGF0aWMgaXdfc29mdGFwX2dldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc29mdGFwX2dldHBhcmFtKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFVzYWdlOgorICAgIEJMQUNLX0xJU1QgID0gMAorICAgIFdISVRFX0xJU1QgID0gMQorICAgIEFERCBNQUMgPSAwCisgICAgUkVNT1ZFIE1BQyAgPSAxCisKKyAgICBtYWMgYWRkciB3aWxsIGJlIGFjY2VwdGVkIGFzIGEgNiBvY3RldCBtYWMgYWRkcmVzcyB3aXRoIGVhY2ggb2N0ZXQgaW5wdXR0ZWQgaW4gaGV4CisgICAgZm9yIGUuZy4gMDA6MGE6ZjU6MTE6MjI6MzMgd2lsbCBiZSByZXByZXNlbnRlZCBhcyAweDAwIDB4MGEgMHhmNSAweDExIDB4MjIgMHgzMworICAgIHdoaWxlIHVzaW5nIHRoaXMgaW9jdGwKKworICAgIFN5bnRheDoKKyAgICBpd3ByaXYgc29mdGFwLjAgbW9kaWZ5X2FjbAorICAgIDw2IG9jdGV0IG1hYyBhZGRyPiA8bGlzdCB0eXBlPiA8Y21kIHR5cGU+CisKKyAgICBFeGFtcGxlczoKKyAgICBlZyAxLiB0byBhZGQgYSBtYWMgYWRkciAwMDowYTpmNTo4OTo4OTo5MCB0byB0aGUgYmxhY2sgbGlzdAorICAgIGl3cHJpdiBzb2Z0YXAuMCBtb2RpZnlfYWNsIDB4MDAgMHgwYSAweGY1IDB4ODkgMHg4OSAweDkwIDAgMAorICAgIGVnIDIuIHRvIGRlbGV0ZSBhIG1hYyBhZGRyIDAwOjBhOmY1Ojg5Ojg5OjkwIGZyb20gd2hpdGUgbGlzdAorICAgIGl3cHJpdiBzb2Z0YXAuMCBtb2RpZnlfYWNsIDB4MDAgMHgwYSAweGY1IDB4ODkgMHg4OSAweDkwIDEgMQorICovCitzdGF0aWMKK2ludCBfX2l3X3NvZnRhcF9tb2RpZnlfYWNsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJdl9DT05URVhUX3QgY2RzX2N0eDsKKyNlbmRpZgorCXVpbnQ4X3QgKnZhbHVlID0gKHVpbnQ4X3QgKikgZXh0cmE7CisJdWludDhfdCBwUGVlclN0YU1hY1tDREZfTUFDX0FERFJfU0laRV07CisJaW50IGxpc3RUeXBlLCBjbWQsIGk7CisJaW50IHJldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisjaWZuZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwljZHNfY3R4ID0gIGhkZF9jdHgtPnBjZHNfY29udGV4dDsKKwlpZiAoTlVMTCA9PSBjZHNfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFZvcyBDb250ZXh0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IENERl9NQUNfQUREUl9TSVpFOyBpKyspCisJCXBQZWVyU3RhTWFjW2ldID0gKih2YWx1ZSArIGkpOworCisJbGlzdFR5cGUgPSAoaW50KSgqKHZhbHVlICsgaSkpOworCWkrKzsKKwljbWQgPSAoaW50KSgqKHZhbHVlICsgaSkpOworCisJaGRkTG9nKExPRzEsIEZMKCJNb2RpZnkgQUNMIG1hYzoiIE1BQ19BRERSRVNTX1NUUiAiIHR5cGU6ICVkIGNtZDogJWQiKSwKKwkgICAgICAgTUFDX0FERFJfQVJSQVkocFBlZXJTdGFNYWMpLCBsaXN0VHlwZSwgY21kKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwljZGZfc3RhdHVzID0KKwkJd2xhbnNhcF9tb2RpZnlfYWNsKFdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpLAorCQkJCSAgIHBQZWVyU3RhTWFjLCAoZVNhcEFDTFR5cGUpIGxpc3RUeXBlLAorCQkJCSAgIChlU2FwQUNMQ21kVHlwZSkgY21kKTsKKyNlbHNlCisJY2RmX3N0YXR1cyA9CisJCXdsYW5zYXBfbW9kaWZ5X2FjbChwX2Nkc19jb250ZXh0LCBwUGVlclN0YU1hYywKKwkJCQkgICAoZVNhcEFDTFR5cGUpIGxpc3RUeXBlLCAoZVNhcEFDTENtZFR5cGUpIGNtZCk7CisjZW5kaWYKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwgRkwoIk1vZGlmeSBBQ0wgZmFpbGVkIikpOworCQlyZXQgPSAtRUlPOworCX0KKwlFWElUKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljCitpbnQgaXdfc29mdGFwX21vZGlmeV9hY2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc29mdGFwX21vZGlmeV9hY2woZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworaW50CitzdGF0aWMgX19pd19zb2Z0YXBfZ2V0Y2hhbm5lbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisJaW50IHJldDsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwkqdmFsdWUgPSAwOworCWlmICh0ZXN0X2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZwSG9zdGFwZEFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkKKwkJKnZhbHVlID0gKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKAorCQkJCQlwSG9zdGFwZEFkYXB0ZXIpKS0+b3BlcmF0aW5nQ2hhbm5lbDsKKwlyZXR1cm4gMDsKK30KKworaW50CitzdGF0aWMgaXdfc29mdGFwX2dldGNoYW5uZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc29mdGFwX2dldGNoYW5uZWwoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworaW50CitzdGF0aWMgX19pd19zb2Z0YXBfc2V0X21heF90eF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCWludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisJaW50IHNldF92YWx1ZTsKKwl0U2lyTWFjQWRkciBic3NpZCA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworCXRTaXJNYWNBZGRyIHNlbGZNYWMgPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKKwlpbnQgcmV0OworCisJaWYgKE5VTEwgPT0gdmFsdWUpCisJCXJldHVybiAtRU5PTUVNOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEFzc2lnbiBjb3JyZWN0IHNsZWYgTUFDIGFkZHJlc3MgKi8KKwljZGZfbWVtX2NvcHkoYnNzaWQsIHBIb3N0YXBkQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsCisJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCWNkZl9tZW1fY29weShzZWxmTWFjLCBwSG9zdGFwZEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLAorCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKworCXNldF92YWx1ZSA9IHZhbHVlWzBdOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkgICAgc21lX3NldF9tYXhfdHhfcG93ZXIoaEhhbCwgYnNzaWQsIHNlbGZNYWMsIHNldF92YWx1ZSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJTZXR0aW5nIG1heGltdW0gdHggcG93ZXIgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50CitzdGF0aWMgaXdfc29mdGFwX3NldF9tYXhfdHhfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NvZnRhcF9zZXRfbWF4X3R4X3Bvd2VyKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAorc3RhdGljIF9faXdfc29mdGFwX3NldF90eF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgKnZhbHVlID0gKGludCAqKWV4dHJhOworCWludCBzZXRfdmFsdWU7CisJdFNpck1hY0FkZHIgYnNzaWQ7CisJaW50IHJldDsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoTlVMTCA9PSB2YWx1ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljZGZfbWVtX2NvcHkoYnNzaWQsIHBIb3N0YXBkQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsCisJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCisJc2V0X3ZhbHVlID0gdmFsdWVbMF07CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCSAgICBzbWVfc2V0X3R4X3Bvd2VyKGhIYWwsIHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkLCBic3NpZCwKKwkJCSAgICAgcEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZSwgc2V0X3ZhbHVlKSkgeworCQloZGRMb2coTE9HRSwgRkwoIlNldHRpbmcgdHggcG93ZXIgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50CitzdGF0aWMgaXdfc29mdGFwX3NldF90eF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc29mdGFwX3NldF90eF9wb3dlcihkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIElTX0JST0FEQ0FTVF9NQUMoeCkgKCgoeFswXSAmIHhbMV0gJiB4WzJdICYgeFszXSAmIHhbNF0gJiB4WzVdKSA9PSAweGZmKSA/IDEgOiAwKQorCitpbnQKK3N0YXRpYyBfX2l3X3NvZnRhcF9nZXRhc3NvY19zdGFtYWNhZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKwloZGRfc3RhdGlvbl9pbmZvX3QgKnBTdGFJbmZvID0gcEhvc3RhcGRBZGFwdGVyLT5hU3RhSW5mbzsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWNoYXIgKmJ1ZjsKKwlpbnQgY250ID0gMDsKKwlpbnQgbGVmdDsKKwlpbnQgcmV0OworCS8qIG1hY2xpc3RfaW5kZXggbXVzdCBiZSB1MzIgdG8gbWF0Y2ggdXNlcnNwYWNlICovCisJdTMyIG1hY2xpc3RfaW5kZXg7CisKKwkvKgorCSAqIE5PVEUgV0VMTDogdGhpcyBpcyBhICJnZXQiIGlvY3RsIGJ1dCBpdCB1c2VzIGFuIGV2ZW4gaW9jdGwKKwkgKiBudW1iZXIsIGFuZCBldmVuIG51bWJlcmVkIGlvY3RzIGFyZSBzdXBwb3NlZCB0byBoYXZlICJzZXQiCisJICogc2VtYW50aWNzLiAgSGVuY2UgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMgc3VwcG9ydCBpbiB0aGUga2VybmVsCisJICogd29uJ3QgY29ycmVjdGx5IGNvcHkgdGhlIHJlc3VsdCB0byB1c2Vyc3BhY2UsIHNvIHRoZSBpb2N0bAorCSAqIGhhbmRsZXIgaXRzZWxmIG11c3QgY29weSB0aGUgZGF0YS4gIE91dHB1dCBmb3JtYXQgaXMgMzItYml0CisJICogcmVjb3JkIGxlbmd0aCwgZm9sbG93ZWQgYnkgMCBvciBtb3JlIDYtYnl0ZSBTVEEgTUFDIGFkZHJlc3Nlcy4KKwkgKgorCSAqIEZ1cnRoZXIgbm90ZSB0aGF0IGR1ZSB0byB0aGUgaW5jb3JyZWN0IHNlbWFudGljcywgdGhlICJpd3ByaXYiCisJICogdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGlzIHVuYWJsZSB0byBjb3JyZWN0bHkgaW52b2tlIHRoaXMgQVBJLAorCSAqIGhlbmNlIGl0IGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBob3N0YXBkX3ByaXZhdGVfYXJncy4gIFRoaXMKKwkgKiBBUEkgY2FuIG9ubHkgYmUgaW52b2tlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGUgaW9jdGwoKSBzeXN0ZW0KKwkgKiBjYWxsLgorCSAqLworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIG1ha2Ugc3VyZSB1c2Vyc3BhY2UgYWxsb2NhdGVkIGEgcmVhc29uYWJsZSBidWZmZXIgc2l6ZSAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHNpemVvZihtYWNsaXN0X2luZGV4KSkgeworCQloZGRMb2coTE9HMSwgRkwoImludmFsaWQgdXNlcnNwYWNlIGJ1ZmZlciIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogYWxsb2NhdGUgbG9jYWwgYnVmZmVyIHRvIGJ1aWxkIHRoZSByZXNwb25zZSAqLworCWJ1ZiA9IGttYWxsb2Mod3JxdS0+ZGF0YS5sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCWhkZExvZyhMT0cxLCBGTCgiZmFpbGVkIHRvIGFsbG9jYXRlIHJlc3BvbnNlIGJ1ZmZlciIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogc3RhcnQgaW5kZXhpbmcgYmV5b25kIHdoZXJlIHRoZSByZWNvcmQgY291bnQgd2lsbCBiZSB3cml0dGVuICovCisJbWFjbGlzdF9pbmRleCA9IHNpemVvZihtYWNsaXN0X2luZGV4KTsKKwlsZWZ0ID0gd3JxdS0+ZGF0YS5sZW5ndGggLSBtYWNsaXN0X2luZGV4OworCisJc3Bpbl9sb2NrX2JoKCZwSG9zdGFwZEFkYXB0ZXItPnN0YUluZm9fbG9jayk7CisJd2hpbGUgKChjbnQgPCBXTEFOX01BWF9TVEFfQ09VTlQpICYmIChsZWZ0ID49IENERl9NQUNfQUREUl9TSVpFKSkgeworCQlpZiAoKHBTdGFJbmZvW2NudF0uaXNVc2VkKSAmJgorCQkgICAgKCFJU19CUk9BRENBU1RfTUFDKHBTdGFJbmZvW2NudF0ubWFjQWRkclNUQS5ieXRlcykpKSB7CisJCQltZW1jcHkoJmJ1ZlttYWNsaXN0X2luZGV4XSwgJihwU3RhSW5mb1tjbnRdLm1hY0FkZHJTVEEpLAorCQkJICAgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKwkJCW1hY2xpc3RfaW5kZXggKz0gQ0RGX01BQ19BRERSX1NJWkU7CisJCQlsZWZ0IC09IENERl9NQUNfQUREUl9TSVpFOworCQl9CisJCWNudCsrOworCX0KKwlzcGluX3VubG9ja19iaCgmcEhvc3RhcGRBZGFwdGVyLT5zdGFJbmZvX2xvY2spOworCisJKigodTMyICopIGJ1ZikgPSBtYWNsaXN0X2luZGV4OworCXdycXUtPmRhdGEubGVuZ3RoID0gbWFjbGlzdF9pbmRleDsKKwlpZiAoY29weV90b191c2VyKHdycXUtPmRhdGEucG9pbnRlciwgYnVmLCBtYWNsaXN0X2luZGV4KSkgeworCQloZGRMb2coTE9HMSwgRkwoImZhaWxlZCB0byBjb3B5IHJlc3BvbnNlIHRvIHVzZXIgYnVmZmVyIikpOworCQlyZXQgPSAtRUZBVUxUOworCX0KKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK2ludAorc3RhdGljIGl3X3NvZnRhcF9nZXRhc3NvY19zdGFtYWNhZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zb2Z0YXBfZ2V0YXNzb2Nfc3RhbWFjYWRkcihkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBVc2FnZToKKyAgICBtYWMgYWRkciB3aWxsIGJlIGFjY2VwdGVkIGFzIGEgNiBvY3RldCBtYWMgYWRkcmVzcyB3aXRoIGVhY2ggb2N0ZXQgaW5wdXR0ZWQgaW4gaGV4CisgICAgZm9yIGUuZy4gMDA6MGE6ZjU6MTE6MjI6MzMgd2lsbCBiZSByZXByZXNlbnRlZCBhcyAweDAwIDB4MGEgMHhmNSAweDExIDB4MjIgMHgzMworICAgIHdoaWxlIHVzaW5nIHRoaXMgaW9jdGwKKworICAgIFN5bnRheDoKKyAgICBpd3ByaXYgc29mdGFwLjAgZGlzYXNzb2Nfc3RhIDw2IG9jdGV0IG1hYyBhZGRyZXNzPgorCisgICAgZS5nLgorICAgIGRpc2Fzc29jaWF0ZSBzdGEgd2l0aCBtYWMgYWRkciAwMDowYTpmNToxMToyMjozMyBmcm9tIHNvZnRhcAorICAgIGl3cHJpdiBzb2Z0YXAuMCBkaXNhc3NvY19zdGEgMHgwMCAweDBhIDB4ZjUgMHgxMSAweDIyIDB4MzMKKyAqLworCitpbnQKK3N0YXRpYyBfX2l3X3NvZnRhcF9kaXNhc3NvY19zdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCXVpbnQ4X3QgKnBlZXJNYWNBZGRyOworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGl3cHJpdiB0b29sIG9yIGZyYW1ld29yayBjYWxscyB0aGlzIGlvY3RsIHdpdGgKKwkgKiBkYXRhIHBhc3NlZCBpbiBleHRyYSAobGVzcyB0aGFuIDE2IG9jdGV0cyk7CisJICovCisJcGVlck1hY0FkZHIgPSAodWludDhfdCAqKSAoZXh0cmEpOworCisJaGRkTG9nKExPRzEsIEZMKCJkYXRhICIgTUFDX0FERFJFU1NfU1RSKSwKKwkgICAgICAgTUFDX0FERFJfQVJSQVkocGVlck1hY0FkZHIpKTsKKwloZGRfc29mdGFwX3N0YV9kaXNhc3NvYyhwSG9zdGFwZEFkYXB0ZXIsIHBlZXJNYWNBZGRyKTsKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorc3RhdGljIGl3X3NvZnRhcF9kaXNhc3NvY19zdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NvZnRhcF9kaXNhc3NvY19zdGEoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2l3X2dldF9jaGFyX3NldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlpbnQgc3ViX2NtZCA9IHdycXUtPmRhdGEuZmxhZ3M7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXN3aXRjaCAoc3ViX2NtZCkgeworCWNhc2UgUUNTQVBfR0VUX1NUQVRTOgorCQloZGRfd2xhbl9nZXRfc3RhdHMoYWRhcHRlciwgJih3cnF1LT5kYXRhLmxlbmd0aCksCisJCQkJCWV4dHJhLCBXRV9NQVhfU1RSX0xFTik7CisJCWJyZWFrOworCX0KKworCUVYSVQoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGl3X2dldF9jaGFyX3NldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X2NoYXJfc2V0bm9uZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsYW5faGRkX3NldF9mb3JjZV9hY3NfY2hfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCWludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfb3BlcmF0aW9uX2NoYW5uZWwoYWRhcHRlciwgdmFsdWVbMF0pICE9CisJCQkJCSBDREZfU1RBVFVTX1NVQ0NFU1MgfHwKKwkJd2xhbl9oZGRfdmFsaWRhdGVfb3BlcmF0aW9uX2NoYW5uZWwoYWRhcHRlciwgdmFsdWVbMV0pICE9CisJCQkJCSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJaGRkX2N0eC0+Y29uZmlnLT5mb3JjZV9zYXBfYWNzX3N0X2NoID0gdmFsdWVbMF07CisJCWhkZF9jdHgtPmNvbmZpZy0+Zm9yY2Vfc2FwX2Fjc19lbmRfY2ggPSB2YWx1ZVsxXTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd19zb2Z0YXBfc2V0X2ZvcmNlX2Fjc19jaF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gd2xhbl9oZGRfc2V0X2ZvcmNlX2Fjc19jaF9yYW5nZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2l3X3NvZnRhcF9nZXRfY2hhbm5lbF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXVpbnQzMl90IG51bV9jaGFubmVscyA9IDA7CisJdWludDhfdCBpID0gMDsKKwl1aW50OF90IGJhbmRTdGFydENoYW5uZWwgPSBSRl9DSEFOXzE7CisJdWludDhfdCBiYW5kRW5kQ2hhbm5lbCA9IFJGX0NIQU5fMTg0OworCWhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCXRwQ2hhbm5lbExpc3RJbmZvIGNoYW5uZWxfbGlzdCA9ICh0cENoYW5uZWxMaXN0SW5mbykgZXh0cmE7CisJZUNzckJhbmQgY3VyQmFuZCA9IGVDU1JfQkFORF9BTEw7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX2dldF9mcmVxX2JhbmQoaEhhbCwgJmN1ckJhbmQpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgibm90IGFibGUgZ2V0IHRoZSBjdXJyZW50IGZyZXF1ZW5jeSBiYW5kIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2YodENoYW5uZWxMaXN0SW5mbyk7CisJRU5URVIoKTsKKworCWlmIChlQ1NSX0JBTkRfMjQgPT0gY3VyQmFuZCkgeworCQliYW5kU3RhcnRDaGFubmVsID0gUkZfQ0hBTl8xOworCQliYW5kRW5kQ2hhbm5lbCA9IFJGX0NIQU5fMTQ7CisJfSBlbHNlIGlmIChlQ1NSX0JBTkRfNUcgPT0gY3VyQmFuZCkgeworCQliYW5kU3RhcnRDaGFubmVsID0gUkZfQ0hBTl8zNjsKKwkJYmFuZEVuZENoYW5uZWwgPSBSRl9DSEFOXzE4NDsKKwl9CisKKwloZGRMb2coTE9HMSwgRkwoImN1ckJhbmQgPSAlZCwgU3RhcnRDaGFubmVsID0gJWh1LCBFbmRDaGFubmVsID0gJWh1ICIpLAorCSAgICAgICBjdXJCYW5kLCBiYW5kU3RhcnRDaGFubmVsLCBiYW5kRW5kQ2hhbm5lbCk7CisKKwlmb3IgKGkgPSBiYW5kU3RhcnRDaGFubmVsOyBpIDw9IGJhbmRFbmRDaGFubmVsOyBpKyspIHsKKwkJaWYgKChDSEFOTkVMX1NUQVRFX0VOQUJMRSA9PSByZWdfY2hhbm5lbHNbaV0uZW5hYmxlZCkgfHwKKwkJICAgIChDSEFOTkVMX1NUQVRFX0RGUyA9PSByZWdfY2hhbm5lbHNbaV0uZW5hYmxlZCkpIHsKKwkJCWNoYW5uZWxfbGlzdC0+Y2hhbm5lbHNbbnVtX2NoYW5uZWxzXSA9CisJCQkJcmZfY2hhbm5lbHNbaV0uY2hhbm5lbE51bTsKKwkJCW51bV9jaGFubmVscysrOworCQl9CisJfQorCisJaGRkTG9nKExPRzEsIEZMKCIgbnVtYmVyIG9mIGNoYW5uZWxzICVkIiksIG51bV9jaGFubmVscyk7CisKKwlpZiAobnVtX2NoYW5uZWxzID4gSVdfTUFYX0ZSRVFVRU5DSUVTKSB7CisJCW51bV9jaGFubmVscyA9IElXX01BWF9GUkVRVUVOQ0lFUzsKKwl9CisKKwljaGFubmVsX2xpc3QtPm51bV9jaGFubmVscyA9IG51bV9jaGFubmVsczsKKwlFWElUKCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGl3X3NvZnRhcF9nZXRfY2hhbm5lbF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NvZnRhcF9nZXRfY2hhbm5lbF9saXN0KGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYworaW50IF9faXdfZ2V0X2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisjaWZuZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwl2X0NPTlRFWFRfdCBjZHNfY3R4OworI2VuZGlmCisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3QgbGVuZ3RoID0gRE9UMTFGX0lFX1JTTl9NQVhfTEVOOworCXVpbnQ4X3QgZ2VuSWVCeXRlc1tET1QxMUZfSUVfUlNOX01BWF9MRU5dOworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKyNpZm5kZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCWNkc19jdHggPSBoZGRfY3R4LT5wY2RzX2NvbnRleHQ7CisJaWYgKE5VTEwgPT0gY2RzX2N0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiB2b3MgY29udGV4dCBpcyBub3QgdmFsaWQgIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjZW5kaWYKKworCWhkZExvZyhMT0cxLCBGTCgiZ2V0R0VOX0lFIGlvY3RsIikpOworCS8qCisJICogQWN0dWFsbHkgcmV0cmlldmUgdGhlIFJTTiBJRSBmcm9tIENTUi4KKwkgKiAoV2UgcHJldmlvdXNseSBzZW50IGl0IGRvd24gaW4gdGhlIENTUiBSb2FtIFByb2ZpbGUuKQorCSAqLworCXN0YXR1cyA9IHdsYW5fc2FwX2dldHN0YXRpb25faWVfaW5mb3JtYXRpb24oCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQlXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIKKwkJCShwSG9zdGFwZEFkYXB0ZXIpLAorI2Vsc2UKKwkJY2RzX2N0eCwKKyNlbmRpZgorCQkmbGVuZ3RoLCBnZW5JZUJ5dGVzKTsKKwlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlsZW5ndGggPSBDREZfTUlOKGxlbmd0aCwgRE9UMTFGX0lFX1JTTl9NQVhfTEVOKTsKKwkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgbGVuZ3RoIHx8CisJCWNvcHlfdG9fdXNlcih3cnF1LT5kYXRhLnBvaW50ZXIsICh2b2lkICopZ2VuSWVCeXRlcywgbGVuZ3RoKSkgeworCQkJaGRkTG9nKExPRzEsIEZMKCJmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyIikpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBsZW5ndGg7CisJCWhkZExvZyhMT0cxLCBGTCgiIFJTTiBJRSBvZiAlZCBieXRlcyByZXR1cm5lZCIpLAorCQkJCXdycXUtPmRhdGEubGVuZ3RoKTsKKwl9IGVsc2UgeworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IDA7CisJCWhkZExvZyhMT0cxLCBGTCgiIFJTTiBJRSBmYWlsZWQgdG8gcG9wdWxhdGUiKSk7CisJfQorCisJRVhJVCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMKK2ludCBpd19nZXRfZ2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X2dldF9nZW5pZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMKK2ludCBfX2l3X2dldF93cHNwYmNfcHJvYmVfcmVxX2llcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKwlzUWNTYXByZXFfV1BTUEJDUHJvYmVSZXFJRVNfdCBXUFNQQkNQcm9iZVJlcUlFczsKKwloZGRfYXBfY3R4X3QgKnBIZGRBcEN0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwloZGRMb2coTE9HMSwgRkwoImdldF9XUFNQQkNQcm9iZVJlcUlFcyBpb2N0bCIpKTsKKwltZW1zZXQoKHZvaWQgKikmV1BTUEJDUHJvYmVSZXFJRXMsIDAsIHNpemVvZihXUFNQQkNQcm9iZVJlcUlFcykpOworCisJV1BTUEJDUHJvYmVSZXFJRXMucHJvYmVSZXFJRUxlbiA9CisJCXBIZGRBcEN0eC0+V1BTUEJDUHJvYmVSZXEucHJvYmVSZXFJRUxlbjsKKwljZGZfbWVtX2NvcHkoJldQU1BCQ1Byb2JlUmVxSUVzLnByb2JlUmVxSUUsCisJCSAgICAgcEhkZEFwQ3R4LT5XUFNQQkNQcm9iZVJlcS5wcm9iZVJlcUlFLAorCQkgICAgIFdQU1BCQ1Byb2JlUmVxSUVzLnByb2JlUmVxSUVMZW4pOworCWNkZl9tZW1fY29weSgmV1BTUEJDUHJvYmVSZXFJRXMubWFjYWRkciwKKwkJICAgICBwSGRkQXBDdHgtPldQU1BCQ1Byb2JlUmVxLnBlZXJNYWNBZGRyLAorCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKwlpZiAoY29weV90b191c2VyKHdycXUtPmRhdGEucG9pbnRlciwKKwkJCSAodm9pZCAqKSZXUFNQQkNQcm9iZVJlcUlFcywKKwkJCSBzaXplb2YoV1BTUEJDUHJvYmVSZXFJRXMpKSkgeworCQloZGRMb2coTE9HMSwgRkwoImZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiKSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IDEyICsgV1BTUEJDUHJvYmVSZXFJRXMucHJvYmVSZXFJRUxlbjsKKwloZGRMb2coTE9HMSwgRkwoIk1hY2FkZHJlc3MgOiAiIE1BQ19BRERSRVNTX1NUUiksCisJICAgICAgIE1BQ19BRERSX0FSUkFZKFdQU1BCQ1Byb2JlUmVxSUVzLm1hY2FkZHIpKTsKKwl1cCgmcEhkZEFwQ3R4LT5zZW1XcHNQQkNPdmVybGFwSW5kKTsKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYworaW50IGl3X2dldF93cHNwYmNfcHJvYmVfcmVxX2llcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19nZXRfd3BzcGJjX3Byb2JlX3JlcV9pZXMoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X3NldF9hdXRoX2hvc3RhcCgpIC0KKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYXV0aCB0eXBlIHJlY2VpdmVkIGZyb20gdGhlIHdwYV9zdXBwbGljYW50LgorICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAaW5mbzogcG9pbnRlciB0byB0aGUgaXdfcmVxdWVzdF9pbmZvLgorICogQHdycXU6IHBvaW50ZXIgdG8gdGhlIGl3cmVxX2RhdGEuCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gdGhlIGRhdGEuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMKK2ludCBfX2l3X3NldF9hdXRoX2hvc3RhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoICh3cnF1LT5wYXJhbS5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6CisJeworCQlpZiAod3JxdS0+cGFyYW0udmFsdWUpIHsKKwkJCWhkZExvZyhMT0cyLAorCQkJICAgICAgICJDb3VudGVyIE1lYXN1cmUgc3RhcnRlZCAlZCIsIHdycXUtPnBhcmFtLnZhbHVlKTsKKwkJCXBXZXh0U3RhdGUtPm1US0lQQ291bnRlck1lYXN1cmVzID0KKwkJCQlUS0lQX0NPVU5URVJfTUVBU1VSRV9TVEFSVEVEOworCQl9IGVsc2UgeworCQkJaGRkTG9nKExPRzIsCisJCQkgICAgICAgIkNvdW50ZXIgTWVhc3VyZSBzdG9wcGVkPSVkIiwgd3JxdS0+cGFyYW0udmFsdWUpOworCQkJcFdleHRTdGF0ZS0+bVRLSVBDb3VudGVyTWVhc3VyZXMgPQorCQkJCVRLSVBfQ09VTlRFUl9NRUFTVVJFX1NUT1BFRDsKKwkJfQorCisJCWhkZF9zb2Z0YXBfdGtpcF9taWNfZmFpbF9jb3VudGVyX21lYXN1cmUocEFkYXB0ZXIsCisJCQkJCQkJIHdycXUtPnBhcmFtLgorCQkJCQkJCSB2YWx1ZSk7CisJfQorCWJyZWFrOworCisJZGVmYXVsdDoKKworCQloZGRMb2coTE9HVywgRkwoImNhbGxlZCB3aXRoIHVuc3VwcG9ydGVkIGF1dGggdHlwZSAlZCIpLAorCQkgICAgICAgd3JxdS0+cGFyYW0uZmxhZ3MgJiBJV19BVVRIX0lOREVYKTsKKwkJYnJlYWs7CisJfQorCisJRVhJVCgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X3NldF9hdXRoX2hvc3RhcCgpIC0gV3JhcHBlciBmdW5jdGlvbiB0byBwcm90ZWN0IF9faXdfc2V0X2F1dGhfaG9zdGFwCisgKgkJCWZyb20gdGhlIFNTUi4KKyAqCisgKiBAZGV2IC0gUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAqIEBpbmZvIC0gUG9pbnRlciB0byB0aGUgaXdfcmVxdWVzdF9pbmZvLgorICogQHdycXUgLSBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICogQGV4dHJhIC0gUG9pbnRlciB0byB0aGUgZGF0YS4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50Citpd19zZXRfYXV0aF9ob3N0YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF9hdXRoX2hvc3RhcChkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfc2V0X2FwX2VuY29kZWV4dCgpIC0gc2V0IGFwIGVuY29kZQorICoKKyAqIEBkZXYgLSBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICogQGluZm8gLSBQb2ludGVyIHRvIHRoZSBpd19yZXF1ZXN0X2luZm8uCisgKiBAd3JxdSAtIFBvaW50ZXIgdG8gdGhlIGl3cmVxX2RhdGEuCisgKiBAZXh0cmEgLSBQb2ludGVyIHRvIHRoZSBkYXRhLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19pd19zZXRfYXBfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisjaWZuZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwl2X0NPTlRFWFRfdCBjZHNfY3R4OworI2VuZGlmCisJaGRkX2FwX2N0eF90ICpwSGRkQXBDdHggPSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaW50IHJldDsKKwlDREZfU1RBVFVTIHZzdGF0dXM7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBrZXlfaW5kZXg7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwl0Q3NyUm9hbVNldEtleSBzZXRLZXk7CisJaW50IGk7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJY2RzX2N0eCA9IGhkZF9jdHgtPnBjZHNfY29udGV4dDsKKwlpZiAoTlVMTCA9PSBjZHNfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHBWb3NDb250ZXh0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNlbmRpZgorCisJa2V5X2luZGV4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCisJaWYgKGtleV9pbmRleCA+IDApIHsKKwkJLypDb252ZXJ0IGZyb20gMS1iYXNlZCB0byAwLWJhc2VkIGtleWluZyAqLworCQlrZXlfaW5kZXgtLTsKKwl9CisJaWYgKCFleHQtPmtleV9sZW4pCisJCXJldHVybiByZXQ7CisKKwljZGZfbWVtX3plcm8oJnNldEtleSwgc2l6ZW9mKHRDc3JSb2FtU2V0S2V5KSk7CisKKwlzZXRLZXkua2V5SWQgPSBrZXlfaW5kZXg7CisJc2V0S2V5LmtleUxlbmd0aCA9IGV4dC0+a2V5X2xlbjsKKworCWlmIChleHQtPmtleV9sZW4gPD0gQ1NSX01BWF9LRVlfTEVOKSB7CisJCWNkZl9tZW1fY29weSgmc2V0S2V5LktleVswXSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisJfQorCisJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpIHsKKwkJLypLZXkgZGlyZWN0aW9uIGZvciBncm91cCBpcyBSWCBvbmx5ICovCisJCXNldEtleS5rZXlEaXJlY3Rpb24gPSBlU0lSX1JYX09OTFk7CisJCWNkZl9zZXRfbWFjYWRkcl9icm9hZGNhc3QoJnNldEtleS5wZWVyTWFjKTsKKwl9IGVsc2UgeworCisJCXNldEtleS5rZXlEaXJlY3Rpb24gPSBlU0lSX1RYX1JYOworCQljZGZfbWVtX2NvcHkoc2V0S2V5LnBlZXJNYWMuYnl0ZXMsIGV4dC0+YWRkci5zYV9kYXRhLAorCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJfQorCWlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgeworCQlzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9UWF9ERUZBVUxUOworCQljZGZfbWVtX2NvcHkoc2V0S2V5LnBlZXJNYWMuYnl0ZXMsIGV4dC0+YWRkci5zYV9kYXRhLAorCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJfQorCisJLypGb3Igc3VwcGxpY2FudCBwYWUgcm9sZSBpcyB6ZXJvICovCisJc2V0S2V5LnBhZVJvbGUgPSAwOworCisJc3dpdGNoIChleHQtPmFsZykgeworCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorCQlzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisJCWJyZWFrOworCisJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKKwkJc2V0S2V5LmVuY1R5cGUgPQorCQkJKGV4dC0+a2V5X2xlbiA9PQorCQkJIDUpID8gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDAgOiBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ7CisJCXBIZGRBcEN0eC0+dVByaXZhY3kgPSAxOworCQloZGRMb2coTE9HMSwgRkwoInVQcml2YWN5PSVkIiksIHBIZGRBcEN0eC0+dVByaXZhY3kpOworCQlicmVhazsKKworCWNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorCXsKKwkJdWludDhfdCAqcEtleSA9ICZzZXRLZXkuS2V5WzBdOworCisJCXNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDsKKworCQljZGZfbWVtX3plcm8ocEtleSwgQ1NSX01BWF9LRVlfTEVOKTsKKworCQkvKlN1cHBsaWNhbnQgc2VuZHMgdGhlIDMyYnl0ZXMga2V5IGluIHRoaXMgb3JkZXIKKworCQkgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorCQkgfCAgIFRrMSAgICAgICAgfFRYLU1JQyAgICB8ICBSWCBNaWMgIHwKKwkJIHx8fC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKwkJICAgPC0tLTE2Ynl0ZXMtLS0+PC0tOGJ5dGVzLS0+PC0tOGJ5dGVzLS0+CisKKwkJICovCisJCS8qU21lIGV4cGVjdHMgdGhlIDMyIGJ5dGVzIGtleSB0byBiZSBpbiB0aGUgYmVsb3cgb3JkZXIKKworCQkgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorCQkgfCAgIFRrMSAgICAgICAgfFJYLU1JQyAgICB8ICBUWCBNaWMgIHwKKwkJIHx8fC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKwkJICAgPC0tLTE2Ynl0ZXMtLS0+PC0tOGJ5dGVzLS0+PC0tOGJ5dGVzLS0+CisJCSAqLworCQkvKiBDb3B5IHRoZSBUZW1wb3JhbCBLZXkgMSAoVEsxKSAqLworCQljZGZfbWVtX2NvcHkocEtleSwgZXh0LT5rZXksIDE2KTsKKworCQkvKkNvcHkgdGhlIHJ4IG1pYyBmaXJzdCAqLworCQljZGZfbWVtX2NvcHkoJnBLZXlbMTZdLCAmZXh0LT5rZXlbMjRdLCA4KTsKKworCQkvKkNvcHkgdGhlIHR4IG1pYyAqLworCQljZGZfbWVtX2NvcHkoJnBLZXlbMjRdLCAmZXh0LT5rZXlbMTZdLCA4KTsKKworCX0KKwlicmVhazsKKworCWNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorCQlzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0FFUzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisJCWJyZWFrOworCX0KKworCWhkZExvZyhMT0cxLCBGTCgiOkVuY3J5cHRpb25UeXBlOiVkIGtleV9sZW46JWQsIEtleUlkOiVkIiksCisJICAgICAgIHNldEtleS5lbmNUeXBlLCBzZXRLZXkua2V5TGVuZ3RoLCBzZXRLZXkua2V5SWQpOworCWZvciAoaSA9IDA7IGkgPCBleHQtPmtleV9sZW47IGkrKykKKwkJaGRkTG9nKExPRzEsICIlMDJ4Iiwgc2V0S2V5LktleVtpXSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJdnN0YXR1cyA9CisJCXdsYW5zYXBfc2V0X2tleV9zdGEoV0xBTl9IRERfR0VUX1NBUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlciksCisJCQkJICAgICZzZXRLZXkpOworI2Vsc2UKKwl2c3RhdHVzID0gd2xhbnNhcF9zZXRfa2V5X3N0YShjZHNfY3R4LCAmc2V0S2V5KTsKKyNlbmRpZgorCisJaWYgKHZzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZExvZyhMT0dFLCBGTCgid2xhbnNhcF9zZXRfa2V5X3N0YSBmYWlsZWQsIHN0YXR1cz0gJWQiKSwKKwkJICAgICAgIHZzdGF0dXMpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXdfc2V0X2FwX2VuY29kZWV4dCgpIC0gV3JhcHBlciBmdW5jdGlvbiB0byBwcm90ZWN0IF9faXdfc2V0X2FwX2VuY29kZWV4dAorICoJCQlmcm9tIHRoZSBTU1IuCisgKgorICogQGRldiAtIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAaW5mbyAtIFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1IC0gUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAqIEBleHRyYSAtIFBvaW50ZXIgdG8gdGhlIGRhdGEuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpd19zZXRfYXBfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF9hcF9lbmNvZGVleHQoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X3NldF9hcF9tbG1lKCkgLSBzZXQgYXAgbWxtZQorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8KKyAqIEB3cnF1OyBwb2ludGVyIHRvIGl3cmVxX2RhdGEKKyAqIEBleHRyYTogZXh0cmEKKyAqCisgKiBSZXR1cm47IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IF9faXdfc2V0X2FwX21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXdfc2V0X2FwX21sbWUoKSAtIFNTUiB3cmFwcGVyIGZvciBfX2l3X3NldF9hcF9tbG1lCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQHdycXU7IHBvaW50ZXIgdG8gaXdyZXFfZGF0YQorICogQGV4dHJhOiBleHRyYQorICoKKyAqIFJldHVybjsgMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfc2V0X2FwX21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfYXBfbWxtZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfZ2V0X2FwX3J0c190aHJlc2hvbGQoKSAtIGdldCBhcCBydHMgdGhyZXNob2xkCisgKiBAZGV2IC0gUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAqIEBpbmZvIC0gUG9pbnRlciB0byB0aGUgaXdfcmVxdWVzdF9pbmZvLgorICogQHdycXUgLSBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICogQGV4dHJhIC0gUG9pbnRlciB0byB0aGUgZGF0YS4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X2FwX3J0c190aHJlc2hvbGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKSB7CisKKwloZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQ7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGhkZF93bGFuX2dldF9ydHNfdGhyZXNob2xkKHBIb3N0YXBkQWRhcHRlciwgd3JxdSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGl3X2dldF9hcF9ydHNfdGhyZXNob2xkKCkgLSBXcmFwcGVyIGZ1bmN0aW9uIHRvIHByb3RlY3QKKyAqCQkJX19pd19nZXRfYXBfcnRzX3RocmVzaG9sZCBmcm9tIHRoZSBTU1IuCisgKiBAZGV2IC0gUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAqIEBpbmZvIC0gUG9pbnRlciB0byB0aGUgaXdfcmVxdWVzdF9pbmZvLgorICogQHdycXUgLSBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICogQGV4dHJhIC0gUG9pbnRlciB0byB0aGUgZGF0YS4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGl3X2dldF9hcF9ydHNfdGhyZXNob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X2dldF9hcF9ydHNfdGhyZXNob2xkKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19nZXRfYXBfZnJhZ190aHJlc2hvbGQoKSAtIGdldCBhcCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZAorICogQGRldiAtIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAaW5mbyAtIFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1IC0gUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAqIEBleHRyYSAtIFBvaW50ZXIgdG8gdGhlIGRhdGEuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2l3X2dldF9hcF9mcmFnX3RocmVzaG9sZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkgeworCisJaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQgPSAwOworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBoZGRfd2xhbl9nZXRfZnJhZ190aHJlc2hvbGQocEhvc3RhcGRBZGFwdGVyLCB3cnF1KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXdfZ2V0X2FwX2ZyYWdfdGhyZXNob2xkKCkgLSBXcmFwcGVyIGZ1bmN0aW9uIHRvIHByb3RlY3QKKyAqCQkJX19pd19nZXRfYXBfZnJhZ190aHJlc2hvbGQgZnJvbSB0aGUgU1NSLgorICogQGRldiAtIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAaW5mbyAtIFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1IC0gUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAqIEBleHRyYSAtIFBvaW50ZXIgdG8gdGhlIGRhdGEuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpd19nZXRfYXBfZnJhZ190aHJlc2hvbGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19nZXRfYXBfZnJhZ190aHJlc2hvbGQoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X2dldF9hcF9mcmVxKCkgLSBnZXQgYXAgZnJlcXVlbmN5CisgKiBAZGV2IC0gUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAqIEBpbmZvIC0gUG9pbnRlciB0byB0aGUgaXdfcmVxdWVzdF9pbmZvLgorICogQHdycXUgLSBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICogQGV4dHJhIC0gUG9pbnRlciB0byB0aGUgZGF0YS4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X2FwX2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X2ZyZXEgKmZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKSB7CisJdWludDMyX3Qgc3RhdHVzID0gZmFsc2UsIGNoYW5uZWwgPSAwLCBmcmVxID0gMDsKKwloZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwl0SGFsSGFuZGxlIGhIYWw7CisJaGRkX2hvc3RhcGRfc3RhdGVfdCAqcEhvc3RhcGRTdGF0ZTsKKwloZGRfYXBfY3R4X3QgKnBIZGRBcEN0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcik7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJcEhvc3RhcGRTdGF0ZSA9IFdMQU5fSEREX0dFVF9IT1NUQVBfU1RBVEVfUFRSKHBIb3N0YXBkQWRhcHRlcik7CisJaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisKKwlpZiAocEhvc3RhcGRTdGF0ZS0+YnNzU3RhdGUgPT0gQlNTX1NUT1ApIHsKKwkJaWYgKHNtZV9jZmdfZ2V0X2ludChoSGFsLCBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTCwgJmNoYW5uZWwpCisJCSAgICAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJldHVybiAtRUlPOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gaGRkX3dsYW5fZ2V0X2ZyZXEoY2hhbm5lbCwgJmZyZXEpOworCQkJaWYgKHRydWUgPT0gc3RhdHVzKSB7CisJCQkJLyogU2V0IEV4cG9uZW50IHBhcmFtZXRlciBhcyA2IChNSFopIGluIHN0cnVjdAorCQkJCSAqIGl3X2ZyZXEgKiBpd2xpc3QgJiBpd2NvbmZpZyBjb21tYW5kCisJCQkJICogc2hvd3MgZnJlcXVlbmN5IGludG8gcHJvcGVyCisJCQkJICogZm9ybWF0ICgyLjQxMiBHSHogaW5zdGVhZCBvZiAyNDYuMiBNSHopCisJCQkJICovCisJCQkJZndycS0+bSA9IGZyZXE7CisJCQkJZndycS0+ZSA9IE1IWjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWNoYW5uZWwgPSBwSGRkQXBDdHgtPm9wZXJhdGluZ0NoYW5uZWw7CisJCXN0YXR1cyA9IGhkZF93bGFuX2dldF9mcmVxKGNoYW5uZWwsICZmcmVxKTsKKwkJaWYgKHRydWUgPT0gc3RhdHVzKSB7CisJCQkvKiBTZXQgRXhwb25lbnQgcGFyYW1ldGVyIGFzIDYgKE1IWikgaW4gc3RydWN0IGl3X2ZyZXEKKwkJCSAqIGl3bGlzdCAmIGl3Y29uZmlnIGNvbW1hbmQgc2hvd3MgZnJlcXVlbmN5IGludG8gcHJvcGVyCisJCQkgKiBmb3JtYXQgKDIuNDEyIEdIeiBpbnN0ZWFkIG9mIDI0Ni4yIE1IeikqLworCQkJZndycS0+bSA9IGZyZXE7CisJCQlmd3JxLT5lID0gTUhaOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X2dldF9hcF9mcmVxKCkgLSBXcmFwcGVyIGZ1bmN0aW9uIHRvIHByb3RlY3QKKyAqICAgICAgICAgICAgICAgICAgICBfX2l3X2dldF9hcF9mcmVxIGZyb20gdGhlIFNTUi4KKyAqIEBkZXYgLSBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICogQGluZm8gLSBQb2ludGVyIHRvIHRoZSBpd19yZXF1ZXN0X2luZm8uCisgKiBAd3JxdSAtIFBvaW50ZXIgdG8gdGhlIGl3cmVxX2RhdGEuCisgKiBAZXh0cmEgLSBQb2ludGVyIHRvIHRoZSBkYXRhLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaXdfZ2V0X2FwX2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X2ZyZXEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X2FwX2ZyZXEoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X2dldF9tb2RlKCkgLSBnZXQgbW9kZQorICogQGRldiAtIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAaW5mbyAtIFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1IC0gUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAqIEBleHRyYSAtIFBvaW50ZXIgdG8gdGhlIGRhdGEuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2l3X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpIHsKKworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJd3JxdS0+bW9kZSA9IElXX01PREVfTUFTVEVSOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpd19nZXRfbW9kZSgpIC0gV3JhcHBlciBmdW5jdGlvbiB0byBwcm90ZWN0IF9faXdfZ2V0X21vZGUgZnJvbSB0aGUgU1NSLgorICogQGRldiAtIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAaW5mbyAtIFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1IC0gUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAqIEBleHRyYSAtIFBvaW50ZXIgdG8gdGhlIGRhdGEuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpd19nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X21vZGUoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorX19pd19zb2Z0YXBfc2V0d3BzaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKyNpZm5kZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCXZfQ09OVEVYVF90IGNkc19jdHg7CisjZW5kaWYKKwloZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdWludDhfdCAqd3BzX2dlbmllOworCXVpbnQ4X3QgKmZ3cHNfZ2VuaWU7CisJdWludDhfdCAqcG9zOworCXRwU2FwX1dQU0lFIHBTYXBfV1BTSWU7CisJdWludDhfdCBXUFNJZVR5cGU7CisJdWludDE2X3QgbGVuZ3RoOworCXN0cnVjdCBpd19wb2ludCBzX3ByaXZfZGF0YTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJY2RzX2N0eCA9IGhkZF9jdHgtPnBjZHNfY29udGV4dDsKKwlpZiAoTlVMTCA9PSBjZHNfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCAiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNlbmRpZgorCisJLyogaGVscGVyIGZ1bmN0aW9uIHRvIGdldCBpd3JlcV9kYXRhIHdpdGggY29tcGF0IGhhbmRsaW5nLiAqLworCWlmIChoZGRfcHJpdl9nZXRfZGF0YSgmc19wcml2X2RhdGEsIHdycXUpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoTlVMTCA9PSBzX3ByaXZfZGF0YS5wb2ludGVyKSB8fAorCSAgICAoc19wcml2X2RhdGEubGVuZ3RoIDwgUUNTQVBfTUFYX1dTQ19JRSkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd3BzX2dlbmllID0gbWVtX2FsbG9jX2NvcHlfZnJvbV91c2VyX2hlbHBlcihzX3ByaXZfZGF0YS5wb2ludGVyLAorCQkJCQkJICAgIHNfcHJpdl9kYXRhLmxlbmd0aCk7CisKKwlpZiAoTlVMTCA9PSB3cHNfZ2VuaWUpIHsKKwkJaGRkTG9nKExPRzEsIEZMKCJmYWlsZWQgdG8gYWxsb2MgbWVtIGFuZCBjb3B5IGRhdGEiKSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWZ3cHNfZ2VuaWUgPSB3cHNfZ2VuaWU7CisKKwlwU2FwX1dQU0llID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTYXBfV1BTSUUpKTsKKwlpZiAoTlVMTCA9PSBwU2FwX1dQU0llKSB7CisJCWhkZExvZyhMT0dFLCAiQ0RGIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKKwkJa2ZyZWUoZndwc19nZW5pZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljZGZfbWVtX3plcm8ocFNhcF9XUFNJZSwgc2l6ZW9mKHRTYXBfV1BTSUUpKTsKKworCWhkZExvZyhMT0cxLCBGTCgiV1BTIElFIHR5cGVbMHglWF0gSUVbMHglWF0sIExFTlslZF0iKSwKKwkJd3BzX2dlbmllWzBdLCB3cHNfZ2VuaWVbMV0sIHdwc19nZW5pZVsyXSk7CisJV1BTSWVUeXBlID0gd3BzX2dlbmllWzBdOworCWlmICh3cHNfZ2VuaWVbMF0gPT0gZVFDX1dQU19CRUFDT05fSUUpIHsKKwkJcFNhcF9XUFNJZS0+c2FwV1BTSUVDb2RlID0gZVNBUF9XUFNfQkVBQ09OX0lFOworCQl3cHNfZ2VuaWUgPSB3cHNfZ2VuaWUgKyAxOworCQlzd2l0Y2ggKHdwc19nZW5pZVswXSkgeworCQljYXNlIERPVDExRl9FSURfV1BBOgorCQkJaWYgKHdwc19nZW5pZVsxXSA8IDIgKyA0KSB7CisJCQkJY2RmX21lbV9mcmVlKHBTYXBfV1BTSWUpOworCQkJCWtmcmVlKGZ3cHNfZ2VuaWUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIGlmIChtZW1jbXAoJndwc19nZW5pZVsyXSwKKwkJCQkgICAiXHgwMFx4NTBceGYyXHgwNCIsIDQpID09IDApIHsKKwkJCQloZGRMb2coTE9HMSwgRkwoIlNldCBXUFMgQkVBQ09OIElFKGxlbiAlZCkiKSwKKwkJCQkgICAgICAgd3BzX2dlbmllWzFdICsgMik7CisJCQkJcG9zID0gJndwc19nZW5pZVs2XTsKKwkJCQl3aGlsZSAoKChzaXplX3QpIHBvcyAtCisJCQkJCShzaXplX3QpICZ3cHNfZ2VuaWVbNl0pIDwKKwkJCQkgICAgICAgKHdwc19nZW5pZVsxXSAtIDQpKSB7CisJCQkJCXN3aXRjaCAoKHVpbnQxNl90KSAoKnBvcyA8PCA4KSB8CisJCQkJCQkqKHBvcyArIDEpKSB7CisJCQkJCWNhc2UgSEREX1dQU19FTEVNX1ZFUlNJT046CisJCQkJCQlwb3MgKz0gNDsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTQmVhY29uSUUuVmVyc2lvbiA9CisJCQkJCQkJKnBvczsKKwkJCQkJCWhkZExvZyhMT0cxLCAiV1BTIHZlcnNpb24gJWQiLAorCQkJCQkJICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJICAgICAgIHNhcFdQU0JlYWNvbklFLlZlcnNpb24pOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNCZWFjb25JRS4KKwkJCQkJCUZpZWxkUHJlc2VudCB8PQorCQkJCQkJCVdQU19CRUFDT05fVkVSX1BSRVNFTlQ7CisJCQkJCQlwb3MgKz0gMTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgSEREX1dQU19FTEVNX1dQU19TVEFURToKKwkJCQkJCXBvcyArPSA0OworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNCZWFjb25JRS53cHNTdGF0ZSA9CisJCQkJCQkJKnBvczsKKwkJCQkJCWhkZExvZyhMT0cxLCAiV1BTIFN0YXRlICVkIiwKKwkJCQkJCSAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCSAgICAgICBzYXBXUFNCZWFjb25JRS53cHNTdGF0ZSk7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU0JlYWNvbklFLgorCQkJCQkJRmllbGRQcmVzZW50IHw9CisJCQkJCQkJV1BTX0JFQUNPTl9TVEFURV9QUkVTRU5UOworCQkJCQkJcG9zICs9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBIRERfV1BTX0VMRU1fQVBTRVRVUExPQ0s6CisJCQkJCQlwb3MgKz0gNDsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTQmVhY29uSUUuCisJCQkJCQlBUFNldHVwTG9ja2VkID0gKnBvczsKKwkJCQkJCWhkZExvZyhMT0cxLCAiQVAgc2V0dXAgbG9jayAlZCIsCisJCQkJCQkgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQkgICAgICAgc2FwV1BTQmVhY29uSUUuCisJCQkJCQkgICAgICAgQVBTZXR1cExvY2tlZCk7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU0JlYWNvbklFLgorCQkJCQkJRmllbGRQcmVzZW50IHw9CisJCQkJCQkJV1BTX0JFQUNPTl9BUFNFVFVQTE9DS19QUkVTRU5UOworCQkJCQkJcG9zICs9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBIRERfV1BTX0VMRU1fU0VMRUNURURSRUdJU1RSQToKKwkJCQkJCXBvcyArPSA0OworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNCZWFjb25JRS4KKwkJCQkJCVNlbGVjdGVkUmVnaXN0cmEgPSAqcG9zOworCQkJCQkJaGRkTG9nKExPRzEsCisJCQkJCQkgICAgICAgIlNlbGVjdGVkIFJlZ2lzdHJhICVkIiwKKwkJCQkJCSAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCSAgICAgICBzYXBXUFNCZWFjb25JRS4KKwkJCQkJCSAgICAgICBTZWxlY3RlZFJlZ2lzdHJhKTsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTQmVhY29uSUUuCisJCQkJCQlGaWVsZFByZXNlbnQgfD0KKwkJCQkJCQlXUFNfQkVBQ09OX1NFTEVDVEVEUkVHSVNUUkFfUFJFU0VOVDsKKwkJCQkJCXBvcyArPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSEREX1dQU19FTEVNX0RFVklDRV9QQVNTV09SRF9JRDoKKwkJCQkJCXBvcyArPSA0OworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNCZWFjb25JRS4KKwkJCQkJCURldmljZVBhc3N3b3JkSUQgPQorCQkJCQkJCSgqcG9zIDw8IDgpIHwgKihwb3MgKyAxKTsKKwkJCQkJCWhkZExvZyhMT0cxLCAiUGFzc3dvcmQgSUQ6ICV4IiwKKwkJCQkJCSAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCSAgICAgICBzYXBXUFNCZWFjb25JRS4KKwkJCQkJCSAgICAgICBEZXZpY2VQYXNzd29yZElEKTsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTQmVhY29uSUUuCisJCQkJCQlGaWVsZFByZXNlbnQgfD0KKwkJCQkJCQlXUFNfQkVBQ09OX0RFVklDRVBBU1NXT1JESURfUFJFU0VOVDsKKwkJCQkJCXBvcyArPSAyOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSEREX1dQU19FTEVNX1JFR0lTVFJBX0NPTkZfTUVUSE9EUzoKKwkJCQkJCXBvcyArPQorCQkJCQkJCTQ7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU0JlYWNvbklFLgorCQkJCQkJU2VsZWN0ZWRSZWdpc3RyYUNmZ01ldGhvZCA9CisJCQkJCQkJKCpwb3MgPDwgOCkgfCAqKHBvcyArIDEpOworCQkJCQkJaGRkTG9nKExPRzEsCisJCQkJCQkgICAgICAgIlNlbGVjdCBSZWdpc3RyYSBDb25maWcgTWV0aG9kczogJXgiLAorCQkJCQkJICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJICAgICAgIHNhcFdQU0JlYWNvbklFLgorCQkJCQkJICAgICAgIFNlbGVjdGVkUmVnaXN0cmFDZmdNZXRob2QpOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNCZWFjb25JRS4KKwkJCQkJCUZpZWxkUHJlc2VudCB8PQorCQkJCQkJCVdQU19CRUFDT05fU0VMRUNURURSRUdJU1RSQUNGR01FVEhPRF9QUkVTRU5UOworCQkJCQkJcG9zICs9IDI7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEhERF9XUFNfRUxFTV9VVUlEX0U6CisJCQkJCQlwb3MgKz0gMjsKKwkJCQkJCWxlbmd0aCA9ICpwb3MgPDwgOCB8ICoocG9zICsgMSk7CisJCQkJCQlwb3MgKz0gMjsKKwkJCQkJCWNkZl9tZW1fY29weShwU2FwX1dQU0llLT4KKwkJCQkJCQkgICAgIHNhcHdwc2llLgorCQkJCQkJCSAgICAgc2FwV1BTQmVhY29uSUUuCisJCQkJCQkJICAgICBVVUlEX0UsIHBvcywKKwkJCQkJCQkgICAgIGxlbmd0aCk7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU0JlYWNvbklFLgorCQkJCQkJRmllbGRQcmVzZW50IHw9CisJCQkJCQkJV1BTX0JFQUNPTl9VVUlERV9QUkVTRU5UOworCQkJCQkJcG9zICs9IGxlbmd0aDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEhERF9XUFNfRUxFTV9SRl9CQU5EUzoKKwkJCQkJCXBvcyArPSA0OworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNCZWFjb25JRS5SRkJhbmQgPQorCQkJCQkJCSpwb3M7CisJCQkJCQloZGRMb2coTE9HMSwgIlJGIGJhbmQ6ICVkIiwKKwkJCQkJCSAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCSAgICAgICBzYXBXUFNCZWFjb25JRS5SRkJhbmQpOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNCZWFjb25JRS4KKwkJCQkJCUZpZWxkUHJlc2VudCB8PQorCQkJCQkJCVdQU19CRUFDT05fUkZfQkFORFNfUFJFU0VOVDsKKwkJCQkJCXBvcyArPSAxOworCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWhkZExvZyhMT0dXLAorCQkJCQkJICAgICAgICJVTktOT1dOIFRMViBpbiBXUFMgSUUoJXgpIiwKKwkJCQkJCSAgICAgICAoKnBvcyA8PCA4IHwKKwkJCQkJCQkqKHBvcyArIDEpKSk7CisJCQkJCQljZGZfbWVtX2ZyZWUocFNhcF9XUFNJZSk7CisJCQkJCQlrZnJlZShmd3BzX2dlbmllKTsKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQloZGRMb2coTE9HRSwgRkwoIldQUyBJRSBNaXNtYXRjaCAlWCIpLAorCQkJCSAgICAgICB3cHNfZ2VuaWVbMF0pOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWhkZExvZyhMT0dFLCBGTCgiU2V0IFVOS05PV04gSUUgJVgiKSwgd3BzX2dlbmllWzBdKTsKKwkJCWNkZl9tZW1fZnJlZShwU2FwX1dQU0llKTsKKwkJCWtmcmVlKGZ3cHNfZ2VuaWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKHdwc19nZW5pZVswXSA9PSBlUUNfV1BTX1BST0JFX1JTUF9JRSkgeworCQlwU2FwX1dQU0llLT5zYXBXUFNJRUNvZGUgPSBlU0FQX1dQU19QUk9CRV9SU1BfSUU7CisJCXdwc19nZW5pZSA9IHdwc19nZW5pZSArIDE7CisJCXN3aXRjaCAod3BzX2dlbmllWzBdKSB7CisJCWNhc2UgRE9UMTFGX0VJRF9XUEE6CisJCQlpZiAod3BzX2dlbmllWzFdIDwgMiArIDQpIHsKKwkJCQljZGZfbWVtX2ZyZWUocFNhcF9XUFNJZSk7CisJCQkJa2ZyZWUoZndwc19nZW5pZSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgaWYgKG1lbWNtcCgmd3BzX2dlbmllWzJdLCAiXHgwMFx4NTBceGYyXHgwNCIsIDQpCisJCQkJICAgPT0gMCkgeworCQkJCWhkZExvZyhMT0cxLCBGTCgiU2V0IFdQUyBQUk9CRSBSU1AgSUUobGVuICVkKSIpLAorCQkJCSAgICAgICB3cHNfZ2VuaWVbMV0gKyAyKTsKKwkJCQlwb3MgPSAmd3BzX2dlbmllWzZdOworCQkJCXdoaWxlICgoKHNpemVfdCkgcG9zIC0KKwkJCQkJKHNpemVfdCkgJndwc19nZW5pZVs2XSkgPAorCQkJCSAgICAgICAod3BzX2dlbmllWzFdIC0gNCkpIHsKKwkJCQkJc3dpdGNoICgodWludDE2X3QpICgqcG9zIDw8IDgpIHwKKwkJCQkJCSoocG9zICsgMSkpIHsKKwkJCQkJY2FzZSBIRERfV1BTX0VMRU1fVkVSU0lPTjoKKwkJCQkJCXBvcyArPSA0OworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLlZlcnNpb24gPQorCQkJCQkJCSpwb3M7CisJCQkJCQloZGRMb2coTE9HMSwgIldQUyB2ZXJzaW9uICVkIiwKKwkJCQkJCSAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCSAgICAgICBzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJICAgICAgIFZlcnNpb24pOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJRmllbGRQcmVzZW50IHw9CisJCQkJCQkJV1BTX1BST0JSU1BfVkVSX1BSRVNFTlQ7CisJCQkJCQlwb3MgKz0gMTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgSEREX1dQU19FTEVNX1dQU19TVEFURToKKwkJCQkJCXBvcyArPSA0OworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLndwc1N0YXRlID0KKwkJCQkJCQkqcG9zOworCQkJCQkJaGRkTG9nKExPRzEsICJXUFMgU3RhdGUgJWQiLAorCQkJCQkJICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJICAgICAgIHNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQkgICAgICAgd3BzU3RhdGUpOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJRmllbGRQcmVzZW50IHw9CisJCQkJCQkJV1BTX1BST0JSU1BfU1RBVEVfUFJFU0VOVDsKKwkJCQkJCXBvcyArPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSEREX1dQU19FTEVNX0FQU0VUVVBMT0NLOgorCQkJCQkJcG9zICs9IDQ7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQlBUFNldHVwTG9ja2VkID0gKnBvczsKKwkJCQkJCWhkZExvZyhMT0cxLCAiQVAgc2V0dXAgbG9jayAlZCIsCisJCQkJCQkgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQkgICAgICAgc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCSAgICAgICBBUFNldHVwTG9ja2VkKTsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCUZpZWxkUHJlc2VudCB8PQorCQkJCQkJCVdQU19QUk9CUlNQX0FQU0VUVVBMT0NLX1BSRVNFTlQ7CisJCQkJCQlwb3MgKz0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEhERF9XUFNfRUxFTV9TRUxFQ1RFRFJFR0lTVFJBOgorCQkJCQkJcG9zICs9IDQ7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQlTZWxlY3RlZFJlZ2lzdHJhID0gKnBvczsKKwkJCQkJCWhkZExvZyhMT0cxLAorCQkJCQkJICAgICAgICJTZWxlY3RlZCBSZWdpc3RyYSAlZCIsCisJCQkJCQkgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQkgICAgICAgc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCSAgICAgICBTZWxlY3RlZFJlZ2lzdHJhKTsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCUZpZWxkUHJlc2VudCB8PQorCQkJCQkJCVdQU19QUk9CUlNQX1NFTEVDVEVEUkVHSVNUUkFfUFJFU0VOVDsKKwkJCQkJCXBvcyArPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSEREX1dQU19FTEVNX0RFVklDRV9QQVNTV09SRF9JRDoKKwkJCQkJCXBvcyArPSA0OworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJRGV2aWNlUGFzc3dvcmRJRCA9CisJCQkJCQkJKCpwb3MgPDwgOCkgfCAqKHBvcyArIDEpOworCQkJCQkJaGRkTG9nKExPRzEsICJQYXNzd29yZCBJRDogJWQiLAorCQkJCQkJICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJICAgICAgIHNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQkgICAgICAgRGV2aWNlUGFzc3dvcmRJRCk7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQlGaWVsZFByZXNlbnQgfD0KKwkJCQkJCQlXUFNfUFJPQlJTUF9ERVZJQ0VQQVNTV09SRElEX1BSRVNFTlQ7CisJCQkJCQlwb3MgKz0gMjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEhERF9XUFNfRUxFTV9SRUdJU1RSQV9DT05GX01FVEhPRFM6CisJCQkJCQlwb3MgKz0KKwkJCQkJCQk0OworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJU2VsZWN0ZWRSZWdpc3RyYUNmZ01ldGhvZCA9CisJCQkJCQkJKCpwb3MgPDwgOCkgfCAqKHBvcyArIDEpOworCQkJCQkJaGRkTG9nKExPRzEsCisJCQkJCQkgICAgICAgIlNlbGVjdCBSZWdpc3RyYSBDb25maWcgTWV0aG9kczogJXgiLAorCQkJCQkJICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJICAgICAgIHNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQkgICAgICAgU2VsZWN0ZWRSZWdpc3RyYUNmZ01ldGhvZCk7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQlGaWVsZFByZXNlbnQgfD0KKwkJCQkJCQlXUFNfUFJPQlJTUF9TRUxFQ1RFRFJFR0lTVFJBQ0ZHTUVUSE9EX1BSRVNFTlQ7CisJCQkJCQlwb3MgKz0gMjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEhERF9XUFNfRUxFTV9SU1BfVFlQRToKKwkJCQkJCXBvcyArPSA0OworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJUmVzcG9uc2VUeXBlID0gKnBvczsKKwkJCQkJCWhkZExvZyhMT0cxLAorCQkJCQkJICAgICAgICJDb25maWcgTWV0aG9kczogJWQiLAorCQkJCQkJICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJICAgICAgIHNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQkgICAgICAgUmVzcG9uc2VUeXBlKTsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCUZpZWxkUHJlc2VudCB8PQorCQkJCQkJCVdQU19QUk9CUlNQX1JFU1BPTlNFVFlQRV9QUkVTRU5UOworCQkJCQkJcG9zICs9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBIRERfV1BTX0VMRU1fVVVJRF9FOgorCQkJCQkJcG9zICs9IDI7CisJCQkJCQlsZW5ndGggPSAqcG9zIDw8IDggfCAqKHBvcyArIDEpOworCQkJCQkJcG9zICs9IDI7CisJCQkJCQljZGZfbWVtX2NvcHkocFNhcF9XUFNJZS0+CisJCQkJCQkJICAgICBzYXB3cHNpZS4KKwkJCQkJCQkgICAgIHNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQkJICAgICBVVUlEX0UsIHBvcywKKwkJCQkJCQkgICAgIGxlbmd0aCk7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQlGaWVsZFByZXNlbnQgfD0KKwkJCQkJCQlXUFNfUFJPQlJTUF9VVUlERV9QUkVTRU5UOworCQkJCQkJcG9zICs9IGxlbmd0aDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgSEREX1dQU19FTEVNX01BTlVGQUNUVVJFUjoKKwkJCQkJCXBvcyArPSAyOworCQkJCQkJbGVuZ3RoID0gKnBvcyA8PCA4IHwgKihwb3MgKyAxKTsKKwkJCQkJCXBvcyArPSAyOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJTWFudWZhY3R1cmUubnVtX25hbWUgPQorCQkJCQkJCWxlbmd0aDsKKwkJCQkJCWNkZl9tZW1fY29weShwU2FwX1dQU0llLT4KKwkJCQkJCQkgICAgIHNhcHdwc2llLgorCQkJCQkJCSAgICAgc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCQkgICAgIE1hbnVmYWN0dXJlLm5hbWUsCisJCQkJCQkJICAgICBwb3MsIGxlbmd0aCk7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQlGaWVsZFByZXNlbnQgfD0KKwkJCQkJCQlXUFNfUFJPQlJTUF9NQU5VRkFDVFVSRV9QUkVTRU5UOworCQkJCQkJcG9zICs9IGxlbmd0aDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgSEREX1dQU19FTEVNX01PREVMX05BTUU6CisJCQkJCQlwb3MgKz0gMjsKKwkJCQkJCWxlbmd0aCA9ICpwb3MgPDwgOCB8ICoocG9zICsgMSk7CisJCQkJCQlwb3MgKz0gMjsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTUHJvYmVSc3BJRS5Nb2RlbE5hbWUuCisJCQkJCQludW1fdGV4dCA9IGxlbmd0aDsKKwkJCQkJCWNkZl9tZW1fY29weShwU2FwX1dQU0llLT4KKwkJCQkJCQkgICAgIHNhcHdwc2llLgorCQkJCQkJCSAgICAgc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCQkgICAgIE1vZGVsTmFtZS50ZXh0LAorCQkJCQkJCSAgICAgcG9zLCBsZW5ndGgpOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJRmllbGRQcmVzZW50IHw9CisJCQkJCQkJV1BTX1BST0JSU1BfTU9ERUxOQU1FX1BSRVNFTlQ7CisJCQkJCQlwb3MgKz0gbGVuZ3RoOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSEREX1dQU19FTEVNX01PREVMX05VTToKKwkJCQkJCXBvcyArPSAyOworCQkJCQkJbGVuZ3RoID0gKnBvcyA8PCA4IHwgKihwb3MgKyAxKTsKKwkJCQkJCXBvcyArPSAyOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJTW9kZWxOdW1iZXIubnVtX3RleHQgPQorCQkJCQkJCWxlbmd0aDsKKwkJCQkJCWNkZl9tZW1fY29weShwU2FwX1dQU0llLT4KKwkJCQkJCQkgICAgIHNhcHdwc2llLgorCQkJCQkJCSAgICAgc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCQkgICAgIE1vZGVsTnVtYmVyLnRleHQsCisJCQkJCQkJICAgICBwb3MsIGxlbmd0aCk7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQlGaWVsZFByZXNlbnQgfD0KKwkJCQkJCQlXUFNfUFJPQlJTUF9NT0RFTE5VTUJFUl9QUkVTRU5UOworCQkJCQkJcG9zICs9IGxlbmd0aDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEhERF9XUFNfRUxFTV9TRVJJQUxfTlVNOgorCQkJCQkJcG9zICs9IDI7CisJCQkJCQlsZW5ndGggPSAqcG9zIDw8IDggfCAqKHBvcyArIDEpOworCQkJCQkJcG9zICs9IDI7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQlTZXJpYWxOdW1iZXIubnVtX3RleHQgPQorCQkJCQkJCWxlbmd0aDsKKwkJCQkJCWNkZl9tZW1fY29weShwU2FwX1dQU0llLT4KKwkJCQkJCQkgICAgIHNhcHdwc2llLgorCQkJCQkJCSAgICAgc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCQkgICAgIFNlcmlhbE51bWJlci50ZXh0LAorCQkJCQkJCSAgICAgcG9zLCBsZW5ndGgpOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJRmllbGRQcmVzZW50IHw9CisJCQkJCQkJV1BTX1BST0JSU1BfU0VSSUFMTlVNQkVSX1BSRVNFTlQ7CisJCQkJCQlwb3MgKz0gbGVuZ3RoOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSEREX1dQU19FTEVNX1BSSU1BUllfREVWSUNFX1RZUEU6CisJCQkJCQlwb3MgKz0gNDsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCVByaW1hcnlEZXZpY2VDYXRlZ29yeSA9CisJCQkJCQkJKCpwb3MgPDwgOCB8ICoocG9zICsgMSkpOworCQkJCQkJaGRkTG9nKExPRzEsCisJCQkJCQkgICAgICAgInByaW1hcnkgZGV2IGNhdGVnb3J5OiAlZCIsCisJCQkJCQkgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQkgICAgICAgc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCSAgICAgICBQcmltYXJ5RGV2aWNlQ2F0ZWdvcnkpOworCQkJCQkJcG9zICs9IDI7CisKKwkJCQkJCWNkZl9tZW1fY29weShwU2FwX1dQU0llLT4KKwkJCQkJCQkgICAgIHNhcHdwc2llLgorCQkJCQkJCSAgICAgc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCQkgICAgIFByaW1hcnlEZXZpY2VPVUksCisJCQkJCQkJICAgICBwb3MsCisJCQkJCQkJICAgICBIRERfV1BTX0RFVklDRV9PVUlfTEVOKTsKKwkJCQkJCWhkZExvZyhMT0cxLAorCQkJCQkJICAgICAgICJwcmltYXJ5IGRldiBvdWk6ICUwMngsICUwMngsICUwMngsICUwMngiLAorCQkJCQkJICAgICAgIHBvc1swXSwgcG9zWzFdLCBwb3NbMl0sCisJCQkJCQkgICAgICAgcG9zWzNdKTsKKwkJCQkJCXBvcyArPSA0OworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJRGV2aWNlU3ViQ2F0ZWdvcnkgPQorCQkJCQkJCSgqcG9zIDw8IDggfCAqKHBvcyArIDEpKTsKKwkJCQkJCWhkZExvZyhMT0cxLAorCQkJCQkJICAgICAgICJwcmltYXJ5IGRldiBzdWIgY2F0ZWdvcnk6ICVkIiwKKwkJCQkJCSAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCSAgICAgICBzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJICAgICAgIERldmljZVN1YkNhdGVnb3J5KTsKKwkJCQkJCXBvcyArPSAyOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJRmllbGRQcmVzZW50IHw9CisJCQkJCQkJV1BTX1BST0JSU1BfUFJJTUFSWURFVklDRVRZUEVfUFJFU0VOVDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEhERF9XUFNfRUxFTV9ERVZJQ0VfTkFNRToKKwkJCQkJCXBvcyArPSAyOworCQkJCQkJbGVuZ3RoID0gKnBvcyA8PCA4IHwgKihwb3MgKyAxKTsKKwkJCQkJCXBvcyArPSAyOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLkRldmljZU5hbWUuCisJCQkJCQludW1fdGV4dCA9IGxlbmd0aDsKKwkJCQkJCWNkZl9tZW1fY29weShwU2FwX1dQU0llLT4KKwkJCQkJCQkgICAgIHNhcHdwc2llLgorCQkJCQkJCSAgICAgc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCQkgICAgIERldmljZU5hbWUudGV4dCwKKwkJCQkJCQkgICAgIHBvcywgbGVuZ3RoKTsKKwkJCQkJCXBvcyArPSBsZW5ndGg7CisJCQkJCQlwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCXNhcFdQU1Byb2JlUnNwSUUuCisJCQkJCQlGaWVsZFByZXNlbnQgfD0KKwkJCQkJCQlXUFNfUFJPQlJTUF9ERVZJQ0VOQU1FX1BSRVNFTlQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBIRERfV1BTX0VMRU1fQ09ORklHX01FVEhPRFM6CisJCQkJCQlwb3MgKz0gNDsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCUNvbmZpZ01ldGhvZCA9CisJCQkJCQkJKCpwb3MgPDwgOCkgfCAqKHBvcyArIDEpOworCQkJCQkJaGRkTG9nKExPRzEsCisJCQkJCQkgICAgICAgIkNvbmZpZyBNZXRob2RzOiAlZCIsCisJCQkJCQkgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQkgICAgICAgc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCSAgICAgICBTZWxlY3RlZFJlZ2lzdHJhQ2ZnTWV0aG9kKTsKKwkJCQkJCXBvcyArPSAyOworCQkJCQkJcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCQlzYXBXUFNQcm9iZVJzcElFLgorCQkJCQkJRmllbGRQcmVzZW50IHw9CisJCQkJCQkJV1BTX1BST0JSU1BfQ09ORklHTUVUSE9EU19QUkVTRU5UOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBIRERfV1BTX0VMRU1fUkZfQkFORFM6CisJCQkJCQlwb3MgKz0gNDsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTUHJvYmVSc3BJRS5SRkJhbmQgPQorCQkJCQkJCSpwb3M7CisJCQkJCQloZGRMb2coTE9HMSwgIlJGIGJhbmQ6ICVkIiwKKwkJCQkJCSAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJCSAgICAgICBzYXBXUFNQcm9iZVJzcElFLlJGQmFuZCk7CisJCQkJCQlwb3MgKz0gMTsKKwkJCQkJCXBTYXBfV1BTSWUtPnNhcHdwc2llLgorCQkJCQkJc2FwV1BTUHJvYmVSc3BJRS4KKwkJCQkJCUZpZWxkUHJlc2VudCB8PQorCQkJCQkJCVdQU19QUk9CUlNQX1JGX0JBTkRTX1BSRVNFTlQ7CisJCQkJCQlicmVhazsKKwkJCQkJfSAvKiBzd2l0Y2ggKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgiV1BTIElFIE1pc21hdGNoICVYIiksIHdwc19nZW5pZVswXSk7CisJCQl9CisKKwkJfSAvKiBzd2l0Y2ggKi8KKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCWNkZl9yZXRfc3RhdHVzID0KKwkJd2xhbnNhcF9zZXRfd3BzX2llKFdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpLAorCQkJCSAgIHBTYXBfV1BTSWUpOworI2Vsc2UKKwljZGZfcmV0X3N0YXR1cyA9IHdsYW5zYXBfc2V0X3dwc19pZShwX2Nkc19jb250ZXh0LCBwU2FwX1dQU0llKTsKKyNlbmRpZgorCXBIb3N0YXBkU3RhdGUgPSBXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihwSG9zdGFwZEFkYXB0ZXIpOworCWlmIChwSG9zdGFwZFN0YXRlLT5iQ29tbWl0ICYmIFdQU0llVHlwZSA9PSBlUUNfV1BTX1BST0JFX1JTUF9JRSkgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJd2xhbnNhcF91cGRhdGVfd3BzX2llKFdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpKTsKKyNlbHNlCisJCXdsYW5zYXBfdXBkYXRlX3dwc19pZShwX2Nkc19jb250ZXh0KTsKKyNlbmRpZgorCX0KKworCWNkZl9tZW1fZnJlZShwU2FwX1dQU0llKTsKKwlrZnJlZShmd3BzX2dlbmllKTsKKwlFWElUKCk7CisJcmV0dXJuIGNkZl9yZXRfc3RhdHVzOworfQorCitzdGF0aWMgaW50IGl3X3NvZnRhcF9zZXR3cHNpZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgICBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NvZnRhcF9zZXR3cHNpZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitfX2l3X3NvZnRhcF9zdG9wYnNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICh0ZXN0X2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZwSG9zdGFwZEFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkgeworCQloZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlID0KKwkJCVdMQU5fSEREX0dFVF9IT1NUQVBfU1RBVEVfUFRSKHBIb3N0YXBkQWRhcHRlcik7CisKKwkJY2RmX2V2ZW50X3Jlc2V0KCZwSG9zdGFwZFN0YXRlLT5jZGZfc3RvcF9ic3NfZXZlbnQpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJc3RhdHVzID0KKwkJCXdsYW5zYXBfc3RvcF9ic3MoV0xBTl9IRERfR0VUX1NBUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcikpOworI2Vsc2UKKwkJc3RhdHVzID0KKwkJCXdsYW5zYXBfc3RvcF9ic3MoKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPgorCQkJCQkgcGNkc19jb250ZXh0KTsKKyNlbmRpZgorCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkJY2RmX3dhaXRfc2luZ2xlX2V2ZW50KCZwSG9zdGFwZFN0YXRlLT4KKwkJCQkJCSAgICAgIGNkZl9zdG9wX2Jzc19ldmVudCwKKwkJCQkJCSAgICAgIDEwMDAwKTsKKworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgid2FpdCBmb3Igc2luZ2xlX2V2ZW50IGZhaWxlZCEhIikpOworCQkJCUNERl9BU1NFUlQoMCk7CisJCQl9CisJCX0KKwkJY2xlYXJfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnBIb3N0YXBkQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCQljZHNfZGVjcl9zZXNzaW9uX3NldF9wY2woaGRkX2N0eCwKKwkJCQkJICAgICBwSG9zdGFwZEFkYXB0ZXItPmRldmljZV9tb2RlLAorCQkJCQkgICAgIHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbklkKTsKKwl9CisJRVhJVCgpOworCXJldHVybiAoc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykgPyAwIDogLUVCVVNZOworfQorCitzdGF0aWMgaW50IGl3X3NvZnRhcF9zdG9wYnNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc29mdGFwX3N0b3Bic3MoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorX19pd19zb2Z0YXBfdmVyc2lvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwloZGRfd2xhbl9nZXRfdmVyc2lvbihwSG9zdGFwZEFkYXB0ZXIsIHdycXUsIGV4dHJhKTsKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfc29mdGFwX3ZlcnNpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zb2Z0YXBfdmVyc2lvbihkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMKK0NERl9TVEFUVVMgaGRkX3NvZnRhcF9nZXRfc3RhX2luZm8oaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgaW50IGJ1Zl9sZW4pIHsKKwl1aW50OF90IGk7CisJdWludDhfdCBtYXhTdGEgPSAwOworCWludCBsZW4gPSAwOworCWNvbnN0IGNoYXIgc3RhX2luZm9faGVhZGVyW10gPSAic3RhSWQgc3RhQWRkcmVzcyI7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEFkYXB0ZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCWlmICgwICE9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCkpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisKKwlsZW4gPSBzY25wcmludGYocEJ1ZiwgYnVmX2xlbiwgc3RhX2luZm9faGVhZGVyKTsKKwlwQnVmICs9IGxlbjsKKwlidWZfbGVuIC09IGxlbjsKKworCW1heFN0YSA9IGhkZF9jdHgtPmNvbmZpZy0+bWF4TnVtYmVyT2ZQZWVyczsKKworCWZvciAoaSA9IDA7IGkgPD0gbWF4U3RhOyBpKyspIHsKKwkJaWYgKHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5pc1VzZWQpIHsKKwkJCWxlbiA9CisJCQkJc2NucHJpbnRmKHBCdWYsIGJ1Zl9sZW4sCisJCQkJCSAgIiU1ZCAuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCQkgIHBBZGFwdGVyLT5hU3RhSW5mb1tpXS51Y1NUQUlkLAorCQkJCQkgIHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5tYWNBZGRyU1RBLmJ5dGVzWzBdLAorCQkJCQkgIHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5tYWNBZGRyU1RBLmJ5dGVzWzFdLAorCQkJCQkgIHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5tYWNBZGRyU1RBLmJ5dGVzWzJdLAorCQkJCQkgIHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5tYWNBZGRyU1RBLmJ5dGVzWzNdLAorCQkJCQkgIHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5tYWNBZGRyU1RBLmJ5dGVzWzRdLAorCQkJCQkgIHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5tYWNBZGRyU1RBLgorCQkJCQkgIGJ5dGVzWzVdKTsKKwkJCXBCdWYgKz0gbGVuOworCQkJYnVmX2xlbiAtPSBsZW47CisJCX0KKwkJaWYgKFdFX0dFVF9TVEFfSU5GT19TSVpFID4gYnVmX2xlbikgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBfX2l3X3NvZnRhcF9nZXRfc3RhX2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN0YXR1cyA9CisJCWhkZF9zb2Z0YXBfZ2V0X3N0YV9pbmZvKHBIb3N0YXBkQWRhcHRlciwgZXh0cmEsCisJCQkJCVdFX1NBUF9NQVhfU1RBX0lORk8pOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBnZXQgc3RhIGluZm86ICVkIiksIHN0YXR1cyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSk7CisJRVhJVCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X3NvZnRhcF9nZXRfc3RhX2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJCSAgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zb2Z0YXBfZ2V0X3N0YV9pbmZvKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19zZXRfYXBfZ2VuaWUoKSAtIHNldCBhcCB3cGEvcnNuIGllCisgKgorICogQGRldiAtIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAaW5mbyAtIFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1IC0gUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAqIEBleHRyYSAtIFBvaW50ZXIgdG8gdGhlIGRhdGEuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2l3X3NldF9hcF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKSB7CisKKwloZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJdl9DT05URVhUX3QgY2RzX2N0eDsKKyNlbmRpZgorCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl1aW50OF90ICpnZW5pZSA9ICh1aW50OF90ICopZXh0cmE7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisjaWZuZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwljZHNfY3R4ID0gaGRkX2N0eC0+cGNkc19jb250ZXh0OworCWlmIChOVUxMID09IGNkc19jdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogQ0RGIENvbnRleHQgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmCisKKwlpZiAoIXdycXUtPmRhdGEubGVuZ3RoKSB7CisJCUVYSVQoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChnZW5pZVswXSkgeworCWNhc2UgRE9UMTFGX0VJRF9XUEE6CisJY2FzZSBET1QxMUZfRUlEX1JTTjoKKwkJaWYgKChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpKS0+dVByaXZhY3kgPT0gMCkgeworCQkJaGRkX3NvZnRhcF9kZXJlZ2lzdGVyX2JjX3N0YShwSG9zdGFwZEFkYXB0ZXIpOworCQkJaGRkX3NvZnRhcF9yZWdpc3Rlcl9iY19zdGEocEhvc3RhcGRBZGFwdGVyLCAxKTsKKwkJfQorCQkoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKSktPnVQcml2YWN5ID0gMTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJCWNkZl9yZXRfc3RhdHVzID0KKwkJCXdsYW5zYXBfc2V0X3dwYXJzbl9pZXMoV0xBTl9IRERfR0VUX1NBUF9DVFhfUFRSCisJCQkJCQkgICAgICAgKHBIb3N0YXBkQWRhcHRlciksIGdlbmllLAorCQkJCQkgICAgICAgd3JxdS0+ZGF0YS5sZW5ndGgpOworI2Vsc2UKKwkJY2RmX3JldF9zdGF0dXMgPQorCQkJd2xhbnNhcF9zZXRfd3BhcnNuX2llcyhjZHNfY3R4LCBnZW5pZSwKKwkJCQkJICAgICAgIHdycXUtPmRhdGEubGVuZ3RoKTsKKyNlbmRpZgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWhkZExvZyhMT0dFLCBGTCgiU2V0IFVOS05PV04gSUUgJVgiKSwgZ2VuaWVbMF0pOworCQljZGZfcmV0X3N0YXR1cyA9IDA7CisJfQorCisJRVhJVCgpOworCXJldHVybiBjZGZfcmV0X3N0YXR1czsKK30KKworLyoqCisgKiBpd19zZXRfYXBfZ2VuaWUoKSAtIFdyYXBwZXIgZnVuY3Rpb24gdG8gcHJvdGVjdCBfX2l3X3NldF9hcF9nZW5pZQorICogICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgU1NSLgorICoKKyAqIEBkZXYgLSBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICogQGluZm8gLSBQb2ludGVyIHRvIHRoZSBpd19yZXF1ZXN0X2luZm8uCisgKiBAd3JxdSAtIFBvaW50ZXIgdG8gdGhlIGl3cmVxX2RhdGEuCisgKiBAZXh0cmEgLSBQb2ludGVyIHRvIHRoZSBkYXRhLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK2l3X3NldF9hcF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF9hcF9nZW5pZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMKK2ludCBfX2l3X2dldF9zb2Z0YXBfbGlua3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJY2hhciAqcExpbmtTcGVlZCA9IChjaGFyICopZXh0cmE7CisJdWludDMyX3QgbGlua19zcGVlZCA9IDA7CisJaW50IGxlbiA9IHNpemVvZih1aW50MzJfdCkgKyAxOworCXRTaXJNYWNBZGRyIG1hY0FkZHJlc3M7CisJY2hhciBwbWFjQWRkcmVzc1tNQUNfQUREUkVTU19TVFJfTEVOICsgMV07CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwlpbnQgcmMsIHZhbGlkLCBpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwl2YWxpZCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gdmFsaWQpCisJCXJldHVybiB2YWxpZDsKKworCWhkZExvZyhMT0cxLCBGTCgid3JxdS0+ZGF0YS5sZW5ndGgoJWQpIiksIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+PSBNQUNfQUREUkVTU19TVFJfTEVOIC0gMSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKilwbWFjQWRkcmVzcywKKwkJCQkgICB3cnF1LT5kYXRhLnBvaW50ZXIsIE1BQ19BRERSRVNTX1NUUl9MRU4pKSB7CisJCQloZGRMb2coTE9HMSwgRkwoImZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiKSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlwbWFjQWRkcmVzc1tNQUNfQUREUkVTU19TVFJfTEVOXSA9ICdcMCc7CisKKwkJaWYgKCFtYWNfcHRvbihwbWFjQWRkcmVzcywgbWFjQWRkcmVzcykpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiU3RyaW5nIHRvIEhleCBjb252ZXJzaW9uIEZhaWxlZCIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCS8qIElmIG5vIG1hYyBhZGRyZXNzIGlzIHBhc3NlZCBhbmQvb3IgaXRzIGxlbmd0aCBpcyBsZXNzIHRoYW4gMTcsCisJICogbGluayBzcGVlZCBmb3IgZmlyc3QgY29ubmVjdGVkIGNsaWVudCB3aWxsIGJlIHJldHVybmVkLgorCSAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IDE3IHx8ICFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspIHsKKwkJCWlmIChwSG9zdGFwZEFkYXB0ZXItPmFTdGFJbmZvW2ldLmlzVXNlZCAmJgorCQkJICAgICghY2RmX2lzX21hY2FkZHJfYnJvYWRjYXN0CisJCQkJICAoJnBIb3N0YXBkQWRhcHRlci0+YVN0YUluZm9baV0ubWFjQWRkclNUQSkpKSB7CisJCQkJY2RmX2NvcHlfbWFjYWRkcigKKwkJCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgbWFjQWRkcmVzcywKKwkJCQkJICZwSG9zdGFwZEFkYXB0ZXItPmFTdGFJbmZvW2ldLgorCQkJCQkgbWFjQWRkclNUQSk7CisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIHBlZXIgbWFjYWRkcmVzcyIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN0YXR1cyA9IHdsYW5faGRkX2dldF9saW5rc3BlZWRfZm9yX3BlZXJtYWMocEhvc3RhcGRBZGFwdGVyLAorCQkJCQkJICAgIG1hY0FkZHJlc3MpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJVbmFibGUgdG8gcmV0cmlldmUgU01FIGxpbmtzcGVlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGlua19zcGVlZCA9IHBIb3N0YXBkQWRhcHRlci0+bHNfc3RhdHMuZXN0TGlua1NwZWVkOworCisJLyogbGlua3NwZWVkIGluIHVuaXRzIG9mIDUwMCBrYnBzICovCisJbGlua19zcGVlZCA9IGxpbmtfc3BlZWQgLyA1MDA7CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBsZW47CisJcmMgPSBzbnByaW50ZihwTGlua1NwZWVkLCBsZW4sICIldSIsIGxpbmtfc3BlZWQpOworCWlmICgocmMgPCAwKSB8fCAocmMgPj0gbGVuKSkgeworCQkvKiBlbmNvZGluZyBvciBsZW5ndGggZXJyb3I/ICovCisJCWhkZExvZyhMT0dFLCBGTCgiVW5hYmxlIHRvIGVuY29kZSBsaW5rIHNwZWVkIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXdfZ2V0X3NvZnRhcF9saW5rc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19nZXRfc29mdGFwX2xpbmtzcGVlZChkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBob3N0YXBkX2hhbmRsZXJbXSA9IHsKKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ0dJV05BTUUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DU0lXTldJRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X2FwX2ZyZXEsICAgICAgICAgICAgLyogU0lPQ0dJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DU0lXTU9ERSAqLworCShpd19oYW5kbGVyKSBpd19nZXRfbW9kZSwgICAgICAgLyogU0lPQ0dJV01PREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DU0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ0dJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV1BSSVYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DR0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NTSVdTVEFUUyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdTVEFUUyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NTSVdTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DR0lXU1BZICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DU0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DR0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgaXdfc2V0X2FwX21sbWUsICAgICAgICAgICAgLyogU0lPQ1NJV01MTUUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DR0lXQVBMSVNUICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DR0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NTSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NTSVdOSUNLTiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdOSUNLTiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV1JBVEUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DR0lXUkFURSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NTSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X2FwX3J0c190aHJlc2hvbGQsICAgICAgICAgICAvKiBTSU9DR0lXUlRTICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X2FwX2ZyYWdfdGhyZXNob2xkLCAgICAgICAgICAvKiBTSU9DR0lXRlJBRyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NTSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NTSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DR0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV1BPV0VSICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ0dJV1BPV0VSICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgaXdfc2V0X2FwX2dlbmllLCAgICAgICAgICAgLyogU0lPQ1NJV0dFTklFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ0dJV0dFTklFICovCisJKGl3X2hhbmRsZXIpIGl3X3NldF9hdXRoX2hvc3RhcCwgICAgICAgIC8qIFNJT0NTSVdBVVRIICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ0dJV0FVVEggKi8KKwkoaXdfaGFuZGxlcikgaXdfc2V0X2FwX2VuY29kZWV4dCwgICAgICAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DU0lXUE1LU0EgKi8KK307CisKKy8qCisgKiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpb2N0bHMgd2VyZSBkZWZpbmVkIHdpdGggc2VtYW50aWNzIHdoaWNoCisgKiBjYW5ub3QgYmUgaGFuZGxlZCBieSB0aGUgIml3cHJpdiIgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGFuZCBoZW5jZQorICogdGhleSBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBob3N0YXBkX3ByaXZhdGVfYXJncyBhcnJheQorICogICAgIFFDU0FQX0lPQ1RMX0FTU09DX1NUQV9NQUNBRERSCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgaG9zdGFwZF9wcml2YXRlX2FyZ3NbXSA9IHsKKwl7CisJCVFDU0FQX0lPQ1RMX1NFVFBBUkFNLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMiwgMCwgInNldHBhcmFtIgorCX0sIHsKKwkJUUNTQVBfSU9DVExfU0VUUEFSQU0sCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiIgorCX0sIHsKKwkJUUNTQVBfUEFSQU1fTUFYX0FTU09DLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwKKwkJInNldE1heEFzc29jIgorCX0sIHsKKwkJUUNTQVBfUEFSQU1fSElERV9TU0lELAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImhpZGVTU0lEIgorCX0sIHsKKwkJUUNTQVBfUEFSQU1fU0VUX01DX1JBVEUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0TWNSYXRlIgorCX0sCisJeworCQlRQ1NBUF9QQVJBTV9TRVRfVFhSWF9GV19TVEFUUywKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJCSJ0eHJ4X2Z3X3N0YXRzIgorCX0sIHsKKwkJUUNTQVBfUEFSQU1fU0VUX01DQ19DSEFOTkVMX0xBVEVOQ1ksCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCQkic2V0TWNjTGF0ZW5jeSIKKwl9LCB7CisJCVFDU0FQX1BBUkFNX1NFVF9NQ0NfQ0hBTk5FTF9RVU9UQSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJCSJzZXRNY2NRdW90YSIKKwl9LCB7CisJCVFDU0FQX1BBUkFNX1NFVF9DSEFOTkVMX0NIQU5HRSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJCSJzZXRDaGFuQ2hhbmdlIgorCX0sIHsKKwkJUUNTQVBfUEFSQU1fQVVUT19DSEFOTkVMLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwKKwkJInNldEF1dG9DaGFubmVsIgorCX0sCisJLyogU3ViLWNtZHMgREJHTE9HIHNwZWNpZmljIGNvbW1hbmRzICovCisJeworCQlRQ1NBUF9EQkdMT0dfTE9HX0xFVkVMLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgImRsX2xvZ2xldmVsIgorCX0sIHsKKwkJUUNTQVBfREJHTE9HX1ZBUF9FTkFCTEUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiZGxfdmFwb24iCisJfSwgeworCQlRQ1NBUF9EQkdMT0dfVkFQX0RJU0FCTEUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkwLCAiZGxfdmFwb2ZmIgorCX0sIHsKKwkJUUNTQVBfREJHTE9HX01PRFVMRV9FTkFCTEUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiZGxfbW9kb24iCisJfSwgeworCQlRQ1NBUF9EQkdMT0dfTU9EVUxFX0RJU0FCTEUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkwLCAiZGxfbW9kb2ZmIgorCX0sIHsKKwkJUUNTQVBfREJHTE9HX01PRF9MT0dfTEVWRUwsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkwLCAiZGxfbW9kX2xvZ2xldmVsIgorCX0sIHsKKwkJUUNTQVBfREJHTE9HX1RZUEUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiZGxfdHlwZSIKKwl9LCB7CisJCVFDU0FQX0RCR0xPR19SRVBPUlRfRU5BQkxFLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgImRsX3JlcG9ydCIKKwl9LCB7CisJCVFDQVNBUF9UWFJYX0ZXU1RBVFNfUkVTRVQsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkwLCAidHhyeF9md19zdF9yc3QiCisJfSwgeworCQlRQ1NBUF9QQVJBTV9SVFNDVFMsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkwLCAiZW5hYmxlcnRzY3RzIgorCX0sIHsKKwkJUUNBU0FQX1NFVF8xMU5fUkFURSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCTAsICJzZXQxMU5SYXRlcyIKKwl9LCB7CisJCVFDQVNBUF9TRVRfVkhUX1JBVEUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkwLCAic2V0MTFBQ1JhdGVzIgorCX0sIHsKKwkJUUNBU0FQX1NIT1JUX0dJLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgImVuYWJsZV9zaG9ydF9naSIKKwl9LCB7CisJCVFDU0FQX1NFVF9BTVBEVSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJhbXBkdSIKKwl9LCB7CisJCVFDU0FQX1NFVF9BTVNEVSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJhbXNkdSIKKwl9LCB7CisJCVFDU0FQX0dUWF9IVF9NQ1MsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiZ3R4SFRNY3MiCisJfSwgeworCQlRQ1NBUF9HVFhfVkhUX01DUywKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCTAsICJndHhWSFRNY3MiCisJfSwgeworCQlRQ1NBUF9HVFhfVVNSQ0ZHLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgImd0eFVzckNmZyIKKwl9LCB7CisJCVFDU0FQX0dUWF9USFJFLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImd0eFRocmUiCisJfSwgeworCQlRQ1NBUF9HVFhfTUFSR0lOLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgImd0eE1hcmdpbiIKKwl9LCB7CisJCVFDU0FQX0dUWF9TVEVQLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImd0eFN0ZXAiCisJfSwgeworCQlRQ1NBUF9HVFhfTUlOVFBDLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgImd0eE1pblRwYyIKKwl9LCB7CisJCVFDU0FQX0dUWF9CV01BU0ssCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkwLCAiZ3R4QldNYXNrIgorCX0sIHsKKwkJUUNTQVBfUEFSQU1fQ0xSX0FDTCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCTAsICJzZXRDbGVhckFjbCIKKwl9LCB7CisJCVFDU0FQX1BBUkFNX0FDTF9NT0RFLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldEFjbE1vZGUiCisJfSwKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisJeworCQlRQ0FTQVBfU0VUX0RFQlVHX0xPRywKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXREYmdMdmwiCisJfSwKKyNlbmRpZiAvKiBRQ0FfUEtUX1BST1RPX1RSQUNFICovCisJeworCQlRQ0FTQVBfU0VUX1RNX0xFVkVMLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgInNldFRtTGV2ZWwiCisJfSwgeworCQlRQ0FTQVBfU0VUX0RGU19JR05PUkVfQ0FDLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgInNldERmc0lnbm9yZUNBQyIKKwl9LCB7CisJCVFDQVNBUF9TRVRfREZTX05PTCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCTAsICJzZXRkZnNub2wiCisJfSwgeworCQlRQ0FTQVBfU0VUX0RGU19UQVJHRVRfQ0hOTCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCTAsICJzZXROZXh0Q2hubCIKKwl9LCB7CisJCVFDQVNBUF9TRVRfUkFEQVJfQ01ELAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldFJhZGFyIgorCX0sCisJeworCQlRQ1NBUF9JUEFfVUNfU1RBVCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJpcGF1Y3N0YXQiCisJfSwKKwl7CisJCVFDQVNBUF9UWF9DSEFJTk1BU0tfQ01ELAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgInNldF90eGNoYWlubWFzayIKKwl9LCB7CisJCVFDQVNBUF9SWF9DSEFJTk1BU0tfQ01ELAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgInNldF9yeGNoYWlubWFzayIKKwl9LCB7CisJCVFDQVNBUF9OU1NfQ01ELAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9uc3MiCisJfSwgeworCQlRQ0FTQVBfU0VUX1BIWU1PREUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkwLCAic2V0cGh5bW9kZSIKKwl9LCB7CisJCVFDQVNBUF9EVU1QX1NUQVRTLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgImR1bXBTdGF0cyIKKwl9LCB7CisJCVFDQVNBUF9DTEVBUl9TVEFUUywKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCTAsICJjbGVhclN0YXRzIgorCX0sIHsKKwkJUUNTQVBfSU9DVExfR0VUUEFSQU0sIDAsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0cGFyYW0iCisJfSwgeworCQlRQ1NBUF9JT0NUTF9HRVRQQVJBTSwgMCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICIiCisJfSwgeworCQlRQ1NBUF9QQVJBTV9NQVhfQVNTT0MsIDAsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0TWF4QXNzb2MiCisJfSwgeworCQlRQ1NBUF9QQVJBTV9HRVRfV0xBTl9EQkcsIDAsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0d2xhbmRiZyIKKwl9LCB7CisJCVFDU0FQX1BBUkFNX0FVVE9fQ0hBTk5FTCwgMCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRBdXRvQ2hhbm5lbCIKKwl9LCB7CisJCVFDU0FQX0dUWF9CV01BU0ssIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkiZ2V0X2d0eEJXTWFzayIKKwl9LCB7CisJCVFDU0FQX0dUWF9NSU5UUEMsIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkiZ2V0X2d0eE1pblRwYyIKKwl9LCB7CisJCVFDU0FQX0dUWF9TVEVQLCAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJImdldF9ndHhTdGVwIgorCX0sIHsKKwkJUUNTQVBfR1RYX01BUkdJTiwgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCSJnZXRfZ3R4TWFyZ2luIgorCX0sIHsKKwkJUUNTQVBfR1RYX1RIUkUsIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkiZ2V0X2d0eFRocmUiCisJfSwgeworCQlRQ1NBUF9HVFhfVVNSQ0ZHLCAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJImdldF9ndHhVc3JDZmciCisJfSwgeworCQlRQ1NBUF9HVFhfVkhUX01DUywgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCSJnZXRfZ3R4VkhUTWNzIgorCX0sIHsKKwkJUUNTQVBfR1RYX0hUX01DUywgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCSJnZXRfZ3R4SFRNY3MiCisJfSwgeworCQlRQ0FTQVBfU0hPUlRfR0ksIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkiZ2V0X3Nob3J0X2dpIgorCX0sIHsKKwkJUUNTQVBfUEFSQU1fUlRTQ1RTLCAwLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9ydHNjdHMiCisJfSwgeworCQlRQ0FTQVBfR0VUX0RGU19OT0wsIDAsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0ZGZzbm9sIgorCX0sIHsKKwkJUUNTQVBfR0VUX0FDTCwgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCSJnZXRfYWNsX2xpc3QiCisJfSwgeworCQlRQ0FTQVBfVFhfQ0hBSU5NQVNLX0NNRCwgMCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCSJnZXRfdHhjaGFpbm1hc2siCisJfSwgeworCQlRQ0FTQVBfUlhfQ0hBSU5NQVNLX0NNRCwgMCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCSJnZXRfcnhjaGFpbm1hc2siCisJfSwgeworCQlRQ0FTQVBfTlNTX0NNRCwgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCSJnZXRfbnNzIgorCX0sIHsKKwkJUUNBU0FQX0dFVF9URU1QX0NNRCwgMCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRfdGVtcCIKKwl9LCB7CisJCVFDU0FQX0lPQ1RMX0dFVF9TVEFXUEFJRSwKKwkJSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCQkiZ2V0X3N0YVdQQUlFIgorCX0sIHsKKwkJUUNTQVBfSU9DVExfU0VUV1BBSUUsCisJCUlXX1BSSVZfVFlQRV9CWVRFIHwgUUNTQVBfTUFYX1dTQ19JRSB8CisJCUlXX1BSSVZfU0laRV9GSVhFRCwgMCwgInNldHdwYWllIgorCX0sIHsKKwkJUUNTQVBfSU9DVExfU1RPUEJTUywgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQsIDAsCisJCSJzdG9wYnNzIgorCX0sIHsKKwkJUUNTQVBfSU9DVExfVkVSU0lPTiwgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBRQ1NBUF9NQVhfV1NDX0lFLAorCQkidmVyc2lvbiIKKwl9LCB7CisJCVFDU0FQX0lPQ1RMX0dFVF9TVEFfSU5GTywgMCwKKwkJSVdfUFJJVl9UWVBFX0NIQVIgfCBXRV9TQVBfTUFYX1NUQV9JTkZPLCAiZ2V0X3N0YV9pbmZvIgorCX0sIHsKKwkJUUNTQVBfSU9DVExfR0VUX1dQU19QQkNfUFJPQkVfUkVRX0lFUywKKwkJSVdfUFJJVl9UWVBFX0JZVEUgfAorCQlzaXplb2Yoc1FjU2FwcmVxX1dQU1BCQ1Byb2JlUmVxSUVTX3QpIHwKKwkJSVdfUFJJVl9TSVpFX0ZJWEVELCAwLCAiZ2V0UHJvYmVSZXFJRXMiCisJfQorCSwgeworCQlRQ1NBUF9JT0NUTF9HRVRfQ0hBTk5FTCwgMCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRjaGFubmVsIgorCX0KKwksIHsKKwkJUUNTQVBfSU9DVExfRElTQVNTT0NfU1RBLAorCQlJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDYsIDAsCisJCSJkaXNhc3NvY19zdGEiCisJfQorCS8qIGhhbmRsZXIgZm9yIG1haW4gaW9jdGwgKi8KKwksIHsKKwkJUUNTQVBfUFJJVl9HRVRfQ0hBUl9TRVRfTk9ORSwgMCwKKwkJSVdfUFJJVl9UWVBFX0NIQVIgfCBXRV9NQVhfU1RSX0xFTiwgIiIKKwl9CisJLyogaGFuZGxlciBmb3Igc3ViLWlvY3RsICovCisJLCB7CisJCVFDU0FQX0dFVF9TVEFUUywgMCwKKwkJSVdfUFJJVl9UWVBFX0NIQVIgfCBXRV9NQVhfU1RSX0xFTiwgImdldFN0YXRzIgorCX0KKwksIHsKKwkJUUNTQVBfSU9DVExfUFJJVl9HRVRfU09GVEFQX0xJTktfU1BFRUQsCisJCUlXX1BSSVZfVFlQRV9DSEFSIHwgMTgsCisJCUlXX1BSSVZfVFlQRV9DSEFSIHwgNSwgImdldExpbmtTcGVlZCIKKwl9CisJLCB7CisJCVFDU0FQX0lPQ1RMX1BSSVZfU0VUX1RIUkVFX0lOVF9HRVRfTk9ORSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDMsIDAsICIiCisJfQorCSwKKwkvKiBoYW5kbGVycyBmb3Igc3ViLWlvY3RsICovCisJeworCQlXRV9TRVRfV0xBTl9EQkcsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAzLCAwLCAic2V0d2xhbmRiZyIKKwl9LCB7CisJCVdFX1NFVF9TQVBfQ0hBTk5FTFMsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAzLCAwLCAic2V0c2FwY2hhbm5lbHMiCisJfQorCSwKKwkvKiBoYW5kbGVycyBmb3Igc3ViLWlvY3RsICovCisJeworCQlXRV9TRVRfRFBfVFJBQ0UsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAzLCAwLCAic2V0X2RwX3RyYWNlIgorCX0KKwksCisJLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKwl7CisJCVFDU0FQX0lPQ1RMX1BSSVZfU0VUX1ZBUl9JTlRfR0VUX05PTkUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsIDAsICIiCisJfQorCSwgeworCQlXRV9QMlBfTk9BX0NNRCwgSVdfUFJJVl9UWVBFX0lOVCB8IE1BWF9WQVJfQVJHUywgMCwgIlNldFAycFBzIgorCX0KKwksIHsKKwkJV0VfVU5JVF9URVNUX0NNRCwgSVdfUFJJVl9UWVBFX0lOVCB8IE1BWF9WQVJfQVJHUywgMCwKKwkJInNldFVuaXRUZXN0Q21kIgorCX0KKwksCisJLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKwl7CisJCVFDU0FQX0lPQ1RMX01PRElGWV9BQ0wsCisJCUlXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgOCwgMCwgIm1vZGlmeV9hY2wiCisJfQorCSwKKwkvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCAqLworCXsKKwkJUUNTQVBfSU9DVExfR0VUX0NIQU5ORUxfTElTVCwKKwkJMCwKKwkJSVdfUFJJVl9UWVBFX0JZVEUgfCBzaXplb2YodENoYW5uZWxMaXN0SW5mbyksCisJCSJnZXRDaGFubmVsTGlzdCIKKwl9CisJLAorCS8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisJeworCQlRQ1NBUF9JT0NUTF9TRVRfVFhfUE9XRVIsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0VHhQb3dlciIKKwl9CisJLAorCS8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisJeworCQlRQ1NBUF9JT0NUTF9TRVRfTUFYX1RYX1BPV0VSLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwgInNldFR4TWF4UG93ZXIiCisJfQorCSwKKwkvKiBTZXQgSEREIENGRyBJbmkgcGFyYW0gKi8KKwl7CisJCVFDU0FQX0lPQ1RMX1NFVF9JTklfQ0ZHLAorCQlJV19QUklWX1RZUEVfQ0hBUiB8IFFDU0FQX0lPQ1RMX01BWF9TVFJfTEVOLCAwLCAic2V0Q29uZmlnIgorCX0KKwksCisJLyogR2V0IEhERCBDRkcgSW5pIHBhcmFtICovCisJeworCQlRQ1NBUF9JT0NUTF9HRVRfSU5JX0NGRywKKwkJMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBRQ1NBUF9JT0NUTF9NQVhfU1RSX0xFTiwgImdldENvbmZpZyIKKwl9CisJLAorCS8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisJeworCS8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisJCVFDU0FQX0lPQ1RMX1NFVF9UV09fSU5UX0dFVF9OT05FLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMiwgMCwgIiIKKwl9CisJLAorCS8qIGhhbmRsZXJzIGZvciBzdWItaW9jdGwgKi8KKyNpZmRlZiBERUJVRworCXsKKwkJUUNTQVBfSU9DVExfU0VUX0ZXX0NSQVNIX0lOSkVDVCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDIsCisJCTAsICJjcmFzaF9pbmplY3QiCisJfQorCSwKKyNlbmRpZgorCXsKKwkJUUNBU0FQX1NFVF9SQURBUl9EQkcsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkwLCAgInNldFJhZGFyRGJnIgorCX0KKwksCisJLyogZHVtcCBkcCB0cmFjZSAtIGRlc2NyaXB0b3Igb3IgZHAgdHJhY2UgcmVjb3JkcyAqLworCXsKKwkJUUNTQVBfSU9DVExfRFVNUF9EUF9UUkFDRV9MRVZFTCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDIsCisJCTAsICJkdW1wX2RwX3RyYWNlIgorCX0KKwksCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBob3N0YXBkX3ByaXZhdGVbXSA9IHsKKwkvKiBzZXQgcHJpdiBpb2N0bCAqLworCVtRQ1NBUF9JT0NUTF9TRVRQQVJBTSAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19zb2Z0YXBfc2V0cGFyYW0sCisJLyogZ2V0IHByaXYgaW9jdGwgKi8KKwlbUUNTQVBfSU9DVExfR0VUUEFSQU0gLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfc29mdGFwX2dldHBhcmFtLAorCS8qIGdldCBzdGF0aW9uIGdlbklFICovCisJW1FDU0FQX0lPQ1RMX0dFVF9TVEFXUEFJRSAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19nZXRfZ2VuaWUsCisJW1FDU0FQX0lPQ1RMX1NFVFdQQUlFIC0gU0lPQ0lXRklSU1RQUklWXSA9IGl3X3NvZnRhcF9zZXR3cHNpZSwKKwkvKiBzdG9wIGJzcyAqLworCVtRQ1NBUF9JT0NUTF9TVE9QQlNTIC0gU0lPQ0lXRklSU1RQUklWXSA9IGl3X3NvZnRhcF9zdG9wYnNzLAorCS8qIGdldCBkcml2ZXIgdmVyc2lvbiAqLworCVtRQ1NBUF9JT0NUTF9WRVJTSU9OIC0gU0lPQ0lXRklSU1RQUklWXSA9IGl3X3NvZnRhcF92ZXJzaW9uLAorCVtRQ1NBUF9JT0NUTF9HRVRfV1BTX1BCQ19QUk9CRV9SRVFfSUVTIC0gU0lPQ0lXRklSU1RQUklWXSA9CisJCWl3X2dldF93cHNwYmNfcHJvYmVfcmVxX2llcywKKwlbUUNTQVBfSU9DVExfR0VUX0NIQU5ORUwgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc29mdGFwX2dldGNoYW5uZWwsCisJW1FDU0FQX0lPQ1RMX0FTU09DX1NUQV9NQUNBRERSIC0gU0lPQ0lXRklSU1RQUklWXSA9CisJCWl3X3NvZnRhcF9nZXRhc3NvY19zdGFtYWNhZGRyLAorCVtRQ1NBUF9JT0NUTF9ESVNBU1NPQ19TVEEgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc29mdGFwX2Rpc2Fzc29jX3N0YSwKKwlbUUNTQVBfUFJJVl9HRVRfQ0hBUl9TRVRfTk9ORSAtIFNJT0NJV0ZJUlNUUFJJVl0gPQorCQlpd19nZXRfY2hhcl9zZXRub25lLAorCVtRQ1NBUF9JT0NUTF9QUklWX1NFVF9USFJFRV9JTlRfR0VUX05PTkUgLQorCSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc2V0X3RocmVlX2ludHNfZ2V0bm9uZSwKKwlbUUNTQVBfSU9DVExfUFJJVl9TRVRfVkFSX0lOVF9HRVRfTk9ORSAtCisJIFNJT0NJV0ZJUlNUUFJJVl0gPQorCQlpd19zZXRfdmFyX2ludHNfZ2V0bm9uZSwKKwlbUUNTQVBfSU9DVExfU0VUX0NIQU5ORUxfUkFOR0UgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJCQkJaXdfc29mdGFwX3NldF9mb3JjZV9hY3NfY2hfcmFuZ2UsCisJW1FDU0FQX0lPQ1RMX01PRElGWV9BQ0wgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc29mdGFwX21vZGlmeV9hY2wsCisJW1FDU0FQX0lPQ1RMX0dFVF9DSEFOTkVMX0xJU1QgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc29mdGFwX2dldF9jaGFubmVsX2xpc3QsCisJW1FDU0FQX0lPQ1RMX0dFVF9TVEFfSU5GTyAtIFNJT0NJV0ZJUlNUUFJJVl0gPQorCQlpd19zb2Z0YXBfZ2V0X3N0YV9pbmZvLAorCVtRQ1NBUF9JT0NUTF9QUklWX0dFVF9TT0ZUQVBfTElOS19TUEVFRCAtCisJIFNJT0NJV0ZJUlNUUFJJVl0gPQorCQlpd19nZXRfc29mdGFwX2xpbmtzcGVlZCwKKwlbUUNTQVBfSU9DVExfU0VUX1RYX1BPV0VSIC0gU0lPQ0lXRklSU1RQUklWXSA9CisJCWl3X3NvZnRhcF9zZXRfdHhfcG93ZXIsCisJW1FDU0FQX0lPQ1RMX1NFVF9NQVhfVFhfUE9XRVIgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc29mdGFwX3NldF9tYXhfdHhfcG93ZXIsCisJW1FDU0FQX0lPQ1RMX1NFVF9JTklfQ0ZHIC0gU0lPQ0lXRklSU1RQUklWXSA9CisJCWl3X3NvZnRhcF9zZXRfaW5pX2NmZywKKwlbUUNTQVBfSU9DVExfR0VUX0lOSV9DRkcgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc29mdGFwX2dldF9pbmlfY2ZnLAorCVtRQ1NBUF9JT0NUTF9TRVRfVFdPX0lOVF9HRVRfTk9ORSAtIFNJT0NJV0ZJUlNUUFJJVl0gPQorCQlpd19zb2Z0YXBfc2V0X3R3b19pbnRzX2dldG5vbmUsCit9OworY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIGhvc3RhcGRfaGFuZGxlcl9kZWYgPSB7CisJLm51bV9zdGFuZGFyZCA9IENERl9BUlJBWV9TSVpFKGhvc3RhcGRfaGFuZGxlciksCisJLm51bV9wcml2YXRlID0gQ0RGX0FSUkFZX1NJWkUoaG9zdGFwZF9wcml2YXRlKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IENERl9BUlJBWV9TSVpFKGhvc3RhcGRfcHJpdmF0ZV9hcmdzKSwKKwkuc3RhbmRhcmQgPSAoaXdfaGFuZGxlciAqKSBob3N0YXBkX2hhbmRsZXIsCisJLnByaXZhdGUgPSAoaXdfaGFuZGxlciAqKSBob3N0YXBkX3ByaXZhdGUsCisJLnByaXZhdGVfYXJncyA9IGhvc3RhcGRfcHJpdmF0ZV9hcmdzLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBOVUxMLAorfTsKKworc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldF9vcHNfc3RydWN0ID0geworCS5uZG9fb3BlbiA9IGhkZF9ob3N0YXBkX29wZW4sCisJLm5kb19zdG9wID0gaGRkX2hvc3RhcGRfc3RvcCwKKwkubmRvX3VuaW5pdCA9IGhkZF9ob3N0YXBkX3VuaW5pdCwKKwkubmRvX3N0YXJ0X3htaXQgPSBoZGRfc29mdGFwX2hhcmRfc3RhcnRfeG1pdCwKKwkubmRvX3R4X3RpbWVvdXQgPSBoZGRfc29mdGFwX3R4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHMgPSBoZGRfZ2V0X3N0YXRzLAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gaGRkX2hvc3RhcGRfc2V0X21hY19hZGRyZXNzLAorCS5uZG9fZG9faW9jdGwgPSBoZGRfaW9jdGwsCisJLm5kb19jaGFuZ2VfbXR1ID0gaGRkX2hvc3RhcGRfY2hhbmdlX210dSwKKwkubmRvX3NlbGVjdF9xdWV1ZSA9IGhkZF9ob3N0YXBkX3NlbGVjdF9xdWV1ZSwKK307CisKK3N0YXRpYyBpbnQgaGRkX3NldF9ob3N0YXBkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaGRkX3NldF9hcF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKnBXbGFuSG9zdGFwZERldikKK3sKKwlwV2xhbkhvc3RhcGREZXYtPm5ldGRldl9vcHMgPSAmbmV0X29wc19zdHJ1Y3Q7Cit9CisKK0NERl9TVEFUVVMgaGRkX2luaXRfYXBfbW9kZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwloZGRfaG9zdGFwZF9zdGF0ZV90ICpwaG9zdGFwZEJ1ZjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcEFkYXB0ZXItPmRldjsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCXZfQ09OVEVYVF90IHBfY2RzX2NvbnRleHQgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wY2RzX2NvbnRleHQ7CisJdl9DT05URVhUX3Qgc2FwQ29udGV4dCA9IE5VTEw7CisjZW5kaWYKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwlzYXBDb250ZXh0ID0gd2xhbnNhcF9vcGVuKHBfY2RzX2NvbnRleHQpOworCWlmIChzYXBDb250ZXh0ID09IE5VTEwpIHsKKwkJaGRkTG9nKExPR0UsICgiRVJST1I6IHdsYW5zYXBfb3BlbiBmYWlsZWQhISIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb250ZXh0ID0gc2FwQ29udGV4dDsKKworCXN0YXR1cyA9IHdsYW5zYXBfc3RhcnQoc2FwQ29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwgKCJFUlJPUjogd2xhbnNhcF9zdGFydCBmYWlsZWQhISIpKTsKKwkJd2xhbnNhcF9jbG9zZShzYXBDb250ZXh0KTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisjZW5kaWYKKworCS8qIEFsbG9jYXRlIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zIHN0YXRlIHN0cnVjdHVyZSAqLworCXBob3N0YXBkQnVmID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisJc21lX3NldF9jdXJyX2RldmljZV9tb2RlKHBIZGRDdHgtPmhIYWwsIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKwkvKiBaZXJvIHRoZSBtZW1vcnkuICBUaGlzIHplcm9zIHRoZSBwcm9maWxlIHN0cnVjdHVyZS4gKi8KKwltZW1zZXQocGhvc3RhcGRCdWYsIDAsIHNpemVvZihoZGRfaG9zdGFwZF9zdGF0ZV90KSk7CisKKwkvKiBTZXQgdXAgdGhlIHBvaW50ZXIgdG8gdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgc3RhdGUgc3RydWN0dXJlICovCisJLyogTk9QICovCisJc3RhdHVzID0gaGRkX3NldF9ob3N0YXBkKHBBZGFwdGVyKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLCAoIkVSUk9SOiBoZGRfc2V0X2hvc3RhcGQgZmFpbGVkISEiKSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQl3bGFuc2FwX2Nsb3NlKHNhcENvbnRleHQpOworI2VuZGlmCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gY2RmX2V2ZW50X2luaXQoJnBob3N0YXBkQnVmLT5jZGZfZXZlbnQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaGRkTG9nKExPR0UsICgiRVJST1I6IEhvc3RhcGQgSEREIGNkZiBldmVudCBpbml0IGZhaWxlZCEhIikpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJd2xhbnNhcF9jbG9zZShzYXBDb250ZXh0KTsKKyNlbmRpZgorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGNkZl9ldmVudF9pbml0KCZwaG9zdGFwZEJ1Zi0+Y2RmX3N0b3BfYnNzX2V2ZW50KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAoIkVSUk9SOiBIb3N0YXBkIEhERCBzdG9wIGJzcyBldmVudCBpbml0IGZhaWxlZCEhIikpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJd2xhbnNhcF9jbG9zZShzYXBDb250ZXh0KTsKKyNlbmRpZgorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWluaXRfY29tcGxldGlvbigmcEFkYXB0ZXItPnNlc3Npb25fY2xvc2VfY29tcF92YXIpOworCWluaXRfY29tcGxldGlvbigmcEFkYXB0ZXItPnNlc3Npb25fb3Blbl9jb21wX3Zhcik7CisKKwlzZW1hX2luaXQoJihXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwQWRhcHRlcikpLT5zZW1XcHNQQkNPdmVybGFwSW5kLCAxKTsKKworCS8qIFJlZ2lzdGVyIGFzIGEgd2lyZWxlc3MgZGV2aWNlICovCisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmaG9zdGFwZF9oYW5kbGVyX2RlZjsKKworCS8qIEluaXRpYWxpemUgdGhlIGRhdGEgcGF0aCBtb2R1bGUgKi8KKwlzdGF0dXMgPSBoZGRfc29mdGFwX2luaXRfdHhfcngocEFkYXB0ZXIpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaGRkTG9nKExPR1AsIEZMKCJoZGRfc29mdGFwX2luaXRfdHhfcnggZmFpbGVkIikpOworCX0KKworCXN0YXR1cyA9IGhkZF93bW1fYWRhcHRlcl9pbml0KHBBZGFwdGVyKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgImhkZF93bW1fYWRhcHRlcl9pbml0KCkgZmFpbGVkIGNvZGUgJTA4ZCBbeCUwOHhdIiwKKwkJICAgICAgIHN0YXR1cywgc3RhdHVzKTsKKwkJZ290byBlcnJvcl93bW1faW5pdDsKKwl9CisKKwlzZXRfYml0KFdNTV9JTklUX0RPTkUsICZwQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCisJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCSAgV01JX1BERVZfUEFSQU1fQlVSU1RfRU5BQkxFLAorCQkJCSAgcEhkZEN0eC0+Y29uZmlnLT5lbmFibGVTaWZzQnVyc3QsCisJCQkJICBQREVWX0NNRCk7CisKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgiV01JX1BERVZfUEFSQU1fQlVSU1RfRU5BQkxFIHNldCBmYWlsZWQgJWQiKSwgcmV0KTsKKwl9CisJcEFkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnLmFjc19jZmcuYWNzX21vZGUgPSBmYWxzZTsKKwljZGZfbWVtX2ZyZWUocEFkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnLmFjc19jZmcuY2hfbGlzdCk7CisJY2RmX21lbV96ZXJvKCZwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuYWNzX2NmZywKKwkJCQkJCXNpemVvZihzdHJ1Y3Qgc2FwX2Fjc19jZmcpKTsKKwlyZXR1cm4gc3RhdHVzOworCitlcnJvcl93bW1faW5pdDoKKwloZGRfc29mdGFwX2RlaW5pdF90eF9yeChwQWRhcHRlcik7CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCXdsYW5zYXBfY2xvc2Uoc2FwQ29udGV4dCk7CisjZW5kaWYKKwlFWElUKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBoZGRfd2xhbl9jcmVhdGVfYXBfZGV2KCkgLSBjcmVhdGUgYW4gQVAtbW9kZSBkZXZpY2UKKyAqIEBwSGRkQ3R4OiBHbG9iYWwgSEREIGNvbnRleHQKKyAqIEBtYWNBZGRyOiBNQUMgYWRkcmVzcyB0byBhc3NpZ24gdG8gdGhlIGludGVyZmFjZQorICogQGlmYWNlX25hbWU6IFVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgYSBMaW51eCBuZXRfZGV2aWNlIGFuZCBjb25maWd1cmF0aW9uIGl0CisgKiBmb3IgYW4gQVAgbW9kZSBvZiBvcGVyYXRpb24uICBOb3RlIHRoYXQgdGhlIGRldmljZSBpcyBOT1QgYWN0dWFsbHkKKyAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUga2VybmVsIGF0IHRoaXMgdGltZS4KKyAqCisgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBkYXRhIHBvcnRpb24gb2YgdGhlIG5ldF9kZXZpY2UgaWYKKyAqIHRoZSBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UuCisgKi8KK2hkZF9hZGFwdGVyX3QgKmhkZF93bGFuX2NyZWF0ZV9hcF9kZXYoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkgICAgICB0U2lyTWFjQWRkciBtYWNBZGRyLAorCQkJCSAgICAgIHVpbnQ4X3QgKmlmYWNlX25hbWUpIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcFdsYW5Ib3N0YXBkRGV2ID0gTlVMTDsKKwloZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSBOVUxMOworCisJaGRkTG9nKExPRzQsIEZMKCJpZmFjZV9uYW1lID0gJXMiKSwgaWZhY2VfbmFtZSk7CisKKwlwV2xhbkhvc3RhcGREZXYgPQorCQlhbGxvY19uZXRkZXZfbXEoc2l6ZW9mKGhkZF9hZGFwdGVyX3QpLCBpZmFjZV9uYW1lLAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTcsIDApKQorCQkJCU5FVF9OQU1FX1VOS05PV04sCisjZW5kaWYKKwkJCQlldGhlcl9zZXR1cCwKKwkJCQlOVU1fVFhfUVVFVUVTKTsKKworCWlmIChwV2xhbkhvc3RhcGREZXYgIT0gTlVMTCkgeworCQlwSG9zdGFwZEFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwV2xhbkhvc3RhcGREZXYpOworCisJCS8qIEluaXQgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlICovCisJCWV0aGVyX3NldHVwKHBXbGFuSG9zdGFwZERldik7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgYWRhcHRlciBjb250ZXh0IHRvIHplcm9zLiAqLworCQljZGZfbWVtX3plcm8ocEhvc3RhcGRBZGFwdGVyLCBzaXplb2YoaGRkX2FkYXB0ZXJfdCkpOworCQlwSG9zdGFwZEFkYXB0ZXItPmRldiA9IHBXbGFuSG9zdGFwZERldjsKKwkJcEhvc3RhcGRBZGFwdGVyLT5wSGRkQ3R4ID0gcEhkZEN0eDsKKwkJcEhvc3RhcGRBZGFwdGVyLT5tYWdpYyA9IFdMQU5fSEREX0FEQVBURVJfTUFHSUM7CisKKwkJaGRkTG9nKExPRzQsCisJCSAgICAgICBGTCgicFdsYW5Ib3N0YXBkRGV2ID0gJXAsIHBIb3N0YXBkQWRhcHRlciA9ICVwLCBjb25jdXJyZW5jeV9tb2RlPTB4JXgiKSwKKwkJICAgICAgIHBXbGFuSG9zdGFwZERldiwKKwkJICAgICAgIHBIb3N0YXBkQWRhcHRlciwKKwkJICAgICAgIChpbnQpY2RzX2dldF9jb25jdXJyZW5jeV9tb2RlKCkpOworCisJCS8qIEluaXQgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlICovCisJCXN0cmxjcHkocFdsYW5Ib3N0YXBkRGV2LT5uYW1lLCAoY29uc3QgY2hhciAqKWlmYWNlX25hbWUsCisJCQlJRk5BTVNJWik7CisKKwkJaGRkX3NldF9hcF9vcHMocEhvc3RhcGRBZGFwdGVyLT5kZXYpOworCisJCXBXbGFuSG9zdGFwZERldi0+d2F0Y2hkb2dfdGltZW8gPSBIRERfVFhfVElNRU9VVDsKKwkJcFdsYW5Ib3N0YXBkRGV2LT5tdHUgPSBIRERfREVGQVVMVF9NVFU7CisKKwkJY2RmX21lbV9jb3B5KHBXbGFuSG9zdGFwZERldi0+ZGV2X2FkZHIsICh2b2lkICopbWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCWNkZl9tZW1fY29weShwSG9zdGFwZEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLAorCQkJICAgICAodm9pZCAqKW1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJCXBIb3N0YXBkQWRhcHRlci0+b2ZmbG9hZHNfY29uZmlndXJlZCA9IGZhbHNlOworCQlwV2xhbkhvc3RhcGREZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKKwkJcFdsYW5Ib3N0YXBkRGV2LT5pZWVlODAyMTFfcHRyID0gJnBIb3N0YXBkQWRhcHRlci0+d2RldjsKKwkJcEhvc3RhcGRBZGFwdGVyLT53ZGV2LndpcGh5ID0gcEhkZEN0eC0+d2lwaHk7CisJCXBIb3N0YXBkQWRhcHRlci0+d2Rldi5uZXRkZXYgPSBwV2xhbkhvc3RhcGREZXY7CisJCWluaXRfY29tcGxldGlvbigmcEhvc3RhcGRBZGFwdGVyLT50eF9hY3Rpb25fY25mX2V2ZW50KTsKKwkJaW5pdF9jb21wbGV0aW9uKCZwSG9zdGFwZEFkYXB0ZXItPmNhbmNlbF9yZW1fb25fY2hhbl92YXIpOworCQlpbml0X2NvbXBsZXRpb24oJnBIb3N0YXBkQWRhcHRlci0+cmVtX29uX2NoYW5fcmVhZHlfZXZlbnQpOworCQlpbml0X2NvbXBsZXRpb24oJnBIb3N0YXBkQWRhcHRlci0+c3RhX2F1dGhvcml6ZWRfZXZlbnQpOworCQlpbml0X2NvbXBsZXRpb24oJnBIb3N0YXBkQWRhcHRlci0+b2ZmY2hhbm5lbF90eF9ldmVudCk7CisJCWluaXRfY29tcGxldGlvbigmcEhvc3RhcGRBZGFwdGVyLT5zY2FuX2luZm8uCisJCQkJYWJvcnRzY2FuX2V2ZW50X3Zhcik7CisKKwkJU0VUX05FVERFVl9ERVYocFdsYW5Ib3N0YXBkRGV2LCBwSGRkQ3R4LT5wYXJlbnRfZGV2KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBIb3N0YXBkQWRhcHRlci0+cGF1c2VfbWFwX2xvY2spOworCX0KKwlyZXR1cm4gcEhvc3RhcGRBZGFwdGVyOworfQorCisvKioKKyAqIGhkZF9yZWdpc3Rlcl9ob3N0YXBkKCkgLSByZWdpc3RlciBob3N0YXBkCisgKiBAcEFkYXB0ZXI6IFBvaW50ZXIgdG8gaG9zdGFwZCBhZGFwdGVyCisgKiBAcnRubF9sb2NrX2hlbGQ6IFJUTkwgbG9jayBoZWxkCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgaGRkX3JlZ2lzdGVyX2hvc3RhcGQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJdWludDhfdCBydG5sX2xvY2tfaGVsZCkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwQWRhcHRlci0+ZGV2OworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJRU5URVIoKTsKKworCWlmIChydG5sX2xvY2tfaGVsZCkgeworCQlpZiAoc3RybmNocihkZXYtPm5hbWUsIHN0cmxlbihkZXYtPm5hbWUpLCAnJScpKSB7CisJCQlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpIDwgMCkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkOmRldl9hbGxvY19uYW1lIikpOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKwkJfQorCQlpZiAocmVnaXN0ZXJfbmV0ZGV2aWNlKGRldikpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkOnJlZ2lzdGVyX25ldGRldmljZSIpKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQ6cmVnaXN0ZXJfbmV0ZGV2IikpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfQorCXNldF9iaXQoTkVUX0RFVklDRV9SRUdJU1RFUkVELCAmcEFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKworCUVYSVQoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGhkZF91bnJlZ2lzdGVyX2hvc3RhcGQoKSAtIHVucmVnaXN0ZXIgaG9zdGFwZAorICogQHBBZGFwdGVyOiBQb2ludGVyIHRvIGhvc3RhcGQgYWRhcHRlcgorICogQHJ0bmxfaGVsZDogdHJ1ZSBpZiBydG5sIGxvY2sgaGVsZDsgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1hcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgaGRkX3VucmVnaXN0ZXJfaG9zdGFwZChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgYm9vbCBydG5sX2hlbGQpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCUNERl9TVEFUVVMgc3RhdHVzOworCXZvaWQgKnNhcENvbnRleHQgPSBXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIocEFkYXB0ZXIpOworI2VuZGlmCisKKwlFTlRFUigpOworCisJaGRkX3NvZnRhcF9kZWluaXRfdHhfcngocEFkYXB0ZXIpOworCisJLyogaWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBkdXJpbmcgZHJpdmVyIHVubG9hZCwKKwkgKiB0aGVuIHRoZSBkZXYgaGFzIGFscmVhZHkgYmVlbiBpbnZhbGlkYXRlZC4KKwkgKiBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGF0IG90aGVyIHRpbWVzLCB0aGVuIHdlIGNhbgorCSAqIGRldGFjaCB0aGUgd2lyZWxlc3MgZGV2aWNlIGhhbmRsZXJzCisJICovCisJaWYgKHBBZGFwdGVyLT5kZXYpIHsKKwkJaWYgKHJ0bmxfaGVsZCkKKwkJCXBBZGFwdGVyLT5kZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gTlVMTDsKKwkJZWxzZSB7CisJCQlydG5sX2xvY2soKTsKKwkJCXBBZGFwdGVyLT5kZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gTlVMTDsKKwkJCXJ0bmxfdW5sb2NrKCk7CisJCX0KKwl9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJc3RhdHVzID0gd2xhbnNhcF9zdG9wKHNhcENvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkOndsYW5zYXBfc3RvcCIpKTsKKworCXN0YXR1cyA9IHdsYW5zYXBfY2xvc2Uoc2FwQ29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQ6V0xBTlNBUF9jbG9zZSIpKTsKKwlwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb250ZXh0ID0gTlVMTDsKKyNlbmRpZgorCisJRVhJVCgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX3JhdGVfaXNfMTFnKCkgLSBjaGVjayBpZiByYXRlIGlzIDExZyByYXRlIG9yIG5vdAorICogQHJhdGU6IFJhdGUgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybjogdHJ1ZSBpZiByYXRlIGlmIDExZyBlbHNlIGZhbHNlCisgKi8KK3N0YXRpYyBib29sIHdsYW5faGRkX3JhdGVfaXNfMTFnKHU4IHJhdGUpCit7CisJc3RhdGljIGNvbnN0IHU4IGdSYXRlQXJyYXlbOF0gPSB7MTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwKKwkJCQkJIDk2LCAxMDh9OyAvKiBhY3R1YWwgcmF0ZSAqIDIgKi8KKwl1OCBpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKHJhdGUgPT0gZ1JhdGVBcnJheVtpXSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNpZmRlZiBRQ0FfSFRfMjA0MF9DT0VYCisvKioKKyAqIHdsYW5faGRkX2dldF9zYXBfb2JzcygpIC0gR2V0IFNBUCBPQlNTIGVuYWJsZSBjb25maWcgYmFzZWQgb24gSFRfQ0FQQUIgSUUKKyAqIEBwSG9zdGFwZEFkYXB0ZXI6IFBvaW50ZXIgdG8gaG9zdGFwZCBhZGFwdGVyCisgKgorICogUmV0dXJuOiBIVCBzdXBwb3J0IGNoYW5uZWwgd2lkdGggY29uZmlnIHZhbHVlCisgKi8KK3N0YXRpYyBib29sIHdsYW5faGRkX2dldF9zYXBfb2JzcyhoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIpCit7CisJdWludDhfdCBodF9jYXBfaWVbRE9UMTFGX0lFX0hUQ0FQU19NQVhfTEVOXTsKKwl0RG90MTFmSUVIVENhcHMgZG90MTFfaHRfY2FwX2llID0gezB9OworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJYmVhY29uX2RhdGFfdCAqYmVhY29uID0gcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbjsKKwl1aW50OF90ICppZSA9IE5VTEw7CisKKwlpZSA9IHdsYW5faGRkX2NmZzgwMjExX2dldF9pZV9wdHIoYmVhY29uLT50YWlsLCBiZWFjb24tPnRhaWxfbGVuLAorCQkJCQkJV0xBTl9FSURfSFRfQ0FQQUJJTElUWSk7CisJaWYgKGllICYmIGllWzFdKSB7CisJCWNkZl9tZW1fY29weShodF9jYXBfaWUsICZpZVsyXSwgRE9UMTFGX0lFX0hUQ0FQU19NQVhfTEVOKTsKKwkJZG90MTFmX3VucGFja19pZV9odF9jYXBzKCh0cEFuaVNpckdsb2JhbCloZGRfY3R4LT5oSGFsLAorCQkJCQlodF9jYXBfaWUsIGllWzFdLCAmZG90MTFfaHRfY2FwX2llKTsKKwkJcmV0dXJuIGRvdDExX2h0X2NhcF9pZS5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorI2Vsc2UKK3N0YXRpYyBib29sIHdsYW5faGRkX2dldF9zYXBfb2JzcyhoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIpCit7CisJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisvKioKKyAqIHdsYW5faGRkX3NldF9jaGFubmVsKCkgLSBzZXQgY2hhbm5lbCBpbiBzYXAgbW9kZQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5IHN0cnVjdHVyZQorICogQGRldjogUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogQGNoYW5kZWY6IFBvaW50ZXIgdG8gY2hhbm5lbCBkZWZpbml0aW9uIHN0cnVjdHVyZQorICogQGNoYW5uZWxfdHlwZTogQ2hhbm5lbCB0eXBlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfc2V0X2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKKwkJCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7CisJdWludDMyX3QgbnVtX2NoID0gMDsKKwlpbnQgY2hhbm5lbCA9IDA7CisJaW50IGNoYW5uZWxfc2VnMiA9IDA7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwlpbnQgc3RhdHVzOworCisJdFNtZUNvbmZpZ1BhcmFtcyBzbWVDb25maWc7CisJdHNhcF9Db25maWdfdCAqc2FwX2NvbmZpZzsKKworCUVOVEVSKCk7CisKKworCWlmIChOVUxMID09IGRldikgeworCQloZGRMb2coTE9HRSwgRkwoIkNhbGxlZCB3aXRoIGRldiA9IE5VTEwuIikpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0VUX0NIQU5ORUwsCisJCQkgcEFkYXB0ZXItPnNlc3Npb25JZCwgY2hhbm5lbF90eXBlKSk7CisKKwloZGRMb2coTE9HMSwgRkwoIkRldmljZV9tb2RlICVzKCVkKSAgZnJlcSA9ICVkIiksCisJICAgICAgIGhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkgICAgICAgcEFkYXB0ZXItPmRldmljZV9tb2RlLCBjaGFuZGVmLT5jaGFuLT5jZW50ZXJfZnJlcSk7CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKgorCSAqIERvIGZyZXEgdG8gY2hhbiBjb252ZXJzaW9uCisJICogVE9ETzogZm9yIDExYQorCSAqLworCisJY2hhbm5lbCA9IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChjaGFuZGVmLT5jaGFuLT5jZW50ZXJfZnJlcSk7CisJaWYgKE5MODAyMTFfQ0hBTl9XSURUSF84MFA4MCA9PSBjaGFuZGVmLT53aWR0aCkKKwkJY2hhbm5lbF9zZWcyID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNoYW5kZWYtPmNlbnRlcl9mcmVxMik7CisJZWxzZQorCQljaGFubmVsX3NlZzIgPSAwOworCisJLyogQ2hlY2sgZnJlcSByYW5nZSAqLworCWlmICgoV05JX0NGR19DVVJSRU5UX0NIQU5ORUxfU1RBTUlOID4gY2hhbm5lbCkgfHwKKwkgICAgKFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1BWCA8IGNoYW5uZWwpKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIkNoYW5uZWwgWyVkXSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlIGZyb20gJWQgdG8gJWQiKSwKKwkJICAgICAgIGNoYW5uZWwsIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1JTiwKKwkJICAgICAgIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1BWCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIGZyZXEgcmFuZ2UgKi8KKworCWlmICgoV05JX0NGR19DVVJSRU5UX0NIQU5ORUxfU1RBTUlOID4gY2hhbm5lbF9zZWcyKSB8fAorCSAgICAoV05JX0NGR19DVVJSRU5UX0NIQU5ORUxfU1RBTUFYIDwgY2hhbm5lbF9zZWcyKSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJDaGFubmVsIFslZF0gaXMgb3V0c2lkZSB2YWxpZCByYW5nZSBmcm9tICVkIHRvICVkIiksCisJCSAgICAgICBjaGFubmVsX3NlZzIsIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1JTiwKKwkJICAgICAgIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1BWCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW51bV9jaCA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKworCWlmICgoV0xBTl9IRERfU09GVEFQICE9IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgJiYKKwkgICAgKFdMQU5fSEREX1AyUF9HTyAhPSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpKSB7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJICAgIHdsYW5faGRkX3ZhbGlkYXRlX29wZXJhdGlvbl9jaGFubmVsKHBBZGFwdGVyLCBjaGFubmVsKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIENoYW5uZWwgWyVkXSIpLCBjaGFubmVsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWhkZExvZyhMT0cyLAorCQkgICAgICAgRkwoInNldCBjaGFubmVsIHRvIFslZF0gZm9yIGRldmljZSBtb2RlICVzKCVkKSIpLAorCQkgICAgICAgY2hhbm5lbCwKKwkJICAgICAgIGhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJICAgICAgIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisJfQorCisJaWYgKChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikKKwkgICAgfHwgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfQ0xJRU5UKQorCSAgICApIHsKKwkJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9CisJCQlXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCQl0Q3NyUm9hbVByb2ZpbGUgKnBSb2FtUHJvZmlsZSA9ICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZTsKKwkJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPQorCQkJV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwkJaWYgKGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCA9PQorCQkgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgeworCQkJLyogTGluayBpcyB1cCB0aGVuIHJldHVybiBjYW50IHNldCBjaGFubmVsICovCisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTCgiSUJTUyBBc3NvY2lhdGVkLCBjYW4ndCBzZXQgdGhlIGNoYW5uZWwiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW51bV9jaCA9IHBSb2FtUHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDE7CisJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5vcGVyYXRpb25DaGFubmVsID0gY2hhbm5lbDsKKwkJcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9CisJCQkmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWw7CisJfSBlbHNlIGlmICgocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCkKKwkJICAgfHwgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pCisJCSAgICkgeworCQlzYXBfY29uZmlnID0gJigoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEFkYXB0ZXIpKS0+c2FwQ29uZmlnKTsKKwkJaWYgKFdMQU5fSEREX1AyUF9HTyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJCSAgICB3bGFuX2hkZF92YWxpZGF0ZV9vcGVyYXRpb25fY2hhbm5lbChwQWRhcHRlciwKKwkJCQkJCQkJY2hhbm5lbCkpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoIkludmFsaWQgQ2hhbm5lbCBbJWRdIiksIGNoYW5uZWwpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJc2FwX2NvbmZpZy0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCQlzYXBfY29uZmlnLT5jaF9wYXJhbXMuY2VudGVyX2ZyZXFfc2VnMSA9IGNoYW5uZWxfc2VnMjsKKwkJfSBlbHNlIHsKKwkJCS8qIHNldCBjaGFubmVsIHRvIHdoYXQgaG9zdGFwZCBjb25maWd1cmVkICovCisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCQkJd2xhbl9oZGRfdmFsaWRhdGVfb3BlcmF0aW9uX2NoYW5uZWwocEFkYXB0ZXIsCisJCQkJCQkJCWNoYW5uZWwpKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKCJJbnZhbGlkIENoYW5uZWwgWyVkXSIpLCBjaGFubmVsKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJc2FwX2NvbmZpZy0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCQlzYXBfY29uZmlnLT5jaF9wYXJhbXMuY2VudGVyX2ZyZXFfc2VnMSA9IGNoYW5uZWxfc2VnMjsKKworCQkJY2RmX21lbV96ZXJvKCZzbWVDb25maWcsIHNpemVvZihzbWVDb25maWcpKTsKKwkJCXNtZV9nZXRfY29uZmlnX3BhcmFtKHBIZGRDdHgtPmhIYWwsICZzbWVDb25maWcpOworCQkJc3dpdGNoIChjaGFubmVsX3R5cGUpIHsKKwkJCWNhc2UgTkw4MDIxMV9DSEFOX0hUMjA6CisJCQljYXNlIE5MODAyMTFfQ0hBTl9OT19IVDoKKwkJCQlzbWVDb25maWcuY3NyQ29uZmlnLm9ic3NFbmFibGVkID0gZmFsc2U7CisJCQkJaWYgKGNoYW5uZWwgPD0gMTQpCisJCQkJCXNtZUNvbmZpZy5jc3JDb25maWcuCisJCQkJCQljaGFubmVsQm9uZGluZ01vZGUyNEdIeiA9CisJCQkJCWVDU1JfSU5JX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCQkJCWVsc2UKKwkJCQkJc21lQ29uZmlnLmNzckNvbmZpZy4KKwkJCQkJCWNoYW5uZWxCb25kaW5nTW9kZTVHSHogPQorCQkJCQllQ1NSX0lOSV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkpCisJCQkJc2FwX2NvbmZpZy0+Y2hfd2lkdGhfb3JpZyA9CisJCQkJCQllSFRfQ0hBTk5FTF9XSURUSF8yME1IWjsKKyNlbmRpZgorCQkJCXNhcF9jb25maWctPnNlY19jaCA9IDA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTkw4MDIxMV9DSEFOX0hUNDBNSU5VUzoKKwkJCQlpZiAoY2hhbm5lbCA8PSAxNCkKKwkJCQkJc21lQ29uZmlnLmNzckNvbmZpZy4KKwkJCQkJY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPQorCQkJCQllQ1NSX0lOSV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlk7CisJCQkJZWxzZQorCQkJCQlzbWVDb25maWcuY3NyQ29uZmlnLgorCQkJCQljaGFubmVsQm9uZGluZ01vZGU1R0h6ID0KKwkJCQkJZUNTUl9JTklfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOworCQkJCXNhcF9jb25maWctPnNlY19jaCA9IHNhcF9jb25maWctPmNoYW5uZWwgLSA0OworCQkJCWJyZWFrOworCQkJY2FzZSBOTDgwMjExX0NIQU5fSFQ0MFBMVVM6CisJCQkJaWYgKGNoYW5uZWwgPD0gMTQpCisJCQkJCXNtZUNvbmZpZy5jc3JDb25maWcuCisJCQkJCWNoYW5uZWxCb25kaW5nTW9kZTI0R0h6ID0KKwkJCQkJZUNTUl9JTklfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlk7CisJCQkJZWxzZQorCQkJCQlzbWVDb25maWcuY3NyQ29uZmlnLgorCQkJCQljaGFubmVsQm9uZGluZ01vZGU1R0h6ID0KKwkJCQkJZUNTUl9JTklfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlk7CisJCQkJc2FwX2NvbmZpZy0+c2VjX2NoID0gc2FwX2NvbmZpZy0+Y2hhbm5lbCArIDQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgiRXJyb3IhISEgSW52YWxpZCBIVDIwLzQwIG1vZGUgISIpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXNtZUNvbmZpZy5jc3JDb25maWcub2Jzc0VuYWJsZWQgPSB3bGFuX2hkZF9nZXRfc2FwX29ic3MoCisJCQkJCQkJCXBBZGFwdGVyKTsKKwkJCXNtZV91cGRhdGVfY29uZmlnKHBIZGRDdHgtPmhIYWwsICZzbWVDb25maWcpOworCQl9CisJfSBlbHNlIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgiSW52YWxpZCBkZXZpY2UgbW9kZSBmYWlsZWQgdG8gc2V0IHZhbGlkIGNoYW5uZWwiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlFWElUKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jaGVja18xMWdtb2RlKCkgLSBjaGVjayBmb3IgMTFnIG1vZGUKKyAqIEBwSWU6IFBvaW50ZXIgdG8gSUUKKyAqIEByZXF1aXJlX2h0OiBQb2ludGVyIHRvIHJlcXVpcmUgaHQKKyAqIEByZXF1aXJlX3ZodDogUG9pbnRlciB0byByZXF1aXJlIHZodAorICogQHBDaGVja1JhdGVzZm9yMTFnOiBQb2ludGVyIHRvIGNoZWNrIHJhdGVzIGZvciAxMWcgbW9kZQorICogQHBTYXBId19tb2RlOiBTQVAgSFcgbW9kZQorICoKKyAqIENoZWNrIGZvciAxMWcgcmF0ZSBhbmQgc2V0IHByb3BlciAxMWcgb25seSBtb2RlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5faGRkX2NoZWNrXzExZ21vZGUodTggKnBJZSwgdTggKnJlcXVpcmVfaHQsIHU4ICpyZXF1aXJlX3ZodCwKKwkJCQkgICB1OCAqcENoZWNrUmF0ZXNmb3IxMWcsCisJCQkJICAgZUNzclBoeU1vZGUgKnBTYXBId19tb2RlKQoreworCXU4IGksIG51bV9yYXRlcyA9IHBJZVswXTsKKworCXBJZSArPSAxOworCWZvciAoaSA9IDA7IGkgPCBudW1fcmF0ZXM7IGkrKykgeworCQlpZiAoKnBDaGVja1JhdGVzZm9yMTFnCisJCSAgICAmJiAodHJ1ZSA9PSB3bGFuX2hkZF9yYXRlX2lzXzExZyhwSWVbaV0gJiBSQVRFX01BU0spKSkgeworCQkJLyogSWYgcmF0ZSBzZXQgaGF2ZSAxMWcgcmF0ZSB0aGFuIGNoYW5nZSB0aGUgbW9kZQorCQkJICogdG8gMTFHCisJCQkgKi8KKwkJCSpwU2FwSHdfbW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWc7CisJCQlpZiAocEllW2ldICYgQkFTSUNfUkFURV9NQVNLKSB7CisJCQkJLyogSWYgd2UgaGF2ZSAxMWcgcmF0ZSBhcyAgYmFzaWMgcmF0ZSwgaXQKKwkJCQkgKiBtZWFucyBtb2RlIGlzIDExZyBvbmx5IG1vZGUuCisJCQkJICovCisJCQkJKnBTYXBId19tb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZOworCQkJCSpwQ2hlY2tSYXRlc2ZvcjExZyA9IGZhbHNlOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChCQVNJQ19SQVRFX01BU0sgfAorCQkJCVdMQU5fQlNTX01FTUJFUlNISVBfU0VMRUNUT1JfSFRfUEhZKSA9PSBwSWVbaV0pCisJCQkJKnJlcXVpcmVfaHQgPSB0cnVlOworCQkJZWxzZSBpZiAoKEJBU0lDX1JBVEVfTUFTSyB8CisJCQkJV0xBTl9CU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9WSFRfUEhZKSA9PSBwSWVbaV0pCisJCQkJKnJlcXVpcmVfdmh0ID0gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfYWRkX2llKCkgLSBhZGQgaWUKKyAqIEBwSG9zdGFwZEFkYXB0ZXI6IFBvaW50ZXIgdG8gaG9zdGFwZCBhZGFwdGVyCisgKiBAZ2VuaWU6IFBvaW50ZXIgdG8gaWUgdG8gYmUgYWRkZWQKKyAqIEB0b3RhbF9pZWxlbjogUG9pbnRlciB0byBzdG9yZSB0b3RhbCBpZSBsZW5ndGgKKyAqIEBvdWk6IFBvaW50ZXIgdG8gb3VpCisgKiBAb3VpX3NpemU6IFNpemUgb2Ygb3VpCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfYWRkX2llKGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciwgdWludDhfdCAqZ2VuaWUsCisJCQkgICB1aW50OF90ICp0b3RhbF9pZWxlbiwgdWludDhfdCAqb3VpLAorCQkJICAgdWludDhfdCBvdWlfc2l6ZSkKK3sKKwl1aW50MTZfdCBpZWxlbiA9IDA7CisJdWludDhfdCAqcEllID0gTlVMTDsKKwliZWFjb25fZGF0YV90ICpwQmVhY29uID0gcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbjsKKworCXBJZSA9IHdsYW5faGRkX2dldF92ZW5kb3Jfb3VpX2llX3B0cihvdWksIG91aV9zaXplLAorCQkJCQkgICAgIHBCZWFjb24tPnRhaWwsIHBCZWFjb24tPnRhaWxfbGVuKTsKKworCWlmIChwSWUpIHsKKwkJaWVsZW4gPSBwSWVbMV0gKyAyOworCQlpZiAoKCp0b3RhbF9pZWxlbiArIGllbGVuKSA8PSBNQVhfR0VOSUVfTEVOKSB7CisJCQljZGZfbWVtX2NvcHkoJmdlbmllWyp0b3RhbF9pZWxlbl0sIHBJZSwgaWVsZW4pOworCQl9IGVsc2UgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIioqSWUgTGVuZ3RoIGlzIHRvbyBiaWcqKioiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCSp0b3RhbF9pZWxlbiArPSBpZWxlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfYWRkX2hvc3RhcGRfY29uZl92c2llKCkgLSBjb25maWd1cmUgdnNpZSBpbiBzYXAgbW9kZQorICogQHBIb3N0YXBkQWRhcHRlcjogUG9pbnRlciB0byBob3N0YXBkIGFkYXB0ZXIKKyAqIEBnZW5pZTogUG9pbnRlciB0byB2c2llCisgKiBAdG90YWxfaWVsZW46IFBvaW50ZXIgdG8gc3RvcmUgdG90YWwgaWUgbGVuZ3RoCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5faGRkX2FkZF9ob3N0YXBkX2NvbmZfdnNpZShoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIsCisJCQkJCSAgIHVpbnQ4X3QgKmdlbmllLAorCQkJCQkgICB1aW50OF90ICp0b3RhbF9pZWxlbikKK3sKKwliZWFjb25fZGF0YV90ICpwQmVhY29uID0gcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbjsKKwlpbnQgbGVmdCA9IHBCZWFjb24tPnRhaWxfbGVuOworCXVpbnQ4X3QgKnB0ciA9IHBCZWFjb24tPnRhaWw7CisJdWludDhfdCBlbGVtX2lkLCBlbGVtX2xlbjsKKwl1aW50MTZfdCBpZWxlbiA9IDA7CisKKwlpZiAoTlVMTCA9PSBwdHIgfHwgMCA9PSBsZWZ0KQorCQlyZXR1cm47CisKKwl3aGlsZSAobGVmdCA+PSAyKSB7CisJCWVsZW1faWQgPSBwdHJbMF07CisJCWVsZW1fbGVuID0gcHRyWzFdOworCQlsZWZ0IC09IDI7CisJCWlmIChlbGVtX2xlbiA+IGxlZnQpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCIqKioqSW52YWxpZCBJRXMgZWlkID0gJWQgZWxlbV9sZW49JWQgbGVmdD0lZCoqKioqIiksCisJCQkJZWxlbV9pZCwgZWxlbV9sZW4sIGxlZnQpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChJRV9FSURfVkVORE9SID09IGVsZW1faWQpIHsKKwkJCS8qIHNraXBwaW5nIHRoZSBWU0lFJ3Mgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIG9yCisJCQkgKiBpdCB3aWxsIGJlIGluY2x1ZGVkIGJ5IGV4aXN0aW5nIGNvZGUKKwkJCSAqLworCQkJaWYgKChtZW1jbXAoJnB0clsyXSwgV1BTX09VSV9UWVBFLCBXUFNfT1VJX1RZUEVfU0laRSkgIT0KKwkJCSAgICAgMCkgJiYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfV0ZECisJCQkgICAgKG1lbWNtcCgmcHRyWzJdLCBXRkRfT1VJX1RZUEUsIFdGRF9PVUlfVFlQRV9TSVpFKSAhPQorCQkJICAgICAwKSAmJgorI2VuZGlmCisJCQkgICAgKG1lbWNtcAorCQkJCSAgICAgKCZwdHJbMl0sIFdISVRFTElTVF9PVUlfVFlQRSwKKwkJCQkgICAgIFdQQV9PVUlfVFlQRV9TSVpFKSAhPSAwKQorCQkJICAgICYmCisJCQkgICAgKG1lbWNtcAorCQkJCSAgICAgKCZwdHJbMl0sIEJMQUNLTElTVF9PVUlfVFlQRSwKKwkJCQkgICAgIFdQQV9PVUlfVFlQRV9TSVpFKSAhPSAwKQorCQkJICAgICYmCisJCQkgICAgKG1lbWNtcAorCQkJCSAgICAgKCZwdHJbMl0sICJceDAwXHg1MFx4ZjJceDAyIiwKKwkJCQkgICAgIFdQQV9PVUlfVFlQRV9TSVpFKSAhPSAwKQorCQkJICAgICYmIChtZW1jbXAoJnB0clsyXSwgV1BBX09VSV9UWVBFLCBXUEFfT1VJX1RZUEVfU0laRSkKKwkJCQkhPSAwKQorCQkJICAgICYmIChtZW1jbXAoJnB0clsyXSwgUDJQX09VSV9UWVBFLCBQMlBfT1VJX1RZUEVfU0laRSkKKwkJCQkhPSAwKSkgeworCQkJCWllbGVuID0gcHRyWzFdICsgMjsKKwkJCQlpZiAoKCp0b3RhbF9pZWxlbiArIGllbGVuKSA8PSBNQVhfR0VOSUVfTEVOKSB7CisJCQkJCWNkZl9tZW1fY29weSgmZ2VuaWVbKnRvdGFsX2llbGVuXSwgcHRyLAorCQkJCQkJICAgICBpZWxlbik7CisJCQkJCSp0b3RhbF9pZWxlbiArPSBpZWxlbjsKKwkJCQl9IGVsc2UgeworCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJICAgICAgIEZMKCJJRSBMZW5ndGggaXMgdG9vIGJpZyBJRXMgZWlkPSVkIGVsZW1fbGVuPSVkIHRvdGFsX2llX2xlbnQ9JWQiKSwKKwkJCQkJICAgICAgIGVsZW1faWQsIGVsZW1fbGVuLCAqdG90YWxfaWVsZW4pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWxlZnQgLT0gZWxlbV9sZW47CisJCXB0ciArPSAoZWxlbV9sZW4gKyAyKTsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIHdsYW5faGRkX2FkZF9leHRyYV9pZSgpIC0gYWRkIGV4dHJhIGllcyBpbiBiZWFjb24KKyAqIEBwSG9zdGFwZEFkYXB0ZXI6IFBvaW50ZXIgdG8gaG9zdGFwZCBhZGFwdGVyCisgKiBAZ2VuaWU6IFBvaW50ZXIgdG8gZXh0cmEgaWUKKyAqIEB0b3RhbF9pZWxlbjogUG9pbnRlciB0byBzdG9yZSB0b3RhbCBpZSBsZW5ndGgKKyAqIEB0ZW1wX2llX2lkOiBJRCBvZiBleHRyYSBpZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bGFuX2hkZF9hZGRfZXh0cmFfaWUoaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyLAorCQkJCSAgdWludDhfdCAqZ2VuaWUsIHVpbnQ4X3QgKnRvdGFsX2llbGVuLAorCQkJCSAgdWludDhfdCB0ZW1wX2llX2lkKQoreworCWJlYWNvbl9kYXRhX3QgKnBCZWFjb24gPSBwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uOworCWludCBsZWZ0ID0gcEJlYWNvbi0+dGFpbF9sZW47CisJdWludDhfdCAqcHRyID0gcEJlYWNvbi0+dGFpbDsKKwl1aW50OF90IGVsZW1faWQsIGVsZW1fbGVuOworCXVpbnQxNl90IGllbGVuID0gMDsKKworCWlmIChOVUxMID09IHB0ciB8fCAwID09IGxlZnQpCisJCXJldHVybjsKKworCXdoaWxlIChsZWZ0ID49IDIpIHsKKwkJZWxlbV9pZCA9IHB0clswXTsKKwkJZWxlbV9sZW4gPSBwdHJbMV07CisJCWxlZnQgLT0gMjsKKwkJaWYgKGVsZW1fbGVuID4gbGVmdCkgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoIioqKipJbnZhbGlkIElFcyBlaWQgPSAlZCBlbGVtX2xlbj0lZCBsZWZ0PSVkKioqKioiKSwKKwkJCSAgICAgICBlbGVtX2lkLCBlbGVtX2xlbiwgbGVmdCk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAodGVtcF9pZV9pZCA9PSBlbGVtX2lkKSB7CisJCQlpZWxlbiA9IHB0clsxXSArIDI7CisJCQlpZiAoKCp0b3RhbF9pZWxlbiArIGllbGVuKSA8PSBNQVhfR0VOSUVfTEVOKSB7CisJCQkJY2RmX21lbV9jb3B5KCZnZW5pZVsqdG90YWxfaWVsZW5dLCBwdHIsIGllbGVuKTsKKwkJCQkqdG90YWxfaWVsZW4gKz0gaWVsZW47CisJCQl9IGVsc2UgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgiSUUgTGVuZ3RoIGlzIHRvbyBiaWcgSUVzIGVpZD0lZCBlbGVtX2xlbj0lZCB0b3RhbF9pZV9sZW50PSVkIiksCisJCQkJICAgICAgIGVsZW1faWQsIGVsZW1fbGVuLCAqdG90YWxfaWVsZW4pOworCQkJfQorCQl9CisKKwkJbGVmdCAtPSBlbGVtX2xlbjsKKwkJcHRyICs9IChlbGVtX2xlbiArIDIpOworCX0KKwlyZXR1cm47Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgNCwgMCkpCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2FsbG9jX25ld19iZWFjb24oKSAtIGFsbG9jIGJlYWNvbiBpbiBhcCBtb2RlCisgKiBAcEFkYXB0ZXI6IFBvaW50ZXIgdG8gaG9zdGFwZCBhZGFwdGVyCisgKiBAcHBCZWFjb246IFBvaW50ZXIgdG8gcG9pbnRlciB0byBiZWFjb24gZGF0YQorICogQHBhcmFtczogUG9pbnRlciB0byBiZWFjb24gcGFyYW1ldGVycworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfYWxsb2NfbmV3X2JlYWNvbihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICAgYmVhY29uX2RhdGFfdCAqKnBwQmVhY29uLAorCQkJCSAgICAgICBzdHJ1Y3QgYmVhY29uX3BhcmFtZXRlcnMgKnBhcmFtcykKKyNlbHNlCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2FsbG9jX25ld19iZWFjb24oKSAtIGFsbG9jIGJlYWNvbiBpbiBhcCBtb2RlCisgKiBAcEFkYXB0ZXI6IFBvaW50ZXIgdG8gaG9zdGFwZCBhZGFwdGVyCisgKiBAcHBCZWFjb246IFBvaW50ZXIgdG8gcG9pbnRlciB0byBiZWFjb24gZGF0YQorICogQHBhcmFtczogUG9pbnRlciB0byBiZWFjb24gcGFyYW1ldGVycworICogQGR0aW1fcGVyaW9kOiBEVElNIHBlcmlvZAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfYWxsb2NfbmV3X2JlYWNvbihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICAgYmVhY29uX2RhdGFfdCAqKnBwQmVhY29uLAorCQkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfYmVhY29uX2RhdGEgKnBhcmFtcywKKwkJCQkgICAgICAgaW50IGR0aW1fcGVyaW9kKQorI2VuZGlmCit7CisJaW50IHNpemU7CisJYmVhY29uX2RhdGFfdCAqYmVhY29uID0gTlVMTDsKKwliZWFjb25fZGF0YV90ICpvbGQgPSBOVUxMOworCWludCBoZWFkX2xlbiwgdGFpbF9sZW4sIHByb2JlcmVzcF9pZXNfbGVuLCBhc3NvY3Jlc3BfaWVzX2xlbjsKKwljb25zdCB1OCAqaGVhZCwgKnRhaWwsICpwcm9iZXJlc3BfaWVzLCAqYXNzb2NyZXNwX2llczsKKworCUVOVEVSKCk7CisJaWYgKHBhcmFtcy0+aGVhZCAmJiAhcGFyYW1zLT5oZWFkX2xlbikgeworCQloZGRMb2coTE9HRSwgRkwoImhlYWRfbGVuIGlzIE5VTEwiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9sZCA9IHBBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbjsKKworCWlmICghcGFyYW1zLT5oZWFkICYmICFvbGQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJzZXNzaW9uKCVkKSBvbGQgYW5kIG5ldyBoZWFkcyBwb2ludHMgdG8gTlVMTCIpLAorCQkgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwYXJhbXMtPmhlYWQpIHsKKwkJaGVhZF9sZW4gPSBwYXJhbXMtPmhlYWRfbGVuOworCQloZWFkID0gcGFyYW1zLT5oZWFkOworCX0gZWxzZSB7CisJCWhlYWRfbGVuID0gb2xkLT5oZWFkX2xlbjsKKwkJaGVhZCA9IG9sZC0+aGVhZDsKKwl9CisKKwlpZiAocGFyYW1zLT50YWlsIHx8ICFvbGQpIHsKKwkJdGFpbF9sZW4gPSBwYXJhbXMtPnRhaWxfbGVuOworCQl0YWlsID0gcGFyYW1zLT50YWlsOworCX0gZWxzZSB7CisJCXRhaWxfbGVuID0gb2xkLT50YWlsX2xlbjsKKwkJdGFpbCA9IG9sZC0+dGFpbDsKKwl9CisKKwlpZiAocGFyYW1zLT5wcm9iZXJlc3BfaWVzIHx8ICFvbGQpIHsKKwkJcHJvYmVyZXNwX2llc19sZW4gPSBwYXJhbXMtPnByb2JlcmVzcF9pZXNfbGVuOworCQlwcm9iZXJlc3BfaWVzID0gcGFyYW1zLT5wcm9iZXJlc3BfaWVzOworCX0gZWxzZSB7CisJCXByb2JlcmVzcF9pZXNfbGVuID0gb2xkLT5wcm9iZXJlc3BfaWVzX2xlbjsKKwkJcHJvYmVyZXNwX2llcyA9IG9sZC0+cHJvYmVyZXNwX2llczsKKwl9CisKKwlpZiAocGFyYW1zLT5hc3NvY3Jlc3BfaWVzIHx8ICFvbGQpIHsKKwkJYXNzb2NyZXNwX2llc19sZW4gPSBwYXJhbXMtPmFzc29jcmVzcF9pZXNfbGVuOworCQlhc3NvY3Jlc3BfaWVzID0gcGFyYW1zLT5hc3NvY3Jlc3BfaWVzOworCX0gZWxzZSB7CisJCWFzc29jcmVzcF9pZXNfbGVuID0gb2xkLT5hc3NvY3Jlc3BfaWVzX2xlbjsKKwkJYXNzb2NyZXNwX2llcyA9IG9sZC0+YXNzb2NyZXNwX2llczsKKwl9CisKKwlzaXplID0gc2l6ZW9mKGJlYWNvbl9kYXRhX3QpICsgaGVhZF9sZW4gKyB0YWlsX2xlbiArCisJCXByb2JlcmVzcF9pZXNfbGVuICsgYXNzb2NyZXNwX2llc19sZW47CisKKwliZWFjb24gPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCisJaWYgKGJlYWNvbiA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIk1lbSBhbGxvY2F0aW9uIGZvciBiZWFjb24gZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQorCWlmIChwYXJhbXMtPmR0aW1fcGVyaW9kKQorCQliZWFjb24tPmR0aW1fcGVyaW9kID0gcGFyYW1zLT5kdGltX3BlcmlvZDsKKwllbHNlIGlmIChvbGQpCisJCWJlYWNvbi0+ZHRpbV9wZXJpb2QgPSBvbGQtPmR0aW1fcGVyaW9kOworI2Vsc2UKKwlpZiAoZHRpbV9wZXJpb2QpCisJCWJlYWNvbi0+ZHRpbV9wZXJpb2QgPSBkdGltX3BlcmlvZDsKKwllbHNlIGlmIChvbGQpCisJCWJlYWNvbi0+ZHRpbV9wZXJpb2QgPSBvbGQtPmR0aW1fcGVyaW9kOworI2VuZGlmCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiB8IGhlYWQgfCB0YWlsIHwgcHJvYmVyZXNwX2llcyB8IGFzc29jcmVzcF9pZXMgfAorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICovCisJYmVhY29uLT5oZWFkID0gKCh1OCAqKSBiZWFjb24pICsgc2l6ZW9mKGJlYWNvbl9kYXRhX3QpOworCWJlYWNvbi0+dGFpbCA9IGJlYWNvbi0+aGVhZCArIGhlYWRfbGVuOworCWJlYWNvbi0+cHJvYmVyZXNwX2llcyA9IGJlYWNvbi0+dGFpbCArIHRhaWxfbGVuOworCWJlYWNvbi0+YXNzb2NyZXNwX2llcyA9IGJlYWNvbi0+cHJvYmVyZXNwX2llcyArIHByb2JlcmVzcF9pZXNfbGVuOworCisJYmVhY29uLT5oZWFkX2xlbiA9IGhlYWRfbGVuOworCWJlYWNvbi0+dGFpbF9sZW4gPSB0YWlsX2xlbjsKKwliZWFjb24tPnByb2JlcmVzcF9pZXNfbGVuID0gcHJvYmVyZXNwX2llc19sZW47CisJYmVhY29uLT5hc3NvY3Jlc3BfaWVzX2xlbiA9IGFzc29jcmVzcF9pZXNfbGVuOworCisJaWYgKGhlYWQgJiYgaGVhZF9sZW4pCisJCW1lbWNweShiZWFjb24tPmhlYWQsIGhlYWQsIGhlYWRfbGVuKTsKKwlpZiAodGFpbCAmJiB0YWlsX2xlbikKKwkJbWVtY3B5KGJlYWNvbi0+dGFpbCwgdGFpbCwgdGFpbF9sZW4pOworCWlmIChwcm9iZXJlc3BfaWVzICYmIHByb2JlcmVzcF9pZXNfbGVuKQorCQltZW1jcHkoYmVhY29uLT5wcm9iZXJlc3BfaWVzLCBwcm9iZXJlc3BfaWVzLCBwcm9iZXJlc3BfaWVzX2xlbik7CisJaWYgKGFzc29jcmVzcF9pZXMgJiYgYXNzb2NyZXNwX2llc19sZW4pCisJCW1lbWNweShiZWFjb24tPmFzc29jcmVzcF9pZXMsIGFzc29jcmVzcF9pZXMsIGFzc29jcmVzcF9pZXNfbGVuKTsKKworCSpwcEJlYWNvbiA9IGJlYWNvbjsKKworCWtmcmVlKG9sZCk7CisKKwlyZXR1cm4gMDsKKworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9hcGllcygpIC0gdXBkYXRlIGFwIG1vZGUgaWVzCisgKiBAYWRhcHRlcjogUG9pbnRlciB0byBob3N0YXBkIGFkYXB0ZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9hcGllcyhoZGRfYWRhcHRlcl90ICphZGFwdGVyKQoreworCXVpbnQ4X3QgKmdlbmllOworCXVpbnQ4X3QgdG90YWxfaWVsZW4gPSAwOworCWludCByZXQgPSAwOworCXRzYXBfQ29uZmlnX3QgKnBDb25maWc7CisJdFNpclVwZGF0ZUlFIHVwZGF0ZUlFOworCWJlYWNvbl9kYXRhX3QgKmJlYWNvbiA9IE5VTEw7CisKKwlwQ29uZmlnID0gJmFkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnOworCWJlYWNvbiA9IGFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uOworCisJZ2VuaWUgPSBjZGZfbWVtX21hbGxvYyhNQVhfR0VOSUVfTEVOKTsKKworCWlmIChnZW5pZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgwICE9IHdsYW5faGRkX2FkZF9pZShhZGFwdGVyLCBnZW5pZSwKKwkJJnRvdGFsX2llbGVuLCBXUFNfT1VJX1RZUEUsIFdQU19PVUlfVFlQRV9TSVpFKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkFkZGluZyBXUFMgSUUgZmFpbGVkIikpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9XRkQKKwlpZiAoMCAhPSB3bGFuX2hkZF9hZGRfaWUoYWRhcHRlciwgZ2VuaWUsCisJCSZ0b3RhbF9pZWxlbiwgV0ZEX09VSV9UWVBFLCBXRkRfT1VJX1RZUEVfU0laRSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJBZGRpbmcgV0ZEIElFIGZhaWxlZCIpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwlpZiAoV0xBTl9IRERfU09GVEFQID09IGFkYXB0ZXItPmRldmljZV9tb2RlKSB7CisJCXdsYW5faGRkX2FkZF9leHRyYV9pZShhZGFwdGVyLCBnZW5pZSwgJnRvdGFsX2llbGVuLAorCQkJCSAgICAgIFdMQU5fRUlEX1dBUEkpOworCX0KKyNlbmRpZgorCisJaWYgKGFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCB8fAorCQlhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pCisJCXdsYW5faGRkX2FkZF9ob3N0YXBkX2NvbmZfdnNpZShhZGFwdGVyLCBnZW5pZSwKKwkJCQkJICAgICAgICZ0b3RhbF9pZWxlbik7CisKKwlpZiAod2xhbl9oZGRfYWRkX2llKGFkYXB0ZXIsIGdlbmllLAorCQkmdG90YWxfaWVsZW4sIFAyUF9PVUlfVFlQRSwgUDJQX09VSV9UWVBFX1NJWkUpICE9IDApIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJBZGRpbmcgUDJQIElFIGZhaWxlZCIpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworI2lmZGVmIFFDQV9IVF8yMDQwX0NPRVgKKwlpZiAoV0xBTl9IRERfU09GVEFQID09IGFkYXB0ZXItPmRldmljZV9tb2RlKSB7CisJCXRTbWVDb25maWdQYXJhbXMgc21lQ29uZmlnOworCQljZGZfbWVtX3plcm8oJnNtZUNvbmZpZywgc2l6ZW9mKHNtZUNvbmZpZykpOworCQlzbWVfZ2V0X2NvbmZpZ19wYXJhbShXTEFOX0hERF9HRVRfSEFMX0NUWChhZGFwdGVyKSwKKwkJCQkgICAgICZzbWVDb25maWcpOworCQlpZiAoc21lQ29uZmlnLmNzckNvbmZpZy5vYnNzRW5hYmxlZCkKKwkJCXdsYW5faGRkX2FkZF9leHRyYV9pZShhZGFwdGVyLCBnZW5pZSwKKwkJCQkJICAgICAgJnRvdGFsX2llbGVuLAorCQkJCQkgICAgICBXTEFOX0VJRF9PVkVSTEFQX0JTU19TQ0FOX1BBUkFNKTsKKwl9CisjZW5kaWYKKwljZGZfbWVtX2NvcHkodXBkYXRlSUUuYnNzaWQsIGFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCXVwZGF0ZUlFLnNtZVNlc3Npb25JZCA9IGFkYXB0ZXItPnNlc3Npb25JZDsKKworCWlmICh0ZXN0X2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZhZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKwkJdXBkYXRlSUUuaWVCdWZmZXJsZW5ndGggPSB0b3RhbF9pZWxlbjsKKwkJdXBkYXRlSUUucEFkZGl0aW9uSUVCdWZmZXIgPSBnZW5pZTsKKwkJdXBkYXRlSUUuYXBwZW5kID0gZmFsc2U7CisJCXVwZGF0ZUlFLm5vdGlmeSA9IHRydWU7CisJCWlmIChzbWVfdXBkYXRlX2FkZF9pZShXTEFOX0hERF9HRVRfSEFMX0NUWChhZGFwdGVyKSwKKwkJCQkgICAgICAmdXBkYXRlSUUsCisJCQkJICAgICAgZVVQREFURV9JRV9QUk9CRV9CQ04pID09CisJCSAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoIkNvdWxkIG5vdCBwYXNzIG9uIEFkZCBJZSBwcm9iZSBiZWFjb24gZGF0YSIpKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJd2xhbnNhcF9yZXNldF9zYXBfY29uZmlnX2FkZF9pZShwQ29uZmlnLCBlVVBEQVRFX0lFX1BST0JFX0JDTik7CisJfSBlbHNlIHsKKwkJd2xhbnNhcF91cGRhdGVfc2FwX2NvbmZpZ19hZGRfaWUocENvbmZpZywKKwkJCQkJCSBnZW5pZSwKKwkJCQkJCSB0b3RhbF9pZWxlbiwKKwkJCQkJCSBlVVBEQVRFX0lFX1BST0JFX0JDTik7CisJfQorCisJLyogQWRkZWQgZm9yIFByb2JlIFJlc3BvbnNlIElFICovCisJaWYgKHRlc3RfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkgeworCQl1cGRhdGVJRS5pZUJ1ZmZlcmxlbmd0aCA9IGJlYWNvbi0+cHJvYmVyZXNwX2llc19sZW47CisJCXVwZGF0ZUlFLnBBZGRpdGlvbklFQnVmZmVyID0gKHVpbnQ4X3QgKikgYmVhY29uLT5wcm9iZXJlc3BfaWVzOworCQl1cGRhdGVJRS5hcHBlbmQgPSBmYWxzZTsKKwkJdXBkYXRlSUUubm90aWZ5ID0gZmFsc2U7CisJCWlmIChzbWVfdXBkYXRlX2FkZF9pZShXTEFOX0hERF9HRVRfSEFMX0NUWChhZGFwdGVyKSwKKwkJCQkgICAgICAmdXBkYXRlSUUsCisJCQkJICAgICAgZVVQREFURV9JRV9QUk9CRV9SRVNQKSA9PQorCQkgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgIEZMKCJDb3VsZCBub3QgcGFzcyBvbiBQUk9CRV9SRVNQIGFkZCBJZSBkYXRhIikpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQl3bGFuc2FwX3Jlc2V0X3NhcF9jb25maWdfYWRkX2llKHBDb25maWcsIGVVUERBVEVfSUVfUFJPQkVfUkVTUCk7CisJfSBlbHNlIHsKKwkJd2xhbnNhcF91cGRhdGVfc2FwX2NvbmZpZ19hZGRfaWUocENvbmZpZywKKwkJCQkJCSBiZWFjb24tPnByb2JlcmVzcF9pZXMsCisJCQkJCQkgYmVhY29uLT5wcm9iZXJlc3BfaWVzX2xlbiwKKwkJCQkJCSBlVVBEQVRFX0lFX1BST0JFX1JFU1ApOworCX0KKworCS8qIEFzc29jIHJlc3AgQWRkIGllIERhdGEgKi8KKwlpZiAodGVzdF9iaXQoU09GVEFQX0JTU19TVEFSVEVELCAmYWRhcHRlci0+ZXZlbnRfZmxhZ3MpKSB7CisJCXVwZGF0ZUlFLmllQnVmZmVybGVuZ3RoID0gYmVhY29uLT5hc3NvY3Jlc3BfaWVzX2xlbjsKKwkJdXBkYXRlSUUucEFkZGl0aW9uSUVCdWZmZXIgPSAodWludDhfdCAqKSBiZWFjb24tPmFzc29jcmVzcF9pZXM7CisJCXVwZGF0ZUlFLmFwcGVuZCA9IGZhbHNlOworCQl1cGRhdGVJRS5ub3RpZnkgPSBmYWxzZTsKKwkJaWYgKHNtZV91cGRhdGVfYWRkX2llKFdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpLAorCQkJCSAgICAgICZ1cGRhdGVJRSwKKwkJCQkgICAgICBlVVBEQVRFX0lFX0FTU09DX1JFU1ApID09CisJCSAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoIkNvdWxkIG5vdCBwYXNzIG9uIEFkZCBJZSBBc3NvYyBSZXNwb25zZSBkYXRhIikpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQl3bGFuc2FwX3Jlc2V0X3NhcF9jb25maWdfYWRkX2llKHBDb25maWcsIGVVUERBVEVfSUVfQVNTT0NfUkVTUCk7CisJfSBlbHNlIHsKKwkJd2xhbnNhcF91cGRhdGVfc2FwX2NvbmZpZ19hZGRfaWUocENvbmZpZywKKwkJCQkJCSBiZWFjb24tPmFzc29jcmVzcF9pZXMsCisJCQkJCQkgYmVhY29uLT5hc3NvY3Jlc3BfaWVzX2xlbiwKKwkJCQkJCSBlVVBEQVRFX0lFX0FTU09DX1JFU1ApOworCX0KKworZG9uZToKKwljZGZfbWVtX2ZyZWUoZ2VuaWUpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfc2V0X3NhcF9od21vZGUoKSAtIHNldCBzYXAgaHcgbW9kZQorICogQHBIb3N0YXBkQWRhcHRlcjogUG9pbnRlciB0byBob3N0YXBkIGFkYXB0ZXIKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfc2V0X3NhcF9od21vZGUoaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyKQoreworCXRzYXBfQ29uZmlnX3QgKnBDb25maWcgPSAmcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnNhcENvbmZpZzsKKwliZWFjb25fZGF0YV90ICpwQmVhY29uID0gcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKnBNZ210X2ZyYW1lID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXBCZWFjb24tPmhlYWQ7CisJdTggY2hlY2tSYXRlc2ZvcjExZyA9IHRydWU7CisJdTggcmVxdWlyZV9odCA9IGZhbHNlLCByZXF1aXJlX3ZodCA9IGZhbHNlOworCXU4ICpwSWUgPSBOVUxMOworCisJcENvbmZpZy0+U2FwSHdfbW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWI7CisKKwlwSWUgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWVfcHRyKCZwTWdtdF9mcmFtZS0+dS5iZWFjb24udmFyaWFibGVbMF0sCisJCQkJCSAgIHBCZWFjb24tPmhlYWRfbGVuLAorCQkJCQkgICBXTEFOX0VJRF9TVVBQX1JBVEVTKTsKKwlpZiAocEllICE9IE5VTEwpIHsKKwkJcEllICs9IDE7CisJCXdsYW5faGRkX2NoZWNrXzExZ21vZGUocEllLCAmcmVxdWlyZV9odCwgJnJlcXVpcmVfdmh0LAorCQkJJmNoZWNrUmF0ZXNmb3IxMWcsICZwQ29uZmlnLT5TYXBId19tb2RlKTsKKwl9CisKKwlwSWUgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWVfcHRyKHBCZWFjb24tPnRhaWwsIHBCZWFjb24tPnRhaWxfbGVuLAorCQkJCQkgICBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUyk7CisJaWYgKHBJZSAhPSBOVUxMKSB7CisJCXBJZSArPSAxOworCQl3bGFuX2hkZF9jaGVja18xMWdtb2RlKHBJZSwgJnJlcXVpcmVfaHQsICZyZXF1aXJlX3ZodCwKKwkJCSZjaGVja1JhdGVzZm9yMTFnLCAmcENvbmZpZy0+U2FwSHdfbW9kZSk7CisJfQorCisJaWYgKHBDb25maWctPmNoYW5uZWwgPiAxNCkKKwkJcENvbmZpZy0+U2FwSHdfbW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWE7CisKKwlwSWUgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWVfcHRyKHBCZWFjb24tPnRhaWwsIHBCZWFjb24tPnRhaWxfbGVuLAorCQkJCQkgICBXTEFOX0VJRF9IVF9DQVBBQklMSVRZKTsKKworCWlmIChwSWUpIHsKKwkJcENvbmZpZy0+U2FwSHdfbW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMW47CisJCWlmIChyZXF1aXJlX2h0KQorCQkJcENvbmZpZy0+U2FwSHdfbW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMW5fT05MWTsKKwl9CisKKwlwSWUgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWVfcHRyKHBCZWFjb24tPnRhaWwsIHBCZWFjb24tPnRhaWxfbGVuLAorCQkJCQkgICBXTEFOX0VJRF9WSFRfQ0FQQUJJTElUWSk7CisKKwlpZiAocEllKSB7CisJCXBDb25maWctPlNhcEh3X21vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFhYzsKKwkJaWYgKHJlcXVpcmVfdmh0KQorCQkJcENvbmZpZy0+U2FwSHdfbW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWFjX09OTFk7CisJfQorfQorCisvKioKKyAqIHdsYW5faGRkX2NvbmZpZ19hY3MoKSAtIGNvbmZpZyBBQ1MgbmVlZGVkIHBhcmFtZXRlcnMKKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQGFkYXB0ZXI6IEFkYXB0ZXIgcG9pbnRlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0IEFDUyByZWxhdGVkIElOSSBwYXJhbXRlcnMgYW5kIHBvcHVsYXRlZAorICogc2FwIGNvbmZpZyBhbmQgc21lQ29uZmlnIGZvciBBQ1MgbmVlZGVkIGNvbmZpZ3VyYXRpb25zLgorICoKKyAqIFJldHVybjogVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgorICovCitDREZfU1RBVFVTIHdsYW5faGRkX2NvbmZpZ19hY3MoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl0c2FwX0NvbmZpZ190ICpzYXBfY29uZmlnOworCXN0cnVjdCBoZGRfY29uZmlnICppbmlfY29uZmlnOworCXRIYWxIYW5kbGUgaGFsOworCisJaGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgoYWRhcHRlcik7CisJc2FwX2NvbmZpZyA9ICZhZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnNhcENvbmZpZzsKKwlpbmlfY29uZmlnID0gaGRkX2N0eC0+Y29uZmlnOworCisJc2FwX2NvbmZpZy0+ZW5PdmVyTGFwQ2ggPSAhIWhkZF9jdHgtPmNvbmZpZy0+Z0VuYWJsZU92ZXJMYXBDaDsKKworI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX01CU1NJRCkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fQVBfQVBfQUNTX09QVElNSVpFKQorCWhkZExvZyhMT0cxLCBGTCgiSEREX0FDU19TS0lQX1NUQVRVUyA9ICVkIiksCisJCQkJCQloZGRfY3R4LT5za2lwX2Fjc19zY2FuX3N0YXR1cyk7CisJaWYgKGhkZF9jdHgtPnNraXBfYWNzX3NjYW5fc3RhdHVzID09IGVTQVBfU0tJUF9BQ1NfU0NBTikgeworCQloZGRfYWRhcHRlcl90ICpjb25fc2FwX2FkYXB0ZXI7CisJCXRzYXBfQ29uZmlnX3QgKmNvbl9zYXBfY29uZmlnID0gTlVMTDsKKworCQljb25fc2FwX2FkYXB0ZXIgPSBoZGRfZ2V0X2Nvbl9zYXBfYWRhcHRlcihhZGFwdGVyLCBmYWxzZSk7CisKKwkJaWYgKGNvbl9zYXBfYWRhcHRlcikKKwkJCWNvbl9zYXBfY29uZmlnID0KKwkJCQkmY29uX3NhcF9hZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnNhcENvbmZpZzsKKworCQlzYXBfY29uZmlnLT5hY3NfY2ZnLnNraXBfc2Nhbl9zdGF0dXMgPSBlU0FQX0RPX05FV19BQ1NfU0NBTjsKKworCQlpZiAoY29uX3NhcF9jb25maWcgJiYKKwkJCWNvbl9zYXBfY29uZmlnLT5hY3NfY2ZnLmFjc19tb2RlID09IHRydWUgJiYKKwkJCWhkZF9jdHgtPnNraXBfYWNzX3NjYW5fc3RhdHVzID09IGVTQVBfU0tJUF9BQ1NfU0NBTiAmJgorCQkJY29uX3NhcF9jb25maWctPmFjc19jZmcuaHdfbW9kZSA9PQorCQkJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5od19tb2RlKSB7CisJCQl1aW50OF90IGNvbl9zYXBfc3RfY2gsIGNvbl9zYXBfZW5kX2NoOworCQkJdWludDhfdCBjdXJfc2FwX3N0X2NoLCBjdXJfc2FwX2VuZF9jaDsKKwkJCXVpbnQ4X3QgYmFuZFN0YXJ0Q2hhbm5lbCwgYmFuZEVuZENoYW5uZWw7CisKKwkJCWNvbl9zYXBfc3RfY2ggPQorCQkJCQljb25fc2FwX2NvbmZpZy0+YWNzX2NmZy5zdGFydF9jaDsKKwkJCWNvbl9zYXBfZW5kX2NoID0KKwkJCQkJY29uX3NhcF9jb25maWctPmFjc19jZmcuZW5kX2NoOworCQkJY3VyX3NhcF9zdF9jaCA9IHNhcF9jb25maWctPmFjc19jZmcuc3RhcnRfY2g7CisJCQljdXJfc2FwX2VuZF9jaCA9IHNhcF9jb25maWctPmFjc19jZmcuZW5kX2NoOworCisJCQl3bGFuc2FwX2V4dGVuZF90b19hY3NfcmFuZ2UoCisJCQkJCSZjdXJfc2FwX3N0X2NoLCAmY3VyX3NhcF9lbmRfY2gsCisJCQkJCSZiYW5kU3RhcnRDaGFubmVsLCAmYmFuZEVuZENoYW5uZWwpOworCisJCQl3bGFuc2FwX2V4dGVuZF90b19hY3NfcmFuZ2UoCisJCQkJCSZjb25fc2FwX3N0X2NoLCAmY29uX3NhcF9lbmRfY2gsCisJCQkJCSZiYW5kU3RhcnRDaGFubmVsLCAmYmFuZEVuZENoYW5uZWwpOworCisJCQlpZiAoY29uX3NhcF9zdF9jaCA8PSBjdXJfc2FwX3N0X2NoICYmCisJCQkJCWNvbl9zYXBfZW5kX2NoID49IGN1cl9zYXBfZW5kX2NoKSB7CisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fc3RhdHVzID0KKwkJCQkJCQllU0FQX1NLSVBfQUNTX1NDQU47CisKKwkJCX0gZWxzZSBpZiAoY29uX3NhcF9zdF9jaCA+PSBjdXJfc2FwX3N0X2NoICYmCisJCQkJCWNvbl9zYXBfZW5kX2NoID49IGN1cl9zYXBfZW5kX2NoKSB7CisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fc3RhdHVzID0KKwkJCQkJCQllU0FQX0RPX1BBUl9BQ1NfU0NBTjsKKworCQkJCXNhcF9jb25maWctPmFjc19jZmcuc2tpcF9zY2FuX3JhbmdlMV9zdGNoID0KKwkJCQkJCQljdXJfc2FwX3N0X2NoOworCQkJCXNhcF9jb25maWctPmFjc19jZmcuc2tpcF9zY2FuX3JhbmdlMV9lbmRjaCA9CisJCQkJCQkJY29uX3NhcF9zdF9jaCAtIDE7CisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fcmFuZ2UyX3N0Y2ggPQorCQkJCQkJCTA7CisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fcmFuZ2UyX2VuZGNoID0KKwkJCQkJCQkwOworCisJCQl9IGVsc2UgaWYgKGNvbl9zYXBfc3RfY2ggPD0gY3VyX3NhcF9zdF9jaCAmJgorCQkJCWNvbl9zYXBfZW5kX2NoIDw9IGN1cl9zYXBfZW5kX2NoKSB7CisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fc3RhdHVzID0KKwkJCQkJCQllU0FQX0RPX1BBUl9BQ1NfU0NBTjsKKworCQkJCXNhcF9jb25maWctPmFjc19jZmcuc2tpcF9zY2FuX3JhbmdlMV9zdGNoID0KKwkJCQkJCQljb25fc2FwX2VuZF9jaCArIDE7CisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fcmFuZ2UxX2VuZGNoID0KKwkJCQkJCQljdXJfc2FwX2VuZF9jaDsKKwkJCQlzYXBfY29uZmlnLT5hY3NfY2ZnLnNraXBfc2Nhbl9yYW5nZTJfc3RjaCA9CisJCQkJCQkJMDsKKwkJCQlzYXBfY29uZmlnLT5hY3NfY2ZnLnNraXBfc2Nhbl9yYW5nZTJfZW5kY2ggPQorCQkJCQkJCTA7CisKKwkJCX0gZWxzZSBpZiAoY29uX3NhcF9zdF9jaCA+PSBjdXJfc2FwX3N0X2NoICYmCisJCQkJY29uX3NhcF9lbmRfY2ggPD0gY3VyX3NhcF9lbmRfY2gpIHsKKwkJCQlzYXBfY29uZmlnLT5hY3NfY2ZnLnNraXBfc2Nhbl9zdGF0dXMgPQorCQkJCQkJCWVTQVBfRE9fUEFSX0FDU19TQ0FOOworCisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fcmFuZ2UxX3N0Y2ggPQorCQkJCQkJCWN1cl9zYXBfc3RfY2g7CisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fcmFuZ2UxX2VuZGNoID0KKwkJCQkJCQljb25fc2FwX3N0X2NoIC0gMTsKKwkJCQlzYXBfY29uZmlnLT5hY3NfY2ZnLnNraXBfc2Nhbl9yYW5nZTJfc3RjaCA9CisJCQkJCQkJY29uX3NhcF9lbmRfY2g7CisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fcmFuZ2UyX2VuZGNoID0KKwkJCQkJCQljdXJfc2FwX2VuZF9jaCArIDE7CisKKwkJCX0gZWxzZQorCQkJCXNhcF9jb25maWctPmFjc19jZmcuc2tpcF9zY2FuX3N0YXR1cyA9CisJCQkJCQkJZVNBUF9ET19ORVdfQUNTX1NDQU47CisKKworCQkJaGRkTG9nKExPRzEsIEZMKAorCQkJCSJTZWNBUCBBQ1MgU2tpcD0lZCwgQUNTIENIIFJBTkdFPSVkLSVkLCAlZC0lZCIpLAorCQkJCXNhcF9jb25maWctPmFjc19jZmcuc2tpcF9zY2FuX3N0YXR1cywKKwkJCQlzYXBfY29uZmlnLT5hY3NfY2ZnLnNraXBfc2Nhbl9yYW5nZTFfc3RjaCwKKwkJCQlzYXBfY29uZmlnLT5hY3NfY2ZnLnNraXBfc2Nhbl9yYW5nZTFfZW5kY2gsCisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fcmFuZ2UyX3N0Y2gsCisJCQkJc2FwX2NvbmZpZy0+YWNzX2NmZy5za2lwX3NjYW5fcmFuZ2UyX2VuZGNoKTsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bGFuX2hkZF9zZXR1cF9kcml2ZXJfb3ZlcnJpZGVzIDogT3ZlcnJpZGVzIFNBUCAvIFAyUCBHTyBQYXJhbXMKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgU0FQIC8gUDJQIEdvIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gZHJpdmVyIElOSQorICogcGFyYW1ldGVycyBmb3IgMTFBQyBvdmVycmlkZSBhbmQgQUNTLiBUaGlzIG92ZXJyaWRlcyBhcmUgZG9uZSB0byBzdXBwb3J0CisgKiBhbmRyb2lkIGxlZ2FjeSBjb25maWd1cmF0aW9uIG1ldGhvZC4KKyAqCisgKiBOT1RFOiBOb24gYW5kcm9pZCBwbGF0Zm9ybSBzdXBwb3J0cyBjb25jdXJyZW5jeSBhbmQgdGhlc2Ugb3ZlcnJpZGVzIHNoYWxsCisgKiBub3QgYmUgdXNlZC4gQWxzbyBmdXR1cmUgZHJpdmVyIGJhc2VkIG92ZXJyaWRlcyBzaGFsbCBiZSBjb25zb2xpZGF0ZWQgaW4gdGhpcworICogZnVuY3Rpb24gb25seS4gQXZvaWQgcmFuZG9tIG92ZXJyaWRlcyBpbiBvdGhlciBsb2NhdGlvbiBiYXNlZCBvbiBpbmkuCisgKgorICogUmV0dXJuOiAwIGZvciBTdWNjZXNzIG9yIE5lZ2F0aXZlIGVycm9yIGNvZGVzLgorICovCitpbnQgd2xhbl9oZGRfc2V0dXBfZHJpdmVyX292ZXJyaWRlcyhoZGRfYWRhcHRlcl90ICphcF9hZGFwdGVyKQoreworCXRzYXBfQ29uZmlnX3QgKnNhcF9jZmcgPSAmYXBfYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWc7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYXBfYWRhcHRlcik7CisJdEhhbEhhbmRsZSBoX2hhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKGFwX2FkYXB0ZXIpOworCisJaWYgKGFwX2FkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCAmJgorCQkJCWhkZF9jdHgtPmNvbmZpZy0+Zm9yY2Vfc2FwX2FjcykKKwkJZ290byBzZXR1cF9hY3Nfb3ZlcnJpZGVzOworCisJLyogRml4ZWQgY2hhbm5lbCAxMUFDIG92ZXJyaWRlOgorCSAqIDExQUMgb3ZlcnJpZGUgaW4gcWNhY2xkIGlzIGludHJvZHVjZWQgZm9yIGZvbGxvd2luZyByZWFzb25zOgorCSAqIDEuIFAyUCBHTyBhbHNvIGZvbGxvd3Mgc3RhcnRfYnNzIGFuZCBzaW5jZSBwMnAgR08gY291bGQgbm90IGJlCisJICogICAgY29uZmlndXJlZCB0byBzZXR1cCBWSFQgY2hhbm5lbCB3aWR0aCBpbiB3cGFfc3VwcGxpY2FudAorCSAqIDIuIEFuZHJvaWQgVUkgZG9lcyBub3QgcHJvdmlkZSBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIFNBUAorCSAqCisJICogRGVmYXVsdCBvdmVycmlkZSBlbmFibGVkIChmb3IgYW5kcm9pZCkuIE1ETSBzaGFsbCBkaXNhYmxlIHRoaXMgaW4gaW5pCisJICovCisJaWYgKGhkZF9jdHgtPmNvbmZpZy0+c2FwX3AycF8xMWFjX292ZXJyaWRlICYmCisJCQkoc2FwX2NmZy0+U2FwSHdfbW9kZSA9PSBlQ1NSX0RPVDExX01PREVfMTFuIHx8CisJCQlzYXBfY2ZnLT5TYXBId19tb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMWFjIHx8CisJCQlzYXBfY2ZnLT5TYXBId19tb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMWFjX09OTFkpKSB7CisJCWhkZExvZyhMT0cxLCBGTCgiKiogRHJpdmVyIGZvcmNlIDExQUMgb3ZlcnJpZGUgZm9yIFNBUC9HbyAqKiIpKTsKKworCQkvKiAxMW4gb25seSBzaGFsbCBub3QgYmUgb3ZlcnJpZGRlbiBzaW5jZSBpdCBtYXkgYmUgb24gcHVycG9zZSovCisJCWlmIChzYXBfY2ZnLT5TYXBId19tb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMW4pCisJCQlzYXBfY2ZnLT5TYXBId19tb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYWM7CisKKwkJaWYgKHNhcF9jZmctPmNoYW5uZWwgPj0gMzYpCisJCQlzYXBfY2ZnLT5jaF93aWR0aF9vcmlnID0KKwkJCQkJaGRkX2N0eC0+Y29uZmlnLT52aHRDaGFubmVsV2lkdGg7CisJCWVsc2UKKwkJCXNhcF9jZmctPmNoX3dpZHRoX29yaWcgPQorCQkJCWhkZF9jdHgtPmNvbmZpZy0+bkNoYW5uZWxCb25kaW5nTW9kZTI0R0h6ID8KKwkJCQllSFRfQ0hBTk5FTF9XSURUSF80ME1IWiA6CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFo7CisJfQorCXNhcF9jZmctPmNoX3BhcmFtcy5jaF93aWR0aCA9IHNhcF9jZmctPmNoX3dpZHRoX29yaWc7CisJc21lX3NldF9jaF9wYXJhbXMoaF9oYWwsIHNhcF9jZmctPlNhcEh3X21vZGUsIHNhcF9jZmctPmNoYW5uZWwsCisJCQkJc2FwX2NmZy0+c2VjX2NoLCAmc2FwX2NmZy0+Y2hfcGFyYW1zKTsKKworCXJldHVybiAwOworCitzZXR1cF9hY3Nfb3ZlcnJpZGVzOgorCWhkZExvZyhMT0dFLCBGTCgiKiogRHJpdmVyIGZvcmNlIEFDUyBvdmVycmlkZSAqKiIpKTsKKworCXNhcF9jZmctPmNoYW5uZWwgPSBBVVRPX0NIQU5ORUxfU0VMRUNUOworCXNhcF9jZmctPmFjc19jZmcuYWNzX21vZGUgPSB0cnVlOworCXNhcF9jZmctPmFjc19jZmcuc3RhcnRfY2ggPSBoZGRfY3R4LT5jb25maWctPmZvcmNlX3NhcF9hY3Nfc3RfY2g7CisJc2FwX2NmZy0+YWNzX2NmZy5lbmRfY2ggPSBoZGRfY3R4LT5jb25maWctPmZvcmNlX3NhcF9hY3NfZW5kX2NoOworCisJaWYgKHNhcF9jZmctPmFjc19jZmcuc3RhcnRfY2ggPiBzYXBfY2ZnLT5hY3NfY2ZnLmVuZF9jaCkgeworCQloZGRMb2coTE9HRSwgRkwoIkRyaXZlciBmb3JjZSBBQ1Mgc3RhcnQgY2ggKCVkKSA+IGVuZCBjaCAoJWQpIiksCisJCQlzYXBfY2ZnLT5hY3NfY2ZnLnN0YXJ0X2NoLCAgc2FwX2NmZy0+YWNzX2NmZy5lbmRfY2gpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBEZXJpdmUgQUNTIEhXIG1vZGUgKi8KKwlzYXBfY2ZnLT5TYXBId19tb2RlID0gaGRkX2NmZ194bGF0ZV90b19jc3JfcGh5X21vZGUoCisJCQkJCQloZGRfY3R4LT5jb25maWctPmRvdDExTW9kZSk7CisJaWYgKHNhcF9jZmctPlNhcEh3X21vZGUgPT0gZUNTUl9ET1QxMV9NT0RFX0FVVE8pCisJCXNhcF9jZmctPlNhcEh3X21vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFhYzsKKworCWlmICgoc2FwX2NmZy0+U2FwSHdfbW9kZSA9PSBlQ1NSX0RPVDExX01PREVfMTFiIHx8CisJCQlzYXBfY2ZnLT5TYXBId19tb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMWcgfHwKKwkJCXNhcF9jZmctPlNhcEh3X21vZGUgPT0gZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZKSAmJgorCQkJc2FwX2NmZy0+YWNzX2NmZy5zdGFydF9jaCA+IDE0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBBQ1MgSFcgTW9kZSAlZCArIENIIHJhbmdlIDwlZCAtICVkPiIpLAorCQkJc2FwX2NmZy0+U2FwSHdfbW9kZSwgc2FwX2NmZy0+YWNzX2NmZy5zdGFydF9jaCwKKwkJCXNhcF9jZmctPmFjc19jZmcuZW5kX2NoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNhcF9jZmctPmFjc19jZmcuaHdfbW9kZSA9IHNhcF9jZmctPlNhcEh3X21vZGU7CisKKwkvKiBEZXJpdmUgQUNTIEJXICovCisJc2FwX2NmZy0+Y2hfd2lkdGhfb3JpZyA9IGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaOworCWlmIChzYXBfY2ZnLT5TYXBId19tb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMWFjIHx8CisJCQlzYXBfY2ZnLT5TYXBId19tb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMWFjX09OTFkpIHsKKworCQlzYXBfY2ZnLT5jaF93aWR0aF9vcmlnID0gaGRkX2N0eC0+Y29uZmlnLT52aHRDaGFubmVsV2lkdGg7CisJCS8qIFZIVCBpbiAyLjRHIGRlcGVuZHMgb24gZ0NoYW5uZWxCb25kaW5nTW9kZTI0R0h6IElOSSBwYXJhbSAqLworCQlpZiAoc2FwX2NmZy0+YWNzX2NmZy5lbmRfY2ggPD0gMTQpCisJCQlzYXBfY2ZnLT5jaF93aWR0aF9vcmlnID0KKwkJCQloZGRfY3R4LT5jb25maWctPm5DaGFubmVsQm9uZGluZ01vZGUyNEdIeiA/CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFogOgorCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaOworCX0KKworCWlmIChzYXBfY2ZnLT5TYXBId19tb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMW4gfHwKKwkJCXNhcF9jZmctPlNhcEh3X21vZGUgPT0gZUNTUl9ET1QxMV9NT0RFXzExbl9PTkxZKSB7CisJCWlmIChzYXBfY2ZnLT5hY3NfY2ZnLmVuZF9jaCA8PSAxNCkKKwkJCXNhcF9jZmctPmNoX3dpZHRoX29yaWcgPQorCQkJCWhkZF9jdHgtPmNvbmZpZy0+bkNoYW5uZWxCb25kaW5nTW9kZTI0R0h6ID8KKwkJCQllSFRfQ0hBTk5FTF9XSURUSF80ME1IWiA6CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFo7CisJCWVsc2UKKwkJCXNhcF9jZmctPmNoX3dpZHRoX29yaWcgPQorCQkJCWhkZF9jdHgtPmNvbmZpZy0+bkNoYW5uZWxCb25kaW5nTW9kZTVHSHogPworCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaIDoKKwkJCQllSFRfQ0hBTk5FTF9XSURUSF8yME1IWjsKKwl9CisJc2FwX2NmZy0+YWNzX2NmZy5jaF93aWR0aCA9IHNhcF9jZmctPmNoX3dpZHRoX29yaWc7CisKKwloZGRMb2coTE9HMSwgRkwoIkZvcmNlIEFDUyBDb25maWc6IEhXX01PREU6ICVkIEFDU19CVzogJWQiKSwKKwkJc2FwX2NmZy0+YWNzX2NmZy5od19tb2RlLCBzYXBfY2ZnLT5hY3NfY2ZnLmNoX3dpZHRoKTsKKwloZGRMb2coTE9HMSwgRkwoIkZvcmNlIEFDUyBDb25maWc6IFNUX0NIOiAlZCBFTkRfQ0g6ICVkIiksCisJCXNhcF9jZmctPmFjc19jZmcuc3RhcnRfY2gsIHNhcF9jZmctPmFjc19jZmcuZW5kX2NoKTsKKworCXJldHVybiAwOworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQorLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9ic3MoKSAtIHN0YXJ0IGJzcworICogQHBIb3N0YXBkQWRhcHRlcjogUG9pbnRlciB0byBob3N0YXBkIGFkYXB0ZXIKKyAqIEBwYXJhbXM6IFBvaW50ZXIgdG8gc3RhcnQgYnNzIGJlYWNvbiBwYXJhbWV0ZXJzCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc3RhcnRfYnNzKGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciwKKwkJCQkgICAgICAgc3RydWN0IGJlYWNvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCisjZWxzZQorLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9ic3MoKSAtIHN0YXJ0IGJzcworICogQHBIb3N0YXBkQWRhcHRlcjogUG9pbnRlciB0byBob3N0YXBkIGFkYXB0ZXIKKyAqIEBwYXJhbXM6IFBvaW50ZXIgdG8gc3RhcnQgYnNzIGJlYWNvbiBwYXJhbWV0ZXJzCisgKiBAc3NpZDogUG9pbnRlciBzc2lkCisgKiBAc3NpZF9sZW46IExlbmd0aCBvZiBzc2lkCisgKiBAaGlkZGVuX3NzaWQ6IEhpZGRlbiBTU0lEIHBhcmFtZXRlcgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX3N0YXJ0X2JzcyhoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIsCisJCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9iZWFjb25fZGF0YSAqcGFyYW1zLAorCQkJCSAgICAgICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAorCQkJCSAgICAgICBlbnVtIG5sODAyMTFfaGlkZGVuX3NzaWQgaGlkZGVuX3NzaWQpCisjZW5kaWYKK3sKKwl0c2FwX0NvbmZpZ190ICpwQ29uZmlnOworCWJlYWNvbl9kYXRhX3QgKnBCZWFjb24gPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqcE1nbXRfZnJhbWU7CisJdWludDhfdCAqcEllID0gTlVMTDsKKwl1aW50MTZfdCBjYXBhYl9pbmZvOworCWVDc3JBdXRoVHlwZSBSU05BdXRoVHlwZTsKKwllQ3NyRW5jcnlwdGlvblR5cGUgUlNORW5jcnlwdFR5cGU7CisJZUNzckVuY3J5cHRpb25UeXBlIG1jUlNORW5jcnlwdFR5cGU7CisJaW50IHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUywgcmV0OworCXRwV0xBTl9TQVBFdmVudENCIHBTYXBFdmVudENhbGxiYWNrOworCWhkZF9ob3N0YXBkX3N0YXRlX3QgKnBIb3N0YXBkU3RhdGU7CisjaWZuZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwl2X0NPTlRFWFRfdCBwX2Nkc19jb250ZXh0ID0KKwkJKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPnBjZHNfY29udGV4dDsKKyNlbmRpZgorCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisJc3RydWN0IHFjX21hY19hY2xfZW50cnkgKmFjbF9lbnRyeSA9IE5VTEw7CisJaW50MzJfdCBpOworCXN0cnVjdCBoZGRfY29uZmlnICppbmlDb25maWc7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKwl0U21lQ29uZmlnUGFyYW1zIHNtZV9jb25maWc7CisJYm9vbCBNRlBDYXBhYmxlID0gZmFsc2U7CisJYm9vbCBNRlBSZXF1aXJlZCA9IGZhbHNlOworCXVpbnQxNl90IHByZXZfcnNuX2xlbmd0aCA9IDA7CisJRU5URVIoKTsKKworCWlmIChjZHNfaXNfY29ubmVjdGlvbl9pbl9wcm9ncmVzcyhwSGRkQ3R4KSkgeworCQloZGRfZXJyKCJDYW4ndCBzdGFydCBCU1M6IGNvbm5lY3Rpb24gaXMgaW4gcHJvZ3Jlc3MiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5pQ29uZmlnID0gcEhkZEN0eC0+Y29uZmlnOworCXBIb3N0YXBkU3RhdGUgPSBXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihwSG9zdGFwZEFkYXB0ZXIpOworCisJY2xlYXJfYml0KEFDU19QRU5ESU5HLCAmcEhvc3RhcGRBZGFwdGVyLT5ldmVudF9mbGFncyk7CisJY2xlYXJfYml0KEFDU19JTl9QUk9HUkVTUywgJnBIZGRDdHgtPmdfZXZlbnRfZmxhZ3MpOworCisJcENvbmZpZyA9ICZwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnOworCisJcEJlYWNvbiA9IHBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5iZWFjb247CisKKwlwTWdtdF9mcmFtZSA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwQmVhY29uLT5oZWFkOworCisJcENvbmZpZy0+YmVhY29uX2ludCA9IHBNZ210X2ZyYW1lLT51LmJlYWNvbi5iZWFjb25faW50OworCisJcENvbmZpZy0+ZGlzYWJsZURGU0NoU3dpdGNoID0gaW5pQ29uZmlnLT5kaXNhYmxlREZTQ2hTd2l0Y2g7CisKKwkvKiBjaGFubmVsIGlzIGFscmVhZHkgc2V0IGluIHRoZSBzZXRfY2hhbm5lbCBDYWxsIGJhY2sgKi8KKwkvKiBwQ29uZmlnLT5jaGFubmVsID0gcENvbW1pdENvbmZpZy0+Y2hhbm5lbDsgKi8KKworCS8qIFByb3RlY3Rpb24gcGFyYW1ldGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlICovCisJcENvbmZpZy0+cHJvdEVuYWJsZWQgPSBpbmlDb25maWctPmFwUHJvdEVuYWJsZWQ7CisKKwlwQ29uZmlnLT5kdGltX3BlcmlvZCA9IHBCZWFjb24tPmR0aW1fcGVyaW9kOworCisJaGRkTG9nKExPRzIsIEZMKCIqKioqcENvbmZpZy0+ZHRpbV9wZXJpb2Q9JWQqKioiKSwKKwkJcENvbmZpZy0+ZHRpbV9wZXJpb2QpOworCisJaWYgKHBIb3N0YXBkQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQKSB7CisJCXBJZSA9CisJCQl3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWVfcHRyKHBCZWFjb24tPnRhaWwsCisJCQkJCQkgICAgIHBCZWFjb24tPnRhaWxfbGVuLAorCQkJCQkJICAgICBXTEFOX0VJRF9DT1VOVFJZKTsKKwkJaWYgKHBJZSkgeworCQkJcENvbmZpZy0+aWVlZTgwMjExZCA9IDE7CisJCQljZGZfbWVtX2NvcHkocENvbmZpZy0+Y291bnRyeUNvZGUsICZwSWVbMl0sIDMpOworCQkJc21lX3NldF9yZWdfaW5mbyhoSGFsLCBwQ29uZmlnLT5jb3VudHJ5Q29kZSk7CisJCQlzbWVfYXBwbHlfY2hhbm5lbF9wb3dlcl9pbmZvX3RvX2Z3KGhIYWwpOworCQl9IGVsc2UgeworCQkJcENvbmZpZy0+Y291bnRyeUNvZGVbMF0gPSBwSGRkQ3R4LT5yZWcuYWxwaGEyWzBdOworCQkJcENvbmZpZy0+Y291bnRyeUNvZGVbMV0gPSBwSGRkQ3R4LT5yZWcuYWxwaGEyWzFdOworCQkJcENvbmZpZy0+aWVlZTgwMjExZCA9IDA7CisJCX0KKworCQlyZXQgPSB3bGFuX2hkZF9zYXBfY2ZnX2Rmc19vdmVycmlkZShwSG9zdGFwZEFkYXB0ZXIpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChDRFNfSVNfREZTX0NIKHBDb25maWctPmNoYW5uZWwpKQorCQkJCQlwSGRkQ3R4LT5kZXZfZGZzX2NhY19zdGF0dXMgPQorCQkJCQkJCURGU19DQUNfTkVWRVJfRE9ORTsKKwkJCX0KKwkJfQorCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJCSAgICB3bGFuX2hkZF92YWxpZGF0ZV9vcGVyYXRpb25fY2hhbm5lbChwSG9zdGFwZEFkYXB0ZXIsCisJCQkJCQkJcENvbmZpZy0+Y2hhbm5lbCkpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBDaGFubmVsIFslZF0iKSwKKwkJCQkJCQlwQ29uZmlnLT5jaGFubmVsKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIHJlamVjdCBTQVAgaWYgREZTIGNoYW5uZWwgc2NhbiBpcyBub3QgYWxsb3dlZCAqLworCQlpZiAoIShwSGRkQ3R4LT5jb25maWctPmVuYWJsZURGU0NobmxTY2FuKSAmJgorCQkgICAgKENIQU5ORUxfU1RBVEVfREZTID09IGNkc19nZXRfY2hhbm5lbF9zdGF0ZSgKKwkJCQkJICAgICBwQ29uZmlnLT5jaGFubmVsKSkpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJub3QgYWxsb3dlZCB0byBzdGFydCBTQVAgb24gREZTIGNoYW5uZWwiKSk7CisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJCXdsYW5zYXBfc2V0X2Rmc19pZ25vcmVfY2FjKGhIYWwsIGluaUNvbmZpZy0+aWdub3JlQ0FDKTsKKwkJd2xhbnNhcF9zZXRfZGZzX3Jlc3RyaWN0X2phcGFuX3c1MyhoSGFsLAorCQkJaW5pQ29uZmlnLT5nRGlzYWJsZURmc0phcGFuVzUzKTsKKwkJd2xhbnNhcF9zZXRfZGZzX3ByZWZlcnJlZF9jaGFubmVsX2xvY2F0aW9uKGhIYWwsCisJCQlpbmlDb25maWctPmdTYXBQcmVmZXJyZWRDaGFuTG9jYXRpb24pOworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCQl3bGFuX3NhcF9zZXRfY2hhbm5lbF9hdm9pZGFuY2UoaEhhbCwKKwkJCQkJaW5pQ29uZmlnLT5zYXBfY2hhbm5lbF9hdm9pZGFuY2UpOworI2VuZGlmCisJfSBlbHNlIGlmIChwSG9zdGFwZEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9HTykgeworCQlwQ29uZmlnLT5jb3VudHJ5Q29kZVswXSA9IHBIZGRDdHgtPnJlZy5hbHBoYTJbMF07CisJCXBDb25maWctPmNvdW50cnlDb2RlWzFdID0gcEhkZEN0eC0+cmVnLmFscGhhMlsxXTsKKwkJcENvbmZpZy0+aWVlZTgwMjExZCA9IDA7CisJfSBlbHNlIHsKKwkJcENvbmZpZy0+aWVlZTgwMjExZCA9IDA7CisJfQorCisJY2FwYWJfaW5mbyA9IHBNZ210X2ZyYW1lLT51LmJlYWNvbi5jYXBhYl9pbmZvOworCisJcENvbmZpZy0+cHJpdmFjeSA9IChwTWdtdF9mcmFtZS0+dS5iZWFjb24uY2FwYWJfaW5mbyAmCisJCQkgICAgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpID8gdHJ1ZSA6IGZhbHNlOworCisJKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcikpLT51UHJpdmFjeSA9IHBDb25maWctPnByaXZhY3k7CisKKwkvKlNldCB3cHMgc3RhdGlvbiB0byBjb25maWd1cmVkICovCisJcEllID0gd2xhbl9oZGRfZ2V0X3dwc19pZV9wdHIocEJlYWNvbi0+dGFpbCwgcEJlYWNvbi0+dGFpbF9sZW4pOworCisJaWYgKHBJZSkgeworCQlpZiAocEllWzFdIDwgKDIgKyBXUFNfT1VJX1RZUEVfU0laRSkpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgIEZMKCIqKldwcyBJZSBMZW5ndGggaXMgdG9vIHNtYWxsKioqIikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAobWVtY21wKCZwSWVbMl0sIFdQU19PVUlfVFlQRSwgV1BTX09VSV9UWVBFX1NJWkUpID09CisJCQkgICAwKSB7CisJCQloZGRMb2coTE9HMSwgRkwoIioqIFdQUyBJRShsZW4gJWQpICoqKiIpLCAocEllWzFdICsgMikpOworCQkJLyogQ2hlY2sgMTUgYml0IG9mIFdQUyBJRSBhcyBpdCBjb250YWluIGluZm9ybWF0aW9uIGZvcgorCQkJICogd3BzIHN0YXRlCisJCQkgKi8KKwkJCWlmIChTQVBfV1BTX0VOQUJMRURfVU5DT05GSUdVUkVEID09IHBJZVsxNV0pIHsKKwkJCQlwQ29uZmlnLT53cHNfc3RhdGUgPQorCQkJCQlTQVBfV1BTX0VOQUJMRURfVU5DT05GSUdVUkVEOworCQkJfSBlbHNlIGlmIChTQVBfV1BTX0VOQUJMRURfQ09ORklHVVJFRCA9PSBwSWVbMTVdKSB7CisJCQkJcENvbmZpZy0+d3BzX3N0YXRlID0gU0FQX1dQU19FTkFCTEVEX0NPTkZJR1VSRUQ7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQloZGRfaW5mbygiV1BTIGRpc2FibGVkIik7CisJCXBDb25maWctPndwc19zdGF0ZSA9IFNBUF9XUFNfRElTQUJMRUQ7CisJfQorCS8qIEZvcndhcmQgV1BTIFBCQyBwcm9iZSByZXF1ZXN0IGZyYW1lIHVwICovCisJcENvbmZpZy0+ZndkV1BTUEJDUHJvYmVSZXEgPSAxOworCisJcENvbmZpZy0+UlNORW5jcnlwdFR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworCXBDb25maWctPm1jUlNORW5jcnlwdFR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworCShXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpKS0+dWNFbmNyeXB0VHlwZSA9CisJCWVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisKKwlwQ29uZmlnLT5SU05XUEFSZXFJRUxlbmd0aCA9IDA7CisJbWVtc2V0KCZwQ29uZmlnLT5SU05XUEFSZXFJRVswXSwgMCwgc2l6ZW9mKHBDb25maWctPlJTTldQQVJlcUlFKSk7CisJcEllID0gd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2llX3B0cihwQmVhY29uLT50YWlsLCBwQmVhY29uLT50YWlsX2xlbiwKKwkJCQkJICAgV0xBTl9FSURfUlNOKTsKKwlpZiAocEllICYmIHBJZVsxXSkgeworCQlwQ29uZmlnLT5SU05XUEFSZXFJRUxlbmd0aCA9IHBJZVsxXSArIDI7CisJCWlmIChwQ29uZmlnLT5SU05XUEFSZXFJRUxlbmd0aCA8IHNpemVvZihwQ29uZmlnLT5SU05XUEFSZXFJRSkpCisJCQltZW1jcHkoJnBDb25maWctPlJTTldQQVJlcUlFWzBdLCBwSWUsCisJCQkgICAgICAgcENvbmZpZy0+UlNOV1BBUmVxSUVMZW5ndGgpOworCQllbHNlCisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTCgiUlNOV1BBIElFIE1BWCBMZW5ndGggZXhjZWVkZWQ7IGxlbmd0aCA9JWQiKSwKKwkJCSAgICAgICBwQ29uZmlnLT5SU05XUEFSZXFJRUxlbmd0aCk7CisJCS8qIFRoZSBhY3R1YWwgcHJvY2Vzc2luZyBtYXkgZXZlbnR1YWxseSBiZSBtb3JlIGV4dGVuc2l2ZSB0aGFuCisJCSAqIHRoaXMuIFJpZ2h0IG5vdywganVzdCBjb25zdW1lIGFueSBQTUtJRHMgdGhhdCBhcmUgIHNlbnQgaW4KKwkJICogYnkgdGhlIGFwcC4KKwkJICogKi8KKwkJc3RhdHVzID0KKwkJCWhkZF9zb2Z0YXBfdW5wYWNrX2llKGNkc19nZXRfY29udGV4dAorCQkJCQkJICAgICAoQ0RGX01PRFVMRV9JRF9TTUUpLAorCQkJCQkgICAgICZSU05FbmNyeXB0VHlwZSwgJm1jUlNORW5jcnlwdFR5cGUsCisJCQkJCSAgICAgJlJTTkF1dGhUeXBlLCAmTUZQQ2FwYWJsZSwKKwkJCQkJICAgICAmTUZQUmVxdWlyZWQsCisJCQkJCSAgICAgcENvbmZpZy0+UlNOV1BBUmVxSUVbMV0gKyAyLAorCQkJCQkgICAgIHBDb25maWctPlJTTldQQVJlcUlFKTsKKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQkJLyogTm93IGNvcHkgb3ZlciBhbGwgdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgeW91IGhhdmUKKwkJCSAqIHBhcnNlZCBvdXQuIFVzZSB0aGUgY2lwaGVyIHR5cGUgaW4gdGhlIFJTTiBJRQorCQkJICovCisJCQlwQ29uZmlnLT5SU05FbmNyeXB0VHlwZSA9IFJTTkVuY3J5cHRUeXBlOworCQkJcENvbmZpZy0+bWNSU05FbmNyeXB0VHlwZSA9IG1jUlNORW5jcnlwdFR5cGU7CisJCQkoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKSktPgorCQkJdWNFbmNyeXB0VHlwZSA9IFJTTkVuY3J5cHRUeXBlOworCQkJaGRkTG9nKExPRzEsCisJCQkgICAgICAgRkwoIkNTUiBBdXRoVHlwZSA9ICVkLCBFbmNyeXB0aW9uVHlwZSA9ICVkIG1jRW5jcnlwdGlvblR5cGUgPSAlZCIpLAorCQkJICAgICAgIFJTTkF1dGhUeXBlLCBSU05FbmNyeXB0VHlwZSwgbWNSU05FbmNyeXB0VHlwZSk7CisJCX0KKwl9CisKKwlwSWUgPSB3bGFuX2hkZF9nZXRfdmVuZG9yX291aV9pZV9wdHIoV1BBX09VSV9UWVBFLCBXUEFfT1VJX1RZUEVfU0laRSwKKwkJCQkJICAgICBwQmVhY29uLT50YWlsLCBwQmVhY29uLT50YWlsX2xlbik7CisKKwlpZiAocEllICYmIHBJZVsxXSAmJiAocEllWzBdID09IERPVDExRl9FSURfV1BBKSkgeworCQlpZiAocENvbmZpZy0+UlNOV1BBUmVxSUVbMF0pIHsKKwkJCS8qTWl4ZWQgbW9kZSBXUEEvV1BBMiAqLworCQkJcHJldl9yc25fbGVuZ3RoID0gcENvbmZpZy0+UlNOV1BBUmVxSUVMZW5ndGg7CisJCQlwQ29uZmlnLT5SU05XUEFSZXFJRUxlbmd0aCArPSBwSWVbMV0gKyAyOworCQkJaWYgKHBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoIDwKKwkJCSAgICBzaXplb2YocENvbmZpZy0+UlNOV1BBUmVxSUUpKQorCQkJCW1lbWNweSgmcENvbmZpZy0+UlNOV1BBUmVxSUVbMF0gKworCQkJCSAgICAgICBwcmV2X3Jzbl9sZW5ndGgsIHBJZSwgcEllWzFdICsgMik7CisJCQllbHNlCisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgICJSU05XUEEgSUUgTUFYIExlbmd0aCBleGNlZWRlZDsgbGVuZ3RoID0lZCIsCisJCQkJICAgICAgIHBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCXBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoID0gcEllWzFdICsgMjsKKwkJCWlmIChwQ29uZmlnLT5SU05XUEFSZXFJRUxlbmd0aCA8CisJCQkgICAgc2l6ZW9mKHBDb25maWctPlJTTldQQVJlcUlFKSkKKwkJCQltZW1jcHkoJnBDb25maWctPlJTTldQQVJlcUlFWzBdLCBwSWUsCisJCQkJICAgICAgIHBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoKTsKKwkJCWVsc2UKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgIlJTTldQQSBJRSBNQVggTGVuZ3RoIGV4Y2VlZGVkOyBsZW5ndGggPSVkIiwKKwkJCQkgICAgICAgcENvbmZpZy0+UlNOV1BBUmVxSUVMZW5ndGgpOworCQkJc3RhdHVzID0gaGRkX3NvZnRhcF91bnBhY2tfaWUKKwkJCQkJKGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1NNRSksCisJCQkJCSAmUlNORW5jcnlwdFR5cGUsCisJCQkJCSAmbWNSU05FbmNyeXB0VHlwZSwgJlJTTkF1dGhUeXBlLAorCQkJCQkgJk1GUENhcGFibGUsICZNRlBSZXF1aXJlZCwKKwkJCQkJIHBDb25maWctPlJTTldQQVJlcUlFWzFdICsgMiwKKwkJCQkJIHBDb25maWctPlJTTldQQVJlcUlFKTsKKworCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJCQkvKiBOb3cgY29weSBvdmVyIGFsbCB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworCQkJCSAqIHlvdSBoYXZlIHBhcnNlZCBvdXQuIFVzZSB0aGUgY2lwaGVyIHR5cGUKKwkJCQkgKiBpbiB0aGUgUlNOIElFCisJCQkJICovCisJCQkJcENvbmZpZy0+UlNORW5jcnlwdFR5cGUgPSBSU05FbmNyeXB0VHlwZTsKKwkJCQlwQ29uZmlnLT5tY1JTTkVuY3J5cHRUeXBlID0gbWNSU05FbmNyeXB0VHlwZTsKKwkJCQkoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKSktPgorCQkJCXVjRW5jcnlwdFR5cGUgPSBSU05FbmNyeXB0VHlwZTsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgRkwoIkNTUiBBdXRoVHlwZSA9ICVkLCBFbmNyeXB0aW9uVHlwZSA9ICVkIG1jRW5jcnlwdGlvblR5cGUgPSAlZCIpLAorCQkJCSAgICAgICBSU05BdXRoVHlwZSwgUlNORW5jcnlwdFR5cGUsCisJCQkJICAgICAgIG1jUlNORW5jcnlwdFR5cGUpOworCQkJfQorCQl9CisJfQorCisJaWYgKHBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoID4gc2l6ZW9mKHBDb25maWctPlJTTldQQVJlcUlFKSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCIqKlJTTldQQVJlcUlFTGVuZ3RoIGlzIHRvbyBsYXJnZSoqKiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcENvbmZpZy0+U1NJRGluZm8uc3NpZEhpZGRlbiA9IGZhbHNlOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQorCWlmIChwYXJhbXMtPnNzaWQgIT0gTlVMTCkgeworCQljZGZfbWVtX2NvcHkocENvbmZpZy0+U1NJRGluZm8uc3NpZC5zc0lkLCBwYXJhbXMtPnNzaWQsCisJCQkgICAgIHBhcmFtcy0+c3NpZF9sZW4pOworCQlwQ29uZmlnLT5TU0lEaW5mby5zc2lkLmxlbmd0aCA9IHBhcmFtcy0+c3NpZF9sZW47CisKKwkJc3dpdGNoIChwYXJhbXMtPmhpZGRlbl9zc2lkKSB7CisJCWNhc2UgTkw4MDIxMV9ISURERU5fU1NJRF9OT1RfSU5fVVNFOgorCQkJaGRkTG9nKExPRzEsICJISURERU5fU1NJRF9OT1RfSU5fVVNFIik7CisJCQlwQ29uZmlnLT5TU0lEaW5mby5zc2lkSGlkZGVuID0gZUhJRERFTl9TU0lEX05PVF9JTl9VU0U7CisJCQlicmVhazsKKwkJY2FzZSBOTDgwMjExX0hJRERFTl9TU0lEX1pFUk9fTEVOOgorCQkJaGRkTG9nKExPRzEsICJISURERU5fU1NJRF9aRVJPX0xFTiIpOworCQkJcENvbmZpZy0+U1NJRGluZm8uc3NpZEhpZGRlbiA9IGVISURERU5fU1NJRF9aRVJPX0xFTjsKKwkJCWJyZWFrOworCQljYXNlIE5MODAyMTFfSElEREVOX1NTSURfWkVST19DT05URU5UUzoKKwkJCWhkZExvZyhMT0cxLCAiSElEREVOX1NTSURfWkVST19DT05URU5UUyIpOworCQkJcENvbmZpZy0+U1NJRGluZm8uc3NpZEhpZGRlbiA9CisJCQkJZUhJRERFTl9TU0lEX1pFUk9fQ09OVEVOVFM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhkZExvZyhMT0dFLCAiV3JvbmcgaGlkZGVuX3NzaWQgcGFyYW0gJWQiLAorCQkJICAgICAgIHBhcmFtcy0+aGlkZGVuX3NzaWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisjZWxzZQorCWlmIChzc2lkICE9IE5VTEwpIHsKKwkJY2RmX21lbV9jb3B5KHBDb25maWctPlNTSURpbmZvLnNzaWQuc3NJZCwgc3NpZCwgc3NpZF9sZW4pOworCQlwQ29uZmlnLT5TU0lEaW5mby5zc2lkLmxlbmd0aCA9IHNzaWRfbGVuOworCisJCXN3aXRjaCAoaGlkZGVuX3NzaWQpIHsKKwkJY2FzZSBOTDgwMjExX0hJRERFTl9TU0lEX05PVF9JTl9VU0U6CisJCQloZGRMb2coTE9HMSwgIkhJRERFTl9TU0lEX05PVF9JTl9VU0UiKTsKKwkJCXBDb25maWctPlNTSURpbmZvLnNzaWRIaWRkZW4gPSBlSElEREVOX1NTSURfTk9UX0lOX1VTRTsKKwkJCWJyZWFrOworCQljYXNlIE5MODAyMTFfSElEREVOX1NTSURfWkVST19MRU46CisJCQloZGRMb2coTE9HMSwgIkhJRERFTl9TU0lEX1pFUk9fTEVOIik7CisJCQlwQ29uZmlnLT5TU0lEaW5mby5zc2lkSGlkZGVuID0gZUhJRERFTl9TU0lEX1pFUk9fTEVOOworCQkJYnJlYWs7CisJCWNhc2UgTkw4MDIxMV9ISURERU5fU1NJRF9aRVJPX0NPTlRFTlRTOgorCQkJaGRkTG9nKExPRzEsICJISURERU5fU1NJRF9aRVJPX0NPTlRFTlRTIik7CisJCQlwQ29uZmlnLT5TU0lEaW5mby5zc2lkSGlkZGVuID0KKwkJCQllSElEREVOX1NTSURfWkVST19DT05URU5UUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaGRkTG9nKExPR0UsICJXcm9uZyBoaWRkZW5fc3NpZCBwYXJhbSAlZCIsIGhpZGRlbl9zc2lkKTsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisKKwljZGZfbWVtX2NvcHkocENvbmZpZy0+c2VsZl9tYWNhZGRyLmJ5dGVzLAorCQkgICAgIHBIb3N0YXBkQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsCisJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCisJLyogZGVmYXVsdCB2YWx1ZSAqLworCXBDb25maWctPlNhcE1hY2FkZHJfYWNsID0gZVNBUF9BQ0NFUFRfVU5MRVNTX0RFTklFRDsKKwlwQ29uZmlnLT5udW1fYWNjZXB0X21hYyA9IDA7CisJcENvbmZpZy0+bnVtX2RlbnlfbWFjID0gMDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgUDJQR08gdG8gZm9sbG93IFNUQSdzIGNoYW5uZWwKKwkgKiBzbyBsZXRzIGxpbWl0IHRoZSBsb2dpYyBmb3IgU0FQIG9ubHkuCisJICogTGF0ZXIgaWYgd2UgZGVjaWRlIHRvIG1ha2UgcDJwZ28gZm9sbG93IFNUQSdzCisJICogY2hhbm5lbCB0aGVuIHJlbW92ZSB0aGlzIGNoZWNrLgorCSAqLworCWlmICgoMCA9PSBwSGRkQ3R4LT5jb25maWctPmNvbmNfY3VzdG9tX3J1bGUxKSB8fAorCQkocEhkZEN0eC0+Y29uZmlnLT5jb25jX2N1c3RvbV9ydWxlMSAmJgorCQlXTEFOX0hERF9TT0ZUQVAgPT0gcEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZSkpCisJCXBDb25maWctPmNjX3N3aXRjaF9tb2RlID0gaW5pQ29uZmlnLT5XbGFuTWNjVG9TY2NTd2l0Y2hNb2RlOworI2VuZGlmCisKKwlwSWUgPQorCQl3bGFuX2hkZF9nZXRfdmVuZG9yX291aV9pZV9wdHIoQkxBQ0tMSVNUX09VSV9UWVBFLAorCQkJCQkgICAgICAgV1BBX09VSV9UWVBFX1NJWkUsIHBCZWFjb24tPnRhaWwsCisJCQkJCSAgICAgICBwQmVhY29uLT50YWlsX2xlbik7CisKKwkvKiBwSWUgZm9yIGJsYWNrIGxpc3QgaXMgZm9sbG93aW5nIGZvcm06CisJICogdHlwZSAgICA6IDEgYnl0ZQorCSAqIGxlbmd0aCAgOiAxIGJ5dGUKKwkgKiBPVUkgICAgIDogNCBieXRlcworCSAqIGFjbCB0eXBlIDogMSBieXRlCisJICogbm8gb2YgbWFjIGFkZHIgaW4gYmxhY2sgbGlzdDogMSBieXRlCisJICogbGlzdCBvZiBtYWNfYWNsX2VudHJpZXM6IHZhcmlhYmxlLCA2IGJ5dGVzIHBlciBtYWMKKwkgKiBhZGRyZXNzICsgc2l6ZW9mKGludCkgZm9yIHZsYW4gaWQKKwkgKi8KKwlpZiAoKHBJZSAhPSBOVUxMKSAmJiAocEllWzFdICE9IDApKSB7CisJCXBDb25maWctPlNhcE1hY2FkZHJfYWNsID0gcEllWzZdOworCQlwQ29uZmlnLT5udW1fZGVueV9tYWMgPSBwSWVbN107CisJCWhkZExvZyhMT0cxLAorCQkJRkwoImFjbCB0eXBlID0gJWQgbm8gZGVueSBtYWMgPSAlZCIpLCBwSWVbNl0sIHBJZVs3XSk7CisJCWlmIChwQ29uZmlnLT5udW1fZGVueV9tYWMgPiBNQVhfQUNMX01BQ19BRERSRVNTKQorCQkJcENvbmZpZy0+bnVtX2RlbnlfbWFjID0gTUFYX0FDTF9NQUNfQUREUkVTUzsKKwkJYWNsX2VudHJ5ID0gKHN0cnVjdCBxY19tYWNfYWNsX2VudHJ5ICopKHBJZSArIDgpOworCQlmb3IgKGkgPSAwOyBpIDwgcENvbmZpZy0+bnVtX2RlbnlfbWFjOyBpKyspIHsKKwkJCWNkZl9tZW1fY29weSgmcENvbmZpZy0+ZGVueV9tYWNbaV0sIGFjbF9lbnRyeS0+YWRkciwKKwkJCQkgICAgIHNpemVvZihxY21hY2FkZHIpKTsKKwkJCWFjbF9lbnRyeSsrOworCQl9CisJfQorCXBJZSA9IHdsYW5faGRkX2dldF92ZW5kb3Jfb3VpX2llX3B0cihXSElURUxJU1RfT1VJX1RZUEUsCisJCQlXUEFfT1VJX1RZUEVfU0laRSwgcEJlYWNvbi0+dGFpbCwKKwkJCXBCZWFjb24tPnRhaWxfbGVuKTsKKworCS8qIHBJZSBmb3Igd2hpdGUgbGlzdCBpcyBmb2xsb3dpbmcgZm9ybToKKwkgKiB0eXBlICAgIDogMSBieXRlCisJICogbGVuZ3RoICA6IDEgYnl0ZQorCSAqIE9VSSAgICAgOiA0IGJ5dGVzCisJICogYWNsIHR5cGUgOiAxIGJ5dGUKKwkgKiBubyBvZiBtYWMgYWRkciBpbiB3aGl0ZSBsaXN0OiAxIGJ5dGUKKwkgKiBsaXN0IG9mIG1hY19hY2xfZW50cmllczogdmFyaWFibGUsIDYgYnl0ZXMgcGVyIG1hYworCSAqIGFkZHJlc3MgKyBzaXplb2YoaW50KSBmb3IgdmxhbiBpZAorCSAqLworCWlmICgocEllICE9IE5VTEwpICYmIChwSWVbMV0gIT0gMCkpIHsKKwkJcENvbmZpZy0+U2FwTWFjYWRkcl9hY2wgPSBwSWVbNl07CisJCXBDb25maWctPm51bV9hY2NlcHRfbWFjID0gcEllWzddOworCQloZGRMb2coTE9HMSwgRkwoImFjbCB0eXBlID0gJWQgbm8gYWNjZXB0IG1hYyA9ICVkIiksCisJCSAgICAgICBwSWVbNl0sIHBJZVs3XSk7CisJCWlmIChwQ29uZmlnLT5udW1fYWNjZXB0X21hYyA+IE1BWF9BQ0xfTUFDX0FERFJFU1MpCisJCQlwQ29uZmlnLT5udW1fYWNjZXB0X21hYyA9IE1BWF9BQ0xfTUFDX0FERFJFU1M7CisJCWFjbF9lbnRyeSA9IChzdHJ1Y3QgcWNfbWFjX2FjbF9lbnRyeSAqKShwSWUgKyA4KTsKKwkJZm9yIChpID0gMDsgaSA8IHBDb25maWctPm51bV9hY2NlcHRfbWFjOyBpKyspIHsKKwkJCWNkZl9tZW1fY29weSgmcENvbmZpZy0+YWNjZXB0X21hY1tpXSwgYWNsX2VudHJ5LT5hZGRyLAorCQkJCSAgICAgc2l6ZW9mKHFjbWFjYWRkcikpOworCQkJYWNsX2VudHJ5Kys7CisJCX0KKwl9CisKKwl3bGFuX2hkZF9zZXRfc2FwX2h3bW9kZShwSG9zdGFwZEFkYXB0ZXIpOworCWNkZl9tZW1femVybygmc21lX2NvbmZpZywgc2l6ZW9mKHRTbWVDb25maWdQYXJhbXMpKTsKKwlzbWVfZ2V0X2NvbmZpZ19wYXJhbShwSGRkQ3R4LT5oSGFsLCAmc21lX2NvbmZpZyk7CisJLyogT3ZlcnJpZGUgaG9zdGFwZC5jb25mIHdtbV9lbmFibGVkIG9ubHkgZm9yIDExbiBhbmQgMTFBQyBjb25maWdzIChJT1QpCisJICogQXMgcGVyIHNwZWMgMTFOL0FDIFNUQSBhcmUgUU9TIFNUQSBhbmQgbWF5IG5vdCBjb25uZWN0IG9yIHRocm91Z2hwdXQKKwkgKiBtYXkgbm90IGJlIGdvb2Qgd2l0aCBub24gUU9TIDExTiBBUAorCSAqIERlZmF1bHQ6IGVuYWJsZSBRT1MgZm9yIFNBUCB1bmxlc3MgV01NIElFIG5vdCBwcmVzZW50IGZvciAxMWJnYQorCSAqLworCXNtZV9jb25maWcuY3NyQ29uZmlnLldNTVN1cHBvcnRNb2RlID0gZUNzclJvYW1XbW1BdXRvOworCXBJZSA9IHdsYW5faGRkX2dldF92ZW5kb3Jfb3VpX2llX3B0cihXTU1fT1VJX1RZUEUsIFdNTV9PVUlfVFlQRV9TSVpFLAorCQkJCQlwQmVhY29uLT50YWlsLCBwQmVhY29uLT50YWlsX2xlbik7CisJaWYgKCFwSWUgJiYgKHBDb25maWctPlNhcEh3X21vZGUgPT0gZUNTUl9ET1QxMV9NT0RFXzExYSB8fAorCQlwQ29uZmlnLT5TYXBId19tb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMWcgfHwKKwkJcENvbmZpZy0+U2FwSHdfbW9kZSA9PSBlQ1NSX0RPVDExX01PREVfMTFiKSkKKwkJc21lX2NvbmZpZy5jc3JDb25maWcuV01NU3VwcG9ydE1vZGUgPSBlQ3NyUm9hbVdtbU5vUW9zOworCXNtZV91cGRhdGVfY29uZmlnKHBIZGRDdHgtPmhIYWwsICZzbWVfY29uZmlnKTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA4LCAwKSkKKwkvKiBMaW51eCBrZXJuZWwgPCAzLjggZG9lcyBub3Qgc3VwcG9ydCBjaCB3aWR0aCBwYXJhbS4gU28gZm9yCisJICogMTFBQyBnZXQgZnJvbSBjaCB3aWR0aCBmcm9tIGluaSBmaWxlIG9ubHkgaWYgaHQ0MCBpcyBlbmFibGVkCisJICogVkhUODAgZGVwZW5kcyBvbiBIVDQwIGNvbmZpZy4KKwkgKi8KKwlpZiAocENvbmZpZy0+U2FwSHdfbW9kZSA9PSBlQ1NSX0RPVDExX01PREVfMTFhYykKKwkJaWYgKHBDb25maWctPmNoX3dpZHRoX29yaWcgPT0gTkw4MDIxMV9DSEFOX1dJRFRIXzQwKQorCQkJcENvbmZpZy0+Y2hfd2lkdGhfb3JpZyA9IGluaUNvbmZpZy0+dmh0Q2hhbm5lbFdpZHRoOworI2VuZGlmCisKKwlpZiAocENvbmZpZy0+Y2hfd2lkdGhfb3JpZyA9PSBOTDgwMjExX0NIQU5fV0lEVEhfODBQODApIHsKKwkJaWYgKHBIZGRDdHgtPmlzVkhUODBBbGxvd2VkID09IGZhbHNlKQorCQkJcENvbmZpZy0+Y2hfd2lkdGhfb3JpZyA9IENIX1dJRFRIXzQwTUhaOworCQllbHNlCisJCQlwQ29uZmlnLT5jaF93aWR0aF9vcmlnID0gQ0hfV0lEVEhfODBQODBNSFo7CisJfSBlbHNlIGlmIChwQ29uZmlnLT5jaF93aWR0aF9vcmlnID09IE5MODAyMTFfQ0hBTl9XSURUSF8xNjApIHsKKwkJaWYgKHBIZGRDdHgtPmlzVkhUODBBbGxvd2VkID09IGZhbHNlKQorCQkJcENvbmZpZy0+Y2hfd2lkdGhfb3JpZyA9IENIX1dJRFRIXzQwTUhaOworCQllbHNlCisJCQlwQ29uZmlnLT5jaF93aWR0aF9vcmlnID0gQ0hfV0lEVEhfMTYwTUhaOworCX0gZWxzZSBpZiAocENvbmZpZy0+Y2hfd2lkdGhfb3JpZyA9PSBOTDgwMjExX0NIQU5fV0lEVEhfODApIHsKKwkJaWYgKHBIZGRDdHgtPmlzVkhUODBBbGxvd2VkID09IGZhbHNlKQorCQkJcENvbmZpZy0+Y2hfd2lkdGhfb3JpZyA9IENIX1dJRFRIXzQwTUhaOworCQllbHNlCisJCQlwQ29uZmlnLT5jaF93aWR0aF9vcmlnID0gQ0hfV0lEVEhfODBNSFo7CisJfSBlbHNlIGlmIChwQ29uZmlnLT5jaF93aWR0aF9vcmlnID09IE5MODAyMTFfQ0hBTl9XSURUSF80MCkgeworCQlwQ29uZmlnLT5jaF93aWR0aF9vcmlnID0gQ0hfV0lEVEhfNDBNSFo7CisJfSBlbHNlIHsKKwkJcENvbmZpZy0+Y2hfd2lkdGhfb3JpZyA9IENIX1dJRFRIXzIwTUhaOworCX0KKworCWlmICh3bGFuX2hkZF9zZXR1cF9kcml2ZXJfb3ZlcnJpZGVzKHBIb3N0YXBkQWRhcHRlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogaHRfY2FwYWIgaXMgbm90IHdoYXQgdGhlIG5hbWUgY29udmV5cyx0aGlzIGlzIHVzZWQgZm9yIHByb3RlY3Rpb24KKwkgKiBiaXRtYXAgKi8KKwlwQ29uZmlnLT5odF9jYXBhYiA9IGluaUNvbmZpZy0+YXBQcm90ZWN0aW9uOworCisJaWYgKDAgIT0gd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2FwaWVzKHBIb3N0YXBkQWRhcHRlcikpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJTQVAgTm90IGFibGUgdG8gc2V0IEFQIElFcyIpKTsKKwkJd2xhbnNhcF9yZXNldF9zYXBfY29uZmlnX2FkZF9pZShwQ29uZmlnLCBlVVBEQVRFX0lFX0FMTCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBVYXBzZCBFbmFibGVkIEJpdCAqLworCXBDb25maWctPlVhcHNkRW5hYmxlID0gaW5pQ29uZmlnLT5hcFVhcHNkRW5hYmxlZDsKKwkvKiBFbmFibGUgT0JTUyBwcm90ZWN0aW9uICovCisJcENvbmZpZy0+b2Jzc1Byb3RFbmFibGVkID0gaW5pQ29uZmlnLT5hcE9CU1NQcm90RW5hYmxlZDsKKworCWlmIChwSG9zdGFwZEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCkKKwkJcENvbmZpZy0+c2FwX2RvdDExbWMgPQorCQkgICAgKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPmNvbmZpZy0+c2FwX2RvdDExbWM7CisJZWxzZSAvKiBmb3IgUDJQLUdvIGNhc2UgKi8KKwkJcENvbmZpZy0+c2FwX2RvdDExbWMgPSAxOworCisJaGRkTG9nKExPRzEsIEZMKCIxMU1DIFN1cHBvcnQgRW5hYmxlZCA6ICVkXG4iKSwKKwkJcENvbmZpZy0+c2FwX2RvdDExbWMpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXBDb25maWctPm1mcENhcGFibGUgPSBNRlBDYXBhYmxlOworCXBDb25maWctPm1mcFJlcXVpcmVkID0gTUZQUmVxdWlyZWQ7CisJaGRkTG9nKExPRzEsIEZMKCJTb2Z0IEFQIE1GUCBjYXBhYmxlICVkLCBNRlAgcmVxdWlyZWQgJWQiKSwKKwkgICAgICAgcENvbmZpZy0+bWZwQ2FwYWJsZSwgcENvbmZpZy0+bWZwUmVxdWlyZWQpOworI2VuZGlmCisKKwloZGRMb2coTE9HVywgRkwoIlNPZnRBUCBtYWNhZGRyZXNzIDogIiBNQUNfQUREUkVTU19TVFIpLAorCSAgICAgICBNQUNfQUREUl9BUlJBWShwSG9zdGFwZEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzKSk7CisJaGRkTG9nKExPR1csIEZMKCJzc2lkID0lcywgYmVhY29uaW50PSVkLCBjaGFubmVsPSVkIiksCisJICAgICAgIHBDb25maWctPlNTSURpbmZvLnNzaWQuc3NJZCwgKGludClwQ29uZmlnLT5iZWFjb25faW50LAorCSAgICAgICAoaW50KXBDb25maWctPmNoYW5uZWwpOworCWhkZExvZyhMT0dXLCBGTCgiaHdfbW9kZT0leCwgcHJpdmFjeT0lZCwgYXV0aFR5cGU9JWQiKSwKKwkgICAgICAgcENvbmZpZy0+U2FwSHdfbW9kZSwgcENvbmZpZy0+cHJpdmFjeSwgcENvbmZpZy0+YXV0aFR5cGUpOworCWhkZExvZyhMT0dXLCBGTCgiUlNOL1dQQUxlbj0lZCwgVWFwc2QgPSAlZCIpLAorCSAgICAgICAoaW50KXBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoLCBwQ29uZmlnLT5VYXBzZEVuYWJsZSk7CisJaGRkTG9nKExPR1csIEZMKCJQcm90RW5hYmxlZCA9ICVkLCBPQlNTUHJvdEVuYWJsZWQgPSAlZCIpLAorCSAgICAgICBwQ29uZmlnLT5wcm90RW5hYmxlZCwgcENvbmZpZy0+b2Jzc1Byb3RFbmFibGVkKTsKKworCWlmICh0ZXN0X2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZwSG9zdGFwZEFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkgeworCQl3bGFuc2FwX3Jlc2V0X3NhcF9jb25maWdfYWRkX2llKHBDb25maWcsIGVVUERBVEVfSUVfQUxMKTsKKwkJLyogQnNzIGFscmVhZHkgc3RhcnRlZC4ganVzdCByZXR1cm4uICovCisJCS8qIFRPRE8gUHJvYmFibHkgaXQgc2hvdWxkIHVwZGF0ZSBzb21lIGJlYWNvbiBwYXJhbXMuICovCisJCWhkZExvZyhMT0dFLCAiQnNzIEFscmVhZHkgc3RhcnRlZC4uLklnbm9yZSB0aGUgcmVxdWVzdCIpOworCQlFWElUKCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghY2RzX2FsbG93X2NvbmN1cnJlbmN5KHBIZGRDdHgsCisJCQkJY2RzX2NvbnZlcnRfZGV2aWNlX21vZGVfdG9faGRkX3R5cGUoCisJCQkJcEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQkJcENvbmZpZy0+Y2hhbm5lbCwgSFdfTU9ERV8yMF9NSFopKSB7CisJCWhkZExvZyhMT0dXLAorCQkJRkwoIlRoaXMgY29uY3VycmVuY3kgY29tYmluYXRpb24gaXMgbm90IGFsbG93ZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghY2RzX3NldF9jb25uZWN0aW9uX2luX3Byb2dyZXNzKHBIZGRDdHgsIHRydWUpKSB7CisJCWhkZF9lcnIoIkNhbid0IHN0YXJ0IEJTUzogc2V0IGNvbm5uZWN0aW9uIGluIHByb2dyZXNzIGZhaWxlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwQ29uZmlnLT5wZXJzb25hID0gcEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZTsKKworCXBTYXBFdmVudENhbGxiYWNrID0gaGRkX2hvc3RhcGRfc2FwX2V2ZW50X2NiOworCisJKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcikpLT5kZnNfY2FjX2Jsb2NrX3R4ID0gdHJ1ZTsKKworCWNkZl9ldmVudF9yZXNldCgmcEhvc3RhcGRTdGF0ZS0+Y2RmX2V2ZW50KTsKKwlzdGF0dXMgPSB3bGFuc2FwX3N0YXJ0X2JzcygKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJCVdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUgorCQkJKHBIb3N0YXBkQWRhcHRlciksCisjZWxzZQorCQlwX2Nkc19jb250ZXh0LAorI2VuZGlmCisJCXBTYXBFdmVudENhbGxiYWNrLCBwQ29uZmlnLAorCQlwSG9zdGFwZEFkYXB0ZXItPmRldik7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQl3bGFuc2FwX3Jlc2V0X3NhcF9jb25maWdfYWRkX2llKHBDb25maWcsIGVVUERBVEVfSUVfQUxMKTsKKwkJY2RzX3NldF9jb25uZWN0aW9uX2luX3Byb2dyZXNzKHBIZGRDdHgsIGZhbHNlKTsKKwkJaGRkTG9nKExPR0UsIEZMKCJTQVAgU3RhcnQgQnNzIGZhaWwiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhkZExvZyhMT0cxLAorCSAgICAgICBGTCgiV2FpdGluZyBmb3IgU2NhbiB0byBjb21wbGV0ZShhdXRvIG1vZGUpIGFuZCBCU1MgdG8gc3RhcnQiKSk7CisKKwlzdGF0dXMgPSBjZGZfd2FpdF9zaW5nbGVfZXZlbnQoJnBIb3N0YXBkU3RhdGUtPmNkZl9ldmVudCwgMTAwMDApOworCisJd2xhbnNhcF9yZXNldF9zYXBfY29uZmlnX2FkZF9pZShwQ29uZmlnLCBlVVBEQVRFX0lFX0FMTCk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoIkVSUk9SOiBIREQgY2RmIHdhaXQgZm9yIHNpbmdsZV9ldmVudCBmYWlsZWQhISIpKTsKKwkJY2RzX3NldF9jb25uZWN0aW9uX2luX3Byb2dyZXNzKHBIZGRDdHgsIGZhbHNlKTsKKwkJc21lX2dldF9jb21tYW5kX3Ffc3RhdHVzKGhIYWwpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJd2xhbnNhcF9zdG9wX2JzcyhXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKSk7CisjZWxzZQorCQl3bGFuc2FwX3N0b3BfYnNzKHBfY2RzX2NvbnRleHQpOworI2VuZGlmCisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBTdWNjZXNmdWxseSBzdGFydGVkIEJzcyB1cGRhdGUgdGhlIHN0YXRlIGJpdC4gKi8KKwlzZXRfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnBIb3N0YXBkQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCS8qIEluaXRpYWxpemUgV01NIGNvbmZpZ3VhdGlvbiAqLworCWhkZF93bW1faW5pdChwSG9zdGFwZEFkYXB0ZXIpOworCWNkc19pbmNyX2FjdGl2ZV9zZXNzaW9uKHBIZGRDdHgsIHBIb3N0YXBkQWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJCSBwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZCk7CisjaWZkZWYgREhDUF9TRVJWRVJfT0ZGTE9BRAorCWlmIChpbmlDb25maWctPmVuYWJsZURIQ1BTZXJ2ZXJPZmZsb2FkKQorCQl3bGFuX2hkZF9zZXRfZGhjcF9zZXJ2ZXJfb2ZmbG9hZChwSG9zdGFwZEFkYXB0ZXIpOworI2VuZGlmIC8qIERIQ1BfU0VSVkVSX09GRkxPQUQgKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfREVCVUcKKwlpZiAocEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pIHsKKwkJaWYgKGdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXMgPT0gUDJQX0dPX05FR19DT01QTEVURUQpIHsKKwkJCWdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXMgPSBQMlBfR09fQ09NUExFVEVEX1NUQVRFOworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoIltQMlAgU3RhdGVdIEZyb20gR28gbmVnbyBjb21wbGV0ZWQgdG8gTm9uLWF1dG9ub21vdXMgR3JvdXAgc3RhcnRlZCIpKTsKKwkJfSBlbHNlIGlmIChnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID09IFAyUF9OT1RfQUNUSVZFKSB7CisJCQlnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID0gUDJQX0dPX0NPTVBMRVRFRF9TVEFURTsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJbUDJQIFN0YXRlXSBGcm9tIEluYWN0aXZlIHRvIEF1dG9ub21vdXMgR3JvdXAgc3RhcnRlZCIpKTsKKwkJfQorCX0KKyNlbmRpZgorCisJY2RzX3NldF9jb25uZWN0aW9uX2luX3Byb2dyZXNzKHBIZGRDdHgsIGZhbHNlKTsKKwlwSG9zdGFwZFN0YXRlLT5iQ29tbWl0ID0gdHJ1ZTsKKwlFWElUKCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA0LCAwKSkKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9hZGRfYmVhY29uKCkgLSBhZGQgYmVhY29uIGluIHNvZnQgYXAgbW9kZQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5IHN0cnVjdHVyZQorICogQGRldjogUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogQHBhcmFtczogUG9pbnRlciB0byBhZGQgYmVhY29uIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2FkZF9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGJlYWNvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCWludCBzdGF0dXM7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX0NGRzgwMjExX0FERF9CRUFDT04sCisJCQkgcEFkYXB0ZXItPnNlc3Npb25JZCwgcGFyYW1zLT5pbnRlcnZhbCkpOworCWhkZExvZyhMT0cyLCBGTCgiRGV2aWNlIG1vZGUgJXMoJWQpIiksCisJCWhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmICghY2RzX2FsbG93X2NvbmN1cnJlbmN5KHBIZGRDdHgsCisJCQkJY2RzX2NvbnZlcnRfZGV2aWNlX21vZGVfdG9faGRkX3R5cGUoCisJCQkJcEFkYXB0ZXItPmRldmljZV9tb2RlKSwgMCwgSEREXzIwX01IWikpIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiVGhpcyBjb25jdXJyZW5jeSBjb21iaW5hdGlvbiBpcyBub3QgYWxsb3dlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQKSB8fAorCSAgICAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9HTykpIHsKKwkJYmVhY29uX2RhdGFfdCAqb2xkLCAqbmV3OworCisJCW9sZCA9IHBBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbjsKKworCQlpZiAob2xkKSB7CisJCQloZGRMb2coTE9HVywKKwkJCQlGTCgiYWxyZWFkeSBiZWFjb24gaW5mbyBhZGRlZCB0byBzZXNzaW9uKCVkKSIpLAorCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQpOworCQkJcmV0dXJuIC1FQUxSRUFEWTsKKwkJfQorCisJCXN0YXR1cyA9CisJCQl3bGFuX2hkZF9jZmc4MDIxMV9hbGxvY19uZXdfYmVhY29uKHBBZGFwdGVyLAorCQkJCQkJCSAgICZuZXcsIHBhcmFtcyk7CisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQlGTCgiRXJyb3IhISEgQWxsb2NhdGluZyB0aGUgbmV3IGJlYWNvbiIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uID0gbmV3OworCisJCXN0YXR1cyA9IHdsYW5faGRkX2NmZzgwMjExX3N0YXJ0X2JzcyhwQWRhcHRlciwgcGFyYW1zKTsKKwkJaWYgKDAgIT0gc3RhdHVzKSB7CisJCQlwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5iZWFjb24gPSBOVUxMOworCQkJa2ZyZWUobmV3KTsKKwkJfQorCX0KKworCUVYSVQoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2FkZF9iZWFjb24oKSAtIGFkZCBiZWFjb24gaW4gc2FwIG1vZGUKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXRkZXYKKyAqIEBwYXJhbTogUG9pbnRlciB0byBiZWFjb24gcGFyYW1ldGVycworICoKKyAqIFJldHVybjogemVybyBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfYWRkX2JlYWNvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGJlYWNvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9hZGRfYmVhY29uKHdpcGh5LCBkZXYsIHBhcmFtcyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9iZWFjb24oKSAtIHNldCBiZWFjb24gaW4gc29mdCBhcCBtb2RlCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkgc3RydWN0dXJlCisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiBAcGFyYW1zOiBQb2ludGVyIHRvIHNldCBiZWFjb24gcGFyYW1ldGVycworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2JlYWNvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgYmVhY29uX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwlpbnQgc3RhdHVzOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9TRVRfQkVBQ09OLAorCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsIHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkpOworCWhkZExvZyhMT0cxLCBGTCgiRGV2aWNlX21vZGUgJXMoJWQpIiksCisJCWhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmICgocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCkgfHwKKwkgICAgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pKSB7CisJCWJlYWNvbl9kYXRhX3QgKm9sZCwgKm5ldzsKKworCQlvbGQgPSBwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5iZWFjb247CisKKwkJaWYgKCFvbGQpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJzZXNzaW9uKCVkKSBvbGQgYW5kIG5ldyBoZWFkcyBwb2ludHMgdG8gTlVMTCIpLAorCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKworCQlzdGF0dXMgPQorCQkJd2xhbl9oZGRfY2ZnODAyMTFfYWxsb2NfbmV3X2JlYWNvbihwQWRhcHRlciwKKwkJCQkJCQkgICAmbmV3LCBwYXJhbXMpOworCisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQlGTCgiRXJyb3IhISEgQWxsb2NhdGluZyB0aGUgbmV3IGJlYWNvbiIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uID0gbmV3OworCQlzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9ic3MocEFkYXB0ZXIsIHBhcmFtcyk7CisJfQorCisJRVhJVCgpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2JlYWNvbigpIC0gc2V0IGJlYWNvbiBpbiBzYXAgbW9kZQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldGRldgorICogQHBhcmFtOiBQb2ludGVyIHRvIGJlYWNvbiBwYXJhbWV0ZXJzCisgKgorICogUmV0dXJuOiB6ZXJvIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgYmVhY29uX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9iZWFjb24od2lwaHksIGRldiwgcGFyYW1zKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKSAqLworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQorLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2RlbF9iZWFjb24oKSAtIHN0b3Agc29mdCBhcAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5IHN0cnVjdHVyZQorICogQGRldjogUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfZGVsX2JlYWNvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorI2Vsc2UKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9zdG9wX2FwKCkgLSBzdG9wIHNvZnQgYXAKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeSBzdHJ1Y3R1cmUKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3N0b3BfYXAoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKyNlbmRpZgoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IE5VTEw7CisJaGRkX3NjYW5pbmZvX3QgKnBTY2FuSW5mbyA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqc3RhQWRhcHRlciA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0U2lyVXBkYXRlSUUgdXBkYXRlSUU7CisJYmVhY29uX2RhdGFfdCAqb2xkOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyByYzsKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcEFkYXB0ZXJOb2RlID0gTlVMTDsKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcE5leHQgPSBOVUxMOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9TVE9QX0FQLAorCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkpOworCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9TT0ZUQVAgfHwKKwkgICAgICBwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKSkgeworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJaGRkTG9nKExPRzEsIEZMKCJEZXZpY2VfbW9kZSAlcyglZCkiKSwKKwkJaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhwQWRhcHRlci0+ZGV2aWNlX21vZGUpLAorCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCisJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKHBIZGRDdHgsICZwQWRhcHRlck5vZGUpOworCXdoaWxlIChOVUxMICE9IHBBZGFwdGVyTm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCXN0YUFkYXB0ZXIgPSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyOworCisJCWlmIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHN0YUFkYXB0ZXItPmRldmljZV9tb2RlIHx8CisJCSAgICAoV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBzdGFBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkJICAgIChXTEFOX0hERF9QMlBfR08gPT0gc3RhQWRhcHRlci0+ZGV2aWNlX21vZGUpKSB7CisJCQlwU2NhbkluZm8gPSAmc3RhQWRhcHRlci0+c2Nhbl9pbmZvOworCisJCQlpZiAocFNjYW5JbmZvICYmIHBTY2FuSW5mby0+bVNjYW5QZW5kaW5nKSB7CisJCQkJaGRkTG9nKExPRzEsIEZMKCJBYm9ydGluZyBwZW5kaW5nIHNjYW4gZm9yIGRldmljZSBtb2RlOiVkIiksCisJCQkJICAgICAgIHN0YUFkYXB0ZXItPmRldmljZV9tb2RlKTsKKwkJCQlJTklUX0NPTVBMRVRJT04ocFNjYW5JbmZvLT5hYm9ydHNjYW5fZXZlbnRfdmFyKTsKKwkJCQloZGRfYWJvcnRfbWFjX3NjYW4oc3RhQWRhcHRlci0+cEhkZEN0eCwKKwkJCQkJCSAgIHN0YUFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCSAgIGVDU1JfU0NBTl9BQk9SVF9ERUZBVUxUKTsKKwkJCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCQkJJnBTY2FuSW5mby0+YWJvcnRzY2FuX2V2ZW50X3ZhciwKKwkJCQkJbXNlY3NfdG9famlmZmllcygKKwkJCQkJCVdMQU5fV0FJVF9USU1FX0FCT1JUU0NBTikpOworCQkJCWlmICghcmMpIHsKKwkJCQkJaGRkTG9nKExPR0UsCisJCQkJCSAgICAgICBGTCgiVGltZW91dCBvY2N1cnJlZCB3aGlsZSB3YWl0aW5nIGZvciBhYm9ydHNjYW4iKSk7CisJCQkJCUNERl9BU1NFUlQocFNjYW5JbmZvLT5tU2NhblBlbmRpbmcpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKHBIZGRDdHgsIHBBZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisJfQorCS8qCisJICogV2hlbiBldmVyIHN0b3AgYXAgYWRhcHRlciBnZXRzIGNhbGxlZCwgd2UgbmVlZCB0byBjaGVjaworCSAqIHdoZXRoZXIgYW55IHJlc3RhcnQgQVAgd29yayBpcyBwZW5kaW5nLiBJZiBhbnkgcmVzdGFydCBpcyBwZW5kaW5nCisJICogdGhlbiBsZXRzIGZpbmlzaCBpdCBhbmQgZ28gYWhlYWQgZnJvbSB0aGVyZS4KKwkgKi8KKwlpZiAocEhkZEN0eC0+Y29uZmlnLT5jb25jX2N1c3RvbV9ydWxlMSAmJgorCSAgICAoV0xBTl9IRERfU09GVEFQID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJY2RzX2ZsdXNoX3dvcmsoJnBIZGRDdHgtPnNhcF9zdGFydF93b3JrKTsKKwkJaGRkTG9nKExPR1csIEZMKCJDYW5jZWxlZCB0aGUgcGVuZGluZyByZXN0YXJ0IHdvcmsiKSk7CisJCXNwaW5fbG9jaygmcEhkZEN0eC0+c2FwX3VwZGF0ZV9pbmZvX2xvY2spOworCQlwSGRkQ3R4LT5pc19zYXBfcmVzdGFydF9yZXF1aXJlZCA9IGZhbHNlOworCQlzcGluX3VubG9jaygmcEhkZEN0eC0+c2FwX3VwZGF0ZV9pbmZvX2xvY2spOworCX0KKwlwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuYWNzX2NmZy5hY3NfbW9kZSA9IGZhbHNlOworCWlmIChwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuYWNzX2NmZy5jaF9saXN0KQorCQljZGZfbWVtX2ZyZWUocEFkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnLmFjc19jZmcuY2hfbGlzdCk7CisJY2RmX21lbV96ZXJvKCZwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuYWNzX2NmZywKKwkJCQkJCXNpemVvZihzdHJ1Y3Qgc2FwX2Fjc19jZmcpKTsKKwloZGRfaG9zdGFwZF9zdG9wKGRldik7CisKKwlvbGQgPSBwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5iZWFjb247CisJaWYgKCFvbGQpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgiU2Vzc2lvbiglZCkgYmVhY29uIGRhdGEgcG9pbnRzIHRvIE5VTEwiKSwKKwkJICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZGRfY2xlYW51cF9hY3Rpb25mcmFtZShwSGRkQ3R4LCBwQWRhcHRlcik7CisKKwltdXRleF9sb2NrKCZwSGRkQ3R4LT5zYXBfbG9jayk7CisJaWYgKHRlc3RfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnBBZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKwkJaGRkX2hvc3RhcGRfc3RhdGVfdCAqcEhvc3RhcGRTdGF0ZSA9CisJCQlXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihwQWRhcHRlcik7CisKKwkJY2RmX2V2ZW50X3Jlc2V0KCZwSG9zdGFwZFN0YXRlLT5jZGZfc3RvcF9ic3NfZXZlbnQpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJc3RhdHVzID0gd2xhbnNhcF9zdG9wX2JzcyhXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIocEFkYXB0ZXIpKTsKKyNlbHNlCisJCXN0YXR1cyA9IHdsYW5zYXBfc3RvcF9ic3MocEhkZEN0eC0+cGNkc19jb250ZXh0KTsKKyNlbmRpZgorCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkJY2RmX3dhaXRfc2luZ2xlX2V2ZW50KCZwSG9zdGFwZFN0YXRlLT4KKwkJCQkJCSAgICAgIGNkZl9zdG9wX2Jzc19ldmVudCwKKwkJCQkJCSAgICAgIDEwMDAwKTsKKworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgiSEREIGNkZiB3YWl0IGZvciBzaW5nbGVfZXZlbnQgZmFpbGVkISEiKSk7CisJCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCX0KKwkJfQorCQljbGVhcl9iaXQoU09GVEFQX0JTU19TVEFSVEVELCAmcEFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKwkJLypCU1Mgc3RvcHBlZCwgY2xlYXIgdGhlIGFjdGl2ZSBzZXNzaW9ucyBmb3IgdGhpcyBkZXZpY2UgbW9kZSovCisJCWNkc19kZWNyX3Nlc3Npb25fc2V0X3BjbChwSGRkQ3R4LAorCQkJCQkJcEFkYXB0ZXItPmRldmljZV9tb2RlLAorCQkJCQkJcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCXBBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbiA9IE5VTEw7CisJCWtmcmVlKG9sZCk7CisJfQorCW11dGV4X3VubG9jaygmcEhkZEN0eC0+c2FwX2xvY2spOworCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJTdG9wcGluZyB0aGUgQlNTIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljZGZfbWVtX2NvcHkodXBkYXRlSUUuYnNzaWQsIHBBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcywKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwl1cGRhdGVJRS5zbWVTZXNzaW9uSWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCXVwZGF0ZUlFLmllQnVmZmVybGVuZ3RoID0gMDsKKwl1cGRhdGVJRS5wQWRkaXRpb25JRUJ1ZmZlciA9IE5VTEw7CisJdXBkYXRlSUUuYXBwZW5kID0gdHJ1ZTsKKwl1cGRhdGVJRS5ub3RpZnkgPSB0cnVlOworCWlmIChzbWVfdXBkYXRlX2FkZF9pZShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkgICAgICAmdXBkYXRlSUUsCisJCQkgICAgICBlVVBEQVRFX0lFX1BST0JFX0JDTikgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb3VsZCBub3QgcGFzcyBvbiBQUk9CRV9SU1BfQkNOIGRhdGEgdG8gUEUiKSk7CisJfQorCisJaWYgKHNtZV91cGRhdGVfYWRkX2llKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCSAgICAgICZ1cGRhdGVJRSwKKwkJCSAgICAgIGVVUERBVEVfSUVfQVNTT0NfUkVTUCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb3VsZCBub3QgcGFzcyBvbiBBU1NPQ19SU1AgZGF0YSB0byBQRSIpKTsKKwl9CisJLyogUmVzZXQgV05JX0NGR19QUk9CRV9SU1AgRmxhZ3MgKi8KKwl3bGFuX2hkZF9yZXNldF9wcm9iX3JzcGllcyhwQWRhcHRlcik7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0RFQlVHCisJaWYgKChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKSAmJgorCSAgICAoZ2xvYmFsX3AycF9jb25uZWN0aW9uX3N0YXR1cyA9PSBQMlBfR09fQ09NUExFVEVEX1NUQVRFKSkgeworCQloZGRMb2coTE9HRSwKKwkJCSJbUDJQIFN0YXRlXSBGcm9tIEdPIGNvbXBsZXRlZCB0byBJbmFjdGl2ZSBzdGF0ZSBHTyBnb3QgcmVtb3ZlZCIpOworCQlnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID0gUDJQX05PVF9BQ1RJVkU7CisJfQorI2VuZGlmCisJRVhJVCgpOworCXJldHVybiByZXQ7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDgsIDApKQorLyoqCisgKiB3bGFuX2hkZF9nZXRfY2hhbm5lbF9idygpIC0gZ2V0IGNoYW5uZWwgYmFuZHdpZHRoCisgKiBAd2lkdGg6IGlucHV0IGNoYW5uZWwgd2lkdGggaW4gbmw4MDIxMV9jaGFuX3dpZHRoIHZhbHVlCisgKgorICogUmV0dXJuOiBjaGFubmVsIHdpZHRoIHZhbHVlIGRlZmluZWQgYnkgZHJpdmVyCisgKi8KK3N0YXRpYyBlbnVtIGh3X21vZGVfYmFuZHdpZHRoIHdsYW5faGRkX2dldF9jaGFubmVsX2J3KAorCQkJCQllbnVtIG5sODAyMTFfY2hhbl93aWR0aCB3aWR0aCkKK3sKKwllbnVtIGh3X21vZGVfYmFuZHdpZHRoIGNoX2J3ID0gSFdfTU9ERV8yMF9NSFo7CisKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfMjBfTk9IVDoKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF8yMDoKKwkJY2hfYncgPSBIV19NT0RFXzIwX01IWjsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfNDA6CisJCWNoX2J3ID0gSFdfTU9ERV80MF9NSFo7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzgwOgorCQljaF9idyA9IEhXX01PREVfODBfTUhaOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF84MFA4MDoKKwkJY2hfYncgPSBIV19NT0RFXzgwX1BMVVNfODBfTUhaOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF8xNjA6CisJCWNoX2J3ID0gSFdfTU9ERV8xNjBfTUhaOworCQlicmVhazsKKwlkZWZhdWx0OgorCQloZGRfZXJyKCJJbnZhbGlkIHdpZHRoOiAlZCwgdXNpbmcgZGVmYXVsdCAyME1IeiIsIHdpZHRoKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGNoX2J3OworfQorI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgNCwgMCkpICYmICFkZWZpbmVkKFdJVEhfQkFDS1BPUlRTKQorLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfYmVhY29uKCkgLSBkZWxldGUgYmVhY29uIGluIHNhcCBtb2RlCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0ZGV2CisgKgorICogUmV0dXJuOiB6ZXJvIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2RlbF9iZWFjb24od2lwaHksIGRldik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKyNlbHNlCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3N0b3BfYXAoKSAtIHN0b3Agc2FwCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0ZGV2CisgKgorICogUmV0dXJuOiB6ZXJvIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zdG9wX2FwKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3N0b3BfYXAod2lwaHksIGRldik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDMsIDMsIDApKQorLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3N0YXJ0X2FwKCkgLSBzdGFydCBzb2Z0IGFwIG1vZGUKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeSBzdHJ1Y3R1cmUKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbXM6IFBvaW50ZXIgdG8gQVAgc2V0dGluZ3MgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfc3RhcnRfYXAoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGNmZzgwMjExX2FwX3NldHRpbmdzICpwYXJhbXMpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCXRTaXJXaWZpQ2hhbm5lbFdpZHRoIGNoYW5uZWxfd2lkdGg7CisJaW50IHN0YXR1czsKKwl1aW50OF90IGNoYW5uZWw7CisJcF9jZHNfY29udGV4dFR5cGUgcF9jZHNfY29udGV4dDsKKworCUVOVEVSKCk7CisKKwlwX2Nkc19jb250ZXh0ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworCWlmICghcF9jZHNfY29udGV4dCkgeworCQloZGRfZXJyKCJJbnZhbGlkIENEUyBjb250ZXh0Iik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9TVEFSVF9BUCwgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCSBwYXJhbXMtPmJlYWNvbl9pbnRlcnZhbCkpOworCWlmIChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IHBBZGFwdGVyLT5tYWdpYykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBhZGFwdGVyIG1hZ2ljIGlzIGludmFsaWQiKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWhkZExvZyhMT0cyLCBGTCgicEFkYXB0ZXIgPSAlcCwgRGV2aWNlIG1vZGUgJXMoJWQpIiksIHBBZGFwdGVyLAorCSAgICAgICBoZGRfZGV2aWNlX21vZGVfdG9fc3RyaW5nKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJICAgICAgIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDgsIDApKQorCWNoYW5uZWxfd2lkdGggPSB3bGFuX2hkZF9nZXRfY2hhbm5lbF9idyhwYXJhbXMtPmNoYW5kZWYud2lkdGgpOworCWNoYW5uZWwgPSBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoCisJCQkJcGFyYW1zLT5jaGFuZGVmLmNoYW4tPmNlbnRlcl9mcmVxKTsKKyNlbHNlCisJY2hhbm5lbF93aWR0aCA9IEhXX01PREVfMjBfTUhaOworCWNoYW5uZWwgPSAwOworI2VuZGlmCisJLyogY2hlY2sgaWYgY29uY3VycmVuY3kgaXMgYWxsb3dlZCAqLworCWlmICghY2RzX2FsbG93X2NvbmN1cnJlbmN5KHBIZGRDdHgsCisJCQkJY2RzX2NvbnZlcnRfZGV2aWNlX21vZGVfdG9faGRkX3R5cGUoCisJCQkJcEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJCQljaGFubmVsLAorCQkJCWNoYW5uZWxfd2lkdGgpKSB7CisJCWhkZF9lcnIoIkNvbm5lY3Rpb24gZmFpbGVkIGR1ZSB0byBjb25jdXJyZW5jeSBjaGVjayBmYWlsdXJlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocEhkZEN0eC0+Y29uZmlnLT5wb2xpY3lfbWFuYWdlcl9lbmFibGVkKSB7CisJCXN0YXR1cyA9IGNkZl9ldmVudF9yZXNldCgKKwkJCQkmcF9jZHNfY29udGV4dC0+Y29ubmVjdGlvbl91cGRhdGVfZG9uZV9ldnQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJaGRkX2VycigiRVJSOiBjbGVhciBldmVudCBmYWlsZWQiKTsKKworCQlzdGF0dXMgPSBjZHNfY3VycmVudF9jb25uZWN0aW9uc191cGRhdGUocEhkZEN0eCwgY2hhbm5lbCk7CisJCWlmIChDREZfU1RBVFVTX0VfRkFJTFVSRSA9PSBzdGF0dXMpIHsKKwkJCWhkZF9lcnIoIkVSUk9SOiBjb25uZWN0aW9ucyB1cGRhdGUgZmFpbGVkISEiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJCXN0YXR1cyA9IGNkZl93YWl0X3NpbmdsZV9ldmVudCgKKwkJCQkgICAgJnBfY2RzX2NvbnRleHQtPmNvbm5lY3Rpb25fdXBkYXRlX2RvbmVfZXZ0LAorCQkJCSAgICBDT05ORUNUSU9OX1VQREFURV9USU1FT1VUKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQloZGRfZXJyKCJFUlJPUjogY2RmIHdhaXQgZm9yIGV2ZW50IGZhaWxlZCEhIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9TT0ZUQVApCisJICAgIHx8IChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKQorCSAgICApIHsKKwkJYmVhY29uX2RhdGFfdCAqb2xkLCAqbmV3OworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkpCisJCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlOworI2VuZGlmCisKKwkJb2xkID0gcEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uOworCisJCWlmIChvbGQpCisJCQlyZXR1cm4gLUVBTFJFQURZOworCisJCXN0YXR1cyA9CisJCQl3bGFuX2hkZF9jZmc4MDIxMV9hbGxvY19uZXdfYmVhY29uKHBBZGFwdGVyLCAmbmV3LAorCQkJCQkJCSAgICZwYXJhbXMtPmJlYWNvbiwKKwkJCQkJCQkgICBwYXJhbXMtPmR0aW1fcGVyaW9kKTsKKworCQlpZiAoc3RhdHVzICE9IDApIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiRXJyb3IhISEgQWxsb2NhdGluZyB0aGUgbmV3IGJlYWNvbiIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXBBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbiA9IG5ldzsKKworCQlpZiAocGFyYW1zLT5jaGFuZGVmLndpZHRoIDwgTkw4MDIxMV9DSEFOX1dJRFRIXzgwKQorCQkJY2hhbm5lbF90eXBlID0gY2ZnODAyMTFfZ2V0X2NoYW5kZWZfdHlwZSgKKwkJCQkJCSYocGFyYW1zLT5jaGFuZGVmKSk7CisJCWVsc2UKKwkJCWNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9IVDQwUExVUzsKKworCisJCXdsYW5faGRkX3NldF9jaGFubmVsKHdpcGh5LCBkZXYsCisJCQkJICAgICAmcGFyYW1zLT5jaGFuZGVmLAorCQkJCSAgICAgY2hhbm5lbF90eXBlKTsKKworCQkvKiBzZXQgYXV0aGVudGljYXRpb24gdHlwZSAqLworCQlzd2l0Y2ggKHBhcmFtcy0+YXV0aF90eXBlKSB7CisJCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTToKKwkJCXBBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnNhcENvbmZpZy5hdXRoVHlwZSA9CisJCQkJZVNBUF9PUEVOX1NZU1RFTTsKKwkJCWJyZWFrOworCQljYXNlIE5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWToKKwkJCXBBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnNhcENvbmZpZy5hdXRoVHlwZSA9CisJCQkJZVNBUF9TSEFSRURfS0VZOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuYXV0aFR5cGUgPQorCQkJCWVTQVBfQVVUT19TV0lUQ0g7CisJCX0KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDgsIDApKQorCQlwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuY2hfd2lkdGhfb3JpZyA9CisJCQkJCQlwYXJhbXMtPmNoYW5kZWYud2lkdGg7CisjZW5kaWYKKwkJc3RhdHVzID0KKwkJCXdsYW5faGRkX2NmZzgwMjExX3N0YXJ0X2JzcyhwQWRhcHRlciwKKwkJCQkmcGFyYW1zLT5iZWFjb24sCisJCQkJcGFyYW1zLT5zc2lkLCBwYXJhbXMtPnNzaWRfbGVuLAorCQkJCXBhcmFtcy0+aGlkZGVuX3NzaWQpOworCX0KKworCUVYSVQoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3N0YXJ0X2FwKCkgLSBzdGFydCBzYXAKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXRkZXYKKyAqIEBwYXJhbXM6IFBvaW50ZXIgdG8gc3RhcnQgYXAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogUmV0dXJuOiB6ZXJvIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9hcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNmZzgwMjExX2FwX3NldHRpbmdzICpwYXJhbXMpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9hcCh3aXBoeSwgZGV2LCBwYXJhbXMpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9jaGFuZ2VfYmVhY29uKCkgLSBjaGFuZ2UgYmVhY29uIGZvciBzb2ZhdGFwL3AycCBnbworICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5IHN0cnVjdHVyZQorICogQGRldjogUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogQHBhcmFtczogUG9pbnRlciB0byBjaGFuZ2UgYmVhY29uIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2NoYW5nZV9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGNmZzgwMjExX2JlYWNvbl9kYXRhICpwYXJhbXMpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCWJlYWNvbl9kYXRhX3QgKm9sZCwgKm5ldzsKKwlpbnQgc3RhdHVzOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9DSEFOR0VfQkVBQ09OLAorCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkpOworCWhkZExvZyhMT0cxLCBGTCgiRGV2aWNlX21vZGUgJXMoJWQpIiksCisJICAgICAgIGhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkgICAgICAgcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmICghKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9TT0ZUQVAgfHwKKwkgICAgICBwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKSkgeworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJb2xkID0gcEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uOworCisJaWYgKCFvbGQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJzZXNzaW9uKCVkKSBiZWFjb24gZGF0YSBwb2ludHMgdG8gTlVMTCIpLAorCQkgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0YXR1cyA9IHdsYW5faGRkX2NmZzgwMjExX2FsbG9jX25ld19iZWFjb24ocEFkYXB0ZXIsICZuZXcsIHBhcmFtcywgMCk7CisKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQloZGRMb2coTE9HRSwgRkwoIm5ldyBiZWFjb24gYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5iZWFjb24gPSBuZXc7CisJc3RhdHVzID0gd2xhbl9oZGRfY2ZnODAyMTFfc3RhcnRfYnNzKHBBZGFwdGVyLCBwYXJhbXMsIE5VTEwsIDAsIDApOworCisJRVhJVCgpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfY2hhbmdlX2JlYWNvbigpIC0gY2hhbmdlIGJlYWNvbiBjb250ZW50IGluIHNhcCBtb2RlCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0ZGV2CisgKiBAcGFyYW1zOiBQb2ludGVyIHRvIGNoYW5nZSBiZWFjb24gcGFyYW1ldGVycworICoKKyAqIFJldHVybjogemVybyBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfY2hhbmdlX2JlYWNvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNmZzgwMjExX2JlYWNvbl9kYXRhICpwYXJhbXMpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9jaGFuZ2VfYmVhY29uKHdpcGh5LCBkZXYsIHBhcmFtcyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigzLCAzLCAwKSkgKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9ob3N0YXBkLmggYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfaG9zdGFwZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTY1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfaG9zdGFwZC5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoV0xBTl9IRERfSE9TVEFQRF9IKQorI2RlZmluZSBXTEFOX0hERF9IT1NUQVBEX0gKKworLyoqCisgKiBET0M6IHdsYW5faGRkX2hvc3RhcGQuaAorICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgZHJpdmVyIGhvc3RhcGQgaGVhZGVyIGZpbGUKKyAqLworCisvKiBJbmNsdWRlIGZpbGVzICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxjZGZfbGlzdC5oPgorI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX21haW4uaD4KKworLyogUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMgKi8KKworLyogbWF4IGxlbmd0aCBvZiBjb21tYW5kIHN0cmluZyBpbiBob3N0YXBkIGlvY3RsICovCisjZGVmaW5lIEhPU1RBUERfSU9DVExfQ09NTUFORF9TVFJMRU5fTUFYICAgODE5MgorCitoZGRfYWRhcHRlcl90ICpoZGRfd2xhbl9jcmVhdGVfYXBfZGV2KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJICAgICAgdFNpck1hY0FkZHIgbWFjQWRkciwgdWludDhfdCAqbmFtZSk7CisKK0NERl9TVEFUVVMgaGRkX3JlZ2lzdGVyX2hvc3RhcGQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVpbnQ4X3QgcnRubF9oZWxkKTsKKworQ0RGX1NUQVRVUyBoZGRfdW5yZWdpc3Rlcl9ob3N0YXBkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBib29sIHJ0bmxfaGVsZCk7CisKK2VDc3JBdXRoVHlwZQoraGRkX3RyYW5zbGF0ZV9yc25fdG9fY3NyX2F1dGhfdHlwZSh1aW50OF90IGF1dGhfc3VpdGVbNF0pOworCitlQ3NyRW5jcnlwdGlvblR5cGUKK2hkZF90cmFuc2xhdGVfcnNuX3RvX2Nzcl9lbmNyeXB0aW9uX3R5cGUodWludDhfdCBjaXBoZXJfc3VpdGVbNF0pOworCitlQ3NyRW5jcnlwdGlvblR5cGUKK2hkZF90cmFuc2xhdGVfcnNuX3RvX2Nzcl9lbmNyeXB0aW9uX3R5cGUodWludDhfdCBjaXBoZXJfc3VpdGVbNF0pOworCitlQ3NyQXV0aFR5cGUKK2hkZF90cmFuc2xhdGVfd3BhX3RvX2Nzcl9hdXRoX3R5cGUodWludDhfdCBhdXRoX3N1aXRlWzRdKTsKKworZUNzckVuY3J5cHRpb25UeXBlCitoZGRfdHJhbnNsYXRlX3dwYV90b19jc3JfZW5jcnlwdGlvbl90eXBlKHVpbnQ4X3QgY2lwaGVyX3N1aXRlWzRdKTsKKworQ0RGX1NUQVRVUyBoZGRfc29mdGFwX3N0YV9kZWF1dGgoaGRkX2FkYXB0ZXJfdCAqLAorCQlzdHJ1Y3QgdGFnQ3NyRGVsU3RhUGFyYW1zICopOwordm9pZCBoZGRfc29mdGFwX3N0YV9kaXNhc3NvYyhoZGRfYWRhcHRlcl90ICosIHVpbnQ4X3QgKik7Cit2b2lkIGhkZF9zb2Z0YXBfdGtpcF9taWNfZmFpbF9jb3VudGVyX21lYXN1cmUoaGRkX2FkYXB0ZXJfdCAqLCBib29sKTsKK2ludCBoZGRfc29mdGFwX3VucGFja19pZSh0SGFsSGFuZGxlIGhhbEhhbmRsZSwKKwkJCSBlQ3NyRW5jcnlwdGlvblR5cGUgKnBFbmNyeXB0VHlwZSwKKwkJCSBlQ3NyRW5jcnlwdGlvblR5cGUgKm1jRW5jcnlwdFR5cGUsCisJCQkgZUNzckF1dGhUeXBlICpwQXV0aFR5cGUsCisJCQkgYm9vbCAqcE1GUENhcGFibGUsCisJCQkgYm9vbCAqcE1GUFJlcXVpcmVkLAorCQkJIHVpbnQxNl90IGdlbl9pZV9sZW4sIHVpbnQ4X3QgKmdlbl9pZSk7CisKK0NERl9TVEFUVVMgaGRkX2hvc3RhcGRfc2FwX2V2ZW50X2NiKHRwU2FwX0V2ZW50IHBTYXBFdmVudCwKKwkJCQkgICAgdm9pZCAqdXNyRGF0YUZvckNhbGxiYWNrKTsKK0NERl9TVEFUVVMgaGRkX2luaXRfYXBfbW9kZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7Cit2b2lkIGhkZF9zZXRfYXBfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpwV2xhbkhvc3RhcGREZXYpOworaW50IGhkZF9ob3N0YXBkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGhkZF9ob3N0YXBkX2NoYW5uZWxfd2FrZWxvY2tfaW5pdChoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK3ZvaWQgaGRkX2hvc3RhcGRfY2hhbm5lbF93YWtlbG9ja19kZWluaXQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MKK3ZvaWQgaGRkX3Jlc3RhcnRfc29mdGFwKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRk9SQ0VfU0FQX1NDQyAqLworI2lmZGVmIFFDQV9IVF8yMDQwX0NPRVgKK0NERl9TVEFUVVMgaGRkX3NldF9zYXBfaHQyMDQwX21vZGUoaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyLAorCQkJCSAgIHVpbnQ4X3QgY2hhbm5lbF90eXBlKTsKKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQoraW50IHdsYW5faGRkX2NmZzgwMjExX2FkZF9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGJlYWNvbl9wYXJhbWV0ZXJzICpwYXJhbXMpOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2JlYWNvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgYmVhY29uX3BhcmFtZXRlcnMgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA0LCAwKSkKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2Vsc2UKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zdG9wX2FwKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDMsIDMsIDApKQoraW50IHdsYW5faGRkX2NmZzgwMjExX3N0YXJ0X2FwKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfYXBfc2V0dGluZ3MgKnBhcmFtcyk7CisjZW5kaWYKKworaW50IHdsYW5faGRkX2NmZzgwMjExX2NoYW5nZV9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGNmZzgwMjExX2JlYWNvbl9kYXRhICpwYXJhbXMpOworCitDREZfU1RBVFVTIHdsYW5faGRkX2NvbmZpZ19hY3MoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcik7CisjZW5kaWYgLyogZW5kICNpZiAhZGVmaW5lZChXTEFOX0hERF9IT1NUQVBEX0gpICovCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfaW9jdGwuYyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzIxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfaW9jdGwuYwpAQCAtMCwwICsxLDYzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qIEluY2x1ZGUgRmlsZXMgKi8KKworI2luY2x1ZGUgPHdsYW5faGRkX2luY2x1ZGVzLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfd293bC5oPgorI2luY2x1ZGUgIndsYW5faGRkX3RyYWNlLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfaW9jdGwuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9wb3dlci5oIgorI2luY2x1ZGUgIndsYW5faGRkX2RyaXZlcl9vcHMuaCIKKyNpbmNsdWRlICJjZHNfY29uY3VycmVuY3kuaCIKKworI2luY2x1ZGUgIndsYW5faGRkX3AycC5oIgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSAid21hLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbmFwaS5oIgorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorI2luY2x1ZGUgPHNtZV9hcGkuaD4KKyNpbmNsdWRlIDxzaXJfYXBpLmg+CisjZW5kaWYKKyNpbmNsdWRlICJoaWYuaCIKKworI2lmIGRlZmluZWQoTElOVVhfUUNNQlIpCisjZGVmaW5lIFNJT0NJT0NUTFRYOTkgKFNJT0NERVZQUklWQVRFKzEzKQorI2VuZGlmCisKKy8qCisgKiBTaXplIG9mIERyaXZlciBjb21tYW5kIHN0cmluZ3MgZnJvbSB1cHBlciBsYXllcgorICovCisjZGVmaW5lIFNJWkVfT0ZfU0VUUk9BTU1PREUgICAgICAgICAgICAgMTEgICAgICAvKiBzaXplIG9mIFNFVFJPQU1NT0RFICovCisjZGVmaW5lIFNJWkVfT0ZfR0VUUk9BTU1PREUgICAgICAgICAgICAgMTEgICAgICAvKiBzaXplIG9mIEdFVFJPQU1NT0RFICovCisKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKyNkZWZpbmUgVElEX01JTl9WQUxVRSAwCisjZGVmaW5lIFRJRF9NQVhfVkFMVUUgMTUKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisKKy8qCisgKiBNYXhpbXVtIGJ1ZmZlciBzaXplIHVzZWQgZm9yIHJldHVybmluZyB0aGUgZGF0YSBiYWNrIHRvIHVzZXIgc3BhY2UKKyAqLworI2RlZmluZSBXTEFOX01BWF9CVUZfU0laRSAxMDI0CisjZGVmaW5lIFdMQU5fUFJJVl9EQVRBX01BWF9MRU4gICAgODE5MgorCisvKgorICogRHJpdmVyIG1pcmFjYXN0IHBhcmFtZXRlcnMgMC1EaXNhYmxlZAorICogMS1Tb3VyY2UsIDItU2luaworICovCisjZGVmaW5lIFdMQU5fSEREX0RSSVZFUl9NSVJBQ0FTVF9DRkdfTUlOX1ZBTCAwCisjZGVmaW5lIFdMQU5fSEREX0RSSVZFUl9NSVJBQ0FTVF9DRkdfTUFYX1ZBTCAyCisKKy8qCisgKiBXaGVuIGV2ZXIgd2UgbmVlZCB0byBwcmludCBJQlNTUEVFUklORk9BTEwgZm9yIG1vcmUgdGhhbiAxNiBTVEEKKyAqIHdlIHdpbGwgc3BsaXQgdGhlIHByaW50aW5nLgorICovCisjZGVmaW5lIE5VTV9PRl9TVEFfREFUQV9UT19QUklOVCAxNgorCisvKgorICogQW5kcm9pZCBEUklWRVIgY29tbWFuZCBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCBhbmRyb2lkX3dpZmlfcmVhc3NvY19wYXJhbXMgeworCXVuc2lnbmVkIGNoYXIgYnNzaWRbMThdOworCWludCBjaGFubmVsOworfTsKKworI2RlZmluZSBBTkRST0lEX1dJRklfQUNUSU9OX0ZSQU1FX1NJWkUgMTA0MAorc3RydWN0IGFuZHJvaWRfd2lmaV9hZl9wYXJhbXMgeworCXVuc2lnbmVkIGNoYXIgYnNzaWRbMThdOworCWludCBjaGFubmVsOworCWludCBkd2VsbF90aW1lOworCWludCBsZW47CisJdW5zaWduZWQgY2hhciBkYXRhW0FORFJPSURfV0lGSV9BQ1RJT05fRlJBTUVfU0laRV07Cit9OworCisvKgorICogRGVmaW5lIEhERCBkcml2ZXIgY29tbWFuZCBoYW5kbGluZyBlbnRyeSwgZWFjaCBjb250YWlucyBhIGNvbW1hbmQKKyAqIHN0cmluZyBhbmQgdGhlIGhhbmRsZXIuCisgKi8KK3R5cGVkZWYgaW50ICgqaGRkX2Rydl9jbWRfaGFuZGxlcl90KShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgIHVpbnQ4X3QgKmNtZCwKKwkJCQkgICAgIHVpbnQ4X3QgY21kX25hbWVfbGVuLAorCQkJCSAgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpOworCit0eXBlZGVmIHN0cnVjdCB7CisJY29uc3QgY2hhciAqY21kOworCWhkZF9kcnZfY21kX2hhbmRsZXJfdCBoYW5kbGVyOworfSBoZGRfZHJ2X2NtZF90OworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCisjZGVmaW5lIFdMQU5fV0FJVF9USU1FX1JFQURZX1RPX0VYVFdPVyAgIDIwMDAKKyNkZWZpbmUgV0xBTl9IRERfTUFYX1RDUF9QT1JUICAgICAgICAgICAgNjU1MzUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorc3RhdGljIHZvaWQgaGRkX2dldF90c21fc3RhdHNfY2IodEFuaVRyYWZTdHJtTWV0cmljcyB0c21fbWV0cmljcywKKwkJCQkgY29uc3QgdWludDMyX3Qgc3RhSWQsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHN0YXRzQ29udGV4dCAqc3RhdHNfY29udGV4dCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IE5VTEw7CisKKwlpZiAoTlVMTCA9PSBjb250ZXh0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IEJhZCBwYXJhbSwgY29udGV4dCBbJXBdIiwgX19mdW5jX18sIGNvbnRleHQpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIHRoYXQgZXhpc3RzIGJldHdlZW4gdGhpcyBjYWxsYmFjaworCSAqIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyIHNpbmNlIHRoZSBjYWxsZXIgY291bGQgdGltZSBvdXQgZWl0aGVyCisJICogYmVmb3JlIG9yIHdoaWxlIHRoaXMgY29kZSBpcyBleGVjdXRpbmcuICB3ZSB1c2UgYSBzcGlubG9jayB0bworCSAqIHNlcmlhbGl6ZSB0aGVzZSBhY3Rpb25zCisJICovCisJc3Bpbl9sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKworCXN0YXRzX2NvbnRleHQgPSBjb250ZXh0OworCWFkYXB0ZXIgPSBzdGF0c19jb250ZXh0LT5wQWRhcHRlcjsKKwlpZiAoKE5VTEwgPT0gYWRhcHRlcikgfHwKKwkgICAgKFNUQVRTX0NPTlRFWFRfTUFHSUMgIT0gc3RhdHNfY29udGV4dC0+bWFnaWMpKSB7CisJCS8qCisJCSAqIHRoZSBjYWxsZXIgcHJlc3VtYWJseSB0aW1lZCBvdXQgc28gdGhlcmUgaXMKKwkJICogbm90aGluZyB3ZSBjYW4gZG8KKwkJICovCisJCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkgICAgICAgIiVzOiBJbnZhbGlkIGNvbnRleHQsIGFkYXB0ZXIgWyVwXSBtYWdpYyBbJTA4eF0iLAorCQkgICAgICAgX19mdW5jX18sIGFkYXB0ZXIsIHN0YXRzX2NvbnRleHQtPm1hZ2ljKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNvbnRleHQgaXMgdmFsaWQgc28gY2FsbGVyIGlzIHN0aWxsIHdhaXRpbmcgKi8KKworCS8qIHBhcmFub2lhOiBpbnZhbGlkYXRlIHRoZSBtYWdpYyAqLworCXN0YXRzX2NvbnRleHQtPm1hZ2ljID0gMDsKKworCS8qIGNvcHkgb3ZlciB0aGUgdHNtIHN0YXRzICovCisJYWRhcHRlci0+dHNtU3RhdHMuVXBsaW5rUGt0UXVldWVEbHkgPSB0c21fbWV0cmljcy5VcGxpbmtQa3RRdWV1ZURseTsKKwljZGZfbWVtX2NvcHkoYWRhcHRlci0+dHNtU3RhdHMuVXBsaW5rUGt0UXVldWVEbHlIaXN0LAorCQkgICAgIHRzbV9tZXRyaWNzLlVwbGlua1BrdFF1ZXVlRGx5SGlzdCwKKwkJICAgICBzaXplb2YoYWRhcHRlci0+dHNtU3RhdHMuVXBsaW5rUGt0UXVldWVEbHlIaXN0KSAvCisJCSAgICAgc2l6ZW9mKGFkYXB0ZXItPnRzbVN0YXRzLlVwbGlua1BrdFF1ZXVlRGx5SGlzdFswXSkpOworCWFkYXB0ZXItPnRzbVN0YXRzLlVwbGlua1BrdFR4RGx5ID0gdHNtX21ldHJpY3MuVXBsaW5rUGt0VHhEbHk7CisJYWRhcHRlci0+dHNtU3RhdHMuVXBsaW5rUGt0TG9zcyA9IHRzbV9tZXRyaWNzLlVwbGlua1BrdExvc3M7CisJYWRhcHRlci0+dHNtU3RhdHMuVXBsaW5rUGt0Q291bnQgPSB0c21fbWV0cmljcy5VcGxpbmtQa3RDb3VudDsKKwlhZGFwdGVyLT50c21TdGF0cy5Sb2FtaW5nQ291bnQgPSB0c21fbWV0cmljcy5Sb2FtaW5nQ291bnQ7CisJYWRhcHRlci0+dHNtU3RhdHMuUm9hbWluZ0RseSA9IHRzbV9tZXRyaWNzLlJvYW1pbmdEbHk7CisKKwkvKiBub3RpZnkgdGhlIGNhbGxlciAqLworCWNvbXBsZXRlKCZzdGF0c19jb250ZXh0LT5jb21wbGV0aW9uKTsKKworCS8qIHNlcmlhbGl6YXRpb24gaXMgY29tcGxldGUgKi8KKwlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7Cit9CisKK3N0YXRpYworQ0RGX1NUQVRVUyBoZGRfZ2V0X3RzbV9zdGF0cyhoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJICAgICBjb25zdCB1aW50OF90IHRpZCwKKwkJCSAgICAgdEFuaVRyYWZTdHJtTWV0cmljcyAqdHNtX21ldHJpY3MpCit7CisJaGRkX3N0YXRpb25fY3R4X3QgKmhkZF9zdGFfY3R4ID0gTlVMTDsKKwlDREZfU1RBVFVTIGhzdGF0dXM7CisJQ0RGX1NUQVRVUyB2c3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgcmM7CisJc3RydWN0IHN0YXRzQ29udGV4dCBjb250ZXh0OworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBOVUxMOworCisJaWYgKE5VTEwgPT0gYWRhcHRlcikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBhZGFwdGVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisJaGRkX3N0YV9jdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpOworCisJLyogd2UgYXJlIGNvbm5lY3RlZCBwcmVwYXJlIG91ciBjYWxsYmFjayBjb250ZXh0ICovCisJaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LmNvbXBsZXRpb24pOworCWNvbnRleHQucEFkYXB0ZXIgPSBhZGFwdGVyOworCWNvbnRleHQubWFnaWMgPSBTVEFUU19DT05URVhUX01BR0lDOworCisJLyogcXVlcnkgdHNtIHN0YXRzICovCisJaHN0YXR1cyA9IHNtZV9nZXRfdHNtX3N0YXRzKGhkZF9jdHgtPmhIYWwsIGhkZF9nZXRfdHNtX3N0YXRzX2NiLAorCQkJCSAgICBoZGRfc3RhX2N0eC0+Y29ubl9pbmZvLnN0YUlkWzBdLAorCQkJCSAgICBoZGRfc3RhX2N0eC0+Y29ubl9pbmZvLmJzc0lkLAorCQkJCSAgICAmY29udGV4dCwgaGRkX2N0eC0+cGNkc19jb250ZXh0LCB0aWQpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gaHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmV0cmlldmUgc3RhdGlzdGljcyIsIF9fZnVuY19fKTsKKwkJdnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQVVMVDsKKwl9IGVsc2UgeworCQkvKiByZXF1ZXN0IHdhcyBzZW50IC0tIHdhaXQgZm9yIHRoZSByZXNwb25zZSAqLworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udGV4dC5jb21wbGV0aW9uLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfU1RBVFMpKTsKKwkJaWYgKCFyYykgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICAiJXM6IFNNRSB0aW1lZCBvdXQgd2hpbGUgcmV0cmlldmluZyBzdGF0aXN0aWNzIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQl2c3RhdHVzID0gQ0RGX1NUQVRVU19FX1RJTUVPVVQ7CisJCX0KKwl9CisKKwkvKgorCSAqIGVpdGhlciB3ZSBuZXZlciBzZW50IGEgcmVxdWVzdCwgd2Ugc2VudCBhIHJlcXVlc3QgYW5kIHJlY2VpdmVkIGEKKwkgKiByZXNwb25zZSBvciB3ZSBzZW50IGEgcmVxdWVzdCBhbmQgdGltZWQgb3V0LiAgaWYgd2UgbmV2ZXIgc2VudCBhCisJICogcmVxdWVzdCBvciBpZiB3ZSBzZW50IGEgcmVxdWVzdCBhbmQgZ290IGEgcmVzcG9uc2UsIHdlIHdhbnQgdG8KKwkgKiBjbGVhciB0aGUgbWFnaWMgb3V0IG9mIHBhcmFub2lhLiAgaWYgd2UgdGltZWQgb3V0IHRoZXJlIGlzIGEKKwkgKiByYWNlIGNvbmRpdGlvbiBzdWNoIHRoYXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGNvdWxkIGJlCisJICogZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUgd2UgYXJlLiBvZiBwcmltYXJ5IGNvbmNlcm4gaXMgaWYgdGhlCisJICogY2FsbGJhY2sgZnVuY3Rpb24gaGFkIGFscmVhZHkgdmVyaWZpZWQgdGhlICJtYWdpYyIgYnV0IGhhZCBub3QKKwkgKiB5ZXQgc2V0IHRoZSBjb21wbGV0aW9uIHZhcmlhYmxlIHdoZW4gYSB0aW1lb3V0IG9jY3VycmVkLiB3ZQorCSAqIHNlcmlhbGl6ZSB0aGVzZSBhY3Rpdml0aWVzIGJ5IGludmFsaWRhdGluZyB0aGUgbWFnaWMgd2hpbGUKKwkgKiBob2xkaW5nIGEgc2hhcmVkIHNwaW5sb2NrIHdoaWNoIHdpbGwgY2F1c2UgdXMgdG8gYmxvY2sgaWYgdGhlCisJICogY2FsbGJhY2sgaXMgY3VycmVudGx5IGV4ZWN1dGluZworCSAqLworCXNwaW5fbG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJY29udGV4dC5tYWdpYyA9IDA7CisJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSB2c3RhdHVzKSB7CisJCXRzbV9tZXRyaWNzLT5VcGxpbmtQa3RRdWV1ZURseSA9CisJCQlhZGFwdGVyLT50c21TdGF0cy5VcGxpbmtQa3RRdWV1ZURseTsKKwkJY2RmX21lbV9jb3B5KHRzbV9tZXRyaWNzLT5VcGxpbmtQa3RRdWV1ZURseUhpc3QsCisJCQkgICAgIGFkYXB0ZXItPnRzbVN0YXRzLlVwbGlua1BrdFF1ZXVlRGx5SGlzdCwKKwkJCSAgICAgc2l6ZW9mKGFkYXB0ZXItPnRzbVN0YXRzLlVwbGlua1BrdFF1ZXVlRGx5SGlzdCkgLworCQkJICAgICBzaXplb2YoYWRhcHRlci0+dHNtU3RhdHMuCisJCQkJICAgIFVwbGlua1BrdFF1ZXVlRGx5SGlzdFswXSkpOworCQl0c21fbWV0cmljcy0+VXBsaW5rUGt0VHhEbHkgPSBhZGFwdGVyLT50c21TdGF0cy5VcGxpbmtQa3RUeERseTsKKwkJdHNtX21ldHJpY3MtPlVwbGlua1BrdExvc3MgPSBhZGFwdGVyLT50c21TdGF0cy5VcGxpbmtQa3RMb3NzOworCQl0c21fbWV0cmljcy0+VXBsaW5rUGt0Q291bnQgPSBhZGFwdGVyLT50c21TdGF0cy5VcGxpbmtQa3RDb3VudDsKKwkJdHNtX21ldHJpY3MtPlJvYW1pbmdDb3VudCA9IGFkYXB0ZXItPnRzbVN0YXRzLlJvYW1pbmdDb3VudDsKKwkJdHNtX21ldHJpY3MtPlJvYW1pbmdEbHkgPSBhZGFwdGVyLT50c21TdGF0cy5Sb2FtaW5nRGx5OworCX0KKwlyZXR1cm4gdnN0YXR1czsKK30KKyNlbmRpZiAvKkZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorc3RhdGljIHZvaWQgaGRkX2dldF9iYW5kX2hlbHBlcihoZGRfY29udGV4dF90ICpoZGRfY3R4LCBpbnQgKnBCYW5kKQoreworCWVDc3JCYW5kIGJhbmQgPSAtMTsKKwlzbWVfZ2V0X2ZyZXFfYmFuZCgodEhhbEhhbmRsZSkgKGhkZF9jdHgtPmhIYWwpLCAmYmFuZCk7CisJc3dpdGNoIChiYW5kKSB7CisJY2FzZSBlQ1NSX0JBTkRfQUxMOgorCQkqcEJhbmQgPSBXTEFOX0hERF9VSV9CQU5EX0FVVE87CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0JBTkRfMjQ6CisJCSpwQmFuZCA9IFdMQU5fSEREX1VJX0JBTkRfMl80X0dIWjsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfQkFORF81RzoKKwkJKnBCYW5kID0gV0xBTl9IRERfVUlfQkFORF81X0dIWjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sICIlczogSW52YWxpZCBCYW5kICVkIiwgX19mdW5jX18sCisJCSAgICAgICBiYW5kKTsKKwkJKnBCYW5kID0gLTE7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBfaGRkX3BhcnNlX2Jzc2lkX2FuZF9jaGFuKCkgLSBoZWxwZXIgZnVuY3Rpb24gdG8gcGFyc2UgYnNzaWQgYW5kIGNoYW5uZWwKKyAqIEBkYXRhOiAgICAgICAgICAgIGlucHV0IGRhdGEKKyAqIEB0YXJnZXRfYXBfYnNzaWQ6IHBvaW50ZXIgdG8gYnNzaWQgKG91dHB1dCBwYXJhbWV0ZXIpCisgKiBAY2hhbm5lbDogICAgICAgICBwb2ludGVyIHRvIGNoYW5uZWwgKG91dHB1dCBwYXJhbWV0ZXIpCisgKgorICogUmV0dXJuOiAwIGlmIHBhcnNpbmcgaXMgc3VjY2Vzc2Z1bDsgLUVJTlZBTCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBfaGRkX3BhcnNlX2Jzc2lkX2FuZF9jaGFuKGNvbnN0IHVpbnQ4X3QgKipkYXRhLAorCQkJCSAgICAgdWludDhfdCAqYnNzaWQsCisJCQkJICAgICB1aW50OF90ICpjaGFubmVsKQoreworCWNvbnN0IHVpbnQ4X3QgKmluX3B0cjsKKwlpbnQgICAgICAgICAgICB2ID0gMDsKKwlpbnQgICAgICAgICAgICB0ZW1wX2ludDsKKwl1aW50OF90ICAgICAgICB0ZW1wX2J1ZlszMl07CisKKwkvKiAxMiBoZXhhIGRlY2ltYWwgZGlnaXRzLCA1ICc6JyBhbmQgJ1wwJyAqLworCXVpbnQ4X3QgICAgICAgIG1hY19hZGRyWzE4XTsKKworCWlmICghZGF0YSB8fCAhKmRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5fcHRyID0gKmRhdGE7CisKKwlpbl9wdHIgPSBzdHJuY2hyKGluX3B0ciwgc3RybGVuKGluX3B0ciksIFNQQUNFX0FTQ0lJX1ZBTFVFKTsKKwkvKiBubyBhcmd1bWVudCBhZnRlciB0aGUgY29tbWFuZCAqLworCWlmIChOVUxMID09IGluX3B0cikKKwkJZ290byBlcnJvcjsKKwkvKiBubyBzcGFjZSBhZnRlciB0aGUgY29tbWFuZCAqLworCWVsc2UgaWYgKFNQQUNFX0FTQ0lJX1ZBTFVFICE9ICppbl9wdHIpCisJCWdvdG8gZXJyb3I7CisKKwkvKiByZW1vdmUgZW1wdHkgc3BhY2VzICovCisJd2hpbGUgKChTUEFDRV9BU0NJSV9WQUxVRSA9PSAqaW5fcHRyKSAmJiAoJ1wwJyAhPSAqaW5fcHRyKSkKKwkJaW5fcHRyKys7CisKKwkvKiBubyBhcmd1bWVudCBmb2xsb3dlZCBieSBzcGFjZXMgKi8KKwlpZiAoJ1wwJyA9PSAqaW5fcHRyKQorCQlnb3RvIGVycm9yOworCisJdiA9IHNzY2FuZihpbl9wdHIsICIlMTdzIiwgbWFjX2FkZHIpOworCWlmICghKCgxID09IHYpICYmIGhkZF9pc192YWxpZF9tYWNfYWRkcmVzcyhtYWNfYWRkcikpKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoCisJCQkgICAiSW52YWxpZCBNQUMgYWRkcmVzcyBvciBBbGwgaGV4IGlucHV0cyBhcmUgbm90IHJlYWQgKCVkKSIKKwkJCSksCisJCQl2KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlic3NpZFswXSA9IGhleF90b19iaW4obWFjX2FkZHJbMF0pIDw8IDQgfAorCQkJaGV4X3RvX2JpbihtYWNfYWRkclsxXSk7CisJYnNzaWRbMV0gPSBoZXhfdG9fYmluKG1hY19hZGRyWzNdKSA8PCA0IHwKKwkJCWhleF90b19iaW4obWFjX2FkZHJbNF0pOworCWJzc2lkWzJdID0gaGV4X3RvX2JpbihtYWNfYWRkcls2XSkgPDwgNCB8CisJCQloZXhfdG9fYmluKG1hY19hZGRyWzddKTsKKwlic3NpZFszXSA9IGhleF90b19iaW4obWFjX2FkZHJbOV0pIDw8IDQgfAorCQkJaGV4X3RvX2JpbihtYWNfYWRkclsxMF0pOworCWJzc2lkWzRdID0gaGV4X3RvX2JpbihtYWNfYWRkclsxMl0pIDw8IDQgfAorCQkJaGV4X3RvX2JpbihtYWNfYWRkclsxM10pOworCWJzc2lkWzVdID0gaGV4X3RvX2JpbihtYWNfYWRkclsxNV0pIDw8IDQgfAorCQkJaGV4X3RvX2JpbihtYWNfYWRkclsxNl0pOworCisJLyogcG9pbnQgdG8gdGhlIG5leHQgYXJndW1lbnQgKi8KKwlpbl9wdHIgPSBzdHJuY2hyKGluX3B0ciwgc3RybGVuKGluX3B0ciksIFNQQUNFX0FTQ0lJX1ZBTFVFKTsKKwkvKiBubyBhcmd1bWVudCBhZnRlciB0aGUgY29tbWFuZCAqLworCWlmIChOVUxMID09IGluX3B0cikKKwkJZ290byBlcnJvcjsKKworCS8qIHJlbW92ZSBlbXB0eSBzcGFjZXMgKi8KKwl3aGlsZSAoKFNQQUNFX0FTQ0lJX1ZBTFVFID09ICppbl9wdHIpICYmICgnXDAnICE9ICppbl9wdHIpKQorCQlpbl9wdHIrKzsKKworCS8qIG5vIGFyZ3VtZW50IGZvbGxvd2VkIGJ5IHNwYWNlcyAqLworCWlmICgnXDAnID09ICppbl9wdHIpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBnZXQgdGhlIG5leHQgYXJndW1lbnQgaWUgdGhlIGNoYW5uZWwgbnVtYmVyICovCisJdiA9IHNzY2FuZihpbl9wdHIsICIlMzFzICIsIHRlbXBfYnVmKTsKKwlpZiAoMSAhPSB2KQorCQlnb3RvIGVycm9yOworCisJdiA9IGtzdHJ0b3MzMih0ZW1wX2J1ZiwgMTAsICZ0ZW1wX2ludCk7CisJaWYgKCh2IDwgMCkgfHwgKHRlbXBfaW50IDwgMCkgfHwKKwkgICAgKHRlbXBfaW50ID4gV05JX0NGR19DVVJSRU5UX0NIQU5ORUxfU1RBTUFYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqY2hhbm5lbCA9IHRlbXBfaW50OworCSpkYXRhID0gaW5fcHRyOworCXJldHVybiAwOworZXJyb3I6CisJKmRhdGEgPSBpbl9wdHI7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogaGRkX3BhcnNlX3NlbmRfYWN0aW9uX2ZyYW1lX2RhdGEoKSAtIEhERCBQYXJzZSBzZW5kIGFjdGlvbiBmcmFtZSBkYXRhCisgKiBAcFZhbHVlOiAgICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICogQHBUYXJnZXRBcEJzc2lkOiBQb2ludGVyIHRvIHRhcmdldCBBcCBic3NpZAorICogQHBDaGFubmVsOiAgICAgICBQb2ludGVyIHRvIHRoZSBUYXJnZXQgQVAgY2hhbm5lbAorICogQHBEd2VsbFRpbWU6ICAgICBQb2ludGVyIHRvIHRoZSB0aW1lIHRvIHN0YXkgb2ZmLWNoYW5uZWwKKyAqICAgICAgICAgICAgICAgICAgYWZ0ZXIgdHJhbnNtaXR0aW5nIGFjdGlvbiBmcmFtZQorICogQHBCdWY6ICAgICAgICAgICBQb2ludGVyIHRvIGRhdGEKKyAqIEBwQnVmTGVuOiAgICAgICAgUG9pbnRlciB0byBkYXRhIGxlbmd0aAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBzZW5kIGFjdGlvbiBmcmFtZSBkYXRhIHBhc3NlZCBpbiB0aGUgZm9ybWF0CisgKiBTRU5EQUNUSU9ORlJBTUU8c3BhY2U+PGJzc2lkPjxzcGFjZT48Y2hhbm5lbD48c3BhY2U+PGR3ZWxsdGltZT48c3BhY2U+PGRhdGE+CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK2hkZF9wYXJzZV9zZW5kX2FjdGlvbl9mcmFtZV92MV9kYXRhKGNvbnN0IHVpbnQ4X3QgKnBWYWx1ZSwKKwkJCQkgICAgdWludDhfdCAqcFRhcmdldEFwQnNzaWQsCisJCQkJICAgIHVpbnQ4X3QgKnBDaGFubmVsLCB1aW50OF90ICpwRHdlbGxUaW1lLAorCQkJCSAgICB1aW50OF90ICoqcEJ1ZiwgdWludDhfdCAqcEJ1ZkxlbikKK3sKKwljb25zdCB1aW50OF90ICppblB0ciA9IHBWYWx1ZTsKKwljb25zdCB1aW50OF90ICpkYXRhRW5kOworCWludCB0ZW1wSW50OworCWludCBqID0gMDsKKwlpbnQgaSA9IDA7CisJaW50IHYgPSAwOworCXVpbnQ4X3QgdGVtcEJ1ZlszMl07CisJdWludDhfdCB0ZW1wQnl0ZSA9IDA7CisKKwlpZiAoX2hkZF9wYXJzZV9ic3NpZF9hbmRfY2hhbigmaW5QdHIsIHBUYXJnZXRBcEJzc2lkLCBwQ2hhbm5lbCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogcG9pbnQgdG8gdGhlIG5leHQgYXJndW1lbnQgKi8KKwlpblB0ciA9IHN0cm5jaHIoaW5QdHIsIHN0cmxlbihpblB0ciksIFNQQUNFX0FTQ0lJX1ZBTFVFKTsKKwkvKiBubyBhcmd1bWVudCBhZnRlciB0aGUgY29tbWFuZCAqLworCWlmIChOVUxMID09IGluUHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiByZW1vdmluZyBlbXB0eSBzcGFjZXMgKi8KKwl3aGlsZSAoKFNQQUNFX0FTQ0lJX1ZBTFVFID09ICppblB0cikgJiYgKCdcMCcgIT0gKmluUHRyKSkKKwkJaW5QdHIrKzsKKworCS8qIG5vIGFyZ3VtZW50IGZvbGxvd2VkIGJ5IHNwYWNlcyAqLworCWlmICgnXDAnID09ICppblB0cikgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBnZXR0aW5nIHRoZSBuZXh0IGFyZ3VtZW50IGllIHRoZSBkd2VsbCB0aW1lICovCisJdiA9IHNzY2FuZihpblB0ciwgIiUzMXMgIiwgdGVtcEJ1Zik7CisJaWYgKDEgIT0gdikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2ID0ga3N0cnRvczMyKHRlbXBCdWYsIDEwLCAmdGVtcEludCk7CisJaWYgKHYgPCAwIHx8IHRlbXBJbnQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpwRHdlbGxUaW1lID0gdGVtcEludDsKKworCS8qIHBvaW50IHRvIHRoZSBuZXh0IGFyZ3VtZW50ICovCisJaW5QdHIgPSBzdHJuY2hyKGluUHRyLCBzdHJsZW4oaW5QdHIpLCBTUEFDRV9BU0NJSV9WQUxVRSk7CisJLyogbm8gYXJndW1lbnQgYWZ0ZXIgdGhlIGNvbW1hbmQgKi8KKwlpZiAoTlVMTCA9PSBpblB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogcmVtb3ZpbmcgZW1wdHkgc3BhY2VzICovCisJd2hpbGUgKChTUEFDRV9BU0NJSV9WQUxVRSA9PSAqaW5QdHIpICYmICgnXDAnICE9ICppblB0cikpCisJCWluUHRyKys7CisKKwkvKiBubyBhcmd1bWVudCBmb2xsb3dlZCBieSBzcGFjZXMgKi8KKwlpZiAoJ1wwJyA9PSAqaW5QdHIpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZmluZCB0aGUgbGVuZ3RoIG9mIGRhdGEgKi8KKwlkYXRhRW5kID0gaW5QdHI7CisJd2hpbGUgKCgnXDAnICE9ICpkYXRhRW5kKSkgeworCQlkYXRhRW5kKys7CisJfQorCSpwQnVmTGVuID0gZGF0YUVuZCAtIGluUHRyOworCWlmICgqcEJ1ZkxlbiA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIG51bWJlciBvZiBieXRlcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGlucHV0IGNoYXJhY3RlcnMKKwkgKiB3aGV0aGVyIGl0IGlzIGV2ZW4gb3Igb2RkLgorCSAqIGlmIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhcmFjdGVycyBhcmUgZXZlbiwgdGhlbiB3ZSBuZWVkIE4vMiBieXRlLgorCSAqIGlmIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhcmFjdGVycyBhcmUgb2RkLCB0aGVuIHdlIG5lZWQgZG8gKE4rMSkvMgorCSAqIHRvIGNvbXBlbnNhdGUgcm91bmRpbmcgb2ZmLgorCSAqIEZvciBleGFtcGxlLCBpZiBOID0gMTgsIHRoZW4gKDE4ICsgMSkvMiA9IDkgYnl0ZXMgYXJlIGVub3VnaC4KKwkgKiBJZiBOID0gMTksIHRoZW4gd2UgbmVlZCAxMCBieXRlcywgaGVuY2UgKDE5ICsgMSkvMiA9IDEwIGJ5dGVzCisJICovCisJKnBCdWYgPSBjZGZfbWVtX21hbGxvYygoKnBCdWZMZW4gKyAxKSAvIDIpOworCWlmIChOVUxMID09ICpwQnVmKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2RmX21lbV9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHRoZSBidWZmZXIgcmVjZWl2ZWQgZnJvbSB0aGUgdXBwZXIgbGF5ZXIgaXMgY2hhcmFjdGVyIGJ1ZmZlciwKKwkgKiB3ZSBuZWVkIHRvIHByZXBhcmUgdGhlIGJ1ZmZlciB0YWtpbmcgMiBjaGFyYWN0ZXJzIGluIHRvIGEgVTggaGV4CisJICogZGVjaW1hbCBudW1iZXIgZm9yIGV4YW1wbGUgN2YwMDAwZjAuLi5mb3JtIGEgYnVmZmVyIHRvIGNvbnRhaW4gN2YKKwkgKiBpbiAwdGggbG9jYXRpb24sIDAwIGluIDFzdCBhbmQgZjAgaW4gM3JkIGxvY2F0aW9uCisJICovCisJZm9yIChpID0gMCwgaiA9IDA7IGogPCAqcEJ1ZkxlbjsgaiArPSAyKSB7CisJCWlmIChqICsgMSA9PSAqcEJ1ZkxlbikgeworCQkJdGVtcEJ5dGUgPSBoZXhfdG9fYmluKGluUHRyW2pdKTsKKwkJfSBlbHNlIHsKKwkJCXRlbXBCeXRlID0KKwkJCQkoaGV4X3RvX2JpbihpblB0cltqXSkgPDwgNCkgfAorCQkJCShoZXhfdG9fYmluKGluUHRyW2ogKyAxXSkpOworCQl9CisJCSgqcEJ1ZilbaSsrXSA9IHRlbXBCeXRlOworCX0KKwkqcEJ1ZkxlbiA9IGk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX3BhcnNlX3JlYXNzb2NfY29tbWFuZF9kYXRhKCkgLSBIREQgUGFyc2UgcmVhc3NvYyBjb21tYW5kIGRhdGEKKyAqIEBwVmFsdWU6ICAgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhIChpdHMgYSBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nKQorICogQHBUYXJnZXRBcEJzc2lkOiBQb2ludGVyIHRvIHRhcmdldCBBcCBic3NpZAorICogQHBDaGFubmVsOiAgICAgICBQb2ludGVyIHRvIHRoZSBUYXJnZXQgQVAgY2hhbm5lbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZWFzb2MgY29tbWFuZCBkYXRhIHBhc3NlZCBpbiB0aGUgZm9ybWF0CisgKiBSRUFTU09DPHNwYWNlPjxic3NpZD48c3BhY2U+PGNoYW5uZWw+CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgaGRkX3BhcnNlX3JlYXNzb2NfY29tbWFuZF92MV9kYXRhKGNvbnN0IHVpbnQ4X3QgKnBWYWx1ZSwKKwkJCQkJICAgICB1aW50OF90ICpwVGFyZ2V0QXBCc3NpZCwKKwkJCQkJICAgICB1aW50OF90ICpwQ2hhbm5lbCkKK3sKKwljb25zdCB1aW50OF90ICppblB0ciA9IHBWYWx1ZTsKKworCWlmIChfaGRkX3BhcnNlX2Jzc2lkX2FuZF9jaGFuKCZpblB0ciwgcFRhcmdldEFwQnNzaWQsIHBDaGFubmVsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSIHx8IEZFQVRVUkVfV0xBTl9FU0UgfHwgRkVBVFVSRV9XTEFOX0VTRSBGRUFUVVJFX1dMQU5fTEZSICovCisKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKy8qKgorICogaGRkX3JlYXNzb2MoKSAtIHBlcmZvcm0gYSB1c2Vyc3BhY2UtZGlyZWN0ZWQgcmVhc3NvYworICogQGFkYXB0ZXI6CUFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgY29tbWFuZCB3YXMgcmVjZWl2ZWQKKyAqIEBic3NpZDoJQlNTSUQgd2l0aCB3aGljaCB0byByZWFzc29jaWF0ZQorICogQGNoYW5uZWw6CWNoYW5uZWwgdXBvbiB3aGljaCB0byByZWFzc29jaWF0ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSB1c2Vyc3BhY2UtZGlyZWN0ZWQgcmVhc3NvYyBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludAoraGRkX3JlYXNzb2MoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgY29uc3QgdWludDhfdCAqYnNzaWQsCisJICAgIGNvbnN0IHVpbnQ4X3QgY2hhbm5lbCkKK3sKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OICE9IGFkYXB0ZXItPmRldmljZV9tb2RlKSB7CisJCWhkZF93YXJuKCJVbnN1cHBvcnRlZCBpbiBtb2RlICVzKCVkKSIsCisJCQkgaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhhZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQkgYWRhcHRlci0+ZGV2aWNlX21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKTsKKworCS8qIGlmIG5vdCBhc3NvY2lhdGVkLCBubyBuZWVkIHRvIHByb2NlZWQgd2l0aCByZWFzc29jICovCisJaWYgKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCAhPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBOb3QgYXNzb2NpYXRlZCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCS8qCisJICogaWYgdGhlIHRhcmdldCBic3NpZCBpcyBzYW1lIGFzIGN1cnJlbnRseSBhc3NvY2lhdGVkIEFQLAorCSAqIHRoZW4gbm8gbmVlZCB0byBwcm9jZWVkIHdpdGggcmVhc3NvYworCSAqLworCWlmICghbWVtY21wKGJzc2lkLCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQuYnl0ZXMsCisJCQlDREZfTUFDX0FERFJfU0laRSkpIHsKKwkJaGRkTG9nKExPRzEsCisJCSAgICAgICBGTCgiUmVhc3NvYyBCU1NJRCBpcyBzYW1lIGFzIGN1cnJlbnRseSBhc3NvY2lhdGVkIEFQIGJzc2lkIikpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogQ2hlY2sgY2hhbm5lbCBudW1iZXIgaXMgYSB2YWxpZCBjaGFubmVsIG51bWJlciAqLworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkgICAgd2xhbl9oZGRfdmFsaWRhdGVfb3BlcmF0aW9uX2NoYW5uZWwoYWRhcHRlciwgY2hhbm5lbCkpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBJbnZhbGlkIENoYW5uZWwgJWQiLAorCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWwpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogUHJvY2VlZCB3aXRoIHJlYXNzb2MgKi8KKwl7CisJCXRDc3JIYW5kb2ZmUmVxdWVzdCBoYW5kb2ZmSW5mbzsKKwkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisKKwkJaGFuZG9mZkluZm8uY2hhbm5lbCA9IGNoYW5uZWw7CisJCWhhbmRvZmZJbmZvLnNyYyA9IFJFQVNTT0M7CisJCWNkZl9tZW1fY29weShoYW5kb2ZmSW5mby5ic3NpZC5ieXRlcywgYnNzaWQsIENERl9NQUNfQUREUl9TSVpFKTsKKwkJc21lX2hhbmRvZmZfcmVxdWVzdChoZGRfY3R4LT5oSGFsLCBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJICAgICZoYW5kb2ZmSW5mbyk7CisJfQorZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9wYXJzZV9yZWFzc29jX3YxKCkgLSBwYXJzZSB2ZXJzaW9uIDEgb2YgdGhlIFJFQVNTT0MgY29tbWFuZAorICogQGFkYXB0ZXI6CUFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgY29tbWFuZCB3YXMgcmVjZWl2ZWQKKyAqIEBjb21tYW5kOglBU0NJSSB0ZXh0IGNvbW1hbmQgdGhhdCB3YXMgcmVjZWl2ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgdjEgUkVBU1NPQyBjb21tYW5kIHdpdGggdGhlIGZvcm1hdAorICoKKyAqICAgIFJFQVNTT0MgeHg6eHg6eHg6eHg6eHg6eHggQ0gKKyAqCisgKiBXaGVyZSAieHg6eHg6eHg6eHg6eHg6eHgiIGlzIHRoZSBIZXgtQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgKiBCU1NJRCBhbmQgQ0ggaXMgdGhlIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjaGFubmVsLiAgRm9yCisgKiBleGFtcGxlCisgKgorICogICAgUkVBU1NPQyAwMDowYTowYjoxMToyMjozMyA0OAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IGhkZF9wYXJzZV9yZWFzc29jX3YxKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIGNvbnN0IGNoYXIgKmNvbW1hbmQpCit7CisJdWludDhfdCBjaGFubmVsID0gMDsKKwl0U2lyTWFjQWRkciBic3NpZDsKKwlpbnQgcmV0OworCisJcmV0ID0gaGRkX3BhcnNlX3JlYXNzb2NfY29tbWFuZF92MV9kYXRhKGNvbW1hbmQsIGJzc2lkLCAmY2hhbm5lbCk7CisJaWYgKHJldCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBGYWlsZWQgdG8gcGFyc2UgcmVhc3NvYyBjb21tYW5kIGRhdGEiLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJcmV0ID0gaGRkX3JlYXNzb2MoYWRhcHRlciwgYnNzaWQsIGNoYW5uZWwpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9wYXJzZV9yZWFzc29jX3YyKCkgLSBwYXJzZSB2ZXJzaW9uIDIgb2YgdGhlIFJFQVNTT0MgY29tbWFuZAorICogQGFkYXB0ZXI6CUFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgY29tbWFuZCB3YXMgcmVjZWl2ZWQKKyAqIEBjb21tYW5kOglDb21tYW5kIHRoYXQgd2FzIHJlY2VpdmVkLCBBU0NJSSBjb21tYW5kCisgKiAgICAgIAkgICAgIGZvbGxvd2VkIGJ5IGJpbmFyeSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIHYyIFJFQVNTT0MgY29tbWFuZCB3aXRoIHRoZSBmb3JtYXQKKyAqCisgKiAgICBSRUFTU09DIDxhbmRyb2lkX3dpZmlfcmVhc3NvY19wYXJhbXM+CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgaGRkX3BhcnNlX3JlYXNzb2NfdjIoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgY29uc3QgY2hhciAqY29tbWFuZCkKK3sKKwlzdHJ1Y3QgYW5kcm9pZF93aWZpX3JlYXNzb2NfcGFyYW1zIHBhcmFtczsKKwl0U2lyTWFjQWRkciBic3NpZDsKKwlpbnQgcmV0OworCisJLyogVGhlIHBhcmFtcyBhcmUgbG9jYXRlZCBhZnRlciAiUkVBU1NPQyAiICovCisJbWVtY3B5KCZwYXJhbXMsIGNvbW1hbmQgKyA4LCBzaXplb2YocGFyYW1zKSk7CisKKwlpZiAoIW1hY19wdG9uKHBhcmFtcy5ic3NpZCwgKHU4ICopICZic3NpZCkpIHsKKwkJaGRkTG9nKExPR0UsICIlczogTUFDIGFkZHJlc3MgcGFyc2luZyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcmV0ID0gaGRkX3JlYXNzb2MoYWRhcHRlciwgYnNzaWQsIHBhcmFtcy5jaGFubmVsKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBoZGRfcGFyc2VfcmVhc3NvYygpIC0gcGFyc2UgdGhlIFJFQVNTT0MgY29tbWFuZAorICogQGFkYXB0ZXI6CUFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgY29tbWFuZCB3YXMgcmVjZWl2ZWQKKyAqIEBjb21tYW5kOglDb21tYW5kIHRoYXQgd2FzIHJlY2VpdmVkCisgKgorICogVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIFJFQVNTT0MgY29tbWFuZC4gIFZlcnNpb24gMQorICogb2YgdGhlIGNvbW1hbmQgY29udGFpbnMgYSBwYXJhbWV0ZXIgbGlzdCB0aGF0IGlzIEFTQ0lJIGNoYXJhY3RlcnMKKyAqIHdoZXJlYXMgdmVyc2lvbiAyIGNvbnRhaW5zIGEgY29tYmluYXRpb24gb2YgQVNDSUkgYW5kIGJpbmFyeQorICogcGF5bG9hZC4gIERldGVybWluZSBpZiBhIHZlcnNpb24gMSBvciBhIHZlcnNpb24gMiBjb21tYW5kIGlzIGJlaW5nCisgKiBwYXJzZWQgYnkgZXhhbWluaW5nIHRoZSBwYXJhbWV0ZXJzLCBhbmQgdGhlbiBkaXNwYXRjaCB0aGUgcGFyc2VyCisgKiB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY29tbWFuZC4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoZGRfcGFyc2VfcmVhc3NvYyhoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBjb25zdCBjaGFyICpjb21tYW5kKQoreworCWludCByZXQ7CisKKwkvKiBib3RoIHZlcnNpb25zIHN0YXJ0IHdpdGggIlJFQVNTT0MgIgorCSAqIHYxIGhhcyBhIGJzc2lkIGFuZCBjaGFubmVsICMgYXMgYW4gQVNDSUkgc3RyaW5nCisJICogICAgUkVBU1NPQyB4eDp4eDp4eDp4eDp4eDp4eCBDSAorCSAqIHYyIGhhcyBhIEMgc3RydWN0CisJICogICAgUkVBU1NPQyA8YmluYXJ5IGMgc3RydWN0PgorCSAqCisJICogVGhlIGZpcnN0IGZpZWxkIGluIHRoZSB2MiBzdHJ1Y3QgaXMgYWxzbyB0aGUgYnNzaWQgaW4gQVNDSUkuCisJICogQnV0IGluIHRoZSBjYXNlIG9mIGEgdjIgbWVzc2FnZSB0aGUgQlNTSUQgaXMgTlVMLXRlcm1pbmF0ZWQuCisJICogSGVuY2Ugd2UgY2FuIHBlZWsgYXQgdGhhdCBvZmZzZXQgdG8gc2VlIGlmIHRoaXMgaXMgVjEgb3IgVjIKKwkgKiBSRUFTU09DIHh4Onh4Onh4Onh4Onh4Onh4KgorCSAqICAgICAgICAgICAxMTExMTExMTExMjIyMjIyCisJICogMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUKKwkgKi8KKwlpZiAoY29tbWFuZFsyNV0pIHsKKwkJcmV0ID0gaGRkX3BhcnNlX3JlYXNzb2NfdjEoYWRhcHRlciwgY29tbWFuZCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gaGRkX3BhcnNlX3JlYXNzb2NfdjIoYWRhcHRlciwgY29tbWFuZCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSIHx8IEZFQVRVUkVfV0xBTl9FU0UgfHwgRkVBVFVSRV9XTEFOX0VTRSBGRUFUVVJFX1dMQU5fTEZSICovCisKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKy8qKgorICogaGRkX3NlbmRhY3Rpb25mcmFtZSgpIC0gc2VuZCBhIHVzZXJzcGFjZS1zdXBwbGllZCBhY3Rpb24gZnJhbWUKKyAqIEBhZGFwdGVyOglBZGFwdGVyIHVwb24gd2hpY2ggdGhlIGNvbW1hbmQgd2FzIHJlY2VpdmVkCisgKiBAYnNzaWQ6CUJTU0lEIHRhcmdldCBvZiB0aGUgYWN0aW9uIGZyYW1lCisgKiBAY2hhbm5lbDoJQ2hhbm5lbCB1cG9uIHdoaWNoIHRvIHNlbmQgdGhlIGZyYW1lCisgKiBAZHdlbGxfdGltZToJQW1vdW50IG9mIHRpbWUgdG8gZHdlbGwgd2hlbiB0aGUgZnJhbWUgaXMgc2VudAorICogQHBheWxvYWRfbGVuOkxlbmd0aCBvZiB0aGUgcGF5bG9hZAorICogQHBheWxvYWQ6CVBheWxvYWQgb2YgdGhlIGZyYW1lCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHVzZXJzcGFjZS1zdXBwbGllZCBhY3Rpb24gZnJhbWUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludAoraGRkX3NlbmRhY3Rpb25mcmFtZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBjb25zdCB1aW50OF90ICpic3NpZCwKKwkJICAgIGNvbnN0IHVpbnQ4X3QgY2hhbm5lbCwgY29uc3QgdWludDhfdCBkd2VsbF90aW1lLAorCQkgICAgY29uc3QgdWludDhfdCBwYXlsb2FkX2xlbiwgY29uc3QgdWludDhfdCAqcGF5bG9hZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgY2hhbjsKKwl1aW50OF90IGZyYW1lX2xlbjsKKwl1aW50OF90ICpmcmFtZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyOworCXU2NCBjb29raWU7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHg7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0ID0gMDsKKwl0cFNpck1hY1ZlbmRvclNwZWNpZmljRnJhbWVIZHIgcFZlbmRvclNwZWNpZmljID0KKwkJKHRwU2lyTWFjVmVuZG9yU3BlY2lmaWNGcmFtZUhkcikgcGF5bG9hZDsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE0LCAwKSkKKwlzdHJ1Y3QgY2ZnODAyMTFfbWdtdF90eF9wYXJhbXMgcGFyYW1zOworI2VuZGlmCisKKwlpZiAoV0xBTl9IRERfSU5GUkFfU1RBVElPTiAhPSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQloZGRfd2FybigiVW5zdXBwb3J0ZWQgaW4gbW9kZSAlcyglZCkiLAorCQkJIGhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcoYWRhcHRlci0+ZGV2aWNlX21vZGUpLAorCQkJIGFkYXB0ZXItPmRldmljZV9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIoYWRhcHRlcik7CisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisKKwkvKiBpZiBub3QgYXNzb2NpYXRlZCwgbm8gbmVlZCB0byBzZW5kIGFjdGlvbiBmcmFtZSAqLworCWlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgIT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogTm90IGFzc29jaWF0ZWQiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKgorCSAqIGlmIHRoZSB0YXJnZXQgYnNzaWQgaXMgZGlmZmVyZW50IGZyb20gY3VycmVudGx5IGFzc29jaWF0ZWQgQVAsCisJICogdGhlbiBubyBuZWVkIHRvIHNlbmQgYWN0aW9uIGZyYW1lCisJICovCisJaWYgKG1lbWNtcChic3NpZCwgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLmJ5dGVzLAorCQkJQ0RGX01BQ19BRERSX1NJWkUpKSB7CisJCWhkZExvZyhMT0cxLCBGTCgiU1RBIGlzIG5vdCBhc3NvY2lhdGVkIHRvIHRoaXMgQVAiKSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwljaGFuLmNlbnRlcl9mcmVxID0gc21lX2Nobl90b19mcmVxKGNoYW5uZWwpOworCS8qIENoZWNrIGlmIGl0IGlzIHNwZWNpZmljIGFjdGlvbiBmcmFtZSAqLworCWlmIChwVmVuZG9yU3BlY2lmaWMtPmNhdGVnb3J5ID09CisJICAgIFNJUl9NQUNfQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQ19DQVRFR09SWSkgeworCQlzdGF0aWMgY29uc3QgdWludDhfdCBPdWlbXSA9IHsgMHgwMCwgMHgwMCwgMHhmMCB9OworCQlpZiAoY2RmX21lbV9jb21wYXJlKHBWZW5kb3JTcGVjaWZpYy0+T3VpLCAodm9pZCAqKU91aSwgMykpIHsKKwkJCS8qCisJCQkgKiBpZiB0aGUgY2hhbm5lbCBudW1iZXIgaXMgZGlmZmVyZW50IGZyb20gb3BlcmF0aW5nCisJCQkgKiBjaGFubmVsIHRoZW4gbm8gbmVlZCB0byBzZW5kIGFjdGlvbiBmcmFtZQorCQkJICovCisJCQlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCQkJaWYgKGNoYW5uZWwgIT0KKwkJCQkgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWwpIHsKKwkJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICAgICAgIiVzOiBjaGFubmVsKCVkKSBpcyBkaWZmZXJlbnQgZnJvbSBvcGVyYXRpbmcgY2hhbm5lbCglZCkiLAorCQkJCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWwsCisJCQkJCSAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uCisJCQkJCSAgICAgICBvcGVyYXRpb25DaGFubmVsKTsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJZ290byBleGl0OworCQkJCX0KKwkJCQkvKgorCQkJCSAqIElmIGNoYW5uZWwgbnVtYmVyIGlzIHNwZWNpZmllZCBhbmQgc2FtZQorCQkJCSAqIGFzIGhvbWUgY2hhbm5lbCwgZW5zdXJlIHRoYXQgYWN0aW9uIGZyYW1lCisJCQkJICogaXMgc2VudCBpbW1lZGlhdGVseSBieSBjYW5jZWxsaW5nCisJCQkJICogcm9hbWluZyBzY2Fucy4gT3RoZXJ3aXNlIGxhcmdlIGR3ZWxsIHRpbWVzCisJCQkJICogbWF5IGNhdXNlIGxvbmcgZGVsYXlzIGluIHNlbmRpbmcgYWN0aW9uCisJCQkJICogZnJhbWVzLgorCQkJCSAqLworCQkJCXNtZV9hYm9ydF9yb2FtX3NjYW4oaGRkX2N0eC0+aEhhbCwKKwkJCQkJCSAgICBhZGFwdGVyLT5zZXNzaW9uSWQpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIDAgaXMgYWNjZXB0ZWQgYXMgY3VycmVudCBob21lIGNoYW5uZWwsCisJCQkJICogZGVsYXllZCB0cmFuc21pc3Npb24gb2YgYWN0aW9uIGZyYW1lIGlzIG9rLgorCQkJCSAqLworCQkJCWNoYW4uY2VudGVyX2ZyZXEgPQorCQkJCQlzbWVfY2huX3RvX2ZyZXEocEhkZFN0YUN0eC0+Y29ubl9pbmZvLgorCQkJCQkJCW9wZXJhdGlvbkNoYW5uZWwpOworCQkJfQorCQl9CisJfQorCWlmIChjaGFuLmNlbnRlcl9mcmVxID09IDApIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOmludmFsaWQgY2hhbm5lbCBudW1iZXIgJWQiLAorCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWwpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJZnJhbWVfbGVuID0gcGF5bG9hZF9sZW4gKyAyNDsKKwlmcmFtZSA9IGNkZl9tZW1fbWFsbG9jKGZyYW1lX2xlbik7CisJaWYgKCFmcmFtZSkgeworCQloZGRMb2coTE9HRSwgRkwoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwljZGZfbWVtX3plcm8oZnJhbWUsIGZyYW1lX2xlbik7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilmcmFtZTsKKwloZHItPmZyYW1lX2NvbnRyb2wgPQorCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOworCWNkZl9tZW1fY29weShoZHItPmFkZHIxLCBic3NpZCwgQ0RGX01BQ19BRERSX1NJWkUpOworCWNkZl9tZW1fY29weShoZHItPmFkZHIyLCBhZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcywKKwkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJY2RmX21lbV9jb3B5KGhkci0+YWRkcjMsIGJzc2lkLCBDREZfTUFDX0FERFJfU0laRSk7CisJY2RmX21lbV9jb3B5KGhkciArIDEsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTQsIDApKQorCXBhcmFtcy5jaGFuID0gJmNoYW47CisJcGFyYW1zLm9mZmNoYW4gPSAwOworCXBhcmFtcy53YWl0ID0gZHdlbGxfdGltZTsKKwlwYXJhbXMuYnVmID0gZnJhbWU7CisJcGFyYW1zLmxlbiA9IGZyYW1lX2xlbjsKKwlwYXJhbXMubm9fY2NrID0gMTsKKwlwYXJhbXMuZG9udF93YWl0X2Zvcl9hY2sgPSAxOworCXJldCA9IHdsYW5faGRkX21nbXRfdHgoTlVMTCwgJmFkYXB0ZXItPndkZXYsICZwYXJhbXMsICZjb29raWUpOworI2Vsc2UKKwlyZXQgPSB3bGFuX2hkZF9tZ210X3R4KE5VTEwsCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwkJCSAgICAgICAmKGFkYXB0ZXItPndkZXYpLAorI2Vsc2UKKwkJCSAgICAgICBhZGFwdGVyLT5kZXYsCisjZW5kaWYKKwkJCSAgICAgICAmY2hhbiwgMCwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkpCisJCQkgICAgICAgTkw4MDIxMV9DSEFOX0hUMjAsIDEsCisjZW5kaWYKKwkJCSAgICAgICBkd2VsbF90aW1lLCBmcmFtZSwgZnJhbWVfbGVuLCAxLCAxLCAmY29va2llKTsKKyNlbmRpZiAvKiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTQsIDApICovCisKKwljZGZfbWVtX2ZyZWUoZnJhbWUpOworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9wYXJzZV9zZW5kYWN0aW9uZnJhbWVfdjEoKSAtIHBhcnNlIHZlcnNpb24gMSBvZiB0aGUKKyAqICAgICAgIFNFTkRBQ1RJT05GUkFNRSBjb21tYW5kCisgKiBAYWRhcHRlcjoJQWRhcHRlciB1cG9uIHdoaWNoIHRoZSBjb21tYW5kIHdhcyByZWNlaXZlZAorICogQGNvbW1hbmQ6CUFTQ0lJIHRleHQgY29tbWFuZCB0aGF0IHdhcyByZWNlaXZlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSB2MSBTRU5EQUNUSU9ORlJBTUUgY29tbWFuZCB3aXRoIHRoZSBmb3JtYXQKKyAqCisgKiAgICBTRU5EQUNUSU9ORlJBTUUgeHg6eHg6eHg6eHg6eHg6eHggQ0ggRFcgeHh4eHh4CisgKgorICogV2hlcmUgInh4Onh4Onh4Onh4Onh4Onh4IiBpcyB0aGUgSGV4LUFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICogQlNTSUQsIENIIGlzIHRoZSBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hhbm5lbCwgRFcgaXMgdGhlCisgKiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZHdlbGwgdGltZSwgYW5kIHh4eHh4eCBpcyB0aGUgSGV4LUFTQ0lJCisgKiBwYXlsb2FkLiAgRm9yIGV4YW1wbGUKKyAqCisgKiAgICBTRU5EQUNUSU9ORlJBTUUgMDA6MGE6MGI6MTE6MjI6MzMgNDggNDAgYWFiYmNjZGRlZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50CitoZGRfcGFyc2Vfc2VuZGFjdGlvbmZyYW1lX3YxKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIGNvbnN0IGNoYXIgKmNvbW1hbmQpCit7CisJdWludDhfdCBjaGFubmVsID0gMDsKKwl1aW50OF90IGR3ZWxsX3RpbWUgPSAwOworCXVpbnQ4X3QgcGF5bG9hZF9sZW4gPSAwOworCXVpbnQ4X3QgKnBheWxvYWQgPSBOVUxMOworCXRTaXJNYWNBZGRyIGJzc2lkOworCWludCByZXQ7CisKKwlyZXQgPSBoZGRfcGFyc2Vfc2VuZF9hY3Rpb25fZnJhbWVfdjFfZGF0YShjb21tYW5kLCBic3NpZCwgJmNoYW5uZWwsCisJCQkJCQkgICZkd2VsbF90aW1lLCAmcGF5bG9hZCwKKwkJCQkJCSAgJnBheWxvYWRfbGVuKTsKKwlpZiAocmV0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IEZhaWxlZCB0byBwYXJzZSBzZW5kIGFjdGlvbiBmcmFtZSBkYXRhIiwgX19mdW5jX18pOworCX0gZWxzZSB7CisJCXJldCA9IGhkZF9zZW5kYWN0aW9uZnJhbWUoYWRhcHRlciwgYnNzaWQsIGNoYW5uZWwsCisJCQkJCSAgZHdlbGxfdGltZSwgcGF5bG9hZF9sZW4sIHBheWxvYWQpOworCQljZGZfbWVtX2ZyZWUocGF5bG9hZCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBoZGRfcGFyc2Vfc2VuZGFjdGlvbmZyYW1lX3YyKCkgLSBwYXJzZSB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgICAgICBTRU5EQUNUSU9ORlJBTUUgY29tbWFuZAorICogQGFkYXB0ZXI6CUFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgY29tbWFuZCB3YXMgcmVjZWl2ZWQKKyAqIEBjb21tYW5kOglDb21tYW5kIHRoYXQgd2FzIHJlY2VpdmVkLCBBU0NJSSBjb21tYW5kCisgKiAgICAgIAkgICAgIGZvbGxvd2VkIGJ5IGJpbmFyeSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIHYyIFNFTkRBQ1RJT05GUkFNRSBjb21tYW5kIHdpdGggdGhlIGZvcm1hdAorICoKKyAqICAgIFNFTkRBQ1RJT05GUkFNRSA8YW5kcm9pZF93aWZpX2FmX3BhcmFtcz4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludAoraGRkX3BhcnNlX3NlbmRhY3Rpb25mcmFtZV92MihoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBjb25zdCBjaGFyICpjb21tYW5kKQoreworCXN0cnVjdCBhbmRyb2lkX3dpZmlfYWZfcGFyYW1zICpwYXJhbXM7CisJdFNpck1hY0FkZHIgYnNzaWQ7CisJaW50IHJldDsKKworCS8qIHBhcmFtcyBhcmUgbGFyZ2Ugc28ga2VlcCBvZmYgdGhlIHN0YWNrICovCisJcGFyYW1zID0ga21hbGxvYyhzaXplb2YoKnBhcmFtcyksIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFRoZSBwYXJhbXMgYXJlIGxvY2F0ZWQgYWZ0ZXIgIlNFTkRBQ1RJT05GUkFNRSAiICovCisJbWVtY3B5KHBhcmFtcywgY29tbWFuZCArIDE2LCBzaXplb2YoKnBhcmFtcykpOworCisJaWYgKCFtYWNfcHRvbihwYXJhbXMtPmJzc2lkLCAodTggKikgJmJzc2lkKSkgeworCQloZGRMb2coTE9HRSwgIiVzOiBNQUMgYWRkcmVzcyBwYXJzaW5nIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlyZXQgPSBoZGRfc2VuZGFjdGlvbmZyYW1lKGFkYXB0ZXIsIGJzc2lkLCBwYXJhbXMtPmNoYW5uZWwsCisJCQkJCSAgcGFyYW1zLT5kd2VsbF90aW1lLCBwYXJhbXMtPmxlbiwKKwkJCQkJICBwYXJhbXMtPmRhdGEpOworCX0KKwlrZnJlZShwYXJhbXMpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGRkX3BhcnNlX3NlbmRhY3Rpb25mcmFtZSgpIC0gcGFyc2UgdGhlIFNFTkRBQ1RJT05GUkFNRSBjb21tYW5kCisgKiBAYWRhcHRlcjoJQWRhcHRlciB1cG9uIHdoaWNoIHRoZSBjb21tYW5kIHdhcyByZWNlaXZlZAorICogQGNvbW1hbmQ6CUNvbW1hbmQgdGhhdCB3YXMgcmVjZWl2ZWQKKyAqCisgKiBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgU0VOREFDVElPTkZSQU1FIGNvbW1hbmQuCisgKiBWZXJzaW9uIDEgb2YgdGhlIGNvbW1hbmQgY29udGFpbnMgYSBwYXJhbWV0ZXIgbGlzdCB0aGF0IGlzIEFTQ0lJCisgKiBjaGFyYWN0ZXJzIHdoZXJlYXMgdmVyc2lvbiAyIGNvbnRhaW5zIGEgY29tYmluYXRpb24gb2YgQVNDSUkgYW5kCisgKiBiaW5hcnkgcGF5bG9hZC4gIERldGVybWluZSBpZiBhIHZlcnNpb24gMSBvciBhIHZlcnNpb24gMiBjb21tYW5kIGlzCisgKiBiZWluZyBwYXJzZWQgYnkgZXhhbWluaW5nIHRoZSBwYXJhbWV0ZXJzLCBhbmQgdGhlbiBkaXNwYXRjaCB0aGUKKyAqIHBhcnNlciB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgY29tbWFuZC4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludAoraGRkX3BhcnNlX3NlbmRhY3Rpb25mcmFtZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBjb25zdCBjaGFyICpjb21tYW5kKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIGJvdGggdmVyc2lvbnMgc3RhcnQgd2l0aCAiU0VOREFDVElPTkZSQU1FICIKKwkgKiB2MSBoYXMgYSBic3NpZCBhbmQgb3RoZXIgcGFyYW1ldGVycyBhcyBhbiBBU0NJSSBzdHJpbmcKKwkgKiAgICBTRU5EQUNUSU9ORlJBTUUgeHg6eHg6eHg6eHg6eHg6eHggQ0ggRFdFTEwgTEVOIEZSQU1FCisJICogdjIgaGFzIGEgQyBzdHJ1Y3QKKwkgKiAgICBTRU5EQUNUSU9ORlJBTUUgPGJpbmFyeSBjIHN0cnVjdD4KKwkgKgorCSAqIFRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgdjIgc3RydWN0IGlzIGFsc28gdGhlIGJzc2lkIGluIEFTQ0lJLgorCSAqIEJ1dCBpbiB0aGUgY2FzZSBvZiBhIHYyIG1lc3NhZ2UgdGhlIEJTU0lEIGlzIE5VTC10ZXJtaW5hdGVkLgorCSAqIEhlbmNlIHdlIGNhbiBwZWVrIGF0IHRoYXQgb2Zmc2V0IHRvIHNlZSBpZiB0aGlzIGlzIFYxIG9yIFYyCisJICogU0VOREFDVElPTkZSQU1FIHh4Onh4Onh4Onh4Onh4Onh4KgorCSAqICAgICAgICAgICAxMTExMTExMTExMjIyMjIyMjIyMjMzMzMKKwkgKiAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzCisJICovCisJaWYgKGNvbW1hbmRbMzNdKSB7CisJCXJldCA9IGhkZF9wYXJzZV9zZW5kYWN0aW9uZnJhbWVfdjEoYWRhcHRlciwgY29tbWFuZCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gaGRkX3BhcnNlX3NlbmRhY3Rpb25mcmFtZV92MihhZGFwdGVyLCBjb21tYW5kKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgfHwgRkVBVFVSRV9XTEFOX0VTRSB8fCBGRUFUVVJFX1dMQU5fRVNFIEZFQVRVUkVfV0xBTl9MRlIgKi8KKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorLyoqCisgKiBoZGRfcGFyc2VfY2hhbm5lbGxpc3QoKSAtIEhERCBQYXJzZSBjaGFubmVsIGxpc3QKKyAqIEBwVmFsdWU6CQlQb2ludGVyIHRvIGlucHV0IGNoYW5uZWwgbGlzdAorICogQENoYW5uZWxMaXN0OglQb2ludGVyIHRvIGxvY2FsIG91dHB1dCBhcnJheSB0byByZWNvcmQKKyAqICAgICAgCSAgICAgICBjaGFubmVsIGxpc3QKKyAqIEBwTnVtQ2hhbm5lbHM6CVBvaW50ZXIgdG8gbnVtYmVyIG9mIHJvYW0gc2NhbiBjaGFubmVscworICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBjaGFubmVsIGxpc3QgcGFzc2VkIGluIHRoZSBmb3JtYXQKKyAqIFNFVFJPQU1TQ0FOQ0hBTk5FTFM8c3BhY2U+PE51bWJlciBvZiBjaGFubmVscz48c3BhY2U+Q2hhbm5lbCAxPHNwYWNlPkNoYW5uZWwgMjxzcGFjZT5DaGFubmVsIE4KKyAqIGlmIHRoZSBOdW1iZXIgb2YgY2hhbm5lbHMgKE4pIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIGFjdHVhbCBudW1iZXIKKyAqIG9mIGNoYW5uZWxzIHBhc3NlZCB0aGVuIHRha2UgdGhlIG1pbmltdW0gb2YgTiBhbmQgY291bnQgb2YKKyAqIChDaDEsIENoMiwgLi4uQ2ggTSkuIEZvciBleGFtcGxlLCBpZiBTRVRST0FNU0NBTkNIQU5ORUxTIDMgMzYgNDAgNDQgNDgsCisgKiBvbmx5IDM2LCA0MCBhbmQgNDQgc2hhbGwgYmUgdGFrZW4uIElmIFNFVFJPQU1TQ0FOQ0hBTk5FTFMgNSAzNiA0MCA0NCA0OCwKKyAqIGlnbm9yZSA1IGFuZCB0YWtlIDM2LCA0MCwgNDQgYW5kIDQ4LiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgY2FyZSBvZgorICogcmVtb3ZpbmcgZHVwbGljYXRlIGNoYW5uZWxzIGZyb20gdGhlIGxpc3QKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludAoraGRkX3BhcnNlX2NoYW5uZWxsaXN0KGNvbnN0IHVpbnQ4X3QgKnBWYWx1ZSwgdWludDhfdCAqcENoYW5uZWxMaXN0LAorCQkgICAgICB1aW50OF90ICpwTnVtQ2hhbm5lbHMpCit7CisJY29uc3QgdWludDhfdCAqaW5QdHIgPSBwVmFsdWU7CisJaW50IHRlbXBJbnQ7CisJaW50IGogPSAwOworCWludCB2ID0gMDsKKwljaGFyIGJ1ZlszMl07CisKKwlpblB0ciA9IHN0cm5jaHIocFZhbHVlLCBzdHJsZW4ocFZhbHVlKSwgU1BBQ0VfQVNDSUlfVkFMVUUpOworCS8qIG5vIGFyZ3VtZW50IGFmdGVyIHRoZSBjb21tYW5kICovCisJaWYgKE5VTEwgPT0gaW5QdHIpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogbm8gc3BhY2UgYWZ0ZXIgdGhlIGNvbW1hbmQgKi8KKwllbHNlIGlmIChTUEFDRV9BU0NJSV9WQUxVRSAhPSAqaW5QdHIpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcmVtb3ZlIGVtcHR5IHNwYWNlcyAqLworCXdoaWxlICgoU1BBQ0VfQVNDSUlfVkFMVUUgPT0gKmluUHRyKSAmJiAoJ1wwJyAhPSAqaW5QdHIpKQorCQlpblB0cisrOworCisJLyogbm8gYXJndW1lbnQgZm9sbG93ZWQgYnkgc3BhY2VzICovCisJaWYgKCdcMCcgPT0gKmluUHRyKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGdldCB0aGUgZmlyc3QgYXJndW1lbnQgaWUgdGhlIG51bWJlciBvZiBjaGFubmVscyAqLworCXYgPSBzc2NhbmYoaW5QdHIsICIlMzFzICIsIGJ1Zik7CisJaWYgKDEgIT0gdikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2ID0ga3N0cnRvczMyKGJ1ZiwgMTAsICZ0ZW1wSW50KTsKKwlpZiAoKHYgPCAwKSB8fAorCSAgICAodGVtcEludCA8PSAwKSB8fCAodGVtcEludCA+IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKnBOdW1DaGFubmVscyA9IHRlbXBJbnQ7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIk51bWJlciBvZiBjaGFubmVscyBhcmU6ICVkIiwgKnBOdW1DaGFubmVscyk7CisKKwlmb3IgKGogPSAwOyBqIDwgKCpwTnVtQ2hhbm5lbHMpOyBqKyspIHsKKwkJLyoKKwkJICogaW5QdHIgcG9pbnRpbmcgdG8gdGhlIGJlZ2lubmluZyBvZiBmaXJzdCBzcGFjZSBhZnRlciBudW1iZXIKKwkJICogb2YgY2hhbm5lbHMKKwkJICovCisJCWluUHRyID0gc3RycGJyayhpblB0ciwgIiAiKTsKKwkJLyogbm8gY2hhbm5lbCBsaXN0IGFmdGVyIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXJndW1lbnQgKi8KKwkJaWYgKE5VTEwgPT0gaW5QdHIpIHsKKwkJCWlmICgwICE9IGopIHsKKwkJCQkqcE51bUNoYW5uZWxzID0gajsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKworCQkvKiByZW1vdmUgZW1wdHkgc3BhY2UgKi8KKwkJd2hpbGUgKChTUEFDRV9BU0NJSV9WQUxVRSA9PSAqaW5QdHIpICYmICgnXDAnICE9ICppblB0cikpCisJCQlpblB0cisrOworCisJCS8qCisJCSAqIG5vIGNoYW5uZWwgbGlzdCBhZnRlciB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisJCSAqIGFyZ3VtZW50IGFuZCBzcGFjZXMKKwkJICovCisJCWlmICgnXDAnID09ICppblB0cikgeworCQkJaWYgKDAgIT0gaikgeworCQkJCSpwTnVtQ2hhbm5lbHMgPSBqOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCisJCXYgPSBzc2NhbmYoaW5QdHIsICIlMzFzICIsIGJ1Zik7CisJCWlmICgxICE9IHYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl2ID0ga3N0cnRvczMyKGJ1ZiwgMTAsICZ0ZW1wSW50KTsKKwkJaWYgKCh2IDwgMCkgfHwKKwkJICAgICh0ZW1wSW50IDw9IDApIHx8CisJCSAgICAodGVtcEludCA+IFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1BWCkpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXBDaGFubmVsTGlzdFtqXSA9IHRlbXBJbnQ7CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiQ2hhbm5lbCAlZCBhZGRlZCB0byBwcmVmZXJyZWQgY2hhbm5lbCBsaXN0IiwKKwkJCSAgcENoYW5uZWxMaXN0W2pdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfcGFyc2Vfc2V0X3JvYW1fc2Nhbl9jaGFubmVsc192MSgpIC0gcGFyc2UgdmVyc2lvbiAxIG9mIHRoZQorICogU0VUUk9BTVNDQU5DSEFOTkVMUyBjb21tYW5kCisgKiBAYWRhcHRlcjoJQWRhcHRlciB1cG9uIHdoaWNoIHRoZSBjb21tYW5kIHdhcyByZWNlaXZlZAorICogQGNvbW1hbmQ6CUFTQ0lJIHRleHQgY29tbWFuZCB0aGF0IHdhcyByZWNlaXZlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSB2MSBTRVRST0FNU0NBTkNIQU5ORUxTIGNvbW1hbmQgd2l0aCB0aGUgZm9ybWF0CisgKgorICogICAgU0VUUk9BTVNDQU5DSEFOTkVMUyBOIEMxIEMyIC4uLiBDbgorICoKKyAqIFdoZXJlICJOIiBpcyB0aGUgQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlciBvZiBjaGFubmVscyBhbmQKKyAqIEMxIHRocnUgQ24gaXMgdGhlIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjaGFubmVscy4gIEZvciBleGFtcGxlCisgKgorICogICAgU0VUUk9BTVNDQU5DSEFOTkVMUyA0IDM2IDQwIDQ0IDQ4CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK2hkZF9wYXJzZV9zZXRfcm9hbV9zY2FuX2NoYW5uZWxzX3YxKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmNvbW1hbmQpCit7CisJdWludDhfdCBjaGFubmVsX2xpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXSA9IHsgMCB9OworCXVpbnQ4X3QgbnVtX2NoYW4gPSAwOworCUNERl9TVEFUVVMgc3RhdHVzOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCWludCByZXQ7CisKKwlyZXQgPSBoZGRfcGFyc2VfY2hhbm5lbGxpc3QoY29tbWFuZCwgY2hhbm5lbF9saXN0LCAmbnVtX2NoYW4pOworCWlmIChyZXQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIHBhcnNlIGNoYW5uZWwgbGlzdCBpbmZvcm1hdGlvbiIsCisJCQkgIF9fZnVuY19fKTsKKwkJZ290byBleGl0OworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfU0VUUk9BTVNDQU5DSEFOTkVMU19JT0NUTCwKKwkJCSBhZGFwdGVyLT5zZXNzaW9uSWQsIG51bV9jaGFuKSk7CisKKwlpZiAobnVtX2NoYW4gPiBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogbnVtYmVyIG9mIGNoYW5uZWxzICglZCkgc3VwcG9ydGVkIGV4Y2VlZGVkIG1heCAoJWQpIiwKKwkJCSAgX19mdW5jX18sIG51bV9jaGFuLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJc3RhdHVzID0KKwkJc21lX2NoYW5nZV9yb2FtX3NjYW5fY2hhbm5lbF9saXN0KGhkZF9jdHgtPmhIYWwsCisJCQkJCQkgIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCSAgY2hhbm5lbF9saXN0LCBudW1fY2hhbik7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIHVwZGF0ZSBjaGFubmVsIGxpc3QgaW5mb3JtYXRpb24iLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CitleGl0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGRkX3BhcnNlX3NldF9yb2FtX3NjYW5fY2hhbm5lbHNfdjIoKSAtIHBhcnNlIHZlcnNpb24gMiBvZiB0aGUKKyAqIFNFVFJPQU1TQ0FOQ0hBTk5FTFMgY29tbWFuZAorICogQGFkYXB0ZXI6CUFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgY29tbWFuZCB3YXMgcmVjZWl2ZWQKKyAqIEBjb21tYW5kOglDb21tYW5kIHRoYXQgd2FzIHJlY2VpdmVkLCBBU0NJSSBjb21tYW5kCisgKiAgICAgIAkgICAgIGZvbGxvd2VkIGJ5IGJpbmFyeSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIHYyIFNFVFJPQU1TQ0FOQ0hBTk5FTFMgY29tbWFuZCB3aXRoIHRoZSBmb3JtYXQKKyAqCisgKiAgICBTRVRST0FNU0NBTkNIQU5ORUxTIFtOXVtDMV1bQzJdW0NuXQorICoKKyAqIFRoZSBjb21tYW5kIGJlZ2lucyB3aXRoIFNFVFJPQU1TQ0FOQ0hBTk5FTFMgZm9sbG93ZWQgYnkgYSBzcGFjZSwgYnV0CisgKiB3aGF0IGZvbGxvd3MgdGhlIHNwYWNlIGlzIGFuIGFycmF5IG9mIHUwOCBwYXJhbWV0ZXJzLiAgRm9yIGV4YW1wbGUKKyAqCisgKiAgICBTRVRST0FNU0NBTkNIQU5ORUxTIFsweDA0IDB4MjQgMHgyOCAweDJjIDB4MzBdCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK2hkZF9wYXJzZV9zZXRfcm9hbV9zY2FuX2NoYW5uZWxzX3YyKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmNvbW1hbmQpCit7CisJY29uc3QgdWludDhfdCAqdmFsdWU7CisJdWludDhfdCBjaGFubmVsX2xpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXSA9IHsgMCB9OworCXVpbnQ4X3QgY2hhbm5lbDsKKwl1aW50OF90IG51bV9jaGFuOworCWludCBpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCUNERl9TVEFUVVMgc3RhdHVzOworCWludCByZXQgPSAwOworCisJLyogYXJyYXkgb2YgdmFsdWVzIGJlZ2lucyBhZnRlciAiU0VUUk9BTVNDQU5DSEFOTkVMUyAiICovCisJdmFsdWUgPSBjb21tYW5kICsgMjA7CisKKwludW1fY2hhbiA9ICp2YWx1ZSsrOworCWlmIChudW1fY2hhbiA+IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBudW1iZXIgb2YgY2hhbm5lbHMgKCVkKSBzdXBwb3J0ZWQgZXhjZWVkZWQgbWF4ICglZCkiLAorCQkJICBfX2Z1bmNfXywgbnVtX2NoYW4sIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX1NFVFJPQU1TQ0FOQ0hBTk5FTFNfSU9DVEwsCisJCQkgYWRhcHRlci0+c2Vzc2lvbklkLCBudW1fY2hhbikpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9jaGFuOyBpKyspIHsKKwkJY2hhbm5lbCA9ICp2YWx1ZSsrOworCQlpZiAoY2hhbm5lbCA+IFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1BWCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IGluZGV4ICVkIGludmFsaWQgY2hhbm5lbCAlZCIsIF9fZnVuY19fLAorCQkJCSAgaSwgY2hhbm5lbCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBleGl0OworCQl9CisJCWNoYW5uZWxfbGlzdFtpXSA9IGNoYW5uZWw7CisJfQorCXN0YXR1cyA9CisJCXNtZV9jaGFuZ2Vfcm9hbV9zY2FuX2NoYW5uZWxfbGlzdChoZGRfY3R4LT5oSGFsLAorCQkJCQkJICBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkgIGNoYW5uZWxfbGlzdCwgbnVtX2NoYW4pOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byB1cGRhdGUgY2hhbm5lbCBsaXN0IGluZm9ybWF0aW9uIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9wYXJzZV9zZXRfcm9hbV9zY2FuX2NoYW5uZWxzKCkgLSBwYXJzZSB0aGUKKyAqIFNFVFJPQU1TQ0FOQ0hBTk5FTFMgY29tbWFuZAorICogQGFkYXB0ZXI6CUFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgY29tbWFuZCB3YXMgcmVjZWl2ZWQKKyAqIEBjb21tYW5kOglDb21tYW5kIHRoYXQgd2FzIHJlY2VpdmVkCisgKgorICogVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIFNFVFJPQU1TQ0FOQ0hBTk5FTFMgY29tbWFuZC4KKyAqIFZlcnNpb24gMSBvZiB0aGUgY29tbWFuZCBjb250YWlucyBhIHBhcmFtZXRlciBsaXN0IHRoYXQgaXMgQVNDSUkKKyAqIGNoYXJhY3RlcnMgd2hlcmVhcyB2ZXJzaW9uIDIgY29udGFpbnMgYSBiaW5hcnkgcGF5bG9hZC4gIERldGVybWluZQorICogaWYgYSB2ZXJzaW9uIDEgb3IgYSB2ZXJzaW9uIDIgY29tbWFuZCBpcyBiZWluZyBwYXJzZWQgYnkgZXhhbWluaW5nCisgKiB0aGUgcGFyYW1ldGVycywgYW5kIHRoZW4gZGlzcGF0Y2ggdGhlIHBhcnNlciB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvcgorICogdGhlIGNvbW1hbmQuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK2hkZF9wYXJzZV9zZXRfcm9hbV9zY2FuX2NoYW5uZWxzKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIGNvbnN0IGNoYXIgKmNvbW1hbmQpCit7CisJY29uc3QgY2hhciAqY3Vyc29yOworCWNoYXIgY2g7CisJYm9vbCB2MTsKKwlpbnQgcmV0OworCisJLyogc3RhcnQgYWZ0ZXIgIlNFVFJPQU1TQ0FOQ0hBTk5FTFMgIiAqLworCWN1cnNvciA9IGNvbW1hbmQgKyAyMDsKKworCS8qIGFzc3VtZSB3ZSBoYXZlIGEgdmVyc2lvbiAxIGNvbW1hbmQgdW50aWwgcHJvdmVuIG90aGVyd2lzZSAqLworCXYxID0gdHJ1ZTsKKworCS8qIHYxIHBhcmFtcyB3aWxsIG9ubHkgY29udGFpbiBBU0NJSSBkaWdpdHMgYW5kIHNwYWNlICovCisJd2hpbGUgKChjaCA9ICpjdXJzb3IrKykgJiYgdjEpIHsKKwkJaWYgKCEoaXNkaWdpdChjaCkgfHwgaXNzcGFjZShjaCkpKSB7CisJCQl2MSA9IGZhbHNlOworCQl9CisJfQorCWlmICh2MSkgeworCQlyZXQgPSBoZGRfcGFyc2Vfc2V0X3JvYW1fc2Nhbl9jaGFubmVsc192MShhZGFwdGVyLCBjb21tYW5kKTsKKwl9IGVsc2UgeworCQlyZXQgPSBoZGRfcGFyc2Vfc2V0X3JvYW1fc2Nhbl9jaGFubmVsc192MihhZGFwdGVyLCBjb21tYW5kKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSIHx8IEZFQVRVUkVfV0xBTl9FU0UgfHwgRkVBVFVSRV9XTEFOX0xGUiAqLworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorLyoqCisgKiBoZGRfcGFyc2VfcGxtX2NtZCgpIC0gSEREIFBhcnNlIFBsbSBjb21tYW5kCisgKiBAcFZhbHVlOglQb2ludGVyIHRvIGlucHV0IGRhdGEKKyAqIEBwUGxtUmVxdWVzdDpQb2ludGVyIHRvIG91dHB1dCBzdHJ1Y3QgdHBTaXJQbG1SZXEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgcGxtIGNvbW1hbmQgcGFzc2VkIGluIHRoZSBmb3JtYXQKKyAqIENDWFBMTVJFUTxzcGFjZT48ZW5hYmxlPjxzcGFjZT48ZGlhbG9nX3Rva2VuPjxzcGFjZT4KKyAqIDxtZWFzX3Rva2VuPjxzcGFjZT48bnVtX29mX2J1cnN0cz48c3BhY2U+PGJ1cnN0X2ludD48c3BhY2U+CisgKiA8bWVhc3UgZHVyYXRpb24+PHNwYWNlPjxidXJzdF9sZW4+PHNwYWNlPjxkZXNpcmVkX3R4X3B3cj4KKyAqIDxzcGFjZT48bXVsdGNhc3RfYWRkcj48c3BhY2U+PG51bWJlcl9vZl9jaGFubmVscz4KKyAqIDxzcGFjZT48Y2hhbm5lbF9udW1iZXJzPgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitDREZfU1RBVFVTIGhkZF9wYXJzZV9wbG1fY21kKHVpbnQ4X3QgKnBWYWx1ZSwgdFNpclBsbVJlcSAqcFBsbVJlcXVlc3QpCit7CisJdWludDhfdCAqY21kUHRyID0gTlVMTDsKKwlpbnQgY291bnQsIGNvbnRlbnQgPSAwLCByZXQgPSAwOworCWNoYXIgYnVmWzMyXTsKKworCS8qIG1vdmUgdG8gYXJndW1lbnQgbGlzdCAqLworCWNtZFB0ciA9IHN0cm5jaHIocFZhbHVlLCBzdHJsZW4ocFZhbHVlKSwgU1BBQ0VfQVNDSUlfVkFMVUUpOworCWlmIChOVUxMID09IGNtZFB0cikKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJLyogbm8gc3BhY2UgYWZ0ZXIgdGhlIGNvbW1hbmQgKi8KKwlpZiAoU1BBQ0VfQVNDSUlfVkFMVUUgIT0gKmNtZFB0cikKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJLyogcmVtb3ZlIGVtcHR5IHNwYWNlcyAqLworCXdoaWxlICgoU1BBQ0VfQVNDSUlfVkFMVUUgPT0gKmNtZFB0cikgJiYgKCdcMCcgIT0gKmNtZFB0cikpCisJCWNtZFB0cisrOworCisJLyogU1RBUlQvU1RPUCBQTE0gcmVxICovCisJcmV0ID0gc3NjYW5mKGNtZFB0ciwgIiUzMXMgIiwgYnVmKTsKKwlpZiAoMSAhPSByZXQpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCXJldCA9IGtzdHJ0b3MzMihidWYsIDEwLCAmY29udGVudCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCXBQbG1SZXF1ZXN0LT5lbmFibGUgPSBjb250ZW50OworCWNtZFB0ciA9IHN0cnBicmsoY21kUHRyLCAiICIpOworCisJaWYgKE5VTEwgPT0gY21kUHRyKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkvKiByZW1vdmUgZW1wdHkgc3BhY2VzICovCisJd2hpbGUgKChTUEFDRV9BU0NJSV9WQUxVRSA9PSAqY21kUHRyKSAmJiAoJ1wwJyAhPSAqY21kUHRyKSkKKwkJY21kUHRyKys7CisKKwkvKiBEaWFsb2cgdG9rZW4gb2YgcmFkaW8gbWVhcyByZXEgY29udGFpbmluZyBtZWFzIHJlcUlFICovCisJcmV0ID0gc3NjYW5mKGNtZFB0ciwgIiUzMXMgIiwgYnVmKTsKKwlpZiAoMSAhPSByZXQpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCXJldCA9IGtzdHJ0b3MzMihidWYsIDEwLCAmY29udGVudCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCXBQbG1SZXF1ZXN0LT5kaWFnX3Rva2VuID0gY29udGVudDsKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCAiZGlhZyB0b2tlbiAlZCIsCisJICAgICAgIHBQbG1SZXF1ZXN0LT5kaWFnX3Rva2VuKTsKKwljbWRQdHIgPSBzdHJwYnJrKGNtZFB0ciwgIiAiKTsKKworCWlmIChOVUxMID09IGNtZFB0cikKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJLyogcmVtb3ZlIGVtcHR5IHNwYWNlcyAqLworCXdoaWxlICgoU1BBQ0VfQVNDSUlfVkFMVUUgPT0gKmNtZFB0cikgJiYgKCdcMCcgIT0gKmNtZFB0cikpCisJCWNtZFB0cisrOworCisJLyogbWVhc3VyZW1lbnQgdG9rZW4gb2YgbWVhcyByZXEgSUUgKi8KKwlyZXQgPSBzc2NhbmYoY21kUHRyLCAiJTMxcyAiLCBidWYpOworCWlmICgxICE9IHJldCkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJcmV0ID0ga3N0cnRvczMyKGJ1ZiwgMTAsICZjb250ZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJcFBsbVJlcXVlc3QtPm1lYXNfdG9rZW4gPSBjb250ZW50OworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfREVCVUcsICJtZWFzIHRva2VuICVkIiwKKwkgICAgICAgcFBsbVJlcXVlc3QtPm1lYXNfdG9rZW4pOworCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkgICAgICAgIlBMTSByZXEgJXMiLCBwUGxtUmVxdWVzdC0+ZW5hYmxlID8gIlNUQVJUIiA6ICJTVE9QIik7CisJaWYgKHBQbG1SZXF1ZXN0LT5lbmFibGUpIHsKKworCQljbWRQdHIgPSBzdHJwYnJrKGNtZFB0ciwgIiAiKTsKKworCQlpZiAoTlVMTCA9PSBjbWRQdHIpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJLyogcmVtb3ZlIGVtcHR5IHNwYWNlcyAqLworCQl3aGlsZSAoKFNQQUNFX0FTQ0lJX1ZBTFVFID09ICpjbWRQdHIpICYmICgnXDAnICE9ICpjbWRQdHIpKQorCQkJY21kUHRyKys7CisKKwkJLyogdG90YWwgbnVtYmVyIG9mIGJ1cnN0cyBhZnRlciB3aGljaCBTVEEgc3RvcHMgc2VuZGluZyAqLworCQlyZXQgPSBzc2NhbmYoY21kUHRyLCAiJTMxcyAiLCBidWYpOworCQlpZiAoMSAhPSByZXQpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJcmV0ID0ga3N0cnRvczMyKGJ1ZiwgMTAsICZjb250ZW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJaWYgKGNvbnRlbnQgPCAwKQorCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJCXBQbG1SZXF1ZXN0LT5udW1CdXJzdHMgPSBjb250ZW50OworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCAibnVtIGJ1cnN0ICVkIiwKKwkJICAgICAgIHBQbG1SZXF1ZXN0LT5udW1CdXJzdHMpOworCQljbWRQdHIgPSBzdHJwYnJrKGNtZFB0ciwgIiAiKTsKKworCQlpZiAoTlVMTCA9PSBjbWRQdHIpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJLyogcmVtb3ZlIGVtcHR5IHNwYWNlcyAqLworCQl3aGlsZSAoKFNQQUNFX0FTQ0lJX1ZBTFVFID09ICpjbWRQdHIpICYmICgnXDAnICE9ICpjbWRQdHIpKQorCQkJY21kUHRyKys7CisKKwkJLyogYnVyc3QgaW50ZXJ2YWwgaW4gc2Vjb25kcyAqLworCQlyZXQgPSBzc2NhbmYoY21kUHRyLCAiJTMxcyAiLCBidWYpOworCQlpZiAoMSAhPSByZXQpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJcmV0ID0ga3N0cnRvczMyKGJ1ZiwgMTAsICZjb250ZW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJaWYgKGNvbnRlbnQgPD0gMCkKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlwUGxtUmVxdWVzdC0+YnVyc3RJbnQgPSBjb250ZW50OworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCAiYnVyc3QgSW50ICVkIiwKKwkJICAgICAgIHBQbG1SZXF1ZXN0LT5idXJzdEludCk7CisJCWNtZFB0ciA9IHN0cnBicmsoY21kUHRyLCAiICIpOworCisJCWlmIChOVUxMID09IGNtZFB0cikKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQkvKiByZW1vdmUgZW1wdHkgc3BhY2VzICovCisJCXdoaWxlICgoU1BBQ0VfQVNDSUlfVkFMVUUgPT0gKmNtZFB0cikgJiYgKCdcMCcgIT0gKmNtZFB0cikpCisJCQljbWRQdHIrKzsKKworCQkvKiBNZWFzIGR1ciBpbiBUVSdzLFNUQSBnb2VzIG9mZi1jaCBhbmQgdHJhbnNtaXQgUExNIGJ1cnN0cyAqLworCQlyZXQgPSBzc2NhbmYoY21kUHRyLCAiJTMxcyAiLCBidWYpOworCQlpZiAoMSAhPSByZXQpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJcmV0ID0ga3N0cnRvczMyKGJ1ZiwgMTAsICZjb250ZW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJaWYgKGNvbnRlbnQgPD0gMCkKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlwUGxtUmVxdWVzdC0+bWVhc0R1cmF0aW9uID0gY29udGVudDsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgIm1lYXNEdXIgJWQiLAorCQkgICAgICAgcFBsbVJlcXVlc3QtPm1lYXNEdXJhdGlvbik7CisJCWNtZFB0ciA9IHN0cnBicmsoY21kUHRyLCAiICIpOworCisJCWlmIChOVUxMID09IGNtZFB0cikKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQkvKiByZW1vdmUgZW1wdHkgc3BhY2VzICovCisJCXdoaWxlICgoU1BBQ0VfQVNDSUlfVkFMVUUgPT0gKmNtZFB0cikgJiYgKCdcMCcgIT0gKmNtZFB0cikpCisJCQljbWRQdHIrKzsKKworCQkvKiBidXJzdCBsZW5ndGggb2YgUExNIGJ1cnN0cyAqLworCQlyZXQgPSBzc2NhbmYoY21kUHRyLCAiJTMxcyAiLCBidWYpOworCQlpZiAoMSAhPSByZXQpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJcmV0ID0ga3N0cnRvczMyKGJ1ZiwgMTAsICZjb250ZW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJaWYgKGNvbnRlbnQgPD0gMCkKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlwUGxtUmVxdWVzdC0+YnVyc3RMZW4gPSBjb250ZW50OworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCAiYnVyc3RMZW4gJWQiLAorCQkgICAgICAgcFBsbVJlcXVlc3QtPmJ1cnN0TGVuKTsKKwkJY21kUHRyID0gc3RycGJyayhjbWRQdHIsICIgIik7CisKKwkJaWYgKE5VTEwgPT0gY21kUHRyKQorCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJCS8qIHJlbW92ZSBlbXB0eSBzcGFjZXMgKi8KKwkJd2hpbGUgKChTUEFDRV9BU0NJSV9WQUxVRSA9PSAqY21kUHRyKSAmJiAoJ1wwJyAhPSAqY21kUHRyKSkKKwkJCWNtZFB0cisrOworCisJCS8qIGRlc2lyZWQgdHggcG93ZXIgZm9yIHRyYW5zbWlzc2lvbiBvZiBQTE0gYnVyc3RzICovCisJCXJldCA9IHNzY2FuZihjbWRQdHIsICIlMzFzICIsIGJ1Zik7CisJCWlmICgxICE9IHJldCkKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlyZXQgPSBrc3RydG9zMzIoYnVmLCAxMCwgJmNvbnRlbnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlpZiAoY29udGVudCA8PSAwKQorCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJCXBQbG1SZXF1ZXN0LT5kZXNpcmVkVHhQd3IgPSBjb250ZW50OworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkgICAgICAgImRlc2lyZWRUeFB3ciAlZCIsIHBQbG1SZXF1ZXN0LT5kZXNpcmVkVHhQd3IpOworCisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IENERl9NQUNfQUREUl9TSVpFOyBjb3VudCsrKSB7CisJCQljbWRQdHIgPSBzdHJwYnJrKGNtZFB0ciwgIiAiKTsKKworCQkJaWYgKE5VTEwgPT0gY21kUHRyKQorCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQkJLyogcmVtb3ZlIGVtcHR5IHNwYWNlcyAqLworCQkJd2hpbGUgKChTUEFDRV9BU0NJSV9WQUxVRSA9PSAqY21kUHRyKQorCQkJICAgICAgICYmICgnXDAnICE9ICpjbWRQdHIpKQorCQkJCWNtZFB0cisrOworCisJCQlyZXQgPSBzc2NhbmYoY21kUHRyLCAiJTMxcyAiLCBidWYpOworCQkJaWYgKDEgIT0gcmV0KQorCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQkJcmV0ID0ga3N0cnRvczMyKGJ1ZiwgMTYsICZjb250ZW50KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQkJcFBsbVJlcXVlc3QtPm1hY0FkZHJbY291bnRdID0gY29udGVudDsKKwkJfQorCisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfREVCVUcsICJNQyBhZGRyICIgTUFDX0FERFJFU1NfU1RSLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkocFBsbVJlcXVlc3QtPm1hY0FkZHIpKTsKKworCQljbWRQdHIgPSBzdHJwYnJrKGNtZFB0ciwgIiAiKTsKKworCQlpZiAoTlVMTCA9PSBjbWRQdHIpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJLyogcmVtb3ZlIGVtcHR5IHNwYWNlcyAqLworCQl3aGlsZSAoKFNQQUNFX0FTQ0lJX1ZBTFVFID09ICpjbWRQdHIpICYmICgnXDAnICE9ICpjbWRQdHIpKQorCQkJY21kUHRyKys7CisKKwkJLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCisJCXJldCA9IHNzY2FuZihjbWRQdHIsICIlMzFzICIsIGJ1Zik7CisJCWlmICgxICE9IHJldCkKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlyZXQgPSBrc3RydG9zMzIoYnVmLCAxMCwgJmNvbnRlbnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlpZiAoY29udGVudCA8IDApCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJcFBsbVJlcXVlc3QtPnBsbU51bUNoID0gY29udGVudDsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgIm51bWNoICVkIiwKKwkJICAgICAgIHBQbG1SZXF1ZXN0LT5wbG1OdW1DaCk7CisKKwkJLyogQ2hhbm5lbCBudW1iZXJzICovCisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHBQbG1SZXF1ZXN0LT5wbG1OdW1DaDsgY291bnQrKykgeworCQkJY21kUHRyID0gc3RycGJyayhjbWRQdHIsICIgIik7CisKKwkJCWlmIChOVUxMID09IGNtZFB0cikKKwkJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJCS8qIHJlbW92ZSBlbXB0eSBzcGFjZXMgKi8KKwkJCXdoaWxlICgoU1BBQ0VfQVNDSUlfVkFMVUUgPT0gKmNtZFB0cikKKwkJCSAgICAgICAmJiAoJ1wwJyAhPSAqY21kUHRyKSkKKwkJCQljbWRQdHIrKzsKKworCQkJcmV0ID0gc3NjYW5mKGNtZFB0ciwgIiUzMXMgIiwgYnVmKTsKKwkJCWlmICgxICE9IHJldCkKKwkJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJCXJldCA9IGtzdHJ0b3MzMihidWYsIDEwLCAmY29udGVudCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJCWlmIChjb250ZW50IDw9IDApCisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJCQlwUGxtUmVxdWVzdC0+cGxtQ2hMaXN0W2NvdW50XSA9IGNvbnRlbnQ7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCAiIGNoLSAlZCIsCisJCQkgICAgICAgcFBsbVJlcXVlc3QtPnBsbUNoTGlzdFtjb3VudF0pOworCQl9CisJfQorCS8qIElmIFBMTSBTVEFSVCAqLworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9FWFRXT1dfU1VQUE9SVAorc3RhdGljIHZvaWQgd2xhbl9oZGRfcmVhZHlfdG9fZXh0d293KHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgYm9vbCBpc19zdWNjZXNzKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSAoaGRkX2NvbnRleHRfdCAqKSBjYWxsYmFja0NvbnRleHQ7CisJaW50IHJjOworCisJcmMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJjKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisJaGRkX2N0eC0+ZXh0X3dvd19zaG91bGRfc3VzcGVuZCA9IGlzX3N1Y2Nlc3M7CisJY29tcGxldGUoJmhkZF9jdHgtPnJlYWR5X3RvX2V4dHdvdyk7Cit9CisKK3N0YXRpYyBpbnQgaGRkX2VuYWJsZV9leHRfd293KGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgICB0cFNpckV4dFdvV1BhcmFtcyBhcmdfcGFyYW1zKQoreworCXRTaXJFeHRXb1dQYXJhbXMgcGFyYW1zOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChhZGFwdGVyKTsKKwlpbnQgcmM7CisKKwljZGZfbWVtX2NvcHkoJnBhcmFtcywgYXJnX3BhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworCisJSU5JVF9DT01QTEVUSU9OKGhkZF9jdHgtPnJlYWR5X3RvX2V4dHdvdyk7CisKKwljZGZfcmV0X3N0YXR1cyA9IHNtZV9jb25maWd1cmVfZXh0X3dvX3coaEhhbCwgJnBhcmFtcywKKwkJCQkJCSZ3bGFuX2hkZF9yZWFkeV90b19leHR3b3csCisJCQkJCQloZGRfY3R4KTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9yZXRfc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgic21lX2NvbmZpZ3VyZV9leHRfd29fdyByZXR1cm5lZCBmYWlsdXJlICVkIiksCisJCSAgICAgICBjZGZfcmV0X3N0YXR1cyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmhkZF9jdHgtPnJlYWR5X3RvX2V4dHdvdywKKwkJCW1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfUkVBRFlfVE9fRVhUV09XKSk7CisJaWYgKCFyYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gZ2V0IHJlYWR5IHRvIGV4dHdvdyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAoaGRkX2N0eC0+ZXh0X3dvd19zaG91bGRfc3VzcGVuZCkgeworCQlpZiAoaGRkX2N0eC0+Y29uZmlnLT5leHRXb3dHb3RvU3VzcGVuZCkgeworCQkJcG1fbWVzc2FnZV90IHN0YXRlOworCisJCQlzdGF0ZS5ldmVudCA9IFBNX0VWRU5UX1NVU1BFTkQ7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiBSZWNlaXZlZCByZWFkeSB0byBFeHRXb1cuIEdvaW5nIHRvIHN1c3BlbmQiLAorCQkJCSAgX19mdW5jX18pOworCisJCQlyYyA9IHdsYW5faGRkX2NmZzgwMjExX3N1c3BlbmRfd2xhbihoZGRfY3R4LT53aXBoeSwgTlVMTCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSIlczogd2xhbl9oZGRfY2ZnODAyMTFfc3VzcGVuZF93bGFuIGZhaWxlZCwgZXJyb3IgPSAlZCIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJY2RmX3JldF9zdGF0dXMgPSB3bGFuX2hkZF9idXNfc3VzcGVuZChzdGF0ZSk7CisJCQlpZiAoY2RmX3JldF9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSIlczogd2xhbl9oZGRfc3VzcGVuZCBmYWlsZWQsIHN0YXR1cyA9ICVkIiwKKwkJCQkJX19mdW5jX18sIGNkZl9yZXRfc3RhdHVzKTsKKwkJCQl3bGFuX2hkZF9jZmc4MDIxMV9yZXN1bWVfd2xhbihoZGRfY3R4LT53aXBoeSk7CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFJlY2VpdmVkIHJlYWR5IHRvIEV4dFdvVyBmYWlsdXJlIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkZF9lbmFibGVfZXh0X3dvd19wYXJzZXIoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHZkZXZfaWQsCisJCQkJICAgICBpbnQgdmFsdWUpCit7CisJdFNpckV4dFdvV1BhcmFtcyBwYXJhbXM7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisJaW50IHJjOworCisJcmMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJjKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh2YWx1ZSA8IEVYVF9XT1dfVFlQRV9BUFBfVFlQRTEgfHwKKwkgICAgdmFsdWUgPiBFWFRfV09XX1RZUEVfQVBQX1RZUEUxXzIpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkludmFsaWQgdHlwZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZhbHVlID09IEVYVF9XT1dfVFlQRV9BUFBfVFlQRTEgJiYKKwkgICAgaGRkX2N0eC0+aXNfZXh0d293X2FwcF90eXBlMV9wYXJhbV9zZXQpCisJCXBhcmFtcy50eXBlID0gdmFsdWU7CisJZWxzZSBpZiAodmFsdWUgPT0gRVhUX1dPV19UWVBFX0FQUF9UWVBFMiAmJgorCQkgaGRkX2N0eC0+aXNfZXh0d293X2FwcF90eXBlMl9wYXJhbV9zZXQpCisJCXBhcmFtcy50eXBlID0gdmFsdWU7CisJZWxzZSBpZiAodmFsdWUgPT0gRVhUX1dPV19UWVBFX0FQUF9UWVBFMV8yICYmCisJCSBoZGRfY3R4LT5pc19leHR3b3dfYXBwX3R5cGUxX3BhcmFtX3NldCAmJgorCQkgaGRkX2N0eC0+aXNfZXh0d293X2FwcF90eXBlMl9wYXJhbV9zZXQpCisJCXBhcmFtcy50eXBlID0gdmFsdWU7CisJZWxzZSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiU2V0IGFwcCBwYXJhbXMgYmVmb3JlIGVuYWJsZSBpdCB2YWx1ZSAlZCIpLCB2YWx1ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcmFtcy52ZGV2X2lkID0gdmRldl9pZDsKKwlwYXJhbXMud2FrZXVwX3Bpbl9udW0gPSBoZGRfY3R4LT5jb25maWctPmV4dFdvd0FwcDFXYWtldXBQaW5OdW1iZXIgfAorCQkJCShoZGRfY3R4LT5jb25maWctPmV4dFdvd0FwcDJXYWtldXBQaW5OdW1iZXIKKwkJCQkJPDwgOCk7CisKKwlyZXR1cm4gaGRkX2VuYWJsZV9leHRfd293KGFkYXB0ZXIsICZwYXJhbXMpOworfQorCitzdGF0aWMgaW50IGhkZF9zZXRfYXBwX3R5cGUxX3BhcmFtcyh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgIHRwU2lyQXBwVHlwZTFQYXJhbXMgYXJnX3BhcmFtcykKK3sKKwl0U2lyQXBwVHlwZTFQYXJhbXMgcGFyYW1zOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWNkZl9tZW1fY29weSgmcGFyYW1zLCBhcmdfcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisKKwljZGZfcmV0X3N0YXR1cyA9IHNtZV9jb25maWd1cmVfYXBwX3R5cGUxX3BhcmFtcyhoSGFsLCAmcGFyYW1zKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9yZXRfc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgic21lX2NvbmZpZ3VyZV9hcHBfdHlwZTFfcGFyYW1zIHJldHVybmVkIGZhaWx1cmUgJWQiKSwKKwkJICAgICAgIGNkZl9yZXRfc3RhdHVzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZGRfc2V0X2FwcF90eXBlMV9wYXJzZXIoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgY2hhciAqYXJnLCBpbnQgbGVuKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpOworCWNoYXIgaWRbMjBdLCBwYXNzd29yZFsyMF07CisJdFNpckFwcFR5cGUxUGFyYW1zIHBhcmFtczsKKwlpbnQgcmMsIGk7CisKKwlyYyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmMpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKDIgIT0gc3NjYW5mKGFyZywgIiU4cyAlMTZzIiwgaWQsIHBhc3N3b3JkKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIkludmFsaWQgTnVtYmVyIG9mIGFyZ3VtZW50cyIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZih0U2lyQXBwVHlwZTFQYXJhbXMpKTsKKwlwYXJhbXMudmRldl9pZCA9IGFkYXB0ZXItPnNlc3Npb25JZDsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykKKwkJcGFyYW1zLndha2VlX21hY19hZGRyW2ldID0KKwkJCWFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzW2ldOworCisJcGFyYW1zLmlkX2xlbmd0aCA9IHN0cmxlbihpZCk7CisJY2RmX21lbV9jb3B5KHBhcmFtcy5pZGVudGlmaWNhdGlvbl9pZCwgaWQsIHBhcmFtcy5pZF9sZW5ndGgpOworCXBhcmFtcy5wYXNzX2xlbmd0aCA9IHN0cmxlbihwYXNzd29yZCk7CisJY2RmX21lbV9jb3B5KHBhcmFtcy5wYXNzd29yZCwgcGFzc3dvcmQsIHBhcmFtcy5wYXNzX2xlbmd0aCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogJWQgJXBNICUuOHMgJXUgJS4xNnMgJXUiLAorCQkgIF9fZnVuY19fLCBwYXJhbXMudmRldl9pZCwgcGFyYW1zLndha2VlX21hY19hZGRyLAorCQkgIHBhcmFtcy5pZGVudGlmaWNhdGlvbl9pZCwgcGFyYW1zLmlkX2xlbmd0aCwKKwkJICBwYXJhbXMucGFzc3dvcmQsIHBhcmFtcy5wYXNzX2xlbmd0aCk7CisKKwlyZXR1cm4gaGRkX3NldF9hcHBfdHlwZTFfcGFyYW1zKGhIYWwsICZwYXJhbXMpOworfQorCitzdGF0aWMgaW50IGhkZF9zZXRfYXBwX3R5cGUyX3BhcmFtcyh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgIHRwU2lyQXBwVHlwZTJQYXJhbXMgYXJnX3BhcmFtcykKK3sKKwl0U2lyQXBwVHlwZTJQYXJhbXMgcGFyYW1zOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWNkZl9tZW1fY29weSgmcGFyYW1zLCBhcmdfcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisKKwljZGZfcmV0X3N0YXR1cyA9IHNtZV9jb25maWd1cmVfYXBwX3R5cGUyX3BhcmFtcyhoSGFsLCAmcGFyYW1zKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9yZXRfc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgic21lX2NvbmZpZ3VyZV9hcHBfdHlwZTJfcGFyYW1zIHJldHVybmVkIGZhaWx1cmUgJWQiKSwKKwkJICAgICAgIGNkZl9yZXRfc3RhdHVzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZGRfc2V0X2FwcF90eXBlMl9wYXJzZXIoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgY2hhciAqYXJnLCBpbnQgbGVuKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpOworCWNoYXIgbWFjX2FkZHJbMjBdLCByYzRfa2V5WzIwXTsKKwl1bnNpZ25lZCBpbnQgZ2F0ZXdheV9tYWNbNl0sIGk7CisJdFNpckFwcFR5cGUyUGFyYW1zIHBhcmFtczsKKwlpbnQgcmV0OworCisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZih0U2lyQXBwVHlwZTJQYXJhbXMpKTsKKworCXJldCA9IHNzY2FuZihhcmcsICIlMTdzICUxNnMgJXggJXggJXggJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUiLAorCQkgICAgIG1hY19hZGRyLCByYzRfa2V5LCAodW5zaWduZWQgaW50ICopJnBhcmFtcy5pcF9pZCwKKwkJICAgICAodW5zaWduZWQgaW50ICopJnBhcmFtcy5pcF9kZXZpY2VfaXAsCisJCSAgICAgKHVuc2lnbmVkIGludCAqKSZwYXJhbXMuaXBfc2VydmVyX2lwLAorCQkgICAgICh1bnNpZ25lZCBpbnQgKikmcGFyYW1zLnRjcF9zZXEsCisJCSAgICAgKHVuc2lnbmVkIGludCAqKSZwYXJhbXMudGNwX2Fja19zZXEsCisJCSAgICAgKHVuc2lnbmVkIGludCAqKSZwYXJhbXMudGNwX3NyY19wb3J0LAorCQkgICAgICh1bnNpZ25lZCBpbnQgKikmcGFyYW1zLnRjcF9kc3RfcG9ydCwKKwkJICAgICAodW5zaWduZWQgaW50ICopJnBhcmFtcy5rZWVwYWxpdmVfaW5pdCwKKwkJICAgICAodW5zaWduZWQgaW50ICopJnBhcmFtcy5rZWVwYWxpdmVfbWluLAorCQkgICAgICh1bnNpZ25lZCBpbnQgKikmcGFyYW1zLmtlZXBhbGl2ZV9tYXgsCisJCSAgICAgKHVuc2lnbmVkIGludCAqKSZwYXJhbXMua2VlcGFsaXZlX2luYywKKwkJICAgICAodW5zaWduZWQgaW50ICopJnBhcmFtcy50Y3BfdHhfdGltZW91dF92YWwsCisJCSAgICAgKHVuc2lnbmVkIGludCAqKSZwYXJhbXMudGNwX3J4X3RpbWVvdXRfdmFsKTsKKworCWlmIChyZXQgIT0gMTUgJiYgcmV0ICE9IDcpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJJbnZhbGlkIE51bWJlciBvZiBhcmd1bWVudHMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKDYgIT0KKwkgICAgc3NjYW5mKG1hY19hZGRyLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLCAmZ2F0ZXdheV9tYWNbMF0sCisJCSAgICZnYXRld2F5X21hY1sxXSwgJmdhdGV3YXlfbWFjWzJdLCAmZ2F0ZXdheV9tYWNbM10sCisJCSAgICZnYXRld2F5X21hY1s0XSwgJmdhdGV3YXlfbWFjWzVdKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkludmFsaWQgTWFjQWRkcmVzcyBJbnB1dCAlcyIsIG1hY19hZGRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBhcmFtcy50Y3Bfc3JjX3BvcnQgPiBXTEFOX0hERF9NQVhfVENQX1BPUlQgfHwKKwkgICAgcGFyYW1zLnRjcF9kc3RfcG9ydCA+IFdMQU5fSEREX01BWF9UQ1BfUE9SVCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkludmFsaWQgVENQIFBvcnQgTnVtYmVyIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorCQlwYXJhbXMuZ2F0ZXdheV9tYWNbaV0gPSAodWludDhfdCkgZ2F0ZXdheV9tYWNbaV07CisKKwlwYXJhbXMucmM0X2tleV9sZW4gPSBzdHJsZW4ocmM0X2tleSk7CisJY2RmX21lbV9jb3B5KHBhcmFtcy5yYzRfa2V5LCByYzRfa2V5LCBwYXJhbXMucmM0X2tleV9sZW4pOworCisJcGFyYW1zLnZkZXZfaWQgPSBhZGFwdGVyLT5zZXNzaW9uSWQ7CisJcGFyYW1zLnRjcF9zcmNfcG9ydCA9IChwYXJhbXMudGNwX3NyY19wb3J0ICE9IDApID8KKwkJcGFyYW1zLnRjcF9zcmNfcG9ydCA6IGhkZF9jdHgtPmNvbmZpZy0+ZXh0V293QXBwMlRjcFNyY1BvcnQ7CisJcGFyYW1zLnRjcF9kc3RfcG9ydCA9IChwYXJhbXMudGNwX2RzdF9wb3J0ICE9IDApID8KKwkJcGFyYW1zLnRjcF9kc3RfcG9ydCA6IGhkZF9jdHgtPmNvbmZpZy0+ZXh0V293QXBwMlRjcERzdFBvcnQ7CisJcGFyYW1zLmtlZXBhbGl2ZV9pbml0ID0gKHBhcmFtcy5rZWVwYWxpdmVfaW5pdCAhPSAwKSA/CisJCXBhcmFtcy5rZWVwYWxpdmVfaW5pdCA6IGhkZF9jdHgtPmNvbmZpZy0+CisJCQkJCQlleHRXb3dBcHAyS0FJbml0UGluZ0ludGVydmFsOworCXBhcmFtcy5rZWVwYWxpdmVfbWluID0KKwkJKHBhcmFtcy5rZWVwYWxpdmVfbWluICE9IDApID8KKwkJCXBhcmFtcy5rZWVwYWxpdmVfbWluIDoKKwkJCWhkZF9jdHgtPmNvbmZpZy0+ZXh0V293QXBwMktBTWluUGluZ0ludGVydmFsOworCXBhcmFtcy5rZWVwYWxpdmVfbWF4ID0KKwkJKHBhcmFtcy5rZWVwYWxpdmVfbWF4ICE9IDApID8KKwkJCXBhcmFtcy5rZWVwYWxpdmVfbWF4IDoKKwkJCWhkZF9jdHgtPmNvbmZpZy0+ZXh0V293QXBwMktBTWF4UGluZ0ludGVydmFsOworCXBhcmFtcy5rZWVwYWxpdmVfaW5jID0KKwkJKHBhcmFtcy5rZWVwYWxpdmVfaW5jICE9IDApID8KKwkJCXBhcmFtcy5rZWVwYWxpdmVfaW5jIDoKKwkJCWhkZF9jdHgtPmNvbmZpZy0+ZXh0V293QXBwMktBSW5jUGluZ0ludGVydmFsOworCXBhcmFtcy50Y3BfdHhfdGltZW91dF92YWwgPQorCQkocGFyYW1zLnRjcF90eF90aW1lb3V0X3ZhbCAhPSAwKSA/CisJCQlwYXJhbXMudGNwX3R4X3RpbWVvdXRfdmFsIDoKKwkJCWhkZF9jdHgtPmNvbmZpZy0+ZXh0V293QXBwMlRjcFR4VGltZW91dDsKKwlwYXJhbXMudGNwX3J4X3RpbWVvdXRfdmFsID0KKwkJKHBhcmFtcy50Y3BfcnhfdGltZW91dF92YWwgIT0gMCkgPworCQkJcGFyYW1zLnRjcF9yeF90aW1lb3V0X3ZhbCA6CisJCQloZGRfY3R4LT5jb25maWctPmV4dFdvd0FwcDJUY3BSeFRpbWVvdXQ7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogJXBNICUuMTZzICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1IiwKKwkJICBfX2Z1bmNfXywgZ2F0ZXdheV9tYWMsIHJjNF9rZXksIHBhcmFtcy5pcF9pZCwKKwkJICBwYXJhbXMuaXBfZGV2aWNlX2lwLCBwYXJhbXMuaXBfc2VydmVyX2lwLCBwYXJhbXMudGNwX3NlcSwKKwkJICBwYXJhbXMudGNwX2Fja19zZXEsIHBhcmFtcy50Y3Bfc3JjX3BvcnQsIHBhcmFtcy50Y3BfZHN0X3BvcnQsCisJCSAgcGFyYW1zLmtlZXBhbGl2ZV9pbml0LCBwYXJhbXMua2VlcGFsaXZlX21pbiwKKwkJICBwYXJhbXMua2VlcGFsaXZlX21heCwgcGFyYW1zLmtlZXBhbGl2ZV9pbmMsCisJCSAgcGFyYW1zLnRjcF90eF90aW1lb3V0X3ZhbCwgcGFyYW1zLnRjcF9yeF90aW1lb3V0X3ZhbCk7CisKKwlyZXR1cm4gaGRkX3NldF9hcHBfdHlwZTJfcGFyYW1zKGhIYWwsICZwYXJhbXMpOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9FWFRXT1dfU1VQUE9SVCAqLworCisvKioKKyAqIGhkZF9wYXJzZV9zZXRtYXh0eHBvd2VyX2NvbW1hbmQoKSAtIEhERCBQYXJzZSBNQVhUWFBPV0VSIGNvbW1hbmQKKyAqIEBwVmFsdWU6CVBvaW50ZXIgdG8gTUFYVFhQT1dFUiBjb21tYW5kCisgKiBAcERibToJUG9pbnRlciB0byB0eCBwb3dlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBNQVhUWFBPV0VSIGNvbW1hbmQgcGFzc2VkIGluIHRoZSBmb3JtYXQKKyAqIE1BWFRYUE9XRVI8c3BhY2U+WChUeCBwb3dlciBpbiBkYm0pCisgKgorICogRm9yIGV4YW1wbGUgaW5wdXQgY29tbWFuZHM6CisgKiAxKSBNQVhUWFBPV0VSIC04IC0+IFRoaXMgaXMgdHJhbnNsYXRlZCBpbnRvIHNldCBtYXggVFggcG93ZXIgdG8gLTggZGJtCisgKiAyKSBNQVhUWFBPV0VSIC0yMyAtPiBUaGlzIGlzIHRyYW5zbGF0ZWQgaW50byBzZXQgbWF4IFRYIHBvd2VyIHRvIC0yMyBkYm0KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoZGRfcGFyc2Vfc2V0bWF4dHhwb3dlcl9jb21tYW5kKHVpbnQ4X3QgKnBWYWx1ZSwgaW50ICpwVHhQb3dlcikKK3sKKwl1aW50OF90ICppblB0ciA9IHBWYWx1ZTsKKwlpbnQgdGVtcEludDsKKwlpbnQgdiA9IDA7CisJKnBUeFBvd2VyID0gMDsKKworCWluUHRyID0gc3RybmNocihwVmFsdWUsIHN0cmxlbihwVmFsdWUpLCBTUEFDRV9BU0NJSV9WQUxVRSk7CisJLyogbm8gYXJndW1lbnQgYWZ0ZXIgdGhlIGNvbW1hbmQgKi8KKwlpZiAoTlVMTCA9PSBpblB0cikgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBubyBzcGFjZSBhZnRlciB0aGUgY29tbWFuZCAqLworCWVsc2UgaWYgKFNQQUNFX0FTQ0lJX1ZBTFVFICE9ICppblB0cikgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiByZW1vdmUgZW1wdHkgc3BhY2VzICovCisJd2hpbGUgKChTUEFDRV9BU0NJSV9WQUxVRSA9PSAqaW5QdHIpICYmICgnXDAnICE9ICppblB0cikpCisJCWluUHRyKys7CisKKwkvKiBubyBhcmd1bWVudCBmb2xsb3dlZCBieSBzcGFjZXMgKi8KKwlpZiAoJ1wwJyA9PSAqaW5QdHIpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJdiA9IGtzdHJ0b3MzMihpblB0ciwgMTAsICZ0ZW1wSW50KTsKKworCS8qIFJhbmdlIGNoZWNraW5nIGZvciBwYXNzZWQgcGFyYW1ldGVyICovCisJaWYgKCh0ZW1wSW50IDwgSEREX01JTl9UWF9QT1dFUikgfHwgKHRlbXBJbnQgPiBIRERfTUFYX1RYX1BPV0VSKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqcFR4UG93ZXIgPSB0ZW1wSW50OworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiU0VUTUFYVFhQT1dFUjogJWQiLCAqcFR4UG93ZXIpOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCBvZiBoZGRfcGFyc2Vfc2V0bWF4dHhwb3dlcl9jb21tYW5kICovCisKK3N0YXRpYyBpbnQgaGRkX2dldF9kd2VsbF90aW1lKHN0cnVjdCBoZGRfY29uZmlnICpwQ2ZnLCB1aW50OF90ICpjb21tYW5kLAorCQkJICAgICAgY2hhciAqZXh0cmEsIHVpbnQ4X3QgbiwgdWludDhfdCAqbGVuKQoreworCWludCByZXQgPSAwOworCisJaWYgKCFwQ2ZnIHx8ICFjb21tYW5kIHx8ICFleHRyYSB8fCAhbGVuKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGFyZ3VtZW50IHBhc3NlZCBmb3IgR0VURFdFTExUSU1FIGlzIGluY29ycmVjdCIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoc3RybmNtcChjb21tYW5kLCAiR0VURFdFTExUSU1FIEFDVElWRSBNQVgiLCAyMykgPT0gMCkgeworCQkqbGVuID0gc2NucHJpbnRmKGV4dHJhLCBuLCAiR0VURFdFTExUSU1FIEFDVElWRSBNQVggJXVcbiIsCisJCQkJIChpbnQpcENmZy0+bkFjdGl2ZU1heENoblRpbWUpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAoc3RybmNtcChjb21tYW5kLCAiR0VURFdFTExUSU1FIEFDVElWRSBNSU4iLCAyMykgPT0gMCkgeworCQkqbGVuID0gc2NucHJpbnRmKGV4dHJhLCBuLCAiR0VURFdFTExUSU1FIEFDVElWRSBNSU4gJXVcbiIsCisJCQkJIChpbnQpcENmZy0+bkFjdGl2ZU1pbkNoblRpbWUpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAoc3RybmNtcChjb21tYW5kLCAiR0VURFdFTExUSU1FIFBBU1NJVkUgTUFYIiwgMjQpID09IDApIHsKKwkJKmxlbiA9IHNjbnByaW50ZihleHRyYSwgbiwgIkdFVERXRUxMVElNRSBQQVNTSVZFIE1BWCAldVxuIiwKKwkJCQkgKGludClwQ2ZnLT5uUGFzc2l2ZU1heENoblRpbWUpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAoc3RybmNtcChjb21tYW5kLCAiR0VURFdFTExUSU1FIFBBU1NJVkUgTUlOIiwgMjQpID09IDApIHsKKwkJKmxlbiA9IHNjbnByaW50ZihleHRyYSwgbiwgIkdFVERXRUxMVElNRSBQQVNTSVZFIE1JTiAldVxuIiwKKwkJCQkgKGludClwQ2ZnLT5uUGFzc2l2ZU1pbkNoblRpbWUpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAoc3RybmNtcChjb21tYW5kLCAiR0VURFdFTExUSU1FIiwgMTIpID09IDApIHsKKwkJKmxlbiA9IHNjbnByaW50ZihleHRyYSwgbiwgIkdFVERXRUxMVElNRSAldSBcbiIsCisJCQkJIChpbnQpcENmZy0+bkFjdGl2ZU1heENoblRpbWUpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoZGRfc2V0X2R3ZWxsX3RpbWUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgdWludDhfdCAqY29tbWFuZCkKK3sKKwl0SGFsSGFuZGxlIGhIYWw7CisJc3RydWN0IGhkZF9jb25maWcgKnBDZmc7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXRTbWVDb25maWdQYXJhbXMgc21lQ29uZmlnOworCWludCB2YWwgPSAwLCB0ZW1wID0gMDsKKworCXBDZmcgPSAoV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKSktPmNvbmZpZzsKKwloSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgoYWRhcHRlcik7CisJaWYgKCFwQ2ZnIHx8ICFoSGFsKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoImFyZ3VtZW50IHBhc3NlZCBmb3IgU0VURFdFTExUSU1FIGlzIGluY29ycmVjdCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2RmX21lbV96ZXJvKCZzbWVDb25maWcsIHNpemVvZihzbWVDb25maWcpKTsKKwlzbWVfZ2V0X2NvbmZpZ19wYXJhbShoSGFsLCAmc21lQ29uZmlnKTsKKworCWlmIChzdHJuY21wKGNvbW1hbmQsICJTRVREV0VMTFRJTUUgQUNUSVZFIE1BWCIsIDIzKSA9PSAwKSB7CisJCXZhbHVlID0gdmFsdWUgKyAyNDsKKwkJdGVtcCA9IGtzdHJ0b3UzMih2YWx1ZSwgMTAsICZ2YWwpOworCQlpZiAodGVtcCAhPSAwIHx8IHZhbCA8IENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9NSU4gfHwKKwkJICAgIHZhbCA+IENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9NQVgpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJhcmd1bWVudCBwYXNzZWQgZm9yIFNFVERXRUxMVElNRSBBQ1RJVkUgTUFYIGlzIGluY29ycmVjdCIpKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXBDZmctPm5BY3RpdmVNYXhDaG5UaW1lID0gdmFsOworCQlzbWVDb25maWcuY3NyQ29uZmlnLm5BY3RpdmVNYXhDaG5UaW1lID0gdmFsOworCQlzbWVfdXBkYXRlX2NvbmZpZyhoSGFsLCAmc21lQ29uZmlnKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY29tbWFuZCwgIlNFVERXRUxMVElNRSBBQ1RJVkUgTUlOIiwgMjMpID09IDApIHsKKwkJdmFsdWUgPSB2YWx1ZSArIDI0OworCQl0ZW1wID0ga3N0cnRvdTMyKHZhbHVlLCAxMCwgJnZhbCk7CisJCWlmICh0ZW1wICE9IDAgfHwgdmFsIDwgQ0ZHX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX01JTiB8fAorCQkgICAgdmFsID4gQ0ZHX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX01BWCkgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoImFyZ3VtZW50IHBhc3NlZCBmb3IgU0VURFdFTExUSU1FIEFDVElWRSBNSU4gaXMgaW5jb3JyZWN0IikpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcENmZy0+bkFjdGl2ZU1pbkNoblRpbWUgPSB2YWw7CisJCXNtZUNvbmZpZy5jc3JDb25maWcubkFjdGl2ZU1pbkNoblRpbWUgPSB2YWw7CisJCXNtZV91cGRhdGVfY29uZmlnKGhIYWwsICZzbWVDb25maWcpOworCX0gZWxzZSBpZiAoc3RybmNtcChjb21tYW5kLCAiU0VURFdFTExUSU1FIFBBU1NJVkUgTUFYIiwgMjQpID09IDApIHsKKwkJdmFsdWUgPSB2YWx1ZSArIDI1OworCQl0ZW1wID0ga3N0cnRvdTMyKHZhbHVlLCAxMCwgJnZhbCk7CisJCWlmICh0ZW1wICE9IDAgfHwgdmFsIDwgQ0ZHX1BBU1NJVkVfTUFYX0NIQU5ORUxfVElNRV9NSU4gfHwKKwkJICAgIHZhbCA+IENGR19QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfTUFYKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQlGTCgiYXJndW1lbnQgcGFzc2VkIGZvciBTRVREV0VMTFRJTUUgUEFTU0lWRSBNQVggaXMgaW5jb3JyZWN0IikpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcENmZy0+blBhc3NpdmVNYXhDaG5UaW1lID0gdmFsOworCQlzbWVDb25maWcuY3NyQ29uZmlnLm5QYXNzaXZlTWF4Q2huVGltZSA9IHZhbDsKKwkJc21lX3VwZGF0ZV9jb25maWcoaEhhbCwgJnNtZUNvbmZpZyk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNvbW1hbmQsICJTRVREV0VMTFRJTUUgUEFTU0lWRSBNSU4iLCAyNCkgPT0gMCkgeworCQl2YWx1ZSA9IHZhbHVlICsgMjU7CisJCXRlbXAgPSBrc3RydG91MzIodmFsdWUsIDEwLCAmdmFsKTsKKwkJaWYgKHRlbXAgIT0gMCB8fCB2YWwgPCBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX01JTiB8fAorCQkgICAgdmFsID4gQ0ZHX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9NQVgpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJhcmd1bWVudCBwYXNzZWQgZm9yIFNFVERXRUxMVElNRSBQQVNTSVZFIE1JTiBpcyBpbmNvcnJlY3QiKSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlwQ2ZnLT5uUGFzc2l2ZU1pbkNoblRpbWUgPSB2YWw7CisJCXNtZUNvbmZpZy5jc3JDb25maWcublBhc3NpdmVNaW5DaG5UaW1lID0gdmFsOworCQlzbWVfdXBkYXRlX2NvbmZpZyhoSGFsLCAmc21lQ29uZmlnKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY29tbWFuZCwgIlNFVERXRUxMVElNRSIsIDEyKSA9PSAwKSB7CisJCXZhbHVlID0gdmFsdWUgKyAxMzsKKwkJdGVtcCA9IGtzdHJ0b3UzMih2YWx1ZSwgMTAsICZ2YWwpOworCQlpZiAodGVtcCAhPSAwIHx8IHZhbCA8IENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9NSU4gfHwKKwkJICAgIHZhbCA+IENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9NQVgpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJhcmd1bWVudCBwYXNzZWQgZm9yIFNFVERXRUxMVElNRSBpcyBpbmNvcnJlY3QiKSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlwQ2ZnLT5uQWN0aXZlTWF4Q2huVGltZSA9IHZhbDsKKwkJc21lQ29uZmlnLmNzckNvbmZpZy5uQWN0aXZlTWF4Q2huVGltZSA9IHZhbDsKKwkJc21lX3VwZGF0ZV9jb25maWcoaEhhbCwgJnNtZUNvbmZpZyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhkZF9nZXRfbGlua19zdGF0dXNfY2IodWludDhfdCBzdGF0dXMsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHN0YXRzQ29udGV4dCAqcExpbmtDb250ZXh0OworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisKKwlpZiAoTlVMTCA9PSBjb250ZXh0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogQmFkIGNvbnRleHQgWyVwXSIsCisJCSAgICAgICBfX2Z1bmNfXywgY29udGV4dCk7CisJCXJldHVybjsKKwl9CisKKwlwTGlua0NvbnRleHQgPSBjb250ZXh0OworCWFkYXB0ZXIgPSBwTGlua0NvbnRleHQtPnBBZGFwdGVyOworCisJc3Bpbl9sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKworCWlmICgoTlVMTCA9PSBhZGFwdGVyKSB8fAorCSAgICAoTElOS19TVEFUVVNfTUFHSUMgIT0gcExpbmtDb250ZXh0LT5tYWdpYykpIHsKKwkJLyoKKwkJICogdGhlIGNhbGxlciBwcmVzdW1hYmx5IHRpbWVkIG91dCBzbyB0aGVyZSBpcworCQkgKiBub3RoaW5nIHdlIGNhbiBkbworCQkgKi8KKwkJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCSAgICAgICAiJXM6IEludmFsaWQgY29udGV4dCwgYWRhcHRlciBbJXBdIG1hZ2ljIFslMDh4XSIsCisJCSAgICAgICBfX2Z1bmNfXywgYWRhcHRlciwgcExpbmtDb250ZXh0LT5tYWdpYyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBjb250ZXh0IGlzIHZhbGlkIHNvIGNhbGxlciBpcyBzdGlsbCB3YWl0aW5nICovCisKKwkvKiBwYXJhbm9pYTogaW52YWxpZGF0ZSB0aGUgbWFnaWMgKi8KKwlwTGlua0NvbnRleHQtPm1hZ2ljID0gMDsKKworCS8qIGNvcHkgb3ZlciB0aGUgc3RhdHVzICovCisJYWRhcHRlci0+bGlua1N0YXR1cyA9IHN0YXR1czsKKworCS8qIG5vdGlmeSB0aGUgY2FsbGVyICovCisJY29tcGxldGUoJnBMaW5rQ29udGV4dC0+Y29tcGxldGlvbik7CisKKwkvKiBzZXJpYWxpemF0aW9uIGlzIGNvbXBsZXRlICovCisJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworfQorCisvKioKKyAqIHdsYW5faGRkX2dldF9saW5rX3N0YXR1cygpIC0gZ2V0IGxpbmsgc3RhdHVzCisgKiBAcEFkYXB0ZXI6ICAgICBwb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHJlcXVlc3QgdG8gcXVlcnkgdGhlIGxpbmsgc3RhdHVzIGFuZCB3YWl0cworICogb24gYSB0aW1lciB0byBpbnZva2UgdGhlIGNhbGxiYWNrLiBpZiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB0aGVuCisgKiBsYXRlc3QgbGluayBzdGF0dXMgc2hhbGwgYmUgcmV0dXJuZWQgb3Igb3RoZXJ3aXNlIGNhY2hlZCB2YWx1ZQorICogd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKiBSZXR1cm46IE9uIHN1Y2Nlc3MsIGxpbmsgc3RhdHVzIHNoYWxsIGJlIHJldHVybmVkLgorICogICAgICAgICBPbiBlcnJvciBvciBub3QgYXNzb2NpYXRlZCwgbGluayBzdGF0dXMgMCB3aWxsIGJlIHJldHVybmVkLgorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2dldF9saW5rX3N0YXR1cyhoZGRfYWRhcHRlcl90ICphZGFwdGVyKQoreworCisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPQorCQkJCVdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIoYWRhcHRlcik7CisJc3RydWN0IHN0YXRzQ29udGV4dCBjb250ZXh0OworCUNERl9TVEFUVVMgaHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHJjOworCisJaWYgKGhkZF9jdHgtPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKwkJaGRkTG9nKExPR1csIEZMKCJMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiKSk7CisJCXJldHVybiAwOworCX0KKworCWlmICgoV0xBTl9IRERfSU5GUkFfU1RBVElPTiAhPSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkgJiYKKwkgICAgKFdMQU5fSEREX1AyUF9DTElFTlQgIT0gYWRhcHRlci0+ZGV2aWNlX21vZGUpKSB7CisJCWhkZF93YXJuKCJVbnN1cHBvcnRlZCBpbiBtb2RlICVzKCVkKSIsCisJCQkgaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhhZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQkgYWRhcHRlci0+ZGV2aWNlX21vZGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKTsKKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJLyogSWYgbm90IGFzc29jaWF0ZWQsIHRoZW4gZXhwZWN0ZWQgbGluayBzdGF0dXMgcmV0dXJuCisJCSAqIHZhbHVlIGlzIDAKKwkJICovCisJCWhkZExvZyhMT0cxLCBGTCgiTm90IGFzc29jaWF0ZWQhIikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJmNvbnRleHQuY29tcGxldGlvbik7CisJY29udGV4dC5wQWRhcHRlciA9IGFkYXB0ZXI7CisJY29udGV4dC5tYWdpYyA9IExJTktfU1RBVFVTX01BR0lDOworCWhzdGF0dXMgPSBzbWVfZ2V0X2xpbmtfc3RhdHVzKFdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpLAorCQkJCSAgICAgIGhkZF9nZXRfbGlua19zdGF0dXNfY2IsCisJCQkJICAgICAgJmNvbnRleHQsIGFkYXB0ZXItPnNlc3Npb25JZCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBoc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IFVuYWJsZSB0byByZXRyaWV2ZSBsaW5rIHN0YXR1cyIsIF9fZnVuY19fKTsKKwkJLyogcmV0dXJuIGEgY2FjaGVkIHZhbHVlICovCisJfSBlbHNlIHsKKwkJLyogcmVxdWVzdCBpcyBzZW50IC0tIHdhaXQgZm9yIHRoZSByZXNwb25zZSAqLworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udGV4dC5jb21wbGV0aW9uLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfTElOS19TVEFUVVMpKTsKKwkJaWYgKCFyYykKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgRkwoIlNNRSB0aW1lZCBvdXQgd2hpbGUgcmV0cmlldmluZyBsaW5rIHN0YXR1cyIpKTsKKwl9CisKKwlzcGluX2xvY2soJmhkZF9jb250ZXh0X2xvY2spOworCWNvbnRleHQubWFnaWMgPSAwOworCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKworCS8qIGVpdGhlciBjYWxsYmFjayB1cGRhdGVkIGFkYXB0ZXIgc3RhdHMgb3IgaXQgaGFzIGNhY2hlZCBkYXRhICovCisJcmV0dXJuIGFkYXB0ZXItPmxpbmtTdGF0dXM7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisvKioKKyAqIGhkZF9wYXJzZV9lc2VfYmVhY29uX3JlcSgpIC0gUGFyc2UgZXNlIGJlYWNvbiByZXF1ZXN0CisgKiBAcFZhbHVlOglQb2ludGVyIHRvIGRhdGEKKyAqIEBwRXNlQmNuUmVxOglPdXRwdXQgcG9pbnRlciB0byBzdG9yZSBwYXJzZWQgaWUgaW5mb3JtYXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgZXNlIGJlYWNvbiByZXF1ZXN0IHBhc3NlZCBpbiB0aGUgZm9ybWF0CisgKiBDQ1hCRUFDT05SRVE8c3BhY2U+PE51bWJlciBvZiBmaWVsZHM+PHNwYWNlPjxNZWFzdXJlbWVudCB0b2tlbj4KKyAqIDxzcGFjZT5DaGFubmVsIDE8c3BhY2U+U2NhbiBNb2RlIDxzcGFjZT5NZWFzIER1cmF0aW9uPHNwYWNlPkNoYW5uZWwgTgorICogPHNwYWNlPlNjYW4gTW9kZSBOPHNwYWNlPk1lYXMgRHVyYXRpb24gTgorICoKKyAqIElmIHRoZSBOdW1iZXIgb2YgYmNuIHJlcSBmaWVsZHMgKE4pIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlCisgKiBhY3R1YWwgbnVtYmVyIG9mIGZpZWxkcyBwYXNzZWQgdGhlbiB0YWtlIE4uCisgKiA8TWVhcyBUb2tlbj48Q2hhbm5lbD48U2NhbiBNb2RlPiBhbmQgPE1lYXMgRHVyYXRpb24+IGFyZSB0cmVhdGVkCisgKiBhcyBvbmUgcGFpci4gRm9yIGV4YW1wbGUsIENDWEJFQUNPTlJFUSAyIDEgMSAxIDMwIDIgNDQgMCA0MC4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSBjYXJlIG9mIHJlbW92aW5nIGR1cGxpY2F0ZSBjaGFubmVscyBmcm9tIHRoZQorICogbGlzdAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IGhkZF9wYXJzZV9lc2VfYmVhY29uX3JlcSh1aW50OF90ICpwVmFsdWUsCisJCQkJCXRDc3JFc2VCZWFjb25SZXEgKnBFc2VCY25SZXEpCit7CisJdWludDhfdCAqaW5QdHIgPSBwVmFsdWU7CisJaW50IHRlbXBJbnQgPSAwOworCWludCBqID0gMCwgaSA9IDAsIHYgPSAwOworCWNoYXIgYnVmWzMyXTsKKworCWluUHRyID0gc3RybmNocihwVmFsdWUsIHN0cmxlbihwVmFsdWUpLCBTUEFDRV9BU0NJSV9WQUxVRSk7CisJLyogbm8gYXJndW1lbnQgYWZ0ZXIgdGhlIGNvbW1hbmQgKi8KKwlpZiAoTlVMTCA9PSBpblB0cikgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogbm8gc3BhY2UgYWZ0ZXIgdGhlIGNvbW1hbmQgKi8KKwllbHNlIGlmIChTUEFDRV9BU0NJSV9WQUxVRSAhPSAqaW5QdHIpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcmVtb3ZlIGVtcHR5IHNwYWNlcyAqLworCXdoaWxlICgoU1BBQ0VfQVNDSUlfVkFMVUUgPT0gKmluUHRyKSAmJiAoJ1wwJyAhPSAqaW5QdHIpKQorCQlpblB0cisrOworCisJLyogbm8gYXJndW1lbnQgZm9sbG93ZWQgYnkgc3BhY2VzICovCisJaWYgKCdcMCcgPT0gKmluUHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGdldCB0aGUgZmlyc3QgYXJndW1lbnQgaWUgbWVhc3VyZW1lbnQgdG9rZW4gKi8KKwl2ID0gc3NjYW5mKGluUHRyLCAiJTMxcyAiLCBidWYpOworCWlmICgxICE9IHYpCisJCXJldHVybiAtRUlOVkFMOworCisJdiA9IGtzdHJ0b3MzMihidWYsIDEwLCAmdGVtcEludCk7CisJaWYgKHYgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBFc2VCY25SZXEtPm51bUJjblJlcUllID0gdGVtcEludDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiTnVtYmVyIG9mIEJjbiBSZXEgSWUgZmllbGRzKCVkKSIsIHBFc2VCY25SZXEtPm51bUJjblJlcUllKTsKKworCWZvciAoaiA9IDA7IGogPCAocEVzZUJjblJlcS0+bnVtQmNuUmVxSWUpOyBqKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJLyoKKwkJCSAqIGluUHRyIHBvaW50aW5nIHRvIHRoZSBiZWdpbm5pbmcgb2YgMXN0IHNwYWNlCisJCQkgKiBhZnRlciBudW1iZXIgb2YgaWUgZmllbGRzCisJCQkgKi8KKwkJCWluUHRyID0gc3RycGJyayhpblB0ciwgIiAiKTsKKwkJCS8qIG5vIGllIGRhdGEgYWZ0ZXIgdGhlIG51bWJlciBvZiBpZSBmaWVsZHMgYXJndW1lbnQgKi8KKwkJCWlmIChOVUxMID09IGluUHRyKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkvKiByZW1vdmUgZW1wdHkgc3BhY2UgKi8KKwkJCXdoaWxlICgoU1BBQ0VfQVNDSUlfVkFMVUUgPT0gKmluUHRyKQorCQkJICAgICAgICYmICgnXDAnICE9ICppblB0cikpCisJCQkJaW5QdHIrKzsKKworCQkJLyoKKwkJCSAqIG5vIGllIGRhdGEgYWZ0ZXIgdGhlIG51bWJlciBvZiBpZSBmaWVsZHMKKwkJCSAqIGFyZ3VtZW50IGFuZCBzcGFjZXMKKwkJCSAqLworCQkJaWYgKCdcMCcgPT0gKmluUHRyKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl2ID0gc3NjYW5mKGluUHRyLCAiJTMxcyAiLCBidWYpOworCQkJaWYgKDEgIT0gdikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJdiA9IGtzdHJ0b3MzMihidWYsIDEwLCAmdGVtcEludCk7CisJCQlpZiAodiA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXN3aXRjaCAoaSkgeworCQkJY2FzZSAwOiAvKiBNZWFzdXJlbWVudCB0b2tlbiAqLworCQkJCWlmICh0ZW1wSW50IDw9IDApIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkgICJJbnZhbGlkIE1lYXN1cmVtZW50IFRva2VuKCVkKSIsCisJCQkJCQkgIHRlbXBJbnQpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJcEVzZUJjblJlcS0+YmNuUmVxW2pdLm1lYXN1cmVtZW50VG9rZW4gPQorCQkJCQl0ZW1wSW50OworCQkJCWJyZWFrOworCisJCQljYXNlIDE6IC8qIENoYW5uZWwgbnVtYmVyICovCisJCQkJaWYgKCh0ZW1wSW50IDw9IDApIHx8CisJCQkJICAgICh0ZW1wSW50ID4KKwkJCQkgICAgIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1BWCkpIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkgICJJbnZhbGlkIENoYW5uZWwgTnVtYmVyKCVkKSIsCisJCQkJCQkgIHRlbXBJbnQpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJcEVzZUJjblJlcS0+YmNuUmVxW2pdLmNoYW5uZWwgPSB0ZW1wSW50OworCQkJCWJyZWFrOworCisJCQljYXNlIDI6IC8qIFNjYW4gbW9kZSAqLworCQkJCWlmICgodGVtcEludCA8IGVTSVJfUEFTU0lWRV9TQ0FOKQorCQkJCSAgICB8fCAodGVtcEludCA+IGVTSVJfQkVBQ09OX1RBQkxFKSkgeworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJCSAgIkludmFsaWQgU2NhbiBNb2RlKCVkKSBFeHBlY3RlZHswfDF8Mn0iLAorCQkJCQkJICB0ZW1wSW50KTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCXBFc2VCY25SZXEtPmJjblJlcVtqXS5zY2FuTW9kZSA9IHRlbXBJbnQ7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLyogTWVhc3VyZW1lbnQgZHVyYXRpb24gKi8KKwkJCQlpZiAoKCh0ZW1wSW50IDw9IDApCisJCQkJICAgICAmJiAocEVzZUJjblJlcS0+YmNuUmVxW2pdLnNjYW5Nb2RlICE9CisJCQkJCSBlU0lSX0JFQUNPTl9UQUJMRSkpIHx8CisJCQkJICAgICgodGVtcEludCA8IDApICYmCisJCQkJICAgICAocEVzZUJjblJlcS0+YmNuUmVxW2pdLnNjYW5Nb2RlID09CisJCQkJCQllU0lSX0JFQUNPTl9UQUJMRSkpKSB7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJICAiSW52YWxpZCBNZWFzdXJlbWVudCBEdXJhdGlvbiglZCkiLAorCQkJCQkJICB0ZW1wSW50KTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCXBFc2VCY25SZXEtPmJjblJlcVtqXS5tZWFzdXJlbWVudER1cmF0aW9uID0KKwkJCQkJdGVtcEludDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoaiA9IDA7IGogPCBwRXNlQmNuUmVxLT5udW1CY25SZXFJZTsgaisrKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICJJbmRleCglZCkgTWVhc3VyZW1lbnQgVG9rZW4oJXUpIENoYW5uZWwoJXUpIFNjYW4gTW9kZSgldSkgTWVhc3VyZW1lbnQgRHVyYXRpb24oJXUpIiwKKwkJCSAgaiwKKwkJCSAgcEVzZUJjblJlcS0+YmNuUmVxW2pdLm1lYXN1cmVtZW50VG9rZW4sCisJCQkgIHBFc2VCY25SZXEtPmJjblJlcVtqXS5jaGFubmVsLAorCQkJICBwRXNlQmNuUmVxLT5iY25SZXFbal0uc2Nhbk1vZGUsCisJCQkgIHBFc2VCY25SZXEtPmJjblJlcVtqXS5tZWFzdXJlbWVudER1cmF0aW9uKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpICovCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisvKioKKyAqIGhkZF9wYXJzZV9nZXRfY2NrbV9pZSgpIC0gSEREIFBhcnNlIGFuZCBmZXRjaCB0aGUgQ0NLTSBJRQorICogQHBWYWx1ZToJUG9pbnRlciB0byBpbnB1dCBkYXRhCisgKiBAcENja21JZToJUG9pbnRlciB0byBvdXRwdXQgY2NrbSBJZQorICogQHBDY2ttSWVMZW46CVBvaW50ZXIgdG8gb3V0cHV0IGNja20gaWUgbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIFNFVENDS00gSUUgY29tbWFuZAorICogU0VUQ0NLTUlFPHNwYWNlPjxpZSBkYXRhPgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IGhkZF9wYXJzZV9nZXRfY2NrbV9pZSh1aW50OF90ICpwVmFsdWUsIHVpbnQ4X3QgKipwQ2NrbUllLAorCQkJCSB1aW50OF90ICpwQ2NrbUllTGVuKQoreworCXVpbnQ4X3QgKmluUHRyID0gcFZhbHVlOworCXVpbnQ4X3QgKmRhdGFFbmQ7CisJaW50IGogPSAwOworCWludCBpID0gMDsKKwl1aW50OF90IHRlbXBCeXRlID0gMDsKKwlpblB0ciA9IHN0cm5jaHIocFZhbHVlLCBzdHJsZW4ocFZhbHVlKSwgU1BBQ0VfQVNDSUlfVkFMVUUpOworCS8qIG5vIGFyZ3VtZW50IGFmdGVyIHRoZSBjb21tYW5kICovCisJaWYgKE5VTEwgPT0gaW5QdHIpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIG5vIHNwYWNlIGFmdGVyIHRoZSBjb21tYW5kICovCisJZWxzZSBpZiAoU1BBQ0VfQVNDSUlfVkFMVUUgIT0gKmluUHRyKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiByZW1vdmUgZW1wdHkgc3BhY2VzICovCisJd2hpbGUgKChTUEFDRV9BU0NJSV9WQUxVRSA9PSAqaW5QdHIpICYmICgnXDAnICE9ICppblB0cikpCisJCWluUHRyKys7CisJLyogbm8gYXJndW1lbnQgZm9sbG93ZWQgYnkgc3BhY2VzICovCisJaWYgKCdcMCcgPT0gKmluUHRyKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBmaW5kIHRoZSBsZW5ndGggb2YgZGF0YSAqLworCWRhdGFFbmQgPSBpblB0cjsKKwl3aGlsZSAoKCdcMCcgIT0gKmRhdGFFbmQpKSB7CisJCWRhdGFFbmQrKzsKKwkJKysoKnBDY2ttSWVMZW4pOworCX0KKwlpZiAoKnBDY2ttSWVMZW4gPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhcmFjdGVycworCSAqIHdoZXRoZXIgaXQgaXMgZXZlbiBvciBvZGQuCisJICogaWYgdGhlIG51bWJlciBvZiBpbnB1dCBjaGFyYWN0ZXJzIGFyZSBldmVuLCB0aGVuIHdlIG5lZWQgTiAvIDIgYnl0ZS4KKwkgKiBpZiB0aGUgbnVtYmVyIG9mIGlucHV0IGNoYXJhY3RlcnMgYXJlIG9kZCwgdGhlbiB3ZSBuZWVkIGRvCisJICogKE4gKyAxKSAvIDIgdG8gY29tcGVuc2F0ZSByb3VuZGluZyBvZmYuCisJICogRm9yIGV4YW1wbGUsIGlmIE4gPSAxOCwgdGhlbiAoMTggKyAxKSAvIDIgPSA5IGJ5dGVzIGFyZSBlbm91Z2guCisJICogSWYgTiA9IDE5LCB0aGVuIHdlIG5lZWQgMTAgYnl0ZXMsIGhlbmNlICgxOSArIDEpIC8gMiA9IDEwIGJ5dGVzCisJICovCisJKnBDY2ttSWUgPSBjZGZfbWVtX21hbGxvYygoKnBDY2ttSWVMZW4gKyAxKSAvIDIpOworCWlmIChOVUxMID09ICpwQ2NrbUllKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2RmX21lbV9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljZGZfbWVtX3plcm8oKnBDY2ttSWUsICgqcENja21JZUxlbiArIDEpIC8gMik7CisJLyoKKwkgKiB0aGUgYnVmZmVyIHJlY2VpdmVkIGZyb20gdGhlIHVwcGVyIGxheWVyIGlzIGNoYXJhY3RlciBidWZmZXIsCisJICogd2UgbmVlZCB0byBwcmVwYXJlIHRoZSBidWZmZXIgdGFraW5nIDIgY2hhcmFjdGVycyBpbiB0byBhIFU4IGhleAorCSAqIGRlY2ltYWwgbnVtYmVyIGZvciBleGFtcGxlIDdmMDAwMGYwLi4uZm9ybSBhIGJ1ZmZlciB0byBjb250YWluCisJICogN2YgaW4gMHRoIGxvY2F0aW9uLCAwMCBpbiAxc3QgYW5kIGYwIGluIDNyZCBsb2NhdGlvbgorCSAqLworCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgKnBDY2ttSWVMZW47IGogKz0gMikgeworCQl0ZW1wQnl0ZSA9IChoZXhfdG9fYmluKGluUHRyW2pdKSA8PCA0KSB8CisJCQkgICAoaGV4X3RvX2JpbihpblB0cltqICsgMV0pKTsKKwkJKCpwQ2NrbUllKVtpKytdID0gdGVtcEJ5dGU7CisJfQorCSpwQ2NrbUllTGVuID0gaTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisKK2ludCB3bGFuX2hkZF9zZXRfbWNfcmF0ZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgaW50IHRhcmdldFJhdGUpCit7CisJdFNpclJhdGVVcGRhdGVJbmQgcmF0ZVVwZGF0ZSA9IHswfTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJc3RydWN0IGhkZF9jb25maWcgKnBDb25maWcgPSBOVUxMOworCisJaWYgKHBIZGRDdHggPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBIREQgY29udGV4dCBpcyBudWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKChXTEFOX0hERF9JQlNTICE9IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgJiYKKwkgICAgKFdMQU5fSEREX1NPRlRBUCAhPSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpICYmCisJICAgIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OICE9IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiUmVjZWl2ZWQgU0VUTUNSQVRFIGNtZCBpbiBpbnZhbGlkIG1vZGUgJXMoJWQpIiksCisJCQloZGRfZGV2aWNlX21vZGVfdG9fc3RyaW5nKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJTRVRNQ1JBVEUgY21kIGlzIGFsbG93ZWQgb25seSBpbiBTVEEsIElCU1Mgb3IgU09GVEFQIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwQ29uZmlnID0gcEhkZEN0eC0+Y29uZmlnOworCXJhdGVVcGRhdGUubnNzID0gKHBDb25maWctPmVuYWJsZTJ4MiA9PSAwKSA/IDAgOiAxOworCXJhdGVVcGRhdGUuZGV2X21vZGUgPSBwQWRhcHRlci0+ZGV2aWNlX21vZGU7CisJcmF0ZVVwZGF0ZS5tY2FzdERhdGFSYXRlMjRHSHogPSB0YXJnZXRSYXRlOworCXJhdGVVcGRhdGUubWNhc3REYXRhUmF0ZTI0R0h6VHhGbGFnID0gMTsKKwlyYXRlVXBkYXRlLm1jYXN0RGF0YVJhdGU1R0h6ID0gdGFyZ2V0UmF0ZTsKKwlyYXRlVXBkYXRlLmJjYXN0RGF0YVJhdGUgPSAtMTsKKwltZW1jcHkocmF0ZVVwZGF0ZS5ic3NpZCwgcEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLAorCSAgICAgICBzaXplb2YocmF0ZVVwZGF0ZS5ic3NpZCkpOworCWhkZExvZyhMT0cxLAorCQlGTCgiTUMgVGFyZ2V0IHJhdGUgJWQsIG1hYyA9ICVwTSwgZGV2X21vZGUgJXMoJWQpIiksCisJCXJhdGVVcGRhdGUubWNhc3REYXRhUmF0ZTI0R0h6LCByYXRlVXBkYXRlLmJzc2lkLAorCQloZGRfZGV2aWNlX21vZGVfdG9fc3RyaW5nKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisJc3RhdHVzID0gc21lX3NlbmRfcmF0ZV91cGRhdGVfaW5kKHBIZGRDdHgtPmhIYWwsICZyYXRlVXBkYXRlKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IFNFVE1DUkFURSBmYWlsZWQiLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9wMnBfZGV2X2FkZHIoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQloZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCXVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQloZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfUDJQX0RFVl9BRERSX0lPQ1RMLAorCQkJIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCSh1bnNpZ25lZCkoKihoZGRfY3R4LT5wMnBEZXZpY2VBZGRyZXNzLmJ5dGVzICsgMikKKwkJCQk8PCAyNCB8ICooaGRkX2N0eC0+cDJwRGV2aWNlQWRkcmVzcy5ieXRlcworCQkJCSsgMykgPDwgMTYgfCAqKGhkZF9jdHgtPgorCQkJCXAycERldmljZUFkZHJlc3MuYnl0ZXMgKyA0KSA8PCA4IHwKKwkJCQkqKGhkZF9jdHgtPnAycERldmljZUFkZHJlc3MuYnl0ZXMgKworCQkJCTUpKSkpOworCisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgaGRkX2N0eC0+cDJwRGV2aWNlQWRkcmVzcy5ieXRlcywKKwkJCSBzaXplb2YodFNpck1hY0FkZHIpKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRydl9jbWRfcDJwX3NldF9ub2EoKSAtIEhhbmRsZXIgZm9yIFAyUF9TRVRfTk9BIGRyaXZlciBjb21tYW5kCisgKiBAYWRhcHRlcjogQWRhcHRlciBvbiB3aGljaCB0aGUgY29tbWFuZCB3YXMgcmVjZWl2ZWQKKyAqIEBoZGRfY3R4OiBIREQgZ2xvYmFsIGNvbnRleHQKKyAqIEBjb21tYW5kOiBFbnRpcmUgZHJpdmVyIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB1c2Vyc3BhY2UKKyAqIEBjb21tYW5kX2xlbjogTGVuZ3RoIG9mIEBjb21tYW5kCisgKiBAcHJpdl9kYXRhOiBQb2ludGVyIHRvIGlvY3RsIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGlzIGEgdHJpdmlhbCBjb21tYW5kIGhhbmRlciBmdW5jdGlvbiB3aGljaCBzaW1wbHkgZm9yd2FyZHMgdGhlCisgKiBjb21tYW5kIHRvIHRoZSBhY3R1YWwgY29tbWFuZCBwcm9jZXNzb3Igd2l0aGluIHRoZSBQMlAgbW9kdWxlLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZHJ2X2NtZF9wMnBfc2V0X25vYShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJICAgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkgICAgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCSAgICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJICAgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCXJldHVybiBoZGRfc2V0X3AycF9ub2EoYWRhcHRlci0+ZGV2LCBjb21tYW5kKTsKK30KKworLyoqCisgKiBkcnZfY21kX3AycF9zZXRfcHMoKSAtIEhhbmRsZXIgZm9yIFAyUF9TRVRfUFMgZHJpdmVyIGNvbW1hbmQKKyAqIEBhZGFwdGVyOiBBZGFwdGVyIG9uIHdoaWNoIHRoZSBjb21tYW5kIHdhcyByZWNlaXZlZAorICogQGhkZF9jdHg6IEhERCBnbG9iYWwgY29udGV4dAorICogQGNvbW1hbmQ6IEVudGlyZSBkcml2ZXIgY29tbWFuZCByZWNlaXZlZCBmcm9tIHVzZXJzcGFjZQorICogQGNvbW1hbmRfbGVuOiBMZW5ndGggb2YgQGNvbW1hbmQKKyAqIEBwcml2X2RhdGE6IFBvaW50ZXIgdG8gaW9jdGwgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaXMgYSB0cml2aWFsIGNvbW1hbmQgaGFuZGVyIGZ1bmN0aW9uIHdoaWNoIHNpbXBseSBmb3J3YXJkcyB0aGUKKyAqIGNvbW1hbmQgdG8gdGhlIGFjdHVhbCBjb21tYW5kIHByb2Nlc3NvciB3aXRoaW4gdGhlIFAyUCBtb2R1bGUuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBkcnZfY21kX3AycF9zZXRfcHMoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCSAgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkgICAgICB1aW50OF90ICpjb21tYW5kLAorCQkJICAgICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCSAgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCXJldHVybiBoZGRfc2V0X3AycF9vcHBzKGFkYXB0ZXItPmRldiwgY29tbWFuZCk7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfYmFuZChoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCSAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCisJdWludDhfdCAqcHRyID0gY29tbWFuZDsKKworCS8qIENoYW5nZSBiYW5kIHJlcXVlc3QgcmVjZWl2ZWQgKi8KKworCS8qCisJICogRmlyc3QgOCBieXRlcyB3aWxsIGhhdmUgIlNFVEJBTkQgIiBhbmQKKwkgKiA5IGJ5dGUgd2lsbCBoYXZlIGJhbmQgc2V0dGluZyB2YWx1ZQorCSAqLworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkgICAgICAgIiVzOiBTZXRCYW5kQ29tbWFuZCBJbmZvICBjb21tICVzIFVMICVkLCBUTCAlZCIsCisJICAgICAgIF9fZnVuY19fLCBjb21tYW5kLCBwcml2X2RhdGEtPnVzZWRfbGVuLAorCSAgICAgICBwcml2X2RhdGEtPnRvdGFsX2xlbik7CisKKwkvKiBDaGFuZ2UgYmFuZCByZXF1ZXN0IHJlY2VpdmVkICovCisJcmV0ID0gaGRkX3NldF9iYW5kX2hlbHBlcihhZGFwdGVyLT5kZXYsIHB0cik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X3dtbXBzKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkgICAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkgICAgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCXJldHVybiBoZGRfd21tcHNfaGVscGVyKGFkYXB0ZXIsIGNvbW1hbmQpOworfQorCitzdGF0aWMgaW50IGRydl9jbWRfY291bnRyeShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCSAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyByYzsKKwljaGFyICpjb3VudHJ5X2NvZGU7CisKKwljb3VudHJ5X2NvZGUgPSBjb21tYW5kICsgODsKKworCUlOSVRfQ09NUExFVElPTihhZGFwdGVyLT5jaGFuZ2VfY291bnRyeV9jb2RlKTsKKworCXN0YXR1cyA9IHNtZV9jaGFuZ2VfY291bnRyeV9jb2RlKGhkZF9jdHgtPmhIYWwsCisJCQl3bGFuX2hkZF9jaGFuZ2VfY291bnRyeV9jb2RlX2NhbGxiYWNrLAorCQkJY291bnRyeV9jb2RlLAorCQkJYWRhcHRlciwKKwkJCWhkZF9jdHgtPnBjZHNfY29udGV4dCwKKwkJCWVTSVJfVFJVRSwKKwkJCWVTSVJfVFJVRSk7CisJaWYgKHN0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoCisJCQkmYWRhcHRlci0+Y2hhbmdlX2NvdW50cnlfY29kZSwKKwkJCSBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX0NPVU5UUlkpKTsKKwkJaWYgKCFyYykKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBTTUUgd2hpbGUgc2V0dGluZyBjb3VudHJ5IGNvZGUgdGltZWQgb3V0IiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgICIlczogU01FIENoYW5nZSBDb3VudHJ5IGNvZGUgZmFpbCwgc3RhdHVzPSVkIiwKKwkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfcm9hbV90cmlnZ2VyKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJICAgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKwlpbnQ4X3QgcnNzaSA9IDA7CisJdWludDhfdCBsb29rVXBUaHJlc2hvbGQgPSBDRkdfTkVJR0hCT1JfTE9PS1VQX1JTU0lfVEhSRVNIT0xEX0RFRkFVTFQ7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkvKiBNb3ZlIHBvaW50ZXIgdG8gYWhlYWQgb2YgU0VUUk9BTVRSSUdHRVI8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG9zOCh2YWx1ZSwgMTAsICZyc3NpKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKgorCQkgKiBJZiB0aGUgaW5wdXQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heCB2YWx1ZSBvZiBkYXRhdHlwZSwKKwkJICogdGhlbiBhbHNvIGtzdHJ0b3U4IGZhaWxzCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBrc3RydG91OCBmYWlsZWQgSW5wdXQgdmFsdWUgbWF5IGJlIG91dCBvZiByYW5nZVslZCAtICVkXSIsCisJCQkgIF9fZnVuY19fLAorCQkJICBDRkdfTkVJR0hCT1JfTE9PS1VQX1JTU0lfVEhSRVNIT0xEX01JTiwKKwkJCSAgQ0ZHX05FSUdIQk9SX0xPT0tVUF9SU1NJX1RIUkVTSE9MRF9NQVgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJbG9va1VwVGhyZXNob2xkID0gYWJzKHJzc2kpOworCisJaWYgKChsb29rVXBUaHJlc2hvbGQgPCBDRkdfTkVJR0hCT1JfTE9PS1VQX1JTU0lfVEhSRVNIT0xEX01JTikKKwkgICAgfHwgKGxvb2tVcFRocmVzaG9sZCA+IENGR19ORUlHSEJPUl9MT09LVVBfUlNTSV9USFJFU0hPTERfTUFYKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIk5laWdoYm9yIGxvb2t1cCB0aHJlc2hvbGQgdmFsdWUgJWQgaXMgb3V0IG9mIHJhbmdlIChNaW46ICVkIE1heDogJWQpIiwKKwkJCSAgbG9va1VwVGhyZXNob2xkLAorCQkJICBDRkdfTkVJR0hCT1JfTE9PS1VQX1JTU0lfVEhSRVNIT0xEX01JTiwKKwkJCSAgQ0ZHX05FSUdIQk9SX0xPT0tVUF9SU1NJX1RIUkVTSE9MRF9NQVgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9TRVRST0FNVFJJR0dFUl9JT0NUTCwKKwkJCSBhZGFwdGVyLT5zZXNzaW9uSWQsIGxvb2tVcFRocmVzaG9sZCkpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSZWNlaXZlZCBDb21tYW5kIHRvIFNldCBSb2FtIHRyaWdnZXIgKE5laWdoYm9yIGxvb2t1cCB0aHJlc2hvbGQpID0gJWQiLAorCQkgIF9fZnVuY19fLAorCQkgIGxvb2tVcFRocmVzaG9sZCk7CisKKwloZGRfY3R4LT5jb25maWctPm5OZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQgPSBsb29rVXBUaHJlc2hvbGQ7CisJc3RhdHVzID0gc21lX3NldF9uZWlnaGJvcl9sb29rdXBfcnNzaV90aHJlc2hvbGQoaGRkX2N0eC0+aEhhbCwKKwkJCQkJCQlhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkJbG9va1VwVGhyZXNob2xkKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gc2V0IHJvYW0gdHJpZ2dlciwgdHJ5IGFnYWluIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX2dldF9yb2FtX3RyaWdnZXIoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCBsb29rVXBUaHJlc2hvbGQgPQorCQlzbWVfZ2V0X25laWdoYm9yX2xvb2t1cF9yc3NpX3RocmVzaG9sZChoZGRfY3R4LT5oSGFsKTsKKwlpbnQgcnNzaSA9ICgtMSkgKiBsb29rVXBUaHJlc2hvbGQ7CisJY2hhciBleHRyYVszMl07CisJdWludDhfdCBsZW4gPSAwOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9HRVRST0FNVFJJR0dFUl9JT0NUTCwKKwkJCSBhZGFwdGVyLT5zZXNzaW9uSWQsIGxvb2tVcFRocmVzaG9sZCkpOworCisJbGVuID0gc2NucHJpbnRmKGV4dHJhLCBzaXplb2YoZXh0cmEpLCAiJXMgJWQiLCBjb21tYW5kLCByc3NpKTsKKwlsZW4gPSBDREZfTUlOKHByaXZfZGF0YS0+dG90YWxfbGVuLCBsZW4gKyAxKTsKKwlpZiAoY29weV90b191c2VyKHByaXZfZGF0YS0+YnVmLCAmZXh0cmEsIGxlbikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VyIGJ1ZmZlciIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X3JvYW1fc2Nhbl9wZXJpb2QoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJdWludDhfdCAqY29tbWFuZCwKKwkJCQkJdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkJaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXVpbnQ4X3Qgcm9hbVNjYW5QZXJpb2QgPSAwOworCXVpbnQxNl90IG5laWdoYm9yRW1wdHlTY2FuUmVmcmVzaFBlcmlvZCA9CisJCUNGR19FTVBUWV9TQ0FOX1JFRlJFU0hfUEVSSU9EX0RFRkFVTFQ7CisKKwkvKiBpbnB1dCByZWZyZXNoIHBlcmlvZCBpcyBpbiB0ZXJtcyBvZiBzZWNvbmRzICovCisKKwkvKiBNb3ZlIHBvaW50ZXIgdG8gYWhlYWQgb2YgU0VUUk9BTVNDQU5QRVJJT0Q8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgMTAsICZyb2FtU2NhblBlcmlvZCk7CisJaWYgKHJldCA8IDApIHsKKwkJLyoKKwkJICogSWYgdGhlIGlucHV0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYXggdmFsdWUgb2YgZGF0YXR5cGUsCisJCSAqIHRoZW4gYWxzbyBrc3RydG91OCBmYWlscworCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczoga3N0cnRvdTggZmFpbGVkIElucHV0IHZhbHVlIG1heSBiZSBvdXQgb2YgcmFuZ2VbJWQgLSAlZF0iLAorCQkJICBfX2Z1bmNfXywKKwkJCSAgKENGR19FTVBUWV9TQ0FOX1JFRlJFU0hfUEVSSU9EX01JTiAvIDEwMDApLAorCQkJICAoQ0ZHX0VNUFRZX1NDQU5fUkVGUkVTSF9QRVJJT0RfTUFYIC8gMTAwMCkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKChyb2FtU2NhblBlcmlvZCA8IChDRkdfRU1QVFlfU0NBTl9SRUZSRVNIX1BFUklPRF9NSU4gLyAxMDAwKSkKKwkgICAgfHwgKHJvYW1TY2FuUGVyaW9kID4gKENGR19FTVBUWV9TQ0FOX1JFRlJFU0hfUEVSSU9EX01BWCAvIDEwMDApKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIlJvYW0gc2NhbiBwZXJpb2QgdmFsdWUgJWQgaXMgb3V0IG9mIHJhbmdlIChNaW46ICVkIE1heDogJWQpIiwKKwkJCSAgcm9hbVNjYW5QZXJpb2QsCisJCQkgIChDRkdfRU1QVFlfU0NBTl9SRUZSRVNIX1BFUklPRF9NSU4gLyAxMDAwKSwKKwkJCSAgKENGR19FTVBUWV9TQ0FOX1JFRlJFU0hfUEVSSU9EX01BWCAvIDEwMDApKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX1NFVFJPQU1TQ0FOUEVSSU9EX0lPQ1RMLAorCQkJIGFkYXB0ZXItPnNlc3Npb25JZCwgcm9hbVNjYW5QZXJpb2QpKTsKKwluZWlnaGJvckVtcHR5U2NhblJlZnJlc2hQZXJpb2QgPSByb2FtU2NhblBlcmlvZCAqIDEwMDA7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmVjZWl2ZWQgQ29tbWFuZCB0byBTZXQgcm9hbSBzY2FuIHBlcmlvZCAoRW1wdHkgU2NhbiByZWZyZXNoIHBlcmlvZCkgPSAlZCIsCisJCSAgX19mdW5jX18sCisJCSAgcm9hbVNjYW5QZXJpb2QpOworCisJaGRkX2N0eC0+Y29uZmlnLT5uRW1wdHlTY2FuUmVmcmVzaFBlcmlvZCA9CisJCW5laWdoYm9yRW1wdHlTY2FuUmVmcmVzaFBlcmlvZDsKKwlzbWVfdXBkYXRlX2VtcHR5X3NjYW5fcmVmcmVzaF9wZXJpb2QoaGRkX2N0eC0+aEhhbCwKKwkJCQkJICAgICBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgbmVpZ2hib3JFbXB0eVNjYW5SZWZyZXNoUGVyaW9kKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfZ2V0X3JvYW1fc2Nhbl9wZXJpb2QoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJdWludDhfdCAqY29tbWFuZCwKKwkJCQkJdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkJaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDE2X3QgbkVtcHR5U2NhblJlZnJlc2hQZXJpb2QgPQorCQlzbWVfZ2V0X2VtcHR5X3NjYW5fcmVmcmVzaF9wZXJpb2QoaGRkX2N0eC0+aEhhbCk7CisJY2hhciBleHRyYVszMl07CisJdWludDhfdCBsZW4gPSAwOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9HRVRST0FNU0NBTlBFUklPRF9JT0NUTCwKKwkJCSBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkgbkVtcHR5U2NhblJlZnJlc2hQZXJpb2QpKTsKKwlsZW4gPSBzY25wcmludGYoZXh0cmEsIHNpemVvZihleHRyYSksICIlcyAlZCIsCisJCQkiR0VUUk9BTVNDQU5QRVJJT0QiLAorCQkJKG5FbXB0eVNjYW5SZWZyZXNoUGVyaW9kIC8gMTAwMCkpOworCS8qIFJldHVybmVkIHZhbHVlIGlzIGluIHVuaXRzIG9mIHNlY29uZHMgKi8KKwlsZW4gPSBDREZfTUlOKHByaXZfZGF0YS0+dG90YWxfbGVuLCBsZW4gKyAxKTsKKwlpZiAoY29weV90b191c2VyKHByaXZfZGF0YS0+YnVmLCAmZXh0cmEsIGxlbikpIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VyIGJ1ZmZlciIpKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X3JvYW1fc2Nhbl9yZWZyZXNoX3BlcmlvZChoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJCXVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJCQl1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCQkJaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXVpbnQ4X3Qgcm9hbVNjYW5SZWZyZXNoUGVyaW9kID0gMDsKKwl1aW50MTZfdCBuZWlnaGJvclNjYW5SZWZyZXNoUGVyaW9kID0KKwkJQ0ZHX05FSUdIQk9SX1NDQU5fUkVTVUxUU19SRUZSRVNIX1BFUklPRF9ERUZBVUxUOworCisJLyogaW5wdXQgcmVmcmVzaCBwZXJpb2QgaXMgaW4gdGVybXMgb2Ygc2Vjb25kcyAqLworCS8qIE1vdmUgcG9pbnRlciB0byBhaGVhZCBvZiBTRVRST0FNU0NBTlJFRlJFU0hQRVJJT0Q8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgMTAsICZyb2FtU2NhblJlZnJlc2hQZXJpb2QpOworCWlmIChyZXQgPCAwKSB7CisJCS8qCisJCSAqIElmIHRoZSBpbnB1dCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gbWF4IHZhbHVlIG9mIGRhdGF0eXBlLAorCQkgKiB0aGVuIGFsc28ga3N0cnRvdTggZmFpbHMKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGtzdHJ0b3U4IGZhaWxlZCBJbnB1dCB2YWx1ZSBtYXkgYmUgb3V0IG9mIHJhbmdlWyVkIC0gJWRdIiwKKwkJCSAgX19mdW5jX18sCisJCQkgIENGR19ORUlHSEJPUl9TQ0FOX1JFU1VMVFNfUkVGUkVTSF9QRVJJT0RfTUlOIC8gMTAwMCwKKwkJCSAgQ0ZHX05FSUdIQk9SX1NDQU5fUkVTVUxUU19SRUZSRVNIX1BFUklPRF9NQVggLyAxMDAwKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmICgocm9hbVNjYW5SZWZyZXNoUGVyaW9kIDwKKwkJKENGR19ORUlHSEJPUl9TQ0FOX1JFU1VMVFNfUkVGUkVTSF9QRVJJT0RfTUlOIC8gMTAwMCkpCisJICAgIHx8IChyb2FtU2NhblJlZnJlc2hQZXJpb2QgPgorCQkoQ0ZHX05FSUdIQk9SX1NDQU5fUkVTVUxUU19SRUZSRVNIX1BFUklPRF9NQVggLyAxMDAwKSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJOZWlnaGJvciBzY2FuIHJlc3VsdHMgcmVmcmVzaCBwZXJpb2QgdmFsdWUgJWQgaXMgb3V0IG9mIHJhbmdlIChNaW46ICVkIE1heDogJWQpIiwKKwkJCSAgcm9hbVNjYW5SZWZyZXNoUGVyaW9kLAorCQkJICAoQ0ZHX05FSUdIQk9SX1NDQU5fUkVTVUxUU19SRUZSRVNIX1BFUklPRF9NSU4KKwkJCQkJICAgLyAxMDAwKSwKKwkJCSAgKENGR19ORUlHSEJPUl9TQ0FOX1JFU1VMVFNfUkVGUkVTSF9QRVJJT0RfTUFYCisJCQkJCSAgIC8gMTAwMCkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCW5laWdoYm9yU2NhblJlZnJlc2hQZXJpb2QgPSByb2FtU2NhblJlZnJlc2hQZXJpb2QgKiAxMDAwOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFJlY2VpdmVkIENvbW1hbmQgdG8gU2V0IHJvYW0gc2NhbiByZWZyZXNoIHBlcmlvZCAoU2NhbiByZWZyZXNoIHBlcmlvZCkgPSAlZCIsCisJCSAgX19mdW5jX18sCisJCSAgcm9hbVNjYW5SZWZyZXNoUGVyaW9kKTsKKworCWhkZF9jdHgtPmNvbmZpZy0+bk5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2QgPQorCQkJCW5laWdoYm9yU2NhblJlZnJlc2hQZXJpb2Q7CisJc21lX3NldF9uZWlnaGJvcl9zY2FuX3JlZnJlc2hfcGVyaW9kKGhkZF9jdHgtPmhIYWwsCisJCQkJCSAgICAgYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIG5laWdoYm9yU2NhblJlZnJlc2hQZXJpb2QpOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfcm9hbV9zY2FuX3JlZnJlc2hfcGVyaW9kKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJCQloZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkJdWludDhfdCAqY29tbWFuZCwKKwkJCQkJCXVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJCQloZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50MTZfdCB2YWx1ZSA9CisJCXNtZV9nZXRfbmVpZ2hib3Jfc2Nhbl9yZWZyZXNoX3BlcmlvZChoZGRfY3R4LT5oSGFsKTsKKwljaGFyIGV4dHJhWzMyXTsKKwl1aW50OF90IGxlbiA9IDA7CisKKwlsZW4gPSBzY25wcmludGYoZXh0cmEsIHNpemVvZihleHRyYSksICIlcyAlZCIsCisJCQkiR0VUUk9BTVNDQU5SRUZSRVNIUEVSSU9EIiwKKwkJCSh2YWx1ZSAvIDEwMDApKTsKKwkvKiBSZXR1cm5lZCB2YWx1ZSBpcyBpbiB1bml0cyBvZiBzZWNvbmRzICovCisJbGVuID0gQ0RGX01JTihwcml2X2RhdGEtPnRvdGFsX2xlbiwgbGVuICsgMSk7CisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX3NldF9yb2FtX21vZGUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXVpbnQ4X3Qgcm9hbU1vZGUgPSBDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9ERUZBVUxUOworCisJLyogTW92ZSBwb2ludGVyIHRvIGFoZWFkIG9mIFNFVFJPQU1NT0RFPGRlbGltaXRlcj4gKi8KKwl2YWx1ZSA9IHZhbHVlICsgU0laRV9PRl9TRVRST0FNTU9ERSArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgU0laRV9PRl9TRVRST0FNTU9ERSwgJnJvYW1Nb2RlKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKgorCQkgKiBJZiB0aGUgaW5wdXQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heCB2YWx1ZSBvZiBkYXRhdHlwZSwKKwkJICogdGhlbiBhbHNvIGtzdHJ0b3U4IGZhaWxzCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBrc3RydG91OCBmYWlsZWQgcmFuZ2UgWyVkIC0gJWRdIiwKKwkJCSAgX19mdW5jX18sIENGR19MRlJfRkVBVFVSRV9FTkFCTEVEX01JTiwKKwkJCSAgQ0ZHX0xGUl9GRUFUVVJFX0VOQUJMRURfTUFYKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKwlpZiAoKHJvYW1Nb2RlIDwgQ0ZHX0xGUl9GRUFUVVJFX0VOQUJMRURfTUlOKSB8fAorCSAgICAocm9hbU1vZGUgPiBDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9NQVgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiUm9hbSBNb2RlIHZhbHVlICVkIGlzIG91dCBvZiByYW5nZSAoTWluOiAlZCBNYXg6ICVkKSIsCisJCQkgIHJvYW1Nb2RlLAorCQkJICBDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9NSU4sCisJCQkgIENGR19MRlJfRkVBVFVSRV9FTkFCTEVEX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJICAiJXM6IFJlY2VpdmVkIENvbW1hbmQgdG8gU2V0IFJvYW0gTW9kZSA9ICVkIiwKKwkJICBfX2Z1bmNfXywgcm9hbU1vZGUpOworCS8qCisJICogTm90ZSB0aGF0CisJICogICAgIFNFVFJPQU1NT0RFIDAgaXMgdG8gZW5hYmxlIExGUiB3aGlsZQorCSAqICAgICBTRVRST0FNTU9ERSAxIGlzIHRvIGRpc2FibGUgTEZSLCBidXQKKwkgKiAgICAgbm90aWZ5X2lzX2Zhc3Rfcm9hbV9pbmlfZmVhdHVyZV9lbmFibGVkIDAvMSBpcyB0bworCSAqICAgICBlbmFibGUvZGlzYWJsZS4gU28sIHdlIGhhdmUgdG8gaW52ZXJ0IHRoZSB2YWx1ZQorCSAqICAgICB0byBjYWxsIHNtZV91cGRhdGVfaXNfZmFzdF9yb2FtX2luaV9mZWF0dXJlX2VuYWJsZWQuCisJICovCisJaWYgKENGR19MRlJfRkVBVFVSRV9FTkFCTEVEX01JTiA9PSByb2FtTW9kZSkKKwkJcm9hbU1vZGUgPSBDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9NQVg7ICAvKiBSb2FtIGVuYWJsZSAqLworCWVsc2UKKwkJcm9hbU1vZGUgPSBDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9NSU47ICAvKiBSb2FtIGRpc2FibGUgKi8KKworCWhkZF9jdHgtPmNvbmZpZy0+aXNGYXN0Um9hbUluaUZlYXR1cmVFbmFibGVkID0gcm9hbU1vZGU7CisJaWYgKHJvYW1Nb2RlKSB7CisJCWhkZF9jdHgtPmNvbmZpZy0+aXNSb2FtT2ZmbG9hZFNjYW5FbmFibGVkID0gcm9hbU1vZGU7CisJCXNtZV91cGRhdGVfcm9hbV9zY2FuX29mZmxvYWRfZW5hYmxlZCgKKwkJCSh0SGFsSGFuZGxlKShoZGRfY3R4LT5oSGFsKSwKKwkJCWhkZF9jdHgtPmNvbmZpZy0+aXNSb2FtT2ZmbG9hZFNjYW5FbmFibGVkKTsKKwkJc21lX3VwZGF0ZV9pc19mYXN0X3JvYW1faW5pX2ZlYXR1cmVfZW5hYmxlZCgKKwkJCWhkZF9jdHgtPmhIYWwsCisJCQlhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQlyb2FtTW9kZSk7CisJfSBlbHNlIHsKKwkJc21lX3VwZGF0ZV9pc19mYXN0X3JvYW1faW5pX2ZlYXR1cmVfZW5hYmxlZCgKKwkJCWhkZF9jdHgtPmhIYWwsCisJCQlhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQlyb2FtTW9kZSk7CisJCWhkZF9jdHgtPmNvbmZpZy0+aXNSb2FtT2ZmbG9hZFNjYW5FbmFibGVkID0gcm9hbU1vZGU7CisJCXNtZV91cGRhdGVfcm9hbV9zY2FuX29mZmxvYWRfZW5hYmxlZCgKKwkJCSh0SGFsSGFuZGxlKShoZGRfY3R4LT5oSGFsKSwKKwkJCWhkZF9jdHgtPmNvbmZpZy0+aXNSb2FtT2ZmbG9hZFNjYW5FbmFibGVkKTsKKwl9CisKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfZ2V0X3JvYW1fbW9kZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSB1aW50OF90ICpjb21tYW5kLAorCQkJCSB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCSBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlib29sIHJvYW1Nb2RlID0gc21lX2dldF9pc19sZnJfZmVhdHVyZV9lbmFibGVkKGhkZF9jdHgtPmhIYWwpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCS8qCisJICogcm9hbU1vZGUgdmFsdWUgc2hhbGwgYmUgaW52ZXJ0ZWQgYmVjYXVzZSB0aGUgc2VtZW50aWNzIGlzIGRpZmZlcmVudC4KKwkgKi8KKwlpZiAoQ0ZHX0xGUl9GRUFUVVJFX0VOQUJMRURfTUlOID09IHJvYW1Nb2RlKQorCQlyb2FtTW9kZSA9IENGR19MRlJfRkVBVFVSRV9FTkFCTEVEX01BWDsKKwllbHNlCisJCXJvYW1Nb2RlID0gQ0ZHX0xGUl9GRUFUVVJFX0VOQUJMRURfTUlOOworCisJbGVuID0gc2NucHJpbnRmKGV4dHJhLCBzaXplb2YoZXh0cmEpLCAiJXMgJWQiLCBjb21tYW5kLCByb2FtTW9kZSk7CisJbGVuID0gQ0RGX01JTihwcml2X2RhdGEtPnRvdGFsX2xlbiwgbGVuICsgMSk7CisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX3NldF9yb2FtX2RlbHRhKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJdWludDhfdCByb2FtUnNzaURpZmYgPSBDRkdfUk9BTV9SU1NJX0RJRkZfREVGQVVMVDsKKworCS8qIE1vdmUgcG9pbnRlciB0byBhaGVhZCBvZiBTRVRST0FNREVMVEE8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgMTAsICZyb2FtUnNzaURpZmYpOworCWlmIChyZXQgPCAwKSB7CisJCS8qCisJCSAqIElmIHRoZSBpbnB1dCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gbWF4IHZhbHVlIG9mIGRhdGF0eXBlLAorCQkgKiB0aGVuIGFsc28ga3N0cnRvdTggZmFpbHMKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGtzdHJ0b3U4IGZhaWxlZCByYW5nZSBbJWQgLSAlZF0iLAorCQkJICBfX2Z1bmNfXywgQ0ZHX1JPQU1fUlNTSV9ESUZGX01JTiwKKwkJCSAgQ0ZHX1JPQU1fUlNTSV9ESUZGX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoKHJvYW1Sc3NpRGlmZiA8IENGR19ST0FNX1JTU0lfRElGRl9NSU4pIHx8CisJICAgIChyb2FtUnNzaURpZmYgPiBDRkdfUk9BTV9SU1NJX0RJRkZfTUFYKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIlJvYW0gcnNzaSBkaWZmIHZhbHVlICVkIGlzIG91dCBvZiByYW5nZSAoTWluOiAlZCBNYXg6ICVkKSIsCisJCQkgIHJvYW1Sc3NpRGlmZiwKKwkJCSAgQ0ZHX1JPQU1fUlNTSV9ESUZGX01JTiwKKwkJCSAgQ0ZHX1JPQU1fUlNTSV9ESUZGX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmVjZWl2ZWQgQ29tbWFuZCB0byBTZXQgcm9hbSByc3NpIGRpZmYgPSAlZCIsCisJCSAgX19mdW5jX18sIHJvYW1Sc3NpRGlmZik7CisKKwloZGRfY3R4LT5jb25maWctPlJvYW1Sc3NpRGlmZiA9IHJvYW1Sc3NpRGlmZjsKKwlzbWVfdXBkYXRlX3JvYW1fcnNzaV9kaWZmKGhkZF9jdHgtPmhIYWwsCisJCQkJICBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJICByb2FtUnNzaURpZmYpOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfcm9hbV9kZWx0YShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCSAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCByb2FtUnNzaURpZmYgPQorCQlzbWVfZ2V0X3JvYW1fcnNzaV9kaWZmKGhkZF9jdHgtPmhIYWwpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfR0VUUk9BTURFTFRBX0lPQ1RMLAorCQkJIGFkYXB0ZXItPnNlc3Npb25JZCwgcm9hbVJzc2lEaWZmKSk7CisKKwlsZW4gPSBzY25wcmludGYoZXh0cmEsIHNpemVvZihleHRyYSksICIlcyAlZCIsCisJCQljb21tYW5kLCByb2FtUnNzaURpZmYpOworCWxlbiA9IENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGxlbiArIDEpOworCisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX2dldF9iYW5kKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCSAgICB1aW50OF90ICpjb21tYW5kLAorCQkJICAgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGJhbmQgPSAtMTsKKwljaGFyIGV4dHJhWzMyXTsKKwl1aW50OF90IGxlbiA9IDA7CisKKwloZGRfZ2V0X2JhbmRfaGVscGVyKGhkZF9jdHgsICZiYW5kKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfR0VUQkFORF9JT0NUTCwKKwkJCSBhZGFwdGVyLT5zZXNzaW9uSWQsIGJhbmQpKTsKKworCWxlbiA9IHNjbnByaW50ZihleHRyYSwgc2l6ZW9mKGV4dHJhKSwgIiVzICVkIiwgY29tbWFuZCwgYmFuZCk7CisJbGVuID0gQ0RGX01JTihwcml2X2RhdGEtPnRvdGFsX2xlbiwgbGVuICsgMSk7CisKKwlpZiAoY29weV90b191c2VyKHByaXZfZGF0YS0+YnVmLCAmZXh0cmEsIGxlbikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VyIGJ1ZmZlciIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X3JvYW1fc2Nhbl9jaGFubmVscyhoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCSAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkJICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCQkgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCXJldHVybiBoZGRfcGFyc2Vfc2V0X3JvYW1fc2Nhbl9jaGFubmVscyhhZGFwdGVyLCBjb21tYW5kKTsKK30KKworc3RhdGljIGludCBkcnZfY21kX2dldF9yb2FtX3NjYW5fY2hhbm5lbHMoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkJICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJCSAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkJICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90IENoYW5uZWxMaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl0gPSB7IDAgfTsKKwl1aW50OF90IG51bUNoYW5uZWxzID0gMDsKKwl1aW50OF90IGogPSAwOworCWNoYXIgZXh0cmFbMTI4XSA9IHsgMCB9OworCWludCBsZW47CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCXNtZV9nZXRfcm9hbV9zY2FuX2NoYW5uZWxfbGlzdChoZGRfY3R4LT5oSGFsLAorCQkJCQkgICAgICAgQ2hhbm5lbExpc3QsCisJCQkJCSAgICAgICAmbnVtQ2hhbm5lbHMsCisJCQkJCSAgICAgICBhZGFwdGVyLT5zZXNzaW9uSWQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IGZhaWxlZCB0byBnZXQgcm9hbSBzY2FuIGNoYW5uZWwgbGlzdCIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBleGl0OworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfR0VUUk9BTVNDQU5DSEFOTkVMU19JT0NUTCwKKwkJCSBhZGFwdGVyLT5zZXNzaW9uSWQsIG51bUNoYW5uZWxzKSk7CisJLyoKKwkgKiBvdXRwdXQgY2hhbm5lbCBsaXN0IGlzIG9mIHRoZSBmb3JtYXQKKwkgKiBbTnVtYmVyIG9mIHJvYW0gc2NhbiBjaGFubmVsc11bQ2hhbm5lbDFdW0NoYW5uZWwyXS4uLgorCSAqIGNvcHkgdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgMHRoIGluZGV4CisJICovCisJbGVuID0gc2NucHJpbnRmKGV4dHJhLCBzaXplb2YoZXh0cmEpLCAiJXMgJWQiLCBjb21tYW5kLAorCQkJbnVtQ2hhbm5lbHMpOworCWZvciAoaiA9IDA7IChqIDwgbnVtQ2hhbm5lbHMpOyBqKyspCisJCWxlbiArPSBzY25wcmludGYoZXh0cmEgKyBsZW4sIHNpemVvZihleHRyYSkgLSBsZW4sCisJCQkJICIgJWQiLCBDaGFubmVsTGlzdFtqXSk7CisKKwlsZW4gPSBDREZfTUlOKHByaXZfZGF0YS0+dG90YWxfbGVuLCBsZW4gKyAxKTsKKwlpZiAoY29weV90b191c2VyKHByaXZfZGF0YS0+YnVmLCAmZXh0cmEsIGxlbikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VyIGJ1ZmZlciIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBleGl0OworCX0KKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfZ2V0X2NjeF9tb2RlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQl1aW50OF90ICpjb21tYW5kLAorCQkJCXVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJYm9vbCBlc2VNb2RlID0gc21lX2dldF9pc19lc2VfZmVhdHVyZV9lbmFibGVkKGhkZF9jdHgtPmhIYWwpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIGZlYXR1cmVzIE9LQy9FU0UvMTFSIGFyZSBzdXBwb3J0ZWQgc2ltdWx0YW5lb3VzbHksCisJICogdGhlbiB0aGlzIG9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkIChyZXR1cm4gRkFJTFVSRSkKKwkgKi8KKwlpZiAoZXNlTW9kZSAmJgorCSAgICBoZGRfaXNfb2tjX21vZGVfZW5hYmxlZChoZGRfY3R4KSAmJgorCSAgICBzbWVfZ2V0X2lzX2Z0X2ZlYXR1cmVfZW5hYmxlZChoZGRfY3R4LT5oSGFsKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICAiJXM6IE9LQy9FU0UvMTFSIGFyZSBzdXBwb3J0ZWQgc2ltdWx0YW5lb3VzbHkgaGVuY2UgdGhpcyBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZCEiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FUEVSTTsKKwkJZ290byBleGl0OworCX0KKworCWxlbiA9IHNjbnByaW50ZihleHRyYSwgc2l6ZW9mKGV4dHJhKSwgIiVzICVkIiwKKwkJCSJHRVRDQ1hNT0RFIiwgZXNlTW9kZSk7CisJbGVuID0gQ0RGX01JTihwcml2X2RhdGEtPnRvdGFsX2xlbiwgbGVuICsgMSk7CisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX2dldF9va2NfbW9kZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJdWludDhfdCAqY29tbWFuZCwKKwkJCQl1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCWhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCWJvb2wgb2tjTW9kZSA9IGhkZF9pc19va2NfbW9kZV9lbmFibGVkKGhkZF9jdHgpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIGZlYXR1cmVzIE9LQy9FU0UvMTFSIGFyZSBzdXBwb3J0ZWQgc2ltdWx0YW5lb3VzbHksCisJICogdGhlbiB0aGlzIG9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkIChyZXR1cm4gRkFJTFVSRSkKKwkgKi8KKwlpZiAob2tjTW9kZSAmJgorCSAgICBzbWVfZ2V0X2lzX2VzZV9mZWF0dXJlX2VuYWJsZWQoaGRkX2N0eC0+aEhhbCkgJiYKKwkgICAgc21lX2dldF9pc19mdF9mZWF0dXJlX2VuYWJsZWQoaGRkX2N0eC0+aEhhbCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSAgIiVzOiBPS0MvRVNFLzExUiBhcmUgc3VwcG9ydGVkIHNpbXVsdGFuZW91c2x5IGhlbmNlIHRoaXMgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQhIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gZXhpdDsKKwl9CisKKwlsZW4gPSBzY25wcmludGYoZXh0cmEsIHNpemVvZihleHRyYSksICIlcyAlZCIsCisJCQkiR0VUT0tDTU9ERSIsIG9rY01vZGUpOworCWxlbiA9IENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGxlbiArIDEpOworCisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX2dldF9mYXN0X3JvYW0oaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJYm9vbCBsZnJNb2RlID0gc21lX2dldF9pc19sZnJfZmVhdHVyZV9lbmFibGVkKGhkZF9jdHgtPmhIYWwpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCWxlbiA9IHNjbnByaW50ZihleHRyYSwgc2l6ZW9mKGV4dHJhKSwgIiVzICVkIiwKKwkJCSJHRVRGQVNUUk9BTSIsIGxmck1vZGUpOworCWxlbiA9IENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGxlbiArIDEpOworCisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX2dldF9mYXN0X3RyYW5zaXRpb24oaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgICAgICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgICAgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJYm9vbCBmdCA9IHNtZV9nZXRfaXNfZnRfZmVhdHVyZV9lbmFibGVkKGhkZF9jdHgtPmhIYWwpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCWxlbiA9IHNjbnByaW50ZihleHRyYSwgc2l6ZW9mKGV4dHJhKSwgIiVzICVkIiwKKwkJCQkJIkdFVEZBU1RUUkFOU0lUSU9OIiwgZnQpOworCWxlbiA9IENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGxlbiArIDEpOworCisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX3NldF9yb2FtX3NjYW5fY2hhbm5lbF9taW5fdGltZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkJICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkJICB1aW50OF90ICpjb21tYW5kLAorCQkJCQkJICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCQkJICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJdWludDhfdCBtaW5UaW1lID0gQ0ZHX05FSUdIQk9SX1NDQU5fTUlOX0NIQU5fVElNRV9ERUZBVUxUOworCisJLyogTW92ZSBwb2ludGVyIHRvIGFoZWFkIG9mIFNFVFJPQU1TQ0FOQ0hBTk5FTE1JTlRJTUU8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgMTAsICZtaW5UaW1lKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKgorCQkgKiBJZiB0aGUgaW5wdXQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heCB2YWx1ZSBvZiBkYXRhdHlwZSwKKwkJICogdGhlbiBhbHNvIGtzdHJ0b3U4IGZhaWxzCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBrc3RydG91OCBmYWlsZWQgcmFuZ2UgWyVkIC0gJWRdIiwKKwkJCSAgX19mdW5jX18sCisJCQkgIENGR19ORUlHSEJPUl9TQ0FOX01JTl9DSEFOX1RJTUVfTUlOLAorCQkJICBDRkdfTkVJR0hCT1JfU0NBTl9NSU5fQ0hBTl9USU1FX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoKG1pblRpbWUgPCBDRkdfTkVJR0hCT1JfU0NBTl9NSU5fQ0hBTl9USU1FX01JTikgfHwKKwkgICAgKG1pblRpbWUgPiBDRkdfTkVJR0hCT1JfU0NBTl9NSU5fQ0hBTl9USU1FX01BWCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJzY2FuIG1pbiBjaGFubmVsIHRpbWUgdmFsdWUgJWQgaXMgb3V0IG9mIHJhbmdlIChNaW46ICVkIE1heDogJWQpIiwKKwkJCSAgbWluVGltZSwKKwkJCSAgQ0ZHX05FSUdIQk9SX1NDQU5fTUlOX0NIQU5fVElNRV9NSU4sCisJCQkgIENGR19ORUlHSEJPUl9TQ0FOX01JTl9DSEFOX1RJTUVfTUFYKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfU0VUUk9BTVNDQU5DSEFOTkVMTUlOVElNRV9JT0NUTCwKKwkJCSBhZGFwdGVyLT5zZXNzaW9uSWQsIG1pblRpbWUpKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmVjZWl2ZWQgQ29tbWFuZCB0byBjaGFuZ2UgY2hhbm5lbCBtaW4gdGltZSA9ICVkIiwKKwkJICBfX2Z1bmNfXywgbWluVGltZSk7CisKKwloZGRfY3R4LT5jb25maWctPm5OZWlnaGJvclNjYW5NaW5DaGFuVGltZSA9IG1pblRpbWU7CisJc21lX3NldF9uZWlnaGJvcl9zY2FuX21pbl9jaGFuX3RpbWUoaGRkX2N0eC0+aEhhbCwKKwkJCQkJICAgIG1pblRpbWUsCisJCQkJCSAgICBhZGFwdGVyLT5zZXNzaW9uSWQpOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZW5kX2FjdGlvbl9mcmFtZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCSAgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJcmV0dXJuIGhkZF9wYXJzZV9zZW5kYWN0aW9uZnJhbWUoYWRhcHRlciwgY29tbWFuZCk7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfcm9hbV9zY2FuX2NoYW5uZWxfbWluX3RpbWUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkJCSAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJCSAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkJCSAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkJCSAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDE2X3QgdmFsID0gc21lX2dldF9uZWlnaGJvcl9zY2FuX21pbl9jaGFuX3RpbWUoaGRkX2N0eC0+aEhhbCwKKwkJCQkJCWFkYXB0ZXItPnNlc3Npb25JZCk7CisJY2hhciBleHRyYVszMl07CisJdWludDhfdCBsZW4gPSAwOworCisJLyogdmFsdWUgaXMgaW50ZXJtcyBvZiBtc2VjICovCisJbGVuID0gc2NucHJpbnRmKGV4dHJhLCBzaXplb2YoZXh0cmEpLCAiJXMgJWQiLAorCQkJIkdFVFJPQU1TQ0FOQ0hBTk5FTE1JTlRJTUUiLCB2YWwpOworCWxlbiA9IENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGxlbiArIDEpOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9HRVRST0FNU0NBTkNIQU5ORUxNSU5USU1FX0lPQ1RMLAorCQkJIGFkYXB0ZXItPnNlc3Npb25JZCwgdmFsKSk7CisKKwlpZiAoY29weV90b191c2VyKHByaXZfZGF0YS0+YnVmLCAmZXh0cmEsIGxlbikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VyIGJ1ZmZlciIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X3NjYW5fY2hhbm5lbF90aW1lKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJCSBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkgdWludDhfdCAqY29tbWFuZCwKKwkJCQkJIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJCSBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJdWludDE2X3QgbWF4VGltZSA9IENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfREVGQVVMVDsKKworCS8qIE1vdmUgcG9pbnRlciB0byBhaGVhZCBvZiBTRVRTQ0FOQ0hBTk5FTFRJTUU8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91MTYodmFsdWUsIDEwLCAmbWF4VGltZSk7CisJaWYgKHJldCA8IDApIHsKKwkJLyoKKwkJICogSWYgdGhlIGlucHV0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYXggdmFsdWUgb2YgZGF0YXR5cGUsCisJCSAqIHRoZW4gYWxzbyBrc3RydG91OCBmYWlscworCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczoga3N0cnRvdTE2IGZhaWxlZCByYW5nZSBbJWQgLSAlZF0iLAorCQkJICBfX2Z1bmNfXywKKwkJCSAgQ0ZHX05FSUdIQk9SX1NDQU5fTUFYX0NIQU5fVElNRV9NSU4sCisJCQkgIENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfTUFYKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmICgobWF4VGltZSA8IENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfTUlOKSB8fAorCSAgICAobWF4VGltZSA+IENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfTUFYKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgImxmciBtb2RlIHZhbHVlICVkIGlzIG91dCBvZiByYW5nZSAoTWluOiAlZCBNYXg6ICVkKSIsCisJCQkgIG1heFRpbWUsCisJCQkgIENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfTUlOLAorCQkJICBDRkdfTkVJR0hCT1JfU0NBTl9NQVhfQ0hBTl9USU1FX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmVjZWl2ZWQgQ29tbWFuZCB0byBjaGFuZ2UgY2hhbm5lbCBtYXggdGltZSA9ICVkIiwKKwkJICBfX2Z1bmNfXywgbWF4VGltZSk7CisKKwloZGRfY3R4LT5jb25maWctPm5OZWlnaGJvclNjYW5NYXhDaGFuVGltZSA9IG1heFRpbWU7CisJc21lX3NldF9uZWlnaGJvcl9zY2FuX21heF9jaGFuX3RpbWUoaGRkX2N0eC0+aEhhbCwKKwkJCQkJICAgIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgIG1heFRpbWUpOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfc2Nhbl9jaGFubmVsX3RpbWUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkJIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCSB1aW50OF90ICpjb21tYW5kLAorCQkJCQkgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkJIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQxNl90IHZhbCA9IHNtZV9nZXRfbmVpZ2hib3Jfc2Nhbl9tYXhfY2hhbl90aW1lKGhkZF9jdHgtPmhIYWwsCisJCQkJYWRhcHRlci0+c2Vzc2lvbklkKTsKKwljaGFyIGV4dHJhWzMyXTsKKwl1aW50OF90IGxlbiA9IDA7CisKKwkvKiB2YWx1ZSBpcyBpbnRlcm1zIG9mIG1zZWMgKi8KKwlsZW4gPSBzY25wcmludGYoZXh0cmEsIHNpemVvZihleHRyYSksICIlcyAlZCIsCisJCQkiR0VUU0NBTkNIQU5ORUxUSU1FIiwgdmFsKTsKKwlsZW4gPSBDREZfTUlOKHByaXZfZGF0YS0+dG90YWxfbGVuLCBsZW4gKyAxKTsKKworCWlmIChjb3B5X3RvX3VzZXIocHJpdl9kYXRhLT5idWYsICZleHRyYSwgbGVuKSkgeworCQkJIENERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIiVzOiBmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX3NldF9zY2FuX2hvbWVfdGltZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICAgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCSAgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKwl1aW50MTZfdCB2YWwgPSBDRkdfTkVJR0hCT1JfU0NBTl9USU1FUl9QRVJJT0RfREVGQVVMVDsKKworCS8qIE1vdmUgcG9pbnRlciB0byBhaGVhZCBvZiBTRVRTQ0FOSE9NRVRJTUU8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91MTYodmFsdWUsIDEwLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKgorCQkgKiBJZiB0aGUgaW5wdXQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heCB2YWx1ZSBvZiBkYXRhdHlwZSwKKwkJICogdGhlbiBhbHNvIGtzdHJ0b3U4IGZhaWxzCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBrc3RydG91MTYgZmFpbGVkIHJhbmdlIFslZCAtICVkXSIsCisJCQkgIF9fZnVuY19fLAorCQkJICBDRkdfTkVJR0hCT1JfU0NBTl9USU1FUl9QRVJJT0RfTUlOLAorCQkJICBDRkdfTkVJR0hCT1JfU0NBTl9USU1FUl9QRVJJT0RfTUFYKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmICgodmFsIDwgQ0ZHX05FSUdIQk9SX1NDQU5fVElNRVJfUEVSSU9EX01JTikgfHwKKwkgICAgKHZhbCA+IENGR19ORUlHSEJPUl9TQ0FOX1RJTUVSX1BFUklPRF9NQVgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAic2NhbiBob21lIHRpbWUgdmFsdWUgJWQgaXMgb3V0IG9mIHJhbmdlIChNaW46ICVkIE1heDogJWQpIiwKKwkJCSAgdmFsLAorCQkJICBDRkdfTkVJR0hCT1JfU0NBTl9USU1FUl9QRVJJT0RfTUlOLAorCQkJICBDRkdfTkVJR0hCT1JfU0NBTl9USU1FUl9QRVJJT0RfTUFYKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSZWNlaXZlZCBDb21tYW5kIHRvIGNoYW5nZSBzY2FuIGhvbWUgdGltZSA9ICVkIiwKKwkJICBfX2Z1bmNfXywgdmFsKTsKKworCWhkZF9jdHgtPmNvbmZpZy0+bk5laWdoYm9yU2NhblBlcmlvZCA9IHZhbDsKKwlzbWVfc2V0X25laWdoYm9yX3NjYW5fcGVyaW9kKGhkZF9jdHgtPmhIYWwsCisJCQkJICAgICBhZGFwdGVyLT5zZXNzaW9uSWQsIHZhbCk7CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX2dldF9zY2FuX2hvbWVfdGltZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICAgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCSAgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQxNl90IHZhbCA9IHNtZV9nZXRfbmVpZ2hib3Jfc2Nhbl9wZXJpb2QoaGRkX2N0eC0+aEhhbCwKKwkJCQkJCSAgICBhZGFwdGVyLT4KKwkJCQkJCSAgICBzZXNzaW9uSWQpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCS8qIHZhbHVlIGlzIGludGVybXMgb2YgbXNlYyAqLworCWxlbiA9IHNjbnByaW50ZihleHRyYSwgc2l6ZW9mKGV4dHJhKSwgIiVzICVkIiwKKwkJCSJHRVRTQ0FOSE9NRVRJTUUiLCB2YWwpOworCWxlbiA9IENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGxlbiArIDEpOworCisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX3NldF9yb2FtX2ludHJhX2JhbmQoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgICAgICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgICAgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXVpbnQ4X3QgdmFsID0gQ0ZHX1JPQU1fSU5UUkFfQkFORF9ERUZBVUxUOworCisJLyogTW92ZSBwb2ludGVyIHRvIGFoZWFkIG9mIFNFVFJPQU1JTlRSQUJBTkQ8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgMTAsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCS8qCisJCSAqIElmIHRoZSBpbnB1dCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gbWF4IHZhbHVlIG9mIGRhdGF0eXBlLAorCQkgKiB0aGVuIGFsc28ga3N0cnRvdTggZmFpbHMKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGtzdHJ0b3U4IGZhaWxlZCByYW5nZSBbJWQgLSAlZF0iLAorCQkJICBfX2Z1bmNfXywgQ0ZHX1JPQU1fSU5UUkFfQkFORF9NSU4sCisJCQkgIENGR19ST0FNX0lOVFJBX0JBTkRfTUFYKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmICgodmFsIDwgQ0ZHX1JPQU1fSU5UUkFfQkFORF9NSU4pIHx8CisJICAgICh2YWwgPiBDRkdfUk9BTV9JTlRSQV9CQU5EX01BWCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJpbnRyYSBiYW5kIG1vZGUgdmFsdWUgJWQgaXMgb3V0IG9mIHJhbmdlIChNaW46ICVkIE1heDogJWQpIiwKKwkJCSAgdmFsLAorCQkJICBDRkdfUk9BTV9JTlRSQV9CQU5EX01JTiwKKwkJCSAgQ0ZHX1JPQU1fSU5UUkFfQkFORF9NQVgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSZWNlaXZlZCBDb21tYW5kIHRvIGNoYW5nZSBpbnRyYSBiYW5kID0gJWQiLAorCQkgIF9fZnVuY19fLCB2YWwpOworCisJaGRkX2N0eC0+Y29uZmlnLT5uUm9hbUludHJhQmFuZCA9IHZhbDsKKwlzbWVfc2V0X3JvYW1faW50cmFfYmFuZChoZGRfY3R4LT5oSGFsLCB2YWwpOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfcm9hbV9pbnRyYV9iYW5kKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICAgICAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJICAgICAgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJICAgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQxNl90IHZhbCA9IHNtZV9nZXRfcm9hbV9pbnRyYV9iYW5kKGhkZF9jdHgtPmhIYWwpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCS8qIHZhbHVlIGlzIGludGVybXMgb2YgbXNlYyAqLworCWxlbiA9IHNjbnByaW50ZihleHRyYSwgc2l6ZW9mKGV4dHJhKSwgIiVzICVkIiwKKwkJCSJHRVRST0FNSU5UUkFCQU5EIiwgdmFsKTsKKwlsZW4gPSBDREZfTUlOKHByaXZfZGF0YS0+dG90YWxfbGVuLCBsZW4gKyAxKTsKKwlpZiAoY29weV90b191c2VyKHByaXZfZGF0YS0+YnVmLCAmZXh0cmEsIGxlbikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VyIGJ1ZmZlciIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X3NjYW5fbl9wcm9iZXMoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICAgICB1aW50OF90ICpjb21tYW5kLAorCQkJCSAgICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKwl1aW50OF90IG5Qcm9iZXMgPSBDRkdfUk9BTV9TQ0FOX05fUFJPQkVTX0RFRkFVTFQ7CisKKwkvKiBNb3ZlIHBvaW50ZXIgdG8gYWhlYWQgb2YgU0VUU0NBTk5QUk9CRVM8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgMTAsICZuUHJvYmVzKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKgorCQkgKiBJZiB0aGUgaW5wdXQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heCB2YWx1ZSBvZiBkYXRhdHlwZSwKKwkJICogdGhlbiBhbHNvIGtzdHJ0b3U4IGZhaWxzCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBrc3RydG91OCBmYWlsZWQgcmFuZ2UgWyVkIC0gJWRdIiwKKwkJCSAgX19mdW5jX18sIENGR19ST0FNX1NDQU5fTl9QUk9CRVNfTUlOLAorCQkJICBDRkdfUk9BTV9TQ0FOX05fUFJPQkVTX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoKG5Qcm9iZXMgPCBDRkdfUk9BTV9TQ0FOX05fUFJPQkVTX01JTikgfHwKKwkgICAgKG5Qcm9iZXMgPiBDRkdfUk9BTV9TQ0FOX05fUFJPQkVTX01BWCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJOUHJvYmVzIHZhbHVlICVkIGlzIG91dCBvZiByYW5nZSAoTWluOiAlZCBNYXg6ICVkKSIsCisJCQkgIG5Qcm9iZXMsCisJCQkgIENGR19ST0FNX1NDQU5fTl9QUk9CRVNfTUlOLAorCQkJICBDRkdfUk9BTV9TQ0FOX05fUFJPQkVTX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmVjZWl2ZWQgQ29tbWFuZCB0byBTZXQgblByb2JlcyA9ICVkIiwKKwkJICBfX2Z1bmNfXywgblByb2Jlcyk7CisKKwloZGRfY3R4LT5jb25maWctPm5Qcm9iZXMgPSBuUHJvYmVzOworCXNtZV91cGRhdGVfcm9hbV9zY2FuX25fcHJvYmVzKGhkZF9jdHgtPmhIYWwsCisJCQkJICAgICAgYWRhcHRlci0+c2Vzc2lvbklkLCBuUHJvYmVzKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfZ2V0X3NjYW5fbl9wcm9iZXMoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICAgICB1aW50OF90ICpjb21tYW5kLAorCQkJCSAgICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQ4X3QgdmFsID0gc21lX2dldF9yb2FtX3NjYW5fbl9wcm9iZXMoaGRkX2N0eC0+aEhhbCk7CisJY2hhciBleHRyYVszMl07CisJdWludDhfdCBsZW4gPSAwOworCisJbGVuID0gc2NucHJpbnRmKGV4dHJhLCBzaXplb2YoZXh0cmEpLCAiJXMgJWQiLCBjb21tYW5kLCB2YWwpOworCWxlbiA9IENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGxlbiArIDEpOworCWlmIChjb3B5X3RvX3VzZXIocHJpdl9kYXRhLT5idWYsICZleHRyYSwgbGVuKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXQgPSAtRUZBVUxUOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfc2Nhbl9ob21lX2F3YXlfdGltZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkgICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkgICB1aW50OF90ICpjb21tYW5kLAorCQkJCQkgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCQkgICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJdWludDE2X3QgaG9tZUF3YXlUaW1lID0gQ0ZHX1JPQU1fU0NBTl9IT01FX0FXQVlfVElNRV9ERUZBVUxUOworCisJLyogaW5wdXQgdmFsdWUgaXMgaW4gdW5pdHMgb2YgbXNlYyAqLworCisJLyogTW92ZSBwb2ludGVyIHRvIGFoZWFkIG9mIFNFVFNDQU5IT01FQVdBWVRJTUU8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91MTYodmFsdWUsIDEwLCAmaG9tZUF3YXlUaW1lKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKgorCQkgKiBJZiB0aGUgaW5wdXQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heCB2YWx1ZSBvZiBkYXRhdHlwZSwKKwkJICogdGhlbiBhbHNvIGtzdHJ0b3U4IGZhaWxzCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBrc3RydG91OCBmYWlsZWQgcmFuZ2UgWyVkIC0gJWRdIiwKKwkJCSAgX19mdW5jX18sCisJCQkgIENGR19ST0FNX1NDQU5fSE9NRV9BV0FZX1RJTUVfTUlOLAorCQkJICBDRkdfUk9BTV9TQ0FOX0hPTUVfQVdBWV9USU1FX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoKGhvbWVBd2F5VGltZSA8IENGR19ST0FNX1NDQU5fSE9NRV9BV0FZX1RJTUVfTUlOKSB8fAorCSAgICAoaG9tZUF3YXlUaW1lID4gQ0ZHX1JPQU1fU0NBTl9IT01FX0FXQVlfVElNRV9NQVgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiaG9tZUF3YXlUaW1lIHZhbHVlICVkIGlzIG91dCBvZiByYW5nZSAoTWluOiAlZCBNYXg6ICVkKSIsCisJCQkgIGhvbWVBd2F5VGltZSwKKwkJCSAgQ0ZHX1JPQU1fU0NBTl9IT01FX0FXQVlfVElNRV9NSU4sCisJCQkgIENGR19ST0FNX1NDQU5fSE9NRV9BV0FZX1RJTUVfTUFYKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSZWNlaXZlZCBDb21tYW5kIHRvIFNldCBzY2FuIGF3YXkgdGltZSA9ICVkIiwKKwkJICBfX2Z1bmNfXywgaG9tZUF3YXlUaW1lKTsKKworCWlmIChoZGRfY3R4LT5jb25maWctPm5Sb2FtU2NhbkhvbWVBd2F5VGltZSAhPQorCSAgICBob21lQXdheVRpbWUpIHsKKwkJaGRkX2N0eC0+Y29uZmlnLT5uUm9hbVNjYW5Ib21lQXdheVRpbWUgPSBob21lQXdheVRpbWU7CisJCXNtZV91cGRhdGVfcm9hbV9zY2FuX2hvbWVfYXdheV90aW1lKGhkZF9jdHgtPmhIYWwsCisJCQkJCQkgICAgYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJICAgIGhvbWVBd2F5VGltZSwKKwkJCQkJCSAgICB0cnVlKTsKKwl9CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX2dldF9zY2FuX2hvbWVfYXdheV90aW1lKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJCSAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCSAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJCSAgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJCSAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQxNl90IHZhbCA9IHNtZV9nZXRfcm9hbV9zY2FuX2hvbWVfYXdheV90aW1lKGhkZF9jdHgtPmhIYWwpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCWxlbiA9IHNjbnByaW50ZihleHRyYSwgc2l6ZW9mKGV4dHJhKSwgIiVzICVkIiwgY29tbWFuZCwgdmFsKTsKKwlsZW4gPSBDREZfTUlOKHByaXZfZGF0YS0+dG90YWxfbGVuLCBsZW4gKyAxKTsKKworCWlmIChjb3B5X3RvX3VzZXIocHJpdl9kYXRhLT5idWYsICZleHRyYSwgbGVuKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXQgPSAtRUZBVUxUOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9yZWFzc29jKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJICAgdWludDhfdCAqY29tbWFuZCwKKwkJCSAgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkgICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlyZXR1cm4gaGRkX3BhcnNlX3JlYXNzb2MoYWRhcHRlciwgY29tbWFuZCk7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfd2VzX21vZGUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQloZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCXVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQloZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJdWludDhfdCB3ZXNNb2RlID0gQ0ZHX0VOQUJMRV9XRVNfTU9ERV9OQU1FX0RFRkFVTFQ7CisKKwkvKiBNb3ZlIHBvaW50ZXIgdG8gYWhlYWQgb2YgU0VUV0VTTU9ERTxkZWxpbWl0ZXI+ICovCisJdmFsdWUgPSB2YWx1ZSArIGNvbW1hbmRfbGVuICsgMTsKKworCS8qIENvbnZlcnQgdGhlIHZhbHVlIGZyb20gYXNjaWkgdG8gaW50ZWdlciAqLworCXJldCA9IGtzdHJ0b3U4KHZhbHVlLCAxMCwgJndlc01vZGUpOworCWlmIChyZXQgPCAwKSB7CisJCS8qCisJCSAqIElmIHRoZSBpbnB1dCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gbWF4IHZhbHVlIG9mIGRhdGF0eXBlLAorCQkgKiB0aGVuIGFsc28ga3N0cnRvdTggZmFpbHMKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGtzdHJ0b3U4IGZhaWxlZCByYW5nZSBbJWQgLSAlZF0iLAorCQkJICBfX2Z1bmNfXywKKwkJCSAgQ0ZHX0VOQUJMRV9XRVNfTU9ERV9OQU1FX01JTiwKKwkJCSAgQ0ZHX0VOQUJMRV9XRVNfTU9ERV9OQU1FX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoKHdlc01vZGUgPCBDRkdfRU5BQkxFX1dFU19NT0RFX05BTUVfTUlOKSB8fAorCSAgICAod2VzTW9kZSA+IENGR19FTkFCTEVfV0VTX01PREVfTkFNRV9NQVgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiV0VTIE1vZGUgdmFsdWUgJWQgaXMgb3V0IG9mIHJhbmdlIChNaW46ICVkIE1heDogJWQpIiwKKwkJCSAgd2VzTW9kZSwKKwkJCSAgQ0ZHX0VOQUJMRV9XRVNfTU9ERV9OQU1FX01JTiwKKwkJCSAgQ0ZHX0VOQUJMRV9XRVNfTU9ERV9OQU1FX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmVjZWl2ZWQgQ29tbWFuZCB0byBTZXQgV0VTIE1vZGUgcnNzaSBkaWZmID0gJWQiLAorCQkgIF9fZnVuY19fLCB3ZXNNb2RlKTsKKworCWhkZF9jdHgtPmNvbmZpZy0+aXNXRVNNb2RlRW5hYmxlZCA9IHdlc01vZGU7CisJc21lX3VwZGF0ZV93ZXNfbW9kZShoZGRfY3R4LT5oSGFsLCB3ZXNNb2RlLCBhZGFwdGVyLT5zZXNzaW9uSWQpOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfd2VzX21vZGUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQloZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCXVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQloZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlib29sIHdlc01vZGUgPSBzbWVfZ2V0X3dlc19tb2RlKGhkZF9jdHgtPmhIYWwpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCWxlbiA9IHNjbnByaW50ZihleHRyYSwgc2l6ZW9mKGV4dHJhKSwgIiVzICVkIiwgY29tbWFuZCwgd2VzTW9kZSk7CisJbGVuID0gQ0RGX01JTihwcml2X2RhdGEtPnRvdGFsX2xlbiwgbGVuICsgMSk7CisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX3NldF9vcHBvcnR1bmlzdGljX3Jzc2lfZGlmZihoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkgICAgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJICAgICAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJCSAgICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCQkgICAgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXVpbnQ4X3Qgbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmID0KKwkJQ0ZHX09QUE9SVFVOSVNUSUNfU0NBTl9USFJFU0hPTERfRElGRl9ERUZBVUxUOworCisJLyogTW92ZSBwb2ludGVyIHRvIGFoZWFkIG9mIFNFVE9QUE9SVFVOSVNUSUNSU1NJRElGRjxkZWxpbWl0ZXI+ICovCisJdmFsdWUgPSB2YWx1ZSArIGNvbW1hbmRfbGVuICsgMTsKKworCS8qIENvbnZlcnQgdGhlIHZhbHVlIGZyb20gYXNjaWkgdG8gaW50ZWdlciAqLworCXJldCA9IGtzdHJ0b3U4KHZhbHVlLCAxMCwgJm5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZik7CisJaWYgKHJldCA8IDApIHsKKwkJLyoKKwkJICogSWYgdGhlIGlucHV0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYXggdmFsdWUgb2YgZGF0YXR5cGUsCisJCSAqIHRoZW4gYWxzbyBrc3RydG91OCBmYWlscworCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczoga3N0cnRvdTggZmFpbGVkLiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSZWNlaXZlZCBDb21tYW5kIHRvIFNldCBPcHBvcnR1bmlzdGljIFRocmVzaG9sZCBkaWZmID0gJWQiLAorCQkgIF9fZnVuY19fLCBuT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmYpOworCisJc21lX3NldF9yb2FtX29wcG9ydHVuaXN0aWNfc2Nhbl90aHJlc2hvbGRfZGlmZihoZGRfY3R4LT5oSGFsLAorCQkJCWFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQluT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmYpOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfb3Bwb3J0dW5pc3RpY19yc3NpX2RpZmYoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkJICAgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCSAgICAgICB1aW50OF90ICpjb21tYW5kLAorCQkJCQkgICAgICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkJICAgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCWludDhfdCB2YWwgPSBzbWVfZ2V0X3JvYW1fb3Bwb3J0dW5pc3RpY19zY2FuX3RocmVzaG9sZF9kaWZmKAorCQkJaGRkX2N0eC0+aEhhbCk7CisJY2hhciBleHRyYVszMl07CisJdWludDhfdCBsZW4gPSAwOworCisJbGVuID0gc2NucHJpbnRmKGV4dHJhLCBzaXplb2YoZXh0cmEpLCAiJXMgJWQiLCBjb21tYW5kLCB2YWwpOworCWxlbiA9IENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGxlbiArIDEpOworCWlmIChjb3B5X3RvX3VzZXIocHJpdl9kYXRhLT5idWYsICZleHRyYSwgbGVuKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXQgPSAtRUZBVUxUOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfcm9hbV9yZXNjYW5fcnNzaV9kaWZmKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJCSAgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJICAgICB1aW50OF90ICpjb21tYW5kLAorCQkJCQkgICAgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJCSAgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXVpbnQ4X3QgblJvYW1SZXNjYW5Sc3NpRGlmZiA9IENGR19ST0FNX1JFU0NBTl9SU1NJX0RJRkZfREVGQVVMVDsKKworCS8qIE1vdmUgcG9pbnRlciB0byBhaGVhZCBvZiBTRVRST0FNUkVTQ0FOUlNTSURJRkY8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgMTAsICZuUm9hbVJlc2NhblJzc2lEaWZmKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKgorCQkgKiBJZiB0aGUgaW5wdXQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heCB2YWx1ZSBvZiBkYXRhdHlwZSwKKwkJICogdGhlbiBhbHNvIGtzdHJ0b3U4IGZhaWxzCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBrc3RydG91OCBmYWlsZWQuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFJlY2VpdmVkIENvbW1hbmQgdG8gU2V0IFJvYW0gUmVzY2FuIFJTU0kgRGlmZiA9ICVkIiwKKwkJICBfX2Z1bmNfXywgblJvYW1SZXNjYW5Sc3NpRGlmZik7CisKKwlzbWVfc2V0X3JvYW1fcmVzY2FuX3Jzc2lfZGlmZihoZGRfY3R4LT5oSGFsLAorCQkJCSAgICAgIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkgICAgICBuUm9hbVJlc2NhblJzc2lEaWZmKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfZ2V0X3JvYW1fcmVzY2FuX3Jzc2lfZGlmZihoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCSAgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkJICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCQkgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQ4X3QgdmFsID0gc21lX2dldF9yb2FtX3Jlc2Nhbl9yc3NpX2RpZmYoaGRkX2N0eC0+aEhhbCk7CisJY2hhciBleHRyYVszMl07CisJdWludDhfdCBsZW4gPSAwOworCisJbGVuID0gc2NucHJpbnRmKGV4dHJhLCBzaXplb2YoZXh0cmEpLCAiJXMgJWQiLCBjb21tYW5kLCB2YWwpOworCWxlbiA9IENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGxlbiArIDEpOworCWlmIChjb3B5X3RvX3VzZXIocHJpdl9kYXRhLT5idWYsICZleHRyYSwgbGVuKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXQgPSAtRUZBVUxUOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfZmFzdF9yb2FtKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKwl1aW50OF90IGxmck1vZGUgPSBDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9ERUZBVUxUOworCisJLyogTW92ZSBwb2ludGVyIHRvIGFoZWFkIG9mIFNFVEZBU1RST0FNPGRlbGltaXRlcj4gKi8KKwl2YWx1ZSA9IHZhbHVlICsgY29tbWFuZF9sZW4gKyAxOworCisJLyogQ29udmVydCB0aGUgdmFsdWUgZnJvbSBhc2NpaSB0byBpbnRlZ2VyICovCisJcmV0ID0ga3N0cnRvdTgodmFsdWUsIDEwLCAmbGZyTW9kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJLyoKKwkJICogSWYgdGhlIGlucHV0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYXggdmFsdWUgb2YgZGF0YXR5cGUsCisJCSAqIHRoZW4gYWxzbyBrc3RydG91OCBmYWlscworCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczoga3N0cnRvdTggZmFpbGVkIHJhbmdlIFslZCAtICVkXSIsCisJCQkgIF9fZnVuY19fLCBDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9NSU4sCisJCQkgIENGR19MRlJfRkVBVFVSRV9FTkFCTEVEX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoKGxmck1vZGUgPCBDRkdfTEZSX0ZFQVRVUkVfRU5BQkxFRF9NSU4pIHx8CisJICAgIChsZnJNb2RlID4gQ0ZHX0xGUl9GRUFUVVJFX0VOQUJMRURfTUFYKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgImxmciBtb2RlIHZhbHVlICVkIGlzIG91dCBvZiByYW5nZSAoTWluOiAlZCBNYXg6ICVkKSIsCisJCQkgIGxmck1vZGUsCisJCQkgIENGR19MRlJfRkVBVFVSRV9FTkFCTEVEX01JTiwKKwkJCSAgQ0ZHX0xGUl9GRUFUVVJFX0VOQUJMRURfTUFYKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSZWNlaXZlZCBDb21tYW5kIHRvIGNoYW5nZSBsZnIgbW9kZSA9ICVkIiwKKwkJICBfX2Z1bmNfXywgbGZyTW9kZSk7CisKKwloZGRfY3R4LT5jb25maWctPmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCA9IGxmck1vZGU7CisJc21lX3VwZGF0ZV9pc19mYXN0X3JvYW1faW5pX2ZlYXR1cmVfZW5hYmxlZChoZGRfY3R4LT5oSGFsLAorCQkJCQkJICAgIGFkYXB0ZXItPgorCQkJCQkJICAgIHNlc3Npb25JZCwKKwkJCQkJCSAgICBsZnJNb2RlKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X2Zhc3RfdHJhbnNpdGlvbihoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgICAgICB1aW50OF90ICpjb21tYW5kLAorCQkJCSAgICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCSAgICAgICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJdWludDhfdCBmdCA9IENGR19GQVNUX1RSQU5TSVRJT05fRU5BQkxFRF9OQU1FX0RFRkFVTFQ7CisKKwkvKiBNb3ZlIHBvaW50ZXIgdG8gYWhlYWQgb2YgU0VURkFTVFJPQU08ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgMTAsICZmdCk7CisJaWYgKHJldCA8IDApIHsKKwkJLyoKKwkJICogSWYgdGhlIGlucHV0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYXggdmFsdWUgb2YgZGF0YXR5cGUsCisJCSAqIHRoZW4gYWxzbyBrc3RydG91OCBmYWlscworCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczoga3N0cnRvdTggZmFpbGVkIHJhbmdlIFslZCAtICVkXSIsCisJCQkgIF9fZnVuY19fLAorCQkJICBDRkdfRkFTVF9UUkFOU0lUSU9OX0VOQUJMRURfTkFNRV9NSU4sCisJCQkgIENGR19GQVNUX1RSQU5TSVRJT05fRU5BQkxFRF9OQU1FX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoKGZ0IDwgQ0ZHX0ZBU1RfVFJBTlNJVElPTl9FTkFCTEVEX05BTUVfTUlOKSB8fAorCSAgICAoZnQgPiBDRkdfRkFTVF9UUkFOU0lUSU9OX0VOQUJMRURfTkFNRV9NQVgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiZnQgbW9kZSB2YWx1ZSAlZCBpcyBvdXQgb2YgcmFuZ2UgKE1pbjogJWQgTWF4OiAlZCkiLAorCQkJICBmdCwKKwkJCSAgQ0ZHX0ZBU1RfVFJBTlNJVElPTl9FTkFCTEVEX05BTUVfTUlOLAorCQkJICBDRkdfRkFTVF9UUkFOU0lUSU9OX0VOQUJMRURfTkFNRV9NQVgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFJlY2VpdmVkIENvbW1hbmQgdG8gY2hhbmdlIGZ0IG1vZGUgPSAlZCIsCisJCSAgX19mdW5jX18sIGZ0KTsKKworCWhkZF9jdHgtPmNvbmZpZy0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQgPSBmdDsKKwlzbWVfdXBkYXRlX2Zhc3RfdHJhbnNpdGlvbl9lbmFibGVkKGhkZF9jdHgtPmhIYWwsIGZ0KTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorc3RhdGljIHZvaWQgaGRkX3dtYV9zZW5kX2Zhc3RyZWFzc29jX2NtZChpbnQgc2Vzc2lvbklkLCB0U2lyTWFjQWRkciBic3NpZCwKKwkJCQkJCQlpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3Qgd21hX3JvYW1faW52b2tlX2NtZCAqZmFzdHJlYXNzb2M7CisJY2RzX21zZ190IG1zZyA9IHswfTsKKworCWZhc3RyZWFzc29jID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpmYXN0cmVhc3NvYykpOworCWlmIChOVUxMID09IGZhc3RyZWFzc29jKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2RmX21lbV9hbGxvYyBmYWlsZWQgZm9yIGZhc3RyZWFzc29jIikpOworCQlyZXR1cm47CisJfQorCWZhc3RyZWFzc29jLT52ZGV2X2lkID0gc2Vzc2lvbklkOworCWZhc3RyZWFzc29jLT5jaGFubmVsID0gY2hhbm5lbDsKKwlmYXN0cmVhc3NvYy0+YnNzaWRbMF0gPSBic3NpZFswXTsKKwlmYXN0cmVhc3NvYy0+YnNzaWRbMV0gPSBic3NpZFsxXTsKKwlmYXN0cmVhc3NvYy0+YnNzaWRbMl0gPSBic3NpZFsyXTsKKwlmYXN0cmVhc3NvYy0+YnNzaWRbM10gPSBic3NpZFszXTsKKwlmYXN0cmVhc3NvYy0+YnNzaWRbNF0gPSBic3NpZFs0XTsKKwlmYXN0cmVhc3NvYy0+YnNzaWRbNV0gPSBic3NpZFs1XTsKKworCW1zZy50eXBlID0gU0lSX0hBTF9ST0FNX0lOVk9LRTsKKwltc2cucmVzZXJ2ZWQgPSAwOworCW1zZy5ib2R5cHRyID0gZmFzdHJlYXNzb2M7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLAorCQkJCQkJCQkmbXNnKSkgeworCQljZGZfbWVtX2ZyZWUoZmFzdHJlYXNzb2MpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJRkwoIk5vdCBhYmxlIHRvIHBvc3QgUk9BTV9JTlZPS0VfQ01EIG1lc3NhZ2UgdG8gV01BIikpOworCX0KK30KKyNlbmRpZgorc3RhdGljIGludCBkcnZfY21kX2Zhc3RfcmVhc3NvYyhoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJdWludDhfdCAqY29tbWFuZCwKKwkJCQl1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCWhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKwl1aW50OF90IGNoYW5uZWwgPSAwOworCXRTaXJNYWNBZGRyIHRhcmdldEFwQnNzaWQ7CisJdWludDMyX3Qgcm9hbUlkID0gMDsKKwl0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgbW9kUHJvZmlsZUZpZWxkczsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9TQ0FOX09GRkxPQUQKKwl0Q3NySGFuZG9mZlJlcXVlc3QgaGFuZG9mZkluZm87CisjZW5kaWYKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eDsKKworCWlmIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OICE9IGFkYXB0ZXItPmRldmljZV9tb2RlKSB7CisJCWhkZF93YXJuKCJVbnN1cHBvcnRlZCBpbiBtb2RlICVzKCVkKSIsCisJCQkgaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhhZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQkgYWRhcHRlci0+ZGV2aWNlX21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKTsKKworCS8qIGlmIG5vdCBhc3NvY2lhdGVkLCBubyBuZWVkIHRvIHByb2NlZWQgd2l0aCByZWFzc29jICovCisJaWYgKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCAhPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczpOb3QgYXNzb2NpYXRlZCEiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlyZXQgPSBoZGRfcGFyc2VfcmVhc3NvY19jb21tYW5kX3YxX2RhdGEodmFsdWUsIHRhcmdldEFwQnNzaWQsCisJCQkJCQkmY2hhbm5lbCk7CisJaWYgKHJldCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gcGFyc2UgcmVhc3NvYyBjb21tYW5kIGRhdGEiLAorCQkJICBfX2Z1bmNfXyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKgorCSAqIGlmIHRoZSB0YXJnZXQgYnNzaWQgaXMgc2FtZSBhcyBjdXJyZW50bHkgYXNzb2NpYXRlZCBBUCwKKwkgKiBpc3N1ZSByZWFzc29jIHRvIHNhbWUgQVAKKwkgKi8KKwlpZiAodHJ1ZSA9PSBjZGZfbWVtX2NvbXBhcmUodGFyZ2V0QXBCc3NpZCwKKwkJCQkgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLmJ5dGVzLAorCQkJCSAgICBDREZfTUFDX0FERFJfU0laRSkpIHsKKwkJLyogUmVhc3NvYyB0byBzYW1lIEFQLCBvbmx5IHN1cHBvcnRlZCBmb3IgT3BlbiBTZWN1cml0eSovCisJCWlmICgocEhkZFN0YUN0eC0+Y29ubl9pbmZvLnVjRW5jcnlwdGlvblR5cGUgfHwKKwkJCSAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm1jRW5jcnlwdGlvblR5cGUpKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgRkwoIlJlYXNzb2MgdG8gc2FtZSBBUCwgb25seSBzdXBwb3J0ZWQgZm9yIE9wZW4gU2VjdXJpdHkiKSk7CisJCQlyZXR1cm4gLUVOT1RTVVBQOworCQl9CisJCWhkZExvZyhMT0cxLAorCQkgIEZMKCJSZWFzc29jIEJTU0lEIGlzIHNhbWUgYXMgY3VycmVudGx5IGFzc29jaWF0ZWQgQVAgYnNzaWQiKSk7CisJCXNtZV9nZXRfbW9kaWZ5X3Byb2ZpbGVfZmllbGRzKGhkZF9jdHgtPmhIYWwsIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkmbW9kUHJvZmlsZUZpZWxkcyk7CisJCXNtZV9yb2FtX3JlYXNzb2MoaGRkX2N0eC0+aEhhbCwgYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJTlVMTCwgbW9kUHJvZmlsZUZpZWxkcywgJnJvYW1JZCwgMSk7CisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIGNoYW5uZWwgbnVtYmVyIGlzIGEgdmFsaWQgY2hhbm5lbCBudW1iZXIgKi8KKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCXdsYW5faGRkX3ZhbGlkYXRlX29wZXJhdGlvbl9jaGFubmVsKGFkYXB0ZXIsIGNoYW5uZWwpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBDaGFubmVsIFslZF0iKSwgY2hhbm5lbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJaWYgKGhkZF9jdHgtPmNvbmZpZy0+aXNSb2FtT2ZmbG9hZEVuYWJsZWQpIHsKKwkJaGRkX3dtYV9zZW5kX2Zhc3RyZWFzc29jX2NtZCgoaW50KWFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJdGFyZ2V0QXBCc3NpZCwgKGludCljaGFubmVsKTsKKwkJZ290byBleGl0OworCX0KKyNlbmRpZgorCS8qIFByb2NlZWQgd2l0aCByZWFzc29jICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fU0NBTl9PRkZMT0FECisJaGFuZG9mZkluZm8uY2hhbm5lbCA9IGNoYW5uZWw7CisJaGFuZG9mZkluZm8uc3JjID0gRkFTVFJFQVNTT0M7CisJY2RmX21lbV9jb3B5KGhhbmRvZmZJbmZvLmJzc2lkLCB0YXJnZXRBcEJzc2lkLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCXNtZV9oYW5kb2ZmX3JlcXVlc3QoaGRkX2N0eC0+aEhhbCwgYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJICAgICZoYW5kb2ZmSW5mbyk7CisjZW5kaWYKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorc3RhdGljIGludCBkcnZfY21kX2NjeF9wbG1fcmVxKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCSAgICAgICB1aW50OF90ICpjb21tYW5kLAorCQkJICAgICAgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkgICAgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwU2lyUGxtUmVxIHBQbG1SZXF1ZXN0ID0gTlVMTDsKKworCXBQbG1SZXF1ZXN0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJQbG1SZXEpKTsKKwlpZiAoTlVMTCA9PSBwUGxtUmVxdWVzdCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJc3RhdHVzID0gaGRkX3BhcnNlX3BsbV9jbWQodmFsdWUsIHBQbG1SZXF1ZXN0KTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQljZGZfbWVtX2ZyZWUocFBsbVJlcXVlc3QpOworCQlwUGxtUmVxdWVzdCA9IE5VTEw7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJcFBsbVJlcXVlc3QtPnNlc3Npb25JZCA9IGFkYXB0ZXItPnNlc3Npb25JZDsKKworCXN0YXR1cyA9IHNtZV9zZXRfcGxtX3JlcXVlc3QoaGRkX2N0eC0+aEhhbCwgcFBsbVJlcXVlc3QpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCWNkZl9tZW1fZnJlZShwUGxtUmVxdWVzdCk7CisJCXBQbG1SZXF1ZXN0ID0gTlVMTDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X2NjeF9tb2RlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQl1aW50OF90ICpjb21tYW5kLAorCQkJCXVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXVpbnQ4X3QgZXNlTW9kZSA9IENGR19FU0VfRkVBVFVSRV9FTkFCTEVEX0RFRkFVTFQ7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBmZWF0dXJlcyBPS0MvRVNFLzExUiBhcmUgc3VwcG9ydGVkIHNpbXVsdGFuZW91c2x5LAorCSAqIHRoZW4gdGhpcyBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZCAocmV0dXJuIEZBSUxVUkUpCisJICovCisJaWYgKHNtZV9nZXRfaXNfZXNlX2ZlYXR1cmVfZW5hYmxlZChoZGRfY3R4LT5oSGFsKSAmJgorCSAgICBoZGRfaXNfb2tjX21vZGVfZW5hYmxlZChoZGRfY3R4KSAmJgorCSAgICBzbWVfZ2V0X2lzX2Z0X2ZlYXR1cmVfZW5hYmxlZChoZGRfY3R4LT5oSGFsKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICAiJXM6IE9LQy9FU0UvMTFSIGFyZSBzdXBwb3J0ZWQgc2ltdWx0YW5lb3VzbHkgaGVuY2UgdGhpcyBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZCEiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FUEVSTTsKKwkJZ290byBleGl0OworCX0KKworCS8qIE1vdmUgcG9pbnRlciB0byBhaGVhZCBvZiBTRVRDQ1hNT0RFPGRlbGltaXRlcj4gKi8KKwl2YWx1ZSA9IHZhbHVlICsgY29tbWFuZF9sZW4gKyAxOworCisJLyogQ29udmVydCB0aGUgdmFsdWUgZnJvbSBhc2NpaSB0byBpbnRlZ2VyICovCisJcmV0ID0ga3N0cnRvdTgodmFsdWUsIDEwLCAmZXNlTW9kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJLyoKKwkJICogSWYgdGhlIGlucHV0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYXggdmFsdWUgb2YgZGF0YXR5cGUsCisJCSAqIHRoZW4gYWxzbyBrc3RydG91OCBmYWlscworCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczoga3N0cnRvdTggZmFpbGVkIHJhbmdlIFslZCAtICVkXSIsCisJCQkgIF9fZnVuY19fLCBDRkdfRVNFX0ZFQVRVUkVfRU5BQkxFRF9NSU4sCisJCQkgIENGR19FU0VfRkVBVFVSRV9FTkFCTEVEX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoKGVzZU1vZGUgPCBDRkdfRVNFX0ZFQVRVUkVfRU5BQkxFRF9NSU4pIHx8CisJICAgIChlc2VNb2RlID4gQ0ZHX0VTRV9GRUFUVVJFX0VOQUJMRURfTUFYKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkVzZSBtb2RlIHZhbHVlICVkIGlzIG91dCBvZiByYW5nZSAoTWluOiAlZCBNYXg6ICVkKSIsCisJCQkgIGVzZU1vZGUsCisJCQkgIENGR19FU0VfRkVBVFVSRV9FTkFCTEVEX01JTiwKKwkJCSAgQ0ZHX0VTRV9GRUFUVVJFX0VOQUJMRURfTUFYKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmVjZWl2ZWQgQ29tbWFuZCB0byBjaGFuZ2UgZXNlIG1vZGUgPSAlZCIsCisJCSAgX19mdW5jX18sIGVzZU1vZGUpOworCisJaGRkX2N0eC0+Y29uZmlnLT5pc0VzZUluaUZlYXR1cmVFbmFibGVkID0gZXNlTW9kZTsKKwlzbWVfdXBkYXRlX2lzX2VzZV9mZWF0dXJlX2VuYWJsZWQoaGRkX2N0eC0+aEhhbCwKKwkJCQkJICBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgZXNlTW9kZSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X3JvYW1fc2Nhbl9jb250cm9sKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJCSBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkgdWludDhfdCAqY29tbWFuZCwKKwkJCQkJIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJCSBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJdWludDhfdCByb2FtU2NhbkNvbnRyb2wgPSAwOworCisJLyogTW92ZSBwb2ludGVyIHRvIGFoZWFkIG9mIFNFVFJPQU1TQ0FOQ09OVFJPTDxkZWxpbWl0ZXI+ICovCisJdmFsdWUgPSB2YWx1ZSArIGNvbW1hbmRfbGVuICsgMTsKKworCS8qIENvbnZlcnQgdGhlIHZhbHVlIGZyb20gYXNjaWkgdG8gaW50ZWdlciAqLworCXJldCA9IGtzdHJ0b3U4KHZhbHVlLCAxMCwgJnJvYW1TY2FuQ29udHJvbCk7CisJaWYgKHJldCA8IDApIHsKKwkJLyoKKwkJICogSWYgdGhlIGlucHV0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYXggdmFsdWUgb2YgZGF0YXR5cGUsCisJCSAqIHRoZW4gYWxzbyBrc3RydG91OCBmYWlscworCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczoga3N0cnRvdTggZmFpbGVkICIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSZWNlaXZlZCBDb21tYW5kIHRvIFNldCByb2FtIHNjYW4gY29udHJvbCA9ICVkIiwKKwkJICBfX2Z1bmNfXywgcm9hbVNjYW5Db250cm9sKTsKKworCWlmICgwICE9IHJvYW1TY2FuQ29udHJvbCkgeworCQlyZXQgPSAwOyAvKiByZXR1cm4gc3VjY2VzcyBidXQgaWdub3JlIHBhcmFtIHZhbHVlICJ0cnVlIiAqLworCQlnb3RvIGV4aXQ7CisJfQorCisJc21lX3NldF9yb2FtX3NjYW5fY29udHJvbChoZGRfY3R4LT5oSGFsLAorCQkJCSAgYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCSAgcm9hbVNjYW5Db250cm9sKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X29rY19tb2RlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQl1aW50OF90ICpjb21tYW5kLAorCQkJCXVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXVpbnQ4X3Qgb2tjTW9kZSA9IENGR19PS0NfRkVBVFVSRV9FTkFCTEVEX0RFRkFVTFQ7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBmZWF0dXJlcyBPS0MvRVNFLzExUiBhcmUgc3VwcG9ydGVkIHNpbXVsdGFuZW91c2x5LAorCSAqIHRoZW4gdGhpcyBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZCAocmV0dXJuIEZBSUxVUkUpCisJICovCisJaWYgKHNtZV9nZXRfaXNfZXNlX2ZlYXR1cmVfZW5hYmxlZChoZGRfY3R4LT5oSGFsKSAmJgorCSAgICBoZGRfaXNfb2tjX21vZGVfZW5hYmxlZChoZGRfY3R4KSAmJgorCSAgICBzbWVfZ2V0X2lzX2Z0X2ZlYXR1cmVfZW5hYmxlZChoZGRfY3R4LT5oSGFsKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICAiJXM6IE9LQy9FU0UvMTFSIGFyZSBzdXBwb3J0ZWQgc2ltdWx0YW5lb3VzbHkgaGVuY2UgdGhpcyBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZCEiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FUEVSTTsKKwkJZ290byBleGl0OworCX0KKworCS8qIE1vdmUgcG9pbnRlciB0byBhaGVhZCBvZiBTRVRPS0NNT0RFPGRlbGltaXRlcj4gKi8KKwl2YWx1ZSA9IHZhbHVlICsgY29tbWFuZF9sZW4gKyAxOworCisJLyogQ29udmVydCB0aGUgdmFsdWUgZnJvbSBhc2NpaSB0byBpbnRlZ2VyICovCisJcmV0ID0ga3N0cnRvdTgodmFsdWUsIDEwLCAmb2tjTW9kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJLyoKKwkJICogSWYgdGhlIGlucHV0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYXggdmFsdWUgb2YgZGF0YXR5cGUsCisJCSAqIHRoZW4gYWxzbyBrc3RydG91OCBmYWlscworCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczoga3N0cnRvdTggZmFpbGVkIHJhbmdlIFslZCAtICVkXSIsCisJCQkgIF9fZnVuY19fLCBDRkdfT0tDX0ZFQVRVUkVfRU5BQkxFRF9NSU4sCisJCQkgIENGR19PS0NfRkVBVFVSRV9FTkFCTEVEX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoKG9rY01vZGUgPCBDRkdfT0tDX0ZFQVRVUkVfRU5BQkxFRF9NSU4pIHx8CisJICAgIChva2NNb2RlID4gQ0ZHX09LQ19GRUFUVVJFX0VOQUJMRURfTUFYKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIk9rYyBtb2RlIHZhbHVlICVkIGlzIG91dCBvZiByYW5nZSAoTWluOiAlZCBNYXg6ICVkKSIsCisJCQkgIG9rY01vZGUsCisJCQkgIENGR19PS0NfRkVBVFVSRV9FTkFCTEVEX01JTiwKKwkJCSAgQ0ZHX09LQ19GRUFUVVJFX0VOQUJMRURfTUFYKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmVjZWl2ZWQgQ29tbWFuZCB0byBjaGFuZ2Ugb2tjIG1vZGUgPSAlZCIsCisJCSAgX19mdW5jX18sIG9rY01vZGUpOworCisJaGRkX2N0eC0+Y29uZmlnLT5pc09rY0luaUZlYXR1cmVFbmFibGVkID0gb2tjTW9kZTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfZ2V0X3JvYW1fc2Nhbl9jb250cm9sKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJCSBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkgdWludDhfdCAqY29tbWFuZCwKKwkJCQkJIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJCSBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlib29sIHJvYW1TY2FuQ29udHJvbCA9IHNtZV9nZXRfcm9hbV9zY2FuX2NvbnRyb2woaGRkX2N0eC0+aEhhbCk7CisJY2hhciBleHRyYVszMl07CisJdWludDhfdCBsZW4gPSAwOworCisJbGVuID0gc2NucHJpbnRmKGV4dHJhLCBzaXplb2YoZXh0cmEpLCAiJXMgJWQiLAorCQkJY29tbWFuZCwgcm9hbVNjYW5Db250cm9sKTsKKwlsZW4gPSBDREZfTUlOKHByaXZfZGF0YS0+dG90YWxfbGVuLCBsZW4gKyAxKTsKKwlpZiAoY29weV90b191c2VyKHByaXZfZGF0YS0+YnVmLCAmZXh0cmEsIGxlbikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VyIGJ1ZmZlciIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfYnRfY29leF9tb2RlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQl1aW50OF90ICpjb21tYW5kLAorCQkJCXVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJY2hhciAqYmNNb2RlOworCisJYmNNb2RlID0gY29tbWFuZCArIDExOworCWlmICgnMScgPT0gKmJjTW9kZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSAgRkwoIkJUQ09FWE1PREUgJWQiKSwgKmJjTW9kZSk7CisJCWhkZF9jdHgtPmJ0Q29leE1vZGVTZXQgPSB0cnVlOworCQlyZXQgPSB3bGFuX2hkZF9zY2FuX2Fib3J0KGFkYXB0ZXIpOworCQlpZiAocmV0IDwgMCkgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgRkwoIkZhaWxlZCB0byBhYm9ydCBleGlzdGluZyBzY2FuIHN0YXR1czolZCIpLCByZXQpOworCQl9CisJfSBlbHNlIGlmICgnMicgPT0gKmJjTW9kZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSAgRkwoIkJUQ09FWE1PREUgJWQiKSwgKmJjTW9kZSk7CisJCWhkZF9jdHgtPmJ0Q29leE1vZGVTZXQgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2Nhbl9hY3RpdmUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCSAgICAgICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJICAgICAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkgICAgICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCSAgICAgICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwloZGRfY3R4LT5pb2N0bF9zY2FuX21vZGUgPSBlU0lSX0FDVElWRV9TQ0FOOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2Nhbl9wYXNzaXZlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQl1aW50OF90ICpjb21tYW5kLAorCQkJCXVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaGRkX2N0eC0+aW9jdGxfc2Nhbl9tb2RlID0gZVNJUl9QQVNTSVZFX1NDQU47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfZHdlbGxfdGltZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCSAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGhkZF9jb25maWcgKnBDZmcgPQorCQkoV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKSktPmNvbmZpZzsKKwljaGFyIGV4dHJhWzMyXTsKKwl1aW50OF90IGxlbiA9IDA7CisKKwltZW1zZXQoZXh0cmEsIDAsIHNpemVvZihleHRyYSkpOworCXJldCA9IGhkZF9nZXRfZHdlbGxfdGltZShwQ2ZnLCBjb21tYW5kLCBleHRyYSwgc2l6ZW9mKGV4dHJhKSwgJmxlbik7CisJbGVuID0gQ0RGX01JTihwcml2X2RhdGEtPnRvdGFsX2xlbiwgbGVuICsgMSk7CisJaWYgKHJldCAhPSAwIHx8IGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisJcmV0ID0gbGVuOworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X2R3ZWxsX3RpbWUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICB1aW50OF90ICpjb21tYW5kLAorCQkJCSAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCXJldHVybiBoZGRfc2V0X2R3ZWxsX3RpbWUoYWRhcHRlciwgY29tbWFuZCk7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9taXJhY2FzdChoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCSAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCUNERl9TVEFUVVMgcmV0X3N0YXR1czsKKwlpbnQgcmV0ID0gMDsKKwl0SGFsSGFuZGxlIGhIYWw7CisJdWludDhfdCBmaWx0ZXJUeXBlID0gMDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKwl1aW50OF90ICp2YWx1ZTsKKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCWlmICgwICE9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiJXMgcEhkZEN0eCBpcyBub3QgdmFsaWQsIFVuYWJsZSB0byBzZXQgbWlyYWNhc3QgbW9kZSIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloSGFsID0gcEhkZEN0eC0+aEhhbDsKKwl2YWx1ZSA9IGNvbW1hbmQgKyA5OworCisJLyogQ29udmVydCB0aGUgdmFsdWUgZnJvbSBhc2NpaSB0byBpbnRlZ2VyICovCisJcmV0ID0ga3N0cnRvdTgodmFsdWUsIDEwLCAmZmlsdGVyVHlwZSk7CisJaWYgKHJldCA8IDApIHsKKwkJLyoKKwkJICogSWYgdGhlIGlucHV0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYXggdmFsdWUgb2YgZGF0YXR5cGUsCisJCSAqIHRoZW4gYWxzbyBrc3RydG91OCBmYWlscworCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczoga3N0cnRvdTggZmFpbGVkIHJhbmdlICIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKwlpZiAoKGZpbHRlclR5cGUgPCBXTEFOX0hERF9EUklWRVJfTUlSQUNBU1RfQ0ZHX01JTl9WQUwpCisJICAgIHx8IChmaWx0ZXJUeXBlID4KKwkJV0xBTl9IRERfRFJJVkVSX01JUkFDQVNUX0NGR19NQVhfVkFMKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBBY2NlcHRlZCBWYWx1ZXMgYXJlIDAgdG8gMi4gMC1EaXNhYmxlZCwgMS1Tb3VyY2UsIDItU2luayAiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJLyogRmlsdGVydHlwZSB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIDAtRGlzYWJsZWQsIDEtU291cmNlLCAyLXNpbmsgKi8KKwlwSGRkQ3R4LT5taXJhY2FzdF92YWx1ZSA9IGZpbHRlclR5cGU7CisKKwlyZXRfc3RhdHVzID0gc21lX3NldF9taXJhY2FzdChoSGFsLCBmaWx0ZXJUeXBlKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHJldF9zdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsICJGYWlsZWQgdG8gc2V0IG1pcmFjYXN0Iik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGNkc19pc19tY2NfaW5fMjRHKHBIZGRDdHgpKQorCQlyZXR1cm4gY2RzX3NldF9tYXMoYWRhcHRlciwgZmlsdGVyVHlwZSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfY2N4X3JvYW1fc2Nhbl9jaGFubmVscyhoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkgICAgICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkgICAgICB1aW50OF90ICpjb21tYW5kLAorCQkJCQkgICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCQkgICAgICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJdWludDhfdCBDaGFubmVsTGlzdFtXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dID0geyAwIH07CisJdWludDhfdCBudW1DaGFubmVscyA9IDA7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlyZXQgPSBoZGRfcGFyc2VfY2hhbm5lbGxpc3QodmFsdWUsIENoYW5uZWxMaXN0LCAmbnVtQ2hhbm5lbHMpOworCWlmIChyZXQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIHBhcnNlIGNoYW5uZWwgbGlzdCBpbmZvcm1hdGlvbiIsCisJCQkgIF9fZnVuY19fKTsKKwkJZ290byBleGl0OworCX0KKwlpZiAobnVtQ2hhbm5lbHMgPiBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogbnVtYmVyIG9mIGNoYW5uZWxzICglZCkgc3VwcG9ydGVkIGV4Y2VlZGVkIG1heCAoJWQpIiwKKwkJCSAgX19mdW5jX18sCisJCQkgIG51bUNoYW5uZWxzLAorCQkJICBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCXN0YXR1cyA9IHNtZV9zZXRfZXNlX3JvYW1fc2Nhbl9jaGFubmVsX2xpc3QoaGRkX2N0eC0+aEhhbCwKKwkJCQkJCSAgICBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkgICAgQ2hhbm5lbExpc3QsCisJCQkJCQkgICAgbnVtQ2hhbm5lbHMpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byB1cGRhdGUgY2hhbm5lbCBsaXN0IGluZm9ybWF0aW9uIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfdHNtX3N0YXRzKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKwljaGFyIGV4dHJhWzEyOF0gPSB7IDAgfTsKKwlpbnQgbGVuID0gMDsKKwl1aW50OF90IHRpZCA9IDA7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHg7CisJdEFuaVRyYWZTdHJtTWV0cmljcyB0c21fbWV0cmljczsKKworCWlmICgoV0xBTl9IRERfSU5GUkFfU1RBVElPTiAhPSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkgJiYKKwkgICAgKFdMQU5fSEREX1AyUF9DTElFTlQgIT0gYWRhcHRlci0+ZGV2aWNlX21vZGUpKSB7CisJCWhkZF93YXJuKCJVbnN1cHBvcnRlZCBpbiBtb2RlICVzKCVkKSIsCisJCQkgaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhhZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQkgYWRhcHRlci0+ZGV2aWNlX21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKTsKKworCS8qIGlmIG5vdCBhc3NvY2lhdGVkLCByZXR1cm4gZXJyb3IgKi8KKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczpOb3QgYXNzb2NpYXRlZCEiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBNb3ZlIHBvaW50ZXIgdG8gYWhlYWQgb2YgR0VUVFNNU1RBVFM8ZGVsaW1pdGVyPiAqLworCXZhbHVlID0gdmFsdWUgKyBjb21tYW5kX2xlbiArIDE7CisKKwkvKiBDb252ZXJ0IHRoZSB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgMTAsICZ0aWQpOworCWlmIChyZXQgPCAwKSB7CisJCS8qCisJCSAqIElmIHRoZSBpbnB1dCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gbWF4IHZhbHVlIG9mIGRhdGF0eXBlLAorCQkgKiB0aGVuIGFsc28ga3N0cnRvdTggZmFpbHMKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGtzdHJ0b3U4IGZhaWxlZCByYW5nZSBbJWQgLSAlZF0iLAorCQkJICBfX2Z1bmNfXywgVElEX01JTl9WQUxVRSwKKwkJCSAgVElEX01BWF9WQUxVRSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKCh0aWQgPCBUSURfTUlOX1ZBTFVFKSB8fCAodGlkID4gVElEX01BWF9WQUxVRSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJ0aWQgdmFsdWUgJWQgaXMgb3V0IG9mIHJhbmdlIChNaW46ICVkIE1heDogJWQpIiwKKwkJCSAgdGlkLCBUSURfTUlOX1ZBTFVFLCBUSURfTUFYX1ZBTFVFKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSZWNlaXZlZCBDb21tYW5kIHRvIGdldCB0c20gc3RhdHMgdGlkID0gJWQiLAorCQkgIF9fZnVuY19fLCB0aWQpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkgICAgaGRkX2dldF90c21fc3RhdHMoYWRhcHRlciwgdGlkLCAmdHNtX21ldHJpY3MpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBnZXQgdHNtIHN0YXRzIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGV4aXQ7CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiVXBsaW5rUGt0UXVldWVEbHkoJWQpIFVwbGlua1BrdFF1ZXVlRGx5SGlzdFswXSglZCkgVXBsaW5rUGt0UXVldWVEbHlIaXN0WzFdKCVkKSBVcGxpbmtQa3RRdWV1ZURseUhpc3RbMl0oJWQpIFVwbGlua1BrdFF1ZXVlRGx5SGlzdFszXSglZCkgVXBsaW5rUGt0VHhEbHkoJXUpIFVwbGlua1BrdExvc3MoJWQpIFVwbGlua1BrdENvdW50KCVkKSBSb2FtaW5nQ291bnQoJWQpIFJvYW1pbmdEbHkoJWQpIiwKKwkJICB0c21fbWV0cmljcy5VcGxpbmtQa3RRdWV1ZURseSwKKwkJICB0c21fbWV0cmljcy5VcGxpbmtQa3RRdWV1ZURseUhpc3RbMF0sCisJCSAgdHNtX21ldHJpY3MuVXBsaW5rUGt0UXVldWVEbHlIaXN0WzFdLAorCQkgIHRzbV9tZXRyaWNzLlVwbGlua1BrdFF1ZXVlRGx5SGlzdFsyXSwKKwkJICB0c21fbWV0cmljcy5VcGxpbmtQa3RRdWV1ZURseUhpc3RbM10sCisJCSAgdHNtX21ldHJpY3MuVXBsaW5rUGt0VHhEbHksCisJCSAgdHNtX21ldHJpY3MuVXBsaW5rUGt0TG9zcywKKwkJICB0c21fbWV0cmljcy5VcGxpbmtQa3RDb3VudCwKKwkJICB0c21fbWV0cmljcy5Sb2FtaW5nQ291bnQsCisJCSAgdHNtX21ldHJpY3MuUm9hbWluZ0RseSk7CisJLyoKKwkgKiBPdXRwdXQgVFNNIHN0YXRzIGlzIG9mIHRoZSBmb3JtYXQKKwkgKiBHRVRUU01TVEFUUyBbUGt0UXVldWVEbHldCisJICogW1BrdFF1ZXVlRGx5SGlzdFswXV06W1BrdFF1ZXVlRGx5SGlzdFsxXV0gLi4uW1JvYW1pbmdEbHldCisJICogZWcuLCBHRVRUU01TVEFUUyAxMCAxOjA6MDoxNjEgMjAgMSAxNyA4IDM5ODAwCisJICovCisJbGVuID0gc2NucHJpbnRmKGV4dHJhLAorCQkJc2l6ZW9mKGV4dHJhKSwKKwkJCSIlcyAlZCAlZDolZDolZDolZCAldSAlZCAlZCAlZCAlZCIsCisJCQljb21tYW5kLAorCQkJdHNtX21ldHJpY3MuVXBsaW5rUGt0UXVldWVEbHksCisJCQl0c21fbWV0cmljcy5VcGxpbmtQa3RRdWV1ZURseUhpc3RbMF0sCisJCQl0c21fbWV0cmljcy5VcGxpbmtQa3RRdWV1ZURseUhpc3RbMV0sCisJCQl0c21fbWV0cmljcy5VcGxpbmtQa3RRdWV1ZURseUhpc3RbMl0sCisJCQl0c21fbWV0cmljcy5VcGxpbmtQa3RRdWV1ZURseUhpc3RbM10sCisJCQl0c21fbWV0cmljcy5VcGxpbmtQa3RUeERseSwKKwkJCXRzbV9tZXRyaWNzLlVwbGlua1BrdExvc3MsCisJCQl0c21fbWV0cmljcy5VcGxpbmtQa3RDb3VudCwKKwkJCXRzbV9tZXRyaWNzLlJvYW1pbmdDb3VudCwKKwkJCXRzbV9tZXRyaWNzLlJvYW1pbmdEbHkpOworCWxlbiA9IENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGxlbiArIDEpOworCWlmIChjb3B5X3RvX3VzZXIocHJpdl9kYXRhLT5idWYsICZleHRyYSwgbGVuKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGV4aXQ7CisJfQorCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfY2NrbV9pZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJICAgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkgICAgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCSAgICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJICAgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQ7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXVpbnQ4X3QgKmNja21JZSA9IE5VTEw7CisJdWludDhfdCBjY2ttSWVMZW4gPSAwOworCisJcmV0ID0gaGRkX3BhcnNlX2dldF9jY2ttX2llKHZhbHVlLCAmY2NrbUllLCAmY2NrbUllTGVuKTsKKwlpZiAocmV0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBwYXJzZSBjY2ttIGllIGRhdGEiLAorCQkJICBfX2Z1bmNfXyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoY2NrbUllTGVuID4gRE9UMTFGX0lFX1JTTl9NQVhfTEVOKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IENDS00gSWUgaW5wdXQgbGVuZ3RoIGlzIG1vcmUgdGhhbiBtYXhbJWRdIiwKKwkJCSAgX19mdW5jX18sIERPVDExRl9JRV9SU05fTUFYX0xFTik7CisJCWlmIChOVUxMICE9IGNja21JZSkgeworCQkJY2RmX21lbV9mcmVlKGNja21JZSk7CisJCQljY2ttSWUgPSBOVUxMOworCQl9CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlzbWVfc2V0X2Nja21faWUoaGRkX2N0eC0+aEhhbCwgYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJY2NrbUllLCBjY2ttSWVMZW4pOworCWlmIChOVUxMICE9IGNja21JZSkgeworCQljZGZfbWVtX2ZyZWUoY2NrbUllKTsKKwkJY2NrbUllID0gTlVMTDsKKwl9CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcnZfY21kX2NjeF9iZWFjb25fcmVxKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0OworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKwl0Q3NyRXNlQmVhY29uUmVxIGVzZUJjblJlcTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWlmIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OICE9IGFkYXB0ZXItPmRldmljZV9tb2RlKSB7CisJCWhkZF93YXJuKCJVbnN1cHBvcnRlZCBpbiBtb2RlICVzKCVkKSIsCisJCQkgaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhhZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQkgYWRhcHRlci0+ZGV2aWNlX21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBoZGRfcGFyc2VfZXNlX2JlYWNvbl9yZXEodmFsdWUsICZlc2VCY25SZXEpOworCWlmIChyZXQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIHBhcnNlIGVzZSBiZWFjb24gcmVxIiwKKwkJCSAgX19mdW5jX18pOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKCFoZGRfY29ubl9pc19jb25uZWN0ZWQoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKSkpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCBGTCgiTm90IGFzc29jaWF0ZWQiKSk7CisJCWhkZF9pbmRpY2F0ZV9lc2VfYmNuX3JlcG9ydF9ub19yZXN1bHRzKGFkYXB0ZXIsCisJCQllc2VCY25SZXEuYmNuUmVxWzBdLm1lYXN1cmVtZW50VG9rZW4sCisJCQkweDAyLCAvKiBCSVQoMSkgc2V0IGZvciBtZWFzdXJlbWVudCBkb25lICovCisJCQkwKTsgICAvKiBubyBCU1MgKi8KKwkJZ290byBleGl0OworCX0KKworCXN0YXR1cyA9IHNtZV9zZXRfZXNlX2JlYWNvbl9yZXF1ZXN0KGhkZF9jdHgtPmhIYWwsCisJCQkJCSAgICBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAmZXNlQmNuUmVxKTsKKworCWlmIChDREZfU1RBVFVTX0VfUkVTT1VSQ0VTID09IHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICAgICBGTCgic21lX3NldF9lc2VfYmVhY29uX3JlcXVlc3QgZmFpbGVkICglZCksIGEgcmVxdWVzdCBhbHJlYWR5IGluIHByb2dyZXNzIiksCisJCSAgICAgICBzdGF0dXMpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXhpdDsKKwl9IGVsc2UgaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogc21lX3NldF9lc2VfYmVhY29uX3JlcXVlc3QgZmFpbGVkICglZCkiLAorCQkJICBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qICNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpICovCisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfbWNfcmF0ZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJICAgICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkgICAgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCSAgICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJICAgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQgPSAwOworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKwlpbnQgdGFyZ2V0UmF0ZTsKKworCS8qIGlucHV0IHZhbHVlIGlzIGluIHVuaXRzIG9mIGh1bmRyZWQga2JwcyAqLworCisJLyogTW92ZSBwb2ludGVyIHRvIGFoZWFkIG9mIFNFVE1DUkFURTxkZWxpbWl0ZXI+ICovCisJdmFsdWUgPSB2YWx1ZSArIGNvbW1hbmRfbGVuICsgMTsKKworCS8qIENvbnZlcnQgdGhlIHZhbHVlIGZyb20gYXNjaWkgdG8gaW50ZWdlciwgZGVjaW1hbCBiYXNlICovCisJcmV0ID0ga3N0cnRvdWludCh2YWx1ZSwgMTAsICZ0YXJnZXRSYXRlKTsKKworCXJldCA9IHdsYW5faGRkX3NldF9tY19yYXRlKGFkYXB0ZXIsIHRhcmdldFJhdGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9tYXhfdHhfcG93ZXIoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQloZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCXVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQloZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgc3RhdHVzOworCWludCB0eFBvd2VyOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwlDREZfU1RBVFVTIHNtZVN0YXR1czsKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJdFNpck1hY0FkZHIgYnNzaWQgPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKKwl0U2lyTWFjQWRkciBzZWxmTWFjID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBOZXh0ID0gTlVMTDsKKworCXN0YXR1cyA9IGhkZF9wYXJzZV9zZXRtYXh0eHBvd2VyX2NvbW1hbmQodmFsdWUsICZ0eFBvd2VyKTsKKwlpZiAoc3RhdHVzKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW52YWxpZCBNQVhUWFBPV0VSIGNvbW1hbmQgIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwljZGZfc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKGhkZF9jdHgsICZwQWRhcHRlck5vZGUpOworCXdoaWxlIChOVUxMICE9IHBBZGFwdGVyTm9kZQorCSAgICAgICAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gY2RmX3N0YXR1cykgeworCQlhZGFwdGVyID0gcEFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKwkJLyogQXNzaWduIGNvcnJlY3Qgc2VsZiBNQUMgYWRkcmVzcyAqLworCQljZGZfbWVtX2NvcHkoYnNzaWQsCisJCQkgICAgIGFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLAorCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJCWNkZl9tZW1fY29weShzZWxmTWFjLAorCQkJICAgICBhZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcywKKwkJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAgICAgICJEZXZpY2UgbW9kZSAlZCBtYXggdHggcG93ZXIgJWQgc2VsZk1hYzogIiBNQUNfQUREUkVTU19TVFIgIiBic3NJZDogIiBNQUNfQUREUkVTU19TVFIgIiAiLAorCQkgICAgICAgYWRhcHRlci0+ZGV2aWNlX21vZGUsIHR4UG93ZXIsCisJCSAgICAgICBNQUNfQUREUl9BUlJBWShzZWxmTWFjKSwKKwkJICAgICAgIE1BQ19BRERSX0FSUkFZKGJzc2lkKSk7CisKKwkJc21lU3RhdHVzID0gc21lX3NldF9tYXhfdHhfcG93ZXIoKHRIYWxIYW5kbGUpKGhkZF9jdHgtPmhIYWwpLAorCQkJCQkJICBic3NpZCwgc2VsZk1hYywgdHhQb3dlcik7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgICIlczpTZXQgbWF4IHR4IHBvd2VyIGZhaWxlZCIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICAgICAiJXM6IFNldCBtYXggdHggcG93ZXIgc3VjY2VzcyIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWNkZl9zdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlcihoZGRfY3R4LCBwQWRhcHRlck5vZGUsCisJCQkJCQkgICZwTmV4dCk7CisJCXBBZGFwdGVyTm9kZSA9IHBOZXh0OworCX0KKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfc2V0X2Rmc19zY2FuX21vZGUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCXVpbnQ4X3QgZGZzU2Nhbk1vZGUgPSBDRkdfUk9BTUlOR19ERlNfQ0hBTk5FTF9ERUZBVUxUOworCisJLyogTW92ZSBwb2ludGVyIHRvIGFoZWFkIG9mIFNFVERGU1NDQU5NT0RFPGRlbGltaXRlcj4gKi8KKwl2YWx1ZSA9IHZhbHVlICsgY29tbWFuZF9sZW4gKyAxOworCisJLyogQ29udmVydCB0aGUgdmFsdWUgZnJvbSBhc2NpaSB0byBpbnRlZ2VyICovCisJcmV0ID0ga3N0cnRvdTgodmFsdWUsIDEwLCAmZGZzU2Nhbk1vZGUpOworCWlmIChyZXQgPCAwKSB7CisJCS8qCisJCSAqIElmIHRoZSBpbnB1dCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gbWF4IHZhbHVlIG9mIGRhdGF0eXBlLAorCQkgKiB0aGVuIGFsc28ga3N0cnRvdTggZmFpbHMKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGtzdHJ0b3U4IGZhaWxlZCByYW5nZSBbJWQgLSAlZF0iLAorCQkJICBfX2Z1bmNfXywgQ0ZHX1JPQU1JTkdfREZTX0NIQU5ORUxfTUlOLAorCQkJICBDRkdfUk9BTUlOR19ERlNfQ0hBTk5FTF9NQVgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKChkZnNTY2FuTW9kZSA8IENGR19ST0FNSU5HX0RGU19DSEFOTkVMX01JTikgfHwKKwkgICAgKGRmc1NjYW5Nb2RlID4gQ0ZHX1JPQU1JTkdfREZTX0NIQU5ORUxfTUFYKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgImRmc1NjYW5Nb2RlIHZhbHVlICVkIGlzIG91dCBvZiByYW5nZSAoTWluOiAlZCBNYXg6ICVkKSIsCisJCQkgIGRmc1NjYW5Nb2RlLAorCQkJICBDRkdfUk9BTUlOR19ERlNfQ0hBTk5FTF9NSU4sCisJCQkgIENGR19ST0FNSU5HX0RGU19DSEFOTkVMX01BWCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmVjZWl2ZWQgQ29tbWFuZCB0byBTZXQgREZTIFNjYW4gTW9kZSA9ICVkIiwKKwkJICBfX2Z1bmNfXywgZGZzU2Nhbk1vZGUpOworCisJaGRkX2N0eC0+Y29uZmlnLT5hbGxvd0RGU0NoYW5uZWxSb2FtID0gZGZzU2Nhbk1vZGU7CisJc21lX3VwZGF0ZV9kZnNfc2Nhbl9tb2RlKGhkZF9jdHgtPmhIYWwsIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkgZGZzU2Nhbk1vZGUpOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfZGZzX3NjYW5fbW9kZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJICAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCSAgICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCBkZnNTY2FuTW9kZSA9IHNtZV9nZXRfZGZzX3NjYW5fbW9kZShoZGRfY3R4LT5oSGFsKTsKKwljaGFyIGV4dHJhWzMyXTsKKwl1aW50OF90IGxlbiA9IDA7CisKKwlsZW4gPSBzY25wcmludGYoZXh0cmEsIHNpemVvZihleHRyYSksICIlcyAlZCIsIGNvbW1hbmQsIGRmc1NjYW5Nb2RlKTsKKwlsZW4gPSBDREZfTUlOKHByaXZfZGF0YS0+dG90YWxfbGVuLCBsZW4gKyAxKTsKKwlpZiAoY29weV90b191c2VyKHByaXZfZGF0YS0+YnVmLCAmZXh0cmEsIGxlbikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VyIGJ1ZmZlciIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRydl9jbWRfZ2V0X2xpbmtfc3RhdHVzKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICB1aW50OF90ICpjb21tYW5kLAorCQkJCSAgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJICAgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IHZhbHVlID0gd2xhbl9oZGRfZ2V0X2xpbmtfc3RhdHVzKGFkYXB0ZXIpOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuOworCisJbGVuID0gc2NucHJpbnRmKGV4dHJhLCBzaXplb2YoZXh0cmEpLCAiJXMgJWQiLCBjb21tYW5kLCB2YWx1ZSk7CisJbGVuID0gQ0RGX01JTihwcml2X2RhdGEtPnRvdGFsX2xlbiwgbGVuICsgMSk7CisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9FWFRXT1dfU1VQUE9SVAorc3RhdGljIGludCBkcnZfY21kX2VuYWJsZV9leHRfd293KGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgdWludDhfdCAqY29tbWFuZCwKKwkJCQkgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJaW50IHNldF92YWx1ZTsKKworCS8qIE1vdmUgcG9pbnRlciB0byBhaGVhZCBvZiBFTkFCTEVFWFRXT1cgKi8KKwl2YWx1ZSA9IHZhbHVlICsgY29tbWFuZF9sZW47CisKKwlzc2NhbmYodmFsdWUsICIlZCIsICZzZXRfdmFsdWUpOworCisJcmV0dXJuIGhkZF9lbmFibGVfZXh0X3dvd19wYXJzZXIoYWRhcHRlciwKKwkJCQkJIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJIHNldF92YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfYXBwMV9wYXJhbXMoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0OworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKworCS8qIE1vdmUgcG9pbnRlciB0byBhaGVhZCBvZiBTRVRBUFAxUEFSQU1TICovCisJdmFsdWUgPSB2YWx1ZSArIGNvbW1hbmRfbGVuOworCisJcmV0ID0gaGRkX3NldF9hcHBfdHlwZTFfcGFyc2VyKGFkYXB0ZXIsCisJCQkJICAgICAgIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwlpZiAocmV0ID49IDApCisJCWhkZF9jdHgtPmlzX2V4dHdvd19hcHBfdHlwZTFfcGFyYW1fc2V0ID0gdHJ1ZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfYXBwMl9wYXJhbXMoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0OworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKworCS8qIE1vdmUgcG9pbnRlciB0byBhaGVhZCBvZiBTRVRBUFAyUEFSQU1TICovCisJdmFsdWUgPSB2YWx1ZSArIGNvbW1hbmRfbGVuOworCisJcmV0ID0gaGRkX3NldF9hcHBfdHlwZTJfcGFyc2VyKGFkYXB0ZXIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwlpZiAocmV0ID49IDApCisJCWhkZF9jdHgtPmlzX2V4dHdvd19hcHBfdHlwZTJfcGFyYW1fc2V0ID0gdHJ1ZTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworLyoqCisgKiBkcnZfY21kX3RkbHNfc2Vjb25kYXJ5X2NoYW5uZWxfb2Zmc2V0KCkgLSBzZWNvbmRhcnkgdGRscyBvZmYgY2hhbm5lbCBvZmZzZXQKKyAqIEBhZGFwdGVyOiAgICAgUG9pbnRlciB0byB0aGUgSEREIGFkYXB0ZXIKKyAqIEBoZGRfY3R4OiAgICAgUG9pbnRlciB0byB0aGUgSEREIGNvbnRleHQKKyAqIEBjb21tYW5kOiAgICAgRHJpdmVyIGNvbW1hbmQgc3RyaW5nCisgKiBAY29tbWFuZF9sZW46IERyaXZlciBjb21tYW5kIHN0cmluZyBsZW5ndGgKKyAqIEBwcml2X2RhdGE6ICAgUHJpdmF0ZSBkYXRhIGNvbWluZyB3aXRoIHRoZSBkcml2ZXIgY29tbWFuZC4gVW51c2VkIGhlcmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZHJpdmVyIGNvbW1hbmQgdGhhdCBzZXRzIHRoZSBzZWNvbmRhcnkgdGRscyBvZmYgY2hhbm5lbAorICogb2Zmc2V0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGRydl9jbWRfdGRsc19zZWNvbmRhcnlfY2hhbm5lbF9vZmZzZXQoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkJCSBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCQkJIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJCQkgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkJCSBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0OworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKwlpbnQgc2V0X3ZhbHVlOworCisJLyogTW92ZSBwb2ludGVyIHRvIHBvaW50IHRoZSBzdHJpbmcgKi8KKwl2YWx1ZSArPSBjb21tYW5kX2xlbjsKKworCXJldCA9IHNzY2FuZih2YWx1ZSwgIiVkIiwgJnNldF92YWx1ZSk7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhkZExvZyhMT0cxLCBGTCgiVGRscyBvZmZjaGFubmVsIG9mZnNldDolZCIpLCBzZXRfdmFsdWUpOworCisJcmV0ID0gaGRkX3NldF90ZGxzX3NlY29mZmNoYW5uZWxvZmZzZXQoaGRkX2N0eCwgc2V0X3ZhbHVlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZHJ2X2NtZF90ZGxzX29mZl9jaGFubmVsX21vZGUoKSAtIHNldCB0ZGxzIG9mZiBjaGFubmVsIG1vZGUKKyAqIEBhZGFwdGVyOiAgICAgUG9pbnRlciB0byB0aGUgSEREIGFkYXB0ZXIKKyAqIEBoZGRfY3R4OiAgICAgUG9pbnRlciB0byB0aGUgSEREIGNvbnRleHQKKyAqIEBjb21tYW5kOiAgICAgRHJpdmVyIGNvbW1hbmQgc3RyaW5nCisgKiBAY29tbWFuZF9sZW46IERyaXZlciBjb21tYW5kIHN0cmluZyBsZW5ndGgKKyAqIEBwcml2X2RhdGE6ICAgUHJpdmF0ZSBkYXRhIGNvbWluZyB3aXRoIHRoZSBkcml2ZXIgY29tbWFuZC4gVW51c2VkIGhlcmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZHJpdmVyIGNvbW1hbmQgdGhhdCBzZXRzIHRkbHMgb2ZmIGNoYW5uZWwgbW9kZQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBkcnZfY21kX3RkbHNfb2ZmX2NoYW5uZWxfbW9kZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkgaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJCSB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCQkgaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50IHJldDsKKwl1aW50OF90ICp2YWx1ZSA9IGNvbW1hbmQ7CisJaW50IHNldF92YWx1ZTsKKworCS8qIE1vdmUgcG9pbnRlciB0byBwb2ludCB0aGUgc3RyaW5nICovCisJdmFsdWUgKz0gY29tbWFuZF9sZW47CisKKwlyZXQgPSBzc2NhbmYodmFsdWUsICIlZCIsICZzZXRfdmFsdWUpOworCWlmIChyZXQgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloZGRMb2coTE9HMSwgRkwoIlRkbHMgb2ZmY2hhbm5lbCBtb2RlOiVkIiksIHNldF92YWx1ZSk7CisKKwlyZXQgPSBoZGRfc2V0X3RkbHNfb2ZmY2hhbm5lbG1vZGUoYWRhcHRlciwgc2V0X3ZhbHVlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZHJ2X2NtZF90ZGxzX29mZl9jaGFubmVsKCkgLSBzZXQgdGRscyBvZmYgY2hhbm5lbCBudW1iZXIKKyAqIEBhZGFwdGVyOiAgICAgUG9pbnRlciB0byB0aGUgSEREIGFkYXB0ZXIKKyAqIEBoZGRfY3R4OiAgICAgUG9pbnRlciB0byB0aGUgSEREIGNvbnRleHQKKyAqIEBjb21tYW5kOiAgICAgRHJpdmVyIGNvbW1hbmQgc3RyaW5nCisgKiBAY29tbWFuZF9sZW46IERyaXZlciBjb21tYW5kIHN0cmluZyBsZW5ndGgKKyAqIEBwcml2X2RhdGE6ICAgUHJpdmF0ZSBkYXRhIGNvbWluZyB3aXRoIHRoZSBkcml2ZXIgY29tbWFuZC4gVW51c2VkIGhlcmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZHJpdmVyIGNvbW1hbmQgdGhhdCBzZXRzIHRkbHMgb2ZmIGNoYW5uZWwgbnVtYmVyCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGRydl9jbWRfdGRsc19vZmZfY2hhbm5lbChoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgICB1aW50OF90ICpjb21tYW5kLAorCQkJCSAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCSAgICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmV0OworCXVpbnQ4X3QgKnZhbHVlID0gY29tbWFuZDsKKwlpbnQgc2V0X3ZhbHVlOworCisJLyogTW92ZSBwb2ludGVyIHRvIHBvaW50IHRoZSBzdHJpbmcgKi8KKwl2YWx1ZSArPSBjb21tYW5kX2xlbjsKKworCXJldCA9IHNzY2FuZih2YWx1ZSwgIiVkIiwgJnNldF92YWx1ZSk7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhkZExvZyhMT0cxLCBGTCgiVGRscyBvZmZjaGFubmVsIG51bTogJWQiKSwgc2V0X3ZhbHVlKTsKKworCXJldCA9IGhkZF9zZXRfdGRsc19vZmZjaGFubmVsKGhkZF9jdHgsIHNldF92YWx1ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRydl9jbWRfdGRsc19zY2FuKCkgLSBzZXQgdGRscyBzY2FuIHR5cGUKKyAqIEBhZGFwdGVyOiAgICAgUG9pbnRlciB0byB0aGUgSEREIGFkYXB0ZXIKKyAqIEBoZGRfY3R4OiAgICAgUG9pbnRlciB0byB0aGUgSEREIGNvbnRleHQKKyAqIEBjb21tYW5kOiAgICAgRHJpdmVyIGNvbW1hbmQgc3RyaW5nCisgKiBAY29tbWFuZF9sZW46IERyaXZlciBjb21tYW5kIHN0cmluZyBsZW5ndGgKKyAqIEBwcml2X2RhdGE6ICAgUHJpdmF0ZSBkYXRhIGNvbWluZyB3aXRoIHRoZSBkcml2ZXIgY29tbWFuZC4gVW51c2VkIGhlcmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZHJpdmVyIGNvbW1hbmQgdGhhdCBzZXRzIHRkbHMgc2NhbiB0eXBlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGRydl9jbWRfdGRsc19zY2FuKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJICAgIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQ7CisJdWludDhfdCAqdmFsdWUgPSBjb21tYW5kOworCWludCBzZXRfdmFsdWU7CisKKwkvKiBNb3ZlIHBvaW50ZXIgdG8gcG9pbnQgdGhlIHN0cmluZyAqLworCXZhbHVlICs9IGNvbW1hbmRfbGVuOworCisJcmV0ID0gc3NjYW5mKHZhbHVlLCAiJWQiLCAmc2V0X3ZhbHVlKTsKKwlpZiAocmV0ICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaGRkTG9nKExPRzEsIEZMKCJUZGxzIHNjYW4gdHlwZSB2YWw6ICVkIiksIHNldF92YWx1ZSk7CisKKwlyZXQgPSBoZGRfc2V0X3RkbHNfc2Nhbl90eXBlKGhkZF9jdHgsIHNldF92YWx1ZSk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfcnNzaShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJICAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkgICAgdWludDhfdCAqY29tbWFuZCwKKwkJCSAgICB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQ7CisJaW50OF90IHJzc2kgPSAwOworCWNoYXIgZXh0cmFbMzJdOworCXVpbnQ4X3QgbGVuID0gMDsKKworCXdsYW5faGRkX2dldF9yc3NpKGFkYXB0ZXIsICZyc3NpKTsKKworCWxlbiA9IHNjbnByaW50ZihleHRyYSwgc2l6ZW9mKGV4dHJhKSwgIiVzICVkIiwgY29tbWFuZCwgcnNzaSk7CisJbGVuID0gQ0RGX01JTihwcml2X2RhdGEtPnRvdGFsX2xlbiwgbGVuICsgMSk7CisKKwlpZiAoY29weV90b191c2VyKHByaXZfZGF0YS0+YnVmLCAmZXh0cmEsIGxlbikpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyIikpOworCQlyZXQgPSAtRUZBVUxUOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJ2X2NtZF9nZXRfbGlua3NwZWVkKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJIHVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWludCByZXQ7CisJdWludDMyX3QgbGlua19zcGVlZCA9IDA7CisJY2hhciBleHRyYVszMl07CisJdWludDhfdCBsZW4gPSAwOworCisJcmV0ID0gd2xhbl9oZGRfZ2V0X2xpbmtfc3BlZWQoYWRhcHRlciwgJmxpbmtfc3BlZWQpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWxlbiA9IHNjbnByaW50ZihleHRyYSwgc2l6ZW9mKGV4dHJhKSwgIiVzICVkIiwgY29tbWFuZCwgbGlua19zcGVlZCk7CisJbGVuID0gQ0RGX01JTihwcml2X2RhdGEtPnRvdGFsX2xlbiwgbGVuICsgMSk7CisJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgJmV4dHJhLCBsZW4pKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VyIGJ1ZmZlciIpKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgRkVBVFVSRV9OQVBJCisvKioKKyAqIGhkZF9wYXJzZV9uYXBpKCkgLSBoZWxwZXIgZnVuY3Rpb25zIHRvIGRydl9jbWRfbmFwaQorICogQHN0ciA6IHNvdXJjZSBzdHJpbmcgdG8gcGFyc2UKKyAqIEBjbWQgOiBwb2ludGVyIHRvIGNtZCBwYXJ0IGFmdGVyIHBhcnNpbmcKKyAqIEBzdWIgOiBwb2ludGVyIHRvIHN1YmNtZCBwYXJ0IGFmdGVyIHBhcnNpbmcKKyAqIEBhdXggOiBwb2ludGVyIHRvIG9wdGlvbmFsIGF1eCBwYXJ0IGFmdGVyIHBhcnNpbmcKKyAqCisgKiBFeGFtcGxlOgorICogTkFQSSBTQ0FMRSA8bj4gICstLSBJTiAgc3RyCisgKiAgfCAgICB8ICAgICArLS0tLS0tIE9VVCBhdXgKKyAqICB8ICAgICstLS0tLS0tLS0tLS0gT1VUIHN1YmNtZAorICogICstLS0tLS0tLS0tLS0tLS0tLSBPVVQgY21kCisgKgorICogUmV0dXJuOiA9PTA6IHN1Y2Nlc3M7ICE9MDogZmFpbHVyZQorICovCitzdGF0aWMgaW50IGhkZF9wYXJzZV9uYXBpKGNoYXIgKipzdHIsIGNoYXIgKipjbWQsIGNoYXIgKipzdWIsIGNoYXIgKiphdXgpCit7CisJaW50IHJjOworCWNoYXIgKnRva2VuLCAqbGNtZCA9IE5VTEwsICpsc3ViID0gTlVMTCwgKmxhdXggPSBOVUxMOworCisJTkFQSV9ERUJVRygiLS0+XG4iKTsKKworCXRva2VuID0gc3Ryc2VwKHN0ciwgIiBcdCIpOworCWlmIChOVUxMID09IHRva2VuKSB7CisJCWhkZF9lcnIoImNhbm5vdCBwYXJzZSBjbWQiKTsKKwkJZ290byBwYXJzZV9lbmQ7CisJfQorCWxjbWQgPSB0b2tlbjsKKworCXRva2VuID0gc3Ryc2VwKHN0ciwgIiBcdCIpOworCWlmIChOVUxMID09IHRva2VuKSB7CisJCWhkZF9lcnIoImNhbm5vdCBwYXJzZSBzdWJjbWQiKTsKKwkJZ290byBwYXJzZV9lbmQ7CisJfQorCWxzdWIgPSB0b2tlbjsKKworCXRva2VuID0gc3Ryc2VwKHN0ciwgIiBcdCIpOworCWlmIChOVUxMID09IHRva2VuKQorCQloZGRfd2FybigiY2Fubm90IHBhcnNlIGF1eFxuIik7CisJZWxzZQorCQlsYXV4ID0gdG9rZW47CisKK3BhcnNlX2VuZDoKKwlpZiAoKE5VTEwgPT0gbGNtZCkgfHwgKE5VTEwgPT0gbHN1YikpCisJCXJjID0gLUVJTlZBTDsKKwllbHNlIHsKKwkJcmMgPSAwOworCQkqY21kID0gbGNtZDsKKwkJKnN1YiA9IGxzdWI7CisJCWlmIChOVUxMICE9IGF1eCkKKwkJCSphdXggPSBsYXV4OworCX0KKwlOQVBJX0RFQlVHKCI8LS1bcmM9JWRdXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKKy8qKgorICogaGRkX3BhcnNlX3N0YXRzKCkgLSBwcmludCBOQVBJIHN0YXRzIGludG8gYSBidWZmZXIKKyAqIEBidWYgOiBidWZmZXIgdG8gd3JpdGUgc3RhdHMgaW50bworICogQG1heCA6ICJzaXplIG9mIGJ1ZmZlciIKKyAqIEBpZHAgOiBOVUxMOiBhbGwgc3RhdHMsIG90aGVyd2lzZSwgcHRyIHRvIHRoZSBOQVBJIGluc3RhbmNlCisgKiBAbmFwaWQ6IGJpbmFyeSBzdHJ1Y3R1cmUgdG8gcmV0cmlldmUgdGhlIHN0YXRzIGZyb20KKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBieXRlcyB3cml0dGVuIGludG8gdGhlIGJ1ZmZlcgorICovCitpbnQgaGRkX25hcGlfc3RhdHMoY2hhciAgICpidWYsCisJCSAgIGludCAgICAgbWF4LAorCQkgICBjaGFyICAgKmluZHAsCisJCSAgIHN0cnVjdCBxY2FfbmFwaV9kYXRhICpuYXBpZCkKK3sKKwlpbnQgbiA9IDA7CisJaW50IGksIGosIGs7IC8qIE5BUEksIENQVSwgYnVja2V0IGluZGljZXMgKi8KKwlpbnQgZnJvbSwgdG87CisJc3RydWN0IHFjYV9uYXBpX2luZm8gKm5hcGlpOworCXN0cnVjdCBxY2FfbmFwaV9zdGF0ICpuYXBpczsKKworCU5BUElfREVCVUcoIi0tPlxuIik7CisKKwlpZiAoTlVMTCA9PSBpbmRwKSB7CisJCWZyb20gPSAwOworCQl0byA9IHNpemVvZih1aW50MzJfdCkgKiBDRV9DT1VOVF9NQVg7CisJfSBlbHNlIHsKKwkJaWYgKDAgPiBrc3RydG9pbnQoaW5kcCwgMTAsICZ0bykpIHsKKwkJCWZyb20gPSAwOworCQkJdG8gPSBzaXplb2YodWludDMyX3QpICogQ0VfQ09VTlRfTUFYOworCQl9IGVsc2UKKwkJCWZyb20gPSB0bzsKKwl9CisKKwlmb3IgKGkgPSBmcm9tOyBpIDwgdG87IGkrKykKKwkJaWYgKG5hcGlkLT5jZV9tYXAgJiAoMHgwMSA8PCBpKSkgeworCQkJbmFwaWkgPSAmKG5hcGlkLT5uYXBpc1tpXSk7CisJCQlmb3IgKGogPSAwOyBqIDwgTlJfQ1BVUzsgaisrKSB7CisJCQkJbmFwaXMgPSAmKG5hcGlpLT5zdGF0c1tqXSk7CisJCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgbWF4IC0gbiwKKwkJCQkJICAgICAgICJTVEFUUzogTkFQSVslZF0gQ1BVOiAlZCBzY2hlZHM6ICVkIHBvbGxzOiAlZCBjb21wbGV0ZXM6ICVkIGRvbmU6ICVkICIsCisJCQkJCSAgICAgICBpLCBqLAorCQkJCQkgICAgICAgbmFwaXMtPm5hcGlfc2NoZWR1bGVzLAorCQkJCQkgICAgICAgbmFwaXMtPm5hcGlfcG9sbHMsCisJCQkJCSAgICAgICBuYXBpcy0+bmFwaV9jb21wbGV0ZXMsCisJCQkJCSAgICAgICBuYXBpcy0+bmFwaV93b3JrZG9uZSk7CisKKwkJCQlmb3IgKGsgPSAwOyBrIDwgUUNBX05BUElfTlVNX0JVQ0tFVFM7IGsrKykgeworCQkJCQluICs9IHNjbnByaW50ZigKKwkJCQkJCWJ1ZiArIG4sIG1heCAtIG4sCisJCQkJCQkiICVkIiwKKwkJCQkJCW5hcGlzLT5uYXBpX2J1ZGdldF91c2VzW2tdKTsKKwkJCQl9CisJCQkJbiArPSBzY25wcmludGYoYnVmK24sIG1heCAtIG4sICJcbiIpOworCQkJfQorCQl9CisKKwlOQVBJX0RFQlVHKCI8LS1bbj0lZF1cbiIsIG4pOworCXJldHVybiBuOworfQorCisvKioKKyAqIG5hcGlfc2V0X3NjYWxlKCkgLSBzZXRzIHRoZSBzY2FsZSBhdHRyaWJ1dGUgaW4gYWxsIE5BUEkgZW50cmllcworICogQHNjIDogc2NhbGUgdG8gc2V0CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIG5hcGlfc2V0X3NjYWxlKHVpbnQ4X3Qgc2MpCit7CisJdWludDMyX3QgIGk7CisJc3RydWN0IHFjYV9uYXBpX2RhdGEgKm5hcGlfZGF0YTsKKworCW5hcGlfZGF0YSA9IGhkZF9uYXBpX2dldF9hbGwoKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHVpbnQzMl90KSo4OyBpKyspCisJCWlmIChuYXBpX2RhdGEtPmNlX21hcCAmICgweDAxIDw8IGkpKQorCQkJbmFwaV9kYXRhLT5uYXBpc1tpXS5zY2FsZSA9IHNjOworCisJcmV0dXJuOworfQorLyoqCisgKiBkcnZfY21kX25hcGkoKSAtIHByb2Nlc3NlcyBOQVBJIGNvbW1hbmRzCisgKiBAYWRhcHRlciAgICA6IG5ldF9kZXZpY2UKKyAqIEBoZGRfY3R4ICAgIDogSEREIGNvbnRleHQKKyAqIEBjb21tYW5kICAgIDogY29tbWFuZCBzdHJpbmcgZnJvbSB1c2VyIGNvbW1hbmQgKGluY2x1ZGluZyAiTkFQSSIpCisgKiBAY29tbWFuZF9sZW46IGxlbmd0aCBvZiBjb21tYW5kCisgKiBAcHJpdl9kYXRhICA6IGlmcl9kYXRhCisgKgorICogQ29tbWFuZHMgc3VwcG9ydGVkOgorICogTkFQSSBFTkFCTEUgICAgICA6IGVuYWJsZXMgTkFQSSBhZG1pbmlzdHJhdGl2ZWx5LiBOb3RlIHRoYXQgdGhpcyBtYXkgbm90CisgKiAgICAgICAgICAgICAgICAgICAgZW5hYmxlIE5BUEkgZnVuY3Rpb25hbGx5LCBhcyBzb21lIG90aGVyIGNvbmRpdGlvbnMKKyAqICAgICAgICAgICAgICAgICAgICBtYXkgbm90IGhhdmUgYmVlbiBzYXRpc2ZpZWQgeWV0CisgKiBOQVBJIERJU0FCTEUgICAgIDogcmV2ZXJzZSBvcGVyYXRpb24gb2YgImVuYWJsZSIKKyAqIE5BUEkgU1RBVFVTICAgICAgOiBnZXQgZ2xvYmFsIHN0YXR1cyBvZiBOQVBJIGluc3RhbmNlcworICogTkFQSSBTVEFUUyBbPG4+XSA6IGdldCB0aGUgc3RhdHMgZm9yIGEgZ2l2ZW4gTkFQSSBpbnN0YW5jZQorICogTkFQSSBTQ0FMRSA8bj4gICA6IHNldCB0aGUgc2NhbGUgZmFjdG9yCisgKgorICogUmV0dXJuOiAwOiBzdWNjZXNzOyAwPjogZmFpbHVyZQorICovCitzdGF0aWMgaW50IGRydl9jbWRfbmFwaShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCXVpbnQ4X3QgKmNvbW1hbmQsCisJCQl1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJaW50ICByYyA9IDA7CisJaW50ICBuLCBsOworCWNoYXIgKmNtZCA9IE5VTEwsICpzdWJjbWQgPSBOVUxMLCAqYXV4ID0gTlVMTDsKKwljaGFyICpzeW5vcHNpcyA9ICJOQVBJIEVOQUJMRVxuIgorCQkiTkFQSSBESVNBQkxFXG4iCisJCSJOQVBJIFNUQVRVU1xuIgorCQkiTkFQSSBTVEFUUyBbPG4+XSAtLSBpZiBubyA8bj4gdGhlbiBhbGxcbiIKKwkJIk5BUEkgU0NBTEUgPG4+ICAgLS0gc2V0IHRoZSBzY2FsZVxuIjsKKwljaGFyICpyZXBseSA9IE5VTEw7CisKKwkvKiBtYWtlIGEgbG9jYWwgY29weSwgYXMgc3Ryc2VwIG1vZGlmaWVzIHRoZSBzdHIgaW4gcGxhY2UgKi8KKwljaGFyICpzdHIgPSBOVUxMOworCisJTkFQSV9ERUJVRygiLS0+XG4iKTsKKworCS8qKgorCSAqIE5PVEUgVE8gTUFJTlRBSU5FUjogZnJvbSB0aGlzIHBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLAorCSAqIHBsZWFzZSBkbyBub3QgcmV0dXJuIGFueXdoZXJlIGluIHRoZSBjb2RlIGV4Y2VwdCB0aGUgdmVyeSBlbmQKKwkgKiB0byBhdm9pZCBtZW1vcnkgbGVha2FnZSAoZ290byBlbmRfZHJ2X25hcGkgaW5zdGVhZCkKKwkgKiBvciBtYWtlIHN1cmUgdGhhdCByZXBseStzdHIgaXMgZnJlZWQKKwkgKi8KKwlyZXBseSA9IGttYWxsb2MoTUFYX1VTRVJfQ09NTUFORF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSByZXBseSkgeworCQloZGRfZXJyKCJjb3VsZCBub3QgYWxsb2NhdGUgcmVwbHkgYnVmZmVyIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlbmRfZHJ2X25hcGk7CisJfQorCisJc3RyID0ga21hbGxvYyhzdHJsZW4oY29tbWFuZCkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBzdHIpIHsKKwkJaGRkX2VycigiY291bGQgbm90IGFsbG9jYXRlIGNvcHkgb2YgaW5wdXQgYnVmZmVyIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlbmRfZHJ2X25hcGk7CisJfQorCisJc3RybGNweShzdHIsIGNvbW1hbmQsIHN0cmxlbihjb21tYW5kKSArIDEpOworCWhkZF9kZWJ1ZygicGFyc2luZyBjb21tYW5kIGludG8gY21kPTB4JXAgc3ViPTB4JXAgYXV4PTB4JXBcbiIsCisJCSAgY21kLCBzdWJjbWQsIGF1eCk7CisKKworCXJjID0gaGRkX3BhcnNlX25hcGkoJnN0ciwgJmNtZCwgJnN1YmNtZCwgJmF1eCk7CisKKwlpZiAoMCAhPSByYykgeworCQljb25zdCBjaGFyICptc2cgPSAidW5rbm93biBvciBiYWRseSBmb3JtYXR0ZWQgY21kXG4lcyI7CisJCWwgPSBDREZfTUlOKE1BWF9VU0VSX0NPTU1BTkRfU0laRSwKKwkJCSAgICBzdHJsZW4obXNnKStzdHJsZW4oc3lub3BzaXMpKTsKKwkJbiA9IHNjbnByaW50ZihyZXBseSwgbCwgbXNnLCBzeW5vcHNpcyk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgcmVwbHksCisJCQkJIENERl9NSU4ocHJpdl9kYXRhLT50b3RhbF9sZW4sIGwpKSkKKwkJCWhkZF9lcnIoImZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiKTsKKwkJaGRkX2RlYnVnKCJyZXBseTogJXMiLCByZXBseSk7CisKKwkJcmMgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCWhkZF9kZWJ1ZygiY21kPSglcykgc3ViY21kPSglcykgYXV4PSglcylcbiIsCisJCQljbWQsIHN1YmNtZCwgYXV4KTsKKwkJaWYgKCFzdHJjbXAoc3ViY21kLCAiRU5BQkxFIikpCisJCQloZGRfbmFwaV9ldmVudChOQVBJX0VWVF9DTURfU1RBVEUsICh2b2lkICopMSk7CisJCWVsc2UgaWYgKCFzdHJjbXAoc3ViY21kLCAiRElTQUJMRSIpKQorCQkJaGRkX25hcGlfZXZlbnQoTkFQSV9FVlRfQ01EX1NUQVRFLCAodm9pZCAqKTApOworCQllbHNlIGlmICghc3RyY21wKHN1YmNtZCwgIlNUQVRVUyIpKSB7CisJCQlpbnQgbiA9IDA7CisJCQl1aW50MzJfdCAgaTsKKwkJCXN0cnVjdCBxY2FfbmFwaV9kYXRhICpuYXBpX2RhdGE7CisKKwkJCW5hcGlfZGF0YSA9IGhkZF9uYXBpX2dldF9hbGwoKTsKKwkJCW4gKz0gc2NucHJpbnRmKHJlcGx5K24sIE1BWF9VU0VSX0NPTU1BTkRfU0laRSAtIG4sCisJCQkJICAgICAgICJOQVBJIHN0YXRlOiAweCUwOHggbWFwOiAweCUwOHhcbiIsCisJCQkJICAgICAgIG5hcGlfZGF0YS0+c3RhdGUsCisJCQkJICAgICAgIG5hcGlfZGF0YS0+Y2VfbWFwKTsKKworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZih1aW50MzJfdCkqODsgaSsrKQorCQkJCWlmIChuYXBpX2RhdGEtPmNlX21hcCAmICgweDAxIDw8IGkpKSB7CisJCQkJCW4gKz0gc2NucHJpbnRmKAorCQkJCQkJcmVwbHkgKyBuLAorCQkJCQkJTUFYX1VTRVJfQ09NTUFORF9TSVpFIC0gbiwKKwkJCQkJCSIjJWQ6IGlkOiAlZCwgc2NhbGU9JWRcbiIsCisJCQkJCQlpLAorCQkJCQkJbmFwaV9kYXRhLT5uYXBpc1tpXS5pZCwKKwkJCQkJCW5hcGlfZGF0YS0+bmFwaXNbaV0uc2NhbGUpOworCQkJCX0KKwkJCWhkZF9pbmZvKCJ3bGFuOiBTVEFUVVMgREFUQTpcbiVzIiwgcmVwbHkpOworCQkJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgcmVwbHksCisJCQkJCSBDREZfTUlOKG4sIHByaXZfZGF0YS0+dG90YWxfbGVuKSkpCisJCQkJcmMgPSAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoc3ViY21kLCAiU1RBVFMiKSkgeworCQkJaW50IG4gPSAwOworCQkJc3RydWN0IHFjYV9uYXBpX2RhdGEgKm5hcGlfZGF0YTsKKworCQkJbmFwaV9kYXRhID0gaGRkX25hcGlfZ2V0X2FsbCgpOworCQkJbiA9IGhkZF9uYXBpX3N0YXRzKHJlcGx5LCBNQVhfVVNFUl9DT01NQU5EX1NJWkUsCisJCQkJCSAgIGF1eCwgbmFwaV9kYXRhKTsKKwkJCU5BUElfREVCVUcoIlNUQVRTOiByZXR1cm5zICVkXG4iLCBuKTsKKworCQkJaWYgKG4gPiAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEtPmJ1ZiwgcmVwbHksCisJCQkJCQkgQ0RGX01JTihwcml2X2RhdGEtPnRvdGFsX2xlbiwKKwkJCQkJCQkgbikpKQorCQkJCQlyYyA9IC1FSU5WQUw7CisJCQkJaGRkX2luZm8oIndsYW46IFNUQVRTX0RBVEFcbiVzXG4iLCByZXBseSk7CisJCQl9IGVsc2UKKwkJCQlyYyA9IC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChzdWJjbWQsICJTQ0FMRSIpKSB7CisJCQlpZiAoTlVMTCA9PSBhdXgpIHsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJaGRkX2Vycigid2xhbjogU0NBTEUgY21kIHJlcXVpcmVzIDxuPiIpOworCQkJfSBlbHNlIHsKKwkJCQl1aW50OF90IHNjOworCQkJCXJjID0ga3N0cnRvdTgoYXV4LCAxMCwgJnNjKTsKKwkJCQlpZiAocmMpIHsKKwkJCQkJaGRkX2Vycigid2xhbjogYmFkIHNjYWxlICglcykiLCBhdXgpOworCQkJCQlyYyA9IC1FSU5WQUw7CisJCQkJfSBlbHNlCisJCQkJCW5hcGlfc2V0X3NjYWxlKHNjKTsKKwkJCX0KKwkJfSAvKiBTQ0FMRSAqLworCX0KK2VuZF9kcnZfbmFwaToKKwlpZiAoTlVMTCAhPSBzdHIpCisJCWtmcmVlKHN0cik7CisJaWYgKE5VTEwgIT0gcmVwbHkpCisJCWtmcmVlKHJlcGx5KTsKKworCU5BUElfREVCVUcoIjwtLVtyYz0lZF1cbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9OQVBJICovCisKKy8qKgorICogaGRkX3NldF9yeF9maWx0ZXIoKSAtIHNldCBSWCBmaWx0ZXIKKyAqIEBhZGFwdGVyOiBQb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBhY3Rpb246IEZpbHRlciBhY3Rpb24KKyAqIEBwYXR0ZXJuOiBBZGRyZXNzIHBhdHRlcm4KKyAqCisgKiBBZGRyZXNzIHBhdHRlcm4gaXMgbW9zdCBzaWduaWZpY2FudCBieXRlIG9mIGFkZHJlc3MgZm9yIGV4YW1wbGUKKyAqIDB4MDEgZm9yIElQVjQgbXVsdGljYXN0IGFkZHJlc3MKKyAqIDB4MzMgZm9yIElQVjYgbXVsdGljYXN0IGFkZHJlc3MKKyAqIDB4RkYgZm9yIGJyb2FkY2FzdCBhZGRyZXNzCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IGhkZF9zZXRfcnhfZmlsdGVyKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIGJvb2wgYWN0aW9uLAorCQkJdWludDhfdCBwYXR0ZXJuKQoreworCWludCByZXQ7CisJdWludDhfdCBpOworCXRIYWxIYW5kbGUgaGFuZGxlOworCXRTaXJSY3ZGbHRNY0FkZHJMaXN0ICpmaWx0ZXI7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWhhbmRsZSA9IGhkZF9jdHgtPmhIYWw7CisKKwlpZiAoTlVMTCA9PSBoYW5kbGUpIHsKKwkJaGRkX2VycigiSEFMIEhhbmRsZSBpcyBOVUxMIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogSWYgYWN0aW9uIGlzIGZhbHNlIGl0IG1lYW5zIHN0YXJ0IGRyb3BwaW5nIHBhY2tldHMKKwkgKiBTZXQgYWRkcl9maWx0ZXJfcGF0dGVybiB3aGljaCB3aWxsIGJlIHVzZWQgd2hlbiBzZW5kaW5nCisJICogTUMvQkMgYWRkcmVzcyBsaXN0IHRvIHRhcmdldAorCSAqLworCWlmICghYWN0aW9uKQorCQlhZGFwdGVyLT5hZGRyX2ZpbHRlcl9wYXR0ZXJuID0gcGF0dGVybjsKKwllbHNlCisJCWFkYXB0ZXItPmFkZHJfZmlsdGVyX3BhdHRlcm4gPSAwOworCisJaWYgKCgoYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikgfHwKKwkJKGFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9DTElFTlQpKSAmJgorCQlhZGFwdGVyLT5tY19hZGRyX2xpc3QubWNfY250ICYmCisJCWhkZF9jb25uX2lzX2Nvbm5lY3RlZChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpKSkgeworCisKKwkJZmlsdGVyID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpmaWx0ZXIpKTsKKwkJaWYgKE5VTEwgPT0gZmlsdGVyKSB7CisJCQloZGRfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgTWVtb3J5Iik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlmaWx0ZXItPmFjdGlvbiA9IGFjdGlvbjsKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm1jX2FkZHJfbGlzdC5tY19jbnQ7IGkrKykgeworCQkJaWYgKCFtZW1jbXAoYWRhcHRlci0+bWNfYWRkcl9saXN0LmFkZHJbaV0sCisJCQkJJnBhdHRlcm4sIDEpKSB7CisJCQkJbWVtY3B5KGZpbHRlci0+bXVsdGljYXN0QWRkcltpXSwKKwkJCQkJYWRhcHRlci0+bWNfYWRkcl9saXN0LmFkZHJbaV0sCisJCQkJCXNpemVvZihhZGFwdGVyLT5tY19hZGRyX2xpc3QuYWRkcltpXSkpOworCQkJCWZpbHRlci0+dWxNdWx0aWNhc3RBZGRyQ250Kys7CisJCQkJaGRkX2VycigiJXMgUlggZmlsdGVyIDogYWRkciA9IgorCQkJCSAgICBNQUNfQUREUkVTU19TVFIsCisJCQkJICAgIGFjdGlvbiA/ICJzZXR0aW5nIiA6ICJjbGVhcmluZyIsCisJCQkJICAgIE1BQ19BRERSX0FSUkFZKGZpbHRlci0+bXVsdGljYXN0QWRkcltpXSkpOworCQkJfQorCQl9CisJCS8qIFNldCByeCBmaWx0ZXIgKi8KKwkJc21lXzgwMjNfbXVsdGljYXN0X2xpc3QoaGFuZGxlLCBhZGFwdGVyLT5zZXNzaW9uSWQsIGZpbHRlcik7CisJCWNkZl9tZW1fZnJlZShmaWx0ZXIpOworCX0gZWxzZSB7CisJCWhkZF9lcnIoIm1vZGUgJWQgbWNfY250ICVkIiwKKwkJCWFkYXB0ZXItPmRldmljZV9tb2RlLCBhZGFwdGVyLT5tY19hZGRyX2xpc3QubWNfY250KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfZHJpdmVyX3J4ZmlsdGVyX2NvbWFuZF9oYW5kbGVyKCkgLSBSWEZJTFRFUiBkcml2ZXIgY29tbWFuZCBoYW5kbGVyCisgKiBAY29tbWFuZDogUG9pbnRlciB0byBpbnB1dCBzdHJpbmcgZHJpdmVyIGNvbW1hbmQKKyAqIEBhZGFwdGVyOiBQb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBhY3Rpb246IEFjdGlvbiB0byBlbmFibGUvZGlzYWJsZSBmaWx0ZXJpbmcKKyAqCisgKiBJZiBhY3Rpb24gPT0gZmFsc2UKKyAqIFN0YXJ0IGZpbHRlcmluZyBvdXQgZGF0YSBwYWNrZXRzIGJhc2VkIG9uIHR5cGUKKyAqIFJYRklMVEVSLVJFTU9WRSAwIC0+IFN0YXJ0IGZpbHRlcmluZyBvdXQgdW5pY2FzdCBkYXRhIHBhY2tldHMKKyAqIFJYRklMVEVSLVJFTU9WRSAxIC0+IFN0YXJ0IGZpbHRlcmluZyBvdXQgYnJvYWRjYXN0IGRhdGEgcGFja2V0cworICogUlhGSUxURVItUkVNT1ZFIDIgLT4gU3RhcnQgZmlsdGVyaW5nIG91dCBJUFY0IG1jYXN0IGRhdGEgcGFja2V0cworICogUlhGSUxURVItUkVNT1ZFIDMgLT4gU3RhcnQgZmlsdGVyaW5nIG91dCBJUFY2IG1jYXN0IGRhdGEgcGFja2V0cworICoKKyAqIGlmIGFjdGlvbiA9PSB0cnVlCisgKiBTdG9wIGZpbHRlcmluZyBkYXRhIHBhY2tldHMgYmFzZWQgb24gdHlwZQorICogUlhGSUxURVItQUREIDAgLT4gU3RvcCBmaWx0ZXJpbmcgdW5pY2FzdCBkYXRhIHBhY2tldHMKKyAqIFJYRklMVEVSLUFERCAxIC0+IFN0b3AgZmlsdGVyaW5nIGJyb2FkY2FzdCBkYXRhIHBhY2tldHMKKyAqIFJYRklMVEVSLUFERCAyIC0+IFN0b3AgZmlsdGVyaW5nIElQVjQgbWNhc3QgZGF0YSBwYWNrZXRzCisgKiBSWEZJTFRFUi1BREQgMyAtPiBTdG9wIGZpbHRlcmluZyBJUFY2IG1jYXN0IGRhdGEgcGFja2V0cworICoKKyAqIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBJUFY0IGFkZHJlc3MgZmlsdGVyaW5nIGJ5CisgKiBzZWxlY3RpdmVseSBhbGxvd2luZyBJUFY0IG11bHRpY2FzdCBkYXRhIHBhY2tlc3QgYmFzZWQgb24KKyAqIGFkZHJlc3MgbGlzdCByZWNlaXZlZCBpbiAubmRvX3NldF9yeF9tb2RlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IGhkZF9kcml2ZXJfcnhmaWx0ZXJfY29tYW5kX2hhbmRsZXIodWludDhfdCAqY29tbWFuZCwKKwkJCQkJCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJCQlib29sIGFjdGlvbikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90ICp2YWx1ZTsKKwl1aW50OF90IHR5cGU7CisKKwl2YWx1ZSA9IGNvbW1hbmQ7CisJLyogU2tpcCBzcGFjZSBhZnRlciBSWEZJTFRFUi1SRU1PVkUgT1IgUlhGSUxURVItQUREIGJhc2VkIG9uIGFjdGlvbiAqLworCWlmICghYWN0aW9uKQorCQl2YWx1ZSA9IGNvbW1hbmQgKyAxNjsKKwllbHNlCisJCXZhbHVlID0gY29tbWFuZCArIDEzOworCXJldCA9IGtzdHJ0b3U4KHZhbHVlLCAxMCwgJnR5cGUpOworCWlmIChyZXQgPCAwKSB7CisJCWhkZF9lcnIoImtzdHJ0b3U4IGZhaWxlZCBpbnZhbGlkIGlucHV0IHZhbHVlICVkIiwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMjoKKwkJLyogU2V0IHJ4IGZpbHRlciBmb3IgSVBWNCBtdWx0aWNhc3QgZGF0YSBwYWNrZXRzICovCisJCXJldCA9IGhkZF9zZXRfcnhfZmlsdGVyKGFkYXB0ZXIsIGFjdGlvbiwgMHgwMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWhkZF9pbmZvKCJVbnN1cHBvcnRlZCBSWEZJTFRFUiB0eXBlICVkIiwgdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZHJ2X2NtZF9yeF9maWx0ZXJfcmVtb3ZlKCkgLSBSWEZJTFRFUiBSRU1PVkUgZHJpdmVyIGNvbW1hbmQgaGFuZGxlcgorICogQGFkYXB0ZXI6IFBvaW50ZXIgdG8gbmV0d29yayBhZGFwdGVyCisgKiBAaGRkX2N0eDogUG9pbnRlciB0byBoZGQgY29udGV4dAorICogQGNvbW1hbmQ6IFBvaW50ZXIgdG8gaW5wdXQgY29tbWFuZAorICogQGNvbW1hbmRfbGVuOiBDb21tYW5kIGxlbmd0aAorICogQHByaXZfZGF0YTogUG9pbnRlciB0byBwcml2YXRlIGRhdGEgaW4gY29tbWFuZAorICovCitzdGF0aWMgaW50IGRydl9jbWRfcnhfZmlsdGVyX3JlbW92ZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJdWludDhfdCAqY29tbWFuZCwKKwkJCQl1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJCWhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCXJldHVybiBoZGRfZHJpdmVyX3J4ZmlsdGVyX2NvbWFuZF9oYW5kbGVyKGNvbW1hbmQsIGFkYXB0ZXIsIGZhbHNlKTsKK30KKworLyoqCisgKiBkcnZfY21kX3J4X2ZpbHRlcl9hZGQoKSAtIFJYRklMVEVSIEFERCBkcml2ZXIgY29tbWFuZCBoYW5kbGVyCisgKiBAYWRhcHRlcjogUG9pbnRlciB0byBuZXR3b3JrIGFkYXB0ZXIKKyAqIEBoZGRfY3R4OiBQb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKiBAY29tbWFuZDogUG9pbnRlciB0byBpbnB1dCBjb21tYW5kCisgKiBAY29tbWFuZF9sZW46IENvbW1hbmQgbGVuZ3RoCisgKiBAcHJpdl9kYXRhOiBQb2ludGVyIHRvIHByaXZhdGUgZGF0YSBpbiBjb21tYW5kCisgKi8KK3N0YXRpYyBpbnQgZHJ2X2NtZF9yeF9maWx0ZXJfYWRkKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQl1aW50OF90ICpjb21tYW5kLAorCQkJCXVpbnQ4X3QgY29tbWFuZF9sZW4sCisJCQkJaGRkX3ByaXZfZGF0YV90ICpwcml2X2RhdGEpCit7CisJcmV0dXJuIGhkZF9kcml2ZXJfcnhmaWx0ZXJfY29tYW5kX2hhbmRsZXIoY29tbWFuZCwgYWRhcHRlciwgdHJ1ZSk7Cit9CisKKy8qCisgKiBkdW1teSAobm8tb3ApIGhkZCBkcml2ZXIgY29tbWFuZCBoYW5kbGVyCisgKi8KK3N0YXRpYyBpbnQgZHJ2X2NtZF9kdW1teShoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkgdWludDhfdCAqY29tbWFuZCwKKwkJCSB1aW50OF90IGNvbW1hbmRfbGVuLAorCQkJIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWhkZF9pbmZvKCIlczogSWdub3JpbmcgZHJpdmVyIGNvbW1hbmQgXCIlc1wiIiwKKwkJIGFkYXB0ZXItPmRldi0+bmFtZSwgY29tbWFuZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoYW5kbGVyIGZvciBhbnkgdW5zdXBwb3J0ZWQgd2xhbiBoZGQgZHJpdmVyIGNvbW1hbmQKKyAqLworc3RhdGljIGludCBkcnZfY21kX2ludmFsaWQoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCSAgIGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkgICB1aW50OF90ICpjb21tYW5kLAorCQkJICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCSAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfVU5TVVBQT1JURURfSU9DVEwsCisJCQkgYWRhcHRlci0+c2Vzc2lvbklkLCAwKSk7CisKKwloZGRfd2FybigiJXM6IFVuc3VwcG9ydGVkIGRyaXZlciBjb21tYW5kIFwiJXNcIiIsCisJCSBhZGFwdGVyLT5kZXYtPm5hbWUsIGNvbW1hbmQpOworCisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworLyoqCisgKiBkcnZfY21kX3NldF9mY2NfY2hhbm5lbCgpIC0gaGFuZGxlIGZjYyBjb25zdHJhaW50IHJlcXVlc3QKKyAqIEBhZGFwdGVyOiBIREQgYWRhcHRlcgorICogQGhkZF9jdHg6IEhERCBjb250ZXh0CisgKiBAY29tbWFuZDogY29tbWFuZCBwdHIsIFNFVF9GQ0NfQ0hBTk5FTCAwLzEgaXMgdGhlIGNvbW1hbmQKKyAqIEBjb21tYW5kX2xlbjogY29tbWFuZCBsZW4KKyAqIEBwcml2X2RhdGE6IHByaXZhdGUgZGF0YQorICoKKyAqIFJldHVybjogc3RhdHVzCisgKi8KK3N0YXRpYyBpbnQgZHJ2X2NtZF9zZXRfZmNjX2NoYW5uZWwoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICBoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgIHVpbnQ4X3QgKmNvbW1hbmQsCisJCQkJICAgdWludDhfdCBjb21tYW5kX2xlbiwKKwkJCQkgICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwl1aW50OF90ICp2YWx1ZTsKKwl1aW50OF90IGZjY19jb25zdHJhaW50OworCUNERl9TVEFUVVMgc3RhdHVzOworCWludCByZXQgPSAwOworCisJLyoKKwkgKiB0aGlzIGNvbW1hbmQgd291bGQgYmUgY2FsbGVkIGJ5IHVzZXItc3BhY2Ugd2hlbiBpdCBkZXRlY3RzIFdMQU4KKwkgKiBPTiBhZnRlciBhaXJwbGFuZSBtb2RlIGlzIHNldC4gV2hlbiBBUE0gaXMgc2V0LCBXTEFOIHR1cm5zIG9mZi4KKwkgKiBCdXQgaXQgY2FuIGJlIHR1cm5lZCBiYWNrIG9uLiBPdGhlcndpc2U7IHdoZW4gQVBNIGlzIHR1cm5lZCBiYWNrCisJICogb2ZmLCBXTEFOIHdvdWxkIHR1cm4gYmFjayBvbi4gU28gYXQgdGhhdCBwb2ludCB0aGUgY29tbWFuZCBpcworCSAqIGV4cGVjdGVkIHRvIGNvbWUgZG93bi4gMCBtZWFucyBkaXNhYmxlLCAxIG1lYW5zIGVuYWJsZS4gVGhlCisJICogY29uc3RyYWludCBpcyByZW1vdmVkIHdoZW4gcGFyYW1ldGVyIDEgaXMgc2V0IG9yIGRpZmZlcmVudAorCSAqIGNvdW50cnkgY29kZSBpcyBzZXQKKwkgKi8KKworCXZhbHVlID0gIGNvbW1hbmQgKyBjb21tYW5kX2xlbiArIDE7CisKKwlyZXQgPSBrc3RydG91OCh2YWx1ZSwgMTAsICZmY2NfY29uc3RyYWludCk7CisJaWYgKChyZXQgPCAwKSB8fCAoZmNjX2NvbnN0cmFpbnQgPiAxKSkgeworCQkvKgorCQkgKiAgSWYgdGhlIGlucHV0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYXggdmFsdWUgb2YgZGF0YXR5cGUsCisJCSAqICB0aGVuIGFsc28gaXQgaXMgYSBmYWlsdXJlCisJCSAqLworCQloZGRfZXJyKCJ2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RhdHVzID0gc21lX2Rpc2FibGVfbm9uX2ZjY19jaGFubmVsKGhkZF9jdHgtPmhIYWwsICFmY2NfY29uc3RyYWludCk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkX2Vycigic21lIGRpc2FibGUgZm4uIHJldHVybmVkIGVyciIpOworCQlyZXQgPSAtRVBFUk07CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdGFibGUgY29udGFpbnMgYWxsIHN1cHBvcnRlZCBXTEFOIEhERAorICogSU9DVEwgZHJpdmVyIGNvbW1hbmRzIGFuZCB0aGUgaGFuZGxlciBmb3IgZWFjaCBvZiB0aGVtLgorICovCitzdGF0aWMgY29uc3QgaGRkX2Rydl9jbWRfdCBoZGRfZHJ2X2NtZHNbXSA9IHsKKwl7IlAyUF9ERVZfQUREUiIsICAgICAgICAgICAgICBkcnZfY21kX3AycF9kZXZfYWRkcn0sCisJeyJQMlBfU0VUX05PQSIsICAgICAgICAgICAgICAgZHJ2X2NtZF9wMnBfc2V0X25vYX0sCisJeyJQMlBfU0VUX1BTIiwgICAgICAgICAgICAgICAgZHJ2X2NtZF9wMnBfc2V0X3BzfSwKKwl7IlNFVEJBTkQiLCAgICAgICAgICAgICAgICAgICBkcnZfY21kX3NldF9iYW5kfSwKKwl7IlNFVFdNTVBTIiwgICAgICAgICAgICAgICAgICBkcnZfY21kX3NldF93bW1wc30sCisJeyJDT1VOVFJZIiwgICAgICAgICAgICAgICAgICAgZHJ2X2NtZF9jb3VudHJ5fSwKKwl7IlNFVFNVU1BFTkRNT0RFIiwgICAgICAgICAgICBkcnZfY21kX2R1bW15fSwKKwl7IlNFVF9BUF9XUFNfUDJQX0lFIiwgICAgICAgICBkcnZfY21kX2R1bW15fSwKKwl7IkJUQ09FWFNDQU4iLCAgICAgICAgICAgICAgICBkcnZfY21kX2R1bW15fSwKKwl7IlJYRklMVEVSIiwgICAgICAgICAgICAgICAgICBkcnZfY21kX2R1bW15fSwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworCXsiU0VUUk9BTVRSSUdHRVIiLCAgICAgICAgICAgIGRydl9jbWRfc2V0X3JvYW1fdHJpZ2dlcn0sCisJeyJHRVRST0FNVFJJR0dFUiIsICAgICAgICAgICAgZHJ2X2NtZF9nZXRfcm9hbV90cmlnZ2VyfSwKKwl7IlNFVFJPQU1TQ0FOUEVSSU9EIiwgICAgICAgICBkcnZfY21kX3NldF9yb2FtX3NjYW5fcGVyaW9kfSwKKwl7IkdFVFJPQU1TQ0FOUEVSSU9EIiwgICAgICAgICBkcnZfY21kX2dldF9yb2FtX3NjYW5fcGVyaW9kfSwKKwl7IlNFVFJPQU1TQ0FOUkVGUkVTSFBFUklPRCIsICBkcnZfY21kX3NldF9yb2FtX3NjYW5fcmVmcmVzaF9wZXJpb2R9LAorCXsiR0VUUk9BTVNDQU5SRUZSRVNIUEVSSU9EIiwgIGRydl9jbWRfZ2V0X3JvYW1fc2Nhbl9yZWZyZXNoX3BlcmlvZH0sCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCXsiU0VUUk9BTU1PREUiLCAgICAgICAgICAgICAgIGRydl9jbWRfc2V0X3JvYW1fbW9kZX0sCisJeyJHRVRST0FNTU9ERSIsICAgICAgICAgICAgICAgZHJ2X2NtZF9nZXRfcm9hbV9tb2RlfSwKKyNlbmRpZgorI2VuZGlmCisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJeyJTRVRST0FNREVMVEEiLCAgICAgICAgICAgICAgZHJ2X2NtZF9zZXRfcm9hbV9kZWx0YX0sCisJeyJHRVRST0FNREVMVEEiLCAgICAgICAgICAgICAgZHJ2X2NtZF9nZXRfcm9hbV9kZWx0YX0sCisjZW5kaWYKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwl7IkdFVEJBTkQiLCAgICAgICAgICAgICAgICAgICBkcnZfY21kX2dldF9iYW5kfSwKKwl7IlNFVFJPQU1TQ0FOQ0hBTk5FTFMiLCAgICAgICBkcnZfY21kX3NldF9yb2FtX3NjYW5fY2hhbm5lbHN9LAorCXsiR0VUUk9BTVNDQU5DSEFOTkVMUyIsICAgICAgIGRydl9jbWRfZ2V0X3JvYW1fc2Nhbl9jaGFubmVsc30sCisJeyJHRVRDQ1hNT0RFIiwgICAgICAgICAgICAgICAgZHJ2X2NtZF9nZXRfY2N4X21vZGV9LAorCXsiR0VUT0tDTU9ERSIsICAgICAgICAgICAgICAgIGRydl9jbWRfZ2V0X29rY19tb2RlfSwKKwl7IkdFVEZBU1RST0FNIiwgICAgICAgICAgICAgICBkcnZfY21kX2dldF9mYXN0X3JvYW19LAorCXsiR0VURkFTVFRSQU5TSVRJT04iLCAgICAgICAgIGRydl9jbWRfZ2V0X2Zhc3RfdHJhbnNpdGlvbn0sCisJeyJTRVRST0FNU0NBTkNIQU5ORUxNSU5USU1FIiwgZHJ2X2NtZF9zZXRfcm9hbV9zY2FuX2NoYW5uZWxfbWluX3RpbWV9LAorCXsiU0VOREFDVElPTkZSQU1FIiwgICAgICAgICAgIGRydl9jbWRfc2VuZF9hY3Rpb25fZnJhbWV9LAorCXsiR0VUUk9BTVNDQU5DSEFOTkVMTUlOVElNRSIsIGRydl9jbWRfZ2V0X3JvYW1fc2Nhbl9jaGFubmVsX21pbl90aW1lfSwKKwl7IlNFVFNDQU5DSEFOTkVMVElNRSIsICAgICAgICBkcnZfY21kX3NldF9zY2FuX2NoYW5uZWxfdGltZX0sCisJeyJHRVRTQ0FOQ0hBTk5FTFRJTUUiLCAgICAgICAgZHJ2X2NtZF9nZXRfc2Nhbl9jaGFubmVsX3RpbWV9LAorCXsiU0VUU0NBTkhPTUVUSU1FIiwgICAgICAgICAgIGRydl9jbWRfc2V0X3NjYW5faG9tZV90aW1lfSwKKwl7IkdFVFNDQU5IT01FVElNRSIsICAgICAgICAgICBkcnZfY21kX2dldF9zY2FuX2hvbWVfdGltZX0sCisJeyJTRVRST0FNSU5UUkFCQU5EIiwgICAgICAgICAgZHJ2X2NtZF9zZXRfcm9hbV9pbnRyYV9iYW5kfSwKKwl7IkdFVFJPQU1JTlRSQUJBTkQiLCAgICAgICAgICBkcnZfY21kX2dldF9yb2FtX2ludHJhX2JhbmR9LAorCXsiU0VUU0NBTk5QUk9CRVMiLCAgICAgICAgICAgIGRydl9jbWRfc2V0X3NjYW5fbl9wcm9iZXN9LAorCXsiR0VUU0NBTk5QUk9CRVMiLCAgICAgICAgICAgIGRydl9jbWRfZ2V0X3NjYW5fbl9wcm9iZXN9LAorCXsiU0VUU0NBTkhPTUVBV0FZVElNRSIsICAgICAgIGRydl9jbWRfc2V0X3NjYW5faG9tZV9hd2F5X3RpbWV9LAorCXsiR0VUU0NBTkhPTUVBV0FZVElNRSIsICAgICAgIGRydl9jbWRfZ2V0X3NjYW5faG9tZV9hd2F5X3RpbWV9LAorCXsiUkVBU1NPQyIsICAgICAgICAgICAgICAgICAgIGRydl9jbWRfcmVhc3NvY30sCisJeyJTRVRXRVNNT0RFIiwgICAgICAgICAgICAgICAgZHJ2X2NtZF9zZXRfd2VzX21vZGV9LAorCXsiR0VUV0VTTU9ERSIsICAgICAgICAgICAgICAgIGRydl9jbWRfZ2V0X3dlc19tb2RlfSwKKwl7IlNFVE9QUE9SVFVOSVNUSUNSU1NJRElGRiIsICBkcnZfY21kX3NldF9vcHBvcnR1bmlzdGljX3Jzc2lfZGlmZn0sCisJeyJHRVRPUFBPUlRVTklTVElDUlNTSURJRkYiLCAgZHJ2X2NtZF9nZXRfb3Bwb3J0dW5pc3RpY19yc3NpX2RpZmZ9LAorCXsiU0VUUk9BTVJFU0NBTlJTU0lESUZGIiwgICAgIGRydl9jbWRfc2V0X3JvYW1fcmVzY2FuX3Jzc2lfZGlmZn0sCisJeyJHRVRST0FNUkVTQ0FOUlNTSURJRkYiLCAgICAgZHJ2X2NtZF9nZXRfcm9hbV9yZXNjYW5fcnNzaV9kaWZmfSwKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiB8fCBGRUFUVVJFX1dMQU5fRVNFIHx8IEZFQVRVUkVfV0xBTl9MRlIgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJeyJTRVRGQVNUUk9BTSIsICAgICAgICAgICAgICAgZHJ2X2NtZF9zZXRfZmFzdF9yb2FtfSwKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJeyJTRVRGQVNUVFJBTlNJVElPTiIsICAgICAgICAgZHJ2X2NtZF9zZXRfZmFzdF90cmFuc2l0aW9ufSwKKwl7IkZBU1RSRUFTU09DIiwgICAgICAgICAgICAgICBkcnZfY21kX2Zhc3RfcmVhc3NvY30sCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisJeyJDQ1hQTE1SRVEiLCAgICAgICAgICAgICAgICAgZHJ2X2NtZF9jY3hfcGxtX3JlcX0sCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJeyJTRVRDQ1hNT0RFIiwgICAgICAgICAgICAgICAgZHJ2X2NtZF9zZXRfY2N4X21vZGV9LAorI2VuZGlmCisJeyJTRVRST0FNU0NBTkNPTlRST0wiLCAgICAgICAgZHJ2X2NtZF9zZXRfcm9hbV9zY2FuX2NvbnRyb2x9LAorI2lmZGVmIEZFQVRVUkVfV0xBTl9PS0MKKwl7IlNFVE9LQ01PREUiLCAgICAgICAgICAgICAgICBkcnZfY21kX3NldF9va2NfbW9kZX0sCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX09LQyAqLworCXsiR0VUUk9BTVNDQU5DT05UUk9MIiwgICAgICAgIGRydl9jbWRfZ2V0X3JvYW1fc2Nhbl9jb250cm9sfSwKKwl7IkJUQ09FWE1PREUiLCAgICAgICAgICAgICAgICBkcnZfY21kX2J0X2NvZXhfbW9kZX0sCisJeyJTQ0FOLUFDVElWRSIsICAgICAgICAgICAgICAgZHJ2X2NtZF9zY2FuX2FjdGl2ZX0sCisJeyJTQ0FOLVBBU1NJVkUiLCAgICAgICAgICAgICAgZHJ2X2NtZF9zY2FuX3Bhc3NpdmV9LAorCXsiR0VURFdFTExUSU1FIiwgICAgICAgICAgICAgIGRydl9jbWRfZ2V0X2R3ZWxsX3RpbWV9LAorCXsiU0VURFdFTExUSU1FIiwgICAgICAgICAgICAgIGRydl9jbWRfc2V0X2R3ZWxsX3RpbWV9LAorCXsiTUlSQUNBU1QiLCAgICAgICAgICAgICAgICAgIGRydl9jbWRfbWlyYWNhc3R9LAorI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKwl7IlNFVENDWFJPQU1TQ0FOQ0hBTk5FTFMiLCAgICBkcnZfY21kX3NldF9jY3hfcm9hbV9zY2FuX2NoYW5uZWxzfSwKKwl7IkdFVFRTTVNUQVRTIiwgICAgICAgICAgICAgICBkcnZfY21kX2dldF90c21fc3RhdHN9LAorCXsiU0VUQ0NLTUlFIiwgICAgICAgICAgICAgICAgIGRydl9jbWRfc2V0X2Nja21faWV9LAorCXsiQ0NYQkVBQ09OUkVRIiwgIGRydl9jbWRfY2N4X2JlYWNvbl9yZXF9LAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKwl7IlNFVE1DUkFURSIsICAgICAgICAgICAgICAgICBkcnZfY21kX3NldF9tY19yYXRlfSwKKwl7Ik1BWFRYUE9XRVIiLCAgICAgICAgICAgICAgICBkcnZfY21kX21heF90eF9wb3dlcn0sCisJeyJTRVRERlNTQ0FOTU9ERSIsICAgICAgICAgICAgZHJ2X2NtZF9zZXRfZGZzX3NjYW5fbW9kZX0sCisJeyJHRVRERlNTQ0FOTU9ERSIsICAgICAgICAgICAgZHJ2X2NtZF9nZXRfZGZzX3NjYW5fbW9kZX0sCisJeyJHRVRMSU5LU1RBVFVTIiwgICAgICAgICAgICAgZHJ2X2NtZF9nZXRfbGlua19zdGF0dXN9LAorI2lmZGVmIFdMQU5fRkVBVFVSRV9FWFRXT1dfU1VQUE9SVAorCXsiRU5BQkxFRVhUV09XIiwgICAgICAgICAgICAgIGRydl9jbWRfZW5hYmxlX2V4dF93b3d9LAorCXsiU0VUQVBQMVBBUkFNUyIsICAgICAgICAgICAgIGRydl9jbWRfc2V0X2FwcDFfcGFyYW1zfSwKKwl7IlNFVEFQUDJQQVJBTVMiLCAgICAgICAgICAgICBkcnZfY21kX3NldF9hcHAyX3BhcmFtc30sCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXsiVERMU1NFQ09OREFSWUNIQU5ORUxPRkZTRVQiLCBkcnZfY21kX3RkbHNfc2Vjb25kYXJ5X2NoYW5uZWxfb2Zmc2V0fSwKKwl7IlRETFNPRkZDSEFOTkVMTU9ERSIsICAgICAgICBkcnZfY21kX3RkbHNfb2ZmX2NoYW5uZWxfbW9kZX0sCisJeyJURExTT0ZGQ0hBTk5FTCIsICAgICAgICAgICAgZHJ2X2NtZF90ZGxzX29mZl9jaGFubmVsfSwKKwl7IlRETFNTQ0FOIiwgICAgICAgICAgICAgICAgICBkcnZfY21kX3RkbHNfc2Nhbn0sCisjZW5kaWYKKwl7IlJTU0kiLCAgICAgICAgICAgICAgICAgICAgICBkcnZfY21kX2dldF9yc3NpfSwKKwl7IkxJTktTUEVFRCIsICAgICAgICAgICAgICAgICBkcnZfY21kX2dldF9saW5rc3BlZWR9LAorI2lmZGVmIEZFQVRVUkVfTkFQSQorCXsiTkFQSSIsICAgICAgICAgICAgICAgICAgICAgIGRydl9jbWRfbmFwaX0sCisjZW5kaWYgLyogRkVBVFVSRV9OQVBJICovCisJeyJSWEZJTFRFUi1SRU1PVkUiLCAgICAgICAgICAgZHJ2X2NtZF9yeF9maWx0ZXJfcmVtb3ZlfSwKKwl7IlJYRklMVEVSLUFERCIsICAgICAgICAgICAgICBkcnZfY21kX3J4X2ZpbHRlcl9hZGR9LAorCXsiU0VUX0ZDQ19DSEFOTkVMIiwgICAgICAgICAgIGRydl9jbWRfc2V0X2ZjY19jaGFubmVsfSwKK307CisKKy8qKgorICogaGRkX2Rydl9jbWRfcHJvY2VzcygpIC0gY2hvb3NlcyBhbmQgcnVucyB0aGUgcHJvcGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciBiYXNlZCBvbiB0aGUgaW5wdXQgY29tbWFuZAorICogQGFkYXB0ZXI6CVBvaW50ZXIgdG8gdGhlIGhkZCBhZGFwdGVyCisgKiBAY21kOglQb2ludGVyIHRvIHRoZSBkcml2ZXIgY29tbWFuZAorICogQHByaXZfZGF0YToJUG9pbnRlciB0byB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1hbmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgaW5wdXQgaGRkIGRyaXZlciBjb21tYW5kIGFuZCBydW5zCisgKiB0aGUgcHJvcGVyIGhhbmRsZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoZGRfZHJ2X2NtZF9wcm9jZXNzKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgICAgdWludDhfdCAqY21kLAorCQkJICAgICAgIGhkZF9wcml2X2RhdGFfdCAqcHJpdl9kYXRhKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaW50IGk7CisJY29uc3QgaW50IGNtZF9udW1fdG90YWwgPSBBUlJBWV9TSVpFKGhkZF9kcnZfY21kcyk7CisJdWludDhfdCAqY21kX2kgPSBOVUxMOworCWhkZF9kcnZfY21kX2hhbmRsZXJfdCBoYW5kbGVyID0gTlVMTDsKKwlpbnQgbGVuID0gMDsKKworCWlmICghYWRhcHRlciB8fCAhY21kIHx8ICFwcml2X2RhdGEpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgICIlczogYXQgbGVhc3QgMSBwYXJhbSBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZGRfY3R4ID0gKGhkZF9jb250ZXh0X3QgKilhZGFwdGVyLT5wSGRkQ3R4OworCisJZm9yIChpID0gMDsgaSA8IGNtZF9udW1fdG90YWw7IGkrKykgeworCisJCWNtZF9pID0gKHVpbnQ4X3QgKiloZGRfZHJ2X2NtZHNbaV0uY21kOworCQloYW5kbGVyID0gaGRkX2Rydl9jbWRzW2ldLmhhbmRsZXI7CisJCWxlbiA9IHN0cmxlbihjbWRfaSk7CisKKwkJaWYgKCFoYW5kbGVyKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgICIlczogbm8uICVkIGhhbmRsZXIgaXMgTlVMTCIsIF9fZnVuY19fLCBpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHN0cm5jYXNlY21wKGNtZCwgY21kX2ksIGxlbikgPT0gMCkKKwkJCXJldHVybiBoYW5kbGVyKGFkYXB0ZXIsIGhkZF9jdHgsCisJCQkJICAgICAgIGNtZCwgbGVuLCBwcml2X2RhdGEpOworCX0KKworCXJldHVybiBkcnZfY21kX2ludmFsaWQoYWRhcHRlciwgaGRkX2N0eCwgY21kLCBsZW4sIHByaXZfZGF0YSk7Cit9CisKKy8qKgorICogaGRkX2RyaXZlcl9jb21tYW5kKCkgLSB0b3AgbGV2ZWwgd2xhbiBoZGQgZHJpdmVyIGNvbW1hbmQgaGFuZGxlcgorICogQGFkYXB0ZXI6CVBvaW50ZXIgdG8gdGhlIGhkZCBhZGFwdGVyCisgKiBAcHJpdl9kYXRhOglQb2ludGVyIHRvIHRoZSByYXcgY29tbWFuZCBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgdG9wIGxldmVsIHdsYW4gaGRkIGRyaXZlciBjb21tYW5kIGhhbmRsZXIuIEl0CisgKiBoYW5kbGVzIHRoZSBjb21tYW5kIHdpdGggdGhlIGhlbHAgb2YgaGRkX2Rydl9jbWRfcHJvY2VzcygpCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgaGRkX2RyaXZlcl9jb21tYW5kKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgICBoZGRfcHJpdl9kYXRhX3QgKnByaXZfZGF0YSkKK3sKKwl1aW50OF90ICpjb21tYW5kID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBOb3RlIHRoYXQgdmFsaWQgcG9pbnRlcnMgYXJlIHByb3ZpZGVkIGJ5IGNhbGxlcgorCSAqLworCisJLyogY29weSB0byBsb2NhbCBzdHJ1Y3QgdG8gYXZvaWQgbnVtZXJvdXMgY2hhbmdlcyB0byBsZWdhY3kgY29kZSAqLworCWlmIChwcml2X2RhdGEtPnRvdGFsX2xlbiA8PSAwIHx8CisJICAgIHByaXZfZGF0YS0+dG90YWxfbGVuID4gV0xBTl9QUklWX0RBVEFfTUFYX0xFTikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCSAgICAgICAiJXM6aW52YWxpZCBwcml2X2RhdGEudG90YWxfbGVuKCVkKSEhISIsIF9fZnVuY19fLAorCQkgICAgICAgcHJpdl9kYXRhLT50b3RhbF9sZW4pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogQWxsb2NhdGUgKzEgZm9yICdcMCcgKi8KKwljb21tYW5kID0ga21hbGxvYyhwcml2X2RhdGEtPnRvdGFsX2xlbiArIDEsIEdGUF9LRVJORUwpOworCWlmICghY29tbWFuZCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGNvbW1hbmQsIHByaXZfZGF0YS0+YnVmLCBwcml2X2RhdGEtPnRvdGFsX2xlbikpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBleGl0OworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgY29tbWFuZCBpcyBOVUwtdGVybWluYXRlZCAqLworCWNvbW1hbmRbcHJpdl9kYXRhLT50b3RhbF9sZW5dID0gJ1wwJzsKKworCWhkZF9pbmZvKCIlczogJXMiLCBhZGFwdGVyLT5kZXYtPm5hbWUsIGNvbW1hbmQpOworCXJldCA9IGhkZF9kcnZfY21kX3Byb2Nlc3MoYWRhcHRlciwgY29tbWFuZCwgcHJpdl9kYXRhKTsKKworZXhpdDoKKwlpZiAoY29tbWFuZCkKKwkJa2ZyZWUoY29tbWFuZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGludCBoZGRfZHJpdmVyX2NvbXBhdF9pb2N0bChoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlzdHJ1Y3QgeworCQljb21wYXRfdXB0cl90IGJ1ZjsKKwkJaW50IHVzZWRfbGVuOworCQlpbnQgdG90YWxfbGVuOworCX0gY29tcGF0X3ByaXZfZGF0YTsKKwloZGRfcHJpdl9kYXRhX3QgcHJpdl9kYXRhOworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBOb3RlIHRoYXQgYWRhcHRlciBhbmQgaWZyIGhhdmUgYWxyZWFkeSBiZWVuIHZlcmlmaWVkIGJ5IGNhbGxlciwKKwkgKiBhbmQgSEREIGNvbnRleHQgaGFzIGFsc28gYmVlbiB2YWxpZGF0ZWQKKwkgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJmNvbXBhdF9wcml2X2RhdGEsIGlmci0+aWZyX2RhdGEsCisJCQkgICBzaXplb2YoY29tcGF0X3ByaXZfZGF0YSkpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisJcHJpdl9kYXRhLmJ1ZiA9IGNvbXBhdF9wdHIoY29tcGF0X3ByaXZfZGF0YS5idWYpOworCXByaXZfZGF0YS51c2VkX2xlbiA9IGNvbXBhdF9wcml2X2RhdGEudXNlZF9sZW47CisJcHJpdl9kYXRhLnRvdGFsX2xlbiA9IGNvbXBhdF9wcml2X2RhdGEudG90YWxfbGVuOworCXJldCA9IGhkZF9kcml2ZXJfY29tbWFuZChhZGFwdGVyLCAmcHJpdl9kYXRhKTsKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKyNlbHNlIC8qIENPTkZJR19DT01QQVQgKi8KK3N0YXRpYyBpbnQgaGRkX2RyaXZlcl9jb21wYXRfaW9jdGwoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IGlmcmVxICppZnIpCit7CisJLyogd2lsbCBuZXZlciBiZSBpbnZva2VkICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLworCitzdGF0aWMgaW50IGhkZF9kcml2ZXJfaW9jdGwoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IGlmcmVxICppZnIpCit7CisJaGRkX3ByaXZfZGF0YV90IHByaXZfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogTm90ZSB0aGF0IGFkYXB0ZXIgYW5kIGlmciBoYXZlIGFscmVhZHkgYmVlbiB2ZXJpZmllZCBieSBjYWxsZXIsCisJICogYW5kIEhERCBjb250ZXh0IGhhcyBhbHNvIGJlZW4gdmFsaWRhdGVkCisJICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwcml2X2RhdGEsIGlmci0+aWZyX2RhdGEsIHNpemVvZihwcml2X2RhdGEpKSkKKwkJcmV0ID0gLUVGQVVMVDsKKwllbHNlCisJCXJldCA9IGhkZF9kcml2ZXJfY29tbWFuZChhZGFwdGVyLCAmcHJpdl9kYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19oZGRfaW9jdGwoKSAtIGlvY3RsIGhhbmRsZXIgZm9yIHdsYW4gbmV0d29yayBpbnRlcmZhY2VzCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaWZyOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAY21kOiBpb2N0bCBjb21tYW5kCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGluaXRpYWwgcHJvY2Vzc2luZyBvZiB3bGFuIGRldmljZSBpb2N0bHMuCisgKiBDdXJyZW50bHkgdHdvIGZsYXZvcnMgb2YgaW9jdGxzIGFyZSBzdXBwb3J0ZWQuICBUaGUgcHJpbWFyeSBpb2N0bAorICogdGhhdCBpcyBzdXBwb3J0ZWQgaXMgdGhlIChTSU9DREVWUFJJVkFURSArIDEpIGlvY3RsIHdoaWNoIGlzIHVzZWQKKyAqIGZvciBBbmRyb2lkICJEUklWRVIiIGNvbW1hbmRzLiAgVGhlIG90aGVyIGlvY3RsIHRoYXQgaXMKKyAqIGNvbmRpdGlvbmFsbHkgc3VwcG9ydGVkIGlzIHRoZSBTSU9DSU9DVExUWDk5IGlvY3RsIHdoaWNoIGlzIHVzZWQKKyAqIGZvciBGVE0gb24gc29tZSBwbGF0Zm9ybXMuICBUaGlzIGZ1bmN0aW9uIHNpbXBseSB2ZXJpZmllcyB0aGF0IHRoZQorICogZHJpdmVyIGlzIGluIGEgc2FuZSBzdGF0ZSwgYW5kIHRoYXQgdGhlIGlvY3RsIGlzIG9uZSBvZiB0aGUKKyAqIHN1cHBvcnRlZCBmbGF2b3JzLCBpbiB3aGljaCBjYXNlIGZsYXZvci1zcGVjaWZpYyBoYW5kbGVycyBhcmUKKyAqIGRpc3BhdGNoZWQuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19oZGRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaW50IHJldDsKKworCWlmIChkZXYgIT0gYWRhcHRlci0+ZGV2KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEhERCBhZGFwdGVyL2RldiBpbmNvbnNpc3RlbmN5IiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKCghaWZyKSB8fCAoIWlmci0+aWZyX2RhdGEpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGludmFsaWQgZGF0YSIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKyNpZiAgZGVmaW5lZChRQ0FfV0lGSV9GVE0pICYmIGRlZmluZWQoTElOVVhfUUNNQlIpCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaWYgKFNJT0NJT0NUTFRYOTkgPT0gY21kKSB7CisJCQlyZXQgPSB3bGFuX2hkZF9xY21icl91bmlmaWVkX2lvY3RsKGFkYXB0ZXIsIGlmcik7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisjZW5kaWYKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKHJldCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBpbnZhbGlkIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBleGl0OworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSAoU0lPQ0RFVlBSSVZBVEUgKyAxKToKKwkJaWYgKGlzX2NvbXBhdF90YXNrKCkpCisJCQlyZXQgPSBoZGRfZHJpdmVyX2NvbXBhdF9pb2N0bChhZGFwdGVyLCBpZnIpOworCQllbHNlCisJCQlyZXQgPSBoZGRfZHJpdmVyX2lvY3RsKGFkYXB0ZXIsIGlmcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogdW5rbm93biBpb2N0bCAlZCIsCisJCSAgICAgICBfX2Z1bmNfXywgY21kKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9pb2N0bCgpIC0gaW9jdGwgaGFuZGxlciAod3JhcHBlcikgZm9yIHdsYW4gbmV0d29yayBpbnRlcmZhY2VzCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaWZyOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAY21kOiBpb2N0bCBjb21tYW5kCisgKgorICogVGhpcyBmdW5jdGlvbiBhY3RzIGFzIGFuIFNTUi1wcm90ZWN0aW5nIHdyYXBwZXIgdG8gX19oZGRfaW9jdGwoKQorICogd2hpY2ggaXMgd2hlcmUgdGhlIGlvY3RscyBhcmUgcmVhbGx5IGhhbmRsZWQuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK2ludCBoZGRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19oZGRfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfaW9jdGwuaCBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxODYyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfaW9jdGwuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoV0xBTl9IRERfSU9DVExfSCkKKyNkZWZpbmUgV0xBTl9IRERfSU9DVExfSAorCisjaW5jbHVkZSA8bmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9pZi5oPgorI2luY2x1ZGUgIndsYW5faGRkX21haW4uaCIKKworaW50IGhkZF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitpbnQgd2xhbl9oZGRfc2V0X21jX3JhdGUoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGludCB0YXJnZXRSYXRlKTsKKworI2VuZGlmIC8qIGVuZCAjaWYgIWRlZmluZWQoV0xBTl9IRERfSU9DVExfSCkgKi8KKwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX2lwYS5jIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX2lwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZWZiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfaXBhLmMKQEAgLTAsMCArMSwzOTM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogd2xhbl9oZGRfaXBhLmMKKyAqCisgKiBXTEFOIEhERCBhbmQgaXBhIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgorICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYworICovCisKKyNpZmRlZiBJUEFfT0ZGTE9BRAorCisvKiBJbmNsdWRlIEZpbGVzICovCisjaW5jbHVkZSA8d2xhbl9oZGRfaW5jbHVkZXMuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9pcGEuaD4KKworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9zb2Z0YXBfdHhfcnguaD4KKyNpbmNsdWRlIDxvbF90eHJ4X29zaWZfYXBpLmg+CisKKyNpbmNsdWRlICJjZHNfc2NoZWQuaCIKKworI2luY2x1ZGUgIndtYS5oIgorI2luY2x1ZGUgIndtYV9hcGkuaCIKKworI2RlZmluZSBIRERfSVBBX0RFU0NfQlVGRkVSX1JBVElPICAgICAgICAgIDQKKyNkZWZpbmUgSEREX0lQQV9JUFY0X05BTUVfRVhUICAgICAgICAgICAgICAiX2lwdjQiCisjZGVmaW5lIEhERF9JUEFfSVBWNl9OQU1FX0VYVCAgICAgICAgICAgICAgIl9pcHY2IgorCisjZGVmaW5lIEhERF9JUEFfUlhfSU5BQ1RJVklUWV9NU0VDX0RFTEFZICAgMTAwMAorI2RlZmluZSBIRERfSVBBX1VDX1dMQU5fSERSX0RFU19NQUNfT0ZGU0VUIDEyCisjZGVmaW5lIEhERF9JUEFfVUNfV0xBTl84MDIzX0hEUl9TSVpFICAgICAgMTQKKy8qIFdESSBUWCBhbmQgUlggUElQRSAqLworI2RlZmluZSBIRERfSVBBX1VDX05VTV9XRElfUElQRSAgICAgICAgICAgIDIKKyNkZWZpbmUgSEREX0lQQV9VQ19NQVhfUEVORElOR19FVkVOVCAgICAgICAzMworCisjZGVmaW5lIEhERF9JUEFfVUNfREVCVUdfRFVNTVlfTUVNX1NJWkUgICAgMzIwMDAKKyNkZWZpbmUgSEREX0lQQV9VQ19SVF9ERUJVR19QRVJJT0QgICAgICAgICAzMDAKKyNkZWZpbmUgSEREX0lQQV9VQ19SVF9ERUJVR19CVUZfQ09VTlQgICAgICAzMAorI2RlZmluZSBIRERfSVBBX1VDX1JUX0RFQlVHX0ZJTExfSU5URVJWQUwgIDEwMDAwCisKKyNkZWZpbmUgSEREX0lQQV9XTEFOX0hEUl9ERVNfTUFDX09GRlNFVCAgICAwCisjZGVmaW5lIEhERF9JUEFfTUFYX0lGQUNFICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBIRERfSVBBX01BWF9TWVNCQU1fUElQRSAgICAgICAgICAgIDQKKyNkZWZpbmUgSEREX0lQQV9SWF9QSVBFICAgICAgICAgICAgICAgICAgICBIRERfSVBBX01BWF9JRkFDRQorI2RlZmluZSBIRERfSVBBX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBIRERfSVBBX1BSRV9GSUxURVJfRU5BQkxFX01BU0sgICAgIEJJVCgxKQorI2RlZmluZSBIRERfSVBBX0lQVjZfRU5BQkxFX01BU0sgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBIRERfSVBBX1JNX0VOQUJMRV9NQVNLICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBIRERfSVBBX0NMS19TQ0FMSU5HX0VOQUJMRV9NQVNLICAgIEJJVCg0KQorI2RlZmluZSBIRERfSVBBX1VDX0VOQUJMRV9NQVNLICAgICAgICAgICAgIEJJVCg1KQorI2RlZmluZSBIRERfSVBBX1VDX1NUQV9FTkFCTEVfTUFTSyAgICAgICAgIEJJVCg2KQorI2RlZmluZSBIRERfSVBBX1JFQUxfVElNRV9ERUJVR0dJTkcgICAgICAgIEJJVCg4KQorCit0eXBlZGVmIGVudW0geworCUhERF9JUEFfVUNfT1BDT0RFX1RYX1NVU1BFTkQgPSAwLAorCUhERF9JUEFfVUNfT1BDT0RFX1RYX1JFU1VNRSA9IDEsCisJSEREX0lQQV9VQ19PUENPREVfUlhfU1VTUEVORCA9IDIsCisJSEREX0lQQV9VQ19PUENPREVfUlhfUkVTVU1FID0gMywKKwlIRERfSVBBX1VDX09QQ09ERV9TVEFUUyA9IDQsCisJLyoga2VlcCB0aGlzIGxhc3QgKi8KKwlIRERfSVBBX1VDX09QQ09ERV9NQVgKK30gaGRkX2lwYV91Y19vcF9jb2RlOworCisvKioKKyAqIGVudW0gLSBSZWFzb24gY29kZXMgZm9yIHN0YXQgcXVlcnkKKyAqCisgKiBASEREX0lQQV9VQ19TVEFUX1JFQVNPTl9OT05FOiBJbml0aWFsIHZhbHVlCisgKiBASEREX0lQQV9VQ19TVEFUX1JFQVNPTl9ERUJVRzogRm9yIGRlYnVnL2luZm8KKyAqIEBIRERfSVBBX1VDX1NUQVRfUkVBU09OX0JXX0NBTDogRm9yIGJhbmR3aWR0aCBjYWxpYnJhdGlvbgorICovCitlbnVtIHsKKwlIRERfSVBBX1VDX1NUQVRfUkVBU09OX05PTkUsCisJSEREX0lQQV9VQ19TVEFUX1JFQVNPTl9ERUJVRywKKwlIRERfSVBBX1VDX1NUQVRfUkVBU09OX0JXX0NBTAorfTsKKworLyoqCisgKiBlbnVtIGhkZF9pcGFfcm1fc3RhdGUgLSBJUEEgcmVzb3VyY2UgbWFuYWdlciBzdGF0ZQorICogQEhERF9JUEFfUk1fUkVMRUFTRUQ6ICAgICAgUFJPRCBwaXBlIHJlc291cmNlIHJlbGVhc2VkCisgKiBASEREX0lQQV9STV9HUkFOVF9QRU5ESU5HOiBQUk9EIHBpcGUgcmVzb3VyY2UgcmVxdWVzdGVkIGJ1dCBub3QgZ3JhbnRlZCB5ZXQKKyAqIEBIRERfSVBBX1JNX0dSQU5URUQ6ICAgICAgIFBST0QgcGlwZSByZXNvdXJjZSBncmFudGVkCisgKi8KK2VudW0gaGRkX2lwYV9ybV9zdGF0ZSB7CisJSEREX0lQQV9STV9SRUxFQVNFRCwKKwlIRERfSVBBX1JNX0dSQU5UX1BFTkRJTkcsCisJSEREX0lQQV9STV9HUkFOVEVELAorfTsKKworc3RydWN0IGxsY19zbmFwX2hkciB7CisJdWludDhfdCBkc2FwOworCXVpbnQ4X3Qgc3NhcDsKKwl1aW50OF90IHJlc3ZbNF07CisJX19iZTE2IGV0aF90eXBlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGhkZF9pcGFfdHhfaGRyIHsKKwlzdHJ1Y3QgZXRoaGRyIGV0aDsKKwlzdHJ1Y3QgbGxjX3NuYXBfaGRyIGxsY19zbmFwOworfSBfX3BhY2tlZDsKKworc3RydWN0IGZyYWdfaGVhZGVyIHsKKwl1aW50MzJfdAorCQlsZW5ndGg6MTYsCS8qIGxlbmd0aCBmaWVsZCBpcyBMU0Igb2YgdGhlIEZSQUcgREVTQyAqLworCQlyZXNlcnZlZDE2OjE2OworCXVpbnQzMl90IHJlc2VydmVkMzI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaXBhX2hlYWRlciB7CisJdWludDMyX3QKKwkJdmRldl9pZDo4LAkvKiB2ZGV2X2lkIGZpZWxkIGlzIExTQiBvZiBJUEEgREVTQyAqLworCQlyZXNlcnZlZDoyNDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoZGRfaXBhX3VjX3R4X2hkciB7CisJc3RydWN0IGZyYWdfaGVhZGVyIGZyYWdfaGQ7CisJc3RydWN0IGlwYV9oZWFkZXIgaXBhX2hkOworCXN0cnVjdCBldGhoZHIgZXRoOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBIRERfSVBBX1dMQU5fRlJBR19IRUFERVIgICAgICAgc2l6ZW9mKHN0cnVjdCBmcmFnX2hlYWRlcikKKyNkZWZpbmUgSEREX0lQQV9XTEFOX0lQQV9IRUFERVIgICAgICAgIHNpemVvZihzdHJ1Y3QgZnJhZ19oZWFkZXIpCisKKy8qKgorICogc3RydWN0IGhkZF9pcGFfY2xkX2hkciAtIElQQSBDTEQgSGVhZGVyCisgKiBAcmVzZXJ2ZWQ6IHJlc2VydmVkIGZpZWxkcworICogQGlmYWNlX2lkOiBpbnRlcmZhY2UgSUQKKyAqIEBzdGFfaWQ6IFN0YXRpb24gSUQKKyAqCisgKiBQYWNrZWQgMzItYml0IHN0cnVjdHVyZQorICogKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLSsKKyAqIHwgUmVzZXJ2ZWQgfCBRQ01BUCBJRCB8IGludGVyZmFjZSBpZCB8IFNUQSBJRCB8CisgKiArLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKworICovCitzdHJ1Y3QgaGRkX2lwYV9jbGRfaGRyIHsKKwl1aW50OF90IHJlc2VydmVkWzJdOworCXVpbnQ4X3QgaWZhY2VfaWQ7CisJdWludDhfdCBzdGFfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaGRkX2lwYV9yeF9oZHIgeworCXN0cnVjdCBoZGRfaXBhX2NsZF9oZHIgY2xkX2hkcjsKKwlzdHJ1Y3QgZXRoaGRyIGV0aDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoZGRfaXBhX3BtX3R4X2NiIHsKKwlzdHJ1Y3QgaGRkX2lwYV9pZmFjZV9jb250ZXh0ICppZmFjZV9jb250ZXh0OworCXN0cnVjdCBpcGFfcnhfZGF0YSAqaXBhX3R4X2Rlc2M7Cit9OworCitzdHJ1Y3QgaGRkX2lwYV91Y19yeF9oZHIgeworCXN0cnVjdCBldGhoZHIgZXRoOworfSBfX3BhY2tlZDsKKworc3RydWN0IGhkZF9pcGFfc3lzX3BpcGUgeworCXVpbnQzMl90IGNvbm5faGRsOworCXVpbnQ4X3QgY29ubl9oZGxfdmFsaWQ7CisJc3RydWN0IGlwYV9zeXNfY29ubmVjdF9wYXJhbXMgaXBhX3N5c19wYXJhbXM7Cit9OworCitzdHJ1Y3QgaGRkX2lwYV9pZmFjZV9zdGF0cyB7CisJdWludDY0X3QgbnVtX3R4OworCXVpbnQ2NF90IG51bV90eF9kcm9wOworCXVpbnQ2NF90IG51bV90eF9lcnI7CisJdWludDY0X3QgbnVtX3R4X2NhY19kcm9wOworCXVpbnQ2NF90IG51bV9yeF9wcmVmaWx0ZXI7CisJdWludDY0X3QgbnVtX3J4X2lwYV9leGNlcDsKKwl1aW50NjRfdCBudW1fcnhfcmVjdjsKKwl1aW50NjRfdCBudW1fcnhfcmVjdl9tdWw7CisJdWludDY0X3QgbnVtX3J4X3NlbmRfZGVzY19lcnI7CisJdWludDY0X3QgbWF4X3J4X211bDsKK307CisKK3N0cnVjdCBoZGRfaXBhX3ByaXY7CisKK3N0cnVjdCBoZGRfaXBhX2lmYWNlX2NvbnRleHQgeworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGE7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwl2b2lkICp0bF9jb250ZXh0OworCisJZW51bSBpcGFfY2xpZW50X3R5cGUgY29uc19jbGllbnQ7CisJZW51bSBpcGFfY2xpZW50X3R5cGUgcHJvZF9jbGllbnQ7CisKKwl1aW50OF90IGlmYWNlX2lkOyAgICAgICAvKiBUaGlzIGlmYWNlIElEICovCisJdWludDhfdCBzdGFfaWQ7ICAgICAgICAgLyogVGhpcyBpZmFjZSBzdGF0aW9uIElEICovCisJY2RmX3NwaW5sb2NrX3QgaW50ZXJmYWNlX2xvY2s7CisJdWludDMyX3QgaWZhX2FkZHJlc3M7CisJc3RydWN0IGhkZF9pcGFfaWZhY2Vfc3RhdHMgc3RhdHM7Cit9OworCitzdHJ1Y3QgaGRkX2lwYV9zdGF0cyB7CisJdWludDMyX3QgZXZlbnRbSVBBX1dMQU5fRVZFTlRfTUFYXTsKKwl1aW50NjRfdCBudW1fc2VuZF9tc2c7CisJdWludDY0X3QgbnVtX2ZyZWVfbXNnOworCisJdWludDY0X3QgbnVtX3JtX2dyYW50OworCXVpbnQ2NF90IG51bV9ybV9yZWxlYXNlOworCXVpbnQ2NF90IG51bV9ybV9ncmFudF9pbW07CisJdWludDY0X3QgbnVtX2NvbnNfcGVyZl9yZXE7CisJdWludDY0X3QgbnVtX3Byb2RfcGVyZl9yZXE7CisKKwl1aW50NjRfdCBudW1fcnhfZHJvcDsKKwl1aW50NjRfdCBudW1fcnhfaXBhX3R4X2RwOworCXVpbnQ2NF90IG51bV9yeF9pcGFfc3BsaWNlOworCXVpbnQ2NF90IG51bV9yeF9pcGFfbG9vcDsKKwl1aW50NjRfdCBudW1fcnhfaXBhX3R4X2RwX2VycjsKKwl1aW50NjRfdCBudW1fcnhfaXBhX3dyaXRlX2RvbmU7CisJdWludDY0X3QgbnVtX21heF9pcGFfdHhfbXVsOworCXVpbnQ2NF90IG51bV9yeF9pcGFfaHdfbWF4ZWRfb3V0OworCXVpbnQ2NF90IG1heF9wZW5kX3FfY250OworCisJdWludDY0X3QgbnVtX3R4X2NvbXBfY250OworCXVpbnQ2NF90IG51bV90eF9xdWV1ZWQ7CisJdWludDY0X3QgbnVtX3R4X2RlcXVldWVkOworCXVpbnQ2NF90IG51bV9tYXhfcG1fcXVldWU7CisKKwl1aW50NjRfdCBudW1fZnJlZXFfZW1wdHk7CisJdWludDY0X3QgbnVtX3ByaV9mcmVlcV9lbXB0eTsKKwl1aW50NjRfdCBudW1fcnhfZXhjZXA7CisJdWludDY0X3QgbnVtX3R4X2JjbWM7CisJdWludDY0X3QgbnVtX3R4X2JjbWNfZXJyOworfTsKKworc3RydWN0IGlwYV91Y19zdGFzX21hcCB7CisJYm9vbCBpc19yZXNlcnZlZDsKKwl1aW50OF90IHN0YV9pZDsKK307CitzdHJ1Y3Qgb3BfbXNnX3R5cGUgeworCXVpbnQ4X3QgbXNnX3Q7CisJdWludDhfdCByc3ZkOworCXVpbnQxNl90IG9wX2NvZGU7CisJdWludDE2X3QgbGVuOworCXVpbnQxNl90IHJzdmRfc25kOworfTsKKworc3RydWN0IGlwYV91Y19md19zdGF0cyB7CisJdWludDMyX3QgdHhfY29tcF9yaW5nX2Jhc2U7CisJdWludDMyX3QgdHhfY29tcF9yaW5nX3NpemU7CisJdWludDMyX3QgdHhfY29tcF9yaW5nX2RiZWxsX2FkZHI7CisJdWludDMyX3QgdHhfY29tcF9yaW5nX2RiZWxsX2luZF92YWw7CisJdWludDMyX3QgdHhfY29tcF9yaW5nX2RiZWxsX2NhY2hlZF92YWw7CisJdWludDMyX3QgdHhfcGt0c19lbnF1ZXVlZDsKKwl1aW50MzJfdCB0eF9wa3RzX2NvbXBsZXRlZDsKKwl1aW50MzJfdCB0eF9pc19zdXNwZW5kOworCXVpbnQzMl90IHR4X3Jlc2VydmVkOworCXVpbnQzMl90IHJ4X2luZF9yaW5nX2Jhc2U7CisJdWludDMyX3QgcnhfaW5kX3Jpbmdfc2l6ZTsKKwl1aW50MzJfdCByeF9pbmRfcmluZ19kYmVsbF9hZGRyOworCXVpbnQzMl90IHJ4X2luZF9yaW5nX2RiZWxsX2luZF92YWw7CisJdWludDMyX3QgcnhfaW5kX3JpbmdfZGJlbGxfaW5kX2NhY2hlZF92YWw7CisJdWludDMyX3QgcnhfaW5kX3JpbmdfcmRpZHhfYWRkcjsKKwl1aW50MzJfdCByeF9pbmRfcmluZ19yZF9pZHhfY2FjaGVkX3ZhbDsKKwl1aW50MzJfdCByeF9yZWZpbGxfaWR4OworCXVpbnQzMl90IHJ4X251bV9wa3RzX2luZGljYXRlZDsKKwl1aW50MzJfdCByeF9idWZfcmVmaWxsZWQ7CisJdWludDMyX3QgcnhfbnVtX2luZF9kcm9wX25vX3NwYWNlOworCXVpbnQzMl90IHJ4X251bV9pbmRfZHJvcF9ub19idWY7CisJdWludDMyX3QgcnhfaXNfc3VzcGVuZDsKKwl1aW50MzJfdCByeF9yZXNlcnZlZDsKK307CisKK3N0cnVjdCBpcGFfdWNfcGVuZGluZ19ldmVudCB7CisJY2RmX2xpc3Rfbm9kZV90IG5vZGU7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwllbnVtIGlwYV93bGFuX2V2ZW50IHR5cGU7CisJdWludDhfdCBzdGFfaWQ7CisJdWludDhfdCBtYWNfYWRkcltDREZfTUFDX0FERFJfU0laRV07Cit9OworCisvKioKKyAqIHN0cnVjdCB1Y19ybV93b3JrX3N0cnVjdAorICogQHdvcms6IHVDIFJNIHdvcmsKKyAqIEBldmVudDogSVBBIFJNIGV2ZW50CisgKi8KK3N0cnVjdCB1Y19ybV93b3JrX3N0cnVjdCB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJZW51bSBpcGFfcm1fZXZlbnQgZXZlbnQ7Cit9OworCisvKioKKyAqIHN0cnVjdCB1Y19vcF93b3JrX3N0cnVjdAorICogQHdvcms6IHVDIE9QIHdvcmsKKyAqIEBtc2c6IE9QIG1lc3NhZ2UKKyAqLworc3RydWN0IHVjX29wX3dvcmtfc3RydWN0IHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3Qgb3BfbXNnX3R5cGUgKm1zZzsKK307CitzdGF0aWMgdWludDhfdCB2ZGV2X3RvX2lmYWNlW0NTUl9ST0FNX1NFU1NJT05fTUFYXTsKKworLyoqCisgKiBzdHJ1Y3QgdWNfcnRfZGVidWdfaW5mbworICogQHRpbWU6IHN5c3RlbSB0aW1lCisgKiBAaXBhX2V4Y2VwX2NvdW50OiBJUEEgZXhjZXB0aW9uIHBhY2tldCBjb3VudAorICogQHJ4X2Ryb3BfY291bnQ6IElQQSBSeCBkcm9wIHBhY2tldCBjb3VudAorICogQG5ldF9zZW50X2NvdW50OiBJUEEgUnggcGFja2V0IHNlbnQgdG8gbmV0d29yayBzdGFjayBjb3VudAorICogQHJ4X2Rpc2NhcmRfY291bnQ6IElQQSBSeCBkaXNjYXJkIHBhY2tldCBjb3VudAorICogQHJ4X21jYmNfY291bnQ6IElQQSBSeCBCQ01DIHBhY2tldCBjb3VudAorICogQHR4X21jYmNfY291bnQ6IElQQSBUeCBCQ01DIHBhY2tldCBjb3VudHQKKyAqIEB0eF9md2RfY291bnQ6IElQQSBUeCBmb3J3YXJkIHBhY2tldCBjb3VudAorICogQHJ4X2Rlc3RydWN0b3JfY2FsbDogSVBBIFJ4IHBhY2tldCBkZXN0cnVjdG9yIGNvdW50CisgKi8KK3N0cnVjdCB1Y19ydF9kZWJ1Z19pbmZvIHsKKwl2X1RJTUVfdCB0aW1lOworCXVpbnQ2NF90IGlwYV9leGNlcF9jb3VudDsKKwl1aW50NjRfdCByeF9kcm9wX2NvdW50OworCXVpbnQ2NF90IG5ldF9zZW50X2NvdW50OworCXVpbnQ2NF90IHJ4X2Rpc2NhcmRfY291bnQ7CisJdWludDY0X3QgcnhfbWNiY19jb3VudDsKKwl1aW50NjRfdCB0eF9tY2JjX2NvdW50OworCXVpbnQ2NF90IHR4X2Z3ZF9jb3VudDsKKwl1aW50NjRfdCByeF9kZXN0cnVjdG9yX2NhbGw7Cit9OworCitzdHJ1Y3QgaGRkX2lwYV9wcml2IHsKKwlzdHJ1Y3QgaGRkX2lwYV9zeXNfcGlwZSBzeXNfcGlwZVtIRERfSVBBX01BWF9TWVNCQU1fUElQRV07CisJc3RydWN0IGhkZF9pcGFfaWZhY2VfY29udGV4dCBpZmFjZV9jb250ZXh0W0hERF9JUEFfTUFYX0lGQUNFXTsKKwl1aW50OF90IG51bV9pZmFjZTsKKwllbnVtIGhkZF9pcGFfcm1fc3RhdGUgcm1fc3RhdGU7CisJLyoKKwkgKiBJUEEgZHJpdmVyIGNhbiBzZW5kIFJNIG5vdGlmaWNhdGlvbnMgd2l0aCBJUlEgZGlzYWJsZWQgc28gdXNpbmcgY2RmCisJICogQVBJcyBhcyBpdCBpcyB0YWtlbiBjYXJlIGdyYWNlZnVsbHkuIFdpdGhvdXQgdGhpcywga2VybmVsIHdvdWxkIHRocm93CisJICogYW4gd2FybmluZyBpZiBzcGluX2xvY2tfYmggaXMgdXNlZCB3aGlsZSBJUlEgaXMgZGlzYWJsZWQKKwkgKi8KKwljZGZfc3BpbmxvY2tfdCBybV9sb2NrOworCXN0cnVjdCB1Y19ybV93b3JrX3N0cnVjdCB1Y19ybV93b3JrOworCXN0cnVjdCB1Y19vcF93b3JrX3N0cnVjdCB1Y19vcF93b3JrW0hERF9JUEFfVUNfT1BDT0RFX01BWF07CisJY2RmX3dha2VfbG9ja190IHdha2VfbG9jazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdha2VfbG9ja193b3JrOworCWJvb2wgd2FrZV9sb2NrX3JlbGVhc2VkOworCisJZW51bSBpcGFfY2xpZW50X3R5cGUgcHJvZF9jbGllbnQ7CisKKwlhdG9taWNfdCB0eF9yZWZfY250OworCWNkZl9uYnVmX3F1ZXVlX3QgcG1fcXVldWVfaGVhZDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcG1fd29yazsKKwljZGZfc3BpbmxvY2tfdCBwbV9sb2NrOworCWJvb2wgc3VzcGVuZGVkOworCisJdWludDMyX3QgcGVuZGluZ19od19kZXNjX2NudDsKKwl1aW50MzJfdCBod19kZXNjX2NudDsKKwlzcGlubG9ja190IHFfbG9jazsKKwl1aW50MzJfdCBmcmVlcV9jbnQ7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2Rlc2NfaGVhZDsKKworCXVpbnQzMl90IHBlbmRfcV9jbnQ7CisJc3RydWN0IGxpc3RfaGVhZCBwZW5kX2Rlc2NfaGVhZDsKKworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RpcjsKKwlzdHJ1Y3QgaGRkX2lwYV9zdGF0cyBzdGF0czsKKworCXN0cnVjdCBub3RpZmllcl9ibG9jayBpcHY0X25vdGlmaWVyOworCXVpbnQzMl90IGN1cnJfcHJvZF9idzsKKwl1aW50MzJfdCBjdXJyX2NvbnNfYnc7CisKKwl1aW50OF90IGFjdGl2YXRlZF9md19waXBlOworCXVpbnQ4X3Qgc2FwX251bV9jb25uZWN0ZWRfc3RhOworCXVpbnQ4X3Qgc3RhX2Nvbm5lY3RlZDsKKwl1aW50MzJfdCB0eF9waXBlX2hhbmRsZTsKKwl1aW50MzJfdCByeF9waXBlX2hhbmRsZTsKKwlib29sIHJlc291cmNlX2xvYWRpbmc7CisJYm9vbCByZXNvdXJjZV91bmxvYWRpbmc7CisJYm9vbCBwZW5kaW5nX2NvbnNfcmVxOworCXN0cnVjdCBpcGFfdWNfc3Rhc19tYXAgYXNzb2Nfc3Rhc19tYXBbV0xBTl9NQVhfU1RBX0NPVU5UXTsKKwljZGZfbGlzdF90IHBlbmRpbmdfZXZlbnQ7CisJY2RmX211dGV4X3QgZXZlbnRfbG9jazsKKwl1aW50MzJfdCBpcGFfdHhfcGFja2V0c19kaWZmOworCXVpbnQzMl90IGlwYV9yeF9wYWNrZXRzX2RpZmY7CisJdWludDMyX3QgaXBhX3BfdHhfcGFja2V0czsKKwl1aW50MzJfdCBpcGFfcF9yeF9wYWNrZXRzOworCXVpbnQzMl90IHN0YXRfcmVxX3JlYXNvbjsKKwl1aW50NjRfdCBpcGFfdHhfZm9yd2FyZDsKKwl1aW50NjRfdCBpcGFfcnhfZGlzY2FyZDsKKwl1aW50NjRfdCBpcGFfcnhfbmV0X3NlbmRfY291bnQ7CisJdWludDY0X3QgaXBhX3J4X2ludGVybmVsX2Ryb3BfY291bnQ7CisJdWludDY0X3QgaXBhX3J4X2Rlc3RydWN0b3JfY291bnQ7CisJY2RmX21jX3RpbWVyX3QgcnRfZGVidWdfdGltZXI7CisJc3RydWN0IHVjX3J0X2RlYnVnX2luZm8gcnRfYnVnX2J1ZmZlcltIRERfSVBBX1VDX1JUX0RFQlVHX0JVRl9DT1VOVF07CisJdW5zaWduZWQgaW50IHJ0X2J1Zl9maWxsX2luZGV4OworCWNkZl9tY190aW1lcl90IHJ0X2RlYnVnX2ZpbGxfdGltZXI7CisJY2RmX211dGV4X3QgcnRfZGVidWdfbG9jazsKK307CisKKyNkZWZpbmUgSEREX0lQQV9XTEFOX0NMRF9IRFJfTEVOICAgICAgICBzaXplb2Yoc3RydWN0IGhkZF9pcGFfY2xkX2hkcikKKyNkZWZpbmUgSEREX0lQQV9VQ19XTEFOX0NMRF9IRFJfTEVOICAgICAwCisjZGVmaW5lIEhERF9JUEFfV0xBTl9UWF9IRFJfTEVOICAgICAgICAgc2l6ZW9mKHN0cnVjdCBoZGRfaXBhX3R4X2hkcikKKyNkZWZpbmUgSEREX0lQQV9VQ19XTEFOX1RYX0hEUl9MRU4gICAgICBzaXplb2Yoc3RydWN0IGhkZF9pcGFfdWNfdHhfaGRyKQorI2RlZmluZSBIRERfSVBBX1dMQU5fUlhfSERSX0xFTiAgICAgICAgIHNpemVvZihzdHJ1Y3QgaGRkX2lwYV9yeF9oZHIpCisjZGVmaW5lIEhERF9JUEFfVUNfV0xBTl9SWF9IRFJfTEVOICAgICAgc2l6ZW9mKHN0cnVjdCBoZGRfaXBhX3VjX3J4X2hkcikKKworI2RlZmluZSBIRERfSVBBX0dFVF9JRkFDRV9JRChfZGF0YSkgXAorCSgoKHN0cnVjdCBoZGRfaXBhX2NsZF9oZHIgKikgKF9kYXRhKSktPmlmYWNlX2lkKQorCisjZGVmaW5lIEhERF9JUEFfTE9HKExWTCwgZm10LCBhcmdzIC4uLikgXAorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgTFZMLCBcCisJCSAgIiVzOiVkOiAiZm10LCBfX2Z1bmNfXywgX19MSU5FX18sICMjIGFyZ3MpCisKKyNkZWZpbmUgSEREX0lQQV9EQkdfRFVNUChfbHZsLCBfcHJlZml4LCBfYnVmLCBfbGVuKSBcCisJZG8geyBcCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgX2x2bCwgIiVzOiIsIF9wcmVmaXgpOyBcCisJCUNERl9UUkFDRV9IRVhfRFVNUChDREZfTU9EVUxFX0lEX0hERCwgX2x2bCwgX2J1ZiwgX2xlbik7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhERF9JUEFfSVNfQ09ORklHX0VOQUJMRUQoX2hkZF9jdHgsIF9tYXNrKSBcCisJKCgoX2hkZF9jdHgpLT5jb25maWctPklwYUNvbmZpZyAmIChfbWFzaykpID09IChfbWFzaykpCisKKyNkZWZpbmUgSEREX0lQQV9JTkNSRUFTRV9JTlRFUk5BTF9EUk9QX0NPVU5UKGhkZF9pcGEpIFwKKwkJCWRvIHsgXAorCQkJCWhkZF9pcGEtPmlwYV9yeF9pbnRlcm5lbF9kcm9wX2NvdW50Kys7IFwKKwkJCX0gd2hpbGUgKDApCisjZGVmaW5lIEhERF9JUEFfSU5DUkVBU0VfTkVUX1NFTkRfQ09VTlQoaGRkX2lwYSkgXAorCQkJZG8geyBcCisJCQkJaGRkX2lwYS0+aXBhX3J4X25ldF9zZW5kX2NvdW50Kys7IFwKKwkJCX0gd2hpbGUgKDApCisjZGVmaW5lIEhERF9CV19HRVRfRElGRihfeCwgX3kpICh1bnNpZ25lZCBsb25nKSgoVUxPTkdfTUFYIC0gKF95KSkgKyAoX3gpICsgMSkKKworc3RhdGljIHN0cnVjdCBoZGRfaXBhX2FkYXB0ZXJfMl9jbGllbnQgeworCWVudW0gaXBhX2NsaWVudF90eXBlIGNvbnNfY2xpZW50OworCWVudW0gaXBhX2NsaWVudF90eXBlIHByb2RfY2xpZW50OworfSBoZGRfaXBhX2FkYXB0ZXJfMl9jbGllbnRbSEREX0lQQV9NQVhfSUZBQ0VdID0geworCXsKKwkJSVBBX0NMSUVOVF9XTEFOMl9DT05TLCBJUEFfQ0xJRU5UX1dMQU4xX1BST0QKKwl9LCB7CisJCUlQQV9DTElFTlRfV0xBTjNfQ09OUywgSVBBX0NMSUVOVF9XTEFOMV9QUk9ECisJfSwgeworCQlJUEFfQ0xJRU5UX1dMQU40X0NPTlMsIElQQV9DTElFTlRfV0xBTjFfUFJPRAorCX0sCit9OworCisvKiBGb3IgVHggcGlwZXMsIHVzZSBFdGhlcm5ldC1JSSBIZWFkZXIgZm9ybWF0ICovCitzdHJ1Y3QgaGRkX2lwYV91Y190eF9oZHIgaXBhX3VjX3R4X2hkciA9IHsKKwl7CisJCTB4MDAwMDAwMDAsCisJCTB4MDAwMDAwMDAKKwl9LAorCXsKKwkJMHgwMDAwMDAwMAorCX0sCisJeworCQl7MHgwMCwgMHgwMywgMHg3ZiwgMHhhYSwgMHhiYiwgMHhjY30sCisJCXsweDAwLCAweDAzLCAweDdmLCAweGRkLCAweGVlLCAweGZmfSwKKwkJMHgwMDA4CisJfQorfTsKKworLyogRm9yIFR4IHBpcGVzLCB1c2UgODAyLjMgSGVhZGVyIGZvcm1hdCAqLworc3RhdGljIHN0cnVjdCBoZGRfaXBhX3R4X2hkciBpcGFfdHhfaGRyID0geworCXsKKwkJezB4REUsIDB4QUQsIDB4QkUsIDB4RUYsIDB4RkYsIDB4RkZ9LAorCQl7MHhERSwgMHhBRCwgMHhCRSwgMHhFRiwgMHhGRiwgMHhGRn0sCisJCTB4MDAgICAgICAgICAgICAvKiBsZW5ndGggY2FuIGJlIHplcm8gKi8KKwl9LAorCXsKKwkJLyogTExDIFNOQVAgaGVhZGVyIDggYnl0ZXMgKi8KKwkJMHhhYSwgMHhhYSwKKwkJezB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9LAorCQkweDAwMDggICAgICAgICAgLyogdHlwZSB2YWx1ZSgyIGJ5dGVzKSAsZmlsbGVkIGJ5IHdsYW4gICovCisJCS8qIDB4MDgwMCAtIElQVjQsIDB4ODZkZCAtIElQVjYgKi8KKwl9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqb3Bfc3RyaW5nW10gPSB7CisJIlRYX1NVU1BFTkQiLAorCSJUWF9SRVNVTUUiLAorCSJSWF9TVVNQRU5EIiwKKwkiUlhfUkVTVU1FIiwKKwkiU1RBVFMiLAorfTsKKworc3RhdGljIHN0cnVjdCBoZGRfaXBhX3ByaXYgKmdoZGRfaXBhOworCisvKiBMb2NhbCBGdW5jdGlvbiBQcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBoZGRfaXBhX2kyd19jYih2b2lkICpwcml2LCBlbnVtIGlwYV9kcF9ldnRfdHlwZSBldnQsCisJCQkgICB1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgaGRkX2lwYV93MmlfY2Iodm9pZCAqcHJpdiwgZW51bSBpcGFfZHBfZXZ0X3R5cGUgZXZ0LAorCQkJICAgdW5zaWduZWQgbG9uZyBkYXRhKTsKKworc3RhdGljIHZvaWQgaGRkX2lwYV9jbGVhbnVwX2lmYWNlKHN0cnVjdCBoZGRfaXBhX2lmYWNlX2NvbnRleHQgKmlmYWNlX2NvbnRleHQpOworCisvKioKKyAqIGhkZF9pcGFfaXNfZW5hYmxlZCgpIC0gSXMgSVBBIGVuYWJsZWQ/CisgKiBAaGRkX2N0eDogR2xvYmFsIEhERCBjb250ZXh0CisgKgorICogUmV0dXJuOiB0cnVlIGlmIElQQSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCBoZGRfaXBhX2lzX2VuYWJsZWQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlyZXR1cm4gSEREX0lQQV9JU19DT05GSUdfRU5BQkxFRChoZGRfY3R4LCBIRERfSVBBX0VOQUJMRV9NQVNLKTsKK30KKworLyoqCisgKiBoZGRfaXBhX3VjX2lzX2VuYWJsZWQoKSAtIElzIElQQSB1QyBvZmZsb2FkIGVuYWJsZWQ/CisgKiBAaGRkX2N0eDogR2xvYmFsIEhERCBjb250ZXh0CisgKgorICogUmV0dXJuOiB0cnVlIGlmIElQQSB1QyBvZmZsb2FkIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIGhkZF9pcGFfdWNfaXNfZW5hYmxlZChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXJldHVybiBIRERfSVBBX0lTX0NPTkZJR19FTkFCTEVEKGhkZF9jdHgsIEhERF9JUEFfVUNfRU5BQkxFX01BU0spOworfQorCisvKioKKyAqIGhkZF9pcGFfdWNfc3RhX2lzX2VuYWJsZWQoKSAtIElzIFNUQSBtb2RlIElQQSB1QyBvZmZsb2FkIGVuYWJsZWQ/CisgKiBAaGRkX2N0eDogR2xvYmFsIEhERCBjb250ZXh0CisgKgorICogUmV0dXJuOiB0cnVlIGlmIFNUQSBtb2RlIElQQSB1QyBvZmZsb2FkIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaGRkX2lwYV91Y19zdGFfaXNfZW5hYmxlZChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXJldHVybiBIRERfSVBBX0lTX0NPTkZJR19FTkFCTEVEKGhkZF9jdHgsIEhERF9JUEFfVUNfU1RBX0VOQUJMRV9NQVNLKTsKK30KKworLyoqCisgKiBoZGRfaXBhX2lzX3ByZV9maWx0ZXJfZW5hYmxlZCgpIC0gSXMgSVBBIHByZS1maWx0ZXIgZW5hYmxlZD8KKyAqIEBoZGRfaXBhOiBHbG9iYWwgSEREIElQQSBjb250ZXh0CisgKgorICogUmV0dXJuOiB0cnVlIGlmIHByZS1maWx0ZXIgaXMgZW5hYmxlZCwgb3RoZXJ3aXNlIGZhbHNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBoZGRfaXBhX2lzX3ByZV9maWx0ZXJfZW5hYmxlZChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXJldHVybiBIRERfSVBBX0lTX0NPTkZJR19FTkFCTEVEKGhkZF9jdHgsCisJCQkJCSBIRERfSVBBX1BSRV9GSUxURVJfRU5BQkxFX01BU0spOworfQorCisvKioKKyAqIGhkZF9pcGFfaXNfaXB2Nl9lbmFibGVkKCkgLSBJcyBJUEEgSVB2NiBlbmFibGVkPworICogQGhkZF9pcGE6IEdsb2JhbCBIREQgSVBBIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgSVB2NiBpcyBlbmFibGVkLCBvdGhlcndpc2UgZmFsc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIGhkZF9pcGFfaXNfaXB2Nl9lbmFibGVkKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJcmV0dXJuIEhERF9JUEFfSVNfQ09ORklHX0VOQUJMRUQoaGRkX2N0eCwgSEREX0lQQV9JUFY2X0VOQUJMRV9NQVNLKTsKK30KKworLyoqCisgKiBoZGRfaXBhX2lzX3JtX2VuYWJsZWQoKSAtIElzIElQQSByZXNvdXJjZSBtYW5hZ2VyIGVuYWJsZWQ/CisgKiBAaGRkX2lwYTogR2xvYmFsIEhERCBJUEEgY29udGV4dAorICoKKyAqIFJldHVybjogdHJ1ZSBpZiByZXNvdXJjZSBtYW5hZ2VyIGlzIGVuYWJsZWQsIG90aGVyd2lzZSBmYWxzZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaGRkX2lwYV9pc19ybV9lbmFibGVkKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJcmV0dXJuIEhERF9JUEFfSVNfQ09ORklHX0VOQUJMRUQoaGRkX2N0eCwgSEREX0lQQV9STV9FTkFCTEVfTUFTSyk7Cit9CisKKy8qKgorICogaGRkX2lwYV9pc19ydF9kZWJ1Z2dpbmdfZW5hYmxlZCgpIC0gSXMgSVBBIHJlYWwtdGltZSBkZWJ1ZyBlbmFibGVkPworICogQGhkZF9pcGE6IEdsb2JhbCBIREQgSVBBIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgcmVzb3VyY2UgbWFuYWdlciBpcyBlbmFibGVkLCBvdGhlcndpc2UgZmFsc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIGhkZF9pcGFfaXNfcnRfZGVidWdnaW5nX2VuYWJsZWQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlyZXR1cm4gSEREX0lQQV9JU19DT05GSUdfRU5BQkxFRChoZGRfY3R4LCBIRERfSVBBX1JFQUxfVElNRV9ERUJVR0dJTkcpOworfQorCisvKioKKyAqIGhkZF9pcGFfaXNfY2xrX3NjYWxpbmdfZW5hYmxlZCgpIC0gSXMgSVBBIGNsb2NrIHNjYWxpbmcgZW5hYmxlZD8KKyAqIEBoZGRfaXBhOiBHbG9iYWwgSEREIElQQSBjb250ZXh0CisgKgorICogUmV0dXJuOiB0cnVlIGlmIGNsb2NrIHNjYWxpbmcgaXMgZW5hYmxlZCwgb3RoZXJ3aXNlIGZhbHNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBoZGRfaXBhX2lzX2Nsa19zY2FsaW5nX2VuYWJsZWQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlyZXR1cm4gSEREX0lQQV9JU19DT05GSUdfRU5BQkxFRChoZGRfY3R4LAorCQkJCQkgSEREX0lQQV9DTEtfU0NBTElOR19FTkFCTEVfTUFTSyB8CisJCQkJCSBIRERfSVBBX1JNX0VOQUJMRV9NQVNLKTsKK30KKworLyoqCisgKiBoZGRfaXBhX3VjX3J0X2RlYnVnX2hvc3RfZmlsbCAtIGZpbGwgcnQgZGVidWcgYnVmZmVyCisgKiBAY3RleHQ6IHBvaW50ZXIgdG8gaGRkIGNvbnRleHQuCisgKgorICogSWYgcnQgZGVidWcgZW5hYmxlZCwgcGVyaW9kaWNhbGx5IGNhbGxlZCwgYW5kIGZpbGwgZGVidWcgYnVmZmVyCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pcGFfdWNfcnRfZGVidWdfaG9zdF9maWxsKHZvaWQgKmN0ZXh0KQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSAoaGRkX2NvbnRleHRfdCAqKWN0ZXh0OworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGE7CisJc3RydWN0IHVjX3J0X2RlYnVnX2luZm8gKmR1bXBfaW5mbyA9IE5VTEw7CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KSkKKwkJcmV0dXJuOworCisJaWYgKCFoZGRfY3R4LT5oZGRfaXBhIHx8ICFoZGRfaXBhX3VjX2lzX2VuYWJsZWQoaGRkX2N0eCkpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkiJXM6IElQQSBVQyBpcyBub3QgZW5hYmxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWhkZF9pcGEgPSAoc3RydWN0IGhkZF9pcGFfcHJpdiAqKWhkZF9jdHgtPmhkZF9pcGE7CisKKwljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2lwYS0+cnRfZGVidWdfbG9jayk7CisJZHVtcF9pbmZvID0gJmhkZF9pcGEtPnJ0X2J1Z19idWZmZXJbCisJCWhkZF9pcGEtPnJ0X2J1Zl9maWxsX2luZGV4ICUgSEREX0lQQV9VQ19SVF9ERUJVR19CVUZfQ09VTlRdOworCisJZHVtcF9pbmZvLT50aW1lID0gY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOworCWR1bXBfaW5mby0+aXBhX2V4Y2VwX2NvdW50ID0gaGRkX2lwYS0+c3RhdHMubnVtX3J4X2V4Y2VwOworCWR1bXBfaW5mby0+cnhfZHJvcF9jb3VudCA9IGhkZF9pcGEtPmlwYV9yeF9pbnRlcm5lbF9kcm9wX2NvdW50OworCWR1bXBfaW5mby0+bmV0X3NlbnRfY291bnQgPSBoZGRfaXBhLT5pcGFfcnhfbmV0X3NlbmRfY291bnQ7CisJZHVtcF9pbmZvLT5yeF9kaXNjYXJkX2NvdW50ID0gaGRkX2lwYS0+aXBhX3J4X2Rpc2NhcmQ7CisJZHVtcF9pbmZvLT50eF9tY2JjX2NvdW50ID0gaGRkX2lwYS0+c3RhdHMubnVtX3R4X2JjbWM7CisJZHVtcF9pbmZvLT50eF9md2RfY291bnQgPSBoZGRfaXBhLT5pcGFfdHhfZm9yd2FyZDsKKwlkdW1wX2luZm8tPnJ4X2Rlc3RydWN0b3JfY2FsbCA9IGhkZF9pcGEtPmlwYV9yeF9kZXN0cnVjdG9yX2NvdW50OworCWhkZF9pcGEtPnJ0X2J1Zl9maWxsX2luZGV4Kys7CisJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9pcGEtPnJ0X2RlYnVnX2xvY2spOworCisJY2RmX21jX3RpbWVyX3N0YXJ0KCZoZGRfaXBhLT5ydF9kZWJ1Z19maWxsX3RpbWVyLAorCQlIRERfSVBBX1VDX1JUX0RFQlVHX0ZJTExfSU5URVJWQUwpOworfQorCisvKioKKyAqIGhkZF9pcGFfdWNfcnRfZGVidWdfaG9zdF9kdW1wIC0gZHVtcCBydCBkZWJ1ZyBidWZmZXIKKyAqIEBoZGRfY3R4OiBwb2ludGVyIHRvIGhkZCBjb250ZXh0LgorICoKKyAqIElmIHJ0IGRlYnVnIGVuYWJsZWQsIGR1bXAgZGVidWcgYnVmZmVyIGNvbnRlbnRzIGJhc2VkIG9uIHJlcXVpcmVtZW50CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaGRkX2lwYV91Y19ydF9kZWJ1Z19ob3N0X2R1bXAoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhOworCXVuc2lnbmVkIGludCBkdW1wX2NvdW50OworCXVuc2lnbmVkIGludCBkdW1wX2luZGV4OworCXN0cnVjdCB1Y19ydF9kZWJ1Z19pbmZvICpkdW1wX2luZm8gPSBOVUxMOworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCkpCisJCXJldHVybjsKKworCWhkZF9pcGEgPSBoZGRfY3R4LT5oZGRfaXBhOworCWlmICghaGRkX2lwYSB8fCAhaGRkX2lwYV91Y19pc19lbmFibGVkKGhkZF9jdHgpKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJIiVzOiBJUEEgVUMgaXMgbm90IGVuYWJsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSI9PT09PT09PT0gV0xBTi1JUEEgREVCVUcgQlVGIERVTVAgPT09PT09PT09PVxuIik7CisJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkiICAgICBUTSAgICAgOiAgIEVYRVAgICA6ICAgRFJPUCAgIDogICBORVRTICAgOiAgIE1DQkMgICA6ICAgVFhGRCAgIDogICBEU1RSICAgOiAgIERTQ0RcbiIpOworCisJY2RmX211dGV4X2FjcXVpcmUoJmhkZF9pcGEtPnJ0X2RlYnVnX2xvY2spOworCWZvciAoZHVtcF9jb3VudCA9IDA7CisJCWR1bXBfY291bnQgPCBIRERfSVBBX1VDX1JUX0RFQlVHX0JVRl9DT1VOVDsKKwkJZHVtcF9jb3VudCsrKSB7CisJCWR1bXBfaW5kZXggPSAoaGRkX2lwYS0+cnRfYnVmX2ZpbGxfaW5kZXggKyBkdW1wX2NvdW50KSAlCisJCQlIRERfSVBBX1VDX1JUX0RFQlVHX0JVRl9DT1VOVDsKKwkJZHVtcF9pbmZvID0gJmhkZF9pcGEtPnJ0X2J1Z19idWZmZXJbZHVtcF9pbmRleF07CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSIlMTJsdTolMTBsbHU6JTEwbGx1OiUxMGxsdTolMTBsbHU6JTEwbGx1OiUxMGxsdTolMTBsbHVcbiIsCisJCQlkdW1wX2luZm8tPnRpbWUsIGR1bXBfaW5mby0+aXBhX2V4Y2VwX2NvdW50LAorCQkJZHVtcF9pbmZvLT5yeF9kcm9wX2NvdW50LCBkdW1wX2luZm8tPm5ldF9zZW50X2NvdW50LAorCQkJZHVtcF9pbmZvLT50eF9tY2JjX2NvdW50LCBkdW1wX2luZm8tPnR4X2Z3ZF9jb3VudCwKKwkJCWR1bXBfaW5mby0+cnhfZGVzdHJ1Y3Rvcl9jYWxsLAorCQkJZHVtcF9pbmZvLT5yeF9kaXNjYXJkX2NvdW50KTsKKwl9CisJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9pcGEtPnJ0X2RlYnVnX2xvY2spOworCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJIj09PT09PT0gV0xBTi1JUEEgREVCVUcgQlVGIERVTVAgRU5EID09PT09PT09XG4iKTsKK30KKworLyoqCisgKiBoZGRfaXBhX3VjX3J0X2RlYnVnX2hhbmRsZXIgLSBwZXJpb2RpYyBtZW1vcnkgaGVhbHRoIG1vbml0b3IgaGFuZGxlcgorICogQGN0ZXh0OiBwb2ludGVyIHRvIGhkZCBjb250ZXh0LgorICoKKyAqIHBlcmlvZGljYWxseSBjYWxsZWQgYnkgdGltZXIgZXhwaXJlCisgKiB3aWxsIHRyeSB0byBhbGxvYyBkdW1teSBtZW1vcnkgYW5kIGRldGVjdCBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbgorICogaWYgb3V0IG9mIG1lbW9yeSBkZXRlY3RlZCwgZHVtcCB3bGFuLWlwYSBzdGF0cworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfaXBhX3VjX3J0X2RlYnVnX2hhbmRsZXIodm9pZCAqY3RleHQpCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IChoZGRfY29udGV4dF90ICopY3RleHQ7CisJc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSA9IChzdHJ1Y3QgaGRkX2lwYV9wcml2ICopaGRkX2N0eC0+aGRkX2lwYTsKKwl2b2lkICpkdW1teV9wdHIgPSBOVUxMOworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCkpCisJCXJldHVybjsKKworCWlmICghaGRkX2lwYV9pc19ydF9kZWJ1Z2dpbmdfZW5hYmxlZChoZGRfY3R4KSkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSIlczogSVBBIFJUIGRlYnVnIGlzIG5vdCBlbmFibGVkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyogQWxsb2NhdGUgZHVtbXkgYnVmZmVyIHBlcmlvZGljYWxseSBhbmQgZnJlZSBpbW1lZGlhdGVseS4gdGhpcyB3aWxsCisJICogcHJvYWN0aXZlbHkgZGV0ZWN0IE9PTSBhbmQgaWYgYWxsb2NhdGlvbiBmYWlscyBkdW1wIGlwYSBzdGF0cworCSAqLworCWR1bW15X3B0ciA9IGttYWxsb2MoSEREX0lQQV9VQ19ERUJVR19EVU1NWV9NRU1fU0laRSwKKwkJR0ZQX0tFUk5FTCB8IEdGUF9BVE9NSUMpOworCWlmICghZHVtbXlfcHRyKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSIlczogRHVtbXkgYWxsb2MgZmFpbCIsIF9fZnVuY19fKTsKKwkJaGRkX2lwYV91Y19ydF9kZWJ1Z19ob3N0X2R1bXAoaGRkX2N0eCk7CisJCWhkZF9pcGFfdWNfc3RhdF9yZXF1ZXN0KAorCQkJaGRkX2dldF9hZGFwdGVyKGhkZF9jdHgsIFdMQU5fSEREX1NPRlRBUCksIDEpOworCX0gZWxzZSB7CisJCWtmcmVlKGR1bW15X3B0cik7CisJfQorCisJY2RmX21jX3RpbWVyX3N0YXJ0KCZoZGRfaXBhLT5ydF9kZWJ1Z190aW1lciwKKwkJSEREX0lQQV9VQ19SVF9ERUJVR19QRVJJT0QpOworfQorCisvKioKKyAqIGhkZF9pcGFfdWNfcnRfZGVidWdfZGVzdHJ1Y3RvciAtIGNhbGxlZCBieSBkYXRhIHBhY2tldCBmcmVlCisgKiBAc2tiOiBwYWNrZXQgcGludGVyCisgKgorICogd2hlbiBmcmVlIGRhdGEgcGFja2V0LCB3aWxsIGJlIGludm9rZWQgYnkgd2xhbiBjbGllbnQgYW5kIHdpbGwgaW5jcmVhc2UKKyAqIGZyZWUgY291bnRlcgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGhkZF9pcGFfdWNfcnRfZGVidWdfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmICghZ2hkZF9pcGEpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJIiVzOiBpbnZhbGlkIGhkZCBjb250ZXh0IiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJZ2hkZF9pcGEtPmlwYV9yeF9kZXN0cnVjdG9yX2NvdW50Kys7Cit9CisKKy8qKgorICogaGRkX2lwYV91Y19ydF9kZWJ1Z19kZWluaXQgLSByZW1vdmUgcmVzb3VyY2VzIHRvIGhhbmRsZSBydCBkZWJ1Z2dpbmcKKyAqIEBoZGRfY3R4OiBoZGQgbWFpbiBjb250ZXh0CisgKgorICogZnJlZSBhbGwgcnQgZGVidWdnaW5nIHJlc291cmNlcworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfaXBhX3VjX3J0X2RlYnVnX2RlaW5pdChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEgPSAoc3RydWN0IGhkZF9pcGFfcHJpdiAqKWhkZF9jdHgtPmhkZF9pcGE7CisKKwlpZiAoQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQgIT0KKwkJY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKCZoZGRfaXBhLT5ydF9kZWJ1Z19maWxsX3RpbWVyKSkgeworCQljZGZfbWNfdGltZXJfc3RvcCgmaGRkX2lwYS0+cnRfZGVidWdfZmlsbF90aW1lcik7CisJfQorCWNkZl9tY190aW1lcl9kZXN0cm95KCZoZGRfaXBhLT5ydF9kZWJ1Z19maWxsX3RpbWVyKTsKKwljZGZfbXV0ZXhfZGVzdHJveSgmaGRkX2lwYS0+cnRfZGVidWdfbG9jayk7CisKKwlpZiAoIWhkZF9pcGFfaXNfcnRfZGVidWdnaW5nX2VuYWJsZWQoaGRkX2N0eCkpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkiJXM6IElQQSBSVCBkZWJ1ZyBpcyBub3QgZW5hYmxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChDREZfVElNRVJfU1RBVEVfU1RPUFBFRCAhPQorCQljZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoJmhkZF9pcGEtPnJ0X2RlYnVnX3RpbWVyKSkgeworCQljZGZfbWNfdGltZXJfc3RvcCgmaGRkX2lwYS0+cnRfZGVidWdfdGltZXIpOworCX0KKwljZGZfbWNfdGltZXJfZGVzdHJveSgmaGRkX2lwYS0+cnRfZGVidWdfdGltZXIpOworfQorCisvKioKKyAqIGhkZF9pcGFfdWNfcnRfZGVidWdfaW5pdCAtIGludGlhbGl6ZSByZXNvdXJjZXMgdG8gaGFuZGxlIHJ0IGRlYnVnZ2luZworICogQGhkZF9jdHg6IGhkZCBtYWluIGNvbnRleHQKKyAqCisgKiBhbGxvYyBhbmQgaW5pdGlhbGl6ZSBhbGwgcnQgZGVidWdnaW5nIHJlc291cmNlcworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfaXBhX3VjX3J0X2RlYnVnX2luaXQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhID0gKHN0cnVjdCBoZGRfaXBhX3ByaXYgKiloZGRfY3R4LT5oZGRfaXBhOworCisJY2RmX211dGV4X2luaXQoJmhkZF9pcGEtPnJ0X2RlYnVnX2xvY2spOworCWNkZl9tY190aW1lcl9pbml0KCZoZGRfaXBhLT5ydF9kZWJ1Z19maWxsX3RpbWVyLCBDREZfVElNRVJfVFlQRV9TVywKKwkJaGRkX2lwYV91Y19ydF9kZWJ1Z19ob3N0X2ZpbGwsICh2b2lkICopaGRkX2N0eCk7CisJaGRkX2lwYS0+cnRfYnVmX2ZpbGxfaW5kZXggPSAwOworCWNkZl9tZW1femVybyhoZGRfaXBhLT5ydF9idWdfYnVmZmVyLAorCQlzaXplb2Yoc3RydWN0IHVjX3J0X2RlYnVnX2luZm8pICoKKwkJSEREX0lQQV9VQ19SVF9ERUJVR19CVUZfQ09VTlQpOworCWhkZF9pcGEtPmlwYV90eF9mb3J3YXJkID0gMDsKKwloZGRfaXBhLT5pcGFfcnhfZGlzY2FyZCA9IDA7CisJaGRkX2lwYS0+aXBhX3J4X25ldF9zZW5kX2NvdW50ID0gMDsKKwloZGRfaXBhLT5pcGFfcnhfaW50ZXJuZWxfZHJvcF9jb3VudCA9IDA7CisJaGRkX2lwYS0+aXBhX3J4X2Rlc3RydWN0b3JfY291bnQgPSAwOworCisJY2RmX21jX3RpbWVyX3N0YXJ0KCZoZGRfaXBhLT5ydF9kZWJ1Z19maWxsX3RpbWVyLAorCQlIRERfSVBBX1VDX1JUX0RFQlVHX0ZJTExfSU5URVJWQUwpOworCisJLyogUmVhdGltZSBkZWJ1ZyBlbmFibGUgb24gZmVhdHVyZSBlbmFibGUgKi8KKwlpZiAoIWhkZF9pcGFfaXNfcnRfZGVidWdnaW5nX2VuYWJsZWQoaGRkX2N0eCkpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkiJXM6IElQQSBSVCBkZWJ1ZyBpcyBub3QgZW5hYmxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwljZGZfbWNfdGltZXJfaW5pdCgmaGRkX2lwYS0+cnRfZGVidWdfdGltZXIsIENERl9USU1FUl9UWVBFX1NXLAorCQloZGRfaXBhX3VjX3J0X2RlYnVnX2hhbmRsZXIsICh2b2lkICopaGRkX2N0eCk7CisJY2RmX21jX3RpbWVyX3N0YXJ0KCZoZGRfaXBhLT5ydF9kZWJ1Z190aW1lciwKKwkJSEREX0lQQV9VQ19SVF9ERUJVR19QRVJJT0QpOworCit9CisKKy8qKgorICogaGRkX2lwYV91Y19zdGF0X3F1ZXJ5KCkgLSBRdWVyeSB0aGUgSVBBIHN0YXRzCisgKiBAaGRkX2N0eDogR2xvYmFsIEhERCBjb250ZXh0CisgKiBAaXBhX3R4X2RpZmY6IHR4IHBhY2tldCBjb3VudCBkaWZmIGZyb20gcHJldmlvdXMKKyAqIAkJIHR4IHBhY2tldCBjb3VudAorICogQGlwYV9yeF9kaWZmOiByeCBwYWNrZXQgY291bnQgZGlmZiBmcm9tIHByZXZpb3VzCisgKiAJCSByeCBwYWNrZXQgY291bnQKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgSVBBIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQorICovCit2b2lkIGhkZF9pcGFfdWNfc3RhdF9xdWVyeShoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCXVpbnQzMl90ICppcGFfdHhfZGlmZiwgdWludDMyX3QgKmlwYV9yeF9kaWZmKQoreworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGE7CisKKwloZGRfaXBhID0gKHN0cnVjdCBoZGRfaXBhX3ByaXYgKilwSGRkQ3R4LT5oZGRfaXBhOworCSppcGFfdHhfZGlmZiA9IDA7CisJKmlwYV9yeF9kaWZmID0gMDsKKworCWlmICghaGRkX2lwYV9pc19lbmFibGVkKHBIZGRDdHgpIHx8CisJCSEoaGRkX2lwYV91Y19pc19lbmFibGVkKHBIZGRDdHgpKSkgeworCQlyZXR1cm47CisJfQorCisJY2RmX211dGV4X2FjcXVpcmUoJmhkZF9pcGEtPmV2ZW50X2xvY2spOworCWlmICgoSEREX0lQQV9VQ19OVU1fV0RJX1BJUEUgPT0gaGRkX2lwYS0+YWN0aXZhdGVkX2Z3X3BpcGUpICYmCisJCShmYWxzZSA9PSBoZGRfaXBhLT5yZXNvdXJjZV9sb2FkaW5nKSkgeworCQkqaXBhX3R4X2RpZmYgPSBoZGRfaXBhLT5pcGFfdHhfcGFja2V0c19kaWZmOworCQkqaXBhX3J4X2RpZmYgPSBoZGRfaXBhLT5pcGFfcnhfcGFja2V0c19kaWZmOworCQlIRERfSVBBX0xPRyhMT0cxLCAiU1RBVCBRdWVyeSBUWCBESUZGICVkLCBSWCBESUZGICVkIiwKKwkJCSAgICAqaXBhX3R4X2RpZmYsICppcGFfcnhfZGlmZik7CisJfQorCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogaGRkX2lwYV91Y19zdGF0X3JlcXVlc3QoKSAtIEdldCBJUEEgc3RhdHMgZnJvbSBJUEEuCisgKiBAYWRhcHRlcjogbmV0d29yayBhZGFwdGVyCisgKiBAcmVhc29uOiBTVEFUIFJFUSBSZWFzb24KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBoZGRfaXBhX3VjX3N0YXRfcmVxdWVzdChoZGRfYWRhcHRlcl90ICphZGFwdGVyLCB1aW50OF90IHJlYXNvbikKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGE7CisKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJcmV0dXJuOworCX0KKworCXBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKWFkYXB0ZXItPnBIZGRDdHg7CisJaGRkX2lwYSA9IChzdHJ1Y3QgaGRkX2lwYV9wcml2ICopcEhkZEN0eC0+aGRkX2lwYTsKKwlpZiAoIWhkZF9pcGFfaXNfZW5hYmxlZChwSGRkQ3R4KSB8fAorCQkhKGhkZF9pcGFfdWNfaXNfZW5hYmxlZChwSGRkQ3R4KSkpIHsKKwkJcmV0dXJuOworCX0KKworCUhERF9JUEFfTE9HKExPRzEsICJTVEFUIFJFUSBSZWFzb24gJWQiLCByZWFzb24pOworCWNkZl9tdXRleF9hY3F1aXJlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKwlpZiAoKEhERF9JUEFfVUNfTlVNX1dESV9QSVBFID09IGhkZF9pcGEtPmFjdGl2YXRlZF9md19waXBlKSAmJgorCQkoZmFsc2UgPT0gaGRkX2lwYS0+cmVzb3VyY2VfbG9hZGluZykpIHsKKwkJaGRkX2lwYS0+c3RhdF9yZXFfcmVhc29uID0gcmVhc29uOworCQl3bWFfY2xpX3NldF9jb21tYW5kKAorCQkJKGludClhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkoaW50KVdNQV9WREVWX1RYUlhfR0VUX0lQQV9VQ19GV19TVEFUU19DTURJRCwKKwkJCTAsIFZERVZfQ01EKTsKKwl9CisJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9pcGEtPmV2ZW50X2xvY2spOworfQorCisvKioKKyAqIGhkZF9pcGFfdWNfZmluZF9hZGRfYXNzb2Nfc3RhKCkgLSBGaW5kIGFzc29jaWF0ZWQgc3RhdGlvbgorICogQGhkZF9pcGE6IEdsb2JhbCBIREQgSVBBIGNvbnRleHQKKyAqIEBzdGFfYWRkOiBTaG91bGQgc3RhdGlvbiBiZSBhZGRlZAorICogQHN0YV9pZDogSUQgb2YgdGhlIHN0YXRpb24gYmVpbmcgcXVlcmllZAorICoKKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgc3RhdGlvbiB3YXMgZm91bmQKKyAqLworc3RhdGljIGJvb2wgaGRkX2lwYV91Y19maW5kX2FkZF9hc3NvY19zdGEoc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSwKKwkJCQkJICBib29sIHN0YV9hZGQsIHVpbnQ4X3Qgc3RhX2lkKQoreworCWJvb2wgc3RhX2ZvdW5kID0gZmFsc2U7CisJdWludDhfdCBpZHg7CisJZm9yIChpZHggPSAwOyBpZHggPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGlkeCsrKSB7CisJCWlmICgoaGRkX2lwYS0+YXNzb2Nfc3Rhc19tYXBbaWR4XS5pc19yZXNlcnZlZCkgJiYKKwkJICAgIChoZGRfaXBhLT5hc3NvY19zdGFzX21hcFtpZHhdLnN0YV9pZCA9PSBzdGFfaWQpKSB7CisJCQlzdGFfZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHN0YV9hZGQgJiYgc3RhX2ZvdW5kKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAiJXM6IFNUQSBJRCAlZCBhbHJlYWR5IGV4aXN0LCBjYW5ub3QgYWRkIiwKKwkJCSAgICBfX2Z1bmNfXywgc3RhX2lkKTsKKwkJcmV0dXJuIHN0YV9mb3VuZDsKKwl9CisJaWYgKHN0YV9hZGQpIHsKKwkJZm9yIChpZHggPSAwOyBpZHggPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGlkeCsrKSB7CisJCQlpZiAoIWhkZF9pcGEtPmFzc29jX3N0YXNfbWFwW2lkeF0uaXNfcmVzZXJ2ZWQpIHsKKwkJCQloZGRfaXBhLT5hc3NvY19zdGFzX21hcFtpZHhdLmlzX3Jlc2VydmVkID0gdHJ1ZTsKKwkJCQloZGRfaXBhLT5hc3NvY19zdGFzX21hcFtpZHhdLnN0YV9pZCA9IHN0YV9pZDsKKwkJCQlyZXR1cm4gc3RhX2ZvdW5kOworCQkJfQorCQl9CisJfQorCWlmICghc3RhX2FkZCAmJiAhc3RhX2ZvdW5kKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAiJXM6IFNUQSBJRCAlZCBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGRlbGV0ZSIsCisJCQkgICAgX19mdW5jX18sIHN0YV9pZCk7CisJCXJldHVybiBzdGFfZm91bmQ7CisJfQorCWlmICghc3RhX2FkZCkgeworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaWR4KyspIHsKKwkJCWlmICgoaGRkX2lwYS0+YXNzb2Nfc3Rhc19tYXBbaWR4XS5pc19yZXNlcnZlZCkgJiYKKwkJCSAgICAoaGRkX2lwYS0+YXNzb2Nfc3Rhc19tYXBbaWR4XS5zdGFfaWQgPT0gc3RhX2lkKSkgeworCQkJCWhkZF9pcGEtPmFzc29jX3N0YXNfbWFwW2lkeF0uaXNfcmVzZXJ2ZWQgPQorCQkJCQlmYWxzZTsKKwkJCQloZGRfaXBhLT5hc3NvY19zdGFzX21hcFtpZHhdLnN0YV9pZCA9IDB4RkY7CisJCQkJcmV0dXJuIHN0YV9mb3VuZDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhX2ZvdW5kOworfQorCisvKioKKyAqIGhkZF9pcGFfdWNfZW5hYmxlX3BpcGVzKCkgLSBFbmFibGUgSVBBIHVDIHBpcGVzCisgKiBAaGRkX2lwYTogR2xvYmFsIEhERCBJUEEgY29udGV4dAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBpZiBlcnJvcgorICovCitzdGF0aWMgaW50IGhkZF9pcGFfdWNfZW5hYmxlX3BpcGVzKHN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEpCit7CisJaW50IHJlc3VsdDsKKwlwX2Nkc19jb250ZXh0VHlwZSBjZHNfY3R4ID0gaGRkX2lwYS0+aGRkX2N0eC0+cGNkc19jb250ZXh0OworCisJLyogQUNUSVZBVEUgVFggUElQRSAqLworCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IEVuYWJsZSBUWCBQSVBFIiwgX19mdW5jX18pOworCXJlc3VsdCA9IGlwYV9lbmFibGVfd2RpX3BpcGUoaGRkX2lwYS0+dHhfcGlwZV9oYW5kbGUpOworCWlmIChyZXN1bHQpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICIlczogRW5hYmxlIFRYIFBJUEUgZmFpbCwgY29kZSAlZCIsCisJCQkgICAgX19mdW5jX18sIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCXJlc3VsdCA9IGlwYV9yZXN1bWVfd2RpX3BpcGUoaGRkX2lwYS0+dHhfcGlwZV9oYW5kbGUpOworCWlmIChyZXN1bHQpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICIlczogUmVzdW1lIFRYIFBJUEUgZmFpbCwgY29kZSAlZCIsCisJCQkgICAgX19mdW5jX18sIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCW9sX3R4cnhfaXBhX3VjX3NldF9hY3RpdmUoY2RzX2N0eC0+cGRldl90eHJ4X2N0eCwgdHJ1ZSwgdHJ1ZSk7CisKKwkvKiBBQ1RJVkFURSBSWCBQSVBFICovCisJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogRW5hYmxlIFJYIFBJUEUiLCBfX2Z1bmNfXyk7CisJcmVzdWx0ID0gaXBhX2VuYWJsZV93ZGlfcGlwZShoZGRfaXBhLT5yeF9waXBlX2hhbmRsZSk7CisJaWYgKHJlc3VsdCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIiVzOiBFbmFibGUgUlggUElQRSBmYWlsLCBjb2RlICVkIiwKKwkJCSAgICBfX2Z1bmNfXywgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcmVzdWx0ID0gaXBhX3Jlc3VtZV93ZGlfcGlwZShoZGRfaXBhLT5yeF9waXBlX2hhbmRsZSk7CisJaWYgKHJlc3VsdCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIiVzOiBSZXN1bWUgUlggUElQRSBmYWlsLCBjb2RlICVkIiwKKwkJCSAgICBfX2Z1bmNfXywgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJb2xfdHhyeF9pcGFfdWNfc2V0X2FjdGl2ZShjZHNfY3R4LT5wZGV2X3R4cnhfY3R4LCB0cnVlLCBmYWxzZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfaXBhX3VjX2Rpc2FibGVfcGlwZXMoKSAtIERpc2FibGUgSVBBIHVDIHBpcGVzCisgKiBAaGRkX2lwYTogR2xvYmFsIEhERCBJUEEgY29udGV4dAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBpZiBlcnJvcgorICovCitzdGF0aWMgaW50IGhkZF9pcGFfdWNfZGlzYWJsZV9waXBlcyhzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhKQoreworCWludCByZXN1bHQ7CisKKwlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBEaXNhYmxlIFJYIFBJUEUiLCBfX2Z1bmNfXyk7CisJcmVzdWx0ID0gaXBhX3N1c3BlbmRfd2RpX3BpcGUoaGRkX2lwYS0+cnhfcGlwZV9oYW5kbGUpOworCWlmIChyZXN1bHQpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICIlczogU3VzcGVuZCBSWCBQSVBFIGZhaWwsIGNvZGUgJWQiLAorCQkJICAgIF9fZnVuY19fLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlyZXN1bHQgPSBpcGFfZGlzYWJsZV93ZGlfcGlwZShoZGRfaXBhLT5yeF9waXBlX2hhbmRsZSk7CisJaWYgKHJlc3VsdCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIiVzOiBEaXNhYmxlIFJYIFBJUEUgZmFpbCwgY29kZSAlZCIsCisJCQkgICAgX19mdW5jX18sIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogRGlzYWJsZSBUWCBQSVBFIiwgX19mdW5jX18pOworCXJlc3VsdCA9IGlwYV9zdXNwZW5kX3dkaV9waXBlKGhkZF9pcGEtPnR4X3BpcGVfaGFuZGxlKTsKKwlpZiAocmVzdWx0KSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAiJXM6IFN1c3BlbmQgVFggUElQRSBmYWlsLCBjb2RlICVkIiwKKwkJCSAgICBfX2Z1bmNfXywgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcmVzdWx0ID0gaXBhX2Rpc2FibGVfd2RpX3BpcGUoaGRkX2lwYS0+dHhfcGlwZV9oYW5kbGUpOworCWlmIChyZXN1bHQpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICIlczogRGlzYWJsZSBUWCBQSVBFIGZhaWwsIGNvZGUgJWQiLAorCQkJICAgIF9fZnVuY19fLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9pcGFfdWNfaGFuZGxlX2ZpcnN0X2NvbigpIC0gSGFuZGxlIGZpcnN0IHVDIElQQSBjb25uZWN0aW9uCisgKiBAaGRkX2lwYTogR2xvYmFsIEhERCBJUEEgY29udGV4dAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBpZiBlcnJvcgorICovCitzdGF0aWMgaW50IGhkZF9pcGFfdWNfaGFuZGxlX2ZpcnN0X2NvbihzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhKQoreworCWhkZF9pcGEtPmFjdGl2YXRlZF9md19waXBlID0gMDsKKwloZGRfaXBhLT5yZXNvdXJjZV9sb2FkaW5nID0gdHJ1ZTsKKwkvKiBJZiBSTSBmZWF0dXJlIGVuYWJsZWQKKwkgKiBSZXF1ZXN0IFBST0QgUmVzb3VyY2UgZmlyc3QKKwkgKiBQUk9EIHJlc291cmNlIG1heSByZXR1cm4gc3luYyBvciBhc3luYyBtYW5uZXJzICovCisJaWYgKChoZGRfaXBhX2lzX3JtX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpICYmCisJICAgICghaXBhX3JtX3JlcXVlc3RfcmVzb3VyY2UoSVBBX1JNX1JFU09VUkNFX1dMQU5fUFJPRCkpKSB7CisJCS8qIFJNIFBST0QgcmVxdWVzdCBzeW5jIHJldHVybgorCQkgKiBlbmFibGUgcGlwZSBpbW1lZGlhdGVseSAqLworCQlpZiAoaGRkX2lwYV91Y19lbmFibGVfcGlwZXMoaGRkX2lwYSkpIHsKKwkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICAgIiVzOiBJUEEgV0RJIFBpcGVzIGFjdGl2YXRlIGZhaWwiLAorCQkJCSAgICBfX2Z1bmNfXyk7CisJCQloZGRfaXBhLT5yZXNvdXJjZV9sb2FkaW5nID0gZmFsc2U7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfSBlbHNlIHsKKwkJLyogUk0gRGlzYWJsZWQKKwkJICogSnVzdCBlbmFibGVkIGFsbCB0aGUgUElQRXMgKi8KKwkJaWYgKGhkZF9pcGFfdWNfZW5hYmxlX3BpcGVzKGhkZF9pcGEpKSB7CisJCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAgICIlczogSVBBIFdESSBQaXBlcyBhY3RpdmF0ZSBmYWlsIiwKKwkJCQkgICAgX19mdW5jX18pOworCQkJaGRkX2lwYS0+cmVzb3VyY2VfbG9hZGluZyA9IGZhbHNlOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQloZGRfaXBhLT5yZXNvdXJjZV9sb2FkaW5nID0gZmFsc2U7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9pcGFfdWNfaGFuZGxlX2xhc3RfZGlzY29uKCkgLSBIYW5kbGUgbGFzdCB1QyBJUEEgZGlzY29ubmVjdGlvbgorICogQGhkZF9pcGE6IEdsb2JhbCBIREQgSVBBIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2lwYV91Y19oYW5kbGVfbGFzdF9kaXNjb24oc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSkKK3sKKwlwX2Nkc19jb250ZXh0VHlwZSBjZHNfY3R4ID0gaGRkX2lwYS0+aGRkX2N0eC0+cGNkc19jb250ZXh0OworCisJaGRkX2lwYS0+cmVzb3VyY2VfdW5sb2FkaW5nID0gdHJ1ZTsKKwlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBEaXNhYmxlIEZXIFJYIFBJUEUiLCBfX2Z1bmNfXyk7CisJb2xfdHhyeF9pcGFfdWNfc2V0X2FjdGl2ZShjZHNfY3R4LT5wZGV2X3R4cnhfY3R4LCBmYWxzZSwgZmFsc2UpOworCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IERpc2FibGUgRlcgVFggUElQRSIsIF9fZnVuY19fKTsKKwlvbF90eHJ4X2lwYV91Y19zZXRfYWN0aXZlKGNkc19jdHgtPnBkZXZfdHhyeF9jdHgsIGZhbHNlLCB0cnVlKTsKK30KKworLyoqCisgKiBoZGRfaXBhX3VjX3JtX25vdGlmeV9oYW5kbGVyKCkgLSBJUEEgdUMgcmVzb3VyY2Ugbm90aWZpY2F0aW9uIGhhbmRsZXIKKyAqIEBjb250ZXh0OiBVc2VyIGNvbnRleHQgcmVnaXN0ZXJlZCB3aXRoIFRMICh0aGUgSVBBIEdsb2JhbCBjb250ZXh0IGlzCisgKglyZWdpc3RlcmVkCisgKiBAcnhwa3Q6IFBhY2tldCBjb250YWluaW5nIHRoZSBub3RpZmljYXRpb24KKyAqIEBzdGFpZDogSUQgb2YgdGhlIHN0YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrZXQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2hkZF9pcGFfdWNfcm1fbm90aWZ5X2hhbmRsZXIodm9pZCAqY29udGV4dCwgZW51bSBpcGFfcm1fZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSA9IGNvbnRleHQ7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkvKgorCSAqIFdoZW4gU1NSIGlzIGdvaW5nIG9uIG9yIGRyaXZlciBpcyB1bmxvYWRpbmcsIGp1c3QgcmV0dXJuLgorCSAqLworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2lwYS0+aGRkX2N0eCk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFoZGRfaXBhX2lzX3JtX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpCisJCXJldHVybjsKKworCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJXMsIGV2ZW50IGNvZGUgJWQiLAorCQkgICAgX19mdW5jX18sIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElQQV9STV9SRVNPVVJDRV9HUkFOVEVEOgorCQkvKiBEaWZmZXJlZCBSTSBHcmFudGVkICovCisJCWhkZF9pcGFfdWNfZW5hYmxlX3BpcGVzKGhkZF9pcGEpOworCQljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCWlmICgoZmFsc2UgPT0gaGRkX2lwYS0+cmVzb3VyY2VfdW5sb2FkaW5nKSAmJgorCQkJKCFoZGRfaXBhLT5hY3RpdmF0ZWRfZndfcGlwZSkpIHsKKwkJCWhkZF9pcGFfdWNfZW5hYmxlX3BpcGVzKGhkZF9pcGEpOworCQl9CisJCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKwkJaWYgKGhkZF9pcGEtPnBlbmRpbmdfY29uc19yZXEpIHsKKwkJCWlwYV9ybV9ub3RpZnlfY29tcGxldGlvbihJUEFfUk1fUkVTT1VSQ0VfR1JBTlRFRCwKKwkJCQkJCSBJUEFfUk1fUkVTT1VSQ0VfV0xBTl9DT05TKTsKKwkJfQorCQloZGRfaXBhLT5wZW5kaW5nX2NvbnNfcmVxID0gZmFsc2U7CisJCWJyZWFrOworCisJY2FzZSBJUEFfUk1fUkVTT1VSQ0VfUkVMRUFTRUQ6CisJCS8qIERpZmZlcmVkIFJNIFJlbGVhc2VkICovCisJCWhkZF9pcGEtPnJlc291cmNlX3VubG9hZGluZyA9IGZhbHNlOworCQlpZiAoaGRkX2lwYS0+cGVuZGluZ19jb25zX3JlcSkgeworCQkJaXBhX3JtX25vdGlmeV9jb21wbGV0aW9uKElQQV9STV9SRVNPVVJDRV9SRUxFQVNFRCwKKwkJCQkJCSBJUEFfUk1fUkVTT1VSQ0VfV0xBTl9DT05TKTsKKwkJfQorCQloZGRfaXBhLT5wZW5kaW5nX2NvbnNfcmVxID0gZmFsc2U7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICIlcywgaW52YWxpZCBldmVudCBjb2RlICVkIiwgX19mdW5jX18sIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGhkZF9pcGFfdWNfcm1fbm90aWZ5X2RlZmVyKCkgLSBEZWZlciBJUEEgdUMgbm90aWZpY2F0aW9uCisgKiBAaGRkX2lwYTogR2xvYmFsIEhERCBJUEEgY29udGV4dAorICogQGV2ZW50OiBJUEEgcmVzb3VyY2UgbWFuYWdlciBldmVudCB0byBiZSBkZWZlcnJlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBtYW5hZ2VyIGV2ZW50IGlzIHJlY2VpdmVkCisgKiBmcm9tIGZpcm13YXJlIGluIGludGVycnVwdCBjb250ZXh0LiAgVGhpcyBmdW5jdGlvbiB3aWxsIGRlZmVyIHRoZQorICogaGFuZGxpbmcgdG8gdGhlIE9MIFJYIHRocmVhZAorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfaXBhX3VjX3JtX25vdGlmeV9kZWZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJZW51bSBpcGFfcm1fZXZlbnQgZXZlbnQ7CisJc3RydWN0IHVjX3JtX3dvcmtfc3RydWN0ICp1Y19ybV93b3JrID0gY29udGFpbmVyX29mKHdvcmssCisJCQlzdHJ1Y3QgdWNfcm1fd29ya19zdHJ1Y3QsIHdvcmspOworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEgPSBjb250YWluZXJfb2YodWNfcm1fd29yaywKKwkJCXN0cnVjdCBoZGRfaXBhX3ByaXYsIHVjX3JtX3dvcmspOworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlldmVudCA9IHVjX3JtX3dvcmstPmV2ZW50OworCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSIlcywgcG9zdGVkIGV2ZW50ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKKworCWhkZF9pcGFfdWNfcm1fbm90aWZ5X2hhbmRsZXIoaGRkX2lwYSwgZXZlbnQpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBoZGRfaXBhX3VjX3Byb2NfcGVuZGluZ19ldmVudCgpIC0gUHJvY2VzcyBJUEEgdUMgcGVuZGluZyBldmVudHMKKyAqIEBoZGRfaXBhOiBHbG9iYWwgSEREIElQQSBjb250ZXh0CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pcGFfdWNfcHJvY19wZW5kaW5nX2V2ZW50KHN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEpCit7CisJdW5zaWduZWQgaW50IHBlbmRpbmdfZXZlbnRfY291bnQ7CisJc3RydWN0IGlwYV91Y19wZW5kaW5nX2V2ZW50ICpwZW5kaW5nX2V2ZW50ID0gTlVMTDsKKworCWNkZl9saXN0X3NpemUoJmhkZF9pcGEtPnBlbmRpbmdfZXZlbnQsICZwZW5kaW5nX2V2ZW50X2NvdW50KTsKKwlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJIiVzLCBQZW5kaW5nIEV2ZW50IENvdW50ICVkIiwgX19mdW5jX18sIHBlbmRpbmdfZXZlbnRfY291bnQpOworCWlmICghcGVuZGluZ19ldmVudF9jb3VudCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSIlcywgTm8gUGVuZGluZyBFdmVudCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNkZl9saXN0X3JlbW92ZV9mcm9udCgmaGRkX2lwYS0+cGVuZGluZ19ldmVudCwKKwkJCShjZGZfbGlzdF9ub2RlX3QgKiopJnBlbmRpbmdfZXZlbnQpOworCXdoaWxlIChwZW5kaW5nX2V2ZW50ICE9IE5VTEwpIHsKKwkJaGRkX2lwYV93bGFuX2V2dChwZW5kaW5nX2V2ZW50LT5hZGFwdGVyLAorCQkJcGVuZGluZ19ldmVudC0+dHlwZSwKKwkJCXBlbmRpbmdfZXZlbnQtPnN0YV9pZCwKKwkJCXBlbmRpbmdfZXZlbnQtPm1hY19hZGRyKTsKKwkJY2RmX21lbV9mcmVlKHBlbmRpbmdfZXZlbnQpOworCQlwZW5kaW5nX2V2ZW50ID0gTlVMTDsKKwkJY2RmX2xpc3RfcmVtb3ZlX2Zyb250KCZoZGRfaXBhLT5wZW5kaW5nX2V2ZW50LAorCQkJKGNkZl9saXN0X25vZGVfdCAqKikmcGVuZGluZ19ldmVudCk7CisJfQorfQorCisvKioKKyAqIGhkZF9pcGFfdWNfb3BfY2IoKSAtIElQQSB1QyBvcGVyYXRpb24gY2FsbGJhY2sKKyAqIEBvcF9tc2c6IG9wZXJhdGlvbiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gZmlybXdhcmUKKyAqIEB1c3JfY3R4dDogdXNlciBjb250ZXh0IHJlZ2lzdGVyZWQgd2l0aCBUTCAod2UgcmVnaXN0ZXIgdGhlIEhERCBHbG9iYWwKKyAqCWNvbnRleHQpCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pcGFfdWNfb3BfY2Ioc3RydWN0IG9wX21zZ190eXBlICpvcF9tc2csIHZvaWQgKnVzcl9jdHh0KQoreworCXN0cnVjdCBvcF9tc2dfdHlwZSAqbXNnID0gb3BfbXNnOworCXN0cnVjdCBpcGFfdWNfZndfc3RhdHMgKnVjX2Z3X3N0YXQ7CisJc3RydWN0IElwYUh3U3RhdHNXRElJbmZvRGF0YV90IGlwYV9zdGF0OworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGE7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWlmICghb3BfbXNnIHx8ICF1c3JfY3R4dCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlcywgSU5WQUxJRCBBUkciLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoSEREX0lQQV9VQ19PUENPREVfTUFYIDw9IG1zZy0+b3BfY29kZSkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIiVzLCBJTlZBTElEIE9QQ09ERSAlZCIsIF9fZnVuY19fLCBtc2ctPm9wX2NvZGUpOworCQlyZXR1cm47CisJfQorCisJaGRkX2N0eCA9IChoZGRfY29udGV4dF90ICopIHVzcl9jdHh0OworCisJLyoKKwkgKiBXaGVuIFNTUiBpcyBnb2luZyBvbiBvciBkcml2ZXIgaXMgdW5sb2FkaW5nLCBqdXN0IHJldHVybi4KKwkgKi8KKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKTsKKwkJY2RmX21lbV9mcmVlKG9wX21zZyk7CisJCXJldHVybjsKKwl9CisKKwloZGRfaXBhID0gKHN0cnVjdCBoZGRfaXBhX3ByaXYgKiloZGRfY3R4LT5oZGRfaXBhOworCisJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkgICAgIiVzLCBPUENPREUgJXMiLCBfX2Z1bmNfXywgb3Bfc3RyaW5nW21zZy0+b3BfY29kZV0pOworCisJaWYgKChIRERfSVBBX1VDX09QQ09ERV9UWF9SRVNVTUUgPT0gbXNnLT5vcF9jb2RlKSB8fAorCSAgICAoSEREX0lQQV9VQ19PUENPREVfUlhfUkVTVU1FID09IG1zZy0+b3BfY29kZSkpIHsKKwkJY2RmX211dGV4X2FjcXVpcmUoJmhkZF9pcGEtPmV2ZW50X2xvY2spOworCQloZGRfaXBhLT5hY3RpdmF0ZWRfZndfcGlwZSsrOworCQlpZiAoSEREX0lQQV9VQ19OVU1fV0RJX1BJUEUgPT0gaGRkX2lwYS0+YWN0aXZhdGVkX2Z3X3BpcGUpIHsKKwkJCWhkZF9pcGEtPnJlc291cmNlX2xvYWRpbmcgPSBmYWxzZTsKKwkJCWhkZF9pcGFfdWNfcHJvY19wZW5kaW5nX2V2ZW50KGhkZF9pcGEpOworCQl9CisJCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKwl9CisKKwlpZiAoKEhERF9JUEFfVUNfT1BDT0RFX1RYX1NVU1BFTkQgPT0gbXNnLT5vcF9jb2RlKSB8fAorCSAgICAoSEREX0lQQV9VQ19PUENPREVfUlhfU1VTUEVORCA9PSBtc2ctPm9wX2NvZGUpKSB7CisJCWNkZl9tdXRleF9hY3F1aXJlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKwkJaGRkX2lwYS0+YWN0aXZhdGVkX2Z3X3BpcGUtLTsKKwkJaWYgKCFoZGRfaXBhLT5hY3RpdmF0ZWRfZndfcGlwZSkgeworCQkJaGRkX2lwYV91Y19kaXNhYmxlX3BpcGVzKGhkZF9pcGEpOworCQkJaWYgKChoZGRfaXBhX2lzX3JtX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpICYmCisJCQkoIWlwYV9ybV9yZWxlYXNlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9XTEFOX1BST0QpKSkgeworCQkJCS8qIFN5bmMgcmV0dXJuIHN1Y2Nlc3MgZnJvbSBJUEEKKwkJCQkqIEVuYWJsZS9yZXN1bWUgYWxsIHRoZSBQSVBFcyAqLworCQkJCWhkZF9pcGEtPnJlc291cmNlX3VubG9hZGluZyA9IGZhbHNlOworCQkJCWhkZF9pcGFfdWNfcHJvY19wZW5kaW5nX2V2ZW50KGhkZF9pcGEpOworCQkJfSBlbHNlIHsKKwkJCQloZGRfaXBhLT5yZXNvdXJjZV91bmxvYWRpbmcgPSBmYWxzZTsKKwkJCQloZGRfaXBhX3VjX3Byb2NfcGVuZGluZ19ldmVudChoZGRfaXBhKTsKKwkJCX0KKwkJfQorCQljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJfQorCisJaWYgKChIRERfSVBBX1VDX09QQ09ERV9TVEFUUyA9PSBtc2ctPm9wX2NvZGUpICYmCisJCShIRERfSVBBX1VDX1NUQVRfUkVBU09OX0RFQlVHID09IGhkZF9pcGEtPnN0YXRfcmVxX3JlYXNvbikpIHsKKworCQkvKiBTVEFUcyBmcm9tIGhvc3QgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICI9PT09IElQQV9VQyBXTEFOX0hPU1QgQ0UgPT09PVxuIgorCQkJICAiQ0UgUklORyBCQVNFOiAweCV4XG4iCisJCQkgICJDRSBSSU5HIFNJWkU6ICVkXG4iCisJCQkgICJDRSBSRUcgQUREUiA6IDB4JWxseCIsCisJCQkgIGhkZF9jdHgtPmNlX3NyX2Jhc2VfcGFkZHIsCisJCQkgIGhkZF9jdHgtPmNlX3NyX3Jpbmdfc2l6ZSwKKwkJCSAgKHVpbnQ2NF90KSBoZGRfY3R4LT5jZV9yZWdfcGFkZHIpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIj09PT0gSVBBX1VDIFdMQU5fSE9TVCBUWCA9PT09XG4iCisJCQkgICJDT01QIFJJTkcgQkFTRTogMHgleFxuIgorCQkJICAiQ09NUCBSSU5HIFNJWkU6ICVkXG4iCisJCQkgICJOVU0gQUxMT0MgQlVGOiAlZFxuIgorCQkJICAiQ09NUCBSSU5HIERCRUxMIDogMHgleCIsCisJCQkgIGhkZF9jdHgtPnR4X2NvbXBfcmluZ19iYXNlX3BhZGRyLAorCQkJICBoZGRfY3R4LT50eF9jb21wX3Jpbmdfc2l6ZSwKKwkJCSAgaGRkX2N0eC0+dHhfbnVtX2FsbG9jX2J1ZmZlciwKKwkJCSAgaGRkX2N0eC0+dHhfY29tcF9kb29yYmVsbF9wYWRkcik7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiPT09PSBJUEFfVUMgV0xBTl9IT1NUIFJYID09PT1cbiIKKwkJCSAgIklORCBSSU5HIEJBU0U6IDB4JXhcbiIKKwkJCSAgIklORCBSSU5HIFNJWkU6ICVkXG4iCisJCQkgICJJTkQgUklORyBEQkVMTCA6IDB4JXhcbiIKKwkJCSAgIlBST0MgRE9ORSBJTkQgQUREUiA6IDB4JXhcbiIKKwkJCSAgIk5VTSBFWENQIFBLVCA6ICVsbHVcbiIKKwkJCSAgIk5VTSBUWCBCQ01DIDogJWxsdVxuIgorCQkJICAiTlVNIFRYIEJDTUMgRVJSIDogJWxsdSIsCisJCQkgIGhkZF9jdHgtPnJ4X3JkeV9yaW5nX2Jhc2VfcGFkZHIsCisJCQkgIGhkZF9jdHgtPnJ4X3JkeV9yaW5nX3NpemUsCisJCQkgIGhkZF9jdHgtPnJ4X3JlYWR5X2Rvb3JiZWxsX3BhZGRyLAorCQkJICBoZGRfY3R4LT5yeF9wcm9jX2RvbmVfaWR4X3BhZGRyLAorCQkJICBoZGRfaXBhLT5zdGF0cy5udW1fcnhfZXhjZXAsCisJCQkgIGhkZF9pcGEtPnN0YXRzLm51bV90eF9iY21jLAorCQkJICBoZGRfaXBhLT5zdGF0cy5udW1fdHhfYmNtY19lcnIpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIj09PT0gSVBBX1VDIFdMQU5fSE9TVCBDT05UUk9MID09PT1cbiIKKwkJCSAgIlNBUCBOVU0gU1RBczogJWRcbiIKKwkJCSAgIlNUQSBDT05ORUNURUQ6ICVkXG4iCisJCQkgICJUWCBQSVBFIEhETDogJWRcbiIKKwkJCSAgIlJYIFBJUEUgSERMIDogJWRcbiIKKwkJCSAgIlJTQyBMT0FESU5HIDogJWRcbiIKKwkJCSAgIlJTQyBVTkxPQURJTkcgOiAlZFxuIgorCQkJICAiUE5ETkcgQ05TIFJRVCA6ICVkIiwKKwkJCSAgaGRkX2lwYS0+c2FwX251bV9jb25uZWN0ZWRfc3RhLAorCQkJICBoZGRfaXBhLT5zdGFfY29ubmVjdGVkLAorCQkJICBoZGRfaXBhLT50eF9waXBlX2hhbmRsZSwKKwkJCSAgaGRkX2lwYS0+cnhfcGlwZV9oYW5kbGUsCisJCQkgICh1bnNpZ25lZCBpbnQpaGRkX2lwYS0+cmVzb3VyY2VfbG9hZGluZywKKwkJCSAgKHVuc2lnbmVkIGludCloZGRfaXBhLT5yZXNvdXJjZV91bmxvYWRpbmcsCisJCQkgICh1bnNpZ25lZCBpbnQpaGRkX2lwYS0+cGVuZGluZ19jb25zX3JlcSk7CisKKwkJLyogU1RBVHMgZnJvbSBGVyAqLworCQl1Y19md19zdGF0ID0gKHN0cnVjdCBpcGFfdWNfZndfc3RhdHMgKikKKwkJCSAgICAgKCh1aW50OF90ICopb3BfbXNnICsgc2l6ZW9mKHN0cnVjdCBvcF9tc2dfdHlwZSkpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIj09PT0gSVBBX1VDIFdMQU5fRlcgVFggPT09PVxuIgorCQkJICAiQ09NUCBSSU5HIEJBU0U6IDB4JXhcbiIKKwkJCSAgIkNPTVAgUklORyBTSVpFOiAlZFxuIgorCQkJICAiQ09NUCBSSU5HIERCRUxMIDogMHgleFxuIgorCQkJICAiQ09NUCBSSU5HIERCRUxMIElORCBWQUwgOiAlZFxuIgorCQkJICAiQ09NUCBSSU5HIERCRUxMIENBQ0hFRCBWQUwgOiAlZFxuIgorCQkJICAiQ09NUCBSSU5HIERCRUxMIENBQ0hFRCBWQUwgOiAlZFxuIgorCQkJICAiUEtUUyBFTlEgOiAlZFxuIgorCQkJICAiUEtUUyBDT01QIDogJWRcbiIKKwkJCSAgIklTIFNVU1BFTkQgOiAlZFxuIgorCQkJICAiUlNWRCA6IDB4JXgiLAorCQkJICB1Y19md19zdGF0LT50eF9jb21wX3JpbmdfYmFzZSwKKwkJCSAgdWNfZndfc3RhdC0+dHhfY29tcF9yaW5nX3NpemUsCisJCQkgIHVjX2Z3X3N0YXQtPnR4X2NvbXBfcmluZ19kYmVsbF9hZGRyLAorCQkJICB1Y19md19zdGF0LT50eF9jb21wX3JpbmdfZGJlbGxfaW5kX3ZhbCwKKwkJCSAgdWNfZndfc3RhdC0+dHhfY29tcF9yaW5nX2RiZWxsX2NhY2hlZF92YWwsCisJCQkgIHVjX2Z3X3N0YXQtPnR4X2NvbXBfcmluZ19kYmVsbF9jYWNoZWRfdmFsLAorCQkJICB1Y19md19zdGF0LT50eF9wa3RzX2VucXVldWVkLAorCQkJICB1Y19md19zdGF0LT50eF9wa3RzX2NvbXBsZXRlZCwKKwkJCSAgdWNfZndfc3RhdC0+dHhfaXNfc3VzcGVuZCwgdWNfZndfc3RhdC0+dHhfcmVzZXJ2ZWQpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIj09PT0gSVBBX1VDIFdMQU5fRlcgUlggPT09PVxuIgorCQkJICAiSU5EIFJJTkcgQkFTRTogMHgleFxuIgorCQkJICAiSU5EIFJJTkcgU0laRTogJWRcbiIKKwkJCSAgIklORCBSSU5HIERCRUxMIDogMHgleFxuIgorCQkJICAiSU5EIFJJTkcgREJFTEwgSU5EIFZBTCA6ICVkXG4iCisJCQkgICJJTkQgUklORyBEQkVMTCBDQUNIRUQgVkFMIDogJWRcbiIKKwkJCSAgIlJEWSBJTkQgQUREUiA6IDB4JXhcbiIKKwkJCSAgIlJEWSBJTkQgQ0FDSEUgVkFMIDogJWRcbiIKKwkJCSAgIlJGSUwgSU5EIDogJWRcbiIKKwkJCSAgIk5VTSBQS1QgSU5ESUNBVCA6ICVkXG4iCisJCQkgICJCVUYgUkVGSUwgOiAlZFxuIgorCQkJICAiTlVNIERST1AgTk8gU1BDIDogJWRcbiIKKwkJCSAgIk5VTSBEUk9QIE5PIEJVRiA6ICVkXG4iCisJCQkgICJJUyBTVVNQTkQgOiAlZFxuIgorCQkJICAiUlNWRCA6IDB4JXhcbiIsCisJCQkgIHVjX2Z3X3N0YXQtPnJ4X2luZF9yaW5nX2Jhc2UsCisJCQkgIHVjX2Z3X3N0YXQtPnJ4X2luZF9yaW5nX3NpemUsCisJCQkgIHVjX2Z3X3N0YXQtPnJ4X2luZF9yaW5nX2RiZWxsX2FkZHIsCisJCQkgIHVjX2Z3X3N0YXQtPnJ4X2luZF9yaW5nX2RiZWxsX2luZF92YWwsCisJCQkgIHVjX2Z3X3N0YXQtPnJ4X2luZF9yaW5nX2RiZWxsX2luZF9jYWNoZWRfdmFsLAorCQkJICB1Y19md19zdGF0LT5yeF9pbmRfcmluZ19yZGlkeF9hZGRyLAorCQkJICB1Y19md19zdGF0LT5yeF9pbmRfcmluZ19yZF9pZHhfY2FjaGVkX3ZhbCwKKwkJCSAgdWNfZndfc3RhdC0+cnhfcmVmaWxsX2lkeCwKKwkJCSAgdWNfZndfc3RhdC0+cnhfbnVtX3BrdHNfaW5kaWNhdGVkLAorCQkJICB1Y19md19zdGF0LT5yeF9idWZfcmVmaWxsZWQsCisJCQkgIHVjX2Z3X3N0YXQtPnJ4X251bV9pbmRfZHJvcF9ub19zcGFjZSwKKwkJCSAgdWNfZndfc3RhdC0+cnhfbnVtX2luZF9kcm9wX25vX2J1ZiwKKwkJCSAgdWNfZndfc3RhdC0+cnhfaXNfc3VzcGVuZCwgdWNfZndfc3RhdC0+cnhfcmVzZXJ2ZWQpOworCQkvKiBTVEFUcyBmcm9tIElQQSAqLworCQlpcGFfZ2V0X3dkaV9zdGF0cygmaXBhX3N0YXQpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIj09PT0gSVBBX1VDIElQQSBUWCA9PT09XG4iCisJCQkgICJOVU0gUFJPQ0QgOiAlZFxuIgorCQkJICAiQ0UgREJFTEwgOiAweCV4XG4iCisJCQkgICJOVU0gREJFTEwgRklSRUQgOiAlZFxuIgorCQkJICAiQ09NUCBSTkcgRlVMTCA6ICVkXG4iCisJCQkgICJDT01QIFJORyBFTVBUIDogJWRcbiIKKwkJCSAgIkNPTVAgUk5HIFVTRSBIR0ggOiAlZFxuIgorCQkJICAiQ09NUCBSTkcgVVNFIExPVyA6ICVkXG4iCisJCQkgICJCQU0gRklGTyBGVUxMIDogJWRcbiIKKwkJCSAgIkJBTSBGSUZPIEVNUFQgOiAlZFxuIgorCQkJICAiQkFNIEZJRk8gVVNFIEhHSCA6ICVkXG4iCisJCQkgICJCQU0gRklGTyBVU0UgTE9XIDogJWRcbiIKKwkJCSAgIk5VTSBEQkVMTCA6ICVkXG4iCisJCQkgICJOVU0gVU5FWFAgREJFTEwgOiAlZFxuIgorCQkJICAiTlVNIEJBTSBJTlQgSERMIDogMHgleFxuIgorCQkJICAiTlVNIEJBTSBJTlQgTk9OLVJVTiA6IDB4JXhcbiIKKwkJCSAgIk5VTSBRTUIgSU5UIEhETCA6IDB4JXgiLAorCQkJICBpcGFfc3RhdC50eF9jaF9zdGF0cy5udW1fcGt0c19wcm9jZXNzZWQsCisJCQkgIGlwYV9zdGF0LnR4X2NoX3N0YXRzLmNvcHlfZW5naW5lX2Rvb3JiZWxsX3ZhbHVlLAorCQkJICBpcGFfc3RhdC50eF9jaF9zdGF0cy5udW1fZGJfZmlyZWQsCisJCQkgIGlwYV9zdGF0LnR4X2NoX3N0YXRzLnR4X2NvbXBfcmluZ19zdGF0cy5yaW5nRnVsbCwKKwkJCSAgaXBhX3N0YXQudHhfY2hfc3RhdHMudHhfY29tcF9yaW5nX3N0YXRzLnJpbmdFbXB0eSwKKwkJCSAgaXBhX3N0YXQudHhfY2hfc3RhdHMudHhfY29tcF9yaW5nX3N0YXRzLnJpbmdVc2FnZUhpZ2gsCisJCQkgIGlwYV9zdGF0LnR4X2NoX3N0YXRzLnR4X2NvbXBfcmluZ19zdGF0cy5yaW5nVXNhZ2VMb3csCisJCQkgIGlwYV9zdGF0LnR4X2NoX3N0YXRzLmJhbV9zdGF0cy5iYW1GaWZvRnVsbCwKKwkJCSAgaXBhX3N0YXQudHhfY2hfc3RhdHMuYmFtX3N0YXRzLmJhbUZpZm9FbXB0eSwKKwkJCSAgaXBhX3N0YXQudHhfY2hfc3RhdHMuYmFtX3N0YXRzLmJhbUZpZm9Vc2FnZUhpZ2gsCisJCQkgIGlwYV9zdGF0LnR4X2NoX3N0YXRzLmJhbV9zdGF0cy5iYW1GaWZvVXNhZ2VMb3csCisJCQkgIGlwYV9zdGF0LnR4X2NoX3N0YXRzLm51bV9kYiwKKwkJCSAgaXBhX3N0YXQudHhfY2hfc3RhdHMubnVtX3VuZXhwZWN0ZWRfZGIsCisJCQkgIGlwYV9zdGF0LnR4X2NoX3N0YXRzLm51bV9iYW1faW50X2hhbmRsZWQsCisJCQkgIGlwYV9zdGF0LnR4X2NoX3N0YXRzLgorCQkJICBudW1fYmFtX2ludF9pbl9ub25fcnVubm5pbmdfc3RhdGUsCisJCQkgIGlwYV9zdGF0LnR4X2NoX3N0YXRzLm51bV9xbWJfaW50X2hhbmRsZWQpOworCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiPT09PSBJUEFfVUMgSVBBIFJYID09PT1cbiIKKwkJCSAgIk1BWCBPU1QgUEtUIDogJWRcbiIKKwkJCSAgIk5VTSBQS1QgUFJDU0QgOiAlZFxuIgorCQkJICAiUk5HIFJQIDogMHgleFxuIgorCQkJICAiQ09NUCBSTkcgRlVMTCA6ICVkXG4iCisJCQkgICJDT01QIFJORyBFTVBUIDogJWRcbiIKKwkJCSAgIkNPTVAgUk5HIFVTRSBIR0ggOiAlZFxuIgorCQkJICAiQ09NUCBSTkcgVVNFIExPVyA6ICVkXG4iCisJCQkgICJCQU0gRklGTyBGVUxMIDogJWRcbiIKKwkJCSAgIkJBTSBGSUZPIEVNUFQgOiAlZFxuIgorCQkJICAiQkFNIEZJRk8gVVNFIEhHSCA6ICVkXG4iCisJCQkgICJCQU0gRklGTyBVU0UgTE9XIDogJWRcbiIKKwkJCSAgIk5VTSBEQiA6ICVkXG4iCisJCQkgICJOVU0gVU5FWFAgREIgOiAlZFxuIgorCQkJICAiTlVNIEJBTSBJTlQgSE5ETCA6IDB4JXhcbiIsCisJCQkgIGlwYV9zdGF0LnJ4X2NoX3N0YXRzLm1heF9vdXRzdGFuZGluZ19wa3RzLAorCQkJICBpcGFfc3RhdC5yeF9jaF9zdGF0cy5udW1fcGt0c19wcm9jZXNzZWQsCisJCQkgIGlwYV9zdGF0LnJ4X2NoX3N0YXRzLnJ4X3JpbmdfcnBfdmFsdWUsCisJCQkgIGlwYV9zdGF0LnJ4X2NoX3N0YXRzLnJ4X2luZF9yaW5nX3N0YXRzLnJpbmdGdWxsLAorCQkJICBpcGFfc3RhdC5yeF9jaF9zdGF0cy5yeF9pbmRfcmluZ19zdGF0cy5yaW5nRW1wdHksCisJCQkgIGlwYV9zdGF0LnJ4X2NoX3N0YXRzLnJ4X2luZF9yaW5nX3N0YXRzLnJpbmdVc2FnZUhpZ2gsCisJCQkgIGlwYV9zdGF0LnJ4X2NoX3N0YXRzLnJ4X2luZF9yaW5nX3N0YXRzLnJpbmdVc2FnZUxvdywKKwkJCSAgaXBhX3N0YXQucnhfY2hfc3RhdHMuYmFtX3N0YXRzLmJhbUZpZm9GdWxsLAorCQkJICBpcGFfc3RhdC5yeF9jaF9zdGF0cy5iYW1fc3RhdHMuYmFtRmlmb0VtcHR5LAorCQkJICBpcGFfc3RhdC5yeF9jaF9zdGF0cy5iYW1fc3RhdHMuYmFtRmlmb1VzYWdlSGlnaCwKKwkJCSAgaXBhX3N0YXQucnhfY2hfc3RhdHMuYmFtX3N0YXRzLmJhbUZpZm9Vc2FnZUxvdywKKwkJCSAgaXBhX3N0YXQucnhfY2hfc3RhdHMubnVtX2RiLAorCQkJICBpcGFfc3RhdC5yeF9jaF9zdGF0cy5udW1fdW5leHBlY3RlZF9kYiwKKwkJCSAgaXBhX3N0YXQucnhfY2hfc3RhdHMubnVtX2JhbV9pbnRfaGFuZGxlZCk7CisJfSBlbHNlIGlmICgoSEREX0lQQV9VQ19PUENPREVfU1RBVFMgPT0gbXNnLT5vcF9jb2RlKSAmJgorCQkoSEREX0lQQV9VQ19TVEFUX1JFQVNPTl9CV19DQUwgPT0gaGRkX2lwYS0+c3RhdF9yZXFfcmVhc29uKSkgeworCQkvKiBTVEFUcyBmcm9tIEZXICovCisJCXVjX2Z3X3N0YXQgPSAoc3RydWN0IGlwYV91Y19md19zdGF0cyAqKQorCQkJKCh1aW50OF90ICopb3BfbXNnICsgc2l6ZW9mKHN0cnVjdCBvcF9tc2dfdHlwZSkpOworCQljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCWhkZF9pcGEtPmlwYV90eF9wYWNrZXRzX2RpZmYgPSBIRERfQldfR0VUX0RJRkYoCisJCQl1Y19md19zdGF0LT50eF9wa3RzX2NvbXBsZXRlZCwKKwkJCWhkZF9pcGEtPmlwYV9wX3R4X3BhY2tldHMpOworCQloZGRfaXBhLT5pcGFfcnhfcGFja2V0c19kaWZmID0gSEREX0JXX0dFVF9ESUZGKAorCQkJKHVjX2Z3X3N0YXQtPnJ4X251bV9pbmRfZHJvcF9ub19zcGFjZSArCisJCQl1Y19md19zdGF0LT5yeF9udW1faW5kX2Ryb3Bfbm9fYnVmICsKKwkJCXVjX2Z3X3N0YXQtPnJ4X251bV9wa3RzX2luZGljYXRlZCksCisJCQloZGRfaXBhLT5pcGFfcF9yeF9wYWNrZXRzKTsKKworCQloZGRfaXBhLT5pcGFfcF90eF9wYWNrZXRzID0gdWNfZndfc3RhdC0+dHhfcGt0c19jb21wbGV0ZWQ7CisJCWhkZF9pcGEtPmlwYV9wX3J4X3BhY2tldHMgPQorCQkJKHVjX2Z3X3N0YXQtPnJ4X251bV9pbmRfZHJvcF9ub19zcGFjZSArCisJCQl1Y19md19zdGF0LT5yeF9udW1faW5kX2Ryb3Bfbm9fYnVmICsKKwkJCXVjX2Z3X3N0YXQtPnJ4X251bV9wa3RzX2luZGljYXRlZCk7CisJCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKwl9IGVsc2UgeworCQlIRERfSVBBX0xPRyhMT0dFLCAiSU5WQUxJRCBSRUFTT04gJWQiLAorCQkJICAgIGhkZF9pcGEtPnN0YXRfcmVxX3JlYXNvbik7CisJfQorCWNkZl9tZW1fZnJlZShvcF9tc2cpOworfQorCisKKy8qKgorICogaGRkX2lwYV91Y19vZmZsb2FkX2VuYWJsZV9kaXNhYmxlKCkgLSB3ZGkgZW5hYmxlL2Rpc2FibGUgbm90aWZ5IHRvIGZ3CisgKiBAYWRhcHRlcjogZGV2aWNlIGFkYXB0ZXIgaW5zdGFuY2UKKyAqIEBvZmZsb2FkX3R5cGU6IE1DQyBvciBTQ0MKKyAqIEBlbmFibGU6IFRYIG9mZmxvYWQgZW5hYmxlIG9yIGRpc2FibGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2lwYV91Y19vZmZsb2FkX2VuYWJsZV9kaXNhYmxlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQl1aW50MzJfdCBvZmZsb2FkX3R5cGUsIHVpbnQzMl90IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc2lyX2lwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlIGlwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlOworCisJLyogTG93ZXIgbGF5ZXIgbWF5IHNlbmQgbXVsdGlwbGUgU1RBUlRfQlNTX0VWRU5UIGluIERGUyBtb2RlIG9yIGR1cmluZworCSAqIGNoYW5uZWwgY2hhbmdlIGluZGljYXRpb24uIFNpbmNlIHRoZXNlIGluZGljYXRpb25zIGFyZSBzZW50IGJ5IGxvd2VyCisJICogbGF5ZXIgYXMgU0FQIHVwZGF0ZXMgYW5kIElQQSBkb2Vzbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgZm9yIHRoZXNlCisJICogdXBkYXRlcyBzbyBpZ25vcmluZyEKKwkgKi8KKwlpZiAoV0xBTl9IRERfU09GVEFQID09IGFkYXB0ZXItPmRldmljZV9tb2RlICYmIGFkYXB0ZXItPmlwYV9jb250ZXh0KQorCQlyZXR1cm47CisKKwkvKiBMb3dlciBsYXllciBtYXkgc2VuZCBtdWx0aXBsZSBTVEFSVF9CU1NfRVZFTlQgaW4gREZTIG1vZGUgb3IgZHVyaW5nCisJICogY2hhbm5lbCBjaGFuZ2UgaW5kaWNhdGlvbi4gU2luY2UgdGhlc2UgaW5kaWNhdGlvbnMgYXJlIHNlbnQgYnkgbG93ZXIKKwkgKiBsYXllciBhcyBTQVAgdXBkYXRlcyBhbmQgSVBBIGRvZXNuJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBmb3IgdGhlc2UKKwkgKiB1cGRhdGVzIHNvIGlnbm9yaW5nIQorCSovCisJaWYgKGFkYXB0ZXItPmlwYV9jb250ZXh0KQorCQlyZXR1cm47CisKKwljZGZfbWVtX3plcm8oJmlwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlLAorCQlzaXplb2YoaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGUpKTsKKwlpcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZS5vZmZsb2FkX3R5cGUgPSBvZmZsb2FkX3R5cGU7CisJaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGUudmRldl9pZCA9IGFkYXB0ZXItPnNlc3Npb25JZDsKKwlpcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZS5lbmFibGUgPSBlbmFibGU7CisKKwlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJIiVzOiBvZmZsb2FkX3R5cGU9JWQsIHZkZXZfaWQ9JWQsIGVuYWJsZT0lZCIsIF9fZnVuY19fLAorCQlpcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZS5vZmZsb2FkX3R5cGUsCisJCWlwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlLnZkZXZfaWQsCisJCWlwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlLmVuYWJsZSk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCXNtZV9pcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZShXTEFOX0hERF9HRVRfSEFMX0NUWChhZGFwdGVyKSwKKwkJCWFkYXB0ZXItPnNlc3Npb25JZCwgJmlwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlKSkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiJXM6IEZhaWx1cmUgdG8gZW5hYmxlIElQQSBvZmZsb2FkIFwKKwkJCShvZmZsb2FkX3R5cGU9JWQsIHZkZXZfaWQ9JWQsIGVuYWJsZT0lZCkiLCBfX2Z1bmNfXywKKwkJCWlwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlLm9mZmxvYWRfdHlwZSwKKwkJCWlwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlLnZkZXZfaWQsCisJCQlpcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZS5lbmFibGUpOworCX0KK30KKworLyoqCisgKiBoZGRfaXBhX3VjX2Z3X29wX2V2ZW50X2hhbmRsZXIgLSBJUEEgdUMgRlcgT1B2ZW50IGhhbmRsZXIKKyAqIEB3b3JrOiB1QyBPUCB3b3JrCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pcGFfdWNfZndfb3BfZXZlbnRfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG9wX21zZ190eXBlICptc2c7CisJc3RydWN0IHVjX29wX3dvcmtfc3RydWN0ICp1Y19vcF93b3JrID0gY29udGFpbmVyX29mKHdvcmssCisJCQlzdHJ1Y3QgdWNfb3Bfd29ya19zdHJ1Y3QsIHdvcmspOworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEgPSBnaGRkX2lwYTsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisKKwltc2cgPSB1Y19vcF93b3JrLT5tc2c7CisJdWNfb3Bfd29yay0+bXNnID0gTlVMTDsKKwlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJIiVzLCBwb3N0ZWQgbXNnICVkIiwgX19mdW5jX18sIG1zZy0+b3BfY29kZSk7CisKKwloZGRfaXBhX3VjX29wX2NiKG1zZywgaGRkX2lwYS0+aGRkX2N0eCk7CisKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogaGRkX2lwYV91Y19vcF9ldmVudF9oYW5kbGVyKCkgLSBBZGFwdGVyIGxvb2t1cAorICogaGRkX2lwYV91Y19md19vcF9ldmVudF9oYW5kbGVyIC0gSVBBIHVDIEZXIE9QdmVudCBoYW5kbGVyCisgKiBAb3BfbXNnOiBvcGVyYXRpb24gbWVzc2FnZSByZWNlaXZlZCBmcm9tIGZpcm13YXJlCisgKiBAaGRkX2N0eDogR2xvYmFsIEhERCBjb250ZXh0CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pcGFfdWNfb3BfZXZlbnRfaGFuZGxlcih1aW50OF90ICpvcF9tc2csIHZvaWQgKmhkZF9jdHgpCit7CisJc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYTsKKwlzdHJ1Y3Qgb3BfbXNnX3R5cGUgKm1zZzsKKwlzdHJ1Y3QgdWNfb3Bfd29ya19zdHJ1Y3QgKnVjX29wX3dvcms7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKTsKKwkJZ290byBlbmQ7CisJfQorCisJbXNnID0gKHN0cnVjdCBvcF9tc2dfdHlwZSAqKW9wX21zZzsKKwloZGRfaXBhID0gKChoZGRfY29udGV4dF90ICopaGRkX2N0eCktPmhkZF9pcGE7CisKKwlpZiAodW5saWtlbHkoIWhkZF9pcGEpKQorCQlnb3RvIGVuZDsKKworCWlmIChIRERfSVBBX1VDX09QQ09ERV9NQVggPD0gbXNnLT5vcF9jb2RlKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBJbnZhbGlkIE9QIENvZGUgKCVkKSIsCisJCQkJX19mdW5jX18sIG1zZy0+b3BfY29kZSk7CisJCWdvdG8gZW5kOworCX0KKworCXVjX29wX3dvcmsgPSAmaGRkX2lwYS0+dWNfb3Bfd29ya1ttc2ctPm9wX2NvZGVdOworCWlmICh1Y19vcF93b3JrLT5tc2cpCisJCS8qIFdoZW4gdGhlIHNhbWUgdUMgT1BDT0RFIGlzIGFscmVhZHkgcGVuZGVkLCBqdXN0IHJldHVybiAqLworCQlnb3RvIGVuZDsKKworCXVjX29wX3dvcmstPm1zZyA9IG1zZzsKKwlzY2hlZHVsZV93b3JrKCZ1Y19vcF93b3JrLT53b3JrKTsKKwlyZXR1cm47CisKK2VuZDoKKwljZGZfbWVtX2ZyZWUob3BfbXNnKTsKK30KKworLyoqCisgKiBoZGRfaXBhX3VjX29sX2luaXQoKSAtIEluaXRpYWxpemUgSVBBIHVDIG9mZmxvYWQKKyAqIEBoZGRfY3R4OiBHbG9iYWwgSEREIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworc3RhdGljIENERl9TVEFUVVMgaGRkX2lwYV91Y19vbF9pbml0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJc3RydWN0IGlwYV93ZGlfaW5fcGFyYW1zIHBpcGVfaW47CisJc3RydWN0IGlwYV93ZGlfb3V0X3BhcmFtcyBwaXBlX291dDsKKwlzdHJ1Y3QgaGRkX2lwYV9wcml2ICppcGFfY3R4dCA9IChzdHJ1Y3QgaGRkX2lwYV9wcml2ICopaGRkX2N0eC0+aGRkX2lwYTsKKwlwX2Nkc19jb250ZXh0VHlwZSBjZHNfY3R4ID0gaGRkX2N0eC0+cGNkc19jb250ZXh0OworCXVpbnQ4X3QgaTsKKworCWNkZl9tZW1femVybygmcGlwZV9pbiwgc2l6ZW9mKHN0cnVjdCBpcGFfd2RpX2luX3BhcmFtcykpOworCWNkZl9tZW1femVybygmcGlwZV9vdXQsIHNpemVvZihzdHJ1Y3QgaXBhX3dkaV9vdXRfcGFyYW1zKSk7CisKKwljZGZfbGlzdF9pbml0KCZpcGFfY3R4dC0+cGVuZGluZ19ldmVudCwgMTAwMCk7CisJY2RmX211dGV4X2luaXQoJmlwYV9jdHh0LT5ldmVudF9sb2NrKTsKKworCS8qIFRYIFBJUEUgKi8KKwlwaXBlX2luLnN5cy5pcGFfZXBfY2ZnLm5hdC5uYXRfZW4gPSBJUEFfQllQQVNTX05BVDsKKwlwaXBlX2luLnN5cy5pcGFfZXBfY2ZnLmhkci5oZHJfbGVuID0gSEREX0lQQV9VQ19XTEFOX1RYX0hEUl9MRU47CisJcGlwZV9pbi5zeXMuaXBhX2VwX2NmZy5oZHIuaGRyX29mc3RfcGt0X3NpemVfdmFsaWQgPSAxOworCXBpcGVfaW4uc3lzLmlwYV9lcF9jZmcuaGRyLmhkcl9vZnN0X3BrdF9zaXplID0gMDsKKwlwaXBlX2luLnN5cy5pcGFfZXBfY2ZnLmhkci5oZHJfYWRkaXRpb25hbF9jb25zdF9sZW4gPQorCQlIRERfSVBBX1VDX1dMQU5fODAyM19IRFJfU0laRTsKKwlwaXBlX2luLnN5cy5pcGFfZXBfY2ZnLm1vZGUubW9kZSA9IElQQV9CQVNJQzsKKwlwaXBlX2luLnN5cy5jbGllbnQgPSBJUEFfQ0xJRU5UX1dMQU4xX0NPTlM7CisJcGlwZV9pbi5zeXMuZGVzY19maWZvX3N6ID0gaGRkX2N0eC0+Y29uZmlnLT5JcGFEZXNjU2l6ZTsKKwlwaXBlX2luLnN5cy5wcml2ID0gaGRkX2N0eC0+aGRkX2lwYTsKKwlwaXBlX2luLnN5cy5pcGFfZXBfY2ZnLmhkcl9leHQuaGRyX2xpdHRsZV9lbmRpYW4gPSB0cnVlOworCXBpcGVfaW4uc3lzLm5vdGlmeSA9IGhkZF9pcGFfaTJ3X2NiOworCWlmICghaGRkX2lwYV9pc19ybV9lbmFibGVkKGhkZF9jdHgpKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAgICIlczogSVBBIFJNIERJU0FCTEVELCBJUEEgQVdBS0UiLCBfX2Z1bmNfXyk7CisJCXBpcGVfaW4uc3lzLmtlZXBfaXBhX2F3YWtlID0gdHJ1ZTsKKwl9CisKKwlwaXBlX2luLnUuZGwuY29tcF9yaW5nX2Jhc2VfcGEgPSBoZGRfY3R4LT50eF9jb21wX3JpbmdfYmFzZV9wYWRkcjsKKwlwaXBlX2luLnUuZGwuY29tcF9yaW5nX3NpemUgPSBoZGRfY3R4LT50eF9jb21wX3Jpbmdfc2l6ZSAqIDQ7CisJcGlwZV9pbi51LmRsLmNlX3JpbmdfYmFzZV9wYSA9IGhkZF9jdHgtPmNlX3NyX2Jhc2VfcGFkZHI7CisJcGlwZV9pbi51LmRsLmNlX2Rvb3JfYmVsbF9wYSA9IGhkZF9jdHgtPmNlX3JlZ19wYWRkcjsKKwlwaXBlX2luLnUuZGwuY2VfcmluZ19zaXplID0gaGRkX2N0eC0+Y2Vfc3JfcmluZ19zaXplICogODsKKwlwaXBlX2luLnUuZGwubnVtX3R4X2J1ZmZlcnMgPSBoZGRfY3R4LT50eF9udW1fYWxsb2NfYnVmZmVyOworCisJLyogQ29ubmVjdCBXREkgSVBBIFBJUEUgKi8KKwlpcGFfY29ubmVjdF93ZGlfcGlwZSgmcGlwZV9pbiwgJnBpcGVfb3V0KTsKKwkvKiBNaWNybyBDb250cm9sbGVyIERvb3JiZWxsIHJlZ2lzdGVyICovCisJaGRkX2N0eC0+dHhfY29tcF9kb29yYmVsbF9wYWRkciA9ICh1aW50MzJfdCkgcGlwZV9vdXQudWNfZG9vcl9iZWxsX3BhOworCS8qIFdMQU4gVFggUElQRSBIYW5kbGUgKi8KKwlpcGFfY3R4dC0+dHhfcGlwZV9oYW5kbGUgPSBwaXBlX291dC5jbG50X2hkbDsKKwlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICAgIlRYIDogQ1JCUEEgMHgleCwgQ1JTICVkLCBDRVJCUEEgMHgleCwgQ0VEUEEgMHgleCwiCisJCSAgICAiIENFUlogJWQsIE5CICVkLCBDREJQQUQgMHgleCIsCisJCSAgICAodW5zaWduZWQgaW50KXBpcGVfaW4udS5kbC5jb21wX3JpbmdfYmFzZV9wYSwKKwkJICAgIHBpcGVfaW4udS5kbC5jb21wX3Jpbmdfc2l6ZSwKKwkJICAgICh1bnNpZ25lZCBpbnQpcGlwZV9pbi51LmRsLmNlX3JpbmdfYmFzZV9wYSwKKwkJICAgICh1bnNpZ25lZCBpbnQpcGlwZV9pbi51LmRsLmNlX2Rvb3JfYmVsbF9wYSwKKwkJICAgIHBpcGVfaW4udS5kbC5jZV9yaW5nX3NpemUsCisJCSAgICBwaXBlX2luLnUuZGwubnVtX3R4X2J1ZmZlcnMsCisJCSAgICAodW5zaWduZWQgaW50KWhkZF9jdHgtPnR4X2NvbXBfZG9vcmJlbGxfcGFkZHIpOworCisJLyogUlggUElQRSAqLworCXBpcGVfaW4uc3lzLmlwYV9lcF9jZmcubmF0Lm5hdF9lbiA9IElQQV9CWVBBU1NfTkFUOworCXBpcGVfaW4uc3lzLmlwYV9lcF9jZmcuaGRyLmhkcl9sZW4gPSBIRERfSVBBX1VDX1dMQU5fUlhfSERSX0xFTjsKKwlwaXBlX2luLnN5cy5pcGFfZXBfY2ZnLmhkci5oZHJfb2ZzdF9tZXRhZGF0YV92YWxpZCA9IDA7CisJcGlwZV9pbi5zeXMuaXBhX2VwX2NmZy5oZHIuaGRyX21ldGFkYXRhX3JlZ192YWxpZCA9IDE7CisJcGlwZV9pbi5zeXMuaXBhX2VwX2NmZy5tb2RlLm1vZGUgPSBJUEFfQkFTSUM7CisJcGlwZV9pbi5zeXMuY2xpZW50ID0gSVBBX0NMSUVOVF9XTEFOMV9QUk9EOworCXBpcGVfaW4uc3lzLmRlc2NfZmlmb19zeiA9IGhkZF9jdHgtPmNvbmZpZy0+SXBhRGVzY1NpemUgKworCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc3BzX2lvdmVjKTsKKwlwaXBlX2luLnN5cy5ub3RpZnkgPSBoZGRfaXBhX3cyaV9jYjsKKwlpZiAoIWhkZF9pcGFfaXNfcm1fZW5hYmxlZChoZGRfY3R4KSkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIiVzOiBJUEEgUk0gRElTQUJMRUQsIElQQSBBV0FLRSIsIF9fZnVuY19fKTsKKwkJcGlwZV9pbi5zeXMua2VlcF9pcGFfYXdha2UgPSB0cnVlOworCX0KKworCXBpcGVfaW4udS51bC5yZHlfcmluZ19iYXNlX3BhID0gaGRkX2N0eC0+cnhfcmR5X3JpbmdfYmFzZV9wYWRkcjsKKwlwaXBlX2luLnUudWwucmR5X3Jpbmdfc2l6ZSA9IGhkZF9jdHgtPnJ4X3JkeV9yaW5nX3NpemU7CisJcGlwZV9pbi51LnVsLnJkeV9yaW5nX3JwX3BhID0gaGRkX2N0eC0+cnhfcHJvY19kb25lX2lkeF9wYWRkcjsKKworCWlwYV9jb25uZWN0X3dkaV9waXBlKCZwaXBlX2luLCAmcGlwZV9vdXQpOworCWhkZF9jdHgtPnJ4X3JlYWR5X2Rvb3JiZWxsX3BhZGRyID0gcGlwZV9vdXQudWNfZG9vcl9iZWxsX3BhOworCWlwYV9jdHh0LT5yeF9waXBlX2hhbmRsZSA9IHBpcGVfb3V0LmNsbnRfaGRsOworCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgICAiUlggOiBSUkJQQSAweCV4LCBSUlMgJWQsIFBESVBBIDB4JXgsIFJEWV9EQl9QQUQgMHgleCIsCisJCSAgICAodW5zaWduZWQgaW50KXBpcGVfaW4udS51bC5yZHlfcmluZ19iYXNlX3BhLAorCQkgICAgcGlwZV9pbi51LnVsLnJkeV9yaW5nX3NpemUsCisJCSAgICAodW5zaWduZWQgaW50KXBpcGVfaW4udS51bC5yZHlfcmluZ19ycF9wYSwKKwkJICAgICh1bnNpZ25lZCBpbnQpaGRkX2N0eC0+cnhfcmVhZHlfZG9vcmJlbGxfcGFkZHIpOworCisJb2xfdHhyeF9pcGFfdWNfc2V0X2Rvb3JiZWxsX3BhZGRyKGNkc19jdHgtPnBkZXZfdHhyeF9jdHgsCisJCQkJICAgICAodWludDMyX3QpIGhkZF9jdHgtPnR4X2NvbXBfZG9vcmJlbGxfcGFkZHIsCisJCQkJICAgICAodWludDMyX3QpIGhkZF9jdHgtPnJ4X3JlYWR5X2Rvb3JiZWxsX3BhZGRyKTsKKworCW9sX3R4cnhfaXBhX3VjX3JlZ2lzdGVyX29wX2NiKGNkc19jdHgtPnBkZXZfdHhyeF9jdHgsCisJCQkJICBoZGRfaXBhX3VjX29wX2V2ZW50X2hhbmRsZXIsICh2b2lkICopaGRkX2N0eCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEREX0lQQV9VQ19PUENPREVfTUFYOyBpKyspIHsKKwkJY25zc19pbml0X3dvcmsoJmlwYV9jdHh0LT51Y19vcF93b3JrW2ldLndvcmssCisJCQloZGRfaXBhX3VjX2Z3X29wX2V2ZW50X2hhbmRsZXIpOworCQlpcGFfY3R4dC0+dWNfb3Bfd29ya1tpXS5tc2cgPSBOVUxMOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBJUEFfVUNfT0ZGTE9BRAorLyoqCisgKiBoZGRfaXBhX3VjX3Nzcl9kZWluaXQoKSAtIGhhbmRsZSBpcGEgZGVpbml0IGZvciBTU1IKKyAqCisgKiBEZWluaXQgYmFzaWMgSVBBIFVDIGhvc3Qgc2lkZSB0byBiZSBpbiBzeW5jIHJlbG9hZGVkIEZXIGR1cmluZworICogU1NSCisgKgorICogUmV0dXJuOiAwIC0gU3VjY2VzcworICovCitpbnQgaGRkX2lwYV91Y19zc3JfZGVpbml0KHZvaWQpCit7CisJc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSA9IGdoZGRfaXBhOworCWludCBpZHg7CisJc3RydWN0IGhkZF9pcGFfaWZhY2VfY29udGV4dCAqaWZhY2VfY29udGV4dDsKKworCWlmICghaGRkX2lwYV91Y19pc19lbmFibGVkKGhkZF9pcGEpKQorCQlyZXR1cm4gMDsKKworCS8qIENsZWFuIHVwIEhERCBJUEEgaW50ZXJmYWNlcyAqLworCWZvciAoaWR4ID0gMDsgKGhkZF9pcGEtPm51bV9pZmFjZSA+IDApICYmCisJCShpZHggPCBIRERfSVBBX01BWF9JRkFDRSk7IGlkeCsrKSB7CisJCWlmYWNlX2NvbnRleHQgPSAmaGRkX2lwYS0+aWZhY2VfY29udGV4dFtpZHhdOworCQlpZiAoaWZhY2VfY29udGV4dCAmJiBpZmFjZV9jb250ZXh0LT5hZGFwdGVyKQorCQkJaGRkX2lwYV9jbGVhbnVwX2lmYWNlKGlmYWNlX2NvbnRleHQpOworCX0KKworCS8qIEFmdGVyIFNTUiwgd2xhbiBkcml2ZXIgcmVsb2FkcyBGVyBhZ2Fpbi4gQnV0IHdlIG5lZWQgdG8gcHJvdGVjdAorCSAqIElQQSBzdWJtb2R1bGUgZHVyaW5nIFNTUiB0cmFuc2llbnQgc3RhdGUuIFNvIGRlaW5pdCBiYXNpYyBJUEEKKwkgKiBVQyBob3N0IHNpZGUgdG8gYmUgaW4gc3luYyB3aXRoIHJlbG9hZGVkIEZXIGR1cmluZyBTU1IKKwkgKi8KKwloZGRfaXBhX3VjX2Rpc2FibGVfcGlwZXMoaGRkX2lwYSk7CisKKwljZGZfd2FrZV9sb2NrX2FjcXVpcmUoJmhkZF9pcGEtPmV2ZW50X2xvY2spOworCWZvciAoaWR4ID0gMDsgaWR4IDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpZHgrKykgeworCQloZGRfaXBhLT5hc3NvY19zdGFzX21hcFtpZHhdLmlzX3Jlc2VydmVkID0gZmFsc2U7CisJCWhkZF9pcGEtPmFzc29jX3N0YXNfbWFwW2lkeF0uc3RhX2lkID0gMHhGRjsKKwl9CisJY2RmX3dha2VfbG9ja19yZWxlYXNlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKworCS8qIEZ1bGwgSVBBIGRyaXZlciBjbGVhbnVwIG5vdCByZXF1aXJlZCBzaW5jZSB3bGFuIGRyaXZlciBpcyBub3cKKwkgKiB1bmxvYWRlZCBhbmQgcmVsb2FkZWQgYWZ0ZXIgU1NSLgorCSAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9pcGFfdWNfc3NyX3JlaW5pdCgpIC0gaGFuZGxlIGlwYSByZWluaXQgYWZ0ZXIgU1NSCisgKgorICogSW5pdCBiYXNpYyBJUEEgVUMgaG9zdCBzaWRlIHRvIGJlIGluIHN5bmMgd2l0aCByZWxvYWRlZCBGVyBhZnRlcgorICogU1NSIHRvIHJlc3VtZSBJUEEgVUMgb3BlcmF0aW9ucworICoKKyAqIFJldHVybjogMCAtIFN1Y2Nlc3MKKyAqLworaW50IGhkZF9pcGFfdWNfc3NyX3JlaW5pdCh2b2lkKQoreworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEgPSBnaGRkX2lwYTsKKworCWlmICghaGRkX2lwYV91Y19pc19lbmFibGVkKGhkZF9pcGEpKQorCQlyZXR1cm4gMDsKKworCS8qIEFmdGVyIFNTUiBpcyBjb21wbGV0ZSwgSVBBIFVDIGNhbiByZXN1bWUgb3BlcmF0aW9uLiBCdXQgbm93IHdsYW4KKwkgKiBkcml2ZXIgd2lsbCBiZSB1bmxvYWRlZCBhbmQgcmVsb2FkZWQsIHdoaWNoIHRha2VzIGNhcmUgb2YgSVBBIGNsZWFudXAKKwkgKiBhbmQgaW5pdGlhbGl6YXRpb24uIFRoaXMgaXMgYSBwbGFjZWhvbGRlciBmdW5jIGlmIElQQSBoYXMgdG8gcmVzdW1lCisJICogb3BlcmF0aW9ucyB3aXRob3V0IGRyaXZlciByZWxvYWQuCisJICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoqCisgKiBoZGRfaXBhX3dha2VfbG9ja190aW1lcl9mdW5jKCkgLSBXYWtlIGxvY2sgd29yayBoYW5kbGVyCisgKiBAd29yazogc2NoZWR1bGVkIHdvcmsKKyAqCisgKiBXaGVuIElQQSByZXNvdXJjZXMgYXJlIHJlbGVhc2VkIGluIGhkZF9pcGFfcm1fdHJ5X3JlbGVhc2UoKSB3ZSBkbworICogbm90IHdhbnQgdG8gaW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUgd2FrZSBsb2NrIHNpbmNlIHRoZSBzeXN0ZW0KKyAqIHdvdWxkIHRoZW4gcG90ZW50aWFsbHkgdHJ5IHRvIHN1c3BlbmQgd2hlbiB0aGVyZSBpcyBhIGhlYWx0aHkgZGF0YQorICogcmF0ZS4gIERlZmVycmVkIHdvcmsgaXMgc2NoZWR1bGVkIGFuZCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlCisgKiB3b3JrLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaWYgdGhlIElQQSByZXNvdXJjZSBpcyBzdGlsbAorICogcmVsZWFzZWQgdGhlbiB3ZSByZWxlYXNlIHRoZSB3YWtlIGxvY2suCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pcGFfd2FrZV9sb2NrX3RpbWVyX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEgPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLAorCQkJCQkJICAgIHN0cnVjdCBoZGRfaXBhX3ByaXYsCisJCQkJCQkgICAgd2FrZV9sb2NrX3dvcmspOworCisJY2RmX3NwaW5fbG9ja19iaCgmaGRkX2lwYS0+cm1fbG9jayk7CisKKwlpZiAoaGRkX2lwYS0+cm1fc3RhdGUgIT0gSEREX0lQQV9STV9SRUxFQVNFRCkKKwkJZ290byBlbmQ7CisKKwloZGRfaXBhLT53YWtlX2xvY2tfcmVsZWFzZWQgPSB0cnVlOworCWNkZl93YWtlX2xvY2tfcmVsZWFzZSgmaGRkX2lwYS0+d2FrZV9sb2NrLAorCQkJICAgICAgV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19JUEEpOworCitlbmQ6CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZoZGRfaXBhLT5ybV9sb2NrKTsKK30KKworLyoqCisgKiBoZGRfaXBhX3JtX3JlcXVlc3QoKSAtIFJlcXVlc3QgcmVzb3VyY2UgZnJvbSBJUEEKKyAqIEBoZGRfaXBhOiBHbG9iYWwgSEREIElQQSBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgaGRkX2lwYV9ybV9yZXF1ZXN0KHN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWhkZF9pcGFfaXNfcm1fZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkKKwkJcmV0dXJuIDA7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZoZGRfaXBhLT5ybV9sb2NrKTsKKworCXN3aXRjaCAoaGRkX2lwYS0+cm1fc3RhdGUpIHsKKwljYXNlIEhERF9JUEFfUk1fR1JBTlRFRDoKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZoZGRfaXBhLT5ybV9sb2NrKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBIRERfSVBBX1JNX0dSQU5UX1BFTkRJTkc6CisJCWNkZl9zcGluX3VubG9ja19iaCgmaGRkX2lwYS0+cm1fbG9jayk7CisJCXJldHVybiAtRUlOUFJPR1JFU1M7CisJY2FzZSBIRERfSVBBX1JNX1JFTEVBU0VEOgorCQloZGRfaXBhLT5ybV9zdGF0ZSA9IEhERF9JUEFfUk1fR1JBTlRfUEVORElORzsKKwkJYnJlYWs7CisJfQorCisJY2RmX3NwaW5fdW5sb2NrX2JoKCZoZGRfaXBhLT5ybV9sb2NrKTsKKworCXJldCA9IGlwYV9ybV9pbmFjdGl2aXR5X3RpbWVyX3JlcXVlc3RfcmVzb3VyY2UoCisJCQlJUEFfUk1fUkVTT1VSQ0VfV0xBTl9QUk9EKTsKKworCWNkZl9zcGluX2xvY2tfYmgoJmhkZF9pcGEtPnJtX2xvY2spOworCWlmIChyZXQgPT0gMCkgeworCQloZGRfaXBhLT5ybV9zdGF0ZSA9IEhERF9JUEFfUk1fR1JBTlRFRDsKKwkJaGRkX2lwYS0+c3RhdHMubnVtX3JtX2dyYW50X2ltbSsrOworCX0KKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmhkZF9pcGEtPndha2VfbG9ja193b3JrKTsKKwlpZiAoaGRkX2lwYS0+d2FrZV9sb2NrX3JlbGVhc2VkKSB7CisJCWNkZl93YWtlX2xvY2tfYWNxdWlyZSgmaGRkX2lwYS0+d2FrZV9sb2NrLAorCQkJCSAgICAgIFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfSVBBKTsKKwkJaGRkX2lwYS0+d2FrZV9sb2NrX3JlbGVhc2VkID0gZmFsc2U7CisJfQorCWNkZl9zcGluX3VubG9ja19iaCgmaGRkX2lwYS0+cm1fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9pcGFfcm1fdHJ5X3JlbGVhc2UoKSAtIEF0dGVtcHQgdG8gcmVsZWFzZSBJUEEgcmVzb3VyY2UKKyAqIEBoZGRfaXBhOiBHbG9iYWwgSEREIElQQSBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIGlmIHJlc291cmNlcyByZWxlYXNlZCwgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaGRkX2lwYV9ybV90cnlfcmVsZWFzZShzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhKQoreworCWludCByZXQgPSAwOworCisJaWYgKCFoZGRfaXBhX2lzX3JtX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpCisJCXJldHVybiAwOworCisJaWYgKGF0b21pY19yZWFkKCZoZGRfaXBhLT50eF9yZWZfY250KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlzcGluX2xvY2tfYmgoJmhkZF9pcGEtPnFfbG9jayk7CisJaWYgKCFoZGRfaXBhX3VjX3N0YV9pc19lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpICYmCisJCShoZGRfaXBhLT5wZW5kaW5nX2h3X2Rlc2NfY250IHx8IGhkZF9pcGEtPnBlbmRfcV9jbnQpKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZoZGRfaXBhLT5xX2xvY2spOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmhkZF9pcGEtPnFfbG9jayk7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZoZGRfaXBhLT5wbV9sb2NrKTsKKworCWlmICghY2RmX25idWZfaXNfcXVldWVfZW1wdHkoJmhkZF9pcGEtPnBtX3F1ZXVlX2hlYWQpKSB7CisJCWNkZl9zcGluX3VubG9ja19iaCgmaGRkX2lwYS0+cG1fbG9jayk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJmhkZF9pcGEtPnBtX2xvY2spOworCisJY2RmX3NwaW5fbG9ja19iaCgmaGRkX2lwYS0+cm1fbG9jayk7CisJc3dpdGNoIChoZGRfaXBhLT5ybV9zdGF0ZSkgeworCWNhc2UgSEREX0lQQV9STV9HUkFOVEVEOgorCQlicmVhazsKKwljYXNlIEhERF9JUEFfUk1fR1JBTlRfUEVORElORzoKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZoZGRfaXBhLT5ybV9sb2NrKTsKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKKwljYXNlIEhERF9JUEFfUk1fUkVMRUFTRUQ6CisJCWNkZl9zcGluX3VubG9ja19iaCgmaGRkX2lwYS0+cm1fbG9jayk7CisJCXJldHVybiAwOworCX0KKworCS8qIElQQSBkcml2ZXIgcmV0dXJucyBpbW1lZGlhdGVseSBzbyBzZXQgdGhlIHN0YXRlIGhlcmUgdG8gYXZvaWQgYW55CisJICogcmFjZSBjb25kaXRpb24uCisJICovCisJaGRkX2lwYS0+cm1fc3RhdGUgPSBIRERfSVBBX1JNX1JFTEVBU0VEOworCWhkZF9pcGEtPnN0YXRzLm51bV9ybV9yZWxlYXNlKys7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZoZGRfaXBhLT5ybV9sb2NrKTsKKworCXJldCA9CisJCWlwYV9ybV9pbmFjdGl2aXR5X3RpbWVyX3JlbGVhc2VfcmVzb3VyY2UoSVBBX1JNX1JFU09VUkNFX1dMQU5fUFJPRCk7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZoZGRfaXBhLT5ybV9sb2NrKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCWhkZF9pcGEtPnJtX3N0YXRlID0gSEREX0lQQV9STV9HUkFOVEVEOworCQlXQVJOX09OKDEpOworCX0KKworCS8qCisJICogSWYgd2FrZV9sb2NrIGlzIHJlbGVhc2VkIGltbWVkaWF0ZWx5LCBrZXJuZWwgd291bGQgdHJ5IHRvIHN1c3BlbmQKKwkgKiBpbW1lZGlhdGVseSBhcyB3ZWxsLCBKdXN0IGF2b2lkIHBpbmctcG9uZyBiZXR3ZWVuIHN1c3BlbmQtcmVzdW1lCisJICogd2hpbGUgdGhlcmUgaXMgaGVhbHRoeSBhbW91bnQgb2YgZGF0YSB0cmFuc2ZlciBnb2luZyBvbiBieQorCSAqIHJlbGVhc2luZyB0aGUgd2FrZV9sb2NrIGFmdGVyIHNvbWUgZGVsYXkuCisJICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZoZGRfaXBhLT53YWtlX2xvY2tfd29yaywKKwkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkgICAgICAoSEREX0lQQV9SWF9JTkFDVElWSVRZX01TRUNfREVMQVkpKTsKKworCWNkZl9zcGluX3VubG9ja19iaCgmaGRkX2lwYS0+cm1fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9pcGFfcm1fbm90aWZ5KCkgLSBJUEEgcmVzb3VyY2UgbWFuYWdlciBub3RpZmllciBjYWxsYmFjaworICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHJlZ2lzdGVyZWQgd2l0aCBJUEEKKyAqIEBldmVudDogdGhlIElQQSByZXNvdXJjZSBtYW5hZ2VyIGV2ZW50IHRoYXQgb2NjdXJyZWQKKyAqIEBkYXRhOiB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pcGFfcm1fbm90aWZ5KHZvaWQgKnVzZXJfZGF0YSwgZW51bSBpcGFfcm1fZXZlbnQgZXZlbnQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSA9IHVzZXJfZGF0YTsKKworCWlmICh1bmxpa2VseSghaGRkX2lwYSkpCisJCXJldHVybjsKKworCWlmICghaGRkX2lwYV9pc19ybV9lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpKQorCQlyZXR1cm47CisKKwlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIkV2dDogJWQiLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUEFfUk1fUkVTT1VSQ0VfR1JBTlRFRDoKKwkJaWYgKGhkZF9pcGFfdWNfaXNfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkgeworCQkJLyogUk0gTm90aWZpY2F0aW9uIGNvbWVzIHdpdGggSVNSIGNvbnRleHQKKwkJCSAqIGl0IHNob3VsZCBiZSBzZXJpYWxpemVkIGludG8gd29yayBxdWV1ZSB0byBhdm9pZAorCQkJICogSVNSIHNsZWVwIHByb2JsZW0KKwkJCSAqLworCQkJaGRkX2lwYS0+dWNfcm1fd29yay5ldmVudCA9IGV2ZW50OworCQkJc2NoZWR1bGVfd29yaygmaGRkX2lwYS0+dWNfcm1fd29yay53b3JrKTsKKwkJCWJyZWFrOworCQl9CisJCWNkZl9zcGluX2xvY2tfYmgoJmhkZF9pcGEtPnJtX2xvY2spOworCQloZGRfaXBhLT5ybV9zdGF0ZSA9IEhERF9JUEFfUk1fR1JBTlRFRDsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZoZGRfaXBhLT5ybV9sb2NrKTsKKwkJaGRkX2lwYS0+c3RhdHMubnVtX3JtX2dyYW50Kys7CisJCWJyZWFrOworCisJY2FzZSBJUEFfUk1fUkVTT1VSQ0VfUkVMRUFTRUQ6CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiUk0gUmVsZWFzZSIpOworCQloZGRfaXBhLT5yZXNvdXJjZV91bmxvYWRpbmcgPSBmYWxzZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICJVbmtub3duIFJNIEV2dDogJWQiLCBldmVudCk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBoZGRfaXBhX3JtX2NvbnNfcmVsZWFzZSgpIC0gV0xBTiBjb25zdW1lciByZXNvdXJjZSByZWxlYXNlIGhhbmRsZXIKKyAqCisgKiBDYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggSVBBIHRoYXQgaXMgY2FsbGVkIHdoZW4gSVBBIHdhbnRzCisgKiB0byByZWxlYXNlIHRoZSBXTEFOIGNvbnN1bWVyIHJlc291cmNlCisgKgorICogUmV0dXJuOiAwIGlmIHRoZSByZXF1ZXN0IGlzIGdyYW50ZWQsIG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGhkZF9pcGFfcm1fY29uc19yZWxlYXNlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX2lwYV9ybV9jb25zX3JlcXVlc3QoKSAtIFdMQU4gY29uc3VtZXIgcmVzb3VyY2UgcmVxdWVzdCBoYW5kbGVyCisgKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIElQQSB0aGF0IGlzIGNhbGxlZCB3aGVuIElQQSB3YW50cworICogdG8gYWNjZXNzIHRoZSBXTEFOIGNvbnN1bWVyIHJlc291cmNlCisgKgorICogUmV0dXJuOiAwIGlmIHRoZSByZXF1ZXN0IGlzIGdyYW50ZWQsIG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGhkZF9pcGFfcm1fY29uc19yZXF1ZXN0KHZvaWQpCit7CisJaWYgKChnaGRkX2lwYS0+cmVzb3VyY2VfbG9hZGluZykgfHwgKGdoZGRfaXBhLT5yZXNvdXJjZV91bmxvYWRpbmcpKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICAiJXM6IGlwYSByZXNvdXJjZSBsb2FkaW5nL3VubG9hZGluZyBpbiBwcm9ncmVzcyIsCisJCQkgICAgX19mdW5jX18pOworCQlnaGRkX2lwYS0+cGVuZGluZ19jb25zX3JlcSA9IHRydWU7CisJCXJldHVybiAtRVBFUk07CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9pcGFfc2V0X3BlcmZfbGV2ZWwoKSAtIFNldCBJUEEgcGVyZm9ybWFuY2UgbGV2ZWwKKyAqIEBoZGRfY3R4OiBHbG9iYWwgSEREIGNvbnRleHQKKyAqIEB0eF9wYWNrZXRzOiBOdW1iZXIgb2YgcGFja2V0cyB0cmFuc21pdHRlZCBpbiB0aGUgbGFzdCBzYW1wbGUgcGVyaW9kCisgKiBAcnhfcGFja2V0czogTnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgaW4gdGhlIGxhc3Qgc2FtcGxlIHBlcmlvZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvcgorICovCitpbnQgaGRkX2lwYV9zZXRfcGVyZl9sZXZlbChoZGRfY29udGV4dF90ICpoZGRfY3R4LCB1aW50NjRfdCB0eF9wYWNrZXRzLAorCQkJICAgdWludDY0X3QgcnhfcGFja2V0cykKK3sKKwl1aW50MzJfdCBuZXh0X2NvbnNfYncsIG5leHRfcHJvZF9idzsKKwlzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhID0gaGRkX2N0eC0+aGRkX2lwYTsKKwlzdHJ1Y3QgaXBhX3JtX3BlcmZfcHJvZmlsZSBwcm9maWxlOworCWludCByZXQ7CisKKwlpZiAoKCFoZGRfaXBhX2lzX2VuYWJsZWQoaGRkX2N0eCkpIHx8CisJCSghaGRkX2lwYV9pc19jbGtfc2NhbGluZ19lbmFibGVkKGhkZF9jdHgpKSkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoJnByb2ZpbGUsIDAsIHNpemVvZihwcm9maWxlKSk7CisKKwlpZiAodHhfcGFja2V0cyA+IChoZGRfY3R4LT5jb25maWctPmJ1c0JhbmR3aWR0aEhpZ2hUaHJlc2hvbGQgLyAyKSkKKwkJbmV4dF9jb25zX2J3ID0gaGRkX2N0eC0+Y29uZmlnLT5JcGFIaWdoQmFuZHdpZHRoTWJwczsKKwllbHNlIGlmICh0eF9wYWNrZXRzID4KKwkJIChoZGRfY3R4LT5jb25maWctPmJ1c0JhbmR3aWR0aE1lZGl1bVRocmVzaG9sZCAvIDIpKQorCQluZXh0X2NvbnNfYncgPSBoZGRfY3R4LT5jb25maWctPklwYU1lZGl1bUJhbmR3aWR0aE1icHM7CisJZWxzZQorCQluZXh0X2NvbnNfYncgPSBoZGRfY3R4LT5jb25maWctPklwYUxvd0JhbmR3aWR0aE1icHM7CisKKwlpZiAocnhfcGFja2V0cyA+IChoZGRfY3R4LT5jb25maWctPmJ1c0JhbmR3aWR0aEhpZ2hUaHJlc2hvbGQgLyAyKSkKKwkJbmV4dF9wcm9kX2J3ID0gaGRkX2N0eC0+Y29uZmlnLT5JcGFIaWdoQmFuZHdpZHRoTWJwczsKKwllbHNlIGlmIChyeF9wYWNrZXRzID4KKwkJIChoZGRfY3R4LT5jb25maWctPmJ1c0JhbmR3aWR0aE1lZGl1bVRocmVzaG9sZCAvIDIpKQorCQluZXh0X3Byb2RfYncgPSBoZGRfY3R4LT5jb25maWctPklwYU1lZGl1bUJhbmR3aWR0aE1icHM7CisJZWxzZQorCQluZXh0X3Byb2RfYncgPSBoZGRfY3R4LT5jb25maWctPklwYUxvd0JhbmR3aWR0aE1icHM7CisKKwlIRERfSVBBX0xPRyhMT0cxLAorCQkiQ09OUyBwZXJmIGN1cnI6ICVkLCBuZXh0OiAlZCIsCisJCWhkZF9pcGEtPmN1cnJfY29uc19idywgbmV4dF9jb25zX2J3KTsKKwlIRERfSVBBX0xPRyhMT0cxLAorCQkiUFJPRCBwZXJmIGN1cnI6ICVkLCBuZXh0OiAlZCIsCisJCWhkZF9pcGEtPmN1cnJfcHJvZF9idywgbmV4dF9wcm9kX2J3KTsKKworCWlmIChoZGRfaXBhLT5jdXJyX2NvbnNfYncgIT0gbmV4dF9jb25zX2J3KSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAgICJSZXF1ZXN0aW5nIENPTlMgcGVyZiBjdXJyOiAlZCwgbmV4dDogJWQiLAorCQkJICAgIGhkZF9pcGEtPmN1cnJfY29uc19idywgbmV4dF9jb25zX2J3KTsKKwkJcHJvZmlsZS5tYXhfc3VwcG9ydGVkX2JhbmR3aWR0aF9tYnBzID0gbmV4dF9jb25zX2J3OworCQlyZXQgPSBpcGFfcm1fc2V0X3BlcmZfcHJvZmlsZShJUEFfUk1fUkVTT1VSQ0VfV0xBTl9DT05TLAorCQkJCQkgICAgICAmcHJvZmlsZSk7CisJCWlmIChyZXQpIHsKKwkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICAgIlJNIENPTlMgc2V0IHBlcmYgcHJvZmlsZSBmYWlsZWQ6ICVkIiwgcmV0KTsKKworCQkJcmV0dXJuIHJldDsKKwkJfQorCQloZGRfaXBhLT5jdXJyX2NvbnNfYncgPSBuZXh0X2NvbnNfYnc7CisJCWhkZF9pcGEtPnN0YXRzLm51bV9jb25zX3BlcmZfcmVxKys7CisJfQorCisJaWYgKGhkZF9pcGEtPmN1cnJfcHJvZF9idyAhPSBuZXh0X3Byb2RfYncpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICAgIlJlcXVlc3RpbmcgUFJPRCBwZXJmIGN1cnI6ICVkLCBuZXh0OiAlZCIsCisJCQkgICAgaGRkX2lwYS0+Y3Vycl9wcm9kX2J3LCBuZXh0X3Byb2RfYncpOworCQlwcm9maWxlLm1heF9zdXBwb3J0ZWRfYmFuZHdpZHRoX21icHMgPSBuZXh0X3Byb2RfYnc7CisJCXJldCA9IGlwYV9ybV9zZXRfcGVyZl9wcm9maWxlKElQQV9STV9SRVNPVVJDRV9XTEFOX1BST0QsCisJCQkJCSAgICAgICZwcm9maWxlKTsKKwkJaWYgKHJldCkgeworCQkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgICAiUk0gUFJPRCBzZXQgcGVyZiBwcm9maWxlIGZhaWxlZDogJWQiLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQloZGRfaXBhLT5jdXJyX3Byb2RfYncgPSBuZXh0X3Byb2RfYnc7CisJCWhkZF9pcGEtPnN0YXRzLm51bV9wcm9kX3BlcmZfcmVxKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX2lwYV9zZXR1cF9ybSgpIC0gU2V0dXAgSVBBIHJlc291cmNlIG1hbmFnZW1lbnQKKyAqIEBoZGRfaXBhOiBHbG9iYWwgSEREIElQQSBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgaGRkX2lwYV9zZXR1cF9ybShzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhKQoreworCXN0cnVjdCBpcGFfcm1fY3JlYXRlX3BhcmFtcyBjcmVhdGVfcGFyYW1zID0geyAwIH07CisJaW50IHJldDsKKworCWlmICghaGRkX2lwYV9pc19ybV9lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpKQorCQlyZXR1cm4gMDsKKworCWNuc3NfaW5pdF93b3JrKCZoZGRfaXBhLT51Y19ybV93b3JrLndvcmssIGhkZF9pcGFfdWNfcm1fbm90aWZ5X2RlZmVyKTsKKwltZW1zZXQoJmNyZWF0ZV9wYXJhbXMsIDAsIHNpemVvZihjcmVhdGVfcGFyYW1zKSk7CisJY3JlYXRlX3BhcmFtcy5uYW1lID0gSVBBX1JNX1JFU09VUkNFX1dMQU5fUFJPRDsKKwljcmVhdGVfcGFyYW1zLnJlZ19wYXJhbXMudXNlcl9kYXRhID0gaGRkX2lwYTsKKwljcmVhdGVfcGFyYW1zLnJlZ19wYXJhbXMubm90aWZ5X2NiID0gaGRkX2lwYV9ybV9ub3RpZnk7CisJY3JlYXRlX3BhcmFtcy5mbG9vcl92b2x0YWdlID0gSVBBX1ZPTFRBR0VfU1ZTOworCisJcmV0ID0gaXBhX3JtX2NyZWF0ZV9yZXNvdXJjZSgmY3JlYXRlX3BhcmFtcyk7CisJaWYgKHJldCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIkNyZWF0ZSBSTSByZXNvdXJjZSBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBzZXR1cF9ybV9mYWlsOworCX0KKworCW1lbXNldCgmY3JlYXRlX3BhcmFtcywgMCwgc2l6ZW9mKGNyZWF0ZV9wYXJhbXMpKTsKKwljcmVhdGVfcGFyYW1zLm5hbWUgPSBJUEFfUk1fUkVTT1VSQ0VfV0xBTl9DT05TOworCWNyZWF0ZV9wYXJhbXMucmVxdWVzdF9yZXNvdXJjZSA9IGhkZF9pcGFfcm1fY29uc19yZXF1ZXN0OworCWNyZWF0ZV9wYXJhbXMucmVsZWFzZV9yZXNvdXJjZSA9IGhkZF9pcGFfcm1fY29uc19yZWxlYXNlOworCWNyZWF0ZV9wYXJhbXMuZmxvb3Jfdm9sdGFnZSA9IElQQV9WT0xUQUdFX1NWUzsKKworCXJldCA9IGlwYV9ybV9jcmVhdGVfcmVzb3VyY2UoJmNyZWF0ZV9wYXJhbXMpOworCWlmIChyZXQpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICJDcmVhdGUgUk0gQ09OUyByZXNvdXJjZSBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBkZWxldGVfcHJvZDsKKwl9CisKKwlpcGFfcm1fYWRkX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1dMQU5fUFJPRCwKKwkJCSAgICAgIElQQV9STV9SRVNPVVJDRV9BUFBTX0NPTlMpOworCisJcmV0ID0gaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfaW5pdChJUEFfUk1fUkVTT1VSQ0VfV0xBTl9QUk9ELAorCQkJCQkgICBIRERfSVBBX1JYX0lOQUNUSVZJVFlfTVNFQ19ERUxBWSk7CisJaWYgKHJldCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICJUaW1lciBpbml0IGZhaWxlZDogJWQiLAorCQkJICAgIHJldCk7CisJCWdvdG8gdGltZXJfaW5pdF9mYWlsZWQ7CisJfQorCisJLyogU2V0IHRoZSBsb3dlc3QgYmFuZHdpZHRoIHRvIHN0YXJ0IHdpdGggKi8KKwlyZXQgPSBoZGRfaXBhX3NldF9wZXJmX2xldmVsKGhkZF9pcGEtPmhkZF9jdHgsIDAsIDApOworCisJaWYgKHJldCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIlNldCBwZXJmIGxldmVsIGZhaWxlZDogJWQiLCByZXQpOworCQlnb3RvIHNldF9wZXJmX2ZhaWxlZDsKKwl9CisKKwljZGZfd2FrZV9sb2NrX2luaXQoJmhkZF9pcGEtPndha2VfbG9jaywgIndsYW5faXBhIik7CisjaWZkZWYgQ09ORklHX0NOU1MKKwljbnNzX2luaXRfZGVsYXllZF93b3JrKCZoZGRfaXBhLT53YWtlX2xvY2tfd29yaywKKwkJCSAgICAgICBoZGRfaXBhX3dha2VfbG9ja190aW1lcl9mdW5jKTsKKyNlbHNlCisJSU5JVF9ERUxBWUVEX1dPUksoJmhkZF9pcGEtPndha2VfbG9ja193b3JrLAorCQkJICBoZGRfaXBhX3dha2VfbG9ja190aW1lcl9mdW5jKTsKKyNlbmRpZgorCWNkZl9zcGlubG9ja19pbml0KCZoZGRfaXBhLT5ybV9sb2NrKTsKKwloZGRfaXBhLT5ybV9zdGF0ZSA9IEhERF9JUEFfUk1fUkVMRUFTRUQ7CisJaGRkX2lwYS0+d2FrZV9sb2NrX3JlbGVhc2VkID0gdHJ1ZTsKKwlhdG9taWNfc2V0KCZoZGRfaXBhLT50eF9yZWZfY250LCAwKTsKKworCXJldHVybiByZXQ7CisKK3NldF9wZXJmX2ZhaWxlZDoKKwlpcGFfcm1faW5hY3Rpdml0eV90aW1lcl9kZXN0cm95KElQQV9STV9SRVNPVVJDRV9XTEFOX1BST0QpOworCit0aW1lcl9pbml0X2ZhaWxlZDoKKwlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9XTEFOX0NPTlMpOworCitkZWxldGVfcHJvZDoKKwlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9XTEFOX1BST0QpOworCitzZXR1cF9ybV9mYWlsOgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGRkX2lwYV9kZXN0cm95X3JtX3Jlc291cmNlKCkgLSBEZXN0cm95IElQQSByZXNvdXJjZXMKKyAqIEBoZGRfaXBhOiBHbG9iYWwgSEREIElQQSBjb250ZXh0CisgKgorICogRGVzdHJveXMgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIElQQSByZXNvdXJjZSBtYW5hZ2VyCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pcGFfZGVzdHJveV9ybV9yZXNvdXJjZShzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhKQoreworCWludCByZXQ7CisKKwlpZiAoIWhkZF9pcGFfaXNfcm1fZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkKKwkJcmV0dXJuOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZoZGRfaXBhLT53YWtlX2xvY2tfd29yayk7CisJY2RmX3dha2VfbG9ja19kZXN0cm95KCZoZGRfaXBhLT53YWtlX2xvY2spOworCisjaWZkZWYgV0xBTl9PUEVOX1NPVVJDRQorCWNhbmNlbF93b3JrX3N5bmMoJmhkZF9pcGEtPnVjX3JtX3dvcmsud29yayk7CisjZW5kaWYKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmaGRkX2lwYS0+cm1fbG9jayk7CisKKwlpcGFfcm1faW5hY3Rpdml0eV90aW1lcl9kZXN0cm95KElQQV9STV9SRVNPVVJDRV9XTEFOX1BST0QpOworCisJcmV0ID0gaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZShJUEFfUk1fUkVTT1VSQ0VfV0xBTl9QUk9EKTsKKwlpZiAocmV0KQorCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIlJNIFBST0QgcmVzb3VyY2UgZGVsZXRlIGZhaWxlZCAlZCIsIHJldCk7CisKKwlyZXQgPSBpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9XTEFOX0NPTlMpOworCWlmIChyZXQpCisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAiUk0gQ09OUyByZXNvdXJjZSBkZWxldGUgZmFpbGVkICVkIiwgcmV0KTsKK30KKworLyoqCisgKiBoZGRfaXBhX3NlbmRfc2tiX3RvX25ldHdvcmsoKSAtIFNlbmQgc2tiIHRvIGtlcm5lbAorICogQHNrYjogbmV0d29yayBidWZmZXIKKyAqIEBhZGFwdGVyOiBuZXR3b3JrIGFkYXB0ZXIKKyAqCisgKiBDYWxsZWQgd2hlbiBhIG5ldHdvcmsgYnVmZmVyIGlzIHJlY2VpdmVkIHdoaWNoIHNob3VsZCBub3QgYmUgcm91dGVkCisgKiB0byB0aGUgSVBBIG1vZHVsZS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2lwYV9zZW5kX3NrYl90b19uZXR3b3JrKGNkZl9uYnVmX3Qgc2tiLAorCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSA9IGdoZGRfaXBhOworCXVuc2lnbmVkIGludCBjcHVfaW5kZXg7CisKKwlpZiAoIWFkYXB0ZXIgfHwgYWRhcHRlci0+bWFnaWMgIT0gV0xBTl9IRERfQURBUFRFUl9NQUdJQykgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csICJJbnZhbGlkIGFkYXB0ZXI6IDB4JXAiLAorCQkJICAgIGFkYXB0ZXIpOworCQlIRERfSVBBX0lOQ1JFQVNFX0lOVEVSTkFMX0RST1BfQ09VTlQoaGRkX2lwYSk7CisJCWNkZl9uYnVmX2ZyZWUoc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChoZGRfaXBhLT5oZGRfY3R4LT5pc1VubG9hZEluUHJvZ3Jlc3MpIHsKKwkJSEREX0lQQV9JTkNSRUFTRV9JTlRFUk5BTF9EUk9QX0NPVU5UKGhkZF9pcGEpOworCQljZGZfbmJ1Zl9mcmVlKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlza2ItPmRlc3RydWN0b3IgPSBoZGRfaXBhX3VjX3J0X2RlYnVnX2Rlc3RydWN0b3I7CisJc2tiLT5kZXYgPSBhZGFwdGVyLT5kZXY7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCWNwdV9pbmRleCA9IHdsYW5faGRkX2dldF9jcHUoKTsKKworCSsrYWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy5yeFBhY2tldHNbY3B1X2luZGV4XTsKKwlpZiAobmV0aWZfcnhfbmkoc2tiKSA9PSBORVRfUlhfU1VDQ0VTUykKKwkJKythZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnJ4RGVsaXZlcmVkW2NwdV9pbmRleF07CisJZWxzZQorCQkrK2FkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMucnhSZWZ1c2VkW2NwdV9pbmRleF07CisKKwlIRERfSVBBX0lOQ1JFQVNFX05FVF9TRU5EX0NPVU5UKGhkZF9pcGEpOworCWFkYXB0ZXItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKKyNkZWZpbmUgRldfUlhfREVTQ19ESVNDQVJEX00gMHgxCisjZGVmaW5lIEZXX1JYX0RFU0NfRk9SV0FSRF9NIDB4MgorCisvKioKKyAqIGhkZF9pcGFfdzJpX2NiKCkgLSBXTEFOIHRvIElQQSBjYWxsYmFjayBoYW5kbGVyCisgKiBAcHJpdjogcG9pbnRlciB0byBwcml2YXRlIGRhdGEgcmVnaXN0ZXJlZCB3aXRoIElQQSAod2UgcmVnaXN0ZXIgYQorICoJcG9pbnRlciB0byB0aGUgZ2xvYmFsIElQQSBjb250ZXh0KQorICogQGV2dDogdGhlIElQQSBldmVudCB3aGljaCB0cmlnZ2VyZWQgdGhlIGNhbGxiYWNrCisgKiBAZGF0YTogZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pcGFfdzJpX2NiKHZvaWQgKnByaXYsIGVudW0gaXBhX2RwX2V2dF90eXBlIGV2dCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhID0gTlVMTDsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gTlVMTDsKKwljZGZfbmJ1Zl90IHNrYjsKKwl1aW50OF90IGlmYWNlX2lkOworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsKKwlzdHJ1Y3QgaGRkX2lwYV9pZmFjZV9jb250ZXh0ICppZmFjZV9jb250ZXh0OworCWNkZl9uYnVmX3QgY29weTsKKwl1aW50OF90IGZ3X2Rlc2M7CisJaW50IHJldDsKKworCWhkZF9pcGEgPSAoc3RydWN0IGhkZF9pcGFfcHJpdiAqKXByaXY7CisKKwlzd2l0Y2ggKGV2dCkgeworCWNhc2UgSVBBX1JFQ0VJVkU6CisJCXNrYiA9IChjZGZfbmJ1Zl90KSBkYXRhOworCQlpZiAoaGRkX2lwYV91Y19pc19lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpKSB7CisJCQlzZXNzaW9uX2lkID0gKHVpbnQ4X3Qpc2tiLT5jYlswXTsKKwkJCWlmYWNlX2lkID0gdmRldl90b19pZmFjZVtzZXNzaW9uX2lkXTsKKwkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJIklQQV9SRUNFSVZFOiBzZXNzaW9uX2lkPSV1LCBpZmFjZV9pZD0ldSIsCisJCQkJc2Vzc2lvbl9pZCwgaWZhY2VfaWQpOworCQl9IGVsc2UgeworCQkJaWZhY2VfaWQgPSBIRERfSVBBX0dFVF9JRkFDRV9JRChza2ItPmRhdGEpOworCQl9CisKKwkJaWYgKGlmYWNlX2lkID49IEhERF9JUEFfTUFYX0lGQUNFKSB7CisJCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAgICJJUEFfUkVDRUlWRTogSW52YWxpZCBpZmFjZV9pZDogJXUiLAorCQkJCSAgICBpZmFjZV9pZCk7CisJCQlIRERfSVBBX0RCR19EVU1QKENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJIncyaSAtLSBza2IiLCBza2ItPmRhdGEsIDgpOworCQkJSEREX0lQQV9JTkNSRUFTRV9JTlRFUk5BTF9EUk9QX0NPVU5UKGhkZF9pcGEpOworCQkJY2RmX25idWZfZnJlZShza2IpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWZhY2VfY29udGV4dCA9ICZoZGRfaXBhLT5pZmFjZV9jb250ZXh0W2lmYWNlX2lkXTsKKwkJYWRhcHRlciA9IGlmYWNlX2NvbnRleHQtPmFkYXB0ZXI7CisKKwkJSEREX0lQQV9EQkdfRFVNUChDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJIncyaSAtLSBza2IiLCBza2ItPmRhdGEsIDgpOworCQlpZiAoaGRkX2lwYV91Y19pc19lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpKSB7CisJCQloZGRfaXBhLT5zdGF0cy5udW1fcnhfZXhjZXArKzsKKwkJCXNrYl9wdWxsKHNrYiwgSEREX0lQQV9VQ19XTEFOX0NMRF9IRFJfTEVOKTsKKwkJfSBlbHNlIHsKKwkJCXNrYl9wdWxsKHNrYiwgSEREX0lQQV9XTEFOX0NMRF9IRFJfTEVOKTsKKwkJfQorCisJCWlmYWNlX2NvbnRleHQtPnN0YXRzLm51bV9yeF9pcGFfZXhjZXArKzsKKworCQkvKiBEaXNhYmxlIHRvIGZvcndhcmQgSW50cmEtQlNTIFJ4IHBhY2tldHMgd2hlbgorCQkgKiBhcF9pc29sYXRlPTEgaW4gaG9zdGFwZC5jb25mCisJCSAqLworCQlpZiAoYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5hcERpc2FibGVJbnRyYUJzc0Z3ZCkgeworCQkJLyoKKwkJCSAqIFdoZW4gSU5UUkFfQlNTX0ZXRF9PRkZMT0FEIGlzIGVuYWJsZWQsIEZXIHdpbGwgc2VuZAorCQkJICogYWxsIFJ4IHBhY2tldHMgdG8gSVBBIHVDLCB3aGljaCBuZWVkIHRvIGJlIGZvcndhcmRlZAorCQkJICogdG8gb3RoZXIgaW50ZXJmYWNlLgorCQkJICogQW5kLCBJUEEgZHJpdmVyIHdpbGwgc2VuZCBiYWNrIHRvIFdMQU4gaG9zdCBkcml2ZXIKKwkJCSAqIHRocm91Z2ggZXhjZXB0aW9uIHBpcGUgd2l0aCBmd19kZXNjIGZpZWxkIHNldCBieSBGVy4KKwkJCSAqIEhlcmUgd2UgYXJlIGNoZWNraW5nIGZ3X2Rlc2MgZmllbGQgZm9yIEZPUldBUkQgYml0CisJCQkgKiBzZXQsIGFuZCBmb3J3YXJkIHRvIFR4LiBUaGVuIGNvcHkgdG8ga2VybmVsIHN0YWNrCisJCQkgKiBvbmx5IHdoZW4gRElTQ0FSRCBiaXQgaXMgbm90IHNldC4KKwkJCSAqLworCQkJZndfZGVzYyA9ICh1aW50OF90KXNrYi0+Y2JbMV07CisKKwkJCWlmIChmd19kZXNjICYgRldfUlhfREVTQ19ESVNDQVJEX00pIHsKKwkJCQlIRERfSVBBX0lOQ1JFQVNFX0lOVEVSTkFMX0RST1BfQ09VTlQoaGRkX2lwYSk7CisJCQkJaGRkX2lwYS0+aXBhX3J4X2Rpc2NhcmQrKzsKKwkJCQljZGZfbmJ1Zl9mcmVlKHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChmd19kZXNjICYgRldfUlhfREVTQ19GT1JXQVJEX00pIHsKKwkJCQlIRERfSVBBX0xPRygKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCQkiRm9yd2FyZCBwYWNrZXQgdG8gVHggKGZ3X2Rlc2M9JWQpIiwKKwkJCQkJZndfZGVzYyk7CisJCQkJY29weSA9IGNkZl9uYnVmX2NvcHkoc2tiKTsKKwkJCQlpZiAoY29weSkgeworCQkJCQloZGRfaXBhLT5pcGFfdHhfZm9yd2FyZCsrOworCQkJCQlyZXQgPSBoZGRfc29mdGFwX2hhcmRfc3RhcnRfeG1pdCgKKwkJCQkJCShzdHJ1Y3Qgc2tfYnVmZiAqKWNvcHksCisJCQkJCQlhZGFwdGVyLT5kZXYpOworCQkJCQlpZiAocmV0KSB7CisJCQkJCQlIRERfSVBBX0xPRygKKwkJCQkJCQlDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJCQkJIkZvcndhcmQgcGFja2V0IHR4IGZhaWwiKTsKKwkJCQkJCWhkZF9pcGEtPnN0YXRzLgorCQkJCQkJCW51bV90eF9iY21jX2VycisrOworCQkJCQl9IGVsc2UgeworCQkJCQkJaGRkX2lwYS0+c3RhdHMubnVtX3R4X2JjbWMrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJIkludHJhLUJTUyBGV0QgaXMgZGlzYWJsZWQtc2tpcCBmb3J3YXJkIHRvIFR4Iik7CisJCX0KKworCQloZGRfaXBhX3NlbmRfc2tiX3RvX25ldHdvcmsoc2tiLCBhZGFwdGVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIncyaSBjYiB3cm9uZyBldmVudDogMHgleCIsIGV2dCk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogaGRkX2lwYV9uYnVmX2NiKCkgLSBJUEEgVFggY29tcGxldGUgY2FsbGJhY2sKKyAqIEBza2I6IHBhY2tldCBidWZmZXIgd2hpY2ggd2FzIHRyYW5zbWl0dGVkCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9pcGFfbmJ1Zl9jYihjZGZfbmJ1Zl90IHNrYikKK3sKKwlzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhID0gZ2hkZF9pcGE7CisKKwlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfREVCVUcsICIlbHgiLCBOQlVGX09XTkVSX1BSSVZfREFUQShza2IpKTsKKwlpcGFfZnJlZV9za2IoKHN0cnVjdCBpcGFfcnhfZGF0YSAqKU5CVUZfT1dORVJfUFJJVl9EQVRBKHNrYikpOworCisJaGRkX2lwYS0+c3RhdHMubnVtX3R4X2NvbXBfY250Kys7CisKKwlhdG9taWNfZGVjKCZoZGRfaXBhLT50eF9yZWZfY250KTsKKworCWhkZF9pcGFfcm1fdHJ5X3JlbGVhc2UoaGRkX2lwYSk7Cit9CisKKy8qKgorICogaGRkX2lwYV9zZW5kX3BrdF90b190bCgpIC0gU2VuZCBhbiBJUEEgcGFja2V0IHRvIFRMCisgKiBAaWZhY2VfY29udGV4dDogaW50ZXJmYWNlLXNwZWNpZmljIElQQSBjb250ZXh0CisgKiBAaXBhX3R4X2Rlc2M6IHBhY2tldCBkYXRhIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2lwYV9zZW5kX3BrdF90b190bCgKKwkJc3RydWN0IGhkZF9pcGFfaWZhY2VfY29udGV4dCAqaWZhY2VfY29udGV4dCwKKwkJc3RydWN0IGlwYV9yeF9kYXRhICppcGFfdHhfZGVzYykKK3sKKwlzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhID0gaWZhY2VfY29udGV4dC0+aGRkX2lwYTsKKwl1aW50OF90IGludGVyZmFjZV9pZDsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gTlVMTDsKKwljZGZfbmJ1Zl90IHNrYjsKKworCWNkZl9zcGluX2xvY2tfYmgoJmlmYWNlX2NvbnRleHQtPmludGVyZmFjZV9sb2NrKTsKKwlhZGFwdGVyID0gaWZhY2VfY29udGV4dC0+YWRhcHRlcjsKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sICJJbnRlcmZhY2UgRG93biIpOworCQlpcGFfZnJlZV9za2IoaXBhX3R4X2Rlc2MpOworCQlpZmFjZV9jb250ZXh0LT5zdGF0cy5udW1fdHhfZHJvcCsrOworCQljZGZfc3Bpbl91bmxvY2tfYmgoJmlmYWNlX2NvbnRleHQtPmludGVyZmFjZV9sb2NrKTsKKwkJaGRkX2lwYV9ybV90cnlfcmVsZWFzZShoZGRfaXBhKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogRHVyaW5nIENBQyBwZXJpb2QsIGRhdGEgcGFja2V0cyBzaG91bGRuJ3QgYmUgc2VudCBvdmVyIHRoZSBhaXIgc28KKwkgKiBkcm9wIGFsbCB0aGUgcGFja2V0cyBoZXJlCisJICovCisJaWYgKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKGFkYXB0ZXIpLT5kZnNfY2FjX2Jsb2NrX3R4KSB7CisJCWlwYV9mcmVlX3NrYihpcGFfdHhfZGVzYyk7CisJCWNkZl9zcGluX3VubG9ja19iaCgmaWZhY2VfY29udGV4dC0+aW50ZXJmYWNlX2xvY2spOworCQlpZmFjZV9jb250ZXh0LT5zdGF0cy5udW1fdHhfY2FjX2Ryb3ArKzsKKwkJaGRkX2lwYV9ybV90cnlfcmVsZWFzZShoZGRfaXBhKTsKKwkJcmV0dXJuOworCX0KKworCWludGVyZmFjZV9pZCA9IGFkYXB0ZXItPnNlc3Npb25JZDsKKwkrK2FkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHM7CisKKwljZGZfc3Bpbl91bmxvY2tfYmgoJmlmYWNlX2NvbnRleHQtPmludGVyZmFjZV9sb2NrKTsKKworCXNrYiA9IGlwYV90eF9kZXNjLT5za2I7CisKKwljZGZfbWVtX3NldChza2ItPmNiLCBzaXplb2Yoc2tiLT5jYiksIDApOworCU5CVUZfT1dORVJfSUQoc2tiKSA9IElQQV9OQlVGX09XTkVSX0lEOworCU5CVUZfQ0FMTEJBQ0tfRk4oc2tiKSA9IGhkZF9pcGFfbmJ1Zl9jYjsKKwlpZiAoaGRkX2lwYV91Y19zdGFfaXNfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkgeworCQlOQlVGX01BUFBFRF9QQUREUl9MTyhza2IpID0gaXBhX3R4X2Rlc2MtPmRtYV9hZGRyCisJCQkrIEhERF9JUEFfV0xBTl9GUkFHX0hFQURFUgorCQkJKyBIRERfSVBBX1dMQU5fSVBBX0hFQURFUjsKKwkJaXBhX3R4X2Rlc2MtPnNrYi0+bGVuIC09CisJCQlIRERfSVBBX1dMQU5fRlJBR19IRUFERVIgKyBIRERfSVBBX1dMQU5fSVBBX0hFQURFUjsKKwl9IGVsc2UKKwkJTkJVRl9NQVBQRURfUEFERFJfTE8oc2tiKSA9IGlwYV90eF9kZXNjLT5kbWFfYWRkcjsKKworCU5CVUZfT1dORVJfUFJJVl9EQVRBKHNrYikgPSAodW5zaWduZWQgbG9uZylpcGFfdHhfZGVzYzsKKworCWFkYXB0ZXItPnN0YXRzLnR4X2J5dGVzICs9IGlwYV90eF9kZXNjLT5za2ItPmxlbjsKKworCXNrYiA9IG9sX3R4X3NlbmRfaXBhX2RhdGFfZnJhbWUoaWZhY2VfY29udGV4dC0+dGxfY29udGV4dCwKKwkJCQkJIGlwYV90eF9kZXNjLT5za2IpOworCWlmIChza2IpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCAiVExTSElNIHR4IGZhaWwiKTsKKwkJaXBhX2ZyZWVfc2tiKGlwYV90eF9kZXNjKTsKKwkJaWZhY2VfY29udGV4dC0+c3RhdHMubnVtX3R4X2VycisrOworCQloZGRfaXBhX3JtX3RyeV9yZWxlYXNlKGhkZF9pcGEpOworCQlyZXR1cm47CisJfQorCisJYXRvbWljX2luYygmaGRkX2lwYS0+dHhfcmVmX2NudCk7CisKKwlpZmFjZV9jb250ZXh0LT5zdGF0cy5udW1fdHgrKzsKKworfQorCisvKioKKyAqIGhkZF9pcGFfcG1fc2VuZF9wa3RfdG9fdGwoKSAtIFNlbmQgcXVldWVkIHBhY2tldHMgdG8gVEwKKyAqIEB3b3JrOiBwb2ludGVyIHRvIHRoZSBzY2hlZHVsZWQgd29yaworICoKKyAqIENhbGxlZCBkdXJpbmcgUE0gcmVzdW1lIHRvIHNlbmQgcGFja2V0cyB0byBUTCB3aGljaCB3ZXJlIHF1ZXVlZAorICogd2hpbGUgaG9zdCB3YXMgaW4gdGhlIHByb2Nlc3Mgb2Ygc3VzcGVuZGluZy4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2lwYV9wbV9zZW5kX3BrdF90b190bChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkJICAgIHN0cnVjdCBoZGRfaXBhX3ByaXYsCisJCQkJCQkgICAgcG1fd29yayk7CisJc3RydWN0IGhkZF9pcGFfcG1fdHhfY2IgKnBtX3R4X2NiID0gTlVMTDsKKwljZGZfbmJ1Zl90IHNrYjsKKwl1aW50MzJfdCBkZXF1ZXVlZCA9IDA7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZoZGRfaXBhLT5wbV9sb2NrKTsKKworCXdoaWxlICgoKHNrYiA9IGNkZl9uYnVmX3F1ZXVlX3JlbW92ZSgmaGRkX2lwYS0+cG1fcXVldWVfaGVhZCkpICE9IE5VTEwpKSB7CisJCWNkZl9zcGluX3VubG9ja19iaCgmaGRkX2lwYS0+cG1fbG9jayk7CisKKwkJcG1fdHhfY2IgPSAoc3RydWN0IGhkZF9pcGFfcG1fdHhfY2IgKilza2ItPmNiOworCisJCWRlcXVldWVkKys7CisKKwkJaGRkX2lwYV9zZW5kX3BrdF90b190bChwbV90eF9jYi0+aWZhY2VfY29udGV4dCwKKwkJCQkgICAgICAgcG1fdHhfY2ItPmlwYV90eF9kZXNjKTsKKworCQljZGZfc3Bpbl9sb2NrX2JoKCZoZGRfaXBhLT5wbV9sb2NrKTsKKwl9CisKKwljZGZfc3Bpbl91bmxvY2tfYmgoJmhkZF9pcGEtPnBtX2xvY2spOworCisJaGRkX2lwYS0+c3RhdHMubnVtX3R4X2RlcXVldWVkICs9IGRlcXVldWVkOworCWlmIChkZXF1ZXVlZCA+IGhkZF9pcGEtPnN0YXRzLm51bV9tYXhfcG1fcXVldWUpCisJCWhkZF9pcGEtPnN0YXRzLm51bV9tYXhfcG1fcXVldWUgPSBkZXF1ZXVlZDsKK30KKworLyoqCisgKiBoZGRfaXBhX2kyd19jYigpIC0gSVBBIHRvIFdMQU4gY2FsbGJhY2sKKyAqIEBwcml2OiBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSByZWdpc3RlcmVkIHdpdGggSVBBICh3ZSByZWdpc3RlciBhCisgKglwb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Utc3BlY2lmaWMgSVBBIGNvbnRleHQpCisgKiBAZXZ0OiB0aGUgSVBBIGV2ZW50IHdoaWNoIHRyaWdnZXJlZCB0aGUgY2FsbGJhY2sKKyAqIEBkYXRhOiBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2lwYV9pMndfY2Iodm9pZCAqcHJpdiwgZW51bSBpcGFfZHBfZXZ0X3R5cGUgZXZ0LAorCQkJICAgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEgPSBOVUxMOworCXN0cnVjdCBpcGFfcnhfZGF0YSAqaXBhX3R4X2Rlc2M7CisJc3RydWN0IGhkZF9pcGFfaWZhY2VfY29udGV4dCAqaWZhY2VfY29udGV4dDsKKwljZGZfbmJ1Zl90IHNrYjsKKwlzdHJ1Y3QgaGRkX2lwYV9wbV90eF9jYiAqcG1fdHhfY2IgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKGV2dCAhPSBJUEFfUkVDRUlWRSkgeworCQlza2IgPSAoY2RmX25idWZfdCkgZGF0YTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJaWZhY2VfY29udGV4dC0+c3RhdHMubnVtX3R4X2Ryb3ArKzsKKwkJcmV0dXJuOworCX0KKworCWlmYWNlX2NvbnRleHQgPSAoc3RydWN0IGhkZF9pcGFfaWZhY2VfY29udGV4dCAqKXByaXY7CisJaXBhX3R4X2Rlc2MgPSAoc3RydWN0IGlwYV9yeF9kYXRhICopZGF0YTsKKworCWhkZF9pcGEgPSBpZmFjZV9jb250ZXh0LT5oZGRfaXBhOworCisJLyoKKwkgKiBXaGVuIFNTUiBpcyBnb2luZyBvbiBvciBkcml2ZXIgaXMgdW5sb2FkaW5nLCBqdXN0IGRyb3AgdGhlIHBhY2tldHMuCisJICogRHVyaW5nIFNTUiwgdGhlcmUgaXMgbm8gdXNlIGluIHF1ZXVlaW5nIHRoZSBwYWNrZXRzIGFzIFNUQSBoYXMgdG8KKwkgKiBjb25uZWN0IGJhY2sgYW55IHdheQorCSAqLworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2lwYS0+aGRkX2N0eCk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpOworCQlpcGFfZnJlZV9za2IoaXBhX3R4X2Rlc2MpOworCQlpZmFjZV9jb250ZXh0LT5zdGF0cy5udW1fdHhfZHJvcCsrOworCQlyZXR1cm47CisJfQorCisJc2tiID0gaXBhX3R4X2Rlc2MtPnNrYjsKKworCUhERF9JUEFfREJHX0RVTVAoQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCAiaTJ3Iiwgc2tiLT5kYXRhLCA4KTsKKworCS8qCisJICogSWYgUFJPRCByZXNvdXJjZSBpcyBub3QgcmVxdWVzdGVkIGhlcmUgdGhlbiB0aGVyZSBtYXkgYmUgY2FzZXMgd2hlcmUKKwkgKiBJUEEgaGFyZHdhcmUgbWF5IGJlIGNsb2NrZWQgZG93biBiZWNhdXNlIG9mIG5vdCBoYXZpbmcgcHJvcGVyCisJICogZGVwZW5kZW5jeSBncmFwaCBiZXR3ZWVuIFdMQU4gQ09OUyBhbmQgbW9kZW0gUFJPRCBwaXBlcy4gQWRkaW5nIHRoZQorCSAqIHdvcmthcm91bmQgdG8gcmVxdWVzdCBQUk9EIHJlc291cmNlIHdoaWxlIGRhdGEgaXMgZ29pbmcgb3ZlciBDT05TCisJICogcGlwZSB0byBwcmV2ZW50IHRoZSBJUEEgaGFyZHdhcmUgY2xvY2tkb3duLgorCSAqLworCWhkZF9pcGFfcm1fcmVxdWVzdChoZGRfaXBhKTsKKworCWNkZl9zcGluX2xvY2tfYmgoJmhkZF9pcGEtPnBtX2xvY2spOworCS8qCisJICogSWYgaG9zdCBpcyBzdGlsbCBzdXNwZW5kZWQgdGhlbiBxdWV1ZSB0aGUgcGFja2V0cyBhbmQgdGhlc2Ugd2lsbCBiZQorCSAqIGRyYWluZWQgbGF0ZXIgd2hlbiByZXN1bWUgY29tcGxldGVzLiBXaGVuIHBhY2tldCBpcyBhcnJpdmVkIGhlcmUgYW5kCisJICogaG9zdCBpcyBzdXNwZW5kZWQsIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBpcyBhbHJlYWR5IHJlc3VtZSBpcyBpbgorCSAqIHByb2dyZXNzLgorCSAqLworCWlmIChoZGRfaXBhLT5zdXNwZW5kZWQpIHsKKwkJY2RmX21lbV9zZXQoc2tiLT5jYiwgc2l6ZW9mKHNrYi0+Y2IpLCAwKTsKKwkJcG1fdHhfY2IgPSAoc3RydWN0IGhkZF9pcGFfcG1fdHhfY2IgKilza2ItPmNiOworCQlwbV90eF9jYi0+aWZhY2VfY29udGV4dCA9IGlmYWNlX2NvbnRleHQ7CisJCXBtX3R4X2NiLT5pcGFfdHhfZGVzYyA9IGlwYV90eF9kZXNjOworCQljZGZfbmJ1Zl9xdWV1ZV9hZGQoJmhkZF9pcGEtPnBtX3F1ZXVlX2hlYWQsIHNrYik7CisJCWhkZF9pcGEtPnN0YXRzLm51bV90eF9xdWV1ZWQrKzsKKworCQljZGZfc3Bpbl91bmxvY2tfYmgoJmhkZF9pcGEtPnBtX2xvY2spOworCQlyZXR1cm47CisJfQorCisJY2RmX3NwaW5fdW5sb2NrX2JoKCZoZGRfaXBhLT5wbV9sb2NrKTsKKworCS8qCisJICogSWYgd2UgYXJlIGhlcmUgbWVhbnMsIGhvc3QgaXMgbm90IHN1c3BlbmRlZCwgd2FpdCBmb3IgdGhlIHdvcmsgcXVldWUKKwkgKiB0byBmaW5pc2guCisJICovCisjaWZkZWYgV0xBTl9PUEVOX1NPVVJDRQorCWZsdXNoX3dvcmsoJmhkZF9pcGEtPnBtX3dvcmspOworI2VuZGlmCisKKwlyZXR1cm4gaGRkX2lwYV9zZW5kX3BrdF90b190bChpZmFjZV9jb250ZXh0LCBpcGFfdHhfZGVzYyk7Cit9CisKKy8qKgorICogaGRkX2lwYV9zdXNwZW5kKCkgLSBTdXNwZW5kIElQQQorICogQGhkZF9jdHg6IEdsb2JhbCBIREQgY29udGV4dAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZXIgZXJybm8gb24gZXJyb3IKKyAqLworaW50IGhkZF9pcGFfc3VzcGVuZChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEgPSBoZGRfY3R4LT5oZGRfaXBhOworCisJaWYgKCFoZGRfaXBhX2lzX2VuYWJsZWQoaGRkX2N0eCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDaGVjayBpZiBJUEEgaXMgcmVhZHkgZm9yIHN1c3BlbmQsIElmIHdlIGFyZSBoZXJlIG1lYW5zLCB0aGVyZSBpcworCSAqIGhpZ2ggY2hhbmNlIHRoYXQgc3VzcGVuZCB3b3VsZCBnbyB0aHJvdWdoIGJ1dCBqdXN0IHRvIGF2b2lkIGFueSByYWNlCisJICogY29uZGl0aW9uIGFmdGVyIHN1c3BlbmQgc3RhcnRlZCwgdGhlc2UgY2hlY2tzIGFyZSBjb25kdWN0ZWQgYmVmb3JlCisJICogYWxsb3dpbmcgdG8gc3VzcGVuZC4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmhkZF9pcGEtPnR4X3JlZl9jbnQpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWNkZl9zcGluX2xvY2tfYmgoJmhkZF9pcGEtPnJtX2xvY2spOworCisJaWYgKGhkZF9pcGEtPnJtX3N0YXRlICE9IEhERF9JUEFfUk1fUkVMRUFTRUQpIHsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZoZGRfaXBhLT5ybV9sb2NrKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWNkZl9zcGluX3VubG9ja19iaCgmaGRkX2lwYS0+cm1fbG9jayk7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZoZGRfaXBhLT5wbV9sb2NrKTsKKwloZGRfaXBhLT5zdXNwZW5kZWQgPSB0cnVlOworCWNkZl9zcGluX3VubG9ja19iaCgmaGRkX2lwYS0+cG1fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfaXBhX3Jlc3VtZSgpIC0gUmVzdW1lIElQQSBmb2xsb3dpbmcgc3VzcGVuZAorICogaGRkX2N0eDogR2xvYmFsIEhERCBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yCisgKi8KK2ludCBoZGRfaXBhX3Jlc3VtZShoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEgPSBoZGRfY3R4LT5oZGRfaXBhOworCisJaWYgKCFoZGRfaXBhX2lzX2VuYWJsZWQoaGRkX2N0eCkpCisJCXJldHVybiAwOworCisJc2NoZWR1bGVfd29yaygmaGRkX2lwYS0+cG1fd29yayk7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZoZGRfaXBhLT5wbV9sb2NrKTsKKwloZGRfaXBhLT5zdXNwZW5kZWQgPSBmYWxzZTsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJmhkZF9pcGEtPnBtX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX2lwYV9zZXR1cF9zeXNfcGlwZSgpIC0gU2V0dXAgYWxsIElQQSBTeXMgcGlwZXMKKyAqIEBoZGRfaXBhOiBHbG9iYWwgSEREIElQQSBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgaGRkX2lwYV9zZXR1cF9zeXNfcGlwZShzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhKQoreworCWludCBpLCByZXQgPSAwOworCXN0cnVjdCBpcGFfc3lzX2Nvbm5lY3RfcGFyYW1zICppcGE7CisJdWludDMyX3QgZGVzY19maWZvX3N6OworCisJLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGEgQkFNIGF0CisJICogb25jZSBpcyBvbmUgbGVzcyB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgdGhhdCB0aGUgYnVmZmVyCisJICogY2FuIGNvbnRhaW4uCisJICogSWYgbWF4X251bV9vZl9kZXNjcmlwdG9ycyA9IChCQU1fUElQRV9ERVNDUklQVE9SX0ZJRk9fU0laRSAvIHNpemVvZgorCSAqIChTUFNfREVTQ1JJUFRPUikpLCB0aGVuIChtYXhfbnVtX29mX2Rlc2NyaXB0b3JzIC0gMSkgZGVzY3JpcHRvcnMgY2FuCisJICogYmUgcHJvdmlkZWQgYXQgb25jZS4KKwkgKiBCZWNhdXNlIG9mIGFib3ZlIHJlcXVpcmVtZW50LCBvbmUgZXh0cmEgZGVzY3JpcHRvciB3aWxsIGJlIGFkZGVkIHRvCisJICogbWFrZSBzdXJlIGhhcmR3YXJlIGFsd2F5cyBoYXMgb25lIGRlc2NyaXB0b3IuCisJICovCisJZGVzY19maWZvX3N6ID0gaGRkX2lwYS0+aGRkX2N0eC0+Y29uZmlnLT5JcGFEZXNjU2l6ZQorCQkgICAgICAgKyBzaXplb2Yoc3RydWN0IHNwc19pb3ZlYyk7CisKKwkvKnNldHVwIFRYIHBpcGVzICovCisJZm9yIChpID0gMDsgaSA8IEhERF9JUEFfTUFYX0lGQUNFOyBpKyspIHsKKwkJaXBhID0gJmhkZF9pcGEtPnN5c19waXBlW2ldLmlwYV9zeXNfcGFyYW1zOworCisJCWlwYS0+Y2xpZW50ID0gaGRkX2lwYV9hZGFwdGVyXzJfY2xpZW50W2ldLmNvbnNfY2xpZW50OworCQlpcGEtPmRlc2NfZmlmb19zeiA9IGRlc2NfZmlmb19zejsKKwkJaXBhLT5wcml2ID0gJmhkZF9pcGEtPmlmYWNlX2NvbnRleHRbaV07CisJCWlwYS0+bm90aWZ5ID0gaGRkX2lwYV9pMndfY2I7CisKKwkJaWYgKGhkZF9pcGFfdWNfc3RhX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpIHsKKwkJCWlwYS0+aXBhX2VwX2NmZy5oZHIuaGRyX2xlbiA9CisJCQkJSEREX0lQQV9VQ19XTEFOX1RYX0hEUl9MRU47CisJCQlpcGEtPmlwYV9lcF9jZmcubmF0Lm5hdF9lbiA9IElQQV9CWVBBU1NfTkFUOworCQkJaXBhLT5pcGFfZXBfY2ZnLmhkci5oZHJfb2ZzdF9wa3Rfc2l6ZV92YWxpZCA9IDE7CisJCQlpcGEtPmlwYV9lcF9jZmcuaGRyLmhkcl9vZnN0X3BrdF9zaXplID0gMDsKKwkJCWlwYS0+aXBhX2VwX2NmZy5oZHIuaGRyX2FkZGl0aW9uYWxfY29uc3RfbGVuID0KKwkJCQlIRERfSVBBX1VDX1dMQU5fODAyM19IRFJfU0laRTsKKwkJCWlwYS0+aXBhX2VwX2NmZy5oZHJfZXh0Lmhkcl9saXR0bGVfZW5kaWFuID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWlwYS0+aXBhX2VwX2NmZy5oZHIuaGRyX2xlbiA9IEhERF9JUEFfV0xBTl9UWF9IRFJfTEVOOworCQl9CisJCWlwYS0+aXBhX2VwX2NmZy5tb2RlLm1vZGUgPSBJUEFfQkFTSUM7CisKKwkJaWYgKCFoZGRfaXBhX2lzX3JtX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpCisJCQlpcGEtPmtlZXBfaXBhX2F3YWtlID0gMTsKKworCQlyZXQgPSBpcGFfc2V0dXBfc3lzX3BpcGUoaXBhLCAmKGhkZF9pcGEtPnN5c19waXBlW2ldLmNvbm5faGRsKSk7CisJCWlmIChyZXQpIHsKKwkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIkZhaWxlZCBmb3IgcGlwZSAlZCIKKwkJCQkgICAgIiByZXQ6ICVkIiwgaSwgcmV0KTsKKwkJCWdvdG8gc2V0dXBfc3lzX3BpcGVfZmFpbDsKKwkJfQorCQloZGRfaXBhLT5zeXNfcGlwZVtpXS5jb25uX2hkbF92YWxpZCA9IDE7CisJfQorCisJaWYgKCFoZGRfaXBhX3VjX3N0YV9pc19lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpKSB7CisJCS8qCisJCSAqIEhhcmQgY29kZSBpdCBoZXJlLCB0aGlzIGNhbiBiZSBleHRlbmRlZCBpZiBpbiBjYXNlCisJCSAqIFBST0QgcGlwZSBpcyBhbHNvIHBlciBpbnRlcmZhY2UuCisJCSAqIFJpZ2h0IG5vdyB0aGVyZSBpcyBubyBhZHZhbnRhZ2Ugb2YgZG9pbmcgdGhpcy4KKwkJICovCisJCWhkZF9pcGEtPnByb2RfY2xpZW50ID0gSVBBX0NMSUVOVF9XTEFOMV9QUk9EOworCisJCWlwYSA9ICZoZGRfaXBhLT5zeXNfcGlwZVtIRERfSVBBX1JYX1BJUEVdLmlwYV9zeXNfcGFyYW1zOworCisJCWlwYS0+Y2xpZW50ID0gaGRkX2lwYS0+cHJvZF9jbGllbnQ7CisKKwkJaXBhLT5kZXNjX2ZpZm9fc3ogPSBkZXNjX2ZpZm9fc3o7CisJCWlwYS0+cHJpdiA9IGhkZF9pcGE7CisJCWlwYS0+bm90aWZ5ID0gaGRkX2lwYV93MmlfY2I7CisKKwkJaXBhLT5pcGFfZXBfY2ZnLm5hdC5uYXRfZW4gPSBJUEFfQllQQVNTX05BVDsKKwkJaXBhLT5pcGFfZXBfY2ZnLmhkci5oZHJfbGVuID0gSEREX0lQQV9XTEFOX1JYX0hEUl9MRU47CisJCWlwYS0+aXBhX2VwX2NmZy5oZHIuaGRyX29mc3RfbWV0YWRhdGFfdmFsaWQgPSAxOworCQlpcGEtPmlwYV9lcF9jZmcubW9kZS5tb2RlID0gSVBBX0JBU0lDOworCisJCWlmICghaGRkX2lwYV9pc19ybV9lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpKQorCQkJaXBhLT5rZWVwX2lwYV9hd2FrZSA9IDE7CisKKwkJcmV0ID0gaXBhX3NldHVwX3N5c19waXBlKGlwYSwgJihoZGRfaXBhLT5zeXNfcGlwZVtpXS5jb25uX2hkbCkpOworCQlpZiAocmV0KSB7CisJCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSJGYWlsZWQgZm9yIFJYIHBpcGU6ICVkIiwgcmV0KTsKKwkJCWdvdG8gc2V0dXBfc3lzX3BpcGVfZmFpbDsKKwkJfQorCQloZGRfaXBhLT5zeXNfcGlwZVtIRERfSVBBX1JYX1BJUEVdLmNvbm5faGRsX3ZhbGlkID0gMTsKKwl9CisKKwlyZXR1cm4gcmV0OworCitzZXR1cF9zeXNfcGlwZV9mYWlsOgorCisJd2hpbGUgKC0taSA+PSAwKSB7CisJCWlwYV90ZWFyZG93bl9zeXNfcGlwZShoZGRfaXBhLT5zeXNfcGlwZVtpXS5jb25uX2hkbCk7CisJCWNkZl9tZW1femVybygmaGRkX2lwYS0+c3lzX3BpcGVbaV0sCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgaGRkX2lwYV9zeXNfcGlwZSkpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGRkX2lwYV90ZWFyZG93bl9zeXNfcGlwZSgpIC0gVGVhciBkb3duIGFsbCBJUEEgU3lzIHBpcGVzCisgKiBAaGRkX2lwYTogR2xvYmFsIEhERCBJUEEgY29udGV4dAorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfaXBhX3RlYXJkb3duX3N5c19waXBlKHN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEpCit7CisJaW50IHJldCA9IDAsIGk7CisJZm9yIChpID0gMDsgaSA8IEhERF9JUEFfTUFYX1NZU0JBTV9QSVBFOyBpKyspIHsKKwkJaWYgKGhkZF9pcGEtPnN5c19waXBlW2ldLmNvbm5faGRsX3ZhbGlkKSB7CisJCQlyZXQgPQorCQkJCWlwYV90ZWFyZG93bl9zeXNfcGlwZShoZGRfaXBhLT5zeXNfcGlwZVtpXS4KKwkJCQkJCSAgICAgIGNvbm5faGRsKTsKKwkJCWlmIChyZXQpCisJCQkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiRmFpbGVkOiAlZCIsCisJCQkJCSAgICByZXQpOworCisJCQloZGRfaXBhLT5zeXNfcGlwZVtpXS5jb25uX2hkbF92YWxpZCA9IDA7CisJCX0KKwl9Cit9CisKKy8qKgorICogaGRkX2lwYV9yZWdpc3Rlcl9pbnRlcmZhY2UoKSAtIHJlZ2lzdGVyIElQQSBpbnRlcmZhY2UKKyAqIEBoZGRfaXBhOiBHbG9iYWwgSVBBIGNvbnRleHQKKyAqIEBpZmFjZV9jb250ZXh0OiBQZXItaW50ZXJmYWNlIElQQSBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgaGRkX2lwYV9yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSwKKwkJCQkgICAgICBzdHJ1Y3QgaGRkX2lwYV9pZmFjZV9jb250ZXh0CisJCQkJICAgICAgKmlmYWNlX2NvbnRleHQpCit7CisJc3RydWN0IGlwYV90eF9pbnRmIHR4X2ludGY7CisJc3RydWN0IGlwYV9yeF9pbnRmIHJ4X2ludGY7CisJc3RydWN0IGlwYV9pb2NfdHhfaW50Zl9wcm9wICp0eF9wcm9wID0gTlVMTDsKKwlzdHJ1Y3QgaXBhX2lvY19yeF9pbnRmX3Byb3AgKnJ4X3Byb3AgPSBOVUxMOworCWNoYXIgKmlmbmFtZSA9IGlmYWNlX2NvbnRleHQtPmFkYXB0ZXItPmRldi0+bmFtZTsKKworCWNoYXIgaXB2NF9oZHJfbmFtZVtJUEFfUkVTT1VSQ0VfTkFNRV9NQVhdOworCWNoYXIgaXB2Nl9oZHJfbmFtZVtJUEFfUkVTT1VSQ0VfTkFNRV9NQVhdOworCisJaW50IG51bV9wcm9wID0gMTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChoZGRfaXBhX2lzX2lwdjZfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkKKwkJbnVtX3Byb3ArKzsKKworCS8qIEFsbG9jYXRlIFRYIHByb3BlcnRpZXMgZm9yIFRPUyBjYXRlZ29yaWVzLCAxIGVhY2ggZm9yIElQdjQgJiBJUHY2ICovCisJdHhfcHJvcCA9CisJCWNkZl9tZW1fbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBhX2lvY190eF9pbnRmX3Byb3ApICogbnVtX3Byb3ApOworCWlmICghdHhfcHJvcCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICJ0eF9wcm9wIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gcmVnaXN0ZXJfaW50ZXJmYWNlX2ZhaWw7CisJfQorCisJLyogQWxsb2NhdGUgUlggcHJvcGVydGllcywgMSBlYWNoIGZvciBJUHY0ICYgSVB2NiAqLworCXJ4X3Byb3AgPQorCQljZGZfbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IGlwYV9pb2NfcnhfaW50Zl9wcm9wKSAqIG51bV9wcm9wKTsKKwlpZiAoIXJ4X3Byb3ApIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAicnhfcHJvcCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlnb3RvIHJlZ2lzdGVyX2ludGVyZmFjZV9mYWlsOworCX0KKworCWNkZl9tZW1femVybygmdHhfaW50Ziwgc2l6ZW9mKHR4X2ludGYpKTsKKwljZGZfbWVtX3plcm8oJnJ4X2ludGYsIHNpemVvZihyeF9pbnRmKSk7CisKKwlzbnByaW50ZihpcHY0X2hkcl9uYW1lLCBJUEFfUkVTT1VSQ0VfTkFNRV9NQVgsICIlcyVzIiwKKwkJIGlmbmFtZSwgSEREX0lQQV9JUFY0X05BTUVfRVhUKTsKKwlzbnByaW50ZihpcHY2X2hkcl9uYW1lLCBJUEFfUkVTT1VSQ0VfTkFNRV9NQVgsICIlcyVzIiwKKwkJIGlmbmFtZSwgSEREX0lQQV9JUFY2X05BTUVfRVhUKTsKKworCXJ4X3Byb3BbSVBBX0lQX3Y0XS5pcCA9IElQQV9JUF92NDsKKwlyeF9wcm9wW0lQQV9JUF92NF0uc3JjX3BpcGUgPSBpZmFjZV9jb250ZXh0LT5wcm9kX2NsaWVudDsKKwlyeF9wcm9wW0lQQV9JUF92NF0uaGRyX2wyX3R5cGUgPSBJUEFfSERSX0wyX0VUSEVSTkVUX0lJOworCXJ4X3Byb3BbSVBBX0lQX3Y0XS5hdHRyaWIuYXR0cmliX21hc2sgPSBJUEFfRkxUX01FVEFfREFUQTsKKworCS8qCisJICogSW50ZXJmYWNlIElEIGlzIDNyZCBieXRlIGluIHRoZSBDTEQgaGVhZGVyLiBBZGQgdGhlIG1ldGEgZGF0YSBhbmQKKwkgKiBtYXNrIHRvIGlkZW50aWZ5IHRoZSBpbnRlcmZhY2UgaW4gSVBBIGhhcmR3YXJlCisJICovCisJcnhfcHJvcFtJUEFfSVBfdjRdLmF0dHJpYi5tZXRhX2RhdGEgPQorCQlodG9ubChpZmFjZV9jb250ZXh0LT5hZGFwdGVyLT5zZXNzaW9uSWQgPDwgMTYpOworCXJ4X3Byb3BbSVBBX0lQX3Y0XS5hdHRyaWIubWV0YV9kYXRhX21hc2sgPSBodG9ubCgweDAwRkYwMDAwKTsKKworCXJ4X2ludGYubnVtX3Byb3BzKys7CisJaWYgKGhkZF9pcGFfaXNfaXB2Nl9lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpKSB7CisJCXJ4X3Byb3BbSVBBX0lQX3Y2XS5pcCA9IElQQV9JUF92NjsKKwkJcnhfcHJvcFtJUEFfSVBfdjZdLnNyY19waXBlID0gaWZhY2VfY29udGV4dC0+cHJvZF9jbGllbnQ7CisJCXJ4X3Byb3BbSVBBX0lQX3Y2XS5oZHJfbDJfdHlwZSA9IElQQV9IRFJfTDJfRVRIRVJORVRfSUk7CisJCXJ4X3Byb3BbSVBBX0lQX3Y0XS5hdHRyaWIuYXR0cmliX21hc2sgPSBJUEFfRkxUX01FVEFfREFUQTsKKwkJcnhfcHJvcFtJUEFfSVBfdjRdLmF0dHJpYi5tZXRhX2RhdGEgPQorCQkJaHRvbmwoaWZhY2VfY29udGV4dC0+YWRhcHRlci0+c2Vzc2lvbklkIDw8IDE2KTsKKwkJcnhfcHJvcFtJUEFfSVBfdjRdLmF0dHJpYi5tZXRhX2RhdGFfbWFzayA9IGh0b25sKDB4MDBGRjAwMDApOworCisJCXJ4X2ludGYubnVtX3Byb3BzKys7CisJfQorCisJdHhfcHJvcFtJUEFfSVBfdjRdLmlwID0gSVBBX0lQX3Y0OworCXR4X3Byb3BbSVBBX0lQX3Y0XS5oZHJfbDJfdHlwZSA9IElQQV9IRFJfTDJfRVRIRVJORVRfSUk7CisJdHhfcHJvcFtJUEFfSVBfdjRdLmRzdF9waXBlID0gSVBBX0NMSUVOVF9XTEFOMV9DT05TOworCXR4X3Byb3BbSVBBX0lQX3Y0XS5hbHRfZHN0X3BpcGUgPSBpZmFjZV9jb250ZXh0LT5jb25zX2NsaWVudDsKKwlzdHJsY3B5KHR4X3Byb3BbSVBBX0lQX3Y0XS5oZHJfbmFtZSwgaXB2NF9oZHJfbmFtZSwKKwkJCUlQQV9SRVNPVVJDRV9OQU1FX01BWCk7CisJdHhfaW50Zi5udW1fcHJvcHMrKzsKKworCWlmIChoZGRfaXBhX2lzX2lwdjZfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkgeworCQl0eF9wcm9wW0lQQV9JUF92Nl0uaXAgPSBJUEFfSVBfdjY7CisJCXR4X3Byb3BbSVBBX0lQX3Y2XS5oZHJfbDJfdHlwZSA9IElQQV9IRFJfTDJfRVRIRVJORVRfSUk7CisJCXR4X3Byb3BbSVBBX0lQX3Y2XS5kc3RfcGlwZSA9IElQQV9DTElFTlRfV0xBTjFfQ09OUzsKKwkJdHhfcHJvcFtJUEFfSVBfdjZdLmFsdF9kc3RfcGlwZSA9IGlmYWNlX2NvbnRleHQtPmNvbnNfY2xpZW50OworCQlzdHJsY3B5KHR4X3Byb3BbSVBBX0lQX3Y2XS5oZHJfbmFtZSwgaXB2Nl9oZHJfbmFtZSwKKwkJCQlJUEFfUkVTT1VSQ0VfTkFNRV9NQVgpOworCQl0eF9pbnRmLm51bV9wcm9wcysrOworCX0KKworCXR4X2ludGYucHJvcCA9IHR4X3Byb3A7CisJcnhfaW50Zi5wcm9wID0gcnhfcHJvcDsKKworCS8qIENhbGwgdGhlIGlwYSBhcGkgdG8gcmVnaXN0ZXIgaW50ZXJmYWNlICovCisJcmV0ID0gaXBhX3JlZ2lzdGVyX2ludGYoaWZuYW1lLCAmdHhfaW50ZiwgJnJ4X2ludGYpOworCityZWdpc3Rlcl9pbnRlcmZhY2VfZmFpbDoKKwljZGZfbWVtX2ZyZWUodHhfcHJvcCk7CisJY2RmX21lbV9mcmVlKHJ4X3Byb3ApOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGRkX3JlbW92ZV9pcGFfaGVhZGVyKCkgLSBSZW1vdmUgYSBzcGVjaWZpYyBoZWFkZXIgZnJvbSBJUEEKKyAqIEBuYW1lOiBOYW1lIG9mIHRoZSBoZWFkZXIgdG8gYmUgcmVtb3ZlZAorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfaXBhX3JlbW92ZV9oZWFkZXIoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaXBhX2lvY19nZXRfaGRyIGhkcmxvb2t1cDsKKwlpbnQgcmV0ID0gMCwgbGVuOworCXN0cnVjdCBpcGFfaW9jX2RlbF9oZHIgKmlwYV9oZHI7CisKKwljZGZfbWVtX3plcm8oJmhkcmxvb2t1cCwgc2l6ZW9mKGhkcmxvb2t1cCkpOworCXN0cmxjcHkoaGRybG9va3VwLm5hbWUsIG5hbWUsIHNpemVvZihoZHJsb29rdXAubmFtZSkpOworCXJldCA9IGlwYV9nZXRfaGRyKCZoZHJsb29rdXApOworCWlmIChyZXQpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICJIZHIgZGVsZXRlZCBhbHJlYWR5ICVzLCAlZCIsCisJCQkgICAgbmFtZSwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiaGRsOiAweCV4IiwgaGRybG9va3VwLmhkbCk7CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpcGFfaW9jX2RlbF9oZHIpICsgc2l6ZW9mKHN0cnVjdCBpcGFfaGRyX2RlbCkgKiAxOworCWlwYV9oZHIgPSAoc3RydWN0IGlwYV9pb2NfZGVsX2hkciAqKWNkZl9tZW1fbWFsbG9jKGxlbik7CisJaWYgKGlwYV9oZHIgPT0gTlVMTCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICJpcGFfaGRyIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybjsKKwl9CisJaXBhX2hkci0+bnVtX2hkbHMgPSAxOworCWlwYV9oZHItPmNvbW1pdCA9IDA7CisJaXBhX2hkci0+aGRsWzBdLmhkbCA9IGhkcmxvb2t1cC5oZGw7CisJaXBhX2hkci0+aGRsWzBdLnN0YXR1cyA9IC0xOworCXJldCA9IGlwYV9kZWxfaGRyKGlwYV9oZHIpOworCWlmIChyZXQgIT0gMCkKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiRGVsZXRlIGhlYWRlciBmYWlsZWQ6ICVkIiwKKwkJCSAgICByZXQpOworCisJY2RmX21lbV9mcmVlKGlwYV9oZHIpOworfQorCisvKioKKyAqIGhkZF9pcGFfYWRkX2hlYWRlcl9pbmZvKCkgLSBBZGQgSVBBIGhlYWRlciBmb3IgYSBnaXZlbiBpbnRlcmZhY2UKKyAqIEBoZGRfaXBhOiBHbG9iYWwgSEREIElQQSBjb250ZXh0CisgKiBAaWZhY2VfY29udGV4dDogSW50ZXJmYWNlLXNwZWNpZmljIEhERCBJUEEgY29udGV4dAorICogQG1hY19hZGRyOiBJbnRlcmZhY2UgTUFDIGFkZHJlc3MKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmVyIGVycm5vIHZhbHVlIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgaGRkX2lwYV9hZGRfaGVhZGVyX2luZm8oc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSwKKwkJCQkgICBzdHJ1Y3QgaGRkX2lwYV9pZmFjZV9jb250ZXh0ICppZmFjZV9jb250ZXh0LAorCQkJCSAgIHVpbnQ4X3QgKm1hY19hZGRyKQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBpZmFjZV9jb250ZXh0LT5hZGFwdGVyOworCWNoYXIgKmlmbmFtZTsKKwlzdHJ1Y3QgaXBhX2lvY19hZGRfaGRyICppcGFfaGRyID0gTlVMTDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgaGRkX2lwYV90eF9oZHIgKnR4X2hkciA9IE5VTEw7CisJc3RydWN0IGhkZF9pcGFfdWNfdHhfaGRyICp1Y190eF9oZHIgPSBOVUxMOworCisJaWZuYW1lID0gYWRhcHRlci0+ZGV2LT5uYW1lOworCisJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICJBZGQgUGFydGlhbCBoZHI6ICVzLCAlcE0iLAorCQkgICAgaWZuYW1lLCBtYWNfYWRkcik7CisKKwkvKiBkeW5hbWljYWxseSBhbGxvY2F0ZSB0aGUgbWVtb3J5IHRvIGFkZCB0aGUgaGRycyAqLworCWlwYV9oZHIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IGlwYV9pb2NfYWRkX2hkcikKKwkJCQkgKyBzaXplb2Yoc3RydWN0IGlwYV9oZHJfYWRkKSk7CisJaWYgKCFpcGFfaGRyKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAiJXM6IGlwYV9oZHIgYWxsb2NhdGlvbiBmYWlsZWQiLCBpZm5hbWUpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVuZDsKKwl9CisKKwlpcGFfaGRyLT5jb21taXQgPSAwOworCWlwYV9oZHItPm51bV9oZHJzID0gMTsKKworCWlmIChoZGRfaXBhX3VjX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpIHsKKwkJdWNfdHhfaGRyID0gKHN0cnVjdCBoZGRfaXBhX3VjX3R4X2hkciAqKWlwYV9oZHItPmhkclswXS5oZHI7CisJCW1lbWNweSh1Y190eF9oZHIsICZpcGFfdWNfdHhfaGRyLCBIRERfSVBBX1VDX1dMQU5fVFhfSERSX0xFTik7CisJCW1lbWNweSh1Y190eF9oZHItPmV0aC5oX3NvdXJjZSwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKKwkJdWNfdHhfaGRyLT5pcGFfaGQudmRldl9pZCA9IGlmYWNlX2NvbnRleHQtPmFkYXB0ZXItPnNlc3Npb25JZDsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJImlmbmFtZT0lcywgdmRldl9pZD0lZCIsCisJCQlpZm5hbWUsIHVjX3R4X2hkci0+aXBhX2hkLnZkZXZfaWQpOworCQlzbnByaW50ZihpcGFfaGRyLT5oZHJbMF0ubmFtZSwgSVBBX1JFU09VUkNFX05BTUVfTUFYLCAiJXMlcyIsCisJCQkJaWZuYW1lLCBIRERfSVBBX0lQVjRfTkFNRV9FWFQpOworCQlpcGFfaGRyLT5oZHJbMF0uaGRyX2xlbiA9IEhERF9JUEFfVUNfV0xBTl9UWF9IRFJfTEVOOworCQlpcGFfaGRyLT5oZHJbMF0udHlwZSA9IElQQV9IRFJfTDJfRVRIRVJORVRfSUk7CisJCWlwYV9oZHItPmhkclswXS5pc19wYXJ0aWFsID0gMTsKKwkJaXBhX2hkci0+aGRyWzBdLmhkcl9oZGwgPSAwOworCQlpcGFfaGRyLT5oZHJbMF0uaXNfZXRoMl9vZnN0X3ZhbGlkID0gMTsKKwkJaXBhX2hkci0+aGRyWzBdLmV0aDJfb2ZzdCA9IEhERF9JUEFfVUNfV0xBTl9IRFJfREVTX01BQ19PRkZTRVQ7CisKKwkJcmV0ID0gaXBhX2FkZF9oZHIoaXBhX2hkcik7CisJfSBlbHNlIHsKKwkJdHhfaGRyID0gKHN0cnVjdCBoZGRfaXBhX3R4X2hkciAqKWlwYV9oZHItPmhkclswXS5oZHI7CisKKwkJLyogU2V0IHRoZSBTb3VyY2UgTUFDICovCisJCW1lbWNweSh0eF9oZHIsICZpcGFfdHhfaGRyLCBIRERfSVBBX1dMQU5fVFhfSERSX0xFTik7CisJCW1lbWNweSh0eF9oZHItPmV0aC5oX3NvdXJjZSwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKKworCQlzbnByaW50ZihpcGFfaGRyLT5oZHJbMF0ubmFtZSwgSVBBX1JFU09VUkNFX05BTUVfTUFYLCAiJXMlcyIsCisJCQkJaWZuYW1lLCBIRERfSVBBX0lQVjRfTkFNRV9FWFQpOworCQlpcGFfaGRyLT5oZHJbMF0uaGRyX2xlbiA9IEhERF9JUEFfV0xBTl9UWF9IRFJfTEVOOworCQlpcGFfaGRyLT5oZHJbMF0uaXNfcGFydGlhbCA9IDE7CisJCWlwYV9oZHItPmhkclswXS5oZHJfaGRsID0gMDsKKwkJaXBhX2hkci0+aGRyWzBdLmlzX2V0aDJfb2ZzdF92YWxpZCA9IDE7CisJCWlwYV9oZHItPmhkclswXS5ldGgyX29mc3QgPSBIRERfSVBBX1dMQU5fSERSX0RFU19NQUNfT0ZGU0VUOworCisJCS8qIFNldCB0aGUgdHlwZSB0byBJUFY0IGluIHRoZSBoZWFkZXIgKi8KKwkJdHhfaGRyLT5sbGNfc25hcC5ldGhfdHlwZSA9IGNwdV90b19iZTE2KEVUSF9QX0lQKTsKKworCQlyZXQgPSBpcGFfYWRkX2hkcihpcGFfaGRyKTsKKwl9CisJaWYgKHJldCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBJUHY0IGFkZCBoZHIgZmFpbGVkOiAlZCIsCisJCQkgICAgaWZuYW1lLCByZXQpOworCQlnb3RvIGVuZDsKKwl9CisKKwlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBJUHY0IGhkcl9oZGw6IDB4JXgiLAorCQkgICAgaXBhX2hkci0+aGRyWzBdLm5hbWUsIGlwYV9oZHItPmhkclswXS5oZHJfaGRsKTsKKworCWlmIChoZGRfaXBhX2lzX2lwdjZfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkgeworCQlzbnByaW50ZihpcGFfaGRyLT5oZHJbMF0ubmFtZSwgSVBBX1JFU09VUkNFX05BTUVfTUFYLCAiJXMlcyIsCisJCQkgaWZuYW1lLCBIRERfSVBBX0lQVjZfTkFNRV9FWFQpOworCisJCWlmIChoZGRfaXBhX3VjX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpIHsKKwkJCXVjX3R4X2hkciA9CisJCQkJKHN0cnVjdCBoZGRfaXBhX3VjX3R4X2hkciAqKWlwYV9oZHItPmhkclswXS5oZHI7CisJCQl1Y190eF9oZHItPmV0aC5oX3Byb3RvID0gY3B1X3RvX2JlMTYoRVRIX1BfSVBWNik7CisJCX0gZWxzZSB7CisJCQkvKiBTZXQgdGhlIHR5cGUgdG8gSVBWNiBpbiB0aGUgaGVhZGVyICovCisJCQl0eF9oZHIgPSAoc3RydWN0IGhkZF9pcGFfdHhfaGRyICopaXBhX2hkci0+aGRyWzBdLmhkcjsKKwkJCXR4X2hkci0+bGxjX3NuYXAuZXRoX3R5cGUgPSBjcHVfdG9fYmUxNihFVEhfUF9JUFY2KTsKKwkJfQorCisJCXJldCA9IGlwYV9hZGRfaGRyKGlwYV9oZHIpOworCQlpZiAocmV0KSB7CisJCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAgICIlczogSVB2NiBhZGQgaGRyIGZhaWxlZDogJWQiLCBpZm5hbWUsIHJldCk7CisJCQlnb3RvIGNsZWFuX2lwdjRfaGRyOworCQl9CisKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogSVB2NiBoZHJfaGRsOiAweCV4IiwKKwkJCSAgICBpcGFfaGRyLT5oZHJbMF0ubmFtZSwgaXBhX2hkci0+aGRyWzBdLmhkcl9oZGwpOworCX0KKworCWNkZl9tZW1fZnJlZShpcGFfaGRyKTsKKworCXJldHVybiByZXQ7CisKK2NsZWFuX2lwdjRfaGRyOgorCXNucHJpbnRmKGlwYV9oZHItPmhkclswXS5uYW1lLCBJUEFfUkVTT1VSQ0VfTkFNRV9NQVgsICIlcyVzIiwKKwkJIGlmbmFtZSwgSEREX0lQQV9JUFY0X05BTUVfRVhUKTsKKwloZGRfaXBhX3JlbW92ZV9oZWFkZXIoaXBhX2hkci0+aGRyWzBdLm5hbWUpOworZW5kOgorCWlmIChpcGFfaGRyKQorCQljZGZfbWVtX2ZyZWUoaXBhX2hkcik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9pcGFfY2xlYW5faGRyKCkgLSBDbGVhbnVwIElQQSBvbiBhIGdpdmVuIGFkYXB0ZXIKKyAqIEBhZGFwdGVyOiBBZGFwdGVyIHVwb24gd2hpY2ggSVBBIHdhcyBwcmV2aW91c2x5IGNvbmZpZ3VyZWQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2lwYV9jbGVhbl9oZHIoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaGRkX2lwYV9wcml2ICpoZGRfaXBhID0gZ2hkZF9pcGE7CisJaW50IHJldDsKKwljaGFyIG5hbWVfaXBhW0lQQV9SRVNPVVJDRV9OQU1FX01BWF07CisKKwkvKiBSZW1vdmUgdGhlIGhlYWRlcnMgKi8KKwlzbnByaW50ZihuYW1lX2lwYSwgSVBBX1JFU09VUkNFX05BTUVfTUFYLCAiJXMlcyIsCisJCSBhZGFwdGVyLT5kZXYtPm5hbWUsIEhERF9JUEFfSVBWNF9OQU1FX0VYVCk7CisJaGRkX2lwYV9yZW1vdmVfaGVhZGVyKG5hbWVfaXBhKTsKKworCWlmIChoZGRfaXBhX2lzX2lwdjZfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkgeworCQlzbnByaW50ZihuYW1lX2lwYSwgSVBBX1JFU09VUkNFX05BTUVfTUFYLCAiJXMlcyIsCisJCQkgYWRhcHRlci0+ZGV2LT5uYW1lLCBIRERfSVBBX0lQVjZfTkFNRV9FWFQpOworCQloZGRfaXBhX3JlbW92ZV9oZWFkZXIobmFtZV9pcGEpOworCX0KKwkvKiB1bnJlZ2lzdGVyIHRoZSBpbnRlcmZhY2Ugd2l0aCBJUEEgKi8KKwlyZXQgPSBpcGFfZGVyZWdpc3Rlcl9pbnRmKGFkYXB0ZXItPmRldi0+bmFtZSk7CisJaWYgKHJldCkKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICAgIiVzOiBpcGFfZGVyZWdpc3Rlcl9pbnRmIGZhaWw6ICVkIiwKKwkJCSAgICBhZGFwdGVyLT5kZXYtPm5hbWUsIHJldCk7Cit9CisKKy8qKgorICogaGRkX2lwYV9jbGVhbnVwX2lmYWNlKCkgLSBDbGVhbnVwIElQQSBvbiBhIGdpdmVuIGludGVyZmFjZQorICogQGlmYWNlX2NvbnRleHQ6IGludGVyZmFjZS1zcGVjaWZpYyBJUEEgY29udGV4dAorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfaXBhX2NsZWFudXBfaWZhY2Uoc3RydWN0IGhkZF9pcGFfaWZhY2VfY29udGV4dCAqaWZhY2VfY29udGV4dCkKK3sKKwlpZiAoaWZhY2VfY29udGV4dCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwloZGRfaXBhX2NsZWFuX2hkcihpZmFjZV9jb250ZXh0LT5hZGFwdGVyKTsKKworCWNkZl9zcGluX2xvY2tfYmgoJmlmYWNlX2NvbnRleHQtPmludGVyZmFjZV9sb2NrKTsKKwlpZmFjZV9jb250ZXh0LT5hZGFwdGVyLT5pcGFfY29udGV4dCA9IE5VTEw7CisJaWZhY2VfY29udGV4dC0+YWRhcHRlciA9IE5VTEw7CisJaWZhY2VfY29udGV4dC0+dGxfY29udGV4dCA9IE5VTEw7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZpZmFjZV9jb250ZXh0LT5pbnRlcmZhY2VfbG9jayk7CisJaWZhY2VfY29udGV4dC0+aWZhX2FkZHJlc3MgPSAwOworCWlmICghaWZhY2VfY29udGV4dC0+aGRkX2lwYS0+bnVtX2lmYWNlKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJOVU0gSU5URiAwLCBJbnZhbGlkIik7CisJCUNERl9BU1NFUlQoMCk7CisJfQorCWlmYWNlX2NvbnRleHQtPmhkZF9pcGEtPm51bV9pZmFjZS0tOworfQorCisvKioKKyAqIGhkZF9pcGFfc2V0dXBfaWZhY2UoKSAtIFNldHVwIElQQSBvbiBhIGdpdmVuIGludGVyZmFjZQorICogQGhkZF9pcGE6IEhERCBJUEEgZ2xvYmFsIGNvbnRleHQKKyAqIEBhZGFwdGVyOiBJbnRlcmZhY2UgdXBvbiB3aGljaCBJUEEgaXMgYmVpbmcgc2V0dXAKKyAqIEBzdGFfaWQ6IFN0YXRpb24gSUQgb2YgdGhlIEFQSSBpbnN0YW5jZQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IGhkZF9pcGFfc2V0dXBfaWZhY2Uoc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSwKKwkJCSAgICAgICBoZGRfYWRhcHRlcl90ICphZGFwdGVyLCB1aW50OF90IHN0YV9pZCkKK3sKKwlzdHJ1Y3QgaGRkX2lwYV9pZmFjZV9jb250ZXh0ICppZmFjZV9jb250ZXh0ID0gTlVMTDsKKwl2b2lkICp0bF9jb250ZXh0ID0gTlVMTDsKKwlpbnQgaSwgcmV0ID0gMDsKKworCS8qIExvd2VyIGxheWVyIG1heSBzZW5kIG11bHRpcGxlIFNUQVJUX0JTU19FVkVOVCBpbiBERlMgbW9kZSBvciBkdXJpbmcKKwkgKiBjaGFubmVsIGNoYW5nZSBpbmRpY2F0aW9uLiBTaW5jZSB0aGVzZSBpbmRpY2F0aW9ucyBhcmUgc2VudCBieSBsb3dlcgorCSAqIGxheWVyIGFzIFNBUCB1cGRhdGVzIGFuZCBJUEEgZG9lc24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciB0aGVzZQorCSAqIHVwZGF0ZXMgc28gaWdub3JpbmchCisJICovCisJaWYgKFdMQU5fSEREX1NPRlRBUCA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSAmJiBhZGFwdGVyLT5pcGFfY29udGV4dCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEREX0lQQV9NQVhfSUZBQ0U7IGkrKykgeworCQlpZiAoaGRkX2lwYS0+aWZhY2VfY29udGV4dFtpXS5hZGFwdGVyID09IE5VTEwpIHsKKwkJCWlmYWNlX2NvbnRleHQgPSAmKGhkZF9pcGEtPmlmYWNlX2NvbnRleHRbaV0pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaWZhY2VfY29udGV4dCA9PSBOVUxMKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAiQWxsIHRoZSBJUEEgaW50ZXJmYWNlcyBhcmUgaW4gdXNlIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCWFkYXB0ZXItPmlwYV9jb250ZXh0ID0gaWZhY2VfY29udGV4dDsKKwlpZmFjZV9jb250ZXh0LT5hZGFwdGVyID0gYWRhcHRlcjsKKwlpZmFjZV9jb250ZXh0LT5zdGFfaWQgPSBzdGFfaWQ7CisJdGxfY29udGV4dCA9IG9sX3R4cnhfZ2V0X3ZkZXZfYnlfc3RhX2lkKHN0YV9pZCk7CisKKwlpZiAodGxfY29udGV4dCA9PSBOVUxMKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAiTm90IGFibGUgdG8gZ2V0IFRMIGNvbnRleHQgc3RhX2lkOiAlZCIsIHN0YV9pZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKworCWlmYWNlX2NvbnRleHQtPnRsX2NvbnRleHQgPSB0bF9jb250ZXh0OworCisJcmV0ID0gaGRkX2lwYV9hZGRfaGVhZGVyX2luZm8oaGRkX2lwYSwgaWZhY2VfY29udGV4dCwKKwkJCQkgICAgICBhZGFwdGVyLT5kZXYtPmRldl9hZGRyKTsKKworCWlmIChyZXQpCisJCWdvdG8gZW5kOworCisJLyogQ29uZmlndXJlIHRoZSBUWCBhbmQgUlggcGlwZXMgZmlsdGVyIHJ1bGVzICovCisJcmV0ID0gaGRkX2lwYV9yZWdpc3Rlcl9pbnRlcmZhY2UoaGRkX2lwYSwgaWZhY2VfY29udGV4dCk7CisJaWYgKHJldCkKKwkJZ290byBjbGVhbnVwX2hlYWRlcjsKKworCWhkZF9pcGEtPm51bV9pZmFjZSsrOworCXJldHVybiByZXQ7CisKK2NsZWFudXBfaGVhZGVyOgorCisJaGRkX2lwYV9jbGVhbl9oZHIoYWRhcHRlcik7CitlbmQ6CisJaWYgKGlmYWNlX2NvbnRleHQpCisJCWhkZF9pcGFfY2xlYW51cF9pZmFjZShpZmFjZV9jb250ZXh0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9pcGFfbXNnX2ZyZWVfZm4oKSAtIEZyZWUgYW4gSVBBIG1lc3NhZ2UKKyAqIEBidWZmOiBwb2ludGVyIHRvIHRoZSBJUEEgbWVzc2FnZQorICogQGxlbjogbGVuZ3RoIG9mIHRoZSBJUEEgbWVzc2FnZQorICogQHR5cGU6IHR5cGUgb2YgSVBBIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2lwYV9tc2dfZnJlZV9mbih2b2lkICpidWZmLCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IHR5cGUpCit7CisJaGRkTG9nKExPRzEsICJtc2cgdHlwZTolZCwgbGVuOiVkIiwgdHlwZSwgbGVuKTsKKwlnaGRkX2lwYS0+c3RhdHMubnVtX2ZyZWVfbXNnKys7CisJY2RmX21lbV9mcmVlKGJ1ZmYpOworfQorCisvKioKKyAqIGhkZF9pcGFfc2VuZF9tY2Nfc2NjX21zZygpIC0gc2VuZCBJUEEgV0xBTl9TV0lUQ0hfVE9fTUNDL1NDQyBtZXNzYWdlCisgKiBAbWNjX21vZGU6IDA9TUNDLzE9U0NDCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG9uIGVycm9yCisgKi8KK2ludCBoZGRfaXBhX3NlbmRfbWNjX3NjY19tc2coaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgYm9vbCBtY2NfbW9kZSkKK3sKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlcl9ub2RlID0gTlVMTCwgKm5leHQgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCXN0cnVjdCBpcGFfbXNnX21ldGEgbWV0YTsKKwlzdHJ1Y3QgaXBhX3dsYW5fbXNnICptc2c7CisJaW50IHJldDsKKworCWlmICghaGRkX2lwYV91Y19zdGFfaXNfZW5hYmxlZChwSGRkQ3R4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXBIZGRDdHgtPm1jY19tb2RlKSB7CisJCS8qIEZsdXNoIFR4UnggcXVldWUgZm9yIGVhY2ggYWRhcHRlciBiZWZvcmUgc3dpdGNoIHRvIFNDQyAqLworCQlzdGF0dXMgPSAgaGRkX2dldF9mcm9udF9hZGFwdGVyKHBIZGRDdHgsICZhZGFwdGVyX25vZGUpOworCQl3aGlsZSAoTlVMTCAhPSBhZGFwdGVyX25vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQkJcEFkYXB0ZXIgPSBhZGFwdGVyX25vZGUtPnBBZGFwdGVyOworCQkJaWYgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OIHx8CisJCQkJcEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCkgeworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJIk1DQy0+U0NDOiBGbHVzaCBUeFJ4IHF1ZXVlKGRfbW9kZT0lZCkiLAorCQkJCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCQkJCWhkZF9kZWluaXRfdHhfcngocEFkYXB0ZXIpOworCQkJfQorCQkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIoCisJCQkJCXBIZGRDdHgsIGFkYXB0ZXJfbm9kZSwgJm5leHQpOworCQkJYWRhcHRlcl9ub2RlID0gbmV4dDsKKwkJfQorCX0KKworCS8qIFNlbmQgU0NDL01DQyBTd2l0Y2hpbmcgZXZlbnQgdG8gSVBBICovCisJbWV0YS5tc2dfbGVuID0gc2l6ZW9mKCptc2cpOworCW1zZyA9IGNkZl9tZW1fbWFsbG9jKG1ldGEubXNnX2xlbik7CisJaWYgKG1zZyA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLCAibXNnIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1ldGEubXNnX3R5cGUgPSBtY2NfbW9kZSA/CisJCQlXTEFOX1NXSVRDSF9UT19NQ0MgOiBXTEFOX1NXSVRDSF9UT19TQ0M7CisJaGRkTG9nKExPRzEsICJpcGFfc2VuZF9tc2coRXZ0OiVkKSIsIG1ldGEubXNnX3R5cGUpOworCisJcmV0ID0gaXBhX3NlbmRfbXNnKCZtZXRhLCBtc2csIGhkZF9pcGFfbXNnX2ZyZWVfZm4pOworCisJaWYgKHJldCkgeworCQloZGRMb2coTE9HRSwgImlwYV9zZW5kX21zZyhFdnQ6JWQpIC0gZmFpbD0lZCIsCisJCQltZXRhLm1zZ190eXBlLCAgcmV0KTsKKwkJY2RmX21lbV9mcmVlKG1zZyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBoZGRfaXBhX3dsYW5fZXZlbnRfdG9fc3RyKCkgLSBjb252ZXJ0IElQQSBXTEFOIGV2ZW50IHRvIHN0cmluZworICogQGV2ZW50OiBJUEEgV0xBTiBldmVudCB0byBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcKKyAqCisgKiBSZXR1cm46IEFTQ0lJIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIElQQSBXTEFOIGV2ZW50CisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqaGRkX2lwYV93bGFuX2V2ZW50X3RvX3N0cihlbnVtIGlwYV93bGFuX2V2ZW50IGV2ZW50KQoreworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFdMQU5fQ0xJRU5UX0NPTk5FQ1Q6CisJCXJldHVybiAiV0xBTl9DTElFTlRfQ09OTkVDVCI7CisJY2FzZSBXTEFOX0NMSUVOVF9ESVNDT05ORUNUOgorCQlyZXR1cm4gIldMQU5fQ0xJRU5UX0RJU0NPTk5FQ1QiOworCWNhc2UgV0xBTl9DTElFTlRfUE9XRVJfU0FWRV9NT0RFOgorCQlyZXR1cm4gIldMQU5fQ0xJRU5UX1BPV0VSX1NBVkVfTU9ERSI7CisJY2FzZSBXTEFOX0NMSUVOVF9OT1JNQUxfTU9ERToKKwkJcmV0dXJuICJXTEFOX0NMSUVOVF9OT1JNQUxfTU9ERSI7CisJY2FzZSBTV19ST1VUSU5HX0VOQUJMRToKKwkJcmV0dXJuICJTV19ST1VUSU5HX0VOQUJMRSI7CisJY2FzZSBTV19ST1VUSU5HX0RJU0FCTEU6CisJCXJldHVybiAiU1dfUk9VVElOR19ESVNBQkxFIjsKKwljYXNlIFdMQU5fQVBfQ09OTkVDVDoKKwkJcmV0dXJuICJXTEFOX0FQX0NPTk5FQ1QiOworCWNhc2UgV0xBTl9BUF9ESVNDT05ORUNUOgorCQlyZXR1cm4gIldMQU5fQVBfRElTQ09OTkVDVCI7CisJY2FzZSBXTEFOX1NUQV9DT05ORUNUOgorCQlyZXR1cm4gIldMQU5fU1RBX0NPTk5FQ1QiOworCWNhc2UgV0xBTl9TVEFfRElTQ09OTkVDVDoKKwkJcmV0dXJuICJXTEFOX1NUQV9ESVNDT05ORUNUIjsKKwljYXNlIFdMQU5fQ0xJRU5UX0NPTk5FQ1RfRVg6CisJCXJldHVybiAiV0xBTl9DTElFTlRfQ09OTkVDVF9FWCI7CisKKwljYXNlIElQQV9XTEFOX0VWRU5UX01BWDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCX0KK30KKworLyoqCisgKiBoZGRfaXBhX3dsYW5fZXZ0KCkgLSBJUEEgZXZlbnQgaGFuZGxlcgorICogQGFkYXB0ZXI6IGFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgZXZlbnQgd2FzIHJlY2VpdmVkCisgKiBAc3RhX2lkOiBzdGF0aW9uIGlkIGZvciB0aGUgZXZlbnQKKyAqIEB0eXBlOiB0aGUgZXZlbnQgdHlwZQorICogQG1hY19hZGRyZXNzOiBNQUMgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG9uIGVycm9yCisgKi8KK2ludCBoZGRfaXBhX3dsYW5fZXZ0KGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIHVpbnQ4X3Qgc3RhX2lkLAorCQkgICAgIGVudW0gaXBhX3dsYW5fZXZlbnQgdHlwZSwgdWludDhfdCAqbWFjX2FkZHIpCit7CisJc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSA9IGdoZGRfaXBhOworCXN0cnVjdCBpcGFfbXNnX21ldGEgbWV0YTsKKwlzdHJ1Y3QgaXBhX3dsYW5fbXNnICptc2c7CisJc3RydWN0IGlwYV93bGFuX21zZ19leCAqbXNnX2V4ID0gTlVMTDsKKwlpbnQgcmV0OworCisJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogJXMgZXZ0LCBNQUM6ICVwTSBzdGFfaWQ6ICVkIiwKKwkJICAgIGFkYXB0ZXItPmRldi0+bmFtZSwgaGRkX2lwYV93bGFuX2V2ZW50X3RvX3N0cih0eXBlKSwKKwkJICAgIG1hY19hZGRyLCBzdGFfaWQpOworCisJaWYgKHR5cGUgPj0gSVBBX1dMQU5fRVZFTlRfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChXQVJOX09OKGlzX3plcm9fZXRoZXJfYWRkcihtYWNfYWRkcikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghaGRkX2lwYSB8fCAhaGRkX2lwYV9pc19lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpKSB7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIklQQSBPRkZMT0FEIE5PVCBFTkFCTEVEIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChoZGRfaXBhX3VjX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkgJiYKKwkJIWhkZF9pcGFfdWNfc3RhX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkgJiYKKwkJKFdMQU5fSEREX1NPRlRBUCAhPSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBEdXJpbmcgSVBBIFVDIHJlc291cmNlIGxvYWRpbmcvdW5sb2FkaW5nIG5ldyBldmVudHMgY2FuIGJlIGlzc3VlZC4KKwkgKiBTdG9yZSB0aGUgZXZlbnRzIHNlcGFyYXRlbHkgYW5kIGhhbmRsZSB0aGVtIGxhdGVyLgorCSAqLworCWlmIChoZGRfaXBhX3VjX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkgJiYKKwkJKChoZGRfaXBhLT5yZXNvdXJjZV9sb2FkaW5nKSB8fAorCQkoaGRkX2lwYS0+cmVzb3VyY2VfdW5sb2FkaW5nKSkpIHsKKwkJc3RydWN0IGlwYV91Y19wZW5kaW5nX2V2ZW50ICpwZW5kaW5nX2V2ZXQgPSBOVUxMOworCisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSIlcywgUkwvUlVMIGlucHJvZ3Jlc3MiLCBfX2Z1bmNfXyk7CisJCXBlbmRpbmdfZXZldCA9IChzdHJ1Y3QgaXBhX3VjX3BlbmRpbmdfZXZlbnQgKiljZGZfbWVtX21hbGxvYygKKwkJCXNpemVvZihzdHJ1Y3QgaXBhX3VjX3BlbmRpbmdfZXZlbnQpKTsKKwkJaWYgKCFwZW5kaW5nX2V2ZXQpIHsKKwkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiUGVuZGluZyBldmVudCBtZW1vcnkgYWxsb2MgZmFpbCIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcGVuZGluZ19ldmV0LT5hZGFwdGVyID0gYWRhcHRlcjsKKwkJcGVuZGluZ19ldmV0LT5zdGFfaWQgPSBzdGFfaWQ7CisJCXBlbmRpbmdfZXZldC0+dHlwZSA9IHR5cGU7CisJCWNkZl9tZW1fY29weShwZW5kaW5nX2V2ZXQtPm1hY19hZGRyLAorCQkJbWFjX2FkZHIsCisJCQlDREZfTUFDX0FERFJfU0laRSk7CisJCWNkZl9saXN0X2luc2VydF9iYWNrKCZoZGRfaXBhLT5wZW5kaW5nX2V2ZW50LAorCQkJCSZwZW5kaW5nX2V2ZXQtPm5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwloZGRfaXBhLT5zdGF0cy5ldmVudFt0eXBlXSsrOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBXTEFOX1NUQV9DT05ORUNUOgorCQkvKiBTVEEgYWxyZWFkeSBjb25uZWN0ZWQgYW5kIHdpdGhvdXQgZGlzY29ubmVjdCwgY29ubmVjdCBhZ2FpbgorCQkgKiBUaGlzIGlzIFJvYW1pbmcgc2NlbmFyaW8KKwkJICovCisJCWlmIChoZGRfaXBhLT5zdGFfY29ubmVjdGVkKQorCQkJaGRkX2lwYV9jbGVhbnVwX2lmYWNlKGFkYXB0ZXItPmlwYV9jb250ZXh0KTsKKworCQlpZiAoKGhkZF9pcGFfdWNfc3RhX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpICYmCisJCQkoIWhkZF9pcGEtPnN0YV9jb25uZWN0ZWQpKQorCQkJaGRkX2lwYV91Y19vZmZsb2FkX2VuYWJsZV9kaXNhYmxlKGFkYXB0ZXIsCisJCQkJU0lSX1NUQV9SWF9EQVRBX09GRkxPQUQsIDEpOworCisJCWNkZl9tdXRleF9hY3F1aXJlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKworCQlpZiAoIWhkZF9pcGFfdWNfaXNfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkgeworCQkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJIiVzOiBFdnQ6ICVkLCBJUEEgVUMgT0ZGTE9BRCBOT1QgRU5BQkxFRCIsCisJCQkJbXNnX2V4LT5uYW1lLCBtZXRhLm1zZ190eXBlKTsKKwkJfSBlbHNlIGlmICgoIWhkZF9pcGEtPnNhcF9udW1fY29ubmVjdGVkX3N0YSkgJiYKKwkJCSghaGRkX2lwYS0+c3RhX2Nvbm5lY3RlZCkpIHsKKwkJCS8qIEVuYWJsZSBJUEEgVUMgVFggUElQRSB3aGVuIFNUQSBjb25uZWN0ZWQgKi8KKwkJCXJldCA9IGhkZF9pcGFfdWNfaGFuZGxlX2ZpcnN0X2NvbihoZGRfaXBhKTsKKwkJCWlmICghcmV0KSB7CisJCQkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkiaGFuZGxlIDFzdCBjb24gcmV0ICVkIiwgcmV0KTsKKwkJCX0gZWxzZSB7CisJCQkJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9pcGEtPmV2ZW50X2xvY2spOworCQkJCWhkZF9pcGFfdWNfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZShhZGFwdGVyLAorCQkJCQlTSVJfU1RBX1JYX0RBVEFfT0ZGTE9BRCwgMCk7CisJCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwkJcmV0ID0gaGRkX2lwYV9zZXR1cF9pZmFjZShoZGRfaXBhLCBhZGFwdGVyLCBzdGFfaWQpOworCQlpZiAocmV0KSB7CisJCQljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCQloZGRfaXBhX3VjX29mZmxvYWRfZW5hYmxlX2Rpc2FibGUoYWRhcHRlciwKKwkJCQlTSVJfU1RBX1JYX0RBVEFfT0ZGTE9BRCwgMCk7CisJCQlnb3RvIGVuZDsKKworI2lmZGVmIElQQV9VQ19PRkZMT0FECisJCXZkZXZfdG9faWZhY2VbYWRhcHRlci0+c2Vzc2lvbklkXSA9CisJCQkoKHN0cnVjdCBoZGRfaXBhX2lmYWNlX2NvbnRleHQgKikKKwkJCQkoYWRhcHRlci0+aXBhX2NvbnRleHQpKS0+aWZhY2VfaWQ7CisjZW5kaWYgLyogSVBBX1VDX09GRkxPQUQgKi8KKwkJfQorCisJCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKworCQloZGRfaXBhLT5zdGFfY29ubmVjdGVkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQVBfQ09OTkVDVDoKKwkJLyogRm9yIERGUyBjaGFubmVsIHdlIGdldCB0d28gc3RhcnRfYnNzIGV2ZW50IChiZWZvcmUgYW5kIGFmdGVyCisJCSAqIENBQykuIEFsc28gd2hlbiBBQ1MgcmFuZ2UgaW5jbHVkZXMgYm90aCBERlMgYW5kIG5vbiBERlMKKwkJICogY2hhbm5lbHMsIHdlIGNvdWxkIHBvc3NpYmx5IGNoYW5nZSBjaGFubmVsIG1hbnkgdGltZXMgZHVlIHRvCisJCSAqIFJBREFSIGRldGVjdGlvbiBhbmQgY2hvc2VuIGNoYW5uZWwgbWF5IG5vdCBiZSBhIERGUyBjaGFubmVscy4KKwkJICogU28gZG9udCByZXR1cm4gZXJyb3IgaGVyZS4gSnVzdCBkaXNjYXJkIHRoZSBldmVudC4KKwkJICovCisJCWlmIChhZGFwdGVyLT5pcGFfY29udGV4dCkKKwkJCXJldHVybiAwOworCisJCWlmIChoZGRfaXBhX3VjX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpIHsKKwkJCWhkZF9pcGFfdWNfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZShhZGFwdGVyLAorCQkJCVNJUl9BUF9SWF9EQVRBX09GRkxPQUQsIDEpOworCQl9CisJCWNkZl9tdXRleF9hY3F1aXJlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKwkJcmV0ID0gaGRkX2lwYV9zZXR1cF9pZmFjZShoZGRfaXBhLCBhZGFwdGVyLCBzdGFfaWQpOworCQlpZiAocmV0KSB7CisJCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkiJXM6IEV2dDogJWQsIEludGVyZmFjZSBzZXR1cCBmYWlsZWQiLAorCQkJCW1zZ19leC0+bmFtZSwgbWV0YS5tc2dfdHlwZSk7CisJCQljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCQlnb3RvIGVuZDsKKworI2lmZGVmIElQQV9VQ19PRkZMT0FECisJCXZkZXZfdG9faWZhY2VbYWRhcHRlci0+c2Vzc2lvbklkXSA9CisJCQkoKHN0cnVjdCBoZGRfaXBhX2lmYWNlX2NvbnRleHQgKikKKwkJCQkoYWRhcHRlci0+aXBhX2NvbnRleHQpKS0+aWZhY2VfaWQ7CisjZW5kaWYgLyogSVBBX1VDX09GRkxPQUQgKi8KKwkJfQorCQljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX1NUQV9ESVNDT05ORUNUOgorCQljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCWhkZF9pcGFfY2xlYW51cF9pZmFjZShhZGFwdGVyLT5pcGFfY29udGV4dCk7CisKKwkJaWYgKCFoZGRfaXBhLT5zdGFfY29ubmVjdGVkKSB7CisJCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkiJXM6IEV2dDogJWQsIFNUQSBhbHJlYWR5IGRpc2Nvbm5lY3RlZCIsCisJCQkJbXNnX2V4LT5uYW1lLCBtZXRhLm1zZ190eXBlKTsKKwkJCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWhkZF9pcGEtPnN0YV9jb25uZWN0ZWQgPSAwOworCQlpZiAoIWhkZF9pcGFfdWNfaXNfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkgeworCQkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJIiVzOiBJUEEgVUMgT0ZGTE9BRCBOT1QgRU5BQkxFRCIsCisJCQkJbXNnX2V4LT5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERpc2FibGUgSVBBIFVDIFRYIFBJUEUgd2hlbiBTVEEgZGlzY29ubmVjdGVkICovCisJCQlpZiAoKCFoZGRfaXBhLT5zYXBfbnVtX2Nvbm5lY3RlZF9zdGEpIHx8CisJCQkJKCghaGRkX2lwYS0+bnVtX2lmYWNlKSAmJgorCQkJCQkoSEREX0lQQV9VQ19OVU1fV0RJX1BJUEUgPT0KKwkJCQkJaGRkX2lwYS0+YWN0aXZhdGVkX2Z3X3BpcGUpKSkgeworCQkJCWhkZF9pcGFfdWNfaGFuZGxlX2xhc3RfZGlzY29uKGhkZF9pcGEpOworCQkJfQorCQl9CisKKwkJaWYgKGhkZF9pcGFfdWNfc3RhX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpIHsKKwkJCWhkZF9pcGFfdWNfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZShhZGFwdGVyLAorCQkJCVNJUl9TVEFfUlhfREFUQV9PRkZMT0FELCAwKTsKKwkJCXZkZXZfdG9faWZhY2VbYWRhcHRlci0+c2Vzc2lvbklkXSA9IEhERF9JUEFfTUFYX0lGQUNFOworCQl9CisKKwkJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9pcGEtPmV2ZW50X2xvY2spOworCQlicmVhazsKKworCWNhc2UgV0xBTl9BUF9ESVNDT05ORUNUOgorCQlpZiAoIWFkYXB0ZXItPmlwYV9jb250ZXh0KSB7CisJCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkiJXM6IEV2dDogJWQsIFNBUCBhbHJlYWR5IGRpc2Nvbm5lY3RlZCIsCisJCQkJbXNnX2V4LT5uYW1lLCBtZXRhLm1zZ190eXBlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJY2RmX211dGV4X2FjcXVpcmUoJmhkZF9pcGEtPmV2ZW50X2xvY2spOworCQloZGRfaXBhX2NsZWFudXBfaWZhY2UoYWRhcHRlci0+aXBhX2NvbnRleHQpOworCQlpZiAoKCFoZGRfaXBhLT5udW1faWZhY2UpICYmCisJCQkoSEREX0lQQV9VQ19OVU1fV0RJX1BJUEUgPT0KKwkJCQloZGRfaXBhLT5hY3RpdmF0ZWRfZndfcGlwZSkpIHsKKwkJCWlmIChoZGRfaXBhLT5oZGRfY3R4LT5pc1VubG9hZEluUHJvZ3Jlc3MpIHsKKwkJCQkvKgorCQkJCSAqIFdlIGRpc2FibGUgV0RJIHBpcGVzIGRpcmVjdGx5IGhlcmUgc2luY2UKKwkJCQkgKiBJUEFfT1BDT0RFX1RYL1JYX1NVU1BFTkQgbWVzc2FnZSB3aWxsIG5vdCBiZQorCQkJCSAqIHByb2Nlc3NlZCB3aGVuIHVubG9hZGluZyBXTEFOIGRyaXZlciBpcyBpbgorCQkJCSAqIHByb2dyZXNzCisJCQkJICovCisJCQkJaGRkX2lwYV91Y19kaXNhYmxlX3BpcGVzKGhkZF9pcGEpOworCQkJfSBlbHNlIHsKKwkJCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSJOTyBJTlRGIGxlZnQgYnV0IHN0aWxsIHBpcGUgY2xlYW4gdXAiKTsKKwkJCQloZGRfaXBhX3VjX2hhbmRsZV9sYXN0X2Rpc2NvbihoZGRfaXBhKTsKKwkJCX0KKwkJfQorCisJCWlmIChoZGRfaXBhX3VjX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpIHsKKwkJCWhkZF9pcGFfdWNfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZShhZGFwdGVyLAorCQkJCVNJUl9BUF9SWF9EQVRBX09GRkxPQUQsIDApOworCQkJdmRldl90b19pZmFjZVthZGFwdGVyLT5zZXNzaW9uSWRdID0gSEREX0lQQV9NQVhfSUZBQ0U7CisJCX0KKwkJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9pcGEtPmV2ZW50X2xvY2spOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DTElFTlRfQ09OTkVDVF9FWDoKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlZCAlZCIsCisJCQkgICAgYWRhcHRlci0+ZGV2LT5pZmluZGV4LCBzdGFfaWQpOworCisJCWlmICghaGRkX2lwYV91Y19pc19lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpKSB7CisJCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkiJXM6IEV2dDogJWQsIElQQSBVQyBPRkZMT0FEIE5PVCBFTkFCTEVEIiwKKwkJCQlhZGFwdGVyLT5kZXYtPm5hbWUsIG1ldGEubXNnX3R5cGUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCWlmIChoZGRfaXBhX3VjX2ZpbmRfYWRkX2Fzc29jX3N0YShoZGRfaXBhLAorCQkJCXRydWUsIHN0YV9pZCkpIHsKKwkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiJXM6IFNUQSBJRCAlZCBmb3VuZCwgbm90IHZhbGlkIiwKKwkJCQlhZGFwdGVyLT5kZXYtPm5hbWUsIHN0YV9pZCk7CisJCQljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQloZGRfaXBhLT5zYXBfbnVtX2Nvbm5lY3RlZF9zdGErKzsKKwkJaGRkX2lwYS0+cGVuZGluZ19jb25zX3JlcSA9IGZhbHNlOworCQljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisKKwkJbWV0YS5tc2dfdHlwZSA9IHR5cGU7CisJCW1ldGEubXNnX2xlbiA9IChzaXplb2Yoc3RydWN0IGlwYV93bGFuX21zZ19leCkgKworCQkJCXNpemVvZihzdHJ1Y3QgaXBhX3dsYW5faGRyX2F0dHJpYl92YWwpKTsKKwkJbXNnX2V4ID0gY2RmX21lbV9tYWxsb2MobWV0YS5tc2dfbGVuKTsKKworCQlpZiAobXNnX2V4ID09IE5VTEwpIHsKKwkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICAgIm1zZ19leCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJc3RybGNweShtc2dfZXgtPm5hbWUsIGFkYXB0ZXItPmRldi0+bmFtZSwKKwkJCUlQQV9SRVNPVVJDRV9OQU1FX01BWCk7CisJCW1zZ19leC0+bnVtX29mX2F0dHJpYnMgPSAxOworCQltc2dfZXgtPmF0dHJpYnNbMF0uYXR0cmliX3R5cGUgPSBXTEFOX0hEUl9BVFRSSUJfTUFDX0FERFI7CisJCWlmIChoZGRfaXBhX3VjX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpIHsKKwkJCW1zZ19leC0+YXR0cmlic1swXS5vZmZzZXQgPQorCQkJCUhERF9JUEFfVUNfV0xBTl9IRFJfREVTX01BQ19PRkZTRVQ7CisJCX0gZWxzZSB7CisJCQltc2dfZXgtPmF0dHJpYnNbMF0ub2Zmc2V0ID0KKwkJCQlIRERfSVBBX1dMQU5fSERSX0RFU19NQUNfT0ZGU0VUOworCQl9CisJCW1lbWNweShtc2dfZXgtPmF0dHJpYnNbMF0udS5tYWNfYWRkciwgbWFjX2FkZHIsCisJCSAgICAgICBJUEFfTUFDX0FERFJfU0laRSk7CisKKwkJcmV0ID0gaXBhX3NlbmRfbXNnKCZtZXRhLCBtc2dfZXgsIGhkZF9pcGFfbXNnX2ZyZWVfZm4pOworCisJCWlmIChyZXQpIHsKKwkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IEV2dDogJWQgOiAlZCIsCisJCQkJICAgIG1zZ19leC0+bmFtZSwgbWV0YS5tc2dfdHlwZSwgcmV0KTsKKwkJCWNkZl9tZW1fZnJlZShtc2dfZXgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQloZGRfaXBhLT5zdGF0cy5udW1fc2VuZF9tc2crKzsKKworCQljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCS8qIEVuYWJsZSBJUEEgVUMgRGF0YSBQSVBFcyB3aGVuIGZpcnN0IFNUQSBjb25uZWN0ZWQgKi8KKwkJaWYgKCgxID09IGhkZF9pcGEtPnNhcF9udW1fY29ubmVjdGVkX3N0YSkKKwkJCSYmICghaGRkX2lwYV91Y19zdGFfaXNfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KQorCQkJfHwgIWhkZF9pcGEtPnN0YV9jb25uZWN0ZWQpKSB7CisJCQlyZXQgPSBoZGRfaXBhX3VjX2hhbmRsZV9maXJzdF9jb24oaGRkX2lwYSk7CisJCQlpZiAocmV0KSB7CisJCQkJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9pcGEtPmV2ZW50X2xvY2spOworCQkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAgICIlczogaGFuZGxlIDFzdCBjb24gcmV0ICVkIiwKKwkJCQkJICAgIGFkYXB0ZXItPmRldi0+bmFtZSwgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCWNkZl9tdXRleF9yZWxlYXNlKCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKworCQlyZXR1cm4gcmV0OworCisJY2FzZSBXTEFOX0NMSUVOVF9ESVNDT05ORUNUOgorCQlpZiAoIWhkZF9pcGFfdWNfaXNfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkgeworCQkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSIlczogSVBBIFVDIE9GRkxPQUQgTk9UIEVOQUJMRUQiLAorCQkJCQltc2dfZXgtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljZGZfbXV0ZXhfYWNxdWlyZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCWlmICghaGRkX2lwYV91Y19maW5kX2FkZF9hc3NvY19zdGEoaGRkX2lwYSwgZmFsc2UsIHN0YV9pZCkpIHsKKwkJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICAgIiVzOiBTVEEgSUQgJWQgTk9UIGZvdW5kLCBub3QgdmFsaWQiLAorCQkJCSAgICBtc2dfZXgtPm5hbWUsIHN0YV9pZCk7CisJCQljZGZfbXV0ZXhfcmVsZWFzZSgmaGRkX2lwYS0+ZXZlbnRfbG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQloZGRfaXBhLT5zYXBfbnVtX2Nvbm5lY3RlZF9zdGEtLTsKKwkJLyogRGlzYWJsZSBJUEEgVUMgVFggUElQRSB3aGVuIGxhc3QgU1RBIGRpc2Nvbm5lY3RlZCAqLworCQlpZiAoIWhkZF9pcGEtPnNhcF9udW1fY29ubmVjdGVkX3N0YQorCQkJJiYgKCFoZGRfaXBhX3VjX3N0YV9pc19lbmFibGVkKGhkZF9pcGEtPmhkZF9jdHgpIHx8CisJCQkhaGRkX2lwYS0+c3RhX2Nvbm5lY3RlZCkKKwkJCSYmIChmYWxzZSA9PSBoZGRfaXBhLT5yZXNvdXJjZV91bmxvYWRpbmcpCisJCQkmJiAoSEREX0lQQV9VQ19OVU1fV0RJX1BJUEUgPT0KKwkJCQloZGRfaXBhLT5hY3RpdmF0ZWRfZndfcGlwZSkpCisJCQloZGRfaXBhX3VjX2hhbmRsZV9sYXN0X2Rpc2NvbihoZGRfaXBhKTsKKwkJY2RmX211dGV4X3JlbGVhc2UoJmhkZF9pcGEtPmV2ZW50X2xvY2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCW1ldGEubXNnX2xlbiA9IHNpemVvZihzdHJ1Y3QgaXBhX3dsYW5fbXNnKTsKKwltc2cgPSBjZGZfbWVtX21hbGxvYyhtZXRhLm1zZ19sZW4pOworCWlmIChtc2cgPT0gTlVMTCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICJtc2cgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWV0YS5tc2dfdHlwZSA9IHR5cGU7CisJc3RybGNweShtc2ctPm5hbWUsIGFkYXB0ZXItPmRldi0+bmFtZSwgSVBBX1JFU09VUkNFX05BTUVfTUFYKTsKKwltZW1jcHkobXNnLT5tYWNfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKKworCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IEV2dDogJWQiLAorCQkgICAgbXNnLT5uYW1lLCBtZXRhLm1zZ190eXBlKTsKKworCXJldCA9IGlwYV9zZW5kX21zZygmbWV0YSwgbXNnLCBoZGRfaXBhX21zZ19mcmVlX2ZuKTsKKworCWlmIChyZXQpIHsKKwkJSEREX0lQQV9MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogRXZ0OiAlZCBmYWlsOiVkIiwKKwkJCSAgICBtc2ctPm5hbWUsIG1ldGEubXNnX3R5cGUsIHJldCk7CisJCWNkZl9tZW1fZnJlZShtc2cpOworCQlyZXR1cm4gcmV0OworCX0KKworCWhkZF9pcGEtPnN0YXRzLm51bV9zZW5kX21zZysrOworCitlbmQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBoZGRfaXBhX3JtX3N0YXRlX3RvX3N0cigpIC0gQ29udmVydCBJUEEgUk0gc3RhdGUgdG8gc3RyaW5nCisgKiBAc3RhdGU6IElQQSBSTSBzdGF0ZSB2YWx1ZQorICoKKyAqIFJldHVybjogQVNDSUkgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSVBBIFJNIHN0YXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqaGRkX2lwYV9ybV9zdGF0ZV90b19zdHIoZW51bSBoZGRfaXBhX3JtX3N0YXRlIHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEhERF9JUEFfUk1fUkVMRUFTRUQ6CisJCXJldHVybiAiUkVMRUFTRUQiOworCWNhc2UgSEREX0lQQV9STV9HUkFOVF9QRU5ESU5HOgorCQlyZXR1cm4gIkdSQU5UX1BFTkRJTkciOworCWNhc2UgSEREX0lQQV9STV9HUkFOVEVEOgorCQlyZXR1cm4gIkdSQU5URUQiOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7Cit9CisKKy8qKgorICogaGRkX2lwYV9pbml0KCkgLSBJUEEgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAqIEBoZGRfY3R4OiBIREQgZ2xvYmFsIGNvbnRleHQKKyAqCisgKiBBbGxvY2F0ZSBoZGRfaXBhIHJlc291cmNlcywgaXBhIHBpcGUgcmVzb3VyY2UgYW5kIHJlZ2lzdGVyCisgKiB3bGFuIGludGVyZmFjZSB3aXRoIElQQSBtb2R1bGUuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgaGRkX2lwYV9pbml0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJc3RydWN0IGhkZF9pcGFfcHJpdiAqaGRkX2lwYSA9IE5VTEw7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgaGRkX2lwYV9pZmFjZV9jb250ZXh0ICppZmFjZV9jb250ZXh0ID0gTlVMTDsKKworCWlmICghaGRkX2lwYV9pc19lbmFibGVkKGhkZF9jdHgpKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaGRkX2lwYSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqaGRkX2lwYSkpOworCWlmICghaGRkX2lwYSkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICJoZGRfaXBhIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gZmFpbF9zZXR1cF9ybTsKKwl9CisKKwloZGRfY3R4LT5oZGRfaXBhID0gaGRkX2lwYTsKKwlnaGRkX2lwYSA9IGhkZF9pcGE7CisJaGRkX2lwYS0+aGRkX2N0eCA9IGhkZF9jdHg7CisJaGRkX2lwYS0+bnVtX2lmYWNlID0gMDsKKworCS8qIENyZWF0ZSB0aGUgaW50ZXJmYWNlIGNvbnRleHQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSEREX0lQQV9NQVhfSUZBQ0U7IGkrKykgeworCQlpZmFjZV9jb250ZXh0ID0gJmhkZF9pcGEtPmlmYWNlX2NvbnRleHRbaV07CisJCWlmYWNlX2NvbnRleHQtPmhkZF9pcGEgPSBoZGRfaXBhOworCQlpZmFjZV9jb250ZXh0LT5jb25zX2NsaWVudCA9CisJCQloZGRfaXBhX2FkYXB0ZXJfMl9jbGllbnRbaV0uY29uc19jbGllbnQ7CisJCWlmYWNlX2NvbnRleHQtPnByb2RfY2xpZW50ID0KKwkJCWhkZF9pcGFfYWRhcHRlcl8yX2NsaWVudFtpXS5wcm9kX2NsaWVudDsKKwkJaWZhY2VfY29udGV4dC0+aWZhY2VfaWQgPSBpOworCQlpZmFjZV9jb250ZXh0LT5hZGFwdGVyID0gTlVMTDsKKwkJY2RmX3NwaW5sb2NrX2luaXQoJmlmYWNlX2NvbnRleHQtPmludGVyZmFjZV9sb2NrKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfQ05TUworCWNuc3NfaW5pdF93b3JrKCZoZGRfaXBhLT5wbV93b3JrLCBoZGRfaXBhX3BtX3NlbmRfcGt0X3RvX3RsKTsKKyNlbHNlCisJSU5JVF9XT1JLKCZoZGRfaXBhLT5wbV93b3JrLCBoZGRfaXBhX3BtX3NlbmRfcGt0X3RvX3RsKTsKKyNlbmRpZgorCWNkZl9zcGlubG9ja19pbml0KCZoZGRfaXBhLT5wbV9sb2NrKTsKKwljZGZfbmJ1Zl9xdWV1ZV9pbml0KCZoZGRfaXBhLT5wbV9xdWV1ZV9oZWFkKTsKKworCXJldCA9IGhkZF9pcGFfc2V0dXBfcm0oaGRkX2lwYSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX3NldHVwX3JtOworCisJaWYgKGhkZF9pcGFfdWNfaXNfZW5hYmxlZChoZGRfaXBhLT5oZGRfY3R4KSkgeworCQloZGRfaXBhX3VjX3J0X2RlYnVnX2luaXQoaGRkX2N0eCk7CisJCWNkZl9tZW1femVybygmaGRkX2lwYS0+c3RhdHMsIHNpemVvZihoZGRfaXBhLT5zdGF0cykpOworCQloZGRfaXBhLT5zYXBfbnVtX2Nvbm5lY3RlZF9zdGEgPSAwOworCQloZGRfaXBhLT5pcGFfdHhfcGFja2V0c19kaWZmID0gMDsKKwkJaGRkX2lwYS0+aXBhX3J4X3BhY2tldHNfZGlmZiA9IDA7CisJCWhkZF9pcGEtPmlwYV9wX3R4X3BhY2tldHMgPSAwOworCQloZGRfaXBhLT5pcGFfcF9yeF9wYWNrZXRzID0gMDsKKwkJaGRkX2lwYS0+cmVzb3VyY2VfbG9hZGluZyA9IGZhbHNlOworCQloZGRfaXBhLT5yZXNvdXJjZV91bmxvYWRpbmcgPSBmYWxzZTsKKwkJaGRkX2lwYS0+c3RhX2Nvbm5lY3RlZCA9IDA7CisKKwkJLyogU2V0dXAgSVBBIHN5c19waXBlIGZvciBNQ0MgKi8KKwkJaWYgKGhkZF9pcGFfdWNfc3RhX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpIHsKKwkJCXJldCA9IGhkZF9pcGFfc2V0dXBfc3lzX3BpcGUoaGRkX2lwYSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZmFpbF9jcmVhdGVfc3lzX3BpcGU7CisJCX0KKwkJaGRkX2lwYV91Y19vbF9pbml0KGhkZF9jdHgpOworCX0gZWxzZSB7CisJCXJldCA9IGhkZF9pcGFfc2V0dXBfc3lzX3BpcGUoaGRkX2lwYSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxfY3JlYXRlX3N5c19waXBlOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKK2ZhaWxfY3JlYXRlX3N5c19waXBlOgorCWhkZF9pcGFfZGVzdHJveV9ybV9yZXNvdXJjZShoZGRfaXBhKTsKK2ZhaWxfc2V0dXBfcm06CisJaWYgKGhkZF9pcGEpCisJCWNkZl9tZW1fZnJlZShoZGRfaXBhKTsKKworCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKK30KKworLyoqCisgKiBoZGRfaXBhX2NsZWFudXAgLSBJUEEgY2xlYW51cCBmdW5jdGlvbgorICogQGhkZF9jdHg6IEhERCBnbG9iYWwgY29udGV4dAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitDREZfU1RBVFVTIGhkZF9pcGFfY2xlYW51cChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXN0cnVjdCBoZGRfaXBhX3ByaXYgKmhkZF9pcGEgPSBoZGRfY3R4LT5oZGRfaXBhOworCWludCBpOworCXN0cnVjdCBoZGRfaXBhX2lmYWNlX2NvbnRleHQgKmlmYWNlX2NvbnRleHQgPSBOVUxMOworCWNkZl9uYnVmX3Qgc2tiOworCXN0cnVjdCBoZGRfaXBhX3BtX3R4X2NiICpwbV90eF9jYiA9IE5VTEw7CisKKwlpZiAoIWhkZF9pcGFfaXNfZW5hYmxlZChoZGRfY3R4KSkKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWlmICghaGRkX2lwYV91Y19pc19lbmFibGVkKGhkZF9jdHgpKSB7CisJCXVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJmhkZF9pcGEtPmlwdjRfbm90aWZpZXIpOworCQloZGRfaXBhX3RlYXJkb3duX3N5c19waXBlKGhkZF9pcGEpOworCX0KKworCS8qIFRlYXJkb3duIElQQSBzeXNfcGlwZSBmb3IgTUNDICovCisJaWYgKGhkZF9pcGFfdWNfc3RhX2lzX2VuYWJsZWQoaGRkX2lwYS0+aGRkX2N0eCkpCisJCWhkZF9pcGFfdGVhcmRvd25fc3lzX3BpcGUoaGRkX2lwYSk7CisKKwloZGRfaXBhX2Rlc3Ryb3lfcm1fcmVzb3VyY2UoaGRkX2lwYSk7CisKKyNpZmRlZiBXTEFOX09QRU5fU09VUkNFCisJY2FuY2VsX3dvcmtfc3luYygmaGRkX2lwYS0+cG1fd29yayk7CisjZW5kaWYKKworCWNkZl9zcGluX2xvY2tfYmgoJmhkZF9pcGEtPnBtX2xvY2spOworCisJd2hpbGUgKCgoc2tiID0gY2RmX25idWZfcXVldWVfcmVtb3ZlKCZoZGRfaXBhLT5wbV9xdWV1ZV9oZWFkKSkgIT0gTlVMTCkpIHsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZoZGRfaXBhLT5wbV9sb2NrKTsKKworCQlwbV90eF9jYiA9IChzdHJ1Y3QgaGRkX2lwYV9wbV90eF9jYiAqKXNrYi0+Y2I7CisJCWlwYV9mcmVlX3NrYihwbV90eF9jYi0+aXBhX3R4X2Rlc2MpOworCisJCWNkZl9zcGluX2xvY2tfYmgoJmhkZF9pcGEtPnBtX2xvY2spOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJmhkZF9pcGEtPnBtX2xvY2spOworCisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJmhkZF9pcGEtPnBtX2xvY2spOworCisJLyogZGVzdG9yeSB0aGUgaW50ZXJmYWNlIGxvY2sgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSEREX0lQQV9NQVhfSUZBQ0U7IGkrKykgeworCQlpZmFjZV9jb250ZXh0ID0gJmhkZF9pcGEtPmlmYWNlX2NvbnRleHRbaV07CisJCWNkZl9zcGlubG9ja19kZXN0cm95KCZpZmFjZV9jb250ZXh0LT5pbnRlcmZhY2VfbG9jayk7CisJfQorCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGl0IGJ1dCBzdGlsbCBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gcGVuZGluZworCSAqIGRlc2NyaXB0b3IgaW4gSVBBIGhhcmR3YXJlCisJICovCisJaWYgKGhkZF9pcGEtPnBlbmRpbmdfaHdfZGVzY19jbnQgIT0gMCkgeworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIklQQSBQZW5kaW5nIHdyaXRlIGRvbmU6ICVkIFdhaXRpbmchIiwKKwkJCSAgICBoZGRfaXBhLT5wZW5kaW5nX2h3X2Rlc2NfY250KTsKKworCQlmb3IgKGkgPSAwOyBoZGRfaXBhLT5wZW5kaW5nX2h3X2Rlc2NfY250ICE9IDAgJiYgaSA8IDEwOyBpKyspIHsKKwkJCXVzbGVlcF9yYW5nZSgxMDAsIDEwMCk7CisJCX0KKworCQlIRERfSVBBX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgIklQQSBQZW5kaW5nIHdyaXRlIGRvbmU6IGRlc2M6ICVkICVzKCVkKSEiLAorCQkJICAgIGhkZF9pcGEtPnBlbmRpbmdfaHdfZGVzY19jbnQsCisJCQkgICAgaGRkX2lwYS0+cGVuZGluZ19od19kZXNjX2NudCA9PSAwID8gImNvbXBsZXRlZCIKKwkJCSAgICA6ICJsZWFrIiwgaSk7CisJfQorCWlmIChoZGRfaXBhX3VjX2lzX2VuYWJsZWQoaGRkX2N0eCkpIHsKKwkJaGRkX2lwYV91Y19ydF9kZWJ1Z19kZWluaXQoaGRkX2N0eCk7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAgICIlczogRGlzY29ubmVjdCBUWCBQSVBFIiwgX19mdW5jX18pOworCQlpcGFfZGlzY29ubmVjdF93ZGlfcGlwZShoZGRfaXBhLT50eF9waXBlX2hhbmRsZSk7CisJCUhERF9JUEFfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAgICIlczogRGlzY29ubmVjdCBSWCBQSVBFIiwgX19mdW5jX18pOworCQlpcGFfZGlzY29ubmVjdF93ZGlfcGlwZShoZGRfaXBhLT5yeF9waXBlX2hhbmRsZSk7CisJCWNkZl9tdXRleF9kZXN0cm95KCZoZGRfaXBhLT5ldmVudF9sb2NrKTsKKwkJY2RmX2xpc3RfZGVzdHJveSgmaGRkX2lwYS0+cGVuZGluZ19ldmVudCk7CisKKyNpZmRlZiBXTEFOX09QRU5fU09VUkNFCisJCWZvciAoaSA9IDA7IGkgPCBIRERfSVBBX1VDX09QQ09ERV9NQVg7IGkrKykgeworCQkJY2FuY2VsX3dvcmtfc3luYygmaGRkX2lwYS0+dWNfb3Bfd29ya1tpXS53b3JrKTsKKwkJCWhkZF9pcGEtPnVjX29wX3dvcmtbaV0ubXNnID0gTlVMTDsKKwkJfQorI2VuZGlmCisJfQorCisJY2RmX21lbV9mcmVlKGhkZF9pcGEpOworCWhkZF9jdHgtPmhkZF9pcGEgPSBOVUxMOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBJUEFfT0ZGTE9BRCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX2xyby5jIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX2xyby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjliZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfbHJvLmMKQEAgLTAsMCArMSw2NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiB3bGFuX2hkZF9scm8uYworICoKKyAqIFdMQU4gSEREIExSTyBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKyAqLworCisjaW5jbHVkZSA8d2xhbl9oZGRfaW5jbHVkZXMuaD4KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9scm8uaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9uYXBpLmg+CisjaW5jbHVkZSA8d21hX2FwaS5oPgorI2luY2x1ZGUgPG9sX3R4cnhfdHlwZXMuaD4KKyNpbmNsdWRlIDxvbF9jZmcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luZXRfbHJvLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworI2RlZmluZSBMUk9fTUFYX0FHR1JfU0laRSAxMDAKKworI2RlZmluZSBMUk9fVkFMSURfRklFTERTIFwKKwkoTFJPX0RFU0MgfCBMUk9fRUxJR0lCSUxJVFlfQ0hFQ0tFRCB8IExST19UQ1BfQUNLX05VTSB8IFwKKwkgTFJPX1RDUF9EQVRBX0NTVU0gfCBMUk9fVENQX1NFUV9OVU0gfCBMUk9fVENQX1dJTikKKworLyoqCisgKiBoZGRfbHJvX2dldF9za2JfaGVhZGVyKCkgLSBMUk8gY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBza2I6IG5ldHdvcmsgYnVmZmVyCisgKiBAaXBfaGRyOiBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIElQIGhlYWRlcgorICogQHRjcHVkcF9oZHI6IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgVENQIGhlYWRlcgorICogQGhkcl9mbGFnczogaW5kaWNhdGVzIGlmIHRoaXMgaXMgYSBUQ1AsIElQVjQgZnJhbWUKKyAqIEBwcml2OiBwcml2YXRlIGRyaXZlciBzcGVjaWZpYyBvcGFxdWUgcG9pbnRlcgorICoKKyAqIEdldCB0aGUgSVAgYW5kIFRDUCBoZWFkZXJzIGZyb20gdGhlIHNrYgorICoKKyAqIFJldHVybjogMCAtIHN1Y2Nlc3MsIDwgMCAtIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoZGRfbHJvX2dldF9za2JfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKippcF9oZHIsCisJdm9pZCAqKnRjcHVkcF9oZHIsIHU2NCAqaGRyX2ZsYWdzLCB2b2lkICpwcml2KQoreworCWlmIChOQlVGX0lQVjZfUFJPVE8oc2tiKSkgeworCQloZHJfZmxhZ3MgPSAwOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqaGRyX2ZsYWdzIHw9IChMUk9fSVBWNCB8IExST19UQ1ApOworCSgqaXBfaGRyKSA9IHNrYi0+ZGF0YTsKKwkoKnRjcHVkcF9oZHIpID0gc2tiLT5kYXRhICsgTkJVRl9UQ1BfT0ZGU0VUKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX2xyb19kZXNjX3Bvb2xfaW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgZnJlZSBwb29sIG9mIExSTworICogZGVzY3JpcHRvcnMKKyAqIEBscm9fZGVzY19wb29sOiBmcmVlIHBvb2wgb2YgdGhlIExSTyBkZXNjcmlwdG9ycworICogQGxyb19tZ3I6IExSTyBtYW5hZ2VyCisgKgorICogSW5pdGlhbGl6ZSBhIGxpc3QgdGhhdCBob2xkcyB0aGUgZnJlZSBMUk8gZGVzY3JpcHRvcnMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2xyb19kZXNjX3Bvb2xfaW5pdChzdHJ1Y3QgaGRkX2xyb19kZXNjX3Bvb2wgKmxyb19kZXNjX3Bvb2wsCisJIHN0cnVjdCBuZXRfbHJvX21nciAqbHJvX21ncikKK3sKKwlpbnQgaTsKKworCUlOSVRfTElTVF9IRUFEKCZscm9fZGVzY19wb29sLT5scm9fZnJlZV9saXN0X2hlYWQpOworCisJZm9yIChpID0gMDsgaSA8IExST19ERVNDX1BPT0xfU1o7IGkrKykgeworCQlscm9fZGVzY19wb29sLT5scm9fZGVzY19hcnJheVtpXS5scm9fZGVzYyA9CisJCQkgJmxyb19tZ3ItPmxyb19hcnJbaV07CisJCWxpc3RfYWRkX3RhaWwoJmxyb19kZXNjX3Bvb2wtPmxyb19kZXNjX2FycmF5W2ldLmxyb19ub2RlLAorCQkJICZscm9fZGVzY19wb29sLT5scm9fZnJlZV9saXN0X2hlYWQpOworCX0KKwljZGZfc3BpbmxvY2tfaW5pdCgmbHJvX2Rlc2NfcG9vbC0+bHJvX3Bvb2xfbG9jayk7Cit9CisKKy8qKgorICogaGRkX2xyb19kZXNjX2luZm9faW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgTFJPIGRlc2NyaXB0b3JzCisgKiBAaGRkX2luZm86IEhERCBMUk8gZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBJbml0aWFsaXplIHRoZSBmcmVlIHBvb2wgb2YgTFJPIGRlc2NyaXB0b3JzIGFuZCB0aGUgZW50cmllcworICogb2YgdGhlIGhhc2ggdGFibGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2xyb19kZXNjX2luZm9faW5pdChzdHJ1Y3QgaGRkX2xyb19zICpoZGRfaW5mbykKK3sKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgcG9vbCBvZiBmcmVlIExSTyBkZXNjLiovCisJaGRkX2xyb19kZXNjX3Bvb2xfaW5pdCgmaGRkX2luZm8tPmxyb19kZXNjX2luZm8ubHJvX2Rlc2NfcG9vbCwKKwkJIGhkZF9pbmZvLT5scm9fbWdyKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUgb2YgTFJPIGRlc2MuKi8KKwlmb3IgKGkgPSAwOyBpIDwgTFJPX0RFU0NfVEFCTEVfU1o7IGkrKykgeworCQkvKiBpbml0aWFsaXplIHRoZSBmbG93cyBpbiB0aGUgaGFzaCB0YWJsZSAqLworCQlJTklUX0xJU1RfSEVBRCgmaGRkX2luZm8tPmxyb19kZXNjX2luZm8uCisJCQkgbHJvX2hhc2hfdGFibGVbaV0ubHJvX2Rlc2NfbGlzdCk7CisJfQorCisJY2RmX3NwaW5sb2NrX2luaXQoJmhkZF9pbmZvLT5scm9fZGVzY19pbmZvLmxyb19oYXNoX2xvY2spOworfQorCisvKioKKyAqIGhkZF9scm9fZGVzY19wb29sX2RlaW5pdCgpIC0gRnJlZSB0aGUgTFJPIGRlc2NyaXB0b3IgbGlzdAorICogQGhkZF9pbmZvOiBIREQgTFJPIGRhdGEgc3RydWN0dXJlCisgKgorICogRnJlZSB0aGUgcG9vbCBvZiBMUk8gZGVzY3JpcHRvcnMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2xyb19kZXNjX3Bvb2xfZGVpbml0KHN0cnVjdCBoZGRfbHJvX2Rlc2NfcG9vbCAqbHJvX2Rlc2NfcG9vbCkKK3sKKworCWlmIChscm9fZGVzY19wb29sLT5scm9fZGVzY19hcnJheSkgeworCQljZGZfbWVtX2ZyZWUobHJvX2Rlc2NfcG9vbC0+bHJvX2Rlc2NfYXJyYXkpOworCQlscm9fZGVzY19wb29sLT5scm9fZGVzY19hcnJheSA9IE5VTEw7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmxyb19kZXNjX3Bvb2wtPmxyb19mcmVlX2xpc3RfaGVhZCk7CisKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmbHJvX2Rlc2NfcG9vbC0+bHJvX3Bvb2xfbG9jayk7Cit9CisKKy8qKgorICogaGRkX2xyb19kZXNjX2luZm9fZGVpbml0KCkgLSBEZWluaXRpYWxpemUgdGhlIExSTyBkZXNjcmlwdG9ycworICoKKyAqIEBoZGRfaW5mbzogSEREIExSTyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIERlaW5pdGlhbGl6ZSB0aGUgZnJlZSBwb29sIG9mIExSTyBkZXNjcmlwdG9ycyBhbmQgdGhlIGVudHJpZXMKKyAqIG9mIHRoZSBoYXNoIHRhYmxlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9scm9fZGVzY19pbmZvX2RlaW5pdChzdHJ1Y3QgaGRkX2xyb19zICpoZGRfaW5mbykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaGRkX2xyb19kZXNjX2luZm8gKmRlc2NfaW5mbyA9ICZoZGRfaW5mby0+bHJvX2Rlc2NfaW5mbzsKKworCWNkZl9tZW1fZnJlZShoZGRfaW5mby0+bHJvX21nci0+bHJvX2Fycik7CisJaGRkX2luZm8tPmxyb19tZ3ItPmxyb19hcnIgPSBOVUxMOworCWhkZF9scm9fZGVzY19wb29sX2RlaW5pdCgmZGVzY19pbmZvLT5scm9fZGVzY19wb29sKTsKKwkvKiBGcmVlIHRoZSBhIGxpc3Qgb2YgTFJPIGRlc2MgZm9yIGVhY2ggZW50cnkgb2YgdGhlIGhhc2ggdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTFJPX0RFU0NfVEFCTEVfU1o7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoJmRlc2NfaW5mby0+bHJvX2hhc2hfdGFibGVbaV0ubHJvX2Rlc2NfbGlzdCk7CisKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmZGVzY19pbmZvLT5scm9faGFzaF9sb2NrKTsKKwljZGZfbWVtX2ZyZWUoZGVzY19pbmZvLT5scm9faGFzaF90YWJsZSk7CisJZGVzY19pbmZvLT5scm9faGFzaF90YWJsZSA9IE5VTEw7Cit9CisKKy8qKgorICogaGRkX2xyb190Y3BfZmxvd19tYXRjaCgpIC0gZnVuY3Rpb24gdG8gY2hlY2sgZm9yIGEgZmxvdyBtYXRjaAorICogQGlwaDogSVAgaGVhZGVyCisgKiBAdGNwaDogVENQIGhlYWRlcgorICogQGxyb19kZXNjOiBMUk8gZGVjcmlwdG9yCisgKgorICogQ2hlY2tzIGlmIHRoZSBkZXNjcmlwdG9yIGJlbG9uZ3MgdG8gdGhlIHNhbWUgZmxvdyBhcyB0aGUgb25lCisgKiBpbmRpY2F0ZWQgYnkgdGhlIFRDUCBhbmQgSVAgaGVhZGVyLgorICoKKyAqIFJldHVybjogdHJ1ZSAtIGZsb3cgbWF0Y2gsIGZhbHNlIC0gZmxvdyBkb2VzIG5vdCBtYXRjaAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaGRkX2xyb190Y3BfZmxvd19tYXRjaChzdHJ1Y3QgbmV0X2xyb19kZXNjICpscm9fZGVzYywKKwkgc3RydWN0IGlwaGRyICppcGgsCisJIHN0cnVjdCB0Y3BoZHIgKnRjcGgpCit7CisJaWYgKChscm9fZGVzYy0+dGNwaC0+c291cmNlICE9IHRjcGgtPnNvdXJjZSkgfHwKKwkJIChscm9fZGVzYy0+dGNwaC0+ZGVzdCAhPSB0Y3BoLT5kZXN0KSB8fAorCQkgKGxyb19kZXNjLT5pcGgtPnNhZGRyICE9IGlwaC0+c2FkZHIpIHx8CisJCSAobHJvX2Rlc2MtPmlwaC0+ZGFkZHIgIT0gaXBoLT5kYWRkcikpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworCit9CisKKy8qKgorICogaGRkX2xyb19kZXNjX2ZpbmQoKSAtIExSTyBkZXNjcmlwdG9yIGxvb2stdXAgZnVuY3Rpb24KKyAqCisgKiBAYWRhcHRlcjogSEREIGFkYXB0b3IKKyAqIEBza2I6IG5ldHdvcmsgYnVmZmVyCisgKiBAaXBoOiBJUCBoZWFkZXIKKyAqIEB0Y3BoOiBUQ1AgaGVhZGVyCisgKiBAbHJvX2Rlc2M6IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgTFJPIGRlY3JpcHRvcgorICoKKyAqIExvb2stdXAgdGhlIExSTyBkZXNjcmlwdG9yIGluIHRoZSBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZQorICogZmxvdyBJRCB0b2VwbGl0ei4gSWYgdGhlIGZsb3cgaXMgbm90IGZvdW5kLCBhbGxvY2F0ZXMgYSBuZXcKKyAqIExSTyBkZXNjcmlwdG9yIGFuZCBwbGFjZXMgaXQgaW4gdGhlIGhhc2ggdGFibGUKKyAqCisgKiBSZXR1cm46IDAgLSBzdWNjZXNzLCA8IDAgLSBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgaGRkX2xyb19kZXNjX2ZpbmQoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwaGRyICppcGgsIHN0cnVjdCB0Y3BoZHIgKnRjcGgsCisJIHN0cnVjdCBuZXRfbHJvX2Rlc2MgKipscm9fZGVzYykKK3sKKwl1aW50MzJfdCBpOworCXN0cnVjdCBoZGRfbHJvX2Rlc2NfdGFibGUgKmxyb19oYXNoX3RhYmxlOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3QgaGRkX2xyb19kZXNjX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaGRkX2xyb19kZXNjX3Bvb2wgZnJlZV9wb29sOworCXN0cnVjdCBoZGRfbHJvX2Rlc2NfaW5mbyAqZGVzY19pbmZvID0gJmFkYXB0ZXItPmxyb19pbmZvLmxyb19kZXNjX2luZm87CisKKwkqbHJvX2Rlc2MgPSBOVUxMOworCWkgPSBOQlVGX0ZMT1dfSURfVE9FUExJVFooc2tiKSAmIExST19ERVNDX1RBQkxFX1NaX01BU0s7CisKKwlscm9faGFzaF90YWJsZSA9ICZkZXNjX2luZm8tPmxyb19oYXNoX3RhYmxlW2ldOworCisJaWYgKCFscm9faGFzaF90YWJsZSkgeworCQloZGRfZXJyKCJJbnZhbGlkIGhhc2ggZW50cnkiKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2RmX3NwaW5fbG9ja19iaCgmZGVzY19pbmZvLT5scm9faGFzaF9sb2NrKTsKKwkvKiBDaGVjayBpZiB0aGlzIGZsb3cgZXhpc3RzIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoKHB0ciwgJmxyb19oYXNoX3RhYmxlLT5scm9fZGVzY19saXN0KSB7CisJCXN0cnVjdCBuZXRfbHJvX2Rlc2MgKnRtcF9scm9fZGVzYyA9IE5VTEw7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBoZGRfbHJvX2Rlc2NfZW50cnksIGxyb19ub2RlKTsKKwkJdG1wX2xyb19kZXNjID0gZW50cnktPmxyb19kZXNjOworCQlpZiAodG1wX2xyb19kZXNjLT5hY3RpdmUpIHsKKwkJCWlmIChoZGRfbHJvX3RjcF9mbG93X21hdGNoKHRtcF9scm9fZGVzYywgaXBoLCB0Y3BoKSkgeworCQkJCSpscm9fZGVzYyA9IGVudHJ5LT5scm9fZGVzYzsKKwkJCQljZGZfc3Bpbl91bmxvY2tfYmgoJmRlc2NfaW5mby0+bHJvX2hhc2hfbG9jayk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZkZXNjX2luZm8tPmxyb19oYXNoX2xvY2spOworCisJLyogbm8gZXhpc3RpbmcgZmxvdyBmb3VuZCwgYSBuZXcgTFJPIGRlc2MgbmVlZHMgdG8gYmUgYWxsb2NhdGVkICovCisJZnJlZV9wb29sID0gYWRhcHRlci0+bHJvX2luZm8ubHJvX2Rlc2NfaW5mby5scm9fZGVzY19wb29sOworCWNkZl9zcGluX2xvY2tfYmgoJmZyZWVfcG9vbC5scm9fcG9vbF9sb2NrKTsKKwllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgKKwkJICZmcmVlX3Bvb2wubHJvX2ZyZWVfbGlzdF9oZWFkLAorCQkgc3RydWN0IGhkZF9scm9fZGVzY19lbnRyeSwgbHJvX25vZGUpOworCWlmIChOVUxMID09IGVudHJ5KSB7CisJCWhkZF9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBMUk8gZGVzYyEiKTsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZmcmVlX3Bvb2wubHJvX3Bvb2xfbG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5scm9fbm9kZSk7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZmcmVlX3Bvb2wubHJvX3Bvb2xfbG9jayk7CisKKwlpZiAoTlVMTCA9PSBlbnRyeS0+bHJvX2Rlc2MpIHsKKwkJaGRkX2VycigiZW50cnktPmxyb19kZXNjIGlzIE5VTEwhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2RmX21lbV96ZXJvKCh2b2lkICopZW50cnktPmxyb19kZXNjLCBzaXplb2Yoc3RydWN0IG5ldF9scm9fZGVzYykpOworCisJLyoKKwkgKiBscm9fZGVzYy0+YWN0aXZlIHNob3VsZCBiZSAwIGFuZCBscm9fZGVzYy0+dGNwX3Jjdl90c3ZhbAorCSAqIHNob3VsZCBiZSAwIGZvciBuZXdseSBhbGxvY2F0ZWQgbHJvIGRlc2NyaXB0b3JzCisJICovCisJY2RmX3NwaW5fbG9ja19iaCgmZGVzY19pbmZvLT5scm9faGFzaF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bHJvX25vZGUsCisJCSAmbHJvX2hhc2hfdGFibGUtPmxyb19kZXNjX2xpc3QpOworCWNkZl9zcGluX3VubG9ja19iaCgmZGVzY19pbmZvLT5scm9faGFzaF9sb2NrKTsKKwkqbHJvX2Rlc2MgPSBlbnRyeS0+bHJvX2Rlc2M7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfbHJvX2dldF9kZXNjKCkgLSBMUk8gZGVzY3JpcHRvciBsb29rLXVwIGZ1bmN0aW9uCisgKiBAaXBoOiBJUCBoZWFkZXIKKyAqIEB0Y3BoOiBUQ1AgaGVhZGVyCisgKiBAbHJvX2FycjogQXJyYXkgb2YgTFJPIGRlY3JpcHRvcnMKKyAqIEBscm9fbWdyOiBMUk8gbWFuYWdlcgorICoKKyAqIExvb2tzLXVwIHRoZSBMUk8gZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBmbG93CisgKgorICogUmV0dXJuOiBMUk8gZGVzY3JpcHRvcgorICovCitzdGF0aWMgc3RydWN0IG5ldF9scm9fZGVzYyAqaGRkX2xyb19nZXRfZGVzYyhzdHJ1Y3QgbmV0X2xyb19tZ3IgKmxyb19tZ3IsCisJIHN0cnVjdCBuZXRfbHJvX2Rlc2MgKmxyb19hcnIsCisJIHN0cnVjdCBpcGhkciAqaXBoLAorCSBzdHJ1Y3QgdGNwaGRyICp0Y3BoKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxyb19tZ3ItPm1heF9kZXNjOyBpKyspIHsKKwkJaWYgKGxyb19hcnJbaV0uYWN0aXZlKQorCQkJaWYgKGhkZF9scm9fdGNwX2Zsb3dfbWF0Y2goJmxyb19hcnJbaV0sIGlwaCwgdGNwaCkpCisJCQkJcmV0dXJuICZscm9fYXJyW2ldOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGhkZF9scm9fZWxpZ2libGUoKSAtIExSTyBlbGlnaWJpbHR5IGNoZWNrCisgKiBAaXBoOiBJUCBoZWFkZXIKKyAqIEB0Y3BoOiBUQ1AgaGVhZGVyCisgKiBAYWRhcHRlcjogSEREIGFkYXB0b3IKKyAqIEBkZXNjOiBMUk8gZGVzY3JpcHRvcgorICogQHNrYjogbmV0d29yayBidWZmZXIKKyAqCisgKiBEZXRlcm1pbmVzIGlmIHRoZSBmcmFtZSBpcyBMUk8gZWxpZ2libGUKKyAqCisgKiBSZXR1cm46IHRydWUgLSBMUk8gZWxpZ2libGUgZnJhbWUsIGZhbHNlIC0gZnJhbWUgaXMgbm90IExSTworICogZWxpZ2libGUKKyAqLworc3RhdGljIGJvb2wgaGRkX2xyb19lbGlnaWJsZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSBzdHJ1Y3QgaXBoZHIgKmlwaCwgc3RydWN0IHRjcGhkciAqdGNwaCwgc3RydWN0IG5ldF9scm9fZGVzYyAqKmRlc2MpCit7CisJc3RydWN0IG5ldF9scm9fZGVzYyAqbHJvX2Rlc2MgPSBOVUxMOworCWludCBod19scm9fZWxpZ2libGUgPQorCQkgTkJVRl9MUk9fRUxJR0lCTEUoc2tiKSAmJiAoIU5CVUZfVENQX1BVUkVfQUNLKHNrYikpOworCisJaWYgKCFod19scm9fZWxpZ2libGUpCisJCXJldHVybiBmYWxzZTsKKworCWlmICgwICE9IGhkZF9scm9fZGVzY19maW5kKGFkYXB0ZXIsIHNrYiwgaXBoLCB0Y3BoLCBkZXNjKSkgeworCQloZGRfZXJyKCJmaW5kaW5nIHRoZSBMUk8gZGVzYyBmYWlsZWQiKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWxyb19kZXNjID0gKmRlc2M7CisJaWYgKCFscm9fZGVzYykKKwkJcmV0dXJuIGZhbHNlOworCisJLyogaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IHNrYiwgY2hlY2sgdGhlIHRpbWVzdGFtcCBvcHRpb24gKi8KKwlpZiAobHJvX2Rlc2MtPnRjcF9yY3ZfdHN2YWwpIHsKKwkJaWYgKHRjcGgtPmRvZmYgPT0gOCkgeworCQkJX19iZTMyICp0b3B0ID0gKF9fYmUzMiAqKSh0Y3BoICsgMSk7CisKKwkJCWlmICgqdG9wdCAhPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkKKwkJCQkgfChUQ1BPUFRfTk9QIDw8IDE2KQorCQkJCSB8IChUQ1BPUFRfVElNRVNUQU1QIDw8IDgpCisJCQkJIHwgVENQT0xFTl9USU1FU1RBTVApKQorCQkJCXJldHVybiB0cnVlOworCisJCQkvKiB0aW1lc3RhbXAgc2hvdWxkIGJlIGluIHJpZ2h0IG9yZGVyICovCisJCQl0b3B0Kys7CisJCQlpZiAoYWZ0ZXIobnRvaGwobHJvX2Rlc2MtPnRjcF9yY3ZfdHN2YWwpLAorCQkJCQkgbnRvaGwoKnRvcHQpKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCS8qIHRpbWVzdGFtcCByZXBseSBzaG91bGQgbm90IGJlIHplcm8gKi8KKwkJCXRvcHQrKzsKKwkJCWlmICgqdG9wdCA9PSAwKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGhkZF9scm9fZGVzY19mcmVlKCkgLSBGcmVlIHRoZSBMUk8gZGVzY3JpcHRvcgorICogQGFkYXB0ZXI6IEhERCBhZGFwdG9yCisgKiBAZGVzYzogTFJPIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm4gdGhlIExSTyBkZXNjcmlwdG9yIHRvIHRoZSBmcmVlIHBvb2wKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2xyb19kZXNjX2ZyZWUoc3RydWN0IG5ldF9scm9fZGVzYyAqZGVzYywKKwkgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaGRkX2xyb19kZXNjX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbmV0X2xyb19kZXNjICphcnJfYmFzZSA9IGFkYXB0ZXItPmxyb19pbmZvLmxyb19tZ3ItPmxyb19hcnI7CisJc3RydWN0IGhkZF9scm9fZGVzY19pbmZvICpkZXNjX2luZm8gPSAmYWRhcHRlci0+bHJvX2luZm8ubHJvX2Rlc2NfaW5mbzsKKwlpbnQgaSA9IGRlc2MgLSBhcnJfYmFzZTsKKworCWlmIChpID49IExST19ERVNDX1BPT0xfU1opIHsKKwkJaGRkX2VycigiaW52YWxpZCBpbmRleCAlZCIsIGkpOworCQlyZXR1cm47CisJfQorCisJZW50cnkgPSAmZGVzY19pbmZvLT5scm9fZGVzY19wb29sLmxyb19kZXNjX2FycmF5W2ldOworCisJY2RmX3NwaW5fbG9ja19iaCgmZGVzY19pbmZvLT5scm9faGFzaF9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZlbnRyeS0+bHJvX25vZGUpOworCWNkZl9zcGluX3VubG9ja19iaCgmZGVzY19pbmZvLT5scm9faGFzaF9sb2NrKTsKKworCWNkZl9zcGluX2xvY2tfYmgoJmRlc2NfaW5mby0+bHJvX2Rlc2NfcG9vbC5scm9fcG9vbF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bHJvX25vZGUsICZkZXNjX2luZm8tPgorCQkgbHJvX2Rlc2NfcG9vbC5scm9fZnJlZV9saXN0X2hlYWQpOworCWNkZl9zcGluX3VubG9ja19iaCgmZGVzY19pbmZvLT5scm9fZGVzY19wb29sLmxyb19wb29sX2xvY2spOworfQorCisvKioKKyAqIGhkZF9scm9fZmx1c2hfcGt0KCkgLSBmdW5jdGlvbiB0byBmbHVzaCB0aGUgTFJPIGZsb3cKKyAqIEBpcGg6IElQIGhlYWRlcgorICogQHRjcGg6IFRDUCBoZWFkZXIKKyAqIEBhZGFwdGVyOiBIREQgYWRhcHRvcgorICogQGxyb19tZ3I6IExSTyBtYW5hZ2VyCisgKgorICogRmx1c2ggYWxsIHRoZSBwYWNrZXRzIGFnZ3JlZ2F0ZWQgaW4gdGhlIExSTyBtYW5hZ2VyIGZvciB0aGUKKyAqIGZsb3cgaW5kaWNhdGVkIGJ5IHRoZSBUQ1AgYW5kIElQIGhlYWRlcgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGhkZF9scm9fZmx1c2hfcGt0KHN0cnVjdCBuZXRfbHJvX21nciAqbHJvX21nciwKKwkgc3RydWN0IGlwaGRyICppcGgsIHN0cnVjdCB0Y3BoZHIgKnRjcGgsIGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9scm9fZGVzYyAqbHJvX2Rlc2M7CisKKwlscm9fZGVzYyA9IGhkZF9scm9fZ2V0X2Rlc2MobHJvX21nciwgbHJvX21nci0+bHJvX2FyciwgaXBoLCB0Y3BoKTsKKworCWlmICghbHJvX2Rlc2MpCisJCXJldHVybjsKKworCWhkZF9scm9fZGVzY19mcmVlKGxyb19kZXNjLCBhZGFwdGVyKTsKKwlscm9fZmx1c2hfZGVzYyhscm9fbWdyLCBscm9fZGVzYyk7Cit9CisKKy8qKgorICogaGRkX2xyb19mbHVzaCgpIC0gTFJPIGZsdXNoIGNhbGxiYWNrCisgKiBAZGF0YTogb3BhcXVlIHBvaW50ZXIgY29udGFpbmluZyBIREQgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayByZWdpc3RlcmVkIHRvIGZsdXNoIGFsbCB0aGUgcGFja2V0cyBhZ2dyZWdhdGVkIGluCisgKiB0aGUgTFJPIG1hbmFnZXIgZm9yIGFsbCB0aGUgZmxvd3MKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfbHJvX2ZsdXNoKHZvaWQgKmRhdGEpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IChoZGRfYWRhcHRlcl90ICopZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5scm9faW5mby5scm9fbWdyLT5tYXhfZGVzYzsgaSsrKSB7CisJCWlmIChhZGFwdGVyLT5scm9faW5mby5scm9fbWdyLT5scm9fYXJyW2ldLmFjdGl2ZSkgeworCQkJaGRkX2xyb19kZXNjX2ZyZWUoCisJCQkJICZhZGFwdGVyLT5scm9faW5mby5scm9fbWdyLT5scm9fYXJyW2ldLAorCQkJCSAodm9pZCAqKWFkYXB0ZXIpOworCQkJbHJvX2ZsdXNoX2Rlc2MoYWRhcHRlci0+bHJvX2luZm8ubHJvX21nciwKKwkJCQkgJmFkYXB0ZXItPmxyb19pbmZvLmxyb19tZ3ItPmxyb19hcnJbaV0pOworCQl9CisJfQorfQorCisvKioKKyAqIGhkZF9scm9faW5pdCgpIC0gaW5pdGlhbGl6YXRpb24gZm9yIExSTworICogQGhkZF9jdHg6IEhERCBjb250ZXh0CisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgTFJPIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGZpcm13YXJlCisgKiB2aWEgV01BCisgKgorICogUmV0dXJuOiAwIC0gc3VjY2VzcywgPCAwIC0gZmFpbHVyZQorICovCitpbnQgaGRkX2xyb19pbml0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJc3RydWN0IHdtYV9scm9fY29uZmlnX2NtZF90IGxyb19jb25maWc7CisKKwlpZiAoIWhkZF9jdHgtPmNvbmZpZy0+bHJvX2VuYWJsZSkgeworCQloZGRfZXJyKEZMKCJMUk8gRGlzYWJsZWQiKSk7CisJCXJldHVybiAwOworCX0KKworCWxyb19jb25maWcubHJvX2VuYWJsZSA9IDE7CisJbHJvX2NvbmZpZy50Y3BfZmxhZyA9IFRDUEhEUl9BQ0s7CisJbHJvX2NvbmZpZy50Y3BfZmxhZ19tYXNrID0gVENQSERSX0ZJTiB8IFRDUEhEUl9TWU4gfCBUQ1BIRFJfUlNUIHwKKwkJVENQSERSX0FDSyB8IFRDUEhEUl9VUkcgfCBUQ1BIRFJfRUNFIHwgVENQSERSX0NXUjsKKworCWdldF9yYW5kb21fYnl0ZXMobHJvX2NvbmZpZy50b2VwbGl0el9oYXNoX2lwdjQsCisJCSAoc2l6ZW9mKGxyb19jb25maWcudG9lcGxpdHpfaGFzaF9pcHY0WzBdKSAqCisJCSBMUk9fSVBWNF9TRUVEX0FSUl9TWikpOworCisJZ2V0X3JhbmRvbV9ieXRlcyhscm9fY29uZmlnLnRvZXBsaXR6X2hhc2hfaXB2NiwKKwkJIChzaXplb2YobHJvX2NvbmZpZy50b2VwbGl0el9oYXNoX2lwdjZbMF0pICoKKwkJIExST19JUFY2X1NFRURfQVJSX1NaKSk7CisKKwloZGRfZGVidWcoInNlbmRpbmcgdGhlIExSTyBjb25maWd1cmF0aW9uIHRvIHRoZSBmdyIpOworCWlmICgwICE9IHdtYV9scm9faW5pdCgmbHJvX2NvbmZpZykpIHsKKwkJaGRkX2VycigiRmFpbGVkIHRvIHNlbmQgTFJPIGNvbmZpZ3VyYXRpb24hIik7CisJCWhkZF9jdHgtPmNvbmZpZy0+bHJvX2VuYWJsZSA9IDA7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9scm9fZW5hYmxlKCkgLSBlbmFibGUgTFJPCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqIEBhZGFwdGVyOiBIREQgYWRhcHRlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBMUk8gaW4gdGhlIG5ldHdvcmsgZGV2aWNlIGF0dGFjaGVkIHRvCisgKiB0aGUgSEREIGFkYXB0ZXIuIEl0IGFsc28gYWxsb2NhdGVzIHRoZSBIREQgTFJPIGluc3RhbmNlIGZvcgorICogdGhhdCBuZXR3b3JrIGRldmljZQorICoKKyAqIFJldHVybjogMCAtIHN1Y2Nlc3MsIDwgMCAtIGZhaWx1cmUKKyAqLworaW50IGhkZF9scm9fZW5hYmxlKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJIGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJc3RydWN0IGhkZF9scm9fcyAqaGRkX2xybzsKKwlzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlzaXplX3QgbHJvX21ncl9zeiwgZGVzY19hcnJfc3osIGRlc2NfcG9vbF9zeiwgaGFzaF90YWJsZV9zejsKKwl1aW50OF90ICpscm9fbWVtX3B0cjsKKworCWlmICghaGRkX2N0eC0+Y29uZmlnLT5scm9fZW5hYmxlIHx8CisJCSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICE9IGFkYXB0ZXItPndkZXYuaWZ0eXBlKSB7CisJCWhkZF9pbmZvKCJMUk8gRGlzYWJsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaGRkX2luZm8oIkxSTyBFbmFibGVkIik7CisKKwloZGRfbHJvID0gJmFkYXB0ZXItPmxyb19pbmZvOworCWNkZl9tZW1femVybygodm9pZCAqKWhkZF9scm8sIHNpemVvZihzdHJ1Y3QgaGRkX2xyb19zKSk7CisJLyoKKwkqIEFsbG9jYXRlIGFsbCB0aGUgTFJPIGRhdGEgc3RydWN0dXJlcyBhdCBvbmNlIGFuZCB0aGVuIGNhcnZlCisJKiB0aGVtIHVwIGFzIG5lZWRlZAorCSovCisJbHJvX21ncl9zeiA9IHNpemVvZihzdHJ1Y3QgbmV0X2xyb19tZ3IpOworCWRlc2NfYXJyX3N6ID0gKExST19ERVNDX1BPT0xfU1ogKiBzaXplb2Yoc3RydWN0IG5ldF9scm9fZGVzYykpOworCWRlc2NfcG9vbF9zeiA9IChMUk9fREVTQ19QT09MX1NaICogc2l6ZW9mKHN0cnVjdCBoZGRfbHJvX2Rlc2NfZW50cnkpKTsKKwloYXNoX3RhYmxlX3N6ID0gKHNpemVvZihzdHJ1Y3QgaGRkX2xyb19kZXNjX3RhYmxlKSAqIExST19ERVNDX1RBQkxFX1NaKTsKKworCWxyb19tZW1fcHRyID0gY2RmX21lbV9tYWxsb2MobHJvX21ncl9zeiArIGRlc2NfYXJyX3N6ICsgZGVzY19wb29sX3N6ICsKKwkJIGhhc2hfdGFibGVfc3opOworCisJaWYgKE5VTEwgPT0gbHJvX21lbV9wdHIpIHsKKwkJaGRkX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgTFJPIik7CisJCWhkZF9jdHgtPmNvbmZpZy0+bHJvX2VuYWJsZSA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIExSTyBtYW5hZ2VyICovCisJaGRkX2xyby0+bHJvX21nciA9IChzdHJ1Y3QgbmV0X2xyb19tZ3IgKilscm9fbWVtX3B0cjsKKwlscm9fbWVtX3B0ciArPSBscm9fbWdyX3N6OworCisJLyogTFJPIGRlY3JpcHRvciBhcnJheSAqLworCWhkZF9scm8tPmxyb19tZ3ItPmxyb19hcnIgPSAoc3RydWN0IG5ldF9scm9fZGVzYyAqKWxyb19tZW1fcHRyOworCWxyb19tZW1fcHRyICs9IGRlc2NfYXJyX3N6OworCisJLyogTFJPIGRlc2NyaXB0b3IgcG9vbCAqLworCWhkZF9scm8tPmxyb19kZXNjX2luZm8ubHJvX2Rlc2NfcG9vbC5scm9fZGVzY19hcnJheSA9CisJCSAoc3RydWN0IGhkZF9scm9fZGVzY19lbnRyeSAqKWxyb19tZW1fcHRyOworCWxyb19tZW1fcHRyICs9IGRlc2NfcG9vbF9zejsKKworCS8qIGhhc2ggdGFibGUgdG8gc3RvcmUgdGhlIExSTyBkZXNjcmlwdG9ycyAqLworCWhkZF9scm8tPmxyb19kZXNjX2luZm8ubHJvX2hhc2hfdGFibGUgPQorCQkgKHN0cnVjdCBoZGRfbHJvX2Rlc2NfdGFibGUgKilscm9fbWVtX3B0cjsKKworCS8qIEluaXRpYWxpemUgdGhlIExSTyBkZXNjcmlwdG9ycyAqLworCSBoZGRfbHJvX2Rlc2NfaW5mb19pbml0KGhkZF9scm8pOworCisJaGRkX2xyby0+bHJvX21nci0+ZGV2ID0gYWRhcHRlci0+ZGV2OworCWlmIChvbF9jZmdfaXNfcnhfdGhyZWFkX2VuYWJsZWQocGRldi0+Y3RybF9wZGV2KSkKKwkJaGRkX2xyby0+bHJvX21nci0+ZmVhdHVyZXMgPSBMUk9fRl9OSTsKKworCWlmIChoZGRfbmFwaV9lbmFibGVkKEhERF9OQVBJX0FOWSkpCisJCWhkZF9scm8tPmxyb19tZ3ItPmZlYXR1cmVzIHw9IExST19GX05BUEk7CisKKwloZGRfbHJvLT5scm9fbWdyLT5pcF9zdW1tZWRfYWdnciA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCWhkZF9scm8tPmxyb19tZ3ItPm1heF9hZ2dyID0gTFJPX01BWF9BR0dSX1NJWkU7CisJaGRkX2xyby0+bHJvX21nci0+Z2V0X3NrYl9oZWFkZXIgPSBoZGRfbHJvX2dldF9za2JfaGVhZGVyOworCWhkZF9scm8tPmxyb19tZ3ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCWhkZF9scm8tPmxyb19tZ3ItPm1heF9kZXNjID0gTFJPX0RFU0NfUE9PTF9TWjsKKworCWFkYXB0ZXItPmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MUk87CisKKwkvKiBSZWdpc3RlciB0aGUgZmx1c2ggY2FsbGJhY2sgKi8KKwlvbF9yZWdpc3Rlcl9scm9fZmx1c2hfY2IoaGRkX2xyb19mbHVzaCwgYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfbHJvX2Rpc2FibGUoKSAtIGRpc2FibGUgTFJPCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqIEBhZGFwdGVyOiBIREQgYWRhcHRlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIEhERCBMUk8gaW5zdGFuY2UgZm9yIHRoZSBuZXR3b3JrCisgKiBkZXZpY2UgYXR0YWNoZWQgdG8gdGhlIEhERCBhZGFwdGVyCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaGRkX2xyb19kaXNhYmxlKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJaWYgKCFoZGRfY3R4LT5jb25maWctPmxyb19lbmFibGUgfHwKKwkJIE5MODAyMTFfSUZUWVBFX1NUQVRJT04gIT0gYWRhcHRlci0+d2Rldi5pZnR5cGUpCisJCXJldHVybjsKKworCWhkZF9scm9fZGVzY19pbmZvX2RlaW5pdCgmYWRhcHRlci0+bHJvX2luZm8pOworCWNkZl9tZW1fZnJlZShhZGFwdGVyLT5scm9faW5mby5scm9fbWdyKTsKKwlhZGFwdGVyLT5scm9faW5mby5scm9fbWdyID0gTlVMTDsKKwlyZXR1cm47Cit9CisKKy8qKgorICogaGRkX2xyb19yeCgpIC0gTFJPIHJlY2VpdmUgZnVuY3Rpb24KKyAqIEBoZGRfY3R4OiBIREQgY29udGV4dAorICogQGFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKiBAc2tiOiBuZXR3b3JrIGJ1ZmZlcgorICoKKyAqIERlbGl2ZXJzIExSTyBlbGlnaWJsZSBmcmFtZXMgdG8gdGhlIExSTyBtYW5hZ2VyCisgKgorICogUmV0dXJuOiBIRERfTFJPX1JYIC0gZnJhbWUgZGVsaXZlcmVkIHRvIExSTyBtYW5hZ2VyCisgKiBIRERfTFJPX05PX1JYIC0gZnJhbWUgbm90IGRlbGl2ZXJlZAorICovCitlbnVtIGhkZF9scm9fcnhfc3RhdHVzIGhkZF9scm9fcngoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkgaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwllbnVtIGhkZF9scm9fcnhfc3RhdHVzIHN0YXR1cyA9IEhERF9MUk9fTk9fUlg7CisKKwlpZiAoKGFkYXB0ZXItPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykgJiYKKwkJIE5CVUZfVENQX1BST1RPKHNrYikpIHsKKwkJc3RydWN0IGlwaGRyICppcGg7CisJCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CisJCXN0cnVjdCBuZXRfbHJvX2Rlc2MgKmxyb19kZXNjID0gTlVMTDsKKwkJaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKKwkJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYi0+ZGF0YSArIE5CVUZfVENQX09GRlNFVChza2IpKTsKKwkJaWYgKGhkZF9scm9fZWxpZ2libGUoYWRhcHRlciwgc2tiLCBpcGgsIHRjcGgsICZscm9fZGVzYykpIHsKKwkJCXN0cnVjdCBuZXRfbHJvX2luZm8gaGRkX2xyb19pbmZvOworCisJCQloZGRfbHJvX2luZm8udmFsaWRfZmllbGRzID0gTFJPX1ZBTElEX0ZJRUxEUzsKKworCQkJaGRkX2xyb19pbmZvLmxyb19kZXNjID0gbHJvX2Rlc2M7CisJCQloZGRfbHJvX2luZm8ubHJvX2VsaWdpYmxlID0gMTsKKwkJCWhkZF9scm9faW5mby50Y3BfYWNrX251bSA9IE5CVUZfVENQX0FDS19OVU0oc2tiKTsKKwkJCWhkZF9scm9faW5mby50Y3BfZGF0YV9jc3VtID0KKwkJCQkgY3N1bV91bmZvbGQoaHRvbnMoTkJVRl9UQ1BfQ0hLU1VNKHNrYikpKTsKKwkJCWhkZF9scm9faW5mby50Y3Bfc2VxX251bSA9IE5CVUZfVENQX1NFUV9OVU0oc2tiKTsKKwkJCWhkZF9scm9faW5mby50Y3Bfd2luID0gTkJVRl9UQ1BfV0lOKHNrYik7CisKKwkJCWxyb19yZWNlaXZlX3NrYl9leHQoYWRhcHRlci0+bHJvX2luZm8ubHJvX21nciwgc2tiLAorCQkJCSAodm9pZCAqKWFkYXB0ZXIsICZoZGRfbHJvX2luZm8pOworCisJCQlpZiAoIWhkZF9scm9faW5mby5scm9fZGVzYy0+YWN0aXZlKQorCQkJCWhkZF9scm9fZGVzY19mcmVlKGxyb19kZXNjLCBhZGFwdGVyKTsKKworCQkJc3RhdHVzID0gSEREX0xST19SWDsKKwkJfSBlbHNlIHsKKwkJCWhkZF9scm9fZmx1c2hfcGt0KGFkYXB0ZXItPmxyb19pbmZvLmxyb19tZ3IsCisJCQkJIGlwaCwgdGNwaCwgYWRhcHRlcik7CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9tYWluLmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTcyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfbWFpbi5jCkBAIC0wLDAgKzEsNjczMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiAgRE9DOiB3bGFuX2hkZF9tYWluLmMKKyAqCisgKiAgV0xBTiBIb3N0IERldmljZSBEcml2ZXIgaW1wbGVtZW50YXRpb24KKyAqCisgKi8KKworLyogSW5jbHVkZSBGaWxlcyAqLworI2luY2x1ZGUgPHdsYW5faGRkX2luY2x1ZGVzLmg+CisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgPGNkc19zY2hlZC5oPgorI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisjaW5jbHVkZSA8Y2RzX3V0aWxzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfdHhfcnguaD4KKyNpbmNsdWRlIDx3bmlfYXBpLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfY2ZnLmg+CisjaW5jbHVkZSA8d2xhbl9wdHRfc29ja19zdmMuaD4KKyNpbmNsdWRlIDxkYmdsb2dfaG9zdC5oPgorI2luY2x1ZGUgPHdsYW5fbG9nZ2luZ19zb2NrX3N2Yy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dvd2wuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9taXNjLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfd2V4dC5oPgorI2luY2x1ZGUgIndsYW5faGRkX3RyYWNlLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfaW9jdGwuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9mdG0uaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9wb3dlci5oIgorI2luY2x1ZGUgIndsYW5faGRkX3N0YXRzLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisKKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlICJ3bGFuX2hkZF9jZmc4MDIxMS5oIgorI2luY2x1ZGUgIndsYW5faGRkX2V4dF9zY2FuLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfcDJwLmgiCisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSAic2FwX2FwaS5oIgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaWZkZWYgTVNNX1BMQVRGT1JNCisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxzb2MvcWNvbS9zdWJzeXN0ZW1fcmVzdGFydC5oPgorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDx3bGFuX2hkZF9ob3N0YXBkLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfc29mdGFwX3R4X3J4Lmg+CisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgInF3bGFuX3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF90ZGxzLmgiCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NIX0FWT0lECisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9vY2IuaCIKKworZXh0ZXJuIGludCBoZGRfaG9zdGFwZF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DSF9BVk9JRCAqLworCisjaW5jbHVkZSAid2xhbl9oZGRfbmFuLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfZGVidWdmcy5oIgorI2luY2x1ZGUgIndsYW5faGRkX2RyaXZlcl9vcHMuaCIKKyNpbmNsdWRlICJlcHBpbmdfbWFpbi5oIgorI2luY2x1ZGUgIndsYW5faGRkX21lbWR1bXAuaCIKKworI2luY2x1ZGUgPHdsYW5faGRkX2lwYS5oPgorI2luY2x1ZGUgImhpZi5oIgorI2luY2x1ZGUgIndtYS5oIgorI2luY2x1ZGUgImNkc19jb25jdXJyZW5jeS5oIgorI2luY2x1ZGUgIndsYW5faGRkX2dyZWVuX2FwLmgiCisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgV0xBTl9NT0RVTEVfTkFNRSAgbW9kdWxlX25hbWUoVEhJU19NT0RVTEUpCisjZWxzZQorI2RlZmluZSBXTEFOX01PRFVMRV9OQU1FICAid2xhbiIKKyNlbmRpZgorCisjaWZkZWYgVElNRVJfTUFOQUdFUgorI2RlZmluZSBUSU1FUl9NQU5BR0VSX1NUUiAiICtUSU1FUl9NQU5BR0VSIgorI2Vsc2UKKyNkZWZpbmUgVElNRVJfTUFOQUdFUl9TVFIgIiIKKyNlbmRpZgorCisjaWZkZWYgTUVNT1JZX0RFQlVHCisjZGVmaW5lIE1FTU9SWV9ERUJVR19TVFIgIiArTUVNT1JZX0RFQlVHIgorI2Vsc2UKKyNkZWZpbmUgTUVNT1JZX0RFQlVHX1NUUiAiIgorI2VuZGlmCisKKyNkZWZpbmUgRElTQUJMRV9LUkFJVF9JRExFX1BTX1ZBTAkyMDAKKy8qIHRoZSBBbmRyb2lkIGZyYW1ld29yayBleHBlY3RzIHRoaXMgcGFyYW0gZXZlbiB0aG91Z2ggd2UgZG9uJ3QgdXNlIGl0ICovCisjZGVmaW5lIEJVRl9MRU4gMjAKK3N0YXRpYyBjaGFyIGZ3cGF0aF9idWZmZXJbQlVGX0xFTl07CitzdGF0aWMgc3RydWN0IGtwYXJhbV9zdHJpbmcgZndwYXRoID0geworCS5zdHJpbmcgPSBmd3BhdGhfYnVmZmVyLAorCS5tYXhsZW4gPSBCVUZfTEVOLAorfTsKKworc3RhdGljIGNoYXIgKmNvdW50cnlfY29kZTsKK3N0YXRpYyBpbnQgZW5hYmxlXzExZCA9IC0xOworc3RhdGljIGludCBlbmFibGVfZGZzX2NoYW5fc2NhbiA9IC0xOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCB3bGFuX2hkZF9pbml0ZWQ7CisjZW5kaWYKKworLyoKKyAqIHNwaW5sb2NrIGZvciBzeW5jaHJvbml6aW5nIGFzeW5jaHJvbm91cyByZXF1ZXN0L3Jlc3BvbnNlCisgKiAoZnVsbCBkZXNjcmlwdGlvbiBvZiB1c2UgaW4gd2xhbl9oZGRfbWFpbi5oKQorICovCitERUZJTkVfU1BJTkxPQ0soaGRkX2NvbnRleHRfbG9jayk7CisKK3N0YXRpYyBjZGZfd2FrZV9sb2NrX3Qgd2xhbl93YWtlX2xvY2s7CisvKiBzZXQgd2hlbiBTU1IgaXMgbmVlZGVkIGFmdGVyIHVubG9hZCAqLworc3RhdGljIGVfaGRkX3Nzcl9yZXF1aXJlZCBpc19zc3JfcmVxdWlyZWQgPSBIRERfU1NSX05PVF9SRVFVSVJFRDsKKworI2RlZmluZSBXT1dfTUFYX0ZJTFRFUl9MSVNUUyAxCisjZGVmaW5lIFdPV19NQVhfRklMVEVSU19QRVJfTElTVCA0CisjZGVmaW5lIFdPV19NSU5fUEFUVEVSTl9TSVpFIDYKKyNkZWZpbmUgV09XX01BWF9QQVRURVJOX1NJWkUgNjQKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTEsIDApKQorc3RhdGljIGNvbnN0IHN0cnVjdCB3aXBoeV93b3dsYW5fc3VwcG9ydCB3b3dsYW5fc3VwcG9ydF9yZWdfaW5pdCA9IHsKKwkuZmxhZ3MgPSBXSVBIWV9XT1dMQU5fQU5ZIHwKKwkJIFdJUEhZX1dPV0xBTl9NQUdJQ19QS1QgfAorCQkgV0lQSFlfV09XTEFOX0RJU0NPTk5FQ1QgfAorCQkgV0lQSFlfV09XTEFOX1NVUFBPUlRTX0dUS19SRUtFWSB8CisJCSBXSVBIWV9XT1dMQU5fR1RLX1JFS0VZX0ZBSUxVUkUgfAorCQkgV0lQSFlfV09XTEFOX0VBUF9JREVOVElUWV9SRVEgfAorCQkgV0lQSFlfV09XTEFOXzRXQVlfSEFORFNIQUtFIHwKKwkJIFdJUEhZX1dPV0xBTl9SRktJTExfUkVMRUFTRSwKKwkubl9wYXR0ZXJucyA9IFdPV19NQVhfRklMVEVSX0xJU1RTICogV09XX01BWF9GSUxURVJTX1BFUl9MSVNULAorCS5wYXR0ZXJuX21pbl9sZW4gPSBXT1dfTUlOX1BBVFRFUk5fU0laRSwKKwkucGF0dGVybl9tYXhfbGVuID0gV09XX01BWF9QQVRURVJOX1NJWkUsCit9OworI2VuZGlmCisKKy8qIGludGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uICovCisKK3N0cnVjdCBzb2NrICpjZXNpdW1fbmxfc3J2X3NvY2s7CisKK3N0cnVjdCBjb21wbGV0aW9uIHdsYW5fc3RhcnRfY29tcDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgordm9pZCB3bGFuX2hkZF9hdXRvX3NodXRkb3duX2NiKHZvaWQpOworI2VuZGlmCisKKy8qKgorICogd2xhbl9oZGRfdHhyeF9wYXVzZV9jYigpIC0gcGF1c2UgY2FsbGJhY2sgZnJvbSB0eHJ4IGxheWVyCisgKiBAdmRldl9pZDogdmRldl9pZAorICogQGFjdGlvbjogYWN0aW9uIHR5cGUKKyAqIEByZWFzb246IHJlYXNvbiB0eXBlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd2xhbl9oZGRfdHhyeF9wYXVzZV9jYih1aW50OF90IHZkZXZfaWQsCisJCWVudW0gbmV0aWZfYWN0aW9uX3R5cGUgYWN0aW9uLCBlbnVtIG5ldGlmX3JlYXNvbl90eXBlIHJlYXNvbikKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyOworCisJaWYgKCFoZGRfY3R4KSB7CisJCWhkZF9lcnIoImhkZCBjdHggaXMgTlVMTCIpOworCQlyZXR1cm47CisJfQorCWFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXJfYnlfdmRldihoZGRfY3R4LCB2ZGV2X2lkKTsKKworCXdsYW5faGRkX25ldGlmX3F1ZXVlX2NvbnRyb2woYWRhcHRlciwgYWN0aW9uLCByZWFzb24pOworCXJldHVybjsKK30KKworLyoKKyAqIFN0b3JlIFdMQU4gZHJpdmVyIHZlcnNpb24gaW5mbyBpbiBhIGdsb2JhbCB2YXJpYWJsZSBzdWNoIHRoYXQgY3Jhc2ggZGVidWdnZXIKKyAqIGNhbiBleHRyYWN0IGl0IGZyb20gZHJpdmVyIGRlYnVnIHN5bWJvbCBhbmQgY3Jhc2hkdW1wIGZvciBwb3N0IHByb2Nlc3NpbmcKKyAqLwordWludDhfdCBnX3dsYW5fZHJpdmVyX3ZlcnNpb25bXSA9IFFXTEFOX1ZFUlNJT05TVFI7CisKKy8qKgorICogaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZygpIC0gcmV0dXJuIHN0cmluZyBjb252ZXJzaW9uIG9mIGRldmljZSBtb2RlCisgKiBAZGV2aWNlX21vZGU6IGRldmljZSBtb2RlCisgKgorICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGhlbHBzIGxvZyBzdHJpbmcgY29udmVyc2lvbiBvZiBkZXZpY2UgbW9kZS4KKyAqCisgKiBSZXR1cm46IHN0cmluZyBjb252ZXJzaW9uIG9mIGRldmljZSBtb2RlLCBpZiBtYXRjaCBmb3VuZDsKKyAqCSAgICJVbmtub3duIiBvdGhlcndpc2UuCisgKi8KK2NvbnN0IGNoYXIgKmhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcodWludDhfdCBkZXZpY2VfbW9kZSkKK3sKKwlzd2l0Y2ggKGRldmljZV9tb2RlKSB7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKFdMQU5fSEREX0lORlJBX1NUQVRJT04pOworCUNBU0VfUkVUVVJOX1NUUklORyhXTEFOX0hERF9TT0ZUQVApOworCUNBU0VfUkVUVVJOX1NUUklORyhXTEFOX0hERF9QMlBfQ0xJRU5UKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoV0xBTl9IRERfUDJQX0dPKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoV0xBTl9IRERfRlRNKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoV0xBTl9IRERfSUJTUyk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKFdMQU5fSEREX1AyUF9ERVZJQ0UpOworCUNBU0VfUkVUVVJOX1NUUklORyhXTEFOX0hERF9PQ0IpOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93biI7CisJfQorfQorCitzdGF0aWMgaW50IF9faGRkX25ldGRldl9ub3RpZmllcl9jYWxsKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgc3RhdGUsIHZvaWQgKmRhdGEpCit7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxMSwgMCkpCisJc3RydWN0IG5ldGRldl9ub3RpZmllcl9pbmZvICpkZXZfbm90aWZfaW5mbyA9IGRhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9ub3RpZl9pbmZvLT5kZXY7CisjZWxzZQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworI2VuZGlmCisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGlzIGNhbGxiYWNrIGNvcnJlc3BvbmRzIHRvIG91ciBkZXZpY2UuICovCisJaWYgKChzdHJuY21wKGRldi0+bmFtZSwgIndsYW4iLCA0KSkgJiYgKHN0cm5jbXAoZGV2LT5uYW1lLCAicDJwIiwgMykpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlpZiAoKGFkYXB0ZXItPm1hZ2ljICE9IFdMQU5fSEREX0FEQVBURVJfTUFHSUMpICYmCisJICAgIChhZGFwdGVyLT5kZXYgIT0gZGV2KSkgeworCQloZGRMb2coTE9HRSwgRkwoImRldmljZSBhZGFwdGVyIGlzIG5vdCBtYXRjaGluZyEhISIpKTsKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KKworCWlmICghZGV2LT5pZWVlODAyMTFfcHRyKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiaWVlZTgwMjExX3B0ciBpcyBOVUxMISEhIikpOworCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJfQorCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisJaWYgKE5VTEwgPT0gaGRkX2N0eCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCBGTCgiSEREIENvbnRleHQgTnVsbCBQb2ludGVyIikpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJfQorCWlmIChoZGRfY3R4LT5pc0xvZ3BJblByb2dyZXNzKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sIEZMKCIlcyBOZXcgTmV0IERldmljZSBTdGF0ZSA9ICVsdSIpLAorCSAgICAgICBkZXYtPm5hbWUsIHN0YXRlKTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIE5FVERFVl9SRUdJU1RFUjoKKwkJYnJlYWs7CisKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQlicmVhazsKKworCWNhc2UgTkVUREVWX1VQOgorCQlzbWVfY2hfYXZvaWRfdXBkYXRlX3JlcShoZGRfY3R4LT5oSGFsKTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVERFVl9ET1dOOgorCQlicmVhazsKKworCWNhc2UgTkVUREVWX0NIQU5HRToKKwkJaWYgKHRydWUgPT0gYWRhcHRlci0+aXNMaW5rVXBTdmNOZWVkZWQpCisJCQljb21wbGV0ZSgmYWRhcHRlci0+bGlua3VwX2V2ZW50X3Zhcik7CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKKwkJaWYgKGFkYXB0ZXItPnNjYW5faW5mby5tU2NhblBlbmRpbmcgIT0gZmFsc2UpIHsKKwkJCXVuc2lnbmVkIGxvbmcgcmM7CisJCQlJTklUX0NPTVBMRVRJT04oYWRhcHRlci0+c2Nhbl9pbmZvLgorCQkJCQlhYm9ydHNjYW5fZXZlbnRfdmFyKTsKKwkJCWhkZF9hYm9ydF9tYWNfc2NhbihhZGFwdGVyLT5wSGRkQ3R4LAorCQkJCQkgICBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgIGVDU1JfU0NBTl9BQk9SVF9ERUZBVUxUKTsKKwkJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAorCQkJCSZhZGFwdGVyLT5zY2FuX2luZm8uYWJvcnRzY2FuX2V2ZW50X3ZhciwKKwkJCQltc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX0FCT1JUU0NBTikpOworCQkJaWYgKCFyYykgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgiVGltZW91dCBvY2N1cnJlZCB3aGlsZSB3YWl0aW5nIGZvciBhYm9ydHNjYW4iKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICAgICAgRkwoIlNjYW4gaXMgbm90IFBlbmRpbmcgZnJvbSB1c2VyIikpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKioKKyAqIGhkZF9uZXRkZXZfbm90aWZpZXJfY2FsbCgpIC0gbmV0ZGV2IG5vdGlmaWVyIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAbmI6IHBvaW50ZXIgdG8gbm90aWZpZXIgYmxvY2sKKyAqIEBzdGF0ZTogc3RhdGUKKyAqIEBuZGV2OiBuZGV2IHBvaW50ZXIKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBoZGRfbmV0ZGV2X25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJdW5zaWduZWQgbG9uZyBzdGF0ZSwKKwkJCQkJdm9pZCAqbmRldikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2hkZF9uZXRkZXZfbm90aWZpZXJfY2FsbChuYiwgc3RhdGUsIG5kZXYpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBub3RpZmllcl9ibG9jayBoZGRfbmV0ZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gaGRkX25ldGRldl9ub3RpZmllcl9jYWxsLAorfTsKKworLyogdmFyaWFibGUgdG8gaG9sZCB0aGUgaW5zbW9kIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgY29uX21vZGU7CisjaWZuZGVmIE1PRFVMRQorLyoKKyAqIGN1cnJlbnQgY29uX21vZGUgLSB1c2VkIG9ubHkgZm9yIHN0YXRpY2FsbHkgbGlua2VkIGRyaXZlcgorICogY29uX21vZGUgaXMgY2hhbmdlZCBieSB1c2Vyc3BhY2UgdG8gaW5kaWNhdGUgYSBtb2RlIGNoYW5nZSB3aGljaCB3aWxsCisgKiByZXN1bHQgaW4gY2FsbGluZyB0aGUgbW9kdWxlIGV4aXQgYW5kIGluaXQgZnVuY3Rpb25zLiBUaGUgbW9kdWxlCisgKiBleGl0IGZ1bmN0aW9uIHdpbGwgY2xlYW4gdXAgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGNvbl9tb2RlIHByaW9yIHRvIGl0CisgKiBiZWluZyBjaGFuZ2VkIGJ5IHVzZXJzcGFjZS4gU28gY3Vycl9jb25fbW9kZSByZWNvcmRzIHRoZSBjdXJyZW50IGNvbl9tb2RlCisgKiBmb3IgZXhpdCB3aGVuIGNvbl9tb2RlIGJlY29tZXMgdGhlIG5leHQgbW9kZSBmb3IgaW5pdAorICovCitzdGF0aWMgaW50IGN1cnJfY29uX21vZGU7CisjZW5kaWYKKworLyoqCisgKiBoZGRfY2RmX3RyYWNlX2VuYWJsZSgpIC0gY29uZmlndXJlIGluaXRpYWwgQ0RGIFRyYWNlIGVuYWJsZQorICogQG1vZHVsZUlkOglNb2R1bGUgd2hvc2UgdHJhY2UgbGV2ZWwgaXMgYmVpbmcgY29uZmlndXJlZAorICogQGJpdG1hc2s6CUJpdG1hc2sgb2YgbG9nIGxldmVscyB0byBiZSBlbmFibGVkCisgKgorICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjZmcuaW5pIGlzIHJlYWQgaW4gb3JkZXIgdG8gY29uZmlndXJlCisgKiB0aGUgZGVzaXJlZCB0cmFjZSBsZXZlbHMuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9jZGZfdHJhY2VfZW5hYmxlKENERl9NT0RVTEVfSUQgbW9kdWxlSWQsIHVpbnQzMl90IGJpdG1hc2spCit7CisJQ0RGX1RSQUNFX0xFVkVMIGxldmVsOworCisJLyoKKwkgKiBpZiB0aGUgYml0bWFzayBpcyB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhlbiBhIGJpdG1hc2sgd2FzIG5vdAorCSAqIHNwZWNpZmllZCBpbiBjZmcuaW5pLCBzbyBsZWF2ZSB0aGUgbG9nZ2luZyBsZXZlbCBhbG9uZSAoaXQKKwkgKiB3aWxsIHJlbWFpbiBhdCB0aGUgImNvbXBpbGVkIGluIiBkZWZhdWx0IHZhbHVlKQorCSAqLworCWlmIChDRkdfQ0RGX1RSQUNFX0VOQUJMRV9ERUZBVUxUID09IGJpdG1hc2spIHsKKwkJcmV0dXJuOworCX0KKworCS8qIGEgbWFzayB3YXMgc3BlY2lmaWVkLiAgc3RhcnQgYnkgZGlzYWJsaW5nIGFsbCBsb2dnaW5nICovCisJY2RmX3RyYWNlX3NldF92YWx1ZShtb2R1bGVJZCwgQ0RGX1RSQUNFX0xFVkVMX05PTkUsIDApOworCisJLyogbm93IGN5Y2xlIHRocm91Z2ggdGhlIGJpdG1hc2sgdW50aWwgYWxsICJzZXQiIGJpdHMgYXJlIHNlcnZpY2VkICovCisJbGV2ZWwgPSBDREZfVFJBQ0VfTEVWRUxfRkFUQUw7CisJd2hpbGUgKDAgIT0gYml0bWFzaykgeworCQlpZiAoYml0bWFzayAmIDEpIHsKKwkJCWNkZl90cmFjZV9zZXRfdmFsdWUobW9kdWxlSWQsIGxldmVsLCAxKTsKKwkJfQorCQlsZXZlbCsrOworCQliaXRtYXNrID4+PSAxOworCX0KK30KKworLyoqCisgKiB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KCkgLSBjaGVjayB0aGUgSEREIGNvbnRleHQKKyAqIEBoZGRfY3R4OglIREQgY29udGV4dCBwb2ludGVyCisgKgorICogUmV0dXJuOiAwIGlmIHRoZSBjb250ZXh0IGlzIHZhbGlkLiBFcnJvciBjb2RlIG90aGVyd2lzZQorICovCitpbnQgd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCUVOVEVSKCk7CisKKwlpZiAoTlVMTCA9PSBoZGRfY3R4IHx8IE5VTEwgPT0gaGRkX2N0eC0+Y29uZmlnKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgTnVsbCIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGhkZF9jdHgtPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiKSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmICgoaGRkX2N0eC0+aXNMb2FkSW5Qcm9ncmVzcykgfHwgKGhkZF9jdHgtPmlzVW5sb2FkSW5Qcm9ncmVzcykpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJVbmxvYWRpbmcvTG9hZGluZyBpbiBQcm9ncmVzcy4gSWdub3JlISEhIikpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGRkX2NoZWNrYW5kdXBkYXRlX3BoeW1vZGUoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gTlVMTDsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IE5VTEw7CisJZUNzclBoeU1vZGUgcGh5TW9kZTsKKwlzdHJ1Y3QgaGRkX2NvbmZpZyAqY2ZnX3BhcmFtID0gTlVMTDsKKworCWlmIChOVUxMID09IGhkZF9jdHgpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgRkwoIkhERCBDb250ZXh0IGlzIG51bGwgISEiKSk7CisJCXJldHVybjsKKwl9CisKKwlhZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKGhkZF9jdHgsIFdMQU5fSEREX0lORlJBX1NUQVRJT04pOworCWlmIChOVUxMID09IGFkYXB0ZXIpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgRkwoImFkYXB0ZXIgaXMgbnVsbCAhISIpKTsKKwkJcmV0dXJuOworCX0KKworCXBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpOworCisJY2ZnX3BhcmFtID0gaGRkX2N0eC0+Y29uZmlnOworCWlmIChOVUxMID09IGNmZ19wYXJhbSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgRkwoImNmZ19wYXJhbXMgbm90IGF2YWlsYWJsZSAhISIpKTsKKwkJcmV0dXJuOworCX0KKworCXBoeU1vZGUgPSBzbWVfZ2V0X3BoeV9tb2RlKFdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpKTsKKworCWlmICghaGRkX2N0eC0+aXNWSFQ4MEFsbG93ZWQpIHsKKwkJaWYgKChlQ1NSX0RPVDExX01PREVfQVVUTyA9PSBwaHlNb2RlKSB8fAorCQkgICAgKGVDU1JfRE9UMTFfTU9ERV8xMWFjID09IHBoeU1vZGUpIHx8CisJCSAgICAoZUNTUl9ET1QxMV9NT0RFXzExYWNfT05MWSA9PSBwaHlNb2RlKSkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAgICAgIEZMKCJTZXR0aW5nIHBoeW1vZGUgdG8gMTFuISEiKSk7CisJCQlzbWVfc2V0X3BoeV9tb2RlKFdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpLAorCQkJCQkgZUNTUl9ET1QxMV9NT0RFXzExbik7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBOZXcgY291bnRyeSBTdXBwb3J0cyAxMWFjIGFzIHdlbGwgcmVzZXR0aW5nIHZhbHVlIGJhY2sgZnJvbQorCQkgKiAuaW5pCisJCSAqLworCQlzbWVfc2V0X3BoeV9tb2RlKFdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpLAorCQkJCSBoZGRfY2ZnX3hsYXRlX3RvX2Nzcl9waHlfbW9kZShjZmdfcGFyYW0tPgorCQkJCQkJCSAgICAgICBkb3QxMU1vZGUpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpICYmCisJICAgICgoZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUFDX09OTFkgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmRvdDExTW9kZSkKKwkgICAgIHx8IChlQ1NSX0NGR19ET1QxMV9NT0RFXzExQUMgPT0KKwkJIHBIZGRTdGFDdHgtPmNvbm5faW5mby5kb3QxMU1vZGUpKSkgeworCQlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisKKwkJLyogbmVlZCB0byBpc3N1ZSBhIGRpc2Nvbm5lY3QgdG8gQ1NSLiAqLworCQlJTklUX0NPTVBMRVRJT04oYWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3Zhcik7CisJCWNkZl9zdGF0dXMgPSBzbWVfcm9hbV9kaXNjb25uZWN0KFdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpLAorCQkJCQkJIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IGNkZl9zdGF0dXMpIHsKKwkJCXVuc2lnbmVkIGxvbmcgcmM7CisKKwkJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAorCQkJCSZhZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworCQkJaWYgKCFyYykKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoImZhaWx1cmUgd2FpdGluZyBmb3IgZGlzY29ubmVjdF9jb21wX3ZhciIpKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBoZGRfc2V0X2lic3NfcG93ZXJfc2F2ZV9wYXJhbXMoKSAtIHVwZGF0ZSBJQlNTIFBvd2VyIFNhdmUgcGFyYW1zIHRvIFdNQS4KKyAqIEBoZGRfYWRhcHRlcl90IEhkZCBhZGFwdGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgSUJTUyBwb3dlciBzYXZlIGNvbmZpZyBwYXJhbWV0ZXJzIHRvIFdNQQorICogd2hpY2ggd2lsbCBzZW5kIGl0IHRvIGZpcm13YXJlIGlmIEZXIHN1cHBvcnRzIElCU1MgcG93ZXIgc2F2ZQorICogYmVmb3JlIHZkZXYgc3RhcnQuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIENERl9TVEFUVVNfU1VDQ0VTUyBvbiBTdWNjZXNzIGFuZCBDREZfU1RBVFVTX0VfRkFJTFVSRQorICogICAgICAgICBvbiBmYWlsdXJlLgorICovCitDREZfU1RBVFVTIGhkZF9zZXRfaWJzc19wb3dlcl9zYXZlX3BhcmFtcyhoZGRfYWRhcHRlcl90ICphZGFwdGVyKQoreworCWludCByZXQ7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisKKwlpZiAoaGRkX2N0eCA9PSBOVUxMKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiSEREIGNvbnRleHQgaXMgbnVsbCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQoYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCSAgV01BX1ZERVZfSUJTU19TRVRfQVRJTV9XSU5ET1dfU0laRSwKKwkJCQkgIGhkZF9jdHgtPmNvbmZpZy0+aWJzc0FUSU1XaW5TaXplLAorCQkJCSAgVkRFVl9DTUQpOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIldNQV9WREVWX0lCU1NfU0VUX0FUSU1fV0lORE9XX1NJWkUgZmFpbGVkICVkIiksIHJldCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkgIFdNQV9WREVWX0lCU1NfU0VUX1BPV0VSX1NBVkVfQUxMT1dFRCwKKwkJCQkgIGhkZF9jdHgtPmNvbmZpZy0+aXNJYnNzUG93ZXJTYXZlQWxsb3dlZCwKKwkJCQkgIFZERVZfQ01EKTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJXTUFfVkRFVl9JQlNTX1NFVF9QT1dFUl9TQVZFX0FMTE9XRUQgZmFpbGVkICVkIiksCisJCSAgICAgICByZXQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJICBXTUFfVkRFVl9JQlNTX1NFVF9QT1dFUl9DT0xMQVBTRV9BTExPV0VELAorCQkJCSAgaGRkX2N0eC0+Y29uZmlnLT4KKwkJCQkgIGlzSWJzc1Bvd2VyQ29sbGFwc2VBbGxvd2VkLCBWREVWX0NNRCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiV01BX1ZERVZfSUJTU19TRVRfUE9XRVJfQ09MTEFQU0VfQUxMT1dFRCBmYWlsZWQgJWQiKSwKKwkJICAgICAgIHJldCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkgIFdNQV9WREVWX0lCU1NfU0VUX0FXQUtFX09OX1RYX1JYLAorCQkJCSAgaGRkX2N0eC0+Y29uZmlnLT5pc0lic3NBd2FrZU9uVHhSeCwKKwkJCQkgIFZERVZfQ01EKTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJXTUFfVkRFVl9JQlNTX1NFVF9BV0FLRV9PTl9UWF9SWCBmYWlsZWQgJWQiKSwgcmV0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQoYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCSAgV01BX1ZERVZfSUJTU19TRVRfSU5BQ1RJVklUWV9USU1FLAorCQkJCSAgaGRkX2N0eC0+Y29uZmlnLT5pYnNzSW5hY3Rpdml0eUNvdW50LAorCQkJCSAgVkRFVl9DTUQpOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIldNQV9WREVWX0lCU1NfU0VUX0lOQUNUSVZJVFlfVElNRSBmYWlsZWQgJWQiKSwgcmV0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQoYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCSAgV01BX1ZERVZfSUJTU19TRVRfVFhTUF9FTkRfSU5BQ1RJVklUWV9USU1FLAorCQkJCSAgaGRkX2N0eC0+Y29uZmlnLT5pYnNzVHhTcEVuZEluYWN0aXZpdHlUaW1lLAorCQkJCSAgVkRFVl9DTUQpOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoCisJCQkgICJXTUFfVkRFVl9JQlNTX1NFVF9UWFNQX0VORF9JTkFDVElWSVRZX1RJTUUgZmFpbGVkICVkIgorCQkJICksCisJCSAgICAgICByZXQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJICBXTUFfVkRFVl9JQlNTX1BTX1NFVF9XQVJNVVBfVElNRV9TRUNTLAorCQkJCSAgaGRkX2N0eC0+Y29uZmlnLT5pYnNzUHNXYXJtdXBUaW1lLAorCQkJCSAgVkRFVl9DTUQpOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIldNQV9WREVWX0lCU1NfUFNfU0VUX1dBUk1VUF9USU1FX1NFQ1MgZmFpbGVkICVkIiksCisJCSAgICAgICByZXQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJICBXTUFfVkRFVl9JQlNTX1BTX1NFVF8xUlhfQ0hBSU5fSU5fQVRJTV9XSU5ET1csCisJCQkJICBoZGRfY3R4LT5jb25maWctPmlic3NQczFSeENoYWluSW5BdGltRW5hYmxlLAorCQkJCSAgVkRFVl9DTUQpOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoCisJCQkgICJXTUFfVkRFVl9JQlNTX1BTX1NFVF8xUlhfQ0hBSU5fSU5fQVRJTV9XSU5ET1cgZmFpbGVkICVkIgorCQkJICksCisJCSAgICAgICByZXQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8XAorCWRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHxcCisJZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCisjZGVmaW5lIElOVEZfTUFDQUREUl9NQVNLICAgICAgIDB4NworCisvKioKKyAqIGhkZF91cGRhdGVfbWFjYWRkcigpIC0gdXBkYXRlIG1hYyBhZGRyZXNzCisgKiBAY29uZmlnOgloZGQgY29uZmlndXJhdGlvbgorICogQGh3X21hY2FkZHI6CW1hYyBhZGRyZXNzCisgKgorICogTWFjIGFkZHJlc3MgZm9yIG11bHRpcGxlIHZpcnR1YWwgaW50ZXJmYWNlIGlzIGZvdW5kIGFzIGZvbGxvd2luZworICogaSkgVGhlIG1hYyBhZGRyZXNzIG9mIHRoZSBmaXJzdCBpbnRlcmZhY2UgaXMganVzdCB0aGUgYWN0dWFsIGh3IG1hYyBhZGRyZXNzLgorICogaWkpIE1TTSAzIG9yIDQgYml0cyBvZiBieXRlNSBvZiB0aGUgYWN0dWFsIG1hYyBhZGRyZXNzIGFyZSB1c2VkIHRvCisgKiAgICAgZGVmaW5lIHRoZSBtYWMgYWRkcmVzcyBmb3IgdGhlIHJlbWFpbmluZyBpbnRlcmZhY2VzIGFuZCBsb2NhbGx5CisgKiAgICAgYWRtaXN0ZXJlZCBiaXQgaXMgc2V0LiBJTlRGX01BQ0FERFJfTUFTSyBpcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mCisgKiAgICAgc3VwcG9ydGVkIHZpcnR1YWwgaW50ZXJmYWNlcywgcmlnaHQgbm93IHRoaXMgaXMgMHgwNyAobWVhbmluZyA4CisgKiAgICAgaW50ZXJmYWNlKS4KKyAqICAgICBCeXRlWzNdIG9mIHNlY29uZCBpbnRlcmZhY2Ugd2lsbCBiZSBod19tYWNhZGRyWzNdKGJpdDUuLjcpICsgMSwKKyAqICAgICBmb3IgdGhpcmQgaW50ZXJmYWNlIGl0IHdpbGwgYmUgaHdfbWFjYWRkclszXShiaXQ1Li43KSArIDIsIGV0Yy4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBoZGRfdXBkYXRlX21hY2FkZHIoc3RydWN0IGhkZF9jb25maWcgKmNvbmZpZywKKwkJCXN0cnVjdCBjZGZfbWFjX2FkZHIgaHdfbWFjYWRkcikKK3sKKwlpbnQ4X3QgaTsKKwl1aW50OF90IG1hY2FkZHJfYjMsIHRtcF9icjM7CisKKwljZGZfbWVtX2NvcHkoY29uZmlnLT5pbnRmTWFjQWRkclswXS5ieXRlcywgaHdfbWFjYWRkci5ieXRlcywKKwkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJZm9yIChpID0gMTsgaSA8IENERl9NQVhfQ09OQ1VSUkVOQ1lfUEVSU09OQTsgaSsrKSB7CisJCWNkZl9tZW1fY29weShjb25maWctPmludGZNYWNBZGRyW2ldLmJ5dGVzLCBod19tYWNhZGRyLmJ5dGVzLAorCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJCW1hY2FkZHJfYjMgPSBjb25maWctPmludGZNYWNBZGRyW2ldLmJ5dGVzWzNdOworCQl0bXBfYnIzID0gKChtYWNhZGRyX2IzID4+IDQgJiBJTlRGX01BQ0FERFJfTUFTSykgKyBpKSAmCisJCQkgIElOVEZfTUFDQUREUl9NQVNLOworCQltYWNhZGRyX2IzICs9IHRtcF9icjM7CisKKwkJLyogWE9SLWluZyBiaXQtMjQgb2YgdGhlIG1hYyBhZGRyZXNzLiBUaGlzIHdpbGwgZ2l2ZSBlbm91Z2gKKwkJICogbWFjIGFkZHJlc3MgcmFuZ2UgYmVmb3JlIGNvbGxpc2lvbgorCQkgKi8KKwkJbWFjYWRkcl9iMyBePSAoMSA8PCA3KTsKKworCQkvKiBTZXQgbG9jYWxseSBhZG1pbmlzdGVyZWQgYml0ICovCisJCWNvbmZpZy0+aW50Zk1hY0FkZHJbaV0uYnl0ZXNbMF0gfD0gMHgwMjsKKwkJY29uZmlnLT5pbnRmTWFjQWRkcltpXS5ieXRlc1szXSA9IG1hY2FkZHJfYjM7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgImNvbmZpZy0+aW50Zk1hY0FkZHJbJWRdOiAiCisJCSAgICAgICBNQUNfQUREUkVTU19TVFIsIGksCisJCSAgICAgICBNQUNfQUREUl9BUlJBWShjb25maWctPmludGZNYWNBZGRyW2ldLmJ5dGVzKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBoZGRfdXBkYXRlX3RndF9zZXJ2aWNlcyhoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgICBzdHJ1Y3Qgd21hX3RndF9zZXJ2aWNlcyAqY2ZnKQoreworCXN0cnVjdCBoZGRfY29uZmlnICpjb25maWcgPSBoZGRfY3R4LT5jb25maWc7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhkZF9jdHgtPmhIYWwpOworCisJLyogU2V0IHVwIFVBUFNEICovCisJY29uZmlnLT5hcFVhcHNkRW5hYmxlZCAmPSBjZmctPnVhcHNkOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkvKiAxMUFDIG1vZGUgc3VwcG9ydCAqLworCWlmICgoY29uZmlnLT5kb3QxMU1vZGUgPT0gZUhERF9ET1QxMV9NT0RFXzExYWMgfHwKKwkgICAgIGNvbmZpZy0+ZG90MTFNb2RlID09IGVIRERfRE9UMTFfTU9ERV8xMWFjX09OTFkpICYmICFjZmctPmVuXzExYWMpCisJCWNvbmZpZy0+ZG90MTFNb2RlID0gZUhERF9ET1QxMV9NT0RFX0FVVE87CisjZW5kaWYgLyogI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDICovCisKKwkvKiBBUlAgb2ZmbG9hZDogb3ZlcnJpZGUgdXNlciBzZXR0aW5nIGlmIGludmFsaWQgICovCisJY29uZmlnLT5maG9zdEFycE9mZmxvYWQgJj0gY2ZnLT5hcnBfb2ZmbG9hZDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCS8qIFBOTyBvZmZsb2FkICovCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJICAgICAgIEZMKCJQTk8gQ2FwYWJpbGl0eSBpbiBmL3cgPSAlZCIpLCBjZmctPnBub19vZmZsb2FkKTsKKwlpZiAoY2ZnLT5wbm9fb2ZmbG9hZCkKKwkJY29uZmlnLT5Qbm9PZmZsb2FkID0gdHJ1ZTsKKyNlbmRpZgorCXBNYWMtPmx0ZUNvZXhBbnRTaGFyZSA9IGNmZy0+bHRlX2NvZXhfYW50X3NoYXJlOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJY29uZmlnLT5mRW5hYmxlVERMU1N1cHBvcnQgJj0gY2ZnLT5lbl90ZGxzOworCWNvbmZpZy0+ZkVuYWJsZVRETFNPZmZDaGFubmVsICY9IGNmZy0+ZW5fdGRsc19vZmZjaGFuOworCWNvbmZpZy0+ZkVuYWJsZVRETFNCdWZmZXJTdGEgJj0gY2ZnLT5lbl90ZGxzX3VhcHNkX2J1Zl9zdGE7CisJaWYgKGNvbmZpZy0+ZlRETFNVYXBzZE1hc2sgJiYgY2ZnLT5lbl90ZGxzX3VhcHNkX3NsZWVwX3N0YSkgeworCQljb25maWctPmZFbmFibGVURExTU2xlZXBTdGEgPSB0cnVlOworCX0gZWxzZSB7CisJCWNvbmZpZy0+ZkVuYWJsZVRETFNTbGVlcFN0YSA9IGZhbHNlOworCX0KKyNlbmRpZgorCXBNYWMtPmJlYWNvbl9vZmZsb2FkID0gY2ZnLT5iZWFjb25fb2ZmbG9hZDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJY29uZmlnLT5pc1JvYW1PZmZsb2FkRW5hYmxlZCAmPSBjZmctPmVuX3JvYW1fb2ZmbG9hZDsKKyNlbmRpZgorCit9CisKK3N0YXRpYyB2b2lkIGhkZF91cGRhdGVfdGd0X2h0X2NhcChoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgc3RydWN0IHdtYV90Z3RfaHRfY2FwICpjZmcpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3QgdmFsdWUsIHZhbDMyOworCXVpbnQxNl90IHZhbDE2OworCXN0cnVjdCBoZGRfY29uZmlnICpwY29uZmlnID0gaGRkX2N0eC0+Y29uZmlnOworCXRTaXJNYWNIVENhcGFiaWxpdHlJbmZvICpwaHRDYXBJbmZvOworCXVpbnQ4X3QgbWNzX3NldFtTSVpFX09GX1NVUFBPUlRFRF9NQ1NfU0VUXTsKKwl1aW50OF90IGVuYWJsZV90eF9zdGJjOworCisJLyogY2hlY2sgYW5kIHVwZGF0ZSBSWCBTVEJDICovCisJaWYgKHBjb25maWctPmVuYWJsZVJ4U1RCQyAmJiAhY2ZnLT5odF9yeF9zdGJjKQorCQlwY29uZmlnLT5lbmFibGVSeFNUQkMgPSBjZmctPmh0X3J4X3N0YmM7CisKKwkvKiBnZXQgdGhlIE1QRFUgZGVuc2l0eSAqLworCXN0YXR1cyA9IHNtZV9jZmdfZ2V0X2ludChoZGRfY3R4LT5oSGFsLCBXTklfQ0ZHX01QRFVfREVOU0lUWSwgJnZhbHVlKTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiY291bGQgbm90IGdldCBNUERVIERFTlNJVFkiKSk7CisJCXZhbHVlID0gMDsKKwl9CisKKwkvKgorCSAqIE1QRFUgZGVuc2l0eToKKwkgKiBvdmVycmlkZSB1c2VyJ3Mgc2V0dGluZyBpZiB2YWx1ZSBpcyBsYXJnZXIKKwkgKiB0aGFuIHRoZSBvbmUgc3VwcG9ydGVkIGJ5IHRhcmdldAorCSAqLworCWlmICh2YWx1ZSA+IGNmZy0+bXBkdV9kZW5zaXR5KSB7CisJCXN0YXR1cyA9IHNtZV9jZmdfc2V0X2ludChoZGRfY3R4LT5oSGFsLCBXTklfQ0ZHX01QRFVfREVOU0lUWSwKKwkJCQkJIGNmZy0+bXBkdV9kZW5zaXR5KTsKKworCQlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfRV9GQUlMVVJFKQorCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICAgICBGTCgiY291bGQgbm90IHNldCBNUERVIERFTlNJVFkgdG8gQ0NNIikpOworCX0KKworCS8qIGdldCB0aGUgSFQgY2FwYWJpbGl0eSBpbmZvICovCisJc3RhdHVzID0gc21lX2NmZ19nZXRfaW50KGhkZF9jdHgtPmhIYWwsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWwzMik7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJjb3VsZCBub3QgZ2V0IEhUIGNhcGFiaWxpdHkgaW5mbyIpKTsKKwkJcmV0dXJuOworCX0KKwl2YWwxNiA9ICh1aW50MTZfdCkgdmFsMzI7CisJcGh0Q2FwSW5mbyA9ICh0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyAqKSAmdmFsMTY7CisKKwkvKiBTZXQgdGhlIExEUEMgY2FwYWJpbGl0eSAqLworCXBodENhcEluZm8tPmFkdkNvZGluZ0NhcCA9IGNmZy0+aHRfcnhfbGRwYzsKKworCWlmIChwY29uZmlnLT5TaG9ydEdJMjBNaHpFbmFibGUgJiYgIWNmZy0+aHRfc2dpXzIwKQorCQlwY29uZmlnLT5TaG9ydEdJMjBNaHpFbmFibGUgPSBjZmctPmh0X3NnaV8yMDsKKworCWlmIChwY29uZmlnLT5TaG9ydEdJNDBNaHpFbmFibGUgJiYgIWNmZy0+aHRfc2dpXzQwKQorCQlwY29uZmlnLT5TaG9ydEdJNDBNaHpFbmFibGUgPSBjZmctPmh0X3NnaV80MDsKKworCWhkZF9jdHgtPm51bV9yZl9jaGFpbnMgPSBjZmctPm51bV9yZl9jaGFpbnM7CisJaGRkX2N0eC0+aHRfdHhfc3RiY19zdXBwb3J0ZWQgPSBjZmctPmh0X3R4X3N0YmM7CisKKwllbmFibGVfdHhfc3RiYyA9IHBjb25maWctPmVuYWJsZVR4U1RCQzsKKworCWlmIChwY29uZmlnLT5lbmFibGUyeDIgJiYgKGNmZy0+bnVtX3JmX2NoYWlucyA9PSAyKSkgeworCQlwY29uZmlnLT5lbmFibGUyeDIgPSAxOworCX0gZWxzZSB7CisJCXBjb25maWctPmVuYWJsZTJ4MiA9IDA7CisJCWVuYWJsZV90eF9zdGJjID0gMDsKKworCQkvKiAxeDEgKi8KKwkJLyogVXBkYXRlIFJ4IEhpZ2hlc3QgTG9uZyBHSSBkYXRhIFJhdGUgKi8KKwkJaWYgKHNtZV9jZmdfc2V0X2ludChoZGRfY3R4LT5oSGFsLAorCQkJCSAgICBXTklfQ0ZHX1ZIVF9SWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEUsCisJCQkJICAgIEhERF9WSFRfUlhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFXzFfMSkKKwkJCQk9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoCisJCQkJICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19WSFRfUlhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFIHRvIENDTSIKKwkJCQkgKSk7CisJCX0KKworCQkvKiBVcGRhdGUgVHggSGlnaGVzdCBMb25nIEdJIGRhdGEgUmF0ZSAqLworCQlpZiAoc21lX2NmZ19zZXRfaW50CisJCQkgICAgKGhkZF9jdHgtPmhIYWwsCisJCQkgICAgIFdOSV9DRkdfVkhUX1RYX0hJR0hFU1RfU1VQUE9SVEVEX0RBVEFfUkFURSwKKwkJCSAgICAgSEREX1ZIVF9UWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEVfMV8xKSA9PQorCQkJICAgIENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTCgKKwkJCQkgICJDb3VsZCBub3QgcGFzcyBvbiBIRERfVkhUX1JYX0hJR0hFU1RfU1VQUE9SVEVEX0RBVEFfUkFURV8xXzEgdG8gQ0NNIgorCQkJCSApKTsKKwkJfQorCX0KKwlpZiAoIShjZmctPmh0X3R4X3N0YmMgJiYgcGNvbmZpZy0+ZW5hYmxlMngyKSkKKwkJZW5hYmxlX3R4X3N0YmMgPSAwOworCXBodENhcEluZm8tPnR4U1RCQyA9IGVuYWJsZV90eF9zdGJjOworCisJdmFsMzIgPSB2YWwxNjsKKwlzdGF0dXMgPSBzbWVfY2ZnX3NldF9pbnQoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19IVF9DQVBfSU5GTywgdmFsMzIpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgRkwoImNvdWxkIG5vdCBzZXQgSFQgY2FwYWJpbGl0eSB0byBDQ00iKSk7CisjZGVmaW5lIFdMQU5fSEREX1JYX01DU19BTExfTlNUUkVBTV9SQVRFUyAweGZmCisJdmFsdWUgPSBTSVpFX09GX1NVUFBPUlRFRF9NQ1NfU0VUOworCWlmIChzbWVfY2ZnX2dldF9zdHIoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19TVVBQT1JURURfTUNTX1NFVCwgbWNzX3NldCwKKwkJCSAgICAmdmFsdWUpID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sIEZMKCJSZWFkIE1DUyByYXRlIHNldCIpKTsKKworCQlpZiAocGNvbmZpZy0+ZW5hYmxlMngyKSB7CisJCQlmb3IgKHZhbHVlID0gMDsgdmFsdWUgPCBjZmctPm51bV9yZl9jaGFpbnM7IHZhbHVlKyspCisJCQkJbWNzX3NldFt2YWx1ZV0gPQorCQkJCQlXTEFOX0hERF9SWF9NQ1NfQUxMX05TVFJFQU1fUkFURVM7CisKKwkJCXN0YXR1cyA9CisJCQkJc21lX2NmZ19zZXRfc3RyKGhkZF9jdHgtPmhIYWwsCisJCQkJCQlXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorCQkJCQkJbWNzX3NldCwKKwkJCQkJCVNJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVQpOworCQkJaWYgKHN0YXR1cyA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkKKwkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCSAgICAgICBGTCgiY291bGQgbm90IHNldCBNQ1MgU0VUIHRvIENDTSIpKTsKKwkJfQorCX0KKyN1bmRlZiBXTEFOX0hERF9SWF9NQ1NfQUxMX05TVFJFQU1fUkFURVMKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCitzdGF0aWMgdm9pZCBoZGRfdXBkYXRlX3RndF92aHRfY2FwKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJICAgc3RydWN0IHdtYV90Z3Rfdmh0X2NhcCAqY2ZnKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQzMl90IHZhbHVlID0gMDsKKwlzdHJ1Y3QgaGRkX2NvbmZpZyAqcGNvbmZpZyA9IGhkZF9jdHgtPmNvbmZpZzsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gaGRkX2N0eC0+d2lwaHk7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqYmFuZF81ZyA9CisJCXdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKKworCS8qIEdldCB0aGUgY3VycmVudCBNUERVIGxlbmd0aCAqLworCXN0YXR1cyA9CisJCXNtZV9jZmdfZ2V0X2ludChoZGRfY3R4LT5oSGFsLCBXTklfQ0ZHX1ZIVF9NQVhfTVBEVV9MRU5HVEgsCisJCQkJJnZhbHVlKTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJjb3VsZCBub3QgZ2V0IE1QRFUgTEVOR1RIIikpOworCQl2YWx1ZSA9IDA7CisJfQorCisJLyoKKwkgKiBWSFQgbWF4IE1QRFUgbGVuZ3RoOgorCSAqIG92ZXJyaWRlIGlmIHVzZXIgY29uZmlndXJlZCB2YWx1ZSBpcyB0b28gaGlnaAorCSAqIHRoYXQgdGhlIHRhcmdldCBjYW5ub3Qgc3VwcG9ydAorCSAqLworCWlmICh2YWx1ZSA+IGNmZy0+dmh0X21heF9tcGR1KSB7CisJCXN0YXR1cyA9IHNtZV9jZmdfc2V0X2ludChoZGRfY3R4LT5oSGFsLAorCQkJCQkgV05JX0NGR19WSFRfTUFYX01QRFVfTEVOR1RILAorCQkJCQkgY2ZnLT52aHRfbWF4X21wZHUpOworCisJCWlmIChzdGF0dXMgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoImNvdWxkIG5vdCBzZXQgVkhUIE1BWCBNUERVIExFTkdUSCIpKTsKKwkJfQorCX0KKworCS8qIEdldCB0aGUgY3VycmVudCBzdXBwb3J0ZWQgY2hhbiB3aWR0aCAqLworCXN0YXR1cyA9IHNtZV9jZmdfZ2V0X2ludChoZGRfY3R4LT5oSGFsLAorCQkJCVdOSV9DRkdfVkhUX1NVUFBPUlRFRF9DSEFOX1dJRFRIX1NFVCwKKwkJCQkmdmFsdWUpOworCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJjb3VsZCBub3QgZ2V0IE1QRFUgTEVOR1RIIikpOworCQl2YWx1ZSA9IDA7CisJfQorCisJLyogR2V0IHRoZSBjdXJyZW50IFJYIExEUEMgc2V0dGluZyAqLworCXN0YXR1cyA9CisJCXNtZV9jZmdfZ2V0X2ludChoZGRfY3R4LT5oSGFsLCBXTklfQ0ZHX1ZIVF9MRFBDX0NPRElOR19DQVAsCisJCQkJJnZhbHVlKTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiY291bGQgbm90IGdldCBWSFQgTERQQyBDT0RJTkcgQ0FQIikpOworCQl2YWx1ZSA9IDA7CisJfQorCisJLyogU2V0IHRoZSBMRFBDIGNhcGFiaWxpdHkgKi8KKwlpZiAodmFsdWUgJiYgIWNmZy0+dmh0X3J4X2xkcGMpIHsKKwkJc3RhdHVzID0gc21lX2NmZ19zZXRfaW50KGhkZF9jdHgtPmhIYWwsCisJCQkJCSBXTklfQ0ZHX1ZIVF9MRFBDX0NPRElOR19DQVAsCisJCQkJCSBjZmctPnZodF9yeF9sZHBjKTsKKworCQlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgICAgIEZMKCJjb3VsZCBub3Qgc2V0IFZIVCBMRFBDIENPRElORyBDQVAgdG8gQ0NNIikpOworCQl9CisJfQorCisJLyogR2V0IGN1cnJlbnQgR0kgODAgdmFsdWUgKi8KKwlzdGF0dXMgPSBzbWVfY2ZnX2dldF9pbnQoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19WSFRfU0hPUlRfR0lfODBNSFosCisJCQkJJnZhbHVlKTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiY291bGQgbm90IGdldCBTSE9SVCBHSSA4ME1IWiIpKTsKKwkJdmFsdWUgPSAwOworCX0KKworCS8qIHNldCB0aGUgR3VhcmQgaW50ZXJ2YWwgODBNSHogKi8KKwlpZiAodmFsdWUgJiYgIWNmZy0+dmh0X3Nob3J0X2dpXzgwKSB7CisJCXN0YXR1cyA9IHNtZV9jZmdfc2V0X2ludChoZGRfY3R4LT5oSGFsLAorCQkJCQkgV05JX0NGR19WSFRfU0hPUlRfR0lfODBNSFosCisJCQkJCSBjZmctPnZodF9zaG9ydF9naV84MCk7CisKKwkJaWYgKHN0YXR1cyA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICAgICBGTCgiY291bGQgbm90IHNldCBTSE9SVCBHSSA4ME1IWiB0byBDQ00iKSk7CisJCX0KKwl9CisKKwkvKiBHZXQgY3VycmVudCBHSSAxNjAgdmFsdWUgKi8KKwlzdGF0dXMgPSBzbWVfY2ZnX2dldF9pbnQoaGRkX2N0eC0+aEhhbCwKKwkJCQkgV05JX0NGR19WSFRfU0hPUlRfR0lfMTYwX0FORF84MF9QTFVTXzgwTUhaLAorCQkJCSAmdmFsdWUpOworCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJjb3VsZCBub3QgZ2V0IFNIT1JUIEdJIDgwICYgMTYwIikpOworCQl2YWx1ZSA9IDA7CisJfQorCisJLyogR2V0IFZIVCBUWCBTVEJDIGNhcCAqLworCXN0YXR1cyA9IHNtZV9jZmdfZ2V0X2ludChoZGRfY3R4LT5oSGFsLCBXTklfQ0ZHX1ZIVF9UWFNUQkMsICZ2YWx1ZSk7CisKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoImNvdWxkIG5vdCBnZXQgVkhUIFRYIFNUQkMiKSk7CisJCXZhbHVlID0gMDsKKwl9CisKKwkvKiBWSFQgVFggU1RCQyBjYXAgKi8KKwlpZiAodmFsdWUgJiYgIWNmZy0+dmh0X3R4X3N0YmMpIHsKKwkJc3RhdHVzID0gc21lX2NmZ19zZXRfaW50KGhkZF9jdHgtPmhIYWwsIFdOSV9DRkdfVkhUX1RYU1RCQywKKwkJCQkJIGNmZy0+dmh0X3R4X3N0YmMpOworCisJCWlmIChzdGF0dXMgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoImNvdWxkIG5vdCBzZXQgdGhlIFZIVCBUWCBTVEJDIHRvIENDTSIpKTsKKwkJfQorCX0KKworCS8qIEdldCBWSFQgUlggU1RCQyBjYXAgKi8KKwlzdGF0dXMgPSBzbWVfY2ZnX2dldF9pbnQoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19WSFRfUlhTVEJDLCAmdmFsdWUpOworCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJjb3VsZCBub3QgZ2V0IFZIVCBSWCBTVEJDIikpOworCQl2YWx1ZSA9IDA7CisJfQorCisJLyogVkhUIFJYIFNUQkMgY2FwICovCisJaWYgKHZhbHVlICYmICFjZmctPnZodF9yeF9zdGJjKSB7CisJCXN0YXR1cyA9IHNtZV9jZmdfc2V0X2ludChoZGRfY3R4LT5oSGFsLCBXTklfQ0ZHX1ZIVF9SWFNUQkMsCisJCQkJCSBjZmctPnZodF9yeF9zdGJjKTsKKworCQlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgICAgIEZMKCJjb3VsZCBub3Qgc2V0IHRoZSBWSFQgUlggU1RCQyB0byBDQ00iKSk7CisJCX0KKwl9CisKKwkvKiBHZXQgVkhUIFNVIEJlYW1mb3JtZXIgY2FwICovCisJc3RhdHVzID0gc21lX2NmZ19nZXRfaW50KGhkZF9jdHgtPmhIYWwsIFdOSV9DRkdfVkhUX1NVX0JFQU1GT1JNRVJfQ0FQLAorCQkJCSAmdmFsdWUpOworCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJjb3VsZCBub3QgZ2V0IFZIVCBTVSBCRUFNRk9STUVSIENBUCIpKTsKKwkJdmFsdWUgPSAwOworCX0KKworCS8qIHNldCBWSFQgU1UgQmVhbWZvcm1lciBjYXAgKi8KKwlpZiAodmFsdWUgJiYgIWNmZy0+dmh0X3N1X2Jmb3JtZXIpIHsKKwkJc3RhdHVzID0gc21lX2NmZ19zZXRfaW50KGhkZF9jdHgtPmhIYWwsCisJCQkJCSBXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVSX0NBUCwKKwkJCQkJIGNmZy0+dmh0X3N1X2Jmb3JtZXIpOworCisJCWlmIChzdGF0dXMgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoImNvdWxkIG5vdCBzZXQgVkhUIFNVIEJFQU1GT1JNRVIgQ0FQIikpOworCQl9CisJfQorCisJLyogY2hlY2sgYW5kIHVwZGF0ZSBTVSBCRUFNRk9STUVFIGNhcGFiYWxpdHkgKi8KKwlpZiAocGNvbmZpZy0+ZW5hYmxlVHhCRiAmJiAhY2ZnLT52aHRfc3VfYmZvcm1lZSkKKwkJcGNvbmZpZy0+ZW5hYmxlVHhCRiA9IGNmZy0+dmh0X3N1X2Jmb3JtZWU7CisKKwlzdGF0dXMgPSBzbWVfY2ZnX3NldF9pbnQoaGRkX2N0eC0+aEhhbCwKKwkJCQkgV05JX0NGR19WSFRfU1VfQkVBTUZPUk1FRV9DQVAsCisJCQkJIHBjb25maWctPmVuYWJsZVR4QkYpOworCisJaWYgKHN0YXR1cyA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgRkwoImNvdWxkIG5vdCBzZXQgVkhUIFNVIEJFQU1GT1JNRUUgQ0FQIikpOworCX0KKworCS8qIEdldCBWSFQgTVUgQmVhbWZvcm1lciBjYXAgKi8KKwlzdGF0dXMgPSBzbWVfY2ZnX2dldF9pbnQoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19WSFRfTVVfQkVBTUZPUk1FUl9DQVAsCisJCQkJICZ2YWx1ZSk7CisKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoImNvdWxkIG5vdCBnZXQgVkhUIE1VIEJFQU1GT1JNRVIgQ0FQIikpOworCQl2YWx1ZSA9IDA7CisJfQorCisJLyogc2V0IFZIVCBNVSBCZWFtZm9ybWVyIGNhcCAqLworCWlmICh2YWx1ZSAmJiAhY2ZnLT52aHRfbXVfYmZvcm1lcikgeworCQlzdGF0dXMgPSBzbWVfY2ZnX3NldF9pbnQoaGRkX2N0eC0+aEhhbCwKKwkJCQkJIFdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRVJfQ0FQLAorCQkJCQkgY2ZnLT52aHRfbXVfYmZvcm1lcik7CisKKwkJaWYgKHN0YXR1cyA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICAgICBGTCgKKwkJCQkgICJjb3VsZCBub3Qgc2V0IHRoZSBWSFQgTVUgQkVBTUZPUk1FUiBDQVAgdG8gQ0NNIgorCQkJCSApKTsKKwkJfQorCX0KKworCS8qIEdldCBWSFQgTVUgQmVhbWZvcm1lZSBjYXAgKi8KKwlzdGF0dXMgPSBzbWVfY2ZnX2dldF9pbnQoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19WSFRfTVVfQkVBTUZPUk1FRV9DQVAsCisJCQkJICZ2YWx1ZSk7CisKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoImNvdWxkIG5vdCBnZXQgVkhUIE1VIEJFQU1GT1JNRUUgQ0FQIikpOworCQl2YWx1ZSA9IDA7CisJfQorCisJLyogc2V0IFZIVCBNVSBCZWFtZm9ybWVlIGNhcCAqLworCWlmICh2YWx1ZSAmJiAhY2ZnLT52aHRfbXVfYmZvcm1lZSkgeworCQlzdGF0dXMgPSBzbWVfY2ZnX3NldF9pbnQoaGRkX2N0eC0+aEhhbCwKKwkJCQkJIFdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRUVfQ0FQLAorCQkJCQkgY2ZnLT52aHRfbXVfYmZvcm1lZSk7CisKKwkJaWYgKHN0YXR1cyA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICAgICBGTCgiY291bGQgbm90IHNldCBWSFQgTVUgQkVBTUZPUk1FUiBDQVAiKSk7CisJCX0KKwl9CisKKwkvKiBHZXQgVkhUIE1BWCBBTVBEVSBMZW4gZXhwICovCisJc3RhdHVzID0gc21lX2NmZ19nZXRfaW50KGhkZF9jdHgtPmhIYWwsIFdOSV9DRkdfVkhUX0FNUERVX0xFTl9FWFBPTkVOVCwKKwkJCQkgJnZhbHVlKTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiY291bGQgbm90IGdldCBWSFQgQU1QRFUgTEVOIikpOworCQl2YWx1ZSA9IDA7CisJfQorCisJLyoKKwkgKiBWSFQgbWF4IEFNUERVIGxlbiBleHA6CisJICogb3ZlcnJpZGUgaWYgdXNlciBjb25maWd1cmVkIHZhbHVlIGlzIHRvbyBoaWdoCisJICogdGhhdCB0aGUgdGFyZ2V0IGNhbm5vdCBzdXBwb3J0LgorCSAqIEV2ZW4gdGhvdWdoIFJvbWUgcHVibGlzaCBhbXBkdV9sZW49NywgaXQgY2FuCisJICogb25seSBzdXBwb3J0IDQgYmVjYXVzZSBvZiBzb21lIGgvdyBidWcuCisJICovCisKKwlpZiAodmFsdWUgPiBjZmctPnZodF9tYXhfYW1wZHVfbGVuX2V4cCkgeworCQlzdGF0dXMgPSBzbWVfY2ZnX3NldF9pbnQoaGRkX2N0eC0+aEhhbCwKKwkJCQkJIFdOSV9DRkdfVkhUX0FNUERVX0xFTl9FWFBPTkVOVCwKKwkJCQkJIGNmZy0+dmh0X21heF9hbXBkdV9sZW5fZXhwKTsKKworCQlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgICAgIEZMKCJjb3VsZCBub3Qgc2V0IHRoZSBWSFQgQU1QRFUgTEVOIEVYUCIpKTsKKwkJfQorCX0KKworCS8qIEdldCBWSFQgVFhPUCBQUyBDQVAgKi8KKwlzdGF0dXMgPSBzbWVfY2ZnX2dldF9pbnQoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19WSFRfVFhPUF9QUywgJnZhbHVlKTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiY291bGQgbm90IGdldCBWSFQgVFhPUCBQUyIpKTsKKwkJdmFsdWUgPSAwOworCX0KKworCS8qIHNldCBWSFQgVFhPUCBQUyBjYXAgKi8KKwlpZiAodmFsdWUgJiYgIWNmZy0+dmh0X3R4b3BfcHMpIHsKKwkJc3RhdHVzID0gc21lX2NmZ19zZXRfaW50KGhkZF9jdHgtPmhIYWwsIFdOSV9DRkdfVkhUX1RYT1BfUFMsCisJCQkJCSBjZmctPnZodF90eG9wX3BzKTsKKworCQlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgICAgIEZMKCJjb3VsZCBub3Qgc2V0IHRoZSBWSFQgVFhPUCBQUyIpKTsKKwkJfQorCX0KKworCWlmIChXTUlfVkhUX0NBUF9NQVhfTVBEVV9MRU5fMTE0NTQgPT0gY2ZnLT52aHRfbWF4X21wZHUpCisJCWJhbmRfNWctPnZodF9jYXAuY2FwIHw9IElFRUU4MDIxMV9WSFRfQ0FQX01BWF9NUERVX0xFTkdUSF8xMTQ1NDsKKwllbHNlIGlmIChXTUlfVkhUX0NBUF9NQVhfTVBEVV9MRU5fNzkzNSA9PSBjZmctPnZodF9tYXhfbXBkdSkKKwkJYmFuZF81Zy0+dmh0X2NhcC5jYXAgfD0gSUVFRTgwMjExX1ZIVF9DQVBfTUFYX01QRFVfTEVOR1RIXzc5OTE7CisJZWxzZQorCQliYW5kXzVnLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NBUF9NQVhfTVBEVV9MRU5HVEhfMzg5NTsKKworCisJaWYgKGNmZy0+c3VwcF9jaGFuX3dpZHRoICYgKDEgPDwgZUhUX0NIQU5ORUxfV0lEVEhfODBQODBNSFopKSB7CisJCWJhbmRfNWctPnZodF9jYXAuY2FwIHw9CisJCQlJRUVFODAyMTFfVkhUX0NBUF9TVVBQX0NIQU5fV0lEVEhfMTYwXzgwUExVUzgwTUhaOworCX0KKwlpZiAoY2ZnLT5zdXBwX2NoYW5fd2lkdGggJiAoMSA8PCBlSFRfQ0hBTk5FTF9XSURUSF8xNjBNSFopKSB7CisJCWJhbmRfNWctPnZodF9jYXAuY2FwIHw9CisJCQlJRUVFODAyMTFfVkhUX0NBUF9TVVBQX0NIQU5fV0lEVEhfMTYwTUhaOworCX0KKworCWlmIChjZmctPnZodF9yeF9sZHBjICYgV01JX1ZIVF9DQVBfUlhfTERQQykKKwkJYmFuZF81Zy0+dmh0X2NhcC5jYXAgfD0gSUVFRTgwMjExX1ZIVF9DQVBfUlhMRFBDOworCisJaWYgKGNmZy0+dmh0X3Nob3J0X2dpXzgwICYgV01JX1ZIVF9DQVBfU0dJXzgwTUhaKQorCQliYW5kXzVnLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NBUF9TSE9SVF9HSV84MDsKKwlpZiAoY2ZnLT52aHRfc2hvcnRfZ2lfMTYwICYgV01JX1ZIVF9DQVBfU0dJXzE2ME1IWikKKwkJYmFuZF81Zy0+dmh0X2NhcC5jYXAgfD0gSUVFRTgwMjExX1ZIVF9DQVBfU0hPUlRfR0lfMTYwOworCisJaWYgKGNmZy0+dmh0X3R4X3N0YmMgJiBXTUlfVkhUX0NBUF9UWF9TVEJDKQorCQliYW5kXzVnLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NBUF9UWFNUQkM7CisKKwlpZiAoY2ZnLT52aHRfcnhfc3RiYyAmIFdNSV9WSFRfQ0FQX1JYX1NUQkNfMVNTKQorCQliYW5kXzVnLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NBUF9SWFNUQkNfMTsKKwlpZiAoY2ZnLT52aHRfcnhfc3RiYyAmIFdNSV9WSFRfQ0FQX1JYX1NUQkNfMlNTKQorCQliYW5kXzVnLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NBUF9SWFNUQkNfMjsKKwlpZiAoY2ZnLT52aHRfcnhfc3RiYyAmIFdNSV9WSFRfQ0FQX1JYX1NUQkNfM1NTKQorCQliYW5kXzVnLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NBUF9SWFNUQkNfMzsKKworCWJhbmRfNWctPnZodF9jYXAuY2FwIHw9CisJCShjZmctPnZodF9tYXhfYW1wZHVfbGVuX2V4cCA8PAorCQkgSUVFRTgwMjExX1ZIVF9DQVBfTUFYX0FfTVBEVV9MRU5HVEhfRVhQT05FTlRfU0hJRlQpOworCisJaWYgKGNmZy0+dmh0X3N1X2Jmb3JtZXIgJiBXTUlfVkhUX0NBUF9TVV9CRk9STUVSKQorCQliYW5kXzVnLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NBUF9TVV9CRUFNRk9STUVSX0NBUEFCTEU7CisJaWYgKGNmZy0+dmh0X3N1X2Jmb3JtZWUgJiBXTUlfVkhUX0NBUF9TVV9CRk9STUVFKQorCQliYW5kXzVnLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NBUF9TVV9CRUFNRk9STUVFX0NBUEFCTEU7CisJaWYgKGNmZy0+dmh0X211X2Jmb3JtZXIgJiBXTUlfVkhUX0NBUF9NVV9CRk9STUVSKQorCQliYW5kXzVnLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NBUF9NVV9CRUFNRk9STUVSX0NBUEFCTEU7CisJaWYgKGNmZy0+dmh0X211X2Jmb3JtZWUgJiBXTUlfVkhUX0NBUF9NVV9CRk9STUVFKQorCQliYW5kXzVnLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NBUF9NVV9CRUFNRk9STUVFX0NBUEFCTEU7CisKKwlpZiAoY2ZnLT52aHRfdHhvcF9wcyAmIFdNSV9WSFRfQ0FQX1RYT1BfUFMpCisJCWJhbmRfNWctPnZodF9jYXAuY2FwIHw9IElFRUU4MDIxMV9WSFRfQ0FQX1ZIVF9UWE9QX1BTOworCit9CisjZW5kaWYgLyogI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDICovCisKK3ZvaWQgaGRkX3VwZGF0ZV90Z3RfY2ZnKHZvaWQgKmNvbnRleHQsIHZvaWQgKnBhcmFtKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSAoaGRkX2NvbnRleHRfdCAqKSBjb250ZXh0OworCXN0cnVjdCB3bWFfdGd0X2NmZyAqY2ZnID0gcGFyYW07CisJdWludDhfdCB0ZW1wX2JhbmRfY2FwOworCisJLyogZmlyc3Qgc3RvcmUgdGhlIElOSSBiYW5kIGNhcGFiaWxpdHkgKi8KKwl0ZW1wX2JhbmRfY2FwID0gaGRkX2N0eC0+Y29uZmlnLT5uQmFuZENhcGFiaWxpdHk7CisKKwloZGRfY3R4LT5jb25maWctPm5CYW5kQ2FwYWJpbGl0eSA9IGNmZy0+YmFuZF9jYXA7CisKKwkvKiBub3cgb3ZlcndyaXRlIHRoZSB0YXJnZXQgYmFuZCBjYXBhYmlsaXR5IHdpdGggSU5JCisJICAgc2V0dGluZyBpZiBJTkkgc2V0dGluZyBpcyBhIHN1YnNldCAqLworCisJaWYgKChoZGRfY3R4LT5jb25maWctPm5CYW5kQ2FwYWJpbGl0eSA9PSBlQ1NSX0JBTkRfQUxMKSAmJgorCSAgICAodGVtcF9iYW5kX2NhcCAhPSBlQ1NSX0JBTkRfQUxMKSkKKwkJaGRkX2N0eC0+Y29uZmlnLT5uQmFuZENhcGFiaWxpdHkgPSB0ZW1wX2JhbmRfY2FwOworCWVsc2UgaWYgKChoZGRfY3R4LT5jb25maWctPm5CYW5kQ2FwYWJpbGl0eSAhPSBlQ1NSX0JBTkRfQUxMKSAmJgorCQkgKHRlbXBfYmFuZF9jYXAgIT0gZUNTUl9CQU5EX0FMTCkgJiYKKwkJIChoZGRfY3R4LT5jb25maWctPm5CYW5kQ2FwYWJpbGl0eSAhPSB0ZW1wX2JhbmRfY2FwKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCSAgICAgICBGTCgiaW5pIEJhbmRDYXBhYmlsaXR5IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldCIpKTsKKwl9CisKKwlpZiAoIWNkc19pc19sb2dwX2luX3Byb2dyZXNzKCkpIHsKKwkJaGRkX2N0eC0+cmVnLnJlZ19kb21haW4gPSBjZmctPnJlZ19kb21haW47CisJCWhkZF9jdHgtPnJlZy5lZXByb21fcmRfZXh0ID0gY2ZnLT5lZXByb21fcmRfZXh0OworCX0KKworCS8qIFRoaXMgY2FuIGJlIGV4dGVuZGVkIHRvIG90aGVyIGNvbmZpZ3VyYXRpb25zIGxpa2UgaHQsIHZodCBjYXAuLi4gKi8KKworCWlmICghY2RmX2lzX21hY2FkZHJfemVybygmY2ZnLT5od19tYWNhZGRyKSkgeworCQloZGRfdXBkYXRlX21hY2FkZHIoaGRkX2N0eC0+Y29uZmlnLCBjZmctPmh3X21hY2FkZHIpOworCX0gZWxzZSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgKKwkJCSAgIkludmFsaWQgTUFDIHBhc3NlZCBmcm9tIHRhcmdldCwgdXNpbmcgTUFDIGZyb20gaW5pIGZpbGUiCisJCQkgIE1BQ19BRERSRVNTX1NUUiksCisJCSAgICAgICBNQUNfQUREUl9BUlJBWShoZGRfY3R4LT5jb25maWctPmludGZNYWNBZGRyWzBdLmJ5dGVzKSk7CisJfQorCisJaGRkX2N0eC0+dGFyZ2V0X2Z3X3ZlcnNpb24gPSBjZmctPnRhcmdldF9md192ZXJzaW9uOworCisJaGRkX2N0eC0+bWF4X2ludGZfY291bnQgPSBjZmctPm1heF9pbnRmX2NvdW50OworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0xQU1MKKwloZGRfY3R4LT5scHNzX3N1cHBvcnQgPSBjZmctPmxwc3Nfc3VwcG9ydDsKKyNlbmRpZgorCisJaGRkX2N0eC0+YXBfYXJwbnNfc3VwcG9ydCA9IGNmZy0+YXBfYXJwbnNfc3VwcG9ydDsKKwloZGRfdXBkYXRlX3RndF9zZXJ2aWNlcyhoZGRfY3R4LCAmY2ZnLT5zZXJ2aWNlcyk7CisKKwloZGRfdXBkYXRlX3RndF9odF9jYXAoaGRkX2N0eCwgJmNmZy0+aHRfY2FwKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaGRkX3VwZGF0ZV90Z3Rfdmh0X2NhcChoZGRfY3R4LCAmY2ZnLT52aHRfY2FwKTsKKyNlbmRpZiAvKiAjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMgKi8KK30KKworLyoqCisgKiBoZGRfZGZzX2luZGljYXRlX3JhZGFyKCkgLSBoYW5kbGUgcmFkYXIgZGV0ZWN0aW9uIG9uIGN1cnJlbnQgU0FQIGNoYW5uZWwKKyAqIEBjb250ZXh0OglIREQgY29udGV4dCBwb2ludGVyCisgKiBAcGFyYW06CUhERCByYWRhciBpbmRpY2F0aW9uIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2hlbiBhIHJhZGFyIGluIGZvdW5kIG9uIHRoZQorICogU0FQIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwgYW5kIERhdGEgVHggZnJvbSBuZXRpZgorICogaGFzIHRvIGJlIHN0b3BwZWQgdG8gaG9ub3IgdGhlIERGUyByZWd1bGF0aW9ucy4KKyAqIEFjdGlvbnM6IFN0b3AgdGhlIG5ldGlmIFR4IHF1ZXVlcyxJbmRpY2F0ZSBSYWRhciBwcmVzZW50CisgKiBpbiBIREQgY29udGV4dCBmb3IgZnV0dXJlIHVzYWdlLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGhkZF9kZnNfaW5kaWNhdGVfcmFkYXIodm9pZCAqY29udGV4dCwgdm9pZCAqcGFyYW0pCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IChoZGRfY29udGV4dF90ICopIGNvbnRleHQ7CisJc3RydWN0IHdtYV9kZnNfcmFkYXJfaW5kICpoZGRfcmFkYXJfZXZlbnQgPQorCQkoc3RydWN0IHdtYV9kZnNfcmFkYXJfaW5kICopcGFyYW07CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKGhkZF9jdHggPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGhkZF9yYWRhcl9ldmVudCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoaGRkX2N0eC0+Y29uZmlnLT5kaXNhYmxlREZTQ2hTd2l0Y2gpCisJCXJldHVybjsKKworCWlmICh0cnVlID09IGhkZF9yYWRhcl9ldmVudC0+ZGZzX3JhZGFyX3N0YXR1cykgeworCQloZGRfY3R4LT5kZnNfcmFkYXJfZm91bmQgPSB0cnVlOworCisJCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlck5vZGUpOworCQl3aGlsZSAoTlVMTCAhPSBhZGFwdGVyTm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCQlhZGFwdGVyID0gYWRhcHRlck5vZGUtPnBBZGFwdGVyOworCQkJaWYgKFdMQU5fSEREX1NPRlRBUCA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSB8fAorCQkJICAgIFdMQU5fSEREX1AyUF9HTyA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQkJCVdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKGFkYXB0ZXIpLT4KKwkJCQlkZnNfY2FjX2Jsb2NrX3R4ID0gdHJ1ZTsKKwkJCX0KKworCQkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIoaGRkX2N0eCwKKwkJCQkJCSAgICAgIGFkYXB0ZXJOb2RlLAorCQkJCQkJICAgICAgJnBOZXh0KTsKKwkJCWFkYXB0ZXJOb2RlID0gcE5leHQ7CisJCX0KKwl9Cit9CisjZW5kaWYKKworLyoqCisgKiBoZGRfaXNfdmFsaWRfbWFjX2FkZHJlc3MoKSAtIHZhbGlkYXRlIE1BQyBhZGRyZXNzCisgKiBAcE1hY0FkZHI6CVBvaW50ZXIgdG8gdGhlIGlucHV0IE1BQyBhZGRyZXNzCisgKgorICogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gTUFDIGFkZHJlc3MgaXMgdmFsaWQgb3Igbm90CisgKiBFeHBlY3RlZCBNQUMgYWRkcmVzcyBpcyBvZiB0aGUgZm9ybWF0IFhYOlhYOlhYOlhYOlhYOlhYCisgKiB3aGVyZSBYIGlzIHRoZSBoZXhhIGRlY2ltYWwgZGlnaXQgY2hhcmFjdGVyIGFuZCBzZXBhcmF0ZWQgYnkgJzonCisgKiBUaGlzIGFsZ29yaXRobSB3b3JrcyBldmVuIGlmIE1BQyBhZGRyZXNzIGlzIG5vdCBzZXBhcmF0ZWQgYnkgJzonCisgKgorICogVGhpcyBjb2RlIGNoZWNrcyBnaXZlbiBpbnB1dCBzdHJpbmcgbWFjIGNvbnRhaW5zIGV4YWN0bHkgMTIgaGV4YWRlY2ltYWwKKyAqIGRpZ2l0cyBhbmQgYSBzZXBhcmF0b3IgY29sb24gOiBhcHBlYXJzIGluIHRoZSBpbnB1dCBzdHJpbmcgb25seSBhZnRlcgorICogYW4gZXZlbiBudW1iZXIgb2YgaGV4IGRpZ2l0cy4KKyAqCisgKiBSZXR1cm46IDEgZm9yIHZhbGlkIGFuZCAwIGZvciBpbnZhbGlkCisgKi8KK2Jvb2wgaGRkX2lzX3ZhbGlkX21hY19hZGRyZXNzKGNvbnN0IHVpbnQ4X3QgKnBNYWNBZGRyKQoreworCWludCB4ZGlnaXQgPSAwOworCWludCBzZXBhcmF0b3IgPSAwOworCXdoaWxlICgqcE1hY0FkZHIpIHsKKwkJaWYgKGlzeGRpZ2l0KCpwTWFjQWRkcikpIHsKKwkJCXhkaWdpdCsrOworCQl9IGVsc2UgaWYgKCc6JyA9PSAqcE1hY0FkZHIpIHsKKwkJCWlmICgwID09IHhkaWdpdCB8fCAoKHhkaWdpdCAvIDIpIC0gMSkgIT0gc2VwYXJhdG9yKQorCQkJCWJyZWFrOworCisJCQkrK3NlcGFyYXRvcjsKKwkJfSBlbHNlIHsKKwkJCS8qIEludmFsaWQgTUFDIGZvdW5kICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQkrK3BNYWNBZGRyOworCX0KKwlyZXR1cm4geGRpZ2l0ID09IDEyICYmIChzZXBhcmF0b3IgPT0gNSB8fCBzZXBhcmF0b3IgPT0gMCk7Cit9CisKKy8qKgorICogX19oZGRfb3BlbigpIC0gSEREIE9wZW4gZnVuY3Rpb24KKyAqIEBkZXY6CVBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBpbiByZXNwb25zZSB0byBpZmNvbmZpZyB1cAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzczsgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX2hkZF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCWludCByZXQ7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELCBUUkFDRV9DT0RFX0hERF9PUEVOX1JFUVVFU1QsCisJCQkgYWRhcHRlci0+c2Vzc2lvbklkLCBhZGFwdGVyLT5kZXZpY2VfbW9kZSkpOworCisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJc2V0X2JpdChERVZJQ0VfSUZBQ0VfT1BFTkVELCAmYWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCWlmIChoZGRfY29ubl9pc19jb25uZWN0ZWQoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKSkpIHsKKwkJaGRkTG9nKExPRzEsIEZMKCJFbmFibGluZyBUeCBRdWV1ZXMiKSk7CisJCS8qIEVuYWJsZSBUWCBxdWV1ZXMgb25seSB3aGVuIHdlIGFyZSBjb25uZWN0ZWQgKi8KKwkJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChhZGFwdGVyLAorCQkJCQlXTEFOX1NUQVJUX0FMTF9ORVRJRl9RVUVVRSwKKwkJCQkJV0xBTl9DT05UUk9MX1BBVEgpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGRkX29wZW4oKSAtIFdyYXBwZXIgZnVuY3Rpb24gZm9yIF9faGRkX29wZW4gdG8gcHJvdGVjdCBpdCBmcm9tIFNTUgorICogQGRldjoJUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGlmY29uZmlnIHVwCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzOyBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgaGRkX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2hkZF9vcGVuKGRldik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2hkZF9zdG9wKCkgLSBIREQgc3RvcCBmdW5jdGlvbgorICogQGRldjoJUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGlmY29uZmlnIGRvd24KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3M7IG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX19oZGRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsIFRSQUNFX0NPREVfSEREX1NUT1BfUkVRVUVTVCwKKwkJCSBhZGFwdGVyLT5zZXNzaW9uSWQsIGFkYXB0ZXItPmRldmljZV9tb2RlKSk7CisKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBOb3RoaW5nIHRvIGJlIGRvbmUgaWYgdGhlIGludGVyZmFjZSBpcyBub3Qgb3BlbmVkICovCisJaWYgKGZhbHNlID09IHRlc3RfYml0KERFVklDRV9JRkFDRV9PUEVORUQsICZhZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJORVRERVYgSW50ZXJmYWNlIGlzIG5vdCBPUEVORUQiKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgaW50ZXJmYWNlIGlzIG1hcmtlZCBhcyBjbG9zZWQgKi8KKwljbGVhcl9iaXQoREVWSUNFX0lGQUNFX09QRU5FRCwgJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sIEZMKCJEaXNhYmxpbmcgT1MgVHggcXVldWVzIikpOworCisJLyoKKwkgKiBEaXNhYmxlIFRYIG9uIHRoZSBpbnRlcmZhY2UsIGFmdGVyIHRoaXMgaGFyZF9zdGFydF94bWl0KCkgd2lsbCBub3QKKwkgKiBiZSBjYWxsZWQgb24gdGhhdCBpbnRlcmZhY2UKKwkgKi8KKwloZGRMb2coTE9HMSwgRkwoIkRpc2FibGluZyBxdWV1ZXMiKSk7CisJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChhZGFwdGVyLCBXTEFOX05FVElGX1RYX0RJU0FCTEVfTl9DQVJSSUVSLAorCQkJCSAgIFdMQU5fQ09OVFJPTF9QQVRIKTsKKworCS8qCisJICogVGhlIGludGVyZmFjZSBpcyBtYXJrZWQgYXMgZG93biBmb3Igb3V0c2lkZSB3b3JsZCAoYWthIGtlcm5lbCkKKwkgKiBCdXQgdGhlIGRyaXZlciBpcyBwcmV0dHkgbXVjaCBhbGl2ZSBpbnNpZGUuIFRoZSBkcml2ZXIgbmVlZHMgdG8KKwkgKiB0ZWFyIGRvd24gdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gb24gdGhlIG5ldGRldiAoc2Vzc2lvbikKKwkgKiBjbGVhbnVwIHRoZSBkYXRhIHBpcGVzIGFuZCB3YWl0IHVudGlsIHRoZSBjb250cm9sIHBsYW5lIGlzIHN0YWJpbGl6ZWQKKwkgKiBmb3IgdGhpcyBpbnRlcmZhY2UuIFRoZSBjYWxsIGFsc28gbmVlZHMgdG8gd2FpdCB1bnRpbCB0aGUgYWJvdmUKKwkgKiBtZW50aW9uZWQgYWN0aW9ucyBhcmUgY29tcGxldGVkIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIGNhbGxlci4KKwkgKiBOb3RpY2UgdGhhdCB0aGUgaGRkX3N0b3BfYWRhcHRlciBpcyByZXF1ZXN0ZWQgbm90IHRvIGNsb3NlIHRoZSBzZXNzaW9uCisJICogVGhhdCBpcyBpbnRlbnRpb25hbCB0byBiZSBhYmxlIHRvIHNjYW4gaWYgaXQgaXMgYSBTVEEvUDJQIGludGVyZmFjZQorCSAqLworCWhkZF9zdG9wX2FkYXB0ZXIoaGRkX2N0eCwgYWRhcHRlciwgZmFsc2UpOworCisJLyogRGVJbml0IHRoZSBhZGFwdGVyLiBUaGlzIGVuc3VyZXMgZGF0YXBhdGggY2xlYW51cCBhcyB3ZWxsICovCisJaGRkX2RlaW5pdF9hZGFwdGVyKGhkZF9jdHgsIGFkYXB0ZXIsIHRydWUpOworCisJRVhJVCgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9zdG9wKCkgLSBXcmFwcGVyIGZ1bmN0aW9uIGZvciBfX2hkZF9zdG9wIHRvIHByb3RlY3QgaXQgZnJvbSBTU1IKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBpbiByZXNwb25zZSB0byBpZmNvbmZpZyBkb3duCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIGFuZCBlcnJvciBudW1iZXIgZm9yIGZhaWx1cmUKKyAqLworaW50IGhkZF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19oZGRfc3RvcChkZXYpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19oZGRfdW5pbml0KCkgLSBIREQgdW5pbml0IGZ1bmN0aW9uCisgKiBAZGV2OglQb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBuZXRkZXYgdW5yZWdpc3RlciB0byB1bmluaXRpYWxpemUgYWxsIGRhdGEKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIF9faGRkX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKworCUVOVEVSKCk7CisKKwlkbyB7CisJCWlmIChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IGFkYXB0ZXItPm1hZ2ljKSB7CisJCQloZGRMb2coTE9HUCwgRkwoIkludmFsaWQgbWFnaWMiKSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChOVUxMID09IGFkYXB0ZXItPnBIZGRDdHgpIHsKKwkJCWhkZExvZyhMT0dQLCBGTCgiTlVMTCBoZGRfY3R4IikpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGV2ICE9IGFkYXB0ZXItPmRldikgeworCQkJaGRkTG9nKExPR1AsIEZMKCJJbnZhbGlkIGRldmljZSByZWZlcmVuY2UiKSk7CisJCQkvKgorCQkJICogd2UgaGF2ZW4ndCB2YWxpZGF0ZWQgYWxsIGNhc2VzIHNvIGxldCB0aGlzIGdvIGZvcgorCQkJICogbm93CisJCQkgKi8KKwkJfQorCisJCWhkZF9kZWluaXRfYWRhcHRlcihhZGFwdGVyLT5wSGRkQ3R4LCBhZGFwdGVyLCB0cnVlKTsKKworCQkvKiBhZnRlciB1bmluaXQgb3VyIGFkYXB0ZXIgc3RydWN0dXJlIHdpbGwgbm8gbG9uZ2VyIGJlIHZhbGlkICovCisJCWFkYXB0ZXItPmRldiA9IE5VTEw7CisJCWFkYXB0ZXItPm1hZ2ljID0gMDsKKwl9IHdoaWxlICgwKTsKKworCUVYSVQoKTsKK30KKworLyoqCisgKiBoZGRfdW5pbml0KCkgLSBXcmFwcGVyIGZ1bmN0aW9uIHRvIHByb3RlY3QgX19oZGRfdW5pbml0IGZyb20gU1NSCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBuZXRkZXYgdW5yZWdpc3RlciB0byB1bmluaXRpYWxpemUgYWxsIGRhdGEKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF91bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCV9faGRkX3VuaW5pdChkZXYpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKK30KKworLyoqCisgKiBfX2hkZF9zZXRfbWFjX2FkZHJlc3MoKSAtIHNldCB0aGUgdXNlciBzcGVjaWZpZWQgbWFjIGFkZHJlc3MKKyAqIEBkZXY6CVBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgKiBAYWRkcjoJUG9pbnRlciB0byB0aGUgc29ja2FkZHIuCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtYWMgYWRkcmVzcyB1c2luZworICogdGhlIGNvbW1hbmQgaWZjb25maWcgd2xhblggaHcgZXRoZXIgPG1hYyBhZHJlc3M+LgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX2hkZF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnBzdGFfbWFjX2FkZHIgPSBhZGRyOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1lbWNweSgmYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQsIHBzdGFfbWFjX2FkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgcHN0YV9tYWNfYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCisJRVhJVCgpOworCXJldHVybiBjZGZfcmV0X3N0YXR1czsKK30KKworLyoqCisgKiBoZGRfc2V0X21hY19hZGRyZXNzKCkgLSBXcmFwcGVyIGZ1bmN0aW9uIHRvIHByb3RlY3QgX19oZGRfc2V0X21hY19hZGRyZXNzKCkKKyAqCQkJZnVuY3Rpb24gZnJvbSBTU1IKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqIEBhZGRyOiBQb2ludGVyIHRvIHRoZSBzb2NrYWRkcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbWFjIGFkZHJlc3MgdXNpbmcKKyAqIHRoZSBjb21tYW5kIGlmY29uZmlnIHdsYW5YIGh3IGV0aGVyIDxtYWMgYWRyZXNzPi4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgaGRkX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faGRkX3NldF9tYWNfYWRkcmVzcyhkZXYsIGFkZHIpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKK3VpbnQ4X3QgKndsYW5faGRkX2dldF9pbnRmX2FkZHIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQ0RGX01BWF9DT05DVVJSRU5DWV9QRVJTT05BOyBpKyspIHsKKwkJaWYgKDAgPT0gKChoZGRfY3R4LT5jb25maWctPmludGZBZGRyTWFzaykgJiAoMSA8PCBpKSkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoQ0RGX01BWF9DT05DVVJSRU5DWV9QRVJTT05BID09IGkpCisJCXJldHVybiBOVUxMOworCisJaGRkX2N0eC0+Y29uZmlnLT5pbnRmQWRkck1hc2sgfD0gKDEgPDwgaSk7CisJcmV0dXJuICZoZGRfY3R4LT5jb25maWctPmludGZNYWNBZGRyW2ldLmJ5dGVzWzBdOworfQorCit2b2lkIHdsYW5faGRkX3JlbGVhc2VfaW50Zl9hZGRyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIHVpbnQ4X3QgKnJlbGVhc2VBZGRyKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBDREZfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkE7IGkrKykgeworCQlpZiAoIW1lbWNtcChyZWxlYXNlQWRkciwKKwkJCSAgICAmaGRkX2N0eC0+Y29uZmlnLT5pbnRmTWFjQWRkcltpXS5ieXRlc1swXSwKKwkJCSAgICA2KSkgeworCQkJaGRkX2N0eC0+Y29uZmlnLT5pbnRmQWRkck1hc2sgJj0gfigxIDw8IGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKy8qKgorICogX19oZGRfc2V0X211bHRpY2FzdF9saXN0KCkgLSBzZXQgdGhlIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QKKyAqIEBkZXY6CVBvaW50ZXIgdG8gdGhlIFdMQU4gZGV2aWNlLgorICogQHNrYjoJUG9pbnRlciB0byBPUyBwYWNrZXQgKHNrX2J1ZmYpLgorICoKKyAqIFRoaXMgZnVuY2l0b24gc2V0cyB0aGUgbXVsdGljYXN0IGFkZHJlc3MgbGlzdC4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgX19oZGRfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWludCBtY19jb3VudDsKKwlpbnQgaSA9IDAsIHN0YXR1czsKKwlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXN0YXRpYyBjb25zdCB1aW50OF90IGlwdjZfcm91dGVyX3NvbGljaXRhdGlvbltdCisJCQk9IHsweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDAwLCAweDAyfTsKKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZF9lcnIoImhkZF9jdHggaXMgbm90IHZhbGlkIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICAgICBGTCgiYWxsb3cgYWxsIG11bHRpY2FzdCBmcmFtZXMiKSk7CisJCWFkYXB0ZXItPm1jX2FkZHJfbGlzdC5tY19jbnQgPSAwOworCX0gZWxzZSB7CisJCW1jX2NvdW50ID0gbmV0ZGV2X21jX2NvdW50KGRldik7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAgICAgIEZMKCJtY19jb3VudCA9ICV1IiksIG1jX2NvdW50KTsKKwkJaWYgKG1jX2NvdW50ID4gV0xBTl9IRERfTUFYX01DX0FERFJfTElTVCkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAgICAgIEZMKAorCQkJCSAgIk5vIGZyZWUgZmlsdGVyIGF2YWlsYWJsZTsgYWxsb3cgYWxsIG11bHRpY2FzdCBmcmFtZXMiCisJCQkJICkpOworCQkJYWRhcHRlci0+bWNfYWRkcl9saXN0Lm1jX2NudCA9IDA7CisJCQlyZXR1cm47CisJCX0KKworCQlhZGFwdGVyLT5tY19hZGRyX2xpc3QubWNfY250ID0gbWNfY291bnQ7CisKKwkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgeworCQkJaWYgKGkgPT0gbWNfY291bnQpCisJCQkJYnJlYWs7CisJCQkvKgorCQkJICogU2tpcCBmb2xsb3dpbmcgYWRkcmVzc2VzOgorCQkJICogMSlJUHY2IHJvdXRlciBzb2xpY2l0YXRpb24gYWRkcmVzcworCQkJICogMilBbnkgb3RoZXIgYWRkcmVzcyBwYXR0ZXJuIGlmIGl0cyBzZXQgZHVyaW5nCisJCQkgKiAgUlhGSUxURVIgUkVNT1ZFIGRyaXZlciBjb21tYW5kIGJhc2VkIG9uCisJCQkgKiAgYWRkcl9maWx0ZXJfcGF0dGVybgorCQkJICovCisJCQlpZiAoKCFtZW1jbXAoaGEtPmFkZHIsIGlwdjZfcm91dGVyX3NvbGljaXRhdGlvbiwKKwkJCSAgIEVUSF9BTEVOKSkgfHwKKwkJCSAgIChhZGFwdGVyLT5hZGRyX2ZpbHRlcl9wYXR0ZXJuICYmICghbWVtY21wKGhhLT5hZGRyLAorCQkJICAgICZhZGFwdGVyLT5hZGRyX2ZpbHRlcl9wYXR0ZXJuLCAxKSkpKSB7CisJCQkJaGRkX2VycigiTUMvQkMgZmlsdGVyaW5nIFNraXAgYWRkciA9Ik1BQ19BRERSRVNTX1NUUiwKKwkJCQkJTUFDX0FERFJfQVJSQVkoaGEtPmFkZHIpKTsKKwkJCQlhZGFwdGVyLT5tY19hZGRyX2xpc3QubWNfY250LS07CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCW1lbXNldCgmKGFkYXB0ZXItPm1jX2FkZHJfbGlzdC5hZGRyW2ldWzBdKSwgMCwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCQltZW1jcHkoJihhZGFwdGVyLT5tY19hZGRyX2xpc3QuYWRkcltpXVswXSksIGhhLT5hZGRyLAorCQkJICAgICAgIEVUSF9BTEVOKTsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgICAgICBGTCgibWxpc3RbJWRdID0gIiBNQUNfQUREUkVTU19TVFIpLCBpLAorCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKGFkYXB0ZXItPm1jX2FkZHJfbGlzdC5hZGRyW2ldKSk7CisJCQlpKys7CisJCX0KKwl9CisJaWYgKGhkZF9jdHgtPmNvbmZpZy0+YWN0aXZlX21vZGVfb2ZmbG9hZCkgeworCQloZGRfaW5mbygiZW5hYmxlIG1jIGZpbHRlcmluZyIpOworCQl3bGFuX2hkZF9zZXRfbWNfYWRkcl9saXN0KGFkYXB0ZXIsIHRydWUpOworCX0gZWxzZSB7CisJCWhkZF9pbmZvKCJza2lwIG1jIGZpbHRlcmluZyBlbmFibGUgaXQgZHVyaW5nIGNmZzgwMjExIHN1c3BlbmQiKTsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIGhkZF9zZXRfbXVsdGljYXN0X2xpc3QoKSAtIFNTUiB3cmFwcGVyIGZ1bmN0aW9uIGZvciBfX2hkZF9zZXRfbXVsdGljYXN0X2xpc3QKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlfX2hkZF9zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7Cit9CisjZW5kaWYKKworLyoqCisgKiBoZGRfc2VsZWN0X3F1ZXVlKCkgLSB1c2VkIGJ5IExpbnV4IE9TIHRvIGRlY2lkZSB3aGljaCBxdWV1ZSB0byB1c2UgZmlyc3QKKyAqIEBkZXY6CVBvaW50ZXIgdG8gdGhlIFdMQU4gZGV2aWNlLgorICogQHNrYjoJUG9pbnRlciB0byBPUyBwYWNrZXQgKHNrX2J1ZmYpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBMaW51eCBPUyBmb3IgbmV0d29yaworICogY29yZSB0byBkZWNpZGUgd2hpY2ggcXVldWUgdG8gdXNlIGZpcnN0LgorICoKKyAqIFJldHVybjogYWMsIFF1ZXVlIEluZGV4L2FjY2VzcyBjYXRlZ29yeSBjb3JyZXNwb25kaW5nIHRvIFVQIGluIElQIGhlYWRlcgorICovCitzdGF0aWMgdWludDE2X3QgaGRkX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxMywgMCkpCisJCQkgICwgdm9pZCAqYWNjZWxfcHJpdgorI2VuZGlmCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNCwgMCkpCisJCQkgICwgc2VsZWN0X3F1ZXVlX2ZhbGxiYWNrX3QgZmFsbGJhY2sKKyNlbmRpZgorKQoreworCXJldHVybiBoZGRfd21tX3NlbGVjdF9xdWV1ZShkZXYsIHNrYik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgd2xhbl9kcnZfb3BzID0geworCS5uZG9fb3BlbiA9IGhkZF9vcGVuLAorCS5uZG9fc3RvcCA9IGhkZF9zdG9wLAorCS5uZG9fdW5pbml0ID0gaGRkX3VuaW5pdCwKKwkubmRvX3N0YXJ0X3htaXQgPSBoZGRfaGFyZF9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dCA9IGhkZF90eF90aW1lb3V0LAorCS5uZG9fZ2V0X3N0YXRzID0gaGRkX2dldF9zdGF0cywKKwkubmRvX2RvX2lvY3RsID0gaGRkX2lvY3RsLAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gaGRkX3NldF9tYWNfYWRkcmVzcywKKwkubmRvX3NlbGVjdF9xdWV1ZSA9IGhkZF9zZWxlY3RfcXVldWUsCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMywgMSwgMCkpCisJLm5kb19zZXRfcnhfbW9kZSA9IGhkZF9zZXRfbXVsdGljYXN0X2xpc3QsCisjZWxzZQorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gaGRkX3NldF9tdWx0aWNhc3RfbGlzdCwKKyNlbmRpZiAvKiBMSU5VWF9WRVJTSU9OX0NPREUgKi8KKyNlbmRpZgorfTsKKwordm9pZCBoZGRfc2V0X3N0YXRpb25fb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpwV2xhbkRldikKK3sKKwlwV2xhbkRldi0+bmV0ZGV2X29wcyA9ICZ3bGFuX2Rydl9vcHM7Cit9CisKK3N0YXRpYyBoZGRfYWRhcHRlcl90ICpoZGRfYWxsb2Nfc3RhdGlvbl9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJCQl0U2lyTWFjQWRkciBtYWNBZGRyLAorCQkJCQkJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcFdsYW5EZXYgPSBOVUxMOworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBOVUxMOworCS8qCisJICogY2ZnODAyMTEgaW5pdGlhbGl6YXRpb24gYW5kIHJlZ2lzdHJhdGlvbi4uLi4KKwkgKi8KKwlwV2xhbkRldiA9CisJCWFsbG9jX25ldGRldl9tcShzaXplb2YoaGRkX2FkYXB0ZXJfdCksIG5hbWUsCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNywgMCkpCisJCQkJTkVUX05BTUVfVU5LTk9XTiwKKyNlbmRpZgorCQkJCWV0aGVyX3NldHVwLAorCQkJCU5VTV9UWF9RVUVVRVMpOworCisJaWYgKHBXbGFuRGV2ICE9IE5VTEwpIHsKKworCQkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlIGluIHRoZSBIREQgYWRhcHRlciAqLworCQlhZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYocFdsYW5EZXYpOworCisJCWNkZl9tZW1femVybyhhZGFwdGVyLCBzaXplb2YoaGRkX2FkYXB0ZXJfdCkpOworCisJCWFkYXB0ZXItPmRldiA9IHBXbGFuRGV2OworCQlhZGFwdGVyLT5wSGRkQ3R4ID0gaGRkX2N0eDsKKwkJYWRhcHRlci0+bWFnaWMgPSBXTEFOX0hERF9BREFQVEVSX01BR0lDOworCisJCWluaXRfY29tcGxldGlvbigmYWRhcHRlci0+c2Vzc2lvbl9vcGVuX2NvbXBfdmFyKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZhZGFwdGVyLT5zZXNzaW9uX2Nsb3NlX2NvbXBfdmFyKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZhZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZhZGFwdGVyLT5saW5rdXBfZXZlbnRfdmFyKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZhZGFwdGVyLT5jYW5jZWxfcmVtX29uX2NoYW5fdmFyKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZhZGFwdGVyLT5yZW1fb25fY2hhbl9yZWFkeV9ldmVudCk7CisJCWluaXRfY29tcGxldGlvbigmYWRhcHRlci0+c3RhX2F1dGhvcml6ZWRfZXZlbnQpOworCQlpbml0X2NvbXBsZXRpb24oJmFkYXB0ZXItPm9mZmNoYW5uZWxfdHhfZXZlbnQpOworCQlpbml0X2NvbXBsZXRpb24oJmFkYXB0ZXItPnR4X2FjdGlvbl9jbmZfZXZlbnQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJCWluaXRfY29tcGxldGlvbigmYWRhcHRlci0+dGRsc19hZGRfc3RhdGlvbl9jb21wKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZhZGFwdGVyLT50ZGxzX2RlbF9zdGF0aW9uX2NvbXApOworCQlpbml0X2NvbXBsZXRpb24oJmFkYXB0ZXItPnRkbHNfbWdtdF9jb21wKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZhZGFwdGVyLT50ZGxzX2xpbmtfZXN0YWJsaXNoX3JlcV9jb21wKTsKKyNlbmRpZgorCQlpbml0X2NvbXBsZXRpb24oJmFkYXB0ZXItPmNoYW5nZV9jb3VudHJ5X2NvZGUpOworCisKKwkJaW5pdF9jb21wbGV0aW9uKCZhZGFwdGVyLT5zY2FuX2luZm8uYWJvcnRzY2FuX2V2ZW50X3Zhcik7CisKKwkJYWRhcHRlci0+b2ZmbG9hZHNfY29uZmlndXJlZCA9IGZhbHNlOworCQlhZGFwdGVyLT5pc0xpbmtVcFN2Y05lZWRlZCA9IGZhbHNlOworCQlhZGFwdGVyLT5oaWdoZXJEdGltVHJhbnNpdGlvbiA9IHRydWU7CisJCS8qIEluaXQgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlICovCisJCXN0cmxjcHkocFdsYW5EZXYtPm5hbWUsIG5hbWUsIElGTkFNU0laKTsKKworCQljZGZfbWVtX2NvcHkocFdsYW5EZXYtPmRldl9hZGRyLCAodm9pZCAqKW1hY0FkZHIsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQljZGZfbWVtX2NvcHkoYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsIG1hY0FkZHIsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwV2xhbkRldi0+d2F0Y2hkb2dfdGltZW8gPSBIRERfVFhfVElNRU9VVDsKKwkJcFdsYW5EZXYtPmhhcmRfaGVhZGVyX2xlbiArPSBMSUJSQV9IV19ORUVERURfSEVBRFJPT007CisKKwkJaWYgKGhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlX2lwX3RjcF91ZHBfY2hlY2tzdW1fb2ZmbG9hZCkKKwkJCXBXbGFuRGV2LT5mZWF0dXJlcyB8PQorCQkJCU5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNOworCQlwV2xhbkRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9SWENTVU07CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfVFNPKQorCQlpZiAoaGRkX2N0eC0+Y29uZmlnLT50c29fZW5hYmxlKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sIEZMKCJUU08gRW5hYmxlZFxuIikpOworCQkJcFdsYW5EZXYtPmZlYXR1cmVzIHw9CisJCQkJIE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNIHwKKwkJCQkgTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYgfCBORVRJRl9GX1NHOworCQl9CisjZW5kaWYKKwkJaGRkX3NldF9zdGF0aW9uX29wcyhhZGFwdGVyLT5kZXYpOworCisJCXBXbGFuRGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisJCXBXbGFuRGV2LT5pZWVlODAyMTFfcHRyID0gJmFkYXB0ZXItPndkZXY7CisJCWFkYXB0ZXItPndkZXYud2lwaHkgPSBoZGRfY3R4LT53aXBoeTsKKwkJYWRhcHRlci0+d2Rldi5uZXRkZXYgPSBwV2xhbkRldjsKKwkJLyogc2V0IHBXbGFuRGV2J3MgcGFyZW50IHRvIHVuZGVybHlpbmcgZGV2aWNlICovCisJCVNFVF9ORVRERVZfREVWKHBXbGFuRGV2LCBoZGRfY3R4LT5wYXJlbnRfZGV2KTsKKwkJaGRkX3dtbV9pbml0KGFkYXB0ZXIpOworCQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+cGF1c2VfbWFwX2xvY2spOworCX0KKworCXJldHVybiBhZGFwdGVyOworfQorCitDREZfU1RBVFVTIGhkZF9yZWdpc3Rlcl9pbnRlcmZhY2UoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgIHVpbnQ4X3QgcnRubF9sb2NrX2hlbGQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBXbGFuRGV2ID0gYWRhcHRlci0+ZGV2OworCS8qIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gJmFkYXB0ZXItPnNlc3Npb25DdHguc3RhdGlvbjsgKi8KKwkvKiBoZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWCggYWRhcHRlciApOyAqLworCS8qIENERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7ICovCisKKwlpZiAocnRubF9sb2NrX2hlbGQpIHsKKwkJaWYgKHN0cm5jaHIocFdsYW5EZXYtPm5hbWUsIHN0cmxlbihwV2xhbkRldi0+bmFtZSksICclJykpIHsKKwkJCWlmIChkZXZfYWxsb2NfbmFtZShwV2xhbkRldiwgcFdsYW5EZXYtPm5hbWUpIDwgMCkgeworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAgICAgIEZMKCJGYWlsZWQ6ZGV2X2FsbG9jX25hbWUiKSk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJfQorCQl9CisJCWlmIChyZWdpc3Rlcl9uZXRkZXZpY2UocFdsYW5EZXYpKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIEZMKCJGYWlsZWQ6cmVnaXN0ZXJfbmV0ZGV2IikpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihwV2xhbkRldikpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgRkwoIkZhaWxlZDpyZWdpc3Rlcl9uZXRkZXYiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwl9CisJc2V0X2JpdChORVRfREVWSUNFX1JFR0lTVEVSRUQsICZhZGFwdGVyLT5ldmVudF9mbGFncyk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgQ0RGX1NUQVRVUyBoZGRfc21lX2Nsb3NlX3Nlc3Npb25fY2FsbGJhY2sodm9pZCAqcENvbnRleHQpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IHBDb250ZXh0OworCisJaWYgKE5VTEwgPT0gYWRhcHRlcikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCBGTCgiTlVMTCBhZGFwdGVyIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWlmIChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IGFkYXB0ZXItPm1hZ2ljKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsIEZMKCJJbnZhbGlkIG1hZ2ljIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19OT1RfSU5JVElBTElaRUQ7CisJfQorCisJY2xlYXJfYml0KFNNRV9TRVNTSU9OX09QRU5FRCwgJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKworI2lmICFkZWZpbmVkIChDT05GSUdfQ05TUykgJiYgXAorCSFkZWZpbmVkIChXTEFOX09QRU5fU09VUkNFKQorCS8qCisJICogbmVlZCB0byBtYWtlIHN1cmUgYWxsIG9mIG91ciBzY2hlZHVsZWQgd29yayBoYXMgY29tcGxldGVkLgorCSAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGZyb20gTUMgdGhyZWFkIGNvbnRleHQsIHNvIGl0IGlzIHNhZmUgdG8KKwkgKiB0byBjYWxsIGJlbG93IGZsdXNoIHdvcmtxdWV1ZSBBUEkgZnJvbSBoZXJlLgorCSAqCisJICogRXZlbiB0aG91Z2ggdGhpcyBpcyBjYWxsZWQgZnJvbSBNQyB0aHJlYWQgY29udGV4dCwgaWYgdGhlcmUgaXMgYSBmYXVsdHkKKwkgKiB3b3JrIGl0ZW0gaW4gdGhlIHN5c3RlbSwgdGhhdCBjYW4gaGFuZyB0aGlzIGNhbGwgZm9yZXZlci4gIFNvIGZsdXNoaW5nCisJICogdGhpcyBnbG9iYWwgd29yayBxdWV1ZSBpcyBub3Qgc2FmZTsgYW5kIG5vdyB3ZSBtYWtlIHN1cmUgdGhhdAorCSAqIGluZGl2aWR1YWwgd29yayBxdWV1ZXMgYXJlIHN0b3BwZWQgY29ycmVjdGx5LiBCdXQgdGhlIGNhbmNlbCB3b3JrIHF1ZXVlCisJICogaXMgYSBHUEwgb25seSBBUEksIHNvIHRoZSBwcm9wcmlldGFyeSAgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIHdvdWxkIHN0aWxsCisJICogcmVseSBvbiB0aGUgZ2xvYmFsIHdvcmsgcXVldWUgZmx1c2guCisJICovCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKyNlbmRpZgorCisJLyoKKwkgKiBXZSBjYW4gYmUgYmxvY2tlZCB3aGlsZSB3YWl0aW5nIGZvciBzY2hlZHVsZWQgd29yayB0byBiZQorCSAqIGZsdXNoZWQsIGFuZCB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUgY2FuIHBvdGVudGlhbGx5IGJlIGZyZWVkLCBpbgorCSAqIHdoaWNoIGNhc2UgdGhlIG1hZ2ljIHdpbGwgaGF2ZSBiZWVuIHJlc2V0LiAgU28gbWFrZSBzdXJlIHRoZQorCSAqIG1hZ2ljIGlzIHN0aWxsIGdvb2QsIGFuZCBoZW5jZSB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUgaXMgc3RpbGwKKwkgKiB2YWxpZCwgYmVmb3JlIHNpZ25hbGluZyBjb21wbGV0aW9uCisJICovCisJaWYgKFdMQU5fSEREX0FEQVBURVJfTUFHSUMgPT0gYWRhcHRlci0+bWFnaWMpCisJCWNvbXBsZXRlKCZhZGFwdGVyLT5zZXNzaW9uX2Nsb3NlX2NvbXBfdmFyKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgaGRkX2luaXRfc3RhdGlvbl9tb2RlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBXbGFuRGV2ID0gYWRhcHRlci0+ZGV2OworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gJmFkYXB0ZXItPnNlc3Npb25DdHguc3RhdGlvbjsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdWludDMyX3QgdHlwZSwgc3ViVHlwZTsKKwl1bnNpZ25lZCBsb25nIHJjOworCWludCByZXRfdmFsOworCisJSU5JVF9DT01QTEVUSU9OKGFkYXB0ZXItPnNlc3Npb25fb3Blbl9jb21wX3Zhcik7CisJc21lX3NldF9jdXJyX2RldmljZV9tb2RlKGhkZF9jdHgtPmhIYWwsIGFkYXB0ZXItPmRldmljZV9tb2RlKTsKKwlzdGF0dXMgPSBjZHNfZ2V0X3ZkZXZfdHlwZXMoYWRhcHRlci0+ZGV2aWNlX21vZGUsICZ0eXBlLCAmc3ViVHlwZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJmYWlsZWQgdG8gZ2V0IHZkZXYgdHlwZSIpKTsKKwkJZ290byBlcnJvcl9zbWVfb3BlbjsKKwl9CisJLyogT3BlbiBhIFNNRSBzZXNzaW9uIGZvciBmdXR1cmUgb3BlcmF0aW9uICovCisJY2RmX3JldF9zdGF0dXMgPQorCQlzbWVfb3Blbl9zZXNzaW9uKGhkZF9jdHgtPmhIYWwsIGhkZF9zbWVfcm9hbV9jYWxsYmFjaywgYWRhcHRlciwKKwkJCQkgKHVpbnQ4X3QgKikgJmFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LAorCQkJCSAmYWRhcHRlci0+c2Vzc2lvbklkLCB0eXBlLCBzdWJUeXBlKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfcmV0X3N0YXR1cykpIHsKKwkJaGRkTG9nKExPR1AsCisJCSAgICAgICBGTCgic21lX29wZW5fc2Vzc2lvbigpIGZhaWxlZCwgc3RhdHVzIGNvZGUgJTA4ZCBbeCUwOHhdIiksCisJCSAgICAgICBjZGZfcmV0X3N0YXR1cywgY2RmX3JldF9zdGF0dXMpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlcnJvcl9zbWVfb3BlbjsKKwl9CisJLyogQmxvY2sgb24gYSBjb21wbGV0aW9uIHZhcmlhYmxlLiBDYW4ndCB3YWl0IGZvcmV2ZXIgdGhvdWdoLiAqLworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAorCQkmYWRhcHRlci0+c2Vzc2lvbl9vcGVuX2NvbXBfdmFyLAorCQltc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX1NFU1NJT05PUEVOQ0xPU0UpKTsKKwlpZiAoIXJjKSB7CisJCWhkZExvZyhMT0dQLAorCQkJRkwoIlNlc3Npb24gaXMgbm90IG9wZW5lZCB3aXRoaW4gdGltZW91dCBwZXJpb2QgY29kZSAlbGQiKSwKKwkJCXJjKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZXJyb3Jfc21lX29wZW47CisJfQorCisJLyogUmVnaXN0ZXIgd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLworCWNkZl9yZXRfc3RhdHVzID0gaGRkX3JlZ2lzdGVyX3dleHQocFdsYW5EZXYpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RmX3JldF9zdGF0dXMpIHsKKwkJaGRkTG9nKExPR1AsCisJCSAgICAgICBGTCgiaGRkX3JlZ2lzdGVyX3dleHQoKSBmYWlsZWQsIHN0YXR1cyBjb2RlICUwOGQgW3glMDh4XSIpLAorCQkgICAgICAgY2RmX3JldF9zdGF0dXMsIGNkZl9yZXRfc3RhdHVzKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZXJyb3JfcmVnaXN0ZXJfd2V4dDsKKwl9CisJLyogU2V0IHRoZSBDb25uZWN0aW9uIFN0YXRlIHRvIE5vdCBDb25uZWN0ZWQgKi8KKwloZGRMb2coTE9HMSwKKwkgICAgICAgRkwoIlNldCBIREQgY29ublN0YXRlIHRvIGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkIikpOworCXBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUgPSBlQ29ubmVjdGlvblN0YXRlX05vdENvbm5lY3RlZDsKKworCS8qIFNldCB0aGUgZGVmYXVsdCBvcGVyYXRpb24gY2hhbm5lbCAqLworCXBIZGRTdGFDdHgtPmNvbm5faW5mby5vcGVyYXRpb25DaGFubmVsID0KKwkJaGRkX2N0eC0+Y29uZmlnLT5PcGVyYXRpbmdDaGFubmVsOworCisJLyogTWFrZSB0aGUgZGVmYXVsdCBBdXRoIFR5cGUgYXMgT1BFTiAqLworCXBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOworCisJc3RhdHVzID0gaGRkX2luaXRfdHhfcngoYWRhcHRlcik7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR1AsCisJCSAgICAgICBGTCgiaGRkX2luaXRfdHhfcngoKSBmYWlsZWQsIHN0YXR1cyBjb2RlICUwOGQgW3glMDh4XSIpLAorCQkgICAgICAgc3RhdHVzLCBzdGF0dXMpOworCQlnb3RvIGVycm9yX2luaXRfdHhyeDsKKwl9CisKKwlzZXRfYml0KElOSVRfVFhfUlhfU1VDQ0VTUywgJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKworCXN0YXR1cyA9IGhkZF93bW1fYWRhcHRlcl9pbml0KGFkYXB0ZXIpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dQLAorCQkgICAgICAgRkwoImhkZF93bW1fYWRhcHRlcl9pbml0KCkgZmFpbGVkLCBzdGF0dXMgY29kZSAlMDhkIFt4JTA4eF0iKSwKKwkJICAgICAgIHN0YXR1cywgc3RhdHVzKTsKKwkJZ290byBlcnJvcl93bW1faW5pdDsKKwl9CisKKwlzZXRfYml0KFdNTV9JTklUX0RPTkUsICZhZGFwdGVyLT5ldmVudF9mbGFncyk7CisKKwlyZXRfdmFsID0gd21hX2NsaV9zZXRfY29tbWFuZChhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJICAgICAgV01JX1BERVZfUEFSQU1fQlVSU1RfRU5BQkxFLAorCQkJCSAgICAgIGhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlU2lmc0J1cnN0LAorCQkJCSAgICAgIFBERVZfQ01EKTsKKworCWlmICgwICE9IHJldF92YWwpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgiV01JX1BERVZfUEFSQU1fQlVSU1RfRU5BQkxFIHNldCBmYWlsZWQgJWQiKSwKKwkJICAgICAgIHJldF92YWwpOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWlmICgwICE9IHdsYW5faGRkX3RkbHNfaW5pdChhZGFwdGVyKSkgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJaGRkTG9nKExPR0UsIEZMKCJ3bGFuX2hkZF90ZGxzX2luaXQgZmFpbGVkIikpOworCQlnb3RvIGVycm9yX3RkbHNfaW5pdDsKKwl9CisJc2V0X2JpdChURExTX0lOSVRfRE9ORSwgJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKyNlbmRpZgorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCitlcnJvcl90ZGxzX2luaXQ6CisJY2xlYXJfYml0KFdNTV9JTklUX0RPTkUsICZhZGFwdGVyLT5ldmVudF9mbGFncyk7CisJaGRkX3dtbV9hZGFwdGVyX2Nsb3NlKGFkYXB0ZXIpOworI2VuZGlmCitlcnJvcl93bW1faW5pdDoKKwljbGVhcl9iaXQoSU5JVF9UWF9SWF9TVUNDRVNTLCAmYWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCWhkZF9kZWluaXRfdHhfcngoYWRhcHRlcik7CitlcnJvcl9pbml0X3R4cng6CisJaGRkX3VucmVnaXN0ZXJfd2V4dChwV2xhbkRldik7CitlcnJvcl9yZWdpc3Rlcl93ZXh0OgorCWlmICh0ZXN0X2JpdChTTUVfU0VTU0lPTl9PUEVORUQsICZhZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKwkJSU5JVF9DT01QTEVUSU9OKGFkYXB0ZXItPnNlc3Npb25fY2xvc2VfY29tcF92YXIpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHNtZV9jbG9zZV9zZXNzaW9uKGhkZF9jdHgtPmhIYWwsCisJCQkJCQkJICAgIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCQkgICAgaGRkX3NtZV9jbG9zZV9zZXNzaW9uX2NhbGxiYWNrLAorCQkJCQkJCSAgICBhZGFwdGVyKSkgeworCQkJdW5zaWduZWQgbG9uZyByYzsKKworCQkJLyoKKwkJCSAqIEJsb2NrIG9uIGEgY29tcGxldGlvbiB2YXJpYWJsZS4KKwkJCSAqIENhbid0IHdhaXQgZm9yZXZlciB0aG91Z2guCisJCQkgKi8KKwkJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAorCQkJCSZhZGFwdGVyLT5zZXNzaW9uX2Nsb3NlX2NvbXBfdmFyLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJKFdMQU5fV0FJVF9USU1FX1NFU1NJT05PUEVOQ0xPU0UpKTsKKwkJCWlmIChyYyA8PSAwKQorCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgiU2Vzc2lvbiBpcyBub3Qgb3BlbmVkIHdpdGhpbiB0aW1lb3V0IHBlcmlvZCBjb2RlICVsZCIpLAorCQkJCSAgICAgICByYyk7CisJCX0KKwl9CitlcnJvcl9zbWVfb3BlbjoKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGhkZF9jbGVhbnVwX2FjdGlvbmZyYW1lKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJaGRkX2NmZzgwMjExX3N0YXRlX3QgKmNmZ1N0YXRlOworCisJY2ZnU3RhdGUgPSBXTEFOX0hERF9HRVRfQ0ZHX1NUQVRFX1BUUihhZGFwdGVyKTsKKworCWlmIChOVUxMICE9IGNmZ1N0YXRlLT5idWYpIHsKKwkJdW5zaWduZWQgbG9uZyByYzsKKwkJSU5JVF9DT01QTEVUSU9OKGFkYXB0ZXItPnR4X2FjdGlvbl9jbmZfZXZlbnQpOworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCSZhZGFwdGVyLT50eF9hY3Rpb25fY25mX2V2ZW50LAorCQkJbXNlY3NfdG9famlmZmllcyhBQ1RJT05fRlJBTUVfVFhfVElNRU9VVCkpOworCQlpZiAoIXJjKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIEZMKCJIREQgV2FpdCBmb3IgQWN0aW9uIENvbmZpcm1hdGlvbiBGYWlsZWQhISIpKTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKK3ZvaWQgaGRkX2RlaW5pdF9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQlib29sIHJ0bmxfaGVsZCkKK3sKKwlFTlRFUigpOworCXN3aXRjaCAoYWRhcHRlci0+ZGV2aWNlX21vZGUpIHsKKwljYXNlIFdMQU5fSEREX0lORlJBX1NUQVRJT046CisJY2FzZSBXTEFOX0hERF9QMlBfQ0xJRU5UOgorCWNhc2UgV0xBTl9IRERfUDJQX0RFVklDRToKKwl7CisJCWlmICh0ZXN0X2JpdAorCQkJICAgIChJTklUX1RYX1JYX1NVQ0NFU1MsICZhZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKwkJCWhkZF9kZWluaXRfdHhfcngoYWRhcHRlcik7CisJCQljbGVhcl9iaXQoSU5JVF9UWF9SWF9TVUNDRVNTLAorCQkJCSAgJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChXTU1fSU5JVF9ET05FLCAmYWRhcHRlci0+ZXZlbnRfZmxhZ3MpKSB7CisJCQloZGRfd21tX2FkYXB0ZXJfY2xvc2UoYWRhcHRlcik7CisJCQljbGVhcl9iaXQoV01NX0lOSVRfRE9ORSwKKwkJCQkgICZhZGFwdGVyLT5ldmVudF9mbGFncyk7CisJCX0KKworCQloZGRfY2xlYW51cF9hY3Rpb25mcmFtZShoZGRfY3R4LCBhZGFwdGVyKTsKKwkJd2xhbl9oZGRfdGRsc19leGl0KGFkYXB0ZXIpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdMQU5fSEREX1NPRlRBUDoKKwljYXNlIFdMQU5fSEREX1AyUF9HTzoKKwl7CisKKwkJaWYgKHRlc3RfYml0KFdNTV9JTklUX0RPTkUsICZhZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKwkJCWhkZF93bW1fYWRhcHRlcl9jbG9zZShhZGFwdGVyKTsKKwkJCWNsZWFyX2JpdChXTU1fSU5JVF9ET05FLAorCQkJCSAgJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKwkJfQorCisJCWhkZF9jbGVhbnVwX2FjdGlvbmZyYW1lKGhkZF9jdHgsIGFkYXB0ZXIpOworCisJCWhkZF91bnJlZ2lzdGVyX2hvc3RhcGQoYWRhcHRlciwgcnRubF9oZWxkKTsKKworCQkvKiBzZXQgY29uX21vZGUgdG8gU1RBIG9ubHkgd2hlbiBubyBTQVAgY29uY3VycmVuY3kgbW9kZSAqLworCQlpZiAoIQorCQkgICAgKGNkc19nZXRfY29uY3VycmVuY3lfbW9kZSgpICYKKwkJICAgICAoQ0RGX1NBUF9NQVNLIHwgQ0RGX1AyUF9HT19NQVNLKSkpCisJCQloZGRfc2V0X2NvbnBhcmFtKDApOworCisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCUVYSVQoKTsKK30KKwordm9pZCBoZGRfY2xlYW51cF9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgdWludDhfdCBydG5sX2hlbGQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBXbGFuRGV2ID0gTlVMTDsKKworCWlmIChhZGFwdGVyKQorCQlwV2xhbkRldiA9IGFkYXB0ZXItPmRldjsKKwllbHNlIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJhZGFwdGVyIGlzIE51bGwiKSk7CisJCXJldHVybjsKKwl9CisKKwloZGRfbHJvX2Rpc2FibGUoaGRkX2N0eCwgYWRhcHRlcik7CisJLyoKKwkgKiBUaGUgYWRhcHRlciBpcyBtYXJrZWQgYXMgY2xvc2VkLiBXaGVuIGhkZF93bGFuX2V4aXQoKSBjYWxsIHJldHVybnMsCisJICogdGhlIGRyaXZlciBpcyBhbG1vc3QgY2xvc2VkIGFuZCBjYW5ub3QgaGFuZGxlIGVpdGhlciBjb250cm9sCisJICogbWVzc2FnZXMgb3IgZGF0YS4gSG93ZXZlciwgdW5yZWdpc3Rlcl9uZXRkZXZpY2UoKSBjYWxsIGFib3ZlIHdpbGwKKwkgKiBldmVudHVhbGx5IGludm9rZSBoZGRfc3RvcCAobmRvX2Nsb3NlKSBkcml2ZXIgY2FsbGJhY2ssIHdoaWNoIGF0dGVtcHRzCisJICogdG8gY2xvc2UgdGhlIGFjdGl2ZSBjb25uZWN0aW9ucyAoYmFzaWNhbGx5IGV4Y2l0ZXMgY29udHJvbCBwYXRoKSB3aGljaAorCSAqIGlzIG5vdCByaWdodC4gU2V0dGluZyB0aGlzIGZsYWcgaGVscHMgaGRkX3N0b3AoKSB0byByZWNvZ25pemUgdGhhdAorCSAqIHRoZSBpbnRlcmZhY2UgaXMgY2xvc2VkIGFuZCByZXN0cmljdHMgYW55IG9wZXJhdGlvbnMgb24gdGhhdAorCSAqLworCWNsZWFyX2JpdChERVZJQ0VfSUZBQ0VfT1BFTkVELCAmYWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCisJaWYgKHRlc3RfYml0KE5FVF9ERVZJQ0VfUkVHSVNURVJFRCwgJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkgeworCQlpZiAocnRubF9oZWxkKSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldmljZShwV2xhbkRldik7CisJCX0gZWxzZSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihwV2xhbkRldik7CisJCX0KKwkJLyoKKwkJICogTm90ZSB0aGF0IHRoZSBhZGFwdGVyIGlzIG5vIGxvbmdlciB2YWxpZCBhdCB0aGlzIHBvaW50CisJCSAqIHNpbmNlIHRoZSBtZW1vcnkgaGFzIGJlZW4gcmVjbGFpbWVkCisJCSAqLworCX0KK30KKworQ0RGX1NUQVRVUyBoZGRfY2hlY2tfZm9yX2V4aXN0aW5nX21hY2FkZHIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJICB0U2lyTWFjQWRkciBtYWNBZGRyKQoreworCWhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICphZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIoaGRkX2N0eCwgJmFkYXB0ZXJOb2RlKTsKKwl3aGlsZSAoTlVMTCAhPSBhZGFwdGVyTm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCWFkYXB0ZXIgPSBhZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisJCWlmIChhZGFwdGVyCisJCSAgICAmJiBjZGZfbWVtX2NvbXBhcmUoYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsCisJCQkJICAgICAgIG1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIoaGRkX2N0eCwgYWRhcHRlck5vZGUsICZwTmV4dCk7CisJCWFkYXB0ZXJOb2RlID0gcE5leHQ7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CitoZGRfYWRhcHRlcl90ICpoZGRfb3Blbl9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIHVpbnQ4X3Qgc2Vzc2lvbl90eXBlLAorCQkJCWNvbnN0IGNoYXIgKmlmYWNlX25hbWUsIHRTaXJNYWNBZGRyIG1hY0FkZHIsCisJCQkJdWludDhfdCBydG5sX2hlbGQpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBIZGRBZGFwdGVyTm9kZSA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwloZGRfY2ZnODAyMTFfc3RhdGVfdCAqY2ZnU3RhdGU7CisJaW50IHJldDsKKworCWhkZExvZyhMT0cyLCBGTCgiaWZhY2UoJXMpIHR5cGUoJWQpIiksIGlmYWNlX25hbWUsIHNlc3Npb25fdHlwZSk7CisKKwlpZiAoaGRkX2N0eC0+Y3VycmVudF9pbnRmX2NvdW50ID49IGhkZF9jdHgtPm1heF9pbnRmX2NvdW50KSB7CisJCS8qCisJCSAqIE1heCBsaW1pdCByZWFjaGVkIG9uIHRoZSBudW1iZXIgb2YgdmRldnMgY29uZmlndXJlZCBieSB0aGUKKwkJICogaG9zdC4gUmV0dXJuIGVycm9yCisJCSAqLworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoCisJCQkgICJVbmFibGUgdG8gYWRkIHZpcnR1YWwgaW50ZjogY3VycmVudFZkZXZDbnQ9JWQsaG9zdENvbmZpZ3VyZWRWZGV2Q250PSVkIgorCQkJICksCisJCSAgICAgICBoZGRfY3R4LT5jdXJyZW50X2ludGZfY291bnQsIGhkZF9jdHgtPm1heF9pbnRmX2NvdW50KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG1hY0FkZHIgPT0gTlVMTCkgeworCQkvKiBOb3QgcmVjZWl2ZWQgdmFsaWQgbWFjQWRkciAqLworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoCisJCQkgICJVbmFibGUgdG8gYWRkIHZpcnR1YWwgaW50ZjogTm90IGFibGUgdG8gZ2V0IHZhbGlkIG1hYyBhZGRyZXNzIgorCQkJICkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3RhdHVzID0gaGRkX2NoZWNrX2Zvcl9leGlzdGluZ19tYWNhZGRyKGhkZF9jdHgsIG1hY0FkZHIpOworCWlmIChDREZfU1RBVFVTX0VfRkFJTFVSRSA9PSBzdGF0dXMpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgICJEdXBsaWNhdGUgTUFDIGFkZHI6ICIgTUFDX0FERFJFU1NfU1RSCisJCSAgICAgICAiIGFscmVhZHkgZXhpc3RzIiwKKwkJICAgICAgIE1BQ19BRERSX0FSUkFZKG1hY0FkZHIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3dpdGNoIChzZXNzaW9uX3R5cGUpIHsKKwljYXNlIFdMQU5fSEREX0lORlJBX1NUQVRJT046CisJCS8qIFJlc2V0IGxvY2FsbHkgYWRtaW5pc3RlcmVkIGJpdCBpZiB0aGUgZGV2aWNlIG1vZGUgaXMgU1RBICovCisJCVdMQU5fSEREX1JFU0VUX0xPQ0FMTFlfQURNSU5JU1RFUkVEX0JJVChtYWNBZGRyKTsKKwkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFdMQU5fSEREX1AyUF9DTElFTlQ6CisJY2FzZSBXTEFOX0hERF9QMlBfREVWSUNFOgorCWNhc2UgV0xBTl9IRERfT0NCOgorCXsKKwkJYWRhcHRlciA9CisJCQloZGRfYWxsb2Nfc3RhdGlvbl9hZGFwdGVyKGhkZF9jdHgsIG1hY0FkZHIsIGlmYWNlX25hbWUpOworCisJCWlmIChOVUxMID09IGFkYXB0ZXIpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoImZhaWxlZCB0byBhbGxvY2F0ZSBhZGFwdGVyIGZvciBzZXNzaW9uICVkIiksCisJCQkgICAgICAgc2Vzc2lvbl90eXBlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKFdMQU5fSEREX1AyUF9DTElFTlQgPT0gc2Vzc2lvbl90eXBlKQorCQkJYWRhcHRlci0+d2Rldi5pZnR5cGUgPSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNywgMCkpCisJCWVsc2UgaWYgKFdMQU5fSEREX1AyUF9ERVZJQ0UgPT0gc2Vzc2lvbl90eXBlKQorCQkJYWRhcHRlci0+d2Rldi5pZnR5cGUgPSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOworI2VuZGlmCisJCWVsc2UKKwkJCWFkYXB0ZXItPndkZXYuaWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKKworCQlhZGFwdGVyLT5kZXZpY2VfbW9kZSA9IHNlc3Npb25fdHlwZTsKKworCQlzdGF0dXMgPSBoZGRfaW5pdF9zdGF0aW9uX21vZGUoYWRhcHRlcik7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQkJZ290byBlcnJfZnJlZV9uZXRkZXY7CisKKwkJaGRkX2xyb19lbmFibGUoaGRkX2N0eCwgYWRhcHRlcik7CisKKwkJLyoKKwkJICogV29ya3F1ZXVlIHdoaWNoIGdldHMgc2NoZWR1bGVkIGluIElQdjQgbm90aWZpY2F0aW9uCisJCSAqIGNhbGxiYWNrCisJCSAqLworI2lmZGVmIENPTkZJR19DTlNTCisJCWNuc3NfaW5pdF93b3JrKCZhZGFwdGVyLT5pcHY0Tm90aWZpZXJXb3JrUXVldWUsCisJCQkgICAgICAgaGRkX2lwdjRfbm90aWZpZXJfd29ya19xdWV1ZSk7CisjZWxzZQorCQlJTklUX1dPUksoJmFkYXB0ZXItPmlwdjROb3RpZmllcldvcmtRdWV1ZSwKKwkJCSAgaGRkX2lwdjRfbm90aWZpZXJfd29ya19xdWV1ZSk7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorCQkvKgorCQkgKiBXb3JrcXVldWUgd2hpY2ggZ2V0cyBzY2hlZHVsZWQgaW4gSVB2NgorCQkgKiBub3RpZmljYXRpb24gY2FsbGJhY2suCisJCSAqLworI2lmZGVmIENPTkZJR19DTlNTCisJCWNuc3NfaW5pdF93b3JrKCZhZGFwdGVyLT5pcHY2Tm90aWZpZXJXb3JrUXVldWUsCisJCQkgICAgICAgaGRkX2lwdjZfbm90aWZpZXJfd29ya19xdWV1ZSk7CisjZWxzZQorCQlJTklUX1dPUksoJmFkYXB0ZXItPmlwdjZOb3RpZmllcldvcmtRdWV1ZSwKKwkJCSAgaGRkX2lwdjZfbm90aWZpZXJfd29ya19xdWV1ZSk7CisjZW5kaWYKKyNlbmRpZgorCQlzdGF0dXMgPSBoZGRfcmVnaXN0ZXJfaW50ZXJmYWNlKGFkYXB0ZXIsIHJ0bmxfaGVsZCk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQloZGRfZGVpbml0X2FkYXB0ZXIoaGRkX2N0eCwgYWRhcHRlciwgcnRubF9oZWxkKTsKKwkJCWdvdG8gZXJyX2xyb19jbGVhbnVwOworCQl9CisKKwkJLyogU3RvcCB0aGUgSW50ZXJmYWNlIFRYIHF1ZXVlLiAqLworCQloZGRMb2coTE9HMSwgRkwoIkRpc2FibGluZyBxdWV1ZXMiKSk7CisJCXdsYW5faGRkX25ldGlmX3F1ZXVlX2NvbnRyb2woYWRhcHRlciwKKwkJCQkJICAgV0xBTl9ORVRJRl9UWF9ESVNBQkxFX05fQ0FSUklFUiwKKwkJCQkJICAgV0xBTl9DT05UUk9MX1BBVEgpOworCisJCWhkZF9yZWdpc3Rlcl90eF9mbG93X2NvbnRyb2woYWRhcHRlciwKKwkJCQloZGRfdHhfcmVzdW1lX3RpbWVyX2V4cGlyZWRfaGFuZGxlciwKKwkJCQloZGRfdHhfcmVzdW1lX2NiKTsKKworCQlicmVhazsKKwl9CisKKwljYXNlIFdMQU5fSEREX1AyUF9HTzoKKwljYXNlIFdMQU5fSEREX1NPRlRBUDoKKwl7CisJCWFkYXB0ZXIgPQorCQkJaGRkX3dsYW5fY3JlYXRlX2FwX2RldihoZGRfY3R4LCBtYWNBZGRyLAorCQkJCQkgICAgICAgKHVpbnQ4X3QgKikgaWZhY2VfbmFtZSk7CisJCWlmIChOVUxMID09IGFkYXB0ZXIpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoImZhaWxlZCB0byBhbGxvY2F0ZSBhZGFwdGVyIGZvciBzZXNzaW9uICVkIiksCisJCQkgICAgICAgc2Vzc2lvbl90eXBlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJYWRhcHRlci0+d2Rldi5pZnR5cGUgPQorCQkJKHNlc3Npb25fdHlwZSA9PQorCQkJIFdMQU5fSEREX1NPRlRBUCkgPyBOTDgwMjExX0lGVFlQRV9BUCA6CisJCQlOTDgwMjExX0lGVFlQRV9QMlBfR087CisJCWFkYXB0ZXItPmRldmljZV9tb2RlID0gc2Vzc2lvbl90eXBlOworCisJCXN0YXR1cyA9IGhkZF9pbml0X2FwX21vZGUoYWRhcHRlcik7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQkJZ290byBlcnJfZnJlZV9uZXRkZXY7CisKKwkJc3RhdHVzID0gaGRkX3JlZ2lzdGVyX2hvc3RhcGQoYWRhcHRlciwgcnRubF9oZWxkKTsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJCWhkZF9kZWluaXRfYWRhcHRlcihoZGRfY3R4LCBhZGFwdGVyLCBydG5sX2hlbGQpOworCQkJZ290byBlcnJfZnJlZV9uZXRkZXY7CisJCX0KKworCQloZGRMb2coTE9HMSwgRkwoIkRpc2FibGluZyBxdWV1ZXMiKSk7CisJCXdsYW5faGRkX25ldGlmX3F1ZXVlX2NvbnRyb2woYWRhcHRlciwKKwkJCQkJICAgV0xBTl9ORVRJRl9UWF9ESVNBQkxFX05fQ0FSUklFUiwKKwkJCQkJICAgV0xBTl9DT05UUk9MX1BBVEgpOworCisJCWhkZF9zZXRfY29ucGFyYW0oMSk7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgV0xBTl9IRERfRlRNOgorCXsKKwkJYWRhcHRlciA9CisJCQloZGRfYWxsb2Nfc3RhdGlvbl9hZGFwdGVyKGhkZF9jdHgsIG1hY0FkZHIsIGlmYWNlX25hbWUpOworCisJCWlmIChOVUxMID09IGFkYXB0ZXIpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoImZhaWxlZCB0byBhbGxvY2F0ZSBhZGFwdGVyIGZvciBzZXNzaW9uICVkIiksCisJCQkgICAgICAgc2Vzc2lvbl90eXBlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyoKKwkJICogQXNzaWduIE5MODAyMTFfSUZUWVBFX1NUQVRJT04gYXMgaW50ZXJmYWNlIHR5cGUgdG8gcmVzb2x2ZQorCQkgKiBLZXJuZWwgV2FybmluZyBtZXNzYWdlIHdoaWxlIGxvYWRpbmcgZHJpdmVyIGluIEZUTSBtb2RlLgorCQkgKi8KKwkJYWRhcHRlci0+d2Rldi5pZnR5cGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOworCQlhZGFwdGVyLT5kZXZpY2VfbW9kZSA9IHNlc3Npb25fdHlwZTsKKwkJc3RhdHVzID0gaGRkX3JlZ2lzdGVyX2ludGVyZmFjZShhZGFwdGVyLCBydG5sX2hlbGQpOworCisJCWhkZF9pbml0X3R4X3J4KGFkYXB0ZXIpOworCisJCS8qIFN0b3AgdGhlIEludGVyZmFjZSBUWCBxdWV1ZS4gKi8KKwkJaGRkTG9nKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCQl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKGFkYXB0ZXIsCisJCQkJCSAgIFdMQU5fTkVUSUZfVFhfRElTQUJMRV9OX0NBUlJJRVIsCisJCQkJCSAgIFdMQU5fQ09OVFJPTF9QQVRIKTsKKwl9CisJYnJlYWs7CisJZGVmYXVsdDoKKwl7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCSAgICAgICBGTCgiSW52YWxpZCBzZXNzaW9uIHR5cGUgJWQiKSwKKwkJICAgICAgIHNlc3Npb25fdHlwZSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBOVUxMOworCX0KKwl9CisKKwljZmdTdGF0ZSA9IFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKGFkYXB0ZXIpOworCW11dGV4X2luaXQoJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQkvKiBBZGQgaXQgdG8gdGhlIGhkZCdzIHNlc3Npb24gbGlzdC4gKi8KKwkJcEhkZEFkYXB0ZXJOb2RlID0KKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZihoZGRfYWRhcHRlcl9saXN0X25vZGVfdCkpOworCQlpZiAoTlVMTCA9PSBwSGRkQWRhcHRlck5vZGUpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJfSBlbHNlIHsKKwkJCXBIZGRBZGFwdGVyTm9kZS0+cEFkYXB0ZXIgPSBhZGFwdGVyOworCQkJc3RhdHVzID0gaGRkX2FkZF9hZGFwdGVyX2JhY2soaGRkX2N0eCwgcEhkZEFkYXB0ZXJOb2RlKTsKKwkJfQorCX0KKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCWlmIChOVUxMICE9IGFkYXB0ZXIpIHsKKwkJCWhkZF9jbGVhbnVwX2FkYXB0ZXIoaGRkX2N0eCwgYWRhcHRlciwgcnRubF9oZWxkKTsKKwkJCWFkYXB0ZXIgPSBOVUxMOworCQl9CisJCWlmIChOVUxMICE9IHBIZGRBZGFwdGVyTm9kZSkgeworCQkJY2RmX21lbV9mcmVlKHBIZGRBZGFwdGVyTm9kZSk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJY2RzX3NldF9jb25jdXJyZW5jeV9tb2RlKGhkZF9jdHgsIHNlc3Npb25fdHlwZSk7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgV29XTCBzZXJ2aWNlICovCisJCWlmICghaGRkX2luaXRfd293bChhZGFwdGVyKSkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICAgICBGTCgiaGRkX2luaXRfd293bCBmYWlsZWQiKSk7CisJCQlnb3RvIGVycl9scm9fY2xlYW51cDsKKwkJfQorCisJCS8qIEFkYXB0ZXIgc3VjY2Vzc2Z1bGx5IGFkZGVkLiBJbmNyZW1lbnQgdGhlIHZkZXYgY291bnQgKi8KKwkJaGRkX2N0eC0+Y3VycmVudF9pbnRmX2NvdW50Kys7CisKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgRkwoImN1cnJlbnRfaW50Zl9jb3VudD0lZCIpLAorCQkgICAgICAgaGRkX2N0eC0+Y3VycmVudF9pbnRmX2NvdW50KTsKKworCQljZHNfY2hlY2tfYW5kX3Jlc3RhcnRfc2FwX3dpdGhfbm9uX2Rmc19hY3MoaGRkX2N0eCk7CisJfQorCisJaWYgKChjZHNfZ2V0X2NvbnBhcmFtKCkgIT0gQ0RGX0ZUTV9NT0RFKQorCSAgICAmJiAoIWhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlMngyKSkgeworI2RlZmluZSBIRERfRFRJTV8xQ0hBSU5fUlhfSUQgMHg1CisjZGVmaW5lIEhERF9TTVBTX1BBUkFNX1ZBTFVFX1MgMjkKKworCQkvKgorCQkgKiBEaXNhYmxlIERUSU0gMSBjaGFpbiBSeCB3aGVuIGluIDF4MSwgd2UgYXJlIHBhc3NpbmcgdHdvIHZhbHVlCisJCSAqIGFzIHBhcmFtX2lkIDw8IDI5IHwgcGFyYW1fdmFsdWUuCisJCSAqIEJlbG93IHBhcmFtX3ZhbHVlID0gMChkaXNhYmxlKQorCQkgKi8KKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1NUQV9TTVBTX1BBUkFNX0NNRElELAorCQkJCQkgIEhERF9EVElNXzFDSEFJTl9SWF9JRCA8PAorCQkJCQkJSEREX1NNUFNfUEFSQU1fVkFMVUVfUywKKwkJCQkJICBWREVWX0NNRCk7CisKKwkJaWYgKHJldCAhPSAwKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIEZMKCJEVElNIDEgY2hhaW4gc2V0IGZhaWxlZCAlZCIpLCByZXQpOworCQkJZ290byBlcnJfbHJvX2NsZWFudXA7CisJCX0KKworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfUERFVl9QQVJBTV9UWF9DSEFJTl9NQVNLLAorCQkJCQkgIGhkZF9jdHgtPmNvbmZpZy0+dHhjaGFpbm1hc2sxeDEsCisJCQkJCSAgUERFVl9DTUQpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgRkwoIldNSV9QREVWX1BBUkFNX1RYX0NIQUlOX01BU0sgc2V0IGZhaWxlZCAlZCIpLAorCQkJICAgICAgIHJldCk7CisJCQlnb3RvIGVycl9scm9fY2xlYW51cDsKKwkJfQorCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfUERFVl9QQVJBTV9SWF9DSEFJTl9NQVNLLAorCQkJCQkgIGhkZF9jdHgtPmNvbmZpZy0+cnhjaGFpbm1hc2sxeDEsCisJCQkJCSAgUERFVl9DTUQpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgRkwoIldNSV9QREVWX1BBUkFNX1JYX0NIQUlOX01BU0sgc2V0IGZhaWxlZCAlZCIpLAorCQkJICAgICAgIHJldCk7CisJCQlnb3RvIGVycl9scm9fY2xlYW51cDsKKwkJfQorI3VuZGVmIEhERF9EVElNXzFDSEFJTl9SWF9JRAorI3VuZGVmIEhERF9TTVBTX1BBUkFNX1ZBTFVFX1MKKwl9CisKKwlpZiAoQ0RGX0ZUTV9NT0RFICE9IGNkc19nZXRfY29ucGFyYW0oKSkgeworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfUERFVl9QQVJBTV9IWVNUX0VOLAorCQkJCQkgIGhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlTWVtRGVlcFNsZWVwLAorCQkJCQkgIFBERVZfQ01EKTsKKworCQlpZiAocmV0ICE9IDApIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgRkwoIldNSV9QREVWX1BBUkFNX0hZU1RfRU4gc2V0IGZhaWxlZCAlZCIpLAorCQkJICAgICAgIHJldCk7CisJCQlnb3RvIGVycl9scm9fY2xlYW51cDsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19GV19MT0dTX0JBU0VEX09OX0lOSQorCisJLyogRW5hYmxlIEZXIGxvZ3MgYmFzZWQgb24gSU5JIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoKENERl9GVE1fTU9ERSAhPSBjZHNfZ2V0X2NvbnBhcmFtKCkpICYmCisJICAgIChoZGRfY3R4LT5jb25maWctPmVuYWJsZWZ3bG9nKSkgeworCQl1aW50OF90IGNvdW50ID0gMDsKKwkJdWludDMyX3QgdmFsdWUgPSAwOworCQl1aW50OF90IG51bUVudHJpZXMgPSAwOworCQl1aW50OF90IG1vZHVsZUxvZ2xldmVsW0ZXX01PRFVMRV9MT0dfTEVWRUxfU1RSSU5HX0xFTkdUSF07CisKKwkJaGRkX2N0eC0+ZndfbG9nX3NldHRpbmdzLmRsX3R5cGUgPQorCQkJCQloZGRfY3R4LT5jb25maWctPmVuYWJsZUZ3TG9nVHlwZTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX0RCR0xPR19UWVBFLAorCQkJCQkgIGhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlRndMb2dUeXBlLAorCQkJCQkgIERCR19DTUQpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkIHRvIGVuYWJsZSBGVyBsb2cgdHlwZSByZXQgJWQiKSwKKwkJCSAgICAgICByZXQpOworCQl9CisKKwkJaGRkX2N0eC0+ZndfbG9nX3NldHRpbmdzLmRsX2xvZ2xldmVsID0KKwkJCQkJaGRkX2N0eC0+Y29uZmlnLT5lbmFibGVGd0xvZ0xldmVsOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfREJHTE9HX0xPR19MRVZFTCwKKwkJCQkJICBoZGRfY3R4LT5jb25maWctPmVuYWJsZUZ3TG9nTGV2ZWwsCisJCQkJCSAgREJHX0NNRCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gZW5hYmxlIEZXIGxvZyBsZXZlbCByZXQgJWQiKSwKKwkJCSAgICAgICByZXQpOworCQl9CisKKwkJaGRkX3N0cmluZ190b191OF9hcnJheShoZGRfY3R4LT5jb25maWctPmVuYWJsZUZ3TW9kdWxlTG9nTGV2ZWwsCisJCQkJICAgICAgIG1vZHVsZUxvZ2xldmVsLAorCQkJCSAgICAgICAmbnVtRW50cmllcywKKwkJCQkgICAgICAgRldfTU9EVUxFX0xPR19MRVZFTF9TVFJJTkdfTEVOR1RIKTsKKwkJd2hpbGUgKGNvdW50IDwgbnVtRW50cmllcykgeworCQkJLyoKKwkJCSAqIEZXIG1vZHVsZSBsb2cgbGV2ZWwgaW5wdXQgc3RyaW5nIGxvb2tzIGxpa2UgYmVsb3c6CisJCQkgKiBnRndEZWJ1Z01vZHVsZUxvZ2xldmVsPTxGVyBNb2R1bGUgSUQ+LDxMb2cgTGV2ZWw+LC4uLgorCQkJICogRm9yIGV4YW1wbGU6CisJCQkgKiBnRndEZWJ1Z01vZHVsZUxvZ2xldmVsPTEsMCwyLDEsMywyLDQsMyw1LDQsNiw1LDcsNgorCQkJICogQWJvdmUgaW5wdXQgc3RyaW5nIG1lYW5zIDoKKwkJCSAqIEZvciBGVyBtb2R1bGUgSUQgMSBlbmFibGUgbG9nIGxldmVsIDAKKwkJCSAqIEZvciBGVyBtb2R1bGUgSUQgMiBlbmFibGUgbG9nIGxldmVsIDEKKwkJCSAqIEZvciBGVyBtb2R1bGUgSUQgMyBlbmFibGUgbG9nIGxldmVsIDIKKwkJCSAqIEZvciBGVyBtb2R1bGUgSUQgNCBlbmFibGUgbG9nIGxldmVsIDMKKwkJCSAqIEZvciBGVyBtb2R1bGUgSUQgNSBlbmFibGUgbG9nIGxldmVsIDQKKwkJCSAqIEZvciBGVyBtb2R1bGUgSUQgNiBlbmFibGUgbG9nIGxldmVsIDUKKwkJCSAqIEZvciBGVyBtb2R1bGUgSUQgNyBlbmFibGUgbG9nIGxldmVsIDYKKwkJCSAqLworCisJCQkvKiBGVyBleHBlY3RzIFdNSSBjb21tYW5kIHZhbHVlID0KKwkJCSAqICAgICAgICAgICAgICAgTW9kdWxlIElEICogMTAgKyBNb2R1bGUgTG9nIGxldmVsCisJCQkgKi8KKwkJCXZhbHVlID0JKChtb2R1bGVMb2dsZXZlbFtjb3VudF0gKiAxMCkgKworCQkJCSBtb2R1bGVMb2dsZXZlbFtjb3VudCArIDFdKTsKKwkJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQoYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJICBXTUlfREJHTE9HX01PRF9MT0dfTEVWRUwsCisJCQkJCQkgIHZhbHVlLCBEQkdfQ01EKTsKKwkJCWlmIChyZXQgIT0gMCkgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJGYWlsZWQgdG8gZW5hYmxlIEZXIG1vZHVsZSBsb2cgbGV2ZWwgJWQgcmV0ICVkIiksCisJCQkJICAgICAgIHZhbHVlLCByZXQpOworCQkJfQorCisJCQljb3VudCArPSAyOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gYWRhcHRlcjsKKworZXJyX2xyb19jbGVhbnVwOgorCWhkZF9scm9fZGlzYWJsZShoZGRfY3R4LCBhZGFwdGVyKTsKK2Vycl9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihhZGFwdGVyLT5kZXYpOworCXdsYW5faGRkX3JlbGVhc2VfaW50Zl9hZGRyKGhkZF9jdHgsIGFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzKTsKKworCXJldHVybiBOVUxMOworfQorCitDREZfU1RBVFVTIGhkZF9jbG9zZV9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgIHVpbnQ4X3QgcnRubF9oZWxkKQoreworCWhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICphZGFwdGVyTm9kZSwgKnBDdXJyZW50LCAqcE5leHQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIoaGRkX2N0eCwgJnBDdXJyZW50KTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sIEZMKCJhZGFwdGVyIGxpc3QgZW1wdHkgJWQiKSwKKwkJICAgICAgIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJd2hpbGUgKHBDdXJyZW50LT5wQWRhcHRlciAhPSBhZGFwdGVyKSB7CisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsIHBDdXJyZW50LCAmcE5leHQpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKwkJCWJyZWFrOworCisJCXBDdXJyZW50ID0gcE5leHQ7CisJfQorCWFkYXB0ZXJOb2RlID0gcEN1cnJlbnQ7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJY2RzX2NsZWFyX2NvbmN1cnJlbmN5X21vZGUoaGRkX2N0eCwgYWRhcHRlci0+ZGV2aWNlX21vZGUpOworCQloZGRfY2xlYW51cF9hZGFwdGVyKGhkZF9jdHgsIGFkYXB0ZXJOb2RlLT5wQWRhcHRlciwgcnRubF9oZWxkKTsKKworCQloZGRfcmVtb3ZlX2FkYXB0ZXIoaGRkX2N0eCwgYWRhcHRlck5vZGUpOworCQljZGZfbWVtX2ZyZWUoYWRhcHRlck5vZGUpOworCQlhZGFwdGVyTm9kZSA9IE5VTEw7CisKKwkJLyogQWRhcHRlciByZW1vdmVkLiBEZWNyZW1lbnQgdmRldiBjb3VudCAqLworCQlpZiAoaGRkX2N0eC0+Y3VycmVudF9pbnRmX2NvdW50ICE9IDApCisJCQloZGRfY3R4LT5jdXJyZW50X2ludGZfY291bnQtLTsKKworCQkvKiBGdyB3aWxsIHRha2UgY2FyZSBpbmNhc2Ugb2YgY29uY3VycmVuY3kgKi8KKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworfQorCitDREZfU1RBVFVTIGhkZF9jbG9zZV9hbGxfYWRhcHRlcnMoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcEhkZEFkYXB0ZXJOb2RlOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJRU5URVIoKTsKKworCWRvIHsKKwkJc3RhdHVzID0gaGRkX3JlbW92ZV9mcm9udF9hZGFwdGVyKGhkZF9jdHgsICZwSGRkQWRhcHRlck5vZGUpOworCQlpZiAocEhkZEFkYXB0ZXJOb2RlICYmIENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJCWhkZF9jbGVhbnVwX2FkYXB0ZXIoaGRkX2N0eCwgcEhkZEFkYXB0ZXJOb2RlLT5wQWRhcHRlciwKKwkJCQkJICAgIGZhbHNlKTsKKwkJCWNkZl9tZW1fZnJlZShwSGRkQWRhcHRlck5vZGUpOworCQl9CisJfSB3aGlsZSAoTlVMTCAhPSBwSGRkQWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19FX0VNUFRZICE9IHN0YXR1cyk7CisKKwlFWElUKCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCit2b2lkIHdsYW5faGRkX3Jlc2V0X3Byb2JfcnNwaWVzKGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlcikKK3sKKwl1aW50OF90ICpic3NpZCA9IE5VTEw7CisJdFNpclVwZGF0ZUlFIHVwZGF0ZUlFOworCXN3aXRjaCAocEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCWNhc2UgV0xBTl9IRERfSU5GUkFfU1RBVElPTjoKKwljYXNlIFdMQU5fSEREX1AyUF9DTElFTlQ6CisJeworCQloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9CisJCQlXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcik7CisJCWJzc2lkID0gKHVpbnQ4X3QgKikgJnBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZDsKKwkJYnJlYWs7CisJfQorCWNhc2UgV0xBTl9IRERfU09GVEFQOgorCWNhc2UgV0xBTl9IRERfUDJQX0dPOgorCWNhc2UgV0xBTl9IRERfSUJTUzoKKwl7CisJCWJzc2lkID0gcEhvc3RhcGRBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlczsKKwkJYnJlYWs7CisJfQorCWNhc2UgV0xBTl9IRERfRlRNOgorCWNhc2UgV0xBTl9IRERfUDJQX0RFVklDRToKKwlkZWZhdWx0OgorCQkvKgorCQkgKiB3bGFuX2hkZF9yZXNldF9wcm9iX3JzcGllcyBzaG91bGQgbm90IGhhdmUgYmVlbiBjYWxsZWQKKwkJICogZm9yIHRoZXNlIGtpbmQgb2YgZGV2aWNlcworCQkgKi8KKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgiVW5leHBlY3RlZCByZXF1ZXN0IGZvciB0aGUgY3VycmVudCBkZXZpY2UgdHlwZSAlZCIpLAorCQkgICAgICAgcEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisJCXJldHVybjsKKwl9CisKKwljZGZfbWVtX2NvcHkodXBkYXRlSUUuYnNzaWQsIGJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwl1cGRhdGVJRS5zbWVTZXNzaW9uSWQgPSBwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25JZDsKKwl1cGRhdGVJRS5pZUJ1ZmZlcmxlbmd0aCA9IDA7CisJdXBkYXRlSUUucEFkZGl0aW9uSUVCdWZmZXIgPSBOVUxMOworCXVwZGF0ZUlFLmFwcGVuZCA9IHRydWU7CisJdXBkYXRlSUUubm90aWZ5ID0gZmFsc2U7CisJaWYgKHNtZV91cGRhdGVfYWRkX2llKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBIb3N0YXBkQWRhcHRlciksCisJCQkgICAgICAmdXBkYXRlSUUsCisJCQkgICAgICBlVVBEQVRFX0lFX1BST0JFX1JFU1ApID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ291bGQgbm90IHBhc3Mgb24gUFJPQkVfUlNQX0JDTiBkYXRhIHRvIFBFIikpOworCX0KK30KKworQ0RGX1NUQVRVUyBoZGRfc3RvcF9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgY29uc3QgYm9vbCBiQ2xvc2VTZXNzaW9uKQoreworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihhZGFwdGVyKTsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJdFNpclVwZGF0ZUlFIHVwZGF0ZUlFOworCXVuc2lnbmVkIGxvbmcgcmM7CisKKwlFTlRFUigpOworCisJaGRkTG9nKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCXdsYW5faGRkX25ldGlmX3F1ZXVlX2NvbnRyb2woYWRhcHRlciwgV0xBTl9ORVRJRl9UWF9ESVNBQkxFX05fQ0FSUklFUiwKKwkJCQkgICBXTEFOX0NPTlRST0xfUEFUSCk7CisJc3dpdGNoIChhZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCWNhc2UgV0xBTl9IRERfSU5GUkFfU1RBVElPTjoKKwljYXNlIFdMQU5fSEREX1AyUF9DTElFTlQ6CisJY2FzZSBXTEFOX0hERF9QMlBfREVWSUNFOgorCQlpZiAoaGRkX2Nvbm5faXNfY29ubmVjdGVkKAorCQkJCVdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIoYWRhcHRlcikpIHx8CisJCQloZGRfaXNfY29ubmVjdGluZygKKwkJCQlXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpKSkgeworCQkJaWYgKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkJTU1R5cGUgPT0KKwkJCSAgICBlQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1MpCisJCQkJY2RmX3JldF9zdGF0dXMgPQorCQkJCQlzbWVfcm9hbV9kaXNjb25uZWN0KGhkZF9jdHgtPmhIYWwsCisJCQkJCQkJICAgIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCQkgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9JQlNTX0xFQVZFKTsKKwkJCWVsc2UKKwkJCQljZGZfcmV0X3N0YXR1cyA9CisJCQkJCXNtZV9yb2FtX2Rpc2Nvbm5lY3QoaGRkX2N0eC0+aEhhbCwKKwkJCQkJCQkgICAgYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJCSAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKKwkJCS8qIHN1Y2Nlc3MgaW1wbGllcyBkaXNjb25uZWN0IGNvbW1hbmQgZ290IHF1ZXVlZCB1cCBzdWNjZXNzZnVsbHkgKi8KKwkJCWlmIChjZGZfcmV0X3N0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCQkJJmFkYXB0ZXItPmRpc2Nvbm5lY3RfY29tcF92YXIsCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCShXTEFOX1dBSVRfVElNRV9ESVNDT05ORUNUKSk7CisJCQkJaWYgKCFyYykgeworCQkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICAgICAgRkwoCisJCQkJCQkgICJ3YWl0IG9uIGRpc2Nvbm5lY3RfY29tcF92YXIgZmFpbGVkIgorCQkJCQkJICkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKAorCQkJCQkgICJmYWlsZWQgdG8gcG9zdCBkaXNjb25uZWN0IGV2ZW50IHRvIFNNRSIKKwkJCQkJICkpOworCQkJfQorCQkJbWVtc2V0KCZ3cnF1LCAnXDAnLCBzaXplb2Yod3JxdSkpOworCQkJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgJ1wwJywgRVRIX0FMRU4pOworCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChhZGFwdGVyLT5kZXYsIFNJT0NHSVdBUCwgJndycXUsCisJCQkJCSAgICBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWhkZF9hYm9ydF9tYWNfc2NhbihoZGRfY3R4LCBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgIGVDU1JfU0NBTl9BQk9SVF9ERUZBVUxUKTsKKwkJfQorCisJCWlmIChhZGFwdGVyLT5kZXZpY2VfbW9kZSAhPSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKQorCQkJd2xhbl9oZGRfY2xlYW51cF9yZW1haW5fb25fY2hhbm5lbF9jdHgoYWRhcHRlcik7CisKKyNpZmRlZiBXTEFOX09QRU5fU09VUkNFCisJCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPmlwdjROb3RpZmllcldvcmtRdWV1ZSk7CisjZW5kaWYKKworCQloZGRfZGVyZWdpc3Rlcl90eF9mbG93X2NvbnRyb2woYWRhcHRlcik7CisKKyNpZmRlZiBXTEFOX05TX09GRkxPQUQKKyNpZmRlZiBXTEFOX09QRU5fU09VUkNFCisJCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPmlwdjZOb3RpZmllcldvcmtRdWV1ZSk7CisjZW5kaWYKKyNlbmRpZgorCisJCS8qCisJCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90CisJCSAqIHdpc2ggdG8gY2xvc2UgdGhlIHNlc3Npb24KKwkJICovCisJCWlmICh0cnVlID09IGJDbG9zZVNlc3Npb24gJiYKKwkJICAgIHRlc3RfYml0KFNNRV9TRVNTSU9OX09QRU5FRCwgJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkgeworCQkJSU5JVF9DT01QTEVUSU9OKGFkYXB0ZXItPnNlc3Npb25fY2xvc2VfY29tcF92YXIpOworCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PQorCQkJICAgIHNtZV9jbG9zZV9zZXNzaW9uKGhkZF9jdHgtPmhIYWwsIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICAgaGRkX3NtZV9jbG9zZV9zZXNzaW9uX2NhbGxiYWNrLAorCQkJCQkgICAgICBhZGFwdGVyKSkgeworCQkJCS8qCisJCQkJICogQmxvY2sgb24gYSBjb21wbGV0aW9uIHZhcmlhYmxlLiBDYW4ndCB3YWl0CisJCQkJICogZm9yZXZlciB0aG91Z2guCisJCQkJICovCisJCQkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoCisJCQkJCSZhZGFwdGVyLT5zZXNzaW9uX2Nsb3NlX2NvbXBfdmFyLAorCQkJCQltc2Vjc190b19qaWZmaWVzCisJCQkJCQkoV0xBTl9XQUlUX1RJTUVfU0VTU0lPTk9QRU5DTE9TRSkpOworCQkJCWlmICghcmMpIHsKKwkJCQkJaGRkTG9nKExPR0UsCisJCQkJCSAgICAgICBGTCgKKwkJCQkJCSAgImZhaWx1cmUgd2FpdGluZyBmb3Igc2Vzc2lvbl9jbG9zZV9jb21wX3ZhciIKKwkJCQkJCSApKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fSEREX1NPRlRBUDoKKwljYXNlIFdMQU5fSEREX1AyUF9HTzoKKwkJaWYgKGhkZF9jdHgtPmNvbmZpZy0+Y29uY19jdXN0b21fcnVsZTEgJiYKKwkJCShXTEFOX0hERF9TT0ZUQVAgPT0gYWRhcHRlci0+ZGV2aWNlX21vZGUpKSB7CisJCQkvKgorCQkJICogQmVmb3JlIHN0b3BwaW5nIHRoZSBzYXAgYWRhcHRlciwgbGV0cyBtYWtlIHN1cmUgdGhlcmUKKwkJCSAqIGlzIG5vIHNhcCByZXN0YXJ0IHdvcmsgcGVuZGluZy4KKwkJCSAqLworCQkJY2RzX2ZsdXNoX3dvcmsoJmhkZF9jdHgtPnNhcF9zdGFydF93b3JrKTsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAgICAgIEZMKCJDYW5jZWxlZCB0aGUgcGVuZGluZyBTQVAgcmVzdGFydCB3b3JrIikpOworCQkJY2RzX2NoYW5nZV9zYXBfcmVzdGFydF9yZXF1aXJlZF9zdGF0dXMoaGRkX2N0eCwgZmFsc2UpOworCQl9CisJCS8qIEFueSBzb2Z0YXAgc3BlY2lmaWMgY2xlYW51cCBoZXJlLi4uICovCisJCWlmIChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pCisJCQl3bGFuX2hkZF9jbGVhbnVwX3JlbWFpbl9vbl9jaGFubmVsX2N0eChhZGFwdGVyKTsKKworCQloZGRfZGVyZWdpc3Rlcl90eF9mbG93X2NvbnRyb2woYWRhcHRlcik7CisKKwkJbXV0ZXhfbG9jaygmaGRkX2N0eC0+c2FwX2xvY2spOworCQlpZiAodGVzdF9iaXQoU09GVEFQX0JTU19TVEFSVEVELCAmYWRhcHRlci0+ZXZlbnRfZmxhZ3MpKSB7CisJCQlDREZfU1RBVFVTIHN0YXR1czsKKwkJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCisJCQkvKiBTdG9wIEJzcy4gKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJCQlzdGF0dXMgPSB3bGFuc2FwX3N0b3BfYnNzKAorCQkJCQlXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIoYWRhcHRlcikpOworI2Vsc2UKKwkJCXN0YXR1cyA9IHdsYW5zYXBfc3RvcF9ic3MoaGRkX2N0eC0+cGNkc19jb250ZXh0KTsKKyNlbmRpZgorCisJCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQloZGRfaG9zdGFwZF9zdGF0ZV90ICpob3N0YXBkX3N0YXRlID0KKwkJCQkJV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIoYWRhcHRlcik7CisJCQkJY2RmX2V2ZW50X3Jlc2V0KCZob3N0YXBkX3N0YXRlLT4KKwkJCQkJCWNkZl9zdG9wX2Jzc19ldmVudCk7CisJCQkJc3RhdHVzID0KKwkJCQkJY2RmX3dhaXRfc2luZ2xlX2V2ZW50KCZob3N0YXBkX3N0YXRlLT4KKwkJCQkJCQljZGZfc3RvcF9ic3NfZXZlbnQsCisJCQkJCQkJQlNTX1dBSVRfVElNRU9VVCk7CisKKwkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJCWhkZExvZyhMT0dFLAorCQkJCQkgICAgICAgRkwoCisJCQkJCQkgICJmYWlsdXJlIHdhaXRpbmcgZm9yIHdsYW5zYXBfc3RvcF9ic3MgJWQiCisJCQkJCQkgKSwKKwkJCQkJICAgICAgIHN0YXR1cyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQloZGRMb2coTE9HRSwgRkwoImZhaWx1cmUgaW4gd2xhbnNhcF9zdG9wX2JzcyIpKTsKKwkJCX0KKwkJCWNsZWFyX2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZhZGFwdGVyLT5ldmVudF9mbGFncyk7CisJCQljZHNfZGVjcl9zZXNzaW9uX3NldF9wY2woaGRkX2N0eCwKKwkJCQkJCSAgICAgYWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJCQkJYWRhcHRlci0+c2Vzc2lvbklkKTsKKworCQkJY2RmX21lbV9jb3B5KHVwZGF0ZUlFLmJzc2lkLAorCQkJCSAgICAgYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsCisJCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJCXVwZGF0ZUlFLnNtZVNlc3Npb25JZCA9IGFkYXB0ZXItPnNlc3Npb25JZDsKKwkJCXVwZGF0ZUlFLmllQnVmZmVybGVuZ3RoID0gMDsKKwkJCXVwZGF0ZUlFLnBBZGRpdGlvbklFQnVmZmVyID0gTlVMTDsKKwkJCXVwZGF0ZUlFLmFwcGVuZCA9IGZhbHNlOworCQkJdXBkYXRlSUUubm90aWZ5ID0gZmFsc2U7CisJCQkvKiBQcm9iZSBiY24gcmVzZXQgKi8KKwkJCWlmIChzbWVfdXBkYXRlX2FkZF9pZShXTEFOX0hERF9HRVRfSEFMX0NUWChhZGFwdGVyKSwKKwkJCQkJICAgICAgJnVwZGF0ZUlFLCBlVVBEQVRFX0lFX1BST0JFX0JDTikKKwkJCSAgICA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgKKwkJCQkJICAiQ291bGQgbm90IHBhc3Mgb24gUFJPQkVfUlNQX0JDTiBkYXRhIHRvIFBFIgorCQkJCQkgKSk7CisJCQl9CisJCQkvKiBBc3NvYyByZXNwIHJlc2V0ICovCisJCQlpZiAoc21lX3VwZGF0ZV9hZGRfaWUoV0xBTl9IRERfR0VUX0hBTF9DVFgoYWRhcHRlciksCisJCQkJCSAgICAgICZ1cGRhdGVJRSwKKwkJCQkJICAgICAgZVVQREFURV9JRV9BU1NPQ19SRVNQKSA9PQorCQkJICAgIENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKAorCQkJCQkgICJDb3VsZCBub3QgcGFzcyBvbiBBU1NPQ19SU1AgZGF0YSB0byBQRSIKKwkJCQkJICkpOworCQkJfQorCQkJLyogUmVzZXQgV05JX0NGR19QUk9CRV9SU1AgRmxhZ3MgKi8KKwkJCXdsYW5faGRkX3Jlc2V0X3Byb2JfcnNwaWVzKGFkYXB0ZXIpOworCQkJa2ZyZWUoYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5iZWFjb24pOworCQkJYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5iZWFjb24gPSBOVUxMOworCQl9CisJCW11dGV4X3VubG9jaygmaGRkX2N0eC0+c2FwX2xvY2spOworCQlicmVhazsKKwljYXNlIFdMQU5fSEREX09DQjoKKwkJb2xfdHhyeF9jbGVhcl9wZWVyKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIoYWRhcHRlciktPgorCQkJY29ubl9pbmZvLnN0YUlkWzBdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJRVhJVCgpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgaGRkX3N0b3BfYWxsX2FkYXB0ZXJzKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyOworCisJRU5URVIoKTsKKworCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlck5vZGUpOworCisJd2hpbGUgKE5VTEwgIT0gYWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlhZGFwdGVyID0gYWRhcHRlck5vZGUtPnBBZGFwdGVyOworCQloZGRfc3RvcF9hZGFwdGVyKGhkZF9jdHgsIGFkYXB0ZXIsIHRydWUpOworCQlzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlcihoZGRfY3R4LCBhZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJYWRhcHRlck5vZGUgPSBwTmV4dDsKKwl9CisKKwlFWElUKCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitDREZfU1RBVFVTIGhkZF9yZXNldF9hbGxfYWRhcHRlcnMoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzOworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKGhkZF9jdHgsICZhZGFwdGVyTm9kZSk7CisKKwl3aGlsZSAoTlVMTCAhPSBhZGFwdGVyTm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCWFkYXB0ZXIgPSBhZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisJCWhkZExvZyhMT0cxLCBGTCgiRGlzYWJsaW5nIHF1ZXVlcyIpKTsKKwkJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChhZGFwdGVyLAorCQkJCQkgICBXTEFOX05FVElGX1RYX0RJU0FCTEVfTl9DQVJSSUVSLAorCQkJCQkgICBXTEFOX0NPTlRST0xfUEFUSCk7CisKKwkJYWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLmhkZF9SZWFzc29jU2NlbmFyaW8gPSBmYWxzZTsKKworCQloZGRfZGVpbml0X3R4X3J4KGFkYXB0ZXIpOworCQljZHNfZGVjcl9zZXNzaW9uX3NldF9wY2woaGRkX2N0eCwKKwkJCQkJCWFkYXB0ZXItPmRldmljZV9tb2RlLAorCQkJCQkJYWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJaWYgKHRlc3RfYml0KFdNTV9JTklUX0RPTkUsICZhZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKwkJCWhkZF93bW1fYWRhcHRlcl9jbG9zZShhZGFwdGVyKTsKKwkJCWNsZWFyX2JpdChXTU1fSU5JVF9ET05FLCAmYWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCQl9CisKKwkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIoaGRkX2N0eCwgYWRhcHRlck5vZGUsICZwTmV4dCk7CisJCWFkYXB0ZXJOb2RlID0gcE5leHQ7CisJfQorCisJRVhJVCgpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBoZGRfc3RhcnRfYWxsX2FkYXB0ZXJzKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyOworI2lmbmRlZiBNU01fUExBVEZPUk0KKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJjYXN0TWFjID0gQ0RGX01BQ19BRERSX0JST0FEQ0FTVF9JTklUSUFMSVpFUjsKKyNlbmRpZgorCWVDb25uZWN0aW9uU3RhdGUgY29ublN0YXRlOworCisJRU5URVIoKTsKKworCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlck5vZGUpOworCisJd2hpbGUgKE5VTEwgIT0gYWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlhZGFwdGVyID0gYWRhcHRlck5vZGUtPnBBZGFwdGVyOworCisJCWhkZF93bW1faW5pdChhZGFwdGVyKTsKKworCQlzd2l0Y2ggKGFkYXB0ZXItPmRldmljZV9tb2RlKSB7CisJCWNhc2UgV0xBTl9IRERfSU5GUkFfU1RBVElPTjoKKwkJY2FzZSBXTEFOX0hERF9QMlBfQ0xJRU5UOgorCQljYXNlIFdMQU5fSEREX1AyUF9ERVZJQ0U6CisKKwkJCWNvbm5TdGF0ZSA9IChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpKQorCQkJCQktPmNvbm5faW5mby5jb25uU3RhdGU7CisKKwkJCWhkZF9pbml0X3N0YXRpb25fbW9kZShhZGFwdGVyKTsKKwkJCS8qIE9wZW4gdGhlIGdhdGVzIGZvciBIREQgdG8gcmVjZWl2ZSBXZXh0IGNvbW1hbmRzICovCisJCQlhZGFwdGVyLT5pc0xpbmtVcFN2Y05lZWRlZCA9IGZhbHNlOworCQkJYWRhcHRlci0+c2Nhbl9pbmZvLm1TY2FuUGVuZGluZyA9IGZhbHNlOworCisJCQkvKiBJbmRpY2F0ZSBkaXNjb25uZWN0IGV2ZW50IHRvIHN1cHBsaWNhbnQgaWYgYXNzb2NpYXRlZCBwcmV2aW91c2x5ICovCisJCQlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09IGNvbm5TdGF0ZSB8fAorCQkJICAgIGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCA9PSBjb25uU3RhdGUpIHsKKwkJCQl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJCQkJbWVtc2V0KCZ3cnF1LCAnXDAnLCBzaXplb2Yod3JxdSkpOworCQkJCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAnXDAnLCBFVEhfQUxFTik7CisJCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChhZGFwdGVyLT5kZXYsIFNJT0NHSVdBUCwKKwkJCQkJCSAgICAmd3JxdSwgTlVMTCk7CisJCQkJYWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLgorCQkJCWhkZF9SZWFzc29jU2NlbmFyaW8gPSBmYWxzZTsKKworCQkJCS8qIGluZGljYXRlIGRpc2Nvbm5lY3RlZCBldmVudCB0byBubDgwMjExICovCisJCQkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKGFkYXB0ZXItPmRldiwKKwkJCQkJCSAgICAgIFdMQU5fUkVBU09OX1VOU1BFQ0lGSUVELAorCQkJCQkJICAgICAgTlVMTCwgMCwgR0ZQX0tFUk5FTCk7CisJCQl9IGVsc2UgaWYgKGVDb25uZWN0aW9uU3RhdGVfQ29ubmVjdGluZyA9PSBjb25uU3RhdGUpIHsKKwkJCQkvKgorCQkJCSAqIEluZGljYXRlIGNvbm5lY3QgZmFpbHVyZSB0byBzdXBwbGljYW50IGlmIHdlIHdlcmUgaW4gdGhlCisJCQkJICogcHJvY2VzcyBvZiBjb25uZWN0aW5nCisJCQkJICovCisJCQkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQoYWRhcHRlci0+ZGV2LCBOVUxMLAorCQkJCQkJCU5VTEwsIDAsIE5VTEwsIDAsCisJCQkJCQkJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1VOU1BFQywKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCX0KKworCQkJaGRkX3JlZ2lzdGVyX3R4X2Zsb3dfY29udHJvbChhZGFwdGVyLAorCQkJCQloZGRfdHhfcmVzdW1lX3RpbWVyX2V4cGlyZWRfaGFuZGxlciwKKwkJCQkJaGRkX3R4X3Jlc3VtZV9jYik7CisKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9IRERfU09GVEFQOgorCQkJLyogc29mdEFQIGNhbiBoYW5kbGUgU1NSICovCisJCQlicmVhazsKKworCQljYXNlIFdMQU5fSEREX1AyUF9HTzoKKyNpZmRlZiBNU01fUExBVEZPUk0KKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgRkwoIltTU1JdIHNlbmQgc3RvcCBhcCB0byBzdXBwbGljYW50IikpOworCQkJY2ZnODAyMTFfYXBfc3RvcHBlZChhZGFwdGVyLT5kZXYsIEdGUF9LRVJORUwpOworI2Vsc2UKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgRkwoIltTU1JdIHNlbmQgcmVzdGFydCBzdXBwbGljYW50IikpOworCQkJLyogZXZlbnQgc3VwcGxpY2FudCB0byByZXN0YXJ0ICovCisJCQljZmc4MDIxMV9kZWxfc3RhKGFkYXB0ZXItPmRldiwKKwkJCQkJIChjb25zdCB1OCAqKSZiY2FzdE1hYy5ieXRlc1swXSwKKwkJCQkJIEdGUF9LRVJORUwpOworI2VuZGlmCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlcihoZGRfY3R4LCBhZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJYWRhcHRlck5vZGUgPSBwTmV4dDsKKwl9CisKKwlFWElUKCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitib29sIGhkZF9pc19zc3JfcmVxdWlyZWQodm9pZCkKK3sKKwlyZXR1cm4gaXNfc3NyX3JlcXVpcmVkID09IEhERF9TU1JfUkVRVUlSRUQ7Cit9CisKKy8qIE9uY2UgU1NSIGlzIGRpc2FibGVkIHRoZW4gaXQgY2Fubm90IGJlIHNldC4gKi8KK3ZvaWQgaGRkX3NldF9zc3JfcmVxdWlyZWQoZV9oZGRfc3NyX3JlcXVpcmVkIHZhbHVlKQoreworCWlmIChIRERfU1NSX0RJU0FCTEVEID09IGlzX3Nzcl9yZXF1aXJlZCkKKwkJcmV0dXJuOworCisJaXNfc3NyX3JlcXVpcmVkID0gdmFsdWU7Cit9CisKK0NERl9TVEFUVVMgaGRkX2dldF9mcm9udF9hZGFwdGVyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICoqcGFkYXB0ZXJOb2RlKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCWNkZl9zcGluX2xvY2soJmhkZF9jdHgtPmhkZF9hZGFwdGVyX2xvY2spOworCXN0YXR1cyA9IGNkZl9saXN0X3BlZWtfZnJvbnQoJmhkZF9jdHgtPmhkZEFkYXB0ZXJzLAorCQkJCSAgICAgKGNkZl9saXN0X25vZGVfdCAqKikgcGFkYXB0ZXJOb2RlKTsKKwljZGZfc3Bpbl91bmxvY2soJmhkZF9jdHgtPmhkZF9hZGFwdGVyX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgaGRkX2dldF9uZXh0X2FkYXB0ZXIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlck5vZGUsCisJCQkJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKipwTmV4dEFkYXB0ZXJOb2RlKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCWNkZl9zcGluX2xvY2soJmhkZF9jdHgtPmhkZF9hZGFwdGVyX2xvY2spOworCXN0YXR1cyA9IGNkZl9saXN0X3BlZWtfbmV4dCgmaGRkX2N0eC0+aGRkQWRhcHRlcnMsCisJCQkJICAgIChjZGZfbGlzdF9ub2RlX3QgKikgYWRhcHRlck5vZGUsCisJCQkJICAgIChjZGZfbGlzdF9ub2RlX3QgKiopIHBOZXh0QWRhcHRlck5vZGUpOworCisJY2RmX3NwaW5fdW5sb2NrKCZoZGRfY3R4LT5oZGRfYWRhcHRlcl9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGhkZF9yZW1vdmVfYWRhcHRlcihoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJICAgICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJOb2RlKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCWNkZl9zcGluX2xvY2soJmhkZF9jdHgtPmhkZF9hZGFwdGVyX2xvY2spOworCXN0YXR1cyA9IGNkZl9saXN0X3JlbW92ZV9ub2RlKCZoZGRfY3R4LT5oZGRBZGFwdGVycywKKwkJCQkgICAgICAmYWRhcHRlck5vZGUtPm5vZGUpOworCWNkZl9zcGluX3VubG9jaygmaGRkX2N0eC0+aGRkX2FkYXB0ZXJfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBoZGRfcmVtb3ZlX2Zyb250X2FkYXB0ZXIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKipwYWRhcHRlck5vZGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJY2RmX3NwaW5fbG9jaygmaGRkX2N0eC0+aGRkX2FkYXB0ZXJfbG9jayk7CisJc3RhdHVzID0gY2RmX2xpc3RfcmVtb3ZlX2Zyb250KCZoZGRfY3R4LT5oZGRBZGFwdGVycywKKwkJCQkgICAgICAgKGNkZl9saXN0X25vZGVfdCAqKikgcGFkYXB0ZXJOb2RlKTsKKwljZGZfc3Bpbl91bmxvY2soJmhkZF9jdHgtPmhkZF9hZGFwdGVyX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgaGRkX2FkZF9hZGFwdGVyX2JhY2soaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlck5vZGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJY2RmX3NwaW5fbG9jaygmaGRkX2N0eC0+aGRkX2FkYXB0ZXJfbG9jayk7CisJc3RhdHVzID0gY2RmX2xpc3RfaW5zZXJ0X2JhY2soJmhkZF9jdHgtPmhkZEFkYXB0ZXJzLAorCQkJCSAgICAgIChjZGZfbGlzdF9ub2RlX3QgKikgYWRhcHRlck5vZGUpOworCWNkZl9zcGluX3VubG9jaygmaGRkX2N0eC0+aGRkX2FkYXB0ZXJfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBoZGRfYWRkX2FkYXB0ZXJfZnJvbnQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJOb2RlKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCWNkZl9zcGluX2xvY2soJmhkZF9jdHgtPmhkZF9hZGFwdGVyX2xvY2spOworCXN0YXR1cyA9IGNkZl9saXN0X2luc2VydF9mcm9udCgmaGRkX2N0eC0+aGRkQWRhcHRlcnMsCisJCQkJICAgICAgIChjZGZfbGlzdF9ub2RlX3QgKikgYWRhcHRlck5vZGUpOworCWNkZl9zcGluX3VubG9jaygmaGRkX2N0eC0+aGRkX2FkYXB0ZXJfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworaGRkX2FkYXB0ZXJfdCAqaGRkX2dldF9hZGFwdGVyX2J5X21hY2FkZHIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkJICB0U2lyTWFjQWRkciBtYWNBZGRyKQoreworCWhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICphZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlck5vZGUpOworCisJd2hpbGUgKE5VTEwgIT0gYWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlhZGFwdGVyID0gYWRhcHRlck5vZGUtPnBBZGFwdGVyOworCisJCWlmIChhZGFwdGVyCisJCSAgICAmJiBjZGZfbWVtX2NvbXBhcmUoYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsCisJCQkJICAgICAgIG1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQlyZXR1cm4gYWRhcHRlcjsKKwkJfQorCQlzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlcihoZGRfY3R4LCBhZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJYWRhcHRlck5vZGUgPSBwTmV4dDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKKworfQorCitoZGRfYWRhcHRlcl90ICpoZGRfZ2V0X2FkYXB0ZXJfYnlfdmRldihoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJCSAgICAgICB1aW50MzJfdCB2ZGV2X2lkKQoreworCWhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICphZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisKKwljZGZfc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKGhkZF9jdHgsICZhZGFwdGVyTm9kZSk7CisKKwl3aGlsZSAoKE5VTEwgIT0gYWRhcHRlck5vZGUpICYmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gY2RmX3N0YXR1cykpIHsKKwkJYWRhcHRlciA9IGFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKworCQlpZiAoYWRhcHRlci0+c2Vzc2lvbklkID09IHZkZXZfaWQpCisJCQlyZXR1cm4gYWRhcHRlcjsKKworCQljZGZfc3RhdHVzID0KKwkJCWhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsIGFkYXB0ZXJOb2RlLCAmcE5leHQpOworCQlhZGFwdGVyTm9kZSA9IHBOZXh0OworCX0KKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJICAgICAgIEZMKCJ2ZGV2X2lkICVkIGRvZXMgbm90IGV4aXN0IHdpdGggaG9zdCIpLCB2ZGV2X2lkKTsKKworCXJldHVybiBOVUxMOworfQorCitoZGRfYWRhcHRlcl90ICpoZGRfZ2V0X2FkYXB0ZXIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgZGV2aWNlX21vZGVfdCBtb2RlKQoreworCWhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICphZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlck5vZGUpOworCisJd2hpbGUgKE5VTEwgIT0gYWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlhZGFwdGVyID0gYWRhcHRlck5vZGUtPnBBZGFwdGVyOworCisJCWlmIChhZGFwdGVyICYmIChtb2RlID09IGFkYXB0ZXItPmRldmljZV9tb2RlKSkKKwkJCXJldHVybiBhZGFwdGVyOworCisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsIGFkYXB0ZXJOb2RlLCAmcE5leHQpOworCQlhZGFwdGVyTm9kZSA9IHBOZXh0OworCX0KKworCXJldHVybiBOVUxMOworCit9CisKKy8qKgorICogaGRkX2dldF9vcGVyYXRpbmdfY2hhbm5lbCgpIC0gcmV0dXJuIG9wZXJhdGluZyBjaGFubmVsIG9mIHRoZSBkZXZpY2UgbW9kZQorICogQGhkZF9jdHg6CVBvaW50ZXIgdG8gdGhlIEhERCBjb250ZXh0LgorICogQG1vZGU6CURldmljZSBtb2RlIGZvciB3aGljaCBvcGVyYXRpbmcgY2hhbm5lbCBpcyByZXF1aXJlZC4KKyAqICAgICAgICAgICAgICBTdXBvcnRlZCBtb2RlczoKKyAqCQkJV0xBTl9IRERfSU5GUkFfU1RBVElPTiwKKyAqCQkJV0xBTl9IRERfUDJQX0NMSUVOVCwKKyAqCQkJV0xBTl9IRERfU09GVEFQLAorICoJCQlXTEFOX0hERF9QMlBfR08uCisgKgorICogVGhpcyBBUEkgcmV0dXJucyB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgb2YgdGhlIHJlcXVlc3RlZCBkZXZpY2UgbW9kZQorICoKKyAqIFJldHVybjogY2hhbm5lbCBudW1iZXIuICIwIiBpZCB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyBub3QgZm91bmQgT1IgaXQgaXMKKyAqCSAgIG5vdCBjb25uZWN0ZWQuCisgKi8KK3VpbnQ4X3QgaGRkX2dldF9vcGVyYXRpbmdfY2hhbm5lbChoZGRfY29udGV4dF90ICpoZGRfY3R4LCBkZXZpY2VfbW9kZV90IG1vZGUpCit7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyOworCXVpbnQ4X3Qgb3BlcmF0aW5nQ2hhbm5lbCA9IDA7CisKKwlzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIoaGRkX2N0eCwgJmFkYXB0ZXJOb2RlKTsKKworCXdoaWxlIChOVUxMICE9IGFkYXB0ZXJOb2RlICYmIENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJYWRhcHRlciA9IGFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKworCQlpZiAobW9kZSA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQkJc3dpdGNoIChhZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQkJY2FzZSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OOgorCQkJY2FzZSBXTEFOX0hERF9QMlBfQ0xJRU5UOgorCQkJCWlmIChoZGRfY29ubl9pc19jb25uZWN0ZWQKKwkJCQkJICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSCisJCQkJCQkoYWRhcHRlcikpKSB7CisJCQkJCW9wZXJhdGluZ0NoYW5uZWwgPQorCQkJCQkJKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIKKwkJCQkJCShhZGFwdGVyKSktPmNvbm5faW5mby4KKwkJCQkJCQlvcGVyYXRpb25DaGFubmVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgV0xBTl9IRERfU09GVEFQOgorCQkJY2FzZSBXTEFOX0hERF9QMlBfR086CisJCQkJLyogc29mdGFwIGNvbm5lY3Rpb24gaW5mbyAqLworCQkJCWlmICh0ZXN0X2JpdAorCQkJCQkgICAgKFNPRlRBUF9CU1NfU1RBUlRFRCwKKwkJCQkJICAgICZhZGFwdGVyLT5ldmVudF9mbGFncykpCisJCQkJCW9wZXJhdGluZ0NoYW5uZWwgPQorCQkJCQkJKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSCisJCQkJCQkoYWRhcHRlcikpLT5vcGVyYXRpbmdDaGFubmVsOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7ICAvKiBGb3VuZCB0aGUgZGV2aWNlIG9mIGludGVyZXN0LiBicmVhayB0aGUgbG9vcCAqLworCQl9CisKKwkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIoaGRkX2N0eCwgYWRhcHRlck5vZGUsICZwTmV4dCk7CisJCWFkYXB0ZXJOb2RlID0gcE5leHQ7CisJfQorCXJldHVybiBvcGVyYXRpbmdDaGFubmVsOworfQorCitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMgaGRkX3VucmVnaXN0ZXJfd2V4dF9hbGxfYWRhcHRlcnMoaGRkX2NvbnRleHRfdCAqCisJCQkJCQkJICBoZGRfY3R4KQoreworCWhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICphZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIoaGRkX2N0eCwgJmFkYXB0ZXJOb2RlKTsKKworCXdoaWxlIChOVUxMICE9IGFkYXB0ZXJOb2RlICYmIENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJYWRhcHRlciA9IGFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKwkJaWYgKChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKSB8fAorCQkgICAgKGFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9DTElFTlQpIHx8CisJCSAgICAoYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSUJTUykgfHwKKwkJICAgIChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfREVWSUNFKSB8fAorCQkgICAgKGFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCkgfHwKKwkJICAgIChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pKSB7CisJCQl3bGFuX2hkZF9jZmc4MDIxMV9kZXJlZ2lzdGVyX2ZyYW1lcyhhZGFwdGVyKTsKKwkJCWhkZF91bnJlZ2lzdGVyX3dleHQoYWRhcHRlci0+ZGV2KTsKKwkJfQorCQlzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlcihoZGRfY3R4LCBhZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJYWRhcHRlck5vZGUgPSBwTmV4dDsKKwl9CisKKwlFWElUKCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitDREZfU1RBVFVTIGhkZF9hYm9ydF9tYWNfc2Nhbl9hbGxfYWRhcHRlcnMoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzOworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKGhkZF9jdHgsICZhZGFwdGVyTm9kZSk7CisKKwl3aGlsZSAoTlVMTCAhPSBhZGFwdGVyTm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCWFkYXB0ZXIgPSBhZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisJCWlmICgoYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikgfHwKKwkJICAgIChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfQ0xJRU5UKSB8fAorCQkgICAgKGFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX0lCU1MpIHx8CisJCSAgICAoYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0RFVklDRSkgfHwKKwkJICAgIChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9TT0ZUQVApIHx8CisJCSAgICAoYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKSkgeworCQkJaGRkX2Fib3J0X21hY19zY2FuKGhkZF9jdHgsIGFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgZUNTUl9TQ0FOX0FCT1JUX0RFRkFVTFQpOworCQl9CisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsIGFkYXB0ZXJOb2RlLCAmcE5leHQpOworCQlhZGFwdGVyTm9kZSA9IHBOZXh0OworCX0KKworCUVYSVQoKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBXTEFOX05TX09GRkxPQUQKKy8qKgorICogaGRkX3dsYW5fdW5yZWdpc3Rlcl9pcDZfbm90aWZpZXIoKSAtIHVucmVnaXN0ZXIgSVA2IGNoYW5nZSBub3RpZmllcgorICogQGhkZF9jdHg6IFBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX3dsYW5fdW5yZWdpc3Rlcl9pcDZfbm90aWZpZXIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwl1bnJlZ2lzdGVyX2luZXQ2YWRkcl9ub3RpZmllcigmaGRkX2N0eC0+aXB2Nl9ub3RpZmllcik7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogaGRkX3dsYW5fcmVnaXN0ZXJfaXA2X25vdGlmaWVyKCkgLSByZWdpc3RlciBJUDYgY2hhbmdlIG5vdGlmaWVyCisgKiBAaGRkX2N0eDogUG9pbnRlciB0byBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfd2xhbl9yZWdpc3Rlcl9pcDZfbm90aWZpZXIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlpbnQgcmV0OworCisJaGRkX2N0eC0+aXB2Nl9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gd2xhbl9oZGRfaXB2Nl9jaGFuZ2VkOworCXJldCA9IHJlZ2lzdGVyX2luZXQ2YWRkcl9ub3RpZmllcigmaGRkX2N0eC0+aXB2Nl9ub3RpZmllcik7CisJaWYgKHJldCkKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gcmVnaXN0ZXIgSVB2NiBub3RpZmllciIpKTsKKwllbHNlCisJCWhkZExvZyhMT0dFLCBGTCgiUmVnaXN0ZXJlZCBJUHY2IG5vdGlmaWVyIikpOworCisJcmV0dXJuOworfQorI2Vsc2UKKy8qKgorICogaGRkX3dsYW5fdW5yZWdpc3Rlcl9pcDZfbm90aWZpZXIoKSAtIHVucmVnaXN0ZXIgSVA2IGNoYW5nZSBub3RpZmllcgorICogQGhkZF9jdHg6IFBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX3dsYW5fdW5yZWdpc3Rlcl9pcDZfbm90aWZpZXIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKK30KKy8qKgorICogaGRkX3dsYW5fcmVnaXN0ZXJfaXA2X25vdGlmaWVyKCkgLSByZWdpc3RlciBJUDYgY2hhbmdlIG5vdGlmaWVyCisgKiBAaGRkX2N0eDogUG9pbnRlciB0byBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfd2xhbl9yZWdpc3Rlcl9pcDZfbm90aWZpZXIoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKK30KKyNlbmRpZgorCisvKioKKyAqIGhkZF93bGFuX2V4aXQoKSAtIEhERCBXTEFOIGV4aXQgZnVuY3Rpb24KKyAqIEBoZGRfY3R4OglQb2ludGVyIHRvIHRoZSBIREQgQ29udGV4dAorICoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBleGl0IHBvaW50IChpbnZva2VkIGR1cmluZyBybW1vZCkKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBoZGRfd2xhbl9leGl0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJdl9DT05URVhUX3QgcF9jZHNfY29udGV4dCA9IGhkZF9jdHgtPnBjZHNfY29udGV4dDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJc3RydWN0IHdpcGh5ICp3aXBoeSA9IGhkZF9jdHgtPndpcGh5OworCXN0cnVjdCBoZGRfY29uZmlnICpwQ29uZmlnID0gaGRkX2N0eC0+Y29uZmlnOworCisJRU5URVIoKTsKKworCWhkZExvZyhMT0dFLCBGTCgiVW5yZWdpc3RlciBJUHY2IG5vdGlmaWVyIikpOworCWhkZF93bGFuX3VucmVnaXN0ZXJfaXA2X25vdGlmaWVyKGhkZF9jdHgpOworCWhkZExvZyhMT0dFLCBGTCgiVW5yZWdpc3RlciBJUHY0IG5vdGlmaWVyIikpOworCXVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJmhkZF9jdHgtPmlwdjRfbm90aWZpZXIpOworCisJaGRkX3VucmVnaXN0ZXJfd2V4dF9hbGxfYWRhcHRlcnMoaGRkX2N0eCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sIEZMKCJGVE0gTU9ERSIpKTsKKyNpZiAgZGVmaW5lZChRQ0FfV0lGSV9GVE0pCisJCWlmIChoZGRfZnRtX3N0b3AoaGRkX2N0eCkpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoImhkZF9mdG1fc3RvcCBGYWlsZWQiKSk7CisJCQlDREZfQVNTRVJUKDApOworCQl9CisJCWhkZF9jdHgtPmZ0bS5mdG1fc3RhdGUgPSBXTEFOX0ZUTV9TVE9QUEVEOworI2VuZGlmCisJCXdsYW5faGRkX2Z0bV9jbG9zZShoZGRfY3R4KTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgRkwoIkZUTSBkcml2ZXIgdW5sb2FkZWQiKSk7CisJCWdvdG8gZnJlZV9oZGRfY3R4OworCX0KKworCS8qCisJICogQ2FuY2VsIGFueSBvdXRzdGFuZGluZyBzY2FuIHJlcXVlc3RzLiAgV2UgYXJlIGFib3V0IHRvIGNsb3NlIGFsbAorCSAqIG9mIG91ciBhZGFwdGVycywgYnV0IGFuIGFkYXB0ZXIgc3RydWN0dXJlIGlzIHdoYXQgU01FIHBhc3NlcyBiYWNrCisJICogdG8gb3VyIGNhbGxiYWNrIGZ1bmN0aW9uLiAgSGVuY2UgaWYgdGhlcmUgYXJlIGFueSBvdXRzdGFuZGluZyBzY2FuCisJICogcmVxdWVzdHMgdGhlbiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gd2hlbiB0aGUgYWRhcHRlcgorCSAqIGlzIGNsb3NlZCBhbmQgd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4gIFdlIHRyeSB0byByZXNvbHZlIHRoYXQKKwkgKiByYWNlIGNvbmRpdGlvbiBoZXJlIGJ5IGNhbmNlbGluZyBhbnkgb3V0c3RhbmRpbmcgc2NhbnMgYmVmb3JlIHdlCisJICogY2xvc2UgdGhlIGFkYXB0ZXJzLgorCSAqIE5vdGUgdGhhdCB0aGUgc2NhbnMgbWF5IGJlIGNhbmNlbGxlZCBpbiBhbiBhc3luY2hyb25vdXMgbWFubmVyLCBzbworCSAqIGlkZWFsbHkgdGhlcmUgbmVlZHMgdG8gYmUgc29tZSBraW5kIG9mIHN5bmNocm9uaXphdGlvbi4gIFJhdGhlciB0aGFuCisJICogaW50cm9kdWNlIGEgbmV3IHN5bmNocm9uaXphdGlvbiBoZXJlLCB3ZSB3aWxsIHV0aWxpemUgdGhlIGZhY3QgdGhhdAorCSAqIHdlIGFyZSBhYm91dCB0byBSZXF1ZXN0IEZ1bGwgUG93ZXIsIGFuZCBzaW5jZSB0aGF0IGlzIHN5bmNocm9uaXplZCwKKwkgKiB0aGUgZXhwZWN0YXRpb24gaXMgdGhhdCBieSB0aGUgdGltZSBSZXF1ZXN0IEZ1bGwgUG93ZXIgaGFzIGNvbXBsZXRlZCwKKwkgKiBhbGwgc2NhbnMgd2lsbCBiZSBjYW5jZWxsZWQKKwkgKi8KKwloZGRfYWJvcnRfbWFjX3NjYW5fYWxsX2FkYXB0ZXJzKGhkZF9jdHgpOworCisjaWZkZWYgTVNNX1BMQVRGT1JNCisJaWYgKENERl9USU1FUl9TVEFURV9SVU5OSU5HID09CisJICAgIGNkZl9tY190aW1lcl9nZXRfY3VycmVudF9zdGF0ZSgmaGRkX2N0eC0+YnVzX2J3X3RpbWVyKSkgeworCQljZGZfbWNfdGltZXJfc3RvcCgmaGRkX2N0eC0+YnVzX2J3X3RpbWVyKTsKKwl9CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkgICAgKGNkZl9tY190aW1lcl9kZXN0cm95KCZoZGRfY3R4LT5idXNfYndfdGltZXIpKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIkNhbm5vdCBkZWFsbG9jYXRlIEJ1cyBiYW5kd2lkdGggdGltZXIiKSk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVBfQVBfQUNTX09QVElNSVpFCisJaWYgKENERl9USU1FUl9TVEFURV9SVU5OSU5HID09CisJICAgIGNkZl9tY190aW1lcl9nZXRfY3VycmVudF9zdGF0ZSgmaGRkX2N0eC0+c2tpcF9hY3Nfc2Nhbl90aW1lcikpIHsKKwkJY2RmX21jX3RpbWVyX3N0b3AoJmhkZF9jdHgtPnNraXBfYWNzX3NjYW5fdGltZXIpOworCX0KKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCSAgICAoY2RmX21jX3RpbWVyX2Rlc3Ryb3koJmhkZF9jdHgtPnNraXBfYWNzX3NjYW5fdGltZXIpKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIkNhbm5vdCBkZWFsbG9jYXRlIEFDUyBTa2lwIHRpbWVyIikpOworCX0KKyNlbmRpZgorCWlmIChDREZfVElNRVJfU1RBVEVfUlVOTklORyA9PQorCQljZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoCisJCQkmaGRkX2N0eC0+ZGJzX29wcG9ydHVuaXN0aWNfdGltZXIpKSB7CisJCWNkZl9tY190aW1lcl9zdG9wKCZoZGRfY3R4LT5kYnNfb3Bwb3J0dW5pc3RpY190aW1lcik7CisJfQorCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJCShjZGZfbWNfdGltZXJfZGVzdHJveSgKKwkJCQkmaGRkX2N0eC0+ZGJzX29wcG9ydHVuaXN0aWNfdGltZXIpKSkgeworCQloZGRfZXJyKCJDYW5ub3QgZGVhbGxvY2F0ZSBkYnMgb3Bwb3J0dW5pc3RpYyB0aW1lciIpOworCX0KKworCS8qCisJICogUG93ZXJzYXZlIE9mZmxvYWQgQ2FzZQorCSAqIERpc2FibGUgSWRsZSBQb3dlciBTYXZlIE1vZGUKKwkgKi8KKwloZGRfc2V0X2lkbGVfcHNfY29uZmlnKGhkZF9jdHgsIGZhbHNlKTsKKworCWhkZF9kZWJ1Z2ZzX2V4aXQoaGRkX2N0eCk7CisKKwkvKiBVbnJlZ2lzdGVyIHRoZSBOZXQgRGV2aWNlIE5vdGlmaWVyICovCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmhkZF9uZXRkZXZfbm90aWZpZXIpOworCisJLyoKKwkgKiBTdG9wIGFsbCBhZGFwdGVycywgdGhpcyB3aWxsIGVuc3VyZSB0aGUgdGVybWluYXRpb24gb2YgYWN0aXZlCisJICogY29ubmVjdGlvbnMgb24gdGhlIGludGVyZmFjZS4gTWFrZSBzdXJlIHRoZSBjZHNfc2NoZWR1bGVyIGlzCisJICogc3RpbGwgYXZhaWxhYmxlIHRvIGhhbmRsZSB0aG9zZSBjb250cm9sIG1lc3NhZ2VzCisJICovCisJaGRkX3N0b3BfYWxsX2FkYXB0ZXJzKGhkZF9jdHgpOworCisJLyogU3RvcCBhbGwgdGhlIG1vZHVsZXMgKi8KKwljZGZfc3RhdHVzID0gY2RzX2Rpc2FibGUocF9jZHNfY29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJICAgICAgIEZMKCJGYWlsZWQgdG8gc3RvcCBDRFMiKSk7CisJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKwl9CisKKwkvKgorCSAqIENsb3NlIHRoZSBzY2hlZHVsZXIgYmVmb3JlIGNhbGxpbmcgY2RzX2Nsb3NlIHRvIG1ha2Ugc3VyZSBubyB0aHJlYWQKKwkgKiBpcyBzY2hlZHVsZWQgYWZ0ZXIgdGhlIGVhY2ggbW9kdWxlIGNsb3NlIGlzIGNhbGxlZCBpLmUgYWZ0ZXIgYWxsIHRoZQorCSAqIGRhdGEgc3RydWN0dXJlcyBhcmUgZnJlZWQuCisJICovCisJY2RmX3N0YXR1cyA9IGNkc19zY2hlZF9jbG9zZShwX2Nkc19jb250ZXh0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgRkwoIkZhaWxlZCB0byBjbG9zZSBDRFMgU2NoZWR1bGVyIikpOworCQlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSk7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9IT0xEX1JYX1dBS0VMT0NLCisJLyogRGVzdHJveSB0aGUgd2FrZSBsb2NrICovCisJY2RmX3dha2VfbG9ja19kZXN0cm95KCZoZGRfY3R4LT5yeF93YWtlX2xvY2spOworI2VuZGlmCisJLyogRGVzdHJveSB0aGUgd2FrZSBsb2NrICovCisJY2RmX3dha2VfbG9ja19kZXN0cm95KCZoZGRfY3R4LT5zYXBfd2FrZV9sb2NrKTsKKworCWhkZF9ob3N0YXBkX2NoYW5uZWxfd2FrZWxvY2tfZGVpbml0KGhkZF9jdHgpOworCisJLyoKKwkgKiBDbG9zZSBDRFMKKwkgKiBUaGlzIGZyZWVzIHBNYWMoSEFMKSBjb250ZXh0LiBUaGVyZSBzaG91bGQgbm90IGJlIGFueSBjYWxsCisJICogdGhhdCByZXF1aXJlcyBwTWFjIGFjY2VzcyBhZnRlciB0aGlzLgorCSAqLworCWNkc19jbG9zZShwX2Nkc19jb250ZXh0KTsKKworCWhkZF93bGFuX2dyZWVuX2FwX2RlaW5pdChoZGRfY3R4KTsKKworI2lmZGVmIFdMQU5fTE9HR0lOR19TT0NLX1NWQ19FTkFCTEUKKwlpZiAocENvbmZpZyAmJiBwQ29uZmlnLT53bGFuTG9nZ2luZ0VuYWJsZSkgeworCQl3bGFuX2xvZ2dpbmdfc29ja19kZWFjdGl2YXRlX3N2YygpOworCX0KKyNlbmRpZgorI2lmZGVmIFdMQU5fS0RfUkVBRFlfTk9USUZJRVIKKwljbnNzX2RpYWdfbm90aWZ5X3dsYW5fY2xvc2UoKTsKKwlwdHRfc29ja19kZWFjdGl2YXRlX3N2YygpOworI2VuZGlmIC8qIFdMQU5fS0RfUkVBRFlfTk9USUZJRVIgKi8KKwlubF9zcnZfZXhpdCgpOworCisJaGRkX2Nsb3NlX2FsbF9hZGFwdGVycyhoZGRfY3R4KTsKKworCWhkZF9pcGFfY2xlYW51cChoZGRfY3R4KTsKKworCS8qIEZyZWUgdXAgUm9DIHJlcXVlc3QgcXVldWUgYW5kIGZsdXNoIHdvcmtxdWV1ZSAqLworCWNkc19mbHVzaF93b3JrKCZoZGRfY3R4LT5yb2NfcmVxX3dvcmspOworCWNkZl9saXN0X2Rlc3Ryb3koJmhkZF9jdHgtPmhkZF9yb2NfcmVxX3EpOworCWNkZl9saXN0X2Rlc3Ryb3koJmhkZF9jdHgtPmhkZF9zY2FuX3JlcV9xKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9tdXRleF9kZXN0cm95KAorCQkJCSZoZGRfY3R4LT5oZGRfY29uY19saXN0X2xvY2spKSkgeworCQloZGRfZXJyKCJGYWlsZWQgdG8gZGVzdHJveSBoZGRfY29uY19saXN0X2xvY2siKTsKKwkJLyogUHJvY2VlZCBhbmQgY29tcGxldGUgdGhlIGNsZWFuIHVwICovCisJfQorCitmcmVlX2hkZF9jdHg6CisKKwkvKiBGcmVlIHVwIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1iZXJzIGluc2lkZSBIREQgQWRhcHRlciAqLworCWlmIChoZGRfY3R4LT5jb25maWcpIHsKKwkJa2ZyZWUoaGRkX2N0eC0+Y29uZmlnKTsKKwkJaGRkX2N0eC0+Y29uZmlnID0gTlVMTDsKKwl9CisKKwl3aXBoeV91bnJlZ2lzdGVyKHdpcGh5KTsKKwl3aXBoeV9mcmVlKHdpcGh5KTsKKwlpZiAoaGRkX2lzX3Nzcl9yZXF1aXJlZCgpKSB7CisjaWZkZWYgTVNNX1BMQVRGT1JNCisjaWZkZWYgQ09ORklHX0NOU1MKKwkJLyoKKwkJICogV0RJIHRpbWVvdXQgaGFkIGhhcHBlbmVkIGR1cmluZyB1bmxvYWQsIHNvIFNTUiBpcyBuZWVkZWQKKwkJICogaGVyZQorCQkgKi8KKwkJc3Vic3lzdGVtX3Jlc3RhcnQoIndjbnNzIik7CisjZW5kaWYKKyNlbmRpZgorCQltc2xlZXAoNTAwMCk7CisJfQorCWhkZF9zZXRfc3NyX3JlcXVpcmVkKGZhbHNlKTsKK30KKwordm9pZCBfX2hkZF93bGFuX2V4aXQodm9pZCkKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9IREQpOworCWlmICghaGRkX2N0eCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCBGTCgiSW52YWxpZCBIREQgQ29udGV4dCIpKTsKKwkJRVhJVCgpOworCQlyZXR1cm47CisJfQorCisJLyogbW9kdWxlIGV4aXQgc2hvdWxkIG5ldmVyIHByb2NlZWQgaWYgU1NSIGlzIG5vdCBjb21wbGV0ZWQgKi8KKwl3aGlsZSAoaGRkX2N0eC0+aXNMb2dwSW5Qcm9ncmVzcykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgRkwoIlNTUiBpbiBQcm9ncmVzczsgYmxvY2sgcm1tb2QgZm9yIDEgc2Vjb25kISEhIikpOworCQltc2xlZXAoMTAwMCk7CisJfQorCisJaGRkX2N0eC0+aXNVbmxvYWRJblByb2dyZXNzID0gdHJ1ZTsKKworCWNkc19zZXRfbG9hZF91bmxvYWRfaW5fcHJvZ3Jlc3ModHJ1ZSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTFBTUworCXdsYW5faGRkX3NlbmRfc3RhdHVzX3BrZyhOVUxMLCBOVUxMLCAwLCAwKTsKKyNlbmRpZgorCisJLyogRG8gYWxsIHRoZSBjbGVhbnVwIGJlZm9yZSBkZXJlZ2lzdGVyaW5nIHRoZSBkcml2ZXIgKi8KKwloZGRfd2xhbl9leGl0KGhkZF9jdHgpOworCUVYSVQoKTsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9BUF9BUF9BQ1NfT1BUSU1JWkUKK3ZvaWQgaGRkX3NraXBfYWNzX3NjYW5fdGltZXJfaGFuZGxlcih2b2lkICpkYXRhKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSAoaGRkX2NvbnRleHRfdCAqKSBkYXRhOworCisJaGRkTG9nKExPRzEsIEZMKCJBQ1MgU2NhbiByZXN1bHQgZXhwaXJlZC4gUmVzZXQgQUNTIHNjYW4gc2tpcCIpKTsKKwloZGRfY3R4LT5za2lwX2Fjc19zY2FuX3N0YXR1cyA9IGVTQVBfRE9fTkVXX0FDU19TQ0FOOworCisJaWYgKCFoZGRfY3R4LT5oSGFsKQorCQlyZXR1cm47CisJc21lX3NjYW5fZmx1c2hfcmVzdWx0KGhkZF9jdHgtPmhIYWwpOworfQorI2VuZGlmCisKKyNpZmRlZiBRQ0FfSFRfMjA0MF9DT0VYCisvKioKKyAqIGhkZF93bGFuX3NldF9odDIwNDBfbW9kZSgpIC0gbm90aWZ5IEZXIHdpdGggSFQyMC9IVDQwIG1vZGUKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBzdGFJZDogc3RhdGlvbiBpZAorICogQG1hY0FkZHJTVEE6IHN0YXRpb24gTUFDIGFkZHJlc3MKKyAqIEBjaGFubmVsX3R5cGU6IGNoYW5uZWwgdHlwZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gbm90aWZpZXMgRlcgd2l0aCBIVDIwL0hUNDAgbW9kZQorICoKKyAqIFJldHVybjogMCBpZiBzdWNjZXNzZnVsLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK2ludCBoZGRfd2xhbl9zZXRfaHQyMDQwX21vZGUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgdWludDE2X3Qgc3RhSWQsCisJCQkgICAgIHN0cnVjdCBjZGZfbWFjX2FkZHIgbWFjQWRkclNUQSwgaW50IGNoYW5uZWxfdHlwZSkKK3sKKwlpbnQgc3RhdHVzOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gTlVMTDsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmICghaGRkX2N0eC0+aEhhbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljZGZfc3RhdHVzID0gc21lX25vdGlmeV9odDIwNDBfbW9kZShoZGRfY3R4LT5oSGFsLCBzdGFJZCwgbWFjQWRkclNUQSwKKwkJCQkJICAgIGFkYXB0ZXItPnNlc3Npb25JZCwgY2hhbm5lbF90eXBlKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsICJGYWlsIHRvIHNlbmQgbm90aWZpY2F0aW9uIHdpdGggaHQyMDQwIG1vZGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoqCisgKiBoZGRfd2xhbl9ub3RpZnlfbW9kZW1fcG93ZXJfc3RhdGUoKSAtIG5vdGlmeSBGVyB3aXRoIG1vZGVtIHBvd2VyIHN0YXR1cworICogQHN0YXRlOiBzdGF0ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gbm90aWZpZXMgRlcgd2l0aCBtb2RlbSBwb3dlciBzdGF0dXMKKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2Vzc2Z1bCwgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitpbnQgaGRkX3dsYW5fbm90aWZ5X21vZGVtX3Bvd2VyX3N0YXRlKGludCBzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCisJaGRkX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmICghaGRkX2N0eC0+aEhhbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljZGZfc3RhdHVzID0gc21lX25vdGlmeV9tb2RlbV9wb3dlcl9zdGF0ZShoZGRfY3R4LT5oSGFsLCBzdGF0ZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIkZhaWwgdG8gc2VuZCBub3RpZmljYXRpb24gd2l0aCBtb2RlbSBwb3dlciBzdGF0ZSAlZCIsCisJCSAgICAgICBzdGF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgorICogaGRkX3Bvc3RfY2RzX2VuYWJsZV9jb25maWcoKSAtIEhERCBwb3N0IGNkcyBzdGFydCBjb25maWcgaGVscGVyCisgKiBAYWRhcHRlciAtIFBvaW50ZXIgdG8gdGhlIEhERAorICoKKyAqIFJldHVybjogTm9uZQorICovCitDREZfU1RBVFVTIGhkZF9wb3N0X2Nkc19lbmFibGVfY29uZmlnKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1czsKKworCS8qCisJICogU2VuZCByZWFkeSBpbmRpY2F0aW9uIHRvIHRoZSBIREQuICBUaGlzIHdpbGwga2ljayBvZmYgdGhlIE1BQworCSAqIGludG8gYSAncnVubmluZycgc3RhdGUgYW5kIHNob3VsZCBraWNrIG9mZiBhbiBpbml0aWFsIHNjYW4uCisJICovCisJY2RmX3JldF9zdGF0dXMgPSBzbWVfaGRkX3JlYWR5X2luZChoZGRfY3R4LT5oSGFsKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfcmV0X3N0YXR1cykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKAorCQkJICAic21lX2hkZF9yZWFkeV9pbmQoKSBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAlMDhkIFt4JTA4eF0iCisJCQkgKSwKKwkJICAgICAgIGNkZl9yZXRfc3RhdHVzLCBjZGZfcmV0X3N0YXR1cyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiB3YWtlIGxvY2sgQVBJcyBmb3IgSEREICovCit2b2lkIGhkZF9wcmV2ZW50X3N1c3BlbmQodWludDMyX3QgcmVhc29uKQoreworCWNkZl93YWtlX2xvY2tfYWNxdWlyZSgmd2xhbl93YWtlX2xvY2ssIHJlYXNvbik7Cit9CisKK3ZvaWQgaGRkX2FsbG93X3N1c3BlbmQodWludDMyX3QgcmVhc29uKQoreworCWNkZl93YWtlX2xvY2tfcmVsZWFzZSgmd2xhbl93YWtlX2xvY2ssIHJlYXNvbik7Cit9CisKK3ZvaWQgaGRkX3ByZXZlbnRfc3VzcGVuZF90aW1lb3V0KHVpbnQzMl90IHRpbWVvdXQsIHVpbnQzMl90IHJlYXNvbikKK3sKKwljZGZfd2FrZV9sb2NrX3RpbWVvdXRfYWNxdWlyZSgmd2xhbl93YWtlX2xvY2ssIHRpbWVvdXQsIHJlYXNvbik7Cit9CisKKy8qKgorICogaGRkX2V4Y2hhbmdlX3ZlcnNpb25fYW5kX2NhcHMoKSAtIGV4Y2hhbmdlIHZlcnNpb24gYW5kIGNhcGFiaWxpdHkgd2l0aCB0YXJnZXQKKyAqIEBoZGRfY3R4OglQb2ludGVyIHRvIEhERCBjb250ZXh0CisgKgorICogVGhpcyBpcyB0aGUgSEREIGZ1bmN0aW9uIHRvIGV4Y2hhbmdlIHZlcnNpb24gYW5kIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24KKyAqIGJldHdlZW4gSG9zdCBhbmQgVGFyZ2V0CisgKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIHJlcG9ydGVkIHZlcnNpb24gb2YgRlcuCisgKiBJdCBhbHNvIGZpbmRzIHRoZSB2ZXJzaW9uIG9mIHRhcmdldCBoZWFkZXJzIHVzZWQgdG8gY29tcGlsZSB0aGUgaG9zdDsKKyAqIEl0IGNvbXBhcmVzIHRoZSBhYm92ZSB0d28gYW5kIHByaW50cyBhIHdhcm5pbmcgaWYgdGhleSBhcmUgZGlmZmVyZW50OworICogSXQgZ2V0cyB0aGUgU1cgYW5kIEhXIHZlcnNpb24gc3RyaW5nOworICogRmluYWxseSwgaXQgZXhjaGFuZ2VzIGNhcGFiaWxpdGllcyBiZXR3ZWVuIGhvc3QgYW5kIHRhcmdldCBpLmUuIGhvc3QKKyAqIGFuZCB0YXJnZXQgZXhjaGFuZ2UgYSBtc2cgaW5kaWNhdGluZyB0aGUgZmVhdHVyZXMgdGhleSBzdXBwb3J0IHRocm91Z2ggYQorICogYml0bWFwCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgaGRkX2V4Y2hhbmdlX3ZlcnNpb25fYW5kX2NhcHMoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKworCXRTaXJWZXJzaW9uVHlwZSB2ZXJzaW9uQ29tcGlsZWQ7CisJdFNpclZlcnNpb25UeXBlIHZlcnNpb25SZXBvcnRlZDsKKwl0U2lyVmVyc2lvblN0cmluZyB2ZXJzaW9uU3RyaW5nOworCXVpbnQ4X3QgZndGZWF0Q2Fwc01zZ1N1cHBvcnRlZCA9IDA7CisJQ0RGX1NUQVRVUyB2c3RhdHVzOworCisJbWVtc2V0KCZ2ZXJzaW9uQ29tcGlsZWQsIDAsIHNpemVvZih2ZXJzaW9uQ29tcGlsZWQpKTsKKwltZW1zZXQoJnZlcnNpb25SZXBvcnRlZCwgMCwgc2l6ZW9mKHZlcnNpb25SZXBvcnRlZCkpOworCisJLyogcmV0cmlldmUgYW5kIGRpc3BsYXkgV0NOU1MgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworCWRvIHsKKworCQl2c3RhdHVzID0gc21lX2dldF93Y25zc193bGFuX2NvbXBpbGVkX3ZlcnNpb24oaGRkX2N0eC0+aEhhbCwKKwkJCQkJCQkgICAgICAmdmVyc2lvbkNvbXBpbGVkKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1ModnN0YXR1cykpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoCisJCQkJICAidW5hYmxlIHRvIHJldHJpZXZlIFdDTlNTIFdMQU4gY29tcGlsZWQgdmVyc2lvbiIKKwkJCQkgKSk7CisJCQlicmVhazsKKwkJfQorCisJCXZzdGF0dXMgPSBzbWVfZ2V0X3djbnNzX3dsYW5fcmVwb3J0ZWRfdmVyc2lvbihoZGRfY3R4LT5oSGFsLAorCQkJCQkJCSAgICAgICZ2ZXJzaW9uUmVwb3J0ZWQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyh2c3RhdHVzKSkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICAgICBGTCgKKwkJCQkgICJ1bmFibGUgdG8gcmV0cmlldmUgV0NOU1MgV0xBTiByZXBvcnRlZCB2ZXJzaW9uIgorCQkJCSApKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCh2ZXJzaW9uQ29tcGlsZWQubWFqb3IgIT0gdmVyc2lvblJlcG9ydGVkLm1ham9yKSB8fAorCQkgICAgKHZlcnNpb25Db21waWxlZC5taW5vciAhPSB2ZXJzaW9uUmVwb3J0ZWQubWlub3IpIHx8CisJCSAgICAodmVyc2lvbkNvbXBpbGVkLnZlcnNpb24gIT0gdmVyc2lvblJlcG9ydGVkLnZlcnNpb24pIHx8CisJCSAgICAodmVyc2lvbkNvbXBpbGVkLnJldmlzaW9uICE9IHZlcnNpb25SZXBvcnRlZC5yZXZpc2lvbikpIHsKKwkJCXByX2VycigiJXM6IFdDTlNTIFdMQU4gVmVyc2lvbiAldS4ldS4ldS4ldSwgIgorCQkJICAgICAgICJIb3N0IGV4cGVjdGVkICV1LiV1LiV1LiV1XG4iLAorCQkJICAgICAgIFdMQU5fTU9EVUxFX05BTUUsCisJCQkgICAgICAgKGludCl2ZXJzaW9uUmVwb3J0ZWQubWFqb3IsCisJCQkgICAgICAgKGludCl2ZXJzaW9uUmVwb3J0ZWQubWlub3IsCisJCQkgICAgICAgKGludCl2ZXJzaW9uUmVwb3J0ZWQudmVyc2lvbiwKKwkJCSAgICAgICAoaW50KXZlcnNpb25SZXBvcnRlZC5yZXZpc2lvbiwKKwkJCSAgICAgICAoaW50KXZlcnNpb25Db21waWxlZC5tYWpvciwKKwkJCSAgICAgICAoaW50KXZlcnNpb25Db21waWxlZC5taW5vciwKKwkJCSAgICAgICAoaW50KXZlcnNpb25Db21waWxlZC52ZXJzaW9uLAorCQkJICAgICAgIChpbnQpdmVyc2lvbkNvbXBpbGVkLnJldmlzaW9uKTsKKwkJfSBlbHNlIHsKKwkJCXByX2luZm8oIiVzOiBXQ05TUyBXTEFOIHZlcnNpb24gJXUuJXUuJXUuJXVcbiIsCisJCQkJV0xBTl9NT0RVTEVfTkFNRSwKKwkJCQkoaW50KXZlcnNpb25SZXBvcnRlZC5tYWpvciwKKwkJCQkoaW50KXZlcnNpb25SZXBvcnRlZC5taW5vciwKKwkJCQkoaW50KXZlcnNpb25SZXBvcnRlZC52ZXJzaW9uLAorCQkJCShpbnQpdmVyc2lvblJlcG9ydGVkLnJldmlzaW9uKTsKKwkJfQorCisJCXZzdGF0dXMgPSBzbWVfZ2V0X3djbnNzX3NvZnR3YXJlX3ZlcnNpb24oaGRkX2N0eC0+aEhhbCwKKwkJCQkJCQkgdmVyc2lvblN0cmluZywKKwkJCQkJCQkgc2l6ZW9mKHZlcnNpb25TdHJpbmcpKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1ModnN0YXR1cykpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoCisJCQkJICAidW5hYmxlIHRvIHJldHJpZXZlIFdDTlNTIHNvZnR3YXJlIHZlcnNpb24gc3RyaW5nIgorCQkJCSApKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfaW5mbygiJXM6IFdDTlNTIHNvZnR3YXJlIHZlcnNpb24gJXNcbiIsCisJCQlXTEFOX01PRFVMRV9OQU1FLCB2ZXJzaW9uU3RyaW5nKTsKKworCQl2c3RhdHVzID0gc21lX2dldF93Y25zc19oYXJkd2FyZV92ZXJzaW9uKGhkZF9jdHgtPmhIYWwsCisJCQkJCQkJIHZlcnNpb25TdHJpbmcsCisJCQkJCQkJIHNpemVvZih2ZXJzaW9uU3RyaW5nKSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHZzdGF0dXMpKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgICAgIEZMKAorCQkJCSAgInVuYWJsZSB0byByZXRyaWV2ZSBXQ05TUyBoYXJkd2FyZSB2ZXJzaW9uIHN0cmluZyIKKwkJCQkgKSk7CisJCQlicmVhazsKKwkJfQorCisJCXByX2luZm8oIiVzOiBXQ05TUyBoYXJkd2FyZSB2ZXJzaW9uICVzXG4iLAorCQkJV0xBTl9NT0RVTEVfTkFNRSwgdmVyc2lvblN0cmluZyk7CisKKwkJLyoKKwkJICogMS5DaGVjayBpZiBGVyB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiAwLjEuMS4wLiBPbmx5IHRoZW4KKwkJICogc2VuZCBob3N0LUZXIGNhcGFiaWxpdHkgZXhjaGFuZ2UgbWVzc2FnZQorCQkgKiAyLkhvc3QtRlcgY2FwYWJpbGl0eSBleGNoYW5nZSBtZXNzYWdlICBpcyBvbmx5IHByZXNlbnQgb24KKwkJICogdGFyZ2V0IDEuMSBzbyBzZW5kIHRoZSBtZXNzYWdlIG9ubHkgaWYgaXQgdGhlIHRhcmdldCBpcyAxLjEKKwkJICogbWlub3IgbnVtYmVycyBmb3IgZGlmZmVyZW50IHRhcmdldCBicmFuY2hlczoKKwkJICogMCAtPiAoMS4wKU1haW5saW5lIEJ1aWxkCisJCSAqIDEgLT4gKDEuMSlNYWlubGluZSBCdWlsZAorCQkgKiAyLT4oMS4wNCkgU3RhYmlsaXR5IEJ1aWxkCisJCSAqLworCQlpZiAoKCh2ZXJzaW9uUmVwb3J0ZWQubWFqb3IgPiAwKSB8fCAodmVyc2lvblJlcG9ydGVkLm1pbm9yID4gMSkKKwkJICAgICB8fCAoKHZlcnNpb25SZXBvcnRlZC5taW5vciA+PSAxKQorCQkJICYmICh2ZXJzaW9uUmVwb3J0ZWQudmVyc2lvbiA+PSAxKSkpCisJCSAgICAmJiAoKHZlcnNpb25SZXBvcnRlZC5tYWpvciA9PSAxKQorCQkJJiYgKHZlcnNpb25SZXBvcnRlZC5taW5vciA+PSAxKSkpCisJCQlmd0ZlYXRDYXBzTXNnU3VwcG9ydGVkID0gMTsKKworCQlpZiAoZndGZWF0Q2Fwc01zZ1N1cHBvcnRlZCkgeworCQkJLyoKKwkJCSAqIEluZGljYXRlIGlmIElCU1MgaGVhcnRiZWF0IG1vbml0b3JpbmcgbmVlZHMgdG8gYmUKKwkJCSAqIG9mZmxvYWRlZAorCQkJICovCisJCQlpZiAoIWhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlSWJzc0hlYXJ0QmVhdE9mZmxvYWQpIHsKKwkJCQlzbWVfZGlzYWJsZV9mZWF0dXJlX2NhcGFibGl0eQorCQkJCQkoSUJTU19IRUFSVEJFQVRfT0ZGTE9BRCk7CisJCQl9CisKKwkJCXNtZV9mZWF0dXJlX2NhcHNfZXhjaGFuZ2UoaGRkX2N0eC0+aEhhbCk7CisJCX0KKworCX0gd2hpbGUgKDApOworCit9CisKKy8qIEluaXRpYWxpemUgY2hhbm5lbCBsaXN0IGluIHNtZSBiYXNlZCBvbiB0aGUgY291bnRyeSBjb2RlICovCitDREZfU1RBVFVTIGhkZF9zZXRfc21lX2NoYW5fbGlzdChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXJldHVybiBzbWVfaW5pdF9jaGFuX2xpc3QoaGRkX2N0eC0+aEhhbCwgaGRkX2N0eC0+cmVnLmFscGhhMiwKKwkJCQkgIGhkZF9jdHgtPnJlZy5jY19zcmMpOworfQorCisvKioKKyAqIGhkZF9pc181Z19zdXBwb3J0ZWQoKSAtIGNoZWNrIGlmIGhhcmR3YXJlIHN1cHBvcnRzIDVHSHoKKyAqIEBoZGRfY3R4OglQb2ludGVyIHRvIHRoZSBoZGQgY29udGV4dAorICoKKyAqIEhERCBmdW5jdGlvbiB0byBrbm93IGlmIGhhcmR3YXJlIHN1cHBvcnRzIDVHSHoKKyAqCisgKiBSZXR1cm46ICB0cnVlIGlmIGhhcmR3YXJlIHN1cHBvcnRzIDVHSHoKKyAqLworYm9vbCBoZGRfaXNfNWdfc3VwcG9ydGVkKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJLyoKKwkgKiBJZiB3Y25zc193bGFuX2lyaXNfeG9fbW9kZSgpIHJldHVybnMgV0NOU1NfWE9fNDhNSFooMSk7CisJICogdGhlbiBoYXJkd2FyZSBzdXBwb3J0IDVHaHouCisJICovCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTIHdsYW5faGRkX3JlZ3VsYXRvcnlfaW5pdChoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXN0cnVjdCB3aXBoeSAqd2lwaHk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwl3aXBoeSA9IGhkZF9jdHgtPndpcGh5OworCisJLyoKKwkgKiBUaGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBpbgorCSAqIHdpcGh5IG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGJlZm9yZSB3aXBoeSByZWdpc3RyYXRpb24KKwkgKi8KKwlzdGF0dXMgPSBjZHNfcmVndWxhdG9yeV9pbml0KCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgRkwoImNkc19pbml0X3dpcGh5IGZhaWxlZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDExLCAwKSkKKwl3aXBoeS0+d293bGFuID0gJndvd2xhbl9zdXBwb3J0X3JlZ19pbml0OworI2Vsc2UKKwl3aXBoeS0+d293bGFuLmZsYWdzID0gV0lQSFlfV09XTEFOX0FOWSB8CisJCQkgICAgICBXSVBIWV9XT1dMQU5fTUFHSUNfUEtUIHwKKwkJCSAgICAgIFdJUEhZX1dPV0xBTl9ESVNDT05ORUNUIHwKKwkJCSAgICAgIFdJUEhZX1dPV0xBTl9TVVBQT1JUU19HVEtfUkVLRVkgfAorCQkJICAgICAgV0lQSFlfV09XTEFOX0dUS19SRUtFWV9GQUlMVVJFIHwKKwkJCSAgICAgIFdJUEhZX1dPV0xBTl9FQVBfSURFTlRJVFlfUkVRIHwKKwkJCSAgICAgIFdJUEhZX1dPV0xBTl80V0FZX0hBTkRTSEFLRSB8CisJCQkgICAgICBXSVBIWV9XT1dMQU5fUkZLSUxMX1JFTEVBU0U7CisKKwl3aXBoeS0+d293bGFuLm5fcGF0dGVybnMgPSAoV09XX01BWF9GSUxURVJfTElTVFMgKgorCQkJCSAgICBXT1dfTUFYX0ZJTFRFUlNfUEVSX0xJU1QpOworCXdpcGh5LT53b3dsYW4ucGF0dGVybl9taW5fbGVuID0gV09XX01JTl9QQVRURVJOX1NJWkU7CisJd2lwaHktPndvd2xhbi5wYXR0ZXJuX21heF9sZW4gPSBXT1dfTUFYX1BBVFRFUk5fU0laRTsKKyNlbmRpZgorCisJLyogcmVnaXN0cmF0aW9uIG9mIHdpcGh5IGRldiB3aXRoIGNmZzgwMjExICovCisJaWYgKDAgPiB3bGFuX2hkZF9jZmc4MDIxMV9yZWdpc3Rlcih3aXBoeSkpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIndpcGh5IHJlZ2lzdGVyIGZhaWxlZCIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIE1TTV9QTEFURk9STQordm9pZCBoZGRfY25zc19yZXF1ZXN0X2J1c19iYW5kd2lkdGgoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwkJCQkgICAgdWludDY0X3QgdHhfcGFja2V0cywgdWludDY0X3QgcnhfcGFja2V0cykKK3sKKyNpZmRlZiBDT05GSUdfQ05TUworCXVpbnQ2NF90IHRvdGFsID0gdHhfcGFja2V0cyArIHJ4X3BhY2tldHM7CisJZW51bSBjbnNzX2J1c193aWR0aF90eXBlIG5leHRfdm90ZV9sZXZlbCA9IENOU1NfQlVTX1dJRFRIX05PTkU7CisKKwl1aW50NjRfdCB0ZW1wX3J4ID0gKHJ4X3BhY2tldHMgKyBoZGRfY3R4LT5wcmV2X3J4KSAvIDI7CisJZW51bSBjbnNzX2J1c193aWR0aF90eXBlIG5leHRfcnhfbGV2ZWwgPSBDTlNTX0JVU19XSURUSF9OT05FOworCWlmICh0b3RhbCA+IGhkZF9jdHgtPmNvbmZpZy0+YnVzQmFuZHdpZHRoSGlnaFRocmVzaG9sZCkKKwkJbmV4dF92b3RlX2xldmVsID0gQ05TU19CVVNfV0lEVEhfSElHSDsKKwllbHNlIGlmICh0b3RhbCA+IGhkZF9jdHgtPmNvbmZpZy0+YnVzQmFuZHdpZHRoTWVkaXVtVGhyZXNob2xkKQorCQluZXh0X3ZvdGVfbGV2ZWwgPSBDTlNTX0JVU19XSURUSF9NRURJVU07CisJZWxzZQorCQluZXh0X3ZvdGVfbGV2ZWwgPSBDTlNTX0JVU19XSURUSF9MT1c7CisKKwloZGRfY3R4LT5oZGRfdHhyeF9oaXN0W2hkZF9jdHgtPmhkZF90eHJ4X2hpc3RfaWR4XS5uZXh0X3ZvdGVfbGV2ZWwKKwkJCQkJCQkgICA9IG5leHRfdm90ZV9sZXZlbDsKKworCWlmIChoZGRfY3R4LT5jdXJfdm90ZV9sZXZlbCAhPSBuZXh0X3ZvdGVfbGV2ZWwpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJICAgICAgIEZMKAorCQkJICAidHJpZ2dlciBsZXZlbCAlZCwgdHhfcGFja2V0czogJWxsZCwgcnhfcGFja2V0czogJWxsZCIKKwkJCSApLAorCQkgICAgICAgbmV4dF92b3RlX2xldmVsLCB0eF9wYWNrZXRzLCByeF9wYWNrZXRzKTsKKwkJaGRkX2N0eC0+Y3VyX3ZvdGVfbGV2ZWwgPSBuZXh0X3ZvdGVfbGV2ZWw7CisJCWNuc3NfcmVxdWVzdF9idXNfYmFuZHdpZHRoKG5leHRfdm90ZV9sZXZlbCk7CisJfQorCWhkZF9jdHgtPnByZXZfcnggPSByeF9wYWNrZXRzOworCWlmICh0ZW1wX3J4ID4gaGRkX2N0eC0+Y29uZmlnLT50Y3BEZWxhY2tUaHJlc2hvbGRIaWdoKQorCQluZXh0X3J4X2xldmVsID0gQ05TU19CVVNfV0lEVEhfSElHSDsKKwllbHNlCisJCW5leHRfcnhfbGV2ZWwgPSBDTlNTX0JVU19XSURUSF9MT1c7CisKKwloZGRfY3R4LT5oZGRfdHhyeF9oaXN0W2hkZF9jdHgtPmhkZF90eHJ4X2hpc3RfaWR4XS5uZXh0X3J4X2xldmVsCisJCQkJCQkJCT0gbmV4dF9yeF9sZXZlbDsKKworCWlmIChoZGRfY3R4LT5jdXJfcnhfbGV2ZWwgIT0gbmV4dF9yeF9sZXZlbCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkgICAgICAgRkwoIlRDUCBERUxBQ0sgdHJpZ2dlciBsZXZlbCAlZCwgYXZlcmFnZV9yeDogJWxsdSIpLAorCQkgICAgICAgbmV4dF9yeF9sZXZlbCwgdGVtcF9yeCk7CisJCWhkZF9jdHgtPmN1cl9yeF9sZXZlbCA9IG5leHRfcnhfbGV2ZWw7CisJCXdsYW5faGRkX3NlbmRfc3ZjX25saW5rX21zZyhXTEFOX1NWQ19XTEFOX1RQX0lORCwKKwkJCQkJICAgICZuZXh0X3J4X2xldmVsLAorCQkJCQkgICAgc2l6ZW9mKG5leHRfcnhfbGV2ZWwpKTsKKwl9CisKKwloZGRfY3R4LT5oZGRfdHhyeF9oaXN0X2lkeCsrOworCWhkZF9jdHgtPmhkZF90eHJ4X2hpc3RfaWR4ICY9IE5VTV9UWF9SWF9ISVNUT0dSQU1fTUFTSzsKKyNlbmRpZgorfQorCisjZGVmaW5lIEhERF9CV19HRVRfRElGRihfeCwgX3kpICh1bnNpZ25lZCBsb25nKSgoVUxPTkdfTUFYIC0gKF95KSkgKyAoX3gpICsgMSkKK3N0YXRpYyB2b2lkIGhkZF9idXNfYndfY29tcHV0ZV9jYmsodm9pZCAqcHJpdikKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gKGhkZF9jb250ZXh0X3QgKikgcHJpdjsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gTlVMTDsKKwl1aW50NjRfdCB0eF9wYWNrZXRzID0gMCwgcnhfcGFja2V0cyA9IDA7CisJdWludDY0X3QgdG90YWxfdHggPSAwLCB0b3RhbF9yeCA9IDA7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJOb2RlID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IDA7CisJYm9vbCBjb25uZWN0ZWQgPSBmYWxzZTsKKwl1aW50MzJfdCBpcGFfdHhfcGFja2V0cyA9IDAsIGlwYV9yeF9wYWNrZXRzID0gMDsKKworCWZvciAoc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKGhkZF9jdHgsICZhZGFwdGVyTm9kZSk7CisJICAgICBOVUxMICE9IGFkYXB0ZXJOb2RlICYmIENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXM7CisJICAgICBzdGF0dXMgPQorCQkgICAgIGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsIGFkYXB0ZXJOb2RlLCAmYWRhcHRlck5vZGUpKSB7CisKKwkJaWYgKGFkYXB0ZXJOb2RlLT5wQWRhcHRlciA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWFkYXB0ZXIgPSBhZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisKKwkJaWYgKChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OIHx8CisJCSAgICAgYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0NMSUVOVCkgJiYKKwkJICAgIFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIoYWRhcHRlciktPmNvbm5faW5mby5jb25uU3RhdGUKKwkJICAgICE9IGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCkgeworCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQIHx8CisJCSAgICAgYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKSAmJgorCQkgICAgV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIoYWRhcHRlciktPmJBcEFjdGl2ZSA9PSBmYWxzZSkgeworCisJCQljb250aW51ZTsKKwkJfQorCisJCXR4X3BhY2tldHMgKz0gSEREX0JXX0dFVF9ESUZGKGFkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHMsCisJCQkJCSAgICAgIGFkYXB0ZXItPnByZXZfdHhfcGFja2V0cyk7CisJCXJ4X3BhY2tldHMgKz0gSEREX0JXX0dFVF9ESUZGKGFkYXB0ZXItPnN0YXRzLnJ4X3BhY2tldHMsCisJCQkJCSAgICAgIGFkYXB0ZXItPnByZXZfcnhfcGFja2V0cyk7CisKKwkJdG90YWxfcnggKz0gYWRhcHRlci0+c3RhdHMucnhfcGFja2V0czsKKwkJdG90YWxfdHggKz0gYWRhcHRlci0+c3RhdHMudHhfcGFja2V0czsKKworCQlzcGluX2xvY2tfYmgoJmhkZF9jdHgtPmJ1c19id19sb2NrKTsKKwkJYWRhcHRlci0+cHJldl90eF9wYWNrZXRzID0gYWRhcHRlci0+c3RhdHMudHhfcGFja2V0czsKKwkJYWRhcHRlci0+cHJldl9yeF9wYWNrZXRzID0gYWRhcHRlci0+c3RhdHMucnhfcGFja2V0czsKKwkJc3Bpbl91bmxvY2tfYmgoJmhkZF9jdHgtPmJ1c19id19sb2NrKTsKKwkJY29ubmVjdGVkID0gdHJ1ZTsKKwl9CisKKwloZGRfY3R4LT5oZGRfdHhyeF9oaXN0W2hkZF9jdHgtPmhkZF90eHJ4X2hpc3RfaWR4XS50b3RhbF9yeCA9IHRvdGFsX3J4OworCWhkZF9jdHgtPmhkZF90eHJ4X2hpc3RbaGRkX2N0eC0+aGRkX3R4cnhfaGlzdF9pZHhdLnRvdGFsX3R4ID0gdG90YWxfdHg7CisJaGRkX2N0eC0+aGRkX3R4cnhfaGlzdFtoZGRfY3R4LT5oZGRfdHhyeF9oaXN0X2lkeF0uaW50ZXJ2YWxfcnggPQorCQkJCQkJCQlyeF9wYWNrZXRzOworCWhkZF9jdHgtPmhkZF90eHJ4X2hpc3RbaGRkX2N0eC0+aGRkX3R4cnhfaGlzdF9pZHhdLmludGVydmFsX3R4ID0KKwkJCQkJCQkJdHhfcGFja2V0czsKKworCWhkZF9pcGFfdWNfc3RhdF9xdWVyeShoZGRfY3R4LCAmaXBhX3R4X3BhY2tldHMsICZpcGFfcnhfcGFja2V0cyk7CisJdHhfcGFja2V0cyArPSAodWludDY0X3QpaXBhX3R4X3BhY2tldHM7CisJcnhfcGFja2V0cyArPSAodWludDY0X3QpaXBhX3J4X3BhY2tldHM7CisKKwlpZiAoIWNvbm5lY3RlZCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoImJ1cyBiYW5kd2lkdGggdGltZXIgcnVubmluZyBpbiBkaXNjb25uZWN0ZWQgc3RhdGUiKSk7CisJCXJldHVybjsKKwl9CisKKwloZGRfY25zc19yZXF1ZXN0X2J1c19iYW5kd2lkdGgoaGRkX2N0eCwgdHhfcGFja2V0cywgcnhfcGFja2V0cyk7CisKKwloZGRfaXBhX3NldF9wZXJmX2xldmVsKGhkZF9jdHgsIHR4X3BhY2tldHMsIHJ4X3BhY2tldHMpOworCWhkZF9pcGFfdWNfc3RhdF9yZXF1ZXN0KGFkYXB0ZXIsIDIpOworCisJY2RmX21jX3RpbWVyX3N0YXJ0KCZoZGRfY3R4LT5idXNfYndfdGltZXIsCisJCQkgICBoZGRfY3R4LT5jb25maWctPmJ1c0JhbmR3aWR0aENvbXB1dGVJbnRlcnZhbCk7Cit9CisjZW5kaWYKKworLyoqCisgKiB3bGFuX2hkZF9kaXNwbGF5X3R4X3J4X2hpc3RvZ3JhbSgpIC0gZGlzcGxheSB0eCByeCBoaXN0b2dyYW0KKyAqIEBoZGRfY3R4OiBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdsYW5faGRkX2Rpc3BsYXlfdHhfcnhfaGlzdG9ncmFtKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJaW50IGk7CisKKyNpZmRlZiBNU01fUExBVEZPUk0KKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiQlcgSW50ZXJ2YWw6ICVkIGN1cnJfaW5kZXggJWQiLAorCQloZGRfY3R4LT5jb25maWctPmJ1c0JhbmR3aWR0aENvbXB1dGVJbnRlcnZhbCwKKwkJaGRkX2N0eC0+aGRkX3R4cnhfaGlzdF9pZHgpOworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSJCVyBIaWdoIFRIOiAlZCBCVyBNZWQgVEg6ICVkIEJXIExvdyBUSDogJWQiLAorCQloZGRfY3R4LT5jb25maWctPmJ1c0JhbmR3aWR0aEhpZ2hUaHJlc2hvbGQsCisJCWhkZF9jdHgtPmNvbmZpZy0+YnVzQmFuZHdpZHRoTWVkaXVtVGhyZXNob2xkLAorCQloZGRfY3R4LT5jb25maWctPmJ1c0JhbmR3aWR0aExvd1RocmVzaG9sZCk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIlRDUCBERUwgSGlnaCBUSDogJWQgVENQIERFTCBMb3cgVEg6ICVkIiwKKwkJaGRkX2N0eC0+Y29uZmlnLT50Y3BEZWxhY2tUaHJlc2hvbGRIaWdoLAorCQloZGRfY3R4LT5jb25maWctPnRjcERlbGFja1RocmVzaG9sZExvdyk7CisjZW5kaWYKKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICJpbmRleCwgdG90YWxfcngsIGludGVydmFsX3J4LCIKKwkJInRvdGFsX3R4LCBpbnRlcnZhbF90eCwgbmV4dF92b3RlX2xldmVsLCBuZXh0X3J4X2xldmVsIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1JYX0hJU1RPR1JBTTsgaSsrKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiJWQ6ICVsbHUsICVsbHUsICVsbHUsICVsbHUsICVkLCAlZCIsCisJCQlpLCBoZGRfY3R4LT5oZGRfdHhyeF9oaXN0W2ldLnRvdGFsX3J4LAorCQkJaGRkX2N0eC0+aGRkX3R4cnhfaGlzdFtpXS5pbnRlcnZhbF9yeCwKKwkJCWhkZF9jdHgtPmhkZF90eHJ4X2hpc3RbaV0udG90YWxfdHgsCisJCQloZGRfY3R4LT5oZGRfdHhyeF9oaXN0W2ldLmludGVydmFsX3R4LAorCQkJaGRkX2N0eC0+aGRkX3R4cnhfaGlzdFtpXS5uZXh0X3ZvdGVfbGV2ZWwsCisJCQloZGRfY3R4LT5oZGRfdHhyeF9oaXN0W2ldLm5leHRfcnhfbGV2ZWwpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2xlYXJfdHhfcnhfaGlzdG9ncmFtKCkgLSBjbGVhciB0eCByeCBoaXN0b2dyYW0KKyAqIEBoZGRfY3R4OiBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdsYW5faGRkX2NsZWFyX3R4X3J4X2hpc3RvZ3JhbShoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCWhkZF9jdHgtPmhkZF90eHJ4X2hpc3RfaWR4ID0gMDsKKwljZGZfbWVtX3plcm8oaGRkX2N0eC0+aGRkX3R4cnhfaGlzdCwgc2l6ZW9mKGhkZF9jdHgtPmhkZF90eHJ4X2hpc3QpKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9kaXNwbGF5X25ldGlmX3F1ZXVlX2hpc3RvcnkoKSAtIGRpc3BsYXkgbmV0aWYgcXVldWUgb3BlcmF0aW9uIGhpc3RvcnkKKyAqIEBwSGRkQ3R4OiBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdsYW5faGRkX2Rpc3BsYXlfbmV0aWZfcXVldWVfaGlzdG9yeShoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJfbm9kZSA9IE5VTEwsICpuZXh0ID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlpbnQgaTsKKworCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlcl9ub2RlKTsKKwl3aGlsZSAoTlVMTCAhPSBhZGFwdGVyX25vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlhZGFwdGVyID0gYWRhcHRlcl9ub2RlLT5wQWRhcHRlcjsKKworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJIlNlc3Npb25faWQgJWQgZGV2aWNlIG1vZGUgJWQgY3VycmVudCBpbmRleCAlZCIsCisJCQlhZGFwdGVyLT5zZXNzaW9uSWQsIGFkYXB0ZXItPmRldmljZV9tb2RlLAorCQkJYWRhcHRlci0+aGlzdG9yeV9pbmRleCk7CisKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJOZXRpZiBxdWV1ZSBvcGVyYXRpb24gc3RhdGlzdGljczoiKTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJDdXJyZW50IHBhdXNlX21hcCB2YWx1ZSAleCIsIGFkYXB0ZXItPnBhdXNlX21hcCk7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiICByZWFzb25fdHlwZTogcGF1c2VfY250OiB1bnBhdXNlX2NudCIpOworCisJCWZvciAoaSA9IDA7IGkgPCBXTEFOX1JFQVNPTl9UWVBFX01BWDsgaSsrKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSIlczogJWQ6ICVkIiwKKwkJCQloZGRfcmVhc29uX3R5cGVfdG9fc3RyaW5nKGkpLAorCQkJCWFkYXB0ZXItPnF1ZXVlX29wZXJfc3RhdHNbaV0ucGF1c2VfY291bnQsCisJCQkJYWRhcHRlci0+cXVldWVfb3Blcl9zdGF0c1tpXS51bnBhdXNlX2NvdW50KTsKKwkJfQorCisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiTmV0aWYgcXVldWUgb3BlcmF0aW9uIGhpc3Rvcnk6Iik7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiaW5kZXg6IHRpbWU6IGFjdGlvbl90eXBlOiByZWFzb25fdHlwZTogcGF1c2VfbWFwIik7CisKKwkJZm9yIChpID0gMDsgaSA8IFdMQU5fSEREX01BWF9ISVNUT1JZX0VOVFJZOyBpKyspIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIiVkOiAldTogJXM6ICVzOiAleCIsCisJCQkJaSwgY2RmX3N5c3RlbV90aWNrc190b19tc2VjcygKKwkJCQkJYWRhcHRlci0+cXVldWVfb3Blcl9oaXN0b3J5W2ldLnRpbWUpLAorCQkJCWhkZF9hY3Rpb25fdHlwZV90b19zdHJpbmcoCisJCQkJYWRhcHRlci0+cXVldWVfb3Blcl9oaXN0b3J5W2ldLm5ldGlmX2FjdGlvbiksCisJCQkJaGRkX3JlYXNvbl90eXBlX3RvX3N0cmluZygKKwkJCQlhZGFwdGVyLT5xdWV1ZV9vcGVyX2hpc3RvcnlbaV0ubmV0aWZfcmVhc29uKSwKKwkJCQlhZGFwdGVyLT5xdWV1ZV9vcGVyX2hpc3RvcnlbaV0ucGF1c2VfbWFwKTsKKwkJfQorCisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsIGFkYXB0ZXJfbm9kZSwgJm5leHQpOworCQlhZGFwdGVyX25vZGUgPSBuZXh0OworCX0KKworCit9CisKKy8qKgorICogd2xhbl9oZGRfY2xlYXJfbmV0aWZfcXVldWVfaGlzdG9yeSgpIC0gY2xlYXIgbmV0aWYgcXVldWUgb3BlcmF0aW9uIGhpc3RvcnkKKyAqIEBoZGRfY3R4OiBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdsYW5faGRkX2NsZWFyX25ldGlmX3F1ZXVlX2hpc3RvcnkoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gTlVMTDsKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlcl9ub2RlID0gTlVMTCwgKm5leHQgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKGhkZF9jdHgsICZhZGFwdGVyX25vZGUpOworCXdoaWxlIChOVUxMICE9IGFkYXB0ZXJfbm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCWFkYXB0ZXIgPSBhZGFwdGVyX25vZGUtPnBBZGFwdGVyOworCisJCWNkZl9tZW1femVybyhhZGFwdGVyLT5xdWV1ZV9vcGVyX3N0YXRzLAorCQkJCQlzaXplb2YoYWRhcHRlci0+cXVldWVfb3Blcl9zdGF0cykpOworCQljZGZfbWVtX3plcm8oYWRhcHRlci0+cXVldWVfb3Blcl9oaXN0b3J5LAorCQkJCQlzaXplb2YoYWRhcHRlci0+cXVldWVfb3Blcl9oaXN0b3J5KSk7CisKKwkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIoaGRkX2N0eCwgYWRhcHRlcl9ub2RlLCAmbmV4dCk7CisJCWFkYXB0ZXJfbm9kZSA9IG5leHQ7CisJfQorfQorCisvKioKKyAqIGhkZF8xMWRfc2Nhbl9kb25lKCkgLSBjYWxsYmFjayBmb3IgMTFkIHNjYW4gY29tcGxldGlvbiBvZiBmbHVzaGluZyByZXN1bHRzCisgKiBAaGFsSGFuZGxlOglIYWwgaGFuZGxlCisgKiBAcENvbnRleHQ6CVBvaW50ZXIgdG8gdGhlIGNvbnRleHQKKyAqIEBzZXNzaW9uSWQ6CVNlc3Npb24gSUQKKyAqIEBzY2FuSWQ6CVNjYW4gSUQKKyAqIEBzdGF0dXM6CVN0YXR1cworICoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIHdoZW4gMTFkIHNjYW4gaXMgY29tcGxldGVkIHRvIGZsdXNoIG91dAorICogdGhlIHNjYW4gcmVzdWx0cworICoKKyAqIDExZCBzY2FuIGlzIGRvbmUgZHVyaW5nIGRyaXZlciBsb2FkIGFuZCBpcyBhIHBhc3NpdmUgc2NhbiBvbiBhbGwKKyAqIGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLCAxMWQgc2NhbnMgbWF5IGZpbmQgc29tZSBBUHMgb24KKyAqIGZyZXF1ZW5jaWVzIHdoaWNoIGFyZSBmb3JiaWRkZW4gdG8gYmUgdXNlZCBpbiB0aGUgcmVndWxhdG9yeSBkb21haW4KKyAqIHRoZSBkZXZpY2UgaXMgb3BlcmF0aW5nIGluLiBJZiB0aGVzZSBBUHMgYXJlIG5vdGlmaWVkIHRvIHRoZSBzdXBwbGljYW50CisgKiBpdCBtYXkgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlc2UgQVBzLCB0aHVzIGZsdXNoIG91dCBhbGwgdGhlIHNjYW4gcmVzdWx0cworICogd2hpY2ggYXJlIHByZXNlbnQgaW4gU01FIGFmdGVyIDExZCBzY2FuIGlzIGRvbmUuCisgKgorICogUmV0dXJuOiAgQ0RGX1NUQVRVU19TVUNDRVNTCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIGhkZF8xMWRfc2Nhbl9kb25lKHRIYWxIYW5kbGUgaGFsSGFuZGxlLCB2b2lkICpwQ29udGV4dCwKKwkJCQkgICAgdWludDhfdCBzZXNzaW9uSWQsIHVpbnQzMl90IHNjYW5JZCwKKwkJCQkgICAgZUNzclNjYW5TdGF0dXMgc3RhdHVzKQoreworCUVOVEVSKCk7CisKKwlzbWVfc2Nhbl9mbHVzaF9yZXN1bHQoaGFsSGFuZGxlKTsKKworCUVYSVQoKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfT0ZGTE9BRF9QQUNLRVRTCisvKioKKyAqIGhkZF9pbml0X29mZmxvYWRlZF9wYWNrZXRzX2N0eCgpIC0gSW5pdGlhbGl6ZSBvZmZsb2FkIHBhY2tldHMgY29udGV4dAorICogQGhkZF9jdHg6IGhkZCBnbG9iYWwgY29udGV4dAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfaW5pdF9vZmZsb2FkZWRfcGFja2V0c19jdHgoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwl1aW50OF90IGk7CisKKwltdXRleF9pbml0KCZoZGRfY3R4LT5vcF9jdHgub3BfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IE1BWE5VTV9QRVJJT0RJQ19UWF9QVFJOUzsgaSsrKSB7CisJCWhkZF9jdHgtPm9wX2N0eC5vcF90YWJsZVtpXS5yZXF1ZXN0X2lkID0gTUFYX1JFUVVFU1RfSUQ7CisJCWhkZF9jdHgtPm9wX2N0eC5vcF90YWJsZVtpXS5wYXR0ZXJuX2lkID0gaTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgaGRkX2luaXRfb2ZmbG9hZGVkX3BhY2tldHNfY3R4KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7Cit9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorLyoqCisgKiBoZGRfZW5hYmxlX2Zhc3RwYXRoKCkgLSBFbmFibGUgZmFzdHBhdGggaWYgZW5hYmxlZCBpbiBjb25maWcgSU5JCisgKiBAaGRkX2NmZzogaGRkIGNvbmZpZworICogQGNvbnRleHQ6IGxvd2VyIGxheWVyIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2VuYWJsZV9mYXN0cGF0aChzdHJ1Y3QgaGRkX2NvbmZpZyAqaGRkX2NmZywKKwkJCQl2b2lkICpjb250ZXh0KQoreworCWlmIChoZGRfY2ZnLT5mYXN0cGF0aF9lbmFibGUpCisJCWhpZl9lbmFibGVfZmFzdHBhdGgoY29udGV4dCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgaGRkX2VuYWJsZV9mYXN0cGF0aChzdHJ1Y3QgaGRkX2NvbmZpZyAqaGRkX2NmZywKKwkJCQl2b2lkICpjb250ZXh0KQoreworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9DSF9BVk9JRCkgJiYgZGVmaW5lZChDT05GSUdfQ05TUykKKy8qKgorICogaGRkX3NldF90aGVybWFsX2xldmVsX2NiKCkgLSBzZXQgdGhlcm1hbCBsZXZlbCBjYWxsYmFjayBmdW5jdGlvbgorICogQGhkZF9jdHh0OgloZGQgY29udGV4dCBwb2ludGVyCisgKiBAbGV2ZWw6CXRoZXJtYWwgbGV2ZWwKKyAqCisgKiBDaGFuZ2UgSVBBIGRhdGEgcGF0aCB0byBTVyBwYXRoIHdoZW4gdGhlIHRoZXJtYWwgdGhyb3R0bGUgbGV2ZWwgZ3JlYXRlcgorICogdGhhbiAwLCBhbmQgcmVzdG9yZSB0aGUgb3JpZ2luYWwgZGF0YSBwYXRoIHdoZW4gdGhyb3R0bGUgbGV2ZWwgaXMgMAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfc2V0X3RoZXJtYWxfbGV2ZWxfY2IoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgdV9pbnQ4X3QgbGV2ZWwpCit7CisJLyogQ2hhbmdlIElQQSB0byBTVyBwYXRoIHdoZW4gdGhyb3R0bGUgbGV2ZWwgZ3JlYXRlciB0aGFuIDAgKi8KKwlpZiAobGV2ZWwgPiBUSFJPVFRMRV9MRVZFTF8wKQorCQloZGRfaXBhX3NlbmRfbWNjX3NjY19tc2coaGRkX2N0eCwgdHJ1ZSk7CisJZWxzZQorCQkvKiByZXN0b3JlIG9yaWdpbmFsIGNvbmN1cnJlbmN5IG1vZGUgKi8KKwkJaGRkX2lwYV9zZW5kX21jY19zY2NfbXNnKGhkZF9jdHgsIGhkZF9jdHgtPm1jY19tb2RlKTsKK30KKworLyoqCisgKiBoZGRfZmluZF9wcmVmZF9zYWZlX2NobmwoKSAtIGZpbmQgc2FmZSBjaGFubmVsIHdpdGhpbiBwcmVmZXJyZWQgY2hhbm5lbAorICogQGhkZF9jdHh0OgloZGQgY29udGV4dCBwb2ludGVyCisgKiBAYXBfYWRhcHRlcjogaGRkIGhvc3RhcGQgYWRhcHRlciBwb2ludGVyCisgKgorICogVHJ5IHRvIGZpbmQgc2FmZSBjaGFubmVsIHdpdGhpbiBwcmVmZXJyZWQgY2hhbm5lbAorICogSW4gY2FzZSBhdXRvIGNoYW5uZWwgc2VsZWN0aW9uIGVuYWJsZWQKKyAqICAtIFByZWZlcnJlZCBhbmQgc2FmZSBjaGFubmVsIHNob3VsZCBiZSB1c2VkCisgKiAgLSBJZiBubyBvdmVybGFwcGluZywgcHJlZmVycmVkIGNoYW5uZWwgc2hvdWxkIGJlIHVzZWQKKyAqCisgKiBSZXR1cm46IDE6IGZvdW5kIHByZWZlcnJlZCBzYWZlIGNoYW5uZWwKKyAqICAgICAgICAgMDogY291bGQgbm90IGZvdW5kIHByZWZlcnJlZCBzYWZlIGNoYW5uZWwKKyAqLworc3RhdGljIHVpbnQ4X3QgaGRkX2ZpbmRfcHJlZmRfc2FmZV9jaG5sKGhkZF9jb250ZXh0X3QgKmhkZF9jdHh0LAorCQkJCQloZGRfYWRhcHRlcl90ICphcF9hZGFwdGVyKQoreworCXVpbnQxNl90IHNhZmVfY2hhbm5lbHNbTlVNXzIwTUhaX1JGX0NIQU5ORUxTXTsKKwl1aW50MTZfdCBzYWZlX2NoYW5uZWxfY291bnQ7CisJdWludDE2X3QgdW5zYWZlX2NoYW5uZWxfY291bnQ7CisJdWludDhfdCBpc191bnNhZmUgPSAxOworCXVpbnQxNl90IGk7CisJdWludDE2X3QgY2hhbm5lbF9sb29wOworCisJaWYgKCFoZGRfY3R4dCB8fCAhYXBfYWRhcHRlcikgeworCQloZGRfZXJyKCJpbnZhbGlkIGNvbnRleHQvYWRhcHRlciIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzYWZlX2NoYW5uZWxfY291bnQgPSAwOworCXVuc2FmZV9jaGFubmVsX2NvdW50ID0gQ0RGX01JTigodWludDE2X3QpaGRkX2N0eHQtPnVuc2FmZV9jaGFubmVsX2NvdW50LAorCQkJCSAgICAgICAodWludDE2X3QpTlVNXzIwTUhaX1JGX0NIQU5ORUxTKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fMjBNSFpfUkZfQ0hBTk5FTFM7IGkrKykgeworCQlpc191bnNhZmUgPSAwOworCQlmb3IgKGNoYW5uZWxfbG9vcCA9IDA7CisJCSAgICAgY2hhbm5lbF9sb29wIDwgdW5zYWZlX2NoYW5uZWxfY291bnQ7IGNoYW5uZWxfbG9vcCsrKSB7CisJCQlpZiAocmZfY2hhbm5lbHNbaV0uY2hhbm5lbE51bSA9PQorCQkJICAgIGhkZF9jdHh0LT51bnNhZmVfY2hhbm5lbF9saXN0W2NoYW5uZWxfbG9vcF0pIHsKKwkJCQlpc191bnNhZmUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghaXNfdW5zYWZlKSB7CisJCQlzYWZlX2NoYW5uZWxzW3NhZmVfY2hhbm5lbF9jb3VudF0gPQorCQkJCXJmX2NoYW5uZWxzW2ldLmNoYW5uZWxOdW07CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgICAgICBGTCgic2FmZSBjaGFubmVsICVkIiksCisJCQkgICAgICAgc2FmZV9jaGFubmVsc1tzYWZlX2NoYW5uZWxfY291bnRdKTsKKwkJCXNhZmVfY2hhbm5lbF9jb3VudCsrOworCQl9CisJfQorCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCSAgICAgICBGTCgicGVyZmVycmVkIHJhbmdlICVkIC0gJWQiKSwKKwkJYXBfYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuYWNzX2NmZy5zdGFydF9jaCwKKwkJYXBfYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuYWNzX2NmZy5lbmRfY2gpOworCWZvciAoaSA9IDA7IGkgPCBzYWZlX2NoYW5uZWxfY291bnQ7IGkrKykgeworCQlpZiAoc2FmZV9jaGFubmVsc1tpXSA+PQorCQkJYXBfYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuYWNzX2NmZy5zdGFydF9jaAorCQkgICAgJiYgc2FmZV9jaGFubmVsc1tpXSA8PQorCQkJYXBfYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuYWNzX2NmZy5lbmRfY2gpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAgICAgIEZMKCJzYWZlIGNoYW5uZWwgJWQgaXMgaW4gcGVyZmVycmVkIHJhbmdlIiksCisJCQkgICAgICAgc2FmZV9jaGFubmVsc1tpXSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfY2hfYXZvaWRfY2IoKSAtIEF2b2lkIG5vdGlmaWVkIGNoYW5uZWxzIGZyb20gRlcgaGFuZGxlcgorICogQGFkYXB0ZXI6CUhERCBhZGFwdGVyIHBvaW50ZXIKKyAqIEBpbmRQYXJhbToJQ2hhbm5lbCBhdm9pZCBub3RpZmljYXRpb24gcGFyYW1ldGVyCisgKgorICogQXZvaWQgY2hhbm5lbCBub3RpZmljYXRpb24gZnJvbSBGVyBoYW5kbGVyLgorICogRlcgd2lsbCBzZW5kIHVuLXNhZmUgY2hhbm5lbCBsaXN0IHRvIGF2b2lkIG92ZXIgd3JhcHBpbmcuCisgKiBob3N0YXBkIHNob3VsZCBub3QgdXNlIG5vdGlmaWVkIGNoYW5uZWwKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2NoX2F2b2lkX2NiKHZvaWQgKmhkZF9jb250ZXh0LCB2b2lkICppbmRpX3BhcmFtKQoreworCWhkZF9hZGFwdGVyX3QgKmhvc3RhcGRfYWRhcHRlciA9IE5VTEw7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eHQ7CisJdFNpckNoQXZvaWRJbmRUeXBlICpjaF9hdm9pZF9pbmRpOworCXVpbnQ4X3QgcmFuZ2VfbG9vcDsKKwllUmZDaGFubmVscyBjaGFubmVsX2xvb3AsIHN0YXJ0X2NoYW5uZWxfaWR4ID0gSU5WQUxJRF9SRl9DSEFOTkVMLAorCQkJCQllbmRfY2hhbm5lbF9pZHggPSBJTlZBTElEX1JGX0NIQU5ORUw7CisJdWludDE2X3Qgc3RhcnRfY2hhbm5lbDsKKwl1aW50MTZfdCBlbmRfY2hhbm5lbDsKKwl2X0NPTlRFWFRfdCBjZHNfY29udGV4dDsKKwlzdGF0aWMgaW50IHJlc3RhcnRfc2FwX2luX3Byb2dyZXNzOworCXRIZGRBdm9pZEZyZXFMaXN0IGhkZF9hdm9pZF9mcmVxX2xpc3Q7CisJdWludDMyX3QgaTsKKworCS8qIEJhc2ljIHNhbml0eSAqLworCWlmICghaGRkX2NvbnRleHQgfHwgIWluZGlfcGFyYW0pIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkludmFsaWQgYXJndW1lbnRzIikpOworCQlyZXR1cm47CisJfQorCisJaGRkX2N0eHQgPSAoaGRkX2NvbnRleHRfdCAqKSBoZGRfY29udGV4dDsKKwljaF9hdm9pZF9pbmRpID0gKHRTaXJDaEF2b2lkSW5kVHlwZSAqKSBpbmRpX3BhcmFtOworCWNkc19jb250ZXh0ID0gaGRkX2N0eHQtPnBjZHNfY29udGV4dDsKKworCS8qIE1ha2UgdW5zYWZlIGNoYW5uZWwgbGlzdCAqLworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkgICAgICAgRkwoImJhbmQgY291bnQgJWQiKSwKKwkgICAgICAgY2hfYXZvaWRfaW5kaS0+YXZvaWRfcmFuZ2VfY291bnQpOworCisJLyogZ2VuZXJhdGUgdmVuZG9yIHNwZWNpZmljIGV2ZW50ICovCisJY2RmX21lbV96ZXJvKCh2b2lkICopJmhkZF9hdm9pZF9mcmVxX2xpc3QsIHNpemVvZih0SGRkQXZvaWRGcmVxTGlzdCkpOworCWZvciAoaSA9IDA7IGkgPCBjaF9hdm9pZF9pbmRpLT5hdm9pZF9yYW5nZV9jb3VudDsgaSsrKSB7CisJCWhkZF9hdm9pZF9mcmVxX2xpc3QuYXZvaWRGcmVxUmFuZ2VbaV0uc3RhcnRGcmVxID0KKwkJCWNoX2F2b2lkX2luZGktPmF2b2lkX2ZyZXFfcmFuZ2VbaV0uc3RhcnRfZnJlcTsKKwkJaGRkX2F2b2lkX2ZyZXFfbGlzdC5hdm9pZEZyZXFSYW5nZVtpXS5lbmRGcmVxID0KKwkJCWNoX2F2b2lkX2luZGktPmF2b2lkX2ZyZXFfcmFuZ2VbaV0uZW5kX2ZyZXE7CisJfQorCWhkZF9hdm9pZF9mcmVxX2xpc3QuYXZvaWRGcmVxUmFuZ2VDb3VudCA9CisJCWNoX2F2b2lkX2luZGktPmF2b2lkX3JhbmdlX2NvdW50OworCisJd2xhbl9oZGRfc2VuZF9hdm9pZF9mcmVxX2V2ZW50KGhkZF9jdHh0LCAmaGRkX2F2b2lkX2ZyZXFfbGlzdCk7CisKKwkvKiBjbGVhciBleGlzdGluZyB1bnNhZmUgY2hhbm5lbCBjYWNoZSAqLworCWhkZF9jdHh0LT51bnNhZmVfY2hhbm5lbF9jb3VudCA9IDA7CisJY2RmX21lbV96ZXJvKGhkZF9jdHh0LT51bnNhZmVfY2hhbm5lbF9saXN0LAorCQkJCQlzaXplb2YoaGRkX2N0eHQtPnVuc2FmZV9jaGFubmVsX2xpc3QpKTsKKworCWZvciAocmFuZ2VfbG9vcCA9IDA7IHJhbmdlX2xvb3AgPCBjaF9hdm9pZF9pbmRpLT5hdm9pZF9yYW5nZV9jb3VudDsKKwkJCQkJCQkJcmFuZ2VfbG9vcCsrKSB7CisJCWlmIChoZGRfY3R4dC0+dW5zYWZlX2NoYW5uZWxfY291bnQgPj0gTlVNXzIwTUhaX1JGX0NIQU5ORUxTKSB7CisJCQloZGRMb2coTE9HVywgRkwoIkxURSBDb2V4IHVuc2FmZSBjaGFubmVsIGxpc3QgZnVsbCIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3RhcnRfY2hhbm5lbCA9IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbCgKKwkJCWNoX2F2b2lkX2luZGktPmF2b2lkX2ZyZXFfcmFuZ2VbcmFuZ2VfbG9vcF0uc3RhcnRfZnJlcSk7CisJCWVuZF9jaGFubmVsICAgPSBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoCisJCQljaF9hdm9pZF9pbmRpLT5hdm9pZF9mcmVxX3JhbmdlW3JhbmdlX2xvb3BdLmVuZF9mcmVxKTsKKwkJaGRkTG9nKExPRzEsICIlcyA6IHN0YXJ0ICVkIDogJWQsIGVuZCAlZCA6ICVkIiwgX19mdW5jX18sCisJCQljaF9hdm9pZF9pbmRpLT5hdm9pZF9mcmVxX3JhbmdlW3JhbmdlX2xvb3BdLnN0YXJ0X2ZyZXEsCisJCQlzdGFydF9jaGFubmVsLAorCQkJY2hfYXZvaWRfaW5kaS0+YXZvaWRfZnJlcV9yYW5nZVtyYW5nZV9sb29wXS5lbmRfZnJlcSwKKwkJCWVuZF9jaGFubmVsKTsKKworCQkvKiBkbyBub3QgcHJvY2VzcyBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhcmUgbm90IG1hcHBlZCB0bworCQkgKiBwcmVkZWZpbmVkIGNoYW5uZWxzCisJCSAqLworCQlpZiAoc3RhcnRfY2hhbm5lbCA9PSAwIHx8IGVuZF9jaGFubmVsID09IDApCisJCQljb250aW51ZTsKKworCQlmb3IgKGNoYW5uZWxfbG9vcCA9IE1JTl8yME1IWl9SRl9DSEFOTkVMOyBjaGFubmVsX2xvb3AgPD0KKwkJCQkJTUFYXzIwTUhaX1JGX0NIQU5ORUw7IGNoYW5uZWxfbG9vcCsrKSB7CisJCQlpZiAocmZfY2hhbm5lbHNbY2hhbm5lbF9sb29wXS50YXJnZXRGcmVxID49CisJCQkJCQljaF9hdm9pZF9pbmRpLT5hdm9pZF9mcmVxX3JhbmdlWworCQkJCQkJcmFuZ2VfbG9vcF0uc3RhcnRfZnJlcSkgeworCQkJCXN0YXJ0X2NoYW5uZWxfaWR4ID0gY2hhbm5lbF9sb29wOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZvciAoY2hhbm5lbF9sb29wID0gTUlOXzIwTUhaX1JGX0NIQU5ORUw7IGNoYW5uZWxfbG9vcCA8PQorCQkJCQlNQVhfMjBNSFpfUkZfQ0hBTk5FTDsgY2hhbm5lbF9sb29wKyspIHsKKwkJCWlmIChyZl9jaGFubmVsc1tjaGFubmVsX2xvb3BdLnRhcmdldEZyZXEgPj0KKwkJCQkJCWNoX2F2b2lkX2luZGktPmF2b2lkX2ZyZXFfcmFuZ2VbCisJCQkJCQlyYW5nZV9sb29wXS5lbmRfZnJlcSkgeworCQkJCWVuZF9jaGFubmVsX2lkeCA9IGNoYW5uZWxfbG9vcDsKKwkJCQlpZiAocmZfY2hhbm5lbHNbY2hhbm5lbF9sb29wXS50YXJnZXRGcmVxID4KKwkJCQkJCWNoX2F2b2lkX2luZGktPmF2b2lkX2ZyZXFfcmFuZ2VbCisJCQkJCQlyYW5nZV9sb29wXS5lbmRfZnJlcSkKKwkJCQkJZW5kX2NoYW5uZWxfaWR4LS07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc3RhcnRfY2hhbm5lbF9pZHggPT0gSU5WQUxJRF9SRl9DSEFOTkVMIHx8CisJCQkJCWVuZF9jaGFubmVsX2lkeCA9PSBJTlZBTElEX1JGX0NIQU5ORUwpCisJCQljb250aW51ZTsKKworCQlmb3IgKGNoYW5uZWxfbG9vcCA9IHN0YXJ0X2NoYW5uZWxfaWR4OyBjaGFubmVsX2xvb3AgPD0KKwkJCQkJZW5kX2NoYW5uZWxfaWR4OyBjaGFubmVsX2xvb3ArKykgeworCQkJaGRkX2N0eHQtPnVuc2FmZV9jaGFubmVsX2xpc3RbCisJCQkJCWhkZF9jdHh0LT51bnNhZmVfY2hhbm5lbF9jb3VudCsrXSA9CisJCQkJCXJmX2NoYW5uZWxzW2NoYW5uZWxfbG9vcF0uY2hhbm5lbE51bTsKKwkJCWlmIChoZGRfY3R4dC0+dW5zYWZlX2NoYW5uZWxfY291bnQgPj0KKwkJCQkJCQlOVU1fMjBNSFpfUkZfQ0hBTk5FTFMpIHsKKwkJCQloZGRMb2coTE9HVywgRkwoIkxURUNvZXggdW5zYWZlIGNoIGxpc3QgZnVsbCIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkgICAgICAgRkwoIm51bWJlciBvZiB1bnNhZmUgY2hhbm5lbHMgaXMgJWQgIiksCisJICAgICAgIGhkZF9jdHh0LT51bnNhZmVfY2hhbm5lbF9jb3VudCk7CisKKwlpZiAoY25zc19zZXRfd2xhbl91bnNhZmVfY2hhbm5lbChoZGRfY3R4dC0+dW5zYWZlX2NoYW5uZWxfbGlzdCwKKwkJCQloZGRfY3R4dC0+dW5zYWZlX2NoYW5uZWxfY291bnQpKSB7CisJCWhkZF9lcnIoIkZhaWxlZCB0byBzZXQgdW5zYWZlIGNoYW5uZWwiKTsKKworCQkvKiBjbGVhciBleGlzdGluZyB1bnNhZmUgY2hhbm5lbCBjYWNoZSAqLworCQloZGRfY3R4dC0+dW5zYWZlX2NoYW5uZWxfY291bnQgPSAwOworCQljZGZfbWVtX3plcm8oaGRkX2N0eHQtPnVuc2FmZV9jaGFubmVsX2xpc3QsCisJCQlzaXplb2YoaGRkX2N0eHQtPnVuc2FmZV9jaGFubmVsX2xpc3QpKTsKKworCQlyZXR1cm47CisJfQorCisJZm9yIChjaGFubmVsX2xvb3AgPSAwOworCSAgICAgY2hhbm5lbF9sb29wIDwgaGRkX2N0eHQtPnVuc2FmZV9jaGFubmVsX2NvdW50OyBjaGFubmVsX2xvb3ArKykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICAgICBGTCgiY2hhbm5lbCAlZCBpcyBub3Qgc2FmZSAiKSwKKwkJICAgICAgIGhkZF9jdHh0LT51bnNhZmVfY2hhbm5lbF9saXN0W2NoYW5uZWxfbG9vcF0pOworCX0KKworCS8qCisJICogSWYgYXV0byBjaGFubmVsIHNlbGVjdCBpcyBlbmFibGVkCisJICogcHJlZmVycmVkIGNoYW5uZWwgaXMgaW4gc2FmZSBjaGFubmVsLAorCSAqIHJlLXN0YXJ0IHNvZnRhcCBpbnRlcmZhY2Ugd2l0aCBzYWZlIGNoYW5uZWwuCisJICogbm8gb3ZlcmxhcCB3aXRoIHByZWZlcnJlZCBjaGFubmVsIGFuZCBzYWZlIGNoYW5uZWwKKwkgKiBkbyBub3QgcmUtc3RhcnQgc29mdGFwIGludGVyZmFjZQorCSAqIHN0YXkgY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbC4KKwkgKi8KKwlpZiAoaGRkX2N0eHQtPnVuc2FmZV9jaGFubmVsX2NvdW50KSB7CisJCWhvc3RhcGRfYWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihoZGRfY3R4dCwgV0xBTl9IRERfU09GVEFQKTsKKwkJaWYgKGhvc3RhcGRfYWRhcHRlcikgeworCQkJaWYgKChob3N0YXBkX2FkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnLgorCQkJCWFjc19jZmcuYWNzX21vZGUpICYmCisJCQkJKCFoZGRfZmluZF9wcmVmZF9zYWZlX2NobmwoaGRkX2N0eHQsCisJCQkJaG9zdGFwZF9hZGFwdGVyKSkpCisJCQkJcmV0dXJuOworCisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICAgICAgRkwoCisJCQkJICAiQ3VycmVudCBvcGVyYXRpb24gY2hhbm5lbCAlZCwgc2Vzc2lvbkN0eC5hcC5zYXBDb25maWcuY2hhbm5lbCAlZCIKKwkJCQkgKSwKKwkJCSAgICAgICBob3N0YXBkX2FkYXB0ZXItPnNlc3Npb25DdHguYXAuCisJCQkgICAgICAgb3BlcmF0aW5nQ2hhbm5lbCwKKwkJCSAgICAgICBob3N0YXBkX2FkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnLgorCQkJICAgICAgIGNoYW5uZWwpOworCQkJZm9yIChjaGFubmVsX2xvb3AgPSAwOworCQkJICAgICBjaGFubmVsX2xvb3AgPCBoZGRfY3R4dC0+dW5zYWZlX2NoYW5uZWxfY291bnQ7CisJCQkgICAgIGNoYW5uZWxfbG9vcCsrKSB7CisJCQkJaWYgKCgoaGRkX2N0eHQtPgorCQkJCQl1bnNhZmVfY2hhbm5lbF9saXN0W2NoYW5uZWxfbG9vcF0gPT0KKwkJCQkJCWhvc3RhcGRfYWRhcHRlci0+c2Vzc2lvbkN0eC5hcC4KKwkJCQkJCSAgICAgIG9wZXJhdGluZ0NoYW5uZWwpKSAmJgorCQkJCQkoaG9zdGFwZF9hZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLgorCQkJCQkJc2FwQ29uZmlnLmFjc19jZmcuYWNzX21vZGUKKwkJCQkJCQkJID09IHRydWUpICYmCisJCQkJCSFyZXN0YXJ0X3NhcF9pbl9wcm9ncmVzcykgeworCQkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSAgICAgICBGTCgiUmVzdGFydGluZyBTQVAiKSk7CisJCQkJCXdsYW5faGRkX3NlbmRfc3ZjX25saW5rX21zZworCQkJCQkJKFdMQU5fU1ZDX0xURV9DT0VYX0lORCwgTlVMTCwgMCk7CisJCQkJCXJlc3RhcnRfc2FwX2luX3Byb2dyZXNzID0gMTsKKwkJCQkJLyoKKwkJCQkJICogY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbCBpcyB1bi1zYWZlCisJCQkJCSAqIGNoYW5uZWwsIHJlc3RhcnQgZHJpdmVyCisJCQkJCSAqLworCQkJCQloZGRfaG9zdGFwZF9zdG9wKGhvc3RhcGRfYWRhcHRlci0+ZGV2KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybjsKK30KKworLyoqCisgKiBoZGRfaW5pdF9jaGFubmVsX2F2b2lkYW5jZSgpIC0gSW5pdGlhbGl6ZSBjaGFubmVsIGF2b2lkYW5jZQorICogQGhkZF9jdHg6CUhERCBnbG9iYWwgY29udGV4dAorICoKKyAqIEluaXRpYWxpemUgdGhlIGNoYW5uZWwgYXZvaWRhbmNlIGxvZ2ljIGJ5IHJldHJpZXZpbmcgdGhlIHVuc2FmZQorICogY2hhbm5lbCBsaXN0IGZyb20gdGhlIENOU1MgcGxhdGZvcm0gZHJpdmVyIGFuZCBwbHVtYmluZyB0aGUgZGF0YQorICogZG93biB0byB0aGUgbG93ZXIgbGF5ZXJzLiAgVGhlbiBzdWJzY3JpYmUgdG8gc3Vic2VxdWVudCBjaGFubmVsCisgKiBhdm9pZGFuY2UgZXZlbnRzLgorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfaW5pdF9jaGFubmVsX2F2b2lkYW5jZShoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXVpbnQxNl90IHVuc2FmZV9jaGFubmVsX2NvdW50OworCWludCBpbmRleDsKKworCWNuc3NfZ2V0X3dsYW5fdW5zYWZlX2NoYW5uZWwoaGRkX2N0eC0+dW5zYWZlX2NoYW5uZWxfbGlzdCwKKwkJCQkgICAgICYoaGRkX2N0eC0+dW5zYWZlX2NoYW5uZWxfY291bnQpLAorCQkJCSAgICAgc2l6ZW9mKHVpbnQxNl90KSAqIE5VTV8yME1IWl9SRl9DSEFOTkVMUyk7CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sIEZMKCJudW0gb2YgdW5zYWZlIGNoYW5uZWxzIGlzICVkIiksCisJICAgICAgIGhkZF9jdHgtPnVuc2FmZV9jaGFubmVsX2NvdW50KTsKKworCXVuc2FmZV9jaGFubmVsX2NvdW50ID0gQ0RGX01JTigodWludDE2X3QpaGRkX2N0eC0+dW5zYWZlX2NoYW5uZWxfY291bnQsCisJCQkJICAgICAgICh1aW50MTZfdClOVU1fMjBNSFpfUkZfQ0hBTk5FTFMpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdW5zYWZlX2NoYW5uZWxfY291bnQ7IGluZGV4KyspIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCBGTCgiY2hhbm5lbCAlZCBpcyBub3Qgc2FmZSIpLAorCQkgICAgICAgaGRkX2N0eC0+dW5zYWZlX2NoYW5uZWxfbGlzdFtpbmRleF0pOworCisJfQorCisJLyogUGx1ZyBpbiBhdm9pZCBjaGFubmVsIG5vdGlmaWNhdGlvbiBjYWxsYmFjayAqLworCXNtZV9hZGRfY2hfYXZvaWRfY2FsbGJhY2soaGRkX2N0eC0+aEhhbCwgaGRkX2NoX2F2b2lkX2NiKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBoZGRfaW5pdF9jaGFubmVsX2F2b2lkYW5jZShoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworfQorc3RhdGljIHZvaWQgaGRkX3NldF90aGVybWFsX2xldmVsX2NiKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIHVfaW50OF90IGxldmVsKQoreworfQorI2VuZGlmIC8qIGRlZmluZWQoRkVBVFVSRV9XTEFOX0NIX0FWT0lEKSAmJiBkZWZpbmVkKENPTkZJR19DTlNTKSAqLworCisvKioKKyAqIHdsYW5faGRkX2Rpc2FibGVfYWxsX2R1YWxfbWFjX2ZlYXR1cmVzKCkgLSBEaXNhYmxlIGR1YWwgbWFjIGZlYXR1cmVzCisgKiBAaGRkX2N0eDogSEREIGNvbnRleHQKKyAqCisgKiBEaXNhYmxlcyBhbGwgdGhlIGR1YWwgbWFjIGZlYXR1cmVzIGxpa2UgREJTLCBBZ2lsZSBERlMgZXRjLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIENERl9TVEFUVVMgd2xhbl9oZGRfZGlzYWJsZV9hbGxfZHVhbF9tYWNfZmVhdHVyZXMoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlzdHJ1Y3Qgc2lyX2R1YWxfbWFjX2NvbmZpZyBjZmc7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlpZiAoIWhkZF9jdHgpIHsKKwkJaGRkX2VycigiSEREIGNvbnRleHQgaXMgTlVMTCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY2ZnLnNjYW5fY29uZmlnID0gMDsKKwljZmcuZndfbW9kZV9jb25maWcgPSAwOworCWNmZy5zZXRfZHVhbF9tYWNfY2IgPQorCQkodm9pZCAqKWNkc19zb2Nfc2V0X2R1YWxfbWFjX2NmZ19jYjsKKworCWhkZF9kZWJ1ZygiRGlzYWJsaW5nIGFsbCBkdWFsIG1hYyBmZWF0dXJlcy4uLiIpOworCisJc3RhdHVzID0gc21lX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnKGhkZF9jdHgtPmhIYWwsIGNmZyk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkX2Vycigic21lX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnIGZhaWxlZCAlZCIsIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBoZGRfd2xhbl9zdGFydHVwKCkgLSBIREQgaW5pdCBmdW5jdGlvbgorICogQGRldjoJUG9pbnRlciB0byB0aGUgdW5kZXJseWluZyBkZXZpY2UKKyAqCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgc3RhcnR1cCBjb2RlIGV4ZWN1dGVkIG9uY2UgYSBXTEFOIGRldmljZSBoYXMgYmVlbiBkZXRlY3RlZAorICoKKyAqIFJldHVybjogIDAgZm9yIHN1Y2Nlc3MsIDwgMCBmb3IgZmFpbHVyZQorICovCitpbnQgaGRkX3dsYW5fc3RhcnR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmhpZl9zYykKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gTlVMTDsKKyNpZmRlZiBXTEFOX09QRU5fUDJQX0lOVEVSRkFDRQorCWhkZF9hZGFwdGVyX3QgKnBQMmFkYXB0ZXIgPSBOVUxMOworI2VuZGlmCisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IE5VTEw7CisJdl9DT05URVhUX3QgcF9jZHNfY29udGV4dCA9IE5VTEw7CisJaW50IHJldDsKKwlpbnQgaTsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5OworCXVuc2lnbmVkIGxvbmcgcmM7CisJdFNtZVRoZXJtYWxQYXJhbXMgdGhlcm1hbFBhcmFtOworCXRTaXJUeFBvd2VyTGltaXQgKmhkZHR4bGltaXQ7CisJdWludDhfdCBydG5sX2xvY2tfZW5hYmxlOworCXVpbnQ4X3QgcmVnX25ldGRldl9ub3RpZmllcl9kb25lID0gZmFsc2U7CisJaGRkX2FkYXB0ZXJfdCAqZG90MTFfYWRhcHRlciA9IE5VTEw7CisKKwlFTlRFUigpOworCisJaWYgKFdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoY29uX21vZGUpKSB7CisJCXJldCA9IGVwcGluZ19lbmFibGUoZGV2KTsKKwkJRVhJVCgpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGNmZzgwMjExOiB3aXBoeSBhbGxvY2F0aW9uICovCisJd2lwaHkgPSB3bGFuX2hkZF9jZmc4MDIxMV93aXBoeV9hbGxvYyhzaXplb2YoaGRkX2NvbnRleHRfdCkpOworCisJaWYgKHdpcGh5ID09IE5VTEwpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoImNmZzgwMjExIGluaXQgZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwloZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBhZGFwdGVyIGNvbnRleHQgdG8gemVyb3MuICovCisJY2RmX21lbV96ZXJvKGhkZF9jdHgsIHNpemVvZihoZGRfY29udGV4dF90KSk7CisKKwloZGRfY3R4LT53aXBoeSA9IHdpcGh5OworCWhkZF9jdHgtPmlzTG9hZEluUHJvZ3Jlc3MgPSB0cnVlOworCWhkZF9jdHgtPmlvY3RsX3NjYW5fbW9kZSA9IGVTSVJfQUNUSVZFX1NDQU47CisJY2RzX3NldF93YWtlbG9ja19sb2dnaW5nKGZhbHNlKTsKKworCWNkc19zZXRfbG9hZF91bmxvYWRfaW5fcHJvZ3Jlc3ModHJ1ZSk7CisKKwkvKiBHZXQgY2RzIGNvbnRleHQgaGVyZSBiY296IGNkc19vcGVuIHJlcXVpcmVzIGl0ICovCisJcF9jZHNfY29udGV4dCA9IGNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKTsKKworCWlmIChwX2Nkc19jb250ZXh0ID09IE5VTEwpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJICAgICAgIEZMKCJGYWlsZWQgY2RzX2dldF9nbG9iYWxfY29udGV4dCIpKTsKKwkJZ290byBlcnJfZnJlZV9oZGRfY29udGV4dDsKKwl9CisJLyogU2F2ZSB0aGUgR2xvYmFsIENEUyBjb250ZXh0IGluIGFkYXB0ZXIgY29udGV4dCBmb3IgZnV0dXJlLiAqLworCWhkZF9jdHgtPnBjZHNfY29udGV4dCA9IHBfY2RzX2NvbnRleHQ7CisKKwkvKiBTYXZlIHRoZSBhZGFwdGVyIGNvbnRleHQgaW4gZ2xvYmFsIGNvbnRleHQgZm9yIGZ1dHVyZS4gKi8KKwkoKGNkc19jb250ZXh0X3R5cGUgKikgKHBfY2RzX2NvbnRleHQpKS0+cEhERENvbnRleHQgPSAodm9pZCAqKWhkZF9jdHg7CisKKwloZGRfY3R4LT5wYXJlbnRfZGV2ID0gZGV2OworCisJaGRkX2luaXRfbGxfc3RhdHNfY3R4KCk7CisKKwlpbml0X2NvbXBsZXRpb24oJmhkZF9jdHgtPm1jX3N1c19ldmVudF92YXIpOworCWluaXRfY29tcGxldGlvbigmaGRkX2N0eC0+cmVhZHlfdG9fc3VzcGVuZCk7CisKKwlzcGluX2xvY2tfaW5pdCgmaGRkX2N0eC0+c2NoZWRTY2FuX2xvY2spOworCisJY2RmX3NwaW5sb2NrX2luaXQoJmhkZF9jdHgtPmhkZF9hZGFwdGVyX2xvY2spOworCWNkZl9saXN0X2luaXQoJmhkZF9jdHgtPmhkZEFkYXB0ZXJzLCBNQVhfTlVNQkVSX09GX0FEQVBURVJTKTsKKworCXdsYW5faGRkX2NmZzgwMjExX2V4dHNjYW5faW5pdChoZGRfY3R4KTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJLyoKKwkgKiB0ZGxzX2xvY2sgaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIGFuIGhkZF9vcGVuX2FkYXB0ZXIgKCB3aGljaCBpcworCSAqIGludm9rZWQgYnkgb3RoZXIgaW5zdGFuY2VzIGFsc28pIHRvIHByb3RlY3QgdGhlIGNvbmN1cnJlbnQKKwkgKiBhY2Nlc3MgZm9yIHRoZSBBZGFwdGVycyBieSBURExTIG1vZHVsZS4KKwkgKi8KKwltdXRleF9pbml0KCZoZGRfY3R4LT50ZGxzX2xvY2spOworI2VuZGlmCisKKwkvKiBzdG9yZSB0YXJnZXQgdHlwZSBhbmQgdGFyZ2V0IHZlcnNpb24gaW5mbyBpbiBoZGQgY3R4ICovCisJaGRkX2N0eC0+dGFyZ2V0X3R5cGUgPSAoKHN0cnVjdCBvbF9zb2Z0YyAqKWhpZl9zYyktPnRhcmdldF90eXBlOworCWhkZF9pbml0X29mZmxvYWRlZF9wYWNrZXRzX2N0eChoZGRfY3R4KTsKKwkvKiBMb2FkIGFsbCBjb25maWcgZmlyc3QgYXMgVEwgY29uZmlnIGlzIG5lZWRlZCBkdXJpbmcgY2RzX29wZW4gKi8KKwloZGRfY3R4LT5jb25maWcgPQorCQkoc3RydWN0IGhkZF9jb25maWcgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGhkZF9jb25maWcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaGRkX2N0eC0+Y29uZmlnID09IE5VTEwpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJICAgICAgIEZMKCJGYWlsZWQga21hbGxvYyBzdHJ1Y3QgaGRkX2NvbmZpZyIpKTsKKwkJZ290byBlcnJfY29uZmlnOworCX0KKworCWNkZl9tZW1femVybyhoZGRfY3R4LT5jb25maWcsIHNpemVvZihzdHJ1Y3QgaGRkX2NvbmZpZykpOworCisJLyogUmVhZCBhbmQgcGFyc2UgdGhlIHFjb21fY2ZnLmluaSBmaWxlICovCisJc3RhdHVzID0gaGRkX3BhcnNlX2NvbmZpZ19pbmkoaGRkX2N0eCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgRkwoImVycm9yIHBhcnNpbmcgJXMiKSwKKwkJICAgICAgIFdMQU5fSU5JX0ZJTEUpOworCQlnb3RvIGVycl9jb25maWc7CisJfQorCisJaGRkX2N0eC0+Y3VycmVudF9pbnRmX2NvdW50ID0gMDsKKwloZGRfY3R4LT5tYXhfaW50Zl9jb3VudCA9IENTUl9ST0FNX1NFU1NJT05fTUFYOworCisJLyoKKwkgKiBJTkkgaGFzIGJlZW4gcmVhZCwgaW5pdGlhbGlzZSB0aGUgY29uZmlndXJlZE1jYXN0QmNhc3RGaWx0ZXIgd2l0aAorCSAqIElOSSB2YWx1ZSBhcyB0aGlzIHdpbGwgc2VydmUgYXMgdGhlIGRlZmF1bHQgdmFsdWUKKwkgKi8KKwloZGRfY3R4LT5jb25maWd1cmVkTWNhc3RCY2FzdEZpbHRlciA9CisJCWhkZF9jdHgtPmNvbmZpZy0+bWNhc3RCY2FzdEZpbHRlclNldHRpbmc7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICBGTCgiU2V0dGluZyBjb25maWd1cmVkTWNhc3RCY2FzdEZpbHRlcjogJWQiKSwKKwkgICAgICAgaGRkX2N0eC0+Y29uZmlnLT5tY2FzdEJjYXN0RmlsdGVyU2V0dGluZyk7CisKKwlpZiAoZmFsc2UgPT0gaGRkX2lzXzVnX3N1cHBvcnRlZChoZGRfY3R4KSkgeworCQkvKiA1R2h6IGlzIG5vdCBzdXBwb3J0ZWQuICovCisJCWlmICgxICE9IGhkZF9jdHgtPmNvbmZpZy0+bkJhbmRDYXBhYmlsaXR5KSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICAgICAgRkwoCisJCQkJICAiU2V0dGluZyBoZGRfY3R4LT5jb25maWctPm5CYW5kQ2FwYWJpbGl0eSA9IDEiCisJCQkJICkpOworCQkJaGRkX2N0eC0+Y29uZmlnLT5uQmFuZENhcGFiaWxpdHkgPSAxOworCQl9CisJfQorCisJLyoKKwkgKiBjZmc4MDIxMTogSW5pdGlhbGl6YXRpb24gIC4uLgorCSAqLworCWlmICgwIDwgd2xhbl9oZGRfY2ZnODAyMTFfaW5pdChkZXYsIHdpcGh5LCBoZGRfY3R4LT5jb25maWcpKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIndsYW5faGRkX2NmZzgwMjExX2luaXQgcmV0dXJuIGZhaWx1cmUiKSk7CisJCWdvdG8gZXJyX2NvbmZpZzsKKwl9CisKKwloZGRfZW5hYmxlX2Zhc3RwYXRoKGhkZF9jdHgtPmNvbmZpZywgaGlmX3NjKTsKKwkvKgorCSAqIEluaXRpYWxpemUgc3RydWN0IGZvciBzYXZpbmcgZi93IGxvZyBzZXR0aW5nIHdpbGwgYmUgdXNlZAorCSAqIGFmdGVyIHNzcgorCSAqLworCWhkZF9jdHgtPmZ3X2xvZ19zZXR0aW5ncy5lbmFibGUgPSBoZGRfY3R4LT5jb25maWctPmVuYWJsZWZ3bG9nOworCWhkZF9jdHgtPmZ3X2xvZ19zZXR0aW5ncy5kbF90eXBlID0gMDsKKwloZGRfY3R4LT5md19sb2dfc2V0dGluZ3MuZGxfcmVwb3J0ID0gMDsKKwloZGRfY3R4LT5md19sb2dfc2V0dGluZ3MuZGxfbG9nbGV2ZWwgPSAwOworCWhkZF9jdHgtPmZ3X2xvZ19zZXR0aW5ncy5pbmRleCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9NT0RfTE9HTEVWRUw7IGkrKykgeworCQloZGRfY3R4LT5md19sb2dfc2V0dGluZ3MuZGxfbW9kX2xvZ2xldmVsW2ldID0gMDsKKwl9CisJLyogVXBkYXRlIENERiB0cmFjZSBsZXZlbHMgYmFzZWQgdXBvbiB0aGUgY2ZnLmluaSAqLworCWhkZF9jZGZfdHJhY2VfZW5hYmxlKENERl9NT0RVTEVfSURfV01JLAorCQkJICAgICBoZGRfY3R4LT5jb25maWctPmNkZl90cmFjZV9lbmFibGVfd2RpKTsKKwloZGRfY2RmX3RyYWNlX2VuYWJsZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSAgICAgaGRkX2N0eC0+Y29uZmlnLT5jZGZfdHJhY2VfZW5hYmxlX2hkZCk7CisJaGRkX2NkZl90cmFjZV9lbmFibGUoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgICAgIGhkZF9jdHgtPmNvbmZpZy0+Y2RmX3RyYWNlX2VuYWJsZV9zbWUpOworCWhkZF9jZGZfdHJhY2VfZW5hYmxlKENERl9NT0RVTEVfSURfUEUsCisJCQkgICAgIGhkZF9jdHgtPmNvbmZpZy0+Y2RmX3RyYWNlX2VuYWJsZV9wZSk7CisJaGRkX2NkZl90cmFjZV9lbmFibGUoQ0RGX01PRFVMRV9JRF9XTUEsCisJCQkgICAgIGhkZF9jdHgtPmNvbmZpZy0+Y2RmX3RyYWNlX2VuYWJsZV93bWEpOworCWhkZF9jZGZfdHJhY2VfZW5hYmxlKENERl9NT0RVTEVfSURfU1lTLAorCQkJICAgICBoZGRfY3R4LT5jb25maWctPmNkZl90cmFjZV9lbmFibGVfc3lzKTsKKwloZGRfY2RmX3RyYWNlX2VuYWJsZShDREZfTU9EVUxFX0lEX0NERiwKKwkJCSAgICAgaGRkX2N0eC0+Y29uZmlnLT5jZGZfdHJhY2VfZW5hYmxlX2NkZik7CisJaGRkX2NkZl90cmFjZV9lbmFibGUoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkgICAgIGhkZF9jdHgtPmNvbmZpZy0+Y2RmX3RyYWNlX2VuYWJsZV9zYXApOworCWhkZF9jZGZfdHJhY2VfZW5hYmxlKENERl9NT0RVTEVfSURfSEREX1NPRlRBUCwKKwkJCSAgICAgaGRkX2N0eC0+Y29uZmlnLT5jZGZfdHJhY2VfZW5hYmxlX2hkZF9zYXApOworCWhkZF9jZGZfdHJhY2VfZW5hYmxlKENERl9NT0RVTEVfSURfQk1JLAorCQkJCWhkZF9jdHgtPmNvbmZpZy0+Y2RmX3RyYWNlX2VuYWJsZV9ibWkpOworCWhkZF9jZmdfcHJpbnQoaGRkX2N0eCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkKKwkJZ290byBmdG1fcHJvY2Vzc2luZzsKKworCWhkZF9jdHgtPmlzTG9ncEluUHJvZ3Jlc3MgPSBmYWxzZTsKKwljZHNfc2V0X2xvZ3BfaW5fcHJvZ3Jlc3MoZmFsc2UpOworCisJY2RzX3NldF9jb25uZWN0aW9uX2luX3Byb2dyZXNzKGhkZF9jdHgsIGZhbHNlKTsKKworCXN0YXR1cyA9IGNkc19vcGVuKCZwX2Nkc19jb250ZXh0LCAwKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsIEZMKCJjZHNfb3BlbiBmYWlsZWQiKSk7CisJCWdvdG8gZXJyX2Nkc19vcGVuOworCX0KKworCXdsYW5faGRkX3VwZGF0ZV93aXBoeSh3aXBoeSwgaGRkX2N0eC0+Y29uZmlnKTsKKworCWhkZF9jdHgtPmhIYWwgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9TTUUpOworCisJaWYgKE5VTEwgPT0gaGRkX2N0eC0+aEhhbCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCBGTCgiSEFMIGNvbnRleHQgaXMgbnVsbCIpKTsKKwkJZ290byBlcnJfY2RzX2Nsb3NlOworCX0KKworCXN0YXR1cyA9IGNkc19wcmVfZW5hYmxlKGhkZF9jdHgtPnBjZHNfY29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCBGTCgiY2RzX3ByZV9lbmFibGUgZmFpbGVkIikpOworCQlnb3RvIGVycl9jZHNfY2xvc2U7CisJfQorCisJb2xfdHhyeF9yZWdpc3Rlcl9wYXVzZV9jYih3bGFuX2hkZF90eHJ4X3BhdXNlX2NiKTsKKworCXN0YXR1cyA9IHdsYW5faGRkX3JlZ3VsYXRvcnlfaW5pdChoZGRfY3R4KTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCSAgICAgICBGTCgiRmFpbGVkIHRvIGluaXQgY2hhbm5lbCBsaXN0IikpOworCQlnb3RvIGVycl9jZHNfY2xvc2U7CisJfQorCisJLyoKKwkgKiBTZXQgODAyLjExcCBjb25maWcKKwkgKiBUT0RPLU9DQjogVGhpcyBoYXMgYmVlbiB0ZW1wb3JhcmlseSBhZGRlZCBoZXJlIHRvIGVuc3VyZSB0aGlzCisJICogcGFyYW1ldGVyIGlzIHNldCBpbiBDU1Igd2hlbiB3ZSBpbml0IHRoZSBjaGFubmVsIGxpc3QuIFRoaXMgc2hvdWxkCisJICogYmUgcmVtb3ZlZCBvbmNlIHRoZSA1LjkgR0h6IGNoYW5uZWxzIGFyZSBhZGRlZCB0byB0aGUgcmVndWxhdG9yeQorCSAqIGRvbWFpbi4KKwkgKi8KKwloZGRfc2V0X2RvdDExcF9jb25maWcoaGRkX2N0eCk7CisKKwlpZiAoMCA9PSBlbmFibGVfZGZzX2NoYW5fc2NhbiB8fCAxID09IGVuYWJsZV9kZnNfY2hhbl9zY2FuKSB7CisJCWhkZF9jdHgtPmNvbmZpZy0+ZW5hYmxlREZTQ2hubFNjYW4gPSBlbmFibGVfZGZzX2NoYW5fc2NhbjsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICAgICAgRkwoIm1vZHVsZSBlbmFibGVfZGZzX2NoYW5fc2NhbiBzZXQgdG8gJWQiKSwKKwkJICAgICAgIGVuYWJsZV9kZnNfY2hhbl9zY2FuKTsKKwl9CisJaWYgKDAgPT0gZW5hYmxlXzExZCB8fCAxID09IGVuYWJsZV8xMWQpIHsKKwkJaGRkX2N0eC0+Y29uZmlnLT5JczExZFN1cHBvcnRFbmFibGVkID0gZW5hYmxlXzExZDsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCBGTCgibW9kdWxlIGVuYWJsZV8xMWQgc2V0IHRvICVkIiksCisJCSAgICAgICBlbmFibGVfMTFkKTsKKwl9CisKKwkvKgorCSAqIE5vdGUgdGhhdCB0aGUgY2RzX3ByZV9lbmFibGUoKSBzZXF1ZW5jZSB0cmlnZ2VycyB0aGUgY2ZnIGRvd25sb2FkLgorCSAqIFRoZSBjZmcgZG93bmxvYWQgbXVzdCBvY2N1ciBiZWZvcmUgd2UgdXBkYXRlIHRoZSBTTUUgY29uZmlnCisJICogc2luY2UgdGhlIFNNRSBjb25maWcgb3BlcmF0aW9uIG11c3QgYWNjZXNzIHRoZSBjZmcgZGF0YWJhc2UKKwkgKi8KKwlzdGF0dXMgPSBoZGRfc2V0X3NtZV9jb25maWcoaGRkX2N0eCk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCBGTCgiRmFpbGVkIGhkZF9zZXRfc21lX2NvbmZpZyIpKTsKKwkJZ290byBlcnJfd2lwaHlfdW5yZWdpc3RlcjsKKwl9CisKKwlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKDAsIFdNSV9QREVWX1BBUkFNX1RYX0NIQUlOX01BU0tfMVNTLAorCQkJCSAgaGRkX2N0eC0+Y29uZmlnLT50eF9jaGFpbl9tYXNrXzFzcywKKwkJCQkgIFBERVZfQ01EKTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgICIlczogV01JX1BERVZfUEFSQU1fVFhfQ0hBSU5fTUFTS18xU1MgZmFpbGVkICVkIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXQpOworCX0KKworCXN0YXR1cyA9IGhkZF9zZXRfc21lX2NoYW5fbGlzdChoZGRfY3R4KTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgRkwoIkZhaWxlZCB0byBpbml0IGNoYW5uZWwgbGlzdCIpKTsKKwkJZ290byBlcnJfd2lwaHlfdW5yZWdpc3RlcjsKKwl9CisKKwkvKiBBcHBseSB0aGUgY2ZnLmluaSB0byBjZmcuZGF0ICovCisJaWYgKGZhbHNlID09IGhkZF91cGRhdGVfY29uZmlnX2RhdChoZGRfY3R4KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgRkwoImNvbmZpZyB1cGRhdGUgZmFpbGVkIikpOworCQlnb3RvIGVycl93aXBoeV91bnJlZ2lzdGVyOworCX0KKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gaGRkX3VwZGF0ZV9tYWNfY29uZmlnKGhkZF9jdHgpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJICAgICAgIEZMKCJjYW4ndCB1cGRhdGUgbWFjIGNvbmZpZywgdXNpbmcgTUFDIGZyb20gaW5pIGZpbGUiKSk7CisJfQorCisJeworCQlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzOworCQkvKgorCQkgKiBTZXQgdGhlIE1BQyBBZGRyZXNzIEN1cnJlbnRseSB0aGlzIGlzIHVzZWQgYnkgSEFMIHRvCisJCSAqIGFkZCBzZWxmIHN0YS4gUmVtb3ZlIHRoaXMgb25jZSBzZWxmIHN0YSBpcyBhZGRlZCBhcworCQkgKiBwYXJ0IG9mIHNlc3Npb24gb3Blbi4KKwkJICovCisJCWNkZl9yZXRfc3RhdHVzID0gY2ZnX3NldF9zdHIoaGRkX2N0eC0+aEhhbCwgV05JX0NGR19TVEFfSUQsCisJCQkJCSAgICAgKHVpbnQ4X3QgKikgJmhkZF9jdHgtPmNvbmZpZy0+CisJCQkJCSAgICAgaW50Zk1hY0FkZHJbMF0sCisJCQkJCSAgICAgc2l6ZW9mKGhkZF9jdHgtPmNvbmZpZy0+CisJCQkJCQkgICAgaW50Zk1hY0FkZHJbMF0pKTsKKworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfcmV0X3N0YXR1cykpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgRkwoCisJCQkJICAiRmFpbGVkIHRvIHNldCBNQUMgQWRkcmVzcy4gSEFMU3RhdHVzIGlzICUwOGQgW3glMDh4XSIKKwkJCQkgKSwKKwkJCSAgICAgICBjZGZfcmV0X3N0YXR1cywgY2RmX3JldF9zdGF0dXMpOworCQkJZ290byBlcnJfd2lwaHlfdW5yZWdpc3RlcjsKKwkJfQorCX0KKworCWlmIChoZGRfaXBhX2luaXQoaGRkX2N0eCkgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpCisJCWdvdG8gZXJyX3dpcGh5X3VucmVnaXN0ZXI7CisKKwkvKgorCSAqIFN0YXJ0IENEUyB3aGljaCBzdGFydHMgdXAgdGhlIFNNRS9NQUMvSEFMIG1vZHVsZXMgYW5kIGV2ZXJ5dGhpbmcKKwkgKiBlbHNlCisJICovCisJc3RhdHVzID0gY2RzX2VuYWJsZShoZGRfY3R4LT5wY2RzX2NvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgRkwoImNkc19lbmFibGUgZmFpbGVkIikpOworCQlnb3RvIGVycl93aXBoeV91bnJlZ2lzdGVyOworCX0KKworCWhkZF9pbml0X2NoYW5uZWxfYXZvaWRhbmNlKGhkZF9jdHgpOworCisJc3RhdHVzID0gaGRkX3Bvc3RfY2RzX2VuYWJsZV9jb25maWcoaGRkX2N0eCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgRkwoImhkZF9wb3N0X2Nkc19lbmFibGVfY29uZmlnIGZhaWxlZCIpKTsKKwkJZ290byBlcnJfY2RzX2Rpc2FibGU7CisJfQorI2lmZGVmIFFDQV9QS1RfUFJPVE9fVFJBQ0UKKwljZHNfcGt0X3Byb3RvX3RyYWNlX2luaXQoKTsKKyNlbmRpZiAvKiBRQ0FfUEtUX1BST1RPX1RSQUNFICovCisKK2Z0bV9wcm9jZXNzaW5nOgorCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gd2xhbl9oZGRfZnRtX29wZW4oaGRkX2N0eCkpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoIndsYW5faGRkX2Z0bV9vcGVuIEZhaWxlZCIpKTsKKwkJCWdvdG8gZXJyX2NvbmZpZzsKKwkJfQorI2lmICBkZWZpbmVkKFFDQV9XSUZJX0ZUTSkKKwkJaWYgKGhkZF9mdG1fc3RhcnQoaGRkX2N0eCkpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoImhkZF9mdG1fc3RhcnQgRmFpbGVkIikpOworCQkJZ290byBlcnJfZnJlZV9mdG1fb3BlbjsKKwkJfQorI2VuZGlmCisJCS8qIHJlZ2lzdHJhdGlvbiBvZiB3aXBoeSBkZXYgd2l0aCBjZmc4MDIxMSAqLworCQlpZiAoMCA+IHdsYW5faGRkX2NmZzgwMjExX3JlZ2lzdGVyKHdpcGh5KSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJ3aXBoeSByZWdpc3RlciBmYWlsZWQiKSk7CisJCQlnb3RvIGVycl9mcmVlX2Z0bV9vcGVuOworCQl9CisKKwkJY2RzX3NldF9sb2FkX3VubG9hZF9pbl9wcm9ncmVzcyhmYWxzZSk7CisJCWhkZF9jdHgtPmlzTG9hZEluUHJvZ3Jlc3MgPSBmYWxzZTsKKwkJaGRkTG9nKExPR0UsIEZMKCJGVE0gZHJpdmVyIGxvYWRlZCIpKTsKKwkJY29tcGxldGUoJndsYW5fc3RhcnRfY29tcCk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorI2lmIGRlZmluZWQoQ09ORklHX0hERF9JTklUX1dJVEhfUlROTF9MT0NLKQorCXJ0bmxfbG9jaygpOworCXJ0bmxfbG9ja19lbmFibGUgPSB0cnVlOworI2Vsc2UKKwlydG5sX2xvY2tfZW5hYmxlID0gZmFsc2U7CisjZW5kaWYKKworCWlmIChoZGRfY3R4LT5jb25maWctPmRvdDExcF9tb2RlID09IFdMQU5fSEREXzExUF9TVEFOREFMT05FKQorCQkvKiBDcmVhdGUgb25seSA4MDIuMTFwIGludGVyZmFjZSAqLworCQlhZGFwdGVyID0gaGRkX29wZW5fYWRhcHRlcihoZGRfY3R4LCBXTEFOX0hERF9PQ0IsICJ3bGFub2NiJWQiLAorCQkJCQkgICB3bGFuX2hkZF9nZXRfaW50Zl9hZGRyKGhkZF9jdHgpLAorCQkJCQkgICBydG5sX2xvY2tfZW5hYmxlKTsKKwllbHNlCisJCWFkYXB0ZXIgPSBoZGRfb3Blbl9hZGFwdGVyKGhkZF9jdHgsIFdMQU5fSEREX0lORlJBX1NUQVRJT04sCisJCQkJCSAgICJ3bGFuJWQiLAorCQkJCQkgICB3bGFuX2hkZF9nZXRfaW50Zl9hZGRyKGhkZF9jdHgpLAorCQkJCQkgICBydG5sX2xvY2tfZW5hYmxlKTsKKworI2lmZGVmIFdMQU5fT1BFTl9QMlBfSU5URVJGQUNFCisJLyogT3BlbiBQMlAgZGV2aWNlIGludGVyZmFjZSAqLworCWlmIChhZGFwdGVyICE9IE5VTEwpIHsKKwkJaWYgKGhkZF9jdHgtPmNvbmZpZy0+aXNQMnBEZXZpY2VBZGRyQWRtaW5pc3RyYXRlZCAmJgorCQkgICAhKGhkZF9jdHgtPmNvbmZpZy0+aW50Zk1hY0FkZHJbMF0uYnl0ZXNbMF0gJiAweDAyKSkgeworCQkJY2RmX21lbV9jb3B5KGhkZF9jdHgtPnAycERldmljZUFkZHJlc3MuYnl0ZXMsCisJCQkJICAgICBoZGRfY3R4LT5jb25maWctPmludGZNYWNBZGRyWzBdLmJ5dGVzLAorCQkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkJCS8qCisJCQkgKiBHZW5lcmF0ZSB0aGUgUDJQIERldmljZSBBZGRyZXNzLiAgVGhpcyBjb25zaXN0cyBvZgorCQkJICogdGhlIGRldmljZSdzIHByaW1hcnkgTUFDIGFkZHJlc3Mgd2l0aCB0aGUgbG9jYWxseQorCQkJICogYWRtaW5pc3RlcmVkIGJpdCBzZXQuCisJCQkgKi8KKwkJCWhkZF9jdHgtPnAycERldmljZUFkZHJlc3MuYnl0ZXNbMF0gfD0gMHgwMjsKKwkJfSBlbHNlIHsKKwkJCXVpbnQ4X3QgKnAycF9kZXZfYWRkciA9IHdsYW5faGRkX2dldF9pbnRmX2FkZHIoaGRkX2N0eCk7CisJCQlpZiAocDJwX2Rldl9hZGRyICE9IE5VTEwpIHsKKwkJCQljZGZfbWVtX2NvcHkoJmhkZF9jdHgtPnAycERldmljZUFkZHJlc3MuCisJCQkJCSAgICAgYnl0ZXNbMF0sIHAycF9kZXZfYWRkciwKKwkJCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJCQl9IGVsc2UgeworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkJICAgICAgIEZMKAorCQkJCQkgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWFjX2FkZHJlc3MgZm9yIHAycF9kZXZpY2UiCisJCQkJCSApKTsKKwkJCQlnb3RvIGVycl9jbG9zZV9hZGFwdGVyOworCQkJfQorCQl9CisKKwkJcFAyYWRhcHRlciA9CisJCQloZGRfb3Blbl9hZGFwdGVyKGhkZF9jdHgsIFdMQU5fSEREX1AyUF9ERVZJQ0UsICJwMnAlZCIsCisJCQkJCSAmaGRkX2N0eC0+cDJwRGV2aWNlQWRkcmVzcy5ieXRlc1swXSwKKwkJCQkJIHJ0bmxfbG9ja19lbmFibGUpOworCisJCWlmIChOVUxMID09IHBQMmFkYXB0ZXIpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoCisJCQkJICAiRmFpbGVkIHRvIGRvIGhkZF9vcGVuX2FkYXB0ZXIgZm9yIFAyUCBEZXZpY2UgSW50ZXJmYWNlIgorCQkJCSApKTsKKwkJCWdvdG8gZXJyX2Nsb3NlX2FkYXB0ZXI7CisJCX0KKwl9CisjZW5kaWYKKworCWlmIChhZGFwdGVyID09IE5VTEwpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoImhkZF9vcGVuX2FkYXB0ZXIgZmFpbGVkIikpOworCQlnb3RvIGVycl9jbG9zZV9hZGFwdGVyOworCX0KKworCS8qIE9wZW4gODAyLjExcCBJbnRlcmZhY2UgKi8KKwlpZiAoYWRhcHRlciAhPSBOVUxMKSB7CisJCWlmIChoZGRfY3R4LT5jb25maWctPmRvdDExcF9tb2RlID09IFdMQU5fSEREXzExUF9DT05DVVJSRU5UKSB7CisJCQlkb3QxMV9hZGFwdGVyID0gaGRkX29wZW5fYWRhcHRlcihoZGRfY3R4LCBXTEFOX0hERF9PQ0IsCisJCQkJCQkid2xhbm9jYiVkIiwKKwkJCQkJCXdsYW5faGRkX2dldF9pbnRmX2FkZHIoaGRkX2N0eCksCisJCQkJCQlydG5sX2xvY2tfZW5hYmxlKTsKKwkJCWlmIChkb3QxMV9hZGFwdGVyID09IE5VTEwpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoImZhaWxlZCB0byBvcGVuIDgwMi4xMXAgSW50ZXJmYWNlIikpOworCQkJCWdvdG8gZXJyX2Nsb3NlX2FkYXB0ZXI7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIHRhcmdldCBodyB2ZXJzaW9uL3JldmlzaW9uIHdvdWxkIG9ubHkgYmUgcmV0cmlldmVkIGFmdGVyIGZpcm13YXJlCisJICogZG9ud2xvYWQKKwkgKi8KKwloaWZfZ2V0X2h3X2luZm8oaGlmX3NjLCAmaGRkX2N0eC0+dGFyZ2V0X2h3X3ZlcnNpb24sCisJCQkmaGRkX2N0eC0+dGFyZ2V0X2h3X3JldmlzaW9uLAorCQkJJmhkZF9jdHgtPnRhcmdldF9od19uYW1lKTsKKworCS8qIEdldCB0aGUgd2xhbiBody9mdyB2ZXJzaW9uICovCisJaGRkX3dsYW5fZ2V0X3ZlcnNpb24oYWRhcHRlciwgTlVMTCwgTlVMTCk7CisKKwkvKiBwYXNzIHRhcmdldF9md192ZXJzaW9uIHRvIEhJRiBsYXllciAqLworCWhpZl9zZXRfZndfaW5mbyhoaWZfc2MsIGhkZF9jdHgtPnRhcmdldF9md192ZXJzaW9uKTsKKworCWlmIChjb3VudHJ5X2NvZGUpIHsKKwkJQ0RGX1NUQVRVUyByZXQ7CisKKwkJSU5JVF9DT01QTEVUSU9OKGFkYXB0ZXItPmNoYW5nZV9jb3VudHJ5X2NvZGUpOworCisJCXJldCA9IHNtZV9jaGFuZ2VfY291bnRyeV9jb2RlKGhkZF9jdHgtPmhIYWwsCisJCQkJCSAgICAgIHdsYW5faGRkX2NoYW5nZV9jb3VudHJ5X2NvZGVfY2FsbGJhY2ssCisJCQkJCSAgICAgIGNvdW50cnlfY29kZSwgYWRhcHRlciwKKwkJCQkJICAgICAgaGRkX2N0eC0+cGNkc19jb250ZXh0LCBlU0lSX1RSVUUsCisJCQkJCSAgICAgIGVTSVJfVFJVRSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gcmV0KSB7CisJCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCQkmYWRhcHRlci0+Y2hhbmdlX2NvdW50cnlfY29kZSwKKwkJCQltc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX0NPVU5UUlkpKTsKKwkJCWlmICghcmMpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoIlNNRSB3aGlsZSBzZXR0aW5nIGNvdW50cnkgY29kZSB0aW1lZCBvdXQiKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIEZMKAorCQkJCSAgIlNNRSBDaGFuZ2UgQ291bnRyeSBjb2RlIGZyb20gbW9kdWxlIHBhcmFtIGZhaWwgcmV0PSVkIgorCQkJCSApLAorCQkJICAgICAgIHJldCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfQorCisJc21lX3JlZ2lzdGVyMTFkX3NjYW5fZG9uZV9jYWxsYmFjayhoZGRfY3R4LT5oSGFsLCBoZGRfMTFkX3NjYW5fZG9uZSk7CisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKwlzbWVfcmVnaXN0ZXJfb2VtX2RhdGFfcnNwX2NhbGxiYWNrKGhkZF9jdHgtPmhIYWwsCisJCQkJCWhkZF9zZW5kX29lbV9kYXRhX3JzcF9tc2cpOworI2VuZGlmCisKKwkvKiBPcGVuIGRlYnVnZnMgaW50ZXJmYWNlICovCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBoZGRfZGVidWdmc19pbml0KGFkYXB0ZXIpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiaGRkX2RlYnVnZnNfaW5pdCBmYWlsZWQhIikpOworCX0KKworCS8qIEZXIGNhcGFiaWxpdGllcyByZWNlaXZlZCwgU2V0IHRoZSBEb3QxMSBtb2RlICovCisJc21lX3NldGRlZl9kb3QxMW1vZGUoaGRkX2N0eC0+aEhhbCk7CisjaWYgIWRlZmluZWQoQ09ORklHX0hERF9JTklUX1dJVEhfUlROTF9MT0NLKQorCS8qIHJlZ2lzdGVyIG5ldCBkZXZpY2Ugbm90aWZpZXIgZm9yIGRldmljZSBjaGFuZ2Ugbm90aWZpY2F0aW9uICovCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZoZGRfbmV0ZGV2X25vdGlmaWVyKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgicmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyIGZhaWxlZCIpKTsKKwkJZ290byBlcnJfZnJlZV9wb3dlcl9vbl9sb2NrOworCX0KKwlyZWdfbmV0ZGV2X25vdGlmaWVyX2RvbmUgPSB0cnVlOworI2VuZGlmCisJLyogSW5pdGlhbGl6ZSB0aGUgbmxpbmsgc2VydmljZSAqLworCWlmIChubF9zcnZfaW5pdCgpICE9IDApIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgRkwoIm5sX3Nydl9pbml0IGZhaWxlZCIpKTsKKwkJZ290byBlcnJfcmVnX25ldGRldjsKKwl9CisjaWZkZWYgV0xBTl9LRF9SRUFEWV9OT1RJRklFUgorCWhkZF9jdHgtPmtkX25sX2luaXQgPSAxOworI2VuZGlmIC8qIFdMQU5fS0RfUkVBRFlfTk9USUZJRVIgKi8KKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCS8qIEluaXRpYWxpemUgdGhlIE9FTSBzZXJ2aWNlICovCisJaWYgKG9lbV9hY3RpdmF0ZV9zZXJ2aWNlKGhkZF9jdHgpICE9IDApIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJICAgICAgIEZMKCJvZW1fYWN0aXZhdGVfc2VydmljZSBmYWlsZWQiKSk7CisJCWdvdG8gZXJyX25sX3NydjsKKwl9CisjZW5kaWYKKworI2lmZGVmIFBUVF9TT0NLX1NWQ19FTkFCTEUKKwkvKiBJbml0aWFsaXplIHRoZSBQVFQgc2VydmljZSAqLworCWlmIChwdHRfc29ja19hY3RpdmF0ZV9zdmMoKSAhPSAwKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCSAgICAgICBGTCgicHR0X3NvY2tfYWN0aXZhdGVfc3ZjIGZhaWxlZCIpKTsKKwkJZ290byBlcnJfbmxfc3J2OworCX0KKyNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSB0aGUgQ05TUy1ESUFHIHNlcnZpY2UgKi8KKwlpZiAoY25zc19kaWFnX2FjdGl2YXRlX3NlcnZpY2UoKSA8IDApIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJICAgICAgIEZMKCJjbnNzX2RpYWdfYWN0aXZhdGVfc2VydmljZSBmYWlsZWQiKSk7CisJCWdvdG8gZXJyX25sX3NydjsKKwl9CisjaWZkZWYgV0xBTl9MT0dHSU5HX1NPQ0tfU1ZDX0VOQUJMRQorCWlmIChoZGRfY3R4LT5jb25maWctPndsYW5Mb2dnaW5nRW5hYmxlKSB7CisJCWlmICh3bGFuX2xvZ2dpbmdfc29ja19hY3RpdmF0ZV9zdmMKKwkJCSAgICAoaGRkX2N0eC0+Y29uZmlnLT53bGFuTG9nZ2luZ0ZFVG9Db25zb2xlLAorCQkJICAgIGhkZF9jdHgtPmNvbmZpZy0+d2xhbkxvZ2dpbmdOdW1CdWYpKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIEZMKCJ3bGFuX2xvZ2dpbmdfc29ja19hY3RpdmF0ZV9zdmMgZmFpbGVkIikpOworCQkJZ290byBlcnJfbmxfc3J2OworCQl9CisJfQorI2VuZGlmCisJaWYgKGNkc19pc19tdWx0aWNhc3RfbG9nZ2luZygpKQorCQl3bGFuX2xvZ2dpbmdfc2V0X2xvZ19sZXZlbCgpOworCisJaWYgKENERl9TQVBfTU9ERSAhPSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJLyoKKwkJICogQWN0aW9uIGZyYW1lIHJlZ2lzdGVyZWQgaW4gb25lIGFkYXB0ZXIgd2hpY2ggd2lsbAorCQkgKiBhcHBsaWNhYmxlIHRvIGFsbCBpbnRlcmZhY2VzCisJCSAqLworCQl3bGFuX2hkZF9jZmc4MDIxMV9yZWdpc3Rlcl9mcmFtZXMoYWRhcHRlcik7CisJfQorCisJbXV0ZXhfaW5pdCgmaGRkX2N0eC0+c2FwX2xvY2spOworCisJaGRkX2N0eC0+aXNMb2FkSW5Qcm9ncmVzcyA9IGZhbHNlOworCisjaWYgZGVmaW5lZChDT05GSUdfSEREX0lOSVRfV0lUSF9SVE5MX0xPQ0spCisJaWYgKHJ0bmxfbG9ja19lbmFibGUgPT0gdHJ1ZSkgeworCQlydG5sX2xvY2tfZW5hYmxlID0gZmFsc2U7CisJCXJ0bmxfdW5sb2NrKCk7CisJfQorCXJldCA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaGRkX25ldGRldl9ub3RpZmllcik7CisJaWYgKHJldCA8IDApIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIgZmFpbGVkIikpOworCQlnb3RvIGVycl9ubF9zcnY7CisJfQorCXJlZ19uZXRkZXZfbm90aWZpZXJfZG9uZSA9IHRydWU7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfSE9MRF9SWF9XQUtFTE9DSworCS8qIEluaXRpYWxpemUgdGhlIHdha2UgbGNvayAqLworCWNkZl93YWtlX2xvY2tfaW5pdCgmaGRkX2N0eC0+cnhfd2FrZV9sb2NrLCAicWNvbV9yeF93YWtlbG9jayIpOworI2VuZGlmCisJLyogSW5pdGlhbGl6ZSB0aGUgd2FrZSBsY29rICovCisJY2RmX3dha2VfbG9ja19pbml0KCZoZGRfY3R4LT5zYXBfd2FrZV9sb2NrLCAicWNvbV9zYXBfd2FrZWxvY2siKTsKKworCWhkZF9ob3N0YXBkX2NoYW5uZWxfd2FrZWxvY2tfaW5pdChoZGRfY3R4KTsKKworCWNkc19zZXRfbG9hZF91bmxvYWRfaW5fcHJvZ3Jlc3MoZmFsc2UpOworCisJaGRkX3NldF9pZGxlX3BzX2NvbmZpZyhoZGRfY3R4LCB0cnVlKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgorCWlmIChoZGRfY3R4LT5jb25maWctPldsYW5BdXRvU2h1dGRvd24gIT0gMCkKKwkJaWYgKHNtZV9zZXRfYXV0b19zaHV0ZG93bl9jYgorCQkJICAgIChoZGRfY3R4LT5oSGFsLCB3bGFuX2hkZF9hdXRvX3NodXRkb3duX2NiKQorCQkgICAgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoCisJCQkJICAiQXV0byBzaHV0ZG93biBmZWF0dXJlIGNvdWxkIG5vdCBiZSBlbmFibGVkIgorCQkJCSApKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FQX0FQX0FDU19PUFRJTUlaRQorCXN0YXR1cyA9IGNkZl9tY190aW1lcl9pbml0KCZoZGRfY3R4LT5za2lwX2Fjc19zY2FuX3RpbWVyLAorCQkJCSAgIENERl9USU1FUl9UWVBFX1NXLAorCQkJCSAgIGhkZF9za2lwX2Fjc19zY2FuX3RpbWVyX2hhbmRsZXIsCisJCQkJICAgKHZvaWQgKiloZGRfY3R4KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQloZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBpbml0IEFDUyBTa2lwIHRpbWVyIikpOworI2VuZGlmCisKKwloZGRfd2xhbl9ncmVlbl9hcF9pbml0KGhkZF9jdHgpOworCXdsYW5faGRkX25hbl9pbml0KGhkZF9jdHgpOworCXN0YXR1cyA9IGNkc19pbml0X3BvbGljeV9tZ3IoaGRkX2N0eCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloZGRfZXJyKCJQb2xpY3kgbWFuYWdlciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJZ290byBlcnJfbmxfc3J2OworCX0KKworCS8qIFRoZXJtYWwgTWl0aWdhdGlvbiAqLworCXRoZXJtYWxQYXJhbS5zbWVUaGVybWFsTWdtdEVuYWJsZWQgPQorCQloZGRfY3R4LT5jb25maWctPnRoZXJtYWxNaXRpZ2F0aW9uRW5hYmxlOworCXRoZXJtYWxQYXJhbS5zbWVUaHJvdHRsZVBlcmlvZCA9IGhkZF9jdHgtPmNvbmZpZy0+dGhyb3R0bGVQZXJpb2Q7CisKKwl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1swXS5zbWVNaW5UZW1wVGhyZXNob2xkID0KKwkJaGRkX2N0eC0+Y29uZmlnLT50aGVybWFsVGVtcE1pbkxldmVsMDsKKwl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1swXS5zbWVNYXhUZW1wVGhyZXNob2xkID0KKwkJaGRkX2N0eC0+Y29uZmlnLT50aGVybWFsVGVtcE1heExldmVsMDsKKwl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1sxXS5zbWVNaW5UZW1wVGhyZXNob2xkID0KKwkJaGRkX2N0eC0+Y29uZmlnLT50aGVybWFsVGVtcE1pbkxldmVsMTsKKwl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1sxXS5zbWVNYXhUZW1wVGhyZXNob2xkID0KKwkJaGRkX2N0eC0+Y29uZmlnLT50aGVybWFsVGVtcE1heExldmVsMTsKKwl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1syXS5zbWVNaW5UZW1wVGhyZXNob2xkID0KKwkJaGRkX2N0eC0+Y29uZmlnLT50aGVybWFsVGVtcE1pbkxldmVsMjsKKwl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1syXS5zbWVNYXhUZW1wVGhyZXNob2xkID0KKwkJaGRkX2N0eC0+Y29uZmlnLT50aGVybWFsVGVtcE1heExldmVsMjsKKwl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1szXS5zbWVNaW5UZW1wVGhyZXNob2xkID0KKwkJaGRkX2N0eC0+Y29uZmlnLT50aGVybWFsVGVtcE1pbkxldmVsMzsKKwl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1szXS5zbWVNYXhUZW1wVGhyZXNob2xkID0KKwkJaGRkX2N0eC0+Y29uZmlnLT50aGVybWFsVGVtcE1heExldmVsMzsKKworCWlmICgwICE9IGhkZF9scm9faW5pdChoZGRfY3R4KSkKKwkJaGRkX2VycigiVW5hYmxlIHRvIGluaXRpYWxpemUgTFJPIGluIGZ3Iik7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJICAgIHNtZV9pbml0X3RoZXJtYWxfaW5mbyhoZGRfY3R4LT5oSGFsLCB0aGVybWFsUGFyYW0pKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiRXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nIHRoZXJtYWwgaW5mb3JtYXRpb24iKSk7CisJfQorCisJLyogUGx1ZyBpbiBzZXQgdGhlcm1hbCBsZXZlbCBjYWxsYmFjayAqLworCXNtZV9hZGRfc2V0X3RoZXJtYWxfbGV2ZWxfY2FsbGJhY2soaGRkX2N0eC0+aEhhbCwKKwkJKHNtZV9zZXRfdGhlcm1hbF9sZXZlbF9jYWxsYmFjayloZGRfc2V0X3RoZXJtYWxfbGV2ZWxfY2IpOworCisJLyogU0FSIHBvd2VyIGxpbWl0ICovCisJaGRkdHhsaW1pdCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyVHhQb3dlckxpbWl0KSk7CisJaWYgKCFoZGR0eGxpbWl0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiTWVtb3J5IGFsbG9jYXRpb24gZm9yIFR4UG93ZXJMaW1pdCBmYWlsZWQhIikpOworCQlnb3RvIGVycl9ubF9zcnY7CisJfQorCWhkZHR4bGltaXQtPnR4UG93ZXIyZyA9IGhkZF9jdHgtPmNvbmZpZy0+VHhQb3dlcjJnOworCWhkZHR4bGltaXQtPnR4UG93ZXI1ZyA9IGhkZF9jdHgtPmNvbmZpZy0+VHhQb3dlcjVnOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzbWVfdHhwb3dlcl9saW1pdChoZGRfY3R4LT5oSGFsLCBoZGR0eGxpbWl0KSkKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJFcnJvciBzZXR0aW5nIHR4bGltaXQgaW4gc21lIikpOworCisjaWZkZWYgTVNNX1BMQVRGT1JNCisJc3Bpbl9sb2NrX2luaXQoJmhkZF9jdHgtPmJ1c19id19sb2NrKTsKKwljZGZfbWNfdGltZXJfaW5pdCgmaGRkX2N0eC0+YnVzX2J3X3RpbWVyLAorCQkJICBDREZfVElNRVJfVFlQRV9TVywKKwkJCSAgaGRkX2J1c19id19jb21wdXRlX2NiaywgKHZvaWQgKiloZGRfY3R4KTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1NUQVRTX0VYVAorCXdsYW5faGRkX2NmZzgwMjExX3N0YXRzX2V4dF9pbml0KGhkZF9jdHgpOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwlzbWVfZXh0X3NjYW5fcmVnaXN0ZXJfY2FsbGJhY2soaGRkX2N0eC0+aEhhbCwKKwkJCQkgICAgICAgd2xhbl9oZGRfY2ZnODAyMTFfZXh0c2Nhbl9jYWxsYmFjayk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VYVFNDQU4gKi8KKwlzbWVfc2V0X3Jzc2lfdGhyZXNob2xkX2JyZWFjaGVkX2NiKGhkZF9jdHgtPmhIYWwsCisJCQkJaGRkX3Jzc2lfdGhyZXNob2xkX2JyZWFjaGVkKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUworCXdsYW5faGRkX2NmZzgwMjExX2xpbmtfbGF5ZXJfc3RhdHNfaW5pdChoZGRfY3R4KTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0xQU1MKKwl3bGFuX2hkZF9zZW5kX2FsbF9zY2FuX2ludGZfaW5mbyhoZGRfY3R4KTsKKwl3bGFuX2hkZF9zZW5kX3ZlcnNpb25fcGtnKGhkZF9jdHgtPnRhcmdldF9md192ZXJzaW9uLAorCQkJCSAgaGRkX2N0eC0+dGFyZ2V0X2h3X3ZlcnNpb24sCisJCQkJICBoZGRfY3R4LT50YXJnZXRfaHdfbmFtZSk7CisjZW5kaWYKKworCWNkZl9zcGlubG9ja19pbml0KCZoZGRfY3R4LT5oZGRfcm9jX3JlcV9xX2xvY2spOworCWNkZl9saXN0X2luaXQoKCZoZGRfY3R4LT5oZGRfcm9jX3JlcV9xKSwgTUFYX1JPQ19SRVFfUVVFVUVfRU5UUlkpOworCWNkZl9zcGlubG9ja19pbml0KCZoZGRfY3R4LT5oZGRfc2Nhbl9yZXFfcV9sb2NrKTsKKwljZGZfbGlzdF9pbml0KCgmaGRkX2N0eC0+aGRkX3NjYW5fcmVxX3EpLCBDRkdfTUFYX1NDQU5fQ09VTlRfTUFYKTsKKyNpZmRlZiBDT05GSUdfQ05TUworCWNuc3NfaW5pdF9kZWxheWVkX3dvcmsoJmhkZF9jdHgtPnJvY19yZXFfd29yaywKKwkJCXdsYW5faGRkX3JvY19yZXF1ZXN0X2RlcXVldWUpOworI2Vsc2UKKwlJTklUX0RFTEFZRURfV09SSygmaGRkX2N0eC0+cm9jX3JlcV93b3JrLCB3bGFuX2hkZF9yb2NfcmVxdWVzdF9kZXF1ZXVlKTsKKyNlbmRpZgorCisJLyoKKwkgKiBSZWdpc3RlciBJUHY2IG5vdGlmaWVyIHRvIG5vdGlmeSBpZiBhbnkgY2hhbmdlIGluIElQCisJICogU28gdGhhdCB3ZSBjYW4gcmVjb25maWd1cmUgdGhlIG9mZmxvYWQgcGFyYW1ldGVycworCSovCisJaGRkX3dsYW5fcmVnaXN0ZXJfaXA2X25vdGlmaWVyKGhkZF9jdHgpOworCisJLyoKKwkgKiBSZWdpc3RlciBJUHY0IG5vdGlmaWVyIHRvIG5vdGlmeSBpZiBhbnkgY2hhbmdlIGluIElQCisJICogU28gdGhhdCB3ZSBjYW4gcmVjb25maWd1cmUgdGhlIG9mZmxvYWQgcGFyYW1ldGVycworCSAqLworCWhkZF9jdHgtPmlwdjRfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IHdsYW5faGRkX2lwdjRfY2hhbmdlZDsKKwlyZXQgPSByZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmaGRkX2N0eC0+aXB2NF9ub3RpZmllcik7CisJaWYgKHJldCkKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gcmVnaXN0ZXIgSVB2NCBub3RpZmllciIpKTsKKwllbHNlCisJCWhkZExvZyhMT0dFLCBGTCgiUmVnaXN0ZXJlZCBJUHY0IG5vdGlmaWVyIikpOworCisJd2xhbl9oZGRfZGNjX3JlZ2lzdGVyX2Zvcl9kY2Nfc3RhdHNfZXZlbnQoaGRkX2N0eCk7CisKKwlpZiAoaGRkX2N0eC0+Y29uZmlnLT5kdWFsX21hY19mZWF0dXJlX2Rpc2FibGUpIHsKKwkJc3RhdHVzID0gd2xhbl9oZGRfZGlzYWJsZV9hbGxfZHVhbF9tYWNfZmVhdHVyZXMoaGRkX2N0eCk7CisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQloZGRfZXJyKCJGYWlsZWQgdG8gZGlzYWJsZSBkdWFsIG1hYyBmZWF0dXJlcyIpOworCQkJZ290byBlcnJfbmxfc3J2OworCQl9CisJfQorCisJaGlmX2VuYWJsZV9wb3dlcl9nYXRpbmcoaGlmX3NjKTsKKworCWNvbXBsZXRlKCZ3bGFuX3N0YXJ0X2NvbXApOworCWdvdG8gc3VjY2VzczsKKworZXJyX25sX3NydjoKKyNpZmRlZiBXTEFOX0tEX1JFQURZX05PVElGSUVSCisJY25zc19kaWFnX25vdGlmeV93bGFuX2Nsb3NlKCk7CisJcHR0X3NvY2tfZGVhY3RpdmF0ZV9zdmMoKTsKKyNlbmRpZiAvKiBXTEFOX0tEX1JFQURZX05PVElGSUVSICovCisJbmxfc3J2X2V4aXQoKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCQkoY2RmX211dGV4X2Rlc3Ryb3koJmhkZF9jdHgtPmhkZF9jb25jX2xpc3RfbG9jaykpKSB7CisJCWhkZF9lcnIoIkZhaWxlZCB0byBkZXN0cm95IGhkZF9jb25jX2xpc3RfbG9jayIpOworCQkvKiBQcm9jZWVkIGFuZCBjb21wbGV0ZSB0aGUgY2xlYW4gdXAgKi8KKwl9CitlcnJfcmVnX25ldGRldjoKKwlpZiAocnRubF9sb2NrX2VuYWJsZSA9PSB0cnVlKSB7CisJCXJ0bmxfbG9ja19lbmFibGUgPSBmYWxzZTsKKwkJcnRubF91bmxvY2soKTsKKwl9CisJaWYgKHJlZ19uZXRkZXZfbm90aWZpZXJfZG9uZSA9PSB0cnVlKSB7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmhkZF9uZXRkZXZfbm90aWZpZXIpOworCQlyZWdfbmV0ZGV2X25vdGlmaWVyX2RvbmUgPSBmYWxzZTsKKwl9CisjaWYgIWRlZmluZWQoQ09ORklHX0hERF9JTklUX1dJVEhfUlROTF9MT0NLKQorZXJyX2ZyZWVfcG93ZXJfb25fbG9jazoKKyNlbmRpZgorCWhkZF9kZWJ1Z2ZzX2V4aXQoaGRkX2N0eCk7CisKK2Vycl9jbG9zZV9hZGFwdGVyOgorI2lmIGRlZmluZWQoQ09ORklHX0hERF9JTklUX1dJVEhfUlROTF9MT0NLKQorCWlmIChydG5sX2xvY2tfZW5hYmxlID09IHRydWUpIHsKKwkJcnRubF9sb2NrX2VuYWJsZSA9IGZhbHNlOworCQlydG5sX3VubG9jaygpOworCX0KKyNlbmRpZgorCWhkZF9jbG9zZV9hbGxfYWRhcHRlcnMoaGRkX2N0eCk7CisKK2Vycl9jZHNfZGlzYWJsZToKKwljZHNfZGlzYWJsZShwX2Nkc19jb250ZXh0KTsKKworZXJyX3dpcGh5X3VucmVnaXN0ZXI6CisJd2lwaHlfdW5yZWdpc3Rlcih3aXBoeSk7CisKK2Vycl9jZHNfY2xvc2U6CisJc3RhdHVzID0gY2RzX3NjaGVkX2Nsb3NlKHBfY2RzX2NvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJICAgICAgIEZMKCJGYWlsZWQgdG8gY2xvc2UgQ0RTIFNjaGVkdWxlciIpKTsKKwkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSk7CisJfQorCWNkc19jbG9zZShwX2Nkc19jb250ZXh0KTsKKworZXJyX2Nkc19vcGVuOgorCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKyNpZiAgZGVmaW5lZChRQ0FfV0lGSV9GVE0pCitlcnJfZnJlZV9mdG1fb3BlbjoKKwkJd2xhbl9oZGRfZnRtX2Nsb3NlKGhkZF9jdHgpOworI2VuZGlmCisJfQorCitlcnJfY29uZmlnOgorCWtmcmVlKGhkZF9jdHgtPmNvbmZpZyk7CisJaGRkX2N0eC0+Y29uZmlnID0gTlVMTDsKKworZXJyX2ZyZWVfaGRkX2NvbnRleHQ6CisJLyogd2lwaHlfZnJlZSgpIHdpbGwgZnJlZSB0aGUgSEREIGNvbnRleHQgc28gcmVtb3ZlIGdsb2JhbCByZWZlcmVuY2UgKi8KKwlpZiAocF9jZHNfY29udGV4dCkKKwkJKChjZHNfY29udGV4dF90eXBlICopIChwX2Nkc19jb250ZXh0KSktPnBIRERDb250ZXh0ID0gTlVMTDsKKworCXdpcGh5X2ZyZWUod2lwaHkpOworCS8qIGtmcmVlKHdkZXYpIDsgKi8KKwlDREZfQlVHKDEpOworCisJaWYgKGhkZF9pc19zc3JfcmVxdWlyZWQoKSkgeworI2lmZGVmIE1TTV9QTEFURk9STQorI2lmZGVmIENPTkZJR19DTlNTCisJCS8qCisJCSAqIFdESSB0aW1lb3V0IGhhZCBoYXBwZW5lZCBkdXJpbmcgbG9hZCwgc28gU1NSIGlzIG5lZWRlZAorCQkgKiBoZXJlCisJCSAqLworCQlzdWJzeXN0ZW1fcmVzdGFydCgid2Nuc3MiKTsKKyNlbmRpZgorI2VuZGlmCisJCW1zbGVlcCg1MDAwKTsKKwl9CisJaGRkX3NldF9zc3JfcmVxdWlyZWQoZmFsc2UpOworCisJcmV0dXJuIC1FSU87CisKK3N1Y2Nlc3M6CisJRVhJVCgpOworCXJldHVybiAwOworfQorCisvKgorICogSW4gQk1JIFBoYXNlIHdlIGFyZSBvbmx5IHNlbmRpbmcgc21hbGwgY2h1bmsgKDI1NiBieXRlcykgb2YgdGhlIEZXIGltYWdlIGF0CisgKiBhIHRpbWUsIGFuZCB3YWl0IGZvciB0aGUgY29tcGxldGlvbiBpbnRlcnJ1cHQgdG8gc3RhcnQgdGhlIG5leHQgdHJhbnNmZXIuCisgKiBEdXJpbmcgdGhpcyBwaGFzZSwgdGhlIEtSQUlUIGlzIGVudGVyaW5nIElETEUvU3RhbmRBbG9uZShTQSkgUG93ZXIgU2F2ZShQUykuCisgKiBUaGUgZGVsYXkgaW5jdXJyZWQgZm9yIHJlc3VtaW5nIGZyb20gSURMRS9TQSBQUyBpcyBodWdlIGR1cmluZyBkcml2ZXIgbG9hZC4KKyAqIFNvIHByZXZlbnQgQVBQUyBJRExFL1NBIFBTIGR1cmludCBkcml2ZXIgbG9hZCBmb3IgcmVkdWNpbmcgaW50ZXJydXB0IGxhdGVuY3kuCisgKi8KKworI2lmZGVmIENPTkZJR19DTlNTCitzdGF0aWMgaW5saW5lIHZvaWQgaGRkX3JlcXVlc3RfcG1fcW9zKGludCB2YWwpCit7CisJY25zc19yZXF1ZXN0X3BtX3Fvcyh2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGRkX3JlbW92ZV9wbV9xb3Modm9pZCkKK3sKKwljbnNzX3JlbW92ZV9wbV9xb3MoKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgaGRkX3JlcXVlc3RfcG1fcW9zKGludCB2YWwpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZGRfcmVtb3ZlX3BtX3Fvcyh2b2lkKQoreworfQorI2VuZGlmCisKKy8qKgorICogaGRkX2RyaXZlcl9pbml0KCkgLSBDb3JlIERyaXZlciBJbml0IEZ1bmN0aW9uCisgKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGVudHJ5IHBvaW50IC0gY2FsbGVkIGluIGRpZmZlcmVudCB0aW1lbGluZSBkZXBlbmRpbmcKKyAqIG9uIHdoZXRoZXIgdGhlIGRyaXZlciBpcyBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IGxpbmtlZAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoZGRfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl2X0NPTlRFWFRfdCBwX2Nkc19jb250ZXh0ID0gTlVMTDsKKwlpbnQgcmV0X3N0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyByYzsKKworI2lmZGVmIFdMQU5fTE9HR0lOR19TT0NLX1NWQ19FTkFCTEUKKwl3bGFuX2xvZ2dpbmdfc29ja19pbml0X3N2YygpOworI2VuZGlmCisKKwlFTlRFUigpOworCisJY2RmX3dha2VfbG9ja19pbml0KCZ3bGFuX3dha2VfbG9jaywgIndsYW4iKTsKKwloZGRfcHJldmVudF9zdXNwZW5kKFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfRFJJVkVSX0lOSVQpOworCS8qCisJKiBUaGUgS3JhaXQgaXMgZ29pbmcgdG8gSWRsZS9TdGFuZCBBbG9uZSBQb3dlciBTYXZlCisJKiBtb3JlIGFnZ3Jlc3NpdmVseSB3aGljaCBpcyByZXN1bHRpbmcgaW4gdGhlIGxvbmdlciBkcml2ZXIgbG9hZCB0aW1lLgorCSogVGhlIEZpeCBpcyB0byBub3QgYWxsb3cgS3JhaXQgdG8gZW50ZXIgSWRsZSBQb3dlciBTYXZlIGR1cmluZyBkcml2ZXIKKwkqIGxvYWQuCisJKi8KKwloZGRfcmVxdWVzdF9wbV9xb3MoRElTQUJMRV9LUkFJVF9JRExFX1BTX1ZBTCk7CisJY2RzX3Nzcl9wcm90ZWN0X2luaXQoKTsKKworCXByX2luZm8oIiVzOiBsb2FkaW5nIGRyaXZlciB2JXNcbiIsIFdMQU5fTU9EVUxFX05BTUUsCisJCVFXTEFOX1ZFUlNJT05TVFIgVElNRVJfTUFOQUdFUl9TVFIgTUVNT1JZX0RFQlVHX1NUUik7CisKKwlkbyB7CisJCWNkZl9tY190aW1lcl9tYW5hZ2VyX2luaXQoKTsKKwkJY2RmX21lbV9pbml0KCk7CisJCS8qIEFsbG9jYXRlIENEUyBnbG9iYWwgY29udGV4dCAqLworCQlzdGF0dXMgPSBjZHNfYWxsb2NfZ2xvYmFsX2NvbnRleHQoJnBfY2RzX2NvbnRleHQpOworCisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoIkZhaWxlZCB0byBwcmVPcGVuIENEUyIpKTsKKwkJCXJldF9zdGF0dXMgPSAtMTsKKwkJCWJyZWFrOworCQl9CisKKwkJaGRkX3RyYWNlX2luaXQoKTsKKworI2lmbmRlZiBNT0RVTEUKKwkJLyoKKwkJICogRm9yIHN0YXRpY2FsbHkgbGlua2VkIGRyaXZlciwgY2FsbCBoZGRfc2V0X2NvbnBhcmFtIHRvIHVwZGF0ZQorCQkgKiBjdXJyX2Nvbl9tb2RlCisJCSAqLworCQloZGRfc2V0X2NvbnBhcmFtKCh1aW50MzJfdCkgY29uX21vZGUpOworI2VuZGlmCisKKyNpZmRlZiBRQ0FfV0lGSV8zXzBfQURSQVNURUEKKyNkZWZpbmUgSEREX1dMQU5fU1RBUlRfV0FJVF9USU1FICgzNjAwICogMTAwMCkKKyNlbHNlCisjZGVmaW5lIEhERF9XTEFOX1NUQVJUX1dBSVRfVElNRSAoQ0RTX1dNQV9USU1FT1VUICsgNTAwMCkKKyNlbmRpZgorCisJCWluaXRfY29tcGxldGlvbigmd2xhbl9zdGFydF9jb21wKTsKKwkJcmV0X3N0YXR1cyA9IHdsYW5faGRkX3JlZ2lzdGVyX2RyaXZlcigpOworCQlpZiAoIXJldF9zdGF0dXMpIHsKKwkJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAorCQkJCSZ3bGFuX3N0YXJ0X2NvbXAsCisJCQkJbXNlY3NfdG9famlmZmllcyhIRERfV0xBTl9TVEFSVF9XQUlUX1RJTUUpKTsKKwkJCWlmICghcmMpIHsKKwkJCQloZGRMb2coTE9HUCwKKwkJCQkJRkwoInRpbWVkLW91dCB3YWl0aW5nIGZvciB3bGFuX2hkZF9yZWdpc3Rlcl9kcml2ZXIiKSk7CisJCQkJcmV0X3N0YXR1cyA9IC0xOworCQkJfSBlbHNlCisJCQkJcmV0X3N0YXR1cyA9IDA7CisJCX0KKworCQloZGRfcmVtb3ZlX3BtX3FvcygpOworCQloZGRfYWxsb3dfc3VzcGVuZChXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX0RSSVZFUl9JTklUKTsKKworCQlpZiAocmV0X3N0YXR1cykgeworCQkJaGRkTG9nKExPR1AsIEZMKCJXTEFOIERyaXZlciBJbml0aWFsaXphdGlvbiBmYWlsZWQiKSk7CisJCQl3bGFuX2hkZF91bnJlZ2lzdGVyX2RyaXZlcigpOworCQkJY2RzX2ZyZWVfZ2xvYmFsX2NvbnRleHQoJnBfY2RzX2NvbnRleHQpOworCQkJcmV0X3N0YXR1cyA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXByX2luZm8oIiVzOiBkcml2ZXIgbG9hZGVkXG4iLCBXTEFOX01PRFVMRV9OQU1FKTsKKwkJCW1lbWR1bXBfaW5pdCgpOworCQkJcmV0dXJuIDA7CisJCX0KKworCX0gd2hpbGUgKDApOworCisJaWYgKDAgIT0gcmV0X3N0YXR1cykgeworCQljZGZfbWNfdGltZXJfZXhpdCgpOworCQljZGZfbWVtX2V4aXQoKTsKKwkJY2RmX3dha2VfbG9ja19kZXN0cm95KCZ3bGFuX3dha2VfbG9jayk7CisKKyNpZmRlZiBXTEFOX0xPR0dJTkdfU09DS19TVkNfRU5BQkxFCisJCXdsYW5fbG9nZ2luZ19zb2NrX2RlaW5pdF9zdmMoKTsKKyNlbmRpZgorCQltZW1kdW1wX2RlaW5pdCgpOworCQlwcl9lcnIoIiVzOiBkcml2ZXIgbG9hZCBmYWlsdXJlXG4iLCBXTEFOX01PRFVMRV9OQU1FKTsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCIlczogZHJpdmVyIGxvYWRlZFxuIiwgV0xBTl9NT0RVTEVfTkFNRSk7CisJfQorCisJRVhJVCgpOworCisJcmV0dXJuIHJldF9zdGF0dXM7Cit9CisKKy8qKgorICogaGRkX21vZHVsZV9pbml0KCkgLSBJbml0IEZ1bmN0aW9uCisgKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGVudHJ5IHBvaW50IChpbnZva2VkIHdoZW4gbW9kdWxlIGlzIGxvYWRlZCB1c2luZyBpbnNtb2QpCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICovCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBoZGRfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGRkX2RyaXZlcl9pbml0KCk7Cit9CisjZWxzZSAvKiAjaWZkZWYgTU9EVUxFICovCitzdGF0aWMgaW50IF9faW5pdCBoZGRfbW9kdWxlX2luaXQodm9pZCkKK3sKKwkvKiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gaXMgZGVsYXllZCB0byBmd3BhdGhfY2hhbmdlZF9oYW5kbGVyICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogI2lmZGVmIE1PRFVMRSAqLworCisvKioKKyAqIGhkZF9kcml2ZXJfZXhpdCgpIC0gRXhpdCBmdW5jdGlvbgorICoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBleGl0IHBvaW50IChpbnZva2VkIHdoZW4gbW9kdWxlIGlzIHVubG9hZGVkIHVzaW5nIHJtbW9kCisgKiBvciBjb25fbW9kZSB3YXMgY2hhbmdlZCBieSB1c2Vyc3BhY2UpCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9kcml2ZXJfZXhpdCh2b2lkKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBOVUxMOworCWludCByZXRyeSA9IDA7CisKKwlwcl9pbmZvKCIlczogdW5sb2FkaW5nIGRyaXZlciB2JXNcbiIsIFdMQU5fTU9EVUxFX05BTUUsCisJCVFXTEFOX1ZFUlNJT05TVFIpOworCisJaGRkX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJaWYgKCFoZGRfY3R4KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCSAgICAgICBGTCgibW9kdWxlIGV4aXQgY2FsbGVkIGJlZm9yZSBwcm9iZSIpKTsKKwl9IGVsc2UgeworI2lmZGVmIFFDQV9QS1RfUFJPVE9fVFJBQ0UKKwkJY2RzX3BrdF9wcm90b190cmFjZV9jbG9zZSgpOworI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKwkJd2hpbGUgKGhkZF9jdHgtPmlzTG9ncEluUHJvZ3Jlc3MgfHwKKwkJICAgICAgIGNkc19pc19sb2dwX2luX3Byb2dyZXNzKCkpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwoCisJCQkJICAiU1NSIGluIFByb2dyZXNzOyBibG9jayBybW1vZCBmb3IgMSBzZWNvbmQhISEiCisJCQkJICApKTsKKwkJCW1zbGVlcCgxMDAwKTsKKworCQkJaWYgKHJldHJ5KysgPT0gSEREX01PRF9FWElUX1NTUl9NQVhfUkVUUklFUykgeworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkJICAgICAgIEZMKCJTU1IgbmV2ZXIgY29tcGxldGVkLCBmYXRhbCBlcnJvciIpKTsKKwkJCQlDREZfQlVHKDApOworCQkJfQorCQl9CisKKwkJcnRubF9sb2NrKCk7CisJCWhkZF9jdHgtPmlzVW5sb2FkSW5Qcm9ncmVzcyA9IHRydWU7CisJCWNkc19zZXRfbG9hZF91bmxvYWRfaW5fcHJvZ3Jlc3ModHJ1ZSk7CisJCXJ0bmxfdW5sb2NrKCk7CisJfQorCisJY2RzX3dhaXRfZm9yX3dvcmtfdGhyZWFkX2NvbXBsZXRpb24oX19mdW5jX18pOworCW1lbWR1bXBfZGVpbml0KCk7CisKKwl3bGFuX2hkZF91bnJlZ2lzdGVyX2RyaXZlcigpOworCXJldHVybjsKK30KKworLyoqCisgKiBoZGRfbW9kdWxlX2V4aXQoKSAtIEV4aXQgZnVuY3Rpb24KKyAqCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgZXhpdCBwb2ludCAoaW52b2tlZCB3aGVuIG1vZHVsZSBpcyB1bmxvYWRlZCB1c2luZyBybW1vZCkKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGhkZF9tb2R1bGVfZXhpdCh2b2lkKQoreworCWhkZF9kcml2ZXJfZXhpdCgpOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IGZ3cGF0aF9jaGFuZ2VkX2hhbmRsZXIoY29uc3QgY2hhciAqa21lc3NhZ2UsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCXJldHVybiBwYXJhbV9zZXRfY29weXN0cmluZyhrbWVzc2FnZSwga3ApOworfQorCisjaWYgIWRlZmluZWQoUUNBX1dJRklfRlRNKQorc3RhdGljIGludCBjb25fbW9kZV9oYW5kbGVyKGNvbnN0IGNoYXIgKmttZXNzYWdlLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlyZXR1cm4gcGFyYW1fc2V0X2ludChrbWVzc2FnZSwga3ApOworfQorI2VuZGlmCisjZWxzZSAvKiAjaWZkZWYgTU9EVUxFICovCisvKioKKyAqIGtpY2tzdGFydF9kcml2ZXIoKSAtIGRyaXZlciBlbnRyeSBwb2ludAorICoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBlbnRyeSBwb2ludAorICogLSBkZWxheWVkIGRyaXZlciBpbml0aWFsaXphdGlvbiB3aGVuIGRyaXZlciBpcyBzdGF0aWNhbGx5IGxpbmtlZAorICogLSBpbnZva2VkIHdoZW4gbW9kdWxlIHBhcmFtZXRlciBmd3BhdGggaXMgbW9kaWZpZWQgZnJvbSB1c2Vyc3BhY2UgdG8gc2lnbmFsCisgKiAgIGluaXRpYWxpemluZyB0aGUgV0xBTiBkcml2ZXIgb3Igd2hlbiBjb25fbW9kZSBpcyBtb2RpZmllZCBmcm9tIHVzZXJzcGFjZQorICogICB0byBzaWduYWwgYSBzd2l0Y2ggaW4gb3BlcmF0aW5nIG1vZGUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQga2lja3N0YXJ0X2RyaXZlcih2b2lkKQoreworCWludCByZXRfc3RhdHVzOworCisJaWYgKCF3bGFuX2hkZF9pbml0ZWQpIHsKKwkJcmV0X3N0YXR1cyA9IGhkZF9kcml2ZXJfaW5pdCgpOworCQl3bGFuX2hkZF9pbml0ZWQgPSByZXRfc3RhdHVzID8gMCA6IDE7CisJCXJldHVybiByZXRfc3RhdHVzOworCX0KKworCWhkZF9kcml2ZXJfZXhpdCgpOworCisJbXNsZWVwKDIwMCk7CisKKwlyZXRfc3RhdHVzID0gaGRkX2RyaXZlcl9pbml0KCk7CisJd2xhbl9oZGRfaW5pdGVkID0gcmV0X3N0YXR1cyA/IDAgOiAxOworCXJldHVybiByZXRfc3RhdHVzOworfQorCisvKioKKyAqIGZ3cGF0aF9jaGFuZ2VkX2hhbmRsZXIoKSAtIEhhbmRsZXIgRnVuY3Rpb24KKyAqCisgKiBIYW5kbGUgY2hhbmdlcyB0byB0aGUgZndwYXRoIHBhcmFtZXRlcgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBmd3BhdGhfY2hhbmdlZF9oYW5kbGVyKGNvbnN0IGNoYXIgKmttZXNzYWdlLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcGFyYW1fc2V0X2NvcHlzdHJpbmcoa21lc3NhZ2UsIGtwKTsKKwlpZiAoMCA9PSByZXQpCisJCXJldCA9IGtpY2tzdGFydF9kcml2ZXIoKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWYgIWRlZmluZWQoUUNBX1dJRklfRlRNKQorLyoqCisgKiBjb25fbW9kZV9oYW5kbGVyKCkgLSBoYW5kbHMgbW9kdWxlIHBhcmFtIGNvbl9tb2RlIGNoYW5nZQorICoKKyAqIEhhbmRsZXIgZnVuY3Rpb24gZm9yIG1vZHVsZSBwYXJhbSBjb25fbW9kZSB3aGVuIGl0IGlzIGNoYW5nZWQgYnkgdXNlcnNwYWNlCisgKiBEeW5hbWljYWxseSBsaW5rZWQgLSBkbyBub3RoaW5nCisgKiBTdGF0aWNhbGx5IGxpbmtlZCAtIGV4aXQgYW5kIGluaXQgZHJpdmVyLCBhcyBpbiBybW1vZCBhbmQgaW5zbW9kCisgKgorICogUmV0dXJuIC0KKyAqLworc3RhdGljIGludCBjb25fbW9kZV9oYW5kbGVyKGNvbnN0IGNoYXIgKmttZXNzYWdlLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcGFyYW1fc2V0X2ludChrbWVzc2FnZSwga3ApOworCWlmICgwID09IHJldCkKKwkJcmV0ID0ga2lja3N0YXJ0X2RyaXZlcigpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiAjaWZkZWYgTU9EVUxFICovCisKKy8qKgorICogaGRkX2dldF9jb25wYXJhbSgpIC0gZHJpdmVyIGV4aXQgcG9pbnQKKyAqCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgZXhpdCBwb2ludCAoaW52b2tlZCB3aGVuIG1vZHVsZSBpcyB1bmxvYWRlZCB1c2luZyBybW1vZCkKKyAqCisgKiBSZXR1cm46IHRDREZfQ09OX01PREUKKyAqLwordENERl9DT05fTU9ERSBoZGRfZ2V0X2NvbnBhcmFtKHZvaWQpCit7CisjaWZkZWYgTU9EVUxFCisJcmV0dXJuICh0Q0RGX0NPTl9NT0RFKSBjb25fbW9kZTsKKyNlbHNlCisJcmV0dXJuICh0Q0RGX0NPTl9NT0RFKSBjdXJyX2Nvbl9tb2RlOworI2VuZGlmCit9CisKK3ZvaWQgaGRkX3NldF9jb25wYXJhbSh1aW50MzJfdCBuZXdQYXJhbSkKK3sKKwljb25fbW9kZSA9IG5ld1BhcmFtOworI2lmbmRlZiBNT0RVTEUKKwljdXJyX2Nvbl9tb2RlID0gY29uX21vZGU7CisjZW5kaWYKK30KKworLyoqCisgKiBoZGRfc29mdGFwX3N0YV9kZWF1dGgoKSAtIGhhbmRsZSBkZWF1dGggcmVxIGZyb20gSERECisgKiBAYWRhcHRlcjoJUG9pbnRlciB0byB0aGUgSERECisgKiBAZW5hYmxlOglib29sIHZhbHVlCisgKgorICogVGhpcyB0byB0YWtlIGNvdW50ZXIgbWVhc3VyZSB0byBoYW5kbGUgZGVhdXRoIHJlcSBmcm9tIEhERAorICoKKyAqIFJldHVybjogTm9uZQorICovCitDREZfU1RBVFVTIGhkZF9zb2Z0YXBfc3RhX2RlYXV0aChoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSBzdHJ1Y3QgdGFnQ3NyRGVsU3RhUGFyYW1zICpwRGVsU3RhUGFyYW1zKQoreworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJdl9DT05URVhUX3QgcF9jZHNfY29udGV4dCA9IChXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpKS0+cGNkc19jb250ZXh0OworI2VuZGlmCisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBVUxUOworCisJRU5URVIoKTsKKworCWhkZExvZyhMT0cxLCBGTCgiaGRkX3NvZnRhcF9zdGFfZGVhdXRoOiglcCwgZmFsc2UpIiksCisJICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpKS0+cGNkc19jb250ZXh0KTsKKworCS8qIElnbm9yZSByZXF1ZXN0IHRvIGRlYXV0aCBiY21jIHN0YXRpb24gKi8KKwlpZiAocERlbFN0YVBhcmFtcy0+cGVlck1hY0FkZHIuYnl0ZXNbMF0gJiAweDEpCisJCXJldHVybiBjZGZfc3RhdHVzOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCWNkZl9zdGF0dXMgPQorCQl3bGFuc2FwX2RlYXV0aF9zdGEoV0xBTl9IRERfR0VUX1NBUF9DVFhfUFRSKGFkYXB0ZXIpLAorCQkJCSAgIHBEZWxTdGFQYXJhbXMpOworI2Vsc2UKKwljZGZfc3RhdHVzID0gd2xhbnNhcF9kZWF1dGhfc3RhKHBfY2RzX2NvbnRleHQsIHBEZWxTdGFQYXJhbXMpOworI2VuZGlmCisKKwlFWElUKCk7CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogaGRkX3NvZnRhcF9zdGFfZGlzYXNzb2MoKSAtIHRha2UgY291bnRlciBtZWFzdXJlIHRvIGhhbmRsZSBkZWF1dGggcmVxIGZyb20gSERECisgKiBAYWRhcHRlcjoJUG9pbnRlciB0byB0aGUgSERECisgKgorICogVGhpcyB0byB0YWtlIGNvdW50ZXIgbWVhc3VyZSB0byBoYW5kbGUgZGVhdXRoIHJlcSBmcm9tIEhERAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGhkZF9zb2Z0YXBfc3RhX2Rpc2Fzc29jKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgIHVpbnQ4X3QgKnBEZXN0TWFjQWRkcmVzcykKK3sKKyNpZm5kZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCXZfQ09OVEVYVF90IHBfY2RzX2NvbnRleHQgPSAoV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKSktPnBjZHNfY29udGV4dDsKKyNlbmRpZgorCisJRU5URVIoKTsKKworCWhkZExvZyhMT0dFLCBGTCgiaGRkX3NvZnRhcF9zdGFfZGlzYXNzb2M6KCVwLCBmYWxzZSkiKSwKKwkgICAgICAgKFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcikpLT5wY2RzX2NvbnRleHQpOworCisJLyogSWdub3JlIHJlcXVlc3QgdG8gZGlzYXNzb2MgYmNtYyBzdGF0aW9uICovCisJaWYgKHBEZXN0TWFjQWRkcmVzc1swXSAmIDB4MSkKKwkJcmV0dXJuOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCXdsYW5zYXBfZGlzYXNzb2Nfc3RhKFdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUihhZGFwdGVyKSwKKwkJCSAgICAgcERlc3RNYWNBZGRyZXNzKTsKKyNlbHNlCisJd2xhbnNhcF9kaXNhc3NvY19zdGEocF9jZHNfY29udGV4dCwgcERlc3RNYWNBZGRyZXNzKTsKKyNlbmRpZgorfQorCit2b2lkIGhkZF9zb2Z0YXBfdGtpcF9taWNfZmFpbF9jb3VudGVyX21lYXN1cmUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkJICAgICAgYm9vbCBlbmFibGUpCit7CisjaWZuZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwl2X0NPTlRFWFRfdCBwX2Nkc19jb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcikpLT5wY2RzX2NvbnRleHQ7CisjZW5kaWYKKworCUVOVEVSKCk7CisKKwloZGRMb2coTE9HRSwgRkwoImhkZF9zb2Z0YXBfdGtpcF9taWNfZmFpbF9jb3VudGVyX21lYXN1cmU6KCVwLCBmYWxzZSkiKSwKKwkgICAgICAgKFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcikpLT5wY2RzX2NvbnRleHQpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCXdsYW5zYXBfc2V0X2NvdW50ZXJfbWVhc3VyZShXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIoYWRhcHRlciksCisJCQkJICAgIChib29sKSBlbmFibGUpOworI2Vsc2UKKwl3bGFuc2FwX3NldF9jb3VudGVyX21lYXN1cmUocF9jZHNfY29udGV4dCwgKGJvb2wpIGVuYWJsZSk7CisjZW5kaWYKK30KKworLyoqCisgKiBoZGRfaXNzdGFfcDJwX2NsaWVudGNvbm5lY3RlZCgpIC0gY2hlY2sgaWYgc3RhIG9yIHAycCBjbGllbnQgaXMgY29ubmVjdGVkCisgKiBAaGRkX2N0eDoJSEREIENvbnRleHQKKyAqCisgKiBBUEkgdG8gZmluZCBpZiB0aGVyZSBpcyBhbnkgU1RBIG9yIFAyUC1DbGllbnQgaXMgY29ubmVjdGVkCisgKgorICogUmV0dXJuOiB0cnVlIGlmIGNvbm5lY3RlZDsgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK0NERl9TVEFUVVMgaGRkX2lzc3RhX3AycF9jbGllbnRjb25uZWN0ZWQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlyZXR1cm4gc21lX2lzX3N0YV9wMnBfY2xpZW50X2Nvbm5lY3RlZChoZGRfY3R4LT5oSGFsKTsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCitpbnQgd2xhbl9oZGRfZ2VuX3dsYW5fc3RhdHVzX3BhY2soc3RydWN0IHdsYW5fc3RhdHVzX2RhdGEgKmRhdGEsCisJCQkJICBoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHgsCisJCQkJICB1aW50OF90IGlzX29uLCB1aW50OF90IGlzX2Nvbm5lY3RlZCkKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gTlVMTDsKKwl1aW50OF90IGJ1ZmxlbiA9IFdMQU5fU1ZDX0NPVU5UUllfQ09ERV9MRU47CisKKwlpZiAoIWRhdGEpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJpbnZhbGlkIGRhdGEgcG9pbnRlciIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghYWRhcHRlcikgeworCQlpZiAoaXNfb24pIHsKKwkJCS8qIG5vIGFjdGl2ZSBpbnRlcmZhY2UgKi8KKwkJCWRhdGEtPmxwc3Nfc3VwcG9ydCA9IDA7CisJCQlkYXRhLT5pc19vbiA9IGlzX29uOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaGRkTG9nKExPR0UsIEZMKCJpbnZhbGlkIGFkYXB0ZXIgcG9pbnRlciIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisJaWYgKGhkZF9jdHgtPmxwc3Nfc3VwcG9ydCAmJiBoZGRfY3R4LT5jb25maWctPmVuYWJsZWxwYXNzc3VwcG9ydCkKKwkJZGF0YS0+bHBzc19zdXBwb3J0ID0gMTsKKwllbHNlCisJCWRhdGEtPmxwc3Nfc3VwcG9ydCA9IDA7CisJZGF0YS0+bnVtQ2hhbm5lbHMgPSBXTEFOX1NWQ19NQVhfTlVNX0NIQU47CisJc21lX2dldF9jZmdfdmFsaWRfY2hhbm5lbHMoaGRkX2N0eC0+aEhhbCwgZGF0YS0+Y2hhbm5lbF9saXN0LAorCQkJCSAgICZkYXRhLT5udW1DaGFubmVscyk7CisJc21lX2dldF9jb3VudHJ5X2NvZGUoaGRkX2N0eC0+aEhhbCwgZGF0YS0+Y291bnRyeV9jb2RlLCAmYnVmbGVuKTsKKwlkYXRhLT5pc19vbiA9IGlzX29uOworCWRhdGEtPnZkZXZfaWQgPSBhZGFwdGVyLT5zZXNzaW9uSWQ7CisJZGF0YS0+dmRldl9tb2RlID0gYWRhcHRlci0+ZGV2aWNlX21vZGU7CisJaWYgKHBIZGRTdGFDdHgpIHsKKwkJZGF0YS0+aXNfY29ubmVjdGVkID0gaXNfY29ubmVjdGVkOworCQlkYXRhLT5yc3NpID0gYWRhcHRlci0+cnNzaTsKKwkJZGF0YS0+ZnJlcSA9CisJCQljZHNfY2hhbl90b19mcmVxKHBIZGRTdGFDdHgtPmNvbm5faW5mby5vcGVyYXRpb25DaGFubmVsKTsKKwkJaWYgKFdMQU5fU1ZDX01BWF9TU0lEX0xFTiA+PQorCQkgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLlNTSUQuU1NJRC5sZW5ndGgpIHsKKwkJCWRhdGEtPnNzaWRfbGVuID0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLlNTSUQuU1NJRC5sZW5ndGg7CisJCQltZW1jcHkoZGF0YS0+c3NpZCwKKwkJCSAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uU1NJRC5TU0lELnNzSWQsCisJCQkgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLlNTSUQuU1NJRC5sZW5ndGgpOworCQl9CisJCWlmIChDREZfTUFDX0FERFJfU0laRSA+PQorCQkgICAgc2l6ZW9mKHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZCkpCisJCQltZW1jcHkoZGF0YS0+YnNzaWQsIHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZC5ieXRlcywKKwkJCSAgICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgd2xhbl9oZGRfZ2VuX3dsYW5fdmVyc2lvbl9wYWNrKHN0cnVjdCB3bGFuX3ZlcnNpb25fZGF0YSAqZGF0YSwKKwkJCQkgICB1aW50MzJfdCBmd192ZXJzaW9uLAorCQkJCSAgIHVpbnQzMl90IGNoaXBfaWQsIGNvbnN0IGNoYXIgKmNoaXBfbmFtZSkKK3sKKwlpZiAoIWRhdGEpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJpbnZhbGlkIGRhdGEgcG9pbnRlciIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YS0+Y2hpcF9pZCA9IGNoaXBfaWQ7CisJc3RybGNweShkYXRhLT5jaGlwX25hbWUsIGNoaXBfbmFtZSwgV0xBTl9TVkNfTUFYX1NUUl9MRU4pOworCWlmIChzdHJuY21wKGNoaXBfbmFtZSwgIlVua25vd24iLCA3KSkKKwkJc3RybGNweShkYXRhLT5jaGlwX2Zyb20sICJRdWFsY29tbSIsIFdMQU5fU1ZDX01BWF9TVFJfTEVOKTsKKwllbHNlCisJCXN0cmxjcHkoZGF0YS0+Y2hpcF9mcm9tLCAiVW5rbm93biIsIFdMQU5fU1ZDX01BWF9TVFJfTEVOKTsKKwlzdHJsY3B5KGRhdGEtPmhvc3RfdmVyc2lvbiwgUVdMQU5fVkVSU0lPTlNUUiwgV0xBTl9TVkNfTUFYX1NUUl9MRU4pOworCXNjbnByaW50ZihkYXRhLT5md192ZXJzaW9uLCBXTEFOX1NWQ19NQVhfU1RSX0xFTiwgIiVkLiVkLiVkLiVkIiwKKwkJICAoZndfdmVyc2lvbiAmIDB4ZjAwMDAwMDApID4+IDI4LAorCQkgIChmd192ZXJzaW9uICYgMHhmMDAwMDAwKSA+PiAyNCwKKwkJICAoZndfdmVyc2lvbiAmIDB4ZjAwMDAwKSA+PiAyMCwgKGZ3X3ZlcnNpb24gJiAweDdmZmYpKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorLyoqCisgKiB3bGFuX2hkZF9kaXNhYmxlX3JvYW1pbmcoKSAtIGRpc2FibGUgcm9hbWluZyBvbiBhbGwgU1RBcyBleGNlcHQgdGhlIGlucHV0IG9uZQorICogQGFkYXB0ZXI6CUhERCBhZGFwdGVyIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGxvb3AgdGhyb3VnaCBlYWNoIGFkYXB0ZXIgYW5kIGRpc2FibGUgcm9hbWluZyBvbiBlYWNoIFNUQQorICogZGV2aWNlIG1vZGUgZXhjZXB0IHRoZSBpbnB1dCBhZGFwdGVyLgorICoKKyAqIE5vdGU6IE9uIHRoZSBpbnB1dCBhZGFwdGVyIHJvYW1pbmcgaXMgbm90IGVuYWJsZWQgeWV0IGhlbmNlIG5vIG5lZWQgdG8KKyAqICAgICAgIGRpc2FibGUuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd2xhbl9oZGRfZGlzYWJsZV9yb2FtaW5nKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcklkeCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJOb2RlID0gTlVMTDsKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcE5leHQgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKGhkZF9jdHgtPmNvbmZpZy0+aXNGYXN0Um9hbUluaUZlYXR1cmVFbmFibGVkICYmCisJICAgIGhkZF9jdHgtPmNvbmZpZy0+aXNSb2FtT2ZmbG9hZFNjYW5FbmFibGVkICYmCisJICAgIFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gYWRhcHRlci0+ZGV2aWNlX21vZGUgJiYKKwkgICAgY2RzX2lzX3N0YV9hY3RpdmVfY29ubmVjdGlvbl9leGlzdHMoKSkgeworCQloZGRMb2coTE9HMSwgRkwoIkNvbm5lY3QgcmVjZWl2ZWQgb24gU1RBIHNlc3Npb25JZCglZCkiKSwKKwkJICAgICAgIGFkYXB0ZXItPnNlc3Npb25JZCk7CisJCS8qCisJCSAqIExvb3AgdGhyb3VnaCBhZGFwdGVyIGFuZCBkaXNhYmxlIHJvYW1pbmcgZm9yIGVhY2ggU1RBIGRldmljZQorCQkgKiBtb2RlIGV4Y2VwdCB0aGUgaW5wdXQgYWRhcHRlci4KKwkJICovCisJCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlck5vZGUpOworCisJCXdoaWxlIChOVUxMICE9IGFkYXB0ZXJOb2RlICYmIENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJCWFkYXB0ZXJJZHggPSBhZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisKKwkJCWlmIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IGFkYXB0ZXJJZHgtPmRldmljZV9tb2RlCisJCQkgICAgJiYgYWRhcHRlci0+c2Vzc2lvbklkICE9IGFkYXB0ZXJJZHgtPnNlc3Npb25JZCkgeworCQkJCWhkZExvZyhMT0cxLAorCQkJCSAgICAgICBGTCgiRGlzYWJsZSBSb2FtaW5nIG9uIHNlc3Npb25JZCglZCkiKSwKKwkJCQkgICAgICAgYWRhcHRlcklkeC0+c2Vzc2lvbklkKTsKKwkJCQlzbWVfc3RvcF9yb2FtaW5nKFdMQU5fSEREX0dFVF9IQUxfQ1RYCisJCQkJCQkJIChhZGFwdGVySWR4KSwKKwkJCQkJCSBhZGFwdGVySWR4LT5zZXNzaW9uSWQsIDApOworCQkJfQorCisJCQlzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlcihoZGRfY3R4LAorCQkJCQkJICAgICAgYWRhcHRlck5vZGUsCisJCQkJCQkgICAgICAmcE5leHQpOworCQkJYWRhcHRlck5vZGUgPSBwTmV4dDsKKwkJfQorCX0KK30KKworLyoqCisgKiB3bGFuX2hkZF9lbmFibGVfcm9hbWluZygpIC0gZW5hYmxlIHJvYW1pbmcgb24gYWxsIFNUQXMgZXhjZXB0IHRoZSBpbnB1dCBvbmUKKyAqIEBhZGFwdGVyOglIREQgYWRhcHRlciBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBsb29wIHRocm91Z2ggZWFjaCBhZGFwdGVyIGFuZCBlbmFibGUgcm9hbWluZyBvbiBlYWNoIFNUQQorICogZGV2aWNlIG1vZGUgZXhjZXB0IHRoZSBpbnB1dCBhZGFwdGVyLgorICogTm90ZTogT24gdGhlIGlucHV0IGFkYXB0ZXIgbm8gbmVlZCB0byBlbmFibGUgcm9hbWluZyBiZWNhdXNlIGxpbmsgZ290CisgKiAgICAgICBkaXNjb25uZWN0ZWQgb24gdGhpcy4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCB3bGFuX2hkZF9lbmFibGVfcm9hbWluZyhoZGRfYWRhcHRlcl90ICphZGFwdGVyKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXJJZHggPSBOVUxMOworCWhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICphZGFwdGVyTm9kZSA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBOZXh0ID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCWlmIChoZGRfY3R4LT5jb25maWctPmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCAmJgorCSAgICBoZGRfY3R4LT5jb25maWctPmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCAmJgorCSAgICBXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IGFkYXB0ZXItPmRldmljZV9tb2RlICYmCisJICAgIGNkc19pc19zdGFfYWN0aXZlX2Nvbm5lY3Rpb25fZXhpc3RzKCkpIHsKKwkJaGRkTG9nKExPRzEsIEZMKCJEaXNjb25uZWN0IHJlY2VpdmVkIG9uIFNUQSBzZXNzaW9uSWQoJWQpIiksCisJCSAgICAgICBhZGFwdGVyLT5zZXNzaW9uSWQpOworCQkvKgorCQkgKiBMb29wIHRocm91Z2ggYWRhcHRlciBhbmQgZW5hYmxlIHJvYW1pbmcgZm9yIGVhY2ggU1RBIGRldmljZQorCQkgKiBtb2RlIGV4Y2VwdCB0aGUgaW5wdXQgYWRhcHRlci4KKwkJICovCisJCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlck5vZGUpOworCisJCXdoaWxlIChOVUxMICE9IGFkYXB0ZXJOb2RlICYmIENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJCWFkYXB0ZXJJZHggPSBhZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisKKwkJCWlmIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IGFkYXB0ZXJJZHgtPmRldmljZV9tb2RlCisJCQkgICAgJiYgYWRhcHRlci0+c2Vzc2lvbklkICE9IGFkYXB0ZXJJZHgtPnNlc3Npb25JZCkgeworCQkJCWhkZExvZyhMT0cxLAorCQkJCSAgICAgICBGTCgiRW5hYmxpbmcgUm9hbWluZyBvbiBzZXNzaW9uSWQoJWQpIiksCisJCQkJICAgICAgIGFkYXB0ZXJJZHgtPnNlc3Npb25JZCk7CisJCQkJc21lX3N0YXJ0X3JvYW1pbmcoV0xBTl9IRERfR0VUX0hBTF9DVFgKKwkJCQkJCQkgIChhZGFwdGVySWR4KSwKKwkJCQkJCSAgYWRhcHRlcklkeC0+c2Vzc2lvbklkLAorCQkJCQkJICBSRUFTT05fQ09OTkVDVCk7CisJCQl9CisKKwkJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKGhkZF9jdHgsCisJCQkJCQkgICAgICBhZGFwdGVyTm9kZSwKKwkJCQkJCSAgICAgICZwTmV4dCk7CisJCQlhZGFwdGVyTm9kZSA9IHBOZXh0OworCQl9CisJfQorfQorI2VuZGlmCisKK3ZvaWQgd2xhbl9oZGRfc2VuZF9zdmNfbmxpbmtfbXNnKGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJdEFuaU1zZ0hkciAqYW5pX2hkcjsKKwl2b2lkICpubF9kYXRhID0gTlVMTDsKKwlpbnQgZmxhZ3MgPSBHRlBfS0VSTkVMOworCisJaWYgKGluX2ludGVycnVwdCgpIHx8IGlycXNfZGlzYWJsZWQoKSB8fCBpbl9hdG9taWMoKSkKKwkJZmxhZ3MgPSBHRlBfQVRPTUlDOworCisJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX1NQQUNFKFdMQU5fTkxfTUFYX1BBWUxPQUQpLCBmbGFncyk7CisKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoImFsbG9jX3NrYiBmYWlsZWQiKSk7CisJCXJldHVybjsKKwl9CisKKwlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCW5saC0+bmxtc2dfcGlkID0gMDsgICAgIC8qIGZyb20ga2VybmVsICovCisJbmxoLT5ubG1zZ19mbGFncyA9IDA7CisJbmxoLT5ubG1zZ19zZXEgPSAwOworCW5saC0+bmxtc2dfdHlwZSA9IFdMQU5fTkxfTVNHX1NWQzsKKworCWFuaV9oZHIgPSBOTE1TR19EQVRBKG5saCk7CisJYW5pX2hkci0+dHlwZSA9IHR5cGU7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFdMQU5fU1ZDX0ZXX0NSQVNIRURfSU5EOgorCWNhc2UgV0xBTl9TVkNfTFRFX0NPRVhfSU5EOgorI2lmZGVmIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOCisJY2FzZSBXTEFOX1NWQ19XTEFOX0FVVE9fU0hVVERPV05fSU5EOgorI2VuZGlmCisJCWFuaV9oZHItPmxlbmd0aCA9IDA7CisJCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKChzaXplb2YodEFuaU1zZ0hkcikpKTsKKwkJc2tiX3B1dChza2IsIE5MTVNHX1NQQUNFKHNpemVvZih0QW5pTXNnSGRyKSkpOworCQlicmVhazsKKwljYXNlIFdMQU5fU1ZDX1dMQU5fU1RBVFVTX0lORDoKKwljYXNlIFdMQU5fU1ZDX1dMQU5fVkVSU0lPTl9JTkQ6CisJY2FzZSBXTEFOX1NWQ19ERlNfQ0FDX1NUQVJUX0lORDoKKwljYXNlIFdMQU5fU1ZDX0RGU19DQUNfRU5EX0lORDoKKwljYXNlIFdMQU5fU1ZDX0RGU19SQURBUl9ERVRFQ1RfSU5EOgorCWNhc2UgV0xBTl9TVkNfREZTX0FMTF9DSEFOTkVMX1VOQVZBSUxfSU5EOgorCWNhc2UgV0xBTl9TVkNfV0xBTl9UUF9JTkQ6CisJCWFuaV9oZHItPmxlbmd0aCA9IGxlbjsKKwkJbmxoLT5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoKHNpemVvZih0QW5pTXNnSGRyKSArIGxlbikpOworCQlubF9kYXRhID0gKGNoYXIgKilhbmlfaGRyICsgc2l6ZW9mKHRBbmlNc2dIZHIpOworCQltZW1jcHkobmxfZGF0YSwgZGF0YSwgbGVuKTsKKwkJc2tiX3B1dChza2IsIE5MTVNHX1NQQUNFKHNpemVvZih0QW5pTXNnSGRyKSArIGxlbikpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiV0xBTiBTVkM6IEF0dGVtcHQgdG8gc2VuZCB1bmtub3duIG5saW5rIG1lc3NhZ2UgJWQiKSwKKwkJICAgICAgIHR5cGUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCW5sX3Nydl9iY2FzdChza2IpOworCisJcmV0dXJuOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0xQU1MKK3ZvaWQgd2xhbl9oZGRfc2VuZF9zdGF0dXNfcGtnKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCwKKwkJCSAgICAgIHVpbnQ4X3QgaXNfb24sIHVpbnQ4X3QgaXNfY29ubmVjdGVkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB3bGFuX3N0YXR1c19kYXRhIGRhdGE7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkKKwkJcmV0dXJuOworCisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHdsYW5fc3RhdHVzX2RhdGEpKTsKKwlpZiAoaXNfb24pCisJCXJldCA9IHdsYW5faGRkX2dlbl93bGFuX3N0YXR1c19wYWNrKCZkYXRhLCBhZGFwdGVyLCBwSGRkU3RhQ3R4LAorCQkJCQkJICAgIGlzX29uLCBpc19jb25uZWN0ZWQpOworCWlmICghcmV0KQorCQl3bGFuX2hkZF9zZW5kX3N2Y19ubGlua19tc2coV0xBTl9TVkNfV0xBTl9TVEFUVVNfSU5ELAorCQkJCQkgICAgJmRhdGEsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHdsYW5fc3RhdHVzX2RhdGEpKTsKK30KKwordm9pZCB3bGFuX2hkZF9zZW5kX3ZlcnNpb25fcGtnKHVpbnQzMl90IGZ3X3ZlcnNpb24sCisJCQkgICAgICAgdWludDMyX3QgY2hpcF9pZCwgY29uc3QgY2hhciAqY2hpcF9uYW1lKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB3bGFuX3ZlcnNpb25fZGF0YSBkYXRhOworI2lmZGVmIENPTkZJR19DTlNTCisJc3RydWN0IGNuc3NfcGxhdGZvcm1fY2FwIGNhcDsKKworCXJldCA9IGNuc3NfZ2V0X3BsYXRmb3JtX2NhcCgmY2FwKTsKKwlpZiAocmV0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgicGxhdGZvcm0gY2FwYWJpbGl0eSBpbmZvIGZyb20gQ05TUyBub3QgYXZhaWxhYmxlIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEoY2FwLmNhcF9mbGFnICYgQ05TU19IQVNfVUFSVF9BQ0NFU1MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihzdHJ1Y3Qgd2xhbl92ZXJzaW9uX2RhdGEpKTsKKwlyZXQgPQorCQl3bGFuX2hkZF9nZW5fd2xhbl92ZXJzaW9uX3BhY2soJmRhdGEsIGZ3X3ZlcnNpb24sIGNoaXBfaWQsCisJCQkJCSAgICAgICBjaGlwX25hbWUpOworCWlmICghcmV0KQorCQl3bGFuX2hkZF9zZW5kX3N2Y19ubGlua19tc2coV0xBTl9TVkNfV0xBTl9WRVJTSU9OX0lORCwKKwkJCQkJICAgICZkYXRhLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB3bGFuX3ZlcnNpb25fZGF0YSkpOworfQorCit2b2lkIHdsYW5faGRkX3NlbmRfYWxsX3NjYW5faW50Zl9pbmZvKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJaGRkX2FkYXB0ZXJfdCAqcERhdGFBZGFwdGVyID0gTlVMTDsKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworCWJvb2wgc2Nhbl9pbnRmX2ZvdW5kID0gZmFsc2U7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlpZiAoIWhkZF9jdHgpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJOVUxMIHBvaW50ZXIgZm9yIGhkZF9jdHgiKSk7CisJCXJldHVybjsKKwl9CisKKwlzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIoaGRkX2N0eCwgJmFkYXB0ZXJOb2RlKTsKKwl3aGlsZSAoTlVMTCAhPSBhZGFwdGVyTm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCXBEYXRhQWRhcHRlciA9IGFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKwkJaWYgKHBEYXRhQWRhcHRlcikgeworCQkJaWYgKHBEYXRhQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTgorCQkJICAgIHx8IHBEYXRhQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0NMSUVOVAorCQkJICAgIHx8IHBEYXRhQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0KKwkJCSAgICBXTEFOX0hERF9QMlBfREVWSUNFKSB7CisJCQkJc2Nhbl9pbnRmX2ZvdW5kID0gdHJ1ZTsKKwkJCQl3bGFuX2hkZF9zZW5kX3N0YXR1c19wa2cocERhdGFBZGFwdGVyLCBOVUxMLCAxLAorCQkJCQkJCSAwKTsKKwkJCX0KKwkJfQorCQlzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlcihoZGRfY3R4LCBhZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJYWRhcHRlck5vZGUgPSBwTmV4dDsKKwl9CisKKwlpZiAoIXNjYW5faW50Zl9mb3VuZCkKKwkJd2xhbl9oZGRfc2VuZF9zdGF0dXNfcGtnKHBEYXRhQWRhcHRlciwgTlVMTCwgMSwgMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOCit2b2lkIHdsYW5faGRkX2F1dG9fc2h1dGRvd25fY2Iodm9pZCkKK3sKKwloZGRMb2coTE9HRSwgRkwoIldsYW4gSWRsZS4gU2VuZGluZyBTaHV0ZG93biBldmVudC4uIikpOworCXdsYW5faGRkX3NlbmRfc3ZjX25saW5rX21zZyhXTEFOX1NWQ19XTEFOX0FVVE9fU0hVVERPV05fSU5ELCBOVUxMLCAwKTsKK30KKwordm9pZCB3bGFuX2hkZF9hdXRvX3NodXRkb3duX2VuYWJsZShoZGRfY29udGV4dF90ICpoZGRfY3R4LCBib29sIGVuYWJsZSkKK3sKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzOworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisJYm9vbCBhcF9jb25uZWN0ZWQgPSBmYWxzZSwgc3RhX2Nvbm5lY3RlZCA9IGZhbHNlOworCXRIYWxIYW5kbGUgaGFsX2hhbmRsZTsKKworCWhhbF9oYW5kbGUgPSBoZGRfY3R4LT5oSGFsOworCWlmIChoYWxfaGFuZGxlID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChoZGRfY3R4LT5jb25maWctPldsYW5BdXRvU2h1dGRvd24gPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGVuYWJsZSA9PSBmYWxzZSkgeworCQlpZiAoc21lX3NldF9hdXRvX3NodXRkb3duX3RpbWVyKGhhbF9oYW5kbGUsIDApICE9CisJCQkJCQkJQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTCgiRmFpbGVkIHRvIHN0b3Agd2xhbiBhdXRvIHNodXRkb3duIHRpbWVyIikpOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKiBUbyBlbmFibGUgc2h1dGRvd24gdGltZXIgY2hlY2sgY29ubmN1cnJlbmN5ICovCisJaWYgKGNkc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSB7CisJCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlck5vZGUpOworCisJCXdoaWxlIChOVUxMICE9IGFkYXB0ZXJOb2RlICYmIENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJCWFkYXB0ZXIgPSBhZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisJCQlpZiAoYWRhcHRlcgorCQkJICAgICYmIGFkYXB0ZXItPmRldmljZV9tb2RlID09CisJCQkgICAgV0xBTl9IRERfSU5GUkFfU1RBVElPTikgeworCQkJCWlmIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpLT4KKwkJCQkgICAgY29ubl9pbmZvLmNvbm5TdGF0ZSA9PQorCQkJCSAgICBlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQpIHsKKwkJCQkJc3RhX2Nvbm5lY3RlZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChhZGFwdGVyCisJCQkgICAgJiYgYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQKSB7CisJCQkJaWYgKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKGFkYXB0ZXIpLT4KKwkJCQkgICAgYkFwQWN0aXZlID09IHRydWUpIHsKKwkJCQkJYXBfY29ubmVjdGVkID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIoaGRkX2N0eCwKKwkJCQkJCSAgICAgIGFkYXB0ZXJOb2RlLAorCQkJCQkJICAgICAgJnBOZXh0KTsKKwkJCWFkYXB0ZXJOb2RlID0gcE5leHQ7CisJCX0KKwl9CisKKwlpZiAoYXBfY29ubmVjdGVkID09IHRydWUgfHwgc3RhX2Nvbm5lY3RlZCA9PSB0cnVlKSB7CisJCWhkZExvZyhMT0cxLAorCQkgICAgICAgRkwoIkNDIFNlc3Npb24gYWN0aXZlLiBTaHV0ZG93biB0aW1lciBub3QgZW5hYmxlZCIpKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWlmIChzbWVfc2V0X2F1dG9fc2h1dGRvd25fdGltZXIoaGFsX2hhbmRsZSwKKwkJCQkJCWhkZF9jdHgtPmNvbmZpZy0+CisJCQkJCQlXbGFuQXV0b1NodXRkb3duKQorCQkgICAgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoIkZhaWxlZCB0byBzdGFydCB3bGFuIGF1dG8gc2h1dGRvd24gdGltZXIiKSk7CisJCWVsc2UKKwkJCWhkZExvZyhMT0cxLAorCQkJICAgICAgIEZMKCJBdXRvIFNodXRkb3duIHRpbWVyIGZvciAlZCBzZWNvbmRzIGVuYWJsZWQiKSwKKwkJCSAgICAgICBoZGRfY3R4LT5jb25maWctPldsYW5BdXRvU2h1dGRvd24pOworCisJfQorfQorI2VuZGlmCisKK2hkZF9hZGFwdGVyX3QgKmhkZF9nZXRfY29uX3NhcF9hZGFwdGVyKGhkZF9hZGFwdGVyX3QgKnRoaXNfc2FwX2FkYXB0ZXIsCisJCQkJCQkJYm9vbCBjaGVja19zdGFydF9ic3MpCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgodGhpc19zYXBfYWRhcHRlcik7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgKmNvbl9zYXBfYWRhcHRlcjsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqYWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworCisJY29uX3NhcF9hZGFwdGVyID0gTlVMTDsKKworCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlck5vZGUpOworCXdoaWxlIChOVUxMICE9IGFkYXB0ZXJOb2RlICYmIENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJYWRhcHRlciA9IGFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKwkJaWYgKGFkYXB0ZXIgJiYgKChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9TT0ZUQVApIHx8CisJCQkJKGFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9HTykpICYmCisJCQkJCQlhZGFwdGVyICE9IHRoaXNfc2FwX2FkYXB0ZXIpIHsKKwkJCWlmIChjaGVja19zdGFydF9ic3MpIHsKKwkJCQlpZiAodGVzdF9iaXQoU09GVEFQX0JTU19TVEFSVEVELAorCQkJCQkJJmFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkgeworCQkJCQljb25fc2FwX2FkYXB0ZXIgPSBhZGFwdGVyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNvbl9zYXBfYWRhcHRlciA9IGFkYXB0ZXI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIoaGRkX2N0eCwgYWRhcHRlck5vZGUsICZwTmV4dCk7CisJCWFkYXB0ZXJOb2RlID0gcE5leHQ7CisJfQorCisJcmV0dXJuIGNvbl9zYXBfYWRhcHRlcjsKK30KKworI2lmZGVmIE1TTV9QTEFURk9STQordm9pZCBoZGRfc3RhcnRfYnVzX2J3X2NvbXB1dGVfdGltZXIoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKworCWlmIChDREZfVElNRVJfU1RBVEVfUlVOTklORyA9PQorCSAgICBjZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoJmhkZF9jdHgtPmJ1c19id190aW1lcikpCisJCXJldHVybjsKKworCWNkZl9tY190aW1lcl9zdGFydCgmaGRkX2N0eC0+YnVzX2J3X3RpbWVyLAorCQkJICAgaGRkX2N0eC0+Y29uZmlnLT5idXNCYW5kd2lkdGhDb21wdXRlSW50ZXJ2YWwpOworfQorCit2b2lkIGhkZF9zdG9wX2J1c19id19jb21wdXRlX3RpbWVyKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKmFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlib29sIGNhbl9zdG9wID0gdHJ1ZTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKworCWlmIChDREZfVElNRVJfU1RBVEVfUlVOTklORyAhPQorCSAgICBjZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoJmhkZF9jdHgtPmJ1c19id190aW1lcikpIHsKKwkJLyogdHJ5aW5nIHRvIHN0b3AgdGltZXIsIHdoZW4gbm90IHJ1bm5pbmcgaXMgbm90IGdvb2QgKi8KKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJidXMgYmFuZCB3aWR0aCBjb21wdXRlIHRpbWVyIGlzIG5vdCBydW5uaW5nIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNkc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSB7CisJCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihoZGRfY3R4LCAmYWRhcHRlck5vZGUpOworCisJCXdoaWxlIChOVUxMICE9IGFkYXB0ZXJOb2RlICYmIENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJCWFkYXB0ZXIgPSBhZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisJCQlpZiAoYWRhcHRlcgorCQkJICAgICYmIChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OCisJCQkJfHwgYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0NMSUVOVCkKKwkJCSAgICAmJiBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKGFkYXB0ZXIpLT4KKwkJCSAgICBjb25uX2luZm8uY29ublN0YXRlID09CisJCQkgICAgZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkKSB7CisJCQkJY2FuX3N0b3AgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChhZGFwdGVyCisJCQkgICAgJiYgKGFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUAorCQkJCXx8IGFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9HTykKKwkJCSAgICAmJiBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihhZGFwdGVyKS0+YkFwQWN0aXZlID09CisJCQkgICAgdHJ1ZSkgeworCQkJCWNhbl9zdG9wID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlcihoZGRfY3R4LAorCQkJCQkJICAgICAgYWRhcHRlck5vZGUsCisJCQkJCQkgICAgICAmcE5leHQpOworCQkJYWRhcHRlck5vZGUgPSBwTmV4dDsKKwkJfQorCX0KKworCWlmIChjYW5fc3RvcCA9PSB0cnVlKQorCQljZGZfbWNfdGltZXJfc3RvcCgmaGRkX2N0eC0+YnVzX2J3X3RpbWVyKTsKK30KKyNlbmRpZgorCisvKioKKyAqIHdsYW5faGRkX2NoZWNrX2N1c3RvbV9jb25fY2hhbm5lbF9ydWxlcygpIC0gVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIHNhcCdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN0YSdzIG9wZXJhdGluZyBjaGFubmVsLgorICogQHN0YV9hZGFwdGVyOiAgRGVzY3JpYmUgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGZvb2Jhci4KKyAqIEBhcF9hZGFwdGVyOiAgIERlc2NyaWJlIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gZm9vYmFyLgorICogQHJvYW1fcHJvZmlsZTogUm9hbSBwcm9maWxlIG9mIEFQIHRvIHdoaWNoIFNUQSB3YW50cyB0byBjb25uZWN0LgorICogQGNvbmN1cnJlbnRfY2hubF9zYW1lOiBJZiBib3RoIFNBUCBhbmQgU1RBIGNoYW5uZWxzIGFyZSBzYW1lIHRoZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRoaXMgZmxhZyB0byB0cnVlIGVsc2UgZmFsc2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIHNhcCdzIG9wZXJhdGluZyBjaGFubmVsIGFuZCBzdGEncyBvcGVyYXRpbmcgY2hhbm5lbC4KKyAqIGlmIGJvdGggYXJlIHNhbWUgdGhlbiBpdCB3aWxsIHJldHVybiBmYWxzZSBlbHNlIGl0IHdpbGwgcmVzdGFydCB0aGUgc2FwIGluCisgKiBzdGEncyBjaGFubmVsIGFuZCByZXR1cm4gdHJ1ZS4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvciBDREZfU1RBVFVTX0VfRkFJTFVSRS4KKyAqLworQ0RGX1NUQVRVUyB3bGFuX2hkZF9jaGVja19jdXN0b21fY29uX2NoYW5uZWxfcnVsZXMoaGRkX2FkYXB0ZXJfdCAqc3RhX2FkYXB0ZXIsCisJCQkJCQkgIGhkZF9hZGFwdGVyX3QgKmFwX2FkYXB0ZXIsCisJCQkJCQkgIHRDc3JSb2FtUHJvZmlsZSAqcm9hbV9wcm9maWxlLAorCQkJCQkJICB0U2NhblJlc3VsdEhhbmRsZSAqc2Nhbl9jYWNoZSwKKwkJCQkJCSAgYm9vbCAqY29uY3VycmVudF9jaG5sX3NhbWUpCit7CisJaGRkX2FwX2N0eF90ICpoZGRfYXBfY3R4OworCXVpbnQ4X3QgY2hhbm5lbF9pZDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlkZXZpY2VfbW9kZV90IGRldmljZV9tb2RlID0gYXBfYWRhcHRlci0+ZGV2aWNlX21vZGU7CisJKmNvbmN1cnJlbnRfY2hubF9zYW1lID0gdHJ1ZTsKKworCWhkZF9hcF9jdHggPSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihhcF9hZGFwdGVyKTsKKwlzdGF0dXMgPQorCSBzbWVfZ2V0X2FwX2NoYW5uZWxfZnJvbV9zY2FuX2NhY2hlKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHN0YV9hZGFwdGVyKSwKKwkJCQkJICAgIHJvYW1fcHJvZmlsZSwKKwkJCQkJICAgIHNjYW5fY2FjaGUsCisJCQkJCSAgICAmY2hhbm5lbF9pZCk7CisJaWYgKChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSkgeworCQlpZiAoKFdMQU5fSEREX1NPRlRBUCA9PSBkZXZpY2VfbW9kZSkgJiYKKwkJCShjaGFubmVsX2lkIDwgU0lSXzExQV9DSEFOTkVMX0JFR0lOKSkgeworCQkJaWYgKGhkZF9hcF9jdHgtPm9wZXJhdGluZ0NoYW5uZWwgIT0gY2hhbm5lbF9pZCkgeworCQkJCSpjb25jdXJyZW50X2Nobmxfc2FtZSA9IGZhbHNlOworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkJCUZMKCJjaGFubmVscyBhcmUgZGlmZmVyZW50IikpOworCQkJfQorCQl9IGVsc2UgaWYgKChXTEFOX0hERF9QMlBfR08gPT0gZGV2aWNlX21vZGUpICYmCisJCQkJKGNoYW5uZWxfaWQgPj0gU0lSXzExQV9DSEFOTkVMX0JFR0lOKSkgeworCQkJaWYgKGhkZF9hcF9jdHgtPm9wZXJhdGluZ0NoYW5uZWwgIT0gY2hhbm5lbF9pZCkgeworCQkJCSpjb25jdXJyZW50X2Nobmxfc2FtZSA9IGZhbHNlOworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkJCUZMKCJjaGFubmVscyBhcmUgZGlmZmVyZW50IikpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTGV0cyBoYW5kbGUgd29yc3QgY2FzZSBzY2VuYXJpbyBoZXJlLCBTY2FuIGNhY2hlIGxvb2t1cCBpcworCQkgKiBmYWlsZWQgc28gd2UgaGF2ZSB0byBzdG9wIHRoZSBTQVAgdG8gYXZvaWQgYW55IGNoYW5uZWwKKwkJICogZGlzY3JlcGFuY3kgIGJldHdlZW4gU0FQJ3MgY2hhbm5lbCBhbmQgU1RBJ3MgY2hhbm5lbC4KKwkJICogUmV0dXJuIHRoZSBzdGF0dXMgYXMgZmFpbHVyZSBzbyBjYWxsZXIgZnVuY3Rpb24gY291bGQga25vdworCQkgKiB0aGF0IHNjYW4gbG9vayB1cCBpcyBmYWlsZWQuCisJCSAqLworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIkZpbmRpbmcgQVAgZnJvbSBzY2FuIGNhY2hlIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorLyoqCisgKiB3bGFuX2hkZF9zdG9wX3NhcCgpIC0gVGhpcyBmdW5jdGlvbiBzdG9wcyBic3Mgb2YgU0FQLgorICogQGFwX2FkYXB0ZXI6IFNBUCBhZGFwdGVyCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHByb2Nlc3MgdGhlIHN0b3BwaW5nIG9mIHNhcCBhZGFwdGVyLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIHdsYW5faGRkX3N0b3Bfc2FwKGhkZF9hZGFwdGVyX3QgKmFwX2FkYXB0ZXIpCit7CisJaGRkX2FwX2N0eF90ICpoZGRfYXBfY3R4OworCWhkZF9ob3N0YXBkX3N0YXRlX3QgKmhvc3RhcGRfc3RhdGU7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisjaWZkZWYgQ0ZHODAyMTFfREVMX1NUQV9WMgorCXN0cnVjdCBzdGF0aW9uX2RlbF9wYXJhbWV0ZXJzIGRlbFN0YVBhcmFtczsKKyNlbmRpZgorCisJaWYgKE5VTEwgPT0gYXBfYWRhcHRlcikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoImFwX2FkYXB0ZXIgaXMgTlVMTCBoZXJlIikpOworCQlyZXR1cm47CisJfQorCisJaGRkX2FwX2N0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKGFwX2FkYXB0ZXIpOworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFwX2FkYXB0ZXIpOworCWlmICgwICE9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCkpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisJbXV0ZXhfbG9jaygmaGRkX2N0eC0+c2FwX2xvY2spOworCWlmICh0ZXN0X2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZhcF9hZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKyNpZmRlZiBDRkc4MDIxMV9ERUxfU1RBX1YyCisJCWRlbFN0YVBhcmFtcy5tYWMgPSBOVUxMOworCQlkZWxTdGFQYXJhbXMuc3VidHlwZSA9IFNJUl9NQUNfTUdNVF9ERUFVVEggPj4gNDsKKwkJZGVsU3RhUGFyYW1zLnJlYXNvbl9jb2RlID0gZUNzckZvcmNlZERlYXV0aFN0YTsKKwkJd2xhbl9oZGRfY2ZnODAyMTFfZGVsX3N0YXRpb24oYXBfYWRhcHRlci0+d2Rldi53aXBoeSwKKwkJCQlhcF9hZGFwdGVyLT5kZXYsCisJCQkJJmRlbFN0YVBhcmFtcyk7CisjZWxzZQorCQl3bGFuX2hkZF9jZmc4MDIxMV9kZWxfc3RhdGlvbihhcF9hZGFwdGVyLT53ZGV2LndpcGh5LAorCQkJCWFwX2FkYXB0ZXItPmRldiwKKwkJCQlOVUxMKTsKKyNlbmRpZgorCQloZGRfY2xlYW51cF9hY3Rpb25mcmFtZShoZGRfY3R4LCBhcF9hZGFwdGVyKTsKKwkJaG9zdGFwZF9zdGF0ZSA9IFdMQU5fSEREX0dFVF9IT1NUQVBfU1RBVEVfUFRSKGFwX2FkYXB0ZXIpOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAgICAgIEZMKCJOb3cgZG9pbmcgU0FQIFNUT1BCU1MiKSk7CisJCWNkZl9ldmVudF9yZXNldCgmaG9zdGFwZF9zdGF0ZS0+Y2RmX3N0b3BfYnNzX2V2ZW50KTsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSB3bGFuc2FwX3N0b3BfYnNzKGhkZF9hcF9jdHgtPgorCQkJCQkJCXNhcENvbnRleHQpKSB7CisJCQljZGZfc3RhdHVzID0gY2RmX3dhaXRfc2luZ2xlX2V2ZW50KCZob3N0YXBkX3N0YXRlLT4KKwkJCQkJCQkgICBjZGZfc3RvcF9ic3NfZXZlbnQsCisJCQkJCQkJICAgQlNTX1dBSVRfVElNRU9VVCk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJCW11dGV4X3VubG9jaygmaGRkX2N0eC0+c2FwX2xvY2spOworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAgICAgIEZMKCJTQVAgU3RvcCBGYWlsZWQiKSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWNsZWFyX2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZhcF9hZGFwdGVyLT5ldmVudF9mbGFncyk7CisJCWNkc19kZWNyX3Nlc3Npb25fc2V0X3BjbChoZGRfY3R4LAorCQkJCQkJYXBfYWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJCQlhcF9hZGFwdGVyLT5zZXNzaW9uSWQpOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAgICAgIEZMKCJTQVAgU3RvcCBTdWNjZXNzIikpOworCX0gZWxzZSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiQ2FuJ3Qgc3RvcCBhcCBiZWNhdXNlIGl0cyBub3Qgc3RhcnRlZCIpKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZoZGRfY3R4LT5zYXBfbG9jayk7CisJcmV0dXJuOworfQorCisvKioKKyAqIHdsYW5faGRkX3N0YXJ0X3NhcCgpIC0gdGhpcyBmdW5jdGlvbiBzdGFydHMgYnNzIG9mIFNBUC4KKyAqIEBhcF9hZGFwdGVyOiBTQVAgYWRhcHRlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9jZXNzIHRoZSBzdGFydGluZyBvZiBzYXAgYWRhcHRlci4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCB3bGFuX2hkZF9zdGFydF9zYXAoaGRkX2FkYXB0ZXJfdCAqYXBfYWRhcHRlcikKK3sKKwloZGRfYXBfY3R4X3QgKmhkZF9hcF9jdHg7CisJaGRkX2hvc3RhcGRfc3RhdGVfdCAqaG9zdGFwZF9zdGF0ZTsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwl0c2FwX0NvbmZpZ190ICpzYXBfY29uZmlnOworCisJaWYgKE5VTEwgPT0gYXBfYWRhcHRlcikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoImFwX2FkYXB0ZXIgaXMgTlVMTCBoZXJlIikpOworCQlyZXR1cm47CisJfQorCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYXBfYWRhcHRlcik7CisJaGRkX2FwX2N0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKGFwX2FkYXB0ZXIpOworCWhvc3RhcGRfc3RhdGUgPSBXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihhcF9hZGFwdGVyKTsKKwlzYXBfY29uZmlnID0gJmFwX2FkYXB0ZXItPnNlc3Npb25DdHguYXAuc2FwQ29uZmlnOworCisJaWYgKDAgIT0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuOworCX0KKwltdXRleF9sb2NrKCZoZGRfY3R4LT5zYXBfbG9jayk7CisJaWYgKHRlc3RfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJmFwX2FkYXB0ZXItPmV2ZW50X2ZsYWdzKSkKKwkJZ290byBlbmQ7CisKKwlpZiAoMCAhPSB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYXBpZXMoYXBfYWRhcHRlcikpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJTQVAgTm90IGFibGUgdG8gc2V0IEFQIElFcyIpKTsKKwkJd2xhbnNhcF9yZXNldF9zYXBfY29uZmlnX2FkZF9pZShzYXBfY29uZmlnLCBlVVBEQVRFX0lFX0FMTCk7CisJCWdvdG8gZW5kOworCX0KKworCWlmICh3bGFuc2FwX3N0YXJ0X2JzcyhoZGRfYXBfY3R4LT5zYXBDb250ZXh0LCBoZGRfaG9zdGFwZF9zYXBfZXZlbnRfY2IsCisJCQkgICAgICAmaGRkX2FwX2N0eC0+c2FwQ29uZmlnLAorCQkJICAgICAgYXBfYWRhcHRlci0+ZGV2KQorCQkJICAgICAgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVuZDsKKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCSAgICAgICBGTCgiV2FpdGluZyBmb3IgU0FQIHRvIHN0YXJ0IikpOworCWNkZl9zdGF0dXMgPSBjZGZfd2FpdF9zaW5nbGVfZXZlbnQoJmhvc3RhcGRfc3RhdGUtPmNkZl9ldmVudCwKKwkJCQkJQlNTX1dBSVRfVElNRU9VVCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIlNBUCBTdGFydCBmYWlsZWQiKSk7CisJCWdvdG8gZW5kOworCX0KKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgRkwoIlNBUCBTdGFydCBTdWNjZXNzIikpOworCXNldF9iaXQoU09GVEFQX0JTU19TVEFSVEVELCAmYXBfYWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCWNkc19pbmNyX2FjdGl2ZV9zZXNzaW9uKGhkZF9jdHgsIGFwX2FkYXB0ZXItPmRldmljZV9tb2RlLAorCQkJCQlhcF9hZGFwdGVyLT5zZXNzaW9uSWQpOworCWhvc3RhcGRfc3RhdGUtPmJDb21taXQgPSB0cnVlOworCitlbmQ6CisJbXV0ZXhfdW5sb2NrKCZoZGRfY3R4LT5zYXBfbG9jayk7CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8qKgorICogaGRkX3dsYW5fZ2V0X3dha2VfbG9ja19wdHIoKTogZ2V0IEhERCdzIHdha2UgbG9jayBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB3YWtlIGxvY2sgcG9pbnRlciB0byB0aGUgY2FsbGVyCisgKgorICogUmV0dXJuOiBjZGZfd2FrZV9sb2NrX3QKKyAqLworY2RmX3dha2VfbG9ja190ICpoZGRfd2xhbl9nZXRfd2FrZV9sb2NrX3B0cih2b2lkKQoreworCXJldHVybiAmd2xhbl93YWtlX2xvY2s7Cit9CisKKy8qKgorICogaGRkX2dldF9md192ZXJzaW9uKCkgLSBHZXQgRlcgdmVyc2lvbgorICogQGhkZF9jdHg6ICAgICBwb2ludGVyIHRvIEhERCBjb250ZXh0LgorICogQG1ham9yX3NwaWQ6ICBGVyB2ZXJzaW9uIC0gbWFqb3Igc3BpZC4KKyAqIEBtaW5vcl9zcGlkOiAgRlcgdmVyc2lvbiAtIG1pbm9yIHNwaWQKKyAqIEBzc2lkOiAgICAgICAgRlcgdmVyc2lvbiAtIHNzaWQKKyAqIEBjcm1pZDogICAgICAgRlcgdmVyc2lvbiAtIGNybWlkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSBmaXJtd2FyZSBidWlsZCB2ZXJzaW9uIHN0b3JlZAorICogYXMgcGFydCBvZiB0aGUgSEREIGNvbnRleHQKKyAqCisgKiBSZXR1cm46ICAgTm9uZQorICovCit2b2lkIGhkZF9nZXRfZndfdmVyc2lvbihoZGRfY29udGV4dF90ICpoZGRfY3R4LAorCQkJdWludDMyX3QgKm1ham9yX3NwaWQsIHVpbnQzMl90ICptaW5vcl9zcGlkLAorCQkJdWludDMyX3QgKnNpaWQsIHVpbnQzMl90ICpjcm1pZCkKK3sKKwkqbWFqb3Jfc3BpZCA9IChoZGRfY3R4LT50YXJnZXRfZndfdmVyc2lvbiAmIDB4ZjAwMDAwMDApID4+IDI4OworCSptaW5vcl9zcGlkID0gKGhkZF9jdHgtPnRhcmdldF9md192ZXJzaW9uICYgMHhmMDAwMDAwKSA+PiAyNDsKKwkqc2lpZCA9IChoZGRfY3R4LT50YXJnZXRfZndfdmVyc2lvbiAmIDB4ZjAwMDAwKSA+PiAyMDsKKwkqY3JtaWQgPSBoZGRfY3R4LT50YXJnZXRfZndfdmVyc2lvbiAmIDB4N2ZmZjsKK30KKworI2lmZGVmIFFDQV9DT05GSUdfU01QCisvKioKKyAqIHdsYW5faGRkX2dldF9jcHUoKSAtIGdldCBjcHVfaW5kZXgKKyAqCisgKiBSZXR1cm46IGNwdV9pbmRleAorICovCitpbnQgd2xhbl9oZGRfZ2V0X2NwdSh2b2lkKQoreworCWludCBjcHVfaW5kZXggPSBnZXRfY3B1KCk7CisJcHV0X2NwdSgpOworCXJldHVybiBjcHVfaW5kZXg7Cit9CisjZW5kaWYKKworLyoqCisgKiBoZGRfZ2V0X2Z3cGF0aCgpIC0gZ2V0IGZyYW1ld29yayBwYXRoCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgc3RyaW5nIHdyaXR0ZW4gYnkKKyAqIHVzZXJzcGFjZSB0byBzdGFydCB0aGUgd2xhbiBkcml2ZXIKKyAqCisgKiBSZXR1cm46IHN0cmluZworICovCitjb25zdCBjaGFyICpoZGRfZ2V0X2Z3cGF0aCh2b2lkKQoreworCXJldHVybiBmd3BhdGguc3RyaW5nOworfQorCisKKy8qIFJlZ2lzdGVyIHRoZSBtb2R1bGUgaW5pdC9leGl0IGZ1bmN0aW9ucyAqLworbW9kdWxlX2luaXQoaGRkX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGhkZF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BVVRIT1IoIlF1YWxjb21tIEF0aGVyb3MsIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV0xBTiBIT1NUIERFVklDRSBEUklWRVIiKTsKKworI2lmICBkZWZpbmVkKFFDQV9XSUZJX0ZUTSkKK21vZHVsZV9wYXJhbShjb25fbW9kZSwgaW50LCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKyNlbHNlCittb2R1bGVfcGFyYW1fY2FsbChjb25fbW9kZSwgY29uX21vZGVfaGFuZGxlciwgcGFyYW1fZ2V0X2ludCwgJmNvbl9tb2RlLAorCQkgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbV9jYWxsKGZ3cGF0aCwgZndwYXRoX2NoYW5nZWRfaGFuZGxlciwgcGFyYW1fZ2V0X3N0cmluZywgJmZ3cGF0aCwKKwkJICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKworbW9kdWxlX3BhcmFtKGVuYWJsZV9kZnNfY2hhbl9zY2FuLCBpbnQsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisKK21vZHVsZV9wYXJhbShlbmFibGVfMTFkLCBpbnQsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisKK21vZHVsZV9wYXJhbShjb3VudHJ5X2NvZGUsIGNoYXJwLCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX21lbWR1bXAuYyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9tZW1kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhZDc4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9tZW1kdW1wLmMKQEAgLTAsMCArMSw2NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQyA6IHdsYW5faGRkX21lbWR1bXAuYworICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIGZpbGUgZm9yIGR1bXBpbmcgZmlybXdhcmUgbWVtb3J5CisgKgorICovCisKKyNpbmNsdWRlIDxzbWVfYXBpLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaW5jbHVkZXMuaD4KKyNpbmNsdWRlICJ3bGFuX2hkZF9tZW1kdW1wLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4gLyogTmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIHRoZSBwcm9jIGZzICovCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPiAvKiBmb3IgY29weV90b191c2VyICovCisKKy8qKgorICogaGRkX2Z3X2R1bXBfY29udGV4dCAtIGhkZCBmaXJtd2FyZSBtZW1vcnkgZHVtcCBjb250ZXh0CisgKgorICogQHJlcXVlc3RfaWQ6IHVzZXJzcGFjZSBhc3NpZ25lZCBmaXJtd2FyZSBtZW1vcnkgZHVtcCByZXF1ZXN0IElECisgKiBAcmVzcG9uc2VfZXZlbnQ6IGZpcm13YXJlIG1lbW9yeSBkdW1wIHJlcXVlc3Qgd2FpdCBldmVudAorICovCitzdHJ1Y3QgaGRkX2Z3X2R1bXBfY29udGV4dCB7CisJdWludDMyX3QgcmVxdWVzdF9pZDsKKwlzdHJ1Y3QgY29tcGxldGlvbiByZXNwb25zZV9ldmVudDsKK307CitzdGF0aWMgc3RydWN0IGhkZF9md19kdW1wX2NvbnRleHQgZndfZHVtcF9jb250ZXh0OworCisvKioKKyAqIG1lbWR1bXBfY2xlYW51cF90aW1lcl9jYigpIC0gVGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIG1lbW9yeSBkdW1wIGNsZWFudXAuCisgKgorICogQGRhdGE6IENhbGxiYWNrIGRhdGEgKHVzZWQgdG8gc3RvcmVkIEhERCBjb250ZXh0KQorICoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgZm9yIG1lbW9yeSBkdW1wIGNsZWFudXAgVk9TIHRpbWVyLgorICoKKyAqIFJldHVybjogbm9uZQorICovCisKK3N0YXRpYyB2b2lkIG1lbWR1bXBfY2xlYW51cF90aW1lcl9jYih2b2lkICpkYXRhKQoreworCWludCBzdGF0dXM7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IGRhdGE7CisJY2RmX2RtYV9hZGRyX3QgcGFkZHI7CisJY2RmX2RtYV9hZGRyX3QgZG1hX2N0eCA9IDA7CisJY2RmX2RldmljZV90IGNkZl9jdHg7CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghaGRkX2N0eC0+ZndfZHVtcF9sb2MpIHsKKwkJaGRkTG9nKExPRzEsIEZMKCJNZW1vcnkgZHVtcCBhbHJlYWR5IGZyZWVkIikpOworCQlyZXR1cm47CisJfQorCisJY2RmX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0NERl9ERVZJQ0UpOworCWlmICghY2RmX2N0eCkgeworCQloZGRMb2coTE9HRSwgRkwoIkNERiBjb250ZXh0IGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlwYWRkciA9IGhkZF9jdHgtPmR1bXBfbG9jX3BhZGRyOworCW11dGV4X2xvY2soJmhkZF9jdHgtPm1lbWR1bXBfbG9jayk7CisJY2RmX29zX21lbV9mcmVlX2NvbnNpc3RlbnQoY2RmX2N0eCwKKwkJRldfTUVNX0RVTVBfU0laRSwgaGRkX2N0eC0+ZndfZHVtcF9sb2MsIHBhZGRyLCBkbWFfY3R4KTsKKwloZGRfY3R4LT5md19kdW1wX2xvYyA9IE5VTEw7CisJaGRkX2N0eC0+bWVtZHVtcF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCW11dGV4X3VubG9jaygmaGRkX2N0eC0+bWVtZHVtcF9sb2NrKTsKKworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2Z3X21lbV9kdW1wX2NiKCkgLSAgQ2FsbGJhY2sgdG8gcmVjZWl2ZSBGVyBtZW1vcnkgZHVtcAorICogQGN0eDogcG9pbnRlciB0byBIREQgY29udGV4dC4KKyAqIEByc3A6IHBvaW50ZXIgdG8gZncgZHVtcCBjb3B5IGNvbXBsZXRlIHJlc3BvbnNlCisgKgorICogVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgdG8gaW5kaWNhdGUgdXNlciBzcGFjZSBhYm91dCB0aGUKKyAqIGF2YWlsYWJpbGl0eSBmb3IgZmlybXdhcmUgbWVtb3J5IGR1bXAgdmlhIHZlbmRvciBldmVudC4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfZndfbWVtX2R1bXBfY2Iodm9pZCAqY3R4LAorCQkJCQkgICAgIHN0cnVjdCBmd19kdW1wX3JzcCAqZHVtcF9yc3ApCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IGN0eDsKKwlzdHJ1Y3QgaGRkX2Z3X2R1bXBfY29udGV4dCAqY29udGV4dDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2soJmhkZF9jb250ZXh0X2xvY2spOworCWNvbnRleHQgPSAmZndfZHVtcF9jb250ZXh0OworCS8qIHZhbGlkYXRlIHRoZSByZXNwb25zZSByZWNlaXZlZCAqLworCWlmICghZHVtcF9yc3AtPmR1bXBfY29tcGxldGUgfHwKKwkgICAgY29udGV4dC0+cmVxdWVzdF9pZCAhPSBkdW1wX3JzcC0+cmVxdWVzdF9pZCkgeworCQlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIkVycm9yIEAgcmVxdWVzdF9pZDogJWQgcmVzcG9uc2VfaWQ6ICVkIHN0YXR1czogJWQiKSwKKwkJICAgICAgIGNvbnRleHQtPnJlcXVlc3RfaWQsIGR1bXBfcnNwLT5yZXF1ZXN0X2lkLAorCQkgICAgICAgZHVtcF9yc3AtPmR1bXBfY29tcGxldGUpOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJY29tcGxldGUoJmNvbnRleHQtPnJlc3BvbnNlX2V2ZW50KTsKKwl9CisJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCisJcmV0dXJuOworfQorCisvKioKKyAqIHdsYW5faGRkX3NlbmRfbWVtZHVtcF9yc3AgLSBzZW5kIG1lbW9yeSBkdW1wIHJlc3BvbnNlIHRvIHVzZXIgc3BhY2UKKyAqIEBoZGRfY3R4OiBQb2ludGVyIHRvIGhkZCBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzOyBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IHdsYW5faGRkX3NlbmRfbWVtZHVtcF9yc3AoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlza2IgPSBjZmc4MDIxMV92ZW5kb3JfY21kX2FsbG9jX3JlcGx5X3NrYihoZGRfY3R4LT53aXBoeSwKKwkJCU5MTVNHX0hEUkxFTiArIE5MQV9IRFJMRU4gKyBzaXplb2YodWludDMyX3QpKTsKKworCWlmICghc2tiKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2IgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAobmxhX3B1dF91MzIoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9NRU1EVU1QX1NJWkUsCisJCQkgICAgIEZXX01FTV9EVU1QX1NJWkUpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgibmxhIHB1dCBmYWlsIikpOworCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CisKKwljZmc4MDIxMV92ZW5kb3JfY21kX3JlcGx5KHNrYik7CisJaGRkTG9nKExPRzEsIEZMKCJNZW1kdW1wIGV2ZW50IHNlbnQgc3VjY2Vzc2Z1bGx5IHRvIHVzZXIgc3BhY2UiKSk7CisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2dldF9md19tZW1fZHVtcCgpIC0gR2V0IEZXIG1lbW9yeSBkdW1wCisgKiBAd2lwaHk6ICAgcG9pbnRlciB0byB3aXJlbGVzcyB3aXBoeSBzdHJ1Y3R1cmUuCisgKiBAd2RldjogICAgcG9pbnRlciB0byB3aXJlbGVzc19kZXYgc3RydWN0dXJlLgorICogQGRhdGE6ICAgIFBvaW50ZXIgdG8gdGhlIE5MIGRhdGEuCisgKiBAZGF0YV9sZW46TGVuZ3RoIG9mIEBkYXRhCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3bGFuIGRyaXZlciBuZWVkcyB0byBnZXQgdGhlIGZpcm13YXJlIG1lbW9yeSBkdW1wCisgKiB2aWEgdmVuZG9yIHNwZWNpZmljIGNvbW1hbmQuCisgKgorICogUmV0dXJuOiAgIDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2dldF9md19tZW1fZHVtcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlpbnQgc3RhdHVzOworCUNERl9TVEFUVVMgc21lX3N0YXR1czsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IGZ3X2R1bXBfcmVxIGZ3X21lbV9kdW1wX3JlcTsKKwlzdHJ1Y3QgZndfZHVtcF9zZWdfcmVxICpzZWdfcmVxOworCXVpbnQ4X3QgbG9vcDsKKwljZGZfZG1hX2FkZHJfdCBwYWRkcjsKKwljZGZfZG1hX2FkZHJfdCBkbWFfY3R4ID0gMDsKKwljZGZfZGV2aWNlX3QgY2RmX2N0eDsKKwl1bnNpZ25lZCBsb25nIHJjOworCXN0cnVjdCBoZGRfZndfZHVtcF9jb250ZXh0ICpjb250ZXh0OworCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBpbnZhbGlkIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWNkZl9jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9DREZfREVWSUNFKTsKKwlpZiAoIWNkZl9jdHgpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDREYgY29udGV4dCBpcyBOVUxMIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaGRkX2N0eC0+bWVtZHVtcF9pbl9wcm9ncmVzcykgeworCQloZGRMb2coTE9HRSwgRkwoIkFscmVhZHkgYSBtZW1kdW1wIHJlcSBpbiBwcm9ncmVzcy4iKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGZ3IG1lbW9yeSBkdW1wLiBNZW1vcnkgYWxsb2NhdGVkIHNob3VsZCBiZQorCSAqIGNvbnRpZ3VvdXMuIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgaXMgcGFzc2VkCisJICogdG8gdGhlIEZXIGZvciBjb3B5CisJICoKKwkgKiBSZXVzZSB0aGUgbWVtb3J5IGlmIGF2YWlsYWJsZS4KKwkgKi8KKwltdXRleF9sb2NrKCZoZGRfY3R4LT5tZW1kdW1wX2xvY2spOworCWlmICghaGRkX2N0eC0+ZndfZHVtcF9sb2MpIHsKKwkJaGRkX2N0eC0+ZndfZHVtcF9sb2MgPSBjZGZfb3NfbWVtX2FsbG9jX2NvbnNpc3RlbnQoCisJCQljZGZfY3R4LCBGV19NRU1fRFVNUF9TSVpFLCAmcGFkZHIsIGRtYV9jdHgpOworCQlpZiAoIWhkZF9jdHgtPmZ3X2R1bXBfbG9jKSB7CisJCQltdXRleF91bmxvY2soJmhkZF9jdHgtPm1lbWR1bXBfbG9jayk7CisJCQloZGRMb2coTE9HRSwgRkwoImNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudCBmYWlsZWQiKSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQloZGRfY3R4LT5kdW1wX2xvY19wYWRkciA9IHBhZGRyOworCX0KKwltdXRleF91bmxvY2soJmhkZF9jdHgtPm1lbWR1bXBfbG9jayk7CisKKwkvKgorCSAqIEN1cnJlbnRseSByZXF1ZXN0X2lkIGFuZCBudW1fc2VnIGlzIGFzc3VtZWQgdG8gYmUgZGVmYXVsdCgxKQorCSAqIEl0IGlzIGFzc3VtZWQgdGhhdCBmaXJtd2FyZSBkdW1wIHJlcXVlc3RlZCBpcyBmb3IgRFJBTSBzZWN0aW9uCisJICogb25seQorCSAqLworCisJZndfbWVtX2R1bXBfcmVxLnJlcXVlc3RfaWQgPSBGV19NRU1fRFVNUF9SRVFfSUQ7CisJZndfbWVtX2R1bXBfcmVxLm51bV9zZWcgPSBGV19NRU1fRFVNUF9OVU1fU0VHOworCisJaGRkTG9nKExPRzEsIEZMKCJyZXF1ZXN0X2lkOiVkIG51bV9zZWc6JWQiKSwKKwkJZndfbWVtX2R1bXBfcmVxLnJlcXVlc3RfaWQsIGZ3X21lbV9kdW1wX3JlcS5udW1fc2VnKTsKKwlzZWdfcmVxID0gKHN0cnVjdCBmd19kdW1wX3NlZ19yZXEgKikgZndfbWVtX2R1bXBfcmVxLnNlZ21lbnQ7CisJZm9yIChsb29wID0gMDsgbG9vcCA8IGZ3X21lbV9kdW1wX3JlcS5udW1fc2VnOyBsb29wKyspIHsKKwkJc2VnX3JlcS0+c2VnX2lkID0gMTsKKwkJc2VnX3JlcS0+c2VnX3N0YXJ0X2FkZHJfbG8gPSBGV19EUkFNX0xPQ0FUSU9OOworCQlzZWdfcmVxLT5zZWdfc3RhcnRfYWRkcl9oaSA9IDA7CisJCXNlZ19yZXEtPnNlZ19sZW5ndGggPSBGV19NRU1fRFVNUF9TSVpFOworCQlzZWdfcmVxLT5kc3RfYWRkcl9sbyA9IGhkZF9jdHgtPmR1bXBfbG9jX3BhZGRyOworCQlzZWdfcmVxLT5kc3RfYWRkcl9oaSA9IDA7CisJCWhkZExvZyhMT0cxLCBGTCgic2VnX251bWJlcjolZCIpLCBsb29wKTsKKwkJaGRkTG9nKExPRzEsCisJCSAgICBGTCgic2VnX2lkOiVkIHN0YXJ0X2FkZHJfbG86MHgleCBzdGFydF9hZGRyX2hpOjB4JXgiKSwKKwkJICAgIHNlZ19yZXEtPnNlZ19pZCwgc2VnX3JlcS0+c2VnX3N0YXJ0X2FkZHJfbG8sCisJCSAgICBzZWdfcmVxLT5zZWdfc3RhcnRfYWRkcl9oaSk7CisJCWhkZExvZyhMT0cxLAorCQkgICAgRkwoInNlZ19sZW5ndGg6JWQgZHN0X2FkZHJfbG86MHgleCBkc3RfYWRkcl9oaToweCV4IiksCisJCSAgICBzZWdfcmVxLT5zZWdfbGVuZ3RoLCBzZWdfcmVxLT5kc3RfYWRkcl9sbywKKwkJICAgIHNlZ19yZXEtPmRzdF9hZGRyX2hpKTsKKwkJc2VnX3JlcSsrOworCX0KKworCS8qKgorCSAqIFN0YXJ0IHRoZSBjbGVhbnVwIHRpbWVyLgorCSAqIE1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoaXMgcmVxdWVzdCB3aWxsIGJlIGZyZWVkIHVwCisJICogb25jZSB0aGUgdGltZXIgZXhwaXJlcy4gTWVtb3J5IGR1bXAgcmVxdWVzdCBpcyBleHBlY3RlZCB0byBiZQorCSAqIGNvbXBsZXRlZCBieSB0aGlzIHRpbWUuCisJICoKKwkgKiBVc2VyIHNwYWNlIHdpbGwgbm90IGJlIGFibGUgdG8gYWNjZXNzIHRoZSBkdW1wIGFmdGVyIHRoaXMgdGltZS4KKwkgKiBOZXcgcmVxdWVzdCBzaG91bGQgYmUgaXNzdWVkIHRvIGdldCB0aGUgZHVtcCBhZ2Fpbi4KKwkgKi8KKwljZGZfbWNfdGltZXJfc3RhcnQoJmhkZF9jdHgtPm1lbWR1bXBfY2xlYW51cF90aW1lciwKKwkJCU1FTURVTVBfQ09NUExFVElPTl9USU1FX01TKTsKKwloZGRfY3R4LT5tZW1kdW1wX2luX3Byb2dyZXNzID0gdHJ1ZTsKKworCXNwaW5fbG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJY29udGV4dCA9ICZmd19kdW1wX2NvbnRleHQ7CisJY29udGV4dC0+cmVxdWVzdF9pZCA9IGZ3X21lbV9kdW1wX3JlcS5yZXF1ZXN0X2lkOworCUlOSVRfQ09NUExFVElPTihjb250ZXh0LT5yZXNwb25zZV9ldmVudCk7CisJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCisJc21lX3N0YXR1cyA9IHNtZV9md19tZW1fZHVtcChoZGRfY3R4LT5oSGFsLCAmZndfbWVtX2R1bXBfcmVxKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHNtZV9zdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJzbWVfZndfbWVtX2R1bXAgRmFpbGVkIikpOworCQltdXRleF9sb2NrKCZoZGRfY3R4LT5tZW1kdW1wX2xvY2spOworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudChjZGZfY3R4LAorCQkJRldfTUVNX0RVTVBfU0laRSwgaGRkX2N0eC0+ZndfZHVtcF9sb2MsIHBhZGRyLCBkbWFfY3R4KTsKKwkJaGRkX2N0eC0+ZndfZHVtcF9sb2MgPSBOVUxMOworCQltdXRleF91bmxvY2soJmhkZF9jdHgtPm1lbWR1bXBfbG9jayk7CisJCWhkZF9jdHgtPm1lbWR1bXBfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJaWYgKENERl9USU1FUl9TVEFURV9SVU5OSU5HID09CisJCQljZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoCisJCQkJJmhkZF9jdHgtPm1lbWR1bXBfY2xlYW51cF90aW1lcikpIHsKKwkJCWNkZl9tY190aW1lcl9zdG9wKCZoZGRfY3R4LT5tZW1kdW1wX2NsZWFudXBfdGltZXIpOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb250ZXh0LT5yZXNwb25zZV9ldmVudCwKKwkJbXNlY3NfdG9famlmZmllcyhNRU1EVU1QX0NPTVBMRVRJT05fVElNRV9NUykpOworCWlmICghcmMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJUYXJnZXQgcmVzcG9uc2UgdGltZWQgb3V0IGZvciByZXF1ZXN0X2lkOiAlZCIpLAorCQkgICAgICAgY29udGV4dC0+cmVxdWVzdF9pZCk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXN0YXR1cyA9IHdsYW5faGRkX3NlbmRfbWVtZHVtcF9yc3AoaGRkX2N0eCk7CisJaWYgKHN0YXR1cykKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHNlbmQgRlcgbWVtb3J5IGR1bXAgcnNwIHRvIHVzZXIgc3BhY2UiKSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2dldF9md19tZW1fZHVtcCgpIC0gR2V0IEZXIG1lbW9yeSBkdW1wCisgKiBAd2lwaHk6ICAgcG9pbnRlciB0byB3aXJlbGVzcyB3aXBoeSBzdHJ1Y3R1cmUuCisgKiBAd2RldjogICAgcG9pbnRlciB0byB3aXJlbGVzc19kZXYgc3RydWN0dXJlLgorICogQGRhdGE6ICAgIFBvaW50ZXIgdG8gdGhlIE5MIGRhdGEuCisgKiBAZGF0YV9sZW46TGVuZ3RoIG9mIEBkYXRhCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3bGFuIGRyaXZlciBuZWVkcyB0byBnZXQgdGhlIGZpcm13YXJlIG1lbW9yeSBkdW1wCisgKiB2aWEgdmVuZG9yIHNwZWNpZmljIGNvbW1hbmQuCisgKgorICogUmV0dXJuOiAgIDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZS4KKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX2dldF9md19tZW1fZHVtcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2Z3X21lbV9kdW1wKHdpcGh5LCB3ZGV2LCBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBQUk9DRlNfTUVNRFVNUF9ESVIgImRlYnVnIgorI2RlZmluZSBQUk9DRlNfTUVNRFVNUF9OQU1FICJmd2R1bXAiCisjZGVmaW5lIFBST0NGU19NRU1EVU1QX1BFUk0gMDQ0NAorCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2ZpbGUsICpwcm9jX2RpcjsKKworLyoqIG1lbWR1bXBfZ2V0X2ZpbGVfZGF0YSgpIC0gZ2V0IGRhdGEgYXZhaWxhYmxlIGluIHByb2MgZmlsZQorICoKKyAqIEBmaWxlIC0gaGFuZGxlIGZvciB0aGUgcHJvYyBmaWxlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGF0YSBwYXNzZWQgd2hpbGUKKyAqIGNyZWF0aW5nIHByb2MgZmlsZSBlbnRyeS4KKyAqCisgKiBSZXR1cm46IHZvaWQgcG9pbnRlciB0byBoZGRfY29udGV4dAorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxMCwgMCkpIHx8IGRlZmluZWQoV0lUSF9CQUNLUE9SVFMpCitzdGF0aWMgdm9pZCAqbWVtZHVtcF9nZXRfZmlsZV9kYXRhKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXZvaWQgKmhkZF9jdHg7CisKKwloZGRfY3R4ID0gUERFX0RBVEEoZmlsZV9pbm9kZShmaWxlKSk7CisJcmV0dXJuIGhkZF9jdHg7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgKm1lbWR1bXBfZ2V0X2ZpbGVfZGF0YShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl2b2lkICpoZGRfY3R4OworCisJaGRkX2N0eCA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+ZGF0YTsKKwlyZXR1cm4gaGRkX2N0eDsKK30KKyNlbmRpZgorCisvKioKKyAqIG1lbWR1bXBfcmVhZCgpIC0gcGVyZm9ybSByZWFkIG9wZXJhdGlvbiBpbiBtZW1vcnkgZHVtcCBwcm9jIGZpbGUKKyAqCisgKiBAZmlsZSAgLSBoYW5kbGUgZm9yIHRoZSBwcm9jIGZpbGUuCisgKiBAYnVmICAgLSBwb2ludGVyIHRvIHVzZXIgc3BhY2UgYnVmZmVyLgorICogQGNvdW50IC0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQuCisgKiBAcG9zICAgLSBvZmZzZXQgaW4gdGhlIGZyb20gYnVmZmVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgcmVhZCBvcGVyYXRpb24gZm9yIHRoZSBtZW1vcnkgZHVtcCBwcm9jIGZpbGUuCisgKgorICogUmV0dXJuOiBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHNzaXplX3QgbWVtZHVtcF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCWludCBzdGF0dXM7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwljZGZfZG1hX2FkZHJfdCBwYWRkcjsKKwljZGZfZG1hX2FkZHJfdCBkbWFfY3R4ID0gMDsKKwljZGZfZGV2aWNlX3QgY2RmX2N0eDsKKworCWhkZF9jdHggPSBtZW1kdW1wX2dldF9maWxlX2RhdGEoZmlsZSk7CisKKwloZGRMb2coTE9HMSwgRkwoIlJlYWQgcmVxIGZvciBzaXplOiV6dSBwb3M6JWxsdSIpLCBjb3VudCwgKnBvcyk7CisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljZGZfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfQ0RGX0RFVklDRSk7CisJaWYgKCFjZGZfY3R4KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ0RGIGNvbnRleHQgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFoZGRfY3R4LT5tZW1kdW1wX2luX3Byb2dyZXNzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ3VycmVudCBtZW0gZHVtcCByZXF1ZXN0IHRpbWVkIG91dC9mYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgqcG9zIDwgMCkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgc3RhcnQgb2Zmc2V0IGZvciBtZW1kdW1wIHJlYWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoKnBvcyA+PSBGV19NRU1fRFVNUF9TSVpFIHx8ICFjb3VudCkgeworCQloZGRMb2coTE9HRSwgRkwoIk5vIG1vcmUgZGF0YSB0byBjb3B5IikpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGNvdW50ID4gRldfTUVNX0RVTVBfU0laRSAtICpwb3MpIHsKKwkJY291bnQgPSBGV19NRU1fRFVNUF9TSVpFIC0gKnBvczsKKwl9CisKKwlpZiAoIWhkZF9jdHgtPmZ3X2R1bXBfbG9jKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBmdyBtZW0gZHVtcCBsb2NhdGlvbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGhkZF9jdHgtPmZ3X2R1bXBfbG9jICsgKnBvcywgY291bnQpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY29weSB0byB1c2VyIHNwYWNlIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogb2Zmc2V0KHBvcykgc2hvdWxkIGJlIHVwZGF0ZWQgaGVyZSBiYXNlZCBvbiB0aGUgY29weSBkb25lKi8KKwkqcG9zICs9IGNvdW50OworCisJLyogRW50aXJlIEZXIG1lbW9yeSBkdW1wIGNvcHkgY29tcGxldGVkICovCisJaWYgKCpwb3MgPj0gRldfTUVNX0RVTVBfU0laRSkgeworCQlwYWRkciA9IGhkZF9jdHgtPmR1bXBfbG9jX3BhZGRyOworCQltdXRleF9sb2NrKCZoZGRfY3R4LT5tZW1kdW1wX2xvY2spOworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudChjZGZfY3R4LAorCQkJRldfTUVNX0RVTVBfU0laRSwgaGRkX2N0eC0+ZndfZHVtcF9sb2MsIHBhZGRyLCBkbWFfY3R4KTsKKwkJaGRkX2N0eC0+ZndfZHVtcF9sb2MgPSBOVUxMOworCQloZGRfY3R4LT5tZW1kdW1wX2luX3Byb2dyZXNzID0gZmFsc2U7CisJCWlmIChDREZfVElNRVJfU1RBVEVfUlVOTklORyA9PQorCQkJY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKAorCQkJCSZoZGRfY3R4LT5tZW1kdW1wX2NsZWFudXBfdGltZXIpKSB7CisJCQljZGZfbWNfdGltZXJfc3RvcCgmaGRkX2N0eC0+bWVtZHVtcF9jbGVhbnVwX3RpbWVyKTsKKwkJfQorCQltdXRleF91bmxvY2soJmhkZF9jdHgtPm1lbWR1bXBfbG9jayk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIHN0cnVjdCBtZW1kdW1wX2ZvcHMgLSBmaWxlIG9wZXJhdGlvbnMgZm9yIG1lbW9yeSBkdW1wIGZlYXR1cmUKKyAqIEByZWFkIC0gcmVhZCBmdW5jdGlvbiBmb3IgbWVtb3J5IGR1bXAgb3BlcmF0aW9uLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGluaXRpYWxpemUgdGhlIGZpbGUgb3BlcmF0aW9uIGhhbmRsZSBmb3IgbWVtb3J5CisgKiBkdW1wIGZlYXR1cmUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVtZHVtcF9mb3BzID0geworCXJlYWQ6IG1lbWR1bXBfcmVhZAorfTsKKworLyoqCisgKiBtZW1kdW1wX3Byb2Nmc19pbml0KCkgLSBJbml0aWFsaXplIHByb2NmcyBmb3IgbWVtb3J5IGR1bXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZSBmaWxlIHVuZGVyIHByb2MgZmlsZSBzeXN0ZW0gdG8gYmUgdXNlZCBsYXRlciBmb3IKKyAqIHByb2Nlc3NpbmcgZmlybXdhcmUgbWVtb3J5IGR1bXAKKyAqCisgKiBSZXR1cm46ICAgMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBtZW1kdW1wX3Byb2Nmc19pbml0KHZvaWQpCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKworCWhkZF9jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9IREQpOworCWlmICghaGRkX2N0eCkgeworCQloZGRMb2coTE9HRSAsIEZMKCJJbnZhbGlkIEhERCBjb250ZXh0IikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcm9jX2RpciA9IHByb2NfbWtkaXIoUFJPQ0ZTX01FTURVTVBfRElSLCBOVUxMKTsKKwlpZiAocHJvY19kaXIgPT0gTlVMTCkgeworCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DRlNfTUVNRFVNUF9ESVIsIE5VTEwpOworCQlwcl9kZWJ1ZygiRXJyb3I6IENvdWxkIG5vdCBpbml0aWFsaXplIC9wcm9jLyVzXG4iLAorCQkJIFBST0NGU19NRU1EVU1QX0RJUik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByb2NfZmlsZSA9IHByb2NfY3JlYXRlX2RhdGEoUFJPQ0ZTX01FTURVTVBfTkFNRSwKKwkJCQkgICAgIFBST0NGU19NRU1EVU1QX1BFUk0sIHByb2NfZGlyLAorCQkJCSAgICAgJm1lbWR1bXBfZm9wcywgaGRkX2N0eCk7CisJaWYgKHByb2NfZmlsZSA9PSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NGU19NRU1EVU1QX05BTUUsIHByb2NfZGlyKTsKKwkJcHJfZGVidWcoIkVycm9yOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSAvcHJvYy8lc1xuIiwKKwkJCSAgUFJPQ0ZTX01FTURVTVBfTkFNRSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByX2RlYnVnKCIvcHJvYy8lcy8lcyBjcmVhdGVkXG4iLCBQUk9DRlNfTUVNRFVNUF9ESVIsCisJCSBQUk9DRlNfTUVNRFVNUF9OQU1FKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtZW1kdW1wX3Byb2Nmc19yZW1vdmUoKSAtIFJlbW92ZSBmaWxlL2RpciB1bmRlciBwcm9jZnMgZm9yIG1lbW9yeSBkdW1wCisgKgorICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGZpbGUvZGlyIHVuZGVyIHByb2MgZmlsZSBzeXN0ZW0gdGhhdCB3YXMKKyAqIHByb2Nlc3NpbmcgZmlybXdhcmUgbWVtb3J5IGR1bXAKKyAqCisgKiBSZXR1cm46ICBOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1lbWR1bXBfcHJvY2ZzX3JlbW92ZSh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NGU19NRU1EVU1QX05BTUUsIHByb2NfZGlyKTsKKwlwcl9kZWJ1ZygiL3Byb2MvJXMvJXMgcmVtb3ZlZFxuIiwgUFJPQ0ZTX01FTURVTVBfRElSLAorCQkJCQkgIFBST0NGU19NRU1EVU1QX05BTUUpOworCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NGU19NRU1EVU1QX0RJUiwgTlVMTCk7CisJcHJfZGVidWcoIi9wcm9jLyVzIHJlbW92ZWRcbiIsIFBST0NGU19NRU1EVU1QX0RJUik7Cit9CisKKy8qKgorICogbWVtZHVtcF9pbml0KCkgLSBJbnRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciBtZW1vcnkgZHVtcCBmZWF0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHByb2MgZmlsZSBmb3IgbWVtZHVtcCBmZWF0dXJlIGFuZCByZWdpc3RlcnMKKyAqIEhERCBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIFNNRS4KKyAqCisgKiBSZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIGVycm9yIG90aGVyd2lzZQorICovCitpbnQgbWVtZHVtcF9pbml0KHZvaWQpCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgc3RhdHVzID0gMDsKKwlDREZfU1RBVFVTIGNiX3N0YXR1czsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisKKwloZGRfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoIWhkZF9jdHgpIHsKKwkJaGRkTG9nKExPR0UgLCBGTCgiSW52YWxpZCBIREQgY29udGV4dCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJOb3QgaW5pdGlhbGl6aW5nIG1lbWR1bXAgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNiX3N0YXR1cyA9IHNtZV9md19tZW1fZHVtcF9yZWdpc3Rlcl9jYihoZGRfY3R4LT5oSGFsLAorCQkJCXdsYW5faGRkX2NmZzgwMjExX2Z3X21lbV9kdW1wX2NiKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNiX3N0YXR1cykgeworCQloZGRMb2coTE9HRSAsIEZMKCJGYWlsZWQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdGF0dXMgPSBtZW1kdW1wX3Byb2Nmc19pbml0KCk7CisJaWYgKHN0YXR1cykgeworCQloZGRMb2coTE9HRSAsIEZMKCJGYWlsZWQgdG8gY3JlYXRlIHByb2MgZmlsZSIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJmZ3X2R1bXBfY29udGV4dC5yZXNwb25zZV9ldmVudCk7CisKKwljZGZfc3RhdHVzID0gY2RmX21jX3RpbWVyX2luaXQoJmhkZF9jdHgtPm1lbWR1bXBfY2xlYW51cF90aW1lciwKKwkJCQkgICAgQ0RGX1RJTUVSX1RZUEVfU1csIG1lbWR1bXBfY2xlYW51cF90aW1lcl9jYiwKKwkJCQkgICAgKHZvaWQgKiloZGRfY3R4KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBpbml0IG1lbWR1bXAgY2xlYW51cCB0aW1lciIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfaW5pdCgmaGRkX2N0eC0+bWVtZHVtcF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG1lbWR1bXBfZGVpbml0KCkgLSBEZSBpbml0aWFsaXplIG1lbWR1bXAgZmVhdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBwcm9jIGZpbGUgY3JlYXRlZCBmb3IgbWVtZHVtcCBmZWF0dXJlLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIG1lbWR1bXBfZGVpbml0KHZvaWQpCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwljZGZfZG1hX2FkZHJfdCBwYWRkcjsKKwljZGZfZG1hX2FkZHJfdCBkbWFfY3R4ID0gMDsKKwljZGZfZGV2aWNlX3QgY2RmX2N0eDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisKKwloZGRfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoIWhkZF9jdHgpIHsKKwkJaGRkTG9nKExPR0UgLCBGTCgiSW52YWxpZCBIREQgY29udGV4dCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiTm90IGRlaW5pdGlhbGl6aW5nIG1lbWR1bXAgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybjsKKwl9CisKKwljZGZfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfQ0RGX0RFVklDRSk7CisJaWYgKCFjZGZfY3R4KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ0RGIGNvbnRleHQgaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCW1lbWR1bXBfcHJvY2ZzX3JlbW92ZSgpOworCXNtZV9md19tZW1fZHVtcF91bnJlZ2lzdGVyX2NiKGhkZF9jdHgtPmhIYWwpOworCisJbXV0ZXhfbG9jaygmaGRkX2N0eC0+bWVtZHVtcF9sb2NrKTsKKwlpZiAoaGRkX2N0eC0+ZndfZHVtcF9sb2MpIHsKKwkJcGFkZHIgPSBoZGRfY3R4LT5kdW1wX2xvY19wYWRkcjsKKwkJY2RmX29zX21lbV9mcmVlX2NvbnNpc3RlbnQoY2RmX2N0eCwKKwkJCUZXX01FTV9EVU1QX1NJWkUsIGhkZF9jdHgtPmZ3X2R1bXBfbG9jLCBwYWRkciwgZG1hX2N0eCk7CisJCWhkZF9jdHgtPmZ3X2R1bXBfbG9jID0gTlVMTDsKKwkJaGRkX2N0eC0+bWVtZHVtcF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCX0KKwltdXRleF91bmxvY2soJmhkZF9jdHgtPm1lbWR1bXBfbG9jayk7CisKKwlpZiAoQ0RGX1RJTUVSX1NUQVRFX1JVTk5JTkcgPT0KKwkgIGNkZl9tY190aW1lcl9nZXRfY3VycmVudF9zdGF0ZSgmaGRkX2N0eC0+bWVtZHVtcF9jbGVhbnVwX3RpbWVyKSkgeworCQljZGZfbWNfdGltZXJfc3RvcCgmaGRkX2N0eC0+bWVtZHVtcF9jbGVhbnVwX3RpbWVyKTsKKwl9CisKKwljZGZfc3RhdHVzID0gY2RmX21jX3RpbWVyX2Rlc3Ryb3koJmhkZF9jdHgtPm1lbWR1bXBfY2xlYW51cF90aW1lcik7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkIHRvIGRlYWxsb2NhdGUgdGltZXIiKSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfbmFuLmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfbmFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmZjEyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9uYW4uYwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIERPQzogd2xhbl9oZGRfbmFuLmMKKyAqCisgKiBXTEFOIEhvc3QgRGV2aWNlIERyaXZlciBOQU4gQVBJIGltcGxlbWVudGF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKyNpbmNsdWRlIDxhbmlfZ2xvYmFsLmg+CisjaW5jbHVkZSAic21lX2FwaS5oIgorI2luY2x1ZGUgIm5hbl9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbmFuLmgiCisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9uYW5fcmVxdWVzdCgpIC0gY2ZnODAyMTEgTkFOIHJlcXVlc3QgaGFuZGxlcgorICogQHdpcGh5OiBkcml2ZXIncyB3aXBoeSBzdHJ1Y3QKKyAqIEB3ZGV2OiB3aXJlbGVzcyBkZXZpY2UgdG8gd2hpY2ggdGhlIHJlcXVlc3QgaXMgdGFyZ2V0ZWQKKyAqIEBkYXRhOiBhY3R1YWwgcmVxdWVzdCBkYXRhIChuZXRsaW5rLWVuY2Fwc3VsYXRlZCkKKyAqIEBkYXRhX2xlbjogbGVuZ3RoIG9mIEBkYXRhCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB1c2Vyc3BhY2UgbmVlZHMgdG8gc2VuZCBhIG5hbiByZXF1ZXN0IHRvCisgKiBmaXJtd2FyZS4gVGhlIHdsYW4gaG9zdCBkcml2ZXIgc2ltcGx5IGRlLWVuY2Fwc3VsYXRlcyB0aGUKKyAqIHJlcXVlc3QgZnJvbSB0aGUgbmV0bGluayBwYXlsb2FkIGFuZCB0aGVuIGZvcndhcmRzIGl0IHRvCisgKiBmaXJtd2FyZSB2aWEgU01FLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9uYW5fcmVxdWVzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICBpbnQgZGF0YV9sZW4pCit7CisJdE5hblJlcXVlc3RSZXEgbmFuX3JlcTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlpbnQgcmV0X3ZhbDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisKKwlFTlRFUigpOworCisJcmV0X3ZhbCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmICghaGRkX2N0eC0+Y29uZmlnLT5lbmFibGVfbmFuX3N1cHBvcnQpIHsKKwkJaGRkX2VycigiTmFOIHN1cHBvcnQgaXMgbm90IGVuYWJsZWQgaW4gSU5JIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJbmFuX3JlcS5yZXF1ZXN0X2RhdGFfbGVuID0gZGF0YV9sZW47CisJbmFuX3JlcS5yZXF1ZXN0X2RhdGEgPSBkYXRhOworCisJc3RhdHVzID0gc21lX25hbl9yZXF1ZXN0KCZuYW5fcmVxKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlyZXRfdmFsID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfbmFuX3JlcXVlc3QoKSAtIGhhbmRsZSBOQU4gcmVxdWVzdAorICogQHdpcGh5OiAgIHBvaW50ZXIgdG8gd2lyZWxlc3Mgd2lwaHkgc3RydWN0dXJlLgorICogQHdkZXY6ICAgIHBvaW50ZXIgdG8gd2lyZWxlc3NfZGV2IHN0cnVjdHVyZS4KKyAqIEBkYXRhOiAgICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHBhc3NlZCB2aWEgdmVuZG9yIGludGVyZmFjZQorICogQGRhdGFfbGVuOkxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSBwYXNzZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB1c2Vyc3BhY2UgdG8gc2VuZCBhIE5BTiByZXF1ZXN0IHRvCisgKiBmaXJtd2FyZS4gIFRoaXMgaXMgYW4gU1NSLXByb3RlY3RlZCB3cmFwcGVyIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9uYW5fcmVxdWVzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICBpbnQgZGF0YV9sZW4pCisKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX25hbl9yZXF1ZXN0KHdpcGh5LCB3ZGV2LCBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9uYW5fY2FsbGJhY2soKSAtIGNmZzgwMjExIE5BTiBldmVudCBoYW5kbGVyCisgKiBAY3R4OiBnbG9iYWwgSEREIGNvbnRleHQKKyAqIEBtc2c6IE5BTiBldmVudCBtZXNzYWdlCisgKgorICogVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBpdCBnZXRzIGNhbGxlZCB3aGVuIHdlIG5lZWQgdG8gcmVwb3J0CisgKiBhIG5hbiBldmVudCB0byB1c2Vyc3BhY2UuICBUaGUgd2xhbiBob3N0IGRyaXZlciBzaW1wbHkgZW5jYXBzdWxhdGVzIHRoZQorICogZXZlbnQgaW50byBhIG5ldGxpbmsgcGF5bG9hZCBhbmQgdGhlbiBmb3J3YXJkcyBpdCB0byB1c2Vyc3BhY2UgdmlhIGEKKyAqIGNmZzgwMjExIHZlbmRvciBldmVudC4KKyAqCisgKiBSZXR1cm46IG5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfbmFuX2NhbGxiYWNrKHZvaWQgKmN0eCwgdFNpck5hbkV2ZW50ICptc2cpCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IGN0eDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdmVuZG9yX2V2ZW50OworCWludCBzdGF0dXM7CisKKwlpZiAoTlVMTCA9PSBtc2cpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJtc2cgcmVjZWl2ZWQgaGVyZSBpcyBudWxsIikpOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisKKwl2ZW5kb3JfZXZlbnQgPQorCQljZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MoaGRkX2N0eC0+d2lwaHksCisJCQkJCSAgICBOVUxMLAorCQkJCQkgICAgbXNnLT5ldmVudF9kYXRhX2xlbiArIE5MTVNHX0hEUkxFTiwKKwkJCQkJICAgIFFDQV9OTDgwMjExX1ZFTkRPUl9TVUJDTURfTkFOX0lOREVYLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXZlbmRvcl9ldmVudCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybjsKKwl9CisJaWYgKG5sYV9wdXQodmVuZG9yX2V2ZW50LCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9OQU4sCisJCSAgICBtc2ctPmV2ZW50X2RhdGFfbGVuLCBtc2ctPmV2ZW50X2RhdGEpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiUUNBX1dMQU5fVkVORE9SX0FUVFJfTkFOIHB1dCBmYWlsIikpOworCQlrZnJlZV9za2IodmVuZG9yX2V2ZW50KTsKKwkJcmV0dXJuOworCX0KKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQodmVuZG9yX2V2ZW50LCBHRlBfS0VSTkVMKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9uYW5faXNfc3VwcG9ydGVkKCkgLSBIREQgTkFOIHN1cHBvcnQgcXVlcnkgZnVuY3Rpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgTkFOIGlzIHN1cHBvcnRlZCBieSB0aGUKKyAqIGRyaXZlciBhbmQgYnkgdGhlIGZpcm13YXJlLgorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBOQU4gaXMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgYW5kIGZpcm13YXJlCisgKi8KK2Jvb2wgd2xhbl9oZGRfbmFuX2lzX3N1cHBvcnRlZCh2b2lkKQoreworCXJldHVybiBzbWVfaXNfZmVhdHVyZV9zdXBwb3J0ZWRfYnlfZncoTkFOKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9uYW5faW5pdCgpIC0gSEREIE5BTiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICogQGhkZF9jdHg6IEdsb2JhbCBIREQgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIEhERCBOQU4gZmVhdHVyZS4gIEN1cnJlbnRseQorICogdGhlIG9ubHkgb3BlcmF0aW9uIHJlcXVpcmVkIGlzIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgd2l0aCBTTUUuCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgd2xhbl9oZGRfbmFuX2luaXQoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCkKK3sKKwlzbWVfbmFuX3JlZ2lzdGVyX2NhbGxiYWNrKGhkZF9jdHgtPmhIYWwsCisJCQkJICB3bGFuX2hkZF9jZmc4MDIxMV9uYW5fY2FsbGJhY2spOworfQpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX25hcGkuYyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9uYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjYThiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9uYXBpLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogd2xhbl9oZGRfbmFwaS5jCisgKgorICogV0xBTiBIREQgTkFQSSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKyAqLworI2luY2x1ZGUgPHNtcC5oPiAvKiBnZXRfY3B1ICovCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9uYXBpLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIiAgICAgICAvKiBjZHNfZ2V0X2NvbnRleHQgKi8KKyNpbmNsdWRlICJoaWYuaCIgICAgICAgICAgIC8qIGhpZl9tYXBfc2VydmljZS4uLiovCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIiAvKiBoZGRfZXJyL3dhcm4uLi4gKi8KKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIgICAgIC8qIENERl9NT0RVTEVfSURfLi4uICovCisjaW5jbHVkZSAiY2VfYXBpLmgiCisKKy8qICBndWFyYW50ZWVkIHRvIGJlIGluaXRpYWxpemVkIHRvIHplcm8vTlVMTCBieSB0aGUgc3RhbmRhcmQgKi8KK3N0YXRpYyBzdHJ1Y3QgcWNhX25hcGlfZGF0YSAqaGRkX25hcGlfY3R4OworCisvKioKKyAqIGhkZF9uYXBpX2dldF9hbGwoKSAtIHJldHVybiB0aGUgd2hvbGUgTkFQSSBzdHJ1Y3R1cmUgZnJvbSBISUYKKyAqCisgKiBHZXRzIHRvIHRoZSBkYXRhIHN0cnVjdHVyZSBjb21tb24gdG8gYWxsIE5BUEkgaW5zdGFuY2VzLgorICoKKyAqIFJldHVybjoKKyAqICBOVUxMICA6IHByb2JhYmx5IE5BUEkgbm90IGluaXRpYWxpemVkIHlldC4KKyAqICA8YWRkcj46IHRoZSBhZGRyZXNzIG9mIHRoZSB3aG9sZSBOQVBJIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgcWNhX25hcGlfZGF0YSAqaGRkX25hcGlfZ2V0X2FsbCh2b2lkKQoreworCXN0cnVjdCBxY2FfbmFwaV9kYXRhICpycDsKKwlzdHJ1Y3Qgb2xfc29mdGMgKmhpZjsKKworCU5BUElfREVCVUcoIi0tPlxuIik7CisKKwloaWYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCUNERl9BU1NFUlQoaGlmICE9IE5VTEwpOworCXJwID0gaGlmX25hcGlfZ2V0X2FsbChoaWYpOworCisJTkFQSV9ERUJVRygiPC0tIFthZGRyPSVwXVxuIiwgcnApOworCXJldHVybiBycDsKK30KKworLyoqCisgKiBoZGRfbmFwaV9nZXRfbWFwKCkgLSBnZXQgYSBjb3B5IG9mIG5hcGkgcGlwZSBtYXAKKyAqCisgKiBSZXR1cm46CisgKiAgdWludDMyX3QgIDogY29weSBvZiBwaXBlIG1hcAorICovCitzdGF0aWMgdWludDMyX3QgaGRkX25hcGlfZ2V0X21hcCh2b2lkKQoreworCXVpbnQzMl90IG1hcDsKKworCU5BUElfREVCVUcoIi0tPlxuIik7CisJLyogY2FjaGUgb25jZSwgdXNlIGZvcmV2ZXIgKi8KKwlpZiAoaGRkX25hcGlfY3R4ID09IE5VTEwpCisJCWhkZF9uYXBpX2N0eCA9IGhkZF9uYXBpX2dldF9hbGwoKTsKKwltYXAgPSBoZGRfbmFwaV9jdHgtPmNlX21hcDsKKworCU5BUElfREVCVUcoIjwtLVttYXA9MHglMDh4XVxuIiwgbWFwKTsKKwlyZXR1cm4gbWFwOworfQorCisvKioKKyAqIGhkZF9uYXBpX2NyZWF0ZSgpIC0gY3JlYXRlcyB0aGUgTkFQSSBzdHJ1Y3R1cmVzIGZvciBhIGdpdmVuIG5ldGRldgorICoKKyAqIENyZWF0ZXMgTkFQSSBpbnN0YW5jZXMuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiB1bmNvbmRpdGlvbmFsbHkgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBJdCBjcmVhdGVzCisgKiBuYXBpIHN0cnVjdHVyZXMgdGhyb3VnaCB0aGUgcHJvcGVyIEhUQy9ISUYgY2FsbHMuCisgKiBUaGUgc3RydWN0dXJlcyBhcmUgZGlzYWJsZWQgb24gY3JlYXRpb24uCisgKgorICogUmV0dXJuOgorICogICBzaW5nbGUtcXVldWU6IDwwOiBlcnIsID4wPWlkLCAwIChzaG91bGQgbm90IGhhcHBlbikKKyAqICAgbXVsdGktcXVldWU6IGJpdG1hcCBvZiBjcmVhdGVkIGluc3RhbmNlcyAoMDogbm9uZSkKKyAqLworaW50IGhkZF9uYXBpX2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqaGlmX2N0eDsKKwl1aW50OF90IHVsLCBkbDsKKwlpbnQgICAgIHVsX3BvbGxlZCwgZGxfcG9sbGVkOworCWludCAgICAgcmMgPSAwOworCisJaGlmX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRik7CisJQ0RGX0FTU0VSVChoaWZfY3R4ICE9IE5VTEwpOworCisJTkFQSV9ERUJVRygiLS0+XG4iKTsKKworCS8qCisJICogaGlmX3NlcnZpY2VfdG9fcGlwZSBjdXJyZW50bHkgcmV0dXJucyBvbmUgcGlwZSBpZCBwZXIgc2VydmljZS4KKwkgKiBIb3dldmVyIGZvciBBZHJlc3RlYSwgd2Ugd2lsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIG1hcAorCSAqIERBVEEgc2VydmljZSB0byBtdWx0aXBsZSBwaXBlcy4gRWl0aGVyIHdlIHdpbGwgbmVlZCB0byBjcmVhdGUKKwkgKiBmYW1pbHkgb2Ygc2VydmljZXMsIG9yIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBhIGJpdG1hcCAob2YKKwkgKiBhdCBsZWFzdCAjTUFYX0NFcyBiaXRzKSBhbmQgdGhlbiB3ZSB3aWxsIG5lZWQgdG8gaXRlcmF0ZSBvbgorCSAqIHRoZSBiaXRtYXAgZm9yIGhpZl9uYXBpX2NyZWF0ZSgpIGNhbGxzLgorCSAqIEZvciBSb21lLCB0aGVyZSBpcyBvbmx5IG9uZSBzZXJ2aWNlLCBzbyB0aGVyZSBpcyBhIHNpbmdsZSBjYWxsCisJICogIFRPRE86IGNsYXJpZnkgZm9yIG11bHRpLXF1ZXVlL0FkcmVzdGVhCisJICovCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCSAgICBoaWZfbWFwX3NlcnZpY2VfdG9fcGlwZShoaWZfY3R4LCBIVFRfREFUQV9NU0dfU1ZDLAorCQkJCSAgICAmdWwsICZkbCwgJnVsX3BvbGxlZCwgJmRsX3BvbGxlZCkpIHsKKwkJaGRkX2VycigiY2Fubm90IG1hcCBzZXJ2aWNlIHRvIHBpcGUiKTsKKwkJcmMgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCXJjID0gaGlmX25hcGlfY3JlYXRlKGhpZl9jdHgsIGRsLCBoZGRfbmFwaV9wb2xsLAorCQkJCSAgICAgUUNBX05BUElfQlVER0VULCBRQ0FfTkFQSV9ERUZfU0NBTEUpOworCQlpZiAocmMgPCAwKQorCQkJaGRkX2VycigiRVJSKCVkKSBjcmVhdGluZyBOQVBJIG9uIHBpcGUgJWQiLCByYywgZGwpOworCQllbHNlIHsKKwkJCWhkZF9pbmZvKCJuYXBpIGluc3RhbmNlICVkIGNyZWF0ZWQgb24gcGlwZSAlZCIsCisJCQkJIHJjLCBkbCk7CisJCQkvKiByYyA9ICgweDAxIDw8IHJjKTsgLS0gcGhhc2UgMiAqLworCQl9CisJfQorCU5BUElfREVCVUcoIjwtLSBbcmM9JWRdXG4iLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaGRkX25hcGlfZGVzdHJveSgpIC0gZGVzdHJveXMgdGhlIE5BUEkgc3RydWN0dXJlcyBmb3IgYSBnaXZlbiBuZXRkZXYKKyAqIEBmb3JjZTogaWYgc2V0LCB3aWxsIGZvcmNlLWRpc2FibGUgdGhlIGluc3RhbmNlIGJlZm9yZSBfZGVsJ2luZworICoKKyAqIERlc3Ryb3kgTkFQSSBpbnN0YW5jZXMuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiB1bmNvbmRpdGlvbmFsbHkgZHVyaW5nIG1vZHVsZSByZW1vdmFsLiBJdCBkZXN0cm95CisgKiBuYXBpIHN0cnVjdHVyZXMgdGhyb3VnaCB0aGUgcHJvcGVyIEhUQy9ISUYgY2FsbHMuCisgKgorICogUmV0dXJuOgorICogICAgbnVtYmVyIG9mIE5BUEkgaW5zdGFuY2VzIGRlc3Ryb3llZAorICovCitpbnQgaGRkX25hcGlfZGVzdHJveShpbnQgZm9yY2UpCit7CisJaW50IHJjID0gMDsKKwlpbnQgaTsKKwl1aW50MzJfdCBoZGRfbmFwaV9tYXAgPSBoZGRfbmFwaV9nZXRfbWFwKCk7CisKKwlOQVBJX0RFQlVHKCItLT4gKGZvcmNlPSVkKVxuIiwgZm9yY2UpOworCWlmIChoZGRfbmFwaV9tYXApIHsKKwkJc3RydWN0IG9sX3NvZnRjICpoaWZfY3R4OworCisJCWhpZl9jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCQlDREZfQVNTRVJUKGhpZl9jdHggIT0gTlVMTCk7CisKKwkJZm9yIChpID0gMDsgaSA8IChzaXplb2YodWludDMyX3QpKjgpOyBpKyspCisJCQlpZiAoaGRkX25hcGlfbWFwICYgKDB4MDEgPDwgaSkpIHsKKwkJCQlpZiAoMCA8PSBoaWZfbmFwaV9kZXN0cm95KGhpZl9jdHgsCisJCQkJCQkJICBOQVBJX1BJUEUySUQoaSksCisJCQkJCQkJICBmb3JjZSkpIHsKKwkJCQkJcmMrKzsKKwkJCQkJaGRkX25hcGlfbWFwICY9IH4oMHgwMSA8PCBpKTsKKwkJCQl9IGVsc2UKKwkJCQkJaGRkX2VycigiY2Fubm90IGRlc3Ryb3kgbmFwaSBpbnN0ICVkOiAocGlwZTolZCksIGY9JWRcbiIsCisJCQkJCQlpLCBOQVBJX1BJUEUySUQoaSksIGZvcmNlKTsKKwkJCX0KKwl9CisKKwkvKiBpZiBhbGwgaW5zdGFuY2VzIGFyZSByZW1vdmVkLCBpdCBpcyBsaWtlbHkgdGhhdCBoaWZfY29udGV4dCBoYXMgYmVlbgorCSAqIHJlbW92ZWQgYXMgd2VsbCwgc28gdGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgbmFwaSBjb250ZXh0IGFsc28gbmVlZHMKKwkgKiB0byBiZSByZW1vdmVkCisJICovCisJaWYgKGZvcmNlKQorCQlDREZfQVNTRVJUKGhkZF9uYXBpX21hcCA9PSAwKTsKKwlpZiAoMCA9PSBoZGRfbmFwaV9tYXApCisJCWhkZF9uYXBpX2N0eCA9IE5VTEw7CisKKwlOQVBJX0RFQlVHKCI8LS0gW3JjPSVkXVxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBoZGRfbmFwaV9lbmFibGVkKCkgLSBjaGVja3MgaWYgTkFQSSBpcyBlbmFibGVkIChmb3IgYSBnaXZlbiBpZCkKKyAqIEBpZDogdGhlIGlkIG9mIHRoZSBOQVBJIHRvIGNoZWNrIChhbnk9IC0xKQorICoKKyAqIFJldHVybjoKKyAqICAgaW50OiAwICA9IGZhbHNlIChOT1QgZW5hYmxlZCkKKyAqICAgICAgICAhMCA9IHRydWUgIChlbmFiYmxlZCkKKyAqLworaW5saW5lIGludCBoZGRfbmFwaV9lbmFibGVkKGludCBpZCkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKmhpZjsKKworCWhpZiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRik7CisJQ0RGX0FTU0VSVChoaWYgIT0gTlVMTCk7CisJaWYgKC0xID09IGlkKQorCQlyZXR1cm4gaGlmX25hcGlfZW5hYmxlZChoaWYsIGlkKTsKKwllbHNlCisJCXJldHVybiBoaWZfbmFwaV9lbmFibGVkKGhpZiwgTkFQSV9JRDJQSVBFKGlkKSk7Cit9CisKKy8qKgorICogaGRkX25hcGlfZXZlbnQoKSAtIHJlbGF5IHRoZSBldmVudCBkZXRlY3RlZCBieSBIREQgdG8gSElGIE5BUEkgZGVjaXNpb24gbWFrZXIKKyAqIEBldmVudDogZXZlbnQgY29kZQorICogQGRhdGEgOiBldmVudC1zcGVjaWZpYyBhdXhpbGlhcnkgZGF0YQorICoKKyAqIFJldHVybiBjb2RlIGRvZXMgbm90IGluZGljYXRlIGEgY2hhbmdlLCBidXQgd2hldGhlciBvciBub3QgTkFQSSBpcworICogZW5hYmxlZCBhdCB0aGUgdGltZSBvZiB0aGUgcmV0dXJuIG9mIHRoZSBmdW5jdGlvbi4gVGhhdCBpcywgaWYgTkFQSQorICogd2FzIGRpc2FibGVkIGJlZm9yZSB0aGUgY2FsbCwgYW5kIHRoZSBldmVudCBkb2VzIG5vdCBjYXVzZSBOQVBJIHRvIGJlCisgKiBlbmFibGVkLCBhIHZhbHVlIG9mIDAgd2lsbCBiZSByZXR1cm5lZCBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgKHN0aWxsKQorICogZGlzYWJsZWQuCisgKgorICogUmV0dXJuOgorICogIDwgMDogZXJyb3IgY29kZQorICogID0gMDogTkFQSSBzdGF0ZSA9IGRpc2FibGVkIChhZnRlciBwcm9jZXNzaW5nIHRoZSBldmVudCkKKyAqICA9IDE6IE5BUEkgc3RhdGUgPSBlbmFibGVkICAoYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZXZlbnQpCisgKi8KK2ludCBoZGRfbmFwaV9ldmVudChlbnVtIHFjYV9uYXBpX2V2ZW50IGV2ZW50LCB2b2lkICpkYXRhKQoreworCWludCByYzsKKwlzdHJ1Y3Qgb2xfc29mdGMgKmhpZjsKKworCU5BUElfREVCVUcoIi0tPihldmVudD0lZCwgYXV4PSVwKVxuIiwgZXZlbnQsIGRhdGEpOworCisJaGlmID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKwlDREZfQVNTRVJUKGhpZiAhPSBOVUxMKTsKKwlyYyA9IGhpZl9uYXBpX2V2ZW50KGhpZiwgZXZlbnQsIGRhdGEpOworCisJTkFQSV9ERUJVRygiPC0tW3JjPSVkXVxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBoZGRfbmFwaV9wb2xsKCkgLSBOQVBJIHBvbGwgZnVuY3Rpb24KKyAqIEBuYXBpICA6IHBvaW50ZXIgdG8gTkFQSSBzdHJ1Y3QKKyAqIEBidWRnZXQ6IHRoZSBwcmUtZGVjbGFyZWQgYnVkZ2V0CisgKgorICogSW1wbGVtZW50YXRpb24gb2YgcG9sbCBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIGJ5IGtlcm5lbCBkdXJpbmcgc29mdGlycSBwcm9jZXNzaW5nLgorICoKKyAqIE5PVEUgRk9SIFRIRSBNQUlOVEFJTkVSOgorICogICBNYWtlIHN1cmUgdGhpcyBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBjZV90YXNrbGV0IGNvZGUuCisgKgorICogUmV0dXJuOgorICogICBpbnQ6IHRoZSBhbW91bnQgb2Ygd29yayBkb25lICggPD0gYnVkZ2V0ICkKKyAqLworaW50IGhkZF9uYXBpX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXJldHVybiBoaWZfbmFwaV9wb2xsKG5hcGksIGJ1ZGdldCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfb2NiLmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfb2NiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0OTU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9vY2IuYwpAQCAtMCwwICsxLDIxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiB3bGFuX2hkZF9vY2IuYworICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIDgwMi4xMXAgT0NCIGltcGxlbWVudGF0aW9uCisgKi8KKworI2luY2x1ZGUgImNkc19zY2hlZC5oIgorI2luY2x1ZGUgIndsYW5faGRkX2Fzc29jLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorI2luY2x1ZGUgIndsYW5faGRkX29jYi5oIgorI2luY2x1ZGUgIndsYW5faGRkX3RyYWNlLmgiCisjaW5jbHVkZSAid2xhbl90Z3RfZGVmX2NvbmZpZy5oIgorI2luY2x1ZGUgInNjaF9hcGkuaCIKKyNpbmNsdWRlICJ3bWFfYXBpLmgiCisKKy8qIFN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgV0xBTl9TRVRfRE9UMTFQX0NIQU5ORUxfU0NIRUQgKi8KKyNkZWZpbmUgQUlGU05fTUlOCQkoMikKKyNkZWZpbmUgQUlGU05fTUFYCQkoMTUpCisjZGVmaW5lIENXX01JTgkJCSgxKQorI2RlZmluZSBDV19NQVgJCQkoMTApCisKKy8qIE1heGltdW0gdGltZShtcykgdG8gd2FpdCBmb3IgT0NCIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgV0xBTl9XQUlUX1RJTUVfT0NCX0NNRCAxNTAwCisjZGVmaW5lIEhERF9PQ0JfTUFHSUMgMHg0ODlhMTU0ZgorCisvKioKKyAqIHN0cnVjdCBoZGRfb2NiX2N0eHQgLSBDb250ZXh0IGZvciBPQ0Igb3BlcmF0aW9ucworICogYWRhcHRlcjogdGhlIG9jYiBhZGFwdGVyCisgKiBjb21wbGV0aW9uX2V2dDogdGhlIGNvbXBsZXRpb24gZXZlbnQKKyAqIHN0YXR1czogc3RhdHVzIG9mIHRoZSByZXF1ZXN0CisgKi8KK3N0cnVjdCBoZGRfb2NiX2N0eHQgeworCXVpbnQzMl90IG1hZ2ljOworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbl9ldnQ7CisJaW50IHN0YXR1czsKK307CisKKy8qKgorICogaGRkX3NldF9kb3QxMXBfY29uZmlnKCkgLSBTZXQgODAyLjExcCBjb25maWcgZmxhZworICogQGhkZF9jdHg6IEhERCBDb250ZXh0IHBvaW50ZXIKKyAqCisgKiBUT0RPLU9DQjogVGhpcyBoYXMgYmVlbiB0ZW1wb3JhcmlseSBhZGRlZCB0byBlbnN1cmUgdGhpcyBwYXJhbXRlcgorICogaXMgc2V0IGluIENTUiB3aGVuIHdlIGluaXQgdGhlIGNoYW5uZWwgbGlzdC4gVGhpcyBzaG91bGQgYmUgcmVtb3ZlZAorICogb25jZSB0aGUgNS45IEdIeiBjaGFubmVscyBhcmUgYWRkZWQgdG8gdGhlIHJlZ3VsYXRvcnkgZG9tYWluLgorICovCit2b2lkIGhkZF9zZXRfZG90MTFwX2NvbmZpZyhoZGRfY29udGV4dF90ICpoZGRfY3R4KQoreworCXNtZV9zZXRfZG90MTFwX2NvbmZpZyhoZGRfY3R4LT5oSGFsLAorCQkJICAgICAgaGRkX2N0eC0+Y29uZmlnLT5kb3QxMXBfbW9kZSAhPQorCQkJCVdMQU5fSEREXzExUF9ESVNBQkxFRCk7Cit9CisKKy8qKgorICogZG90MTFwX3ZhbGlkYXRlX3Fvc19wYXJhbXMoKSAtIENoZWNrIGlmIFFvUyBwYXJhbWV0ZXJzIGFyZSB2YWxpZAorICogQHFvc19wYXJhbXM6ICAgQXJyYXkgb2YgUW9TIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4gZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGRvdDExcF92YWxpZGF0ZV9xb3NfcGFyYW1zKHN0cnVjdCBzaXJfcW9zX3BhcmFtcyBxb3NfcGFyYW1zW10pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9BQzsgaSsrKSB7CisJCWlmICgoIXFvc19wYXJhbXNbaV0uYWlmc24pICYmICghcW9zX3BhcmFtc1tpXS5jd21pbikKKwkJCQkmJiAoIXFvc19wYXJhbXNbaV0uY3dtYXgpKQorCQkJY29udGludWU7CisKKwkJLyogVmFsaWRhdGUgQUlGU04gKi8KKwkJaWYgKChxb3NfcGFyYW1zW2ldLmFpZnNuIDwgQUlGU05fTUlOKQorCQkJCXx8IChxb3NfcGFyYW1zW2ldLmFpZnNuID4gQUlGU05fTUFYKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIFFvUyBwYXJhbWV0ZXIgYWlmc24gJWQiKSwKKwkJCQlxb3NfcGFyYW1zW2ldLmFpZnNuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogVmFsaWRhdGUgQ1dNaW4gKi8KKwkJaWYgKChxb3NfcGFyYW1zW2ldLmN3bWluIDwgQ1dfTUlOKQorCQkJCXx8IChxb3NfcGFyYW1zW2ldLmN3bWluID4gQ1dfTUFYKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIFFvUyBwYXJhbWV0ZXIgY3dtaW4gJWQiKSwKKwkJCQlxb3NfcGFyYW1zW2ldLmN3bWluKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogVmFsaWRhdGUgQ1dNYXggKi8KKwkJaWYgKChxb3NfcGFyYW1zW2ldLmN3bWF4IDwgQ1dfTUlOKQorCQkJCXx8IChxb3NfcGFyYW1zW2ldLmN3bWF4ID4gQ1dfTUFYKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIFFvUyBwYXJhbWV0ZXIgY3dtYXggJWQiKSwKKwkJCQlxb3NfcGFyYW1zW2ldLmN3bWF4KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgMTYsIDApKSB8fCBcCisJCQkJIGRlZmluZWQoRkVBVFVSRV9TVEFUSUNBTExZX0FERF8xMVBfQ0hBTk5FTFMpCisvKgorICogSWYgRkVBVFVSRV9TVEFUSUNBTExZX0FERF8xMVBfQ0hBTk5FTFMKKyAqIGlzIGRlZmluZWQsIElFRUU4MDIxMV9DSEFOX05PXzEwTUhaLAorICogYW5kIElFRUU4MDIxMV9DSEFOX05PXzIwTUhaIHdvbid0CisgKiBiZSBkZWZpbmVkLgorICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX05PXzIwTUhaCSgxPDwxMSkKKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fTk9fMTBNSFoJKDE8PDEyKQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1NUQVRJQ0FMTFlfQUREXzExUF9DSEFOTkVMUworCisjZGVmaW5lIERPVDExUF9UWF9QV1JfTUFYCTMwCisjZGVmaW5lIERPVDExUF9UWF9BTlRFTk5BX01BWAk2CisjZGVmaW5lIE5VTV9ET1QxMVBfQ0hBTk5FTFMJMTAKKy8qKgorICogc3RydWN0IGNoYW5faW5mbyAtIGluZm9ybWF0aW9uIGZvciB0aGUgY2hhbm5lbAorICogQGNlbnRlcl9mcmVxOiBjZW50ZXIgZnJlcXVlbmN5CisgKiBAbWF4X2JhbmR3aWR0aDogbWF4aW11bSBiYW5kd2lkdGggb2YgdGhlIGNoYW5uZWwgaW4gTUh6CisgKi8KK3N0cnVjdCBjaGFuX2luZm8geworCXVpbnQzMl90IGNlbnRlcl9mcmVxOworCXVpbnQzMl90IG1heF9iYW5kd2lkdGg7Cit9OworCitzdHJ1Y3QgY2hhbl9pbmZvIHZhbGlkX2RvdDExcF9jaGFubmVsc1tOVU1fRE9UMTFQX0NIQU5ORUxTXSA9IHsKKwl7NTg2MCwgMTB9LAorCXs1ODcwLCAxMH0sCisJezU4ODAsIDEwfSwKKwl7NTg5MCwgMTB9LAorCXs1OTAwLCAxMH0sCisJezU5MTAsIDEwfSwKKwl7NTkyMCwgMTB9LAorCXs1ODc1LCAyMH0sCisJezU5MDUsIDIwfSwKKwl7NTg1MiwgNX0KK307CisKKy8qKgorICogZG90MTFwX3ZhbGlkYXRlX2NoYW5uZWxfc3RhdGljX2NoYW5uZWxzKCkgLSB2YWxpZGF0ZSBhIERTUkMgY2hhbm5lbAorICogQGNlbnRlcl9mcmVxOiB0aGUgY2hhbm5lbCdzIGNlbnRlciBmcmVxdWVuY3kKKyAqIEBiYW5kd2lkdGg6IHRoZSBjaGFubmVsJ3MgYmFuZHdpZHRoCisgKiBAdHhfcG93ZXI6IHRyYW5zbWl0IHBvd2VyCisgKiBAcmVnX3Bvd2VyOiAob3V0cHV0KSB0aGUgbWF4IHR4IHBvd2VyIGZyb20gdGhlIHJlZ3VsYXRvcnkgZG9tYWluCisgKiBAYW50ZW5uYV9tYXg6IChvdXRwdXQpIHRoZSBtYXggYW50ZW5uYSBnYWluIGZyb20gdGhlIHJlZ3VsYXRvcnkgZG9tYWluCisgKgorICogVGhpcyBmdW5jdGlvbiBvZiB0aGUgZnVuY3Rpb24gY2hlY2tzIHRoZSBjaGFubmVsIHBhcmFtZXRlcnMgYWdhaW5zdCBhCisgKiBoYXJkY29kZWQgbGlzdCBvZiB2YWxpZCBjaGFubmVscyBiYXNlZCBvbiB0aGUgRkNDIHJ1bGVzLgorICoKKyAqIFJldHVybjogMCBpZiB0aGUgY2hhbm5lbCBpcyB2YWxpZCwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZG90MTFwX3ZhbGlkYXRlX2NoYW5uZWxfc3RhdGljX2NoYW5uZWxzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJdWludDMyX3QgY2hhbm5lbF9mcmVxLCB1aW50MzJfdCBiYW5kd2lkdGgsIHVpbnQzMl90IHR4X3Bvd2VyLAorCXVpbnQ4X3QgKnJlZ19wb3dlciwgdWludDhfdCAqYW50ZW5uYV9tYXgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RPVDExUF9DSEFOTkVMUzsgaSsrKSB7CisJCWlmIChjaGFubmVsX2ZyZXEgPT0gdmFsaWRfZG90MTFwX2NoYW5uZWxzW2ldLmNlbnRlcl9mcmVxKSB7CisJCQlpZiAocmVnX3Bvd2VyKQorCQkJCSpyZWdfcG93ZXIgPSBET1QxMVBfVFhfUFdSX01BWDsKKwkJCWlmIChhbnRlbm5hX21heCkKKwkJCQkqYW50ZW5uYV9tYXggPSBET1QxMVBfVFhfQU5URU5OQV9NQVg7CisKKwkJCWlmIChiYW5kd2lkdGggPT0gMCkKKwkJCQliYW5kd2lkdGggPQorCQkJCQl2YWxpZF9kb3QxMXBfY2hhbm5lbHNbaV0ubWF4X2JhbmR3aWR0aDsKKwkJCWVsc2UgaWYgKGJhbmR3aWR0aCA+CisJCQkJIHZhbGlkX2RvdDExcF9jaGFubmVsc1tpXS5tYXhfYmFuZHdpZHRoKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZiAoYmFuZHdpZHRoICE9IDUgJiYgYmFuZHdpZHRoICE9IDEwICYmCisJCQkgICAgYmFuZHdpZHRoICE9IDIwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHR4X3Bvd2VyID4gRE9UMTFQX1RYX1BXUl9NQVgpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZWxzZQorLyoqCisgKiBkb3QxMXBfdmFsaWRhdGVfY2hhbm5lbF9zdGF0aWNfY2hhbm5lbHMoKSAtIHZhbGlkYXRlIGEgRFNSQyBjaGFubmVsCisgKiBAY2VudGVyX2ZyZXE6IHRoZSBjaGFubmVsJ3MgY2VudGVyIGZyZXF1ZW5jeQorICogQGJhbmR3aWR0aDogdGhlIGNoYW5uZWwncyBiYW5kd2lkdGgKKyAqIEB0eF9wb3dlcjogdHJhbnNtaXQgcG93ZXIKKyAqIEByZWdfcG93ZXI6IChvdXRwdXQpIHRoZSBtYXggdHggcG93ZXIgZnJvbSB0aGUgcmVndWxhdG9yeSBkb21haW4KKyAqIEBhbnRlbm5hX21heDogKG91dHB1dCkgdGhlIG1heCBhbnRlbm5hIGdhaW4gZnJvbSB0aGUgcmVndWxhdG9yeSBkb21haW4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG9mIHRoZSBmdW5jdGlvbiBjaGVja3MgdGhlIGNoYW5uZWwgcGFyYW1ldGVycyBhZ2FpbnN0IGEKKyAqIGhhcmRjb2RlZCBsaXN0IG9mIHZhbGlkIGNoYW5uZWxzIGJhc2VkIG9uIHRoZSBGQ0MgcnVsZXMuCisgKgorICogUmV0dXJuOiAwIGlmIHRoZSBjaGFubmVsIGlzIHZhbGlkLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBkb3QxMXBfdmFsaWRhdGVfY2hhbm5lbF9zdGF0aWNfY2hhbm5lbHMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwl1aW50MzJfdCBjaGFubmVsX2ZyZXEsIHVpbnQzMl90IGJhbmR3aWR0aCwgdWludDMyX3QgdHhfcG93ZXIsCisJdWludDhfdCAqcmVnX3Bvd2VyLCB1aW50OF90ICphbnRlbm5hX21heCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1NUQVRJQ0FMTFlfQUREXzExUF9DSEFOTkVMUyAqLworCisvKioKKyAqIGRvdDExcF92YWxpZGF0ZV9jaGFubmVsKCkgLSB2YWxpZGF0ZXMgYSBEU1JDIGNoYW5uZWwKKyAqIEBjZW50ZXJfZnJlcTogdGhlIGNoYW5uZWwncyBjZW50ZXIgZnJlcXVlbmN5CisgKiBAYmFuZHdpZHRoOiB0aGUgY2hhbm5lbCdzIGJhbmR3aWR0aAorICogQHR4X3Bvd2VyOiB0cmFuc21pdCBwb3dlcgorICogQHJlZ19wb3dlcjogKG91dHB1dCkgdGhlIG1heCB0eCBwb3dlciBmcm9tIHRoZSByZWd1bGF0b3J5IGRvbWFpbgorICogQGFudGVubmFfbWF4OiAob3V0cHV0KSB0aGUgbWF4IGFudGVubmEgZ2FpbiBmcm9tIHRoZSByZWd1bGF0b3J5IGRvbWFpbgorICoKKyAqIFJldHVybjogMCBpZiB0aGUgY2hhbm5lbCBpcyB2YWxpZCwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZG90MTFwX3ZhbGlkYXRlX2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICB1aW50MzJfdCBjaGFubmVsX2ZyZXEsIHVpbnQzMl90IGJhbmR3aWR0aCwKKwkJCQkgICB1aW50MzJfdCB0eF9wb3dlciwgdWludDhfdCAqcmVnX3Bvd2VyLAorCQkJCSAgIHVpbnQ4X3QgKmFudGVubmFfbWF4KQoreworCWludCBiYW5kX2lkeCwgY2hhbm5lbF9pZHg7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqY3VycmVudF9iYW5kOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VycmVudF9jaGFubmVsOworCisJZm9yIChiYW5kX2lkeCA9IDA7IGJhbmRfaWR4IDwgSUVFRTgwMjExX05VTV9CQU5EUzsgYmFuZF9pZHgrKykgeworCQljdXJyZW50X2JhbmQgPSB3aXBoeS0+YmFuZHNbYmFuZF9pZHhdOworCQlpZiAoIWN1cnJlbnRfYmFuZCkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoY2hhbm5lbF9pZHggPSAwOyBjaGFubmVsX2lkeCA8IGN1cnJlbnRfYmFuZC0+bl9jaGFubmVsczsKKwkJICAgICAgY2hhbm5lbF9pZHgrKykgeworCQkJY3VycmVudF9jaGFubmVsID0gJmN1cnJlbnRfYmFuZC0+Y2hhbm5lbHNbY2hhbm5lbF9pZHhdOworCisJCQlpZiAoY2hhbm5lbF9mcmVxID09IGN1cnJlbnRfY2hhbm5lbC0+Y2VudGVyX2ZyZXEpIHsKKwkJCQlpZiAoY3VycmVudF9jaGFubmVsLT5mbGFncyAmCisJCQkJICAgIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJCWlmIChyZWdfcG93ZXIpCisJCQkJCSpyZWdfcG93ZXIgPQorCQkJCQkJY3VycmVudF9jaGFubmVsLT5tYXhfcmVnX3Bvd2VyOworCQkJCWlmIChhbnRlbm5hX21heCkKKwkJCQkJKmFudGVubmFfbWF4ID0KKwkJCQkJCWN1cnJlbnRfY2hhbm5lbC0+CisJCQkJCQltYXhfYW50ZW5uYV9nYWluOworCisJCQkJc3dpdGNoIChiYW5kd2lkdGgpIHsKKwkJCQljYXNlIDA6CisJCQkJCWlmIChjdXJyZW50X2NoYW5uZWwtPmZsYWdzICYKKwkJCQkJICAgIElFRUU4MDIxMV9DSEFOX05PXzEwTUhaKQorCQkJCQkJYmFuZHdpZHRoID0gNTsKKwkJCQkJZWxzZSBpZiAoY3VycmVudF9jaGFubmVsLT5mbGFncyAmCisJCQkJCQkgSUVFRTgwMjExX0NIQU5fTk9fMjBNSFopCisJCQkJCQliYW5kd2lkdGggPSAxMDsKKwkJCQkJZWxzZQorCQkJCQkJYmFuZHdpZHRoID0gMjA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNToKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxMDoKKwkJCQkJaWYgKGN1cnJlbnRfY2hhbm5lbC0+ZmxhZ3MgJgorCQkJCQkgICAgSUVFRTgwMjExX0NIQU5fTk9fMTBNSFopCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyMDoKKwkJCQkJaWYgKGN1cnJlbnRfY2hhbm5lbC0+ZmxhZ3MgJgorCQkJCQkgICAgSUVFRTgwMjExX0NIQU5fTk9fMjBNSFopCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJaWYgKHR4X3Bvd2VyID4gY3VycmVudF9jaGFubmVsLT5tYXhfcG93ZXIpCisJCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gZG90MTFwX3ZhbGlkYXRlX2NoYW5uZWxfc3RhdGljX2NoYW5uZWxzKHdpcGh5LCBjaGFubmVsX2ZyZXEsCisJCWJhbmR3aWR0aCwgdHhfcG93ZXIsIHJlZ19wb3dlciwgYW50ZW5uYV9tYXgpOworfQorCisvKioKKyAqIGhkZF9vY2JfdmFsaWRhdGVfY29uZmlnKCkgLSBWYWxpZGF0ZXMgdGhlIGNvbmZpZyBkYXRhCisgKiBAY29uZmlnOiBjb25maWd1cmF0aW9uIHRvIGJlIHZhbGlkYXRlZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGhkZF9vY2JfdmFsaWRhdGVfY29uZmlnKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgc3RydWN0IHNpcl9vY2JfY29uZmlnICpjb25maWcpCit7CisJaW50IGk7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5jaGFubmVsX2NvdW50OyBpKyspIHsKKwkJaWYgKGRvdDExcF92YWxpZGF0ZV9jaGFubmVsKGhkZF9jdHgtPndpcGh5LAorCQkJCQkgICAgY29uZmlnLT5jaGFubmVsc1tpXS5jaGFuX2ZyZXEsCisJCQkJCSAgICBjb25maWctPmNoYW5uZWxzW2ldLmJhbmR3aWR0aCwKKwkJCQkJICAgIGNvbmZpZy0+Y2hhbm5lbHNbaV0ubWF4X3B3ciwKKwkJCQkJICAgICZjb25maWctPmNoYW5uZWxzW2ldLnJlZ19wd3IsCisJCQkJCSAgICAmY29uZmlnLT5jaGFubmVsc1tpXS5hbnRlbm5hX21heCkpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBjaGFubmVsIGZyZXF1ZW5jeSAlZCIpLAorCQkJCWNvbmZpZy0+Y2hhbm5lbHNbaV0uY2hhbl9mcmVxKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChkb3QxMXBfdmFsaWRhdGVfcW9zX3BhcmFtcyhjb25maWctPmNoYW5uZWxzW2ldLnFvc19wYXJhbXMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX29jYl9yZWdpc3Rlcl9zdGEoKSAtIFJlZ2lzdGVyIHN0YXRpb24gd2l0aCBUcmFuc3BvcnQgTGF5ZXIKKyAqIEBhZGFwdGVyOiBQb2ludGVyIHRvIEhERCBBZGFwdGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW52b2tlZCBpbiB0aGUgT0NCIFNldCBTY2hlZHVsZSBjYWxsYmFjaworICogdG8gZW5hYmxlIHRoZSBkYXRhIHBhdGggaW4gdGhlIFRMIGJ5IGNhbGxpbmcgUmVnaXN0ZXJTVEFDbGllbnQKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4gLTEgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBoZGRfb2NiX3JlZ2lzdGVyX3N0YShoZGRfYWRhcHRlcl90ICphZGFwdGVyKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXN0cnVjdCBvbF90eHJ4X2Rlc2NfdHlwZSBzdGFfZGVzYyA9IHswfTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIoYWRhcHRlcik7CisJdWludDhfdCBwZWVyX2lkOworCisJY2RmX3N0YXR1cyA9IG9sX3R4cnhfcmVnaXN0ZXJfb2NiX3BlZXIoaGRkX2N0eC0+cGNkc19jb250ZXh0LAorCQkJCQkgICAgICAgYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsCisJCQkJCSAgICAgICAmcGVlcl9pZCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJFcnJvciByZWdpc3RlcmluZyBPQ0IgU2VsZiBQZWVyISIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGRkX2N0eC0+c3RhX3RvX2FkYXB0ZXJbcGVlcl9pZF0gPSBhZGFwdGVyOworCisJc3RhX2Rlc2Muc3RhX2lkID0gcGVlcl9pZDsKKwlzdGFfZGVzYy5pc19xb3NfZW5hYmxlZCA9IDE7CisKKwljZGZfc3RhdHVzID0gb2xfdHhyeF9yZWdpc3Rlcl9wZWVyKGhkZF9yeF9wYWNrZXRfY2JrLAorCQkJCQkJJnN0YV9kZXNjKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byByZWdpc3Rlci4gU3RhdHVzPSAlZCBbMHglMDhYXSIpLAorCQkgICAgICAgY2RmX3N0YXR1cywgY2RmX3N0YXR1cyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbMF0gIT0gMCAmJgorCSAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdICE9IHBlZXJfaWQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJUaGUgSUQgZm9yIHRoZSBPQ0Igc3RhdGlvbiBoYXMgY2hhbmdlZC4iKSk7CisJfQorCisJcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdID0gcGVlcl9pZDsKKwljZGZfY29weV9tYWNhZGRyKCZwSGRkU3RhQ3R4LT5jb25uX2luZm8ucGVlck1hY0FkZHJlc3NbMF0sCisJCQkgJmFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9vY2JfY29uZmlnX25ldygpIC0gQ3JlYXRlcyBhIG5ldyBPQ0IgY29uZmlndXJhdGlvbgorICogQG51bV9jaGFubmVsczogdGhlIG51bWJlciBvZiBjaGFubmVscworICogQG51bV9zY2hlZHVsZTogdGhlIHNjaGVkdWxlIHNpemUKKyAqIEBuZGxfY2hhbl9saXN0X2xlbjogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBOREwgY2hhbiBibG9iCisgKiBAbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbjogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhY3RpdmUgc3RhdGUgYmxvYgorICoKKyAqIFJldHVybjogQSBwb2ludGVyIHRvIHRoZSBPQ0IgY29uZmlndXJhdGlvbiBzdHJ1Y3QsIE5VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBzaXJfb2NiX2NvbmZpZyAqaGRkX29jYl9jb25maWdfbmV3KGludCBudW1fY2hhbm5lbHMsCisJCQkJCQkgaW50IG51bV9zY2hlZHVsZSwKKwkJCQkJCSBpbnQgbmRsX2NoYW5fbGlzdF9sZW4sCisJCQkJCQkgaW50IG5kbF9hY3RpdmVfc3RhdGVfbGlzdF9sZW4pCit7CisJc3RydWN0IHNpcl9vY2JfY29uZmlnICpyZXQgPSAwOworCXVpbnQzMl90IGxlbjsKKwl2b2lkICpjdXJzb3I7CisKKwlpZiAobnVtX2NoYW5uZWxzID4gQ0ZHX1RHVF9OVU1fT0NCX0NIQU5ORUxTIHx8CisJCQludW1fc2NoZWR1bGUgPiBDRkdfVEdUX05VTV9PQ0JfU0NIRURVTEVTKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHNpemVvZigqcmV0KSArCisJCW51bV9jaGFubmVscyAqIHNpemVvZihzdHJ1Y3Qgc2lyX29jYl9jb25maWdfY2hhbm5lbCkgKworCQludW1fc2NoZWR1bGUgKiBzaXplb2Yoc3RydWN0IHNpcl9vY2JfY29uZmlnX3NjaGVkKSArCisJCW5kbF9jaGFuX2xpc3RfbGVuICsKKwkJbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbjsKKworCWN1cnNvciA9IGNkZl9tZW1fbWFsbG9jKGxlbik7CisJaWYgKCFjdXJzb3IpCisJCWdvdG8gZmFpbDsKKworCWNkZl9tZW1femVybyhjdXJzb3IsIGxlbik7CisJcmV0ID0gY3Vyc29yOworCWN1cnNvciArPSBzaXplb2YoKnJldCk7CisKKwlyZXQtPmNoYW5uZWxfY291bnQgPSBudW1fY2hhbm5lbHM7CisJcmV0LT5jaGFubmVscyA9IGN1cnNvcjsKKwljdXJzb3IgKz0gbnVtX2NoYW5uZWxzICogc2l6ZW9mKCpyZXQtPmNoYW5uZWxzKTsKKworCXJldC0+c2NoZWR1bGVfc2l6ZSA9IG51bV9zY2hlZHVsZTsKKwlyZXQtPnNjaGVkdWxlID0gY3Vyc29yOworCWN1cnNvciArPSBudW1fc2NoZWR1bGUgKiBzaXplb2YoKnJldC0+c2NoZWR1bGUpOworCisJcmV0LT5kY2NfbmRsX2NoYW5fbGlzdCA9IGN1cnNvcjsKKwljdXJzb3IgKz0gbmRsX2NoYW5fbGlzdF9sZW47CisKKwlyZXQtPmRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3QgPSBjdXJzb3I7CisJY3Vyc29yICs9IG5kbF9hY3RpdmVfc3RhdGVfbGlzdF9sZW47CisKKwlyZXR1cm4gcmV0OworCitmYWlsOgorCWNkZl9tZW1fZnJlZShyZXQpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGhkZF9vY2Jfc2V0X2NvbmZpZ19jYWxsYmFjaygpIC0gT0NCIHNldCBjb25maWcgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBjb250ZXh0X3B0cjogT0NCIGNhbGwgY29udGV4dAorICogQHJlc3BvbnNlX3B0cjogUG9pbnRlciB0byByZXNwb25zZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgYXMgYSBjYWxsYmFjayB3aXRoIHRoZSBsb3dlciBsYXllcnMKKyAqIGFuZCBpcyB1c2VkIHRvIHJlc3BvbmQgd2l0aCB0aGUgc3RhdHVzIG9mIGEgT0NCIHNldCBjb25maWcgY29tbWFuZC4KKyAqLworc3RhdGljIHZvaWQgaGRkX29jYl9zZXRfY29uZmlnX2NhbGxiYWNrKHZvaWQgKmNvbnRleHRfcHRyLCB2b2lkICpyZXNwb25zZV9wdHIpCit7CisJc3RydWN0IGhkZF9vY2JfY3R4dCAqY29udGV4dCA9IGNvbnRleHRfcHRyOworCXN0cnVjdCBzaXJfb2NiX3NldF9jb25maWdfcmVzcG9uc2UgKnJlc3AgPSByZXNwb25zZV9wdHI7CisKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybjsKKworCWlmIChyZXNwICYmIHJlc3AtPnN0YXR1cykKKwkJaGRkTG9nKExPR0UsIEZMKCJPcGVyYXRpb24gZmFpbGVkOiAlZCIpLCByZXNwLT5zdGF0dXMpOworCisJc3Bpbl9sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwlpZiAoY29udGV4dC0+bWFnaWMgPT0gSEREX09DQl9NQUdJQykgeworCQloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gY29udGV4dC0+YWRhcHRlcjsKKwkJaWYgKCFyZXNwKSB7CisJCQljb250ZXh0LT5zdGF0dXMgPSAtRUlOVkFMOworCQkJY29tcGxldGUoJmNvbnRleHQtPmNvbXBsZXRpb25fZXZ0KTsKKwkJCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWNvbnRleHQtPmFkYXB0ZXItPm9jYl9zZXRfY29uZmlnX3Jlc3AgPSAqcmVzcDsKKwkJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCQlpZiAoIXJlc3AtPnN0YXR1cykgeworCQkJLyoKKwkJCSAqIE9DQiBzZXQgY29uZmlnIGNvbW1hbmQgc3VjY2Vzc2Z1bC4KKwkJCSAqIE9wZW4gdGhlIFRYIGRhdGEgcGF0aAorCQkJICovCisJCQlpZiAoIWhkZF9vY2JfcmVnaXN0ZXJfc3RhKGFkYXB0ZXIpKSB7CisJCQkJbmV0aWZfY2Fycmllcl9vbihhZGFwdGVyLT5kZXYpOworCQkJCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoCisJCQkJICAgIGFkYXB0ZXItPmRldik7CisJCQl9CisJCX0KKworCQlzcGluX2xvY2soJmhkZF9jb250ZXh0X2xvY2spOworCQlpZiAoY29udGV4dC0+bWFnaWMgPT0gSEREX09DQl9NQUdJQykKKwkJCWNvbXBsZXRlKCZjb250ZXh0LT5jb21wbGV0aW9uX2V2dCk7CisJCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJfQorfQorCisvKioKKyAqIGhkZF9vY2Jfc2V0X2NvbmZpZ19yZXEoKSAtIFNlbmQgYW4gT0NCIHNldCBjb25maWcgcmVxdWVzdAorICogQGFkYXB0ZXI6IGEgcG9pbnRlciB0byB0aGUgYWRhcHRlcgorICogQGNvbmZpZzogYSBwb2ludGVyIHRvIHRoZSBPQ0IgY29uZmlndXJhdGlvbgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGhkZF9vY2Jfc2V0X2NvbmZpZ19yZXEoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgIHN0cnVjdCBzaXJfb2NiX2NvbmZpZyAqY29uZmlnKQoreworCWludCByYzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJc3RydWN0IGhkZF9vY2JfY3R4dCBjb250ZXh0ID0gezB9OworCisJaWYgKGhkZF9vY2JfdmFsaWRhdGVfY29uZmlnKGFkYXB0ZXIsIGNvbmZpZykpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJUaGUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJmNvbnRleHQuY29tcGxldGlvbl9ldnQpOworCWNvbnRleHQuYWRhcHRlciA9IGFkYXB0ZXI7CisJY29udGV4dC5tYWdpYyA9IEhERF9PQ0JfTUFHSUM7CisKKwloZGRMb2coTE9HMSwgRkwoIkRpc2FibGluZyBxdWV1ZXMiKSk7CisJbmV0aWZfdHhfZGlzYWJsZShhZGFwdGVyLT5kZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGFkYXB0ZXItPmRldik7CisKKwkvKiBDYWxsIHRoZSBTTUUgQVBJIHRvIHNldCB0aGUgY29uZmlnICovCisJY2RmX3N0YXR1cyA9IHNtZV9vY2Jfc2V0X2NvbmZpZygKKwkJKChoZGRfY29udGV4dF90ICopYWRhcHRlci0+cEhkZEN0eCktPmhIYWwsICZjb250ZXh0LAorCQloZGRfb2NiX3NldF9jb25maWdfY2FsbGJhY2ssIGNvbmZpZyk7CisJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRXJyb3IgY2FsbGluZyBTTUUgZnVuY3Rpb24uIikpOworCQkvKiBDb252ZXJ0IGZyb20gZWNkZl9zdGF0dXMgdG8gZXJybm8gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGZ1bmN0aW9uIHRvIGNvbXBsZXRlLiAqLworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb250ZXh0LmNvbXBsZXRpb25fZXZ0LAorCQltc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX09DQl9DTUQpKTsKKwlpZiAocmMgPT0gMCkgeworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZW5kOworCX0KKwlyYyA9IDA7CisKKwlpZiAoY29udGV4dC5zdGF0dXMpIHsKKwkJcmMgPSBjb250ZXh0LnN0YXR1czsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKGFkYXB0ZXItPm9jYl9zZXRfY29uZmlnX3Jlc3Auc3RhdHVzKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJLyogZmFsbCB0aHJvdWdoICovCitlbmQ6CisJc3Bpbl9sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwljb250ZXh0Lm1hZ2ljID0gMDsKKwlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJaWYgKHJjKQorCQloZGRMb2coTE9HRSwgRkwoIk9wZXJhdGlvbiBmYWlsZWQ6ICVkIiksIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogX19pd19zZXRfZG90MTFwX2NoYW5uZWxfc2NoZWQoKSAtIEhhbmRsZXIgZm9yIFdMQU5fU0VUX0RPVDExUF9DSEFOTkVMX1NDSEVECisgKgkJCQkgICAgIGlvY3RsCisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiBAaXdfcmVxdWVzdF9pbmZvOiBJVyBSZXF1ZXN0IEluZm8KKyAqIEB3cnF1OiBJVyBSZXF1ZXN0IFVzZXJzcGFjZSBEYXRhIFBvaW50ZXIKKyAqIEBleHRyYTogSVcgUmVxdWVzdCBLZXJuZWwgRGF0YSBQb2ludGVyCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBfX2l3X3NldF9kb3QxMXBfY2hhbm5lbF9zY2hlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGRvdDExcF9jaGFubmVsX3NjaGVkICpzY2hlZDsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJc3RydWN0IHNpcl9vY2JfY29uZmlnICpjb25maWcgPSBOVUxMOworCXVpbnQ4X3QgKm1hY19hZGRyOworCWludCBpLCBqOworCXN0cnVjdCBzaXJfb2NiX2NvbmZpZ19jaGFubmVsICpjdXJyX2NoYW47CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFkYXB0ZXItPmRldmljZV9tb2RlICE9IFdMQU5fSEREX09DQikgeworCQloZGRMb2coTE9HRSwgRkwoIkRldmljZSBub3QgaW4gT0NCIG1vZGUhIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzY2hlZCA9IChzdHJ1Y3QgZG90MTFwX2NoYW5uZWxfc2NoZWQgKilleHRyYTsKKworCS8qIFNjaGVkdWxlZCBzbG90cyBzYW1lIGFzIG51bSBjaGFubmVscyBmb3IgY29tcGF0aWJpbGl0eSAqLworCWNvbmZpZyA9IGhkZF9vY2JfY29uZmlnX25ldyhzY2hlZC0+bnVtX2NoYW5uZWxzLCBzY2hlZC0+bnVtX2NoYW5uZWxzLAorCQkJCSAgICAwLCAwKTsKKwlpZiAoY29uZmlnID09IE5VTEwpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ISIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogSWRlbnRpZnkgdGhlIHZkZXYgaW50ZXJmYWNlICovCisJY29uZmlnLT5zZXNzaW9uX2lkID0gYWRhcHRlci0+c2Vzc2lvbklkOworCisJLyogUmVsZWFzZSBhbGwgdGhlIG1hYyBhZGRyZXNzZXMgdXNlZCBmb3IgT0NCICovCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm9jYl9tYWNfYWRkcl9jb3VudDsgaSsrKSB7CisJCXdsYW5faGRkX3JlbGVhc2VfaW50Zl9hZGRyKGFkYXB0ZXItPnBIZGRDdHgsCisJCQkJCSAgIGFkYXB0ZXItPm9jYl9tYWNfYWRkcmVzc1tpXSk7CisJfQorCWFkYXB0ZXItPm9jYl9tYWNfYWRkcl9jb3VudCA9IDA7CisKKwljb25maWctPmNoYW5uZWxfY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBzY2hlZC0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJaWYgKDAgPT0gc2NoZWQtPmNoYW5uZWxzW2ldLmNoYW5uZWxfZnJlcSkKKwkJCWNvbnRpbnVlOworCisJCWN1cnJfY2hhbiA9ICYoY29uZmlnLT5jaGFubmVsc1tjb25maWctPmNoYW5uZWxfY291bnRdKTsKKworCQljdXJyX2NoYW4tPmNoYW5fZnJlcSA9IHNjaGVkLT5jaGFubmVsc1tpXS5jaGFubmVsX2ZyZXE7CisJCS8qCisJCSAqIHR4X3Bvd2VyIGlzIGRpdmlkZWQgYnkgMiBiZWNhdXNlIG9jYl9jaGFubmVsLnR4X3Bvd2VyIGlzCisJCSAqIGluIGhhbGYgZEIgaW5jcmVtZW50cyBhbmQgc2lyX29jYl9jb25maWdfY2hhbm5lbC5tYXhfcHdyCisJCSAqIGlzIGluIDEgZEIgaW5jcmVtZW50cy4KKwkJICovCisJCWN1cnJfY2hhbi0+bWF4X3B3ciA9IHNjaGVkLT5jaGFubmVsc1tpXS50eF9wb3dlciAvIDI7CisJCWN1cnJfY2hhbi0+YmFuZHdpZHRoID0gc2NoZWQtPmNoYW5uZWxzW2ldLmNoYW5uZWxfYmFuZHdpZHRoOworCQkvKiBhc3N1bWUgMTAgYXMgZGVmYXVsdCBpZiBub3QgcHJvdmlkZWQgKi8KKwkJaWYgKGN1cnJfY2hhbi0+YmFuZHdpZHRoID09IDApCisJCQljdXJyX2NoYW4tPmJhbmR3aWR0aCA9IDEwOworCisJCS8qCisJCSAqIFNldHVwIGxvY2FsbHkgYWRtaW5pc3RlcmVkIG1hYyBhZGRyZXNzZXMgZm9yIGVhY2ggY2hhbm5lbC4KKwkJICogRmlyc3QgY2hhbm5lbCB1c2VzIHRoZSBhZGFwdGVyJ3MgYWRkcmVzcy4KKwkJICovCisJCWlmIChpID09IDApIHsKKwkJCWNkZl9tZW1fY29weShjdXJyX2NoYW4tPm1hY19hZGRyZXNzLAorCQkJCSAgICAgYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsCisJCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJfSBlbHNlIHsKKwkJCW1hY19hZGRyID0gd2xhbl9oZGRfZ2V0X2ludGZfYWRkcihhZGFwdGVyLT5wSGRkQ3R4KTsKKwkJCWlmIChtYWNfYWRkciA9PSBOVUxMKSB7CisJCQkJaGRkTG9nKExPR0UsIEZMKCJDYW5ub3Qgb2J0YWluIG1hYyBhZGRyZXNzIikpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQljZGZfbWVtX2NvcHkoY29uZmlnLT5jaGFubmVsc1sKKwkJCQkgICAgIGNvbmZpZy0+Y2hhbm5lbF9jb3VudF0ubWFjX2FkZHJlc3MsCisJCQkJICAgICBtYWNfYWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCQkvKiBTYXZlIHRoZSBtYWMgYWRkcmVzcyB0byByZWxlYXNlIGxhdGVyICovCisJCQljZGZfbWVtX2NvcHkoYWRhcHRlci0+b2NiX21hY19hZGRyZXNzWworCQkJCSAgICAgYWRhcHRlci0+b2NiX21hY19hZGRyX2NvdW50XSwKKwkJCQkgICAgIG1hY19hZGRyLAorCQkJCSAgICAgc2l6ZW9mKGFkYXB0ZXItPm9jYl9tYWNfYWRkcmVzc1sKKwkJCQkgICAgIGFkYXB0ZXItPm9jYl9tYWNfYWRkcl9jb3VudF0pKTsKKwkJCWFkYXB0ZXItPm9jYl9tYWNfYWRkcl9jb3VudCsrOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IE1BWF9OVU1fQUM7IGorKykgeworCQkJY3Vycl9jaGFuLT5xb3NfcGFyYW1zW2pdLmFpZnNuID0KKwkJCQlzY2hlZC0+Y2hhbm5lbHNbaV0ucW9zX3BhcmFtc1tqXS5haWZzbjsKKwkJCWN1cnJfY2hhbi0+cW9zX3BhcmFtc1tqXS5jd21pbiA9CisJCQkJc2NoZWQtPmNoYW5uZWxzW2ldLnFvc19wYXJhbXNbal0uY3dtaW47CisJCQljdXJyX2NoYW4tPnFvc19wYXJhbXNbal0uY3dtYXggPQorCQkJCXNjaGVkLT5jaGFubmVsc1tpXS5xb3NfcGFyYW1zW2pdLmN3bWF4OworCQl9CisKKwkJY29uZmlnLT5jaGFubmVsX2NvdW50Kys7CisJfQorCisJLyoKKwkgKiBTY2hlZHVsZWQgc2xvdHMgc2FtZSBhcyBudW0gY2hhbm5lbHMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorCSAqIGxlZ2FjeSB1c2UuCisJICovCisJZm9yIChpID0gMDsgaSA8IHNjaGVkLT5udW1fY2hhbm5lbHM7IGkrKykgeworCQljb25maWctPnNjaGVkdWxlW2ldLmNoYW5fZnJlcSA9IHNjaGVkLT5jaGFubmVsc1tpXS5jaGFubmVsX2ZyZXE7CisJCWNvbmZpZy0+c2NoZWR1bGVbaV0uZ3VhcmRfaW50ZXJ2YWwgPQorCQkJc2NoZWQtPmNoYW5uZWxzW2ldLnN0YXJ0X2d1YXJkX2ludGVydmFsOworCQljb25maWctPnNjaGVkdWxlW2ldLnRvdGFsX2R1cmF0aW9uID0KKwkJCXNjaGVkLT5jaGFubmVsc1tpXS5kdXJhdGlvbjsKKwl9CisKKwlyYyA9IGhkZF9vY2Jfc2V0X2NvbmZpZ19yZXEoYWRhcHRlciwgY29uZmlnKTsKKwlpZiAocmMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJFcnJvciB3aGlsZSBzZXR0aW5nIE9DQiBjb25maWciKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyYyA9IDA7CisKK2ZhaWw6CisJY2RmX21lbV9mcmVlKGNvbmZpZyk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGl3X3NldF9kb3QxMXBfY2hhbm5lbF9zY2hlZCgpIC0gSU9DVEwgaW50ZXJmYWNlIGZvciBzZXR0aW5nIGNoYW5uZWwgc2NoZWR1bGUKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqIEBpd19yZXF1ZXN0X2luZm86IElXIFJlcXVlc3QgSW5mbworICogQHdycXU6IElXIFJlcXVlc3QgVXNlcnNwYWNlIERhdGEgUG9pbnRlcgorICogQGV4dHJhOiBJVyBSZXF1ZXN0IEtlcm5lbCBEYXRhIFBvaW50ZXIKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KKyAqLworaW50IGl3X3NldF9kb3QxMXBfY2hhbm5lbF9zY2hlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfZG90MTFwX2NoYW5uZWxfc2NoZWQoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHFjYV93bGFuX3ZlbmRvcl9vY2Jfc2V0X2NvbmZpZ19wb2xpY3lbCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX01BWCArIDFdID0geworCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19DSEFOTkVMX0NPVU5UXSA9IHsKKwkJLnR5cGUgPSBOTEFfVTMyCisJfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfU0NIRURVTEVfU0laRV0gPSB7CisJCS50eXBlID0gTkxBX1UzMgorCX0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX0NIQU5ORUxfQVJSQVldID0geworCQkudHlwZSA9IE5MQV9CSU5BUlkKKwl9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19TQ0hFRFVMRV9BUlJBWV0gPSB7CisJCS50eXBlID0gTkxBX0JJTkFSWQorCX0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX05ETF9DSEFOTkVMX0FSUkFZXSA9IHsKKwkJLnR5cGUgPSBOTEFfQklOQVJZCisJfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfTkRMX0FDVElWRV9TVEFURV9BUlJBWV0gPSB7CisJCS50eXBlID0gTkxBX0JJTkFSWQorCX0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX0ZMQUdTXSA9IHsKKwkJLnR5cGUgPSBOTEFfVTMyCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBxY2Ffd2xhbl92ZW5kb3Jfb2NiX3NldF91dGNfdGltZV9wb2xpY3lbCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfVVRDX1RJTUVfTUFYICsgMV0gPSB7CisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfVVRDX1RJTUVfVkFMVUVdID0geworCQkudHlwZSA9IE5MQV9CSU5BUlksIC5sZW4gPSBTSVpFX1VUQ19USU1FCisJfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9VVENfVElNRV9FUlJPUl0gPSB7CisJCS50eXBlID0gTkxBX0JJTkFSWSwgLmxlbiA9IFNJWkVfVVRDX1RJTUVfRVJST1IKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHFjYV93bGFuX3ZlbmRvcl9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydF9wb2xpY3lbCisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TVEFSVF9USU1JTkdfQURWRVJUX01BWCArIDFdID0geworCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU1RBUlRfVElNSU5HX0FEVkVSVF9DSEFOTkVMX0ZSRVFdID0geworCQkudHlwZSA9IE5MQV9VMzIKKwl9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU1RBUlRfVElNSU5HX0FEVkVSVF9SRVBFQVRfUkFURV0gPSB7CisJCS50eXBlID0gTkxBX1UzMgorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgIHFjYV93bGFuX3ZlbmRvcl9vY2Jfc3RvcF90aW1pbmdfYWR2ZXJ0X3BvbGljeVsKKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9NQVggKyAxXSA9IHsKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9DSEFOTkVMX0ZSRVFdID0geworCQkudHlwZSA9IE5MQV9VMzIKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHFjYV93bGFuX3ZlbmRvcl9vY2JfZ2V0X3RzZl90aW1lcl9yZXNwW10gPSB7CisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9HRVRfVFNGX1JFU1BfVElNRVJfSElHSF0gPSB7CisJCS50eXBlID0gTkxBX1UzMgorCX0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9HRVRfVFNGX1JFU1BfVElNRVJfTE9XXSA9IHsKKwkJLnR5cGUgPSBOTEFfVTMyCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBxY2Ffd2xhbl92ZW5kb3JfZGNjX2dldF9zdGF0c1tdID0geworCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX0NIQU5ORUxfQ09VTlRdID0geworCQkudHlwZSA9IE5MQV9VMzIKKwl9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX1JFUVVFU1RfQVJSQVldID0geworCQkudHlwZSA9IE5MQV9CSU5BUlkKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHFjYV93bGFuX3ZlbmRvcl9kY2NfZ2V0X3N0YXRzX3Jlc3BbXSA9IHsKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0dFVF9TVEFUU19SRVNQX0NIQU5ORUxfQ09VTlRdID0geworCQkudHlwZSA9IE5MQV9VMzIKKwl9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX1JFU1BfU1RBVFNfQVJSQVldID0geworCQkudHlwZSA9IE5MQV9CSU5BUlkKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHFjYV93bGFuX3ZlbmRvcl9kY2NfY2xlYXJfc3RhdHNbXSA9IHsKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0NMRUFSX1NUQVRTX0JJVE1BUF0gPSB7CisJCS50eXBlID0gTkxBX1UzMgorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgcWNhX3dsYW5fdmVuZG9yX2RjY191cGRhdGVfbmRsWworCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfVVBEQVRFX05ETF9NQVggKyAxXSA9IHsKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX1VQREFURV9ORExfQ0hBTk5FTF9DT1VOVF0gPSB7CisJCS50eXBlID0gTkxBX1UzMgorCX0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19VUERBVEVfTkRMX0NIQU5ORUxfQVJSQVldID0geworCQkudHlwZSA9IE5MQV9CSU5BUlkKKwl9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfVVBEQVRFX05ETF9BQ1RJVkVfU1RBVEVfQVJSQVldID0geworCQkudHlwZSA9IE5MQV9CSU5BUlkKKwl9LAorfTsKKworLyoqCisgKiBzdHJ1Y3Qgd2xhbl9oZGRfb2NiX2NvbmZpZ19jaGFubmVsCisgKiBAY2hhbl9mcmVxOiBmcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwKKyAqIEBiYW5kd2lkdGg6IGJhbmR3aWR0aCBvZiB0aGUgY2hhbm5lbCwgZWl0aGVyIDEwIG9yIDIwIE1IegorICogQG1hY19hZGRyZXNzOiBNQUMgYWRkcmVzcyBhc3NpZ25lZCB0byB0aGlzIGNoYW5uZWwKKyAqIEBxb3NfcGFyYW1zOiBRb1MgcGFyYW1ldGVycworICogQG1heF9wd3I6IG1heGltdW0gdHJhbnNtaXQgcG93ZXIgb2YgdGhlIGNoYW5uZWwgKDEvMiBkQm0pCisgKiBAbWluX3B3cjogbWluaW11bSB0cmFuc21pdCBwb3dlciBvZiB0aGUgY2hhbm5lbCAoMS8yIGRCbSkKKyAqLworc3RydWN0IHdsYW5faGRkX29jYl9jb25maWdfY2hhbm5lbCB7CisJdWludDMyX3QgY2hhbl9mcmVxOworCXVpbnQzMl90IGJhbmR3aWR0aDsKKwl1aW50MTZfdCBmbGFnczsKKwl1aW50OF90IHJlc2VydmVkWzRdOworCXN0cnVjdCBzaXJfcW9zX3BhcmFtcyBxb3NfcGFyYW1zW01BWF9OVU1fQUNdOworCXVpbnQzMl90IG1heF9wd3I7CisJdWludDMyX3QgbWluX3B3cjsKK307CisKK3N0YXRpYyB2b2lkIHdsYW5faGRkX29jYl9jb25maWdfY2hhbm5lbF90b19zaXJfb2NiX2NvbmZpZ19jaGFubmVsKAorCXN0cnVjdCBzaXJfb2NiX2NvbmZpZ19jaGFubmVsICpkZXN0LAorCXN0cnVjdCB3bGFuX2hkZF9vY2JfY29uZmlnX2NoYW5uZWwgKnNyYywKKwl1aW50MzJfdCBjaGFubmVsX2NvdW50KQoreworCXVpbnQzMl90IGk7CisKKwljZGZfbWVtX3plcm8oZGVzdCwgY2hhbm5lbF9jb3VudCAqIHNpemVvZigqZGVzdCkpOworCisJZm9yIChpID0gMDsgaSA8IGNoYW5uZWxfY291bnQ7IGkrKykgeworCQlkZXN0W2ldLmNoYW5fZnJlcSA9IHNyY1tpXS5jaGFuX2ZyZXE7CisJCWRlc3RbaV0uYmFuZHdpZHRoID0gc3JjW2ldLmJhbmR3aWR0aDsKKwkJY2RmX21lbV9jb3B5KGRlc3RbaV0ucW9zX3BhcmFtcywgc3JjW2ldLnFvc19wYXJhbXMsCisJCQkgICAgIHNpemVvZihkZXN0W2ldLnFvc19wYXJhbXMpKTsKKwkJLyoKKwkJICogIG1heF9wd3IgYW5kIG1pbl9wd3IgYXJlIGRpdmlkZWQgYnkgMiBiZWNhdXNlCisJCSAqICB3bGFuX2hkZF9vY2JfY29uZmlnX2NoYW5uZWwubWF4X3B3ciBhbmQgbWluX3B3cgorCQkgKiAgYXJlIGluIDEvMiBkQiBpbmNyZW1lbnRzIGFuZAorCQkgKiAgc2lyX29jYl9jb25maWdfY2hhbm5lbC5tYXhfcHdyIGFuZCBtaW5fcHdyIGFyZSBpbgorCQkgKiAgMSBkQiBpbmNyZW1lbnRzLgorCQkgKi8KKwkJZGVzdFtpXS5tYXhfcHdyID0gc3JjW2ldLm1heF9wd3IgLyAyOworCQlkZXN0W2ldLm1pbl9wd3IgPSAoc3JjW2ldLm1pbl9wd3IgKyAxKSAvIDI7CisJCWRlc3RbaV0uZmxhZ3MgPSBzcmNbaV0uZmxhZ3M7CisJfQorfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfb2NiX3NldF9jb25maWcoKSAtIEludGVyZmFjZSBmb3Igc2V0IGNvbmZpZyBjb21tYW5kCisgKiBAd2lwaHk6IHBvaW50ZXIgdG8gdGhlIHdpcGh5CisgKiBAd2RldjogcG9pbnRlciB0byB0aGUgd2RldgorICogQGRhdGE6IFRoZSBuZXRsaW5rIGRhdGEKKyAqIEBkYXRhX2xlbjogVGhlIGxlbmd0aCBvZiB0aGUgbmV0bGluayBkYXRhIGluIGJ5dGVzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc2V0X2NvbmZpZyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgICBpbnQgZGF0YV9sZW4pCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXN0cnVjdCBubGF0dHIgKnRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX01BWCArIDFdOworCXN0cnVjdCBubGF0dHIgKmNoYW5uZWxfYXJyYXk7CisJc3RydWN0IG5sYXR0ciAqc2NoZWRfYXJyYXk7CisJc3RydWN0IG5sYXR0ciAqbmRsX2NoYW5fbGlzdDsKKwl1aW50MzJfdCBuZGxfY2hhbl9saXN0X2xlbjsKKwlzdHJ1Y3QgbmxhdHRyICpuZGxfYWN0aXZlX3N0YXRlX2xpc3Q7CisJdWludDMyX3QgbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbjsKKwl1aW50MzJfdCBmbGFncyA9IDA7CisJaW50IGk7CisJaW50IGNoYW5uZWxfY291bnQsIHNjaGVkdWxlX3NpemU7CisJc3RydWN0IHNpcl9vY2JfY29uZmlnICpjb25maWc7CisJaW50IHJjID0gLUVJTlZBTDsKKwl1aW50OF90ICptYWNfYWRkcjsKKworCUVOVEVSKCk7CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFkYXB0ZXItPmRldmljZV9tb2RlICE9IFdMQU5fSEREX09DQikgeworCQloZGRMb2coTE9HRSwgRkwoIkRldmljZSBub3QgaW4gT0NCIG1vZGUhIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBQYXJzZSB0aGUgbmV0bGluayBtZXNzYWdlICovCisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfTUFYLAorCQkJZGF0YSwKKwkJCWRhdGFfbGVuLCBxY2Ffd2xhbl92ZW5kb3Jfb2NiX3NldF9jb25maWdfcG9saWN5KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIHNjaGVkdWxlICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19DSEFOTkVMX0NPVU5UXSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNIQU5ORUxfQ09VTlQgaXMgbm90IHByZXNlbnQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljaGFubmVsX2NvdW50ID0gbmxhX2dldF91MzIoCisJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX0NIQU5ORUxfQ09VTlRdKTsKKworCS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgY2hhbm5lbCBzY2hlZHVsZSAqLworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfU0NIRURVTEVfU0laRV0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJTQ0hFRFVMRV9TSVpFIGlzIG5vdCBwcmVzZW50IikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2NoZWR1bGVfc2l6ZSA9IG5sYV9nZXRfdTMyKAorCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19TQ0hFRFVMRV9TSVpFXSk7CisKKwkvKiBHZXQgdGhlIG5kbCBjaGFuIGFycmF5IGFuZCB0aGUgbmRsIGFjdGl2ZSBzdGF0ZSBhcnJheS4gKi8KKwluZGxfY2hhbl9saXN0ID0KKwkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfTkRMX0NIQU5ORUxfQVJSQVldOworCW5kbF9jaGFuX2xpc3RfbGVuID0gKG5kbF9jaGFuX2xpc3QgPyBubGFfbGVuKG5kbF9jaGFuX2xpc3QpIDogMCk7CisKKwluZGxfYWN0aXZlX3N0YXRlX2xpc3QgPQorCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19ORExfQUNUSVZFX1NUQVRFX0FSUkFZXTsKKwluZGxfYWN0aXZlX3N0YXRlX2xpc3RfbGVuID0gKG5kbF9hY3RpdmVfc3RhdGVfbGlzdCA/CisJCQkJICAgIG5sYV9sZW4obmRsX2FjdGl2ZV9zdGF0ZV9saXN0KSA6IDApOworCisJLyogR2V0IHRoZSBmbGFncyAqLworCWlmICh0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19GTEFHU10pCisJCWZsYWdzID0gbmxhX2dldF91MzIodGJbCisJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfRkxBR1NdKTsKKworCWNvbmZpZyA9IGhkZF9vY2JfY29uZmlnX25ldyhjaGFubmVsX2NvdW50LCBzY2hlZHVsZV9zaXplLAorCQkJCSAgICBuZGxfY2hhbl9saXN0X2xlbiwKKwkJCQkgICAgbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbik7CisJaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSEiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNvbmZpZy0+Y2hhbm5lbF9jb3VudCA9IGNoYW5uZWxfY291bnQ7CisJY29uZmlnLT5zY2hlZHVsZV9zaXplID0gc2NoZWR1bGVfc2l6ZTsKKwljb25maWctPmZsYWdzID0gZmxhZ3M7CisKKwkvKiBSZWFkIHRoZSBjaGFubmVsIGFycmF5ICovCisJY2hhbm5lbF9hcnJheSA9IHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX0NIQU5ORUxfQVJSQVldOworCWlmICghY2hhbm5lbF9hcnJheSkgeworCQloZGRMb2coTE9HRSwgRkwoIk5vIGNoYW5uZWwgcHJlc2VudCIpKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAobmxhX2xlbihjaGFubmVsX2FycmF5KSAhPSBjaGFubmVsX2NvdW50ICoKKwkgICAgc2l6ZW9mKHN0cnVjdCB3bGFuX2hkZF9vY2JfY29uZmlnX2NoYW5uZWwpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ0hBTk5FTF9BUlJBWSBpcyBub3QgdGhlIGNvcnJlY3Qgc2l6ZSIpKTsKKwkJZ290byBmYWlsOworCX0KKwl3bGFuX2hkZF9vY2JfY29uZmlnX2NoYW5uZWxfdG9fc2lyX29jYl9jb25maWdfY2hhbm5lbCgKKwkgICAgY29uZmlnLT5jaGFubmVscywgbmxhX2RhdGEoY2hhbm5lbF9hcnJheSksIGNoYW5uZWxfY291bnQpOworCisJLyogSWRlbnRpZnkgdGhlIHZkZXYgaW50ZXJmYWNlICovCisJY29uZmlnLT5zZXNzaW9uX2lkID0gYWRhcHRlci0+c2Vzc2lvbklkOworCisJLyogUmVsZWFzZSBhbGwgdGhlIG1hYyBhZGRyZXNzZXMgdXNlZCBmb3IgT0NCICovCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm9jYl9tYWNfYWRkcl9jb3VudDsgaSsrKSB7CisJCXdsYW5faGRkX3JlbGVhc2VfaW50Zl9hZGRyKGFkYXB0ZXItPnBIZGRDdHgsCisJCQkJCSAgIGFkYXB0ZXItPm9jYl9tYWNfYWRkcmVzc1tpXSk7CisJfQorCWFkYXB0ZXItPm9jYl9tYWNfYWRkcl9jb3VudCA9IDA7CisKKwkvKgorCSAqIFNldHVwIGxvY2FsbHkgYWRtaW5pc3RlcmVkIG1hYyBhZGRyZXNzZXMgZm9yIGVhY2ggY2hhbm5lbC4KKwkgKiBGaXJzdCBjaGFubmVsIHVzZXMgdGhlIGFkYXB0ZXIncyBhZGRyZXNzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmNoYW5uZWxfY291bnQ7IGkrKykgeworCQlpZiAoaSA9PSAwKSB7CisJCQljZGZfbWVtX2NvcHkoY29uZmlnLT5jaGFubmVsc1tpXS5tYWNfYWRkcmVzcywKKwkJCQlhZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcywKKwkJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJfSBlbHNlIHsKKwkJCW1hY19hZGRyID0gd2xhbl9oZGRfZ2V0X2ludGZfYWRkcihhZGFwdGVyLT5wSGRkQ3R4KTsKKwkJCWlmIChtYWNfYWRkciA9PSBOVUxMKSB7CisJCQkJaGRkTG9nKExPR0UsIEZMKCJDYW5ub3Qgb2J0YWluIG1hYyBhZGRyZXNzIikpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCWNkZl9tZW1fY29weShjb25maWctPmNoYW5uZWxzW2ldLm1hY19hZGRyZXNzLAorCQkJCW1hY19hZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJCS8qIFNhdmUgdGhlIG1hYyBhZGRyZXNzIHRvIHJlbGVhc2UgbGF0ZXIgKi8KKwkJCWNkZl9tZW1fY29weShhZGFwdGVyLT5vY2JfbWFjX2FkZHJlc3NbCisJCQkJICAgICBhZGFwdGVyLT5vY2JfbWFjX2FkZHJfY291bnRdLAorCQkJCSAgICAgY29uZmlnLT5jaGFubmVsc1tpXS5tYWNfYWRkcmVzcywKKwkJCQkgICAgIHNpemVvZihhZGFwdGVyLT5vY2JfbWFjX2FkZHJlc3NbCisJCQkJICAgICBhZGFwdGVyLT5vY2JfbWFjX2FkZHJfY291bnRdKSk7CisJCQlhZGFwdGVyLT5vY2JfbWFjX2FkZHJfY291bnQrKzsKKwkJfQorCX0KKworCS8qIFJlYWQgdGhlIHNjaGVkdWxlIGFycmF5ICovCisJc2NoZWRfYXJyYXkgPSB0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19TQ0hFRFVMRV9BUlJBWV07CisJaWYgKCFzY2hlZF9hcnJheSkgeworCQloZGRMb2coTE9HRSwgRkwoIk5vIGNoYW5uZWwgcHJlc2VudCIpKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAobmxhX2xlbihzY2hlZF9hcnJheSkgIT0gc2NoZWR1bGVfc2l6ZSAqIHNpemVvZigqY29uZmlnLT5zY2hlZHVsZSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJTQ0hFRFVMRV9BUlJBWSBpcyBub3QgdGhlIGNvcnJlY3Qgc2l6ZSIpKTsKKwkJZ290byBmYWlsOworCX0KKwljZGZfbWVtX2NvcHkoY29uZmlnLT5zY2hlZHVsZSwgbmxhX2RhdGEoc2NoZWRfYXJyYXkpLAorCQlubGFfbGVuKHNjaGVkX2FycmF5KSk7CisKKwkvKiBDb3B5IHRoZSBOREwgY2hhbiBhcnJheSAqLworCWlmIChuZGxfY2hhbl9saXN0X2xlbikgeworCQljb25maWctPmRjY19uZGxfY2hhbl9saXN0X2xlbiA9IG5kbF9jaGFuX2xpc3RfbGVuOworCQljZGZfbWVtX2NvcHkoY29uZmlnLT5kY2NfbmRsX2NoYW5fbGlzdCwgbmxhX2RhdGEobmRsX2NoYW5fbGlzdCksCisJCQlubGFfbGVuKG5kbF9jaGFuX2xpc3QpKTsKKwl9CisKKwkvKiBDb3B5IHRoZSBOREwgYWN0aXZlIHN0YXRlIGFycmF5ICovCisJaWYgKG5kbF9hY3RpdmVfc3RhdGVfbGlzdF9sZW4pIHsKKwkJY29uZmlnLT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbiA9CisJCQluZGxfYWN0aXZlX3N0YXRlX2xpc3RfbGVuOworCQljZGZfbWVtX2NvcHkoY29uZmlnLT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0LAorCQkJbmxhX2RhdGEobmRsX2FjdGl2ZV9zdGF0ZV9saXN0KSwKKwkJCW5sYV9sZW4obmRsX2FjdGl2ZV9zdGF0ZV9saXN0KSk7CisJfQorCisJcmMgPSBoZGRfb2NiX3NldF9jb25maWdfcmVxKGFkYXB0ZXIsIGNvbmZpZyk7CisJaWYgKHJjKQorCQloZGRMb2coTE9HRSwgRkwoIkVycm9yIHdoaWxlIHNldHRpbmcgT0NCIGNvbmZpZzogJWQiKSwgcmMpOworCitmYWlsOgorCWNkZl9tZW1fZnJlZShjb25maWcpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc2V0X2NvbmZpZygpIC0gSW50ZXJmYWNlIGZvciBzZXQgY29uZmlnIGNvbW1hbmQKKyAqIEB3aXBoeTogcG9pbnRlciB0byB0aGUgd2lwaHkKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHRoZSB3ZGV2CisgKiBAZGF0YTogVGhlIG5ldGxpbmsgZGF0YQorICogQGRhdGFfbGVuOiBUaGUgbGVuZ3RoIG9mIHRoZSBuZXRsaW5rIGRhdGEgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX29jYl9zZXRfY29uZmlnKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX29jYl9zZXRfY29uZmlnKHdpcGh5LCB3ZGV2LCBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX29jYl9zZXRfdXRjX3RpbWUoKSAtIEludGVyZmFjZSBmb3Igc2V0IFVUQyB0aW1lIGNvbW1hbmQKKyAqIEB3aXBoeTogcG9pbnRlciB0byB0aGUgd2lwaHkKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHRoZSB3ZGV2CisgKiBAZGF0YTogVGhlIG5ldGxpbmsgZGF0YQorICogQGRhdGFfbGVuOiBUaGUgbGVuZ3RoIG9mIHRoZSBuZXRsaW5rIGRhdGEgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX29jYl9zZXRfdXRjX3RpbWUoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCQljb25zdCB2b2lkICpkYXRhLAorCQkJCQkJaW50IGRhdGFfbGVuKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX1VUQ19USU1FX01BWCArIDFdOworCXN0cnVjdCBubGF0dHIgKnV0Y19hdHRyOworCXN0cnVjdCBubGF0dHIgKnRpbWVfZXJyb3JfYXR0cjsKKwlzdHJ1Y3Qgc2lyX29jYl91dGMgKnV0YzsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJRU5URVIoKTsKKworCWlmICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWRhcHRlci0+ZGV2aWNlX21vZGUgIT0gV0xBTl9IRERfT0NCKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRGV2aWNlIG5vdCBpbiBPQ0IgbW9kZSEiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghd21hX2lzX3ZkZXZfdXAoYWRhcHRlci0+c2Vzc2lvbklkKSkgeworCQloZGRMb2coTE9HRSwgRkwoIlRoZSBkZXZpY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFBhcnNlIHRoZSBuZXRsaW5rIG1lc3NhZ2UgKi8KKwlpZiAobmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX1VUQ19USU1FX01BWCwKKwkJICAgICAgZGF0YSwKKwkJICAgICAgZGF0YV9sZW4sIHFjYV93bGFuX3ZlbmRvcl9vY2Jfc2V0X3V0Y190aW1lX3BvbGljeSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIEFUVFIiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFJlYWQgdGhlIFVUQyB0aW1lICovCisJdXRjX2F0dHIgPSB0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX1VUQ19USU1FX1ZBTFVFXTsKKwlpZiAoIXV0Y19hdHRyKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiVVRDX1RJTUUgaXMgbm90IHByZXNlbnQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobmxhX2xlbih1dGNfYXR0cikgIT0gU0laRV9VVENfVElNRSkgeworCQloZGRMb2coTE9HRSwgRkwoIlVUQ19USU1FIGlzIG5vdCB0aGUgY29ycmVjdCBzaXplIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBSZWFkIHRoZSB0aW1lIGVycm9yICovCisJdGltZV9lcnJvcl9hdHRyID0gdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9VVENfVElNRV9FUlJPUl07CisJaWYgKCF0aW1lX2Vycm9yX2F0dHIpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJVVENfVElNRSBpcyBub3QgcHJlc2VudCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChubGFfbGVuKHRpbWVfZXJyb3JfYXR0cikgIT0gU0laRV9VVENfVElNRV9FUlJPUikgeworCQloZGRMb2coTE9HRSwgRkwoIlVUQ19USU1FIGlzIG5vdCB0aGUgY29ycmVjdCBzaXplIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1dGMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnV0YykpOworCWlmICghdXRjKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdXRjLT52ZGV2X2lkID0gYWRhcHRlci0+c2Vzc2lvbklkOworCWNkZl9tZW1fY29weSh1dGMtPnV0Y190aW1lLCBubGFfZGF0YSh1dGNfYXR0ciksIFNJWkVfVVRDX1RJTUUpOworCWNkZl9tZW1fY29weSh1dGMtPnRpbWVfZXJyb3IsIG5sYV9kYXRhKHRpbWVfZXJyb3JfYXR0ciksCisJCVNJWkVfVVRDX1RJTUVfRVJST1IpOworCisJaWYgKHNtZV9vY2Jfc2V0X3V0Y190aW1lKGhkZF9jdHgtPmhIYWwsIHV0YykgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRXJyb3Igd2hpbGUgc2V0dGluZyBVVEMgdGltZSIpKTsKKwkJcmMgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCXJjID0gMDsKKwl9CisKKwljZGZfbWVtX2ZyZWUodXRjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfb2NiX3NldF91dGNfdGltZSgpIC0gSW50ZXJmYWNlIGZvciB0aGUgc2V0IFVUQyB0aW1lIGNvbW1hbmQKKyAqIEB3aXBoeTogcG9pbnRlciB0byB0aGUgd2lwaHkKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHRoZSB3ZGV2CisgKiBAZGF0YTogVGhlIG5ldGxpbmsgZGF0YQorICogQGRhdGFfbGVuOiBUaGUgbGVuZ3RoIG9mIHRoZSBuZXRsaW5rIGRhdGEgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX29jYl9zZXRfdXRjX3RpbWUoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgICAgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfb2NiX3NldF91dGNfdGltZSh3aXBoeSwgd2RldiwgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydCgpIC0gSW50ZXJmYWNlIGZvciBzdGFydCBUQSBjbWQKKyAqIEB3aXBoeTogcG9pbnRlciB0byB0aGUgd2lwaHkKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHRoZSB3ZGV2CisgKiBAZGF0YTogVGhlIG5ldGxpbmsgZGF0YQorICogQGRhdGFfbGVuOiBUaGUgbGVuZ3RoIG9mIHRoZSBuZXRsaW5rIGRhdGEgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgICBpbnQgZGF0YV9sZW4pCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChXTEFOX0hERF9HRVRfSEFMX0NUWChhZGFwdGVyKSk7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfTUFYICsgMV07CisJc3RydWN0IHNpcl9vY2JfdGltaW5nX2FkdmVydCAqdGltaW5nX2FkdmVydDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJRU5URVIoKTsKKworCWlmICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWRhcHRlci0+ZGV2aWNlX21vZGUgIT0gV0xBTl9IRERfT0NCKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRGV2aWNlIG5vdCBpbiBPQ0IgbW9kZSEiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghd21hX2lzX3ZkZXZfdXAoYWRhcHRlci0+c2Vzc2lvbklkKSkgeworCQloZGRMb2coTE9HRSwgRkwoIlRoZSBkZXZpY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRpbWluZ19hZHZlcnQgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnRpbWluZ19hZHZlcnQpKTsKKwlpZiAoIXRpbWluZ19hZHZlcnQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjZGZfbWVtX21hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljZGZfbWVtX3plcm8odGltaW5nX2FkdmVydCwgc2l6ZW9mKCp0aW1pbmdfYWR2ZXJ0KSk7CisJdGltaW5nX2FkdmVydC0+dmRldl9pZCA9IGFkYXB0ZXItPnNlc3Npb25JZDsKKworCS8qIFBhcnNlIHRoZSBuZXRsaW5rIG1lc3NhZ2UgKi8KKwlpZiAobmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU1RBUlRfVElNSU5HX0FEVkVSVF9NQVgsCisJCSAgICAgIGRhdGEsCisJCSAgICAgIGRhdGFfbGVuLAorCQkgICAgICBxY2Ffd2xhbl92ZW5kb3Jfb2NiX3N0YXJ0X3RpbWluZ19hZHZlcnRfcG9saWN5KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfQ0hBTk5FTF9GUkVRXSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNIQU5ORUxfRlJFUSBpcyBub3QgcHJlc2VudCIpKTsKKwkJZ290byBmYWlsOworCX0KKwl0aW1pbmdfYWR2ZXJ0LT5jaGFuX2ZyZXEgPSBubGFfZ2V0X3UzMigKKwkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfQ0hBTk5FTF9GUkVRXSk7CisKKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TVEFSVF9USU1JTkdfQURWRVJUX1JFUEVBVF9SQVRFXSkgeworCQloZGRMb2coTE9HRSwgRkwoIlJFUEVBVF9SQVRFIGlzIG5vdCBwcmVzZW50IikpOworCQlnb3RvIGZhaWw7CisJfQorCXRpbWluZ19hZHZlcnQtPnJlcGVhdF9yYXRlID0gbmxhX2dldF91MzIoCisJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TVEFSVF9USU1JTkdfQURWRVJUX1JFUEVBVF9SQVRFXSk7CisKKwl0aW1pbmdfYWR2ZXJ0LT50ZW1wbGF0ZV9sZW5ndGggPQorCQlzY2hfZ2VuX3RpbWluZ19hZHZlcnRfZnJhbWUobWFjX2N0eCwKKwkJCSoodFNpck1hY0FkZHIgKikmYWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsCisJCQkmdGltaW5nX2FkdmVydC0+dGVtcGxhdGVfdmFsdWUsCisJCQkmdGltaW5nX2FkdmVydC0+dGltZXN0YW1wX29mZnNldCwKKwkJCSZ0aW1pbmdfYWR2ZXJ0LT50aW1lX3ZhbHVlX29mZnNldCk7CisJaWYgKHRpbWluZ19hZHZlcnQtPnRlbXBsYXRlX2xlbmd0aCA8PSAwKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRXJyb3Igd2hpbGUgZ2VuZXJhdGluZyB0aGUgVEEgZnJhbWUiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoc21lX29jYl9zdGFydF90aW1pbmdfYWR2ZXJ0KGhkZF9jdHgtPmhIYWwsIHRpbWluZ19hZHZlcnQpICE9CisJCQlDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJFcnJvciB3aGlsZSBzdGFydGluZyB0aW1pbmcgYWR2ZXJ0IikpOworCQlyYyA9IC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcmMgPSAwOworCX0KKworZmFpbDoKKwlpZiAodGltaW5nX2FkdmVydC0+dGVtcGxhdGVfdmFsdWUpCisJCWNkZl9tZW1fZnJlZSh0aW1pbmdfYWR2ZXJ0LT50ZW1wbGF0ZV92YWx1ZSk7CisJY2RmX21lbV9mcmVlKHRpbWluZ19hZHZlcnQpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydCgpIC0gSW50ZXJmYWNlIGZvciB0aGUgc3RhcnQgVEEgY21kCisgKiBAd2lwaHk6IHBvaW50ZXIgdG8gdGhlIHdpcGh5CisgKiBAd2RldjogcG9pbnRlciB0byB0aGUgd2RldgorICogQGRhdGE6IFRoZSBuZXRsaW5rIGRhdGEKKyAqIEBkYXRhX2xlbjogVGhlIGxlbmd0aCBvZiB0aGUgbmV0bGluayBkYXRhIGluIGJ5dGVzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgICBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydCh3aXBoeSwgd2RldiwKKwkJCQkJCQkgIGRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfb2NiX3N0b3BfdGltaW5nX2FkdmVydCgpIC0gSW50ZXJmYWNlIGZvciB0aGUgc3RvcCBUQSBjbWQKKyAqIEB3aXBoeTogcG9pbnRlciB0byB0aGUgd2lwaHkKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHRoZSB3ZGV2CisgKiBAZGF0YTogVGhlIG5ldGxpbmsgZGF0YQorICogQGRhdGFfbGVuOiBUaGUgbGVuZ3RoIG9mIHRoZSBuZXRsaW5rIGRhdGEgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc3RvcF90aW1pbmdfYWR2ZXJ0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgIGludCBkYXRhX2xlbikKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9NQVggKyAxXTsKKwlzdHJ1Y3Qgc2lyX29jYl90aW1pbmdfYWR2ZXJ0ICp0aW1pbmdfYWR2ZXJ0OworCWludCByYyA9IC1FSU5WQUw7CisKKwlFTlRFUigpOworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhZGFwdGVyLT5kZXZpY2VfbW9kZSAhPSBXTEFOX0hERF9PQ0IpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJEZXZpY2Ugbm90IGluIE9DQiBtb2RlISIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCF3bWFfaXNfdmRldl91cChhZGFwdGVyLT5zZXNzaW9uSWQpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiVGhlIGRldmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGltaW5nX2FkdmVydCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqdGltaW5nX2FkdmVydCkpOworCWlmICghdGltaW5nX2FkdmVydCkgeworCQloZGRMb2coTE9HRSwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNkZl9tZW1femVybyh0aW1pbmdfYWR2ZXJ0LCBzaXplb2Yoc2l6ZW9mKCp0aW1pbmdfYWR2ZXJ0KSkpOworCXRpbWluZ19hZHZlcnQtPnZkZXZfaWQgPSBhZGFwdGVyLT5zZXNzaW9uSWQ7CisKKwkvKiBQYXJzZSB0aGUgbmV0bGluayBtZXNzYWdlICovCisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9NQVgsCisJCSAgICAgIGRhdGEsCisJCSAgICAgIGRhdGFfbGVuLAorCQkgICAgICBxY2Ffd2xhbl92ZW5kb3Jfb2NiX3N0b3BfdGltaW5nX2FkdmVydF9wb2xpY3kpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBBVFRSIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU1RPUF9USU1JTkdfQURWRVJUX0NIQU5ORUxfRlJFUV0pIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDSEFOTkVMX0ZSRVEgaXMgbm90IHByZXNlbnQiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJdGltaW5nX2FkdmVydC0+Y2hhbl9mcmVxID0gbmxhX2dldF91MzIoCisJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TVE9QX1RJTUlOR19BRFZFUlRfQ0hBTk5FTF9GUkVRXSk7CisKKwlpZiAoc21lX29jYl9zdG9wX3RpbWluZ19hZHZlcnQoaGRkX2N0eC0+aEhhbCwgdGltaW5nX2FkdmVydCkgIT0KKwkJCUNERl9TVEFUVVNfU1VDQ0VTUykgeworCQloZGRMb2coTE9HRSwgRkwoIkVycm9yIHdoaWxlIHN0b3BwaW5nIHRpbWluZyBhZHZlcnQiKSk7CisJCXJjID0gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlyYyA9IDA7CisJfQorCitmYWlsOgorCWNkZl9tZW1fZnJlZSh0aW1pbmdfYWR2ZXJ0KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfb2NiX3N0b3BfdGltaW5nX2FkdmVydCgpIC0gSW50ZXJmYWNlIGZvciB0aGUgc3RvcCBUQSBjbWQKKyAqIEB3aXBoeTogcG9pbnRlciB0byB0aGUgd2lwaHkKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHRoZSB3ZGV2CisgKiBAZGF0YTogVGhlIG5ldGxpbmsgZGF0YQorICogQGRhdGFfbGVuOiBUaGUgbGVuZ3RoIG9mIHRoZSBuZXRsaW5rIGRhdGEgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX29jYl9zdG9wX3RpbWluZ19hZHZlcnQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgICAgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfb2NiX3N0b3BfdGltaW5nX2FkdmVydCh3aXBoeSwgd2RldiwKKwkJCQkJCQkgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGRkX29jYl9nZXRfdHNmX3RpbWVyX2NhbGxiYWNrKCkgLSBDYWxsYmFjayB0byBnZXQgVFNGIGNvbW1hbmQKKyAqIEBjb250ZXh0X3B0cjogcmVxdWVzdCBjb250ZXh0CisgKiBAcmVzcG9uc2VfcHRyOiByZXNwb25zZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9vY2JfZ2V0X3RzZl90aW1lcl9jYWxsYmFjayh2b2lkICpjb250ZXh0X3B0ciwKKwkJCQkJICAgdm9pZCAqcmVzcG9uc2VfcHRyKQoreworCXN0cnVjdCBoZGRfb2NiX2N0eHQgKmNvbnRleHQgPSBjb250ZXh0X3B0cjsKKwlzdHJ1Y3Qgc2lyX29jYl9nZXRfdHNmX3RpbWVyX3Jlc3BvbnNlICpyZXNwb25zZSA9IHJlc3BvbnNlX3B0cjsKKworCWlmICghY29udGV4dCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwlpZiAoY29udGV4dC0+bWFnaWMgPT0gSEREX09DQl9NQUdJQykgeworCQlpZiAocmVzcG9uc2UpIHsKKwkJCWNvbnRleHQtPmFkYXB0ZXItPm9jYl9nZXRfdHNmX3RpbWVyX3Jlc3AgPSAqcmVzcG9uc2U7CisJCQljb250ZXh0LT5zdGF0dXMgPSAwOworCQl9IGVsc2UgeworCQkJY29udGV4dC0+c3RhdHVzID0gLUVJTlZBTDsKKwkJfQorCQljb21wbGV0ZSgmY29udGV4dC0+Y29tcGxldGlvbl9ldnQpOworCX0KKwlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9vY2JfZ2V0X3RzZl90aW1lcigpIC0gSW50ZXJmYWNlIGZvciBnZXQgVFNGIHRpbWVyIGNtZAorICogQHdpcGh5OiBwb2ludGVyIHRvIHRoZSB3aXBoeQorICogQHdkZXY6IHBvaW50ZXIgdG8gdGhlIHdkZXYKKyAqIEBkYXRhOiBUaGUgbmV0bGluayBkYXRhCisgKiBAZGF0YV9sZW46IFRoZSBsZW5ndGggb2YgdGhlIG5ldGxpbmsgZGF0YSBpbiBieXRlcworICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitfX3dsYW5faGRkX2NmZzgwMjExX29jYl9nZXRfdHNmX3RpbWVyKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmxfcmVzcCA9IDA7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWludCByYyA9IC1FSU5WQUw7CisJc3RydWN0IHNpcl9vY2JfZ2V0X3RzZl90aW1lciByZXF1ZXN0ID0gezB9OworCXN0cnVjdCBoZGRfb2NiX2N0eHQgY29udGV4dCA9IHswfTsKKworCUVOVEVSKCk7CisKKwlpZiAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KSkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFkYXB0ZXItPmRldmljZV9tb2RlICE9IFdMQU5fSEREX09DQikgeworCQloZGRMb2coTE9HRSwgRkwoIkRldmljZSBub3QgaW4gT0NCIG1vZGUhIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXdtYV9pc192ZGV2X3VwKGFkYXB0ZXItPnNlc3Npb25JZCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJUaGUgZGV2aWNlIGhhcyBub3QgYmVlbiBzdGFydGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBjYWxsYmFjayBjb250ZXh0ICovCisJaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LmNvbXBsZXRpb25fZXZ0KTsKKwljb250ZXh0LmFkYXB0ZXIgPSBhZGFwdGVyOworCWNvbnRleHQubWFnaWMgPSBIRERfT0NCX01BR0lDOworCisJcmVxdWVzdC52ZGV2X2lkID0gYWRhcHRlci0+c2Vzc2lvbklkOworCS8qIENhbGwgdGhlIFNNRSBmdW5jdGlvbiAqLworCXJjID0gc21lX29jYl9nZXRfdHNmX3RpbWVyKGhkZF9jdHgtPmhIYWwsICZjb250ZXh0LAorCQkJCSAgIGhkZF9vY2JfZ2V0X3RzZl90aW1lcl9jYWxsYmFjaywKKwkJCQkgICAmcmVxdWVzdCk7CisJaWYgKHJjKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRXJyb3IgY2FsbGluZyBTTUUgZnVuY3Rpb24iKSk7CisJCS8qIE5lZWQgdG8gY29udmVydCBmcm9tIGVjZGZfc3RhdHVzIHRvIGVycm5vLiAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udGV4dC5jb21wbGV0aW9uX2V2dCwKKwkJbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9PQ0JfQ01EKSk7CisJaWYgKHJjID09IDApIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJPcGVyYXRpb24gdGltZWQgb3V0IikpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZW5kOworCX0KKwlyYyA9IDA7CisKKwlpZiAoY29udGV4dC5zdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJPcGVyYXRpb24gZmFpbGVkOiAlZCIpLCBjb250ZXh0LnN0YXR1cyk7CisJCXJjID0gY29udGV4dC5zdGF0dXM7CisJCWdvdG8gZW5kOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBidWZmZXIgZm9yIHRoZSByZXNwb25zZS4gKi8KKwlubF9yZXNwID0gY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2Iod2lwaHksCisJCTIgKiBzaXplb2YodWludDMyX3QpICsgTkxNU0dfSERSTEVOKTsKKworCWlmICghbmxfcmVzcCkgeworCQloZGRMb2coTE9HRSwgRkwoImNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiIGZhaWxlZCIpKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVuZDsKKwl9CisKKwloZGRMb2coTE9HRSwgRkwoIkdvdCBUU0YgdGltZXIgcmVzcG9uc2UsIGhpZ2g9JWQsIGxvdz0lZCIpLAorCSAgICAgICBhZGFwdGVyLT5vY2JfZ2V0X3RzZl90aW1lcl9yZXNwLnRpbWVyX2hpZ2gsCisJICAgICAgIGFkYXB0ZXItPm9jYl9nZXRfdHNmX3RpbWVyX3Jlc3AudGltZXJfbG93KTsKKworCS8qIFBvcHVsYXRlIHRoZSByZXNwb25zZS4gKi8KKwlyYyA9IG5sYV9wdXRfdTMyKG5sX3Jlc3AsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfR0VUX1RTRl9SRVNQX1RJTUVSX0hJR0gsCisJCQlhZGFwdGVyLT5vY2JfZ2V0X3RzZl90aW1lcl9yZXNwLnRpbWVyX2hpZ2gpOworCWlmIChyYykKKwkJZ290byBlbmQ7CisJcmMgPSBubGFfcHV0X3UzMihubF9yZXNwLAorCQkJICAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9HRVRfVFNGX1JFU1BfVElNRVJfTE9XLAorCQkJICAgIGFkYXB0ZXItPm9jYl9nZXRfdHNmX3RpbWVyX3Jlc3AudGltZXJfbG93KTsKKwlpZiAocmMpCisJCWdvdG8gZW5kOworCisJLyogU2VuZCB0aGUgcmVzcG9uc2UuICovCisJcmMgPSBjZmc4MDIxMV92ZW5kb3JfY21kX3JlcGx5KG5sX3Jlc3ApOworCW5sX3Jlc3AgPSBOVUxMOworCWlmIChyYykgeworCQloZGRMb2coTE9HRSwgRkwoImNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkgZmFpbGVkOiAlZCIpLCByYyk7CisJCWdvdG8gZW5kOworCX0KKworZW5kOgorCXNwaW5fbG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJY29udGV4dC5tYWdpYyA9IDA7CisJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCWlmIChubF9yZXNwKQorCQlrZnJlZV9za2IobmxfcmVzcCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX29jYl9nZXRfdHNmX3RpbWVyKCkgLSBJbnRlcmZhY2UgZm9yIGdldCBUU0YgdGltZXIgY21kCisgKiBAd2lwaHk6IHBvaW50ZXIgdG8gdGhlIHdpcGh5CisgKiBAd2RldjogcG9pbnRlciB0byB0aGUgd2RldgorICogQGRhdGE6IFRoZSBuZXRsaW5rIGRhdGEKKyAqIEBkYXRhX2xlbjogVGhlIGxlbmd0aCBvZiB0aGUgbmV0bGluayBkYXRhIGluIGJ5dGVzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9vY2JfZ2V0X3RzZl90aW1lcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQljb25zdCB2b2lkICpkYXRhLAorCQkJCQlpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9vY2JfZ2V0X3RzZl90aW1lcih3aXBoeSwgd2RldiwKKwkJCQkJCSAgICBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBoZGRfZGNjX2dldF9zdGF0c19jYWxsYmFjaygpIC0gQ2FsbGJhY2sgdG8gZ2V0IHN0YXRzIGNvbW1hbmQKKyAqIEBjb250ZXh0X3B0cjogcmVxdWVzdCBjb250ZXh0CisgKiBAcmVzcG9uc2VfcHRyOiByZXNwb25zZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9kY2NfZ2V0X3N0YXRzX2NhbGxiYWNrKHZvaWQgKmNvbnRleHRfcHRyLCB2b2lkICpyZXNwb25zZV9wdHIpCit7CisJc3RydWN0IGhkZF9vY2JfY3R4dCAqY29udGV4dCA9IGNvbnRleHRfcHRyOworCXN0cnVjdCBzaXJfZGNjX2dldF9zdGF0c19yZXNwb25zZSAqcmVzcG9uc2UgPSByZXNwb25zZV9wdHI7CisJc3RydWN0IHNpcl9kY2NfZ2V0X3N0YXRzX3Jlc3BvbnNlICpoZGRfcmVzcDsKKworCWlmICghY29udGV4dCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwlpZiAoY29udGV4dC0+bWFnaWMgPT0gSEREX09DQl9NQUdJQykgeworCQlpZiAocmVzcG9uc2UpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgcmVzcG9uc2UgaXMgaGFuZ2luZyBhcm91bmQgZnJvbSB0aGUgcHJldmlvdXMKKwkJCSAqIHJlcXVlc3QsIGRlbGV0ZSBpdAorCQkJICovCisJCQlpZiAoY29udGV4dC0+YWRhcHRlci0+ZGNjX2dldF9zdGF0c19yZXNwKSB7CisJCQkJY2RmX21lbV9mcmVlKAorCQkJCSAgICBjb250ZXh0LT5hZGFwdGVyLT5kY2NfZ2V0X3N0YXRzX3Jlc3ApOworCQkJfQorCQkJY29udGV4dC0+YWRhcHRlci0+ZGNjX2dldF9zdGF0c19yZXNwID0KKwkJCQljZGZfbWVtX21hbGxvYyhzaXplb2YoCisJCQkJICAgICpjb250ZXh0LT5hZGFwdGVyLT5kY2NfZ2V0X3N0YXRzX3Jlc3ApICsKKwkJCQkgICAgcmVzcG9uc2UtPmNoYW5uZWxfc3RhdHNfYXJyYXlfbGVuKTsKKwkJCWlmIChjb250ZXh0LT5hZGFwdGVyLT5kY2NfZ2V0X3N0YXRzX3Jlc3ApIHsKKwkJCQloZGRfcmVzcCA9IGNvbnRleHQtPmFkYXB0ZXItPmRjY19nZXRfc3RhdHNfcmVzcDsKKwkJCQkqaGRkX3Jlc3AgPSAqcmVzcG9uc2U7CisJCQkJaGRkX3Jlc3AtPmNoYW5uZWxfc3RhdHNfYXJyYXkgPQorCQkJCQkodm9pZCAqKWhkZF9yZXNwICsgc2l6ZW9mKCpoZGRfcmVzcCk7CisJCQkJY2RmX21lbV9jb3B5KGhkZF9yZXNwLT5jaGFubmVsX3N0YXRzX2FycmF5LAorCQkJCQkgICAgIHJlc3BvbnNlLT5jaGFubmVsX3N0YXRzX2FycmF5LAorCQkJCQkgICAgIHJlc3BvbnNlLT5jaGFubmVsX3N0YXRzX2FycmF5X2xlbik7CisJCQkJY29udGV4dC0+c3RhdHVzID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJY29udGV4dC0+c3RhdHVzID0gLUVOT01FTTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNvbnRleHQtPnN0YXR1cyA9IC1FSU5WQUw7CisJCX0KKwkJY29tcGxldGUoJmNvbnRleHQtPmNvbXBsZXRpb25fZXZ0KTsKKwl9CisJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfZGNjX2dldF9zdGF0cygpIC0gSW50ZXJmYWNlIGZvciBnZXQgZGNjIHN0YXRzCisgKiBAd2lwaHk6IHBvaW50ZXIgdG8gdGhlIHdpcGh5CisgKiBAd2RldjogcG9pbnRlciB0byB0aGUgd2RldgorICogQGRhdGE6IFRoZSBuZXRsaW5rIGRhdGEKKyAqIEBkYXRhX2xlbjogVGhlIGxlbmd0aCBvZiB0aGUgbmV0bGluayBkYXRhIGluIGJ5dGVzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9kY2NfZ2V0X3N0YXRzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgIGludCBkYXRhX2xlbikKK3sKKwl1aW50MzJfdCBjaGFubmVsX2NvdW50ID0gMDsKKwl1aW50MzJfdCByZXF1ZXN0X2FycmF5X2xlbiA9IDA7CisJdm9pZCAqcmVxdWVzdF9hcnJheSA9IDA7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXN0cnVjdCBubGF0dHIgKnRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19HRVRfU1RBVFNfTUFYICsgMV07CisJc3RydWN0IHNrX2J1ZmYgKm5sX3Jlc3AgPSAwOworCWludCByYyA9IC1FSU5WQUw7CisJc3RydWN0IHNpcl9kY2NfZ2V0X3N0YXRzIHJlcXVlc3QgPSB7MH07CisJc3RydWN0IGhkZF9vY2JfY3R4dCBjb250ZXh0ID0gezB9OworCisJRU5URVIoKTsKKworCWlmICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWRhcHRlci0+ZGV2aWNlX21vZGUgIT0gV0xBTl9IRERfT0NCKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRGV2aWNlIG5vdCBpbiBPQ0IgbW9kZSEiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghd21hX2lzX3ZkZXZfdXAoYWRhcHRlci0+c2Vzc2lvbklkKSkgeworCQloZGRMb2coTE9HRSwgRkwoIlRoZSBkZXZpY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFBhcnNlIHRoZSBuZXRsaW5rIG1lc3NhZ2UgKi8KKwlpZiAobmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX01BWCwKKwkJICAgICAgZGF0YSwKKwkJICAgICAgZGF0YV9sZW4sCisJCSAgICAgIHFjYV93bGFuX3ZlbmRvcl9kY2NfZ2V0X3N0YXRzKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVmFsaWRhdGUgYWxsIHRoZSBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50ICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX0NIQU5ORUxfQ09VTlRdIHx8CisJICAgICF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX1JFUVVFU1RfQVJSQVldKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiUGFyYW1ldGVycyBhcmUgbm90IHByZXNlbnQuIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljaGFubmVsX2NvdW50ID0gbmxhX2dldF91MzIoCisJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19HRVRfU1RBVFNfQ0hBTk5FTF9DT1VOVF0pOworCXJlcXVlc3RfYXJyYXlfbGVuID0gbmxhX2xlbigKKwkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0dFVF9TVEFUU19SRVFVRVNUX0FSUkFZXSk7CisJcmVxdWVzdF9hcnJheSA9IG5sYV9kYXRhKAorCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX1JFUVVFU1RfQVJSQVldKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrIGNvbnRleHQgKi8KKwlpbml0X2NvbXBsZXRpb24oJmNvbnRleHQuY29tcGxldGlvbl9ldnQpOworCWNvbnRleHQuYWRhcHRlciA9IGFkYXB0ZXI7CisJY29udGV4dC5tYWdpYyA9IEhERF9PQ0JfTUFHSUM7CisKKwlyZXF1ZXN0LnZkZXZfaWQgPSBhZGFwdGVyLT5zZXNzaW9uSWQ7CisJcmVxdWVzdC5jaGFubmVsX2NvdW50ID0gY2hhbm5lbF9jb3VudDsKKwlyZXF1ZXN0LnJlcXVlc3RfYXJyYXlfbGVuID0gcmVxdWVzdF9hcnJheV9sZW47CisJcmVxdWVzdC5yZXF1ZXN0X2FycmF5ID0gcmVxdWVzdF9hcnJheTsKKworCS8qIENhbGwgdGhlIFNNRSBmdW5jdGlvbi4gKi8KKwlyYyA9IHNtZV9kY2NfZ2V0X3N0YXRzKGhkZF9jdHgtPmhIYWwsICZjb250ZXh0LAorCQkJICAgICAgIGhkZF9kY2NfZ2V0X3N0YXRzX2NhbGxiYWNrLAorCQkJICAgICAgICZyZXF1ZXN0KTsKKwlpZiAocmMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJFcnJvciBjYWxsaW5nIFNNRSBmdW5jdGlvbiIpKTsKKwkJLyogTmVlZCB0byBjb252ZXJ0IGZyb20gY2RmX3N0YXR1cyB0byBlcnJuby4gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGZ1bmN0aW9uIHRvIGNvbXBsZXRlLiAqLworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb250ZXh0LmNvbXBsZXRpb25fZXZ0LAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfT0NCX0NNRCkpOworCWlmIChyYyA9PSAwKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiT3BlcmF0aW9uIGZhaWxlZDogJWQiKSwgcmMpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChjb250ZXh0LnN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIlRoZXJlIHdhcyBlcnJvcjogJWQiKSwgY29udGV4dC5zdGF0dXMpOworCQlyYyA9IGNvbnRleHQuc3RhdHVzOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoIWFkYXB0ZXItPmRjY19nZXRfc3RhdHNfcmVzcCkgeworCQloZGRMb2coTE9HRSwgRkwoIlRoZSByZXNwb25zZSB3YXMgTlVMTCIpKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyIGZvciB0aGUgcmVzcG9uc2UuICovCisJbmxfcmVzcCA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiKHdpcGh5LCBzaXplb2YodWludDMyX3QpICsKKwkJYWRhcHRlci0+ZGNjX2dldF9zdGF0c19yZXNwLT5jaGFubmVsX3N0YXRzX2FycmF5X2xlbiArCisJCU5MTVNHX0hEUkxFTik7CisJaWYgKCFubF9yZXNwKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2IgZmFpbGVkIikpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCS8qIFBvcHVsYXRlIHRoZSByZXNwb25zZS4gKi8KKwlyYyA9IG5sYV9wdXRfdTMyKG5sX3Jlc3AsCisJCQkgUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0dFVF9TVEFUU19SRVNQX0NIQU5ORUxfQ09VTlQsCisJCQkgYWRhcHRlci0+ZGNjX2dldF9zdGF0c19yZXNwLT5udW1fY2hhbm5lbHMpOworCWlmIChyYykKKwkJZ290byBlbmQ7CisJcmMgPSBubGFfcHV0KG5sX3Jlc3AsCisJCSAgICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0dFVF9TVEFUU19SRVNQX1NUQVRTX0FSUkFZLAorCQkgICAgIGFkYXB0ZXItPmRjY19nZXRfc3RhdHNfcmVzcC0+Y2hhbm5lbF9zdGF0c19hcnJheV9sZW4sCisJCSAgICAgYWRhcHRlci0+ZGNjX2dldF9zdGF0c19yZXNwLT5jaGFubmVsX3N0YXRzX2FycmF5KTsKKwlpZiAocmMpCisJCWdvdG8gZW5kOworCisJLyogU2VuZCB0aGUgcmVzcG9uc2UuICovCisJcmMgPSBjZmc4MDIxMV92ZW5kb3JfY21kX3JlcGx5KG5sX3Jlc3ApOworCW5sX3Jlc3AgPSBOVUxMOworCWlmIChyYykgeworCQloZGRMb2coTE9HRSwgRkwoImNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkgZmFpbGVkOiAlZCIpLCByYyk7CisJCWdvdG8gZW5kOworCX0KKworCS8qIGZhbGwgdGhyb3VnaCAqLworZW5kOgorCXNwaW5fbG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJY29udGV4dC5tYWdpYyA9IDA7CisJY2RmX21lbV9mcmVlKGFkYXB0ZXItPmRjY19nZXRfc3RhdHNfcmVzcCk7CisJYWRhcHRlci0+ZGNjX2dldF9zdGF0c19yZXNwID0gTlVMTDsKKwlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJaWYgKG5sX3Jlc3ApCisJCWtmcmVlX3NrYihubF9yZXNwKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZGNjX2dldF9zdGF0cygpIC0gSW50ZXJmYWNlIGZvciBnZXQgZGNjIHN0YXRzCisgKiBAd2lwaHk6IHBvaW50ZXIgdG8gdGhlIHdpcGh5CisgKiBAd2RldjogcG9pbnRlciB0byB0aGUgd2RldgorICogQGRhdGE6IFRoZSBuZXRsaW5rIGRhdGEKKyAqIEBkYXRhX2xlbjogVGhlIGxlbmd0aCBvZiB0aGUgbmV0bGluayBkYXRhIGluIGJ5dGVzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9kY2NfZ2V0X3N0YXRzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgIGludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2RjY19nZXRfc3RhdHMod2lwaHksIHdkZXYsCisJCQkJCQlkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2RjY19jbGVhcl9zdGF0cygpIC0gSW50ZXJmYWNlIGZvciBjbGVhciBkY2Mgc3RhdHMgY21kCisgKiBAd2lwaHk6IHBvaW50ZXIgdG8gdGhlIHdpcGh5CisgKiBAd2RldjogcG9pbnRlciB0byB0aGUgd2RldgorICogQGRhdGE6IFRoZSBuZXRsaW5rIGRhdGEKKyAqIEBkYXRhX2xlbjogVGhlIGxlbmd0aCBvZiB0aGUgbmV0bGluayBkYXRhIGluIGJ5dGVzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9kY2NfY2xlYXJfc3RhdHMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgICAgaW50IGRhdGFfbGVuKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfQ0xFQVJfU1RBVFNfTUFYICsgMV07CisKKwlFTlRFUigpOworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhZGFwdGVyLT5kZXZpY2VfbW9kZSAhPSBXTEFOX0hERF9PQ0IpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJEZXZpY2Ugbm90IGluIE9DQiBtb2RlISIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCF3bWFfaXNfdmRldl91cChhZGFwdGVyLT5zZXNzaW9uSWQpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiVGhlIGRldmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUGFyc2UgdGhlIG5ldGxpbmsgbWVzc2FnZSAqLworCWlmIChubGFfcGFyc2UodGIsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19DTEVBUl9TVEFUU19NQVgsCisJCSAgICAgIGRhdGEsCisJCSAgICAgIGRhdGFfbGVuLAorCQkgICAgICBxY2Ffd2xhbl92ZW5kb3JfZGNjX2NsZWFyX3N0YXRzKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVmVyaWZ5IHRoYXQgdGhlIHBhcmFtZXRlciBpcyBwcmVzZW50ICovCisJaWYgKCF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfQ0xFQVJfU1RBVFNfQklUTUFQXSkgeworCQloZGRMb2coTE9HRSwgRkwoIlBhcmFtZXRlcnMgYXJlIG5vdCBwcmVzZW50LiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2FsbCB0aGUgU01FIGZ1bmN0aW9uICovCisJaWYgKHNtZV9kY2NfY2xlYXJfc3RhdHMoaGRkX2N0eC0+aEhhbCwgYWRhcHRlci0+c2Vzc2lvbklkLAorCQlubGFfZ2V0X3UzMigKKwkJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19DTEVBUl9TVEFUU19CSVRNQVBdKSkgIT0KKwkJCUNERl9TVEFUVVNfU1VDQ0VTUykgeworCQloZGRMb2coTE9HRSwgRkwoIkVycm9yIGNhbGxpbmcgU01FIGZ1bmN0aW9uLiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZGNjX2NsZWFyX3N0YXRzKCkgLSBJbnRlcmZhY2UgZm9yIGNsZWFyIGRjYyBzdGF0cyBjbWQKKyAqIEB3aXBoeTogcG9pbnRlciB0byB0aGUgd2lwaHkKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHRoZSB3ZGV2CisgKiBAZGF0YTogVGhlIG5ldGxpbmsgZGF0YQorICogQGRhdGFfbGVuOiBUaGUgbGVuZ3RoIG9mIHRoZSBuZXRsaW5rIGRhdGEgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX2RjY19jbGVhcl9zdGF0cyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgICBpbnQgZGF0YV9sZW4pCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9kY2NfY2xlYXJfc3RhdHMod2lwaHksIHdkZXYsCisJCQkJCQkgIGRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9kY2NfdXBkYXRlX25kbF9jYWxsYmFjaygpIC0gQ2FsbGJhY2sgdG8gdXBkYXRlIE5ETCBjb21tYW5kCisgKiBAY29udGV4dF9wdHI6IHJlcXVlc3QgY29udGV4dAorICogQHJlc3BvbnNlX3B0cjogcmVzcG9uc2UgZGF0YQorICovCitzdGF0aWMgdm9pZCBoZGRfZGNjX3VwZGF0ZV9uZGxfY2FsbGJhY2sodm9pZCAqY29udGV4dF9wdHIsIHZvaWQgKnJlc3BvbnNlX3B0cikKK3sKKwlzdHJ1Y3QgaGRkX29jYl9jdHh0ICpjb250ZXh0ID0gY29udGV4dF9wdHI7CisJc3RydWN0IHNpcl9kY2NfdXBkYXRlX25kbF9yZXNwb25zZSAqcmVzcG9uc2UgPSByZXNwb25zZV9wdHI7CisKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJaWYgKGNvbnRleHQtPm1hZ2ljID09IEhERF9PQ0JfTUFHSUMpIHsKKwkJaWYgKHJlc3BvbnNlKSB7CisJCQljb250ZXh0LT5hZGFwdGVyLT5kY2NfdXBkYXRlX25kbF9yZXNwID0gKnJlc3BvbnNlOworCQkJY29udGV4dC0+c3RhdHVzID0gMDsKKwkJfSBlbHNlIHsKKwkJCWNvbnRleHQtPnN0YXR1cyA9IC1FSU5WQUw7CisJCX0KKwkJY29tcGxldGUoJmNvbnRleHQtPmNvbXBsZXRpb25fZXZ0KTsKKwl9CisJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfZGNjX3VwZGF0ZV9uZGwoKSAtIEludGVyZmFjZSBmb3IgdXBkYXRlIGRjYyBjbWQKKyAqIEB3aXBoeTogcG9pbnRlciB0byB0aGUgd2lwaHkKKyAqIEB3ZGV2OiBwb2ludGVyIHRvIHRoZSB3ZGV2CisgKiBAZGF0YTogVGhlIG5ldGxpbmsgZGF0YQorICogQGRhdGFfbGVuOiBUaGUgbGVuZ3RoIG9mIHRoZSBuZXRsaW5rIGRhdGEgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2RjY191cGRhdGVfbmRsKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgICAgIGludCBkYXRhX2xlbikKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX1VQREFURV9ORExfTUFYICsgMV07CisJc3RydWN0IHNpcl9kY2NfdXBkYXRlX25kbCByZXF1ZXN0OworCXVpbnQzMl90IGNoYW5uZWxfY291bnQ7CisJdWludDMyX3QgbmRsX2NoYW5uZWxfYXJyYXlfbGVuOworCXZvaWQgKm5kbF9jaGFubmVsX2FycmF5OworCXVpbnQzMl90IG5kbF9hY3RpdmVfc3RhdGVfYXJyYXlfbGVuOworCXZvaWQgKm5kbF9hY3RpdmVfc3RhdGVfYXJyYXk7CisJaW50IHJjID0gLUVJTlZBTDsKKwlzdHJ1Y3QgaGRkX29jYl9jdHh0IGNvbnRleHQgPSB7MH07CisKKwlFTlRFUigpOworCisJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChhZGFwdGVyLT5kZXZpY2VfbW9kZSAhPSBXTEFOX0hERF9PQ0IpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJEZXZpY2Ugbm90IGluIE9DQiBtb2RlISIpKTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKCF3bWFfaXNfdmRldl91cChhZGFwdGVyLT5zZXNzaW9uSWQpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiVGhlIGRldmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUGFyc2UgdGhlIG5ldGxpbmsgbWVzc2FnZSAqLworCWlmIChubGFfcGFyc2UodGIsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19VUERBVEVfTkRMX01BWCwKKwkJICAgICAgZGF0YSwKKwkJICAgICAgZGF0YV9sZW4sCisJCSAgICAgIHFjYV93bGFuX3ZlbmRvcl9kY2NfdXBkYXRlX25kbCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIEFUVFIiKSk7CisJCWdvdG8gZW5kOworCX0KKworCS8qIFZlcmlmeSB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgcHJlc2VudCAqLworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX1VQREFURV9ORExfQ0hBTk5FTF9DT1VOVF0gfHwKKwkgICAgIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19VUERBVEVfTkRMX0NIQU5ORUxfQVJSQVldIHx8CisJICAgICF0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfVVBEQVRFX05ETF9BQ1RJVkVfU1RBVEVfQVJSQVldKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiUGFyYW1ldGVycyBhcmUgbm90IHByZXNlbnQuIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljaGFubmVsX2NvdW50ID0gbmxhX2dldF91MzIoCisJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19VUERBVEVfTkRMX0NIQU5ORUxfQ09VTlRdKTsKKwluZGxfY2hhbm5lbF9hcnJheV9sZW4gPSBubGFfbGVuKAorCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfVVBEQVRFX05ETF9DSEFOTkVMX0FSUkFZXSk7CisJbmRsX2NoYW5uZWxfYXJyYXkgPSBubGFfZGF0YSgKKwkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX1VQREFURV9ORExfQ0hBTk5FTF9BUlJBWV0pOworCW5kbF9hY3RpdmVfc3RhdGVfYXJyYXlfbGVuID0gbmxhX2xlbigKKwkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX1VQREFURV9ORExfQUNUSVZFX1NUQVRFX0FSUkFZXSk7CisJbmRsX2FjdGl2ZV9zdGF0ZV9hcnJheSA9IG5sYV9kYXRhKAorCQl0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfVVBEQVRFX05ETF9BQ1RJVkVfU1RBVEVfQVJSQVldKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrIGNvbnRleHQgKi8KKwlpbml0X2NvbXBsZXRpb24oJmNvbnRleHQuY29tcGxldGlvbl9ldnQpOworCWNvbnRleHQuYWRhcHRlciA9IGFkYXB0ZXI7CisJY29udGV4dC5tYWdpYyA9IEhERF9PQ0JfTUFHSUM7CisKKwkvKiBDb3B5IHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSByZXF1ZXN0IHN0cnVjdHVyZS4gKi8KKwlyZXF1ZXN0LnZkZXZfaWQgPSBhZGFwdGVyLT5zZXNzaW9uSWQ7CisJcmVxdWVzdC5jaGFubmVsX2NvdW50ID0gY2hhbm5lbF9jb3VudDsKKwlyZXF1ZXN0LmRjY19uZGxfY2hhbl9saXN0X2xlbiA9IG5kbF9jaGFubmVsX2FycmF5X2xlbjsKKwlyZXF1ZXN0LmRjY19uZGxfY2hhbl9saXN0ID0gbmRsX2NoYW5uZWxfYXJyYXk7CisJcmVxdWVzdC5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbiA9IG5kbF9hY3RpdmVfc3RhdGVfYXJyYXlfbGVuOworCXJlcXVlc3QuZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdCA9IG5kbF9hY3RpdmVfc3RhdGVfYXJyYXk7CisKKwkvKiBDYWxsIHRoZSBTTUUgZnVuY3Rpb24gKi8KKwlyYyA9IHNtZV9kY2NfdXBkYXRlX25kbChoZGRfY3R4LT5oSGFsLCAmY29udGV4dCwKKwkJCQloZGRfZGNjX3VwZGF0ZV9uZGxfY2FsbGJhY2ssCisJCQkJJnJlcXVlc3QpOworCWlmIChyYykgeworCQloZGRMb2coTE9HRSwgRkwoIkVycm9yIGNhbGxpbmcgU01FIGZ1bmN0aW9uLiIpKTsKKwkJLyogQ29udmVydCBmcm9tIGNkZl9zdGF0dXMgdG8gZXJybm8gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGZ1bmN0aW9uIHRvIGNvbXBsZXRlLiAqLworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb250ZXh0LmNvbXBsZXRpb25fZXZ0LAorCQltc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX09DQl9DTUQpKTsKKwlpZiAocmMgPT0gMCkgeworCQloZGRMb2coTE9HRSwgRkwoIk9wZXJhdGlvbiB0aW1lZCBvdXQiKSk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBlbmQ7CisJfQorCXJjID0gMDsKKworCWlmIChjb250ZXh0LnN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIk9wZXJhdGlvbiBmYWlsZWQ6ICVkIiksIGNvbnRleHQuc3RhdHVzKTsKKwkJcmMgPSBjb250ZXh0LnN0YXR1czsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKGFkYXB0ZXItPmRjY191cGRhdGVfbmRsX3Jlc3Auc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiT3BlcmF0aW9uIHJldHVybmVkOiAlZCIpLAorCQkgICAgICAgYWRhcHRlci0+ZGNjX3VwZGF0ZV9uZGxfcmVzcC5zdGF0dXMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKworCS8qIGZhbGwgdGhyb3VnaCAqLworZW5kOgorCXNwaW5fbG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJY29udGV4dC5tYWdpYyA9IDA7CisJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCXJldHVybiByYzsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9kY2NfdXBkYXRlX25kbCgpIC0gSW50ZXJmYWNlIGZvciB1cGRhdGUgZGNjIGNtZAorICogQHdpcGh5OiBwb2ludGVyIHRvIHRoZSB3aXBoeQorICogQHdkZXY6IHBvaW50ZXIgdG8gdGhlIHdkZXYKKyAqIEBkYXRhOiBUaGUgbmV0bGluayBkYXRhCisgKiBAZGF0YV9sZW46IFRoZSBsZW5ndGggb2YgdGhlIG5ldGxpbmsgZGF0YSBpbiBieXRlcworICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLgorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZGNjX3VwZGF0ZV9uZGwoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfZGNjX3VwZGF0ZV9uZGwod2lwaHksIHdkZXYsCisJCQkJCQkgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfZGNjX3N0YXRzX2V2ZW50X2NhbGxiYWNrKCkgLSBDYWxsYmFjayB0byBnZXQgc3RhdHMgZXZlbnQKKyAqIEBjb250ZXh0X3B0cjogcmVxdWVzdCBjb250ZXh0CisgKiBAcmVzcG9uc2VfcHRyOiByZXNwb25zZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5faGRkX2RjY19zdGF0c19ldmVudF9jYWxsYmFjayh2b2lkICpjb250ZXh0X3B0ciwKKwkJCQkJICAgICAgdm9pZCAqcmVzcG9uc2VfcHRyKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSAoaGRkX2NvbnRleHRfdCAqKWNvbnRleHRfcHRyOworCXN0cnVjdCBzaXJfZGNjX2dldF9zdGF0c19yZXNwb25zZSAqcmVzcCA9IHJlc3BvbnNlX3B0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdmVuZG9yX2V2ZW50OworCisJRU5URVIoKTsKKworCXZlbmRvcl9ldmVudCA9CisJCWNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyhoZGRfY3R4LT53aXBoeSwKKwkJCU5VTEwsIHNpemVvZih1aW50MzJfdCkgKyByZXNwLT5jaGFubmVsX3N0YXRzX2FycmF5X2xlbiArCisJCQlOTE1TR19IRFJMRU4sCisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX0RDQ19TVEFUU19FVkVOVF9JTkRFWCwKKwkJCUdGUF9LRVJORUwpOworCisJaWYgKCF2ZW5kb3JfZXZlbnQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19HRVRfU1RBVFNfUkVTUF9DSEFOTkVMX0NPVU5ULAorCQkJcmVzcC0+bnVtX2NoYW5uZWxzKSB8fAorCQlubGFfcHV0KHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19HRVRfU1RBVFNfUkVTUF9TVEFUU19BUlJBWSwKKwkJCXJlc3AtPmNoYW5uZWxfc3RhdHNfYXJyYXlfbGVuLAorCQkJcmVzcC0+Y2hhbm5lbF9zdGF0c19hcnJheSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJubGEgcHV0IGZhaWxlZCIpKTsKKwkJa2ZyZWVfc2tiKHZlbmRvcl9ldmVudCk7CisJCXJldHVybjsKKwl9CisKKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQodmVuZG9yX2V2ZW50LCBHRlBfS0VSTkVMKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9kY2NfcmVnaXN0ZXJfZm9yX2RjY19zdGF0c19ldmVudCgpIC0gUmVnaXN0ZXIgZm9yIGRjYyBzdGF0cyBldmVudHMKKyAqIEBoZGRfY3R4OiBoZGQgY29udGV4dAorICovCit2b2lkIHdsYW5faGRkX2RjY19yZWdpc3Rlcl9mb3JfZGNjX3N0YXRzX2V2ZW50KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpCit7CisJaW50IHJjOworCisJcmMgPSBzbWVfcmVnaXN0ZXJfZm9yX2RjY19zdGF0c19ldmVudChoZGRfY3R4LT5oSGFsLCBoZGRfY3R4LAorCQl3bGFuX2hkZF9kY2Nfc3RhdHNfZXZlbnRfY2FsbGJhY2spOworCWlmIChyYykKKwkJaGRkTG9nKExPR0UsIEZMKCJSZWdpc3RlciBjYWxsYmFjayBmYWlsZWQ6ICVkIiksIHJjKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9vY2IuaCBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9vY2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E5N2JmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX29jYi5oCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fV0xBTl9IRERfT0NCX0gKKyNkZWZpbmUgX19XTEFOX0hERF9PQ0JfSAorCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlICJzaXJfYXBpLmgiCisKKyNkZWZpbmUgV0xBTl9PQ0JfQ0hBTk5FTF9NQVggNQorCisvKioKKyAqIHN0cnVjdCBvY2JfcW9zX3BhcmFtcyAtIFFvUyBQYXJhbWV0ZXJzIGZvciBlYWNoIEFDCisgKiBAYWlmc246ICBBcmJpdHJhdGlvbiBJbnRlci1GcmFtZSBTcGFjaW5nCisgKiBAY3dtaW46ICBDb250ZW50aW9uIFdpbmRvdyAoTWluKQorICogQGN3bWF4OiAgQ29udGVudGlvbiBXaW5kb3cgKE1heCkKKyAqLworc3RydWN0IG9jYl9xb3NfcGFyYW1zIHsKKwl1aW50OF90IGFpZnNuOworCXVpbnQ4X3QgY3dtaW47CisJdWludDhfdCBjd21heDsKK307CisKKy8qKgorICogc3RydWN0IG9jYl9jaGFubmVsIC0gUGFyYW1ldGVycyBmb3IgZWFjaCBPQ0IgY2hhbm5lbAorICogQGNoYW5uZWxfZnJlcTogICAgICAgICAgIENoYW5uZWwgQ2VudGVyIEZyZXF1ZW5jeSAoTUh6KQorICogQGR1cmF0aW9uOiAgICAgICAgICAgICAgIENoYW5uZWwgRHVyYXRpb24gKG1zKQorICogQHN0YXJ0X2d1YXJkX2ludGVydmFsOiAgIFN0YXJ0IEd1YXJkIEludGVydmFsIChtcykKKyAqIEBjaGFubmVsX2JhbmR3aWR0aDogICAgICBDaGFubmVsIEJhbmR3aWR0aCAoTUh6KQorICogQHR4X3Bvd2VyOiAgICAgICAgICAgICAgIFRyYW5zbWl0IFBvd2VyICgxLzIgZEJtKQorICogQHR4X3JhdGU6ICAgICAgICAgICAgICAgIFRyYW5zbWl0IERhdGEgUmF0ZSAobWJpdCkKKyAqIEBxb3NfcGFyYW1zOiAgICAgICAgICAgICBBcnJheSBvZiBRb1MgUGFyYW1ldGVycworICogQHBlcl9wYWNrZXRfcnhfc3RhdHM6ICAgIEVuYWJsZSBwZXIgcGFja2V0IFJYIHN0YXRpc3RpY3MKKyAqLworc3RydWN0IG9jYl9jaGFubmVsIHsKKwl1aW50MzJfdCBjaGFubmVsX2ZyZXE7CisJdWludDMyX3QgZHVyYXRpb247CisJdWludDMyX3Qgc3RhcnRfZ3VhcmRfaW50ZXJ2YWw7CisJdWludDMyX3QgY2hhbm5lbF9iYW5kd2lkdGg7CisJdWludDMyX3QgdHhfcG93ZXI7CisJdWludDMyX3QgdHhfcmF0ZTsKKwlzdHJ1Y3Qgb2NiX3Fvc19wYXJhbXMgcW9zX3BhcmFtc1tNQVhfTlVNX0FDXTsKKwl1aW50MzJfdCBwZXJfcGFja2V0X3J4X3N0YXRzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZG90MTFwX2NoYW5uZWxfc2NoZWQgLSBPQ0IgY2hhbm5lbCBzY2hlZHVsZQorICogQG51bV9jaGFubmVsczogICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBjaGFubmVsczogICAgICAgQXJyYXkgb2YgY2hhbm5lbCBwYXJhbWV0ZXJzCisgKiBAb2ZmX2NoYW5uZWxfdHg6IEVuYWJsZSBvZmYgY2hhbm5lbCBUWAorICovCitzdHJ1Y3QgZG90MTFwX2NoYW5uZWxfc2NoZWQgeworCXVpbnQzMl90IG51bV9jaGFubmVsczsKKwlzdHJ1Y3Qgb2NiX2NoYW5uZWwgY2hhbm5lbHNbV0xBTl9PQ0JfQ0hBTk5FTF9NQVhdOworCXVpbnQzMl90IG9mZl9jaGFubmVsX3R4OworfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX29jYl9zZXRfY29uZmlnIC0gdmVuZG9yIHN1YmNtZCB0byBzZXQgb2NiIGNvbmZpZworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX0NIQU5ORUxfQ09VTlQ6CisgKgludW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19TQ0hFRFVMRV9TSVpFOiBzaXplIG9mIHRoZSBzY2hlZHVsZQorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX0NIQU5ORUxfQVJSQVk6IGFycmF5IG9mIGNoYW5uZWxzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfU0NIRURVTEVfQVJSQVk6CisgKglhcnJheSBvZiBjaGFubmVscyB0byBiZSBzY2hlZHVsZWQKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19ORExfQ0hBTk5FTF9BUlJBWToKKyAqCWFycmF5IG9mIE5ETCBjaGFubmVsIGluZm9ybWF0aW9uCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfTkRMX0FDVElWRV9TVEFURV9BUlJBWToKKyAqCWFycmF5IG9mIE5ETCBhY3RpdmUgc3RhdGUgY29uZmlndXJhdGlvbgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX0ZMQUdTOgorICoJZmxhZyB0byBzZXQgdGhlIGFic29sdXRlIGV4cGlyeQorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX29jYl9zZXRfY29uZmlnIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19JTlZBTElEID0gMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19DSEFOTkVMX0NPVU5ULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX1NDSEVEVUxFX1NJWkUsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfQ0hBTk5FTF9BUlJBWSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19TQ0hFRFVMRV9BUlJBWSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19ORExfQ0hBTk5FTF9BUlJBWSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX0NPTkZJR19ORExfQUNUSVZFX1NUQVRFX0FSUkFZLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX0ZMQUdTLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfQ09ORklHX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9DT05GSUdfQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfb2NiX3NldF91dGNfdGltZSAtIHZlbmRvciBzdWJjbWQgdG8gc2V0IFVUQyB0aW1lCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9VVENfVElNRV9WQUxVRToKKyAqCXRoZSBVVEMgdGltZSBhcyBhbiBhcnJheSBvZiAxMCBieXRlcworICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfVVRDX1RJTUVfRVJST1I6CisgKgl0aGUgdGltZSBlcnJvciBhcyBhbiBhcnJheSBvZiA1IGJ5dGVzCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfb2NiX3NldF91dGNfdGltZSB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9VVENfVElNRV9JTlZBTElEID0gMCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU0VUX1VUQ19USU1FX1ZBTFVFLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfVVRDX1RJTUVfRVJST1IsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9VVENfVElNRV9BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TRVRfVVRDX1RJTUVfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NFVF9VVENfVElNRV9BRlRFUl9MQVNUIC0gMSwKK307CisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydCAtIHZlbmRvciBzdWJjbWQgdG8gc3RhcnQKKwkJCQkJCSAgICAgICBzZW5kaW5nIHRpbWluZyBhZHZlcnQKKwkJCQkJCSAgICAgICBmcmFtZXMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU1RBUlRfVElNSU5HX0FEVkVSVF9DSEFOTkVMX0ZSRVE6CisgKgljaGFubmVsIGZyZXF1ZW5jeSBvbiB3aGljaCB0byBzZW5kIHRoZSBmcmFtZXMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfU1RBUlRfVElNSU5HX0FEVkVSVF9SRVBFQVRfUkFURToKKyAqCW51bWJlciBvZiB0aW1lcyB0aGUgZnJhbWUgaXMgc2VudCBpbiA1IHNlY29uZHMKKyAqLworZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydCB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfQ0hBTk5FTF9GUkVRLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TVEFSVF9USU1JTkdfQURWRVJUX1JFUEVBVF9SQVRFLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TVEFSVF9USU1JTkdfQURWRVJUX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfb2NiX3N0b3BfdGltaW5nX2FkdmVydCAtIHZlbmRvciBzdWJjbWQgdG8gc3RvcAorICoJCQkJCQkgICAgICB0aW1pbmcgYWR2ZXJ0CisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9DSEFOTkVMX0ZSRVE6CisgKgl0aGUgY2hhbm5lbCBmcmVxdWVuY3kgb24gd2hpY2ggdG8gc3RvcCB0aGUgdGltaW5nIGFkdmVydAorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX29jYl9zdG9wX3RpbWluZ19hZHZlcnQgeworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TVE9QX1RJTUlOR19BRFZFUlRfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9DSEFOTkVMX0ZSRVEsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9BRlRFUl9MQVNULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9TVE9QX1RJTUlOR19BRFZFUlRfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9BRlRFUl9MQVNUIC0gMSwKK307CisKKy8qKgorICogZW51bSBxY2Ffd2xhbl92ZW5kb3JfYXR0cl9kY2NfZ2V0X3RzZl9yZXNwb25zZSAtIHZlbmRvciBzdWJjbWQgdG8gZ2V0IFRTRgorICoJCQkJCQkgICAgdGltZXIgdmFsdWUKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfR0VUX1RTRl9SRVNQX1RJTUVSX0hJR0g6CisgKiAgICAgIGhpZ2hlciAzMiBiaXRzIG9mIHRoZSB0aW1lcgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9HRVRfVFNGX1JFU1BfVElNRVJfTE9XOgorICogICAgICBsb3dlciAzMiBiaXRzIG9mIHRoZSB0aW1lcgorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX29jYl9nZXRfdHNmX3Jlc3AgeworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9HRVRfVFNGX1JFU1BfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfT0NCX0dFVF9UU0ZfUkVTUF9USU1FUl9ISUdILAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9HRVRfVFNGX1JFU1BfVElNRVJfTE9XLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9HRVRfVFNGX1JFU1BfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9PQ0JfR0VUX1RTRl9SRVNQX01BWCA9CisJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX09DQl9HRVRfVFNGX1JFU1BfQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfZGNjX2dldF9zdGF0cyAtIHZlbmRvciBzdWJjbWQgdG8gZ2V0CisgKgkJCQkJICAgICBkY2Mgc3RhdHMKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX0NIQU5ORUxfQ09VTlQ6CisgKiAgICAgIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIHJlcXVlc3QgYXJyYXkKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX1JFUVVFU1RfQVJSQVkKKyAqICAgICAgYXJyYXkgb2YgdGhlIGNoYW5uZWwgYW5kIGluZm9ybWF0aW9uIGJlaW5nIHJlcXVlc3RlZAorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2RjY19nZXRfc3RhdHMgeworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19HRVRfU1RBVFNfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0dFVF9TVEFUU19DSEFOTkVMX0NPVU5ULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19HRVRfU1RBVFNfUkVRVUVTVF9BUlJBWSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX0FGVEVSX0xBU1QsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0dFVF9TVEFUU19NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2RjY19nZXRfc3RhdHNfcmVzcCAtIHJlc3BvbnNlIGV2ZW50IGZyb20gZ2V0CisgKgkJCQkJCSAgZGNjIHN0YXRzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0dFVF9TVEFUU19SRVNQX0NIQU5ORUxfQ09VTlQ6CisgKiAgICAgIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIHJlcXVlc3QgYXJyYXkKKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX1JFU1BfU1RBVFNfQVJSQVkKKyAqICAgICAgYXJyYXkgb2YgdGhlIGluZm9ybWF0aW9uIGJlaW5nIHJlcXVlc3RlZAorICovCitlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2RjY19nZXRfc3RhdHNfcmVzcCB7CisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0dFVF9TVEFUU19SRVNQX0lOVkFMSUQgPSAwLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19HRVRfU1RBVFNfUkVTUF9DSEFOTkVMX0NPVU5ULAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19HRVRfU1RBVFNfUkVTUF9TVEFUU19BUlJBWSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX1JFU1BfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfR0VUX1NUQVRTX1JFU1BfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0dFVF9TVEFUU19SRVNQX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX2RjY19jbGVhcl9zdGF0cyAtIHZlbmRvciBzdWJjbWQgdG8gY2xlYXIgRENDIHN0YXRzCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0NMRUFSX1NUQVRTX0JJVE1BUDoKKyAqICAgICAgbWFzayBvZiB0aGUgdHlwZSBvZiBzdGF0cyB0byBiZSBjbGVhcmVkCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfZGNjX2NsZWFyX3N0YXRzIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfQ0xFQVJfU1RBVFNfSU5WQUxJRCA9IDAsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0NMRUFSX1NUQVRTX0JJVE1BUCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfQ0xFQVJfU1RBVFNfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfQ0xFQVJfU1RBVFNfTUFYID0KKwkJUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX0NMRUFSX1NUQVRTX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIHFjYV93bGFuX3ZlbmRvcl9hdHRyX29jYl9zZXRfY29uZmlnIC0gdmVuZG9yIHN1YmNtZCB0byB1cGRhdGUgZGNjCisgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX1VQREFURV9ORExfQ0hBTk5FTF9DT1VOVDoKKyAqCW51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgY29uZmlndXJhdGlvbgorICogQFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19VUERBVEVfTkRMX0NIQU5ORUxfQVJSQVk6IHRoZSBhcnJheSBvZiBOREwKKyAqICBjaGFubmVsIGluZm8KKyAqIEBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfVVBEQVRFX05ETF9BQ1RJVkVfU1RBVEVfQVJSQVk6IHRoZSBhcnJheSBvZgorICogIE5ETCBhY3RpdmUgc3RhdGVzCisgKi8KK2VudW0gcWNhX3dsYW5fdmVuZG9yX2F0dHJfZGNjX3VwZGF0ZV9uZGwgeworCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19VUERBVEVfTkRMX0lOVkFMSUQgPSAwLAorCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0RDQ19VUERBVEVfTkRMX0NIQU5ORUxfQ09VTlQsCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX1VQREFURV9ORExfQ0hBTk5FTF9BUlJBWSwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfVVBEQVRFX05ETF9BQ1RJVkVfU1RBVEVfQVJSQVksCisJUUNBX1dMQU5fVkVORE9SX0FUVFJfRENDX1VQREFURV9ORExfQUZURVJfTEFTVCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfVVBEQVRFX05ETF9NQVggPQorCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9EQ0NfVVBEQVRFX05ETF9BRlRFUl9MQVNUIC0gMSwKK307CisKK3ZvaWQgaGRkX3NldF9kb3QxMXBfY29uZmlnKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworCit2b2lkIGhkZF9yZW1vdmVfb2NiX3R4X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworaW50IGl3X3NldF9kb3QxMXBfY2hhbm5lbF9zY2hlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfb2NiX3NldF9jb25maWcoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgaW50IGRhdGFfbGVuKTsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX29jYl9zZXRfdXRjX3RpbWUoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgICAgaW50IGRhdGFfbGVuKTsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX29jYl9zdGFydF90aW1pbmdfYWR2ZXJ0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgICAgIGludCBkYXRhX2xlbik7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9vY2Jfc3RvcF90aW1pbmdfYWR2ZXJ0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgIGludCBkYXRhX2xlbik7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9vY2JfZ2V0X3RzZl90aW1lcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQljb25zdCB2b2lkICpkYXRhLAorCQkJCQlpbnQgZGF0YV9sZW4pOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZGNjX2dldF9zdGF0cyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICBpbnQgZGF0YV9sZW4pOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZGNjX2NsZWFyX3N0YXRzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgIGludCBkYXRhX2xlbik7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9kY2NfdXBkYXRlX25kbChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICBpbnQgZGF0YV9sZW4pOworCit2b2lkIHdsYW5faGRkX2RjY19yZWdpc3Rlcl9mb3JfZGNjX3N0YXRzX2V2ZW50KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgpOworCisjZW5kaWYgLyogX19XTEFOX0hERF9PQ0JfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX29lbWRhdGEuYyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9vZW1kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhZTYyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9vZW1kYXRhLmMKQEAgLTAsMCArMSw4NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKworLyoqCisgKiAgRE9DOiB3bGFuX2hkZF9vZW1kYXRhLmMKKyAqCisgKiAgU3VwcG9ydCBmb3IgZ2VuZXJpYyBPRU0gRGF0YSBSZXF1ZXN0IGhhbmRsaW5nCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaW5jbHVkZXMuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSAicXdsYW5fdmVyc2lvbi5oIgorI2luY2x1ZGUgImNkc191dGlscy5oIgorI2luY2x1ZGUgIndtYS5oIgorCitzdGF0aWMgc3RydWN0IGhkZF9jb250ZXh0X3MgKnBfaGRkX2N0eDsKKworLyoqCisgKiBoZGRfb2VtX2RhdGFfcmVxX2NhbGxiYWNrKCkgLSBPRU0gRGF0YSByZXF1ZXN0IGNhbGxiYWNrIGhhbmRsZXIKKyAqIEBoSGFsOiBNQUMgaGFuZGxlCisgKiBAcENvbnRleHQ6IFVzZXIgY29udGV4dC4gIEZvciB0aGlzIGNhbGxiYWNrIHRoZSBuZXQgZGV2aWNlIHdhcyByZWdpc3RlcmVkCisgKiBAb2VtRGF0YVJlcUlEOiBUaGUgSUQgb2YgdGhlIHJlcXVlc3QKKyAqIEBvZW1EYXRhUmVxU3RhdHVzOiBTdGF0dXMgb2YgdGhlIHJlcXVlc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcG9ydHMgdGhlIHJlc3VsdHMgb2YgdGhlIHJlcXVlc3QgdG8gdXNlciBzcGFjZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBoZGRfb2VtX2RhdGFfcmVxX2NhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJICAgIHZvaWQgKnBDb250ZXh0LAorCQkJCQkgICAgdWludDMyX3Qgb2VtRGF0YVJlcUlELAorCQkJCQkgICAgZU9lbURhdGFSZXFTdGF0dXMgb2VtRGF0YVJlcVN0YXR1cykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcENvbnRleHQ7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWNoYXIgYnVmZmVyW0lXX0NVU1RPTV9NQVggKyAxXTsKKworCW1lbXNldCgmd3JxdSwgJ1wwJywgc2l6ZW9mKHdycXUpKTsKKwltZW1zZXQoYnVmZmVyLCAnXDAnLCBzaXplb2YoYnVmZmVyKSk7CisKKwlpZiAob2VtRGF0YVJlcVN0YXR1cyA9PSBlT0VNX0RBVEFfUkVRX0ZBSUxVUkUpIHsKKwkJc25wcmludGYoYnVmZmVyLCBJV19DVVNUT01fTUFYLCAiUUNPTTogT0VNLURBVEEtUkVRLUZBSUxFRCIpOworCQloZGRMb2coTE9HVywgIiVzOiBvZW0gZGF0YSByZXEgJWQgZmFpbGVkIiwgX19mdW5jX18sCisJCSAgICAgICBvZW1EYXRhUmVxSUQpOworCX0gZWxzZSBpZiAob2VtRGF0YVJlcVN0YXR1cyA9PSBlT0VNX0RBVEFfUkVRX0lOVkFMSURfTU9ERSkgeworCQlzbnByaW50ZihidWZmZXIsIElXX0NVU1RPTV9NQVgsCisJCQkgIlFDT006IE9FTS1EQVRBLVJFUS1JTlZBTElELU1PREUiKTsKKwkJaGRkTG9nKExPR1csCisJCSAgICAgICAiJXM6IG9lbSBkYXRhIHJlcSAlZCBmYWlsZWQgYmVjYXVzZSB0aGUgZHJpdmVyIGlzIGluIGludmFsaWQgbW9kZSAoSUJTU3xBUCkiLAorCQkgICAgICAgX19mdW5jX18sIG9lbURhdGFSZXFJRCk7CisJfSBlbHNlIHsKKwkJc25wcmludGYoYnVmZmVyLCBJV19DVVNUT01fTUFYLCAiUUNPTTogT0VNLURBVEEtUkVRLVNVQ0NFU1MiKTsKKwl9CisKKwl3cnF1LmRhdGEucG9pbnRlciA9IGJ1ZmZlcjsKKwl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1ZmZlcik7CisKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1ZmZlcik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGl3X2dldF9vZW1fZGF0YV9jYXAoKSAtIEdldCBPRU0gRGF0YSBDYXBhYmlsaXRpZXMKKyAqIEBkZXY6IG5ldCBkZXZpY2UgdXBvbiB3aGljaCB0aGUgcmVxdWVzdCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGRhdGEgcGF5bG9hZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgT0VNIERhdGEgUmVxdWVzdAorICogYW5kIFJlc3BvbnNlLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gdmFsdWUgb24gZmFpbHVyZQorICovCitpbnQgaXdfZ2V0X29lbV9kYXRhX2NhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRfaXdfb2VtX2RhdGFfY2FwIG9lbURhdGFDYXA7CisJdF9pd19vZW1fZGF0YV9jYXAgKnBIZGRPZW1EYXRhQ2FwOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDb250ZXh0OworCXN0cnVjdCBoZGRfY29uZmlnICpwQ29uZmlnOworCXVpbnQzMl90IG51bUNoYW5uZWxzOworCXVpbnQ4X3QgY2hhbkxpc3RbT0VNX0NBUF9NQVhfTlVNX0NIQU5ORUxTXTsKKwl1aW50MzJfdCBpOworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJcEhkZENvbnRleHQgPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDb250ZXh0KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlwQ29uZmlnID0gcEhkZENvbnRleHQtPmNvbmZpZzsKKwlpZiAoIXBDb25maWcpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczpIREQgY29uZmlndXJhdGlvbiBpcyBudWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlkbyB7CisJCWNkZl9tZW1femVybygmb2VtRGF0YUNhcCwgc2l6ZW9mKG9lbURhdGFDYXApKTsKKwkJc3RybGNweShvZW1EYXRhQ2FwLm9lbV90YXJnZXRfc2lnbmF0dXJlLCBPRU1fVEFSR0VUX1NJR05BVFVSRSwKKwkJCU9FTV9UQVJHRVRfU0lHTkFUVVJFX0xFTik7CisJCW9lbURhdGFDYXAub2VtX3RhcmdldF90eXBlID0gcEhkZENvbnRleHQtPnRhcmdldF90eXBlOworCQlvZW1EYXRhQ2FwLm9lbV9md192ZXJzaW9uID0gcEhkZENvbnRleHQtPnRhcmdldF9md192ZXJzaW9uOworCQlvZW1EYXRhQ2FwLmRyaXZlcl92ZXJzaW9uLm1ham9yID0gUVdMQU5fVkVSU0lPTl9NQUpPUjsKKwkJb2VtRGF0YUNhcC5kcml2ZXJfdmVyc2lvbi5taW5vciA9IFFXTEFOX1ZFUlNJT05fTUlOT1I7CisJCW9lbURhdGFDYXAuZHJpdmVyX3ZlcnNpb24ucGF0Y2ggPSBRV0xBTl9WRVJTSU9OX1BBVENIOworCQlvZW1EYXRhQ2FwLmRyaXZlcl92ZXJzaW9uLmJ1aWxkID0gUVdMQU5fVkVSU0lPTl9CVUlMRDsKKwkJb2VtRGF0YUNhcC5hbGxvd2VkX2R3ZWxsX3RpbWVfbWluID0KKwkJCXBDb25maWctPm5OZWlnaGJvclNjYW5NaW5DaGFuVGltZTsKKwkJb2VtRGF0YUNhcC5hbGxvd2VkX2R3ZWxsX3RpbWVfbWF4ID0KKwkJCXBDb25maWctPm5OZWlnaGJvclNjYW5NYXhDaGFuVGltZTsKKwkJb2VtRGF0YUNhcC5jdXJyX2R3ZWxsX3RpbWVfbWluID0KKwkJCXNtZV9nZXRfbmVpZ2hib3Jfc2Nhbl9taW5fY2hhbl90aW1lKHBIZGRDb250ZXh0LT5oSGFsLAorCQkJCQkJCSAgICBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJb2VtRGF0YUNhcC5jdXJyX2R3ZWxsX3RpbWVfbWF4ID0KKwkJCXNtZV9nZXRfbmVpZ2hib3Jfc2Nhbl9tYXhfY2hhbl90aW1lKHBIZGRDb250ZXh0LT5oSGFsLAorCQkJCQkJCSAgICBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJb2VtRGF0YUNhcC5zdXBwb3J0ZWRfYmFuZHMgPSBwQ29uZmlnLT5uQmFuZENhcGFiaWxpdHk7CisKKwkJLyogcmVxdWVzdCBmb3IgbWF4IG51bSBvZiBjaGFubmVscyAqLworCQludW1DaGFubmVscyA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKwkJc3RhdHVzID0gc21lX2dldF9jZmdfdmFsaWRfY2hhbm5lbHMocEhkZENvbnRleHQtPmhIYWwsCisJCQkJCQkgICAgJmNoYW5MaXN0WzBdLCAmbnVtQ2hhbm5lbHMpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ZmFpbGVkIHRvIGdldCB2YWxpZCBjaGFubmVsIGxpc3QiLAorCQkJCSAgX19mdW5jX18pOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0gZWxzZSB7CisJCQkvKiBtYWtlIHN1cmUgbnVtIGNoYW5uZWxzIGlzIG5vdCBtb3JlIHRoYW4gY2hhbiBsaXN0IGFycmF5ICovCisJCQlpZiAobnVtQ2hhbm5lbHMgPiBPRU1fQ0FQX01BWF9OVU1fQ0hBTk5FTFMpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICIlczpOdW0gb2YgY2hhbm5lbHMoJWQpIG1vcmUgdGhhbiBsZW5ndGgoJWQpIG9mIGNoYW5saXN0IiwKKwkJCQkJICBfX2Z1bmNfXywgbnVtQ2hhbm5lbHMsCisJCQkJCSAgT0VNX0NBUF9NQVhfTlVNX0NIQU5ORUxTKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJb2VtRGF0YUNhcC5udW1fY2hhbm5lbHMgPSBudW1DaGFubmVsczsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW1DaGFubmVsczsgaSsrKSB7CisJCQkJb2VtRGF0YUNhcC5jaGFubmVsX2xpc3RbaV0gPSBjaGFuTGlzdFtpXTsKKwkJCX0KKwkJfQorCisJCXBIZGRPZW1EYXRhQ2FwID0gKHRfaXdfb2VtX2RhdGFfY2FwICopIChleHRyYSk7CisJCWNkZl9tZW1fY29weShwSGRkT2VtRGF0YUNhcCwgJm9lbURhdGFDYXAsCisJCQkgICAgIHNpemVvZigqcEhkZE9lbURhdGFDYXApKTsKKwl9IHdoaWxlICgwKTsKKworCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzZW5kX29lbV9yZWdfcnNwX25saW5rX21zZygpIC0gc2VuZCBvZW0gcmVnaXN0cmF0aW9uIHJlc3BvbnNlCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBvZW0gbWVzc2FnZSB0byByZWdpc3RlcmVkIGFwcGxpY2F0aW9uIHByb2Nlc3MKKyAqCisgKiBSZXR1cm46ICBub25lCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfb2VtX3JlZ19yc3BfbmxpbmtfbXNnKHZvaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwl0QW5pTXNnSGRyICphbmlIZHI7CisJdWludDhfdCAqYnVmOworCXVpbnQ4X3QgKm51bUludGVyZmFjZXM7CisJdWludDhfdCAqZGV2aWNlTW9kZTsKKwl1aW50OF90ICp2ZGV2SWQ7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBOZXh0ID0gTlVMTDsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSAwOworCisJLyogT0VNIG1lc3NhZ2UgaXMgYWx3YXlzIHRvIGEgc3BlY2lmaWMgcHJvY2VzcyBhbmQgY2Fubm90IGJlIGEgYnJvYWRjYXN0ICovCisJaWYgKHBfaGRkX2N0eC0+b2VtX3BpZCA9PSAwKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGludmFsaWQgZGVzdCBwaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlza2IgPSBhbGxvY19za2IoTkxNU0dfU1BBQ0UoV0xBTl9OTF9NQVhfUEFZTE9BRCksIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBhbGxvY19za2IgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKwlubGgtPm5sbXNnX3BpZCA9IDA7ICAgICAvKiBmcm9tIGtlcm5lbCAqLworCW5saC0+bmxtc2dfZmxhZ3MgPSAwOworCW5saC0+bmxtc2dfc2VxID0gMDsKKwlubGgtPm5sbXNnX3R5cGUgPSBXTEFOX05MX01TR19PRU07CisJYW5pSGRyID0gTkxNU0dfREFUQShubGgpOworCWFuaUhkci0+dHlwZSA9IEFOSV9NU0dfQVBQX1JFR19SU1A7CisKKwkvKiBGaWxsIG1lc3NhZ2UgYm9keToKKwkgKiAgIEZpcnN0IGJ5dGUgd2lsbCBiZSBudW1iZXIgb2YgaW50ZXJmYWNlcywgZm9sbG93ZWQgYnkKKwkgKiAgIHR3byBieXRlcyBmb3IgZWFjaCBpbnRlcmZhY2VzCisJICogICAgIC0gb25lIGJ5dGUgZm9yIGRldmljZSBtb2RlCisJICogICAgIC0gb25lIGJ5dGUgZm9yIHZkZXYgaWQKKwkgKi8KKwlidWYgPSAoY2hhciAqKSgoY2hhciAqKWFuaUhkciArIHNpemVvZih0QW5pTXNnSGRyKSk7CisJbnVtSW50ZXJmYWNlcyA9IGJ1ZisrOworCSpudW1JbnRlcmZhY2VzID0gMDsKKworCS8qIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIHRoZSBhZGFwdGVycyBhbmQgZmlsbCBkZXZpY2UgbW9kZSBhbmQgdmRldiBpZCAqLworCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihwX2hkZF9jdHgsICZwQWRhcHRlck5vZGUpOworCXdoaWxlICgoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgJiYgcEFkYXB0ZXJOb2RlKSB7CisJCXBBZGFwdGVyID0gcEFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKwkJaWYgKHBBZGFwdGVyKSB7CisJCQlkZXZpY2VNb2RlID0gYnVmKys7CisJCQl2ZGV2SWQgPSBidWYrKzsKKwkJCSpkZXZpY2VNb2RlID0gcEFkYXB0ZXItPmRldmljZV9tb2RlOworCQkJKnZkZXZJZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisJCQkoKm51bUludGVyZmFjZXMpKys7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiBudW1JbnRlcmZhY2VzOiAlZCwgZGV2aWNlTW9kZTogJWQsIHZkZXZJZDogJWQiLAorCQkJCSAgX19mdW5jX18sICpudW1JbnRlcmZhY2VzLCAqZGV2aWNlTW9kZSwKKwkJCQkgICp2ZGV2SWQpOworCQl9CisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKHBfaGRkX2N0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQpOworCQlwQWRhcHRlck5vZGUgPSBwTmV4dDsKKwl9CisKKwlhbmlIZHItPmxlbmd0aCA9CisJCXNpemVvZih1aW50OF90KSArICgqbnVtSW50ZXJmYWNlcykgKiAyICogc2l6ZW9mKHVpbnQ4X3QpOworCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKChzaXplb2YodEFuaU1zZ0hkcikgKyBhbmlIZHItPmxlbmd0aCkpOworCisJc2tiX3B1dChza2IsIE5MTVNHX1NQQUNFKChzaXplb2YodEFuaU1zZ0hkcikgKyBhbmlIZHItPmxlbmd0aCkpKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBzZW5kaW5nIEFwcCBSZWcgUmVzcG9uc2UgbGVuZ3RoICglZCkgdG8gcHJvY2VzcyBwaWQgKCVkKSIsCisJCSAgX19mdW5jX18sIGFuaUhkci0+bGVuZ3RoLCBwX2hkZF9jdHgtPm9lbV9waWQpOworCisJKHZvaWQpbmxfc3J2X3VjYXN0KHNrYiwgcF9oZGRfY3R4LT5vZW1fcGlkLCBNU0dfRE9OVFdBSVQpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIHNlbmRfb2VtX2Vycl9yc3BfbmxpbmtfbXNnKCkgLSBzZW5kIG9lbSBlcnJvciByZXNwb25zZQorICogQGFwcF9waWQ6IFBJRCBvZiBvZW0gYXBwbGljYXRpb24gcHJvY2VzcworICogQGVycm9yX2NvZGU6IHJlc3BvbnNlIGVycm9yIGNvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGVycm9yIHJlc3BvbnNlIHRvIG9lbSBhcHAKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgc2VuZF9vZW1fZXJyX3JzcF9ubGlua19tc2coaW50MzJfdCBhcHBfcGlkLCB1aW50OF90IGVycm9yX2NvZGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwl0QW5pTXNnSGRyICphbmlIZHI7CisJdWludDhfdCAqYnVmOworCisJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX1NQQUNFKFdMQU5fTkxfTUFYX1BBWUxPQUQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogYWxsb2Nfc2tiIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJbmxoLT5ubG1zZ19waWQgPSAwOyAgICAgLyogZnJvbSBrZXJuZWwgKi8KKwlubGgtPm5sbXNnX2ZsYWdzID0gMDsKKwlubGgtPm5sbXNnX3NlcSA9IDA7CisJbmxoLT5ubG1zZ190eXBlID0gV0xBTl9OTF9NU0dfT0VNOworCWFuaUhkciA9IE5MTVNHX0RBVEEobmxoKTsKKwlhbmlIZHItPnR5cGUgPSBBTklfTVNHX09FTV9FUlJPUjsKKwlhbmlIZHItPmxlbmd0aCA9IHNpemVvZih1aW50OF90KTsKKwlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2YodEFuaU1zZ0hkcikgKyBhbmlIZHItPmxlbmd0aCk7CisKKwkvKiBtZXNzYWdlIGJvZHkgd2lsbCBjb250YWluIG9uZSBieXRlIG9mIGVycm9yIGNvZGUgKi8KKwlidWYgPSAoY2hhciAqKSgoY2hhciAqKWFuaUhkciArIHNpemVvZih0QW5pTXNnSGRyKSk7CisJKmJ1ZiA9IGVycm9yX2NvZGU7CisKKwlza2JfcHV0KHNrYiwgTkxNU0dfU1BBQ0Uoc2l6ZW9mKHRBbmlNc2dIZHIpICsgYW5pSGRyLT5sZW5ndGgpKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBzZW5kaW5nIG9lbSBlcnJvciByZXNwb25zZSB0byBwcm9jZXNzIHBpZCAoJWQpIiwKKwkJICBfX2Z1bmNfXywgYXBwX3BpZCk7CisKKwkodm9pZClubF9zcnZfdWNhc3Qoc2tiLCBhcHBfcGlkLCBNU0dfRE9OVFdBSVQpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIGhkZF9zZW5kX29lbV9kYXRhX3JzcF9tc2coKSAtIHNlbmQgb2VtIGRhdGEgcmVzcG9uc2UKKyAqIEBsZW5ndGg6IGxlbmd0aCBvZiB0aGUgT0VNIERhdGEgUmVzcG9uc2UgbWVzc2FnZQorICogQG9lbURhdGFSc3A6IHRoZSBhY3R1YWwgT0VNIERhdGEgUmVzcG9uc2UgbWVzc2FnZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgYW4gT0VNIERhdGEgUmVzcG9uc2UgbWVzc2FnZSB0byBhIHJlZ2lzdGVyZWQKKyAqIGFwcGxpY2F0aW9uIHByb2Nlc3Mgb3ZlciB0aGUgbmV0bGluayBzb2NrZXQuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICovCit2b2lkIGhkZF9zZW5kX29lbV9kYXRhX3JzcF9tc2coaW50IGxlbmd0aCwgdWludDhfdCAqb2VtRGF0YVJzcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXRBbmlNc2dIZHIgKmFuaUhkcjsKKwl1aW50OF90ICpvZW1EYXRhOworCisJLyogT0VNIG1lc3NhZ2UgaXMgYWx3YXlzIHRvIGEgc3BlY2lmaWMgcHJvY2VzcyBhbmQgY2Fubm90IGJlIGEgYnJvYWRjYXN0ICovCisJaWYgKHBfaGRkX2N0eC0+b2VtX3BpZCA9PSAwKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGludmFsaWQgZGVzdCBwaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobGVuZ3RoID4gT0VNX0RBVEFfUlNQX1NJWkUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogaW52YWxpZCBsZW5ndGggb2YgT2VtIERhdGEgcmVzcG9uc2UiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlza2IgPSBhbGxvY19za2IoTkxNU0dfU1BBQ0Uoc2l6ZW9mKHRBbmlNc2dIZHIpICsgT0VNX0RBVEFfUlNQX1NJWkUpLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGFsbG9jX3NrYiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCW5saC0+bmxtc2dfcGlkID0gMDsgICAgIC8qIGZyb20ga2VybmVsICovCisJbmxoLT5ubG1zZ19mbGFncyA9IDA7CisJbmxoLT5ubG1zZ19zZXEgPSAwOworCW5saC0+bmxtc2dfdHlwZSA9IFdMQU5fTkxfTVNHX09FTTsKKwlhbmlIZHIgPSBOTE1TR19EQVRBKG5saCk7CisJYW5pSGRyLT50eXBlID0gQU5JX01TR19PRU1fREFUQV9SU1A7CisKKwlhbmlIZHItPmxlbmd0aCA9IGxlbmd0aDsKKwlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSCgoc2l6ZW9mKHRBbmlNc2dIZHIpICsgYW5pSGRyLT5sZW5ndGgpKTsKKwlvZW1EYXRhID0gKHVpbnQ4X3QgKikgKChjaGFyICopYW5pSGRyICsgc2l6ZW9mKHRBbmlNc2dIZHIpKTsKKwljZGZfbWVtX2NvcHkob2VtRGF0YSwgb2VtRGF0YVJzcCwgbGVuZ3RoKTsKKworCXNrYl9wdXQoc2tiLCBOTE1TR19TUEFDRSgoc2l6ZW9mKHRBbmlNc2dIZHIpICsgYW5pSGRyLT5sZW5ndGgpKSk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogc2VuZGluZyBPZW0gRGF0YSBSZXNwb25zZSBvZiBsZW4gKCVkKSB0byBwcm9jZXNzIHBpZCAoJWQpIiwKKwkJICBfX2Z1bmNfXywgbGVuZ3RoLCBwX2hkZF9jdHgtPm9lbV9waWQpOworCisJKHZvaWQpbmxfc3J2X3VjYXN0KHNrYiwgcF9oZGRfY3R4LT5vZW1fcGlkLCBNU0dfRE9OVFdBSVQpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIG9lbV9wcm9jZXNzX2RhdGFfcmVxX21zZygpIC0gcHJvY2VzcyBvZW0gZGF0YSByZXF1ZXN0CisgKiBAb2VtRGF0YUxlbjogTGVuZ3RoIHRvIE9FTSBEYXRhIGJ1ZmZlcgorICogQG9lbURhdGE6IFBvaW50ZXIgdG8gT0VNIERhdGEgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBvZW0gbWVzc2FnZSB0byBTTUUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworc3RhdGljIENERl9TVEFUVVMgb2VtX3Byb2Nlc3NfZGF0YV9yZXFfbXNnKGludCBvZW1EYXRhTGVuLCBjaGFyICpvZW1EYXRhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gTlVMTDsKKwl0T2VtRGF0YVJlcUNvbmZpZyBvZW1EYXRhUmVxQ29uZmlnOworCXVpbnQzMl90IG9lbURhdGFSZXFJRCA9IDA7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkvKiBmb3Igbm93LCBTVEEgaW50ZXJmYWNlIG9ubHkgKi8KKwlwQWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihwX2hkZF9jdHgsIFdMQU5fSEREX0lORlJBX1NUQVRJT04pOworCWlmICghcEFkYXB0ZXIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTm8gYWRhcHRlciBmb3IgU1RBIG1vZGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoIW9lbURhdGEpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogb2VtRGF0YSBpcyBudWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY2RmX21lbV96ZXJvKCZvZW1EYXRhUmVxQ29uZmlnLCBzaXplb2YodE9lbURhdGFSZXFDb25maWcpKTsKKworCWNkZl9tZW1fY29weSgoJm9lbURhdGFSZXFDb25maWcpLT5vZW1EYXRhUmVxLCBvZW1EYXRhLCBvZW1EYXRhTGVuKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBjYWxsaW5nIHNtZV9vZW1fZGF0YV9yZXEiLCBfX2Z1bmNfXyk7CisKKwlzdGF0dXMgPSBzbWVfb2VtX2RhdGFfcmVxKHBfaGRkX2N0eC0+aEhhbCwKKwkJCQkgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJICAmb2VtRGF0YVJlcUNvbmZpZywKKwkJCQkgICZvZW1EYXRhUmVxSUQsCisJCQkJICAmaGRkX29lbV9kYXRhX3JlcV9jYWxsYmFjaywgcEFkYXB0ZXItPmRldik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBvZW1fcHJvY2Vzc19jaGFubmVsX2luZm9fcmVxX21zZygpIC0gcHJvY2VzcyBvZW0gY2hhbm5lbF9pbmZvIHJlcXVlc3QKKyAqIEBudW1PZkNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBjaGFuTGlzdDogbGlzdCBvZiBjaGFubmVsIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXNwb25kcyB3aXRoIGNoYW5uZWwgaW5mbyB0byBvZW0gcHJvY2VzcworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBvZW1fcHJvY2Vzc19jaGFubmVsX2luZm9fcmVxX21zZyhpbnQgbnVtT2ZDaGFubmVscywgY2hhciAqY2hhbkxpc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwl0QW5pTXNnSGRyICphbmlIZHI7CisJdEhkZENoYW5uZWxJbmZvICpwSGRkQ2hhbkluZm87CisJdEhkZENoYW5uZWxJbmZvIGhkZENoYW5JbmZvOworCXVpbnQ4X3QgY2hhbklkOworCXVpbnQzMl90IHJlZ19pbmZvXzE7CisJdWludDMyX3QgcmVnX2luZm9fMjsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCWludCBpOworCXVpbnQ4X3QgKmJ1ZjsKKworCS8qIE9FTSBtZXNzYWdlIGlzIGFsd2F5cyB0byBhIHNwZWNpZmljIHByb2Nlc3MgYW5kIGNhbm5vdCBiZSBhIGJyb2FkY2FzdCAqLworCWlmIChwX2hkZF9jdHgtPm9lbV9waWQgPT0gMCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBpbnZhbGlkIGRlc3QgcGlkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXNrYiA9IGFsbG9jX3NrYihOTE1TR19TUEFDRShzaXplb2YodEFuaU1zZ0hkcikgKyBzaXplb2YodWludDhfdCkgKworCQkJCSAgICBudW1PZkNoYW5uZWxzICogc2l6ZW9mKHRIZGRDaGFubmVsSW5mbykpLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGFsbG9jX3NrYiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJbmxoLT5ubG1zZ19waWQgPSAwOyAgICAgLyogZnJvbSBrZXJuZWwgKi8KKwlubGgtPm5sbXNnX2ZsYWdzID0gMDsKKwlubGgtPm5sbXNnX3NlcSA9IDA7CisJbmxoLT5ubG1zZ190eXBlID0gV0xBTl9OTF9NU0dfT0VNOworCWFuaUhkciA9IE5MTVNHX0RBVEEobmxoKTsKKwlhbmlIZHItPnR5cGUgPSBBTklfTVNHX0NIQU5ORUxfSU5GT19SU1A7CisKKwlhbmlIZHItPmxlbmd0aCA9CisJCXNpemVvZih1aW50OF90KSArIG51bU9mQ2hhbm5lbHMgKiBzaXplb2YodEhkZENoYW5uZWxJbmZvKTsKKwlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSCgoc2l6ZW9mKHRBbmlNc2dIZHIpICsgYW5pSGRyLT5sZW5ndGgpKTsKKworCS8qIEZpcnN0IGJ5dGUgb2YgbWVzc2FnZSBib2R5IHdpbGwgaGF2ZSBudW0gb2YgY2hhbm5lbHMgKi8KKwlidWYgPSAoY2hhciAqKSgoY2hhciAqKWFuaUhkciArIHNpemVvZih0QW5pTXNnSGRyKSk7CisJKmJ1ZisrID0gbnVtT2ZDaGFubmVsczsKKworCS8qIE5leHQgZm9sbG93cyBjaGFubmVsIGluZm8gc3RydWN0IGZvciBlYWNoIGNoYW5uZWwgaWQuCisJICogSWYgY2hhbiBpZCBpcyB3cm9uZyBvciBTTUUgcmV0dXJucyBmYWlsdXJlIGZvciBhIGNoYW5uZWwKKwkgKiB0aGVuIGZpbGwgaW4gMCBpbiBjaGFubmVsIGluZm8gZm9yIHRoYXQgcGFydGljdWxhciBjaGFubmVsCisJICovCisJZm9yIChpID0gMDsgaSA8IG51bU9mQ2hhbm5lbHM7IGkrKykgeworCQlwSGRkQ2hhbkluZm8gPSAodEhkZENoYW5uZWxJbmZvICopICgoY2hhciAqKWJ1ZiArCisJCQkJCQkgICAgaSAqCisJCQkJCQkgICAgc2l6ZW9mKHRIZGRDaGFubmVsSW5mbykpOworCisJCWNoYW5JZCA9IGNoYW5MaXN0W2ldOworCQlzdGF0dXMgPSBzbWVfZ2V0X3JlZ19pbmZvKHBfaGRkX2N0eC0+aEhhbCwgY2hhbklkLAorCQkJCQkgICZyZWdfaW5mb18xLCAmcmVnX2luZm9fMik7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCQkvKiBjb3B5IGludG8gaGRkIGNoYW4gaW5mbyBzdHJ1Y3QgKi8KKwkJCWhkZENoYW5JbmZvLmNoYW5faWQgPSBjaGFuSWQ7CisJCQloZGRDaGFuSW5mby5yZXNlcnZlZDAgPSAwOworCQkJaGRkQ2hhbkluZm8ubWh6ID0gY2RzX2NoYW5fdG9fZnJlcShjaGFuSWQpOworCQkJaGRkQ2hhbkluZm8uYmFuZF9jZW50ZXJfZnJlcTEgPSBoZGRDaGFuSW5mby5taHo7CisJCQloZGRDaGFuSW5mby5iYW5kX2NlbnRlcl9mcmVxMiA9IDA7CisKKwkJCWhkZENoYW5JbmZvLmluZm8gPSAwOworCQkJaWYgKENIQU5ORUxfU1RBVEVfREZTID09CisJCQkgICAgY2RzX2dldF9jaGFubmVsX3N0YXRlKGNoYW5JZCkpCisJCQkJV01JX1NFVF9DSEFOTkVMX0ZMQUcoJmhkZENoYW5JbmZvLAorCQkJCQkJICAgICBXTUlfQ0hBTl9GTEFHX0RGUyk7CisJCQloZGRDaGFuSW5mby5yZWdfaW5mb18xID0gcmVnX2luZm9fMTsKKwkJCWhkZENoYW5JbmZvLnJlZ19pbmZvXzIgPSByZWdfaW5mb18yOworCQl9IGVsc2UgeworCQkJLyogY2hhbm5lbCBpbmZvIGlzIG5vdCByZXR1cm5lZCwgZmlsbCBpbiB6ZXJvcyBpbiBjaGFubmVsCisJCQkgKiBpbmZvIHN0cnVjdAorCQkJICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiBzbWVfZ2V0X3JlZ19pbmZvIGZhaWxlZCBmb3IgY2hhbiAoJWQpLCByZXR1cm4gaW5mbyAwIiwKKwkJCQkgIF9fZnVuY19fLCBjaGFuSWQpOworCQkJaGRkQ2hhbkluZm8uY2hhbl9pZCA9IGNoYW5JZDsKKwkJCWhkZENoYW5JbmZvLnJlc2VydmVkMCA9IDA7CisJCQloZGRDaGFuSW5mby5taHogPSAwOworCQkJaGRkQ2hhbkluZm8uYmFuZF9jZW50ZXJfZnJlcTEgPSAwOworCQkJaGRkQ2hhbkluZm8uYmFuZF9jZW50ZXJfZnJlcTIgPSAwOworCQkJaGRkQ2hhbkluZm8uaW5mbyA9IDA7CisJCQloZGRDaGFuSW5mby5yZWdfaW5mb18xID0gMDsKKwkJCWhkZENoYW5JbmZvLnJlZ19pbmZvXzIgPSAwOworCQl9CisJCWNkZl9tZW1fY29weShwSGRkQ2hhbkluZm8sICZoZGRDaGFuSW5mbywKKwkJCSAgICAgc2l6ZW9mKHRIZGRDaGFubmVsSW5mbykpOworCX0KKworCXNrYl9wdXQoc2tiLCBOTE1TR19TUEFDRSgoc2l6ZW9mKHRBbmlNc2dIZHIpICsgYW5pSGRyLT5sZW5ndGgpKSk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogc2VuZGluZyBjaGFubmVsIGluZm8gcmVzcCBmb3IgbnVtIGNoYW5uZWxzICglZCkgdG8gcGlkICglZCkiLAorCQkgIF9fZnVuY19fLCBudW1PZkNoYW5uZWxzLCBwX2hkZF9jdHgtPm9lbV9waWQpOworCisJKHZvaWQpbmxfc3J2X3VjYXN0KHNrYiwgcF9oZGRfY3R4LT5vZW1fcGlkLCBNU0dfRE9OVFdBSVQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX3NlbmRfcGVlcl9zdGF0dXNfaW5kX3RvX29lbV9hcHAoKSAtCisgKglGdW5jdGlvbiB0byBzZW5kIHBlZXIgc3RhdHVzIHRvIGEgcmVnaXN0ZXJlZCBhcHBsaWNhdGlvbgorICogQHBlZXJNYWM6IE1BQyBhZGRyZXNzIG9mIHBlZXIKKyAqIEBwZWVyU3RhdHVzOiBlUGVlckNvbm5lY3RlZCBvciBlUGVlckRpc2Nvbm5lY3RlZAorICogQHBlZXJUaW1pbmdNZWFzQ2FwOiAwOiBSVFQvUlRUMiwgMTogUlRUMy4gRGVmYXVsdCBpcyAwCisgKiBAc2Vzc2lvbklkOiBTTUUgc2Vzc2lvbiBpZCwgaS5lLiB2ZGV2X2lkCisgKiBAY2hhbl9pbmZvOiBvcGVyYXRpbmcgY2hhbm5lbCBpbmZvcm1hdGlvbgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGhkZF9zZW5kX3BlZXJfc3RhdHVzX2luZF90b19vZW1fYXBwKHN0cnVjdCBjZGZfbWFjX2FkZHIgKnBlZXJNYWMsCisJCQkJCSB1aW50OF90IHBlZXJTdGF0dXMsCisJCQkJCSB1aW50OF90IHBlZXJUaW1pbmdNZWFzQ2FwLAorCQkJCQkgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSB0U2lyU21lQ2hhbkluZm8gKmNoYW5faW5mbykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXRBbmlNc2dIZHIgKmFuaUhkcjsKKwl0UGVlclN0YXR1c0luZm8gKnBQZWVySW5mbzsKKworCWlmICghcF9oZGRfY3R4IHx8ICFwX2hkZF9jdHgtPmhIYWwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRWl0aGVyIEhERCBDdHggaXMgbnVsbCBvciBIYWwgQ3R4IGlzIG51bGwiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBjaGVjayBpZiBvZW0gYXBwIGhhcyByZWdpc3RlcmVkIGFuZCBwaWQgaXMgdmFsaWQgKi8KKwlpZiAoKCFwX2hkZF9jdHgtPm9lbV9hcHBfcmVnaXN0ZXJlZCkgfHwgKHBfaGRkX2N0eC0+b2VtX3BpZCA9PSAwKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogT0VNIGFwcCBpcyBub3QgcmVnaXN0ZXJlZCglZCkgb3IgcGlkIGlzIGludmFsaWQoJWQpIiwKKwkJCSAgX19mdW5jX18sIHBfaGRkX2N0eC0+b2VtX2FwcF9yZWdpc3RlcmVkLAorCQkJICBwX2hkZF9jdHgtPm9lbV9waWQpOworCQlyZXR1cm47CisJfQorCisJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX1NQQUNFKHNpemVvZih0QW5pTXNnSGRyKSArCisJCQkJICAgIHNpemVvZih0UGVlclN0YXR1c0luZm8pKSwKKwkJCUdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBhbGxvY19za2IgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKwlubGgtPm5sbXNnX3BpZCA9IDA7ICAgICAvKiBmcm9tIGtlcm5lbCAqLworCW5saC0+bmxtc2dfZmxhZ3MgPSAwOworCW5saC0+bmxtc2dfc2VxID0gMDsKKwlubGgtPm5sbXNnX3R5cGUgPSBXTEFOX05MX01TR19PRU07CisJYW5pSGRyID0gTkxNU0dfREFUQShubGgpOworCWFuaUhkci0+dHlwZSA9IEFOSV9NU0dfUEVFUl9TVEFUVVNfSU5EOworCisJYW5pSGRyLT5sZW5ndGggPSBzaXplb2YodFBlZXJTdGF0dXNJbmZvKTsKKwlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSCgoc2l6ZW9mKHRBbmlNc2dIZHIpICsgYW5pSGRyLT5sZW5ndGgpKTsKKworCXBQZWVySW5mbyA9ICh0UGVlclN0YXR1c0luZm8gKikgKChjaGFyICopYW5pSGRyICsgc2l6ZW9mKHRBbmlNc2dIZHIpKTsKKworCWNkZl9tZW1fY29weShwUGVlckluZm8tPnBlZXJfbWFjX2FkZHIsIHBlZXJNYWMtPmJ5dGVzLAorCQkgICAgIHNpemVvZihwZWVyTWFjLT5ieXRlcykpOworCXBQZWVySW5mby0+cGVlcl9zdGF0dXMgPSBwZWVyU3RhdHVzOworCXBQZWVySW5mby0+dmRldl9pZCA9IHNlc3Npb25JZDsKKwlwUGVlckluZm8tPnBlZXJfY2FwYWJpbGl0eSA9IHBlZXJUaW1pbmdNZWFzQ2FwOworCXBQZWVySW5mby0+cmVzZXJ2ZWQwID0gMDsKKworCWlmIChjaGFuX2luZm8pIHsKKwkJcFBlZXJJbmZvLT5wZWVyX2NoYW5faW5mby5jaGFuX2lkID0gY2hhbl9pbmZvLT5jaGFuX2lkOworCQlwUGVlckluZm8tPnBlZXJfY2hhbl9pbmZvLnJlc2VydmVkMCA9IDA7CisJCXBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8ubWh6ID0gY2hhbl9pbmZvLT5taHo7CisJCXBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8uYmFuZF9jZW50ZXJfZnJlcTEgPQorCQkJY2hhbl9pbmZvLT5iYW5kX2NlbnRlcl9mcmVxMTsKKwkJcFBlZXJJbmZvLT5wZWVyX2NoYW5faW5mby5iYW5kX2NlbnRlcl9mcmVxMiA9CisJCQljaGFuX2luZm8tPmJhbmRfY2VudGVyX2ZyZXEyOworCQlwUGVlckluZm8tPnBlZXJfY2hhbl9pbmZvLmluZm8gPSBjaGFuX2luZm8tPmluZm87CisJCXBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8ucmVnX2luZm9fMSA9IGNoYW5faW5mby0+cmVnX2luZm9fMTsKKwkJcFBlZXJJbmZvLT5wZWVyX2NoYW5faW5mby5yZWdfaW5mb18yID0gY2hhbl9pbmZvLT5yZWdfaW5mb18yOworCX0gZWxzZSB7CisJCXBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8uY2hhbl9pZCA9IDA7CisJCXBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8ucmVzZXJ2ZWQwID0gMDsKKwkJcFBlZXJJbmZvLT5wZWVyX2NoYW5faW5mby5taHogPSAwOworCQlwUGVlckluZm8tPnBlZXJfY2hhbl9pbmZvLmJhbmRfY2VudGVyX2ZyZXExID0gMDsKKwkJcFBlZXJJbmZvLT5wZWVyX2NoYW5faW5mby5iYW5kX2NlbnRlcl9mcmVxMiA9IDA7CisJCXBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8uaW5mbyA9IDA7CisJCXBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8ucmVnX2luZm9fMSA9IDA7CisJCXBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8ucmVnX2luZm9fMiA9IDA7CisJfQorCXNrYl9wdXQoc2tiLCBOTE1TR19TUEFDRSgoc2l6ZW9mKHRBbmlNc2dIZHIpICsgYW5pSGRyLT5sZW5ndGgpKSk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiBzZW5kaW5nIHBlZXIgIiBNQUNfQUREUkVTU19TVFIKKwkJICAiIHN0YXR1cyglZCksIHBlZXJUaW1pbmdNZWFzQ2FwKCVkKSwgdmRldklkKCVkKSwgY2hhbklkKCVkKSIKKwkJICAiIHRvIG9lbSBhcHAgcGlkKCVkKSwgY2VudGVyIGZyZXEgMSAoJWQpLCBjZW50ZXIgZnJlcSAyICglZCksIgorCQkgICIgaW5mbyAoMHgleCksIGZyZXF1ZW5jeSAoJWQpLHJlZyBpbmZvIDEgKDB4JXgpLCIKKwkJICAiIHJlZyBpbmZvIDIgKDB4JXgpIiwgX19mdW5jX18sCisJCSAgTUFDX0FERFJfQVJSQVkocGVlck1hYy0+Ynl0ZXMpLAorCQkgIHBlZXJTdGF0dXMsIHBlZXJUaW1pbmdNZWFzQ2FwLAorCQkgIHNlc3Npb25JZCwgcFBlZXJJbmZvLT5wZWVyX2NoYW5faW5mby5jaGFuX2lkLAorCQkgIHBfaGRkX2N0eC0+b2VtX3BpZCwKKwkJICBwUGVlckluZm8tPnBlZXJfY2hhbl9pbmZvLmJhbmRfY2VudGVyX2ZyZXExLAorCQkgIHBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8uYmFuZF9jZW50ZXJfZnJlcTIsCisJCSAgcFBlZXJJbmZvLT5wZWVyX2NoYW5faW5mby5pbmZvLAorCQkgIHBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8ubWh6LAorCQkgIHBQZWVySW5mby0+cGVlcl9jaGFuX2luZm8ucmVnX2luZm9fMSwKKwkJICBwUGVlckluZm8tPnBlZXJfY2hhbl9pbmZvLnJlZ19pbmZvXzIpOworCisJKHZvaWQpbmxfc3J2X3VjYXN0KHNrYiwgcF9oZGRfY3R4LT5vZW1fcGlkLCBNU0dfRE9OVFdBSVQpOworCisJcmV0dXJuOworfQorCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCBieSBOZXRsaW5rIHNlcnZpY2UgZm9yIGFsbCBuZXRsaW5rCisgKiBtZXNzYWdlcyAoZnJvbSB1c2VyIHNwYWNlKSBhZGRyZXNzZWQgdG8gV0xBTl9OTF9NU0dfT0VNCisgKi8KKworLyoqCisgKiBvZW1fbXNnX2NhbGxiYWNrKCkgLSBjYWxsYmFjayBpbnZva2VkIGJ5IG5ldGxpbmsgc2VydmljZQorICogQHNrYjogICAgc2tiIHdpdGggbmV0bGluayBtZXNzYWdlCisgKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGludm9rZWQgYnkgbmV0bGluayBzZXJ2aWNlIHdoZW4gYSBtZXNzYWdlCisgKiBpcyByZWNlaXZlZCBmcm9tIHVzZXIgc3BhY2UgYWRkcmVzc2VkIHRvIFdMQU5fTkxfTVNHX09FTQorICoKKyAqIFJldHVybjogemVybyBvbiBzdWNjZXNzCisgKiAgICAgICAgIE9uIGVycm9yLCBlcnJvciBudW1iZXIgd2lsbCBiZSByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBvZW1fbXNnX2NhbGxiYWNrKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJdEFuaU1zZ0hkciAqbXNnX2hkcjsKKwlpbnQgcmV0OworCWNoYXIgKnNpZ25fc3RyID0gTlVMTDsKKwlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCisJaWYgKCFubGgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTmV0bGluayBoZWFkZXIgbnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBfaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1zZ19oZHIgPSBOTE1TR19EQVRBKG5saCk7CisKKwlpZiAoIW1zZ19oZHIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTWVzc2FnZSBoZWFkZXIgbnVsbCIsIF9fZnVuY19fKTsKKwkJc2VuZF9vZW1fZXJyX3JzcF9ubGlua19tc2cobmxoLT5ubG1zZ19waWQsCisJCQkJCSAgIE9FTV9FUlJfTlVMTF9NRVNTQUdFX0hFQURFUik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKG5saC0+bmxtc2dfbGVuIDwKKwkgICAgTkxNU0dfTEVOR1RIKHNpemVvZih0QW5pTXNnSGRyKSArIG1zZ19oZHItPmxlbmd0aCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBubCBtc2cgbGVuLCBubGgtPm5sbXNnX2xlbiAoJWQpLCBtc2dfaGRyLT5sZW4gKCVkKSIsCisJCQkgIF9fZnVuY19fLCBubGgtPm5sbXNnX2xlbiwgbXNnX2hkci0+bGVuZ3RoKTsKKwkJc2VuZF9vZW1fZXJyX3JzcF9ubGlua19tc2cobmxoLT5ubG1zZ19waWQsCisJCQkJCSAgIE9FTV9FUlJfSU5WQUxJRF9NRVNTQUdFX0xFTkdUSCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJc3dpdGNoIChtc2dfaGRyLT50eXBlKSB7CisJY2FzZSBBTklfTVNHX0FQUF9SRUdfUkVROgorCQkvKiBSZWdpc3RyYXRpb24gcmVxdWVzdCBpcyBvbmx5IGFsbG93ZWQgZm9yIFF1YWxjb21tIEFwcGxpY2F0aW9uICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogUmVjZWl2ZWQgQXBwIFJlcSBSZXEgZnJvbSBBcHAgcHJvY2VzcyBwaWQoJWQpLCBsZW4oJWQpIiwKKwkJCSAgX19mdW5jX18sIG5saC0+bmxtc2dfcGlkLCBtc2dfaGRyLT5sZW5ndGgpOworCisJCXNpZ25fc3RyID0gKGNoYXIgKikoKGNoYXIgKiltc2dfaGRyICsgc2l6ZW9mKHRBbmlNc2dIZHIpKTsKKwkJaWYgKChPRU1fQVBQX1NJR05BVFVSRV9MRU4gPT0gbXNnX2hkci0+bGVuZ3RoKSAmJgorCQkgICAgKDAgPT0gc3RybmNtcChzaWduX3N0ciwgT0VNX0FQUF9TSUdOQVRVUkVfU1RSLAorCQkJCSAgT0VNX0FQUF9TSUdOQVRVUkVfTEVOKSkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiJXM6IFZhbGlkIEFwcCBSZXEgUmVxIGZyb20gb2VtIGFwcCBwcm9jZXNzIHBpZCglZCkiLAorCQkJCSAgX19mdW5jX18sIG5saC0+bmxtc2dfcGlkKTsKKworCQkJcF9oZGRfY3R4LT5vZW1fYXBwX3JlZ2lzdGVyZWQgPSB0cnVlOworCQkJcF9oZGRfY3R4LT5vZW1fcGlkID0gbmxoLT5ubG1zZ19waWQ7CisJCQlzZW5kX29lbV9yZWdfcnNwX25saW5rX21zZygpOworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEludmFsaWQgc2lnbmF0dXJlIGluIEFwcCBSZWcgUmVxdWVzdCBmcm9tIHBpZCglZCkiLAorCQkJCSAgX19mdW5jX18sIG5saC0+bmxtc2dfcGlkKTsKKwkJCXNlbmRfb2VtX2Vycl9yc3BfbmxpbmtfbXNnKG5saC0+bmxtc2dfcGlkLAorCQkJCQkJICAgT0VNX0VSUl9JTlZBTElEX1NJR05BVFVSRSk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTklfTVNHX09FTV9EQVRBX1JFUToKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzOiBSZWNlaXZlZCBPZW0gRGF0YSBSZXF1ZXN0IGxlbmd0aCglZCkgZnJvbSBwaWQ6ICVkIiwKKwkJCSAgX19mdW5jX18sIG1zZ19oZHItPmxlbmd0aCwgbmxoLT5ubG1zZ19waWQpOworCisJCWlmICgoIXBfaGRkX2N0eC0+b2VtX2FwcF9yZWdpc3RlcmVkKSB8fAorCQkgICAgKG5saC0+bmxtc2dfcGlkICE9IHBfaGRkX2N0eC0+b2VtX3BpZCkpIHsKKwkJCS8qIGVpdGhlciBvZW0gYXBwIGlzIG5vdCByZWdpc3RlcmVkIHlldCBvciBwaWQgaXMgZGlmZmVyZW50ICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogT0VNIERhdGFSZXE6IGFwcCBub3QgcmVnaXN0ZXJlZCglZCkgb3IgaW5jb3JyZWN0IHBpZCglZCkiLAorCQkJCSAgX19mdW5jX18sIHBfaGRkX2N0eC0+b2VtX2FwcF9yZWdpc3RlcmVkLAorCQkJCSAgbmxoLT5ubG1zZ19waWQpOworCQkJc2VuZF9vZW1fZXJyX3JzcF9ubGlua19tc2cobmxoLT5ubG1zZ19waWQsCisJCQkJCQkgICBPRU1fRVJSX0FQUF9OT1RfUkVHSVNURVJFRCk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisKKwkJaWYgKCghbXNnX2hkci0+bGVuZ3RoKSB8fCAoT0VNX0RBVEFfUkVRX1NJWkUgPCBtc2dfaGRyLT5sZW5ndGgpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogSW52YWxpZCBsZW5ndGggKCVkKSBpbiBPZW0gRGF0YSBSZXF1ZXN0IiwKKwkJCQkgIF9fZnVuY19fLCBtc2dfaGRyLT5sZW5ndGgpOworCQkJc2VuZF9vZW1fZXJyX3JzcF9ubGlua19tc2cobmxoLT5ubG1zZ19waWQsCisJCQkJCQkgICBPRU1fRVJSX0lOVkFMSURfTUVTU0FHRV9MRU5HVEgpOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCQlvZW1fcHJvY2Vzc19kYXRhX3JlcV9tc2cobXNnX2hkci0+bGVuZ3RoLAorCQkJCQkgKGNoYXIgKikoKGNoYXIgKiltc2dfaGRyICsKKwkJCQkJCSAgc2l6ZW9mKHRBbmlNc2dIZHIpKSk7CisJCWJyZWFrOworCisJY2FzZSBBTklfTVNHX0NIQU5ORUxfSU5GT19SRVE6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogUmVjZWl2ZWQgY2hhbm5lbCBpbmZvIHJlcXVlc3QsIG51bSBjaGFubmVsKCVkKSBmcm9tIHBpZDogJWQiLAorCQkJICBfX2Z1bmNfXywgbXNnX2hkci0+bGVuZ3RoLCBubGgtPm5sbXNnX3BpZCk7CisKKwkJaWYgKCghcF9oZGRfY3R4LT5vZW1fYXBwX3JlZ2lzdGVyZWQpIHx8CisJCSAgICAobmxoLT5ubG1zZ19waWQgIT0gcF9oZGRfY3R4LT5vZW1fcGlkKSkgeworCQkJLyogZWl0aGVyIG9lbSBhcHAgaXMgbm90IHJlZ2lzdGVyZWQgeWV0IG9yIHBpZCBpcyBkaWZmZXJlbnQgKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBDaGFuIEluZm9SZXE6IGFwcCBub3QgcmVnaXN0ZXJlZCglZCkgb3IgaW5jb3JyZWN0IHBpZCglZCkiLAorCQkJCSAgX19mdW5jX18sIHBfaGRkX2N0eC0+b2VtX2FwcF9yZWdpc3RlcmVkLAorCQkJCSAgbmxoLT5ubG1zZ19waWQpOworCQkJc2VuZF9vZW1fZXJyX3JzcF9ubGlua19tc2cobmxoLT5ubG1zZ19waWQsCisJCQkJCQkgICBPRU1fRVJSX0FQUF9OT1RfUkVHSVNURVJFRCk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisKKwkJLyogbWVzc2FnZSBsZW5ndGggY29udGFpbnMgbGlzdCBvZiBjaGFubmVsIGlkcyAqLworCQlpZiAoKCFtc2dfaGRyLT5sZW5ndGgpIHx8CisJCSAgICAoV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOIDwgbXNnX2hkci0+bGVuZ3RoKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEludmFsaWQgbGVuZ3RoICglZCkgaW4gY2hhbm5lbCBpbmZvIHJlcXVlc3QiLAorCQkJCSAgX19mdW5jX18sIG1zZ19oZHItPmxlbmd0aCk7CisJCQlzZW5kX29lbV9lcnJfcnNwX25saW5rX21zZyhubGgtPm5sbXNnX3BpZCwKKwkJCQkJCSAgIE9FTV9FUlJfSU5WQUxJRF9NRVNTQUdFX0xFTkdUSCk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCW9lbV9wcm9jZXNzX2NoYW5uZWxfaW5mb19yZXFfbXNnKG1zZ19oZHItPmxlbmd0aCwKKwkJCQkJCSAoY2hhciAqKSgoY2hhciAqKW1zZ19oZHIgKworCQkJCQkJCSAgc2l6ZW9mKHRBbmlNc2dIZHIpKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogUmVjZWl2ZWQgSW52YWxpZCBtZXNzYWdlIHR5cGUgKCVkKSwgbGVuZ3RoICglZCkiLAorCQkJICBfX2Z1bmNfXywgbXNnX2hkci0+dHlwZSwgbXNnX2hkci0+bGVuZ3RoKTsKKwkJc2VuZF9vZW1fZXJyX3JzcF9ubGlua19tc2cobmxoLT5ubG1zZ19waWQsCisJCQkJCSAgIE9FTV9FUlJfSU5WQUxJRF9NRVNTQUdFX1RZUEUpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX29lbV9tc2dfY2FsbGJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBvZW1fbXNnX2NhbGxiYWNrKHNrYik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBvZW1fYWN0aXZhdGVfc2VydmljZSgpIC0gQWN0aXZhdGUgb2VtIG1lc3NhZ2UgaGFuZGxlcgorICogQGhkZF9jdHg6ICAgcG9pbnRlciB0byBnbG9iYWwgSEREIGNvbnRleHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBhIGhhbmRsZXIgdG8gcmVjZWl2ZSBuZXRsaW5rIG1lc3NhZ2UgZnJvbQorICogYW4gT0VNIGFwcGxpY2F0aW9uIHByb2Nlc3MuCisgKgorICogUmV0dXJuOiB6ZXJvIG9uIHN1Y2Nlc3MKKyAqICAgICAgICAgT24gZXJyb3IsIGVycm9yIG51bWJlciB3aWxsIGJlIHJldHVybmVkLgorICovCitpbnQgb2VtX2FjdGl2YXRlX3NlcnZpY2Uoc3RydWN0IGhkZF9jb250ZXh0X3MgKmhkZF9jdHgpCit7CisJcF9oZGRfY3R4ID0gaGRkX2N0eDsKKworCS8qIFJlZ2lzdGVyIHRoZSBtc2cgaGFuZGxlciBmb3IgbXNncyBhZGRyZXNzZWQgdG8gV0xBTl9OTF9NU0dfT0VNICovCisJcmV0dXJuIG5sX3Nydl9yZWdpc3RlcihXTEFOX05MX01TR19PRU0sIF9fb2VtX21zZ19jYWxsYmFjayk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX3AycC5jIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX3AycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZDVhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfcDJwLmMKQEAgLTAsMCArMSwyNjI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqCisgKiBAZmlsZSAgd2xhbl9oZGRfcDJwLmMKKyAqCisgKiBAYnJpZWYgV0xBTiBIb3N0IERldmljZSBEcml2ZXIgaW1wbGVtZW50YXRpb24gZm9yIFAyUCBjb21tYW5kcyBpbnRlcmZhY2UKKyAqCisgKi8KKworI2luY2x1ZGUgPHdsYW5faGRkX2luY2x1ZGVzLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaG9zdGFwZC5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2luY2x1ZGUgInNtZV9hcGkuaCIKKyNpbmNsdWRlICJzbWVfcW9zX2FwaS5oIgorI2luY2x1ZGUgIndsYW5faGRkX3AycC5oIgorI2luY2x1ZGUgInNhcF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CisjaW5jbHVkZSAid2xhbl9oZGRfdGRscy5oIgorI2luY2x1ZGUgIndsYW5faGRkX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RzX3NjaGVkLmgiCisjaW5jbHVkZSAiY2RzX2NvbmN1cnJlbmN5LmgiCisKKy8qIE1zIHRvIE1pY3JvIFNlYyAqLworI2RlZmluZSBNU19UT19NVVMoeCkgICAoKHgpICogMTAwMCkKKworc3RhdGljIHVpbnQ4X3QgKmhkZF9nZXRfYWN0aW9uX3N0cmluZyh1aW50MTZfdCBNc2dUeXBlKQoreworCXN3aXRjaCAoTXNnVHlwZSkgeworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX01BQ19BQ1RJT05fU1BFQ1RSVU1fTUdNVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTUFDX0FDVElPTl9RT1NfTUdNVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTUFDX0FDVElPTl9ETFApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX01BQ19BQ1RJT05fUFVCTElDX1VTQUdFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9NQUNfQUNUSU9OX1JSTSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTUFDX0FDVElPTl9GQVNUX0JTU19UUk5TVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTUFDX0FDVElPTl9IVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTUFDX0FDVElPTl9TQV9RVUVSWSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTUFDX0FDVElPTl9QUk9UX0RVQUxfUFVCKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9NQUNfQUNUSU9OX1dOTSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTUFDX0FDVElPTl9VTlBST1RfV05NKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9NQUNfQUNUSU9OX1RETFMpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX01BQ19BQ0lUT05fTUVTSCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTUFDX0FDVElPTl9NSEYpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX01BQ19TRUxGX1BST1RFQ1RFRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTUFDX0FDVElPTl9XTUUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX01BQ19BQ1RJT05fVkhUKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCX0KK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfREVCVUcKKyNkZWZpbmUgTUFYX1AyUF9BQ1RJT05fRlJBTUVfVFlQRSA5Citjb25zdCBjaGFyICpwMnBfYWN0aW9uX2ZyYW1lX3R5cGVbXSA9IHsgIkdPIE5lZ290aWF0aW9uIFJlcXVlc3QiLAorCQkJCQkiR08gTmVnb3RpYXRpb24gUmVzcG9uc2UiLAorCQkJCQkiR08gTmVnb3RpYXRpb24gQ29uZmlybWF0aW9uIiwKKwkJCQkJIlAyUCBJbnZpdGF0aW9uIFJlcXVlc3QiLAorCQkJCQkiUDJQIEludml0YXRpb24gUmVzcG9uc2UiLAorCQkJCQkiRGV2aWNlIERpc2NvdmVyYWJpbGl0eSBSZXF1ZXN0IiwKKwkJCQkJIkRldmljZSBEaXNjb3ZlcmFiaWxpdHkgUmVzcG9uc2UiLAorCQkJCQkiUHJvdmlzaW9uIERpc2NvdmVyeSBSZXF1ZXN0IiwKKwkJCQkJIlByb3Zpc2lvbiBEaXNjb3ZlcnkgUmVzcG9uc2UifTsKKworLyogV2Ugbm8gbmVlZCB0byBwcm90ZWN0IHRoaXMgdmFyaWFibGUgc2luY2UKKyAqIHRoZXJlIGlzIG5vIGNoYW5jZSBvZiByYWNlIHRvIGNvbmRpdGlvbgorICogYW5kIGFsc28gbm90IG1ha2UgYW55IGNvbXBsaWNhdGluZyB0aGUgY29kZQorICoganVzdCBmb3IgZGVidWdnaW5nIGxvZworICovCit0UDJQQ29ubmVjdGlvblN0YXR1cyBnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID0gUDJQX05PVF9BQ1RJVkU7CisKKyNlbmRpZgorI2RlZmluZSBNQVhfVERMU19BQ1RJT05fRlJBTUVfVFlQRSAxMQorY29uc3QgY2hhciAqdGRsc19hY3Rpb25fZnJhbWVfdHlwZVtdID0geyAiVERMUyBTZXR1cCBSZXF1ZXN0IiwKKwkJCQkJICJURExTIFNldHVwIFJlc3BvbnNlIiwKKwkJCQkJICJURExTIFNldHVwIENvbmZpcm0iLAorCQkJCQkgIlRETFMgVGVhcmRvd24iLAorCQkJCQkgIlRETFMgUGVlciBUcmFmZmljIEluZGljYXRpb24iLAorCQkJCQkgIlRETFMgQ2hhbm5lbCBTd2l0Y2ggUmVxdWVzdCIsCisJCQkJCSAiVERMUyBDaGFubmVsIFN3aXRjaCBSZXNwb25zZSIsCisJCQkJCSAiVERMUyBQZWVyIFBTTSBSZXF1ZXN0IiwKKwkJCQkJICJURExTIFBlZXIgUFNNIFJlc3BvbnNlIiwKKwkJCQkJICJURExTIFBlZXIgVHJhZmZpYyBSZXNwb25zZSIsCisJCQkJCSAiVERMUyBEaXNjb3ZlcnkgUmVxdWVzdCJ9OworCitzdGF0aWMgYm9vbCB3bGFuX2hkZF9pc190eXBlX3AycF9hY3Rpb24oY29uc3QgdTggKmJ1ZikKK3sKKwljb25zdCB1OCAqb3VpUHRyOworCisJaWYgKGJ1ZltXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX0NBVEVHT1JZX09GRlNFVF0gIT0KKwkgICAgV0xBTl9IRERfUFVCTElDX0FDVElPTl9GUkFNRSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGJ1ZltXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX0FDVElPTl9PRkZTRVRdICE9CisJICAgIFdMQU5fSEREX1ZFTkRPUl9TUEVDSUZJQ19BQ1RJT04pIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCW91aVB0ciA9ICZidWZbV0xBTl9IRERfUFVCTElDX0FDVElPTl9GUkFNRV9PVUlfT0ZGU0VUXTsKKworCWlmIChXUEFfR0VUX0JFMjQob3VpUHRyKSAhPSBXTEFOX0hERF9XRkFfT1VJKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoYnVmW1dMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfT1VJX1RZUEVfT0ZGU0VUXSAhPQorCSAgICBXTEFOX0hERF9XRkFfUDJQX09VSV9UWVBFKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgaGRkX3AycF9pc19hY3Rpb25fdHlwZV9yc3AoY29uc3QgdTggKmJ1ZikKK3sKKwl0QWN0aW9uRnJtVHlwZSBhY3Rpb25Gcm1UeXBlOworCisJaWYgKHdsYW5faGRkX2lzX3R5cGVfcDJwX2FjdGlvbihidWYpKSB7CisJCWFjdGlvbkZybVR5cGUgPQorCQkJYnVmW1dMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfU1VCX1RZUEVfT0ZGU0VUXTsKKwkJaWYgKGFjdGlvbkZybVR5cGUgIT0gV0xBTl9IRERfSU5WSVRBVElPTl9SRVEKKwkJICAgICYmIGFjdGlvbkZybVR5cGUgIT0gV0xBTl9IRERfR09fTkVHX1JFUQorCQkgICAgJiYgYWN0aW9uRnJtVHlwZSAhPSBXTEFOX0hERF9ERVZfRElTX1JFUQorCQkgICAgJiYgYWN0aW9uRnJtVHlwZSAhPSBXTEFOX0hERF9QUk9WX0RJU19SRVEpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYworQ0RGX1NUQVRVUyB3bGFuX2hkZF9yZW1haW5fb25fY2hhbm5lbF9jYWxsYmFjayh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnBDdHgsCisJCQlDREZfU1RBVFVTIHN0YXR1cywgdWludDMyX3Qgc2Nhbl9pZCkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IChoZGRfYWRhcHRlcl90ICopIHBDdHg7CisJaGRkX2NmZzgwMjExX3N0YXRlX3QgKmNmZ1N0YXRlID0gV0xBTl9IRERfR0VUX0NGR19TVEFURV9QVFIocEFkYXB0ZXIpOworCWhkZF9yZW1haW5fb25fY2hhbl9jdHhfdCAqcFJlbWFpbkNoYW5DdHg7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisJaWYgKCFoZGRfY3R4KSB7CisJCWhkZF9lcnIoIkludmFsaWQgSEREIGNvbnRleHQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCW11dGV4X2xvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJcFJlbWFpbkNoYW5DdHggPSBjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4OworCisJaWYgKHBSZW1haW5DaGFuQ3R4ID09IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCQloZGRMb2coTE9HVywKKwkJICAgICAgICIlczogTm8gUmVtIG9uIGNoYW5uZWwgcGVuZGluZyBmb3Igd2hpY2ggUnNwIGlzIHJlY2VpdmVkIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwloZGRMb2coTE9HMSwgIlJlY2VpdmVkIHJlbWFpbiBvbiBjaGFubmVsIHJzcCIpOworCWNkZl9tY190aW1lcl9zdG9wKCZwUmVtYWluQ2hhbkN0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyKTsKKwljZGZfbWNfdGltZXJfZGVzdHJveSgmcFJlbWFpbkNoYW5DdHgtPmhkZF9yZW1haW5fb25fY2hhbl90aW1lcik7CisKKwljZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4ID0gTlVMTDsKKwkvKgorCSAqIFJlc2V0dGluZyB0aGUgcm9jIGluIHByb2dyZXNzIGVhcmx5IGVuc3VyZXMgdGhhdCB0aGUgc3Vic2VxdWVudAorCSAqIHJvYyByZXF1ZXN0cyBhcmUgaW1tZWRpYXRlbHkgcHJvY2Vzc2VkIHdpdGhvdXQgYmVpbmcgcXVldWVkCisJICovCisJcEFkYXB0ZXItPmlzX3JvY19pbnByb2dyZXNzID0gZmFsc2U7CisJLyoKKwkgKiBJZiB0aGUgYWxsb3cgc3VzcGVuZCBpcyBkb25lIGxhdGVyLCB0aGUgc2NoZWR1bGVkIHJvYyB3aWwgcHJldmVudAorCSAqIHRoZSBzeXN0ZW0gZnJvbSBnb2luZyBpbnRvIHN1c3BlbmQgYW5kIGltbWVkaWF0ZWx5IHRoaXMgbG9naWMKKwkgKiB3aWxsIGFsbG93IHRoZSBzeXN0ZW0gdG8gZ28gdG8gc3VzcGVuZCBicmVha2luZyB0aGUgZXhpc2luZyBsb2dpYy4KKwkgKiBCYXNpY2FsbHksIHRoZSBzeXN0ZW0gbXVzdCBub3QgZ28gaW50byBzdXNwZW5kIHdoaWxlIHJvYyBpcyBpbgorCSAqIHByb2dyZXNzLgorCSAqLworCWhkZF9hbGxvd19zdXNwZW5kKFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfUk9DKTsKKwltdXRleF91bmxvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisKKwlpZiAoUkVNQUlOX09OX0NIQU5ORUxfUkVRVUVTVCA9PSBwUmVtYWluQ2hhbkN0eC0+cmVtX29uX2NoYW5fcmVxdWVzdCkgeworCQlpZiAoY2ZnU3RhdGUtPmJ1ZikgeworCQkJaGRkTG9nKExPR1AsCisJCQkgICAgICAgIiVzOiBXZSBuZWVkIHRvIHJlY2VpdmUgeWV0IGFuIGFjayBmcm9tIG9uZSBvZiB0eCBwYWNrZXQiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJfQorCQljZmc4MDIxMV9yZW1haW5fb25fY2hhbm5lbF9leHBpcmVkKAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJCQlwUmVtYWluQ2hhbkN0eC0+ZGV2LT4KKwkJCWllZWU4MDIxMV9wdHIsCisjZWxzZQorCQkJcFJlbWFpbkNoYW5DdHgtPmRldiwKKyNlbmRpZgorCQkJcFJlbWFpbkNoYW5DdHgtPgorCQkJY29va2llLAorCQkJJnBSZW1haW5DaGFuQ3R4LT5jaGFuLAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA4LCAwKSkKKwkJCXBSZW1haW5DaGFuQ3R4LT4KKwkJCWNoYW5fdHlwZSwKKyNlbmRpZgorCQkJR0ZQX0tFUk5FTCk7CisJCXBBZGFwdGVyLT5sYXN0X3JvY190cyA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKKwl9CisKKwkvKiBTY2hlZHVsZSBhbnkgcGVuZGluZyBSb0M6IEFueSBuZXcgcm9jIHJlcXVlc3QgZHVyaW5nIHRoaXMgdGltZQorCSAqIHdvdWxkIGhhdmUgZ290IHF1ZXVlZCBpbiAnd2xhbl9oZGRfcmVxdWVzdF9yZW1haW5fb25fY2hhbm5lbCcKKwkgKiBzaW5jZSB0aGUgcXVldWUgaXMgbm90IGVtcHR5LiBTbywgdGhlIHJvYyBhdCB0aGUgaGVhZCBvZiB0aGUKKwkgKiBxdWV1ZSB3aWxsIG9ubHkgZ2V0IHRoZSBwcmlvcml0eS4gU2NoZWR1bGluZyB0aGUgd29yayBxdWV1ZQorCSAqIGFmdGVyIHNlbmRpbmcgYW55IGNhbmNlbCByZW1haW4gb24gY2hhbm5lbCBldmVudCB3aWxsIGFsc28KKwkgKiBlbnN1cmUgdGhhdCB0aGUgY2FuY2VsIHJvYyBpcyBzZW50IHdpdGhvdXQgYW55IGRlbGF5cy4KKwkgKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmhkZF9jdHgtPnJvY19yZXFfd29yaywgMCk7CisKKwlpZiAoKFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSB8fAorCSAgICAoV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJICAgIChXTEFOX0hERF9QMlBfREVWSUNFID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkKKwkgICAgKSB7CisJCXVpbnQ4X3Qgc2Vzc2lvbklkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsKKwkJaWYgKFJFTUFJTl9PTl9DSEFOTkVMX1JFUVVFU1QgPT0KKwkJICAgIHBSZW1haW5DaGFuQ3R4LT5yZW1fb25fY2hhbl9yZXF1ZXN0KSB7CisJCQlzbWVfZGVyZWdpc3Rlcl9tZ210X2ZyYW1lKGhIYWwsIHNlc3Npb25JZCwKKwkJCQkJCSAgKFNJUl9NQUNfTUdNVF9GUkFNRSA8PCAyKSB8CisJCQkJCQkgIChTSVJfTUFDX01HTVRfUFJPQkVfUkVRIDw8IDQpLAorCQkJCQkJICBOVUxMLCAwKTsKKwkJfQorCX0gZWxzZSBpZiAoKFdMQU5fSEREX1NPRlRBUCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJCSAgIChXTEFOX0hERF9QMlBfR08gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorCQkgICApIHsKKwkJd2xhbnNhcF9kZV9yZWdpc3Rlcl9tZ210X2ZyYW1lKAorI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJCVdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUgorCQkJCShwQWRhcHRlciksCisjZWxzZQorCQkJKFdMQU5fSEREX0dFVF9DVFgKKwkJCQkgKHBBZGFwdGVyKSktPnBjZHNfY29udGV4dCwKKyNlbmRpZgorCQkJKFNJUl9NQUNfTUdNVF9GUkFNRSA8PCAyKSB8CisJCQkoU0lSX01BQ19NR01UX1BST0JFX1JFUSA8PAorCQkJIDQpLCBOVUxMLCAwKTsKKworCX0KKworCWlmIChwUmVtYWluQ2hhbkN0eC0+YWN0aW9uX3BrdF9idWZmLmZyYW1lX3B0ciAhPSBOVUxMCisJICAgICYmIHBSZW1haW5DaGFuQ3R4LT5hY3Rpb25fcGt0X2J1ZmYuZnJhbWVfbGVuZ3RoICE9IDApIHsKKwkJY2RmX21lbV9mcmVlKHBSZW1haW5DaGFuQ3R4LT5hY3Rpb25fcGt0X2J1ZmYuZnJhbWVfcHRyKTsKKwkJcFJlbWFpbkNoYW5DdHgtPmFjdGlvbl9wa3RfYnVmZi5mcmFtZV9wdHIgPSBOVUxMOworCQlwUmVtYWluQ2hhbkN0eC0+YWN0aW9uX3BrdF9idWZmLmZyYW1lX2xlbmd0aCA9IDA7CisJfQorCWNkZl9tZW1fZnJlZShwUmVtYWluQ2hhbkN0eCk7CisJY29tcGxldGUoJnBBZGFwdGVyLT5jYW5jZWxfcmVtX29uX2NoYW5fdmFyKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKwkJY29tcGxldGUoJnBBZGFwdGVyLT5yZW1fb25fY2hhbl9yZWFkeV9ldmVudCk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCB3bGFuX2hkZF9jYW5jZWxfZXhpc3RpbmdfcmVtYWluX29uX2NoYW5uZWwoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJaGRkX2NmZzgwMjExX3N0YXRlX3QgKmNmZ1N0YXRlID0gV0xBTl9IRERfR0VUX0NGR19TVEFURV9QVFIocEFkYXB0ZXIpOworCWhkZF9yZW1haW5fb25fY2hhbl9jdHhfdCAqcFJlbWFpbkNoYW5DdHg7CisJdW5zaWduZWQgbG9uZyByYzsKKworCW11dGV4X2xvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJaWYgKGNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHggIT0gTlVMTCkgeworCQloZGRMb2coTE9HRSwgIkNhbmNlbCBFeGlzdGluZyBSZW1haW4gb24gQ2hhbm5lbCIpOworCisJCWlmIChDREZfVElNRVJfU1RBVEVfUlVOTklORyA9PSBjZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoCisgICAgICAgICAgICAgICAgICAgICZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4LT5oZGRfcmVtYWluX29uX2NoYW5fdGltZXIpKQorCQkJY2RmX21jX3RpbWVyX3N0b3AoJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHgtPgorCQkJCQkgIGhkZF9yZW1haW5fb25fY2hhbl90aW1lcik7CisKKwkJcFJlbWFpbkNoYW5DdHggPSBjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4OworCQlpZiAocFJlbWFpbkNoYW5DdHgtPmhkZF9yZW1haW5fb25fY2hhbl9jYW5jZWxfaW5fcHJvZ3Jlc3MgPT0KKwkJICAgIHRydWUpIHsKKwkJCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICJST0MgdGltZXIgY2FuY2VsbGF0aW9uIGluIHByb2dyZXNzLCIKKwkJCSAgICAgICAiIHdhaXQgZm9yIGNvbXBsZXRpb24iKTsKKwkJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwQWRhcHRlci0+CisJCQkJCQkJIGNhbmNlbF9yZW1fb25fY2hhbl92YXIsCisJCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCQkJIChXQUlUX0NBTkNFTF9SRU1fQ0hBTikpOworCQkJaWYgKCFyYykgeworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICAiJXM6d2FpdCBvbiBjYW5jZWxfcmVtX29uX2NoYW5fdmFyIHRpbWVkIG91dCIsCisJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQlwUmVtYWluQ2hhbkN0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX2NhbmNlbF9pbl9wcm9ncmVzcyA9IHRydWU7CisJCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwkJLyogV2FpdCB0aWxsIHJlbWFpbiBvbiBjaGFubmVsIHJlYWR5IGluZGljYXRpb24gYmVmb3JlIGlzc3VpbmcgY2FuY2VsCisJCSAqIHJlbWFpbiBvbiBjaGFubmVsIHJlcXVlc3QsIG90aGVyd2lzZSBpZiByZW1haW4gb24gY2hhbm5lbCBub3QKKwkJICogcmVjZWl2ZWQgYW5kIGlmIHRoZSBkcml2ZXIgaXNzdWVzIGNhbmNlbCByZW1haW4gb24gY2hhbm5lbCB0aGVuIGxpbQorCQkgKiB3aWxsIGJlIGluIHVua25vd24gc3RhdGUuCisJCSAqLworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcEFkYXB0ZXItPgorCQkJCQkJIHJlbV9vbl9jaGFuX3JlYWR5X2V2ZW50LAorCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCQkgKFdBSVRfUkVNX0NIQU5fUkVBRFkpKTsKKwkJaWYgKCFyYykgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIHJlbWFpbiBvbiBjaGFubmVsIHJlYWR5IGluZGljYXRpb24iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJfQorCisJCUlOSVRfQ09NUExFVElPTihwQWRhcHRlci0+Y2FuY2VsX3JlbV9vbl9jaGFuX3Zhcik7CisKKwkJLyogSXNzdWUgYWJvcnQgcmVtYWluIG9uIGNoYW4gcmVxdWVzdCB0byBzbWUuCisJCSAqIFRoZSByZW1haW4gb24gY2hhbm5lbCBjYWxsYmFjayB3aWxsIG1ha2Ugc3VyZSB0aGUgcmVtYWluX29uX2NoYW4KKwkJICogZXhwaXJlZCBldmVudCBpcyBzZW50LgorCQkgKi8KKwkJaWYgKChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkJICAgIChXTEFOX0hERF9QMlBfQ0xJRU5UID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkJICAgIChXTEFOX0hERF9QMlBfREVWSUNFID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkKKwkJICAgICkgeworCQkJc21lX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbChXTEFOX0hERF9HRVRfSEFMX0NUWAorCQkJCQkJCSAgICAgKHBBZGFwdGVyKSwKKwkJCQlwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCXBSZW1haW5DaGFuQ3R4LT5zY2FuX2lkKTsKKwkJfSBlbHNlIGlmICgoV0xBTl9IRERfU09GVEFQID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkKKwkJCSAgIHx8IChXTEFOX0hERF9QMlBfR08gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorCQkJICAgKSB7CisJCQl3bGFuc2FwX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbCgKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJCQkJV0xBTl9IRERfR0VUX1NBUF9DVFhfUFRSCisJCQkJCShwQWRhcHRlciksCisjZWxzZQorCQkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cGNkc19jb250ZXh0LAorI2VuZGlmCisJCQlwUmVtYWluQ2hhbkN0eC0+c2Nhbl9pZCk7CisJCX0KKworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcEFkYXB0ZXItPgorCQkJCQkJIGNhbmNlbF9yZW1fb25fY2hhbl92YXIsCisJCQkJCQkgbXNlY3NfdG9famlmZmllcworCQkJCQkJCSAoV0FJVF9DQU5DRUxfUkVNX0NIQU4pKTsKKworCQlpZiAoIXJjKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgY2FuY2VsIHJlbWFpbiBvbiBjaGFubmVsIHJlYWR5IgorCQkJICAgICAgICIgaW5kaWNhdGlvbiIsIF9fZnVuY19fKTsKKwkJfQorCQloZGRfYWxsb3dfc3VzcGVuZChXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1JPQyk7CisJfSBlbHNlCisJCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKK30KKworaW50IHdsYW5faGRkX2NoZWNrX3JlbWFpbl9vbl9jaGFubmVsKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWludCBzdGF0dXMgPSAwOworCWhkZF9jZmc4MDIxMV9zdGF0ZV90ICpjZmdTdGF0ZSA9IFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKworCWlmIChXTEFOX0hERF9QMlBfR08gIT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSB7CisJCS8qIENhbmNlbCBFeGlzdGluZyBSZW1haW4gT24gQ2hhbm5lbCAqLworCQkvKiBJZiBubyBhY3Rpb24gZnJhbWUgaXMgcGVuZGluZyAqLworCQlpZiAoY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eCAhPSBOVUxMKSB7CisJCQkvKiBDaGVjayB3aGV0aGVyIEFjdGlvbiBGcmFtZSBpcyBwZW5kaW5nIG9yIG5vdCAqLworCQkJaWYgKGNmZ1N0YXRlLT5idWYgPT0gTlVMTCkgeworCQkJCXdsYW5faGRkX2NhbmNlbF9leGlzdGluZ19yZW1haW5fb25fY2hhbm5lbAorCQkJCQkocEFkYXB0ZXIpOworCQkJfSBlbHNlIHsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgIkNhbm5vdCBDYW5jZWwgRXhpc3RpbmcgUmVtYWluIG9uIENoYW5uZWwiKTsKKwkJCQlzdGF0dXMgPSAtRUJVU1k7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jYW5jZWxfcGVuZGluZ19yb2MoKSAtIENhbmNlbCBwZW5kaW5nIHJvYworICogQGFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKgorICogQ2FuY2VscyBhbnkgcGVuZGluZyByZW1haW4gb24gY2hhbm5lbCByZXF1ZXN0CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd2xhbl9oZGRfY2FuY2VsX3BlbmRpbmdfcm9jKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJaGRkX3JlbWFpbl9vbl9jaGFuX2N0eF90ICpyb2NfY3R4OworCXVuc2lnbmVkIGxvbmcgcmM7CisJaGRkX2NmZzgwMjExX3N0YXRlX3QgKmNmZ19zdGF0ZSA9IFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKGFkYXB0ZXIpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiJXM6IFJPQyBjb21wbGV0aW9uIGlzIG5vdCByZWNlaXZlZC4hISEiLAorCQkJX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmY2ZnX3N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJcm9jX2N0eCA9IGNmZ19zdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4OworCisJaWYgKHJvY19jdHgtPmhkZF9yZW1haW5fb25fY2hhbl9jYW5jZWxfaW5fcHJvZ3Jlc3MpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjZmdfc3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwkJaGRkX2RlYnVnKCJyb2MgY2FuY2VsIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKKwkJLyoKKwkJICogU2luY2UgYSBjYW5jZWwgcm9jIGlzIGFscmVhZHkgaXNzdWVkIGFuZCBpcworCQkgKiBpbiBwcm9ncmVzcywgd2UgbmVlZCBub3Qgc2VuZCBhbm90aGVyCisJCSAqIGNhbmNlbCByb2MgYWdhaW4uIEluc3RlYWQgd2UgY2FuIGp1c3Qgd2FpdAorCQkgKiBmb3IgY2FuY2VsIHJvYyBjb21wbGV0aW9uCisJCSAqLworCQlnb3RvIHdhaXQ7CisJfQorCW11dGV4X3VubG9jaygmY2ZnX3N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisKKwlpZiAoYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKSB7CisJCXdsYW5zYXBfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKChXTEFOX0hERF9HRVRfQ1RYCisJCQkJCShhZGFwdGVyKSktPnBjZHNfY29udGV4dCwKKwkJCQkJY2ZnX3N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHgtPnNjYW5faWQpOworCX0gZWxzZSBpZiAoYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0NMSUVOVAorCQkJfHwgYWRhcHRlci0+ZGV2aWNlX21vZGUgPT0KKwkJCVdMQU5fSEREX1AyUF9ERVZJQ0UpIHsKKwkJc21lX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbChXTEFOX0hERF9HRVRfSEFMX0NUWAorCQkJCShhZGFwdGVyKSwKKwkJCQlhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJY2ZnX3N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHgtPnNjYW5faWQpOworCX0KKword2FpdDoKKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYWRhcHRlci0+Y2FuY2VsX3JlbV9vbl9jaGFuX3ZhciwKKwkJCW1zZWNzX3RvX2ppZmZpZXMKKwkJCShXQUlUX0NBTkNFTF9SRU1fQ0hBTikpOworCWlmICghcmMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkgICAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgIiVzOiBUaW1lb3V0IG9jY3VycmVkIHdoaWxlIHdhaXRpbmcgZm9yIFJvQyBDYW5jZWxsYXRpb24iLAorCQkgICAgX19mdW5jX18pOworCQltdXRleF9sb2NrKCZjZmdfc3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwkJcm9jX2N0eCA9IGNmZ19zdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4OworCQlpZiAocm9jX2N0eCAhPSBOVUxMKSB7CisJCQljZmdfc3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eCA9IE5VTEw7CisJCQljZGZfbWNfdGltZXJfc3RvcCgmcm9jX2N0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyKTsKKwkJCWNkZl9tY190aW1lcl9kZXN0cm95KAorCQkJCQkmcm9jX2N0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyKTsKKwkJCWlmIChyb2NfY3R4LT5hY3Rpb25fcGt0X2J1ZmYuZnJhbWVfcHRyICE9IE5VTEwKKwkJCQkmJiByb2NfY3R4LT5hY3Rpb25fcGt0X2J1ZmYuZnJhbWVfbGVuZ3RoICE9IDApIHsKKwkJCQljZGZfbWVtX2ZyZWUoCisJCQkJCXJvY19jdHgtPmFjdGlvbl9wa3RfYnVmZi5mcmFtZV9wdHIpOworCQkJCXJvY19jdHgtPmFjdGlvbl9wa3RfYnVmZi5mcmFtZV9wdHIgPSBOVUxMOworCQkJCXJvY19jdHgtPmFjdGlvbl9wa3RfYnVmZi5mcmFtZV9sZW5ndGggPSAwOworCQkJfQorCQkJY2RmX21lbV9mcmVlKHJvY19jdHgpOworCQkJYWRhcHRlci0+aXNfcm9jX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKwkJfQorCQltdXRleF91bmxvY2soJmNmZ19zdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCX0KK30KKworLyogQ2xlYW4gdXAgUm9DIGNvbnRleHQgYXQgaGRkX3N0b3BfYWRhcHRlciovCit2b2lkIHdsYW5faGRkX2NsZWFudXBfcmVtYWluX29uX2NoYW5uZWxfY3R4KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXVpbnQ4X3QgcmV0cnkgPSAwOworCWhkZF9jZmc4MDIxMV9zdGF0ZV90ICpjZmdTdGF0ZSA9IFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKworCW11dGV4X2xvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJd2hpbGUgKHBBZGFwdGVyLT5pc19yb2NfaW5wcm9ncmVzcykgeworCQltdXRleF91bmxvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFJPQyBpbiBwcm9ncmVzcyBmb3Igc2Vzc2lvbiAlZCEhISIsCisJCQkgIF9fZnVuY19fLCBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJbXNsZWVwKDUwMCk7CisJCWlmIChyZXRyeSsrID4gMykgeworCQkJd2xhbl9oZGRfY2FuY2VsX3BlbmRpbmdfcm9jKHBBZGFwdGVyKTsKKwkJCS8qIGhvbGQgdGhlIGxvY2sgYmVmb3JlIGJyZWFrIGZyb20gdGhlIGxvb3AgKi8KKwkJCW11dGV4X2xvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJCQlicmVhazsKKwkJfQorCQltdXRleF9sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCX0gLyogZW5kIG9mIHdoaWxlICovCisJbXV0ZXhfdW5sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCit9CisKK3ZvaWQgd2xhbl9oZGRfcmVtYWluX29uX2NoYW5fdGltZW91dCh2b2lkICpkYXRhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QgKikgZGF0YTsKKwloZGRfcmVtYWluX29uX2NoYW5fY3R4X3QgKnBSZW1haW5DaGFuQ3R4OworCWhkZF9jZmc4MDIxMV9zdGF0ZV90ICpjZmdTdGF0ZTsKKworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCWhkZExvZyhMT0dFLCAiJXM6IHBBZGFwdGVyIGlzIE5VTEwgISEhIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJY2ZnU3RhdGUgPSBXTEFOX0hERF9HRVRfQ0ZHX1NUQVRFX1BUUihwQWRhcHRlcik7CisJbXV0ZXhfbG9jaygmY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwlwUmVtYWluQ2hhbkN0eCA9IGNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHg7CisKKwlpZiAoTlVMTCA9PSBwUmVtYWluQ2hhbkN0eCkgeworCQltdXRleF91bmxvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJCWhkZExvZyhMT0dFLCAiJXM6IE5vIFJlbWFpbiBvbiBjaGFubmVsIGlzIHBlbmRpbmciLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHJ1ZSA9PSBwUmVtYWluQ2hhbkN0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX2NhbmNlbF9pbl9wcm9ncmVzcykgeworCQltdXRleF91bmxvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJCWhkZExvZyhMT0dFLCBGTCgiQ2FuY2VsbGF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKSk7CisJCXJldHVybjsKKwl9CisKKwlwUmVtYWluQ2hhbkN0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX2NhbmNlbF9pbl9wcm9ncmVzcyA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCWhkZExvZyhMT0cxLCAiJXM6IENhbmNlbCBSZW1haW4gb24gQ2hhbm5lbCBvbiB0aW1lb3V0IiwgX19mdW5jX18pOworCisJaWYgKChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkgICAgKFdMQU5fSEREX1AyUF9DTElFTlQgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSB8fAorCSAgICAoV0xBTl9IRERfUDJQX0RFVklDRSA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpCisJICAgICkgeworCQlzbWVfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQlwUmVtYWluQ2hhbkN0eC0+c2Nhbl9pZCk7CisJfSBlbHNlIGlmICgoV0xBTl9IRERfU09GVEFQID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkJICAgKFdMQU5fSEREX1AyUF9HTyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpCisJCSAgICkgeworCQl3bGFuc2FwX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbCgKKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnBjZHNfY29udGV4dCwKKwkJCXBSZW1haW5DaGFuQ3R4LT5zY2FuX2lkKTsKKwl9CisKKwloZGRfYWxsb3dfc3VzcGVuZChXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1JPQyk7CisKK30KKworc3RhdGljIGludCB3bGFuX2hkZF9leGVjdXRlX3JlbWFpbl9vbl9jaGFubmVsKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkgICAgICBoZGRfcmVtYWluX29uX2NoYW5fY3R4X3QgKnBSZW1haW5DaGFuQ3R4KQoreworCWhkZF9jZmc4MDIxMV9zdGF0ZV90ICpjZmdTdGF0ZSA9IFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXJfdGVtcDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlib29sIGlzR29QcmVzZW50ID0gZmFsc2U7CisJdW5zaWduZWQgaW50IGR1cmF0aW9uOworCisKKwltdXRleF9sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCWlmIChwQWRhcHRlci0+aXNfcm9jX2lucHJvZ3Jlc3MgPT0gdHJ1ZSkgeworCQltdXRleF91bmxvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgicmVtYWluIG9uIGNoYW5uZWwgcmVxdWVzdCBpcyBpbiBleGVjdXRpb24iKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eCA9IHBSZW1haW5DaGFuQ3R4OworCWNmZ1N0YXRlLT5jdXJyZW50X2ZyZXEgPSBwUmVtYWluQ2hhbkN0eC0+Y2hhbi5jZW50ZXJfZnJlcTsKKwlwQWRhcHRlci0+aXNfcm9jX2lucHJvZ3Jlc3MgPSB0cnVlOworCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKworCS8qIEluaXRpYWxpemUgUmVtYWluIG9uIGNoYW4gdGltZXIgKi8KKwljZGZfc3RhdHVzID0KKwkJY2RmX21jX3RpbWVyX2luaXQoJnBSZW1haW5DaGFuQ3R4LT5oZGRfcmVtYWluX29uX2NoYW5fdGltZXIsCisJCQkJICBDREZfVElNRVJfVFlQRV9TVywKKwkJCQkgIHdsYW5faGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVvdXQsIHBBZGFwdGVyKTsKKwlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJOb3QgYWJsZSB0byBpbml0aWFsaXplIHJlbWFpbl9vbl9jaGFuIHRpbWVyIikpOworCQltdXRleF9sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCQljZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4ID0gTlVMTDsKKwkJcEFkYXB0ZXItPmlzX3JvY19pbnByb2dyZXNzID0gZmFsc2U7CisJCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwkJY2RmX21lbV9mcmVlKHBSZW1haW5DaGFuQ3R4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKHBIZGRDdHgsICZwQWRhcHRlck5vZGUpOworCXdoaWxlIChOVUxMICE9IHBBZGFwdGVyTm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCXBBZGFwdGVyX3RlbXAgPSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyOworCQlpZiAocEFkYXB0ZXJfdGVtcC0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKSB7CisJCQlpc0dvUHJlc2VudCA9IHRydWU7CisJCX0KKwkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIocEhkZEN0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQpOworCQlwQWRhcHRlck5vZGUgPSBwTmV4dDsKKwl9CisKKwkvKiBFeHRlbmRpbmcgZHVyYXRpb24gZm9yIHByb2FjdGl2ZSBleHRlbnNpb24gbG9naWMgZm9yIFJvQyAqLworCWR1cmF0aW9uID0gcFJlbWFpbkNoYW5DdHgtPmR1cmF0aW9uOworCWlmIChpc0dvUHJlc2VudCA9PSB0cnVlKQorCQlkdXJhdGlvbiA9IFAyUF9ST0NfRFVSQVRJT05fTVVMVElQTElFUl9HT19QUkVTRU5UICogZHVyYXRpb247CisJZWxzZQorCQlkdXJhdGlvbiA9IFAyUF9ST0NfRFVSQVRJT05fTVVMVElQTElFUl9HT19BQlNFTlQgKiBkdXJhdGlvbjsKKworCWhkZF9wcmV2ZW50X3N1c3BlbmQoV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19ST0MpOworCUlOSVRfQ09NUExFVElPTihwQWRhcHRlci0+cmVtX29uX2NoYW5fcmVhZHlfZXZlbnQpOworCisJLyogY2FsbCBzbWUgQVBJIHRvIHN0YXJ0IHJlbWFpbiBvbiBjaGFubmVsLiAqLworCWlmICgoV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJICAgIChXTEFOX0hERF9QMlBfQ0xJRU5UID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkgICAgKFdMQU5fSEREX1AyUF9ERVZJQ0UgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorCSAgICApIHsKKwkJdWludDhfdCBzZXNzaW9uSWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCQkvKiBjYWxsIHNtZSBBUEkgdG8gc3RhcnQgcmVtYWluIG9uIGNoYW5uZWwuICovCisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzbWVfcmVtYWluX29uX2NoYW5uZWwoCisJCQkJV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCXNlc3Npb25JZCwKKwkJCQlwUmVtYWluQ2hhbkN0eC0+Y2hhbi5od192YWx1ZSwgZHVyYXRpb24sCisJCQkJd2xhbl9oZGRfcmVtYWluX29uX2NoYW5uZWxfY2FsbGJhY2ssCisJCQkJcEFkYXB0ZXIsCisJCQkJKHBSZW1haW5DaGFuQ3R4LT5yZW1fb25fY2hhbl9yZXF1ZXN0ID09CisJCQkJIFJFTUFJTl9PTl9DSEFOTkVMX1JFUVVFU1QpID8gdHJ1ZSA6IGZhbHNlLAorCQkJCSAmcFJlbWFpbkNoYW5DdHgtPnNjYW5faWQpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoInNtZV9yZW1haW5fb25fY2hhbm5lbCBmYWlsZWQiKSk7CisJCQltdXRleF9sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCQkJY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eCA9IE5VTEw7CisJCQlwQWRhcHRlci0+aXNfcm9jX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKwkJCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwkJCWNkZl9tY190aW1lcl9kZXN0cm95KAorCQkJCSZwUmVtYWluQ2hhbkN0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyKTsKKwkJCWNkZl9tZW1fZnJlZShwUmVtYWluQ2hhbkN0eCk7CisJCQloZGRfYWxsb3dfc3VzcGVuZChXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1JPQyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChSRU1BSU5fT05fQ0hBTk5FTF9SRVFVRVNUID09CisJCSAgICBwUmVtYWluQ2hhbkN0eC0+cmVtX29uX2NoYW5fcmVxdWVzdCkgeworCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzbWVfcmVnaXN0ZXJfbWdtdF9mcmFtZSgKKwkJCQkJCVdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJCXNlc3Npb25JZCwKKwkJCQkJCShTSVJfTUFDX01HTVRfRlJBTUUgPDwgMikgfAorCQkJCQkJKFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEgPDwgNCksCisJCQkJCQlOVUxMLCAwKSkKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJRkwoInNtZV9yZWdpc3Rlcl9tZ210X2ZyYW1lIGZhaWxlZCIpKTsKKwkJfQorCisJfSBlbHNlIGlmICgoV0xBTl9IRERfU09GVEFQID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkJICAgKFdMQU5fSEREX1AyUF9HTyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpKSB7CisJCS8qIGNhbGwgc21lIEFQSSB0byBzdGFydCByZW1haW4gb24gY2hhbm5lbC4gKi8KKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSB3bGFuc2FwX3JlbWFpbl9vbl9jaGFubmVsKAorI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJCSAgICBXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIocEFkYXB0ZXIpLAorI2Vsc2UKKwkJCSAgICAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wY2RzX2NvbnRleHQsCisjZW5kaWYKKwkJCSAgICBwUmVtYWluQ2hhbkN0eC0+Y2hhbi5od192YWx1ZSwKKwkJCSAgICBkdXJhdGlvbiwgd2xhbl9oZGRfcmVtYWluX29uX2NoYW5uZWxfY2FsbGJhY2ssCisJCQkgICAgcEFkYXB0ZXIsICZwUmVtYWluQ2hhbkN0eC0+c2Nhbl9pZCkpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgid2xhbnNhcF9yZW1haW5fb25fY2hhbm5lbCBmYWlsZWQiKSk7CisJCQltdXRleF9sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCQkJY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eCA9IE5VTEw7CisJCQlwQWRhcHRlci0+aXNfcm9jX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKwkJCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwkJCWNkZl9tY190aW1lcl9kZXN0cm95KAorCQkJCSZwUmVtYWluQ2hhbkN0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyKTsKKwkJCWNkZl9tZW1fZnJlZShwUmVtYWluQ2hhbkN0eCk7CisJCQloZGRfYWxsb3dfc3VzcGVuZChXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1JPQyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gd2xhbnNhcF9yZWdpc3Rlcl9tZ210X2ZyYW1lKAorI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJCSAgICBXTEFOX0hERF9HRVRfU0FQX0NUWF9QVFIocEFkYXB0ZXIpLAorI2Vsc2UKKwkJCSAgICAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wY2RzX2NvbnRleHQsCisjZW5kaWYKKwkJCShTSVJfTUFDX01HTVRfRlJBTUUgPDwgMikgfAorCQkJKFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEgPDwgNCksIE5VTEwsIDApKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgid2xhbnNhcF9yZWdpc3Rlcl9tZ210X2ZyYW1lIHJldHVybiBmYWlsIikpOworCQkJd2xhbnNhcF9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwoCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQkJCVdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUihwQWRhcHRlciksCisjZWxzZQorCQkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnBjZHNfY29udGV4dCwKKyNlbmRpZgorCQkJcFJlbWFpbkNoYW5DdHgtPnNjYW5faWQpOworCQkJaGRkX2FsbG93X3N1c3BlbmQoV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19ST0MpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9yb2NfcmVxdWVzdF9lbnF1ZXVlKCkgLSBlbnF1ZXVlIHJlbWFpbiBvbiBjaGFubmVsIHJlcXVlc3QKKyAqIEBhZGFwdGVyOiBQb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKiBAcmVtYWluX2NoYW5fY3R4OiBQb2ludGVyIHRvIHRoZSByZW1haW4gb24gY2hhbm5lbCBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9yb2NfcmVxdWVzdF9lbnF1ZXVlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQloZGRfcmVtYWluX29uX2NoYW5fY3R4X3QgKnJlbWFpbl9jaGFuX2N0eCkKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwloZGRfcm9jX3JlcV90ICpoZGRfcm9jX3JlcTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCS8qCisJICogIkRyaXZlciBpcyBidXN5IiBPUiAidGhlcmUgaXMgYWxyZWFkeSBSb0MgcmVxdWVzdCBpbnNpZGUgdGhlIHF1ZXVlIgorCSAqIHNvIGVucXVldWUgdGhpcyBSb0MgUmVxdWVzdCBhbmQgZXhlY3V0ZSBzZXF1ZW50aWFsbHkgbGF0ZXIuCisJICovCisKKwloZGRfcm9jX3JlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqaGRkX3JvY19yZXEpKTsKKworCWlmIChOVUxMID09IGhkZF9yb2NfcmVxKSB7CisJCWhkZExvZyhMT0dQLCBGTCgibWFsbG9jIGZhaWxlZCBmb3Igcm9jIHJlcSBjb250ZXh0IikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwloZGRfcm9jX3JlcS0+cEFkYXB0ZXIgPSBhZGFwdGVyOworCWhkZF9yb2NfcmVxLT5wUmVtYWluQ2hhbkN0eCA9IHJlbWFpbl9jaGFuX2N0eDsKKworCS8qIEVucXVldWUgdGhpcyBSb0MgcmVxdWVzdCAqLworCWNkZl9zcGluX2xvY2soJmhkZF9jdHgtPmhkZF9yb2NfcmVxX3FfbG9jayk7CisJc3RhdHVzID0gY2RmX2xpc3RfaW5zZXJ0X2JhY2soJmhkZF9jdHgtPmhkZF9yb2NfcmVxX3EsCisJCQkJCSZoZGRfcm9jX3JlcS0+bm9kZSk7CisJY2RmX3NwaW5fdW5sb2NrKCZoZGRfY3R4LT5oZGRfcm9jX3JlcV9xX2xvY2spOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR1AsIEZMKCJOb3QgYWJsZSB0byBlbnF1ZXVlIFJvQyBSZXEgY29udGV4dCIpKTsKKwkJY2RmX21lbV9mcmVlKGhkZF9yb2NfcmVxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfaW5kaWNhdGVfcm9jX2Ryb3AoKSAtIEluZGljYXRlIHJvYyBkcm9wIHRvIHVzZXJzcGFjZQorICogQGFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKiBAY3R4OiBSZW1haW4gb24gY2hhbm5lbCBjb250ZXh0CisgKgorICogU2VuZCByZW1haW4gb24gY2hhbm5lbCByZWFkeSBhbmQgY2FuY2VsIGV2ZW50IGZvciB0aGUgcXVldWVkCisgKiByb2MgdGhhdCBpcyBiZWluZyBkcm9wcGVkLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHVzZXJzcGFjZQorICogd2lsbCBzZW5kIG1vcmUgcm9jIHJlcXVlc3RzLiBJZiB0aGlzIGRyb3AgaXMgbm90IGluZGljYXRlZCB0bworICogdXNlcnNwYWNlLCBzdWJzZXF1ZW50IHJvYyB3aWxsIG5vdCBiZSBzZW50IHRvIHRoZSBkcml2ZXIgc2luY2UKKyAqIHRoZSB1c2Vyc3BhY2UgdGltZXMgb3V0IHdhaXRpbmcgZm9yIHRoZSByZW1haW4gb24gY2hhbm5lbCByZWFkeQorICogZXZlbnQuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd2xhbl9oZGRfaW5kaWNhdGVfcm9jX2Ryb3AoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQloZGRfcmVtYWluX29uX2NoYW5fY3R4X3QgKmN0eCkKK3sKKwloZGRfZGVidWcoImluZGljYXRlIHJvYyBkcm9wIHRvIHVzZXJzcGFjZSIpOworCWNmZzgwMjExX3JlYWR5X29uX2NoYW5uZWwoCisJCQlhZGFwdGVyLT5kZXYtPmllZWU4MDIxMV9wdHIsCisJCQkodWludHB0cl90KWN0eCwKKwkJCSZjdHgtPmNoYW4sCisJCQljdHgtPmR1cmF0aW9uLCBHRlBfS0VSTkVMKTsKKworCWNmZzgwMjExX3JlbWFpbl9vbl9jaGFubmVsX2V4cGlyZWQoCisJCQljdHgtPmRldi0+aWVlZTgwMjExX3B0ciwKKwkJCWN0eC0+Y29va2llLAorCQkJJmN0eC0+Y2hhbiwKKwkJCUdGUF9LRVJORUwpOworfQorCisvKioKKyAqIHdsYW5faGRkX3JvY19yZXF1ZXN0X2RlcXVldWUoKSAtIGRlcXVldWUgcmVtYWluIG9uIGNoYW5uZWwgcmVxdWVzdAorICogQHdvcms6IFBvaW50ZXIgdG8gd29yayBxdWV1ZSBzdHJ1Y3QKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bGFuX2hkZF9yb2NfcmVxdWVzdF9kZXF1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlpbnQgcmV0ID0gMDsKKwloZGRfcm9jX3JlcV90ICpoZGRfcm9jX3JlcTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0KKwkJCWNvbnRhaW5lcl9vZih3b3JrLCBoZGRfY29udGV4dF90LCByb2NfcmVxX3dvcmsud29yayk7CisKKwloZGRfZGVidWcoImdvaW5nIHRvIGRlcXVldWUgcm9jIik7CisKKwlpZiAoMCAhPSAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KSkpCisJCXJldHVybjsKKworCS8qCisJICogVGhlIHF1ZXVlZCByb2MgcmVxdWVzdHMgaXMgZGVxdWV1ZWQgYW5kIHByb2Nlc3NlZCBvbmUgYXQgYSB0aW1lLgorCSAqIENhbGxiYWNrICd3bGFuX2hkZF9yZW1haW5fb25fY2hhbm5lbF9jYWxsYmFjaycgZW5zdXJlcworCSAqIHRoYXQgYW55IHBlbmRpbmcgcm9jIGluIHRoZSBxdWV1ZSB3aWxsIGJlIHNjaGVkdWxlZAorCSAqIG9uIHRoZSBjdXJyZW50IHJvYyBjb21wbGV0aW9uIGJ5IHNjaGVkdWxpbmcgdGhlIHdvcmsgcXVldWUuCisJICovCisJY2RmX3NwaW5fbG9jaygmaGRkX2N0eC0+aGRkX3JvY19yZXFfcV9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmaGRkX2N0eC0+aGRkX3JvY19yZXFfcS5hbmNob3IpKSB7CisJCWNkZl9zcGluX3VubG9jaygmaGRkX2N0eC0+aGRkX3JvY19yZXFfcV9sb2NrKTsKKwkJaGRkX2RlYnVnKCJsaXN0IGlzIGVtcHR5Iik7CisJCXJldHVybjsKKwl9CisJc3RhdHVzID0gY2RmX2xpc3RfcmVtb3ZlX2Zyb250KCZoZGRfY3R4LT5oZGRfcm9jX3JlcV9xLAorCQkJKGNkZl9saXN0X25vZGVfdCAqKikgJmhkZF9yb2NfcmVxKTsKKwljZGZfc3Bpbl91bmxvY2soJmhkZF9jdHgtPmhkZF9yb2NfcmVxX3FfbG9jayk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaGRkX2RlYnVnKCJ1bmFibGUgdG8gcmVtb3ZlIHJvYyBlbGVtZW50IGZyb20gbGlzdCIpOworCQlyZXR1cm47CisJfQorCXJldCA9IHdsYW5faGRkX2V4ZWN1dGVfcmVtYWluX29uX2NoYW5uZWwoCisJCQloZGRfcm9jX3JlcS0+cEFkYXB0ZXIsCisJCQloZGRfcm9jX3JlcS0+cFJlbWFpbkNoYW5DdHgpOworCWlmIChyZXQgPT0gLUVCVVNZKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoImRyb3BwaW5nIFJvQyByZXF1ZXN0IikpOworCQl3bGFuX2hkZF9pbmRpY2F0ZV9yb2NfZHJvcChoZGRfcm9jX3JlcS0+cEFkYXB0ZXIsCisJCQkJCSAgIGhkZF9yb2NfcmVxLT5wUmVtYWluQ2hhbkN0eCk7CisJCWNkZl9tZW1fZnJlZShoZGRfcm9jX3JlcS0+cFJlbWFpbkNoYW5DdHgpOworCX0KKwljZGZfbWVtX2ZyZWUoaGRkX3JvY19yZXEpOworfQorCitzdGF0aWMgaW50IHdsYW5faGRkX3JlcXVlc3RfcmVtYWluX29uX2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA4LCAwKSkKKwkJCQkJICAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZQorCQkJCQkgICAgICBjaGFubmVsX3R5cGUsCisjZW5kaWYKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IGR1cmF0aW9uLAorCQkJCQkgICAgICB1NjQgKmNvb2tpZSwKKwkJCQkJICAgICAgcmVtX29uX2NoYW5uZWxfcmVxdWVzdF90eXBlX3QKKwkJCQkJICAgICAgcmVxdWVzdF90eXBlKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwloZGRfcmVtYWluX29uX2NoYW5fY3R4X3QgKnBSZW1haW5DaGFuQ3R4OworCWJvb2wgaXNCdXN5ID0gZmFsc2U7CisJdWludDMyX3Qgc2l6ZSA9IDA7CisJaGRkX2FkYXB0ZXJfdCAqc3RhX2FkYXB0ZXI7CisJaW50IHJldDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWhkZExvZyhMT0cxLCBGTCgiRGV2aWNlX21vZGUgJXMoJWQpIiksCisJICAgICAgIGhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkgICAgICAgcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkpCisJaGRkTG9nKExPRzEsCisJICAgICAgICJjaGFuKGh3X3ZhbCkweCV4IGNoYW4oY2VudGVyZnJlcSkgJWQgY2hhbiB0eXBlIDB4JXgsIGR1cmF0aW9uICVkIiwKKwkgICAgICAgY2hhbi0+aHdfdmFsdWUsIGNoYW4tPmNlbnRlcl9mcmVxLCBjaGFubmVsX3R5cGUsIGR1cmF0aW9uKTsKKyNlbHNlCisJaGRkTG9nKExPRzEsCisJICAgICAgICJjaGFuKGh3X3ZhbCkweCV4IGNoYW4oY2VudGVyZnJlcSkgJWQsIGR1cmF0aW9uICVkIiwKKwkgICAgICAgY2hhbi0+aHdfdmFsdWUsIGNoYW4tPmNlbnRlcl9mcmVxLCBkdXJhdGlvbik7CisjZW5kaWYKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChjZHNfaXNfY29ubmVjdGlvbl9pbl9wcm9ncmVzcygKKwkJKGhkZF9jb250ZXh0X3QgKikgcEFkYXB0ZXItPnBIZGRDdHgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29ubmVjdGlvbiBpcyBpbiBwcm9ncmVzcyIpKTsKKwkJaXNCdXN5ID0gdHJ1ZTsKKwl9CisJcFJlbWFpbkNoYW5DdHggPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoaGRkX3JlbWFpbl9vbl9jaGFuX2N0eF90KSk7CisJaWYgKE5VTEwgPT0gcFJlbWFpbkNoYW5DdHgpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJICAgICAgICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBDaGFubmVsIGNvbnRleHQiLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljZGZfbWVtX3plcm8ocFJlbWFpbkNoYW5DdHgsIHNpemVvZigqcFJlbWFpbkNoYW5DdHgpKTsKKwljZGZfbWVtX2NvcHkoJnBSZW1haW5DaGFuQ3R4LT5jaGFuLCBjaGFuLAorCQkgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwpKTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkpCisJcFJlbWFpbkNoYW5DdHgtPmNoYW5fdHlwZSA9IGNoYW5uZWxfdHlwZTsKKyNlbmRpZgorCXBSZW1haW5DaGFuQ3R4LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworCXBSZW1haW5DaGFuQ3R4LT5kZXYgPSBkZXY7CisJKmNvb2tpZSA9ICh1aW50cHRyX3QpIHBSZW1haW5DaGFuQ3R4OworCXBSZW1haW5DaGFuQ3R4LT5jb29raWUgPSAqY29va2llOworCXBSZW1haW5DaGFuQ3R4LT5yZW1fb25fY2hhbl9yZXF1ZXN0ID0gcmVxdWVzdF90eXBlOworCXBSZW1haW5DaGFuQ3R4LT5hY3Rpb25fcGt0X2J1ZmYuZnJlcSA9IDA7CisJcFJlbWFpbkNoYW5DdHgtPmFjdGlvbl9wa3RfYnVmZi5mcmFtZV9wdHIgPSBOVUxMOworCXBSZW1haW5DaGFuQ3R4LT5hY3Rpb25fcGt0X2J1ZmYuZnJhbWVfbGVuZ3RoID0gMDsKKwlwUmVtYWluQ2hhbkN0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX2NhbmNlbF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCWlmIChSRU1BSU5fT05fQ0hBTk5FTF9SRVFVRVNUID09IHJlcXVlc3RfdHlwZSkgeworCQlzdGFfYWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LCBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKTsKKwkJaWYgKChOVUxMICE9IHN0YV9hZGFwdGVyKSYmCisJCQloZGRfY29ubl9pc19jb25uZWN0ZWQoCisJCQkJV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihzdGFfYWRhcHRlcikpKSB7CisJCQlpZiAocEFkYXB0ZXItPmxhc3Rfcm9jX3RzICE9MCAmJgorCQkJCSgoY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpIC0KKwkJCQkJIHBBZGFwdGVyLT5sYXN0X3JvY190cykgPAorCQkJCXBIZGRDdHgtPmNvbmZpZy0+cDJwX2xpc3Rlbl9kZWZlcl9pbnRlcnZhbCkpIHsKKwkJCWlmIChwUmVtYWluQ2hhbkN0eC0+ZHVyYXRpb24gPiBIRERfUDJQX01BWF9ST0NfRFVSQVRJT04pCisJCQkJcFJlbWFpbkNoYW5DdHgtPmR1cmF0aW9uID0KKwkJCQkJCUhERF9QMlBfTUFYX1JPQ19EVVJBVElPTjsKKworCQkJd2xhbl9oZGRfcm9jX3JlcXVlc3RfZW5xdWV1ZShwQWRhcHRlciwgcFJlbWFpbkNoYW5DdHgpOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwSGRkQ3R4LT5yb2NfcmVxX3dvcmssCisJCQltc2Vjc190b19qaWZmaWVzKAorCQkJCXBIZGRDdHgtPmNvbmZpZy0+cDJwX2xpc3Rlbl9kZWZlcl9pbnRlcnZhbCkpOworCQkJaGRkTG9nKExPRzEsICJEZWZlciBpbnRlcnZhbCBpcyAlaHUsIHBBZGFwdGVyICVwIiwKKwkJCQlwSGRkQ3R4LT5jb25maWctPnAycF9saXN0ZW5fZGVmZXJfaW50ZXJ2YWwsCisJCQkJcEFkYXB0ZXIpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwljZGZfc3Bpbl9sb2NrKCZwSGRkQ3R4LT5oZGRfcm9jX3JlcV9xX2xvY2spOworCWNkZl9saXN0X3NpemUoJihwSGRkQ3R4LT5oZGRfcm9jX3JlcV9xKSwgJnNpemUpOworCWNkZl9zcGluX3VubG9jaygmcEhkZEN0eC0+aGRkX3JvY19yZXFfcV9sb2NrKTsKKwlpZiAoKGlzQnVzeSA9PSBmYWxzZSkgJiYgKCFzaXplKSkgeworCQlzdGF0dXMgPSB3bGFuX2hkZF9leGVjdXRlX3JlbWFpbl9vbl9jaGFubmVsKHBBZGFwdGVyLAorCQkJCQkJCSAgICBwUmVtYWluQ2hhbkN0eCk7CisJCWlmIChzdGF0dXMgPT0gLUVCVVNZKSB7CisJCQlpZiAod2xhbl9oZGRfcm9jX3JlcXVlc3RfZW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJCQkgcFJlbWFpbkNoYW5DdHgpKSB7CisJCQkJY2RmX21lbV9mcmVlKHBSZW1haW5DaGFuQ3R4KTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAod2xhbl9oZGRfcm9jX3JlcXVlc3RfZW5xdWV1ZShwQWRhcHRlciwgcFJlbWFpbkNoYW5DdHgpKSB7CisJCQljZGZfbWVtX2ZyZWUocFJlbWFpbkNoYW5DdHgpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisKKwkvKgorCSAqIElmIGEgY29ubmVjdGlvbiBpcyBub3QgaW4gcHJvZ3Jlc3MgKGlzQnVzeSksIGJlZm9yZSBzY2hlZHVsaW5nCisJICogdGhlIHdvcmsgcXVldWUgaXQgaXMgbmVjZXNzYXJ5IHRvIGNoZWNrIGlmIGEgcm9jIGluIGluIHByb2dyZXNzCisJICogb3Igbm90IGJlY2F1c2U6IGlmIGFuIHJvYyBpcyBpbiBwcm9ncmVzcywgdGhlIGRlcXVldWVkIHJvYworCSAqIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQgd2lsbCBiZSBkcm9wcGVkLiBUbyBlbnN1cmUgdGhhdCB0aGlzIG5ldworCSAqIHJvYyByZXF1ZXN0IGlzIG5vdCBkcm9wcGVkLCBpdCBpcyBzdWdnZXN0ZWQgdG8gY2hlY2sgaWYgYW4gcm9jCisJICogaXMgaW4gcHJvZ3Jlc3Mgb3Igbm90LiBUaGUgZXhpc3Rpbmcgcm9jIGNvbXBsZXRpb24gd2lsbCBwcm92aWRlCisJICogdGhlIHRyaWdnZXIgdG8gZGVxdWV1ZSB0aGUgbmV4dCByb2MgcmVxdWVzdC4KKwkgKi8KKwlpZiAoaXNCdXN5ID09IGZhbHNlICYmIHBBZGFwdGVyLT5pc19yb2NfaW5wcm9ncmVzcyA9PSBmYWxzZSkgeworCQloZGRfZGVidWcoInNjaGVkdWxpbmcgZGVsYXllZCB3b3JrOiBubyBjb25uZWN0aW9uL3JvYyBhY3RpdmUiKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwSGRkQ3R4LT5yb2NfcmVxX3dvcmssIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfcmVtYWluX29uX2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCQkgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisjZWxzZQorCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisjZW5kaWYKKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDgsIDApKQorCQkJCQkgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUKKwkJCQkJICBjaGFubmVsX3R5cGUsCisjZW5kaWYKKwkJCQkJICB1bnNpZ25lZCBpbnQgZHVyYXRpb24sIHU2NCAqY29va2llKQoreworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKyNlbmRpZgorCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX1JFTUFJTl9PTl9DSEFOTkVMLAorCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsIFJFTUFJTl9PTl9DSEFOTkVMX1JFUVVFU1QpKTsKKwlyZXR1cm4gd2xhbl9oZGRfcmVxdWVzdF9yZW1haW5fb25fY2hhbm5lbCh3aXBoeSwgZGV2LCBjaGFuLAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA4LCAwKSkKKwkJCQkJCSAgY2hhbm5lbF90eXBlLAorI2VuZGlmCisJCQkJCQkgIGR1cmF0aW9uLCBjb29raWUsCisJCQkJCQkgIFJFTUFJTl9PTl9DSEFOTkVMX1JFUVVFU1QpOworfQorCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfcmVtYWluX29uX2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorI2Vsc2UKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyNlbmRpZgorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDgsIDApKQorCQkJCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKKyNlbmRpZgorCQkJCQl1bnNpZ25lZCBpbnQgZHVyYXRpb24sIHU2NCAqY29va2llKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfcmVtYWluX29uX2NoYW5uZWwod2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwkJCQkJCSAgICB3ZGV2LAorI2Vsc2UKKwkJCQkJCSAgICBkZXYsCisjZW5kaWYKKwkJCQkJCSAgICBjaGFuLAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA4LCAwKSkKKwkJCQkJCSAgICBjaGFubmVsX3R5cGUsCisjZW5kaWYKKwkJCQkJCSAgICBkdXJhdGlvbiwgY29va2llKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGhkZF9yZW1haW5fY2hhbl9yZWFkeV9oYW5kbGVyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCXVpbnQzMl90IHNjYW5faWQpCit7CisJaGRkX2NmZzgwMjExX3N0YXRlX3QgKmNmZ1N0YXRlID0gTlVMTDsKKwloZGRfcmVtYWluX29uX2NoYW5fY3R4X3QgKnBSZW1haW5DaGFuQ3R4ID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCWhkZExvZyhMT0dFLCBGTCgicEFkYXB0ZXIgaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKwljZmdTdGF0ZSA9IFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwloZGRMb2coTE9HMSwgIlJlYWR5IG9uIGNoYW4gaW5kICVkIiwgc2Nhbl9pZCk7CisKKwlwQWRhcHRlci0+c3RhcnRfcm9jX3RzID0gY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOworCW11dGV4X2xvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJcFJlbWFpbkNoYW5DdHggPSBjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4OworCWlmIChwUmVtYWluQ2hhbkN0eCAhPSBOVUxMKSB7CisJCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJIFRSQUNFX0NPREVfSEREX1JFTUFJTkNIQU5SRUFEWUhBTkRMRVIsCisJCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJIHBSZW1haW5DaGFuQ3R4LT5kdXJhdGlvbikpOworCQkvKiBzdGFydCB0aW1lciBmb3IgYWN0dWFsIGR1cmF0aW9uICovCisJCWlmIChDREZfVElNRVJfU1RBVEVfUlVOTklORyA9PQorCQkJY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKAorCQkJCSZwUmVtYWluQ2hhbkN0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyKSkgeworCQkJaGRkTG9nKExPR0UsICJUaW1lciBTdGFydGVkIGJlZm9yZSByZWFkeSBldmVudCEhISIpOworCQkJY2RmX21jX3RpbWVyX3N0b3AoJnBSZW1haW5DaGFuQ3R4LT4KKwkJCQkJICBoZGRfcmVtYWluX29uX2NoYW5fdGltZXIpOworCQl9CisJCXN0YXR1cyA9CisJCQljZGZfbWNfdGltZXJfc3RhcnQoJnBSZW1haW5DaGFuQ3R4LT4KKwkJCQkJICAgaGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyLAorCQkJCQkgICAocFJlbWFpbkNoYW5DdHgtPmR1cmF0aW9uICsKKwkJCQkJICAgIENPTVBMRVRFX0VWRU5UX1BST1BPR0FURV9USU1FKSk7CisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQloZGRMb2coTE9HRSwgIiVzOiBSZW1haW4gb24gQ2hhbm5lbCB0aW1lciBzdGFydCBmYWlsZWQiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJfQorCisJCWlmIChSRU1BSU5fT05fQ0hBTk5FTF9SRVFVRVNUID09CisJCSAgICBwUmVtYWluQ2hhbkN0eC0+cmVtX29uX2NoYW5fcmVxdWVzdCkgeworCQkJY2ZnODAyMTFfcmVhZHlfb25fY2hhbm5lbCgKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCXBBZGFwdGVyLT5kZXYtPgorCQkJCWllZWU4MDIxMV9wdHIsCisjZWxzZQorCQkJCXBBZGFwdGVyLT5kZXYsCisjZW5kaWYKKwkJCQkodWludHB0cl90KQorCQkJCXBSZW1haW5DaGFuQ3R4LAorCQkJCSZwUmVtYWluQ2hhbkN0eC0+Y2hhbiwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkpCisJCQkJcFJlbWFpbkNoYW5DdHgtPgorCQkJCWNoYW5fdHlwZSwKKyNlbmRpZgorCQkJCXBSZW1haW5DaGFuQ3R4LT4KKwkJCQlkdXJhdGlvbiwgR0ZQX0tFUk5FTCk7CisJCX0gZWxzZSBpZiAoT0ZGX0NIQU5ORUxfQUNUSU9OX1RYID09CisJCQkgICBwUmVtYWluQ2hhbkN0eC0+cmVtX29uX2NoYW5fcmVxdWVzdCkgeworCQkJY29tcGxldGUoJnBBZGFwdGVyLT5vZmZjaGFubmVsX3R4X2V2ZW50KTsKKwkJfQorCQkvKiBDaGVjayBmb3IgY2FjaGVkIGFjdGlvbiBmcmFtZSAqLworCQlpZiAocFJlbWFpbkNoYW5DdHgtPmFjdGlvbl9wa3RfYnVmZi5mcmFtZV9sZW5ndGggIT0gMCkgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIiVzOiBTZW50IGNhY2hlZCBhY3Rpb24gZnJhbWUgdG8gc3VwcGxpY2FudCIsCisJCQkgICAgICAgX19mdW5jX18pOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTgsIDApKQorCQkJY2ZnODAyMTFfcnhfbWdtdChwQWRhcHRlci0+ZGV2LT5pZWVlODAyMTFfcHRyLAorCQkJCXBSZW1haW5DaGFuQ3R4LT5hY3Rpb25fcGt0X2J1ZmYuZnJlcSwgMCwKKwkJCQlwUmVtYWluQ2hhbkN0eC0+YWN0aW9uX3BrdF9idWZmLmZyYW1lX3B0ciwKKwkJCQlwUmVtYWluQ2hhbkN0eC0+YWN0aW9uX3BrdF9idWZmLmZyYW1lX2xlbmd0aCwKKwkJCQlOTDgwMjExX1JYTUdNVF9GTEFHX0FOU1dFUkVEKTsKKyNlbGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTIsIDApKQorCQkJY2ZnODAyMTFfcnhfbWdtdChwQWRhcHRlci0+ZGV2LT5pZWVlODAyMTFfcHRyLAorCQkJCXBSZW1haW5DaGFuQ3R4LT5hY3Rpb25fcGt0X2J1ZmYuZnJlcSwgMCwKKwkJCQlwUmVtYWluQ2hhbkN0eC0+YWN0aW9uX3BrdF9idWZmLmZyYW1lX3B0ciwKKwkJCQlwUmVtYWluQ2hhbkN0eC0+YWN0aW9uX3BrdF9idWZmLmZyYW1lX2xlbmd0aCwKKwkJCQlOTDgwMjExX1JYTUdNVF9GTEFHX0FOU1dFUkVELCBHRlBfQVRPTUlDKTsKKyNlbGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJCQljZmc4MDIxMV9yeF9tZ210KHBBZGFwdGVyLT5kZXYtPmllZWU4MDIxMV9wdHIsCisJCQkJCSBwUmVtYWluQ2hhbkN0eC0+YWN0aW9uX3BrdF9idWZmLmZyZXEsCisJCQkJCSAwLAorCQkJCQkgcFJlbWFpbkNoYW5DdHgtPmFjdGlvbl9wa3RfYnVmZi4KKwkJCQkJIGZyYW1lX3B0ciwKKwkJCQkJIHBSZW1haW5DaGFuQ3R4LT5hY3Rpb25fcGt0X2J1ZmYuCisJCQkJCSBmcmFtZV9sZW5ndGgsIEdGUF9BVE9NSUMpOworI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA0LCAwKSkKKwkJCWNmZzgwMjExX3J4X21nbXQocEFkYXB0ZXItPmRldiwKKwkJCQkJIHBSZW1haW5DaGFuQ3R4LT5hY3Rpb25fcGt0X2J1ZmYuZnJlcSwKKwkJCQkJIDAsCisJCQkJCSBwUmVtYWluQ2hhbkN0eC0+YWN0aW9uX3BrdF9idWZmLgorCQkJCQkgZnJhbWVfcHRyLAorCQkJCQkgcFJlbWFpbkNoYW5DdHgtPmFjdGlvbl9wa3RfYnVmZi4KKwkJCQkJIGZyYW1lX2xlbmd0aCwgR0ZQX0FUT01JQyk7CisjZWxzZQorCQkJY2ZnODAyMTFfcnhfbWdtdChwQWRhcHRlci0+ZGV2LAorCQkJCQkgcFJlbWFpbkNoYW5DdHgtPmFjdGlvbl9wa3RfYnVmZi5mcmVxLAorCQkJCQkgcFJlbWFpbkNoYW5DdHgtPmFjdGlvbl9wa3RfYnVmZi4KKwkJCQkJIGZyYW1lX3B0ciwKKwkJCQkJIHBSZW1haW5DaGFuQ3R4LT5hY3Rpb25fcGt0X2J1ZmYuCisJCQkJCSBmcmFtZV9sZW5ndGgsIEdGUF9BVE9NSUMpOworI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSAqLworCisJCQljZGZfbWVtX2ZyZWUocFJlbWFpbkNoYW5DdHgtPmFjdGlvbl9wa3RfYnVmZi5mcmFtZV9wdHIpOworCQkJcFJlbWFpbkNoYW5DdHgtPmFjdGlvbl9wa3RfYnVmZi5mcmFtZV9sZW5ndGggPSAwOworCQkJcFJlbWFpbkNoYW5DdHgtPmFjdGlvbl9wa3RfYnVmZi5mcmVxID0gMDsKKwkJCXBSZW1haW5DaGFuQ3R4LT5hY3Rpb25fcGt0X2J1ZmYuZnJhbWVfcHRyID0gTlVMTDsKKwkJfQorCQljb21wbGV0ZSgmcEFkYXB0ZXItPnJlbV9vbl9jaGFuX3JlYWR5X2V2ZW50KTsKKwl9IGVsc2UgeworCQloZGRMb2coTE9HVywgIiVzOiBObyBQZW5kaW5nIFJlbWFpbiBvbiBjaGFubmVsIFJlcXVlc3QiLAorCQkgICAgICAgX19mdW5jX18pOworCX0KKwltdXRleF91bmxvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJcmV0dXJuOworfQorCitpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisjZWxzZQorCQkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisjZW5kaWYKKwkJCQkJCSB1NjQgY29va2llKQoreworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKyNlbmRpZgorCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NmZzgwMjExX3N0YXRlX3QgKmNmZ1N0YXRlID0gV0xBTl9IRERfR0VUX0NGR19TVEFURV9QVFIocEFkYXB0ZXIpOworCWhkZF9yZW1haW5fb25fY2hhbl9jdHhfdCAqcFJlbWFpbkNoYW5DdHg7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCWludCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyByYzsKKwljZGZfbGlzdF9ub2RlX3QgKnRtcCwgKnE7CisJaGRkX3JvY19yZXFfdCAqY3Vycl9yb2NfcmVxOworCisJaGRkTG9nKExPRzEsICJDYW5jZWwgcmVtYWluIG9uIGNoYW5uZWwiKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKworCWlmICgwICE9IHN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBIREQgY29udGV4dCBpcyBub3QgdmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWNkZl9zcGluX2xvY2soJnBIZGRDdHgtPmhkZF9yb2NfcmVxX3FfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgcSwgJnBIZGRDdHgtPmhkZF9yb2NfcmVxX3EuYW5jaG9yKSB7CisJCWN1cnJfcm9jX3JlcSA9IGxpc3RfZW50cnkodG1wLCBoZGRfcm9jX3JlcV90LCBub2RlKTsKKwkJaWYgKCh1aW50cHRyX3QpIGN1cnJfcm9jX3JlcS0+cFJlbWFpbkNoYW5DdHggPT0gY29va2llKSB7CisJCQlzdGF0dXMgPSBjZGZfbGlzdF9yZW1vdmVfbm9kZSgmcEhkZEN0eC0+aGRkX3JvY19yZXFfcSwKKwkJCQkJCSAgICAgIChjZGZfbGlzdF9ub2RlX3QgKikKKwkJCQkJCSAgICAgIGN1cnJfcm9jX3JlcSk7CisJCQljZGZfc3Bpbl91bmxvY2soJnBIZGRDdHgtPmhkZF9yb2NfcmVxX3FfbG9jayk7CisJCQlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJCWNkZl9tZW1fZnJlZShjdXJyX3JvY19yZXEtPnBSZW1haW5DaGFuQ3R4KTsKKwkJCQljZGZfbWVtX2ZyZWUoY3Vycl9yb2NfcmVxKTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJfQorCWNkZl9zcGluX3VubG9jaygmcEhkZEN0eC0+aGRkX3JvY19yZXFfcV9sb2NrKTsKKwkvKiBGSVhNRSBjYW5jZWwgY3VycmVudGx5IHJ1bm5pbmcgcmVtYWluIG9uIGNoYW4uCisJICogTmVlZCB0byBjaGVjayBjb29raWUgYW5kIGNhbmNlbCBhY2NvcmRpbmdseQorCSAqLworCW11dGV4X2xvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJcFJlbWFpbkNoYW5DdHggPSBjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4OworCWlmICgoY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eCA9PSBOVUxMKSB8fAorCSAgICAoY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eC0+Y29va2llICE9IGNvb2tpZSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICIlczogTm8gUmVtYWluIG9uIGNoYW5uZWwgcGVuZGluZyB3aXRoIHNwZWNpZmllZCBjb29raWUgdmFsdWUiLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoTlVMTCAhPSBjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4KSB7CisJCWNkZl9tY190aW1lcl9zdG9wKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4LT4KKwkJCQkgIGhkZF9yZW1haW5fb25fY2hhbl90aW1lcik7CisJCWlmICh0cnVlID09CisJCSAgICBwUmVtYWluQ2hhbkN0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX2NhbmNlbF9pbl9wcm9ncmVzcykgeworCQkJbXV0ZXhfdW5sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCQkJaGRkTG9nKExPRzEsCisJCQkgICAgICAgRkwoIlJPQyB0aW1lciBjYW5jZWxsYXRpb24gaW4gcHJvZ3Jlc3MsIgorCQkJCSAgIiB3YWl0IGZvciBjb21wbGV0aW9uIikpOworCQkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnBBZGFwdGVyLT4KKwkJCQkJCQkgY2FuY2VsX3JlbV9vbl9jaGFuX3ZhciwKKwkJCQkJCQkgbXNlY3NfdG9famlmZmllcworCQkJCQkJCQkgKFdBSVRfQ0FOQ0VMX1JFTV9DSEFOKSk7CisJCQlpZiAoIXJjKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgICIlczp3YWl0IG9uIGNhbmNlbF9yZW1fb25fY2hhbl92YXIgdGltZWQgb3V0IiwKKwkJCQkgICAgICAgX19mdW5jX18pOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJcFJlbWFpbkNoYW5DdHgtPmhkZF9yZW1haW5fb25fY2hhbl9jYW5jZWxfaW5fcHJvZ3Jlc3MgPQorCQkJCXRydWU7CisJfQorCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKworCS8qIHdhaXQgdW50aWwgcmVtYWluIG9uIGNoYW5uZWwgcmVhZHkgZXZlbnQgcmVjZWl2ZWQKKwkgKiBmb3IgYWxyZWFkeSBpc3N1ZWQgcmVtYWluIG9uIGNoYW5uZWwgcmVxdWVzdCAqLworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwQWRhcHRlci0+cmVtX29uX2NoYW5fcmVhZHlfZXZlbnQsCisJCQkJCSBtc2Vjc190b19qaWZmaWVzKFdBSVRfUkVNX0NIQU5fUkVBRFkpKTsKKwlpZiAoIXJjKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIHJlbWFpbiBvbiBjaGFubmVsIHJlYWR5IGluZGljYXRpb24iLAorCQkgICAgICAgX19mdW5jX18pOworCisJCWlmIChwSGRkQ3R4LT5pc0xvZ3BJblByb2dyZXNzKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogTE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisJSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5jYW5jZWxfcmVtX29uX2NoYW5fdmFyKTsKKwkvKiBJc3N1ZSBhYm9ydCByZW1haW4gb24gY2hhbiByZXF1ZXN0IHRvIHNtZS4KKwkgKiBUaGUgcmVtYWluIG9uIGNoYW5uZWwgY2FsbGJhY2sgd2lsbCBtYWtlIHN1cmUgdGhlIHJlbWFpbl9vbl9jaGFuCisJICogZXhwaXJlZCBldmVudCBpcyBzZW50LgorCSAqLworCWlmICgoV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJICAgIChXTEFOX0hERF9QMlBfQ0xJRU5UID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkgICAgKFdMQU5fSEREX1AyUF9ERVZJQ0UgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorCSAgICApIHsKKworCQl1aW50OF90IHNlc3Npb25JZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisJCXNtZV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJc2Vzc2lvbklkLAorCQkJcFJlbWFpbkNoYW5DdHgtPnNjYW5faWQpOworCX0gZWxzZSBpZiAoKFdMQU5fSEREX1NPRlRBUCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJCSAgIChXTEFOX0hERF9QMlBfR08gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorCQkgICApIHsKKwkJd2xhbnNhcF9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwoCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQkJV0xBTl9IRERfR0VUX1NBUF9DVFhfUFRSKHBBZGFwdGVyKSwKKyNlbHNlCisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wY2RzX2NvbnRleHQsCisjZW5kaWYKKwkJCXBSZW1haW5DaGFuQ3R4LT5zY2FuX2lkKTsKKworCX0gZWxzZSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBkZXZpY2VfbW9kZSAlcyglZCkiKSwKKwkJICAgICAgIGhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkJICAgICAgIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcEFkYXB0ZXItPmNhbmNlbF9yZW1fb25fY2hhbl92YXIsCisJCQkJCSBtc2Vjc190b19qaWZmaWVzCisJCQkJCQkgKFdBSVRfQ0FOQ0VMX1JFTV9DSEFOKSk7CisJaWYgKCFyYykgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICIlczp3YWl0IG9uIGNhbmNlbF9yZW1fb25fY2hhbl92YXIgdGltZWQgb3V0ICIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJfQorCWhkZF9hbGxvd19zdXNwZW5kKFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfUk9DKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHdsYW5faGRkX2NmZzgwMjExX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJCQkJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorI2Vsc2UKKwkJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisjZW5kaWYKKwkJCQkJICAgICAgIHU2NCBjb29raWUpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwod2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwkJCQkJCQkgICB3ZGV2LAorI2Vsc2UKKwkJCQkJCQkgICBkZXYsCisjZW5kaWYKKwkJCQkJCQkgICBjb29raWUpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQoraW50IF9fd2xhbl9oZGRfbWdtdF90eChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLCBib29sIG9mZmNoYW4sCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDgsIDApKQorCQkgICAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisJCSAgICAgICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwKKyNlbmRpZgorCQkgICAgICAgdW5zaWduZWQgaW50IHdhaXQsCisJCSAgICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBib29sIG5vX2NjaywKKwkJICAgICAgIGJvb2wgZG9udF93YWl0X2Zvcl9hY2ssIHU2NCAqY29va2llKQorI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAzLCAwKSkKK2ludCBfX3dsYW5faGRkX21nbXRfdHgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwgYm9vbCBvZmZjaGFuLAorCQkgICAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisJCSAgICAgICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwgdW5zaWduZWQgaW50IHdhaXQsCisJCSAgICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBib29sIG5vX2NjaywKKwkJICAgICAgIGJvb2wgZG9udF93YWl0X2Zvcl9hY2ssIHU2NCAqY29va2llKQorI2Vsc2UKK2ludCBfX3dsYW5faGRkX21nbXRfdHgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwgYm9vbCBvZmZjaGFuLAorCQkgICAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisJCSAgICAgICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwgdW5zaWduZWQgaW50IHdhaXQsCisJCSAgICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCB1NjQgKmNvb2tpZSkKKyNlbmRpZiAvKiBMSU5VWF9WRVJTSU9OX0NPREUgKi8KK3sKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisjZW5kaWYKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jZmc4MDIxMV9zdGF0ZV90ICpjZmdTdGF0ZSA9IFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwloZGRfcmVtYWluX29uX2NoYW5fY3R4X3QgKnBSZW1haW5DaGFuQ3R4OworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwl1aW50MTZfdCBleHRlbmRlZFdhaXQgPSAwOworCXVpbnQ4X3QgdHlwZSA9IFdMQU5fSEREX0dFVF9UWVBFX0ZSTV9GQyhidWZbMF0pOworCXVpbnQ4X3Qgc3ViVHlwZSA9IFdMQU5fSEREX0dFVF9TVUJUWVBFX0ZSTV9GQyhidWZbMF0pOworCXRBY3Rpb25Gcm1UeXBlIGFjdGlvbkZybVR5cGU7CisJYm9vbCBub2FjayA9IDA7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHJjOworCWhkZF9hZGFwdGVyX3QgKmdvQWRhcHRlcjsKKwl1aW50MTZfdCBjdXJyZW50X2ZyZXE7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQUNUSU9OLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkpOworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIiwgX19mdW5jX18pOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWhkZExvZyhMT0cxLCBGTCgiRGV2aWNlX21vZGUgJXMoJWQpIHR5cGU6ICVkIiksCisJICAgICAgIGhkZF9kZXZpY2VfbW9kZV90b19zdHJpbmcocEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkgICAgICAgcEFkYXB0ZXItPmRldmljZV9tb2RlLCB0eXBlKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfREVCVUcKKwlpZiAoKHR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKSAmJgorCSAgICAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQUNUSU9OKSAmJgorCSAgICB3bGFuX2hkZF9pc190eXBlX3AycF9hY3Rpb24oJmJ1ZgorCQkJCVtXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX0JPRFlfT0ZGU0VUXSkpIHsKKwkJYWN0aW9uRnJtVHlwZSA9IGJ1ZltXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX1RZUEVfT0ZGU0VUXTsKKwkJaWYgKGFjdGlvbkZybVR5cGUgPj0gTUFYX1AyUF9BQ1RJT05fRlJBTUVfVFlQRSkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICAiW1AyUF0gdW5rbm93blslZF0gLS0tPiBPVEEgdG8gIiBNQUNfQUREUkVTU19TVFIsCisJCQkgICAgICAgYWN0aW9uRnJtVHlwZSwKKwkJCSAgICAgICBNQUNfQUREUl9BUlJBWSgmYnVmCisJCQkJCSAgICAgIFtXTEFOX0hERF84MDIxMV9GUk1fREFfT0ZGU0VUXSkpOworCQl9IGVsc2UgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIltQMlBdICVzIC0tLT4gT1RBIHRvICIKKwkJCSAgICAgICBNQUNfQUREUkVTU19TVFIsCisJCQkgICAgICAgcDJwX2FjdGlvbl9mcmFtZV90eXBlW2FjdGlvbkZybVR5cGVdLAorCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKCZidWYKKwkJCQkJICAgICAgW1dMQU5fSEREXzgwMjExX0ZSTV9EQV9PRkZTRVRdKSk7CisJCQlpZiAoKGFjdGlvbkZybVR5cGUgPT0gV0xBTl9IRERfUFJPVl9ESVNfUkVRKQorCQkJICAgICYmIChnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID09IFAyUF9OT1RfQUNUSVZFKSkgeworCQkJCWdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXMgPSBQMlBfR09fTkVHX1BST0NFU1M7CisJCQkJaGRkTG9nKExPR0UsICJbUDJQIFN0YXRlXUluYWN0aXZlIHN0YXRlIHRvICIKKwkJCQkgICAgICAgIkdPIG5lZ290aWF0aW9uIHByb2dyZXNzIHN0YXRlIik7CisJCQl9IGVsc2UgaWYgKChhY3Rpb25Gcm1UeXBlID09IFdMQU5fSEREX0dPX05FR19DTkYpICYmCisJCQkJICAgKGdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXMgPT0KKwkJCQkgICAgUDJQX0dPX05FR19QUk9DRVNTKSkgeworCQkJCWdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXMgPQorCQkJCQlQMlBfR09fTkVHX0NPTVBMRVRFRDsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgIltQMlAgU3RhdGVdR08gbmVnbyBwcm9ncmVzcyB0byBHTyBuZWdvIgorCQkJCSAgICAgICAiIGNvbXBsZXRlZCBzdGF0ZSIpOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDMsIDApKQorCW5vYWNrID0gZG9udF93YWl0X2Zvcl9hY2s7CisjZW5kaWYKKworCS8qIElmIHRoZSB3YWl0IGlzIGNvbWluZyBhcyAwIHdpdGggb2ZmIGNoYW5uZWwgc2V0ICovCisJLyogdGhlbiBzZXQgdGhlIHdhaXQgdG8gMjAwIG1zICovCisJaWYgKG9mZmNoYW4gJiYgIXdhaXQpIHsKKwkJd2FpdCA9IEFDVElPTl9GUkFNRV9ERUZBVUxUX1dBSVQ7CisJCW11dGV4X2xvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJCWlmIChjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4KSB7CisKKwkJCXVpbnQzMl90IGN1cnJlbnRfdGltZSA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKKwkJCWludCByZW1haW5pbmdfcm9jX3RpbWUgPQorCQkJCSgoaW50KSBjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4LT5kdXJhdGlvbiAtCisJCQkJKGN1cnJlbnRfdGltZSAtIHBBZGFwdGVyLT5zdGFydF9yb2NfdHMpKTsKKworCQkJaWYgKHJlbWFpbmluZ19yb2NfdGltZSA+IEFDVElPTl9GUkFNRV9ERUZBVUxUX1dBSVQpCisJCQkJd2FpdCA9IHJlbWFpbmluZ19yb2NfdGltZTsKKwkJfQorCQltdXRleF91bmxvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJfQorCisJaWYgKChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgJiYKKwkJKHR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FICYmCisJCXN1YlR5cGUgPT0gU0lSX01BQ19NR01UX1BST0JFX1JTUCkpIHsKKwkJCS8qIERyb3AgUHJvYmUgcmVzcG9uc2UgcmVjZWl2ZWQKKwkJCSAqIGZyb20gc3VwcGxpY2FudCBpbiBzdGEgbW9kZQorCQkJICovCisJCQlnb3RvIGVycl9yZW1fY2hhbm5lbDsKKwl9CisKKwkvKiBDYWxsIHNtZSBBUEkgdG8gc2VuZCBvdXQgYSBhY3Rpb24gZnJhbWUuICovCisJLyogT1IgY2FuIHdlIHNlbmQgaXQgZGlyZWN0bHkgdGhyb3VnaCBkYXRhIHBhdGg/PyAqLworCS8qIEFmdGVyIHR4IGNvbXBsZXRpb24gc2VuZCB0eCBzdGF0dXMgYmFjay4gKi8KKwlpZiAoKFdMQU5fSEREX1NPRlRBUCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJICAgIChXTEFOX0hERF9QMlBfR08gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorCSAgICApIHsKKwkJaWYgKHR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKSB7CisJCQlpZiAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfUFJPQkVfUlNQKSB7CisJCQkJLyogRHJvcCBQcm9iZSByZXNwb25zZSByZWNpZXZlZCBmcm9tIHN1cHBsaWNhbnQsIGFzIGZvciBHTyBhbmQKKwkJCQkgICBTQVAgUEUgaXRzZWxmIHNlbmRzIHByb2JlIHJlc3BvbnNlCisJCQkJICovCisJCQkJZ290byBlcnJfcmVtX2NoYW5uZWw7CisJCQl9IGVsc2UgaWYgKChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9ESVNBU1NPQykgfHwKKwkJCQkgICAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfREVBVVRIKSkgeworCQkJCS8qIER1cmluZyBFQVAgZmFpbHVyZSBvciBQMlAgR3JvdXAgUmVtb3ZlIHN1cHBsaWNhbnQKKwkJCQkgKiBpcyBzZW5kaW5nIGRlbF9zdGF0aW9uIGNvbW1hbmQgdG8gZHJpdmVyLiBGcm9tCisJCQkJICogZGVsX3N0YXRpb24gZnVuY3Rpb24sIERyaXZlciB3aWxsIHNlbmQgZGVhdXRoIGZyYW1lIHRvCisJCQkJICogcDJwIGNsaWVudC4gTm8gbmVlZCB0byBzZW5kIGRpc2Fzc29jIGZyYW1lIGZyb20gaGVyZS4KKwkJCQkgKiBzbyBEcm9wIHRoZSBmcmFtZSBoZXJlIGFuZCBzZW5kIHR4IGluZGljYXRpb24gYmFjayB0bworCQkJCSAqIHN1cHBsaWNhbnQuCisJCQkJICovCisJCQkJdWludDhfdCBkc3RNYWNbRVRIX0FMRU5dID0geyAwIH07CisJCQkJbWVtY3B5KCZkc3RNYWMsCisJCQkJICAgICAgICZidWZbV0xBTl9IRERfODAyMTFfRlJNX0RBX09GRlNFVF0sCisJCQkJICAgICAgIEVUSF9BTEVOKTsKKwkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAgICAgICIlczogRGVhdXRoL0Rpc2Fzc29jIHJlY2VpdmVkIGZvciBTVEE6IgorCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIsIF9fZnVuY19fLAorCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShkc3RNYWMpKTsKKwkJCQlnb3RvIGVycl9yZW1fY2hhbm5lbDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChOVUxMICE9IGNmZ1N0YXRlLT5idWYpIHsKKwkJaWYgKCFub2FjaykgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIiglcyk6UHJldmlvdXMgUDJQIEFjdGlvbiBmcmFtZSBwYWNrZXQgcGVuZGluZyIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJaGRkX2NsZWFudXBfYWN0aW9uZnJhbWUocEFkYXB0ZXItPnBIZGRDdHgsIHBBZGFwdGVyKTsKKwkJfSBlbHNlIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICIoJXMpOlBlbmRpbmcgQWN0aW9uIGZyYW1lIHBhY2tldCByZXR1cm4gRUJVU1kiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwlpZiAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQUNUSU9OKSB7CisJCWhkZExvZyhMT0cxLCAiQWN0aW9uIGZyYW1lIHR4IHJlcXVlc3QgOiAlcyIsCisJCSAgICAgICBoZGRfZ2V0X2FjdGlvbl9zdHJpbmcoYnVmCisJCQkJCSAgICAgW1dMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfT0ZGU0VUXSkpOworCX0KKworCWdvQWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihwQWRhcHRlci0+cEhkZEN0eCwgV0xBTl9IRERfUDJQX0dPKTsKKworCS8qIElmIEdPIGFkYXB0ZXIgZXhpc3RzIGFuZCBvcGVyYXRpbmcgb24gc2FtZSBmcmVxdWVuY3kgKi8KKwkvKiB0aGVuIHdlIHdpbGwgbm90IHJlcXVlc3QgcmVtYWluIG9uIGNoYW5uZWwgKi8KKwlpZiAoZ29BZGFwdGVyICYmIChpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoY2hhbi0+Y2VudGVyX2ZyZXEpCisJCQkgID09IGdvQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5vcGVyYXRpbmdDaGFubmVsKSkgeworCQkvKiBpZiBHTyBleGlzdCBhbmQgaXMgbm90IG9mZiBjaGFubmVsCisJCSAqIHdhaXQgdGltZSBzaG91bGQgYmUgemVybworCQkgKi8KKwkJd2FpdCA9IDA7CisJCWdvdG8gc2VuZF9mcmFtZTsKKwl9CisKKwlpZiAob2ZmY2hhbiAmJiB3YWl0KSB7CisJCWludCBzdGF0dXM7CisJCXJlbV9vbl9jaGFubmVsX3JlcXVlc3RfdHlwZV90IHJlcV90eXBlID0gT0ZGX0NIQU5ORUxfQUNUSU9OX1RYOworCQkvKiBJbiBjYXNlIG9mIFAyUCBDbGllbnQgbW9kZSBpZiB3ZSBhcmUgYWxyZWFkeSAqLworCQkvKiBvbiB0aGUgc2FtZSBjaGFubmVsIHRoZW4gc2VuZCB0aGUgZnJhbWUgZGlyZWN0bHkgKi8KKworCQltdXRleF9sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCQlwUmVtYWluQ2hhbkN0eCA9IGNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHg7CisJCWlmICgodHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpICYmCisJCSAgICAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQUNUSU9OKSAmJgorCQkgICAgaGRkX3AycF9pc19hY3Rpb25fdHlwZV9yc3AoJmJ1ZgorCQkJCQkgICAgICAgW1dMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfQk9EWV9PRkZTRVRdKQorCQkgICAgJiYgY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eAorCQkgICAgJiYgY2ZnU3RhdGUtPmN1cnJlbnRfZnJlcSA9PSBjaGFuLT5jZW50ZXJfZnJlcSkgeworCQkJaWYgKENERl9USU1FUl9TVEFURV9SVU5OSU5HID09CisJCQkgICAgY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKCZjZmdTdGF0ZS0+CisJCQkJCQkgICByZW1haW5fb25fY2hhbl9jdHgtPgorCQkJCQkJICAgaGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyKSkgeworCQkJCWNkZl9tY190aW1lcl9zdG9wKCZjZmdTdGF0ZS0+CisJCQkJCQkgIHJlbWFpbl9vbl9jaGFuX2N0eC0+CisJCQkJCQkgIGhkZF9yZW1haW5fb25fY2hhbl90aW1lcik7CisJCQkJc3RhdHVzID0KKwkJCQkJY2RmX21jX3RpbWVyX3N0YXJ0KCZjZmdTdGF0ZS0+CisJCQkJCQkJICAgcmVtYWluX29uX2NoYW5fY3R4LT4KKwkJCQkJCQkgICBoZGRfcmVtYWluX29uX2NoYW5fdGltZXIsCisJCQkJCQkJICAgd2FpdCk7CisJCQkJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJaGRkTG9nKExPR0UsCisJCQkJCSAgICAgICAiJXM6IFJlbWFpbiBvbiBDaGFubmVsIHRpbWVyIHN0YXJ0IGZhaWxlZCIsCisJCQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQkJfQorCQkJCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPgorCQkJCQkgICAgIHJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwkJCQlnb3RvIHNlbmRfZnJhbWU7CisJCQl9IGVsc2UgeworCQkJCWlmIChwUmVtYWluQ2hhbkN0eC0+CisJCQkJICAgIGhkZF9yZW1haW5fb25fY2hhbl9jYW5jZWxfaW5fcHJvZ3Jlc3MgPT0KKwkJCQkgICAgdHJ1ZSkgeworCQkJCQltdXRleF91bmxvY2soJmNmZ1N0YXRlLT4KKwkJCQkJCSAgICAgcmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCQkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSAgICAgICAiYWN0aW9uIGZyYW1lIHR4OiB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIFJPQyAiKTsKKworCQkJCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dAorCQkJCQkJICAgICAoJnBBZGFwdGVyLT5jYW5jZWxfcmVtX29uX2NoYW5fdmFyLAorCQkJCQkJICAgICBtc2Vjc190b19qaWZmaWVzCisJCQkJCQkJICAgICAoV0FJVF9DQU5DRUxfUkVNX0NIQU4pKTsKKwkJCQkJaWYgKCFyYykgeworCQkJCQkJaGRkTG9nKExPR0UsCisJCQkJCQkgICAgICAgIiVzOndhaXQgb24gY2FuY2VsX3JlbV9vbl9jaGFuX3ZhciB0aW1lZCBvdXQiLAorCQkJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCQkJfQorCisJCQkJfSBlbHNlCisJCQkJCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPgorCQkJCQkJICAgICByZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJCQl9CisJCX0gZWxzZQorCQkJbXV0ZXhfdW5sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCisJCWlmICgoY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eCAhPSBOVUxMKSAmJgorCQkgICAgKGNmZ1N0YXRlLT5jdXJyZW50X2ZyZXEgPT0gY2hhbi0+Y2VudGVyX2ZyZXEpCisJCSAgICApIHsKKwkJCWhkZExvZyhMT0cxLCAiYWN0aW9uIGZyYW1lOiBleHRlbmRpbmcgdGhlIHdhaXQgdGltZSIpOworCQkJZXh0ZW5kZWRXYWl0ID0gKHVpbnQxNl90KSB3YWl0OworCQkJZ290byBzZW5kX2ZyYW1lOworCQl9CisKKwkJSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5vZmZjaGFubmVsX3R4X2V2ZW50KTsKKworCQlzdGF0dXMgPSB3bGFuX2hkZF9yZXF1ZXN0X3JlbWFpbl9vbl9jaGFubmVsKHdpcGh5LCBkZXYsIGNoYW4sCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDgsIDApKQorCQkJCQkJCSAgICBjaGFubmVsX3R5cGUsCisjZW5kaWYKKwkJCQkJCQkgICAgd2FpdCwgY29va2llLAorCQkJCQkJCSAgICByZXFfdHlwZSk7CisJCWlmICgwICE9IHN0YXR1cykgeworCQkJaWYgKCgtRUJVU1kgPT0gc3RhdHVzKSAmJgorCQkJICAgIChjZmdTdGF0ZS0+Y3VycmVudF9mcmVxID09IGNoYW4tPmNlbnRlcl9mcmVxKSkgeworCQkJCWdvdG8gc2VuZF9mcmFtZTsKKwkJCX0KKwkJCWdvdG8gZXJyX3JlbV9jaGFubmVsOworCQl9CisJCS8qIFRoaXMgd2lsbCBleHRlbmQgdGltZXIgaW4gTElNIHdoZW4gc2VuZGluZyBBbnkgYWN0aW9uIGZyYW1lCisJCSAqIEl0IHdpbGwgY292ZXIgcmVtYWluIG9uIGNoYW5uZWwgdGltZXIgdGlsbCBuZXh0IGFjdGlvbiBmcmFtZQorCQkgKiBpbiByeCBkaXJlY3Rpb24uCisJCSAqLworCQlleHRlbmRlZFdhaXQgPSAodWludDE2X3QpIHdhaXQ7CisJCS8qIFdhaXQgZm9yIGRyaXZlciB0byBiZSByZWFkeSBvbiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwgKi8KKwkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnBBZGFwdGVyLT5vZmZjaGFubmVsX3R4X2V2ZW50LAorCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCQkgKFdBSVRfQ0hBTkdFX0NIQU5ORUxfRk9SX09GRkNIQU5ORUxfVFgpKTsKKwkJaWYgKCFyYykgeworCQkJaGRkTG9nKExPR0UsICJ3YWl0IG9uIG9mZmNoYW5uZWxfdHhfZXZlbnQgdGltZWQgb3V0Iik7CisJCQlnb3RvIGVycl9yZW1fY2hhbm5lbDsKKwkJfQorCX0gZWxzZSBpZiAob2ZmY2hhbikgeworCQkvKiBDaGVjayBiZWZvcmUgc2VuZGluZyBhY3Rpb24gZnJhbWUKKwkJICAgd2hldGhlciB3ZSBhbHJlYWR5IHJlbWFpbiBvbiBjaGFubmVsICovCisJCWlmIChOVUxMID09IGNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHgpIHsKKwkJCWdvdG8gZXJyX3JlbV9jaGFubmVsOworCQl9CisJfQorc2VuZF9mcmFtZToKKworCWlmICghbm9hY2spIHsKKwkJY2ZnU3RhdGUtPmJ1ZiA9IGNkZl9tZW1fbWFsbG9jKGxlbik7ICAgIC8qIGJ1ZjsgKi8KKwkJaWYgKGNmZ1N0YXRlLT5idWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWNmZ1N0YXRlLT5sZW4gPSBsZW47CisKKwkJY2RmX21lbV9jb3B5KGNmZ1N0YXRlLT5idWYsIGJ1ZiwgbGVuKTsKKworCQltdXRleF9sb2NrKCZjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCisJCWlmIChjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4KSB7CisJCQljZmdTdGF0ZS0+YWN0aW9uX2Nvb2tpZSA9CisJCQkJY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eC0+Y29va2llOworCQkJKmNvb2tpZSA9IGNmZ1N0YXRlLT5hY3Rpb25fY29va2llOworCQl9IGVsc2UgeworCQkJKmNvb2tpZSA9ICh1aW50cHRyX3QpIGNmZ1N0YXRlLT5idWY7CisJCQljZmdTdGF0ZS0+YWN0aW9uX2Nvb2tpZSA9ICpjb29raWU7CisJCX0KKworCQltdXRleF91bmxvY2soJmNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHhfbG9jayk7CisJfQorCisJLyoKKwkgKiBGaXJtd2FyZSBuZWVkcyBjaGFubmVsIGluZm9ybWF0aW9uIGZvciBhY3Rpb24gZnJhbWVzCisJICogd2hpY2ggYXJlIG5vdCBzZW50IG9uIHRoZSBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsIG9mIFZERVYKKwkgKi8KKwlpZiAoKFdMQU5fSEREX1AyUF9ERVZJQ0UgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSB8fAorCQkoV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJCShXTEFOX0hERF9QMlBfR08gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSkgeworCQlpZiAoY2hhbiAmJiAoY2hhbi0+Y2VudGVyX2ZyZXEgIT0gMCkpCisJCQljdXJyZW50X2ZyZXEgPSBjaGFuLT5jZW50ZXJfZnJlcTsKKwkJZWxzZQorCQkJY3VycmVudF9mcmVxID0gY2ZnU3RhdGUtPmN1cnJlbnRfZnJlcTsKKwl9IGVsc2UgeworCQljdXJyZW50X2ZyZXEgPSAwOworCX0KKworCWlmICgoV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisJICAgIChXTEFOX0hERF9QMlBfQ0xJRU5UID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkgICAgKFdMQU5fSEREX1AyUF9ERVZJQ0UgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorCSAgICApIHsKKwkJdWludDhfdCBzZXNzaW9uSWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCisJCWlmICgodHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpICYmCisJCSAgICAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQUNUSU9OKSAmJgorCQkgICAgKGJ1ZltXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX09GRlNFVF0gPT0KKwkJICAgICBXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FKSkgeworCQkJYWN0aW9uRnJtVHlwZSA9CisJCQkJYnVmW1dMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfVFlQRV9PRkZTRVRdOworCQkJaGRkTG9nKExPRzEsICJUeCBBY3Rpb24gRnJhbWUgJXUiLCBhY3Rpb25Gcm1UeXBlKTsKKwkJCWlmIChhY3Rpb25Gcm1UeXBlID09IFdMQU5fSEREX1BST1ZfRElTX1JFUSkgeworCQkJCWNmZ1N0YXRlLT5hY3Rpb25Gcm1TdGF0ZSA9CisJCQkJCUhERF9QRF9SRVFfQUNLX1BFTkRJTkc7CisJCQkJaGRkTG9nKExPRzEsICIlczogSEREX1BEX1JFUV9BQ0tfUEVORElORyIsCisJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCX0gZWxzZSBpZiAoYWN0aW9uRnJtVHlwZSA9PSBXTEFOX0hERF9HT19ORUdfUkVRKSB7CisJCQkJY2ZnU3RhdGUtPmFjdGlvbkZybVN0YXRlID0KKwkJCQkJSEREX0dPX05FR19SRVFfQUNLX1BFTkRJTkc7CisJCQkJaGRkTG9nKExPRzEsICIlczogSEREX0dPX05FR19SRVFfQUNLX1BFTkRJTkciLAorCQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQl9CisJCX0KKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCSAgICBzbWVfc2VuZF9hY3Rpb24oV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCSAgICBzZXNzaW9uSWQsIGJ1ZiwgbGVuLCBleHRlbmRlZFdhaXQsIG5vYWNrLAorCQkJCSAgICBjdXJyZW50X2ZyZXEpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogc21lX3NlbmRfYWN0aW9uIHJldHVybmVkIGZhaWwiLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZSBpZiAoV0xBTl9IRERfU09GVEFQID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSB8fAorCQkgICBXTEFOX0hERF9QMlBfR08gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSB7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJCSAgICB3bGFuc2FwX3NlbmRfYWN0aW9uKFdMQU5fSEREX0dFVF9TQVBfQ1RYX1BUUihwQWRhcHRlciksCisjZWxzZQorCQkgICAgd2xhbnNhcF9zZW5kX2FjdGlvbigoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT4KKwkJCQkJcGNkc19jb250ZXh0LAorI2VuZGlmCisJCQkJCWJ1ZiwgbGVuLCAwLCBjdXJyZW50X2ZyZXEpKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQlGTCgid2xhbnNhcF9zZW5kX2FjdGlvbiByZXR1cm5lZCBmYWlsIikpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlpZiAoIW5vYWNrKSB7CisJCWhkZF9zZW5kX2FjdGlvbl9jbmYocEFkYXB0ZXIsIGZhbHNlKTsKKwl9CisJcmV0dXJuIDA7CitlcnJfcmVtX2NoYW5uZWw6CisJKmNvb2tpZSA9ICh1aW50cHRyX3QpIGNmZ1N0YXRlOworCWNmZzgwMjExX21nbXRfdHhfc3RhdHVzKAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJCXBBZGFwdGVyLT5kZXYtPmllZWU4MDIxMV9wdHIsCisjZWxzZQorCQlwQWRhcHRlci0+ZGV2LAorI2VuZGlmCisJCSpjb29raWUsIGJ1ZiwgbGVuLCBmYWxzZSwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE0LCAwKSkKK2ludCB3bGFuX2hkZF9tZ210X3R4KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCSAgICAgc3RydWN0IGNmZzgwMjExX21nbXRfdHhfcGFyYW1zICpwYXJhbXMsIHU2NCAqY29va2llKQorI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKK2ludCB3bGFuX2hkZF9tZ210X3R4KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLCBib29sIG9mZmNoYW4sCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDgsIDApKQorCQkgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAorCQkgICAgIGJvb2wgY2hhbm5lbF90eXBlX3ZhbGlkLAorI2VuZGlmCisJCSAgICAgdW5zaWduZWQgaW50IHdhaXQsCisJCSAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCBub19jY2ssCisJCSAgICAgYm9vbCBkb250X3dhaXRfZm9yX2FjaywgdTY0ICpjb29raWUpCisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDMsIDApKQoraW50IHdsYW5faGRkX21nbXRfdHgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sIGJvb2wgb2ZmY2hhbiwKKwkJICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKKwkJICAgICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwgdW5zaWduZWQgaW50IHdhaXQsCisJCSAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCBub19jY2ssCisJCSAgICAgYm9vbCBkb250X3dhaXRfZm9yX2FjaywgdTY0ICpjb29raWUpCisjZWxzZQoraW50IHdsYW5faGRkX21nbXRfdHgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sIGJvb2wgb2ZmY2hhbiwKKwkJICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKKwkJICAgICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwgdW5zaWduZWQgaW50IHdhaXQsCisJCSAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgdTY0ICpjb29raWUpCisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFICovCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE0LCAwKSkKKwlyZXQgPSBfX3dsYW5faGRkX21nbXRfdHgod2lwaHksIHdkZXYsIHBhcmFtcy0+Y2hhbiwgcGFyYW1zLT5vZmZjaGFuLAorCQkJCSBwYXJhbXMtPndhaXQsIHBhcmFtcy0+YnVmLCBwYXJhbXMtPmxlbiwKKwkJCQkgcGFyYW1zLT5ub19jY2ssIHBhcmFtcy0+ZG9udF93YWl0X2Zvcl9hY2ssCisJCQkJIGNvb2tpZSk7CisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCXJldCA9IF9fd2xhbl9oZGRfbWdtdF90eCh3aXBoeSwgd2RldiwgY2hhbiwgb2ZmY2hhbiwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkpCisJCQkJIGNoYW5uZWxfdHlwZSwgY2hhbm5lbF90eXBlX3ZhbGlkLAorI2VuZGlmCisJCQkJIHdhaXQsIGJ1ZiwgbGVuLCBub19jY2ssCisJCQkJIGRvbnRfd2FpdF9mb3JfYWNrLCBjb29raWUpOworI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAzLCAwKSkKKwlyZXQgPSBfX3dsYW5faGRkX21nbXRfdHgod2lwaHksIGRldiwgY2hhbiwgb2ZmY2hhbiwKKwkJCQkgY2hhbm5lbF90eXBlLCBjaGFubmVsX3R5cGVfdmFsaWQsIHdhaXQsCisJCQkJIGJ1ZiwgbGVuLCBub19jY2ssIGRvbnRfd2FpdF9mb3JfYWNrLCBjb29raWUpOworI2Vsc2UKKwlyZXQgPSBfX3dsYW5faGRkX21nbXRfdHgod2lwaHksIGRldiwgY2hhbiwgb2ZmY2hhbiwKKwkJCQkgY2hhbm5lbF90eXBlLCBjaGFubmVsX3R5cGVfdmFsaWQsIHdhaXQsCisJCQkJIGJ1ZiwgbGVuLCBjb29raWUpOworI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSAqLworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQoraW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfbWdtdF90eF9jYW5jZWxfd2FpdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJICAgIHU2NCBjb29raWUpCit7CisJcmV0dXJuIHdsYW5faGRkX2NmZzgwMjExX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbCh3aXBoeSwgd2RldiwgY29va2llKTsKK30KKyNlbHNlCitpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9tZ210X3R4X2NhbmNlbF93YWl0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1NjQgY29va2llKQoreworCXJldHVybiB3bGFuX2hkZF9jZmc4MDIxMV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwod2lwaHksIGRldiwgY29va2llKTsKK30KKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9tZ210X3R4X2NhbmNlbF93YWl0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgdTY0IGNvb2tpZSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX21nbXRfdHhfY2FuY2VsX3dhaXQod2lwaHksIHdkZXYsIGNvb2tpZSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKyNlbHNlCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfbWdtdF90eF9jYW5jZWxfd2FpdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU2NCBjb29raWUpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9tZ210X3R4X2NhbmNlbF93YWl0KHdpcGh5LCBkZXYsIGNvb2tpZSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCit2b2lkIGhkZF9zZW5kX2FjdGlvbl9jbmYoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGJvb2wgYWN0aW9uU2VuZFN1Y2Nlc3MpCit7CisJaGRkX2NmZzgwMjExX3N0YXRlX3QgKmNmZ1N0YXRlID0gV0xBTl9IRERfR0VUX0NGR19TVEFURV9QVFIocEFkYXB0ZXIpOworCisJY2ZnU3RhdGUtPmFjdGlvbkZybVN0YXRlID0gSEREX0lETEU7CisKKwloZGRMb2coTE9HMSwgIlNlbmQgQWN0aW9uIGNuZiwgYWN0aW9uU2VuZFN1Y2Nlc3MgJWQiLAorCSAgICAgICBhY3Rpb25TZW5kU3VjY2Vzcyk7CisKKwlpZiAoTlVMTCA9PSBjZmdTdGF0ZS0+YnVmKSB7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIGJ1ZiBpcyB0aGUgc2FtZSBwb2ludGVyIGl0IHBhc3NlZCB1cyB0byBzZW5kLiBTaW5jZSB3ZSBhcmUgc2VuZGluZworCSAqIGl0IHRocm91Z2ggY29udHJvbCBwYXRoLCB3ZSB1c2UgZGlmZmVyZW50IGJ1ZmZlcnMuCisJICogSW4gY2FzZSBvZiBtYWM4MDIxMSwgdGhleSBqdXN0IHB1c2ggaXQgdG8gdGhlIHNrYiBhbmQgcGFzcyB0aGUgc2FtZQorCSAqIGRhdGEgd2hpbGUgc2VuZGluZyB0eCBhY2sgc3RhdHVzLgorCSAqICovCisJY2ZnODAyMTFfbWdtdF90eF9zdGF0dXMoCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwkJcEFkYXB0ZXItPmRldi0+aWVlZTgwMjExX3B0ciwKKyNlbHNlCisJCXBBZGFwdGVyLT5kZXYsCisjZW5kaWYKKwkJY2ZnU3RhdGUtPmFjdGlvbl9jb29raWUsCisJCWNmZ1N0YXRlLT5idWYsIGNmZ1N0YXRlLT5sZW4sCisJCWFjdGlvblNlbmRTdWNjZXNzLCBHRlBfS0VSTkVMKTsKKworCWNkZl9tZW1fZnJlZShjZmdTdGF0ZS0+YnVmKTsKKwljZmdTdGF0ZS0+YnVmID0gTlVMTDsKKworCWNvbXBsZXRlKCZwQWRhcHRlci0+dHhfYWN0aW9uX2NuZl9ldmVudCk7Cit9CisKKy8qKgorICogaGRkX3NldF9wMnBfbm9hCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBoZGRfaG9zdGFwZF9pb2N0bCBmdW5jdGlvbiB3aGVuIERyaXZlcgorICogZ2V0IFAyUF9TRVRfTk9BIGNvbWFuZCBmcm9tIHdwYV9zdXBwbGljYW50IHVzaW5nIHByaXZhdGUgaW9jdGwKKyAqCisgKioqTE9HSUM6CisgKiBGaWxsIE5vQSBTdHJ1Y3QgQWNjb3JkaW5nIHRvIFAyUCBQb3dlciBzYXZlIE9wdGlvbiBhbmQgUGFzcyBpdCB0byBTTUUgbGF5ZXIKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSBkZXYgICAgICAgICAgUG9pbnRlciB0byBuZXQgZGV2aWNlIHN0cnVjdHVyZQorICogQHBhcmFtIGNvbW1hbmQgICAgICBQb2ludGVyIHRvIGNvbW1hbmQKKyAqCisgKiBAcmV0dXJuIFN0YXR1cworICovCisKK2ludCBoZGRfc2V0X3AycF9ub2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDhfdCAqY29tbWFuZCkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwl0UDJwUHNDb25maWcgTm9BOworCWludCBjb3VudCwgZHVyYXRpb24sIHN0YXJ0X3RpbWU7CisJY2hhciAqcGFyYW07CisJaW50IHJldDsKKworCXBhcmFtID0gc3RybmNocihjb21tYW5kLCBzdHJsZW4oY29tbWFuZCksICcgJyk7CisJaWYgKHBhcmFtID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogc3RybmNociBmYWlsZWQgdG8gZmluZCBkZWxpbWV0ZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYXJhbSsrOworCXJldCA9IHNzY2FuZihwYXJhbSwgIiVkICVkICVkIiwgJmNvdW50LCAmc3RhcnRfdGltZSwgJmR1cmF0aW9uKTsKKwlpZiAocmV0ICE9IDMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogUDJQX1NFVCBHTyBOb0E6IGZhaWwgdG8gcmVhZCBwYXJhbXMsIHJldD0lZCIsCisJCQkgIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFAyUF9TRVQgR08gTm9BOiBjb3VudD0lZCBzdGFydF90aW1lPSVkIGR1cmF0aW9uPSVkIiwKKwkJICBfX2Z1bmNfXywgY291bnQsIHN0YXJ0X3RpbWUsIGR1cmF0aW9uKTsKKwlkdXJhdGlvbiA9IE1TX1RPX01VUyhkdXJhdGlvbik7CisJLyogUFMgU2VsZWN0aW9uCisJICogUGVyaW9kaWMgTm9BICgyKQorCSAqIFNpbmdsZSBOT0EgICAoNCkKKwkgKi8KKwlOb0Eub3BwX3BzID0gMDsKKwlOb0EuY3RXaW5kb3cgPSAwOworCWlmIChjb3VudCA9PSAxKSB7CisJCU5vQS5kdXJhdGlvbiA9IDA7CisJCU5vQS5zaW5nbGVfbm9hX2R1cmF0aW9uID0gZHVyYXRpb247CisJCU5vQS5wc1NlbGVjdGlvbiA9IFAyUF9QT1dFUl9TQVZFX1RZUEVfU0lOR0xFX05PQTsKKwl9IGVsc2UgeworCQlOb0EuZHVyYXRpb24gPSBkdXJhdGlvbjsKKwkJTm9BLnNpbmdsZV9ub2FfZHVyYXRpb24gPSAwOworCQlOb0EucHNTZWxlY3Rpb24gPSBQMlBfUE9XRVJfU0FWRV9UWVBFX1BFUklPRElDX05PQTsKKwl9CisJTm9BLmludGVydmFsID0gTVNfVE9fTVVTKDEwMCk7CisJTm9BLmNvdW50ID0gY291bnQ7CisJTm9BLnNlc3Npb25pZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUDJQX1BTX0FUVFI6b3BwUFMgJWQgY3RXaW5kb3cgJWQgZHVyYXRpb24gJWQgIgorCQkgICJpbnRlcnZhbCAlZCBjb3VudCAlZCBzaW5nbGUgbm9hIGR1cmF0aW9uICVkICIKKwkJICAiUHNTZWxlY3Rpb24gJXgiLCBfX2Z1bmNfXywgTm9BLm9wcF9wcywKKwkJICBOb0EuY3RXaW5kb3csIE5vQS5kdXJhdGlvbiwgTm9BLmludGVydmFsLAorCQkgIE5vQS5jb3VudCwgTm9BLnNpbmdsZV9ub2FfZHVyYXRpb24sIE5vQS5wc1NlbGVjdGlvbik7CisKKwlzbWVfcDJwX3NldF9wcyhoSGFsLCAmTm9BKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfc2V0X3AycF9vcHBzCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBoZGRfaG9zdGFwZF9pb2N0bCBmdW5jdGlvbiB3aGVuIERyaXZlcgorICogZ2V0IFAyUF9TRVRfUFMgY29tYW5kIGZyb20gd3BhX3N1cHBsaWNhbnQgdXNpbmcgcHJpdmF0ZSBpb2N0bAorICoKKyAqKipMT0dJQzoKKyAqIEZpbGwgTm9BIFN0cnVjdCBBY2NvcmRpbmcgdG8gUDJQIFBvd2VyIHNhdmUgT3B0aW9uIGFuZCBQYXNzIGl0IHRvIFNNRSBsYXllcgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBkZXYgICAgICAgICBQb2ludGVyIHRvIG5ldCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcGFyYW0gIGNvbW1hbmQgICAgIFBvaW50ZXIgdG8gY29tbWFuZAorICoKKyAqIEByZXR1cm4gU3RhdHVzCisgKi8KKworaW50IGhkZF9zZXRfcDJwX29wcHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDhfdCAqY29tbWFuZCkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwl0UDJwUHNDb25maWcgTm9BOworCWNoYXIgKnBhcmFtOworCWludCBsZWdhY3lfcHMsIG9wcF9wcywgY3R3aW5kb3c7CisJaW50IHJldDsKKworCXBhcmFtID0gc3RybmNocihjb21tYW5kLCBzdHJsZW4oY29tbWFuZCksICcgJyk7CisJaWYgKHBhcmFtID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogc3RybmNociBmYWlsZWQgdG8gZmluZCBkZWxpbWl0ZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYXJhbSsrOworCXJldCA9IHNzY2FuZihwYXJhbSwgIiVkICVkICVkIiwgJmxlZ2FjeV9wcywgJm9wcF9wcywgJmN0d2luZG93KTsKKwlpZiAocmV0ICE9IDMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogUDJQX1NFVCBHTyBQUzogZmFpbCB0byByZWFkIHBhcmFtcywgcmV0PSVkIiwKKwkJCSAgX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUDJQX1NFVCBHTyBQUzogbGVnYWN5X3BzPSVkIG9wcF9wcz0lZCBjdHdpbmRvdz0lZCIsCisJCSAgX19mdW5jX18sIGxlZ2FjeV9wcywgb3BwX3BzLCBjdHdpbmRvdyk7CisKKwkvKiBQUyBTZWxlY3Rpb24KKwkgKiBPcHBvcnR1bmlzdGljIFBvd2VyIFNhdmUgKDEpCisJICovCisKKwkvKiBGcm9tIHdwYV9jbGkgdXNlciBuZWVkIHRvIHVzZSBzZXBhcmF0ZSBjb21tYW5kIHRvIHNldCBjdFdpbmRvdyBhbmQgT3BwcworCSAqIFdoZW4gdXNlciB3YW50IHRvIHNldCBjdFdpbmRvdyBkdXJpbmcgdGhhdCB0aW1lIG90aGVyIHBhcmFtZXRlcnMKKwkgKiB2YWx1ZXMgYXJlIGNvbWluZyBmcm9tIHdwYV9zdXBwbGljYW50IGFzIC0xLgorCSAqIEV4YW1wbGUgOiBVc2VyIHdhbnQgdG8gc2V0IGN0V2luZG93IHdpdGggMzAgdGhlbiB3cGFfY2xpIGNvbW1hbmQgOgorCSAqIFAyUF9TRVQgY3R3aW5kb3cgMzAKKwkgKiBDb21tYW5kIFJlY2VpdmVkIGF0IGhkZF9ob3N0YXBkX2lvY3RsIGlzIGFzIGJlbG93OgorCSAqIFAyUF9TRVRfUFMgLTEgLTEgMzAgKGxlZ2FjeV9wcyA9IC0xLCBvcHBfcHMgPSAtMSwgY3R3aW5kb3cgPSAzMCkKKwkgKi8KKwlpZiAoY3R3aW5kb3cgIT0gLTEpIHsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiT3Bwb3J0dW5pc3RpYyBQb3dlciBTYXZlIGlzICVzIiwKKwkJCSAgKHRydWUgPT0gcEFkYXB0ZXItPm9wcykgPyAiRW5hYmxlIiA6ICJEaXNhYmxlIik7CisKKwkJaWYgKGN0d2luZG93ICE9IHBBZGFwdGVyLT5jdHcpIHsKKwkJCXBBZGFwdGVyLT5jdHcgPSBjdHdpbmRvdzsKKworCQkJaWYgKHBBZGFwdGVyLT5vcHMpIHsKKwkJCQlOb0Eub3BwX3BzID0gcEFkYXB0ZXItPm9wczsKKwkJCQlOb0EuY3RXaW5kb3cgPSBwQWRhcHRlci0+Y3R3OworCQkJCU5vQS5kdXJhdGlvbiA9IDA7CisJCQkJTm9BLnNpbmdsZV9ub2FfZHVyYXRpb24gPSAwOworCQkJCU5vQS5pbnRlcnZhbCA9IDA7CisJCQkJTm9BLmNvdW50ID0gMDsKKwkJCQlOb0EucHNTZWxlY3Rpb24gPQorCQkJCQlQMlBfUE9XRVJfU0FWRV9UWVBFX09QUE9SVFVOSVNUSUM7CisJCQkJTm9BLnNlc3Npb25pZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSAgIiVzOiBQMlBfUFNfQVRUUjpvcHBQUyAlZCBjdFdpbmRvdyAlZCBkdXJhdGlvbiAlZCAiCisJCQkJCSAgImludGVydmFsICVkIGNvdW50ICVkIHNpbmdsZSBub2EgZHVyYXRpb24gJWQgIgorCQkJCQkgICJQc1NlbGVjdGlvbiAleCIsIF9fZnVuY19fLAorCQkJCQkgIE5vQS5vcHBfcHMsIE5vQS5jdFdpbmRvdywKKwkJCQkJICBOb0EuZHVyYXRpb24sIE5vQS5pbnRlcnZhbCwgTm9BLmNvdW50LAorCQkJCQkgIE5vQS5zaW5nbGVfbm9hX2R1cmF0aW9uLAorCQkJCQkgIE5vQS5wc1NlbGVjdGlvbik7CisKKwkJCQlzbWVfcDJwX3NldF9wcyhoSGFsLCAmTm9BKTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKG9wcF9wcyAhPSAtMSkgeworCQlwQWRhcHRlci0+b3BzID0gb3BwX3BzOworCisJCWlmICgob3BwX3BzICE9IC0xKSAmJiAocEFkYXB0ZXItPmN0dykpIHsKKwkJCU5vQS5vcHBfcHMgPSBvcHBfcHM7CisJCQlOb0EuY3RXaW5kb3cgPSBwQWRhcHRlci0+Y3R3OworCQkJTm9BLmR1cmF0aW9uID0gMDsKKwkJCU5vQS5zaW5nbGVfbm9hX2R1cmF0aW9uID0gMDsKKwkJCU5vQS5pbnRlcnZhbCA9IDA7CisJCQlOb0EuY291bnQgPSAwOworCQkJTm9BLnBzU2VsZWN0aW9uID0gUDJQX1BPV0VSX1NBVkVfVFlQRV9PUFBPUlRVTklTVElDOworCQkJTm9BLnNlc3Npb25pZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiJXM6IFAyUF9QU19BVFRSOm9wcFBTICVkIGN0V2luZG93ICVkIGR1cmF0aW9uICVkICIKKwkJCQkgICJpbnRlcnZhbCAlZCBjb3VudCAlZCBzaW5nbGUgbm9hIGR1cmF0aW9uICVkICIKKwkJCQkgICJQc1NlbGVjdGlvbiAleCIsIF9fZnVuY19fLCBOb0Eub3BwX3BzLAorCQkJCSAgTm9BLmN0V2luZG93LCBOb0EuZHVyYXRpb24sIE5vQS5pbnRlcnZhbCwKKwkJCQkgIE5vQS5jb3VudCwgTm9BLnNpbmdsZV9ub2FfZHVyYXRpb24sCisJCQkJICBOb0EucHNTZWxlY3Rpb24pOworCisJCQlzbWVfcDJwX3NldF9wcyhoSGFsLCAmTm9BKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGhkZF9zZXRfcDJwX3BzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKm1zZ0RhdGEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFAycFBzQ29uZmlnIE5vQTsKKwlwMnBfYXBwX3NldFAycFBzX3QgKnBhcHBOb0EgPSAocDJwX2FwcF9zZXRQMnBQc190ICopIG1zZ0RhdGE7CisKKwlOb0Eub3BwX3BzID0gcGFwcE5vQS0+b3BwX3BzOworCU5vQS5jdFdpbmRvdyA9IHBhcHBOb0EtPmN0V2luZG93OworCU5vQS5kdXJhdGlvbiA9IHBhcHBOb0EtPmR1cmF0aW9uOworCU5vQS5pbnRlcnZhbCA9IHBhcHBOb0EtPmludGVydmFsOworCU5vQS5jb3VudCA9IHBhcHBOb0EtPmNvdW50OworCU5vQS5zaW5nbGVfbm9hX2R1cmF0aW9uID0gcGFwcE5vQS0+c2luZ2xlX25vYV9kdXJhdGlvbjsKKwlOb0EucHNTZWxlY3Rpb24gPSBwYXBwTm9BLT5wc1NlbGVjdGlvbjsKKwlOb0Euc2Vzc2lvbmlkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsKKworCXNtZV9wMnBfc2V0X3BzKGhIYWwsICZOb0EpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1aW50OF90IHdsYW5faGRkX2dldF9zZXNzaW9uX3R5cGUoZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKQoreworCXVpbnQ4X3Qgc2Vzc2lvblR5cGU7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQlzZXNzaW9uVHlwZSA9IFdMQU5fSEREX1NPRlRBUDsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CisJCXNlc3Npb25UeXBlID0gV0xBTl9IRERfUDJQX0dPOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CisJCXNlc3Npb25UeXBlID0gV0xBTl9IRERfUDJQX0NMSUVOVDsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlzZXNzaW9uVHlwZSA9IFdMQU5fSEREX0lORlJBX1NUQVRJT047CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlc3Npb25UeXBlID0gV0xBTl9IRERfSU5GUkFfU1RBVElPTjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNlc3Npb25UeXBlOworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA3LCAwKSkKK3N0cnVjdCB3aXJlbGVzc19kZXYgKl9fd2xhbl9oZGRfYWRkX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAorCQkJCQkJIHUzMiAqZmxhZ3MsCisJCQkJCQkgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKKyNlbGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCitzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpfX3dsYW5faGRkX2FkZF92aXJ0dWFsX2ludGYoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCSBjaGFyICpuYW1lLAorCQkJCQkJIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwKKwkJCQkJCSB1MzIgKmZsYWdzLAorCQkJCQkJIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpCisjZWxzZQorc3RydWN0IG5ldF9kZXZpY2UgKl9fd2xhbl9oZGRfYWRkX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjaGFyICpuYW1lLAorCQkJCQkgICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAorCQkJCQkgICAgICAgdTMyICpmbGFncywKKwkJCQkJICAgICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpCisjZW5kaWYKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKikgd2lwaHlfcHJpdih3aXBoeSk7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOworCWhkZF9zY2FuaW5mb190ICpzY2FuX2luZm8gPSBOVUxMOworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQUREX1ZJUlRVQUxfSU5URiwgTk9fU0VTU0lPTiwgdHlwZSkpOworCS8qCisJICogQWxsb3cgYWRkaXRpb24gbXVsdGlwbGUgaW50ZXJmYWNlIGZvciBXTEFOX0hERF9QMlBfQ0xJRU5UIGFuZAorCSAqIFdMQU5fSEREX1NPRlRBUCBzZXNzaW9uIHR5cGUuCisJICovCisJaWYgKChoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwgd2xhbl9oZGRfZ2V0X3Nlc3Npb25fdHlwZSh0eXBlKSkgIT0gTlVMTCkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJICAgICYmIFdMQU5fSEREX1NPRlRBUCAhPSB3bGFuX2hkZF9nZXRfc2Vzc2lvbl90eXBlKHR5cGUpCisjZW5kaWYKKwkgICAgJiYgV0xBTl9IRERfUDJQX0NMSUVOVCAhPSB3bGFuX2hkZF9nZXRfc2Vzc2lvbl90eXBlKHR5cGUpCisJICAgICYmIFdMQU5fSEREX0lORlJBX1NUQVRJT04gIT0gd2xhbl9oZGRfZ2V0X3Nlc3Npb25fdHlwZSh0eXBlKSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICIlczogSW50ZXJmYWNlIHR5cGUgJWQgYWxyZWFkeSBleGlzdHMuICIKKwkJICAgICAgICJUd28gaW50ZXJmYWNlcyBvZiBzYW1lIHR5cGUgYXJlIG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5LiIsCisJCSAgICAgICBfX2Z1bmNfXywgdHlwZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXdsYW5faGRkX3RkbHNfZGlzYWJsZV9vZmZjaGFuX2FuZF90ZWFyZG93bl9saW5rcyhwSGRkQ3R4KTsKKworCXBBZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKHBIZGRDdHgsIFdMQU5fSEREX0lORlJBX1NUQVRJT04pOworCWlmIChwQWRhcHRlciAhPSBOVUxMKSB7CisJCXNjYW5faW5mbyA9ICZwQWRhcHRlci0+c2Nhbl9pbmZvOworCQlpZiAoc2Nhbl9pbmZvLT5tU2NhblBlbmRpbmcpIHsKKwkJCWhkZF9hYm9ydF9tYWNfc2NhbihwSGRkQ3R4LCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJZUNTUl9TQ0FOX0FCT1JUX0RFRkFVTFQpOworCQkJaGRkTG9nKExPRzEsCisJCQkgICAgICAgRkwoIkFib3J0IFNjYW4gd2hpbGUgYWRkaW5nIHZpcnR1YWwgaW50ZXJmYWNlIikpOworCQl9CisJfQorCisJcEFkYXB0ZXIgPSBOVUxMOworCWlmIChwSGRkQ3R4LT5jb25maWctPmlzUDJwRGV2aWNlQWRkckFkbWluaXN0cmF0ZWQgJiYKKwkgICAgKChOTDgwMjExX0lGVFlQRV9QMlBfR08gPT0gdHlwZSkgfHwKKwkgICAgIChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UID09IHR5cGUpKSkgeworCQkvKgorCQkgKiBHZW5lcmF0ZSB0aGUgUDJQIEludGVyZmFjZSBBZGRyZXNzLiB0aGlzIGFkZHJlc3MgbXVzdCBiZQorCQkgKiBkaWZmZXJlbnQgZnJvbSB0aGUgUDJQIERldmljZSBBZGRyZXNzLgorCQkgKi8KKwkJc3RydWN0IGNkZl9tYWNfYWRkciBwMnBEZXZpY2VBZGRyZXNzID0KKwkJCQkJCXBIZGRDdHgtPnAycERldmljZUFkZHJlc3M7CisJCXAycERldmljZUFkZHJlc3MuYnl0ZXNbNF0gXj0gMHg4MDsKKwkJcEFkYXB0ZXIgPSBoZGRfb3Blbl9hZGFwdGVyKHBIZGRDdHgsCisJCQkJCSAgICB3bGFuX2hkZF9nZXRfc2Vzc2lvbl90eXBlKHR5cGUpLAorCQkJCQkgICAgbmFtZSwgcDJwRGV2aWNlQWRkcmVzcy5ieXRlcywgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJcEFkYXB0ZXIgPQorCQkJaGRkX29wZW5fYWRhcHRlcihwSGRkQ3R4LCB3bGFuX2hkZF9nZXRfc2Vzc2lvbl90eXBlKHR5cGUpLAorCQkJCQkgbmFtZSwgd2xhbl9oZGRfZ2V0X2ludGZfYWRkcihwSGRkQ3R4KSwKKwkJCQkJIHRydWUpOworCX0KKworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogaGRkX29wZW5fYWRhcHRlciBmYWlsZWQiLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKKwl9CisJRVhJVCgpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJcmV0dXJuIHBBZGFwdGVyLT5kZXYtPmllZWU4MDIxMV9wdHI7CisjZWxzZQorCXJldHVybiBwQWRhcHRlci0+ZGV2OworI2VuZGlmCit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDcsIDApKQorc3RydWN0IHdpcmVsZXNzX2RldiAqd2xhbl9oZGRfYWRkX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwKKwkJCQkJICAgICAgIHUzMiAqZmxhZ3MsCisJCQkJCSAgICAgICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXdkZXYgPSBfX3dsYW5faGRkX2FkZF92aXJ0dWFsX2ludGYod2lwaHksIG5hbWUsIHR5cGUsIGZsYWdzLCBwYXJhbXMpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXR1cm4gd2RldjsKK30KKyNlbGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCitzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3bGFuX2hkZF9hZGRfdmlydHVhbF9pbnRmKHN0cnVjdCB3aXBoeSAqd2lwaHksIGNoYXIgKm5hbWUsCisJCQkJCSAgICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCisJCQkJCSAgICAgICB1MzIgKmZsYWdzLAorCQkJCQkgICAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwl3ZGV2ID0gX193bGFuX2hkZF9hZGRfdmlydHVhbF9pbnRmKHdpcGh5LCBuYW1lLCB0eXBlLCBmbGFncywgcGFyYW1zKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0dXJuIHdkZXY7Cit9CisjZWxzZQorc3RydWN0IG5ldF9kZXZpY2UgKndsYW5faGRkX2FkZF92aXJ0dWFsX2ludGYoc3RydWN0IHdpcGh5ICp3aXBoeSwgY2hhciAqbmFtZSwKKwkJCQkJICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCisJCQkJCSAgICAgdTMyICpmbGFncywKKwkJCQkJICAgICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwluZGV2ID0gX193bGFuX2hkZF9hZGRfdmlydHVhbF9pbnRmKHdpcGh5LCBuYW1lLCB0eXBlLCBmbGFncywgcGFyYW1zKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0dXJuIG5kZXY7Cit9CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCitpbnQgX193bGFuX2hkZF9kZWxfdmlydHVhbF9pbnRmKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCisjZWxzZQoraW50IF9fd2xhbl9oZGRfZGVsX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorI2VuZGlmCit7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OworI2VuZGlmCisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopIHdpcGh5X3ByaXYod2lwaHkpOworCWhkZF9hZGFwdGVyX3QgKnBWaXJ0QWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWludCBzdGF0dXM7CisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9ERUxfVklSVFVBTF9JTlRGLAorCQkJIHBWaXJ0QWRhcHRlci0+c2Vzc2lvbklkLCBwVmlydEFkYXB0ZXItPmRldmljZV9tb2RlKSk7CisJaGRkTG9nKExPRzEsIEZMKCJEZXZpY2VfbW9kZSAlcyglZCkiKSwKKwkgICAgICAgaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhwVmlydEFkYXB0ZXItPmRldmljZV9tb2RlKSwKKwkgICAgICAgcFZpcnRBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwl3bGFuX2hkZF9yZWxlYXNlX2ludGZfYWRkcihwSGRkQ3R4LAorCQkJCSAgIHBWaXJ0QWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMpOworCisJaGRkX3N0b3BfYWRhcHRlcihwSGRkQ3R4LCBwVmlydEFkYXB0ZXIsIHRydWUpOworCWhkZF9jbG9zZV9hZGFwdGVyKHBIZGRDdHgsIHBWaXJ0QWRhcHRlciwgdHJ1ZSk7CisJRVhJVCgpOworCXJldHVybiAwOworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKK2ludCB3bGFuX2hkZF9kZWxfdmlydHVhbF9pbnRmKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCisjZWxzZQoraW50IHdsYW5faGRkX2RlbF92aXJ0dWFsX2ludGYoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKyNlbmRpZgoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJcmV0ID0gX193bGFuX2hkZF9kZWxfdmlydHVhbF9pbnRmKHdpcGh5LCB3ZGV2KTsKKyNlbHNlCisJcmV0ID0gX193bGFuX2hkZF9kZWxfdmlydHVhbF9pbnRmKHdpcGh5LCBkZXYpOworI2VuZGlmCisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBoZGRfaW5kaWNhdGVfbWdtdF9mcmFtZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCSAgICAgdWludDMyX3QgbkZyYW1lTGVuZ3RoLAorCQkJICAgICB1aW50OF90ICpwYkZyYW1lcywKKwkJCSAgICAgdWludDhfdCBmcmFtZVR5cGUsIHVpbnQzMl90IHJ4Q2hhbiwgaW50OF90IHJ4UnNzaSkKK3sKKwl1aW50MTZfdCBmcmVxOworCXVpbnQxNl90IGV4dGVuZF90aW1lOworCXVpbnQ4X3QgdHlwZSA9IDA7CisJdWludDhfdCBzdWJUeXBlID0gMDsKKwl0QWN0aW9uRnJtVHlwZSBhY3Rpb25Gcm1UeXBlOworCWhkZF9jZmc4MDIxMV9zdGF0ZV90ICpjZmdTdGF0ZSA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaGRkX3JlbWFpbl9vbl9jaGFuX2N0eF90ICpwUmVtYWluQ2hhbkN0eCA9IE5VTEw7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBGcmFtZSBUeXBlID0gJWQgRnJhbWUgTGVuZ3RoID0gJWQiLAorCSAgICAgICBfX2Z1bmNfXywgZnJhbWVUeXBlLCBuRnJhbWVMZW5ndGgpOworCisJaWYgKE5VTEwgPT0gcEFkYXB0ZXIpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwQWRhcHRlciBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCWlmICgwID09IG5GcmFtZUxlbmd0aCkgeworCQloZGRMb2coTE9HRSwgRkwoIkZyYW1lIExlbmd0aCBpcyBJbnZhbGlkIFpFUk8iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTlVMTCA9PSBwYkZyYW1lcykgeworCQloZGRMb2coTE9HRSwgRkwoInBiRnJhbWVzIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwl0eXBlID0gV0xBTl9IRERfR0VUX1RZUEVfRlJNX0ZDKHBiRnJhbWVzWzBdKTsKKwlzdWJUeXBlID0gV0xBTl9IRERfR0VUX1NVQlRZUEVfRlJNX0ZDKHBiRnJhbWVzWzBdKTsKKworCS8qIEdldCBwQWRhcHRlciBmcm9tIERlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZSAqLworCWlmICgodHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpICYmIChzdWJUeXBlICE9IFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpKSB7CisJCXBBZGFwdGVyID0KKwkJCWhkZF9nZXRfYWRhcHRlcl9ieV9tYWNhZGRyKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpLAorCQkJCQkJICAgJnBiRnJhbWVzCisJCQkJCQkgICBbV0xBTl9IRERfODAyMTFfRlJNX0RBX09GRlNFVF0pOworCQlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQkJLyoKKwkJCSAqIFVuZGVyIGFzc3VtdGlvbiB0aGF0IHdlIGRvbid0IHJlY2VpdmUgYW55IGFjdGlvbgorCQkJICogZnJhbWUgd2l0aCBCQ1NUIGFzIGRlc3RpbmF0aW9uLAorCQkJICogd2UgYXJlIGRyb3BwaW5nIGFjdGlvbiBmcmFtZQorCQkJICovCisJCQloZGRMb2coTE9HUCwKKwkJCSAgICAgICAicEFkYXB0ZXIgZm9yIGFjdGlvbiBmcmFtZSBpcyBOVUxMIE1hY2FkZHIgPSAiCisJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSLAorCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKCZwYkZyYW1lcworCQkJCQkgICAgICBbV0xBTl9IRERfODAyMTFfRlJNX0RBX09GRlNFVF0pKTsKKwkJCWhkZExvZyhMT0dQLAorCQkJICAgICAgIEZMKCJGcmFtZSBUeXBlID0gJWQgRnJhbWUgTGVuZ3RoID0gJWQgc3ViVHlwZSA9ICVkIiksCisJCQkJZnJhbWVUeXBlLCBuRnJhbWVMZW5ndGgsIHN1YlR5cGUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKE5VTEwgPT0gcEFkYXB0ZXItPmRldikgeworCQloZGRMb2coTE9HRSwgRkwoInBBZGFwdGVyLT5kZXYgaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IHBBZGFwdGVyLT5tYWdpYykgeworCQloZGRMb2coTE9HRSwgRkwoInBBZGFwdGVyIGhhcyBpbnZhbGlkIG1hZ2ljIikpOworCQlyZXR1cm47CisJfQorCisJLyogQ2hhbm5lbCBpbmRpY2F0ZWQgbWF5IGJlIHdyb25nLiBUT0RPICovCisJLyogSW5kaWNhdGUgYW4gYWN0aW9uIGZyYW1lLiAqLworCWlmIChyeENoYW4gPD0gTUFYX05PX09GXzJfNF9DSEFOTkVMUykKKwkJZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShyeENoYW4sCisJCQkJCQkgICAgICBJRUVFODAyMTFfQkFORF8yR0haKTsKKwllbHNlCisJCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kocnhDaGFuLAorCQkJCQkJICAgICAgSUVFRTgwMjExX0JBTkRfNUdIWik7CisKKwljZmdTdGF0ZSA9IFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKworCWlmICgodHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpICYmIChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9BQ1RJT04pKSB7CisJCWlmIChwYkZyYW1lc1tXTEFOX0hERF9QVUJMSUNfQUNUSU9OX0ZSQU1FX09GRlNFVF0gPT0KKwkJICAgIFdMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUUpIHsKKwkJCS8qIFB1YmxpYyBhY3Rpb24gZnJhbWUgKi8KKwkJCWlmICgocGJGcmFtZXNbV0xBTl9IRERfUFVCTElDX0FDVElPTl9GUkFNRV9PRkZTRVQgKyAxXQorCQkJICAgICA9PSBTSVJfTUFDX0FDVElPTl9WRU5ET1JfU1BFQ0lGSUMpICYmCisJCQkgICAgY2RmX21lbV9jb21wYXJlKCZwYkZyYW1lcworCQkJCQkgICAgW1dMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfT0ZGU0VUCisJCQkJCSAgICAgKyAyXSwgU0lSX01BQ19QMlBfT1VJLAorCQkJCQkgICAgU0lSX01BQ19QMlBfT1VJX1NJWkUpKSB7CisJCQkvKiBQMlAgYWN0aW9uIGZyYW1lcyAqLworCQkJCXU4ICptYWNGcm9tID0KKwkJCQkJJnBiRnJhbWVzW1dMQU5fSEREXzgwMjExX0ZSTV9EQV9PRkZTRVQgKyA2XTsKKwkJCQlhY3Rpb25Gcm1UeXBlID0KKwkJCQkJcGJGcmFtZXMKKwkJCQkJW1dMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfVFlQRV9PRkZTRVRdOworCQkJCWhkZExvZyhMT0cxLCAiUnggQWN0aW9uIEZyYW1lICV1IiwKKwkJCQkgICAgICAgYWN0aW9uRnJtVHlwZSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9ERUJVRworCQkJCWlmIChhY3Rpb25Gcm1UeXBlID49IE1BWF9QMlBfQUNUSU9OX0ZSQU1FX1RZUEUpIHsKKwkJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAgICAgICJbUDJQXSB1bmtub3duWyVkXSA8LS0tIE9UQSIKKwkJCQkJICAgICAgICIgZnJvbSAiIE1BQ19BRERSRVNTX1NUUiwKKwkJCQkJICAgICAgIGFjdGlvbkZybVR5cGUsCisJCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShtYWNGcm9tKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAgICAgICJbUDJQXSAlcyA8LS0tIE9UQSIgIiBmcm9tICIKKwkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiwKKwkJCQkJICAgICAgIHAycF9hY3Rpb25fZnJhbWVfdHlwZQorCQkJCQkgICAgICAgW2FjdGlvbkZybVR5cGVdLAorCQkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkobWFjRnJvbSkpOworCQkJCQlpZiAoKGFjdGlvbkZybVR5cGUgPT0KKwkJCQkJICAgICBXTEFOX0hERF9QUk9WX0RJU19SRVEpCisJCQkJCSAgICAmJiAoZ2xvYmFsX3AycF9jb25uZWN0aW9uX3N0YXR1cyA9PQorCQkJCQkJUDJQX05PVF9BQ1RJVkUpKSB7CisJCQkJCQlnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID0KKwkJCQkJCQlQMlBfR09fTkVHX1BST0NFU1M7CisJCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJCSAgICAgICAiW1AyUCBTdGF0ZV1JbmFjdGl2ZSBzdGF0ZSB0byAiCisJCQkJCQkgICAgICAgIkdPIG5lZ290aWF0aW9uIHByb2dyZXNzIHN0YXRlIik7CisJCQkJCX0gZWxzZQorCQkJCQlpZiAoKGFjdGlvbkZybVR5cGUgPT0KKwkJCQkJICAgICBXTEFOX0hERF9HT19ORUdfQ05GKQorCQkJCQkgICAgJiYgKGdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXMgPT0KKwkJCQkJCVAyUF9HT19ORUdfUFJPQ0VTUykpIHsKKwkJCQkJCWdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXMgPQorCQkJCQkJCVAyUF9HT19ORUdfQ09NUExFVEVEOworCQkJCQkJaGRkTG9nKExPR0UsCisJCQkJCQkgICAgICAgIltQMlAgU3RhdGVdR08gbmVnb3RpYXRpb24gcHJvZ3Jlc3MgdG8gIgorCQkJCQkJICAgICAgICJHTyBuZWdvdGlhdGlvbiBjb21wbGV0ZWQgc3RhdGUiKTsKKwkJCQkJfSBlbHNlCisJCQkJCWlmICgoYWN0aW9uRnJtVHlwZSA9PQorCQkJCQkgICAgIFdMQU5fSEREX0lOVklUQVRJT05fUkVRKQorCQkJCQkgICAgJiYgKGdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXMgPT0KKwkJCQkJCVAyUF9OT1RfQUNUSVZFKSkgeworCQkJCQkJZ2xvYmFsX3AycF9jb25uZWN0aW9uX3N0YXR1cyA9CisJCQkJCQkJUDJQX0dPX05FR19DT01QTEVURUQ7CisJCQkJCQloZGRMb2coTE9HRSwKKwkJCQkJCSAgICAgICAiW1AyUCBTdGF0ZV1JbmFjdGl2ZSBzdGF0ZSB0byBHTyBuZWdvdGlhdGlvbiIKKwkJCQkJCSAgICAgICAiIGNvbXBsZXRlZCBzdGF0ZSBBdXRvbm9tb3VzIEdPIGZvcm1hdGlvbiIpOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQkJbXV0ZXhfbG9jaygmY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwkJCQlwUmVtYWluQ2hhbkN0eCA9IGNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHg7CisJCQkJaWYgKHBSZW1haW5DaGFuQ3R4ICE9IE5VTEwpIHsKKwkJCQkJaWYgKGFjdGlvbkZybVR5cGUgPT0gV0xBTl9IRERfR09fTkVHX1JFUQorCQkJCQkgICAgfHwgYWN0aW9uRnJtVHlwZSA9PQorCQkJCQkgICAgV0xBTl9IRERfR09fTkVHX1JFU1AKKwkJCQkJICAgIHx8IGFjdGlvbkZybVR5cGUgPT0KKwkJCQkJICAgIFdMQU5fSEREX0lOVklUQVRJT05fUkVRCisJCQkJCSAgICB8fCBhY3Rpb25Gcm1UeXBlID09CisJCQkJCSAgICBXTEFOX0hERF9ERVZfRElTX1JFUQorCQkJCQkgICAgfHwgYWN0aW9uRnJtVHlwZSA9PQorCQkJCQkgICAgV0xBTl9IRERfUFJPVl9ESVNfUkVRKSB7CisJCQkJCQloZGRMb2coTE9HMSwKKwkJCQkJCSAgICAgICAiRXh0ZW5kIFJvQyB0aW1lciBvbiByZWNlcHRpb24gb2YgQWN0aW9uIEZyYW1lIik7CisKKwkJCQkJCWlmICgoYWN0aW9uRnJtVHlwZSA9PQorCQkJCQkJICAgICBXTEFOX0hERF9HT19ORUdfUkVRKQorCQkJCQkJICAgIHx8IChhY3Rpb25Gcm1UeXBlID09CisJCQkJCQkJV0xBTl9IRERfR09fTkVHX1JFU1ApKQorCQkJCQkJCWV4dGVuZF90aW1lID0KKwkJCQkJCQkJMiAqCisJCQkJCQkJCUFDVElPTl9GUkFNRV9ERUZBVUxUX1dBSVQ7CisJCQkJCQllbHNlCisJCQkJCQkJZXh0ZW5kX3RpbWUgPQorCQkJCQkJCQlBQ1RJT05fRlJBTUVfREVGQVVMVF9XQUlUOworCisJCQkJCQlpZiAoY29tcGxldGlvbl9kb25lCisJCQkJCQkJICAgICgmcEFkYXB0ZXItPgorCQkJCQkJCSAgICByZW1fb25fY2hhbl9yZWFkeV9ldmVudCkpIHsKKwkJCQkJCQlpZiAoQ0RGX1RJTUVSX1NUQVRFX1JVTk5JTkcgPT0gY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKCZwUmVtYWluQ2hhbkN0eC0+aGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyKSkgeworCQkJCQkJCQljZGZfbWNfdGltZXJfc3RvcAorCQkJCQkJCQkJKCZwUmVtYWluQ2hhbkN0eC0+CisJCQkJCQkJCQloZGRfcmVtYWluX29uX2NoYW5fdGltZXIpOworCQkJCQkJCQlzdGF0dXMgPQorCQkJCQkJCQkJY2RmX21jX3RpbWVyX3N0YXJ0CisJCQkJCQkJCQkJKCZwUmVtYWluQ2hhbkN0eC0+CisJCQkJCQkJCQkJaGRkX3JlbWFpbl9vbl9jaGFuX3RpbWVyLAorCQkJCQkJCQkJCWV4dGVuZF90aW1lKTsKKwkJCQkJCQkJaWYgKHN0YXR1cyAhPQorCQkJCQkJCQkgICAgQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJCQkJCQloZGRMb2cKKwkJCQkJCQkJCQkoTE9HRSwKKwkJCQkJCQkJCQkiJXM6IFJlbWFpbiBvbiBDaGFubmVsIHRpbWVyIHN0YXJ0IGZhaWxlZCIsCisJCQkJCQkJCQkJX19mdW5jX18pOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaGRkTG9nKExPRzEsCisJCQkJCQkJCSAgICAgICAiJXM6IFJjdmQgYWN0aW9uIGZyYW1lIGFmdGVyIHRpbWVyIGV4cGlyZWQiLAorCQkJCQkJCQkgICAgICAgX19mdW5jX18pOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLyogQnVmZmVyIFBhY2tldCAqLworCQkJCQkJCWlmIChwUmVtYWluQ2hhbkN0eC0+CisJCQkJCQkJICAgIGFjdGlvbl9wa3RfYnVmZi4KKwkJCQkJCQkgICAgZnJhbWVfbGVuZ3RoID09IDApIHsKKwkJCQkJCQkJcFJlbWFpbkNoYW5DdHgtPgorCQkJCQkJCQlhY3Rpb25fcGt0X2J1ZmYuCisJCQkJCQkJCWZyYW1lX2xlbmd0aAorCQkJCQkJCQkJPQorCQkJCQkJCQkJCW5GcmFtZUxlbmd0aDsKKwkJCQkJCQkJcFJlbWFpbkNoYW5DdHgtPgorCQkJCQkJCQlhY3Rpb25fcGt0X2J1ZmYuCisJCQkJCQkJCWZyZXEgPSBmcmVxOworCQkJCQkJCQlwUmVtYWluQ2hhbkN0eC0+CisJCQkJCQkJCWFjdGlvbl9wa3RfYnVmZi4KKwkJCQkJCQkJZnJhbWVfcHRyID0KKwkJCQkJCQkJCWNkZl9tZW1fbWFsbG9jCisJCQkJCQkJCQkJKG5GcmFtZUxlbmd0aCk7CisJCQkJCQkJCWNkZl9tZW1fY29weQorCQkJCQkJCQkJKHBSZW1haW5DaGFuQ3R4LT4KKwkJCQkJCQkJCWFjdGlvbl9wa3RfYnVmZi4KKwkJCQkJCQkJCWZyYW1lX3B0ciwKKwkJCQkJCQkJCXBiRnJhbWVzLAorCQkJCQkJCQkJbkZyYW1lTGVuZ3RoKTsKKwkJCQkJCQkJaGRkTG9nKExPR0UsCisJCQkJCQkJCSAgICAgICAiJXM6IgorCQkJCQkJCQkgICAgICAgIkFjdGlvbiBQa3QgQ2FjaGVkIHN1Y2Nlc3NmdWxseSAhISEiLAorCQkJCQkJCQkgICAgICAgX19mdW5jX18pOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWhkZExvZyhMT0dFLAorCQkJCQkJCQkgICAgICAgIiVzOiIKKwkJCQkJCQkJICAgICAgICJGcmFtZXMgYXJlIHBlbmRpbmcuIGRyb3BwaW5nIGZyYW1lICEhISIsCisJCQkJCQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQkJCQkJfQorCQkJCQkJCW11dGV4X3VubG9jaygmY2ZnU3RhdGUtPgorCQkJCQkJCQkgICAgIHJlbWFpbl9vbl9jaGFuX2N0eF9sb2NrKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJbXV0ZXhfdW5sb2NrKCZjZmdTdGF0ZS0+CisJCQkJCSAgICAgcmVtYWluX29uX2NoYW5fY3R4X2xvY2spOworCisJCQkJaWYgKCgoYWN0aW9uRnJtVHlwZSA9PSBXTEFOX0hERF9QUk9WX0RJU19SRVNQKQorCQkJCSAgICAgJiYgKGNmZ1N0YXRlLT5hY3Rpb25Gcm1TdGF0ZSA9PQorCQkJCQkgSEREX1BEX1JFUV9BQ0tfUEVORElORykpCisJCQkJICAgIHx8ICgoYWN0aW9uRnJtVHlwZSA9PSBXTEFOX0hERF9HT19ORUdfUkVTUCkKKwkJCQkJJiYgKGNmZ1N0YXRlLT5hY3Rpb25Gcm1TdGF0ZSA9PQorCQkJCQkgICAgSEREX0dPX05FR19SRVFfQUNLX1BFTkRJTkcpKSkgeworCQkJCQloZGRMb2coTE9HMSwKKwkJCQkJICAgICAgICIlczogQUNLX1BFTkRJTkcgYW5kIEJ1dCByZWNlaXZlZCBSRVNQIGZvciBBY3Rpb24gZnJhbWUgIiwKKwkJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCQkJaGRkX3NlbmRfYWN0aW9uX2NuZihwQWRhcHRlciwgdHJ1ZSk7CisJCQkJfQorCQkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJCQllbHNlIGlmIChwYkZyYW1lcworCQkJCSBbV0xBTl9IRERfUFVCTElDX0FDVElPTl9GUkFNRV9PRkZTRVQgKyAxXSA9PQorCQkJCSBXTEFOX0hERF9QVUJMSUNfQUNUSU9OX1RETFNfRElTQ19SRVNQKSB7CisJCQkJdTggKm1hYyA9CisJCQkJCSZwYkZyYW1lc1tXTEFOX0hERF84MDIxMV9GUk1fREFfT0ZGU0VUICsgNl07CisKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgIltURExTXSBURExTIERpc2NvdmVyeSBSZXNwb25zZSwiCisJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiAiIFJTU0lbJWRdIDwtLS0gT1RBIiwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkobWFjKSwgcnhSc3NpKTsKKworCQkJCXdsYW5faGRkX3RkbHNfc2V0X3Jzc2kocEFkYXB0ZXIsIG1hYywgcnhSc3NpKTsKKwkJCQl3bGFuX2hkZF90ZGxzX3JlY3ZfZGlzY292ZXJ5X3Jlc3AocEFkYXB0ZXIsCisJCQkJCQkJCSAgbWFjKTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJaWYgKHBiRnJhbWVzW1dMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfT0ZGU0VUXSA9PQorCQkgICAgV0xBTl9IRERfVERMU19BQ1RJT05fRlJBTUUpIHsKKwkJCWFjdGlvbkZybVR5cGUgPQorCQkJCXBiRnJhbWVzW1dMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfT0ZGU0VUICsgMV07CisJCQlpZiAoYWN0aW9uRnJtVHlwZSA+PSBNQVhfVERMU19BQ1RJT05fRlJBTUVfVFlQRSkgeworCQkJCWhkZExvZyhMT0cxLAorCQkJCSAgICAgICAiW1RETFNdIHVua25vd25bJWRdIDwtLS0gT1RBIiwKKwkJCQkgICAgICAgYWN0aW9uRnJtVHlwZSk7CisJCQl9IGVsc2UgeworCQkJCWhkZExvZyhMT0cxLAorCQkJCSAgICAgICAiW1RETFNdICVzIDwtLS0gT1RBIiwKKwkJCQkgICAgICAgdGRsc19hY3Rpb25fZnJhbWVfdHlwZVthY3Rpb25Gcm1UeXBlXSk7CisJCQl9CisJCX0KKworCQlpZiAoKHBiRnJhbWVzW1dMQU5fSEREX1BVQkxJQ19BQ1RJT05fRlJBTUVfT0ZGU0VUXSA9PQorCQkgICAgIFdMQU5fSEREX1FPU19BQ1RJT05fRlJBTUUpCisJCSAgICAmJiAocGJGcmFtZXNbV0xBTl9IRERfUFVCTElDX0FDVElPTl9GUkFNRV9PRkZTRVQgKyAxXSA9PQorCQkJV0xBTl9IRERfUU9TX01BUF9DT05GSUdVUkUpKSB7CisJCQlzbWVfdXBkYXRlX2RzY19wdG9fdXBfbWFwcGluZyhwSGRkQ3R4LT5oSGFsLAorCQkJCQkJICAgICAgcEFkYXB0ZXItPmhkZFdtbURzY3BUb1VwTWFwLAorCQkJCQkJICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCX0KKwl9CisJLyogSW5kaWNhdGUgRnJhbWUgT3ZlciBOb3JtYWwgSW50ZXJmYWNlICovCisJaGRkTG9nKExPRzEsIEZMKCJJbmRpY2F0ZSBGcmFtZSBvdmVyIE5MODAyMTEgSW50ZXJmYWNlIikpOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxOCwgMCkpCisJY2ZnODAyMTFfcnhfbWdtdChwQWRhcHRlci0+ZGV2LT5pZWVlODAyMTFfcHRyLCBmcmVxLCAwLCBwYkZyYW1lcywKKwkJCSBuRnJhbWVMZW5ndGgsIE5MODAyMTFfUlhNR01UX0ZMQUdfQU5TV0VSRUQpOworI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxMiwgMCkpCisJY2ZnODAyMTFfcnhfbWdtdChwQWRhcHRlci0+ZGV2LT5pZWVlODAyMTFfcHRyLCBmcmVxLCAwLCBwYkZyYW1lcywKKwkJCSBuRnJhbWVMZW5ndGgsIE5MODAyMTFfUlhNR01UX0ZMQUdfQU5TV0VSRUQsCisJCQkgR0ZQX0FUT01JQyk7CisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCWNmZzgwMjExX3J4X21nbXQocEFkYXB0ZXItPmRldi0+aWVlZTgwMjExX3B0ciwgZnJlcSwgMCwKKwkJCSBwYkZyYW1lcywgbkZyYW1lTGVuZ3RoLCBHRlBfQVRPTUlDKTsKKyNlbGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNCwgMCkpCisJY2ZnODAyMTFfcnhfbWdtdChwQWRhcHRlci0+ZGV2LCBmcmVxLCAwLAorCQkJIHBiRnJhbWVzLCBuRnJhbWVMZW5ndGgsIEdGUF9BVE9NSUMpOworI2Vsc2UKKwljZmc4MDIxMV9yeF9tZ210KHBBZGFwdGVyLT5kZXYsIGZyZXEsCisJCQkgcGJGcmFtZXMsIG5GcmFtZUxlbmd0aCwgR0ZQX0FUT01JQyk7CisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFICovCit9CisKZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9wb3dlci5jIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX3Bvd2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2NjJlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9wb3dlci5jCkBAIC0wLDAgKzEsMjM0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBET0M6IHdsYW5faGRkX3Bvd2VyLmMKKyAqCisgKiBXTEFOIHBvd2VyIG1hbmFnZW1lbnQgZnVuY3Rpb25zCisgKgorICovCisKKy8qIEluY2x1ZGUgZmlsZXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2luY2x1ZGVzLmg+CisjaWYgZGVmaW5lZChXTEFOX09QRU5fU09VUkNFKSAmJiBkZWZpbmVkKENPTkZJR19IQVNfV0FLRUxPQ0spCisjaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KKyNlbmRpZgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgInNtZV9hcGkuaCIKKyNpbmNsdWRlIDxjZHNfYXBpLmg+CisjaW5jbHVkZSA8Y2RzX3NjaGVkLmg+CisjaW5jbHVkZSA8bWFjX2luaXRfYXBpLmg+CisjaW5jbHVkZSA8d2xhbl9xY3Rfc3lzLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfbWFpbi5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2Fzc29jLmg+CisjaW5jbHVkZSA8d2xhbl9ubGlua19zcnYuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9taXNjLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfcG93ZXIuaD4KKyNpbmNsdWRlIDxkYmdsb2dfaG9zdC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3RyYWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9ob3N0YXBkLmg+CisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorCisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2NmZy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2NmZzgwMjExLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaXBhLmg+CisKKyNpbmNsdWRlIDx3bWFfdHlwZXMuaD4KKyNpbmNsdWRlICJoaWYuaCIKKyNpbmNsdWRlICJzbWVfcG93ZXJfc2F2ZV9hcGkuaCIKKworLyogUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMgKi8KKyNkZWZpbmUgSEREX1NTUl9CUklOR19VUF9USU1FIDE1MDAwCisKKy8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKKy8qKgorICogZW51bSBoZGRfcG93ZXJfbW9kZSAtIFBvd2VyIE1vZGUgZW51bWVyYXRpb25zCisgKiBARFJJVkVSX1BPV0VSX01PREVfQVVUTzogRHJpdmVyIGNhbiBwbGFjZSBkZXZpY2UgaW50byBwb3dlciBzYXZlCisgKiBARFJJVkVSX1BPV0VSX01PREVfQUNUSVZFOiBEcml2ZXIgc2hvdWxkIG9wZXJhdGUgYXQgZnVsbCBwb3dlcgorICovCitlbnVtIGhkZF9wb3dlcl9tb2RlIHsKKwlEUklWRVJfUE9XRVJfTU9ERV9BVVRPID0gMCwKKwlEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUgPSAxLAorfTsKKworLyogRnVuY3Rpb24gYW5kIHZhcmlhYmxlcyBkZWNsYXJhdGlvbnMgKi8KKworZXh0ZXJuIHN0cnVjdCBub3RpZmllcl9ibG9jayBoZGRfbmV0ZGV2X25vdGlmaWVyOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc3NyX3RpbWVyOworc3RhdGljIGJvb2wgc3NyX3RpbWVyX3N0YXJ0ZWQ7CisvKioKKyAqIGhkZF9jb25mX2d0a19vZmZsb2FkKCkgLSBDb25maWd1cmUgR1RLIG9mZmxvYWQKKyAqIEBwQWRhcHRlcjogICBwb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKiBAZmVuYWJsZTogICAgZmxhZyBzZXQgdG8gZW5hYmxlICgxKSBvciBkaXNhYmxlICgwKSBHVEsgb2ZmbG9hZAorICoKKyAqIENlbnRyYWwgZnVuY3Rpb24gdG8gZW5hYmxlIG9yIGRpc2FibGUgR1RLIG9mZmxvYWQuCisgKgorICogUmV0dXJuOiBub3RoaW5nCisgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKK3N0YXRpYyB2b2lkIGhkZF9jb25mX2d0a19vZmZsb2FkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBib29sIGZlbmFibGUpCit7CisJQ0RGX1NUQVRVUyByZXQ7CisJdFNpckd0a09mZmxvYWRQYXJhbXMgaGRkR3RrT2ZmbG9hZFJlcVBhcmFtczsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCisJaWYgKGZlbmFibGUpIHsKKwkJaWYgKChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0KKwkJICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKQorCQkgICAgJiYgKEdUS19PRkZMT0FEX0VOQUJMRSA9PQorCQkJcEhkZFN0YUN0eC0+Z3RrT2ZmbG9hZFJlcVBhcmFtcy51bEZsYWdzKSkgeworCQkJY2RmX21lbV9jb3B5KCZoZGRHdGtPZmZsb2FkUmVxUGFyYW1zLAorCQkJCSAgICAgJnBIZGRTdGFDdHgtPmd0a09mZmxvYWRSZXFQYXJhbXMsCisJCQkJICAgICBzaXplb2YodFNpckd0a09mZmxvYWRQYXJhbXMpKTsKKworCQkJcmV0ID0gc21lX3NldF9ndGtfb2ZmbG9hZChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCQkgICZoZGRHdGtPZmZsb2FkUmVxUGFyYW1zLAorCQkJCQkJICBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gcmV0KSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiJXM6IHNtZV9zZXRfZ3RrX29mZmxvYWQgZmFpbGVkLCByZXR1cm5lZCAlZCIsCisJCQkJCSAgX19mdW5jX18sIHJldCk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiBzbWVfc2V0X2d0a19vZmZsb2FkIHN1Y2Nlc3NmdWxsIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJaWYgKChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0KKwkJICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKQorCQkgICAgJiYgKDAgPT0KKwkJCW1lbWNtcCgmcEhkZFN0YUN0eC0+Z3RrT2ZmbG9hZFJlcVBhcmFtcy5ic3NJZCwKKwkJCSAgICAgICAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLCBDREZfTUFDX0FERFJfU0laRSkpCisJCSAgICAmJiAoR1RLX09GRkxPQURfRU5BQkxFID09CisJCQlwSGRkU3RhQ3R4LT5ndGtPZmZsb2FkUmVxUGFyYW1zLnVsRmxhZ3MpKSB7CisKKwkJCS8qIEhvc3QgZHJpdmVyIGhhcyBwcmV2aW91c2x5IG9mZmxvYWRlZCBHVEsgcmVrZXkgICovCisJCQlyZXQgPSBzbWVfZ2V0X2d0a19vZmZsb2FkCisJCQkJKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkgd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX3JlcGxheV9jb3VudGVyX2NhbGxiYWNrLAorCQkJCSBwQWRhcHRlciwgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHJldCkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgIiVzOiBzbWVfZ2V0X2d0a19vZmZsb2FkIGZhaWxlZCwgcmV0dXJuZWQgJWQiLAorCQkJCQkgIF9fZnVuY19fLCByZXQpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICIlczogc21lX2dldF9ndGtfb2ZmbG9hZCBzdWNjZXNzZnVsIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisKKwkJCQkvKiBTZW5kaW5nIEdUSyBvZmZsb2FkIGRpc3NhYmxlICovCisJCQkJbWVtY3B5KCZoZGRHdGtPZmZsb2FkUmVxUGFyYW1zLAorCQkJCSAgICAgICAmcEhkZFN0YUN0eC0+Z3RrT2ZmbG9hZFJlcVBhcmFtcywKKwkJCQkgICAgICAgc2l6ZW9mKHRTaXJHdGtPZmZsb2FkUGFyYW1zKSk7CisJCQkJaGRkR3RrT2ZmbG9hZFJlcVBhcmFtcy51bEZsYWdzID0KKwkJCQkJR1RLX09GRkxPQURfRElTQUJMRTsKKwkJCQlyZXQgPQorCQkJCQlzbWVfc2V0X2d0a19vZmZsb2FkKFdMQU5fSEREX0dFVF9IQUxfQ1RYCisJCQkJCQkJCSAgICAocEFkYXB0ZXIpLAorCQkJCQkJCSAgICAmaGRkR3RrT2ZmbG9hZFJlcVBhcmFtcywKKwkJCQkJCQkgICAgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSByZXQpIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkgICIlczogZmFpbGVkIHRvIGRpc3NhYmxlIEdUSyBvZmZsb2FkLCByZXR1cm5lZCAlZCIsCisJCQkJCQkgIF9fZnVuY19fLCByZXQpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICAiJXM6IHN1Y2Nlc3NmdWxseSBkaXNzYWJsZWQgR1RLIG9mZmxvYWQgcmVxdWVzdCB0byBIQUwiLAorCQkJCQkgIF9fZnVuY19fKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm47Cit9CisjZWxzZSAvKiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQgKi8KK3N0YXRpYyB2b2lkIGhkZF9jb25mX2d0a19vZmZsb2FkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBib29sIGZlbmFibGUpCit7Cit9CisjZW5kaWYgLypXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQgKi8KKworI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorLyoqCisgKiBfX3dsYW5faGRkX2lwdjZfY2hhbmdlZCgpIC0gSVB2NiBub3RpZmllciBjYWxsYmFjayBmdW5jdGlvbgorICogQG5iOiBub3RpZmllciBibG9jayB0aGF0IHdhcyByZWdpc3RlcmVkIHdpdGggdGhlIGtlcm5lbAorICogQGRhdGE6ICh1bnVzZWQpIGdlbmVyaWMgZGF0YSB0aGF0IHdhcyByZWdpc3RlcmVkIHdpdGggdGhlIGtlcm5lbAorICogQGFyZzogKHVudXNlZCkgZ2VuZXJpYyBhcmd1bWVudCB0aGF0IHdhcyByZWdpc3RlcmVkIHdpdGggdGhlIGtlcm5lbAorICoKKyAqIFRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUga2VybmVsIHZpYQorICogcmVnaXN0ZXJfaW5ldDZhZGRyX25vdGlmaWVyKCkgd2hpY2ggYWxsb3dzIHRoZSBkcml2ZXIgdG8gYmUKKyAqIG5vdGlmaWVkIHdoZW4gdGhlcmUgaXMgYW4gSVB2NiBhZGRyZXNzIGNoYW5nZS4KKyAqCisgKiBSZXR1cm46IE5PVElGWV9ET05FIHRvIGluZGljYXRlIHdlIGRvbid0IGNhcmUgd2hhdCBoYXBwZW5zIHdpdGgKKyAqCW90aGVyIGNhbGxiYWNrcworICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfaXB2Nl9jaGFuZ2VkKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJIHVuc2lnbmVkIGxvbmcgZGF0YSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYSA9IChzdHJ1Y3QgaW5ldDZfaWZhZGRyICopYXJnOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gaWZhLT5pZGV2LT5kZXY7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIobmRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwlpbnQgc3RhdHVzOworCisJaWYgKChwQWRhcHRlciA9PSBOVUxMKSB8fCAoV0xBTl9IRERfQURBUFRFUl9NQUdJQyAhPSBwQWRhcHRlci0+bWFnaWMpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQWRhcHRlciBjb250ZXh0IGlzIGludmFsaWQgJXAiKSwgcEFkYXB0ZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKHBBZGFwdGVyLT5kZXYgPT0gbmRldikgJiYKKwkJKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OIHx8CisJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfQ0xJRU5UKSkgeworCQlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJCWlmICgwICE9IHN0YXR1cykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBpbnZhbGlkIikpOworCQkJcmV0dXJuIE5PVElGWV9ET05FOworCQl9CisKKwkJc2NoZWR1bGVfd29yaygmcEFkYXB0ZXItPmlwdjZOb3RpZmllcldvcmtRdWV1ZSk7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKioKKyAqIHdsYW5faGRkX2lwdjZfY2hhbmdlZCgpIC0gSVB2NiBjaGFuZ2Ugbm90aWZpZXIgY2FsbGJhY2sKKyAqIEBuYjogcG9pbnRlciB0byBub3RpZmllciBibG9jaworICogQGRhdGE6IGRhdGEKKyAqIEBhcmc6IGFyZworICoKKyAqIFRoaXMgaXMgdGhlIElQdjYgbm90aWZpZXIgY2FsbGJhY2sgZnVuY3Rpb24gZ2V0cyBpbnZva2VkCisgKiBpZiBhbnkgY2hhbmdlIGluIElQIGFuZCB0aGVuIGludm9rZSB0aGUgZnVuY3Rpb24gQF9fd2xhbl9oZGRfaXB2Nl9jaGFuZ2VkCisgKiB0byByZWNvbmZpZ3VyZSB0aGUgb2ZmbG9hZCBwYXJhbWV0ZXJzLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlLgorICovCitpbnQgd2xhbl9oZGRfaXB2Nl9jaGFuZ2VkKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJdW5zaWduZWQgbG9uZyBkYXRhLCB2b2lkICphcmcpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9pcHY2X2NoYW5nZWQobmIsIGRhdGEsIGFyZyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBoZGRfY29uZl9uc19vZmZsb2FkKCkgLSBDb25maWd1cmUgTlMgb2ZmbG9hZAorICogQHBBZGFwdGVyOiAgIHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIKKyAqIEBmZW5hYmxlOiAgICBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlCisgKiAgICAgICAgICAgICAgMCAtIGRpc2FibGUKKyAqICAgICAgICAgICAgICAxIC0gZW5hYmxlCisgKgorICogUmV0dXJuOiBub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9jb25mX25zX29mZmxvYWQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGJvb2wgZmVuYWJsZSkKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppbjZfZGV2OworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXVpbnQ4X3QKKwkJc2VsZklQdjZBZGRyW1NJUl9NQUNfTlVNX1RBUkdFVF9JUFY2X05TX09GRkxPQURfTkFdCisJW1NJUl9NQUNfSVBWNl9BRERSX0xFTl0gPSB7IHswLH0gfTsKKwlib29sIHNlbGZJUHY2QWRkclZhbGlkW1NJUl9NQUNfTlVNX1RBUkdFVF9JUFY2X05TX09GRkxPQURfTkFdID0geyAwIH07CisJdFNpckhvc3RPZmZsb2FkUmVxIG9mZkxvYWRSZXF1ZXN0OworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKwlpbnQgaSA9IDA7CisJQ0RGX1NUQVRVUyByZXR1cm5TdGF0dXM7CisJdWludDMyX3QgY291bnQgPSAwLCBzY29wZTsKKworCUVOVEVSKCk7CisJaGRkTG9nKExPRzEsIEZMKCIgZmVuYWJsZSA9ICVkIiksIGZlbmFibGUpOworCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisJLyogSW4gU0FQL1AyUEdvIG1vZGUsIEFSUC9OUyBvZmZsb2FkIGZlYXR1cmUgY2FwYWJpbGl0eQorCSAqIGlzIGNvbnRyb2xsZWQgYnkgb25lIGJpdC4KKwkgKi8KKworCWlmICgoV0xBTl9IRERfU09GVEFQID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSB8fAorCQlXTEFOX0hERF9QMlBfR08gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSAmJgorCQkhcEhkZEN0eC0+YXBfYXJwbnNfc3VwcG9ydCkgeworCQloZGRMb2coTE9HMSwKKwkJCUZMKCJOUyBPZmZsb2FkIGlzIG5vdCBzdXBwb3J0ZWQgaW4gU0FQL1AyUEdPIG1vZGUiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZmVuYWJsZSkgeworCQlpbjZfZGV2ID0gX19pbjZfZGV2X2dldChwQWRhcHRlci0+ZGV2KTsKKwkJaWYgKE5VTEwgIT0gaW42X2RldikgeworCQkJLyogcmVhZF9sb2NrX2JoKCZpbjZfZGV2LT5sb2NrKTsgKi8KKwkJCWxpc3RfZm9yX2VhY2gocCwgJmluNl9kZXYtPmFkZHJfbGlzdCkgeworCQkJCWlmIChjb3VudCA+PQorCQkJCQlTSVJfTUFDX05VTV9UQVJHRVRfSVBWNl9OU19PRkZMT0FEX05BKSB7CisJCQkJCWhkZF9lcnIoIlJlYWNoZWQgbWF4IHN1cHBvcnRlZCBOUyBPZmZsb2FkIGFkZHJlc3NlcyIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWZwID0KKwkJCQkJbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaW5ldDZfaWZhZGRyLCBpZl9saXN0KTsKKwkJCQlzY29wZSA9IGlwdjZfYWRkcl9zcmNfc2NvcGUoJmlmcC0+YWRkcik7CisKKwkJCQlzd2l0Y2ggKHNjb3BlKSB7CisJCQkJY2FzZSBJUFY2X0FERFJfU0NPUEVfR0xPQkFMOgorCQkJCWNhc2UgSVBWNl9BRERSX1NDT1BFX0xJTktMT0NBTDoKKwkJCQkJY2RmX21lbV9jb3B5KCZzZWxmSVB2NkFkZHJbY291bnRdLAorCQkJCQkJJmlmcC0+YWRkci5zNl9hZGRyLAorCQkJCQkJc2l6ZW9mKGlmcC0+YWRkci5zNl9hZGRyKSk7CisJCQkJCXNlbGZJUHY2QWRkclZhbGlkW2NvdW50XSA9CisJCQkJCQlTSVJfSVBWNl9BRERSX1ZBTElEOworCQkJCQloZGRfaW5mbygiSW5kZXggJWQgc2NvcGUgPSAlcyBBZGRyZXNzIDogJXBJNiIsCisJCQkJCSAgY291bnQsCisJCQkJCSAgKHNjb3BlID09IElQVjZfQUREUl9TQ09QRV9MSU5LTE9DQUwpID8KKwkJCQkJICAiTElOSyBMT0NBTCIgOiAiR0xPQkFMIiwKKwkJCQkJICBzZWxmSVB2NkFkZHJbY291bnRdKTsKKwkJCQkJY291bnQgKz0gMTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJaGRkX2VycigiVGhlIFNjb3BlICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAorCQkJCQkJc2NvcGUpOworCQkJCX0KKwkJCX0KKwkJCS8qIHJlYWRfdW5sb2NrX2JoKCZpbjZfZGV2LT5sb2NrKTsgKi8KKwkJCWNkZl9tZW1femVybygmb2ZmTG9hZFJlcXVlc3QsIHNpemVvZihvZmZMb2FkUmVxdWVzdCkpOworCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkvKiBGaWxsaW5nIHVwIHRoZSByZXF1ZXN0IHN0cnVjdHVyZQorCQkJCSAqIEZpbGxpbmcgdGhlIHNlbGZJUHY2QWRkciB3aXRoIHNvbGljaXRlZCBhZGRyZXNzCisJCQkJICogQSBTb2xpY2l0ZWQtTm9kZSBtdWx0aWNhc3QgYWRkcmVzcyBpcyBjcmVhdGVkIGJ5CisJCQkJICogdGFraW5nIHRoZSBsYXN0IDI0IGJpdHMgb2YgYSB1bmljYXN0IG9yIGFueWNhc3QKKwkJCQkgKiBhZGRyZXNzIGFuZCBhcHBlbmRpbmcgdGhlbSB0byB0aGUgcHJlZml4CisJCQkJICoKKwkJCQkgKiBGRjAyOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMTpGRlhYOlhYWFgKKwkJCQkgKgorCQkJCSAqIGhlcmUgWFggaXMgdGhlIHVuaWNhc3QvYW55Y2FzdCBiaXRzCisJCQkJICovCisJCQkJb2ZmTG9hZFJlcXVlc3QubnNPZmZsb2FkSW5mby5zZWxmSVB2NkFkZHJbaV1bMF0gPSAweEZGOworCQkJCW9mZkxvYWRSZXF1ZXN0Lm5zT2ZmbG9hZEluZm8uc2VsZklQdjZBZGRyW2ldWzFdID0gMHgwMjsKKwkJCQlvZmZMb2FkUmVxdWVzdC5uc09mZmxvYWRJbmZvLnNlbGZJUHY2QWRkcltpXVsxMV0gPSAweDAxOworCQkJCW9mZkxvYWRSZXF1ZXN0Lm5zT2ZmbG9hZEluZm8uc2VsZklQdjZBZGRyW2ldWzEyXSA9IDB4RkY7CisJCQkJb2ZmTG9hZFJlcXVlc3QubnNPZmZsb2FkSW5mby5zZWxmSVB2NkFkZHJbaV1bMTNdID0KKwkJCQkJc2VsZklQdjZBZGRyW2ldWzEzXTsKKwkJCQlvZmZMb2FkUmVxdWVzdC5uc09mZmxvYWRJbmZvLnNlbGZJUHY2QWRkcltpXVsxNF0gPQorCQkJCQlzZWxmSVB2NkFkZHJbaV1bMTRdOworCQkJCW9mZkxvYWRSZXF1ZXN0Lm5zT2ZmbG9hZEluZm8uc2VsZklQdjZBZGRyW2ldWzE1XSA9CisJCQkJCXNlbGZJUHY2QWRkcltpXVsxNV07CisJCQkJb2ZmTG9hZFJlcXVlc3QubnNPZmZsb2FkSW5mby5zbG90SWR4ID0gaTsKKwkJCQljZGZfbWVtX2NvcHkoJm9mZkxvYWRSZXF1ZXN0Lm5zT2ZmbG9hZEluZm8udGFyZ2V0SVB2NkFkZHJbaV0sCisJCQkJCSZzZWxmSVB2NkFkZHJbaV1bMF0sIFNJUl9NQUNfSVBWNl9BRERSX0xFTik7CisKKwkJCQlvZmZMb2FkUmVxdWVzdC5uc09mZmxvYWRJbmZvLnRhcmdldElQdjZBZGRyVmFsaWRbaV0gPQorCQkJCQlTSVJfSVBWNl9BRERSX1ZBTElEOworCisJCQkJaGRkX2luZm8oImNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyOiAlZCIsCisJCQkJCXBIZGRDdHgtPmNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyKTsKKworCQkJCWlmICgodHJ1ZSA9PSBwSGRkQ3R4LT5zdXNfcmVzX21jYXN0YmNhc3RfZmlsdGVyX3ZhbGlkKQorCQkJCQkmJiAoKEhERF9NQ0FTVEJDQVNURklMVEVSX0ZJTFRFUl9BTExfTVVMVElDQVNUID09CisJCQkJCXBIZGRDdHgtPnN1c19yZXNfbWNhc3RiY2FzdF9maWx0ZXIpIHx8CisJCQkJCShIRERfTUNBU1RCQ0FTVEZJTFRFUl9GSUxURVJfQUxMX01VTFRJQ0FTVF9CUk9BRENBU1QgPT0KKwkJCQkJcEhkZEN0eC0+c3VzX3Jlc19tY2FzdGJjYXN0X2ZpbHRlcikpKSB7CisJCQkJCWhkZF9pbmZvKCJTZXQgb2ZmTG9hZFJlcXVlc3Qgd2l0aCBTSVJfT0ZGTE9BRF9OU19BTkRfTUNBU1RfRklMVEVSX0VOQUJMRSIpOworCQkJCQlvZmZMb2FkUmVxdWVzdC5lbmFibGVPckRpc2FibGUgPQorCQkJCQkJU0lSX09GRkxPQURfTlNfQU5EX01DQVNUX0ZJTFRFUl9FTkFCTEU7CisJCQkJfQorCisJCQkJY2RmX21lbV9jb3B5KCZvZmZMb2FkUmVxdWVzdC5wYXJhbXMuaG9zdElwdjZBZGRyLAorCQkJCQkmb2ZmTG9hZFJlcXVlc3QubnNPZmZsb2FkSW5mby50YXJnZXRJUHY2QWRkcltpXSwKKwkJCQkJU0lSX01BQ19JUFY2X0FERFJfTEVOKTsKKworCQkJCWhkZF9pbmZvKCJTZXR0aW5nIE5TT2ZmbG9hZCB3aXRoIHNvbGljaXRlZElwOiAlcEk2LCB0YXJnZXRJcDogJXBJNiwgSW5kZXggJWQiLAorCQkJCQkmb2ZmTG9hZFJlcXVlc3QubnNPZmZsb2FkSW5mby5zZWxmSVB2NkFkZHJbaV0sCisJCQkJCSZvZmZMb2FkUmVxdWVzdC5uc09mZmxvYWRJbmZvLnRhcmdldElQdjZBZGRyW2ldLCBpKTsKKwkJCX0KKwkJCW9mZkxvYWRSZXF1ZXN0Lm9mZmxvYWRUeXBlID0gIFNJUl9JUFY2X05TX09GRkxPQUQ7CisJCQlvZmZMb2FkUmVxdWVzdC5lbmFibGVPckRpc2FibGUgPSBTSVJfT0ZGTE9BRF9FTkFCTEU7CisJCQljZGZfbWVtX2NvcHkoJm9mZkxvYWRSZXF1ZXN0Lm5zT2ZmbG9hZEluZm8uc2VsZk1hY0FkZHIsCisJCQkJJnBBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcywgU0lSX01BQ19BRERSX0xFTik7CisJCQkvKiBzZXQgbnVtYmVyIG9mIG5zIG9mZmxvYWQgYWRkcmVzcyBjb3VudCAqLworCQkJb2ZmTG9hZFJlcXVlc3QubnVtX25zX29mZmxvYWRfY291bnQgPSBjb3VudDsKKwkJCS8qIENvbmZpZ3VyZSB0aGUgRmlybXdhcmUgd2l0aCB0aGlzICovCisJCQlyZXR1cm5TdGF0dXMgPSBzbWVfc2V0X2hvc3Rfb2ZmbG9hZChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJcEFkYXB0ZXItPnNlc3Npb25JZCwgJm9mZkxvYWRSZXF1ZXN0KTsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gcmV0dXJuU3RhdHVzKSB7CisJCQkJaGRkX2VycigiRmFpbGVkIHRvIGVuYWJsZSBIb3N0T2ZmbG9hZCBmZWF0dXJlIHdpdGggc3RhdHVzOiAlZCIsCisJCQkJCXJldHVyblN0YXR1cyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQloZGRfZXJyKCJJUHY2IGRldiBkb2VzIG5vdCBleGlzdC4gRmFpbGVkIHRvIHJlcXVlc3QgTlNPZmZsb2FkIik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIE5TT2ZmbG9hZCAqLworCQljZGZfbWVtX3plcm8oKHZvaWQgKikmb2ZmTG9hZFJlcXVlc3QsIHNpemVvZih0U2lySG9zdE9mZmxvYWRSZXEpKTsKKwkJb2ZmTG9hZFJlcXVlc3QuZW5hYmxlT3JEaXNhYmxlID0gU0lSX09GRkxPQURfRElTQUJMRTsKKwkJb2ZmTG9hZFJlcXVlc3Qub2ZmbG9hZFR5cGUgPSAgU0lSX0lQVjZfTlNfT0ZGTE9BRDsKKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCQlzbWVfc2V0X2hvc3Rfb2ZmbG9hZChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJcEFkYXB0ZXItPnNlc3Npb25JZCwgJm9mZkxvYWRSZXF1ZXN0KSkKKwkJCQloZGRfZXJyKCJGYWlsZWQgdG8gZGlzYWJsZSBOUyBPZmZsb2FkIik7CisJfQorCUVYSVQoKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogX19oZGRfaXB2Nl9ub3RpZmllcl93b3JrX3F1ZXVlKCkgLSBJUHY2IG5vdGlmaWNhdGlvbiB3b3JrIGZ1bmN0aW9uCisgKiBAd29yazogcmVnaXN0ZXJlZCB3b3JrIGl0ZW0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSB3b3JrIGluaXRpYWxseSB0cmlnZ2VkIGJ5IGEgY2FsbGJhY2sKKyAqIGZyb20gdGhlIElQdjYgbmV0ZGV2IG5vdGlmaWVyLiAgU2luY2UgdGhpcyBtZWFucyB0aGVyZSBoYXMgYmVlbiBhCisgKiBjaGFuZ2UgaW4gSVB2NiBzdGF0ZSBmb3IgdGhlIGludGVyZmFjZSwgdGhlIE5TIG9mZmxvYWQgaXMKKyAqIHJlY29uZmlndXJlZC4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBfX2hkZF9pcHY2X25vdGlmaWVyX3dvcmtfcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIGhkZF9hZGFwdGVyX3QsIGlwdjZOb3RpZmllcldvcmtRdWV1ZSk7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwlpbnQgc3RhdHVzOworCisJaGRkTG9nKExPRzEsIEZMKCJSZWNvbmZpZ3VyaW5nIE5TIE9mZmxvYWQiKSk7CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBpbnZhbGlkIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFwSGRkQ3R4LT5jb25maWctPmFjdGl2ZV9tb2RlX29mZmxvYWQpIHsKKwkJaGRkX2VycigiQWN0aXZlIG1vZGUgb2ZmbG9hZCBpcyBkaXNhYmxlZCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGZhbHNlID09IHBIZGRDdHgtPnN1c19yZXNfbWNhc3RiY2FzdF9maWx0ZXJfdmFsaWQpIHsKKwkJcEhkZEN0eC0+c3VzX3Jlc19tY2FzdGJjYXN0X2ZpbHRlciA9CisJCQlwSGRkQ3R4LT5jb25maWd1cmVkTWNhc3RCY2FzdEZpbHRlcjsKKwkJcEhkZEN0eC0+c3VzX3Jlc19tY2FzdGJjYXN0X2ZpbHRlcl92YWxpZCA9IHRydWU7CisJfQorCisJaWYgKChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0KKwkgICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5jb25uU3RhdGUpKQorCQlpZiAocEhkZEN0eC0+Y29uZmlnLT5maG9zdE5TT2ZmbG9hZCkKKwkJCWhkZF9jb25mX25zX29mZmxvYWQocEFkYXB0ZXIsIHRydWUpOworfQorCisvKioKKyAqIGhkZF9pcHY2X25vdGlmaWVyX3dvcmtfcXVldWUoKSAtIElQIFY2IGNoYW5nZSBub3RpZmllciB3b3JrIGhhbmRsZXIKKyAqIEB3b3JrOiBQb2ludGVyIHRvIHdvcmsgY29udGV4dAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGhkZF9pcHY2X25vdGlmaWVyX3dvcmtfcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJX19oZGRfaXB2Nl9ub3RpZmllcl93b3JrX3F1ZXVlKHdvcmspOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKK30KKworLyoqCisgKiBoZGRfY29uZl9ob3N0b2ZmbG9hZCgpIC0gQ2VudHJhbCBmdW5jdGlvbiB0byBjb25maWd1cmUgdGhlIHN1cHBvcnRlZCBvZmZsb2FkcworICogQHBBZGFwdGVyOiAgIHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIKKyAqIEBmZW5hYmxlOiAgICBmbGFnIHNldCB0byBlbmFibGUgKDEpIG9yIGRpc2FibGUgKDApCisgKgorICogQ2VudHJhbCBmdW5jdGlvbiB0byBjb25maWd1cmUgdGhlIHN1cHBvcnRlZCBvZmZsb2FkcyBlaXRoZXIKKyAqIGVuYWJsZSBvciBkaXNhYmxlIHRoZW0uCisgKgorICogUmV0dXJuOiBub3RoaW5nCisgKi8KK3ZvaWQgaGRkX2NvbmZfaG9zdG9mZmxvYWQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGJvb2wgZmVuYWJsZSkKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCisJaGRkX2luZm8oIkNvbmZpZ3VyaW5nIG9mZmxvYWRzIHdpdGggZmxhZzogJWQiLCBmZW5hYmxlKTsKKworCS8qIEdldCB0aGUgSEREIGNvbnRleHQuICovCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisJaWYgKCgoV0xBTl9IRERfSU5GUkFfU1RBVElPTiAhPSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpICYmCisJICAgICAoV0xBTl9IRERfUDJQX0NMSUVOVCAhPSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpKSkgeworCQloZGRfZXJyKCJPZmZsb2FkcyBub3Qgc3VwcG9ydGVkIGluIG1vZGUgJWQiLAorCQkJcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgIT0KKwkgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgeworCQloZGRfZXJyKCJPZmZsb2FkcyBub3Qgc3VwcG9ydGVkIGluIHN0YXRlICVkIiwKKwkJCShXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPgorCQkJCQkJCWNvbm5faW5mby5jb25uU3RhdGUpOworCQlyZXR1cm47CisJfQorCisJaGRkX2NvbmZfZ3RrX29mZmxvYWQocEFkYXB0ZXIsIGZlbmFibGUpOworCisJLyogQ29uZmlndXJlIEFSUC9OUyBvZmZsb2FkIGR1cmluZyBjZmc4MDIxMSBzdXNwZW5kL3Jlc3VtZSBvbmx5CisJICogaWYgYWN0aXZlIG1vZGUgb2ZmbG9hZCBpcyBkaXNhYmxlZAorCSAqLworCWlmICghcEhkZEN0eC0+Y29uZmlnLT5hY3RpdmVfbW9kZV9vZmZsb2FkKSB7CisJCWhkZF9jb25mX2FycF9vZmZsb2FkKHBBZGFwdGVyLCBmZW5hYmxlKTsKKwkJaWYgKHBIZGRDdHgtPmNvbmZpZy0+Zmhvc3ROU09mZmxvYWQpCisJCQloZGRfY29uZl9uc19vZmZsb2FkKHBBZGFwdGVyLCBmZW5hYmxlKTsKKwl9CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8qKgorICogX19oZGRfaXB2NF9ub3RpZmllcl93b3JrX3F1ZXVlKCkgLSBJUHY0IG5vdGlmaWNhdGlvbiB3b3JrIGZ1bmN0aW9uCisgKiBAd29yazogcmVnaXN0ZXJlZCB3b3JrIGl0ZW0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSB3b3JrIGluaXRpYWxseSB0cmlnZ2VkIGJ5IGEgY2FsbGJhY2sKKyAqIGZyb20gdGhlIElQdjQgbmV0ZGV2IG5vdGlmaWVyLiAgU2luY2UgdGhpcyBtZWFucyB0aGVyZSBoYXMgYmVlbiBhCisgKiBjaGFuZ2UgaW4gSVB2NCBzdGF0ZSBmb3IgdGhlIGludGVyZmFjZSwgdGhlIEFSUCBvZmZsb2FkIGlzCisgKiByZWNvbmZpZ3VyZWQuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgX19oZGRfaXB2NF9ub3RpZmllcl93b3JrX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBoZGRfYWRhcHRlcl90LCBpcHY0Tm90aWZpZXJXb3JrUXVldWUpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJaW50IHN0YXR1czsKKworCWhkZF9pbmZvKCJDb25maWd1cmluZyBBUlAgT2ZmbG9hZCIpOworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIGludmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXBIZGRDdHgtPmNvbmZpZy0+YWN0aXZlX21vZGVfb2ZmbG9hZCkgeworCQloZGRfZXJyKCJBY3RpdmUgbW9kZSBvZmZsb2FkIGlzIGRpc2FibGVkIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZmFsc2UgPT0gcEhkZEN0eC0+c3VzX3Jlc19tY2FzdGJjYXN0X2ZpbHRlcl92YWxpZCkgeworCQlwSGRkQ3R4LT5zdXNfcmVzX21jYXN0YmNhc3RfZmlsdGVyID0KKwkJCXBIZGRDdHgtPmNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyOworCQlwSGRkQ3R4LT5zdXNfcmVzX21jYXN0YmNhc3RfZmlsdGVyX3ZhbGlkID0gdHJ1ZTsKKwl9CisKKwlpZiAoKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCA9PQorCSAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkpCisJCWhkZF9jb25mX2FycF9vZmZsb2FkKHBBZGFwdGVyLCB0cnVlKTsKK30KKworLyoqCisgKiBoZGRfaXB2NF9ub3RpZmllcl93b3JrX3F1ZXVlKCkgLSBJUCBWNCBjaGFuZ2Ugbm90aWZpZXIgd29yayBoYW5kbGVyCisgKiBAd29yazogUG9pbnRlciB0byB3b3JrIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfaXB2NF9ub3RpZmllcl93b3JrX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCV9faGRkX2lwdjRfbm90aWZpZXJfd29ya19xdWV1ZSh3b3JrKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9pcHY0X2NoYW5nZWQoKSAtIElQdjQgbm90aWZpZXIgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBuYjogbm90aWZpZXIgYmxvY2sgdGhhdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBrZXJuZWwKKyAqIEBkYXRhOiAodW51c2VkKSBnZW5lcmljIGRhdGEgdGhhdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBrZXJuZWwKKyAqIEBhcmc6ICh1bnVzZWQpIGdlbmVyaWMgYXJndW1lbnQgdGhhdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBrZXJuZWwKKyAqCisgKiBUaGlzIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGtlcm5lbCB2aWEKKyAqIHJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCkgd2hpY2ggYWxsb3dzIHRoZSBkcml2ZXIgdG8gYmUKKyAqIG5vdGlmaWVkIHdoZW4gdGhlcmUgaXMgYW4gSVB2NCBhZGRyZXNzIGNoYW5nZS4KKyAqCisgKiBSZXR1cm46IE5PVElGWV9ET05FIHRvIGluZGljYXRlIHdlIGRvbid0IGNhcmUgd2hhdCBoYXBwZW5zIHdpdGgKKyAqCW90aGVyIGNhbGxiYWNrcworICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfaXB2NF9jaGFuZ2VkKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJIHVuc2lnbmVkIGxvbmcgZGF0YSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IChzdHJ1Y3QgaW5faWZhZGRyICopYXJnOworCXN0cnVjdCBpbl9pZmFkZHIgKippZmFwID0gTlVMTDsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGlmYS0+aWZhX2Rldi0+ZGV2OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKG5kZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJaW50IHN0YXR1czsKKworCWlmICgocEFkYXB0ZXIgPT0gTlVMTCkgfHwgKFdMQU5fSEREX0FEQVBURVJfTUFHSUMgIT0gcEFkYXB0ZXItPm1hZ2ljKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkFkYXB0ZXIgY29udGV4dCBpcyBpbnZhbGlkICVwIiksIHBBZGFwdGVyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChwQWRhcHRlciAmJiBwQWRhcHRlci0+ZGV2ID09IG5kZXYpICYmCisJCShwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTiB8fAorCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0NMSUVOVCkpIHsKKworCQlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJCWlmICgwICE9IHN0YXR1cykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBpbnZhbGlkIikpOworCQkJcmV0dXJuIE5PVElGWV9ET05FOworCQl9CisKKwkJaWYgKCFwSGRkQ3R4LT5jb25maWctPmZob3N0QXJwT2ZmbG9hZCkgeworCQkJaGRkTG9nKExPRzEsCisJCQkJRkwoIk9mZmxvYWQgbm90IGVuYWJsZWQgQVJQT2ZmbG9hZD0lZCIpLAorCQkJCXBIZGRDdHgtPmNvbmZpZy0+Zmhvc3RBcnBPZmZsb2FkKTsKKwkJCXJldHVybiBOT1RJRllfRE9ORTsKKwkJfQorCisJCWluX2RldiA9IF9faW5fZGV2X2dldF9ydG5sKHBBZGFwdGVyLT5kZXYpOworCQlpZiAoaW5fZGV2KSB7CisJCQlmb3IgKGlmYXAgPSAmaW5fZGV2LT5pZmFfbGlzdDsgKGlmYSA9ICppZmFwKSAhPSBOVUxMOworCQkJICAgICBpZmFwID0gJmlmYS0+aWZhX25leHQpIHsKKwkJCQlpZiAoIXN0cmNtcChwQWRhcHRlci0+ZGV2LT5uYW1lLAorCQkJCQkgICAgaWZhLT5pZmFfbGFiZWwpKSB7CisJCQkJCWJyZWFrOyAgLyogZm91bmQgKi8KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGlmYSAmJiBpZmEtPmlmYV9sb2NhbCkgeworCQkJc2NoZWR1bGVfd29yaygmcEFkYXB0ZXItPmlwdjROb3RpZmllcldvcmtRdWV1ZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qKgorICogd2xhbl9oZGRfaXB2NF9jaGFuZ2VkKCkgLSBJUHY0IGNoYW5nZSBub3RpZmllciBjYWxsYmFjaworICogQG5iOiBwb2ludGVyIHRvIG5vdGlmaWVyIGJsb2NrCisgKiBAZGF0YTogZGF0YQorICogQGFyZzogYXJnCisgKgorICogVGhpcyBpcyB0aGUgSVB2NCBub3RpZmllciBjYWxsYmFjayBmdW5jdGlvbiBnZXRzIGludm9rZWQKKyAqIGlmIGFueSBjaGFuZ2UgaW4gSVAgYW5kIHRoZW4gaW52b2tlIHRoZSBmdW5jdGlvbiBAX193bGFuX2hkZF9pcHY0X2NoYW5nZWQKKyAqIHRvIHJlY29uZmlndXJlIHRoZSBvZmZsb2FkIHBhcmFtZXRlcnMuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UuCisgKi8KK2ludCB3bGFuX2hkZF9pcHY0X2NoYW5nZWQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCXVuc2lnbmVkIGxvbmcgZGF0YSwgdm9pZCAqYXJnKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfaXB2NF9jaGFuZ2VkKG5iLCBkYXRhLCBhcmcpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGRkX2NvbmZfYXJwX29mZmxvYWQoKSAtIENvbmZpZ3VyZSBBUlAgb2ZmbG9hZAorICogQHBBZGFwdGVyOiBBZGFwdGVyIGNvbnRleHQgZm9yIHdoaWNoIEFSUCBvZmZsb2FkIGlzIHRvIGJlIGNvbmZpZ3VyZWQKKyAqIEBmZW5hYmxlOiB0cnVlIDogZW5hYmxlIEFSUCBvZmZsb2FkIGZhbHNlIDogZGlzYWJsZSBhcnAgb2ZmbG9hZAorICoKKyAqIFJldHVybjoKKyAqCUNERl9TVEFUVVNfU1VDQ0VTUyAtIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLAorICoJQ0RGX1NUQVRVU19FX0ZBSUxVUkUgLSBvbiBmYWlsdXJlIG9mIG9wZXJhdGlvbgorICovCitDREZfU1RBVFVTIGhkZF9jb25mX2FycF9vZmZsb2FkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBib29sIGZlbmFibGUpCit7CisJc3RydWN0IGluX2lmYWRkciAqKmlmYXAgPSBOVUxMOworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IE5VTEw7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCWludCBpID0gMDsKKwl0U2lySG9zdE9mZmxvYWRSZXEgb2ZmTG9hZFJlcXVlc3Q7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisJaGRkX2luZm8oImZlbmFibGUgPSAlZCIsIGZlbmFibGUpOworCisJLyogSW4gU0FQL1AyUCBHbyBtb2RlLCBBUlAvTlMgT2ZmbG9hZCBmZWF0dXJlIGNhcGFiaWxpdHkKKwkgKiBpcyBjb250cm9sbGVkIGJ5IG9uZSBiaXQuCisJICovCisJaWYgKChXTEFOX0hERF9TT0ZUQVAgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlIHx8CisJCVdMQU5fSEREX1AyUF9HTyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpICYmCisJCSFwSGRkQ3R4LT5hcF9hcnBuc19zdXBwb3J0KSB7CisJCWhkZExvZyhMT0cxLAorCQkJRkwoIkFSUCBPZmZsb2FkIGlzIG5vdCBzdXBwb3J0ZWQgaW4gU0FQL1AyUEdPIG1vZGUiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJaWYgKGZlbmFibGUpIHsKKwkJaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3J0bmwocEFkYXB0ZXItPmRldik7CisJCWlmIChpbl9kZXYpIHsKKwkJCWZvciAoaWZhcCA9ICZpbl9kZXYtPmlmYV9saXN0OyAoaWZhID0gKmlmYXApICE9IE5VTEw7CisJCQkgICAgIGlmYXAgPSAmaWZhLT5pZmFfbmV4dCkgeworCQkJCWlmICghc3RyY21wKHBBZGFwdGVyLT5kZXYtPm5hbWUsCisJCQkJCSAgICBpZmEtPmlmYV9sYWJlbCkpIHsKKwkJCQkJYnJlYWs7ICAvKiBmb3VuZCAqLworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoaWZhICYmIGlmYS0+aWZhX2xvY2FsKSB7CisJCQlvZmZMb2FkUmVxdWVzdC5vZmZsb2FkVHlwZSA9IFNJUl9JUFY0X0FSUF9SRVBMWV9PRkZMT0FEOworCQkJb2ZmTG9hZFJlcXVlc3QuZW5hYmxlT3JEaXNhYmxlID0gU0lSX09GRkxPQURfRU5BQkxFOworCisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogRW5hYmxlZCIsIF9fZnVuY19fKTsKKworCQkJaWYgKCgoSEREX01DQVNUQkNBU1RGSUxURVJfRklMVEVSX0FMTF9CUk9BRENBU1QgPT0KKwkJCSAgICAgIHBIZGRDdHgtPnN1c19yZXNfbWNhc3RiY2FzdF9maWx0ZXIpIHx8CisJCQkgICAgIChIRERfTUNBU1RCQ0FTVEZJTFRFUl9GSUxURVJfQUxMX01VTFRJQ0FTVF9CUk9BRENBU1QKKwkJCSAgICAgID09IHBIZGRDdHgtPnN1c19yZXNfbWNhc3RiY2FzdF9maWx0ZXIpKQorCQkJICAgICYmICh0cnVlID09CisJCQkJcEhkZEN0eC0+c3VzX3Jlc19tY2FzdGJjYXN0X2ZpbHRlcl92YWxpZCkpIHsKKwkJCQlvZmZMb2FkUmVxdWVzdC5lbmFibGVPckRpc2FibGUgPQorCQkJCQlTSVJfT0ZGTE9BRF9BUlBfQU5EX0JDQVNUX0ZJTFRFUl9FTkFCTEU7CisJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgICAgICAib2ZmbG9hZDogaW5zaWRlIGFycCBvZmZsb2FkIGNvbmRpdGlvbmFsIGNoZWNrIik7CisJCQl9CisKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgICAgICAib2ZmbG9hZDogYXJwIGZpbHRlciBwcm9ncmFtbWVkID0gJWQiLAorCQkJICAgICAgIG9mZkxvYWRSZXF1ZXN0LmVuYWJsZU9yRGlzYWJsZSk7CisKKwkJCS8qIGNvbnZlcnRpbmcgdTMyIHRvIElQVjQgYWRkcmVzcyAqLworCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCW9mZkxvYWRSZXF1ZXN0LnBhcmFtcy5ob3N0SXB2NEFkZHJbaV0gPQorCQkJCQkoaWZhLT5pZmFfbG9jYWwgPj4gKGkgKiA4KSkgJiAweEZGOworCQkJfQorCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAgICAgICIgRW5hYmxlIFNNRSBIb3N0T2ZmbG9hZDogJWQuJWQuJWQuJWQiLAorCQkJICAgICAgIG9mZkxvYWRSZXF1ZXN0LnBhcmFtcy5ob3N0SXB2NEFkZHJbMF0sCisJCQkgICAgICAgb2ZmTG9hZFJlcXVlc3QucGFyYW1zLmhvc3RJcHY0QWRkclsxXSwKKwkJCSAgICAgICBvZmZMb2FkUmVxdWVzdC5wYXJhbXMuaG9zdElwdjRBZGRyWzJdLAorCQkJICAgICAgIG9mZkxvYWRSZXF1ZXN0LnBhcmFtcy5ob3N0SXB2NEFkZHJbM10pOworCisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCQkgICAgc21lX3NldF9ob3N0X29mZmxvYWQoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkgJm9mZkxvYWRSZXF1ZXN0KSkgeworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAgICAgICIlczogRmFpbGVkIHRvIGVuYWJsZSBIb3N0T2ZmbG9hZCBmZWF0dXJlIiwKKwkJCQkgICAgICAgX19mdW5jX18pOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgICAgICBGTCgiSVAgQWRkcmVzcyBpcyBub3QgYXNzaWduZWQiKSk7CisJCX0KKworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0gZWxzZSB7CisJCWNkZl9tZW1femVybygodm9pZCAqKSZvZmZMb2FkUmVxdWVzdCwKKwkJCSAgICAgc2l6ZW9mKHRTaXJIb3N0T2ZmbG9hZFJlcSkpOworCQlvZmZMb2FkUmVxdWVzdC5lbmFibGVPckRpc2FibGUgPSBTSVJfT0ZGTE9BRF9ESVNBQkxFOworCQlvZmZMb2FkUmVxdWVzdC5vZmZsb2FkVHlwZSA9IFNJUl9JUFY0X0FSUF9SRVBMWV9PRkZMT0FEOworCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJICAgIHNtZV9zZXRfaG9zdF9vZmZsb2FkKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJIHBBZGFwdGVyLT5zZXNzaW9uSWQsICZvZmZMb2FkUmVxdWVzdCkpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBGYWlsdXJlIHRvIGRpc2FibGUgaG9zdCAiICJvZmZsb2FkIGZlYXR1cmUiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KK30KKworLyoqCisgKiBoZGRfbWNiY19maWx0ZXJfbW9kaWZpY2F0aW9uKCkgLSBNQ0JDIEZpbHRlciBNb2RpZmllcgorICogQHBIZGRDdHg6IEdsb2JhbCBIZGQgQ29udGV4dAorICogQHBNY0JjRmlsdGVyOiBNdWx0aWNhc3QvQnJvYWRjYXN0IGZpbHRlciB0byBiZSBtb2RpZmllZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBzZXR0aW5nIG1jYmMgZmlsdGVycworICogdG8gbW9kaWZ5IGZpbHRlciB2YWx1ZSBjb25zaWRlcmluZyBkaWZmZXJlbnQgb2ZmbG9hZHMKKyAqCisgKiBSZXR1cm46IE5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9tY2JjX2ZpbHRlcl9tb2RpZmljYXRpb24oaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBNY0JjRmlsdGVyKQoreworCWlmIChOVUxMID09IHBIZGRDdHgpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIk5VTEwgSEREIGNvbnRleHQgcGFzc2VkIikpOworCQlyZXR1cm47CisJfQorCisJKnBNY0JjRmlsdGVyID0gcEhkZEN0eC0+Y29uZmlndXJlZE1jYXN0QmNhc3RGaWx0ZXI7CisJaWYgKHBIZGRDdHgtPmNvbmZpZy0+Zmhvc3RBcnBPZmZsb2FkKSB7CisJCS8qIEFSUCBvZmZsb2FkIGlzIGVuYWJsZWQsIGRvIG5vdCBibG9jayBiY2FzdCBwYWNrZXRzIGF0IFJYUAorCQkgKiBXaWxsIGJlIHVzaW5nIEJpdG1hc2tpbmcgdG8gcmVzZXQgdGhlIGZpbHRlci4gQXMgd2UgaGF2ZQorCQkgKiBkaXNhYmxlIEJyb2FkY2FzdCBmaWx0ZXJpbmcsIEFuZGluZyB3aXRoIHRoZSBuZWdhdGlvbgorCQkgKiBvZiBCcm9hZGNhc3QgQklUCisJCSAqLworCQkqcE1jQmNGaWx0ZXIgJj0gfihIRERfTUNBU1RCQ0FTVEZJTFRFUl9GSUxURVJfQUxMX0JST0FEQ0FTVCk7CisJfQorI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorCWlmIChwSGRkQ3R4LT5jb25maWctPmZob3N0TlNPZmZsb2FkKSB7CisJCS8qIE5TIG9mZmxvYWQgaXMgZW5hYmxlZCwgZG8gbm90IGJsb2NrIG1jYXN0IHBhY2tldHMgYXQgUlhQCisJCSAqIFdpbGwgYmUgdXNpbmcgQml0bWFza2luZyB0byByZXNldCB0aGUgZmlsdGVyLiBBcyB3ZSBoYXZlCisJCSAqIGRpc2FibGUgTXVsdGljYXN0IGZpbHRlcmluZywgQW5kaW5nIHdpdGggdGhlIG5lZ2F0aW9uCisJCSAqIG9mIE11bHRpY2FzdCBCSVQKKwkJICovCisJCSpwTWNCY0ZpbHRlciAmPSB+KEhERF9NQ0FTVEJDQVNURklMVEVSX0ZJTFRFUl9BTExfTVVMVElDQVNUKTsKKwl9CisjZW5kaWYKKworCXBIZGRDdHgtPmNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyID0gKnBNY0JjRmlsdGVyOworfQorCisvKioKKyAqIGhkZF9jb25mX21jYXN0YmNhc3RfZmlsdGVyKCkgLSBDb25maWd1cmUgbXVsdGljYXN0L2Jyb2FkY2FzdCBmaWx0ZXIKKyAqIEBwSGRkQ3R4OiBHbG9iYWwgSEREIGNvbnRleHQKKyAqIEBzZXRmaWx0ZXI6IHRydWUgaWYgZmlsdGVyIGlzIGJlaW5nIHNldCwgZmFsc2UgaWYgZmlsdGVyIGlzIGJlaW5nIGNsZWFyZWQKKyAqCisgKiBSZXR1cm46IE5vbmUuCisgKi8KK3ZvaWQgaGRkX2NvbmZfbWNhc3RiY2FzdF9maWx0ZXIoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgYm9vbCBzZXRmaWx0ZXIpCit7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwU2lyV2xhblNldFJ4cEZpbHRlcnMgd2xhblJ4cEZpbHRlclBhcmFtID0KKwkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJXbGFuU2V0UnhwRmlsdGVycykpOworCWlmIChOVUxMID09IHdsYW5SeHBGaWx0ZXJQYXJhbSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgIiVzOiBjZGZfbWVtX2FsbG9jIGZhaWxlZCAiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAiJXM6IENvbmZpZ3VyaW5nIE1jYXN0L0JjYXN0IEZpbHRlciBTZXR0aW5nLiBzZXRmaWx0ZXIgJWQiLAorCSAgICAgICBfX2Z1bmNfXywgc2V0ZmlsdGVyKTsKKwlpZiAodHJ1ZSA9PSBzZXRmaWx0ZXIpIHsKKwkJaGRkX21jYmNfZmlsdGVyX21vZGlmaWNhdGlvbihwSGRkQ3R4LAorCQkJCQkgICAgICZ3bGFuUnhwRmlsdGVyUGFyYW0tPgorCQkJCQkgICAgIGNvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmcpOworCX0gZWxzZSB7CisJCS8qVXNlIHRoZSBjdXJyZW50IGNvbmZpZ3VyZWQgdmFsdWUgdG8gY2xlYXIgKi8KKwkJd2xhblJ4cEZpbHRlclBhcmFtLT5jb25maWd1cmVkTWNzdEJjc3RGaWx0ZXJTZXR0aW5nID0KKwkJCXBIZGRDdHgtPmNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyOworCX0KKworCXdsYW5SeHBGaWx0ZXJQYXJhbS0+c2V0TWNzdEJjc3RGaWx0ZXIgPSBzZXRmaWx0ZXI7CisJY2RmX3JldF9zdGF0dXMgPQorCQlzbWVfY29uZmlndXJlX3J4cF9maWx0ZXIocEhkZEN0eC0+aEhhbCwgd2xhblJ4cEZpbHRlclBhcmFtKTsKKworCWlmIChzZXRmaWx0ZXIgJiYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfcmV0X3N0YXR1cykpCisJCXBIZGRDdHgtPmhkZF9tY2FzdGJjYXN0X2ZpbHRlcl9zZXQgPSB0cnVlOworCisJaGRkTG9nKExPRzEsCisJCUZMKCIlcyB0byBwb3N0IHNldC9yZXNldCBmaWx0ZXIgdG8gbG93ZXIgbWFjIHdpdGggc3RhdHVzICVkIGNvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmcgPSAlZCBzZXRNY3N0QmNzdEZpbHRlciA9ICVkIiksCisJCShDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RmX3JldF9zdGF0dXMpID8gIkZhaWxlZCIgOiAiU3VjY2VzcyIsCisJCWNkZl9yZXRfc3RhdHVzLAorCQl3bGFuUnhwRmlsdGVyUGFyYW0tPmNvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmcsCisJCXdsYW5SeHBGaWx0ZXJQYXJhbS0+c2V0TWNzdEJjc3RGaWx0ZXIpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfcmV0X3N0YXR1cykKKwkJY2RmX21lbV9mcmVlKHdsYW5SeHBGaWx0ZXJQYXJhbSk7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworLyoqCisgKiB3bGFuX2hkZF9zZXRfbWNfYWRkcl9saXN0KCkgLSBzZXQgTUMgYWRkcmVzcyBsaXN0IGluIEZXCisgKiBAcEFkYXB0ZXI6IGFkYXB0ZXIgd2hvc2UgTUMgbGlzdCBpcyBiZWluZyBzZXQKKyAqIEBzZXQ6IGZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIGFkZHJlc3NlcyBhcmUgYmVpbmcgc2V0IG9yIGNsZWFyZWQKKyAqLwordm9pZCB3bGFuX2hkZF9zZXRfbWNfYWRkcl9saXN0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90IHNldCkKK3sKKwl1aW50OF90IGk7CisJdHBTaXJSY3ZGbHRNY0FkZHJMaXN0IHBNdWx0aWNhc3RBZGRycyA9IE5VTEw7CisJdEhhbEhhbmRsZSBoSGFsID0gTlVMTDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKikgcEFkYXB0ZXItPnBIZGRDdHg7CisKKwlpZiAoTlVMTCA9PSBwSGRkQ3R4KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgQ1RYIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwloSGFsID0gcEhkZEN0eC0+aEhhbDsKKworCWlmIChOVUxMID09IGhIYWwpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkhBTCBIYW5kbGUgaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIGlmIElOSSBpcyBlbmFibGVkIG9yIG5vdCwgb3RoZXIgd2lzZSBqdXN0IHJldHVybgorCSAqLworCWlmICghcEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlTUNBZGRyTGlzdCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICAgICBGTCgiZ01DQWRkckxpc3RFbmFibGUgaXMgbm90IGVuYWJsZWQgaW4gSU5JIikpOworCQlyZXR1cm47CisJfQorCXBNdWx0aWNhc3RBZGRycyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyUmN2Rmx0TWNBZGRyTGlzdCkpOworCWlmIChOVUxMID09IHBNdWx0aWNhc3RBZGRycykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIkNvdWxkIG5vdCBhbGxvY2F0ZSBNZW1vcnkiKSk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV96ZXJvKHBNdWx0aWNhc3RBZGRycywgc2l6ZW9mKHRTaXJSY3ZGbHRNY0FkZHJMaXN0KSk7CisJcE11bHRpY2FzdEFkZHJzLT5hY3Rpb24gPSBzZXQ7CisKKwlpZiAoc2V0KSB7CisJCS8qIEZvbGxvd2luZyBwcmUtY29uZGl0aW9ucyBzaG91bGQgYmUgc2F0aXNmaWVkIGJlZm9yZSB3ZQorCQkgKiBjb25maWd1cmUgdGhlIE1DIGFkZHJlc3MgbGlzdC4KKwkJICovCisJCWlmICgoKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKQorCQkgICAgIHx8IChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0NMSUVOVCkpCisJCSAgICAmJiBwQWRhcHRlci0+bWNfYWRkcl9saXN0Lm1jX2NudAorCQkgICAgJiYgKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCA9PQorCQkJKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+CisJCQljb25uX2luZm8uY29ublN0YXRlKSkgeworCQkJcE11bHRpY2FzdEFkZHJzLT51bE11bHRpY2FzdEFkZHJDbnQgPQorCQkJCXBBZGFwdGVyLT5tY19hZGRyX2xpc3QubWNfY250OworCQkJZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5tY19hZGRyX2xpc3QubWNfY250OworCQkJICAgICBpKyspIHsKKwkJCQltZW1jcHkocE11bHRpY2FzdEFkZHJzLT5tdWx0aWNhc3RBZGRyW2ldLAorCQkJCSAgICAgICBwQWRhcHRlci0+bWNfYWRkcl9saXN0LmFkZHJbaV0sCisJCQkJICAgICAgIHNpemVvZihwQWRhcHRlci0+bWNfYWRkcl9saXN0LgorCQkJCQkgICAgICBhZGRyW2ldKSk7CisJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgICAgICAiJXM6ICVzIG11bHRpY2FzdCBmaWx0ZXI6IGFkZHIgPSIKKwkJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSLCBfX2Z1bmNfXywKKwkJCQkgICAgICAgc2V0ID8gInNldHRpbmciIDogImNsZWFyaW5nIiwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocE11bHRpY2FzdEFkZHJzLT4KKwkJCQkJCSAgICAgIG11bHRpY2FzdEFkZHJbaV0pKTsKKwkJCX0KKwkJCS8qIFNldCBtdWx0aWNhc3QgZmlsdGVyICovCisJCQlzbWVfODAyM19tdWx0aWNhc3RfbGlzdChoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJcE11bHRpY2FzdEFkZHJzKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5lZWQgdG8gY2xlYXIgb25seSBpZiBpdCB3YXMgcHJldmlvdXNseSBjb25maWd1cmVkICovCisJCWlmIChwQWRhcHRlci0+bWNfYWRkcl9saXN0LmlzRmlsdGVyQXBwbGllZCkgeworCQkJcE11bHRpY2FzdEFkZHJzLT51bE11bHRpY2FzdEFkZHJDbnQgPQorCQkJCXBBZGFwdGVyLT5tY19hZGRyX2xpc3QubWNfY250OworCQkJZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5tY19hZGRyX2xpc3QubWNfY250OworCQkJICAgICBpKyspIHsKKwkJCQltZW1jcHkocE11bHRpY2FzdEFkZHJzLT5tdWx0aWNhc3RBZGRyW2ldLAorCQkJCSAgICAgICBwQWRhcHRlci0+bWNfYWRkcl9saXN0LmFkZHJbaV0sCisJCQkJICAgICAgIHNpemVvZihwQWRhcHRlci0+bWNfYWRkcl9saXN0LgorCQkJCQkgICAgICBhZGRyW2ldKSk7CisJCQl9CisJCQlzbWVfODAyM19tdWx0aWNhc3RfbGlzdChoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJcE11bHRpY2FzdEFkZHJzKTsKKwkJfQorCisJfQorCS8qIE1BZGRyQ250IGlzIE11bHRpY2FzdEFkZHJDbnQgKi8KKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJICAgICAgICJzbWVTZXNzaW9uSWQ6JWQ7IHNldDolZDsgTUNBZGRkckNudCA6JWQiLAorCSAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCBzZXQsCisJICAgICAgIHBNdWx0aWNhc3RBZGRycy0+dWxNdWx0aWNhc3RBZGRyQ250KTsKKworCXBBZGFwdGVyLT5tY19hZGRyX2xpc3QuaXNGaWx0ZXJBcHBsaWVkID0gc2V0ID8gdHJ1ZSA6IGZhbHNlOworCWNkZl9tZW1fZnJlZShwTXVsdGljYXN0QWRkcnMpOworCXJldHVybjsKK30KKyNlbmRpZgorCisvKioKKyAqIGhkZF9jb25mX3N1c3BlbmRfaW5kKCkgLSBTZW5kIFN1c3BlbmQgbm90aWZpY2F0aW9uCisgKiBAcEhkZEN0eDogSEREIEdsb2JhbCBjb250ZXh0CisgKiBAcEFkYXB0ZXI6IGFkYXB0ZXIgYmVpbmcgc3VzcGVuZGVkCisgKiBAY2FsbGJhY2s6IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB1cG9uIGNvbXBsZXRpb24KKyAqIEBjYWxsYmFja0NvbnRleHQ6IGNhbGxiYWNrIGNvbnRleHQgdG8gYmUgcGFzc2VkIGJhY2sgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBSZXR1cm46IE5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9jb25mX3N1c3BlbmRfaW5kKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSB2b2lkICgqY2FsbGJhY2spKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwKKwkJCQkJCSAgYm9vbCBzdXNwZW5kZWQpLAorCQkJCSB2b2lkICpjYWxsYmFja0NvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwU2lyV2xhblN1c3BlbmRQYXJhbSB3bGFuU3VzcGVuZFBhcmFtID0KKwkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJXbGFuU3VzcGVuZFBhcmFtKSk7CisKKwlpZiAoZmFsc2UgPT0gcEhkZEN0eC0+c3VzX3Jlc19tY2FzdGJjYXN0X2ZpbHRlcl92YWxpZCkgeworCQlwSGRkQ3R4LT5zdXNfcmVzX21jYXN0YmNhc3RfZmlsdGVyID0KKwkJCXBIZGRDdHgtPmNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyOworCQlwSGRkQ3R4LT5zdXNfcmVzX21jYXN0YmNhc3RfZmlsdGVyX3ZhbGlkID0gdHJ1ZTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCAib2ZmbG9hZDogaGRkX2NvbmZfc3VzcGVuZF9pbmQiKTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICAgICAgImNvbmZpZ3VyZWRNQ2FzdEJjYXN0RmlsdGVyIHNhdmVkID0gJWQiLAorCQkgICAgICAgcEhkZEN0eC0+Y29uZmlndXJlZE1jYXN0QmNhc3RGaWx0ZXIpOworCisJfQorCisJaWYgKE5VTEwgPT0gd2xhblN1c3BlbmRQYXJhbSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgIiVzOiBjZGZfbWVtX2FsbG9jIGZhaWxlZCAiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJICAgICAgICIlczogc2VuZCB3bGFuIHN1c3BlbmQgaW5kaWNhdGlvbiIsIF9fZnVuY19fKTsKKworCS8qIENvbmZpZ3VyZSBzdXBwb3J0ZWQgT2ZmTG9hZHMgKi8KKwloZGRfY29uZl9ob3N0b2ZmbG9hZChwQWRhcHRlciwgdHJ1ZSk7CisJd2xhblN1c3BlbmRQYXJhbS0+Y29uZmlndXJlZE1jc3RCY3N0RmlsdGVyU2V0dGluZyA9CisJCXBIZGRDdHgtPmNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyOworCisJLyogRW5hYmxlIE1DIGFkZHJlc3MgZmlsdGVyaW5nIGR1cmluZyBjZmc4MDIxMSBzdXNwZW5kIGlmIGFjdGl2ZSBtb2RlCisJICogbW9kZSBvZmZsb2FkIGlzIGRpc2FibGVkIGluIElOSQorCSAqLworCWlmICghcEhkZEN0eC0+Y29uZmlnLT5hY3RpdmVfbW9kZV9vZmZsb2FkKSB7CisJCWhkZF9pbmZvKCJlbmFibGUgbWMgYWRkcmVzcyBmaWx0ZXJpbmciKTsKKwkJd2xhbl9oZGRfc2V0X21jX2FkZHJfbGlzdChwQWRhcHRlciwgdHJ1ZSk7CisJfQorCisJaWYgKChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0KKwkgICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5jb25uU3RhdGUpIHx8CisJICAgIChlQ29ubmVjdGlvblN0YXRlX0lic3NDb25uZWN0ZWQgPT0KKwkgICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5jb25uU3RhdGUpKQorCQl3bGFuU3VzcGVuZFBhcmFtLT5jb25uZWN0ZWRTdGF0ZSA9IHRydWU7CisJZWxzZQorCQl3bGFuU3VzcGVuZFBhcmFtLT5jb25uZWN0ZWRTdGF0ZSA9IGZhbHNlOworCisJd2xhblN1c3BlbmRQYXJhbS0+c2Vzc2lvbklkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsKKwljZGZfcmV0X3N0YXR1cyA9CisJCXNtZV9jb25maWd1cmVfc3VzcGVuZF9pbmQocEhkZEN0eC0+aEhhbCwgd2xhblN1c3BlbmRQYXJhbSwKKwkJCQkJICBjYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0KTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IGNkZl9yZXRfc3RhdHVzKSB7CisJCXBIZGRDdHgtPmhkZF9tY2FzdGJjYXN0X2ZpbHRlcl9zZXQgPSB0cnVlOworCX0gZWxzZSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgic21lX2NvbmZpZ3VyZV9zdXNwZW5kX2luZCByZXR1cm5lZCBmYWlsdXJlICVkIiksCisJCSAgICAgICBjZGZfcmV0X3N0YXR1cyk7CisKKwkJY2RmX21lbV9mcmVlKHdsYW5TdXNwZW5kUGFyYW0pOworCX0KK30KKworLyoqCisgKiBoZGRfY29uZl9zdXNwZW5kX2luZCgpIC0gU2VuZCBSZXN1bWUgbm90aWZpY2F0aW9uCisgKiBAcEFkYXB0ZXI6IGFkYXB0ZXIgYmVpbmcgcmVzdW1lZAorICoKKyAqIFJldHVybjogTm9uZS4KKyAqLworc3RhdGljIHZvaWQgaGRkX2NvbmZfcmVzdW1lX2luZChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJY2RmX3JldF9zdGF0dXMgPSBzbWVfY29uZmlndXJlX3Jlc3VtZV9yZXEocEhkZEN0eC0+aEhhbCwgTlVMTCk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9yZXRfc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IHNtZV9jb25maWd1cmVfcmVzdW1lX3JlcSByZXR1cm4gZmFpbHVyZSAlZCIsCisJCSAgICAgICBfX2Z1bmNfXywgY2RmX3JldF9zdGF0dXMpOworCisJfQorCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAiJXM6IHNlbmQgd2xhbiByZXN1bWUgaW5kaWNhdGlvbiIsIF9fZnVuY19fKTsKKwkvKiBEaXNhYmxlIHN1cHBvcnRlZCBPZmZMb2FkcyAqLworCWhkZF9jb25mX2hvc3RvZmZsb2FkKHBBZGFwdGVyLCBmYWxzZSk7CisJcEhkZEN0eC0+aGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldCA9IGZhbHNlOworCisJaWYgKHRydWUgPT0gcEhkZEN0eC0+c3VzX3Jlc19tY2FzdGJjYXN0X2ZpbHRlcl92YWxpZCkgeworCQlwSGRkQ3R4LT5jb25maWd1cmVkTWNhc3RCY2FzdEZpbHRlciA9CisJCQlwSGRkQ3R4LT5zdXNfcmVzX21jYXN0YmNhc3RfZmlsdGVyOworCQlwSGRkQ3R4LT5zdXNfcmVzX21jYXN0YmNhc3RfZmlsdGVyX3ZhbGlkID0gZmFsc2U7CisJfQorCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAib2ZmbG9hZDogaW4gaGRkX2NvbmZfcmVzdW1lX2luZCwgcmVzdG9yaW5nIGNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyIik7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiY29uZmlndXJlZE1jYXN0QmNhc3RGaWx0ZXIgPSAlZCIsCisJICAgICAgIHBIZGRDdHgtPmNvbmZpZ3VyZWRNY2FzdEJjYXN0RmlsdGVyKTsKKworCS8qIERpc2FibGUgTUMgYWRkcmVzcyBmaWx0ZXJpbmcgZHVyaW5nIGNmZzgwMjExIHN1c3BlbmQgaWYgYWN0aXZlIG1vZGUKKwkgKiBtb2RlIG9mZmxvYWQgaXMgZGlzYWJsZWQgaW4gSU5JCisJICovCisJaWYgKCFwSGRkQ3R4LT5jb25maWctPmFjdGl2ZV9tb2RlX29mZmxvYWQpIHsKKwkJaGRkX2luZm8oImRpc2FibGUgbWMgYWRkcmVzcyBmaWx0ZXJpbmciKTsKKwkJd2xhbl9oZGRfc2V0X21jX2FkZHJfbGlzdChwQWRhcHRlciwgZmFsc2UpOworCX0KK30KKworLyoqCisgKiBoZGRfc3VzcGVuZF93bGFuKCkgLSBEcml2ZXIgc3VzcGVuZCBmdW5jdGlvbgorICogQGNhbGxiYWNrOiBDYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiBkcml2ZXIgaXMgcmVhZHkgdG8gc3VzcGVuZAorICogQGNhbGxiYWNrQ29udGV4dDogQ29udGV4dCB0byBwYXNzIGJhY2sgdG8gQGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogUmV0dXJuOiBOb25lLgorICovCitzdGF0aWMgdm9pZAoraGRkX3N1c3BlbmRfd2xhbih2b2lkICgqY2FsbGJhY2spKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgYm9vbCBzdXNwZW5kZWQpLAorCQkgdm9pZCAqY2FsbGJhY2tDb250ZXh0KQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogV0xBTiBiZWluZyBzdXNwZW5kZWQgYnkgT1MiLAorCSAgICAgICBfX2Z1bmNfXyk7CisKKwlwSGRkQ3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoIXBIZGRDdHgpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwSGRkQ3R4LT5pc0xvZ3BJblByb2dyZXNzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IElnbm9yZSBzdXNwZW5kIHdsYW4sIExPR1AgaW4gcHJvZ3Jlc3MhIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKHBIZGRDdHgsICZwQWRhcHRlck5vZGUpOworCXdoaWxlIChOVUxMICE9IHBBZGFwdGVyTm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCXBBZGFwdGVyID0gcEFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKworCQkvKiBzdG9wIGFsbCBUWCBxdWV1ZXMgYmVmb3JlIHN1c3BlbmQgKi8KKwkJaGRkTG9nKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCQl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLCBXTEFOX05FVElGX1RYX0RJU0FCTEUsCisJCQkJCSAgIFdMQU5fQ09OVFJPTF9QQVRIKTsKKworCQkvKiBTZW5kIHN1c3BlbmQgbm90aWZpY2F0aW9uIGRvd24gdG8gZmlybXdhcmUuCisJCSAqCisJCSAqIE4uQi46IEtlZXAgdGhpcyBzdXNwZW5kIGluZGljYXRpb24gYXQgdGhlIGVuZAorCQkgKiAoYmVmb3JlIHByb2Nlc3NpbmcgbmV4dCBhZGFwdG9yKS4gVGhpcyBpbmRpY2F0aW9uCisJCSAqIGlzIGNvbnNpZGVyZWQgYXMgdHJpZ2dlciBwb2ludCB0byBzdGFydCBXT1cgKGlmIHdvdworCQkgKiBpcyBlbmFibGVkKS4KKwkJICovCisJCWhkZF9jb25mX3N1c3BlbmRfaW5kKHBIZGRDdHgsIHBBZGFwdGVyLCBjYWxsYmFjaywKKwkJCQkgICAgIGNhbGxiYWNrQ29udGV4dCk7CisKKwkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIocEhkZEN0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQpOworCQlwQWRhcHRlck5vZGUgPSBwTmV4dDsKKwl9CisKKwlwSGRkQ3R4LT5oZGRfd2xhbl9zdXNwZW5kZWQgPSB0cnVlOworCisJcmV0dXJuOworfQorCisvKioKKyAqIGhkZF9yZXN1bWVfd2xhbigpIC0gRHJpdmVyIHJlc3VtZSBmdW5jdGlvbgorICoKKyAqIFJldHVybjogTm9uZS4KKyAqLworc3RhdGljIHZvaWQgaGRkX3Jlc3VtZV93bGFuKHZvaWQpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogV0xBTiBiZWluZyByZXN1bWVkIGJ5IE9TIiwKKwkgICAgICAgX19mdW5jX18pOworCisJcEhkZEN0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJaWYgKCFwSGRkQ3R4KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogSEREIGNvbnRleHQgaXMgTnVsbCIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEhkZEN0eC0+aXNMb2dwSW5Qcm9ncmVzcykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICAgICAiJXM6IElnbm9yZSByZXN1bWUgd2xhbiwgTE9HUCBpbiBwcm9ncmVzcyEiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlwSGRkQ3R4LT5oZGRfd2xhbl9zdXNwZW5kZWQgPSBmYWxzZTsKKworCS8qbG9vcCB0aHJvdWdoIGFsbCBhZGFwdGVycy4gQ29uY3VycmVuY3kgKi8KKwlzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIocEhkZEN0eCwgJnBBZGFwdGVyTm9kZSk7CisKKwl3aGlsZSAoTlVMTCAhPSBwQWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlwQWRhcHRlciA9IHBBZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisKKwkJLyogd2FrZSB0aGUgdHggcXVldWVzICovCisJCWhkZExvZyhMT0cxLCBGTCgiRW5hYmxpbmcgcXVldWVzIikpOworCQl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLAorCQkJCQlXTEFOX1dBS0VfQUxMX05FVElGX1FVRVVFLAorCQkJCQlXTEFOX0NPTlRST0xfUEFUSCk7CisKKwkJaGRkX2NvbmZfcmVzdW1lX2luZChwQWRhcHRlcik7CisKKwkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIocEhkZEN0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQpOworCQlwQWRhcHRlck5vZGUgPSBwTmV4dDsKKwl9CisJaGRkX2lwYV9yZXN1bWUocEhkZEN0eCk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogRE9DOiBTU1IgVGltZXIKKyAqCisgKiBXaGVuIFNTUiBpcyBpbml0aWF0ZWQsIGFuIFNTUiB0aW1lciBpcyBzdGFydGVkLiAgVW5kZXIgbm9ybWFsCisgKiBjaXJjdW1zdGFuY2VzIFNTUiBzaG91bGQgY29tcGxldGUgYW1kIHRoZSB0aW1lciBzaG91bGQgYmUgZGVsZXRlZAorICogYmVmb3JlIGl0IGZpcmVzLiAgSWYgdGhlIFNTUiB0aW1lciBkb2VzIGZpcmUsIGl0IGluZGljYXRlcyBTU1IgaGFzCisgKiB0YWtlbiB0b28gbG9uZywgYW5kIG91ciBvbmx5IHJlY291cnNlIGlzIHRvIGludm9rZSB0aGUgQ0RGX0JVRygpCisgKiBBUEkgd2hpY2ggY2FuIGFsbG93IGEgY3Jhc2hkdW1wIHRvIGJlIGNhcHR1cmVkLgorICovCisKKy8qKgorICogaGRkX3Nzcl90aW1lcl9pbml0KCkgLSBJbml0aWFsaXplIFNTUiBUaW1lcgorICoKKyAqIFJldHVybjogTm9uZS4KKyAqLworc3RhdGljIHZvaWQgaGRkX3Nzcl90aW1lcl9pbml0KHZvaWQpCit7CisJaW5pdF90aW1lcigmc3NyX3RpbWVyKTsKK30KKworLyoqCisgKiBoZGRfc3NyX3RpbWVyX2RlbCgpIC0gRGVsZXRlIFNTUiBUaW1lcgorICoKKyAqIFJldHVybjogTm9uZS4KKyAqLworc3RhdGljIHZvaWQgaGRkX3Nzcl90aW1lcl9kZWwodm9pZCkKK3sKKwlkZWxfdGltZXIoJnNzcl90aW1lcik7CisJc3NyX3RpbWVyX3N0YXJ0ZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBoZGRfc3NyX3RpbWVyX2NiKCkgLSBTU1IgVGltZXIgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBkYXRhOiBvcGFxdWUgZGF0YSByZWdpc3RlcmVkIHdpdGggdGltZXIgaW5mcmFzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm46IE5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9zc3JfdGltZXJfY2IodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogSEREIFNTUiB0aW1lciBleHBpcmVkISIsIF9fZnVuY19fKTsKKwlDREZfQlVHKDApOworfQorCisvKioKKyAqIGhkZF9zc3JfdGltZXJfc3RhcnQoKSAtIFN0YXJ0IFNTUiBUaW1lcgorICogQG1zZWM6IFRpbWVyIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCisgKgorICogUmV0dXJuOiBOb25lLgorICovCitzdGF0aWMgdm9pZCBoZGRfc3NyX3RpbWVyX3N0YXJ0KGludCBtc2VjKQoreworCWlmIChzc3JfdGltZXJfc3RhcnRlZCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgIiVzOiBUcnlpbmcgdG8gc3RhcnQgU1NSIHRpbWVyIHdoZW4gIiAiaXQncyBydW5uaW5nISIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJfQorCXNzcl90aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXNlYyk7CisJc3NyX3RpbWVyLmZ1bmN0aW9uID0gaGRkX3Nzcl90aW1lcl9jYjsKKwlhZGRfdGltZXIoJnNzcl90aW1lcik7CisJc3NyX3RpbWVyX3N0YXJ0ZWQgPSB0cnVlOworfQorCisvKioKKyAqIGhkZF93bGFuX3NodXRkb3duKCkgLSBIREQgU1NSIHNodXRkb3duIGZ1bmN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEhJRiB0byBzaHV0ZG93biB0aGUgZHJpdmVyIGR1cmluZyBTU1IuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIGRyaXZlciB3YXMgc2h1dCBkb3duLAorICoJb3IgYW4gZXJyb3Igc3RhdHVzIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTIGhkZF93bGFuX3NodXRkb3duKHZvaWQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXZfQ09OVEVYVF90IHBfY2RzX2NvbnRleHQgPSBOVUxMOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJcF9jZHNfc2NoZWRfY29udGV4dCBjZHNfc2NoZWRfY29udGV4dCA9IE5VTEw7CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFdMQU4gZHJpdmVyIHNodXR0aW5nIGRvd24hIiwKKwkgICAgICAgX19mdW5jX18pOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0xQU1MKKwl3bGFuX2hkZF9zZW5kX3N0YXR1c19wa2coTlVMTCwgTlVMTCwgMCwgMCk7CisjZW5kaWYKKworCS8qIElmIFNTUiBuZXZlciBjb21wbGV0ZXMsIHRoZW4gZG8ga2VybmVsIHBhbmljLiAqLworCWhkZF9zc3JfdGltZXJfaW5pdCgpOworCWhkZF9zc3JfdGltZXJfc3RhcnQoSEREX1NTUl9CUklOR19VUF9USU1FKTsKKworCS8qIEdldCB0aGUgZ2xvYmFsIENEUyBjb250ZXh0LiAqLworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKCFwX2Nkc19jb250ZXh0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogR2xvYmFsIENEUyBjb250ZXh0IGlzIE51bGwiLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyogR2V0IHRoZSBIREQgY29udGV4dC4gKi8KKwlwSGRkQ3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoIXBIZGRDdHgpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBIZGRDdHgtPmlzTG9ncEluUHJvZ3Jlc3MgPSB0cnVlOworCWNkc19zZXRfbG9ncF9pbl9wcm9ncmVzcyh0cnVlKTsKKworCWNkc19jbGVhcl9jb25jdXJyZW50X3Nlc3Npb25fY291bnQoKTsKKworCWhkZF9yZXNldF9hbGxfYWRhcHRlcnMocEhkZEN0eCk7CisKKwloZGRfaXBhX3VjX3Nzcl9kZWluaXQoKTsKKworCWNkc19zY2hlZF9jb250ZXh0ID0gZ2V0X2Nkc19zY2hlZF9jdHh0KCk7CisKKwkvKiBXYWtldXAgYWxsIGRyaXZlciB0aHJlYWRzICovCisJaWYgKHRydWUgPT0gcEhkZEN0eC0+aXNNY1RocmVhZFN1c3BlbmRlZCkgeworCQljb21wbGV0ZSgmY2RzX3NjaGVkX2NvbnRleHQtPlJlc3VtZU1jRXZlbnQpOworCQlwSGRkQ3R4LT5pc01jVGhyZWFkU3VzcGVuZGVkID0gZmFsc2U7CisJfQorI2lmZGVmIFFDQV9DT05GSUdfU01QCisJaWYgKHRydWUgPT0gcEhkZEN0eC0+aXNfb2xfcnhfdGhyZWFkX3N1c3BlbmRlZCkgeworCQljb21wbGV0ZSgmY2RzX3NjaGVkX2NvbnRleHQtPm9sX3Jlc3VtZV9yeF9ldmVudCk7CisJCXBIZGRDdHgtPmlzX29sX3J4X3RocmVhZF9zdXNwZW5kZWQgPSBmYWxzZTsKKwl9CisjZW5kaWYKKworCS8qIFN0b3AgYWxsIHRoZSB0aHJlYWRzOyB3ZSBkbyBub3Qgd2FudCBhbnkgbWVzc2FnZXMgdG8gYmUgYSBwcm9jZXNzZWQsCisJICogYW55IG1vcmUgYW5kIHRoZSBiZXN0IHdheSB0byBlbnN1cmUgdGhhdCBpcyB0byB0ZXJtaW5hdGUgdGhlIHRocmVhZHMKKwkgKiBncmFjZWZ1bGx5LgorCSAqLworCS8qIFdhaXQgZm9yIE1DIHRvIGV4aXQgKi8KKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFNodXR0aW5nIGRvd24gTUMgdGhyZWFkIiwgX19mdW5jX18pOworCXNldF9iaXQoTUNfU0hVVERPV05fRVZFTlRfTUFTSywgJmNkc19zY2hlZF9jb250ZXh0LT5tY0V2ZW50RmxhZyk7CisJc2V0X2JpdChNQ19QT1NUX0VWRU5UX01BU0ssICZjZHNfc2NoZWRfY29udGV4dC0+bWNFdmVudEZsYWcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2RzX3NjaGVkX2NvbnRleHQtPm1jV2FpdFF1ZXVlKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjZHNfc2NoZWRfY29udGV4dC0+TWNTaHV0ZG93bik7CisKKyNpZmRlZiBRQ0FfQ09ORklHX1NNUAorCS8qIFdhaXQgZm9yIE9MIFJYIHRvIGV4aXQgKi8KKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFNodXR0aW5nIGRvd24gT0wgUlggdGhyZWFkIiwKKwkgICAgICAgX19mdW5jX18pOworCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKGNkc19zY2hlZF9jb250ZXh0LT5jcHVfaG90X3BsdWdfbm90aWZpZXIpOworCXNldF9iaXQoUlhfU0hVVERPV05fRVZFTlRfTUFTSywgJmNkc19zY2hlZF9jb250ZXh0LT5vbF9yeF9ldmVudF9mbGFnKTsKKwlzZXRfYml0KFJYX1BPU1RfRVZFTlRfTUFTSywgJmNkc19zY2hlZF9jb250ZXh0LT5vbF9yeF9ldmVudF9mbGFnKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNkc19zY2hlZF9jb250ZXh0LT5vbF9yeF93YWl0X3F1ZXVlKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjZHNfc2NoZWRfY29udGV4dC0+b2xfcnhfc2h1dGRvd24pOworCWNkc19zY2hlZF9jb250ZXh0LT5vbF9yeF90aHJlYWQgPSBOVUxMOworCWNkc19kcm9wX3J4cGt0X2J5X3N0YWlkKGNkc19zY2hlZF9jb250ZXh0LCBXTEFOX01BWF9TVEFfQ09VTlQpOworCWNkc19mcmVlX29sX3J4X3BrdF9mcmVlcShjZHNfc2NoZWRfY29udGV4dCk7CisjZW5kaWYKKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRG9pbmcgV01BIFNUT1AiLCBfX2Z1bmNfXyk7CisJY2RmX3N0YXR1cyA9IHdtYV9zdG9wKHBfY2RzX2NvbnRleHQsIEhBTF9TVE9QX1RZUEVfUkZfS0lMTCk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gc3RvcCBXTUEiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKwkJd21hX3NldG5lZWRzaHV0ZG93bihwX2Nkc19jb250ZXh0KTsKKwl9CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IERvaW5nIFNNRSBTVE9QIiwgX19mdW5jX18pOworCS8qIFN0b3AgU01FIC0gQ2Fubm90IGludm9rZSBjZHNfZGlzYWJsZSBhcyBjZHNfZGlzYWJsZSByZWxpZXMKKwkgKiBvbiB0aHJlYWRzIGJlaW5nIHJ1bm5pbmcgdG8gcHJvY2VzcyB0aGUgU1lTIFN0b3AKKwkgKi8KKwljZGZfc3RhdHVzID0gc21lX3N0b3AocEhkZEN0eC0+aEhhbCwgSEFMX1NUT1BfVFlQRV9TWVNfUkVTRVQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBzdG9wIHNtZSAlZCIsIF9fZnVuY19fLCBjZGZfc3RhdHVzKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwl9CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IERvaW5nIE1BQyBTVE9QIiwgX19mdW5jX18pOworCS8qIFN0b3AgTUFDIChQRSBhbmQgSEFMKSAqLworCWNkZl9zdGF0dXMgPSBtYWNfc3RvcChwSGRkQ3R4LT5oSGFsLCBIQUxfU1RPUF9UWVBFX1NZU19SRVNFVCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRmFpbGVkIHRvIHN0b3AgbWFjICVkIiwgX19mdW5jX18sIGNkZl9zdGF0dXMpOworCQlDREZfQVNTRVJUKDApOworCX0KKworCWhpZl9kaXNhYmxlX2lzcigoKGNkc19jb250ZXh0X3R5cGUgKikgcF9jZHNfY29udGV4dCktPnBISUZDb250ZXh0KTsKKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBGbHVzaCBRdWV1ZXMiLCBfX2Z1bmNfXyk7CisJLyogQ2xlYW4gdXAgbWVzc2FnZSBxdWV1ZXMgb2YgVFgsIFJYIGFuZCBNQyB0aHJlYWQgKi8KKwljZHNfc2NoZWRfZmx1c2hfbWNfbXFzKGNkc19zY2hlZF9jb250ZXh0KTsKKworCS8qIERlaW5pdCBhbGwgdGhlIFRYLCBSWCBhbmQgTUMgcXVldWVzICovCisJY2RzX3NjaGVkX2RlaW5pdF9tcXMoY2RzX3NjaGVkX2NvbnRleHQpOworCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IERvaW5nIENEUyBTaHV0ZG93biIsIF9fZnVuY19fKTsKKwkvKiBzaHV0ZG93biBDRFMgKi8KKwljZHNfc2h1dGRvd24ocF9jZHNfY29udGV4dCk7CisKKwkvKm1hYyBjb250ZXh0IGhhcyBhbHJlYWR5IGJlZW4gcmVsZWFzZWQgaW4gbWFjX2Nsb3NlIGNhbGwKKwkgICBzbyBzZXR0aW5nIGl0IHRvIE5VTEwgaW4gaGRkIGNvbnRleHQgKi8KKwlwSGRkQ3R4LT5oSGFsID0gKHRIYWxIYW5kbGUpIE5VTEw7CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFdMQU4gZHJpdmVyIHNodXRkb3duIGNvbXBsZXRlIiwKKwkgICAgICAgX19mdW5jX18pOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogaGRkX3dsYW5fcmVfaW5pdCgpIC0gSEREIFNTUiByZS1pbml0IGZ1bmN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEhJRiB0byByZS1pbml0aWFsaXplIHRoZSBkcml2ZXIgYWZ0ZXIgU1NSLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBkcml2ZXIgd2FzIHJlLWluaXRpYWxpemVkLAorICoJb3IgYW4gZXJyb3Igc3RhdHVzIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTIGhkZF93bGFuX3JlX2luaXQodm9pZCAqaGlmX3NjKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl2X0NPTlRFWFRfdCBwX2Nkc19jb250ZXh0ID0gTlVMTDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCWludCBpOworCisJaGRkX3ByZXZlbnRfc3VzcGVuZChXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX0RSSVZFUl9SRUlOSVQpOworCisJLyogR2V0IHRoZSBDRFMgY29udGV4dCAqLworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisJaWYgKHBfY2RzX2NvbnRleHQgPT0gTlVMTCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgIiVzOiBGYWlsZWQgY2RzX2dldF9nbG9iYWxfY29udGV4dCIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfcmVfaW5pdDsKKwl9CisKKwkvKiBHZXQgdGhlIEhERCBjb250ZXh0ICovCisJcEhkZEN0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJaWYgKCFwSGRkQ3R4KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogSEREIGNvbnRleHQgaXMgTnVsbCIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3JlX2luaXQ7CisJfQorCisJaWYgKCFoaWZfc2MpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBoaWZfc2MgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfcmVfaW5pdDsKKwl9CisKKwkoKGNkc19jb250ZXh0X3R5cGUgKikgcF9jZHNfY29udGV4dCktPnBISUZDb250ZXh0ID0gaGlmX3NjOworCisJLyogVGhlIGRyaXZlciBzaG91bGQgYWx3YXlzIGJlIGluaXRpYWxpemVkIGluIFNUQSBtb2RlIGFmdGVyIFNTUiAqLworCWhkZF9zZXRfY29ucGFyYW0oMCk7CisKKwkvKiBSZS1vcGVuIENEUywgaXQgaXMgYSByZS1vcGVuIGInc2UgY29udHJvbCB0cmFuc3BvcnQgd2FzIG5ldmVyIGNsb3NlZC4gKi8KKwljZGZfc3RhdHVzID0gY2RzX29wZW4oJnBfY2RzX2NvbnRleHQsIDApOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogY2RzX29wZW4gZmFpbGVkIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9yZV9pbml0OworCX0KKworCS8qIFNhdmUgdGhlIGhhbCBjb250ZXh0IGluIEFkYXB0ZXIgKi8KKwlwSGRkQ3R4LT5oSGFsID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfU01FKTsKKwlpZiAoTlVMTCA9PSBwSGRkQ3R4LT5oSGFsKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogSEFMIGNvbnRleHQgaXMgbnVsbCIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2Nkc19jbG9zZTsKKwl9CisKKwkvKiBTZXQgdGhlIFNNRSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuICovCisJY2RmX3N0YXR1cyA9IGhkZF9zZXRfc21lX2NvbmZpZyhwSGRkQ3R4KTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBGYWlsZWQgaGRkX3NldF9zbWVfY29uZmlnIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJZ290byBlcnJfY2RzX2Nsb3NlOworCX0KKworCWNkZl9zdGF0dXMgPSBjZHNfcHJlX2VuYWJsZShwSGRkQ3R4LT5wY2RzX2NvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogY2RzX3ByZV9lbmFibGUgZmFpbGVkIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJZ290byBlcnJfY2RzX2Nsb3NlOworCX0KKworCW9sX3R4cnhfcmVnaXN0ZXJfcGF1c2VfY2Iod2xhbl9oZGRfdHhyeF9wYXVzZV9jYik7CisKKwljZGZfc3RhdHVzID0gaGRkX3NldF9zbWVfY2hhbl9saXN0KHBIZGRDdHgpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCSAgICAgICAiJXM6IEZhaWxlZCB0byBpbml0IGNoYW5uZWwgbGlzdCIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfY2RzX2Nsb3NlOworCX0KKworCS8qIEFwcGx5IHRoZSBjZmcuaW5pIHRvIGNmZy5kYXQgKi8KKwlpZiAoZmFsc2UgPT0gaGRkX3VwZGF0ZV9jb25maWdfZGF0KHBIZGRDdHgpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogY29uZmlnIHVwZGF0ZSBmYWlsZWQiLAorCQkgICAgICAgX19mdW5jX18pOworCQlnb3RvIGVycl9jZHNfY2xvc2U7CisJfQorCisJLyogU2V0IHRoZSBNQUMgQWRkcmVzcywgY3VycmVudGx5IHRoaXMgaXMgdXNlZCBieSBIQUwgdG8gYWRkIHNlbGYgc3RhLgorCSAqIFJlbW92ZSB0aGlzIG9uY2Ugc2VsZiBzdGEgaXMgYWRkZWQgYXMgcGFydCBvZiBzZXNzaW9uIG9wZW4uICovCisJY2RmX3JldF9zdGF0dXMgPSBjZmdfc2V0X3N0cihwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1NUQV9JRCwKKwkJCQkgICAgICh1aW50OF90ICopICZwSGRkQ3R4LT5jb25maWctPgorCQkJCSAgICAgaW50Zk1hY0FkZHJbMF0sCisJCQkJICAgICBzaXplb2YocEhkZEN0eC0+Y29uZmlnLT5pbnRmTWFjQWRkclswXSkpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9yZXRfc3RhdHVzKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEZhaWxlZCB0byBzZXQgTUFDIEFkZHJlc3MuICIKKwkJICAgICAgICJIQUxTdGF0dXMgaXMgJTA4ZCBbeCUwOHhdIiwgX19mdW5jX18sIGNkZl9yZXRfc3RhdHVzLAorCQkgICAgICAgY2RmX3JldF9zdGF0dXMpOworCQlnb3RvIGVycl9jZHNfY2xvc2U7CisJfQorCisJLyogU3RhcnQgQ0RTIHdoaWNoIHN0YXJ0cyB1cCB0aGUgU01FL01BQy9IQUwgbW9kdWxlcyBhbmQgZXZlcnl0aGluZyBlbHNlCisJICAgTm90ZTogRmlybXdhcmUgaW1hZ2Ugd2lsbCBiZSByZWFkIGFuZCBkb3dubG9hZGVkIGluc2lkZSBjZHNfZW5hYmxlIEFQSSAqLworCWNkZl9zdGF0dXMgPSBjZHNfZW5hYmxlKHBfY2RzX2NvbnRleHQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogY2RzX2VuYWJsZSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2Nkc19jbG9zZTsKKwl9CisKKwljZGZfc3RhdHVzID0gaGRkX3Bvc3RfY2RzX2VuYWJsZV9jb25maWcocEhkZEN0eCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJICAgICAgICIlczogaGRkX3Bvc3RfY2RzX2VuYWJsZV9jb25maWcgZmFpbGVkIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9jZHNfZGlzYWJsZTsKKwl9CisKKwkvKiBUcnkgdG8gZ2V0IGFuIGFkYXB0ZXIgZnJvbSBtb2RlIElEICovCisJcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwgV0xBTl9IRERfSU5GUkFfU1RBVElPTik7CisJaWYgKCFwQWRhcHRlcikgeworCQlwQWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LCBXTEFOX0hERF9TT0ZUQVApOworCQlpZiAoIXBBZGFwdGVyKSB7CisJCQlwQWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LCBXTEFOX0hERF9JQlNTKTsKKwkJCWlmICghcEFkYXB0ZXIpIHsKKwkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCSAgICAgICAiJXM6IEZhaWxlZCB0byBnZXQgQWRhcHRlciEiLCBfX2Z1bmNfXyk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaGRkX2lwYV91Y19zc3JfcmVpbml0KCkpCisJCWhkZExvZyhMT0dFLCAiJXM6IEhERCBJUEEgVUMgcmVpbml0IGZhaWxlZCIsIF9fZnVuY19fKTsKKworCS8qIEdldCBXTEFOIEhvc3QvRlcvSFcgdmVyc2lvbiAqLworCWlmIChwQWRhcHRlcikKKwkJaGRkX3dsYW5fZ2V0X3ZlcnNpb24ocEFkYXB0ZXIsIE5VTEwsIE5VTEwpOworCisJLyogUGFzcyBGVyB2ZXJzaW9uIHRvIEhJRiBsYXllciAqLworCWhpZl9zZXRfZndfaW5mbyhoaWZfc2MsIHBIZGRDdHgtPnRhcmdldF9md192ZXJzaW9uKTsKKworCS8qIFJlc3RhcnQgYWxsIGFkYXB0ZXJzICovCisJaGRkX3N0YXJ0X2FsbF9hZGFwdGVycyhwSGRkQ3R4KTsKKworCS8qIFJlY29uZmlndXJlIEZXIGxvZ3MgYWZ0ZXIgU1NSICovCisJaWYgKHBBZGFwdGVyKSB7CisJCWlmIChwSGRkQ3R4LT5md19sb2dfc2V0dGluZ3MuZW5hYmxlICE9IDApIHsKKwkJCXdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgIFdNSV9EQkdMT0dfTU9EVUxFX0VOQUJMRSwKKwkJCQkJICAgIHBIZGRDdHgtPmZ3X2xvZ19zZXR0aW5ncy5lbmFibGUsCisJCQkJCSAgICBEQkdfQ01EKTsKKwkJfSBlbHNlIHsKKwkJCXdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgIFdNSV9EQkdMT0dfTU9EVUxFX0RJU0FCTEUsCisJCQkJCSAgICBwSGRkQ3R4LT5md19sb2dfc2V0dGluZ3MuZW5hYmxlLAorCQkJCQkgICAgREJHX0NNRCk7CisJCX0KKworCQlpZiAocEhkZEN0eC0+ZndfbG9nX3NldHRpbmdzLmRsX3JlcG9ydCAhPSAwKSB7CisJCQl3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICBXTUlfREJHTE9HX1JFUE9SVF9FTkFCTEUsCisJCQkJCSAgICBwSGRkQ3R4LT5md19sb2dfc2V0dGluZ3MuCisJCQkJCSAgICBkbF9yZXBvcnQsIERCR19DTUQpOworCisJCQl3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICBXTUlfREJHTE9HX1RZUEUsCisJCQkJCSAgICBwSGRkQ3R4LT5md19sb2dfc2V0dGluZ3MuCisJCQkJCSAgICBkbF90eXBlLCBEQkdfQ01EKTsKKworCQkJd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgV01JX0RCR0xPR19MT0dfTEVWRUwsCisJCQkJCSAgICBwSGRkQ3R4LT5md19sb2dfc2V0dGluZ3MuCisJCQkJCSAgICBkbF9sb2dsZXZlbCwgREJHX0NNRCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfTU9EX0xPR0xFVkVMOyBpKyspIHsKKwkJCQlpZiAocEhkZEN0eC0+ZndfbG9nX3NldHRpbmdzLgorCQkJCQkJZGxfbW9kX2xvZ2xldmVsW2ldICE9IDApIHsKKwkJCQkJd21hX2NsaV9zZXRfY29tbWFuZCgKKwkJCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQlXTUlfREJHTE9HX01PRF9MT0dfTEVWRUwsCisJCQkJCQlwSGRkQ3R4LT5md19sb2dfc2V0dGluZ3MuCisJCQkJCQkJZGxfbW9kX2xvZ2xldmVsW2ldLAorCQkJCQkJREJHX0NNRCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcEhkZEN0eC0+aGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldCA9IGZhbHNlOworCXBIZGRDdHgtPmJ0Q29leE1vZGVTZXQgPSBmYWxzZTsKKwloZGRfc3NyX3RpbWVyX2RlbCgpOworCisJd2xhbl9oZGRfc2VuZF9zdmNfbmxpbmtfbXNnKFdMQU5fU1ZDX0ZXX0NSQVNIRURfSU5ELCBOVUxMLCAwKTsKKworCS8qIEFsbG93IHRoZSBwaG9uZSB0byBnbyB0byBzbGVlcCAqLworCWhkZF9hbGxvd19zdXNwZW5kKFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfRFJJVkVSX1JFSU5JVCk7CisKKwlzbWVfZXh0X3NjYW5fcmVnaXN0ZXJfY2FsbGJhY2socEhkZEN0eC0+aEhhbCwKKwkJCQl3bGFuX2hkZF9jZmc4MDIxMV9leHRzY2FuX2NhbGxiYWNrKTsKKwlzbWVfc2V0X3Jzc2lfdGhyZXNob2xkX2JyZWFjaGVkX2NiKHBIZGRDdHgtPmhIYWwsIGhkZF9yc3NpX3RocmVzaG9sZF9icmVhY2hlZCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTFBTUworCXdsYW5faGRkX3NlbmRfYWxsX3NjYW5faW50Zl9pbmZvKHBIZGRDdHgpOworCXdsYW5faGRkX3NlbmRfdmVyc2lvbl9wa2cocEhkZEN0eC0+dGFyZ2V0X2Z3X3ZlcnNpb24sCisJCQkJICBwSGRkQ3R4LT50YXJnZXRfaHdfdmVyc2lvbiwKKwkJCQkgIHBIZGRDdHgtPnRhcmdldF9od19uYW1lKTsKKyNlbmRpZgorCisJaGlmX2VuYWJsZV9wb3dlcl9nYXRpbmcoaGlmX3NjKTsKKwloZGRMb2coTE9HRSwKKwkJIiVzOiBXTEFOIGhvc3QgZHJpdmVyIHJlaW5pdGlhdGlvbiBjb21wbGV0ZWQhIiwgX19mdW5jX18pOworCWdvdG8gc3VjY2VzczsKKworZXJyX2Nkc19kaXNhYmxlOgorCWNkc19kaXNhYmxlKHBfY2RzX2NvbnRleHQpOworCitlcnJfY2RzX2Nsb3NlOgorCWNkc19jbG9zZShwX2Nkc19jb250ZXh0KTsKKwljZHNfc2NoZWRfY2xvc2UocF9jZHNfY29udGV4dCk7CisJaWYgKHBIZGRDdHgpIHsKKwkJLyogVW5yZWdpc3RlciB0aGUgTmV0IERldmljZSBOb3RpZmllciAqLworCQl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaGRkX25ldGRldl9ub3RpZmllcik7CisjaWZkZWYgV0xBTl9LRF9SRUFEWV9OT1RJRklFUgorCQljbnNzX2RpYWdfbm90aWZ5X3dsYW5fY2xvc2UoKTsKKwkJcHR0X3NvY2tfZGVhY3RpdmF0ZV9zdmMoKTsKKyNlbmRpZiAvKiBXTEFOX0tEX1JFQURZX05PVElGSUVSICovCisJCW5sX3Nydl9leGl0KCk7CisKKwkJLyogRnJlZSB1cCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtYmVycyBpbnNpZGUgSEREIEFkYXB0ZXIgKi8KKwkJa2ZyZWUocEhkZEN0eC0+Y29uZmlnKTsKKwkJcEhkZEN0eC0+Y29uZmlnID0gTlVMTDsKKworCQl3aXBoeV91bnJlZ2lzdGVyKHBIZGRDdHgtPndpcGh5KTsKKwkJd2lwaHlfZnJlZShwSGRkQ3R4LT53aXBoeSk7CisKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX211dGV4X2Rlc3Ryb3koCisJCQkJCSZwSGRkQ3R4LT5oZGRfY29uY19saXN0X2xvY2spKSkgeworCQkJaGRkX2VycigiRmFpbGVkIHRvIGRlc3Ryb3kgaGRkX2NvbmNfbGlzdF9sb2NrIik7CisJCQkvKiBQcm9jZWVkIGFuZCBjb21wbGV0ZSB0aGUgY2xlYW4gdXAgKi8KKwkJfQorCX0KKworZXJyX3JlX2luaXQ6CisJLyogQWxsb3cgdGhlIHBob25lIHRvIGdvIHRvIHNsZWVwICovCisJaGRkX2FsbG93X3N1c3BlbmQoV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19EUklWRVJfUkVJTklUKTsKKwlDREZfQlVHKDApOworCXJldHVybiAtRVBFUk07CisKK3N1Y2Nlc3M6CisJcEhkZEN0eC0+aXNMb2dwSW5Qcm9ncmVzcyA9IGZhbHNlOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd2xhbl9oZGRfc2V0X3Bvd2Vyc2F2ZSgpIC0gU2V0IHBvd2Vyc2F2ZSBtb2RlCisgKiBAYWRhcHRlcjogYWRhcHRlciB1cG9uIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyByZWNlaXZlZAorICogQG1vZGU6IGRlc2lyZWQgcG93ZXJzYXZlIG1vZGUKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gYW55IGVycm9yCisgKi8KK3N0YXRpYyBpbnQKK3dsYW5faGRkX3NldF9wb3dlcnNhdmUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgZW51bSBoZGRfcG93ZXJfbW9kZSBtb2RlKQoreworCXRIYWxIYW5kbGUgaGFsOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisKKwlpZiAoTlVMTCA9PSBhZGFwdGVyKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsIEZMKCJBZGFwdGVyIE5VTEwiKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCWlmICghaGRkX2N0eCkgeworCQloZGRfZXJyKEZMKCJoZGQgY29udGV4dCBpcyBOVUxMIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgRkwoInBvd2VyIG1vZGU9JWQiKSwgbW9kZSk7CisJaGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgoYWRhcHRlcik7CisKKworCWlmIChEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUgPT0gbW9kZSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAgICAgIEZMKCJXbGFuIGRyaXZlciBFbnRlcmluZyBGdWxsIFBvd2VyIikpOworCisJCS8qCisJCSAqIEVudGVyIEZ1bGwgcG93ZXIgY29tbWFuZCByZWNlaXZlZCBmcm9tIEdVSQorCQkgKiB0aGlzIG1lYW5zIHdlIGFyZSBkaXNjb25uZWN0ZWQKKwkJICovCisJCXNtZV9wc19lbmFibGVfZGlzYWJsZShoYWwsIGFkYXB0ZXItPnNlc3Npb25JZCwgU01FX1BTX0RJU0FCTEUpOworCX0gZWxzZSBpZiAoRFJJVkVSX1BPV0VSX01PREVfQVVUTyA9PSBtb2RlKSB7CisJCWlmICgoV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKwkJCQkoV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBhZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJCWhkZExvZyhMT0cxLCBGTCgiRGlzYWJsaW5nIEF1dG8gUG93ZXIgc2F2ZSB0aW1lciIpKTsKKwkJCXNtZV9wc19kaXNhYmxlX2F1dG9fcHNfdGltZXIoV0xBTl9IRERfR0VUX0hBTF9DVFgKKwkJCQkJKGFkYXB0ZXIpLAorCQkJCQlhZGFwdGVyLT5zZXNzaW9uSWQpOworCQl9CisJCWlmIChoZGRfY3R4LT5jb25maWcgJiYgaGRkX2N0eC0+Y29uZmlnLT5pc19wc19lbmFibGVkKSB7CisJCQloZGRMb2coTE9HMSwgRkwoIldsYW4gZHJpdmVyIEVudGVyaW5nIFBvd2VyIHNhdmUiKSk7CisKKwkJCS8qCisJCQkgKiBFbnRlciBQb3dlciBTYXZlIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSBHVUkKKwkJCSAqIHRoaXMgbWVhbnMgREhDUCBpcyBjb21wbGV0ZWQKKwkJCSAqLworCQkJc21lX3BzX2VuYWJsZV9kaXNhYmxlKGhhbCwgYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQlTTUVfUFNfRU5BQkxFKTsKKwkJfSBlbHNlIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCUZMKCJQb3dlciBTYXZlIGlzIG5vdCBlbmFibGVkIGluIHRoZSBjZmciKSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9yZXN1bWVfd2xhbigpIC0gY2ZnODAyMTEgcmVzdW1lIGNhbGxiYWNrCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqCisgKiBUaGlzIEFQSSBpcyBjYWxsZWQgd2hlbiBjZmc4MDIxMSBkcml2ZXIgcmVzdW1lcyBkcml2ZXIgdXBkYXRlcworICogbGF0ZXN0IHNjaGVkX3NjYW4gc2NhbiByZXN1bHQoaWYgYW55KSB0byBjZmc4MDIxMSBkYXRhYmFzZQorICoKKyAqIFJldHVybjogaW50ZWdlciBzdGF0dXMKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3Jlc3VtZV93bGFuKHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCWhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICpwQWRhcHRlck5vZGUsICpwTmV4dDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlpbnQgcmVzdWx0OworCXBfY2RzX3NjaGVkX2NvbnRleHQgY2RzX3NjaGVkX2NvbnRleHQgPSBnZXRfY2RzX3NjaGVkX2N0eHQoKTsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlc3VsdCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gcmVzdWx0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKyNpZmRlZiBDT05GSUdfQ05TUworCWNuc3NfcmVxdWVzdF9idXNfYmFuZHdpZHRoKENOU1NfQlVTX1dJRFRIX01FRElVTSk7CisjZW5kaWYKKworCS8qIFJlc3VtZSBNQyB0aHJlYWQgKi8KKwlpZiAocEhkZEN0eC0+aXNNY1RocmVhZFN1c3BlbmRlZCkgeworCQljb21wbGV0ZSgmY2RzX3NjaGVkX2NvbnRleHQtPlJlc3VtZU1jRXZlbnQpOworCQlwSGRkQ3R4LT5pc01jVGhyZWFkU3VzcGVuZGVkID0gZmFsc2U7CisJfQorI2lmZGVmIFFDQV9DT05GSUdfU01QCisJLyogUmVzdW1lIHRsc2hpbSBSeCB0aHJlYWQgKi8KKwlpZiAocEhkZEN0eC0+aXNfb2xfcnhfdGhyZWFkX3N1c3BlbmRlZCkgeworCQljb21wbGV0ZSgmY2RzX3NjaGVkX2NvbnRleHQtPm9sX3Jlc3VtZV9yeF9ldmVudCk7CisJCXBIZGRDdHgtPmlzX29sX3J4X3RocmVhZF9zdXNwZW5kZWQgPSBmYWxzZTsKKwl9CisjZW5kaWYKKwloZGRfcmVzdW1lX3dsYW4oKTsKKworCXNwaW5fbG9jaygmcEhkZEN0eC0+c2NoZWRTY2FuX2xvY2spOworCXBIZGRDdHgtPmlzV2lwaHlTdXNwZW5kZWQgPSBmYWxzZTsKKwlpZiAodHJ1ZSAhPSBwSGRkQ3R4LT5pc1NjaGVkU2NhblVwZGF0ZVBlbmRpbmcpIHsKKwkJc3Bpbl91bmxvY2soJnBIZGRDdHgtPnNjaGVkU2Nhbl9sb2NrKTsKKwkJaGRkTG9nKExPRzEsIEZMKCJSZXR1cm4gcmVzdW1lIGlzIG5vdCBkdWUgdG8gUE5PIGluZGljYXRpb24iKSk7CisJCXJldHVybiAwOworCX0KKwkvKiBSZXNldCBmbGFnIHRvIGF2b2lkIHVwZGF0YXRpbmcgY2ZnODAyMTEgZGF0YSBvbGQgcmVzdWx0cyBhZ2FpbiAqLworCXBIZGRDdHgtPmlzU2NoZWRTY2FuVXBkYXRlUGVuZGluZyA9IGZhbHNlOworCXNwaW5fdW5sb2NrKCZwSGRkQ3R4LT5zY2hlZFNjYW5fbG9jayk7CisKKwlzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIocEhkZEN0eCwgJnBBZGFwdGVyTm9kZSk7CisKKwl3aGlsZSAoTlVMTCAhPSBwQWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlwQWRhcHRlciA9IHBBZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisJCWlmICgoTlVMTCAhPSBwQWRhcHRlcikgJiYKKwkJICAgIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJCWlmICgwICE9CisJCQkgICAgd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2JzcyhwSGRkQ3R4LT53aXBoeSwKKwkJCQkJCQkgcEFkYXB0ZXIsIDApKSB7CisJCQkJaGRkTG9nKExPR1csIEZMKCJOTyBTQ0FOIHJlc3VsdCIpKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQWNxdWlyZSB3YWtlbG9jayB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUKKwkJCQkgKiBBUFAncyB0cmllcyB0byBzdXNwZW5kIGltbWVkaWF0ZWx5IGFmdGVyCisJCQkJICogdXBkYXRpbmcgdGhlIHNjYW4gcmVzdWx0cy4gV2hpcyByZXN1bHRzIGluCisJCQkJICogYXBwJ3MgaXMgaW4gc3VzcGVuZGVkIHN0YXRlIGFuZCBub3QgYWJsZSB0bworCQkJCSAqIHByb2Nlc3MgdGhlIGNvbm5lY3QgcmVxdWVzdCB0byBBUAorCQkJCSAqLworCQkJCWhkZF9wcmV2ZW50X3N1c3BlbmRfdGltZW91dCgyMDAwLAorCQkJCQlXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1JFU1VNRV9XTEFOKTsKKwkJCQljZmc4MDIxMV9zY2hlZF9zY2FuX3Jlc3VsdHMocEhkZEN0eC0+d2lwaHkpOworCQkJfQorCisJCQloZGRMb2coTE9HMSwKKwkJCSAgICAgICBGTCgiY2ZnODAyMTEgc2NhbiByZXN1bHQgZGF0YWJhc2UgdXBkYXRlZCIpKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlcihwSGRkQ3R4LCBwQWRhcHRlck5vZGUsICZwTmV4dCk7CisJCXBBZGFwdGVyTm9kZSA9IHBOZXh0OworCX0KKworCWhkZExvZyhMT0cxLCBGTCgiRmFpbGVkIHRvIGZpbmQgQWRhcHRlciIpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3JlYWR5X3RvX3N1c3BlbmQoKSAtIHNldCBjZmc4MDIxMSByZWFkeSB0byBzdXNwZW5kIGV2ZW50CisgKiBAY2FsbGJhY2tDb250ZXh0OiBQb2ludGVyIHRvIGNhbGxiYWNrIGNvbnRleHQKKyAqIEBzdXNwZW5kZWQ6IFN1c3BlbmQgZmxhZworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9yZWFkeV90b19zdXNwZW5kKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwKKwkJCQkJCWJvb2wgc3VzcGVuZGVkKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKSBjYWxsYmFja0NvbnRleHQ7CisJcEhkZEN0eC0+c3VzcGVuZGVkID0gc3VzcGVuZGVkOworCWNvbXBsZXRlKCZwSGRkQ3R4LT5yZWFkeV90b19zdXNwZW5kKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9yZXN1bWVfd2xhbigpIC0gY2ZnODAyMTEgcmVzdW1lIGNhbGxiYWNrCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqCisgKiBUaGlzIEFQSSBpcyBjYWxsZWQgd2hlbiBjZmc4MDIxMSBkcml2ZXIgcmVzdW1lcyBkcml2ZXIgdXBkYXRlcworICogbGF0ZXN0IHNjaGVkX3NjYW4gc2NhbiByZXN1bHQoaWYgYW55KSB0byBjZmc4MDIxMSBkYXRhYmFzZQorICoKKyAqIFJldHVybjogaW50ZWdlciBzdGF0dXMKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3Jlc3VtZV93bGFuKHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9yZXN1bWVfd2xhbih3aXBoeSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3N1c3BlbmRfd2xhbigpIC0gY2ZnODAyMTEgc3VzcGVuZCBjYWxsYmFjaworICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAd293OiBQb2ludGVyIHRvIHdvdworICoKKyAqIFRoaXMgQVBJIGlzIGNhbGxlZCB3aGVuIGNmZzgwMjExIGRyaXZlciBzdXNwZW5kcworICoKKyAqIFJldHVybjogaW50ZWdlciBzdGF0dXMKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3N1c3BlbmRfd2xhbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KQoreworI2lmZGVmIFFDQV9DT05GSUdfU01QCisjZGVmaW5lIFJYX1RMU0hJTV9TVVNQRU5EX1RJTUVPVVQgMjAwICAgLyogbXNlY3MgKi8KKyNlbmRpZgorCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlwX2Nkc19zY2hlZF9jb250ZXh0IGNkc19zY2hlZF9jb250ZXh0ID0gZ2V0X2Nkc19zY2hlZF9jdHh0KCk7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJaGRkX3NjYW5pbmZvX3QgKnBTY2FuSW5mbzsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlpbnQgcmM7CisKKwlFTlRFUigpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gcmMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBJZiBSQURBUiBkZXRlY3Rpb24gaXMgaW4gcHJvZ3Jlc3MgKEhERCksIHByZXZlbnQgc3VzcGVuZC4gVGhlIGZsYWcKKwkgKiAiZGZzX2NhY19ibG9ja190eCIgaXMgc2V0IHRvIHRydWUgd2hlbiBSQURBUiBpcyBmb3VuZCBhbmQgc3RheSB0cnVlCisJICogdW50aWwgQ0FDIGlzIGRvbmUgZm9yIGEgU29mdEFQIHdoaWNoIGlzIGluIHN0YXJ0ZWQgc3RhdGUuCisJICovCisJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKHBIZGRDdHgsICZwQWRhcHRlck5vZGUpOworCXdoaWxlIChOVUxMICE9IHBBZGFwdGVyTm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCXBBZGFwdGVyID0gcEFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKwkJaWYgKFdMQU5fSEREX1NPRlRBUCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHsKKwkJCWlmIChCU1NfU1RBUlQgPT0KKwkJCSAgICBXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihwQWRhcHRlciktPmJzc1N0YXRlICYmCisJCQkgICAgdHJ1ZSA9PQorCQkJICAgIFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBBZGFwdGVyKS0+CisJCQkgICAgZGZzX2NhY19ibG9ja190eCkgeworCQkJCWhkZExvZyhMT0cxLAorCQkJCQlGTCgiUkFEQVIgZGV0ZWN0aW9uIGluIHByb2dyZXNzLCBkbyBub3QgYWxsb3cgc3VzcGVuZCIpKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0gZWxzZSBpZiAoIXBIZGRDdHgtPmNvbmZpZy0+ZW5hYmxlU2FwU3VzcGVuZCkgeworCQkJCS8qIHJldHVybiAtRU9QTk9UU1VQUCBpZiBTQVAgZG9lcyBub3Qgc3VwcG9ydAorCQkJCSAqIHN1c3BlbmQKKwkJCQkgKi8KKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJRkwoIlNBUCBkb2VzIG5vdCBzdXBwb3J0IHN1c3BlbmQhISIpKTsKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQl9CisJCX0gZWxzZSBpZiAoV0xBTl9IRERfUDJQX0dPID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQkJaWYgKCFwSGRkQ3R4LT5jb25maWctPmVuYWJsZVNhcFN1c3BlbmQpIHsKKwkJCQkvKiByZXR1cm4gLUVPUE5PVFNVUFAgaWYgR08gZG9lcyBub3Qgc3VwcG9ydAorCQkJCSAqIHN1c3BlbmQKKwkJCQkgKi8KKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJRkwoIkdPIGRvZXMgbm90IHN1cHBvcnQgc3VzcGVuZCEhIikpOworCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJfQorCQlzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlcihwSGRkQ3R4LCBwQWRhcHRlck5vZGUsICZwTmV4dCk7CisJCXBBZGFwdGVyTm9kZSA9IHBOZXh0OworCX0KKworCS8qIFN0b3Agb25nb2luZyBzY2FuIG9uIGVhY2ggaW50ZXJmYWNlICovCisJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKHBIZGRDdHgsICZwQWRhcHRlck5vZGUpOworCXdoaWxlIChOVUxMICE9IHBBZGFwdGVyTm9kZSAmJiBDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCXBBZGFwdGVyID0gcEFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKwkJcFNjYW5JbmZvID0gJnBBZGFwdGVyLT5zY2FuX2luZm87CisKKwkJaWYgKHNtZV9zdGFfaW5fbWlkZGxlX29mX3JvYW1pbmcKKwkJCSAgICAocEhkZEN0eC0+aEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCkpIHsKKwkJCWhkZExvZyhMT0cxLAorCQkJCUZMKCJSb2FtaW5nIGluIHByb2dyZXNzLCBkbyBub3QgYWxsb3cgc3VzcGVuZCIpKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisKKwkJaWYgKHBIZGRDdHgtPmNvbmZpZy0+aXNfcHNfZW5hYmxlZCkgeworCQkJaWYgKHNtZV9pc19hdXRvX3BzX3RpbWVyX3J1bm5pbmcocEhkZEN0eC0+aEhhbCwKKwkJCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQpKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJCUZMKCJBdXRvIFBvd2VyIHNhdmUgdGltZXIgaXMgcnVubmluZzsgRG8gbm90IGFsbG93IHN1c3BlbmQiKSk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9IGVsc2UgeworCQkJCXNtZV9wc19lbmFibGVfZGlzYWJsZShwSGRkQ3R4LT5oSGFsLAorCQkJCQkJcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCVNNRV9QU19FTkFCTEUpOworCQkJCWhkZExvZyhMT0cxLAorCQkJCQlGTCgiQXV0byBQUyB0aW1lciBpcyBub3QgcnVubmluZzsgYWxsb3cgc3VzcGVuZCBhbmQgZW50ZXIgaW50byBwb3dlciBzYXZlIikpOworCQkJfQorCQl9CisKKwkJaWYgKHBTY2FuSW5mby0+bVNjYW5QZW5kaW5nKSB7CisJCQlJTklUX0NPTVBMRVRJT04ocFNjYW5JbmZvLT5hYm9ydHNjYW5fZXZlbnRfdmFyKTsKKwkJCWhkZF9hYm9ydF9tYWNfc2NhbihwSGRkQ3R4LCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICBlQ1NSX1NDQU5fQUJPUlRfREVGQVVMVCk7CisKKwkJCXN0YXR1cyA9CisJCQkJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwU2NhbkluZm8tPgorCQkJCSAgICBhYm9ydHNjYW5fZXZlbnRfdmFyLAorCQkJCSAgICBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX0FCT1JUU0NBTikpOworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkJRkwoIlRpbWVvdXQgb2NjdXJyZWQgd2hpbGUgd2FpdGluZyBmb3IgYWJvcnQgc2NhbiIpKTsKKwkJCQlyZXR1cm4gLUVUSU1FOworCQkJfQorCQl9CisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKHBIZGRDdHgsIHBBZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisJfQorCisJLyoKKwkgKiBTdXNwZW5kIElQQSBlYXJseSBiZWZvcmUgcHJvY2VlZGluZyB0byBzdXNwZW5kIG90aGVyIGVudGl0aWVzIGxpa2UKKwkgKiBmaXJtd2FyZSB0byBhdm9pZCBhbnkgcmFjZSBjb25kaXRpb25zLgorCSAqLworCWlmIChoZGRfaXBhX3N1c3BlbmQocEhkZEN0eCkpIHsKKwkJaGRkTG9nKExPRzEsIEZMKCJJUEEgbm90IHJlYWR5IHRvIHN1c3BlbmQhIikpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgdGFyZ2V0IHRvIGJlIHJlYWR5IGZvciBzdXNwZW5kICovCisJSU5JVF9DT01QTEVUSU9OKHBIZGRDdHgtPnJlYWR5X3RvX3N1c3BlbmQpOworCisJaGRkX3N1c3BlbmRfd2xhbigmd2xhbl9oZGRfY2ZnODAyMTFfcmVhZHlfdG9fc3VzcGVuZCwgcEhkZEN0eCk7CisKKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcEhkZEN0eC0+cmVhZHlfdG9fc3VzcGVuZCwKKwkJbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9SRUFEWV9UT19TVVNQRU5EKSk7CisJaWYgKCFyYykgeworCQloZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBnZXQgcmVhZHkgdG8gc3VzcGVuZCIpKTsKKwkJZ290byByZXN1bWVfdHg7CisJfQorCisJaWYgKCFwSGRkQ3R4LT5zdXNwZW5kZWQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWllZCBhcyBzdXNwZW5kX3N0YXR1cyBpcyB3cm9uZzolZCIpLAorCQkJcEhkZEN0eC0+c3VzcGVuZGVkKTsKKwkJZ290byByZXN1bWVfdHg7CisJfQorCisJLyogU3VzcGVuZCBNQyB0aHJlYWQgKi8KKwlzZXRfYml0KE1DX1NVU1BFTkRfRVZFTlRfTUFTSywgJmNkc19zY2hlZF9jb250ZXh0LT5tY0V2ZW50RmxhZyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjZHNfc2NoZWRfY29udGV4dC0+bWNXYWl0UXVldWUpOworCisJLyogV2FpdCBmb3Igc3VzcGVuZCBjb25maXJtYXRpb24gZnJvbSBNQyB0aHJlYWQgKi8KKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcEhkZEN0eC0+bWNfc3VzX2V2ZW50X3ZhciwKKwkJbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9NQ1RIUkVBRF9TVVNQRU5EKSk7CisJaWYgKCFyYykgeworCQljbGVhcl9iaXQoTUNfU1VTUEVORF9FVkVOVF9NQVNLLAorCQkJICAmY2RzX3NjaGVkX2NvbnRleHQtPm1jRXZlbnRGbGFnKTsKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gc3RvcCBtYyB0aHJlYWQiKSk7CisJCWdvdG8gcmVzdW1lX3R4OworCX0KKworCXBIZGRDdHgtPmlzTWNUaHJlYWRTdXNwZW5kZWQgPSB0cnVlOworCisjaWZkZWYgUUNBX0NPTkZJR19TTVAKKwkvKiBTdXNwZW5kIHRsc2hpbSByeCB0aHJlYWQgKi8KKwlzZXRfYml0KFJYX1NVU1BFTkRfRVZFTlRfTUFTSywgJmNkc19zY2hlZF9jb250ZXh0LT5vbF9yeF9ldmVudF9mbGFnKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNkc19zY2hlZF9jb250ZXh0LT5vbF9yeF93YWl0X3F1ZXVlKTsKKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY2RzX3NjaGVkX2NvbnRleHQtPgorCQkJCQkgb2xfc3VzcGVuZF9yeF9ldmVudCwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCSAoUlhfVExTSElNX1NVU1BFTkRfVElNRU9VVCkpOworCWlmICghcmMpIHsKKwkJY2xlYXJfYml0KFJYX1NVU1BFTkRfRVZFTlRfTUFTSywKKwkJCSAgJmNkc19zY2hlZF9jb250ZXh0LT5vbF9yeF9ldmVudF9mbGFnKTsKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gc3RvcCB0bF9zaGltIHJ4IHRocmVhZCIpKTsKKwkJZ290byByZXN1bWVfYWxsOworCX0KKwlwSGRkQ3R4LT5pc19vbF9yeF90aHJlYWRfc3VzcGVuZGVkID0gdHJ1ZTsKKyNlbmRpZgorCisJcEhkZEN0eC0+aXNXaXBoeVN1c3BlbmRlZCA9IHRydWU7CisKKyNpZmRlZiBDT05GSUdfQ05TUworCWNuc3NfcmVxdWVzdF9idXNfYmFuZHdpZHRoKENOU1NfQlVTX1dJRFRIX05PTkUpOworI2VuZGlmCisKKwlFWElUKCk7CisJcmV0dXJuIDA7CisKKyNpZmRlZiBRQ0FfQ09ORklHX1NNUAorcmVzdW1lX2FsbDoKKworCWNvbXBsZXRlKCZjZHNfc2NoZWRfY29udGV4dC0+UmVzdW1lTWNFdmVudCk7CisJcEhkZEN0eC0+aXNNY1RocmVhZFN1c3BlbmRlZCA9IGZhbHNlOworI2VuZGlmCisKK3Jlc3VtZV90eDoKKworCWhkZF9yZXN1bWVfd2xhbigpOworCXJldHVybiAtRVRJTUU7CisKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zdXNwZW5kX3dsYW4oKSAtIGNmZzgwMjExIHN1c3BlbmQgY2FsbGJhY2sKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQHdvdzogUG9pbnRlciB0byB3b3cKKyAqCisgKiBUaGlzIEFQSSBpcyBjYWxsZWQgd2hlbiBjZmc4MDIxMSBkcml2ZXIgc3VzcGVuZHMKKyAqCisgKiBSZXR1cm46IGludGVnZXIgc3RhdHVzCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zdXNwZW5kX3dsYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9zdXNwZW5kX3dsYW4od2lwaHksIHdvdyk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9wb3dlcl9tZ210KCkgLSBzZXQgY2ZnODAyMTEgcG93ZXIgbWFuYWdlbWVudCBjb25maWcKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQG1vZGU6IERyaXZlciBtb2RlCisgKiBAdGltZW91dDogVGltZW91dCB2YWx1ZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9wb3dlcl9tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgbW9kZSwKKwkJCQkJICAgICAgaW50IHRpbWVvdXQpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwlpbnQgc3RhdHVzOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9TRVRfUE9XRVJfTUdNVCwKKwkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLCB0aW1lb3V0KSk7CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoKERSSVZFUl9QT1dFUl9NT0RFX0FVVE8gPT0gIW1vZGUpICYmCisJICAgICh0cnVlID09IHBIZGRDdHgtPmhkZF93bGFuX3N1c3BlbmRlZCkgJiYKKwkgICAgKHBIZGRDdHgtPmNvbmZpZy0+Zmhvc3RBcnBPZmZsb2FkKSAmJgorCSAgICAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09CisJICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uY29ublN0YXRlKSkgeworCisJCWhkZExvZyhMT0cxLAorCQkJRkwoIm9mZmxvYWQ6IGluIGNmZzgwMjExX3NldF9wb3dlcl9tZ210LCBjYWxsaW5nIGFycCBvZmZsb2FkIikpOworCQljZGZfc3RhdHVzID0gaGRkX2NvbmZfYXJwX29mZmxvYWQocEFkYXB0ZXIsIHRydWUpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJaGRkTG9nKExPRzEsCisJCQkJRkwoIkZhaWxlZCB0byBlbmFibGUgQVJQT0ZGTE9BRCBGZWF0dXJlICVkIiksCisJCQkJY2RmX3N0YXR1cyk7CisJCX0KKwl9CisKKwlzdGF0dXMgPSB3bGFuX2hkZF9zZXRfcG93ZXJzYXZlKHBBZGFwdGVyLCAhbW9kZSk7CisKKwlpZiAoIW1vZGUpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJESENQIHN0YXJ0IGluZGljYXRlZCB0aHJvdWdoIHBvd2VyIHNhdmUiKSk7CisJCXNtZV9kaGNwX3N0YXJ0X2luZChwSGRkQ3R4LT5oSGFsLCBwQWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkJICAgcEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLAorCQkJCSAgIHBBZGFwdGVyLT5zZXNzaW9uSWQpOworCX0gZWxzZSB7CisJCWhkZExvZyhMT0dXLCBGTCgiREhDUCBzdG9wIGluZGljYXRlZCB0aHJvdWdoIHBvd2VyIHNhdmUiKSk7CisJCXNtZV9kaGNwX3N0b3BfaW5kKHBIZGRDdHgtPmhIYWwsIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSwKKwkJCQkgIHBBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcywKKwkJCQkgIHBBZGFwdGVyLT5zZXNzaW9uSWQpOworCX0KKworCUVYSVQoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3NldF9wb3dlcl9tZ210KCkgLSBzZXQgY2ZnODAyMTEgcG93ZXIgbWFuYWdlbWVudCBjb25maWcKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQG1vZGU6IERyaXZlciBtb2RlCisgKiBAdGltZW91dDogVGltZW91dCB2YWx1ZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3NldF9wb3dlcl9tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIG1vZGUsCisJCQkJICAgICBpbnQgdGltZW91dCkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3NldF9wb3dlcl9tZ210KHdpcGh5LCBkZXYsIG1vZGUsIHRpbWVvdXQpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfdHhwb3dlcigpIC0gc2V0IFRYIHBvd2VyCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKiBAdHlwZTogVFggcG93ZXIgc2V0dGluZyB0eXBlCisgKiBAZGJtOiBUWCBwb3dlciBpbiBkYm0KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9zZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA4LCAwKQorCQkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorI2VuZGlmCisJCQkJCSAgIGVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIHR5cGUsCisJCQkJCSAgIGludCBkYm0pCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopIHdpcGh5X3ByaXYod2lwaHkpOworCXRIYWxIYW5kbGUgaEhhbCA9IE5VTEw7CisJdFNpck1hY0FkZHIgYnNzaWQgPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKKwl0U2lyTWFjQWRkciBzZWxmTWFjID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CisJaW50IHN0YXR1czsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0VUX1RYUE9XRVIsCisJCQkgTk9fU0VTU0lPTiwgdHlwZSkpOworCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaEhhbCA9IHBIZGRDdHgtPmhIYWw7CisKKwlpZiAoMCAhPSBzbWVfY2ZnX3NldF9pbnQoaEhhbCwgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMLCBkYm0pKSB7CisJCWhkZExvZyhMT0dFLCBGTCgic21lX2NmZ19zZXRfaW50IGZhaWxlZCBmb3IgdHggcG93ZXIgJWh1IiksCisJCQkJZGJtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaGRkTG9nKExPRzIsIEZMKCJTZXQgdHggcG93ZXIgbGV2ZWwgJWQgZGJtIiksIGRibSk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwkvKiBBdXRvbWF0aWNhbGx5IGRldGVybWluZSB0cmFuc21pdCBwb3dlciAqLworCWNhc2UgTkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUM6CisJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBOTDgwMjExX1RYX1BPV0VSX0xJTUlURUQ6ICAvKiBMaW1pdCBUWCBwb3dlciBieSB0aGUgbUJtIHBhcmFtZXRlciAqLworCQlpZiAoc21lX3NldF9tYXhfdHhfcG93ZXIoaEhhbCwgYnNzaWQsIHNlbGZNYWMsIGRibSkgIT0KKwkJICAgIENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJaGRkTG9nKExPR0UsIEZMKCJTZXR0aW5nIG1heGltdW0gdHggcG93ZXIgZmFpbGVkIikpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5MODAyMTFfVFhfUE9XRVJfRklYRUQ6ICAgIC8qIEZpeCBUWCBwb3dlciB0byB0aGUgbUJtIHBhcmFtZXRlciAqLworCQloZGRMb2coTE9HRSwgRkwoIk5MODAyMTFfVFhfUE9XRVJfRklYRUQgbm90IHN1cHBvcnRlZCIpKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBwb3dlciBzZXR0aW5nIHR5cGUgJWQiKSwgdHlwZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfdHhwb3dlcigpIC0gc2V0IFRYIHBvd2VyCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKiBAdHlwZTogVFggcG93ZXIgc2V0dGluZyB0eXBlCisgKiBAZGJtOiBUWCBwb3dlciBpbiBkYm0KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA4LCAwKQorCQkJCSAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKyNlbmRpZgorCQkJCSAgZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgdHlwZSwKKwkJCQkgIGludCBkYm0pCit7CisJaW50IHJldDsKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3R4cG93ZXIod2lwaHksCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDgsIDApCisJCQkJCSAgICAgIHdkZXYsCisjZW5kaWYKKwkJCQkJICAgICAgdHlwZSwgZGJtKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3R4cG93ZXIoKSAtIGdldCBUWCBwb3dlcgorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAd2RldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQGRibTogUG9pbnRlciB0byBUWCBwb3dlciBpbiBkYm0KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9nZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA4LCAwKQorCQkJCSAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKyNlbmRpZgorCQkJCSAgaW50ICpkYm0pCit7CisKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlcjsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKikgd2lwaHlfcHJpdih3aXBoeSk7CisJaW50IHN0YXR1czsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQkqZGJtID0gMDsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwQWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LCBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKTsKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQloZGRMb2coTE9HRSwgRkwoInBBZGFwdGVyIGlzIE5VTEwiKSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXdsYW5faGRkX2dldF9jbGFzc19hc3RhdHMocEFkYXB0ZXIpOworCSpkYm0gPSBwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0Lm1heF9wd3I7CisKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3R4cG93ZXIoKSAtIGNmZzgwMjExIGdldCBwb3dlciBoYW5kbGVyIGZ1bmN0aW9uCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkgc3RydWN0dXJlLgorICogQHdkZXY6IFBvaW50ZXIgdG8gd2lyZWxlc3NfZGV2IHN0cnVjdHVyZS4KKyAqIEBkYm06IGRibQorICoKKyAqIFRoaXMgaXMgdGhlIGNmZzgwMjExIGdldCB0eHBvd2VyIGhhbmRsZXIgZnVuY3Rpb24gd2hpY2ggaW52b2tlcworICogdGhlIGludGVybmFsIGZ1bmN0aW9uIEBfX3dsYW5faGRkX2NmZzgwMjExX2dldF90eHBvd2VyIHdpdGgKKyAqIFNTUiBwcm90ZWN0aW9uLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcywgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCA4LCAwKSB8fCBkZWZpbmVkKFdJVEhfQkFDS1BPUlRTKQorCQkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKyNlbmRpZgorCQkJCQkgaW50ICpkYm0pCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9nZXRfdHhwb3dlcih3aXBoeSwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgOCwgMCkgfHwgZGVmaW5lZChXSVRIX0JBQ0tQT1JUUykKKwkJCQkJCXdkZXYsCisjZW5kaWYKKwkJCQkJCWRibSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9zY2FuLmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDRjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfc2Nhbi5jCkBAIC0wLDAgKzEsMjQyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBET0M6IHdsYW5faGRkX3NjYW4uYworICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIHNjYW4gaW1wbGVtZW50YXRpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKworI2luY2x1ZGUgIndsYW5faGRkX2luY2x1ZGVzLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAiZG90MTFmLmgiCisjaW5jbHVkZSAiY2RzX3NjaGVkLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfcDJwLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfdHJhY2UuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9zY2FuLmgiCisjaW5jbHVkZSAiY2RzX2NvbmN1cnJlbmN5LmgiCisjaW5jbHVkZSAid21hX2FwaS5oIgorCisjZGVmaW5lIE1BWF9SQVRFUyAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgSEREX1dBS0VfTE9DS19TQ0FOX0RVUkFUSU9OICg1ICogMTAwMCkgLyogaW4gbXNlYyAqLworCisjZGVmaW5lIFNDQU5fRE9ORV9FVkVOVF9CVUZfU0laRSA0MDk2CisjZGVmaW5lIFJBVEVfTUFTSyAweDdmCisKKy8qKgorICogdHlwZWRlZiB0U1NJREJjYXN0VHlwZSAtIFNTSUQgYnJvYWRjYXN0IHR5cGUKKyAqIEBlQkNBU1RfVU5LTk9XTjogQnJvYWRjYXN0IHVua25vd24KKyAqIEBlQkNBU1RfTk9STUFMOiBCcm9hZGNhc3Qgbm9ybWFsCisgKiBAZUJDQVNUX0hJRERFTjogQnJvYWRjYXN0IGhpZGRlbgorICovCit0eXBlZGVmIGVudW0gZVNTSURCY2FzdFR5cGUgeworCWVCQ0FTVF9VTktOT1dOID0gMCwKKwllQkNBU1RfTk9STUFMID0gMSwKKwllQkNBU1RfSElEREVOID0gMiwKK30gdFNTSURCY2FzdFR5cGU7CisKKworLyoqCisgKiB0eXBlZGVmIGhkZF9zY2FuX2luZm9fdCAtIEhERCBzY2FuIGluZm8KKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0IGRldmljZQorICogQGluZm86IFBvaW50ZXIgdG8gcmVxdWVzdCBpbmZvCisgKiBAc3RhcnQ6IFN0YXJ0IHBvaW50ZXIKKyAqIEBlbmQ6IEVuZCBwb2ludGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IGhkZF9zY2FuX2luZm8geworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbzsKKwljaGFyICpzdGFydDsKKwljaGFyICplbmQ7Cit9IGhkZF9zY2FuX2luZm9fdCwgKmhkZF9zY2FuX2luZm9fdHA7CisKKy8qKgorICogaGRkX3RyYW5zbGF0ZV9hYmdfcmF0ZV90b19tYnBzX3JhdGUoKSAtIHRyYW5zbGF0ZSBhYmcgcmF0ZSB0byBNYnBzIHJhdGUKKyAqIEBwRmNSYXRlOiBSYXRlIHBvaW50ZXIKKyAqCisgKiBSZXR1cm46IE1icHMgcmF0ZSBpbiBpbnRlZ2VyCisgKi8KK3N0YXRpYyBpbnQzMl90IGhkZF90cmFuc2xhdGVfYWJnX3JhdGVfdG9fbWJwc19yYXRlKHVpbnQ4X3QgKnBGY1JhdGUpCit7CisJLyogU2xpZ2h0bHkgbW9yZSBzb3BoaXN0aWNhdGVkIHByb2Nlc3NpbmcgaGFzIHRvIHRha2UgcGxhY2UgaGVyZS4KKwkgKiBCYXNpYyByYXRlcyBhcmUgcm91bmRlZCBET1dOLiAgSFQgcmF0ZXMgYXJlIHJvdW5kZWQgVVAKKwkgKi8KKwlyZXR1cm4gKCgoKGludDMyX3QpICpwRmNSYXRlKSAmIDB4MDA3ZikgKiAxMDAwMDAwKSAvIDI7Cit9CisKKy8qKgorICogaGRkX2FkZF9pd19zdHJlYW1fZXZlbnQoKSAtIGFkZCBpdyBzdHJlYW0gZXZlbnQKKyAqIEBjbWQ6IENvbW1hbmQKKyAqIEBsZW5ndGg6IExlbmd0aAorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQHBzY2FuSW5mbzogUG9pbnRlciB0byBzY2FuIGluZm8KKyAqIEBsYXN0X2V2ZW50OiBQb2ludGVyIHRvIHBvaW50ZXIgdG8gbGFzdCBldmVudAorICogQGN1cnJlbnRfZXZlbnQ6IFBvaW50ZXIgdG8gcG9pbnRlciB0byBjdXJyZW50IGV2ZW50CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IGhkZF9hZGRfaXdfc3RyZWFtX2V2ZW50KGludCBjbWQsIGludCBsZW5ndGgsIGNoYXIgKmRhdGEsCisJCQkJICAgaGRkX3NjYW5faW5mb190ICpwc2NhbkluZm8sCisJCQkJICAgY2hhciAqKmxhc3RfZXZlbnQsCisJCQkJICAgY2hhciAqKmN1cnJlbnRfZXZlbnQpCit7CisJc3RydWN0IGl3X2V2ZW50IGV2ZW50OworCisJKmxhc3RfZXZlbnQgPSAqY3VycmVudF9ldmVudDsKKwljZGZfbWVtX3plcm8oJmV2ZW50LCBzaXplb2Yoc3RydWN0IGl3X2V2ZW50KSk7CisJZXZlbnQuY21kID0gY21kOworCWV2ZW50LnUuZGF0YS5mbGFncyA9IDE7CisJZXZlbnQudS5kYXRhLmxlbmd0aCA9IGxlbmd0aDsKKwkqY3VycmVudF9ldmVudCA9CisJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KHBzY2FuSW5mby0+aW5mbywgKmN1cnJlbnRfZXZlbnQsCisJCQkJICAgICBwc2NhbkluZm8tPmVuZCwgJmV2ZW50LCBkYXRhKTsKKworCWlmICgqbGFzdF9ldmVudCA9PSAqY3VycmVudF9ldmVudCkgeworCQkvKiBubyBzcGFjZSB0byBhZGQgZXZlbnQgKi8KKwkJaGRkTG9nKExPR0UsICIlczogbm8gc3BhY2UgbGVmdCB0byBhZGQgZXZlbnQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRTJCSUc7ICAvKiBFcnJvciBjb2RlLCBtYXkgYmUgRTJCSUcgKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfZ2V0X3dwYXJzbl9pZXMoKSAtIGdldCB3cGEgUlNOIElFcworICogQGllRmllbGRzOiBQb2ludGVyIHRvIHRoZSBCc3MgRGVzY3JpcHRvciBJRXMKKyAqIEBpZV9sZW5ndGg6IElFIExlbmd0aAorICogQGxhc3RfZXZlbnQ6IFBvaW50cyB0byBsYXN0IGV2ZW50CisgKiBAY3VycmVudF9ldmVudDogUG9pbnRzIHRvIGN1cnJlbnQgZXZlbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3QgdGhlIFdQQS9SU04gSUUgZnJvbSB0aGUgQnNzIGRlc2NyaXB0b3IgSUVzIGZpZWxkcworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoZGRfZ2V0X3dwYXJzbl9pZXModWludDhfdCAqaWVGaWVsZHMsIHVpbnQxNl90IGllX2xlbmd0aCwKKwkJCSAgICAgIGNoYXIgKipsYXN0X2V2ZW50LCBjaGFyICoqY3VycmVudF9ldmVudCwKKwkJCSAgICAgIGhkZF9zY2FuX2luZm9fdCAqcHNjYW5JbmZvKQoreworCXVpbnQ4X3QgZWlkLCBlbGVuLCAqZWxlbWVudDsKKwl1aW50MTZfdCB0aWVfbGVuZ3RoID0gMDsKKworCUVOVEVSKCk7CisKKwllbGVtZW50ID0gaWVGaWVsZHM7CisJdGllX2xlbmd0aCA9IGllX2xlbmd0aDsKKworCXdoaWxlICh0aWVfbGVuZ3RoID4gMiAmJiBlbGVtZW50ICE9IE5VTEwpIHsKKwkJZWlkID0gZWxlbWVudFswXTsKKwkJZWxlbiA9IGVsZW1lbnRbMV07CisKKwkJLyogSWYgZWxlbWVudCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRvdGFsIHJlbWFpbmluZyBpZSBsZW5ndGgsCisJCSAqIGJyZWFrIHRoZSBsb29wCisJCSAqLworCQlpZiAoKGVsZW4gKyAyKSA+IHRpZV9sZW5ndGgpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGVpZCkgeworCQljYXNlIERPVDExRl9FSURfV1BBOgorCQljYXNlIERPVDExRl9FSURfUlNOOgorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJCWNhc2UgRE9UMTFGX0VJRF9XQVBJOgorI2VuZGlmCisJCQlpZiAoaGRkX2FkZF9pd19zdHJlYW1fZXZlbnQKKwkJCQkgICAgKElXRVZHRU5JRSwgZWxlbiArIDIsIChjaGFyICopZWxlbWVudCwgcHNjYW5JbmZvLAorCQkJCSAgICBsYXN0X2V2ZW50LCBjdXJyZW50X2V2ZW50KSA8IDApCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCS8qIE5leHQgZWxlbWVudCAqLworCQl0aWVfbGVuZ3RoIC09ICgyICsgZWxlbik7CisJCWVsZW1lbnQgKz0gMiArIGVsZW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX2luZGljYXRlX3NjYW5fcmVzdWx0KCkgLSBpbmRpY2F0ZSBzY2FuIHJlc3VsdHMKKyAqIEBzY2FuSW5mbzogUG9pbnRlciB0byB0aGUgc2NhbiBpbmZvIHN0cnVjdHVyZS4KKyAqIEBkZXNjcmlwdG9yOiBQb2ludGVyIHRvIHRoZSBCc3MgRGVzY3JpcHRvci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNjYW4gcmVzdWx0cyB0byB0aGUgd3BhX3N1cHBsaWNhbnQKKyAqCisgKiBAUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICovCisjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDY0CitzdGF0aWMgaW50IGhkZF9pbmRpY2F0ZV9zY2FuX3Jlc3VsdChoZGRfc2Nhbl9pbmZvX3QgKnNjYW5JbmZvLAorCQkJCSAgICB0Q3NyU2NhblJlc3VsdEluZm8gKnNjYW5fcmVzdWx0KQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKHNjYW5JbmZvLT5kZXYpOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwl0U2lyQnNzRGVzY3JpcHRpb24gKmRlc2NyaXB0b3IgPSAmc2Nhbl9yZXN1bHQtPkJzc0Rlc2NyaXB0b3I7CisJc3RydWN0IGl3X2V2ZW50IGV2ZW50OworCWNoYXIgKmN1cnJlbnRfZXZlbnQgPSBzY2FuSW5mby0+c3RhcnQ7CisJY2hhciAqZW5kID0gc2NhbkluZm8tPmVuZDsKKwljaGFyICpsYXN0X2V2ZW50OworCWNoYXIgKmN1cnJlbnRfcGFkOworCXVpbnQxNl90IGllX2xlbmd0aCA9IDA7CisJdWludDE2X3QgY2FwYWJpbGl0eUluZm87CisJY2hhciAqbW9kZXN0cjsKKwlpbnQgZXJyb3I7CisJY2hhciBjdXN0b21bTUFYX0NVU1RPTV9MRU5dOworCWNoYXIgKnA7CisKKwloZGRMb2coTE9HMSwgImhkZF9pbmRpY2F0ZV9zY2FuX3Jlc3VsdCAiIE1BQ19BRERSRVNTX1NUUiwKKwkgICAgICAgTUFDX0FERFJfQVJSQVkoZGVzY3JpcHRvci0+YnNzSWQpKTsKKworCWVycm9yID0gMDsKKwlsYXN0X2V2ZW50ID0gY3VycmVudF9ldmVudDsKKwljZGZfbWVtX3plcm8oJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKKworCS8qIEJTU0lEICovCisJZXZlbnQuY21kID0gU0lPQ0dJV0FQOworCWV2ZW50LnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJY2RmX21lbV9jb3B5KGV2ZW50LnUuYXBfYWRkci5zYV9kYXRhLCBkZXNjcmlwdG9yLT5ic3NJZCwKKwkJICAgICBzaXplb2YoZGVzY3JpcHRvci0+YnNzSWQpKTsKKwljdXJyZW50X2V2ZW50ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc2NhbkluZm8tPmluZm8sIGN1cnJlbnRfZXZlbnQsIGVuZCwKKwkJCQkJICAgICAmZXZlbnQsIElXX0VWX0FERFJfTEVOKTsKKworCWlmIChsYXN0X2V2ZW50ID09IGN1cnJlbnRfZXZlbnQpIHsKKwkJLyogbm8gc3BhY2UgdG8gYWRkIGV2ZW50ICovCisJCS8qIEVycm9yIGNvZGUgbWF5IGJlIEUyQklHICovCisJCWhkZExvZyhMT0dFLCAiaGRkX2luZGljYXRlX3NjYW5fcmVzdWx0OiBubyBzcGFjZSBmb3IgU0lPQ0dJV0FQICIpOworCQlyZXR1cm4gLUUyQklHOworCX0KKworCWxhc3RfZXZlbnQgPSBjdXJyZW50X2V2ZW50OworCWNkZl9tZW1femVybygmZXZlbnQsIHNpemVvZihzdHJ1Y3QgaXdfZXZlbnQpKTsKKworCS8qIFByb3RvY29sIE5hbWUgKi8KKwlldmVudC5jbWQgPSBTSU9DR0lXTkFNRTsKKworCXN3aXRjaCAoZGVzY3JpcHRvci0+bndUeXBlKSB7CisJY2FzZSBlU0lSXzExQV9OV19UWVBFOgorCQltb2Rlc3RyID0gImEiOworCQlicmVhazsKKwljYXNlIGVTSVJfMTFCX05XX1RZUEU6CisJCW1vZGVzdHIgPSAiYiI7CisJCWJyZWFrOworCWNhc2UgZVNJUl8xMUdfTldfVFlQRToKKwkJbW9kZXN0ciA9ICJnIjsKKwkJYnJlYWs7CisJY2FzZSBlU0lSXzExTl9OV19UWVBFOgorCQltb2Rlc3RyID0gIm4iOworCQlicmVhazsKKwlkZWZhdWx0OgorCQloZGRMb2coTE9HVywgIiVzOiBVbmtub3duIG5ldHdvcmsgdHlwZSBbJWRdIiwKKwkJICAgICAgIF9fZnVuY19fLCBkZXNjcmlwdG9yLT5ud1R5cGUpOworCQltb2Rlc3RyID0gIj8iOworCQlicmVhazsKKwl9CisJc25wcmludGYoZXZlbnQudS5uYW1lLCBJRk5BTVNJWiwgIklFRUUgODAyLjExJXMiLCBtb2Rlc3RyKTsKKwljdXJyZW50X2V2ZW50ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc2NhbkluZm8tPmluZm8sIGN1cnJlbnRfZXZlbnQsIGVuZCwKKwkJCQkJICAgICAmZXZlbnQsIElXX0VWX0NIQVJfTEVOKTsKKworCWlmIChsYXN0X2V2ZW50ID09IGN1cnJlbnRfZXZlbnQpIHsgICAgICAvKiBubyBzcGFjZSB0byBhZGQgZXZlbnQgKi8KKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICAiaGRkX2luZGljYXRlX3NjYW5fcmVzdWx0OiBubyBzcGFjZSBmb3IgU0lPQ0dJV05BTUUiKTsKKwkJLyogRXJyb3IgY29kZSwgbWF5IGJlIEUyQklHICovCisJCXJldHVybiAtRTJCSUc7CisJfQorCisJbGFzdF9ldmVudCA9IGN1cnJlbnRfZXZlbnQ7CisJY2RmX21lbV96ZXJvKCZldmVudCwgc2l6ZW9mKHN0cnVjdCBpd19ldmVudCkpOworCisJLypGcmVxICovCisJZXZlbnQuY21kID0gU0lPQ0dJV0ZSRVE7CisKKwlldmVudC51LmZyZXEubSA9IGRlc2NyaXB0b3ItPmNoYW5uZWxJZDsKKwlldmVudC51LmZyZXEuZSA9IDA7CisJZXZlbnQudS5mcmVxLmkgPSAwOworCWN1cnJlbnRfZXZlbnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzY2FuSW5mby0+aW5mbywgY3VycmVudF9ldmVudCwgZW5kLAorCQkJCQkgICAgICZldmVudCwgSVdfRVZfRlJFUV9MRU4pOworCisJaWYgKGxhc3RfZXZlbnQgPT0gY3VycmVudF9ldmVudCkgeyAgICAgIC8qIG5vIHNwYWNlIHRvIGFkZCBldmVudCAqLworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJoZGRfaW5kaWNhdGVfc2Nhbl9yZXN1bHQ6IG5vIHNwYWNlIGZvciBTSU9DR0lXRlJFUSIpOworCQlyZXR1cm4gLUUyQklHOworCX0KKworCWxhc3RfZXZlbnQgPSBjdXJyZW50X2V2ZW50OworCWNkZl9tZW1femVybygmZXZlbnQsIHNpemVvZihzdHJ1Y3QgaXdfZXZlbnQpKTsKKworCS8qIEJTUyBNb2RlICovCisJZXZlbnQuY21kID0gU0lPQ0dJV01PREU7CisKKwljYXBhYmlsaXR5SW5mbyA9IGRlc2NyaXB0b3ItPmNhcGFiaWxpdHlJbmZvOworCisJaWYgKFNJUl9NQUNfR0VUX0VTUyhjYXBhYmlsaXR5SW5mbykpIHsKKwkJZXZlbnQudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisJfSBlbHNlIGlmIChTSVJfTUFDX0dFVF9JQlNTKGNhcGFiaWxpdHlJbmZvKSkgeworCQlldmVudC51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCX0gZWxzZSB7CisJCS8qIG5laXRoZXIgRVNTIG9yIElCU1MgKi8KKwkJZXZlbnQudS5tb2RlID0gSVdfTU9ERV9BVVRPOworCX0KKworCWN1cnJlbnRfZXZlbnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzY2FuSW5mby0+aW5mbywgY3VycmVudF9ldmVudCwgZW5kLAorCQkJCQkgICAgICZldmVudCwgSVdfRVZfVUlOVF9MRU4pOworCisJaWYgKGxhc3RfZXZlbnQgPT0gY3VycmVudF9ldmVudCkgeyAgICAgIC8qIG5vIHNwYWNlIHRvIGFkZCBldmVudCAqLworCQloZGRMb2coTE9HRSwKKwkJICAgICAgICJoZGRfaW5kaWNhdGVfc2Nhbl9yZXN1bHQ6IG5vIHNwYWNlIGZvciBTSU9DR0lXTU9ERSIpOworCQlyZXR1cm4gLUUyQklHOworCX0KKwkvKiBUbyBleHRyYWN0IFNTSUQgKi8KKwlpZV9sZW5ndGggPSBHRVRfSUVfTEVOX0lOX0JTUyhkZXNjcmlwdG9yLT5sZW5ndGgpOworCisJaWYgKGllX2xlbmd0aCA+IDApIHsKKwkJLyogZG90MTFCZWFjb25JRXMgaXMgYSBsYXJnZSBzdHJ1Y3QsIHNvIHdlIG1ha2UgaXQgc3RhdGljIHRvCisJCSAgIGF2b2lkIHN0YWNrIG92ZXJmbG93LiAgVGhpcyBBUEkgaXMgb25seSBpbnZva2VkIHZpYSBpb2N0bCwKKwkJICAgc28gaXQgaXMgc2VyaWFsaXplZCBieSB0aGUga2VybmVsIHJ0bmxfbG9jayBhbmQgaGVuY2UgZG9lcworCQkgICBub3QgbmVlZCB0byBiZSByZWVudHJhbnQgKi8KKwkJc3RhdGljIHREb3QxMWZCZWFjb25JRXMgZG90MTFCZWFjb25JRXM7CisJCXREb3QxMWZJRVNTSUQgKnBEb3QxMVNTSUQ7CisJCXREb3QxMWZJRVN1cHBSYXRlcyAqcERvdDExU3VwcFJhdGVzOworCQl0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKnBEb3QxMUV4dFN1cHBSYXRlczsKKwkJdERvdDExZklFSFRDYXBzICpwRG90MTFJRUhUQ2FwczsKKwkJaW50IG51bUJhc2ljUmF0ZXMgPSAwOworCQlpbnQgbWF4TnVtUmF0ZXMgPSAwOworCisJCXBEb3QxMUlFSFRDYXBzID0gTlVMTDsKKworCQlkb3QxMWZfdW5wYWNrX2JlYWNvbl9pX2VzKCh0cEFuaVNpckdsb2JhbCkKKwkJCQkJICBoSGFsLCAodWludDhfdCAqKSBkZXNjcmlwdG9yLT5pZUZpZWxkcywKKwkJCQkJICBpZV9sZW5ndGgsICZkb3QxMUJlYWNvbklFcyk7CisKKwkJcERvdDExU1NJRCA9ICZkb3QxMUJlYWNvbklFcy5TU0lEOworCisJCWlmIChwRG90MTFTU0lELT5wcmVzZW50KSB7CisJCQlsYXN0X2V2ZW50ID0gY3VycmVudF9ldmVudDsKKwkJCWNkZl9tZW1femVybygmZXZlbnQsIHNpemVvZihzdHJ1Y3QgaXdfZXZlbnQpKTsKKworCQkJZXZlbnQuY21kID0gU0lPQ0dJV0VTU0lEOworCQkJZXZlbnQudS5kYXRhLmZsYWdzID0gMTsKKwkJCWV2ZW50LnUuZGF0YS5sZW5ndGggPSBzY2FuX3Jlc3VsdC0+c3NJZC5sZW5ndGg7CisJCQljdXJyZW50X2V2ZW50ID0KKwkJCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChzY2FuSW5mby0+aW5mbywgY3VycmVudF9ldmVudCwKKwkJCQkJCSAgICAgZW5kLCAmZXZlbnQsCisJCQkJCQkgICAgIChjaGFyICopc2Nhbl9yZXN1bHQtPnNzSWQuCisJCQkJCQkgICAgIHNzSWQpOworCisJCQlpZiAobGFzdF9ldmVudCA9PSBjdXJyZW50X2V2ZW50KSB7ICAgICAgLyogbm8gc3BhY2UgdG8gYWRkIGV2ZW50ICovCisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgICJoZGRfaW5kaWNhdGVfc2Nhbl9yZXN1bHQ6IG5vIHNwYWNlIGZvciBTSU9DR0lXRVNTSUQiKTsKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJfQorCQl9CisKKwkJaWYgKGhkZF9nZXRfd3BhcnNuX2llcworCQkJICAgICgodWludDhfdCAqKSBkZXNjcmlwdG9yLT5pZUZpZWxkcywgaWVfbGVuZ3RoLCAmbGFzdF9ldmVudCwKKwkJCSAgICAmY3VycmVudF9ldmVudCwgc2NhbkluZm8pIDwgMCkgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgImhkZF9pbmRpY2F0ZV9zY2FuX3Jlc3VsdDogbm8gc3BhY2UgZm9yIFNJT0NHSVdFU1NJRCIpOworCQkJcmV0dXJuIC1FMkJJRzsKKwkJfQorCisJCWxhc3RfZXZlbnQgPSBjdXJyZW50X2V2ZW50OworCQljdXJyZW50X3BhZCA9IGN1cnJlbnRfZXZlbnQgKyBJV19FVl9MQ1BfTEVOOworCQljZGZfbWVtX3plcm8oJmV2ZW50LCBzaXplb2Yoc3RydWN0IGl3X2V2ZW50KSk7CisKKwkJLypSYXRlcyAqLworCQlldmVudC5jbWQgPSBTSU9DR0lXUkFURTsKKworCQlwRG90MTFTdXBwUmF0ZXMgPSAmZG90MTFCZWFjb25JRXMuU3VwcFJhdGVzOworCisJCWlmIChwRG90MTFTdXBwUmF0ZXMtPnByZXNlbnQpIHsKKwkJCWludCBpOworCisJCQludW1CYXNpY1JhdGVzID0gcERvdDExU3VwcFJhdGVzLT5udW1fcmF0ZXM7CisJCQlmb3IgKGkgPSAwOyBpIDwgcERvdDExU3VwcFJhdGVzLT5udW1fcmF0ZXM7IGkrKykgeworCQkJCWlmICgwICE9IChwRG90MTFTdXBwUmF0ZXMtPnJhdGVzW2ldICYgMHg3RikpIHsKKwkJCQkJZXZlbnQudS5iaXRyYXRlLnZhbHVlID0KKwkJCQkJCWhkZF90cmFuc2xhdGVfYWJnX3JhdGVfdG9fbWJwc19yYXRlCisJCQkJCQkJKCZwRG90MTFTdXBwUmF0ZXMtPnJhdGVzW2ldKTsKKworCQkJCQljdXJyZW50X3BhZCA9CisJCQkJCQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShzY2FuSW5mby0+aW5mbywKKwkJCQkJCQkJICAgICBjdXJyZW50X2V2ZW50LAorCQkJCQkJCQkgICAgIGN1cnJlbnRfcGFkLAorCQkJCQkJCQkgICAgIGVuZCwgJmV2ZW50LAorCQkJCQkJCQkgICAgIElXX0VWX1BBUkFNX0xFTik7CisJCQkJfQorCQkJfQorCisJCX0KKworCQlwRG90MTFFeHRTdXBwUmF0ZXMgPSAmZG90MTFCZWFjb25JRXMuRXh0U3VwcFJhdGVzOworCisJCWlmIChwRG90MTFFeHRTdXBwUmF0ZXMtPnByZXNlbnQpIHsKKwkJCWludCBpLCBub19vZl9yYXRlczsKKwkJCW1heE51bVJhdGVzID0KKwkJCQludW1CYXNpY1JhdGVzICsgcERvdDExRXh0U3VwcFJhdGVzLT5udW1fcmF0ZXM7CisKKwkJCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdG90YWwgbnVtYmVyIG9mIHJhdGVzCisJCQkgKiBkb2Vzbid0IGV4Y2VlZCBJV19NQVhfQklUUkFURVMKKwkJCSAqLworCisJCQltYXhOdW1SYXRlcyA9IENERl9NSU4obWF4TnVtUmF0ZXMsIElXX01BWF9CSVRSQVRFUyk7CisKKwkJCWlmICgobWF4TnVtUmF0ZXMgLSBudW1CYXNpY1JhdGVzKSA+IE1BWF9SQVRFUykgeworCQkJCW5vX29mX3JhdGVzID0gTUFYX1JBVEVTOworCQkJCWhkZExvZyhMT0dXLAorCQkJCSAgICAgICAiQWNjZXNzaW5nIGFycmF5IG91dCBvZiBib3VuZCB0aGF0IGFycmF5IGlzIHBEb3QxMUV4dFN1cHBSYXRlcy0+cmF0ZXMgIik7CisJCQl9IGVsc2UgeworCQkJCW5vX29mX3JhdGVzID0gbWF4TnVtUmF0ZXMgLSBudW1CYXNpY1JhdGVzOworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IG5vX29mX3JhdGVzOyBpKyspIHsKKwkJCQlpZiAoMCAhPSAocERvdDExRXh0U3VwcFJhdGVzLT5yYXRlc1tpXSAmIDB4N0YpKSB7CisJCQkJCWV2ZW50LnUuYml0cmF0ZS52YWx1ZSA9CisJCQkJCQloZGRfdHJhbnNsYXRlX2FiZ19yYXRlX3RvX21icHNfcmF0ZQorCQkJCQkJCSgmcERvdDExRXh0U3VwcFJhdGVzLT5yYXRlc1tpXSk7CisKKwkJCQkJY3VycmVudF9wYWQgPQorCQkJCQkJaXdlX3N0cmVhbV9hZGRfdmFsdWUoc2NhbkluZm8tPmluZm8sCisJCQkJCQkJCSAgICAgY3VycmVudF9ldmVudCwKKwkJCQkJCQkJICAgICBjdXJyZW50X3BhZCwKKwkJCQkJCQkJICAgICBlbmQsICZldmVudCwKKwkJCQkJCQkJICAgICBJV19FVl9QQVJBTV9MRU4pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICgoY3VycmVudF9wYWQgLSBjdXJyZW50X2V2ZW50KSA+PSBJV19FVl9MQ1BfTEVOKSB7CisJCQljdXJyZW50X2V2ZW50ID0gY3VycmVudF9wYWQ7CisJCX0gZWxzZSB7CisJCQlpZiAobGFzdF9ldmVudCA9PSBjdXJyZW50X2V2ZW50KSB7ICAgICAgLyogbm8gc3BhY2UgdG8gYWRkIGV2ZW50ICovCisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgICJoZGRfaW5kaWNhdGVfc2Nhbl9yZXN1bHQ6IG5vIHNwYWNlIGZvciBTSU9DR0lXUkFURSIpOworCQkJCXJldHVybiAtRTJCSUc7CisJCQl9CisJCX0KKworCQlsYXN0X2V2ZW50ID0gY3VycmVudF9ldmVudDsKKwkJY2RmX21lbV96ZXJvKCZldmVudCwgc2l6ZW9mKHN0cnVjdCBpd19ldmVudCkpOworCisJCWV2ZW50LmNtZCA9IFNJT0NHSVdFTkNPREU7CisKKwkJaWYgKFNJUl9NQUNfR0VUX1BSSVZBQ1koY2FwYWJpbGl0eUluZm8pKSB7CisJCQlldmVudC51LmRhdGEuZmxhZ3MgPQorCQkJCUlXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQl9IGVsc2UgeworCQkJZXZlbnQudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQl9CisJCWV2ZW50LnUuZGF0YS5sZW5ndGggPSAwOworCisJCWN1cnJlbnRfZXZlbnQgPQorCQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoc2NhbkluZm8tPmluZm8sIGN1cnJlbnRfZXZlbnQsIGVuZCwKKwkJCQkJICAgICAmZXZlbnQsIChjaGFyICopcERvdDExU1NJRC0+c3NpZCk7CisJCWlmIChsYXN0X2V2ZW50ID09IGN1cnJlbnRfZXZlbnQpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICJoZGRfaW5kaWNhdGVfc2Nhbl9yZXN1bHQ6IG5vIHNwYWNlIGZvciBTSU9DR0lXRU5DT0RFIik7CisJCQlyZXR1cm4gLUUyQklHOworCQl9CisJfQorCisJbGFzdF9ldmVudCA9IGN1cnJlbnRfZXZlbnQ7CisJY2RmX21lbV96ZXJvKCZldmVudCwgc2l6ZW9mKHN0cnVjdCBpd19ldmVudCkpOworCisJLyogUlNTSSAqLworCWV2ZW50LmNtZCA9IElXRVZRVUFMOworCWV2ZW50LnUucXVhbC5xdWFsID0gZGVzY3JpcHRvci0+cnNzaTsKKwlldmVudC51LnF1YWwubm9pc2UgPSBkZXNjcmlwdG9yLT5zaW5yOworCWV2ZW50LnUucXVhbC5sZXZlbCA9IENERl9NSU4oKGRlc2NyaXB0b3ItPnJzc2kgKyBkZXNjcmlwdG9yLT5zaW5yKSwgMCk7CisKKwlldmVudC51LnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQ7CisKKwljdXJyZW50X2V2ZW50ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc2NhbkluZm8tPmluZm8sIGN1cnJlbnRfZXZlbnQsCisJCQkJCSAgICAgZW5kLCAmZXZlbnQsIElXX0VWX1FVQUxfTEVOKTsKKworCWlmIChsYXN0X2V2ZW50ID09IGN1cnJlbnRfZXZlbnQpIHsgICAgICAvKiBubyBzcGFjZSB0byBhZGQgZXZlbnQgKi8KKwkJaGRkTG9nKExPR0UsICJoZGRfaW5kaWNhdGVfc2Nhbl9yZXN1bHQ6IG5vIHNwYWNlIGZvciBJV0VWUVVBTCIpOworCQlyZXR1cm4gLUUyQklHOworCX0KKworCS8qIEFHRSAqLworCWV2ZW50LmNtZCA9IElXRVZDVVNUT007CisJcCA9IGN1c3RvbTsKKwlwICs9IHNjbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiwgIiBBZ2U6ICVsdSIsCisJCSAgICAgICBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpIC0KKwkJICAgICAgIGRlc2NyaXB0b3ItPm5SZWNlaXZlZFRpbWUpOworCWV2ZW50LnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOworCWN1cnJlbnRfZXZlbnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzY2FuSW5mby0+aW5mbywgY3VycmVudF9ldmVudCwgZW5kLAorCQkJCQkgICAgICZldmVudCwgY3VzdG9tKTsKKwlpZiAobGFzdF9ldmVudCA9PSBjdXJyZW50X2V2ZW50KSB7ICAgICAgLyogbm8gc3BhY2UgdG8gYWRkIGV2ZW50ICovCisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgImhkZF9pbmRpY2F0ZV9zY2FuX3Jlc3VsdDogbm8gc3BhY2UgZm9yIElXRVZDVVNUT00gKGFnZSkiKTsKKwkJcmV0dXJuIC1FMkJJRzsKKwl9CisKKwlzY2FuSW5mby0+c3RhcnQgPSBjdXJyZW50X2V2ZW50OworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiB3bGFuX2hkZF9zY2FuX3JlcXVlc3RfZW5xdWV1ZSgpIC0gZW5xdWV1ZSBTY2FuIFJlcXVlc3QKKyAqIEBhZGFwdGVyOiBQb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKiBAc2Nhbl9yZXE6IFBvaW50ZXIgdG8gdGhlIHNjYW4gcmVxdWVzdAorICoKKyAqIEVucXVldWUgc2NhbiByZXF1ZXN0IGluIHRoZSBnbG9iYWwgSEREIHNjYW4gbGlzdC5UaGlzIGxpc3QKKyAqIHN0b3JlcyB0aGUgYWN0aXZlIHNjYW4gcmVxdWVzdCBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHdsYW5faGRkX3NjYW5fcmVxdWVzdF9lbnF1ZXVlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcSwKKwkJCXVpbnQ4X3Qgc291cmNlLCB1aW50MzJfdCBzY2FuX2lkLAorCQkJdWludDMyX3QgdGltZXN0YW1wKQoreworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXN0cnVjdCBoZGRfc2Nhbl9yZXEgKmhkZF9zY2FuX3JlcTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCUVOVEVSKCk7CisJaGRkX3NjYW5fcmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpoZGRfc2Nhbl9yZXEpKTsKKwlpZiAoTlVMTCA9PSBoZGRfc2Nhbl9yZXEpIHsKKwkJaGRkTG9nKExPR1AsIEZMKCJtYWxsb2MgZmFpbGVkIGZvciBTY2FuIHJlcSIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaGRkX3NjYW5fcmVxLT5hZGFwdGVyID0gYWRhcHRlcjsKKwloZGRfc2Nhbl9yZXEtPnNjYW5fcmVxdWVzdCA9IHNjYW5fcmVxOworCWhkZF9zY2FuX3JlcS0+c291cmNlID0gc291cmNlOworCWhkZF9zY2FuX3JlcS0+c2Nhbl9pZCA9IHNjYW5faWQ7CisJaGRkX3NjYW5fcmVxLT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKwljZGZfc3Bpbl9sb2NrKCZoZGRfY3R4LT5oZGRfc2Nhbl9yZXFfcV9sb2NrKTsKKwlzdGF0dXMgPSBjZGZfbGlzdF9pbnNlcnRfYmFjaygmaGRkX2N0eC0+aGRkX3NjYW5fcmVxX3EsCisJCQkJCSZoZGRfc2Nhbl9yZXEtPm5vZGUpOworCWNkZl9zcGluX3VubG9jaygmaGRkX2N0eC0+aGRkX3NjYW5fcmVxX3FfbG9jayk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQloZGRfZXJyKCJGYWlsZWQgdG8gZW5xdWV1ZSBTY2FuIFJlcSIpOworCQljZGZfbWVtX2ZyZWUoaGRkX3NjYW5fcmVxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9zY2FuX3JlcXVlc3RfZGVxdWV1ZSgpIC0gZGVxdWV1ZSBzY2FuIHJlcXVlc3QKKyAqIEBoZGRfY3R4OiBHbG9iYWwgSEREIGNvbnRleHQKKyAqIEBzY2FuX2lkOiBzY2FuIGlkCisgKiBAcmVxOiBzY2FuIHJlcXVlc3QKKyAqIEBzb3VyY2UgOiByZXR1cm5zIHNvdXJjZSBvZiB0aGUgc2NhbiByZXF1ZXN0CisgKiBAdGltZXN0YW1wOiBzY2FuIHJlcXVlc3QgdGltZXN0YW1wCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgd2xhbl9oZGRfc2Nhbl9yZXF1ZXN0X2RlcXVldWUoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwKKwl1aW50MzJfdCBzY2FuX2lkLCBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICoqcmVxLCB1aW50OF90ICpzb3VyY2UsCisJdWludDMyX3QgKnRpbWVzdGFtcCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXN0cnVjdCBoZGRfc2Nhbl9yZXEgKmhkZF9zY2FuX3JlcTsKKwljZGZfbGlzdF9ub2RlX3QgKnBOb2RlID0gTlVMTCwgKnBwTm9kZSA9IE5VTEw7CisKKwloZGRfaW5mbygiRGVxdWV1ZSBTY2FuIGlkOiAlZCIsIHNjYW5faWQpOworCisJaWYgKChzb3VyY2UgPT0gTlVMTCkgJiYgKHRpbWVzdGFtcCA9PSBOVUxMKSAmJiAocmVxID09IE5VTEwpKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05VTExfVkFMVUU7CisKKwljZGZfc3Bpbl9sb2NrKCZoZGRfY3R4LT5oZGRfc2Nhbl9yZXFfcV9sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZoZGRfY3R4LT5oZGRfc2Nhbl9yZXFfcS5hbmNob3IpKSB7CisJCWNkZl9zcGluX3VubG9jaygmaGRkX2N0eC0+aGRkX3NjYW5fcmVxX3FfbG9jayk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCWNkZl9saXN0X3BlZWtfZnJvbnQoJmhkZF9jdHgtPmhkZF9zY2FuX3JlcV9xLCAmcHBOb2RlKSkgeworCQljZGZfc3Bpbl91bmxvY2soJmhkZF9jdHgtPmhkZF9zY2FuX3JlcV9xX2xvY2spOworCQloZGRfZXJyKCJGYWlsZWQgdG8gcmVtb3ZlIFNjYW4gUmVxIGZyb20gcXVldWUiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWRvIHsKKwkJcE5vZGUgPSBwcE5vZGU7CisJCWhkZF9zY2FuX3JlcSA9IChzdHJ1Y3QgaGRkX3NjYW5fcmVxICopcE5vZGU7CisJCWlmIChoZGRfc2Nhbl9yZXEtPnNjYW5faWQgPT0gc2Nhbl9pZCkgeworCQkJc3RhdHVzID0gY2RmX2xpc3RfcmVtb3ZlX25vZGUoJmhkZF9jdHgtPmhkZF9zY2FuX3JlcV9xLAorCQkJCQlwTm9kZSk7CisJCQlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJCSpyZXEgPSBoZGRfc2Nhbl9yZXEtPnNjYW5fcmVxdWVzdDsKKwkJCQkqc291cmNlID0gaGRkX3NjYW5fcmVxLT5zb3VyY2U7CisJCQkJKnRpbWVzdGFtcCA9IGhkZF9zY2FuX3JlcS0+dGltZXN0YW1wOworCQkJCWNkZl9tZW1fZnJlZShoZGRfc2Nhbl9yZXEpOworCQkJCWNkZl9zcGluX3VubG9jaygmaGRkX2N0eC0+aGRkX3NjYW5fcmVxX3FfbG9jayk7CisJCQkJaGRkX2luZm8oInJlbW92ZWQgU2NhbiBpZDogJWQsIHJlcSA9ICVwIiwKKwkJCQkJc2Nhbl9pZCwgcmVxKTsKKwkJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJfSBlbHNlIHsKKwkJCQljZGZfc3Bpbl91bmxvY2soJmhkZF9jdHgtPmhkZF9zY2FuX3JlcV9xX2xvY2spOworCQkJCWhkZF9lcnIoIkZhaWxlZCB0byByZW1vdmUgbm9kZSBzY2FuIGlkICVkIiwKKwkJCQkJc2Nhbl9pZCk7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKENERl9TVEFUVVNfU1VDQ0VTUyA9PQorCQljZGZfbGlzdF9wZWVrX25leHQoJmhkZF9jdHgtPmhkZF9zY2FuX3JlcV9xLCBwTm9kZSwgJnBwTm9kZSkpOworCisJY2RmX3NwaW5fdW5sb2NrKCZoZGRfY3R4LT5oZGRfc2Nhbl9yZXFfcV9sb2NrKTsKKwloZGRfZXJyKCJGYWlsZWQgdG8gZmluZCBzY2FuIGlkICVkIiwgc2Nhbl9pZCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBoZGRfc2Nhbl9yZXF1ZXN0X2NhbGxiYWNrKCkgLSBzY2FuIGNvbXBsZXRlIGNhbGxiYWNrIGZyb20gU01FCisgKiBAaGFsSGFuZGxlOiBQb2ludGVyIHRvIHRoZSBIYWwgSGFuZGxlCisgKiBAcENvbnRleHQ6IFBvaW50ZXIgdG8gdGhlIGRhdGEgY29udGV4dAorICogQHNlc3Npb25JZDogU2Vzc2lvbiBpZGVudGlmaWVyCisgKiBAc2NhbklkOiBTY2FuIElECisgKiBAc3RhdHVzOiBDU1IgU3RhdHVzCisgKgorICogVGhlIHNtZSBtb2R1bGUgY2FsbHMgdGhpcyBjYWxsYmFjayBmdW5jdGlvbiBvbmNlIGl0IGZpbmlzaCB0aGUgc2NhbiByZXF1ZXN0CisgKiBhbmQgdGhpcyBmdW5jdGlvbiBub3RpZmllcyB0aGUgc2NhbiBjb21wbGV0ZSBldmVudCB0byB0aGUgd3BhX3N1cHBsaWNhbnQuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICovCisKK3N0YXRpYyBDREZfU1RBVFVTCitoZGRfc2Nhbl9yZXF1ZXN0X2NhbGxiYWNrKHRIYWxIYW5kbGUgaGFsSGFuZGxlLCB2b2lkICpwQ29udGV4dCwKKwkJCSAgdWludDhfdCBzZXNzaW9uSWQsIHVpbnQzMl90IHNjYW5JZCwKKwkJCSAgZUNzclNjYW5TdGF0dXMgc3RhdHVzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwQ29udGV4dDsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZGN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlpbnQgd2VfZXZlbnQ7CisJY2hhciAqbXNnOworCXVpbnQ4X3Qgc291cmNlOworCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcTsKKwl1aW50MzJfdCB0aW1lc3RhbXA7CisJdWludDMyX3Qgc2l6ZSA9IDA7CisKKwlFTlRFUigpOworCWhkZExvZyhMT0dXLAorCSAgICAgICAiJXMgY2FsbGVkIHdpdGggaGFsSGFuZGxlID0gJXAsIHBDb250ZXh0ID0gJXAsIHNjYW5JRCA9ICVkLCIKKwkgICAgICAgIiByZXR1cm5lZCBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBoYWxIYW5kbGUsIHBDb250ZXh0LAorCSAgICAgICAoaW50KXNjYW5JZCwgKGludClzdGF0dXMpOworCisJLyogaWYgdGhlcmUgaXMgYSBzY2FuIHJlcXVlc3QgcGVuZGluZyB3aGVuIHRoZSB3bGFuIGRyaXZlciBpcyB1bmxvYWRlZAorCSAqIHdlIG1heSBiZSBpbnZva2VkIGFzIFNNRSBmbHVzaGVzIGl0cyBwZW5kaW5nIHF1ZXVlLiAgSWYgdGhhdCBpcyB0aGUKKwkgKiBjYXNlLCB0aGUgdW5kZXJseWluZyBuZXRfZGV2aWNlIG1heSBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQsIHNvCisJICogZG8gc29tZSBxdWljayBzYW5pdHkgYmVmb3JlIHByb2NlZWRpbmcKKwkgKi8KKwlpZiAocEFkYXB0ZXItPmRldiAhPSBkZXYpIHsKKwkJaGRkTG9nKExPR1csICIlczogZGV2aWNlIG1pc21hdGNoICVwIHZzICVwIiwKKwkJICAgICAgIF9fZnVuY19fLCBwQWRhcHRlci0+ZGV2LCBkZXYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCXdsYW5faGRkX3NjYW5fcmVxdWVzdF9kZXF1ZXVlKGhkZGN0eCwgc2NhbklkLCAmcmVxLCAmc291cmNlLAorCQkmdGltZXN0YW1wKTsKKworCWlmIChyZXEgIT0gTlVMTCkKKwkJaGRkX2VycigiR290IHVuZXhwZWN0ZWQgcmVxdWVzdCBzdHJ1Y3QgZm9yIFNjYW4gaWQgJWQiLAorCQkJc2NhbklkKTsKKworCWNkZl9zcGluX2xvY2soJmhkZGN0eC0+aGRkX3NjYW5fcmVxX3FfbG9jayk7CisJY2RmX2xpc3Rfc2l6ZSgmKGhkZGN0eC0+aGRkX3NjYW5fcmVxX3EpLCAmc2l6ZSk7CisJaWYgKCFzaXplKQorCQkvKiBTY2FuIGlzIG5vIGxvbmdlciBwZW5kaW5nICovCisJCXBBZGFwdGVyLT5zY2FuX2luZm8ubVNjYW5QZW5kaW5nID0gZmFsc2U7CisJY2RmX3NwaW5fdW5sb2NrKCZoZGRjdHgtPmhkZF9zY2FuX3JlcV9xX2xvY2spOworCisJLyogbm90aWZ5IGFueSBhcHBsaWNhdGlvbnMgdGhhdCBtYXkgYmUgaW50ZXJlc3RlZCAqLworCW1lbXNldCgmd3JxdSwgJ1wwJywgc2l6ZW9mKHdycXUpKTsKKwl3ZV9ldmVudCA9IFNJT0NHSVdTQ0FOOworCW1zZyA9IE5VTEw7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIHdlX2V2ZW50LCAmd3JxdSwgbXNnKTsKKworCUVYSVQoKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIF9faXdfc2V0X3NjYW4oKSAtIHNldCBzY2FuIHJlcXVlc3QKKyAqIEBkZXY6IFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UKKyAqIEBpbmZvOiBQb2ludGVyIHRvIHRoZSBpd19yZXF1ZXN0X2luZm8KKyAqIEB3cnF1OiBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IFBvaW50ZXIgdG8gdGhlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIHNjYW4gcmVxdWVzdCBmcm9tIHRoZSB3cGFfc3VwcGxpY2FudAorICogYW5kIHNldCB0aGUgc2NhbiByZXF1ZXN0IHRvIHRoZSBTTUUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgKi8KKworc3RhdGljIGludCBfX2l3X3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCWhkZF93ZXh0X3N0YXRlX3QgKnB3ZXh0QnVmID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwl0Q3NyU2NhblJlcXVlc3Qgc2NhblJlcXVlc3Q7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJc3RydWN0IGl3X3NjYW5fcmVxICpzY2FuUmVxID0gKHN0cnVjdCBpd19zY2FuX3JlcSAqKWV4dHJhOworCWhkZF9hZGFwdGVyX3QgKmNvbl9zYXBfYWRhcHRlcjsKKwl1aW50MTZfdCBjb25fZGZzX2NoOworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBlbnRlciAhISEiLAorCQkgIF9fZnVuY19fKTsKKworCS8qIEJsb2NrIEFsbCBTY2FuIGR1cmluZyBERlMgb3BlcmF0aW9uIGFuZCBzZW5kIG51bGwgc2NhbiByZXN1bHQgKi8KKwljb25fc2FwX2FkYXB0ZXIgPSBoZGRfZ2V0X2Nvbl9zYXBfYWRhcHRlcihwQWRhcHRlciwgdHJ1ZSk7CisJaWYgKGNvbl9zYXBfYWRhcHRlcikgeworCQljb25fZGZzX2NoID0gY29uX3NhcF9hZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLm9wZXJhdGluZ0NoYW5uZWw7CisKKwkJaWYgKENEU19JU19ERlNfQ0goY29uX2Rmc19jaCkpIHsKKwkJCWhkZExvZyhMT0dXLCBGTCgiIyNJbiBERlMgTWFzdGVyIG1vZGUuIFNjYW4gYWJvcnRlZCIpKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCX0KKworCWNkZl9tZW1femVybygmc2NhblJlcXVlc3QsIHNpemVvZihzY2FuUmVxdWVzdCkpOworCisJaWYgKE5VTEwgIT0gd3JxdS0+ZGF0YS5wb2ludGVyKSB7CisJCS8qIHNldCBzY2FuVHlwZSwgYWN0aXZlIG9yIHBhc3NpdmUgKi8KKwkJaWYgKChJV19TQ0FOX1RZUEVfQUNUSVZFID09IHNjYW5SZXEtPnNjYW5fdHlwZSkgfHwKKwkJICAgIChlU0lSX0FDVElWRV9TQ0FOID09IGhkZF9jdHgtPmlvY3RsX3NjYW5fbW9kZSkpIHsKKwkJCXNjYW5SZXF1ZXN0LnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKwkJfSBlbHNlIHsKKwkJCXNjYW5SZXF1ZXN0LnNjYW5UeXBlID0gZVNJUl9QQVNTSVZFX1NDQU47CisJCX0KKworCQkvKiBzZXQgYnNzaWQgdXNpbmcgc29ja2FkZHIgZnJvbSBpd19zY2FuX3JlcSAqLworCQljZGZfbWVtX2NvcHkoc2NhblJlcXVlc3QuYnNzaWQuYnl0ZXMsCisJCQkgICAgICZzY2FuUmVxLT5ic3NpZC5zYV9kYXRhLAorCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisKKwkJaWYgKHdycXUtPmRhdGEuZmxhZ3MgJiBJV19TQ0FOX1RISVNfRVNTSUQpIHsKKworCQkJaWYgKHNjYW5SZXEtPmVzc2lkX2xlbikgeworCQkJCXNjYW5SZXF1ZXN0LlNTSURzLm51bU9mU1NJRHMgPSAxOworCQkJCXNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0ID0KKwkJCQkJKHRDc3JTU0lESW5mbyAqKQorCQkJCQljZGZfbWVtX21hbGxvYyhzaXplb2YodENzclNTSURJbmZvKSk7CisJCQkJaWYgKHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0KSB7CisJCQkJCXNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0LT5TU0lELgorCQkJCQlsZW5ndGggPSBzY2FuUmVxLT5lc3NpZF9sZW47CisJCQkJCWNkZl9tZW1fY29weShzY2FuUmVxdWVzdC5TU0lEcy4KKwkJCQkJCSAgICAgU1NJRExpc3QtPlNTSUQuc3NJZCwKKwkJCQkJCSAgICAgc2NhblJlcS0+ZXNzaWQsCisJCQkJCQkgICAgIHNjYW5SZXEtPmVzc2lkX2xlbik7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2NhblJlcXVlc3QuU1NJRHMubnVtT2ZTU0lEcyA9IDA7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiLAorCQkJCQkJICBfX2Z1bmNfXyk7CisJCQkJCUNERl9BU1NFUlQoMCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogc2V0IG1pbiBhbmQgbWF4IGNoYW5uZWwgdGltZSAqLworCQlzY2FuUmVxdWVzdC5taW5DaG5UaW1lID0gc2NhblJlcS0+bWluX2NoYW5uZWxfdGltZTsKKwkJc2NhblJlcXVlc3QubWF4Q2huVGltZSA9IHNjYW5SZXEtPm1heF9jaGFubmVsX3RpbWU7CisKKwl9IGVsc2UgeworCQlpZiAoaGRkX2N0eC0+aW9jdGxfc2Nhbl9tb2RlID09IGVTSVJfQUNUSVZFX1NDQU4pIHsKKwkJCS8qIHNldCB0aGUgc2NhbiB0eXBlIHRvIGFjdGl2ZSAqLworCQkJc2NhblJlcXVlc3Quc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworCQl9IGVsc2UgeworCQkJc2NhblJlcXVlc3Quc2NhblR5cGUgPSBlU0lSX1BBU1NJVkVfU0NBTjsKKwkJfQorCisJCWNkZl9zZXRfbWFjYWRkcl9icm9hZGNhc3QoJnNjYW5SZXF1ZXN0LmJzc2lkKTsKKworCQkvKiBzZXQgbWluIGFuZCBtYXggY2hhbm5lbCB0aW1lIHRvIHplcm8gKi8KKwkJc2NhblJlcXVlc3QubWluQ2huVGltZSA9IDA7CisJCXNjYW5SZXF1ZXN0Lm1heENoblRpbWUgPSAwOworCX0KKworCS8qIHNldCBCU1NUeXBlIHRvIGRlZmF1bHQgdHlwZSAqLworCXNjYW5SZXF1ZXN0LkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0FOWTsKKworCS8qU2NhbiBhbGwgdGhlIGNoYW5uZWxzICovCisJc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDA7CisKKwlzY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisKKwkvKiBzZXQgcmVxdWVzdFR5cGUgdG8gZnVsbCBzY2FuICovCisJc2NhblJlcXVlc3QucmVxdWVzdFR5cGUgPSBlQ1NSX1NDQU5fUkVRVUVTVF9GVUxMX1NDQU47CisKKwkvKiBpZiBwcmV2aW91cyBnZW5JRSBpcyBub3QgTlVMTCwgdXBkYXRlIFNjYW5JRSAqLworCWlmICgwICE9IHB3ZXh0QnVmLT5nZW5JRS5sZW5ndGgpIHsKKwkJbWVtc2V0KCZwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRSwgMCwKKwkJICAgICAgIHNpemVvZihwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRSkpOworCQltZW1jcHkocEFkYXB0ZXItPnNjYW5faW5mby5zY2FuQWRkSUUuYWRkSUVkYXRhLAorCQkgICAgICAgcHdleHRCdWYtPmdlbklFLmFkZElFZGF0YSwgcHdleHRCdWYtPmdlbklFLmxlbmd0aCk7CisJCXBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmxlbmd0aCA9IHB3ZXh0QnVmLT5nZW5JRS5sZW5ndGg7CisKKwkJcHdleHRCdWYtPnJvYW1Qcm9maWxlLnBBZGRJRVNjYW4gPQorCQkJcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuQWRkSUUuYWRkSUVkYXRhOworCQlwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUubkFkZElFU2Nhbkxlbmd0aCA9CisJCQlwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5sZW5ndGg7CisKKwkJLyogY2xlYXIgcHJldmlvdXMgZ2VuSUUgYWZ0ZXIgdXNlIGl0ICovCisJCW1lbXNldCgmcHdleHRCdWYtPmdlbklFLCAwLCBzaXplb2YocHdleHRCdWYtPmdlbklFKSk7CisJfQorCisJLyogcHVzaCBhZGRJRVNjYW4gaW4gc2NhblJlcXVzZXQgaWYgZXhpc3QgKi8KKwlpZiAocEFkYXB0ZXItPnNjYW5faW5mby5zY2FuQWRkSUUuYWRkSUVkYXRhICYmCisJICAgIHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmxlbmd0aCkgeworCQlzY2FuUmVxdWVzdC51SUVGaWVsZExlbiA9IHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmxlbmd0aDsKKwkJc2NhblJlcXVlc3QucElFRmllbGQgPSBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5hZGRJRWRhdGE7CisJfQorCXNjYW5SZXF1ZXN0LnRpbWVzdGFtcCA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisJc3RhdHVzID0gc21lX3NjYW5fcmVxdWVzdCgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5oSGFsLAorCQkJCSAgcEFkYXB0ZXItPnNlc3Npb25JZCwgJnNjYW5SZXF1ZXN0LAorCQkJCSAgJmhkZF9zY2FuX3JlcXVlc3RfY2FsbGJhY2ssIGRldik7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOnNtZV9zY2FuX3JlcXVlc3QgIGZhaWwgJWQhISEiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl3bGFuX2hkZF9zY2FuX3JlcXVlc3RfZW5xdWV1ZShwQWRhcHRlciwgTlVMTCwgTkxfU0NBTiwKKwkJCXNjYW5SZXF1ZXN0LnNjYW5faWQsCisJCQlzY2FuUmVxdWVzdC50aW1lc3RhbXApOworCisJcEFkYXB0ZXItPnNjYW5faW5mby5tU2NhblBlbmRpbmcgPSB0cnVlOworZXJyb3I6CisJaWYgKCh3cnF1LT5kYXRhLmZsYWdzICYgSVdfU0NBTl9USElTX0VTU0lEKSAmJiAoc2NhblJlcS0+ZXNzaWRfbGVuKSkKKwkJY2RmX21lbV9mcmVlKHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0KTsKKwlFWElUKCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBleGl0ICEhISIsCisJCSAgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaXdfc2V0X3NjYW4oKSAtIFNTUiB3cmFwcGVyIGZvciBfX2l3X3NldF9zY2FuCisgKiBAZGV2OiBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICogQGluZm86IFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1OiBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICogQGV4dHJhOiBQb2ludGVyIHRvIHRoZSBkYXRhLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK2ludCBpd19zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfc2NhbihkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfZ2V0X3NjYW4oKSAtIGdldCBzY2FuCisgKiBAZGV2OiBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICogQGluZm86IFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAqIEB3cnF1OiBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICogQGV4dHJhOiBQb2ludGVyIHRvIHRoZSBkYXRhLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2NhbiByZXN1bHRzIHRvIHRoZSB3cGFfc3VwcGxpY2FudAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworCitzdGF0aWMgaW50IF9faXdfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwl0Q3NyU2NhblJlc3VsdEluZm8gKnBTY2FuUmVzdWx0OworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWhkZF9zY2FuX2luZm9fdCBzY2FuSW5mbzsKKwl0U2NhblJlc3VsdEhhbmRsZSBwUmVzdWx0OworCWludCBpID0gMDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBlbnRlciBidWZmZXIgbGVuZ3RoICVkISEhIiwgX19mdW5jX18sCisJCSAgKHdycXUtPmRhdGEubGVuZ3RoKSA/IHdycXUtPmRhdGEubGVuZ3RoIDogSVdfU0NBTl9NQVhfREFUQSk7CisKKwlpZiAodHJ1ZSA9PSBwQWRhcHRlci0+c2Nhbl9pbmZvLm1TY2FuUGVuZGluZykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOm1TY2FuUGVuZGluZyBpcyB0cnVlICEhISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJc2NhbkluZm8uZGV2ID0gZGV2OworCXNjYW5JbmZvLnN0YXJ0ID0gZXh0cmE7CisJc2NhbkluZm8uaW5mbyA9IGluZm87CisKKwlpZiAoMCA9PSB3cnF1LT5kYXRhLmxlbmd0aCkgeworCQlzY2FuSW5mby5lbmQgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisJfSBlbHNlIHsKKwkJc2NhbkluZm8uZW5kID0gZXh0cmEgKyB3cnF1LT5kYXRhLmxlbmd0aDsKKwl9CisKKwlzdGF0dXMgPSBzbWVfc2Nhbl9nZXRfcmVzdWx0KGhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsIE5VTEwsICZwUmVzdWx0KTsKKworCWlmIChOVUxMID09IHBSZXN1bHQpIHsKKwkJLyogbm8gc2NhbiByZXN1bHRzICovCisJCWhkZExvZyhMT0cxLCAiaXdfZ2V0X3NjYW46IE5VTEwgU2NhbiBSZXN1bHQgIik7CisJCXJldHVybiAwOworCX0KKworCXBTY2FuUmVzdWx0ID0gc21lX3NjYW5fcmVzdWx0X2dldF9maXJzdChoSGFsLCBwUmVzdWx0KTsKKworCXdoaWxlIChwU2NhblJlc3VsdCkgeworCQlzdGF0dXMgPSBoZGRfaW5kaWNhdGVfc2Nhbl9yZXN1bHQoJnNjYW5JbmZvLCBwU2NhblJlc3VsdCk7CisJCWlmICgwICE9IHN0YXR1cykgeworCQkJYnJlYWs7CisJCX0KKwkJaSsrOworCQlwU2NhblJlc3VsdCA9IHNtZV9zY2FuX3Jlc3VsdF9nZXRfbmV4dChoSGFsLCBwUmVzdWx0KTsKKwl9CisKKwlzbWVfc2Nhbl9yZXN1bHRfcHVyZ2UoaEhhbCwgcFJlc3VsdCk7CisKKwlFWElUKCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IGV4aXQgdG90YWwgJWQgQlNTIHJlcG9ydGVkICEhISIsIF9fZnVuY19fLCBpKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGl3X2dldF9zY2FuKCkgLSBTU1Igd3JhcHBlciBmdW5jdGlvbiBmb3IgX19pd19nZXRfc2NhbgorICogQGRldjogUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAqIEBpbmZvOiBQb2ludGVyIHRvIHRoZSBpd19yZXF1ZXN0X2luZm8uCisgKiBAd3JxdTogUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAqIEBleHRyYTogUG9pbnRlciB0byB0aGUgZGF0YS4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitpbnQgaXdfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X3NjYW4oZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBoZGRfYWJvcnRfbWFjX3NjYW4oKSAtIGFib3J0cyBvbmdvaW5nIG1hYyBzY2FuCisgKiBAcEhkZEN0eDogUG9pbnRlciB0byBoZGQgY29udGV4dAorICogQHNlc3Npb25JZDogc2Vzc2lvbiBpZAorICogQHJlYXNvbjogYWJvcnQgcmVhc29uCisgKgorICogQWJvcnQgYW55IE1BQyBzY2FuIGlmIGluIHByb2dyZXNzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaGRkX2Fib3J0X21hY19zY2FuKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJZUNzckFib3J0UmVhc29uIHJlYXNvbikKK3sKKwlzbWVfYWJvcnRfbWFjX3NjYW4ocEhkZEN0eC0+aEhhbCwgc2Vzc2lvbklkLCByZWFzb24pOworfQorCisvKioKKyAqIGhkZF92ZW5kb3Jfc2Nhbl9jYWxsYmFjaygpIC0gU2NhbiBjb21wbGV0ZWQgY2FsbGJhY2sgZXZlbnQKKyAqIEBoZGRjdHg6IEhERCBjb250ZXh0CisgKiBAcmVxIDogU2NhbiByZXF1ZXN0CisgKiBAYWJvcnRlZCA6IHRydWUgc2NhbiBhYm9ydGVkIGZhbHNlIHNjYW4gc3VjY2VzcworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgc2NhbiBjb21wbGV0ZWQgY2FsbGJhY2sgZXZlbnQgdG8gTkwuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF92ZW5kb3Jfc2Nhbl9jYWxsYmFjayhoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEsCisJCQkJCWJvb2wgYWJvcnRlZCkKK3sKKwloZGRfY29udGV4dF90ICpoZGRjdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwlpbnQgaTsKKwl1aW50OF90IHNjYW5fc3RhdHVzOworCXVpbnQ2NF90IGNvb2tpZTsKKworCUVOVEVSKCk7CisKKwlpZiAoV0xBTl9IRERfQURBUFRFUl9NQUdJQyAhPSBhZGFwdGVyLT5tYWdpYykgeworCQloZGRfZXJyKCJJbnZhbGlkIGFkYXB0ZXIgbWFnaWMiKTsKKwkJcmV0dXJuOworCX0KKwlza2IgPSBjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MoaGRkY3R4LT53aXBoeSwgTlVMTCwKKwkJCVNDQU5fRE9ORV9FVkVOVF9CVUZfU0laRSArIDQgKyBOTE1TR19IRFJMRU4sCisJCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1NDQU5fRE9ORV9JTkRFWCwKKwkJCUdGUF9LRVJORUwpOworCisJaWYgKCFza2IpIHsKKwkJaGRkX2Vycigic2tiIGFsbG9jIGZhaWxlZCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKDAgIT0gaGRkX3ZlbmRvcl9wdXRfaWZpbmRleChza2IsIGFkYXB0ZXItPmRldi0+aWZpbmRleCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJY29va2llID0gKHVpbnRwdHJfdClyZXE7CisKKwlhdHRyID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX1NTSURTKTsKKwlpZiAoIWF0dHIpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWZvciAoaSA9IDA7IGkgPCByZXEtPm5fc3NpZHM7IGkrKykgeworCQlpZiAobmxhX3B1dChza2IsIGksIHJlcS0+c3NpZHNbaV0uc3NpZF9sZW4sIHJlcS0+c3NpZHNbaV0uc3NpZCkpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CisJbmxhX25lc3RfZW5kKHNrYiwgYXR0cik7CisKKwlhdHRyID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX0ZSRVFVRU5DSUVTKTsKKwlpZiAoIWF0dHIpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWZvciAoaSA9IDA7IGkgPCByZXEtPm5fY2hhbm5lbHM7IGkrKykgeworCQlpZiAobmxhX3B1dF91MzIoc2tiLCBpLCByZXEtPmNoYW5uZWxzW2ldLT5jZW50ZXJfZnJlcSkpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CisJbmxhX25lc3RfZW5kKHNrYiwgYXR0cik7CisKKwlpZiAocmVxLT5pZSAmJgorCQlubGFfcHV0KHNrYiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9JRSwgcmVxLT5pZV9sZW4sCisJCQlyZXEtPmllKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAocmVxLT5mbGFncyAmJgorCQlubGFfcHV0X3UzMihza2IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fRkxBR1MsIHJlcS0+ZmxhZ3MpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChubGFfcHV0X3U2NChza2IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fQ09PS0lFLCBjb29raWUpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCXNjYW5fc3RhdHVzID0gKGFib3J0ZWQgPT0gdHJ1ZSkgPyBWRU5ET1JfU0NBTl9TVEFUVVNfQUJPUlRFRCA6CisJCVZFTkRPUl9TQ0FOX1NUQVRVU19ORVdfUkVTVUxUUzsKKwlpZiAobmxhX3B1dF91OChza2IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fU1RBVFVTLCBzY2FuX3N0YXR1cykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJY2ZnODAyMTFfdmVuZG9yX2V2ZW50KHNrYiwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuOworCitubGFfcHV0X2ZhaWx1cmU6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuOworfQorCisvKioKKyAqIGhkZF9jZmc4MDIxMV9zY2FuX2RvbmVfY2FsbGJhY2soKSAtIHNjYW4gZG9uZSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgYWZ0ZXIKKyAqCQkJCSAgICAgICBzY2FuIGlzIGZpbmlzaGVkCisgKiBAaGFsSGFuZGxlOiBQb2ludGVyIHRvIGhhbmRsZQorICogQHBDb250ZXh0OiBQb2ludGVyIHRvIGNvbnRleHQKKyAqIEBzZXNzaW9uSWQ6IFNlc3Npb24gSWQKKyAqIEBzY2FuSWQ6IFNjYW4gSWQKKyAqIEBzdGF0dXM6IFNjYW4gc3RhdHVzCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIGhkZF9jZmc4MDIxMV9zY2FuX2RvbmVfY2FsbGJhY2sodEhhbEhhbmRsZSBoYWxIYW5kbGUsCisJCQkJCSAgIHZvaWQgKnBDb250ZXh0LAorCQkJCQkgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgdWludDMyX3Qgc2NhbklkLAorCQkJCQkgICBlQ3NyU2NhblN0YXR1cyBzdGF0dXMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXBDb250ZXh0OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX3NjYW5pbmZvX3QgKnBTY2FuSW5mbyA9ICZwQWRhcHRlci0+c2Nhbl9pbmZvOworCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSA9IE5VTEw7CisJYm9vbCBhYm9ydGVkID0gZmFsc2U7CisJaGRkX2NvbnRleHRfdCAqaGRkY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJaW50IHJldCA9IDA7CisJdWludDhfdCBzb3VyY2U7CisJdWludDMyX3Qgc2Nhbl90aW1lOworCXVpbnQzMl90IHNpemUgPSAwOworCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkiJXMgY2FsbGVkIHdpdGggaGFsID0gJXAsIHBDb250ZXh0ID0gJXAsIElEID0gJWQsIHN0YXR1cyA9ICVkIiwKKwkJX19mdW5jX18sIGhhbEhhbmRsZSwgcENvbnRleHQsIChpbnQpc2NhbklkLCAoaW50KXN0YXR1cyk7CisKKwlwU2NhbkluZm8tPm1TY2FuUGVuZGluZ0NvdW50ZXIgPSAwOworCisJaWYgKHBTY2FuSW5mby0+bVNjYW5QZW5kaW5nICE9IHRydWUpIHsKKwkJQ0RGX0FTU0VSVChwU2NhbkluZm8tPm1TY2FuUGVuZGluZyk7CisJCWdvdG8gYWxsb3dfc3VzcGVuZDsKKwl9CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCXdsYW5faGRkX3NjYW5fcmVxdWVzdF9kZXF1ZXVlKGhkZGN0eCwgc2NhbklkLCAmcmVxLCAmc291cmNlLAorCQkJJnNjYW5fdGltZSkpIHsKKwkJaGRkX2VycigiRGVxdWV1ZSBvZiBzY2FuIHJlcXVlc3QgZmFpbGVkIElEOiAlZCIsIHNjYW5JZCk7CisJCWdvdG8gYWxsb3dfc3VzcGVuZDsKKwl9CisKKwlyZXQgPSB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYnNzKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPndpcGh5LAorCQkJCQkgICBwQWRhcHRlciwgc2Nhbl90aW1lKTsKKwlpZiAoMCA+IHJldCkKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IE5PIFNDQU4gcmVzdWx0IiwgX19mdW5jX18pOworCisJLyoKKwkgKiBjZmc4MDIxMV9zY2FuX2RvbmUgaW5mb3JtaW5nIE5MODAyMTEgYWJvdXQgY29tcGxldGlvbgorCSAqIG9mIHNjYW5uaW5nCisJICovCisJaWYgKHN0YXR1cyA9PSBlQ1NSX1NDQU5fQUJPUlQgfHwgc3RhdHVzID09IGVDU1JfU0NBTl9GQUlMVVJFKSB7CisJCWFib3J0ZWQgPSB0cnVlOworCX0KKworCWNkZl9zcGluX2xvY2soJmhkZGN0eC0+aGRkX3NjYW5fcmVxX3FfbG9jayk7CisJY2RmX2xpc3Rfc2l6ZSgmKGhkZGN0eC0+aGRkX3NjYW5fcmVxX3EpLCAmc2l6ZSk7CisJaWYgKCFzaXplKSB7CisJCS8qIFNjYW4gaXMgbm8gbG9uZ2VyIHBlbmRpbmcgKi8KKwkJcFNjYW5JbmZvLT5tU2NhblBlbmRpbmcgPSBmYWxzZTsKKwkJY29tcGxldGUoJnBTY2FuSW5mby0+YWJvcnRzY2FuX2V2ZW50X3Zhcik7CisJfQorCWNkZl9zcGluX3VubG9jaygmaGRkY3R4LT5oZGRfc2Nhbl9yZXFfcV9sb2NrKTsKKwkvKgorCSAqIFNjYW4gY2FuIGJlIHRyaWdncmVkIGZyb20gTkwgb3IgdmVuZG9yIHNjYW4KKwkgKiAtIElmIHNjYW4gaXMgdHJpZ2dlcmVkIGZyb20gTkwgdGhlbiBjZmc4MDIxMSBzY2FuIGRvbmUgc2hvdWxkIGJlCisJICogY2FsbGVkIHRvIHVwZGF0ZWQgc2NhbiBjb21wbGV0aW9uIHRvIE5MLgorCSAqIC0gSWYgc2NhbiBpcyB0cmlnZ3JlZCB0aHJvdWdoIHZlbmRvciBjb21tYW5kIHRoZW4KKwkgKiBzY2FuIGRvbmUgZXZlbnQgd2lsbCBiZSBwb3N0ZWQKKwkgKi8KKwlpZiAoTkxfU0NBTiA9PSBzb3VyY2UpCisJCWNmZzgwMjExX3NjYW5fZG9uZShyZXEsIGFib3J0ZWQpOworCWVsc2UKKwkJaGRkX3ZlbmRvcl9zY2FuX2NhbGxiYWNrKHBBZGFwdGVyLCByZXEsIGFib3J0ZWQpOworCithbGxvd19zdXNwZW5kOgorCWlmICghc2l6ZSkgeworCQkvKiByZWxlYXNlIHRoZSB3YWtlIGxvY2sgYXQgdGhlIGVuZCBvZiB0aGUgc2NhbiAqLworCQloZGRfYWxsb3dfc3VzcGVuZChXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1NDQU4pOworCisJCS8qIEFjcXVpcmUgd2FrZWxvY2sgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIEFQUCdzIHRyaWVzCisJCSAqIHRvIHN1c3BlbmQgaW1tZWRpYXRseSBhZnRlciB0aGUgZHJpdmVyIGdldHMgY29ubmVjdAorCQkgKiByZXF1ZXN0KGkuZSBhZnRlciBzY2FuKSBmcm9tIHN1cHBsaWNhbnQsIHRoaXMgcmVzdWx0IGluCisJCSAqIGFwcCdzIGlzIHN1c3BlbmRpbmcgYW5kIG5vdCBhYmxldG8gcHJvY2VzcyB0aGUgY29ubmVjdAorCQkgKiByZXF1ZXN0IHRvIEFQCisJCSAqLworCQloZGRfcHJldmVudF9zdXNwZW5kX3RpbWVvdXQoMTAwMCwKKwkJCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfU0NBTik7CisJfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwl3bGFuX2hkZF90ZGxzX3NjYW5fZG9uZV9jYWxsYmFjayhwQWRhcHRlcik7CisjZW5kaWYKKworCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3NjYW5fYmxvY2tfY2IoKSAtIHNjYW4gYmxvY2sgd29yayBoYW5kbGVyCisgKiBAd29yazogUG9pbnRlciB0byB3b3JrCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5faGRkX2NmZzgwMjExX3NjYW5fYmxvY2tfY2Ioc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJICAgICAgaGRkX2FkYXB0ZXJfdCwgc2Nhbl9ibG9ja193b3JrKTsKKwlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0ID0gYWRhcHRlci0+cmVxdWVzdDsKKworCXJlcXVlc3QtPm5fc3NpZHMgPSAwOworCXJlcXVlc3QtPm5fY2hhbm5lbHMgPSAwOworCisJaGRkTG9nKExPR0UsCisJCUZMKCIjI0luIERGUyBNYXN0ZXIgbW9kZS4gU2NhbiBhYm9ydGVkLiBOdWxsIHJlc3VsdCBzZW50IikpOworCWNmZzgwMjExX3NjYW5fZG9uZShyZXF1ZXN0LCB0cnVlKTsKKwlhZGFwdGVyLT5yZXF1ZXN0ID0gTlVMTDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3NjYW4oKSAtIEFQSSB0byBwcm9jZXNzIGNmZzgwMjExIHNjYW4gcmVxdWVzdAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldCBkZXZpY2UKKyAqIEByZXF1ZXN0OiBQb2ludGVyIHRvIHNjYW4gcmVxdWVzdAorICogQHNvdXJjZTogc2NhbiByZXF1ZXN0IHNvdXJjZShOTC9WZW5kb3Igc2NhbikKKyAqCisgKiBUaGlzIEFQSSByZXNwb25kcyB0byBzY2FuIHRyaWdnZXIgYW5kIHVwZGF0ZSBjZmc4MDIxMSBzY2FuIGRhdGFiYXNlCisgKiBsYXRlciwgc2NhbiBkdW1wIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcmVjaWV2ZSBzY2FuIHJlc3VsdHMKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9zY2FuKHN0cnVjdCB3aXBoeSAqd2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorI2VuZGlmCisJCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QsCisJCQkJICAgIHVpbnQ4X3Qgc291cmNlKQoreworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHJlcXVlc3QtPndkZXYtPm5ldGRldjsKKyNlbmRpZgorCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCWhkZF93ZXh0X3N0YXRlX3QgKnB3ZXh0QnVmID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwlzdHJ1Y3QgaGRkX2NvbmZpZyAqY2ZnX3BhcmFtID0gTlVMTDsKKwl0Q3NyU2NhblJlcXVlc3Qgc2Nhbl9yZXE7CisJdWludDhfdCAqY2hhbm5lbExpc3QgPSBOVUxMLCBpOworCWludCBzdGF0dXM7CisJaGRkX3NjYW5pbmZvX3QgKnBTY2FuSW5mbyA9IE5VTEw7CisJdWludDhfdCAqcFAycEllID0gTlVMTDsKKwloZGRfYWRhcHRlcl90ICpjb25fc2FwX2FkYXB0ZXI7CisJdWludDE2X3QgY29uX2Rmc19jaDsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfU0NBTiwKKwkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLCByZXF1ZXN0LT5uX2NoYW5uZWxzKSk7CisKKwloZGRMb2coTE9HMSwgRkwoIkRldmljZV9tb2RlICVzKCVkKSIpLAorCQloZGRfZGV2aWNlX21vZGVfdG9fc3RyaW5nKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWNmZ19wYXJhbSA9IHBIZGRDdHgtPmNvbmZpZzsKKwlwU2NhbkluZm8gPSAmcEFkYXB0ZXItPnNjYW5faW5mbzsKKworCS8qIEJsb2NrIEFsbCBTY2FuIGR1cmluZyBERlMgb3BlcmF0aW9uIGFuZCBzZW5kIG51bGwgc2NhbiByZXN1bHQgKi8KKwljb25fc2FwX2FkYXB0ZXIgPSBoZGRfZ2V0X2Nvbl9zYXBfYWRhcHRlcihwQWRhcHRlciwgdHJ1ZSk7CisJaWYgKGNvbl9zYXBfYWRhcHRlcikgeworCQljb25fZGZzX2NoID0gY29uX3NhcF9hZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnNhcENvbmZpZy5jaGFubmVsOworCQlpZiAoY29uX2Rmc19jaCA9PSBBVVRPX0NIQU5ORUxfU0VMRUNUKQorCQkJY29uX2Rmc19jaCA9CisJCQkJY29uX3NhcF9hZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLm9wZXJhdGluZ0NoYW5uZWw7CisKKwkJaWYgKENEU19JU19ERlNfQ0goY29uX2Rmc19jaCkpIHsKKwkJCS8qIFByb3ZpZGUgZW1wdHkgc2NhbiByZXN1bHQgZHVyaW5nIERGUyBvcGVyYXRpb24gc2luY2UKKwkJCSAqIHNjYW5uaW5nIG5vdCBzdXBwb3J0ZWQgZHVyaW5nIERGUy4gUmVhc29uIGlzCisJCQkgKiBmb2xsb3dpbmcgY2FzZToKKwkJCSAqIERGUyBpcyBzdXBwb3J0ZWQgb25seSBpbiBTQ0MgZm9yIE1CU1NJRCBNb2RlLgorCQkJICogV2Ugc2hhbGwgbm90IHJldHVybiBFQlVTWSBvciBFTk9UU1VQUCBhcyB3aGVuIFByaW1hcnkKKwkJCSAqIEFQIGlzIG9wZXJhdGluZyBpbiBERlMgY2hhbm5lbCBhbmQgc2Vjb25kYXJ5IEFQIGlzCisJCQkgKiBzdGFydGVkLiBUaG91Z2ggd2UgZm9yY2UgU0NDIGluIGRyaXZlciwgdGhlIGhvc3RhcGQKKwkJCSAqIGlzc3VlcyBvYnNzIHNjYW4gYmVmb3JlIHN0YXJ0aW5nIHNlY0FQLiBUaGlzIHJlc3VsdHMKKwkJCSAqIGluIE1DQyBpbiBERlMgbW9kZS4gVGh1cyB3ZSByZXR1cm4gbnVsbCBzY2FuIHJlc3VsdC4KKwkJCSAqIElmIHdlIHJldHVybiBzY2FuIGZhaWx1cmUgaG9zdGFwZCBmYWlscyBzZWNvbmRhcnkgQVAKKwkJCSAqIHN0YXJ0dXAuCisJCQkgKi8KKwkJCXBBZGFwdGVyLT5yZXF1ZXN0ID0gcmVxdWVzdDsKKworI2lmZGVmIENPTkZJR19DTlNTCisJCQljbnNzX2luaXRfd29yaygmcEFkYXB0ZXItPnNjYW5fYmxvY2tfd29yaywKKwkJCQkgICAgICAgd2xhbl9oZGRfY2ZnODAyMTFfc2Nhbl9ibG9ja19jYik7CisjZWxzZQorCQkJSU5JVF9XT1JLKCZwQWRhcHRlci0+c2Nhbl9ibG9ja193b3JrLAorCQkJCSAgd2xhbl9oZGRfY2ZnODAyMTFfc2Nhbl9ibG9ja19jYik7CisjZW5kaWYKKwkJCXNjaGVkdWxlX3dvcmsoJnBBZGFwdGVyLT5zY2FuX2Jsb2NrX3dvcmspOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKCF3bWFfaXNfaHdfZGJzX2NhcGFibGUoKSkgeworCQlpZiAodHJ1ZSA9PSBwU2NhbkluZm8tPm1TY2FuUGVuZGluZykgeworCQkJaWYgKE1BWF9QRU5ESU5HX0xPRyA+CisJCQkJcFNjYW5JbmZvLT5tU2NhblBlbmRpbmdDb3VudGVyKyspIHsKKwkJCQloZGRMb2coTE9HRSwgRkwoIm1TY2FuUGVuZGluZyBpcyB0cnVlIikpOworCQkJfQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCS8qIERvbid0IEFsbG93IFNjYW4gYW5kIHJldHVybiBidXN5IGlmIFJlbWFpbiBPbgorCQkgKiBDaGFubmVsIGFuZCBhY3Rpb24gZnJhbWUgaXMgcGVuZGluZworCQkgKiBPdGhlcndpc2UgQ2FuY2VsIFJlbWFpbiBPbiBDaGFubmVsIGFuZCBhbGxvdyBTY2FuCisJCSAqIElmIG5vIGFjdGlvbiBmcmFtZSBwZW5kaW5nCisJCSAqLworCQlpZiAoMCAhPSB3bGFuX2hkZF9jaGVja19yZW1haW5fb25fY2hhbm5lbChwQWRhcHRlcikpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiUmVtYWluIE9uIENoYW5uZWwgUGVuZGluZyIpKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwkvKiBpZiB0ZGxzIGRpc2FncmVlIHNjYW4gcmlnaHQgbm93LCByZXR1cm4gaW1tZWRpYXRlbHkuCisJICogdGRscyB3aWxsIHNjaGVkdWxlIHRoZSBzY2FuIHdoZW4gc2NhbiBpcyBhbGxvd2VkLgorCSAqIChyZXR1cm4gU1VDQ0VTUykKKwkgKiBvciB3aWxsIHJlamVjdCB0aGUgc2NhbiBpZiBhbnkgVERMUyBpcyBpbiBwcm9ncmVzcy4KKwkgKiAocmV0dXJuIC1FQlVTWSkKKwkgKi8KKwlzdGF0dXMgPSB3bGFuX2hkZF90ZGxzX3NjYW5fY2FsbGJhY2socEFkYXB0ZXIsIHdpcGh5LAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwkJCQkJCWRldiwKKyNlbmRpZgorCQkJCQlyZXF1ZXN0KTsKKwlpZiAoc3RhdHVzIDw9IDApIHsKKwkJaWYgKCFzdGF0dXMpCisJCQloZGRMb2coTE9HRSwKKwkJCUZMKCJURExTIGluIHByb2dyZXNzLnNjYW4gcmVqZWN0ZWQgJWQiKSwKKwkJCXN0YXR1cyk7CisJCWVsc2UKKwkJCWhkZExvZyhMT0dFLCBGTCgiVERMUyB0ZWFyZG93biBpcyBvbmdvaW5nICVkIiksCisJCQkgICAgICAgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisjZW5kaWYKKworCS8qIENoZWNrIGlmIHNjYW4gaXMgYWxsb3dlZCBhdCB0aGlzIHBvaW50IG9mIHRpbWUgKi8KKwlpZiAoY2RzX2lzX2Nvbm5lY3Rpb25faW5fcHJvZ3Jlc3MocEhkZEN0eCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJTY2FuIG5vdCBhbGxvd2VkIikpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWNkZl9tZW1femVybygmc2Nhbl9yZXEsIHNpemVvZihzY2FuX3JlcSkpOworCisJaGRkTG9nKExPRzEsICJzY2FuIHJlcXVlc3QgZm9yIHNzaWQgPSAlZCIsIHJlcXVlc3QtPm5fc3NpZHMpOworCXNjYW5fcmVxLnRpbWVzdGFtcCA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisKKwkvKiBFdmVuIHRob3VnaCBzdXBwbGljYW50IGRvZXNuJ3QgcHJvdmlkZSBhbnkgU1NJRHMsIG5fc3NpZHMgaXMKKwkgKiBzZXQgdG8gMS4gIEJlY2F1c2Ugb2YgdGhpcywgZHJpdmVyIGlzIGFzc3VtaW5nIHRoYXQgdGhpcyBpcyBub3QKKwkgKiB3aWxkY2FyZCBzY2FuIGFuZCBzbyBpcyBub3QgYWdpbmcgb3V0IHRoZSBzY2FuIHJlc3VsdHMuCisJICovCisJaWYgKChyZXF1ZXN0LT5zc2lkcykgJiYgKHJlcXVlc3QtPm5fc3NpZHMgPT0gMSkgJiYKKwkgICAgKCdcMCcgPT0gcmVxdWVzdC0+c3NpZHMtPnNzaWRbMF0pKSB7CisJCXJlcXVlc3QtPm5fc3NpZHMgPSAwOworCX0KKworCWlmICgocmVxdWVzdC0+c3NpZHMpICYmICgwIDwgcmVxdWVzdC0+bl9zc2lkcykpIHsKKwkJdENzclNTSURJbmZvICpTc2lkSW5mbzsKKwkJaW50IGo7CisJCXNjYW5fcmVxLlNTSURzLm51bU9mU1NJRHMgPSByZXF1ZXN0LT5uX3NzaWRzOworCQkvKiBBbGxvY2F0ZSBudW1fc3NpZCB0Q3NyU1NJREluZm8gc3RydWN0dXJlICovCisJCVNzaWRJbmZvID0gc2Nhbl9yZXEuU1NJRHMuU1NJRExpc3QgPQorCQkJY2RmX21lbV9tYWxsb2MocmVxdWVzdC0+bl9zc2lkcyAqIHNpemVvZih0Q3NyU1NJREluZm8pKTsKKworCQlpZiAoTlVMTCA9PSBzY2FuX3JlcS5TU0lEcy5TU0lETGlzdCkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJtZW1vcnkgYWxsb2MgZmFpbGVkIFNTSURJbmZvIGJ1ZmZlciIpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJLyogY29weSBhbGwgdGhlIHNzaWQncyBhbmQgdGhlaXIgbGVuZ3RoICovCisJCWZvciAoaiA9IDA7IGogPCByZXF1ZXN0LT5uX3NzaWRzOyBqKyssIFNzaWRJbmZvKyspIHsKKwkJCS8qIGdldCB0aGUgc3NpZCBsZW5ndGggKi8KKwkJCVNzaWRJbmZvLT5TU0lELmxlbmd0aCA9IHJlcXVlc3QtPnNzaWRzW2pdLnNzaWRfbGVuOworCQkJY2RmX21lbV9jb3B5KFNzaWRJbmZvLT5TU0lELnNzSWQsCisJCQkJICAgICAmcmVxdWVzdC0+c3NpZHNbal0uc3NpZFswXSwKKwkJCQkgICAgIFNzaWRJbmZvLT5TU0lELmxlbmd0aCk7CisJCQlTc2lkSW5mby0+U1NJRC5zc0lkW1NzaWRJbmZvLT5TU0lELmxlbmd0aF0gPSAnXDAnOworCQkJaGRkTG9nKExPRzEsIEZMKCJTU0lEIG51bWJlciAlZDogJXMiKSwgaiwKKwkJCQlTc2lkSW5mby0+U1NJRC5zc0lkKTsKKwkJfQorCQkvKiBzZXQgdGhlIHNjYW4gdHlwZSB0byBhY3RpdmUgKi8KKwkJc2Nhbl9yZXEuc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworCX0gZWxzZSBpZiAoV0xBTl9IRERfUDJQX0dPID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgeworCQkvKiBzZXQgdGhlIHNjYW4gdHlwZSB0byBhY3RpdmUgKi8KKwkJc2Nhbl9yZXEuc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFNldCB0aGUgc2NhbiB0eXBlIHRvIHBhc3NpdmUgaWYgdGhlcmUgaXMgbm8gc3NpZCBsaXN0CisJCSAqIHByb3ZpZGVkIGVsc2Ugc2V0IGRlZmF1bHQgdHlwZSBjb25maWd1cmVkIGluIHRoZSBkcml2ZXIuCisJCSAqLworCQlpZiAoIXJlcXVlc3QtPnNzaWRzKQorCQkJc2Nhbl9yZXEuc2NhblR5cGUgPSBlU0lSX1BBU1NJVkVfU0NBTjsKKwkJZWxzZQorCQkJc2Nhbl9yZXEuc2NhblR5cGUgPSBwSGRkQ3R4LT5pb2N0bF9zY2FuX21vZGU7CisJfQorCXNjYW5fcmVxLm1pbkNoblRpbWUgPSBjZmdfcGFyYW0tPm5BY3RpdmVNaW5DaG5UaW1lOworCXNjYW5fcmVxLm1heENoblRpbWUgPSBjZmdfcGFyYW0tPm5BY3RpdmVNYXhDaG5UaW1lOworCisJLyogc2V0IEJTU1R5cGUgdG8gZGVmYXVsdCB0eXBlICovCisJc2Nhbl9yZXEuQlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworCisJaWYgKE1BWF9DSEFOTkVMIDwgcmVxdWVzdC0+bl9jaGFubmVscykgeworCQloZGRMb2coTE9HVywgRkwoIk5vIG9mIFNjYW4gQ2hhbm5lbHMgZXhjZWVkZWQgbGltaXQ6ICVkIiksCisJCSAgICAgICByZXF1ZXN0LT5uX2NoYW5uZWxzKTsKKwkJcmVxdWVzdC0+bl9jaGFubmVscyA9IE1BWF9DSEFOTkVMOworCX0KKworCWhkZExvZyhMT0cxLCBGTCgiTm8gb2YgU2NhbiBDaGFubmVsczogJWQiKSwgcmVxdWVzdC0+bl9jaGFubmVscyk7CisKKwlpZiAocmVxdWVzdC0+bl9jaGFubmVscykgeworCQljaGFyIGNoTGlzdFsocmVxdWVzdC0+bl9jaGFubmVscyAqIDUpICsgMV07CisJCWludCBsZW47CisJCWNoYW5uZWxMaXN0ID0gY2RmX21lbV9tYWxsb2MocmVxdWVzdC0+bl9jaGFubmVscyk7CisJCWlmIChOVUxMID09IGNoYW5uZWxMaXN0KSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTCgiY2hhbm5lbExpc3QgbWFsbG9jIGZhaWxlZCBjaGFubmVsTGlzdCIpKTsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQlnb3RvIGZyZWVfbWVtOworCQl9CisJCWZvciAoaSA9IDAsIGxlbiA9IDA7IGkgPCByZXF1ZXN0LT5uX2NoYW5uZWxzOyBpKyspIHsKKwkJCWNoYW5uZWxMaXN0W2ldID0gcmVxdWVzdC0+Y2hhbm5lbHNbaV0tPmh3X3ZhbHVlOworCQkJbGVuICs9IHNucHJpbnRmKGNoTGlzdCArIGxlbiwgNSwgIiVkICIsIGNoYW5uZWxMaXN0W2ldKTsKKwkJfQorCisJCWhkZExvZyhMT0cxLCBGTCgiQ2hhbm5lbC1MaXN0OiAlcyIpLCBjaExpc3QpOworCisJfQorCXNjYW5fcmVxLkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSByZXF1ZXN0LT5uX2NoYW5uZWxzOworCXNjYW5fcmVxLkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gY2hhbm5lbExpc3Q7CisKKwkvKiBzZXQgcmVxdWVzdFR5cGUgdG8gZnVsbCBzY2FuICovCisJc2Nhbl9yZXEucmVxdWVzdFR5cGUgPSBlQ1NSX1NDQU5fUkVRVUVTVF9GVUxMX1NDQU47CisKKwkvKiBGbHVzaCB0aGUgc2NhbiByZXN1bHRzKG9ubHkgcDJwIGJlYWNvbnMpIGZvciBTVEEgc2NhbiBhbmQgUDJQCisJICogc2VhcmNoIChGbHVzaCBvbiBib3RoIGZ1bGwgIHNjYW4gYW5kIHNvY2lhbCBzY2FuIGJ1dCBub3Qgb24gc2luZ2xlCisJICogY2hhbm5lbCBzY2FuKS5QMlAgIHNlYXJjaCBoYXBwZW5zIG9uIDMgc29jaWFsIGNoYW5uZWxzICgxLCA2LCAxMSkKKwkgKi8KKworCS8qIFN1cHBsaWNhbnQgZG9lcyBzaW5nbGUgY2hhbm5lbCBzY2FuIGFmdGVyIDgtd2F5IGhhbmRzaGFrZQorCSAqIGFuZCBpbiB0aGF0IGNhc2UgZHJpdmVyIHNob3VkbnQgZmx1c2ggc2NhbiByZXN1bHRzLiBJZgorCSAqIGRyaXZlciBmbHVzaGVzIHRoZSBzY2FuIHJlc3VsdHMgaGVyZSBhbmQgdW5mb3J0dW5hdGVseSBpZgorCSAqIHRoZSBBUCBkb2VzbnQgcmVzcG9uZCB0byBvdXIgcHJvYmUgcmVxIHRoZW4gYXNzb2NpYXRpb24KKwkgKiBmYWlscyB3aGljaCBpcyBub3QgZGVzaXJlZAorCSAqLworCisJaWYgKHJlcXVlc3QtPm5fY2hhbm5lbHMgIT0gV0xBTl9IRERfUDJQX1NJTkdMRV9DSEFOTkVMX1NDQU4pIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywgIkZsdXNoaW5nIFAyUCBSZXN1bHRzIik7CisJCXNtZV9zY2FuX2ZsdXNoX3AycF9yZXN1bHQoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCQkgICBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKwl9CisKKwlpZiAocmVxdWVzdC0+aWVfbGVuKSB7CisJCS8qIHNhdmUgdGhpcyBmb3IgZnV0dXJlIGFzc29jaWF0aW9uIChqb2luIHJlcXVpcmVzIHRoaXMpICovCisJCW1lbXNldCgmcFNjYW5JbmZvLT5zY2FuQWRkSUUsIDAsIHNpemVvZihwU2NhbkluZm8tPnNjYW5BZGRJRSkpOworCQltZW1jcHkocFNjYW5JbmZvLT5zY2FuQWRkSUUuYWRkSUVkYXRhLCByZXF1ZXN0LT5pZSwKKwkJICAgICAgIHJlcXVlc3QtPmllX2xlbik7CisJCXBTY2FuSW5mby0+c2NhbkFkZElFLmxlbmd0aCA9IHJlcXVlc3QtPmllX2xlbjsKKworCQlpZiAoKFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSB8fAorCQkgICAgKFdMQU5fSEREX1AyUF9DTElFTlQgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSB8fAorCQkgICAgKFdMQU5fSEREX1AyUF9ERVZJQ0UgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorCQkgICAgKSB7CisJCQlwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUucEFkZElFU2NhbiA9CisJCQkJcFNjYW5JbmZvLT5zY2FuQWRkSUUuYWRkSUVkYXRhOworCQkJcHdleHRCdWYtPnJvYW1Qcm9maWxlLm5BZGRJRVNjYW5MZW5ndGggPQorCQkJCXBTY2FuSW5mby0+c2NhbkFkZElFLmxlbmd0aDsKKwkJfQorCisJCXNjYW5fcmVxLnVJRUZpZWxkTGVuID0gcFNjYW5JbmZvLT5zY2FuQWRkSUUubGVuZ3RoOworCQlzY2FuX3JlcS5wSUVGaWVsZCA9IHBTY2FuSW5mby0+c2NhbkFkZElFLmFkZElFZGF0YTsKKworCQlwUDJwSWUgPSB3bGFuX2hkZF9nZXRfcDJwX2llX3B0cigodWludDhfdCAqKSByZXF1ZXN0LT5pZSwKKwkJCQkJCSByZXF1ZXN0LT5pZV9sZW4pOworCQlpZiAocFAycEllICE9IE5VTEwpIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0RFQlVHCisJCQlpZiAoKChnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID09IFAyUF9HT19ORUdfQ09NUExFVEVEKQorCQkJICAgICB8fCAoZ2xvYmFsX3AycF9jb25uZWN0aW9uX3N0YXR1cyA9PQorCQkJCSBQMlBfR09fTkVHX1BST0NFU1MpKQorCQkJICAgICYmIChXTEFOX0hERF9QMlBfQ0xJRU5UID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkpIHsKKwkJCQlnbG9iYWxfcDJwX2Nvbm5lY3Rpb25fc3RhdHVzID0KKwkJCQkJUDJQX0NMSUVOVF9DT05ORUNUSU5HX1NUQVRFXzE7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKCJbUDJQIFN0YXRlXSBDaGFuZ2luZyBzdGF0ZSBmcm9tIEdvIG5lZ28gY29tcGxldGVkIHRvIENvbm5lY3Rpb24gaXMgc3RhcnRlZCIpKTsKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgRkwoIltQMlBdUDJQIFNjYW5uaW5nIGlzIHN0YXJ0ZWQgZm9yIDh3YXkgSGFuZHNoYWtlIikpOworCQkJfSBlbHNlCisJCQlpZiAoKGdsb2JhbF9wMnBfY29ubmVjdGlvbl9zdGF0dXMgPT0KKwkJCSAgICAgUDJQX0NMSUVOVF9ESVNDT05ORUNURURfU1RBVEUpCisJCQkgICAgJiYgKFdMQU5fSEREX1AyUF9DTElFTlQgPT0KKwkJCQlwQWRhcHRlci0+ZGV2aWNlX21vZGUpKSB7CisJCQkJZ2xvYmFsX3AycF9jb25uZWN0aW9uX3N0YXR1cyA9CisJCQkJCVAyUF9DTElFTlRfQ09OTkVDVElOR19TVEFURV8yOworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgiW1AyUCBTdGF0ZV0gQ2hhbmdpbmcgc3RhdGUgZnJvbSBEaXNjb25uZWN0ZWQgc3RhdGUgdG8gQ29ubmVjdGlvbiBpcyBzdGFydGVkIikpOworCQkJCWhkZExvZyhMT0dFLAorCQkJCSAgICAgICBGTCgiW1AyUF1QMlAgU2Nhbm5pbmcgaXMgc3RhcnRlZCBmb3IgNHdheSBIYW5kc2hha2UiKSk7CisJCQl9CisjZW5kaWYKKworCQkJLyogbm9fY2NrIHdpbGwgYmUgc2V0IGR1cmluZyBwMnAgZmluZCB0byBkaXNhYmxlIDExYiByYXRlcyAqLworCQkJaWYgKHJlcXVlc3QtPm5vX2NjaykgeworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICAgICAgIiVzOiBUaGlzIGlzIGEgUDJQIFNlYXJjaCIsIF9fZnVuY19fKTsKKwkJCQlzY2FuX3JlcS5wMnBTZWFyY2ggPSAxOworCisJCQkJaWYgKHJlcXVlc3QtPm5fY2hhbm5lbHMgPT0KKwkJCQkgICAgV0xBTl9IRERfUDJQX1NPQ0lBTF9DSEFOTkVMUykgeworCQkJCQkvKiBzZXQgcmVxdWVzdFR5cGUgdG8gUDJQIERpc2NvdmVyeSAqLworCQkJCQlzY2FuX3JlcS5yZXF1ZXN0VHlwZSA9CisJCQkJCQllQ1NSX1NDQU5fUDJQX0RJU0NPVkVSWTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFNraXAgRGZzIENoYW5uZWwgaW4gY2FzZSBvZiBQMlAgU2VhcmNoIGlmIGl0IGlzIHNldCBpbgorCQkJCSAqIGluaSBmaWxlCisJCQkJICovCisJCQkJaWYgKGNmZ19wYXJhbS0+c2tpcERmc0NobmxJblAycFNlYXJjaCkgeworCQkJCQlzY2FuX3JlcS5za2lwRGZzQ2hubEluUDJwU2VhcmNoID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlzY2FuX3JlcS5za2lwRGZzQ2hubEluUDJwU2VhcmNoID0gMDsKKwkJCQl9CisKKwkJCX0KKwkJfQorCX0KKworCS8qIGFjcXVpcmUgdGhlIHdha2Vsb2NrIHRvIGF2b2lkIHRoZSBhcHBzIHN1c3BlbmQgZHVyaW5nIHRoZSBzY2FuLiBUbworCSAqIGFkZHJlc3MgdGhlIGZvbGxvd2luZyBpc3N1ZXMuCisJICogMSkgRGlzY29ubmVjdGVkIHNjZW5hcmlvOiB3ZSBhcmUgbm90IGFsbG93aW5nIHRoZSBzdXNwZW5kIGFzIFdMQU4gaXMgbm90IGluCisJICogQk1QUy9JTVBTIHRoaXMgcmVzdWx0IGluIGFuZHJvaWQgdHJ5aW5nIHRvIHN1c3BlbmQgYWdncmVzc2l2ZWx5IGFuZCBiYWNraW5nIG9mZgorCSAqIGZvciBsb25nIHRpbWUsIHRoaXMgcmVzdWx0IGluIGFwcHMgcnVubmluZyBhdCBmdWxsIHBvd2VyIGZvciBsb25nIHRpbWUuCisJICogMikgQ29ubmVjdGVkIHNjZW5hcmlvOiBJZiB3ZSBhbGxvdyB0aGUgc3VzcGVuZCBkdXJpbmcgdGhlIHNjYW4sIFJJVkEgd2lsbAorCSAqIGJlIHN0dWNrIGluIGZ1bGwgcG93ZXIgYmVjYXVzZSBvZiByZXN1bWUgQk1QUworCSAqLworCWhkZF9wcmV2ZW50X3N1c3BlbmRfdGltZW91dChIRERfV0FLRV9MT0NLX1NDQU5fRFVSQVRJT04sCisJCQkJICAgIFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfU0NBTik7CisKKwloZGRMb2coTE9HMiwKKwkgICAgICAgRkwoInJlcXVlc3RUeXBlICVkLCBzY2FuVHlwZSAlZCwgbWluQ2huVGltZSAlZCwgbWF4Q2huVGltZSAlZCxwMnBTZWFyY2ggJWQsIHNraXBEZnNDaG5sSW4gUDJwU2VhcmNoICVkIiksCisJICAgICAgIHNjYW5fcmVxLnJlcXVlc3RUeXBlLCBzY2FuX3JlcS5zY2FuVHlwZSwKKwkgICAgICAgc2Nhbl9yZXEubWluQ2huVGltZSwgc2Nhbl9yZXEubWF4Q2huVGltZSwKKwkgICAgICAgc2Nhbl9yZXEucDJwU2VhcmNoLCBzY2FuX3JlcS5za2lwRGZzQ2hubEluUDJwU2VhcmNoKTsKKworCXN0YXR1cyA9IHNtZV9zY2FuX3JlcXVlc3QoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsICZzY2FuX3JlcSwKKwkJCQkmaGRkX2NmZzgwMjExX3NjYW5fZG9uZV9jYWxsYmFjaywgZGV2KTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgic21lX3NjYW5fcmVxdWVzdCByZXR1cm5lZCBlcnJvciAlZCIpLCBzdGF0dXMpOworCQlpZiAoQ0RGX1NUQVRVU19FX1JFU09VUkNFUyA9PSBzdGF0dXMpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgIEZMKCJITyBpcyBpbiBwcm9ncmVzcy5TbyBkZWZlciB0aGUgc2NhbiBieSBpbmZvcm1pbmcgYnVzeSIpKTsKKwkJCXN0YXR1cyA9IC1FQlVTWTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IC1FSU87CisJCX0KKworCQloZGRfYWxsb3dfc3VzcGVuZChXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1NDQU4pOworCQlnb3RvIGZyZWVfbWVtOworCX0KKwl3bGFuX2hkZF9zY2FuX3JlcXVlc3RfZW5xdWV1ZShwQWRhcHRlciwgcmVxdWVzdCwgc291cmNlLAorCQkJc2Nhbl9yZXEuc2Nhbl9pZCwgc2Nhbl9yZXEudGltZXN0YW1wKTsKKwlwQWRhcHRlci0+c2Nhbl9pbmZvLm1TY2FuUGVuZGluZyA9IHRydWU7CisKK2ZyZWVfbWVtOgorCWlmIChzY2FuX3JlcS5TU0lEcy5TU0lETGlzdCkKKwkJY2RmX21lbV9mcmVlKHNjYW5fcmVxLlNTSURzLlNTSURMaXN0KTsKKworCWlmIChjaGFubmVsTGlzdCkKKwkJY2RmX21lbV9mcmVlKGNoYW5uZWxMaXN0KTsKKworCUVYSVQoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3NjYW4oKSAtIEFQSSB0byBwcm9jZXNzIGNmZzgwMjExIHNjYW4gcmVxdWVzdAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldCBkZXZpY2UKKyAqIEByZXF1ZXN0OiBQb2ludGVyIHRvIHNjYW4gcmVxdWVzdAorICoKKyAqIFRoaXMgQVBJIHJlc3BvbmRzIHRvIHNjYW4gdHJpZ2dlciBhbmQgdXBkYXRlIGNmZzgwMjExIHNjYW4gZGF0YWJhc2UKKyAqIGxhdGVyLCBzY2FuIGR1bXAgY29tbWFuZCBjYW4gYmUgdXNlZCB0byByZWNpZXZlIHNjYW4gcmVzdWx0cworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3NjYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorI2VuZGlmCisJCQkgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCWludCByZXQ7CisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3NjYW4od2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCSAgICAgICBkZXYsCisjZW5kaWYKKwkJCQlyZXF1ZXN0LCBOTF9TQ0FOKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9nZXRfcmF0ZXMoKSAtQVBJIHRvIGdldCB0aGUgcmF0ZXMgZnJvbSBzY2FuIHJlcXVlc3QKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGJhbmQ6IEJhbmQKKyAqIEByYXRlczogYXJyYXkgb2YgcmF0ZXMKKyAqIEByYXRlX2NvdW50OiBudW1iZXIgb2YgcmF0ZXMKKyAqCisgKiBSZXR1cm46IG8gZm9yIGZhaWx1cmUsIHJhdGUgYml0bWFwIGZvciBzdWNjZXNzCisgKi8KK3N0YXRpYyB1aW50MzJfdCB3bGFuX2hkZF9nZXRfcmF0ZXMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJY29uc3QgdTggKnJhdGVzLCB1bnNpZ25lZCBpbnQgcmF0ZV9jb3VudCkKK3sKKwl1aW50MzJfdCBqLCBjb3VudCwgcmF0ZV9iaXRtYXAgPSAwOworCXVpbnQzMl90IHJhdGU7CisJYm9vbCBmb3VuZDsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHJhdGVfY291bnQ7IGNvdW50KyspIHsKKwkJcmF0ZSA9ICgocmF0ZXNbY291bnRdKSAmIFJBVEVfTUFTSykgKiA1OworCQlmb3VuZCA9IGZhbHNlOworCQlmb3IgKGogPSAwOyBqIDwgd2lwaHktPmJhbmRzW2JhbmRdLT5uX2JpdHJhdGVzOyBqKyspIHsKKwkJCWlmICh3aXBoeS0+YmFuZHNbYmFuZF0tPmJpdHJhdGVzW2pdLmJpdHJhdGUgPT0gcmF0ZSkgeworCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQlyYXRlX2JpdG1hcCB8PSAoMSA8PCBqKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiByYXRlX2JpdG1hcDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9zZW5kX3NjYW5fc3RhcnRfZXZlbnQoKSAtQVBJIHRvIHNlbmQgdGhlIHNjYW4gc3RhcnQgZXZlbnQKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gbmV0IGRldmljZQorICogQGNvb2tpZTogc2NhbiBpZGVudGlmaWVyCisgKgorICogUmV0dXJuOiByZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9zZW5kX3NjYW5fc3RhcnRfZXZlbnQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgdWludDY0X3QgY29va2llKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJldDsKKworCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiKHdpcGh5LCBzaXplb2YodTY0KSArCisJCQlOTEFfSERSTEVOICsgTkxNU0dfSERSTEVOKTsKKwlpZiAoIXNrYikgeworCQloZGRMb2coTE9HRSwgRkwoIiByZXBseSBza2IgYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAobmxhX3B1dF91NjQoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX0NPT0tJRSwgY29va2llKSkgeworCQloZGRMb2coTE9HRSwgRkwoIm5sYSBwdXQgZmFpbCIpKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkoc2tiKTsKKworCS8qIFNlbmQgYSBzY2FuIHN0YXJ0ZWQgZXZlbnQgdG8gc3VwcGxpY2FudCAqLworCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyh3aXBoeSwgd2RldiwKKwkJc2l6ZW9mKHU2NCkgKyA0ICsgTkxNU0dfSERSTEVOLAorCQlRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1NDQU5fSU5ERVgsIEdGUF9LRVJORUwpOworCWlmICghc2tiKSB7CisJCWhkZExvZyhMT0dFLCBGTCgic2tiIGFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gaGRkX3ZlbmRvcl9wdXRfaWZpbmRleChza2IsIHdkZXYtPm5ldGRldi0+aWZpbmRleCk7CisJaWYgKHJldCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5sYV9wdXRfdTY0KHNrYiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9DT09LSUUsIGNvb2tpZSkpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljZmc4MDIxMV92ZW5kb3JfZXZlbnQoc2tiLCBHRlBfS0VSTkVMKTsKKworCXJldHVybiByZXQ7Cit9CisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfdmVuZG9yX3NjYW4oKSAtIEFQSSB0byBwcm9jZXNzIHZlbm9yIHNjYW4gcmVxdWVzdAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAd2RldjogUG9pbnRlciB0byBuZXQgZGV2aWNlCisgKiBAZGF0YSA6IFBvaW50ZXIgdG8gdGhlIGRhdGEKKyAqIEBkYXRhX2xlbiA6IGxlbmd0aCBvZiB0aGUgZGF0YQorICoKKyAqIEFQSSB0byBwcm9jZXNzIHZlbm9yIHNjYW4gcmVxdWVzdC4KKyAqCisgKiBSZXR1cm46IHJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfdmVuZG9yX3NjYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCBubGF0dHIgKnRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fTUFYICsgMV07CisJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCA9IE5VTEw7CisJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CisJdWludDhfdCBuX2NoYW5uZWxzID0gMCwgbl9zc2lkID0gMCwgaWVfbGVuID0gMDsKKwl1aW50MzJfdCB0bXAsIGNvdW50LCBqOworCXVuc2lnbmVkIGludCBsZW47CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9NQVgsIGRhdGEsCisJCWRhdGFfbGVuLCBOVUxMKSkgeworCQloZGRfZXJyKCJJbnZhbGlkIEFUVFIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fRlJFUVVFTkNJRVNdKSB7CisJCW5sYV9mb3JfZWFjaF9uZXN0ZWQoYXR0ciwKKwkJCXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fRlJFUVVFTkNJRVNdLCB0bXApCisJCQluX2NoYW5uZWxzKys7CisJfSBlbHNlIHsKKwkJZm9yIChiYW5kID0gMDsgYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGJhbmQrKykKKwkJCWlmICh3aXBoeS0+YmFuZHNbYmFuZF0pCisJCQkJbl9jaGFubmVscyArPSB3aXBoeS0+YmFuZHNbYmFuZF0tPm5fY2hhbm5lbHM7CisJfQorCisJaWYgKE1BWF9DSEFOTkVMIDwgbl9jaGFubmVscykgeworCQloZGRfZXJyKCJFeGNlZWQgbWF4IG51bWJlciBvZiBjaGFubmVsczogJWQiLCBuX2NoYW5uZWxzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX1NTSURTXSkKKwkJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLAorCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9TU0lEU10sIHRtcCkKKwkJCW5fc3NpZCsrOworCisJaWYgKE1BWF9TQ0FOX1NTSUQgPCBuX3NzaWQpIHsKKwkJaGRkX2VycigiRXhjZWVkIG1heCBudW1iZXIgb2YgU1NJRDogJWQiLCBuX3NzaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9JRV0pCisJCWllX2xlbiA9IG5sYV9sZW4odGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9JRV0pOworCWVsc2UKKwkJaWVfbGVuID0gMDsKKworCWxlbiA9IHNpemVvZigqcmVxdWVzdCkgKyAoc2l6ZW9mKCpyZXF1ZXN0LT5zc2lkcykgKiBuX3NzaWQpICsKKwkJCShzaXplb2YoKnJlcXVlc3QtPmNoYW5uZWxzKSAqIG5fY2hhbm5lbHMpICsgaWVfbGVuOworCisJcmVxdWVzdCA9IGNkZl9tZW1fbWFsbG9jKGxlbik7CisJaWYgKCFyZXF1ZXN0KQorCQlnb3RvIGVycm9yOworCWlmIChuX3NzaWQpCisJCXJlcXVlc3QtPnNzaWRzID0gKHZvaWQgKikmcmVxdWVzdC0+Y2hhbm5lbHNbbl9jaGFubmVsc107CisJcmVxdWVzdC0+bl9zc2lkcyA9IG5fc3NpZDsKKwlpZiAoaWVfbGVuKSB7CisJCWlmIChyZXF1ZXN0LT5zc2lkcykKKwkJCXJlcXVlc3QtPmllID0gKHZvaWQgKikocmVxdWVzdC0+c3NpZHMgKyBuX3NzaWQpOworCQllbHNlCisJCQlyZXF1ZXN0LT5pZSA9ICh2b2lkICopKHJlcXVlc3QtPmNoYW5uZWxzICsgbl9jaGFubmVscyk7CisJfQorCisJY291bnQgPSAwOworCWlmICh0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX0ZSRVFVRU5DSUVTXSkgeworCQlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsCisJCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9GUkVRVUVOQ0lFU10sCisJCQkJdG1wKSB7CisJCQljaGFuID0gX19pZWVlODAyMTFfZ2V0X2NoYW5uZWwod2lwaHksCisJCQkJCQkJbmxhX2dldF91MzIoYXR0cikpOworCQkJaWYgKCFjaGFuKQorCQkJCWdvdG8gZXJyb3I7CisJCQlpZiAoY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkKKwkJCQljb250aW51ZTsKKwkJCXJlcXVlc3QtPmNoYW5uZWxzW2NvdW50XSA9IGNoYW47CisJCQljb3VudCsrOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChiYW5kID0gMDsgYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGJhbmQrKykgeworCQkJaWYgKCF3aXBoeS0+YmFuZHNbYmFuZF0pCisJCQkJY29udGludWU7CisJCQlmb3IgKGogPSAwOyBqIDwgd2lwaHktPmJhbmRzW2JhbmRdLT5uX2NoYW5uZWxzOworCQkJCWorKykgeworCQkJCWNoYW4gPSAmd2lwaHktPmJhbmRzW2JhbmRdLT5jaGFubmVsc1tqXTsKKwkJCQlpZiAoY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkKKwkJCQkJY29udGludWU7CisJCQkJcmVxdWVzdC0+Y2hhbm5lbHNbY291bnRdID0gY2hhbjsKKwkJCQljb3VudCsrOworCQkJfQorCQl9CisJfQorCisJaWYgKCFjb3VudCkKKwkJZ290byBlcnJvcjsKKworCXJlcXVlc3QtPm5fY2hhbm5lbHMgPSBjb3VudDsKKwljb3VudCA9IDA7CisJaWYgKHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fU1NJRFNdKSB7CisJCW5sYV9mb3JfZWFjaF9uZXN0ZWQoYXR0ciwgdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9TU0lEU10sCisJCQkJdG1wKSB7CisJCQlyZXF1ZXN0LT5zc2lkc1tjb3VudF0uc3NpZF9sZW4gPSBubGFfbGVuKGF0dHIpOworCQkJbWVtY3B5KHJlcXVlc3QtPnNzaWRzW2NvdW50XS5zc2lkLCBubGFfZGF0YShhdHRyKSwKKwkJCQkJbmxhX2xlbihhdHRyKSk7CisJCQljb3VudCsrOworCQl9CisJfQorCisJaWYgKHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fSUVdKSB7CisJCXJlcXVlc3QtPmllX2xlbiA9IG5sYV9sZW4odGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9JRV0pOworCQltZW1jcHkoKHZvaWQgKilyZXF1ZXN0LT5pZSwKKwkJCQlubGFfZGF0YSh0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX0lFXSksCisJCQkJcmVxdWVzdC0+aWVfbGVuKTsKKwl9CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBJRUVFODAyMTFfTlVNX0JBTkRTOyBjb3VudCsrKQorCQlpZiAod2lwaHktPmJhbmRzW2NvdW50XSkKKwkJCXJlcXVlc3QtPnJhdGVzW2NvdW50XSA9CisJCQkJKDEgPDwgd2lwaHktPmJhbmRzW2NvdW50XS0+bl9iaXRyYXRlcykgLSAxOworCisJaWYgKHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1NDQU5fU1VQUF9SQVRFU10pIHsKKwkJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLAorCQkJdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9TVVBQX1JBVEVTXSwKKwkJCXRtcCkgeworCQkJYmFuZCA9IG5sYV90eXBlKGF0dHIpOworCQkJaWYgKCF3aXBoeS0+YmFuZHNbYmFuZF0pCisJCQkJY29udGludWU7CisJCQlyZXF1ZXN0LT5yYXRlc1tiYW5kXSA9IHdsYW5faGRkX2dldF9yYXRlcyh3aXBoeSwKKwkJCQkJCQliYW5kLCBubGFfZGF0YShhdHRyKSwKKwkJCQkJCQlubGFfbGVuKGF0dHIpKTsKKwkJfQorCX0KKworCWlmICh0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX0ZMQUdTXSkgeworCQlyZXF1ZXN0LT5mbGFncyA9CisJCQlubGFfZ2V0X3UzMih0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TQ0FOX0ZMQUdTXSk7CisJCWlmICgocmVxdWVzdC0+ZmxhZ3MgJiBOTDgwMjExX1NDQU5fRkxBR19MT1dfUFJJT1JJVFkpICYmCisJCSEod2lwaHktPmZlYXR1cmVzICYgTkw4MDIxMV9GRUFUVVJFX0xPV19QUklPUklUWV9TQ0FOKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJMT1cgUFJJT1JJVFkgU0NBTiBub3Qgc3VwcG9ydGVkIikpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwlyZXF1ZXN0LT5ub19jY2sgPQorCQlubGFfZ2V0X2ZsYWcodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfU0NBTl9UWF9OT19DQ0tfUkFURV0pOworCXJlcXVlc3QtPndkZXYgPSB3ZGV2OworCXJlcXVlc3QtPndpcGh5ID0gd2lwaHk7CisJcmVxdWVzdC0+c2Nhbl9zdGFydCA9IGppZmZpZXM7CisKKwlpZiAoMCAhPSBfX3dsYW5faGRkX2NmZzgwMjExX3NjYW4od2lwaHksIHJlcXVlc3QsIFZFTkRPUl9TQ0FOKSkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IHdsYW5faGRkX3NlbmRfc2Nhbl9zdGFydF9ldmVudCh3aXBoeSwgd2RldiwgKHVpbnRwdHJfdClyZXF1ZXN0KTsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwloZGRfZXJyKCJTY2FuIFJlcXVlc3QgRmFpbGVkIik7CisJY2RmX21lbV9mcmVlKHJlcXVlc3QpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3ZlbmRvcl9zY2FuKCkgLUFQSSB0byBwcm9jZXNzIHZlbm9yIHNjYW4gcmVxdWVzdAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIHRvIG5ldCBkZXZpY2UKKyAqIEBkYXRhIDogUG9pbnRlciB0byB0aGUgZGF0YQorICogQGRhdGFfbGVuIDogbGVuZ3RoIG9mIHRoZSBkYXRhCisgKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSB1c2Vyc3BhY2UgdG8gcmVxdWVzdCBzY2FuLgorICoKKyAqIFJldHVybjogUmV0dXJuIHRoZSBTdWNjZXNzIG9yIEZhaWx1cmUgY29kZS4KKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3ZlbmRvcl9zY2FuKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIGNvbnN0IHZvaWQgKmRhdGEsCisJCWludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3ZlbmRvcl9zY2FuKHdpcGh5LCB3ZGV2LAorCQkJCQkgICAgICBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKy8qKgorICogd2xhbl9oZGRfc2Nhbl9hYm9ydCgpIC0gYWJvcnQgb25nb2luZyBzY2FuCisgKiBAcEFkYXB0ZXI6IFBvaW50ZXIgdG8gaW50ZXJmYWNlIGFkYXB0ZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KK2ludCB3bGFuX2hkZF9zY2FuX2Fib3J0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwloZGRfc2NhbmluZm9fdCAqcFNjYW5JbmZvID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHJjOworCisJcFNjYW5JbmZvID0gJnBBZGFwdGVyLT5zY2FuX2luZm87CisKKwlpZiAocFNjYW5JbmZvLT5tU2NhblBlbmRpbmcpIHsKKwkJSU5JVF9DT01QTEVUSU9OKHBTY2FuSW5mby0+YWJvcnRzY2FuX2V2ZW50X3Zhcik7CisJCWhkZF9hYm9ydF9tYWNfc2NhbihwSGRkQ3R4LCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCSAgIGVDU1JfU0NBTl9BQk9SVF9ERUZBVUxUKTsKKworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCSZwU2NhbkluZm8tPmFib3J0c2Nhbl9ldmVudF92YXIsCisJCQkJbXNlY3NfdG9famlmZmllcyg1MDAwKSk7CisJCWlmICghcmMpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJUaW1lb3V0IG9jY3VycmVkIHdoaWxlIHdhaXRpbmcgZm9yIGFib3J0IHNjYW4iKSk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9zY2hlZF9zY2FuX2NhbGxiYWNrIC0gc2NoZWR1bGVkIHNjYW4gY2FsbGJhY2sKKyAqIEBjYWxsYmFja0NvbnRleHQ6IENhbGxiYWNrIGNvbnRleHQKKyAqIEBwUHJlZk5ldHdvcmtGb3VuZEluZDogUHJlZmVycmVkIG5ldHdvcmsgZm91bmQgaW5kaWNhdGlvbgorICoKKyAqIFRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHJlZ2lzdGVyZCB3aXRoIFNNRSB0aGF0IGlzCisgKiBpbnZva2VkIHdoZW4gYSBwcmVmZXJyZWQgbmV0d29yayBpcyBkaXNjb3ZlcmVkIGJ5IGZpcm13YXJlLgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAoraGRkX3NjaGVkX3NjYW5fY2FsbGJhY2sodm9pZCAqY2FsbGJhY2tDb250ZXh0LAorCQkJdFNpclByZWZOZXR3b3JrRm91bmRJbmQgKnBQcmVmTmV0d29ya0ZvdW5kSW5kKQoreworCWludCByZXQ7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCAqKSBjYWxsYmFja0NvbnRleHQ7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKworCUVOVEVSKCk7CisKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBhZGFwdGVyIGlzIE51bGwiKSk7CisJCXJldHVybjsKKwl9CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJaWYgKE5VTEwgPT0gcEhkZEN0eCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIE51bGwhISEiKSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2soJnBIZGRDdHgtPnNjaGVkU2Nhbl9sb2NrKTsKKwlpZiAodHJ1ZSA9PSBwSGRkQ3R4LT5pc1dpcGh5U3VzcGVuZGVkKSB7CisJCXBIZGRDdHgtPmlzU2NoZWRTY2FuVXBkYXRlUGVuZGluZyA9IHRydWU7CisJCXNwaW5fdW5sb2NrKCZwSGRkQ3R4LT5zY2hlZFNjYW5fbG9jayk7CisJCWhkZExvZyhMT0cxLAorCQkgICAgICAgRkwoIlVwZGF0ZSBjZmc4MDIxMSBzY2FuIGRhdGFiYXNlIGFmdGVyIGl0IHJlc3VtZSIpKTsKKwkJcmV0dXJuOworCX0KKwlzcGluX3VubG9jaygmcEhkZEN0eC0+c2NoZWRTY2FuX2xvY2spOworCisJcmV0ID0gd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2JzcyhwSGRkQ3R4LT53aXBoeSwgcEFkYXB0ZXIsIDApOworCisJaWYgKDAgPiByZXQpCisJCWhkZExvZyhMT0cxLCBGTCgiTk8gU0NBTiByZXN1bHQiKSk7CisKKwljZmc4MDIxMV9zY2hlZF9zY2FuX3Jlc3VsdHMocEhkZEN0eC0+d2lwaHkpOworCWhkZExvZyhMT0cxLAorCQlGTCgiY2ZnODAyMTEgc2NhbiByZXN1bHQgZGF0YWJhc2UgdXBkYXRlZCIpKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9pc19wbm9fYWxsb3dlZCgpIC0gIENoZWNrIGlmIFBOTyBpcyBhbGxvd2VkCisgKiBAYWRhcHRlcjogSEREIERldmljZSBBZGFwdGVyCisgKgorICogVGhlIFBOTyBTdGFydCByZXF1ZXN0IGlzIGNvbWluZyBmcm9tIHVwcGVyIGxheWVycy4KKyAqIEl0IGlzIHRvIGJlIGFsbG93ZWQgb25seSBmb3IgSW5mcmEgU1RBIGRldmljZSB0eXBlCisgKiBhbmQgdGhlIGxpbmsgc2hvdWxkIGJlIGluIGEgZGlzY29ubmVjdGVkIHN0YXRlLgorICoKKyAqIFJldHVybjogU3VjY2VzcyBpZiBQTk8gaXMgYWxsb3dlZCwgRmFpbHVyZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdsYW5faGRkX2lzX3Bub19hbGxvd2VkKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJaGRkTG9nKExPRzEsCisJCUZMKCJkZXZfbW9kZT0lZCwgY29ubl9zdGF0ZT0lZCwgc2Vzc2lvbiBJRD0lZCIpLAorCQlhZGFwdGVyLT5kZXZpY2VfbW9kZSwKKwkJYWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLmNvbm5faW5mby5jb25uU3RhdGUsCisJCWFkYXB0ZXItPnNlc3Npb25JZCk7CisJaWYgKChhZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKSAmJgorCQkoZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQgPT0KKwkJIGFkYXB0ZXItPnNlc3Npb25DdHguc3RhdGlvbi5jb25uX2luZm8uY29ublN0YXRlKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwllbHNlCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfc2NoZWRfc2Nhbl9zdGFydCgpIC0gY2ZnODAyMTEgc2NoZWR1bGVkIHNjYW4ocG5vKSBzdGFydAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIG5ldHdvcmsgZGV2aWNlCisgKiBAcmVxdWVzdDogUG9pbnRlciB0byBjZmc4MDIxMSBzY2hlZHVsZWQgc2NhbiBzdGFydCByZXF1ZXN0CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfc2NoZWRfc2Nhbl9zdGFydChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdAorCQkJCQkJY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0CisJCQkJCQkqcmVxdWVzdCkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXRwU2lyUE5PU2NhblJlcSBwUG5vUmVxdWVzdCA9IE5VTEw7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwl0SGFsSGFuZGxlIGhIYWw7CisJdWludDMyX3QgaSwgaW5keCwgbnVtX2NoLCB0ZW1wSW50ZXJ2YWwsIGo7CisJdTggdmFsaWRfY2hbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXSA9IHsgMCB9OworCXU4IGNoYW5uZWxzX2FsbG93ZWRbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXSA9IHsgMCB9OworCXVpbnQzMl90IG51bV9jaGFubmVsc19hbGxvd2VkID0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJaW50IHJldCA9IDA7CisJaGRkX3NjYW5pbmZvX3QgKnBTY2FuSW5mbyA9ICZwQWRhcHRlci0+c2Nhbl9pbmZvOworCXN0cnVjdCBoZGRfY29uZmlnICpjb25maWcgPSBOVUxMOworCXVpbnQzMl90IG51bV9pZ25vcmVfZGZzX2NoID0gMDsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSByZXQpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJY29uZmlnID0gcEhkZEN0eC0+Y29uZmlnOworCWhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJaWYgKE5VTEwgPT0gaEhhbCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhBTCBjb250ZXh0ICBpcyBOdWxsISEhIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSAmJgorCSAgICAoZUNvbm5lY3Rpb25TdGF0ZV9Db25uZWN0aW5nID09CisJICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uY29ublN0YXRlKSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCIlcCglZCkgQ29ubmVjdGlvbiBpbiBwcm9ncmVzczogc2NoZWRfc2Nhbl9zdGFydCBkZW5pZWQgKEVCVVNZKSIpLAorCQkgICAgICAgV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlciksCisJCSAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKgorCSAqIFRoZSBjdXJyZW50IHVtYWMgaXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUgU0NBTl9QUkVFTVBUIGFuZCBTQ0FOX0RFUVVFVUVECisJICogc28gaXRzIG5lY2Vzc2FyeSB0byB0ZXJtaW5hdGUgdGhlIGV4aXN0aW5nIHNjYW4gd2hpY2ggaXMgYWxyZWFkeSBpc3N1ZWQKKwkgKiBvdGhlcndpc2UgdGhlIGhvc3Qgd29uJ3QgZW50ZXIgaW50byB0aGUgc3VzcGVuZCBzdGF0ZSBkdWUgdG8gdGhlIHJlYXNvbgorCSAqIHRoYXQgdGhlIHdsYW4gd2FrZWxvY2sgd2hpY2ggd2FzIGhlbGQgaW4gdGhlIHdsYW5faGRkX2NmZzgwMjExX3NjYW4KKwkgKiBmdW5jdGlvbi4KKwkgKi8KKwlzbWVfc2Nhbl9mbHVzaF9yZXN1bHQoaEhhbCk7CisJaWYgKHRydWUgPT0gcFNjYW5JbmZvLT5tU2NhblBlbmRpbmcpIHsKKwkJcmV0ID0gd2xhbl9oZGRfc2Nhbl9hYm9ydChwQWRhcHRlcik7CisJCWlmIChyZXQgPCAwKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQkgIEZMKCJhYm9ydGluZyB0aGUgZXhpc3Rpbmcgc2NhbiBpcyB1bnN1Y2Nlc3NmdWwiKSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJaWYgKENERl9TVEFUVVNfRV9GQUlMVVJFID09IHdsYW5faGRkX2lzX3Bub19hbGxvd2VkKHBBZGFwdGVyKSkgeworCQloZGRMb2coTE9HRSwgRkwoInBubyBpcyBub3QgYWxsb3dlZCIpKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlwUG5vUmVxdWVzdCA9ICh0cFNpclBOT1NjYW5SZXEpIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyUE5PU2NhblJlcSkpOworCWlmIChOVUxMID09IHBQbm9SZXF1ZXN0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQocFBub1JlcXVlc3QsIDAsIHNpemVvZih0U2lyUE5PU2NhblJlcSkpOworCXBQbm9SZXF1ZXN0LT5lbmFibGUgPSAxOyAgICAgICAgLypFbmFibGUgUE5PICovCisJcFBub1JlcXVlc3QtPnVjTmV0d29ya3NDb3VudCA9IHJlcXVlc3QtPm5fbWF0Y2hfc2V0czsKKworCWlmICgoIXBQbm9SZXF1ZXN0LT51Y05ldHdvcmtzQ291bnQpIHx8CisJICAgIChwUG5vUmVxdWVzdC0+dWNOZXR3b3Jrc0NvdW50ID4gU0lSX1BOT19NQVhfU1VQUF9ORVRXT1JLUykpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJOZXR3b3JrIGlucHV0IGlzIG5vdCBjb3JyZWN0ICVkIiksCisJCQlwUG5vUmVxdWVzdC0+dWNOZXR3b3Jrc0NvdW50KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoU0lSX1BOT19NQVhfTkVUV19DSEFOTkVMU19FWCA8IHJlcXVlc3QtPm5fY2hhbm5lbHMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbmNvcnJlY3QgbnVtYmVyIG9mIGNoYW5uZWxzICVkIiksCisJCQlyZXF1ZXN0LT5uX2NoYW5uZWxzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBGcmFtZXdvcmsgcHJvdmlkZXMgb25lIHNldCBvZiBjaGFubmVscyhhbGwpCisJICogY29tbW9uIGZvciBhbGwgc2F2ZWQgcHJvZmlsZSAqLworCWlmICgwICE9IHNtZV9jZmdfZ2V0X3N0cihoSGFsLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCwKKwkJCQkgY2hhbm5lbHNfYWxsb3dlZCwgJm51bV9jaGFubmVsc19hbGxvd2VkKSkgeworCQloZGRMb2coTE9HRSwKKwkJCSBGTCgiZmFpbGVkIHRvIGdldCB2YWxpZCBjaGFubmVsIGxpc3QiKSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIENoZWNraW5nIGVhY2ggY2hhbm5lbCBhZ2FpbnN0IGFsbG93ZWQgY2hhbm5lbCBsaXN0ICovCisJbnVtX2NoID0gMDsKKwlpZiAocmVxdWVzdC0+bl9jaGFubmVscykgeworCQljaGFyIGNoTGlzdFsocmVxdWVzdC0+bl9jaGFubmVscyAqIDUpICsgMV07CisJCWludCBsZW47CisJCWZvciAoaSA9IDAsIGxlbiA9IDA7IGkgPCByZXF1ZXN0LT5uX2NoYW5uZWxzOyBpKyspIHsKKwkJCWZvciAoaW5keCA9IDA7IGluZHggPCBudW1fY2hhbm5lbHNfYWxsb3dlZDsgaW5keCsrKSB7CisJCQkJaWYgKHJlcXVlc3QtPmNoYW5uZWxzW2ldLT5od192YWx1ZSA9PQorCQkJCSAgICBjaGFubmVsc19hbGxvd2VkW2luZHhdKSB7CisKKwkJCQkJaWYgKCghY29uZmlnLT5lbmFibGVfZGZzX3Bub19jaG5sX3NjYW4pCisJCQkJCQkmJiAoQ0hBTk5FTF9TVEFURV9ERlMgPT0KKwkJCQkJCWNkc19nZXRfY2hhbm5lbF9zdGF0ZSgKKwkJCQkJCSAgICBjaGFubmVsc19hbGxvd2VkW2luZHhdKSkpIHsKKwkJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJCSAgICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJCSAgICAiJXMgOiBEcm9wcGluZyBERlMgY2hhbm5lbCA6ICVkIiwKKwkJCQkJCSAgICAgX19mdW5jX18sCisJCQkJCQkgICAgY2hhbm5lbHNfYWxsb3dlZFtpbmR4XSk7CisJCQkJCQludW1faWdub3JlX2Rmc19jaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQl2YWxpZF9jaFtudW1fY2grK10gPQorCQkJCQkJcmVxdWVzdC0+Y2hhbm5lbHNbaV0tPmh3X3ZhbHVlOworCQkJCQlsZW4gKz0KKwkJCQkJCXNucHJpbnRmKGNoTGlzdCArIGxlbiwgNSwgIiVkICIsCisJCQkJCQkJIHJlcXVlc3QtPmNoYW5uZWxzW2ldLT4KKwkJCQkJCQkgaHdfdmFsdWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaGRkTG9nKExPRzEsIEZMKCJDaGFubmVsLUxpc3Q6ICVzICIpLCBjaExpc3QpOworCisJCS8qIElmIGFsbCBjaGFubmVscyBhcmUgREZTIGFuZCBkcm9wcGVkLAorCQkgKiB0aGVuIGlnbm9yZSB0aGUgUE5PIHJlcXVlc3QKKwkJICovCisJCWlmIChudW1faWdub3JlX2Rmc19jaCA9PSByZXF1ZXN0LT5uX2NoYW5uZWxzKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSIlcyA6IEFsbCByZXF1ZXN0ZWQgY2hhbm5lbHMgYXJlIERGUyBjaGFubmVscyIsCisJCQkJIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwl9CisJLyogRmlsbGluZyBwZXIgcHJvZmlsZSAgcGFyYW1zICovCisJZm9yIChpID0gMDsgaSA8IHBQbm9SZXF1ZXN0LT51Y05ldHdvcmtzQ291bnQ7IGkrKykgeworCQlwUG5vUmVxdWVzdC0+YU5ldHdvcmtzW2ldLnNzSWQubGVuZ3RoID0KKwkJCXJlcXVlc3QtPm1hdGNoX3NldHNbaV0uc3NpZC5zc2lkX2xlbjsKKworCQlpZiAoKDAgPT0gcFBub1JlcXVlc3QtPmFOZXR3b3Jrc1tpXS5zc0lkLmxlbmd0aCkgfHwKKwkJICAgIChwUG5vUmVxdWVzdC0+YU5ldHdvcmtzW2ldLnNzSWQubGVuZ3RoID4gMzIpKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCQlGTCgiIFNTSUQgTGVuICVkIGlzIG5vdCBjb3JyZWN0IGZvciBuZXR3b3JrICVkIiksCisJCQkJICBwUG5vUmVxdWVzdC0+YU5ldHdvcmtzW2ldLnNzSWQubGVuZ3RoLCBpKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJbWVtY3B5KHBQbm9SZXF1ZXN0LT5hTmV0d29ya3NbaV0uc3NJZC5zc0lkLAorCQkgICAgICAgcmVxdWVzdC0+bWF0Y2hfc2V0c1tpXS5zc2lkLnNzaWQsCisJCSAgICAgICByZXF1ZXN0LT5tYXRjaF9zZXRzW2ldLnNzaWQuc3NpZF9sZW4pOworCQlwUG5vUmVxdWVzdC0+YU5ldHdvcmtzW2ldLmF1dGhlbnRpY2F0aW9uID0gMDsgICAvKmVBVVRIX1RZUEVfQU5ZICovCisJCXBQbm9SZXF1ZXN0LT5hTmV0d29ya3NbaV0uZW5jcnlwdGlvbiA9IDA7ICAgICAgIC8qZUVEX0FOWSAqLworCQlwUG5vUmVxdWVzdC0+YU5ldHdvcmtzW2ldLmJjYXN0TmV0d1R5cGUgPSAwOyAgICAvKmVCQ0FTVF9VTktOT1dOICovCisKKwkJLypDb3B5aW5nIGxpc3Qgb2YgdmFsaWQgY2hhbm5lbCBpbnRvIHJlcXVlc3QgKi8KKwkJbWVtY3B5KHBQbm9SZXF1ZXN0LT5hTmV0d29ya3NbaV0uYUNoYW5uZWxzLCB2YWxpZF9jaCwgbnVtX2NoKTsKKwkJcFBub1JlcXVlc3QtPmFOZXR3b3Jrc1tpXS51Y0NoYW5uZWxDb3VudCA9IG51bV9jaDsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTAsIDApCisJCXBQbm9SZXF1ZXN0LT5hTmV0d29ya3NbaV0ucnNzaVRocmVzaG9sZCA9CisJCQlyZXF1ZXN0LT5tYXRjaF9zZXRzW2ldLnJzc2lfdGhvbGQ7CisjZWxzZQorCQlwUG5vUmVxdWVzdC0+YU5ldHdvcmtzW2ldLnJzc2lUaHJlc2hvbGQgPSAwOyAgICAvKiBEZWZhdWx0IHZhbHVlICovCisjZW5kaWYKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdC0+bl9zc2lkczsgaSsrKSB7CisJCWogPSAwOworCQl3aGlsZSAoaiA8IHBQbm9SZXF1ZXN0LT51Y05ldHdvcmtzQ291bnQpIHsKKwkJCWlmICgocFBub1JlcXVlc3QtPmFOZXR3b3Jrc1tqXS5zc0lkLmxlbmd0aCA9PQorCQkJICAgICByZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbikgJiYKKwkJCSAgICAoMCA9PSBtZW1jbXAocFBub1JlcXVlc3QtPmFOZXR3b3Jrc1tqXS5zc0lkLnNzSWQsCisJCQkJCSByZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLAorCQkJCQkgcFBub1JlcXVlc3QtPmFOZXR3b3Jrc1tqXS5zc0lkLgorCQkJCQkgbGVuZ3RoKSkpIHsKKwkJCQlwUG5vUmVxdWVzdC0+YU5ldHdvcmtzW2pdLmJjYXN0TmV0d1R5cGUgPQorCQkJCQllQkNBU1RfSElEREVOOworCQkJCWJyZWFrOworCQkJfQorCQkJaisrOworCQl9CisJfQorCWhkZExvZyhMT0cxLCBGTCgiTnVtYmVyIG9mIGhpZGRlbiBuZXR3b3JrcyBiZWluZyBDb25maWd1cmVkID0gJWQiKSwKKwkJICByZXF1ZXN0LT5uX3NzaWRzKTsKKworCWhkZExvZyhMT0cxLCBGTCgicmVxdWVzdC0+aWVfbGVuID0gJXp1IiksIHJlcXVlc3QtPmllX2xlbik7CisJaWYgKCgwIDwgcmVxdWVzdC0+aWVfbGVuKSAmJiAoTlVMTCAhPSByZXF1ZXN0LT5pZSkpIHsKKwkJcFBub1JlcXVlc3QtPnVzMjRHUHJvYmVUZW1wbGF0ZUxlbiA9IHJlcXVlc3QtPmllX2xlbjsKKwkJbWVtY3B5KCZwUG5vUmVxdWVzdC0+cDI0R1Byb2JlVGVtcGxhdGUsIHJlcXVlc3QtPmllLAorCQkgICAgICAgcFBub1JlcXVlc3QtPnVzMjRHUHJvYmVUZW1wbGF0ZUxlbik7CisKKwkJcFBub1JlcXVlc3QtPnVzNUdQcm9iZVRlbXBsYXRlTGVuID0gcmVxdWVzdC0+aWVfbGVuOworCQltZW1jcHkoJnBQbm9SZXF1ZXN0LT5wNUdQcm9iZVRlbXBsYXRlLCByZXF1ZXN0LT5pZSwKKwkJICAgICAgIHBQbm9SZXF1ZXN0LT51czVHUHJvYmVUZW1wbGF0ZUxlbik7CisJfQorCisJLyogRHJpdmVyIGdldHMgb25seSBvbmUgdGltZSBpbnRlcnZhbCB3aGljaCBpcyBoYXJkY29kZWQgaW4KKwkgKiBzdXBwbGljYW50IGZvciAxMDAwMG1zLiBUYWtpbmcgcG93ZXIgY29uc3VtcHRpb24gaW50byBhY2NvdW50IDYgdGltZXJzCisJICogd2lsbCBiZSB1c2VkLCBUaW1lcnZhbHVlIGlzIGluY3JlYXNlZCBleHBvbmVudGlhbGx5IGkuZSAxMCwyMCw0MCwKKwkgKiA4MCwxNjAsMzIwIHNlY3MuIEFuZCBudW1iZXIgb2Ygc2NhbiBjeWNsZSBmb3IgZWFjaCB0aW1lcgorCSAqIGlzIGNvbmZpZ3VyYWJsZSB0aHJvdWdoIElOSSBwYXJhbSBnUE5PU2NhblRpbWVyUmVwZWF0VmFsdWUuCisJICogSWYgaXQgaXMgc2V0IHRvIDAgb25seSBvbmUgdGltZXIgd2lsbCBiZSB1c2VkIGFuZCBQTk8gc2NhbiBjeWNsZQorCSAqIHdpbGwgYmUgcmVwZWF0ZWQgYWZ0ZXIgZWFjaCBpbnRlcnZhbCBzcGVjaWZpZWQgYnkgc3VwcGxpY2FudAorCSAqIHRpbGwgUE5PIGlzIGRpc2FibGVkLgorCSAqLworCWlmICgwID09IHBIZGRDdHgtPmNvbmZpZy0+Y29uZmlnUE5PU2NhblRpbWVyUmVwZWF0VmFsdWUpCisJCXBQbm9SZXF1ZXN0LT5zY2FuVGltZXJzLnVjU2NhblRpbWVyc0NvdW50ID0KKwkJCUhERF9QTk9fU0NBTl9USU1FUlNfU0VUX09ORTsKKwllbHNlCisJCXBQbm9SZXF1ZXN0LT5zY2FuVGltZXJzLnVjU2NhblRpbWVyc0NvdW50ID0KKwkJCUhERF9QTk9fU0NBTl9USU1FUlNfU0VUX01VTFRJUExFOworCisJdGVtcEludGVydmFsID0gKHJlcXVlc3QtPmludGVydmFsKSAvIDEwMDA7CisJaGRkTG9nKExPRzEsCisJCUZMKCJCYXNlIHNjYW4gaW50ZXJ2YWwgPSAlZCBQTk9TY2FuVGltZXJSZXBlYXRWYWx1ZSA9ICVkIiksCisJCXRlbXBJbnRlcnZhbCwgcEhkZEN0eC0+Y29uZmlnLT5jb25maWdQTk9TY2FuVGltZXJSZXBlYXRWYWx1ZSk7CisJZm9yIChpID0gMDsgaSA8IHBQbm9SZXF1ZXN0LT5zY2FuVGltZXJzLnVjU2NhblRpbWVyc0NvdW50OyBpKyspIHsKKwkJcFBub1JlcXVlc3QtPnNjYW5UaW1lcnMuYVRpbWVyVmFsdWVzW2ldLnVUaW1lclJlcGVhdCA9CisJCQlwSGRkQ3R4LT5jb25maWctPmNvbmZpZ1BOT1NjYW5UaW1lclJlcGVhdFZhbHVlOworCQlwUG5vUmVxdWVzdC0+c2NhblRpbWVycy5hVGltZXJWYWx1ZXNbaV0udVRpbWVyVmFsdWUgPQorCQkJdGVtcEludGVydmFsOworCQl0ZW1wSW50ZXJ2YWwgKj0gMjsKKwl9CisJLyogUmVwZWF0IGxhc3QgdGltZXIgdW50aWwgcG5vIGRpc2FibGVkLiAqLworCXBQbm9SZXF1ZXN0LT5zY2FuVGltZXJzLmFUaW1lclZhbHVlc1tpIC0gMV0udVRpbWVyUmVwZWF0ID0gMDsKKworCXBQbm9SZXF1ZXN0LT5tb2RlUE5PID0gU0lSX1BOT19NT0RFX0lNTUVESUFURTsKKworCWhkZExvZyhMT0cxLAorCQlGTCgiU2Vzc2lvbklkICVkLCBlbmFibGUgJWQsIG1vZGVQTk8gJWQsIHVjU2NhblRpbWVyc0NvdW50ICVkIiksCisJCXBBZGFwdGVyLT5zZXNzaW9uSWQsIHBQbm9SZXF1ZXN0LT5lbmFibGUsCisJCXBQbm9SZXF1ZXN0LT5tb2RlUE5PLAorCQlwUG5vUmVxdWVzdC0+c2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudCk7CisKKwlzdGF0dXMgPSBzbWVfc2V0X3ByZWZlcnJlZF9uZXR3b3JrX2xpc3QoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCQkJcFBub1JlcXVlc3QsCisJCQkJCQlwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJaGRkX3NjaGVkX3NjYW5fY2FsbGJhY2ssCisJCQkJCQlwQWRhcHRlcik7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gZW5hYmxlIFBOTyIpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwloZGRMb2coTE9HMSwgRkwoIlBOTyBzY2FuUmVxdWVzdCBvZmZsb2FkZWQiKSk7CisKK2Vycm9yOgorCWNkZl9tZW1fZnJlZShwUG5vUmVxdWVzdCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zY2hlZF9zY2FuX3N0YXJ0KCkgLSBjZmc4MDIxMSBzY2hlZHVsZWQgc2Nhbihwbm8pIHN0YXJ0CisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgbmV0d29yayBkZXZpY2UKKyAqIEByZXF1ZXN0OiBQb2ludGVyIHRvIGNmZzgwMjExIHNjaGVkdWxlZCBzY2FuIHN0YXJ0IHJlcXVlc3QKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zY2hlZF9zY2FuX3N0YXJ0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2hlZF9zY2FuX3JlcXVlc3QKKwkJCQkgICAgICAgKnJlcXVlc3QpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9zY2hlZF9zY2FuX3N0YXJ0KHdpcGh5LCBkZXYsIHJlcXVlc3QpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9zY2hlZF9zY2FuX3N0b3AoKSAtIHN0b3AgY2ZnODAyMTEgc2NoZWR1bGVkIHNjYW4ocG5vKQorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAZGV2OiBQb2ludGVyIG5ldHdvcmsgZGV2aWNlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfc2NoZWRfc2Nhbl9zdG9wKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCXRIYWxIYW5kbGUgaEhhbDsKKwl0cFNpclBOT1NjYW5SZXEgcFBub1JlcXVlc3QgPSBOVUxMOworCWludCByZXQgPSAwOworCisJRU5URVIoKTsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisJaWYgKE5VTEwgPT0gcEhkZEN0eCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIE51bGwiKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFRoZSByZXR1cm4gMCBpcyBpbnRlbnRpb25hbCB3aGVuIGlzTG9ncEluUHJvZ3Jlc3MgYW5kCisJICogaXNMb2FkVW5sb2FkSW5Qcm9ncmVzcy4gV2UgZGlkIG9ic2VydmUgYSBjcmFzaCBkdWUgdG8gYSByZXR1cm4gb2YKKwkgKiBmYWlsdXJlIGluIHNjaGVkX3NjYW5fc3RvcCAsIGVzcGVjaWFsbHkgZm9yIGEgY2FzZSB3aGVyZSB0aGUgdW5sb2FkCisJICogb2YgdGhlIGhhcHBlbnMgYXQgdGhlIHNhbWUgdGltZS4gVGhlIGZ1bmN0aW9uIF9fY2ZnODAyMTFfc3RvcF9zY2hlZF9zY2FuCisJICogd2FzIGNsZWFyaW5nIHJkZXYtPnNjaGVkX3NjYW5fcmVxIG9ubHkgd2hlbiB0aGUgc2NoZWRfc2Nhbl9zdG9wIHJldHVybnMKKwkgKiBzdWNjZXNzLiBJZiBpdCByZXR1cm5zIGEgZmFpbHVyZSAsIHRoZW4gaXRzIG5leHQgaW52b2NhdGlvbiBkdWUgdG8gdGhlCisJICogY2xlYW4gdXAgb2YgdGhlIHNlY29uZCBpbnRlcmZhY2Ugd2lsbCBoYXZlIHRoZSBkZXYgcG9pbnRlciBjb3JyZXNwb25kaW5nCisJICogdG8gdGhlIGZpcnN0IG9uZSBsZWFkaW5nIHRvIGEgY3Jhc2guCisJICovCisJaWYgKHBIZGRDdHgtPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKChwSGRkQ3R4LT5pc0xvYWRJblByb2dyZXNzKSB8fCAocEhkZEN0eC0+aXNVbmxvYWRJblByb2dyZXNzKSkgeworCQloZGRMb2coTE9HRSwgRkwoIlVubG9hZGluZy9Mb2FkaW5nIGluIFByb2dyZXNzLiBJZ25vcmUhISEiKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiIEhBTCBjb250ZXh0ICBpcyBOdWxsISEhIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwUG5vUmVxdWVzdCA9ICh0cFNpclBOT1NjYW5SZXEpIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyUE5PU2NhblJlcSkpOworCWlmIChOVUxMID09IHBQbm9SZXF1ZXN0KSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQocFBub1JlcXVlc3QsIDAsIHNpemVvZih0U2lyUE5PU2NhblJlcSkpOworCXBQbm9SZXF1ZXN0LT5lbmFibGUgPSAwOyAgICAgICAgLyogRGlzYWJsZSBQTk8gKi8KKwlwUG5vUmVxdWVzdC0+dWNOZXR3b3Jrc0NvdW50ID0gMDsKKworCXN0YXR1cyA9IHNtZV9zZXRfcHJlZmVycmVkX25ldHdvcmtfbGlzdChoSGFsLCBwUG5vUmVxdWVzdCwKKwkJCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQlOVUxMLCBwQWRhcHRlcik7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gZGlzYWJsZWQgUE5PIikpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWhkZExvZyhMT0cxLCBGTCgiUE5PIHNjYW4gZGlzYWJsZWQiKSk7CisKKwljZGZfbWVtX2ZyZWUocFBub1JlcXVlc3QpOworCisJRVhJVCgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc2NoZWRfc2Nhbl9zdG9wKCkgLSBzdG9wIGNmZzgwMjExIHNjaGVkdWxlZCBzY2FuKHBubykKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciBuZXR3b3JrIGRldmljZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3NjaGVkX3NjYW5fc3RvcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9zY2hlZF9zY2FuX3N0b3Aod2lwaHksIGRldik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKkZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCisvKioKKyAqIGhkZF92ZW5kb3JfcHV0X2lmaW5kZXgoKSAtc2VuZCBpbnRlcmZhY2UgaW5kZXgKKyAqIEBza2I6IGJ1ZmZlciBwb2ludGVyCisgKiBAaWZpbmRleDogaW50ZXJmYWNlIGluZGV4CisgKgorICogU2VuZCB0aGUgSUYgaW5kZXggdG8gZGlmZmVyZW50aWF0ZSB0aGUgZXZlbnRzIG9uIGVhY2ggaW50ZXJmYWNlCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCBoZGRfdmVuZG9yX3B1dF9pZmluZGV4KHN0cnVjdCBza19idWZmICpza2IsIGludCBpZmluZGV4KQoreworCXN0cnVjdCBubGF0dHIgKmF0dHI7CisKKwlubGFfbmVzdF9jYW5jZWwoc2tiLCAoKHZvaWQgKiopc2tiLT5jYilbMl0pOworCWlmIChubGFfcHV0X3UzMihza2IsIE5MODAyMTFfQVRUUl9JRklOREVYLCBpZmluZGV4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhdHRyID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBOTDgwMjExX0FUVFJfVkVORE9SX0RBVEEpOworCSgodm9pZCAqKilza2ItPmNiKVsyXSA9IGF0dHI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9zY2FuLmggYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfc2Nhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZWYwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfc2Nhbi5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBET0MgOiB3bGFuX2hkZF9zY2FuLmgKKyAqCisgKiBXTEFOIEhvc3QgRGV2aWNlIERyaXZlciBzY2FuIHJlbGF0ZWQgaW1wbGVtZW50YXRpb24KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFdMQU5fSEREX1NDQU5fSCkKKyNkZWZpbmUgV0xBTl9IRERfU0NBTl9ICisKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisKKyNkZWZpbmUgTUFYX1BFTkRJTkdfTE9HIDUKKworLyoKKyAqIGVudW0gc2Nhbl9zb3VyY2UgLSBzY2FuIHJlcXVlc3Qgc291cmNlCisgKgorICogQE5MX1NDQU46IFNjYW4gaW5pdGlhdGVkIGZyb20gTkwKKyAqIEBWRU5ET1JfU0NBTjogU2NhbiBpbnRpYXRlZCBmcm9tIHZlbmRvciBjb21tYW5kCisqLworZW51bSBzY2FuX3NvdXJjZSB7CisJTkxfU0NBTiwKKwlWRU5ET1JfU0NBTiwKK307CisKK2ludCBpd19nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2ludCBpd19zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zY2FuKHN0cnVjdCB3aXBoeSAqd2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyNlbmRpZgorCQkJICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zY2hlZF9zY2FuX3N0YXJ0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2hlZF9zY2FuX3JlcXVlc3QKKwkJCQkgICAgICAgKnJlcXVlc3QpOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2NoZWRfc2Nhbl9zdG9wKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYgLyogRW5kIG9mIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdmVuZG9yX3NjYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJaW50IGRhdGFfbGVuKTsKKworaW50IGhkZF92ZW5kb3JfcHV0X2lmaW5kZXgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlmaW5kZXgpOworI2VuZGlmIC8qIGVuZCAjaWYgIWRlZmluZWQoV0xBTl9IRERfU0NBTl9IKSAqLworCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfc29mdGFwX3R4X3J4LmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfc29mdGFwX3R4X3J4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyNmNhMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9zb2Z0YXBfdHhfcnguYwpAQCAtMCwwICsxLDk0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyogSW5jbHVkZSBmaWxlcyAqLworI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3R4X3J4Lmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfc29mdGFwX3R4X3J4Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmlfZ2xvYmFsLmg+CisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgorI2luY2x1ZGUgPGNkc19zY2hlZC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX25hcGkuaD4KKworI2lmZGVmIElQQV9PRkZMT0FECisjaW5jbHVkZSA8d2xhbl9oZGRfaXBhLmg+CisjZW5kaWYKKworLyogUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMgKi8KKyN1bmRlZiBRQ0FfSEREX1NBUF9EVU1QX1NLX0JVRkYKKworLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworLyogRnVuY3Rpb24gZGVmaW5pdGlvbnMgYW5kIGRvY3VtZW5hdGlvbiAqLworI2lmZGVmIFFDQV9IRERfU0FQX0RVTVBfU0tfQlVGRgorLyoqCisgKiBoZGRfc29mdGFwX2R1bXBfc2tfYnVmZigpIC0gRHVtcCBhbiBza2IKKyAqIEBza2I6IHNrYiB0byBkdW1wCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9zb2Z0YXBfZHVtcF9za19idWZmKHN0cnVjdCBza19idWZmICpza2IpCit7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX1NBUF9EQVRBLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIiVzOiBoZWFkID0gJXAgIiwgX19mdW5jX18sIHNrYi0+aGVhZCk7CisJLyogQ0RGX1RSQUNFKCBDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogZGF0YSA9ICVwICIsIF9fZnVuY19fLCBza2ItPmRhdGEpOyAqLworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICIlczogdGFpbCA9ICVwICIsIF9fZnVuY19fLCBza2ItPnRhaWwpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICIlczogZW5kID0gJXAgIiwgX19mdW5jX18sIHNrYi0+ZW5kKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiJXM6IGxlbiA9ICVkICIsIF9fZnVuY19fLCBza2ItPmxlbik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX1NBUF9EQVRBLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIiVzOiBkYXRhX2xlbiA9ICVkICIsIF9fZnVuY19fLCBza2ItPmRhdGFfbGVuKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiJXM6IG1hY19sZW4gPSAlZCIsIF9fZnVuY19fLCBza2ItPm1hY19sZW4pOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX1NBUF9EQVRBLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIjB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAiLCBza2ItPmRhdGFbMF0sCisJCSAgc2tiLT5kYXRhWzFdLCBza2ItPmRhdGFbMl0sIHNrYi0+ZGF0YVszXSwgc2tiLT5kYXRhWzRdLAorCQkgIHNrYi0+ZGF0YVs1XSwgc2tiLT5kYXRhWzZdLCBza2ItPmRhdGFbN10pOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICIweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXgiLCBza2ItPmRhdGFbOF0sCisJCSAgc2tiLT5kYXRhWzldLCBza2ItPmRhdGFbMTBdLCBza2ItPmRhdGFbMTFdLCBza2ItPmRhdGFbMTJdLAorCQkgIHNrYi0+ZGF0YVsxM10sIHNrYi0+ZGF0YVsxNF0sIHNrYi0+ZGF0YVsxNV0pOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGhkZF9zb2Z0YXBfZHVtcF9za19idWZmKHN0cnVjdCBza19idWZmICpza2IpCit7Cit9CisjZW5kaWYKKworI2lmZGVmIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MCisvKioKKyAqIGhkZF9zb2Z0YXBfdHhfcmVzdW1lX3RpbWVyX2V4cGlyZWRfaGFuZGxlcigpIC0gVFggUSByZXN1bWUgdGltZXIgaGFuZGxlcgorICogQGFkYXB0ZXJfY29udGV4dDogcG9pbnRlciB0byB2ZGV2IGFkYXB0ZXIKKyAqCisgKiBUWCBRIHJlc3VtZSB0aW1lciBoYW5kbGVyIGZvciBTQVAgYW5kIFAyUCBHTyBpbnRlcmZhY2UuICBJZiBCbG9ja2VkCisgKiBPUyBRIGlzIG5vdCByZXN1bWVkIGR1cmluZyB0aW1lb3V0IHBlcmlvZCwgdG8gcHJldmVudCBwZXJtYW5lbnQKKyAqIHN0YWxsLCByZXN1bWUgT1MgUSBmb3JjZWZ1bGx5IGZvciBTQVAgYW5kIFAyUCBHTyBpbnRlcmZhY2UuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgaGRkX3NvZnRhcF90eF9yZXN1bWVfdGltZXJfZXhwaXJlZF9oYW5kbGVyKHZvaWQgKmFkYXB0ZXJfY29udGV4dCkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IChoZGRfYWRhcHRlcl90ICopIGFkYXB0ZXJfY29udGV4dDsKKworCWlmICghcEFkYXB0ZXIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX1NBUF9EQVRBLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSU5WIEFSRyIsIF9fZnVuY19fKTsKKwkJLyogSU5WQUxJRCBBUkcgKi8KKwkJcmV0dXJuOworCX0KKworCWhkZExvZyhMT0cxLCBGTCgiRW5hYmxpbmcgcXVldWVzIikpOworCXdsYW5faGRkX25ldGlmX3F1ZXVlX2NvbnRyb2wocEFkYXB0ZXIsIFdMQU5fV0FLRV9BTExfTkVUSUZfUVVFVUUsCisJCQkJICAgV0xBTl9DT05UUk9MX1BBVEgpOworCXJldHVybjsKK30KKworLyoqCisgKiBoZGRfc29mdGFwX3R4X3Jlc3VtZV9jYigpIC0gUmVzdW1lIE9TIFRYIFEuCisgKiBAYWRhcHRlcl9jb250ZXh0OiBwb2ludGVyIHRvIHZkZXYgYXBkYXB0ZXIKKyAqIEB0eF9yZXN1bWU6IFRYIFEgcmVzdW1lIHRyaWdnZXIKKyAqCisgKiBRIHdhcyBzdG9wcGVkIGR1ZSB0byBXTEFOIFRYIHBhdGggbG93IHJlc291cmNlIGNvbmRpdGlvbgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGhkZF9zb2Z0YXBfdHhfcmVzdW1lX2NiKHZvaWQgKmFkYXB0ZXJfY29udGV4dCwgYm9vbCB0eF9yZXN1bWUpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCAqKSBhZGFwdGVyX2NvbnRleHQ7CisKKwlpZiAoIXBBZGFwdGVyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IElOViBBUkciLCBfX2Z1bmNfXyk7CisJCS8qIElOVkFMSUQgQVJHICovCisJCXJldHVybjsKKwl9CisKKwkvKiBSZXN1bWUgVFggICovCisJaWYgKHRydWUgPT0gdHhfcmVzdW1lKSB7CisJCWlmIChDREZfVElNRVJfU1RBVEVfU1RPUFBFRCAhPQorCQkgICAgY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKCZwQWRhcHRlci0+CisJCQkJCQkgICB0eF9mbG93X2NvbnRyb2xfdGltZXIpKSB7CisJCQljZGZfbWNfdGltZXJfc3RvcCgmcEFkYXB0ZXItPnR4X2Zsb3dfY29udHJvbF90aW1lcik7CisJCX0KKworCQloZGRMb2coTE9HMSwgRkwoIkVuYWJsaW5nIHF1ZXVlcyIpKTsKKwkJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChwQWRhcHRlciwKKwkJCQkJV0xBTl9XQUtFX0FMTF9ORVRJRl9RVUVVRSwKKwkJCQkJV0xBTl9EQVRBX0ZMT1dfQ09OVFJPTCk7CisJfQorI2lmIGRlZmluZWQoQ09ORklHX1BFUl9WREVWX1RYX0RFU0NfUE9PTCkKKwllbHNlIGlmIChmYWxzZSA9PSB0eF9yZXN1bWUpIHsgICAgICAvKiBQYXVzZSBUWCAgKi8KKwkJaGRkTG9nKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCQl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLAorCQkJCQkgV0xBTl9TVE9QX0FMTF9ORVRJRl9RVUVVRSwKKwkJCQkJIFdMQU5fREFUQV9GTE9XX0NPTlRST0wpOworCQlpZiAoQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQgPT0KKwkJICAgIGNkZl9tY190aW1lcl9nZXRfY3VycmVudF9zdGF0ZSgmcEFkYXB0ZXItPgorCQkJCQkJICAgdHhfZmxvd19jb250cm9sX3RpbWVyKSkgeworCQkJQ0RGX1NUQVRVUyBzdGF0dXM7CisJCQlzdGF0dXMgPQorCQkJCWNkZl9tY190aW1lcl9zdGFydCgmcEFkYXB0ZXItPnR4X2Zsb3dfY29udHJvbF90aW1lciwKKwkJCQkJCSAgIFdMQU5fU0FQX0hERF9UWF9GTE9XX0NPTlRST0xfT1NfUV9CTE9DS19USU1FKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiJXM6IEZhaWxlZCB0byBzdGFydCB0eF9mbG93X2NvbnRyb2xfdGltZXIiLAorCQkJCQkgIF9fZnVuY19fKTsKKwkJCWVsc2UKKwkJCQlwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eGZsb3dfdGltZXJfY250Kys7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybjsKK30KKyNlbmRpZiAvKiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCAqLworCisvKioKKyAqIGhkZF9zb2Z0YXBfaGFyZF9zdGFydF94bWl0KCkgLSBUcmFuc21pdCBhIGZyYW1lCisgKiBAc2tiOiBwb2ludGVyIHRvIE9TIHBhY2tldCAoc2tfYnVmZikKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqCisgKiBGdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggdGhlIExpbnV4IE9TIGZvciB0cmFuc21pdHRpbmcKKyAqIHBhY2tldHMuIFRoaXMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gZGlyZWN0bHkgcGFzc2VzCisgKiB0aGUgcGFja2V0IHRvIFRyYW5zcG9ydCBMYXllci4KKyAqCisgKiBSZXR1cm46IEFsd2F5cyByZXR1cm5zIE5FVERFVl9UWF9PSworICovCitpbnQgaGRkX3NvZnRhcF9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzbWVfYWNfZW51bV90eXBlIGFjID0gU01FX0FDX0JFOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwloZGRfYXBfY3R4X3QgKnBIZGRBcEN0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJc3RydWN0IGNkZl9tYWNfYWRkciAqcERlc3RNYWNBZGRyZXNzOworCXVpbnQ4X3QgU1RBSWQ7CisJdWludDhfdCBwcm90b190eXBlID0gMDsKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisJaGRkX2NvbnRleHRfdCAqaGRkQ3R4dCA9IChoZGRfY29udGV4dF90ICopIHBBZGFwdGVyLT5wSGRkQ3R4OworI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworCSsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0Q2FsbGVkOworCS8qIFByZXZlbnQgdGhpcyBmdW5jdGlvbiBmcm9tIGJlaW5nIGNhbGxlZCBkdXJpbmcgU1NSIHNpbmNlIFRMCisJICogY29udGV4dCBtYXkgbm90IGJlIHJlaW5pdGlhbGl6ZWQgYXQgdGhpcyB0aW1lIHdoaWNoIG1heQorCSAqIGxlYWQgdG8gYSBjcmFzaC4KKwkgKi8KKwlpZiAocEhkZEN0eC0+aXNMb2dwSW5Qcm9ncmVzcykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZHJvcF9wa3Q7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIG9wZXJhdGluZyBvbiBhIERGUyBDaGFubmVsCisJICogdGhlbiBjaGVjayBpZiBTQVAgaXMgaW4gQ0FDIFdBSVQgc3RhdGUgYW5kCisJICogZHJvcCB0aGUgcGFja2V0cy4gSW4gQ0FDIFdBSVQgc3RhdGUgZGV2aWNlCisJICogaXMgZXhwZWN0ZWQgbm90IHRvIHRyYW5zbWl0IGFueSBmcmFtZXMuCisJICogU0FQIHN0YXJ0cyBUeCBvbmx5IGFmdGVyIHRoZSBCU1MgU1RBUlQgaXMKKwkgKiBkb25lLgorCSAqLworCWlmIChwSGRkQXBDdHgtPmRmc19jYWNfYmxvY2tfdHgpIHsKKwkJZ290byBkcm9wX3BrdDsKKwl9CisKKwlwRGVzdE1hY0FkZHJlc3MgPSAoc3RydWN0IGNkZl9tYWNfYWRkciAqKSBza2ItPmRhdGE7CisKKwlpZiAoY2RmX2lzX21hY2FkZHJfYnJvYWRjYXN0KHBEZXN0TWFjQWRkcmVzcykgfHwKKwkgICAgY2RmX2lzX21hY2FkZHJfZ3JvdXAocERlc3RNYWNBZGRyZXNzKSkgeworCQkvKiBUaGUgQkMvTUMgc3RhdGlvbiBJRCBpcyBhc3NpZ25lZCBkdXJpbmcgQlNTCisJCSAqIHN0YXJ0aW5nIHBoYXNlLiAgU0FQIHdpbGwgcmV0dXJuIHRoZSBzdGF0aW9uIElECisJCSAqIHVzZWQgZm9yIEJDL01DIHRyYWZmaWMuCisJCSAqLworCQlTVEFJZCA9IHBIZGRBcEN0eC0+dUJDU3RhSWQ7CisJfSBlbHNlIHsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkJIGhkZF9zb2Z0YXBfZ2V0X3N0YV9pZChwQWRhcHRlciwKKwkJCQkgcERlc3RNYWNBZGRyZXNzLCAmU1RBSWQpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkgICIlczogRmFpbGVkIHRvIGZpbmQgcmlnaHQgc3RhdGlvbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZHJvcF9wa3Q7CisJCX0KKworCQlpZiAoU1RBSWQgPT0gSEREX1dMQU5fSU5WQUxJRF9TVEFfSUQpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJCSAgIiVzOiBGYWlsZWQgdG8gZmluZCByaWdodCBzdGF0aW9uIiwgX19mdW5jX18pOworCQkJZ290byBkcm9wX3BrdDsKKwkJfSBlbHNlIGlmIChmYWxzZSA9PSBwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLmlzVXNlZCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX1NBUF9EQVRBLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJICAiJXM6IFNUQSAlZCBpcyB1bnJlZ2lzdGVyZWQiLCBfX2Z1bmNfXywKKwkJCQkgIFNUQUlkKTsKKwkJCWdvdG8gZHJvcF9wa3Q7CisJCX0KKworCQlpZiAoKG9sX3R4cnhfcGVlcl9zdGF0ZV9jb25uICE9CisJCSAgICAgcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS50bFNUQVN0YXRlKQorCQkgICAgJiYgKG9sX3R4cnhfcGVlcl9zdGF0ZV9hdXRoICE9CisJCQlwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLnRsU1RBU3RhdGUpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkgICIlczogU3RhdGlvbiBub3QgY29ubmVjdGVkIHlldCIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZHJvcF9wa3Q7CisJCX0gZWxzZSBpZiAob2xfdHhyeF9wZWVyX3N0YXRlX2Nvbm4gPT0KKwkJCSAgIHBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0udGxTVEFTdGF0ZSkgeworCQkJaWYgKG50b2hzKHNrYi0+cHJvdG9jb2wpICE9IEhERF9FVEhFUlRZUEVfODAyXzFfWCkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJICAiJXM6IE5PTi1FQVBPTCBwYWNrZXQgaW4gbm9uLUF1dGhlbnRpY2F0ZWQgc3RhdGUiLAorCQkJCQkgIF9fZnVuY19fKTsKKwkJCQlnb3RvIGRyb3BfcGt0OworCQkJfQorCQl9CisJfQorCisJaGRkX2dldF90eF9yZXNvdXJjZShwQWRhcHRlciwgU1RBSWQsCisJCQlXTEFOX1NBUF9IRERfVFhfRkxPV19DT05UUk9MX09TX1FfQkxPQ0tfVElNRSk7CisKKwkvKiBHZXQgVEwgQUMgY29ycmVzcG9uZGluZyB0byBRZGlzYyBxdWV1ZSBpbmRleC9BQy4gKi8KKwlhYyA9IGhkZF9xZGlzY19hY190b190bF9hY1tza2ItPnF1ZXVlX21hcHBpbmddOworCSsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0Q2xhc3NpZmllZEFDW2FjXTsKKworI2lmIGRlZmluZWQgKElQQV9PRkZMT0FEKQorCWlmICghKE5CVUZfT1dORVJfSUQoc2tiKSA9PSBJUEFfTkJVRl9PV05FUl9JRCkpIHsKKyNlbmRpZgorCQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGhhcyBlbm91Z2ggaGVhZGVyIHJvb20gKi8KKwkJc2tiID0gc2tiX3Vuc2hhcmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpCisJCQlnb3RvIGRyb3BfcGt0OworCisJCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGRldi0+aGFyZF9oZWFkZXJfbGVuKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqdG1wOworCQkJdG1wID0gc2tiOworCQkJc2tiID0gc2tiX3JlYWxsb2NfaGVhZHJvb20odG1wLCBkZXYtPmhhcmRfaGVhZGVyX2xlbik7CisJCQlkZXZfa2ZyZWVfc2tiKHRtcCk7CisJCQlpZiAoIXNrYikKKwkJCQlnb3RvIGRyb3BfcGt0OworCQl9CisjaWYgZGVmaW5lZCAoSVBBX09GRkxPQUQpCisJfQorI2VuZGlmCisKKwl3bGFuX2hkZF9sb2dfZWFwb2woc2tiLAorCQkJICAgV0lGSV9FVkVOVF9EUklWRVJfRUFQT0xfRlJBTUVfVFJBTlNNSVRfUkVRVUVTVEVEKTsKKworI2lmZGVmIFFDQV9QS1RfUFJPVE9fVFJBQ0UKKwlpZiAoKGhkZEN0eHQtPmNvbmZpZy0+Z0VuYWJsZURlYnVnTG9nICYgQ0RTX1BLVF9UUkFDX1RZUEVfRUFQT0wpIHx8CisJICAgIChoZGRDdHh0LT5jb25maWctPmdFbmFibGVEZWJ1Z0xvZyAmIENEU19QS1RfVFJBQ19UWVBFX0RIQ1ApKSB7CisJCS8qIFByb3RvIFRyYWNlIGVuYWJsZWQgKi8KKwkJcHJvdG9fdHlwZSA9IGNkc19wa3RfZ2V0X3Byb3RvX3R5cGUoc2tiLAorCQkJCQkJICAgIGhkZEN0eHQtPmNvbmZpZy0+CisJCQkJCQkgICAgZ0VuYWJsZURlYnVnTG9nLCAwKTsKKwkJaWYgKENEU19QS1RfVFJBQ19UWVBFX0VBUE9MICYgcHJvdG9fdHlwZSkgeworCQkJY2RzX3BrdF90cmFjZV9idWZfdXBkYXRlKCJIQTpUOkVQTCIpOworCQl9IGVsc2UgaWYgKENEU19QS1RfVFJBQ19UWVBFX0RIQ1AgJiBwcm90b190eXBlKSB7CisJCQljZHNfcGt0X3RyYWNlX2J1Zl91cGRhdGUoIkhBOlQ6REhDIik7CisJCX0KKwl9CisjZW5kaWYgLyogUUNBX1BLVF9QUk9UT19UUkFDRSAqLworCXBBZGFwdGVyLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkrK3BBZGFwdGVyLT5zdGF0cy50eF9wYWNrZXRzOworCisJLyogWmVybyBvdXQgc2tiJ3MgY29udGV4dCBidWZmZXIgZm9yIHRoZSBkcml2ZXIgdG8gdXNlICovCisJY2RmX21lbV9zZXQoc2tiLT5jYiwgc2l6ZW9mKHNrYi0+Y2IpLCAwKTsKKwlOQlVGX1NFVF9QQUNLRVRfVFJBQ0soc2tiLCBOQlVGX1RYX1BLVF9EQVRBX1RSQUNLKTsKKwlOQlVGX1VQREFURV9UWF9QS1RfQ09VTlQoc2tiLCBOQlVGX1RYX1BLVF9IREQpOworCisJY2RmX2RwX3RyYWNlX3NldF90cmFjayhza2IpOworCURQVFJBQ0UoY2RmX2RwX3RyYWNlKHNrYiwgQ0RGX0RQX1RSQUNFX0hERF9QQUNLRVRfUFRSX1JFQ09SRCwKKwkJCQkodWludDhfdCAqKXNrYi0+ZGF0YSwgc2l6ZW9mKHNrYi0+ZGF0YSkpKTsKKwlEUFRSQUNFKGNkZl9kcF90cmFjZShza2IsIENERl9EUF9UUkFDRV9IRERfUEFDS0VUX1JFQ09SRCwKKwkJCQkodWludDhfdCAqKXNrYi0+ZGF0YSwgY2RmX25idWZfbGVuKHNrYikpKTsKKwlpZiAoY2RmX25idWZfbGVuKHNrYikgPiBDREZfRFBfVFJBQ0VfUkVDT1JEX1NJWkUpCisJCURQVFJBQ0UoY2RmX2RwX3RyYWNlKHNrYiwgQ0RGX0RQX1RSQUNFX0hERF9QQUNLRVRfUkVDT1JELAorCQkJCSh1aW50OF90ICopJnNrYi0+ZGF0YVtDREZfRFBfVFJBQ0VfUkVDT1JEX1NJWkVdLAorCQkJCShjZGZfbmJ1Zl9sZW4oc2tiKS1DREZfRFBfVFJBQ0VfUkVDT1JEX1NJWkUpKSk7CisKKwlpZiAob2xfdHhfc2VuZF9kYXRhX2ZyYW1lKFNUQUlkLCBza2IsCisJCQkJCQkJICBwcm90b190eXBlKSAhPSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkgICIlczogRmFpbGVkIHRvIHNlbmQgcGFja2V0IHRvIHR4cnggZm9yIHN0YWlkOiVkIiwKKwkJCSAgX19mdW5jX18sIFNUQUlkKTsKKwkJKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXREcm9wcGVkQUNbYWNdOworCQlnb3RvIGRyb3BfcGt0OworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiBORVRERVZfVFhfT0s7CisKK2Ryb3BfcGt0OgorCisJRFBUUkFDRShjZGZfZHBfdHJhY2Uoc2tiLCBDREZfRFBfVFJBQ0VfRFJPUF9QQUNLRVRfUkVDT1JELAorCQkJCSh1aW50OF90ICopc2tiLT5kYXRhLCBjZGZfbmJ1Zl9sZW4oc2tiKSkpOworCWlmIChjZGZfbmJ1Zl9sZW4oc2tiKSA+IENERl9EUF9UUkFDRV9SRUNPUkRfU0laRSkKKwkJRFBUUkFDRShjZGZfZHBfdHJhY2Uoc2tiLCBDREZfRFBfVFJBQ0VfRFJPUF9QQUNLRVRfUkVDT1JELAorCQkJCSh1aW50OF90ICopJnNrYi0+ZGF0YVtDREZfRFBfVFJBQ0VfUkVDT1JEX1NJWkVdLAorCQkJCShjZGZfbmJ1Zl9sZW4oc2tiKS1DREZfRFBfVFJBQ0VfUkVDT1JEX1NJWkUpKSk7CisKKwkrK3BBZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkOworCSsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0RHJvcHBlZDsKKwlrZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKy8qKgorICogX19oZGRfc29mdGFwX3R4X3RpbWVvdXQoKSAtIFRYIHRpbWVvdXQgaGFuZGxlcgorICogQGRldjogcG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCBhcyBhIG5ldGRldiBuZG9fdHhfdGltZW91dCBtZXRob2QsIGFuZAorICogaXMgaW52b2tlZCBieSB0aGUga2VybmVsIGlmIHRoZSBkcml2ZXIgdGFrZXMgdG9vIGxvbmcgdG8gdHJhbnNtaXQgYQorICogZnJhbWUuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIF9faGRkX3NvZnRhcF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisKKwlEUFRSQUNFKGNkZl9kcF90cmFjZShOVUxMLCBDREZfRFBfVFJBQ0VfSEREX1NPRlRBUF9UWF9USU1FT1VULAorCQkJCU5VTEwsIDApKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiJXM6IFRyYW5zbWlzc2lvbiB0aW1lb3V0IG9jY3VycmVkIiwgX19mdW5jX18pOworCS8qIEdldHRpbmcgaGVyZSBpbXBsaWVzIHdlIGRpc2FibGVkIHRoZSBUWCBxdWV1ZXMgZm9yIHRvbworCSAqIGxvbmcuIFF1ZXVlcyBhcmUgZGlzYWJsZWQgZWl0aGVyIGJlY2F1c2Ugb2YgZGlzYXNzb2NpYXRpb24KKwkgKiBvciBsb3cgcmVzb3VyY2Ugc2NlbmFyaW9zLiBJbiBjYXNlIG9mIGRpc2Fzc29jaWF0aW9uIGl0IGlzCisJICogb2sgdG8gaWdub3JlIHRoaXMuIEJ1dCBpZiBhc3NvY2lhdGVkLCB3ZSBoYXZlIGRvIHBvc3NpYmxlCisJICogcmVjb3ZlcnkgaGVyZQorCSAqLworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCWlmIChoZGRfY3R4LT5pc0xvZ3BJblByb2dyZXNzKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICIlczogTE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorfQorCisvKioKKyAqIGhkZF9zb2Z0YXBfdHhfdGltZW91dCgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faGRkX3NvZnRhcF90eF90aW1lb3V0CisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfc29mdGFwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCV9faGRkX3NvZnRhcF90eF90aW1lb3V0KGRldik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworfQorCisvKioKKyAqIEBoZGRfc29mdGFwX2luaXRfdHhfcngoKSAtIEluaXRpYWxpemUgVHgvUlggbW9kdWxlCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLAorICoJICAgQ0RGX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTIGhkZF9zb2Z0YXBfaW5pdF90eF9yeChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXVpbnQ4X3QgU1RBSWQgPSAwOworCisJY2RmX21lbV96ZXJvKCZwQWRhcHRlci0+c3RhdHMsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJc3Bpbl9sb2NrX2luaXQoJnBBZGFwdGVyLT5zdGFJbmZvX2xvY2spOworCisJZm9yIChTVEFJZCA9IDA7IFNUQUlkIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBTVEFJZCsrKSB7CisJCWNkZl9tZW1femVybygmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXSwKKwkJCSAgICAgc2l6ZW9mKGhkZF9zdGF0aW9uX2luZm9fdCkpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGhkZF9zb2Z0YXBfZGVpbml0X3R4X3J4KCkgLSBEZWluaXRpYWxpemUgVHgvUlggbW9kdWxlCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLAorICoJICAgQ0RGX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTIGhkZF9zb2Z0YXBfZGVpbml0X3R4X3J4KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBoZGRfc29mdGFwX2luaXRfdHhfcnhfc3RhKCkgLSBJbml0aWFsaXplIHR4L3J4IGZvciBhIHNvZnRhcCBzdGF0aW9uCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKiBAU1RBSWQ6IFN0YXRpb24gSUQgdG8gaW5pdGlhbGl6ZQorICogQHBtYWNBZGRyU1RBOiBwb2ludGVyIHRvIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwKKyAqCSAgIENERl9TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAqLworQ0RGX1NUQVRVUyBoZGRfc29mdGFwX2luaXRfdHhfcnhfc3RhKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90IFNUQUlkLAorCQkJCSAgICAgc3RydWN0IGNkZl9tYWNfYWRkciAqcG1hY0FkZHJTVEEpCit7CisJc3Bpbl9sb2NrX2JoKCZwQWRhcHRlci0+c3RhSW5mb19sb2NrKTsKKwlpZiAocEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS5pc1VzZWQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX1NBUF9EQVRBLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogUmVpbml0IHN0YXRpb24gJWQiLCBfX2Z1bmNfXywgU1RBSWQpOworCQlzcGluX3VubG9ja19iaCgmcEFkYXB0ZXItPnN0YUluZm9fbG9jayk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZGZfbWVtX3plcm8oJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0sIHNpemVvZihoZGRfc3RhdGlvbl9pbmZvX3QpKTsKKworCXBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0uaXNVc2VkID0gdHJ1ZTsKKwlwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLmlzRGVhdXRoSW5Qcm9ncmVzcyA9IGZhbHNlOworCWNkZl9jb3B5X21hY2FkZHIoJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ubWFjQWRkclNUQSwgcG1hY0FkZHJTVEEpOworCisJc3Bpbl91bmxvY2tfYmgoJnBBZGFwdGVyLT5zdGFJbmZvX2xvY2spOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogaGRkX3NvZnRhcF9kZWluaXRfdHhfcnhfc3RhKCkgLSBEZWluaXRpYWxpemUgdHgvcnggZm9yIGEgc29mdGFwIHN0YXRpb24KKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAqIEBTVEFJZDogU3RhdGlvbiBJRCB0byBkZWluaXRpYWxpemUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQsCisgKgkgICBDREZfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgKi8KK0NERl9TVEFUVVMgaGRkX3NvZnRhcF9kZWluaXRfdHhfcnhfc3RhKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90IFNUQUlkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWhkZF9ob3N0YXBkX3N0YXRlX3QgKnBIb3N0YXBkU3RhdGU7CisKKwlwSG9zdGFwZFN0YXRlID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisJc3Bpbl9sb2NrX2JoKCZwQWRhcHRlci0+c3RhSW5mb19sb2NrKTsKKworCWlmIChmYWxzZSA9PSBwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLmlzVXNlZCkgeworCQlzcGluX3VubG9ja19iaCgmcEFkYXB0ZXItPnN0YUluZm9fbG9jayk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IERlaW5pdCBzdGF0aW9uIG5vdCBpbml0ZWQgJWQiLCBfX2Z1bmNfXywgU1RBSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS5pc1VzZWQgPSBmYWxzZTsKKwlwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLmlzRGVhdXRoSW5Qcm9ncmVzcyA9IGZhbHNlOworCisJc3Bpbl91bmxvY2tfYmgoJnBBZGFwdGVyLT5zdGFJbmZvX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaGRkX3NvZnRhcF9yeF9wYWNrZXRfY2JrKCkgLSBSZWNlaXZlIHBhY2tldCBoYW5kbGVyCisgKiBAY2RzX2NvbnRleHQ6IHBvaW50ZXIgdG8gQ0RTIGNvbnRleHQKKyAqIEByeEJ1ZjogcG9pbnRlciB0byByeCBjZGZfbmJ1ZgorICogQHN0YUlkOiBTdGF0aW9uIElkCisgKgorICogUmVjZWl2ZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwuICBUTCB3aWxsIGNhbGwgdGhpcyB0byBub3RpZnkKKyAqIHRoZSBIREQgd2hlbiBvbmUgb3IgbW9yZSBwYWNrZXRzIHdlcmUgcmVjZWl2ZWQgZm9yIGEgcmVnaXN0ZXJlZAorICogU1RBLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwKKyAqCSAgIENERl9TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAqLworQ0RGX1NUQVRVUyBoZGRfc29mdGFwX3J4X3BhY2tldF9jYmsodm9pZCAqY2RzX2NvbnRleHQsCisJCQkJICAgIGNkZl9uYnVmX3QgcnhCdWYsIHVpbnQ4X3Qgc3RhSWQpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOworCWludCByeHN0YXQ7CisJdW5zaWduZWQgaW50IGNwdV9pbmRleDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisJdWludDhfdCBwcm90b190eXBlOworI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworCS8qIFNhbml0eSBjaGVjayBvbiBpbnB1dHMgKi8KKwlpZiAoKE5VTEwgPT0gY2RzX2NvbnRleHQpIHx8IChOVUxMID09IHJ4QnVmKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOdWxsIHBhcmFtcyBiZWluZyBwYXNzZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwSGRkQ3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKwlpZiAoTlVMTCA9PSBwSGRkQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEhERCBjb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwQWRhcHRlciA9IHBIZGRDdHgtPnN0YV90b19hZGFwdGVyW3N0YUlkXTsKKwlpZiAoKE5VTEwgPT0gcEFkYXB0ZXIpIHx8IChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IHBBZGFwdGVyLT5tYWdpYykpIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiaW52YWxpZCBhZGFwdGVyICVwIG9yIGFkYXB0ZXIgaGFzIGludmFsaWQgbWFnaWMiKSwKKwkJCXBBZGFwdGVyKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIHdhbGsgdGhlIGNoYWluIHVudGlsIGFsbCBhcmUgcHJvY2Vzc2VkICovCisJc2tiID0gKHN0cnVjdCBza19idWZmICopcnhCdWY7CisKKwloZGRfc29mdGFwX2R1bXBfc2tfYnVmZihza2IpOworCisJc2tiLT5kZXYgPSBwQWRhcHRlci0+ZGV2OworCisJaWYgKHNrYi0+ZGV2ID09IE5VTEwpIHsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBFUlJPUiEhSW52YWxpZCBuZXRkZXZpY2UiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJY3B1X2luZGV4ID0gd2xhbl9oZGRfZ2V0X2NwdSgpOworCSsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMucnhQYWNrZXRzW2NwdV9pbmRleF07CisJKytwQWRhcHRlci0+c3RhdHMucnhfcGFja2V0czsKKwlwQWRhcHRlci0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwl3bGFuX2hkZF9sb2dfZWFwb2woc2tiLCBXSUZJX0VWRU5UX0RSSVZFUl9FQVBPTF9GUkFNRV9SRUNFSVZFRCk7CisKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisJaWYgKChwSGRkQ3R4LT5jb25maWctPmdFbmFibGVEZWJ1Z0xvZyAmIENEU19QS1RfVFJBQ19UWVBFX0VBUE9MKSB8fAorCSAgICAocEhkZEN0eC0+Y29uZmlnLT5nRW5hYmxlRGVidWdMb2cgJiBDRFNfUEtUX1RSQUNfVFlQRV9ESENQKSkgeworCQlwcm90b190eXBlID0gY2RzX3BrdF9nZXRfcHJvdG9fdHlwZShza2IsCisJCQkJCQkgICAgcEhkZEN0eC0+Y29uZmlnLT4KKwkJCQkJCSAgICBnRW5hYmxlRGVidWdMb2csIDApOworCQlpZiAoQ0RTX1BLVF9UUkFDX1RZUEVfRUFQT0wgJiBwcm90b190eXBlKSB7CisJCQljZHNfcGt0X3RyYWNlX2J1Zl91cGRhdGUoIkhBOlI6RVBMIik7CisJCX0gZWxzZSBpZiAoQ0RTX1BLVF9UUkFDX1RZUEVfREhDUCAmIHByb3RvX3R5cGUpIHsKKwkJCWNkc19wa3RfdHJhY2VfYnVmX3VwZGF0ZSgiSEE6UjpESEMiKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBRQ0FfUEtUX1BST1RPX1RSQUNFICovCisKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0hPTERfUlhfV0FLRUxPQ0sKKwljZGZfd2FrZV9sb2NrX3RpbWVvdXRfYWNxdWlyZSgmcEhkZEN0eC0+cnhfd2FrZV9sb2NrLAorCQkJCSAgICAgIEhERF9XQUtFX0xPQ0tfRFVSQVRJT04sCisJCQkJICAgICAgV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19IT0xEX1JYKTsKKyNlbmRpZgorCisJLyogUmVtb3ZlIFNLQiBmcm9tIGludGVybmFsIHRyYWNraW5nIHRhYmxlIGJlZm9yZSBzdWJtaXR0aW5nCisJICogaXQgdG8gc3RhY2sKKwkgKi8KKwljZGZfbmV0X2J1Zl9kZWJ1Z19yZWxlYXNlX3NrYihyeEJ1Zik7CisKKwlpZiAoaGRkX25hcGlfZW5hYmxlZChIRERfTkFQSV9BTlkpKQorCQlyeHN0YXQgPSBuZXRpZl9yZWNlaXZlX3NrYihza2IpOworCWVsc2UKKwkJcnhzdGF0ID0gbmV0aWZfcnhfbmkoc2tiKTsKKwlpZiAoTkVUX1JYX1NVQ0NFU1MgPT0gcnhzdGF0KSB7CisJCSsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMucnhEZWxpdmVyZWRbY3B1X2luZGV4XTsKKwl9IGVsc2UgeworCQkrK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnJ4UmVmdXNlZFtjcHVfaW5kZXhdOworCX0KKworCXBBZGFwdGVyLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBoZGRfc29mdGFwX2RlcmVnaXN0ZXJfc3RhKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90IHN0YUlkKQorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICogQHN0YUlkOiBTdGF0aW9uIElEIHRvIGRlcmVnaXN0ZXIKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBDREZfU1RBVFVTX0VfKiBvbiBlcnJvcgorICovCitDREZfU1RBVFVTIGhkZF9zb2Z0YXBfZGVyZWdpc3Rlcl9zdGEoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVpbnQ4X3Qgc3RhSWQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBwQWRhcHRlciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWlmIChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IHBBZGFwdGVyLT5tYWdpYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBJbnZhbGlkIHBBZGFwdGVyIG1hZ2ljIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCXBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKSAocEFkYXB0ZXItPnBIZGRDdHgpOworCS8qIENsZWFyIHN0YXRpb24gaW4gVEwgYW5kIHRoZW4gdXBkYXRlIEhERCBkYXRhCisJICogc3RydWN0dXJlcy4gVGhpcyBoZWxwcyB0byBibG9jayBSWCBmcmFtZXMgZnJvbSBvdGhlcgorCSAqIHN0YXRpb24gdG8gdGhpcyBzdGF0aW9uLgorCSAqLworCWNkZl9zdGF0dXMgPSBvbF90eHJ4X2NsZWFyX3BlZXIoc3RhSWQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAib2xfdHhyeF9jbGVhcl9wZWVyKCkgZmFpbGVkIHRvIGZvciBzdGFJRCAlZC4gICIKKwkJCSAgIlN0YXR1cz0gJWQgWzB4JTA4WF0iLCBzdGFJZCwgY2RmX3N0YXR1cywgY2RmX3N0YXR1cyk7CisJfQorCisJaWYgKHBBZGFwdGVyLT5hU3RhSW5mb1tzdGFJZF0uaXNVc2VkKSB7CisJCXNwaW5fbG9ja19iaCgmcEFkYXB0ZXItPnN0YUluZm9fbG9jayk7CisJCWNkZl9tZW1femVybygmcEFkYXB0ZXItPmFTdGFJbmZvW3N0YUlkXSwKKwkJCSAgICAgc2l6ZW9mKGhkZF9zdGF0aW9uX2luZm9fdCkpOworCQlzcGluX3VubG9ja19iaCgmcEFkYXB0ZXItPnN0YUluZm9fbG9jayk7CisJfQorCXBIZGRDdHgtPnN0YV90b19hZGFwdGVyW3N0YUlkXSA9IE5VTEw7CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiBoZGRfc29mdGFwX3JlZ2lzdGVyX3N0YSgpIC0gUmVnaXN0ZXIgYSBTb2Z0QVAgU1RBCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKiBAZkF1dGhSZXF1aXJlZDogaXMgYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiByZXF1aXJlZD8KKyAqIEBmUHJpdmFjeUJpdDogc2hvdWxkIDgwMi4xMSBwcml2YWN5IGJpdCBiZSBzZXQ/CisgKiBAc3RhSWQ6IHN0YXRpb24gSUQgYXNzaWduZWQgdG8gdGhpcyBzdGF0aW9uCisgKiBAdWNhc3RTaWc6IHVuaWNhc3Qgc2VjdXJpdHkgc2lnbmF0dXJlCisgKiBAYmNhc3RTaWc6IGJyb2FkY2FzdCBzZWN1cml0eSBzaWduYXR1cmUKKyAqIEBwUGVlck1hY0FkZHJlc3M6IHN0YXRpb24gTUFDIGFkZHJlc3MKKyAqIEBmV21tRW5hYmxlZDogaXMgV01NIGVuYWJsZWQgZm9yIHRoaXMgU1RBPworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV8qIG9uIGVycm9yCisgKi8KK0NERl9TVEFUVVMgaGRkX3NvZnRhcF9yZWdpc3Rlcl9zdGEoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgYm9vbCBmQXV0aFJlcXVpcmVkLAorCQkJCSAgIGJvb2wgZlByaXZhY3lCaXQsCisJCQkJICAgdWludDhfdCBzdGFJZCwKKwkJCQkgICB1aW50OF90IHVjYXN0U2lnLAorCQkJCSAgIHVpbnQ4X3QgYmNhc3RTaWcsCisJCQkJICAgc3RydWN0IGNkZl9tYWNfYWRkciAqcFBlZXJNYWNBZGRyZXNzLAorCQkJCSAgIGJvb2wgZldtbUVuYWJsZWQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJc3RydWN0IG9sX3R4cnhfZGVzY190eXBlIHN0YURlc2MgPSB7IDAgfTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gcEFkYXB0ZXItPnBIZGRDdHg7CisKKwkvKgorCSAqIENsZWFuIHVwIG9sZCBlbnRyeSBpZiBpdCBpcyBub3QgY2xlYW5lZCB1cCBwcm9wZXJseQorCSAqLworCWlmIChwQWRhcHRlci0+YVN0YUluZm9bc3RhSWRdLmlzVXNlZCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiY2xlYW4gdXAgb2xkIGVudHJ5IGZvciBTVEEgJWQiLCBzdGFJZCk7CisJCWhkZF9zb2Z0YXBfZGVyZWdpc3Rlcl9zdGEocEFkYXB0ZXIsIHN0YUlkKTsKKwl9CisJLyogR2V0IHRoZSBTdGF0aW9uIElEIGZyb20gdGhlIG9uZSBzYXZlZCBkdXJpbmcgdGhlIGFzc29jYXRpb24uICovCisKKwlzdGFEZXNjLnN0YV9pZCA9IHN0YUlkOworCisJLypTYXZlIHRoZSBwQWRhcHRlciBQb2ludGVyIGZvciB0aGlzIHN0YUlkICovCisJcEhkZEN0eC0+c3RhX3RvX2FkYXB0ZXJbc3RhSWRdID0gcEFkYXB0ZXI7CisKKwljZGZfc3RhdHVzID0KKwkJaGRkX3NvZnRhcF9pbml0X3R4X3J4X3N0YShwQWRhcHRlciwgc3RhSWQsCisJCQkJCSAgcFBlZXJNYWNBZGRyZXNzKTsKKworCXN0YURlc2MuaXNfcW9zX2VuYWJsZWQgPSBmV21tRW5hYmxlZDsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICJIREQgU09GVEFQIHJlZ2lzdGVyIFRMIFFvU19lbmFibGVkPSVkIiwKKwkJICBzdGFEZXNjLmlzX3Fvc19lbmFibGVkKTsKKworCisJY2RmX3N0YXR1cyA9CisJCW9sX3R4cnhfcmVnaXN0ZXJfcGVlcihoZGRfc29mdGFwX3J4X3BhY2tldF9jYmssCisJCQkJCSAgICZzdGFEZXNjKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIlNPRlRBUCBvbF90eHJ4X3JlZ2lzdGVyX3BlZXIoKSBmYWlsZWQgdG8gcmVnaXN0ZXIuICBTdGF0dXM9ICVkIFsweCUwOFhdIiwKKwkJCSAgY2RmX3N0YXR1cywgY2RmX3N0YXR1cyk7CisJCXJldHVybiBjZGZfc3RhdHVzOworCX0KKworCS8qIGlmICggV1BBICksIHRlbGwgVEwgdG8gZ28gdG8gJ2Nvbm5lY3RlZCcgYW5kIGFmdGVyIGtleXMgY29tZSB0byB0aGUKKwkgKiBkcml2ZXIgdGhlbiBnbyB0byAnYXV0aGVudGljYXRlZCcuICBGb3IgYWxsIG90aGVyIGF1dGhlbnRpY2F0aW9uCisJICogdHlwZXMgKHRob3NlIHRoYXQgZG8gbm90IHJlcXVpcmUgdXBwZXIgbGF5ZXIgYXV0aGVudGljYXRpb24pIHdlIGNhbgorCSAqIHB1dCBUTCBkaXJlY3RseSBpbnRvICdhdXRoZW50aWNhdGVkJyBzdGF0ZQorCSAqLworCisJcEFkYXB0ZXItPmFTdGFJbmZvW3N0YUlkXS51Y1NUQUlkID0gc3RhSWQ7CisJcEFkYXB0ZXItPmFTdGFJbmZvW3N0YUlkXS5pc1Fvc0VuYWJsZWQgPSBmV21tRW5hYmxlZDsKKworCWlmICghZkF1dGhSZXF1aXJlZCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAib3Blbi9zaGFyZWQgYXV0aCBTdGFJZD0gJWQuICBDaGFuZ2luZyBUTCBzdGF0ZSB0byBBVVRIRU5USUNBVEVEIGF0IEpvaW4gdGltZSIsCisJCQkgIHBBZGFwdGVyLT5hU3RhSW5mb1tzdGFJZF0udWNTVEFJZCk7CisKKwkJLyogQ29ubmVjdGlvbnMgdGhhdCBkbyBub3QgbmVlZCBVcHBlciBsYXllciBhdXRoLAorCQkgKiB0cmFuc2l0aW9uIFRMIGRpcmVjdGx5IHRvICdBdXRoZW50aWNhdGVkJyBzdGF0ZS4KKwkJICovCisJCWNkZl9zdGF0dXMgPSBoZGRfY2hhbmdlX3BlZXJfc3RhdGUocEFkYXB0ZXIsIHN0YURlc2Muc3RhX2lkLAorCQkJCQkJb2xfdHhyeF9wZWVyX3N0YXRlX2F1dGgsIGZhbHNlKTsKKworCQlwQWRhcHRlci0+YVN0YUluZm9bc3RhSWRdLnRsU1RBU3RhdGUgPSBvbF90eHJ4X3BlZXJfc3RhdGVfYXV0aDsKKwkJcEFkYXB0ZXItPnNlc3Npb25DdHguYXAudUlzQXV0aGVudGljYXRlZCA9IHRydWU7CisJfSBlbHNlIHsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiVUxBIGF1dGggU3RhSWQ9ICVkLiAgQ2hhbmdpbmcgVEwgc3RhdGUgdG8gQ09OTkVDVEVEIGF0IEpvaW4gdGltZSIsCisJCQkgIHBBZGFwdGVyLT5hU3RhSW5mb1tzdGFJZF0udWNTVEFJZCk7CisKKwkJY2RmX3N0YXR1cyA9IGhkZF9jaGFuZ2VfcGVlcl9zdGF0ZShwQWRhcHRlciwgc3RhRGVzYy5zdGFfaWQsCisJCQkJCQlvbF90eHJ4X3BlZXJfc3RhdGVfY29ubiwgZmFsc2UpOworCQlwQWRhcHRlci0+YVN0YUluZm9bc3RhSWRdLnRsU1RBU3RhdGUgPSBvbF90eHJ4X3BlZXJfc3RhdGVfY29ubjsKKworCQlwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC51SXNBdXRoZW50aWNhdGVkID0gZmFsc2U7CisKKwl9CisKKwkvKiBFbmFibGUgVHggcXVldWUgKi8KKwloZGRMb2coTE9HMSwgRkwoIkVuYWJsaW5nIHF1ZXVlcyIpKTsKKwl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLAorCQkJCSAgIFdMQU5fU1RBUlRfQUxMX05FVElGX1FVRVVFX05fQ0FSUklFUiwKKwkJCQkgICBXTEFOX0NPTlRST0xfUEFUSCk7CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiBoZGRfc29mdGFwX3JlZ2lzdGVyX2JjX3N0YSgpIC0gUmVnaXN0ZXIgdGhlIFNvZnRBUCBicm9hZGNhc3QgU1RBCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKiBAZlByaXZhY3lCaXQ6IHNob3VsZCA4MDIuMTEgcHJpdmFjeSBiaXQgYmUgc2V0PworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV8qIG9uIGVycm9yCisgKi8KK0NERl9TVEFUVVMgaGRkX3NvZnRhcF9yZWdpc3Rlcl9iY19zdGEoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgICAgYm9vbCBmUHJpdmFjeUJpdCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJc3RydWN0IGNkZl9tYWNfYWRkciBicm9hZGNhc3RNYWNBZGRyID0KKwkJCQkJQ0RGX01BQ19BRERSX0JST0FEQ0FTVF9JTklUSUFMSVpFUjsKKwloZGRfYXBfY3R4X3QgKnBIZGRBcEN0eDsKKworCXBIZGRBcEN0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBBZGFwdGVyKTsKKworCXBIZGRDdHgtPnN0YV90b19hZGFwdGVyW1dMQU5fUlhfQkNNQ19TVEFfSURdID0gcEFkYXB0ZXI7CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCXBIZGRDdHgtPnN0YV90b19hZGFwdGVyW3BIZGRBcEN0eC0+dUJDU3RhSWRdID0gcEFkYXB0ZXI7CisjZWxzZQorCXBIZGRDdHgtPnN0YV90b19hZGFwdGVyW1dMQU5fUlhfU0FQX1NFTEZfU1RBX0lEXSA9IHBBZGFwdGVyOworI2VuZGlmCisJY2RmX3N0YXR1cyA9CisJCWhkZF9zb2Z0YXBfcmVnaXN0ZXJfc3RhKHBBZGFwdGVyLCBmYWxzZSwgZlByaXZhY3lCaXQsCisJCQkJCShXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwQWRhcHRlcikpLT4KKwkJCQkJdUJDU3RhSWQsIDAsIDEsICZicm9hZGNhc3RNYWNBZGRyLCAwKTsKKworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIGhkZF9zb2Z0YXBfZGVyZWdpc3Rlcl9iY19zdGEoKSAtIERlcmVnaXN0ZXIgdGhlIFNvZnRBUCBicm9hZGNhc3QgU1RBCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQ0RGX1NUQVRVU19FXyogb24gZXJyb3IKKyAqLworQ0RGX1NUQVRVUyBoZGRfc29mdGFwX2RlcmVnaXN0ZXJfYmNfc3RhKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXJldHVybiBoZGRfc29mdGFwX2RlcmVnaXN0ZXJfc3RhKHBBZGFwdGVyLAorCQkJCQkgKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBBZGFwdGVyKSktPgorCQkJCQkgdUJDU3RhSWQpOworfQorCisvKioKKyAqIGhkZF9zb2Z0YXBfc3RvcF9ic3MoKSAtIFN0b3AgdGhlIEJTUworICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV8qIG9uIGVycm9yCisgKi8KK0NERl9TVEFUVVMgaGRkX3NvZnRhcF9zdG9wX2JzcyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl1aW50OF90IHN0YUlkID0gMDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCS8qIGJzcyBkZXJlZ2lzdGVyIGlzIG5vdCBhbGxvd2VkIGR1cmluZyB3bGFuIGRyaXZlciBsb2FkaW5nIG9yCisJICogdW5sb2FkaW5nCisJICovCisJaWYgKChwSGRkQ3R4LT5pc0xvYWRJblByb2dyZXNzKSB8fCAocEhkZEN0eC0+aXNVbmxvYWRJblByb2dyZXNzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOkxvYWRpbmdfdW5sb2FkaW5nIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUEVSTTsKKwl9CisKKwljZGZfc3RhdHVzID0gaGRkX3NvZnRhcF9kZXJlZ2lzdGVyX2JjX3N0YShwQWRhcHRlcik7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gZGVyZWdpc3RlciBCQyBzdGEgSWQgJWQiLCBfX2Z1bmNfXywKKwkJCSAgKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBBZGFwdGVyKSktPnVCQ1N0YUlkKTsKKwl9CisKKwlmb3IgKHN0YUlkID0gMDsgc3RhSWQgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IHN0YUlkKyspIHsKKwkJLyogVGhpcyBleGNsdWRlcyBCQyBzdGEgYXMgaXQgaXMgYWxyZWFkeSBkZXJlZ2lzdGVyZWQgKi8KKwkJaWYgKHBBZGFwdGVyLT5hU3RhSW5mb1tzdGFJZF0uaXNVc2VkKSB7CisJCQljZGZfc3RhdHVzID0gaGRkX3NvZnRhcF9kZXJlZ2lzdGVyX3N0YShwQWRhcHRlciwgc3RhSWQpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICIlczogRmFpbGVkIHRvIGRlcmVnaXN0ZXIgc3RhIElkICVkIiwKKwkJCQkJICBfX2Z1bmNfXywgc3RhSWQpOworCQkJfQorCQl9CisJfQorCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIGhkZF9zb2Z0YXBfY2hhbmdlX3N0YV9zdGF0ZSgpIC0gQ2hhbmdlIHRoZSBzdGF0ZSBvZiBhIFNvZnRBUCBzdGF0aW9uCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKiBAcERlc3RNYWNBZGRyZXNzOiBNQUMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbgorICogQHN0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHN0YXRpb24KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBDREZfU1RBVFVTX0VfKiBvbiBlcnJvcgorICovCitDREZfU1RBVFVTIGhkZF9zb2Z0YXBfY2hhbmdlX3N0YV9zdGF0ZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICAgc3RydWN0IGNkZl9tYWNfYWRkciAqcERlc3RNYWNBZGRyZXNzLAorCQkJCSAgICAgICBlbnVtIG9sX3R4cnhfcGVlcl9zdGF0ZSBzdGF0ZSkKK3sKKwl1aW50OF90IHVjU1RBSWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX1NBUF9EQVRBLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IGVudGVyIiwgX19mdW5jX18pOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkgaGRkX3NvZnRhcF9nZXRfc3RhX2lkKHBBZGFwdGVyLAorCQkJIHBEZXN0TWFjQWRkcmVzcywgJnVjU1RBSWQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEZhaWxlZCB0byBmaW5kIHJpZ2h0IHN0YXRpb24iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoZmFsc2UgPT0KKwkgICAgY2RmX2lzX21hY2FkZHJfZXF1YWwoJnBBZGFwdGVyLT5hU3RhSW5mb1t1Y1NUQUlkXS5tYWNBZGRyU1RBLAorCQkJCSBwRGVzdE1hY0FkZHJlc3MpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFN0YXRpb24gTUFDIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2hpbmciLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZGZfc3RhdHVzID0KKwkJaGRkX2NoYW5nZV9wZWVyX3N0YXRlKHBBZGFwdGVyLCB1Y1NUQUlkLCBzdGF0ZSwgZmFsc2UpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9TQVBfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBjaGFuZ2Ugc3RhdGlvbiB0byBzdGF0ZSAlZCBzdWNjZWVkIiwgX19mdW5jX18sIHN0YXRlKTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gY2RmX3N0YXR1cykgeworCQlwQWRhcHRlci0+YVN0YUluZm9bdWNTVEFJZF0udGxTVEFTdGF0ZSA9CisJCQlvbF90eHJ4X3BlZXJfc3RhdGVfYXV0aDsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfU0FQX0RBVEEsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlcyBleGl0IiwgX19mdW5jX18pOworCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qCisgKiBoZGRfc29mdGFwX2dldF9zdGFfaWQoKSAtIEZpbmQgc3RhdGlvbiBJRCBmcm9tIE1BQyBhZGRyZXNzCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKiBAcERlc3RNYWNBZGRyZXNzOiBNQUMgYWRkcmVzcyBvZiB0aGUgZGVzdGluYXRpb24KKyAqIEBzdGFJZDogU3RhdGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIE1BQyBhZGRyZXNzCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgaWYgYSBtYXRjaCB3YXMgZm91bmQsIGluIHdoaWNoIGNhc2UKKyAqCSAgIHN0YUlkIGlzIHBvcHVsYXRlZCwgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgaWYgYSBtYXRjaCBpcworICoJICAgbm90IGZvdW5kCisgKi8KK0NERl9TVEFUVVMgaGRkX3NvZnRhcF9nZXRfc3RhX2lkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSBzdHJ1Y3QgY2RmX21hY19hZGRyICpwTWFjQWRkcmVzcywKKwkJCQkgdWludDhfdCAqc3RhSWQpCit7CisJdWludDhfdCBpOworCisJZm9yIChpID0gMDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKSB7CisJCWlmIChjZGZfbWVtX2NvbXBhcmUKKwkJCSgmcEFkYXB0ZXItPmFTdGFJbmZvW2ldLm1hY0FkZHJTVEEsIHBNYWNBZGRyZXNzLAorCQkJQ0RGX01BQ19BRERSX1NJWkUpICYmIHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5pc1VzZWQpIHsKKwkJCSpzdGFJZCA9IGk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX3N0YXRzLmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDhmMTMzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX3N0YXRzLmMKQEAgLTAsMCArMSwyNTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKgorICogRE9DIDogd2xhbl9oZGRfc3RhdHMuYworICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIHN0YXRpc3RpY3MgcmVsYXRlZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSAid2xhbl9oZGRfc3RhdHMuaCIKKyNpbmNsdWRlICJzbWVfYXBpLmgiCisjaW5jbHVkZSAiY2RzX3NjaGVkLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfdHJhY2UuaCIKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCisKKy8qKgorICogc3RydWN0IGhkZF9sbF9zdGF0c19jb250ZXh0IC0gaGRkIGxpbmsgbGF5ZXIgc3RhdHMgY29udGV4dAorICoKKyAqIEByZXF1ZXN0X2lkOiB1c2Vyc3BhY2UtYXNzaWduZWQgbGluayBsYXllciBzdGF0cyByZXF1ZXN0IGlkCisgKiBAcmVxdWVzdF9iaXRtYXA6IHVzZXJzcGFjZS1hc3NpZ25lZCBsaW5rIGxheWVyIHN0YXRzIHJlcXVlc3QgYml0bWFwCisgKiBAcmVzcG9uc2VfZXZlbnQ6IExMIHN0YXRzIHJlcXVlc3Qgd2FpdCBldmVudAorICovCitzdHJ1Y3QgaGRkX2xsX3N0YXRzX2NvbnRleHQgeworCXVpbnQzMl90IHJlcXVlc3RfaWQ7CisJdWludDMyX3QgcmVxdWVzdF9iaXRtYXA7CisJc3RydWN0IGNvbXBsZXRpb24gcmVzcG9uc2VfZXZlbnQ7CisJc3BpbmxvY2tfdCBjb250ZXh0X2xvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IGhkZF9sbF9zdGF0c19jb250ZXh0IGxsX3N0YXRzX2NvbnRleHQ7CisKKyNlbmRpZiAvKiBFbmQgb2YgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMgKi8KKworLyogMTFCLCAxMUcgUmF0ZSB0YWJsZSBpbmNsdWRlIEJhc2ljIHJhdGUgYW5kIEV4dGVuZGVkIHJhdGUKKyAqIFRoZSBJRFggZmllbGQgaXMgdGhlIHJhdGUgaW5kZXgKKyAqIFRoZSBISSBmaWVsZCBpcyB0aGUgcmF0ZSB3aGVuIFJTU0kgaXMgc3Ryb25nIG9yIGJlaW5nIGlnbm9yZWQKKyAqICAoaW4gdGhpcyBjYXNlIHdlIHJlcG9ydCBhY3R1YWwgcmF0ZSkKKyAqIFRoZSBNSUQgZmllbGQgaXMgdGhlIHJhdGUgd2hlbiBSU1NJIGlzIG1vZGVyYXRlCisgKiAoaW4gdGhpcyBjYXNlIHdlIGNhcCAxMWIgcmF0ZXMgYXQgNS41IGFuZCAxMWcgcmF0ZXMgYXQgMjQpCisgKiBUaGUgTE8gZmllbGQgaXMgdGhlIHJhdGUgd2hlbiBSU1NJIGlzIGxvdworICogIChpbiB0aGlzIGNhc2Ugd2UgZG9uJ3QgcmVwb3J0IHJhdGVzLCBhY3R1YWwgY3VycmVudCByYXRlIHVzZWQpCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXVpbnQ4X3QgYmVhY29uX3JhdGVfaW5kZXg7CisJdWludDE2X3Qgc3VwcG9ydGVkX3JhdGVbNF07Cit9IHN1cHBvcnRlZF9kYXRhX3JhdGVbXSA9IHsKKy8qIElEWCAgICAgSEkgIEhNICBMTSBMTyAoUlNTSS1iYXNlZCBpbmRleCAqLworCXsKKwkJMiwgeworCQkJMTAsIDEwLCAxMCwgMAorCQl9CisJfSwgeworCQk0LCB7CisJCQkyMCwgMjAsIDEwLCAwCisJCX0KKwl9LCB7CisJCTExLCB7CisJCQk1NSwgMjAsIDEwLCAwCisJCX0KKwl9LCB7CisJCTEyLCB7CisJCQk2MCwgNTUsIDIwLCAwCisJCX0KKwl9LCB7CisJCTE4LCB7CisJCQk5MCwgNTUsIDIwLCAwCisJCX0KKwl9LCB7CisJCTIyLCB7CisJCQkxMTAsIDU1LCAyMCwgMAorCQl9CisJfSwgeworCQkyNCwgeworCQkJMTIwLCA5MCwgNjAsIDAKKwkJfQorCX0sIHsKKwkJMzYsIHsKKwkJCTE4MCwgMTIwLCA2MCwgMAorCQl9CisJfSwgeworCQk0NCwgeworCQkJMjIwLCAxODAsIDYwLCAwCisJCX0KKwl9LCB7CisJCTQ4LCB7CisJCQkyNDAsIDE4MCwgOTAsIDAKKwkJfQorCX0sIHsKKwkJNjYsIHsKKwkJCTMzMCwgMTgwLCA5MCwgMAorCQl9CisJfSwgeworCQk3MiwgeworCQkJMzYwLCAyNDAsIDkwLCAwCisJCX0KKwl9LCB7CisJCTk2LCB7CisJCQk0ODAsIDI0MCwgMTIwLCAwCisJCX0KKwl9LCB7CisJCTEwOCwgeworCQkJNTQwLCAyNDAsIDEyMCwgMAorCQl9CisJfQorfTsKKy8qIE1DUyBCYXNlZCByYXRlIHRhYmxlIEhUIE1DUyBwYXJhbWV0ZXJzIHdpdGggTnNzID0gMSAqLworc3RhdGljIHN0cnVjdCBpbmRleF9kYXRhX3JhdGVfdHlwZSBzdXBwb3J0ZWRfbWNzX3JhdGVfbnNzMVtdID0geworLyogTUNTICBMMjAgICBMNDAgICBTMjAgIFM0MCAqLworCXswLCB7NjUsIDEzNSwgNzIsIDE1MH0gfSwKKwl7MSwgezEzMCwgMjcwLCAxNDQsIDMwMH0gfSwKKwl7MiwgezE5NSwgNDA1LCAyMTcsIDQ1MH0gfSwKKwl7MywgezI2MCwgNTQwLCAyODksIDYwMH0gfSwKKwl7NCwgezM5MCwgODEwLCA0MzMsIDkwMH0gfSwKKwl7NSwgezUyMCwgMTA4MCwgNTc4LCAxMjAwfSB9LAorCXs2LCB7NTg1LCAxMjE1LCA2NTAsIDEzNTB9IH0sCisJezcsIHs2NTAsIDEzNTAsIDcyMiwgMTUwMH0gfQorfTsKKworLyogSFQgTUNTIHBhcmFtZXRlcnMgd2l0aCBOc3MgPSAyICovCitzdGF0aWMgc3RydWN0IGluZGV4X2RhdGFfcmF0ZV90eXBlIHN1cHBvcnRlZF9tY3NfcmF0ZV9uc3MyW10gPSB7CisvKiBNQ1MgIEwyMCAgICBMNDAgICBTMjAgICBTNDAgKi8KKwl7MCwgezEzMCwgMjcwLCAxNDQsIDMwMH0gfSwKKwl7MSwgezI2MCwgNTQwLCAyODksIDYwMH0gfSwKKwl7MiwgezM5MCwgODEwLCA0MzMsIDkwMH0gfSwKKwl7MywgezUyMCwgMTA4MCwgNTc4LCAxMjAwfSB9LAorCXs0LCB7NzgwLCAxNjIwLCA4NjcsIDE4MDB9IH0sCisJezUsIHsxMDQwLCAyMTYwLCAxMTU2LCAyNDAwfSB9LAorCXs2LCB7MTE3MCwgMjQzMCwgMTMwMCwgMjcwMH0gfSwKKwl7NywgezEzMDAsIDI3MDAsIDE0NDQsIDMwMDB9IH0KK307CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworLyogTUNTIEJhc2VkIFZIVCByYXRlIHRhYmxlIE1DUyBwYXJhbWV0ZXJzIHdpdGggTnNzID0gMSovCitzdGF0aWMgc3RydWN0IGluZGV4X3ZodF9kYXRhX3JhdGVfdHlwZSBzdXBwb3J0ZWRfdmh0X21jc19yYXRlX25zczFbXSA9IHsKKy8qIE1DUyAgTDgwICAgIFM4MCAgICAgTDQwICAgUzQwICAgIEwyMCAgIFM0MCovCisJezAsIHsyOTMsIDMyNX0sIHsxMzUsIDE1MH0sIHs2NSwgNzJ9IH0sCisJezEsIHs1ODUsIDY1MH0sIHsyNzAsIDMwMH0sIHsxMzAsIDE0NH0gfSwKKwl7Miwgezg3OCwgOTc1fSwgezQwNSwgNDUwfSwgezE5NSwgMjE3fSB9LAorCXszLCB7MTE3MCwgMTMwMH0sIHs1NDAsIDYwMH0sIHsyNjAsIDI4OX0gfSwKKwl7NCwgezE3NTUsIDE5NTB9LCB7ODEwLCA5MDB9LCB7MzkwLCA0MzN9IH0sCisJezUsIHsyMzQwLCAyNjAwfSwgezEwODAsIDEyMDB9LCB7NTIwLCA1Nzh9IH0sCisJezYsIHsyNjMzLCAyOTI1fSwgezEyMTUsIDEzNTB9LCB7NTg1LCA2NTB9IH0sCisJezcsIHsyOTI1LCAzMjUwfSwgezEzNTAsIDE1MDB9LCB7NjUwLCA3MjJ9IH0sCisJezgsIHszNTEwLCAzOTAwfSwgezE2MjAsIDE4MDB9LCB7NzgwLCA4Njd9IH0sCisJezksIHszOTAwLCA0MzMzfSwgezE4MDAsIDIwMDB9LCB7NzgwLCA4Njd9IH0KK307CisKKy8qTUNTIHBhcmFtZXRlcnMgd2l0aCBOc3MgPSAyKi8KK3N0YXRpYyBzdHJ1Y3QgaW5kZXhfdmh0X2RhdGFfcmF0ZV90eXBlIHN1cHBvcnRlZF92aHRfbWNzX3JhdGVfbnNzMltdID0geworLyogTUNTICBMODAgICAgUzgwICAgICBMNDAgICBTNDAgICAgTDIwICAgUzQwKi8KKwl7MCwgezU4NSwgNjUwfSwgezI3MCwgMzAwfSwgezEzMCwgMTQ0fSB9LAorCXsxLCB7MTE3MCwgMTMwMH0sIHs1NDAsIDYwMH0sIHsyNjAsIDI4OX0gfSwKKwl7MiwgezE3NTUsIDE5NTB9LCB7ODEwLCA5MDB9LCB7MzkwLCA0MzN9IH0sCisJezMsIHsyMzQwLCAyNjAwfSwgezEwODAsIDEyMDB9LCB7NTIwLCA1Nzh9IH0sCisJezQsIHszNTEwLCAzOTAwfSwgezE2MjAsIDE4MDB9LCB7NzgwLCA4Njd9IH0sCisJezUsIHs0NjgwLCA1MjAwfSwgezIxNjAsIDI0MDB9LCB7MTA0MCwgMTE1Nn0gfSwKKwl7NiwgezUyNjUsIDU4NTB9LCB7MjQzMCwgMjcwMH0sIHsxMTcwLCAxMzAwfSB9LAorCXs3LCB7NTg1MCwgNjUwMH0sIHsyNzAwLCAzMDAwfSwgezEzMDAsIDE0NDR9IH0sCisJezgsIHs3MDIwLCA3ODAwfSwgezMyNDAsIDM2MDB9LCB7MTU2MCwgMTczM30gfSwKKwl7OSwgezc4MDAsIDg2Njd9LCB7MzYwMCwgNDAwMH0sIHsxNTYwLCAxNzMzfSB9Cit9OworI2VuZGlmIC8qIEVuZCBvZiBXTEFOX0ZFQVRVUkVfMTFBQyAqLworCisvKmFycmF5IGluZGV4IHBvbmludHMgdG8gTUNTIGFuZCBhcnJheSB2YWx1ZSBwb2ludHMgcmVzcGVjdGl2ZSByc3NpKi8KK3N0YXRpYyBpbnQgcnNzaV9tY3NfdGJsW11bMTBdID0geworLypNQ1MgMCAgIDEgICAgIDIgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5Ki8KKwl7LTgyLCAtNzksIC03NywgLTc0LCAtNzAsIC02NiwgLTY1LCAtNjQsIC01OSwgLTU3fSwgICAgIC8qIDIwICovCisJey03OSwgLTc2LCAtNzQsIC03MSwgLTY3LCAtNjMsIC02MiwgLTYxLCAtNTYsIC01NH0sICAgICAvKiA0MCAqLworCXstNzYsIC03MywgLTcxLCAtNjgsIC02NCwgLTYwLCAtNTksIC01OCwgLTUzLCAtNTF9IC8qIDgwICovCit9OworCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUworCisvKioKKyAqIHB1dF93aWZpX3JhdGVfc3RhdCgpIC0gcHV0IHdpZmkgcmF0ZSBzdGF0cworICogQHN0YXRzOiBQb2ludGVyIHRvIHN0YXRzIGNvbnRleHQKKyAqIEB2ZW5kb3JfZXZlbnQ6IFBvaW50ZXIgdG8gdmVuZG9yIGV2ZW50CisgKgorICogUmV0dXJuOiBib29sCisgKi8KK3N0YXRpYyBib29sIHB1dF93aWZpX3JhdGVfc3RhdCh0cFNpcldpZmlSYXRlU3RhdCBzdGF0cywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqdmVuZG9yX2V2ZW50KQoreworCWlmIChubGFfcHV0X3U4KHZlbmRvcl9ldmVudCwKKwkJICAgICAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBVEVfUFJFQU1CTEUsCisJCSAgICAgICBzdGF0cy0+cmF0ZS5wcmVhbWJsZSkgfHwKKwkgICAgbmxhX3B1dF91OCh2ZW5kb3JfZXZlbnQsCisJCSAgICAgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX05TUywKKwkJICAgICAgIHN0YXRzLT5yYXRlLm5zcykgfHwKKwkgICAgbmxhX3B1dF91OCh2ZW5kb3JfZXZlbnQsCisJCSAgICAgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX0JXLAorCQkgICAgICAgc3RhdHMtPnJhdGUuYncpIHx8CisJICAgIG5sYV9wdXRfdTgodmVuZG9yX2V2ZW50LAorCQkgICAgICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9NQ1NfSU5ERVgsCisJCSAgICAgICBzdGF0cy0+cmF0ZS5yYXRlTWNzSWR4KSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX0JJVF9SQVRFLAorCQkJc3RhdHMtPnJhdGUuYml0cmF0ZSkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9UWF9NUERVLAorCQkJICAgc3RhdHMtPnR4TXBkdSkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9SWF9NUERVLAorCQkJICAgc3RhdHMtPnJ4TXBkdSkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFURV9NUERVX0xPU1QsCisJCQkgICBzdGF0cy0+bXBkdUxvc3QpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCSAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBVEVfUkVUUklFUywKKwkJCSAgIHN0YXRzLT5yZXRyaWVzKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQkgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX1JFVFJJRVNfU0hPUlQsCisJCQkgICBzdGF0cy0+cmV0cmllc1Nob3J0KSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQkgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQVRFX1JFVFJJRVNfTE9ORywKKwkJCSAgIHN0YXRzLT5yZXRyaWVzTG9uZykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJRQ0FfV0xBTl9WRU5ET1JfQVRUUiBwdXQgZmFpbCIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIHB1dF93aWZpX3BlZXJfaW5mbygpIC0gcHV0IHdpZmkgcGVlciBpbmZvCisgKiBAc3RhdHM6IFBvaW50ZXIgdG8gc3RhdHMgY29udGV4dAorICogQHZlbmRvcl9ldmVudDogUG9pbnRlciB0byB2ZW5kb3IgZXZlbnQKKyAqCisgKiBSZXR1cm46IGJvb2wKKyAqLworc3RhdGljIGJvb2wgcHV0X3dpZmlfcGVlcl9pbmZvKHRwU2lyV2lmaVBlZXJJbmZvIHN0YXRzLAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICp2ZW5kb3JfZXZlbnQpCit7CisJdTMyIGkgPSAwOworCXRwU2lyV2lmaVJhdGVTdGF0IHBSYXRlU3RhdHM7CisKKwlpZiAobmxhX3B1dF91MzIKKwkJICAgICh2ZW5kb3JfZXZlbnQsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1BFRVJfSU5GT19UWVBFLAorCQkgICAgc3RhdHMtPnR5cGUpIHx8CisJICAgIG5sYV9wdXQodmVuZG9yX2V2ZW50LAorCQkgICAgICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUEVFUl9JTkZPX01BQ19BRERSRVNTLAorCQkgICAgICAgQ0RGX01BQ19BRERSX1NJWkUsICZzdGF0cy0+cGVlck1hY0FkZHJlc3MuYnl0ZXNbMF0pIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCSAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1BFRVJfSU5GT19DQVBBQklMSVRJRVMsCisJCQkgICBzdGF0cy0+Y2FwYWJpbGl0aWVzKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQkgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19QRUVSX0lORk9fTlVNX1JBVEVTLAorCQkJICAgc3RhdHMtPm51bVJhdGUpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiUUNBX1dMQU5fVkVORE9SX0FUVFIgcHV0IGZhaWwiKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKHN0YXRzLT5udW1SYXRlKSB7CisJCXN0cnVjdCBubGF0dHIgKnJhdGVJbmZvOworCQlzdHJ1Y3QgbmxhdHRyICpyYXRlczsKKworCQlyYXRlSW5mbyA9IG5sYV9uZXN0X3N0YXJ0KHZlbmRvcl9ldmVudCwKKwkJCQkJICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19QRUVSX0lORk9fUkFURV9JTkZPKTsKKwkJaWYgKHJhdGVJbmZvID09IE5VTEwpCisJCQlnb3RvIGVycm9yOworCisJCWZvciAoaSA9IDA7IGkgPCBzdGF0cy0+bnVtUmF0ZTsgaSsrKSB7CisJCQlwUmF0ZVN0YXRzID0gKHRwU2lyV2lmaVJhdGVTdGF0KSAoKHVpbnQ4X3QgKikKKwkJCQkJCQkgIHN0YXRzLT5yYXRlU3RhdHMgKworCQkJCQkJCSAgKGkgKgorCQkJCQkJCSAgIHNpemVvZgorCQkJCQkJCSAgICh0U2lyV2lmaVJhdGVTdGF0KSkpOworCQkJcmF0ZXMgPSBubGFfbmVzdF9zdGFydCh2ZW5kb3JfZXZlbnQsIGkpOworCQkJaWYgKHJhdGVzID09IE5VTEwpCisJCQkJZ290byBlcnJvcjsKKworCQkJaWYgKGZhbHNlID09CisJCQkgICAgcHV0X3dpZmlfcmF0ZV9zdGF0KHBSYXRlU3RhdHMsIHZlbmRvcl9ldmVudCkpIHsKKwkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgICAgICBGTCgiUUNBX1dMQU5fVkVORE9SX0FUVFIgcHV0IGZhaWwiKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJbmxhX25lc3RfZW5kKHZlbmRvcl9ldmVudCwgcmF0ZXMpOworCQl9CisJCW5sYV9uZXN0X2VuZCh2ZW5kb3JfZXZlbnQsIHJhdGVJbmZvKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK2Vycm9yOgorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBwdXRfd2lmaV93bW1fYWNfc3RhdCgpIC0gcHV0IHdpZmkgd21tIGFjIHN0YXRzCisgKiBAc3RhdHM6IFBvaW50ZXIgdG8gc3RhdHMgY29udGV4dAorICogQHZlbmRvcl9ldmVudDogUG9pbnRlciB0byB2ZW5kb3IgZXZlbnQKKyAqCisgKiBSZXR1cm46IGJvb2wKKyAqLworc3RhdGljIGJvb2wgcHV0X3dpZmlfd21tX2FjX3N0YXQodHBTaXJXaWZpV21tQWNTdGF0IHN0YXRzLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqdmVuZG9yX2V2ZW50KQoreworCWlmIChubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1dNTV9BQ19BQywKKwkJCXN0YXRzLT5hYykgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX1RYX01QRFUsCisJCQlzdGF0cy0+dHhNcGR1KSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfUlhfTVBEVSwKKwkJCXN0YXRzLT5yeE1wZHUpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1dNTV9BQ19UWF9NQ0FTVCwKKwkJCXN0YXRzLT50eE1jYXN0KSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfUlhfTUNBU1QsCisJCQlzdGF0cy0+cnhNY2FzdCkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX1JYX0FNUERVLAorCQkJc3RhdHMtPnJ4QW1wZHUpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1dNTV9BQ19UWF9BTVBEVSwKKwkJCXN0YXRzLT50eEFtcGR1KSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfTVBEVV9MT1NULAorCQkJc3RhdHMtPm1wZHVMb3N0KSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfUkVUUklFUywKKwkJCXN0YXRzLT5yZXRyaWVzKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfUkVUUklFU19TSE9SVCwKKwkJCXN0YXRzLT5yZXRyaWVzU2hvcnQpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1dNTV9BQ19SRVRSSUVTX0xPTkcsCisJCQlzdGF0cy0+cmV0cmllc0xvbmcpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1dNTV9BQ19DT05URU5USU9OX1RJTUVfTUlOLAorCQkJc3RhdHMtPmNvbnRlbnRpb25UaW1lTWluKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19XTU1fQUNfQ09OVEVOVElPTl9USU1FX01BWCwKKwkJCXN0YXRzLT5jb250ZW50aW9uVGltZU1heCkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0FDX0NPTlRFTlRJT05fVElNRV9BVkcsCisJCQlzdGF0cy0+Y29udGVudGlvblRpbWVBdmcpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1dNTV9BQ19DT05URU5USU9OX05VTV9TQU1QTEVTLAorCQkJc3RhdHMtPmNvbnRlbnRpb25OdW1TYW1wbGVzKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIlFDQV9XTEFOX1ZFTkRPUl9BVFRSIHB1dCBmYWlsIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogcHV0X3dpZmlfaW50ZXJmYWNlX2luZm8oKSAtIHB1dCB3aWZpIGludGVyZmFjZSBpbmZvCisgKiBAc3RhdHM6IFBvaW50ZXIgdG8gc3RhdHMgY29udGV4dAorICogQHZlbmRvcl9ldmVudDogUG9pbnRlciB0byB2ZW5kb3IgZXZlbnQKKyAqCisgKiBSZXR1cm46IGJvb2wKKyAqLworc3RhdGljIGJvb2wgcHV0X3dpZmlfaW50ZXJmYWNlX2luZm8odHBTaXJXaWZpSW50ZXJmYWNlSW5mbyBzdGF0cywKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnZlbmRvcl9ldmVudCkKK3sKKwlpZiAobmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfSU5GT19NT0RFLAorCQkJc3RhdHMtPm1vZGUpIHx8CisJICAgIG5sYV9wdXQodmVuZG9yX2V2ZW50LAorCQkgICAgUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfSU5GT19NQUNfQUREUiwKKwkJICAgIENERl9NQUNfQUREUl9TSVpFLCBzdGF0cy0+bWFjQWRkci5ieXRlcykgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfSU5GT19TVEFURSwKKwkJCXN0YXRzLT5zdGF0ZSkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfSU5GT19ST0FNSU5HLAorCQkJc3RhdHMtPnJvYW1pbmcpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0lORk9fQ0FQQUJJTElUSUVTLAorCQkJc3RhdHMtPmNhcGFiaWxpdGllcykgfHwKKwkgICAgbmxhX3B1dCh2ZW5kb3JfZXZlbnQsCisJCSAgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9JTkZPX1NTSUQsCisJCSAgICBzdHJsZW4oc3RhdHMtPnNzaWQpLCBzdGF0cy0+c3NpZCkgfHwKKwkgICAgbmxhX3B1dCh2ZW5kb3JfZXZlbnQsCisJCSAgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9JTkZPX0JTU0lELAorCQkgICAgQ0RGX01BQ19BRERSX1NJWkUsIHN0YXRzLT5ic3NpZC5ieXRlcykgfHwKKwkgICAgbmxhX3B1dCh2ZW5kb3JfZXZlbnQsCisJCSAgICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9JTkZPX0FQX0NPVU5UUllfU1RSLAorCQkgICAgV05JX0NGR19DT1VOVFJZX0NPREVfTEVOLCBzdGF0cy0+YXBDb3VudHJ5U3RyKSB8fAorCSAgICBubGFfcHV0KHZlbmRvcl9ldmVudCwKKwkJICAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX0lORk9fQ09VTlRSWV9TVFIsCisJCSAgICBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4sIHN0YXRzLT5jb3VudHJ5U3RyKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIlFDQV9XTEFOX1ZFTkRPUl9BVFRSIHB1dCBmYWlsIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogcHV0X3dpZmlfaWZhY2Vfc3RhdHMoKSAtIHB1dCB3aWZpIGludGVyZmFjZSBzdGF0cworICogQHBXaWZpSWZhY2VTdGF0OiBQb2ludGVyIHRvIGludGVyZmFjZSBzdGF0cyBjb250ZXh0CisgKiBAbnVtX3BlZXI6IE51bWJlciBvZiBwZWVycworICogQHZlbmRvcl9ldmVudDogUG9pbnRlciB0byB2ZW5kb3IgZXZlbnQKKyAqCisgKiBSZXR1cm46IGJvb2wKKyAqLworc3RhdGljIGJvb2wgcHV0X3dpZmlfaWZhY2Vfc3RhdHModHBTaXJXaWZpSWZhY2VTdGF0IHBXaWZpSWZhY2VTdGF0LAorCQkJCSB1MzIgbnVtX3BlZXJzLCBzdHJ1Y3Qgc2tfYnVmZiAqdmVuZG9yX2V2ZW50KQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgbmxhdHRyICp3bW1JbmZvOworCXN0cnVjdCBubGF0dHIgKndtbVN0YXRzOworCXU2NCBhdmVyYWdlX3RzZl9vZmZzZXQ7CisKKwlpZiAoZmFsc2UgPT0gcHV0X3dpZmlfaW50ZXJmYWNlX2luZm8oJnBXaWZpSWZhY2VTdGF0LT5pbmZvLAorCQkJCQkgICAgIHZlbmRvcl9ldmVudCkpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJRQ0FfV0xBTl9WRU5ET1JfQVRUUiBwdXQgZmFpbCIpKTsKKwkJcmV0dXJuIGZhbHNlOworCisJfQorCisJYXZlcmFnZV90c2Zfb2Zmc2V0ID0gIHBXaWZpSWZhY2VTdGF0LT5hdmdfYmNuX3NwcmVhZF9vZmZzZXRfaGlnaDsKKwlhdmVyYWdlX3RzZl9vZmZzZXQgPSAgKGF2ZXJhZ2VfdHNmX29mZnNldCA8PCAzMikgfAorCQlwV2lmaUlmYWNlU3RhdC0+YXZnX2Jjbl9zcHJlYWRfb2Zmc2V0X2xvdyA7CisKKwlpZiAobmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfVFlQRSwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1RZUEVfSUZBQ0UpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX05VTV9QRUVSUywKKwkJCW51bV9wZWVycykgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfQkVBQ09OX1JYLAorCQkJcFdpZmlJZmFjZVN0YXQtPmJlYWNvblJ4KSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9NR01UX1JYLAorCQkJcFdpZmlJZmFjZVN0YXQtPm1nbXRSeCkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfTUdNVF9BQ1RJT05fUlgsCisJCQlwV2lmaUlmYWNlU3RhdC0+bWdtdEFjdGlvblJ4KSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9NR01UX0FDVElPTl9UWCwKKwkJCXBXaWZpSWZhY2VTdGF0LT5tZ210QWN0aW9uVHgpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0lGQUNFX1JTU0lfTUdNVCwKKwkJCXBXaWZpSWZhY2VTdGF0LT5yc3NpTWdtdCkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfUlNTSV9EQVRBLAorCQkJcFdpZmlJZmFjZVN0YXQtPnJzc2lEYXRhKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9SU1NJX0FDSywKKwkJCXBXaWZpSWZhY2VTdGF0LT5yc3NpQWNrKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19JRkFDRV9MRUFLWV9BUF9ERVRFQ1RFRCwKKwkJCXBXaWZpSWZhY2VTdGF0LT5pc19sZWFreV9hcCkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfTEVBS1lfQVBfQVZHX05VTV9GUkFNRVNfTEVBS0VELAorCQkJcFdpZmlJZmFjZVN0YXQtPmF2Z19yeF9mcm1zX2xlYWtlZCkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfTEVBS1lfQVBfR1VBUkRfVElNRSwKKwkJCXBXaWZpSWZhY2VTdGF0LT5yeF9sZWFrX3dpbmRvdykgfHwKKwkgICAgbmxhX3B1dF91NjQodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfQVZFUkFHRV9UU0ZfT0ZGU0VULAorCQkJYXZlcmFnZV90c2Zfb2Zmc2V0KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIlFDQV9XTEFOX1ZFTkRPUl9BVFRSIHB1dCBmYWlsIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJd21tSW5mbyA9IG5sYV9uZXN0X3N0YXJ0KHZlbmRvcl9ldmVudCwKKwkJCQkgUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfV01NX0lORk8pOworCWlmICh3bW1JbmZvID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBXSUZJX0FDX01BWDsgaSsrKSB7CisJCXdtbVN0YXRzID0gbmxhX25lc3Rfc3RhcnQodmVuZG9yX2V2ZW50LCBpKTsKKwkJaWYgKHdtbVN0YXRzID09IE5VTEwpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJaWYgKGZhbHNlID09CisJCSAgICBwdXRfd2lmaV93bW1fYWNfc3RhdCgmcFdpZmlJZmFjZVN0YXQtPkFjY2Vzc2NsYXNzU3RhdHNbaV0sCisJCQkJCSB2ZW5kb3JfZXZlbnQpKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIEZMKCJwdXRfd2lmaV93bW1fYWNfc3RhdCBGYWlsIikpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJbmxhX25lc3RfZW5kKHZlbmRvcl9ldmVudCwgd21tU3RhdHMpOworCX0KKwlubGFfbmVzdF9lbmQodmVuZG9yX2V2ZW50LCB3bW1JbmZvKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBoZGRfbWFwX2RldmljZV90b19sbF9pZmFjZV9tb2RlKCkgLSBtYXAgZGV2aWNlIHRvIGxpbmsgbGF5ZXIgaW50ZXJmYWNlIG1vZGUKKyAqIEBkZXZpY2VNb2RlOiBEZXZpY2UgbW9kZQorICoKKyAqIFJldHVybjogaW50ZXJmYWNlIG1vZGUKKyAqLworc3RhdGljIHRTaXJXaWZpSW50ZXJmYWNlTW9kZSBoZGRfbWFwX2RldmljZV90b19sbF9pZmFjZV9tb2RlKGludCBkZXZpY2VNb2RlKQoreworCXN3aXRjaCAoZGV2aWNlTW9kZSkgeworCWNhc2UgV0xBTl9IRERfSU5GUkFfU1RBVElPTjoKKwkJcmV0dXJuIFdJRklfSU5URVJGQUNFX1NUQTsKKwljYXNlIFdMQU5fSEREX1NPRlRBUDoKKwkJcmV0dXJuIFdJRklfSU5URVJGQUNFX1NPRlRBUDsKKwljYXNlIFdMQU5fSEREX1AyUF9DTElFTlQ6CisJCXJldHVybiBXSUZJX0lOVEVSRkFDRV9QMlBfQ0xJRU5UOworCWNhc2UgV0xBTl9IRERfUDJQX0dPOgorCQlyZXR1cm4gV0lGSV9JTlRFUkZBQ0VfUDJQX0dPOworCWNhc2UgV0xBTl9IRERfSUJTUzoKKwkJcmV0dXJuIFdJRklfSU5URVJGQUNFX0lCU1M7CisJZGVmYXVsdDoKKwkJLyogUmV0dXJuIEludGVyZmFjZSBNb2RlIGFzIFNUQSBmb3IgYWxsIHRoZSB1bnN1cHBvcnRlZCBtb2RlcyAqLworCQlyZXR1cm4gV0lGSV9JTlRFUkZBQ0VfU1RBOworCX0KK30KKworLyoqCisgKiBoZGRfZ2V0X2ludGVyZmFjZV9pbmZvKCkgLSBnZXQgaW50ZXJmYWNlIGluZm8KKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBkZXZpY2UgYWRhcHRlcgorICogQHBJbmZvOiBQb2ludGVyIHRvIGludGVyZmFjZSBpbmZvCisgKgorICogUmV0dXJuOiBib29sCisgKi8KK3N0YXRpYyBib29sIGhkZF9nZXRfaW50ZXJmYWNlX2luZm8oaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgdHBTaXJXaWZpSW50ZXJmYWNlSW5mbyBwSW5mbykKK3sKKwl1aW50OF90ICpzdGFNYWMgPSBOVUxMOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4OworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlwSW5mby0+bW9kZSA9IGhkZF9tYXBfZGV2aWNlX3RvX2xsX2lmYWNlX21vZGUocEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKworCWNkZl9jb3B5X21hY2FkZHIoJnBJbmZvLT5tYWNBZGRyLCAmcEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50KTsKKworCWlmICgoKFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSB8fAorCSAgICAgKFdMQU5fSEREX1AyUF9DTElFTlQgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSB8fAorCSAgICAgKFdMQU5fSEREX1AyUF9ERVZJQ0UgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSkpIHsKKwkJcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCQlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQgPT0KKwkJICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJCXBJbmZvLT5zdGF0ZSA9IFdJRklfRElTQ09OTkVDVEVEOworCQl9CisJCWlmIChlQ29ubmVjdGlvblN0YXRlX0Nvbm5lY3RpbmcgPT0KKwkJICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBTZXNzaW9uIElEICVkLCBDb25uZWN0aW9uIGlzIGluIHByb2dyZXNzIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJCQlwSW5mby0+c3RhdGUgPSBXSUZJX0FTU09DSUFUSU5HOworCQl9CisJCWlmICgoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09CisJCSAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKwkJICAgICYmIChmYWxzZSA9PSBwSGRkU3RhQ3R4LT5jb25uX2luZm8udUlzQXV0aGVudGljYXRlZCkpIHsKKwkJCXN0YU1hYyA9CisJCQkJKHVpbnQ4X3QgKikgJihwQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuCisJCQkJCSAgICAgIGJ5dGVzWzBdKTsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBjbGllbnQgIiBNQUNfQUREUkVTU19TVFIKKwkJCSAgICAgICAiIGlzIGluIHRoZSBtaWRkbGUgb2YgV1BTL0VBUE9MIGV4Y2hhbmdlLiIsCisJCQkgICAgICAgX19mdW5jX18sIE1BQ19BRERSX0FSUkFZKHN0YU1hYykpOworCQkJcEluZm8tPnN0YXRlID0gV0lGSV9BVVRIRU5USUNBVElORzsKKwkJfQorCQlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09CisJCSAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSB7CisJCQlwSW5mby0+c3RhdGUgPSBXSUZJX0FTU09DSUFURUQ7CisJCQljZGZfY29weV9tYWNhZGRyKCZwSW5mby0+YnNzaWQsCisJCQkJCSAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkKTsKKwkJCWNkZl9tZW1fY29weShwSW5mby0+c3NpZCwKKwkJCQkgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5TU0lELlNTSUQuc3NJZCwKKwkJCQkgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5TU0lELlNTSUQubGVuZ3RoKTsKKwkJCS8qCisJCQkgKiBOVUxMIFRlcm1pbmF0ZSB0aGUgc3RyaW5nCisJCQkgKi8KKwkJCXBJbmZvLT5zc2lkW3BIZGRTdGFDdHgtPmNvbm5faW5mby5TU0lELlNTSUQubGVuZ3RoXSA9IDA7CisJCX0KKwl9CisKKwljZGZfbWVtX2NvcHkocEluZm8tPmNvdW50cnlTdHIsCisJCSAgICAgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnQsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTik7CisKKwljZGZfbWVtX2NvcHkocEluZm8tPmFwQ291bnRyeVN0ciwKKwkJICAgICBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwgV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKTsKKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGhkZF9saW5rX2xheWVyX3Byb2Nlc3NfcGVlcl9zdGF0cygpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIKKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byBkZXZpY2UgYWRhcHRlcgorICogQG1vcmVfZGF0YTogTW9yZSBkYXRhCisgKiBAcERhdGE6IFBvaW50ZXIgdG8gc3RhdHMgZGF0YQorICoKKyAqIFJlY2VpdmluZyBMaW5rIExheWVyIFBlZXIgc3RhdGlzdGljcyBmcm9tIEZXLlRoaXMgZnVuY3Rpb24gY29udmVydHMKKyAqIHRoZSBmaXJtd2FyZSBkYXRhIHRvIHRoZSBOTCBkYXRhIGFuZCBzZW5kcyB0aGUgc2FtZSB0byB0aGUga2VybmVsL3VwcGVyCisgKiBsYXllcnMuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9saW5rX2xheWVyX3Byb2Nlc3NfcGVlcl9zdGF0cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJICAgICAgdTMyIG1vcmVfZGF0YSwKKwkJCQkJICAgICAgdHBTaXJXaWZpUGVlclN0YXQgcERhdGEpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXRwU2lyV2lmaVJhdGVTdGF0IHBXaWZpUmF0ZVN0YXQ7CisJdHBTaXJXaWZpUGVlclN0YXQgcFdpZmlQZWVyU3RhdDsKKwl0cFNpcldpZmlQZWVySW5mbyBwV2lmaVBlZXJJbmZvOworCXN0cnVjdCBza19idWZmICp2ZW5kb3JfZXZlbnQ7CisJaW50IHN0YXR1cywgaSwgajsKKwlzdHJ1Y3QgbmxhdHRyICpwZWVyczsKKwlpbnQgbnVtUmF0ZTsKKworCXBXaWZpUGVlclN0YXQgPSBwRGF0YTsKKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJICAgICAgICJMTF9TVEFUU19QRUVSX0FMTCA6IG51bVBlZXJzICV1LCBtb3JlIGRhdGEgPSAldSIsCisJICAgICAgIHBXaWZpUGVlclN0YXQtPm51bVBlZXJzLCBtb3JlX2RhdGEpOworCisJZm9yIChpID0gMDsgaSA8IHBXaWZpUGVlclN0YXQtPm51bVBlZXJzOyBpKyspIHsKKwkJcFdpZmlQZWVySW5mbyA9ICh0cFNpcldpZmlQZWVySW5mbykKKwkJCSgodWludDhfdCAqKSBwV2lmaVBlZXJTdGF0LT5wZWVySW5mbyArCisJCQkgKGkgKiBzaXplb2YodFNpcldpZmlQZWVySW5mbykpKTsKKworCQlpZiAoV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpCisJCQlwV2lmaVBlZXJJbmZvLT50eXBlID0gV0lGSV9QRUVSX0FQOworCisJCWlmIChXTEFOX0hERF9QMlBfQ0xJRU5UID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkKKwkJCXBXaWZpUGVlckluZm8tPnR5cGUgPSBXSUZJX1BFRVJfUDJQX0dPOworCisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAgICAgICIgJWQpIExMX1NUQVRTIENoYW5uZWwgU3RhdHMgIgorCQkgICAgICAgIiBQZWVyIFR5cGUgJXUgIgorCQkgICAgICAgIiBwZWVyTWFjQWRkcmVzcyAgJXBNICIKKwkJICAgICAgICIgY2FwYWJpbGl0aWVzIDB4JXggIgorCQkgICAgICAgIiBudW1SYXRlICV1ICIsCisJCSAgICAgICBpLAorCQkgICAgICAgcFdpZmlQZWVySW5mby0+dHlwZSwKKwkJICAgICAgIHBXaWZpUGVlckluZm8tPnBlZXJNYWNBZGRyZXNzLmJ5dGVzLAorCQkgICAgICAgcFdpZmlQZWVySW5mby0+Y2FwYWJpbGl0aWVzLCBwV2lmaVBlZXJJbmZvLT5udW1SYXRlKTsKKwkJeworCQkJZm9yIChqID0gMDsgaiA8IHBXaWZpUGVlckluZm8tPm51bVJhdGU7IGorKykgeworCQkJCXBXaWZpUmF0ZVN0YXQgPSAodHBTaXJXaWZpUmF0ZVN0YXQpCisJCQkJCQkoKHVpbnQ4X3QgKikgcFdpZmlQZWVySW5mby0+cmF0ZVN0YXRzICsKKwkJCQkJCSAoaiAqIHNpemVvZih0U2lyV2lmaVJhdGVTdGF0KSkpOworCisJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgICAgICAiICAgcGVlciBSYXRlIFN0YXRzICIKKwkJCQkgICAgICAgIiAgIHByZWFtYmxlICAldSAiCisJCQkJICAgICAgICIgICBuc3MgJXUgIgorCQkJCSAgICAgICAiICAgYncgJXUgIgorCQkJCSAgICAgICAiICAgcmF0ZU1jc0lkeCAgJXUgIgorCQkJCSAgICAgICAiICAgcmVzZXJ2ZWQgJXUgIgorCQkJCSAgICAgICAiICAgYml0cmF0ZSAldSAiCisJCQkJICAgICAgICIgICB0eE1wZHUgJXUgIgorCQkJCSAgICAgICAiICAgcnhNcGR1ICV1ICIKKwkJCQkgICAgICAgIiAgIG1wZHVMb3N0ICV1ICIKKwkJCQkgICAgICAgIiAgIHJldHJpZXMgJXUgIgorCQkJCSAgICAgICAiICAgcmV0cmllc1Nob3J0ICV1ICIKKwkJCQkgICAgICAgIiAgIHJldHJpZXNMb25nICV1IiwKKwkJCQkgICAgICAgcFdpZmlSYXRlU3RhdC0+cmF0ZS5wcmVhbWJsZSwKKwkJCQkgICAgICAgcFdpZmlSYXRlU3RhdC0+cmF0ZS5uc3MsCisJCQkJICAgICAgIHBXaWZpUmF0ZVN0YXQtPnJhdGUuYncsCisJCQkJICAgICAgIHBXaWZpUmF0ZVN0YXQtPnJhdGUucmF0ZU1jc0lkeCwKKwkJCQkgICAgICAgcFdpZmlSYXRlU3RhdC0+cmF0ZS5yZXNlcnZlZCwKKwkJCQkgICAgICAgcFdpZmlSYXRlU3RhdC0+cmF0ZS5iaXRyYXRlLAorCQkJCSAgICAgICBwV2lmaVJhdGVTdGF0LT50eE1wZHUsCisJCQkJICAgICAgIHBXaWZpUmF0ZVN0YXQtPnJ4TXBkdSwKKwkJCQkgICAgICAgcFdpZmlSYXRlU3RhdC0+bXBkdUxvc3QsCisJCQkJICAgICAgIHBXaWZpUmF0ZVN0YXQtPnJldHJpZXMsCisJCQkJICAgICAgIHBXaWZpUmF0ZVN0YXQtPnJldHJpZXNTaG9ydCwKKwkJCQkgICAgICAgcFdpZmlSYXRlU3RhdC0+cmV0cmllc0xvbmcpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHNpemUgb2YgNDA5NiBmb3IgdGhlIHBlZXIgc3RhdHMgY29tcHJpc2luZworCSAqIGVhY2ggb2Ygc2l6ZSA9IHNpemVvZiAodFNpcldpZmlQZWVySW5mbykgKyBudW1SYXRlICoKKwkgKiBzaXplb2YgKHRTaXJXaWZpUmF0ZVN0YXQpLkVhY2ggZmllbGQgaXMgcHV0IHdpdGggYW4KKwkgKiBOTCBhdHRyaWJ1dGUuVGhlIHNpemUgb2YgNDA5NiBpcyBjb25zaWRlcmVkIGFzc3VtaW5nCisJICogdGhhdCBudW1iZXIgb2YgcmF0ZXMgc2hhbGwgbm90IGV4Y2VlZCBiZXlvbmQgNTAgd2l0aAorCSAqIHRoZSBzaXplb2YgKHRTaXJXaWZpUmF0ZVN0YXQpIGJlaW5nIDMyLgorCSAqLworCXZlbmRvcl9ldmVudCA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiKHBIZGRDdHgtPndpcGh5LAorCQkJCUxMX1NUQVRTX0VWRU5UX0JVRl9TSVpFKTsKKworCWlmICghdmVuZG9yX2V2ZW50KSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoImNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19UWVBFLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfVFlQRV9QRUVSKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SRVNVTFRTX01PUkVfREFUQSwKKwkJCW1vcmVfZGF0YSkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfSUZBQ0VfTlVNX1BFRVJTLAorCQkJcFdpZmlQZWVyU3RhdC0+bnVtUGVlcnMpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IFFDQV9XTEFOX1ZFTkRPUl9BVFRSIHB1dCBmYWlsIiwgX19mdW5jX18pOworCisJCWtmcmVlX3NrYih2ZW5kb3JfZXZlbnQpOworCQlyZXR1cm47CisJfQorCisJcFdpZmlQZWVySW5mbyA9ICh0cFNpcldpZmlQZWVySW5mbykgKCh1aW50OF90ICopCisJCQkJCSAgICAgcFdpZmlQZWVyU3RhdC0+cGVlckluZm8pOworCisJaWYgKHBXaWZpUGVlclN0YXQtPm51bVBlZXJzKSB7CisJCXN0cnVjdCBubGF0dHIgKnBlZXJJbmZvOworCQlwZWVySW5mbyA9IG5sYV9uZXN0X3N0YXJ0KHZlbmRvcl9ldmVudCwKKwkJCQkJICBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19QRUVSX0lORk8pOworCQlpZiAocGVlckluZm8gPT0gTlVMTCkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJubGFfbmVzdF9zdGFydCBmYWlsZWQiKSk7CisJCQlrZnJlZV9za2IodmVuZG9yX2V2ZW50KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWZvciAoaSA9IDE7IGkgPD0gcFdpZmlQZWVyU3RhdC0+bnVtUGVlcnM7IGkrKykgeworCQkJcGVlcnMgPSBubGFfbmVzdF9zdGFydCh2ZW5kb3JfZXZlbnQsIGkpOworCQkJaWYgKHBlZXJzID09IE5VTEwpIHsKKwkJCQloZGRMb2coTE9HRSwgRkwoIm5sYV9uZXN0X3N0YXJ0IGZhaWxlZCIpKTsKKwkJCQlrZnJlZV9za2IodmVuZG9yX2V2ZW50KTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCW51bVJhdGUgPSBwV2lmaVBlZXJJbmZvLT5udW1SYXRlOworCisJCQlpZiAoZmFsc2UgPT0KKwkJCSAgICBwdXRfd2lmaV9wZWVyX2luZm8ocFdpZmlQZWVySW5mbywgdmVuZG9yX2V2ZW50KSkgeworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAgICAgIEZMKCJwdXRfd2lmaV9wZWVyX2luZm8gZmFpbCIpKTsKKwkJCQlrZnJlZV9za2IodmVuZG9yX2V2ZW50KTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXBXaWZpUGVlckluZm8gPSAodHBTaXJXaWZpUGVlckluZm8pICgodWludDhfdCAqKQorCQkJCQkJCSAgICAgcFdpZmlQZWVyU3RhdC0+CisJCQkJCQkJICAgICBwZWVySW5mbyArCisJCQkJCQkJICAgICAoaSAqCisJCQkJCQkJICAgICAgc2l6ZW9mCisJCQkJCQkJICAgICAgKHRTaXJXaWZpUGVlckluZm8pKQorCQkJCQkJCSAgICAgKworCQkJCQkJCSAgICAgKG51bVJhdGUgKgorCQkJCQkJCSAgICAgIHNpemVvZgorCQkJCQkJCSAgICAgICh0U2lyV2lmaVJhdGVTdGF0KSkpOworCQkJbmxhX25lc3RfZW5kKHZlbmRvcl9ldmVudCwgcGVlcnMpOworCQl9CisJCW5sYV9uZXN0X2VuZCh2ZW5kb3JfZXZlbnQsIHBlZXJJbmZvKTsKKwl9CisJY2ZnODAyMTFfdmVuZG9yX2NtZF9yZXBseSh2ZW5kb3JfZXZlbnQpOworCXJldHVybjsKK30KKworLyoqCisgKiBoZGRfbGlua19sYXllcl9wcm9jZXNzX2lmYWNlX3N0YXRzKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlcgorICogQHBBZGFwdGVyOiBQb2ludGVyIHRvIGRldmljZSBhZGFwdGVyCisgKiBAcERhdGE6IFBvaW50ZXIgdG8gc3RhdHMgZGF0YQorICogQG51bV9wZWVyczogTnVtYmVyIG9mIHBlZXJzCisgKgorICogUmVjZWl2aW5nIExpbmsgTGF5ZXIgSW50ZXJmYWNlIHN0YXRpc3RpY3MgZnJvbSBGVy5UaGlzIGZ1bmN0aW9uIGNvbnZlcnRzCisgKiB0aGUgZmlybXdhcmUgZGF0YSB0byB0aGUgTkwgZGF0YSBhbmQgc2VuZHMgdGhlIHNhbWUgdG8gdGhlIGtlcm5lbC91cHBlcgorICogbGF5ZXJzLgorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfbGlua19sYXllcl9wcm9jZXNzX2lmYWNlX3N0YXRzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCQkgICAgICAgdHBTaXJXaWZpSWZhY2VTdGF0IHBEYXRhLAorCQkJCQkgICAgICAgdTMyIG51bV9wZWVycykKK3sKKwl0cFNpcldpZmlJZmFjZVN0YXQgcFdpZmlJZmFjZVN0YXQ7CisJc3RydWN0IHNrX2J1ZmYgKnZlbmRvcl9ldmVudDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKworCXBXaWZpSWZhY2VTdGF0ID0gcERhdGE7CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHNpemUgb2YgNDA5NiBmb3IgdGhlIGludGVyZmFjZSBzdGF0cyBjb21wcmlzaW5nCisJICogc2l6ZW9mICh0cFNpcldpZmlJZmFjZVN0YXQpLlRoZSBzaXplIG9mIDQwOTYgaXMgY29uc2lkZXJlZAorCSAqIGFzc3VtaW5nIHRoYXQgYWxsIHRoZXNlIGZpdCB3aXRoIGluIHRoZSBsaW1pdC5QbGVhc2UgdGFrZQorCSAqIGEgY2FsbCBvbiB0aGUgbGltaXQgYmFzZWQgb24gdGhlIGRhdGEgcmVxdWlyZW1lbnRzIG9uCisJICogaW50ZXJmYWNlIHN0YXRpc3RpY3MuCisJICovCisJdmVuZG9yX2V2ZW50ID0gY2ZnODAyMTFfdmVuZG9yX2NtZF9hbGxvY19yZXBseV9za2IocEhkZEN0eC0+d2lwaHksCisJCQkJTExfU1RBVFNfRVZFTlRfQlVGX1NJWkUpOworCisJaWYgKCF2ZW5kb3JfZXZlbnQpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJjZmc4MDIxMV92ZW5kb3JfY21kX2FsbG9jX3JlcGx5X3NrYiBmYWlsZWQiKSk7CisJCXJldHVybjsKKwl9CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICJXTUlfTElOS19TVEFUU19JRkFDRSBEYXRhIik7CisKKwlpZiAoZmFsc2UgPT0gaGRkX2dldF9pbnRlcmZhY2VfaW5mbyhwQWRhcHRlciwgJnBXaWZpSWZhY2VTdGF0LT5pbmZvKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoImhkZF9nZXRfaW50ZXJmYWNlX2luZm8gZ2V0IGZhaWwiKSk7CisJCWtmcmVlX3NrYih2ZW5kb3JfZXZlbnQpOworCQlyZXR1cm47CisJfQorCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAiIE51bSBwZWVycyAldSAiCisJICAgICAgICJMTF9TVEFUU19JRkFDRTogIgorCSAgICAgICAiIE1vZGUgJXUgIgorCSAgICAgICAiIE1BQyAlcE0gIgorCSAgICAgICAiIFN0YXRlICV1ICIKKwkgICAgICAgIiBSb2FtaW5nICV1ICIKKwkgICAgICAgIiBjYXBhYmlsaXRpZXMgMHgleCAiCisJICAgICAgICIgU1NJRCAlcyAiCisJICAgICAgICIgQlNTSUQgJXBNIiwKKwkgICAgICAgbnVtX3BlZXJzLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+aW5mby5tb2RlLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+aW5mby5tYWNBZGRyLmJ5dGVzLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+aW5mby5zdGF0ZSwKKwkgICAgICAgcFdpZmlJZmFjZVN0YXQtPmluZm8ucm9hbWluZywKKwkgICAgICAgcFdpZmlJZmFjZVN0YXQtPmluZm8uY2FwYWJpbGl0aWVzLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+aW5mby5zc2lkLCBwV2lmaUlmYWNlU3RhdC0+aW5mby5ic3NpZC5ieXRlcyk7CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJICAgICAgICIgQVAgY291bnRyeSBzdHI6ICVjJWMlYyIsCisJICAgICAgIHBXaWZpSWZhY2VTdGF0LT5pbmZvLmFwQ291bnRyeVN0clswXSwKKwkgICAgICAgcFdpZmlJZmFjZVN0YXQtPmluZm8uYXBDb3VudHJ5U3RyWzFdLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+aW5mby5hcENvdW50cnlTdHJbMl0pOworCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAiIENvdW50cnkgU3RyIEFzc29jaWF0aW9uOiAlYyVjJWMiLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+aW5mby5jb3VudHJ5U3RyWzBdLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+aW5mby5jb3VudHJ5U3RyWzFdLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+aW5mby5jb3VudHJ5U3RyWzJdKTsKKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkgICAgICAgIiBiZWFjb25SeCAldSAiCisJICAgICAgICIgbWdtdFJ4ICV1ICIKKwkgICAgICAgIiBtZ210QWN0aW9uUnggICV1ICIKKwkgICAgICAgIiBtZ210QWN0aW9uVHggJXUgIgorCSAgICAgICAiIHJzc2lNZ210ICV1ICIKKwkgICAgICAgIiByc3NpRGF0YSAldSAiCisJICAgICAgICIgcnNzaUFjayAldSAiCisJICAgICAgICIgYXZnX2Jjbl9zcHJlYWRfb2Zmc2V0X2hpZ2ggJXUiCisJICAgICAgICIgYXZnX2Jjbl9zcHJlYWRfb2Zmc2V0X2xvdyAldSIKKwkgICAgICAgIiBpcyBsZWFreV9hcCAldSIKKwkgICAgICAgIiBhdmdfcnhfZnJtc19sZWFrZWQgJXUiCisJICAgICAgICIgcnhfbGVha193aW5kb3cgJXUiLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+YmVhY29uUngsCisJICAgICAgIHBXaWZpSWZhY2VTdGF0LT5tZ210UngsCisJICAgICAgIHBXaWZpSWZhY2VTdGF0LT5tZ210QWN0aW9uUngsCisJICAgICAgIHBXaWZpSWZhY2VTdGF0LT5tZ210QWN0aW9uVHgsCisJICAgICAgIHBXaWZpSWZhY2VTdGF0LT5yc3NpTWdtdCwKKwkgICAgICAgcFdpZmlJZmFjZVN0YXQtPnJzc2lEYXRhLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+cnNzaUFjaywKKwkgICAgICAgcFdpZmlJZmFjZVN0YXQtPmF2Z19iY25fc3ByZWFkX29mZnNldF9oaWdoLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+YXZnX2Jjbl9zcHJlYWRfb2Zmc2V0X2xvdywKKwkgICAgICAgcFdpZmlJZmFjZVN0YXQtPmlzX2xlYWt5X2FwLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+YXZnX3J4X2ZybXNfbGVha2VkLAorCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+cnhfbGVha193aW5kb3cpOworCisJZm9yIChpID0gMDsgaSA8IFdJRklfQUNfTUFYOyBpKyspIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICAgICAgIiAlZCkgTExfU1RBVFMgSUZBQ0U6ICIKKwkJICAgICAgICIgYWM6ICAldSAgdHhNcGR1OiAldSAiCisJCSAgICAgICAiIHJ4TXBkdTogJXUgdHhNY2FzdDogJXUgIgorCQkgICAgICAgIiByeE1jYXN0OiAldSAgcnhBbXBkdTogJXUgIgorCQkgICAgICAgIiB0eEFtcGR1OiAgJXUgIG1wZHVMb3N0OiAldSAiCisJCSAgICAgICAiIHJldHJpZXM6ICV1ICByZXRyaWVzU2hvcnQ6ICV1ICIKKwkJICAgICAgICIgcmV0cmllc0xvbmc6ICV1ICBjb250ZW50aW9uVGltZU1pbjogJXUgIgorCQkgICAgICAgIiBjb250ZW50aW9uVGltZU1heDogJXUgIGNvbnRlbnRpb25UaW1lQXZnOiAldSAiCisJCSAgICAgICAiIGNvbnRlbnRpb25OdW1TYW1wbGVzOiAldSIsCisJCSAgICAgICBpLAorCQkgICAgICAgcFdpZmlJZmFjZVN0YXQtPkFjY2Vzc2NsYXNzU3RhdHNbaV0uYWMsCisJCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+QWNjZXNzY2xhc3NTdGF0c1tpXS50eE1wZHUsCisJCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+QWNjZXNzY2xhc3NTdGF0c1tpXS5yeE1wZHUsCisJCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+QWNjZXNzY2xhc3NTdGF0c1tpXS50eE1jYXN0LAorCQkgICAgICAgcFdpZmlJZmFjZVN0YXQtPkFjY2Vzc2NsYXNzU3RhdHNbaV0ucnhNY2FzdCwKKwkJICAgICAgIHBXaWZpSWZhY2VTdGF0LT5BY2Nlc3NjbGFzc1N0YXRzW2ldLnJ4QW1wZHUsCisJCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+QWNjZXNzY2xhc3NTdGF0c1tpXS50eEFtcGR1LAorCQkgICAgICAgcFdpZmlJZmFjZVN0YXQtPkFjY2Vzc2NsYXNzU3RhdHNbaV0ubXBkdUxvc3QsCisJCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+QWNjZXNzY2xhc3NTdGF0c1tpXS5yZXRyaWVzLAorCQkgICAgICAgcFdpZmlJZmFjZVN0YXQtPkFjY2Vzc2NsYXNzU3RhdHNbaV0ucmV0cmllc1Nob3J0LAorCQkgICAgICAgcFdpZmlJZmFjZVN0YXQtPkFjY2Vzc2NsYXNzU3RhdHNbaV0ucmV0cmllc0xvbmcsCisJCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+QWNjZXNzY2xhc3NTdGF0c1tpXS5jb250ZW50aW9uVGltZU1pbiwKKwkJICAgICAgIHBXaWZpSWZhY2VTdGF0LT5BY2Nlc3NjbGFzc1N0YXRzW2ldLmNvbnRlbnRpb25UaW1lTWF4LAorCQkgICAgICAgcFdpZmlJZmFjZVN0YXQtPkFjY2Vzc2NsYXNzU3RhdHNbaV0uY29udGVudGlvblRpbWVBdmcsCisJCSAgICAgICBwV2lmaUlmYWNlU3RhdC0+QWNjZXNzY2xhc3NTdGF0c1tpXS4KKwkJICAgICAgIGNvbnRlbnRpb25OdW1TYW1wbGVzKTsKKwl9CisKKwlpZiAoZmFsc2UgPT0KKwkgICAgcHV0X3dpZmlfaWZhY2Vfc3RhdHMocFdpZmlJZmFjZVN0YXQsIG51bV9wZWVycywgdmVuZG9yX2V2ZW50KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgicHV0X3dpZmlfaWZhY2Vfc3RhdHMgZmFpbCIpKTsKKwkJa2ZyZWVfc2tiKHZlbmRvcl9ldmVudCk7CisJCXJldHVybjsKKwl9CisKKwljZmc4MDIxMV92ZW5kb3JfY21kX3JlcGx5KHZlbmRvcl9ldmVudCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGhkZF9saW5rX2xheWVyX3Byb2Nlc3NfcmFkaW9fc3RhdHMoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyCisgKiBAcEFkYXB0ZXI6IFBvaW50ZXIgdG8gZGV2aWNlIGFkYXB0ZXIKKyAqIEBtb3JlX2RhdGE6IE1vcmUgZGF0YQorICogQHBEYXRhOiBQb2ludGVyIHRvIHN0YXRzIGRhdGEKKyAqIEBudW1fcmFkaW9zOiBOdW1iZXIgb2YgcmFkaW9zCisgKgorICogUmVjZWl2aW5nIExpbmsgTGF5ZXIgUmFkaW8gc3RhdGlzdGljcyBmcm9tIEZXLlRoaXMgZnVuY3Rpb24gY29udmVydHMKKyAqIHRoZSBmaXJtd2FyZSBkYXRhIHRvIHRoZSBOTCBkYXRhIGFuZCBzZW5kcyB0aGUgc2FtZSB0byB0aGUga2VybmVsL3VwcGVyCisgKiBsYXllcnMuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9saW5rX2xheWVyX3Byb2Nlc3NfcmFkaW9fc3RhdHMoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCSAgICAgICB1MzIgbW9yZV9kYXRhLAorCQkJCQkgICAgICAgdHBTaXJXaWZpUmFkaW9TdGF0IHBEYXRhLAorCQkJCQkgICAgICAgdTMyIG51bV9yYWRpbykKK3sKKwlpbnQgc3RhdHVzLCBpOworCXRwU2lyV2lmaVJhZGlvU3RhdCBwV2lmaVJhZGlvU3RhdDsKKwl0cFNpcldpZmlDaGFubmVsU3RhdHMgcFdpZmlDaGFubmVsU3RhdHM7CisJc3RydWN0IHNrX2J1ZmYgKnZlbmRvcl9ldmVudDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKwlwV2lmaVJhZGlvU3RhdCA9IHBEYXRhOworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJICAgICAgICJMTF9TVEFUU19SQURJTyIKKwkgICAgICAgIiBudW1iZXIgb2YgcmFkaW9zID0gJXUiCisJICAgICAgICIgcmFkaW8gaXMgJWQgb25UaW1lIGlzICV1IgorCSAgICAgICAiIHR4VGltZSBpcyAldSAgcnhUaW1lIGlzICV1IgorCSAgICAgICAiIG9uVGltZVNjYW4gaXMgJXUgIG9uVGltZU5iZCBpcyAldSIKKwkgICAgICAgIiBvblRpbWVHc2NhbiBpcyAldSBvblRpbWVSb2FtU2NhbiBpcyAldSIKKwkgICAgICAgIiBvblRpbWVQbm9TY2FuIGlzICV1ICBvblRpbWVIczIwIGlzICV1IgorCSAgICAgICAiIG51bUNoYW5uZWxzIGlzICV1IiwKKwkgICAgICAgbnVtX3JhZGlvLAorCSAgICAgICBwV2lmaVJhZGlvU3RhdC0+cmFkaW8sCisJICAgICAgIHBXaWZpUmFkaW9TdGF0LT5vblRpbWUsCisJICAgICAgIHBXaWZpUmFkaW9TdGF0LT50eFRpbWUsCisJICAgICAgIHBXaWZpUmFkaW9TdGF0LT5yeFRpbWUsCisJICAgICAgIHBXaWZpUmFkaW9TdGF0LT5vblRpbWVTY2FuLAorCSAgICAgICBwV2lmaVJhZGlvU3RhdC0+b25UaW1lTmJkLAorCSAgICAgICBwV2lmaVJhZGlvU3RhdC0+b25UaW1lR3NjYW4sCisJICAgICAgIHBXaWZpUmFkaW9TdGF0LT5vblRpbWVSb2FtU2NhbiwKKwkgICAgICAgcFdpZmlSYWRpb1N0YXQtPm9uVGltZVBub1NjYW4sCisJICAgICAgIHBXaWZpUmFkaW9TdGF0LT5vblRpbWVIczIwLCBwV2lmaVJhZGlvU3RhdC0+bnVtQ2hhbm5lbHMpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHNpemUgb2YgNDA5NiBmb3IgdGhlIFJhZGlvIHN0YXRzIGNvbXByaXNpbmcKKwkgKiBzaXplb2YgKHRTaXJXaWZpUmFkaW9TdGF0KSArIG51bUNoYW5uZWxzICogc2l6ZW9mCisJICogKHRTaXJXaWZpQ2hhbm5lbFN0YXRzKS5FYWNoIGNoYW5uZWwgZGF0YSBpcyBwdXQgd2l0aCBhbgorCSAqIE5MIGF0dHJpYnV0ZS5UaGUgc2l6ZSBvZiA0MDk2IGlzIGNvbnNpZGVyZWQgYXNzdW1pbmcgdGhhdAorCSAqIG51bWJlciBvZiBjaGFubmVscyBzaGFsbCBub3QgZXhjZWVkIGJleW9uZCAgNjAgd2l0aCB0aGUKKwkgKiBzaXplb2YgKHRTaXJXaWZpQ2hhbm5lbFN0YXRzKSBiZWluZyAyNCBieXRlcy4KKwkgKi8KKworCXZlbmRvcl9ldmVudCA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiKHBIZGRDdHgtPndpcGh5LAorCQkJCUxMX1NUQVRTX0VWRU5UX0JVRl9TSVpFKTsKKworCWlmICghdmVuZG9yX2V2ZW50KSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoImNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19UWVBFLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfVFlQRV9SQURJTykgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkVTVUxUU19NT1JFX0RBVEEsCisJCQltb3JlX2RhdGEpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX05VTV9SQURJT1MsCisJCQludW1fcmFkaW8pIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBRElPX0lELAorCQkJcFdpZmlSYWRpb1N0YXQtPnJhZGlvKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19PTl9USU1FLAorCQkJcFdpZmlSYWRpb1N0YXQtPm9uVGltZSkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fVFhfVElNRSwKKwkJCXBXaWZpUmFkaW9TdGF0LT50eFRpbWUpIHx8CisJICAgIG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1JBRElPX1JYX1RJTUUsCisJCQlwV2lmaVJhZGlvU3RhdC0+cnhUaW1lKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19PTl9USU1FX1NDQU4sCisJCQlwV2lmaVJhZGlvU3RhdC0+b25UaW1lU2NhbikgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fT05fVElNRV9OQkQsCisJCQlwV2lmaVJhZGlvU3RhdC0+b25UaW1lTmJkKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19PTl9USU1FX0dTQ0FOLAorCQkJcFdpZmlSYWRpb1N0YXQtPm9uVGltZUdzY2FuKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19PTl9USU1FX1JPQU1fU0NBTiwKKwkJCXBXaWZpUmFkaW9TdGF0LT5vblRpbWVSb2FtU2NhbikgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fT05fVElNRV9QTk9fU0NBTiwKKwkJCXBXaWZpUmFkaW9TdGF0LT5vblRpbWVQbm9TY2FuKSB8fAorCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19SQURJT19PTl9USU1FX0hTMjAsCisJCQlwV2lmaVJhZGlvU3RhdC0+b25UaW1lSHMyMCkgfHwKKwkgICAgbmxhX3B1dF91MzIodmVuZG9yX2V2ZW50LAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfUkFESU9fTlVNX0NIQU5ORUxTLAorCQkJcFdpZmlSYWRpb1N0YXQtPm51bUNoYW5uZWxzKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIlFDQV9XTEFOX1ZFTkRPUl9BVFRSIHB1dCBmYWlsIikpOworCisJCWtmcmVlX3NrYih2ZW5kb3JfZXZlbnQpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBXaWZpUmFkaW9TdGF0LT5udW1DaGFubmVscykgeworCQlzdHJ1Y3QgbmxhdHRyICpjaExpc3Q7CisJCXN0cnVjdCBubGF0dHIgKmNoSW5mbzsKKworCQljaExpc3QgPSBubGFfbmVzdF9zdGFydCh2ZW5kb3JfZXZlbnQsCisJCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIX0lORk8pOworCQlpZiAoY2hMaXN0ID09IE5VTEwpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgibmxhX25lc3Rfc3RhcnQgZmFpbGVkIikpOworCQkJa2ZyZWVfc2tiKHZlbmRvcl9ldmVudCk7CisJCQlyZXR1cm47CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgcFdpZmlSYWRpb1N0YXQtPm51bUNoYW5uZWxzOyBpKyspIHsKKwkJCXBXaWZpQ2hhbm5lbFN0YXRzID0gKHRwU2lyV2lmaUNoYW5uZWxTdGF0cykgKCh1aW50OF90ICopCisJCQkJCQkJCSAgICAgcFdpZmlSYWRpb1N0YXQtPgorCQkJCQkJCQkgICAgIGNoYW5uZWxzICsKKwkJCQkJCQkJICAgICAoaSAqCisJCQkJCQkJCSAgICAgIHNpemVvZgorCQkJCQkJCQkgICAgICAodFNpcldpZmlDaGFubmVsU3RhdHMpKSk7CisKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgICAgICAiICVkKSBDaGFubmVsIEluZm8iCisJCQkgICAgICAgIiAgd2lkdGggaXMgJXUgIgorCQkJICAgICAgICIgIENlbnRlckZyZXEgJXUgIgorCQkJICAgICAgICIgIENlbnRlckZyZXEwICV1ICIKKwkJCSAgICAgICAiICBDZW50ZXJGcmVxMSAldSAiCisJCQkgICAgICAgIiAgb25UaW1lICV1ICIKKwkJCSAgICAgICAiICBjY2FCdXN5VGltZSAldSIsCisJCQkgICAgICAgaSwKKwkJCSAgICAgICBwV2lmaUNoYW5uZWxTdGF0cy0+Y2hhbm5lbC53aWR0aCwKKwkJCSAgICAgICBwV2lmaUNoYW5uZWxTdGF0cy0+Y2hhbm5lbC5jZW50ZXJGcmVxLAorCQkJICAgICAgIHBXaWZpQ2hhbm5lbFN0YXRzLT5jaGFubmVsLmNlbnRlckZyZXEwLAorCQkJICAgICAgIHBXaWZpQ2hhbm5lbFN0YXRzLT5jaGFubmVsLmNlbnRlckZyZXExLAorCQkJICAgICAgIHBXaWZpQ2hhbm5lbFN0YXRzLT5vblRpbWUsCisJCQkgICAgICAgcFdpZmlDaGFubmVsU3RhdHMtPmNjYUJ1c3lUaW1lKTsKKworCQkJY2hJbmZvID0gbmxhX25lc3Rfc3RhcnQodmVuZG9yX2V2ZW50LCBpKTsKKwkJCWlmIChjaEluZm8gPT0gTlVMTCkgeworCQkJCWhkZExvZyhMT0dFLCBGTCgibmxhX25lc3Rfc3RhcnQgZmFpbGVkIikpOworCQkJCWtmcmVlX3NrYih2ZW5kb3JfZXZlbnQpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKG5sYV9wdXRfdTMyKHZlbmRvcl9ldmVudCwKKwkJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0hBTk5FTF9JTkZPX1dJRFRILAorCQkJCQlwV2lmaUNoYW5uZWxTdGF0cy0+Y2hhbm5lbC53aWR0aCkgfHwKKwkJCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfSU5GT19DRU5URVJfRlJFUSwKKwkJCQkJcFdpZmlDaGFubmVsU3RhdHMtPmNoYW5uZWwuY2VudGVyRnJlcSkgfHwKKwkJCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQkJCSAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfSU5GT19DRU5URVJfRlJFUTAsCisJCQkJCSAgIHBXaWZpQ2hhbm5lbFN0YXRzLT5jaGFubmVsLgorCQkJCQkgICBjZW50ZXJGcmVxMCkgfHwKKwkJCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQkJCSAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfSU5GT19DRU5URVJfRlJFUTEsCisJCQkJCSAgIHBXaWZpQ2hhbm5lbFN0YXRzLT5jaGFubmVsLgorCQkJCQkgICBjZW50ZXJGcmVxMSkgfHwKKwkJCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQkJCSAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfT05fVElNRSwKKwkJCQkJICAgcFdpZmlDaGFubmVsU3RhdHMtPm9uVGltZSkgfHwKKwkJCSAgICBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsCisJCQkJCSAgIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NIQU5ORUxfQ0NBX0JVU1lfVElNRSwKKwkJCQkJICAgcFdpZmlDaGFubmVsU3RhdHMtPmNjYUJ1c3lUaW1lKSkgeworCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAgICAgIEZMKCJubGFfcHV0IGZhaWxlZCIpKTsKKwkJCQlrZnJlZV9za2IodmVuZG9yX2V2ZW50KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlubGFfbmVzdF9lbmQodmVuZG9yX2V2ZW50LCBjaEluZm8pOworCQl9CisJCW5sYV9uZXN0X2VuZCh2ZW5kb3JfZXZlbnQsIGNoTGlzdCk7CisJfQorCWNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkodmVuZG9yX2V2ZW50KTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfbGlua19sYXllcl9zdGF0c19jYWxsYmFjaygpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIEBjdHg6IFBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqIEBpbmRUeXBlOiBJbmRpY2F0aW9uIHR5cGUKKyAqIEBwUnNwOiBQb2ludGVyIHRvIHJlc3BvbnNlCisgKgorICogQWZ0ZXIgcmVjZWl2aW5nIExpbmsgTGF5ZXIgaW5kaWNhdGlvbnMgZnJvbSBGVy5UaGlzIGNhbGxiYWNrIGNvbnZlcnRzIHRoZQorICogZmlybXdhcmUgZGF0YSB0byB0aGUgTkwgZGF0YSBhbmQgc2VuZCB0aGUgc2FtZSB0byB0aGUga2VybmVsL3VwcGVyIGxheWVycy4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfbGlua19sYXllcl9zdGF0c19jYWxsYmFjayh2b2lkICpjdHgsCisJCQkJCQkJaW50IGluZFR5cGUsIHZvaWQgKnBSc3ApCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopIGN0eDsKKwlzdHJ1Y3QgaGRkX2xsX3N0YXRzX2NvbnRleHQgKmNvbnRleHQ7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOworCXRwU2lyTExTdGF0c1Jlc3VsdHMgbGlua0xheWVyU3RhdHNSZXN1bHRzID0gKHRwU2lyTExTdGF0c1Jlc3VsdHMpIHBSc3A7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuOworCX0KKworCXBBZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyX2J5X3ZkZXYocEhkZEN0eCwKKwkJCQkJICAgbGlua0xheWVyU3RhdHNSZXN1bHRzLT5pZmFjZUlkKTsKKworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHZkZXZfaWQgJWQgZG9lcyBub3QgZXhpc3Qgd2l0aCBob3N0IiwKKwkJCSAgX19mdW5jX18sIGxpbmtMYXllclN0YXRzUmVzdWx0cy0+aWZhY2VJZCk7CisJCXJldHVybjsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogTGluayBMYXllciBJbmRpY2F0aW9uIGluZFR5cGU6ICVkIiwgX19mdW5jX18sIGluZFR5cGUpOworCisJc3dpdGNoIChpbmRUeXBlKSB7CisJY2FzZSBTSVJfSEFMX0xMX1NUQVRTX1JFU1VMVFNfUlNQOgorCXsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICAgICAgRkwoIlJFU1BPTlNFIFNJUl9IQUxfTExfU1RBVFNfUkVTVUxUU19SU1AiKSk7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAgICAgICJMTF9TVEFUUyBSRVNVTFRTIFJFU1BPTlNFIHBhcmFtSUQgPSAweCV4IiwKKwkJICAgICAgIGxpbmtMYXllclN0YXRzUmVzdWx0cy0+cGFyYW1JZCk7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAgICAgICJMTF9TVEFUUyBSRVNVTFRTIFJFU1BPTlNFIGlmYWNlSWQgPSAldSIsCisJCSAgICAgICBsaW5rTGF5ZXJTdGF0c1Jlc3VsdHMtPmlmYWNlSWQpOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICAgICAiTExfU1RBVFMgUkVTVUxUUyBSRVNQT05TRSByZXNwSWQgPSAldSIsCisJCSAgICAgICBsaW5rTGF5ZXJTdGF0c1Jlc3VsdHMtPnJzcElkKTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICAgICAgIkxMX1NUQVRTIFJFU1VMVFMgUkVTUE9OU0UgbW9yZSBkYXRhID0gJXUiLAorCQkgICAgICAgbGlua0xheWVyU3RhdHNSZXN1bHRzLT5tb3JlUmVzdWx0VG9Gb2xsb3cpOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICAgICAiTExfU1RBVFMgUkVTVUxUUyBSRVNQT05TRSBudW0gcmFkaW8gPSAldSIsCisJCSAgICAgICBsaW5rTGF5ZXJTdGF0c1Jlc3VsdHMtPm51bV9yYWRpbyk7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAgICAgICJMTF9TVEFUUyBSRVNVTFRTIFJFU1BPTlNFIHJlc3VsdCA9ICVwIiwKKwkJICAgICAgIGxpbmtMYXllclN0YXRzUmVzdWx0cy0+cmVzdWx0cyk7CisKKwkJY29udGV4dCA9ICZsbF9zdGF0c19jb250ZXh0OworCQlzcGluX2xvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisJCS8qIHZhbGlkYXRlIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gdGFyZ2V0ICovCisJCWlmICgoY29udGV4dC0+cmVxdWVzdF9pZCAhPSBsaW5rTGF5ZXJTdGF0c1Jlc3VsdHMtPnJzcElkKSB8fAorCQkgICEoY29udGV4dC0+cmVxdWVzdF9iaXRtYXAgJiBsaW5rTGF5ZXJTdGF0c1Jlc3VsdHMtPnBhcmFtSWQpKSB7CisJCQlzcGluX3VubG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJFcnJvciA6IFJlcXVlc3QgaWQgJWQgcmVzcG9uc2UgaWQgJWQgcmVxdWVzdCBiaXRtYXAgMHgleCByZXNwb25zZSBiaXRtYXAgMHgleCIpLAorCQkJY29udGV4dC0+cmVxdWVzdF9pZCwgbGlua0xheWVyU3RhdHNSZXN1bHRzLT5yc3BJZCwKKwkJCWNvbnRleHQtPnJlcXVlc3RfYml0bWFwLCBsaW5rTGF5ZXJTdGF0c1Jlc3VsdHMtPnBhcmFtSWQpOworCQkJcmV0dXJuOworCQl9CisJCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJCWlmIChsaW5rTGF5ZXJTdGF0c1Jlc3VsdHMtPgorCQkgICAgcGFyYW1JZCAmIFdNSV9MSU5LX1NUQVRTX1JBRElPKSB7CisJCQloZGRfbGlua19sYXllcl9wcm9jZXNzX3JhZGlvX3N0YXRzKHBBZGFwdGVyLAorCQkJCWxpbmtMYXllclN0YXRzUmVzdWx0cy0+bW9yZVJlc3VsdFRvRm9sbG93LAorCQkJCSh0cFNpcldpZmlSYWRpb1N0YXQpbGlua0xheWVyU3RhdHNSZXN1bHRzLT5yZXN1bHRzLAorCQkJCWxpbmtMYXllclN0YXRzUmVzdWx0cy0+bnVtX3JhZGlvKTsKKworCQkJc3Bpbl9sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCQkJaWYgKCFsaW5rTGF5ZXJTdGF0c1Jlc3VsdHMtPm1vcmVSZXN1bHRUb0ZvbGxvdykKKwkJCQljb250ZXh0LT5yZXF1ZXN0X2JpdG1hcCAmPSB+KFdNSV9MSU5LX1NUQVRTX1JBRElPKTsKKwkJCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJCX0gZWxzZSBpZiAobGlua0xheWVyU3RhdHNSZXN1bHRzLT4KKwkJCSAgIHBhcmFtSWQgJiBXTUlfTElOS19TVEFUU19JRkFDRSkgeworCQkJaGRkX2xpbmtfbGF5ZXJfcHJvY2Vzc19pZmFjZV9zdGF0cyhwQWRhcHRlciwKKwkJCQkodHBTaXJXaWZpSWZhY2VTdGF0KWxpbmtMYXllclN0YXRzUmVzdWx0cy0+cmVzdWx0cywKKwkJCQlsaW5rTGF5ZXJTdGF0c1Jlc3VsdHMtPm51bV9wZWVycyk7CisKKwkJCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwkJCWNvbnRleHQtPnJlcXVlc3RfYml0bWFwICY9IH4oV01JX0xJTktfU1RBVFNfSUZBQ0UpOworCQkJc3Bpbl91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisKKwkJfSBlbHNlIGlmIChsaW5rTGF5ZXJTdGF0c1Jlc3VsdHMtPgorCQkJICAgcGFyYW1JZCAmIFdNSV9MSU5LX1NUQVRTX0FMTF9QRUVSKSB7CisJCQloZGRfbGlua19sYXllcl9wcm9jZXNzX3BlZXJfc3RhdHMocEFkYXB0ZXIsCisJCQkJbGlua0xheWVyU3RhdHNSZXN1bHRzLT5tb3JlUmVzdWx0VG9Gb2xsb3csCisJCQkJKHRwU2lyV2lmaVBlZXJTdGF0KWxpbmtMYXllclN0YXRzUmVzdWx0cy0+cmVzdWx0cyk7CisKKwkJCXNwaW5fbG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKwkJCWlmICghbGlua0xheWVyU3RhdHNSZXN1bHRzLT5tb3JlUmVzdWx0VG9Gb2xsb3cpCisJCQkJY29udGV4dC0+cmVxdWVzdF9iaXRtYXAgJj0gfihXTUlfTElOS19TVEFUU19BTExfUEVFUik7CisJCQlzcGluX3VubG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKworCQl9IGVsc2UgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoIklOVkFMSUQgTExfU1RBVFNfTk9USUZZIFJFU1BPTlNFIikpOworCQl9CisKKwkJc3Bpbl9sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCQkvKiBjb21wbGV0ZSByZXNwb25zZSBldmVudCBpZiBhbGwgcmVxdWVzdHMgYXJlIGNvbXBsZXRlZCAqLworCQlpZiAoMCA9PSBjb250ZXh0LT5yZXF1ZXN0X2JpdG1hcCkKKwkJCWNvbXBsZXRlKCZjb250ZXh0LT5yZXNwb25zZV9ldmVudCk7CisJCXNwaW5fdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X2xvY2spOworCisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiaW52YWxpZCBldmVudCB0eXBlICVkIiwgaW5kVHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9saW5rX2xheWVyX3N0YXRzX2luaXQoKSAtIGluaXRpYWxpemUgbGluayBsYXllciBzdGF0cworICogQHBIZGRDdHg6IFBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9saW5rX2xheWVyX3N0YXRzX2luaXQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKwlzbWVfc2V0X2xpbmtfbGF5ZXJfc3RhdHNfaW5kX2NiKHBIZGRDdHgtPmhIYWwsCisJCQkJCXdsYW5faGRkX2NmZzgwMjExX2xpbmtfbGF5ZXJfc3RhdHNfY2FsbGJhY2spOworfQorCitjb25zdCBzdHJ1Y3QKK25sYV9wb2xpY3kKKwlxY2Ffd2xhbl92ZW5kb3JfbGxfc2V0X3BvbGljeVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19TRVRfTUFYICsgMV0gPSB7CisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1NFVF9DT05GSUdfTVBEVV9TSVpFX1RIUkVTSE9MRF0gPSB7CisJCQkJCQkudHlwZSA9IE5MQV9VMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19TRVRfQ09ORklHX0FHR1JFU1NJVkVfU1RBVFNfR0FUSEVSSU5HXSA9IHsKKwkJCQkJCS50eXBlID0gTkxBX1UzMn0sCit9OworCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfbGxfc3RhdHNfc2V0KCkgLSBzZXQgbGluayBsYXllciBzdGF0cworICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3ZGV2CisgKiBAZGF0YTogUG9pbnRlciB0byBkYXRhCisgKiBAZGF0YV9sZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiBpbnQKKyAqLworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV9sbF9zdGF0c19zZXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgaW50IGRhdGFfbGVuKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IG5sYXR0ciAqdGJfdmVuZG9yW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1NFVF9NQVggKyAxXTsKKwl0U2lyTExTdGF0c1NldFJlcSBMaW5rTGF5ZXJTdGF0c1NldFJlcTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChubGFfcGFyc2UodGJfdmVuZG9yLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19TRVRfTUFYLAorCQkgICAgICAoc3RydWN0IG5sYXR0ciAqKWRhdGEsCisJCSAgICAgIGRhdGFfbGVuLCBxY2Ffd2xhbl92ZW5kb3JfbGxfc2V0X3BvbGljeSkpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJtYXhpbXVtIGF0dHJpYnV0ZSBub3QgcHJlc2VudCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCF0Yl92ZW5kb3IKKwkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1NFVF9DT05GSUdfTVBEVV9TSVpFX1RIUkVTSE9MRF0pIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIk1QRFUgc2l6ZSBOb3QgcHJlc2VudCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCF0Yl92ZW5kb3IKKwkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1NFVF9DT05GSUdfQUdHUkVTU0lWRV9TVEFUU19HQVRIRVJJTkddKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiU3RhdHMgR2F0aGVyaW5nIE5vdCBQcmVzZW50IikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTaGFsbCB0YWtlIHRoZSByZXF1ZXN0IElkIGlmIHRoZSBVcHBlciBsYXllcnMgcGFzcy4gMSBGb3Igbm93LiAqLworCUxpbmtMYXllclN0YXRzU2V0UmVxLnJlcUlkID0gMTsKKworCUxpbmtMYXllclN0YXRzU2V0UmVxLm1wZHVTaXplVGhyZXNob2xkID0KKwkJbmxhX2dldF91MzIodGJfdmVuZG9yCisJCQkgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX1NFVF9DT05GSUdfTVBEVV9TSVpFX1RIUkVTSE9MRF0pOworCisJTGlua0xheWVyU3RhdHNTZXRSZXEuYWdncmVzc2l2ZVN0YXRpc3RpY3NHYXRoZXJpbmcgPQorCQlubGFfZ2V0X3UzMih0Yl92ZW5kb3IKKwkJCSAgICBbUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfU0VUX0NPTkZJR19BR0dSRVNTSVZFX1NUQVRTX0dBVEhFUklOR10pOworCisJTGlua0xheWVyU3RhdHNTZXRSZXEuc3RhSWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAiTExfU1RBVFNfU0VUIHJlcUlkID0gJWQiLCBMaW5rTGF5ZXJTdGF0c1NldFJlcS5yZXFJZCk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAiTExfU1RBVFNfU0VUIHN0YUlkID0gJWQiLCBMaW5rTGF5ZXJTdGF0c1NldFJlcS5zdGFJZCk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAiTExfU1RBVFNfU0VUIG1wZHVTaXplVGhyZXNob2xkID0gJWQiLAorCSAgICAgICBMaW5rTGF5ZXJTdGF0c1NldFJlcS5tcGR1U2l6ZVRocmVzaG9sZCk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAiTExfU1RBVFNfU0VUIGFnZ3Jlc3NpdmUgU3RhdGlzdGljcyBHYXRoZXJpbmcgID0gJWQiLAorCSAgICAgICBMaW5rTGF5ZXJTdGF0c1NldFJlcS5hZ2dyZXNzaXZlU3RhdGlzdGljc0dhdGhlcmluZyk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHNtZV9sbF9zdGF0c19zZXRfcmVxKHBIZGRDdHgtPmhIYWwsCisJCQkJCQkgICAgICAgJkxpbmtMYXllclN0YXRzU2V0UmVxKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IgorCQkgICAgICAgInNtZV9sbF9zdGF0c19zZXRfcmVxIEZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcEFkYXB0ZXItPmlzTGlua0xheWVyU3RhdHNTZXQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfbGxfc3RhdHNfc2V0KCkgLSBzZXQgbGwgc3RhdHMKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gd2RldgorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBpZiBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfbGxfc3RhdHNfc2V0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCWNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCWludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9sbF9zdGF0c19zZXQod2lwaHksIHdkZXYsIGRhdGEsIGRhdGFfbGVuKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitjb25zdCBzdHJ1Y3QKK25sYV9wb2xpY3kKKwlxY2Ffd2xhbl92ZW5kb3JfbGxfZ2V0X3BvbGljeVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19HRVRfTUFYICsgMV0gPSB7CisJLyogVW5zaWduZWQgMzJiaXQgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciBpc3N1aW5nIHRoZSBHRVQgc3RhdHMKKwkgKiBjb21tYW5kLiBXaGVuIHJlcG9ydGluZworCSAqIHRoZSBzdGF0cyByZXN1bHRzLCB0aGUgZHJpdmVyIHVzZXMgdGhlIHNhbWUgdmFsdWUgdG8gaW5kaWNhdGUKKwkgKiB3aGljaCBHRVQgcmVxdWVzdCB0aGUgcmVzdWx0cworCSAqIGNvcnJlc3BvbmQgdG8uCisJICovCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0dFVF9DT05GSUdfUkVRX0lEXSA9IHsudHlwZSA9IE5MQV9VMzJ9LAorCisJLyogVW5zaWduZWQgMzJiaXQgdmFsdWUgLiBiaXQgbWFzayB0byBpZGVudGlmeSB3aGF0IHN0YXRpc3RpY3MgYXJlCisJICAgcmVxdWVzdGVkIGZvciByZXRyaWV2YWwgKi8KKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfR0VUX0NPTkZJR19SRVFfTUFTS10gPSB7LnR5cGUgPSBOTEFfVTMyfQorfTsKKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2xsX3N0YXRzX2dldCgpIC0gZ2V0IGxpbmsgbGF5ZXIgc3RhdHMKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gd2RldgorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogaW50CisgKi8KK3N0YXRpYyBpbnQKK19fd2xhbl9oZGRfY2ZnODAyMTFfbGxfc3RhdHNfZ2V0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgIGludCBkYXRhX2xlbikKK3sKKwl1bnNpZ25lZCBsb25nIHJjOworCXN0cnVjdCBoZGRfbGxfc3RhdHNfY29udGV4dCAqY29udGV4dDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqdGJfdmVuZG9yW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0dFVF9NQVggKyAxXTsKKwl0U2lyTExTdGF0c0dldFJlcSBMaW5rTGF5ZXJTdGF0c0dldFJlcTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaW50IHN0YXR1czsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZF9lcnIoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCWlmICgwICE9IHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXBBZGFwdGVyLT5pc0xpbmtMYXllclN0YXRzU2V0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCSAgICAgICAiJXM6IGlzTGlua0xheWVyU3RhdHNTZXQgOiAlZCIsCisJCSAgICAgICBfX2Z1bmNfXywgcEFkYXB0ZXItPmlzTGlua0xheWVyU3RhdHNTZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmxhX3BhcnNlKHRiX3ZlbmRvciwgUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfR0VUX01BWCwKKwkJICAgICAgKHN0cnVjdCBubGF0dHIgKilkYXRhLAorCQkgICAgICBkYXRhX2xlbiwgcWNhX3dsYW5fdmVuZG9yX2xsX2dldF9wb2xpY3kpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJtYXggYXR0cmlidXRlIG5vdCBwcmVzZW50IikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXRiX3ZlbmRvcltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19HRVRfQ09ORklHX1JFUV9JRF0pIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIlJlcXVlc3QgSWQgTm90IHByZXNlbnQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghdGJfdmVuZG9yW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0dFVF9DT05GSUdfUkVRX01BU0tdKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJSZXEgTWFzayBOb3QgcHJlc2VudCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTGlua0xheWVyU3RhdHNHZXRSZXEucmVxSWQgPQorCQlubGFfZ2V0X3UzMih0Yl92ZW5kb3IKKwkJCSAgICBbUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfR0VUX0NPTkZJR19SRVFfSURdKTsKKwlMaW5rTGF5ZXJTdGF0c0dldFJlcS5wYXJhbUlkTWFzayA9CisJCW5sYV9nZXRfdTMyKHRiX3ZlbmRvcgorCQkJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19HRVRfQ09ORklHX1JFUV9NQVNLXSk7CisKKwlMaW5rTGF5ZXJTdGF0c0dldFJlcS5zdGFJZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisKKwloZGRMb2coTE9HMSwKKwkJRkwoIkxMX1NUQVRTX0dFVCByZXFJZCA9ICVkIiksIExpbmtMYXllclN0YXRzR2V0UmVxLnJlcUlkKTsKKwloZGRMb2coTE9HMSwKKwkJRkwoIkxMX1NUQVRTX0dFVCBzdGFJZCA9ICVkIiksIExpbmtMYXllclN0YXRzR2V0UmVxLnN0YUlkKTsKKwloZGRMb2coTE9HMSwKKwkJRkwoIkxMX1NUQVRTX0dFVCBwYXJhbUlkTWFzayA9ICVkIiksCisJCUxpbmtMYXllclN0YXRzR2V0UmVxLnBhcmFtSWRNYXNrKTsKKworCWNvbnRleHQgPSAmbGxfc3RhdHNfY29udGV4dDsKKwlzcGluX2xvY2soJmNvbnRleHQtPmNvbnRleHRfbG9jayk7CisJY29udGV4dC0+cmVxdWVzdF9pZCA9IExpbmtMYXllclN0YXRzR2V0UmVxLnJlcUlkOworCWNvbnRleHQtPnJlcXVlc3RfYml0bWFwID0gTGlua0xheWVyU3RhdHNHZXRSZXEucGFyYW1JZE1hc2s7CisJSU5JVF9DT01QTEVUSU9OKGNvbnRleHQtPnJlc3BvbnNlX2V2ZW50KTsKKwlzcGluX3VubG9jaygmY29udGV4dC0+Y29udGV4dF9sb2NrKTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX2xsX3N0YXRzX2dldF9yZXEocEhkZEN0eC0+aEhhbCwKKwkJCQkJCSAgICAgICAmTGlua0xheWVyU3RhdHNHZXRSZXEpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczoiCisJCSAgICAgICAic21lX2xsX3N0YXRzX2dldF9yZXEgRmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udGV4dC0+cmVzcG9uc2VfZXZlbnQsCisJCQltc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX0xMX1NUQVRTKSk7CisJaWYgKCFyYykgeworCQloZGRMb2coTE9HRSwKKwkJCUZMKCJUYXJnZXQgcmVzcG9uc2UgdGltZWQgb3V0IHJlcXVlc3QgaWQgJWQgcmVxdWVzdCBiaXRtYXAgMHgleCIpLAorCQkJY29udGV4dC0+cmVxdWVzdF9pZCwgY29udGV4dC0+cmVxdWVzdF9iaXRtYXApOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9sbF9zdGF0c19nZXQoKSAtIGdldCBsbCBzdGF0cworICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3ZGV2CisgKiBAZGF0YTogUG9pbnRlciB0byBkYXRhCisgKiBAZGF0YV9sZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9sbF9zdGF0c19nZXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCWNvbnN0IHZvaWQgKmRhdGEsCisJCQkJaW50IGRhdGFfbGVuKQoreworCWludCByZXQgPSAwOworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2xsX3N0YXRzX2dldCh3aXBoeSwgd2RldiwgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKK2NvbnN0IHN0cnVjdAorbmxhX3BvbGljeQorCXFjYV93bGFuX3ZlbmRvcl9sbF9jbHJfcG9saWN5W1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NMUl9NQVggKyAxXSA9IHsKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX0NPTkZJR19SRVFfTUFTS10gPSB7LnR5cGUgPSBOTEFfVTMyfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX0NPTkZJR19TVE9QX1JFUV0gPSB7LnR5cGUgPSBOTEFfVTh9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DTFJfQ09ORklHX1JTUF9NQVNLXSA9IHsudHlwZSA9IE5MQV9VMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9MTF9TVEFUU19DTFJfQ09ORklHX1NUT1BfUlNQXSA9IHsudHlwZSA9IE5MQV9VOH0sCit9OworCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfbGxfc3RhdHNfY2xlYXIoKSAtIGNsZWFyIGxpbmsgbGF5ZXIgc3RhdHMKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gd2RldgorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogaW50CisgKi8KK3N0YXRpYyBpbnQKK19fd2xhbl9oZGRfY2ZnODAyMTFfbGxfc3RhdHNfY2xlYXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgaW50IGRhdGFfbGVuKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0Yl92ZW5kb3JbUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX01BWCArIDFdOworCXRTaXJMTFN0YXRzQ2xlYXJSZXEgTGlua0xheWVyU3RhdHNDbGVhclJlcTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJdTMyIHN0YXRzQ2xlYXJSZXFNYXNrOworCXU4IHN0b3BSZXE7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdGVtcF9za2J1ZmY7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFwQWRhcHRlci0+aXNMaW5rTGF5ZXJTdGF0c1NldCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkgICAgICAgIiVzOiBpc0xpbmtMYXllclN0YXRzU2V0IDogJWQiLAorCQkgICAgICAgX19mdW5jX18sIHBBZGFwdGVyLT5pc0xpbmtMYXllclN0YXRzU2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5sYV9wYXJzZSh0Yl92ZW5kb3IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NMUl9NQVgsCisJCSAgICAgIChzdHJ1Y3QgbmxhdHRyICopZGF0YSwKKwkJICAgICAgZGF0YV9sZW4sIHFjYV93bGFuX3ZlbmRvcl9sbF9jbHJfcG9saWN5KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIlNUQVRTX0NMUl9NQVggaXMgbm90IHByZXNlbnQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghdGJfdmVuZG9yW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NMUl9DT05GSUdfUkVRX01BU0tdIHx8CisJICAgICF0Yl92ZW5kb3JbUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX0NPTkZJR19TVE9QX1JFUV0pIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJFcnJvciBpbiBMTF9TVEFUUyBDTFIgQ09ORklHIFBBUkEiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0YXRzQ2xlYXJSZXFNYXNrID0gTGlua0xheWVyU3RhdHNDbGVhclJlcS5zdGF0c0NsZWFyUmVxTWFzayA9CisJCQkJICAgIG5sYV9nZXRfdTMyKHRiX3ZlbmRvcgorCQkJCQkJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NMUl9DT05GSUdfUkVRX01BU0tdKTsKKworCXN0b3BSZXEgPSBMaW5rTGF5ZXJTdGF0c0NsZWFyUmVxLnN0b3BSZXEgPQorCQkJICBubGFfZ2V0X3U4KHRiX3ZlbmRvcgorCQkJCSAgICAgW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NMUl9DT05GSUdfU1RPUF9SRVFdKTsKKworCS8qCisJICogU2hhbGwgdGFrZSB0aGUgcmVxdWVzdCBJZCBpZiB0aGUgVXBwZXIgbGF5ZXJzIHBhc3MuIDEgRm9yIG5vdy4KKwkgKi8KKwlMaW5rTGF5ZXJTdGF0c0NsZWFyUmVxLnJlcUlkID0gMTsKKworCUxpbmtMYXllclN0YXRzQ2xlYXJSZXEuc3RhSWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAiTExfU1RBVFNfQ0xFQVIgcmVxSWQgPSAlZCIsIExpbmtMYXllclN0YXRzQ2xlYXJSZXEucmVxSWQpOworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkgICAgICAgIkxMX1NUQVRTX0NMRUFSIHN0YUlkID0gJWQiLCBMaW5rTGF5ZXJTdGF0c0NsZWFyUmVxLnN0YUlkKTsKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJICAgICAgICJMTF9TVEFUU19DTEVBUiBzdGF0c0NsZWFyUmVxTWFzayA9IDB4JVgiLAorCSAgICAgICBMaW5rTGF5ZXJTdGF0c0NsZWFyUmVxLnN0YXRzQ2xlYXJSZXFNYXNrKTsKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJICAgICAgICJMTF9TVEFUU19DTEVBUiBzdG9wUmVxICA9ICVkIiwgTGlua0xheWVyU3RhdHNDbGVhclJlcS5zdG9wUmVxKTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc21lX2xsX3N0YXRzX2NsZWFyX3JlcShwSGRkQ3R4LT5oSGFsLAorCQkJCQkmTGlua0xheWVyU3RhdHNDbGVhclJlcSkpIHsKKwkJdGVtcF9za2J1ZmYgPSBjZmc4MDIxMV92ZW5kb3JfY21kX2FsbG9jX3JlcGx5X3NrYih3aXBoeSwKKwkJCQkJCQkJICAyICoKKwkJCQkJCQkJICBzaXplb2YodTMyKSArCisJCQkJCQkJCSAgMiAqCisJCQkJCQkJCSAgTkxNU0dfSERSTEVOKTsKKwkJaWYgKHRlbXBfc2tidWZmICE9IE5VTEwpIHsKKwkJCWlmIChubGFfcHV0X3UzMih0ZW1wX3NrYnVmZiwKKwkJCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfTExfU1RBVFNfQ0xSX0NPTkZJR19SU1BfTUFTSywKKwkJCQkJc3RhdHNDbGVhclJlcU1hc2spIHx8CisJCQkgICAgbmxhX3B1dF91MzIodGVtcF9za2J1ZmYsCisJCQkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX0xMX1NUQVRTX0NMUl9DT05GSUdfU1RPUF9SU1AsCisJCQkJCXN0b3BSZXEpKSB7CisJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICAgICAgRkwoIkxMX1NUQVRTX0NMUiBwdXQgZmFpbCIpKTsKKwkJCQlrZnJlZV9za2IodGVtcF9za2J1ZmYpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQkvKiBJZiB0aGUgYXNrIGlzIHRvIHN0b3AgdGhlIHN0YXRzIGNvbGxlY3Rpb24gYXMgcGFydCBvZiBjbGVhcgorCQkJICogKHN0b3BSZXEgPSAxKSAsIGVuc3VyZSB0aGF0IG5vIGZ1cnRoZXIgcmVxdWVzdHMgb2YgZ2V0CisJCQkgKiBnbyB0byB0aGUgZmlybXdhcmUgYnkgaGF2aW5nIGlzTGlua0xheWVyU3RhdHNTZXQgc2V0IHRvIDAuCisJCQkgKiBIb3dldmVyIGl0IHRoZSBzdG9wUmVxIGFzIHBhcnQgb2YgdGhlIGNsZWFyIHJlcXVlc3QgaXMgMCAsCisJCQkgKiB0aGUgcmVxdWVzdCB0byBnZXQgdGhlIHN0YXRpc3RpY3MgYXJlIGhvbm91cmVkIGFzIGluIHRoaXMKKwkJCSAqIGNhc2UgdGhlIGZpcm13YXJlIGlzIGp1c3QgYXNrZWQgdG8gY2xlYXIgdGhlIHN0YXRpc3RpY3MuCisJCQkgKi8KKwkJCWlmIChzdG9wUmVxID09IDEpCisJCQkJcEFkYXB0ZXItPmlzTGlua0xheWVyU3RhdHNTZXQgPSAwOworCisJCQlyZXR1cm4gY2ZnODAyMTFfdmVuZG9yX2NtZF9yZXBseSh0ZW1wX3NrYnVmZik7CisJCX0KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfbGxfc3RhdHNfY2xlYXIoKSAtIGNsZWFyIGxsIHN0YXRzCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdkZXYKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX2xsX3N0YXRzX2NsZWFyKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCWNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCWludCBkYXRhX2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV9sbF9zdGF0c19jbGVhcih3aXBoeSwgd2RldiwgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUyAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1NUQVRTX0VYVAorLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX3N0YXRzX2V4dF9yZXF1ZXN0KCkgLSBleHQgc3RhdHMgcmVxdWVzdAorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3ZGV2CisgKiBAZGF0YTogUG9pbnRlciB0byBkYXRhCisgKiBAZGF0YV9sZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiBpbnQKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3N0YXRzX2V4dF9yZXF1ZXN0KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJCSBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkJIGludCBkYXRhX2xlbikKK3sKKwl0U3RhdHNFeHRSZXF1ZXN0UmVxIHN0YXRzX2V4dF9yZXE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWludCByZXRfdmFsOworCUNERl9TVEFUVVMgc3RhdHVzOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKworCUVOVEVSKCk7CisKKwlyZXRfdmFsID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJc3RhdHNfZXh0X3JlcS5yZXF1ZXN0X2RhdGFfbGVuID0gZGF0YV9sZW47CisJc3RhdHNfZXh0X3JlcS5yZXF1ZXN0X2RhdGEgPSAodm9pZCAqKWRhdGE7CisKKwlzdGF0dXMgPSBzbWVfc3RhdHNfZXh0X3JlcXVlc3QocEFkYXB0ZXItPnNlc3Npb25JZCwgJnN0YXRzX2V4dF9yZXEpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisJCXJldF92YWwgPSAtRUlOVkFMOworCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc3RhdHNfZXh0X3JlcXVlc3QoKSAtIGV4dCBzdGF0cyByZXF1ZXN0CisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdkZXYKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IGludAorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc3RhdHNfZXh0X3JlcXVlc3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJaW50IGRhdGFfbGVuKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfc3RhdHNfZXh0X3JlcXVlc3Qod2lwaHksIHdkZXYsCisJCQkJCQkgICAgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc3RhdHNfZXh0X2NhbGxiYWNrKCkgLSBleHQgc3RhdHMgY2FsbGJhY2sKKyAqIEBjdHg6IFBvaW50ZXIgdG8gSEREIGNvbnRleHQKKyAqIEBtc2c6IE1lc3NhZ2UgcmVjZWl2ZWQKKyAqCisgKiBSZXR1cm46IG5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfc3RhdHNfZXh0X2NhbGxiYWNrKHZvaWQgKmN0eCwKKwkJCQkJCSB0U3RhdHNFeHRFdmVudCAqbXNnKQoreworCisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopIGN0eDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdmVuZG9yX2V2ZW50OworCWludCBzdGF0dXM7CisJaW50IHJldF92YWw7CisJdFN0YXRzRXh0RXZlbnQgKmRhdGEgPSBtc2c7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOworCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKworCWlmICgwICE9IHN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBIREQgY29udGV4dCBpcyBub3QgdmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlwQWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcl9ieV92ZGV2KHBIZGRDdHgsIGRhdGEtPnZkZXZfaWQpOworCisJaWYgKE5VTEwgPT0gcEFkYXB0ZXIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogdmRldl9pZCAlZCBkb2VzIG5vdCBleGlzdCB3aXRoIGhvc3QiLAorCQkJICBfX2Z1bmNfXywgZGF0YS0+dmRldl9pZCk7CisJCXJldHVybjsKKwl9CisKKwl2ZW5kb3JfZXZlbnQgPSBjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MocEhkZEN0eC0+d2lwaHksCisJCQkJCQkgICBOVUxMLAorCQkJCQkJICAgZGF0YS0+ZXZlbnRfZGF0YV9sZW4gKworCQkJCQkJICAgc2l6ZW9mKHVpbnQzMl90KSArCisJCQkJCQkgICBOTE1TR19IRFJMRU4gKyBOTE1TR19IRFJMRU4sCisJCQkJCQkgICBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1NUQVRTX0VYVF9JTkRFWCwKKwkJCQkJCSAgIEdGUF9LRVJORUwpOworCisJaWYgKCF2ZW5kb3JfZXZlbnQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXJldF92YWwgPSBubGFfcHV0X3UzMih2ZW5kb3JfZXZlbnQsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX0lGSU5ERVgsCisJCQkgICAgICBwQWRhcHRlci0+ZGV2LT5pZmluZGV4KTsKKwlpZiAocmV0X3ZhbCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9JRklOREVYIHB1dCBmYWlsIiwKKwkJCSAgX19mdW5jX18pOworCQlrZnJlZV9za2IodmVuZG9yX2V2ZW50KTsKKworCQlyZXR1cm47CisJfQorCisJcmV0X3ZhbCA9IG5sYV9wdXQodmVuZG9yX2V2ZW50LCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9TVEFUU19FWFQsCisJCQkgIGRhdGEtPmV2ZW50X2RhdGFfbGVuLCBkYXRhLT5ldmVudF9kYXRhKTsKKworCWlmIChyZXRfdmFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1NUQVRTX0VYVCBwdXQgZmFpbCIsCisJCQkgIF9fZnVuY19fKTsKKwkJa2ZyZWVfc2tiKHZlbmRvcl9ldmVudCk7CisKKwkJcmV0dXJuOworCX0KKworCWNmZzgwMjExX3ZlbmRvcl9ldmVudCh2ZW5kb3JfZXZlbnQsIEdGUF9LRVJORUwpOworCit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfc3RhdHNfZXh0X2luaXQoKSAtIGV4dCBzdGF0cyBpbml0CisgKiBAY3R4OiBQb2ludGVyIHRvIEhERCBjb250ZXh0CisgKgorICogUmV0dXJuOiBub3RoaW5nCisgKi8KK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfc3RhdHNfZXh0X2luaXQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKwlzbWVfc3RhdHNfZXh0X3JlZ2lzdGVyX2NhbGxiYWNrKHBIZGRDdHgtPmhIYWwsCisJCQkJCXdsYW5faGRkX2NmZzgwMjExX3N0YXRzX2V4dF9jYWxsYmFjayk7Cit9CisjZW5kaWYgLyogRW5kIG9mIFdMQU5fRkVBVFVSRV9TVEFUU19FWFQgKi8KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2dldF9zdGF0aW9uKCkgLSBnZXQgc3RhdGlvbiBzdGF0aXN0aWNzCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqIEBtYWM6IFBvaW50ZXIgdG8gbWFjCisgKiBAc2luZm86IFBvaW50ZXIgdG8gc3RhdGlvbiBpbmZvCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgY29uc3QgdWludDhfdCAqbWFjLAorCQkJCQkgICBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJaW50IHNzaWRsZW4gPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uU1NJRC5TU0lELmxlbmd0aDsKKwl1aW50OF90IHJhdGVfZmxhZ3M7CisKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKikgd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IGhkZF9jb25maWcgKnBDZmcgPSBwSGRkQ3R4LT5jb25maWc7CisKKwl1aW50OF90IE9wZXJhdGlvbmFsUmF0ZXNbQ1NSX0RPVDExX1NVUFBPUlRFRF9SQVRFU19NQVhdOworCXVpbnQzMl90IE9STGVuZyA9IENTUl9ET1QxMV9TVVBQT1JURURfUkFURVNfTUFYOworCXVpbnQ4X3QgRXh0ZW5kZWRSYXRlc1tDU1JfRE9UMTFfRVhURU5ERURfU1VQUE9SVEVEX1JBVEVTX01BWF07CisJdWludDMyX3QgRVJMZW5nID0gQ1NSX0RPVDExX0VYVEVOREVEX1NVUFBPUlRFRF9SQVRFU19NQVg7CisJdWludDhfdCBNQ1NSYXRlc1tTSVpFX09GX0JBU0lDX01DU19TRVRdOworCXVpbnQzMl90IE1DU0xlbmcgPSBTSVpFX09GX0JBU0lDX01DU19TRVQ7CisJdWludDE2X3QgbWF4UmF0ZSA9IDA7CisJdWludDE2X3QgbXlSYXRlOworCXVpbnQxNl90IGN1cnJlbnRSYXRlID0gMDsKKwl1aW50OF90IG1heFNwZWVkTUNTID0gMDsKKwl1aW50OF90IG1heE1DU0lkeCA9IDA7CisJdWludDhfdCByYXRlRmxhZyA9IDE7CisJdWludDhfdCBpLCBqLCByc3NpZHg7CisJdWludDhfdCBuc3MgPSAxOworCWludCBzdGF0dXMsIG1vZGUgPSAwLCBtYXhIdElkeDsKKwlzdHJ1Y3QgaW5kZXhfdmh0X2RhdGFfcmF0ZV90eXBlICpzdXBwb3J0ZWRfdmh0X21jc19yYXRlOworCXN0cnVjdCBpbmRleF9kYXRhX3JhdGVfdHlwZSAqc3VwcG9ydGVkX21jc19yYXRlOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwl1aW50MzJfdCB2aHRfbWNzX21hcDsKKwllbnVtIGVEYXRhUmF0ZTExQUNNYXhNY3Mgdmh0TWF4TWNzOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMUFDICovCisKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHx8CisJICAgICgwID09IHNzaWRsZW4pKSB7CisJCWhkZExvZyhMT0cxLCBGTCgiTm90IGFzc29jaWF0ZWQgb3IgSW52YWxpZCBzc2lkbGVuLCAlZCIpLAorCQkJc3NpZGxlbik7CisJCS8qVG8ga2VlcCBHVUkgaGFwcHkgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHRydWUgPT0gcEhkZFN0YUN0eC0+aGRkX1JlYXNzb2NTY2VuYXJpbykgeworCQloZGRMb2coTE9HMSwKKwkJCUZMKCJSb2FtaW5nIGlzIGluIHByb2dyZXNzLCBjYW5ub3QgY29udGludWUgd2l0aCB0aGlzIHJlcXVlc3QiKSk7CisJCXJldHVybiAwOworCX0KKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJd2xhbl9oZGRfZ2V0X3Jzc2kocEFkYXB0ZXIsICZzaW5mby0+c2lnbmFsKTsKKwlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19TSUdOQUw7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTFBTUworCWlmICghcEFkYXB0ZXItPnJzc2lfc2VuZCkgeworCQlwQWRhcHRlci0+cnNzaV9zZW5kID0gdHJ1ZTsKKwkJd2xhbl9oZGRfc2VuZF9zdGF0dXNfcGtnKHBBZGFwdGVyLCBwSGRkU3RhQ3R4LCAxLCAxKTsKKwl9CisjZW5kaWYKKworCXdsYW5faGRkX2dldF9zdGF0aW9uX3N0YXRzKHBBZGFwdGVyKTsKKwlyYXRlX2ZsYWdzID0gcEFkYXB0ZXItPmhkZF9zdGF0cy5DbGFzc0Ffc3RhdC50eF9yYXRlX2ZsYWdzOworCisJLyogY29udmVydCB0byB0aGUgVUkgdW5pdHMgb2YgMTAwa2JwcyAqLworCW15UmF0ZSA9IHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQudHhfcmF0ZSAqIDU7CisJaWYgKCEocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9MRUdBQ1kpKSB7CisJCW5zcyA9IHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQucnhfZnJhZ19jbnQ7CisKKwkJaWYgKGVIRERfTElOS19TUEVFRF9SRVBPUlRfQUNUVUFMID09IHBDZmctPnJlcG9ydE1heExpbmtTcGVlZCkgeworCQkJLyogR2V0IGN1cnJlbnQgcmF0ZSBmbGFncyBpZiByZXBvcnQgYWN0dWFsICovCisJCQlyYXRlX2ZsYWdzID0KKwkJCQlwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0LgorCQkJCXByb21pc2N1b3VzX3J4X2ZyYWdfY250OworCQl9CisKKwkJaWYgKHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQubWNzX2luZGV4ID09CisJCSAgICBJTlZBTElEX01DU19JRFgpIHsKKwkJCXJhdGVfZmxhZ3MgPSBlSEFMX1RYX1JBVEVfTEVHQUNZOworCQkJcEFkYXB0ZXItPmhkZF9zdGF0cy5DbGFzc0Ffc3RhdC5tY3NfaW5kZXggPSAwOworCQl9CisJfQorI2lmZGVmIExJTktTUEVFRF9ERUJVR19FTkFCTEVECisJcHJfaW5mbygiUlNTSSAlZCwgUkxNUyAldSwgcmF0ZSAlZCwgcnNzaSBoaWdoICVkLCByc3NpIG1pZCAlZCwgcnNzaSBsb3cgJWQsIHJhdGVfZmxhZ3MgMHgleCwgTUNTICVkXG4iLAorCQlzaW5mby0+c2lnbmFsLCBwQ2ZnLT5yZXBvcnRNYXhMaW5rU3BlZWQsIG15UmF0ZSwKKwkJKGludClwQ2ZnLT5saW5rU3BlZWRSc3NpSGlnaCwgKGludClwQ2ZnLT5saW5rU3BlZWRSc3NpTWlkLAorCQkoaW50KXBDZmctPmxpbmtTcGVlZFJzc2lMb3csIChpbnQpcmF0ZV9mbGFncywKKwkJKGludClwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0Lm1jc19pbmRleCk7CisjZW5kaWYgLyogTElOS1NQRUVEX0RFQlVHX0VOQUJMRUQgKi8KKworCWlmIChlSEREX0xJTktfU1BFRURfUkVQT1JUX0FDVFVBTCAhPSBwQ2ZnLT5yZXBvcnRNYXhMaW5rU3BlZWQpIHsKKwkJLyogd2UgZG8gbm90IHdhbnQgdG8gbmVjZXNzYXJpbHkgcmVwb3J0IHRoZSBjdXJyZW50IHNwZWVkICovCisJCWlmIChlSEREX0xJTktfU1BFRURfUkVQT1JUX01BWCA9PSBwQ2ZnLT5yZXBvcnRNYXhMaW5rU3BlZWQpIHsKKwkJCS8qIHJlcG9ydCB0aGUgbWF4IHBvc3NpYmxlIHNwZWVkICovCisJCQlyc3NpZHggPSAwOworCQl9IGVsc2UgaWYgKGVIRERfTElOS19TUEVFRF9SRVBPUlRfTUFYX1NDQUxFRCA9PQorCQkJICAgcENmZy0+cmVwb3J0TWF4TGlua1NwZWVkKSB7CisJCQkvKiByZXBvcnQgdGhlIG1heCBwb3NzaWJsZSBzcGVlZCB3aXRoIFJTU0kgc2NhbGluZyAqLworCQkJaWYgKHNpbmZvLT5zaWduYWwgPj0gcENmZy0+bGlua1NwZWVkUnNzaUhpZ2gpIHsKKwkJCQkvKiByZXBvcnQgdGhlIG1heCBwb3NzaWJsZSBzcGVlZCAqLworCQkJCXJzc2lkeCA9IDA7CisJCQl9IGVsc2UgaWYgKHNpbmZvLT5zaWduYWwgPj0gcENmZy0+bGlua1NwZWVkUnNzaU1pZCkgeworCQkJCS8qIHJlcG9ydCBtaWRkbGUgc3BlZWQgKi8KKwkJCQlyc3NpZHggPSAxOworCQkJfSBlbHNlIGlmIChzaW5mby0+c2lnbmFsID49IHBDZmctPmxpbmtTcGVlZFJzc2lMb3cpIHsKKwkJCQkvKiByZXBvcnQgbWlkZGxlIHNwZWVkICovCisJCQkJcnNzaWR4ID0gMjsKKwkJCX0gZWxzZSB7CisJCQkJLyogcmVwb3J0IGFjdHVhbCBzcGVlZCAqLworCQkJCXJzc2lkeCA9IDM7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiB1bmtub3duLCB0cmVhdCBhcyBlSEREX0xJTktfU1BFRURfUkVQT1JUX01BWCAqLworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoIkludmFsaWQgdmFsdWUgZm9yIHJlcG9ydE1heExpbmtTcGVlZDogJXUiKSwKKwkJCSAgICAgICBwQ2ZnLT5yZXBvcnRNYXhMaW5rU3BlZWQpOworCQkJcnNzaWR4ID0gMDsKKwkJfQorCisJCW1heFJhdGUgPSAwOworCisJCS8qIEdldCBCYXNpYyBSYXRlIFNldCAqLworCQlpZiAoMCAhPQorCQkgICAgc21lX2NmZ19nZXRfc3RyKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkgICAgV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVCwKKwkJCQkgICAgT3BlcmF0aW9uYWxSYXRlcywKKwkJCQkgICAgJk9STGVuZykpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiY2ZnIGdldCByZXR1cm5lZCBmYWlsdXJlIikpOworCQkJLypUbyBrZWVwIEdVSSBoYXBweSAqLworCQkJcmV0dXJuIDA7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgT1JMZW5nOyBpKyspIHsKKwkJCWZvciAoaiA9IDA7CisJCQkgICAgIGogPCBBUlJBWV9TSVpFKHN1cHBvcnRlZF9kYXRhX3JhdGUpOyBqKyspIHsKKwkJCQkvKiBWYWxpZGF0ZSBSYXRlIFNldCAqLworCQkJCWlmIChzdXBwb3J0ZWRfZGF0YV9yYXRlW2pdLmJlYWNvbl9yYXRlX2luZGV4ID09CisJCQkJICAgIChPcGVyYXRpb25hbFJhdGVzW2ldICYgMHg3RikpIHsKKwkJCQkJY3VycmVudFJhdGUgPQorCQkJCQkJc3VwcG9ydGVkX2RhdGFfcmF0ZVtqXS4KKwkJCQkJCXN1cHBvcnRlZF9yYXRlW3Jzc2lkeF07CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8qIFVwZGF0ZSBNQVggcmF0ZSAqLworCQkJbWF4UmF0ZSA9CisJCQkJKGN1cnJlbnRSYXRlID4gbWF4UmF0ZSkgPyBjdXJyZW50UmF0ZSA6IG1heFJhdGU7CisJCX0KKworCQkvKiBHZXQgRXh0ZW5kZWQgUmF0ZSBTZXQgKi8KKwkJaWYgKDAgIT0KKwkJICAgIHNtZV9jZmdfZ2V0X3N0cihXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJICAgIFdOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVQsCisJCQkJICAgIEV4dGVuZGVkUmF0ZXMsICZFUkxlbmcpKSB7CisJCQloZGRMb2coTE9HRSwgRkwoImNmZyBnZXQgcmV0dXJuZWQgZmFpbHVyZSIpKTsKKwkJCS8qVG8ga2VlcCBHVUkgaGFwcHkgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IEVSTGVuZzsgaSsrKSB7CisJCQlmb3IgKGogPSAwOworCQkJICAgICBqIDwgQVJSQVlfU0laRShzdXBwb3J0ZWRfZGF0YV9yYXRlKTsgaisrKSB7CisJCQkJaWYgKHN1cHBvcnRlZF9kYXRhX3JhdGVbal0uYmVhY29uX3JhdGVfaW5kZXggPT0KKwkJCQkgICAgKEV4dGVuZGVkUmF0ZXNbaV0gJiAweDdGKSkgeworCQkJCQljdXJyZW50UmF0ZSA9CisJCQkJCQlzdXBwb3J0ZWRfZGF0YV9yYXRlW2pdLgorCQkJCQkJc3VwcG9ydGVkX3JhdGVbcnNzaWR4XTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLyogVXBkYXRlIE1BWCByYXRlICovCisJCQltYXhSYXRlID0KKwkJCQkoY3VycmVudFJhdGUgPiBtYXhSYXRlKSA/IGN1cnJlbnRSYXRlIDogbWF4UmF0ZTsKKwkJfQorCQkvKiBHZXQgTUNTIFJhdGUgU2V0IC0tCisJCSAgIE9ubHkgaWYgd2UgYXJlIGNvbm5lY3RlZCBpbiBub24gbGVnYWN5IG1vZGUgYW5kIG5vdCByZXBvcnRpbmcKKwkJICAgYWN0dWFsIHNwZWVkICovCisJCWlmICgoMyAhPSByc3NpZHgpICYmICEocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9MRUdBQ1kpKSB7CisJCQlpZiAoMCAhPQorCQkJICAgIHNtZV9jZmdfZ2V0X3N0cihXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCSAgICBXTklfQ0ZHX0NVUlJFTlRfTUNTX1NFVCwgTUNTUmF0ZXMsCisJCQkJCSAgICAmTUNTTGVuZykpIHsKKwkJCQloZGRMb2coTE9HRSwgRkwoImNmZyBnZXQgcmV0dXJuZWQgZmFpbHVyZSIpKTsKKwkJCQkvKlRvIGtlZXAgR1VJIGhhcHB5ICovCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyYXRlRmxhZyA9IDA7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJCXN1cHBvcnRlZF92aHRfbWNzX3JhdGUgPQorCQkJCShzdHJ1Y3QgaW5kZXhfdmh0X2RhdGFfcmF0ZV90eXBlICopCisJCQkJKChuc3MgPT0KKwkJCQkgIDEpID8gJnN1cHBvcnRlZF92aHRfbWNzX3JhdGVfbnNzMSA6CisJCQkJICZzdXBwb3J0ZWRfdmh0X21jc19yYXRlX25zczIpOworCisJCQlpZiAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9WSFQ4MCkKKwkJCQltb2RlID0gMjsKKwkJCWVsc2UgaWYgKChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1ZIVDQwKSB8fAorCQkJCSAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9IVDQwKSkKKwkJCQltb2RlID0gMTsKKwkJCWVsc2UKKwkJCQltb2RlID0gMDsKKworCQkJLyogVkhUODAgcmF0ZSBoYXMgc2VwZXJhdGUgcmF0ZSB0YWJsZSAqLworCQkJaWYgKHJhdGVfZmxhZ3MgJgorCQkJICAgIChlSEFMX1RYX1JBVEVfVkhUMjAgfCBlSEFMX1RYX1JBVEVfVkhUNDAgfAorCQkJICAgICBlSEFMX1RYX1JBVEVfVkhUODApKSB7CisJCQkJc21lX2NmZ19nZXRfaW50KFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJCVdOSV9DRkdfVkhUX1RYX01DU19NQVAsCisJCQkJCQkmdmh0X21jc19tYXApOworCQkJCXZodE1heE1jcyA9IChlbnVtIGVEYXRhUmF0ZTExQUNNYXhNY3MpCisJCQkJCSh2aHRfbWNzX21hcCAmIERBVEFfUkFURV8xMUFDX01DU19NQVNLKTsKKwkJCQlpZiAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9TR0kpCisJCQkJCXJhdGVGbGFnIHw9IDE7CisJCQkJaWYgKERBVEFfUkFURV8xMUFDX01BWF9NQ1NfNyA9PSB2aHRNYXhNY3MpCisJCQkJCW1heE1DU0lkeCA9IDc7CisJCQkJZWxzZSBpZiAoREFUQV9SQVRFXzExQUNfTUFYX01DU184ID09CisJCQkJCSAgIHZodE1heE1jcykKKwkJCQkJbWF4TUNTSWR4ID0gODsKKwkJCQllbHNlIGlmIChEQVRBX1JBVEVfMTFBQ19NQVhfTUNTXzkgPT0KKwkJCQkJICAgdmh0TWF4TWNzKSB7CisJCQkJCS8qIFZIVDIwIGlzIHN1cHBvcnRpbmcgMH44ICovCisJCQkJCWlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1ZIVDIwKQorCQkJCQkJbWF4TUNTSWR4ID0gODsKKwkJCQkJZWxzZQorCQkJCQkJbWF4TUNTSWR4ID0gOTsKKwkJCQl9CisKKwkJCQlpZiAocnNzaWR4ICE9IDApIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8PSBtYXhNQ1NJZHg7IGkrKykgeworCQkJCQkJaWYgKHNpbmZvLT5zaWduYWwgPD0KKwkJCQkJCSAgICByc3NpX21jc190YmxbbW9kZV1baV0pIHsKKwkJCQkJCQltYXhNQ1NJZHggPSBpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfVkhUODApIHsKKwkJCQkJY3VycmVudFJhdGUgPQorCQkJCQkgIHN1cHBvcnRlZF92aHRfbWNzX3JhdGVbcEFkYXB0ZXItPgorCQkJCQkgIGhkZF9zdGF0cy5DbGFzc0Ffc3RhdC5tY3NfaW5kZXhdLgorCQkJCQkgIHN1cHBvcnRlZF9WSFQ4MF9yYXRlW3JhdGVGbGFnXTsKKwkJCQkJbWF4UmF0ZSA9CisJCQkJCSAgc3VwcG9ydGVkX3ZodF9tY3NfcmF0ZVttYXhNQ1NJZHhdLgorCQkJCQkJc3VwcG9ydGVkX1ZIVDgwX3JhdGVbcmF0ZUZsYWddOworCQkJCX0gZWxzZSBpZiAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9WSFQ0MCkgeworCQkJCQljdXJyZW50UmF0ZSA9CisJCQkJCSAgc3VwcG9ydGVkX3ZodF9tY3NfcmF0ZVtwQWRhcHRlci0+CisJCQkJCSAgaGRkX3N0YXRzLkNsYXNzQV9zdGF0Lm1jc19pbmRleF0uCisJCQkJCSAgc3VwcG9ydGVkX1ZIVDQwX3JhdGVbcmF0ZUZsYWddOworCQkJCQltYXhSYXRlID0KKwkJCQkJICBzdXBwb3J0ZWRfdmh0X21jc19yYXRlW21heE1DU0lkeF0uCisJCQkJCQlzdXBwb3J0ZWRfVkhUNDBfcmF0ZVtyYXRlRmxhZ107CisJCQkJfSBlbHNlIGlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1ZIVDIwKSB7CisJCQkJCWN1cnJlbnRSYXRlID0KKwkJCQkJICBzdXBwb3J0ZWRfdmh0X21jc19yYXRlW3BBZGFwdGVyLT4KKwkJCQkJICBoZGRfc3RhdHMuQ2xhc3NBX3N0YXQubWNzX2luZGV4XS4KKwkJCQkJICBzdXBwb3J0ZWRfVkhUMjBfcmF0ZVtyYXRlRmxhZ107CisJCQkJCW1heFJhdGUgPQorCQkJCQkgIHN1cHBvcnRlZF92aHRfbWNzX3JhdGVbbWF4TUNTSWR4XS4KKwkJCQkJICBzdXBwb3J0ZWRfVkhUMjBfcmF0ZVtyYXRlRmxhZ107CisJCQkJfQorCisJCQkJbWF4U3BlZWRNQ1MgPSAxOworCQkJCWlmIChjdXJyZW50UmF0ZSA+IG1heFJhdGUpCisJCQkJCW1heFJhdGUgPSBjdXJyZW50UmF0ZTsKKworCQkJfSBlbHNlCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExQUMgKi8KKwkJCXsKKwkJCQlpZiAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9IVDQwKQorCQkJCQlyYXRlRmxhZyB8PSAxOworCQkJCWlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1NHSSkKKwkJCQkJcmF0ZUZsYWcgfD0gMjsKKworCQkJCXN1cHBvcnRlZF9tY3NfcmF0ZSA9CisJCQkJCShzdHJ1Y3QgaW5kZXhfZGF0YV9yYXRlX3R5cGUgKikKKwkJCQkJKChuc3MgPT0KKwkJCQkJICAxKSA/ICZzdXBwb3J0ZWRfbWNzX3JhdGVfbnNzMSA6CisJCQkJCSAmc3VwcG9ydGVkX21jc19yYXRlX25zczIpOworCisJCQkJbWF4SHRJZHggPSBNQVhfSFRfTUNTX0lEWDsKKwkJCQlpZiAocnNzaWR4ICE9IDApIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8IE1BWF9IVF9NQ1NfSURYOyBpKyspIHsKKwkJCQkJCWlmIChzaW5mby0+c2lnbmFsIDw9CisJCQkJCQkgICAgcnNzaV9tY3NfdGJsW21vZGVdW2ldKSB7CisJCQkJCQkJbWF4SHRJZHggPSBpICsgMTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWZvciAoaSA9IDA7IGkgPCBNQ1NMZW5nOyBpKyspIHsKKwkJCQkJZm9yIChqID0gMDsgaiA8IG1heEh0SWR4OyBqKyspIHsKKwkJCQkJCWlmIChzdXBwb3J0ZWRfbWNzX3JhdGVbal0uCisJCQkJCQkgICAgYmVhY29uX3JhdGVfaW5kZXggPT0KKwkJCQkJCSAgICBNQ1NSYXRlc1tpXSkgeworCQkJCQkJCWN1cnJlbnRSYXRlID0KKwkJCQkJCQkgIHN1cHBvcnRlZF9tY3NfcmF0ZVtqXS4KKwkJCQkJCQkgIHN1cHBvcnRlZF9yYXRlCisJCQkJCQkJICBbcmF0ZUZsYWddOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKChqIDwgTUFYX0hUX01DU19JRFgpCisJCQkJCSAgICAmJiAoY3VycmVudFJhdGUgPiBtYXhSYXRlKSkgeworCQkJCQkJbWF4UmF0ZSA9IGN1cnJlbnRSYXRlOworCQkJCQkJbWF4U3BlZWRNQ1MgPSAxOworCQkJCQkJbWF4TUNTSWR4ID0KKwkJCQkJCQlzdXBwb3J0ZWRfbWNzX3JhdGVbal0uCisJCQkJCQkJYmVhY29uX3JhdGVfaW5kZXg7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQllbHNlIGlmICghKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfTEVHQUNZKSkgeworCQkJbWF4UmF0ZSA9IG15UmF0ZTsKKwkJCW1heFNwZWVkTUNTID0gMTsKKwkJCW1heE1DU0lkeCA9IHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQubWNzX2luZGV4OworCQl9CisJCS8qIHJlcG9ydCBhIHZhbHVlIGF0IGxlYXN0IGFzIGJpZyBhcyBjdXJyZW50IHJhdGUgKi8KKwkJaWYgKChtYXhSYXRlIDwgbXlSYXRlKSB8fCAoMCA9PSBtYXhSYXRlKSkgeworCQkJbWF4UmF0ZSA9IG15UmF0ZTsKKwkJCWlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX0xFR0FDWSkgeworCQkJCW1heFNwZWVkTUNTID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJbWF4U3BlZWRNQ1MgPSAxOworCQkJCW1heE1DU0lkeCA9CisJCQkJICBwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0Lm1jc19pbmRleDsKKwkJCX0KKwkJfQorCisJCWlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX0xFR0FDWSkgeworCQkJc2luZm8tPnR4cmF0ZS5sZWdhY3kgPSBtYXhSYXRlOworI2lmZGVmIExJTktTUEVFRF9ERUJVR19FTkFCTEVECisJCQlwcl9pbmZvKCJSZXBvcnRpbmcgbGVnYWN5IHJhdGUgJWRcbiIsCisJCQkJc2luZm8tPnR4cmF0ZS5sZWdhY3kpOworI2VuZGlmIC8qIExJTktTUEVFRF9ERUJVR19FTkFCTEVEICovCisJCX0gZWxzZSB7CisJCQlzaW5mby0+dHhyYXRlLm1jcyA9IG1heE1DU0lkeDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQkJc2luZm8tPnR4cmF0ZS5uc3MgPSBuc3M7CisJCQlpZiAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9WSFQ4MCkgeworCQkJCXNpbmZvLT50eHJhdGUuZmxhZ3MgfD0gUkFURV9JTkZPX0ZMQUdTX1ZIVF9NQ1M7CisJCQkJc2luZm8tPnR4cmF0ZS5mbGFncyB8PQorCQkJCQlSQVRFX0lORk9fRkxBR1NfODBfTUhaX1dJRFRIOworCQkJfSBlbHNlIGlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1ZIVDQwKSB7CisJCQkJc2luZm8tPnR4cmF0ZS5mbGFncyB8PSBSQVRFX0lORk9fRkxBR1NfVkhUX01DUzsKKwkJCQlzaW5mby0+dHhyYXRlLmZsYWdzIHw9CisJCQkJCVJBVEVfSU5GT19GTEFHU180MF9NSFpfV0lEVEg7CisJCQl9IGVsc2UgaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfVkhUMjApIHsKKwkJCQlzaW5mby0+dHhyYXRlLmZsYWdzIHw9IFJBVEVfSU5GT19GTEFHU19WSFRfTUNTOworCQkJfSBlbHNlCisJCQkJc2luZm8tPnR4cmF0ZS5mbGFncyB8PSBSQVRFX0lORk9fRkxBR1NfVkhUX01DUzsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFBQyAqLworCQkJaWYgKHJhdGVfZmxhZ3MgJgorCQkJICAgIChlSEFMX1RYX1JBVEVfSFQyMCB8IGVIQUxfVFhfUkFURV9IVDQwKSkgeworCQkJCXNpbmZvLT50eHJhdGUuZmxhZ3MgfD0gUkFURV9JTkZPX0ZMQUdTX01DUzsKKwkJCQlpZiAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9IVDQwKSB7CisJCQkJCXNpbmZvLT50eHJhdGUuZmxhZ3MgfD0KKwkJCQkJCVJBVEVfSU5GT19GTEFHU180MF9NSFpfV0lEVEg7CisJCQkJfQorCQkJfQorCQkJaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfU0dJKSB7CisJCQkJaWYgKCEKKwkJCQkgICAgKHNpbmZvLT50eHJhdGUuCisJCQkJICAgICBmbGFncyAmIFJBVEVfSU5GT19GTEFHU19WSFRfTUNTKSkKKwkJCQkJc2luZm8tPnR4cmF0ZS5mbGFncyB8PQorCQkJCQkJUkFURV9JTkZPX0ZMQUdTX01DUzsKKwkJCQlzaW5mby0+dHhyYXRlLmZsYWdzIHw9IFJBVEVfSU5GT19GTEFHU19TSE9SVF9HSTsKKwkJCX0KKyNpZmRlZiBMSU5LU1BFRURfREVCVUdfRU5BQkxFRAorCQkJcHJfaW5mbygiUmVwb3J0aW5nIE1DUyByYXRlICVkIGZsYWdzICV4XG4iLAorCQkJCXNpbmZvLT50eHJhdGUubWNzLCBzaW5mby0+dHhyYXRlLmZsYWdzKTsKKyNlbmRpZiAvKiBMSU5LU1BFRURfREVCVUdfRU5BQkxFRCAqLworCQl9CisJfSBlbHNlIHsKKwkJLyogcmVwb3J0IGN1cnJlbnQgcmF0ZSBpbnN0ZWFkIG9mIG1heCByYXRlICovCisKKwkJaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfTEVHQUNZKSB7CisJCQkvKiBwcm92aWRlIHRvIHRoZSBVSSBpbiB1bml0cyBvZiAxMDBrYnBzICovCisJCQlzaW5mby0+dHhyYXRlLmxlZ2FjeSA9IG15UmF0ZTsKKyNpZmRlZiBMSU5LU1BFRURfREVCVUdfRU5BQkxFRAorCQkJcHJfaW5mbygiUmVwb3J0aW5nIGFjdHVhbCBsZWdhY3kgcmF0ZSAlZFxuIiwKKwkJCQlzaW5mby0+dHhyYXRlLmxlZ2FjeSk7CisjZW5kaWYgLyogTElOS1NQRUVEX0RFQlVHX0VOQUJMRUQgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIG11c3QgYmUgTUNTICovCisJCQlzaW5mby0+dHhyYXRlLm1jcyA9CisJCQkJcEFkYXB0ZXItPmhkZF9zdGF0cy5DbGFzc0Ffc3RhdC5tY3NfaW5kZXg7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJCXNpbmZvLT50eHJhdGUubnNzID0gbnNzOworCQkJc2luZm8tPnR4cmF0ZS5mbGFncyB8PSBSQVRFX0lORk9fRkxBR1NfVkhUX01DUzsKKwkJCWlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1ZIVDgwKSB7CisJCQkJc2luZm8tPnR4cmF0ZS5mbGFncyB8PQorCQkJCQlSQVRFX0lORk9fRkxBR1NfODBfTUhaX1dJRFRIOworCQkJfSBlbHNlIGlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1ZIVDQwKSB7CisJCQkJc2luZm8tPnR4cmF0ZS5mbGFncyB8PQorCQkJCQlSQVRFX0lORk9fRkxBR1NfNDBfTUhaX1dJRFRIOworCQkJfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMUFDICovCisJCQlpZiAocmF0ZV9mbGFncyAmCisJCQkgICAgKGVIQUxfVFhfUkFURV9IVDIwIHwgZUhBTF9UWF9SQVRFX0hUNDApKSB7CisJCQkJc2luZm8tPnR4cmF0ZS5mbGFncyB8PSBSQVRFX0lORk9fRkxBR1NfTUNTOworCQkJCWlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX0hUNDApIHsKKwkJCQkJc2luZm8tPnR4cmF0ZS5mbGFncyB8PQorCQkJCQkJUkFURV9JTkZPX0ZMQUdTXzQwX01IWl9XSURUSDsKKwkJCQl9CisJCQl9CisJCQlpZiAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9TR0kpIHsKKwkJCQlzaW5mby0+dHhyYXRlLmZsYWdzIHw9IFJBVEVfSU5GT19GTEFHU19NQ1M7CisJCQkJc2luZm8tPnR4cmF0ZS5mbGFncyB8PSBSQVRFX0lORk9fRkxBR1NfU0hPUlRfR0k7CisJCQl9CisjaWZkZWYgTElOS1NQRUVEX0RFQlVHX0VOQUJMRUQKKwkJCXByX2luZm8oIlJlcG9ydGluZyBhY3R1YWwgTUNTIHJhdGUgJWQgZmxhZ3MgJXhcbiIsCisJCQkJc2luZm8tPnR4cmF0ZS5tY3MsIHNpbmZvLT50eHJhdGUuZmxhZ3MpOworI2VuZGlmIC8qIExJTktTUEVFRF9ERUJVR19FTkFCTEVEICovCisJCX0KKwl9CisJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fVFhfQklUUkFURTsKKworCXNpbmZvLT50eF9ieXRlcyA9IHBBZGFwdGVyLT5zdGF0cy50eF9ieXRlczsKKwlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19UWF9CWVRFUzsKKworCXNpbmZvLT50eF9wYWNrZXRzID0KKwkJcEFkYXB0ZXItPmhkZF9zdGF0cy5zdW1tYXJ5X3N0YXQudHhfZnJtX2NudFswXSArCisJCXBBZGFwdGVyLT5oZGRfc3RhdHMuc3VtbWFyeV9zdGF0LnR4X2ZybV9jbnRbMV0gKworCQlwQWRhcHRlci0+aGRkX3N0YXRzLnN1bW1hcnlfc3RhdC50eF9mcm1fY250WzJdICsKKwkJcEFkYXB0ZXItPmhkZF9zdGF0cy5zdW1tYXJ5X3N0YXQudHhfZnJtX2NudFszXTsKKworCXNpbmZvLT50eF9yZXRyaWVzID0KKwkJcEFkYXB0ZXItPmhkZF9zdGF0cy5zdW1tYXJ5X3N0YXQucmV0cnlfY250WzBdICsKKwkJcEFkYXB0ZXItPmhkZF9zdGF0cy5zdW1tYXJ5X3N0YXQucmV0cnlfY250WzFdICsKKwkJcEFkYXB0ZXItPmhkZF9zdGF0cy5zdW1tYXJ5X3N0YXQucmV0cnlfY250WzJdICsKKwkJcEFkYXB0ZXItPmhkZF9zdGF0cy5zdW1tYXJ5X3N0YXQucmV0cnlfY250WzNdOworCisJc2luZm8tPnR4X2ZhaWxlZCA9CisJCXBBZGFwdGVyLT5oZGRfc3RhdHMuc3VtbWFyeV9zdGF0LmZhaWxfY250WzBdICsKKwkJcEFkYXB0ZXItPmhkZF9zdGF0cy5zdW1tYXJ5X3N0YXQuZmFpbF9jbnRbMV0gKworCQlwQWRhcHRlci0+aGRkX3N0YXRzLnN1bW1hcnlfc3RhdC5mYWlsX2NudFsyXSArCisJCXBBZGFwdGVyLT5oZGRfc3RhdHMuc3VtbWFyeV9zdGF0LmZhaWxfY250WzNdOworCisJc2luZm8tPmZpbGxlZCB8PQorCQlTVEFUSU9OX0lORk9fVFhfUEFDS0VUUyB8CisJCVNUQVRJT05fSU5GT19UWF9SRVRSSUVTIHwgU1RBVElPTl9JTkZPX1RYX0ZBSUxFRDsKKworCXNpbmZvLT5yeF9ieXRlcyA9IHBBZGFwdGVyLT5zdGF0cy5yeF9ieXRlczsKKwlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19SWF9CWVRFUzsKKworCXNpbmZvLT5yeF9wYWNrZXRzID0gcEFkYXB0ZXItPnN0YXRzLnJ4X3BhY2tldHM7CisJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fUlhfUEFDS0VUUzsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkgVFJBQ0VfQ09ERV9IRERfQ0ZHODAyMTFfR0VUX1NUQSwKKwkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLCBtYXhSYXRlKSk7CisJRVhJVCgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2dldF9zdGF0aW9uKCkgLSBnZXQgc3RhdGlvbiBzdGF0aXN0aWNzCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqIEBtYWM6IFBvaW50ZXIgdG8gbWFjCisgKiBAc2luZm86IFBvaW50ZXIgdG8gc3RhdGlvbiBpbmZvCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQkgIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQorI2Vsc2UKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDhfdCAqbWFjLAorCQkJCSAgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCisjZW5kaWYKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2dldF9zdGF0aW9uKHdpcGh5LCBkZXYsIG1hYywgc2luZm8pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGRkX2dldF9zdGF0cygpIC0gRnVuY3Rpb24gdG8gcmV0cmlldmUgaW50ZXJmYWNlIHN0YXRpc3RpY3MKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBuZG9fZ2V0X3N0YXRzIG1ldGhvZCBmb3IgYWxsIG5ldGRldnMKKyAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUga2VybmVsCisgKgorICogUmV0dXJuOiBwb2ludGVyIHRvIG5ldF9kZXZpY2Vfc3RhdHMgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpoZGRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCisJcmV0dXJuICZhZGFwdGVyLT5zdGF0czsKK30KKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV9kdW1wX3N1cnZleSgpIC0gZ2V0IHN1cnZleSByZWxhdGVkIGluZm8KKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQGlkeDogSW5kZXgKKyAqIEBzdXJ2ZXk6IFBvaW50ZXIgdG8gc3VydmV5IGluZm8KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV9kdW1wX3N1cnZleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICBpbnQgaWR4LCBzdHJ1Y3Qgc3VydmV5X2luZm8gKnN1cnZleSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHg7CisJdEhhbEhhbmRsZSBoYWxIYW5kbGU7CisJdWludDMyX3QgY2hhbm5lbCA9IDAsIGZyZXEgPSAwOyAvKiBJbml0aWFsaXphdGlvbiBSZXF1aXJlZCAqLworCWludDhfdCBzbnIsIHJzc2k7CisJaW50IHN0YXR1cywgaSwgaiwgZmlsbGVkID0gMDsKKworCUVOVEVSKCk7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRMb2coTE9HRSwgRkwoIkNvbW1hbmQgbm90IGFsbG93ZWQgaW4gRlRNIG1vZGUiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlzdGF0dXMgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworCWlmICgwID09IHBIZGRDdHgtPmNvbmZpZy0+ZkVuYWJsZVNOUk1vbml0b3JpbmcgfHwKKwkgICAgMCAhPSBwQWRhcHRlci0+c3VydmV5X2lkeCB8fAorCSAgICBlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgIT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgeworCQkvKiBUaGUgc3VydmV5IGR1bXAgb3BzIHdoZW4gaW1wbGVtZW50ZWQgY29tcGxldGVseSBpcyBleHBlY3RlZAorCQkgKiB0byByZXR1cm4gYSBzdXJ2ZXkgb2YgYWxsIGNoYW5uZWxzIGFuZCB0aGUgb3BzIGlzIGNhbGxlZCBieQorCQkgKiB0aGUga2VybmVsIHdpdGggaW5jcmVtZW50YWwgdmFsdWVzIG9mIHRoZSBhcmd1bWVudCAnaWR4JworCQkgKiB0aWxsIGl0IHJldHVybnMgLUVOT05FVC4gQnV0IHdlIGNhbiBvbmx5IHN1cHBvcnQgdGhlIHN1cnZleQorCQkgKiBmb3IgdGhlIG9wZXJhdGluZyBjaGFubmVsIGZvciBub3cuIHN1cnZleV9pZHggaXMgdXNlZCB0bworCQkgKiB0cmFjayB0aGF0IHRoZSBvcHMgaXMgY2FsbGVkIG9ubHkgb25jZSBhbmQgdGhlbiByZXR1cm4KKwkJICogLUVOT05FVCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uCisJCSAqLworCQlwQWRhcHRlci0+c3VydmV5X2lkeCA9IDA7CisJCXJldHVybiAtRU5PTkVUOworCX0KKworCWlmICghcEhkZFN0YUN0eC0+aGRkX1JlYXNzb2NTY2VuYXJpbykgeworCQloZGRfZXJyKCJSb2FtaW5nIGluIHByb2dyZXNzLCBoZW5jZSByZXR1cm4iKTsKKwkJcmV0dXJuIC1FTk9ORVQ7CisJfQorCisJaGFsSGFuZGxlID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCisJd2xhbl9oZGRfZ2V0X3NucihwQWRhcHRlciwgJnNucik7CisJd2xhbl9oZGRfZ2V0X3Jzc2kocEFkYXB0ZXIsICZyc3NpKTsKKworCXNtZV9nZXRfb3BlcmF0aW9uX2NoYW5uZWwoaGFsSGFuZGxlLCAmY2hhbm5lbCwgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJaGRkX3dsYW5fZ2V0X2ZyZXEoY2hhbm5lbCwgJmZyZXEpOworCisJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGkrKykgeworCQlpZiAoTlVMTCA9PSB3aXBoeS0+YmFuZHNbaV0pIHsKKwkJCWhkZExvZyhMT0cxLCBGTCgid2lwaHktPmJhbmRzW2ldIGlzIE5VTEwsIGkgPSAlZCIpLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IHdpcGh5LT5iYW5kc1tpXS0+bl9jaGFubmVsczsgaisrKSB7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpiYW5kID0gd2lwaHktPmJhbmRzW2ldOworCisJCQlpZiAoYmFuZC0+Y2hhbm5lbHNbal0uY2VudGVyX2ZyZXEgPT0gKHVpbnQxNl90KSBmcmVxKSB7CisJCQkJc3VydmV5LT5jaGFubmVsID0gJmJhbmQtPmNoYW5uZWxzW2pdOworCQkJCS8qIFRoZSBSeCBCRHMgY29udGFpbiBTTlIgdmFsdWVzIGluIGRCIGZvciB0aGUKKwkJCQkgKiByZWNlaXZlZCBmcmFtZXMgd2hpbGUgdGhlIHN1cHBsaWNhbnQgZXhwZWN0cworCQkJCSAqIG5vaXNlLiBTbyB3ZSBjYWxjdWxhdGUgYW5kIHJldHVybiB0aGUgdmFsdWUKKwkJCQkgKiBvZiBub2lzZSAoZEJtKQorCQkJCSAqICBTTlIgKGRCKSA9IFJTU0kgKGRCbSkgLSBOT0lTRSAoZEJtKQorCQkJCSAqLworCQkJCXN1cnZleS0+bm9pc2UgPSByc3NpIC0gc25yOworCQkJCXN1cnZleS0+ZmlsbGVkID0gU1VSVkVZX0lORk9fTk9JU0VfREJNOworCQkJCWZpbGxlZCA9IDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZmlsbGVkKQorCQlwQWRhcHRlci0+c3VydmV5X2lkeCA9IDE7CisJZWxzZSB7CisJCXBBZGFwdGVyLT5zdXJ2ZXlfaWR4ID0gMDsKKwkJcmV0dXJuIC1FTk9ORVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZHVtcF9zdXJ2ZXkoKSAtIGdldCBzdXJ2ZXkgcmVsYXRlZCBpbmZvCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqIEBpZHg6IEluZGV4CisgKiBAc3VydmV5OiBQb2ludGVyIHRvIHN1cnZleSBpbmZvCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZHVtcF9zdXJ2ZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBpbnQgaWR4LCBzdHJ1Y3Qgc3VydmV5X2luZm8gKnN1cnZleSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2R1bXBfc3VydmV5KHdpcGh5LCBkZXYsIGlkeCwgc3VydmV5KTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorLyoqCisgKiBoZGRfaW5pdF9sbF9zdGF0c19jdHgoKSAtIGluaXRpYWxpemUgbGluayBsYXllciBzdGF0cyBjb250ZXh0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK2lubGluZSB2b2lkIGhkZF9pbml0X2xsX3N0YXRzX2N0eCh2b2lkKQoreworCXNwaW5fbG9ja19pbml0KCZsbF9zdGF0c19jb250ZXh0LmNvbnRleHRfbG9jayk7CisJaW5pdF9jb21wbGV0aW9uKCZsbF9zdGF0c19jb250ZXh0LnJlc3BvbnNlX2V2ZW50KTsKKwlsbF9zdGF0c19jb250ZXh0LnJlcXVlc3RfYml0bWFwID0gMDsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9zdGF0cy5oIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1ZTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF9zdGF0cy5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKgorICogRE9DIDogd2xhbl9oZGRfc3RhdHMuaAorICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIHN0YXRpc3RpY3MgcmVsYXRlZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqLworCisjaWYgIWRlZmluZWQoV0xBTl9IRERfU1RBVFNfSCkKKyNkZWZpbmUgV0xBTl9IRERfU1RBVFNfSAorCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorCisjZGVmaW5lIElOVkFMSURfTUNTX0lEWCAyNTUKKyNkZWZpbmUgTUFYX0hUX01DU19JRFggOAorI2RlZmluZSBNQVhfVkhUX01DU19JRFggMTAKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisjZGVmaW5lIERBVEFfUkFURV8xMUFDX01DU19NQVNLICAgIDB4MDMKKworLyogTEwgc3RhdHMgZ2V0IHJlcXVlc3QgdGltZSBvdXQgdmFsdWUgKi8KKyNkZWZpbmUgV0xBTl9XQUlUX1RJTUVfTExfU1RBVFMgNTAwMAorCisvKioKKyAqIHN0cnVjdCBpbmRleF92aHRfZGF0YV9yYXRlX3R5cGUgLSB2aHQgZGF0YSByYXRlIHR5cGUKKyAqIEBiZWFjb25fcmF0ZV9pbmRleDogQmVhY29uIHJhdGUgaW5kZXgKKyAqIEBzdXBwb3J0ZWRfVkhUODBfcmF0ZTogVkhUODAgcmF0ZQorICogQHN1cHBvcnRlZF9WSFQ0MF9yYXRlOiBWSFQ0MCByYXRlCisgKiBAc3VwcG9ydGVkX1ZIVDIwX3JhdGU6IFZIVDIwIHJhdGUKKyAqLworc3RydWN0IGluZGV4X3ZodF9kYXRhX3JhdGVfdHlwZSB7CisJdWludDhfdCBiZWFjb25fcmF0ZV9pbmRleDsKKwl1aW50MTZfdCBzdXBwb3J0ZWRfVkhUODBfcmF0ZVsyXTsKKwl1aW50MTZfdCBzdXBwb3J0ZWRfVkhUNDBfcmF0ZVsyXTsKKwl1aW50MTZfdCBzdXBwb3J0ZWRfVkhUMjBfcmF0ZVsyXTsKK307CisKKy8qKgorICogZW51bSAtIGVEYXRhUmF0ZTExQUNNYXhNY3MKKyAqIEBEQVRBX1JBVEVfMTFBQ19NQVhfTUNTXzc6IE1DUzcgcmF0ZQorICogQERBVEFfUkFURV8xMUFDX01BWF9NQ1NfODogTUNTOCByYXRlCisgKiBAREFUQV9SQVRFXzExQUNfTUFYX01DU185OiBNQ1M5IHJhdGUKKyAqIEBEQVRBX1JBVEVfMTFBQ19NQVhfTUNTX05BOmkgTm90IGFwcGxpY2FibGUKKyAqLworZW51bSBlRGF0YVJhdGUxMUFDTWF4TWNzeworCURBVEFfUkFURV8xMUFDX01BWF9NQ1NfNywKKwlEQVRBX1JBVEVfMTFBQ19NQVhfTUNTXzgsCisJREFUQV9SQVRFXzExQUNfTUFYX01DU185LAorCURBVEFfUkFURV8xMUFDX01BWF9NQ1NfTkEKK307CisjZW5kaWYgLyogRW5kIG9mIFdMQU5fRkVBVFVSRV8xMUFDICovCisKKy8qKgorICogc3RydWN0IGluZGV4X2RhdGFfcmF0ZV90eXBlIC0gbm9uIHZodCBkYXRhIHJhdGUgdHlwZQorICogQGJlYWNvbl9yYXRlX2luZGV4OiBCZWFjb24gcmF0ZSBpbmRleAorICogQHN1cHBvcnRlZF9yYXRlOiBTdXBwb3J0ZWQgcmF0ZSB0YWJsZQorICovCitzdHJ1Y3QgaW5kZXhfZGF0YV9yYXRlX3R5cGUgeworCXVpbnQ4X3QgYmVhY29uX3JhdGVfaW5kZXg7CisJdWludDE2X3Qgc3VwcG9ydGVkX3JhdGVbNF07Cit9OworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKKy8qCisgKiBVc2VkIHRvIGFsbG9jYXRlIHRoZSBzaXplIG9mIDQwOTYgZm9yIHRoZSBsaW5rIGxheWVyIHN0YXRzLgorICogVGhlIHNpemUgb2YgNDA5NiBpcyBjb25zaWRlcmVkIGFzc3VtaW5nIHRoYXQgYWxsIGRhdGEgcGVyCisgKiByZXNwZWN0aXZlIGV2ZW50IGZpdCB3aXRoIGluIHRoZSBsaW1pdC5QbGVhc2UgdGFrZSBhIGNhbGwKKyAqIG9uIHRoZSBsaW1pdCBiYXNlZCBvbiB0aGUgZGF0YSByZXF1aXJlbWVudHMgb24gbGluayBsYXllcgorICogc3RhdGlzdGljcy4KKyAqLworI2RlZmluZSBMTF9TVEFUU19FVkVOVF9CVUZfU0laRSA0MDk2CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfbGxfc3RhdHNfc2V0KCkgLSBzZXQgbGluayBsYXllciBzdGF0cworICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5CisgKiBAd2RldjogUG9pbnRlciB0byB3ZGV2CisgKiBAZGF0YTogUG9pbnRlciB0byBkYXRhCisgKiBAZGF0YV9sZW46IERhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiBpbnQKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX2xsX3N0YXRzX3NldChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICBpbnQgZGF0YV9sZW4pOworCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2xsX3N0YXRzX2dldCgpIC0gZ2V0IGxpbmsgbGF5ZXIgc3RhdHMKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gd2RldgorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogaW50CisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9sbF9zdGF0c19nZXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgaW50IGRhdGFfbGVuKTsKKworCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX2xsX3N0YXRzX2NsZWFyKCkgLSBjbGVhciBsaW5rIGxheWVyIHN0YXRzCisgKiBAd2lwaHk6IFBvaW50ZXIgdG8gd2lwaHkKKyAqIEB3ZGV2OiBQb2ludGVyIHRvIHdkZXYKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRhdGEKKyAqIEBkYXRhX2xlbjogRGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IGludAorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfbGxfc3RhdHNfY2xlYXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgaW50IGRhdGFfbGVuKTsKKwordm9pZCBoZGRfaW5pdF9sbF9zdGF0c19jdHgodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGhkZF9pbml0X2xsX3N0YXRzX2N0eCh2b2lkKQoreworCXJldHVybjsKK30KKworI2VuZGlmIC8qIEVuZCBvZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUyAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1NUQVRTX0VYVAorLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9zdGF0c19leHRfcmVxdWVzdCgpIC0gZXh0IHN0YXRzIHJlcXVlc3QKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQHdkZXY6IFBvaW50ZXIgdG8gd2RldgorICogQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICogQGRhdGFfbGVuOiBEYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogaW50CisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zdGF0c19leHRfcmVxdWVzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCQljb25zdCB2b2lkICpkYXRhLAorCQkJCQlpbnQgZGF0YV9sZW4pOworI2VuZGlmIC8qIEVuZCBvZiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUICovCisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3N0YXRpb24oKSAtIGdldCBzdGF0aW9uIHN0YXRpc3RpY3MKKyAqIEB3aXBoeTogUG9pbnRlciB0byB3aXBoeQorICogQGRldjogUG9pbnRlciB0byBuZXR3b3JrIGRldmljZQorICogQG1hYzogUG9pbnRlciB0byBtYWMKKyAqIEBzaW5mbzogUG9pbnRlciB0byBzdGF0aW9uIGluZm8KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE2LCAwKSkKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdWludDhfdCAqbWFjLAorCQkJCSAgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pOworI2Vsc2UKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDhfdCAqbWFjLAorCQkJCSAgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pOworI2VuZGlmCisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpoZGRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZHVtcF9zdXJ2ZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBpbnQgaWR4LCBzdHJ1Y3Qgc3VydmV5X2luZm8gKnN1cnZleSk7CisjZW5kaWYgLyogZW5kICNpZiAhZGVmaW5lZChXTEFOX0hERF9TVEFUU19IKSAqLworCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfdGRscy5jIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX3RkbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTk3MjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX3RkbHMuYwpAQCAtMCwwICsxLDQ3MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiB3bGFuX2hkZF90ZGxzLmMKKyAqCisgKiBXTEFOIEhvc3QgRGV2aWNlIERyaXZlciBpbXBsZW1lbnRhdGlvbiBmb3IgVERMUworICovCisKKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2hvc3RhcGQuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF90cmFjZS5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KKyNpbmNsdWRlICJ3bGFuX2hkZF90ZGxzLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfY2ZnODAyMTEuaCIKKyNpbmNsdWRlICJjZHNfc2NoZWQuaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKworc3RhdGljIGludDMyX3Qgd2xhbl9oZGRfdGRsc19wZWVyX3Jlc2V0X2Rpc2NvdmVyeV9wcm9jZXNzZWQodGRsc0N0eF90ICoKKwkJCQkJCQkgICAgcEhkZFRkbHNDdHgpOworc3RhdGljIHZvaWQgd2xhbl9oZGRfdGRsc190aW1lcnNfZGVzdHJveSh0ZGxzQ3R4X3QgKnBIZGRUZGxzQ3R4KTsKK2ludCB3cGFfdGRsc19pc19hbGxvd2VkX2ZvcmNlX3BlZXIodGRsc0N0eF90ICpwSGRkVGRsc0N0eCwgdTggKm1hYyk7CitzdGF0aWMgdm9pZCB3bGFuX2hkZF90ZGxzX3ByZV9zZXR1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisvKioKKyAqIHdsYW5faGRkX3RkbHNfaGFzaF9rZXkoKSAtIGNhbGN1bGF0ZSB0ZGxzIGhhc2gga2V5IGdpdmVuIG1hYyBhZGRyZXNzCisgKiBAbWFjOiBtYWMgYWRkcmVzcworICoKKyAqIFJldHVybjogaGFzaCBrZXkKKyAqLworc3RhdGljIHU4IHdsYW5faGRkX3RkbHNfaGFzaF9rZXkoY29uc3QgdTggKm1hYykKK3sKKwlpbnQgaTsKKwl1OCBrZXkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJa2V5IF49IG1hY1tpXTsKKworCXJldHVybiBrZXk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19kaXNhYmxlX29mZmNoYW5fYW5kX3RlYXJkb3duX2xpbmtzIC0gRGlzYWJsZSBvZmZjaGFubmVsCisgKiBhbmQgdGVhcmRvd24gVERMUyBsaW5rcworICogQGhkZEN0eCA6IHBvaW50ZXIgdG8gaGRkIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX2Rpc2FibGVfb2ZmY2hhbl9hbmRfdGVhcmRvd25fbGlua3MoaGRkX2NvbnRleHRfdCAqaGRkY3R4KQoreworCXUxNiBjb25uZWN0ZWRfdGRsc19wZWVycyA9IDA7CisJdTggc3RhaWR4OworCWhkZFRkbHNQZWVyX3QgKmN1cnJfcGVlciA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IE5VTEw7CisKKwlpZiAoZVRETFNfU1VQUE9SVF9OT1RfRU5BQkxFRCA9PSBoZGRjdHgtPnRkbHNfbW9kZSkgeworCQloZGRMb2coTE9HMSwgRkwoIlRETFMgbW9kZSBpcyBkaXNhYmxlZCBPUiBub3QgZW5hYmxlZCBpbiBGVyIpKTsKKwkJcmV0dXJuIDsKKwl9CisKKwlhZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKGhkZGN0eCwgV0xBTl9IRERfSU5GUkFfU1RBVElPTik7CisKKwlpZiAoYWRhcHRlciA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiU3RhdGlvbiBBZGFwdGVyIE5vdCBGb3VuZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWNvbm5lY3RlZF90ZGxzX3BlZXJzID0gd2xhbl9oZGRfdGRsc19jb25uZWN0ZWRfcGVlcnMoYWRhcHRlcik7CisKKwlpZiAoIWNvbm5lY3RlZF90ZGxzX3BlZXJzKQorCQlyZXR1cm4gOworCisJLyogVERMUyBpcyBub3Qgc3VwcG9ydGVkIGluIGNhc2Ugb2YgY29uY3VycmVuY3kuCisJICogRGlzYWJsZSBURExTIE9mZmNoYW5uZWwgaW4gRlcgdG8gYXZvaWQgbW9yZQorCSAqIHRoYW4gdHdvIGNvbmN1cnJlbnQgY2hhbm5lbHMgYW5kIGdlbmVyYXRlIFRETFMKKwkgKiB0ZWFyZG93biBpbmRpY2F0aW9uIHRvIHN1cHBsaWNhbnQuCisJICogQmVsb3cgZnVuY3Rpb24gRmluZHMgdGhlIGZpcnN0IGNvbm5lY3RlZCBwZWVyIGFuZAorCSAqIGRpc2FibGVzIFRETFMgb2ZmY2hhbm5lbCBmb3IgdGhhdCBwZWVyLgorCSAqIEZXIGVuYWJsZXMgVERMUyBvZmZjaGFubmVsIG9ubHkgd2hlbiB0aGVyZSBpcworCSAqIG9uZSBURExTIHBlZXIuIFdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgVERMUyBwZWVyLAorCSAqIHRoZXJlIHdpbGwgbm90IGJlIFRETFMgb2ZmY2hhbm5lbCBpbiBGVy4KKwkgKiBTbyB0byBhdm9pZCBzZW5kaW5nIG11bHRpcGxlIHJlcXVlc3QgdG8gRlcsIGZvciBub3csCisJICoganVzdCBpbnZva2Ugb2ZmY2hhbm5lbCBtb2RlIGZ1bmN0aW9ucyBvbmx5IG9uY2UKKwkgKi8KKwloZGRfc2V0X3RkbHNfb2ZmY2hhbm5lbChoZGRjdHgsIGhkZGN0eC0+Y29uZmlnLT5mVERMU1ByZWZPZmZDaGFuTnVtKTsKKwloZGRfc2V0X3RkbHNfc2Vjb2ZmY2hhbm5lbG9mZnNldChoZGRjdHgsCisJCQlURExTX1NFQ19PRkZDSEFOX09GRlNFVF80MFBMVVMpOworCWhkZF9zZXRfdGRsc19vZmZjaGFubmVsbW9kZShhZGFwdGVyLCBESVNBQkxFX0NIQU5TV0lUQ0gpOworCisJZm9yIChzdGFpZHggPSAwOyBzdGFpZHggPCBoZGRjdHgtPm1heF9udW1fdGRsc19zdGE7CisJCQkJCQkJc3RhaWR4KyspIHsKKwkJaWYgKCFoZGRjdHgtPnRkbHNDb25uSW5mb1tzdGFpZHhdLnN0YUlkKQorCQkJY29udGludWU7CisKKwkJY3Vycl9wZWVyID0gd2xhbl9oZGRfdGRsc19maW5kX2FsbF9wZWVyKGhkZGN0eCwKKwkJCQloZGRjdHgtPnRkbHNDb25uSW5mb1tzdGFpZHhdLnBlZXJNYWMuYnl0ZXMpOworCisJCWlmICghY3Vycl9wZWVyKQorCQkJY29udGludWU7CisKKwkJaGRkTG9nKExPRzEsIEZMKCJpbmRpY2F0ZSBURExTIHRlYXJkb3duIChzdGFJZCAlZCkiKSwKKwkJCQljdXJyX3BlZXItPnN0YUlkKTsKKworCQl3bGFuX2hkZF90ZGxzX2luZGljYXRlX3RlYXJkb3duKAorCQkJCQljdXJyX3BlZXItPnBIZGRUZGxzQ3R4LT5wQWRhcHRlciwKKwkJCQkJY3Vycl9wZWVyLAorCQkJCQllU0lSX01BQ19URExTX1RFQVJET1dOX1VOU1BFQ19SRUFTT04pOworCX0KK30KKworLyoqCisgKiBoZGRfdGRsc19ub3RpZnlfbW9kZV9jaGFuZ2UgLSBOb3RpZnkgbW9kZSBjaGFuZ2UKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIGhkZCBhZGFwdGVyCisgKiBAaGRkQ3R4IDogcG9pbnRlciB0byBoZGQgY29udGV4dAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGhkZF90ZGxzX25vdGlmeV9tb2RlX2NoYW5nZShoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBoZGRfY29udGV4dF90ICpoZGRjdHgpCit7CisJaWYgKGFkYXB0ZXItPmRldmljZV9tb2RlICE9IFdMQU5fSEREX0lORlJBX1NUQVRJT04pCisJCXdsYW5faGRkX3RkbHNfZGlzYWJsZV9vZmZjaGFuX2FuZF90ZWFyZG93bl9saW5rcyhoZGRjdHgpOworfQorCisKKy8qKgorICogd2xhbl9oZGRfdGRsc19wcmVfc2V0dXBfaW5pdF93b3JrKCkgLSBzY2hlZHVsZSB3b3JrIGZvciB0ZGxzIHByZS1zZXR1cAorICogQHBIZGRUZGxzQ3R4OiBIREQgVERMUyBjb250ZXh0CisgKiBAY3Vycl9jYW5kaWRhdGU6IGN1cnJlbnQgY2FuZGlkYXRlIHBlZXIKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX3ByZV9zZXR1cF9pbml0X3dvcmsodGRsc0N0eF90ICpwSGRkVGRsc0N0eCwKKwkJCQkgICAgICAgaGRkVGRsc1BlZXJfdCAqY3Vycl9jYW5kaWRhdGUpCit7CisJaWYgKCFwSGRkVGRsc0N0eCB8fCAhY3Vycl9jYW5kaWRhdGUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogZWl0aGVyIHBIZGRUZGxzQ3R4IG9yIGN1cnJfY2FuZGlkYXRlIGlzIG51bGwiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoVERMU19DVFhfTUFHSUMgIT0gcEhkZFRkbHNDdHgtPm1hZ2ljKSB7CisJCS8qIFdoZW4gVERMUyBkaXNjb3ZlcnkgYXR0ZW1wdCBmb3IgYSBwZWVyIHJlYWNoZXMgdG8gbWF4IGNvbmZpZ3VyZWQKKwkJICogdGhyZXNob2xkIHRoZW4gdGRscyBzdXBwb3J0IGZvciB0aGF0IHBlZXIgd291bGQgYmUgZGlzYWJsZWQgYW5kCisJCSAqIGluIHRoYXQgY2FzZSwgaWdub3JlIGRpc2NvdmVyeSB0cmlnZ2VyIGZyb20gRlcgZm9yIHRoYXQgcGVlci4KKwkJICovCisJCWlmIChlVERMU19DQVBfTk9UX1NVUFBPUlRFRCA9PSBjdXJyX2NhbmRpZGF0ZS0+dGRsc19zdXBwb3J0KSB7CisJCQloZGRMb2coTE9HVywKKwkJCQkgICIlczogdGRsc19zdXBwb3J0IGlzIG1hcmtlZCBkaXNhYmxlZCBmb3IgcGVlcjogIgorCQkJCSAgTUFDX0FERFJFU1NfU1RSCisJCQkJICAiLCBpZ25vcmUgcHJlX3NldHVwX2luaXRfd29yayIsIF9fZnVuY19fLAorCQkJCSAgTUFDX0FERFJfQVJSQVkoY3Vycl9jYW5kaWRhdGUtPnBlZXJNYWMpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBIZGRUZGxzQ3R4LT5jdXJyX2NhbmRpZGF0ZSA9IGN1cnJfY2FuZGlkYXRlOworCQlwSGRkVGRsc0N0eC0+bWFnaWMgPSBURExTX0NUWF9NQUdJQzsKKworCQlzY2hlZHVsZV93b3JrKCZwSGRkVGRsc0N0eC0+aW1wbGljaXRfc2V0dXApOworCX0KK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX3ByZV9zZXR1cF9pbml0X3dvcmsoKSAtIGdldCB2YWx1ZSBvZiBkaXNjb3ZlcnkgY291bnRlciBzZW50CisgKiBAcEhkZEN0eDogSEREIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IHRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNtaXR0ZWQgVERMUyBkaXNjb3ZlcnkgY291bnRlcgorICovCitzdGF0aWMgdWludDMyX3Qgd2xhbl9oZGRfdGRsc19kaXNjb3Zlcnlfc2VudF9jbnQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKwloZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcEFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7CisJdGRsc0N0eF90ICpwSGRkVGRsc0N0eCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSAwOworCXVpbnQzMl90IGNvdW50ID0gMDsKKworCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihwSGRkQ3R4LCAmcEFkYXB0ZXJOb2RlKTsKKwl3aGlsZSAoTlVMTCAhPSBwQWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlwQWRhcHRlciA9IHBBZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisKKwkJcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTsKKwkJaWYgKE5VTEwgIT0gcEhkZFRkbHNDdHgpIHsKKwkJCWNvdW50ID0gY291bnQgKyBwSGRkVGRsc0N0eC0+ZGlzY292ZXJ5X3NlbnRfY250OworCQl9CisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKHBIZGRDdHgsIHBBZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2NoZWNrX3Bvd2VyX3NhdmVfcHJvaGliaXRlZCgpIC0gc2V0L2NsZWFyIHByb3BlciBURExTIHBvd2VyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZSBwcm9iaWhpdGVkIGJpdAorICogQHBBZGFwdGVyOiBIREQgYWRhcHRlciBoYW5kbGUKKyAqCisgKiBFbnN1cmUgVERMUyBwb3dlciBzYXZlIHByb2JpaGl0ZWQgYml0IGlzIHNldC9jbGVhcmVkIHByb3Blcmx5CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5faGRkX3RkbHNfY2hlY2tfcG93ZXJfc2F2ZV9wcm9oaWJpdGVkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKwlpZiAoKE5VTEwgPT0gcEhkZFRkbHNDdHgpIHx8IChOVUxMID09IHBIZGRDdHgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZEN0eCBvciBwSGRkVGRsc0N0eCBwb2ludHMgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoMCA9PSBwSGRkQ3R4LT5jb25uZWN0ZWRfcGVlcl9jb3VudCkgJiYKKwkgICAgKDAgPT0gd2xhbl9oZGRfdGRsc19kaXNjb3Zlcnlfc2VudF9jbnQocEhkZEN0eCkpKSB7CisJCXNtZV9zZXRfdGRsc19wb3dlcl9zYXZlX3Byb2hpYml0ZWQoV0xBTl9IRERfR0VUX0hBTF9DVFgKKwkJCQkJCQkgICAocEhkZFRkbHNDdHgtPnBBZGFwdGVyKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsIDApOworCQlyZXR1cm47CisJfQorCXNtZV9zZXRfdGRsc19wb3dlcl9zYXZlX3Byb2hpYml0ZWQoV0xBTl9IRERfR0VUX0hBTF9DVFgKKwkJCQkJCSAgIChwSGRkVGRsc0N0eC0+cEFkYXB0ZXIpLAorCQkJCQkgICBwQWRhcHRlci0+c2Vzc2lvbklkLCAxKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19mcmVlX3NjYW5fcmVxdWVzdCgpIC0gZnJlZSB0ZGxzIHNjYW4gcmVxdWVzdAorICogQHRkbHNfc2Nhbl9jdHg6IHRkbHMgc2NhbiBjb250ZXh0CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5faGRkX3RkbHNfZnJlZV9zY2FuX3JlcXVlc3QodGRsc19zY2FuX2NvbnRleHRfdCAqdGRsc19zY2FuX2N0eCkKK3sKKwlpZiAoTlVMTCA9PSB0ZGxzX3NjYW5fY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgidGRsc19zY2FuX2N0eCBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJdGRsc19zY2FuX2N0eC0+YXR0ZW1wdCA9IDA7CisJdGRsc19zY2FuX2N0eC0+cmVqZWN0ID0gMDsKKwl0ZGxzX3NjYW5fY3R4LT5tYWdpYyA9IDA7CisJdGRsc19zY2FuX2N0eC0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19kaXNjb3ZlcnlfdGltZW91dF9wZWVyX2NiKCkgLSB0ZGxzIGRpc2NvdmVyeSB0aW1lb3V0IGNhbGxiYWNrCisgKiBAdXNlckRhdGE6IHRkbHMgY29udGV4dAorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCB3bGFuX2hkZF90ZGxzX2Rpc2NvdmVyeV90aW1lb3V0X3BlZXJfY2Iodm9pZCAqdXNlckRhdGEpCit7CisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwloZGRUZGxzUGVlcl90ICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqcTsKKwl0ZGxzQ3R4X3QgKnBIZGRUZGxzQ3R4OworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKwlwSGRkVGRsc0N0eCA9ICh0ZGxzQ3R4X3QgKikgdXNlckRhdGE7CisKKwlpZiAoKE5VTEwgPT0gcEhkZFRkbHNDdHgpIHx8IChOVUxMID09IHBIZGRUZGxzQ3R4LT5wQWRhcHRlcikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJwSGRkVGRsc0N0eCBvciBwQWRhcHRlciBwb2ludHMgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IHBIZGRUZGxzQ3R4LT5wQWRhcHRlci0+bWFnaWMpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwQWRhcHRlciBoYXMgaW52YWxpZCBtYWdpYyIpKTsKKwkJcmV0dXJuOworCX0KKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBIZGRUZGxzQ3R4LT5wQWRhcHRlcik7CisJaWYgKDAgIT0gKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZEN0eCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTlVMTCA9PSBwSGRkQ3R4KQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IFRETFNfUEVFUl9MSVNUX1NJWkU7IGkrKykgeworCQloZWFkID0gJnBIZGRUZGxzQ3R4LT5wZWVyX2xpc3RbaV07CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHEsIGhlYWQpIHsKKwkJCXRtcCA9IGxpc3RfZW50cnkocG9zLCBoZGRUZGxzUGVlcl90LCBub2RlKTsKKwkJCWlmIChlVERMU19MSU5LX0RJU0NPVkVSSU5HID09IHRtcC0+bGlua19zdGF0dXMpIHsKKwkJCQltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJCQkJaGRkTG9nKExPRzEsCisJCQkJCSAgIiVzOiAiIE1BQ19BRERSRVNTX1NUUgorCQkJCQkgICIgdG8gaWRsZSBzdGF0ZSIsIF9fZnVuY19fLAorCQkJCQkgIE1BQ19BRERSX0FSUkFZKHRtcC0+cGVlck1hYykpOworCQkJCXdsYW5faGRkX3RkbHNfc2V0X3BlZXJfbGlua19zdGF0dXModG1wLAorCQkJCQkJCQkgICBlVERMU19MSU5LX0lETEUsCisJCQkJCQkJCSAgIGVURExTX0xJTktfTk9UX1NVUFBPUlRFRCk7CisJCQkJbXV0ZXhfbG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwkJCX0KKwkJfQorCX0KKworCXBIZGRUZGxzQ3R4LT5kaXNjb3Zlcnlfc2VudF9jbnQgPSAwOworCXdsYW5faGRkX3RkbHNfY2hlY2tfcG93ZXJfc2F2ZV9wcm9oaWJpdGVkKHBIZGRUZGxzQ3R4LT5wQWRhcHRlcik7CisKKwltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19mcmVlX2xpc3QoKSAtIGZyZWUgVERMUyBwZWVyIGxpc3QKKyAqIEBwSGRkVGRsc0N0eDogVERMUyBjb250ZXh0CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5faGRkX3RkbHNfZnJlZV9saXN0KHRkbHNDdHhfdCAqcEhkZFRkbHNDdHgpCit7CisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwloZGRUZGxzUGVlcl90ICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqcTsKKworCWlmIChOVUxMID09IHBIZGRUZGxzQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZFRkbHNDdHggaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgVERMU19QRUVSX0xJU1RfU0laRTsgaSsrKSB7CisJCWhlYWQgPSAmcEhkZFRkbHNDdHgtPnBlZXJfbGlzdFtpXTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgcSwgaGVhZCkgeworCQkJdG1wID0gbGlzdF9lbnRyeShwb3MsIGhkZFRkbHNQZWVyX3QsIG5vZGUpOworCQkJbGlzdF9kZWwocG9zKTsKKwkJCWNkZl9tZW1fZnJlZSh0bXApOworCQkJdG1wID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX3NjaGVkdWxlX3NjYW4oKSAtIHNjaGVkdWxlIHNjYW4gZm9yIHRkbHMKKyAqIEB3b3JrOiB3b3JrX3N0cnVjdCB1c2VkIHRvIGZpbmQgdGRscyBzY2FuIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfdGRsc19zY2hlZHVsZV9zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl0ZGxzX3NjYW5fY29udGV4dF90ICpzY2FuX2N0eCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCB0ZGxzX3NjYW5fY29udGV4dF90LCB0ZGxzX3NjYW5fd29yay53b3JrKTsKKworCWlmIChOVUxMID09IHNjYW5fY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgic2Nhbl9jdHggaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseShURExTX0NUWF9NQUdJQyAhPSBzY2FuX2N0eC0+bWFnaWMpKQorCQlyZXR1cm47CisKKwlzY2FuX2N0eC0+YXR0ZW1wdCsrOworCisJd2xhbl9oZGRfY2ZnODAyMTFfc2NhbihzY2FuX2N0eC0+d2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJICAgICAgIHNjYW5fY3R4LT5kZXYsCisjZW5kaWYKKwkJCSAgICAgICBzY2FuX2N0eC0+c2Nhbl9yZXF1ZXN0KTsKK30KKworLyoqCisgKiBkdW1wX3RkbHNfc3RhdGVfcGFyYW1fc2V0dGluZygpIC0gcHJpbnQgdGRscyBzdGF0ZSAmIHBhcmFtZXRlcnMgdG8gc2VuZCB0byBmdworICogQGluZm86IHRkbHMgc2V0dGluZyB0byBiZSBzZW50IHRvIGZ3CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIGR1bXBfdGRsc19zdGF0ZV9wYXJhbV9zZXR0aW5nKHRkbHNJbmZvX3QgKmluZm8pCit7CisJaWYgKCFpbmZvKQorCQlyZXR1cm47CisKKwloZGRMb2coTE9HMSwKKwkJRkwoCisJCSAgICJTZXR0aW5nIHRkbHMgc3RhdGUgYW5kIHBhcmFtIGluIGZ3OiB2ZGV2X2lkOiAlZCwgdGRsc19zdGF0ZTogJWQsIG5vdGlmaWNhdGlvbl9pbnRlcnZhbF9tczogJWQsIHR4X2Rpc2NvdmVyeV90aHJlc2hvbGQ6ICVkLCB0eF90ZWFyZG93bl90aHJlc2hvbGQ6ICVkLCByc3NpX3RlYXJkb3duX3RocmVzaG9sZDogJWQsIHJzc2lfZGVsdGE6ICVkLCB0ZGxzX29wdGlvbnM6IDB4JXgsIHBlZXJfdHJhZmZpY19pbmRfd2luZG93OiAlZCwgcGVlcl90cmFmZmljX3Jlc3BvbnNlX3RpbWVvdXQ6ICVkLCBwdWFwc2RfbWFzazogMHgleCwgcHVhcHNkX2luYWN0aXZpdHlfdGltZTogJWQsIHB1YXBzZF9yeF9mcmFtZV90aHJlc2hvbGQ6ICVkIgorCQkpLAorCQlpbmZvLT52ZGV2X2lkLAorCQlpbmZvLT50ZGxzX3N0YXRlLAorCQlpbmZvLT5ub3RpZmljYXRpb25faW50ZXJ2YWxfbXMsCisJCWluZm8tPnR4X2Rpc2NvdmVyeV90aHJlc2hvbGQsCisJCWluZm8tPnR4X3RlYXJkb3duX3RocmVzaG9sZCwKKwkJaW5mby0+cnNzaV90ZWFyZG93bl90aHJlc2hvbGQsCisJCWluZm8tPnJzc2lfZGVsdGEsCisJCWluZm8tPnRkbHNfb3B0aW9ucywKKwkJaW5mby0+cGVlcl90cmFmZmljX2luZF93aW5kb3csCisJCWluZm8tPnBlZXJfdHJhZmZpY19yZXNwb25zZV90aW1lb3V0LAorCQlpbmZvLT5wdWFwc2RfbWFzaywKKwkJaW5mby0+cHVhcHNkX2luYWN0aXZpdHlfdGltZSwKKwkJaW5mby0+cHVhcHNkX3J4X2ZyYW1lX3RocmVzaG9sZCk7Cit9CisKKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX21vbml0b3JfdGltZXJzX3N0b3AoKSAtIHN0b3AgYWxsIG1vbml0b3JpbmcgdGltZXJzCisgKiBAaGRkX3RkbHNfY3R4OiBURExTIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfdGRsc19tb25pdG9yX3RpbWVyc19zdG9wKHRkbHNDdHhfdCAqaGRkX3RkbHNfY3R4KQoreworCWNkZl9tY190aW1lcl9zdG9wKCZoZGRfdGRsc19jdHgtPnBlZXJEaXNjb3ZlcnlUaW1lb3V0VGltZXIpOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfdGltZXJzX3N0b3AoKSAtIHN0b3AgYWxsIHRoZSB0ZGxzIHRpbWVycyBydW5uaW5nCisgKiBAaGRkX3RkbHNfY3R4OiBURExTIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfdGRsc190aW1lcnNfc3RvcCh0ZGxzQ3R4X3QgKmhkZF90ZGxzX2N0eCkKK3sKKwl3bGFuX2hkZF90ZGxzX21vbml0b3JfdGltZXJzX3N0b3AoaGRkX3RkbHNfY3R4KTsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2RlbF9ub25fZm9yY2VkX3BlZXJzKCkgLSBkZWxldGUgbm9uIGZvcmNlZCB0ZGxzIHBlZXJzCisgKiBAaGRkX3RkbHNfY3R4OiBURExTIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfdGRsc19kZWxfbm9uX2ZvcmNlZF9wZWVycyh0ZGxzQ3R4X3QgKmhkZF90ZGxzX2N0eCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCAqcG9zLCAqcTsKKwloZGRUZGxzUGVlcl90ICpwZWVyID0gTlVMTDsKKwlpbnQgaTsKKworCS8qIHJlbW92ZSBlbnRyaWVzIGZyb20gcGVlciBsaXN0IG9ubHkgaWYgcGVlciBpcyBub3QgZm9yY2VkICovCisJZm9yIChpID0gMDsgaSA8IFRETFNfUEVFUl9MSVNUX1NJWkU7IGkrKykgeworCQloZWFkID0gJmhkZF90ZGxzX2N0eC0+cGVlcl9saXN0W2ldOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBxLCBoZWFkKSB7CisJCQlwZWVyID0gbGlzdF9lbnRyeShwb3MsIGhkZFRkbHNQZWVyX3QsIG5vZGUpOworCQkJaWYgKGZhbHNlID09IHBlZXItPmlzRm9yY2VkUGVlcikgeworCQkJCWxpc3RfZGVsKHBvcyk7CisJCQkJY2RmX21lbV9mcmVlKHBlZXIpOworCQkJfSBlbHNlIHsKKwkJCQlwZWVyLT5saW5rX3N0YXR1cyA9IGVURExTX0xJTktfSURMRTsKKwkJCQlwZWVyLT5yZWFzb24gPSBlVERMU19MSU5LX1VOU1BFQ0lGSUVEOworCQkJCXBlZXItPnN0YUlkID0gMDsKKwkJCQlwZWVyLT5kaXNjb3ZlcnlfYXR0ZW1wdCA9IDA7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19pbml0KCkgLSB0ZGxzIGluaXRpYWxpemFpdG9uCisgKiBAcEFkYXB0ZXI6IGhkZCBhZGFwdGVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitpbnQgd2xhbl9oZGRfdGRsc19pbml0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwl0ZGxzQ3R4X3QgKnBIZGRUZGxzQ3R4OworCWludCBpOworCXVpbnQ4X3Qgc3RhSWR4OworCXRkbHNJbmZvX3QgKnRJbmZvOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWlmIChOVUxMID09IHBIZGRDdHgpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKworCWlmIChmYWxzZSA9PSBwSGRkQ3R4LT5jb25maWctPmZFbmFibGVURExTU3VwcG9ydCkgeworCQlwSGRkQ3R4LT50ZGxzX21vZGUgPSBlVERMU19TVVBQT1JUX05PVF9FTkFCTEVEOworCQlwQWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLnBIZGRUZGxzQ3R4ID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJURExTIG5vdCBlbmFibGVkICglZCkgb3IgRlcgZG9lc24ndCBzdXBwb3J0IiksCisJCSAgICAgICBwSGRkQ3R4LT5jb25maWctPmZFbmFibGVURExTU3VwcG9ydCk7CisJCXJldHVybiAwOworCX0KKwkvKiBURExTIGlzIHN1cHBvcnRlZCBvbmx5IGluIFNUQSAvIFAyUCBDbGllbnQgbW9kZXMsCisJICogaGVuY2UgdGhlIGNoZWNrIGZvciBURExTIHN1cHBvcnQgaW4gYSBzcGVjaWZpYyBEZXZpY2UgbW9kZS4KKwkgKiBEbyBub3QgcmV0dXJuIGEgZmFpbHVyZSByYXRoZXIgZG8gbm90IGNvbnRpbnVlIGZ1cnRoZXIKKwkgKiB3aXRoIHRoZSBpbml0aWFsaXphdGlvbiBhcyB0ZGxzX2luaXQgd291bGQgYmUgY2FsbGVkCisJICogZHVyaW5nIHRoZSBvcGVuIGFkYXB0ZXIgZm9yIGEgcDJwIGludGVyZmFjZSBhdCB3aGljaCBwb2ludAorCSAqIHRoZSBkZXZpY2UgbW9kZSB3b3VsZCBiZSBhIFAyUF9ERVZJQ0UuIFRoZSBwb2ludCBoZXJlIGlzIHRvCisJICogY29udGludWUgaW5pdGlhbGl6YXRpb24gZm9yIFNUQSAvIFAyUCBDbGllbnQgbW9kZXMuCisJICogVERMUyBleGl0IGFsc28gY2hlY2sgZm9yIHRoZSBkZXZpY2UgbW9kZSBmb3IgY2xlYW4gdXAgaGVuY2UKKwkgKiB0aGVyZSBpcyBubyBpc3N1ZSBldmVuIGlmIHN1Y2Nlc3MgaXMgcmV0dXJuZWQuCisJICovCisJaWYgKDAgPT0gV0xBTl9IRERfSVNfVERMU19TVVBQT1JURURfQURBUFRFUihwQWRhcHRlcikpIHsKKwkJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJLyogQ2hlY2sgZm9yIHRoZSB2YWxpZCBwSGRkVGRsc0N0eC4gSWYgdmFsaWQgZG8gbm90IGZ1cnRoZXIKKwkgKiBhbGxvY2F0ZSB0aGUgbWVtb3J5LCByYXRoZXIgY29udGludWUgd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24uCisJICogSWYgdGRsc19pbml0aWFsaXphdGlvbiB3b3VsZCBnZXQgcmVpbnZva2VkICB3aXRob3V0IHRkbHNfZXhpdAorCSAqIGdldHRpbmcgaW52b2tlZCAoU1NSKSB0aGVyZSBpcyBubyBwb2ludCB0byBmdXJ0aGVyIHByb2NlZWQKKwkgKiB3aXRoIHRoZSBtZW1vcnkgYWxsb2NhdGlvbnMuCisJICovCisJaWYgKE5VTEwgPT0gcEFkYXB0ZXItPnNlc3Npb25DdHguc3RhdGlvbi5wSGRkVGRsc0N0eCkgeworCQlwSGRkVGRsc0N0eCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0ZGxzQ3R4X3QpKTsKKworCQlpZiAoTlVMTCA9PSBwSGRkVGRsc0N0eCkgeworCQkJcEFkYXB0ZXItPnNlc3Npb25DdHguc3RhdGlvbi5wSGRkVGRsc0N0eCA9IE5VTEw7CisJCQltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJCQloZGRMb2coTE9HRSwgRkwoIm1hbGxvYyBmYWlsZWQhIikpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJLyogaW5pdGlhbGl6ZSBURExTIHBBZGF0ZXIgY29udGV4dCAqLworCQljZGZfbWVtX3plcm8ocEhkZFRkbHNDdHgsIHNpemVvZih0ZGxzQ3R4X3QpKTsKKworCQljZGZfbWNfdGltZXJfaW5pdCgmcEhkZFRkbHNDdHgtPnBlZXJEaXNjb3ZlcnlUaW1lb3V0VGltZXIsCisJCQkJICBDREZfVElNRVJfVFlQRV9TVywKKwkJCQkgIHdsYW5faGRkX3RkbHNfZGlzY292ZXJ5X3RpbWVvdXRfcGVlcl9jYiwKKwkJCQkgIHBIZGRUZGxzQ3R4KTsKKworCQlwQWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLnBIZGRUZGxzQ3R4ID0gcEhkZFRkbHNDdHg7CisJCWZvciAoaSA9IDA7IGkgPCBURExTX1BFRVJfTElTVF9TSVpFOyBpKyspCisJCQlJTklUX0xJU1RfSEVBRCgmcEhkZFRkbHNDdHgtPnBlZXJfbGlzdFtpXSk7CisJfSBlbHNlIHsKKwkJcEhkZFRkbHNDdHggPSBwQWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLnBIZGRUZGxzQ3R4OworCisJCXdsYW5faGRkX3RkbHNfdGltZXJzX3N0b3AocEhkZFRkbHNDdHgpOworCisJCXdsYW5faGRkX3RkbHNfZGVsX25vbl9mb3JjZWRfcGVlcnMocEhkZFRkbHNDdHgpOworCisJCXBIZGRDdHgtPmNvbm5lY3RlZF9wZWVyX2NvdW50ID0gMDsKKwl9CisKKwkvKiBpbml0aWFsaXplIFRETFMgZ2xvYmFsIGNvbnRleHQgKi8KKwlwSGRkQ3R4LT5jb25uZWN0ZWRfcGVlcl9jb3VudCA9IDA7CisJc21lX3NldF90ZGxzX3Bvd2VyX3NhdmVfcHJvaGliaXRlZChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCSAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsIDApOworCisJcEhkZEN0eC0+dGRsc19zY2FuX2N0eHQubWFnaWMgPSAwOworCXBIZGRDdHgtPnRkbHNfc2Nhbl9jdHh0LmF0dGVtcHQgPSAwOworCXBIZGRDdHgtPnRkbHNfc2Nhbl9jdHh0LnJlamVjdCA9IDA7CisJcEhkZEN0eC0+dGRsc19zY2FuX2N0eHQuc2Nhbl9yZXF1ZXN0ID0gTlVMTDsKKworCWlmIChwSGRkQ3R4LT5jb25maWctPmZFbmFibGVURExTU2xlZXBTdGEgfHwKKwkgICAgcEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU0J1ZmZlclN0YSB8fAorCSAgICBwSGRkQ3R4LT5jb25maWctPmZFbmFibGVURExTT2ZmQ2hhbm5lbCkKKwkJcEhkZEN0eC0+bWF4X251bV90ZGxzX3N0YSA9IEhERF9NQVhfTlVNX1RETFNfU1RBX1BfVUFQU0RfT0ZGQ0hBTjsKKwllbHNlCisJCXBIZGRDdHgtPm1heF9udW1fdGRsc19zdGEgPSBIRERfTUFYX05VTV9URExTX1NUQTsKKworCWhkZExvZyhMT0cxLCBGTCgibWF4X251bV90ZGxzX3N0YTogJWQiKSwgcEhkZEN0eC0+bWF4X251bV90ZGxzX3N0YSk7CisKKwlmb3IgKHN0YUlkeCA9IDA7IHN0YUlkeCA8IHBIZGRDdHgtPm1heF9udW1fdGRsc19zdGE7IHN0YUlkeCsrKSB7CisJCXBIZGRDdHgtPnRkbHNDb25uSW5mb1tzdGFJZHhdLnN0YUlkID0gMDsKKwkJcEhkZEN0eC0+dGRsc0Nvbm5JbmZvW3N0YUlkeF0uc2Vzc2lvbklkID0gMjU1OworCQljZGZfbWVtX3plcm8oJnBIZGRDdHgtPnRkbHNDb25uSW5mb1tzdGFJZHhdLnBlZXJNYWMsCisJCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKwl9CisKKwlwSGRkVGRsc0N0eC0+cEFkYXB0ZXIgPSBwQWRhcHRlcjsKKworCXBIZGRUZGxzQ3R4LT5jdXJyX2NhbmRpZGF0ZSA9IE5VTEw7CisJcEhkZFRkbHNDdHgtPm1hZ2ljID0gMDsKKworCS8qIHJlbWVtYmVyIGNvbmZpZ3VyYXRpb24gZXZlbiBpZiBpdCBpcyBub3QgdXNlZCByaWdodCBub3cuIGl0IGNvdWxkIGJlIHVzZWQgbGF0ZXIgKi8KKwlwSGRkVGRsc0N0eC0+dGhyZXNob2xkX2NvbmZpZy50eF9wZXJpb2RfdCA9CisJCXBIZGRDdHgtPmNvbmZpZy0+ZlRETFNUeFN0YXRzUGVyaW9kOworCXBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLnR4X3BhY2tldF9uID0KKwkJcEhkZEN0eC0+Y29uZmlnLT5mVERMU1R4UGFja2V0VGhyZXNob2xkOworCXBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLmRpc2NvdmVyeV90cmllc19uID0KKwkJcEhkZEN0eC0+Y29uZmlnLT5mVERMU01heERpc2NvdmVyeUF0dGVtcHQ7CisJcEhkZFRkbHNDdHgtPnRocmVzaG9sZF9jb25maWcuaWRsZV9wYWNrZXRfbiA9CisJCXBIZGRDdHgtPmNvbmZpZy0+ZlRETFNJZGxlUGFja2V0VGhyZXNob2xkOworCXBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLnJzc2lfdHJpZ2dlcl90aHJlc2hvbGQgPQorCQlwSGRkQ3R4LT5jb25maWctPmZURExTUlNTSVRyaWdnZXJUaHJlc2hvbGQ7CisJcEhkZFRkbHNDdHgtPnRocmVzaG9sZF9jb25maWcucnNzaV90ZWFyZG93bl90aHJlc2hvbGQgPQorCQlwSGRkQ3R4LT5jb25maWctPmZURExTUlNTSVRlYXJkb3duVGhyZXNob2xkOworCXBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLnJzc2lfZGVsdGEgPQorCQlwSGRkQ3R4LT5jb25maWctPmZURExTUlNTSURlbHRhOworCisJaWYgKGZhbHNlID09IHBIZGRDdHgtPmNvbmZpZy0+ZkVuYWJsZVRETFNJbXBsaWNpdFRyaWdnZXIpIHsKKwkJcEhkZEN0eC0+dGRsc19tb2RlID0gZVRETFNfU1VQUE9SVF9FWFBMSUNJVF9UUklHR0VSX09OTFk7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXMgVERMUyBJbXBsaWNpdCB0cmlnZ2VyIG5vdCBlbmFibGVkISIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlwSGRkQ3R4LT50ZGxzX21vZGUgPSBlVERMU19TVVBQT1JUX0VOQUJMRUQ7CisJfQorCisjaWZkZWYgQ09ORklHX0NOU1MKKwljbnNzX2luaXRfd29yaygmcEhkZFRkbHNDdHgtPmltcGxpY2l0X3NldHVwLCB3bGFuX2hkZF90ZGxzX3ByZV9zZXR1cCk7CisjZWxzZQorCUlOSVRfV09SSygmcEhkZFRkbHNDdHgtPmltcGxpY2l0X3NldHVwLCB3bGFuX2hkZF90ZGxzX3ByZV9zZXR1cCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DTlNTCisJY25zc19pbml0X2RlbGF5ZWRfd29yaygmcEhkZEN0eC0+dGRsc19zY2FuX2N0eHQudGRsc19zY2FuX3dvcmssCisJCQkgICAgICAgd2xhbl9oZGRfdGRsc19zY2hlZHVsZV9zY2FuKTsKKyNlbHNlCisJSU5JVF9ERUxBWUVEX1dPUksoJnBIZGRDdHgtPnRkbHNfc2Nhbl9jdHh0LnRkbHNfc2Nhbl93b3JrLAorCQkJICB3bGFuX2hkZF90ZGxzX3NjaGVkdWxlX3NjYW4pOworI2VuZGlmCisKKwkvKgorCSAqIFJlbGVhc2UgdGRscyBsb2NrIGJlZm9yZSBjYWxsaW5nIGluIFNNRSBhcGkKKwkgKiB3aGljaCB3b3VsZCB0cnkgdG8gYWNxdWlyZSBzbWUgbG9jay4KKwkgKi8KKwltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJdEluZm8gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodGRsc0luZm9fdCkpOworCWlmIChOVUxMID09IHRJbmZvKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiY2RmX21lbV9hbGxvYyBmYWlsZWQgZm9yIHRJbmZvIikpOworCQljZGZfbWNfdGltZXJfZGVzdHJveSgmcEhkZFRkbHNDdHgtPnBlZXJEaXNjb3ZlcnlUaW1lb3V0VGltZXIpOworCQljZGZfbWVtX2ZyZWUocEhkZFRkbHNDdHgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0SW5mby0+dmRldl9pZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisJdEluZm8tPnRkbHNfc3RhdGUgPSBwSGRkQ3R4LT50ZGxzX21vZGU7CisJdEluZm8tPm5vdGlmaWNhdGlvbl9pbnRlcnZhbF9tcyA9CisJCXBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLnR4X3BlcmlvZF90OworCXRJbmZvLT50eF9kaXNjb3ZlcnlfdGhyZXNob2xkID0KKwkJcEhkZFRkbHNDdHgtPnRocmVzaG9sZF9jb25maWcudHhfcGFja2V0X247CisJdEluZm8tPnR4X3RlYXJkb3duX3RocmVzaG9sZCA9CisJCXBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLmlkbGVfcGFja2V0X247CisJdEluZm8tPnJzc2lfdGVhcmRvd25fdGhyZXNob2xkID0KKwkJcEhkZFRkbHNDdHgtPnRocmVzaG9sZF9jb25maWcucnNzaV90ZWFyZG93bl90aHJlc2hvbGQ7CisJdEluZm8tPnJzc2lfZGVsdGEgPSBwSGRkVGRsc0N0eC0+dGhyZXNob2xkX2NvbmZpZy5yc3NpX2RlbHRhOworCXRJbmZvLT50ZGxzX29wdGlvbnMgPSAwOworCWlmIChwSGRkQ3R4LT5jb25maWctPmZFbmFibGVURExTT2ZmQ2hhbm5lbCkKKwkJdEluZm8tPnRkbHNfb3B0aW9ucyB8PSBFTkFfVERMU19PRkZDSEFOOworCWlmIChwSGRkQ3R4LT5jb25maWctPmZFbmFibGVURExTQnVmZmVyU3RhKQorCQl0SW5mby0+dGRsc19vcHRpb25zIHw9IEVOQV9URExTX0JVRkZFUl9TVEE7CisJaWYgKHBIZGRDdHgtPmNvbmZpZy0+ZkVuYWJsZVRETFNTbGVlcFN0YSkKKwkJdEluZm8tPnRkbHNfb3B0aW9ucyB8PSBFTkFfVERMU19TTEVFUF9TVEE7CisJdEluZm8tPnBlZXJfdHJhZmZpY19pbmRfd2luZG93ID0gcEhkZEN0eC0+Y29uZmlnLT5mVERMU1B1YXBzZFBUSVdpbmRvdzsKKwl0SW5mby0+cGVlcl90cmFmZmljX3Jlc3BvbnNlX3RpbWVvdXQgPQorCQlwSGRkQ3R4LT5jb25maWctPmZURExTUHVhcHNkUFRSVGltZW91dDsKKwl0SW5mby0+cHVhcHNkX21hc2sgPSBwSGRkQ3R4LT5jb25maWctPmZURExTVWFwc2RNYXNrOworCXRJbmZvLT5wdWFwc2RfaW5hY3Rpdml0eV90aW1lID0KKwkJcEhkZEN0eC0+Y29uZmlnLT5mVERMU1B1YXBzZEluYWN0aXZpdHlUaW1lcjsKKwl0SW5mby0+cHVhcHNkX3J4X2ZyYW1lX3RocmVzaG9sZCA9CisJCXBIZGRDdHgtPmNvbmZpZy0+ZlRETFNSeEZyYW1lVGhyZXNob2xkOworCisJZHVtcF90ZGxzX3N0YXRlX3BhcmFtX3NldHRpbmcodEluZm8pOworCisJY2RmX3JldF9zdGF0dXMgPSBzbWVfdXBkYXRlX2Z3X3RkbHNfc3RhdGUocEhkZEN0eC0+aEhhbCwgdEluZm8sIHRydWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RmX3JldF9zdGF0dXMpIHsKKwkJY2RmX21lbV9mcmVlKHRJbmZvKTsKKwkJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnBIZGRUZGxzQ3R4LT5wZWVyRGlzY292ZXJ5VGltZW91dFRpbWVyKTsKKwkJY2RmX21lbV9mcmVlKHBIZGRUZGxzQ3R4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19leGl0KCkgLSBURExTIGRlLWluaXRpYWxpemF0aW9uCisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd2xhbl9oZGRfdGRsc19leGl0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHg7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwl0ZGxzSW5mb190ICp0SW5mbzsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJaWYgKCFwSGRkQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZEN0eCBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCF0ZXN0X2JpdChURExTX0lOSVRfRE9ORSwgJnBBZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJURExTIGluaXQgd2FzIG5vdCBkb25lLCBleGl0IikpOworCQlyZXR1cm47CisJfQorCisJcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTsKKwlpZiAoTlVMTCA9PSBwSGRkVGRsc0N0eCkgeworCQkvKiBURExTIGNvbnRleHQgY2FuIGJlIG51bGwgYW5kIG1pZ2h0IGhhdmUgYmVlbiBmcmVlZCB1cCBkdXJpbmcKKwkJICogY2xlYW51cCBmb3IgU1RBIGFkYXB0ZXIKKwkJICovCisJCWhkZExvZyhMT0cyLAorCQkJRkwoInBIZGRUZGxzQ3R4IGlzIE5VTEwsIGFkYXB0ZXIgZGV2aWNlIG1vZGU6ICVzKCVkKSIpLAorCQkJaGRkX2RldmljZV9tb2RlX3RvX3N0cmluZyhwQWRhcHRlci0+ZGV2aWNlX21vZGUpLAorCQkJcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKwkJZ290byBkb25lOworCX0KKworCWNkc19mbHVzaF93b3JrKCZwSGRkVGRsc0N0eC0+aW1wbGljaXRfc2V0dXApOworCWNkc19mbHVzaF9kZWxheWVkX3dvcmsoJnBIZGRDdHgtPnRkbHNfc2Nhbl9jdHh0LnRkbHNfc2Nhbl93b3JrKTsKKworCW11dGV4X2xvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisKKwkvKiBtdXN0IHN0b3AgdGltZXIgaGVyZSBiZWZvcmUgZnJlZWluZyBwZWVyIGxpc3QsIGJlY2F1c2UgcGVlcklkbGVUaW1lciBpcworCSAgIHBhcnQgb2YgcGVlciBsaXN0IHN0cnVjdHVyZS4gKi8KKwl3bGFuX2hkZF90ZGxzX3RpbWVyc19kZXN0cm95KHBIZGRUZGxzQ3R4KTsKKwl3bGFuX2hkZF90ZGxzX2ZyZWVfbGlzdChwSGRkVGRsc0N0eCk7CisKKwltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisKKwl3bGFuX2hkZF90ZGxzX2ZyZWVfc2Nhbl9yZXF1ZXN0KCZwSGRkQ3R4LT50ZGxzX3NjYW5fY3R4dCk7CisKKwkvKiBObyBuZWVkIHRvIHBvc3QgbWVzc2FnZSBkdXJpbmcgZHJpdmVyIHVubGFvZCBiZWNhdXNlIE1DIHRocmVhZCBpcworCSAgIGFscmVhZHkgc2h1dGRvd24gKi8KKwlpZiAoIXBIZGRDdHgtPmlzVW5sb2FkSW5Qcm9ncmVzcykgeworCQl0SW5mbyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0ZGxzSW5mb190KSk7CisJCWlmIChOVUxMICE9IHRJbmZvKSB7CisJCQl0SW5mby0+dmRldl9pZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisJCQl0SW5mby0+dGRsc19zdGF0ZSA9IGVURExTX1NVUFBPUlRfRElTQUJMRUQ7CisJCQl0SW5mby0+bm90aWZpY2F0aW9uX2ludGVydmFsX21zID0KKwkJCQlwSGRkVGRsc0N0eC0+dGhyZXNob2xkX2NvbmZpZy50eF9wZXJpb2RfdDsKKwkJCXRJbmZvLT50eF9kaXNjb3ZlcnlfdGhyZXNob2xkID0KKwkJCQlwSGRkVGRsc0N0eC0+dGhyZXNob2xkX2NvbmZpZy50eF9wYWNrZXRfbjsKKwkJCXRJbmZvLT50eF90ZWFyZG93bl90aHJlc2hvbGQgPQorCQkJCXBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLmlkbGVfcGFja2V0X247CisJCQl0SW5mby0+cnNzaV90ZWFyZG93bl90aHJlc2hvbGQgPQorCQkJCXBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLgorCQkJCXJzc2lfdGVhcmRvd25fdGhyZXNob2xkOworCQkJdEluZm8tPnJzc2lfZGVsdGEgPQorCQkJCXBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLnJzc2lfZGVsdGE7CisJCQl0SW5mby0+dGRsc19vcHRpb25zID0gMDsKKwkJCWlmIChwSGRkQ3R4LT5jb25maWctPmZFbmFibGVURExTT2ZmQ2hhbm5lbCkKKwkJCQl0SW5mby0+dGRsc19vcHRpb25zIHw9IEVOQV9URExTX09GRkNIQU47CisJCQlpZiAocEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU0J1ZmZlclN0YSkKKwkJCQl0SW5mby0+dGRsc19vcHRpb25zIHw9IEVOQV9URExTX0JVRkZFUl9TVEE7CisJCQlpZiAocEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU1NsZWVwU3RhKQorCQkJCXRJbmZvLT50ZGxzX29wdGlvbnMgfD0gRU5BX1RETFNfU0xFRVBfU1RBOworCQkJdEluZm8tPnBlZXJfdHJhZmZpY19pbmRfd2luZG93ID0KKwkJCQlwSGRkQ3R4LT5jb25maWctPmZURExTUHVhcHNkUFRJV2luZG93OworCQkJdEluZm8tPnBlZXJfdHJhZmZpY19yZXNwb25zZV90aW1lb3V0ID0KKwkJCQlwSGRkQ3R4LT5jb25maWctPmZURExTUHVhcHNkUFRSVGltZW91dDsKKwkJCXRJbmZvLT5wdWFwc2RfbWFzayA9IHBIZGRDdHgtPmNvbmZpZy0+ZlRETFNVYXBzZE1hc2s7CisJCQl0SW5mby0+cHVhcHNkX2luYWN0aXZpdHlfdGltZSA9CisJCQkJcEhkZEN0eC0+Y29uZmlnLT5mVERMU1B1YXBzZEluYWN0aXZpdHlUaW1lcjsKKwkJCXRJbmZvLT5wdWFwc2RfcnhfZnJhbWVfdGhyZXNob2xkID0KKwkJCQlwSGRkQ3R4LT5jb25maWctPmZURExTUnhGcmFtZVRocmVzaG9sZDsKKworCQkJZHVtcF90ZGxzX3N0YXRlX3BhcmFtX3NldHRpbmcodEluZm8pOworCisJCQljZGZfcmV0X3N0YXR1cyA9CisJCQkJc21lX3VwZGF0ZV9md190ZGxzX3N0YXRlKHBIZGRDdHgtPmhIYWwsIHRJbmZvLCBmYWxzZSk7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9yZXRfc3RhdHVzKSB7CisJCQkJY2RmX21lbV9mcmVlKHRJbmZvKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBjZGZfbWVtX2FsbG9jIGZhaWxlZCBmb3IgdEluZm8iLCBfX2Z1bmNfXyk7CisJCX0KKwl9CisKKwlwSGRkVGRsc0N0eC0+bWFnaWMgPSAwOworCXBIZGRUZGxzQ3R4LT5wQWRhcHRlciA9IE5VTEw7CisKKwljZGZfbWVtX2ZyZWUocEhkZFRkbHNDdHgpOworCXBBZGFwdGVyLT5zZXNzaW9uQ3R4LnN0YXRpb24ucEhkZFRkbHNDdHggPSBOVUxMOworCXBIZGRUZGxzQ3R4ID0gTlVMTDsKKworZG9uZToKKwljbGVhcl9iaXQoVERMU19JTklUX0RPTkUsICZwQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfbW9uaXRvcl90aW1lcnNfZGVzdHJveSgpIC0gZGVzdHJveSBhbGwgdGRscyBtb25pdG9yaW5nIHRpbWVycworICogQHBIZGRUZGxzQ3R4OiBURExTIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfdGRsc19tb25pdG9yX3RpbWVyc19kZXN0cm95KHRkbHNDdHhfdCAqcEhkZFRkbHNDdHgpCit7CisJY2RmX21jX3RpbWVyX3N0b3AoJnBIZGRUZGxzQ3R4LT5wZWVyRGlzY292ZXJ5VGltZW91dFRpbWVyKTsKKwljZGZfbWNfdGltZXJfZGVzdHJveSgmcEhkZFRkbHNDdHgtPnBlZXJEaXNjb3ZlcnlUaW1lb3V0VGltZXIpOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfdGltZXJzX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYWxsIHRoZSB0ZGxzIHRpbWVycyBydW5uaW5nCisgKiBAcEhkZFRkbHNDdHg6IFRETFMgQ29udGV4dAorICoKKyAqIFJldHVybjogVm9pZAorICovCitzdGF0aWMgdm9pZCB3bGFuX2hkZF90ZGxzX3RpbWVyc19kZXN0cm95KHRkbHNDdHhfdCAqcEhkZFRkbHNDdHgpCit7CisJd2xhbl9oZGRfdGRsc19tb25pdG9yX3RpbWVyc19kZXN0cm95KHBIZGRUZGxzQ3R4KTsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2dldF9wZWVyKCkgLSBmaW5kIG9yIGFkZCBhbiBwZWVyIGdpdmVuIG1hYyBhZGRyZXNzCisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKiBAbWFjOiBNQUMgYWRkcmVzcyB1c2VkIHRvIGZpbmQgb3IgY3JlYXRlIHBlZXIKKyAqCisgKiBTZWFyY2ggcGVlciBnaXZlbiBhbiBNQUMgYWRkcmVzcyBhbmQgY3JlYXRlIG9uZSBpZiBub3QgZm91bmQuCisgKgorICogUmV0dXJuOiBQb2ludGVyIHRvIHBlZXIgaWYgbWFjIGFkZHJlc3MgZXhpc3Qgb3IgcGVlciBjcmVhdGlvbgorICogICAgICAgICBzdWNjZWVkczsgTlVMTCBpZiBwZWVyIGNyZWF0aW9uIGZhaWxzCisgKi8KK2hkZFRkbHNQZWVyX3QgKndsYW5faGRkX3RkbHNfZ2V0X3BlZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IHU4ICptYWMpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwloZGRUZGxzUGVlcl90ICpwZWVyOworCXU4IGtleTsKKwl0ZGxzQ3R4X3QgKnBIZGRUZGxzQ3R4OworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCWlmICgwICE9ICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInBIZGRDdHggaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBpZiBhbHJlYWR5IHRoZXJlLCBqdXN0IHVwZGF0ZSAqLworCXBlZXIgPSB3bGFuX2hkZF90ZGxzX2ZpbmRfcGVlcihwQWRhcHRlciwgbWFjLCB0cnVlKTsKKwlpZiAocGVlciAhPSBOVUxMKSB7CisJCXJldHVybiBwZWVyOworCX0KKworCS8qIG5vdCBmb3VuZCwgYWxsb2NhdGUgYW5kIGFkZCB0aGUgbGlzdCAqLworCXBlZXIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoaGRkVGRsc1BlZXJfdCkpOworCWlmIChOVUxMID09IHBlZXIpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIHBlZXIgbWFsbG9jIGZhaWxlZCEiLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltdXRleF9sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCisJcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTsKKworCWlmIChOVUxMID09IHBIZGRUZGxzQ3R4KSB7CisJCWNkZl9tZW1fZnJlZShwZWVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCQloZGRMb2coTE9HMSwgRkwoInBIZGRUZGxzQ3R4IGlzIE5VTEwiKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWtleSA9IHdsYW5faGRkX3RkbHNfaGFzaF9rZXkobWFjKTsKKwloZWFkID0gJnBIZGRUZGxzQ3R4LT5wZWVyX2xpc3Rba2V5XTsKKworCWNkZl9tZW1femVybyhwZWVyLCBzaXplb2YoaGRkVGRsc1BlZXJfdCkpOworCWNkZl9tZW1fY29weShwZWVyLT5wZWVyTWFjLCBtYWMsIHNpemVvZihwZWVyLT5wZWVyTWFjKSk7CisJcGVlci0+cEhkZFRkbHNDdHggPSBwSGRkVGRsc0N0eDsKKwlwZWVyLT5wcmVmX29mZl9jaGFuX251bSA9IHBIZGRDdHgtPmNvbmZpZy0+ZlRETFNQcmVmT2ZmQ2hhbk51bTsKKworCWxpc3RfYWRkX3RhaWwoJnBlZXItPm5vZGUsIGhlYWQpOworCW11dGV4X3VubG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKworCXJldHVybiBwZWVyOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfc2V0X2NhcCgpIC0gc2V0IFRETFMgY2FwYWJpbGl0eSB0eXBlCisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKiBAbWFjOiBwZWVyIG1hYyBhZGRyZXNzCisgKiBAY2FwOiBURExTIGNhcGFiaWxpdHkgdHlwZQorICoKKyAqIFJldHVybjogMCBpZiBzdWNjZXNzZnVsIG9yIG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitpbnQgd2xhbl9oZGRfdGRsc19zZXRfY2FwKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBjb25zdCB1aW50OF90ICptYWMsCisJCQkgIHRURExTQ2FwVHlwZSBjYXApCit7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCisJY3Vycl9wZWVyID0gd2xhbl9oZGRfdGRsc19nZXRfcGVlcihwQWRhcHRlciwgbWFjKTsKKwlpZiAoY3Vycl9wZWVyID09IE5VTEwpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjdXJyX3BlZXIgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3Vycl9wZWVyLT50ZGxzX3N1cHBvcnQgPSBjYXA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX3NldF9wZWVyX2xpbmtfc3RhdHVzKCkgLSBzZXQgVERMUyBwZWVyIGxpbmsgc3RhdHVzCisgKiBAY3Vycl9wZWVyOiBwZWVyCisgKiBAc3RhdHVzOiBzdGF0dXMKKyAqIEByZWFzb246IHJlYXNvbgorICoKKyAqIFJldHVybjogVm9pZAorICovCit2b2lkIHdsYW5faGRkX3RkbHNfc2V0X3BlZXJfbGlua19zdGF0dXMoaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyLAorCQkJCQl0VERMU0xpbmtTdGF0dXMgc3RhdHVzLAorCQkJCQl0VERMU0xpbmtSZWFzb24gcmVhc29uKQoreworCWludDMyX3Qgc3RhdGUgPSAwOworCWludDMyX3QgcmVzID0gMDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCWlmIChjdXJyX3BlZXIgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImN1cnJfcGVlciBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKGN1cnJfcGVlci0+cEhkZFRkbHNDdHggPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImN1cnJfcGVlci0+cEhkZFRkbHNDdHggaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChjdXJyX3BlZXItPnBIZGRUZGxzQ3R4LT5wQWRhcHRlcik7CisJaWYgKDAgIT0gKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZEN0eCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9XQVJOLAorCSAgICAgICAidGRscyBzZXQgcGVlciAiIE1BQ19BRERSRVNTX1NUUiAiIGxpbmsgc3RhdHVzIHRvICV1IiwKKwkgICAgICAgTUFDX0FERFJfQVJSQVkoY3Vycl9wZWVyLT5wZWVyTWFjKSwgc3RhdHVzKTsKKworCW11dGV4X2xvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJY3Vycl9wZWVyLT5saW5rX3N0YXR1cyA9IHN0YXR1czsKKworCS8qIElmIFRETFMgbGluayBzdGF0dXMgaXMgYWxyZWFkeSBwYXNzZWQgdGhlIGRpc2NvdmVyeSBzdGF0ZQorCSAqIHRoZW4gY2xlYXIgZGlzY292ZXJ5IGF0dGVtcHQgY291bnQKKwkgKi8KKwlpZiAoc3RhdHVzID49IGVURExTX0xJTktfRElTQ09WRVJFRCkgeworCQljdXJyX3BlZXItPmRpc2NvdmVyeV9hdHRlbXB0ID0gMDsKKwl9CisKKwltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJaWYgKGN1cnJfcGVlci0+aXNGb3JjZWRQZWVyICYmIGN1cnJfcGVlci0+c3RhdGVfY2hhbmdlX25vdGlmaWNhdGlvbikgeworCQljdXJyX3BlZXItPnJlYXNvbiA9IHJlYXNvbjsKKwkJd2xhbl9oZGRfdGRsc19nZXRfd2lmaV9oYWxfc3RhdGUoY3Vycl9wZWVyLCAmc3RhdGUsICZyZXMpOworCQkoKmN1cnJfcGVlci0+c3RhdGVfY2hhbmdlX25vdGlmaWNhdGlvbikoY3Vycl9wZWVyLT5wZWVyTWFjLAorCQkJCQkJCXN0YXRlLAorCQkJCQkJCXJlcywKKwkJCQkJCQljdXJyX3BlZXItPgorCQkJCQkJCXBIZGRUZGxzQ3R4LT5wQWRhcHRlcik7CisJfQorCXJldHVybjsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX3NldF9saW5rX3N0YXR1cygpIC0gc2V0IFRETFMgcGVlciBsaW5rIHN0YXR1cworICogQHBBZGFwdGVyOiBIREQgYWRhcHRlcgorICogQG1hYzogbWFjIGFkZHJlc3Mgb2YgVERMUyBwZWVyCisgKiBAbGlua1N0YXR1czogc3RhdHVzCisgKiBAcmVhc29uOiByZWFzb24KKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX3NldF9saW5rX3N0YXR1cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICBjb25zdCB1aW50OF90ICptYWMsCisJCQkJICAgdFRETFNMaW5rU3RhdHVzIGxpbmtTdGF0dXMsCisJCQkJICAgdFRETFNMaW5rUmVhc29uIHJlYXNvbikKK3sKKwlpbnQzMl90IHN0YXRlID0gMDsKKwlpbnQzMl90IHJlcyA9IDA7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCWlmICgwICE9ICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInBIZGRDdHggaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm47CisJfQorCWN1cnJfcGVlciA9IHdsYW5faGRkX3RkbHNfZmluZF9wZWVyKHBBZGFwdGVyLCBtYWMsIHRydWUpOworCWlmIChjdXJyX3BlZXIgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImN1cnJfcGVlciBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwljdXJyX3BlZXItPmxpbmtfc3RhdHVzID0gbGlua1N0YXR1czsKKworCS8qIElmIFRETFMgbGluayBzdGF0dXMgaXMgYWxyZWFkeSBwYXNzZWQgdGhlIGRpc2NvdmVyeSBzdGF0ZQorCSAqIHRoZW4gY2xlYXIgZGlzY292ZXJ5IGF0dGVtcHQgY291bnQKKwkgKi8KKwlpZiAobGlua1N0YXR1cyA+PSBlVERMU19MSU5LX0RJU0NPVkVSRUQpIHsKKwkJY3Vycl9wZWVyLT5kaXNjb3ZlcnlfYXR0ZW1wdCA9IDA7CisJfQorCW11dGV4X3VubG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwlpZiAoY3Vycl9wZWVyLT5pc0ZvcmNlZFBlZXIgJiYgY3Vycl9wZWVyLT5zdGF0ZV9jaGFuZ2Vfbm90aWZpY2F0aW9uKSB7CisJCWN1cnJfcGVlci0+cmVhc29uID0gcmVhc29uOworCQl3bGFuX2hkZF90ZGxzX2dldF93aWZpX2hhbF9zdGF0ZShjdXJyX3BlZXIsICZzdGF0ZSwgJnJlcyk7CisJCShjdXJyX3BlZXItPnN0YXRlX2NoYW5nZV9ub3RpZmljYXRpb24pKG1hYywKKwkJCQkJCSAgICAgICBzdGF0ZSwKKwkJCQkJCSAgICAgICByZXMsCisJCQkJCQkgICAgICAgY3Vycl9wZWVyLT5wSGRkVGRsc0N0eC0+CisJCQkJCQkgICAgICAgcEFkYXB0ZXIpOworCX0KKworCXJldHVybjsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX3JlY3ZfZGlzY292ZXJ5X3Jlc3AoKSAtIGhhbmRsaW5nIG9mIHRkbHMgZGlzY292ZXJ5IHJlc3BvbnNlCisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKiBAbWFjOiBtYWMgYWRkcmVzcyBvZiBwZWVyIGZyb20gd2hpY2ggdGhlIHJlc3BvbnNlIHdhcyByZWNlaXZlZAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX3RkbHNfcmVjdl9kaXNjb3ZlcnlfcmVzcChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICBjb25zdCB1aW50OF90ICptYWMpCit7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCisJaWYgKE5VTEwgPT0gcEhkZFRkbHNDdHgpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwSGRkVGRsc0N0eCBpcyBOVUxMIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwSGRkVGRsc0N0eC0+cEFkYXB0ZXIpOworCisJaWYgKDAgIT0gKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgicEhkZEN0eCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN1cnJfcGVlciA9IHdsYW5faGRkX3RkbHNfZ2V0X3BlZXIocEFkYXB0ZXIsIG1hYyk7CisJaWYgKE5VTEwgPT0gY3Vycl9wZWVyKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY3Vycl9wZWVyIGlzIE5VTEwiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwSGRkVGRsc0N0eC0+ZGlzY292ZXJ5X3NlbnRfY250KQorCQlwSGRkVGRsc0N0eC0+ZGlzY292ZXJ5X3NlbnRfY250LS07CisKKwltdXRleF9sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCXdsYW5faGRkX3RkbHNfY2hlY2tfcG93ZXJfc2F2ZV9wcm9oaWJpdGVkKHBBZGFwdGVyKTsKKworCW11dGV4X3VubG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwlpZiAoMCA9PSBwSGRkVGRsc0N0eC0+ZGlzY292ZXJ5X3NlbnRfY250KSB7CisJCWNkZl9tY190aW1lcl9zdG9wKCZwSGRkVGRsc0N0eC0+cGVlckRpc2NvdmVyeVRpbWVvdXRUaW1lcik7CisJfQorCisJaGRkTG9nKExPRzEsCisJCSAgIkRpc2NvdmVyeSgldSkgUmVzcG9uc2UgZnJvbSAiIE1BQ19BRERSRVNTX1NUUgorCQkgICIgbGlua19zdGF0dXMgJWQiLCBwSGRkVGRsc0N0eC0+ZGlzY292ZXJ5X3NlbnRfY250LAorCQkgIE1BQ19BRERSX0FSUkFZKGN1cnJfcGVlci0+cGVlck1hYyksIGN1cnJfcGVlci0+bGlua19zdGF0dXMpOworCisJaWYgKGVURExTX0xJTktfRElTQ09WRVJJTkcgPT0gY3Vycl9wZWVyLT5saW5rX3N0YXR1cykgeworCQkvKiBTaW5jZSB3ZSBhcmUgaGVyZSwgaXQgbWVhbnMgVGhyb3VnaHB1dCB0aHJlc2hvbGQgaXMgYWxyZWR5IG1ldC4gTWFrZSBzdXJlIFJTU0kKKwkJICAgdGhyZXNob2xkIGlzIGFsc28gbWV0IGJlZm9yZSBzZXR0aW5nIHVwIFRETFMgbGluayAqLworCQlpZiAoKGludDMyX3QpIGN1cnJfcGVlci0+cnNzaSA+CisJCSAgICAoaW50MzJfdCkgcEhkZFRkbHNDdHgtPnRocmVzaG9sZF9jb25maWcuCisJCSAgICByc3NpX3RyaWdnZXJfdGhyZXNob2xkKSB7CisJCQl3bGFuX2hkZF90ZGxzX3NldF9wZWVyX2xpbmtfc3RhdHVzKGN1cnJfcGVlciwKKwkJCQkJCQkgICBlVERMU19MSU5LX0RJU0NPVkVSRUQsCisJCQkJCQkJICAgZVRETFNfTElOS19TVUNDRVNTKTsKKwkJCWhkZExvZyhMT0cxLAorCQkJCSAgIlJzc2kgVGhyZXNob2xkIG1ldDogIiBNQUNfQUREUkVTU19TVFIKKwkJCQkgICIgcnNzaSA9ICVkIHRocmVzaG9sZD0gJWQiLAorCQkJCSAgTUFDX0FERFJfQVJSQVkoY3Vycl9wZWVyLT5wZWVyTWFjKSwKKwkJCQkgIGN1cnJfcGVlci0+cnNzaSwKKwkJCQkgIHBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLgorCQkJCSAgcnNzaV90cmlnZ2VyX3RocmVzaG9sZCk7CisJCQljZmc4MDIxMV90ZGxzX29wZXJfcmVxdWVzdChwQWRhcHRlci0+ZGV2LAorCQkJCQkJICAgY3Vycl9wZWVyLT5wZWVyTWFjLAorCQkJCQkJICAgTkw4MDIxMV9URExTX1NFVFVQLCBmYWxzZSwKKwkJCQkJCSAgIEdGUF9LRVJORUwpOworCQl9IGVsc2UgeworCQkJaGRkTG9nKExPRzEsCisJCQkJICAiUnNzaSBUaHJlc2hvbGQgbm90IG1ldDogIiBNQUNfQUREUkVTU19TVFIKKwkJCQkgICIgcnNzaSA9ICVkIHRocmVzaG9sZCA9ICVkICIsCisJCQkJICBNQUNfQUREUl9BUlJBWShjdXJyX3BlZXItPnBlZXJNYWMpLAorCQkJCSAgY3Vycl9wZWVyLT5yc3NpLAorCQkJCSAgcEhkZFRkbHNDdHgtPnRocmVzaG9sZF9jb25maWcuCisJCQkJICByc3NpX3RyaWdnZXJfdGhyZXNob2xkKTsKKwkJCXdsYW5faGRkX3RkbHNfc2V0X3BlZXJfbGlua19zdGF0dXMoY3Vycl9wZWVyLAorCQkJCQkJCSAgIGVURExTX0xJTktfSURMRSwKKwkJCQkJCQkgICBlVERMU19MSU5LX1VOU1BFQ0lGSUVEKTsKKworCQkJLyogaWYgUlNTSSB0aHJlc2hvbGQgaXMgbm90IG1ldCB0aGVuIGFsbG93IGZ1cnRoZXIgZGlzY292ZXJ5CisJCQkgKiBhdHRlbXB0cyBieSBkZWNyZW1lbnRpbmcgY291bnQgZm9yIHRoZSBsYXN0IGF0dGVtcHQKKwkJCSAqLworCQkJaWYgKGN1cnJfcGVlci0+ZGlzY292ZXJ5X2F0dGVtcHQpCisJCQkJY3Vycl9wZWVyLT5kaXNjb3ZlcnlfYXR0ZW1wdC0tOworCQl9CisJfQorCisJY3Vycl9wZWVyLT50ZGxzX3N1cHBvcnQgPSBlVERMU19DQVBfU1VQUE9SVEVEOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfc2V0X3BlZXJfY2FwcygpIC0gc2V0IFRETFMgcGVlciBjYXBhYmlsaXR5CisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKiBAbWFjOiBNQUMgYWRkcmVzcyBvZiB0aGUgVERMUyBwZWVyCisgKiBAU3RhUGFyYW1zOiBDU1IgU3RhdGlvbiBQYXJhbWV0ZXIKKyAqIEBpc0J1ZlN0YTogaXMgcGVlciBidWZmZXIgc3RhdGlvbgorICogQGlzT2ZmQ2hhbm5lbFN1cHBvcnRlZDogSXMgb2ZmIGNoYW5uZWwgc3VwcG9ydGVkCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitpbnQgd2xhbl9oZGRfdGRsc19zZXRfcGVlcl9jYXBzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCWNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQl0Q3NyU3RhUGFyYW1zICpTdGFQYXJhbXMsCisJCQkJYm9vbCBpc0J1ZlN0YSwgYm9vbCBpc09mZkNoYW5uZWxTdXBwb3J0ZWQpCit7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCisJY3Vycl9wZWVyID0gd2xhbl9oZGRfdGRsc19nZXRfcGVlcihwQWRhcHRlciwgbWFjKTsKKwlpZiAoY3Vycl9wZWVyID09IE5VTEwpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjdXJyX3BlZXIgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3Vycl9wZWVyLT51YXBzZFF1ZXVlcyA9IFN0YVBhcmFtcy0+dWFwc2RfcXVldWVzOworCWN1cnJfcGVlci0+bWF4U3AgPSBTdGFQYXJhbXMtPm1heF9zcDsKKwljdXJyX3BlZXItPmlzQnVmU3RhID0gaXNCdWZTdGE7CisJY3Vycl9wZWVyLT5pc09mZkNoYW5uZWxTdXBwb3J0ZWQgPSBpc09mZkNoYW5uZWxTdXBwb3J0ZWQ7CisKKwljZGZfbWVtX2NvcHkoY3Vycl9wZWVyLT5zdXBwb3J0ZWRfY2hhbm5lbHMsCisJCSAgICAgU3RhUGFyYW1zLT5zdXBwb3J0ZWRfY2hhbm5lbHMsCisJCSAgICAgU3RhUGFyYW1zLT5zdXBwb3J0ZWRfY2hhbm5lbHNfbGVuKTsKKworCWN1cnJfcGVlci0+c3VwcG9ydGVkX2NoYW5uZWxzX2xlbiA9IFN0YVBhcmFtcy0+c3VwcG9ydGVkX2NoYW5uZWxzX2xlbjsKKworCWNkZl9tZW1fY29weShjdXJyX3BlZXItPnN1cHBvcnRlZF9vcGVyX2NsYXNzZXMsCisJCSAgICAgU3RhUGFyYW1zLT5zdXBwb3J0ZWRfb3Blcl9jbGFzc2VzLAorCQkgICAgIFN0YVBhcmFtcy0+c3VwcG9ydGVkX29wZXJfY2xhc3Nlc19sZW4pOworCisJY3Vycl9wZWVyLT5zdXBwb3J0ZWRfb3Blcl9jbGFzc2VzX2xlbiA9CisJCVN0YVBhcmFtcy0+c3VwcG9ydGVkX29wZXJfY2xhc3Nlc19sZW47CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19nZXRfbGlua19lc3RhYmxpc2hfcGFyYW1zKCkgLSBnZXQgVERMUyBsaW5rIGVzdGFibGlzaAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIKKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqIEBtYWM6IG1hYyBhZGRyZXNzCisgKiBAdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXM6IG91dHB1dCBwYXJhbWV0ZXIgdG8gc3RvcmUgdGhlIHJlc3VsdAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX3RkbHNfZ2V0X2xpbmtfZXN0YWJsaXNoX3BhcmFtcyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJICAgIGNvbnN0IHU4ICptYWMsCisJCQkJCSAgICB0Q3NyVGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMgKgorCQkJCQkgICAgdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMpCit7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCisJY3Vycl9wZWVyID0gd2xhbl9oZGRfdGRsc19nZXRfcGVlcihwQWRhcHRlciwgbWFjKTsKKwlpZiAoY3Vycl9wZWVyID09IE5VTEwpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjdXJyX3BlZXIgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPmlzUmVzcG9uZGVyID0gY3Vycl9wZWVyLT5pc19yZXNwb25kZXI7CisJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPnVhcHNkUXVldWVzID0gY3Vycl9wZWVyLT51YXBzZFF1ZXVlczsKKwl0ZGxzTGlua0VzdGFibGlzaFBhcmFtcy0+bWF4U3AgPSBjdXJyX3BlZXItPm1heFNwOworCXRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zLT5pc0J1ZlN0YSA9IGN1cnJfcGVlci0+aXNCdWZTdGE7CisJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPmlzT2ZmQ2hhbm5lbFN1cHBvcnRlZCA9CisJCWN1cnJfcGVlci0+aXNPZmZDaGFubmVsU3VwcG9ydGVkOworCisJY2RmX21lbV9jb3B5KHRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zLT5zdXBwb3J0ZWRDaGFubmVscywKKwkJICAgICBjdXJyX3BlZXItPnN1cHBvcnRlZF9jaGFubmVscywKKwkJICAgICBjdXJyX3BlZXItPnN1cHBvcnRlZF9jaGFubmVsc19sZW4pOworCisJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPnN1cHBvcnRlZENoYW5uZWxzTGVuID0KKwkJY3Vycl9wZWVyLT5zdXBwb3J0ZWRfY2hhbm5lbHNfbGVuOworCisJY2RmX21lbV9jb3B5KHRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zLT5zdXBwb3J0ZWRPcGVyQ2xhc3NlcywKKwkJICAgICBjdXJyX3BlZXItPnN1cHBvcnRlZF9vcGVyX2NsYXNzZXMsCisJCSAgICAgY3Vycl9wZWVyLT5zdXBwb3J0ZWRfb3Blcl9jbGFzc2VzX2xlbik7CisKKwl0ZGxzTGlua0VzdGFibGlzaFBhcmFtcy0+c3VwcG9ydGVkT3BlckNsYXNzZXNMZW4gPQorCQljdXJyX3BlZXItPnN1cHBvcnRlZF9vcGVyX2NsYXNzZXNfbGVuOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfc2V0X3Jzc2koKSAtIFNldCBURExTIFJTU0kgb24gcGVlciBnaXZlbiBieSBtYWMKKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqIEBtYWM6IE1BQyBhZGRyZXNzIG9mIFBlZXIKKyAqIEByeFJzc2k6IHJzc2kgdmFsdWUKKyAqCisgKiBTZXQgUlNTSSBvbiBURFNMIHBlZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX3RkbHNfc2V0X3Jzc2koaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCSAgIGludDhfdCByeFJzc2kpCit7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCisJY3Vycl9wZWVyID0gd2xhbl9oZGRfdGRsc19maW5kX3BlZXIocEFkYXB0ZXIsIG1hYywgdHJ1ZSk7CisJaWYgKGN1cnJfcGVlciA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY3Vycl9wZWVyIGlzIE5VTEwiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN1cnJfcGVlci0+cnNzaSA9IHJ4UnNzaTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfc2V0X3Jlc3BvbmRlcigpIC0gU2V0L2NsZWFyIFRETFMgcGVlcidzIHJlc3BvbmRlciByb2xlCisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKiBAbWFjOiBNQUMgYWRkcmVzcyBvZiBQZWVyCisgKiBAcmVzcG9uZGVyOiBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBURExTIHBlZXIgc2hvdWxkIGJlIHJlc3BvbmRlciBvciBub3QKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX3RkbHNfc2V0X3Jlc3BvbmRlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgY29uc3QgdWludDhfdCAqbWFjLAorCQkJCXVpbnQ4X3QgcmVzcG9uZGVyKQoreworCWhkZFRkbHNQZWVyX3QgKmN1cnJfcGVlcjsKKworCWN1cnJfcGVlciA9IHdsYW5faGRkX3RkbHNfZ2V0X3BlZXIocEFkYXB0ZXIsIG1hYyk7CisJaWYgKGN1cnJfcGVlciA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY3Vycl9wZWVyIGlzIE5VTEwiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN1cnJfcGVlci0+aXNfcmVzcG9uZGVyID0gcmVzcG9uZGVyOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19zZXRfc2lnbmF0dXJlKCkgLSBTZXQgVERMUyBwZWVyJ3Mgc2lnbmF0dXJlCisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKiBAbWFjOiBNQUMgYWRkcmVzcyBvZiBURExTIFBlZXIKKyAqIEB1U2lnbmF0dXJlOiBzaWduYXR1cmUgdmFsdWUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX3RkbHNfc2V0X3NpZ25hdHVyZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgY29uc3QgdWludDhfdCAqbWFjLAorCQkJCXVpbnQ4X3QgdVNpZ25hdHVyZSkKK3sKKwloZGRUZGxzUGVlcl90ICpjdXJyX3BlZXI7CisKKwljdXJyX3BlZXIgPSB3bGFuX2hkZF90ZGxzX2dldF9wZWVyKHBBZGFwdGVyLCBtYWMpOworCWlmIChjdXJyX3BlZXIgPT0gTlVMTCkgeworCQloZGRMb2coTE9HRSwgRkwoImN1cnJfcGVlciBpcyBOVUxMIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdXJyX3BlZXItPnNpZ25hdHVyZSA9IHVTaWduYXR1cmU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2V4dHJhY3RfZGEoKSAtIEV4dHJhY3QgZGVzdGluYXRpb24gYWRkcmVzcyBmcm9tIHNvY2tldCBidWZmZXIKKyAqIEBza2I6IHNvY2tldCBidWZmZXIKKyAqIEBtYWM6IG91dHB1dCBtYWMgYWRkcmVzcyBidWZmZXIgdG8gc3RvcmUgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX2V4dHJhY3RfZGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDhfdCAqbWFjKQoreworCW1lbWNweShtYWMsIHNrYi0+ZGF0YSwgNik7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19leHRyYWN0X3NhKCkgLSBFeHRyYWN0IHNvdXJjZSBhZGRyZXNzIGZyb20gc29ja2V0IGJ1ZmZlcgorICogQHNrYjogc29ja2V0IGJ1ZmZlcgorICogQG1hYzogb3V0cHV0IG1hYyBhZGRyZXNzIGJ1ZmZlciB0byBzdG9yZSB0aGUgc291cmNlIGFkZHJlc3MKKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX2V4dHJhY3Rfc2Eoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDhfdCAqbWFjKQoreworCW1lbWNweShtYWMsIHNrYi0+ZGF0YSArIDYsIDYpOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfaW5jcmVtZW50X3BrdF9jb3VudCgpIC0gdXBkYXRlIHN0YXRpc3RpY3MgY291bnRlciBvbiB0ZGxzIHBlZXIKKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqIEBtYWM6IE1BQyBhZGRyZXNzIG9mIHRoZSBURExTIHBlZXIKKyAqIEB0eDogSWYgMSwgaW5jcmVtZW50IHR4IHBhY2tldCBjb3VudGVyLCBpZiAwLCBpbmNyZW1lbnQgcnggcGFja2V0IGNvdW50ZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlCisgKi8KK2ludCB3bGFuX2hkZF90ZGxzX2luY3JlbWVudF9wa3RfY291bnQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJICAgICAgY29uc3QgdWludDhfdCAqbWFjLCB1aW50OF90IHR4KQoreworCWhkZFRkbHNQZWVyX3QgKmN1cnJfcGVlcjsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKwlpZiAoZVRETFNfU1VQUE9SVF9FTkFCTEVEICE9IHBIZGRDdHgtPnRkbHNfbW9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdXJyX3BlZXIgPSB3bGFuX2hkZF90ZGxzX2dldF9wZWVyKHBBZGFwdGVyLCBtYWMpOworCWlmIChjdXJyX3BlZXIgPT0gTlVMTCkgeworCQloZGRMb2coTE9HMSwgRkwoImN1cnJfcGVlciBpcyBOVUxMIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodHgpCisJCWN1cnJfcGVlci0+dHhfcGt0Kys7CisJZWxzZQorCQljdXJyX3BlZXItPnJ4X3BrdCsrOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19jaGVja19jb25maWcoKSAtIHZhbGlkYXRlIHRkbHMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBAY29uZmlnOiB0ZGxzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybjogMCBpZiBhbGwgcGFyYW1ldGVycyBhcmUgdmFsaWQ7IC1FSU5WQUwgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfdGRsc19jaGVja19jb25maWcodGRsc19jb25maWdfcGFyYW1zX3QgKmNvbmZpZykKK3sKKwlpZiAoY29uZmlnLT50ZGxzID4gMikgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJJbnZhbGlkIDFzdCBhcmd1bWVudCAlZC4gPDAuLi4yPiIpLAorCQkgICAgICAgY29uZmlnLT50ZGxzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb25maWctPnR4X3BlcmlvZF90IDwgQ0ZHX1RETFNfVFhfU1RBVFNfUEVSSU9EX01JTiB8fAorCSAgICBjb25maWctPnR4X3BlcmlvZF90ID4gQ0ZHX1RETFNfVFhfU1RBVFNfUEVSSU9EX01BWCkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJJbnZhbGlkIDJuZCBhcmd1bWVudCAlZC4gPCVkLi4uJWxkPiIpLAorCQkgICAgICAgY29uZmlnLT50eF9wZXJpb2RfdCwgQ0ZHX1RETFNfVFhfU1RBVFNfUEVSSU9EX01JTiwKKwkJICAgICAgIENGR19URExTX1RYX1NUQVRTX1BFUklPRF9NQVgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvbmZpZy0+dHhfcGFja2V0X24gPCBDRkdfVERMU19UWF9QQUNLRVRfVEhSRVNIT0xEX01JTiB8fAorCSAgICBjb25maWctPnR4X3BhY2tldF9uID4gQ0ZHX1RETFNfVFhfUEFDS0VUX1RIUkVTSE9MRF9NQVgpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgiSW52YWxpZCAzcmQgYXJndW1lbnQgJWQuIDwlZC4uLiVsZD4iKSwKKwkJICAgICAgIGNvbmZpZy0+dHhfcGFja2V0X24sIENGR19URExTX1RYX1BBQ0tFVF9USFJFU0hPTERfTUlOLAorCQkgICAgICAgQ0ZHX1RETFNfVFhfUEFDS0VUX1RIUkVTSE9MRF9NQVgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvbmZpZy0+ZGlzY292ZXJ5X3RyaWVzX24gPCBDRkdfVERMU19NQVhfRElTQ09WRVJZX0FUVEVNUFRfTUlOIHx8CisJICAgIGNvbmZpZy0+ZGlzY292ZXJ5X3RyaWVzX24gPiBDRkdfVERMU19NQVhfRElTQ09WRVJZX0FUVEVNUFRfTUFYKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIkludmFsaWQgNXRoIGFyZ3VtZW50ICVkLiA8JWQuLi4lZD4iKSwKKwkJICAgICAgIGNvbmZpZy0+ZGlzY292ZXJ5X3RyaWVzX24sCisJCSAgICAgICBDRkdfVERMU19NQVhfRElTQ09WRVJZX0FUVEVNUFRfTUlOLAorCQkgICAgICAgQ0ZHX1RETFNfTUFYX0RJU0NPVkVSWV9BVFRFTVBUX01BWCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY29uZmlnLT5pZGxlX3BhY2tldF9uIDwgQ0ZHX1RETFNfSURMRV9QQUNLRVRfVEhSRVNIT0xEX01JTiB8fAorCSAgICBjb25maWctPmlkbGVfcGFja2V0X24gPiBDRkdfVERMU19JRExFX1BBQ0tFVF9USFJFU0hPTERfTUFYKSB7CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgRkwoIkludmFsaWQgN3RoIGFyZ3VtZW50ICVkLiA8JWQuLi4lZD4iKSwKKwkJICAgICAgIGNvbmZpZy0+aWRsZV9wYWNrZXRfbiwKKwkJICAgICAgIENGR19URExTX0lETEVfUEFDS0VUX1RIUkVTSE9MRF9NSU4sCisJCSAgICAgICBDRkdfVERMU19JRExFX1BBQ0tFVF9USFJFU0hPTERfTUFYKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb25maWctPnJzc2lfdHJpZ2dlcl90aHJlc2hvbGQgPCBDRkdfVERMU19SU1NJX1RSSUdHRVJfVEhSRVNIT0xEX01JTgorCSAgICB8fCBjb25maWctPnJzc2lfdHJpZ2dlcl90aHJlc2hvbGQgPgorCSAgICBDRkdfVERMU19SU1NJX1RSSUdHRVJfVEhSRVNIT0xEX01BWCkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJJbnZhbGlkIDl0aCBhcmd1bWVudCAlZC4gPCVkLi4uJWQ+IiksCisJCSAgICAgICBjb25maWctPnJzc2lfdHJpZ2dlcl90aHJlc2hvbGQsCisJCSAgICAgICBDRkdfVERMU19SU1NJX1RSSUdHRVJfVEhSRVNIT0xEX01JTiwKKwkJICAgICAgIENGR19URExTX1JTU0lfVFJJR0dFUl9USFJFU0hPTERfTUFYKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb25maWctPnJzc2lfdGVhcmRvd25fdGhyZXNob2xkIDwKKwkgICAgQ0ZHX1RETFNfUlNTSV9URUFSRE9XTl9USFJFU0hPTERfTUlOCisJICAgIHx8IGNvbmZpZy0+cnNzaV90ZWFyZG93bl90aHJlc2hvbGQgPgorCSAgICBDRkdfVERMU19SU1NJX1RFQVJET1dOX1RIUkVTSE9MRF9NQVgpIHsKKwkJaGRkTG9nKExPR0UsCisJCSAgICAgICBGTCgiSW52YWxpZCAxMHRoIGFyZ3VtZW50ICVkLiA8JWQuLi4lZD4iKSwKKwkJICAgICAgIGNvbmZpZy0+cnNzaV90ZWFyZG93bl90aHJlc2hvbGQsCisJCSAgICAgICBDRkdfVERMU19SU1NJX1RFQVJET1dOX1RIUkVTSE9MRF9NSU4sCisJCSAgICAgICBDRkdfVERMU19SU1NJX1RFQVJET1dOX1RIUkVTSE9MRF9NQVgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl90ZGRfdGRsc19yZXNldF90eF9yeCgpIC0gcmVzZXQgdHgvcnggY291bnRlcnMgZm9yIGFsbCB0ZGxzIHBlZXJzCisgKiBAcEhkZFRkbHNDdHg6IFRETFMgY29udGV4dAorICoKKyAqIENhbGxlciBoYXMgdG8gdGFrZSB0aGUgVERMUyBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLworc3RhdGljIHZvaWQgd2xhbl90ZGRfdGRsc19yZXNldF90eF9yeCh0ZGxzQ3R4X3QgKnBIZGRUZGxzQ3R4KQoreworCWludCBpOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJaGRkVGRsc1BlZXJfdCAqdG1wOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnE7CisKKwlmb3IgKGkgPSAwOyBpIDwgVERMU19QRUVSX0xJU1RfU0laRTsgaSsrKSB7CisJCWhlYWQgPSAmcEhkZFRkbHNDdHgtPnBlZXJfbGlzdFtpXTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgcSwgaGVhZCkgeworCQkJdG1wID0gbGlzdF9lbnRyeShwb3MsIGhkZFRkbHNQZWVyX3QsIG5vZGUpOworCQkJdG1wLT50eF9wa3QgPSAwOworCQkJdG1wLT5yeF9wa3QgPSAwOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfaW1wbGljaXRfZGlzYWJsZSgpIC0gZGlzYWJsZSBpbXBsaWNpdCB0ZGxzIHRyaWdnZXJpbmcKKyAqIEBwSGRkVGRsc0N0eDogVERMUyBjb250ZXh0CisgKgorICogUmV0dXJuOiBWb2lkCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5faGRkX3RkbHNfaW1wbGljaXRfZGlzYWJsZSh0ZGxzQ3R4X3QgKnBIZGRUZGxzQ3R4KQoreworCXdsYW5faGRkX3RkbHNfdGltZXJzX3N0b3AocEhkZFRkbHNDdHgpOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfaW1wbGljaXRfZW5hYmxlKCkgLSBlbmFibGUgaW1wbGljaXQgdGRscyB0cmlnZ2VyaW5nCisgKiBAcEhkZFRkbHNDdHg6IFRETFMgY29udGV4dAorICoKKyAqIFJldHVybjogVm9pZAorICovCitzdGF0aWMgdm9pZCB3bGFuX2hkZF90ZGxzX2ltcGxpY2l0X2VuYWJsZSh0ZGxzQ3R4X3QgKnBIZGRUZGxzQ3R4KQoreworCXdsYW5faGRkX3RkbHNfcGVlcl9yZXNldF9kaXNjb3ZlcnlfcHJvY2Vzc2VkKHBIZGRUZGxzQ3R4KTsKKwlwSGRkVGRsc0N0eC0+ZGlzY292ZXJ5X3NlbnRfY250ID0gMDsKKwl3bGFuX3RkZF90ZGxzX3Jlc2V0X3R4X3J4KHBIZGRUZGxzQ3R4KTsKKwl3bGFuX2hkZF90ZGxzX2NoZWNrX3Bvd2VyX3NhdmVfcHJvaGliaXRlZChwSGRkVGRsc0N0eC0+cEFkYXB0ZXIpOworCit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19zZXRfbW9kZSgpIC0gc2V0IFRETFMgbW9kZQorICogQHBIZGRDdHg6IEhERCBjb250ZXh0CisgKiBAdGRsc19tb2RlOiBURExTIG1vZGUKKyAqIEBiVXBkYXRlTGFzdDogU3dpdGNoIG9uIGlmIHRvIHNldCBwSGRkQ3R4LT50ZGxzX21vZGVfbGFzdCB0byB0ZGxzX21vZGUuCisgKiAgICAgICAgICAgICAgIElmIDEsIHNldCBwSGRkQ3R4LT50ZGxzX21vZGVfbGFzdCB0byB0ZGxzX21vZGUsIG90aGVyd2lzZQorICogICAgICAgICAgICAgICBzZXQgcEhkZEN0eC0+dGRsc19tb2RlX2xhc3QgdG8gcEhkZEN0eC0+dGRsc19tb2RlCisgKgorICogUmV0dXJuOiBWb2lkCisgKi8KK3ZvaWQgd2xhbl9oZGRfdGRsc19zZXRfbW9kZShoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorCQkJICAgIGVURExTU3VwcG9ydE1vZGUgdGRsc19tb2RlLCBib29sIGJVcGRhdGVMYXN0KQoreworCWhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICpwQWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHg7CisKKwloZGRMb2coTE9HMSwgIiVzIG1vZGUgJWQiLCBfX2Z1bmNfXywgKGludCl0ZGxzX21vZGUpOworCisJaWYgKDAgIT0gKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZEN0eCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCisJaWYgKHBIZGRDdHgtPnRkbHNfbW9kZSA9PSB0ZGxzX21vZGUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCQloZGRMb2coTE9HMSwgRkwoImFscmVhZHkgaW4gbW9kZSAlZCIpLCAoaW50KXRkbHNfbW9kZSk7CisJCXJldHVybjsKKwl9CisKKwlzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIocEhkZEN0eCwgJnBBZGFwdGVyTm9kZSk7CisKKwl3aGlsZSAoTlVMTCAhPSBwQWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlwQWRhcHRlciA9IHBBZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisJCXBIZGRUZGxzQ3R4ID0gV0xBTl9IRERfR0VUX1RETFNfQ1RYX1BUUihwQWRhcHRlcik7CisJCWlmIChOVUxMICE9IHBIZGRUZGxzQ3R4KSB7CisJCQlpZiAoZVRETFNfU1VQUE9SVF9FTkFCTEVEID09IHRkbHNfbW9kZSkKKwkJCQl3bGFuX2hkZF90ZGxzX2ltcGxpY2l0X2VuYWJsZShwSGRkVGRsc0N0eCk7CisJCQllbHNlIGlmICgoZVRETFNfU1VQUE9SVF9ESVNBQkxFRCA9PSB0ZGxzX21vZGUpIHx8CisJCQkJIChlVERMU19TVVBQT1JUX0VYUExJQ0lUX1RSSUdHRVJfT05MWSA9PQorCQkJCSAgdGRsc19tb2RlKSkKKwkJCQl3bGFuX2hkZF90ZGxzX2ltcGxpY2l0X2Rpc2FibGUocEhkZFRkbHNDdHgpOworCQl9CisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKHBIZGRDdHgsIHBBZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisJfQorCWlmIChiVXBkYXRlTGFzdCkgeworCQlwSGRkQ3R4LT50ZGxzX21vZGVfbGFzdCA9IHRkbHNfbW9kZTsKKwl9IGVsc2UgeworCQlwSGRkQ3R4LT50ZGxzX21vZGVfbGFzdCA9IHBIZGRDdHgtPnRkbHNfbW9kZTsKKwl9CisJcEhkZEN0eC0+dGRsc19tb2RlID0gdGRsc19tb2RlOworCisJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfc2V0X3BhcmFtcygpIC0gc2V0IFRETFMgcGFyYW1ldGVycworICogQGRldjogbmV0IGRldmljZQorICogQGNvbmZpZzogVERMUyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX3RkbHNfc2V0X3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICB0ZGxzX2NvbmZpZ19wYXJhbXNfdCAqY29uZmlnKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTsKKwllVERMU1N1cHBvcnRNb2RlIHJlcV90ZGxzX21vZGU7CisJdGRsc0luZm9fdCAqdGRsc1BhcmFtczsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAoTlVMTCA9PSBwSGRkVGRsc0N0eCkgeworCQloZGRMb2coTE9HRSwgRkwoIlRETFMgbm90IGVuYWJsZWQhIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAod2xhbl9oZGRfdGRsc19jaGVja19jb25maWcoY29uZmlnKSAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNvbmZpZy0+dGRscyBpcyBtYXBwZWQgdG8gMC0+MSwgMS0+MiwgMi0+MyAqLworCXJlcV90ZGxzX21vZGUgPSBjb25maWctPnRkbHMgKyAxOworCWlmIChwSGRkQ3R4LT50ZGxzX21vZGUgPT0gcmVxX3RkbHNfbW9kZSkgeworCQloZGRMb2coTE9HRSwgRkwoIkFscmVhZHkgaW4gbW9kZSAlZCIpLCBjb25maWctPnRkbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjb3B5IHRoZSBjb25maWd1cmF0aW9uIG9ubHkgd2hlbiBnaXZlbiB0ZGxzIG1vZGUgaXMgaW1wbGljaXQgdHJpZ2dlciBlbmFibGUgKi8KKwlpZiAoZVRETFNfU1VQUE9SVF9FTkFCTEVEID09IHJlcV90ZGxzX21vZGUpIHsKKwkJbWVtY3B5KCZwSGRkVGRsc0N0eC0+dGhyZXNob2xkX2NvbmZpZywgY29uZmlnLAorCQkgICAgICAgc2l6ZW9mKHRkbHNfY29uZmlnX3BhcmFtc190KSk7CisJfQorCisJaGRkTG9nKExPR0UsCisJCUZMKCJpdyBzZXQgdGRscyBwYXJhbXM6ICVkICVkICVkICVkICVkICVkICVkIiksCisJCWNvbmZpZy0+dGRscywKKwkJY29uZmlnLT50eF9wZXJpb2RfdCwKKwkJY29uZmlnLT50eF9wYWNrZXRfbiwKKwkJY29uZmlnLT5kaXNjb3ZlcnlfdHJpZXNfbiwKKwkJY29uZmlnLT5pZGxlX3BhY2tldF9uLAorCQljb25maWctPnJzc2lfdHJpZ2dlcl90aHJlc2hvbGQsCisJCWNvbmZpZy0+cnNzaV90ZWFyZG93bl90aHJlc2hvbGQpOworCisJd2xhbl9oZGRfdGRsc19zZXRfbW9kZShwSGRkQ3R4LCByZXFfdGRsc19tb2RlLCB0cnVlKTsKKworCXRkbHNQYXJhbXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodGRsc0luZm9fdCkpOworCWlmIChOVUxMID09IHRkbHNQYXJhbXMpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgICIlczogY2RmX21lbV9hbGxvYyBmYWlsZWQgZm9yIHRkbHNQYXJhbXMiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXRkbHNQYXJhbXMtPnZkZXZfaWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCXRkbHNQYXJhbXMtPnRkbHNfc3RhdGUgPSBjb25maWctPnRkbHM7CisJdGRsc1BhcmFtcy0+bm90aWZpY2F0aW9uX2ludGVydmFsX21zID0gY29uZmlnLT50eF9wZXJpb2RfdDsKKwl0ZGxzUGFyYW1zLT50eF9kaXNjb3ZlcnlfdGhyZXNob2xkID0gY29uZmlnLT50eF9wYWNrZXRfbjsKKwl0ZGxzUGFyYW1zLT50eF90ZWFyZG93bl90aHJlc2hvbGQgPSBjb25maWctPmlkbGVfcGFja2V0X247CisJdGRsc1BhcmFtcy0+cnNzaV90ZWFyZG93bl90aHJlc2hvbGQgPSBjb25maWctPnJzc2lfdGVhcmRvd25fdGhyZXNob2xkOworCXRkbHNQYXJhbXMtPnJzc2lfZGVsdGEgPSBjb25maWctPnJzc2lfZGVsdGE7CisJdGRsc1BhcmFtcy0+dGRsc19vcHRpb25zID0gMDsKKwlpZiAocEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU09mZkNoYW5uZWwpCisJCXRkbHNQYXJhbXMtPnRkbHNfb3B0aW9ucyB8PSBFTkFfVERMU19PRkZDSEFOOworCWlmIChwSGRkQ3R4LT5jb25maWctPmZFbmFibGVURExTQnVmZmVyU3RhKQorCQl0ZGxzUGFyYW1zLT50ZGxzX29wdGlvbnMgfD0gRU5BX1RETFNfQlVGRkVSX1NUQTsKKwlpZiAocEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU1NsZWVwU3RhKQorCQl0ZGxzUGFyYW1zLT50ZGxzX29wdGlvbnMgfD0gRU5BX1RETFNfU0xFRVBfU1RBOworCXRkbHNQYXJhbXMtPnBlZXJfdHJhZmZpY19pbmRfd2luZG93ID0KKwkJcEhkZEN0eC0+Y29uZmlnLT5mVERMU1B1YXBzZFBUSVdpbmRvdzsKKwl0ZGxzUGFyYW1zLT5wZWVyX3RyYWZmaWNfcmVzcG9uc2VfdGltZW91dCA9CisJCXBIZGRDdHgtPmNvbmZpZy0+ZlRETFNQdWFwc2RQVFJUaW1lb3V0OworCXRkbHNQYXJhbXMtPnB1YXBzZF9tYXNrID0gcEhkZEN0eC0+Y29uZmlnLT5mVERMU1VhcHNkTWFzazsKKwl0ZGxzUGFyYW1zLT5wdWFwc2RfaW5hY3Rpdml0eV90aW1lID0KKwkJcEhkZEN0eC0+Y29uZmlnLT5mVERMU1B1YXBzZEluYWN0aXZpdHlUaW1lcjsKKwl0ZGxzUGFyYW1zLT5wdWFwc2RfcnhfZnJhbWVfdGhyZXNob2xkID0KKwkJcEhkZEN0eC0+Y29uZmlnLT5mVERMU1J4RnJhbWVUaHJlc2hvbGQ7CisKKwloZGRMb2coTE9HMSwKKwkJICAiJXM6IFNldHRpbmcgdGRscyBzdGF0ZSBhbmQgcGFyYW0gaW4gZnc6ICIKKwkJICAidmRldl9pZDogJWQsICIKKwkJICAidGRsc19zdGF0ZTogJWQsICIKKwkJICAibm90aWZpY2F0aW9uX2ludGVydmFsX21zOiAlZCwgIgorCQkgICJ0eF9kaXNjb3ZlcnlfdGhyZXNob2xkOiAlZCwgIgorCQkgICJ0eF90ZWFyZG93bl90aHJlc2hvbGQ6ICVkLCAiCisJCSAgInJzc2lfdGVhcmRvd25fdGhyZXNob2xkOiAlZCwgIgorCQkgICJyc3NpX2RlbHRhOiAlZCwgIgorCQkgICJ0ZGxzX29wdGlvbnM6IDB4JXgsICIKKwkJICAicGVlcl90cmFmZmljX2luZF93aW5kb3c6ICVkLCAiCisJCSAgInBlZXJfdHJhZmZpY19yZXNwb25zZV90aW1lb3V0OiAlZCwgIgorCQkgICJwdWFwc2RfbWFzazogMHgleCwgIgorCQkgICJwdWFwc2RfaW5hY3Rpdml0eV90aW1lOiAlZCwgIgorCQkgICJwdWFwc2RfcnhfZnJhbWVfdGhyZXNob2xkOiAlZCAiLAorCQkgIF9fZnVuY19fLAorCQkgIHRkbHNQYXJhbXMtPnZkZXZfaWQsCisJCSAgdGRsc1BhcmFtcy0+dGRsc19zdGF0ZSwKKwkJICB0ZGxzUGFyYW1zLT5ub3RpZmljYXRpb25faW50ZXJ2YWxfbXMsCisJCSAgdGRsc1BhcmFtcy0+dHhfZGlzY292ZXJ5X3RocmVzaG9sZCwKKwkJICB0ZGxzUGFyYW1zLT50eF90ZWFyZG93bl90aHJlc2hvbGQsCisJCSAgdGRsc1BhcmFtcy0+cnNzaV90ZWFyZG93bl90aHJlc2hvbGQsCisJCSAgdGRsc1BhcmFtcy0+cnNzaV9kZWx0YSwKKwkJICB0ZGxzUGFyYW1zLT50ZGxzX29wdGlvbnMsCisJCSAgdGRsc1BhcmFtcy0+cGVlcl90cmFmZmljX2luZF93aW5kb3csCisJCSAgdGRsc1BhcmFtcy0+cGVlcl90cmFmZmljX3Jlc3BvbnNlX3RpbWVvdXQsCisJCSAgdGRsc1BhcmFtcy0+cHVhcHNkX21hc2ssCisJCSAgdGRsc1BhcmFtcy0+cHVhcHNkX2luYWN0aXZpdHlfdGltZSwKKwkJICB0ZGxzUGFyYW1zLT5wdWFwc2RfcnhfZnJhbWVfdGhyZXNob2xkKTsKKworCWNkZl9yZXRfc3RhdHVzID0gc21lX3VwZGF0ZV9md190ZGxzX3N0YXRlKHBIZGRDdHgtPmhIYWwsIHRkbHNQYXJhbXMsIHRydWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RmX3JldF9zdGF0dXMpIHsKKwkJY2RmX21lbV9mcmVlKHRkbHNQYXJhbXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF91cGRhdGVfdGRsc19pbmZvIC0gdXBkYXRlIHRkbHMgc3RhdHVzIGluZm8KKyAqIEBhZGFwdGVyOiBwdHIgdG8gZGV2aWNlIGFkYXB0ZXIuCisgKiBAdGRsc19wcm9oaWJpdGVkOiBpbmRpY2F0ZXMgd2hldGhlciB0ZGxzIGlzIHByb2hpYml0ZWQuCisgKiBAdGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZDogaW5kaWNhdGVzIHdoZXRoZXIgdGRscyBjaGFubmVsIHN3aXRjaAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHByb2hpYml0ZWQuCisgKgorICogTm9ybWFsbHkgYW4gQVAgZG9lcyBub3QgaW5mbHVlbmNlIFRETFMgY29ubmVjdGlvbiBiZXR3ZWVuIFNUQXMKKyAqIGFzc29jaWF0ZWQgdG8gaXQuIEJ1dCBBUCBtYXkgc2V0IGJpdHMgZm9yIFRETFMgUHJvaGliaXRlZCBvcgorICogVERMUyBDaGFubmVsIFN3aXRjaCBQcm9oaWJpdGVkIGluIEV4dGVuZGVkIENhcGFiaWxpdHkgSUUgaW4KKyAqIEFzc29jL1JlLWFzc29jIHJlc3BvbnNlIHRvIFNUQS4gU28gYWZ0ZXIgU1RBIGlzIGNvbm5lY3RlZCB0bworICogYW4gQVAsIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB1cGRhdGUgVERMUyBzdGF0dXMgYXMgcGVyIHRob3NlCisgKiBiaXRzIHNldCBpbiBFeHQgQ2FwIElFIGluIHJlY2VpdmVkIEFzc29jL1JlLWFzc29jIHJlc3BvbnNlCisgKiBmcm9tIEFQLgorICoKKyAqIFJldHVybjogTm9uZS4KKyAqLwordm9pZCB3bGFuX2hkZF91cGRhdGVfdGRsc19pbmZvKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsIGJvb2wgdGRsc19wcm9oaWJpdGVkLAorCQkJCWJvb2wgdGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZCkKK3sKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwl0ZGxzQ3R4X3QgKmhkZF90ZGxzX2N0eCA9IFdMQU5fSEREX0dFVF9URExTX0NUWF9QVFIoYWRhcHRlcik7CisJdGRsc0luZm9fdCAqdGRsc19wYXJhbTsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAoIWhkZF90ZGxzX2N0eCkgeworCQkvKiBtYXkgYmUgVERMUyBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhpcyBhZGFwdGVyICovCisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgVERMUyBjb250ZXh0IGlzIG51bGwiKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBURExTIHN1cHBvcnQgaXMgZGlzYWJsZWQgdGhlbiBubyBuZWVkIHRvIHVwZGF0ZSB0YXJnZXQgKi8KKwlpZiAoZmFsc2UgPT0gaGRkX2N0eC0+Y29uZmlnLT5mRW5hYmxlVERMU1N1cHBvcnQpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIlRETFMgbm90IGVuYWJsZWQiKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBBUCBpbmRpY2F0ZWQgVERMUyBQcm9oaWJpdGVkIHRoZW4gZGlzYWJsZSB0ZGxzIG1vZGUgKi8KKwltdXRleF9sb2NrKCZoZGRfY3R4LT50ZGxzX2xvY2spOworCWlmICh0ZGxzX3Byb2hpYml0ZWQpIHsKKwkJaGRkX2N0eC0+dGRsc19tb2RlID0gZVRETFNfU1VQUE9SVF9OT1RfRU5BQkxFRDsKKwl9IGVsc2UgeworCQlpZiAoZmFsc2UgPT0gaGRkX2N0eC0+Y29uZmlnLT5mRW5hYmxlVERMU0ltcGxpY2l0VHJpZ2dlcikgeworCQkJaGRkX2N0eC0+dGRsc19tb2RlID0KKwkJCQllVERMU19TVVBQT1JUX0VYUExJQ0lUX1RSSUdHRVJfT05MWTsKKwkJfSBlbHNlIHsKKwkJCWhkZF9jdHgtPnRkbHNfbW9kZSA9IGVURExTX1NVUFBPUlRfRU5BQkxFRDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmhkZF9jdHgtPnRkbHNfbG9jayk7CisKKwl0ZGxzX3BhcmFtID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCp0ZGxzX3BhcmFtKSk7CisJaWYgKCF0ZGxzX3BhcmFtKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciB0ZGxzUGFyYW1zIikpOworCQlyZXR1cm47CisJfQorCisJdGRsc19wYXJhbS0+dmRldl9pZCA9IGFkYXB0ZXItPnNlc3Npb25JZDsKKwl0ZGxzX3BhcmFtLT50ZGxzX3N0YXRlID0gaGRkX2N0eC0+dGRsc19tb2RlOworCXRkbHNfcGFyYW0tPm5vdGlmaWNhdGlvbl9pbnRlcnZhbF9tcyA9CisJaGRkX3RkbHNfY3R4LT50aHJlc2hvbGRfY29uZmlnLnR4X3BlcmlvZF90OworCXRkbHNfcGFyYW0tPnR4X2Rpc2NvdmVyeV90aHJlc2hvbGQgPQorCWhkZF90ZGxzX2N0eC0+dGhyZXNob2xkX2NvbmZpZy50eF9wYWNrZXRfbjsKKwl0ZGxzX3BhcmFtLT50eF90ZWFyZG93bl90aHJlc2hvbGQgPQorCWhkZF90ZGxzX2N0eC0+dGhyZXNob2xkX2NvbmZpZy5pZGxlX3BhY2tldF9uOworCXRkbHNfcGFyYW0tPnJzc2lfdGVhcmRvd25fdGhyZXNob2xkID0KKwloZGRfdGRsc19jdHgtPnRocmVzaG9sZF9jb25maWcucnNzaV90ZWFyZG93bl90aHJlc2hvbGQ7CisJdGRsc19wYXJhbS0+cnNzaV9kZWx0YSA9IGhkZF90ZGxzX2N0eC0+dGhyZXNob2xkX2NvbmZpZy5yc3NpX2RlbHRhOworCisJdGRsc19wYXJhbS0+dGRsc19vcHRpb25zID0gMDsKKworCS8qIERvIG5vdCBlbmFibGUgVERMUyBvZmZjaGFubmVsLCBpZiBBUCBwcm9oaWJpdGVkIFRETFMgY2hhbm5lbCBzd2l0Y2ggKi8KKwlpZiAoKGhkZF9jdHgtPmNvbmZpZy0+ZkVuYWJsZVRETFNPZmZDaGFubmVsKSAmJgorCSAgICAoIXRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQpKSB7CisJCXRkbHNfcGFyYW0tPnRkbHNfb3B0aW9ucyB8PSBFTkFfVERMU19PRkZDSEFOOworCX0KKworCWlmIChoZGRfY3R4LT5jb25maWctPmZFbmFibGVURExTQnVmZmVyU3RhKQorCQl0ZGxzX3BhcmFtLT50ZGxzX29wdGlvbnMgfD0gRU5BX1RETFNfQlVGRkVSX1NUQTsKKworCWlmIChoZGRfY3R4LT5jb25maWctPmZFbmFibGVURExTU2xlZXBTdGEpCisJCXRkbHNfcGFyYW0tPnRkbHNfb3B0aW9ucyB8PSBFTkFfVERMU19TTEVFUF9TVEE7CisKKwl0ZGxzX3BhcmFtLT5wZWVyX3RyYWZmaWNfaW5kX3dpbmRvdyA9CisJCWhkZF9jdHgtPmNvbmZpZy0+ZlRETFNQdWFwc2RQVElXaW5kb3c7CisJdGRsc19wYXJhbS0+cGVlcl90cmFmZmljX3Jlc3BvbnNlX3RpbWVvdXQgPQorCQloZGRfY3R4LT5jb25maWctPmZURExTUHVhcHNkUFRSVGltZW91dDsKKwl0ZGxzX3BhcmFtLT5wdWFwc2RfbWFzayA9CisJCWhkZF9jdHgtPmNvbmZpZy0+ZlRETFNVYXBzZE1hc2s7CisJdGRsc19wYXJhbS0+cHVhcHNkX2luYWN0aXZpdHlfdGltZSA9CisJCWhkZF9jdHgtPmNvbmZpZy0+ZlRETFNQdWFwc2RJbmFjdGl2aXR5VGltZXI7CisJdGRsc19wYXJhbS0+cHVhcHNkX3J4X2ZyYW1lX3RocmVzaG9sZCA9CisJCWhkZF9jdHgtPmNvbmZpZy0+ZlRETFNSeEZyYW1lVGhyZXNob2xkOworCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJRkwoIlNldHRpbmcgdGRscyBzdGF0ZSBhbmQgcGFyYW0gaW4gZnc6ICIKKwkJInZkZXZfaWQ6ICVkLCAiCisJCSJ0ZGxzX3N0YXRlOiAlZCwgIgorCQkibm90aWZpY2F0aW9uX2ludGVydmFsX21zOiAlZCwgIgorCQkidHhfZGlzY292ZXJ5X3RocmVzaG9sZDogJWQsICIKKwkJInR4X3RlYXJkb3duX3RocmVzaG9sZDogJWQsICIKKwkJInJzc2lfdGVhcmRvd25fdGhyZXNob2xkOiAlZCwgIgorCQkicnNzaV9kZWx0YTogJWQsICIKKwkJInRkbHNfb3B0aW9uczogMHgleCwgIgorCQkicGVlcl90cmFmZmljX2luZF93aW5kb3c6ICVkLCAiCisJCSJwZWVyX3RyYWZmaWNfcmVzcG9uc2VfdGltZW91dDogJWQsICIKKwkJInB1YXBzZF9tYXNrOiAweCV4LCAiCisJCSJwdWFwc2RfaW5hY3Rpdml0eV90aW1lOiAlZCwgIgorCQkicHVhcHNkX3J4X2ZyYW1lX3RocmVzaG9sZDogJWQgIiksCisJCXRkbHNfcGFyYW0tPnZkZXZfaWQsCisJCXRkbHNfcGFyYW0tPnRkbHNfc3RhdGUsCisJCXRkbHNfcGFyYW0tPm5vdGlmaWNhdGlvbl9pbnRlcnZhbF9tcywKKwkJdGRsc19wYXJhbS0+dHhfZGlzY292ZXJ5X3RocmVzaG9sZCwKKwkJdGRsc19wYXJhbS0+dHhfdGVhcmRvd25fdGhyZXNob2xkLAorCQl0ZGxzX3BhcmFtLT5yc3NpX3RlYXJkb3duX3RocmVzaG9sZCwKKwkJdGRsc19wYXJhbS0+cnNzaV9kZWx0YSwKKwkJdGRsc19wYXJhbS0+dGRsc19vcHRpb25zLAorCQl0ZGxzX3BhcmFtLT5wZWVyX3RyYWZmaWNfaW5kX3dpbmRvdywKKwkJdGRsc19wYXJhbS0+cGVlcl90cmFmZmljX3Jlc3BvbnNlX3RpbWVvdXQsCisJCXRkbHNfcGFyYW0tPnB1YXBzZF9tYXNrLAorCQl0ZGxzX3BhcmFtLT5wdWFwc2RfaW5hY3Rpdml0eV90aW1lLAorCQl0ZGxzX3BhcmFtLT5wdWFwc2RfcnhfZnJhbWVfdGhyZXNob2xkKTsKKworCWNkZl9yZXRfc3RhdHVzID0gc21lX3VwZGF0ZV9md190ZGxzX3N0YXRlKGhkZF9jdHgtPmhIYWwsCisJCQkJCSAgICAgICB0ZGxzX3BhcmFtLAorCQkJCQkgICAgICAgdHJ1ZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfcmV0X3N0YXR1cykgeworCQljZGZfbWVtX2ZyZWUodGRsc19wYXJhbSk7CisJCXJldHVybjsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfc2V0X3N0YV9pZCgpIC0gc2V0IHN0YXRpb24gSUQgb24gYSB0ZGxzIHBlZXIKKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqIEBtYWM6IE1BQyBhZGRyZXNzIG9mIGEgdGRscyBwZWVyCisgKiBAc3RhSWQ6IHN0YXRpb24gSUQKKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlCisgKi8KK2ludCB3bGFuX2hkZF90ZGxzX3NldF9zdGFfaWQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCSAgICAgdWludDhfdCBzdGFJZCkKK3sKKwloZGRUZGxzUGVlcl90ICpjdXJyX3BlZXI7CisKKwljdXJyX3BlZXIgPSB3bGFuX2hkZF90ZGxzX2dldF9wZWVyKHBBZGFwdGVyLCBtYWMpOworCWlmIChjdXJyX3BlZXIgPT0gTlVMTCkgeworCQloZGRMb2coTE9HRSwgRkwoImN1cnJfcGVlciBpcyBOVUxMIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdXJyX3BlZXItPnN0YUlkID0gc3RhSWQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX3NldF9leHRjdHJsX3BhcmFtKCkgLSBzZXQgZXh0ZXJuYWwgY29udHJvbCBwYXJhbWV0ZXIgb24gYSBwZWVyCisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKiBAbWFjOiBNQUMgYWRkcmVzcyBvZiB0aGUgcGVlcgorICogQGNoYW46IENoYW5uZWwKKyAqIEBtYXhfbGF0ZW5jeTogTWF4aW11bSBsYXRlbmN5CisgKiBAb3BfY2xhc3M6IE9wZXJhdGlvbiBjbGFzcworICogQG1pbl9iYW5kd2lkdGg6IE1pbmltYWwgYmFuZHdpZHRoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX3RkbHNfc2V0X2V4dGN0cmxfcGFyYW0oaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQkgICAgdWludDMyX3QgY2hhbiwgdWludDMyX3QgbWF4X2xhdGVuY3ksCisJCQkJICAgIHVpbnQzMl90IG9wX2NsYXNzLCB1aW50MzJfdCBtaW5fYmFuZHdpZHRoKQoreworCWhkZFRkbHNQZWVyX3QgKmN1cnJfcGVlcjsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJaWYgKCFwSGRkQ3R4KQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCWN1cnJfcGVlciA9IHdsYW5faGRkX3RkbHNfZmluZF9wZWVyKHBBZGFwdGVyLCBtYWMsIGZhbHNlKTsKKwlpZiAoY3Vycl9wZWVyID09IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY3Vycl9wZWVyLT5vcF9jbGFzc19mb3JfcHJlZl9vZmZfY2hhbiA9ICh1aW50OF90KSBvcF9jbGFzczsKKwljdXJyX3BlZXItPnByZWZfb2ZmX2NoYW5fbnVtID0gKHVpbnQ4X3QpIGNoYW47CisKKwlpZiAoY3Vycl9wZWVyLT5vcF9jbGFzc19mb3JfcHJlZl9vZmZfY2hhbikKKwkJY3Vycl9wZWVyLT5vcF9jbGFzc19mb3JfcHJlZl9vZmZfY2hhbl9pc19zZXQgPSAxOworCWVsc2UKKwkJY3Vycl9wZWVyLT5vcF9jbGFzc19mb3JfcHJlZl9vZmZfY2hhbl9pc19zZXQgPSAwOworCisJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfc2V0X2ZvcmNlX3BlZXIoKSAtIHNldC9jbGVhciBpc0ZvcmNlZFBlZXIgZmxhZyBvbiBhIHBlZXIKKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqIEBtYWM6IE1BQyBhZGRyZXNzIG9mIHRoZSB0ZGxzIHBlZXIKKyAqIEBmb3JjZVBlZXI6IHZhbHVlIHVzZWQgdG8gc2V0IGlzRm9yY2VkUGVlciBmbGFnIG9uIHRoZSBwZWVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX3RkbHNfc2V0X2ZvcmNlX3BlZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQkgYm9vbCBmb3JjZVBlZXIpCit7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCWlmICghcEhkZEN0eCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCisJY3Vycl9wZWVyID0gd2xhbl9oZGRfdGRsc19maW5kX3BlZXIocEFkYXB0ZXIsIG1hYywgZmFsc2UpOworCWlmIChjdXJyX3BlZXIgPT0gTlVMTCkgeworCQltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN1cnJfcGVlci0+aXNGb3JjZWRQZWVyID0gZm9yY2VQZWVyOworCW11dGV4X3VubG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2ZpbmRfcGVlcigpIC0gZmluZCBURExTIHBlZXIgZ2l2ZW4gaXRzIE1BQyBhZGRyZXNzCisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKiBAbWFjOiBNQUMgYWRkcmVzcyBvZiBwZWVyCisgKiBAbXV0ZXhMb2NrOiBPcHRpb24gdG8gaW5kaWNhdGUgaWYgbXV0ZXggbG9ja2luZyBpcyByZXF1aXJlZCBmb3Igc2VhcmNoaW5nCisgKgorICogUmV0dXJuOiBJZiBwZWVyTWFjIGlzIGZvdW5kLCB0aGVuIGl0IHJldHVybnMgcG9pbnRlciB0byBoZGRUZGxzUGVlcl90OworICogICAgICAgICBvdGhlcndpc2UsIGl0IHJldHVybnMgTlVMTAorICovCitoZGRUZGxzUGVlcl90ICp3bGFuX2hkZF90ZGxzX2ZpbmRfcGVlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgICAgY29uc3QgdWludDhfdCAqbWFjLCBib29sIG11dGV4TG9jaykKK3sKKwl1aW50OF90IGtleTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwloZGRUZGxzUGVlcl90ICpjdXJyX3BlZXI7CisJdGRsc0N0eF90ICpwSGRkVGRsc0N0eDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKwlpZiAoMCAhPSAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJwSGRkQ3R4IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG11dGV4TG9jaykgeworCQltdXRleF9sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCX0KKwlwSGRkVGRsc0N0eCA9IFdMQU5fSEREX0dFVF9URExTX0NUWF9QVFIocEFkYXB0ZXIpOworCWlmIChOVUxMID09IHBIZGRUZGxzQ3R4KSB7CisJCWlmIChtdXRleExvY2spCisJCQltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCWtleSA9IHdsYW5faGRkX3RkbHNfaGFzaF9rZXkobWFjKTsKKworCWhlYWQgPSAmcEhkZFRkbHNDdHgtPnBlZXJfbGlzdFtrZXldOworCisJbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIHsKKwkJY3Vycl9wZWVyID0gbGlzdF9lbnRyeShwb3MsIGhkZFRkbHNQZWVyX3QsIG5vZGUpOworCQlpZiAoIW1lbWNtcChtYWMsIGN1cnJfcGVlci0+cGVlck1hYywgNikpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiZmluZFRkbHNQZWVyOiBmb3VuZCBzdGFJZCAlZCIsCisJCQkJICBjdXJyX3BlZXItPnN0YUlkKTsKKwkJCWlmIChtdXRleExvY2spCisJCQkJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCQkJcmV0dXJuIGN1cnJfcGVlcjsKKwkJfQorCX0KKwlpZiAobXV0ZXhMb2NrKQorCQltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19maW5kX2FsbF9wZWVyKCkgLSBmaW5kIGFsbCBwZWVycyBtYXRjaGluZyB0aGUgaW5wdXQgTUFDCisgKiBAcEhkZEN0eDogSEREIGNvbnRleHQKKyAqIEBtYWM6IE1BQyBhZGRyZXNzCisgKgorICogUmV0dXJuOiBURExTIHBlZXIgaWYgYSBtYXRjaGluZyBpcyBkZXRlY3RlZDsgTlVMTCBvdGhlcndpc2UKKyAqLworaGRkVGRsc1BlZXJfdCAqd2xhbl9oZGRfdGRsc19maW5kX2FsbF9wZWVyKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJCSAgIGNvbnN0IHU4ICptYWMpCit7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHggPSBOVUxMOworCWhkZFRkbHNQZWVyX3QgKmN1cnJfcGVlciA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSAwOworCisJbXV0ZXhfbG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKworCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihwSGRkQ3R4LCAmcEFkYXB0ZXJOb2RlKTsKKwl3aGlsZSAoTlVMTCAhPSBwQWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlwQWRhcHRlciA9IHBBZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisKKwkJcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTsKKwkJaWYgKE5VTEwgIT0gcEhkZFRkbHNDdHgpIHsKKwkJCWN1cnJfcGVlciA9CisJCQkJd2xhbl9oZGRfdGRsc19maW5kX3BlZXIocEFkYXB0ZXIsIG1hYywgZmFsc2UpOworCQkJaWYgKGN1cnJfcGVlcikgeworCQkJCW11dGV4X3VubG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwkJCQlyZXR1cm4gY3Vycl9wZWVyOworCQkJfQorCQl9CisJCXN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyKHBIZGRDdHgsIHBBZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisJfQorCW11dGV4X3VubG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwlyZXR1cm4gY3Vycl9wZWVyOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfcmVzZXRfcGVlcigpIC0gcmVzZXQgVERMUyBwZWVyIGlkZW50aWZpZWQgYnkgTUFDIGFkZHJlc3MKKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqIEBtYWM6IE1BQyBhZGRyZXNzIG9mIHRoZSBwZWVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX3RkbHNfcmVzZXRfcGVlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgY29uc3QgdWludDhfdCAqbWFjKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisJY3Vycl9wZWVyID0gd2xhbl9oZGRfdGRsc19nZXRfcGVlcihwQWRhcHRlciwgbWFjKTsKKwlpZiAoY3Vycl9wZWVyID09IE5VTEwpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJjdXJyX3BlZXIgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd2xhbl9oZGRfdGRsc19zZXRfcGVlcl9saW5rX3N0YXR1cyhjdXJyX3BlZXIsCisJCQkJCSAgIGVURExTX0xJTktfSURMRSwKKwkJCQkJICAgZVRETFNfTElOS19VTlNQRUNJRklFRCk7CisJY3Vycl9wZWVyLT5zdGFJZCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX3BlZXJfcmVzZXRfZGlzY292ZXJ5X3Byb2Nlc3NlZCgpIC0gcmVzZXQgZGlzY292ZXJ5IHN0YXR1cworICogQHBIZGRUZGxzQ3R4OiBURExTIGNvbnRleHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBkaXNjb3ZlcnkgcHJvY2Vzc2luZyBiaXQgZm9yIGFsbCBURExTIHBlZXJzCisgKgorICogQ2FsbGVyIGhhcyB0byB0YWtlIHRoZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqCisgKiBSZXR1cm46IDAKKyAqLworc3RhdGljIGludDMyX3Qgd2xhbl9oZGRfdGRsc19wZWVyX3Jlc2V0X2Rpc2NvdmVyeV9wcm9jZXNzZWQodGRsc0N0eF90ICoKKwkJCQkJCQkgICAgcEhkZFRkbHNDdHgpCit7CisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwloZGRUZGxzUGVlcl90ICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqcTsKKworCXBIZGRUZGxzQ3R4LT5kaXNjb3ZlcnlfcGVlcl9jbnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFRETFNfUEVFUl9MSVNUX1NJWkU7IGkrKykgeworCQloZWFkID0gJnBIZGRUZGxzQ3R4LT5wZWVyX2xpc3RbaV07CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHEsIGhlYWQpIHsKKwkJCXRtcCA9IGxpc3RfZW50cnkocG9zLCBoZGRUZGxzUGVlcl90LCBub2RlKTsKKwkJCXRtcC0+ZGlzY292ZXJ5X3Byb2Nlc3NlZCA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2Nvbm5lY3RlZF9wZWVycygpIC0gRmluZCB0aGUgbnVtYmVyIG9mIGNvbm5lY3RlZCBURExTIHBlZXJzCisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKgorICogUmV0dXJuOiBUaGUgbnVtYmVyIG9mIGNvbm5lY3RlZCBURExTIHBlZXJzIG9yIDAgaWYgZXJyb3IgaXMgZGV0ZWN0ZWQKKyAqLwordWludDE2X3Qgd2xhbl9oZGRfdGRsc19jb25uZWN0ZWRfcGVlcnMoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisJaWYgKDAgIT0gKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZEN0eCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBwSGRkQ3R4LT5jb25uZWN0ZWRfcGVlcl9jb3VudDsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2dldF9hbGxfcGVlcnMoKSAtIGR1bXAgYWxsIFRETFMgcGVlciBpbmZvIGludG8gb3V0cHV0IHN0cmluZworICogQHBBZGFwdGVyOiBIREQgYWRhcHRlcgorICogQGJ1Zjogb3V0cHV0IHN0cmluZyBidWZmZXIgdG8gaG9sZCB0aGUgcGVlciBpbmZvCisgKiBAYnVmbGVuOiB0aGUgc2l6ZSBvZiBvdXRwdXQgc3RyaW5nIGJ1ZmZlcgorICoKKyAqIFJldHVybjogVGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgdmFsaWQgcGVlciBpbmZvIGluIHRoZSBvdXRwdXQgYnVmZmVyCisgKi8KK2ludCB3bGFuX2hkZF90ZGxzX2dldF9hbGxfcGVlcnMoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlpbnQgaTsKKwlpbnQgbGVuLCBpbml0X2xlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwloZGRUZGxzUGVlcl90ICpjdXJyX3BlZXI7CisJdGRsc0N0eF90ICpwSGRkVGRsc0N0eDsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKwlpZiAoMCAhPSAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJwSGRkQ3R4IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5pdF9sZW4gPSBidWZsZW47CisJbGVuID0gc2NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiXG4lLTE4cyUtM3MlLTRzJS0zcyUtNXNcbiIsCisJCQkiTUFDIiwgIklkIiwgImNhcCIsICJ1cCIsICJSU1NJIik7CisJYnVmICs9IGxlbjsKKwlidWZsZW4gLT0gbGVuOworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NyAqLworCWxlbiA9IHNjbnByaW50ZihidWYsIGJ1ZmxlbiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJYnVmICs9IGxlbjsKKwlidWZsZW4gLT0gbGVuOworCisJbXV0ZXhfbG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKworCXBIZGRUZGxzQ3R4ID0gV0xBTl9IRERfR0VUX1RETFNfQ1RYX1BUUihwQWRhcHRlcik7CisJaWYgKE5VTEwgPT0gcEhkZFRkbHNDdHgpIHsKKwkJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCQlsZW4gPSBzY25wcmludGYoYnVmLCBidWZsZW4sICJURExTIG5vdCBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisJZm9yIChpID0gMDsgaSA8IFRETFNfUEVFUl9MSVNUX1NJWkU7IGkrKykgeworCQloZWFkID0gJnBIZGRUZGxzQ3R4LT5wZWVyX2xpc3RbaV07CisKKwkJbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIHsKKwkJCWN1cnJfcGVlciA9IGxpc3RfZW50cnkocG9zLCBoZGRUZGxzUGVlcl90LCBub2RlKTsKKworCQkJaWYgKGJ1ZmxlbiA8IDMyICsgMSkKKwkJCQlicmVhazsKKwkJCWxlbiA9IHNjbnByaW50ZihidWYsIGJ1ZmxlbiwKKwkJCQkJTUFDX0FERFJFU1NfU1RSICIlM2QlNHMlM3MlNWRcbiIsCisJCQkJCU1BQ19BRERSX0FSUkFZKGN1cnJfcGVlci0+cGVlck1hYyksCisJCQkJCWN1cnJfcGVlci0+c3RhSWQsCisJCQkJCShjdXJyX3BlZXItPnRkbHNfc3VwcG9ydCA9PQorCQkJCQkgZVRETFNfQ0FQX1NVUFBPUlRFRCkgPyAiWSIgOiAiTiIsCisJCQkJCVRETFNfSVNfQ09OTkVDVEVEKGN1cnJfcGVlcikgPyAiWSIgOgorCQkJCQkiTiIsIGN1cnJfcGVlci0+cnNzaSk7CisJCQlidWYgKz0gbGVuOworCQkJYnVmbGVuIC09IGxlbjsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJcmV0dXJuIGluaXRfbGVuIC0gYnVmbGVuOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfY29ubmVjdGlvbl9jYWxsYmFjaygpIC0gY2FsbGJhY2sgYWZ0ZXIgdGRscyBjb25uZWN0aW9uCisgKiBAcEFkYXB0ZXI6IEhERCBhZGFwdGVyCisgKgorICogUmV0dXJuOiBWb2lkCisgKi8KK3ZvaWQgd2xhbl9oZGRfdGRsc19jb25uZWN0aW9uX2NhbGxiYWNrKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKwlpZiAoKE5VTEwgPT0gcEhkZEN0eCkgfHwgKE5VTEwgPT0gcEhkZFRkbHNDdHgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZEN0eCBvciBwSGRkVGRsc0N0eCBwb2ludHMgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCW11dGV4X2xvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisKKwloZGRMb2coTE9HMSwKKwkJRkwoInVwZGF0ZSAlZCIpLAorCQlwSGRkVGRsc0N0eC0+dGhyZXNob2xkX2NvbmZpZy50eF9wZXJpb2RfdCk7CisKKwlpZiAoZVRETFNfU1VQUE9SVF9FTkFCTEVEID09IHBIZGRDdHgtPnRkbHNfbW9kZSkgeworCQl3bGFuX2hkZF90ZGxzX3BlZXJfcmVzZXRfZGlzY292ZXJ5X3Byb2Nlc3NlZChwSGRkVGRsc0N0eCk7CisJCXBIZGRUZGxzQ3R4LT5kaXNjb3Zlcnlfc2VudF9jbnQgPSAwOworCQl3bGFuX2hkZF90ZGxzX2NoZWNrX3Bvd2VyX3NhdmVfcHJvaGliaXRlZChwSGRkVGRsc0N0eC0+CisJCQkJCQkJICBwQWRhcHRlcik7CisKKwl9CisJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19kaXNjb25uZWN0aW9uX2NhbGxiYWNrKCkgLSBjYWxsYmFjayBhZnRlciB0ZGxzIGRpc2Nvbm5lY3Rpb24KKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX2Rpc2Nvbm5lY3Rpb25fY2FsbGJhY2soaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJdGRsc0N0eF90ICpwSGRkVGRsc0N0eCA9IFdMQU5fSEREX0dFVF9URExTX0NUWF9QVFIocEFkYXB0ZXIpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCWlmICgoTlVMTCA9PSBwSGRkQ3R4KSB8fCAoTlVMTCA9PSBwSGRkVGRsc0N0eCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJwSGRkQ3R4IG9yIHBIZGRUZGxzQ3R4IHBvaW50cyB0byBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJaGRkTG9nKExPRzEsICIlcyIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisKKwlpZiAoTlVMTCA9PSBwSGRkVGRsc0N0eCkgeworCQltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZFRkbHNDdHggaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKwlwSGRkVGRsc0N0eC0+ZGlzY292ZXJ5X3NlbnRfY250ID0gMDsKKwl3bGFuX2hkZF90ZGxzX2NoZWNrX3Bvd2VyX3NhdmVfcHJvaGliaXRlZChwSGRkVGRsc0N0eC0+cEFkYXB0ZXIpOworCisJd2xhbl9oZGRfdGRsc19tb25pdG9yX3RpbWVyc19zdG9wKHBIZGRUZGxzQ3R4KTsKKwl3bGFuX2hkZF90ZGxzX2ZyZWVfbGlzdChwSGRkVGRsc0N0eCk7CisKKwlwSGRkVGRsc0N0eC0+Y3Vycl9jYW5kaWRhdGUgPSBOVUxMOworCisJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfbWdtdF9jb21wbGV0aW9uX2NhbGxiYWNrKCkgLSBjYWxsYmFjayBmb3IgVERMUyBtYW5hZ2VtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFggY29tcGxldGlvbgorICogQHBBZGFwdGVyOiBIREQgYWRhcHRlcgorICogQHN0YXR1c0NvZGU6IG1hbmFnZW1lbnQgVFggY29tcGxldGlvbiBzdGF0dXMKKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX21nbXRfY29tcGxldGlvbl9jYWxsYmFjayhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkJICAgIHVpbnQzMl90IHN0YXR1c0NvZGUpCit7CisJcEFkYXB0ZXItPm1nbXRUeENvbXBsZXRpb25TdGF0dXMgPSBzdGF0dXNDb2RlOworCWhkZExvZyhMT0cxLAorCQkgICIlczogTWdtdCBUWCBDb21wbGV0aW9uICVkIiwgX19mdW5jX18sIHN0YXR1c0NvZGUpOworCWNvbXBsZXRlKCZwQWRhcHRlci0+dGRsc19tZ210X2NvbXApOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfaW5jcmVtZW50X3BlZXJfY291bnQoKSAtIGluY3JlbWVudCBjb25uZWN0ZWQgVERMUyBwZWVyIGNvdW50ZXIKKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX2luY3JlbWVudF9wZWVyX2NvdW50KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCWlmICgwICE9ICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInBIZGRDdHggaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKworCXBIZGRDdHgtPmNvbm5lY3RlZF9wZWVyX2NvdW50Kys7CisJd2xhbl9oZGRfdGRsc19jaGVja19wb3dlcl9zYXZlX3Byb2hpYml0ZWQocEFkYXB0ZXIpOworCisJaGRkTG9nKExPRzEsICIlczogJWQiLAorCQkgIF9fZnVuY19fLCBwSGRkQ3R4LT5jb25uZWN0ZWRfcGVlcl9jb3VudCk7CisKKwltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19kZWNyZW1lbnRfcGVlcl9jb3VudCgpIC0gZGVjcmVtZW50IGNvbm5lY3RlZCBURExTIHBlZXIgY291bnRlcgorICogQHBBZGFwdGVyOiBIREQgYWRhcHRlcgorICoKKyAqIFJldHVybjogVm9pZAorICovCit2b2lkIHdsYW5faGRkX3RkbHNfZGVjcmVtZW50X3BlZXJfY291bnQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisJaWYgKDAgIT0gKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZEN0eCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCisJaWYgKHBIZGRDdHgtPmNvbm5lY3RlZF9wZWVyX2NvdW50KQorCQlwSGRkQ3R4LT5jb25uZWN0ZWRfcGVlcl9jb3VudC0tOworCXdsYW5faGRkX3RkbHNfY2hlY2tfcG93ZXJfc2F2ZV9wcm9oaWJpdGVkKHBBZGFwdGVyKTsKKworCWhkZExvZyhMT0cxLCAiJXM6ICVkIiwKKwkJICBfX2Z1bmNfXywgcEhkZEN0eC0+Y29ubmVjdGVkX3BlZXJfY291bnQpOworCisJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCit9CisKKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2ZpbmRfcHJvZ3Jlc3NfcGVlcigpIC0gZmluZCBwZWVyIGlmIFRETFMgaXMgb25nb2luZworICogQHBBZGFwdGVyOiBIREQgYWRhcHRlcgorICogQG1hYzogSWYgTlVMTCBjaGVjayBmb3IgYWxsIHRoZSBwZWVyIGxpc3QsIG90aGVyd2lzZSwgc2tpcCB0aGlzIG1hYyB3aGVuCisgKiAgICAgICBza2lwX3NlbGYgaXMgdHJ1ZQorICogQHNraXBfc2VsZjogSWYgdHJ1ZSwgc2tpcCB0aGlzIG1hYy4gb3RoZXJ3aXNlLCBjaGVjayBhbGwgdGhlIHBlZXIgbGlzdC4gaWYKKyAqICAgICAgICAgICAgIG1hYyBpcyBOVUxMLCB0aGlzIGFyZ3VtZW50IGlzIGlnbm9yZWQsIGFuZCBjaGVjayBmb3IgYWxsIHRoZSBwZWVyCisgKiAgICAgICAgICAgICBsaXN0LgorICoKKyAqIFJldHVybjogUG9pbnRlciB0byBoZGRUZGxzUGVlcl90IGlmIFRETFMgaXMgb25nb2luZy4gT3RoZXJ3aXNlIHJldHVybiBOVUxMLgorICovCitzdGF0aWMgaGRkVGRsc1BlZXJfdCAqd2xhbl9oZGRfdGRsc19maW5kX3Byb2dyZXNzX3BlZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCQkgICAgICAgY29uc3QgdTggKm1hYywKKwkJCQkJCSAgICAgICB1OCBza2lwX3NlbGYpCit7CisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwloZGRUZGxzUGVlcl90ICpjdXJyX3BlZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTs7CisKKwlpZiAoTlVMTCA9PSBwSGRkVGRsc0N0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInBIZGRUZGxzQ3R4IGlzIE5VTEwiKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBURExTX1BFRVJfTElTVF9TSVpFOyBpKyspIHsKKwkJaGVhZCA9ICZwSGRkVGRsc0N0eC0+cGVlcl9saXN0W2ldOworCQlsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgeworCQkJY3Vycl9wZWVyID0gbGlzdF9lbnRyeShwb3MsIGhkZFRkbHNQZWVyX3QsIG5vZGUpOworCQkJaWYgKHNraXBfc2VsZiAmJiBtYWMKKwkJCSAgICAmJiAhbWVtY21wKG1hYywgY3Vycl9wZWVyLT5wZWVyTWFjLCA2KSkgeworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZVRETFNfTElOS19DT05ORUNUSU5HID09CisJCQkJICAgIGN1cnJfcGVlci0+bGlua19zdGF0dXMpIHsKKwkJCQkJaGRkTG9nKExPRzEsCisJCQkJCQkgICIlczoiIE1BQ19BRERSRVNTX1NUUgorCQkJCQkJICAiIGVURExTX0xJTktfQ09OTkVDVElORyIsCisJCQkJCQkgIF9fZnVuY19fLAorCQkJCQkJICBNQUNfQUREUl9BUlJBWShjdXJyX3BlZXItPgorCQkJCQkJCQkgcGVlck1hYykpOworCQkJCQlyZXR1cm4gY3Vycl9wZWVyOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2lzX3Byb2dyZXNzKCkgLSBmaW5kIHRoZSBwZWVyIHdpdGggb25nb2luZyBURExTIHByb2dyZXNzCisgKiBAcEhkZEN0eDogSEREIGNvbnRleHQKKyAqIEBtYWM6IG1hYyBhZGRyZXNzIG9mIHRoZSBwZWVyCisgKiBAc2tpcF9zZWxmOiBpZiAxLCBza2lwIGNoZWNraW5nIHNlbGYuIElmIDAsIHNlYXJjaCBpbmNsdWRlcyBzZWxmCisgKgorICogUmV0dXJuOiBURExTIHBlZXIgaWYgZm91bmQ7IE5VTEwgb3RoZXJ3aXNlCisgKi8KK2hkZFRkbHNQZWVyX3QgKndsYW5faGRkX3RkbHNfaXNfcHJvZ3Jlc3MoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKwkJCQkJIGNvbnN0IHVpbnQ4X3QgKm1hYywgdWludDhfdCBza2lwX3NlbGYpCit7CisJaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOworCXRkbHNDdHhfdCAqcEhkZFRkbHNDdHggPSBOVUxMOworCWhkZFRkbHNQZWVyX3QgKmN1cnJfcGVlciA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSAwOworCisJbXV0ZXhfbG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKworCXN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlcihwSGRkQ3R4LCAmcEFkYXB0ZXJOb2RlKTsKKwl3aGlsZSAoTlVMTCAhPSBwQWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlwQWRhcHRlciA9IHBBZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisKKwkJcEhkZFRkbHNDdHggPSBXTEFOX0hERF9HRVRfVERMU19DVFhfUFRSKHBBZGFwdGVyKTsKKwkJaWYgKE5VTEwgIT0gcEhkZFRkbHNDdHgpIHsKKwkJCWN1cnJfcGVlciA9CisJCQkJd2xhbl9oZGRfdGRsc19maW5kX3Byb2dyZXNzX3BlZXIocEFkYXB0ZXIsIG1hYywKKwkJCQkJCQkJIHNraXBfc2VsZik7CisJCQlpZiAoY3Vycl9wZWVyKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCQkJCXJldHVybiBjdXJyX3BlZXI7CisJCQl9CisJCX0KKwkJc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIocEhkZEN0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQpOworCQlwQWRhcHRlck5vZGUgPSBwTmV4dDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50ZGxzX2xvY2spOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfdGRsc19wcmVfc2V0dXAoKSAtIFRETFMgUHJlIGltcGxpY2l0IHNldHVwCisgKiBAd29yazogd29ya19zdHJ1Y3QgdXNlZCB0byBmaW5kIHRoZSBURExTIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLworc3RhdGljIHZvaWQgX193bGFuX2hkZF90ZGxzX3ByZV9zZXR1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdGRsc0N0eF90ICpwSGRkVGRsc0N0eCA9IGNvbnRhaW5lcl9vZih3b3JrLCB0ZGxzQ3R4X3QsIGltcGxpY2l0X3NldHVwKTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCWhkZFRkbHNQZWVyX3QgKmN1cnJfcGVlcjsKKwloZGRUZGxzUGVlcl90ICp0ZW1wX3BlZXI7CisJaW50IHN0YXR1czsKKwl0U2lyTWFjQWRkciBwZWVyX21hYzsKKworCWlmIChOVUxMID09IHBIZGRUZGxzQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgicEhkZFRkbHNDdHggaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseShURExTX0NUWF9NQUdJQyAhPSBwSGRkVGRsc0N0eC0+bWFnaWMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHRkbHMgbWFnaWMgbnVtYmVyIG1pcy1tYXRjaCAldSIsCisJCQkgIF9fZnVuY19fLCBwSGRkVGRsc0N0eC0+bWFnaWMpOworCQlyZXR1cm47CisJfQorCisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEhkZFRkbHNDdHgtPnBBZGFwdGVyKTsKKworCWlmICgwICE9ICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInBIZGRDdHggaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKworCWN1cnJfcGVlciA9IHBIZGRUZGxzQ3R4LT5jdXJyX2NhbmRpZGF0ZTsKKworCWlmIChOVUxMID09IGN1cnJfcGVlcikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInBIZGRDdHggaXMgbm90IHZhbGlkIikpOworCQlnb3RvIGRvbmU7CisJfQorCisJY2RmX21lbV9jb3B5KCZwZWVyX21hYywgY3Vycl9wZWVyLT5wZWVyTWFjLCBzaXplb2YocGVlcl9tYWMpKTsKKworCW11dGV4X3VubG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKworCXRlbXBfcGVlciA9IHdsYW5faGRkX3RkbHNfaXNfcHJvZ3Jlc3MocEhkZEN0eCwgTlVMTCwgMCk7CisKKwlpZiAoTlVMTCAhPSB0ZW1wX3BlZXIpIHsKKwkJaGRkTG9nKExPRzEsCisJCQkgICIlczogIiBNQUNfQUREUkVTU19TVFIgIiBvbmdvaW5nLiBwcmVfc2V0dXAgaWdub3JlZCIsCisJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWSh0ZW1wX3BlZXItPnBlZXJNYWMpKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChlVERMU19DQVBfVU5LTk9XTiAhPSBjdXJyX3BlZXItPnRkbHNfc3VwcG9ydCkKKwkJd2xhbl9oZGRfdGRsc19zZXRfcGVlcl9saW5rX3N0YXR1cyhjdXJyX3BlZXIsCisJCQkJCQkgICBlVERMU19MSU5LX0RJU0NPVkVSSU5HLAorCQkJCQkJICAgZVRETFNfTElOS19TVUNDRVNTKTsKKworCW11dGV4X2xvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisKKwkvKiBJZ25vcmUgZGlzY292ZXJ5IGF0dGVtcHQgaWYgRXh0ZXJuYWwgQ29udHJvbCBpcyBlbmFibGVkLCB0aGF0CisJICogaXMsIHBlZXIgaXMgZm9yY2VkLiBJbiB0aGF0IGNhc2UsIGNvbnRpbnVlIGRpc2NvdmVyeSBhdHRlbXB0CisJICogcmVnYXJkbGVzcyBhdHRlbXB0IGNvdW50CisJICovCisJaWYgKGZhbHNlID09IGN1cnJfcGVlci0+aXNGb3JjZWRQZWVyKSB7CisJCWlmIChjdXJyX3BlZXItPmRpc2NvdmVyeV9hdHRlbXB0ID49CisJCSAgICBwSGRkVGRsc0N0eC0+dGhyZXNob2xkX2NvbmZpZy5kaXNjb3ZlcnlfdHJpZXNfbikgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IGRpc2NvdmVyeSBhdHRlbXB0ICglZCkgcmVhY2hlZCBtYXggKCVkKSBmb3IgcGVlciAiCisJCQkJICBNQUNfQUREUkVTU19TVFIKKwkJCQkgICIsIGlnbm9yZSBkaXNjb3ZlcnkgdHJpZ2dlciBmcm9tIGZ3IiwKKwkJCQkgIF9fZnVuY19fLCBjdXJyX3BlZXItPmRpc2NvdmVyeV9hdHRlbXB0LAorCQkJCSAgcEhkZFRkbHNDdHgtPnRocmVzaG9sZF9jb25maWcuCisJCQkJICBkaXNjb3ZlcnlfdHJpZXNfbiwKKwkJCQkgIE1BQ19BRERSX0FSUkFZKGN1cnJfcGVlci0+cGVlck1hYykpOworCQkJY3Vycl9wZWVyLT50ZGxzX3N1cHBvcnQgPSBlVERMU19DQVBfTk9UX1NVUFBPUlRFRDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwl3bGFuX2hkZF90ZGxzX3NldF9wZWVyX2xpbmtfc3RhdHVzKGN1cnJfcGVlciwKKwkJCQkJICAgZVRETFNfTElOS19ESVNDT1ZFUklORywKKwkJCQkJICAgZVRETFNfTElOS19TVUNDRVNTKTsKKworCXN0YXR1cyA9CisJCXdsYW5faGRkX2NmZzgwMjExX3NlbmRfdGRsc19kaXNjb3Zlcl9yZXEocEhkZFRkbHNDdHgtPnBBZGFwdGVyLT4KKwkJCQkJCQkgd2Rldi53aXBoeSwKKwkJCQkJCQkgcEhkZFRkbHNDdHgtPnBBZGFwdGVyLT5kZXYsCisJCQkJCQkJIHBlZXJfbWFjKTsKKworCW11dGV4X2xvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisKKwlpZiAoTlVMTCA9PSBwSGRkVGRsc0N0eC0+Y3Vycl9jYW5kaWRhdGUpIHsKKwkJaGRkTG9nKExPR0UsCisJCQkgICIlczogY3VycmVudCBjYW5kaWRhdGUgTm90IHZhbGlkIGFueSBtb3JlIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJY3Vycl9wZWVyID0gcEhkZFRkbHNDdHgtPmN1cnJfY2FuZGlkYXRlOworCisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhMT0dFLAorCQkJICAiJXM6ICIgTUFDX0FERFJFU1NfU1RSICIgZGlzY292ZXJ5IGNvdWxkIG5vdCBzZW50IiwKKwkJCSAgX19mdW5jX18sIE1BQ19BRERSX0FSUkFZKGN1cnJfcGVlci0+cGVlck1hYykpOworCQlpZiAoZVRETFNfQ0FQX1VOS05PV04gIT0gY3Vycl9wZWVyLT50ZGxzX3N1cHBvcnQpIHsKKwkJCW11dGV4X3VubG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwkJCXdsYW5faGRkX3RkbHNfc2V0X3BlZXJfbGlua19zdGF0dXMoY3Vycl9wZWVyLAorCQkJCQkJCSAgIGVURExTX0xJTktfSURMRSwKKwkJCQkJCQkgICBlVERMU19MSU5LX1VOU1BFQ0lGSUVEKTsKKwkJCW11dGV4X2xvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJCX0KKwkJZ290byBkb25lOworCX0KKworCXBIZGRUZGxzQ3R4LT5kaXNjb3Zlcnlfc2VudF9jbnQrKzsKKworCWN1cnJfcGVlci0+ZGlzY292ZXJ5X2F0dGVtcHQrKzsKKworCXdsYW5faGRkX3RkbHNfY2hlY2tfcG93ZXJfc2F2ZV9wcm9oaWJpdGVkKHBIZGRUZGxzQ3R4LT5wQWRhcHRlcik7CisKKwloZGRMb2coTE9HMSwKKwkJICAiJXM6IGRpc2NvdmVyeSBjb3VudCAldSB0aW1lb3V0ICV1IG1zZWMiLCBfX2Z1bmNfXywKKwkJICBwSGRkVGRsc0N0eC0+ZGlzY292ZXJ5X3NlbnRfY250LAorCQkgIHBIZGRUZGxzQ3R4LT50aHJlc2hvbGRfY29uZmlnLnR4X3BlcmlvZF90IC0KKwkJICBURExTX0RJU0NPVkVSWV9USU1FT1VUX0JFRk9SRV9VUERBVEUpOworCisJd2xhbl9oZGRfdGRsc190aW1lcl9yZXN0YXJ0KHBIZGRUZGxzQ3R4LT5wQWRhcHRlciwKKwkJCQkgICAgJnBIZGRUZGxzQ3R4LT5wZWVyRGlzY292ZXJ5VGltZW91dFRpbWVyLAorCQkJCSAgICBwSGRkVGRsc0N0eC0+dGhyZXNob2xkX2NvbmZpZy50eF9wZXJpb2RfdCAtCisJCQkJICAgIFRETFNfRElTQ09WRVJZX1RJTUVPVVRfQkVGT1JFX1VQREFURSk7CisKK2RvbmU6CisJcEhkZFRkbHNDdHgtPmN1cnJfY2FuZGlkYXRlID0gTlVMTDsKKwlwSGRkVGRsc0N0eC0+bWFnaWMgPSAwOworCW11dGV4X3VubG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19wcmVfc2V0dXAoKSAtIFRETFMgUHJlIGltcGxpY2l0IHNldHVwCisgKiBAd29yazogd29ya19zdHJ1Y3QgdXNlZCB0byBmaW5kIHRoZSBURExTIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX3ByZV9zZXR1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlfX3dsYW5faGRkX3RkbHNfcHJlX3NldHVwKHdvcmspOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2NvcHlfc2Nhbl9jb250ZXh0KCkgLSBDb3B5IFRETFMgc2NhbiBjb250ZXh0CisgKiBAcEhkZEN0eDogSEREIGNvbnRleHQKKyAqIEB3aXBoeTogd2lwaHkgcG9pbnRlcgorICogQGRldjogbmV0IGRldmljZQorICogcmVxdWVzdDogc291cmNlIHNjYW4gY29udGV4dAorICoKKyAqIENvcHkgdGhlIHNvdXJjZSBzY2FuIGNvbnRleHQgaW50byB0aGUgSEREIGNvbnRleHQncyBURExTIHNjYW4gY29udGV4dAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlCisgKi8KK2ludCB3bGFuX2hkZF90ZGxzX2NvcHlfc2Nhbl9jb250ZXh0KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJICAgIHN0cnVjdCB3aXBoeSAqd2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorI2VuZGlmCisJCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJdGRsc19zY2FuX2NvbnRleHRfdCAqc2Nhbl9jdHg7CisKKwlpZiAoMCAhPSAod2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJwSGRkQ3R4IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2Nhbl9jdHggPSAmcEhkZEN0eC0+dGRsc19zY2FuX2N0eHQ7CisKKwlzY2FuX2N0eC0+d2lwaHkgPSB3aXBoeTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJc2Nhbl9jdHgtPmRldiA9IGRldjsKKyNlbmRpZgorCisJc2Nhbl9jdHgtPnNjYW5fcmVxdWVzdCA9IHJlcXVlc3Q7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19zY2FuX2luaXRfd29yaygpIC0gc2NoZWR1bGUgdGRscyBzY2FuIHdvcmsKKyAqIEBwSGRkQ3R4OiBIREQgY29udGV4dAorICogQHdpcGh5OiB3aXBoeSBwb2ludGVyCisgKiBAZGV2OiBuZXQgZGV2aWNlCisgKiBAcmVxdWVzdDogc2NhbiByZXF1ZXN0CisgKiBAZGVsYXk6IGRlbGF5IHZhbHVlIHRvIHBhc3MgdG8gdGhlIHdvcmsgc2NoZWR1bGluZworICoKKyAqIFJldHVybjogVm9pZAorICovCitzdGF0aWMgdm9pZCB3bGFuX2hkZF90ZGxzX3NjYW5faW5pdF93b3JrKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisJCQkJCSBzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisjZW5kaWYKKwkJCQkJIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QsCisJCQkJCSB1bnNpZ25lZCBsb25nIGRlbGF5KQoreworCWlmIChURExTX0NUWF9NQUdJQyAhPSBwSGRkQ3R4LT50ZGxzX3NjYW5fY3R4dC5tYWdpYykgeworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwkJd2xhbl9oZGRfdGRsc19jb3B5X3NjYW5fY29udGV4dChwSGRkQ3R4LCB3aXBoeSwgZGV2LCByZXF1ZXN0KTsKKyNlbHNlCisJCXdsYW5faGRkX3RkbHNfY29weV9zY2FuX2NvbnRleHQocEhkZEN0eCwgd2lwaHksIHJlcXVlc3QpOworI2VuZGlmCisJCXBIZGRDdHgtPnRkbHNfc2Nhbl9jdHh0LmF0dGVtcHQgPSAwOworCQlwSGRkQ3R4LT50ZGxzX3NjYW5fY3R4dC5tYWdpYyA9IFRETFNfQ1RYX01BR0lDOworCX0KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBIZGRDdHgtPnRkbHNfc2Nhbl9jdHh0LnRkbHNfc2Nhbl93b3JrLCBkZWxheSk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19zY2FuX2NhbGxiYWNrKCkgLSBjYWxsYmFjayBmb3IgVERMUyBzY2FuIG9wZXJhdGlvbgorICogQHBBZGFwdGVyOiBIREQgYWRhcHRlcgorICogQHdpcGh5OiB3aXBoeQorICogQGRldjogbmV0IGRldmljZQorICogQHJlcXVlc3Q6IHNjYW4gcmVxdWVzdAorICoKKyAqIFJldHVybjogbmVnYXRpdmUgPSBjYWxsZXIgc2hvdWxkIHN0b3AgYW5kIHJldHVybiBlcnJvciBjb2RlIGltbWVkaWF0ZWx5CisgKiAgICAgICAgIDAgPSBjYWxsZXIgc2hvdWxkIHN0b3AgYW5kIHJldHVybiBzdWNjZXNzIGltbWVkaWF0ZWx5CisgKiAgICAgICAgIDEgPSBjYWxsZXIgY2FuIGNvbnRpbnVlIHRvIHNjYW4KKyAqLworaW50IHdsYW5faGRkX3RkbHNfc2Nhbl9jYWxsYmFjayhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgc3RydWN0IHdpcGh5ICp3aXBoeSwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgNiwgMCkpCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyNlbmRpZgorCQkJCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXUxNiBjb25uZWN0ZWRUZGxzUGVlcnM7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCXVuc2lnbmVkIGxvbmcgZGVsYXk7CisJaW50IHJldDsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGlmIHRkbHMgaXMgbm90IGVuYWJsZWQsIHRoZW4gY29udGludWUgc2NhbiAqLworCWlmIChlVERMU19TVVBQT1JUX05PVF9FTkFCTEVEID09IHBIZGRDdHgtPnRkbHNfbW9kZSkKKwkJcmV0dXJuIDE7CisKKwljdXJyX3BlZXIgPSB3bGFuX2hkZF90ZGxzX2lzX3Byb2dyZXNzKHBIZGRDdHgsIE5VTEwsIDApOworCWlmIChOVUxMICE9IGN1cnJfcGVlcikgeworCQlpZiAocEhkZEN0eC0+dGRsc19zY2FuX2N0eHQucmVqZWN0KysgPj0gVERMU19NQVhfU0NBTl9SRUpFQ1QpIHsKKwkJCXBIZGRDdHgtPnRkbHNfc2Nhbl9jdHh0LnJlamVjdCA9IDA7CisJCQloZGRMb2coTE9HMSwKKwkJCQkgICIlczogIiBNQUNfQUREUkVTU19TVFIKKwkJCQkgICIuIHNjYW4gcmVqZWN0ZWQgJWQuIGZvcmNlIGl0IHRvIGlkbGUiLAorCQkJCSAgX19mdW5jX18sIE1BQ19BRERSX0FSUkFZKGN1cnJfcGVlci0+cGVlck1hYyksCisJCQkJICBwSGRkQ3R4LT50ZGxzX3NjYW5fY3R4dC5yZWplY3QpOworCisJCQl3bGFuX2hkZF90ZGxzX3NldF9wZWVyX2xpbmtfc3RhdHVzKGN1cnJfcGVlciwKKwkJCQkJCQkgICBlVERMU19MSU5LX0lETEUsCisJCQkJCQkJICAgZVRETFNfTElOS19VTlNQRUNJRklFRCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQloZGRMb2coTE9HVywKKwkJCSAgIiVzOiB0ZGxzIGluIHByb2dyZXNzLiBzY2FuIHJlamVjdGVkICVkIiwKKwkJCSAgX19mdW5jX18sIHBIZGRDdHgtPnRkbHNfc2Nhbl9jdHh0LnJlamVjdCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogdGRscyB0ZWFyZG93biBpcyBvbmdvaW5nICovCisJaWYgKGVURExTX1NVUFBPUlRfRElTQUJMRUQgPT0gcEhkZEN0eC0+dGRsc19tb2RlKSB7CisJCWNvbm5lY3RlZFRkbHNQZWVycyA9IHdsYW5faGRkX3RkbHNfY29ubmVjdGVkX3BlZXJzKHBBZGFwdGVyKTsKKwkJaWYgKGNvbm5lY3RlZFRkbHNQZWVycworCQkgICAgJiYgKHBIZGRDdHgtPnRkbHNfc2Nhbl9jdHh0LmF0dGVtcHQgPAorCQkJVERMU19NQVhfU0NBTl9TQ0hFRFVMRSkpIHsKKwkJCWRlbGF5ID0KKwkJCQkodW5zaWduZWQgbG9uZykoVERMU19ERUxBWV9TQ0FOX1BFUl9DT05ORUNUSU9OICoKKwkJCQkJCWNvbm5lY3RlZFRkbHNQZWVycyk7CisJCQloZGRMb2coTE9HMSwKKwkJCQkgICIlczogdGRscyBkaXNhYmxlZCwgYnV0IHN0aWxsIGNvbm5lY3RlZF9wZWVycyAlZCBhdHRlbXB0ICVkLiBzY2hlZHVsZSBzY2FuICVsdSBtc2VjIiwKKwkJCQkgIF9fZnVuY19fLCBjb25uZWN0ZWRUZGxzUGVlcnMsCisJCQkJICBwSGRkQ3R4LT50ZGxzX3NjYW5fY3R4dC5hdHRlbXB0LCBkZWxheSk7CisKKwkJCXdsYW5faGRkX3RkbHNfc2Nhbl9pbml0X3dvcmsocEhkZEN0eCwgd2lwaHksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCQkJCQkJICAgICBkZXYsCisjZW5kaWYKKwkJCQkJCSAgICAgcmVxdWVzdCwKKwkJCQkJCSAgICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOworCQkJLyogc2NhbiBzaG91bGQgbm90IGNvbnRpbnVlICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBubyBjb25uZWN0ZWQgcGVlciBvciBtYXggcmV0cnkgcmVhY2hlZCwgc2NhbiBjb250aW51ZSAqLworCQloZGRMb2coTE9HMSwKKwkJCSAgIiVzOiB0ZGxzIGRpc2FibGVkLiBjb25uZWN0ZWRfcGVlcnMgJWQgYXR0ZW1wdCAlZC4gc2NhbiBhbGxvd2VkIiwKKwkJCSAgX19mdW5jX18sIGNvbm5lY3RlZFRkbHNQZWVycywKKwkJCSAgcEhkZEN0eC0+dGRsc19zY2FuX2N0eHQuYXR0ZW1wdCk7CisJCXJldHVybiAxOworCX0KKwkvKiB3aGlsZSB0ZGxzIGlzIHVwLCBmaXJzdCB0aW1lIHNjYW4gKi8KKwllbHNlIGlmIChlVERMU19TVVBQT1JUX0VOQUJMRUQgPT0gcEhkZEN0eC0+dGRsc19tb2RlIHx8CisJCSBlVERMU19TVVBQT1JUX0VYUExJQ0lUX1RSSUdHRVJfT05MWSA9PSBwSGRkQ3R4LT50ZGxzX21vZGUpIHsKKwkJLyogZGlzYWJsZSBpbXBsaWNpdCB0cmlnZ2VyIGxvZ2ljICYgdGRscyBvcGVyYXRvaW4gKi8KKwkJd2xhbl9oZGRfdGRsc19zZXRfbW9kZShwSGRkQ3R4LCBlVERMU19TVVBQT1JUX0RJU0FCTEVELCBmYWxzZSk7CisJCS8qIGluZGljYXRlIHRoZSB0ZWFyZG93biBhbGwgY29ubmVjdGVkIHRvIHBlZXIgKi8KKwkJY29ubmVjdGVkVGRsc1BlZXJzID0gd2xhbl9oZGRfdGRsc19jb25uZWN0ZWRfcGVlcnMocEFkYXB0ZXIpOworCQlpZiAoY29ubmVjdGVkVGRsc1BlZXJzKSB7CisJCQl1aW50OF90IHN0YUlkeDsKKwkJCXVpbnQ4X3QgbnVtID0gMDsKKwkJCXVpbnQ4X3QgaTsKKwkJCWJvb2wgYWxsUGVlcnNCdWZTdGFzID0gMTsKKwkJCWhkZFRkbHNQZWVyX3QgKmN1cnJfcGVlcjsKKwkJCWhkZFRkbHNQZWVyX3QgKmNvbm5lY3RlZFBlZXJMaXN0W0hERF9NQVhfTlVNX1RETFNfU1RBXTsKKworCQkJLyogSWYgVERMU1NjYW4gaXMgZW5hYmxlZCB0aGVuIGFsbG93IHNjYW4gYW5kCisJCQkgKiBtYWludGFpbiB0ZGxzIGxpbmsgcmVnYXJkbGVzcyBpZiBwZWVyIGlzIGJ1ZmZlcgorCQkJICogc3RhIGNhcGFibGUgb3Igbm90IGFuZCBpZiBkZXZpY2UgaXMgc2xlZXAgc3RhCisJCQkgKiBjYXBhYmxlIG9yIG5vdC4gSWYgcGVlciBpcyBub3QgYnVmZmVyIHN0YQorCQkJICogY2FwYWJsZSwgdGhlbiBUeCB3b3VsZCBzdG9wIHdoZW4gZGV2aWNlCisJCQkgKiBpbml0aWF0ZXMgc2NhbiBhbmQgdGhlcmUgd2lsbCBiZSBsb3NzIG9mIFJ4CisJCQkgKiBwYWNrZXRzIHNpbmNlIHBlZXIgd291bGQgbm90IGtub3cgd2hlbiBkZXZpY2UKKwkJCSAqIG1vdmVzIGF3YXkgZnJvbSB0aGUgdGRscyBjaGFubmVsLgorCQkJICovCisJCQlpZiAoMSA9PSBwSGRkQ3R4LT5jb25maWctPmVuYWJsZV90ZGxzX3NjYW4pIHsKKwkJCQloZGRMb2coTE9HMSwgRkwoCisJCQkJICJURExTU2NhbiBlbmFibGVkLCBrZWVwIHRkbHMgbGluayBhbmQgYWxsb3cgc2NhbiwgY29ubmVjdGVkVGRsc1BlZXJzOiAlZCIpLAorCQkJCSBjb25uZWN0ZWRUZGxzUGVlcnMpOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQlmb3IgKHN0YUlkeCA9IDA7IHN0YUlkeCA8IHBIZGRDdHgtPm1heF9udW1fdGRsc19zdGE7CisJCQkgICAgIHN0YUlkeCsrKSB7CisJCQkJaWYgKHBIZGRDdHgtPnRkbHNDb25uSW5mb1tzdGFJZHhdLnN0YUlkKSB7CisJCQkJCWN1cnJfcGVlciA9CisJCQkJCQl3bGFuX2hkZF90ZGxzX2ZpbmRfYWxsX3BlZXIocEhkZEN0eCwKKwkJCQkJCQkJCSAgICBwSGRkQ3R4LT4KKwkJCQkJCQkJCSAgICB0ZGxzQ29ubkluZm8KKwkJCQkJCQkJCSAgICBbc3RhSWR4XS4KKwkJCQkJCQkJCSAgICBwZWVyTWFjLgorCQkJCQkJCQkJICAgIGJ5dGVzKTsKKwkJCQkJaWYgKGN1cnJfcGVlcikgeworCQkJCQkJY29ubmVjdGVkUGVlckxpc3RbbnVtKytdID0KKwkJCQkJCQljdXJyX3BlZXI7CisJCQkJCQlpZiAoIShjdXJyX3BlZXItPmlzQnVmU3RhKSkKKwkJCQkJCQlhbGxQZWVyc0J1ZlN0YXMgPSAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoKFRETFNfTUFYX0NPTk5FQ1RFRF9QRUVSU19UT19BTExPV19TQ0FOID09CisJCQkgICAgIGNvbm5lY3RlZFRkbHNQZWVycykgJiYKKwkJCSAgICAocEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU1NsZWVwU3RhKSAmJgorCQkJICAgIChhbGxQZWVyc0J1ZlN0YXMpKSB7CisJCQkJLyogQWxsIGNvbm5lY3RlZCBwZWVycyBidWZTdGFzIGFuZCB3ZSBjYW4gYmUgc2xlZXBTdGEKKwkJCQkgKiBzbyBhbGxvdyBzY2FuCisJCQkJICovCisJCQkJaGRkTG9nKExPRzEsCisJCQkJCSAgIiVzOiBBbGwgcGVlcnMgKG51bSAlZCkgYnVmU1RBcywgd2UgY2FuIGJlIHNsZWVwIHN0YSwgc28gYWxsb3cgc2NhbiwgdGRscyBtb2RlIGNoYW5nZWQgdG8gJWQiLAorCQkJCQkgIF9fZnVuY19fLCBjb25uZWN0ZWRUZGxzUGVlcnMsCisJCQkJCSAgcEhkZEN0eC0+dGRsc19tb2RlKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCQkJCWhkZExvZyhMT0cxLAorCQkJCQkJICAiJXM6IGluZGljYXRlIFRETFMgdGVhZG93biAoc3RhSWQgJWQpIiwKKwkJCQkJCSAgX19mdW5jX18sCisJCQkJCQkgIGNvbm5lY3RlZFBlZXJMaXN0W2ldLT5zdGFJZCk7CisKKwkJCQkJd2xhbl9oZGRfdGRsc19pbmRpY2F0ZV90ZWFyZG93bgorCQkJCQkJKGNvbm5lY3RlZFBlZXJMaXN0W2ldLT5wSGRkVGRsc0N0eC0+CisJCQkJCQlwQWRhcHRlciwgY29ubmVjdGVkUGVlckxpc3RbaV0sCisJCQkJCQllU0lSX01BQ19URExTX1RFQVJET1dOX1VOU1BFQ19SRUFTT04pOworCQkJCX0KKwkJCX0KKwkJCS8qIHNjaGVkdWxlIHNjYW4gKi8KKwkJCWRlbGF5ID0KKwkJCQkodW5zaWduZWQgbG9uZykoVERMU19ERUxBWV9TQ0FOX1BFUl9DT05ORUNUSU9OICoKKwkJCQkJCWNvbm5lY3RlZFRkbHNQZWVycyk7CisKKwkJCWhkZExvZyhMT0cxLAorCQkJCSAgIiVzOiB0ZGxzIGVuYWJsZWQgKG1vZGUgJWQpLCBjb25uZWN0ZWRfcGVlcnMgJWQuIHNjaGVkdWxlIHNjYW4gJWx1IG1zZWMiLAorCQkJCSAgX19mdW5jX18sIHBIZGRDdHgtPnRkbHNfbW9kZSwKKwkJCQkgIHdsYW5faGRkX3RkbHNfY29ubmVjdGVkX3BlZXJzKHBBZGFwdGVyKSwgZGVsYXkpOworCisJCQl3bGFuX2hkZF90ZGxzX3NjYW5faW5pdF93b3JrKHBIZGRDdHgsIHdpcGh5LAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA2LCAwKSkKKwkJCQkJCSAgICAgZGV2LAorI2VuZGlmCisJCQkJCQkgICAgIHJlcXVlc3QsCisJCQkJCQkgICAgIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKKwkJCS8qIHNjYW4gc2hvdWxkIG5vdCBjb250aW51ZSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogbm8gY29ubmVjdGVkIHBlZXIsIHNjYW4gY29udGludWUgKi8KKwkJaGRkTG9nKExPRzEsCisJCQkgICIlczogdGRsc19tb2RlICVkLCBhbmQgbm8gdGRscyBjb25uZWN0aW9uLiBzY2FuIGFsbG93ZWQiLAorCQkJICBfX2Z1bmNfXywgcEhkZEN0eC0+dGRsc19tb2RlKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19zY2FuX2RvbmVfY2FsbGJhY2soKSAtIGNhbGxiYWNrIGZvciB0ZGxzIHNjYW4gZG9uZSBldmVudAorICogQHBBZGFwdGVyOiBIREQgYWRhcHRlcgorICoKKyAqIFJldHVybjogVm9pZAorICovCit2b2lkIHdsYW5faGRkX3RkbHNfc2Nhbl9kb25lX2NhbGxiYWNrKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCWlmICgwICE9ICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInBIZGRDdHggaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm47CisJfQorCisJLyogZnJlZSBhbGxvY2F0ZWQgbWVtb3J5IGF0IHNjYW4gdGltZSAqLworCXdsYW5faGRkX3RkbHNfZnJlZV9zY2FuX3JlcXVlc3QoJnBIZGRDdHgtPnRkbHNfc2Nhbl9jdHh0KTsKKworCS8qIGlmIHRkbHMgd2FzIGVuYWJsZWQgYmVmb3JlIHNjYW4sIHJlLWVuYWJsZSB0ZGxzIG1vZGUgKi8KKwlpZiAoZVRETFNfU1VQUE9SVF9FTkFCTEVEID09IHBIZGRDdHgtPnRkbHNfbW9kZV9sYXN0IHx8CisJICAgIGVURExTX1NVUFBPUlRfRVhQTElDSVRfVFJJR0dFUl9PTkxZID09IHBIZGRDdHgtPnRkbHNfbW9kZV9sYXN0KSB7CisJCWhkZExvZyhMT0cxLAorCQkJICAoIiVzOiByZXZlcnQgdGRscyBtb2RlICVkIiksIF9fZnVuY19fLAorCQkJICBwSGRkQ3R4LT50ZGxzX21vZGVfbGFzdCk7CisKKwkJd2xhbl9oZGRfdGRsc19zZXRfbW9kZShwSGRkQ3R4LCBwSGRkQ3R4LT50ZGxzX21vZGVfbGFzdCwgZmFsc2UpOworCX0KK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX3RpbWVyX3Jlc3RhcnQoKSAtIHJlc3RhcnQgVERMUyB0aW1lcgorICogQHBBZGFwdGVyOiBIREQgYWRhcHRlcgorICogQHRpbWVyOiB0aW1lciB0byByZXN0YXJ0CisgKiBAZXhwaXJhdGlvblRpbWU6IG5ldyBleHBpcmF0aW9uIHRpbWUgdG8gc2V0IGZvciB0aGUgdGltZXIKKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX3RpbWVyX3Jlc3RhcnQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJIGNkZl9tY190aW1lcl90ICp0aW1lciwKKwkJCQkgdWludDMyX3QgZXhwaXJhdGlvblRpbWUpCit7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworCS8qIENoZWNrIHdoZXRoZXIgZHJpdmVyIGxvYWQgdW5sb2FkIGlzIGluIHByb2dyZXNzICovCisJaWYgKGNkc19pc19sb2FkX3VubG9hZF9pbl9wcm9ncmVzcygpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiRHJpdmVyIGxvYWQvdW5sb2FkIGlzIGluIHByb2dyZXNzLiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChoZGRfY29ubl9pc19jb25uZWN0ZWQocEhkZFN0YUN0eCkpIHsKKwkJY2RmX21jX3RpbWVyX3N0b3AodGltZXIpOworCQljZGZfbWNfdGltZXJfc3RhcnQodGltZXIsIGV4cGlyYXRpb25UaW1lKTsKKwl9Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19pbmRpY2F0ZV90ZWFyZG93bigpIC0gaW5kaWNhdGUgdGRscyB0ZWFyZG93bgorICogQHBBZGFwdGVyOiBIREQgYWRhcHRlcgorICogQGN1cnJfcGVlcjogcGVlciB0ZGxzIHRlYXJkb3duIGhhcHBlbmVkCisgKiBAcmVhc29uOiB0ZWFyZG93biByZWFzb24KKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX2luZGljYXRlX3RlYXJkb3duKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgICAgaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyLCB1aW50MTZfdCByZWFzb24pCit7CisJaWYgKE5VTEwgPT0gcEFkYXB0ZXIgfHwgTlVMTCA9PSBjdXJyX3BlZXIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJwYXJhbWV0ZXJzIHBhc3NlZCBhcmUgaW52YWxpZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChlVERMU19MSU5LX0NPTk5FQ1RFRCAhPSBjdXJyX3BlZXItPmxpbmtfc3RhdHVzKQorCQlyZXR1cm47CisKKwl3bGFuX2hkZF90ZGxzX3NldF9wZWVyX2xpbmtfc3RhdHVzKGN1cnJfcGVlciwKKwkJCQkJICAgZVRETFNfTElOS19URUFSSU5HLAorCQkJCQkgICBlVERMU19MSU5LX1VOU1BFQ0lGSUVEKTsKKwljZmc4MDIxMV90ZGxzX29wZXJfcmVxdWVzdChwQWRhcHRlci0+ZGV2LAorCQkJCSAgIGN1cnJfcGVlci0+cGVlck1hYywKKwkJCQkgICBOTDgwMjExX1RETFNfVEVBUkRPV04sIHJlYXNvbiwgR0ZQX0tFUk5FTCk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfc2V0X2NhbGxiYWNrKCkgLSBzZXQgc3RhdGUgY2hhbmdlIGNhbGxiYWNrIG9uIGN1cnJlbnQgVERMUyBwZWVyCisgKiBAY3Vycl9wZWVyOiBjdXJyZW50IFRETFMgcGVlcgorICogQGNhbGxiYWNrOiBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2sKKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlCisgKi8KK2ludCB3bGFuX2hkZF9zZXRfY2FsbGJhY2soaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyLAorCQkJICBjZmc4MDIxMV9leHR0ZGxzX2NhbGxiYWNrIGNhbGxiYWNrKQoreworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJaWYgKCFjdXJyX3BlZXIpCisJCXJldHVybiAtRUlOVkFMOworCXBBZGFwdGVyID0gY3Vycl9wZWVyLT5wSGRkVGRsc0N0eC0+cEFkYXB0ZXI7CisJcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCWlmICgoTlVMTCA9PSBwSGRkQ3R4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmcEhkZEN0eC0+dGRsc19sb2NrKTsKKwljdXJyX3BlZXItPnN0YXRlX2NoYW5nZV9ub3RpZmljYXRpb24gPSBjYWxsYmFjazsKKwltdXRleF91bmxvY2soJnBIZGRDdHgtPnRkbHNfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19nZXRfd2lmaV9oYWxfc3RhdGUoKSAtIGdldCB0ZGxzIHdpZmkgaGFsIHN0YXRlIG9uIGN1cnJlbnQgcGVlcgorICogQGN1cnJfcGVlcjogY3VycmVudCBURExTIHBlZXIKKyAqIEBzdGF0ZTogb3V0cHV0IHBhcmFtZXRlciB0byBzdG9yZSB0aGUgdGRscyB3aWZpIGhhbCBzdGF0ZQorICogQHJlYXNvbjogb3V0cHV0IHBhcmFtZXRlciB0byBzdG9yZSB0aGUgcmVhc29uIG9mIHRoZSBjdXJyZW50IHBlZXIKKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLwordm9pZCB3bGFuX2hkZF90ZGxzX2dldF93aWZpX2hhbF9zdGF0ZShoZGRUZGxzUGVlcl90ICpjdXJyX3BlZXIsCisJCQkJICAgICAgaW50MzJfdCAqc3RhdGUsIGludDMyX3QgKnJlYXNvbikKK3sKKwkqcmVhc29uID0gY3Vycl9wZWVyLT5yZWFzb247CisJc3dpdGNoIChjdXJyX3BlZXItPmxpbmtfc3RhdHVzKSB7CisJY2FzZSBlVERMU19MSU5LX0lETEU6CisJY2FzZSBlVERMU19MSU5LX0RJU0NPVkVSRUQ6CisJCSpzdGF0ZSA9IFFDQV9XSUZJX0hBTF9URExTX0VOQUJMRUQ7CisJCWJyZWFrOworCWNhc2UgZVRETFNfTElOS19ESVNDT1ZFUklORzoKKwljYXNlIGVURExTX0xJTktfQ09OTkVDVElORzoKKwkJKnN0YXRlID0gUUNBX1dJRklfSEFMX1RETFNfRU5BQkxFRDsKKwkJYnJlYWs7CisJY2FzZSBlVERMU19MSU5LX0NPTk5FQ1RFRDoKKwkJKnN0YXRlID0gUUNBX1dJRklfSEFMX1RETFNfRVNUQUJMSVNIRUQ7CisJCWJyZWFrOworCWNhc2UgZVRETFNfTElOS19URUFSSU5HOgorCQkqc3RhdGUgPSBRQ0FfV0lGSV9IQUxfVERMU19EUk9QUEVEOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19nZXRfc3RhdHVzKCkgLSBnZXQgdGRscyBzdGF0dXMgb24gY3VycmVudCB0ZGxzIHBlZXIKKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqIEBtYWM6IE1BQyBhZGRyZXNzIG9mIGN1cnJlbnQgVERMUyBwZWVyCisgKiBAc3RhdGU6IG91dHB1dCBwYXJhbWV0ZXIgdG8gc3RvcmUgdGhlIHRkbHMgd2lmaSBoYWwgc3RhdGUKKyAqIEByZWFzb246IG91dHB1dCBwYXJhbWV0ZXIgdG8gc3RvcmUgdGhlIHJlYXNvbiBvZiB0aGUgY3VycmVudCBwZWVyCisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitpbnQgd2xhbl9oZGRfdGRsc19nZXRfc3RhdHVzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJICAgICBjb25zdCB1aW50OF90ICptYWMsIGludDMyX3QgKnN0YXRlLAorCQkJICAgICBpbnQzMl90ICpyZWFzb24pCit7CisJaGRkVGRsc1BlZXJfdCAqY3Vycl9wZWVyOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCWN1cnJfcGVlciA9IHdsYW5faGRkX3RkbHNfZmluZF9wZWVyKHBBZGFwdGVyLCBtYWMsIHRydWUpOworCWlmIChjdXJyX3BlZXIgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImN1cnJfcGVlciBpcyBOVUxMIikpOworCQkqc3RhdGUgPSBRQ0FfV0lGSV9IQUxfVERMU19ESVNBQkxFRDsKKwkJKnJlYXNvbiA9IGVURExTX0xJTktfVU5TUEVDSUZJRUQ7CisJfSBlbHNlIHsKKwkJaWYgKHBIZGRDdHgtPmNvbmZpZy0+ZlRETFNFeHRlcm5hbENvbnRyb2wgJiYKKwkJCShmYWxzZSA9PSBjdXJyX3BlZXItPmlzRm9yY2VkUGVlcikpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQlGTCgiY3Vycl9wZWVyIGlzIG5vdCBGb3JjZWQiKSk7CisJCQkqc3RhdGUgPSBRQ0FfV0lGSV9IQUxfVERMU19ESVNBQkxFRDsKKwkJCSpyZWFzb24gPSBlVERMU19MSU5LX1VOU1BFQ0lGSUVEOworCQl9IGVsc2UgeworCQkJd2xhbl9oZGRfdGRsc19nZXRfd2lmaV9oYWxfc3RhdGUoY3Vycl9wZWVyLAorCQkJCQkJCQlzdGF0ZSwgcmVhc29uKTsKKwkJfQorCX0KKworCXdsYW5faGRkX3RkbHNfZ2V0X3dpZmlfaGFsX3N0YXRlKGN1cnJfcGVlciwgc3RhdGUsIHJlYXNvbik7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5CisJd2xhbl9oZGRfdGRsc19jb25maWdfZW5hYmxlX3BvbGljeVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0VOQUJMRV9NQVggKworCQkJCQkgICAxXSA9IHsKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfTUFDX0FERFJdID0gey50eXBlID0gTkxBX1VOU1BFQ30sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRU5BQkxFX0NIQU5ORUxdID0gey50eXBlID0gTkxBX1MzMn0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRU5BQkxFX0dMT0JBTF9PUEVSQVRJTkdfQ0xBU1NdID0gey50eXBlID0KKwkJCQkJCQkJTkxBX1MzMn0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRU5BQkxFX01BWF9MQVRFTkNZX01TXSA9IHsudHlwZSA9IE5MQV9TMzJ9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0VOQUJMRV9NSU5fQkFORFdJRFRIX0tCUFNdID0gey50eXBlID0KKwkJCQkJCQkJTkxBX1MzMn0sCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5CisJd2xhbl9oZGRfdGRsc19jb25maWdfZGlzYWJsZV9wb2xpY3lbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19ESVNBQkxFX01BWCArCisJCQkJCSAgICAxXSA9IHsKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19ESVNBQkxFX01BQ19BRERSXSA9IHsudHlwZSA9IE5MQV9VTlNQRUN9LAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeQorCXdsYW5faGRkX3RkbHNfY29uZmlnX3N0YXRlX2NoYW5nZV9wb2xpY3lbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9NQVgKKwkJCQkJCSArIDFdID0geworCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX1NUQVRFX01BQ19BRERSXSA9IHsudHlwZSA9IE5MQV9VTlNQRUN9LAorCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX05FV19TVEFURV0gPSB7LnR5cGUgPSBOTEFfVTMyfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9SRUFTT05dID0gey50eXBlID0gTkxBX1MzMn0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfU1RBVEVfQ0hBTk5FTF0gPSB7LnR5cGUgPSBOTEFfVTMyfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9HTE9CQUxfT1BFUkFUSU5HX0NMQVNTXSA9IHsudHlwZSA9CisJCQkJCQkJCU5MQV9VMzJ9LAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeQorCXdsYW5faGRkX3RkbHNfY29uZmlnX2dldF9zdGF0dXNfcG9saWN5CitbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfU1RBVFVTX01BWCArIDFdID0geworCVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9TVEFUVVNfTUFDX0FERFJdID0gey50eXBlID0gTkxBX1VOU1BFQ30sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19TVEFURV0gPSB7LnR5cGUgPSBOTEFfVTMyfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfU1RBVFVTX1JFQVNPTl0gPSB7LnR5cGUgPSBOTEFfUzMyfSwKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfU1RBVFVTX0NIQU5ORUxdID0gey50eXBlID0gTkxBX1UzMn0sCisJW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19HTE9CQUxfT1BFUkFUSU5HX0NMQVNTXSA9IHsKKwkJCQkJCQkudHlwZSA9IE5MQV9VMzJ9LAorfTsKKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHRkbHNfZ2V0X3N0YXR1cygpIC0gaGFuZGxlIGdldCBzdGF0dXMgY2ZnODAyMTEgY29tbWFuZAorICogQHdpcGh5OiB3aXBoeQorICogQHdkZXY6IHdpcmVsZXNzIGRldgorICogQGRhdGE6IG5ldGxpbmsgYnVmZmVyIHdpdGggdGhlIG1hYyBhZGRyZXNzIG9mIHRoZSBwZWVyIHRvIGdldCB0aGUgc3RhdHVzIGZvcgorICogQGRhdGFfbGVuOiBsZW5ndGggb2YgZGF0YSBpbiBieXRlcworICovCitzdGF0aWMgaW50CitfX3dsYW5faGRkX2NmZzgwMjExX2V4dHRkbHNfZ2V0X3N0YXR1cyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSBpbnQgZGF0YV9sZW4pCit7CisJdWludDhfdCBwZWVyW0VUSF9BTEVOXSA9IHsgMCB9OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfU1RBVFVTX01BWCArIDFdOworCUNERl9TVEFUVVMgcmV0OworCXVpbnQzMl90IHN0YXRlOworCWludDMyX3QgcmVhc29uOworCXVpbnQzMl90IGdsb2JhbF9vcGVyYXRpbmdfY2xhc3MgPSAwOworCXVpbnQzMl90IGNoYW5uZWwgPSAwOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocEhkZEN0eC0+Y29uZmlnLT5mVERMU0V4dGVybmFsQ29udHJvbCA9PSBmYWxzZSkgeworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKwlpZiAobmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0dFVF9TVEFUVVNfTUFYLAorCQkgICAgICBkYXRhLCBkYXRhX2xlbiwgd2xhbl9oZGRfdGRsc19jb25maWdfZ2V0X3N0YXR1c19wb2xpY3kpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJJbnZhbGlkIGF0dHJpYnV0ZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfU1RBVFVTX01BQ19BRERSXSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiYXR0ciBtYWMgYWRkciBmYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltZW1jcHkocGVlciwKKwkgICAgICAgbmxhX2RhdGEodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfU1RBVFVTX01BQ19BRERSXSksCisJICAgICAgIHNpemVvZihwZWVyKSk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCBGTChNQUNfQUREUkVTU19TVFIpLCBNQUNfQUREUl9BUlJBWShwZWVyKSk7CisJcmV0ID0gd2xhbl9oZGRfdGRsc19nZXRfc3RhdHVzKHBBZGFwdGVyLCBwZWVyLCAmc3RhdGUsICZyZWFzb24pOworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiZ2V0IHN0YXR1cyBGYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlza2IgPSBjZmc4MDIxMV92ZW5kb3JfY21kX2FsbG9jX3JlcGx5X3NrYih3aXBoeSwKKwkJCQkJCSAgNCAqIHNpemVvZihpbnQzMl90KSArCisJCQkJCQkgIE5MTVNHX0hEUkxFTik7CisJaWYgKCFza2IpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJjZmc4MDIxMV92ZW5kb3JfY21kX2FsbG9jX3JlcGx5X3NrYiBmYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sIEZMKCJSZWFzb24gJWQgU3RhdHVzICVkIGNsYXNzICVkIGNoYW5uZWwgJWQgcGVlciAiIE1BQ19BRERSRVNTX1NUUiksCisJCXJlYXNvbiwgc3RhdGUsIGdsb2JhbF9vcGVyYXRpbmdfY2xhc3MsIGNoYW5uZWwsCisJCU1BQ19BRERSX0FSUkFZKHBlZXIpKTsKKwlpZiAobmxhX3B1dF91MzIoc2tiLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfU1RBVFVTX1NUQVRFLAorCQkJc3RhdGUpIHx8CisJCW5sYV9wdXRfczMyKHNrYiwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19SRUFTT04sCisJCQlyZWFzb24pIHx8CisJCW5sYV9wdXRfdTMyKHNrYiwKKwkJCVFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfR0VUX1NUQVRVU19HTE9CQUxfT1BFUkFUSU5HX0NMQVNTLAorCQkJZ2xvYmFsX29wZXJhdGluZ19jbGFzcykgfHwKKwkJbmxhX3B1dF91MzIoc2tiLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19HRVRfU1RBVFVTX0NIQU5ORUwsCisJCQljaGFubmVsKSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgibmxhIHB1dCBmYWlsIikpOworCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CisJcmV0dXJuIGNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkoc2tiKTsKK25sYV9wdXRfZmFpbHVyZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2dldF9zdGF0dXMoKSAtIGdldCBleHQgdGRscyBzdGF0dXMKKyAqIEB3aXBoeTogICBwb2ludGVyIHRvIHdpcmVsZXNzIHdpcGh5IHN0cnVjdHVyZS4KKyAqIEB3ZGV2OiAgICBwb2ludGVyIHRvIHdpcmVsZXNzX2RldiBzdHJ1Y3R1cmUuCisgKiBAZGF0YTogICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBwYXNzZWQgdmlhIHZlbmRvciBpbnRlcmZhY2UKKyAqIEBkYXRhX2xlbjpMZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgcGFzc2VkCisgKgorICogUmV0dXJuOiAgIFJldHVybiB0aGUgU3VjY2VzcyBvciBGYWlsdXJlIGNvZGUuCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2dldF9zdGF0dXMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJaW50IGRhdGFfbGVuKQoreworCWludCByZXQgPSAwOworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHRkbHNfZ2V0X3N0YXR1cyh3aXBoeSwgd2RldiwgZGF0YSwKKwkJCQkJCQlkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2NhbGxiYWNrKCkgLSBub3RpZnkgY2ZnODAyMTEgc3RhdGUgY2hhbmdlCisgKiBAbWFjOiBNQUMgYWRkcmVzcyBvZiB0aGUgcGVlciB3aXRoIHN0YXRlIGNoYW5nZQorICogQHN0YXRlOiBOZXcgc3RhdGUKKyAqIEByZWFzb246IFJlYXNvbiB0byBlbnRlciBuZXcgc3RhdGUKKyAqIEBjdHg6IEhERCBhZGFwdGVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2NhbGxiYWNrKGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQkJICAgICAgdWludDMyX3Qgc3RhdGUsCisJCQkJCSAgICAgIGludDMyX3QgcmVhc29uLCB2b2lkICpjdHgpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCAqKSBjdHg7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXVpbnQzMl90IGdsb2JhbF9vcGVyYXRpbmdfY2xhc3MgPSAwOworCXVpbnQzMl90IGNoYW5uZWwgPSAwOworCWlmICh3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KHBIZGRDdHgpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQgIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHBIZGRDdHgtPmNvbmZpZy0+ZlRETFNFeHRlcm5hbENvbnRyb2wgPT0gZmFsc2UpIHsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisJc2tiID0gY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jKHBIZGRDdHgtPndpcGh5LAorCQkJCQkgIE5VTEwsCisJCQkJCSAgRVhUVERMU19FVkVOVF9CVUZfU0laRSArIE5MTVNHX0hEUkxFTiwKKwkJCQkJICBRQ0FfTkw4MDIxMV9WRU5ET1JfU1VCQ01EX1RETFNfU1RBVEVfQ0hBTkdFX0lOREVYLAorCQkJCQkgIEdGUF9LRVJORUwpOworCWlmICghc2tiKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICBGTCgiY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgRkwoIlJlYXNvbjogJWQgU3RhdHVzOiAlZCBDbGFzczogJWQgQ2hhbm5lbDogJWQgdGRscyBwZWVyICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJcmVhc29uLCBzdGF0ZSwgZ2xvYmFsX29wZXJhdGluZ19jbGFzcywgY2hhbm5lbCwKKwkJTUFDX0FERFJfQVJSQVkobWFjKSk7CisJaWYgKG5sYV9wdXQoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX1NUQVRFX01BQ19BRERSLAorCQlDREZfTUFDX0FERFJfU0laRSwgbWFjKSB8fAorCQlubGFfcHV0X3UzMihza2IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfTkVXX1NUQVRFLAorCQkJc3RhdGUpIHx8CisJCW5sYV9wdXRfczMyKHNrYiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9SRUFTT04sCisJCQlyZWFzb24pIHx8CisJCW5sYV9wdXRfdTMyKHNrYiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9DSEFOTkVMLAorCQkJY2hhbm5lbCkgfHwKKwkJbmxhX3B1dF91MzIoc2tiLAorCQkJUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19TVEFURV9HTE9CQUxfT1BFUkFUSU5HX0NMQVNTLAorCQkJZ2xvYmFsX29wZXJhdGluZ19jbGFzcykpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIm5sYSBwdXQgZmFpbCIpKTsKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQorCWNmZzgwMjExX3ZlbmRvcl9ldmVudChza2IsIEdGUF9LRVJORUwpOworCXJldHVybiAwOworbmxhX3B1dF9mYWlsdXJlOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfZXh0dGRsc19lbmFibGUoKSAtIGVuYWJsZSBhbiBleHRlcm5hbGx5IGNvbnRyb2xsYWJsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRETFMgcGVlciBhbmQgc2V0IHBhcmFtZXRlcnMKKyAqIHdpcGh5OiB3aXBoeQorICogQHdkZXY6IHdpcmVsZXNzIGRldiBwb2ludGVyCisgKiBAZGF0YTogbmV0bGluayBidWZmZXIgd2l0aCBwZWVyIE1BQyBhZGRyZXNzIGFuZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqIEBkYXRhX2xlbjogc2l6ZSBvZiBkYXRhIGluIGJ5dGVzCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIGNoYW5uZWwsIG9wZXJhdGlvbiBjbGFzcywgbWF4aW11bSBsYXRlbmN5IGFuZCBtaW5pbWFsCisgKiBiYW5kd2lkdGggcGFyYW1ldGVycyBvbiBhIFRETFMgcGVlciB0aGF0J3MgZXh0ZXJuYWxseSBjb250cm9sbGFibGUuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludAorX193bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2VuYWJsZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICBpbnQgZGF0YV9sZW4pCit7CisJdWludDhfdCBwZWVyW0VUSF9BTEVOXSA9IHsgMCB9OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LT5uZXRkZXY7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfTUFYICsgMV07CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdGRsc19yZXFfcGFyYW1zX3QgcFJlcU1zZyA9IHsgMCB9OworCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkX2VycigiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocEhkZEN0eC0+Y29uZmlnLT5mVERMU0V4dGVybmFsQ29udHJvbCA9PSBmYWxzZSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIlRETFMgRXh0ZXJuYWwgQ29udHJvbCBpcyBub3QgZW5hYmxlZCIpKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisJaWYgKG5sYV9wYXJzZSh0YiwgUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfTUFYLAorCQkgICAgICBkYXRhLCBkYXRhX2xlbiwgd2xhbl9oZGRfdGRsc19jb25maWdfZW5hYmxlX3BvbGljeSkpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfTUFDX0FERFJdKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJhdHRyIG1hYyBhZGRyIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbWNweShwZWVyLCBubGFfZGF0YSh0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0VOQUJMRV9NQUNfQUREUl0pLAorCSAgICAgICBzaXplb2YocGVlcikpOworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgRkwoTUFDX0FERFJFU1NfU1RSKSwgTUFDX0FERFJfQVJSQVkocGVlcikpOworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfQ0hBTk5FTF0pIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoImF0dHIgY2hhbm5lbCBmYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwUmVxTXNnLmNoYW5uZWwgPQorCQlubGFfZ2V0X3MzMih0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0VOQUJMRV9DSEFOTkVMXSk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCBGTCgiQ2hhbm5lbCBOdW0gKCVkKSIpLCBwUmVxTXNnLmNoYW5uZWwpOworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfR0xPQkFMX09QRVJBVElOR19DTEFTU10pIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJhdHRyIG9wZXJhdGluZyBjbGFzcyBmYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwUmVxTXNnLmdsb2JhbF9vcGVyYXRpbmdfY2xhc3MgPQorCQlubGFfZ2V0X3MzMih0YgorCQkJICAgIFtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0VOQUJMRV9HTE9CQUxfT1BFUkFUSU5HX0NMQVNTXSk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCBGTCgiT3BlcmF0aW5nIGNsYXNzICglZCkiKSwKKwkgICAgICAgcFJlcU1zZy5nbG9iYWxfb3BlcmF0aW5nX2NsYXNzKTsKKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRU5BQkxFX01BWF9MQVRFTkNZX01TXSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiYXR0ciBsYXRlbmN5IGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBSZXFNc2cubWF4X2xhdGVuY3lfbXMgPQorCQlubGFfZ2V0X3MzMih0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0VOQUJMRV9NQVhfTEFURU5DWV9NU10pOworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgRkwoIkxhdGVuY3kgKCVkKSIpLAorCSAgICAgICBwUmVxTXNnLm1heF9sYXRlbmN5X21zKTsKKwlpZiAoIXRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRU5BQkxFX01JTl9CQU5EV0lEVEhfS0JQU10pIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoImF0dHIgYmFuZHdpZHRoIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBSZXFNc2cubWluX2JhbmR3aWR0aF9rYnBzID0KKwkJbmxhX2dldF9zMzIodGIKKwkJCSAgICBbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19FTkFCTEVfTUlOX0JBTkRXSURUSF9LQlBTXSk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCBGTCgiQmFuZHdpZHRoICglZCkiKSwKKwkgICAgICAgcFJlcU1zZy5taW5fYmFuZHdpZHRoX2ticHMpOworCXJldHVybiB3bGFuX2hkZF90ZGxzX2V4dGN0cmxfY29uZmlnX3BlZXIoCisJCQkJCXBBZGFwdGVyLAorCQkJCQlwZWVyLAorCQkJCQl3bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2NhbGxiYWNrLAorCQkJCQlwUmVxTXNnLmNoYW5uZWwsCisJCQkJCXBSZXFNc2cubWF4X2xhdGVuY3lfbXMsCisJCQkJCXBSZXFNc2cuCisJCQkJCWdsb2JhbF9vcGVyYXRpbmdfY2xhc3MsCisJCQkJCXBSZXFNc2cubWluX2JhbmR3aWR0aF9rYnBzKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2VuYWJsZSgpIC0gZW5hYmxlIGV4dCB0ZGxzCisgKiBAd2lwaHk6ICAgcG9pbnRlciB0byB3aXJlbGVzcyB3aXBoeSBzdHJ1Y3R1cmUuCisgKiBAd2RldjogICAgcG9pbnRlciB0byB3aXJlbGVzc19kZXYgc3RydWN0dXJlLgorICogQGRhdGE6ICAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgcGFzc2VkIHZpYSB2ZW5kb3IgaW50ZXJmYWNlCisgKiBAZGF0YV9sZW46TGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHBhc3NlZAorICoKKyAqIFJldHVybjogICBSZXR1cm4gdGhlIFN1Y2Nlc3Mgb3IgRmFpbHVyZSBjb2RlLgorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZXh0dGRsc19lbmFibGUoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJaW50IGRhdGFfbGVuKQoreworCWludCByZXQgPSAwOworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHRkbHNfZW5hYmxlKHdpcGh5LCB3ZGV2LCBkYXRhLCBkYXRhX2xlbik7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHRkbHNfZGlzYWJsZSgpIC0gZGlzYWJsZSBhbiBleHRlcm5hbGx5IGNvbnRyb2xsYWJsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURExTIHBlZXIKKyAqIHdpcGh5OiB3aXBoeQorICogQHdkZXY6IHdpcmVsZXNzIGRldiBwb2ludGVyCisgKiBAZGF0YTogbmV0bGluayBidWZmZXIgd2l0aCBwZWVyIE1BQyBhZGRyZXNzCisgKiBAZGF0YV9sZW46IHNpemUgb2YgZGF0YSBpbiBieXRlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgYW4gZXh0ZXJuYWxseSBjb250cm9sbGFibGUgVERMUyBwZWVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHRkbHNfZGlzYWJsZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgICBpbnQgZGF0YV9sZW4pCit7CisJdTggcGVlcltFVEhfQUxFTl0gPSB7MH07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtPm5ldGRldjsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URExTX0RJU0FCTEVfTUFYICsgMV07CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlpZiAoQ0RGX0ZUTV9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkgeworCQloZGRfZXJyKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJc3RhdHVzID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChwSGRkQ3R4LT5jb25maWctPmZURExTRXh0ZXJuYWxDb250cm9sID09IGZhbHNlKSB7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCWlmIChubGFfcGFyc2UodGIsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RETFNfRElTQUJMRV9NQVgsCisJCSAgICAgIGRhdGEsIGRhdGFfbGVuLCB3bGFuX2hkZF90ZGxzX2NvbmZpZ19kaXNhYmxlX3BvbGljeSkpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkludmFsaWQgQVRUUiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19ESVNBQkxFX01BQ19BRERSXSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiYXR0ciBtYWMgYWRkciBmYWlsZWQiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltZW1jcHkocGVlciwgbmxhX2RhdGEodGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfVERMU19ESVNBQkxFX01BQ19BRERSXSksCisJICAgICAgIHNpemVvZihwZWVyKSk7CisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCBGTChNQUNfQUREUkVTU19TVFIpLCBNQUNfQUREUl9BUlJBWShwZWVyKSk7CisJcmV0dXJuIHdsYW5faGRkX3RkbHNfZXh0Y3RybF9kZWNvbmZpZ19wZWVyKHBBZGFwdGVyLCBwZWVyKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2Rpc2FibGUoKSAtIGRpc2FibGUgZXh0IHRkbHMKKyAqIEB3aXBoeTogICBwb2ludGVyIHRvIHdpcmVsZXNzIHdpcGh5IHN0cnVjdHVyZS4KKyAqIEB3ZGV2OiAgICBwb2ludGVyIHRvIHdpcmVsZXNzX2RldiBzdHJ1Y3R1cmUuCisgKiBAZGF0YTogICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBwYXNzZWQgdmlhIHZlbmRvciBpbnRlcmZhY2UKKyAqIEBkYXRhX2xlbjpMZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgcGFzc2VkCisgKgorICogUmV0dXJuOiAgIFJldHVybiB0aGUgU3VjY2VzcyBvciBGYWlsdXJlIGNvZGUuCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9leHR0ZGxzX2Rpc2FibGUoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkJY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJaW50IGRhdGFfbGVuKQoreworCWludCByZXQgPSAwOworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX2V4dHRkbHNfZGlzYWJsZSh3aXBoeSwgd2RldiwgZGF0YSwgZGF0YV9sZW4pOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfdGRsc19hZGRfc3RhdGlvbigpIC0gYWRkIG9yIGNoYW5nZSBhIFRETFMgcGVlciBzdGF0aW9uCisgKiBAd2lwaHk6IHdpcGh5CisgKiBAZGV2OiBuZXQgZGV2aWNlCisgKiBAbWFjOiBNQUMgYWRkcmVzcyBvZiB0aGUgVERMUyBwZWVyCisgKiBAdXBkYXRlOiBpZiBub24tMCwgbW9kaWZ5IHRoZSBwZWVyIHdpdGggU3RhUGFyYW1zOyBpZiAwLCBhZGQgbmV3IHBlZXIKKyAqIEBTdGFQYXJhbXM6IHN0YXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIFRETFMgdG8gY2hhbmdlCisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitpbnQgd2xhbl9oZGRfdGRsc19hZGRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdWludDhfdCAqbWFjLAorCQkJICAgICAgYm9vbCB1cGRhdGUsIHRDc3JTdGFQYXJhbXMgKlN0YVBhcmFtcykKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRUZGxzUGVlcl90ICpwVGRsc1BlZXI7CisJdWludDE2X3QgbnVtQ3VyclRkbHNQZWVyczsKKwl1bnNpZ25lZCBsb25nIHJjOworCWxvbmcgcmV0OworCisJRU5URVIoKTsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJIREQgY29udGV4dCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKChlVERMU19TVVBQT1JUX05PVF9FTkFCTEVEID09IHBIZGRDdHgtPnRkbHNfbW9kZSkgfHwKKwkgICAgKGVURExTX1NVUFBPUlRfRElTQUJMRUQgPT0gcEhkZEN0eC0+dGRsc19tb2RlKSkgeworCQloZGRMb2coTE9HMSwKKwkJCSAgIiVzOiBURExTIG1vZGUgaXMgZGlzYWJsZWQgT1Igbm90IGVuYWJsZWQgaW4gRlcuIgorCQkJICBNQUNfQUREUkVTU19TVFIgIiBSZXF1ZXN0IGRlY2xpbmVkLiIsCisJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWShtYWMpKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlwVGRsc1BlZXIgPSB3bGFuX2hkZF90ZGxzX2dldF9wZWVyKHBBZGFwdGVyLCBtYWMpOworCisJaWYgKE5VTEwgPT0gcFRkbHNQZWVyKSB7CisJCWhkZExvZyhMT0dFLAorCQkJICAiJXM6ICIgTUFDX0FERFJFU1NfU1RSCisJCQkgICIgKHVwZGF0ZSAlZCkgbm90IGV4aXN0LiByZXR1cm4gaW52YWxpZCIsIF9fZnVuY19fLAorCQkJICBNQUNfQUREUl9BUlJBWShtYWMpLCB1cGRhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBpbiBhZGQgc3RhdGlvbiwgd2UgYWNjZXB0IGV4aXN0aW5nIHZhbGlkIHN0YUlkIGlmIHRoZXJlIGlzICovCisJaWYgKCgwID09IHVwZGF0ZSkgJiYKKwkgICAgKChwVGRsc1BlZXItPmxpbmtfc3RhdHVzID49IGVURExTX0xJTktfQ09OTkVDVElORykgfHwKKwkgICAgIChURExTX1NUQV9JTkRFWF9WQUxJRChwVGRsc1BlZXItPnN0YUlkKSkpKSB7CisJCWhkZExvZyhMT0cxLAorCQkJICAiJXM6ICIgTUFDX0FERFJFU1NfU1RSCisJCQkgICIgbGlua19zdGF0dXMgJWQuIHN0YUlkICVkLiBhZGQgc3RhdGlvbiBpZ25vcmVkLiIsCisJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWShtYWMpLCBwVGRsc1BlZXItPmxpbmtfc3RhdHVzLAorCQkJICBwVGRsc1BlZXItPnN0YUlkKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGluIGNoYW5nZSBzdGF0aW9uLCB3ZSBhY2NlcHQgb25seSB3aGVuIHN0YUlkIGlzIHZhbGlkICovCisJaWYgKCgxID09IHVwZGF0ZSkgJiYKKwkgICAgKChwVGRsc1BlZXItPmxpbmtfc3RhdHVzID4gZVRETFNfTElOS19DT05ORUNUSU5HKSB8fAorCSAgICAgKCFURExTX1NUQV9JTkRFWF9WQUxJRChwVGRsc1BlZXItPnN0YUlkKSkpKSB7CisJCWhkZExvZyhMT0dFLAorCQkJICAiJXM6ICIgTUFDX0FERFJFU1NfU1RSCisJCQkgICIgbGluayBzdGF0dXMgJWQuIHN0YUlkICVkLiBjaGFuZ2Ugc3RhdGlvbiAlcy4iLAorCQkJICBfX2Z1bmNfXywgTUFDX0FERFJfQVJSQVkobWFjKSwgcFRkbHNQZWVyLT5saW5rX3N0YXR1cywKKwkJCSAgcFRkbHNQZWVyLT5zdGFJZCwKKwkJCSAgKFRETFNfU1RBX0lOREVYX1ZBTElEKHBUZGxzUGVlci0+c3RhSWQpKSA/ICJpZ25vcmVkIiA6CisJCQkgICJkZWNsaW5lZCIpOworCQlyZXR1cm4gKFRETFNfU1RBX0lOREVYX1ZBTElEKHBUZGxzUGVlci0+c3RhSWQpKSA/IDAgOiAtRVBFUk07CisJfQorCisJLyogd2hlbiBvdGhlcnMgYXJlIG9uLWdvaW5nLCB3ZSB3YW50IHRvIGNoYW5nZSBsaW5rX3N0YXR1cyB0byBpZGxlICovCisJaWYgKE5VTEwgIT0gd2xhbl9oZGRfdGRsc19pc19wcm9ncmVzcyhwSGRkQ3R4LCBtYWMsIHRydWUpKSB7CisJCWhkZExvZyhMT0cxLAorCQkJICAiJXM6ICIgTUFDX0FERFJFU1NfU1RSCisJCQkgICIgVERMUyBzZXR1cCBpcyBvbmdvaW5nLiBSZXF1ZXN0IGRlY2xpbmVkLiIsCisJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWShtYWMpKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBmaXJzdCB0byBjaGVjayBpZiB3ZSByZWFjaGVkIHRvIG1heGltdW0gc3VwcG9ydGVkIFRETFMgcGVlci4KKwkgICBUT0RPOiBmb3Igbm93LCByZXR1cm4gLUVQRVJNIGxvb2tzIHdvcmtpbmcgZmluZSwKKwkgICBidXQgbmVlZCB0byBjaGVjayBpZiBhbnkgb3RoZXIgZXJybm8gZml0IGludG8gdGhpcyBjYXRlZ29yeS4gKi8KKwludW1DdXJyVGRsc1BlZXJzID0gd2xhbl9oZGRfdGRsc19jb25uZWN0ZWRfcGVlcnMocEFkYXB0ZXIpOworCWlmIChwSGRkQ3R4LT5tYXhfbnVtX3RkbHNfc3RhIDw9IG51bUN1cnJUZGxzUGVlcnMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogIiBNQUNfQUREUkVTU19TVFIKKwkJCSAgIiBURExTIE1heCBwZWVyIGFscmVhZHkgY29ubmVjdGVkLiBSZXF1ZXN0IGRlY2xpbmVkLiIKKwkJCSAgIiBOdW0gb2YgcGVlcnMgKCVkKSwgTWF4IGFsbG93ZWQgKCVkKS4iLAorCQkJICBfX2Z1bmNfXywgTUFDX0FERFJfQVJSQVkobWFjKSwgbnVtQ3VyclRkbHNQZWVycywKKwkJCSAgcEhkZEN0eC0+bWF4X251bV90ZGxzX3N0YSk7CisJCWdvdG8gZXJyb3I7CisJfSBlbHNlIHsKKwkJaGRkVGRsc1BlZXJfdCAqcFRkbHNQZWVyOworCQlwVGRsc1BlZXIgPSB3bGFuX2hkZF90ZGxzX2ZpbmRfcGVlcihwQWRhcHRlciwgbWFjLCB0cnVlKTsKKwkJaWYgKHBUZGxzUGVlciAmJiBURExTX0lTX0NPTk5FQ1RFRChwVGRsc1BlZXIpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogIiBNQUNfQUREUkVTU19TVFIKKwkJCQkgICIgYWxyZWFkeSBjb25uZWN0ZWQuIFJlcXVlc3QgZGVjbGluZWQuIiwKKwkJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWShtYWMpKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwl9CisJaWYgKDAgPT0gdXBkYXRlKQorCQl3bGFuX2hkZF90ZGxzX3NldF9saW5rX3N0YXR1cyhwQWRhcHRlciwKKwkJCQkJICAgICAgbWFjLAorCQkJCQkgICAgICBlVERMU19MSU5LX0NPTk5FQ1RJTkcsCisJCQkJCSAgICAgIGVURExTX0xJTktfU1VDQ0VTUyk7CisKKwkvKiBkZWJ1ZyBjb2RlICovCisJaWYgKE5VTEwgIT0gU3RhUGFyYW1zKSB7CisJCWhkZExvZyhMT0cxLAorCQkJICAiJXM6IFRETFMgUGVlciBQYXJhbWV0ZXJzLiIsIF9fZnVuY19fKTsKKwkJaWYgKFN0YVBhcmFtcy0+aHRjYXBfcHJlc2VudCkgeworCQkJaGRkTG9nKExPRzEsCisJCQkJICAiaHRfY2FwYS0+Y2FwX2luZm86ICUweCIsCisJCQkJICBTdGFQYXJhbXMtPkhUQ2FwLmNhcEluZm8pOworCQkJaGRkTG9nKExPRzEsCisJCQkJICAiaHRfY2FwYS0+ZXh0ZW5kZWRfY2FwYWJpbGl0aWVzOiAlMHgiLAorCQkJCSAgU3RhUGFyYW1zLT5IVENhcC5leHRlbmRlZEh0Q2FwSW5mbyk7CisJCX0KKwkJaGRkTG9nKExPRzEsCisJCQkgICJwYXJhbXMtPmNhcGFiaWxpdHk6ICUweCIsIFN0YVBhcmFtcy0+Y2FwYWJpbGl0eSk7CisJCWhkZExvZyhMT0cxLAorCQkJICAicGFyYW1zLT5leHRfY2FwYWJfbGVuOiAlMHgiLAorCQkJICBTdGFQYXJhbXMtPmV4dG5fY2FwYWJpbGl0eVswXSk7CisJCWlmIChTdGFQYXJhbXMtPnZodGNhcF9wcmVzZW50KSB7CisJCQloZGRMb2coTE9HMSwKKwkJCQkgICJyeE1jc01hcCAleCByeEhpZ2hlc3QgJXggdHhNY3NNYXAgJXggdHhIaWdoZXN0ICV4IiwKKwkJCQkgIFN0YVBhcmFtcy0+VkhUQ2FwLnN1cHBNY3MucnhNY3NNYXAsCisJCQkJICBTdGFQYXJhbXMtPlZIVENhcC5zdXBwTWNzLnJ4SGlnaGVzdCwKKwkJCQkgIFN0YVBhcmFtcy0+VkhUQ2FwLnN1cHBNY3MudHhNY3NNYXAsCisJCQkJICBTdGFQYXJhbXMtPlZIVENhcC5zdXBwTWNzLnR4SGlnaGVzdCk7CisJCX0KKwkJeworCQkJaW50IGkgPSAwOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICJTdXBwb3J0ZWQgcmF0ZXM6Iik7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKFN0YVBhcmFtcy0+c3VwcG9ydGVkX3JhdGVzKTsgaSsrKQorCQkJCWhkZExvZyhMT0cxLCAiWyVkXTogJXggIiwgaSwKKwkJCQkJU3RhUGFyYW1zLT5zdXBwb3J0ZWRfcmF0ZXNbaV0pOworCQl9CisJfSAvKiBlbmQgZGVidWcgY29kZSAqLworCWVsc2UgaWYgKCgxID09IHVwZGF0ZSkgJiYgKE5VTEwgPT0gU3RhUGFyYW1zKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzIDogdXBkYXRlIGlzIHRydWUsIGJ1dCBzdGFQYXJhbXMgaXMgTlVMTC4gRXJyb3IhIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCUlOSVRfQ09NUExFVElPTihwQWRhcHRlci0+dGRsc19hZGRfc3RhdGlvbl9jb21wKTsKKworCWlmICghdXBkYXRlKSB7CisJCXN0YXR1cyA9IHNtZV9hZGRfdGRsc19wZWVyX3N0YShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCSAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCBtYWMpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IHNtZV9jaGFuZ2VfdGRsc19wZWVyX3N0YShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCQkgIHBBZGFwdGVyLT5zZXNzaW9uSWQsIG1hYywKKwkJCQkJCSAgU3RhUGFyYW1zKTsKKwl9CisKKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcEFkYXB0ZXItPnRkbHNfYWRkX3N0YXRpb25fY29tcCwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCSAoV0FJVF9USU1FX1RETFNfQUREX1NUQSkpOworCisJaWYgKCFyYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIHRkbHMgYWRkIHN0YXRpb24gaW5kaWNhdGlvbiIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHBBZGFwdGVyLT50ZGxzQWRkU3RhU3RhdHVzKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEFkZCBTdGF0aW9uIGlzIHVuc3VjY2Vzc2Z1bCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJd2xhbl9oZGRfdGRsc19zZXRfbGlua19zdGF0dXMocEFkYXB0ZXIsCisJCQkJICAgICAgbWFjLAorCQkJCSAgICAgIGVURExTX0xJTktfSURMRSwgZVRETFNfTElOS19VTlNQRUNJRklFRCk7CisJcmV0dXJuIC1FUEVSTTsKKworfQorCisjaWYgVERMU19NR01UX1ZFUlNJT04yCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KCkgLSBoYW5kbGUgbWFuYWdlbWVudCBhY3Rpb25zIG9uIGEgZ2l2ZW4gcGVlcgorICogQHdpcGh5OiB3aXBoeQorICogQGRldjogbmV0IGRldmljZQorICogQHBlZXI6IE1BQyBhZGRyZXNzIG9mIHRoZSBURExTIHBlZXIKKyAqIEBhY3Rpb25fY29kZTogYWN0aW9uIGNvZGUKKyAqIEBkaWFsb2dfdG9rZW46IGRpYWxvZyB0b2tlbgorICogQHN0YXR1c19jb2RlOiBzdGF0dXMgY29kZQorICogQHBlZXJfY2FwYWJpbGl0eTogcGVlciBjYXBhYmlsaXR5CisgKiBAYnVmOiBhZGRpdGlvbmFsIElFIHRvIGluY2x1ZGUKKyAqIEBsZW46IGxlbmd0aCBvZiBidWYgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV90ZGxzX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqcGVlciwKKwkJCQl1OCBhY3Rpb25fY29kZSwgdTggZGlhbG9nX3Rva2VuLAorCQkJCXUxNiBzdGF0dXNfY29kZSwgdTMyIHBlZXJfY2FwYWJpbGl0eSwKKwkJCQljb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKQorI2Vsc2UKKy8qKgorICogX193bGFuX2hkZF9jZmc4MDIxMV90ZGxzX21nbXQoKSAtIGhhbmRsZSBtYW5hZ2VtZW50IGFjdGlvbnMgb24gYSBnaXZlbiBwZWVyCisgKiBAd2lwaHk6IHdpcGh5CisgKiBAZGV2OiBuZXQgZGV2aWNlCisgKiBAcGVlcjogTUFDIGFkZHJlc3Mgb2YgdGhlIFRETFMgcGVlcgorICogQGFjdGlvbl9jb2RlOiBhY3Rpb24gY29kZQorICogQGRpYWxvZ190b2tlbjogZGlhbG9nIHRva2VuCisgKiBAc3RhdHVzX2NvZGU6IHN0YXR1cyBjb2RlCisgKiBAYnVmOiBhZGRpdGlvbmFsIElFIHRvIGluY2x1ZGUKKyAqIEBsZW46IGxlbmd0aCBvZiBidWYgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlCisgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE3LCAwKSkKK3N0YXRpYyBpbnQgX193bGFuX2hkZF9jZmc4MDIxMV90ZGxzX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1aW50OF90ICpwZWVyLAorCQkJCXVpbnQ4X3QgYWN0aW9uX2NvZGUsIHVpbnQ4X3QgZGlhbG9nX3Rva2VuLAorCQkJCXVpbnQxNl90IHN0YXR1c19jb2RlLCB1aW50MzJfdCBwZWVyX2NhcGFiaWxpdHksCisJCQkJYm9vbCBpbml0aWF0b3IsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKwkJCQlzaXplX3QgbGVuKQorI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCitzdGF0aWMgaW50IF9fd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdWludDhfdCAqcGVlciwKKwkJCQl1aW50OF90IGFjdGlvbl9jb2RlLCB1aW50OF90IGRpYWxvZ190b2tlbiwKKwkJCQl1aW50MTZfdCBzdGF0dXNfY29kZSwgdWludDMyX3QgcGVlcl9jYXBhYmlsaXR5LAorCQkJCWNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbikKKyNlbGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTUsIDApKQorc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3RkbHNfbWdtdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQ4X3QgKnBlZXIsCisJCQkJdWludDhfdCBhY3Rpb25fY29kZSwgdWludDhfdCBkaWFsb2dfdG9rZW4sCisJCQkJdWludDE2X3Qgc3RhdHVzX2NvZGUsIHVpbnQzMl90IHBlZXJfY2FwYWJpbGl0eSwKKwkJCQljb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBsZW4pCisjZWxzZQorc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3RkbHNfbWdtdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQ4X3QgKnBlZXIsCisJCQkJdWludDhfdCBhY3Rpb25fY29kZSwgdWludDhfdCBkaWFsb2dfdG9rZW4sCisJCQkJdWludDE2X3Qgc3RhdHVzX2NvZGUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKwkJCQlzaXplX3QgbGVuKQorI2VuZGlmCisjZW5kaWYKK3sKKworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHdpcGh5X3ByaXYod2lwaHkpOworCXU4IHBlZXJNYWNbQ0RGX01BQ19BRERSX1NJWkVdOworCUNERl9TVEFUVVMgc3RhdHVzOworCWludCBtYXhfc3RhX2ZhaWxlZCA9IDA7CisJaW50IHJlc3BvbmRlcjsKKwl1bnNpZ25lZCBsb25nIHJjOworCXVpbnQxNl90IG51bUN1cnJUZGxzUGVlcnM7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDE1LCAwKSkKKyNpZiAhKFRETFNfTUdNVF9WRVJTSU9OMikKKwl1MzIgcGVlcl9jYXBhYmlsaXR5OworCXBlZXJfY2FwYWJpbGl0eSA9IDA7CisjZW5kaWYKKyNlbmRpZgorCisJaWYgKENERl9GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJDb21tYW5kIG5vdCBhbGxvd2VkIGluIEZUTSBtb2RlIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfSERELAorCQkJIFRSQUNFX0NPREVfSEREX0NGRzgwMjExX1RETFNfTUdNVCwKKwkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLCBhY3Rpb25fY29kZSkpOworCisJaWYgKDAgIT0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBIREQgY29udGV4dCBpcyBub3QgdmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChlVERMU19TVVBQT1JUX05PVF9FTkFCTEVEID09IHBIZGRDdHgtPnRkbHNfbW9kZSkgeworCQloZGRMb2coTE9HMSwKKwkJCSAgIiVzOiBURExTIG1vZGUgaXMgZGlzYWJsZWQgT1Igbm90IGVuYWJsZWQgaW4gRlcuIgorCQkJICBNQUNfQUREUkVTU19TVFIgIiBhY3Rpb24gJWQgZGVjbGluZWQuIiwKKwkJCSAgX19mdW5jX18sIE1BQ19BRERSX0FSUkFZKHBlZXIpLCBhY3Rpb25fY29kZSk7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJLyogSWYgYW55IGNvbmN1cnJlbmN5IGlzIGRldGVjdGVkICovCisJaWYgKCgoMSA8PCBDREZfU1RBX01PREUpICE9IHBIZGRDdHgtPmNvbmN1cnJlbmN5X21vZGUpIHx8CisJICAgIChwSGRkQ3R4LT5ub19vZl9hY3RpdmVfc2Vzc2lvbnNbQ0RGX1NUQV9NT0RFXSA+IDEpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIiVzOiBNdWx0aXBsZSBTVEEgT1IgQ29uY3VycmVuY3kgZGV0ZWN0ZWQuIElnbm9yZSBURExTIE1HTVQgZnJhbWUuIGFjdGlvbl9jb2RlPSVkLCBjb25jdXJyZW5jeV9tb2RlOiAweCV4LCBhY3RpdmVfc2Vzc2lvbnM6ICVkIiwKKwkJCSAgX19mdW5jX18sCisJCQkgIGFjdGlvbl9jb2RlLAorCQkJICBwSGRkQ3R4LT5jb25jdXJyZW5jeV9tb2RlLAorCQkJICBwSGRkQ3R4LT5ub19vZl9hY3RpdmVfc2Vzc2lvbnNbQ0RGX1NUQV9NT0RFXSk7CisJCXJldHVybiAtRVBFUk07CisJfQorCS8qIG90aGVyIHRoYW4gdGVhcmRvd24gZnJhbWUsIG1nbXQgZnJhbWVzIGFyZSBub3Qgc2VudCBpZiBkaXNhYmxlZCAqLworCWlmIChTSVJfTUFDX1RETFNfVEVBUkRPV04gIT0gYWN0aW9uX2NvZGUpIHsKKwkJLyogaWYgdGRsc19tb2RlIGlzIGRpc2FibGVkIHRvIHJlc3BvbmQgdG8gcGVlcidzIHJlcXVlc3QgKi8KKwkJaWYgKGVURExTX1NVUFBPUlRfRElTQUJMRUQgPT0gcEhkZEN0eC0+dGRsc19tb2RlKSB7CisJCQloZGRMb2coTE9HMSwKKwkJCQkgICIlczogIiBNQUNfQUREUkVTU19TVFIKKwkJCQkgICIgVERMUyBtb2RlIGlzIGRpc2FibGVkLiBhY3Rpb24gJWQgZGVjbGluZWQuIiwKKwkJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWShwZWVyKSwgYWN0aW9uX2NvZGUpOworCQkJcmV0dXJuIC1FTk9UU1VQUDsKKwkJfQorCX0KKworCWlmIChXTEFOX0lTX1RETFNfU0VUVVBfQUNUSU9OKGFjdGlvbl9jb2RlKSkgeworCQlpZiAoTlVMTCAhPSB3bGFuX2hkZF90ZGxzX2lzX3Byb2dyZXNzKHBIZGRDdHgsIHBlZXIsIHRydWUpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogIiBNQUNfQUREUkVTU19TVFIKKwkJCQkgICIgVERMUyBzZXR1cCBpcyBvbmdvaW5nLiBhY3Rpb24gJWQgZGVjbGluZWQuIiwKKwkJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWShwZWVyKSwgYWN0aW9uX2NvZGUpOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCX0KKworCWlmIChTSVJfTUFDX1RETFNfU0VUVVBfUkVRID09IGFjdGlvbl9jb2RlIHx8CisJICAgIFNJUl9NQUNfVERMU19TRVRVUF9SU1AgPT0gYWN0aW9uX2NvZGUpIHsKKwkJbnVtQ3VyclRkbHNQZWVycyA9IHdsYW5faGRkX3RkbHNfY29ubmVjdGVkX3BlZXJzKHBBZGFwdGVyKTsKKwkJaWYgKHBIZGRDdHgtPm1heF9udW1fdGRsc19zdGEgPD0gbnVtQ3VyclRkbHNQZWVycykgeworCQkJLyogc3VwcGxpY2FudCBzdGlsbCBzZW5kcyB0ZGxzX21nbXQoU0VUVVBfUkVRKSBldmVuIGFmdGVyCisJCQkgICB3ZSByZXR1cm4gZXJyb3IgY29kZSBhdCAnYWRkX3N0YXRpb24oKScuIEhlbmNlIHdlIGhhdmUgdGhpcworCQkJICAgY2hlY2sgYWdhaW4gaW4gYWRkdGlvbiB0byBhZGRfc3RhdGlvbigpLgorCQkJICAgQW55d2F5LCB0aGVyZSBpcyBubyBoYXJkIHRvIGRvdWJsZS1jaGVjay4gKi8KKwkJCWlmIChTSVJfTUFDX1RETFNfU0VUVVBfUkVRID09IGFjdGlvbl9jb2RlKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiJXM6ICIgTUFDX0FERFJFU1NfU1RSCisJCQkJCSAgIiBURExTIE1heCBwZWVyIGFscmVhZHkgY29ubmVjdGVkLiBhY3Rpb24gKCVkKSBkZWNsaW5lZC4gTnVtIG9mIHBlZXJzICglZCksIE1heCBhbGxvd2VkICglZCkuIiwKKwkJCQkJICBfX2Z1bmNfXywgTUFDX0FERFJfQVJSQVkocGVlciksCisJCQkJCSAgYWN0aW9uX2NvZGUsIG51bUN1cnJUZGxzUGVlcnMsCisJCQkJCSAgcEhkZEN0eC0+bWF4X251bV90ZGxzX3N0YSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCS8qIG1heGltdW0gcmVhY2hlZC4gdHdlYWsgdG8gc2VuZCBlcnJvciBjb2RlIHRvIHBlZXIgYW5kIHJldHVybgorCQkJCSAgIGVycm9yIGNvZGUgdG8gc3VwcGxpY2FudCAqLworCQkJCXN0YXR1c19jb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgIiVzOiAiIE1BQ19BRERSRVNTX1NUUgorCQkJCQkgICIgVERMUyBNYXggcGVlciBhbHJlYWR5IGNvbm5lY3RlZCwgc2VuZCByZXNwb25zZSBzdGF0dXMgKCVkKS4gTnVtIG9mIHBlZXJzICglZCksIE1heCBhbGxvd2VkICglZCkuIiwKKwkJCQkJICBfX2Z1bmNfXywgTUFDX0FERFJfQVJSQVkocGVlciksCisJCQkJCSAgc3RhdHVzX2NvZGUsIG51bUN1cnJUZGxzUGVlcnMsCisJCQkJCSAgcEhkZEN0eC0+bWF4X251bV90ZGxzX3N0YSk7CisJCQkJbWF4X3N0YV9mYWlsZWQgPSAtRVBFUk07CisJCQkJLyogZmFsbCB0aHJvdWdoIHRvIHNlbmQgc2V0dXAgcmVzcCB3aXRoIGZhaWx1cmUgc3RhdHVzCisJCQkJICAgY29kZSAqLworCQkJfQorCQl9IGVsc2UgeworCQkJaGRkVGRsc1BlZXJfdCAqcFRkbHNQZWVyOworCQkJcFRkbHNQZWVyID0KKwkJCQl3bGFuX2hkZF90ZGxzX2ZpbmRfcGVlcihwQWRhcHRlciwgcGVlciwgdHJ1ZSk7CisJCQlpZiAocFRkbHNQZWVyICYmIFRETFNfSVNfQ09OTkVDVEVEKHBUZGxzUGVlcikpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICIlczoiIE1BQ19BRERSRVNTX1NUUgorCQkJCQkgICIgYWxyZWFkeSBjb25uZWN0ZWQuIGFjdGlvbiAlZCBkZWNsaW5lZC4iLAorCQkJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWShwZWVyKSwKKwkJCQkJICBhY3Rpb25fY29kZSk7CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKwkJfQorCX0KKwljZGZfbWVtX2NvcHkocGVlck1hYywgcGVlciwgNik7CisKKwloZGRMb2coTE9HMSwKKwkJICAiJXM6ICIgTUFDX0FERFJFU1NfU1RSCisJCSAgIiBhY3Rpb24gJWQsIGRpYWxvZ190b2tlbiAlZCBzdGF0dXMgJWQsIGxlbiA9ICV6dSIsCisJCSAgInRkbHNfbWdtdCIsIE1BQ19BRERSX0FSUkFZKHBlZXIpLCBhY3Rpb25fY29kZSwgZGlhbG9nX3Rva2VuLAorCQkgIHN0YXR1c19jb2RlLCBsZW4pOworCisJLypFeGNlcHQgdGVhcmRvd24gcmVzcG9uZGVyIHdpbGwgbm90IGJlIHVzZWQgc28ganVzdCBtYWtlIDAgKi8KKwlyZXNwb25kZXIgPSAwOworCWlmIChTSVJfTUFDX1RETFNfVEVBUkRPV04gPT0gYWN0aW9uX2NvZGUpIHsKKworCQloZGRUZGxzUGVlcl90ICpwVGRsc1BlZXI7CisJCXBUZGxzUGVlciA9IHdsYW5faGRkX3RkbHNfZmluZF9wZWVyKHBBZGFwdGVyLCBwZWVyTWFjLCB0cnVlKTsKKworCQlpZiAocFRkbHNQZWVyICYmIFRETFNfSVNfQ09OTkVDVEVEKHBUZGxzUGVlcikpCisJCQlyZXNwb25kZXIgPSBwVGRsc1BlZXItPmlzX3Jlc3BvbmRlcjsKKwkJZWxzZSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogIiBNQUNfQUREUkVTU19TVFIKKwkJCQkgICIgcGVlciBkb2Vzbid0IGV4aXN0IG9yIG5vdCBjb25uZWN0ZWQgJWQgZGlhbG9nX3Rva2VuICVkIHN0YXR1cyAlZCwgbGVuID0gJXp1IiwKKwkJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWShwZWVyKSwKKwkJCQkgIChOVUxMID09CisJCQkJICAgcFRkbHNQZWVyKSA/IC0xIDogcFRkbHNQZWVyLT5saW5rX3N0YXR1cywKKwkJCQkgIGRpYWxvZ190b2tlbiwgc3RhdHVzX2NvZGUsIGxlbik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJfQorCisJLyogRm9yIGV4cGxpY2l0IHRyaWdnZXIgb2YgRElTX1JFUSBjb21lIG91dCBvZiBCTVBTIGZvcgorCSAgIHN1Y2Nlc3NmdWxseSByZWNlaXZpbmcgRElTX1JTUCBmcm9tIHBlZXIuICovCisJaWYgKChTSVJfTUFDX1RETFNfU0VUVVBfUlNQID09IGFjdGlvbl9jb2RlKSB8fAorCSAgICAoU0lSX01BQ19URExTX0RJU19SU1AgPT0gYWN0aW9uX2NvZGUpIHx8CisJICAgIChTSVJfTUFDX1RETFNfRElTX1JFUSA9PSBhY3Rpb25fY29kZSkpIHsKKwkJLyogRncgd2lsbCB0YWtlIGNhcmUgaWYgUFMgb2ZmbG9hZCBpcyBlbmFibGVkLiAqLworCQlpZiAoU0lSX01BQ19URExTX0RJU19SRVEgIT0gYWN0aW9uX2NvZGUpCisJCQl3bGFuX2hkZF90ZGxzX3NldF9jYXAocEFkYXB0ZXIsIHBlZXJNYWMsCisJCQkJCSAgICAgIGVURExTX0NBUF9TVVBQT1JURUQpOworCX0KKworCS8qIG1ha2Ugc3VyZSBkb2Vzbid0IGNhbGwgc2VuZF9tZ210KCkgd2hpbGUgaXQgaXMgcGVuZGluZyAqLworCWlmIChURExTX0NUWF9NQUdJQyA9PSBwQWRhcHRlci0+bWdtdFR4Q29tcGxldGlvblN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAiIE1BQ19BRERSRVNTX1NUUgorCQkJICAiIGFjdGlvbiAlZCBjb3VsZG4ndCBzZW50LCBhcyBvbmUgaXMgcGVuZGluZy4gcmV0dXJuIEVCVVNZIiwKKwkJCSAgX19mdW5jX18sIE1BQ19BRERSX0FSUkFZKHBlZXIpLCBhY3Rpb25fY29kZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcEFkYXB0ZXItPm1nbXRUeENvbXBsZXRpb25TdGF0dXMgPSBURExTX0NUWF9NQUdJQzsKKwlJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPnRkbHNfbWdtdF9jb21wKTsKKworCXN0YXR1cyA9IHNtZV9zZW5kX3RkbHNfbWdtdF9mcmFtZShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCSAgcEFkYXB0ZXItPnNlc3Npb25JZCwgcGVlck1hYywKKwkJCQkJICBhY3Rpb25fY29kZSwgZGlhbG9nX3Rva2VuLCBzdGF0dXNfY29kZSwKKwkJCQkJICBwZWVyX2NhcGFiaWxpdHksICh1aW50OF90ICopIGJ1ZiwgbGVuLAorCQkJCQkgICFyZXNwb25kZXIpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogc21lX3NlbmRfdGRsc19tZ210X2ZyYW1lIGZhaWxlZCEiLCBfX2Z1bmNfXyk7CisJCXBBZGFwdGVyLT5tZ210VHhDb21wbGV0aW9uU3RhdHVzID0gZmFsc2U7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwQWRhcHRlci0+dGRsc19tZ210X2NvbXAsCisJCQkJCSBtc2Vjc190b19qaWZmaWVzKFdBSVRfVElNRV9URExTX01HTVQpKTsKKworCWlmICgoMCA9PSByYykgfHwgKHRydWUgIT0gcEFkYXB0ZXItPm1nbXRUeENvbXBsZXRpb25TdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE1nbXQgVHggQ29tcGxldGlvbiB0aW1lZCBvdXQgVHhDb21wbGV0aW9uICV1IiwKKwkJCSAgX19mdW5jX18sIHBBZGFwdGVyLT5tZ210VHhDb21wbGV0aW9uU3RhdHVzKTsKKworCQlpZiAocEhkZEN0eC0+aXNMb2dwSW5Qcm9ncmVzcykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IExPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisKKwkJaWYgKHBIZGRDdHgtPmlzVW5sb2FkSW5Qcm9ncmVzcykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IFVubG9hZGluZy9Mb2FkaW5nIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLAorCQkJCSAgX19mdW5jX18pOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKworCQlwQWRhcHRlci0+bWdtdFR4Q29tcGxldGlvblN0YXR1cyA9IGZhbHNlOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobWF4X3N0YV9mYWlsZWQpIHsKKwkJcmV0dXJuIG1heF9zdGFfZmFpbGVkOworCX0KKworCWlmIChTSVJfTUFDX1RETFNfU0VUVVBfUlNQID09IGFjdGlvbl9jb2RlKSB7CisJCXJldHVybiB3bGFuX2hkZF90ZGxzX3NldF9yZXNwb25kZXIocEFkYXB0ZXIsIHBlZXJNYWMsIGZhbHNlKTsKKwl9IGVsc2UgaWYgKFNJUl9NQUNfVERMU19TRVRVUF9DTkYgPT0gYWN0aW9uX2NvZGUpIHsKKwkJcmV0dXJuIHdsYW5faGRkX3RkbHNfc2V0X3Jlc3BvbmRlcihwQWRhcHRlciwgcGVlck1hYywgdHJ1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KCkgLSBjZmc4MDIxMSB0ZGxzIG1nbXQgaGFuZGxlciBmdW5jdGlvbgorICogQHdpcGh5OiBQb2ludGVyIHRvIHdpcGh5IHN0cnVjdHVyZS4KKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUuCisgKiBAcGVlcjogcGVlciBhZGRyZXNzCisgKiBAYWN0aW9uX2NvZGU6IGFjdGlvbiBjb2RlCisgKiBAZGlhbG9nX3Rva2VuOiBkaWFsb2cgdG9rZW4KKyAqIEBzdGF0dXNfY29kZTogc3RhdHVzIGNvZGUKKyAqIEBwZWVyX2NhcGFiaWxpdHk6IHBlZXIgY2FwYWJpbGl0eQorICogQGJ1ZjogYnVmZmVyCisgKiBAbGVuOiBMZW5ndGggb2YgQGJ1ZgorICoKKyAqIFRoaXMgaXMgdGhlIGNmZzgwMjExIHRkbHMgbWdtdCBoYW5kbGVyIGZ1bmN0aW9uIHdoaWNoIGludm9rZXMKKyAqIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBAX193bGFuX2hkZF9jZmc4MDIxMV90ZGxzX21nbXQgd2l0aAorICogU1NSIHByb3RlY3Rpb24uCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworI2lmIFRETFNfTUdNVF9WRVJTSU9OMgoraW50IHdsYW5faGRkX2NmZzgwMjExX3RkbHNfbWdtdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQl1OCAqcGVlciwgdTggYWN0aW9uX2NvZGUsCisJCQkJCXU4IGRpYWxvZ190b2tlbiwKKwkJCQkJdTE2IHN0YXR1c19jb2RlLCB1MzIgcGVlcl9jYXBhYmlsaXR5LAorCQkJCQljb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKQorI2Vsc2UgLyogVERMU19NR01UX1ZFUlNJT04yICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNywgMCkpIHx8IGRlZmluZWQoV0lUSF9CQUNLUE9SVFMpCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCWNvbnN0IHU4ICpwZWVyLCB1OCBhY3Rpb25fY29kZSwKKwkJCQkJdTggZGlhbG9nX3Rva2VuLCB1MTYgc3RhdHVzX2NvZGUsCisJCQkJCXUzMiBwZWVyX2NhcGFiaWxpdHksIGJvb2wgaW5pdGlhdG9yLAorCQkJCQljb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKQorI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCWNvbnN0IHU4ICpwZWVyLCB1OCBhY3Rpb25fY29kZSwKKwkJCQkJdTggZGlhbG9nX3Rva2VuLCB1MTYgc3RhdHVzX2NvZGUsCisJCQkJCXUzMiBwZWVyX2NhcGFiaWxpdHksIGNvbnN0IHU4ICpidWYsCisJCQkJCXNpemVfdCBsZW4pCisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE1LCAwKSkKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV90ZGxzX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJdTggKnBlZXIsIHU4IGFjdGlvbl9jb2RlLAorCQkJCQl1OCBkaWFsb2dfdG9rZW4sCisJCQkJCXUxNiBzdGF0dXNfY29kZSwgdTMyIHBlZXJfY2FwYWJpbGl0eSwKKwkJCQkJY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbikKKyNlbHNlCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCXU4ICpwZWVyLCB1OCBhY3Rpb25fY29kZSwKKwkJCQkJdTggZGlhbG9nX3Rva2VuLAorCQkJCQl1MTYgc3RhdHVzX2NvZGUsIGNvbnN0IHU4ICpidWYsCisJCQkJCXNpemVfdCBsZW4pCisjZW5kaWYKKyNlbmRpZgoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworI2lmIFRETFNfTUdNVF9WRVJTSU9OMgorCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KHdpcGh5LCBkZXYsIHBlZXIsIGFjdGlvbl9jb2RlLAorCQkJCQkJZGlhbG9nX3Rva2VuLCBzdGF0dXNfY29kZSwKKwkJCQkJCXBlZXJfY2FwYWJpbGl0eSwgYnVmLCBsZW4pOworI2Vsc2UgLyogVERMU19NR01UX1ZFUlNJT04yICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNywgMCkpIHx8IGRlZmluZWQoV0lUSF9CQUNLUE9SVFMpCisJcmV0ID0gX193bGFuX2hkZF9jZmc4MDIxMV90ZGxzX21nbXQod2lwaHksIGRldiwgcGVlciwgYWN0aW9uX2NvZGUsCisJCQkJCWRpYWxvZ190b2tlbiwgc3RhdHVzX2NvZGUsCisJCQkJCXBlZXJfY2FwYWJpbGl0eSwgaW5pdGlhdG9yLAorCQkJCQlidWYsIGxlbik7CisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE2LCAwKSkKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3RkbHNfbWdtdCh3aXBoeSwgZGV2LCBwZWVyLCBhY3Rpb25fY29kZSwKKwkJCQkJZGlhbG9nX3Rva2VuLCBzdGF0dXNfY29kZSwKKwkJCQkJcGVlcl9jYXBhYmlsaXR5LCBidWYsIGxlbik7CisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE1LCAwKSkKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3RkbHNfbWdtdCh3aXBoeSwgZGV2LCBwZWVyLCBhY3Rpb25fY29kZSwKKwkJCQkJZGlhbG9nX3Rva2VuLCBzdGF0dXNfY29kZSwKKwkJCQkJcGVlcl9jYXBhYmlsaXR5LCBidWYsIGxlbik7CisjZWxzZQorCXJldCA9IF9fd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KHdpcGh5LCBkZXYsIHBlZXIsIGFjdGlvbl9jb2RlLAorCQkJCQlkaWFsb2dfdG9rZW4sIHN0YXR1c19jb2RlLCBidWYsIGxlbik7CisjZW5kaWYKKyNlbmRpZgorCisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bGFuX2hkZF90ZGxzX2V4dGN0cmxfY29uZmlnX3BlZXIoKSAtIGNvbmZpZ3VyZSBhbiBleHRlcm5hbGx5IGNvbnRyb2xsYWJsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURExTIHBlZXIKKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqIEBwZWVyOiBNQUMgYWRkcmVzcyBvZiB0aGUgVERMUyBwZWVyCisgKiBAY2FsbGJhY2s6IENhbGxiYWNrIHRvIHNldCBvbiB0aGUgcGVlcgorICogQGNoYW46IENoYW5uZWwKKyAqIEBtYXhfbGF0ZW5jeTogTWF4aW11bSBsYXRlbmN5CisgKiBAb3BfY2xhc3M6IE9wZXJhdGlvbiBjbGFzcworICogQG1pbl9iYW5kd2lkdGg6IE1pbmltYWwgYmFuZHdpZHRoCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIG90aGVyd2lzZQorICovCitpbnQgd2xhbl9oZGRfdGRsc19leHRjdHJsX2NvbmZpZ19wZWVyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgICAgIGNvbnN0IHVpbnQ4X3QgKnBlZXIsCisJCQkJICAgICAgY2ZnODAyMTFfZXh0dGRsc19jYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgICAgICB1MzIgY2hhbiwKKwkJCQkgICAgICB1MzIgbWF4X2xhdGVuY3ksCisJCQkJICAgICAgdTMyIG9wX2NsYXNzLCB1MzIgbWluX2JhbmR3aWR0aCkKK3sKKwloZGRUZGxzUGVlcl90ICpwVGRsc1BlZXI7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzIDogTkw4MDIxMV9URExTX1NFVFVQIGZvciAiIE1BQ19BRERSRVNTX1NUUiwKKwkJICBfX2Z1bmNfXywgTUFDX0FERFJfQVJSQVkocGVlcikpOworCWlmICgoZmFsc2UgPT0gcEhkZEN0eC0+Y29uZmlnLT5mVERMU0V4dGVybmFsQ29udHJvbCkgfHwKKwkgICAgKGZhbHNlID09IHBIZGRDdHgtPmNvbmZpZy0+ZkVuYWJsZVRETFNJbXBsaWNpdFRyaWdnZXIpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlcyBURExTIEV4dGVybmFsIGNvbnRyb2wgb3IgSW1wbGljaXQgVHJpZ2dlciBub3QgZW5hYmxlZCAiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCXBUZGxzUGVlciA9IHdsYW5faGRkX3RkbHNfZ2V0X3BlZXIocEFkYXB0ZXIsIHBlZXIpOworCWlmIChwVGRsc1BlZXIgPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBwZWVyICIgTUFDX0FERFJFU1NfU1RSICIgZG9lcyBub3QgZXhpc3QiLAorCQkJICBfX2Z1bmNfXywgTUFDX0FERFJfQVJSQVkocGVlcikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKDAgIT0gd2xhbl9oZGRfdGRsc19zZXRfZm9yY2VfcGVlcihwQWRhcHRlciwgcGVlciwgdHJ1ZSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlcyBURExTIEFkZCBGb3JjZSBQZWVyIEZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgwICE9IHdsYW5faGRkX3RkbHNfc2V0X2V4dGN0cmxfcGFyYW0ocEFkYXB0ZXIsIHBlZXIsCisJCQkJCQkgY2hhbiwgbWF4X2xhdGVuY3ksCisJCQkJCQkgb3BfY2xhc3MsIG1pbl9iYW5kd2lkdGgpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMgVERMUyBTZXQgUGVlcidzIEV4dGVybmFsIEN0cmwgUGFyYW1ldGVyIEZhaWxlZCIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgwICE9IHdsYW5faGRkX3NldF9jYWxsYmFjayhwVGRsc1BlZXIsIGNhbGxiYWNrKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzIFRETFMgc2V0IGNhbGxiYWNrIEZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5faGRkX3RkbHNfZXh0Y3RybF9kZWNvbmZpZ19wZWVyKCkgLSBkZS1jb25maWd1cmUgYW4gZXh0ZXJuYWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsYWJsZSBURExTIHBlZXIKKyAqIEBwQWRhcHRlcjogSEREIGFkYXB0ZXIKKyAqIEBwZWVyOiBNQUMgYWRkcmVzcyBvZiB0aGUgdGRscyBwZWVyCisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzdworICovCitpbnQgd2xhbl9oZGRfdGRsc19leHRjdHJsX2RlY29uZmlnX3BlZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCWNvbnN0IHVpbnQ4X3QgKnBlZXIpCit7CisJaGRkVGRsc1BlZXJfdCAqcFRkbHNQZWVyOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlcyA6IE5MODAyMTFfVERMU19URUFSRE9XTiBmb3IgIiBNQUNfQUREUkVTU19TVFIsCisJCSAgX19mdW5jX18sIE1BQ19BRERSX0FSUkFZKHBlZXIpKTsKKwlpZiAoKGZhbHNlID09IHBIZGRDdHgtPmNvbmZpZy0+ZlRETFNFeHRlcm5hbENvbnRyb2wpIHx8CisJICAgIChmYWxzZSA9PSBwSGRkQ3R4LT5jb25maWctPmZFbmFibGVURExTSW1wbGljaXRUcmlnZ2VyKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXMgVERMUyBFeHRlcm5hbCBjb250cm9sIG9yIEltcGxpY2l0IFRyaWdnZXIgbm90IGVuYWJsZWQgIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKwlwVGRsc1BlZXIgPSB3bGFuX2hkZF90ZGxzX2ZpbmRfcGVlcihwQWRhcHRlciwgcGVlciwgdHJ1ZSk7CisJaWYgKE5VTEwgPT0gcFRkbHNQZWVyKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiAiIE1BQ19BRERSRVNTX1NUUgorCQkgICAgICAgInBlZXIgbWF0Y2hpbmcgTUFDX0FERFJFU1NfU1RSIG5vdCBmb3VuZCIsCisJCSAgICAgICBfX2Z1bmNfXywgTUFDX0FERFJfQVJSQVkocGVlcikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQl3bGFuX2hkZF90ZGxzX2luZGljYXRlX3RlYXJkb3duKHBBZGFwdGVyLCBwVGRsc1BlZXIsCisJCQkJCQllU0lSX01BQ19URExTX1RFQVJET1dOX1VOU1BFQ19SRUFTT04pOworCX0KKwlpZiAoMCAhPSB3bGFuX2hkZF90ZGxzX3NldF9mb3JjZV9wZWVyKHBBZGFwdGVyLCBwZWVyLCBmYWxzZSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlcyBGYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoMCAhPSB3bGFuX2hkZF9zZXRfY2FsbGJhY2socFRkbHNQZWVyLCBOVUxMKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzIFRETFMgc2V0IGNhbGxiYWNrIEZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIF9fd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19vcGVyKCkgLSBoZWxwZXIgZnVuY3Rpb24gdG8gaGFuZGxlIGNmZzgwMjExIG9wZXJhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGFuIFRETFMgcGVlcgorICogQHdpcGh5OiB3aXBoeQorICogQGRldjogbmV0IGRldmljZQorICogQHBlZXI6IE1BQyBhZGRyZXNzIG9mIHRoZSBURExTIHBlZXIKKyAqIEBvcGVyOiBjZmc4MDIxMSBURExTIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBfX3dsYW5faGRkX2NmZzgwMjExX3RkbHNfb3BlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJIGNvbnN0IHVpbnQ4X3QgKnBlZXIsCisJCQkJCSBlbnVtIG5sODAyMTFfdGRsc19vcGVyYXRpb24gb3BlcikKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlpbnQgc3RhdHVzOworCXRTbWVUZGxzUGVlclN0YXRlUGFyYW1zIHNtZVRkbHNQZWVyU3RhdGVQYXJhbXM7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCWhkZFRkbHNQZWVyX3QgKnBUZGxzUGVlcjsKKworCWlmIChDREZfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBGVE0gbW9kZSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX0hERCwKKwkJCSBUUkFDRV9DT0RFX0hERF9DRkc4MDIxMV9URExTX09QRVIsCisJCQkgcEFkYXB0ZXItPnNlc3Npb25JZCwgb3BlcikpOworCWlmIChOVUxMID09IHBlZXIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBhcmd1bWVudHMiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisKKwlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIiwgX19mdW5jX18pOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIFFDQSAyLjAgRGlzY3JldGUgQU5EcyBmZWF0dXJlIGNhcGFiaWxpdHkgaW4gSEREIGNvbmZpZyB3aXRoIHRoYXQKKwkgKiByZWNlaXZlZCBmcm9tIHRhcmdldCwgc28gSEREIGNvbmZpZyBnaXZlcyBjb21iaW5lZCBpbnRlcnNlY3RlZCByZXN1bHQKKwkgKi8KKwlpZiAoZmFsc2UgPT0gcEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlVERMU1N1cHBvcnQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJURExTIERpc2FibGVkIGluIElOSSBPUiBub3QgZW5hYmxlZCBpbiBGVy4gIgorCQkJICAiQ2Fubm90IHByb2Nlc3MgVERMUyBjb21tYW5kcyIpOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKworCXN3aXRjaCAob3BlcikgeworCWNhc2UgTkw4MDIxMV9URExTX0VOQUJMRV9MSU5LOgorCXsKKwkJQ0RGX1NUQVRVUyBzdGF0dXM7CisJCXVuc2lnbmVkIGxvbmcgcmM7CisJCXRDc3JUZGxzTGlua0VzdGFibGlzaFBhcmFtcyB0ZGxzTGlua0VzdGFibGlzaFBhcmFtczsKKworCQlwVGRsc1BlZXIgPQorCQkJd2xhbl9oZGRfdGRsc19maW5kX3BlZXIocEFkYXB0ZXIsIHBlZXIsIHRydWUpOworCisJCWlmIChOVUxMID09IHBUZGxzUGVlcikgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBwZWVyIG1hdGNoaW5nICIgTUFDX0FERFJFU1NfU1RSCisJCQkJICAiIG5vdCBmb3VuZCwgaWdub3JlIE5MODAyMTFfVERMU19FTkFCTEVfTElOSyIsCisJCQkJICBfX2Z1bmNfXywgTUFDX0FERFJfQVJSQVkocGVlcikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOTDgwMjExX1RETFNfRU5BQkxFX0xJTksgZm9yIHBlZXIgIgorCQkJICBNQUNfQUREUkVTU19TVFIgIiBsaW5rX3N0YXR1czogJWQiLAorCQkJICBfX2Z1bmNfXywgTUFDX0FERFJfQVJSQVkocGVlciksCisJCQkgIHBUZGxzUGVlci0+bGlua19zdGF0dXMpOworCisJCWlmICghVERMU19TVEFfSU5ERVhfVkFMSUQocFRkbHNQZWVyLT5zdGFJZCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogaW52YWxpZCBzdGEgaW5kZXggJXUgZm9yICIKKwkJCQkgIE1BQ19BRERSRVNTX1NUUgorCQkJCSAgIiBURExTX0VOQUJMRV9MSU5LIGZhaWxlZCIsIF9fZnVuY19fLAorCQkJCSAgcFRkbHNQZWVyLT5zdGFJZCwKKwkJCQkgIE1BQ19BRERSX0FSUkFZKHBlZXIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGVURExTX0xJTktfQ09OTkVDVEVEICE9IHBUZGxzUGVlci0+bGlua19zdGF0dXMpIHsKKwkJCWlmIChJU19BRFZBTkNFX1RETFNfRU5BQkxFKSB7CisKKwkJCQlpZiAoMCAhPQorCQkJCSAgICB3bGFuX2hkZF90ZGxzX2dldF9saW5rX2VzdGFibGlzaF9wYXJhbXMKKwkJCQkJICAgIChwQWRhcHRlciwgcGVlciwKKwkJCQkJICAgICZ0ZGxzTGlua0VzdGFibGlzaFBhcmFtcykpIHsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCUlOSVRfQ09NUExFVElPTihwQWRhcHRlci0+CisJCQkJCQl0ZGxzX2xpbmtfZXN0YWJsaXNoX3JlcV9jb21wKTsKKworCQkJCXNtZV9zZW5kX3RkbHNfbGlua19lc3RhYmxpc2hfcGFyYW1zCisJCQkJCShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsIHBlZXIsCisJCQkJCSZ0ZGxzTGlua0VzdGFibGlzaFBhcmFtcyk7CisJCQkJLyogU2VuZCBURExTIHBlZXIgVUFQU0QgY2FwYWJpbGl0aWVzIHRvIHRoZSBmaXJtd2FyZSBhbmQKKwkJCQkgKiByZWdpc3RlciB3aXRoIHRoZSBUTCBvbiBhZnRlciB0aGUgcmVzcG9uc2UgZm9yIHRoaXMgb3BlcmF0aW9uCisJCQkJICogaXMgcmVjZWl2ZWQgLgorCQkJCSAqLworCQkJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0CisJCQkJCSAgICAgKCZwQWRhcHRlci0+CisJCQkJCSAgICAgdGRsc19saW5rX2VzdGFibGlzaF9yZXFfY29tcCwKKwkJCQkJICAgICBtc2Vjc190b19qaWZmaWVzCisJCQkJCQkgICAgIChXQUlUX1RJTUVfVERMU19MSU5LX0VTVEFCTElTSF9SRVEpKTsKKwkJCQlpZiAoIXJjKSB7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJICAiJXM6IExpbmsgRXN0YWJsaXNoIFJlcXVlc3QgdGltZWQgb3V0IiwKKwkJCQkJCSAgX19mdW5jX18pOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCQl3bGFuX2hkZF90ZGxzX3NldF9wZWVyX2xpbmtfc3RhdHVzKHBUZGxzUGVlciwKKwkJCQkJCQkgICBlVERMU19MSU5LX0NPTk5FQ1RFRCwKKwkJCQkJCQkgICBlVERMU19MSU5LX1NVQ0NFU1MpOworCQkJLyogc3RhcnQgVERMUyBjbGllbnQgcmVnaXN0cmF0aW9uIHdpdGggVEwgKi8KKwkJCXN0YXR1cyA9CisJCQkJaGRkX3JvYW1fcmVnaXN0ZXJfdGRsc3N0YShwQWRhcHRlciwgcGVlciwKKwkJCQkJCQkgIHBUZGxzUGVlci0+c3RhSWQsCisJCQkJCQkJICBwVGRsc1BlZXItPgorCQkJCQkJCSAgc2lnbmF0dXJlKTsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCQkJdWludDhfdCBpOworCisJCQkJY2RmX21lbV96ZXJvKCZzbWVUZGxzUGVlclN0YXRlUGFyYW1zLAorCQkJCQkgICAgIHNpemVvZgorCQkJCQkgICAgICh0U21lVGRsc1BlZXJTdGF0ZVBhcmFtcykpOworCisJCQkJc21lVGRsc1BlZXJTdGF0ZVBhcmFtcy52ZGV2SWQgPQorCQkJCQlwQWRhcHRlci0+c2Vzc2lvbklkOworCQkJCWNkZl9tZW1fY29weSgmc21lVGRsc1BlZXJTdGF0ZVBhcmFtcy4KKwkJCQkJICAgICBwZWVyTWFjQWRkciwKKwkJCQkJICAgICAmcFRkbHNQZWVyLT5wZWVyTWFjLAorCQkJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMucGVlclN0YXRlID0KKwkJCQkJZVNNRV9URExTX1BFRVJfU1RBVEVfQ09OTkVDVEVEOworCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMucGVlckNhcC4KKwkJCQlpc1BlZXJSZXNwb25kZXIgPQorCQkJCQlwVGRsc1BlZXItPmlzX3Jlc3BvbmRlcjsKKwkJCQlzbWVUZGxzUGVlclN0YXRlUGFyYW1zLnBlZXJDYXAuCisJCQkJcGVlclVhcHNkUXVldWUgPQorCQkJCQlwVGRsc1BlZXItPnVhcHNkUXVldWVzOworCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMucGVlckNhcC4KKwkJCQlwZWVyTWF4U3AgPSBwVGRsc1BlZXItPm1heFNwOworCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMucGVlckNhcC4KKwkJCQlwZWVyQnVmZlN0YVN1cHBvcnQgPQorCQkJCQlwVGRsc1BlZXItPmlzQnVmU3RhOworCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMucGVlckNhcC4KKwkJCQlwZWVyT2ZmQ2hhblN1cHBvcnQgPQorCQkJCQlwVGRsc1BlZXItPmlzT2ZmQ2hhbm5lbFN1cHBvcnRlZDsKKwkJCQlzbWVUZGxzUGVlclN0YXRlUGFyYW1zLnBlZXJDYXAuCisJCQkJcGVlckN1cnJPcGVyQ2xhc3MgPSAwOworCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMucGVlckNhcC4KKwkJCQlzZWxmQ3Vyck9wZXJDbGFzcyA9IDA7CisJCQkJc21lVGRsc1BlZXJTdGF0ZVBhcmFtcy5wZWVyQ2FwLgorCQkJCXBlZXJDaGFuTGVuID0KKwkJCQkJcFRkbHNQZWVyLT5zdXBwb3J0ZWRfY2hhbm5lbHNfbGVuOworCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMucGVlckNhcC4KKwkJCQlwcmVmT2ZmQ2hhbk51bSA9CisJCQkJCXBUZGxzUGVlci0+cHJlZl9vZmZfY2hhbl9udW07CisJCQkJc21lVGRsc1BlZXJTdGF0ZVBhcmFtcy5wZWVyQ2FwLgorCQkJCXByZWZPZmZDaGFuQmFuZHdpZHRoID0KKwkJCQkJcEhkZEN0eC0+Y29uZmlnLT4KKwkJCQkJZlRETFNQcmVmT2ZmQ2hhbkJhbmR3aWR0aDsKKwkJCQlpZiAocFRkbHNQZWVyLT4KKwkJCQkgICAgb3BfY2xhc3NfZm9yX3ByZWZfb2ZmX2NoYW5faXNfc2V0KSB7CisJCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMucGVlckNhcC4KKwkJCQkJb3BDbGFzc0ZvclByZWZPZmZDaGFuSXNTZXQgPQorCQkJCQkJcFRkbHNQZWVyLT4KKwkJCQkJCW9wX2NsYXNzX2Zvcl9wcmVmX29mZl9jaGFuX2lzX3NldDsKKwkJCQkJc21lVGRsc1BlZXJTdGF0ZVBhcmFtcy5wZWVyQ2FwLgorCQkJCQlvcENsYXNzRm9yUHJlZk9mZkNoYW4gPQorCQkJCQkJcFRkbHNQZWVyLT4KKwkJCQkJCW9wX2NsYXNzX2Zvcl9wcmVmX29mZl9jaGFuOworCQkJCX0KKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSAgIiVzOiBQZWVyICIgTUFDX0FERFJFU1NfU1RSCisJCQkJCSAgInZkZXZJZDogJWQsIHBlZXJTdGF0ZTogJWQsIGlzUGVlclJlc3BvbmRlcjogJWQsIHVhcHNkUXVldWVzOiAweCV4LCBtYXhTcDogMHgleCwgcGVlckJ1ZmZTdGFTdXBwb3J0OiAlZCwgcGVlck9mZkNoYW5TdXBwb3J0OiAlZCwgcGVlckN1cnJPcGVyQ2xhc3M6ICVkLCBzZWxmQ3Vyck9wZXJDbGFzczogJWQsIHBlZXJDaGFuTGVuOiAlZCwgcGVlck9wZXJDbGFzc0xlbjogJWQsIHByZWZPZmZDaGFuTnVtOiAlZCwgcHJlZk9mZkNoYW5CYW5kd2lkdGg6ICVkLCBvcF9jbGFzc19mb3JfcHJlZl9vZmZfY2hhbl9pc19zZXQ6ICVkLCBvcF9jbGFzc19mb3JfcHJlZl9vZmZfY2hhbjogJWQiLAorCQkJCQkgIF9fZnVuY19fLAorCQkJCQkgIE1BQ19BRERSX0FSUkFZKHBlZXIpLAorCQkJCQkgIHNtZVRkbHNQZWVyU3RhdGVQYXJhbXMudmRldklkLAorCQkJCQkgIHNtZVRkbHNQZWVyU3RhdGVQYXJhbXMuCisJCQkJCSAgcGVlclN0YXRlLAorCQkJCQkgIHNtZVRkbHNQZWVyU3RhdGVQYXJhbXMuCisJCQkJCSAgcGVlckNhcC5pc1BlZXJSZXNwb25kZXIsCisJCQkJCSAgc21lVGRsc1BlZXJTdGF0ZVBhcmFtcy4KKwkJCQkJICBwZWVyQ2FwLnBlZXJVYXBzZFF1ZXVlLAorCQkJCQkgIHNtZVRkbHNQZWVyU3RhdGVQYXJhbXMuCisJCQkJCSAgcGVlckNhcC5wZWVyTWF4U3AsCisJCQkJCSAgc21lVGRsc1BlZXJTdGF0ZVBhcmFtcy4KKwkJCQkJICBwZWVyQ2FwLnBlZXJCdWZmU3RhU3VwcG9ydCwKKwkJCQkJICBzbWVUZGxzUGVlclN0YXRlUGFyYW1zLgorCQkJCQkgIHBlZXJDYXAucGVlck9mZkNoYW5TdXBwb3J0LAorCQkJCQkgIHNtZVRkbHNQZWVyU3RhdGVQYXJhbXMuCisJCQkJCSAgcGVlckNhcC5wZWVyQ3Vyck9wZXJDbGFzcywKKwkJCQkJICBzbWVUZGxzUGVlclN0YXRlUGFyYW1zLgorCQkJCQkgIHBlZXJDYXAuc2VsZkN1cnJPcGVyQ2xhc3MsCisJCQkJCSAgc21lVGRsc1BlZXJTdGF0ZVBhcmFtcy4KKwkJCQkJICBwZWVyQ2FwLnBlZXJDaGFuTGVuLAorCQkJCQkgIHNtZVRkbHNQZWVyU3RhdGVQYXJhbXMuCisJCQkJCSAgcGVlckNhcC5wZWVyT3BlckNsYXNzTGVuLAorCQkJCQkgIHNtZVRkbHNQZWVyU3RhdGVQYXJhbXMuCisJCQkJCSAgcGVlckNhcC5wcmVmT2ZmQ2hhbk51bSwKKwkJCQkJICBzbWVUZGxzUGVlclN0YXRlUGFyYW1zLgorCQkJCQkgIHBlZXJDYXAucHJlZk9mZkNoYW5CYW5kd2lkdGgsCisJCQkJCSAgcFRkbHNQZWVyLT4KKwkJCQkJICBvcF9jbGFzc19mb3JfcHJlZl9vZmZfY2hhbl9pc19zZXQsCisJCQkJCSAgcFRkbHNQZWVyLT4KKwkJCQkJICBvcF9jbGFzc19mb3JfcHJlZl9vZmZfY2hhbik7CisKKwkJCQlmb3IgKGkgPSAwOworCQkJCSAgICAgaSA8CisJCQkJICAgICBwVGRsc1BlZXItPnN1cHBvcnRlZF9jaGFubmVsc19sZW47CisJCQkJICAgICBpKyspIHsKKwkJCQkJc21lVGRsc1BlZXJTdGF0ZVBhcmFtcy5wZWVyQ2FwLgorCQkJCQlwZWVyQ2hhbltpXSA9CisJCQkJCQlwVGRsc1BlZXItPgorCQkJCQkJc3VwcG9ydGVkX2NoYW5uZWxzW2ldOworCQkJCX0KKwkJCQlzbWVUZGxzUGVlclN0YXRlUGFyYW1zLnBlZXJDYXAuCisJCQkJcGVlck9wZXJDbGFzc0xlbiA9CisJCQkJCXBUZGxzUGVlci0+CisJCQkJCXN1cHBvcnRlZF9vcGVyX2NsYXNzZXNfbGVuOworCQkJCWZvciAoaSA9IDA7CisJCQkJICAgICBpIDwKKwkJCQkgICAgIHBUZGxzUGVlci0+CisJCQkJICAgICBzdXBwb3J0ZWRfb3Blcl9jbGFzc2VzX2xlbjsgaSsrKSB7CisJCQkJCXNtZVRkbHNQZWVyU3RhdGVQYXJhbXMucGVlckNhcC4KKwkJCQkJcGVlck9wZXJDbGFzc1tpXSA9CisJCQkJCQlwVGRsc1BlZXItPgorCQkJCQkJc3VwcG9ydGVkX29wZXJfY2xhc3Nlc1tpXTsKKwkJCQl9CisKKwkJCQljZGZfcmV0X3N0YXR1cyA9CisJCQkJCXNtZV91cGRhdGVfdGRsc19wZWVyX3N0YXRlKHBIZGRDdHgtPgorCQkJCQkJCQkgICBoSGFsLAorCQkJCQkJCQkgICAmc21lVGRsc1BlZXJTdGF0ZVBhcmFtcyk7CisJCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkJCSAgICBjZGZfcmV0X3N0YXR1cykgeworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJCSAgIiVzOiBzbWVfdXBkYXRlX3RkbHNfcGVlcl9zdGF0ZSBmYWlsZWQgZm9yICIKKwkJCQkJCSAgTUFDX0FERFJFU1NfU1RSLAorCQkJCQkJICBfX2Z1bmNfXywKKwkJCQkJCSAgTUFDX0FERFJfQVJSQVkocGVlcikpOworCQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQl3bGFuX2hkZF90ZGxzX2luY3JlbWVudF9wZWVyX2NvdW50CisJCQkJCShwQWRhcHRlcik7CisJCQl9CisKKwkJCS8qIFVwZGF0ZSBUTCBhYm91dCB0aGUgVUFQU0QgbWFza3MgLCB0byByb3V0ZSB0aGUgcGFja2V0cyB0byBmaXJtd2FyZSAqLworCQkJaWYgKCh0cnVlID09CisJCQkgICAgIHBIZGRDdHgtPmNvbmZpZy0+ZkVuYWJsZVRETFNCdWZmZXJTdGEpCisJCQkgICAgfHwgcEhkZEN0eC0+Y29uZmlnLT5mVERMU1VhcHNkTWFzaykgeworCQkJCWludCBhYzsKKwkJCQl1aW50OF90IHVjQWNbNF0gPSB7IFNNRV9BQ19WTywKKwkJCQkJCSAgICBTTUVfQUNfVkksCisJCQkJCQkgICAgU01FX0FDX0JLLAorCQkJCQkJICAgIFNNRV9BQ19CRX07CisJCQkJdWludDhfdCB0bFRpZFs0XSA9IHsgNywgNSwgMiwgMyB9OworCQkJCWZvciAoYWMgPSAwOyBhYyA8IDQ7IGFjKyspIHsKKwkJCQkJc3RhdHVzID0gc21lX2VuYWJsZV91YXBzZF9mb3JfYWMoCisJCQkJCQkgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cGNkc19jb250ZXh0LAorCQkJCQkJIHBUZGxzUGVlci0+c3RhSWQsIHVjQWNbYWNdLAorCQkJCQkJIHRsVGlkW2FjXSwgdGxUaWRbYWNdLCAwLCAwLAorCQkJCQkJIFNNRV9CSV9ESVIsIDEsCisJCQkJCQkgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCSBwSGRkQ3R4LT5jb25maWctPkRlbGF5ZWRUcmlnZ2VyRnJtSW50KTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKwlicmVhazsKKwljYXNlIE5MODAyMTFfVERMU19ESVNBQkxFX0xJTks6CisJeworCQlwVGRsc1BlZXIgPQorCQkJd2xhbl9oZGRfdGRsc19maW5kX3BlZXIocEFkYXB0ZXIsIHBlZXIsIHRydWUpOworCisJCWlmIChOVUxMID09IHBUZGxzUGVlcikgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBwZWVyIG1hdGNoaW5nICIgTUFDX0FERFJFU1NfU1RSCisJCQkJICAiIG5vdCBmb3VuZCwgaWdub3JlIE5MODAyMTFfVERMU19ESVNBQkxFX0xJTksiLAorCQkJCSAgX19mdW5jX18sIE1BQ19BRERSX0FSUkFZKHBlZXIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTkw4MDIxMV9URExTX0RJU0FCTEVfTElOSyBmb3IgcGVlciAiCisJCQkgIE1BQ19BRERSRVNTX1NUUiAiIGxpbmtfc3RhdHVzOiAlZCIsCisJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWShwZWVyKSwKKwkJCSAgcFRkbHNQZWVyLT5saW5rX3N0YXR1cyk7CisKKwkJaWYgKFRETFNfU1RBX0lOREVYX1ZBTElEKHBUZGxzUGVlci0+c3RhSWQpKSB7CisJCQl1bnNpZ25lZCBsb25nIHJjOworCisJCQlJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPgorCQkJCQl0ZGxzX2RlbF9zdGF0aW9uX2NvbXApOworCisJCQlzbWVfZGVsZXRlX3RkbHNfcGVlcl9zdGEoV0xBTl9IRERfR0VUX0hBTF9DVFgKKwkJCQkJCQkgKHBBZGFwdGVyKSwKKwkJCQkJCSBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJIHBlZXIpOworCisJCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcEFkYXB0ZXItPgorCQkJCQkJCSB0ZGxzX2RlbF9zdGF0aW9uX2NvbXAsCisJCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCQkJIChXQUlUX1RJTUVfVERMU19ERUxfU1RBKSk7CisJCQlpZiAoIXJjKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiJXM6IERlbCBzdGF0aW9uIHRpbWVkIG91dCIsCisJCQkJCSAgX19mdW5jX18pOworCQkJCXJldHVybiAtRVBFUk07CisJCQl9CisJCQl3bGFuX2hkZF90ZGxzX3NldF9wZWVyX2xpbmtfc3RhdHVzKHBUZGxzUGVlciwKKwkJCQkJCWVURExTX0xJTktfSURMRSwKKwkJCQkJCShwVGRsc1BlZXItPmxpbmtfc3RhdHVzID09CisJCQkJCQkJZVRETFNfTElOS19URUFSSU5HKSA/CisJCQkJCQllVERMU19MSU5LX1VOU1BFQ0lGSUVEIDoKKwkJCQkJCWVURExTX0xJTktfRFJPUFBFRF9CWV9SRU1PVEUpOworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBURExTIFBlZXIgU3RhdGlvbiBkb2Vzbid0IGV4aXN0LiIsCisJCQkJICBfX2Z1bmNfXyk7CisJCX0KKwl9CisJYnJlYWs7CisJY2FzZSBOTDgwMjExX1RETFNfVEVBUkRPV046CisJeworCQlzdGF0dXMgPQorCQkJd2xhbl9oZGRfdGRsc19leHRjdHJsX2RlY29uZmlnX3BlZXIocEFkYXB0ZXIsIHBlZXIpOworCisJCWlmICgwICE9IHN0YXR1cykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBFcnJvciBpbiBURExTIFRlYXJkb3duIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisJYnJlYWs7CisJY2FzZSBOTDgwMjExX1RETFNfU0VUVVA6CisJeworCQlzdGF0dXMgPSB3bGFuX2hkZF90ZGxzX2V4dGN0cmxfY29uZmlnX3BlZXIocEFkYXB0ZXIsCisJCQkJcGVlciwgTlVMTCwKKwkJCQlwSGRkQ3R4LT5jb25maWctPmZURExTUHJlZk9mZkNoYW5OdW0sIDAsIDAsIDApOworCQlpZiAoMCAhPSBzdGF0dXMpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogRXJyb3IgaW4gVERMUyBTZXR1cCIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisJYnJlYWs7CisJY2FzZSBOTDgwMjExX1RETFNfRElTQ09WRVJZX1JFUToKKwkJLyogV2UgZG9uJ3Qgc3VwcG9ydCBpbi1kcml2ZXIgc2V0dXAvdGVhcmRvd24vZGlzY292ZXJ5ICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkgICIlczogV2UgZG9uJ3Qgc3VwcG9ydCBpbi1kcml2ZXIgc2V0dXAvdGVhcmRvd24vZGlzY292ZXJ5IiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT1RTVVBQOworCWRlZmF1bHQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHVuc3VwcG9ydGVkIGV2ZW50IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9jZmc4MDIxMV90ZGxzX29wZXIoKSAtIGhhbmRsZSBjZmc4MDIxMSBvcGVyYXRpb24gb24gYW4gVERMUyBwZWVyCisgKiBAd2lwaHk6IHdpcGh5CisgKiBAZGV2OiBuZXQgZGV2aWNlCisgKiBAcGVlcjogTUFDIGFkZHJlc3Mgb2YgdGhlIFRETFMgcGVlcgorICogQG9wZXI6IGNmZzgwMjExIFRETFMgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19vcGVyKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQljb25zdCB1aW50OF90ICpwZWVyLAorCQkJCWVudW0gbmw4MDIxMV90ZGxzX29wZXJhdGlvbiBvcGVyKQorI2Vsc2UKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV90ZGxzX29wZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXVpbnQ4X3QgKnBlZXIsCisJCQkJZW51bSBubDgwMjExX3RkbHNfb3BlcmF0aW9uIG9wZXIpCisjZW5kaWYKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX3dsYW5faGRkX2NmZzgwMjExX3RkbHNfb3Blcih3aXBoeSwgZGV2LCBwZWVyLCBvcGVyKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdsYW5faGRkX2NmZzgwMjExX3NlbmRfdGRsc19kaXNjb3Zlcl9yZXEoKSAtIHNlbmQgb3V0IFRETFMgZGlzY292ZXJ5IGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBURExTIHBlZXIKKyAqIEB3aXBoeTogd2lwaHkKKyAqIEBkZXY6IG5ldCBkZXZpY2UKKyAqIEBwZWVyOiBNQUMgYWRkcmVzcyBvZiB0aGUgcGVlcgorICoKKyAqIFJldHVybjogMCBpZiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3NlbmRfdGRsc19kaXNjb3Zlcl9yZXEoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqcGVlcikKK3sKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJICAgICAgICJ0ZGxzIHNlbmQgZGlzY292ZXIgcmVxOiAiIE1BQ19BRERSRVNTX1NUUiwKKwkgICAgICAgTUFDX0FERFJfQVJSQVkocGVlcikpOworI2lmIFRETFNfTUdNVF9WRVJTSU9OMgorCXJldHVybiB3bGFuX2hkZF9jZmc4MDIxMV90ZGxzX21nbXQod2lwaHksIGRldiwgcGVlciwKKwkJCQkJICAgV0xBTl9URExTX0RJU0NPVkVSWV9SRVFVRVNULCAxLCAwLCAwLAorCQkJCQkgICBOVUxMLCAwKTsKKyNlbHNlCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNywgMCkpCisJcmV0dXJuIHdsYW5faGRkX2NmZzgwMjExX3RkbHNfbWdtdCh3aXBoeSwgZGV2LCBwZWVyLAorCQkJCQkgICBXTEFOX1RETFNfRElTQ09WRVJZX1JFUVVFU1QsIDEsIDAsCisJCQkJCSAgIDAsIDAsIE5VTEwsIDApOworI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNiwgMCkpCisJcmV0dXJuIHdsYW5faGRkX2NmZzgwMjExX3RkbHNfbWdtdCh3aXBoeSwgZGV2LCBwZWVyLAorCQkJCQkgICBXTEFOX1RETFNfRElTQ09WRVJZX1JFUVVFU1QsIDEsIDAsCisJCQkJCSAgIDAsIE5VTEwsIDApOworI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxNSwgMCkpCisJcmV0dXJuIHdsYW5faGRkX2NmZzgwMjExX3RkbHNfbWdtdCh3aXBoeSwgZGV2LCBwZWVyLAorCQkJCQkgICBXTEFOX1RETFNfRElTQ09WRVJZX1JFUVVFU1QsIDEsIDAsCisJCQkJCSAgIDAsIE5VTEwsIDApOworI2Vsc2UKKwlyZXR1cm4gd2xhbl9oZGRfY2ZnODAyMTFfdGRsc19tZ210KHdpcGh5LCBkZXYsIHBlZXIsCisJCQkJCSAgIFdMQU5fVERMU19ESVNDT1ZFUllfUkVRVUVTVCwgMSwgMCwKKwkJCQkJICAgTlVMTCwgMCk7CisjZW5kaWYKKyNlbmRpZgorfQorCisjZW5kaWYgLyogRW5kIG9mIEZFQVRVUkVfV0xBTl9URExTICovCisKKy8qKgorICogd2xhbl9oZGRfdGRsc19maW5kX2ZpcnN0X2Nvbm5lY3RlZF9wZWVyKCkgLSBmaW5kIHRoZSAxc3QgY29ubmVjdGVkIHRkbHMgcGVlcgorICogQGFkYXB0ZXI6IFBvaW50ZXIgdG8gdGhlIEhERCBhZGFwdGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBzZWFyY2hzIGZvciB0aGUgMXN0IGNvbm5lY3RlZCBURExTIHBlZXIKKyAqCisgKiBSZXR1cm46IFRoZSBmaXJzdCBjb25uZWN0ZWQgVERMUyBwZWVyIGlmIGZvdW5kOyBOVUxMIG90aGVyd2lzZQorICovCitoZGRUZGxzUGVlcl90ICp3bGFuX2hkZF90ZGxzX2ZpbmRfZmlyc3RfY29ubmVjdGVkX3BlZXIoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwloZGRUZGxzUGVlcl90ICpjdXJyX3BlZXIgPSBOVUxMOworCXRkbHNDdHhfdCAqaGRkX3RkbHNfY3R4OworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCisJaWYgKDAgIT0gKHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCkpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiaGRkX2N0eCBpcyBub3QgdmFsaWQiKSk7CisJCXJldHVybiBOVUxMOworCX0KKwltdXRleF9sb2NrKCZoZGRfY3R4LT50ZGxzX2xvY2spOworCWhkZF90ZGxzX2N0eCA9IFdMQU5fSEREX0dFVF9URExTX0NUWF9QVFIoYWRhcHRlcik7CisJaWYgKE5VTEwgPT0gaGRkX3RkbHNfY3R4KSB7CisJCW11dGV4X3VubG9jaygmaGRkX2N0eC0+dGRsc19sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCBURExTX1BFRVJfTElTVF9TSVpFOyBpKyspIHsKKwkJaGVhZCA9ICZoZGRfdGRsc19jdHgtPnBlZXJfbGlzdFtpXTsKKwkJbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIHsKKwkJCWN1cnJfcGVlciA9IGxpc3RfZW50cnkocG9zLCBoZGRUZGxzUGVlcl90LCBub2RlKTsKKwkJCWlmIChjdXJyX3BlZXIgJiYgKGN1cnJfcGVlci0+bGlua19zdGF0dXMgPT0KKwkJCQkJZVRETFNfTElOS19DT05ORUNURUQpKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZoZGRfY3R4LT50ZGxzX2xvY2spOworCQkJCWhkZExvZyhMT0cxLAorCQkJCQlGTChNQUNfQUREUkVTU19TVFIKKwkJCQkJICAgIiBlVERMU19MSU5LX0NPTk5FQ1RFRCIKKwkJCQkJKSwKKwkJCQkJTUFDX0FERFJfQVJSQVkoY3Vycl9wZWVyLT5wZWVyTWFjKSk7CisJCQkJcmV0dXJuIGN1cnJfcGVlcjsKKwkJCX0KKwkJfQorCX0KKwltdXRleF91bmxvY2soJmhkZF9jdHgtPnRkbHNfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogaGRkX3NldF90ZGxzX29mZmNoYW5uZWwoKSAtIHNldCB0ZGxzIG9mZi1jaGFubmVsIG51bWJlcgorICogQGFkYXB0ZXI6IFBvaW50ZXIgdG8gdGhlIEhERCBhZGFwdGVyCisgKiBAb2ZmY2hhbm1vZGU6IHRkbHMgb2ZmLWNoYW5uZWwgbnVtYmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRkbHMgb2ZmLWNoYW5uZWwgbnVtYmVyCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitpbnQgaGRkX3NldF90ZGxzX29mZmNoYW5uZWwoaGRkX2NvbnRleHRfdCAqaGRkX2N0eCwgaW50IG9mZmNoYW5uZWwpCit7CisJaWYgKCh0cnVlID09IGhkZF9jdHgtPmNvbmZpZy0+ZkVuYWJsZVRETFNPZmZDaGFubmVsKSAmJgorCQkoZVRETFNfU1VQUE9SVF9FTkFCTEVEID09IGhkZF9jdHgtPnRkbHNfbW9kZSB8fAorCQllVERMU19TVVBQT1JUX0VYUExJQ0lUX1RSSUdHRVJfT05MWSA9PSBoZGRfY3R4LT50ZGxzX21vZGUpKSB7CisJCWlmIChvZmZjaGFubmVsIDwgQ0ZHX1RETFNfUFJFRkVSUkVEX09GRl9DSEFOTkVMX05VTV9NSU4gfHwKKwkJCW9mZmNoYW5uZWwgPiBDRkdfVERMU19QUkVGRVJSRURfT0ZGX0NIQU5ORUxfTlVNX01BWCkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIHRkbHMgb2ZmIGNoYW5uZWwgJXUiKSwKKwkJCQlvZmZjaGFubmVsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiRWl0aGVyIFRETFMgb3IgVERMUyBPZmYtY2hhbm5lbCBpcyBub3QgZW5hYmxlZCIpKTsKKwkJcmV0dXJuICAtRU5PVFNVUFA7CisJfQorCWhkZExvZyhMT0cxLAorCQlGTCgiY2hhbmdlIHRkbHMgb2ZmIGNoYW5uZWwgZnJvbSAlZCB0byAlZCIpLAorCQloZGRfY3R4LT50ZGxzX29mZl9jaGFubmVsLCBvZmZjaGFubmVsKTsKKwloZGRfY3R4LT50ZGxzX29mZl9jaGFubmVsID0gb2ZmY2hhbm5lbDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZGRfc2V0X3RkbHNfc2Vjb2ZmY2hhbm5lbG9mZnNldCgpIC0gc2V0IHNlY29uZGFyeSB0ZGxzIG9mZi1jaGFubmVsIG9mZnNldAorICogQGFkYXB0ZXI6IFBvaW50ZXIgdG8gdGhlIEhERCBhZGFwdGVyCisgKiBAb2ZmY2hhbm1vZGU6IHRkbHMgb2ZmLWNoYW5uZWwgb2Zmc2V0CisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIDJuZCB0ZGxzIG9mZi1jaGFubmVsIG9mZnNldAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworaW50IGhkZF9zZXRfdGRsc19zZWNvZmZjaGFubmVsb2Zmc2V0KGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsIGludCBvZmZjaGFub2Zmc2V0KQoreworCWlmICgodHJ1ZSA9PSBoZGRfY3R4LT5jb25maWctPmZFbmFibGVURExTT2ZmQ2hhbm5lbCkgJiYKKwkJKGVURExTX1NVUFBPUlRfRU5BQkxFRCA9PSBoZGRfY3R4LT50ZGxzX21vZGUgfHwKKwkJZVRETFNfU1VQUE9SVF9FWFBMSUNJVF9UUklHR0VSX09OTFkgPT0gaGRkX2N0eC0+dGRsc19tb2RlKSkgeworCQloZGRfY3R4LT50ZGxzX2NoYW5uZWxfb2Zmc2V0ID0gMDsKKworCQlzd2l0Y2ggKG9mZmNoYW5vZmZzZXQpIHsKKwkJY2FzZSBURExTX1NFQ19PRkZDSEFOX09GRlNFVF8wOgorCQkJaGRkX2N0eC0+dGRsc19jaGFubmVsX29mZnNldCA9ICgxIDw8IEJXXzIwX09GRlNFVF9CSVQpOworCQkJYnJlYWs7CisJCWNhc2UgVERMU19TRUNfT0ZGQ0hBTl9PRkZTRVRfNDBQTFVTOgorCQljYXNlIFRETFNfU0VDX09GRkNIQU5fT0ZGU0VUXzQwTUlOVVM6CisJCQloZGRfY3R4LT50ZGxzX2NoYW5uZWxfb2Zmc2V0ID0gKDEgPDwgQldfNDBfT0ZGU0VUX0JJVCk7CisJCQlicmVhazsKKwkJY2FzZSBURExTX1NFQ19PRkZDSEFOX09GRlNFVF84MDoKKwkJCWhkZF9jdHgtPnRkbHNfY2hhbm5lbF9vZmZzZXQgPSAoMSA8PCBCV184MF9PRkZTRVRfQklUKTsKKwkJCWJyZWFrOworCQljYXNlIFRETFNfU0VDX09GRkNIQU5fT0ZGU0VUXzE2MDoKKwkJCWhkZF9jdHgtPnRkbHNfY2hhbm5lbF9vZmZzZXQgPSAoMSA8PCBCV18xNjBfT0ZGU0VUX0JJVCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKAorCQkJCSAgICJJbnZhbGlkIHRkbHMgc2Vjb25kYXJ5IG9mZiBjaGFubmVsIG9mZnNldCAlZCIKKwkJCQkgICksCisJCQkJb2ZmY2hhbm9mZnNldCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSAvKiBlbmQgc3dpdGNoICovCisJfSBlbHNlIHsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiRWl0aGVyIFRETFMgb3IgVERMUyBPZmYtY2hhbm5lbCBpcyBub3QgZW5hYmxlZCIpKTsKKwkJcmV0dXJuICAtRU5PVFNVUFA7CisJfQorCWhkZExvZyhMT0cxLAorCQlGTCgiY2hhbmdlIHRkbHMgc2Vjb25kYXJ5IG9mZiBjaGFubmVsIG9mZnNldCB0byAweCV4IiksCisJCWhkZF9jdHgtPnRkbHNfY2hhbm5lbF9vZmZzZXQpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9zZXRfdGRsc19vZmZjaGFubmVsbW9kZSgpIC0gc2V0IHRkbHMgb2ZmLWNoYW5uZWwgbW9kZQorICogQGFkYXB0ZXI6IFBvaW50ZXIgdG8gdGhlIEhERCBhZGFwdGVyCisgKiBAb2ZmY2hhbm1vZGU6IHRkbHMgb2ZmLWNoYW5uZWwgbW9kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0ZGxzIG9mZi1jaGFubmVsIG1vZGUKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlCisgKi8KK2ludCBoZGRfc2V0X3RkbHNfb2ZmY2hhbm5lbG1vZGUoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciwgaW50IG9mZmNoYW5tb2RlKQoreworCWhkZFRkbHNQZWVyX3QgKmNvbm5fcGVlciA9IE5VTEw7CisJaGRkX3N0YXRpb25fY3R4X3QgKmhkZF9zdGFfY3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihhZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwlzbWVfdGRsc19jaGFuX3N3aXRjaF9wYXJhbXMgY2hhbl9zd2l0Y2hfcGFyYW1zOworCisJaWYgKG9mZmNoYW5tb2RlIDwgRU5BQkxFX0NIQU5TV0lUQ0ggfHwKKwkJCW9mZmNoYW5tb2RlID4gRElTQUJMRV9DSEFOU1dJVENIKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoIkludmFsaWQgdGRscyBvZmYgY2hhbm5lbCBtb2RlICVkIiksCisJCQlvZmZjaGFubW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IGhkZF9zdGFfY3R4LT5jb25uX2luZm8uY29ublN0YXRlKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoCisJCQkgICAidGRscyBvZmYgY2hhbm5lbCBtb2RlIHJlcSBpbiBub3QgYXNzb2NpYXRlZCBzdGF0ZSAlZCIKKwkJCSAgKSwKKwkJCW9mZmNoYW5tb2RlKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJaWYgKCh0cnVlID09IGhkZF9jdHgtPmNvbmZpZy0+ZkVuYWJsZVRETFNPZmZDaGFubmVsKSAmJgorCQkoZVRETFNfU1VQUE9SVF9FTkFCTEVEID09IGhkZF9jdHgtPnRkbHNfbW9kZSB8fAorCQllVERMU19TVVBQT1JUX0VYUExJQ0lUX1RSSUdHRVJfT05MWSA9PSBoZGRfY3R4LT50ZGxzX21vZGUpKSB7CisJCWNvbm5fcGVlciA9IHdsYW5faGRkX3RkbHNfZmluZF9maXJzdF9jb25uZWN0ZWRfcGVlcihhZGFwdGVyKTsKKwkJaWYgKE5VTEwgPT0gY29ubl9wZWVyKSB7CisJCQloZGRMb2coTE9HUCwKKwkJCQlGTCgiTm8gVERMUyBDb25uZWN0ZWQgUGVlciIpKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwl9IGVsc2UgeworCQloZGRMb2coTE9HUCwKKwkJCUZMKCJURExTIENvbm5lY3Rpb24gbm90IHN1cHBvcnRlZCIpKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisJaGRkTG9nKExPRzEsCisJCUZMKCJURExTIENoYW5uZWwgU3dpdGNoIGluIHN3bW9kZT0lZCIpLAorCQlvZmZjaGFubW9kZSk7CisKKwlzd2l0Y2ggKG9mZmNoYW5tb2RlKSB7CisJY2FzZSBFTkFCTEVfQ0hBTlNXSVRDSDoKKwljYXNlIERJU0FCTEVfQ0hBTlNXSVRDSDoKKwkJaGRkTG9nKExPRzEsCisJCQlGTCgKKwkJCSAgImNoYW5nZSB0ZGxzIG9mZiBjaGFubmVsIG1vZGUgJWQgdGRsc19vZmZfY2hhbm5lbCAlZCBvZmZjaGFub2Zmc2V0ICVkIgorCQkJICApLAorCQkJb2ZmY2hhbm1vZGUsIGhkZF9jdHgtPnRkbHNfb2ZmX2NoYW5uZWwsCisJCQloZGRfY3R4LT50ZGxzX2NoYW5uZWxfb2Zmc2V0KTsKKwkJaWYgKGhkZF9jdHgtPnRkbHNfb2ZmX2NoYW5uZWwgJiYgaGRkX2N0eC0+dGRsc19jaGFubmVsX29mZnNldCkgeworCQkJY2hhbl9zd2l0Y2hfcGFyYW1zLnZkZXZfaWQgPSBhZGFwdGVyLT5zZXNzaW9uSWQ7CisJCQljaGFuX3N3aXRjaF9wYXJhbXMudGRsc19vZmZfY2hhbm5lbCA9CisJCQkJaGRkX2N0eC0+dGRsc19vZmZfY2hhbm5lbDsKKwkJCWNoYW5fc3dpdGNoX3BhcmFtcy50ZGxzX29mZl9jaF9id19vZmZzZXQgPQorCQkJCWhkZF9jdHgtPnRkbHNfY2hhbm5lbF9vZmZzZXQ7CisJCQljaGFuX3N3aXRjaF9wYXJhbXMudGRsc19vZmZfY2hfbW9kZSA9IG9mZmNoYW5tb2RlOworCQkJY2hhbl9zd2l0Y2hfcGFyYW1zLmlzX3Jlc3BvbmRlciA9CisJCQkJY29ubl9wZWVyLT5pc19yZXNwb25kZXI7CisJCQljZGZfbWVtX2NvcHkoJmNoYW5fc3dpdGNoX3BhcmFtcy5wZWVyX21hY19hZGRyLAorCQkJCSAgICAgJmNvbm5fcGVlci0+cGVlck1hYywKKwkJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkJaGRkTG9nKExPRzEsCisJCQkJRkwoIlBlZXIgIiBNQUNfQUREUkVTU19TVFIKKwkJCQkgICAiIHZkZXZJZDogJWQsIG9mZiBjaGFubmVsOiAlZCwgb2Zmc2V0OiAlZCwgbW9kZTogJWQsIGlzX3Jlc3BvbmRlcjogJWQiCisJCQkJICApLAorCQkJCU1BQ19BRERSX0FSUkFZKGNoYW5fc3dpdGNoX3BhcmFtcy4KKwkJCQkJCXBlZXJfbWFjX2FkZHIpLAorCQkJCWNoYW5fc3dpdGNoX3BhcmFtcy52ZGV2X2lkLAorCQkJCWNoYW5fc3dpdGNoX3BhcmFtcy50ZGxzX29mZl9jaGFubmVsLAorCQkJCWNoYW5fc3dpdGNoX3BhcmFtcy50ZGxzX29mZl9jaF9id19vZmZzZXQsCisJCQkJY2hhbl9zd2l0Y2hfcGFyYW1zLnRkbHNfb2ZmX2NoX21vZGUsCisJCQkJY2hhbl9zd2l0Y2hfcGFyYW1zLmlzX3Jlc3BvbmRlcik7CisKKwkJCXNtZV9zZW5kX3RkbHNfY2hhbl9zd2l0Y2hfcmVxKAorCQkJCVdMQU5fSEREX0dFVF9IQUxfQ1RYKGFkYXB0ZXIpLAorCQkJCSZjaGFuX3N3aXRjaF9wYXJhbXMpOworCQl9IGVsc2UgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoCisJCQkJICAgIlRETFMgb2ZmLWNoYW5uZWwgcGFyYW1ldGVycyBhcmUgbm90IHNldCB5ZXQhISEiCisJCQkJKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQloZGRMb2coTE9HRSwKKwkJCUZMKAorCQkJICAgIkluY29ycmVjdCBQYXJhbWV0ZXJzIG1vZGU6ICVkIHRkbHNfb2ZmX2NoYW5uZWw6ICVkIG9mZmNoYW5vZmZzZXQ6ICVkIgorCQkJICApLAorCQkJb2ZmY2hhbm1vZGUsIGhkZF9jdHgtPnRkbHNfb2ZmX2NoYW5uZWwsCisJCQloZGRfY3R4LT50ZGxzX2NoYW5uZWxfb2Zmc2V0KTsKKwkJYnJlYWs7CisJfSAvKiBlbmQgc3dpdGNoICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX3NldF90ZGxzX3NjYW5fdHlwZSAtIHNldCBzY2FuIGR1cmluZyBhY3RpdmUgdGRscyBzZXNzaW9uCisgKiBAaGRkX2N0eDogcHRyIHRvIGhkZCBjb250ZXh0LgorICogQHZhbDogc2NhbiB0eXBlIHZhbHVlOiAwIG9yIDEuCisgKgorICogU2V0IHNjYW4gdHlwZSBkdXJpbmcgdGRscyBzZXNzaW9uLiBJZiBzZXQgdG8gMSwgdGhhdCBtZWFucyBkcml2ZXIKKyAqIHNoYWxsIG1haW50YWluIHRkbHMgbGluayBhbmQgYWxsb3cgc2NhbiByZWdhcmRsZXNzIGlmIHRkbHMgcGVlciBpcworICogYnVmZmVyIHN0YSBjYXBhYmxlIG9yIG5vdCBhbmQvb3IgaWYgZGV2aWNlIGlzIHNsZWVwIHN0YSBjYXBhYmxlIG9yCisgKiBub3QuIElmIHRkbHMgcGVlciBpcyBub3QgYnVmZmVyIHN0YSBjYXBhYmxlIHRoZW4gZHVyaW5nIHNjYW4gdGhlcmUKKyAqIHdpbGwgYmUgbG9zcyBvZiBSeCBwYWNrZXRzIGFuZCBUeCB3b3VsZCBzdG9wIHdoZW4gZGV2aWNlIG1vdmVzIGF3YXkKKyAqIGZyb20gdGRscyBjaGFubmVsLiBJZiBzZXQgdG8gMCwgdGhlbiBkcml2ZXIgc2hhbGwgdGVhcmRvd24gdGRscyBsaW5rCisgKiBiZWZvcmUgaW5pdGlhdGluZyBzY2FuIGlmIHBlZXIgaXMgbm90IGJ1ZmZlciBzdGEgY2FwYWJsZSBhbmQgZGV2aWNlCisgKiBpcyBub3Qgc2xlZXAgc3RhIGNhcGFibGUuIEJ5IGRlZmF1bHQsIHNjYW4gdHlwZSBpcyBzZXQgdG8gMC4KKyAqCisgKiBSZXR1cm46IHN1Y2Nlc3MgKDApIG9yIGZhaWx1cmUgKGVycm5vIHZhbHVlKQorICovCitpbnQgaGRkX3NldF90ZGxzX3NjYW5fdHlwZShoZGRfY29udGV4dF90ICpoZGRfY3R4LCBpbnQgdmFsKQoreworCWlmICgodmFsICE9IDApICYmICh2YWwgIT0gMSkpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJJbmNvcnJlY3QgdmFsdWUgb2YgdGRscyBzY2FuIHR5cGU6ICVkIiksCisJCSAgICAgICB2YWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQloZGRfY3R4LT5jb25maWctPmVuYWJsZV90ZGxzX3NjYW4gPSB2YWw7CisJCXJldHVybiAwOworCX0KK30KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF90cmFjZS5jIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyNWZiMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF90cmFjZS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZmRlZiBIRERfVFJBQ0VfUkVDT1JECisKKy8qKgorICogRE9DOiB3bGFuX2hkZF90cmFjZS5jCisgKgorICogV0xBTiBIb3N0IERldmljZSBEcml2ZXIgdHJhY2UgaW1wbGVtZW50YXRpb24KKyAqCisgKi8KKworI2luY2x1ZGUgImNkZl90cmFjZS5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgIndsYW5faGRkX3RyYWNlLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorCisvKioKKyAqIGhkZF90cmFjZV9kdW1wKCkgLSBEdW1wIGFuIEhERC1zcGVjaWZpYyB0cmFjZSByZWNvcmQKKyAqIEBtYWM6ICh1bnVzZWQpIGdsb2JhbCBNQUMgaGFuZGxlCisgKiBAcmVjb3JkOiB0cmFjZSByZWNvcmQgdGhhdCB3YXMgcHJldmlvdXNseSByZWNvcmRlZAorICogQGluZGV4OiBpbmRleCBvZiB0aGUgdHJhY2UgcmVjb3JkCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCitoZGRfdHJhY2VfZHVtcCh2b2lkICptYWMsIHRwX2NkZl90cmFjZV9yZWNvcmQgcmVjb3JkLCB1aW50MTZfdCBpbmRleCkKK3sKKwloZGRMb2coTE9HRSwgIiUwNGQgICAgJTAxMmxsdSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSAiLAorCSAgICAgICBpbmRleCwgcmVjb3JkLT50aW1lLCByZWNvcmQtPnNlc3Npb24sCisJICAgICAgICJIREQgRXZlbnQ6IiwgaGRkX3RyYWNlX2V2ZW50X3N0cmluZyhyZWNvcmQtPmNvZGUpLAorCSAgICAgICByZWNvcmQtPmRhdGEpOworfQorCisvKioKKyAqIGhkZF90cmFjZV9pbml0KCkgLSBIREQgdHJhY2Ugc3Vic3lzdGVtIGluaXRpYWxpemF0aW9uCisgKgorICogUmVnaXN0ZXJzIEhERCB3aXRoIHRoZSBkZWJ1ZyB0cmFjZSBzdWJzeXN0ZW0KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfdHJhY2VfaW5pdCh2b2lkKQoreworCWNkZl90cmFjZV9yZWdpc3RlcihDREZfTU9EVUxFX0lEX0hERCwgaGRkX3RyYWNlX2R1bXApOworfQorCisjZW5kaWYgLyogaWZkZWYgSEREX1RSQUNFX1JFQ09SRCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oZGQvc3JjL3dsYW5faGRkX3R4X3J4LmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfdHhfcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWEyZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX3R4X3J4LmMKQEAgLTAsMCArMSwxMDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogd2xhbl9oZGRfdHhfcnguYworICoKKyAqIExpbnV4IEhERCBUeC9SWCBBUElzCisgKi8KKworI2luY2x1ZGUgPHdsYW5faGRkX3R4X3J4Lmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfc29mdGFwX3R4X3J4Lmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfbmFwaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8Y2RzX3NjaGVkLmg+CisKKyNpbmNsdWRlIDx3bGFuX2hkZF9wMnAuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KKyNpbmNsdWRlICJzYXBfYXBpLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfd21tLmgiCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworI2luY2x1ZGUgIndsYW5faGRkX3RkbHMuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHdsYW5faGRkX2lwYS5oPgorCisjaW5jbHVkZSAid2xhbl9oZGRfb2NiLmgiCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9scm8uaCIKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyNkZWZpbmUgSEREX0VBUE9MX0VUSEVSX1RZUEUgICAgICAgICAgICAgKDB4ODg4RSkKKyNkZWZpbmUgSEREX0VBUE9MX0VUSEVSX1RZUEVfT0ZGU0VUICAgICAgKDEyKQorI2RlZmluZSBIRERfRUFQT0xfUEFDS0VUX1RZUEVfT0ZGU0VUICAgICAoMTUpCisjZGVmaW5lIEhERF9FQVBPTF9LRVlfSU5GT19PRkZTRVQgICAgICAgICgxOSkKKyNkZWZpbmUgSEREX0VBUE9MX0RFU1RfTUFDX09GRlNFVCAgICAgICAgKDApCisjZGVmaW5lIEhERF9FQVBPTF9TUkNfTUFDX09GRlNFVCAgICAgICAgICg2KQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworY29uc3QgdWludDhfdCBoZGRfd21tX2FjX3RvX2hpZ2hlc3RfdXBbXSA9IHsKKwlTTUVfUU9TX1dNTV9VUF9SRVNWLAorCVNNRV9RT1NfV01NX1VQX0VFLAorCVNNRV9RT1NfV01NX1VQX1ZJLAorCVNNRV9RT1NfV01NX1VQX05DCit9OworCisvKiBNYXBwaW5nIExpbnV4IEFDIGludGVycHJldGF0aW9uIHRvIFNNRSBBQy4gKi8KK2NvbnN0IHVpbnQ4X3QgaGRkX3FkaXNjX2FjX3RvX3RsX2FjW10gPSB7CisJU01FX0FDX1ZPLAorCVNNRV9BQ19WSSwKKwlTTUVfQUNfQkUsCisJU01FX0FDX0JLLAorfTsKKworI2lmZGVmIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MCisvKioKKyAqIGhkZF90eF9yZXN1bWVfdGltZXJfZXhwaXJlZF9oYW5kbGVyKCkgLSBUWCBRIHJlc3VtZSB0aW1lciBoYW5kbGVyCisgKiBAYWRhcHRlcl9jb250ZXh0OiBwb2ludGVyIHRvIHZkZXYgYWRhcHRlcgorICoKKyAqIElmIEJsb2NrZWQgT1MgUSBpcyBub3QgcmVzdW1lZCBkdXJpbmcgdGltZW91dCBwZXJpb2QsIHRvIHByZXZlbnQKKyAqIHBlcm1hbmVudCBzdGFsbCwgcmVzdW1lIE9TIFEgZm9yY2VmdWxseS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBoZGRfdHhfcmVzdW1lX3RpbWVyX2V4cGlyZWRfaGFuZGxlcih2b2lkICphZGFwdGVyX2NvbnRleHQpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCAqKSBhZGFwdGVyX2NvbnRleHQ7CisKKwlpZiAoIXBBZGFwdGVyKSB7CisJCS8qIElOVkFMSUQgQVJHICovCisJCXJldHVybjsKKwl9CisKKwloZGRMb2coTE9HMSwgRkwoIkVuYWJsaW5nIHF1ZXVlcyIpKTsKKwl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLCBXTEFOX1dBS0VfQUxMX05FVElGX1FVRVVFLAorCQkJCSAgIFdMQU5fQ09OVFJPTF9QQVRIKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogaGRkX3R4X3Jlc3VtZV9jYigpIC0gUmVzdW1lIE9TIFRYIFEuCisgKiBAYWRhcHRlcl9jb250ZXh0OiBwb2ludGVyIHRvIHZkZXYgYXBkYXB0ZXIKKyAqIEB0eF9yZXN1bWU6IFRYIFEgcmVzdW1lIHRyaWdnZXIKKyAqCisgKiBRIHdhcyBzdG9wcGVkIGR1ZSB0byBXTEFOIFRYIHBhdGggbG93IHJlc291cmNlIGNvbmRpdGlvbgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGhkZF90eF9yZXN1bWVfY2Iodm9pZCAqYWRhcHRlcl9jb250ZXh0LCBib29sIHR4X3Jlc3VtZSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IChoZGRfYWRhcHRlcl90ICopIGFkYXB0ZXJfY29udGV4dDsKKwloZGRfc3RhdGlvbl9jdHhfdCAqaGRkX3N0YV9jdHggPSBOVUxMOworCisJaWYgKCFwQWRhcHRlcikgeworCQkvKiBJTlZBTElEIEFSRyAqLworCQlyZXR1cm47CisJfQorCisJaGRkX3N0YV9jdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworCS8qIFJlc3VtZSBUWCAgKi8KKwlpZiAodHJ1ZSA9PSB0eF9yZXN1bWUpIHsKKwkJaWYgKENERl9USU1FUl9TVEFURV9TVE9QUEVEICE9CisJCSAgICBjZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoJnBBZGFwdGVyLT4KKwkJCQkJCSAgIHR4X2Zsb3dfY29udHJvbF90aW1lcikpIHsKKwkJCWNkZl9tY190aW1lcl9zdG9wKCZwQWRhcHRlci0+dHhfZmxvd19jb250cm9sX3RpbWVyKTsKKwkJfQorCQlpZiAoY2RmX3VubGlrZWx5KGhkZF9zdGFfY3R4LT5oZGRfUmVhc3NvY1NjZW5hcmlvKSkgeworCQkJaGRkTG9nKExPR1csCisJCQkgICAgICAgRkwoImZsb3cgY29udHJvbCwgdHggcXVldWVzIHVuLXBhdXNlIGF2b2lkZWQgYXMgd2UgYXJlIGluIFJFQVNTT0NJQVRJTkcgc3RhdGUiKSk7CisJCQkgICAgICAgcmV0dXJuOworCQl9CisJCWhkZExvZyhMT0cxLCBGTCgiRW5hYmxpbmcgcXVldWVzIikpOworCQl3bGFuX2hkZF9uZXRpZl9xdWV1ZV9jb250cm9sKHBBZGFwdGVyLAorCQkJCQkgV0xBTl9XQUtFX0FMTF9ORVRJRl9RVUVVRSwKKwkJCQkJIFdMQU5fREFUQV9GTE9XX0NPTlRST0wpOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19QRVJfVkRFVl9UWF9ERVNDX1BPT0wpCisJZWxzZSBpZiAoZmFsc2UgPT0gdHhfcmVzdW1lKSB7ICAgICAgLyogUGF1c2UgVFggICovCisJCWhkZExvZyhMT0cxLCBGTCgiRGlzYWJsaW5nIHF1ZXVlcyIpKTsKKwkJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChwQWRhcHRlciwKKwkJCQkJV0xBTl9TVE9QX0FMTF9ORVRJRl9RVUVVRSwKKwkJCQkJV0xBTl9EQVRBX0ZMT1dfQ09OVFJPTCk7CisJCWlmIChDREZfVElNRVJfU1RBVEVfU1RPUFBFRCA9PQorCQkgICAgY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKCZwQWRhcHRlci0+CisJCQkJCQkgICB0eF9mbG93X2NvbnRyb2xfdGltZXIpKSB7CisJCQlDREZfU1RBVFVTIHN0YXR1czsKKwkJCXN0YXR1cyA9CisJCQkJY2RmX21jX3RpbWVyX3N0YXJ0KCZwQWRhcHRlci0+dHhfZmxvd19jb250cm9sX3RpbWVyLAorCQkJCQkJICAgV0xBTl9IRERfVFhfRkxPV19DT05UUk9MX09TX1FfQkxPQ0tfVElNRSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgIiVzOiBGYWlsZWQgdG8gc3RhcnQgdHhfZmxvd19jb250cm9sX3RpbWVyIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQllbHNlCisJCQkJcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhmbG93X3RpbWVyX2NudCsrOworCQl9CisJCXBBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4Zmxvd19wYXVzZV9jbnQrKzsKKwkJcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMuaXNfdHhmbG93X3BhdXNlZCA9IHRydWU7CisJfQorI2VuZGlmCisKKwlyZXR1cm47Cit9CisKKy8qKgorICogaGRkX3JlZ2lzdGVyX3R4X2Zsb3dfY29udHJvbCgpIC0gUmVnaXN0ZXIgVFggRmxvdyBjb250cm9sCisgKiBAYWRhcHRlcjogYWRhcHRlciBoYW5kbGUKKyAqIEB0aW1lcl9jYWxsYmFjazogdGltZXIgY2FsbGJhY2sKKyAqIEBmbG93X2NvbnRyb2xfZnA6IHR4cnggZmxvdyBjb250cm9sCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaGRkX3JlZ2lzdGVyX3R4X2Zsb3dfY29udHJvbChoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCQljZGZfbWNfdGltZXJfY2FsbGJhY2tfdCB0aW1lcl9jYWxsYmFjaywKKwkJb2xfdHhyeF90eF9mbG93X2NvbnRyb2xfZnAgZmxvd19jb250cm9sX2ZwKQoreworCWlmIChhZGFwdGVyLT50eF9mbG93X3RpbWVyX2luaXRpYWxpemVkID09IGZhbHNlKSB7CisJCWNkZl9tY190aW1lcl9pbml0KCZhZGFwdGVyLT50eF9mbG93X2NvbnRyb2xfdGltZXIsCisJCQkgIENERl9USU1FUl9UWVBFX1NXLAorCQkJICB0aW1lcl9jYWxsYmFjaywKKwkJCSAgYWRhcHRlcik7CisJCWFkYXB0ZXItPnR4X2Zsb3dfdGltZXJfaW5pdGlhbGl6ZWQgPSB0cnVlOworCX0KKwlvbF90eHJ4X3JlZ2lzdGVyX3R4X2Zsb3dfY29udHJvbChhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCWZsb3dfY29udHJvbF9mcCwKKwkJCQkJYWRhcHRlcik7CisKK30KKworLyoqCisgKiBoZGRfZGVyZWdpc3Rlcl90eF9mbG93X2NvbnRyb2woKSAtIERlcmVnaXN0ZXIgVFggRmxvdyBjb250cm9sCisgKiBAYWRhcHRlcjogYWRhcHRlciBoYW5kbGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfZGVyZWdpc3Rlcl90eF9mbG93X2NvbnRyb2woaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlvbF90eHJ4X2RlcmVnaXN0ZXJfdHhfZmxvd19jb250cm9sX2NiKGFkYXB0ZXItPnNlc3Npb25JZCk7CisJaWYgKGFkYXB0ZXItPnR4X2Zsb3dfdGltZXJfaW5pdGlhbGl6ZWQgPT0gdHJ1ZSkgeworCQljZGZfbWNfdGltZXJfc3RvcCgmYWRhcHRlci0+dHhfZmxvd19jb250cm9sX3RpbWVyKTsKKwkJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJmFkYXB0ZXItPnR4X2Zsb3dfY29udHJvbF90aW1lcik7CisJCWFkYXB0ZXItPnR4X2Zsb3dfdGltZXJfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwl9Cit9CisKKy8qKgorICogaGRkX2dldF90eF9yZXNvdXJjZSgpIC0gY2hlY2sgdHggcmVzb3VyY2VzIGFuZCB0YWtlIGFjdGlvbgorICogQGFkYXB0ZXI6IGFkYXB0ZXIgaGFuZGxlCisgKiBAU1RBSWQ6IHN0YXRpb24gaWQKKyAqIEB0aW1lcl92YWx1ZTogdGltZXIgdmFsdWUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfZ2V0X3R4X3Jlc291cmNlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQl1aW50OF90IFNUQUlkLCB1aW50MTZfdCB0aW1lcl92YWx1ZSkKK3sKKwlpZiAoZmFsc2UgPT0KKwkgICAgb2xfdHhyeF9nZXRfdHhfcmVzb3VyY2UoU1RBSWQsCisJCQkJICAgYWRhcHRlci0+dHhfZmxvd19sb3dfd2F0ZXJtYXJrLAorCQkJCSAgIGFkYXB0ZXItPnR4X2Zsb3dfaGlnaF93YXRlcm1hcmtfb2Zmc2V0KSkgeworCQloZGRfaW5mbygiRGlzYWJsaW5nIHF1ZXVlcyBsd20gJWQgaHdtIG9mZnNldCAlZCIsCisJCQlhZGFwdGVyLT50eF9mbG93X2xvd193YXRlcm1hcmssCisJCQlhZGFwdGVyLT50eF9mbG93X2hpZ2hfd2F0ZXJtYXJrX29mZnNldCk7CisJCXdsYW5faGRkX25ldGlmX3F1ZXVlX2NvbnRyb2woYWRhcHRlciwgV0xBTl9TVE9QX0FMTF9ORVRJRl9RVUVVRSwKKwkJCQkJICAgICBXTEFOX0RBVEFfRkxPV19DT05UUk9MKTsKKwkJaWYgKChhZGFwdGVyLT50eF9mbG93X3RpbWVyX2luaXRpYWxpemVkID09IHRydWUpICYmCisJCSAgICAoQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQgPT0KKwkJICAgIGNkZl9tY190aW1lcl9nZXRfY3VycmVudF9zdGF0ZSgmYWRhcHRlci0+CisJCQkJCQkgICAgdHhfZmxvd19jb250cm9sX3RpbWVyKSkpIHsKKwkJCWNkZl9tY190aW1lcl9zdGFydCgmYWRhcHRlci0+dHhfZmxvd19jb250cm9sX3RpbWVyLAorCQkJCQkgICB0aW1lcl92YWx1ZSk7CisJCQlhZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4Zmxvd190aW1lcl9jbnQrKzsKKwkJCWFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhmbG93X3BhdXNlX2NudCsrOworCQkJYWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy5pc190eGZsb3dfcGF1c2VkID0gdHJ1ZTsKKwkJfQorCX0KK30KKworI2VuZGlmIC8qIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MICovCisKKy8qKgorICogd2xhbl9oZGRfaXNfZWFwb2woKSAtIEZ1bmN0aW9uIHRvIGNoZWNrIGlmIGZyYW1lIGlzIEVBUE9MIG9yIG5vdAorICogQHNrYjogICAgc2tiIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgZnJhbWUgaXMgYW4gRUFQT0wgZnJhbWUgb3Igbm90CisgKgorICogUmV0dXJuOiB0cnVlICgxKSBpZiBwYWNrZXQgaXMgRUFQT0wKKyAqCisgKi8KK3N0YXRpYyBib29sIHdsYW5faGRkX2lzX2VhcG9sKHN0cnVjdCBza19idWZmICpza2IpCit7CisJdWludDE2X3QgZXRoZXJfdHlwZTsKKworCWlmICghc2tiKSB7CisJCWhkZF9lcnIoRkwoInNrYiBpcyBOVUxMIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZXRoZXJfdHlwZSA9ICh1aW50MTZfdCkoKih1aW50MTZfdCAqKQorCQkJKHNrYi0+ZGF0YSArIEhERF9FVEhFUlRZUEVfODAyXzFfWF9GUkFNRV9PRkZTRVQpKTsKKworCWlmIChldGhlcl90eXBlID09IENERl9TV0FQX1UxNihIRERfRVRIRVJUWVBFXzgwMl8xX1gpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9pc19lYXBvbF9vcl93YWkoKSAtIENoZWNrIGlmIGZyYW1lIGlzIEVBUE9MIG9yIFdBUEkKKyAqIEBza2I6ICAgIHNrYiBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGZyYW1lIGlzIEVBUE9MIG9yIFdBUEkuCisgKiBzaW5nbGUgcm91dGluZSBjYWxsIHdpbGwgY2hlY2sgZm9yIGJvdGggdHlwZXMsIHRodXMgYXZvaWRpbmcKKyAqIGRhdGEgcGF0aCBwZXJmb3JtYW5jZSBwZW5hbHR5LgorICoKKyAqIFJldHVybjogdHJ1ZSAoMSkgaWYgcGFja2V0IGlzIEVBUE9MIG9yIFdBUEkKKyAqCisgKi8KK3N0YXRpYyBib29sIHdsYW5faGRkX2lzX2VhcG9sX29yX3dhaShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVpbnQxNl90IGV0aGVyX3R5cGU7CisKKwlpZiAoIXNrYikgeworCQloZGRfZXJyKEZMKCJza2IgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWV0aGVyX3R5cGUgPSAodWludDE2X3QpKCoodWludDE2X3QgKikKKwkJCShza2ItPmRhdGEgKyBIRERfRVRIRVJUWVBFXzgwMl8xX1hfRlJBTUVfT0ZGU0VUKSk7CisKKwlpZiAoZXRoZXJfdHlwZSA9PSBDREZfU1dBUF9VMTYoSEREX0VUSEVSVFlQRV84MDJfMV9YKSB8fAorCSAgICBldGhlcl90eXBlID09IENERl9TV0FQX1UxNihIRERfRVRIRVJUWVBFX1dBSSkpCisJCXJldHVybiB0cnVlOworCisJLyogTm8gZXJyb3IgbXNnIGhhbmRsZWQgc2luY2UgdGhpcyB3aWxsIGhhcHBlbiBvZnRlbiAqLworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBoZGRfaGFyZF9zdGFydF94bWl0KCkgLSBUcmFuc21pdCBhIGZyYW1lCisgKiBAc2tiOiBwb2ludGVyIHRvIE9TIHBhY2tldCAoc2tfYnVmZikKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKKyAqCisgKiBGdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggdGhlIExpbnV4IE9TIGZvciB0cmFuc21pdHRpbmcKKyAqIHBhY2tldHMuIFRoaXMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gZGlyZWN0bHkgcGFzc2VzCisgKiB0aGUgcGFja2V0IHRvIFRyYW5zcG9ydCBMYXllci4KKyAqCisgKiBSZXR1cm46IEFsd2F5cyByZXR1cm5zIE5FVERFVl9UWF9PSworICovCitpbnQgaGRkX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXNtZV9hY19lbnVtX3R5cGUgYWM7CisJc21lX1Fvc1dtbVVwVHlwZSB1cDsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWJvb2wgZ3JhbnRlZDsKKwl1aW50OF90IFNUQUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gJnBBZGFwdGVyLT5zZXNzaW9uQ3R4LnN0YXRpb247CisJdWludDhfdCBwcm90b190eXBlID0gMDsKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisJaGRkX2NvbnRleHRfdCAqaGRkQ3R4dCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworI2lmZGVmIFFDQV9XSUZJX0ZUTQorCWlmIChoZGRfZ2V0X2NvbnBhcmFtKCkgPT0gQ0RGX0ZUTV9NT0RFKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKyNlbmRpZgorCisJKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXRDYWxsZWQ7CisKKwlpZiAoV0xBTl9IRERfSUJTUyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHsKKwkJc3RydWN0IGNkZl9tYWNfYWRkciAqcERlc3RNYWNBZGRyZXNzID0KKwkJCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgc2tiLT5kYXRhOworCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJCQloZGRfaWJzc19nZXRfc3RhX2lkKCZwQWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLAorCQkJCQlwRGVzdE1hY0FkZHJlc3MsICZTVEFJZCkpCisJCQlTVEFJZCA9IEhERF9XTEFOX0lOVkFMSURfU1RBX0lEOworCisJCWlmICgoU1RBSWQgPT0gSEREX1dMQU5fSU5WQUxJRF9TVEFfSUQpICYmCisJCSAgICAoY2RmX2lzX21hY2FkZHJfYnJvYWRjYXN0KHBEZXN0TWFjQWRkcmVzcykgfHwKKwkJICAgICBjZGZfaXNfbWFjYWRkcl9ncm91cChwRGVzdE1hY0FkZHJlc3MpKSkgeworCQkJU1RBSWQgPSBJQlNTX0JST0FEQ0FTVF9TVEFJRDsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9EQVRBLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAiJXM6IEJDL01DIHBhY2tldCIsCisJCQkJICBfX2Z1bmNfXyk7CisJCX0gZWxzZSBpZiAoU1RBSWQgPT0gSEREX1dMQU5fSU5WQUxJRF9TVEFfSUQpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9EQVRBLCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkgICIlczogUmVjZWl2ZWQgVW5pY2FzdCBmcmFtZSB3aXRoIGludmFsaWQgc3RhSUQiLAorCQkJCSAgX19mdW5jX18pOworCQkJKytwQWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZDsKKwkJCSsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0RHJvcHBlZDsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwkJfQorCX0gZWxzZSB7CisJCVNUQUlkID0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdOworCX0KKworCisJaGRkX2dldF90eF9yZXNvdXJjZShwQWRhcHRlciwgU1RBSWQsCisJCQkJV0xBTl9IRERfVFhfRkxPV19DT05UUk9MX09TX1FfQkxPQ0tfVElNRSk7CisKKwkvKiBHZXQgVEwgQUMgY29ycmVzcG9uZGluZyB0byBRZGlzYyBxdWV1ZSBpbmRleC9BQy4gKi8KKwlhYyA9IGhkZF9xZGlzY19hY190b190bF9hY1tza2ItPnF1ZXVlX21hcHBpbmddOworCisJaWYgKCEoTkJVRl9PV05FUl9JRChza2IpID09IElQQV9OQlVGX09XTkVSX0lEKSkgeworCQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGhhcyBlbm91Z2ggaGVhZGVyIHJvb20gKi8KKwkJc2tiID0gc2tiX3Vuc2hhcmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpCisJCQlnb3RvIGRyb3BfcGt0OworCisJCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGRldi0+aGFyZF9oZWFkZXJfbGVuKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqdG1wOworCQkJdG1wID0gc2tiOworCQkJc2tiID0gc2tiX3JlYWxsb2NfaGVhZHJvb20odG1wLCBkZXYtPmhhcmRfaGVhZGVyX2xlbik7CisJCQlkZXZfa2ZyZWVfc2tiKHRtcCk7CisJCQlpZiAoIXNrYikKKwkJCQlnb3RvIGRyb3BfcGt0OworCQl9CisJfQorCisJLyogdXNlciBwcmlvcml0eSBmcm9tIElQIGhlYWRlciwgd2hpY2ggaXMgYWxyZWFkeSBleHRyYWN0ZWQgYW5kIHNldCBmcm9tCisJICogc2VsZWN0X3F1ZXVlIGNhbGwgYmFjayBmdW5jdGlvbgorCSAqLworCXVwID0gc2tiLT5wcmlvcml0eTsKKworCSsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0Q2xhc3NpZmllZEFDW2FjXTsKKyNpZmRlZiBIRERfV01NX0RFQlVHCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX0RBVEEsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJICAiJXM6IENsYXNzaWZpZWQgYXMgYWMgJWQgdXAgJWQiLCBfX2Z1bmNfXywgYWMsIHVwKTsKKyNlbmRpZiAvKiBIRERfV01NX0RFQlVHICovCisKKwlpZiAoSEREX1BTQl9DSEFOR0VEID09IHBBZGFwdGVyLT5wc2JDaGFuZ2VkKSB7CisJCS8qIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIGFjcXVpcmUgYWRtaXR0YW5jZSBmb3IgYQorCQkgKiBXTU0gQUMgaXMgcmVxdWlyZWQgb3Igbm90IGJhc2VkIG9uIHBzYiBjb25maWd1cmF0aW9uIGRvbmUKKwkJICogaW4gdGhlIGZyYW1ld29yaworCQkgKi8KKwkJaGRkX3dtbV9hY3F1aXJlX2FjY2Vzc19yZXF1aXJlZChwQWRhcHRlciwgYWMpOworCX0KKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBhbHJlYWR5IGhhdmUgYWNjZXNzIHRvIHRoaXMgYWNjZXNzIGNhdGVnb3J5CisJICogb3IgaXQgaXMgRUFQT0wgb3IgV0FQSSBmcmFtZSBkdXJpbmcgaW5pdGlhbCBhdXRoZW50aWNhdGlvbiB3aGljaAorCSAqIGNhbiBoYXZlIGFydGlmaWNhbGx5IGJvb3N0ZWQgaGlnaGVyIHFvcyBwcmlvcml0eS4KKwkgKi8KKworCWlmICgoKHBBZGFwdGVyLT5wc2JDaGFuZ2VkICYgKDEgPDwgYWMpKSAmJgorCQlsaWtlbHkocEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10uCisJCQl3bW1BY0FjY2Vzc0FsbG93ZWQpKSB8fAorCQkoKHBIZGRTdGFDdHgtPmNvbm5faW5mby51SXNBdXRoZW50aWNhdGVkID09IGZhbHNlKSAmJgorCQkgd2xhbl9oZGRfaXNfZWFwb2xfb3Jfd2FpKHNrYikpKSB7CisJCWdyYW50ZWQgPSB0cnVlOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGhkZF93bW1fYWNxdWlyZV9hY2Nlc3MocEFkYXB0ZXIsIGFjLCAmZ3JhbnRlZCk7CisJCXBBZGFwdGVyLT5wc2JDaGFuZ2VkIHw9ICgxIDw8IGFjKTsKKwl9CisKKwlpZiAoIWdyYW50ZWQpIHsKKwkJYm9vbCBpc0RlZmF1bHRBYyA9IGZhbHNlOworCQkvKiBBRERUUyByZXF1ZXN0IGZvciB0aGlzIEFDIGlzIHNlbnQsIGZvciBub3cKKwkJICogc2VuZCB0aGlzIHBhY2tldCB0aHJvdWdoIG5leHQgYXZhaWFibGUgbG93ZXIKKwkJICogQWNjZXNzIGNhdGVnb3J5IHVudGlsIEFERFRTIG5lZ290aWF0aW9uIGNvbXBsZXRlcy4KKwkJICovCisJCXdoaWxlICghbGlrZWx5CisJCQkgICAgICAgKHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNdLgorCQkJICAgICAgIHdtbUFjQWNjZXNzQWxsb3dlZCkpIHsKKwkJCXN3aXRjaCAoYWMpIHsKKwkJCWNhc2UgU01FX0FDX1ZPOgorCQkJCWFjID0gU01FX0FDX1ZJOworCQkJCXVwID0gU01FX1FPU19XTU1fVVBfVkk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNNRV9BQ19WSToKKwkJCQlhYyA9IFNNRV9BQ19CRTsKKwkJCQl1cCA9IFNNRV9RT1NfV01NX1VQX0JFOworCQkJCWJyZWFrOworCQkJY2FzZSBTTUVfQUNfQkU6CisJCQkJYWMgPSBTTUVfQUNfQks7CisJCQkJdXAgPSBTTUVfUU9TX1dNTV9VUF9CSzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYWMgPSBTTUVfQUNfQks7CisJCQkJdXAgPSBTTUVfUU9TX1dNTV9VUF9CSzsKKwkJCQlpc0RlZmF1bHRBYyA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaXNEZWZhdWx0QWMpCisJCQkJYnJlYWs7CisJCX0KKwkJc2tiLT5wcmlvcml0eSA9IHVwOworCQlza2ItPnF1ZXVlX21hcHBpbmcgPSBoZGRfbGludXhfdXBfdG9fYWNfbWFwW3VwXTsKKwl9CisKKwl3bGFuX2hkZF9sb2dfZWFwb2woc2tiLAorCQkJICAgV0lGSV9FVkVOVF9EUklWRVJfRUFQT0xfRlJBTUVfVFJBTlNNSVRfUkVRVUVTVEVEKTsKKworI2lmZGVmIFFDQV9QS1RfUFJPVE9fVFJBQ0UKKwlpZiAoKGhkZEN0eHQtPmNvbmZpZy0+Z0VuYWJsZURlYnVnTG9nICYgQ0RTX1BLVF9UUkFDX1RZUEVfRUFQT0wpIHx8CisJICAgIChoZGRDdHh0LT5jb25maWctPmdFbmFibGVEZWJ1Z0xvZyAmIENEU19QS1RfVFJBQ19UWVBFX0RIQ1ApKSB7CisJCXByb3RvX3R5cGUgPSBjZHNfcGt0X2dldF9wcm90b190eXBlKHNrYiwKKwkJCQkJCSAgICBoZGRDdHh0LT5jb25maWctPgorCQkJCQkJICAgIGdFbmFibGVEZWJ1Z0xvZywgMCk7CisJCWlmIChDRFNfUEtUX1RSQUNfVFlQRV9FQVBPTCAmIHByb3RvX3R5cGUpIHsKKwkJCWNkc19wa3RfdHJhY2VfYnVmX3VwZGF0ZSgiU1Q6VDpFUEwiKTsKKwkJfSBlbHNlIGlmIChDRFNfUEtUX1RSQUNfVFlQRV9ESENQICYgcHJvdG9fdHlwZSkgeworCQkJY2RzX3BrdF90cmFjZV9idWZfdXBkYXRlKCJTVDpUOkRIQyIpOworCQl9CisJfQorI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworCXBBZGFwdGVyLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkrK3BBZGFwdGVyLT5zdGF0cy50eF9wYWNrZXRzOworCisJLyogWmVybyBvdXQgc2tiJ3MgY29udGV4dCBidWZmZXIgZm9yIHRoZSBkcml2ZXIgdG8gdXNlICovCisJY2RmX21lbV9zZXQoc2tiLT5jYiwgc2l6ZW9mKHNrYi0+Y2IpLCAwKTsKKwlOQlVGX1NFVF9QQUNLRVRfVFJBQ0soc2tiLCBOQlVGX1RYX1BLVF9EQVRBX1RSQUNLKTsKKwlOQlVGX1VQREFURV9UWF9QS1RfQ09VTlQoc2tiLCBOQlVGX1RYX1BLVF9IREQpOworCisJY2RmX2RwX3RyYWNlX3NldF90cmFjayhza2IpOworCURQVFJBQ0UoY2RmX2RwX3RyYWNlKHNrYiwgQ0RGX0RQX1RSQUNFX0hERF9QQUNLRVRfUFRSX1JFQ09SRCwKKwkJCQkodWludDhfdCAqKXNrYi0+ZGF0YSwgc2l6ZW9mKHNrYi0+ZGF0YSkpKTsKKwlEUFRSQUNFKGNkZl9kcF90cmFjZShza2IsIENERl9EUF9UUkFDRV9IRERfUEFDS0VUX1JFQ09SRCwKKwkJCQkodWludDhfdCAqKXNrYi0+ZGF0YSwgY2RmX25idWZfbGVuKHNrYikpKTsKKwlpZiAoY2RmX25idWZfbGVuKHNrYikgPiBDREZfRFBfVFJBQ0VfUkVDT1JEX1NJWkUpCisJCURQVFJBQ0UoY2RmX2RwX3RyYWNlKHNrYiwgQ0RGX0RQX1RSQUNFX0hERF9QQUNLRVRfUkVDT1JELAorCQkJCSh1aW50OF90ICopJnNrYi0+ZGF0YVtDREZfRFBfVFJBQ0VfUkVDT1JEX1NJWkVdLAorCQkJCShjZGZfbmJ1Zl9sZW4oc2tiKS1DREZfRFBfVFJBQ0VfUkVDT1JEX1NJWkUpKSk7CisKKwlpZiAob2xfdHhfc2VuZF9kYXRhX2ZyYW1lKFNUQUlkLCAoY2RmX25idWZfdCkgc2tiLAorCQkJCQkJCSAgcHJvdG9fdHlwZSkgIT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkgICIlczogRmFpbGVkIHRvIHNlbmQgcGFja2V0IHRvIHR4cnggZm9yIHN0YWlkOiVkIiwKKwkJCSAgX19mdW5jX18sIFNUQUlkKTsKKwkJZ290byBkcm9wX3BrdDsKKwl9CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCitkcm9wX3BrdDoKKworCURQVFJBQ0UoY2RmX2RwX3RyYWNlKHNrYiwgQ0RGX0RQX1RSQUNFX0RST1BfUEFDS0VUX1JFQ09SRCwKKwkJCQkodWludDhfdCAqKXNrYi0+ZGF0YSwgY2RmX25idWZfbGVuKHNrYikpKTsKKwlpZiAoY2RmX25idWZfbGVuKHNrYikgPiBDREZfRFBfVFJBQ0VfUkVDT1JEX1NJWkUpCisJCURQVFJBQ0UoY2RmX2RwX3RyYWNlKHNrYiwgQ0RGX0RQX1RSQUNFX0RST1BfUEFDS0VUX1JFQ09SRCwKKwkJCQkodWludDhfdCAqKSZza2ItPmRhdGFbQ0RGX0RQX1RSQUNFX1JFQ09SRF9TSVpFXSwKKwkJCQkoY2RmX25idWZfbGVuKHNrYiktQ0RGX0RQX1RSQUNFX1JFQ09SRF9TSVpFKSkpOworCisJKytwQWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZDsKKwkrK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdERyb3BwZWQ7CisJKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXREcm9wcGVkQUNbYWNdOworCWtmcmVlX3NrYihza2IpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKy8qKgorICogaGRkX2lic3NfZ2V0X3N0YV9pZCgpIC0gR2V0IHRoZSBTdGF0aW9uSUQgdXNpbmcgdGhlIFBlZXIgTWFjIGFkZHJlc3MKKyAqIEBwSGRkU3RhQ3R4OiBwb2ludGVyIHRvIEhERCBTdGF0aW9uIENvbnRleHQKKyAqIEBwTWFjQWRkcmVzczogcG9pbnRlciB0byBQZWVyIE1hYyBhZGRyZXNzCisgKiBAc3RhSUQ6IHBvaW50ZXIgdG8gcmV0dXJuZWQgU3RhdGlvbiBJbmRleAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTL0NERl9TVEFUVVNfRV9GQUlMVVJFCisgKi8KKworQ0RGX1NUQVRVUyBoZGRfaWJzc19nZXRfc3RhX2lkKGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4LAorCQkJICAgICAgIHN0cnVjdCBjZGZfbWFjX2FkZHIgKnBNYWNBZGRyZXNzLCB1aW50OF90ICpzdGFJZCkKK3sKKwl1aW50OF90IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0lCU1NfUEVFUlM7IGlkeCsrKSB7CisJCWlmIChjZGZfbWVtX2NvbXBhcmUoJnBIZGRTdGFDdHgtPmNvbm5faW5mby5wZWVyTWFjQWRkcmVzc1tpZHhdLAorCQkJCSAgICBwTWFjQWRkcmVzcywgQ0RGX01BQ19BRERSX1NJWkUpKSB7CisJCQkqc3RhSWQgPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbaWR4XTsKKwkJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKy8qKgorICogX19oZGRfdHhfdGltZW91dCgpIC0gVFggdGltZW91dCBoYW5kbGVyCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIGFzIGEgbmV0ZGV2IG5kb190eF90aW1lb3V0IG1ldGhvZCwgYW5kCisgKiBpcyBpbnZva2VkIGJ5IHRoZSBrZXJuZWwgaWYgdGhlIGRyaXZlciB0YWtlcyB0b28gbG9uZyB0byB0cmFuc21pdCBhCisgKiBmcmFtZS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgX19oZGRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKwlpbnQgaSA9IDA7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICIlczogVHJhbnNtaXNzaW9uIHRpbWVvdXQgb2NjdXJyZWQgamlmZmllcyAlbHUgdHJhbnNfc3RhcnQgJWx1IiwKKwkJICBfX2Z1bmNfXywgamlmZmllcywgZGV2LT50cmFuc19zdGFydCk7CisJRFBUUkFDRShjZGZfZHBfdHJhY2UoTlVMTCwgQ0RGX0RQX1RSQUNFX0hERF9UWF9USU1FT1VULAorCQkJCU5VTEwsIDApKTsKKworCS8qIEdldHRpbmcgaGVyZSBpbXBsaWVzIHdlIGRpc2FibGVkIHRoZSBUWCBxdWV1ZXMgZm9yIHRvbworCSAqIGxvbmcuIFF1ZXVlcyBhcmUgZGlzYWJsZWQgZWl0aGVyIGJlY2F1c2Ugb2YgZGlzYXNzb2NpYXRpb24KKwkgKiBvciBsb3cgcmVzb3VyY2Ugc2NlbmFyaW9zLiBJbiBjYXNlIG9mIGRpc2Fzc29jaWF0aW9uIGl0IGlzCisJICogb2sgdG8gaWdub3JlIHRoaXMuIEJ1dCBpZiBhc3NvY2lhdGVkLCB3ZSBoYXZlIGRvIHBvc3NpYmxlCisJICogcmVjb3ZlcnkgaGVyZQorCSAqLworCisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9RVUVVRVM7IGkrKykgeworCQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgaSk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9EQVRBLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIlF1ZXVlJWQgc3RhdHVzOiAlZCB0eHEtPnRyYW5zX3N0YXJ0ICVsdSIsCisJCQkgICBpLCBuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSksIHR4cS0+dHJhbnNfc3RhcnQpOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9EQVRBLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiY2FycmllciBzdGF0ZTogJWQiLCBuZXRpZl9jYXJyaWVyX29rKGRldikpOworfQorCisvKioKKyAqIGhkZF90eF90aW1lb3V0KCkgLSBXcmFwcGVyIGZ1bmN0aW9uIHRvIHByb3RlY3QgX19oZGRfdHhfdGltZW91dCBmcm9tIFNTUgorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIEZ1bmN0aW9uIGNhbGxlZCBieSBPUyBpZiB0aGVyZSBpcyBhbnkgdGltZW91dCBkdXJpbmcgdHJhbnNtaXNzaW9uLgorICogU2luY2UgSEREIHNpbXBseSBlbnF1ZXVlcyBwYWNrZXQgYW5kIHJldHVybnMgY29udHJvbCB0byBPUyByaWdodCBhd2F5LAorICogdGhpcyB3b3VsZCBuZXZlciBiZSBpbnZva2VkCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaGRkX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCV9faGRkX3R4X3RpbWVvdXQoZGV2KTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7Cit9CisKKy8qKgorICogQGhkZF9pbml0X3R4X3J4KCkgLSBJbml0aWFsaXplIFR4L1JYIG1vZHVsZQorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwKKyAqCSAgIENERl9TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAqLworQ0RGX1NUQVRVUyBoZGRfaW5pdF90eF9yeChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERF9EQVRBLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJwQWRhcHRlciBpcyBOVUxMIikpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAaGRkX2RlaW5pdF90eF9yeCgpIC0gRGVpbml0aWFsaXplIFR4L1JYIG1vZHVsZQorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwKKyAqCSAgIENERl9TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAqLworQ0RGX1NUQVRVUyBoZGRfZGVpbml0X3R4X3J4KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKE5VTEwgPT0gcEFkYXB0ZXIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInBBZGFwdGVyIGlzIE5VTEwiKSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGhkZF9yeF9wYWNrZXRfY2JrKCkgLSBSZWNlaXZlIHBhY2tldCBoYW5kbGVyCisgKiBAY2RzX2NvbnRleHQ6IHBvaW50ZXIgdG8gQ0RTIGNvbnRleHQKKyAqIEByeEJ1ZjogcG9pbnRlciB0byByeCBjZGZfbmJ1ZgorICogQHN0YUlkOiBTdGF0aW9uIElkCisgKgorICogUmVjZWl2ZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwuICBUTCB3aWxsIGNhbGwgdGhpcyB0byBub3RpZnkKKyAqIHRoZSBIREQgd2hlbiBvbmUgb3IgbW9yZSBwYWNrZXRzIHdlcmUgcmVjZWl2ZWQgZm9yIGEgcmVnaXN0ZXJlZAorICogU1RBLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwKKyAqCSAgIENERl9TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAqLworQ0RGX1NUQVRVUyBoZGRfcnhfcGFja2V0X2Niayh2b2lkICpjZHNfY29udGV4dCwgY2RmX25idWZfdCByeEJ1ZiwgdWludDhfdCBzdGFJZCkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IE5VTEw7CisJaW50IHJ4c3RhdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKyNpZmRlZiBRQ0FfUEtUX1BST1RPX1RSQUNFCisJdWludDhfdCBwcm90b190eXBlOworI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNwdV9pbmRleDsKKworCS8qIFNhbml0eSBjaGVjayBvbiBpbnB1dHMgKi8KKwlpZiAoKE5VTEwgPT0gY2RzX2NvbnRleHQpIHx8IChOVUxMID09IHJ4QnVmKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IRERfREFUQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE51bGwgcGFyYW1zIGJlaW5nIHBhc3NlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBIZGRDdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9IREQpOworCWlmIChOVUxMID09IHBIZGRDdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX0RBVEEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcEFkYXB0ZXIgPSBwSGRkQ3R4LT5zdGFfdG9fYWRhcHRlcltzdGFJZF07CisJaWYgKChOVUxMID09IHBBZGFwdGVyKSB8fCAoV0xBTl9IRERfQURBUFRFUl9NQUdJQyAhPSBwQWRhcHRlci0+bWFnaWMpKSB7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoImludmFsaWQgYWRhcHRlciAlcCBvciBhZGFwdGVyIGhhcyBpbnZhbGlkIG1hZ2ljIiksCisJCQlwQWRhcHRlcik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJY3B1X2luZGV4ID0gd2xhbl9oZGRfZ2V0X2NwdSgpOworCisJc2tiID0gKHN0cnVjdCBza19idWZmICopcnhCdWY7CisKKwlpZiAoV0xBTl9IRERfQURBUFRFUl9NQUdJQyAhPSBwQWRhcHRlci0+bWFnaWMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX0RBVEEsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIk1hZ2ljIGNvb2tpZSgleCkgZm9yIGFkYXB0ZXIgc2FuaXR5IHZlcmlmaWNhdGlvbiBpcyBpbnZhbGlkIiwKKwkJCSAgcEFkYXB0ZXItPm1hZ2ljKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwlpZiAoKHBIZGRTdGFDdHgtPmNvbm5faW5mby5wcm94eUFSUFNlcnZpY2UpICYmCisJICAgIGNmZzgwMjExX2lzX2dyYXR1aXRvdXNfYXJwX3Vuc29saWNpdGVkX25hKHNrYikpIHsKKwkJKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy5yeERyb3BwZWRbY3B1X2luZGV4XTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSEREX0RBVEEsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IERyb3BwaW5nIEhTIDIuMCBHcmF0dWl0b3VzIEFSUCBvciBVbnNvbGljaXRlZCBOQSIsCisJCQkgIF9fZnVuY19fKTsKKwkJLyogUmVtb3ZlIFNLQiBmcm9tIGludGVybmFsIHRyYWNraW5nIHRhYmxlIGJlZm9yZSBzdWJtaXR0aW5nCisJCSAqIGl0IHRvIHN0YWNrCisJCSAqLworCQljZGZfbmJ1Zl9mcmVlKHNrYik7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJd2xhbl9oZGRfbG9nX2VhcG9sKHNrYiwgV0lGSV9FVkVOVF9EUklWRVJfRUFQT0xfRlJBTUVfUkVDRUlWRUQpOworCisjaWZkZWYgUUNBX1BLVF9QUk9UT19UUkFDRQorCWlmICgocEhkZEN0eC0+Y29uZmlnLT5nRW5hYmxlRGVidWdMb2cgJiBDRFNfUEtUX1RSQUNfVFlQRV9FQVBPTCkgfHwKKwkgICAgKHBIZGRDdHgtPmNvbmZpZy0+Z0VuYWJsZURlYnVnTG9nICYgQ0RTX1BLVF9UUkFDX1RZUEVfREhDUCkpIHsKKwkJcHJvdG9fdHlwZSA9IGNkc19wa3RfZ2V0X3Byb3RvX3R5cGUoc2tiLAorCQkJCQkJICAgIHBIZGRDdHgtPmNvbmZpZy0+CisJCQkJCQkgICAgZ0VuYWJsZURlYnVnTG9nLCAwKTsKKwkJaWYgKENEU19QS1RfVFJBQ19UWVBFX0VBUE9MICYgcHJvdG9fdHlwZSkgeworCQkJY2RzX3BrdF90cmFjZV9idWZfdXBkYXRlKCJTVDpSOkVQTCIpOworCQl9IGVsc2UgaWYgKENEU19QS1RfVFJBQ19UWVBFX0RIQ1AgJiBwcm90b190eXBlKSB7CisJCQljZHNfcGt0X3RyYWNlX2J1Zl91cGRhdGUoIlNUOlI6REhDIik7CisJCX0KKwl9CisjZW5kaWYgLyogUUNBX1BLVF9QUk9UT19UUkFDRSAqLworCisJc2tiLT5kZXYgPSBwQWRhcHRlci0+ZGV2OworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKKwkrK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnJ4UGFja2V0c1tjcHVfaW5kZXhdOworCSsrcEFkYXB0ZXItPnN0YXRzLnJ4X3BhY2tldHM7CisJcEFkYXB0ZXItPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworI2lmZGVmIFdMQU5fRkVBVFVSRV9IT0xEX1JYX1dBS0VMT0NLCisJY2RmX3dha2VfbG9ja190aW1lb3V0X2FjcXVpcmUoJnBIZGRDdHgtPnJ4X3dha2VfbG9jaywKKwkJCQkgICAgICBIRERfV0FLRV9MT0NLX0RVUkFUSU9OLAorCQkJCSAgICAgIFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfSE9MRF9SWCk7CisjZW5kaWYKKworCS8qIFJlbW92ZSBTS0IgZnJvbSBpbnRlcm5hbCB0cmFja2luZyB0YWJsZSBiZWZvcmUgc3VibWl0dGluZworCSAqIGl0IHRvIHN0YWNrCisJICovCisJY2RmX25ldF9idWZfZGVidWdfcmVsZWFzZV9za2IocnhCdWYpOworCisJaWYgKEhERF9MUk9fTk9fUlggPT0KKwkJIGhkZF9scm9fcngocEhkZEN0eCwgcEFkYXB0ZXIsIHNrYikpIHsKKwkJaWYgKGhkZF9uYXBpX2VuYWJsZWQoSEREX05BUElfQU5ZKSkKKwkJCXJ4c3RhdCA9IG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCWVsc2UKKwkJCXJ4c3RhdCA9IG5ldGlmX3J4X25pKHNrYik7CisKKwkJaWYgKE5FVF9SWF9TVUNDRVNTID09IHJ4c3RhdCkKKwkJCSsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMuCisJCQkJIHJ4RGVsaXZlcmVkW2NwdV9pbmRleF07CisJCWVsc2UKKwkJCSsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMuCisJCQkJIHJ4UmVmdXNlZFtjcHVfaW5kZXhdOworCisJfSBlbHNlIHsKKwkJKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy4KKwkJCSByeERlbGl2ZXJlZFtjcHVfaW5kZXhdOworCX0KKworCXBBZGFwdGVyLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworLyoqCisgKiB3bGFuX2hkZF9nZXRfZWFwb2xfcGFyYW1zKCkgLSBGdW5jdGlvbiB0byBleHRyYWN0IEVBUE9MIHBhcmFtcworICogQHNrYjogICAgICAgICAgICAgICAgc2JiIGRhdGEKKyAqIEBlYXBvbF9wYXJhbXM6ICAgICAgIFBvaW50ZXIgdG8gaG9sZCB0aGUgcGFyc2VkIEVBUE9MIHBhcmFtcworICogQGV2ZW50X3R5cGU6ICAgICAgICAgRXZlbnQgdHlwZSB0byBpbmRpY2F0ZSBUeC9SeAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBpbnB1dCBza2IgZGF0YSBhbmQgcmV0dXJuIHRoZSBFQVBPTCBwYXJhbWV0ZXJzIGlmCisgKiB0aGUgcGFja2V0IGlzIGFuIGVhcG9sIHBhY2tldC4KKyAqCisgKiBSZXR1cm46IC1FSU5WQUwgaWYgdGhlIHBhY2tldCBpcyBub3QgYW4gRUFQT0wgcGFja2V0IGFuZCAwIG9uIHN1Y2Nlc3MKKyAqCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfZ2V0X2VhcG9sX3BhcmFtcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlzdHJ1Y3QgaG9zdF9ldmVudF93bGFuX2VhcG9sICplYXBvbF9wYXJhbXMsCisJCXVpbnQ4X3QgZXZlbnRfdHlwZSkKK3sKKwlib29sIHJldDsKKwl1aW50OF90IHBhY2tldF90eXBlOworCisJcmV0ID0gd2xhbl9oZGRfaXNfZWFwb2woc2tiKTsKKworCWlmICghcmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhY2tldF90eXBlID0gKHVpbnQ4X3QpKCoodWludDhfdCAqKQorCQkJKHNrYi0+ZGF0YSArIEhERF9FQVBPTF9QQUNLRVRfVFlQRV9PRkZTRVQpKTsKKworCWVhcG9sX3BhcmFtcy0+ZWFwb2xfcGFja2V0X3R5cGUgPSBwYWNrZXRfdHlwZTsKKwllYXBvbF9wYXJhbXMtPmVhcG9sX2tleV9pbmZvID0gKHVpbnQxNl90KSgqKHVpbnQxNl90ICopCisJCQkoc2tiLT5kYXRhICsgSEREX0VBUE9MX0tFWV9JTkZPX09GRlNFVCkpOworCWVhcG9sX3BhcmFtcy0+ZXZlbnRfc3ViX3R5cGUgPSBldmVudF90eXBlOworCWVhcG9sX3BhcmFtcy0+ZWFwb2xfcmF0ZSA9IDA7LyogQXMgb2Ygbm93LCB6ZXJvICovCisKKwljZGZfbWVtX2NvcHkoZWFwb2xfcGFyYW1zLT5kZXN0X2FkZHIsCisJCQkoc2tiLT5kYXRhICsgSEREX0VBUE9MX0RFU1RfTUFDX09GRlNFVCksCisJCQlzaXplb2YoZWFwb2xfcGFyYW1zLT5kZXN0X2FkZHIpKTsKKwljZGZfbWVtX2NvcHkoZWFwb2xfcGFyYW1zLT5zcmNfYWRkciwKKwkJCShza2ItPmRhdGEgKyBIRERfRUFQT0xfU1JDX01BQ19PRkZTRVQpLAorCQkJc2l6ZW9mKGVhcG9sX3BhcmFtcy0+c3JjX2FkZHIpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bGFuX2hkZF9ldmVudF9lYXBvbF9sb2coKSAtIEZ1bmN0aW9uIHRvIGxvZyBFQVBPTCBldmVudHMKKyAqIEBlYXBvbF9wYXJhbXM6ICAgIFN0cnVjdHVyZSBjb250YWluaW5nIEVBUE9MIHBhcmFtcworICoKKyAqIFRoaXMgZnVuY3Rpb24gbG9ncyB0aGUgcGFyc2VkIEVBUE9MIHBhcmFtcworICoKKyAqIFJldHVybjogTm9uZQorICoKKyAqLworc3RhdGljIHZvaWQgd2xhbl9oZGRfZXZlbnRfZWFwb2xfbG9nKHN0cnVjdCBob3N0X2V2ZW50X3dsYW5fZWFwb2wgZWFwb2xfcGFyYW1zKQoreworCVdMQU5fSE9TVF9ESUFHX0VWRU5UX0RFRih3bGFuX2RpYWdfZXZlbnQsIHN0cnVjdCBob3N0X2V2ZW50X3dsYW5fZWFwb2wpOworCisJd2xhbl9kaWFnX2V2ZW50LmV2ZW50X3N1Yl90eXBlID0gZWFwb2xfcGFyYW1zLmV2ZW50X3N1Yl90eXBlOworCXdsYW5fZGlhZ19ldmVudC5lYXBvbF9wYWNrZXRfdHlwZSA9IGVhcG9sX3BhcmFtcy5lYXBvbF9wYWNrZXRfdHlwZTsKKwl3bGFuX2RpYWdfZXZlbnQuZWFwb2xfa2V5X2luZm8gPSBlYXBvbF9wYXJhbXMuZWFwb2xfa2V5X2luZm87CisJd2xhbl9kaWFnX2V2ZW50LmVhcG9sX3JhdGUgPSBlYXBvbF9wYXJhbXMuZWFwb2xfcmF0ZTsKKwljZGZfbWVtX2NvcHkod2xhbl9kaWFnX2V2ZW50LmRlc3RfYWRkciwKKwkJCWVhcG9sX3BhcmFtcy5kZXN0X2FkZHIsCisJCQlzaXplb2Yod2xhbl9kaWFnX2V2ZW50LmRlc3RfYWRkcikpOworCWNkZl9tZW1fY29weSh3bGFuX2RpYWdfZXZlbnQuc3JjX2FkZHIsCisJCQllYXBvbF9wYXJhbXMuc3JjX2FkZHIsCisJCQlzaXplb2Yod2xhbl9kaWFnX2V2ZW50LnNyY19hZGRyKSk7CisKKwlXTEFOX0hPU1RfRElBR19FVkVOVF9SRVBPUlQoJndsYW5fZGlhZ19ldmVudCwgRVZFTlRfV0xBTl9FQVBPTCk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfbG9nX2VhcG9sKCkgLSBMb2dzIHRoZSBFQVBPTCBwYXJhbWV0ZXJzIG9mIGEgcGFja2V0CisgKiBAc2tiOiAgICAgICAgICAgICAgIHNrYiBkYXRhCisgKiBAZXZlbnRfdHlwZTogICAgICAgIE9uZSBvZiBlbnVtIHdpZmlfY29ubmVjdGl2aXR5X2V2ZW50cyB0byBpbmRpY2F0ZSBUeC9SeAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBpbnB1dCBza2IgZGF0YSB0byBnZXQgdGhlIEVBUE9MIHBhcmFtcyBhbmQgbG9nCisgKiB0aGVtIHRvIHVzZXIgc3BhY2UsIGlmIHRoZSBwYWNrZXQgaXMgRUFQT0wKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqCisgKi8KK3ZvaWQgd2xhbl9oZGRfbG9nX2VhcG9sKHN0cnVjdCBza19idWZmICpza2IsCisJCXVpbnQ4X3QgZXZlbnRfdHlwZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBob3N0X2V2ZW50X3dsYW5fZWFwb2wgZWFwb2xfcGFyYW1zOworCisJcmV0ID0gd2xhbl9oZGRfZ2V0X2VhcG9sX3BhcmFtcyhza2IsICZlYXBvbF9wYXJhbXMsIGV2ZW50X3R5cGUpOworCWlmICghcmV0KQorCQl3bGFuX2hkZF9ldmVudF9lYXBvbF9sb2coZWFwb2xfcGFyYW1zKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisKKy8qKgorICogaGRkX3JlYXNvbl90eXBlX3RvX3N0cmluZygpIC0gcmV0dXJuIHN0cmluZyBjb252ZXJzaW9uIG9mIHJlYXNvbiB0eXBlCisgKiBAcmVhc29uOiByZWFzb24gdHlwZQorICoKKyAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBoZWxwcyBsb2cgc3RyaW5nIGNvbnZlcnNpb24gb2YgcmVhc29uIHR5cGUuCisgKgorICogUmV0dXJuOiBzdHJpbmcgY29udmVyc2lvbiBvZiBkZXZpY2UgbW9kZSwgaWYgbWF0Y2ggZm91bmQ7CisgKiAgICAgICAgIlVua25vd24iIG90aGVyd2lzZS4KKyAqLworY29uc3QgY2hhciAqaGRkX3JlYXNvbl90eXBlX3RvX3N0cmluZyhlbnVtIG5ldGlmX3JlYXNvbl90eXBlIHJlYXNvbikKK3sKKwlzd2l0Y2ggKHJlYXNvbikgeworCUNBU0VfUkVUVVJOX1NUUklORyhXTEFOX0NPTlRST0xfUEFUSCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKFdMQU5fREFUQV9GTE9XX0NPTlRST0wpOworCUNBU0VfUkVUVVJOX1NUUklORyhXTEFOX0ZXX1BBVVNFKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoV0xBTl9UWF9BQk9SVCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKFdMQU5fVkRFVl9TVE9QKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoV0xBTl9QRUVSX1VOQVVUSE9SSVNFRCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKFdMQU5fVEhFUk1BTF9NSVRJR0FUSU9OKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVua25vd24iOworCX0KK30KKworLyoqCisgKiBoZGRfYWN0aW9uX3R5cGVfdG9fc3RyaW5nKCkgLSByZXR1cm4gc3RyaW5nIGNvbnZlcnNpb24gb2YgYWN0aW9uIHR5cGUKKyAqIEBhY3Rpb246IGFjdGlvbiB0eXBlCisgKgorICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGhlbHBzIGxvZyBzdHJpbmcgY29udmVyc2lvbiBvZiBhY3Rpb25fdHlwZS4KKyAqCisgKiBSZXR1cm46IHN0cmluZyBjb252ZXJzaW9uIG9mIGRldmljZSBtb2RlLCBpZiBtYXRjaCBmb3VuZDsKKyAqICAgICAgICAiVW5rbm93biIgb3RoZXJ3aXNlLgorICovCitjb25zdCBjaGFyICpoZGRfYWN0aW9uX3R5cGVfdG9fc3RyaW5nKGVudW0gbmV0aWZfYWN0aW9uX3R5cGUgYWN0aW9uKQoreworCisJc3dpdGNoIChhY3Rpb24pIHsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoV0xBTl9TVE9QX0FMTF9ORVRJRl9RVUVVRSk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKFdMQU5fU1RBUlRfQUxMX05FVElGX1FVRVVFKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoV0xBTl9XQUtFX0FMTF9ORVRJRl9RVUVVRSk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKFdMQU5fU1RPUF9BTExfTkVUSUZfUVVFVUVfTl9DQVJSSUVSKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoV0xBTl9TVEFSVF9BTExfTkVUSUZfUVVFVUVfTl9DQVJSSUVSKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoV0xBTl9ORVRJRl9UWF9ESVNBQkxFKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoV0xBTl9ORVRJRl9UWF9ESVNBQkxFX05fQ0FSUklFUik7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKFdMQU5fTkVUSUZfQ0FSUklFUl9PTik7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKFdMQU5fTkVUSUZfQ0FSUklFUl9PRkYpOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93biI7CisJfQorfQorCisvKioKKyAqIHdsYW5faGRkX3VwZGF0ZV9xdWV1ZV9vcGVyX3N0YXRzIC0gdXBkYXRlIHF1ZXVlIG9wZXJhdGlvbiBzdGF0aXN0aWNzCisgKiBAYWRhcHRlcjogYWRhcHRlciBoYW5kbGUKKyAqIEBhY3Rpb246IGFjdGlvbiB0eXBlCisgKiBAcmVhc29uOiByZWFzb24gdHlwZQorICovCitzdGF0aWMgdm9pZCB3bGFuX2hkZF91cGRhdGVfcXVldWVfb3Blcl9zdGF0cyhoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCWVudW0gbmV0aWZfYWN0aW9uX3R5cGUgYWN0aW9uLCBlbnVtIG5ldGlmX3JlYXNvbl90eXBlIHJlYXNvbikKK3sKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgV0xBTl9TVE9QX0FMTF9ORVRJRl9RVUVVRToKKwljYXNlIFdMQU5fU1RPUF9BTExfTkVUSUZfUVVFVUVfTl9DQVJSSUVSOgorCWNhc2UgV0xBTl9ORVRJRl9UWF9ESVNBQkxFOgorCWNhc2UgV0xBTl9ORVRJRl9UWF9ESVNBQkxFX05fQ0FSUklFUjoKKwkJYWRhcHRlci0+cXVldWVfb3Blcl9zdGF0c1tyZWFzb25dLnBhdXNlX2NvdW50Kys7CisJCWJyZWFrOworCWNhc2UgV0xBTl9TVEFSVF9BTExfTkVUSUZfUVVFVUU6CisJY2FzZSBXTEFOX1dBS0VfQUxMX05FVElGX1FVRVVFOgorCWNhc2UgV0xBTl9TVEFSVF9BTExfTkVUSUZfUVVFVUVfTl9DQVJSSUVSOgorCQlhZGFwdGVyLT5xdWV1ZV9vcGVyX3N0YXRzW3JlYXNvbl0udW5wYXVzZV9jb3VudCsrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbCgpIC0gVXNlIGZvciBuZXRpZl9xdWV1ZSByZWxhdGVkIGFjdGlvbnMKKyAqIEBhZGFwdGVyOiBhZGFwdGVyIGhhbmRsZQorICogQGFjdGlvbjogYWN0aW9uIHR5cGUKKyAqIEByZWFzb246IHJlYXNvbiB0eXBlCisgKgorICogVGhpcyBpcyBzaW5nbGUgZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCBmb3IgbmV0aWZfcXVldWUgcmVsYXRlZAorICogYWN0aW9ucyBsaWtlIHN0YXJ0L3N0b3Agb2YgbmV0d29yayBxdWV1ZXMgYW5kIG9uL29mZiBjYXJyaWVyCisgKiBvcHRpb24uCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChoZGRfYWRhcHRlcl90ICphZGFwdGVyLAorCWVudW0gbmV0aWZfYWN0aW9uX3R5cGUgYWN0aW9uLCBlbnVtIG5ldGlmX3JlYXNvbl90eXBlIHJlYXNvbikKK3sKKworCWlmICgoIWFkYXB0ZXIpIHx8IChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IGFkYXB0ZXItPm1hZ2ljKSB8fAorCQkgKCFhZGFwdGVyLT5kZXYpKSB7CisJCWhkZF9lcnIoImFkYXB0ZXIgaXMgaW52YWxpZCIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChhY3Rpb24pIHsKKworCWNhc2UgV0xBTl9ORVRJRl9DQVJSSUVSX09OOgorCQluZXRpZl9jYXJyaWVyX29uKGFkYXB0ZXItPmRldik7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX05FVElGX0NBUlJJRVJfT0ZGOgorCQluZXRpZl9jYXJyaWVyX29mZihhZGFwdGVyLT5kZXYpOworCQlicmVhazsKKworCWNhc2UgV0xBTl9TVE9QX0FMTF9ORVRJRl9RVUVVRToKKwkJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5wYXVzZV9tYXBfbG9jayk7CisJCWlmICghYWRhcHRlci0+cGF1c2VfbWFwKQorCQkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKGFkYXB0ZXItPmRldik7CisJCWFkYXB0ZXItPnBhdXNlX21hcCB8PSAoMSA8PCByZWFzb24pOworCQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+cGF1c2VfbWFwX2xvY2spOworCQlicmVhazsKKworCWNhc2UgV0xBTl9TVEFSVF9BTExfTkVUSUZfUVVFVUU6CisJCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cGF1c2VfbWFwX2xvY2spOworCQlhZGFwdGVyLT5wYXVzZV9tYXAgJj0gfigxIDw8IHJlYXNvbik7CisJCWlmICghYWRhcHRlci0+cGF1c2VfbWFwKQorCQkJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhhZGFwdGVyLT5kZXYpOworCQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+cGF1c2VfbWFwX2xvY2spOworCQlicmVhazsKKworCWNhc2UgV0xBTl9XQUtFX0FMTF9ORVRJRl9RVUVVRToKKwkJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5wYXVzZV9tYXBfbG9jayk7CisJCWFkYXB0ZXItPnBhdXNlX21hcCAmPSB+KDEgPDwgcmVhc29uKTsKKwkJaWYgKCFhZGFwdGVyLT5wYXVzZV9tYXApCisJCQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMoYWRhcHRlci0+ZGV2KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnBhdXNlX21hcF9sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fU1RPUF9BTExfTkVUSUZfUVVFVUVfTl9DQVJSSUVSOgorCQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnBhdXNlX21hcF9sb2NrKTsKKwkJaWYgKCFhZGFwdGVyLT5wYXVzZV9tYXApCisJCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMoYWRhcHRlci0+ZGV2KTsKKwkJYWRhcHRlci0+cGF1c2VfbWFwIHw9ICgxIDw8IHJlYXNvbik7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGFkYXB0ZXItPmRldik7CisJCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5wYXVzZV9tYXBfbG9jayk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX1NUQVJUX0FMTF9ORVRJRl9RVUVVRV9OX0NBUlJJRVI6CisJCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cGF1c2VfbWFwX2xvY2spOworCQluZXRpZl9jYXJyaWVyX29uKGFkYXB0ZXItPmRldik7CisJCWFkYXB0ZXItPnBhdXNlX21hcCAmPSB+KDEgPDwgcmVhc29uKTsKKwkJaWYgKCFhZGFwdGVyLT5wYXVzZV9tYXApCisJCQluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKGFkYXB0ZXItPmRldik7CisJCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5wYXVzZV9tYXBfbG9jayk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX05FVElGX1RYX0RJU0FCTEU6CisJCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cGF1c2VfbWFwX2xvY2spOworCQlpZiAoIWFkYXB0ZXItPnBhdXNlX21hcCkKKwkJCW5ldGlmX3R4X2Rpc2FibGUoYWRhcHRlci0+ZGV2KTsKKwkJYWRhcHRlci0+cGF1c2VfbWFwIHw9ICgxIDw8IHJlYXNvbik7CisJCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5wYXVzZV9tYXBfbG9jayk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX05FVElGX1RYX0RJU0FCTEVfTl9DQVJSSUVSOgorCQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnBhdXNlX21hcF9sb2NrKTsKKwkJaWYgKCFhZGFwdGVyLT5wYXVzZV9tYXApCisJCQluZXRpZl90eF9kaXNhYmxlKGFkYXB0ZXItPmRldik7CisJCWFkYXB0ZXItPnBhdXNlX21hcCB8PSAoMSA8PCByZWFzb24pOworCQluZXRpZl9jYXJyaWVyX29mZihhZGFwdGVyLT5kZXYpOworCQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+cGF1c2VfbWFwX2xvY2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWhkZF9lcnIoInVuc3VwcG9ydGVkIGFjdGlvbiAlZCIsIGFjdGlvbik7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5wYXVzZV9tYXBfbG9jayk7CisJaWYgKGFkYXB0ZXItPnBhdXNlX21hcCAmICgxIDw8IFdMQU5fUEVFUl9VTkFVVEhPUklTRUQpKQorCQl3bGFuX2hkZF9wcm9jZXNzX3BlZXJfdW5hdXRob3Jpc2VkX3BhdXNlKGFkYXB0ZXIpOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5wYXVzZV9tYXBfbG9jayk7CisKKworCXdsYW5faGRkX3VwZGF0ZV9xdWV1ZV9vcGVyX3N0YXRzKGFkYXB0ZXIsIGFjdGlvbiwgcmVhc29uKTsKKworCWFkYXB0ZXItPnF1ZXVlX29wZXJfaGlzdG9yeVthZGFwdGVyLT5oaXN0b3J5X2luZGV4XS50aW1lID0KKwkJCQkJCQljZGZfc3lzdGVtX3RpY2tzKCk7CisJYWRhcHRlci0+cXVldWVfb3Blcl9oaXN0b3J5W2FkYXB0ZXItPmhpc3RvcnlfaW5kZXhdLm5ldGlmX2FjdGlvbiA9CisJCQkJCQkJCQlhY3Rpb247CisJYWRhcHRlci0+cXVldWVfb3Blcl9oaXN0b3J5W2FkYXB0ZXItPmhpc3RvcnlfaW5kZXhdLm5ldGlmX3JlYXNvbiA9CisJCQkJCQkJCQlyZWFzb247CisJYWRhcHRlci0+cXVldWVfb3Blcl9oaXN0b3J5W2FkYXB0ZXItPmhpc3RvcnlfaW5kZXhdLnBhdXNlX21hcCA9CisJCQkJCQkJYWRhcHRlci0+cGF1c2VfbWFwOworCWlmICgrK2FkYXB0ZXItPmhpc3RvcnlfaW5kZXggPT0gV0xBTl9IRERfTUFYX0hJU1RPUllfRU5UUlkpCisJCWFkYXB0ZXItPmhpc3RvcnlfaW5kZXggPSAwOworCisJcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfd2V4dC5jIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX3dleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTA3NmZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oZGQvc3JjL3dsYW5faGRkX3dleHQuYwpAQCAtMCwwICsxLDEwNzA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogd2xhbl9oZGRfd2V4dC5jCisgKgorICogTGludXggV2lyZWxlc3MgRXh0ZW5zaW9ucyBJbXBsZW1lbnRhdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bWFjX3RyYWNlLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaW5jbHVkZXMuaD4KKyNpbmNsdWRlIDxjZHNfYXBpLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgInNpcl9wYXJhbXMuaCIKKyNpbmNsdWRlICJjc3JfYXBpLmgiCisjaW5jbHVkZSAiY3NyX2luc2lkZV9hcGkuaCIKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNpbmNsdWRlICJzbWVfcnJtX2ludGVybmFsLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxhbmlfZ2xvYmFsLmg+CisjaW5jbHVkZSAiZG90MTFmLmgiCisjaW5jbHVkZSA8d2xhbl9oZGRfd293bC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2NmZy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dtbS5oPgorI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgIndsYW5faGRkX3AycC5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisjaW5jbHVkZSAid2xhbl9oZGRfdGRscy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJjZHNfaWVlZTgwMjExX2NvbW1vbi5oIgorI2luY2x1ZGUgIm9sX2lmX2F0aHZhci5oIgorI2luY2x1ZGUgImRiZ2xvZ19ob3N0LmgiCisjaW5jbHVkZSAid21hLmgiCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9wb3dlci5oIgorI2luY2x1ZGUgInF3bGFuX3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9ob3N0X29mZmxvYWQuaCIKKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisKKyNpbmNsdWRlICJ3bGFuX2hkZF9taXNjLmgiCisKKyNpbmNsdWRlICJxY19zYXBfaW9jdGwuaCIKKyNpbmNsdWRlICJzbWVfYXBpLmgiCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfYXNzb2MuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9pb2N0bC5oIgorI2luY2x1ZGUgIndsYW5faGRkX3NjYW4uaCIKKyNpbmNsdWRlICJzbWVfcG93ZXJfc2F2ZV9hcGkuaCIKKyNpbmNsdWRlICJjZHNfY29uY3VycmVuY3kuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9jb25jX3V0LmgiCisjaW5jbHVkZSAid2xhbl9oZGRfb2NiLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbmFwaS5oIgorCisjaWZkZWYgUUNBX1BLVF9QUk9UT19UUkFDRQorI2luY2x1ZGUgImNkc19wYWNrZXQuaCIKKyNlbmRpZiAvKiBRQ0FfUEtUX1BST1RPX1RSQUNFICovCisKKyNkZWZpbmUgSEREX0ZJTklTSF9VTEFfVElNRV9PVVQgICAgICAgICA4MDAKKyNkZWZpbmUgSEREX1NFVF9NQ0JDX0ZJTFRFUlNfVE9fRlcgICAgICAxCisjZGVmaW5lIEhERF9ERUxFVEVfTUNCQ19GSUxURVJTX0ZST01fRlcgMAorCitleHRlcm4gaW50IHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9iYW5kKHN0cnVjdCB3aXBoeSAqd2lwaHksIGVDc3JCYW5kIGVCYW5kKTsKK3N0YXRpYyBpbnQgaW9jdGxfZGVidWc7Cittb2R1bGVfcGFyYW0oaW9jdGxfZGVidWcsIGludCwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisKKy8qIFRvIFZhbGlkYXRlIENoYW5uZWwgYWdhaW5zdCB0aGUgRnJlcXVlbmN5IGFuZCBWaWNlLVZlcnNhICovCitzdGF0aWMgY29uc3QgaGRkX2ZyZXFfY2hhbl9tYXBfdCBmcmVxX2NoYW5fbWFwW10gPSB7CisJezI0MTIsIDF9LCB7MjQxNywgMn0sIHsyNDIyLCAzfSwgezI0MjcsIDR9LCB7MjQzMiwgNX0sIHsyNDM3LCA2fSwKKwl7MjQ0MiwgN30sIHsyNDQ3LCA4fSwgezI0NTIsIDl9LCB7MjQ1NywgMTB9LCB7MjQ2MiwgMTF9LCB7MjQ2NywgMTJ9LAorCXsyNDcyLCAxM30sIHsyNDg0LCAxNH0sIHs0OTIwLCAyNDB9LCB7NDk0MCwgMjQ0fSwgezQ5NjAsIDI0OH0sCisJezQ5ODAsIDI1Mn0sIHs1MDQwLCAyMDh9LCB7NTA2MCwgMjEyfSwgezUwODAsIDIxNn0sIHs1MTgwLCAzNn0sCisJezUyMDAsIDQwfSwgezUyMjAsIDQ0fSwgezUyNDAsIDQ4fSwgezUyNjAsIDUyfSwgezUyODAsIDU2fSwKKwl7NTMwMCwgNjB9LCB7NTMyMCwgNjR9LCB7NTUwMCwgMTAwfSwgezU1MjAsIDEwNH0sIHs1NTQwLCAxMDh9LAorCXs1NTYwLCAxMTJ9LCB7NTU4MCwgMTE2fSwgezU2MDAsIDEyMH0sIHs1NjIwLCAxMjR9LCB7NTY0MCwgMTI4fSwKKwl7NTY2MCwgMTMyfSwgezU2ODAsIDEzNn0sIHs1NzAwLCAxNDB9LCB7NTcyMCwgMTQ0fSwgezU3NDUsIDE0OX0sCisJezU3NjUsIDE1M30sIHs1Nzg1LCAxNTd9LCB7NTgwNSwgMTYxfSwgezU4MjUsIDE2NX0sIHs1ODUyLCAxNzB9LAorCXs1ODU1LCAxNzF9LCB7NTg2MCwgMTcyfSwgezU4NjUsIDE3M30sIHs1ODcwLCAxNzR9LCB7NTg3NSwgMTc1fSwKKwl7NTg4MCwgMTc2fSwgezU4ODUsIDE3N30sIHs1ODkwLCAxNzh9LCB7NTg5NSwgMTc5fSwgezU5MDAsIDE4MH0sCisJezU5MDUsIDE4MX0sIHs1OTEwLCAxODJ9LCB7NTkxNSwgMTgzfSwgezU5MjAsIDE4NH0gfTsKKworI2RlZmluZSBGUkVRX0NIQU5fTUFQX1RBQkxFX1NJWkUgXAorCQkoc2l6ZW9mKGZyZXFfY2hhbl9tYXApIC8gc2l6ZW9mKGZyZXFfY2hhbl9tYXBbMF0pKQorCisvKiBQcml2YXRlIGlvY3RscyBhbmQgdGhlaXIgc3ViLWlvY3RscyAqLworI2RlZmluZSBXTEFOX1BSSVZfU0VUX0lOVF9HRVRfTk9ORSAgICAoU0lPQ0lXRklSU1RQUklWICsgMCkKKyNkZWZpbmUgV0VfU0VUXzExRF9TVEFURSAgICAgMQorI2RlZmluZSBXRV9XT1dMICAgICAgICAgICAgICAyCisjZGVmaW5lIFdFX1NFVF9QT1dFUiAgICAgICAgIDMKKyNkZWZpbmUgV0VfU0VUX01BWF9BU1NPQyAgICAgNAorI2RlZmluZSBXRV9TRVRfU0NBTl9ESVNBQkxFICA1CisjZGVmaW5lIFdFX1NFVF9EQVRBX0lOQUNUSVZJVFlfVE8gIDYKKyNkZWZpbmUgV0VfU0VUX01BWF9UWF9QT1dFUiAgNworI2RlZmluZSBXRV9TRVRfSElHSEVSX0RUSU1fVFJBTlNJVElPTiAgIDgKKyNkZWZpbmUgV0VfU0VUX1RNX0xFVkVMICAgICAgOQorI2RlZmluZSBXRV9TRVRfUEhZTU9ERSAgICAgICAxMAorI2RlZmluZSBXRV9TRVRfTlNTICAgICAgICAgICAxMQorI2RlZmluZSBXRV9TRVRfTERQQyAgICAgICAgICAxMgorI2RlZmluZSBXRV9TRVRfVFhfU1RCQyAgICAgICAxMworI2RlZmluZSBXRV9TRVRfUlhfU1RCQyAgICAgICAxNAorI2RlZmluZSBXRV9TRVRfU0hPUlRfR0kgICAgICAxNQorI2RlZmluZSBXRV9TRVRfUlRTQ1RTICAgICAgICAxNgorI2RlZmluZSBXRV9TRVRfQ0hXSURUSCAgICAgICAxNworI2RlZmluZSBXRV9TRVRfQU5JX0VOX0RJUyAgICAxOAorI2RlZmluZSBXRV9TRVRfQU5JX1BPTExfUEVSSU9EICAgIDE5CisjZGVmaW5lIFdFX1NFVF9BTklfTElTVEVOX1BFUklPRCAgMjAKKyNkZWZpbmUgV0VfU0VUX0FOSV9PRkRNX0xFVkVMICAgICAyMQorI2RlZmluZSBXRV9TRVRfQU5JX0NDS19MRVZFTCAgICAgIDIyCisjZGVmaW5lIFdFX1NFVF9EWU5BTUlDX0JXICAgICAgICAgMjMKKyNkZWZpbmUgV0VfU0VUX1RYX0NIQUlOTUFTSyAgMjQKKyNkZWZpbmUgV0VfU0VUX1JYX0NIQUlOTUFTSyAgMjUKKyNkZWZpbmUgV0VfU0VUXzExTl9SQVRFICAgICAgMjYKKyNkZWZpbmUgV0VfU0VUX0FNUERVICAgICAgICAgMjcKKyNkZWZpbmUgV0VfU0VUX0FNU0RVICAgICAgICAgMjgKKyNkZWZpbmUgV0VfU0VUX1RYUE9XXzJHICAgICAgMjkKKyNkZWZpbmUgV0VfU0VUX1RYUE9XXzVHICAgICAgMzAKKy8qIFByaXZhdGUgaW9jdGwgZm9yIGZpcm13YXJlIGRlYnVnIGxvZyAqLworI2RlZmluZSBXRV9EQkdMT0dfTE9HX0xFVkVMICAgICAgICAgICAgIDMxCisjZGVmaW5lIFdFX0RCR0xPR19WQVBfRU5BQkxFICAgICAgICAgICAgMzIKKyNkZWZpbmUgV0VfREJHTE9HX1ZBUF9ESVNBQkxFICAgICAgICAgICAzMworI2RlZmluZSBXRV9EQkdMT0dfTU9EVUxFX0VOQUJMRSAgICAgICAgIDM0CisjZGVmaW5lIFdFX0RCR0xPR19NT0RVTEVfRElTQUJMRSAgICAgICAgMzUKKyNkZWZpbmUgV0VfREJHTE9HX01PRF9MT0dfTEVWRUwgICAgICAgICAzNgorI2RlZmluZSBXRV9EQkdMT0dfVFlQRSAgICAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIFdFX1NFVF9UWFJYX0ZXU1RBVFMgICAgICAgICAgICAgMzgKKyNkZWZpbmUgV0VfU0VUX1ZIVF9SQVRFICAgICAgICAgICAgICAgICAzOQorI2RlZmluZSBXRV9EQkdMT0dfUkVQT1JUX0VOQUJMRSAgICAgICAgIDQwCisjZGVmaW5lIFdFX1RYUlhfRldTVEFUU19SRVNFVCAgICAgICAgICAgNDEKKyNkZWZpbmUgV0VfU0VUX01BWF9UWF9QT1dFUl8yXzQgICA0MgorI2RlZmluZSBXRV9TRVRfTUFYX1RYX1BPV0VSXzVfMCAgIDQzCisjZGVmaW5lIFdFX1NFVF9QT1dFUl9HQVRJTkcgICAgICAgNDQKKy8qIFByaXZhdGUgaW9jdGwgZm9yIHBhY2tldCBwb3dlIHNhdmUgKi8KKyNkZWZpbmUgIFdFX1BQU19QQUlEX01BVENIICAgICAgICAgICAgICA0NQorI2RlZmluZSAgV0VfUFBTX0dJRF9NQVRDSCAgICAgICAgICAgICAgIDQ2CisjZGVmaW5lICBXRV9QUFNfRUFSTFlfVElNX0NMRUFSICAgICAgICAgNDcKKyNkZWZpbmUgIFdFX1BQU19FQVJMWV9EVElNX0NMRUFSICAgICAgICA0OAorI2RlZmluZSAgV0VfUFBTX0VPRl9QQURfREVMSU0gICAgICAgICAgIDQ5CisjZGVmaW5lICBXRV9QUFNfTUFDQUREUl9NSVNNQVRDSCAgICAgICAgNTAKKyNkZWZpbmUgIFdFX1BQU19ERUxJTV9DUkNfRkFJTCAgICAgICAgICA1MQorI2RlZmluZSAgV0VfUFBTX0dJRF9OU1RTX1pFUk8gICAgICAgICAgIDUyCisjZGVmaW5lICBXRV9QUFNfUlNTSV9DSEVDSyAgICAgICAgICAgICAgNTMKKyNkZWZpbmUgV0VfU0VUX1NBUF9BVVRPX0NIQU5ORUxfU0VMRUNUSU9OICAgICA1NAorI2RlZmluZSBXRV9TRVRfSFRTTVBTICAgICAgICAgICAgICAgICAgIDU1CisvKiBQcml2YXRlIGlvY3RsIGZvciBRUG93ZXIgKi8KKyNkZWZpbmUgV0VfU0VUX1FQT1dFUl9NQVhfUFNQT0xMX0NPVU5UICAgICAgICAgICAgNTYKKyNkZWZpbmUgV0VfU0VUX1FQT1dFUl9NQVhfVFhfQkVGT1JFX1dBS0UgICAgICAgICAgNTcKKyNkZWZpbmUgV0VfU0VUX1FQT1dFUl9TUEVDX1BTUE9MTF9XQUtFX0lOVEVSVkFMICAgNTgKKyNkZWZpbmUgV0VfU0VUX1FQT1dFUl9TUEVDX01BWF9TUEVDX05PREFUQV9QU1BPTEwgNTkKKworI2RlZmluZSBXRV9TRVRfQlVSU1RfRU5BQkxFICAgICAgICAgICAgIDYwCisjZGVmaW5lIFdFX1NFVF9CVVJTVF9EVVIgICAgICAgICAgICAgICAgNjEKKy8qIEdUWCBDb21tYW5kcyAqLworI2RlZmluZSBXRV9TRVRfR1RYX0hUX01DUyAgICAgICAgICAgICAgIDYyCisjZGVmaW5lIFdFX1NFVF9HVFhfVkhUX01DUyAgICAgICAgICAgICAgNjMKKyNkZWZpbmUgV0VfU0VUX0dUWF9VU1JDRkcgICAgICAgICAgICAgICA2NAorI2RlZmluZSBXRV9TRVRfR1RYX1RIUkUgICAgICAgICAgICAgICAgIDY1CisjZGVmaW5lIFdFX1NFVF9HVFhfTUFSR0lOICAgICAgICAgICAgICAgNjYKKyNkZWZpbmUgV0VfU0VUX0dUWF9TVEVQICAgICAgICAgICAgICAgICA2NworI2RlZmluZSBXRV9TRVRfR1RYX01JTlRQQyAgICAgICAgICAgICAgIDY4CisjZGVmaW5lIFdFX1NFVF9HVFhfQldNQVNLICAgICAgICAgICAgICAgNjkKKy8qIFByaXZhdGUgaW9jdGwgdG8gY29uZmlndXJlIE1DQyBob21lIGNoYW5uZWxzIHRpbWUgcXVvdGEgYW5kIGxhdGVuY3kgKi8KKyNkZWZpbmUgV0VfTUNDX0NPTkZJR19MQVRFTkNZICAgICAgICAgICA3MAorI2RlZmluZSBXRV9NQ0NfQ09ORklHX1FVT1RBICAgICAgICAgICAgIDcxCisvKiBQcml2YXRlIElPQ1RMIGZvciBkZWJ1ZyBjb25uZWN0aW9uIGlzc3VlcyAqLworI2RlZmluZSBXRV9TRVRfREVCVUdfTE9HICAgICAgICAgICAgICAgIDcyCisjaWZkZWYgV0VfU0VUX1RYX1BPV0VSCisjdW5kZWYgV0VfU0VUX1RYX1BPV0VSCisjZW5kaWYKKyNkZWZpbmUgV0VfU0VUX1RYX1BPV0VSICAgICAgICAgICAgICAgICA3NAorLyogUHJpdmF0ZSBpb2N0bCBmb3IgZWFybHlyeCBwb3dlciBzYXZlIGZlYXR1cmUgKi8KKyNkZWZpbmUgV0VfU0VUX0VBUkxZX1JYX0FESlVTVF9FTkFCTEUgICAgICAgICA3NQorI2RlZmluZSBXRV9TRVRfRUFSTFlfUlhfVEdUX0JNSVNTX05VTSAgICAgICAgIDc2CisjZGVmaW5lIFdFX1NFVF9FQVJMWV9SWF9CTUlTU19TQU1QTEVfQ1lDTEUgICAgNzcKKyNkZWZpbmUgV0VfU0VUX0VBUkxZX1JYX1NMT1BfU1RFUCAgICAgICAgICAgICA3OAorI2RlZmluZSBXRV9TRVRfRUFSTFlfUlhfSU5JVF9TTE9QICAgICAgICAgICAgIDc5CisjZGVmaW5lIFdFX1NFVF9FQVJMWV9SWF9BREpVU1RfUEFVU0UgICAgICAgICAgODAKKyNkZWZpbmUgV0VfU0VUX01DX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICA4MQorI2RlZmluZSBXRV9TRVRfRUFSTFlfUlhfRFJJRlRfU0FNUExFICAgICAgICAgIDgyCisvKiBQcml2YXRlIGlvY3RsIGZvciBwYWNrZXQgcG93ZXIgc2F2ZSAqLworI2RlZmluZSBXRV9QUFNfNUdfRUJUICAgICAgICAgICAgICAgICAgICAgICAgIDgzCisjZGVmaW5lIFdFX1NFVF9DVFNfQ0JXICAgICAgICAgICAgICAgICAgICAgICAgODQKKyNkZWZpbmUgV0VfRFVNUF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICA4NQorI2RlZmluZSBXRV9DTEVBUl9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgIDg2CisKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fUFJJVl9TRVRfTk9ORV9HRVRfSU5UICAgIChTSU9DSVdGSVJTVFBSSVYgKyAxKQorI2RlZmluZSBXRV9HRVRfMTFEX1NUQVRFICAgICAxCisjZGVmaW5lIFdFX0lCU1NfU1RBVFVTICAgICAgIDIKKyNkZWZpbmUgV0VfU0VUX1NBUF9DSEFOTkVMUyAgMworI2RlZmluZSBXRV9HRVRfV0xBTl9EQkcgICAgICA0CisjZGVmaW5lIFdFX0dFVF9NQVhfQVNTT0MgICAgIDYKKy8qIDcgaXMgdW51c2VkICovCisjZGVmaW5lIFdFX0dFVF9TQVBfQVVUT19DSEFOTkVMX1NFTEVDVElPTiA4CisjZGVmaW5lIFdFX0dFVF9DT05DVVJSRU5DWV9NT0RFIDkKKyNkZWZpbmUgV0VfR0VUX05TUyAgICAgICAgICAgMTEKKyNkZWZpbmUgV0VfR0VUX0xEUEMgICAgICAgICAgMTIKKyNkZWZpbmUgV0VfR0VUX1RYX1NUQkMgICAgICAgMTMKKyNkZWZpbmUgV0VfR0VUX1JYX1NUQkMgICAgICAgMTQKKyNkZWZpbmUgV0VfR0VUX1NIT1JUX0dJICAgICAgMTUKKyNkZWZpbmUgV0VfR0VUX1JUU0NUUyAgICAgICAgMTYKKyNkZWZpbmUgV0VfR0VUX0NIV0lEVEggICAgICAgMTcKKyNkZWZpbmUgV0VfR0VUX0FOSV9FTl9ESVMgICAgMTgKKyNkZWZpbmUgV0VfR0VUX0FOSV9QT0xMX1BFUklPRCAgICAxOQorI2RlZmluZSBXRV9HRVRfQU5JX0xJU1RFTl9QRVJJT0QgIDIwCisjZGVmaW5lIFdFX0dFVF9BTklfT0ZETV9MRVZFTCAgICAgMjEKKyNkZWZpbmUgV0VfR0VUX0FOSV9DQ0tfTEVWRUwgICAgICAyMgorI2RlZmluZSBXRV9HRVRfRFlOQU1JQ19CVyAgICAgICAgIDIzCisjZGVmaW5lIFdFX0dFVF9UWF9DSEFJTk1BU0sgIDI0CisjZGVmaW5lIFdFX0dFVF9SWF9DSEFJTk1BU0sgIDI1CisjZGVmaW5lIFdFX0dFVF8xMU5fUkFURSAgICAgIDI2CisjZGVmaW5lIFdFX0dFVF9BTVBEVSAgICAgICAgIDI3CisjZGVmaW5lIFdFX0dFVF9BTVNEVSAgICAgICAgIDI4CisjZGVmaW5lIFdFX0dFVF9UWFBPV18yRyAgICAgIDI5CisjZGVmaW5lIFdFX0dFVF9UWFBPV181RyAgICAgIDMwCisjZGVmaW5lIFdFX0dFVF9QT1dFUl9HQVRJTkcgIDMxCisjZGVmaW5lIFdFX0dFVF9QUFNfUEFJRF9NQVRDSCAgICAgICAgICAgMzIKKyNkZWZpbmUgV0VfR0VUX1BQU19HSURfTUFUQ0ggICAgICAgICAgICAzMworI2RlZmluZSBXRV9HRVRfUFBTX0VBUkxZX1RJTV9DTEVBUiAgICAgIDM0CisjZGVmaW5lIFdFX0dFVF9QUFNfRUFSTFlfRFRJTV9DTEVBUiAgICAgMzUKKyNkZWZpbmUgV0VfR0VUX1BQU19FT0ZfUEFEX0RFTElNICAgICAgICAzNgorI2RlZmluZSBXRV9HRVRfUFBTX01BQ0FERFJfTUlTTUFUQ0ggICAgIDM3CisjZGVmaW5lIFdFX0dFVF9QUFNfREVMSU1fQ1JDX0ZBSUwgICAgICAgMzgKKyNkZWZpbmUgV0VfR0VUX1BQU19HSURfTlNUU19aRVJPICAgICAgICAzOQorI2RlZmluZSBXRV9HRVRfUFBTX1JTU0lfQ0hFQ0sgICAgICAgICAgIDQwCisvKiBQcml2YXRlIGlvY3RsIGZvciBRUG93ZXIgKi8KKyNkZWZpbmUgV0VfR0VUX1FQT1dFUl9NQVhfUFNQT0xMX0NPVU5UICAgICAgICAgICAgNDEKKyNkZWZpbmUgV0VfR0VUX1FQT1dFUl9NQVhfVFhfQkVGT1JFX1dBS0UgICAgICAgICAgNDIKKyNkZWZpbmUgV0VfR0VUX1FQT1dFUl9TUEVDX1BTUE9MTF9XQUtFX0lOVEVSVkFMICAgNDMKKyNkZWZpbmUgV0VfR0VUX1FQT1dFUl9TUEVDX01BWF9TUEVDX05PREFUQV9QU1BPTEwgNDQKKyNkZWZpbmUgV0VfR0VUX0JVUlNUX0VOQUJMRSAgICAgICAgICAgICA0NQorI2RlZmluZSBXRV9HRVRfQlVSU1RfRFVSICAgICAgICAgICAgICAgIDQ2CisvKiBHVFggQ29tbWFuZHMgKi8KKyNkZWZpbmUgV0VfR0VUX0dUWF9IVF9NQ1MgICAgICAgICAgICAgICA0NworI2RlZmluZSBXRV9HRVRfR1RYX1ZIVF9NQ1MgICAgICAgICAgICAgIDQ4CisjZGVmaW5lIFdFX0dFVF9HVFhfVVNSQ0ZHICAgICAgICAgICAgICAgNDkKKyNkZWZpbmUgV0VfR0VUX0dUWF9USFJFICAgICAgICAgICAgICAgICA1MAorI2RlZmluZSBXRV9HRVRfR1RYX01BUkdJTiAgICAgICAgICAgICAgIDUxCisjZGVmaW5lIFdFX0dFVF9HVFhfU1RFUCAgICAgICAgICAgICAgICAgNTIKKyNkZWZpbmUgV0VfR0VUX0dUWF9NSU5UUEMgICAgICAgICAgICAgICA1MworI2RlZmluZSBXRV9HRVRfR1RYX0JXTUFTSyAgICAgICAgICAgICAgIDU0CisjZGVmaW5lIFdFX0dFVF9URU1QRVJBVFVSRSAgICAgICAgICAgICAgNTYKKworLyogUHJpdmF0ZSBpb2N0bHMgYW5kIHRoZWlyIHN1Yi1pb2N0bHMgKi8KKyNkZWZpbmUgV0xBTl9QUklWX1NFVF9JTlRfR0VUX0lOVCAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDIpCisKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fUFJJVl9TRVRfQ0hBUl9HRVRfTk9ORSAgIChTSU9DSVdGSVJTVFBSSVYgKyAzKQorI2RlZmluZSBXRV9XT1dMX0FERF9QVFJOICAgICAxCisjZGVmaW5lIFdFX1dPV0xfREVMX1BUUk4gICAgIDIKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNkZWZpbmUgV0VfTkVJR0hCT1JfUkVQT1JUX1JFUVVFU1QgMworI2VuZGlmCisjZGVmaW5lIFdFX1NFVF9BUF9XUFNfSUUgICAgIDQgIC8qIFRoaXMgaXMgY2FsbGVkIGluIHN0YXRpb24gbW9kZSB0byBzZXQgcHJvYmUgcnNwIGllLiAqLworI2RlZmluZSBXRV9TRVRfQ09ORklHICAgICAgICA1CisKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fUFJJVl9TRVRfVEhSRUVfSU5UX0dFVF9OT05FICAgKFNJT0NJV0ZJUlNUUFJJViArIDQpCisjZGVmaW5lIFdFX1NFVF9XTEFOX0RCRyAgICAgIDEKKyNkZWZpbmUgV0VfU0VUX0RQX1RSQUNFICAgICAgMgorI2RlZmluZSBXRV9TRVRfU0FQX0NIQU5ORUxTICAzCisKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fUFJJVl9HRVRfQ0hBUl9TRVRfTk9ORSAgIChTSU9DSVdGSVJTVFBSSVYgKyA1KQorI2RlZmluZSBXRV9XTEFOX1ZFUlNJT04gICAgICAxCisjZGVmaW5lIFdFX0dFVF9TVEFUUyAgICAgICAgIDIKKyNkZWZpbmUgV0VfR0VUX0NGRyAgICAgICAgICAgMworI2RlZmluZSBXRV9HRVRfV01NX1NUQVRVUyAgICA0CisjZGVmaW5lIFdFX0dFVF9DSEFOTkVMX0xJU1QgIDUKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworI2RlZmluZSBXRV9HRVRfUlNTSSAgICAgICAgICA2CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworI2RlZmluZSBXRV9HRVRfVERMU19QRUVSUyAgICA4CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisjZGVmaW5lIFdFX0dFVF8xMVdfSU5GTyAgICAgIDkKKyNlbmRpZgorI2RlZmluZSBXRV9HRVRfU1RBVEVTICAgICAgICAxMAorCisjZGVmaW5lIFdFX0dFVF9QSFlNT0RFICAgICAgIDEyCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisjZGVmaW5lIFdFX0dFVF9PRU1fREFUQV9DQVAgIDEzCisjZW5kaWYKKyNkZWZpbmUgV0VfR0VUX1NOUiAgICAgICAgICAgMTQKKworLyogUHJpdmF0ZSBpb2N0bHMgYW5kIHRoZWlyIHN1Yi1pb2N0bHMgKi8KKyNkZWZpbmUgV0xBTl9QUklWX1NFVF9OT05FX0dFVF9OT05FICAgKFNJT0NJV0ZJUlNUUFJJViArIDYpCisjZGVmaW5lIFdFX1NFVF9SRUFTU09DX1RSSUdHRVIgICAgIDgKKworI2RlZmluZSBXRV9EVU1QX0FHQ19TVEFSVCAgICAgICAgICAxMQorI2RlZmluZSBXRV9EVU1QX0FHQyAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBXRV9EVU1QX0NIQU5JTkZPX1NUQVJUICAgICAxMworI2RlZmluZSBXRV9EVU1QX0NIQU5JTkZPICAgICAgICAgICAxNAorI2RlZmluZSBXRV9EVU1QX1dBVENIRE9HICAgICAgICAgICAxNQorI2lmZGVmIENPTkZJR19BVEhfUENJRV9BQ0NFU1NfREVCVUcKKyNkZWZpbmUgV0VfRFVNUF9QQ0lFX0xPRyAgICAgICAgICAgMTYKKyNlbmRpZgorI2RlZmluZSBXRV9HRVRfUkVDT1ZFUllfU1RBVCAgICAgICAxNworCisvKiBQcml2YXRlIGlvY3RscyBhbmQgdGhlaXIgc3ViLWlvY3RscyAqLworI2RlZmluZSBXTEFOX1BSSVZfU0VUX1ZBUl9JTlRfR0VUX05PTkUgICAoU0lPQ0lXRklSU1RQUklWICsgNykKKworI2RlZmluZSBXRV9QMlBfTk9BX0NNRCAgICAgICAyCisKKy8qIHN1YmNvbW1hbmRzIDMgYW5kIDQgYXJlIHVudXNlZCAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKyNkZWZpbmUgV0VfVERMU19DT05GSUdfUEFSQU1TICAgNQorI2VuZGlmCisKKyNkZWZpbmUgV0VfVU5JVF9URVNUX0NNRCAgIDcKKworI2RlZmluZSBXRV9NVFJBQ0VfRFVNUF9DTUQgICAgOAorI2RlZmluZSBXRV9NVFJBQ0VfU0VMRUNUSVZFX01PRFVMRV9MT0dfRU5BQkxFX0NNRCAgICA5CisKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9HUElPX0xFRF9GTEFTSElORworI2RlZmluZSBXRV9MRURfRkxBU0hJTkdfUEFSQU0gICAgMTAKKyNlbmRpZgorCisjZGVmaW5lIFdFX1BPTElDWV9NQU5BR0VSX0NMSVNUX0NNRCAgICAxMQorI2RlZmluZSBXRV9QT0xJQ1lfTUFOQUdFUl9ETElTVF9DTUQgICAgMTIKKyNkZWZpbmUgV0VfUE9MSUNZX01BTkFHRVJfREJTX0NNRCAgICAgIDEzCisjZGVmaW5lIFdFX1BPTElDWV9NQU5BR0VSX1BDTF9DTUQgICAgICAxNAorI2RlZmluZSBXRV9QT0xJQ1lfTUFOQUdFUl9DSU5GT19DTUQgICAgMTUKKyNkZWZpbmUgV0VfUE9MSUNZX01BTkFHRVJfVUxJU1RfQ01EICAgIDE2CisjZGVmaW5lIFdFX1BPTElDWV9NQU5BR0VSX1FVRVJZX0FDVElPTl9DTUQgICAgMTcKKyNkZWZpbmUgV0VfUE9MSUNZX01BTkFHRVJfUVVFUllfQUxMT1dfQ01EICAgIDE4CisjZGVmaW5lIFdFX1BPTElDWV9NQU5BR0VSX1NDRU5BUklPX0NNRCAxOQorI2RlZmluZSBXRV9QT0xJQ1lfU0VUX0hXX01PREVfQ01EIDIwCisKKyNkZWZpbmUgV0VfU0VUX0RVQUxfTUFDX1NDQU5fQ09ORklHICAgIDIxCisjZGVmaW5lIFdFX1NFVF9EVUFMX01BQ19GV19NT0RFX0NPTkZJRyAyMgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKyN1bmRlZiAgTUFYX1ZBUl9BUkdTCisjZGVmaW5lIE1BWF9WQVJfQVJHUyAgICAgICAgIDExCisjZWxzZQorI3VuZGVmICBNQVhfVkFSX0FSR1MKKyNkZWZpbmUgTUFYX1ZBUl9BUkdTICAgICAgICAgOQorI2VuZGlmCisKKy8qIFByaXZhdGUgaW9jdGxzICh3aXRoIG5vIHN1Yi1pb2N0bHMpICovCisvKiBub3RlIHRoYXQgdGhleSBtdXN0IGJlIG9kZCBzbyB0aGF0IHRoZXkgaGF2ZSAiZ2V0IiBzZW1hbnRpY3MgKi8KKyNkZWZpbmUgV0xBTl9QUklWX0FERF9UU1BFQyAoU0lPQ0lXRklSU1RQUklWICsgIDkpCisjZGVmaW5lIFdMQU5fUFJJVl9ERUxfVFNQRUMgKFNJT0NJV0ZJUlNUUFJJViArIDExKQorI2RlZmluZSBXTEFOX1BSSVZfR0VUX1RTUEVDIChTSU9DSVdGSVJTVFBSSVYgKyAxMykKKworLyogKFNJT0NJV0ZJUlNUUFJJViArIDgpICBpcyBjdXJyZW50bHkgdW51c2VkICovCisvKiAoU0lPQ0lXRklSU1RQUklWICsgMTApIGlzIGN1cnJlbnRseSB1bnVzZWQgKi8KKy8qIChTSU9DSVdGSVJTVFBSSVYgKyAxMikgaXMgY3VycmVudGx5IHVudXNlZCAqLworLyogKFNJT0NJV0ZJUlNUUFJJViArIDE0KSBpcyBjdXJyZW50bHkgdW51c2VkICovCisvKiAoU0lPQ0lXRklSU1RQUklWICsgMTUpIGlzIGN1cnJlbnRseSB1bnVzZWQgKi8KKy8qIChTSU9DSVdGSVJTVFBSSVYgKyAxNikgaXMgY3VycmVudGx5IHVudXNlZCAqLworLyogKFNJT0NJV0ZJUlNUUFJJViArIDE3KSBpcyBjdXJyZW50bHkgdW51c2VkICovCisvKiAoU0lPQ0lXRklSU1RQUklWICsgMTkpIGlzIGN1cnJlbnRseSB1bnVzZWQgKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjZGVmaW5lIFdMQU5fUFJJVl9TRVRfRlRJRVMgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDIwKQorI2VuZGlmCisKKy8qIFByaXZhdGUgaW9jdGwgZm9yIHNldHRpbmcgdGhlIGhvc3Qgb2ZmbG9hZCBmZWF0dXJlICovCisjZGVmaW5lIFdMQU5fUFJJVl9TRVRfSE9TVF9PRkZMT0FEIChTSU9DSVdGSVJTVFBSSVYgKyAxOCkKKworLyogUHJpdmF0ZSBpb2N0bCB0byBnZXQgdGhlIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgV0xBTl9HRVRfV0xBTl9TVEFUSVNUSUNTIChTSU9DSVdGSVJTVFBSSVYgKyAyMSkKKworLyogUHJpdmF0ZSBpb2N0bCB0byBzZXQgdGhlIEtlZXAgQWxpdmUgUGFyYW1zICovCisjZGVmaW5lIFdMQU5fU0VUX0tFRVBBTElWRV9QQVJBTVMgKFNJT0NJV0ZJUlNUUFJJViArIDIyKQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKy8qIFByaXZhdGUgaW9jdGwgdG8gc2V0IHRoZSBwYWNrZXQgZmlsdGVyaW5nIHBhcmFtcyAqLworI2RlZmluZSBXTEFOX1NFVF9QQUNLRVRfRklMVEVSX1BBUkFNUyAoU0lPQ0lXRklSU1RQUklWICsgMjMpCisjZW5kaWYKKworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisvKiBQcml2YXRlIGlvY3RsIHRvIGdldCB0aGUgc3RhdGlzdGljcyAqLworI2RlZmluZSBXTEFOX1NFVF9QTk8gKFNJT0NJV0ZJUlNUUFJJViArIDI0KQorI2VuZGlmCisKKyNkZWZpbmUgV0xBTl9TRVRfQkFORF9DT05GSUcgIChTSU9DSVdGSVJTVFBSSVYgKyAyNSkKKworLyogKFNJT0NJV0ZJUlNUUFJJViArIDI2KSBpcyBjdXJyZW50bHkgdW51c2VkICovCisvKiAoU0lPQ0lXRklSU1RQUklWICsgMjcpIGlzIGN1cnJlbnRseSB1bnVzZWQgKi8KKworLyogUHJpdmF0ZSBpb2N0bHMgYW5kIHRoZWlyIHN1Yi1pb2N0bHMgKi8KKyNkZWZpbmUgV0xBTl9QUklWX1NFVF9UV09fSU5UX0dFVF9OT05FICAgKFNJT0NJV0ZJUlNUUFJJViArIDI4KQorI2RlZmluZSBXRV9TRVRfU01QU19QQVJBTSAgICAxCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgV0VfU0VUX0ZXX0NSQVNIX0lOSkVDVCAgICAyCisjZW5kaWYKKyNkZWZpbmUgV0VfRFVNUF9EUF9UUkFDRV9MRVZFTCAgICAzCisjZGVmaW5lIERVTVBfRFBfVFJBQ0UgICAgICAgMAorCisvKiAoU0lPQ0lXRklSU1RQUklWICsgMjkpIGlzIGN1cnJlbnRseSB1bnVzZWQgKi8KKworLyogODAyLjExcCBJT0NUTCAqLworI2RlZmluZSBXTEFOX1NFVF9ET1QxMVBfQ0hBTk5FTF9TQ0hFRCAgICAoU0lPQ0lXRklSU1RQUklWICsgMzApCisKKyNkZWZpbmUgV0xBTl9HRVRfTElOS19TUEVFRCAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMzEpCisKKyNkZWZpbmUgV0xBTl9TVEFUU19JTlZBTElEICAgICAgICAgICAgMAorI2RlZmluZSBXTEFOX1NUQVRTX1JFVFJZX0NOVCAgICAgICAgICAxCisjZGVmaW5lIFdMQU5fU1RBVFNfTVVMX1JFVFJZX0NOVCAgICAgIDIKKyNkZWZpbmUgV0xBTl9TVEFUU19UWF9GUk1fQ05UICAgICAgICAgMworI2RlZmluZSBXTEFOX1NUQVRTX1JYX0ZSTV9DTlQgICAgICAgICA0CisjZGVmaW5lIFdMQU5fU1RBVFNfRlJNX0RVUF9DTlQgICAgICAgIDUKKyNkZWZpbmUgV0xBTl9TVEFUU19GQUlMX0NOVCAgICAgICAgICAgNgorI2RlZmluZSBXTEFOX1NUQVRTX1JUU19GQUlMX0NOVCAgICAgICA3CisjZGVmaW5lIFdMQU5fU1RBVFNfQUNLX0ZBSUxfQ05UICAgICAgIDgKKyNkZWZpbmUgV0xBTl9TVEFUU19SVFNfU1VDX0NOVCAgICAgICAgOQorI2RlZmluZSBXTEFOX1NUQVRTX1JYX0RJU0NBUkRfQ05UICAgICAxMAorI2RlZmluZSBXTEFOX1NUQVRTX1JYX0VSUk9SX0NOVCAgICAgICAxMQorI2RlZmluZSBXTEFOX1NUQVRTX1RYX0JZVEVfQ05UICAgICAgICAxMgorCisjZGVmaW5lIFdMQU5fU1RBVFNfUlhfQllURV9DTlQgICAgICAgIDEzCisjZGVmaW5lIFdMQU5fU1RBVFNfUlhfUkFURSAgICAgICAgICAgIDE0CisjZGVmaW5lIFdMQU5fU1RBVFNfVFhfUkFURSAgICAgICAgICAgIDE1CisKKyNkZWZpbmUgV0xBTl9TVEFUU19SWF9VQ19CWVRFX0NOVCAgICAgMTYKKyNkZWZpbmUgV0xBTl9TVEFUU19SWF9NQ19CWVRFX0NOVCAgICAgMTcKKyNkZWZpbmUgV0xBTl9TVEFUU19SWF9CQ19CWVRFX0NOVCAgICAgMTgKKyNkZWZpbmUgV0xBTl9TVEFUU19UWF9VQ19CWVRFX0NOVCAgICAgMTkKKyNkZWZpbmUgV0xBTl9TVEFUU19UWF9NQ19CWVRFX0NOVCAgICAgMjAKKyNkZWZpbmUgV0xBTl9TVEFUU19UWF9CQ19CWVRFX0NOVCAgICAgMjEKKworI2RlZmluZSBGSUxMX1RMVihfX3AsIF9fdHlwZSwgX19zaXplLCBfX3ZhbCwgX190bGVuKSBkbyB7CQlcCisJCWlmICgoX190bGVuICsgX19zaXplICsgMikgPCBXRV9NQVhfU1RSX0xFTikgewkJXAorCQkJKl9fcCsrID0gX190eXBlOwkJCQlcCisJCQkqX19wKysgPSBfX3NpemU7CQkJCVwKKwkJCW1lbWNweShfX3AsIF9fdmFsLCBfX3NpemUpOwkJCVwKKwkJCV9fcCArPSBfX3NpemU7CQkJCQlcCisJCQlfX3RsZW4gKz0gX19zaXplICsgMjsJCQkJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICJGSUxMX1RMViBGYWlsZWQhISEiKTsgIFwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBWRVJTSU9OX1ZBTFVFX01BWF9MRU4gMzIKKworI2RlZmluZSBUWF9QRVJfVFJBQ0tJTkdfREVGQVVMVF9SQVRJTyAgICAgICAgICAgICA1CisjZGVmaW5lIFRYX1BFUl9UUkFDS0lOR19NQVhfUkFUSU8gICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVFhfUEVSX1RSQUNLSU5HX0RFRkFVTFRfV0FURVJNQVJLICAgICAgICAgNQorCisjZGVmaW5lIFdMQU5fQURBUFRFUiAwCisjZGVmaW5lIFAyUF9BREFQVEVSICAxCisKKy8qKgorICogbWVtX2FsbG9jX2NvcHlfZnJvbV91c2VyX2hlbHBlciAtIGNvcHkgZnJvbSB1c2VyIGhlbHBlcgorICogQHdycXVfZGF0YTogd2lyZWxlc3MgZXh0ZW5zaW9ucyByZXF1ZXN0IGRhdGEKKyAqIEBsZW46IGxlbmd0aCBvZiBAd3JxdV9kYXRhCisgKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJ1ZmZlciBhbmQgY29weSB1c2VyIGRhdGEuCisgKgorICogUmV0dXJuOiBPbiBzdWNjZXNzIHJldHVybiBhIHBvaW50ZXIgdG8gYSBrZXJuZWwgYnVmZmVyIGNvbnRhaW5pbmcgYQorICogY29weSBvZiB0aGUgdXNlcnNwYWNlIGRhdGEgKHdpdGggYW4gYWRkaXRpb25hbCBOVUwgY2hhcmFjdGVyCisgKiBhcHBlbmRlZCBmb3Igc2FmZXR5KS4gT24gZmFpbHVyZSByZXR1cm4gJU5VTEwuCisgKi8KK3ZvaWQgKm1lbV9hbGxvY19jb3B5X2Zyb21fdXNlcl9oZWxwZXIoY29uc3QgX191c2VyIHZvaWQgKndycXVfZGF0YSwgc2l6ZV90IGxlbikKK3sKKwl1OCAqcHRyID0gTlVMTDsKKworCS8qIGluIG9yZGVyIHRvIHByb3RlY3QgdGhlIGNvZGUsIGFuIGV4dHJhIGJ5dGUgaXMgcG9zdAorCSAqIGFwcGVuZGVkIHRvIHRoZSBidWZmZXIgYW5kIHRoZSBudWxsIHRlcm1pbmF0aW9uIGlzIGFkZGVkLgorCSAqIEhvd2V2ZXIsIHdoZW4gYWxsb2NhdGluZyAobGVuKzEpIGJ5dGUgb2YgbWVtb3J5LCB3ZSBuZWVkIHRvCisJICogbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgbm8gdWludCBvdmVyZmxvdyB3aGVuIGRvaW5nCisJICogYWRkaXRpb24uIEluIHRoZW9yeSBjaGVjayBsZW4gPCBVSU5UX01BWCBwcm90ZWN0cyB0aGUgdWludAorCSAqIG92ZXJmbG93LiBGb3Igd2xhbiBwcml2YXRlIGlvY3RsLCB0aGUgYnVmZmVyIHNpemUgaXMgbXVjaAorCSAqIGxlc3MgdGhhbiBVSU5UX01BWCwgYXMgYSBnb29kIGd1ZXNzLCBub3csIGl0IGlzIGFzc3VtZWQKKwkgKiB0aGF0IHRoZSBwcml2YXRlIGNvbW1hbmQgYnVmZmVyIHNpemUgaXMgbm8gZ3JlYXRlciB0aGFuIDRLCisJICogKDQwOTYgYnl0ZXMpLiBTbyB3ZSB1c2UgNDA5NiBhcyB0aGUgdXBwZXIgYm91bmRhcnkgZm9yIG5vdy4KKwkgKi8KKwlpZiAobGVuID4gTUFYX1VTRVJfQ09NTUFORF9TSVpFKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW52YWxpZCBsZW5ndGgiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHRyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBwdHIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihwdHIsIHdycXVfZGF0YSwgbGVuKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyIiwgX19mdW5jX18pOworCQlrZnJlZShwdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcHRyW2xlbl0gPSAnXDAnOworCXJldHVybiBwdHI7Cit9CisKKy8qKgorICogaGRkX3ByaXZfZ2V0X2RhdGEoKSAtIEdldCBwb2ludGVyIHRvIGlvY3RsIHByaXZhdGUgZGF0YQorICogQHBfcHJpdl9kYXRhOiBwb2ludGVyIHRvIGl3X3BvaW50IHN0cnVjdCB0byBiZSBmaWxsZWQKKyAqIEB3cnF1OiBQb2ludGVyIHRvIElPQ1RMIERhdGEgcmVjZWl2ZWQgZnJvbSB1c2Vyc3BhY2UKKyAqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGNvbXBhdGlibGUgc3RydWN0IGl3X3BvaW50IHBhc3NlZCB0byBpb2N0bAorICoKKyAqIFJldHVybiAtIDAgaWYgcF9wcml2X2RhdGEgc3VjY2Vzc2Z1bGx5IGZpbGxlZCwgZXJyb3Igb3RoZXJ3aXNlCisgKi8KK2ludCBoZGRfcHJpdl9nZXRfZGF0YShzdHJ1Y3QgaXdfcG9pbnQgKnBfcHJpdl9kYXRhLCB1bmlvbiBpd3JlcV9kYXRhICp3cnF1KQoreworCWlmICgoTlVMTCA9PSBwX3ByaXZfZGF0YSkgfHwgKE5VTEwgPT0gd3JxdSkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2lmZGVmIENPTkZJR19DT01QQVQKKwlpZiAoaXNfY29tcGF0X3Rhc2soKSkgeworCQlzdHJ1Y3QgY29tcGF0X2l3X3BvaW50ICpwX2NvbXBhdF9wcml2X2RhdGE7CisKKwkJLyogQ29tcGF0IHRhc2s6CisJCSAqIHR5cGVjYXN0IHRvIGNvbXBhdCBzdHJ1Y3R1cmUgYW5kIGNvcHkgdGhlIG1lbWJlcnMuCisJCSAqLworCQlwX2NvbXBhdF9wcml2X2RhdGEgPSAoc3RydWN0IGNvbXBhdF9pd19wb2ludCAqKSZ3cnF1LT5kYXRhOworCisJCXBfcHJpdl9kYXRhLT5wb2ludGVyID0gY29tcGF0X3B0cihwX2NvbXBhdF9wcml2X2RhdGEtPnBvaW50ZXIpOworCQlwX3ByaXZfZGF0YS0+bGVuZ3RoID0gcF9jb21wYXRfcHJpdl9kYXRhLT5sZW5ndGg7CisJCXBfcHJpdl9kYXRhLT5mbGFncyA9IHBfY29tcGF0X3ByaXZfZGF0YS0+ZmxhZ3M7CisJfSBlbHNlIHsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0NPTVBBVCAqLworCisJCS8qIE5vbiBjb21wYXQgdGFzazogZGlyZWN0bHkgY29weSB0aGUgc3RydWN0dXJlLiAqLworCQltZW1jcHkocF9wcml2X2RhdGEsICZ3cnF1LT5kYXRhLCBzaXplb2Yoc3RydWN0IGl3X3BvaW50KSk7CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJfQorI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfQ09NUEFUICovCisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIGhkZF93bGFuX2dldF9zdGF0cygpIC0gR2V0IHR4cnggc3RhdHMgaW4gU0FQIG1vZGUKKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byB0aGUgaGRkIGFkYXB0ZXIuCisgKiBAbGVuZ3RoOiAgIFNpemUgb2YgdGhlIGRhdGEgY29waWVkCisgKiBAYnVmZmVyOiAgIFBvaW50ZXIgdG8gY2hhciBidWZmZXIuCisgKiBAYnVmX2xlbjogIExlbmd0aCBvZiB0aGUgY2hhciBidWZmZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgIml3cHJpdiB3bGFuMCBnZXRfc3RhdHMiIGNvbW1hbmQgaXMgZ2l2ZW4uCisgKiBJdCB1c2VkIHRvIGNvbGxlY3QgdGhlIHR4cnggc3RhdHMgd2hlbiB0aGUgZGV2aWNlIGlzIGNvbmZpZ3VyZWQgaW4gU0FQIG1vZGUuCisgKgorICogUmV0dXJuIC0gbm9uZQorICovCit2b2lkIGhkZF93bGFuX2dldF9zdGF0cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdWludDE2X3QgKmxlbmd0aCwKKwkJCWNoYXIgKmJ1ZmZlciwgdWludDE2X3QgYnVmX2xlbikKK3sKKwloZGRfdHhfcnhfc3RhdHNfdCAqcFN0YXRzID0gJnBBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzOworCXVpbnQzMl90IGxlbiA9IDA7CisJdWludDMyX3QgdG90YWxfcnhfcGt0ID0gMCwgdG90YWxfcnhfZHJvcHBlZCA9IDA7CisJdWludDMyX3QgdG90YWxfcnhfZGVsdiA9IDAsIHRvdGFsX3J4X3JlZnVzZWQgPSAwOworCWludCBpID0gMDsKKworCWZvciAoOyBpIDwgTlVNX0NQVVM7IGkrKykgeworCQl0b3RhbF9yeF9wa3QgKz0gcFN0YXRzLT5yeFBhY2tldHNbaV07CisJCXRvdGFsX3J4X2Ryb3BwZWQgKz0gcFN0YXRzLT5yeERyb3BwZWRbaV07CisJCXRvdGFsX3J4X2RlbHYgKz0gcFN0YXRzLT5yeERlbGl2ZXJlZFtpXTsKKwkJdG90YWxfcnhfcmVmdXNlZCArPSBwU3RhdHMtPnJ4UmVmdXNlZFtpXTsKKwl9CisKKwlsZW4gPSBzY25wcmludGYoYnVmZmVyLCBidWZfbGVuLAorCQkiXG5UcmFuc21pdCIKKwkJIlxuY2FsbGVkICV1LCBkcm9wcGVkICV1LCIKKwkJIlxuICAgICAgZHJvcHBlZCBCSyAldSwgQkUgJXUsIFZJICV1LCBWTyAldSIKKwkJIlxuICAgY2xhc3NpZmllZCBCSyAldSwgQkUgJXUsIFZJICV1LCBWTyAldSIKKwkJIlxuY29tcGxldGVkICV1LCIKKwkJIlxuXG5SZWNlaXZlICBUb3RhbCIKKwkJIlxuIHBhY2tldHMgJXUsIGRyb3BwZWQgJXUsIGRlbGl2ZXJlZCAldSwgcmVmdXNlZCAldSIKKwkJIlxuIiwKKwkJcFN0YXRzLT50eFhtaXRDYWxsZWQsCisJCXBTdGF0cy0+dHhYbWl0RHJvcHBlZCwKKworCQlwU3RhdHMtPnR4WG1pdERyb3BwZWRBQ1tTTUVfQUNfQktdLAorCQlwU3RhdHMtPnR4WG1pdERyb3BwZWRBQ1tTTUVfQUNfQkVdLAorCQlwU3RhdHMtPnR4WG1pdERyb3BwZWRBQ1tTTUVfQUNfVkldLAorCQlwU3RhdHMtPnR4WG1pdERyb3BwZWRBQ1tTTUVfQUNfVk9dLAorCisJCXBTdGF0cy0+dHhYbWl0Q2xhc3NpZmllZEFDW1NNRV9BQ19CS10sCisJCXBTdGF0cy0+dHhYbWl0Q2xhc3NpZmllZEFDW1NNRV9BQ19CRV0sCisJCXBTdGF0cy0+dHhYbWl0Q2xhc3NpZmllZEFDW1NNRV9BQ19WSV0sCisJCXBTdGF0cy0+dHhYbWl0Q2xhc3NpZmllZEFDW1NNRV9BQ19WT10sCisKKwkJcFN0YXRzLT50eENvbXBsZXRlZCwKKwkJdG90YWxfcnhfcGt0LCB0b3RhbF9yeF9kcm9wcGVkLCB0b3RhbF9yeF9kZWx2LCB0b3RhbF9yeF9yZWZ1c2VkCisJCSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NQVVM7IGkrKykgeworCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIGxlbiwgYnVmX2xlbiAtIGxlbiwKKwkJCSJcblJlY2VpdmUgQ1BVOiAlZCIKKwkJCSJcbiAgcGFja2V0cyAldSwgZHJvcHBlZCAldSwgZGVsaXZlcmVkICV1LCByZWZ1c2VkICV1IiwKKwkJCWksIHBTdGF0cy0+cnhQYWNrZXRzW2ldLCBwU3RhdHMtPnJ4RHJvcHBlZFtpXSwKKwkJCXBTdGF0cy0+cnhEZWxpdmVyZWRbaV0sIHBTdGF0cy0+cnhSZWZ1c2VkW2ldKTsKKwl9CisKKwlsZW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIGxlbiwgYnVmX2xlbiAtIGxlbiwKKwkJIlxuXG5UWF9GTE9XIgorCQkiXG5DdXJyZW50IHN0YXR1czogJXMiCisJCSJcbnR4LWZsb3cgdGltZXIgc3RhcnQgY291bnQgJXUiCisJCSJcbnBhdXNlIGNvdW50ICV1LCB1bnBhdXNlIGNvdW50ICV1IiwKKwkJKHBTdGF0cy0+aXNfdHhmbG93X3BhdXNlZCA9PSB0cnVlID8gIlBBVVNFRCIgOiAiVU5QQVVTRUQiKSwKKwkJcFN0YXRzLT50eGZsb3dfdGltZXJfY250LAorCQlwU3RhdHMtPnR4Zmxvd19wYXVzZV9jbnQsCisJCXBTdGF0cy0+dHhmbG93X3VucGF1c2VfY250KTsKKworCWxlbiArPSBvbF90eHJ4X3N0YXRzKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCSZidWZmZXJbbGVuXSwgKGJ1Zl9sZW4gLSBsZW4pKTsKKworCWxlbiArPSBoZGRfbmFwaV9zdGF0cyhidWZmZXIgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sCisJCQkgICBOVUxMLCBoZGRfbmFwaV9nZXRfYWxsKCkpOworCisJKmxlbmd0aCA9IGxlbiArIDE7Cit9CisKKy8qKgorICogaGRkX3dsYW5fZHVtcF9zdGF0cygpIC0gZGlzcGxheSBkdW1wIFN0YXRzCisgKiBAYWRhcHRlcjogYWRhcHRlciBoYW5kbGUKKyAqIEB2YWx1ZTogdmFsdWUgZnJvbSB1c2VyCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaGRkX3dsYW5fZHVtcF9zdGF0cyhoZGRfYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgdmFsdWUpCit7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisKKwljYXNlIFdMQU5fVFhSWF9ISVNUX1NUQVRTOgorCQl3bGFuX2hkZF9kaXNwbGF5X3R4X3J4X2hpc3RvZ3JhbShoZGRfY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0hERF9ORVRJRl9PUEVSX0hJU1RPUlk6CisJCXdsYW5faGRkX2Rpc3BsYXlfbmV0aWZfcXVldWVfaGlzdG9yeShoZGRfY3R4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb2xfdHhyeF9kaXNwbGF5X3N0YXRzKHZhbHVlKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGhkZF93bGFuX2dldF92ZXJzaW9uKCkgLSBHZXQgZHJpdmVyIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqIEBwQWRhcHRlcjogUG9pbnRlciB0byB0aGUgYWRhcHRlci4KKyAqIEB3cnF1OiBQb2ludGVyIHRvIElPQ1RMIFJFUVVFU1QgRGF0YS4KKyAqIEBleHRyYTogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IFdsYW4gRHJpdmVyLCBGaXJtd2FyZSwgJiBIYXJkd2FyZQorICogVmVyc2lvbiBpbmZvcm1hdGlvbi4gIElmIEB3cnF1IGFuZCBAZXh0cmEgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUKKyAqIHZlcnNpb24gc3RyaW5nIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlIGl0IGlzIHNpbXBseSBwcmludGVkIHRvIHRoZQorICoga2VybmVsIGxvZy4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoZGRfd2xhbl9nZXRfdmVyc2lvbihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJdFNpclZlcnNpb25TdHJpbmcgd2Nuc3NfU1dfdmVyc2lvbjsKKwljb25zdCBjaGFyICpwU1d2ZXJzaW9uOworCWNvbnN0IGNoYXIgKnBIV3ZlcnNpb247CisJdWludDMyX3QgTVNQSWQgPSAwLCBtU1BJZCA9IDAsIFNJSWQgPSAwLCBDUk1JZCA9IDA7CisKKwloZGRfY29udGV4dF90ICpwSGRkQ29udGV4dDsKKworCXBIZGRDb250ZXh0ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJaWYgKCFwSGRkQ29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOkludmFsaWQgY29udGV4dCwgSEREIGNvbnRleHQgaXMgbnVsbCIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzbnByaW50Zih3Y25zc19TV192ZXJzaW9uLCBzaXplb2YodFNpclZlcnNpb25TdHJpbmcpLCAiJTA4eCIsCisJCSBwSGRkQ29udGV4dC0+dGFyZ2V0X2Z3X3ZlcnNpb24pOworCisJcFNXdmVyc2lvbiA9IHdjbnNzX1NXX3ZlcnNpb247CisJTVNQSWQgPSAocEhkZENvbnRleHQtPnRhcmdldF9md192ZXJzaW9uICYgMHhmMDAwMDAwMCkgPj4gMjg7CisJbVNQSWQgPSAocEhkZENvbnRleHQtPnRhcmdldF9md192ZXJzaW9uICYgMHhmMDAwMDAwKSA+PiAyNDsKKwlTSUlkID0gKHBIZGRDb250ZXh0LT50YXJnZXRfZndfdmVyc2lvbiAmIDB4ZjAwMDAwKSA+PiAyMDsKKwlDUk1JZCA9IHBIZGRDb250ZXh0LT50YXJnZXRfZndfdmVyc2lvbiAmIDB4N2ZmZjsKKworCXBIV3ZlcnNpb24gPSBwSGRkQ29udGV4dC0+dGFyZ2V0X2h3X25hbWU7CisKKwlpZiAod3JxdSAmJiBleHRyYSkgeworCQl3cnF1LT5kYXRhLmxlbmd0aCA9CisJCQlzY25wcmludGYoZXh0cmEsIFdFX01BWF9TVFJfTEVOLAorCQkJCSAgIkhvc3QgU1c6JXMsIEZXOiVkLiVkLiVkLiVkLCBIVzolcyIsCisJCQkJICBRV0xBTl9WRVJTSU9OU1RSLAorCQkJCSAgTVNQSWQsIG1TUElkLCBTSUlkLCBDUk1JZCwgcEhXdmVyc2lvbik7CisJfSBlbHNlIHsKKwkJcHJfaW5mbygiSG9zdCBTVzolcywgRlc6JWQuJWQuJWQuJWQsIEhXOiVzXG4iLAorCQkJUVdMQU5fVkVSU0lPTlNUUiwKKwkJCU1TUElkLCBtU1BJZCwgU0lJZCwgQ1JNSWQsIHBIV3ZlcnNpb24pOworCX0KK2Vycm9yOgorCXJldHVybjsKK30KKworLyoqCisgKiBoZGRfd2xhbl9nZXRfcnRzX3RocmVzaG9sZCgpIC0gR2V0IFJUUyB0aHJlc2hvbGQKKyAqIEBwQWRhcHRlcjogYWRhcHRlciB1cG9uIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyByZWNlaXZlZAorICogQHdycXU6IHBvaW50ZXIgdG8gdGhlIGlvY3RsIHJlcXVlc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgY3VycmVudCBSVFMgdGhyZXNob2xkIHZhbHVlIGFuZCBzdG9yZXMKKyAqIGl0IGluIHRoZSBpb2N0bCByZXF1ZXN0IHN0cnVjdHVyZQorICoKKyAqIFJldHVybjogMCBpZiB2YWxpZCBkYXRhIHdhcyByZXR1cm5lZCwgbm9uLXplcm8gb24gZXJyb3IKKyAqLworaW50IGhkZF93bGFuX2dldF9ydHNfdGhyZXNob2xkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1bmlvbiBpd3JlcV9kYXRhICp3cnF1KQoreworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwl1aW50MzJfdCB0aHJlc2hvbGQgPSAwOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaW50IHJldCA9IDA7CisKKwlFTlRFUigpOworCisJaWYgKE5VTEwgPT0gcEFkYXB0ZXIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogQWRhcHRlciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJICAgIHNtZV9jZmdfZ2V0X2ludChoSGFsLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsICZ0aHJlc2hvbGQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkgIEZMCisJCQkJICAoImZhaWxlZCB0byBnZXQgaW5pIHBhcmFtZXRlciwgV05JX0NGR19SVFNfVEhSRVNIT0xEIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJd3JxdS0+cnRzLnZhbHVlID0gdGhyZXNob2xkOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAoIlJ0cy1UaHJlc2hvbGQ9JWQhISIpLCB3cnF1LT5ydHMudmFsdWUpOworCisJRVhJVCgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX3dsYW5fZ2V0X2ZyYWdfdGhyZXNob2xkKCkgLSBHZXQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQKKyAqIEBwQWRhcHRlcjogYWRhcHRlciB1cG9uIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyByZWNlaXZlZAorICogQHdycXU6IHBvaW50ZXIgdG8gdGhlIGlvY3RsIHJlcXVlc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgY3VycmVudCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCB2YWx1ZQorICogYW5kIHN0b3JlcyBpdCBpbiB0aGUgaW9jdGwgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm46IDAgaWYgdmFsaWQgZGF0YSB3YXMgcmV0dXJuZWQsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK2ludCBoZGRfd2xhbl9nZXRfZnJhZ190aHJlc2hvbGQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSkKK3sKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJdWludDMyX3QgdGhyZXNob2xkID0gMCwgc3RhdHVzID0gMDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCisJRU5URVIoKTsKKworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEFkYXB0ZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKHNtZV9jZmdfZ2V0X2ludChoSGFsLCBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xELCAmdGhyZXNob2xkKQorCSAgICAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSAgRkwKKwkJCQkgICgiZmFpbGVkIHRvIGdldCBpbmkgcGFyYW1ldGVyLCBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJd3JxdS0+ZnJhZy52YWx1ZSA9IHRocmVzaG9sZDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgKCJGcmFnLVRocmVzaG9sZD0lZCEhIiksIHdycXUtPmZyYWcudmFsdWUpOworCisJRVhJVCgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX3dsYW5fZ2V0X2ZyZXEoKSAtIENvbnZlcnQgY2hhbm5lbCB0byBmcmVxdWVuY3kKKyAqIEBjaGFubmVsOiBjaGFubmVsIHRvIGJlIGNvbnZlcnRlZAorICogQHBmcmVxOiB3aGVyZSB0byBzdG9yZSB0aGUgZnJlcXVlbmN5CisgKgorICogUmV0dXJuOiAxIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vCisgKi8KK2ludCBoZGRfd2xhbl9nZXRfZnJlcSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCAqcGZyZXEpCit7CisJaW50IGk7CisJaWYgKGNoYW5uZWwgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBGUkVRX0NIQU5fTUFQX1RBQkxFX1NJWkU7IGkrKykgeworCQkJaWYgKGNoYW5uZWwgPT0gZnJlcV9jaGFuX21hcFtpXS5jaGFuKSB7CisJCQkJKnBmcmVxID0gZnJlcV9jaGFuX21hcFtpXS5mcmVxOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgKCJJbnZhbGlkIGNoYW5uZWwgbm89JWQhISIpLCBjaGFubmVsKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBoZGRfaXNfYXV0aF90eXBlX3JzbigpIC0gUlNOIGF1dGhlbnRpY2F0aW9uIHR5cGUgY2hlY2sKKyAqIEBhdXRoVHlwZTogYXV0aGVudGljYXRpb24gdHlwZSB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJuOiB0cnVlIGlmIEBhdXRoVHlwZSBpcyBhbiBSU04gYXV0aGVudGljYXRpb24gdHlwZSwKKyAqCSAgIGZhbHNlIGlmIGl0IGlzIG5vdAorICovCitzdGF0aWMgYm9vbCBoZGRfaXNfYXV0aF90eXBlX3JzbihlQ3NyQXV0aFR5cGUgYXV0aFR5cGUpCit7CisJYm9vbCByc25UeXBlID0gZmFsc2U7CisJLyogaXMgdGhlIGF1dGhUeXBlIHN1cHBvcnRlZD8gKi8KKwlzd2l0Y2ggKGF1dGhUeXBlKSB7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9OT05FOiAgICAgICAvKiBuZXZlciB1c2VkICovCisJCXJzblR5cGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJLyogTUFDIGxheWVyIGF1dGhlbnRpY2F0aW9uIHR5cGVzICovCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTToKKwkJcnNuVHlwZSA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk6CisJCXJzblR5cGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9BVVRPU1dJVENIOgorCQlyc25UeXBlID0gZmFsc2U7CisJCWJyZWFrOworCisJLyogVXBwZXIgbGF5ZXIgYXV0aGVudGljYXRpb24gdHlwZXMgKi8KKwljYXNlIGVDU1JfQVVUSF9UWVBFX1dQQToKKwkJcnNuVHlwZSA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBX1BTSzoKKwkJcnNuVHlwZSA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBX05PTkU6CisJCXJzblR5cGUgPSB0cnVlOworCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfRlRfUlNOOgorI2VuZGlmCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU046CisJCXJzblR5cGUgPSB0cnVlOworCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSzoKKyNlbmRpZgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfUlNOX1BTSzoKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLX1NIQTI1NjoKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1JTTl84MDIxWF9TSEEyNTY6CisjZW5kaWYKKwkJcnNuVHlwZSA9IHRydWU7CisJCWJyZWFrOworCS8qIGNhc2UgZUNTUl9BVVRIX1RZUEVfRkFJTEVEOiAqLworCWNhc2UgZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjoKKwkJcnNuVHlwZSA9IGZhbHNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQloZGRMb2coTE9HRSwgRkwoInVua25vd24gYXV0aFR5cGUgJWQsIHRyZWF0IGFzIG9wZW4iKSwKKwkJICAgICAgIGF1dGhUeXBlKTsKKwkJcnNuVHlwZSA9IGZhbHNlOworCQlicmVhazsKKwl9CisJaGRkTG9nKExPRzEsIEZMKCJjYWxsZWQgd2l0aCBhdXRoVHlwZTogJWQsIHJldHVybmVkOiAlZCIpLAorCSAgICAgICBhdXRoVHlwZSwgcnNuVHlwZSk7CisJcmV0dXJuIHJzblR5cGU7Cit9CisKKy8qKgorICogaGRkX2dldF9yc3NpX2NiKCkgLSAiR2V0IFJTU0kiIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcnNzaTogQ3VycmVudCBSU1NJIG9mIHRoZSBzdGF0aW9uCisgKiBAc3RhSWQ6IElEIG9mIHRoZSBzdGF0aW9uCisgKiBAcENvbnRleHQ6IG9wYXF1ZSBjb250ZXh0IG9yaWdpbmFsbHkgcGFzc2VkIHRvIFNNRS4gIEhERCBhbHdheXMgcGFzc2VzCisgKglhICZzdHJ1Y3Qgc3RhdHNDb250ZXh0CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9nZXRfcnNzaV9jYihpbnQ4X3QgcnNzaSwgdWludDMyX3Qgc3RhSWQsIHZvaWQgKnBDb250ZXh0KQoreworCXN0cnVjdCBzdGF0c0NvbnRleHQgKnBTdGF0c0NvbnRleHQ7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisKKwlpZiAoaW9jdGxfZGVidWcpIHsKKwkJcHJfaW5mbygiJXM6IHJzc2kgWyVkXSBTVEEgWyVkXSBwQ29udGV4dCBbJXBdXG4iLAorCQkJX19mdW5jX18sIChpbnQpcnNzaSwgKGludClzdGFJZCwgcENvbnRleHQpOworCX0KKworCWlmIChOVUxMID09IHBDb250ZXh0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IEJhZCBwYXJhbSwgcENvbnRleHQgWyVwXSIsIF9fZnVuY19fLCBwQ29udGV4dCk7CisJCXJldHVybjsKKwl9CisKKwlwU3RhdHNDb250ZXh0ID0gcENvbnRleHQ7CisJcEFkYXB0ZXIgPSBwU3RhdHNDb250ZXh0LT5wQWRhcHRlcjsKKworCS8qIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gdGhhdCBleGlzdHMgYmV0d2VlbiB0aGlzIGNhbGxiYWNrCisJICogZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIgc2luY2UgdGhlIGNhbGxlciBjb3VsZCB0aW1lIG91dAorCSAqIGVpdGhlciBiZWZvcmUgb3Igd2hpbGUgdGhpcyBjb2RlIGlzIGV4ZWN1dGluZy4gIHdlIHVzZSBhCisJICogc3BpbmxvY2sgdG8gc2VyaWFsaXplIHRoZXNlIGFjdGlvbnMKKwkgKi8KKwlzcGluX2xvY2soJmhkZF9jb250ZXh0X2xvY2spOworCisJaWYgKChOVUxMID09IHBBZGFwdGVyKSB8fAorCSAgICAoUlNTSV9DT05URVhUX01BR0lDICE9IHBTdGF0c0NvbnRleHQtPm1hZ2ljKSkgeworCQkvKiB0aGUgY2FsbGVyIHByZXN1bWFibHkgdGltZWQgb3V0IHNvIHRoZXJlIGlzIG5vdGhpbmcKKwkJICogd2UgY2FuIGRvCisJCSAqLworCQlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJICAgICAgICIlczogSW52YWxpZCBjb250ZXh0LCBwQWRhcHRlciBbJXBdIG1hZ2ljIFslMDh4XSIsCisJCSAgICAgICBfX2Z1bmNfXywgcEFkYXB0ZXIsIHBTdGF0c0NvbnRleHQtPm1hZ2ljKTsKKwkJaWYgKGlvY3RsX2RlYnVnKSB7CisJCQlwcl9pbmZvKCIlczogSW52YWxpZCBjb250ZXh0LCBwQWRhcHRlciBbJXBdIG1hZ2ljIFslMDh4XVxuIiwKKwkJCQlfX2Z1bmNfXywgcEFkYXB0ZXIsIHBTdGF0c0NvbnRleHQtPm1hZ2ljKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogY29udGV4dCBpcyB2YWxpZCBzbyBjYWxsZXIgaXMgc3RpbGwgd2FpdGluZyAqLworCisJLyogcGFyYW5vaWE6IGludmFsaWRhdGUgdGhlIG1hZ2ljICovCisJcFN0YXRzQ29udGV4dC0+bWFnaWMgPSAwOworCisJLyogY29weSBvdmVyIHRoZSByc3NpICovCisJcEFkYXB0ZXItPnJzc2kgPSByc3NpOworCisJLyogbm90aWZ5IHRoZSBjYWxsZXIgKi8KKwljb21wbGV0ZSgmcFN0YXRzQ29udGV4dC0+Y29tcGxldGlvbik7CisKKwkvKiBzZXJpYWxpemF0aW9uIGlzIGNvbXBsZXRlICovCisJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworfQorCisvKioKKyAqIGhkZF9nZXRfc25yX2NiKCkgLSAiR2V0IFNOUiIgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBzbnI6IEN1cnJlbnQgU05SIG9mIHRoZSBzdGF0aW9uCisgKiBAc3RhSWQ6IElEIG9mIHRoZSBzdGF0aW9uCisgKiBAcENvbnRleHQ6IG9wYXF1ZSBjb250ZXh0IG9yaWdpbmFsbHkgcGFzc2VkIHRvIFNNRS4gIEhERCBhbHdheXMgcGFzc2VzCisgKglhICZzdHJ1Y3Qgc3RhdHNDb250ZXh0CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9nZXRfc25yX2NiKGludDhfdCBzbnIsIHVpbnQzMl90IHN0YUlkLCB2b2lkICpwQ29udGV4dCkKK3sKKwlzdHJ1Y3Qgc3RhdHNDb250ZXh0ICpwU3RhdHNDb250ZXh0OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCisJaWYgKGlvY3RsX2RlYnVnKSB7CisJCXByX2luZm8oIiVzOiBzbnIgWyVkXSBTVEEgWyVkXSBwQ29udGV4dCBbJXBdXG4iLAorCQkJX19mdW5jX18sIChpbnQpc25yLCAoaW50KXN0YUlkLCBwQ29udGV4dCk7CisJfQorCisJaWYgKE5VTEwgPT0gcENvbnRleHQpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgICIlczogQmFkIHBhcmFtLCBwQ29udGV4dCBbJXBdIiwgX19mdW5jX18sIHBDb250ZXh0KTsKKwkJcmV0dXJuOworCX0KKworCXBTdGF0c0NvbnRleHQgPSBwQ29udGV4dDsKKwlwQWRhcHRlciA9IHBTdGF0c0NvbnRleHQtPnBBZGFwdGVyOworCisJLyogdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiB0aGF0IGV4aXN0cyBiZXR3ZWVuIHRoaXMgY2FsbGJhY2sKKwkgKiBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlciBzaW5jZSB0aGUgY2FsbGVyIGNvdWxkIHRpbWUgb3V0CisJICogZWl0aGVyIGJlZm9yZSBvciB3aGlsZSB0aGlzIGNvZGUgaXMgZXhlY3V0aW5nLiAgd2UgdXNlIGEKKwkgKiBzcGlubG9jayB0byBzZXJpYWxpemUgdGhlc2UgYWN0aW9ucworCSAqLworCXNwaW5fbG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisKKwlpZiAoKE5VTEwgPT0gcEFkYXB0ZXIpIHx8IChTTlJfQ09OVEVYVF9NQUdJQyAhPSBwU3RhdHNDb250ZXh0LT5tYWdpYykpIHsKKwkJLyogdGhlIGNhbGxlciBwcmVzdW1hYmx5IHRpbWVkIG91dCBzbyB0aGVyZSBpcyBub3RoaW5nCisJCSAqIHdlIGNhbiBkbworCQkgKi8KKwkJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCSAgICAgICAiJXM6IEludmFsaWQgY29udGV4dCwgcEFkYXB0ZXIgWyVwXSBtYWdpYyBbJTA4eF0iLAorCQkgICAgICAgX19mdW5jX18sIHBBZGFwdGVyLCBwU3RhdHNDb250ZXh0LT5tYWdpYyk7CisJCWlmIChpb2N0bF9kZWJ1ZykgeworCQkJcHJfaW5mbygiJXM6IEludmFsaWQgY29udGV4dCwgcEFkYXB0ZXIgWyVwXSBtYWdpYyBbJTA4eF1cbiIsCisJCQkJX19mdW5jX18sIHBBZGFwdGVyLCBwU3RhdHNDb250ZXh0LT5tYWdpYyk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIGNvbnRleHQgaXMgdmFsaWQgc28gY2FsbGVyIGlzIHN0aWxsIHdhaXRpbmcgKi8KKworCS8qIHBhcmFub2lhOiBpbnZhbGlkYXRlIHRoZSBtYWdpYyAqLworCXBTdGF0c0NvbnRleHQtPm1hZ2ljID0gMDsKKworCS8qIGNvcHkgb3ZlciB0aGUgc25yICovCisJcEFkYXB0ZXItPnNuciA9IHNucjsKKworCS8qIG5vdGlmeSB0aGUgY2FsbGVyICovCisJY29tcGxldGUoJnBTdGF0c0NvbnRleHQtPmNvbXBsZXRpb24pOworCisJLyogc2VyaWFsaXphdGlvbiBpcyBjb21wbGV0ZSAqLworCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9nZXRfcnNzaSgpIC0gR2V0IHRoZSBjdXJyZW50IFJTU0kKKyAqIEBwQWRhcHRlcjogYWRhcHRlciB1cG9uIHdoaWNoIHRoZSBtZWFzdXJlbWVudCBpcyByZXF1ZXN0ZWQKKyAqIEByc3NpX3ZhbHVlOiBwb2ludGVyIHRvIHdoZXJlIHRoZSBSU1NJIHNob3VsZCBiZSByZXR1cm5lZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV8qIG9uIGVycm9yCisgKi8KK0NERl9TVEFUVVMgd2xhbl9oZGRfZ2V0X3Jzc2koaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGludDhfdCAqcnNzaV92YWx1ZSkKK3sKKwlzdHJ1Y3Qgc3RhdHNDb250ZXh0IGNvbnRleHQ7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eDsKKwlDREZfU1RBVFVTIGhzdGF0dXM7CisJdW5zaWduZWQgbG9uZyByYzsKKworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJICAgICAgICIlczogSW52YWxpZCBjb250ZXh0LCBwQWRhcHRlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisJaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLCBfX2Z1bmNfXyk7CisJCS8qIHJldHVybiBhIGNhY2hlZCB2YWx1ZSAqLworCQkqcnNzaV92YWx1ZSA9IHBBZGFwdGVyLT5yc3NpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJaGRkX2VycigiTm90IGFzc29jaWF0ZWQhLCByZXR1cm4gbGFzdCBjb25uZWN0ZWQgQVAgcnNzaSEiKTsKKwkJKnJzc2lfdmFsdWUgPSBwQWRhcHRlci0+cnNzaTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlpZiAocEhkZFN0YUN0eC0+aGRkX1JlYXNzb2NTY2VuYXJpbykgeworCQloZGRfaW5mbygiUm9hbWluZyBpbiBwcm9ncmVzcywgcmV0dXJuIGNhY2hlZCBSU1NJIik7CisJCSpyc3NpX3ZhbHVlID0gcEFkYXB0ZXItPnJzc2k7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LmNvbXBsZXRpb24pOworCWNvbnRleHQucEFkYXB0ZXIgPSBwQWRhcHRlcjsKKwljb250ZXh0Lm1hZ2ljID0gUlNTSV9DT05URVhUX01BR0lDOworCisJaHN0YXR1cyA9IHNtZV9nZXRfcnNzaShwSGRkQ3R4LT5oSGFsLCBoZGRfZ2V0X3Jzc2lfY2IsCisJCQkgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdLAorCQkJICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZCwgcEFkYXB0ZXItPnJzc2ksCisJCQkgICAgICAgJmNvbnRleHQsIHBIZGRDdHgtPnBjZHNfY29udGV4dCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBoc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogVW5hYmxlIHRvIHJldHJpZXZlIFJTU0kiLAorCQkgICAgICAgX19mdW5jX18pOworCQkvKiB3ZSdsbCByZXR1cm5lZCBhIGNhY2hlZCB2YWx1ZSBiZWxvdyAqLworCX0gZWxzZSB7CisJCS8qIHJlcXVlc3Qgd2FzIHNlbnQgLS0gd2FpdCBmb3IgdGhlIHJlc3BvbnNlICovCisJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb250ZXh0LmNvbXBsZXRpb24sCisJCQkJCQkgbXNlY3NfdG9famlmZmllcworCQkJCQkJCSAoV0xBTl9XQUlUX1RJTUVfU1RBVFMpKTsKKwkJaWYgKCFyYykgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICBGTCgiU01FIHRpbWVkIG91dCB3aGlsZSByZXRyaWV2aW5nIFJTU0kiKSk7CisJCQkvKiB3ZSdsbCBub3cgcmV0dXJuZWQgYSBjYWNoZWQgdmFsdWUgYmVsb3cgKi8KKwkJfQorCX0KKworCS8qIGVpdGhlciB3ZSBuZXZlciBzZW50IGEgcmVxdWVzdCwgd2Ugc2VudCBhIHJlcXVlc3QgYW5kCisJICogcmVjZWl2ZWQgYSByZXNwb25zZSBvciB3ZSBzZW50IGEgcmVxdWVzdCBhbmQgdGltZWQgb3V0LiAgaWYKKwkgKiB3ZSBuZXZlciBzZW50IGEgcmVxdWVzdCBvciBpZiB3ZSBzZW50IGEgcmVxdWVzdCBhbmQgZ290IGEKKwkgKiByZXNwb25zZSwgd2Ugd2FudCB0byBjbGVhciB0aGUgbWFnaWMgb3V0IG9mIHBhcmFub2lhLiAgaWYKKwkgKiB3ZSB0aW1lZCBvdXQgdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBzdWNoIHRoYXQgdGhlCisJICogY2FsbGJhY2sgZnVuY3Rpb24gY291bGQgYmUgZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUgd2UKKwkgKiBhcmUuIG9mIHByaW1hcnkgY29uY2VybiBpcyBpZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaGFkCisJICogYWxyZWFkeSB2ZXJpZmllZCB0aGUgIm1hZ2ljIiBidXQgaGFkIG5vdCB5ZXQgc2V0IHRoZQorCSAqIGNvbXBsZXRpb24gdmFyaWFibGUgd2hlbiBhIHRpbWVvdXQgb2NjdXJyZWQuIHdlIHNlcmlhbGl6ZQorCSAqIHRoZXNlIGFjdGl2aXRpZXMgYnkgaW52YWxpZGF0aW5nIHRoZSBtYWdpYyB3aGlsZSBob2xkaW5nIGEKKwkgKiBzaGFyZWQgc3BpbmxvY2sgd2hpY2ggd2lsbCBjYXVzZSB1cyB0byBibG9jayBpZiB0aGUKKwkgKiBjYWxsYmFjayBpcyBjdXJyZW50bHkgZXhlY3V0aW5nCisJICovCisJc3Bpbl9sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwljb250ZXh0Lm1hZ2ljID0gMDsKKwlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisKKwkqcnNzaV92YWx1ZSA9IHBBZGFwdGVyLT5yc3NpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bGFuX2hkZF9nZXRfc25yKCkgLSBHZXQgdGhlIGN1cnJlbnQgU05SCisgKiBAcEFkYXB0ZXI6IGFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgbWVhc3VyZW1lbnQgaXMgcmVxdWVzdGVkCisgKiBAc25yOiBwb2ludGVyIHRvIHdoZXJlIHRoZSBTTlIgc2hvdWxkIGJlIHJldHVybmVkCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQ0RGX1NUQVRVU19FXyogb24gZXJyb3IKKyAqLworQ0RGX1NUQVRVUyB3bGFuX2hkZF9nZXRfc25yKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBpbnQ4X3QgKnNucikKK3sKKwlzdHJ1Y3Qgc3RhdHNDb250ZXh0IGNvbnRleHQ7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eDsKKwlDREZfU1RBVFVTIGhzdGF0dXM7CisJdW5zaWduZWQgbG9uZyByYzsKKwlpbnQgdmFsaWQ7CisKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBJbnZhbGlkIGNvbnRleHQsIHBBZGFwdGVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCXZhbGlkID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChwSGRkQ3R4KTsKKwlpZiAoMCAhPSB2YWxpZCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworCWluaXRfY29tcGxldGlvbigmY29udGV4dC5jb21wbGV0aW9uKTsKKwljb250ZXh0LnBBZGFwdGVyID0gcEFkYXB0ZXI7CisJY29udGV4dC5tYWdpYyA9IFNOUl9DT05URVhUX01BR0lDOworCisJaHN0YXR1cyA9IHNtZV9nZXRfc25yKHBIZGRDdHgtPmhIYWwsIGhkZF9nZXRfc25yX2NiLAorCQkJICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdLAorCQkJICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLCAmY29udGV4dCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBoc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogVW5hYmxlIHRvIHJldHJpZXZlIFJTU0kiLAorCQkgICAgICAgX19mdW5jX18pOworCQkvKiB3ZSdsbCByZXR1cm5lZCBhIGNhY2hlZCB2YWx1ZSBiZWxvdyAqLworCX0gZWxzZSB7CisJCS8qIHJlcXVlc3Qgd2FzIHNlbnQgLS0gd2FpdCBmb3IgdGhlIHJlc3BvbnNlICovCisJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb250ZXh0LmNvbXBsZXRpb24sCisJCQkJCQkgbXNlY3NfdG9famlmZmllcworCQkJCQkJCSAoV0xBTl9XQUlUX1RJTUVfU1RBVFMpKTsKKwkJaWYgKCFyYykgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICBGTCgiU01FIHRpbWVkIG91dCB3aGlsZSByZXRyaWV2aW5nIFNOUiIpKTsKKwkJCS8qIHdlJ2xsIG5vdyByZXR1cm5lZCBhIGNhY2hlZCB2YWx1ZSBiZWxvdyAqLworCQl9CisJfQorCisJLyogZWl0aGVyIHdlIG5ldmVyIHNlbnQgYSByZXF1ZXN0LCB3ZSBzZW50IGEgcmVxdWVzdCBhbmQKKwkgKiByZWNlaXZlZCBhIHJlc3BvbnNlIG9yIHdlIHNlbnQgYSByZXF1ZXN0IGFuZCB0aW1lZCBvdXQuICBpZgorCSAqIHdlIG5ldmVyIHNlbnQgYSByZXF1ZXN0IG9yIGlmIHdlIHNlbnQgYSByZXF1ZXN0IGFuZCBnb3QgYQorCSAqIHJlc3BvbnNlLCB3ZSB3YW50IHRvIGNsZWFyIHRoZSBtYWdpYyBvdXQgb2YgcGFyYW5vaWEuICBpZgorCSAqIHdlIHRpbWVkIG91dCB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIHN1Y2ggdGhhdCB0aGUKKwkgKiBjYWxsYmFjayBmdW5jdGlvbiBjb3VsZCBiZSBleGVjdXRpbmcgYXQgdGhlIHNhbWUgdGltZSB3ZQorCSAqIGFyZS4gb2YgcHJpbWFyeSBjb25jZXJuIGlzIGlmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBoYWQKKwkgKiBhbHJlYWR5IHZlcmlmaWVkIHRoZSAibWFnaWMiIGJ1dCBoYWQgbm90IHlldCBzZXQgdGhlCisJICogY29tcGxldGlvbiB2YXJpYWJsZSB3aGVuIGEgdGltZW91dCBvY2N1cnJlZC4gd2Ugc2VyaWFsaXplCisJICogdGhlc2UgYWN0aXZpdGllcyBieSBpbnZhbGlkYXRpbmcgdGhlIG1hZ2ljIHdoaWxlIGhvbGRpbmcgYQorCSAqIHNoYXJlZCBzcGlubG9jayB3aGljaCB3aWxsIGNhdXNlIHVzIHRvIGJsb2NrIGlmIHRoZQorCSAqIGNhbGxiYWNrIGlzIGN1cnJlbnRseSBleGVjdXRpbmcKKwkgKi8KKwlzcGluX2xvY2soJmhkZF9jb250ZXh0X2xvY2spOworCWNvbnRleHQubWFnaWMgPSAwOworCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKworCSpzbnIgPSBwQWRhcHRlci0+c25yOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBoZGRfZ2V0X2xpbmtfc3BlZWRfY2IoKSAtIEdldCBsaW5rIHNwZWVkIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcExpbmtTcGVlZDogcG9pbnRlciB0byB0aGUgbGluayBzcGVlZCByZWNvcmQKKyAqIEBwQ29udGV4dDogcG9pbnRlciB0byB0aGUgdXNlciBjb250ZXh0IHBhc3NlZCB0byBTTUUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCBhcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8KKyAqIHNtZV9nZXRfbGlua19zcGVlZCgpIGJ5IHdsYW5faGRkX2dldF9saW5rc3BlZWRfZm9yX3BlZXJtYWMoKS4gIEJ5CisgKiBhZ3JlZW1lbnQgYSAmc3RydWN0IGxpbmtzcGVlZENvbnRleHQgaXMgcGFzc2VkIGFzIEBwQ29udGV4dC4gIElmCisgKiB0aGUgY29udGV4dCBpcyB2YWxpZCwgdGhlbiB0aGUgY29udGVudHMgb2YgQHBMaW5rU3BlZWQgYXJlIGNvcGllZAorICogaW50byB0aGUgYWRhcHRlciByZWNvcmQgcmVmZXJlbmNlZCBieSBAcENvbnRleHQgd2hlcmUgdGhleSBjYW4gYmUKKyAqIHN1YnNlcXVlbnRseSByZXRyaWV2ZWQuICBJZiB0aGUgY29udGV4dCBpcyBpbnZhbGlkLCB0aGVuIHRoaXMKKyAqIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBzaW5jZSBpdCBpcyBhc3N1bWVkIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkKKyAqIHRpbWVkLW91dCBhbmQgZGVzdHJveWVkIHRoZSBjb250ZXh0LgorICoKKyAqIFJldHVybjogTm9uZS4KKyAqLworc3RhdGljIHZvaWQKK2hkZF9nZXRfbGlua19zcGVlZF9jYih0U2lyTGlua1NwZWVkSW5mbyAqcExpbmtTcGVlZCwgdm9pZCAqcENvbnRleHQpCit7CisJc3RydWN0IGxpbmtzcGVlZENvbnRleHQgKnBMaW5rU3BlZWRDb250ZXh0OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCisJaWYgKChOVUxMID09IHBMaW5rU3BlZWQpIHx8IChOVUxMID09IHBDb250ZXh0KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBCYWQgcGFyYW0sIHBMaW5rU3BlZWQgWyVwXSBwQ29udGV4dCBbJXBdIiwKKwkJICAgICAgIF9fZnVuY19fLCBwTGlua1NwZWVkLCBwQ29udGV4dCk7CisJCXJldHVybjsKKwl9CisJc3Bpbl9sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwlwTGlua1NwZWVkQ29udGV4dCA9IHBDb250ZXh0OworCXBBZGFwdGVyID0gcExpbmtTcGVlZENvbnRleHQtPnBBZGFwdGVyOworCisJLyogdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiB0aGF0IGV4aXN0cyBiZXR3ZWVuIHRoaXMgY2FsbGJhY2sKKwkgKiBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlciBzaW5jZSB0aGUgY2FsbGVyIGNvdWxkIHRpbWUgb3V0IGVpdGhlcgorCSAqIGJlZm9yZSBvciB3aGlsZSB0aGlzIGNvZGUgaXMgZXhlY3V0aW5nLiAgd2UgdXNlIGEgc3BpbmxvY2sgdG8KKwkgKiBzZXJpYWxpemUgdGhlc2UgYWN0aW9ucworCSAqLworCisJaWYgKChOVUxMID09IHBBZGFwdGVyKSB8fAorCSAgICAoTElOS19DT05URVhUX01BR0lDICE9IHBMaW5rU3BlZWRDb250ZXh0LT5tYWdpYykpIHsKKwkJLyogdGhlIGNhbGxlciBwcmVzdW1hYmx5IHRpbWVkIG91dCBzbyB0aGVyZSBpcyBub3RoaW5nCisJCSAqIHdlIGNhbiBkbworCQkgKi8KKwkJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCSAgICAgICAiJXM6IEludmFsaWQgY29udGV4dCwgcEFkYXB0ZXIgWyVwXSBtYWdpYyBbJTA4eF0iLAorCQkgICAgICAgX19mdW5jX18sIHBBZGFwdGVyLCBwTGlua1NwZWVkQ29udGV4dC0+bWFnaWMpOworCQlpZiAoaW9jdGxfZGVidWcpIHsKKwkJCXByX2luZm8oIiVzOiBJbnZhbGlkIGNvbnRleHQsIHBBZGFwdGVyIFslcF0gbWFnaWMgWyUwOHhdXG4iLAorCQkJCV9fZnVuY19fLCBwQWRhcHRlciwgcExpbmtTcGVlZENvbnRleHQtPm1hZ2ljKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogY29udGV4dCBpcyB2YWxpZCBzbyBjYWxsZXIgaXMgc3RpbGwgd2FpdGluZyAqLworCisJLyogcGFyYW5vaWE6IGludmFsaWRhdGUgdGhlIG1hZ2ljICovCisJcExpbmtTcGVlZENvbnRleHQtPm1hZ2ljID0gMDsKKworCS8qIGNvcHkgb3ZlciB0aGUgc3RhdHMuIGRvIHNvIGFzIGEgc3RydWN0IGNvcHkgKi8KKwlwQWRhcHRlci0+bHNfc3RhdHMgPSAqcExpbmtTcGVlZDsKKworCS8qIG5vdGlmeSB0aGUgY2FsbGVyICovCisJY29tcGxldGUoJnBMaW5rU3BlZWRDb250ZXh0LT5jb21wbGV0aW9uKTsKKworCS8qIHNlcmlhbGl6YXRpb24gaXMgY29tcGxldGUgKi8KKwlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfZ2V0X2xpbmtzcGVlZF9mb3JfcGVlcm1hYygpIC0gR2V0IGxpbmsgc3BlZWQgZm9yIGEgcGVlcgorICogQHBBZGFwdGVyOiBhZGFwdGVyIHVwb24gd2hpY2ggdGhlIHBlZXIgaXMgYWN0aXZlCisgKiBAbWFjQWRkcmVzczogTUFDIGFkZHJlc3Mgb2YgdGhlIHBlZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VuZCBhIHF1ZXJ5IHRvIFNNRSBmb3IgdGhlIGxpbmtzcGVlZCBvZiB0aGUKKyAqIGdpdmVuIHBlZXIsIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBjYWxsYmFjayB0byBiZSBpbnZva2VkLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGlmIGxpbmtzcGVlZCBkYXRhIGlzIGF2YWlsYWJsZSwKKyAqIG90aGVyd2lzZSBhIENERl9TVEFUVVNfRV8qIGVycm9yLgorICovCitDREZfU1RBVFVTIHdsYW5faGRkX2dldF9saW5rc3BlZWRfZm9yX3BlZXJtYWMoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCQkJCSAgICAgIHRTaXJNYWNBZGRyIG1hY0FkZHJlc3MpIHsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHJjOworCXN0cnVjdCBsaW5rc3BlZWRDb250ZXh0IGNvbnRleHQ7CisJdFNpckxpbmtTcGVlZEluZm8gKmxpbmtzcGVlZF9yZXE7CisKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHBBZGFwdGVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCWxpbmtzcGVlZF9yZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKmxpbmtzcGVlZF9yZXEpKTsKKwlpZiAoTlVMTCA9PSBsaW5rc3BlZWRfcmVxKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXMgUmVxdWVzdCBCdWZmZXIgQWxsb2MgRmFpbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LmNvbXBsZXRpb24pOworCWNvbnRleHQucEFkYXB0ZXIgPSBwQWRhcHRlcjsKKwljb250ZXh0Lm1hZ2ljID0gTElOS19DT05URVhUX01BR0lDOworCisJY2RmX21lbV9jb3B5KGxpbmtzcGVlZF9yZXEtPnBlZXJfbWFjYWRkciwgbWFjQWRkcmVzcywKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlzdGF0dXMgPSBzbWVfZ2V0X2xpbmtfc3BlZWQoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCSAgICBsaW5rc3BlZWRfcmVxLAorCQkJCSAgICAmY29udGV4dCwgaGRkX2dldF9saW5rX3NwZWVkX2NiKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmV0cmlldmUgc3RhdGlzdGljcyBmb3IgbGluayBzcGVlZCIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShsaW5rc3BlZWRfcmVxKTsKKwl9IGVsc2UgeworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dAorCQkJKCZjb250ZXh0LmNvbXBsZXRpb24sCisJCQkgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9TVEFUUykpOworCQlpZiAoIXJjKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgICIlczogU01FIHRpbWVkIG91dCB3aGlsZSByZXRyaWV2aW5nIGxpbmsgc3BlZWQiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJfQorCX0KKworCS8qIGVpdGhlciB3ZSBuZXZlciBzZW50IGEgcmVxdWVzdCwgd2Ugc2VudCBhIHJlcXVlc3QgYW5kCisJICogcmVjZWl2ZWQgYSByZXNwb25zZSBvciB3ZSBzZW50IGEgcmVxdWVzdCBhbmQgdGltZWQgb3V0LiAgaWYKKwkgKiB3ZSBuZXZlciBzZW50IGEgcmVxdWVzdCBvciBpZiB3ZSBzZW50IGEgcmVxdWVzdCBhbmQgZ290IGEKKwkgKiByZXNwb25zZSwgd2Ugd2FudCB0byBjbGVhciB0aGUgbWFnaWMgb3V0IG9mIHBhcmFub2lhLiAgaWYKKwkgKiB3ZSB0aW1lZCBvdXQgdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBzdWNoIHRoYXQgdGhlCisJICogY2FsbGJhY2sgZnVuY3Rpb24gY291bGQgYmUgZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUgd2UKKwkgKiBhcmUuIG9mIHByaW1hcnkgY29uY2VybiBpcyBpZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaGFkCisJICogYWxyZWFkeSB2ZXJpZmllZCB0aGUgIm1hZ2ljIiBidXQgaGFkIG5vdCB5ZXQgc2V0IHRoZQorCSAqIGNvbXBsZXRpb24gdmFyaWFibGUgd2hlbiBhIHRpbWVvdXQgb2NjdXJyZWQuIHdlIHNlcmlhbGl6ZQorCSAqIHRoZXNlIGFjdGl2aXRpZXMgYnkgaW52YWxpZGF0aW5nIHRoZSBtYWdpYyB3aGlsZSBob2xkaW5nIGEKKwkgKiBzaGFyZWQgc3BpbmxvY2sgd2hpY2ggd2lsbCBjYXVzZSB1cyB0byBibG9jayBpZiB0aGUKKwkgKiBjYWxsYmFjayBpcyBjdXJyZW50bHkgZXhlY3V0aW5nCisJICovCisJc3Bpbl9sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwljb250ZXh0Lm1hZ2ljID0gMDsKKwlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bGFuX2hkZF9nZXRfbGlua19zcGVlZCgpIC0gZ2V0IGxpbmsgc3BlZWQKKyAqIEBwQWRhcHRlcjogICAgIHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIKKyAqIEBsaW5rX3NwZWVkOiAgIHBvaW50ZXIgdG8gbGluayBzcGVlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZmV0Y2hlcyBwZXIgYnNzaWQgbGluayBzcGVlZC4KKyAqCisgKiBSZXR1cm46IGlmIGFzc29jaWF0ZWQsIGxpbmsgc3BlZWQgc2hhbGwgYmUgcmV0dXJuZWQuCisgKiAgICAgICAgIGlmIG5vdCBhc3NvY2lhdGVkLCBsaW5rIHNwZWVkIG9mIDAgaXMgcmV0dXJuZWQuCisgKiAgICAgICAgIE9uIGVycm9yLCBlcnJvciBudW1iZXIgd2lsbCBiZSByZXR1cm5lZC4KKyAqLworaW50IHdsYW5faGRkX2dldF9saW5rX3NwZWVkKGhkZF9hZGFwdGVyX3QgKnN0YV9hZGFwdGVyLCB1aW50MzJfdCAqbGlua19zcGVlZCkKK3sKKwloZGRfY29udGV4dF90ICpoZGRjdHggPSBXTEFOX0hERF9HRVRfQ1RYKHN0YV9hZGFwdGVyKTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqaGRkX3N0YWN0eCA9CisJCQkJV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihzdGFfYWRhcHRlcik7CisJaW50IHJldDsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkY3R4KTsKKworCWlmICgwICE9IHJldCkgeworCQloZGRMb2coTE9HRSwgRkwoIkhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IGhkZF9zdGFjdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJLyogd2UgYXJlIG5vdCBjb25uZWN0ZWQgc28gd2UgZG9uJ3QgaGF2ZSBhIGNsYXNzQXN0YXRzICovCisJCSpsaW5rX3NwZWVkID0gMDsKKwl9IGVsc2UgeworCQlDREZfU1RBVFVTIHN0YXR1czsKKwkJdFNpck1hY0FkZHIgYnNzaWQ7CisKKwkJY2RmX21lbV9jb3B5KGJzc2lkLCBoZGRfc3RhY3R4LT5jb25uX2luZm8uYnNzSWQuYnl0ZXMsCisJCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKworCQlzdGF0dXMgPSB3bGFuX2hkZF9nZXRfbGlua3NwZWVkX2Zvcl9wZWVybWFjKHN0YV9hZGFwdGVyLCBic3NpZCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiVW5hYmxlIHRvIHJldHJpZXZlIFNNRSBsaW5rc3BlZWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkqbGlua19zcGVlZCA9IHN0YV9hZGFwdGVyLT5sc19zdGF0cy5lc3RMaW5rU3BlZWQ7CisJCS8qIGxpbmtzcGVlZCBpbiB1bml0cyBvZiA1MDAga2JwcyAqLworCQkqbGlua19zcGVlZCA9ICgqbGlua19zcGVlZCkgLyA1MDA7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGhkZF9zdGF0aXN0aWNzX2NiKCkgLSAiR2V0IHN0YXRpc3RpY3MiIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcFN0YXRzOiBzdGF0aXN0aWNzIHBheWxvYWQKKyAqIEBwQ29udGV4dDogb3BhcXVlIGNvbnRleHQgb3JpZ2luYWxseSBwYXNzZWQgdG8gU01FLiAgSEREIGFsd2F5cyBwYXNzZXMKKyAqCWEgcG9pbnRlciB0byBhbiBhZGFwdGVyCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgaGRkX3N0YXRpc3RpY3NfY2Iodm9pZCAqcFN0YXRzLCB2b2lkICpwQ29udGV4dCkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IChoZGRfYWRhcHRlcl90ICopIHBDb250ZXh0OworCWhkZF9zdGF0c190ICpwU3RhdHNDYWNoZSA9IE5VTEw7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZTsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwl0Q3NyU3VtbWFyeVN0YXRzSW5mbyAqcFN1bW1hcnlTdGF0cyA9IE5VTEw7CisJdENzckdsb2JhbENsYXNzQVN0YXRzSW5mbyAqcENsYXNzQVN0YXRzID0gTlVMTDsKKwl0Q3NyR2xvYmFsQ2xhc3NCU3RhdHNJbmZvICpwQ2xhc3NCU3RhdHMgPSBOVUxMOworCXRDc3JHbG9iYWxDbGFzc0NTdGF0c0luZm8gKnBDbGFzc0NTdGF0cyA9IE5VTEw7CisJdENzckdsb2JhbENsYXNzRFN0YXRzSW5mbyAqcENsYXNzRFN0YXRzID0gTlVMTDsKKwl0Q3NyUGVyU3RhU3RhdHNJbmZvICpwUGVyU3RhU3RhdHMgPSBOVUxMOworCisJaWYgKHBBZGFwdGVyICE9IE5VTEwpCisJCXBTdGF0c0NhY2hlID0gJnBBZGFwdGVyLT5oZGRfc3RhdHM7CisKKwlwU3VtbWFyeVN0YXRzID0gKHRDc3JTdW1tYXJ5U3RhdHNJbmZvICopIHBTdGF0czsKKwlwQ2xhc3NBU3RhdHMgPSAodENzckdsb2JhbENsYXNzQVN0YXRzSW5mbyAqKSAocFN1bW1hcnlTdGF0cyArIDEpOworCXBDbGFzc0JTdGF0cyA9ICh0Q3NyR2xvYmFsQ2xhc3NCU3RhdHNJbmZvICopIChwQ2xhc3NBU3RhdHMgKyAxKTsKKwlwQ2xhc3NDU3RhdHMgPSAodENzckdsb2JhbENsYXNzQ1N0YXRzSW5mbyAqKSAocENsYXNzQlN0YXRzICsgMSk7CisJcENsYXNzRFN0YXRzID0gKHRDc3JHbG9iYWxDbGFzc0RTdGF0c0luZm8gKikgKHBDbGFzc0NTdGF0cyArIDEpOworCXBQZXJTdGFTdGF0cyA9ICh0Q3NyUGVyU3RhU3RhdHNJbmZvICopIChwQ2xhc3NEU3RhdHMgKyAxKTsKKworCWlmIChwU3RhdHNDYWNoZSAhPSBOVUxMKSB7CisJCS8qIGNvcHkgdGhlIHN0YXRzIGludG8gdGhlIGNhY2hlIHdlIGtlZXAgaW4gdGhlCisJCSAqIGFkYXB0ZXIgaW5zdGFuY2Ugc3RydWN0dXJlCisJCSAqLworCQljZGZfbWVtX2NvcHkoJnBTdGF0c0NhY2hlLT5zdW1tYXJ5X3N0YXQsIHBTdW1tYXJ5U3RhdHMsCisJCQkgICAgIHNpemVvZihwU3RhdHNDYWNoZS0+c3VtbWFyeV9zdGF0KSk7CisJCWNkZl9tZW1fY29weSgmcFN0YXRzQ2FjaGUtPkNsYXNzQV9zdGF0LCBwQ2xhc3NBU3RhdHMsCisJCQkgICAgIHNpemVvZihwU3RhdHNDYWNoZS0+Q2xhc3NBX3N0YXQpKTsKKwkJY2RmX21lbV9jb3B5KCZwU3RhdHNDYWNoZS0+Q2xhc3NCX3N0YXQsIHBDbGFzc0JTdGF0cywKKwkJCSAgICAgc2l6ZW9mKHBTdGF0c0NhY2hlLT5DbGFzc0Jfc3RhdCkpOworCQljZGZfbWVtX2NvcHkoJnBTdGF0c0NhY2hlLT5DbGFzc0Nfc3RhdCwgcENsYXNzQ1N0YXRzLAorCQkJICAgICBzaXplb2YocFN0YXRzQ2FjaGUtPkNsYXNzQ19zdGF0KSk7CisJCWNkZl9tZW1fY29weSgmcFN0YXRzQ2FjaGUtPkNsYXNzRF9zdGF0LCBwQ2xhc3NEU3RhdHMsCisJCQkgICAgIHNpemVvZihwU3RhdHNDYWNoZS0+Q2xhc3NEX3N0YXQpKTsKKwkJY2RmX21lbV9jb3B5KCZwU3RhdHNDYWNoZS0+cGVyU3RhU3RhdHMsIHBQZXJTdGFTdGF0cywKKwkJCSAgICAgc2l6ZW9mKHBTdGF0c0NhY2hlLT5wZXJTdGFTdGF0cykpOworCX0KKworCWlmIChwQWRhcHRlcikgeworCQlwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwkJY2RmX3N0YXR1cyA9IGNkZl9ldmVudF9zZXQoJnBXZXh0U3RhdGUtPmhkZF9jZGZfZXZlbnQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJjZGZfZXZlbnRfc2V0IGZhaWxlZCIpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLyoqCisgKiBoZGRfY2xlYXJfcm9hbV9wcm9maWxlX2llKCkgLSBDbGVhciBSb2FtIFByb2ZpbGUgSUVzCisgKiBAcEFkYXB0ZXI6IGFkYXB0ZXIgd2hvJ3MgSUVzIGFyZSB0byBiZSBjbGVhcmVkCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgaGRkX2NsZWFyX3JvYW1fcHJvZmlsZV9pZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwlpbnQgaSA9IDA7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisKKwkvKiBjbGVhciBXUEEvUlNOL1dTQyBJRSBpbmZvcm1hdGlvbiBpbiB0aGUgcHJvZmlsZSAqLworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5XUEFSZXFJRUxlbmd0aCA9IDA7CisJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucFdQQVJlcUlFID0gKHVpbnQ4X3QgKikgTlVMTDsKKwlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uUlNOUmVxSUVMZW5ndGggPSAwOworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBSU05SZXFJRSA9ICh1aW50OF90ICopIE5VTEw7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5XQVBJUmVxSUVMZW5ndGggPSAwOworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBXQVBJUmVxSUUgPSAodWludDhfdCAqKSBOVUxMOworI2VuZGlmCisKKwlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5iV1BTQXNzb2NpYXRpb24gPSBmYWxzZTsKKwlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5iT1NFTkFzc29jaWF0aW9uID0gZmFsc2U7CisJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFU2NhbiA9ICh1aW50OF90ICopIE5VTEw7CisJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubkFkZElFU2Nhbkxlbmd0aCA9IDA7CisJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFQXNzb2MgPSAodWludDhfdCAqKSBOVUxMOworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5BZGRJRUFzc29jTGVuZ3RoID0gMDsKKworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdCisJCT0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm1jRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXQorCQk9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisKKwlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5BdXRoVHlwZS5udW1FbnRyaWVzID0gMTsKKwlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5BdXRoVHlwZS5hdXRoVHlwZVswXSA9CisJCWVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLk1GUEVuYWJsZWQgPSBmYWxzZTsKKwlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5NRlBSZXF1aXJlZCA9IDA7CisJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuTUZQQ2FwYWJsZSA9IDA7CisjZW5kaWYKKworCXBXZXh0U3RhdGUtPmF1dGhLZXlNZ210ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBDU1JfTUFYX05VTV9LRVk7IGkrKykgeworCQlpZiAocFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy5LZXlNYXRlcmlhbFtpXSkgeworCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy5LZXlMZW5ndGhbaV0gPSAwOworCQl9CisJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUgPSBXQVBJX0FVVEhfTU9ERV9PUEVOOworCXBBZGFwdGVyLT53YXBpX2luZm8ubldhcGlNb2RlID0gMDsKKyNlbmRpZgorCisJY2RmX3plcm9fbWFjYWRkcigmcFdleHRTdGF0ZS0+cmVxX2Jzc0lkKTsKKworfQorCisvKioKKyAqIHdsYW5faGRkX2dldF92ZW5kb3Jfb3VpX2llX3B0cigpIC0gRmluZCBhIHZlbmRvciBPVUkKKyAqIEBvdWk6IFRoZSBPVUkgdGhhdCBpcyBiZWluZyBzZWFyY2hlZCBmb3IKKyAqIEBvdWlfc2l6ZTogVGhlIGxlbmd0aCBvZiBAb3VpCisgKiBAaWU6IFRoZSBzZXQgb2YgSUVzIHdpdGhpbiB3aGljaCB3ZSdyZSB0cnlpbmcgdG8gZmluZCBAb3VpCisgKiBAaWVfbGVuOiBUaGUgbGVuZ3RoIG9mIEBpZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzY2FuIHRoZSBJRXMgY29udGFpbmVkIHdpdGhpbiBAaWUgbG9va2luZyBmb3IgQG91aS4KKyAqCisgKiBSZXR1cm46IFBvaW50ZXIgdG8gQG91aSBlbWJlZGRlZCB3aXRoaW4gQGllIGlmIGl0IGlzIHByZXNlbnQsIE5VTEwKKyAqIGlmIEBvdWkgaXMgbm90IHByZXNlbnQgd2l0aGluIEBpZS4KKyAqLwordWludDhfdCAqd2xhbl9oZGRfZ2V0X3ZlbmRvcl9vdWlfaWVfcHRyKHVpbnQ4X3QgKm91aSwgdWludDhfdCBvdWlfc2l6ZSwKKwkJCQkJdWludDhfdCAqaWUsIGludCBpZV9sZW4pCit7CisJaW50IGxlZnQgPSBpZV9sZW47CisJdWludDhfdCAqcHRyID0gaWU7CisJdWludDhfdCBlbGVtX2lkLCBlbGVtX2xlbjsKKwl1aW50OF90IGVpZCA9IDB4REQ7CisKKwlpZiAoTlVMTCA9PSBpZSB8fCAwID09IGllX2xlbikKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAobGVmdCA+PSAyKSB7CisJCWVsZW1faWQgPSBwdHJbMF07CisJCWVsZW1fbGVuID0gcHRyWzFdOworCQlsZWZ0IC09IDI7CisJCWlmIChlbGVtX2xlbiA+IGxlZnQpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCIqKioqSW52YWxpZCBJRXMgZWlkID0gJWQgZWxlbV9sZW49JWQgbGVmdD0lZCoqKioqIiksCisJCQkgICAgICAgZWlkLCBlbGVtX2xlbiwgbGVmdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoZWxlbV9pZCA9PSBlaWQpIHsKKwkJCWlmIChtZW1jbXAoJnB0clsyXSwgb3VpLCBvdWlfc2l6ZSkgPT0gMCkKKwkJCQlyZXR1cm4gcHRyOworCQl9CisKKwkJbGVmdCAtPSBlbGVtX2xlbjsKKwkJcHRyICs9IChlbGVtX2xlbiArIDIpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBfX2l3X3NldF9jb21taXQoKSAtIFNJT0NTSVdDT01NSVQgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfc2V0X2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJaGRkTG9nKExPRzEsICJJbiAlcyIsIF9fZnVuY19fKTsKKwkvKiBEbyBub3RoaW5nIGZvciBub3cgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpd19zZXRfY29tbWl0KCkgLSBTU1Igd3JhcHBlciBmdW5jdGlvbiBmb3IgX19pd19zZXRfY29tbWl0CisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQHdycXU6IHBvaW50ZXIgdG8gaXdyZXFfZGF0YQorICogQGV4dHJhOiBleHRyYQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK2ludCBpd19zZXRfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfY29tbWl0KGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19nZXRfbmFtZSgpIC0gU0lPQ0dJV05BTUUgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWFkYXB0ZXIgID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgoYWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlzdHJsY3B5KHdycXUsICJRY29tOjgwMi4xMW4iLCBJRk5BTVNJWik7CisJRVhJVCgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIF9faXdfZ2V0X25hbWUoKSAtIFNTUiB3cmFwcGVyIGZvciBfX2l3X2dldF9uYW1lCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQHdycXU6IHBvaW50ZXIgdG8gaXdyZXFfZGF0YQorICogQGV4dHJhOiBleHRyYQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIGNoYXIgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X25hbWUoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X3NldF9tb2RlKCkgLSBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZTsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJdENzclJvYW1Qcm9maWxlICpwUm9hbVByb2ZpbGU7CisJZUNzclJvYW1Cc3NUeXBlIExhc3RCU1NUeXBlOworCWVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZSBjb25uZWN0ZWRCc3NUeXBlOworCXN0cnVjdCBoZGRfY29uZmlnICpwQ29uZmlnOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwl3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOworCXBSb2FtUHJvZmlsZSA9ICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZTsKKwlMYXN0QlNTVHlwZSA9IHBSb2FtUHJvZmlsZS0+QlNTVHlwZTsKKworCWhkZExvZyhMT0cxLCAiJXMgT2xkIEJzcyB0eXBlID0gJWQiLCBfX2Z1bmNfXywgTGFzdEJTU1R5cGUpOworCisJc3dpdGNoICh3cnF1LT5tb2RlKSB7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCQloZGRMb2coTE9HMSwgIiVzIFNldHRpbmcgQVAgTW9kZSBhcyBJV19NT0RFX0FESE9DIiwgX19mdW5jX18pOworCQlwUm9hbVByb2ZpbGUtPkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1M7CisJCS8qIFNldCB0aGUgcGh5bW9kZSBjb3JyZWN0bHkgZm9yIElCU1MuICovCisJCXBDb25maWcgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWc7CisJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBoeU1vZGUgPQorCQkJaGRkX2NmZ194bGF0ZV90b19jc3JfcGh5X21vZGUocENvbmZpZy0+ZG90MTFNb2RlKTsKKwkJcEFkYXB0ZXItPmRldmljZV9tb2RlID0gV0xBTl9IRERfSUJTUzsKKwkJd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfQURIT0M7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJaGRkTG9nKExPRzEsICIlcyBTZXR0aW5nIEFQIE1vZGUgYXMgSVdfTU9ERV9JTkZSQSIsIF9fZnVuY19fKTsKKwkJcFJvYW1Qcm9maWxlLT5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRTsKKwkJd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX0FVVE86CisJCWhkZExvZyhMT0cxLCAiJXMgU2V0dGluZyBBUCBNb2RlIGFzIElXX01PREVfQVVUTyIsIF9fZnVuY19fKTsKKwkJcFJvYW1Qcm9maWxlLT5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9BTlk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWhkZExvZyhMT0dFLCAiJXMgVW5rbm93biBBUCBNb2RlIHZhbHVlICVkICIsIF9fZnVuY19fLAorCQkgICAgICAgd3JxdS0+bW9kZSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlpZiAoTGFzdEJTU1R5cGUgIT0gcFJvYW1Qcm9maWxlLT5CU1NUeXBlKSB7CisJCS8qIHRoZSBCU1MgbW9kZSBjaGFuZ2VkLiAgV2UgbmVlZCB0byBpc3N1ZSBkaXNjb25uZWN0CisJCSAqIGlmIGNvbm5lY3RlZCBvciBpbiBJQlNTIGRpc2Nvbm5lY3Qgc3RhdGUKKwkJICovCisJCWlmIChoZGRfY29ubl9nZXRfY29ubmVjdGVkX2Jzc190eXBlCisJCQkgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpLCAmY29ubmVjdGVkQnNzVHlwZSkKKwkJICAgIHx8IChlQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1MgPT0gTGFzdEJTU1R5cGUpKSB7CisJCQlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJCQkvKiBuZWVkIHRvIGlzc3VlIGEgZGlzY29ubmVjdCB0byBDU1IuICovCisJCQlJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPmRpc2Nvbm5lY3RfY29tcF92YXIpOworCQkJY2RmX3N0YXR1cyA9CisJCQkJc21lX3JvYW1fZGlzY29ubmVjdChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCQkgICAgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCSAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0lCU1NfTEVBVkUpOworCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfc3RhdHVzKSB7CisJCQkJdW5zaWduZWQgbG9uZyByYzsKKwkJCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcEFkYXB0ZXItPgorCQkJCQkJCQkgZGlzY29ubmVjdF9jb21wX3ZhciwKKwkJCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMKKwkJCQkJCQkJCSAoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworCQkJCWlmICghcmMpCisJCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgICAgICBGTAorCQkJCQkJICAgICAgICgiZmFpbGVkIHdhaXQgb24gZGlzY29ubmVjdF9jb21wX3ZhciIpKTsKKwkJCX0KKwkJfQorCX0KKworCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpd19zZXRfbW9kZSgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfc2V0X21vZGUoKQorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8KKyAqIEB3cnF1OiBwb2ludGVyIHRvIGl3cmVxX2RhdGEKKyAqIEBleHRyYTogcG9pbnRlciB0byBleHRyYSBpb2N0bCBwYXlsb2FkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpd19zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfbW9kZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfZ2V0X21vZGUoKSAtIFNJT0NHSVdNT0RFIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludAorX19pd19nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisKKwlzd2l0Y2ggKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkJTU1R5cGUpIHsKKwljYXNlIGVDU1JfQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkU6CisJCWhkZExvZyhMT0cxLCBGTCgicmV0dXJucyBJV19NT0RFX0lORlJBIikpOworCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0JTU19UWVBFX0lCU1M6CisJY2FzZSBlQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1M6CisJCWhkZExvZyhMT0cxLCBGTCgicmV0dXJucyBJV19NT0RFX0FESE9DIikpOworCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0JTU19UWVBFX0FOWToKKwlkZWZhdWx0OgorCQloZGRMb2coTE9HMSwgRkwoInJldHVybnMgSVdfTU9ERV9BVVRPIikpOworCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9BVVRPOworCQlicmVhazsKKwl9CisKKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXdfZ2V0X21vZGUoKSAtIFNTUiB3cmFwcGVyIGZvciBfX2l3X2dldF9tb2RlKCkKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGluZm86IHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gZXh0cmEgaW9jdGwgcGF5bG9hZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X21vZGUoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X3NldF9mcmVxKCkgLSBTSU9DU0lXRlJFUSBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXVpbnQzMl90IG51bUNoYW5zID0gMDsKKwl1aW50OF90IHZhbGlkQ2hhbltXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworCXVpbnQzMl90IGluZHggPSAwOworCWludCByZXQ7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZTsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJdENzclJvYW1Qcm9maWxlICpwUm9hbVByb2ZpbGU7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisKKwlwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisKKwloZGRMb2coTE9HMSwgInNldENIQU5ORUwgaW9jdGwiKTsKKworCS8qIExpbmsgaXMgdXAgdGhlbiByZXR1cm4gY2FudCBzZXQgY2hhbm5lbCAqLworCWlmIChlQ29ubmVjdGlvblN0YXRlX0lic3NDb25uZWN0ZWQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSB8fAorCSAgICBlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgeworCQloZGRMb2coTE9HRSwgIklCU1MgQXNzb2NpYXRlZCIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJLyogU2V0dGluZ3MgYnkgRnJlcXVlbmN5IGFzIGlucHV0ICovCisJaWYgKCh3cnF1LT5mcmVxLmUgPT0gMSkgJiYgKHdycXUtPmZyZXEubSA+PSAodWludDMyX3QpIDIuNDEyZTgpICYmCisJICAgICh3cnF1LT5mcmVxLm0gPD0gKHVpbnQzMl90KSA1LjgyNWU4KSkgeworCQl1aW50MzJfdCBmcmVxID0gd3JxdS0+ZnJlcS5tIC8gMTAwMDAwOworCisJCXdoaWxlICgoaW5keCA8IEZSRVFfQ0hBTl9NQVBfVEFCTEVfU0laRSkKKwkJICAgICAgICYmIChmcmVxICE9IGZyZXFfY2hhbl9tYXBbaW5keF0uZnJlcSkpCisJCQlpbmR4Kys7CisJCWlmIChpbmR4ID49IEZSRVFfQ0hBTl9NQVBfVEFCTEVfU0laRSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJd3JxdS0+ZnJlcS5lID0gMDsKKwkJd3JxdS0+ZnJlcS5tID0gZnJlcV9jaGFuX21hcFtpbmR4XS5jaGFuOworCisJfQorCisJaWYgKHdycXUtPmZyZXEuZSA9PSAwKSB7CisJCWlmICgod3JxdS0+ZnJlcS5tIDwgV05JX0NGR19DVVJSRU5UX0NIQU5ORUxfU1RBTUlOKSB8fAorCQkgICAgKHdycXUtPmZyZXEubSA+IFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1BWCkpIHsKKwkJCWhkZExvZyhMT0cxLAorCQkJICAgICAgICIlczogQ2hhbm5lbCBbJWRdIGlzIG91dHNpZGUgdmFsaWQgcmFuZ2UgZnJvbSAlZCB0byAlZCIsCisJCQkgICAgICAgX19mdW5jX18sIHdycXUtPmZyZXEubSwKKwkJCSAgICAgICBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9TVEFNSU4sCisJCQkgICAgICAgV05JX0NGR19DVVJSRU5UX0NIQU5ORUxfU1RBTUFYKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbnVtQ2hhbnMgPSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU47CisKKwkJaWYgKHNtZV9jZmdfZ2V0X3N0cihoSGFsLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCwKKwkJCQkgICAgdmFsaWRDaGFuLCAmbnVtQ2hhbnMpICE9CisJCQkJQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9XQVJOLCBGTAorCQkJCSAgKCJmYWlsZWQgdG8gZ2V0IGluaSBwYXJhbWV0ZXIsIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUIikpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlmb3IgKGluZHggPSAwOyBpbmR4IDwgbnVtQ2hhbnM7IGluZHgrKykgeworCQkJaWYgKHdycXUtPmZyZXEubSA9PSB2YWxpZENoYW5baW5keF0pIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGluZHggPj0gbnVtQ2hhbnMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0IHRoZSBPcGVyYXRpb25hbCBDaGFubmVsICovCisJbnVtQ2hhbnMgPSBwUm9hbVByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAxOworCXBIZGRTdGFDdHgtPmNvbm5faW5mby5vcGVyYXRpb25DaGFubmVsID0gd3JxdS0+ZnJlcS5tOworCXBSb2FtUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPQorCQkmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWw7CisKKwloZGRMb2coTE9HMSwgInBSb2FtUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbCAgPSAlZCIsIHdycXUtPmZyZXEubSk7CisKKwlFWElUKCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGl3X3NldF9mcmVxKCkgLSBTU1Igd3JhcHBlciBmb3IgX19pd19zZXRfZnJlcSgpCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQHdycXU6IHBvaW50ZXIgdG8gaXdyZXFfZGF0YQorICogQGV4dHJhOiBwb2ludGVyIHRvIGV4dHJhIGlvY3RsIHBheWxvYWQKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGl3X3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF9mcmVxKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19nZXRfZnJlcSgpIC0gU0lPQ0dJV0ZSRVEgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwgY2hhciAqZXh0cmEpCit7CisJdWludDMyX3Qgc3RhdHVzID0gZmFsc2UsIGNoYW5uZWwgPSAwLCBmcmVxID0gMDsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXRIYWxIYW5kbGUgaEhhbDsKKwloZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlOworCXRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCWhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisKKwlwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisKKwlpZiAocEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSA9PSBlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQpIHsKKwkJaWYgKHNtZV9nZXRfb3BlcmF0aW9uX2NoYW5uZWwoaEhhbCwgJmNoYW5uZWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQpCisJCSAgICAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgRkwoImZhaWxlZCB0byBnZXQgb3BlcmF0aW5nIGNoYW5uZWwgJXUiKSwKKwkJCQkgIHBBZGFwdGVyLT5zZXNzaW9uSWQpOworCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBoZGRfd2xhbl9nZXRfZnJlcShjaGFubmVsLCAmZnJlcSk7CisJCQlpZiAodHJ1ZSA9PSBzdGF0dXMpIHsKKwkJCQkvKiBTZXQgRXhwb25lbnQgcGFyYW1ldGVyIGFzIDYgKE1IWikKKwkJCQkgKiBpbiBzdHJ1Y3QgaXdfZnJlcSBpd2xpc3QgJiBpd2NvbmZpZworCQkJCSAqIGNvbW1hbmQgc2hvd3MgZnJlcXVlbmN5IGludG8gcHJvcGVyCisJCQkJICogZm9ybWF0ICgyLjQxMiBHSHogaW5zdGVhZCBvZiAyNDYuMgorCQkJCSAqIE1IeikKKwkJCQkgKi8KKwkJCQlmd3JxLT5tID0gZnJlcTsKKwkJCQlmd3JxLT5lID0gTUhaOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogU2V0IEV4cG9uZW50IHBhcmFtZXRlciBhcyA2IChNSFopIGluIHN0cnVjdCBpd19mcmVxCisJCSAqIGl3bGlzdCAmIGl3Y29uZmlnIGNvbW1hbmQgc2hvd3MgZnJlcXVlbmN5IGludG8gcHJvcGVyCisJCSAqIGZvcm1hdCAoMi40MTIgR0h6IGluc3RlYWQgb2YgMjQ2LjIgTUh6KQorCQkgKi8KKwkJZndycS0+bSA9IDA7CisJCWZ3cnEtPmUgPSBNSFo7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X2dldF9mcmVxKCkgLSBTU1Igd3JhcHBlciBmb3IgX19pd19nZXRfZnJlcSgpCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQGZ3cnE6IHBvaW50ZXIgdG8gZnJlcXVlbmN5IGRhdGEKKyAqIEBleHRyYTogcG9pbnRlciB0byBleHRyYSBpb2N0bCBwYXlsb2FkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpd19nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X2ZyZXEgKmZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X2ZyZXEoZGV2LCBpbmZvLCBmd3JxLCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X2dldF90eF9wb3dlcigpIC0gU0lPQ0dJV1RYUE9XIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X2dldF90eF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJaW50IHJldDsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCAhPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSB7CisJCXdycXUtPnR4cG93ZXIudmFsdWUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJd2xhbl9oZGRfZ2V0X2NsYXNzX2FzdGF0cyhwQWRhcHRlcik7CisJd3JxdS0+dHhwb3dlci52YWx1ZSA9IHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQubWF4X3B3cjsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X2dldF90eF9wb3dlcigpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfZ2V0X3R4X3Bvd2VyKCkKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGluZm86IHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gZXh0cmEgaW9jdGwgcGF5bG9hZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfZ2V0X3R4X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19nZXRfdHhfcG93ZXIoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X3NldF90eF9wb3dlcigpIC0gU0lPQ1NJV1RYUE9XIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X3NldF90eF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHNtZV9jZmdfc2V0X2ludChoSGFsLCBXTklfQ0ZHX0NVUlJFTlRfVFhfUE9XRVJfTEVWRUwsCisJCQkJd3JxdS0+dHhwb3dlci52YWx1ZSkgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTAorCQkJCSgiZmFpbGVkIHRvIHNldCBpbmkgcGFyYW1ldGVyLCBXTklfQ0ZHX0NVUlJFTlRfVFhfUE9XRVJfTEVWRUwiKSk7CisJCXJldHVybiAtRUlPOworCX0KKworCUVYSVQoKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X3NldF90eF9wb3dlcigpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfc2V0X3R4X3Bvd2VyKCkKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGluZm86IHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gZXh0cmEgaW9jdGwgcGF5bG9hZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfc2V0X3R4X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfdHhfcG93ZXIoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X2dldF9iaXRyYXRlKCkgLSBTSU9DR0lXUkFURSBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19nZXRfYml0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aXNMb2dwSW5Qcm9ncmVzcykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IDA7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0KKwkJCXNtZV9nZXRfc3RhdGlzdGljcyhXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCSAgIGVDU1JfSERELAorCQkJCQkgICBTTUVfU1VNTUFSWV9TVEFUUyB8CisJCQkJCSAgIFNNRV9HTE9CQUxfQ0xBU1NBX1NUQVRTIHwKKwkJCQkJICAgU01FX0dMT0JBTF9DTEFTU0JfU1RBVFMgfAorCQkJCQkgICBTTUVfR0xPQkFMX0NMQVNTQ19TVEFUUyB8CisJCQkJCSAgIFNNRV9HTE9CQUxfQ0xBU1NEX1NUQVRTIHwKKwkJCQkJICAgU01FX1BFUl9TVEFfU1RBVFMsCisJCQkJCSAgIGhkZF9zdGF0aXN0aWNzX2NiLCAwLAorCQkJCQkgICBmYWxzZSwKKwkJCQkJICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdLAorCQkJCQkgICBwQWRhcHRlciwgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmV0cmlldmUgc3RhdGlzdGljcyIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKworCQljZGZfc3RhdHVzID0KKwkJCWNkZl93YWl0X3NpbmdsZV9ldmVudCgmcFdleHRTdGF0ZS0+aGRkX2NkZl9ldmVudCwKKwkJCQkJICAgICAgV0xBTl9XQUlUX1RJTUVfU1RBVFMpOworCisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgICIlczogU01FIHRpbWVvdXQgd2hpbGUgcmV0cmlldmluZyBzdGF0aXN0aWNzIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKworCQl3cnF1LT5iaXRyYXRlLnZhbHVlID0KKwkJCXBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQudHhfcmF0ZSAqIDUwMCAqIDEwMDA7CisJfQorCisJRVhJVCgpOworCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogaXdfZ2V0X2JpdHJhdGUoKSAtIFNTUiB3cmFwcGVyIGZvciBfX2l3X2dldF9iaXRyYXRlKCkKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGluZm86IHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gZXh0cmEgaW9jdGwgcGF5bG9hZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfZ2V0X2JpdHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19nZXRfYml0cmF0ZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfc2V0X2JpdHJhdGUoKSAtIFNJT0NTSVdSQVRFIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X3NldF9iaXRyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwl1aW50OF90IHN1cHBfcmF0ZXNbV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBX0xFTl07CisJdWludDMyX3QgYV9sZW4gPSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUFfTEVOOworCXVpbnQzMl90IGJfbGVuID0gV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFCX0xFTjsKKwl1aW50MzJfdCBpLCByYXRlOworCXVpbnQzMl90IHZhbGlkX3JhdGUgPSBmYWxzZSwgYWN0aXZlX3BoeV9tb2RlID0gMDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisKKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZTsKKworCWlmIChyYXRlID09IC0xKSB7CisJCXJhdGUgPSBXTklfQ0ZHX0ZJWEVEX1JBVEVfQVVUTzsKKwkJdmFsaWRfcmF0ZSA9IHRydWU7CisJfSBlbHNlIGlmIChzbWVfY2ZnX2dldF9pbnQoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCSAgIFdOSV9DRkdfRE9UMTFfTU9ERSwKKwkJCQkgICAmYWN0aXZlX3BoeV9tb2RlKSA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKGFjdGl2ZV9waHlfbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFBCisJCSAgICB8fCBhY3RpdmVfcGh5X21vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExRworCQkgICAgfHwgYWN0aXZlX3BoeV9tb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUIpIHsKKwkJCWlmICgoc21lX2NmZ19nZXRfc3RyKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkgICAgIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQSwgc3VwcF9yYXRlcywKKwkJCQkgICAgICZhX2xlbikgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJICAgICYmCisJCQkgICAgKHNtZV9jZmdfZ2V0X3N0cihXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJICAgICBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUIsIHN1cHBfcmF0ZXMsCisJCQkJICAgICAmYl9sZW4pID09IENERl9TVEFUVVNfU1VDQ0VTUykpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgKGJfbGVuICsgYV9sZW4pOyArK2kpIHsKKwkJCQkJLyogc3VwcG9ydGVkIHJhdGVzIHJldHVybmVkIGlzIGRvdWJsZQorCQkJCQkgKiB0aGUgYWN0dWFsIHJhdGUgc28gd2UgZGl2aWRlIGl0IGJ5IDIKKwkJCQkJICovCisJCQkJCWlmICgoc3VwcF9yYXRlc1tpXSAmIDB4N0YpIC8gMiA9PQorCQkJCQkJCXJhdGUpIHsKKwkJCQkJCXZhbGlkX3JhdGUgPSB0cnVlOworCQkJCQkJcmF0ZSA9IGkgKworCQkJCQkJV05JX0NGR19GSVhFRF9SQVRFXzFNQlBTOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKHZhbGlkX3JhdGUgIT0gdHJ1ZSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHNtZV9jZmdfc2V0X2ludChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkgICAgV05JX0NGR19GSVhFRF9SQVRFLCByYXRlKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMCisJCQkJKCJmYWlsZWQgdG8gc2V0IGluaSBwYXJhbWV0ZXIsIFdOSV9DRkdfRklYRURfUkFURSIpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X3NldF9iaXRyYXRlKCkgLSBTU1Igd3JhcHBlciBmb3IgX19pd19zZXRfYml0cmF0ZSgpCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQHdycXU6IHBvaW50ZXIgdG8gaXdyZXFfZGF0YQorICogQGV4dHJhOiBwb2ludGVyIHRvIGV4dHJhIGlvY3RsIHBheWxvYWQKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGl3X3NldF9iaXRyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0X2JpdHJhdGUoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X3NldF9nZW5pZSgpIC0gU0lPQ1NJV0dFTklFIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X3NldF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCXVpbnQ4X3QgKmdlbmllID0gTlVMTDsKKwl1aW50OF90ICpiYXNlX2dlbmllID0gTlVMTDsKKwl1aW50MTZfdCByZW1MZW47CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghd3JxdS0+ZGF0YS5sZW5ndGgpIHsKKwkJaGRkX2NsZWFyX3JvYW1fcHJvZmlsZV9pZShwQWRhcHRlcik7CisJCUVYSVQoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYmFzZV9nZW5pZSA9IG1lbV9hbGxvY19jb3B5X2Zyb21fdXNlcl9oZWxwZXIod3JxdS0+ZGF0YS5wb2ludGVyLAorCQkJCQkJICAgICB3cnF1LT5kYXRhLmxlbmd0aCk7CisJaWYgKE5VTEwgPT0gYmFzZV9nZW5pZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIm1lbV9hbGxvY19jb3B5X2Zyb21fdXNlcl9oZWxwZXIgZmFpbCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlnZW5pZSA9IGJhc2VfZ2VuaWU7CisKKwlyZW1MZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKKworCWhkZExvZyhMT0cxLCAiaXdfc2V0X2dlbmllIGlvY3RsIElFWzB4JVhdLCBMRU5bJWRdIiwgZ2VuaWVbMF0sCisJICAgICAgIGdlbmllWzFdKTsKKworCS8qIGNsZWFyIGFueSBwcmV2aW91cyBnZW5JRSBiZWZvcmUgdGhpcyBjYWxsICovCisJbWVtc2V0KCZwV2V4dFN0YXRlLT5nZW5JRSwgMCwgc2l6ZW9mKHBXZXh0U3RhdGUtPmdlbklFKSk7CisKKwl3aGlsZSAocmVtTGVuID49IDIpIHsKKwkJdWludDE2X3QgZUxlbiA9IDA7CisJCXVpbnQ4X3QgZWxlbWVudElkOworCQllbGVtZW50SWQgPSAqZ2VuaWUrKzsKKwkJZUxlbiA9ICpnZW5pZSsrOworCQlyZW1MZW4gLT0gMjsKKworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogSUVbMHglWF0sIExFTlslZF0iLAorCQkgICAgICAgX19mdW5jX18sIGVsZW1lbnRJZCwgZUxlbik7CisKKwkJc3dpdGNoIChlbGVtZW50SWQpIHsKKwkJY2FzZSBJRV9FSURfVkVORE9SOgorCQkJaWYgKChJRV9MRU5fU0laRSArIElFX0VJRF9TSVpFICsgSUVfVkVORE9SX09VSV9TSVpFKSA+IGVMZW4pIHsgIC8qIHNob3VsZCBoYXZlIGF0IGxlYXN0IE9VSSAqLworCQkJCWtmcmVlKGJhc2VfZ2VuaWUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlpZiAoMCA9PSBtZW1jbXAoJmdlbmllWzBdLCAiXHgwMFx4NTBceGYyXHgwNCIsIDQpKSB7CisJCQkJdWludDE2X3QgY3VyR2VuSUVMZW4gPSBwV2V4dFN0YXRlLT5nZW5JRS5sZW5ndGg7CisJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgICAgICAiJXMgU2V0IFdQUyBPVUkoJTAyeCAlMDJ4ICUwMnggJTAyeCkgSUUobGVuICVkKSIsCisJCQkJICAgICAgIF9fZnVuY19fLCBnZW5pZVswXSwgZ2VuaWVbMV0sIGdlbmllWzJdLAorCQkJCSAgICAgICBnZW5pZVszXSwgZUxlbiArIDIpOworCisJCQkJaWYgKFNJUl9NQUNfTUFYX0lFX0xFTkdUSCA8CisJCQkJICAgIChwV2V4dFN0YXRlLT5nZW5JRS5sZW5ndGggKyBlTGVuKSkgeworCQkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCQkgICAgICAgIkNhbm5vdCBhY2NvbW1vZGF0ZSBnZW5JRS4gIgorCQkJCQkgICAgICAgIk5lZWQgYmlnZ2VyIGJ1ZmZlciBzcGFjZSIpOworCQkJCQlDREZfQVNTRVJUKDApOworCQkJCQlrZnJlZShiYXNlX2dlbmllKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJCS8qIHNhdmUgdG8gQWRkaXRpb25hbCBJRSA7IGl0IHNob3VsZCBiZSBhY2N1bXVsYXRlZCB0byBoYW5kbGUgV1BTIElFICsgb3RoZXIgSUUgKi8KKwkJCQltZW1jcHkocFdleHRTdGF0ZS0+Z2VuSUUuYWRkSUVkYXRhICsKKwkJCQkgICAgICAgY3VyR2VuSUVMZW4sIGdlbmllIC0gMiwgZUxlbiArIDIpOworCQkJCXBXZXh0U3RhdGUtPmdlbklFLmxlbmd0aCArPSBlTGVuICsgMjsKKwkJCX0gZWxzZSBpZiAoMCA9PSBtZW1jbXAoJmdlbmllWzBdLCAiXHgwMFx4NTBceGYyIiwgMykpIHsKKwkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAgICAgICIlcyBTZXQgV1BBIElFIChsZW4gJWQpIiwgX19mdW5jX18sCisJCQkJICAgICAgIGVMZW4gKyAyKTsKKwkJCQltZW1zZXQocFdleHRTdGF0ZS0+V1BBUlNOSUUsIDAsCisJCQkJICAgICAgIE1BWF9XUEFfUlNOX0lFX0xFTik7CisJCQkJbWVtY3B5KHBXZXh0U3RhdGUtPldQQVJTTklFLCBnZW5pZSAtIDIsCisJCQkJICAgICAgIChlTGVuICsgMikpOworCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBXUEFSZXFJRSA9CisJCQkJCXBXZXh0U3RhdGUtPldQQVJTTklFOworCQkJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5XUEFSZXFJRUxlbmd0aCA9CisJCQkJCWVMZW4gKyAyOworCQkJfSBlbHNlIHsgICAgICAgIC8qIGFueSB2ZW5kb3JJZCBleGNlcHQgV1BBIElFIHNob3VsZCBiZSBhY2N1bXVsYXRlZCB0byBnZW5JRSAqLworCisJCQkJdWludDE2X3QgY3VyR2VuSUVMZW4gPSBwV2V4dFN0YXRlLT5nZW5JRS5sZW5ndGg7CisJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgICAgICAiJXMgU2V0IE9VSSglMDJ4ICUwMnggJTAyeCAlMDJ4KSBJRShsZW4gJWQpIiwKKwkJCQkgICAgICAgX19mdW5jX18sIGdlbmllWzBdLCBnZW5pZVsxXSwgZ2VuaWVbMl0sCisJCQkJICAgICAgIGdlbmllWzNdLCBlTGVuICsgMik7CisKKwkJCQlpZiAoU0lSX01BQ19NQVhfSUVfTEVOR1RIIDwKKwkJCQkgICAgKHBXZXh0U3RhdGUtPmdlbklFLmxlbmd0aCArIGVMZW4pKSB7CisJCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkJCSAgICAgICAiQ2Fubm90IGFjY29tbW9kYXRlIGdlbklFLiAiCisJCQkJCSAgICAgICAiTmVlZCBiaWdnZXIgYnVmZmVyIHNwYWNlIik7CisJCQkJCUNERl9BU1NFUlQoMCk7CisJCQkJCWtmcmVlKGJhc2VfZ2VuaWUpOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQkJLyogc2F2ZSB0byBBZGRpdGlvbmFsIElFIDsgaXQgc2hvdWxkIGJlIGFjY3VtdWxhdGVkIHRvIGhhbmRsZSBXUFMgSUUgKyBvdGhlciBJRSAqLworCQkJCW1lbWNweShwV2V4dFN0YXRlLT5nZW5JRS5hZGRJRWRhdGEgKworCQkJCSAgICAgICBjdXJHZW5JRUxlbiwgZ2VuaWUgLSAyLCBlTGVuICsgMik7CisJCQkJcFdleHRTdGF0ZS0+Z2VuSUUubGVuZ3RoICs9IGVMZW4gKyAyOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRE9UMTFGX0VJRF9SU046CisJCQloZGRMb2coTE9HMSwgIiVzIFNldCBSU04gSUUgKGxlbiAlZCkiLCBfX2Z1bmNfXywKKwkJCSAgICAgICBlTGVuICsgMik7CisJCQltZW1zZXQocFdleHRTdGF0ZS0+V1BBUlNOSUUsIDAsIE1BWF9XUEFfUlNOX0lFX0xFTik7CisJCQltZW1jcHkocFdleHRTdGF0ZS0+V1BBUlNOSUUsIGdlbmllIC0gMiwgKGVMZW4gKyAyKSk7CisJCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5wUlNOUmVxSUUgPQorCQkJCXBXZXh0U3RhdGUtPldQQVJTTklFOworCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUublJTTlJlcUlFTGVuZ3RoID0gZUxlbiArIDI7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaGRkTG9nKExPR0UsICIlcyBTZXQgVU5LTk9XTiBJRSAlWCIsIF9fZnVuY19fLAorCQkJICAgICAgIGVsZW1lbnRJZCk7CisJCQlrZnJlZShiYXNlX2dlbmllKTsKKwkJCXJldHVybiAwOworCQl9CisJCWdlbmllICs9IGVMZW47CisJCXJlbUxlbiAtPSBlTGVuOworCX0KKwlFWElUKCk7CisJa2ZyZWUoYmFzZV9nZW5pZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXdfc2V0X2dlbmllKCkgLSBTU1Igd3JhcHBlciBmb3IgX19pd19zZXRfZ2VuaWUoKQorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8KKyAqIEB3cnF1OiBwb2ludGVyIHRvIGl3cmVxX2RhdGEKKyAqIEBleHRyYTogcG9pbnRlciB0byBleHRyYSBpb2N0bCBwYXlsb2FkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpd19zZXRfZ2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF9nZW5pZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfZ2V0X2dlbmllKCkgLSBTSU9DR0lXR0VOSUUgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQzMl90IGxlbmd0aCA9IERPVDExRl9JRV9SU05fTUFYX0xFTjsKKwl1aW50OF90IGdlbkllQnl0ZXNbRE9UMTFGX0lFX1JTTl9NQVhfTEVOXTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJaGRkTG9nKExPRzEsICJnZXRHRU5fSUUgaW9jdGwiKTsKKworCXBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisJaWYgKHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUgPT0gZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQpIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBSZXR1cm4gc29tZXRoaW5nIE9OTFkgaWYgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aCBhbiBSU04gb3IKKwkgKiBXUEEgbmV0d29yaworCSAqLworCWlmICghaGRkX2lzX2F1dGhfdHlwZV9yc24ocFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubmVnb3RpYXRlZEF1dGhUeXBlKSkgeworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIEFjdHVhbGx5IHJldHJpZXZlIHRoZSBSU04gSUUgZnJvbSBDU1IuICAoV2UgcHJldmlvdXNseSBzZW50CisJICogaXQgZG93biBpbiB0aGUgQ1NSIFJvYW0gUHJvZmlsZS4pCisJICovCisJc3RhdHVzID0gY3NyX3JvYW1fZ2V0X3dwYV9yc25fcmVxX2llKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgICZsZW5ndGgsIGdlbkllQnl0ZXMpOworCWxlbmd0aCA9IENERl9NSU4oKHVpbnQxNl90KSBsZW5ndGgsIERPVDExRl9JRV9SU05fTUFYX0xFTik7CisJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgbGVuZ3RoKSB7CisJCWhkZExvZyhMT0cxLCAiJXM6IGZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlciBidWZmZXIiLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJY2RmX21lbV9jb3B5KGV4dHJhLCAodm9pZCAqKWdlbkllQnl0ZXMsIGxlbmd0aCk7CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBsZW5ndGg7CisKKwloZGRMb2coTE9HMSwgIiVzOiBSU04gSUUgb2YgJWQgYnl0ZXMgcmV0dXJuZWQiLCBfX2Z1bmNfXywKKwkgICAgICAgd3JxdS0+ZGF0YS5sZW5ndGgpOworCisJRVhJVCgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXdfZ2V0X2dlbmllKCkgLSBTU1Igd3JhcHBlciBmb3IgX19pd19nZXRfZ2VuaWUoKQorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8KKyAqIEB3cnF1OiBwb2ludGVyIHRvIGl3cmVxX2RhdGEKKyAqIEBleHRyYTogcG9pbnRlciB0byBleHRyYSBpb2N0bCBwYXlsb2FkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpd19nZXRfZ2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X2dldF9nZW5pZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfZ2V0X2VuY29kZSgpIC0gU0lPQ0dJV0VOQ09ERSBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCXRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlID0gJihwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZSk7CisJaW50IGtleUlkOworCWVDc3JBdXRoVHlwZSBhdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX05PTkU7CisJaW50IGk7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWtleUlkID0gcFJvYW1Qcm9maWxlLT5LZXlzLmRlZmF1bHRJbmRleDsKKworCWlmIChrZXlJZCA8IDAgfHwga2V5SWQgPj0gTUFYX1dFUF9LRVlTKSB7CisJCWhkZExvZyhMT0cxLCAiJXM6IEludmFsaWQga2V5SWQgOiAlZCIsIF9fZnVuY19fLCBrZXlJZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwUm9hbVByb2ZpbGUtPktleXMuS2V5TGVuZ3RoW2tleUlkXSA+IDApIHsKKwkJZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCWR3cnEtPmxlbmd0aCA9IHBSb2FtUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhba2V5SWRdOworCQljZGZfbWVtX2NvcHkoZXh0cmEsICYocFJvYW1Qcm9maWxlLT5LZXlzLktleU1hdGVyaWFsW2tleUlkXVswXSksCisJCQkgICAgIHBSb2FtUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhba2V5SWRdKTsKKworCQlkd3JxLT5mbGFncyB8PSAoa2V5SWQgKyAxKTsKKworCX0gZWxzZSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1dFUF9LRVlTOyBpKyspIHsKKwkJaWYgKHBSb2FtUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFtpXSA9PSBOVUxMKSB7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKE1BWF9XRVBfS0VZUyA9PSBpKSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9OT0tFWTsKKwl9CisKKwlhdXRoVHlwZSA9CisJCSgoaGRkX3N0YXRpb25fY3R4X3QgKikgV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT4KKwkJY29ubl9pbmZvLmF1dGhUeXBlOworCisJaWYgKGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNID09IGF1dGhUeXBlKSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOworCX0gZWxzZSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCX0KKwlFWElUKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXdfZ2V0X2VuY29kZSgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfZ2V0X2VuY29kZSgpCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQGR3cnE6IHBvaW50ZXIgdG8gZW5jb2RpbmcgaW5mb3JtYXRpb24KKyAqIEBleHRyYTogcG9pbnRlciB0byBleHRyYSBpb2N0bCBwYXlsb2FkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpd19nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X2dldF9lbmNvZGUoZGV2LCBpbmZvLCBkd3JxLCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X2dldF9ydHNfdGhyZXNob2xkKCkgLSBTSU9DR0lXUlRTIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X2dldF9ydHNfdGhyZXNob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCisJc3RhdHVzID0gaGRkX3dsYW5fZ2V0X3J0c190aHJlc2hvbGQocEFkYXB0ZXIsIHdycXUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBfX2l3X3NldF9ydHNfdGhyZXNob2xkKCkgLSBTSU9DU0lXUlRTIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X3NldF9ydHNfdGhyZXNob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh3cnF1LT5ydHMudmFsdWUgPCBXTklfQ0ZHX1JUU19USFJFU0hPTERfU1RBTUlOCisJICAgIHx8IHdycXUtPnJ0cy52YWx1ZSA+IFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFNQVgpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludChoSGFsLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsIHdycXUtPnJ0cy52YWx1ZSkgIT0KKwkJCUNERl9TVEFUVVNfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwgRkwKKwkJCQkoImZhaWxlZCB0byBzZXQgaW5pIHBhcmFtZXRlciwgV05JX0NGR19SVFNfVEhSRVNIT0xEIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlFWElUKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpd19nZXRfcnRzX3RocmVzaG9sZCgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfZ2V0X3J0c190aHJlc2hvbGQoKQorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8KKyAqIEB3cnF1OiBwb2ludGVyIHRvIGl3cmVxX2RhdGEKKyAqIEBleHRyYTogcG9pbnRlciB0byBleHRyYSBpb2N0bCBwYXlsb2FkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpd19nZXRfcnRzX3RocmVzaG9sZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19nZXRfcnRzX3RocmVzaG9sZChkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGl3X3NldF9ydHNfdGhyZXNob2xkKCkgLSBTU1Igd3JhcHBlciBmb3IgX19pd19zZXRfcnRzX3RocmVzaG9sZCgpCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQHdycXU6IHBvaW50ZXIgdG8gaXdyZXFfZGF0YQorICogQGV4dHJhOiBwb2ludGVyIHRvIGV4dHJhIGlvY3RsIHBheWxvYWQKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGl3X3NldF9ydHNfdGhyZXNob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF9ydHNfdGhyZXNob2xkKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19nZXRfZnJhZ190aHJlc2hvbGQoKSAtIFNJT0NHSVdGUkFHIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X2dldF9mcmFnX3RocmVzaG9sZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCisJc3RhdHVzID0gaGRkX3dsYW5fZ2V0X2ZyYWdfdGhyZXNob2xkKHBBZGFwdGVyLCB3cnF1KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaXdfZ2V0X2ZyYWdfdGhyZXNob2xkKCkgLSBTU1Igd3JhcHBlciBmb3IgX19pd19nZXRfZnJhZ190aHJlc2hvbGQoKQorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8KKyAqIEB3cnF1OiBwb2ludGVyIHRvIGl3cmVxX2RhdGEKKyAqIEBleHRyYTogcG9pbnRlciB0byBleHRyYSBpb2N0bCBwYXlsb2FkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpd19nZXRfZnJhZ190aHJlc2hvbGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19nZXRfZnJhZ190aHJlc2hvbGQoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X3NldF9mcmFnX3RocmVzaG9sZCgpIC0gU0lPQ1NJV0ZSQUcgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfc2V0X2ZyYWdfdGhyZXNob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHdycXUtPmZyYWcudmFsdWUgPCBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX1NUQU1JTgorCSAgICB8fCB3cnF1LT5mcmFnLnZhbHVlID4gV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNQVgpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNtZV9jZmdfc2V0X2ludAorCQkgICAgKGhIYWwsIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsIHdycXUtPmZyYWcudmFsdWUpCisJCSAgICAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMCisJCQkJKCJmYWlsZWQgdG8gc2V0IGluaSBwYXJhbWV0ZXIsIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQiKSk7CisJCXJldHVybiAtRUlPOworCX0KKworCUVYSVQoKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X3NldF9mcmFnX3RocmVzaG9sZCgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfc2V0X2ZyYWdfdGhyZXNob2xkKCkKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGluZm86IHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gZXh0cmEgaW9jdGwgcGF5bG9hZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfc2V0X2ZyYWdfdGhyZXNob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0X2ZyYWdfdGhyZXNob2xkKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19nZXRfcG93ZXJfbW9kZSgpIC0gU0lPQ0dJV1BPV0VSIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X2dldF9wb3dlcl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXI7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyoqCisgKiBpd19nZXRfcG93ZXJfbW9kZSgpIC0gU1NSIHdyYXBwZXIgZnVuY3Rpb24gZm9yIF9faXdfZ2V0X3Bvd2VyX21vZGUKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGluZm86IHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IGV4dHJhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworaW50IGl3X2dldF9wb3dlcl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X3Bvd2VyX21vZGUoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X3NldF9wb3dlcl9tb2RlKCkgLSBTSU9DU0lXUE9XRVIgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfc2V0X3Bvd2VyX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKioKKyAqIGl3X3NldF9wb3dlcl9tb2RlKCkgLSBTU1Igd3JhcHBlciBmdW5jdGlvbiBmb3IgX19pd19zZXRfcG93ZXJfbW9kZQorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8KKyAqIEB3cnF1OiBwb2ludGVyIHRvIGl3cmVxX2RhdGEKKyAqIEBleHRyYTogZXh0cmEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitpbnQgaXdfc2V0X3Bvd2VyX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfcG93ZXJfbW9kZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfZ2V0X3JhbmdlKCkgLSBTSU9DR0lXUkFOR0UgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopZXh0cmE7CisKKwl1aW50OF90IGNoYW5uZWxzW1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CisKKwl1aW50MzJfdCBudW1fY2hhbm5lbHMgPSBzaXplb2YoY2hhbm5lbHMpOworCXVpbnQ4X3Qgc3VwcF9yYXRlc1tXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUFfTEVOXTsKKwl1aW50MzJfdCBhX2xlbjsKKwl1aW50MzJfdCBiX2xlbjsKKwl1aW50MzJfdCBhY3RpdmVfcGh5X21vZGUgPSAwOworCXVpbnQ4X3QgaW5kZXggPSAwLCBpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gIHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCisJLypHZXQgdGhlIHBoeSBtb2RlICovCisJaWYgKHNtZV9jZmdfZ2V0X2ludChoSGFsLAorCQkJICAgIFdOSV9DRkdfRE9UMTFfTU9ERSwKKwkJCSAgICAmYWN0aXZlX3BoeV9tb2RlKSA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgImFjdGl2ZV9waHlfbW9kZSA9ICVkIiwgYWN0aXZlX3BoeV9tb2RlKTsKKworCQlpZiAoYWN0aXZlX3BoeV9tb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUEKKwkJICAgIHx8IGFjdGl2ZV9waHlfbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFHKSB7CisJCQkvKkdldCB0aGUgc3VwcG9ydGVkIHJhdGVzIGZvciAxMUcgYmFuZCAqLworCQkJYV9sZW4gPSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUFfTEVOOworCQkJaWYgKHNtZV9jZmdfZ2V0X3N0cihoSGFsLAorCQkJCQkgICAgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBLAorCQkJCQkgICAgc3VwcF9yYXRlcywKKwkJCQkJICAgICZhX2xlbikgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJaWYgKGFfbGVuID4gV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBX0xFTikgeworCQkJCQlhX2xlbiA9IFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQV9MRU47CisJCQkJfQorCQkJCWZvciAoaSA9IDA7IGkgPCBhX2xlbjsgaSsrKSB7CisJCQkJCXJhbmdlLT5iaXRyYXRlW2ldID0KKwkJCQkJCSgoc3VwcF9yYXRlc1tpXSAmIDB4N0YpIC8gMikgKgorCQkJCQkJMTAwMDAwMDsKKwkJCQl9CisJCQkJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IGFfbGVuOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfSBlbHNlIGlmIChhY3RpdmVfcGh5X21vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExQikgeworCQkJLypHZXQgdGhlIHN1cHBvcnRlZCByYXRlcyBmb3IgMTFCIGJhbmQgKi8KKwkJCWJfbGVuID0gV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFCX0xFTjsKKwkJCWlmIChzbWVfY2ZnX2dldF9zdHIoaEhhbCwKKwkJCQkJICAgIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQiwKKwkJCQkJICAgIHN1cHBfcmF0ZXMsCisJCQkJCSAgICAmYl9sZW4pID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJCWlmIChiX2xlbiA+IFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQl9MRU4pIHsKKwkJCQkJYl9sZW4gPSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUJfTEVOOworCQkJCX0KKwkJCQlmb3IgKGkgPSAwOyBpIDwgYl9sZW47IGkrKykgeworCQkJCQlyYW5nZS0+Yml0cmF0ZVtpXSA9CisJCQkJCQkoKHN1cHBfcmF0ZXNbaV0gJiAweDdGKSAvIDIpICoKKwkJCQkJCTEwMDAwMDA7CisJCQkJfQorCQkJCXJhbmdlLT5udW1fYml0cmF0ZXMgPSBiX2xlbjsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKwl9CisKKwlyYW5nZS0+bWF4X3J0cyA9IFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFNQVg7CisJcmFuZ2UtPm1pbl9mcmFnID0gV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNSU47CisJcmFuZ2UtPm1heF9mcmFnID0gV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNQVg7CisKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKwlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IE1BWF9XRVBfS0VZUzsKKworCS8qIHdlIHN1cHBvcnQgdGhyb3VnaCBXaXJlbGVzcyBFeHRlbnNpb25zIDIyICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMjI7CisKKwkvKlN1cHBvcnRlZCBDaGFubmVscyBhbmQgRnJlcXVlbmNpZXMgKi8KKwlpZiAoc21lX2NmZ19nZXRfc3RyCisJCSAgICAoKGhIYWwpLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCwgY2hhbm5lbHMsCisJCSAgICAmbnVtX2NoYW5uZWxzKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSAgRkwKKwkJCQkgICgiZmFpbGVkIHRvIGdldCBpbmkgcGFyYW1ldGVyLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCIpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChudW1fY2hhbm5lbHMgPiBJV19NQVhfRlJFUVVFTkNJRVMpIHsKKwkJbnVtX2NoYW5uZWxzID0gSVdfTUFYX0ZSRVFVRU5DSUVTOworCX0KKworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBudW1fY2hhbm5lbHM7CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSBudW1fY2hhbm5lbHM7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1fY2hhbm5lbHM7IGluZGV4KyspIHsKKwkJdWludDMyX3QgZnJxX2luZHggPSAwOworCisJCXJhbmdlLT5mcmVxW2luZGV4XS5pID0gY2hhbm5lbHNbaW5kZXhdOworCQl3aGlsZSAoZnJxX2luZHggPCBGUkVRX0NIQU5fTUFQX1RBQkxFX1NJWkUpIHsKKwkJCWlmIChjaGFubmVsc1tpbmRleF0gPT0gZnJlcV9jaGFuX21hcFtmcnFfaW5keF0uY2hhbikgeworCQkJCXJhbmdlLT5mcmVxW2luZGV4XS5tID0KKwkJCQkJZnJlcV9jaGFuX21hcFtmcnFfaW5keF0uZnJlcSAqIDEwMDAwMDsKKwkJCQlyYW5nZS0+ZnJlcVtpbmRleF0uZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlmcnFfaW5keCsrOworCQl9CisJfQorCisJLyogRXZlbnQgY2FwYWJpbGl0eSAoa2VybmVsICsgZHJpdmVyKSAqLworCXJhbmdlLT5ldmVudF9jYXBhWzBdID0gKElXX0VWRU5UX0NBUEFfS18wIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV0FQKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdTQ0FOKSk7CisJcmFuZ2UtPmV2ZW50X2NhcGFbMV0gPSBJV19FVkVOVF9DQVBBX0tfMTsKKworCS8qRW5jcnlwdGlvbiBjYXBhYmlsaXR5ICovCisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8CisJCQkgIElXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisKKwkvKiBUeHBvd2VyIGNhcGFiaWxpdHkgKi8KKwlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfTVdBVFQ7CisKKwkvKlNjYW5uaW5nIGNhcGFiaWxpdHkgKi8KKyNpZiBXSVJFTEVTU19FWFQgPj0gMjIKKwlyYW5nZS0+c2Nhbl9jYXBhID0KKwkJSVdfU0NBTl9DQVBBX0VTU0lEIHwgSVdfU0NBTl9DQVBBX1RZUEUgfCBJV19TQ0FOX0NBUEFfQ0hBTk5FTDsKKyNlbmRpZgorCisJRVhJVCgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X2dldF9yYW5nZSgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfZ2V0X3JhbmdlKCkKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGluZm86IHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gZXh0cmEgaW9jdGwgcGF5bG9hZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X2dldF9yYW5nZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhkZF9nZXRfY2xhc3NfYV9zdGF0aXN0aWNzX2NiKCkgLSBHZXQgQ2xhc3MgQSBzdGF0cyBjYWxsYmFjayBmdW5jdGlvbgorICogQHBTdGF0czogcG9pbnRlciB0byBDbGFzcyBBIHN0YXRzCisgKiBAcENvbnRleHQ6IHVzZXIgY29udGV4dCBvcmlnaW5hbGx5IHJlZ2lzdGVyZWQgd2l0aCBTTUUKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2dldF9jbGFzc19hX3N0YXRpc3RpY3NfY2Iodm9pZCAqcFN0YXRzLCB2b2lkICpwQ29udGV4dCkKK3sKKwlzdHJ1Y3Qgc3RhdHNDb250ZXh0ICpwU3RhdHNDb250ZXh0OworCXRDc3JHbG9iYWxDbGFzc0FTdGF0c0luZm8gKnBDbGFzc0FTdGF0czsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlcjsKKworCWlmIChpb2N0bF9kZWJ1ZykgeworCQlwcl9pbmZvKCIlczogcFN0YXRzIFslcF0gcENvbnRleHQgWyVwXVxuIiwKKwkJCV9fZnVuY19fLCBwU3RhdHMsIHBDb250ZXh0KTsKKwl9CisKKwlpZiAoKE5VTEwgPT0gcFN0YXRzKSB8fCAoTlVMTCA9PSBwQ29udGV4dCkpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgICIlczogQmFkIHBhcmFtLCBwU3RhdHMgWyVwXSBwQ29udGV4dCBbJXBdIiwKKwkJICAgICAgIF9fZnVuY19fLCBwU3RhdHMsIHBDb250ZXh0KTsKKwkJcmV0dXJuOworCX0KKworCXBDbGFzc0FTdGF0cyA9IHBTdGF0czsKKwlwU3RhdHNDb250ZXh0ID0gcENvbnRleHQ7CisJcEFkYXB0ZXIgPSBwU3RhdHNDb250ZXh0LT5wQWRhcHRlcjsKKworCS8qIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gdGhhdCBleGlzdHMgYmV0d2VlbiB0aGlzIGNhbGxiYWNrCisJICogZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIgc2luY2UgdGhlIGNhbGxlciBjb3VsZCB0aW1lIG91dAorCSAqIGVpdGhlciBiZWZvcmUgb3Igd2hpbGUgdGhpcyBjb2RlIGlzIGV4ZWN1dGluZy4gIHdlIHVzZSBhCisJICogc3BpbmxvY2sgdG8gc2VyaWFsaXplIHRoZXNlIGFjdGlvbnMKKwkgKi8KKwlzcGluX2xvY2soJmhkZF9jb250ZXh0X2xvY2spOworCisJaWYgKChOVUxMID09IHBBZGFwdGVyKSB8fAorCSAgICAoU1RBVFNfQ09OVEVYVF9NQUdJQyAhPSBwU3RhdHNDb250ZXh0LT5tYWdpYykpIHsKKwkJLyogdGhlIGNhbGxlciBwcmVzdW1hYmx5IHRpbWVkIG91dCBzbyB0aGVyZSBpcyBub3RoaW5nCisJCSAqIHdlIGNhbiBkbworCQkgKi8KKwkJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCSAgICAgICAiJXM6IEludmFsaWQgY29udGV4dCwgcEFkYXB0ZXIgWyVwXSBtYWdpYyBbJTA4eF0iLAorCQkgICAgICAgX19mdW5jX18sIHBBZGFwdGVyLCBwU3RhdHNDb250ZXh0LT5tYWdpYyk7CisJCWlmIChpb2N0bF9kZWJ1ZykgeworCQkJcHJfaW5mbygiJXM6IEludmFsaWQgY29udGV4dCwgcEFkYXB0ZXIgWyVwXSBtYWdpYyBbJTA4eF1cbiIsCisJCQkJX19mdW5jX18sIHBBZGFwdGVyLCBwU3RhdHNDb250ZXh0LT5tYWdpYyk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIGNvbnRleHQgaXMgdmFsaWQgc28gY2FsbGVyIGlzIHN0aWxsIHdhaXRpbmcgKi8KKworCS8qIHBhcmFub2lhOiBpbnZhbGlkYXRlIHRoZSBtYWdpYyAqLworCXBTdGF0c0NvbnRleHQtPm1hZ2ljID0gMDsKKworCS8qIGNvcHkgb3ZlciB0aGUgc3RhdHMuIGRvIHNvIGFzIGEgc3RydWN0IGNvcHkgKi8KKwlwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0ID0gKnBDbGFzc0FTdGF0czsKKworCS8qIG5vdGlmeSB0aGUgY2FsbGVyICovCisJY29tcGxldGUoJnBTdGF0c0NvbnRleHQtPmNvbXBsZXRpb24pOworCisJLyogc2VyaWFsaXphdGlvbiBpcyBjb21wbGV0ZSAqLworCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9nZXRfY2xhc3NfYXN0YXRzKCkgLSBHZXQgQ2xhc3MgQSBzdGF0aXN0aWNzCisgKiBAcEFkYXB0ZXI6IGFkYXB0ZXIgZm9yIHdoaWNoIHN0YXRpc3RpY3MgYXJlIGRlc2lyZWQKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBpZiBhZGFwdGVyJ3MgQ2xhc3MgQSBzdGF0aXN0aWNzIHdlcmUgdXBkYXRlZAorICovCitDREZfU1RBVFVTIHdsYW5faGRkX2dldF9jbGFzc19hc3RhdHMoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwlDREZfU1RBVFVTIGhzdGF0dXM7CisJdW5zaWduZWQgbG9uZyByYzsKKwlzdHJ1Y3Qgc3RhdHNDb250ZXh0IGNvbnRleHQ7CisKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHBBZGFwdGVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCWlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCS8qIHdlIGFyZSBjb25uZWN0ZWQgc28gcHJlcGFyZSBvdXIgY2FsbGJhY2sgY29udGV4dCAqLworCWluaXRfY29tcGxldGlvbigmY29udGV4dC5jb21wbGV0aW9uKTsKKwljb250ZXh0LnBBZGFwdGVyID0gcEFkYXB0ZXI7CisJY29udGV4dC5tYWdpYyA9IFNUQVRTX0NPTlRFWFRfTUFHSUM7CisJLyogcXVlcnkgb25seSBmb3IgQ2xhc3MgQSBzdGF0aXN0aWNzICh3aGljaCBpbmNsdWRlIGxpbmsgc3BlZWQpICovCisJaHN0YXR1cyA9IHNtZV9nZXRfc3RhdGlzdGljcyhXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJICAgICBlQ1NSX0hERCwgU01FX0dMT0JBTF9DTEFTU0FfU1RBVFMsCisJCQkJICAgICBoZGRfZ2V0X2NsYXNzX2Ffc3RhdGlzdGljc19jYiwKKwkJCQkgICAgIDAsIC8qIG5vdCBwZXJpb2RpYyAqLworCQkJCSAgICAgZmFsc2UsIC8qIG5vbi1jYWNoZWQgcmVzdWx0cyAqLworCQkJCSAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdLAorCQkJCSAgICAgJmNvbnRleHQsIHBBZGFwdGVyLT5zZXNzaW9uSWQpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gaHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmV0cmlldmUgQ2xhc3MgQSBzdGF0aXN0aWNzIiwgX19mdW5jX18pOworCQkvKiB3ZSdsbCByZXR1cm5lZCBhIGNhY2hlZCB2YWx1ZSBiZWxvdyAqLworCX0gZWxzZSB7CisJCS8qIHJlcXVlc3Qgd2FzIHNlbnQgLS0gd2FpdCBmb3IgdGhlIHJlc3BvbnNlICovCisJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0CisJCQkoJmNvbnRleHQuY29tcGxldGlvbiwKKwkJCSBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX1NUQVRTKSk7CisJCWlmICghcmMpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgRkwoIlNNRSB0aW1lZCBvdXQgd2hpbGUgcmV0cmlldmluZyBDbGFzcyBBIHN0YXRpc3RpY3MiKSk7CisJCX0KKwl9CisKKwkvKiBlaXRoZXIgd2UgbmV2ZXIgc2VudCBhIHJlcXVlc3QsIHdlIHNlbnQgYSByZXF1ZXN0IGFuZAorCSAqIHJlY2VpdmVkIGEgcmVzcG9uc2Ugb3Igd2Ugc2VudCBhIHJlcXVlc3QgYW5kIHRpbWVkIG91dC4gIGlmCisJICogd2UgbmV2ZXIgc2VudCBhIHJlcXVlc3Qgb3IgaWYgd2Ugc2VudCBhIHJlcXVlc3QgYW5kIGdvdCBhCisJICogcmVzcG9uc2UsIHdlIHdhbnQgdG8gY2xlYXIgdGhlIG1hZ2ljIG91dCBvZiBwYXJhbm9pYS4gIGlmCisJICogd2UgdGltZWQgb3V0IHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gc3VjaCB0aGF0IHRoZQorCSAqIGNhbGxiYWNrIGZ1bmN0aW9uIGNvdWxkIGJlIGV4ZWN1dGluZyBhdCB0aGUgc2FtZSB0aW1lIHdlCisJICogYXJlLiBvZiBwcmltYXJ5IGNvbmNlcm4gaXMgaWYgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGhhZAorCSAqIGFscmVhZHkgdmVyaWZpZWQgdGhlICJtYWdpYyIgYnV0IGhhZCBub3QgeWV0IHNldCB0aGUKKwkgKiBjb21wbGV0aW9uIHZhcmlhYmxlIHdoZW4gYSB0aW1lb3V0IG9jY3VycmVkLiB3ZSBzZXJpYWxpemUKKwkgKiB0aGVzZSBhY3Rpdml0aWVzIGJ5IGludmFsaWRhdGluZyB0aGUgbWFnaWMgd2hpbGUgaG9sZGluZyBhCisJICogc2hhcmVkIHNwaW5sb2NrIHdoaWNoIHdpbGwgY2F1c2UgdXMgdG8gYmxvY2sgaWYgdGhlCisJICogY2FsbGJhY2sgaXMgY3VycmVudGx5IGV4ZWN1dGluZworCSAqLworCXNwaW5fbG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJY29udGV4dC5tYWdpYyA9IDA7CisJc3Bpbl91bmxvY2soJmhkZF9jb250ZXh0X2xvY2spOworCisJLyogZWl0aGVyIGNhbGxiYWNrIHVwZGF0ZWQgcEFkYXB0ZXIgc3RhdHMgb3IgaXQgaGFzIGNhY2hlZCBkYXRhICovCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBoZGRfZ2V0X3N0YXRpb25fc3RhdGlzdGljc19jYigpIC0gR2V0IHN0YXRzIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcFN0YXRzOiBwb2ludGVyIHRvIENsYXNzIEEgc3RhdHMKKyAqIEBwQ29udGV4dDogdXNlciBjb250ZXh0IG9yaWdpbmFsbHkgcmVnaXN0ZXJlZCB3aXRoIFNNRQorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfZ2V0X3N0YXRpb25fc3RhdGlzdGljc19jYih2b2lkICpwU3RhdHMsIHZvaWQgKnBDb250ZXh0KQoreworCXN0cnVjdCBzdGF0c0NvbnRleHQgKnBTdGF0c0NvbnRleHQ7CisJdENzclN1bW1hcnlTdGF0c0luZm8gKnBTdW1tYXJ5U3RhdHM7CisJdENzckdsb2JhbENsYXNzQVN0YXRzSW5mbyAqcENsYXNzQVN0YXRzOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCisJaWYgKGlvY3RsX2RlYnVnKSB7CisJCXByX2luZm8oIiVzOiBwU3RhdHMgWyVwXSBwQ29udGV4dCBbJXBdXG4iLAorCQkJX19mdW5jX18sIHBTdGF0cywgcENvbnRleHQpOworCX0KKworCWlmICgoTlVMTCA9PSBwU3RhdHMpIHx8IChOVUxMID09IHBDb250ZXh0KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBCYWQgcGFyYW0sIHBTdGF0cyBbJXBdIHBDb250ZXh0IFslcF0iLAorCQkgICAgICAgX19mdW5jX18sIHBTdGF0cywgcENvbnRleHQpOworCQlyZXR1cm47CisJfQorCisJLyogdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiB0aGF0IGV4aXN0cyBiZXR3ZWVuIHRoaXMgY2FsbGJhY2sKKwkgKiBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlciBzaW5jZSB0aGUgY2FsbGVyIGNvdWxkIHRpbWUgb3V0CisJICogZWl0aGVyIGJlZm9yZSBvciB3aGlsZSB0aGlzIGNvZGUgaXMgZXhlY3V0aW5nLiAgd2UgdXNlIGEKKwkgKiBzcGlubG9jayB0byBzZXJpYWxpemUgdGhlc2UgYWN0aW9ucworCSAqLworCXNwaW5fbG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisKKwlwU3VtbWFyeVN0YXRzID0gKHRDc3JTdW1tYXJ5U3RhdHNJbmZvICopIHBTdGF0czsKKwlwQ2xhc3NBU3RhdHMgPSAodENzckdsb2JhbENsYXNzQVN0YXRzSW5mbyAqKSAocFN1bW1hcnlTdGF0cyArIDEpOworCXBTdGF0c0NvbnRleHQgPSBwQ29udGV4dDsKKwlwQWRhcHRlciA9IHBTdGF0c0NvbnRleHQtPnBBZGFwdGVyOworCWlmICgoTlVMTCA9PSBwQWRhcHRlcikgfHwKKwkgICAgKFNUQVRTX0NPTlRFWFRfTUFHSUMgIT0gcFN0YXRzQ29udGV4dC0+bWFnaWMpKSB7CisJCS8qIHRoZSBjYWxsZXIgcHJlc3VtYWJseSB0aW1lZCBvdXQgc28gdGhlcmUgaXMgbm90aGluZworCQkgKiB3ZSBjYW4gZG8KKwkJICovCisJCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkgICAgICAgIiVzOiBJbnZhbGlkIGNvbnRleHQsIHBBZGFwdGVyIFslcF0gbWFnaWMgWyUwOHhdIiwKKwkJICAgICAgIF9fZnVuY19fLCBwQWRhcHRlciwgcFN0YXRzQ29udGV4dC0+bWFnaWMpOworCQlpZiAoaW9jdGxfZGVidWcpIHsKKwkJCXByX2luZm8oIiVzOiBJbnZhbGlkIGNvbnRleHQsIHBBZGFwdGVyIFslcF0gbWFnaWMgWyUwOHhdXG4iLAorCQkJCV9fZnVuY19fLCBwQWRhcHRlciwgcFN0YXRzQ29udGV4dC0+bWFnaWMpOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKiBjb250ZXh0IGlzIHZhbGlkIHNvIGNhbGxlciBpcyBzdGlsbCB3YWl0aW5nICovCisKKwkvKiBwYXJhbm9pYTogaW52YWxpZGF0ZSB0aGUgbWFnaWMgKi8KKwlwU3RhdHNDb250ZXh0LT5tYWdpYyA9IDA7CisKKwkvKiBjb3B5IG92ZXIgdGhlIHN0YXRzLiBkbyBzbyBhcyBhIHN0cnVjdCBjb3B5ICovCisJcEFkYXB0ZXItPmhkZF9zdGF0cy5zdW1tYXJ5X3N0YXQgPSAqcFN1bW1hcnlTdGF0czsKKwlwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0ID0gKnBDbGFzc0FTdGF0czsKKworCS8qIG5vdGlmeSB0aGUgY2FsbGVyICovCisJY29tcGxldGUoJnBTdGF0c0NvbnRleHQtPmNvbXBsZXRpb24pOworCisJLyogc2VyaWFsaXphdGlvbiBpcyBjb21wbGV0ZSAqLworCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKK30KKworLyoqCisgKiB3bGFuX2hkZF9nZXRfc3RhdGlvbl9zdGF0cygpIC0gR2V0IHN0YXRpb24gc3RhdGlzdGljcworICogQHBBZGFwdGVyOiBhZGFwdGVyIGZvciB3aGljaCBzdGF0aXN0aWNzIGFyZSBkZXNpcmVkCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgaWYgYWRhcHRlcidzIHN0YXRpc3RpY3Mgd2VyZSB1cGRhdGVkCisgKi8KK0NERl9TVEFUVVMgd2xhbl9oZGRfZ2V0X3N0YXRpb25fc3RhdHMoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwlDREZfU1RBVFVTIGhzdGF0dXM7CisJdW5zaWduZWQgbG9uZyByYzsKKwlzdHJ1Y3Qgc3RhdHNDb250ZXh0IGNvbnRleHQ7CisKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHBBZGFwdGVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJLyogd2UgYXJlIGNvbm5lY3RlZCBzbyBwcmVwYXJlIG91ciBjYWxsYmFjayBjb250ZXh0ICovCisJaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LmNvbXBsZXRpb24pOworCWNvbnRleHQucEFkYXB0ZXIgPSBwQWRhcHRlcjsKKwljb250ZXh0Lm1hZ2ljID0gU1RBVFNfQ09OVEVYVF9NQUdJQzsKKworCS8qIHF1ZXJ5IG9ubHkgZm9yIFN1bW1hcnkgJiBDbGFzcyBBIHN0YXRpc3RpY3MgKi8KKwloc3RhdHVzID0gc21lX2dldF9zdGF0aXN0aWNzKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkgICAgIGVDU1JfSERELAorCQkJCSAgICAgU01FX1NVTU1BUllfU1RBVFMgfAorCQkJCQlTTUVfR0xPQkFMX0NMQVNTQV9TVEFUUywKKwkJCQkgICAgIGhkZF9nZXRfc3RhdGlvbl9zdGF0aXN0aWNzX2NiLAorCQkJCSAgICAgMCwgLyogbm90IHBlcmlvZGljICovCisJCQkJICAgICBmYWxzZSwgLyogbm9uLWNhY2hlZCByZXN1bHRzICovCisJCQkJICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbMF0sCisJCQkJICAgICAmY29udGV4dCwgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBoc3RhdHVzKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgICAiJXM6IFVuYWJsZSB0byByZXRyaWV2ZSBzdGF0aXN0aWNzIiwgX19mdW5jX18pOworCQkvKiB3ZSdsbCByZXR1cm4gd2l0aCBjYWNoZWQgdmFsdWVzICovCisJfSBlbHNlIHsKKwkJLyogcmVxdWVzdCB3YXMgc2VudCAtLSB3YWl0IGZvciB0aGUgcmVzcG9uc2UgKi8KKwkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQKKwkJCSgmY29udGV4dC5jb21wbGV0aW9uLAorCQkJIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfU1RBVFMpKTsKKworCQlpZiAoIXJjKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIEZMKCJTTUUgdGltZWQgb3V0IHdoaWxlIHJldHJpZXZpbmcgc3RhdGlzdGljcyIpKTsKKwkJfQorCX0KKworCS8qIGVpdGhlciB3ZSBuZXZlciBzZW50IGEgcmVxdWVzdCwgd2Ugc2VudCBhIHJlcXVlc3QgYW5kCisJICogcmVjZWl2ZWQgYSByZXNwb25zZSBvciB3ZSBzZW50IGEgcmVxdWVzdCBhbmQgdGltZWQgb3V0LiAgaWYKKwkgKiB3ZSBuZXZlciBzZW50IGEgcmVxdWVzdCBvciBpZiB3ZSBzZW50IGEgcmVxdWVzdCBhbmQgZ290IGEKKwkgKiByZXNwb25zZSwgd2Ugd2FudCB0byBjbGVhciB0aGUgbWFnaWMgb3V0IG9mIHBhcmFub2lhLiAgaWYKKwkgKiB3ZSB0aW1lZCBvdXQgdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBzdWNoIHRoYXQgdGhlCisJICogY2FsbGJhY2sgZnVuY3Rpb24gY291bGQgYmUgZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUgd2UKKwkgKiBhcmUuIG9mIHByaW1hcnkgY29uY2VybiBpcyBpZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaGFkCisJICogYWxyZWFkeSB2ZXJpZmllZCB0aGUgIm1hZ2ljIiBidXQgaGFkIG5vdCB5ZXQgc2V0IHRoZQorCSAqIGNvbXBsZXRpb24gdmFyaWFibGUgd2hlbiBhIHRpbWVvdXQgb2NjdXJyZWQuIHdlIHNlcmlhbGl6ZQorCSAqIHRoZXNlIGFjdGl2aXRpZXMgYnkgaW52YWxpZGF0aW5nIHRoZSBtYWdpYyB3aGlsZSBob2xkaW5nIGEKKwkgKiBzaGFyZWQgc3BpbmxvY2sgd2hpY2ggd2lsbCBjYXVzZSB1cyB0byBibG9jayBpZiB0aGUKKwkgKiBjYWxsYmFjayBpcyBjdXJyZW50bHkgZXhlY3V0aW5nCisJICovCisJc3Bpbl9sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwljb250ZXh0Lm1hZ2ljID0gMDsKKwlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisKKwkvKiBlaXRoZXIgY2FsbGJhY2sgdXBkYXRlZCBwQWRhcHRlciBzdGF0cyBvciBpdCBoYXMgY2FjaGVkIGRhdGEgKi8KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGl3X2dldF9saW5rc3BlZWQoKSAtIEdldCBjdXJyZW50IGxpbmsgc3BlZWQgaW9jdGwKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGV4dHJhIGlvY3RsIGJ1ZmZlcgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X2xpbmtzcGVlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJY2hhciAqcExpbmtTcGVlZCA9IChjaGFyICopZXh0cmE7CisJaW50IGxlbiA9IHNpemVvZih1aW50MzJfdCkgKyAxOworCXVpbnQzMl90IGxpbmtfc3BlZWQgPSAwOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaW50IHJjLCB2YWxpZDsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwl2YWxpZCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gdmFsaWQpCisJCXJldHVybiB2YWxpZDsKKworCXJjID0gd2xhbl9oZGRfZ2V0X2xpbmtfc3BlZWQocEFkYXB0ZXIsICZsaW5rX3NwZWVkKTsKKwlpZiAoMCAhPSByYykgeworCQlyZXR1cm4gcmM7CisJfQorCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBsZW47CisJLyogcmV0dXJuIHRoZSBsaW5rc3BlZWQgYXMgYSBzdHJpbmcgKi8KKwlyYyA9IHNucHJpbnRmKHBMaW5rU3BlZWQsIGxlbiwgIiV1IiwgbGlua19zcGVlZCk7CisJaWYgKChyYyA8IDApIHx8IChyYyA+PSBsZW4pKSB7CisJCS8qIGVuY29kaW5nIG9yIGxlbmd0aCBlcnJvcj8gKi8KKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgIEZMKCJVbmFibGUgdG8gZW5jb2RlIGxpbmsgc3BlZWQiKSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGEgdmFsdWUgaXMgYmVpbmcgc3VjY2Vzc2Z1bGx5IHJldHVybmVkICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfZ2V0X2xpbmtzcGVlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19nZXRfbGlua3NwZWVkKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd2xhbl9oZGRfY2hhbmdlX2NvdW50cnlfY29kZV9jYWxsYmFjaygpIC0gQ2hhbmdlIGNvdW50cnkgY29kZSBjYWxsYmFjaworICogQGNvbnRleHQ6IG9wYXF1ZSBjb250ZXh0IG9yaWdpbmFsbHkgcGFzc2VkIHRvIFNNRS4gIEFsbCBmdW5jdGlvbnMKKyAqIHdoaWNoIHVzZSB0aGlzIGNhbGxiYWNrIHBhc3MgdGhlIGFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgY291bnRyeQorICogY29kZSBjaGFuZ2UgaXMgYWN0aXZlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIGFzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuCisgKiBzbWVfY2hhbmdlX2NvdW50cnlfY29kZSgpIGlzIGludm9rZWQuICBDYWxsZXJzIG9mCisgKiBzbWVfY2hhbmdlX2NvdW50cnlfY29kZSgpIHN1YnNlcXVlbnRseSB3YWl0IGZvciB0aGUgYWRhcHRlcidzCisgKiBAY2hhbmdlX2NvdW50cnlfY29kZSBjb21wbGV0aW9uIHZhcmlhYmxlLCBzbyBhbGwgdGhpcyBmdW5jdGlvbgorICogbmVlZHMgdG8gZG8gaXMgc2V0IHRoYXQgY29tcGxldGlvbiB2YXJpYWJsZSBzbyB0aGF0IGV4ZWN1dGlvbiBjYW4KKyAqIGNvbnRpbnVlLgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdsYW5faGRkX2NoYW5nZV9jb3VudHJ5X2NvZGVfY2FsbGJhY2sodm9pZCAqY29udGV4dCkKK3sKKworCWhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIgPSBjb250ZXh0OworCisJaWYgKGFkYXB0ZXIgJiYgKFdMQU5fSEREX0FEQVBURVJfTUFHSUMgPT0gYWRhcHRlci0+bWFnaWMpKQorCQljb21wbGV0ZSgmYWRhcHRlci0+Y2hhbmdlX2NvdW50cnlfY29kZSk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogX19pd19zZXRfbmljaygpIC0gU0lPQ1NJV05JQ0tOIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X3NldF9uaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXdfc2V0X25pY2soKSAtIFNTUiB3cmFwcGVyIGZvciBfX2l3X3NldF9uaWNrCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQHdycXU6IHBvaW50ZXIgdG8gaXdyZXFfZGF0YQorICogQGV4dHJhOiBleHRyYQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfc2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF9uaWNrKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19nZXRfbmljaygpIC0gU0lPQ0dJV05JQ0tOIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X2dldF9uaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcjsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXdfZ2V0X25pY2soKSAtIFNTUiB3cmFwcGVyIGZvciBfX2l3X2dldF9uaWNrCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQHdycXU6IHBvaW50ZXIgdG8gaXdyZXFfZGF0YQorICogQGV4dHJhOiBleHRyYQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfZ2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X2dldF9uaWNrKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19zZXRfZW5jb2RlKCkgLSBTSU9DU0lXRU5DT0RFIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwloZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RlcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKKwl1aW50MzJfdCBrZXlJZDsKKwl1aW50OF90IGtleV9sZW5ndGg7CisJZUNzckVuY3J5cHRpb25UeXBlIGVuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwlib29sIGZLZXlQcmVzZW50ID0gMDsKKwlpbnQgaTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWtleUlkID0gZW5jb2RlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCisJaWYgKGtleUlkKSB7CisJCWlmIChrZXlJZCA+IE1BWF9XRVBfS0VZUykgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmS2V5UHJlc2VudCA9IDE7CisJCWtleUlkLS07CisJfSBlbHNlIHsKKwkJZktleVByZXNlbnQgPSAwOworCX0KKworCWlmICh3cnF1LT5kYXRhLmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIqKioqaXdjb25maWcgd2xhbjAga2V5IG9mZioqKioqIik7CisJCWlmICghZktleVByZXNlbnQpIHsKKworCQkJZm9yIChpID0gMDsgaSA8IENTUl9NQVhfTlVNX0tFWTsgaSsrKSB7CisKKwkJCQlpZiAocFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy5LZXlNYXRlcmlhbFtpXSkKKwkJCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy4KKwkJCQkJS2V5TGVuZ3RoW2ldID0gMDsKKwkJCX0KKwkJfQorCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKwkJcFdleHRTdGF0ZS0+d3BhVmVyc2lvbiA9IElXX0FVVEhfV1BBX1ZFUlNJT05fRElTQUJMRUQ7CisJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0KKwkJCWVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm1jRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPQorCQkJZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKworCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8udWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5tY0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKworCQlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09CisJCSAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSB7CisJCQlJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPmRpc2Nvbm5lY3RfY29tcF92YXIpOworCQkJc3RhdHVzID0KKwkJCQlzbWVfcm9hbV9kaXNjb25uZWN0KFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJCSAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJCQl1bnNpZ25lZCBsb25nIHJjOworCQkJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwQWRhcHRlci0+CisJCQkJCQkJCSBkaXNjb25uZWN0X2NvbXBfdmFyLAorCQkJCQkJCQkgbXNlY3NfdG9famlmZmllcworCQkJCQkJCQkJIChXTEFOX1dBSVRfVElNRV9ESVNDT05ORUNUKSk7CisJCQkJaWYgKCFyYykKKwkJCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAgICAgIEZMCisJCQkJCQkgICAgICAgKCJmYWlsZWQgd2FpdCBvbiBkaXNjb25uZWN0X2NvbXBfdmFyIikpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHN0YXR1czsKKworCX0KKworCWlmICh3cnF1LT5kYXRhLmZsYWdzICYgKElXX0VOQ09ERV9PUEVOIHwgSVdfRU5DT0RFX1JFU1RSSUNURUQpKSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywgIml3Y29uZmlnIHdsYW4wIGtleSBvbiIpOworCisJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSA9CisJCQkoZW5jb2RlcnEtPgorCQkJIGZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpID8gZUNTUl9BVVRIX1RZUEVfU0hBUkVEX0tFWSA6CisJCQllQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKworCX0KKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJXMgOiB3cnF1LT5kYXRhLmxlbmd0aCA6ICVkIiwKKwkJICAgICAgIF9fZnVuY19fLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisKKwkJa2V5X2xlbmd0aCA9IHdycXUtPmRhdGEubGVuZ3RoOworCisJCS8qIElXX0VOQ09ESU5HX1RPS0VOX01BWCBpcyB0aGUgdmFsdWUgdGhhdCBpcyBzZXQgZm9yIHdycXUtPmRhdGEubGVuZ3RoIGJ5IGl3Y29uZmlnLmMgd2hlbiAnaXdjb25maWcgd2xhbjAga2V5IG9uJyBpcyBpc3N1ZWQuICovCisKKwkJaWYgKDUgPT0ga2V5X2xlbmd0aCkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAgICAgICIlczogQ2FsbCB3aXRoIFdFUDQwLGtleV9sZW49JWQiLCBfX2Z1bmNfXywKKwkJCSAgICAgICBrZXlfbGVuZ3RoKTsKKworCQkJaWYgKChJV19BVVRIX0tFWV9NR01UXzgwMl8xWCA9PSBwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCkKKwkJCSAgICAmJiAoZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0gPT0KKwkJCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUpKSB7CisJCQkJZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDsKKwkJCX0gZWxzZSB7CisJCQkJZW5jcnlwdGlvblR5cGUgPQorCQkJCQllQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk7CisJCQl9CisJCX0gZWxzZSBpZiAoMTMgPT0ga2V5X2xlbmd0aCkgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAgICAgICIlczpDYWxsIHdpdGggV0VQMTA0LGtleV9sZW46JWQiLCBfX2Z1bmNfXywKKwkJCSAgICAgICBrZXlfbGVuZ3RoKTsKKworCQkJaWYgKChJV19BVVRIX0tFWV9NR01UXzgwMl8xWCA9PSBwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCkKKwkJCSAgICAmJiAoZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0gPT0KKwkJCQlwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUpKSB7CisJCQkJZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ7CisJCQl9IGVsc2UgeworCQkJCWVuY3J5cHRpb25UeXBlID0KKwkJCQkJZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSAgICAgICAiJXM6IEludmFsaWQgV0VQIGtleSBsZW5ndGggOiVkIiwgX19mdW5jX18sCisJCQkgICAgICAga2V5X2xlbmd0aCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXBIZGRTdGFDdHgtPmNvbm5faW5mby51Y0VuY3J5cHRpb25UeXBlID0gZW5jcnlwdGlvblR5cGU7CisJCXBIZGRTdGFDdHgtPmNvbm5faW5mby5tY0VuY3J5cHRpb25UeXBlID0gZW5jcnlwdGlvblR5cGU7CisJCXBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCQllbmNyeXB0aW9uVHlwZTsKKwkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKwkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCQllbmNyeXB0aW9uVHlwZTsKKworCQlpZiAoKGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkID09CisJCSAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKwkJICAgICYmCisJCSAgICAoKGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNID09CisJCSAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkKKwkJICAgICB8fCAoZUNTUl9BVVRIX1RZUEVfU0hBUkVEX0tFWSA9PQorCQkJIHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkpKSB7CisKKwkJCWNkZl9tZW1fY29weSgmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy4KKwkJCQkgICAgIEtleU1hdGVyaWFsW2tleUlkXVswXSwgZXh0cmEsIGtleV9sZW5ndGgpOworCisJCQlwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5LZXlzLktleUxlbmd0aFtrZXlJZF0gPQorCQkJCSh1aW50OF90KSBrZXlfbGVuZ3RoOworCQkJcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy5kZWZhdWx0SW5kZXggPQorCQkJCSh1aW50OF90KSBrZXlJZDsKKworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X3NldF9lbmNvZGUoKSAtIFNTUiB3cmFwcGVyIGZvciBfX2l3X3NldF9lbmNvZGUoKQorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8KKyAqIEB3cnF1OiBwb2ludGVyIHRvIGl3cmVxX2RhdGEKKyAqIEBleHRyYTogcG9pbnRlciB0byBleHRyYSBpb2N0bCBwYXlsb2FkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpd19zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfZW5jb2RlKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19pd19nZXRfZW5jb2RlZXh0KCkgLSBTSU9DR0lXRU5DT0RFRVhUIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X2dldF9lbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisJdENzclJvYW1Qcm9maWxlICpwUm9hbVByb2ZpbGUgPSAmKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlKTsKKwlpbnQga2V5SWQ7CisJZUNzckVuY3J5cHRpb25UeXBlIGVuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwllQ3NyQXV0aFR5cGUgYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9OT05FOworCWludCBpLCByZXQ7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlrZXlJZCA9IHBSb2FtUHJvZmlsZS0+S2V5cy5kZWZhdWx0SW5kZXg7CisKKwlpZiAoa2V5SWQgPCAwIHx8IGtleUlkID49IE1BWF9XRVBfS0VZUykgeworCQloZGRMb2coTE9HMSwgIiVzOiBJbnZhbGlkIGtleUlkIDogJWQiLCBfX2Z1bmNfXywga2V5SWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocFJvYW1Qcm9maWxlLT5LZXlzLktleUxlbmd0aFtrZXlJZF0gPiAwKSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCQlkd3JxLT5sZW5ndGggPSBwUm9hbVByb2ZpbGUtPktleXMuS2V5TGVuZ3RoW2tleUlkXTsKKwkJY2RmX21lbV9jb3B5KGV4dHJhLCAmKHBSb2FtUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFtrZXlJZF1bMF0pLAorCQkJICAgICBwUm9hbVByb2ZpbGUtPktleXMuS2V5TGVuZ3RoW2tleUlkXSk7CisJfSBlbHNlIHsKKwkJZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfV0VQX0tFWVM7IGkrKykgeworCQlpZiAocFJvYW1Qcm9maWxlLT5LZXlzLktleU1hdGVyaWFsW2ldID09IE5VTEwpIHsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoTUFYX1dFUF9LRVlTID09IGkpIHsKKwkJZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX05PS0VZOworCX0gZWxzZSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCX0KKworCWVuY3J5cHRpb25UeXBlID0gcFJvYW1Qcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXTsKKworCWlmIChlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FID09IGVuY3J5cHRpb25UeXBlKSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisKKwlhdXRoVHlwZSA9IChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5hdXRoVHlwZTsKKworCWlmIChJV19BVVRIX0FMR19PUEVOX1NZU1RFTSA9PSBhdXRoVHlwZSkgeworCQlkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsKKwl9IGVsc2UgeworCQlkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKwl9CisJRVhJVCgpOworCXJldHVybiAwOworCit9CisKKy8qKgorICogaXdfZ2V0X2VuY29kZWV4dCgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfZ2V0X2VuY29kZWV4dCgpCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQGR3cnE6IHBvaW50ZXIgdG8gZW5jb2RpbmcgaW5mb3JtYXRpb24KKyAqIEBleHRyYTogcG9pbnRlciB0byBleHRyYSBpb2N0bCBwYXlsb2FkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpd19nZXRfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfZ2V0X2VuY29kZWV4dChkZXYsIGluZm8sIGR3cnEsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfc2V0X2VuY29kZWV4dCgpIC0gU0lPQ1NJV0VOQ09ERUVYVCBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19zZXRfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyUm9hbVByb2ZpbGUgKnBSb2FtUHJvZmlsZSA9ICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZTsKKwlpbnQgcmV0OworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQga2V5X2luZGV4OworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJdENzclJvYW1TZXRLZXkgc2V0S2V5OworCXVpbnQzMl90IHJvYW1JZCA9IDB4RkY7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJa2V5X2luZGV4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCisJaWYgKGtleV9pbmRleCA+IDApIHsKKworCQkvKkNvbnZlcnQgZnJvbSAxLWJhc2VkIHRvIDAtYmFzZWQga2V5aW5nICovCisJCWtleV9pbmRleC0tOworCX0KKwlpZiAoIWV4dC0+a2V5X2xlbikgeworCisJCS8qU2V0IHRoZSBlbmNyeXRpb24gdHlwZSB0byBOT05FICovCisJCXBSb2FtUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPQorCQkJZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSAmJgorCSAgICAoSVdfRU5DT0RFX0FMR19XRVAgPT0gZXh0LT5hbGcpKSB7CisJCWlmIChJV19BVVRIX0tFWV9NR01UXzgwMl8xWCA9PSBwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCkgeworCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICgiSW52YWxpZCBDb25maWd1cmF0aW9uOiVzIiksIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJLypTdGF0aWMgd2VwLCB1cGRhdGUgdGhlIHJvYW0gcHJvZmlsZSB3aXRoIHRoZSBrZXlzICovCisJCQlpZiAoZXh0LT5rZXkKKwkJCSAgICAmJiAoZXh0LT5rZXlfbGVuIDw9CisJCQkJZUNTUl9TRUNVUklUWV9XRVBfS0VZU0laRV9NQVhfQllURVMpCisJCQkgICAgJiYga2V5X2luZGV4IDwgQ1NSX01BWF9OVU1fS0VZKSB7CisJCQkJY2RmX21lbV9jb3B5KCZwUm9hbVByb2ZpbGUtPktleXMuCisJCQkJCSAgICAgS2V5TWF0ZXJpYWxba2V5X2luZGV4XVswXSwKKwkJCQkJICAgICBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKKwkJCQlwUm9hbVByb2ZpbGUtPktleXMuS2V5TGVuZ3RoW2tleV9pbmRleF0gPQorCQkJCQkodWludDhfdCkgZXh0LT5rZXlfbGVuOworCisJCQkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorCQkJCQlwUm9hbVByb2ZpbGUtPktleXMuZGVmYXVsdEluZGV4ID0KKwkJCQkJCSh1aW50OF90KSBrZXlfaW5kZXg7CisKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCWNkZl9tZW1femVybygmc2V0S2V5LCBzaXplb2YodENzclJvYW1TZXRLZXkpKTsKKworCXNldEtleS5rZXlJZCA9IGtleV9pbmRleDsKKwlzZXRLZXkua2V5TGVuZ3RoID0gZXh0LT5rZXlfbGVuOworCisJaWYgKGV4dC0+a2V5X2xlbiA8PSBDU1JfTUFYX0tFWV9MRU4pIHsKKwkJY2RmX21lbV9jb3B5KCZzZXRLZXkuS2V5WzBdLCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKKwl9CisKKwlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkgeworCQkvKktleSBkaXJlY3Rpb24gZm9yIGdyb3VwIGlzIFJYIG9ubHkgKi8KKwkJc2V0S2V5LmtleURpcmVjdGlvbiA9IGVTSVJfUlhfT05MWTsKKwkJY2RmX3NldF9tYWNhZGRyX2Jyb2FkY2FzdCgmc2V0S2V5LnBlZXJNYWMpOworCX0gZWxzZSB7CisKKwkJc2V0S2V5LmtleURpcmVjdGlvbiA9IGVTSVJfVFhfUlg7CisJCWNkZl9tZW1fY29weShzZXRLZXkucGVlck1hYy5ieXRlcywgZXh0LT5hZGRyLnNhX2RhdGEsCisJCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKwl9CisKKwkvKkZvciBzdXBwbGljYW50IHBhZSByb2xlIGlzIHplcm8gKi8KKwlzZXRLZXkucGFlUm9sZSA9IDA7CisKKwlzd2l0Y2ggKGV4dC0+YWxnKSB7CisJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisJCXNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorCQlzZXRLZXkuZW5jVHlwZSA9CisJCQkoZXh0LT5rZXlfbGVuID09CisJCQkgNSkgPyBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MCA6IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDsKKwkJYnJlYWs7CisKKwljYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKwl7CisJCXVpbnQ4X3QgKnBLZXkgPSAmc2V0S2V5LktleVswXTsKKworCQlzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1RLSVA7CisKKwkJY2RmX21lbV96ZXJvKHBLZXksIENTUl9NQVhfS0VZX0xFTik7CisKKwkJLyogU3VwcGxpY2FudCBzZW5kcyB0aGUgMzJieXRlcyBrZXkgaW4gdGhpcyBvcmRlcgorCQkgKiB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorCQkgKiB8ICAgVGsxICAgICAgICB8IFRYIE1JQyAgIHwgIFJYIE1JQyAgfAorCQkgKiB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorCQkgKiA8LS0tMTZieXRlcy0tLT48LS04Ynl0ZXMtLT48LS04Ynl0ZXMtLT4KKwkJICoKKwkJICoKKwkJICogU21lIGV4cGVjdHMgdGhlIDMyIGJ5dGVzIGtleSB0byBiZSBpbiB0aGUgYmVsb3cgb3JkZXIKKwkJICogfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKwkJICogfCAgIFRrMSAgICAgICAgfCBSWCBNSUMgICB8ICBUWCBNSUMgIHwKKwkJICogfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKwkJICogPC0tLTE2Ynl0ZXMtLS0+PC0tOGJ5dGVzLS0+PC0tOGJ5dGVzLS0+CisJCSAqLworCisJCS8qIENvcHkgdGhlIFRlbXBvcmFsIEtleSAxIChUSzEpICovCisJCWNkZl9tZW1fY29weShwS2V5LCBleHQtPmtleSwgMTYpOworCisJCS8qIENvcHkgdGhlIHJ4IG1pYyBmaXJzdCAqLworCQljZGZfbWVtX2NvcHkoJnBLZXlbMTZdLCAmZXh0LT5rZXlbMjRdLCA4KTsKKworCQkvKiBDb3B5IHRoZSB0eCBtaWMgKi8KKwkJY2RmX21lbV9jb3B5KCZwS2V5WzI0XSwgJmV4dC0+a2V5WzE2XSwgOCk7CisKKwl9CisJYnJlYWs7CisKKwljYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKwkJc2V0S2V5LmVuY1R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM7CisJCWJyZWFrOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorI2RlZmluZSBJV19FTkNPREVfQUxHX0tSSyA2CisJY2FzZSBJV19FTkNPREVfQUxHX0tSSzoKKwkJc2V0S2V5LmVuY1R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9LUks7CisJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKworCWRlZmF1bHQ6CisJCXNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwkJYnJlYWs7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAoIiVzOmNpcGhlcl9hbGc6JWQga2V5X2xlblslZF0gKnBFbmNyeXB0aW9uVHlwZSA6JWQiKSwKKwkJICBfX2Z1bmNfXywgKGludClleHQtPmFsZywgKGludClleHQtPmtleV9sZW4sIHNldEtleS5lbmNUeXBlKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJLyogVGhlIHN1cHBsaWNhbnQgbWF5IGF0dGVtcHQgdG8gc2V0IHRoZSBQVEsgb25jZQorCSAqIHByZS1hdXRoZW50aWNhdGlvbiBpcyBkb25lLiBTYXZlIHRoZSBrZXkgaW4gdGhlIFVNQUMgYW5kCisJICogaW5jbHVkZSBpdCBpbiB0aGUgQUREIEJTUyByZXF1ZXN0CisJICovCisJY2RmX3JldF9zdGF0dXMgPSBzbWVfZnRfdXBkYXRlX2tleShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJCSAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsICZzZXRLZXkpOworCWlmIChjZGZfcmV0X3N0YXR1cyA9PSBDREZfU1RBVFVTX0ZUX1BSRUFVVEhfS0VZX1NVQ0NFU1MpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJICAgICAgICIlczogVXBkYXRlIFByZUF1dGggS2V5IHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoY2RmX3JldF9zdGF0dXMgPT0gQ0RGX1NUQVRVU19GVF9QUkVBVVRIX0tFWV9GQUlMRUQpIHsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgICIlczogVXBkYXRlIFByZUF1dGggS2V5IGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKwlwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfU0VUVElOR19LRVk7CisKKwljZGZfcmV0X3N0YXR1cyA9IHNtZV9yb2FtX3NldF9rZXkoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCQkgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgJnNldEtleSwgJnJvYW1JZCk7CisKKwlpZiAoY2RmX3JldF9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiWyU0ZF0gc21lX3JvYW1fc2V0X2tleSByZXR1cm5lZCBFUlJPUiBzdGF0dXM9ICVkIiwKKwkJCSAgX19MSU5FX18sIGNkZl9yZXRfc3RhdHVzKTsKKworCQlwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfTk9ORTsKKwl9CisKKwlyZXR1cm4gY2RmX3JldF9zdGF0dXM7Cit9CisKKy8qKgorICogaXdfc2V0X2VuY29kZWV4dCgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfc2V0X2VuY29kZWV4dCgpCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQHdycXU6IHBvaW50ZXIgdG8gaXdyZXFfZGF0YQorICogQGV4dHJhOiBwb2ludGVyIHRvIGV4dHJhIGlvY3RsIHBheWxvYWQKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGl3X3NldF9lbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0X2VuY29kZWV4dChkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfc2V0X3JldHJ5KCkgLSBTSU9DU0lXUkVUUlkgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAod3JxdS0+cmV0cnkudmFsdWUgPCBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVRfU1RBTUlOIHx8CisJICAgIHdycXUtPnJldHJ5LnZhbHVlID4gV05JX0NGR19MT05HX1JFVFJZX0xJTUlUX1NUQU1BWCkgeworCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAoIkludmFsaWQgUmV0cnktTGltaXQ9JWQhISIpLCB3cnF1LT5yZXRyeS52YWx1ZSk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElNSVQpIHsKKworCQlpZiAoKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTE9ORykpIHsKKwkJCWlmIChzbWVfY2ZnX3NldF9pbnQgKGhIYWwsIFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVCwKKwkJCQkJCXdycXUtPnJldHJ5LnZhbHVlKSAhPQorCQkJCQlDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTAorCQkJCQkgICgiZmFpbGVkIHRvIHNldCBpbmkgcGFyYW1ldGVyLCBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVQiKSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0gZWxzZSBpZiAoKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfU0hPUlQpKSB7CisJCQlpZiAoc21lX2NmZ19zZXRfaW50IChoSGFsLCBXTklfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlULAorCQkJCQkJd3JxdS0+cmV0cnkudmFsdWUpICE9CisJCQkJCUNERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTAorCQkJCQkoImZhaWxlZCB0byBzZXQgaW5pIHBhcmFtZXRlciwgV05JX0NGR19MT05HX1JFVFJZX0xJTUlUIikpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgKCJTZXQgUmV0cnktTGltaXQ9JWQhISIpLCB3cnF1LT5yZXRyeS52YWx1ZSk7CisKKwlFWElUKCk7CisKKwlyZXR1cm4gMDsKKworfQorCisvKioKKyAqIGl3X3NldF9yZXRyeSgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfc2V0X3JldHJ5KCkKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGluZm86IHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE6IHBvaW50ZXIgdG8gZXh0cmEgaW9jdGwgcGF5bG9hZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaXdfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF9yZXRyeShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfZ2V0X3JldHJ5KCkgLSBTSU9DR0lXUkVUUlkgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCXVpbnQzMl90IHJldHJ5ID0gMDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKCh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX0xPTkcpKSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9MT05HOworCisJCWlmIChzbWVfY2ZnX2dldF9pbnQoaEhhbCwgV05JX0NGR19MT05HX1JFVFJZX0xJTUlULCAmcmV0cnkpICE9CisJCSAgICBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJICBGTAorCQkJCQkgICgiZmFpbGVkIHRvIGdldCBpbmkgcGFyYW1ldGVyLCBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVQiKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCXdycXUtPnJldHJ5LnZhbHVlID0gcmV0cnk7CisJfSBlbHNlIGlmICgod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9TSE9SVCkpIHsKKwkJd3JxdS0+cmV0cnkuZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX1NIT1JUOworCisJCWlmIChzbWVfY2ZnX2dldF9pbnQoaEhhbCwgV05JX0NGR19TSE9SVF9SRVRSWV9MSU1JVCwgJnJldHJ5KSAhPQorCQkgICAgQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJCSAgRkwKKwkJCQkJICAoImZhaWxlZCB0byBnZXQgaW5pIHBhcmFtZXRlciwgV05JX0NGR19MT05HX1JFVFJZX0xJTUlUIikpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQl3cnF1LT5yZXRyeS52YWx1ZSA9IHJldHJ5OworCX0gZWxzZSB7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLCAoIlJldHJ5LUxpbWl0PSVkISEiKSwKKwkJICByZXRyeSk7CisKKwlFWElUKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpd19nZXRfcmV0cnkoKSAtIFNTUiB3cmFwcGVyIGZvciBfX2l3X2dldF9yZXRyeSgpCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbworICogQHdycXU6IHBvaW50ZXIgdG8gaXdyZXFfZGF0YQorICogQGV4dHJhOiBwb2ludGVyIHRvIGV4dHJhIGlvY3RsIHBheWxvYWQKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGl3X2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19nZXRfcmV0cnkoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2l3X3NldF9tbG1lKCkgLSBTSU9DU0lXTUxNRSBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19zZXRfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCXN0cnVjdCBpd19tbG1lICptbG1lID0gKHN0cnVjdCBpd19tbG1lICopZXh0cmE7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHJlYXNvbl9jb2RlIGlzIHVudXNlZC4gQnkgZGVmYXVsdCBpdCBpcyBzZXQgdG8KKwkgKiBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVECisJICovCisJc3dpdGNoIChtbG1lLT5jbWQpIHsKKwljYXNlIElXX01MTUVfRElTQVNTT0M6CisJY2FzZSBJV19NTE1FX0RFQVVUSDoKKworCQlpZiAocEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSA9PQorCQkgICAgZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkKSB7CisJCQllQ3NyUm9hbURpc2Nvbm5lY3RSZWFzb24gcmVhc29uID0KKwkJCQllQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEOworCisJCQlpZiAobWxtZS0+cmVhc29uX2NvZGUgPT0gSEREX1JFQVNPTl9NSUNIQUVMX01JQ19GQUlMVVJFKQorCQkJCXJlYXNvbiA9IGVDU1JfRElTQ09OTkVDVF9SRUFTT05fTUlDX0VSUk9SOworCisJCQlJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPmRpc2Nvbm5lY3RfY29tcF92YXIpOworCQkJc3RhdHVzID0KKwkJCQlzbWVfcm9hbV9kaXNjb25uZWN0KFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkJCSAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCByZWFzb24pOworCisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQkJCXVuc2lnbmVkIGxvbmcgcmM7CisJCQkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnBBZGFwdGVyLT4KKwkJCQkJCQkJIGRpc2Nvbm5lY3RfY29tcF92YXIsCisJCQkJCQkJCSBtc2Vjc190b19qaWZmaWVzCisJCQkJCQkJCQkgKFdMQU5fV0FJVF9USU1FX0RJU0NPTk5FQ1QpKTsKKwkJCQlpZiAoIXJjKQorCQkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICAgICAgRkwKKwkJCQkJCSAgICAgICAoImZhaWxlZCB3YWl0IG9uIGRpc2Nvbm5lY3RfY29tcF92YXIiKSk7CisJCQl9IGVsc2UKKwkJCQloZGRMb2coTE9HRSwKKwkJCQkgICAgICAgIiVzICVkIENvbW1hbmQgRGlzYXNzb2NpYXRlL0RlYXV0aGVudGljYXRlIDogY3NyX3JvYW1fZGlzY29ubmVjdCBmYWlsdXJlIHJldHVybmVkICVkIiwKKwkJCQkgICAgICAgX19mdW5jX18sIChpbnQpbWxtZS0+Y21kLCAoaW50KXN0YXR1cyk7CisKKwkJCS8qIFJlc2V0dGluZyBhdXRoS2V5TWdtdCAqLworCQkJKFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcikpLT5hdXRoS2V5TWdtdCA9CisJCQkJMDsKKworCQkJaGRkTG9nKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCQkJd2xhbl9oZGRfbmV0aWZfcXVldWVfY29udHJvbChwQWRhcHRlciwKKwkJCQkJV0xBTl9ORVRJRl9UWF9ESVNBQkxFX05fQ0FSUklFUiwKKwkJCQkJV0xBTl9DT05UUk9MX1BBVEgpOworCisJCX0gZWxzZSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICAiJXMgJWQgQ29tbWFuZCBEaXNhc3NvY2lhdGUvRGVhdXRoZW50aWNhdGUgY2FsbGVkIGJ1dCBzdGF0aW9uIGlzIG5vdCBpbiBhc3NvY2lhdGVkIHN0YXRlIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgKGludCltbG1lLT5jbWQpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWhkZExvZyhMT0dFLAorCQkgICAgICAgIiVzICVkIENvbW1hbmQgc2hvdWxkIGJlIERpc2Fzc29jaWF0ZS9EZWF1dGhlbnRpY2F0ZSIsCisJCSAgICAgICBfX2Z1bmNfXywgKGludCltbG1lLT5jbWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IC8qIGVuZCBvZiBzd2l0Y2ggKi8KKworCUVYSVQoKTsKKworCXJldHVybiBzdGF0dXM7CisKK30KKworLyoqCisgKiBpd19zZXRfbWxtZSgpIC0gU1NSIHdyYXBwZXIgZm9yIF9faXdfc2V0X21sbWUoKQorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAaW5mbzogcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8KKyAqIEB3cnF1OiBwb2ludGVyIHRvIGl3cmVxX2RhdGEKKyAqIEBleHRyYTogcG9pbnRlciB0byBleHRyYSBpb2N0bCBwYXlsb2FkCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpd19zZXRfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfbWxtZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdsYW5faGRkX3VwZGF0ZV9waHltb2RlKCkgLSBoYW5kbGUgY2hhbmdlIGluIFBIWSBtb2RlCisgKiBAbmV0OiBkZXZpY2UgdXBvbiB3aGljaCBQSFkgbW9kZSBjaGFuZ2Ugd2FzIHJlY2VpdmVkCisgKiBAaGFsOiB1bWFjIGhhbmRsZSBmb3IgdGhlIGRyaXZlcgorICogQG5ld19waHltb2RlOiBuZXcgUEhZIG1vZGUgZm9yIHRoZSBkZXZpY2UKKyAqIEBwaGRkY3R4OiBwb2ludGVyIHRvIHRoZSBIREQgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGRldmljZSBpcyBzZXQgdG8gYSBuZXcgUEhZIG1vZGUuCisgKiBJdCB0YWtlcyBhIGhvbGlzdGljIGxvb2sgYXQgdGhlIGRlc2lyZWQgUEhZIG1vZGUgYWxvbmcgd2l0aCB0aGUKKyAqIGNvbmZpZ3VyZWQgY2FwYWJpbGl0aWVzIG9mIHRoZSBkcml2ZXIgYW5kIHRoZSByZXBvcnRlZCBjYXBhYmlsaXRpZXMKKyAqIG9mIHRoZSBoYXJkd2FyZSBpbiBvcmRlciB0byBjb3JyZWN0bHkgY29uZmlndXJlIGFsbCBQSFktcmVsYXRlZAorICogcGFyYW1ldGVycy4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gdmFsdWUgb24gZXJyb3IKKyAqLworaW50IHdsYW5faGRkX3VwZGF0ZV9waHltb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHRIYWxIYW5kbGUgaGFsLAorCQkJICAgIGludCBuZXdfcGh5bW9kZSwgaGRkX2NvbnRleHRfdCAqcGhkZGN0eCkKK3sKKyNpZmRlZiBRQ0FfSFRfMjA0MF9DT0VYCisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIobmV0KTsKKwlDREZfU1RBVFVTIGhhbFN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworI2VuZGlmCisJYm9vbCBiYW5kXzI0ID0gZmFsc2UsIGJhbmRfNWcgPSBmYWxzZTsKKwlib29sIGNoX2JvbmQyNCA9IGZhbHNlLCBjaF9ib25kNWcgPSBmYWxzZTsKKwl0U21lQ29uZmlnUGFyYW1zIHNtZWNvbmZpZzsKKwl1aW50MzJfdCBjaHdpZHRoID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJdWludDMyX3Qgdmh0Y2hhbndpZHRoOworI2VuZGlmCisJZUNzclBoeU1vZGUgcGh5bW9kZSA9IC1FSU8sIG9sZF9waHltb2RlOworCWVIZGREb3QxMU1vZGUgaGRkX2RvdDExbW9kZSA9IHBoZGRjdHgtPmNvbmZpZy0+ZG90MTFNb2RlOworCWVDc3JCYW5kIGN1cnJfYmFuZCA9IGVDU1JfQkFORF9BTEw7CisKKwlvbGRfcGh5bW9kZSA9IHNtZV9nZXRfcGh5X21vZGUoaGFsKTsKKworCWlmIChXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEUgIT0KKwkgICAgc21lX2dldF9jYl9waHlfc3RhdGVfZnJvbV9jYl9pbmlfdmFsdWUocGhkZGN0eC0+Y29uZmlnLT4KKwkJCQkJCSAgIG5DaGFubmVsQm9uZGluZ01vZGUyNEdIeikpCisJCWNoX2JvbmQyNCA9IHRydWU7CisKKwlpZiAoV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFICE9CisJICAgIHNtZV9nZXRfY2JfcGh5X3N0YXRlX2Zyb21fY2JfaW5pX3ZhbHVlKHBoZGRjdHgtPmNvbmZpZy0+CisJCQkJCQkgICBuQ2hhbm5lbEJvbmRpbmdNb2RlNUdIeikpCisJCWNoX2JvbmQ1ZyA9IHRydWU7CisKKwlpZiAocGhkZGN0eC0+Y29uZmlnLT5uQmFuZENhcGFiaWxpdHkgPT0gZUNTUl9CQU5EX0FMTCkgeworCQliYW5kXzI0ID0gYmFuZF81ZyA9IHRydWU7CisJfSBlbHNlIGlmIChwaGRkY3R4LT5jb25maWctPm5CYW5kQ2FwYWJpbGl0eSA9PSBlQ1NSX0JBTkRfMjQpIHsKKwkJYmFuZF8yNCA9IHRydWU7CisJfSBlbHNlIGlmIChwaGRkY3R4LT5jb25maWctPm5CYW5kQ2FwYWJpbGl0eSA9PSBlQ1NSX0JBTkRfNUcpIHsKKwkJYmFuZF81ZyA9IHRydWU7CisJfQorCisJdmh0Y2hhbndpZHRoID0gcGhkZGN0eC0+Y29uZmlnLT52aHRDaGFubmVsV2lkdGg7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwgKCJjaF9ib25kMjQ9JWQgIgorCQkiY2hfYm9uZDVnPSVkIGJhbmRfMjQ9JWQgYmFuZF81Zz0lZCBWSFRfY2hfd2lkdGg9JXUiKSwKKwkJY2hfYm9uZDI0LCBjaF9ib25kNWcsIGJhbmRfMjQsIGJhbmRfNWcsIHZodGNoYW53aWR0aCk7CisKKwlzd2l0Y2ggKG5ld19waHltb2RlKSB7CisJY2FzZSBJRUVFODAyMTFfTU9ERV9BVVRPOgorCQlzbWVfc2V0X3BoeV9tb2RlKGhhbCwgZUNTUl9ET1QxMV9NT0RFX0FVVE8pOworCQlpZiAoaGRkX3NldF9iYW5kKG5ldCwgV0xBTl9IRERfVUlfQkFORF9BVVRPKSA9PSAwKSB7CisJCQlwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFX0FVVE87CisJCQloZGRfZG90MTFtb2RlID0gZUhERF9ET1QxMV9NT0RFX0FVVE87CisJCQljaHdpZHRoID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9FTkFCTEU7CisJCQljdXJyX2JhbmQgPSBlQ1NSX0JBTkRfQUxMOworCQkJdmh0Y2hhbndpZHRoID0gZUhUX0NIQU5ORUxfV0lEVEhfODBNSFo7CisJCX0gZWxzZSB7CisJCQlzbWVfc2V0X3BoeV9tb2RlKGhhbCwgb2xkX3BoeW1vZGUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfTU9ERV8xMUE6CisJCXNtZV9zZXRfcGh5X21vZGUoaGFsLCBlQ1NSX0RPVDExX01PREVfMTFhKTsKKwkJaWYgKChoZGRfc2V0X2JhbmQobmV0LCBXTEFOX0hERF9VSV9CQU5EXzVfR0haKSA9PSAwKSkgeworCQkJcGh5bW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWE7CisJCQloZGRfZG90MTFtb2RlID0gZUhERF9ET1QxMV9NT0RFXzExYTsKKwkJCWNod2lkdGggPSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisJCQljdXJyX2JhbmQgPSBlQ1NSX0JBTkRfNUc7CisJCX0gZWxzZSB7CisJCQlzbWVfc2V0X3BoeV9tb2RlKGhhbCwgb2xkX3BoeW1vZGUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfTU9ERV8xMUI6CisJCXNtZV9zZXRfcGh5X21vZGUoaGFsLCBlQ1NSX0RPVDExX01PREVfMTFiKTsKKwkJaWYgKChoZGRfc2V0X2JhbmQobmV0LCBXTEFOX0hERF9VSV9CQU5EXzJfNF9HSFopID09IDApKSB7CisJCQlwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYjsKKwkJCWhkZF9kb3QxMW1vZGUgPSBlSEREX0RPVDExX01PREVfMTFiOworCQkJY2h3aWR0aCA9IFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRTsKKwkJCWN1cnJfYmFuZCA9IGVDU1JfQkFORF8yNDsKKwkJfSBlbHNlIHsKKwkJCXNtZV9zZXRfcGh5X21vZGUoaGFsLCBvbGRfcGh5bW9kZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9NT0RFXzExRzoKKwkJc21lX3NldF9waHlfbW9kZShoYWwsIGVDU1JfRE9UMTFfTU9ERV8xMWcpOworCQlpZiAoKGhkZF9zZXRfYmFuZChuZXQsIFdMQU5fSEREX1VJX0JBTkRfMl80X0dIWikgPT0gMCkpIHsKKwkJCXBoeW1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFnOworCQkJaGRkX2RvdDExbW9kZSA9IGVIRERfRE9UMTFfTU9ERV8xMWc7CisJCQljaHdpZHRoID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworCQkJY3Vycl9iYW5kID0gZUNTUl9CQU5EXzI0OworCQl9IGVsc2UgeworCQkJc21lX3NldF9waHlfbW9kZShoYWwsIG9sZF9waHltb2RlKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWJyZWFrOworCS8qIFVNQUMgZG9lc250IGhhdmUgb3B0aW9uIHRvIHNldCBNT0RFXzExTkEvTU9ERV8xMU5HIGFzIHBoeW1vZGUKKwkgKiBzbyBzZXR0aW5nIHBoeW1vZGUgYXMgZUNTUl9ET1QxMV9NT0RFXzExbiBhbmQgdXBkYXRpbmcgdGhlIGJhbmQKKwkgKiBhbmQgY2hhbm5lbCBib25kaW5nIGluIGNvbmZpZ3VyYXRpb24gdG8gcmVmbGVjdCBNT0RFXzExTkEvTU9ERV8xMU5HCisJICovCisJY2FzZSBJRUVFODAyMTFfTU9ERV8xMU5BX0hUMjA6CisJCXNtZV9zZXRfcGh5X21vZGUoaGFsLCBlQ1NSX0RPVDExX01PREVfMTFuKTsKKwkJaWYgKChoZGRfc2V0X2JhbmQobmV0LCBXTEFOX0hERF9VSV9CQU5EXzVfR0haKSA9PSAwKSkgeworCQkJcGh5bW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMW47CisJCQloZGRfZG90MTFtb2RlID0gZUhERF9ET1QxMV9NT0RFXzExbjsKKwkJCWNod2lkdGggPSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisJCQljdXJyX2JhbmQgPSBlQ1NSX0JBTkRfNUc7CisJCX0gZWxzZSB7CisJCQlzbWVfc2V0X3BoeV9tb2RlKGhhbCwgb2xkX3BoeW1vZGUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfTU9ERV8xMU5BX0hUNDA6CisJCXNtZV9zZXRfcGh5X21vZGUoaGFsLCBlQ1NSX0RPVDExX01PREVfMTFuKTsKKwkJaWYgKChoZGRfc2V0X2JhbmQobmV0LCBXTEFOX0hERF9VSV9CQU5EXzVfR0haKSA9PSAwKSkgeworCQkJcGh5bW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMW47CisJCQloZGRfZG90MTFtb2RlID0gZUhERF9ET1QxMV9NT0RFXzExbjsKKwkJCWNod2lkdGggPSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0VOQUJMRTsKKwkJCWN1cnJfYmFuZCA9IGVDU1JfQkFORF81RzsKKwkJfSBlbHNlIHsKKwkJCXNtZV9zZXRfcGh5X21vZGUoaGFsLCBvbGRfcGh5bW9kZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9NT0RFXzExTkdfSFQyMDoKKwkJc21lX3NldF9waHlfbW9kZShoYWwsIGVDU1JfRE9UMTFfTU9ERV8xMW4pOworCQlpZiAoKGhkZF9zZXRfYmFuZChuZXQsIFdMQU5fSEREX1VJX0JBTkRfMl80X0dIWikgPT0gMCkpIHsKKwkJCXBoeW1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFuOworCQkJaGRkX2RvdDExbW9kZSA9IGVIRERfRE9UMTFfTU9ERV8xMW47CisJCQljaHdpZHRoID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworCQkJY3Vycl9iYW5kID0gZUNTUl9CQU5EXzI0OworCQl9IGVsc2UgeworCQkJc21lX3NldF9waHlfbW9kZShoYWwsIG9sZF9waHltb2RlKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX01PREVfMTFOR19IVDQwOgorCQlzbWVfc2V0X3BoeV9tb2RlKGhhbCwgZUNTUl9ET1QxMV9NT0RFXzExbik7CisJCWlmICgoaGRkX3NldF9iYW5kKG5ldCwgV0xBTl9IRERfVUlfQkFORF8yXzRfR0haKSA9PSAwKSkgeworCQkJcGh5bW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMW47CisJCQloZGRfZG90MTFtb2RlID0gZUhERF9ET1QxMV9NT0RFXzExbjsKKwkJCWNod2lkdGggPSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0VOQUJMRTsKKwkJCWN1cnJfYmFuZCA9IGVDU1JfQkFORF8yNDsKKwkJfSBlbHNlIHsKKwkJCXNtZV9zZXRfcGh5X21vZGUoaGFsLCBvbGRfcGh5bW9kZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWNhc2UgSUVFRTgwMjExX01PREVfMTFBQ19WSFQyMDoKKwljYXNlIElFRUU4MDIxMV9NT0RFXzExQUNfVkhUNDA6CisJY2FzZSBJRUVFODAyMTFfTU9ERV8xMUFDX1ZIVDgwOgorCQlzbWVfc2V0X3BoeV9tb2RlKGhhbCwgZUNTUl9ET1QxMV9NT0RFXzExYWMpOworCQlpZiAoKGhkZF9zZXRfYmFuZChuZXQsIFdMQU5fSEREX1VJX0JBTkRfNV9HSFopID09IDApKSB7CisJCQlwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYWM7CisJCQloZGRfZG90MTFtb2RlID0gZUhERF9ET1QxMV9NT0RFXzExYWM7CisJCQljaHdpZHRoID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9FTkFCTEU7CisJCQljdXJyX2JhbmQgPSBlQ1NSX0JBTkRfNUc7CisJCX0gZWxzZSB7CisJCQlzbWVfc2V0X3BoeV9tb2RlKGhhbCwgb2xkX3BoeW1vZGUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIElFRUU4MDIxMV9NT0RFXzJHX0FVVE86CisJCXNtZV9zZXRfcGh5X21vZGUoaGFsLCBlQ1NSX0RPVDExX01PREVfQVVUTyk7CisJCWlmICgoaGRkX3NldF9iYW5kKG5ldCwgV0xBTl9IRERfVUlfQkFORF8yXzRfR0haKSA9PSAwKSkgeworCQkJcGh5bW9kZSA9IGVDU1JfRE9UMTFfTU9ERV9BVVRPOworCQkJaGRkX2RvdDExbW9kZSA9IGVIRERfRE9UMTFfTU9ERV9BVVRPOworCQkJY2h3aWR0aCA9IFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRU5BQkxFOworCQkJY3Vycl9iYW5kID0gZUNTUl9CQU5EXzI0OworCQl9IGVsc2UgeworCQkJc21lX3NldF9waHlfbW9kZShoYWwsIG9sZF9waHltb2RlKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX01PREVfNUdfQVVUTzoKKwkJc21lX3NldF9waHlfbW9kZShoYWwsIGVDU1JfRE9UMTFfTU9ERV9BVVRPKTsKKwkJaWYgKChoZGRfc2V0X2JhbmQobmV0LCBXTEFOX0hERF9VSV9CQU5EXzVfR0haKSA9PSAwKSkgeworCQkJcGh5bW9kZSA9IGVDU1JfRE9UMTFfTU9ERV9BVVRPOworCQkJaGRkX2RvdDExbW9kZSA9IGVIRERfRE9UMTFfTU9ERV9BVVRPOworCQkJY2h3aWR0aCA9IFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRU5BQkxFOworCQkJdmh0Y2hhbndpZHRoID0gZUhUX0NIQU5ORUxfV0lEVEhfODBNSFo7CisJCQljdXJyX2JhbmQgPSBlQ1NSX0JBTkRfNUc7CisJCX0gZWxzZSB7CisJCQlzbWVfc2V0X3BoeV9tb2RlKGhhbCwgb2xkX3BoeW1vZGUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfTU9ERV8xMUFHTjoKKwkJc21lX3NldF9waHlfbW9kZShoYWwsIGVDU1JfRE9UMTFfTU9ERV8xMW4pOworCQlpZiAoKGhkZF9zZXRfYmFuZChuZXQsIFdMQU5fSEREX1VJX0JBTkRfQVVUTykgPT0gMCkpIHsKKwkJCXBoeW1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFuOworCQkJaGRkX2RvdDExbW9kZSA9IGVIRERfRE9UMTFfTU9ERV8xMW47CisJCQljaHdpZHRoID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9FTkFCTEU7CisJCQljdXJyX2JhbmQgPSBlQ1NSX0JBTkRfQUxMOworCQl9IGVsc2UgeworCQkJc21lX3NldF9waHlfbW9kZShoYWwsIG9sZF9waHltb2RlKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlPOworCX0KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJc3dpdGNoIChuZXdfcGh5bW9kZSkgeworCWNhc2UgSUVFRTgwMjExX01PREVfMTFBQ19WSFQyMDoKKwkJY2h3aWR0aCA9IFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRTsKKwkJdmh0Y2hhbndpZHRoID0gZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFo7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX01PREVfMTFBQ19WSFQ0MDoKKwkJdmh0Y2hhbndpZHRoID0gZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFo7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX01PREVfMTFBQ19WSFQ4MDoKKwkJdmh0Y2hhbndpZHRoID0gZUhUX0NIQU5ORUxfV0lEVEhfODBNSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZodGNoYW53aWR0aCA9IHBoZGRjdHgtPmNvbmZpZy0+dmh0Q2hhbm5lbFdpZHRoOworCQlicmVhazsKKwl9CisjZW5kaWYKKworCWlmIChwaHltb2RlICE9IC1FSU8pIHsKKwkJc21lX2dldF9jb25maWdfcGFyYW0oaGFsLCAmc21lY29uZmlnKTsKKwkJc21lY29uZmlnLmNzckNvbmZpZy5waHlNb2RlID0gcGh5bW9kZTsKKyNpZmRlZiBRQ0FfSFRfMjA0MF9DT0VYCisJCWlmIChwaHltb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMW4gJiYKKwkJICAgIGNod2lkdGggPT0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFKSB7CisJCQlzbWVjb25maWcuY3NyQ29uZmlnLm9ic3NFbmFibGVkID0gZmFsc2U7CisJCQloYWxTdGF0dXMgPSBzbWVfc2V0X2h0MjA0MF9tb2RlKGhhbCwKKwkJCQkJCQlwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJCWVIVF9DSEFOX0hUMjAsIGZhbHNlKTsKKwkJCWlmIChoYWxTdGF0dXMgPT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkUpIHsKKwkJCQloZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBkaXNhYmxlIE9CU1MiKSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0gZWxzZSBpZiAocGh5bW9kZSA9PSBlQ1NSX0RPVDExX01PREVfMTFuICYmCisJCQkgICBjaHdpZHRoID09IFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRU5BQkxFKSB7CisJCQlzbWVjb25maWcuY3NyQ29uZmlnLm9ic3NFbmFibGVkID0gdHJ1ZTsKKwkJCWhhbFN0YXR1cyA9IHNtZV9zZXRfaHQyMDQwX21vZGUoaGFsLAorCQkJCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkJZUhUX0NIQU5fSFQyMCwgdHJ1ZSk7CisJCQlpZiAoaGFsU3RhdHVzID09IENERl9TVEFUVVNfRV9GQUlMVVJFKSB7CisJCQkJaGRkTG9nKExPR0UsIEZMKCJGYWlsZWQgdG8gZW5hYmxlIE9CU1MiKSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKyNlbmRpZgorCQlzbWVjb25maWcuY3NyQ29uZmlnLmVCYW5kID0gY3Vycl9iYW5kOworCQlzbWVjb25maWcuY3NyQ29uZmlnLmJhbmRDYXBhYmlsaXR5ID0gY3Vycl9iYW5kOworCQlpZiAoY3Vycl9iYW5kID09IGVDU1JfQkFORF8yNCkKKwkJCXNtZWNvbmZpZy5jc3JDb25maWcuSXMxMWhTdXBwb3J0RW5hYmxlZCA9IDA7CisJCWVsc2UKKwkJCXNtZWNvbmZpZy5jc3JDb25maWcuSXMxMWhTdXBwb3J0RW5hYmxlZCA9CisJCQkJcGhkZGN0eC0+Y29uZmlnLT5JczExaFN1cHBvcnRFbmFibGVkOworCQlpZiAoY3Vycl9iYW5kID09IGVDU1JfQkFORF8yNCkKKwkJCXNtZWNvbmZpZy5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPSBjaHdpZHRoOworCQllbHNlIGlmIChjdXJyX2JhbmQgPT0gZUNTUl9CQU5EXzI0KQorCQkJc21lY29uZmlnLmNzckNvbmZpZy5jaGFubmVsQm9uZGluZ01vZGU1R0h6ID0gY2h3aWR0aDsKKwkJZWxzZSB7CisJCQlzbWVjb25maWcuY3NyQ29uZmlnLmNoYW5uZWxCb25kaW5nTW9kZTI0R0h6ID0gY2h3aWR0aDsKKwkJCXNtZWNvbmZpZy5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlNUdIeiA9IGNod2lkdGg7CisJCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQlzbWVjb25maWcuY3NyQ29uZmlnLm5WaHRDaGFubmVsV2lkdGggPSB2aHRjaGFud2lkdGg7CisjZW5kaWYKKwkJc21lX3VwZGF0ZV9jb25maWcoaGFsLCAmc21lY29uZmlnKTsKKworCQlwaGRkY3R4LT5jb25maWctPmRvdDExTW9kZSA9IGhkZF9kb3QxMW1vZGU7CisJCXBoZGRjdHgtPmNvbmZpZy0+bkJhbmRDYXBhYmlsaXR5ID0gY3Vycl9iYW5kOworCQlwaGRkY3R4LT5jb25maWctPm5DaGFubmVsQm9uZGluZ01vZGUyNEdIeiA9CisJCQlzbWVjb25maWcuY3NyQ29uZmlnLmNoYW5uZWxCb25kaW5nTW9kZTI0R0h6OworCQlwaGRkY3R4LT5jb25maWctPm5DaGFubmVsQm9uZGluZ01vZGU1R0h6ID0KKwkJCXNtZWNvbmZpZy5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKKwkJcGhkZGN0eC0+Y29uZmlnLT52aHRDaGFubmVsV2lkdGggPSB2aHRjaGFud2lkdGg7CisJCWlmIChoZGRfdXBkYXRlX2NvbmZpZ19kYXQocGhkZGN0eCkgPT0gZmFsc2UpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBjb3VsZCBub3QgdXBkYXRlIGNvbmZpZ19kYXQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAocGhkZGN0eC0+Y29uZmlnLT5uQ2hhbm5lbEJvbmRpbmdNb2RlNUdIeikKKwkJCXBoZGRjdHgtPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS0+aHRfY2FwLmNhcAorCQkJCXw9IElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOworCQllbHNlCisJCQlwaGRkY3R4LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0tPmh0X2NhcC5jYXAKKwkJCQkmPSB+SUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDA7CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSJOZXdfUGh5bW9kZT0gJWQgY2hfYm9uZGluZz0lZCBiYW5kPSVkIFZIVF9jaF93aWR0aD0ldSIsCisJCQlwaHltb2RlLCBjaHdpZHRoLCBjdXJyX2JhbmQsIHZodGNoYW53aWR0aCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRkX2dldF90ZW1wZXJhdHVyZV9jYigpIC0gIkdldCBUZW1wZXJhdHVyZSIgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEB0ZW1wZXJhdHVyZTogbWVhc3VyZWQgdGVtcGVyYXR1cmUKKyAqIEBwQ29udGV4dDogY2FsbGJhY2sgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHNtZV9nZXRfdGVtcGVyYXR1cmUoKSBhcyB0aGUgY2FsbGJhY2sKKyAqIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQgaXMKKyAqIGF2YWlsYWJsZS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX2dldF90ZW1wZXJhdHVyZV9jYihpbnQgdGVtcGVyYXR1cmUsIHZvaWQgKnBDb250ZXh0KQoreworCXN0cnVjdCBzdGF0c0NvbnRleHQgKnBUZW1wQ29udGV4dDsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlcjsKKwlFTlRFUigpOworCWlmIChOVUxMID09IHBDb250ZXh0KSB7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMKCJwQ29udGV4dCBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCXBUZW1wQ29udGV4dCA9IHBDb250ZXh0OworCXBBZGFwdGVyID0gcFRlbXBDb250ZXh0LT5wQWRhcHRlcjsKKwlzcGluX2xvY2soJmhkZF9jb250ZXh0X2xvY2spOworCWlmICgoTlVMTCA9PSBwQWRhcHRlcikgfHwgKFRFTVBfQ09OVEVYVF9NQUdJQyAhPSBwVGVtcENvbnRleHQtPm1hZ2ljKSkgeworCQlzcGluX3VubG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJICAgICAgIEZMKCJJbnZhbGlkIGNvbnRleHQsIHBBZGFwdGVyIFslcF0gbWFnaWMgWyUwOHhdIiksCisJCSAgICAgICBwQWRhcHRlciwgcFRlbXBDb250ZXh0LT5tYWdpYyk7CisJCXJldHVybjsKKwl9CisJaWYgKHRlbXBlcmF0dXJlICE9IDApIHsKKwkJcEFkYXB0ZXItPnRlbXBlcmF0dXJlID0gdGVtcGVyYXR1cmU7CisJfQorCWNvbXBsZXRlKCZwVGVtcENvbnRleHQtPmNvbXBsZXRpb24pOworCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwlFWElUKCk7Cit9CisKKy8qKgorICogd2xhbl9oZGRfZ2V0X3RlbXBlcmF0dXJlKCkgLSBnZXQgY3VycmVudCBkZXZpY2UgdGVtcGVyYXR1cmUKKyAqIEBwQWRhcHRlcjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIG1hZGUKKyAqIEB0ZW1wZXJhdHVyZTogcG9pbnRlciB0byB3aGVyZSB0aGUgdGVtcGVyYXR1cmUgaXMgdG8gYmUgcmV0dXJuZWQKKyAqCisgKiBSZXR1cm46IDAgaWYgYSB0ZW1wZXJhdHVyZSB2YWx1ZSAoZWl0aGVyIGN1cnJlbnQgb3IgY2FjaGVkKSB3YXMKKyAqIHJldHVybmVkLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyBpcyByZXR1cm5lZC4KKyAqCisgKi8KK2ludCB3bGFuX2hkZF9nZXRfdGVtcGVyYXR1cmUoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGludCAqdGVtcGVyYXR1cmUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJc3RydWN0IHN0YXRzQ29udGV4dCB0ZW1wQ29udGV4dDsKKwl1bnNpZ25lZCBsb25nIHJjOworCisJRU5URVIoKTsKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgicEFkYXB0ZXIgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJaW5pdF9jb21wbGV0aW9uKCZ0ZW1wQ29udGV4dC5jb21wbGV0aW9uKTsKKwl0ZW1wQ29udGV4dC5wQWRhcHRlciA9IHBBZGFwdGVyOworCXRlbXBDb250ZXh0Lm1hZ2ljID0gVEVNUF9DT05URVhUX01BR0lDOworCXN0YXR1cyA9IHNtZV9nZXRfdGVtcGVyYXR1cmUoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCSAgICAgJnRlbXBDb250ZXh0LCBoZGRfZ2V0X3RlbXBlcmF0dXJlX2NiKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgRkwoIlVuYWJsZSB0byByZXRyaWV2ZSB0ZW1wZXJhdHVyZSIpKTsKKwl9IGVsc2UgeworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdGVtcENvbnRleHQuY29tcGxldGlvbiwKKwkJCQkJCSBtc2Vjc190b19qaWZmaWVzCisJCQkJCQkJIChXTEFOX1dBSVRfVElNRV9TVEFUUykpOworCQlpZiAoIXJjKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiU01FIHRpbWVkIG91dCB3aGlsZSByZXRyaWV2aW5nIHRlbXBlcmF0dXJlIikpOworCQl9CisJfQorCXNwaW5fbG9jaygmaGRkX2NvbnRleHRfbG9jayk7CisJdGVtcENvbnRleHQubWFnaWMgPSAwOworCXNwaW5fdW5sb2NrKCZoZGRfY29udGV4dF9sb2NrKTsKKwkqdGVtcGVyYXR1cmUgPSBwQWRhcHRlci0+dGVtcGVyYXR1cmU7CisJRVhJVCgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGl3X3NldGludF9nZXRub25lKCkgLSBHZW5lcmljICJzZXQgaW50ZWdlciIgcHJpdmF0ZSBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19zZXRpbnRfZ2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwloZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCXRTbWVDb25maWdQYXJhbXMgc21lQ29uZmlnOworCWludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisJaW50IHN1Yl9jbWQgPSB2YWx1ZVswXTsKKwlpbnQgc2V0X3ZhbHVlID0gdmFsdWVbMV07CisJaW50IHJldDsKKwlpbnQgZW5hYmxlX3BibSwgZW5hYmxlX21wOworCisJSU5JVF9DT01QTEVUSU9OKHBXZXh0U3RhdGUtPmNvbXBsZXRpb25fdmFyKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAoc3ViX2NtZCkgeworCWNhc2UgV0VfU0VUXzExRF9TVEFURToKKwl7CisJCWlmICgoRU5BQkxFXzExRCA9PSBzZXRfdmFsdWUpCisJCSAgICB8fCAoRElTQUJMRV8xMUQgPT0gc2V0X3ZhbHVlKSkgeworCisJCQltZW1zZXQoJnNtZUNvbmZpZywgMHgwMCwgc2l6ZW9mKHNtZUNvbmZpZykpOworCQkJc21lX2dldF9jb25maWdfcGFyYW0oaEhhbCwgJnNtZUNvbmZpZyk7CisJCQlzbWVDb25maWcuY3NyQ29uZmlnLklzMTFkU3VwcG9ydEVuYWJsZWQgPQorCQkJCShib29sKSBzZXRfdmFsdWU7CisKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgKCIxMUQgc3RhdGU9JWQhISIpLAorCQkJCSAgc21lQ29uZmlnLmNzckNvbmZpZy4KKwkJCQkgIElzMTFkU3VwcG9ydEVuYWJsZWQpOworCisJCQlzbWVfdXBkYXRlX2NvbmZpZyhoSGFsLCAmc21lQ29uZmlnKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfV09XTDoKKwl7CisJCXN3aXRjaCAoc2V0X3ZhbHVlKSB7CisJCWNhc2UgMHgwMDoKKwkJCWhkZF9leGl0X3dvd2wocEFkYXB0ZXIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJY2FzZSAweDAyOgorCQljYXNlIDB4MDM6CisJCQllbmFibGVfbXAgPSAoc2V0X3ZhbHVlICYgMHgwMSkgPyAxIDogMDsKKwkJCWVuYWJsZV9wYm0gPSAoc2V0X3ZhbHVlICYgMHgwMikgPyAxIDogMDsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICJtYWdpYyBwYWNrZXQgPyA9ICVzIHBhdHRlcm4gYnl0ZSBtYXRjaGluZyA/ID0gJXMiLAorCQkJICAgICAgIChlbmFibGVfbXAgPyAiWUVTIiA6ICJOTyIpLAorCQkJICAgICAgIChlbmFibGVfcGJtID8gIllFUyIgOiAiTk8iKSk7CisJCQloZGRfZW50ZXJfd293bChwQWRhcHRlciwgZW5hYmxlX21wLCBlbmFibGVfcGJtKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaGRkTG9nKExPR0UsICJJbnZhbGlkIGFyZyAgJWQgaW4gV0VfV09XTCBJT0NUTCIsCisJCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCX0KKwljYXNlIFdFX1NFVF9QT1dFUjoKKwl7CisJCXN3aXRjaCAoc2V0X3ZhbHVlKSB7CisJCWNhc2UgMToKKwkJCS8qIEVuYWJsZSBQb3dlclNhdmUgKi8KKwkJCXNtZV9wc19lbmFibGVfZGlzYWJsZShoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQlTTUVfUFNfRU5BQkxFKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkvKiBEaXNhYmxlIFBvd2VyU2F2ZSAqLworCQkJc21lX3BzX2VuYWJsZV9kaXNhYmxlKGhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCVNNRV9QU19ESVNBQkxFKTsKKwkJCWJyZWFrOworCQljYXNlIDM6ICAgICAgICAgIC8qIEVuYWJsZSBVQVNQRCAqLworCQkJc21lX3BzX3VhcHNkX2VuYWJsZShoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6ICAgICAgICAgIC8qIERpc2FibGUgVUFTUEQgKi8KKwkJCXNtZV9wc191YXBzZF9kaXNhYmxlKGhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZGRMb2coTE9HRSwKKwkJCQkiSW52YWxpZCBhcmcgICVkIGluIFdFX1NFVF9QT1dFUiBJT0NUTCIsCisJCQkJc2V0X3ZhbHVlKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9NQVhfQVNTT0M6CisJeworCQlpZiAoKFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQU1JTiA+IHNldF92YWx1ZSkgfHwKKwkJICAgIChXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVF9TVEFNQVggPCBzZXRfdmFsdWUpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9IGVsc2UgaWYgKHNtZV9jZmdfc2V0X2ludChoSGFsLCBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVCwKKwkJCQkJc2V0X3ZhbHVlKQorCQkJICAgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsIEZMCisJCQkJICAoImZhaWxlZCB0byBzZXQgaW5pIHBhcmFtZXRlciwgV05JX0NGR19BU1NPQ19TVEFfTElNSVQiKSk7CisJCQlyZXQgPSAtRUlPOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1NBUF9BVVRPX0NIQU5ORUxfU0VMRUNUSU9OOgorCQlpZiAoc2V0X3ZhbHVlID09IDAgfHwgc2V0X3ZhbHVlID09IDEpCisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPmZvcmNlX3NhcF9hY3MgPQorCQkJCQkJCQlzZXRfdmFsdWU7CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBXRV9TRVRfREFUQV9JTkFDVElWSVRZX1RPOgorCXsKKwkJaWYgKChzZXRfdmFsdWUgPCBDRkdfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfTUlOKSB8fAorCQkgICAgKHNldF92YWx1ZSA+IENGR19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9NQVgpIHx8CisJCSAgICAoc21lX2NmZ19zZXRfaW50KChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmhIYWwsCisJCQkJICAgICBXTklfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VULAorCQkJCSAgICAgc2V0X3ZhbHVlKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkpIHsKKwkJCWhkZExvZyhMT0dFLCAiRmFpbHVyZTogQ291bGQgbm90IHBhc3Mgb24gIgorCQkJICAgICAgICJXTklfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUIGNvbmZpZ3VyYXRpb24gaW5mbyAiCisJCQkgICAgICAgInRvIENDTSIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBXRV9TRVRfTUNfUkFURToKKwl7CisJCXJldCA9IHdsYW5faGRkX3NldF9tY19yYXRlKHBBZGFwdGVyLCBzZXRfdmFsdWUpOworCQlicmVhazsKKwl9CisJY2FzZSBXRV9TRVRfVFhfUE9XRVI6CisJeworCQl0U2lyTWFjQWRkciBic3NpZDsKKworCQljZGZfbWVtX2NvcHkoYnNzaWQsIHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZC5ieXRlcywKKwkJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCQlpZiAoc21lX3NldF90eF9wb3dlcgorCQkJICAgIChoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLCBic3NpZCwKKwkJCSAgICBwQWRhcHRlci0+ZGV2aWNlX21vZGUsCisJCQkgICAgc2V0X3ZhbHVlKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBTZXR0aW5nIHR4IHBvd2VyIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFdFX1NFVF9NQVhfVFhfUE9XRVI6CisJeworCQl0U2lyTWFjQWRkciBic3NpZDsKKwkJdFNpck1hY0FkZHIgc2VsZk1hYzsKKworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICAgICAiJXM6IFNldHRpbmcgbWF4aW11bSB0eCBwb3dlciAlZCBkQm0iLCBfX2Z1bmNfXywKKwkJICAgICAgIHNldF92YWx1ZSk7CisJCWNkZl9tZW1fY29weShic3NpZCwgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLmJ5dGVzLAorCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJCWNkZl9tZW1fY29weShzZWxmTWFjLCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQuYnl0ZXMsCisJCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKworCQlpZiAoc21lX3NldF9tYXhfdHhfcG93ZXIoaEhhbCwgYnNzaWQsIHNlbGZNYWMsIHNldF92YWx1ZSkKKwkJICAgICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICAiJXM6IFNldHRpbmcgbWF4aW11bSB0eCBwb3dlciBmYWlsZWQiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJYnJlYWs7CisJfQorCWNhc2UgV0VfU0VUX01BWF9UWF9QT1dFUl8yXzQ6CisJeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICAgICAiJXM6IFNldHRpbmcgbWF4aW11bSB0eCBwb3dlciAlZCBkQm0gZm9yIDIuNCBHSHogYmFuZCIsCisJCSAgICAgICBfX2Z1bmNfXywgc2V0X3ZhbHVlKTsKKwkJaWYgKHNtZV9zZXRfbWF4X3R4X3Bvd2VyX3Blcl9iYW5kKGVDU1JfQkFORF8yNCwgc2V0X3ZhbHVlKSAhPQorCQkgICAgQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgICIlczogU2V0dGluZyBtYXhpbXVtIHR4IHBvd2VyIGZhaWxlZCBmb3IgMi40IEdIeiBiYW5kIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWJyZWFrOworCX0KKwljYXNlIFdFX1NFVF9NQVhfVFhfUE9XRVJfNV8wOgorCXsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICAgICAgIiVzOiBTZXR0aW5nIG1heGltdW0gdHggcG93ZXIgJWQgZEJtIGZvciA1LjAgR0h6IGJhbmQiLAorCQkgICAgICAgX19mdW5jX18sIHNldF92YWx1ZSk7CisJCWlmIChzbWVfc2V0X21heF90eF9wb3dlcl9wZXJfYmFuZChlQ1NSX0JBTkRfNUcsIHNldF92YWx1ZSkgIT0KKwkJICAgIENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICAgICAiJXM6IFNldHRpbmcgbWF4aW11bSB0eCBwb3dlciBmYWlsZWQgZm9yIDUuMCBHSHogYmFuZCIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlicmVhazsKKwl9CisJY2FzZSBXRV9TRVRfSElHSEVSX0RUSU1fVFJBTlNJVElPTjoKKwl7CisJCWlmICghKChzZXRfdmFsdWUgPT0gZmFsc2UpIHx8IChzZXRfdmFsdWUgPT0gdHJ1ZSkpKSB7CisJCQloZGRMb2coTE9HRSwgIkR5bmFtaWMgRFRJTSBJbmNvcnJlY3QgZGF0YTolZCIsCisJCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQlpZiAocEFkYXB0ZXItPmhpZ2hlckR0aW1UcmFuc2l0aW9uICE9IHNldF92YWx1ZSkgeworCQkJCXBBZGFwdGVyLT5oaWdoZXJEdGltVHJhbnNpdGlvbiA9CisJCQkJCXNldF92YWx1ZTsKKwkJCQloZGRMb2coTE9HMSwKKwkJCQkgICAgICAgIiVzOiBoaWdoZXJEdGltVHJhbnNpdGlvbiBzZXQgdG8gOiVkIiwKKwkJCQkgICAgICAgX19mdW5jX18sCisJCQkJICAgICAgIHBBZGFwdGVyLT5oaWdoZXJEdGltVHJhbnNpdGlvbik7CisJCQl9CisJCX0KKworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9UTV9MRVZFTDoKKwl7CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAgICAgICJTZXQgVGhlcm1hbCBNaXRpZ2F0aW9uIExldmVsICVkIiwgc2V0X3ZhbHVlKTsKKwkJKHZvaWQpc21lX3NldF90aGVybWFsX2xldmVsKGhIYWwsIHNldF92YWx1ZSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1BIWU1PREU6CisJeworCQloZGRfY29udGV4dF90ICpwaGRkY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKwkJcmV0ID0KKwkJCXdsYW5faGRkX3VwZGF0ZV9waHltb2RlKGRldiwgaEhhbCwgc2V0X3ZhbHVlLAorCQkJCQkJcGhkZGN0eCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX05TUzoKKwl7CisJCWhkZExvZyhMT0cxLCAiU2V0IE5TUyA9ICVkIiwgc2V0X3ZhbHVlKTsKKwkJaWYgKChzZXRfdmFsdWUgPiAyKSB8fCAoc2V0X3ZhbHVlIDw9IDApKSB7CisJCQloZGRMb2coTE9HRSwgIk5TUyBncmVhdGVyIHRoYW4gMiBub3Qgc3VwcG9ydGVkIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkJCWhkZF91cGRhdGVfbnNzKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpLAorCQkJCXNldF92YWx1ZSkpCisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9HVFhfSFRfTUNTOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfVkRFVl9QQVJBTV9HVFhfSFRfTUNTICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BBUkFNX0dUWF9IVF9NQ1MsCisJCQkJCSAgc2V0X3ZhbHVlLCBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9TRVRfR1RYX1ZIVF9NQ1M6CisJeworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BBUkFNX0dUWF9WSFRfTUNTICVkIiwKKwkJICAgICAgIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfVkRFVl9QQVJBTV9HVFhfVkhUX01DUywKKwkJCQkJICBzZXRfdmFsdWUsIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9HVFhfVVNSQ0ZHOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfVkRFVl9QQVJBTV9HVFhfVVNSX0NGRyAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fR1RYX1VTUl9DRkcsCisJCQkJCSAgc2V0X3ZhbHVlLCBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9TRVRfR1RYX1RIUkU6CisJeworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BBUkFNX0dUWF9USFJFICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BBUkFNX0dUWF9USFJFLAorCQkJCQkgIHNldF92YWx1ZSwgR1RYX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX0dUWF9NQVJHSU46CisJeworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BBUkFNX0dUWF9NQVJHSU4gJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fR1RYX01BUkdJTiwKKwkJCQkJICBzZXRfdmFsdWUsIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9HVFhfU1RFUDoKKwl7CisJCWhkZExvZyhMT0cxLCAiV01JX1ZERVZfUEFSQU1fR1RYX1NURVAgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fR1RYX1NURVAsCisJCQkJCSAgc2V0X3ZhbHVlLCBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9TRVRfR1RYX01JTlRQQzoKKwl7CisJCWhkZExvZyhMT0cxLCAiV01JX1ZERVZfUEFSQU1fR1RYX01JTlRQQyAlZCIsIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfVkRFVl9QQVJBTV9HVFhfTUlOVFBDLAorCQkJCQkgIHNldF92YWx1ZSwgR1RYX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX0dUWF9CV01BU0s6CisJeworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BBUkFNX0dUWF9CV01BU0sgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fR1RYX0JXX01BU0ssCisJCQkJCSAgc2V0X3ZhbHVlLCBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9TRVRfTERQQzoKKwl7CisJCXVpbnQzMl90IHZhbHVlOworCQl1bmlvbiB7CisJCQl1aW50MTZfdCBuQ2ZnVmFsdWUxNjsKKwkJCXRTaXJNYWNIVENhcGFiaWxpdHlJbmZvIGh0Q2FwSW5mbzsKKwkJfSB1SFRDYXBhYmlsaXR5SW5mbzsKKworCQloZGRMb2coTE9HMSwgIkxEUEMgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJLyogZ2V0IHRoZSBIVCBjYXBhYmlsaXR5IGluZm8gKi8KKwkJcmV0ID0gc21lX2NmZ19nZXRfaW50KGhIYWwsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWx1ZSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gcmV0KSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IGNvdWxkIG5vdCBnZXQgSFQgY2FwYWJpbGl0eSBpbmZvIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJdUhUQ2FwYWJpbGl0eUluZm8ubkNmZ1ZhbHVlMTYgPSAweEZGRkYgJiB2YWx1ZTsKKwkJaWYgKChzZXRfdmFsdWUKKwkJICAgICAmJiAodUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLmFkdkNvZGluZ0NhcCkpCisJCSAgICB8fCAoIXNldF92YWx1ZSkpIHsKKwkJCXJldCA9CisJCQkJc21lX3VwZGF0ZV9odF9jb25maWcoaEhhbCwKKwkJCQkJCSAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCSAgICAgV05JX0NGR19IVF9DQVBfSU5GT19BRFZBTkNFX0NPRElORywKKwkJCQkJCSAgICAgc2V0X3ZhbHVlKTsKKwkJfQorCisJCWlmIChyZXQpCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiRmFpbGVkIHRvIHNldCBMRFBDIHZhbHVlIik7CisKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9TRVRfVFhfU1RCQzoKKwl7CisJCXVpbnQzMl90IHZhbHVlOworCQl1bmlvbiB7CisJCQl1aW50MTZfdCBuQ2ZnVmFsdWUxNjsKKwkJCXRTaXJNYWNIVENhcGFiaWxpdHlJbmZvIGh0Q2FwSW5mbzsKKwkJfSB1SFRDYXBhYmlsaXR5SW5mbzsKKworCQloZGRMb2coTE9HMSwgIlRYX1NUQkMgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJLyogZ2V0IHRoZSBIVCBjYXBhYmlsaXR5IGluZm8gKi8KKwkJcmV0ID0gc21lX2NmZ19nZXRfaW50KGhIYWwsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWx1ZSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gcmV0KSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IGNvdWxkIG5vdCBnZXQgSFQgY2FwYWJpbGl0eSBpbmZvIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJdUhUQ2FwYWJpbGl0eUluZm8ubkNmZ1ZhbHVlMTYgPSAweEZGRkYgJiB2YWx1ZTsKKwkJaWYgKChzZXRfdmFsdWUgJiYgKHVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby50eFNUQkMpKQorCQkgICAgfHwgKCFzZXRfdmFsdWUpKSB7CisJCQlyZXQgPQorCQkJCXNtZV91cGRhdGVfaHRfY29uZmlnKGhIYWwsCisJCQkJCQkgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkgICAgIFdOSV9DRkdfSFRfQ0FQX0lORk9fVFhfU1RCQywKKwkJCQkJCSAgICAgc2V0X3ZhbHVlKTsKKwkJfQorCisJCWlmIChyZXQpCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiRmFpbGVkIHRvIHNldCBUWCBTVEJDIHZhbHVlIik7CisKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9TRVRfUlhfU1RCQzoKKwl7CisJCXVpbnQzMl90IHZhbHVlOworCQl1bmlvbiB7CisJCQl1aW50MTZfdCBuQ2ZnVmFsdWUxNjsKKwkJCXRTaXJNYWNIVENhcGFiaWxpdHlJbmZvIGh0Q2FwSW5mbzsKKwkJfSB1SFRDYXBhYmlsaXR5SW5mbzsKKworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BBUkFNX1JYX1NUQkMgdmFsICVkIiwKKwkJICAgICAgIHNldF92YWx1ZSk7CisJCS8qIGdldCB0aGUgSFQgY2FwYWJpbGl0eSBpbmZvICovCisJCXJldCA9IHNtZV9jZmdfZ2V0X2ludChoSGFsLCBXTklfQ0ZHX0hUX0NBUF9JTkZPLCAmdmFsdWUpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHJldCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBjb3VsZCBub3QgZ2V0IEhUIGNhcGFiaWxpdHkgaW5mbyIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCXVIVENhcGFiaWxpdHlJbmZvLm5DZmdWYWx1ZTE2ID0gMHhGRkZGICYgdmFsdWU7CisJCWlmICgoc2V0X3ZhbHVlICYmICh1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8ucnhTVEJDKSkKKwkJICAgIHx8ICghc2V0X3ZhbHVlKSkgeworCQkJcmV0ID0KKwkJCQlzbWVfdXBkYXRlX2h0X2NvbmZpZyhoSGFsLAorCQkJCQkJICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJICAgICBXTklfQ0ZHX0hUX0NBUF9JTkZPX1JYX1NUQkMsCisJCQkJCQkgICAgICghc2V0X3ZhbHVlKSA/IHNldF92YWx1ZQorCQkJCQkJICAgICA6IHVIVENhcGFiaWxpdHlJbmZvLgorCQkJCQkJICAgICBodENhcEluZm8ucnhTVEJDKTsKKwkJfQorCisJCWlmIChyZXQpCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiRmFpbGVkIHRvIHNldCBSWCBTVEJDIHZhbHVlIik7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1NIT1JUX0dJOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfVkRFVl9QQVJBTV9TR0kgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gc21lX3VwZGF0ZV9odF9jb25maWcoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgV05JX0NGR19IVF9DQVBfSU5GT19TSE9SVF9HSV8yME1IWiwKKwkJCQkJICAgc2V0X3ZhbHVlKTsKKwkJaWYgKHJldCkKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJGYWlsZWQgdG8gc2V0IFNob3J0R0kgdmFsdWUiKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9TRVRfUlRTQ1RTOgorCXsKKwkJdWludDMyX3QgdmFsdWU7CisKKwkJaGRkTG9nKExPRzEsICJXTUlfVkRFVl9QQVJBTV9FTkFCTEVfUlRTQ1RTIHZhbCAweCV4IiwKKwkJICAgICAgIHNldF92YWx1ZSk7CisKKwkJaWYgKChzZXRfdmFsdWUgJiBIRERfUlRTQ1RTX0VOX01BU0spID09CisJCSAgICBIRERfUlRTQ1RTX0VOQUJMRSkKKwkJCXZhbHVlID0KKwkJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPgorCQkJCVJUU1RocmVzaG9sZDsKKwkJZWxzZSBpZiAoKChzZXRfdmFsdWUgJiBIRERfUlRTQ1RTX0VOX01BU0spID09IDApCisJCQkgfHwgKChzZXRfdmFsdWUgJiBIRERfUlRTQ1RTX0VOX01BU0spID09CisJCQkgICAgIEhERF9DVFNfRU5BQkxFKSkKKwkJCXZhbHVlID0gV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1BWDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU87CisKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BBUkFNX0VOQUJMRV9SVFNDVFMsCisJCQkJCSAgc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJCWlmICghcmV0KSB7CisJCQlpZiAoc21lX2NmZ19zZXRfaW50CisJCQkJICAgIChoSGFsLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsIHZhbHVlKSAhPQorCQkJCSAgICBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQloZGRMb2coTE9HRSwgIkZBSUxFRCBUTyBTRVQgUlRTQ1RTIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9DSFdJRFRIOgorCXsKKwkJYm9vbCBjaHdpZHRoID0gZmFsc2U7CisJCWhkZF9jb250ZXh0X3QgKnBoZGRjdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwkJLyp1cGRhdGluZyBjaGFubmVsIGJvbmRpbmcgb25seSBvbiA1R2h6ICovCisJCWhkZExvZyhMT0cxLCAiV01JX1ZERVZfUEFSQU1fQ0hXSURUSCB2YWwgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJaWYgKHNldF92YWx1ZSA+IGVIVF9DSEFOTkVMX1dJRFRIXzgwTUhaKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICAiSW52YWxpZCBjaGFubmVsIHdpZHRoIDAtPjIwIDEtPjQwIDItPjgwIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICgoV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFICE9CisJCSAgICAgY3NyX2NvbnZlcnRfY2JfaW5pX3ZhbHVlX3RvX3BoeV9jYl9zdGF0ZShwaGRkY3R4LT5jb25maWctPgorCQkJCQkJCSAgICAgIG5DaGFubmVsQm9uZGluZ01vZGU1R0h6KSkpCisJCQljaHdpZHRoID0gdHJ1ZTsKKworCQltZW1zZXQoJnNtZUNvbmZpZywgMHgwMCwgc2l6ZW9mKHNtZUNvbmZpZykpOworCQlzbWVfZ2V0X2NvbmZpZ19wYXJhbShoSGFsLCAmc21lQ29uZmlnKTsKKwkJc3dpdGNoIChzZXRfdmFsdWUpIHsKKwkJY2FzZSBlSFRfQ0hBTk5FTF9XSURUSF8yME1IWjoKKwkJCXNtZUNvbmZpZy5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlNUdIeiA9CisJCQkJV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworCQkJYnJlYWs7CisJCWNhc2UgZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFo6CisJCQlpZiAoY2h3aWR0aCkKKwkJCQlzbWVDb25maWcuY3NyQ29uZmlnLgorCQkJCWNoYW5uZWxCb25kaW5nTW9kZTVHSHogPQorCQkJCQlwaGRkY3R4LT5jb25maWctPgorCQkJCQluQ2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJY2FzZSBlSFRfQ0hBTk5FTF9XSURUSF84ME1IWjoKKwkJCWlmIChjaHdpZHRoKQorCQkJCXNtZUNvbmZpZy5jc3JDb25maWcuCisJCQkJY2hhbm5lbEJvbmRpbmdNb2RlNUdIeiA9CisJCQkJCXBoZGRjdHgtPmNvbmZpZy0+CisJCQkJCW5DaGFubmVsQm9uZGluZ01vZGU1R0h6OworCQkJZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlicmVhazsKKyNlbmRpZgorCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfVkRFVl9QQVJBTV9DSFdJRFRILAorCQkJCQkgIHNldF92YWx1ZSwgVkRFVl9DTUQpOworCQlpZiAoIXJldCkKKwkJCXNtZV91cGRhdGVfY29uZmlnKGhIYWwsICZzbWVDb25maWcpOworCisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX0FOSV9FTl9ESVM6CisJeworCQloZGRMb2coTE9HMSwgIldNSV9QREVWX1BBUkFNX0FOSV9FTkFCTEUgdmFsICVkIiwKKwkJICAgICAgIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfUERFVl9QQVJBTV9BTklfRU5BQkxFLAorCQkJCQkgIHNldF92YWx1ZSwgUERFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9BTklfUE9MTF9QRVJJT0Q6CisJeworCQloZGRMb2coTE9HMSwgIldNSV9QREVWX1BBUkFNX0FOSV9QT0xMX1BFUklPRCB2YWwgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9QREVWX1BBUkFNX0FOSV9QT0xMX1BFUklPRCwKKwkJCQkJICBzZXRfdmFsdWUsIFBERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9TRVRfQU5JX0xJU1RFTl9QRVJJT0Q6CisJeworCQloZGRMb2coTE9HMSwgIldNSV9QREVWX1BBUkFNX0FOSV9MSVNURU5fUEVSSU9EIHZhbCAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1BERVZfUEFSQU1fQU5JX0xJU1RFTl9QRVJJT0QsCisJCQkJCSAgc2V0X3ZhbHVlLCBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX0FOSV9PRkRNX0xFVkVMOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfUERFVl9QQVJBTV9BTklfT0ZETV9MRVZFTCB2YWwgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9QREVWX1BBUkFNX0FOSV9PRkRNX0xFVkVMLAorCQkJCQkgIHNldF92YWx1ZSwgUERFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9BTklfQ0NLX0xFVkVMOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfUERFVl9QQVJBTV9BTklfQ0NLX0xFVkVMIHZhbCAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1BERVZfUEFSQU1fQU5JX0NDS19MRVZFTCwKKwkJCQkJICBzZXRfdmFsdWUsIFBERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9TRVRfRFlOQU1JQ19CVzoKKwl7CisJCWhkZExvZyhMT0cxLCAiV01JX1BERVZfUEFSQU1fRFlOQU1JQ19CVyB2YWwgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9QREVWX1BBUkFNX0RZTkFNSUNfQlcsCisJCQkJCSAgc2V0X3ZhbHVlLCBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX0NUU19DQlc6CisJeworCQloZGRMb2coTE9HMSwgIldFX1NFVF9DVFNfQ0JXIHZhbCAlZCIsIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfUERFVl9QQVJBTV9DVFNfQ0JXLAorCQkJCQkgIHNldF92YWx1ZSwgUERFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF8xMU5fUkFURToKKwl7CisJCXVpbnQ4X3QgcHJlYW1ibGUgPSAwLCBuc3MgPSAwLCByaXggPSAwOworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BBUkFNX0ZJWEVEX1JBVEUgdmFsICVkIiwKKwkJICAgICAgIHNldF92YWx1ZSk7CisKKwkJaWYgKHNldF92YWx1ZSAhPSAweGZmKSB7CisJCQlyaXggPSBSQ18yX1JBVEVfSURYKHNldF92YWx1ZSk7CisJCQlpZiAoc2V0X3ZhbHVlICYgMHg4MCkgeworCQkJCXByZWFtYmxlID0gV01JX1JBVEVfUFJFQU1CTEVfSFQ7CisJCQkJbnNzID0gSFRfUkNfMl9TVFJFQU1TKHNldF92YWx1ZSkgLSAxOworCQkJfSBlbHNlIHsKKwkJCQluc3MgPSAwOworCQkJCXJpeCA9IFJDXzJfUkFURV9JRFgoc2V0X3ZhbHVlKTsKKwkJCQlpZiAoc2V0X3ZhbHVlICYgMHgxMCkgeworCQkJCQlwcmVhbWJsZSA9CisJCQkJCQlXTUlfUkFURV9QUkVBTUJMRV9DQ0s7CisJCQkJCWlmIChyaXggIT0gMHgzKQorCQkJCQkJLyogRW5hYmxlIFNob3J0CisJCQkJCQkgKiBwcmVhbWJsZSBhbHdheXMgZm9yCisJCQkJCQkgKiBDQ0sgZXhjZXB0IDFtYnBzCisJCQkJCQkgKi8KKwkJCQkJCXJpeCB8PSAweDQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJlYW1ibGUgPQorCQkJCQkJV01JX1JBVEVfUFJFQU1CTEVfT0ZETTsKKwkJCQl9CisJCQl9CisJCQlzZXRfdmFsdWUgPSAocHJlYW1ibGUgPDwgNikgfCAobnNzIDw8IDQpIHwgcml4OworCQl9CisJCWhkZF9pbmZvKCJXTUlfVkRFVl9QQVJBTV9GSVhFRF9SQVRFIHZhbCAlZCByaXggJWQgcHJlYW1ibGUgJXggbnNzICVkIiwKKwkJCSBzZXRfdmFsdWUsIHJpeCwgcHJlYW1ibGUsIG5zcyk7CisKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BBUkFNX0ZJWEVEX1JBVEUsCisJCQkJCSAgc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1ZIVF9SQVRFOgorCXsKKwkJdWludDhfdCBwcmVhbWJsZSA9IDAsIG5zcyA9IDAsIHJpeCA9IDA7CisKKwkJaWYgKHNldF92YWx1ZSAhPSAweGZmKSB7CisJCQlyaXggPSBSQ18yX1JBVEVfSURYXzExQUMoc2V0X3ZhbHVlKTsKKwkJCXByZWFtYmxlID0gV01JX1JBVEVfUFJFQU1CTEVfVkhUOworCQkJbnNzID0gSFRfUkNfMl9TVFJFQU1TXzExQUMoc2V0X3ZhbHVlKSAtIDE7CisKKwkJCXNldF92YWx1ZSA9IChwcmVhbWJsZSA8PCA2KSB8IChuc3MgPDwgNCkgfCByaXg7CisJCX0KKwkJaGRkX2luZm8oIldNSV9WREVWX1BBUkFNX0ZJWEVEX1JBVEUgdmFsICVkIHJpeCAlZCBwcmVhbWJsZSAleCBuc3MgJWQiLAorCQkJIHNldF92YWx1ZSwgcml4LCBwcmVhbWJsZSwgbnNzKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BBUkFNX0ZJWEVEX1JBVEUsCisJCQkJCSAgc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX0FNUERVOgorCXsKKwkJaGRkTG9nKExPRzEsICJTRVQgQU1QRFUgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIEdFTl9WREVWX1BBUkFNX0FNUERVLAorCQkJCQkgIHNldF92YWx1ZSwgR0VOX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX0FNU0RVOgorCXsKKwkJaGRkTG9nKExPRzEsICJTRVQgQU1TRFUgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIEdFTl9WREVWX1BBUkFNX0FNU0RVLAorCQkJCQkgIHNldF92YWx1ZSwgR0VOX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX0JVUlNUX0VOQUJMRToKKwl7CisJCWhkZExvZyhMT0cxLCAiU0VUIEJ1cnN0IGVuYWJsZSB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlpZiAoKHNldF92YWx1ZSA9PSAwKSB8fCAoc2V0X3ZhbHVlID09IDEpKSB7CisJCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkgIFdNSV9QREVWX1BBUkFNX0JVUlNUX0VOQUJMRSwKKwkJCQkJCSAgc2V0X3ZhbHVlLCBQREVWX0NNRCk7CisJCX0gZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWNhc2UgV0VfU0VUX0JVUlNUX0RVUjoKKwl7CisJCWhkZExvZyhMT0cxLCAiU0VUIEJ1cnN0IGR1cmF0aW9uIHZhbCAlZCIsIHNldF92YWx1ZSk7CisJCWlmICgoc2V0X3ZhbHVlID4gMCkgJiYgKHNldF92YWx1ZSA8PSA4MTkyKSkKKwkJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJCSAgV01JX1BERVZfUEFSQU1fQlVSU1RfRFVSLAorCQkJCQkJICBzZXRfdmFsdWUsICBQREVWX0NNRCk7CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1RYX0NIQUlOTUFTSzoKKwl7CisJCWhkZExvZyhMT0cxLCAiV01JX1BERVZfUEFSQU1fVFhfQ0hBSU5fTUFTSyB2YWwgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9QREVWX1BBUkFNX1RYX0NIQUlOX01BU0ssCisJCQkJCSAgc2V0X3ZhbHVlLCBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1JYX0NIQUlOTUFTSzoKKwl7CisJCWhkZExvZyhMT0cxLCAiV01JX1BERVZfUEFSQU1fUlhfQ0hBSU5fTUFTSyB2YWwgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9QREVWX1BBUkFNX1JYX0NIQUlOX01BU0ssCisJCQkJCSAgc2V0X3ZhbHVlLCBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1RYUE9XXzJHOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfUERFVl9QQVJBTV9UWFBPV0VSX0xJTUlUMkcgdmFsICVkIiwKKwkJICAgICAgIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfUERFVl9QQVJBTV9UWFBPV0VSX0xJTUlUMkcsCisJCQkJCSAgc2V0X3ZhbHVlLCBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1RYUE9XXzVHOgorCXsKKwkJaGRkTG9nKExPRzEsICJXTUlfUERFVl9QQVJBTV9UWFBPV0VSX0xJTUlUNUcgdmFsICVkIiwKKwkJICAgICAgIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfUERFVl9QQVJBTV9UWFBPV0VSX0xJTUlUNUcsCisJCQkJCSAgc2V0X3ZhbHVlLCBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1BPV0VSX0dBVElORzoKKwl7CisJCWhkZExvZyhMT0cxLCAiV01JX1BERVZfUEFSQU1fUE9XRVJfR0FUSU5HX1NMRUVQIHZhbCAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1BERVZfUEFSQU1fUE9XRVJfR0FUSU5HX1NMRUVQLAorCQkJCQkgIChzZXRfdmFsdWUpID8gdHJ1ZSA6IGZhbHNlLCBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCS8qIEZpcm13YXJlIGRlYnVnIGxvZyAqLworCWNhc2UgV0VfREJHTE9HX0xPR19MRVZFTDoKKwl7CisJCWhkZExvZyhMT0cxLCAiV0VfREJHTE9HX0xPR19MRVZFTCB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQloZGRfY3R4LT5md19sb2dfc2V0dGluZ3MuZGxfbG9nbGV2ZWwgPSBzZXRfdmFsdWU7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfREJHTE9HX0xPR19MRVZFTCwKKwkJCQkJICBzZXRfdmFsdWUsIERCR19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0RCR0xPR19WQVBfRU5BQkxFOgorCXsKKwkJaGRkTG9nKExPRzEsICJXRV9EQkdMT0dfVkFQX0VOQUJMRSB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX0RCR0xPR19WQVBfRU5BQkxFLAorCQkJCQkgIHNldF92YWx1ZSwgREJHX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfREJHTE9HX1ZBUF9ESVNBQkxFOgorCXsKKwkJaGRkTG9nKExPRzEsICJXRV9EQkdMT0dfVkFQX0RJU0FCTEUgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9EQkdMT0dfVkFQX0RJU0FCTEUsCisJCQkJCSAgc2V0X3ZhbHVlLCBEQkdfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9EQkdMT0dfTU9EVUxFX0VOQUJMRToKKwl7CisJCWhkZExvZyhMT0cxLCAiV0VfREJHTE9HX01PRFVMRV9FTkFCTEUgdmFsICVkIiwKKwkJICAgICAgIHNldF92YWx1ZSk7CisJCWhkZF9jdHgtPmZ3X2xvZ19zZXR0aW5ncy5lbmFibGUgPSBzZXRfdmFsdWU7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfREJHTE9HX01PRFVMRV9FTkFCTEUsCisJCQkJCSAgc2V0X3ZhbHVlLCBEQkdfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9EQkdMT0dfTU9EVUxFX0RJU0FCTEU6CisJeworCQloZGRMb2coTE9HMSwgIldFX0RCR0xPR19NT0RVTEVfRElTQUJMRSB2YWwgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJaGRkX2N0eC0+ZndfbG9nX3NldHRpbmdzLmVuYWJsZSA9IHNldF92YWx1ZTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9EQkdMT0dfTU9EVUxFX0RJU0FCTEUsCisJCQkJCSAgc2V0X3ZhbHVlLCBEQkdfQ01EKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgV0VfREJHTE9HX01PRF9MT0dfTEVWRUw6CisJeworCQloZGRMb2coTE9HMSwgIldFX0RCR0xPR19NT0RfTE9HX0xFVkVMIHZhbCAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCisJCWlmIChoZGRfY3R4LT5md19sb2dfc2V0dGluZ3MuaW5kZXggPj0gTUFYX01PRF9MT0dMRVZFTCkKKwkJCWhkZF9jdHgtPmZ3X2xvZ19zZXR0aW5ncy5pbmRleCA9IDA7CisKKwkJaGRkX2N0eC0+ZndfbG9nX3NldHRpbmdzLgorCQlkbF9tb2RfbG9nbGV2ZWxbaGRkX2N0eC0+ZndfbG9nX3NldHRpbmdzLmluZGV4XSA9CisJCQlzZXRfdmFsdWU7CisJCWhkZF9jdHgtPmZ3X2xvZ19zZXR0aW5ncy5pbmRleCsrOworCisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfREJHTE9HX01PRF9MT0dfTEVWRUwsCisJCQkJCSAgc2V0X3ZhbHVlLCBEQkdfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9EQkdMT0dfVFlQRToKKwl7CisJCWhkZExvZyhMT0cxLCAiV0VfREJHTE9HX1RZUEUgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJaGRkX2N0eC0+ZndfbG9nX3NldHRpbmdzLmRsX3R5cGUgPSBzZXRfdmFsdWU7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfREJHTE9HX1RZUEUsCisJCQkJCSAgc2V0X3ZhbHVlLCBEQkdfQ01EKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgV0VfREJHTE9HX1JFUE9SVF9FTkFCTEU6CisJeworCQloZGRMb2coTE9HMSwgIldFX0RCR0xPR19SRVBPUlRfRU5BQkxFIHZhbCAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQloZGRfY3R4LT5md19sb2dfc2V0dGluZ3MuZGxfcmVwb3J0ID0gc2V0X3ZhbHVlOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX0RCR0xPR19SRVBPUlRfRU5BQkxFLAorCQkJCQkgIHNldF92YWx1ZSwgREJHX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1RYUlhfRldTVEFUUzoKKwl7CisJCWhkZExvZyhMT0cxLCAiV0VfU0VUX1RYUlhfRldTVEFUUyB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01BX1ZERVZfVFhSWF9GV1NUQVRTX0VOQUJMRV9DTURJRCwKKwkJCQkJICBzZXRfdmFsdWUsIFZERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9UWFJYX0ZXU1RBVFNfUkVTRVQ6CisJeworCQloZGRMb2coTE9HMSwgIldFX1RYUlhfRldTVEFUU19SRVNFVCB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01BX1ZERVZfVFhSWF9GV1NUQVRTX1JFU0VUX0NNRElELAorCQkJCQkgIHNldF92YWx1ZSwgVkRFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0RVTVBfU1RBVFM6CisJeworCQloZGRMb2coTE9HMSwgIldFX0RVTVBfU1RBVFMgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJaGRkX3dsYW5fZHVtcF9zdGF0cyhwQWRhcHRlciwgc2V0X3ZhbHVlKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9DTEVBUl9TVEFUUzoKKwl7CisJCWhkZExvZyhMT0cxLCAiV0VfQ0xFQVJfU1RBVFMgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJc3dpdGNoIChzZXRfdmFsdWUpIHsKKwkJY2FzZSBXTEFOX0hERF9TVEFUUzoKKwkJCW1lbXNldCgmcEFkYXB0ZXItPnN0YXRzLCAwLCBzaXplb2YocEFkYXB0ZXItPnN0YXRzKSk7CisJCQltZW1zZXQoJnBBZGFwdGVyLT5oZGRfc3RhdHMsIDAsCisJCQkJCXNpemVvZihwQWRhcHRlci0+aGRkX3N0YXRzKSk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX1RYUlhfSElTVF9TVEFUUzoKKwkJCXdsYW5faGRkX2NsZWFyX3R4X3J4X2hpc3RvZ3JhbShoZGRfY3R4KTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fSEREX05FVElGX09QRVJfSElTVE9SWToKKwkJCXdsYW5faGRkX2NsZWFyX25ldGlmX3F1ZXVlX2hpc3RvcnkoaGRkX2N0eCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW9sX3R4cnhfY2xlYXJfc3RhdHMoc2V0X3ZhbHVlKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1BQU19QQUlEX01BVENIOgorCXsKKwkJaWYgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSAhPSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKQorCQkJcmV0dXJuIEVJTlZBTDsKKworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BQU19QQUlEX01BVENIIHZhbCAlZCAiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BQU19QQUlEX01BVENILAorCQkJCQkgIHNldF92YWx1ZSwgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfUFBTX0dJRF9NQVRDSDoKKwl7CisJCWlmIChwQWRhcHRlci0+ZGV2aWNlX21vZGUgIT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikKKwkJCXJldHVybiBFSU5WQUw7CisJCWhkZExvZyhMT0cxLCAiV01JX1ZERVZfUFBTX0dJRF9NQVRDSCB2YWwgJWQgIiwKKwkJICAgICAgIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBXTUlfVkRFVl9QUFNfR0lEX01BVENILAorCQkJCQkgIHNldF92YWx1ZSwgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfUFBTX0VBUkxZX1RJTV9DTEVBUjoKKwl7CisJCWlmIChwQWRhcHRlci0+ZGV2aWNlX21vZGUgIT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikKKwkJCXJldHVybiBFSU5WQUw7CisJCWhkZExvZyhMT0cxLCAiIFdNSV9WREVWX1BQU19FQVJMWV9USU1fQ0xFQVIgdmFsICVkICIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUFBTX0VBUkxZX1RJTV9DTEVBUiwKKwkJCQkJICBzZXRfdmFsdWUsIFBQU19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1BQU19FQVJMWV9EVElNX0NMRUFSOgorCXsKKwkJaWYgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSAhPSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKQorCQkJcmV0dXJuIEVJTlZBTDsKKwkJaGRkTG9nKExPRzEsICJXTUlfVkRFVl9QUFNfRUFSTFlfRFRJTV9DTEVBUiB2YWwgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BQU19FQVJMWV9EVElNX0NMRUFSLAorCQkJCQkgIHNldF92YWx1ZSwgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfUFBTX0VPRl9QQURfREVMSU06CisJeworCQlpZiAocEFkYXB0ZXItPmRldmljZV9tb2RlICE9IFdMQU5fSEREX0lORlJBX1NUQVRJT04pCisJCQlyZXR1cm4gRUlOVkFMOworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BQU19FT0ZfUEFEX0RFTElNIHZhbCAlZCAiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BQU19FT0ZfUEFEX0RFTElNLAorCQkJCQkgIHNldF92YWx1ZSwgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfUFBTX01BQ0FERFJfTUlTTUFUQ0g6CisJeworCQlpZiAocEFkYXB0ZXItPmRldmljZV9tb2RlICE9IFdMQU5fSEREX0lORlJBX1NUQVRJT04pCisJCQlyZXR1cm4gRUlOVkFMOworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BQU19NQUNBRERSX01JU01BVENIIHZhbCAlZCAiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BQU19NQUNBRERSX01JU01BVENILAorCQkJCQkgIHNldF92YWx1ZSwgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfUFBTX0RFTElNX0NSQ19GQUlMOgorCXsKKwkJaWYgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSAhPSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKQorCQkJcmV0dXJuIEVJTlZBTDsKKwkJaGRkTG9nKExPRzEsICJXTUlfVkRFVl9QUFNfREVMSU1fQ1JDX0ZBSUwgdmFsICVkICIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUFBTX0RFTElNX0NSQ19GQUlMLAorCQkJCQkgIHNldF92YWx1ZSwgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfUFBTX0dJRF9OU1RTX1pFUk86CisJeworCQlpZiAocEFkYXB0ZXItPmRldmljZV9tb2RlICE9IFdMQU5fSEREX0lORlJBX1NUQVRJT04pCisJCQlyZXR1cm4gRUlOVkFMOworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BQU19HSURfTlNUU19aRVJPIHZhbCAlZCAiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BQU19HSURfTlNUU19aRVJPLAorCQkJCQkgIHNldF92YWx1ZSwgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfUFBTX1JTU0lfQ0hFQ0s6CisJeworCQlpZiAocEFkYXB0ZXItPmRldmljZV9tb2RlICE9IFdMQU5fSEREX0lORlJBX1NUQVRJT04pCisJCQlyZXR1cm4gRUlOVkFMOworCQloZGRMb2coTE9HMSwgIldNSV9WREVWX1BQU19SU1NJX0NIRUNLIHZhbCAlZCAiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BQU19SU1NJX0NIRUNLLAorCQkJCQkgIHNldF92YWx1ZSwgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfUFBTXzVHX0VCVDoKKwl7CisJCWlmIChwQWRhcHRlci0+ZGV2aWNlX21vZGUgIT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWhkZExvZyhMT0cxLCAiV01JX1ZERVZfUFBTXzVHX0VCVCB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUFBTXzVHX0VCVCwKKwkJCQkJICBzZXRfdmFsdWUsIFBQU19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9IVFNNUFM6CisJeworCQloZGRMb2coTE9HMSwgIldFX1NFVF9IVFNNUFMgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9TVEFfU01QU19GT1JDRV9NT0RFX0NNRElELAorCQkJCQkgIHNldF92YWx1ZSwgVkRFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9RUE9XRVJfTUFYX1BTUE9MTF9DT1VOVDoKKwl7CisJCWhkZExvZyhMT0cxLCAiV0VfU0VUX1FQT1dFUl9NQVhfUFNQT0xMX0NPVU5UIHZhbCAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfUFNQT0xMX0NPVU5ULAorCQkJCQkgIHNldF92YWx1ZSwgUVBPV0VSX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1FQT1dFUl9NQVhfVFhfQkVGT1JFX1dBS0U6CisJeworCQloZGRMb2coTE9HMSwgIldFX1NFVF9RUE9XRVJfTUFYX1RYX0JFRk9SRV9XQUtFIHZhbCAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKAorCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfTUFYX1RYX0JFRk9SRV9XQUtFLAorCQkJCXNldF92YWx1ZSwgUVBPV0VSX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1FQT1dFUl9TUEVDX1BTUE9MTF9XQUtFX0lOVEVSVkFMOgorCXsKKwkJaGRkTG9nKExPRzEsCisJCSAgICAgICAiV0VfU0VUX1FQT1dFUl9TUEVDX1BTUE9MTF9XQUtFX0lOVEVSVkFMIHZhbCAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKAorCQkJcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCVdNSV9TVEFfUFNfUEFSQU1fUVBPV0VSX1NQRUNfUFNQT0xMX1dBS0VfSU5URVJWQUwsCisJCQlzZXRfdmFsdWUsIFFQT1dFUl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX1NFVF9RUE9XRVJfU1BFQ19NQVhfU1BFQ19OT0RBVEFfUFNQT0xMOgorCXsKKwkJaGRkTG9nKExPRzEsCisJCSAgICAgICAiV0VfU0VUX1FQT1dFUl9TUEVDX01BWF9TUEVDX05PREFUQV9QU1BPTEwgdmFsICVkIiwKKwkJICAgICAgIHNldF92YWx1ZSk7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQoCisJCQlwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfU1BFQ19NQVhfU1BFQ19OT0RBVEFfUFNQT0xMLAorCQkJc2V0X3ZhbHVlLCBRUE9XRVJfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9NQ0NfQ09ORklHX0xBVEVOQ1k6CisJeworCQljZHNfc2V0X21jY19sYXRlbmN5KHBBZGFwdGVyLCBzZXRfdmFsdWUpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX01DQ19DT05GSUdfUVVPVEE6CisJeworCQloZGRMb2coTE9HMSwgIml3cHJpdiBjbWQgdG8gc2V0IE1DQyBxdW90YSB3aXRoIHZhbCAlZG1zIiwKKwkJCQlzZXRfdmFsdWUpOworCQlyZXQgPSBjZHNfc2V0X21jY19wMnBfcXVvdGEocEFkYXB0ZXIsIHNldF92YWx1ZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFdFX1NFVF9ERUJVR19MT0c6CisJeworCQloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisjaWZkZWYgUUNBX1BLVF9QUk9UT19UUkFDRQorCQkvKiBUcmFjZSBidWZmZXIgZHVtcCBvbmx5ICovCisJCWlmIChDRFNfUEtUX1RSQUNfRFVNUF9DTUQgPT0gc2V0X3ZhbHVlKSB7CisJCQljZHNfcGt0X3RyYWNlX2J1Zl9kdW1wKCk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKwkJaGRkX2N0eC0+Y29uZmlnLT5nRW5hYmxlRGVidWdMb2cgPSBzZXRfdmFsdWU7CisJCXNtZV91cGRhdGVfY29ubmVjdF9kZWJ1ZyhoZGRfY3R4LT5oSGFsLCBzZXRfdmFsdWUpOworCQlicmVhazsKKwl9CisJY2FzZSBXRV9TRVRfRUFSTFlfUlhfQURKVVNUX0VOQUJMRToKKwl7CisJCWhkZExvZyhMT0cxLCAiU0VUIGVhcmx5X3J4IGVuYWJsZSB2YWwgJWQiLCBzZXRfdmFsdWUpOworCQlpZiAoKHNldF92YWx1ZSA9PSAwKSB8fCAoc2V0X3ZhbHVlID09IDEpKQorCQkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZCgKKwkJCQkJcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfQURKVVNUX0VOQUJMRSwKKwkJCQkJc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwljYXNlIFdFX1NFVF9FQVJMWV9SWF9UR1RfQk1JU1NfTlVNOgorCXsKKwkJaGRkTG9nKExPRzEsICJTRVQgZWFybHlfcnggYm1pc3MgdmFsICVkIiwgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BBUkFNX0VBUkxZX1JYX1RHVF9CTUlTU19OVU0sCisJCQkJCSAgc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJCWJyZWFrOworCX0KKwljYXNlIFdFX1NFVF9FQVJMWV9SWF9CTUlTU19TQU1QTEVfQ1lDTEU6CisJeworCQloZGRMb2coTE9HMSwgIlNFVCBlYXJseV9yeCBibWlzcyBzYW1wbGUgY3ljbGUgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZCgKKwkJCQlwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCVdNSV9WREVWX1BBUkFNX0VBUkxZX1JYX0JNSVNTX1NBTVBMRV9DWUNMRSwKKwkJCQlzZXRfdmFsdWUsIFZERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgV0VfU0VUX0VBUkxZX1JYX1NMT1BfU1RFUDoKKwl7CisJCWhkZExvZyhMT0cxLCAiU0VUIGVhcmx5X3J4IGJtaXNzIHNsb3Agc3RlcCB2YWwgJWQiLAorCQkgICAgICAgc2V0X3ZhbHVlKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIFdNSV9WREVWX1BBUkFNX0VBUkxZX1JYX1NMT1BfU1RFUCwKKwkJCQkJICBzZXRfdmFsdWUsIFZERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgV0VfU0VUX0VBUkxZX1JYX0lOSVRfU0xPUDoKKwl7CisJCWhkZExvZyhMT0cxLCAiU0VUIGVhcmx5X3J4IGluaXQgc2xvcCBzdGVwIHZhbCAlZCIsCisJCSAgICAgICBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfSU5JVF9TTE9QLAorCQkJCQkgIHNldF92YWx1ZSwgVkRFVl9DTUQpOworCQlicmVhazsKKwl9CisJY2FzZSBXRV9TRVRfRUFSTFlfUlhfQURKVVNUX1BBVVNFOgorCXsKKwkJaGRkTG9nKExPRzEsICJTRVQgZWFybHlfcnggYWRqdXN0IHBhdXNlICVkIiwgc2V0X3ZhbHVlKTsKKwkJaWYgKChzZXRfdmFsdWUgPT0gMCkgfHwgKHNldF92YWx1ZSA9PSAxKSkKKwkJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQoCisJCQkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCVdNSV9WREVWX1BBUkFNX0VBUkxZX1JYX0FESlVTVF9QQVVTRSwKKwkJCQkJc2V0X3ZhbHVlLCBWREVWX0NNRCk7CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwljYXNlIFdFX1NFVF9FQVJMWV9SWF9EUklGVF9TQU1QTEU6CisJeworCQloZGRMb2coTE9HMSwgIlNFVCBlYXJseV9yeCBkcmlmdCBzYW1wbGUgJWQiLCBzZXRfdmFsdWUpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfRFJJRlRfU0FNUExFLAorCQkJCQkgIHNldF92YWx1ZSwgVkRFVl9DTUQpOworCQlicmVhazsKKwl9CisJY2FzZSBXRV9TRVRfU0NBTl9ESVNBQkxFOgorCXsKKwkJaGRkTG9nKExPRzEsICJTRVQgU0NBTiBESVNBQkxFICVkIiwgc2V0X3ZhbHVlKTsKKwkJc21lX3NldF9zY2FuX2Rpc2FibGUoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCBzZXRfdmFsdWUpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwl7CisJCWhkZExvZyhMT0dFLCAiJXM6IEludmFsaWQgc3ViIGNvbW1hbmQgJWQiLCBfX2Z1bmNfXywKKwkJICAgICAgIHN1Yl9jbWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0aW50X2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRpbnRfZ2V0bm9uZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGl3X3NldGNoYXJfZ2V0bm9uZSgpIC0gR2VuZXJpYyAic2V0IHN0cmluZyIgcHJpdmF0ZSBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19zZXRjaGFyX2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCUNERl9TVEFUVVMgdnN0YXR1czsKKwlpbnQgc3ViX2NtZDsKKwlpbnQgcmV0OworCWNoYXIgKnBCdWZmZXIgPSBOVUxMOworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJc3RydWN0IGhkZF9jb25maWcgKnBDb25maWcgPSBoZGRfY3R4LT5jb25maWc7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSSAqLworCXN0cnVjdCBpd19wb2ludCBzX3ByaXZfZGF0YTsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogaGVscGVyIGZ1bmN0aW9uIHRvIGdldCBpd3JlcV9kYXRhIHdpdGggY29tcGF0IGhhbmRsaW5nLiAqLworCWlmIChoZGRfcHJpdl9nZXRfZGF0YSgmc19wcml2X2RhdGEsIHdycXUpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIG1ha2Ugc3VyZSBhbGwgcGFyYW1zIGFyZSBjb3JyZWN0bHkgcGFzc2VkIHRvIGZ1bmN0aW9uICovCisJaWYgKChOVUxMID09IHNfcHJpdl9kYXRhLnBvaW50ZXIpIHx8ICgwID09IHNfcHJpdl9kYXRhLmxlbmd0aCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3ViX2NtZCA9IHNfcHJpdl9kYXRhLmZsYWdzOworCisJLyogT0REIG51bWJlciBpcyB1c2VkIGZvciBzZXQsIGNvcHkgZGF0YSB1c2luZyBjb3B5X2Zyb21fdXNlciAqLworCXBCdWZmZXIgPSBtZW1fYWxsb2NfY29weV9mcm9tX3VzZXJfaGVscGVyKHNfcHJpdl9kYXRhLnBvaW50ZXIsCisJCQkJCQkgIHNfcHJpdl9kYXRhLmxlbmd0aCk7CisJaWYgKE5VTEwgPT0gcEJ1ZmZlcikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIm1lbV9hbGxvY19jb3B5X2Zyb21fdXNlcl9oZWxwZXIgZmFpbCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmVjZWl2ZWQgbGVuZ3RoICVkIiwgX19mdW5jX18sIHNfcHJpdl9kYXRhLmxlbmd0aCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFJlY2VpdmVkIGRhdGEgJXMiLCBfX2Z1bmNfXywgcEJ1ZmZlcik7CisKKwlzd2l0Y2ggKHN1Yl9jbWQpIHsKKwljYXNlIFdFX1dPV0xfQUREX1BUUk46CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sICJBRERfUFRSTiIpOworCQloZGRfYWRkX3dvd2xfcHRybihwQWRhcHRlciwgcEJ1ZmZlcik7CisJCWJyZWFrOworCWNhc2UgV0VfV09XTF9ERUxfUFRSTjoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIkRFTF9QVFJOIik7CisJCWhkZF9kZWxfd293bF9wdHJuKHBBZGFwdGVyLCBwQnVmZmVyKTsKKwkJYnJlYWs7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJY2FzZSBXRV9ORUlHSEJPUl9SRVBPUlRfUkVRVUVTVDoKKwl7CisJCXRScm1OZWlnaGJvclJlcSBuZWlnaGJvclJlcTsKKwkJdFJybU5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvIGNhbGxiYWNrSW5mbzsKKworCQlpZiAocENvbmZpZy0+ZlJybUVuYWJsZSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiTmVpZ2hib3IgUmVxdWVzdCIpOworCQkJbmVpZ2hib3JSZXEubm9fc3NpZCA9CisJCQkJKHNfcHJpdl9kYXRhLmxlbmd0aCAtIDEpID8gZmFsc2UgOiB0cnVlOworCQkJaWYgKCFuZWlnaGJvclJlcS5ub19zc2lkKSB7CisJCQkJbmVpZ2hib3JSZXEuc3NpZC5sZW5ndGggPQorCQkJCQkoc19wcml2X2RhdGEubGVuZ3RoIC0gMSkgPgorCQkJCQkzMiA/IDMyIDogKHNfcHJpdl9kYXRhLmxlbmd0aCAtIDEpOworCQkJCWNkZl9tZW1fY29weShuZWlnaGJvclJlcS5zc2lkLnNzSWQsCisJCQkJCSAgICAgcEJ1ZmZlciwKKwkJCQkJICAgICBuZWlnaGJvclJlcS5zc2lkLmxlbmd0aCk7CisJCQl9CisKKwkJCWNhbGxiYWNrSW5mby5uZWlnaGJvclJzcENhbGxiYWNrID0gTlVMTDsKKwkJCWNhbGxiYWNrSW5mby5uZWlnaGJvclJzcENhbGxiYWNrQ29udGV4dCA9IE5VTEw7CisJCQljYWxsYmFja0luZm8udGltZW91dCA9IDUwMDA7ICAgICAgICAgICAgLyogNSBzZWNvbmRzICovCisJCQlzbWVfbmVpZ2hib3JfcmVwb3J0X3JlcXVlc3QoV0xBTl9IRERfR0VUX0hBTF9DVFgKKwkJCQkJCQkgICAgKHBBZGFwdGVyKSwKKwkJCQkJCSAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJICAgICZuZWlnaGJvclJlcSwKKwkJCQkJCSAgICAmY2FsbGJhY2tJbmZvKTsKKwkJfSBlbHNlIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgICIlczogSWdub3JpbmcgbmVpZ2hib3IgcmVxdWVzdCBhcyBSUk0gaXMgbm90IGVuYWJsZWQiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwl9CisJYnJlYWs7CisjZW5kaWYKKwljYXNlIFdFX1NFVF9BUF9XUFNfSUU6CisJCWhkZExvZyhMT0dFLCAiUmVjZWl2ZWQgV0VfU0VUX0FQX1dQU19JRSIpOworCQlzbWVfdXBkYXRlX3AycF9pZShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIHBCdWZmZXIsCisJCQkJICBzX3ByaXZfZGF0YS5sZW5ndGgpOworCQlicmVhazsKKwljYXNlIFdFX1NFVF9DT05GSUc6CisJCXZzdGF0dXMgPSBoZGRfZXhlY3V0ZV9nbG9iYWxfY29uZmlnX2NvbW1hbmQoaGRkX2N0eCwgcEJ1ZmZlcik7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gdnN0YXR1cykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCXsKKwkJaGRkTG9nKExPR0UsICIlczogSW52YWxpZCBzdWIgY29tbWFuZCAlZCIsIF9fZnVuY19fLAorCQkgICAgICAgc3ViX2NtZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwl9CisJa2ZyZWUocEJ1ZmZlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpd19zZXRjaGFyX2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldGNoYXJfZ2V0bm9uZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGl3X3NldG5vbmVfZ2V0aW50KCkgLSBHZW5lcmljICJnZXQgaW50ZWdlciIgcHJpdmF0ZSBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19zZXRub25lX2dldGludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJaW50ICp2YWx1ZSA9IChpbnQgKilleHRyYTsKKwlpbnQgcmV0OworCXRTbWVDb25maWdQYXJhbXMgc21lQ29uZmlnOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHZhbHVlWzBdKSB7CisJY2FzZSBXRV9HRVRfMTFEX1NUQVRFOgorCXsKKwkJc21lX2dldF9jb25maWdfcGFyYW0oaEhhbCwgJnNtZUNvbmZpZyk7CisKKwkJKnZhbHVlID0gc21lQ29uZmlnLmNzckNvbmZpZy5JczExZFN1cHBvcnRFbmFibGVkOworCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICgiMTFEIHN0YXRlPSVkISEiKSwgKnZhbHVlKTsKKworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0lCU1NfU1RBVFVTOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiKioqKlJldHVybiBJQlNTIFN0YXR1cyoqKioqIik7CisJCWJyZWFrOworCisJY2FzZSBXRV9HRVRfV0xBTl9EQkc6CisJeworCQljZGZfdHJhY2VfZGlzcGxheSgpOworCQkqdmFsdWUgPSAwOworCQlicmVhazsKKwl9CisJY2FzZSBXRV9HRVRfTUFYX0FTU09DOgorCXsKKwkJaWYgKHNtZV9jZmdfZ2V0X2ludAorCQkJICAgIChoSGFsLCBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVCwKKwkJCSAgICAodWludDMyX3QgKikgdmFsdWUpICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sIEZMCisJCQkJCSAgKCJmYWlsZWQgdG8gZ2V0IGluaSBwYXJhbWV0ZXIsIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUIikpOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBXRV9HRVRfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT046CisJCSp2YWx1ZSA9IChXTEFOX0hERF9HRVRfQ1RYKAorCQkJCXBBZGFwdGVyKSktPmNvbmZpZy0+Zm9yY2Vfc2FwX2FjczsKKwkJYnJlYWs7CisKKwljYXNlIFdFX0dFVF9DT05DVVJSRU5DWV9NT0RFOgorCXsKKwkJKnZhbHVlID0gY2RzX2dldF9jb25jdXJyZW5jeV9tb2RlKCk7CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgKCJjb25jdXJyZW5jeSBtb2RlPSVkIiksICp2YWx1ZSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX05TUzoKKwl7CisJCXNtZV9nZXRfY29uZmlnX3BhcmFtKGhIYWwsICZzbWVDb25maWcpOworCQkqdmFsdWUgPSAoc21lQ29uZmlnLmNzckNvbmZpZy5lbmFibGUyeDIgPT0gMCkgPyAxIDogMjsKKwkJaGRkTG9nKExPRzEsICJHRVRfTlNTOiBDdXJyZW50IE5TUzolZCIsICp2YWx1ZSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX0dUWF9IVF9NQ1M6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QQVJBTV9HVFhfSFRfTUNTIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9HVFhfSFRfTUNTLAorCQkJCQkgICAgIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9HVFhfVkhUX01DUzoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BBUkFNX0dUWF9WSFRfTUNTIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9HVFhfVkhUX01DUywKKwkJCQkJICAgICBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfR1RYX1VTUkNGRzoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BBUkFNX0dUWF9VU1JfQ0ZHIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9HVFhfVVNSX0NGRywKKwkJCQkJICAgICBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfR1RYX1RIUkU6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QQVJBTV9HVFhfVEhSRSIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1ZERVZfUEFSQU1fR1RYX1RIUkUsCisJCQkJCSAgICAgR1RYX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX0dUWF9NQVJHSU46CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QQVJBTV9HVFhfTUFSR0lOIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9HVFhfTUFSR0lOLAorCQkJCQkgICAgIEdUWF9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9HVFhfU1RFUDoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BBUkFNX0dUWF9TVEVQIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9HVFhfU1RFUCwKKwkJCQkJICAgICBHVFhfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfR1RYX01JTlRQQzoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BBUkFNX0dUWF9NSU5UUEMiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9WREVWX1BBUkFNX0dUWF9NSU5UUEMsCisJCQkJCSAgICAgR1RYX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX0dUWF9CV01BU0s6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QQVJBTV9HVFhfQldfTUFTSyIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1ZERVZfUEFSQU1fR1RYX0JXX01BU0ssCisJCQkJCSAgICAgR1RYX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX0xEUEM6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QQVJBTV9MRFBDIik7CisJCSp2YWx1ZSA9IHNtZV9nZXRfaHRfY29uZmlnKGhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgIFdOSV9DRkdfSFRfQ0FQX0lORk9fQURWQU5DRV9DT0RJTkcpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9UWF9TVEJDOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1ZERVZfUEFSQU1fVFhfU1RCQyIpOworCQkqdmFsdWUgPSBzbWVfZ2V0X2h0X2NvbmZpZyhoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICBXTklfQ0ZHX0hUX0NBUF9JTkZPX1RYX1NUQkMpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9SWF9TVEJDOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1ZERVZfUEFSQU1fUlhfU1RCQyIpOworCQkqdmFsdWUgPSBzbWVfZ2V0X2h0X2NvbmZpZyhoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICBXTklfQ0ZHX0hUX0NBUF9JTkZPX1JYX1NUQkMpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9TSE9SVF9HSToKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BBUkFNX1NHSSIpOworCQkqdmFsdWUgPSBzbWVfZ2V0X2h0X2NvbmZpZyhoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NIT1JUX0dJXzIwTUhaKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfUlRTQ1RTOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1ZERVZfUEFSQU1fRU5BQkxFX1JUU0NUUyIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1ZERVZfUEFSQU1fRU5BQkxFX1JUU0NUUywKKwkJCQkJICAgICBWREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX0NIV0lEVEg6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QQVJBTV9DSFdJRFRIIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9DSFdJRFRILAorCQkJCQkgICAgIFZERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfQU5JX0VOX0RJUzoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9QREVWX1BBUkFNX0FOSV9FTkFCTEUiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9QREVWX1BBUkFNX0FOSV9FTkFCTEUsCisJCQkJCSAgICAgUERFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9BTklfUE9MTF9QRVJJT0Q6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfUERFVl9QQVJBTV9BTklfUE9MTF9QRVJJT0QiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9QREVWX1BBUkFNX0FOSV9QT0xMX1BFUklPRCwKKwkJCQkJICAgICBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX0FOSV9MSVNURU5fUEVSSU9EOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1BERVZfUEFSQU1fQU5JX0xJU1RFTl9QRVJJT0QiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9QREVWX1BBUkFNX0FOSV9MSVNURU5fUEVSSU9ELAorCQkJCQkgICAgIFBERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfQU5JX09GRE1fTEVWRUw6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfUERFVl9QQVJBTV9BTklfT0ZETV9MRVZFTCIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1BERVZfUEFSQU1fQU5JX09GRE1fTEVWRUwsCisJCQkJCSAgICAgUERFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9BTklfQ0NLX0xFVkVMOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1BERVZfUEFSQU1fQU5JX0NDS19MRVZFTCIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1BERVZfUEFSQU1fQU5JX0NDS19MRVZFTCwKKwkJCQkJICAgICBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX0RZTkFNSUNfQlc6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfUERFVl9QQVJBTV9BTklfQ0NLX0xFVkVMIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfUERFVl9QQVJBTV9EWU5BTUlDX0JXLAorCQkJCQkgICAgIFBERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfMTFOX1JBVEU6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QQVJBTV9GSVhFRF9SQVRFIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QQVJBTV9GSVhFRF9SQVRFLAorCQkJCQkgICAgIFZERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfQU1QRFU6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBBTVBEVSIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgR0VOX1ZERVZfUEFSQU1fQU1QRFUsCisJCQkJCSAgICAgR0VOX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX0FNU0RVOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgQU1TRFUiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIEdFTl9WREVWX1BBUkFNX0FNU0RVLAorCQkJCQkgICAgIEdFTl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9CVVJTVF9FTkFCTEU6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBCdXJzdCBlbmFibGUgdmFsdWUiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9QREVWX1BBUkFNX0JVUlNUX0VOQUJMRSwKKwkJCQkJICAgICBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKwljYXNlIFdFX0dFVF9CVVJTVF9EVVI6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBCdXJzdCBEdXJhdGlvbiB2YWx1ZSIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1BERVZfUEFSQU1fQlVSU1RfRFVSLAorCQkJCQkgICAgIFBERVZfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfVFhfQ0hBSU5NQVNLOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1BERVZfUEFSQU1fVFhfQ0hBSU5fTUFTSyIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1BERVZfUEFSQU1fVFhfQ0hBSU5fTUFTSywKKwkJCQkJICAgICBQREVWX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX1JYX0NIQUlOTUFTSzoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9QREVWX1BBUkFNX1JYX0NIQUlOX01BU0siKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9QREVWX1BBUkFNX1JYX0NIQUlOX01BU0ssCisJCQkJCSAgICAgUERFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9UWFBPV18yRzoKKwl7CisJCXVpbnQzMl90IHR4cG93MmcgPSAwOworCQl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9QREVWX1BBUkFNX1RYUE9XRVJfTElNSVQyRyIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1BERVZfUEFSQU1fVFhQT1dFUl9MSU1JVDJHLAorCQkJCQkgICAgIFBERVZfQ01EKTsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkgICAgc21lX2NmZ19nZXRfaW50KGhIYWwsIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTCwKKwkJCQkgICAgJnR4cG93MmcpKSB7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQloZGRMb2coTE9HMSwgIjJHIHR4X3Bvd2VyICVkIiwgdHhwb3cyZyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX1RYUE9XXzVHOgorCXsKKwkJdWludDMyX3QgdHhwb3c1ZyA9IDA7CisJCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1BERVZfUEFSQU1fVFhQT1dFUl9MSU1JVDVHIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfUERFVl9QQVJBTV9UWFBPV0VSX0xJTUlUNUcsCisJCQkJCSAgICAgUERFVl9DTUQpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCSAgICBzbWVfY2ZnX2dldF9pbnQoaEhhbCwgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMLAorCQkJCSAgICAmdHhwb3c1ZykpIHsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWhkZExvZyhMT0cxLCAiNUcgdHhfcG93ZXIgJWQiLCB0eHBvdzVnKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfUE9XRVJfR0FUSU5HOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1BERVZfUEFSQU1fUE9XRVJfR0FUSU5HX1NMRUVQIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfUERFVl9QQVJBTV9QT1dFUl9HQVRJTkdfU0xFRVAsCisJCQkJCSAgICAgUERFVl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9QUFNfUEFJRF9NQVRDSDoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BQU19QQUlEX01BVENIIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QUFNfUEFJRF9NQVRDSCwKKwkJCQkJICAgICBQUFNfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfUFBTX0dJRF9NQVRDSDoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BQU19HSURfTUFUQ0giKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9WREVWX1BQU19HSURfTUFUQ0gsCisJCQkJCSAgICAgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX1BQU19FQVJMWV9USU1fQ0xFQVI6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QUFNfRUFSTFlfVElNX0NMRUFSIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QUFNfRUFSTFlfVElNX0NMRUFSLAorCQkJCQkgICAgIFBQU19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9QUFNfRUFSTFlfRFRJTV9DTEVBUjoKKwl7CisJCWhkZExvZyhMT0cxLCAiR0VUIFdNSV9WREVWX1BQU19FQVJMWV9EVElNX0NMRUFSIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfVkRFVl9QUFNfRUFSTFlfRFRJTV9DTEVBUiwKKwkJCQkJICAgICBQUFNfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfUFBTX0VPRl9QQURfREVMSU06CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QUFNfRU9GX1BBRF9ERUxJTSIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1ZERVZfUFBTX0VPRl9QQURfREVMSU0sCisJCQkJCSAgICAgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX1BQU19NQUNBRERSX01JU01BVENIOgorCXsKKwkJaGRkTG9nKExPRzEsICJHRVQgV01JX1ZERVZfUFBTX01BQ0FERFJfTUlTTUFUQ0giKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9WREVWX1BQU19NQUNBRERSX01JU01BVENILAorCQkJCQkgICAgIFBQU19DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9QUFNfREVMSU1fQ1JDX0ZBSUw6CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QUFNfREVMSU1fQ1JDX0ZBSUwiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9WREVWX1BQU19ERUxJTV9DUkNfRkFJTCwKKwkJCQkJICAgICBQUFNfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfUFBTX0dJRF9OU1RTX1pFUk86CisJeworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QUFNfR0lEX05TVFNfWkVSTyIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1ZERVZfUFBTX0dJRF9OU1RTX1pFUk8sCisJCQkJCSAgICAgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX1BQU19SU1NJX0NIRUNLOgorCXsKKworCQloZGRMb2coTE9HMSwgIkdFVCBXTUlfVkRFVl9QUFNfUlNTSV9DSEVDSyIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1ZERVZfUFBTX1JTU0lfQ0hFQ0ssCisJCQkJCSAgICAgUFBTX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX1FQT1dFUl9NQVhfUFNQT0xMX0NPVU5UOgorCXsKKwkJaGRkTG9nKExPRzEsICJXRV9HRVRfUVBPV0VSX01BWF9QU1BPTExfQ09VTlQiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9TVEFfUFNfUEFSQU1fUVBPV0VSX1BTUE9MTF9DT1VOVCwKKwkJCQkJICAgICBRUE9XRVJfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfUVBPV0VSX01BWF9UWF9CRUZPUkVfV0FLRToKKwl7CisJCWhkZExvZyhMT0cxLCAiV0VfR0VUX1FQT1dFUl9NQVhfVFhfQkVGT1JFX1dBS0UiKTsKKwkJKnZhbHVlID0gd21hX2NsaV9nZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgIFdNSV9TVEFfUFNfUEFSQU1fUVBPV0VSX01BWF9UWF9CRUZPUkVfV0FLRSwKKwkJCQkJICAgICBRUE9XRVJfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfUVBPV0VSX1NQRUNfUFNQT0xMX1dBS0VfSU5URVJWQUw6CisJeworCQloZGRMb2coTE9HMSwgIldFX0dFVF9RUE9XRVJfU1BFQ19QU1BPTExfV0FLRV9JTlRFUlZBTCIpOworCQkqdmFsdWUgPSB3bWFfY2xpX2dldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfU1BFQ19QU1BPTExfV0FLRV9JTlRFUlZBTCwKKwkJCQkJICAgICBRUE9XRVJfQ01EKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfUVBPV0VSX1NQRUNfTUFYX1NQRUNfTk9EQVRBX1BTUE9MTDoKKwl7CisJCWhkZExvZyhMT0cxLCAiV0VfR0VUX1FQT1dFUl9NQVhfUFNQT0xMX0NPVU5UIik7CisJCSp2YWx1ZSA9IHdtYV9jbGlfZ2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICAgICBXTUlfU1RBX1BTX1BBUkFNX1FQT1dFUl9TUEVDX01BWF9TUEVDX05PREFUQV9QU1BPTEwsCisJCQkJCSAgICAgUVBPV0VSX0NNRCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfR0VUX1RFTVBFUkFUVVJFOgorCXsKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLCAiV0VfR0VUX1RFTVBFUkFUVVJFIik7CisJCXJldCA9IHdsYW5faGRkX2dldF90ZW1wZXJhdHVyZShwQWRhcHRlciwgdmFsdWUpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwl7CisJCWhkZExvZyhMT0dFLCAiSW52YWxpZCBJT0NUTCBnZXRfdmFsdWUgY29tbWFuZCAlZCIsCisJCSAgICAgICB2YWx1ZVswXSk7CisJCWJyZWFrOworCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGl3X3NldG5vbmVfZ2V0aW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0bm9uZV9nZXRpbnQoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpd19zZXRfdGhyZWVfaW50c19nZXRub25lKCkgLSBHZW5lcmljICJzZXQgMyBwYXJhbXMiIHByaXZhdGUgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfc2V0X3RocmVlX2ludHNfZ2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisJaW50IHN1Yl9jbWQgPSB2YWx1ZVswXTsKKwlpbnQgcmV0OworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChzdWJfY21kKSB7CisKKwljYXNlIFdFX1NFVF9XTEFOX0RCRzoKKwkJY2RmX3RyYWNlX3NldF92YWx1ZSh2YWx1ZVsxXSwgdmFsdWVbMl0sIHZhbHVlWzNdKTsKKwkJYnJlYWs7CisJY2FzZSBXRV9TRVRfRFBfVFJBQ0U6CisJCWNkZl9kcF90cmFjZV9zZXRfdmFsdWUodmFsdWVbMV0sIHZhbHVlWzJdLCB2YWx1ZVszXSk7CisJCWJyZWFrOworCisJLyogdmFsdWVbM10gdGhlIGFjcyBiYW5kIGlzIG5vdCByZXF1aXJlZCBhcyBzdGFydCBhbmQgZW5kIGNoYW5uZWxzIGFyZQorCSAqIGVub3VnaCBidXQgdGhpcyBjbWQgaXMgbWFpbnRhaW5lZCB1bmRlciBzZXQgdGhyZWUgaW50cyBmb3IgaGlzdG9yaWMKKwkgKiByZWFzb25zLgorCSAqLworCWNhc2UgV0VfU0VUX1NBUF9DSEFOTkVMUzoKKwkJaWYgKHdsYW5faGRkX3ZhbGlkYXRlX29wZXJhdGlvbl9jaGFubmVsKHBBZGFwdGVyLCB2YWx1ZVsxXSkgIT0KKwkJCUNERl9TVEFUVVNfU1VDQ0VTUyB8fAorCQkJd2xhbl9oZGRfdmFsaWRhdGVfb3BlcmF0aW9uX2NoYW5uZWwocEFkYXB0ZXIsCisJCQkJCXZhbHVlWzJdKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQloZGRfY3R4LT5jb25maWctPmZvcmNlX3NhcF9hY3Nfc3RfY2ggPSB2YWx1ZVsxXTsKKwkJCWhkZF9jdHgtPmNvbmZpZy0+Zm9yY2Vfc2FwX2Fjc19lbmRfY2ggPSB2YWx1ZVsyXTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdFX1NFVF9EVUFMX01BQ19TQ0FOX0NPTkZJRzoKKwkJaGRkX2RlYnVnKCJJb2N0bCB0byBzZXQgZHVhbCBtYWMgc2NhbiBjb25maWciKTsKKwkJaWYgKGhkZF9jdHgtPmNvbmZpZy0+ZHVhbF9tYWNfZmVhdHVyZV9kaXNhYmxlKSB7CisJCQloZGRfZXJyKCJEdWFsIG1hYyBmZWF0dXJlIGlzIGRpc2FibGVkIGZyb20gSU5JIik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCWhkZF9kZWJ1ZygiJWQgJWQgJWQiLCB2YWx1ZVsxXSwgdmFsdWVbMl0sIHZhbHVlWzNdKTsKKwkJY2RzX3NldF9kdWFsX21hY19zY2FuX2NvbmZpZyhoZGRfY3R4LAorCQkJCXZhbHVlWzFdLCB2YWx1ZVsyXSwKKwkJCQl2YWx1ZVszXSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWhkZExvZyhMT0dFLCAiJXM6IEludmFsaWQgSU9DVEwgY29tbWFuZCAlZCIsIF9fZnVuY19fLCBzdWJfY21kKTsKKwkJYnJlYWs7CisKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGl3X3NldF90aHJlZV9pbnRzX2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF90aHJlZV9pbnRzX2dldG5vbmUoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBoZGRfY29ubmVjdGlvbl9zdGF0ZV9zdHJpbmcoKSAtIEdldCBjb25uZWN0aW9uIHN0YXRlIHN0cmluZworICogQGNvbm5lY3Rpb25fc3RhdGU6IGVudW0gdG8gYmUgY29udmVydGVkIHRvIGEgc3RyaW5nCisgKgorICogUmV0dXJuOiB0aGUgc3RyaW5nIGVxdWl2YWxlbnQgb2YgQGNvbm5lY3Rpb25fc3RhdGUKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgoraGRkX2Nvbm5lY3Rpb25fc3RhdGVfc3RyaW5nKGVDb25uZWN0aW9uU3RhdGUgY29ubmVjdGlvbl9zdGF0ZSkKK3sKKwlzd2l0Y2ggKGNvbm5lY3Rpb25fc3RhdGUpIHsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDb25uZWN0aW9uU3RhdGVfQ29ubmVjdGluZyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNvbm5lY3Rpb25TdGF0ZV9JYnNzRGlzY29ubmVjdGVkKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ29ubmVjdGlvblN0YXRlX0Rpc2Nvbm5lY3RpbmcpOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTiI7CisJfQorfQorCisvKioKKyAqIGl3X2dldF9jaGFyX3NldG5vbmUoKSAtIEdlbmVyaWMgImdldCBzdHJpbmciIHByaXZhdGUgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfZ2V0X2NoYXJfc2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWludCBzdWJfY21kID0gd3JxdS0+ZGF0YS5mbGFnczsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwlwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyNlbmRpZgorCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChzdWJfY21kKSB7CisJY2FzZSBXRV9XTEFOX1ZFUlNJT046CisJeworCQloZGRfd2xhbl9nZXRfdmVyc2lvbihwQWRhcHRlciwgd3JxdSwgZXh0cmEpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0dFVF9TVEFUUzoKKwl7CisJCWhkZF93bGFuX2dldF9zdGF0cyhwQWRhcHRlciwgJih3cnF1LT5kYXRhLmxlbmd0aCksCisJCQkJICAgZXh0cmEsIFdFX01BWF9TVFJfTEVOKTsKKwkJYnJlYWs7CisJfQorCisJLyogVGhlIGNhc2UgcHJpbnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBIREQsIFNNRSwgQ1NSLCBQRSwKKwkgKiBUTCBpdCBjYW4gYmUgZXh0ZW5kZWQgZm9yIFdESSBHbG9iYWwgU3RhdGUgYXMgd2VsbC4gIEFuZAorCSAqIGN1cnJlbnRseSBpdCBvbmx5IGNoZWNrcyBQMlBfQ0xJRU5UIGFkYXB0ZXIuICBQMlBfREVWSUNFCisJICogYW5kIFAyUF9HTyBoYXZlIG5vdCBiZWVuIGFkZGVkIGFzIG9mIG5vdy4KKwkgKi8KKwljYXNlIFdFX0dFVF9TVEFURVM6CisJeworCQlpbnQgYnVmID0gMCwgbGVuID0gMDsKKwkJaW50IGFkYXB0ZXJfbnVtID0gMDsKKwkJaW50IGNvdW50ID0gMCwgY2hlY2sgPSAxOworCisJCXRIYWxIYW5kbGUgaEhhbCA9IE5VTEw7CisJCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBOVUxMOworCQloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IE5VTEw7CisKKwkJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCQloZGRfYWRhcHRlcl90ICp1c2VBZGFwdGVyID0gTlVMTDsKKworCQkvKiBQcmludCB3bGFuMCBvciBwMnAwIHN0YXRlcyBiYXNlZCBvbiB0aGUgYWRhcHRlcl9udW0KKwkJICogYnkgdXNpbmcgdGhlIGNvcnJlY3QgYWRhcHRlcgorCQkgKi8KKwkJd2hpbGUgKGFkYXB0ZXJfbnVtIDwgMikgeworCQkJaWYgKFdMQU5fQURBUFRFUiA9PSBhZGFwdGVyX251bSkgeworCQkJCXVzZUFkYXB0ZXIgPSBwQWRhcHRlcjsKKwkJCQlidWYgPQorCQkJCQlzY25wcmludGYoZXh0cmEgKyBsZW4sCisJCQkJCQkgIFdFX01BWF9TVFJfTEVOIC0gbGVuLAorCQkJCQkJICAiXG5cbiB3bGFuMCBTdGF0ZXM6LSIpOworCQkJCWxlbiArPSBidWY7CisJCQl9IGVsc2UgaWYgKFAyUF9BREFQVEVSID09IGFkYXB0ZXJfbnVtKSB7CisJCQkJYnVmID0KKwkJCQkJc2NucHJpbnRmKGV4dHJhICsgbGVuLAorCQkJCQkJICBXRV9NQVhfU1RSX0xFTiAtIGxlbiwKKwkJCQkJCSAgIlxuXG4gcDJwMCBTdGF0ZXM6LSIpOworCQkJCWxlbiArPSBidWY7CisKKwkJCQlpZiAoIXBIZGRDdHgpIHsKKwkJCQkJYnVmID0KKwkJCQkJCXNjbnByaW50ZihleHRyYSArIGxlbiwKKwkJCQkJCQkgIFdFX01BWF9TVFJfTEVOIC0KKwkJCQkJCQkgIGxlbiwKKwkJCQkJCQkgICJcbiBwSGRkQ3R4IGlzIE5VTEwiKTsKKwkJCQkJbGVuICs9IGJ1ZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogUHJpbnRpbmcgcDJwMCBzdGF0ZXMgb25seSBpbiB0aGUKKwkJCQkgKiBjYXNlIHdoZW4gdGhlIGRldmljZSBpcyBjb25maWd1cmVkCisJCQkJICogYXMgYSBwMnBfY2xpZW50CisJCQkJICovCisJCQkJdXNlQWRhcHRlciA9CisJCQkJCWhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LAorCQkJCQkJCVdMQU5fSEREX1AyUF9DTElFTlQpOworCQkJCWlmICghdXNlQWRhcHRlcikgeworCQkJCQlidWYgPQorCQkJCQkJc2NucHJpbnRmKGV4dHJhICsgbGVuLAorCQkJCQkJCSAgV0VfTUFYX1NUUl9MRU4gLQorCQkJCQkJCSAgbGVuLAorCQkJCQkJCSAgIlxuIERldmljZSBub3QgY29uZmlndXJlZCBhcyBQMlBfQ0xJRU5ULiIpOworCQkJCQlsZW4gKz0gYnVmOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWCh1c2VBZGFwdGVyKTsKKwkJCWlmICghaEhhbCkgeworCQkJCWJ1ZiA9CisJCQkJCXNjbnByaW50ZihleHRyYSArIGxlbiwKKwkJCQkJCSAgV0VfTUFYX1NUUl9MRU4gLSBsZW4sCisJCQkJCQkgICJcbiBwTWFjIGlzIE5VTEwiKTsKKwkJCQlsZW4gKz0gYnVmOworCQkJCWJyZWFrOworCQkJfQorCQkJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCQkJaWYgKCFwTWFjKSB7CisJCQkJYnVmID0KKwkJCQkJc2NucHJpbnRmKGV4dHJhICsgbGVuLAorCQkJCQkJICBXRV9NQVhfU1RSX0xFTiAtIGxlbiwKKwkJCQkJCSAgIlxuIHBNYWMgaXMgTlVMTCIpOworCQkJCWxlbiArPSBidWY7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwSGRkU3RhQ3R4ID0KKwkJCQlXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHVzZUFkYXB0ZXIpOworCisKKwkJCWJ1ZiA9CisJCQkJc2NucHJpbnRmKGV4dHJhICsgbGVuLCBXRV9NQVhfU1RSX0xFTiAtIGxlbiwKKwkJCQkJICAiXG4gSEREIENvbm4gU3RhdGUgLSAlcyAiCisJCQkJCSAgIlxuIFxuIFNNRSBTdGF0ZToiCisJCQkJCSAgIlxuIE5laWdoYm91ciBSb2FtIFN0YXRlIC0gJXMiCisJCQkJCSAgIlxuIENTUiBTdGF0ZSAtICVzIgorCQkJCQkgICJcbiBDU1IgU3Vic3RhdGUgLSAlcyIsCisJCQkJCSAgaGRkX2Nvbm5lY3Rpb25fc3RhdGVfc3RyaW5nCisJCQkJCQkgIChwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSwKKwkJCQkJICBtYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlCisJCQkJCQkgIChzbWVfZ2V0X25laWdoYm9yX3JvYW1fc3RhdGUKKwkJCQkJCQkgIChoSGFsLCB1c2VBZGFwdGVyLT5zZXNzaW9uSWQpKSwKKwkJCQkJICBtYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3RhdGUKKwkJCQkJCSAgKHNtZV9nZXRfY3VycmVudF9yb2FtX3N0YXRlCisJCQkJCQkJICAoaEhhbCwgdXNlQWRhcHRlci0+c2Vzc2lvbklkKSksCisJCQkJCSAgbWFjX3RyYWNlX2dldGNzcl9yb2FtX3N1Yl9zdGF0ZQorCQkJCQkJICAoc21lX2dldF9jdXJyZW50X3JvYW1fc3ViX3N0YXRlCisJCQkJCQkJICAoaEhhbCwgdXNlQWRhcHRlci0+c2Vzc2lvbklkKSkKKwkJCQkJICApOworCQkJbGVuICs9IGJ1ZjsKKwkJCWFkYXB0ZXJfbnVtKys7CisJCX0KKworCQlpZiAocE1hYykgeworCQkJLyogUHJpbnRpbmcgTGltIFN0YXRlIHN0YXJ0aW5nIHdpdGggZ2xvYmFsIGxpbSBzdGF0ZXMgKi8KKwkJCWJ1ZiA9CisJCQkJc2NucHJpbnRmKGV4dHJhICsgbGVuLCBXRV9NQVhfU1RSX0xFTiAtIGxlbiwKKwkJCQkJICAiXG4gXG4gTElNIFNUQVRFUzotIgorCQkJCQkgICJcbiBHbG9iYWwgU21lIFN0YXRlIC0gJXMgIgorCQkJCQkgICJcbiBHbG9iYWwgbWxtIFN0YXRlIC0gJXMgIiAiXG4iLAorCQkJCQkgIG1hY190cmFjZV9nZXRfbGltX3NtZV9zdGF0ZQorCQkJCQkJICAoc21lX2dldF9saW1fc21lX3N0YXRlKGhIYWwpKSwKKwkJCQkJICBtYWNfdHJhY2VfZ2V0X2xpbV9tbG1fc3RhdGUKKwkJCQkJCSAgKHNtZV9nZXRfbGltX3NtZV9zdGF0ZShoSGFsKSkKKwkJCQkJICApOworCQkJbGVuICs9IGJ1ZjsKKworCQkJLyogUHJpbnRpbmcgdGhlIFBFIFNtZSBhbmQgTWxtIHN0YXRlcyBmb3IgdmFsaWQgbGltIHNlc3Npb25zICovCisJCQl3aGlsZSAoY2hlY2sgPCAzICYmIGNvdW50IDwgMjU1KSB7CisJCQkJaWYgKHNtZV9pc19saW1fc2Vzc2lvbl92YWxpZChoSGFsLCBjb3VudCkpIHsKKwkJCQkJYnVmID0KKwkJCQkJCXNjbnByaW50ZihleHRyYSArIGxlbiwKKwkJCQkJCQkgIFdFX01BWF9TVFJfTEVOIC0KKwkJCQkJCQkgIGxlbiwKKwkJCQkJCQkgICJcbiBMaW0gVmFsaWQgU2Vzc2lvbiAlZDotIgorCQkJCQkJCSAgIlxuIFBFIFNtZSBTdGF0ZSAtICVzICIKKwkJCQkJCQkgICJcbiBQRSBNbG0gU3RhdGUgLSAlcyAiCisJCQkJCQkJICAiXG4iLCBjaGVjaywKKwkJCQkJCQkgIG1hY190cmFjZV9nZXRfbGltX3NtZV9zdGF0ZQorCQkJCQkJCQkgIChzbWVfZ2V0X2xpbV9zbWVfc2Vzc2lvbl9zdGF0ZQorCQkJCQkJCQkJICAoaEhhbCwgY291bnQpKSwKKwkJCQkJCQkgIG1hY190cmFjZV9nZXRfbGltX21sbV9zdGF0ZQorCQkJCQkJCQkgIChzbWVfZ2V0X2xpbV9tbG1fc2Vzc2lvbl9zdGF0ZQorCQkJCQkJCQkJICAoaEhhbCwgY291bnQpKQorCQkJCQkJCSAgKTsKKworCQkJCQlsZW4gKz0gYnVmOworCQkJCQljaGVjaysrOworCQkJCX0KKwkJCQljb3VudCsrOworCQkJfQorCQl9CisKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXRV9HRVRfQ0ZHOgorCXsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzOiBQcmludGluZyBDTEQgZ2xvYmFsIElOSSBDb25maWciLAorCQkJICBfX2Z1bmNfXyk7CisJCWhkZF9jZmdfZ2V0X2dsb2JhbF9jb25maWcoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlciksCisJCQkJCSAgZXh0cmEsCisJCQkJCSAgUUNTQVBfSU9DVExfTUFYX1NUUl9MRU4pOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOworCQlicmVhazsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwljYXNlIFdFX0dFVF9SU1NJOgorCXsKKwkJaW50OF90IHM3UnNzaSA9IDA7CisJCXdsYW5faGRkX2dldF9yc3NpKHBBZGFwdGVyLCAmczdSc3NpKTsKKwkJc25wcmludGYoZXh0cmEsIFdFX01BWF9TVFJfTEVOLCAicnNzaT0lZCIsIHM3UnNzaSk7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJY2FzZSBXRV9HRVRfV01NX1NUQVRVUzoKKwl7CisJCXNucHJpbnRmKGV4dHJhLCBXRV9NQVhfU1RSX0xFTiwKKwkJCSAiXG5EaXI6IDA9dXAsIDE9ZG93biwgMz1ib3RoXG4iCisJCQkgInwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4iCisJCQkgInxBQyB8IEFDTSB8QWRtaXR0ZWR8IERpciB8XG4iCisJCQkgInwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4iCisJCQkgInxWTyB8ICAlZCAgfCAgJTNzICAgfCAgJWQgIHxcbiIKKwkJCSAifFZJIHwgICVkICB8ICAlM3MgICB8ICAlZCAgfFxuIgorCQkJICJ8QkUgfCAgJWQgIHwgICUzcyAgIHwgICVkICB8XG4iCisJCQkgInxCSyB8ICAlZCAgfCAgJTNzICAgfCAgJWQgIHxcbiIKKwkJCSAifC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiIsCisJCQkgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy4KKwkJCSB3bW1BY1N0YXR1c1tTTUVfQUNfVk9dLndtbUFjQWNjZXNzUmVxdWlyZWQsCisJCQkgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy4KKwkJCSB3bW1BY1N0YXR1c1tTTUVfQUNfVk9dLgorCQkJIHdtbUFjQWNjZXNzQWxsb3dlZCA/ICJZRVMiIDogIk5PIiwKKwkJCSBwQWRhcHRlci0+aGRkV21tU3RhdHVzLgorCQkJIHdtbUFjU3RhdHVzW1NNRV9BQ19WT10ud21tQWNUc3BlY0luZm8uCisJCQkgdHNfaW5mby5kaXJlY3Rpb24sCisJCQkgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy4KKwkJCSB3bW1BY1N0YXR1c1tTTUVfQUNfVkldLndtbUFjQWNjZXNzUmVxdWlyZWQsCisJCQkgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy4KKwkJCSB3bW1BY1N0YXR1c1tTTUVfQUNfVkldLgorCQkJIHdtbUFjQWNjZXNzQWxsb3dlZCA/ICJZRVMiIDogIk5PIiwKKwkJCSBwQWRhcHRlci0+aGRkV21tU3RhdHVzLgorCQkJIHdtbUFjU3RhdHVzW1NNRV9BQ19WSV0ud21tQWNUc3BlY0luZm8uCisJCQkgdHNfaW5mby5kaXJlY3Rpb24sCisJCQkgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy4KKwkJCSB3bW1BY1N0YXR1c1tTTUVfQUNfQkVdLndtbUFjQWNjZXNzUmVxdWlyZWQsCisJCQkgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy4KKwkJCSB3bW1BY1N0YXR1c1tTTUVfQUNfQkVdLgorCQkJIHdtbUFjQWNjZXNzQWxsb3dlZCA/ICJZRVMiIDogIk5PIiwKKwkJCSBwQWRhcHRlci0+aGRkV21tU3RhdHVzLgorCQkJIHdtbUFjU3RhdHVzW1NNRV9BQ19CRV0ud21tQWNUc3BlY0luZm8uCisJCQkgdHNfaW5mby5kaXJlY3Rpb24sCisJCQkgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy4KKwkJCSB3bW1BY1N0YXR1c1tTTUVfQUNfQktdLndtbUFjQWNjZXNzUmVxdWlyZWQsCisJCQkgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy4KKwkJCSB3bW1BY1N0YXR1c1tTTUVfQUNfQktdLgorCQkJIHdtbUFjQWNjZXNzQWxsb3dlZCA/ICJZRVMiIDogIk5PIiwKKwkJCSBwQWRhcHRlci0+aGRkV21tU3RhdHVzLgorCQkJIHdtbUFjU3RhdHVzW1NNRV9BQ19CS10ud21tQWNUc3BlY0luZm8uCisJCQkgdHNfaW5mby5kaXJlY3Rpb24pOworCisJCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7CisJCWJyZWFrOworCX0KKwljYXNlIFdFX0dFVF9DSEFOTkVMX0xJU1Q6CisJeworCQlDREZfU1RBVFVTIHN0YXR1czsKKwkJdWludDhfdCBpLCBsZW47CisJCWNoYXIgKmJ1ZjsKKwkJdWludDhfdCB1YnVmW1dOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTl07CisJCXVpbnQ4X3QgdWJ1Zl9sZW4gPSBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU47CisJCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCQl0Q2hhbm5lbExpc3RJbmZvIGNoYW5uZWxfbGlzdDsKKworCQltZW1zZXQoJmNoYW5uZWxfbGlzdCwgMCwgc2l6ZW9mKGNoYW5uZWxfbGlzdCkpOworCQlzdGF0dXMgPQorCQkJaXdfc29mdGFwX2dldF9jaGFubmVsX2xpc3QoZGV2LCBpbmZvLCB3cnF1LAorCQkJCQkJICAgKGNoYXIgKikmY2hhbm5lbF9saXN0KTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJHZXRDaGFubmVsTGlzdCBGYWlsZWQhISEiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlidWYgPSBleHRyYTsKKwkJLyoKKwkJICogTWF4aW11bSBjaGFubmVscyA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTi4KKwkJICogTWF4aW11bSBidWZmZXIgbmVlZGVkID0gNSAqIG51bWJlciBvZiBjaGFubmVscy4KKwkJICogQ2hlY2sgaWZzdWZmaWNpZW50IGJ1ZmZlciBpcyBhdmFpbGFibGUgYW5kIHRoZW4KKwkJICogcHJvY2VlZCB0byBmaWxsIHRoZSBidWZmZXIuCisJCSAqLworCQlpZiAoV0VfTUFYX1NUUl9MRU4gPAorCQkgICAgKDUgKiBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pKSB7CisJCQloZGRMb2coTE9HRSwKKwkJCSAgICAgICBGTCgiSW5zdWZmaWNpZW50IEJ1ZmZlciB0byBwb3B1bGF0ZSBjaGFubmVsIGxpc3QiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlsZW4gPSBzY25wcmludGYoYnVmLCBXRV9NQVhfU1RSX0xFTiwgIiV1ICIsCisJCQkJY2hhbm5lbF9saXN0Lm51bV9jaGFubmVscyk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc21lX2dldF9jb3VudHJ5X2NvZGUoaGRkX2N0eC0+aEhhbCwKKwkJCQkJCXVidWYsICZ1YnVmX2xlbikpIHsKKwkJCS8qIFByaW50aW5nIENvdW50cnkgY29kZSBpbiBnZXRDaGFubmVsTGlzdCAqLworCQkJZm9yIChpID0gMDsgaSA8ICh1YnVmX2xlbiAtIDEpOyBpKyspCisJCQkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sCisJCQkJCQlXRV9NQVhfU1RSX0xFTiAtIGxlbiwKKwkJCQkJCSIlYyIsIHVidWZbaV0pOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsX2xpc3QubnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJCWxlbiArPQorCQkJCXNjbnByaW50ZihidWYgKyBsZW4sIFdFX01BWF9TVFJfTEVOIC0gbGVuLAorCQkJCQkgICIgJXUiLCBjaGFubmVsX2xpc3QuY2hhbm5lbHNbaV0pOworCQl9CisJCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7CisKKwkJYnJlYWs7CisJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJY2FzZSBXRV9HRVRfVERMU19QRUVSUzoKKwl7CisJCXdycXUtPmRhdGEubGVuZ3RoID0KKwkJCXdsYW5faGRkX3RkbHNfZ2V0X2FsbF9wZWVycyhwQWRhcHRlciwgZXh0cmEsCisJCQkJCQkgICAgV0VfTUFYX1NUUl9MRU4pICsgMTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWNhc2UgV0VfR0VUXzExV19JTkZPOgorCXsKKwkJaGRkTG9nKExPR0UsICJXRV9HRVRfMTFXX0VOQUJMRUQgPSAlZCIsCisJCSAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5NRlBFbmFibGVkKTsKKworCQlzbnByaW50ZihleHRyYSwgV0VfTUFYX1NUUl9MRU4sCisJCQkgIlxuIEJTU0lEICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYLCBJcyBQTUYgQXNzb2M/ICVkIgorCQkJICJcbiBOdW1iZXIgb2YgVW5wcm90ZWN0ZWQgRGlzYXNzb2NzICVkIgorCQkJICJcbiBOdW1iZXIgb2YgVW5wcm90ZWN0ZWQgRGVhdXRocyAlZCIsCisJCQkgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuQlNTSURzLmJzc2lkLT5ieXRlc1swXSwKKwkJCSBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5CU1NJRHMuYnNzaWQtPmJ5dGVzWzFdLAorCQkJIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkJTU0lEcy5ic3NpZC0+Ynl0ZXNbMl0sCisJCQkgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuQlNTSURzLmJzc2lkLT5ieXRlc1szXSwKKwkJCSBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5CU1NJRHMuYnNzaWQtPmJ5dGVzWzRdLAorCQkJIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkJTU0lEcy5ic3NpZC0+Ynl0ZXNbNV0sCisJCQkgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuTUZQRW5hYmxlZCwKKwkJCSBwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFBtZlN0YXRzLgorCQkJIG51bVVucHJvdERpc2Fzc29jUngsCisJCQkgcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRQbWZTdGF0cy4KKwkJCSBudW1VbnByb3REZWF1dGhSeCk7CisKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisJY2FzZSBXRV9HRVRfUEhZTU9ERToKKwl7CisJCWJvb2wgY2hfYm9uZDI0ID0gZmFsc2UsIGNoX2JvbmQ1ZyA9IGZhbHNlOworCQloZGRfY29udGV4dF90ICpoZGRjdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwkJdEhhbEhhbmRsZSBoYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJCWVDc3JQaHlNb2RlIHBoeW1vZGU7CisJCWVDc3JCYW5kIGN1cnJCYW5kOworCQl0U21lQ29uZmlnUGFyYW1zIHNtZWNvbmZpZzsKKworCQlzbWVfZ2V0X2NvbmZpZ19wYXJhbShoYWwsICZzbWVjb25maWcpOworCQlpZiAoV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFICE9CisJCSAgICBzbWVjb25maWcuY3NyQ29uZmlnLmNoYW5uZWxCb25kaW5nTW9kZTI0R0h6KQorCQkJY2hfYm9uZDI0ID0gdHJ1ZTsKKworCQlpZiAoV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFICE9CisJCSAgICBzbWVjb25maWcuY3NyQ29uZmlnLmNoYW5uZWxCb25kaW5nTW9kZTVHSHopCisJCQljaF9ib25kNWcgPSB0cnVlOworCisJCXBoeW1vZGUgPSBzbWVfZ2V0X3BoeV9tb2RlKGhhbCk7CisJCWlmICgoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCSAgICAgc21lX2dldF9mcmVxX2JhbmQoaGFsLCAmY3VyckJhbmQpKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiJXM6IEZhaWxlZCB0byBnZXQgY3VycmVudCBiYW5kIGNvbmZpZyIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCXN3aXRjaCAocGh5bW9kZSkgeworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV9BVVRPOgorCQkJc25wcmludGYoZXh0cmEsIFdFX01BWF9TVFJfTEVOLCAiQVVUTyBNT0RFIik7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFuOgorCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMW5fT05MWToKKwkJCWlmIChjdXJyQmFuZCA9PSBlQ1NSX0JBTkRfMjQpIHsKKwkJCQlpZiAoY2hfYm9uZDI0KQorCQkJCQlzbnByaW50ZihleHRyYSwgV0VfTUFYX1NUUl9MRU4sCisJCQkJCQkgIjExTkdIVDQwIik7CisJCQkJZWxzZQorCQkJCQlzbnByaW50ZihleHRyYSwgV0VfTUFYX1NUUl9MRU4sCisJCQkJCQkgIjExTkdIVDIwIik7CisJCQl9IGVsc2UgaWYgKGN1cnJCYW5kID09IGVDU1JfQkFORF81RykgeworCQkJCWlmIChjaF9ib25kNWcpCisJCQkJCXNucHJpbnRmKGV4dHJhLCBXRV9NQVhfU1RSX0xFTiwKKwkJCQkJCSAiMTFOQUhUNDAiKTsKKwkJCQllbHNlCisJCQkJCXNucHJpbnRmKGV4dHJhLCBXRV9NQVhfU1RSX0xFTiwKKwkJCQkJCSAiMTFOQUhUMjAiKTsKKwkJCX0gZWxzZSB7CisJCQkJc25wcmludGYoZXh0cmEsIFdFX01BWF9TVFJfTEVOLCAiMTFOIik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0RPVDExX01PREVfYWJnOgorCQkJc25wcmludGYoZXh0cmEsIFdFX01BWF9TVFJfTEVOLCAiMTFBQkciKTsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWE6CisJCQlzbnByaW50ZihleHRyYSwgV0VfTUFYX1NUUl9MRU4sICIxMUEiKTsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWI6CisJCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZOgorCQkJc25wcmludGYoZXh0cmEsIFdFX01BWF9TVFJfTEVOLCAiMTFCIik7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFnOgorCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWToKKwkJCXNucHJpbnRmKGV4dHJhLCBXRV9NQVhfU1RSX0xFTiwgIjExRyIpOworCQkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFhYzoKKwkJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFhY19PTkxZOgorCQkJaWYgKGhkZGN0eC0+Y29uZmlnLT52aHRDaGFubmVsV2lkdGggPT0KKwkJCSAgICBlSFRfQ0hBTk5FTF9XSURUSF8yME1IWikKKwkJCQlzbnByaW50ZihleHRyYSwgV0VfTUFYX1NUUl9MRU4sCisJCQkJCSAiMTFBQ1ZIVDIwIik7CisJCQllbHNlIGlmIChoZGRjdHgtPmNvbmZpZy0+dmh0Q2hhbm5lbFdpZHRoID09CisJCQkJIGVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaKQorCQkJCXNucHJpbnRmKGV4dHJhLCBXRV9NQVhfU1RSX0xFTiwKKwkJCQkJICIxMUFDVkhUNDAiKTsKKwkJCWVsc2UgaWYgKGhkZGN0eC0+Y29uZmlnLT52aHRDaGFubmVsV2lkdGggPT0KKwkJCQkgZUhUX0NIQU5ORUxfV0lEVEhfODBNSFopCisJCQkJc25wcmludGYoZXh0cmEsIFdFX01BWF9TVFJfTEVOLAorCQkJCQkgIjExQUNWSFQ4MCIpOworCQkJZWxzZSBpZiAoaGRkY3R4LT5jb25maWctPnZodENoYW5uZWxXaWR0aCA9PQorCQkJCSBlSFRfQ0hBTk5FTF9XSURUSF8xNjBNSFopCisJCQkJc25wcmludGYoZXh0cmEsIFdFX01BWF9TVFJfTEVOLAorCQkJCQkgIjExQUNWSFQxNjAiKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOworCQlicmVhazsKKwl9CisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKwljYXNlIFdFX0dFVF9PRU1fREFUQV9DQVA6CisJeworCQlyZXR1cm4gaXdfZ2V0X29lbV9kYXRhX2NhcChkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwl9CisjZW5kaWYgLyogRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUICovCisJY2FzZSBXRV9HRVRfU05SOgorCXsKKwkJaW50OF90IHM3c25yID0gMDsKKwkJaW50IHN0YXR1cyA9IDA7CisJCWhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisJCWhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4OworCQlwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJCXN0YXR1cyA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQocEhkZEN0eCk7CisJCWlmICgwICE9IHN0YXR1cykgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIiVzOiBnZXRTTlI6IEhERCBjb250ZXh0IGlzIG5vdCB2YWxpZCIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisJCWlmICgwID09IHBIZGRDdHgtPmNvbmZpZy0+ZkVuYWJsZVNOUk1vbml0b3JpbmcgfHwKKwkJICAgIGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCAhPQorCQkgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgIiVzOiBnZXRTTlIgZmFpbGVkOiBFbmFibGUgU05SIE1vbml0b3JpbmctJWQsIgorCQkJICAgICAgICIgQ29ubmVjdGlvblN0YXRlLSVkIiwgX19mdW5jX18sCisJCQkgICAgICAgcEhkZEN0eC0+Y29uZmlnLT5mRW5hYmxlU05STW9uaXRvcmluZywKKwkJCSAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKTsKKwkJCXJldHVybiAtRU5PTkVUOworCQl9CisJCXdsYW5faGRkX2dldF9zbnIocEFkYXB0ZXIsICZzN3Nucik7CisJCXNucHJpbnRmKGV4dHJhLCBXRV9NQVhfU1RSX0xFTiwgInNucj0lZCIsIHM3c25yKTsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJeworCQloZGRMb2coTE9HRSwgIiVzOiBJbnZhbGlkIElPQ1RMIGNvbW1hbmQgJWQiLCBfX2Z1bmNfXywKKwkJICAgICAgIHN1Yl9jbWQpOworCQlicmVhazsKKwl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfZ2V0X2NoYXJfc2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19nZXRfY2hhcl9zZXRub25lKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXdfc2V0bm9uZV9nZXRub25lKCkgLSBHZW5lcmljICJhY3Rpb24iIHByaXZhdGUgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfc2V0bm9uZV9nZXRub25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaW50IHJldDsKKwlpbnQgc3ViX2NtZDsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworI2lmZGVmIENPTkZJR19DT01QQVQKKwkvKiB0aGlzIGlvY3RsIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIGEgc3ViLWlvY3RsIGlzIHVzZWQgYW5kIGJvdGgKKwkgKiB0aGUgbnVtYmVyIG9mIGdldCBhbmQgc2V0IGFyZ3MgaXMgMC4gIGluIHRoaXMgc3BlY2lmaWMgY2FzZSB0aGUKKwkgKiBsb2dpYyBpbiBpd3ByaXYgcGxhY2VzIHRoZSBzdWJfY21kIGluIHRoZSBkYXRhLmZsYWdzIHBvcnRpb24gb2YKKwkgKiB0aGUgaXdyZXEuICB1bmZvcnR1bmF0ZWx5IHRoZSBsb2NhdGlvbiBvZiB0aGlzIGZpZWxkIHdpbGwgYmUKKwkgKiBkaWZmZXJlbnQgYmV0d2VlbiAzMi1iaXQgYW5kIDY0LWJpdCB1c2Vyc3BhY2UsIGFuZCB0aGUgc3RhbmRhcmQKKwkgKiBjb21wYXQgc3VwcG9ydCBpbiB0aGUga2VybmVsIGRvZXMgbm90IGhhbmRsZSB0aGlzIGNhc2UuICBzbyB3ZQorCSAqIG5lZWQgdG8gZXhwbGljaXRseSBoYW5kbGUgaXQgaGVyZS4KKwkgKi8KKwlpZiAoaXNfY29tcGF0X3Rhc2soKSkgeworCQlzdHJ1Y3QgY29tcGF0X2l3X3BvaW50ICpjb21wYXRfaXdfcG9pbnQgPQorCQkJKHN0cnVjdCBjb21wYXRfaXdfcG9pbnQgKikmd3JxdS0+ZGF0YTsKKwkJc3ViX2NtZCA9IGNvbXBhdF9pd19wb2ludC0+ZmxhZ3M7CisJfSBlbHNlIHsKKwkJc3ViX2NtZCA9IHdycXUtPmRhdGEuZmxhZ3M7CisJfQorI2Vsc2UKKwlzdWJfY21kID0gd3JxdS0+ZGF0YS5mbGFnczsKKyNlbmRpZgorCisJc3dpdGNoIChzdWJfY21kKSB7CisJY2FzZSBXRV9HRVRfUkVDT1ZFUllfU1RBVDoKKwl7CisJCXRIYWxIYW5kbGUgaGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCQlzbWVfZ2V0X3JlY292ZXJ5X3N0YXRzKGhhbCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgV0VfU0VUX1JFQVNTT0NfVFJJR0dFUjoKKwl7CisJCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwkJdWludDMyX3Qgcm9hbUlkID0gMDsKKwkJdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzIG1vZFByb2ZpbGVGaWVsZHM7CisJCWhkZF9zdGF0aW9uX2N0eF90ICpoZGRfc3RhX2N0eCA9CisJCQkJICAgV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKwkJLyogUmVhc3NvYyB0byBzYW1lIEFQLCBvbmx5IHN1cHBvcnRlZCBmb3IgT3BlbiBTZWN1cml0eSovCisJCWlmICgoaGRkX3N0YV9jdHgtPmNvbm5faW5mby51Y0VuY3J5cHRpb25UeXBlIHx8CisJCQkgIGhkZF9zdGFfY3R4LT5jb25uX2luZm8ubWNFbmNyeXB0aW9uVHlwZSkpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICBGTCgiUmVhc3NvYyB0byBzYW1lIEFQLCBvbmx5IHN1cHBvcnRlZCBmb3IgT3BlbiBTZWN1cml0eSIpKTsKKwkJCXJldHVybiAtRU5PVFNVUFA7CisJCX0KKworCQlzbWVfZ2V0X21vZGlmeV9wcm9maWxlX2ZpZWxkcyhoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgICAmbW9kUHJvZmlsZUZpZWxkcyk7CisJCXNtZV9yb2FtX3JlYXNzb2MoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkgTlVMTCwgbW9kUHJvZmlsZUZpZWxkcywgJnJvYW1JZCwgMSk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgV0VfRFVNUF9BR0NfU1RBUlQ6CisJeworCQloZGRMb2coTE9HMSwgIldFX0RVTVBfQUdDX1NUQVJUIik7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBHRU5fUEFSQU1fRFVNUF9BR0NfU1RBUlQsCisJCQkJCSAgMCwgR0VOX0NNRCk7CisJCWJyZWFrOworCX0KKwljYXNlIFdFX0RVTVBfQUdDOgorCXsKKwkJaGRkTG9nKExPRzEsICJXRV9EVU1QX0FHQyIpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgR0VOX1BBUkFNX0RVTVBfQUdDLAorCQkJCQkgIDAsIEdFTl9DTUQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFdFX0RVTVBfQ0hBTklORk9fU1RBUlQ6CisJeworCQloZGRMb2coTE9HMSwgIldFX0RVTVBfQ0hBTklORk9fU1RBUlQiKTsKKwkJcmV0ID0gd21hX2NsaV9zZXRfY29tbWFuZChwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgIEdFTl9QQVJBTV9EVU1QX0NIQU5JTkZPX1NUQVJULAorCQkJCQkgIDAsIEdFTl9DTUQpOworCQlicmVhazsKKwl9CisJY2FzZSBXRV9EVU1QX0NIQU5JTkZPOgorCXsKKwkJaGRkTG9nKExPRzEsICJXRV9EVU1QX0NIQU5JTkZPX1NUQVJUIik7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBHRU5fUEFSQU1fRFVNUF9DSEFOSU5GTywKKwkJCQkJICAwLCBHRU5fQ01EKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgV0VfRFVNUF9XQVRDSERPRzoKKwl7CisJCWhkZExvZyhMT0cxLCAiV0VfRFVNUF9XQVRDSERPRyIpOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgR0VOX1BBUkFNX0RVTVBfV0FUQ0hET0csCisJCQkJCSAgMCwgR0VOX0NNRCk7CisJCWJyZWFrOworCX0KKyNpZmRlZiBDT05GSUdfQVRIX1BDSUVfQUNDRVNTX0RFQlVHCisJY2FzZSBXRV9EVU1QX1BDSUVfTE9HOgorCXsKKwkJaGRkTG9nKExPR0UsICJXRV9EVU1QX1BDSUVfTE9HIik7CisJCXJldCA9IHdtYV9jbGlfc2V0X2NvbW1hbmQocEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkJICBHRU5fUEFSQU1fRFVNUF9QQ0lFX0FDQ0VTU19MT0csCisJCQkJCSAgMCwgR0VOX0NNRCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCWRlZmF1bHQ6CisJeworCQloZGRMb2coTE9HRSwgIiVzOiB1bmtub3duIGlvY3RsICVkIiwgX19mdW5jX18sIHN1Yl9jbWQpOworCQlicmVhazsKKwl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpd19zZXRub25lX2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldG5vbmVfZ2V0bm9uZShkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9faXdfc2V0X3Zhcl9pbnRzX2dldG5vbmUgLSBHZW5lcmljICJzZXQgbWFueSIgcHJpdmF0ZSBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogVGhpcyBpcyBhbiBTU1ItcHJvdGVjdGVkIGdlbmVyaWMgaGFuZGxlciBmb3IgcHJpdmF0ZSBpb2N0bHMgd2hpY2gKKyAqIHRha2UgbXVsdGlwbGUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgYWxzbworICogc29tZXdoYXQgdW5pcXVlIGluIHRoYXQgaXQgaXMgc2hhcmVkIGJ5IGJvdGggU1RBLW1vZGUgYW5kIFNBUC1tb2RlCisgKiBpbnRlcmZhY2VzLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfc2V0X3Zhcl9pbnRzX2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwlpbnQgc3ViX2NtZDsKKwlpbnQgKmFwcHNfYXJncyA9IChpbnQgKikgZXh0cmE7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0LCBudW1fYXJnczsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChleHRyYSA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiTlVMTCBleHRyYSBidWZmZXIgcG9pbnRlciIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3ViX2NtZCA9IHdycXUtPmRhdGEuZmxhZ3M7CisJbnVtX2FyZ3MgPSB3cnF1LT5kYXRhLmxlbmd0aDsKKworCWhkZExvZyhMT0cxLCBGTCgiUmVjZWl2ZWQgbGVuZ3RoICVkIiksIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCXN3aXRjaCAoc3ViX2NtZCkgeworCisJY2FzZSBXRV9QMlBfTk9BX0NNRDoKKwl7CisJCXAycF9hcHBfc2V0UDJwUHNfdCBwMnBOb0E7CisKKwkJcDJwTm9BLm9wcF9wcyA9IGFwcHNfYXJnc1swXTsKKwkJcDJwTm9BLmN0V2luZG93ID0gYXBwc19hcmdzWzFdOworCQlwMnBOb0EuZHVyYXRpb24gPSBhcHBzX2FyZ3NbMl07CisJCXAycE5vQS5pbnRlcnZhbCA9IGFwcHNfYXJnc1szXTsKKwkJcDJwTm9BLmNvdW50ID0gYXBwc19hcmdzWzRdOworCQlwMnBOb0Euc2luZ2xlX25vYV9kdXJhdGlvbiA9IGFwcHNfYXJnc1s1XTsKKwkJcDJwTm9BLnBzU2VsZWN0aW9uID0gYXBwc19hcmdzWzZdOworCisJCWhkZExvZyhMT0cxLAorCQkgICAgICAgIiVzOiBQMlBfTk9BX0FUVFI6b3BwUFMgJWQgY3RXaW5kb3cgJWQgZHVyYXRpb24gJWQgIgorCQkgICAgICAgImludGVydmFsICVkIGNvdW50ICVkIHNpbmdsZSBub2EgZHVyYXRpb24gJWQgUHNTZWxlY3Rpb24gJXgiLAorCQkgICAgICAgX19mdW5jX18sIGFwcHNfYXJnc1swXSwgYXBwc19hcmdzWzFdLAorCQkgICAgICAgYXBwc19hcmdzWzJdLCBhcHBzX2FyZ3NbM10sIGFwcHNfYXJnc1s0XSwKKwkJICAgICAgIGFwcHNfYXJnc1s1XSwgYXBwc19hcmdzWzZdKTsKKworCQloZGRfc2V0X3AycF9wcyhkZXYsICZwMnBOb0EpOworCisJfQorCWJyZWFrOworCisJY2FzZSBXRV9NVFJBQ0VfU0VMRUNUSVZFX01PRFVMRV9MT0dfRU5BQkxFX0NNRDoKKwl7CisJCWhkZExvZyhMT0cxLCAiJXM6IFNFTEVDVElWRV9NT0RVTEVfTE9HICVkIGFyZzEgJWQgYXJnMiIsCisJCSAgICAgICBfX2Z1bmNfXywgYXBwc19hcmdzWzBdLCBhcHBzX2FyZ3NbMV0pOworCQljZGZfdHJhY2VfZW5hYmxlKGFwcHNfYXJnc1swXSwgYXBwc19hcmdzWzFdKTsKKwl9CisJYnJlYWs7CisKKwljYXNlIFdFX01UUkFDRV9EVU1QX0NNRDoKKwl7CisJCWhkZExvZyhMT0cxLAorCQkgICAgICAgIiVzOiBNVFJBQ0VfRFVNUCBjb2RlICVkIHNlc3Npb24gJWQgY291bnQgJWQgIgorCQkgICAgICAgImJpdG1hc2tfb2ZfbW9kdWxlICVkICIsIF9fZnVuY19fLCBhcHBzX2FyZ3NbMF0sCisJCSAgICAgICBhcHBzX2FyZ3NbMV0sIGFwcHNfYXJnc1syXSwgYXBwc19hcmdzWzNdKTsKKwkJY2RmX3RyYWNlX2R1bXBfYWxsKCh2b2lkICopaEhhbCwgYXBwc19hcmdzWzBdLAorCQkJCSAgIGFwcHNfYXJnc1sxXSwgYXBwc19hcmdzWzJdLAorCQkJCSAgIGFwcHNfYXJnc1szXSk7CisKKwl9CisJYnJlYWs7CisKKwljYXNlIFdFX1BPTElDWV9NQU5BR0VSX0NMSVNUX0NNRDoKKwl7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoIjxpd3ByaXYgd2xhbjAgcG1fY2xpc3Q+IGlzIGNhbGxlZFxuIikpOworCQljZHNfaW5jcl9jb25uZWN0aW9uX2NvdW50X3V0ZncoaGRkX2N0eCwgYXBwc19hcmdzWzBdLAorCQkJYXBwc19hcmdzWzFdLCBhcHBzX2FyZ3NbMl0sIGFwcHNfYXJnc1szXSwKKwkJCWFwcHNfYXJnc1s0XSwgYXBwc19hcmdzWzVdLCBhcHBzX2FyZ3NbNl0sCisJCQlhcHBzX2FyZ3NbN10pOworCX0KKwlicmVhazsKKworCWNhc2UgV0VfUE9MSUNZX01BTkFHRVJfRExJU1RfQ01EOgorCXsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiPGl3cHJpdiB3bGFuMCBwbV9kbGlzdD4gaXMgY2FsbGVkXG4iKSk7CisJCWNkc19kZWNyX2Nvbm5lY3Rpb25fY291bnRfdXRmdyhoZGRfY3R4LCBhcHBzX2FyZ3NbMF0sCisJCQlhcHBzX2FyZ3NbMV0pOworCX0KKwlicmVhazsKKworCWNhc2UgV0VfUE9MSUNZX01BTkFHRVJfVUxJU1RfQ01EOgorCXsKKwkJaGRkTG9nKExPR0UsCisJCQlGTCgiPGl3cHJpdiB3bGFuMCBwbV91bGlzdD4gaXMgY2FsbGVkXG4iKSk7CisJCWNkc191cGRhdGVfY29ubmVjdGlvbl9pbmZvX3V0ZncoaGRkX2N0eCwgYXBwc19hcmdzWzBdLAorCQkJYXBwc19hcmdzWzFdLCBhcHBzX2FyZ3NbMl0sIGFwcHNfYXJnc1szXSwKKwkJCWFwcHNfYXJnc1s0XSwgYXBwc19hcmdzWzVdLCBhcHBzX2FyZ3NbNl0sCisJCQlhcHBzX2FyZ3NbN10pOworCX0KKwlicmVhazsKKworCWNhc2UgV0VfUE9MSUNZX01BTkFHRVJfREJTX0NNRDoKKwl7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoIjxpd3ByaXYgd2xhbjAgcG1fZGJzPiBpcyBjYWxsZWRcbiIpKTsKKwkJaWYgKGFwcHNfYXJnc1swXSA9PSAwKQorCQkJd21hX3NldF9kYnNfY2FwYWJpbGl0eV91dCgwKTsKKwkJZWxzZQorCQkJd21hX3NldF9kYnNfY2FwYWJpbGl0eV91dCgxKTsKKworCQlpZiAoYXBwc19hcmdzWzFdID49IENEU19USFJPVUdIUFVUICYmCisJCQlhcHBzX2FyZ3NbMV0gPD0gQ0RTX0xBVEVOQ1kpIHsKKwkJCXByX2luZm8oInNldHRpbmcgc3lzdGVtIHByZWYgdG8gWyVkXVxuIiwgYXBwc19hcmdzWzFdKTsKKwkJCWhkZF9jdHgtPmNvbmZpZy0+Y29uY19zeXN0ZW1fcHJlZiA9IGFwcHNfYXJnc1sxXTsKKwkJfQorCX0KKwlicmVhazsKKworCWNhc2UgV0VfUE9MSUNZX01BTkFHRVJfUENMX0NNRDoKKwl7CisJCXVpbnQ4X3QgcGNsW01BWF9OVU1fQ0hBTl0gPSB7MH07CisJCXVpbnQzMl90IHBjbF9sZW4gPSAwLCBpID0gMDsKKworCQloZGRMb2coTE9HRSwKKwkJCUZMKCI8aXdwcml2IHdsYW4wIHBtX3BjbD4gaXMgY2FsbGVkXG4iKSk7CisKKwkJY2RzX2dldF9wY2woaGRkX2N0eCwgYXBwc19hcmdzWzBdLAorCQkJCXBjbCwgJnBjbF9sZW4pOworCQlwcl9pbmZvKCJQQ0wgbGlzdCBmb3Igcm9sZVslZF0gaXMgeyIsIGFwcHNfYXJnc1swXSk7CisJCWZvciAoaSA9IDAgOyBpIDwgcGNsX2xlbjsgaSsrKQorCQkJcHJfaW5mbygiICVkLCAiLCBwY2xbaV0pOworCQlwcl9pbmZvKCJ9LS0tLS0tLS0tPlxuIik7CisJfQorCWJyZWFrOworCisJY2FzZSBXRV9QT0xJQ1lfTUFOQUdFUl9DSU5GT19DTUQ6CisJeworCQlzdHJ1Y3QgY2RzX2NvbmNfY29ubmVjdGlvbl9pbmZvICpjb25uX2luZm87CisJCXVpbnQzMl90IGkgPSAwLCBsZW4gPSAwOworCisJCWhkZExvZyhMT0dFLAorCQkJRkwoIjxpd3ByaXYgd2xhbjAgcG1fY2luZm8+IGlzIGNhbGxlZFxuIikpOworCQljb25uX2luZm8gPSBjZHNfZ2V0X2Nvbm5faW5mbyhoZGRfY3R4LCAmbGVuKTsKKwkJcHJfaW5mbygiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIik7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJcHJfaW5mbygifHRhYmxlX2luZGV4WyVkXVx0XHR8XG4iLCBpKTsKKwkJCXByX2luZm8oInxcdHx2ZGV2X2lkIC0gJWRcdFx0fFxuIiwgY29ubl9pbmZvLT52ZGV2X2lkKTsKKwkJCXByX2luZm8oInxcdHx0eF9zcGF0aWFsX3N0cmVhbSAtICVkXHR8XG4iLAorCQkJCQkJY29ubl9pbmZvLT50eF9zcGF0aWFsX3N0cmVhbSk7CisJCQlwcl9pbmZvKCJ8XHR8cnhfc3BhdGlhbF9zdHJlYW0gLSAlZFx0fFxuIiwKKwkJCQkJCWNvbm5faW5mby0+cnhfc3BhdGlhbF9zdHJlYW0pOworCQkJcHJfaW5mbygifFx0fGNoYWluX21hc2sgLSAlZFx0XHR8XG4iLAorCQkJCQkJY29ubl9pbmZvLT5jaGFpbl9tYXNrKTsKKwkJCXByX2luZm8oInxcdHxjaGFuIC0gJWRcdFx0fFxuIiwgY29ubl9pbmZvLT5jaGFuKTsKKwkJCXByX2luZm8oInxcdHxtb2RlIC0gJWRcdFx0fFxuIiwgY29ubl9pbmZvLT5tb2RlKTsKKwkJCXByX2luZm8oInxcdHxtYWMgLSAlZFx0XHR8XG4iLCBjb25uX2luZm8tPm1hYyk7CisJCQlwcl9pbmZvKCJ8XHR8aW5fdXNlIC0gJWRcdFx0fFxuIiwgY29ubl9pbmZvLT5pbl91c2UpOworCQkJcHJfaW5mbygiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIik7CisJCQljb25uX2luZm8rKzsKKwkJfQorCX0KKwlicmVhazsKKworCWNhc2UgV0VfUE9MSUNZX1NFVF9IV19NT0RFX0NNRDoKKwl7CisJCWlmIChhcHBzX2FyZ3NbMF0gPT0gMCkgeworCQkJaGRkTG9nKExPR0UsCisJCQkJRkwoInNldCBodyBtb2RlIGZvciBzaW5nbGUgbWFjXG4iKSk7CisJCQljZHNfc29jX3NldF9od19tb2RlKGhkZF9jdHgsIEhXX01PREVfU1NfMngyLAorCQkJCQlIV19NT0RFXzgwX01IWiwKKwkJCQkJSFdfTU9ERV9TU18weDAsIEhXX01PREVfQldfTk9ORSwKKwkJCQkJSFdfTU9ERV9EQlNfTk9ORSwKKwkJCQkJSFdfTU9ERV9BR0lMRV9ERlNfTk9ORSk7CisJCX0gZWxzZSBpZiAoYXBwc19hcmdzWzBdID09IDEpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJCUZMKCJzZXQgaHcgbW9kZSBmb3IgZHVhbCBtYWNcbiIpKTsKKwkJCWNkc19zb2Nfc2V0X2h3X21vZGUoaGRkX2N0eCwgSFdfTU9ERV9TU18xeDEsCisJCQkJCUhXX01PREVfODBfTUhaLAorCQkJCQlIV19NT0RFX1NTXzF4MSwgSFdfTU9ERV80MF9NSFosCisJCQkJCUhXX01PREVfREJTLAorCQkJCQlIV19NT0RFX0FHSUxFX0RGU19OT05FKTsKKwkJfQorCX0KKwlicmVhazsKKworCWNhc2UgV0VfUE9MSUNZX01BTkFHRVJfUVVFUllfQUNUSU9OX0NNRDoKKwl7CisJCWVudW0gY2RzX2NvbmNfbmV4dF9hY3Rpb24gYWN0aW9uOworCQloZGRMb2coTE9HRSwKKwkJCUZMKCI8aXdwcml2IHdsYW4wIHBtX3F1ZXJ5X2FjdGlvbj4gaXMgY2FsbGVkXG4iKSk7CisJCWFjdGlvbiA9IGNkc19jdXJyZW50X2Nvbm5lY3Rpb25zX3VwZGF0ZShoZGRfY3R4LAorCQkJCWFwcHNfYXJnc1swXSk7CisJCXByX2luZm8oIm5leHQgYWN0aW9uIGlzICVkIHtIRERfTk9QID0gMCwgSEREX0RCUywgSEREX0RCU19ET1dOR1JBREUsIEhERF9NQ0MsIEhERF9NQ0NfVVBHUkFERX0iLCBhY3Rpb24pOworCX0KKwlicmVhazsKKwljYXNlIFdFX1BPTElDWV9NQU5BR0VSX1FVRVJZX0FMTE9XX0NNRDoKKwl7CisJCWJvb2wgYWxsb3c7CisJCWhkZExvZyhMT0dFLAorCQkJRkwoIjxpd3ByaXYgd2xhbjAgcG1fcXVlcnlfYWxsb3c+IGlzIGNhbGxlZFxuIikpOworCQlhbGxvdyA9IGNkc19hbGxvd19jb25jdXJyZW5jeShoZGRfY3R4LAorCQkJCWFwcHNfYXJnc1swXSwgYXBwc19hcmdzWzFdLCBhcHBzX2FyZ3NbMl0pOworCQlwcl9pbmZvKCJhbGxvdyAlZCB7MCA9IGRvbid0IGFsbG93LCAxID0gYWxsb3d9IiwgYWxsb3cpOworCX0KKwlicmVhazsKKworCWNhc2UgV0VfUE9MSUNZX01BTkFHRVJfU0NFTkFSSU9fQ01EOgorCXsKKwkJY2xlYW5fcmVwb3J0KGhkZF9jdHgpOworCQlpZiAoYXBwc19hcmdzWzBdID09IDEpIHsKKwkJCXdsYW5faGRkX29uZV9jb25uZWN0aW9uX3NjZW5hcmlvKGhkZF9jdHgpOworCQl9IGVsc2UgaWYgKGFwcHNfYXJnc1swXSA9PSAyKSB7CisJCQl3bGFuX2hkZF90d29fY29ubmVjdGlvbnNfc2NlbmFyaW8oaGRkX2N0eCwKKwkJCQk2LCBDRFNfVFdPX1RXTyk7CisJCQl3bGFuX2hkZF90d29fY29ubmVjdGlvbnNfc2NlbmFyaW8oaGRkX2N0eCwKKwkJCQkzNiwgQ0RTX1RXT19UV08pOworCQkJd2xhbl9oZGRfdHdvX2Nvbm5lY3Rpb25zX3NjZW5hcmlvKGhkZF9jdHgsCisJCQkJNiwgQ0RTX09ORV9PTkUpOworCQkJd2xhbl9oZGRfdHdvX2Nvbm5lY3Rpb25zX3NjZW5hcmlvKGhkZF9jdHgsCisJCQkJMzYsIENEU19PTkVfT05FKTsKKwkJfSBlbHNlIGlmIChhcHBzX2FyZ3NbMF0gPT0gMykgeworCQkJLyogTUNDIG9uIHNhbWUgYmFuZCB3aXRoIDJ4MiBzYW1lIG1hYyovCisJCQl3bGFuX2hkZF90aHJlZV9jb25uZWN0aW9uc19zY2VuYXJpbyhoZGRfY3R4LAorCQkJCTYsIDExLCBDRFNfVFdPX1RXTywgMCk7CisJCQkvKiBNQ0Mgb24gZGlmZiBiYW5kIHdpdGggMngyIHNhbWUgbWFjKi8KKwkJCXdsYW5faGRkX3RocmVlX2Nvbm5lY3Rpb25zX3NjZW5hcmlvKGhkZF9jdHgsCisJCQkJNiwgMzYsIENEU19UV09fVFdPLCAwKTsKKwkJCS8qIE1DQyBvbiBkaWZmIGJhbmQgd2l0aCAxeDEgZGlmZiBtYWMgKi8KKwkJCXdsYW5faGRkX3RocmVlX2Nvbm5lY3Rpb25zX3NjZW5hcmlvKGhkZF9jdHgsCisJCQkJMzYsIDYsIENEU19PTkVfT05FLCAwKTsKKwkJCS8qIE1DQyBvbiBkaWZmIGJhbmQgd2l0aCAxeDEgc2FtZSBtYWMgKi8KKwkJCXdsYW5faGRkX3RocmVlX2Nvbm5lY3Rpb25zX3NjZW5hcmlvKGhkZF9jdHgsCisJCQkJMzYsIDYsIENEU19PTkVfT05FLCAxKTsKKwkJCS8qIFNDQyBvbiBzYW1lIGJhbmQgd2l0aCAyeDIgc2FtZSBtYWMgKi8KKwkJCXdsYW5faGRkX3RocmVlX2Nvbm5lY3Rpb25zX3NjZW5hcmlvKGhkZF9jdHgsCisJCQkJMzYsIDM2LCBDRFNfVFdPX1RXTywgMCk7CisJCQkvKiBTQ0Mgb24gc2FtZSBiYW5kIHdpdGggMXgxIHNhbWUgbWFjICovCisJCQl3bGFuX2hkZF90aHJlZV9jb25uZWN0aW9uc19zY2VuYXJpbyhoZGRfY3R4LAorCQkJCTM2LCAzNiwgQ0RTX09ORV9PTkUsIDEpOworCQkJLyogTUNDIG9uIHNhbWUgYmFuZCB3aXRoIDJ4MiBzYW1lIG1hYyAqLworCQkJd2xhbl9oZGRfdGhyZWVfY29ubmVjdGlvbnNfc2NlbmFyaW8oaGRkX2N0eCwKKwkJCQkzNiwgMTQ5LCBDRFNfVFdPX1RXTywgMCk7CisJCQkvKiBNQ0Mgb24gc2FtZSBiYW5kIHdpdGggMXgxIHNhbWUgbWFjICovCisJCQl3bGFuX2hkZF90aHJlZV9jb25uZWN0aW9uc19zY2VuYXJpbyhoZGRfY3R4LAorCQkJCTM2LCAxNDksIENEU19PTkVfT05FLCAxKTsKKwkJfQorCQlwcmludF9yZXBvcnQoaGRkX2N0eCk7CisJfQorCWJyZWFrOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwljYXNlIFdFX1RETFNfQ09ORklHX1BBUkFNUzoKKwl7CisJCXRkbHNfY29uZmlnX3BhcmFtc190IHRkbHNQYXJhbXM7CisKKwkJdGRsc1BhcmFtcy50ZGxzID0gYXBwc19hcmdzWzBdOworCQl0ZGxzUGFyYW1zLnR4X3BlcmlvZF90ID0gYXBwc19hcmdzWzFdOworCQl0ZGxzUGFyYW1zLnR4X3BhY2tldF9uID0gYXBwc19hcmdzWzJdOworCQkvKiBpZ25vcmUgYXJnc1szXSBhcyBkaXNjb3ZlcnlfcGVyaW9kIGlzIG5vdCB1c2VkIGFueW1vcmUgKi8KKwkJdGRsc1BhcmFtcy5kaXNjb3ZlcnlfdHJpZXNfbiA9IGFwcHNfYXJnc1s0XTsKKwkJLyogaWdub3JlIGFyZ3NbNV0gYXMgaWRsZV90aW1lb3V0IGlzIG5vdCB1c2VkIGFueW1vcmUgKi8KKwkJdGRsc1BhcmFtcy5pZGxlX3BhY2tldF9uID0gYXBwc19hcmdzWzZdOworCQkvKiBpZ25vcmUgYXJnc1s3XSBhcyByc3NpX2h5c3RlcmVzaXMgaXMgbm90IHVzZWQgYW55bW9yZSAqLworCQl0ZGxzUGFyYW1zLnJzc2lfdHJpZ2dlcl90aHJlc2hvbGQgPSBhcHBzX2FyZ3NbOF07CisJCXRkbHNQYXJhbXMucnNzaV90ZWFyZG93bl90aHJlc2hvbGQgPSBhcHBzX2FyZ3NbOV07CisJCXRkbHNQYXJhbXMucnNzaV9kZWx0YSA9IGFwcHNfYXJnc1sxMF07CisKKwkJd2xhbl9oZGRfdGRsc19zZXRfcGFyYW1zKGRldiwgJnRkbHNQYXJhbXMpOworCX0KKwlicmVhazsKKyNlbmRpZgorCWNhc2UgV0VfVU5JVF9URVNUX0NNRDoKKwl7CisJCXRfd21hX3VuaXRfdGVzdF9jbWQgKnVuaXRUZXN0QXJnczsKKwkJY2RzX21zZ190IG1zZyA9IHsgMCB9OworCQlpbnQgaSwgajsKKwkJaWYgKChhcHBzX2FyZ3NbMF0gPCBXTEFOX01PRFVMRV9JRF9NSU4pIHx8CisJCSAgICAoYXBwc19hcmdzWzBdID49IFdMQU5fTU9EVUxFX0lEX01BWCkpIHsKKwkJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBNT0RVTEUgSUQgJWQiKSwKKwkJCSAgICAgICBhcHBzX2FyZ3NbMF0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGFwcHNfYXJnc1sxXSA+IChXTUFfTUFYX05VTV9BUkdTKSkgeworCQkJaGRkTG9nKExPR0UsIEZMKCJUb28gTWFueSBhcmdzICVkIiksCisJCQkgICAgICAgYXBwc19hcmdzWzFdKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXVuaXRUZXN0QXJncyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqdW5pdFRlc3RBcmdzKSk7CisJCWlmIChOVUxMID09IHVuaXRUZXN0QXJncykgeworCQkJaGRkTG9nKExPR0UsCisJCQkgICAgICAgRkwoImNkZl9tZW1fYWxsb2MgZmFpbGVkIGZvciB1bml0VGVzdEFyZ3MiKSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl1bml0VGVzdEFyZ3MtPnZkZXZfaWQgPSAoaW50KXBBZGFwdGVyLT5zZXNzaW9uSWQ7CisJCXVuaXRUZXN0QXJncy0+bW9kdWxlX2lkID0gYXBwc19hcmdzWzBdOworCQl1bml0VGVzdEFyZ3MtPm51bV9hcmdzID0gYXBwc19hcmdzWzFdOworCQlmb3IgKGkgPSAwLCBqID0gMjsgaSA8IHVuaXRUZXN0QXJncy0+bnVtX2FyZ3M7IGkrKywgaisrKSB7CisJCQl1bml0VGVzdEFyZ3MtPmFyZ3NbaV0gPSBhcHBzX2FyZ3Nbal07CisJCX0KKwkJbXNnLnR5cGUgPSBTSVJfSEFMX1VOSVRfVEVTVF9DTUQ7CisJCW1zZy5yZXNlcnZlZCA9IDA7CisJCW1zZy5ib2R5cHRyID0gdW5pdFRlc3RBcmdzOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCSAgICBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkgeworCQkJY2RmX21lbV9mcmVlKHVuaXRUZXN0QXJncyk7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTAorCQkJCQkgICgiTm90IGFibGUgdG8gcG9zdCBVTklUX1RFU1RfQ01EIG1lc3NhZ2UgdG8gV01BIikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0dQSU9fTEVEX0ZMQVNISU5HCisJY2FzZSBXRV9MRURfRkxBU0hJTkdfUEFSQU06CisJeworCQlpbnQgaTsKKwkJaWYgKG51bV9hcmdzICE9IDQpIHsKKwkJCWhkZExvZyhMT0dFLAorCQkJICAgICAgIEZMKCJncGlvX2NvbnRyb2w6IDQgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQiKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2FyZ3M7IGkrKykgeworCQkJaWYgKGFwcHNfYXJnc1tpXSA+PSAweDdmZmZmZmZmKSB7CisJCQkJaGRkTG9nKExPR0UsCisJCQkJICAgICAgIEZMKCJncGlvX2NvbnRyb2w6IHBhcmFtZXRlciBzaG91bGQgYmUgbGVzcyB0aGFuIDB4N2ZmZmZmZmYiKSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwkJc21lX3NldF9sZWRfZmxhc2hpbmcoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCSAgICAgMCwgYXBwc19hcmdzWzBdLCBhcHBzX2FyZ3NbMV0pOworCQlzbWVfc2V0X2xlZF9mbGFzaGluZyhXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJICAgICAxLCBhcHBzX2FyZ3NbMl0sIGFwcHNfYXJnc1szXSk7CisJfQorCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwl7CisJCWhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBJT0NUTCBjb21tYW5kICVkIiksIHN1Yl9jbWQpOworCX0KKwlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpd19oZGRfc2V0X3Zhcl9pbnRzX2dldG5vbmUoKSAtIHNldCB2YXIgaW50cyBnZXRub25lIGNhbGxiYWNrCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiBAaW5mbzogcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8gc3RydWN0dXJlCisgKiBAd3JxdTogcG9pbnRlciB0byBpd3JlcV9kYXRhCisgKiBAZXh0cmE7IGV4dHJhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXdfaGRkX3NldF92YXJfaW50c19nZXRub25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXVuaW9uIGl3cmVxX2RhdGEgdV9wcml2X3dycXU7CisJaW50IGFwcHNfYXJnc1tNQVhfVkFSX0FSR1NdID0gezB9OworCWludCByZXQsIG51bV9hcmdzOworCisJLyogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBpd3JlcV9kYXRhIHdpdGggY29tcGF0IGhhbmRsaW5nLiAqLworCWlmIChoZGRfcHJpdl9nZXRfZGF0YSgmdV9wcml2X3dycXUuZGF0YSwgd3JxdSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKE5VTEwgPT0gdV9wcml2X3dycXUuZGF0YS5wb2ludGVyKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiTlVMTCBkYXRhIHBvaW50ZXIiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW51bV9hcmdzID0gdV9wcml2X3dycXUuZGF0YS5sZW5ndGg7CisJaWYgKG51bV9hcmdzID4gTUFYX1ZBUl9BUkdTKQorCQludW1fYXJncyA9IE1BWF9WQVJfQVJHUzsKKworCWlmIChjb3B5X2Zyb21fdXNlcihhcHBzX2FyZ3MsIHVfcHJpdl93cnF1LmRhdGEucG9pbnRlciwKKwkJCSAgKHNpemVvZihpbnQpKSAqIG51bV9hcmdzKSkgeworCQloZGRMb2coTE9HRSwgRkwoImZhaWxlZCB0byBjb3B5IGRhdGEgZnJvbSB1c2VyIGJ1ZmZlciIpKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF92YXJfaW50c19nZXRub25lKGRldiwgaW5mbywgJnVfcHJpdl93cnF1LAorCQkJCQkoY2hhciAqKSZhcHBzX2FyZ3MpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGl3X3NldF92YXJfaW50c19nZXRub25lIC0gR2VuZXJpYyAic2V0IG1hbnkiIHByaXZhdGUgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFRoaXMgaXMgYSBnZW5lcmljIGhhbmRsZXIgZm9yIHByaXZhdGUgaW9jdGxzIHdoaWNoIHRha2UgbXVsdGlwbGUKKyAqIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGFsc28gc29tZXdoYXQgdW5pcXVlCisgKiBpbiB0aGF0IGl0IGlzIHNoYXJlZCBieSBib3RoIFNUQS1tb2RlIGFuZCBTQVAtbW9kZSBpbnRlcmZhY2VzLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitpbnQgaXdfc2V0X3Zhcl9pbnRzX2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0X3Zhcl9pbnRzX2dldG5vbmUoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXdfYWRkX3RzcGVjIC0gQWRkIFRTcGVjIHByaXZhdGUgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfYWRkX3RzcGVjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwloZGRfd2xhbl93bW1fc3RhdHVzX2UgKnBTdGF0dXMgPSAoaGRkX3dsYW5fd21tX3N0YXR1c19lICopIGV4dHJhOworCWludCBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX0NPVU5UXTsKKwlzbWVfUW9zV21tVHNwZWNJbmZvIHRTcGVjOworCXVpbnQzMl90IGhhbmRsZTsKKwlzdHJ1Y3QgaXdfcG9pbnQgc19wcml2X2RhdGE7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCisJaGRkX2N0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogbWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiBpcyBzdWZmaWNpZW50bHkgcHJpdmlsZWRnZWQgKi8KKwkvKiBub3RlIHRoYXQgdGhlIGtlcm5lbCB3aWxsIGRvIHRoaXMgZm9yICJzZXQiIGlvY3RscywgYnV0IHNpbmNlICovCisJLyogdGhpcyBpb2N0bCB3YW50cyB0byByZXR1cm4gc3RhdHVzIHRvIHVzZXIgc3BhY2UgaXQgbXVzdCBiZSAqLworCS8qIGRlZmluZWQgYXMgYSAiZ2V0IiBpb2N0bCAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCS8qIHdlIG11c3QgYmUgYXNzb2NpYXRlZCBpbiBvcmRlciB0byBhZGQgYSB0c3BlYyAqLworCWlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgIT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgeworCQkqcFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEX0JBRF9QQVJBTTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIHNpbmNlIHdlIGFyZSBkZWZpbmVkIHRvIGJlIGEgImdldCIgaW9jdGwsIGFuZCBzaW5jZSB0aGUgbnVtYmVyICovCisJLyogb2YgcGFyYW1zIGV4Y2VlZHMgdGhlIG51bWJlciBvZiBwYXJhbXMgdGhhdCB3aXJlbGVzcyBleHRlbnNpb25zICovCisJLyogd2lsbCBwYXNzIGRvd24gaW4gdGhlIGl3cmVxX2RhdGEsIHdlIG11c3QgY29weSB0aGUgInNldCIgcGFyYW1zLiAqLworCS8qIFdlIG11c3QgaGFuZGxlIHRoZSBjb21wYXQgZm9yIGl3cmVxX2RhdGEgaW4gMzJVLzY0SyBlbnZpcm9ubWVudC4gKi8KKworCS8qIGhlbHBlciBmdW5jdGlvbiB0byBnZXQgaXdyZXFfZGF0YSB3aXRoIGNvbXBhdCBoYW5kbGluZy4gKi8KKwlpZiAoaGRkX3ByaXZfZ2V0X2RhdGEoJnNfcHJpdl9kYXRhLCB3cnF1KSkgeworCQkqcFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEX0JBRF9QQVJBTTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIG1ha2Ugc3VyZSBhbGwgcGFyYW1zIGFyZSBjb3JyZWN0bHkgcGFzc2VkIHRvIGZ1bmN0aW9uICovCisJaWYgKChOVUxMID09IHNfcHJpdl9kYXRhLnBvaW50ZXIpIHx8CisJICAgIChIRERfV0xBTl9XTU1fUEFSQU1fQ09VTlQgIT0gc19wcml2X2RhdGEubGVuZ3RoKSkgeworCQkqcFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEX0JBRF9QQVJBTTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGZyb20gdXNlciBzcGFjZSBvdXJzZWx2ZXMgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnBhcmFtcywgc19wcml2X2RhdGEucG9pbnRlciwgc2l6ZW9mKHBhcmFtcykpKSB7CisJCS8qIGhtbW0sIGNhbid0IGdldCB0aGVtICovCisJCXJldHVybiAtRUlPOworCX0KKwkvKiBjbGVhciB0aGUgdHNwZWMgKi8KKwltZW1zZXQoJnRTcGVjLCAwLCBzaXplb2YodFNwZWMpKTsKKworCS8qIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KKwloYW5kbGUgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX0hBTkRMRV07CisJaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUID09IGhhbmRsZSkgeworCQkvKiB0aGF0IG9uZSBpcyByZXNlcnZlZCAqLworCQkqcFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEX0JBRF9QQVJBTTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIHZhbGlkYXRlIHRoZSBUSUQgKi8KKwlpZiAocGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9USURdID4gNykgeworCQkvKiBvdXQgb2YgcmFuZ2UgKi8KKwkJKnBTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9CQURfUEFSQU07CisJCXJldHVybiAwOworCX0KKwl0U3BlYy50c19pbmZvLnRpZCA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fVElEXTsKKworCS8qIHZhbGlkYXRlIHRoZSBkaXJlY3Rpb24gKi8KKwlzd2l0Y2ggKHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fRElSRUNUSU9OXSkgeworCWNhc2UgSEREX1dMQU5fV01NX0RJUkVDVElPTl9VUFNUUkVBTToKKwkJdFNwZWMudHNfaW5mby5kaXJlY3Rpb24gPSBTTUVfUU9TX1dNTV9UU19ESVJfVVBMSU5LOworCQlicmVhazsKKworCWNhc2UgSEREX1dMQU5fV01NX0RJUkVDVElPTl9ET1dOU1RSRUFNOgorCQl0U3BlYy50c19pbmZvLmRpcmVjdGlvbiA9IFNNRV9RT1NfV01NX1RTX0RJUl9ET1dOTElOSzsKKwkJYnJlYWs7CisKKwljYXNlIEhERF9XTEFOX1dNTV9ESVJFQ1RJT05fQklESVJFQ1RJT05BTDoKKwkJdFNwZWMudHNfaW5mby5kaXJlY3Rpb24gPSBTTUVfUU9TX1dNTV9UU19ESVJfQk9USDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiB1bmtub3duICovCisJCSpwU3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRURfQkFEX1BBUkFNOworCQlyZXR1cm4gMDsKKwl9CisKKwl0U3BlYy50c19pbmZvLnBzYiA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fQVBTRF07CisKKwkvKiB2YWxpZGF0ZSB0aGUgdXNlciBwcmlvcml0eSAqLworCWlmIChwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX1VTRVJfUFJJT1JJVFldID49IFNNRV9RT1NfV01NX1VQX01BWCkgeworCQkvKiBvdXQgb2YgcmFuZ2UgKi8KKwkJKnBTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9CQURfUEFSQU07CisJCXJldHVybiAwOworCX0KKwl0U3BlYy50c19pbmZvLnVwID0gcGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9VU0VSX1BSSU9SSVRZXTsKKwlpZiAoMCA+IHRTcGVjLnRzX2luZm8udXAgfHwgU01FX1FPU19XTU1fVVBfTUFYIDwgdFNwZWMudHNfaW5mby51cCkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiKioqdHNfaW5mby51cCBvdXQgb2YgYm91bmRzKioqIik7CisJCXJldHVybiAwOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6VFNfSU5GTyBQU0IgJWQgVVAgJWQgISEhIiwgX19mdW5jX18sCisJCSAgdFNwZWMudHNfaW5mby5wc2IsIHRTcGVjLnRzX2luZm8udXApOworCisJdFNwZWMubm9taW5hbF9tc2R1X3NpemUgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX05PTUlOQUxfTVNEVV9TSVpFXTsKKwl0U3BlYy5tYXhpbXVtX21zZHVfc2l6ZSA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fTUFYSU1VTV9NU0RVX1NJWkVdOworCXRTcGVjLm1pbl9kYXRhX3JhdGUgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX01JTklNVU1fREFUQV9SQVRFXTsKKwl0U3BlYy5tZWFuX2RhdGFfcmF0ZSA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fTUVBTl9EQVRBX1JBVEVdOworCXRTcGVjLnBlYWtfZGF0YV9yYXRlID0gcGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9QRUFLX0RBVEFfUkFURV07CisJdFNwZWMubWF4X2J1cnN0X3NpemUgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX01BWF9CVVJTVF9TSVpFXTsKKwl0U3BlYy5taW5fcGh5X3JhdGUgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX01JTklNVU1fUEhZX1JBVEVdOworCXRTcGVjLnN1cnBsdXNfYndfYWxsb3dhbmNlID0KKwkJcGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9TVVJQTFVTX0JBTkRXSURUSF9BTExPV0FOQ0VdOworCXRTcGVjLm1pbl9zZXJ2aWNlX2ludGVydmFsID0KKwkJcGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9TRVJWSUNFX0lOVEVSVkFMXTsKKwl0U3BlYy5tYXhfc2VydmljZV9pbnRlcnZhbCA9CisJCXBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fTUFYX1NFUlZJQ0VfSU5URVJWQUxdOworCXRTcGVjLnN1c3BlbnNpb25faW50ZXJ2YWwgPQorCQlwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX1NVU1BFTlNJT05fSU5URVJWQUxdOworCXRTcGVjLmluYWN0aXZpdHlfaW50ZXJ2YWwgPQorCQlwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX0lOQUNUSVZJVFlfSU5URVJWQUxdOworCisJdFNwZWMudHNfaW5mby5idXJzdF9zaXplX2RlZm4gPQorCQlwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX0JVUlNUX1NJWkVfREVGTl07CisKKwkvKiB2YWxpZGF0ZSB0aGUgdHMgaW5mbyBhY2sgcG9saWN5ICovCisJc3dpdGNoIChwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX0FDS19QT0xJQ1ldKSB7CisJY2FzZSBIRERfV0xBTl9XTU1fVFNfSU5GT19BQ0tfUE9MSUNZX05PUk1BTF9BQ0s6CisJCXRTcGVjLnRzX2luZm8uYWNrX3BvbGljeSA9IFNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfTk9STUFMX0FDSzsKKwkJYnJlYWs7CisKKwljYXNlIEhERF9XTEFOX1dNTV9UU19JTkZPX0FDS19QT0xJQ1lfSFRfSU1NRURJQVRFX0JMT0NLX0FDSzoKKwkJdFNwZWMudHNfaW5mby5hY2tfcG9saWN5ID0KKwkJCVNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfSFRfSU1NRURJQVRFX0JMT0NLX0FDSzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiB1bmtub3duICovCisJCSpwU3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRURfQkFEX1BBUkFNOworCQlyZXR1cm4gMDsKKwl9CisKKwkqcFN0YXR1cyA9IGhkZF93bW1fYWRkdHMocEFkYXB0ZXIsIGhhbmRsZSwgJnRTcGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd19hZGRfdHNwZWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X2FkZF90c3BlYyhkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGl3X2RlbF90c3BlYyAtIERlbGV0ZSBUU3BlYyBwcml2YXRlIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2l3X2RlbF90c3BlYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHg7CisJaW50ICpwYXJhbXMgPSAoaW50ICopZXh0cmE7CisJaGRkX3dsYW5fd21tX3N0YXR1c19lICpwU3RhdHVzID0gKGhkZF93bGFuX3dtbV9zdGF0dXNfZSAqKSBleHRyYTsKKwl1aW50MzJfdCBoYW5kbGU7CisJaW50IHJldDsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIG1ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24gaXMgc3VmZmljaWVudGx5IHByaXZpbGVkZ2VkICovCisJLyogbm90ZSB0aGF0IHRoZSBrZXJuZWwgd2lsbCBkbyB0aGlzIGZvciAic2V0IiBpb2N0bHMsIGJ1dCBzaW5jZSAqLworCS8qIHRoaXMgaW9jdGwgd2FudHMgdG8gcmV0dXJuIHN0YXR1cyB0byB1c2VyIHNwYWNlIGl0IG11c3QgYmUgKi8KKwkvKiBkZWZpbmVkIGFzIGEgImdldCIgaW9jdGwgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBhbHRob3VnaCB3ZSBhcmUgZGVmaW5lZCB0byBiZSBhICJnZXQiIGlvY3RsLCB0aGUgcGFyYW1zIHdlIHJlcXVpcmUgKi8KKwkvKiB3aWxsIGZpdCBpbiB0aGUgaXdyZXFfZGF0YSwgdGhlcmVmb3JlIHVubGlrZSBpd19hZGRfdHNwZWMoKSB0aGVyZSAqLworCS8qIGlzIG5vIG5lZWQgdG8gY29weSB0aGUgcGFyYW1zIGZyb20gdXNlciBzcGFjZSAqLworCisJLyogdmFsaWRhdGUgdGhlIGhhbmRsZSAqLworCWhhbmRsZSA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fSEFORExFXTsKKwlpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgPT0gaGFuZGxlKSB7CisJCS8qIHRoYXQgb25lIGlzIHJlc2VydmVkICovCisJCSpwU3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRURfQkFEX1BBUkFNOworCQlyZXR1cm4gMDsKKwl9CisKKwkqcFN0YXR1cyA9IGhkZF93bW1fZGVsdHMocEFkYXB0ZXIsIGhhbmRsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfZGVsX3RzcGVjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19kZWxfdHNwZWMoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpd19nZXRfdHNwZWMgLSBHZXQgVFNwZWMgcHJpdmF0ZSBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19nZXRfdHNwZWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCAqcGFyYW1zID0gKGludCAqKWV4dHJhOworCWhkZF93bGFuX3dtbV9zdGF0dXNfZSAqcFN0YXR1cyA9IChoZGRfd2xhbl93bW1fc3RhdHVzX2UgKikgZXh0cmE7CisJdWludDMyX3QgaGFuZGxlOworCWludCByZXQ7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBhbHRob3VnaCB3ZSBhcmUgZGVmaW5lZCB0byBiZSBhICJnZXQiIGlvY3RsLCB0aGUgcGFyYW1zIHdlIHJlcXVpcmUgKi8KKwkvKiB3aWxsIGZpdCBpbiB0aGUgaXdyZXFfZGF0YSwgdGhlcmVmb3JlIHVubGlrZSBpd19hZGRfdHNwZWMoKSB0aGVyZSAqLworCS8qIGlzIG5vIG5lZWQgdG8gY29weSB0aGUgcGFyYW1zIGZyb20gdXNlciBzcGFjZSAqLworCisJLyogdmFsaWRhdGUgdGhlIGhhbmRsZSAqLworCWhhbmRsZSA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fSEFORExFXTsKKwlpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgPT0gaGFuZGxlKSB7CisJCS8qIHRoYXQgb25lIGlzIHJlc2VydmVkICovCisJCSpwU3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRURfQkFEX1BBUkFNOworCQlyZXR1cm4gMDsKKwl9CisKKwkqcFN0YXR1cyA9IGhkZF93bW1fY2hlY2t0cyhwQWRhcHRlciwgaGFuZGxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd19nZXRfdHNwZWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X2dldF90c3BlYyhkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qKgorICogaXdfc2V0X2Z0aWVzIC0gU2V0IEZUIElFcyBwcml2YXRlIGlvY3RsIGhhbmRsZXIKKyAqIEBkZXY6IGRldmljZSB1cG9uIHdoaWNoIHRoZSBpb2N0bCB3YXMgcmVjZWl2ZWQKKyAqIEBpbmZvOiBpb2N0bCByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBAd3JxdTogaW9jdGwgcmVxdWVzdCBkYXRhCisgKiBAZXh0cmE6IGlvY3RsIGV4dHJhIGRhdGEKKyAqCisgKiBFYWNoIHRpbWUgdGhlIHN1cHBsaWNhbnQgaGFzIHRoZSBhdXRoX3JlcXVlc3Qgb3IgcmVhc3NvYyByZXF1ZXN0CisgKiBJRXMgcmVhZHkgdGhleSBhcmUgcHVzaGVkIHRvIHRoZSBkcml2ZXIuIFRoZSBkcml2ZXIgd2lsbCBpbiB0dXJuCisgKiB1c2UgaXQgdG8gc2VuZCBvdXQgdGhlIGF1dGggcmVxIGFuZCByZWFzc29jIHJlcSBmb3IgMTFyIEZUIEFzc29jLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfc2V0X2Z0aWVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIXdycXUtPmRhdGEubGVuZ3RoKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2FsbGVkIHdpdGggMCBsZW5ndGggSUVzIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHdycXUtPmRhdGEucG9pbnRlciA9PSBOVUxMKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiY2FsbGVkIHdpdGggTlVMTCBJRSIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIEFkZGVkIGZvciBkZWJ1ZyBvbiByZWNlcHRpb24gb2YgUmUtYXNzb2MgUmVxLiAqLworCWlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgIT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgeworCQloZGRMb2coTE9HRSwKKwkJICAgICAgIEZMKCJDYWxsZWQgd2l0aCBJZSBvZiBsZW5ndGggPSAlZCB3aGVuIG5vdCBhc3NvY2lhdGVkIiksCisJCSAgICAgICB3cnF1LT5kYXRhLmxlbmd0aCk7CisJCWhkZExvZyhMT0dFLCBGTCgiU2hvdWxkIGJlIFJlLWFzc29jIFJlcSBJRXMiKSk7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJaGRkTG9nKExPRzEsIEZMKCIlcyBjYWxsZWQgd2l0aCBJZSBvZiBsZW5ndGggPSAlZCIpLCBfX2Z1bmNfXywKKwkgICAgICAgd3JxdS0+ZGF0YS5sZW5ndGgpOworI2VuZGlmCisKKwkvKiBQYXNzIHRoZSByZWNlaXZlZCBGVCBJRXMgdG8gU01FICovCisJc21lX3NldF9mdF9pZXMoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X3NldF9mdGllcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0X2Z0aWVzKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoqCisgKiBpd19zZXRfaG9zdF9vZmZsb2FkIC0gU2V0IGhvc3Qgb2ZmbG9hZCBpb2N0bCBoYW5kbGVyCisgKiBAZGV2OiBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaW9jdGwgd2FzIHJlY2VpdmVkCisgKiBAaW5mbzogaW9jdGwgcmVxdWVzdCBpbmZvcm1hdGlvbgorICogQHdycXU6IGlvY3RsIHJlcXVlc3QgZGF0YQorICogQGV4dHJhOiBpb2N0bCBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19zZXRfaG9zdF9vZmZsb2FkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJdHBIb3N0T2ZmbG9hZFJlcXVlc3QgcFJlcXVlc3QgPSAodHBIb3N0T2ZmbG9hZFJlcXVlc3QpIGV4dHJhOworCXRTaXJIb3N0T2ZmbG9hZFJlcSBvZmZsb2FkUmVxdWVzdDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWhkZF9jb25uX2lzX2Nvbm5lY3RlZChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczpMT0dQIGRldiBpcyBub3QgaW4gQ09OTkVDVEVEIHN0YXRlLCBpZ25vcmUhISEiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIERlYnVnIGRpc3BsYXkgb2YgcmVxdWVzdCBjb21wb25lbnRzLiAqLworCXN3aXRjaCAocFJlcXVlc3QtPm9mZmxvYWRUeXBlKSB7CisJY2FzZSBXTEFOX0lQVjRfQVJQX1JFUExZX09GRkxPQUQ6CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJICAgICAgICIlczogSG9zdCBvZmZsb2FkIHJlcXVlc3Q6IEFSUCByZXBseSIsIF9fZnVuY19fKTsKKwkJc3dpdGNoIChwUmVxdWVzdC0+ZW5hYmxlT3JEaXNhYmxlKSB7CisJCWNhc2UgV0xBTl9PRkZMT0FEX0RJU0FCTEU6CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sICIgICBkaXNhYmxlIik7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX09GRkxPQURfQVJQX0FORF9CQ19GSUxURVJfRU5BQkxFOgorCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9XQVJOLCAiICAgQkMgRmlsdGVyaW5nIGVuYWJsZSIpOworCQljYXNlIFdMQU5fT0ZGTE9BRF9FTkFCTEU6CisJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sICIgICBBUlAgb2ZmbG9hZCBlbmFibGUiKTsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSAgICAgICAiICAgSVAgYWRkcmVzczogJWQuJWQuJWQuJWQiLAorCQkJICAgICAgIHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjRBZGRyWzBdLAorCQkJICAgICAgIHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjRBZGRyWzFdLAorCQkJICAgICAgIHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjRBZGRyWzJdLAorCQkJICAgICAgIHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjRBZGRyWzNdKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgV0xBTl9JUFY2X05FSUdIQk9SX0RJU0NPVkVSWV9PRkZMT0FEOgorCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAgICAgICIlczogSG9zdCBvZmZsb2FkIHJlcXVlc3Q6IG5laWdoYm9yIGRpc2NvdmVyeSIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXN3aXRjaCAocFJlcXVlc3QtPmVuYWJsZU9yRGlzYWJsZSkgeworCQljYXNlIFdMQU5fT0ZGTE9BRF9ESVNBQkxFOgorCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIgICBkaXNhYmxlIik7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX09GRkxPQURfRU5BQkxFOgorCQkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIgICBlbmFibGUiKTsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAgICAgICIgICBJUCBhZGRyZXNzOiAleDoleDoleDoleDoleDoleDoleDoleCIsCisJCQkgICAgICAgKih1aW50MTZfdCAqKSAocFJlcXVlc3QtPnBhcmFtcy5ob3N0SXB2NkFkZHIpLAorCQkJICAgICAgICoodWludDE2X3QgKikgKHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjZBZGRyICsKKwkJCQkJICAgICAgMiksCisJCQkgICAgICAgKih1aW50MTZfdCAqKSAocFJlcXVlc3QtPnBhcmFtcy5ob3N0SXB2NkFkZHIgKworCQkJCQkgICAgICA0KSwKKwkJCSAgICAgICAqKHVpbnQxNl90ICopIChwUmVxdWVzdC0+cGFyYW1zLmhvc3RJcHY2QWRkciArCisJCQkJCSAgICAgIDYpLAorCQkJICAgICAgICoodWludDE2X3QgKikgKHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjZBZGRyICsKKwkJCQkJICAgICAgOCksCisJCQkgICAgICAgKih1aW50MTZfdCAqKSAocFJlcXVlc3QtPnBhcmFtcy5ob3N0SXB2NkFkZHIgKworCQkJCQkgICAgICAxMCksCisJCQkgICAgICAgKih1aW50MTZfdCAqKSAocFJlcXVlc3QtPnBhcmFtcy5ob3N0SXB2NkFkZHIgKworCQkJCQkgICAgICAxMiksCisJCQkgICAgICAgKih1aW50MTZfdCAqKSAocFJlcXVlc3QtPnBhcmFtcy5ob3N0SXB2NkFkZHIgKworCQkJCQkgICAgICAxNCkpOworCQl9CisJfQorCisJLyogRXhlY3V0ZSBvZmZsb2FkIHJlcXVlc3QuIFRoZSByZWFzb24gdGhhdCB3ZSBjYW4gY29weSB0aGUKKwkgKiByZXF1ZXN0IGluZm9ybWF0aW9uIGZyb20gdGhlIGlvY3RsIHN0cnVjdHVyZSB0byB0aGUgU01FCisJICogc3RydWN0dXJlIGlzIHRoYXQgdGhleSBhcmUgbGFpZCBvdXQgZXhhY3RseSB0aGUgc2FtZS4KKwkgKiBPdGhlcndpc2UsIGVhY2ggcGllY2Ugb2YgaW5mb3JtYXRpb24gd291bGQgaGF2ZSB0byBiZQorCSAqIGNvcGllZCBpbmRpdmlkdWFsbHkuCisJICovCisJbWVtY3B5KCZvZmZsb2FkUmVxdWVzdCwgcFJlcXVlc3QsIHdycXUtPmRhdGEubGVuZ3RoKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJICAgIHNtZV9zZXRfaG9zdF9vZmZsb2FkKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkgcEFkYXB0ZXItPnNlc3Npb25JZCwgJm9mZmxvYWRSZXF1ZXN0KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBGYWlsdXJlIHRvIGV4ZWN1dGUgaG9zdCBvZmZsb2FkIHJlcXVlc3QiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X3NldF9ob3N0X29mZmxvYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0X2hvc3Rfb2ZmbG9hZChkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGl3X3NldF9rZWVwYWxpdmVfcGFyYW1zIC0gU2V0IGtlZXBhbGl2ZSBwYXJhbXMgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faXdfc2V0X2tlZXBhbGl2ZV9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXRwS2VlcEFsaXZlUmVxdWVzdCBwUmVxdWVzdCA9ICh0cEtlZXBBbGl2ZVJlcXVlc3QpIGV4dHJhOworCXRTaXJLZWVwQWxpdmVSZXEga2VlcGFsaXZlUmVxdWVzdDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCWludCByZXQ7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocFJlcXVlc3QtPnRpbWVQZXJpb2QgPiBXTklfQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRF9TVEFNQVgpIHsKKwkJaGRkTG9nKExPR0UsIEZMKCJWYWx1ZSBvZiB0aW1lUGVyaW9kICVkIGV4Y2VlZCBNYXggbGltaXQgJWQiKSwKKwkJCXBSZXF1ZXN0LT50aW1lUGVyaW9kLAorCQkJV05JX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfU1RBTUFYKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRGVidWcgZGlzcGxheSBvZiByZXF1ZXN0IGNvbXBvbmVudHMuICovCisJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCSAgICAgICAiJXM6IFNldCBLZWVwIEFsaXZlIFJlcXVlc3QgOiBUaW1lUGVyaW9kICVkIHNpemUgJXp1IiwKKwkgICAgICAgX19mdW5jX18sIHBSZXF1ZXN0LT50aW1lUGVyaW9kLCBzaXplb2YodEtlZXBBbGl2ZVJlcXVlc3QpKTsKKworCXN3aXRjaCAocFJlcXVlc3QtPnBhY2tldFR5cGUpIHsKKwljYXNlIFdMQU5fS0VFUF9BTElWRV9OVUxMX1BLVDoKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9XQVJOLCAiJXM6IEtlZXAgQWxpdmUgUmVxdWVzdDogVHggTlVMTCIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0tFRVBfQUxJVkVfVU5TT0xJQ0lUX0FSUF9SU1A6CisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICAgICAgIiVzOiBLZWVwIEFsaXZlIFJlcXVlc3Q6IFR4IFVuU29saWNpdGVkIEFSUCBSU1AiLAorCQkgICAgICAgX19mdW5jX18pOworCisJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwgIiAgSG9zdCBJUCBhZGRyZXNzOiAlZC4lZC4lZC4lZCIsCisJCSAgICAgICBwUmVxdWVzdC0+aG9zdElwdjRBZGRyWzBdLCBwUmVxdWVzdC0+aG9zdElwdjRBZGRyWzFdLAorCQkgICAgICAgcFJlcXVlc3QtPmhvc3RJcHY0QWRkclsyXSwgcFJlcXVlc3QtPmhvc3RJcHY0QWRkclszXSk7CisKKwkJaGRkTG9nKENERl9UUkFDRV9MRVZFTF9XQVJOLCAiICBEZXN0IElQIGFkZHJlc3M6ICVkLiVkLiVkLiVkIiwKKwkJICAgICAgIHBSZXF1ZXN0LT5kZXN0SXB2NEFkZHJbMF0sIHBSZXF1ZXN0LT5kZXN0SXB2NEFkZHJbMV0sCisJCSAgICAgICBwUmVxdWVzdC0+ZGVzdElwdjRBZGRyWzJdLCBwUmVxdWVzdC0+ZGVzdElwdjRBZGRyWzNdKTsKKworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCSAgICAgICAiICBEZXN0IE1BQyBhZGRyZXNzOiAlZDolZDolZDolZDolZDolZCIsCisJCSAgICAgICBwUmVxdWVzdC0+ZGVzdE1hY0FkZHJbMF0sIHBSZXF1ZXN0LT5kZXN0TWFjQWRkclsxXSwKKwkJICAgICAgIHBSZXF1ZXN0LT5kZXN0TWFjQWRkclsyXSwgcFJlcXVlc3QtPmRlc3RNYWNBZGRyWzNdLAorCQkgICAgICAgcFJlcXVlc3QtPmRlc3RNYWNBZGRyWzRdLCBwUmVxdWVzdC0+ZGVzdE1hY0FkZHJbNV0pOworCQlicmVhazsKKwl9CisKKwkvKiBFeGVjdXRlIGtlZXAgYWxpdmUgcmVxdWVzdC4gVGhlIHJlYXNvbiB0aGF0IHdlIGNhbiBjb3B5IHRoZQorCSAqIHJlcXVlc3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW9jdGwgc3RydWN0dXJlIHRvIHRoZSBTTUUKKwkgKiBzdHJ1Y3R1cmUgaXMgdGhhdCB0aGV5IGFyZSBsYWlkIG91dCBleGFjdGx5IHRoZSBzYW1lLgorCSAqIE90aGVyd2lzZSwgZWFjaCBwaWVjZSBvZiBpbmZvcm1hdGlvbiB3b3VsZCBoYXZlIHRvIGJlCisJICogY29waWVkIGluZGl2aWR1YWxseS4KKwkgKi8KKwltZW1jcHkoJmtlZXBhbGl2ZVJlcXVlc3QsIHBSZXF1ZXN0LCB3cnF1LT5kYXRhLmxlbmd0aCk7CisKKwloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAic2V0IEtlZXA6IFRQIGJlZm9yZSBTTUUgJWQiLAorCSAgICAgICBrZWVwYWxpdmVSZXF1ZXN0LnRpbWVQZXJpb2QpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCSAgICBzbWVfc2V0X2tlZXBfYWxpdmUoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsICZrZWVwYWxpdmVSZXF1ZXN0KSkgeworCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICAgICAgIiVzOiBGYWlsdXJlIHRvIGV4ZWN1dGUgS2VlcCBBbGl2ZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X2tlZXBhbGl2ZV9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkJICAgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJcmV0ID0gX19pd19zZXRfa2VlcGFsaXZlX3BhcmFtcyhkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKy8qKgorICogd2xhbl9oZGRfc2V0X2ZpbHRlcigpIC0gU2V0IHBhY2tldCBmaWx0ZXIKKyAqIEBoZGRfY3R4OiBHbG9iYWwgSEREIGNvbnRleHQKKyAqIEByZXF1ZXN0OiBQYWNrZXQgZmlsdGVyIHJlcXVlc3Qgc3RydWN0CisgKiBAc2Vzc2lvbklkOiBUYXJnZXQgc2Vzc2lvbiBmb3IgdGhlIHJlcXVlc3QKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9zZXRfZmlsdGVyKGhkZF9jb250ZXh0X3QgKmhkZF9jdHgsCisJCQkJc3RydWN0IHBrdF9maWx0ZXJfY2ZnICpyZXF1ZXN0LAorCQkJCXVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRTaXJSY3ZQa3RGaWx0ZXJDZmdUeXBlIHBhY2tldEZpbHRlclNldFJlcSA9IHswfTsKKwl0U2lyUmN2Rmx0UGt0Q2xlYXJQYXJhbSBwYWNrZXRGaWx0ZXJDbHJSZXEgPSB7MH07CisJaW50IGkgPSAwOworCisJaWYgKGhkZF9jdHgtPmNvbmZpZy0+ZGlzYWJsZVBhY2tldEZpbHRlcikgeworCQloZGRfZXJyKCJwYWNrZXQgZmlsdGVyaW5nIGRpc2FibGVkIGluIGluaSByZXR1cm5pbmciKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRGVidWcgZGlzcGxheSBvZiByZXF1ZXN0IGNvbXBvbmVudHMuICovCisJaGRkX2luZm8oIlBhY2tldCBGaWx0ZXIgUmVxdWVzdCA6IEZBICVkIHBhcmFtcyAlZCIsCisJCXJlcXVlc3QtPmZpbHRlcl9hY3Rpb24sIHJlcXVlc3QtPm51bV9wYXJhbXMpOworCisJc3dpdGNoIChyZXF1ZXN0LT5maWx0ZXJfYWN0aW9uKSB7CisJY2FzZSBIRERfUkNWX0ZJTFRFUl9TRVQ6CisJCWhkZF9pbmZvKCJTZXQgUGFja2V0IEZpbHRlciBSZXF1ZXN0IGZvciBJZDogJWQiLAorCQkJcmVxdWVzdC0+ZmlsdGVyX2lkKTsKKworCQlwYWNrZXRGaWx0ZXJTZXRSZXEuZmlsdGVySWQgPSByZXF1ZXN0LT5maWx0ZXJfaWQ7CisJCWlmIChyZXF1ZXN0LT5udW1fcGFyYW1zID49IEhERF9NQVhfQ01QX1BFUl9QQUNLRVRfRklMVEVSKSB7CisJCQloZGRfZXJyKCJOdW1iZXIgb2YgUGFyYW1zIGV4Y2VlZCBNYXggbGltaXQgJWQiLAorCQkJCXJlcXVlc3QtPm51bV9wYXJhbXMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcGFja2V0RmlsdGVyU2V0UmVxLm51bUZpZWxkUGFyYW1zID0gcmVxdWVzdC0+bnVtX3BhcmFtczsKKwkJcGFja2V0RmlsdGVyU2V0UmVxLmNvYWxlc2NlVGltZSA9IDA7CisJCXBhY2tldEZpbHRlclNldFJlcS5maWx0ZXJUeXBlID0gSEREX1JDVl9GSUxURVJfU0VUOworCQlmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdC0+bnVtX3BhcmFtczsgaSsrKSB7CisJCQlwYWNrZXRGaWx0ZXJTZXRSZXEucGFyYW1zRGF0YVtpXS5wcm90b2NvbExheWVyID0KKwkJCQlyZXF1ZXN0LT5wYXJhbXNfZGF0YVtpXS5wcm90b2NvbF9sYXllcjsKKwkJCXBhY2tldEZpbHRlclNldFJlcS5wYXJhbXNEYXRhW2ldLmNtcEZsYWcgPQorCQkJCXJlcXVlc3QtPnBhcmFtc19kYXRhW2ldLmNvbXBhcmVfZmxhZzsKKwkJCXBhY2tldEZpbHRlclNldFJlcS5wYXJhbXNEYXRhW2ldLmRhdGFPZmZzZXQgPQorCQkJCXJlcXVlc3QtPnBhcmFtc19kYXRhW2ldLmRhdGFfb2Zmc2V0OworCQkJcGFja2V0RmlsdGVyU2V0UmVxLnBhcmFtc0RhdGFbaV0uZGF0YUxlbmd0aCA9CisJCQkJcmVxdWVzdC0+cGFyYW1zX2RhdGFbaV0uZGF0YV9sZW5ndGg7CisJCQlwYWNrZXRGaWx0ZXJTZXRSZXEucGFyYW1zRGF0YVtpXS5yZXNlcnZlZCA9IDA7CisKKwkJCWlmIChyZXF1ZXN0LT5wYXJhbXNfZGF0YVtpXS5kYXRhX2xlbmd0aCA+CisJCQkJU0lSX01BWF9GSUxURVJfVEVTVF9EQVRBX0xFTikgeworCQkJCWhkZF9lcnIoIkVycm9yIGludmFsaWQgZGF0YSBsZW5ndGggJWQiLAorCQkJCQlyZXF1ZXN0LT5wYXJhbXNfZGF0YVtpXS5kYXRhX2xlbmd0aCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWhkZF9pbmZvKCJQcm90byAlZCBDb21wIEZsYWcgJWQgRmlsdGVyIFR5cGUgJWQiLAorCQkJCXJlcXVlc3QtPnBhcmFtc19kYXRhW2ldLnByb3RvY29sX2xheWVyLAorCQkJCXJlcXVlc3QtPnBhcmFtc19kYXRhW2ldLmNvbXBhcmVfZmxhZywKKwkJCQlwYWNrZXRGaWx0ZXJTZXRSZXEuZmlsdGVyVHlwZSk7CisKKwkJCWhkZF9pbmZvKCJEYXRhIE9mZnNldCAlZCBEYXRhIExlbiAlZCIsCisJCQkJcmVxdWVzdC0+cGFyYW1zX2RhdGFbaV0uZGF0YV9vZmZzZXQsCisJCQkJcmVxdWVzdC0+cGFyYW1zX2RhdGFbaV0uZGF0YV9sZW5ndGgpOworCisJCQltZW1jcHkoJnBhY2tldEZpbHRlclNldFJlcS5wYXJhbXNEYXRhW2ldLmNvbXBhcmVEYXRhLAorCQkJICAgICAgIHJlcXVlc3QtPnBhcmFtc19kYXRhW2ldLmNvbXBhcmVfZGF0YSwKKwkJCSAgICAgICByZXF1ZXN0LT5wYXJhbXNfZGF0YVtpXS5kYXRhX2xlbmd0aCk7CisJCQltZW1jcHkoJnBhY2tldEZpbHRlclNldFJlcS5wYXJhbXNEYXRhW2ldLmRhdGFNYXNrLAorCQkJICAgICAgIHJlcXVlc3QtPnBhcmFtc19kYXRhW2ldLmRhdGFfbWFzaywKKwkJCSAgICAgICByZXF1ZXN0LT5wYXJhbXNfZGF0YVtpXS5kYXRhX2xlbmd0aCk7CisKKwkJCWhkZF9pbmZvKCJDRGF0YSAlZCBDRGF0YSAlZCBDRGF0YSAlZCBDRGF0YSAlZCBDRGF0YSAlZCBDRGF0YSAlZCIsCisJCQkJcmVxdWVzdC0+cGFyYW1zX2RhdGFbaV0uY29tcGFyZV9kYXRhWzBdLAorCQkJCXJlcXVlc3QtPnBhcmFtc19kYXRhW2ldLmNvbXBhcmVfZGF0YVsxXSwKKwkJCQlyZXF1ZXN0LT5wYXJhbXNfZGF0YVtpXS5jb21wYXJlX2RhdGFbMl0sCisJCQkJcmVxdWVzdC0+cGFyYW1zX2RhdGFbaV0uY29tcGFyZV9kYXRhWzNdLAorCQkJCXJlcXVlc3QtPnBhcmFtc19kYXRhW2ldLmNvbXBhcmVfZGF0YVs0XSwKKwkJCQlyZXF1ZXN0LT5wYXJhbXNfZGF0YVtpXS5jb21wYXJlX2RhdGFbNV0pOworCisJCQloZGRfaW5mbygiTURhdGEgJWQgTURhdGEgJWQgTURhdGEgJWQgTURhdGEgJWQgTURhdGEgJWQgTURhdGEgJWQiLAorCQkJCXJlcXVlc3QtPnBhcmFtc19kYXRhW2ldLmRhdGFfbWFza1swXSwKKwkJCQlyZXF1ZXN0LT5wYXJhbXNfZGF0YVtpXS5kYXRhX21hc2tbMV0sCisJCQkJcmVxdWVzdC0+cGFyYW1zX2RhdGFbaV0uZGF0YV9tYXNrWzJdLAorCQkJCXJlcXVlc3QtPnBhcmFtc19kYXRhW2ldLmRhdGFfbWFza1szXSwKKwkJCQlyZXF1ZXN0LT5wYXJhbXNfZGF0YVtpXS5kYXRhX21hc2tbNF0sCisJCQkJcmVxdWVzdC0+cGFyYW1zX2RhdGFbaV0uZGF0YV9tYXNrWzVdKTsKKwkJfQorCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJCXNtZV9yZWNlaXZlX2ZpbHRlcl9zZXRfZmlsdGVyKGhkZF9jdHgtPmhIYWwsCisJCQkJJnBhY2tldEZpbHRlclNldFJlcSwKKwkJCQlzZXNzaW9uSWQpKSB7CisJCQloZGRfZXJyKCJGYWlsdXJlIHRvIGV4ZWN1dGUgU2V0IEZpbHRlciIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgSEREX1JDVl9GSUxURVJfQ0xFQVI6CisKKwkJaGRkX2luZm8oIkNsZWFyIFBhY2tldCBGaWx0ZXIgUmVxdWVzdCBmb3IgSWQ6ICVkIiwKKwkJCXJlcXVlc3QtPmZpbHRlcl9pZCk7CisJCXBhY2tldEZpbHRlckNsclJlcS5maWx0ZXJJZCA9IHJlcXVlc3QtPmZpbHRlcl9pZDsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkgICAgc21lX3JlY2VpdmVfZmlsdGVyX2NsZWFyX2ZpbHRlcihoZGRfY3R4LT5oSGFsLAorCQkJCQkJICAgICZwYWNrZXRGaWx0ZXJDbHJSZXEsCisJCQkJCQkgICAgc2Vzc2lvbklkKSkgeworCQkJaGRkX2VycigiRmFpbHVyZSB0byBleGVjdXRlIENsZWFyIEZpbHRlciIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQloZGRfZXJyKCJQYWNrZXQgRmlsdGVyIFJlcXVlc3Q6IEludmFsaWQgJWQiLAorCQkgICAgICAgcmVxdWVzdC0+ZmlsdGVyX2FjdGlvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBfX2l3X3NldF9wYWNrZXRfZmlsdGVyX3BhcmFtcygpIC0gc2V0IHBhY2tldCBmaWx0ZXIgcGFyYW1ldGVycyBpbiB0YXJnZXQKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0ZGV2CisgKiBAaW5mbzogUG9pbnRlciB0byBpdyByZXF1ZXN0IGluZm8KKyAqIEB3cnF1OiBQb2ludGVyIHRvIGRhdGEKKyAqIEBleHRyYTogUG9pbnRlciB0byBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pd19zZXRfcGFja2V0X2ZpbHRlcl9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCXN0cnVjdCBpd19wb2ludCBwcml2X2RhdGE7CisJaGRkX2FkYXB0ZXJfdCAqYWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCXN0cnVjdCBwa3RfZmlsdGVyX2NmZyAqcmVxdWVzdCA9IE5VTEw7CisKKwloZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChhZGFwdGVyKTsKKwlyZXQgPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChoZGRfcHJpdl9nZXRfZGF0YSgmcHJpdl9kYXRhLCB3cnF1KSkgeworCQloZGRfZXJyKCJmYWlsZWQgdG8gZ2V0IHByaXYgZGF0YSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKE5VTEwgPT0gcHJpdl9kYXRhLnBvaW50ZXIpIHx8ICgwID09IHByaXZfZGF0YS5sZW5ndGgpKSB7CisJCWhkZF9lcnIoImludmFsaWQgcHJpdiBkYXRhICVwIG9yIGludmFsaWQgcHJpdiBkYXRhIGxlbmd0aCAlZCIsCisJCQlwcml2X2RhdGEucG9pbnRlciwgcHJpdl9kYXRhLmxlbmd0aCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNvcHkgZGF0YSB1c2luZyBjb3B5X2Zyb21fdXNlciAqLworCXJlcXVlc3QgPSBtZW1fYWxsb2NfY29weV9mcm9tX3VzZXJfaGVscGVyKHByaXZfZGF0YS5wb2ludGVyLAorCQkJCQkJICAgcHJpdl9kYXRhLmxlbmd0aCk7CisJaWYgKE5VTEwgPT0gcmVxdWVzdCkgeworCQloZGRfZXJyKCJtZW1fYWxsb2NfY29weV9mcm9tX3VzZXJfaGVscGVyIGZhaWwiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gd2xhbl9oZGRfc2V0X2ZpbHRlcihoZGRfY3R4LCByZXF1ZXN0LCBhZGFwdGVyLT5zZXNzaW9uSWQpOworCisJa2ZyZWUocmVxdWVzdCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGl3X3NldF9wYWNrZXRfZmlsdGVyX3BhcmFtcygpIC0gc2V0IHBhY2tldCBmaWx0ZXIgcGFyYW1ldGVycyBpbiB0YXJnZXQKKyAqIEBkZXY6IFBvaW50ZXIgdG8gbmV0ZGV2CisgKiBAaW5mbzogUG9pbnRlciB0byBpdyByZXF1ZXN0IGluZm8KKyAqIEB3cnF1OiBQb2ludGVyIHRvIGRhdGEKKyAqIEBleHRyYTogUG9pbnRlciB0byBleHRyYSBkYXRhCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgaXdfc2V0X3BhY2tldF9maWx0ZXJfcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0X3BhY2tldF9maWx0ZXJfcGFyYW1zKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IF9faXdfZ2V0X3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisJY2hhciAqcCA9IGV4dHJhOworCWludCB0bGVuID0gMDsKKwl0Q3NyU3VtbWFyeVN0YXRzSW5mbyAqcFN0YXRzID0gJihwQWRhcHRlci0+aGRkX3N0YXRzLnN1bW1hcnlfc3RhdCk7CisJdENzckdsb2JhbENsYXNzQVN0YXRzSW5mbyAqYVN0YXRzID0gJihwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0KTsKKwl0Q3NyR2xvYmFsQ2xhc3NEU3RhdHNJbmZvICpkU3RhdHMgPSAmKHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NEX3N0YXQpOworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJcmV0ID0gd2xhbl9oZGRfdmFsaWRhdGVfY29udGV4dChoZGRfY3R4KTsKKwlpZiAoMCAhPSByZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9CisJICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKworCQl3cnF1LT50eHBvd2VyLnZhbHVlID0gMDsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBzbWVfZ2V0X3N0YXRpc3RpY3MoaGRkX2N0eC0+aEhhbCwgZUNTUl9IREQsCisJCQkJCSAgICBTTUVfU1VNTUFSWV9TVEFUUyB8CisJCQkJCSAgICBTTUVfR0xPQkFMX0NMQVNTQV9TVEFUUyB8CisJCQkJCSAgICBTTUVfR0xPQkFMX0NMQVNTQl9TVEFUUyB8CisJCQkJCSAgICBTTUVfR0xPQkFMX0NMQVNTQ19TVEFUUyB8CisJCQkJCSAgICBTTUVfR0xPQkFMX0NMQVNTRF9TVEFUUyB8CisJCQkJCSAgICBTTUVfUEVSX1NUQV9TVEFUUywKKwkJCQkJICAgIGhkZF9zdGF0aXN0aWNzX2NiLCAwLCBmYWxzZSwKKwkJCQkJICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSCisJCQkJCQkgICAgIChwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisJCQkJCSAgICBwQWRhcHRlciwgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmV0cmlldmUgU01FIHN0YXRpc3RpY3MiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisKKwkJY2RmX3N0YXR1cyA9CisJCQljZGZfd2FpdF9zaW5nbGVfZXZlbnQoJnBXZXh0U3RhdGUtPmhkZF9jZGZfZXZlbnQsCisJCQkJCSAgICAgIFdMQU5fV0FJVF9USU1FX1NUQVRTKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAgIiVzOiBTTUUgdGltZW91dCB3aGlsZSByZXRyaWV2aW5nIHN0YXRpc3RpY3MiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCS8qUmVtb3ZlIHRoZSBTTUUgc3RhdGlzdGljcyBsaXN0IGJ5IHBhc3NpbmcgTlVMTCBpbiBjYWxsYmFjayBhcmd1bWVudCAqLworCQkJc3RhdHVzID0gc21lX2dldF9zdGF0aXN0aWNzKGhkZF9jdHgtPmhIYWwsIGVDU1JfSERELAorCQkJCQkJICAgIFNNRV9TVU1NQVJZX1NUQVRTIHwKKwkJCQkJCSAgICBTTUVfR0xPQkFMX0NMQVNTQV9TVEFUUyB8CisJCQkJCQkgICAgU01FX0dMT0JBTF9DTEFTU0JfU1RBVFMgfAorCQkJCQkJICAgIFNNRV9HTE9CQUxfQ0xBU1NDX1NUQVRTIHwKKwkJCQkJCSAgICBTTUVfR0xPQkFMX0NMQVNTRF9TVEFUUyB8CisJCQkJCQkgICAgU01FX1BFUl9TVEFfU1RBVFMsCisJCQkJCQkgICAgTlVMTCwgMCwgZmFsc2UsCisJCQkJCQkgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIKKwkJCQkJCQkgICAgIChwQWRhcHRlcikpLT5jb25uX2luZm8uCisJCQkJCQkgICAgc3RhSWRbMF0sIHBBZGFwdGVyLAorCQkJCQkJICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQpOworCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlGSUxMX1RMVihwLCAodWludDhfdCkgV0xBTl9TVEFUU19SRVRSWV9DTlQsCisJCQkgKHVpbnQ4X3QpIHNpemVvZihwU3RhdHMtPnJldHJ5X2NudCksCisJCQkgKGNoYXIgKikmKHBTdGF0cy0+cmV0cnlfY250WzBdKSwgdGxlbik7CisKKwkJRklMTF9UTFYocCwgKHVpbnQ4X3QpIFdMQU5fU1RBVFNfTVVMX1JFVFJZX0NOVCwKKwkJCSAodWludDhfdCkgc2l6ZW9mKHBTdGF0cy0+bXVsdGlwbGVfcmV0cnlfY250KSwKKwkJCSAoY2hhciAqKSYocFN0YXRzLT5tdWx0aXBsZV9yZXRyeV9jbnRbMF0pLCB0bGVuKTsKKworCQlGSUxMX1RMVihwLCAodWludDhfdCkgV0xBTl9TVEFUU19UWF9GUk1fQ05ULAorCQkJICh1aW50OF90KSBzaXplb2YocFN0YXRzLT50eF9mcm1fY250KSwKKwkJCSAoY2hhciAqKSYocFN0YXRzLT50eF9mcm1fY250WzBdKSwgdGxlbik7CisKKwkJRklMTF9UTFYocCwgKHVpbnQ4X3QpIFdMQU5fU1RBVFNfUlhfRlJNX0NOVCwKKwkJCSAodWludDhfdCkgc2l6ZW9mKHBTdGF0cy0+cnhfZnJtX2NudCksCisJCQkgKGNoYXIgKikmKHBTdGF0cy0+cnhfZnJtX2NudCksIHRsZW4pOworCisJCUZJTExfVExWKHAsICh1aW50OF90KSBXTEFOX1NUQVRTX0ZSTV9EVVBfQ05ULAorCQkJICh1aW50OF90KSBzaXplb2YocFN0YXRzLT5mcm1fZHVwX2NudCksCisJCQkgKGNoYXIgKikmKHBTdGF0cy0+ZnJtX2R1cF9jbnQpLCB0bGVuKTsKKworCQlGSUxMX1RMVihwLCAodWludDhfdCkgV0xBTl9TVEFUU19GQUlMX0NOVCwKKwkJCSAodWludDhfdCkgc2l6ZW9mKHBTdGF0cy0+ZmFpbF9jbnQpLAorCQkJIChjaGFyICopJihwU3RhdHMtPmZhaWxfY250WzBdKSwgdGxlbik7CisKKwkJRklMTF9UTFYocCwgKHVpbnQ4X3QpIFdMQU5fU1RBVFNfUlRTX0ZBSUxfQ05ULAorCQkJICh1aW50OF90KSBzaXplb2YocFN0YXRzLT5ydHNfZmFpbF9jbnQpLAorCQkJIChjaGFyICopJihwU3RhdHMtPnJ0c19mYWlsX2NudCksIHRsZW4pOworCisJCUZJTExfVExWKHAsICh1aW50OF90KSBXTEFOX1NUQVRTX0FDS19GQUlMX0NOVCwKKwkJCSAodWludDhfdCkgc2l6ZW9mKHBTdGF0cy0+YWNrX2ZhaWxfY250KSwKKwkJCSAoY2hhciAqKSYocFN0YXRzLT5hY2tfZmFpbF9jbnQpLCB0bGVuKTsKKworCQlGSUxMX1RMVihwLCAodWludDhfdCkgV0xBTl9TVEFUU19SVFNfU1VDX0NOVCwKKwkJCSAodWludDhfdCkgc2l6ZW9mKHBTdGF0cy0+cnRzX3N1Y2NfY250KSwKKwkJCSAoY2hhciAqKSYocFN0YXRzLT5ydHNfc3VjY19jbnQpLCB0bGVuKTsKKworCQlGSUxMX1RMVihwLCAodWludDhfdCkgV0xBTl9TVEFUU19SWF9ESVNDQVJEX0NOVCwKKwkJCSAodWludDhfdCkgc2l6ZW9mKHBTdGF0cy0+cnhfZGlzY2FyZF9jbnQpLAorCQkJIChjaGFyICopJihwU3RhdHMtPnJ4X2Rpc2NhcmRfY250KSwgdGxlbik7CisKKwkJRklMTF9UTFYocCwgKHVpbnQ4X3QpIFdMQU5fU1RBVFNfUlhfRVJST1JfQ05ULAorCQkJICh1aW50OF90KSBzaXplb2YocFN0YXRzLT5yeF9lcnJvcl9jbnQpLAorCQkJIChjaGFyICopJihwU3RhdHMtPnJ4X2Vycm9yX2NudCksIHRsZW4pOworCisJCUZJTExfVExWKHAsICh1aW50OF90KSBXTEFOX1NUQVRTX1RYX0JZVEVfQ05ULAorCQkJICh1aW50OF90KSBzaXplb2YoZFN0YXRzLT50eF91Y19ieXRlX2NudFswXSksCisJCQkgKGNoYXIgKikmKGRTdGF0cy0+dHhfdWNfYnl0ZV9jbnRbMF0pLCB0bGVuKTsKKworCQlGSUxMX1RMVihwLCAodWludDhfdCkgV0xBTl9TVEFUU19SWF9CWVRFX0NOVCwKKwkJCSAodWludDhfdCkgc2l6ZW9mKGRTdGF0cy0+cnhfYnl0ZV9jbnQpLAorCQkJIChjaGFyICopJihkU3RhdHMtPnJ4X2J5dGVfY250KSwgdGxlbik7CisKKwkJRklMTF9UTFYocCwgKHVpbnQ4X3QpIFdMQU5fU1RBVFNfUlhfUkFURSwKKwkJCSAodWludDhfdCkgc2l6ZW9mKGRTdGF0cy0+cnhfcmF0ZSksCisJCQkgKGNoYXIgKikmKGRTdGF0cy0+cnhfcmF0ZSksIHRsZW4pOworCisJCS8qIFRyYW5zbWl0IHJhdGUsIGluIHVuaXRzIG9mIDUwMCBrYml0L3NlYyAqLworCQlGSUxMX1RMVihwLCAodWludDhfdCkgV0xBTl9TVEFUU19UWF9SQVRFLAorCQkJICh1aW50OF90KSBzaXplb2YoYVN0YXRzLT50eF9yYXRlKSwKKwkJCSAoY2hhciAqKSYoYVN0YXRzLT50eF9yYXRlKSwgdGxlbik7CisKKwkJRklMTF9UTFYocCwgKHVpbnQ4X3QpIFdMQU5fU1RBVFNfUlhfVUNfQllURV9DTlQsCisJCQkgKHVpbnQ4X3QpIHNpemVvZihkU3RhdHMtPnJ4X3VjX2J5dGVfY250WzBdKSwKKwkJCSAoY2hhciAqKSYoZFN0YXRzLT5yeF91Y19ieXRlX2NudFswXSksIHRsZW4pOworCQlGSUxMX1RMVihwLCAodWludDhfdCkgV0xBTl9TVEFUU19SWF9NQ19CWVRFX0NOVCwKKwkJCSAodWludDhfdCkgc2l6ZW9mKGRTdGF0cy0+cnhfbWNfYnl0ZV9jbnQpLAorCQkJIChjaGFyICopJihkU3RhdHMtPnJ4X21jX2J5dGVfY250KSwgdGxlbik7CisJCUZJTExfVExWKHAsICh1aW50OF90KSBXTEFOX1NUQVRTX1JYX0JDX0JZVEVfQ05ULAorCQkJICh1aW50OF90KSBzaXplb2YoZFN0YXRzLT5yeF9iY19ieXRlX2NudCksCisJCQkgKGNoYXIgKikmKGRTdGF0cy0+cnhfYmNfYnl0ZV9jbnQpLCB0bGVuKTsKKwkJRklMTF9UTFYocCwgKHVpbnQ4X3QpIFdMQU5fU1RBVFNfVFhfVUNfQllURV9DTlQsCisJCQkgKHVpbnQ4X3QpIHNpemVvZihkU3RhdHMtPnR4X3VjX2J5dGVfY250WzBdKSwKKwkJCSAoY2hhciAqKSYoZFN0YXRzLT50eF91Y19ieXRlX2NudFswXSksIHRsZW4pOworCQlGSUxMX1RMVihwLCAodWludDhfdCkgV0xBTl9TVEFUU19UWF9NQ19CWVRFX0NOVCwKKwkJCSAodWludDhfdCkgc2l6ZW9mKGRTdGF0cy0+dHhfbWNfYnl0ZV9jbnQpLAorCQkJIChjaGFyICopJihkU3RhdHMtPnR4X21jX2J5dGVfY250KSwgdGxlbik7CisJCUZJTExfVExWKHAsICh1aW50OF90KSBXTEFOX1NUQVRTX1RYX0JDX0JZVEVfQ05ULAorCQkJICh1aW50OF90KSBzaXplb2YoZFN0YXRzLT50eF9iY19ieXRlX2NudCksCisJCQkgKGNoYXIgKikmKGRTdGF0cy0+dHhfYmNfYnl0ZV9jbnQpLCB0bGVuKTsKKworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHRsZW47CisKKwl9CisKKwlFWElUKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd19nZXRfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X2dldF9zdGF0aXN0aWNzKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworCWNkc19zc3JfdW5wcm90ZWN0KF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworLypNYXggTGVuIGZvciBQTk8gbm90aWZpY2F0aW9uKi8KKyNkZWZpbmUgTUFYX1BOT19OT1RJRllfTEVOIDEwMAordm9pZCBmb3VuZF9wcmVmX25ldHdvcmtfY2Iodm9pZCAqY2FsbGJhY2tDb250ZXh0LAorCQkJICAgdFNpclByZWZOZXR3b3JrRm91bmRJbmQgKnBQcmVmTmV0d29ya0ZvdW5kSW5kKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QgKikgY2FsbGJhY2tDb250ZXh0OworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyIGJ1ZltNQVhfUE5PX05PVElGWV9MRU4gKyAxXTsKKworCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkgICAgICAgIkEgcHJlZmVycmVkIG5ldHdvcmsgd2FzIGZvdW5kOiAlcyB3aXRoIHJzc2k6IC0lZCIsCisJICAgICAgIHBQcmVmTmV0d29ya0ZvdW5kSW5kLT5zc0lkLnNzSWQsIHBQcmVmTmV0d29ya0ZvdW5kSW5kLT5yc3NpKTsKKworCS8qIGNyZWF0ZSB0aGUgZXZlbnQgKi8KKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJc25wcmludGYoYnVmLCBNQVhfUE5PX05PVElGWV9MRU4sCisJCSAiUUNPTTogRm91bmQgcHJlZmVycmVkIG5ldHdvcms6ICVzIHdpdGggUlNTSSBvZiAtJXUiLAorCQkgcFByZWZOZXR3b3JrRm91bmRJbmQtPnNzSWQuc3NJZCwKKwkJICh1bnNpZ25lZCBpbnQpcFByZWZOZXR3b3JrRm91bmRJbmQtPnJzc2kpOworCisJd3JxdS5kYXRhLnBvaW50ZXIgPSBidWY7CisJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCisJLyogc2VuZCB0aGUgZXZlbnQgKi8KKworCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1Zik7CisKK30KKworLyoqCisgKiBfX2l3X3NldF9wbm8oKSAtIFByZWZlcnJlZCBOZXR3b3JrIE9mZmxvYWQgaW9jdGwgaGFuZGxlcgorICogQGRldjogZGV2aWNlIHVwb24gd2hpY2ggdGhlIGlvY3RsIHdhcyByZWNlaXZlZAorICogQGluZm86IGlvY3RsIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEB3cnF1OiBpb2N0bCByZXF1ZXN0IGRhdGEKKyAqIEBleHRyYTogaW9jdGwgZXh0cmEgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgUHJlZmVycmVkIE5ldHdvcmsgT2ZmbG9hZCBjb21tYW5kCisgKiBJbnB1dCBpcyBzdHJpbmcgYmFzZWQgYW5kIGV4cGVjdGVkIHRvIGJlIG9mIHRoZSBmb3JtOgorICoKKyAqIDxlbmFibGUoMSkgfCBkaXNhYmxlKDApPgorICogd2hlbiBlbmFibGluZzoKKyAqIDxudW1iZXIgb2YgbmV0d29ya3M+CisgKiBmb3IgZWFjaCBuZXR3b3JrOgorICogICAgPHNzaWRfbGVuPiA8c3NpZD4gPGF1dGhlbnRpY2F0aW9uPiA8ZW5jcnlwdGlvbj4KKyAqICAgIDxjaF9udW0+IDxjaGFubmVsX2xpc3Qgb3B0aW9uYWw+IDxiY2FzdF90eXBlPiA8cnNzaV90aHJlc2hvbGQ+CisgKiA8bnVtYmVyIG9mIHNjYW4gdGltZXJzPgorICogZm9yIGVhY2ggdGltZXI6CisgKiAgICA8c2Nhbl90aW1lPiA8c2Nhbl9yZXBlYXQ+CisgKiA8c3VzcGVuZCBtb2RlPgorICoKKyAqIGUuZzoKKyAqIDEgMiA0IHRlc3QgMCAwIDMgMSA2IDExIDIgNDAgNSB0ZXN0MiA0IDQgNiAxIDIgMyA0IDUgNiAxIDAgMiA1IDIgMzAwIDAgMQorICoKKyAqIHRoaXMgdHJhbnNsYXRlcyBpbnRvOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGVuYWJsZSBQTk8KKyAqIDIgbmV0d29ya3MKKyAqIE5ldHdvcmsgMToKKyAqICAgdGVzdCAtIHdpdGggYXV0aGVudGljYXRpb24gdHlwZSAwIGFuZCBlbmNyeXB0aW9uIHR5cGUgMCwKKyAqICAgc2VhcmNoIG9uIDMgY2hhbm5lbHM6IDEgNiBhbmQgMTEsCisgKiAgIFNTSUQgYmNhc3QgdHlwZSBpcyB1bmtub3duIChkaXJlY3RlZCBwcm9iZSB3aWxsIGJlIHNlbnQgaWYKKyAqICAgQVAgbm90IGZvdW5kKSBhbmQgbXVzdCBtZWV0IC00MGRCbSBSU1NJCisgKiBOZXR3b3JrIDI6CisgKiAgIHRlc3QyIC0gd2l0aCBhdXRoZW50aWNhdGlvbiB0eXBlIDQgYW5kIGVuY3J5cHRpb24gdHlwZSA0LAorICogICBzZWFyY2ggb24gNiBjaGFubmVscyAxLCAyLCAzLCA0LCA1IGFuZCA2CisgKiAgIGJjYXN0IHR5cGUgaXMgbm9uLWJjYXN0IChkaXJlY3RlZCBwcm9iZSB3aWxsIGJlIHNlbnQpCisgKiAgIGFuZCBtdXN0IG5vdCBtZWV0IGFueSBSU1NJIHRocmVzaG9sZAorICogMiBzY2FuIHRpbWVyczoKKyAqICAgc2NhbiBldmVyeSA1IHNlY29uZHMgMiB0aW1lcworICogICB0aGVuIHNjYW4gZXZlcnkgMzAwIHNlY29uZHMgdW50aWwgc3RvcHBlZAorICogZW5hYmxlIG9uIHN1c3BlbmQKKyAqLworc3RhdGljIGludCBfX2l3X3NldF9wbm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICphZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJaGRkX2NvbnRleHRfdCAqaGRkX2N0eDsKKwlpbnQgcmV0OworCWludCBvZmZzZXQ7CisJY2hhciAqcHRyOworCXVpbnQ4X3QgaSwgaiwgcGFyYW1zLCBtb2RlOworCisJLyogcmVxdWVzdCBpcyBhIGxhcmdlIHN0cnVjdCwgc28gd2UgbWFrZSBpdCBzdGF0aWMgdG8gYXZvaWQKKwkgKiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgQVBJIGlzIG9ubHkgaW52b2tlZCB2aWEgaW9jdGwsIHNvIGl0CisJICogaXMgc2VyaWFsaXplZCBieSB0aGUga2VybmVsIHJ0bmxfbG9jayBhbmQgaGVuY2UgZG9lcyBub3QKKwkgKiBuZWVkIHRvIGJlIHJlZW50cmFudAorCSAqLworCXN0YXRpYyB0U2lyUE5PU2NhblJlcSByZXF1ZXN0OworCisJRU5URVIoKTsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKGFkYXB0ZXIpOworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWhkZF9ub3RpY2UoIlBOTyBkYXRhIGxlbiAlZCBkYXRhICVzIiwgd3JxdS0+ZGF0YS5sZW5ndGgsIGV4dHJhKTsKKworCXJlcXVlc3QuZW5hYmxlID0gMDsKKwlyZXF1ZXN0LnVjTmV0d29ya3NDb3VudCA9IDA7CisKKwlwdHIgPSBleHRyYTsKKworCWlmICgxICE9IHNzY2FuZihwdHIsICIlaGh1JW4iLCAmKHJlcXVlc3QuZW5hYmxlKSwgJm9mZnNldCkpIHsKKwkJaGRkX2VycigiUE5PIGVuYWJsZSBpbnB1dCBpcyBub3QgdmFsaWQgJXMiLCBwdHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoMCA9PSByZXF1ZXN0LmVuYWJsZSkgeworCQkvKiBEaXNhYmxlIFBOTywgaWdub3JlIGFueSBvdGhlciBwYXJhbXMgKi8KKwkJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCQlzbWVfc2V0X3ByZWZlcnJlZF9uZXR3b3JrX2xpc3QoV0xBTl9IRERfR0VUX0hBTF9DVFgoYWRhcHRlciksCisJCQkJCSAgICAgICAmcmVxdWVzdCwgYWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICAgICAgZm91bmRfcHJlZl9uZXR3b3JrX2NiLCBhZGFwdGVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHRyICs9IG9mZnNldDsKKworCWlmICgxICE9CisJICAgIHNzY2FuZihwdHIsICIlaGh1ICVuIiwgJihyZXF1ZXN0LnVjTmV0d29ya3NDb3VudCksICZvZmZzZXQpKSB7CisJCWhkZF9lcnIoIlBOTyBjb3VudCBpbnB1dCBub3QgdmFsaWQgJXMiLCBwdHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCWhkZF9pbmZvKCJQTk8gZW5hYmxlICVkIG5ldHdvcmtzIGNvdW50ICVkIG9mZnNldCAlZCIsCisJCSByZXF1ZXN0LmVuYWJsZSwgcmVxdWVzdC51Y05ldHdvcmtzQ291bnQsIG9mZnNldCk7CisKKwlpZiAoKDAgPT0gcmVxdWVzdC51Y05ldHdvcmtzQ291bnQpIHx8CisJICAgIChyZXF1ZXN0LnVjTmV0d29ya3NDb3VudCA+IFNJUl9QTk9fTUFYX1NVUFBfTkVUV09SS1MpKSB7CisJCWhkZF9lcnIoIk5ldHdvcmsgY291bnQgJWQgaW52YWxpZCIsCisJCQlyZXF1ZXN0LnVjTmV0d29ya3NDb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXB0ciArPSBvZmZzZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdC51Y05ldHdvcmtzQ291bnQ7IGkrKykgeworCisJCXJlcXVlc3QuYU5ldHdvcmtzW2ldLnNzSWQubGVuZ3RoID0gMDsKKworCQlwYXJhbXMgPSBzc2NhbmYocHRyLCAiJWhodSAlbiIsCisJCQkJICAmKHJlcXVlc3QuYU5ldHdvcmtzW2ldLnNzSWQubGVuZ3RoKSwKKwkJCQkgICZvZmZzZXQpOworCisJCWlmICgxICE9IHBhcmFtcykgeworCQkJaGRkX2VycigiUE5PIHNzaWQgbGVuZ3RoIGlucHV0IGlzIG5vdCB2YWxpZCAlcyIsIHB0cik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICgoMCA9PSByZXF1ZXN0LmFOZXR3b3Jrc1tpXS5zc0lkLmxlbmd0aCkgfHwKKwkJICAgIChyZXF1ZXN0LmFOZXR3b3Jrc1tpXS5zc0lkLmxlbmd0aCA+IDMyKSkgeworCQkJaGRkX2VycigiU1NJRCBMZW4gJWQgaXMgbm90IGNvcnJlY3QgZm9yIG5ldHdvcmsgJWQiLAorCQkJCSAgcmVxdWVzdC5hTmV0d29ya3NbaV0uc3NJZC5sZW5ndGgsIGkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBBZHZhbmNlIHRvIFNTSUQgKi8KKwkJcHRyICs9IG9mZnNldDsKKworCQltZW1jcHkocmVxdWVzdC5hTmV0d29ya3NbaV0uc3NJZC5zc0lkLCBwdHIsCisJCSAgICAgICByZXF1ZXN0LmFOZXR3b3Jrc1tpXS5zc0lkLmxlbmd0aCk7CisJCXB0ciArPSByZXF1ZXN0LmFOZXR3b3Jrc1tpXS5zc0lkLmxlbmd0aDsKKworCQlwYXJhbXMgPSBzc2NhbmYocHRyLCAiJXUgJXUgJWhodSAlbiIsCisJCQkJICAmKHJlcXVlc3QuYU5ldHdvcmtzW2ldLmF1dGhlbnRpY2F0aW9uKSwKKwkJCQkgICYocmVxdWVzdC5hTmV0d29ya3NbaV0uZW5jcnlwdGlvbiksCisJCQkJICAmKHJlcXVlc3QuYU5ldHdvcmtzW2ldLnVjQ2hhbm5lbENvdW50KSwKKwkJCQkgICZvZmZzZXQpOworCisJCWlmICgzICE9IHBhcmFtcykgeworCQkJaGRkX3dhcm4oIkluY29ycmVjdCBjbWQgJXMiLCBwdHIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQloZGRfbm90aWNlKCJQTk8gbGVuICVkIHNzaWQgJS4qcyBhdXRoICVkIGVuY3J5ICVkIGNoYW5uZWwgY291bnQgJWQgb2Zmc2V0ICVkIiwKKwkJCSAgcmVxdWVzdC5hTmV0d29ya3NbaV0uc3NJZC5sZW5ndGgsCisJCQkgIHJlcXVlc3QuYU5ldHdvcmtzW2ldLnNzSWQubGVuZ3RoLAorCQkJICByZXF1ZXN0LmFOZXR3b3Jrc1tpXS5zc0lkLnNzSWQsCisJCQkgIHJlcXVlc3QuYU5ldHdvcmtzW2ldLmF1dGhlbnRpY2F0aW9uLAorCQkJICByZXF1ZXN0LmFOZXR3b3Jrc1tpXS5lbmNyeXB0aW9uLAorCQkJICByZXF1ZXN0LmFOZXR3b3Jrc1tpXS51Y0NoYW5uZWxDb3VudCwgb2Zmc2V0KTsKKworCQkvKiBBZHZhbmNlIHRvIGNoYW5uZWwgbGlzdCAqLworCQlwdHIgKz0gb2Zmc2V0OworCisJCWlmIChTSVJfUE5PX01BWF9ORVRXX0NIQU5ORUxTIDwKKwkJICAgIHJlcXVlc3QuYU5ldHdvcmtzW2ldLnVjQ2hhbm5lbENvdW50KSB7CisJCQloZGRfd2FybigiSW5jb3JyZWN0IG51bWJlciBvZiBjaGFubmVscyIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoMCAhPSByZXF1ZXN0LmFOZXR3b3Jrc1tpXS51Y0NoYW5uZWxDb3VudCkgeworCQkJZm9yIChqID0gMDsgaiA8IHJlcXVlc3QuYU5ldHdvcmtzW2ldLnVjQ2hhbm5lbENvdW50OworCQkJICAgICBqKyspIHsKKwkJCQlpZiAoMSAhPQorCQkJCSAgICBzc2NhbmYocHRyLCAiJWhodSAlbiIsCisJCQkJCSAgICYocmVxdWVzdC5hTmV0d29ya3NbaV0uCisJCQkJCSAgICAgYUNoYW5uZWxzW2pdKSwgJm9mZnNldCkpIHsKKwkJCQkJaGRkX2VycigiUE5PIG5ldHdvcmsgY2hhbm5lbCBpbnB1dCBpcyBub3QgdmFsaWQgJXMiLAorCQkJCQkJICBwdHIpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJLyogQWR2YW5jZSB0byBuZXh0IGNoYW5uZWwgbnVtYmVyICovCisJCQkJcHRyICs9IG9mZnNldDsKKwkJCX0KKwkJfQorCisJCWlmICgxICE9IHNzY2FuZihwdHIsICIldSAlbiIsCisJCQkJJihyZXF1ZXN0LmFOZXR3b3Jrc1tpXS5iY2FzdE5ldHdUeXBlKSwKKwkJCQkmb2Zmc2V0KSkgeworCQkJaGRkX2VycigiUE5PIGJyb2FkY2FzdCBuZXR3b3JrIHR5cGUgaW5wdXQgaXMgbm90IHZhbGlkICVzIiwKKwkJCQkgIHB0cik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWhkZF9ub3RpY2UoIlBOTyBiY2FzdE5ldHdUeXBlICVkIG9mZnNldCAlZCIsCisJCQkgIHJlcXVlc3QuYU5ldHdvcmtzW2ldLmJjYXN0TmV0d1R5cGUsIG9mZnNldCk7CisKKwkJLyogQWR2YW5jZSB0byByc3NpIFRocmVzaG9sZCAqLworCQlwdHIgKz0gb2Zmc2V0OworCQlpZiAoMSAhPSBzc2NhbmYocHRyLCAiJWQgJW4iLAorCQkJCSYocmVxdWVzdC5hTmV0d29ya3NbaV0ucnNzaVRocmVzaG9sZCksCisJCQkJJm9mZnNldCkpIHsKKwkJCWhkZF9lcnIoIlBOTyByc3NpIHRocmVzaG9sZCBpbnB1dCBpcyBub3QgdmFsaWQgJXMiLAorCQkJCSAgcHRyKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWhkZF9ub3RpY2UoIlBOTyByc3NpICVkIG9mZnNldCAlZCIsCisJCQkgIHJlcXVlc3QuYU5ldHdvcmtzW2ldLnJzc2lUaHJlc2hvbGQsIG9mZnNldCk7CisJCS8qIEFkdmFuY2UgdG8gbmV4dCBuZXR3b3JrICovCisJCXB0ciArPSBvZmZzZXQ7CisJfSAvKiBGb3IgdWNOZXR3b3JrQ291bnQgKi8KKworCXBhcmFtcyA9IHNzY2FuZihwdHIsICIlaGh1ICVuIiwKKwkJCSAgJihyZXF1ZXN0LnNjYW5UaW1lcnMudWNTY2FuVGltZXJzQ291bnQpLCAmb2Zmc2V0KTsKKworCS8qIFJlYWQgdGhlIHNjYW4gdGltZXJzICovCisJaWYgKCgxID09IHBhcmFtcykgJiYgKHJlcXVlc3Quc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudCA+IDApKSB7CisJCXB0ciArPSBvZmZzZXQ7CisKKwkJaGRkX25vdGljZSgiU2NhbiB0aW1lciBjb3VudCAlZCBvZmZzZXQgJWQiLAorCQkJICByZXF1ZXN0LnNjYW5UaW1lcnMudWNTY2FuVGltZXJzQ291bnQsIG9mZnNldCk7CisKKwkJaWYgKFNJUl9QTk9fTUFYX1NDQU5fVElNRVJTIDwKKwkJICAgIHJlcXVlc3Quc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudCkgeworCQkJaGRkX2VycigiSW5jb3JyZWN0IGNtZCAtIHRvbyBtYW55IHNjYW4gdGltZXJzIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCByZXF1ZXN0LnNjYW5UaW1lcnMudWNTY2FuVGltZXJzQ291bnQ7IGkrKykgeworCQkJcGFyYW1zID0gc3NjYW5mKHB0ciwgIiV1ICV1ICVuIiwKKwkJCQkJICAmKHJlcXVlc3Quc2NhblRpbWVycy4KKwkJCQkJICAgIGFUaW1lclZhbHVlc1tpXS51VGltZXJWYWx1ZSksCisJCQkJCSAgJihyZXF1ZXN0LnNjYW5UaW1lcnMuCisJCQkJCSAgICBhVGltZXJWYWx1ZXNbaV0udVRpbWVyUmVwZWF0KSwKKwkJCQkJICAmb2Zmc2V0KTsKKworCQkJaWYgKDIgIT0gcGFyYW1zKSB7CisJCQkJaGRkX2VycigiSW5jb3JyZWN0IGNtZCAtIGRpZmYgcGFyYW1zIHRoZW4gZXhwZWN0ZWQgJWQiLAorCQkJCQkgIHBhcmFtcyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWhkZF9ub3RpY2UoIlBOTyBUaW1lciB2YWx1ZSAlZCBUaW1lciByZXBlYXQgJWQgb2Zmc2V0ICVkIiwKKwkJCQkgIHJlcXVlc3Quc2NhblRpbWVycy5hVGltZXJWYWx1ZXNbaV0uCisJCQkJICB1VGltZXJWYWx1ZSwKKwkJCQkgIHJlcXVlc3Quc2NhblRpbWVycy5hVGltZXJWYWx1ZXNbaV0uCisJCQkJICB1VGltZXJSZXBlYXQsIG9mZnNldCk7CisKKwkJCXB0ciArPSBvZmZzZXQ7CisJCX0KKworCX0gZWxzZSB7CisJCWhkZF9ub3RpY2UoIk5vIHNjYW4gdGltZXJzIHByb3ZpZGVkIHBhcmFtIGNvdW50ICVkIHNjYW4gdGltZXJzICVkIiwKKwkJCSAgcGFyYW1zLCByZXF1ZXN0LnNjYW5UaW1lcnMudWNTY2FuVGltZXJzQ291bnQpOworCisJCS8qIFNjYW4gdGltZXJzIGRlZmF1bHRzIHRvIDUgbWludXRlcyAqLworCQlyZXF1ZXN0LnNjYW5UaW1lcnMudWNTY2FuVGltZXJzQ291bnQgPSAxOworCQlyZXF1ZXN0LnNjYW5UaW1lcnMuYVRpbWVyVmFsdWVzWzBdLnVUaW1lclZhbHVlID0gNjA7CisJCXJlcXVlc3Quc2NhblRpbWVycy5hVGltZXJWYWx1ZXNbMF0udVRpbWVyUmVwZWF0ID0gMDsKKwl9CisKKwlwYXJhbXMgPSBzc2NhbmYocHRyLCAiJWhodSAlbiIsICYobW9kZSksICZvZmZzZXQpOworCisJcmVxdWVzdC5tb2RlUE5PID0gbW9kZTsKKwkvKiBmb3IgTEEgd2UganVzdCBleHBvc2Ugc3VzcGVuZCBvcHRpb24gKi8KKwlpZiAoKDEgIT0gcGFyYW1zKSB8fCAobW9kZSA+PSBTSVJfUE5PX01PREVfTUFYKSkgeworCQlyZXF1ZXN0Lm1vZGVQTk8gPSBTSVJfUE5PX01PREVfT05fU1VTUEVORDsKKwl9CisKKwlzbWVfc2V0X3ByZWZlcnJlZF9uZXR3b3JrX2xpc3QoV0xBTl9IRERfR0VUX0hBTF9DVFgoYWRhcHRlciksCisJCQkJICAgICAgICZyZXF1ZXN0LAorCQkJCSAgICAgICBhZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJICAgICAgIGZvdW5kX3ByZWZfbmV0d29ya19jYiwgYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd19zZXRfcG5vKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0X3BubyhkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCisvKiBDb21tb24gZnVuY3Rpb24gdG8gU2V0QmFuZCAqLworaW50IGhkZF9zZXRfYmFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB1aV9iYW5kKQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCWVDc3JCYW5kIGJhbmQ7CisKKwlDREZfU1RBVFVTIHN0YXR1czsKKwloZGRfY29udGV4dF90ICpwSGRkQ3R4OworCWhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICpwQWRhcHRlck5vZGUsICpwTmV4dDsKKwllQ3NyQmFuZCBjdXJyQmFuZCA9IGVDU1JfQkFORF9NQVg7CisJZUNzckJhbmQgY29ubmVjdGVkQmFuZDsKKworCXBBZGFwdGVyTm9kZSA9IE5VTEw7CisJcE5leHQgPSBOVUxMOworCXBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCXN3aXRjaCAodWlfYmFuZCkgeworCWNhc2UgV0xBTl9IRERfVUlfQkFORF9BVVRPOgorCQliYW5kID0gZUNTUl9CQU5EX0FMTDsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0hERF9VSV9CQU5EXzVfR0haOgorCQliYW5kID0gZUNTUl9CQU5EXzVHOworCQlicmVhazsKKwljYXNlIFdMQU5fSEREX1VJX0JBTkRfMl80X0dIWjoKKwkJYmFuZCA9IGVDU1JfQkFORF8yNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmFuZCA9IGVDU1JfQkFORF9NQVg7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IGNoYW5nZSBiYW5kIHRvICV1IiwgX19mdW5jX18sIGJhbmQpOworCisJaWYgKGJhbmQgPT0gZUNTUl9CQU5EX01BWCkgeworCQkvKiBSZWNlaXZlZCBjaGFuZ2UgYmFuZCByZXF1ZXN0IHdpdGggaW52YWxpZCBiYW5kIHZhbHVlICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgYmFuZCB2YWx1ZSAldSIsIF9fZnVuY19fLCB1aV9iYW5kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChiYW5kID09IGVDU1JfQkFORF8yNCAmJiBwSGRkQ3R4LT5jb25maWctPm5CYW5kQ2FwYWJpbGl0eSA9PSAyKSB8fAorCSAgICAoYmFuZCA9PSBlQ1NSX0JBTkRfNUcgJiYgcEhkZEN0eC0+Y29uZmlnLT5uQmFuZENhcGFiaWxpdHkgPT0gMSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogYmFuZCB2YWx1ZSAldSB2aW9sYXRlIElOSSBzZXR0aW5ncyAldSIsIF9fZnVuY19fLAorCQkJICBiYW5kLCBwSGRkQ3R4LT5jb25maWctPm5CYW5kQ2FwYWJpbGl0eSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChiYW5kID09IGVDU1JfQkFORF9BTEwpIHsKKwkJaGRkTG9nKExPRzEsCisJCQlGTCgiQXV0byBiYW5kIHJlY2VpdmVkLiBTZXR0aW5nIGJhbmQgc2FtZSBhcyBpbmkgdmFsdWUgJWQiKSwKKwkJCXBIZGRDdHgtPmNvbmZpZy0+bkJhbmRDYXBhYmlsaXR5KTsKKwkJYmFuZCA9IHBIZGRDdHgtPmNvbmZpZy0+bkJhbmRDYXBhYmlsaXR5OworCX0KKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX2dldF9mcmVxX2JhbmQoaEhhbCwgJmN1cnJCYW5kKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IEZhaWxlZCB0byBnZXQgY3VycmVudCBiYW5kIGNvbmZpZyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGN1cnJCYW5kICE9IGJhbmQpIHsKKwkJLyogQ2hhbmdlIGJhbmQgcmVxdWVzdCByZWNlaXZlZC4KKwkJICogQWJvcnQgcGVuZGluZyBzY2FuIHJlcXVlc3RzLCBmbHVzaCB0aGUgZXhpc3Rpbmcgc2NhbiByZXN1bHRzLAorCQkgKiBhbmQgY2hhbmdlIHRoZSBiYW5kIGNhcGFiaWxpdHkKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogQ3VycmVudCBiYW5kIHZhbHVlID0gJXUsIG5ldyBzZXR0aW5nICV1ICIsCisJCQkgIF9fZnVuY19fLCBjdXJyQmFuZCwgYmFuZCk7CisKKwkJc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyKHBIZGRDdHgsICZwQWRhcHRlck5vZGUpOworCQl3aGlsZSAoTlVMTCAhPSBwQWRhcHRlck5vZGUgJiYgQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQkJcEFkYXB0ZXIgPSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyOworCQkJaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwkJCWhkZF9hYm9ydF9tYWNfc2NhbihwSGRkQ3R4LCBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkgICBlQ1NSX1NDQU5fQUJPUlRfRFVFX1RPX0JBTkRfQ0hBTkdFKTsKKwkJCWNvbm5lY3RlZEJhbmQgPQorCQkJCWhkZF9jb25uX2dldF9jb25uZWN0ZWRfYmFuZAorCQkJCQkoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpOworCisJCQkvKiBIYW5kbGluZyBpcyBkb25lIG9ubHkgZm9yIFNUQSBhbmQgUDJQICovCisJCQlpZiAoYmFuZCAhPSBlQ1NSX0JBTkRfQUxMICYmCisJCQkgICAgKChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikKKwkJCSAgICAgfHwgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfQ0xJRU5UKSkKKwkJCSAgICAmJgorCQkJICAgIChoZGRfY29ubl9pc19jb25uZWN0ZWQKKwkJCQkgICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSkpCisJCQkgICAgJiYgKGNvbm5lY3RlZEJhbmQgIT0gYmFuZCkpIHsKKwkJCQlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCQlsb25nIGxyYzsKKworCQkJCS8qIFNUQSBhbHJlYWR5IGNvbm5lY3RlZCBvbiBjdXJyZW50IGJhbmQsIFNvIGlzc3VlIGRpc2Nvbm5lY3QKKwkJCQkgKiBmaXJzdCwgdGhlbiBjaGFuZ2UgdGhlIGJhbmQqLworCisJCQkJaGRkTG9nKExPRzEsCisJCQkJCUZMKCJTVEEgKERldmljZSBtb2RlICVzKCVkKSkgY29ubmVjdGVkIGluIGJhbmQgJXUsIENoYW5naW5nIGJhbmQgdG8gJXUsIElzc3VpbmcgRGlzY29ubmVjdCIpLAorCQkJCQloZGRfZGV2aWNlX21vZGVfdG9fc3RyaW5nKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSksCisJCQkJCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSwgY3VyckJhbmQsIGJhbmQpOworCQkJCUlOSVRfQ09NUExFVElPTihwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3Zhcik7CisKKwkJCQlzdGF0dXMgPQorCQkJCQlzbWVfcm9hbV9kaXNjb25uZWN0KFdMQU5fSEREX0dFVF9IQUxfQ1RYCisJCQkJCQkJCSAgICAocEFkYXB0ZXIpLAorCQkJCQkJCSAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQkJCSAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKKworCQkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQkJCWhkZExvZyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgICAgICAiJXMgY3NyX3JvYW1fZGlzY29ubmVjdCBmYWlsdXJlLCByZXR1cm5lZCAlZCIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgKGludClzdGF0dXMpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlscmMgPQorCQkJCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnBBZGFwdGVyLT4KKwkJCQkJCQkJICAgIGRpc2Nvbm5lY3RfY29tcF92YXIsCisJCQkJCQkJCSAgICBtc2Vjc190b19qaWZmaWVzCisJCQkJCQkJCQkgICAgKFdMQU5fV0FJVF9USU1FX0RJU0NPTk5FQ1QpKTsKKworCQkJCWlmIChscmMgPT0gMCkgeworCQkJCQloZGRMb2coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICAgICAgIiVzOlRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY3NyX3JvYW1fZGlzY29ubmVjdCIsCisJCQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQkJCXJldHVybiAtRVRJTUVET1VUOworCQkJCX0KKwkJCX0KKworCQkJc21lX3NjYW5fZmx1c2hfcmVzdWx0KGhIYWwpOworCisJCQlzdGF0dXMgPQorCQkJCWhkZF9nZXRfbmV4dF9hZGFwdGVyKHBIZGRDdHgsIHBBZGFwdGVyTm9kZSwgJnBOZXh0KTsKKwkJCXBBZGFwdGVyTm9kZSA9IHBOZXh0OworCQl9CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkgICAgc21lX3NldF9mcmVxX2JhbmQoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwgYmFuZCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCSAgRkwoIkZhaWxlZCB0byBzZXQgdGhlIGJhbmQgdmFsdWUgdG8gJXUiKSwKKwkJCQkgIGJhbmQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2JhbmQocEhkZEN0eC0+d2lwaHksIChlQ3NyQmFuZCkgYmFuZCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgaGRkX3NldF9iYW5kX2hlbHBlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb21tYW5kKQoreworCXVpbnQ4X3QgYmFuZDsKKwlpbnQgcmV0OworCisJLyogQ29udmVydCB0aGUgYmFuZCB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIgKi8KKwljb21tYW5kICs9IFdMQU5fSEREX1VJX1NFVF9CQU5EX1ZBTFVFX09GRlNFVDsKKwlyZXQgPSBrc3RydG91OChjb21tYW5kLCAxMCwgJmJhbmQpOworCWlmIChyZXQgPCAwKSB7CisJCWhkZExvZyhMT0dFLCBGTCgia3N0cnRvdTggZmFpbGVkIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaGRkX3NldF9iYW5kKGRldiwgYmFuZCk7Cit9CisKK3N0YXRpYyBpbnQgX19pd19zZXRfYmFuZF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisKKwlFTlRFUigpOworCisJcmV0dXJuIGhkZF9zZXRfYmFuZChkZXYsIHZhbHVlWzBdKTsKK30KKworc3RhdGljIGludCBpd19zZXRfYmFuZF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCisJY2RzX3Nzcl9wcm90ZWN0KF9fZnVuY19fKTsKKwlyZXQgPSBfX2l3X3NldF9iYW5kX2NvbmZpZyhkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faXdfc2V0X3R3b19pbnRzX2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisJaW50IHN1Yl9jbWQgPSB2YWx1ZVswXTsKKwlpbnQgcmV0OworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCXJldCA9IHdsYW5faGRkX3ZhbGlkYXRlX2NvbnRleHQoaGRkX2N0eCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChzdWJfY21kKSB7CisJY2FzZSBXRV9TRVRfU01QU19QQVJBTToKKwkJaGRkTG9nKExPRzEsICJXRV9TRVRfU01QU19QQVJBTSB2YWwgJWQgJWQiLCB2YWx1ZVsxXSwgdmFsdWVbMl0pOworCQlyZXQgPSB3bWFfY2xpX3NldF9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgV01JX1NUQV9TTVBTX1BBUkFNX0NNRElELAorCQkJCQkgIHZhbHVlWzFdIDw8IFdNQV9TTVBTX1BBUkFNX1ZBTFVFX1MKKwkJCQkJICAgICAgfCB2YWx1ZVsyXSwKKwkJCQkJICBWREVWX0NNRCk7CisJCWJyZWFrOworI2lmZGVmIERFQlVHCisJY2FzZSBXRV9TRVRfRldfQ1JBU0hfSU5KRUNUOgorCQloZGRMb2coTE9HRSwgIldFX1NFVF9GV19DUkFTSF9JTkpFQ1Q6ICVkICVkIiwKKwkJICAgICAgIHZhbHVlWzFdLCB2YWx1ZVsyXSk7CisJCXJldCA9IHdtYV9jbGlfc2V0Ml9jb21tYW5kKHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgIEdFTl9QQVJBTV9DUkFTSF9JTkpFQ1QsCisJCQkJCSAgIHZhbHVlWzFdLCB2YWx1ZVsyXSwgR0VOX0NNRCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBXRV9TRVRfRFVBTF9NQUNfRldfTU9ERV9DT05GSUc6CisJCWhkZF9kZWJ1ZygiSW9jdGwgdG8gc2V0IGR1YWwgZncgbW9kZSBjb25maWciKTsKKwkJaWYgKGhkZF9jdHgtPmNvbmZpZy0+ZHVhbF9tYWNfZmVhdHVyZV9kaXNhYmxlKSB7CisJCQloZGRfZXJyKCJEdWFsIG1hYyBmZWF0dXJlIGlzIGRpc2FibGVkIGZyb20gSU5JIik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCWhkZF9kZWJ1ZygiJWQgJWQiLCB2YWx1ZVsxXSwgdmFsdWVbMl0pOworCQljZHNfc2V0X2R1YWxfbWFjX2Z3X21vZGVfY29uZmlnKGhkZF9jdHgsCisJCQkJdmFsdWVbMV0sIHZhbHVlWzJdKTsKKwkJYnJlYWs7CisJY2FzZSBXRV9EVU1QX0RQX1RSQUNFX0xFVkVMOgorCQloZGRfaW5mbygiV0VfRFVNUF9EUF9UUkFDRV9MRVZFTDogJWQgJWQiLAorCQkgICAgICAgdmFsdWVbMV0sIHZhbHVlWzJdKTsKKwkJaWYgKHZhbHVlWzFdID09IERVTVBfRFBfVFJBQ0UpCisJCQljZGZfZHBfdHJhY2VfZHVtcF9hbGwodmFsdWVbMl0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQloZGRMb2coTE9HRSwgIiVzOiBJbnZhbGlkIElPQ1RMIGNvbW1hbmQgJWQiLCBfX2Z1bmNfXywgc3ViX2NtZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X3R3b19pbnRzX2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisKKwljZHNfc3NyX3Byb3RlY3QoX19mdW5jX18pOworCXJldCA9IF9faXdfc2V0X3R3b19pbnRzX2dldG5vbmUoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CisJY2RzX3Nzcl91bnByb3RlY3QoX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworLyogRGVmaW5lIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zIHRvIHRoZSBMaW51eCBOZXR3b3JrIERldmljZSBzdHJ1Y3R1cmUgKi8KKy8qIEEgbnVtYmVyIG9mIHRoZXNlIHJvdXRpbmVzIGFyZSBOVUxMIChtZWFuaW5nIHRoZXkgYXJlIG5vdCBpbXBsZW1lbnRlZC4pICovCisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHdlX2hhbmRsZXJbXSA9IHsKKwkoaXdfaGFuZGxlcikgaXdfc2V0X2NvbW1pdCwgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X25hbWUsICAgICAgIC8qIFNJT0NHSVdOQU1FICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV05XSUQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DR0lXTldJRCAqLworCShpd19oYW5kbGVyKSBpd19zZXRfZnJlcSwgICAgICAgLyogU0lPQ1NJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X2ZyZXEsICAgICAgIC8qIFNJT0NHSVdGUkVRICovCisJKGl3X2hhbmRsZXIpIGl3X3NldF9tb2RlLCAgICAgICAvKiBTSU9DU0lXTU9ERSAqLworCShpd19oYW5kbGVyKSBpd19nZXRfbW9kZSwgICAgICAgLyogU0lPQ0dJV01PREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DU0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIGl3X2dldF9yYW5nZSwgICAgICAvKiBTSU9DR0lXUkFOR0UgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DU0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdQUklWICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV1NUQVRTICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ0dJV1NUQVRTICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV1NQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIFNJT0NHSVdTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiBTSU9DU0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBpd19zZXRfYXBfYWRkcmVzcywgLyogU0lPQ1NJV0FQICovCisJKGl3X2hhbmRsZXIpIGl3X2dldF9hcF9hZGRyZXNzLCAvKiBTSU9DR0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgaXdfc2V0X21sbWUsICAgICAgIC8qIFNJT0NTSVdNTE1FICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ0dJV0FQTElTVCAqLworCShpd19oYW5kbGVyKSBpd19zZXRfc2NhbiwgICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X3NjYW4sICAgICAgIC8qIFNJT0NHSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIGl3X3NldF9lc3NpZCwgICAgICAvKiBTSU9DU0lXRVNTSUQgKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X2Vzc2lkLCAgICAgIC8qIFNJT0NHSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBpd19zZXRfbmljaywgICAgICAgLyogU0lPQ1NJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIGl3X2dldF9uaWNrLCAgICAgICAvKiBTSU9DR0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBpd19zZXRfYml0cmF0ZSwgICAgLyogU0lPQ1NJV1JBVEUgKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X2JpdHJhdGUsICAgIC8qIFNJT0NHSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIGl3X3NldF9ydHNfdGhyZXNob2xkLCAgICAgIC8qIFNJT0NTSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X3J0c190aHJlc2hvbGQsICAgICAgLyogU0lPQ0dJV1JUUyAqLworCShpd19oYW5kbGVyKSBpd19zZXRfZnJhZ190aHJlc2hvbGQsICAgICAvKiBTSU9DU0lXRlJBRyAqLworCShpd19oYW5kbGVyKSBpd19nZXRfZnJhZ190aHJlc2hvbGQsICAgICAvKiBTSU9DR0lXRlJBRyAqLworCShpd19oYW5kbGVyKSBpd19zZXRfdHhfcG93ZXIsICAgLyogU0lPQ1NJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIGl3X2dldF90eF9wb3dlciwgICAvKiBTSU9DR0lXVFhQT1cgKi8KKwkoaXdfaGFuZGxlcikgaXdfc2V0X3JldHJ5LCAgICAgIC8qIFNJT0NTSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBpd19nZXRfcmV0cnksICAgICAgLyogU0lPQ0dJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIGl3X3NldF9lbmNvZGUsICAgICAvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIGl3X2dldF9lbmNvZGUsICAgICAvKiBTSU9DR0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIGl3X3NldF9wb3dlcl9tb2RlLCAvKiBTSU9DU0lXUE9XRVIgKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X3Bvd2VyX21vZGUsIC8qIFNJT0NHSVdQT1dFUiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIGl3X3NldF9nZW5pZSwgICAgICAvKiBTSU9DU0lXR0VOSUUgKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X2dlbmllLCAgICAgIC8qIFNJT0NHSVdHRU5JRSAqLworCShpd19oYW5kbGVyKSBpd19zZXRfYXV0aCwgICAgICAgLyogU0lPQ1NJV0FVVEggKi8KKwkoaXdfaGFuZGxlcikgaXdfZ2V0X2F1dGgsICAgICAgIC8qIFNJT0NHSVdBVVRIICovCisJKGl3X2hhbmRsZXIpIGl3X3NldF9lbmNvZGVleHQsICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIGl3X2dldF9lbmNvZGVleHQsICAvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgLyogU0lPQ1NJV1BNS1NBICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciB3ZV9wcml2YXRlW10gPSB7CisKKwlbV0xBTl9QUklWX1NFVF9JTlRfR0VUX05PTkUgLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfc2V0aW50X2dldG5vbmUsICAgICAvKiBzZXQgcHJpdiBpb2N0bCAqLworCVtXTEFOX1BSSVZfU0VUX05PTkVfR0VUX0lOVCAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19zZXRub25lX2dldGludCwgICAgIC8qIGdldCBwcml2IGlvY3RsICovCisJW1dMQU5fUFJJVl9TRVRfQ0hBUl9HRVRfTk9ORSAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19zZXRjaGFyX2dldG5vbmUsICAgLyogZ2V0IHByaXYgaW9jdGwgKi8KKwlbV0xBTl9QUklWX1NFVF9USFJFRV9JTlRfR0VUX05PTkUgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc2V0X3RocmVlX2ludHNfZ2V0bm9uZSwKKwlbV0xBTl9QUklWX0dFVF9DSEFSX1NFVF9OT05FIC0gU0lPQ0lXRklSU1RQUklWXSA9IGl3X2dldF9jaGFyX3NldG5vbmUsCisJW1dMQU5fUFJJVl9TRVRfTk9ORV9HRVRfTk9ORSAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19zZXRub25lX2dldG5vbmUsICAgLyogYWN0aW9uIHByaXYgaW9jdGwgKi8KKwlbV0xBTl9QUklWX1NFVF9WQVJfSU5UX0dFVF9OT05FIC0gU0lPQ0lXRklSU1RQUklWXSA9CisJCWl3X2hkZF9zZXRfdmFyX2ludHNfZ2V0bm9uZSwKKwlbV0xBTl9QUklWX0FERF9UU1BFQyAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19hZGRfdHNwZWMsCisJW1dMQU5fUFJJVl9ERUxfVFNQRUMgLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfZGVsX3RzcGVjLAorCVtXTEFOX1BSSVZfR0VUX1RTUEVDIC0gU0lPQ0lXRklSU1RQUklWXSA9IGl3X2dldF90c3BlYywKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCVtXTEFOX1BSSVZfU0VUX0ZUSUVTIC0gU0lPQ0lXRklSU1RQUklWXSA9IGl3X3NldF9mdGllcywKKyNlbmRpZgorCVtXTEFOX1BSSVZfU0VUX0hPU1RfT0ZGTE9BRCAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19zZXRfaG9zdF9vZmZsb2FkLAorCVtXTEFOX0dFVF9XTEFOX1NUQVRJU1RJQ1MgLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfZ2V0X3N0YXRpc3RpY3MsCisJW1dMQU5fU0VUX0tFRVBBTElWRV9QQVJBTVMgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc2V0X2tlZXBhbGl2ZV9wYXJhbXMsCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKwlbV0xBTl9TRVRfUEFDS0VUX0ZJTFRFUl9QQVJBTVMgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc2V0X3BhY2tldF9maWx0ZXJfcGFyYW1zLAorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisJW1dMQU5fU0VUX1BOTyAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19zZXRfcG5vLAorI2VuZGlmCisJW1dMQU5fU0VUX0JBTkRfQ09ORklHIC0gU0lPQ0lXRklSU1RQUklWXSA9IGl3X3NldF9iYW5kX2NvbmZpZywKKwlbV0xBTl9HRVRfTElOS19TUEVFRCAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19nZXRfbGlua3NwZWVkLAorCVtXTEFOX1BSSVZfU0VUX1RXT19JTlRfR0VUX05PTkUgLSBTSU9DSVdGSVJTVFBSSVZdID0KKwkJaXdfc2V0X3R3b19pbnRzX2dldG5vbmUsCisJW1dMQU5fU0VUX0RPVDExUF9DSEFOTkVMX1NDSEVEIC0gU0lPQ0lXRklSU1RQUklWXSA9CisJCWl3X3NldF9kb3QxMXBfY2hhbm5lbF9zY2hlZCwKK307CisKKy8qTWF4aW11bSBjb21tYW5kIGxlbmd0aCBjYW4gYmUgb25seSAxNSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3Mgd2VfcHJpdmF0ZV9hcmdzW10gPSB7CisKKwkvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCAqLworCXtXTEFOX1BSSVZfU0VUX0lOVF9HRVRfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICIifSwKKworCS8qIGhhbmRsZXJzIGZvciBzdWItaW9jdGwgKi8KKwl7V0VfU0VUXzExRF9TVEFURSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJzZXQxMURzdGF0ZSJ9LAorCisJe1dFX1dPV0wsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAid293bCJ9LAorCisJe1dFX1NFVF9QT1dFUiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJzZXRQb3dlciJ9LAorCisJe1dFX1NFVF9NQVhfQVNTT0MsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAic2V0TWF4QXNzb2MifSwKKworCXtXRV9TRVRfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT04sCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCQkic2V0QXV0b0NoYW5uZWwiIH0sCisKKwl7V0VfU0VUX1NDQU5fRElTQUJMRSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJzY2FuX2Rpc2FibGUifSwKKworCXtXRV9TRVRfREFUQV9JTkFDVElWSVRZX1RPLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgImluYWN0aXZpdHlUTyJ9LAorCisJe1dFX1NFVF9NQVhfVFhfUE9XRVIsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAic2V0TWF4VHhQb3dlciJ9LAorCisJe1dFX1NFVF9UWF9QT1dFUiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJzZXRUeFBvd2VyIn0sCisKKwl7V0VfU0VUX01DX1JBVEUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAic2V0TWNSYXRlIn0sCisKKwl7V0VfU0VUX01BWF9UWF9QT1dFUl8yXzQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAic2V0VHhNYXhQb3dlcjJHIn0sCisKKwl7V0VfU0VUX01BWF9UWF9QT1dFUl81XzAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAic2V0VHhNYXhQb3dlcjVHIn0sCisKKwkvKiBTQVAgaGFzIFR4TWF4IHdoZXJlYXMgU1RBIGhhcyBNYXhUeCwgYWRkaW5nIFR4TWF4IGZvciBTVEEKKwkgKiBhcyB3ZWxsIHRvIGtlZXAgc2FtZSBzeW50YXggYXMgaW4gU0FQLiBOb3cgb253YXJkcywgU1RBCisJICogd2lsbCBzdXBwb3J0IGJvdGggKi8KKwl7V0VfU0VUX01BWF9UWF9QT1dFUiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJzZXRUeE1heFBvd2VyIn0sCisKKwkvKiBzZXQgSGlnaGVyIERUSU0gVHJhbnNpdGlvbiAoRFRJTTEgdG8gRFRJTTMpCisJICogMSA9IGVuYWJsZSBhbmQgMCA9IGRpc2FibGUgKi8KKwl7CisJCVdFX1NFVF9ISUdIRVJfRFRJTV9UUkFOU0lUSU9OLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwKKwkJInNldEhEdGltVHJhbnNuIgorCX0sCisKKwl7V0VfU0VUX1RNX0xFVkVMLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgInNldFRtTGV2ZWwifSwKKworCXtXRV9TRVRfUEhZTU9ERSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJzZXRwaHltb2RlIn0sCisKKwl7V0VfU0VUX05TUywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJuc3MifSwKKworCXtXRV9TRVRfTERQQywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJsZHBjIn0sCisKKwl7V0VfU0VUX1RYX1NUQkMsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAidHhfc3RiYyJ9LAorCisJe1dFX1NFVF9SWF9TVEJDLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgInJ4X3N0YmMifSwKKworCXtXRV9TRVRfU0hPUlRfR0ksCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAic2hvcnRnaSJ9LAorCisJe1dFX1NFVF9SVFNDVFMsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZW5hYmxlcnRzY3RzIn0sCisKKwl7V0VfU0VUX0NIV0lEVEgsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiY2h3aWR0aCJ9LAorCisJe1dFX1NFVF9BTklfRU5fRElTLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgImFuaWVuYWJsZSJ9LAorCisJe1dFX1NFVF9BTklfUE9MTF9QRVJJT0QsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiYW5pcGxlbiJ9LAorCisJe1dFX1NFVF9BTklfTElTVEVOX1BFUklPRCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJhbmlsaXNsZW4ifSwKKworCXtXRV9TRVRfQU5JX09GRE1fTEVWRUwsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiYW5pb2ZkbWx2bCJ9LAorCisJe1dFX1NFVF9BTklfQ0NLX0xFVkVMLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgImFuaWNja2x2bCJ9LAorCisJe1dFX1NFVF9EWU5BTUlDX0JXLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgImN3bWVuYWJsZSJ9LAorCisJe1dFX1NFVF9DVFNfQ0JXLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgImN0c19jYnciIH0sCisKKwl7V0VfU0VUX0dUWF9IVF9NQ1MsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZ3R4SFRNY3MifSwKKworCXtXRV9TRVRfR1RYX1ZIVF9NQ1MsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZ3R4VkhUTWNzIn0sCisKKwl7V0VfU0VUX0dUWF9VU1JDRkcsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZ3R4VXNyQ2ZnIn0sCisKKwl7V0VfU0VUX0dUWF9USFJFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgImd0eFRocmUifSwKKworCXtXRV9TRVRfR1RYX01BUkdJTiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJndHhNYXJnaW4ifSwKKworCXtXRV9TRVRfR1RYX1NURVAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZ3R4U3RlcCJ9LAorCisJe1dFX1NFVF9HVFhfTUlOVFBDLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgImd0eE1pblRwYyJ9LAorCisJe1dFX1NFVF9HVFhfQldNQVNLLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgImd0eEJXTWFzayJ9LAorCisJe1dFX1NFVF9UWF9DSEFJTk1BU0ssCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAidHhjaGFpbm1hc2sifSwKKworCXtXRV9TRVRfUlhfQ0hBSU5NQVNLLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgInJ4Y2hhaW5tYXNrIn0sCisKKwl7V0VfU0VUXzExTl9SQVRFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgInNldDExTlJhdGVzIn0sCisKKwl7V0VfU0VUX1ZIVF9SQVRFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgInNldDExQUNSYXRlcyJ9LAorCisJe1dFX1NFVF9BTVBEVSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJhbXBkdSJ9LAorCisJe1dFX1NFVF9BTVNEVSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJhbXNkdSJ9LAorCisJe1dFX1NFVF9CVVJTVF9FTkFCTEUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiYnVyc3RfZW5hYmxlIn0sCisKKwl7V0VfU0VUX0JVUlNUX0RVUiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJidXJzdF9kdXIifSwKKworCXtXRV9TRVRfVFhQT1dfMkcsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAidHhwb3cyZyJ9LAorCisJe1dFX1NFVF9UWFBPV181RywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJ0eHBvdzVnIn0sCisKKwl7V0VfU0VUX1BPV0VSX0dBVElORywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJwd3JnYXRpbmcifSwKKworCS8qIFN1Yi1jbWRzIERCR0xPRyBzcGVjaWZpYyBjb21tYW5kcyAqLworCXtXRV9EQkdMT0dfTE9HX0xFVkVMLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgImRsX2xvZ2xldmVsIn0sCisKKwl7V0VfREJHTE9HX1ZBUF9FTkFCTEUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZGxfdmFwb24ifSwKKworCXtXRV9EQkdMT0dfVkFQX0RJU0FCTEUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZGxfdmFwb2ZmIn0sCisKKwl7V0VfREJHTE9HX01PRFVMRV9FTkFCTEUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZGxfbW9kb24ifSwKKworCXtXRV9EQkdMT0dfTU9EVUxFX0RJU0FCTEUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZGxfbW9kb2ZmIn0sCisKKwl7V0VfREJHTE9HX01PRF9MT0dfTEVWRUwsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZGxfbW9kX2xvZ2xldmVsIn0sCisKKwl7V0VfREJHTE9HX1RZUEUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAiZGxfdHlwZSJ9LAorCXtXRV9EQkdMT0dfUkVQT1JUX0VOQUJMRSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsCisJICJkbF9yZXBvcnQifSwKKworCXtXRV9TRVRfVFhSWF9GV1NUQVRTLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwKKwkgInR4cnhfZndfc3RhdHMifSwKKworCXtXRV9UWFJYX0ZXU1RBVFNfUkVTRVQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLAorCSAidHhyeF9md19zdF9yc3QifSwKKworCXtXRV9QUFNfUEFJRF9NQVRDSCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJwYWlkX21hdGNoIn0sCisKKwl7V0VfUFBTX0dJRF9NQVRDSCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJnaWRfbWF0Y2gifSwKKworCXtXRV9QUFNfRUFSTFlfVElNX0NMRUFSLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgInRpbV9jbGVhciJ9LAorCisJe1dFX1BQU19FQVJMWV9EVElNX0NMRUFSLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgImR0aW1fY2xlYXIifSwKKworCXtXRV9QUFNfRU9GX1BBRF9ERUxJTSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJlb2ZfZGVsaW0ifSwKKworCXtXRV9QUFNfTUFDQUREUl9NSVNNQVRDSCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJtYWNfbWF0Y2gifSwKKworCXtXRV9QUFNfREVMSU1fQ1JDX0ZBSUwsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLCAiZGVsaW1fZmFpbCJ9LAorCisJe1dFX1BQU19HSURfTlNUU19aRVJPLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgIm5zdHNfemVybyJ9LAorCisJe1dFX1BQU19SU1NJX0NIRUNLLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgInJzc2lfY2hrIn0sCisKKwl7V0VfUFBTXzVHX0VCVCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICI1Z19lYnQifSwKKworCXtXRV9TRVRfSFRTTVBTLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgImh0c21wcyJ9LAorCisJe1dFX1NFVF9RUE9XRVJfTUFYX1BTUE9MTF9DT1VOVCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJzZXRfcXBzcG9sbGNudCJ9LAorCisJe1dFX1NFVF9RUE9XRVJfTUFYX1RYX0JFRk9SRV9XQUtFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgInNldF9xdHh3YWtlIn0sCisKKwl7V0VfU0VUX1FQT1dFUl9TUEVDX1BTUE9MTF9XQUtFX0lOVEVSVkFMLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgInNldF9xd2FrZWludHYifSwKKworCXtXRV9TRVRfUVBPV0VSX1NQRUNfTUFYX1NQRUNfTk9EQVRBX1BTUE9MTCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJzZXRfcW5vZGF0YXBvbGwifSwKKworCS8qIGhhbmRsZXJzIGZvciBNQ0MgdGltZSBxdW90YSBhbmQgbGF0ZW5jeSBzdWIgaW9jdGxzICovCisJe1dFX01DQ19DT05GSUdfTEFURU5DWSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJzZXRNY2NMYXRlbmN5In0sCisKKwl7V0VfTUNDX0NPTkZJR19RVU9UQSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJzZXRNY2NRdW90YSJ9LAorCisJe1dFX1NFVF9ERUJVR19MT0csCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLCAic2V0RGJnTHZsIn0sCisKKwkvKiBoYW5kbGVycyBmb3IgZWFybHlfcnggcG93ZXIgc2F2ZSAqLworCXtXRV9TRVRfRUFSTFlfUlhfQURKVVNUX0VOQUJMRSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJlcnhfZW5hYmxlIn0sCisKKwl7V0VfU0VUX0VBUkxZX1JYX1RHVF9CTUlTU19OVU0sCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLCAiZXJ4X2JtaXNzX3ZhbCJ9LAorCisJe1dFX1NFVF9FQVJMWV9SWF9CTUlTU19TQU1QTEVfQ1lDTEUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAwLCAiZXJ4X2JtaXNzX3NtcGwifSwKKworCXtXRV9TRVRfRUFSTFlfUlhfU0xPUF9TVEVQLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgImVyeF9zbG9wX3N0ZXAifSwKKworCXtXRV9TRVRfRUFSTFlfUlhfSU5JVF9TTE9QLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgImVyeF9pbml0X3Nsb3AifSwKKworCXtXRV9TRVRfRUFSTFlfUlhfQURKVVNUX1BBVVNFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgImVyeF9hZGpfcGF1c2UifSwKKworCXtXRV9TRVRfRUFSTFlfUlhfRFJJRlRfU0FNUExFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgMCwgImVyeF9kcmlfc2FtcGxlIn0sCisKKwl7V0VfRFVNUF9TVEFUUywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJkdW1wU3RhdHMifSwKKworCXtXRV9DTEVBUl9TVEFUUywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIDAsICJjbGVhclN0YXRzIn0sCisKKwl7V0xBTl9QUklWX1NFVF9OT05FX0dFVF9JTlQsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiIn0sCisKKwkvKiBoYW5kbGVycyBmb3Igc3ViLWlvY3RsICovCisJe1dFX0dFVF8xMURfU1RBVEUsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0MTFEc3RhdGUifSwKKworCXtXRV9JQlNTX1NUQVRVUywKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRBZGhvY1N0YXR1cyJ9LAorCisJe1dFX0dFVF9XTEFOX0RCRywKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXR3bGFuZGJnIn0sCisKKwl7V0VfR0VUX01BWF9BU1NPQywKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRNYXhBc3NvYyJ9LAorCisJe1dFX0dFVF9TQVBfQVVUT19DSEFOTkVMX1NFTEVDVElPTiwKKwkJMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCSJnZXRBdXRvQ2hhbm5lbCIgfSwKKworCXtXRV9HRVRfQ09OQ1VSUkVOQ1lfTU9ERSwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRjb25jdXJyZW5jeSJ9LAorCisJe1dFX0dFVF9OU1MsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X25zcyJ9LAorCisJe1dFX0dFVF9MRFBDLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9sZHBjIn0sCisKKwl7V0VfR0VUX1RYX1NUQkMsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3R4X3N0YmMifSwKKworCXtXRV9HRVRfUlhfU1RCQywKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfcnhfc3RiYyJ9LAorCisJe1dFX0dFVF9TSE9SVF9HSSwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfc2hvcnRnaSJ9LAorCisJe1dFX0dFVF9SVFNDVFMsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3J0c2N0cyJ9LAorCisJe1dFX0dFVF9DSFdJRFRILAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9jaHdpZHRoIn0sCisKKwl7V0VfR0VUX0FOSV9FTl9ESVMsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X2FuaWVuYWJsZSJ9LAorCisJe1dFX0dFVF9BTklfUE9MTF9QRVJJT0QsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X2FuaXBsZW4ifSwKKworCXtXRV9HRVRfQU5JX0xJU1RFTl9QRVJJT0QsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X2FuaWxpc2xlbiJ9LAorCisJe1dFX0dFVF9BTklfT0ZETV9MRVZFTCwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfYW5pb2ZkbWx2bCJ9LAorCisJe1dFX0dFVF9BTklfQ0NLX0xFVkVMLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9hbmljY2tsdmwifSwKKworCXtXRV9HRVRfRFlOQU1JQ19CVywKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfY3dtZW5hYmxlIn0sCisKKwl7V0VfR0VUX0dUWF9IVF9NQ1MsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X2d0eEhUTWNzIn0sCisKKwl7V0VfR0VUX0dUWF9WSFRfTUNTLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9ndHhWSFRNY3MifSwKKworCXtXRV9HRVRfR1RYX1VTUkNGRywKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfZ3R4VXNyQ2ZnIn0sCisKKwl7V0VfR0VUX0dUWF9USFJFLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9ndHhUaHJlIn0sCisKKwl7V0VfR0VUX0dUWF9NQVJHSU4sCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X2d0eE1hcmdpbiJ9LAorCisJe1dFX0dFVF9HVFhfU1RFUCwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfZ3R4U3RlcCJ9LAorCisJe1dFX0dFVF9HVFhfTUlOVFBDLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9ndHhNaW5UcGMifSwKKworCXtXRV9HRVRfR1RYX0JXTUFTSywKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfZ3R4QldNYXNrIn0sCisKKwl7V0VfR0VUX1RYX0NIQUlOTUFTSywKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfdHhjaGFpbm1hc2sifSwKKworCXtXRV9HRVRfUlhfQ0hBSU5NQVNLLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9yeGNoYWlubWFzayJ9LAorCisJe1dFX0dFVF8xMU5fUkFURSwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfMTFucmF0ZSJ9LAorCisJe1dFX0dFVF9BTVBEVSwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfYW1wZHUifSwKKworCXtXRV9HRVRfQU1TRFUsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X2Ftc2R1In0sCisKKwl7V0VfR0VUX0JVUlNUX0VOQUJMRSwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfYnVyc3RfZW4ifSwKKworCXtXRV9HRVRfQlVSU1RfRFVSLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9idXJzdF9kdXIifSwKKworCXtXRV9HRVRfVFhQT1dfMkcsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3R4cG93MmcifSwKKworCXtXRV9HRVRfVFhQT1dfNUcsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3R4cG93NWcifSwKKworCXtXRV9HRVRfUE9XRVJfR0FUSU5HLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9wd3JnYXRpbmcifSwKKworCXtXRV9HRVRfUFBTX1BBSURfTUFUQ0gsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3BhaWRfbWF0Y2gifSwKKworCXtXRV9HRVRfUFBTX0dJRF9NQVRDSCwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfZ2lkX21hdGNoIn0sCisKKwl7V0VfR0VUX1BQU19FQVJMWV9USU1fQ0xFQVIsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3RpbV9jbGVhciJ9LAorCisJe1dFX0dFVF9QUFNfRUFSTFlfRFRJTV9DTEVBUiwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfZHRpbV9jbGVhciJ9LAorCisJe1dFX0dFVF9QUFNfRU9GX1BBRF9ERUxJTSwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfZW9mX2RlbGltIn0sCisKKwl7V0VfR0VUX1BQU19NQUNBRERSX01JU01BVENILAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9tYWNfbWF0Y2gifSwKKworCXtXRV9HRVRfUFBTX0RFTElNX0NSQ19GQUlMLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9kZWxpbV9mYWlsIn0sCisKKwl7V0VfR0VUX1BQU19HSURfTlNUU19aRVJPLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9uc3RzX3plcm8ifSwKKworCXtXRV9HRVRfUFBTX1JTU0lfQ0hFQ0ssCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3Jzc2lfY2hrIn0sCisKKwl7V0VfR0VUX1FQT1dFUl9NQVhfUFNQT0xMX0NPVU5ULAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9xcHNwb2xsY250In0sCisKKwl7V0VfR0VUX1FQT1dFUl9NQVhfVFhfQkVGT1JFX1dBS0UsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3F0eHdha2UifSwKKworCXtXRV9HRVRfUVBPV0VSX1NQRUNfUFNQT0xMX1dBS0VfSU5URVJWQUwsCisJIDAsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3F3YWtlaW50diJ9LAorCisJe1dFX0dFVF9RUE9XRVJfU1BFQ19NQVhfU1BFQ19OT0RBVEFfUFNQT0xMLAorCSAwLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9xbm9kYXRhcG9sbCJ9LAorCisJe1dFX0dFVF9URU1QRVJBVFVSRSwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfdGVtcCJ9LAorCS8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisJe1dMQU5fUFJJVl9TRVRfQ0hBUl9HRVRfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCA1MTIsCisJIDAsCisJICIifSwKKworCS8qIGhhbmRsZXJzIGZvciBzdWItaW9jdGwgKi8KKwl7V0VfV09XTF9BRERfUFRSTiwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCA1MTIsCisJIDAsCisJICJ3b3dsQWRkUHRybiJ9LAorCisJe1dFX1dPV0xfREVMX1BUUk4sCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgNTEyLAorCSAwLAorCSAid293bERlbFB0cm4ifSwKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCS8qIGhhbmRsZXJzIGZvciBzdWItaW9jdGwgKi8KKwl7V0VfTkVJR0hCT1JfUkVQT1JUX1JFUVVFU1QsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgNTEyLAorCSAwLAorCSAibmVpZ2hib3IifSwKKyNlbmRpZgorCXtXRV9TRVRfQVBfV1BTX0lFLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDUxMiwKKwkgMCwKKwkgInNldF9hcF93cHNfaWUifSwKKworCXtXRV9TRVRfQ09ORklHLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDUxMiwKKwkgMCwKKwkgInNldENvbmZpZyJ9LAorCisJLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKwl7V0xBTl9QUklWX1NFVF9USFJFRV9JTlRfR0VUX05PTkUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAzLAorCSAwLAorCSAiIn0sCisKKwkvKiBoYW5kbGVycyBmb3Igc3ViLWlvY3RsICovCisJe1dFX1NFVF9XTEFOX0RCRywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDMsCisJIDAsCisJICJzZXR3bGFuZGJnIn0sCisKKwkvKiBoYW5kbGVycyBmb3Igc3ViLWlvY3RsICovCisJe1dFX1NFVF9EUF9UUkFDRSwKKwlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMywKKwkwLAorCSJzZXRfZHBfdHJhY2UifSwKKworCXtXRV9TRVRfU0FQX0NIQU5ORUxTLAorCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAzLAorCTAsCisJInNldHNhcGNoYW5uZWxzIn0sCisKKwl7V0VfU0VUX0RVQUxfTUFDX1NDQU5fQ09ORklHLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMywKKwkgMCwKKwkgInNldF9zY2FuX2NmZyJ9LAorCisJLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKwl7V0xBTl9QUklWX0dFVF9DSEFSX1NFVF9OT05FLAorCSAwLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IFdFX01BWF9TVFJfTEVOLAorCSAiIn0sCisKKwkvKiBoYW5kbGVycyBmb3Igc3ViLWlvY3RsICovCisJe1dFX1dMQU5fVkVSU0lPTiwKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCBXRV9NQVhfU1RSX0xFTiwKKwkgInZlcnNpb24ifSwKKwl7V0VfR0VUX1NUQVRTLAorCSAwLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IFdFX01BWF9TVFJfTEVOLAorCSAiZ2V0U3RhdHMifSwKKwl7V0VfR0VUX1NUQVRFUywKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCBXRV9NQVhfU1RSX0xFTiwKKwkgImdldEhvc3RTdGF0ZXMifSwKKwl7V0VfR0VUX0NGRywKKwkgMCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCBXRV9NQVhfU1RSX0xFTiwKKwkgImdldENvbmZpZyJ9LAorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJe1dFX0dFVF9SU1NJLAorCSAwLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IFdFX01BWF9TVFJfTEVOLAorCSAiZ2V0UlNTSSJ9LAorI2VuZGlmCisJe1dFX0dFVF9XTU1fU1RBVFVTLAorCSAwLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IFdFX01BWF9TVFJfTEVOLAorCSAiZ2V0V21tU3RhdHVzIn0sCisJeworCQlXRV9HRVRfQ0hBTk5FTF9MSVNULAorCQkwLAorCQlJV19QUklWX1RZUEVfQ0hBUiB8IFdFX01BWF9TVFJfTEVOLAorCQkiZ2V0Q2hhbm5lbExpc3QiCisJfSwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXsKKwkJV0VfR0VUX1RETFNfUEVFUlMsCisJCTAsCisJCUlXX1BSSVZfVFlQRV9DSEFSIHwgV0VfTUFYX1NUUl9MRU4sCisJCSJnZXRUZGxzUGVlcnMiCisJfSwKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwl7CisJCVdFX0dFVF8xMVdfSU5GTywKKwkJMCwKKwkJSVdfUFJJVl9UWVBFX0NIQVIgfCBXRV9NQVhfU1RSX0xFTiwKKwkJImdldFBNRkluZm8iCisJfSwKKyNlbmRpZgorCisJe1dFX0dFVF9QSFlNT0RFLAorCSAwLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IFdFX01BWF9TVFJfTEVOLAorCSAiZ2V0cGh5bW9kZSJ9LAorI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCXtXRV9HRVRfT0VNX0RBVEFfQ0FQLAorCSAwLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IFdFX01BWF9TVFJfTEVOLAorCSAiZ2V0T2VtRGF0YUNhcCJ9LAorI2VuZGlmIC8qIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVCAqLworCXtXRV9HRVRfU05SLAorCSAwLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IFdFX01BWF9TVFJfTEVOLAorCSAiZ2V0U05SIn0sCisKKwkvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCAqLworCXtXTEFOX1BSSVZfU0VUX05PTkVfR0VUX05PTkUsCisJIDAsCisJIDAsCisJICIifSwKKworCXtXRV9HRVRfUkVDT1ZFUllfU1RBVCwKKwkgMCwKKwkgMCwKKwkgImdldFJlY292ZXJTdGF0In0sCisJeworCQlXRV9TRVRfUkVBU1NPQ19UUklHR0VSLAorCQkwLAorCQkwLAorCQkicmVhc3NvYyIKKwl9LAorCXtXRV9EVU1QX0FHQ19TVEFSVCwKKwkgMCwKKwkgMCwKKwkgImR1bXBfYWdjX3N0YXJ0In0sCisKKwl7V0VfRFVNUF9BR0MsCisJIDAsCisJIDAsCisJICJkdW1wX2FnYyJ9LAorCisJe1dFX0RVTVBfQ0hBTklORk9fU1RBUlQsCisJIDAsCisJIDAsCisJICJkdW1wX2NobmluZm9fZW4ifSwKKworCXtXRV9EVU1QX0NIQU5JTkZPLAorCSAwLAorCSAwLAorCSAiZHVtcF9jaG5pbmZvIn0sCisKKwl7V0VfRFVNUF9XQVRDSERPRywKKwkgMCwKKwkgMCwKKwkgImR1bXBfd2F0Y2hkb2cifSwKKyNpZmRlZiBDT05GSUdfQVRIX1BDSUVfQUNDRVNTX0RFQlVHCisJe1dFX0RVTVBfUENJRV9MT0csCisJIDAsCisJIDAsCisJICJkdW1wX3BjaWVfbG9nIn0sCisjZW5kaWYKKwkvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCAqLworCXtXTEFOX1BSSVZfU0VUX1ZBUl9JTlRfR0VUX05PTkUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisJIDAsCisJICIifSwKKworCS8qIGhhbmRsZXJzIGZvciBzdWItaW9jdGwgKi8KKwl7V0VfTVRSQUNFX1NFTEVDVElWRV9NT0RVTEVfTE9HX0VOQUJMRV9DTUQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisJIDAsCisJICJzZXRkdW1wbG9nIn0sCisKKwl7V0VfTVRSQUNFX0RVTVBfQ01ELAorCSBJV19QUklWX1RZUEVfSU5UIHwgTUFYX1ZBUl9BUkdTLAorCSAwLAorCSAiZHVtcGxvZyJ9LAorI2lmZGVmIE1QQ19VVF9GUkFNRVdPUksKKwl7V0VfUE9MSUNZX01BTkFHRVJfQ0xJU1RfQ01ELAorCSBJV19QUklWX1RZUEVfSU5UIHwgTUFYX1ZBUl9BUkdTLAorCSAwLAorCSAicG1fY2xpc3QifSwKKworCXtXRV9QT0xJQ1lfTUFOQUdFUl9ETElTVF9DTUQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisJIDAsCisJICJwbV9kbGlzdCJ9LAorCisJe1dFX1BPTElDWV9NQU5BR0VSX0RCU19DTUQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisJIDAsCisJICJwbV9kYnMifSwKKworCXtXRV9QT0xJQ1lfTUFOQUdFUl9QQ0xfQ01ELAorCSBJV19QUklWX1RZUEVfSU5UIHwgTUFYX1ZBUl9BUkdTLAorCSAwLAorCSAicG1fcGNsIn0sCisKKwl7V0VfUE9MSUNZX01BTkFHRVJfQ0lORk9fQ01ELAorCSBJV19QUklWX1RZUEVfSU5UIHwgTUFYX1ZBUl9BUkdTLAorCSAwLAorCSAicG1fY2luZm8ifSwKKworCXtXRV9QT0xJQ1lfTUFOQUdFUl9VTElTVF9DTUQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisJIDAsCisJICJwbV91bGlzdCJ9LAorCisJe1dFX1BPTElDWV9NQU5BR0VSX1FVRVJZX0FDVElPTl9DTUQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisJIDAsCisJICJwbV9xdWVyeV9hY3Rpb24ifSwKKworCXtXRV9QT0xJQ1lfTUFOQUdFUl9RVUVSWV9BTExPV19DTUQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisJIDAsCisJICJwbV9xdWVyeV9hbGxvdyJ9LAorCisJe1dFX1BPTElDWV9NQU5BR0VSX1NDRU5BUklPX0NNRCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IE1BWF9WQVJfQVJHUywKKwkgMCwKKwkgInBtX3J1bl9zY2VuYXJpbyJ9LAorCisJe1dFX1BPTElDWV9TRVRfSFdfTU9ERV9DTUQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisJIDAsCisJICJwbV9zZXRfaHdfbW9kZSJ9LAorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwkvKiBoYW5kbGVycyBmb3Igc3ViIGlvY3RsICovCisJeworCQlXRV9URExTX0NPTkZJR19QQVJBTVMsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisJCTAsCisJCSJzZXRUZGxzQ29uZmlnIgorCX0sCisjZW5kaWYKKwl7CisJCVdFX1VOSVRfVEVTVF9DTUQsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisJCTAsCisJCSJzZXRVbml0VGVzdENtZCIKKwl9LAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dQSU9fTEVEX0ZMQVNISU5HCisJe1dFX0xFRF9GTEFTSElOR19QQVJBTSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IE1BWF9WQVJfQVJHUywKKwkgMCwKKwkgImdwaW9fY29udHJvbCJ9LAorI2VuZGlmCisJLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKwl7V0xBTl9QUklWX0FERF9UU1BFQywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IEhERF9XTEFOX1dNTV9QQVJBTV9DT1VOVCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJhZGRUc3BlYyJ9LAorCisJLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKwl7V0xBTl9QUklWX0RFTF9UU1BFQywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZGVsVHNwZWMifSwKKworCS8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisJe1dMQU5fUFJJVl9HRVRfVFNQRUMsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldFRzcGVjIn0sCisKKwkvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCAtIGhvc3Qgb2ZmbG9hZCAqLworCXsKKwkJV0xBTl9QUklWX1NFVF9IT1NUX09GRkxPQUQsCisJCUlXX1BSSVZfVFlQRV9CWVRFIHwgc2l6ZW9mKHRIb3N0T2ZmbG9hZFJlcXVlc3QpLAorCQkwLAorCQkic2V0SG9zdE9mZmxvYWQiCisJfQorCSwKKworCXsKKwkJV0xBTl9HRVRfV0xBTl9TVEFUSVNUSUNTLAorCQkwLAorCQlJV19QUklWX1RZUEVfQllURSB8IFdFX01BWF9TVFJfTEVOLAorCQkiZ2V0V2xhblN0YXRzIgorCX0KKwksCisKKwl7CisJCVdMQU5fU0VUX0tFRVBBTElWRV9QQVJBTVMsCisJCUlXX1BSSVZfVFlQRV9CWVRFIHwgV0VfTUFYX1NUUl9MRU4sCisJCTAsCisJCSJzZXRLZWVwQWxpdmUiCisJfQorCSwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCXsKKwkJV0xBTl9TRVRfUEFDS0VUX0ZJTFRFUl9QQVJBTVMsCisJCUlXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBwa3RfZmlsdGVyX2NmZyksCisJCTAsCisJCSJzZXRQa3RGaWx0ZXIiCisJfQorCSwKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCXsKKwkJV0xBTl9TRVRfUE5PLAorCQlJV19QUklWX1RZUEVfQ0hBUiB8IFdFX01BWF9TVFJfTEVOLAorCQkwLAorCQkic2V0cG5vIgorCX0KKwksCisjZW5kaWYKKwl7CisJCVdMQU5fU0VUX0JBTkRfQ09ORklHLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJMCwKKwkJIlNFVEJBTkQiCisJfQorCSwKKwl7CisJCVdMQU5fR0VUX0xJTktfU1BFRUQsCisJCUlXX1BSSVZfVFlQRV9DSEFSIHwgMTgsCisJCUlXX1BSSVZfVFlQRV9DSEFSIHwgNSwgImdldExpbmtTcGVlZCIKKwl9CisJLAorCisJLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKwl7V0xBTl9QUklWX1NFVF9UV09fSU5UX0dFVF9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMiwKKwkgMCwKKwkgIiJ9CisJLAorCXtXRV9TRVRfU01QU19QQVJBTSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDIsCisJIDAsICJzZXRfc21wc19wYXJhbSJ9CisJLAorCXtXTEFOX1NFVF9ET1QxMVBfQ0hBTk5FTF9TQ0hFRCwKKwkgSVdfUFJJVl9UWVBFX0JZVEUgfCBzaXplb2Yoc3RydWN0IGRvdDExcF9jaGFubmVsX3NjaGVkKSwKKwkgMCwgInNldF9kb3QxMXAiIH0KKwksCisjaWZkZWYgREVCVUcKKwl7V0VfU0VUX0ZXX0NSQVNIX0lOSkVDVCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDIsCisJIDAsICJjcmFzaF9pbmplY3QifQorCSwKKyNlbmRpZgorCXtXRV9TRVRfRFVBTF9NQUNfRldfTU9ERV9DT05GSUcsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyLAorCSAwLCAic2V0X2Z3X21vZGVfY2ZnIn0KKwksCisJe1dFX0RVTVBfRFBfVFJBQ0VfTEVWRUwsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyLAorCSAwLCAiZHVtcF9kcF90cmFjZSJ9CisJLAorfTsKKworY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHdlX2hhbmRsZXJfZGVmID0geworCS5udW1fc3RhbmRhcmQgPSBDREZfQVJSQVlfU0laRSh3ZV9oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUgPSBDREZfQVJSQVlfU0laRSh3ZV9wcml2YXRlKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IENERl9BUlJBWV9TSVpFKHdlX3ByaXZhdGVfYXJncyksCisKKwkuc3RhbmRhcmQgPSAoaXdfaGFuZGxlciAqKSB3ZV9oYW5kbGVyLAorCS5wcml2YXRlID0gKGl3X2hhbmRsZXIgKikgd2VfcHJpdmF0ZSwKKwkucHJpdmF0ZV9hcmdzID0gd2VfcHJpdmF0ZV9hcmdzLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBOVUxMLAorfTsKKworaW50IGhkZF9zZXRfd2V4dChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwloZGRfd2V4dF9zdGF0ZV90ICpwd2V4dEJ1ZjsKKwloZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCisJcHdleHRCdWYgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisJLyogTm93IGNvbmZpZ3VyZSB0aGUgcm9hbWluZyBwcm9maWxlIGxpbmtzLiBUbyBTU0lEIGFuZCBic3NpZC4gKi8KKwlwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUuU1NJRHMubnVtT2ZTU0lEcyA9IDA7CisJcHdleHRCdWYtPnJvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0ID0gJnBIZGRTdGFDdHgtPmNvbm5faW5mby5TU0lEOworCisJcHdleHRCdWYtPnJvYW1Qcm9maWxlLkJTU0lEcy5udW1PZkJTU0lEcyA9IDA7CisJcHdleHRCdWYtPnJvYW1Qcm9maWxlLkJTU0lEcy5ic3NpZCA9ICZwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQ7CisKKwkvKlNldCB0aGUgbnVtT2ZDaGFubmVscyB0byB6ZXJvIHRvIHNjYW4gYWxsIHRoZSBjaGFubmVscyAqLworCXB3ZXh0QnVmLT5yb2FtUHJvZmlsZS5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKwlwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworCisJLyogRGVmYXVsdCBpcyBubyBlbmNyeXB0aW9uICovCisJcHdleHRCdWYtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCXB3ZXh0QnVmLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCWVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisKKwlwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKwlwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCWVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisKKwlwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUuQlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkU7CisKKwkvKiBEZWZhdWx0IGlzIG5vIGF1dGhlbnRpY2F0aW9uICovCisJcHdleHRCdWYtPnJvYW1Qcm9maWxlLkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworCXB3ZXh0QnVmLT5yb2FtUHJvZmlsZS5BdXRoVHlwZS5hdXRoVHlwZVswXSA9IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOworCisJcHdleHRCdWYtPnJvYW1Qcm9maWxlLnBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfQVVUTzsKKwlwd2V4dEJ1Zi0+d3BhVmVyc2lvbiA9IElXX0FVVEhfV1BBX1ZFUlNJT05fRElTQUJMRUQ7CisKKwkvKlNldCB0aGUgZGVmYXVsdCBzY2FuIG1vZGUgKi8KKwlwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5fbW9kZSA9IGVTSVJfQUNUSVZFX1NDQU47CisKKwloZGRfY2xlYXJfcm9hbV9wcm9maWxlX2llKHBBZGFwdGVyKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworaW50IGhkZF9yZWdpc3Rlcl93ZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKwloZGRfd2V4dF9zdGF0ZV90ICpwd2V4dEJ1ZiA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlFTlRFUigpOworCisJLyogWmVybyB0aGUgbWVtb3J5LiAgVGhpcyB6ZXJvcyB0aGUgcHJvZmlsZSBzdHJ1Y3R1cmUuICovCisJbWVtc2V0KHB3ZXh0QnVmLCAwLCBzaXplb2YoaGRkX3dleHRfc3RhdGVfdCkpOworCisJaW5pdF9jb21wbGV0aW9uKCYoV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKSktPgorCQkJY29tcGxldGlvbl92YXIpOworCisJc3RhdHVzID0gaGRkX3NldF93ZXh0KHBBZGFwdGVyKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgKCJFUlJPUjogaGRkX3NldF93ZXh0IGZhaWxlZCEhIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX2V2ZW50X2luaXQoJnB3ZXh0QnVmLT5oZGRfY2RmX2V2ZW50KSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICgiRVJST1I6IEhERCBjZGYgZXZlbnQgaW5pdCBmYWlsZWQhISIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9ldmVudF9pbml0KCZwd2V4dEJ1Zi0+c2NhbmV2ZW50KSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICgiRVJST1I6IEhERCBzY2FuIGV2ZW50IGluaXQgZmFpbGVkISEiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyogUmVnaXN0ZXIgYXMgYSB3aXJlbGVzcyBkZXZpY2UgKi8KKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZ3ZV9oYW5kbGVyX2RlZjsKKworCUVYSVQoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGhkZF91bnJlZ2lzdGVyX3dleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGRMb2coTE9HMSwgRkwoImRldiglcCkiKSwgZGV2KTsKKworCWlmIChkZXYgIT0gTlVMTCkgeworCQlydG5sX2xvY2soKTsKKwkJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IE5VTEw7CisJCXJ0bmxfdW5sb2NrKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfd21tLmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfd21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjMTg2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGRkL3NyYy93bGFuX2hkZF93bW0uYwpAQCAtMCwwICsxLDI1OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiBIREQgV01NCisgKgorICogVGhpcyBtb2R1bGUgKHdsYW5faGRkX3dtbS5oIGludGVyZmFjZSArIHdsYW5faGRkX3dtbS5jIGltcGxlbWVudGF0aW9uKQorICogaG91c2VzIGFsbCB0aGUgbG9naWMgZm9yIFdNTSBpbiBIREQuCisgKgorICogT24gdGhlIGNvbnRyb2wgcGF0aCwgaXQgaGFzIHRoZSBsb2dpYyB0byBzZXR1cCBRb1MsIG1vZGlmeSBRb1MgYW5kIGRlbGV0ZQorICogUW9TIChRb1MgaGVyZSByZWZlcnMgdG8gYSBUU1BFQykuIFRoZSBzZXR1cCBRb1MgY29tZXMgaW4gdHdvIGZsYXZvcnM6IGFuCisgKiBleHBsaWNpdCBhcHBsaWNhdGlvbiBpbnZva2VkIGFuZCBhbiBpbnRlcm5hbCBIREQgaW52b2tlZC4gIFRoZSBpbXBsaWNpdCBRb1MKKyAqIGlzIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyBOT1QgY2FsbCB0aGUgY3VzdG9tIFFDVCBXTEFOIE9JRHMgZm9yIFFvUyBidXQKKyAqIHdoaWNoIERPIG1hcmsgdGhlaXIgdHJhZmZpYyBmb3IgcHJpb3J0aXphdGlvbi4gSXQgYWxzbyBoYXMgbG9naWMgdG8gc3RhcnQsCisgKiB1cGRhdGUgYW5kIHN0b3AgdGhlIFUtQVBTRCB0cmlnZ2VyIGZyYW1lIGdlbmVyYXRpb24uIEl0IGFsc28gaGFzIGxvZ2ljIHRvCisgKiByZWFkIFdNTSByZWxhdGVkIGNvbmZpZyBwYXJhbWV0ZXJzIGZyb20gdGhlIHJlZ2lzdHJ5LgorICoKKyAqIE9uIHRoZSBkYXRhIHBhdGgsIGl0IGhhcyB0aGUgbG9naWMgdG8gZmlndXJlIG91dCB0aGUgV01NIEFDIG9mIGFuIGVncmVzcworICogcGFja2V0IGFuZCB3aGVuIHRvIHNpZ25hbCBUTCB0byBzZXJ2ZSBhIHBhcnRpY3VsYXIgQUMgcXVldWUuIEl0IGFsc28gaGFzIHRoZQorICogbG9naWMgdG8gcmV0cmlldmUgYSBwYWNrZXQgYmFzZWQgb24gV01NIHByaW9yaXR5IGluIHJlc3BvbnNlIHRvIGEgZmV0Y2ggZnJvbQorICogVEwuCisgKgorICogVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgYXJlIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBpbmZvcm1hdGlvbiBoaWRpbmcuCisgKi8KKworLyogSW5jbHVkZSBmaWxlcyAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfdHhfcnguaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF93bW0uaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9ldGhlci5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2hvc3RhcGQuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9zb2Z0YXBfdHhfcnguaD4KKyNpbmNsdWRlIDxjZHNfc2NoZWQuaD4KKworLyogY2hhbmdlIGxvZ2dpbmcgYmVoYXZpb3IgYmFzZWQgdXBvbiBkZWJ1ZyBmbGFnICovCisjaWZkZWYgSEREX1dNTV9ERUJVRworI2RlZmluZSBXTU1fVFJBQ0VfTEVWRUxfRkFUQUwgICAgICBDREZfVFJBQ0VfTEVWRUxfRkFUQUwKKyNkZWZpbmUgV01NX1RSQUNFX0xFVkVMX0VSUk9SICAgICAgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMCisjZGVmaW5lIFdNTV9UUkFDRV9MRVZFTF9XQVJOICAgICAgIENERl9UUkFDRV9MRVZFTF9GQVRBTAorI2RlZmluZSBXTU1fVFJBQ0VfTEVWRUxfSU5GTyAgICAgICBDREZfVFJBQ0VfTEVWRUxfRkFUQUwKKyNkZWZpbmUgV01NX1RSQUNFX0xFVkVMX0lORk9fSElHSCAgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMCisjZGVmaW5lIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVyAgIENERl9UUkFDRV9MRVZFTF9GQVRBTAorI2Vsc2UKKyNkZWZpbmUgV01NX1RSQUNFX0xFVkVMX0ZBVEFMICAgICAgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMCisjZGVmaW5lIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiAgICAgIENERl9UUkFDRV9MRVZFTF9FUlJPUgorI2RlZmluZSBXTU1fVFJBQ0VfTEVWRUxfV0FSTiAgICAgICBDREZfVFJBQ0VfTEVWRUxfV0FSTgorI2RlZmluZSBXTU1fVFJBQ0VfTEVWRUxfSU5GTyAgICAgICBDREZfVFJBQ0VfTEVWRUxfSU5GTworI2RlZmluZSBXTU1fVFJBQ0VfTEVWRUxfSU5GT19ISUdIICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdICisjZGVmaW5lIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVyAgIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVworI2VuZGlmCisKKyNkZWZpbmUgV0xBTl9IRERfTUFYX0RTQ1AgMHgzZgorCisvKiBESENQIFBvcnQgbnVtYmVyICovCisjZGVmaW5lIERIQ1BfU09VUkNFX1BPUlQgMHg0NDAwCisjZGVmaW5lIERIQ1BfREVTVElOQVRJT05fUE9SVCAweDQzMDAKKworI2RlZmluZSBIRERfV01NX1VQX1RPX0FDX01BUF9TSVpFIDgKKworY29uc3QgdWludDhfdCBoZGRfd21tX3VwX3RvX2FjX21hcFtdID0geworCVNNRV9BQ19CRSwKKwlTTUVfQUNfQkssCisJU01FX0FDX0JLLAorCVNNRV9BQ19CRSwKKwlTTUVfQUNfVkksCisJU01FX0FDX1ZJLAorCVNNRV9BQ19WTywKKwlTTUVfQUNfVk8KK307CisKKy8qKgorICogZW51bSBoZGRfd21tX2xpbnV4YWM6IEFDL1F1ZXVlIEluZGV4IHZhbHVlcyBmb3IgTGludXggUWRpc2MgdG8KKyAqIG9wZXJhdGUgb24gZGlmZmVyZW50IHRyYWZmaWMuCisgKi8KKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyCitlbnVtIGhkZF93bW1fbGludXhhYyB7CisJSEREX0xJTlVYX0FDX1ZPID0gMCwKKwlIRERfTElOVVhfQUNfVkkgPSAxLAorCUhERF9MSU5VWF9BQ19CRSA9IDIsCisJSEREX0xJTlVYX0FDX0JLID0gMywKKwlIRERfTElOVVhfQUNfSElfUFJJTyA9IDQsCit9OworCit2b2lkIHdsYW5faGRkX3Byb2Nlc3NfcGVlcl91bmF1dGhvcmlzZWRfcGF1c2UoaGRkX2FkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwkvKiBFbmFibGUgSElfUFJJTyBxdWV1ZSAqLworCW5ldGlmX3N0b3Bfc3VicXVldWUoYWRhcHRlci0+ZGV2LCBIRERfTElOVVhfQUNfVk8pOworCW5ldGlmX3N0b3Bfc3VicXVldWUoYWRhcHRlci0+ZGV2LCBIRERfTElOVVhfQUNfVkkpOworCW5ldGlmX3N0b3Bfc3VicXVldWUoYWRhcHRlci0+ZGV2LCBIRERfTElOVVhfQUNfQkUpOworCW5ldGlmX3N0b3Bfc3VicXVldWUoYWRhcHRlci0+ZGV2LCBIRERfTElOVVhfQUNfQkspOworCW5ldGlmX3dha2Vfc3VicXVldWUoYWRhcHRlci0+ZGV2LCBIRERfTElOVVhfQUNfSElfUFJJTyk7CisKK30KKyNlbHNlCitlbnVtIGhkZF93bW1fbGludXhhYyB7CisJSEREX0xJTlVYX0FDX1ZPID0gMCwKKwlIRERfTElOVVhfQUNfVkkgPSAxLAorCUhERF9MSU5VWF9BQ19CRSA9IDIsCisJSEREX0xJTlVYX0FDX0JLID0gMworfTsKKwordm9pZCB3bGFuX2hkZF9wcm9jZXNzX3BlZXJfdW5hdXRob3Jpc2VkX3BhdXNlKGhkZF9hZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8qIExpbnV4IGJhc2VkIFVQIC0+IEFDIE1hcHBpbmcgKi8KK2NvbnN0IHVpbnQ4X3QgaGRkX2xpbnV4X3VwX3RvX2FjX21hcFtIRERfV01NX1VQX1RPX0FDX01BUF9TSVpFXSA9IHsKKwlIRERfTElOVVhfQUNfQkUsCisJSEREX0xJTlVYX0FDX0JLLAorCUhERF9MSU5VWF9BQ19CSywKKwlIRERfTElOVVhfQUNfQkUsCisJSEREX0xJTlVYX0FDX1ZJLAorCUhERF9MSU5VWF9BQ19WSSwKKwlIRERfTElOVVhfQUNfVk8sCisJSEREX0xJTlVYX0FDX1ZPCit9OworCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorLyoqCisgKiBoZGRfd21tX2VuYWJsZV90bF91YXBzZCgpIC0gZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFuZAorICogaG93IHRvIHVwZGF0ZSBVQVBTRCBwYXJhbWV0ZXJzIGluIFRMCisgKgorICogQHBRb3NDb250ZXh0OiBbaW5dIHRoZSBwb2ludGVyIHRoZSBRb1MgaW5zdGFuY2UgY29udHJvbCBibG9jaworICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfd21tX2VuYWJsZV90bF91YXBzZChoZGRfd21tX3Fvc19jb250ZXh0X3QgKnBRb3NDb250ZXh0KQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gcFFvc0NvbnRleHQtPnBBZGFwdGVyOworCXNtZV9hY19lbnVtX3R5cGUgYWNUeXBlID0gcFFvc0NvbnRleHQtPmFjVHlwZTsKKwloZGRfd21tX2FjX3N0YXR1c190ICpwQWMgPSAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl1aW50MzJfdCBzZXJ2aWNlX2ludGVydmFsOworCXVpbnQzMl90IHN1c3BlbnNpb25faW50ZXJ2YWw7CisJc21lX1Fvc1dtbURpclR5cGUgZGlyZWN0aW9uOworCWJvb2wgcHNiOworCisJLyogVGhlIFRTUEVDIG11c3QgYmUgdmFsaWQgKi8KKwlpZiAocEFjLT53bW1BY1RzcGVjVmFsaWQgPT0gZmFsc2UpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52b2tlZCB3aXRoIGludmFsaWQgVFNQRUMiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJLyogZGV0ZXJtaW5lIHRoZSBzZXJ2aWNlIGludGVydmFsICovCisJaWYgKHBBYy0+d21tQWNUc3BlY0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwpIHsKKwkJc2VydmljZV9pbnRlcnZhbCA9IHBBYy0+d21tQWNUc3BlY0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWw7CisJfSBlbHNlIGlmIChwQWMtPndtbUFjVHNwZWNJbmZvLm1heF9zZXJ2aWNlX2ludGVydmFsKSB7CisJCXNlcnZpY2VfaW50ZXJ2YWwgPSBwQWMtPndtbUFjVHNwZWNJbmZvLm1heF9zZXJ2aWNlX2ludGVydmFsOworCX0gZWxzZSB7CisJCS8qIG5vIHNlcnZpY2UgaW50ZXJ2YWwgaXMgcHJlc2VudCBpbiB0aGUgVFNQRUMgKi8KKwkJLyogdGhpcyBpcyBPSywgdGhlcmUganVzdCB3b24ndCBiZSBVLUFQU0QgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzOiBObyBzZXJ2aWNlIGludGVydmFsIHN1cHBsaWVkIiwgX19mdW5jX18pOworCQlzZXJ2aWNlX2ludGVydmFsID0gMDsKKwl9CisKKwkvKiBkZXRlcm1pbmUgdGhlIHN1c3BlbnNpb24gaW50ZXJ2YWwgJiBkaXJlY3Rpb24gKi8KKwlzdXNwZW5zaW9uX2ludGVydmFsID0gcEFjLT53bW1BY1RzcGVjSW5mby5zdXNwZW5zaW9uX2ludGVydmFsOworCWRpcmVjdGlvbiA9IHBBYy0+d21tQWNUc3BlY0luZm8udHNfaW5mby5kaXJlY3Rpb247CisJcHNiID0gcEFjLT53bW1BY1RzcGVjSW5mby50c19pbmZvLnBzYjsKKworCS8qIGlmIHdlIGhhdmUgcHJldmlvdXNseSBlbmFibGVkIFUtQVBTRCwgaGF2ZSBhbnkgcGFyYW1zIGNoYW5nZWQ/ICovCisJaWYgKChwQWMtPndtbUFjVWFwc2RJbmZvVmFsaWQpICYmCisJICAgIChwQWMtPndtbUFjVWFwc2RTZXJ2aWNlSW50ZXJ2YWwgPT0gc2VydmljZV9pbnRlcnZhbCkgJiYKKwkgICAgKHBBYy0+d21tQWNVYXBzZFN1c3BlbnNpb25JbnRlcnZhbCA9PSBzdXNwZW5zaW9uX2ludGVydmFsKSAmJgorCSAgICAocEFjLT53bW1BY1VhcHNkRGlyZWN0aW9uID09IGRpcmVjdGlvbikgJiYKKwkgICAgKHBBYy0+d21tQWNJc1VhcHNkRW5hYmxlZCA9PSBwc2IpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogTm8gY2hhbmdlIGluIFUtQVBTRCBwYXJhbWV0ZXJzIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCS8qIGV2ZXJ5dGhpbmcgaXMgaW4gcGxhY2UgdG8gbm90aWZ5IFRMICovCisJc3RhdHVzID0KKwkJc21lX2VuYWJsZV91YXBzZF9mb3JfYWMoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cGNkc19jb250ZXh0LAorCQkJCQkgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT4KKwkJCQkJICAgY29ubl9pbmZvLnN0YUlkWzBdLCBhY1R5cGUsCisJCQkJCSAgIHBBYy0+d21tQWNUc3BlY0luZm8udHNfaW5mby50aWQsCisJCQkJCSAgIHBBYy0+d21tQWNUc3BlY0luZm8udHNfaW5mby51cCwKKwkJCQkJICAgc2VydmljZV9pbnRlcnZhbCwgc3VzcGVuc2lvbl9pbnRlcnZhbCwKKwkJCQkJICAgZGlyZWN0aW9uLCBwc2IsIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCSAgIHBIZGRDdHgtPmNvbmZpZy0+RGVsYXllZFRyaWdnZXJGcm1JbnQpOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gZW5hYmxlIFUtQVBTRCBmb3IgQUM9JWQiLAorCQkJICBfX2Z1bmNfXywgYWNUeXBlKTsKKwkJcmV0dXJuOworCX0KKwkvKiBzdGFzaCBhd2F5IHRoZSBwYXJhbWV0ZXJzIHRoYXQgd2VyZSB1c2VkICovCisJcEFjLT53bW1BY1VhcHNkSW5mb1ZhbGlkID0gdHJ1ZTsKKwlwQWMtPndtbUFjVWFwc2RTZXJ2aWNlSW50ZXJ2YWwgPSBzZXJ2aWNlX2ludGVydmFsOworCXBBYy0+d21tQWNVYXBzZFN1c3BlbnNpb25JbnRlcnZhbCA9IHN1c3BlbnNpb25faW50ZXJ2YWw7CisJcEFjLT53bW1BY1VhcHNkRGlyZWN0aW9uID0gZGlyZWN0aW9uOworCXBBYy0+d21tQWNJc1VhcHNkRW5hYmxlZCA9IHBzYjsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBFbmFibGVkIFVBUFNEIGluIFRMIHNydl9pbnQ9JWQgIgorCQkgICJzdXNwX2ludD0lZCBkaXI9JWQgQUM9JWQiLAorCQkgIF9fZnVuY19fLAorCQkgIHNlcnZpY2VfaW50ZXJ2YWwsIHN1c3BlbnNpb25faW50ZXJ2YWwsIGRpcmVjdGlvbiwgYWNUeXBlKTsKKworfQorCisvKioKKyAqIGhkZF93bW1fZGlzYWJsZV90bF91YXBzZCgpIC0gZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyCisgKiB0byBkaXNhYmxlIFVBUFNEIHBhcmFtZXRlcnMgaW4gVEwKKyAqCisgKiBAcFFvc0NvbnRleHQ6IFtpbl0gdGhlIHBvaW50ZXIgdGhlIFFvUyBpbnN0YW5jZSBjb250cm9sIGJsb2NrCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGhkZF93bW1fZGlzYWJsZV90bF91YXBzZChoZGRfd21tX3Fvc19jb250ZXh0X3QgKnBRb3NDb250ZXh0KQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gcFFvc0NvbnRleHQtPnBBZGFwdGVyOworCXNtZV9hY19lbnVtX3R5cGUgYWNUeXBlID0gcFFvc0NvbnRleHQtPmFjVHlwZTsKKwloZGRfd21tX2FjX3N0YXR1c190ICpwQWMgPSAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdOworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQzMl90IHNlcnZpY2VfaW50ZXJ2YWw7CisJdWludDMyX3Qgc3VzcGVuc2lvbl9pbnRlcnZhbDsKKwl1aW50OF90IHVhcHNkX21hc2s7CisJdWludDhfdCBhY3RpdmVfdHNwZWMgPSBJTlZBTElEX1RTUEVDOworCWhkZF9jb250ZXh0X3QgKmhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlzdHJ1Y3QgaGRkX2NvbmZpZyAqY2ZnID0gaGRkX2N0eC0+Y29uZmlnOworCisJLyogaGF2ZSB3ZSBwcmV2aW91c2x5IGVuYWJsZWQgVUFQU0Q/ICovCisJaWYgKHBBYy0+d21tQWNVYXBzZEluZm9WYWxpZCA9PSB0cnVlKSB7CisJCXVhcHNkX21hc2sgPSBjZmctPlVhcHNkTWFzazsKKwkJLyogRmluZGluZyB1YXBzZF9tYXNrIGFzIHBlciBBQyAqLworCQl1YXBzZF9tYXNrID0gdWFwc2RfbWFzayAmICgxIDw8IChTTUVfQUNfVk8gLSBhY1R5cGUpKTsKKworCQlzbWVfcW9zX3RzcGVjX2FjdGl2ZSgKKwkJCSh0cEFuaVNpckdsb2JhbClXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIGFjVHlwZSwKKwkJCXBBZGFwdGVyLT5zZXNzaW9uSWQsICZhY3RpdmVfdHNwZWMpOworCisJCS8qIENhbGwgc21lX2VuYWJsZV91YXBzZF9mb3JfYWMgb25seSB3aGVuIHN0YXRpYyB1YXBzZCBtYXNrCisJCSAqIGlzIHByZXNlbnQgYW5kIG5vIGFjdGl2ZSB0c3BlY3MuCisJCSAqLworCisJCWlmICh1YXBzZF9tYXNrICYmICFhY3RpdmVfdHNwZWMpIHsKKwkJCXN3aXRjaCAoYWNUeXBlKSB7CisJCQljYXNlIFNNRV9BQ19WTzoKKwkJCQlzZXJ2aWNlX2ludGVydmFsID0gY2ZnLT5JbmZyYVVhcHNkVm9TcnZJbnR2OworCQkJCXN1c3BlbnNpb25faW50ZXJ2YWwgPSBjZmctPkluZnJhVWFwc2RWb1N1c3BJbnR2OworCQkJCWJyZWFrOworCQkJY2FzZSBTTUVfQUNfVkk6CisJCQkJc2VydmljZV9pbnRlcnZhbCA9IGNmZy0+SW5mcmFVYXBzZFZpU3J2SW50djsKKwkJCQlzdXNwZW5zaW9uX2ludGVydmFsID0gY2ZnLT5JbmZyYVVhcHNkVmlTdXNwSW50djsKKwkJCQlicmVhazsKKwkJCWNhc2UgU01FX0FDX0JFOgorCQkJCXNlcnZpY2VfaW50ZXJ2YWwgPSBjZmctPkluZnJhVWFwc2RCZVNydkludHY7CisJCQkJc3VzcGVuc2lvbl9pbnRlcnZhbCA9IGNmZy0+SW5mcmFVYXBzZEJlU3VzcEludHY7CisJCQkJYnJlYWs7CisJCQljYXNlIFNNRV9BQ19CSzoKKwkJCQlzZXJ2aWNlX2ludGVydmFsID0gY2ZnLT5JbmZyYVVhcHNkQmtTcnZJbnR2OworCQkJCXN1c3BlbnNpb25faW50ZXJ2YWwgPSBjZmctPkluZnJhVWFwc2RCa1N1c3BJbnR2OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8qIHJlc3RvcmUgdGhlIFVBUFNEIGludGVydmFscyBjb25maWd1cmF0aW9uICovCisJCQlzdGF0dXMgPSBzbWVfZW5hYmxlX3VhcHNkX2Zvcl9hYyhoZGRfY3R4LT5wY2RzX2NvbnRleHQsCisJCQkJCShXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSCisJCQkJCShwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisJCQkJCWFjVHlwZSwKKwkJCQkJcEFjLT53bW1BY1RzcGVjSW5mby50c19pbmZvLnRpZCwKKwkJCQkJcEFjLT53bW1BY1RzcGVjSW5mby50c19pbmZvLnVwLAorCQkJCQlzZXJ2aWNlX2ludGVydmFsLAorCQkJCQlzdXNwZW5zaW9uX2ludGVydmFsLAorCQkJCQlwQWMtPndtbUFjVHNwZWNJbmZvLnRzX2luZm8uZGlyZWN0aW9uLAorCQkJCQlwQWMtPndtbUFjVHNwZWNJbmZvLnRzX2luZm8ucHNiLAorCQkJCQlwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCQljZmctPkRlbGF5ZWRUcmlnZ2VyRnJtSW50KTsKKworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCWhkZF9lcnIoIkZhaWxlZCB0byBzZXQgVS1BUFNEIGZvciBBQz0lZCIsCisJCQkJCWFjVHlwZSk7CisJCQl9IGVsc2UgeworCQkJCS8qIFRMIG5vIGxvbmdlciBoYXMgdmFsaWQgVUFQU0QgaW5mbyAqLworCQkJCXBBYy0+d21tQWNVYXBzZEluZm9WYWxpZCA9IGZhbHNlOworCQkJCWhkZF9lcnIoIkRpc2FibGVkIFVBUFNEIGluIFRMIGZvciBBQz0lZCIsCisJCQkJCWFjVHlwZSk7CisJCQl9CisJCX0KKwl9Cit9CisKKyNlbmRpZgorCisvKioKKyAqIGhkZF93bW1fZnJlZV9jb250ZXh0KCkgLSBmdW5jdGlvbiB3aGljaCBmcmVlcyBhIFFvUyBjb250ZXh0CisgKgorICogQHBRb3NDb250ZXh0OiBbaW5dIHRoZSBwb2ludGVyIHRoZSBRb1MgaW5zdGFuY2UgY29udHJvbCBibG9jaworICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfd21tX2ZyZWVfY29udGV4dChoZGRfd21tX3Fvc19jb250ZXh0X3QgKnBRb3NDb250ZXh0KQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiVzOiBFbnRlcmVkLCBjb250ZXh0ICVwIiwgX19mdW5jX18sIHBRb3NDb250ZXh0KTsKKworCWlmICh1bmxpa2VseSgoTlVMTCA9PSBwUW9zQ29udGV4dCkgfHwKKwkJICAgICAoSEREX1dNTV9DVFhfTUFHSUMgIT0gcFFvc0NvbnRleHQtPm1hZ2ljKSkpIHsKKwkJLyogbXVzdCBoYXZlIGJlZW4gZnJlZWQgaW4gYW5vdGhlciB0aHJlYWQgKi8KKwkJcmV0dXJuOworCX0KKwkvKiBnZXQgcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0ICovCisJcEFkYXB0ZXIgPSBwUW9zQ29udGV4dC0+cEFkYXB0ZXI7CisKKwkvKiB0YWtlIHRoZSB3bW1Mb2NrIHNpbmNlIHdlJ3JlIG1hbmlwdWxhdGluZyB0aGUgY29udGV4dCBsaXN0ICovCisJbXV0ZXhfbG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKworCS8qIG1ha2Ugc3VyZSBub2JvZHkgdGhpbmtzIHRoaXMgaXMgYSB2YWxpZCBjb250ZXh0ICovCisJcFFvc0NvbnRleHQtPm1hZ2ljID0gMDsKKworCS8qIHVubGluayB0aGUgY29udGV4dCAqLworCWxpc3RfZGVsKCZwUW9zQ29udGV4dC0+bm9kZSk7CisKKwkvKiBkb25lIG1hbmlwdWxhdGluZyB0aGUgbGlzdCAqLworCW11dGV4X3VubG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKworCS8qIHJlY2xhaW0gbWVtb3J5ICovCisJa2ZyZWUocFFvc0NvbnRleHQpOworCit9CisKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisvKioKKyAqIGhkZF93bW1fbm90aWZ5X2FwcCgpIC0gZnVuY3Rpb24gd2hpY2ggbm90aWZpZXMgYW4gYXBwbGljYXRpb24KKyAqCQkJICBvZiBjaGFuZ2VzIGluIHN0YXRlIG9mIGl0IGZsb3cKKyAqCisgKiBAcFFvc0NvbnRleHQ6IFtpbl0gdGhlIHBvaW50ZXIgdGhlIFFvUyBpbnN0YW5jZSBjb250cm9sIGJsb2NrCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KKyNkZWZpbmUgTUFYX05PVElGWV9MRU4gNTAKK3N0YXRpYyB2b2lkIGhkZF93bW1fbm90aWZ5X2FwcChoZGRfd21tX3Fvc19jb250ZXh0X3QgKnBRb3NDb250ZXh0KQoreworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyIGJ1ZltNQVhfTk9USUZZX0xFTiArIDFdOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiVzOiBFbnRlcmVkLCBjb250ZXh0ICVwIiwgX19mdW5jX18sIHBRb3NDb250ZXh0KTsKKworCWlmICh1bmxpa2VseSgoTlVMTCA9PSBwUW9zQ29udGV4dCkgfHwKKwkJICAgICAoSEREX1dNTV9DVFhfTUFHSUMgIT0gcFFvc0NvbnRleHQtPm1hZ2ljKSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBRb1MgQ29udGV4dCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNyZWF0ZSB0aGUgZXZlbnQgKi8KKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJc25wcmludGYoYnVmLCBNQVhfTk9USUZZX0xFTiwgIlFDT006IFRTIGNoYW5nZVsldTogJXVdIiwKKwkJICh1bnNpZ25lZCBpbnQpcFFvc0NvbnRleHQtPmhhbmRsZSwKKwkJICh1bnNpZ25lZCBpbnQpcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMpOworCisJd3JxdS5kYXRhLnBvaW50ZXIgPSBidWY7CisJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCisJLyogZ2V0IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgKi8KKwlwQWRhcHRlciA9IHBRb3NDb250ZXh0LT5wQWRhcHRlcjsKKworCS8qIHNlbmQgdGhlIGV2ZW50ICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFNlbmRpbmcgWyVzXSIsIF9fZnVuY19fLCBidWYpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1Zik7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisvKioKKyAqIGhkZF93bW1faW5hY3Rpdml0eV90aW1lcl9jYigpIC0gaW5hY3Rpdml0eSB0aW1lciBjYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIEB1c2VyX2RhdGE6IG9wYXF1ZSB1c2VyIGRhdGEgcmVnaXN0ZXJlZCB3aXRoIHRoZSB0aW1lci4gIEluIHRoZQorICogY2FzZSBvZiB0aGlzIHRpbWVyLCB0aGUgYXNzb2NpYXRlZCB3bW0gUW9TIGNvbnRleHQgaXMgcmVnaXN0ZXJlZC4KKyAqCisgKiBUaGlzIHRpbWVyIGhhbmRsZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBldmVyeSBpbmFjdGl2aXR5IGludGVydmFsCisgKiBwZXIgQUMuIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgY3VycmVudCB0cmFuc21pdHRlZCBwYWNrZXRzIG9uIHRoZQorICogZ2l2ZW4gQUMsIGFuZCBjaGVja3MgaWYgdGhlcmUgd2FzIGFueSBUWCBhY3Rpdml0eSBmcm9tIHRoZSBwcmV2aW91cworICogaW50ZXJ2YWwuIElmIHRoZXJlIHdhcyBubyB0cmFmZmljIHRoZW4gaXQgd291bGQgZGVsZXRlIHRoZSBUUyB0aGF0CisgKiB3YXMgbmVnb3RpYXRlZCBvbiB0aGF0IEFDLgorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBoZGRfd21tX2luYWN0aXZpdHlfdGltZXJfY2Iodm9pZCAqdXNlcl9kYXRhKQoreworCWhkZF93bW1fcW9zX2NvbnRleHRfdCAqcFFvc0NvbnRleHQgPSB1c2VyX2RhdGE7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJaGRkX3dtbV9hY19zdGF0dXNfdCAqcEFjOworCWhkZF93bGFuX3dtbV9zdGF0dXNfZSBzdGF0dXM7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXVpbnQzMl90IGN1cnJlbnRUcmFmZmljQ250ID0gMDsKKwlzbWVfYWNfZW51bV90eXBlIGFjVHlwZSA9IHBRb3NDb250ZXh0LT5hY1R5cGU7CisKKwlwQWRhcHRlciA9IHBRb3NDb250ZXh0LT5wQWRhcHRlcjsKKwlwQWMgPSAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdOworCisJLyogR2V0IHRoZSBUeCBzdGF0cyBmb3IgdGhpcyBBQy4gKi8KKwljdXJyZW50VHJhZmZpY0NudCA9CisJCXBBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdENsYXNzaWZpZWRBQ1twUW9zQ29udGV4dC0+CisJCQkJCQkJCSAgICBhY1R5cGVdOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJICBGTCgKKwkJICAgICAiV01NIGluYWN0aXZpdHkgVGltZXIgZm9yIEFDPSVkLCBjdXJyZW50Q250PSVkLCBwcmV2Q250PSVkIgorCQkgICAgICksCisJCSAgYWNUeXBlLCAoaW50KWN1cnJlbnRUcmFmZmljQ250LCAoaW50KXBBYy0+d21tUHJldlRyYWZmaWNDbnQpOworCWlmIChwQWMtPndtbVByZXZUcmFmZmljQ250ID09IGN1cnJlbnRUcmFmZmljQ250KSB7CisJCS8qIHRoZXJlIGlzIG5vIHRyYWZmaWMgYWN0aXZpdHksIGRlbGV0ZSB0aGUgVFNQRUMgZm9yIHRoaXMgQUMgKi8KKwkJc3RhdHVzID0gaGRkX3dtbV9kZWx0cyhwQWRhcHRlciwgcFFvc0NvbnRleHQtPmhhbmRsZSk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkgIEZMKAorCQkJICAgICAiRGVsZXRlZCBUUyBvbiBBQyAlZCwgZHVlIHRvIGluYWN0aXZpdHkgd2l0aCBzdGF0dXMgPSAlZCEhISIKKwkJCSAgICAgKSwKKwkJCSAgYWNUeXBlLCBzdGF0dXMpOworCX0gZWxzZSB7CisJCXBBYy0+d21tUHJldlRyYWZmaWNDbnQgPSBjdXJyZW50VHJhZmZpY0NudDsKKwkJaWYgKHBBYy0+d21tSW5hY3Rpdml0eVRpbWVyLnN0YXRlID09IENERl9USU1FUl9TVEFURV9TVE9QUEVEKSB7CisJCQkvKiBSZXN0YXJ0IHRoZSB0aW1lciAqLworCQkJY2RmX3N0YXR1cyA9CisJCQkJY2RmX21jX3RpbWVyX3N0YXJ0KCZwQWMtPndtbUluYWN0aXZpdHlUaW1lciwKKwkJCQkJCSAgIHBBYy0+d21tSW5hY3Rpdml0eVRpbWUpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgIEZMKAorCQkJCQkgICAgICJSZXN0YXJ0aW5nIGluYWN0aXZpdHkgdGltZXIgZmFpbGVkIG9uIEFDICVkIgorCQkJCQkgICAgICksCisJCQkJCSAgYWNUeXBlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUNERl9BU1NFUlQoY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlCisJCQkJCSAgICgmcEFjLT53bW1JbmFjdGl2aXR5VGltZXIpID09CisJCQkJICAgQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIGhkZF93bW1fZW5hYmxlX2luYWN0aXZpdHlfdGltZXIoKSAtCisgKglmdW5jdGlvbiB0byBlbmFibGUgdGhlIHRyYWZmaWMgaW5hY3Rpdml0eSB0aW1lciBmb3IgdGhlIGdpdmVuIEFDCisgKgorICogQHBRb3NDb250ZXh0OiBbaW5dIHBvaW50ZXIgdG8gcFFvc0NvbnRleHQKKyAqIEBpbmFjdGl2aXR5VGltZTogW2luXSB2YWx1ZSBvZiB0aGUgaW5hY3Rpdml0eSBpbnRlcnZhbCBpbiBtaWxsaXNlY3MKKyAqCisgKiBXaGVuIGEgUW9TLVRzcGVjIGlzIHN1Y2Nlc3NmdWxseSBzZXR1cCwgaWYgdGhlIGluYWN0aXZpdHkgaW50ZXJ2YWwKKyAqIHRpbWUgc3BlY2lmaWVkIGluIHRoZSBBZGRUUyBwYXJhbWV0ZXJzIGlzIG5vbi16ZXJvLCB0aGlzIGZ1bmN0aW9uCisgKiBpcyBpbnZva2VkIHRvIHN0YXJ0IGEgdHJhZmZpYyBpbmFjdGl2aXR5IHRpbWVyIGZvciB0aGUgZ2l2ZW4gQUMuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTCitoZGRfd21tX2VuYWJsZV9pbmFjdGl2aXR5X3RpbWVyKGhkZF93bW1fcW9zX2NvbnRleHRfdCAqcFFvc0NvbnRleHQsCisJCQkJdWludDMyX3QgaW5hY3Rpdml0eVRpbWUpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBwUW9zQ29udGV4dC0+cEFkYXB0ZXI7CisJc21lX2FjX2VudW1fdHlwZSBhY1R5cGUgPSBwUW9zQ29udGV4dC0+YWNUeXBlOworCWhkZF93bW1fYWNfc3RhdHVzX3QgKnBBYzsKKworCXBBZGFwdGVyID0gcFFvc0NvbnRleHQtPnBBZGFwdGVyOworCXBBYyA9ICZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV07CisKKwljZGZfc3RhdHVzID0gY2RmX21jX3RpbWVyX2luaXQoJnBBYy0+d21tSW5hY3Rpdml0eVRpbWVyLAorCQkJCSAgICAgICBDREZfVElNRVJfVFlQRV9TVywKKwkJCQkgICAgICAgaGRkX3dtbV9pbmFjdGl2aXR5X3RpbWVyX2NiLAorCQkJCSAgICAgICBwUW9zQ29udGV4dCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJJbml0aWFsaXppbmcgaW5hY3Rpdml0eSB0aW1lciBmYWlsZWQgb24gQUMgJWQiKSwKKwkJCSAgYWNUeXBlKTsKKwkJcmV0dXJuIGNkZl9zdGF0dXM7CisJfQorCS8qIFN0YXJ0IHRoZSBpbmFjdGl2aXR5IHRpbWVyICovCisJY2RmX3N0YXR1cyA9IGNkZl9tY190aW1lcl9zdGFydCgmcEFjLT53bW1JbmFjdGl2aXR5VGltZXIsCisJCQkJCWluYWN0aXZpdHlUaW1lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIlN0YXJ0aW5nIGluYWN0aXZpdHkgdGltZXIgZmFpbGVkIG9uIEFDICVkIiksCisJCQkgIGFjVHlwZSk7CisJCWNkZl9zdGF0dXMgPSBjZGZfbWNfdGltZXJfZGVzdHJveSgmcEFjLT53bW1JbmFjdGl2aXR5VGltZXIpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJaGRkX2VycigiRmFpbGVkIHRvIGRlc3Ryb3kgaW5hY3Rpdml0eSB0aW1lciIpOworCQl9CisJCXJldHVybiBjZGZfc3RhdHVzOworCX0KKwlwQWMtPndtbUluYWN0aXZpdHlUaW1lID0gaW5hY3Rpdml0eVRpbWU7CisJLyogSW5pdGlhbGl6ZSB0aGUgY3VycmVudCB0eCB0cmFmZmljIGNvdW50IG9uIHRoaXMgQUMgKi8KKwlwQWMtPndtbVByZXZUcmFmZmljQ250ID0KKwkJcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0Q2xhc3NpZmllZEFDW3BRb3NDb250ZXh0LT4KKwkJCQkJCQkJICAgIGFjVHlwZV07CisJcFFvc0NvbnRleHQtPmlzX2luYWN0aXZpdHlfdGltZXJfcnVubmluZyA9IHRydWU7CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogaGRkX3dtbV9kaXNhYmxlX2luYWN0aXZpdHlfdGltZXIoKSAtCisgKglmdW5jdGlvbiB0byBkaXNhYmxlIHRoZSB0cmFmZmljIGluYWN0aXZpdHkgdGltZXIgZm9yIHRoZSBnaXZlbiBBQy4KKyAqCisgKiBAcFFvc0NvbnRleHQ6IFtpbl0gcG9pbnRlciB0byBwUW9zQ29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB0byBkaXNhYmxlIHRoZSB0cmFmZmljIGluYWN0aXZpdHkgdGltZXIKKyAqIGZvciB0aGUgZ2l2ZW4gQUMuICBUaGlzIGlzIG5vcm1hbGx5IGRvbmUgd2hlbiB0aGUgVFMgaXMgZGVsZXRlZC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworc3RhdGljIENERl9TVEFUVVMKK2hkZF93bW1fZGlzYWJsZV9pbmFjdGl2aXR5X3RpbWVyKGhkZF93bW1fcW9zX2NvbnRleHRfdCAqcFFvc0NvbnRleHQpCit7CisJaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBwUW9zQ29udGV4dC0+cEFkYXB0ZXI7CisJc21lX2FjX2VudW1fdHlwZSBhY1R5cGUgPSBwUW9zQ29udGV4dC0+YWNUeXBlOworCWhkZF93bW1fYWNfc3RhdHVzX3QgKnBBYyA9ICZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV07CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkvKiBDbGVhciB0aGUgdGltZXIgYW5kIHRoZSBjb3VudGVyICovCisJcEFjLT53bW1JbmFjdGl2aXR5VGltZSA9IDA7CisJcEFjLT53bW1QcmV2VHJhZmZpY0NudCA9IDA7CisKKwlpZiAocFFvc0NvbnRleHQtPmlzX2luYWN0aXZpdHlfdGltZXJfcnVubmluZyA9PSB0cnVlKSB7CisJCXBRb3NDb250ZXh0LT5pc19pbmFjdGl2aXR5X3RpbWVyX3J1bm5pbmcgPSBmYWxzZTsKKwkJY2RmX3N0YXR1cyA9IGNkZl9tY190aW1lcl9zdG9wKCZwQWMtPndtbUluYWN0aXZpdHlUaW1lcik7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQloZGRfZXJyKCJGYWlsZWQgdG8gc3RvcCBpbmFjdGl2aXR5IHRpbWVyIik7CisJCQlyZXR1cm4gY2RmX3N0YXR1czsKKwkJfQorCQljZGZfc3RhdHVzID0gY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnBBYy0+d21tSW5hY3Rpdml0eVRpbWVyKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCQloZGRfZXJyKCJGYWlsZWQgdG8gZGVzdHJveSBpbmFjdGl2aXR5IHRpbWVyOlRpbWVyIHN0YXJ0ZWQiKTsKKwl9CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICovCisKKy8qKgorICogaGRkX3dtbV9zbWVfY2FsbGJhY2soKSAtIGNhbGxiYWNrIGZvciBRb1Mgbm90aWZpY2F0aW9ucworICoKKyAqIEBoSGFsOiBbaW5dIHRoZSBIQUwgaGFuZGxlCisgKiBAaGRkQ3R4IDogW2luXSB0aGUgSEREIHNwZWNpZmllZCBoYW5kbGUKKyAqIEBwQ3VycmVudFFvc0luZm8gOiBbaW5dIHRoZSBUU1BFQyBwYXJhbXMKKyAqIEBzbWVTdGF0dXMgOiBbaW5dIHRoZSBRb1MgcmVsYXRlZCBTTUUgc3RhdHVzCisgKiBAcW9zRmxvd0lkOiBbaW5dIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmxvdworICoKKyAqIFRoaXMgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCBieSBIREQgd2l0aCBTTUUgZm9yIHJlY2VpdmluZyBRb1MKKyAqIG5vdGlmaWNhdGlvbnMuIEV2ZW4gdGhvdWdoIHRoaXMgZnVuY3Rpb24gaGFzIGEgc3RhdGljIHNjb3BlIGl0CisgKiBnZXRzIGNhbGxlZCBleHRlcm5hbGx5IHRocm91Z2ggc29tZSBmdW5jdGlvbiBwb2ludGVyIG1hZ2ljIChzbworICogdGhlcmUgaXMgYSBuZWVkIGZvciByaWdvcm91cyBwYXJhbWV0ZXIgY2hlY2tpbmcpLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBoZGRfd21tX3NtZV9jYWxsYmFjayh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgICAgIHZvaWQgKmhkZEN0eCwKKwkJCQkgICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqcEN1cnJlbnRRb3NJbmZvLAorCQkJCSAgICAgICBzbWVfUW9zU3RhdHVzVHlwZSBzbWVTdGF0dXMsCisJCQkJICAgICAgIHVpbnQzMl90IHFvc0Zsb3dJZCkKK3sKKwloZGRfd21tX3Fvc19jb250ZXh0X3QgKnBRb3NDb250ZXh0ID0gaGRkQ3R4OworCWhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCXNtZV9hY19lbnVtX3R5cGUgYWNUeXBlOworCWhkZF93bW1fYWNfc3RhdHVzX3QgKnBBYzsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIlczogRW50ZXJlZCwgY29udGV4dCAlcCIsIF9fZnVuY19fLCBwUW9zQ29udGV4dCk7CisKKwlpZiAodW5saWtlbHkoKE5VTEwgPT0gcFFvc0NvbnRleHQpIHx8CisJCSAgICAgKEhERF9XTU1fQ1RYX01BR0lDICE9IHBRb3NDb250ZXh0LT5tYWdpYykpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgUW9TIENvbnRleHQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwQWRhcHRlciA9IHBRb3NDb250ZXh0LT5wQWRhcHRlcjsKKwlhY1R5cGUgPSBwUW9zQ29udGV4dC0+YWNUeXBlOworCXBBYyA9ICZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV07CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXM6IHN0YXR1cyAlZCBmbG93aWQgJWQgaW5mbyAlcCIsCisJCSAgX19mdW5jX18sIHNtZVN0YXR1cywgcW9zRmxvd0lkLCBwQ3VycmVudFFvc0luZm8pOworCisJc3dpdGNoIChzbWVTdGF0dXMpIHsKKworCWNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJICAiJXM6IFNldHVwIGlzIGNvbXBsZXRlIiwgX19mdW5jX18pOworCisJCS8qIHRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgVFNQRUMgcmV0dXJuZWQgd2l0aCB0aGlzCisJCSAqIHN0YXR1cywgZXZlbiBpZiBhIFRTUEVDIGlzIG5vdCBleGNoYW5nZWQgT1RBCisJCSAqLworCQlpZiAocEN1cnJlbnRRb3NJbmZvKSB7CisJCQlwQWMtPndtbUFjVHNwZWNWYWxpZCA9IHRydWU7CisJCQltZW1jcHkoJnBBYy0+d21tQWNUc3BlY0luZm8sCisJCQkgICAgICAgcEN1cnJlbnRRb3NJbmZvLCBzaXplb2YocEFjLT53bW1BY1RzcGVjSW5mbykpOworCQl9CisJCXBBYy0+d21tQWNBY2Nlc3NBbGxvd2VkID0gdHJ1ZTsKKwkJcEFjLT53bW1BY0FjY2Vzc0dyYW50ZWQgPSB0cnVlOworCQlwQWMtPndtbUFjQWNjZXNzUGVuZGluZyA9IGZhbHNlOworCQlwQWMtPndtbUFjQWNjZXNzRmFpbGVkID0gZmFsc2U7CisKKwkJaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUICE9IHBRb3NDb250ZXh0LT5oYW5kbGUpIHsKKworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICIlczogRXhwbGljaXQgUW9zLCBub3RpZnlpbmcgdXNlciBzcGFjZSIsCisJCQkJICBfX2Z1bmNfXyk7CisKKwkJCS8qIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbiAqLworCQkJcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPQorCQkJCUhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfU1VDQ0VTUzsKKwkJCWhkZF93bW1fbm90aWZ5X2FwcChwUW9zQ29udGV4dCk7CisJCX0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJLyogQ2hlY2sgaWYgdGhlIGluYWN0aXZpdHkgaW50ZXJ2YWwgaXMgc3BlY2lmaWVkICovCisJCWlmIChwQ3VycmVudFFvc0luZm8gJiYgcEN1cnJlbnRRb3NJbmZvLT5pbmFjdGl2aXR5X2ludGVydmFsKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiBJbmFjdGl2aXR5IHRpbWVyIHZhbHVlID0gJWQgZm9yIEFDPSVkIiwKKwkJCQkgIF9fZnVuY19fLAorCQkJCSAgcEN1cnJlbnRRb3NJbmZvLT5pbmFjdGl2aXR5X2ludGVydmFsLCBhY1R5cGUpOworCQkJaGRkX3dtbV9lbmFibGVfaW5hY3Rpdml0eV90aW1lcihwUW9zQ29udGV4dCwKKwkJCQkJCQlwQ3VycmVudFFvc0luZm8tPgorCQkJCQkJCWluYWN0aXZpdHlfaW50ZXJ2YWwpOworCQl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAqLworCisJCS8qIG5vdGlmeSBUTCB0byBlbmFibGUgdHJpZ2dlciBmcmFtZXMgaWYgbmVjZXNzYXJ5ICovCisJCWhkZF93bW1fZW5hYmxlX3RsX3VhcHNkKHBRb3NDb250ZXh0KTsKKworCQlicmVhazsKKworCWNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IFNldHVwIGlzIGNvbXBsZXRlIChVLUFQU0Qgc2V0IHByZXZpb3VzbHkpIiwKKwkJCSAgX19mdW5jX18pOworCisJCXBBYy0+d21tQWNBY2Nlc3NBbGxvd2VkID0gdHJ1ZTsKKwkJcEFjLT53bW1BY0FjY2Vzc0dyYW50ZWQgPSB0cnVlOworCQlwQWMtPndtbUFjQWNjZXNzUGVuZGluZyA9IGZhbHNlOworCisJCWlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAhPSBwUW9zQ29udGV4dC0+aGFuZGxlKSB7CisKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiJXM6IEV4cGxpY2l0IFFvcywgbm90aWZ5aW5nIHVzZXIgc3BhY2UiLAorCQkJCSAgX19mdW5jX18pOworCisJCQkvKiB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24gKi8KKwkJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0KKwkJCQlIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX1VBUFNEX0VYSVNUSU5HOworCQkJaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogU2V0dXAgZmFpbGVkIiwgX19mdW5jX18pOworCQkvKiBRb1Mgc2V0dXAgZmFpbGVkICovCisKKwkJcEFjLT53bW1BY0FjY2Vzc1BlbmRpbmcgPSBmYWxzZTsKKwkJcEFjLT53bW1BY0FjY2Vzc0ZhaWxlZCA9IHRydWU7CisJCXBBYy0+d21tQWNBY2Nlc3NBbGxvd2VkID0gZmFsc2U7CisJCWlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAhPSBwUW9zQ29udGV4dC0+aGFuZGxlKSB7CisKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiJXM6IEV4cGxpY2l0IFFvcywgbm90aWZ5aW5nIHVzZXIgc3BhY2UiLAorCQkJCSAgX19mdW5jX18pOworCisJCQkvKiB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24gKi8KKwkJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0KKwkJCQlIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRDsKKworCQkJaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKwkJfQorCisJCS8qIFNldHRpbmcgdXAgUW9TIEZhaWxlZCwgUW9TIGNvbnRleHQgY2FuIGJlIHJlbGVhc2VkLgorCQkgKiBTTUUgaXMgcmVsZWFzaW5nIHRoaXMgZmxvdyBpbmZvcm1hdGlvbiBhbmQgaWYgSERECisJCSAqIGRvZXNuJ3QgcmVsZWFzZSB0aGlzIGNvbnRleHQsIG5leHQgdGltZSBpZgorCQkgKiBhcHBsaWNhdGlvbiB1c2VzIHRoZSBzYW1lIGhhbmRsZSB0byBzZXQtdXAgUW9TLCBIREQKKwkJICogKGFzIGl0IGhhcyBRb1MgY29udGV4dCBmb3IgdGhpcyBoYW5kbGUpIHdpbGwgaXNzdWUKKwkJICogTW9kaWZ5IFFvUyByZXF1ZXN0IHRvIFNNRSBidXQgU01FIHdpbGwgcmVqZWN0IGFzIG5vdworCQkgKiBpdCBoYXMgbm8gaW5mb3JtYXRpb24gZm9yIHRoaXMgZmxvdy4KKwkJICovCisJCWhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX0lOVkFMSURfUEFSQU1TX1JTUDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogU2V0dXAgSW52YWxpZCBQYXJhbXMsIG5vdGlmeSBUTCIsIF9fZnVuY19fKTsKKwkJLyogUW9TIHNldHVwIGZhaWxlZCAqLworCQlwQWMtPndtbUFjQWNjZXNzQWxsb3dlZCA9IGZhbHNlOworCisJCWlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCA9PSBwUW9zQ29udGV4dC0+aGFuZGxlKSB7CisKKwkJCS8qIHdlIG5vdGUgdGhlIGZhaWx1cmUsIGJ1dCB3ZSBhbHNvIG1hcmsKKwkJCSAqIGFjY2VzcyBhcyBhbGxvd2VkIHNvIHRoYXQgdGhlIHBhY2tldHMgd2lsbAorCQkJICogZmxvdy4gIE5vdGUgdGhhdCB0aGUgTUFDIHdpbGwgImRvIHRoZSByaWdodAorCQkJICogdGhpbmciCisJCQkgKi8KKwkJCXBBYy0+d21tQWNBY2Nlc3NQZW5kaW5nID0gZmFsc2U7CisJCQlwQWMtPndtbUFjQWNjZXNzRmFpbGVkID0gdHJ1ZTsKKwkJCXBBYy0+d21tQWNBY2Nlc3NBbGxvd2VkID0gdHJ1ZTsKKworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICIlczogRXhwbGljaXQgUW9zLCBub3RpZnlpbmcgdXNlciBzcGFjZSIsCisJCQkJICBfX2Z1bmNfXyk7CisKKwkJCS8qIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbiAqLworCQkJcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPQorCQkJCUhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEX0JBRF9QQVJBTTsKKwkJCWhkZF93bW1fbm90aWZ5X2FwcChwUW9zQ29udGV4dCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX05PVF9RT1NfQVBfUlNQOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBTZXR1cCBmYWlsZWQsIG5vdCBhIFFvUyBBUCIsIF9fZnVuY19fKTsKKwkJaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUICE9IHBRb3NDb250ZXh0LT5oYW5kbGUpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiJXM6IEV4cGxpY2l0IFFvcywgbm90aWZ5aW5nIHVzZXIgc3BhY2UiLAorCQkJCSAgX19mdW5jX18pOworCisJCQkvKiB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24gKi8KKwkJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0KKwkJCQlIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9OT19XTU07CisJCQloZGRfd21tX25vdGlmeV9hcHAocFFvc0NvbnRleHQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1A6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogU2V0dXAgcGVuZGluZyIsIF9fZnVuY19fKTsKKwkJLyogbm90IGEgY2FsbGJhY2sgc3RhdHVzIC0tIGlnbm9yZSBpZiB3ZSBnZXQgaXQgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX01PRElGSUVEX0lORDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzOiBTZXR1cCBtb2RpZmllZCIsIF9fZnVuY19fKTsKKwkJaWYgKHBDdXJyZW50UW9zSW5mbykgeworCQkJLyogdXBkYXRlIHRoZSBUU1BFQyAqLworCQkJcEFjLT53bW1BY1RzcGVjVmFsaWQgPSB0cnVlOworCQkJbWVtY3B5KCZwQWMtPndtbUFjVHNwZWNJbmZvLAorCQkJICAgICAgIHBDdXJyZW50UW9zSW5mbywgc2l6ZW9mKHBBYy0+d21tQWNUc3BlY0luZm8pKTsKKworCQkJaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUICE9IHBRb3NDb250ZXh0LT5oYW5kbGUpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCSAgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSAgIiVzOiBFeHBsaWNpdCBRb3MsIG5vdGlmeWluZyB1c2VyIHNwYWNlIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisKKwkJCQkvKiB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24gKi8KKwkJCQlwUW9zQ29udGV4dC0+bGFzdFN0YXR1cyA9CisJCQkJCUhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZJRUQ7CisJCQkJaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKwkJCX0KKwkJCS8qIG5lZWQgdG8gdGVsbCBUTCB0byB1cGRhdGUgaXRzIFVBUFNEIGhhbmRsaW5nICovCisJCQloZGRfd21tX2VuYWJsZV90bF91YXBzZChwUW9zQ29udGV4dCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQOgorCQlpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgPT0gcFFvc0NvbnRleHQtPmhhbmRsZSkgeworCisJCQkvKiB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgaW1wbGljaXQgUW9TIHNvIHdlCisJCQkgKiBrbm93IHBhY2tldHMgYXJlIHBlbmRpbmcKKwkJCSAqLworCQkJcEFjLT53bW1BY0FjY2Vzc1BlbmRpbmcgPSBmYWxzZTsKKwkJCXBBYy0+d21tQWNBY2Nlc3NHcmFudGVkID0gdHJ1ZTsKKwkJCXBBYy0+d21tQWNBY2Nlc3NBbGxvd2VkID0gdHJ1ZTsKKworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICIlczogRXhwbGljaXQgUW9zLCBub3RpZnlpbmcgdXNlciBzcGFjZSIsCisJCQkJICBfX2Z1bmNfXyk7CisKKwkJCS8qIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbiAqLworCQkJcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPQorCQkJCUhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fVUFQU0Q7CisJCQloZGRfd21tX25vdGlmeV9hcHAocFFvc0NvbnRleHQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0lORF9BUFNEX1BFTkRJTkc6CisJCS8qIG5vdGhpbmcgdG8gZG8gZm9yIG5vdyAqLworCQlicmVhazsKKworCWNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9TRVRfRkFJTEVEOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBTZXR1cCBzdWNjZXNzZnVsIGJ1dCBVLUFQU0QgZmFpbGVkIiwgX19mdW5jX18pOworCisJCWlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCA9PSBwUW9zQ29udGV4dC0+aGFuZGxlKSB7CisKKwkJCS8qIFFvUyBzZXR1cCB3YXMgc3VjY2Vzc2Z1bCBidXQgc2V0dGluZyBVPUFQU0QKKwkJCSAqIGZhaWxlZC4gIFNpbmNlIHRoZSBPVEEgcGFydCBvZiB0aGUgcmVxdWVzdAorCQkJICogd2FzIHN1Y2Nlc3NmdWwsIHdlIGRvbid0IG1hcmsgdGhpcyBhcyBhCisJCQkgKiBmYWlsdXJlLiAgdGhlIHBhY2tldHMgd2lsbCBmbG93LiAgTm90ZSB0aGF0CisJCQkgKiB0aGUgTUFDIHdpbGwgImRvIHRoZSByaWdodCB0aGluZyIgKi8KKwkJCXBBYy0+d21tQWNBY2Nlc3NHcmFudGVkID0gdHJ1ZTsKKwkJCXBBYy0+d21tQWNBY2Nlc3NBbGxvd2VkID0gdHJ1ZTsKKwkJCXBBYy0+d21tQWNBY2Nlc3NGYWlsZWQgPSBmYWxzZTsKKwkJCXBBYy0+d21tQWNBY2Nlc3NQZW5kaW5nID0gZmFsc2U7CisKKwkJfSBlbHNlIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiJXM6IEV4cGxpY2l0IFFvcywgbm90aWZ5aW5nIHVzZXIgc3BhY2UiLAorCQkJCSAgX19mdW5jX18pOworCisJCQkvKiB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24gKi8KKwkJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0KKwkJCQlIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX1VBUFNEX1NFVF9GQUlMRUQ7CisJCQloZGRfd21tX25vdGlmeV9hcHAocFFvc0NvbnRleHQpOworCQl9CisKKwkJLyogU2luY2UgVS1BUFNEIHBvcnRpb24gZmFpbGVkIGRpc2FibGVkIHRyaWdnZXIgZnJhbWUKKwkJICogZ2VuZXJhdGlvbgorCQkgKi8KKwkJaGRkX3dtbV9kaXNhYmxlX3RsX3VhcHNkKHBRb3NDb250ZXh0KTsKKworCQlicmVhazsKKworCWNhc2UgU01FX1FPU19TVEFUVVNfUkVMRUFTRV9TVUNDRVNTX1JTUDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzOiBSZWxlYXNlIGlzIGNvbXBsZXRlIiwgX19mdW5jX18pOworCisJCWlmIChwQ3VycmVudFFvc0luZm8pIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiJXM6IGZsb3dzIHN0aWxsIGFjdGl2ZSIsIF9fZnVuY19fKTsKKworCQkJLyogdGhlcmUgaXMgc3RpbGwgYXQgbGVhc3Qgb25lIGZsb3cgYWN0aXZlIGZvcgorCQkJICogdGhpcyBBQyBzbyB1cGRhdGUgdGhlIEFDIHN0YXRlCisJCQkgKi8KKwkJCW1lbWNweSgmcEFjLT53bW1BY1RzcGVjSW5mbywKKwkJCSAgICAgICBwQ3VycmVudFFvc0luZm8sIHNpemVvZihwQWMtPndtbUFjVHNwZWNJbmZvKSk7CisKKwkJCS8qIG5lZWQgdG8gdGVsbCBUTCB0byB1cGRhdGUgaXRzIFVBUFNEIGhhbmRsaW5nICovCisJCQloZGRfd21tX2VuYWJsZV90bF91YXBzZChwUW9zQ29udGV4dCk7CisJCX0gZWxzZSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiBsYXN0IGZsb3ciLCBfX2Z1bmNfXyk7CisKKwkJCS8qIHRoaXMgaXMgdGhlIGxhc3QgZmxvdyBhY3RpdmUgZm9yIHRoaXMgQUMgc28KKwkJCSAqIHVwZGF0ZSB0aGUgQUMgc3RhdGUKKwkJCSAqLworCQkJcEFjLT53bW1BY1RzcGVjVmFsaWQgPSBmYWxzZTsKKworCQkJLyogREVMVFMgaXMgc3VjY2Vzc2Z1bCwgZG8gbm90IGFsbG93ICovCisJCQlwQWMtPndtbUFjQWNjZXNzQWxsb3dlZCA9IGZhbHNlOworCisJCQkvKiBuZWVkIHRvIHRlbGwgVEwgdG8gdXBkYXRlIGl0cyBVQVBTRCBoYW5kbGluZyAqLworCQkJaGRkX3dtbV9kaXNhYmxlX3RsX3VhcHNkKHBRb3NDb250ZXh0KTsKKwkJfQorCisJCWlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAhPSBwUW9zQ29udGV4dC0+aGFuZGxlKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiBFeHBsaWNpdCBRb3MsIG5vdGlmeWluZyB1c2VyIHNwYWNlIiwKKwkJCQkgIF9fZnVuY19fKTsKKworCQkJLyogdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IGFuIGFwcGxpY2F0aW9uICovCisJCQlwUW9zQ29udGV4dC0+bGFzdFN0YXR1cyA9CisJCQkJSEREX1dMQU5fV01NX1NUQVRVU19SRUxFQVNFX1NVQ0NFU1M7CisJCQloZGRfd21tX25vdGlmeV9hcHAocFFvc0NvbnRleHQpOworCQl9CisJCS8qIHdlIGFyZSBkb25lIHdpdGggdGhpcyBmbG93ICovCisJCWhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfRkFJTFVSRV9SU1A6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogUmVsZWFzZSBmYWlsdXJlIiwgX19mdW5jX18pOworCisJCS8qIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIG91ciBzdGF0ZSBvciBUTCBzaW5jZQorCQkgKiBub3RoaW5nIGhhcyBjaGFuZ2VkCisJCSAqLworCQlpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgIT0gcFFvc0NvbnRleHQtPmhhbmRsZSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICIlczogRXhwbGljaXQgUW9zLCBub3RpZnlpbmcgdXNlciBzcGFjZSIsCisJCQkJICBfX2Z1bmNfXyk7CisKKwkJCS8qIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbiAqLworCQkJcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPQorCQkJCUhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9GQUlMRUQ7CisJCQloZGRfd21tX25vdGlmeV9hcHAocFFvc0NvbnRleHQpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUU9TX0xPU1RfSU5EOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IFFPUyBMb3N0IGluZGljYXRpb24gcmVjZWl2ZWQiLCBfX2Z1bmNfXyk7CisKKwkJLyogY3VycmVudCBUU1BFQyBpcyBubyBsb25nZXIgdmFsaWQgKi8KKwkJcEFjLT53bW1BY1RzcGVjVmFsaWQgPSBmYWxzZTsKKwkJLyogQVAgaGFzIHNlbnQgREVMVFMsIGRvIG5vdCBhbGxvdyAqLworCQlwQWMtPndtbUFjQWNjZXNzQWxsb3dlZCA9IGZhbHNlOworCisJCS8qIG5lZWQgdG8gdGVsbCBUTCB0byB1cGRhdGUgaXRzIFVBUFNEIGhhbmRsaW5nICovCisJCWhkZF93bW1fZGlzYWJsZV90bF91YXBzZChwUW9zQ29udGV4dCk7CisKKwkJaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUID09IHBRb3NDb250ZXh0LT5oYW5kbGUpIHsKKwkJCS8qIHdlIG5vIGxvbmdlciBoYXZlIGltcGxpY2l0IGFjY2VzcyBncmFudGVkICovCisJCQlwQWMtPndtbUFjQWNjZXNzR3JhbnRlZCA9IGZhbHNlOworCQkJcEFjLT53bW1BY0FjY2Vzc0ZhaWxlZCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkJICAiJXM6IEV4cGxpY2l0IFFvcywgbm90aWZ5aW5nIHVzZXIgc3BhY2UiLAorCQkJCSAgX19mdW5jX18pOworCisJCQkvKiB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24gKi8KKwkJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19MT1NUOworCQkJaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKwkJfQorCisJCS8qIHdlIGFyZSBkb25lIHdpdGggdGhpcyBmbG93ICovCisJCWhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUkVRX1BFTkRJTkdfUlNQOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCSAgIiVzOiBSZWxlYXNlIHBlbmRpbmciLCBfX2Z1bmNfXyk7CisJCS8qIG5vdCBhIGNhbGxiYWNrIHN0YXR1cyAtLSBpZ25vcmUgaWYgd2UgZ2V0IGl0ICovCisJCWJyZWFrOworCisJY2FzZSBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0lOVkFMSURfUEFSQU1TX1JTUDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogUmVsZWFzZSBJbnZhbGlkIFBhcmFtcyIsIF9fZnVuY19fKTsKKwkJaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUICE9IHBRb3NDb250ZXh0LT5oYW5kbGUpIHsKKwkJCS8qIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbiAqLworCQkJcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPQorCQkJCUhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9GQUlMRURfQkFEX1BBUkFNOworCQkJaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfSU5EOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCSAgIiVzOiBNb2RpZmljYXRpb24gaXMgY29tcGxldGUsIG5vdGlmeSBUTCIsIF9fZnVuY19fKTsKKworCQkvKiB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhIFRTUEVDIHJldHVybmVkIHdpdGggdGhpcworCQkgKiBzdGF0dXMsIGV2ZW4gaWYgYSBUU1BFQyBpcyBub3QgZXhjaGFuZ2VkIE9UQQorCQkgKi8KKwkJaWYgKHBDdXJyZW50UW9zSW5mbykgeworCQkJcEFjLT53bW1BY1RzcGVjVmFsaWQgPSB0cnVlOworCQkJbWVtY3B5KCZwQWMtPndtbUFjVHNwZWNJbmZvLAorCQkJICAgICAgIHBDdXJyZW50UW9zSW5mbywgc2l6ZW9mKHBBYy0+d21tQWNUc3BlY0luZm8pKTsKKwkJfQorCisJCWlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAhPSBwUW9zQ29udGV4dC0+aGFuZGxlKSB7CisJCQkvKiB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24gKi8KKwkJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0KKwkJCQlIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9TVUNDRVNTOworCQkJaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKwkJfQorCQkvKiBub3RpZnkgVEwgdG8gZW5hYmxlIHRyaWdnZXIgZnJhbWVzIGlmIG5lY2Vzc2FyeSAqLworCQloZGRfd21tX2VuYWJsZV90bF91YXBzZChwUW9zQ29udGV4dCk7CisKKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFk6CisJCWlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAhPSBwUW9zQ29udGV4dC0+aGFuZGxlKSB7CisJCQkvKiB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24gKi8KKwkJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0KKwkJCQlIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9TVUNDRVNTX05PX0FDTV9VQVBTRF9FWElTVElORzsKKwkJCWhkZF93bW1fbm90aWZ5X2FwcChwUW9zQ29udGV4dCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDoKKwkJLyogdGhlIGZsb3cgbW9kaWZpY2F0aW9uIGZhaWxlZCBzbyB3ZSdsbCBsZWF2ZSBpbgorCQkgKiBwbGFjZSB3aGF0ZXZlciBleGlzdGVkIGJlZm9yZWhhbmQKKwkJICovCisKKwkJaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUICE9IHBRb3NDb250ZXh0LT5oYW5kbGUpIHsKKwkJCS8qIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbiAqLworCQkJcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPQorCQkJCUhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX0ZBSUxFRDsKKwkJCWhkZF93bW1fbm90aWZ5X2FwcChwUW9zQ29udGV4dCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9QRU5ESU5HX1JTUDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkgICIlczogbW9kaWZpY2F0aW9uIHBlbmRpbmciLCBfX2Z1bmNfXyk7CisJCS8qIG5vdCBhIGNhbGxiYWNrIHN0YXR1cyAtLSBpZ25vcmUgaWYgd2UgZ2V0IGl0ICovCisJCWJyZWFrOworCisJY2FzZSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1A6CisJCS8qIHRoZSBmbG93IG1vZGlmaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgbm8gUW9TCisJCSAqIGNoYW5nZXMgcmVxdWlyZWQKKwkJICovCisKKwkJaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUICE9IHBRb3NDb250ZXh0LT5oYW5kbGUpIHsKKwkJCS8qIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbiAqLworCQkJcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPQorCQkJCUhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX1NVQ0NFU1NfTk9fQUNNX05PX1VBUFNEOworCQkJaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0lOVkFMSURfUEFSQU1TX1JTUDoKKwkJLyogaW52YWxpZCBwYXJhbXMgLS0gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbiAqLworCQlpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgIT0gcFFvc0NvbnRleHQtPmhhbmRsZSkgeworCQkJLyogdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IGFuIGFwcGxpY2F0aW9uICovCisJCQlwUW9zQ29udGV4dC0+bGFzdFN0YXR1cyA9CisJCQkJSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfRkFJTEVEX0JBRF9QQVJBTTsKKwkJCWhkZF93bW1fbm90aWZ5X2FwcChwUW9zQ29udGV4dCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX0lORF9BUFNEX1BFTkRJTkc6CisJCS8qIG5vdGhpbmcgdG8gZG8gZm9yIG5vdy4gIHdoZW4gQVBTRCBpcyBlc3RhYmxpc2hlZCB3ZSdsbCBoYXZlIHdvcmsgdG8gZG8gKi8KKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX0lORF9BUFNEX1NFVF9GQUlMRUQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE1vZGlmeSBzdWNjZXNzZnVsIGJ1dCBVLUFQU0QgZmFpbGVkIiwgX19mdW5jX18pOworCisJCS8qIFFvUyBtb2RpZmljYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IHNldHRpbmcgVT1BUFNECisJCSAqIGZhaWxlZC4gIFRoaXMgd2lsbCBhbHdheXMgYmUgYW4gZXhwbGljaXQgUW9TCisJCSAqIGluc3RhbmNlLCBzbyBhbGwgd2UgY2FuIGRvIGlzIG5vdGlmeSB0aGUKKwkJICogYXBwbGljYXRpb24gYW5kIGxldCBpdCBjbGVhbiB1cC4KKwkJICovCisJCWlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAhPSBwUW9zQ29udGV4dC0+aGFuZGxlKSB7CisJCQkvKiB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24gKi8KKwkJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0KKwkJCQlIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9VQVBTRF9TRVRfRkFJTEVEOworCQkJaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKwkJfQorCQkvKiBTaW5jZSBVLUFQU0QgcG9ydGlvbiBmYWlsZWQgZGlzYWJsZWQgdHJpZ2dlciBmcmFtZQorCQkgKiBnZW5lcmF0aW9uCisJCSAqLworCQloZGRfd21tX2Rpc2FibGVfdGxfdWFwc2QocFFvc0NvbnRleHQpOworCisJCWJyZWFrOworCisJY2FzZSBTTUVfUU9TX1NUQVRVU19IQU5ESU5HX09GRjoKKwkJLyogbm8gcm9hbWluZyBzbyB3ZSB3b24ndCBzZWUgdGhpcyAqLworCQlicmVhazsKKworCWNhc2UgU01FX1FPU19TVEFUVVNfT1VUX09GX0FQU0RfUE9XRVJfTU9ERV9JTkQ6CisJCS8qIG5lZWQgdG8gdGVsbCBUTCB0byBzdG9wIHRyaWdnZXIgZnJhbWUgZ2VuZXJhdGlvbiAqLworCQloZGRfd21tX2Rpc2FibGVfdGxfdWFwc2QocFFvc0NvbnRleHQpOworCQlicmVhazsKKworCWNhc2UgU01FX1FPU19TVEFUVVNfSU5UT19BUFNEX1BPV0VSX01PREVfSU5EOgorCQkvKiBuZWVkIHRvIHRlbGwgVEwgdG8gc3RhcnQgc2VuZGluZyB0cmlnZ2VyIGZyYW1lcyBhZ2FpbiAqLworCQloZGRfd21tX2VuYWJsZV90bF91YXBzZChwUW9zQ29udGV4dCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogdW5leHBlY3RlZCBTTUUgU3RhdHVzPSVkIiwgX19mdW5jX18sIHNtZVN0YXR1cyk7CisJCUNERl9BU1NFUlQoMCk7CisJfQorCisJLyogaWYgVHNwZWMgb25seSBhbGxvd3MgZG93bnN0cmVhbSB0cmFmZmljIHRoZW4gYWNjZXNzIGlzIG5vdAorCSAqIGFsbG93ZWQKKwkgKi8KKwlpZiAocEFjLT53bW1BY1RzcGVjVmFsaWQgJiYKKwkgICAgKHBBYy0+d21tQWNUc3BlY0luZm8udHNfaW5mby5kaXJlY3Rpb24gPT0KKwkgICAgIFNNRV9RT1NfV01NX1RTX0RJUl9ET1dOTElOSykpIHsKKwkJcEFjLT53bW1BY0FjY2Vzc0FsbG93ZWQgPSBmYWxzZTsKKwl9CisJLyogaWYgd2UgaGF2ZSB2YWxpZCBUcHNlYyBvciBpZiBBQ00gYml0IGlzIG5vdCBzZXQsIGFsbG93IGFjY2VzcyAqLworCWlmICgocEFjLT53bW1BY1RzcGVjVmFsaWQgJiYKKwkgICAgIChwQWMtPndtbUFjVHNwZWNJbmZvLnRzX2luZm8uZGlyZWN0aW9uICE9CisJICAgICAgU01FX1FPU19XTU1fVFNfRElSX0RPV05MSU5LKSkgfHwgIXBBYy0+d21tQWNBY2Nlc3NSZXF1aXJlZCkgeworCQlwQWMtPndtbUFjQWNjZXNzQWxsb3dlZCA9IHRydWU7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IGNvbXBsZXRlLCBhY2Nlc3MgZm9yIFRMIEFDICVkIGlzJXNhbGxvd2VkIiwKKwkJICBfX2Z1bmNfXywgYWNUeXBlLCBwQWMtPndtbUFjQWNjZXNzQWxsb3dlZCA/ICIgIiA6ICIgbm90ICIpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisvKioKKyAqIGhkZF93bW1wc19oZWxwZXIoKSAtIEZ1bmN0aW9uIHRvIHNldCB1YXBzZCBwc2IgZHluYW1pY2FsbHkKKyAqCisgKiBAcEFkYXB0ZXI6IFtpbl0gcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdHVyZQorICogQHB0cjogW2luXSBwb2ludGVyIHRvIGNvbW1hbmQgYnVmZmVyCisgKgorICogUmV0dXJuOiBaZXJvIG9uIHN1Y2Nlc3MsIGFwcHJvcHJpYXRlIGVycm9yIG9uIGZhaWx1cmUuCisgKi8KK2ludCBoZGRfd21tcHNfaGVscGVyKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90ICpwdHIpCit7CisJaWYgKE5VTEwgPT0gcEFkYXB0ZXIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogcEFkYXB0ZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChOVUxMID09IHB0cikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBwdHIgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIGNvbnZlcnQgQVNDSUkgdG8gaW50ZWdlciAqLworCXBBZGFwdGVyLT5jb25maWd1cmVkUHNiID0gcHRyWzldIC0gJzAnOworCXBBZGFwdGVyLT5wc2JDaGFuZ2VkID0gSEREX1BTQl9DSEFOR0VEOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogX19oZGRfd21tX2RvX2ltcGxpY2l0X3FvcygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBhdHRlbXB0IHRvIHNldHVwCisgKgkJCQlRb1MgZm9yIGFueSBBQyByZXF1aXJpbmcgaXQuCisgKiBAd29yazogW2luXSBwb2ludGVyIHRvIHdvcmsgc3RydWN0dXJlLgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBfX2hkZF93bW1fZG9faW1wbGljaXRfcW9zKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwloZGRfd21tX3Fvc19jb250ZXh0X3QgKnBRb3NDb250ZXh0ID0KKwkJY29udGFpbmVyX29mKHdvcmssIGhkZF93bW1fcW9zX2NvbnRleHRfdCwgd21tQWNTZXR1cEltcGxpY2l0UW9zKTsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlcjsKKwlzbWVfYWNfZW51bV90eXBlIGFjVHlwZTsKKwloZGRfd21tX2FjX3N0YXR1c190ICpwQWM7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCXNtZV9Rb3NTdGF0dXNUeXBlIHNtZVN0YXR1czsKKyNlbmRpZgorCXNtZV9Rb3NXbW1Uc3BlY0luZm8gcW9zSW5mbzsKKwloZGRfY29udGV4dF90ICpoZGRfY3R4OworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiVzOiBFbnRlcmVkLCBjb250ZXh0ICVwIiwgX19mdW5jX18sIHBRb3NDb250ZXh0KTsKKworCWlmICh1bmxpa2VseShIRERfV01NX0NUWF9NQUdJQyAhPSBwUW9zQ29udGV4dC0+bWFnaWMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgUW9TIENvbnRleHQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlwQWRhcHRlciA9IHBRb3NDb250ZXh0LT5wQWRhcHRlcjsKKworCWhkZF9jdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKwlpZiAoMCAhPSB3bGFuX2hkZF92YWxpZGF0ZV9jb250ZXh0KGhkZF9jdHgpKSB7CisJCWhkZExvZyhMT0dFLCBGTCgiSEREIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm47CisJfQorCisJYWNUeXBlID0gcFFvc0NvbnRleHQtPmFjVHlwZTsKKwlwQWMgPSAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiVzOiBwQWRhcHRlciAlcCBhY1R5cGUgJWQiLCBfX2Z1bmNfXywgcEFkYXB0ZXIsIGFjVHlwZSk7CisKKwlpZiAoIXBBYy0+d21tQWNBY2Nlc3NOZWVkZWQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogQUMgJWQgZG9lc24ndCBuZWVkIHNlcnZpY2UiLCBfX2Z1bmNfXywgYWNUeXBlKTsKKwkJcFFvc0NvbnRleHQtPm1hZ2ljID0gMDsKKwkJa2ZyZWUocFFvc0NvbnRleHQpOworCQlyZXR1cm47CisJfQorCisJcEFjLT53bW1BY0FjY2Vzc1BlbmRpbmcgPSB0cnVlOworCXBBYy0+d21tQWNBY2Nlc3NOZWVkZWQgPSBmYWxzZTsKKworCW1lbXNldCgmcW9zSW5mbywgMCwgc2l6ZW9mKHFvc0luZm8pKTsKKworCXFvc0luZm8udHNfaW5mby5wc2IgPSBwQWRhcHRlci0+Y29uZmlndXJlZFBzYjsKKworCXN3aXRjaCAoYWNUeXBlKSB7CisJY2FzZSBTTUVfQUNfVk86CisJCXFvc0luZm8udHNfaW5mby51cCA9IFNNRV9RT1NfV01NX1VQX1ZPOworCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGZyYW1ld29yayAqLworCQlpZiAoSEREX1BTQl9DRkdfSU5WQUxJRCA9PSBwQWRhcHRlci0+Y29uZmlndXJlZFBzYikgeworCQkJcW9zSW5mby50c19pbmZvLnBzYiA9CisJCQkJKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+CisJCQkJIFVhcHNkTWFzayAmIFNNRV9RT1NfVUFQU0RfVk8pID8gMSA6IDA7CisJCX0KKwkJcW9zSW5mby50c19pbmZvLmRpcmVjdGlvbiA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPkluZnJhRGlyQWNWbzsKKwkJcW9zSW5mby50c19pbmZvLnRpZCA9IDI1NTsKKwkJcW9zSW5mby5tZWFuX2RhdGFfcmF0ZSA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPgorCQkJSW5mcmFNZWFuRGF0YVJhdGVBY1ZvOworCQlxb3NJbmZvLm1pbl9waHlfcmF0ZSA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPkluZnJhTWluUGh5UmF0ZUFjVm87CisJCXFvc0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwgPQorCQkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5JbmZyYVVhcHNkVm9TcnZJbnR2OworCQlxb3NJbmZvLm5vbWluYWxfbXNkdV9zaXplID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+SW5mcmFOb21Nc2R1U2l6ZUFjVm87CisJCXFvc0luZm8uc3VycGx1c19id19hbGxvd2FuY2UgPQorCQkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5JbmZyYVNiYUFjVm87CisJCXFvc0luZm8uc3VzcGVuc2lvbl9pbnRlcnZhbCA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPkluZnJhVWFwc2RWb1N1c3BJbnR2OworCQlicmVhazsKKwljYXNlIFNNRV9BQ19WSToKKwkJcW9zSW5mby50c19pbmZvLnVwID0gU01FX1FPU19XTU1fVVBfVkk7CisJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFueSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gZnJhbWV3b3JrICovCisJCWlmIChIRERfUFNCX0NGR19JTlZBTElEID09IHBBZGFwdGVyLT5jb25maWd1cmVkUHNiKSB7CisJCQlxb3NJbmZvLnRzX2luZm8ucHNiID0KKwkJCQkoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT4KKwkJCQkgVWFwc2RNYXNrICYgU01FX1FPU19VQVBTRF9WSSkgPyAxIDogMDsKKwkJfQorCQlxb3NJbmZvLnRzX2luZm8uZGlyZWN0aW9uID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+SW5mcmFEaXJBY1ZpOworCQlxb3NJbmZvLnRzX2luZm8udGlkID0gMjU1OworCQlxb3NJbmZvLm1lYW5fZGF0YV9yYXRlID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+CisJCQlJbmZyYU1lYW5EYXRhUmF0ZUFjVmk7CisJCXFvc0luZm8ubWluX3BoeV9yYXRlID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+SW5mcmFNaW5QaHlSYXRlQWNWaTsKKwkJcW9zSW5mby5taW5fc2VydmljZV9pbnRlcnZhbCA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPkluZnJhVWFwc2RWaVNydkludHY7CisJCXFvc0luZm8ubm9taW5hbF9tc2R1X3NpemUgPQorCQkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5JbmZyYU5vbU1zZHVTaXplQWNWaTsKKwkJcW9zSW5mby5zdXJwbHVzX2J3X2FsbG93YW5jZSA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPkluZnJhU2JhQWNWaTsKKwkJcW9zSW5mby5zdXNwZW5zaW9uX2ludGVydmFsID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+SW5mcmFVYXBzZFZpU3VzcEludHY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBTTUVfQUNfQkU6CisJCXFvc0luZm8udHNfaW5mby51cCA9IFNNRV9RT1NfV01NX1VQX0JFOworCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGZyYW1ld29yayAqLworCQlpZiAoSEREX1BTQl9DRkdfSU5WQUxJRCA9PSBwQWRhcHRlci0+Y29uZmlndXJlZFBzYikgeworCQkJcW9zSW5mby50c19pbmZvLnBzYiA9CisJCQkJKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+CisJCQkJIFVhcHNkTWFzayAmIFNNRV9RT1NfVUFQU0RfQkUpID8gMSA6IDA7CisJCX0KKwkJcW9zSW5mby50c19pbmZvLmRpcmVjdGlvbiA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPkluZnJhRGlyQWNCZTsKKwkJcW9zSW5mby50c19pbmZvLnRpZCA9IDI1NTsKKwkJcW9zSW5mby5tZWFuX2RhdGFfcmF0ZSA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPgorCQkJSW5mcmFNZWFuRGF0YVJhdGVBY0JlOworCQlxb3NJbmZvLm1pbl9waHlfcmF0ZSA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPkluZnJhTWluUGh5UmF0ZUFjQmU7CisJCXFvc0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwgPQorCQkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5JbmZyYVVhcHNkQmVTcnZJbnR2OworCQlxb3NJbmZvLm5vbWluYWxfbXNkdV9zaXplID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+SW5mcmFOb21Nc2R1U2l6ZUFjQmU7CisJCXFvc0luZm8uc3VycGx1c19id19hbGxvd2FuY2UgPQorCQkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5JbmZyYVNiYUFjQmU7CisJCXFvc0luZm8uc3VzcGVuc2lvbl9pbnRlcnZhbCA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPkluZnJhVWFwc2RCZVN1c3BJbnR2OworCQlicmVhazsKKwljYXNlIFNNRV9BQ19CSzoKKwkJcW9zSW5mby50c19pbmZvLnVwID0gU01FX1FPU19XTU1fVVBfQks7CisJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFueSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gZnJhbWV3b3JrICovCisJCWlmIChIRERfUFNCX0NGR19JTlZBTElEID09IHBBZGFwdGVyLT5jb25maWd1cmVkUHNiKSB7CisJCQlxb3NJbmZvLnRzX2luZm8ucHNiID0KKwkJCQkoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT4KKwkJCQkgVWFwc2RNYXNrICYgU01FX1FPU19VQVBTRF9CSykgPyAxIDogMDsKKwkJfQorCQlxb3NJbmZvLnRzX2luZm8uZGlyZWN0aW9uID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+SW5mcmFEaXJBY0JrOworCQlxb3NJbmZvLnRzX2luZm8udGlkID0gMjU1OworCQlxb3NJbmZvLm1lYW5fZGF0YV9yYXRlID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+CisJCQlJbmZyYU1lYW5EYXRhUmF0ZUFjQms7CisJCXFvc0luZm8ubWluX3BoeV9yYXRlID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+SW5mcmFNaW5QaHlSYXRlQWNCazsKKwkJcW9zSW5mby5taW5fc2VydmljZV9pbnRlcnZhbCA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPkluZnJhVWFwc2RCa1NydkludHY7CisJCXFvc0luZm8ubm9taW5hbF9tc2R1X3NpemUgPQorCQkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5JbmZyYU5vbU1zZHVTaXplQWNCazsKKwkJcW9zSW5mby5zdXJwbHVzX2J3X2FsbG93YW5jZSA9CisJCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPkluZnJhU2JhQWNCazsKKwkJcW9zSW5mby5zdXNwZW5zaW9uX2ludGVydmFsID0KKwkJCShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+SW5mcmFVYXBzZEJrU3VzcEludHY7CisJCWJyZWFrOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJcW9zSW5mby5pbmFjdGl2aXR5X2ludGVydmFsID0KKwkJKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5JbmZyYUluYWN0aXZpdHlJbnRlcnZhbDsKKyNlbmRpZgorCXFvc0luZm8udHNfaW5mby5idXJzdF9zaXplX2RlZm4gPQorCQkoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPmJ1cnN0U2l6ZURlZmluaXRpb247CisKKwlzd2l0Y2ggKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+dHNJbmZvQWNrUG9saWN5KSB7CisJY2FzZSBIRERfV0xBTl9XTU1fVFNfSU5GT19BQ0tfUE9MSUNZX05PUk1BTF9BQ0s6CisJCXFvc0luZm8udHNfaW5mby5hY2tfcG9saWN5ID0KKwkJCVNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfTk9STUFMX0FDSzsKKwkJYnJlYWs7CisKKwljYXNlIEhERF9XTEFOX1dNTV9UU19JTkZPX0FDS19QT0xJQ1lfSFRfSU1NRURJQVRFX0JMT0NLX0FDSzoKKwkJcW9zSW5mby50c19pbmZvLmFja19wb2xpY3kgPQorCQkJU01FX1FPU19XTU1fVFNfQUNLX1BPTElDWV9IVF9JTU1FRElBVEVfQkxPQ0tfQUNLOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIHVua25vd24gKi8KKwkJcW9zSW5mby50c19pbmZvLmFja19wb2xpY3kgPQorCQkJU01FX1FPU19XTU1fVFNfQUNLX1BPTElDWV9OT1JNQUxfQUNLOworCX0KKworCWlmIChxb3NJbmZvLnRzX2luZm8uYWNrX3BvbGljeSA9PQorCSAgICBTTUVfUU9TX1dNTV9UU19BQ0tfUE9MSUNZX0hUX0lNTUVESUFURV9CTE9DS19BQ0spIHsKKwkJaWYgKCFzbWVfcW9zX2lzX3RzX2luZm9fYWNrX3BvbGljeV92YWxpZAorCQkJICAgICgodHBBbmlTaXJHbG9iYWwpIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwgJnFvc0luZm8sCisJCQkgICAgcEFkYXB0ZXItPnNlc3Npb25JZCkpIHsKKwkJCXFvc0luZm8udHNfaW5mby5hY2tfcG9saWN5ID0KKwkJCQlTTUVfUU9TX1dNTV9UU19BQ0tfUE9MSUNZX05PUk1BTF9BQ0s7CisJCX0KKwl9CisKKwltdXRleF9sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworCWxpc3RfYWRkKCZwUW9zQ29udGV4dC0+bm9kZSwgJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQ29udGV4dExpc3QpOworCW11dGV4X3VubG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKwlzbWVTdGF0dXMgPSBzbWVfcW9zX3NldHVwX3JlcShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisJCQkJICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCwKKwkJCQkgICAgICAmcW9zSW5mbywKKwkJCQkgICAgICBoZGRfd21tX3NtZV9jYWxsYmFjaywKKwkJCQkgICAgICBwUW9zQ29udGV4dCwKKwkJCQkgICAgICBxb3NJbmZvLnRzX2luZm8udXAsCisJCQkJICAgICAgJnBRb3NDb250ZXh0LT5xb3NGbG93SWQpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IHNtZV9xb3Nfc2V0dXBfcmVxIHJldHVybmVkICVkIGZsb3dpZCAlZCIsCisJCSAgX19mdW5jX18sIHNtZVN0YXR1cywgcFFvc0NvbnRleHQtPnFvc0Zsb3dJZCk7CisKKwkvKiBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWVzIGFuZCBhY3QgYXBwcm9wcmlhdGVseSAqLworCXN3aXRjaCAoc21lU3RhdHVzKSB7CisJY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1A6CisJY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0lORF9BUFNEX1BFTkRJTkc6CisJCS8qIHNldHVwIGlzIHBlbmRpbmcsIHNvIG5vIG1vcmUgd29yayB0byBkbyBub3cuICBhbGwKKwkJICogZnVydGhlciB3b3JrIHdpbGwgYmUgZG9uZSBpbiBoZGRfd21tX3NtZV9jYWxsYmFjaygpCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCSAgIiVzOiBTZXR1cCBpcyBwZW5kaW5nLCBubyBmdXJ0aGVyIHdvcmsiLCBfX2Z1bmNfXyk7CisKKwkJYnJlYWs7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOgorCQkvKiB3ZSBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gd2hlbiBhIHJlcXVlc3QKKwkJICogZmFpbHMgYmVjYXVzZSBBUCByZWplY3RlZCBpdCB2ZXJzdXMgd2hlbiBTTUUKKwkJICogZW5jb3VudGVyZWQgYW4gaW50ZXJuYWwgZXJyb3IuICBpbiBlaXRoZXIgY2FzZSBTTUUKKwkJICogd29uJ3QgZXZlciByZWZlcmVuY2UgdGhpcyBjb250ZXh0IHNvIGZyZWUgdGhlCisJCSAqIHJlY29yZAorCQkgKi8KKwkJaGRkX3dtbV9mcmVlX2NvbnRleHQocFFvc0NvbnRleHQpOworCisJCS8qIGZhbGwgdGhyb3VnaCBhbmQgc3RhcnQgcGFja2V0cyBmbG93aW5nICovCisJY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUDoKKwkJLyogbm8gQUNNIGluIGVmZmVjdCwgbm8gbmVlZCB0byBzZXR1cCBVLUFQU0QgKi8KKwljYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWToKKwkJLyogbm8gQUNNIGluIGVmZmVjdCwgVS1BUFNEIGlzIGRlc2lyZWQgYnV0IHdhcyBhbHJlYWR5IHNldHVwICovCisKKwkJLyogZm9yIHRoZXNlIGNhc2VzIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeSBzZXR1cCBzbyB3ZQorCQkgKiBjYW4gc2lnbmFsIFRMIHRoYXQgaXQgaGFzIHdvcmsgdG8gZG8KKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJICAiJXM6IFNldHVwIGlzIGNvbXBsZXRlLCBub3RpZnkgVEwiLCBfX2Z1bmNfXyk7CisKKwkJcEFjLT53bW1BY0FjY2Vzc0FsbG93ZWQgPSB0cnVlOworCQlwQWMtPndtbUFjQWNjZXNzR3JhbnRlZCA9IHRydWU7CisJCXBBYy0+d21tQWNBY2Nlc3NQZW5kaW5nID0gZmFsc2U7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiB1bmV4cGVjdGVkIFNNRSBTdGF0dXM9JWQiLCBfX2Z1bmNfXywgc21lU3RhdHVzKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwl9CisjZW5kaWYKKworfQorCisvKioKKyAqIGhkZF93bW1fZG9faW1wbGljaXRfcW9zKCkgLSBTU1Igd3JhcGVyIGZ1bmN0aW9uIGZvciBoZGRfd21tX2RvX2ltcGxpY2l0X3FvcworICogQHdvcms6IHBvaW50ZXIgdG8gd29ya19zdHJ1Y3QKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgaGRkX3dtbV9kb19pbXBsaWNpdF9xb3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWNkc19zc3JfcHJvdGVjdChfX2Z1bmNfXyk7CisJX19oZGRfd21tX2RvX2ltcGxpY2l0X3Fvcyh3b3JrKTsKKwljZHNfc3NyX3VucHJvdGVjdChfX2Z1bmNfXyk7Cit9CisKKy8qKgorICogaGRkX3dtbV9pbml0KCkgLSBpbml0aWFsaXplIHRoZSBXTU0gRFNDUCBjb25maWd1YXRpb24KKyAqIEBwQWRhcHRlciA6IFtpbl0gIHBvaW50ZXIgdG8gQWRhcHRlciBjb250ZXh0CisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYWxpemUgdGhlIFdNTSBEU0NQIGNvbmZpZ3VhdGlvbiBvZiBhbgorICogYWRhcHRlciB0byBhbiBpbml0aWFsIHN0YXRlLiAgVGhlIGNvbmZpZ3VyYXRpb24gY2FuIGxhdGVyIGJlCisgKiBvdmVyd3JpdHRlbiB2aWEgYXBwbGljYXRpb24gQVBJcyBvciB2aWEgUW9TIE1hcCBzZW50IE9UQS4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyBoZGRfd21tX2luaXQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJc21lX1Fvc1dtbVVwVHlwZSAqaGRkV21tRHNjcFRvVXBNYXAgPSBwQWRhcHRlci0+aGRkV21tRHNjcFRvVXBNYXA7CisJdWludDhfdCBkc2NwOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiVzOiBFbnRlcmVkIiwgX19mdW5jX18pOworCisJLyogRFNDUCB0byBVc2VyIFByaW9yaXR5IExvb2t1cCBUYWJsZQorCSAqIEJ5IGRlZmF1bHQgdXNlIHRoZSAzIFByZWNlZGVuY2UgYml0cyBvZiBEU0NQIGFzIHRoZSBVc2VyIFByaW9yaXR5CisJICovCisJZm9yIChkc2NwID0gMDsgZHNjcCA8PSBXTEFOX0hERF9NQVhfRFNDUDsgZHNjcCsrKSB7CisJCWhkZFdtbURzY3BUb1VwTWFwW2RzY3BdID0gZHNjcCA+PiAzOworCX0KKworCS8qIFNwZWNpYWwgY2FzZSBmb3IgRXhwZWRpdGVkIEZvcndhcmRpbmcgKERTQ1AgNDYpICovCisJaGRkV21tRHNjcFRvVXBNYXBbNDZdID0gU01FX1FPU19XTU1fVVBfVk87CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGhkZF93bW1fYWRhcHRlcl9pbml0KCkgLSBpbml0aWFsaXplIHRoZSBXTU0gY29uZmlndXJhdGlvbiBvZiBhbiBhZGFwdGVyCisgKiBAcEFkYXB0ZXI6IFtpbl0gIHBvaW50ZXIgdG8gQWRhcHRlciBjb250ZXh0CisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYWxpemUgdGhlIFdNTSBjb25maWd1YXRpb24gYW5kIHN0YXR1cyBvZiBhbgorICogYWRhcHRlciB0byBhbiBpbml0aWFsIHN0YXRlLiAgVGhlIGNvbmZpZ3VyYXRpb24gY2FuIGxhdGVyIGJlCisgKiBvdmVyd3JpdHRlbiB2aWEgYXBwbGljYXRpb24gQVBJcworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitDREZfU1RBVFVTIGhkZF93bW1fYWRhcHRlcl9pbml0KGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWhkZF93bW1fYWNfc3RhdHVzX3QgKnBBY1N0YXR1czsKKwlzbWVfYWNfZW51bV90eXBlIGFjVHlwZTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIlczogRW50ZXJlZCIsIF9fZnVuY19fKTsKKworCXBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tUWFwID0gZmFsc2U7CisJSU5JVF9MSVNUX0hFQUQoJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQ29udGV4dExpc3QpOworCW11dGV4X2luaXQoJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tTG9jayk7CisKKwlmb3IgKGFjVHlwZSA9IDA7IGFjVHlwZSA8IFdMQU5fTUFYX0FDOyBhY1R5cGUrKykgeworCQlwQWNTdGF0dXMgPSAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdOworCQlwQWNTdGF0dXMtPndtbUFjQWNjZXNzUmVxdWlyZWQgPSBmYWxzZTsKKwkJcEFjU3RhdHVzLT53bW1BY0FjY2Vzc05lZWRlZCA9IGZhbHNlOworCQlwQWNTdGF0dXMtPndtbUFjQWNjZXNzUGVuZGluZyA9IGZhbHNlOworCQlwQWNTdGF0dXMtPndtbUFjQWNjZXNzRmFpbGVkID0gZmFsc2U7CisJCXBBY1N0YXR1cy0+d21tQWNBY2Nlc3NHcmFudGVkID0gZmFsc2U7CisJCXBBY1N0YXR1cy0+d21tQWNBY2Nlc3NBbGxvd2VkID0gZmFsc2U7CisJCXBBY1N0YXR1cy0+d21tQWNUc3BlY1ZhbGlkID0gZmFsc2U7CisJCXBBY1N0YXR1cy0+d21tQWNVYXBzZEluZm9WYWxpZCA9IGZhbHNlOworCX0KKwkvKiBJbnZhbGlkIHZhbHVlKDB4ZmYpIHRvIGluZGljYXRlIHBzYiBub3QgY29uZmlndXJlZCB0aHJvdWdoCisJICogZnJhbWV3b3JrIGluaXRpYWxseS4KKwkgKi8KKwlwQWRhcHRlci0+Y29uZmlndXJlZFBzYiA9IEhERF9QU0JfQ0ZHX0lOVkFMSUQ7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGhkZF93bW1fYWRhcHRlcl9jbGVhcigpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBjbGVhciB0aGUgV01NIHN0YXR1cworICogZm9yIGFsbCB0aGUgQUNzCisgKgorICogQHBBZGFwdGVyOiBbaW5dICBwb2ludGVyIHRvIEFkYXB0ZXIgY29udGV4dAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitDREZfU1RBVFVTIGhkZF93bW1fYWRhcHRlcl9jbGVhcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwloZGRfd21tX2FjX3N0YXR1c190ICpwQWNTdGF0dXM7CisJc21lX2FjX2VudW1fdHlwZSBhY1R5cGU7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiVzOiBFbnRlcmVkIiwgX19mdW5jX18pOworCWZvciAoYWNUeXBlID0gMDsgYWNUeXBlIDwgV0xBTl9NQVhfQUM7IGFjVHlwZSsrKSB7CisJCXBBY1N0YXR1cyA9ICZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV07CisJCXBBY1N0YXR1cy0+d21tQWNBY2Nlc3NSZXF1aXJlZCA9IGZhbHNlOworCQlwQWNTdGF0dXMtPndtbUFjQWNjZXNzTmVlZGVkID0gZmFsc2U7CisJCXBBY1N0YXR1cy0+d21tQWNBY2Nlc3NQZW5kaW5nID0gZmFsc2U7CisJCXBBY1N0YXR1cy0+d21tQWNBY2Nlc3NGYWlsZWQgPSBmYWxzZTsKKwkJcEFjU3RhdHVzLT53bW1BY0FjY2Vzc0dyYW50ZWQgPSBmYWxzZTsKKwkJcEFjU3RhdHVzLT53bW1BY0FjY2Vzc0FsbG93ZWQgPSBmYWxzZTsKKwkJcEFjU3RhdHVzLT53bW1BY1RzcGVjVmFsaWQgPSBmYWxzZTsKKwkJcEFjU3RhdHVzLT53bW1BY1VhcHNkSW5mb1ZhbGlkID0gZmFsc2U7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogaGRkX3dtbV9jbG9zZSgpIC0gV01NIGNsb3NlIGZ1bmN0aW9uCisgKiBAcEFkYXB0ZXI6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKgorICogRnVuY3Rpb24gd2hpY2ggd2lsbCBwZXJmb3JtIGFueSBuZWNlc3Nhcnkgd29yayB0byB0byBjbGVhbiB1cCB0aGUKKyAqIFdNTSBmdW5jdGlvbmFsaXR5IHByaW9yIHRvIHRoZSBrZXJuZWwgbW9kdWxlIHVubG9hZC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyBoZGRfd21tX2FkYXB0ZXJfY2xvc2UoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJaGRkX3dtbV9xb3NfY29udGV4dF90ICpwUW9zQ29udGV4dDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIlczogRW50ZXJlZCIsIF9fZnVuY19fKTsKKworCS8qIGZyZWUgYW55IGNvbnRleHQgcmVjb3JkcyB0aGF0IHdlIHN0aWxsIGhhdmUgbGlua2VkICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUNvbnRleHRMaXN0KSkgeworCQlwUW9zQ29udGV4dCA9CisJCQlsaXN0X2ZpcnN0X2VudHJ5KCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUNvbnRleHRMaXN0LAorCQkJCQkgaGRkX3dtbV9xb3NfY29udGV4dF90LCBub2RlKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCWhkZF93bW1fZGlzYWJsZV9pbmFjdGl2aXR5X3RpbWVyKHBRb3NDb250ZXh0KTsKKyNlbmRpZgorCQlpZiAocFFvc0NvbnRleHQtPmhhbmRsZSA9PSBIRERfV01NX0hBTkRMRV9JTVBMSUNJVAorCQkJJiYgcFFvc0NvbnRleHQtPm1hZ2ljID09IEhERF9XTU1fQ1RYX01BR0lDKQorCQkJY2RzX2ZsdXNoX3dvcmsoJnBRb3NDb250ZXh0LT53bW1BY1NldHVwSW1wbGljaXRRb3MpOworCisJCWhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGhkZF93bW1fY2xhc3NpZnlfcGt0KCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGNsYXNzaWZ5IGFuIE9TIHBhY2tldAorICogaW50byBhIFdNTSBBQyBiYXNlZCBvbiBlaXRoZXIgODAyLjFRIG9yIERTQ1AKKyAqCisgKiBAcEFkYXB0ZXI6IFtpbl0gIGFkYXB0ZXIgdXBvbiB3aGljaCB0aGUgcGFja2V0IGlzIGJlaW5nIHRyYW5zbWl0dGVkCisgKiBAc2tiOiBbaW5dIHRoZSBhY3R1YWwgT1MgcGFja2V0IChza19idWZmKSBiZWluZyB0cmFuc21pdHRlZAorICogQHBBY1R5cGU6IFtvdXRdIFdNTSBBQyB0eXBlIG9mIHRoZSBPUyBwYWNrZXQKKyAqIEBwVXNlclByaTogW291dF0gVXNlciBQcmlvcml0eSBvZiB0aGUgT1MgcGFja2V0CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYwordm9pZCBoZGRfd21tX2NsYXNzaWZ5X3BrdChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc21lX2FjX2VudW1fdHlwZSAqcEFjVHlwZSwKKwkJCSAgc21lX1Fvc1dtbVVwVHlwZSAqcFVzZXJQcmksCisJCQkgIGJvb2wgKmlzX2VhcG9sKQoreworCXVuc2lnbmVkIGNoYXIgKnBQa3Q7CisJdW5pb24gZ2VuZXJpY19ldGhoZHIgKnBIZHI7CisJc3RydWN0IGlwaGRyICpwSXBIZHI7CisJdW5zaWduZWQgY2hhciB0b3M7CisJdW5zaWduZWQgY2hhciBkc2NwOworCXNtZV9Rb3NXbW1VcFR5cGUgdXNlclByaTsKKwlzbWVfYWNfZW51bV90eXBlIGFjVHlwZTsKKworCS8qIHRoaXMgY29kZSBpcyBleGVjdXRlZCBmb3IgZXZlcnkgcGFja2V0IHRoZXJlZm9yZQorCSAqIGFsbCBkZWJ1ZyBjb2RlIGlzIGtlcHQgY29uZGl0aW9uYWwKKwkgKi8KKworI2lmZGVmIEhERF9XTU1fREVCVUcKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXM6IEVudGVyZWQiLCBfX2Z1bmNfXyk7CisjZW5kaWYgLyogSEREX1dNTV9ERUJVRyAqLworCisJcFBrdCA9IHNrYi0+ZGF0YTsKKwlwSGRyID0gKHVuaW9uIGdlbmVyaWNfZXRoaGRyICopcFBrdDsKKworI2lmZGVmIEhERF9XTU1fREVCVUcKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXM6IHByb3RvL2xlbmd0aCBpcyAweCUwNHgiLCBfX2Z1bmNfXywgcEhkci0+ZXRoX0lJLmhfcHJvdG8pOworI2VuZGlmIC8qIEhERF9XTU1fREVCVUcgKi8KKworCWlmIChIRERfV01NX0NMQVNTSUZJQ0FUSU9OX0RTQ1AgPT0KKwkgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5Qa3RDbGFzc2lmaWNhdGlvbkJhc2lzKSB7CisJCWlmIChwSGRyLT5ldGhfSUkuaF9wcm90byA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJCS8qIGNhc2UgMTogRXRoZXJuZXQgSUkgSVAgcGFja2V0ICovCisJCQlwSXBIZHIgPSAoc3RydWN0IGlwaGRyICopJnBQa3Rbc2l6ZW9mKHBIZHItPmV0aF9JSSldOworCQkJdG9zID0gcElwSGRyLT50b3M7CisjaWZkZWYgSEREX1dNTV9ERUJVRworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkJICAiJXM6IEV0aGVybmV0IElJIElQIFBhY2tldCwgdG9zIGlzICVkIiwKKwkJCQkgIF9fZnVuY19fLCB0b3MpOworI2VuZGlmIC8qIEhERF9XTU1fREVCVUcgKi8KKworCQl9IGVsc2UgaWYgKChudG9ocyhwSGRyLT5ldGhfSUkuaF9wcm90bykgPCBXTEFOX01JTl9QUk9UTykgJiYKKwkJCSAgIChwSGRyLT5ldGhfODAyMy5oX3NuYXAuZHNhcCA9PSBXTEFOX1NOQVBfRFNBUCkgJiYKKwkJCSAgIChwSGRyLT5ldGhfODAyMy5oX3NuYXAuc3NhcCA9PSBXTEFOX1NOQVBfU1NBUCkgJiYKKwkJCSAgIChwSGRyLT5ldGhfODAyMy5oX3NuYXAuY3RybCA9PSBXTEFOX1NOQVBfQ1RSTCkgJiYKKwkJCSAgIChwSGRyLT5ldGhfODAyMy5oX3Byb3RvID09IGh0b25zKEVUSF9QX0lQKSkpIHsKKwkJCS8qIGNhc2UgMjogODAyLjMgTExDL1NOQVAgSVAgcGFja2V0ICovCisJCQlwSXBIZHIgPSAoc3RydWN0IGlwaGRyICopJnBQa3Rbc2l6ZW9mKHBIZHItPmV0aF84MDIzKV07CisJCQl0b3MgPSBwSXBIZHItPnRvczsKKyNpZmRlZiBIRERfV01NX0RFQlVHCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCQkgICIlczogODAyLjMgTExDL1NOQVAgSVAgUGFja2V0LCB0b3MgaXMgJWQiLAorCQkJCSAgX19mdW5jX18sIHRvcyk7CisjZW5kaWYgLyogSEREX1dNTV9ERUJVRyAqLworCQl9IGVsc2UgaWYgKHBIZHItPmV0aF9JSS5oX3Byb3RvID09IGh0b25zKEVUSF9QXzgwMjFRKSkgeworCQkJLyogVkxBTiB0YWdnZWQgKi8KKworCQkJaWYgKHBIZHItPmV0aF9JSXYuaF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9PQorCQkJICAgIGh0b25zKEVUSF9QX0lQKSkgeworCQkJCS8qIGNhc2UgMzogRXRoZXJuZXQgSUkgdmxhbi10YWdnZWQgSVAgcGFja2V0ICovCisJCQkJcElwSGRyID0KKwkJCQkJKHN0cnVjdCBpcGhkciAqKQorCQkJCQkmcFBrdFtzaXplb2YocEhkci0+ZXRoX0lJdildOworCQkJCXRvcyA9IHBJcEhkci0+dG9zOworI2lmZGVmIEhERF9XTU1fREVCVUcKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsCisJCQkJCSAgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCQkgICIlczogRXRoZXJuZXQgSUkgVkxBTiB0YWdnZWQgSVAgUGFja2V0LCB0b3MgaXMgJWQiLAorCQkJCQkgIF9fZnVuY19fLCB0b3MpOworI2VuZGlmIC8qIEhERF9XTU1fREVCVUcgKi8KKwkJCX0gZWxzZQorCQkJaWYgKChudG9ocyhwSGRyLT5ldGhfSUl2Lmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8pCisJCQkgICAgIDwgV0xBTl9NSU5fUFJPVE8pCisJCQkgICAgJiYgKHBIZHItPmV0aF84MDIzdi5oX3NuYXAuZHNhcCA9PQorCQkJCVdMQU5fU05BUF9EU0FQKQorCQkJICAgICYmIChwSGRyLT5ldGhfODAyM3YuaF9zbmFwLnNzYXAgPT0KKwkJCQlXTEFOX1NOQVBfU1NBUCkKKwkJCSAgICAmJiAocEhkci0+ZXRoXzgwMjN2Lmhfc25hcC5jdHJsID09CisJCQkJV0xBTl9TTkFQX0NUUkwpCisJCQkgICAgJiYgKHBIZHItPmV0aF84MDIzdi5oX3Byb3RvID09CisJCQkJaHRvbnMoRVRIX1BfSVApKSkgeworCQkJCS8qIGNhc2UgNDogODAyLjMgTExDL1NOQVAgdmxhbi10YWdnZWQgSVAgcGFja2V0ICovCisJCQkJcElwSGRyID0KKwkJCQkJKHN0cnVjdCBpcGhkciAqKQorCQkJCQkmcFBrdFtzaXplb2YocEhkci0+ZXRoXzgwMjN2KV07CisJCQkJdG9zID0gcElwSGRyLT50b3M7CisjaWZkZWYgSEREX1dNTV9ERUJVRworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJICBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkJCSAgIiVzOiA4MDIuMyBMTEMvU05BUCBWTEFOIHRhZ2dlZCBJUCBQYWNrZXQsIHRvcyBpcyAlZCIsCisJCQkJCSAgX19mdW5jX18sIHRvcyk7CisjZW5kaWYgLyogSEREX1dNTV9ERUJVRyAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBkZWZhdWx0ICovCisjaWZkZWYgSEREX1dNTV9ERUJVRworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwKKwkJCQkJICBXTU1fVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJICAiJXM6IFZMQU4gdGFnZ2VkIFVuaGFuZGxlZCBQcm90b2NvbCwgdXNpbmcgZGVmYXVsdCB0b3MiLAorCQkJCQkgIF9fZnVuY19fKTsKKyNlbmRpZiAvKiBIRERfV01NX0RFQlVHICovCisJCQkJdG9zID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGRlZmF1bHQgKi8KKyNpZmRlZiBIRERfV01NX0RFQlVHCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9XQVJOLAorCQkJCSAgIiVzOiBVbmhhbmRsZWQgUHJvdG9jb2wsIHVzaW5nIGRlZmF1bHQgdG9zIiwKKwkJCQkgIF9fZnVuY19fKTsKKyNlbmRpZiAvKiBIRERfV01NX0RFQlVHICovCisJCQkvKiBHaXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5IHRvIDgwMi4xeCBwYWNrZXQgKi8KKwkJCWlmIChwSGRyLT5ldGhfSUkuaF9wcm90byA9PQorCQkJICAgIGh0b25zKEhERF9FVEhFUlRZUEVfODAyXzFfWCkpIHsKKwkJCQl0b3MgPSAweEMwOworCQkJCSppc19lYXBvbCA9IHRydWU7CisJCQl9IGVsc2UKKwkJCQl0b3MgPSAwOworCQl9CisKKwkJZHNjcCA9ICh0b3MgPj4gMikgJiAweDNmOworCQl1c2VyUHJpID0gcEFkYXB0ZXItPmhkZFdtbURzY3BUb1VwTWFwW2RzY3BdOworCisjaWZkZWYgSEREX1dNTV9ERUJVRworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IHRvcyBpcyAlZCwgZHNjcCBpcyAlZCwgdXAgaXMgJWQiLAorCQkJICBfX2Z1bmNfXywgdG9zLCBkc2NwLCB1c2VyUHJpKTsKKyNlbmRpZiAvKiBIRERfV01NX0RFQlVHICovCisKKwl9IGVsc2UgaWYgKEhERF9XTU1fQ0xBU1NJRklDQVRJT05fODAyXzFRID09CisJCSAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+CisJCSAgIFBrdENsYXNzaWZpY2F0aW9uQmFzaXMpIHsKKwkJaWYgKHBIZHItPmV0aF9JSXYuaF92bGFuX3Byb3RvID09IGh0b25zKEVUSF9QXzgwMjFRKSkgeworCQkJLyogVkxBTiB0YWdnZWQgKi8KKwkJCXVzZXJQcmkgPSAobnRvaHMocEhkci0+ZXRoX0lJdi5oX3ZsYW5fVENJKSA+PiAxMykgJiAweDc7CisjaWZkZWYgSEREX1dNTV9ERUJVRworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICIlczogVGFnZ2VkIGZyYW1lLCBVUCBpcyAlZCIsCisJCQkJICBfX2Z1bmNfXywgdXNlclByaSk7CisjZW5kaWYgLyogSEREX1dNTV9ERUJVRyAqLworCQl9IGVsc2UgeworCQkJLyogbm90IFZMQU4gdGFnZ2VkLCB1c2UgZGVmYXVsdCAqLworI2lmZGVmIEhERF9XTU1fREVCVUcKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJICAiJXM6IFVudGFnZ2VkIGZyYW1lLCB1c2luZyBkZWZhdWx0IFVQIiwKKwkJCQkgIF9fZnVuY19fKTsKKyNlbmRpZiAvKiBIRERfV01NX0RFQlVHICovCisJCQkvKiBHaXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5IHRvIDgwMi4xeCBwYWNrZXQgKi8KKwkJCWlmIChwSGRyLT5ldGhfSUkuaF9wcm90byA9PQorCQkJICAgIGh0b25zKEhERF9FVEhFUlRZUEVfODAyXzFfWCkpIHsKKwkJCQl1c2VyUHJpID0gU01FX1FPU19XTU1fVVBfVk87CisJCQkJKmlzX2VhcG9sID0gdHJ1ZTsKKwkJCX0gZWxzZQorCQkJCXVzZXJQcmkgPSBTTUVfUU9TX1dNTV9VUF9CRTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGRlZmF1bHQgKi8KKyNpZmRlZiBIRERfV01NX0RFQlVHCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFVua25vd24gY2xhc3NpZmljYXRpb24gc2NoZW1lLCB1c2luZyBkZWZhdWx0IFVQIiwKKwkJCSAgX19mdW5jX18pOworI2VuZGlmIC8qIEhERF9XTU1fREVCVUcgKi8KKwkJdXNlclByaSA9IFNNRV9RT1NfV01NX1VQX0JFOworCX0KKworCWFjVHlwZSA9IGhkZF93bW1fdXBfdG9fYWNfbWFwW3VzZXJQcmldOworCisjaWZkZWYgSEREX1dNTV9ERUJVRworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBVUCBpcyAlZCwgQUMgaXMgJWQiLCBfX2Z1bmNfXywgdXNlclByaSwgYWNUeXBlKTsKKyNlbmRpZiAvKiBIRERfV01NX0RFQlVHICovCisKKwkqcFVzZXJQcmkgPSB1c2VyUHJpOworCSpwQWNUeXBlID0gYWNUeXBlOworCisJcmV0dXJuOworfQorCisjaWZkZWYgUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMgorLyoqCisgKiBoZGRfZ2V0X3F1ZXVlX2luZGV4KCkgLSBnZXQgcXVldWUgaW5kZXgKKyAqIEB1cDogdXNlciBwcmlvcml0eQorICogQGlzX2VhcG9sOiBpc19lYXBvbCBmbGFnCisgKgorICogUmV0dXJuOiBxdWV1ZV9pbmRleAorICovCitzdGF0aWMKK3VpbnQxNl90IGhkZF9nZXRfcXVldWVfaW5kZXgodWludDE2X3QgdXAsIGJvb2wgaXNfZWFwb2wpCit7CisJaWYgKGNkZl91bmxpa2VseShpc19lYXBvbCA9PSB0cnVlKSkKKwkJcmV0dXJuIEhERF9MSU5VWF9BQ19ISV9QUklPOworCWVsc2UKKwkJcmV0dXJuIGhkZF9saW51eF91cF90b19hY19tYXBbdXBdOworfQorI2Vsc2UKK3N0YXRpYwordWludDE2X3QgaGRkX2dldF9xdWV1ZV9pbmRleCh1aW50MTZfdCB1cCwgYm9vbCBpc19lYXBvbCkKK3sKKwlyZXR1cm4gaGRkX2xpbnV4X3VwX3RvX2FjX21hcFt1cF07Cit9CisjZW5kaWYKKworCisvKioKKyAqIGhkZF9ob3N0YXBkX3NlbGVjdF9xdWV1ZSgpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBjbGFzc2lmeSB0aGUgcGFja2V0CisgKiAgICAgICBhY2NvcmRpbmcgdG8gbGludXggcWRpc2MgZXhwZWN0YXRpb24uCisgKgorICogQGRldjogW2luXSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiBAc2tiOiBbaW5dIHBvaW50ZXIgdG8gb3MgcGFja2V0CisgKgorICogUmV0dXJuOiBRZGlzYyBxdWV1ZSBpbmRleAorICovCit1aW50MTZfdCBoZGRfaG9zdGFwZF9zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTMsIDApKQorCQkJCSAgLCB2b2lkICphY2NlbF9wcml2CisjZW5kaWYKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE0LCAwKSkKKwkJCQkgICwgc2VsZWN0X3F1ZXVlX2ZhbGxiYWNrX3QgZmFsbGJhY2sKKyNlbmRpZgorCispCit7CisJc21lX2FjX2VudW1fdHlwZSBhYzsKKwlzbWVfUW9zV21tVXBUeXBlIHVwID0gU01FX1FPU19XTU1fVVBfQkU7CisJdWludDE2X3QgcXVldWVJbmRleDsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IChoZGRfYWRhcHRlcl90ICopIG5ldGRldl9wcml2KGRldik7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCWJvb2wgaXNfZWFwb2wgPSBmYWxzZTsKKworCWlmIChIRERfV01NX1VTRVJfTU9ERV9OT19RT1MgIT0gcEhkZEN0eC0+Y29uZmlnLT5XbW1Nb2RlKSB7CisJCS8qIEdldCB0aGUgdXNlciBwcmlvcml0eSBmcm9tIElQIGhlYWRlciAmIGNvcnJlc3BvbmRpbmcgQUMgKi8KKwkJaGRkX3dtbV9jbGFzc2lmeV9wa3QocEFkYXB0ZXIsIHNrYiwgJmFjLCAmdXAsICZpc19lYXBvbCk7CisJfQorCisJc2tiLT5wcmlvcml0eSA9IHVwOworCXF1ZXVlSW5kZXggPSBoZGRfZ2V0X3F1ZXVlX2luZGV4KHNrYi0+cHJpb3JpdHksIGlzX2VhcG9sKTsKKworCXJldHVybiBxdWV1ZUluZGV4OworfQorCisvKioKKyAqIGhkZF93bW1fc2VsZWN0X3F1ZXVlKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGNsYXNzaWZ5IHRoZSBwYWNrZXQKKyAqICAgICAgIGFjY29yZGluZyB0byBsaW51eCBxZGlzYyBleHBlY3RhdGlvbi4KKyAqCisgKiBAZGV2OiBbaW5dIHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqIEBza2I6IFtpbl0gcG9pbnRlciB0byBvcyBwYWNrZXQKKyAqCisgKiBSZXR1cm46IFFkaXNjIHF1ZXVlIGluZGV4CisgKi8KK3VpbnQxNl90IGhkZF93bW1fc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc21lX2FjX2VudW1fdHlwZSBhYzsKKwlzbWVfUW9zV21tVXBUeXBlIHVwID0gU01FX1FPU19XTU1fVVBfQkU7CisJdWludDE2X3QgcXVldWVJbmRleDsKKwloZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCWJvb2wgaXNfZWFwb2wgPSBmYWxzZTsKKworCS8qIGlmIHdlIGRvbid0IHdhbnQgUW9TIG9yIHRoZSBBUCBkb2Vzbid0IHN1cHBvcnQgUW9zICovCisJLyogQWxsIHRyYWZmaWMgd2lsbCBnZXQgZXF1YWwgb3Bwb3J0dW5peSB0byB0cmFuc21pdCBkYXRhIGZyYW1lcy4gKi8KKwlpZiAoaGRkX3dtbV9pc19hY3RpdmUocEFkYXB0ZXIpKSB7CisJCS8qIEdldCB0aGUgdXNlciBwcmlvcml0eSBmcm9tIElQIGhlYWRlciAmIGNvcnJlc3BvbmRpbmcgQUMgKi8KKwkJaGRkX3dtbV9jbGFzc2lmeV9wa3QocEFkYXB0ZXIsIHNrYiwgJmFjLCAmdXAsICZpc19lYXBvbCk7CisJfQorCisJc2tiLT5wcmlvcml0eSA9IHVwOworCXF1ZXVlSW5kZXggPSBoZGRfZ2V0X3F1ZXVlX2luZGV4KHNrYi0+cHJpb3JpdHksIGlzX2VhcG9sKTsKKwlyZXR1cm4gcXVldWVJbmRleDsKK30KKworLyoqCisgKiBoZGRfd21tX2FjcXVpcmVfYWNjZXNzX3JlcXVpcmVkKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGRldGVybWluZQorICogYWNxdWlyZSBhZG1pdHRhbmNlIGZvciBhIFdNTSBBQyBpcyByZXF1aXJlZCBvciBub3QgYmFzZWQgb24gcHNiIGNvbmZpZ3VyYXRpb24KKyAqIGRvbmUgaW4gZnJhbWV3b3JrCisgKgorICogQHBBZGFwdGVyOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBhY1R5cGU6IFtpbl0gV01NIEFDIHR5cGUgb2YgT1MgcGFja2V0CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgaGRkX3dtbV9hY3F1aXJlX2FjY2Vzc19yZXF1aXJlZChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgIHNtZV9hY19lbnVtX3R5cGUgYWNUeXBlKQoreworCS8qIEVhY2ggYml0IGluIHRoZSBMU0IgbmliYmxlIGluZGljYXRlcyAxIEFDLgorCSAqIENsZWFyaW5nIHRoZSBwYXJ0aWN1bGFyIGJpdCBpbiBMU0IgbmliYmxlIHRvIGluZGljYXRlCisJICogYWNjZXNzIHJlcXVpcmVkCisJICovCisJc3dpdGNoIChhY1R5cGUpIHsKKwljYXNlIFNNRV9BQ19CSzoKKwkJLyogY2xlYXIgZmlyc3QgYml0ICovCisJCXBBZGFwdGVyLT5wc2JDaGFuZ2VkICY9IH5TTUVfUU9TX1VBUFNEX0NGR19CS19DSEFOR0VEX01BU0s7CisJCWJyZWFrOworCWNhc2UgU01FX0FDX0JFOgorCQkvKiBjbGVhciBzZWNvbmQgYml0ICovCisJCXBBZGFwdGVyLT5wc2JDaGFuZ2VkICY9IH5TTUVfUU9TX1VBUFNEX0NGR19CRV9DSEFOR0VEX01BU0s7CisJCWJyZWFrOworCWNhc2UgU01FX0FDX1ZJOgorCQkvKiBjbGVhciB0aGlyZCBiaXQgKi8KKwkJcEFkYXB0ZXItPnBzYkNoYW5nZWQgJj0gflNNRV9RT1NfVUFQU0RfQ0ZHX1ZJX0NIQU5HRURfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBTTUVfQUNfVk86CisJCS8qIGNsZWFyIGZvdXJ0aCBiaXQgKi8KKwkJcEFkYXB0ZXItPnBzYkNoYW5nZWQgJj0gflNNRV9RT1NfVUFQU0RfQ0ZHX1ZPX0NIQU5HRURfTUFTSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBBQyBUeXBlIiwgX19mdW5jX18pOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogaGRkX3dtbV9hY3F1aXJlX2FjY2VzcygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBhdHRlbXB0IHRvIGFjcXVpcmUKKyAqIGFkbWl0dGFuY2UgZm9yIGEgV01NIEFDCisgKgorICogQHBBZGFwdGVyOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICogQGFjVHlwZTogW2luXSAgV01NIEFDIHR5cGUgb2YgT1MgcGFja2V0CisgKiBAcEdyYW50ZWQ6IFtvdXRdIHBvaW50ZXIgdG8gYm9vbCBmbGFnIHdoZW4gaW5kaWNhdGVzIGlmIGFjY2VzcworICoJICAgICAgaGFzIGJlZW4gZ3JhbnRlZCBvciBub3QKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyBoZGRfd21tX2FjcXVpcmVfYWNjZXNzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorCQkJCSAgc21lX2FjX2VudW1fdHlwZSBhY1R5cGUsIGJvb2wgKnBHcmFudGVkKQoreworCWhkZF93bW1fcW9zX2NvbnRleHRfdCAqcFFvc0NvbnRleHQ7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXM6IEVudGVyZWQgZm9yIEFDICVkIiwgX19mdW5jX18sIGFjVHlwZSk7CisKKwlpZiAoIWhkZF93bW1faXNfYWN0aXZlKHBBZGFwdGVyKSB8fAorCSAgICAhKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y29uZmlnLT5iSW1wbGljaXRRb3NFbmFibGVkIHx8CisJICAgICFwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV0ud21tQWNBY2Nlc3NSZXF1aXJlZCkgeworCQkvKiBlaXRoZXIgd2UgZG9uJ3Qgd2FudCBRb1Mgb3IgdGhlIEFQIGRvZXNuJ3Qgc3VwcG9ydAorCQkgKiBRb1Mgb3Igd2UgZG9uJ3Qgd2FudCB0byBkbyBpbXBsaWNpdCBRb1MKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJICAiJXM6IFFvUyBub3QgY29uZmlndXJlZCBvbiBib3RoIGVuZHMgIiwgX19mdW5jX18pOworCisJCSpwR3JhbnRlZCA9CisJCQlwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV0uCisJCQl3bW1BY0FjY2Vzc0FsbG93ZWQ7CisKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJLyogZG8gd2UgYWxyZWFkeSBoYXZlIGFuIGltcGxpY2l0IFFvUyByZXF1ZXN0IHBlbmRpbmcgZm9yIHRoaXMgQUM/ICovCisJaWYgKChwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV0ud21tQWNBY2Nlc3NOZWVkZWQpIHx8CisJICAgIChwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV0ud21tQWNBY2Nlc3NQZW5kaW5nKSkgeworCQkvKiByZXF1ZXN0IGFscmVhZHkgcGVuZGluZyBzbyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoYXQKKwkJICogcmVzcG9uc2UKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJICAiJXM6IEltcGxpY2l0IFFvUyBmb3IgVEwgQUMgJWQgYWxyZWFkeSBzY2hlZHVsZWQiLAorCQkJICBfX2Z1bmNfXywgYWNUeXBlKTsKKworCQkqcEdyYW50ZWQgPSBmYWxzZTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJLyogZGlkIHdlIGFscmVhZHkgZmFpbCB0byBlc3RhYmxpc2ggaW1wbGljaXQgUW9TIGZvciB0aGlzIEFDPworCSAqIChpZiBzbywgYWNjZXNzIHNob3VsZCBoYXZlIGJlZW4gZ3JhbnRlZCB3aGVuIHRoZSBmYWlsdXJlCisJICogd2FzIGhhbmRsZWQpCisJICovCisJaWYgKHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNUeXBlXS53bW1BY0FjY2Vzc0ZhaWxlZCkgeworCQkvKiByZXF1ZXN0IHByZXZpb3VzbHkgZmFpbGVkCisJCSAqIGFsbG93IGFjY2VzcywgYnV0IHdlJ2xsIGJlIGRvd25ncmFkZWQKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJICAiJXM6IEltcGxpY2l0IFFvUyBmb3IgVEwgQUMgJWQgcHJldmlvdXNseSBmYWlsZWQiLAorCQkJICBfX2Z1bmNfXywgYWNUeXBlKTsKKworCQlpZiAoIXBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNUeXBlXS4KKwkJICAgIHdtbUFjQWNjZXNzUmVxdWlyZWQpIHsKKwkJCXBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNUeXBlXS4KKwkJCXdtbUFjQWNjZXNzQWxsb3dlZCA9IHRydWU7CisJCQkqcEdyYW50ZWQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdLgorCQkJd21tQWNBY2Nlc3NBbGxvd2VkID0gZmFsc2U7CisJCQkqcEdyYW50ZWQgPSBmYWxzZTsKKwkJfQorCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCS8qIHdlIG5lZWQgdG8gZXN0YWJsaXNoIGltcGxpY2l0IFFvUyAqLworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBOZWVkIHRvIHNjaGVkdWxlIGltcGxpY2l0IFFvUyBmb3IgVEwgQUMgJWQsIHBBZGFwdGVyIGlzICVwIiwKKwkJICBfX2Z1bmNfXywgYWNUeXBlLCBwQWRhcHRlcik7CisKKwlwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV0ud21tQWNBY2Nlc3NOZWVkZWQgPSB0cnVlOworCisJcFFvc0NvbnRleHQgPSBrbWFsbG9jKHNpemVvZigqcFFvc0NvbnRleHQpLCBHRlBfQVRPTUlDKTsKKwlpZiAoTlVMTCA9PSBwUW9zQ29udGV4dCkgeworCQkvKiBubyBtZW1vcnkgZm9yIFFvUyBjb250ZXh0LiAgTm90aGluZyB3ZSBjYW4gZG8gYnV0CisJCSAqIGxldCBkYXRhIGZsb3cKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBjb250ZXh0IiwgX19mdW5jX18pOworCQlwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV0ud21tQWNBY2Nlc3NBbGxvd2VkID0KKwkJCXRydWU7CisJCSpwR3JhbnRlZCA9IHRydWU7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJcFFvc0NvbnRleHQtPmFjVHlwZSA9IGFjVHlwZTsKKwlwUW9zQ29udGV4dC0+cEFkYXB0ZXIgPSBwQWRhcHRlcjsKKwlwUW9zQ29udGV4dC0+cW9zRmxvd0lkID0gMDsKKwlwUW9zQ29udGV4dC0+aGFuZGxlID0gSEREX1dNTV9IQU5ETEVfSU1QTElDSVQ7CisJcFFvc0NvbnRleHQtPm1hZ2ljID0gSEREX1dNTV9DVFhfTUFHSUM7CisJcFFvc0NvbnRleHQtPmlzX2luYWN0aXZpdHlfdGltZXJfcnVubmluZyA9IGZhbHNlOworCisjaWZkZWYgQ09ORklHX0NOU1MKKwljbnNzX2luaXRfd29yaygmcFFvc0NvbnRleHQtPndtbUFjU2V0dXBJbXBsaWNpdFFvcywKKwkJICAgICAgIGhkZF93bW1fZG9faW1wbGljaXRfcW9zKTsKKyNlbHNlCisJSU5JVF9XT1JLKCZwUW9zQ29udGV4dC0+d21tQWNTZXR1cEltcGxpY2l0UW9zLCBoZGRfd21tX2RvX2ltcGxpY2l0X3Fvcyk7CisjZW5kaWYKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBTY2hlZHVsaW5nIHdvcmsgZm9yIEFDICVkLCBjb250ZXh0ICVwIiwKKwkJICBfX2Z1bmNfXywgYWNUeXBlLCBwUW9zQ29udGV4dCk7CisKKwlzY2hlZHVsZV93b3JrKCZwUW9zQ29udGV4dC0+d21tQWNTZXR1cEltcGxpY2l0UW9zKTsKKworCS8qIGNhbGxlciB3aWxsIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgd29yayB0YWtlcyBwbGFjZSBhbmQKKwkgKiBUU1BFQyBuZWdvdGlhdGlvbiBjb21wbGV0ZXMKKwkgKi8KKwkqcEdyYW50ZWQgPSBmYWxzZTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGhkZF93bW1fYXNzb2MoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSBob3VzZWtlZXBpbmcKKyAqIHJlcXVpcmVkIGJ5IFdNTSB3aGVuIGFzc29jaWF0aW9uIHRha2VzIHBsYWNlCisgKgorICogQHBBZGFwdGVyOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICogQHBSb2FtSW5mbzogW2luXSAgcG9pbnRlciB0byByb2FtIGluZm9ybWF0aW9uCisgKiBAZUJzc1R5cGU6IFtpbl0gIHR5cGUgb2YgQlNTCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgaGRkX3dtbV9hc3NvYyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCSB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywgZUNzclJvYW1Cc3NUeXBlIGVCc3NUeXBlKQoreworCXVpbnQ4X3QgdWFwc2RNYXNrOworCUNERl9TVEFUVVMgc3RhdHVzOworCWhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworCS8qIHdoZW4gd2UgYXNzb2NpYXRlIHdlIG5lZWQgdG8gbm90aWZ5IFRMIGlmIGl0IG5lZWRzIHRvCisJICogZW5hYmxlIFVBUFNEIGZvciBhbnkgYWNjZXNzIGNhdGVnb3JpZXMKKwkgKi8KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIlczogRW50ZXJlZCIsIF9fZnVuY19fKTsKKworCWlmIChwUm9hbUluZm8tPmZSZWFzc29jUmVxKSB7CisJCS8qIHdoZW4gd2UgcmVhc3NvY2lhdGUgd2Ugc2hvdWxkIGNvbnRpbnVlIHRvIHVzZQorCQkgKiB3aGF0ZXZlciBwYXJhbWV0ZXJzIHdlcmUgcHJldmlvdXNseSBlc3RhYmxpc2hlZC4KKwkJICogaWYgd2UgYXJlIHJlYXNzb2NpYXRpbmcgZHVlIHRvIGEgVS1BUFNEIGNoYW5nZSBmb3IKKwkJICogYSBwYXJ0aWN1bGFyIEFjY2VzcyBDYXRlZ29yeSwgdGhlbiB0aGUgY2hhbmdlIHdpbGwKKwkJICogYmUgY29tbXVuaWNhdGVkIHRvIEhERCB2aWEgdGhlIFFvUyBjYWxsYmFjaworCQkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsb3csIGFuZCBVLUFQU0QKKwkJICogcGFyYW1ldGVycyB3aWxsIGJlIHVwZGF0ZWQgdGhlcmUKKwkJICovCisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkgICIlczogUmVhc3NvYyBzbyBubyB3b3JrLCBFeGl0aW5nIiwgX19mdW5jX18pOworCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCS8qIGdldCB0aGUgbmVnb3RpYXRlZCBVQVBTRCBNYXNrICovCisJdWFwc2RNYXNrID0KKwkJcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5tb2RpZnlQcm9maWxlRmllbGRzLnVhcHNkX21hc2s7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXM6IFUtQVBTRCBtYXNrIGlzIDB4JTAyeCIsIF9fZnVuY19fLCAoaW50KXVhcHNkTWFzayk7CisKKwlpZiAodWFwc2RNYXNrICYgSEREX0FDX1ZPKSB7CisJCXN0YXR1cyA9CisJCQlzbWVfZW5hYmxlX3VhcHNkX2Zvcl9hYygoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT4KKwkJCQkJCSAgIHBjZHNfY29udGV4dCwKKwkJCQkJCSAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSCisJCQkJCQkJICAgIChwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisJCQkJCQkgICBTTUVfQUNfVk8sIDcsIDcsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RWb1NydkludHYsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RWb1N1c3BJbnR2LAorCQkJCQkJICAgU01FX0JJX0RJUiwgMSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkRlbGF5ZWRUcmlnZ2VyRnJtSW50KTsKKworCQlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKTsKKwl9CisKKwlpZiAodWFwc2RNYXNrICYgSEREX0FDX1ZJKSB7CisJCXN0YXR1cyA9CisJCQlzbWVfZW5hYmxlX3VhcHNkX2Zvcl9hYygoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT4KKwkJCQkJCSAgIHBjZHNfY29udGV4dCwKKwkJCQkJCSAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSCisJCQkJCQkJICAgIChwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisJCQkJCQkgICBTTUVfQUNfVkksIDUsIDUsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RWaVNydkludHYsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RWaVN1c3BJbnR2LAorCQkJCQkJICAgU01FX0JJX0RJUiwgMSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkRlbGF5ZWRUcmlnZ2VyRnJtSW50KTsKKworCQlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKTsKKwl9CisKKwlpZiAodWFwc2RNYXNrICYgSEREX0FDX0JLKSB7CisJCXN0YXR1cyA9CisJCQlzbWVfZW5hYmxlX3VhcHNkX2Zvcl9hYygoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT4KKwkJCQkJCSAgIHBjZHNfY29udGV4dCwKKwkJCQkJCSAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSCisJCQkJCQkJICAgIChwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisJCQkJCQkgICBTTUVfQUNfQkssIDIsIDIsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RCa1NydkludHYsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RCa1N1c3BJbnR2LAorCQkJCQkJICAgU01FX0JJX0RJUiwgMSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkRlbGF5ZWRUcmlnZ2VyRnJtSW50KTsKKworCQlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKTsKKwl9CisKKwlpZiAodWFwc2RNYXNrICYgSEREX0FDX0JFKSB7CisJCXN0YXR1cyA9CisJCQlzbWVfZW5hYmxlX3VhcHNkX2Zvcl9hYygoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT4KKwkJCQkJCSAgIHBjZHNfY29udGV4dCwKKwkJCQkJCSAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSCisJCQkJCQkJICAgIChwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisJCQkJCQkgICBTTUVfQUNfQkUsIDMsIDMsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RCZVNydkludHYsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkluZnJhVWFwc2RCZVN1c3BJbnR2LAorCQkJCQkJICAgU01FX0JJX0RJUiwgMSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisJCQkJCQkgICBwSGRkQ3R4LT5jb25maWctPkRlbGF5ZWRUcmlnZ2VyRnJtSW50KTsKKworCQlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKTsKKwl9CisKKwlzdGF0dXMgPSBzbWVfdXBkYXRlX2RzY19wdG9fdXBfbWFwcGluZyhwSGRkQ3R4LT5oSGFsLAorCQkJCQkgICAgICAgcEFkYXB0ZXItPmhkZFdtbURzY3BUb1VwTWFwLAorCQkJCQkgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWhkZF93bW1faW5pdChwQWRhcHRlcik7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiVzOiBFeGl0aW5nIiwgX19mdW5jX18pOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWNtX21hc2tfYml0W1dMQU5fTUFYX0FDXSA9IHsKKwkweDQsICAgICAgICAgICAgICAgICAgICAvKiBTTUVfQUNfQksgKi8KKwkweDgsICAgICAgICAgICAgICAgICAgICAvKiBTTUVfQUNfQkUgKi8KKwkweDIsICAgICAgICAgICAgICAgICAgICAvKiBTTUVfQUNfVkkgKi8KKwkweDEgICAgICAgICAgICAgICAgICAgICAvKiBTTUVfQUNfVk8gKi8KK307CisKKy8qKgorICogaGRkX3dtbV9jb25uZWN0KCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGhhbmRsZSB0aGUgaG91c2VrZWVwaW5nCisgKiByZXF1aXJlZCBieSBXTU0gd2hlbiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQKKyAqCisgKiBAcEFkYXB0ZXIgOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICogQHBSb2FtSW5mbzogW2luXSAgcG9pbnRlciB0byByb2FtIGluZm9ybWF0aW9uCisgKiBAZUJzc1R5cGUgOiBbaW5dICB0eXBlIG9mIEJTUworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitDREZfU1RBVFVTIGhkZF93bW1fY29ubmVjdChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCSAgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLCBlQ3NyUm9hbUJzc1R5cGUgZUJzc1R5cGUpCit7CisJaW50IGFjOworCWJvb2wgcWFwOworCWJvb2wgcW9zQ29ubmVjdGlvbjsKKwl1aW50OF90IGFjbU1hc2s7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXM6IEVudGVyZWQiLCBfX2Z1bmNfXyk7CisKKwlpZiAoKGVDU1JfQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUgPT0gZUJzc1R5cGUpICYmCisJICAgIHBSb2FtSW5mbyAmJiBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUpIHsKKwkJcWFwID0gcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5xYXA7CisJCXFvc0Nvbm5lY3Rpb24gPSBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPnFvc0Nvbm5lY3Rpb247CisJCWFjbU1hc2sgPSBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPmFjbV9tYXNrOworCX0gZWxzZSB7CisJCXFhcCA9IHRydWU7CisJCXFvc0Nvbm5lY3Rpb24gPSB0cnVlOworCQlhY21NYXNrID0gMHgwOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIlczogcWFwIGlzICVkLCBxb3NDb25uZWN0aW9uIGlzICVkLCBhY21NYXNrIGlzIDB4JXgiLAorCQkgIF9fZnVuY19fLCBxYXAsIHFvc0Nvbm5lY3Rpb24sIGFjbU1hc2spOworCisJcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1RYXAgPSBxYXA7CisJcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Rb3NDb25uZWN0aW9uID0gcW9zQ29ubmVjdGlvbjsKKworCWZvciAoYWMgPSAwOyBhYyA8IFdMQU5fTUFYX0FDOyBhYysrKSB7CisJCWlmIChxYXAgJiYgcW9zQ29ubmVjdGlvbiAmJiAoYWNtTWFzayAmIGFjbV9tYXNrX2JpdFthY10pKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCQkgICIlczogYWMgJWQgb24iLCBfX2Z1bmNfXywgYWMpOworCisJCQkvKiBhZG1pc3Npb24gaXMgcmVxdWlyZWQgKi8KKwkJCXBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNdLgorCQkJd21tQWNBY2Nlc3NSZXF1aXJlZCA9IHRydWU7CisJCQlwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjXS4KKwkJCXdtbUFjQWNjZXNzQWxsb3dlZCA9IGZhbHNlOworCQkJcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10uCisJCQl3bW1BY0FjY2Vzc0dyYW50ZWQgPSBmYWxzZTsKKwkJCS8qIGFmdGVyIHJlYXNzb2MgaWYgd2UgaGF2ZSB2YWxpZCB0c3BlYywgYWxsb3cgYWNjZXNzICovCisJCQlpZiAocEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10uCisJCQkgICAgd21tQWNUc3BlY1ZhbGlkCisJCQkgICAgJiYgKHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNdLgorCQkJCXdtbUFjVHNwZWNJbmZvLnRzX2luZm8uZGlyZWN0aW9uICE9CisJCQkJU01FX1FPU19XTU1fVFNfRElSX0RPV05MSU5LKSkgeworCQkJCXBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNdLgorCQkJCXdtbUFjQWNjZXNzQWxsb3dlZCA9IHRydWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCQkgICIlczogYWMgJWQgb2ZmIiwgX19mdW5jX18sIGFjKTsKKwkJCS8qIGFkbWlzc2lvbiBpcyBub3QgcmVxdWlyZWQgc28gYWNjZXNzIGlzIGFsbG93ZWQgKi8KKwkJCXBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNdLgorCQkJd21tQWNBY2Nlc3NSZXF1aXJlZCA9IGZhbHNlOworCQkJcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10uCisJCQl3bW1BY0FjY2Vzc0FsbG93ZWQgPSB0cnVlOworCQl9CisKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXM6IEV4aXRpbmciLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGhkZF93bW1fZ2V0X3VhcHNkX21hc2soKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgY2FsY3VsYXRlIHRoZQorICogaW5pdGlhbCB2YWx1ZSBvZiB0aGUgVUFQU0QgbWFzayBiYXNlZCB1cG9uIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbgorICoKKyAqIEBwQWRhcHRlciAgOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICogQHBVYXBzZE1hc2s6IFtvdXRdIHBvaW50ZXIgdG8gd2hlcmUgdGhlIFVBUFNEIE1hc2sgaXMgdG8gYmUgc3RvcmVkCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgaGRkX3dtbV9nZXRfdWFwc2RfbWFzayhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgIHVpbnQ4X3QgKnBVYXBzZE1hc2spCit7CisJdWludDhfdCB1YXBzZE1hc2s7CisKKwlpZiAoSEREX1dNTV9VU0VSX01PREVfTk9fUU9TID09CisJICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+V21tTW9kZSkgeworCQkvKiBubyBRT1MgdGhlbiBubyBVQVBTRCAqLworCQl1YXBzZE1hc2sgPSAwOworCX0gZWxzZSB7CisJCS8qIHN0YXJ0IHdpdGggdGhlIGRlZmF1bHQgbWFzayAqLworCQl1YXBzZE1hc2sgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jb25maWctPlVhcHNkTWFzazsKKworCQkvKiBkaXNhYmxlIFVBUFNEIGZvciBhbnkgQUNzIHdpdGggYSAwIFNlcnZpY2UgSW50ZXJ2YWwgKi8KKwkJaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+CisJCSAgICBJbmZyYVVhcHNkVm9TcnZJbnR2ID09IDApIHsKKwkJCXVhcHNkTWFzayAmPSB+SEREX0FDX1ZPOworCQl9CisKKwkJaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+CisJCSAgICBJbmZyYVVhcHNkVmlTcnZJbnR2ID09IDApIHsKKwkJCXVhcHNkTWFzayAmPSB+SEREX0FDX1ZJOworCQl9CisKKwkJaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+CisJCSAgICBJbmZyYVVhcHNkQmtTcnZJbnR2ID09IDApIHsKKwkJCXVhcHNkTWFzayAmPSB+SEREX0FDX0JLOworCQl9CisKKwkJaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNvbmZpZy0+CisJCSAgICBJbmZyYVVhcHNkQmVTcnZJbnR2ID09IDApIHsKKwkJCXVhcHNkTWFzayAmPSB+SEREX0FDX0JFOworCQl9CisJfQorCisJLyogcmV0dXJuIGNhbGN1bGF0ZWQgbWFzayAqLworCSpwVWFwc2RNYXNrID0gdWFwc2RNYXNrOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogaGRkX3dtbV9pc19hY3RpdmUoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIGlmIFdNTSBpcworICogYWN0aXZlIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KKyAqCisgKiBAcEFkYXB0ZXI6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKgorICogUmV0dXJuOiB0cnVlIGlmIFdNTSBpcyBlbmFibGVkLCBmYWxzZSBpZiBXTU0gaXMgbm90IGVuYWJsZWQKKyAqLworYm9vbCBoZGRfd21tX2lzX2FjdGl2ZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwlpZiAoKCFwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbVFvc0Nvbm5lY3Rpb24pIHx8CisJICAgICghcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1RYXApKSB7CisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogaGRkX3dtbV9hZGR0cygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBhZGQgYSB0cmFmZmljIHNwZWMgYXQgdGhlCisgKiByZXF1ZXN0IG9mIGFuIGFwcGxpY2F0aW9uCisgKgorICogQHBBZGFwdGVyICA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgKiBAaGFuZGxlICAgIDogW2luXSAgaGFuZGxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgVFMKKyAqIEBwVHNwZWMgICAgOiBbaW5dICBwb2ludGVyIHRvIHRoZSB0cmFmZmljIHNwZWMKKyAqCisgKiBSZXR1cm46IEhERF9XTEFOX1dNTV9TVEFUVVNfKgorICovCitoZGRfd2xhbl93bW1fc3RhdHVzX2UgaGRkX3dtbV9hZGR0cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCQkgICAgdWludDMyX3QgaGFuZGxlLAorCQkJCSAgICBzbWVfUW9zV21tVHNwZWNJbmZvICpwVHNwZWMpCit7CisJaGRkX3dtbV9xb3NfY29udGV4dF90ICpwUW9zQ29udGV4dDsKKwloZGRfd2xhbl93bW1fc3RhdHVzX2Ugc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9TVUNDRVNTOworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKwlzbWVfUW9zU3RhdHVzVHlwZSBzbWVTdGF0dXM7CisjZW5kaWYKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXM6IEVudGVyZWQgd2l0aCBoYW5kbGUgMHgleCIsIF9fZnVuY19fLCBoYW5kbGUpOworCisJLyogc2VlIGlmIGEgY29udGV4dCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBoYW5kbGUgKi8KKwltdXRleF9sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocFFvc0NvbnRleHQsCisJCQkgICAgJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQ29udGV4dExpc3QsIG5vZGUpIHsKKwkJaWYgKHBRb3NDb250ZXh0LT5oYW5kbGUgPT0gaGFuZGxlKSB7CisJCQlmb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tTG9jayk7CisJaWYgKGZvdW5kKSB7CisJCS8qIHJlY29yZCB3aXRoIHRoYXQgaGFuZGxlIGFscmVhZHkgZXhpc3RzICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFJlY29yZCBhbHJlYWR5IGV4aXN0cyB3aXRoIGhhbmRsZSAweCV4IiwKKwkJCSAgX19mdW5jX18sIGhhbmRsZSk7CisKKwkJLyogQXBwbGljYXRpb24gaXMgdHJ5aW5nIHRvIG1vZGlmeSBzb21lIG9mIHRoZSBUc3BlYworCQkgKiBwYXJhbXMuIEFsbG93IGl0CisJCSAqLworCQlzbWVTdGF0dXMgPSBzbWVfcW9zX21vZGlmeV9yZXEoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorCQkJCQkgICAgICAgcFRzcGVjLCBwUW9zQ29udGV4dC0+cW9zRmxvd0lkKTsKKworCQkvKiBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYW5kIGFjdCBhcHByb3ByaWF0ZWx5ICovCisJCXN3aXRjaCAoc21lU3RhdHVzKSB7CisJCWNhc2UgU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1BFTkRJTkdfUlNQOgorCQkJc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfUEVORElORzsKKwkJCWJyZWFrOworCQljYXNlIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUDoKKwkJCXN0YXR1cyA9CisJCQkJSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfU1VDQ0VTU19OT19BQ01fTk9fVUFQU0Q7CisJCQlicmVhazsKKwkJY2FzZSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZOgorCQkJc3RhdHVzID0KKwkJCQlIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9TVUNDRVNTX05PX0FDTV9VQVBTRF9FWElTVElORzsKKwkJCWJyZWFrOworCQljYXNlIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9JTlZBTElEX1BBUkFNU19SU1A6CisJCQlzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9GQUlMRURfQkFEX1BBUkFNOworCQkJYnJlYWs7CisJCWNhc2UgU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQOgorCQkJc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfRkFJTEVEOworCQkJYnJlYWs7CisJCWNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfTk9UX1FPU19BUF9SU1A6CisJCQlzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9OT19XTU07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIHdlIGRpZG4ndCBnZXQgYmFjayBvbmUgb2YgdGhlCisJCQkgKiBTTUVfUU9TX1NUQVRVU19NT0RJRllfKiBzdGF0dXMgY29kZXMKKwkJCSAqLworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IHVuZXhwZWN0ZWQgU01FIFN0YXR1cz0lZCIsIF9fZnVuY19fLAorCQkJCSAgc21lU3RhdHVzKTsKKwkJCUNERl9BU1NFUlQoMCk7CisJCQlyZXR1cm4gSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfRkFJTEVEOworCQl9CisKKwkJLyogd2Ugd2VyZSBzdWNjZXNzZnVsLCBzYXZlIHRoZSBzdGF0dXMgKi8KKwkJbXV0ZXhfbG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKwkJaWYgKHBRb3NDb250ZXh0LT5tYWdpYyA9PSBIRERfV01NX0NUWF9NQUdJQykKKwkJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gc3RhdHVzOworCQltdXRleF91bmxvY2soJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tTG9jayk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwUW9zQ29udGV4dCA9IGttYWxsb2Moc2l6ZW9mKCpwUW9zQ29udGV4dCksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IHBRb3NDb250ZXh0KSB7CisJCS8qIG5vIG1lbW9yeSBmb3IgUW9TIGNvbnRleHQuICBOb3RoaW5nIHdlIGNhbiBkbyAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgUW9TIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBIRERfV0xBTl9XTU1fU1RBVFVTX0lOVEVSTkFMX0ZBSUxVUkU7CisJfQorCS8qIHdlIGFzc3VtZSB0aGUgdHNwZWMgaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYnkgdGhlIGNhbGxlciAqLworCisJcFFvc0NvbnRleHQtPmhhbmRsZSA9IGhhbmRsZTsKKwlpZiAocFRzcGVjLT50c19pbmZvLnVwIDwgSEREX1dNTV9VUF9UT19BQ19NQVBfU0laRSkKKwkJcFFvc0NvbnRleHQtPmFjVHlwZSA9IGhkZF93bW1fdXBfdG9fYWNfbWFwW3BUc3BlYy0+dHNfaW5mby51cF07CisJZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHRzX2luZm8udXAgKCVkKSBsYXJnZXIgdGhhbiBtYXggdmFsdWUgKCVkKSwgdXNlIGRlZmF1bHQgYWNUeXBlICglZCkiLAorCQkJICBfX2Z1bmNfXywgcFRzcGVjLT50c19pbmZvLnVwLAorCQkJICBIRERfV01NX1VQX1RPX0FDX01BUF9TSVpFIC0gMSwgaGRkX3dtbV91cF90b19hY19tYXBbMF0pOworCQlwUW9zQ29udGV4dC0+YWNUeXBlID0gaGRkX3dtbV91cF90b19hY19tYXBbMF07CisJfQorCXBRb3NDb250ZXh0LT5wQWRhcHRlciA9IHBBZGFwdGVyOworCXBRb3NDb250ZXh0LT5xb3NGbG93SWQgPSAwOworCXBRb3NDb250ZXh0LT5tYWdpYyA9IEhERF9XTU1fQ1RYX01BR0lDOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFNldHRpbmcgdXAgUW9TLCBjb250ZXh0ICVwIiwgX19mdW5jX18sIHBRb3NDb250ZXh0KTsKKworCW11dGV4X2xvY2soJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tTG9jayk7CisJbGlzdF9hZGQoJnBRb3NDb250ZXh0LT5ub2RlLCAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Db250ZXh0TGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCXNtZVN0YXR1cyA9IHNtZV9xb3Nfc2V0dXBfcmVxKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKwkJCQkgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorCQkJCSAgICAgIHBUc3BlYywKKwkJCQkgICAgICBoZGRfd21tX3NtZV9jYWxsYmFjaywKKwkJCQkgICAgICBwUW9zQ29udGV4dCwKKwkJCQkgICAgICBwVHNwZWMtPnRzX2luZm8udXAsCisJCQkJICAgICAgJnBRb3NDb250ZXh0LT5xb3NGbG93SWQpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IHNtZV9xb3Nfc2V0dXBfcmVxIHJldHVybmVkICVkIGZsb3dpZCAlZCIsCisJCSAgX19mdW5jX18sIHNtZVN0YXR1cywgcFFvc0NvbnRleHQtPnFvc0Zsb3dJZCk7CisKKwkvKiBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYW5kIGFjdCBhcHByb3ByaWF0ZWx5ICovCisJc3dpdGNoIChzbWVTdGF0dXMpIHsKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUDoKKwkJc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9QRU5ESU5HOworCQlicmVhazsKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQOgorCQlzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX1VBUFNEOworCQlicmVhazsKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWToKKwkJc3RhdHVzID0KKwkJCUhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfU1VDQ0VTU19OT19BQ01fVUFQU0RfRVhJU1RJTkc7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9QRU5ESU5HOgorCQlzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX1BFTkRJTkc7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfSU5WQUxJRF9QQVJBTVNfUlNQOgorCQloZGRfd21tX2ZyZWVfY29udGV4dChwUW9zQ29udGV4dCk7CisJCXJldHVybiBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9CQURfUEFSQU07CisJY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDoKKwkJLyogd2UgY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHdoZW4gYSByZXF1ZXN0CisJCSAqIGZhaWxzIGJlY2F1c2UgQVAgcmVqZWN0ZWQgaXQgdmVyc3VzIHdoZW4gU01FCisJCSAqIGVuY291bnRlcmQgYW4gaW50ZXJuYWwgZXJyb3IKKwkJICovCisJCWhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKwkJcmV0dXJuIEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEOworCWNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfTk9UX1FPU19BUF9SU1A6CisJCWhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKwkJcmV0dXJuIEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEX05PX1dNTTsKKwlkZWZhdWx0OgorCQkvKiB3ZSBkaWRuJ3QgZ2V0IGJhY2sgb25lIG9mIHRoZQorCQkgKiBTTUVfUU9TX1NUQVRVU19TRVRVUF8qIHN0YXR1cyBjb2RlcworCQkgKi8KKwkJaGRkX3dtbV9mcmVlX2NvbnRleHQocFFvc0NvbnRleHQpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiB1bmV4cGVjdGVkIFNNRSBTdGF0dXM9JWQiLCBfX2Z1bmNfXywgc21lU3RhdHVzKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEOworCX0KKyNlbmRpZgorCisJLyogd2Ugd2VyZSBzdWNjZXNzZnVsLCBzYXZlIHRoZSBzdGF0dXMgKi8KKwltdXRleF9sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworCWlmIChwUW9zQ29udGV4dC0+bWFnaWMgPT0gSEREX1dNTV9DVFhfTUFHSUMpCisJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gc3RhdHVzOworCW11dGV4X3VubG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaGRkX3dtbV9kZWx0cygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBkZWxldGUgYSB0cmFmZmljIHNwZWMgYXQgdGhlCisgKiByZXF1ZXN0IG9mIGFuIGFwcGxpY2F0aW9uCisgKgorICogQHBBZGFwdGVyOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICogQGhhbmRsZTogW2luXSAgaGFuZGxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgVFMKKyAqCisgKiBSZXR1cm46IEhERF9XTEFOX1dNTV9TVEFUVVNfKgorICovCitoZGRfd2xhbl93bW1fc3RhdHVzX2UgaGRkX3dtbV9kZWx0cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdWludDMyX3QgaGFuZGxlKQoreworCWhkZF93bW1fcW9zX2NvbnRleHRfdCAqcFFvc0NvbnRleHQ7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCXNtZV9hY19lbnVtX3R5cGUgYWNUeXBlID0gMDsKKwl1aW50MzJfdCBxb3NGbG93SWQgPSAwOworCWhkZF93bGFuX3dtbV9zdGF0dXNfZSBzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX1NVQ0NFU1M7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCXNtZV9Rb3NTdGF0dXNUeXBlIHNtZVN0YXR1czsKKyNlbmRpZgorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiVzOiBFbnRlcmVkIHdpdGggaGFuZGxlIDB4JXgiLCBfX2Z1bmNfXywgaGFuZGxlKTsKKworCS8qIGxvY2F0ZSB0aGUgY29udGV4dCB3aXRoIHRoZSBnaXZlbiBoYW5kbGUgKi8KKwltdXRleF9sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocFFvc0NvbnRleHQsCisJCQkgICAgJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQ29udGV4dExpc3QsIG5vZGUpIHsKKwkJaWYgKHBRb3NDb250ZXh0LT5oYW5kbGUgPT0gaGFuZGxlKSB7CisJCQlmb3VuZCA9IHRydWU7CisJCQlhY1R5cGUgPSBwUW9zQ29udGV4dC0+YWNUeXBlOworCQkJcW9zRmxvd0lkID0gcFFvc0NvbnRleHQtPnFvc0Zsb3dJZDsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKworCWlmIChmYWxzZSA9PSBmb3VuZCkgeworCQkvKiB3ZSBkaWRuJ3QgZmluZCB0aGUgaGFuZGxlICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJICAiJXM6IGhhbmRsZSAweCV4IG5vdCBmb3VuZCIsIF9fZnVuY19fLCBoYW5kbGUpOworCQlyZXR1cm4gSEREX1dMQU5fV01NX1NUQVRVU19SRUxFQVNFX0ZBSUxFRF9CQURfUEFSQU07CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIiVzOiBmb3VuZCBoYW5kbGUgMHgleCwgZmxvdyAlZCwgQUMgJWQsIGNvbnRleHQgJXAiLAorCQkgIF9fZnVuY19fLCBoYW5kbGUsIHFvc0Zsb3dJZCwgYWNUeXBlLCBwUW9zQ29udGV4dCk7CisKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisJc21lU3RhdHVzID0KKwkJc21lX3Fvc19yZWxlYXNlX3JlcShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIHFvc0Zsb3dJZCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXM6IFNNRSBmbG93ICVkIHJlbGVhc2VkLCBTTUUgc3RhdHVzICVkIiwKKwkJICBfX2Z1bmNfXywgcW9zRmxvd0lkLCBzbWVTdGF0dXMpOworCisJc3dpdGNoIChzbWVTdGF0dXMpIHsKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfU1VDQ0VTU19SU1A6CisJCS8qIHRoaXMgZmxvdyBpcyB0aGUgb25seSBvbmUgb24gdGhhdCBBQywgc28gZ28gYWhlYWQKKwkJICogYW5kIHVwZGF0ZSBvdXIgVFNQRUMgc3RhdGUgZm9yIHRoZSBBQworCQkgKi8KKwkJcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdLndtbUFjVHNwZWNWYWxpZCA9CisJCQlmYWxzZTsKKworCQkvKiBuZWVkIHRvIHRlbGwgVEwgdG8gc3RvcCB0cmlnZ2VyIHRpbWVyLCBldGMgKi8KKwkJaGRkX3dtbV9kaXNhYmxlX3RsX3VhcHNkKHBRb3NDb250ZXh0KTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJLyogZGlzYWJsZSB0aGUgaW5hY3Rpdml0eSB0aW1lciAqLworCQloZGRfd21tX2Rpc2FibGVfaW5hY3Rpdml0eV90aW1lcihwUW9zQ29udGV4dCk7CisjZW5kaWYKKwkJLyogd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGNvbnRleHQgKi8KKwkJaGRkX3dtbV9mcmVlX2NvbnRleHQocFFvc0NvbnRleHQpOworCisJCS8qIFNNRSBtdXN0IG5vdCBmaXJlIGFueSBtb3JlIGNhbGxiYWNrcyBmb3IgdGhpcyBmbG93CisJCSAqIHNpbmNlIHRoZSBjb250ZXh0IGlzIG5vIGxvbmdlciB2YWxpZAorCQkgKi8KKworCQlyZXR1cm4gSEREX1dMQU5fV01NX1NUQVRVU19SRUxFQVNFX1NVQ0NFU1M7CisKKwljYXNlIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUkVRX1BFTkRJTkdfUlNQOgorCQkvKiBkbyBub3RoaW5nIGFzIHdlIHdpbGwgZ2V0IGEgcmVzcG9uc2UgZnJvbSBTTUUgKi8KKwkJc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19SRUxFQVNFX1BFTkRJTkc7CisJCWJyZWFrOworCisJY2FzZSBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0lOVkFMSURfUEFSQU1TX1JTUDoKKwkJLyogbm90aGluZyB3ZSBjYW4gZG8gd2l0aCB0aGUgZXhpc3RpbmcgZmxvdyBleGNlcHQgbGVhdmUgaXQgKi8KKwkJc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19SRUxFQVNFX0ZBSUxFRF9CQURfUEFSQU07CisJCWJyZWFrOworCisJY2FzZSBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQOgorCQkvKiBub3RoaW5nIHdlIGNhbiBkbyB3aXRoIHRoZSBleGlzdGluZyBmbG93IGV4Y2VwdCBsZWF2ZSBpdCAqLworCQlzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1JFTEVBU0VfRkFJTEVEOworCisJZGVmYXVsdDoKKwkJLyogd2UgZGlkbid0IGdldCBiYWNrIG9uZSBvZiB0aGUKKwkJICogU01FX1FPU19TVEFUVVNfUkVMRUFTRV8qIHN0YXR1cyBjb2RlcworCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogdW5leHBlY3RlZCBTTUUgU3RhdHVzPSVkIiwgX19mdW5jX18sIHNtZVN0YXR1cyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9GQUlMRUQ7CisJfQorCisjZW5kaWYKKwltdXRleF9sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworCWlmIChwUW9zQ29udGV4dC0+bWFnaWMgPT0gSEREX1dNTV9DVFhfTUFHSUMpCisJCXBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gc3RhdHVzOworCW11dGV4X3VubG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaGRkX3dtbV9jaGVja3RzKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIHJldHVybiB0aGUgc3RhdHVzIG9mIGEgdHJhZmZpYworICogc3BlYyBhdCB0aGUgcmVxdWVzdCBvZiBhbiBhcHBsaWNhdGlvbgorICoKKyAqIEBwQWRhcHRlcjogW2luXSAgcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAqIEBoYW5kbGU6IFtpbl0gIGhhbmRsZSB0byB1bmlxdWVseSBpZGVudGlmeSBhIFRTCisgKgorICogUmV0dXJuOiBIRERfV0xBTl9XTU1fU1RBVFVTXyoKKyAqLworaGRkX3dsYW5fd21tX3N0YXR1c19lIGhkZF93bW1fY2hlY2t0cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdWludDMyX3QgaGFuZGxlKQoreworCWhkZF93bW1fcW9zX2NvbnRleHRfdCAqcFFvc0NvbnRleHQ7CisJaGRkX3dsYW5fd21tX3N0YXR1c19lIHN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfTE9TVDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICIlczogRW50ZXJlZCB3aXRoIGhhbmRsZSAweCV4IiwgX19mdW5jX18sIGhhbmRsZSk7CisKKwkvKiBsb2NhdGUgdGhlIGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gaGFuZGxlICovCisJbXV0ZXhfbG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBRb3NDb250ZXh0LAorCQkJICAgICZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUNvbnRleHRMaXN0LCBub2RlKSB7CisJCWlmIChwUW9zQ29udGV4dC0+aGFuZGxlID09IGhhbmRsZSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkJICAiJXM6IGZvdW5kIGhhbmRsZSAweCV4LCBjb250ZXh0ICVwIiwKKwkJCQkgIF9fZnVuY19fLCBoYW5kbGUsIHBRb3NDb250ZXh0KTsKKworCQkJc3RhdHVzID0gcFFvc0NvbnRleHQtPmxhc3RTdGF0dXM7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tTG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGRkL3NyYy93bGFuX2hkZF93b3dsLmMgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfd293bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMmZmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hkZC9zcmMvd2xhbl9oZGRfd293bC5jCkBAIC0wLDAgKzEsNjAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIHdsYW5faGRkX3dvd2wuYworICoKKyAqIEBicmllZiB3YWtlIHVwIG9uIFdMQU4gQVBJIGZpbGUKKyAqLworCisvKiBJbmNsdWRlIEZpbGVzICovCisKKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dvd2wuaD4KKworLyogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMgKi8KKyNkZWZpbmUgV09XTF9JTlRFUl9QVFJOX1RPS0VOSVpFUiAgICc7JworI2RlZmluZSBXT1dMX0lOVFJBX1BUUk5fVE9LRU5JWkVSICAgJzonCisKKy8qIFR5cGUgRGVjbGFyYXRpb25zICovCisKK3N0YXRpYyBjaGFyICpnX2hkZF93b3dsX3B0cm5zW1dPV0xfTUFYX1BUUk5TX0FMTE9XRURdOworc3RhdGljIGJvb2wgZ19oZGRfd293bF9wdHJuc19kZWJ1Z2ZzW1dPV0xfTUFYX1BUUk5TX0FMTE9XRURdID0geyAwIH07CisKK3N0YXRpYyB1aW50OF90IGdfaGRkX3dvd2xfcHRybnNfY291bnQ7CisKK3N0YXRpYyBpbmxpbmUgaW50IGZpbmRfcHRybl9sZW4oY29uc3QgY2hhciAqcHRybikKK3sKKwlpbnQgbGVuID0gMDsKKwl3aGlsZSAoKnB0cm4gIT0gJ1wwJyAmJiAqcHRybiAhPSBXT1dMX0lOVEVSX1BUUk5fVE9LRU5JWkVSKSB7CisJCWxlbisrOworCQlwdHJuKys7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIGhkZF93b3dsX2NhbGxiYWNrKHZvaWQgKnBDb250ZXh0LCBDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzKQoreworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSZXR1cm4gY29kZSA9ICglZCkiLCBfX2Z1bmNfXywgY2RmX3JldF9zdGF0dXMpOworfQorCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCitzdGF0aWMgdm9pZCBoZGRfd293bF93YWtlX2luZGljYXRpb25fY2FsbGJhY2sodm9pZCAqcENvbnRleHQsCisJCXRwU2lyV2FrZVJlYXNvbkluZCB3YWtlX3JlYXNvbl9pbmQpCit7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBXYWtlIFJlYXNvbiAlZCIsCisJCSAgX19mdW5jX18sIHdha2VfcmVhc29uX2luZC0+dWxSZWFzb24pOworCWhkZF9leGl0X3dvd2woKGhkZF9hZGFwdGVyX3QgKikgcENvbnRleHQpOworfQorI2VuZGlmCisKKy8qKgorICogZHVtcF9oZGRfd293bF9wdHJuKCkgLSBsb2cgd293IHBhdHRlcm5zCisgKiBAcHRybjogcG9pbnRlciB0byB3b3cgcGF0dGVybgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBkdW1wX2hkZF93b3dsX3B0cm4oc3RydWN0IHdvd19hZGRfcGF0dGVybiAqcHRybikKK3sKKwlpbnQgaTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBQYXRldHJuIElkID0gMHgleCIsIF9fZnVuY19fLCBwdHJuLT5wYXR0ZXJuX2lkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUGF0dGVybiBCeXRlIE9mZnNldCA9IDB4JXgiLCBfX2Z1bmNfXywKKwkJICBwdHJuLT5wYXR0ZXJuX2J5dGVfb2Zmc2V0KTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogcGF0dGVybl9zaXplID0gMHgleCIsIF9fZnVuY19fLCBwdHJuLT5wYXR0ZXJuX3NpemUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBwYXR0ZXJuX21hc2tfc2l6ZSA9IDB4JXgiLCBfX2Z1bmNfXywKKwkJICBwdHJuLT5wYXR0ZXJuX21hc2tfc2l6ZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBQYXR0ZXJuOiAiLAorCQkgIF9fZnVuY19fKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHRybi0+cGF0dGVybl9zaXplOyBpKyspCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIgJTAyWCIsCisJCQkgIHB0cm4tPnBhdHRlcm5baV0pOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogcGF0dGVybl9tYXNrOiAiLAorCQkgIF9fZnVuY19fKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHRybi0+cGF0dGVybl9tYXNrX3NpemU7IGkrKykKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiUwMlgiLAorCQkJICBwdHJuLT5wYXR0ZXJuX21hc2tbaV0pOworfQorCisvKioKKyAqIGhkZF9hZGRfd293bF9wdHJuKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGFkZCB0aGUgV29XTCBwYXR0ZXJuIHRvIGJlCisgKgkJCSB1c2VkIHdoZW4gUEJNIGZpbHRlcmluZyBpcyBlbmFibGVkCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIKKyAqIEBwdHJuOiBwb2ludGVyIHRvIHRoZSBwYXR0ZXJuIHN0cmluZyB0byBiZSBhZGRlZAorICoKKyAqIFJldHVybjogZmFsc2UgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwgdHJ1ZSBvdGhlcndpc2UKKyAqLworYm9vbCBoZGRfYWRkX3dvd2xfcHRybihoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgY29uc3QgY2hhciAqcHRybikKK3sKKwlzdHJ1Y3Qgd293X2FkZF9wYXR0ZXJuIGxvY2FsUGF0dGVybjsKKwlpbnQgaSwgZmlyc3RfZW1wdHlfc2xvdCwgbGVuLCBvZmZzZXQ7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1czsKKwljb25zdCBjaGFyICp0ZW1wOworCXRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKwl1aW50OF90IHNlc3Npb25JZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHBBZGFwdGVyLT5wSGRkQ3R4OworCisJbGVuID0gZmluZF9wdHJuX2xlbihwdHJuKTsKKworCS8qIFRoZXJlIGhhcyB0byBoYXZlIGF0IGxlYXN0IDEgYnl0ZSBmb3IgZWFjaCBmaWVsZCAocGF0dGVybgorCSAqIHNpemUsIG1hc2sgc2l6ZSwgcGF0dGVybiwgbWFzaykgZS5nLiBQUDpRUTpSUjpTUyA9PT4gMTEKKwkgKiBjaGFycworCSAqLworCXdoaWxlIChsZW4gPj0gMTEpIHsKKwkJLyogRGV0ZWN0IGR1cGxpY2F0ZSBwYXR0ZXJuICovCisJCWZvciAoaSA9IDA7IGkgPCBwSGRkQ3R4LT5jb25maWctPm1heFdvV0ZpbHRlcnM7IGkrKykgeworCQkJaWYgKGdfaGRkX3dvd2xfcHRybnNbaV0gPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCFtZW1jbXAocHRybiwgZ19oZGRfd293bF9wdHJuc1tpXSwgbGVuKSkgeworCQkJCS8qIFBhdHRlcm4gQWxyZWFkeSBjb25maWd1cmVkLCBza2lwIHRvCisJCQkJICogbmV4dCBwYXR0ZXJuCisJCQkJICovCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiVHJ5aW5nIHRvIGFkZCBkdXBsaWNhdGUgV29XTCBwYXR0ZXJuLiBTa2lwIGl0ISIpOworCQkJCXB0cm4gKz0gbGVuOworCQkJCWdvdG8gbmV4dF9wdHJuOworCQkJfQorCQl9CisKKwkJZmlyc3RfZW1wdHlfc2xvdCA9IC0xOworCisJCS8qIEZpbmQgYW4gZW1wdHkgc2xvdCB0byBzdG9yZSB0aGUgcGF0dGVybiAqLworCQlmb3IgKGkgPSAwOyBpIDwgcEhkZEN0eC0+Y29uZmlnLT5tYXhXb1dGaWx0ZXJzOyBpKyspIHsKKwkJCWlmIChnX2hkZF93b3dsX3B0cm5zW2ldID09IE5VTEwpIHsKKwkJCQlmaXJzdF9lbXB0eV9zbG90ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIE1heGltdW0gbnVtYmVyIG9mIHBhdHRlcm5zIGhhdmUgYmVlbiBjb25maWd1cmVkIGFscmVhZHkgKi8KKwkJaWYgKGZpcnN0X2VtcHR5X3Nsb3QgPT0gLTEpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBDYW5ub3QgYWRkIGFueW1vcmUgcGF0dGVybnMuIE5vIGZyZWUgc2xvdCEiLAorCQkJCSAgX19mdW5jX18pOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCS8qIFZhbGlkYXRlIHRoZSBwYXR0ZXJuICovCisJCWlmIChwdHJuWzJdICE9IFdPV0xfSU5UUkFfUFRSTl9UT0tFTklaRVIgfHwKKwkJICAgIHB0cm5bNV0gIT0gV09XTF9JTlRSQV9QVFJOX1RPS0VOSVpFUikgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IE1hbGZvcm1lZCBwYXR0ZXJuIHN0cmluZy4gU2tpcCEiLAorCQkJCSAgX19mdW5jX18pOworCQkJcHRybiArPSBsZW47CisJCQlnb3RvIG5leHRfcHRybjsKKwkJfQorCQkvKiBFeHRyYWN0IHRoZSBwYXR0ZXJuIHNpemUgKi8KKwkJbG9jYWxQYXR0ZXJuLnBhdHRlcm5fc2l6ZSA9CisJCQkoaGV4X3RvX2JpbihwdHJuWzBdKSAqIDB4MTApICsKKwkJCQkJCWhleF90b19iaW4ocHRyblsxXSk7CisKKwkJLyogRXh0cmFjdCB0aGUgcGF0dGVybiBtYXNrIHNpemUgKi8KKwkJbG9jYWxQYXR0ZXJuLnBhdHRlcm5fbWFza19zaXplID0KKwkJCShoZXhfdG9fYmluKHB0cm5bM10pICogMHgxMCkgKworCQkJCQkJaGV4X3RvX2JpbihwdHJuWzRdKTsKKworCQlpZiAobG9jYWxQYXR0ZXJuLnBhdHRlcm5fc2l6ZSA+IFNJUl9XT1dMX0JDQVNUX1BBVFRFUk5fTUFYX1NJWkUKKwkJICAgIHx8IGxvY2FsUGF0dGVybi5wYXR0ZXJuX21hc2tfc2l6ZSA+CisJCSAgICBXT1dMX1BUUk5fTUFTS19NQVhfU0laRSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEludmFsaWQgbGVuZ3RoIHNwZWNpZmllZC4gU2tpcCEiLAorCQkJCSAgX19mdW5jX18pOworCQkJcHRybiArPSBsZW47CisJCQlnb3RvIG5leHRfcHRybjsKKwkJfQorCQkvKiBjb21wdXRlIHRoZSBvZmZzZXQgb2YgdG9rZW5pemVyIGFmdGVyIHRoZSBwYXR0ZXJuICovCisJCW9mZnNldCA9IDUgKyAyICogbG9jYWxQYXR0ZXJuLnBhdHRlcm5fc2l6ZSArIDE7CisJCWlmICgob2Zmc2V0ID49IGxlbikgfHwKKwkJICAgIChwdHJuW29mZnNldF0gIT0gV09XTF9JTlRSQV9QVFJOX1RPS0VOSVpFUikpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBNYWxmb3JtZWQgcGF0dGVybiBzdHJpbmcuLnNraXAhIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXB0cm4gKz0gbGVuOworCQkJZ290byBuZXh0X3B0cm47CisJCX0KKwkJLyogY29tcHV0ZSB0aGUgZW5kIG9mIHBhdHRlcm4gc3JpbmcgKi8KKwkJb2Zmc2V0ID0gb2Zmc2V0ICsgMiAqIGxvY2FsUGF0dGVybi5wYXR0ZXJuX21hc2tfc2l6ZTsKKwkJaWYgKG9mZnNldCArIDEgIT0gbGVuKSB7CisJCQkvKiBvZmZzZXQgYmVnaW5zIHdpdGggMCAqLworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IE1hbGZvcm1lZCBwYXR0ZXJuIHN0cmluZy4uLnNraXAhIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXB0cm4gKz0gbGVuOworCQkJZ290byBuZXh0X3B0cm47CisJCX0KKworCQl0ZW1wID0gcHRybjsKKworCQkvKiBOb3cgYWR2YW5jZSB0byB3aGVyZSBwYXR0ZXJuIGJlZ2lucyAqLworCQlwdHJuICs9IDY7CisKKwkJLyogRXh0cmFjdCB0aGUgcGF0dGVybiAqLworCQlmb3IgKGkgPSAwOyBpIDwgbG9jYWxQYXR0ZXJuLnBhdHRlcm5fc2l6ZTsgaSsrKSB7CisJCQlsb2NhbFBhdHRlcm4ucGF0dGVybltpXSA9CisJCQkJKGhleF90b19iaW4ocHRyblswXSkgKiAweDEwKSArCisJCQkJaGV4X3RvX2JpbihwdHJuWzFdKTsKKwkJCXB0cm4gKz0gMjsgICAgICAvKiBza2lwIHRvIG5leHQgYnl0ZSAqLworCQl9CisKKwkJLyogU2tpcCBvdmVyIHRoZSAnOicgc2VwZXJhdG9yIGFmdGVyIHRoZSBwYXR0ZXJuICovCisJCXB0cm4rKzsKKworCQkvKiBFeHRyYWN0IHRoZSBwYXR0ZXJuIE1hc2sgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxvY2FsUGF0dGVybi5wYXR0ZXJuX21hc2tfc2l6ZTsgaSsrKSB7CisJCQlsb2NhbFBhdHRlcm4ucGF0dGVybl9tYXNrW2ldID0KKwkJCQkoaGV4X3RvX2JpbihwdHJuWzBdKSAqIDB4MTApICsKKwkJCQloZXhfdG9fYmluKHB0cm5bMV0pOworCQkJcHRybiArPSAyOyAgICAgIC8qIHNraXAgdG8gbmV4dCBieXRlICovCisJCX0KKworCQkvKiBBbGwgaXMgZ29vZC4gU3RvcmUgdGhlIHBhdHRlcm4gbG9jYWxseSAqLworCQlnX2hkZF93b3dsX3B0cm5zW2ZpcnN0X2VtcHR5X3Nsb3RdID0KKwkJCWttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmIChnX2hkZF93b3dsX3B0cm5zW2ZpcnN0X2VtcHR5X3Nsb3RdID09IE5VTEwpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBrbWFsbG9jIGZhaWx1cmUiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQltZW1jcHkoZ19oZGRfd293bF9wdHJuc1tmaXJzdF9lbXB0eV9zbG90XSwgdGVtcCwgbGVuKTsKKwkJZ19oZGRfd293bF9wdHJuc1tmaXJzdF9lbXB0eV9zbG90XVtsZW5dID0gJ1wwJzsKKwkJbG9jYWxQYXR0ZXJuLnBhdHRlcm5faWQgPSBmaXJzdF9lbXB0eV9zbG90OworCQlsb2NhbFBhdHRlcm4ucGF0dGVybl9ieXRlX29mZnNldCA9IDA7CisJCWxvY2FsUGF0dGVybi5zZXNzaW9uX2lkID0gc2Vzc2lvbklkOworCisJCS8qIFJlZ2lzdGVyIHRoZSBwYXR0ZXJuIGRvd25zdHJlYW0gKi8KKwkJY2RmX3JldF9zdGF0dXMgPQorCQkJc21lX3dvd19hZGRfcGF0dGVybihoSGFsLCAmbG9jYWxQYXR0ZXJuLAorCQkJCQkJICAgc2Vzc2lvbklkKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3JldF9zdGF0dXMpKSB7CisJCQkvKiBBZGQgZmFpbGVkLCBzbyBpbnZhbGlkYXRlIHRoZSBsb2NhbCBzdG9yYWdlICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJzbWVfd293bF9hZGRfYmNhc3RfcGF0dGVybiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICglZCkiLAorCQkJCSAgY2RmX3JldF9zdGF0dXMpOworCQkJa2ZyZWUoZ19oZGRfd293bF9wdHJuc1tmaXJzdF9lbXB0eV9zbG90XSk7CisJCQlnX2hkZF93b3dsX3B0cm5zW2ZpcnN0X2VtcHR5X3Nsb3RdID0gTlVMTDsKKwkJfQorCisJCWR1bXBfaGRkX3dvd2xfcHRybigmbG9jYWxQYXR0ZXJuKTsKKworbmV4dF9wdHJuOgorCQlpZiAoKnB0cm4gPT0gV09XTF9JTlRFUl9QVFJOX1RPS0VOSVpFUikgeworCQkJLyogbW92ZSBwYXN0IHRoZSB0b2tlbml6ZXIgKi8KKwkJCXB0cm4gKz0gMTsKKwkJCWxlbiA9IGZpbmRfcHRybl9sZW4ocHRybik7CisJCQljb250aW51ZTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBoZGRfZGVsX3dvd2xfcHRybigpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCByZW1vdmUgYSBXb1dMIHBhdHRlcm4KKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byB0aGUgYWRhcHRlcgorICogQHB0cm46IHBvaW50ZXIgdG8gdGhlIHBhdHRlcm4gc3RyaW5nIHRvIGJlIHJlbW92ZWQKKyAqCisgKiBSZXR1cm46IGZhbHNlIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQsIHRydWUgb3RoZXJ3aXNlCisgKi8KK2Jvb2wgaGRkX2RlbF93b3dsX3B0cm4oaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IGNoYXIgKnB0cm4pCit7CisJc3RydWN0IHdvd19kZWxldGVfcGF0dGVybiBkZWxQYXR0ZXJuOworCXVuc2lnbmVkIGNoYXIgaWQ7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCWJvb2wgcGF0dGVybkZvdW5kID0gZmFsc2U7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1czsKKwl1aW50OF90IHNlc3Npb25JZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHBBZGFwdGVyLT5wSGRkQ3R4OworCisJLyogRGV0ZWN0IHBhdHRlcm4gKi8KKwlmb3IgKGlkID0gMDsKKwkgICAgIGlkIDwgcEhkZEN0eC0+Y29uZmlnLT5tYXhXb1dGaWx0ZXJzCisJICAgICAmJiBnX2hkZF93b3dsX3B0cm5zW2lkXSAhPSBOVUxMOyBpZCsrKSB7CisJCWlmICghc3RyY21wKHB0cm4sIGdfaGRkX3dvd2xfcHRybnNbaWRdKSkgeworCQkJcGF0dGVybkZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogSWYgcGF0dGVybiBwcmVzZW50LCByZW1vdmUgaXQgZnJvbSBkb3duc3RyZWFtICovCisJaWYgKHBhdHRlcm5Gb3VuZCkgeworCQlkZWxQYXR0ZXJuLnBhdHRlcm5faWQgPSBpZDsKKwkJZGVsUGF0dGVybi5zZXNzaW9uX2lkID0gc2Vzc2lvbklkOworCQljZGZfcmV0X3N0YXR1cyA9CisJCQlzbWVfd293X2RlbGV0ZV9wYXR0ZXJuKGhIYWwsICZkZWxQYXR0ZXJuLAorCQkJCQkJICAgc2Vzc2lvbklkKTsKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfcmV0X3N0YXR1cykpIHsKKwkJCS8qIFJlbW92ZSBmcm9tIGxvY2FsIHN0b3JhZ2UgYXMgd2VsbCAqLworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiRGVsZXRlZCBwYXR0ZXJuIHdpdGggaWQgJWQgWyVzXSIsIGlkLAorCQkJCSAgZ19oZGRfd293bF9wdHJuc1tpZF0pOworCisJCQlrZnJlZShnX2hkZF93b3dsX3B0cm5zW2lkXSk7CisJCQlnX2hkZF93b3dsX3B0cm5zW2lkXSA9IE5VTEw7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogaGRkX2FkZF93b3dsX3B0cm5fZGVidWdmcygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBhZGQgYSBXb1cgcGF0dGVybgorICoJCQkJIHNlbnQgZnJvbSBkZWJ1Z2ZzIGludGVyZmFjZQorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKiBAcGF0dGVybl9pZHg6IGluZGV4IG9mIHRoZSBwYXR0ZXJuIHRvIGJlIGFkZGVkCisgKiBAcGF0dGVybl9vZmZzZXQ6IG9mZnNldCBvZiB0aGUgcGF0dGVybiBpbiB0aGUgZnJhbWUgcGF5bG9hZAorICogQHBhdHRlcm5fYnVmOiBwb2ludGVyIHRvIHRoZSBwYXR0ZXJuIGhleCBzdHJpbmcgdG8gYmUgYWRkZWQKKyAqIEBwYXR0ZXJuX21hc2s6IHBvaW50ZXIgdG8gdGhlIHBhdHRlcm4gbWFzayBoZXggc3RyaW5nCisgKgorICogUmV0dXJuOiBmYWxzZSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCB0cnVlIG90aGVyd2lzZQorICovCitib29sIGhkZF9hZGRfd293bF9wdHJuX2RlYnVnZnMoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVpbnQ4X3QgcGF0dGVybl9pZHgsCisJCQkgICAgICAgdWludDhfdCBwYXR0ZXJuX29mZnNldCwgY2hhciAqcGF0dGVybl9idWYsCisJCQkgICAgICAgY2hhciAqcGF0dGVybl9tYXNrKQoreworCXN0cnVjdCB3b3dfYWRkX3BhdHRlcm4gbG9jYWxQYXR0ZXJuOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXM7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCXVpbnQ4X3Qgc2Vzc2lvbl9pZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisJdWludDE2X3QgcGF0dGVybl9sZW4sIG1hc2tfbGVuLCBpOworCisJaWYgKHBhdHRlcm5faWR4ID4gKFdPV0xfTUFYX1BUUk5TX0FMTE9XRUQgLSAxKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBXb1cgcGF0dGVybiBpbmRleCAlZCBpcyBvdXQgb2YgcmFuZ2UgKDAgfiAlZCkuIiwKKwkJCSAgX19mdW5jX18sIHBhdHRlcm5faWR4LCBXT1dMX01BWF9QVFJOU19BTExPV0VEIC0gMSk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXBhdHRlcm5fbGVuID0gc3RybGVuKHBhdHRlcm5fYnVmKTsKKworCS8qIFNpbmNlIHRoZSBwYXR0ZXJuIGlzIGEgaGV4IHN0cmluZywgMiBjaGFyYWN0ZXJzIHJlcHJlc2VudCAxIGJ5dGUuICovCisJaWYgKHBhdHRlcm5fbGVuICUgMikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBNYWxmb3JtZWQgV29XIHBhdHRlcm4hIiwgX19mdW5jX18pOworCisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UKKwkJcGF0dGVybl9sZW4gPj49IDE7CisKKwlpZiAoIXBhdHRlcm5fbGVuIHx8IHBhdHRlcm5fbGVuID4gV09XTF9QVFJOX01BWF9TSVpFKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFdvVyBwYXR0ZXJuIGxlbmd0aCAlZCBpcyBvdXQgb2YgcmFuZ2UgKDEgfiAlZCkuIiwKKwkJCSAgX19mdW5jX18sIHBhdHRlcm5fbGVuLCBXT1dMX1BUUk5fTUFYX1NJWkUpOworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlsb2NhbFBhdHRlcm4ucGF0dGVybl9pZCA9IHBhdHRlcm5faWR4OworCWxvY2FsUGF0dGVybi5wYXR0ZXJuX2J5dGVfb2Zmc2V0ID0gcGF0dGVybl9vZmZzZXQ7CisJbG9jYWxQYXR0ZXJuLnBhdHRlcm5fc2l6ZSA9IHBhdHRlcm5fbGVuOworCWxvY2FsUGF0dGVybi5zZXNzaW9uX2lkID0gc2Vzc2lvbl9pZDsKKworCWlmIChsb2NhbFBhdHRlcm4ucGF0dGVybl9zaXplID4gU0lSX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBXb1cgcGF0dGVybiBzaXplICglZCkgZ3JlYXRlciB0aGFuIG1heCAoJWQpIiwKKwkJCSAgX19mdW5jX18sIGxvY2FsUGF0dGVybi5wYXR0ZXJuX3NpemUsCisJCQkgIFNJUl9XT1dMX0JDQVNUX1BBVFRFUk5fTUFYX1NJWkUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qIEV4dHJhY3QgdGhlIHBhdHRlcm4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbG9jYWxQYXR0ZXJuLnBhdHRlcm5fc2l6ZTsgaSsrKSB7CisJCWxvY2FsUGF0dGVybi5wYXR0ZXJuW2ldID0KKwkJCShoZXhfdG9fYmluKHBhdHRlcm5fYnVmWzBdKSA8PCA0KSArCisJCQloZXhfdG9fYmluKHBhdHRlcm5fYnVmWzFdKTsKKworCQkvKiBTa2lwIHRvIG5leHQgYnl0ZSAqLworCQlwYXR0ZXJuX2J1ZiArPSAyOworCX0KKworCS8qIEdldCBwYXR0ZXJuIG1hc2sgc2l6ZSBieSBwYXR0ZXJuIGxlbmd0aCAqLworCWxvY2FsUGF0dGVybi5wYXR0ZXJuX21hc2tfc2l6ZSA9IHBhdHRlcm5fbGVuID4+IDM7CisJaWYgKHBhdHRlcm5fbGVuICUgOCkKKwkJbG9jYWxQYXR0ZXJuLnBhdHRlcm5fbWFza19zaXplICs9IDE7CisKKwltYXNrX2xlbiA9IHN0cmxlbihwYXR0ZXJuX21hc2spOworCWlmICgobWFza19sZW4gJSAyKQorCSAgICB8fCAobG9jYWxQYXR0ZXJuLnBhdHRlcm5fbWFza19zaXplICE9IChtYXNrX2xlbiA+PiAxKSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTWFsZm9ybWVkIFdvVyBwYXR0ZXJuIG1hc2shIiwgX19mdW5jX18pOworCisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGxvY2FsUGF0dGVybi5wYXR0ZXJuX21hc2tfc2l6ZSA+IFdPV0xfUFRSTl9NQVNLX01BWF9TSVpFKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFdvVyBwYXR0ZXJuIG1hc2sgc2l6ZSAoJWQpIGdyZWF0ZXIgdGhhbiBtYXggKCVkKSIsCisJCQkgIF9fZnVuY19fLCBsb2NhbFBhdHRlcm4ucGF0dGVybl9tYXNrX3NpemUsCisJCQkgIFdPV0xfUFRSTl9NQVNLX01BWF9TSVpFKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKiBFeHRyYWN0IHRoZSBwYXR0ZXJuIG1hc2sgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbG9jYWxQYXR0ZXJuLnBhdHRlcm5fbWFza19zaXplOyBpKyspIHsKKwkJbG9jYWxQYXR0ZXJuLnBhdHRlcm5fbWFza1tpXSA9CisJCQkoaGV4X3RvX2JpbihwYXR0ZXJuX21hc2tbMF0pIDw8IDQpICsKKwkJCWhleF90b19iaW4ocGF0dGVybl9tYXNrWzFdKTsKKworCQkvKiBTa2lwIHRvIG5leHQgYnl0ZSAqLworCQlwYXR0ZXJuX21hc2sgKz0gMjsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgcGF0dGVybiBkb3duc3RyZWFtICovCisJY2RmX3JldF9zdGF0dXMgPQorCQlzbWVfd293X2FkZF9wYXR0ZXJuKGhIYWwsICZsb2NhbFBhdHRlcm4sIHNlc3Npb25faWQpOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3JldF9zdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHNtZV93b3dsX2FkZF9iY2FzdF9wYXR0ZXJuIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgKCVkKS4iLAorCQkJICBfX2Z1bmNfXywgY2RmX3JldF9zdGF0dXMpOworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBBbGwgaXMgZ29vZC4gKi8KKwlpZiAoIWdfaGRkX3dvd2xfcHRybnNfZGVidWdmc1twYXR0ZXJuX2lkeF0pIHsKKwkJZ19oZGRfd293bF9wdHJuc19kZWJ1Z2ZzW3BhdHRlcm5faWR4XSA9IDE7CisJCWdfaGRkX3dvd2xfcHRybnNfY291bnQrKzsKKwl9CisKKwlkdW1wX2hkZF93b3dsX3B0cm4oJmxvY2FsUGF0dGVybik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBoZGRfZGVsX3dvd2xfcHRybl9kZWJ1Z2ZzKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIHJlbW92ZSBhIFdvVyBwYXR0ZXJuCisgKgkJCQkgc2VudCBmcm9tIGRlYnVnZnMgaW50ZXJmYWNlCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIKKyAqIEBwYXR0ZXJuX2lkeDogaW5kZXggb2YgdGhlIHBhdHRlcm4gdG8gYmUgcmVtb3ZlZAorICoKKyAqIFJldHVybjogZmFsc2UgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwgdHJ1ZSBvdGhlcndpc2UKKyAqLworYm9vbCBoZGRfZGVsX3dvd2xfcHRybl9kZWJ1Z2ZzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1aW50OF90IHBhdHRlcm5faWR4KQoreworCXN0cnVjdCB3b3dfZGVsZXRlX3BhdHRlcm4gZGVsUGF0dGVybjsKKwl0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1czsKKwl1aW50OF90IHNlc3Npb25JZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisKKwlpZiAocGF0dGVybl9pZHggPiAoV09XTF9NQVhfUFRSTlNfQUxMT1dFRCAtIDEpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFdvVyBwYXR0ZXJuIGluZGV4ICVkIGlzIG5vdCBpbiB0aGUgcmFuZ2UgKDAgfiAlZCkuIiwKKwkJCSAgX19mdW5jX18sIHBhdHRlcm5faWR4LCBXT1dMX01BWF9QVFJOU19BTExPV0VEIC0gMSk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghZ19oZGRfd293bF9wdHJuc19kZWJ1Z2ZzW3BhdHRlcm5faWR4XSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBXb1cgcGF0dGVybiAlZCBpcyBub3QgaW4gdGhlIHRhYmxlLiIsCisJCQkgIF9fZnVuY19fLCBwYXR0ZXJuX2lkeCk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWRlbFBhdHRlcm4ucGF0dGVybl9pZCA9IHBhdHRlcm5faWR4OworCWRlbFBhdHRlcm4uc2Vzc2lvbl9pZCA9IHNlc3Npb25JZDsKKwljZGZfcmV0X3N0YXR1cyA9IHNtZV93b3dfZGVsZXRlX3BhdHRlcm4oaEhhbCwgJmRlbFBhdHRlcm4sCisJCQkJCQkgICAgc2Vzc2lvbklkKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9yZXRfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBzbWVfd293bF9kZWxfYmNhc3RfcGF0dGVybiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICglZCkuIiwKKwkJCSAgX19mdW5jX18sIGNkZl9yZXRfc3RhdHVzKTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZ19oZGRfd293bF9wdHJuc19kZWJ1Z2ZzW3BhdHRlcm5faWR4XSA9IDA7CisJZ19oZGRfd293bF9wdHJuc19jb3VudC0tOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogaGRkX2VudGVyX3dvd2woKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZW5hYmxlIFdvV0wuIEF0IGxlYXN0IG9uZQorICoJCSAgICAgIG9mIE1QIGFuZCBQQk0gbXVzdCBiZSBlbmFibGVkCisgKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIKKyAqIEBlbmFibGVfbXA6IFdoZXRoZXIgdG8gZW5hYmxlIG1hZ2ljIHBhY2tldCBXb1dMIG1vZGUKKyAqIEBlbmFibGVfcGJtOiBXaGV0aGVyIHRvIGVuYWJsZSBwYXR0ZXJuIGJ5dGUgbWF0Y2hpbmcgV29XTCBtb2RlCisgKgorICogUmV0dXJuOiBmYWxzZSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCB0cnVlIG90aGVyd2lzZQorICovCitib29sIGhkZF9lbnRlcl93b3dsKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBib29sIGVuYWJsZV9tcCwgYm9vbCBlbmFibGVfcGJtKQoreworCXRTaXJTbWVXb3dsRW50ZXJQYXJhbXMgd293UGFyYW1zOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXM7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCisJY2RmX21lbV96ZXJvKCZ3b3dQYXJhbXMsIHNpemVvZih0U2lyU21lV293bEVudGVyUGFyYW1zKSk7CisKKwl3b3dQYXJhbXMudWNQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlID0gZW5hYmxlX3BibTsKKwl3b3dQYXJhbXMudWNNYWdpY1BrdEVuYWJsZSA9IGVuYWJsZV9tcDsKKwl3b3dQYXJhbXMuc2Vzc2lvbklkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsKKwlpZiAoZW5hYmxlX21wKSB7CisJCWNkZl9jb3B5X21hY2FkZHIoKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgJih3b3dQYXJhbXMubWFnaWNQdHJuKSwKKwkJCQkgJihwQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQpKTsKKwl9CisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisJd293UGFyYW1zLnVjV29XRUFQSURSZXF1ZXN0RW5hYmxlID0gdHJ1ZTsKKwl3b3dQYXJhbXMudWNXb1dFQVBPTDRXYXlFbmFibGUgPSB0cnVlOworCXdvd1BhcmFtcy51Y1dvd05ldFNjYW5PZmZsb2FkTWF0Y2ggPSB0cnVlOworCXdvd1BhcmFtcy51Y1dvd0dUS1Jla2V5RXJyb3IgPSB0cnVlOworCXdvd1BhcmFtcy51Y1dvV0JTU0Nvbm5Mb3NzID0gdHJ1ZTsKKyNlbmRpZiAvKiBXTEFOX1dBS0VVUF9FVkVOVFMgKi8KKworCS8qIFJlcXVlc3QgdG8gcHV0IExpYnJhIGludG8gV29XTCAqLworCWNkZl9yZXRfc3RhdHVzID0gc21lX2VudGVyX3dvd2woaEhhbCwgaGRkX3dvd2xfY2FsbGJhY2ssIHBBZGFwdGVyLAorI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUworCQkJCQloZGRfd293bF93YWtlX2luZGljYXRpb25fY2FsbGJhY2ssCisJCQkJCXBBZGFwdGVyLAorI2VuZGlmIC8qIFdMQU5fV0FLRVVQX0VWRU5UUyAqLworCQkJCQkmd293UGFyYW1zLCBwQWRhcHRlci0+c2Vzc2lvbklkKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9yZXRfc3RhdHVzKSkgeworCQlpZiAoQ0RGX1NUQVRVU19QTUNfUEVORElORyAhPSBjZGZfcmV0X3N0YXR1cykgeworCQkJLyogV2UgZmFpbGVkIHRvIGVudGVyIFdvV0wgKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgInNtZV9lbnRlcl93b3dsIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgKCVkKSIsCisJCQkJICBjZGZfcmV0X3N0YXR1cyk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogaGRkX2V4aXRfd293bCgpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBkaXNhYmxlIFdvV0wKKyAqIEBwQWRhcHRlcjogcG9pbnRlciB0byB0aGUgYWRhcHRlcgorICoKKyAqIFJldHVybjogZmFsc2UgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwgdHJ1ZSBvdGhlcndpc2UKKyAqLworYm9vbCBoZGRfZXhpdF93b3dsKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCXRTaXJTbWVXb3dsRXhpdFBhcmFtcyB3b3dQYXJhbXM7CisJdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXM7CisKKwl3b3dQYXJhbXMuc2Vzc2lvbklkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsKKworCWNkZl9yZXRfc3RhdHVzID0gc21lX2V4aXRfd293bChoSGFsLCAmd293UGFyYW1zKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfcmV0X3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJzbWVfZXhpdF93b3dsIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgKCVkKSIsCisJCQkgIGNkZl9yZXRfc3RhdHVzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGhkZF9pbml0X3dvd2woKSAtIEluaXQgZnVuY3Rpb24gd2hpY2ggd2lsbCBpbml0aWFsaXplIHRoZSBXb1dMIG1vZHVsZQorICoJCSAgICAgYW5kIHBlcmZvcm0gYW55IHJlcXVpcmVkIGluaXRpYWwgY29uZmlndXJhdGlvbgorICogQHBBZGFwdGVyOiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKgorICogUmV0dXJuOiBmYWxzZSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCB0cnVlIG90aGVyd2lzZQorICovCitib29sIGhkZF9pbml0X3dvd2woaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IE5VTEw7CisJcEhkZEN0eCA9IHBBZGFwdGVyLT5wSGRkQ3R4OworCisJbWVtc2V0KGdfaGRkX3dvd2xfcHRybnMsIDAsIHNpemVvZihnX2hkZF93b3dsX3B0cm5zKSk7CisJZ19oZGRfd293bF9wdHJuc19jb3VudCA9IDA7CisKKwkvKiBBZGQgYW55IHN0YXRpY2FsbHkgY29uZmlndXJlZCBwYXR0ZXJucyAqLworCWhkZF9hZGRfd293bF9wdHJuKHBBZGFwdGVyLCBwSGRkQ3R4LT5jb25maWctPndvd2xQYXR0ZXJuKTsKKworCXJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvY29yZS9oaWYvaW5jL2hpZi5oIGIvY29yZS9oaWYvaW5jL2hpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWE0MTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oaWYvaW5jL2hpZi5oCkBAIC0wLDAgKzEsNjUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9ISUZfSF8KKyNkZWZpbmUgX0hJRl9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qIEhlYWRlciBmaWxlcyAqLworI2luY2x1ZGUgImF0aGRlZnMuaCIKKyNpbmNsdWRlICJhX3R5cGVzLmgiCisjaW5jbHVkZSAib3NhcGlfbGludXguaCIKKyNpbmNsdWRlICJjZGZfc3RhdHVzLmgiCisjaW5jbHVkZSAiY2RmX25idWYuaCIKKyNpbmNsdWRlICJvbF9pZl9hdGh2YXIuaCIKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpZmRlZiBISUZfUENJCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjZW5kaWYgLyogSElGX1BDSSAqLworCisjZGVmaW5lIEVOQUJMRV9NQk9YX0RVTU1ZX1NQQUNFX0ZFQVRVUkUgMQorCit0eXBlZGVmIHN0cnVjdCBodGNfY2FsbGJhY2tzIEhUQ19DQUxMQkFDS1M7Cit0eXBlZGVmIHZvaWQgX19pb21lbSAqQV90YXJnZXRfaWRfdDsKKworI2RlZmluZSBISUZfVFlQRV9BUjYwMDIgICAyCisjZGVmaW5lIEhJRl9UWVBFX0FSNjAwMyAgIDMKKyNkZWZpbmUgSElGX1RZUEVfQVI2MDA0ICAgNQorI2RlZmluZSBISUZfVFlQRV9BUjk4ODggICA2CisjZGVmaW5lIEhJRl9UWVBFX0FSNjMyMCAgIDcKKyNkZWZpbmUgSElGX1RZUEVfQVI2MzIwVjIgOAorLyogRm9yIGF0dGFjaGluZyBQZXJlZ3JpbmUgMi4wIGJvYXJkIGhvc3RfcmVnX3RibCBvbmx5ICovCisjZGVmaW5lIEhJRl9UWVBFX0FSOTg4OFYyIDgKKyNkZWZpbmUgSElGX1RZUEVfUUNBNjE4MCAgOQorI2RlZmluZSBISUZfVFlQRV9BRFJBU1RFQSAxMAorCisjZGVmaW5lIFRBUkdFVF9UWVBFX1VOS05PV04gICAwCisjZGVmaW5lIFRBUkdFVF9UWVBFX0FSNjAwMSAgICAxCisjZGVmaW5lIFRBUkdFVF9UWVBFX0FSNjAwMiAgICAyCisjZGVmaW5lIFRBUkdFVF9UWVBFX0FSNjAwMyAgICAzCisjZGVmaW5lIFRBUkdFVF9UWVBFX0FSNjAwNCAgICA1CisjZGVmaW5lIFRBUkdFVF9UWVBFX0FSNjAwNiAgICA2CisjZGVmaW5lIFRBUkdFVF9UWVBFX0FSOTg4OCAgICA3CisjZGVmaW5lIFRBUkdFVF9UWVBFX0FSNjMyMCAgICA4CisjZGVmaW5lIFRBUkdFVF9UWVBFX0FSOTAwQiAgICA5CisvKiBGb3IgYXR0YWNoIFBlcmVncmluZSAyLjAgYm9hcmQgdGFyZ2V0X3JlZ190Ymwgb25seSAqLworI2RlZmluZSBUQVJHRVRfVFlQRV9BUjk4ODhWMiAgMTAKKy8qIEZvciBhdHRhY2ggUm9tZTEuMCB0YXJnZXRfcmVnX3RibCBvbmx5Ki8KKyNkZWZpbmUgVEFSR0VUX1RZUEVfQVI2MzIwVjEgICAgMTEKKy8qIEZvciBSb21lMi4wLzIuMSB0YXJnZXRfcmVnX3RibCBJRCovCisjZGVmaW5lIFRBUkdFVF9UWVBFX0FSNjMyMFYyICAgIDEyCisvKiBGb3IgUm9tZTMuMCB0YXJnZXRfcmVnX3RibCBJRCovCisjZGVmaW5lIFRBUkdFVF9UWVBFX0FSNjMyMFYzICAgIDEzCisvKiBGb3IgVHVmZWxsbzEuMCB0YXJnZXRfcmVnX3RibCBJRCovCisjZGVmaW5lIFRBUkdFVF9UWVBFX1FDQTkzNzdWMSAgIDE0CisvKiBGb3IgUUNBNjE4MCB0YXJnZXQgKi8KKyNkZWZpbmUgVEFSR0VUX1RZUEVfUUNBNjE4MCAgICAgMTUKKy8qIEZvciBBZHJhc3RlYSB0YXJnZXQgKi8KKyNkZWZpbmUgVEFSR0VUX1RZUEVfQURSQVNURUEgICAgIDE2CisKK3N0cnVjdCBDRV9zdGF0ZTsKKyNkZWZpbmUgQ0VfQ09VTlRfTUFYIDgKKworLyogVGhlc2UgbnVtYmVycyBhcmUgc2VsZWN0ZWQgc28gdGhhdCB0aGUgcHJvZHVjdCBpcyBjbG9zZSB0byBjdXJyZW50CisgICBoaWdoZXIgbGltaXQgb2YgcGFja2V0cyBISUYgc2VydmljZXMgYXQgb25lIHNob3QgKDEwMDApICovCisjZGVmaW5lIFFDQV9OQVBJX0JVREdFVCAgICA2NAorI2RlZmluZSBRQ0FfTkFQSV9ERUZfU0NBTEUgMTYKKy8qIE5PVEU6IFRoaXMgaXMgdG8gYWRhcHQgbm9uLU5BUEkgc29sdXRpb24gdG8gdXNlCisgICB0aGUgc2FtZSAiYnVkZ2V0IiBhcyBOQVBJLiBXaWxsIGJlIHJlbW92ZWQKKyAgIGBvbmNlIGRlY2lzaW9uIGFib3V0IE5BUEkgaXMgbWFkZSAqLworI2RlZmluZSBISUZfTkFQSV9NQVhfUkVDRUlWRVMgKFFDQV9OQVBJX0JVREdFVCAqIFFDQV9OQVBJX0RFRl9TQ0FMRSkKKworLyogTk9URTogIm5hcGktPnNjYWxlIiBjYW4gYmUgY2hhbmdlZCwKKyAgIGJ1dCB0aGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgKi8KKyNkZWZpbmUgUUNBX05BUElfTlVNX0JVQ0tFVFMgKFFDQV9OQVBJX0JVREdFVCAvIFFDQV9OQVBJX0RFRl9TQ0FMRSkKK3N0cnVjdCBxY2FfbmFwaV9zdGF0IHsKKwl1aW50MzJfdCBuYXBpX3NjaGVkdWxlczsKKwl1aW50MzJfdCBuYXBpX3BvbGxzOworCXVpbnQzMl90IG5hcGlfY29tcGxldGVzOworCXVpbnQzMl90IG5hcGlfd29ya2RvbmU7CisJdWludDMyX3QgbmFwaV9idWRnZXRfdXNlc1tRQ0FfTkFQSV9OVU1fQlVDS0VUU107Cit9OworCisvKioKKyAqIHBlciBOQVBJIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHN0dWZmIHBlciBOQVBJIGluc3RhbmNlLgorICogTm90ZSB0aGF0LCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhvdWdoIHNjYWxlIGlzCisgKiBhbiBpbnN0YW5jZSB2YXJpYWJsZSwgaXQgaXMgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGZvciBhbGwKKyAqIGluc3RhbmNlcy4KKyAqLworc3RydWN0IHFjYV9uYXBpX2luZm8geworCXN0cnVjdCBuYXBpX3N0cnVjdCAgIG5hcGk7ICAgIC8qIG9uZSBOQVBJIEluc3RhbmNlIHBlciBDRSBpbiBwaGFzZSBJICovCisJdWludDhfdCAgICAgICAgICAgICAgc2NhbGU7ICAgLyogY3VycmVudGx5IHNhbWUgb24gYWxsIGluc3RhbmNlcyAqLworCXVpbnQ4X3QgICAgICAgICAgICAgIGlkOworCXN0cnVjdCBxY2FfbmFwaV9zdGF0IHN0YXRzW05SX0NQVVNdOworfTsKKworLyoqCisgKiBOQVBJIGRhdGEtc3J1Y3R1cmUgY29tbW9uIHRvIGFsbCBOQVBJIGluc3RhbmNlcy4KKyAqCisgKiBBIHZhcmlhYmxlIG9mIHRoaXMgdHlwZSB3aWxsIGJlIHN0b3JlZCBpbiBoaWYgbW9kdWxlIGNvbnRleHQuCisgKi8KKworc3RydWN0IHFjYV9uYXBpX2RhdGEgeworCS8qIE5PVEU6IG1ha2Ugc3VyZSB0aGUgbXV0ZXggaXMgaW5pdGVkIG9ubHkgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCisJICAgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBkcml2ZXIuIEZvciBub3csIGdyYW51bGFyaXR5IG9mIG9uZQorCSAgIGlzIE9LLCBidXQgd2UgbWlnaHQgd2FudCB0byBoYXZlIGEgYmV0dGVyIGdyYW51bGFyaXR5IGxhdGVyICovCisJc3RydWN0IG11dGV4ICAgICAgICAgbXV0ZXg7CisJdWludDMyX3QgICAgICAgICAgICAgc3RhdGU7CisJdWludDMyX3QgICAgICAgICAgICAgY2VfbWFwOyAvKiBiaXRtYXAgb2YgY3JlYXRlZC9yZWdpc3RlcmVkIE5BUEkKKwkJCQkJaW5zdGFuY2VzLCBpbmRleGVkIGJ5IHBpcGVfaWQsCisJCQkJCW5vdCB1c2VkIGJ5IGNsaWVudHMgKGNsaWVudHMgdXNlIGFuCisJCQkJCWlkIHJldHVybmVkIGJ5IGNyZWF0ZSkgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAgICBuZXRkZXY7IC8qIGR1bW15IG5ldF9kZXYgKi8KKwlzdHJ1Y3QgcWNhX25hcGlfaW5mbyBuYXBpc1tDRV9DT1VOVF9NQVhdOworfTsKKworc3RydWN0IG9sX3NvZnRjIHsKKwl2b2lkIF9faW9tZW0gKm1lbTsgICAgICAvKiBJTyBtYXBwZWQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworCWNkZl9kbWFfYWRkcl90IG1lbV9wYTsKKwl1aW50MzJfdCBzb2NfdmVyc2lvbjsKKwkvKgorCSAqIGhhbmRsZSBmb3IgY29kZSB0aGF0IHVzZXMgdGhlIG9zZGVwLmggdmVyc2lvbiBvZiBPUworCSAqIGFic3RyYWN0aW9uIHByaW1pdGl2ZXMKKwkgKi8KKwlzdHJ1Y3QgX05JQ19ERVYgYXBzX29zZGV2OworCWVudW0gYXRoX2hhbF9idXNfdHlwZSBidXNfdHlwZTsKKwl1aW50MzJfdCBsY3JfdmFsOworCWJvb2wgcGt0X2xvZ19pbml0OworCWJvb2wgcmVxdWVzdF9pcnFfZG9uZTsKKwkvKgorCSAqIGhhbmRsZSBmb3IgY29kZSB0aGF0IHVzZXMgY2RmIHZlcnNpb24gb2YgT1MKKwkgKiBhYnN0cmFjdGlvbiBwcmltaXRpdmVzCisJICovCisJY2RmX2RldmljZV90IGNkZl9kZXY7CisKKwlzdHJ1Y3Qgb2xfdmVyc2lvbiB2ZXJzaW9uOworCisJLyogUGFja2V0IHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3Qgb2xfYXRoX3N0YXRzIHBrdF9zdGF0czsKKworCS8qIEFfVEFSR0VUX1RZUEVfKiAqLworCXVpbnQzMl90IHRhcmdldF90eXBlOworCXVpbnQzMl90IHRhcmdldF9md192ZXJzaW9uOworCXVpbnQzMl90IHRhcmdldF92ZXJzaW9uOworCXVpbnQzMl90IHRhcmdldF9yZXZpc2lvbjsKKwl1aW50OF90IGNybV92ZXJzaW9uX3N0cmluZ1s2NF07CisJdWludDhfdCB3bGFuX3ZlcnNpb25fc3RyaW5nWzY0XTsKKwlvbF90YXJnZXRfc3RhdHVzIHRhcmdldF9zdGF0dXM7CisJYm9vbCBpc19zaW07CisJLyogY2FsaWJyYXRpb24gZGF0YSBpcyBzdG9yZWQgaW4gZmxhc2ggKi8KKwl1aW50OF90ICpjYWxfaW5fZmxhc2g7CisJLyogdmlydHVhbCBhZGRyZXNzIGZvciB0aGUgY2FsaWJyYXRpb24gZGF0YSBvbiB0aGUgZmxhc2ggKi8KKwl2b2lkICpjYWxfbWVtOworCS8qIHN0YXR1cyBvZiB0YXJnZXQgaW5pdCAqLworCVdMQU5fSU5JVF9TVEFUVVMgd2xhbl9pbml0X3N0YXR1czsKKworCS8qIEJNSSBpbmZvICovCisJLyogT1MtZGVwZW5kZW50IHByaXZhdGUgaW5mbyBmb3IgQk1JICovCisJdm9pZCAqYm1pX29sX3ByaXY7CisJYm9vbCBibWlfZG9uZTsKKwlib29sIGJtaV91YV9kb25lOworCXVpbnQ4X3QgKmJtaV9jbWRfYnVmZjsKKwlkbWFfYWRkcl90IGJtaV9jbWRfZGE7CisJT1NfRE1BX01FTV9DT05URVhUKGJtaWNtZF9kbWFjb250ZXh0KQorCisJdWludDhfdCAqYm1pX3JzcF9idWZmOworCWRtYV9hZGRyX3QgYm1pX3JzcF9kYTsKKwkvKiBsZW5ndGggb2YgbGFzdCByZXNwb25zZSAqLworCXVpbnQzMl90IGxhc3RfcnhsZW47CisJT1NfRE1BX01FTV9DT05URVhUKGJtaXJzcF9kbWFjb250ZXh0KQorCisJdm9pZCAqbXNpX21hZ2ljOworCWRtYV9hZGRyX3QgbXNpX21hZ2ljX2RhOworCU9TX0RNQV9NRU1fQ09OVEVYVChtc2lfZG1hY29udGV4dCkKKworCS8qIEhhbmRsZXMgZm9yIExvd2VyIExheWVycyA6IGZpbGxlZCBpbiBhdCBpbml0IHRpbWUgKi8KKwloaWZfaGFuZGxlX3QgaGlmX2hkbDsKKyNpZmRlZiBISUZfUENJCisJc3RydWN0IGhpZl9wY2lfc29mdGMgKmhpZl9zYzsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0ZBU1RQQVRICisJaW50IGZhc3RwYXRoX21vZGVfb247IC8qIER1cGxpY2F0aW5nIHRoaXMgZm9yIGRhdGEgcGF0aCBlZmZpY2llbmN5ICovCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0ZBU1RQQVRIICovCisKKwkvKiBIVEMgaGFuZGxlcyAqLworCXZvaWQgKmh0Y19oYW5kbGU7CisKKwlib29sIGZFbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uOworCXVpbnQ4X3QgYmNuRWFybHlUZXJtV2FrZUludGVydmFsOworCisJLyogVVRGIGV2ZW50IGluZm9ybWF0aW9uICovCisJc3RydWN0IHsKKwkJdWludDhfdCAqZGF0YTsKKwkJdWludDMyX3QgbGVuZ3RoOworCQljZGZfc2l6ZV90IG9mZnNldDsKKwkJdWludDhfdCBjdXJyZW50U2VxOworCQl1aW50OF90IGV4cGVjdGVkU2VxOworCX0gdXRmX2V2ZW50X2luZm87CisKKwlzdHJ1Y3Qgb2xfd293X2luZm8gKnNjbl93b3dJbmZvOworCS8qIGVuYWJsZSB1YXJ0L3NlcmlhbCBwcmludHMgZnJvbSB0YXJnZXQgKi8KKwlib29sIGVuYWJsZXVhcnRwcmludDsKKwkvKiBlbmFibGUgZndsb2cgKi8KKwlib29sIGVuYWJsZWZ3bG9nOworCisJSEFMX1JFR19DQVBBQklMSVRJRVMgaGFsX3JlZ19jYXBhYmlsaXRpZXM7CisJc3RydWN0IG9sX3JlZ2RtbiAqb2xfcmVnZG1uX2hhbmRsZTsKKwl1aW50OF90IGJjbl9tb2RlOworCXVpbnQ4X3QgYXJwX292ZXJyaWRlOworCS8qCisJICogSW5jbHVkZXMgaG9zdCBzaWRlIHN0YWNrIGxldmVsIHN0YXRzICsKKwkgKiByYWRpbyBsZXZlbCBhdGhzdGF0cworCSAqLworCXN0cnVjdCB3bGFuX2RiZ19zdGF0cyBhdGhfc3RhdHM7CisJLyogbm9pc2VfZmxvb3IgKi8KKwlpbnQxNl90IGNoYW5fbmY7CisJdWludDMyX3QgbWluX3R4X3Bvd2VyOworCXVpbnQzMl90IG1heF90eF9wb3dlcjsKKwl1aW50MzJfdCB0eHBvd2xpbWl0Mkc7CisJdWludDMyX3QgdHhwb3dsaW1pdDVHOworCXVpbnQzMl90IHR4cG93ZXJfc2NhbGU7CisJdWludDMyX3QgY2hhbl90eF9wd3I7CisJdWludDMyX3QgdmRldl9jb3VudDsKKwl1aW50MzJfdCBtYXhfYmNuX2llX3NpemU7CisJY2RmX3NwaW5sb2NrX3Qgc2NuX2xvY2s7CisJdWludDhfdCB2b3dfZXh0c3RhdHM7CisJLyogaWYgZGNzIGVuYWJsZWQgb3Igbm90ICovCisJdWludDhfdCBzY25fZGNzOworCXdkaV9ldmVudF9zdWJzY3JpYmUgc2NuX3J4X3BlZXJfaW52YWxpZF9zdWJzY3JpYmVyOworCXVpbnQ4X3QgcHJveHlfc3RhOworCXVpbnQ4X3QgYmNuX2VuYWJsZWQ7CisJLyogRHluYW1pYyBUeCBDaGFpbm1hc2sgU2VsZWN0aW9uIGVuYWJsZWQvZGlzYWJsZWQgKi8KKwl1aW50OF90IGR0Y3M7CisJLyogdHJ1ZSBpZiB2aHQgaWVzIGFyZSBzZXQgb24gdGFyZ2V0ICovCisJdWludDMyX3Qgc2V0X2h0X3ZodF9pZXM6MTsKKwkvKkNXTSBlbmFibGUvZGlzYWJsZSBzdGF0ZSAqLworCWJvb2wgc2NuX2N3bWVuYWJsZTsKKwl1aW50OF90IG1heF9ub19vZl9wZWVyczsKKyNpZmRlZiBDT05GSUdfQ05TUworCXN0cnVjdCBjbnNzX2Z3X2ZpbGVzIGZ3X2ZpbGVzOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ05TUykKKwl2b2lkICpyYW1kdW1wX2Jhc2U7CisJdW5zaWduZWQgbG9uZyByYW1kdW1wX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyByYW1kdW1wX3NpemU7CisjZW5kaWYKKwlib29sIGVuYWJsZV9zZWxmX3JlY292ZXJ5OworI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisJYm9vbCBlbmFibGVscGFzc3N1cHBvcnQ7CisjZW5kaWYKKwlib29sIGVuYWJsZV9yYW1kdW1wX2NvbGxlY3Rpb247CisJc3RydWN0IHRhcmdldGRlZl9zICp0YXJnZXRkZWY7CisJc3RydWN0IGNlX3JlZ19kZWYgKnRhcmdldF9jZV9kZWY7CisJc3RydWN0IGhvc3RkZWZfcyAqaG9zdGRlZjsKKwlzdHJ1Y3QgaG9zdF9zaGFkb3dfcmVnc19zICpob3N0X3NoYWRvd19yZWdzOworCWJvb2wgYXRoZGlhZ19wcm9jZnNfaW5pdGVkOworCS8qCisJICogR3VhcmQgY2hhbmdlcyB0byBUYXJnZXQgSFcgc3RhdGUgYW5kIHRvIHNvZnR3YXJlCisJICogc3RydWN0dXJlcyB0aGF0IHRyYWNrIGhhcmR3YXJlIHN0YXRlLgorCSAqLworCWNkZl9zcGlubG9ja190IHRhcmdldF9sb2NrOworCXVuc2lnbmVkIGludCBjZV9jb3VudDsgIC8qIE51bWJlciBvZiBDb3B5IEVuZ2luZXMgc3VwcG9ydGVkICovCisJYm9vbCBmb3JjZV9icmVhazsJLyogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvCisJCQkJICogYnJlYWsgb3V0IHRoZSBEUEMgY29udGV4dCAqLworCXVuc2lnbmVkIGludCByZWNlaXZlX2NvdW50OwkvKiBjb3VudCBOdW0gT2YgUmVjZWl2ZSBCdWZmZXJzCisJCQkJCSAqIGhhbmRsZWQgZm9yIG9uZSBpbnRlcnJ1cHQKKwkJCQkJICogRFBDIHJvdXRpbmUgKi8KKwlzdHJ1Y3QgQ0Vfc3RhdGUgKmNlX2lkX3RvX3N0YXRlW0NFX0NPVU5UX01BWF07ICAvKiBDRSBpZCB0byBDRV9zdGF0ZSAqLworI2lmZGVmIEZFQVRVUkVfTkFQSQorCXN0cnVjdCBxY2FfbmFwaV9kYXRhIG5hcGlfZGF0YTsKKyNlbmRpZiAvKiBGRUFUVVJFX05BUEkgKi8KKwlpbnQgaHRjX2VuZHBvaW50OworCWJvb2wgcmVjb3Zlcnk7CisJYm9vbCBoaWZfaW5pdF9kb25lOworCWludCBsaW5rc3RhdGVfdm90ZTsKKwlhdG9taWNfdCBsaW5rX3N1c3BlbmRlZDsKKwlhdG9taWNfdCB3b3dfZG9uZTsKKwlhdG9taWNfdCB0YXNrbGV0X2Zyb21faW50cjsKKwlhdG9taWNfdCBhY3RpdmVfdGFza2xldF9jbnQ7CisJYm9vbCBub3RpY2Vfc2VuZDsKKyNpZmRlZiBISUZfUENJCisJY2RmX3NwaW5sb2NrX3QgaXJxX2xvY2s7CisJdWludDMyX3QgY2VfaXJxX3N1bW1hcnk7CisjZW5kaWYKK307CisKK3R5cGVkZWYgZW51bSB7CisJSElGX0RFVklDRV9QT1dFUl9VUCwgICAgICAgLyogSElGIGxheWVyIHNob3VsZCBwb3dlciB1cCBpbnRlcmZhY2UKKwkJCQkgICAgKiBhbmQvb3IgbW9kdWxlICovCisJSElGX0RFVklDRV9QT1dFUl9ET1dOLCAgICAgLyogSElGIGxheWVyIHNob3VsZCBpbml0aWF0ZSBidXMtc3BlY2lmaWMKKwkJCQkgICAgKiBtZWFzdXJlcyB0byBtaW5pbWl6ZSBwb3dlciAqLworCUhJRl9ERVZJQ0VfUE9XRVJfQ1VUICAgICAgIC8qIEhJRiBsYXllciBzaG91bGQgaW5pdGlhdGUgYnVzLXNwZWNpZmljCisJCQkJICAgICogQU5EL09SIHBsYXRmb3JtLXNwZWNpZmljIG1lYXN1cmVzCisJCQkJICAgICogdG8gY29tcGxldGVseSBwb3dlci1vZmYgdGhlIG1vZHVsZSBhbmQKKwkJCQkgICAgKiBhc3NvY2lhdGVkIGhhcmR3YXJlIChpLmUuIGN1dCBwb3dlcgorCQkJCSAgICAqIHN1cHBsaWVzKSAqLworfSBISUZfREVWSUNFX1BPV0VSX0NIQU5HRV9UWVBFOworCisvKioKKyAqIGVudW0gaGlmX2VuYWJsZV90eXBlOiB3aGF0IHRyaWdnZXJlZCB0aGUgZW5hYmxpbmcgb2YgaGlmCisgKgorICogQEhJRl9FTkFCTEVfVFlQRV9QUk9CRTogcHJvYmUgdHJpZ2dlcmVkIGVuYWJsZQorICogQEhJRl9FTkFCTEVfVFlQRV9SRUlOSVQ6IHJlaW5pdCB0cmlnZ2VyZWQgZW5hYmxlCisgKi8KK2VudW0gaGlmX2VuYWJsZV90eXBlIHsKKwlISUZfRU5BQkxFX1RZUEVfUFJPQkUsCisJSElGX0VOQUJMRV9UWVBFX1JFSU5JVCwKKwlISUZfRU5BQkxFX1RZUEVfTUFYCit9OworCisvKioKKyAqIGVudW0gaGlmX2Rpc2FibGVfdHlwZTogd2hhdCB0cmlnZ2VyZWQgdGhlIGRpc2FibGluZyBvZiBoaWYKKyAqCisgKiBASElGX0RJU0FCTEVfVFlQRV9QUk9CRV9FUlJPUjogcHJvYmUgZXJyb3IgdHJpZ2dlcmVkIGRpc2FibGUKKyAqIEBISUZfRElTQUJMRV9UWVBFX1JFSU5JVF9FUlJPUjogcmVpbml0IGVycm9yIHRyaWdnZXJlZAorICogIAkJCQkJCQkgZGlzYWJsZQorICogQEhJRl9ESVNBQkxFX1RZUEVfUkVNT1ZFOiByZW1vdmUgdHJpZ2dlcmVkIGRpc2FibGUKKyAqIEBISUZfRElTQUJMRV9UWVBFX1NIVVRET1dOOiBzaHV0ZG93biB0cmlnZ2VyZWQgZGlzYWJsZQorICovCitlbnVtIGhpZl9kaXNhYmxlX3R5cGUgeworCUhJRl9ESVNBQkxFX1RZUEVfUFJPQkVfRVJST1IsCisJSElGX0RJU0FCTEVfVFlQRV9SRUlOSVRfRVJST1IsCisJSElGX0RJU0FCTEVfVFlQRV9SRU1PVkUsCisJSElGX0RJU0FCTEVfVFlQRV9TSFVURE9XTiwKKwlISUZfRElTQUJMRV9UWVBFX01BWAorfTsKKworI2lmZGVmIENPTkZJR19BVEhfUENJRV9BQ0NFU1NfREVCVUcKK3R5cGVkZWYgc3RydWN0IF9ISURfQUNDRVNTX0xPRyB7CisJdWludDMyX3Qgc2VxbnVtOworCWJvb2wgaXNfd3JpdGU7CisJdm9pZCAqYWRkcjsKKwl1aW50MzJfdCB2YWx1ZTsKK30gSElGX0FDQ0VTU19MT0c7CisjZW5kaWYKKworI2RlZmluZSBISUZfTUFYX0RFVklDRVMgICAgICAgICAgICAgICAgIDEKKworc3RydWN0IGh0Y19jYWxsYmFja3MgeworCXZvaWQgKmNvbnRleHQ7CQkvKiBjb250ZXh0IHRvIHBhc3MgdG8gdGhlIGRzcmhhbmRsZXIKKwkJCQkgKiBub3RlIDogcndDb21wbGV0aW9uSGFuZGxlciBpcyBwcm92aWRlZAorCQkJCSAqIHRoZSBjb250ZXh0IHBhc3NlZCB0byBoaWZfcmVhZF93cml0ZSAgKi8KKwlpbnQgKCpyd0NvbXBsZXRpb25IYW5kbGVyKSh2b2lkICpyd0NvbnRleHQsIGludCBzdGF0dXMpOworCWludCAoKmRzckhhbmRsZXIpKHZvaWQgKmNvbnRleHQpOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NkcnZfY2FsbGJhY2tzIHsKKwl2b2lkICpjb250ZXh0OyAgICAgICAgICAvKiBjb250ZXh0IHRvIHBhc3MgZm9yIGFsbCBjYWxsYmFja3MKKwkJCQkgKiBleGNlcHQgZGV2aWNlUmVtb3ZlZEhhbmRsZXIKKwkJCQkgKiB0aGUgZGV2aWNlUmVtb3ZlZEhhbmRsZXIgaXMgb25seQorCQkJCSAqIGNhbGxlZCBpZiB0aGUgZGV2aWNlIGlzIGNsYWltZWQgKi8KKwlpbnQgKCpkZXZpY2VJbnNlcnRlZEhhbmRsZXIpKHZvaWQgKmNvbnRleHQsIHZvaWQgKmhpZl9oYW5kbGUpOworCWludCAoKmRldmljZVJlbW92ZWRIYW5kbGVyKSh2b2lkICpjbGFpbWVkQ29udGV4dCwKKwkJCQkgICAgdm9pZCAqaGlmX2hhbmRsZSk7CisJaW50ICgqZGV2aWNlU3VzcGVuZEhhbmRsZXIpKHZvaWQgKmNvbnRleHQpOworCWludCAoKmRldmljZVJlc3VtZUhhbmRsZXIpKHZvaWQgKmNvbnRleHQpOworCWludCAoKmRldmljZVdha2V1cEhhbmRsZXIpKHZvaWQgKmNvbnRleHQpOworCWludCAoKmRldmljZVBvd2VyQ2hhbmdlSGFuZGxlcikodm9pZCAqY29udGV4dCwKKwkJCQkJSElGX0RFVklDRV9QT1dFUl9DSEFOR0VfVFlQRQorCQkJCQljb25maWcpOworfSBPU0RSVl9DQUxMQkFDS1M7CisKKy8qCisgKiBUaGlzIEFQSSBpcyB1c2VkIHRvIHBlcmZvcm0gYW55IGdsb2JhbCBpbml0aWFsaXphdGlvbiBvZiB0aGUgSElGIGxheWVyCisgKiBhbmQgdG8gc2V0IE9TIGRyaXZlciBjYWxsYmFja3MgKGkuZS4gaW5zZXJ0aW9uL3JlbW92YWwpIHRvIHRoZSBISUYgbGF5ZXIKKyAqCisgKi8KK2ludCBoaWZfaW5pdChPU0RSVl9DQUxMQkFDS1MgKmNhbGxiYWNrcyk7CisKKy8qCisgKiBUaGlzIEFQSSBjbGFpbXMgdGhlIEhJRiBkZXZpY2UgYW5kIHByb3ZpZGVzIGEgY29udGV4dCBmb3IgaGFuZGxpbmcgcmVtb3ZhbC4KKyAqIFRoZSBkZXZpY2UgcmVtb3ZhbCBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBPU0RSViBsYXllciBjbGFpbXMKKyAqIGEgZGV2aWNlLiAgVGhlIGNsYWltZWQgY29udGV4dCBtdXN0IGJlIG5vbi1OVUxMICovCit2b2lkIGhpZl9jbGFpbV9kZXZpY2Uoc3RydWN0IG9sX3NvZnRjICpzY24sIHZvaWQgKmNsYWltZWRDb250ZXh0KTsKKy8qIHJlbGVhc2UgdGhlIGNsYWltZWQgZGV2aWNlICovCit2b2lkIGhpZl9yZWxlYXNlX2RldmljZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CisKKy8qIFRoaXMgQVBJIGRldGFjaGVzIHRoZSBIVEMgbGF5ZXIgZnJvbSB0aGUgSElGIGRldmljZSAqLwordm9pZCBoaWZfZGV0YWNoX2h0YyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQk1JIGFuZCBEaWFnIHdpbmRvdyBhYnN0cmFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBISUZfQk1JX0VYQ0hBTkdFX05PX1RJTUVPVVQgICgodWludDMyX3QpKDApKQorCisjZGVmaW5lIERJQUdfVFJBTlNGRVJfTElNSVQgMjA0OFUgICAvKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZQorCQkJCSAgICAgKiBoYW5kbGVkIGF0b21pY2FsbHkgYnkKKwkJCQkgICAgICogRGlhZ1JlYWQvRGlhZ1dyaXRlICovCisKKy8qCisgKiBBUEkgdG8gaGFuZGxlIEhJRi1zcGVjaWZpYyBCTUkgbWVzc2FnZSBleGNoYW5nZXMsIHRoaXMgQVBJIGlzIHN5bmNocm9ub3VzCisgKiBhbmQgb25seSBhbGxvd2VkIHRvIGJlIGNhbGxlZCBmcm9tIGEgY29udGV4dCB0aGF0IGNhbiBibG9jayAoc2xlZXApICovCitDREZfU1RBVFVTIGhpZl9leGNoYW5nZV9ibWlfbXNnKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLAorCQkJIHVpbnQ4X3QgKnBTZW5kTWVzc2FnZSwKKwkJCSB1aW50MzJfdCBMZW5ndGgsCisJCQkgdWludDhfdCAqcFJlc3BvbnNlTWVzc2FnZSwKKwkJCSB1aW50MzJfdCAqcFJlc3BvbnNlTGVuZ3RoLCB1aW50MzJfdCBUaW1lb3V0TVMpOworCisvKgorICogQVBJcyB0byBoYW5kbGUgSElGIHNwZWNpZmljIGRpYWdub3N0aWMgcmVhZCBhY2Nlc3Nlcy4gVGhlc2UgQVBJcyBhcmUKKyAqIHN5bmNocm9ub3VzIGFuZCBvbmx5IGFsbG93ZWQgdG8gYmUgY2FsbGVkIGZyb20gYSBjb250ZXh0IHRoYXQKKyAqIGNhbiBibG9jayAoc2xlZXApLiBUaGV5IGFyZSBub3QgaGlnaCBwZXJmb3JtYW5jZSBBUElzLgorICoKKyAqIGhpZl9kaWFnX3JlYWRfYWNjZXNzIHJlYWRzIGEgNCBCeXRlIGFsaWduZWQvbGVuZ3RoIHZhbHVlIGZyb20gYQorICogVGFyZ2V0IHJlZ2lzdGVyIG9yIG1lbW9yeSB3b3JkLgorICoKKyAqIGhpZl9kaWFnX3JlYWRfbWVtIHJlYWRzIGFuIGFyYml0cmFyeSBsZW5ndGggb2YgYXJiaXRyYXJpbHkgYWxpZ25lZCBtZW1vcnkuCisgKi8KK0NERl9TVEFUVVMgaGlmX2RpYWdfcmVhZF9hY2Nlc3Moc3RydWN0IG9sX3NvZnRjICpzY24sIHVpbnQzMl90IGFkZHJlc3MsCisJCQkgdWludDMyX3QgKmRhdGEpOworQ0RGX1NUQVRVUyBoaWZfZGlhZ19yZWFkX21lbShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdWludDMyX3QgYWRkcmVzcywKKwkJICAgICAgdWludDhfdCAqZGF0YSwgaW50IG5ieXRlcyk7Cit2b2lkIGhpZl9kdW1wX3RhcmdldF9tZW1vcnkoc3RydWN0IG9sX3NvZnRjICpzY24sIHZvaWQgKnJhbWR1bXBfYmFzZSwKKwkJCSAgICB1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJfdCBzaXplKTsKKy8qCisgKiBBUElzIHRvIGhhbmRsZSBISUYgc3BlY2lmaWMgZGlhZ25vc3RpYyB3cml0ZSBhY2Nlc3Nlcy4gVGhlc2UgQVBJcyBhcmUKKyAqIHN5bmNocm9ub3VzIGFuZCBvbmx5IGFsbG93ZWQgdG8gYmUgY2FsbGVkIGZyb20gYSBjb250ZXh0IHRoYXQKKyAqIGNhbiBibG9jayAoc2xlZXApLgorICogVGhleSBhcmUgbm90IGhpZ2ggcGVyZm9ybWFuY2UgQVBJcy4KKyAqCisgKiBoaWZfZGlhZ193cml0ZV9hY2Nlc3Mgd3JpdGVzIGEgNCBCeXRlIGFsaWduZWQvbGVuZ3RoIHZhbHVlIHRvIGEKKyAqIFRhcmdldCByZWdpc3RlciBvciBtZW1vcnkgd29yZC4KKyAqCisgKiBoaWZfZGlhZ193cml0ZV9tZW0gd3JpdGVzIGFuIGFyYml0cmFyeSBsZW5ndGggb2YgYXJiaXRyYXJpbHkgYWxpZ25lZCBtZW1vcnkuCisgKi8KK0NERl9TVEFUVVMgaGlmX2RpYWdfd3JpdGVfYWNjZXNzKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB1aW50MzJfdCBhZGRyZXNzLAorCQkJICB1aW50MzJfdCBkYXRhKTsKK0NERl9TVEFUVVMgaGlmX2RpYWdfd3JpdGVfbWVtKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB1aW50MzJfdCBhZGRyZXNzLAorCQkgICAgICAgdWludDhfdCAqZGF0YSwgaW50IG5ieXRlcyk7CisKKy8qCisgKiBTZXQgdGhlIEZBU1RQQVRIX21vZGVfb24gZmxhZyBpbiBzYywgZm9yIHVzZSBieSBkYXRhIHBhdGgKKyAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAordm9pZCBoaWZfZW5hYmxlX2Zhc3RwYXRoKHN0cnVjdCBvbF9zb2Z0YyAqaGlmX2Rldik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoSElGX1BDSSkgJiYgIWRlZmluZWQoQV9TSU1PU19ERVZIT1NUKQorLyoKKyAqIFRoaXMgQVBJIGFsbG93cyB0aGUgSG9zdCB0byBhY2Nlc3MgVGFyZ2V0IHJlZ2lzdGVycyBvZiBhIGdpdmVuCisgKiBBX3RhcmdldF9pZF90IGRpcmVjdGx5IGFuZCByZWxhdGl2ZWx5IGVmZmljaWVudGx5IG92ZXIgUENJZS4KKyAqIFRoaXMgYWxsb3dzIHRoZSBIb3N0IHRvIGF2b2lkIGV4dHJhIG92ZXJoZWFkIGFzc29jaWF0ZWQgd2l0aAorICogc2VuZGluZyBhIG1lc3NhZ2UgdG8gZmlybXdhcmUgYW5kIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgbWVzc2FnZQorICogZnJvbSBmaXJtd2FyZSwgYXMgaXMgZG9uZSBvbiBvdGhlciBpbnRlcmNvbm5lY3RzLgorICoKKyAqIFlldCB0aGVyZSBpcyBzb21lIGNvbXBsZXhpdHkgd2l0aCBkaXJlY3QgYWNjZXNzZXMgYmVjYXVzZSB0aGUKKyAqIFRhcmdldCdzIHBvd2VyIHN0YXRlIGlzIG5vdCBrbm93biBhIHByaW9yaS4gVGhlIEhvc3QgbXVzdCBpc3N1ZQorICogc3BlY2lhbCBQQ0llIHJlYWRzL3dyaXRlcyBpbiBvcmRlciB0byBleHBsaWNpdGx5IHdha2UgdGhlIFRhcmdldAorICogYW5kIHRvIHZlcmlmeSB0aGF0IGl0IGlzIGF3YWtlIGFuZCB3aWxsIHJlbWFpbiBhd2FrZS4KKyAqCisgKiBOQjogSG9zdCBlbmRpYW5uZXNzIGNvbnZlcnNpb24gaXMgbGVmdCBmb3IgdGhlIGNhbGxlciB0byBoYW5kbGUuCisgKiAgICAgVGhlc2UgaW50ZXJmYWNlcyBoYW5kbGUgYWNjZXNzOyBub3QgaW50ZXJwcmV0YXRpb24uCisgKgorICogVXNhZ2U6CisgKiAgIER1cmluZyBpbml0aWFsaXphdGlvbiwgdXNlIEFfVEFSR0VUX0lEIHRvIG9idGFpbiBhbiAndGFyZ2V0IElEJworICogICBmb3IgdXNlIHdpdGggdGhlc2UgaW50ZXJmYWNlcy4KKyAqCisgKiAgIFVzZSBBX1RBUkdFVF9SRUFEIGFuZCBBX1RBUkdFVF9XUklURSB0byBhY2Nlc3MgVGFyZ2V0IHNwYWNlLgorICogICBUaGVzZSBjYWxscyBtdXN0IGJlIGJyYWNrZXRlZCBieSBBX1RBUkdFVF9BQ0NFU1NfQkVHSU4gYW5kCisgKiAgIEFfVEFSR0VUX0FDQ0VTU19FTkQuICBBIHNpbmdsZSBCRUdJTi9FTkQgcGFpciBpcyBhZGVxdWF0ZSBmb3IKKyAqICAgbXVsdGlwbGUgUkVBRC9XUklURSBvcGVyYXRpb25zLgorICoKKyAqICAgVXNlIEFfVEFSR0VUX0FDQ0VTU19CRUdJTiB0byBwdXQgdGhlIFRhcmdldCBpbiBhIHN0YXRlIGluCisgKiAgIHdoaWNoIGl0IGlzIGxlZ2FsIGZvciB0aGUgSG9zdCB0byBkaXJlY3RseSBhY2Nlc3MgaXQuIFRoaXMKKyAqICAgbWF5IGludm9sdmUgd2FraW5nIHRoZSBUYXJnZXQgZnJvbSBhIGxvdyBwb3dlciBzdGF0ZSwgd2hpY2gKKyAqICAgbWF5IHRha2UgdXAgdG8gMk1zIQorICoKKyAqICAgVXNlIEFfVEFSR0VUX0FDQ0VTU19FTkQgdG8gdGVsbCB0aGUgVGFyZ2V0IHRoYXQgYXMgZmFyIGFzCisgKiAgIHRoaXMgY29kZSBwYXRoIGlzIGNvbmNlcm5lZCwgaXQgbm8gbG9uZ2VyIG5lZWRzIHRvIHJlbWFpbgorICogICBkaXJlY3RseSBhY2Nlc3NpYmxlLiAgQkVHSU4vRU5EIGlzIHVuZGVyIGEgcmVmZXJlbmNlIGNvdW50ZXI7CisgKiAgIG11bHRpcGxlIGNvZGUgcGF0aHMgbWF5IGlzc3VlIEJFR0lOL0VORCBvbiBhIHNpbmdsZSB0YXJnaWQuCisgKgorICogICBGb3IgYWRkZWQgZWZmaWNpZW5jeSwgdGhlIEhvc3QgbWF5IHVzZSBBX1RBUkdFVF9BQ0NFU1NfTElLRUxZLgorICogICBUaGUgTElLRUxZIGludGVyZmFjZSB3b3JrcyBqdXN0IGxpa2UgQV9UQVJHRVRfQUNDRVNTX0JFR0lOLAorICogICBleGNlcHQgdGhhdCBpdCBtYXkgcmV0dXJuIGJlZm9yZSB0aGUgVGFyZ2V0IGlzIGFjdHVhbGx5CisgKiAgIGF2YWlsYWJsZS4gSXQncyBhIHZhZ3VlIGluZGljYXRpb24gdGhhdCBzb21lIFRhcmdldCBhY2Nlc3NlcworICogICBhcmUgZXhwZWN0ZWQgInNvb24iLiAgV2hlbiB0aGUgTElLRUxZIEFQSSBpcyB1c2VkLAorICogICBBX1RBUkdFVF9BQ0NFU1NfQkVHSU4gbXVzdCBiZSB1c2VkIGJlZm9yZSBhbnkgYWNjZXNzLgorICoKKyAqICAgVGhlcmUgYXJlIHNldmVyYWwgdXNlcyBmb3IgdGhlIExJS0VMWS9VTkxJS0VMWSBBUEk6CisgKiAgICAgLUlmIHRoZXJlIGlzIHNvbWUgcG90ZW50aWFsIHRpbWUgYmVmb3JlIFRhcmdldCBhY2Nlc3NlcworICogICAgICBhbmQgd2Ugd2FudCB0byBnZXQgYSBoZWFkIHN0YXJ0IG9uIHdha2luZyB0aGUgVGFyZ2V0CisgKiAgICAgIChlLmcuIHRvIG92ZXJsYXAgVGFyZ2V0IHdha2Ugd2l0aCBIb3N0LXNpZGUgbWFsbG9jKQorICogICAgIC1IaWdoLWxldmVsIGNvZGUga25vd3MgdGhhdCBpdCB3aWxsIGNhbGwgbG93LWxldmVsCisgKiAgICAgIGZ1bmN0aW9ucyB0aGF0IHdpbGwgdXNlIEJFR0lOL0VORCwgYW5kIHdlIGRvbid0IHdhbnQKKyAqICAgICAgdG8gYWxsb3cgdGhlIFRhcmdldCB0byBzbGVlcCB1bnRpbCB0aGUgZW50aXJlIHNlcXVlbmNlCisgKiAgICAgIGhhcyBjb21wbGV0ZWQuCisgKgorICogICBBX1RBUkdFVF9BQ0NFU1NfT0sgdmVyaWZpZXMgdGhhdCB0aGUgVGFyZ2V0IGNhbiBiZQorICogICBhY2Nlc3NlZC4gSW4gZ2VuZXJhbCwgdGhpcyBzaG91bGQgbm90IGJlIG5lZWRlZCwgYnV0IGl0CisgKiAgIG1heSBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvciBmb3Igc3BlY2lhbCB1c2VzLgorICoKKyAqICAgTm90ZSB0aGF0IHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZyBFTkQgZm9yIGVhY2ggQkVHSU4KKyAqICAgICAgIEFORCAgIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZyBVTkxJS0VMWSBmb3IgZWFjaCBMSUtFTFkhCisgKgorICogICBOQjogVGhpcyBBUEkgaXMgZGVzaWduZWQgdG8gYWxsb3cgc29tZSBmbGV4aWJpbGl0eSBpbiB0cmFkZW9mZnMKKyAqICAgYmV0d2VlbiBUYXJnZXQgcG93ZXIgdXRpbGl6YXRpb24gYW5kIEhvc3QgZWZmaWNpZW5jeSBhbmQKKyAqICAgc3lzdGVtIHBlcmZvcm1hbmNlLgorICovCisKKy8qCisgKiBFbmFibGUvZGlzYWJsZSBDREMgbWF4IHBlcmZvcm1hbmNlIHdvcmthcm91bmQKKyAqIEZvciBtYXgtcGVyZm9ybWFjZSBzZXQgdGhpcyB0byAwCisgKiBUbyBhbGxvdyBTb0MgdG8gZW50ZXIgc2xlZXAgc2V0IHRoaXMgdG8gMQorICovCisjZGVmaW5lIENPTkZJR19ESVNBQkxFX0NEQ19NQVhfUEVSRl9XQVIgMAorI2VuZGlmCisKKyNpZmRlZiBJUEFfT0ZGTE9BRAorLyoKKyAqIElQQSBtaWNybyBjb250cm9sbGVyIGRhdGEgcGF0aCBvZmZsb2FkIGZlYXR1cmUgZW5hYmxlZCwKKyAqIEhJRiBzaG91bGQgcmVsZWFzZSBjb3B5IGVuZ2luZSByZWxhdGVkIHJlc291cmNlIGluZm9ybWF0aW9uIHRvIElQQSBVQworICogSVBBIFVDIHdpbGwgYWNjZXNzIGhhcmR3YXJlIHJlc291cmNlIHdpdGggcmVsZWFzZWQgaW5mb3JtYXRpb24KKyAqLwordm9pZCBoaWZfaXBhX2dldF9jZV9yZXNvdXJjZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwKKwkJCSAgICAgdWludDMyX3QgKmNlX3NyX2Jhc2VfcGFkZHIsCisJCQkgICAgIHVpbnQzMl90ICpjZV9zcl9yaW5nX3NpemUsCisJCQkgICAgIGNkZl9kbWFfYWRkcl90ICpjZV9yZWdfcGFkZHIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWZfaXBhX2dldF9jZV9yZXNvdXJjZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwKKwkJCSAgICAgdWludDMyX3QgKmNlX3NyX2Jhc2VfcGFkZHIsCisJCQkgICAgIHVpbnQzMl90ICpjZV9zcl9yaW5nX3NpemUsCisJCQkgICAgIGNkZl9kbWFfYWRkcl90ICpjZV9yZWdfcGFkZHIpCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCisKKwordm9pZCBoaWZfcmVhZF9waHlfbWVtX2Jhc2Uoc3RydWN0IG9sX3NvZnRjICpzY24sCisJY2RmX2RtYV9hZGRyX3QgKmJhcl92YWx1ZSk7CisKKy8qKgorICogQGJyaWVmIExpc3Qgb2YgY2FsbGJhY2tzIC0gZmlsbGVkIGluIGJ5IEhUQy4KKyAqLworc3RydWN0IGhpZl9tc2dfY2FsbGJhY2tzIHsKKwl2b2lkICpDb250ZXh0OworCS8qKjwgY29udGV4dCBtZWFuaW5nZnVsIHRvIEhUQyAqLworCUNERl9TVEFUVVMgKCp0eENvbXBsZXRpb25IYW5kbGVyKSh2b2lkICpDb250ZXh0LCBjZGZfbmJ1Zl90IHdidWYsCisJCQkJCXVpbnQzMl90IHRyYW5zZmVySUQsCisJCQkJCXVpbnQzMl90IHRvZXBsaXR6X2hhc2hfcmVzdWx0KTsKKwlDREZfU1RBVFVTICgqcnhDb21wbGV0aW9uSGFuZGxlcikodm9pZCAqQ29udGV4dCwgY2RmX25idWZfdCB3YnVmLAorCQkJCQl1aW50OF90IHBpcGVJRCk7CisJdm9pZCAoKnR4UmVzb3VyY2VBdmFpbEhhbmRsZXIpKHZvaWQgKmNvbnRleHQsIHVpbnQ4X3QgcGlwZSk7CisJdm9pZCAoKmZ3RXZlbnRIYW5kbGVyKSh2b2lkICpjb250ZXh0LCBDREZfU1RBVFVTIHN0YXR1cyk7Cit9OworCisjZGVmaW5lIEhJRl9EQVRBX0FUVFJfU0VUX1RYX0NMQVNTSUZZKGF0dHIsIHYpIFwKKwkoYXR0ciB8PSAodiAmIDB4MDEpIDw8IDUpCisjZGVmaW5lIEhJRl9EQVRBX0FUVFJfU0VUX0VOQ0FQU1VMQVRJT05fVFlQRShhdHRyLCB2KSBcCisJKGF0dHIgfD0gKHYgJiAweDAzKSA8PCA2KQorI2RlZmluZSBISUZfREFUQV9BVFRSX1NFVF9BRERSX1hfU0VBUkNIX0RJU0FCTEUoYXR0ciwgdikgXAorCShhdHRyIHw9ICh2ICYgMHgwMSkgPDwgMTMpCisjZGVmaW5lIEhJRl9EQVRBX0FUVFJfU0VUX0FERFJfWV9TRUFSQ0hfRElTQUJMRShhdHRyLCB2KSBcCisJKGF0dHIgfD0gKHYgJiAweDAxKSA8PCAxNCkKKyNkZWZpbmUgSElGX0RBVEFfQVRUUl9TRVRfVE9FUExJVFpfSEFTSF9FTkFCTEUoYXR0ciwgdikgXAorCShhdHRyIHw9ICh2ICYgMHgwMSkgPDwgMTUpCisjZGVmaW5lIEhJRl9EQVRBX0FUVFJfU0VUX1BBQ0tFVF9PUl9SRVNVTFRfT0ZGU0VUKGF0dHIsIHYpIFwKKwkoYXR0ciB8PSAodiAmIDB4MEZGRikgPDwgMTYpCisjZGVmaW5lIEhJRl9EQVRBX0FUVFJfU0VUX0VOQUJMRV8xMUgoYXR0ciwgdikgXAorCShhdHRyIHw9ICh2ICYgMHgwMSkgPDwgMzApCisKKyNpZmRlZiBISUZfUENJCit0eXBlZGVmIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGhpZl9idXNfaWQ7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgZGV2aWNlIGhpZl9idXNfaWQ7CisjZW5kaWYKKwordm9pZCBoaWZfcG9zdF9pbml0KHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB2b2lkICpoSFRDLAorCQkgICBzdHJ1Y3QgaGlmX21zZ19jYWxsYmFja3MgKmNhbGxiYWNrcyk7CitDREZfU1RBVFVTIGhpZl9zdGFydChzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7Cit2b2lkIGhpZl9zdG9wKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK3ZvaWQgaGlmX2ZsdXNoX3N1cnByaXNlX3JlbW92ZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7Cit2b2lkIGhpZl9kdW1wKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB1aW50OF90IENtZElkLCBib29sIHN0YXJ0KTsKK0NERl9TVEFUVVMgaGlmX3NlbmRfaGVhZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdWludDhfdCBQaXBlSUQsCisJCQkJICB1aW50MzJfdCB0cmFuc2ZlcklELCB1aW50MzJfdCBuYnl0ZXMsCisJCQkJICBjZGZfbmJ1Zl90IHdidWYsIHVpbnQzMl90IGRhdGFfYXR0cik7Cit2b2lkIGhpZl9zZW5kX2NvbXBsZXRlX2NoZWNrKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB1aW50OF90IFBpcGVJRCwKKwkJCSAgICAgaW50IGZvcmNlKTsKK3ZvaWQgaGlmX2NhbmNlbF9kZWZlcnJlZF90YXJnZXRfc2xlZXAoc3RydWN0IG9sX3NvZnRjICpzY24pOwordm9pZCBoaWZfZ2V0X2RlZmF1bHRfcGlwZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdWludDhfdCAqVUxQaXBlLAorCQkJICB1aW50OF90ICpETFBpcGUpOworaW50IGhpZl9tYXBfc2VydmljZV90b19waXBlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB1aW50MTZfdCBTZXJ2aWNlSWQsCisJCQkgICAgdWludDhfdCAqVUxQaXBlLCB1aW50OF90ICpETFBpcGUsCisJCQkgICAgaW50ICp1bF9pc19wb2xsZWQsIGludCAqZGxfaXNfcG9sbGVkKTsKK3VpbnQxNl90IGhpZl9nZXRfZnJlZV9xdWV1ZV9udW1iZXIoc3RydWN0IG9sX3NvZnRjICpzY24sIHVpbnQ4X3QgUGlwZUlEKTsKK3ZvaWQgKmhpZl9nZXRfdGFyZ2V0ZGVmKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK3ZvaWQgaGlfZnN1c3BlbmR3b3coc3RydWN0IG9sX3NvZnRjICpzY24pOwordWludDMyX3QgaGlmX2hpYV9pdGVtX2FkZHJlc3ModWludDMyX3QgdGFyZ2V0X3R5cGUsIHVpbnQzMl90IGl0ZW1fb2Zmc2V0KTsKK3ZvaWQgaGlmX3NldF90YXJnZXRfc2xlZXAoc3RydWN0IG9sX3NvZnRjICpzY24sIGJvb2wgc2xlZXBfb2ssCisJCSAgICAgYm9vbCB3YWl0X2Zvcl9pdCk7CitpbnQgaGlmX2NoZWNrX2Z3X3JlZyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CitpbnQgaGlmX2NoZWNrX3NvY19zdGF0dXMoc3RydWN0IG9sX3NvZnRjICpzY24pOwordm9pZCBkdW1wX2NlX2RlYnVnX3JlZ2lzdGVyKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK3ZvaWQgaGlmX2dldF9od19pbmZvKHZvaWQgKnNjbiwgdTMyICp2ZXJzaW9uLCB1MzIgKnJldmlzaW9uLAorCQkgICAgIGNvbnN0IGNoYXIgKip0YXJnZXRfbmFtZSk7Cit2b2lkIGhpZl9zZXRfZndfaW5mbyh2b2lkICpzY24sIHUzMiB0YXJnZXRfZndfdmVyc2lvbik7Cit2b2lkIGhpZl9kaXNhYmxlX2lzcih2b2lkICpzY24pOwordm9pZCBoaWZfcmVzZXRfc29jKHZvaWQgKnNjbik7Cit2b2lkIGhpZl9kaXNhYmxlX2FzcG0odm9pZCk7Cit2b2lkIGhpZl9zYXZlX2h0Y19odHRfY29uZmlnX2VuZHBvaW50KGludCBodGNfZW5kcG9pbnQpOworQ0RGX1NUQVRVUyBoaWZfb3Blbih2b2lkKTsKK3ZvaWQgaGlmX2Nsb3NlKHZvaWQgKmhpZl9jdHgpOworQ0RGX1NUQVRVUyBoaWZfZW5hYmxlKHZvaWQgKmhpZl9jdHgsIHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqYmRldiwKKwljb25zdCBoaWZfYnVzX2lkICpiaWQsIGVudW0gYXRoX2hhbF9idXNfdHlwZSBidXNfdHlwZSwKKwllbnVtIGhpZl9lbmFibGVfdHlwZSB0eXBlKTsKK3ZvaWQgaGlmX2Rpc2FibGUodm9pZCAqaGlmX2N0eCwgZW51bSBoaWZfZGlzYWJsZV90eXBlIHR5cGUpOwordm9pZCBoaWZfZW5hYmxlX3Bvd2VyX2dhdGluZyh2b2lkICpoaWZfY3R4KTsKK2ludCBoaWZfYnVzX3Jlc3VtZSh2b2lkKTsKK2ludCBoaWZfYnVzX3N1c3BlbmQodm9pZCk7Cit2b2lkIGhpZl92b3RlX2xpbmtfZG93bih2b2lkKTsKK3ZvaWQgaGlmX3ZvdGVfbGlua191cCh2b2lkKTsKK2Jvb2wgaGlmX2Nhbl9zdXNwZW5kX2xpbmsodm9pZCk7CitpbnQgZHVtcF9jZV9yZWdpc3RlcihzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CitpbnQgb2xfY29weV9yYW1kdW1wKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK3ZvaWQgaGlmX3BrdGxvZ21vZF9leGl0KHZvaWQgKmhpZl9jdHgpOwordm9pZCBoaWZfY3Jhc2hfc2h1dGRvd24odm9pZCAqaGlmX2N0eCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9ISUZfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL2luYy9oaWZfbmFwaS5oIGIvY29yZS9oaWYvaW5jL2hpZl9uYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmODE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL2luYy9oaWZfbmFwaS5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0hJRl9OQVBJX0hfXworI2RlZmluZSBfX0hJRl9OQVBJX0hfXworCisvKioKKyAqIERPQzogaGlmX25hcGkuaAorICoKKyAqIEludGVyZmFjZSB0byBISUYgaW1wbGVtZW50ZWQgZnVuY3Rpb25zIG9mIE5BUEkuCisgKiBUaGVzZSBhcmUgdXNlZCBieSBoZGRfbmFwaS4KKyAqLworCisKKy8qIENMRCBoZWFkZXJzICovCisjaW5jbHVkZSA8aGlmLmg+IC8qIHN0cnVjdCBvbF9zb2Z0YzsgKi8KKworLyoqCisgKiBjb21tb24gc3R1ZmYKKyAqIFRoZSBkZWNsYXJhdGlvbnMgdW50aWwgI2lmZGVmIEZFQVRVUkVfTkFQSSBiZWxvdworICogYXJlIHZhbGlkIHdoZXRoZXIgb3Igbm90IEZFQVRVUkVfTkFQSSBoYXMgYmVlbgorICogZGVmaW5lZC4KKyAqLworCisvKiB0aGUgZm9sbG93aW5nIHRyaWdnZXJzIG5hcGlfZW5hYmxlL2Rpc2FibGUgYXMgcmVxdWlyZWQgKi8KK2VudW0gcWNhX25hcGlfZXZlbnQgeworCU5BUElfRVZUX0lOVkFMSUQsCisJTkFQSV9FVlRfSU5JX0ZJTEUsCisJTkFQSV9FVlRfQ01EX1NUQVRFIC8qIGlvY3RsIGVuYWJsZS9kaXNhYmxlIGNvbW1hbmRzICovCit9OworCisvKioKKyAqIE1hY3JvcyB0byBtYXAgaWRzIC1yZXR1cm5lZCBieSAuLi5jcmVhdGUoKS0gdG8gcGlwZXMgYW5kIHZpY2UgdmVyc2EKKyAqLworI2RlZmluZSBOQVBJX0lEMlBJUEUoaSkgKChpKS0xKQorI2RlZmluZSBOQVBJX1BJUEUySUQocCkgKChwKSsxKQorCisKKyNpZmRlZiBGRUFUVVJFX05BUEkKKworLyoqCisgKiBOQVBJIEhJRiBBUEkKKyAqCisgKiB0aGUgZGVjbGFyYXRpb25zIGJlbG93IG9ubHkgYXBwbHkgdG8gdGhlIGNhc2UKKyAqIHdoZXJlIEZFQVRVUkVfTkFQSSBpcyBkZWZpbmVkCisgKi8KKworaW50IGhpZl9uYXBpX2NyZWF0ZShzdHJ1Y3Qgb2xfc29mdGMgICAqaGlmLAorCQkgICAgdWludDhfdCAgICAgICAgICAgIHBpcGVfaWQsCisJCSAgICBpbnQgKCpwb2xsKShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KSwKKwkJICAgIGludCAgICAgICAgICAgICAgICBidWRnZXQsCisJCSAgICBpbnQgICAgICAgICAgICAgICAgc2NhbGUpOworaW50IGhpZl9uYXBpX2Rlc3Ryb3koc3RydWN0IG9sX3NvZnRjICAqaGlmLAorCQkgICAgIHVpbnQ4X3QgICAgICAgICAgIGlkLAorCQkgICAgIGludCAgICAgICAgICAgICAgIGZvcmNlKTsKKworc3RydWN0IHFjYV9uYXBpX2RhdGEgKmhpZl9uYXBpX2dldF9hbGwoc3RydWN0IG9sX3NvZnRjICAgKmhpZik7CisKK2ludCBoaWZfbmFwaV9ldmVudChzdHJ1Y3Qgb2xfc29mdGMgICAgICpoaWYsCisJCSAgIGVudW0gIHFjYV9uYXBpX2V2ZW50IGV2ZW50LAorCQkgICB2b2lkICAgICAgICAgICAgICAgICpkYXRhKTsKKworLyogY2FsbGVkIGZyb20gdGhlIElTUiB3aXRoaW4gaGlmLCBzbywgY2UgaXMga25vd24gKi8KK2ludCBoaWZfbmFwaV9lbmFibGVkKHN0cnVjdCBvbF9zb2Z0YyAqaGlmLCBpbnQgY2UpOworCisvKiBjYWxsZWQgZnJvbSBoZGQgKG5hcGlfcG9sbCksIHVzaW5nIG5hcGkgaWQgYXMgYSBzZWxlY3RvciAqLwordm9pZCBoaWZfbmFwaV9lbmFibGVfaXJxKHN0cnVjdCBvbF9zb2Z0YyAqaGlmLCBpbnQgaWQpOworCisvKiBjYWxsZWQgYnkgY2VfdGFza2xldC5jOjpjZV9pcnFfaGFuZGxlciAqLworaW50IGhpZl9uYXBpX3NjaGVkdWxlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBpbnQgY2VfaWQpOworCisvKiBjYWxsZWQgYnkgaGRkX25hcGksIHdoaWNoIGlzIGNhbGxlZCBieSBrZXJuZWwgKi8KK2ludCBoaWZfbmFwaV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCk7CisKKyNpZmRlZiBGRUFUVVJFX05BUElfREVCVUcKKyNkZWZpbmUgTkFQSV9ERUJVRyhmbXQsIC4uLikJCQlcCisJY2RmX3ByaW50KCJ3bGFuOiBOQVBJOiAlczolZCAiZm10LCBfX2Z1bmNfXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pOworI2Vsc2UKKyNkZWZpbmUgTkFQSV9ERUJVRyhmbXQsIC4uLikgLyogTk8tT1AgKi8KKyNlbmRpZiAvKiBGRUFUVVJFIE5BUElfREVCVUcgKi8KKworI2Vsc2UgLyogISBkZWZpbmVkKEZFQVRVUkVfTkFQSSkgKi8KKworLyoqCisgKiBTdHViIEFQSQorICoKKyAqIFRoZSBkZWNsYXJhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGFyZSB2YWxpZCBvbmx5CisgKiB3aGVuIEZFQVRVUkVfTkFQSSBoYXMgKm5vdCogYmVlbiBkZWZpbmVkLgorICovCisKKyNkZWZpbmUgTkFQSV9ERUJVRyhmbXQsIC4uLikgLyogTk8tT1AgKi8KKworc3RhdGljIGlubGluZSBpbnQgaGlmX25hcGlfY3JlYXRlKHN0cnVjdCBvbF9zb2Z0YyAgICpoaWYsCisJCQkJICB1aW50OF90ICAgICAgICAgICAgcGlwZV9pZCwKKwkJCQkgIGludCAoKnBvbGwpKHN0cnVjdCBuYXBpX3N0cnVjdCAqLCBpbnQpLAorCQkJCSAgaW50ICAgICAgICAgICAgICAgIGJ1ZGdldCwKKwkJCQkgIGludCAgICAgICAgICAgICAgICBzY2FsZSkKK3sgcmV0dXJuIC1FUEVSTTsgfQorCitzdGF0aWMgaW5saW5lIGludCBoaWZfbmFwaV9kZXN0cm95KHN0cnVjdCBvbF9zb2Z0YyAgKmhpZiwKKwkJCQkgICB1aW50OF90ICAgICAgICAgICBpZCwKKwkJCQkgICBpbnQgICAgICAgICAgICAgICBmb3JjZSkKK3sgcmV0dXJuIC1FUEVSTTsgfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBxY2FfbmFwaV9kYXRhICpoaWZfbmFwaV9nZXRfYWxsKHN0cnVjdCBvbF9zb2Z0YyAgICpoaWYpCit7IHJldHVybiBOVUxMOyB9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhpZl9uYXBpX2V2ZW50KHN0cnVjdCBvbF9zb2Z0YyAgICAgKmhpZiwKKwkJCQkgZW51bSAgcWNhX25hcGlfZXZlbnQgZXZlbnQsCisJCQkJIHZvaWQgICAgICAgICAgICAgICAgKmRhdGEpCit7IHJldHVybiAtRVBFUk07IH0KKworLyogY2FsbGVkIGZyb20gdGhlIElTUiB3aXRoaW4gaGlmLCBzbywgY2UgaXMga25vd24gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhpZl9uYXBpX2VuYWJsZWQoc3RydWN0IG9sX3NvZnRjICpoaWYsIGludCBjZSkKK3sgcmV0dXJuIDA7IH0KKworLyogY2FsbGVkIGZyb20gaGRkIChuYXBpX3BvbGwpLCB1c2luZyBuYXBpIGlkIGFzIGEgc2VsZWN0b3IgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWZfbmFwaV9lbmFibGVfaXJxKHN0cnVjdCBvbF9zb2Z0YyAqaGlmLCBpbnQgaWQpCit7IHJldHVybjsgfQorCitzdGF0aWMgaW5saW5lIGludCBoaWZfbmFwaV9zY2hlZHVsZShzdHJ1Y3Qgb2xfc29mdGMgKmhpZiwgaW50IGNlX2lkKQoreyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIGludCBoaWZfbmFwaV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sgcmV0dXJuIC1FUEVSTTsgfQorCisjZW5kaWYgLyogRkVBVFVSRV9OQVBJICovCisKKyNlbmRpZiAvKiBfX0hJRl9OQVBJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oaWYvaW5jL3JlZ3RhYmxlLmggYi9jb3JlL2hpZi9pbmMvcmVndGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWFlOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oaWYvaW5jL3JlZ3RhYmxlLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1JFR1RBQkxFX0hfCisjZGVmaW5lIF9SRUdUQUJMRV9IXworCisjaW5jbHVkZSAicmVndGFibGVfcGNpZS5oIgorI2luY2x1ZGUgInJlZ3RhYmxlX2NlLmgiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvaGlmL2luYy9yZWd0YWJsZV9jZS5oIGIvY29yZS9oaWYvaW5jL3JlZ3RhYmxlX2NlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmNWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL2luYy9yZWd0YWJsZV9jZS5oCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfUkVHVEFCTEVfQ0VfSF8KKyNkZWZpbmUgX1JFR1RBQkxFX0NFX0hfCisKKy8qCisgKiBAZF9EU1RfV1JfSU5ERVhfQUREUkVTUzogRGVzdGluYXRpb24gcmluZyB3cml0ZSBpbmRleAorICoKKyAqIEBkX1NSQ19XQVRFUk1BUktfQUREUkVTUzogU291cmNlIHJpbmcgd2F0ZXJtYXJrCisgKgorICogQGRfU1JDX1dBVEVSTUFSS19MT1dfTUFTSzogQml0cyBpbmRpY2F0aW5nIGxvdyB3YXRlcm1hcmsgZnJvbSBTb3VyY2UgcmluZworICoJCQkgICAgICB3YXRlcm1hcmsKKyAqCisgKiBAZF9TUkNfV0FURVJNQVJLX0hJR0hfTUFTSzogQml0cyBpbmRpY2F0aW5nIGhpZ2ggd2F0ZXJtYXJrIGZyb20gU291cmNlIHJpbmcKKyAqCQkJICAgICAgIHdhdGVybWFyaworICoKKyAqIEBkX0RTVF9XQVRFUk1BUktfTE9XX01BU0s6IEJpdHMgaW5kaWNhdGluZyBsb3cgd2F0ZXJtYXJrIGZyb20gRGVzdGluYXRpb24KKyAqCQkJICAgICAgcmluZyB3YXRlcm1hcmsKKyAqCisgKiBAZF9EU1RfV0FURVJNQVJLX0hJR0hfTUFTSzogQml0cyBpbmRpY2F0aW5nIGhpZ2ggd2F0ZXJtYXJrIGZyb20gRGVzdGluYXRpb24KKyAqCQkJICAgICAgIHJpbmcgd2F0ZXJtYXJrCisgKgorICogQGRfQ1VSUkVOVF9TUlJJX0FERFJFU1M6IEN1cnJlbnQgc291cmNlIHJpbmcgcmVhZCBpbmRleC5UaGUgU3RhcnQgT2Zmc2V0CisgKgkJCSAgICB3aWxsIGJlIHJlZmxlY3RlZCBhZnRlciBhIENFIHRyYW5zZmVyIGlzIGNvbXBsZXRlZC4KKyAqCisgKiBAZF9DVVJSRU5UX0RSUklfQUREUkVTUzogQ3VycmVudCBEZXN0aW5hdGlvbiByaW5nIHJlYWQgaW5kZXguIFRoZSBTdGFydAorICoJCQkgICAgT2Zmc2V0IHdpbGwgYmUgcmVmbGVjdGVkIGFmdGVyIGEgQ0UgdHJhbnNmZXIKKyAqCQkJICAgIGlzIGNvbXBsZXRlZC4KKyAqCisgKiBAZF9IT1NUX0lTX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX01BU0s6IFNvdXJjZSByaW5nIGhpZ2ggd2F0ZXJtYXJrCisgKgkJCQkJICAgIEludGVycnVwdCBTdGF0dXMKKyAqCisgKiBAZF9IT1NUX0lTX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfTUFTSzogU291cmNlIHJpbmcgbG93IHdhdGVybWFyaworICoJCQkJCSAgIEludGVycnVwdCBTdGF0dXMKKyAqCisgKiBAZF9IT1NUX0lTX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX01BU0s6IERlc3RpbmF0aW9uIHJpbmcgaGlnaCB3YXRlcm1hcmsKKyAqCQkJCQkgICAgSW50ZXJydXB0IFN0YXR1cworICoKKyAqIEBkX0hPU1RfSVNfRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLOiBTb3VyY2UgcmluZyBsb3cgd2F0ZXJtYXJrCisgKgkJCQkJICAgSW50ZXJydXB0IFN0YXR1cworICoKKyAqIEBkX0hPU1RfSVNfQUREUkVTUzogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCisgKgorICogQGRfTUlTQ19JU19BRERSRVNTOiBNaXNjZWxsYW5lb3VzIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIKKyAqCisgKiBAZF9IT1NUX0lTX0NPUFlfQ09NUExFVEVfTUFTSzogQml0cyBpbmRpY2F0aW5nIENvcHkgY29tcGxldGUgaW50ZXJydXB0CisgKgkJCQkgIHN0YXR1cyBmcm9tIHRoZSBIb3N0IEludGVycnVwdCBTdGF0dXMKKyAqCQkJCSAgcmVnaXN0ZXIKKyAqCisgKiBAZF9DRV9XUkFQUEVSX0JBU0VfQUREUkVTUzogQ29weSBFbmdpbmUgV3JhcHBlciBCYXNlIEFkZHJlc3MKKyAqCisgKiBAZF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0FERFJFU1M6IENFIFdyYXBwZXIgc3VtbWFyeSBmb3IgaW50ZXJydXB0cworICoJCQkJCSAgICB0byBob3N0CisgKgorICogQGRfQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0xPVzogVGhlIExTQiBCYXNlIGFkZHJlc3MgdG8gd2hpY2ggc291cmNlIGFuZAorICoJCQkJIGRlc3RpbmF0aW9uIHJlYWQgaW5kaWNlcyBhcmUgd3JpdHRlbgorICoKKyAqIEBkX0NFX1dSQVBQRVJfSU5ERVhfQkFTRV9ISUdIOiBUaGUgTVNCIEJhc2UgYWRkcmVzcyB0byB3aGljaCBzb3VyY2UgYW5kCisgKgkJCQkgIGRlc3RpbmF0aW9uIHJlYWQgaW5kaWNlcyBhcmUgd3JpdHRlbgorICoKKyAqIEBkX0hPU1RfSUVfQUREUkVTUzogSG9zdCBMaW5lIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIKKyAqCisgKiBAZF9IT1NUX0lFX0NPUFlfQ09NUExFVEVfTUFTSzogQml0cyBpbmRpY2F0aW5nIENvcHkgY29tcGxldGUgaW50ZXJydXB0CisgKiAJCQkJICBlbmFibGUgZnJvbSB0aGUgSUUgcmVnaXN0ZXIKKyAqCisgKiBAZF9TUl9CQV9BRERSRVNTOiBMU0Igb2YgU291cmNlIFJpbmcgQmFzZSBBZGRyZXNzCisgKgorICogQGRfU1JfQkFfQUREUkVTU19ISUdIOiBNU0Igb2YgU291cmNlIFJpbmcgQmFzZSBBZGRyZXNzCisgKgorICogQGRfU1JfU0laRV9BRERSRVNTOiBTb3VyY2UgUmluZyBzaXplIC0gbnVtYmVyIG9mIGVudHJpZXMgYW5kIFN0YXJ0IE9mZnNldAorICoKKyAqIEBkX0NFX0NUUkwxX0FERFJFU1M6IENFIENvbnRyb2wgcmVnaXN0ZXIKKyAqCisgKiBAZF9DRV9DVFJMMV9ETUFYX0xFTkdUSF9NQVNLOiBEZXN0aW5hdGlvbiBidWZmZXIgTWF4IExlbmd0aCB1c2VkIGZvciBlcnJvcgorICogCQkJCSBjaGVjaworICoKKyAqIEBkX0RSX0JBX0FERFJFU1M6IERlc3RpbmF0aW9uIFJpbmcgQmFzZSBBZGRyZXNzIExvdworICoKKyAqIEBkX0RSX0JBX0FERFJFU1NfSElHSDogRGVzdGluYXRpb24gUmluZyBCYXNlIEFkZHJlc3MgSGlnaAorICoKKyAqIEBkX0RSX1NJWkVfQUREUkVTUzogRGVzdGluYXRpb24gUmluZyBzaXplIC0gbnVtYmVyIG9mIGVudHJpZXMgU3RhcnQgT2Zmc2V0CisgKgorICogQGRfQ0VfQ01EX1JFR0lTVEVSOiBJbXBsZW1lbnRzIGNvbW1hbmRzIHRvIGFsbCBDRSBIYWx0IEZsdXNoCisgKgorICogQGRfQ0VfTVNJX0FERFJFU1M6IENFIE1TSSBMT1cgQWRkcmVzcyByZWdpc3RlcgorICoKKyAqIEBkX0NFX01TSV9BRERSRVNTX0hJR0g6IENFIE1TSSBIaWdoIEFkZHJlc3MgcmVnaXN0ZXIKKyAqCisgKiBAZF9DRV9NU0lfREFUQTogQ0UgTVNJIERhdGEgUmVnaXN0ZXIKKyAqCisgKiBAZF9DRV9NU0lfRU5BQkxFX0JJVDogQml0IGluIENUUkwxIHJlZ2lzdGVyIGluZGljYXRpb24gdGhlIE1TSSBlbmFibGUKKyAqCisgKiBAZF9NSVNDX0lFX0FERFJFU1M6IE1pc2NlbGxhbmVvdXMgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgorICoKKyAqIEBkX01JU0NfSVNfQVhJX0VSUl9NQVNLOiBCaXQgaW4gTWlzYyBJUyBpbmRpY2F0aW5nIEFYSSBUaW1lb3V0IEludGVycnVwdAorICoJCQkgICAgc3RhdHVzCisgKgorICogQGRfTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSzogQml0IGluIE1pc2MgSVMgaW5kaWNhdGluZyBEZXN0aW5hdGlvbiBBZGRyZXNzCisgKiAJCQkJIEVycm9yCisgKgorICogQGRfTUlTQ19JU19TUkNfTEVOX0VSUl9NQVNLOiBCaXQgaW4gTWlzYyBJUyBpbmRpY2F0aW5nIFNvdXJjZSBaZXJvIExlbmd0aAorICogCQkJCUVycm9yIEludGVycnVwdCBzdGF0dXMKKyAqCisgKiBAZF9NSVNDX0lTX0RTVF9NQVhfTEVOX1ZJT19NQVNLOiBCaXQgaW4gTWlzYyBJUyBpbmRpY2F0aW5nIERlc3RpbmF0aW9uIE1heAorICoJCQkJICAgIExlbmd0aCBWaW9sYXRlZCBJbnRlcnJ1cHQgc3RhdHVzCisgKgorICogQGRfTUlTQ19JU19EU1RfUklOR19PVkVSRkxPV19NQVNLOiBCaXQgaW4gTWlzYyBJUyBpbmRpY2F0aW5nIERlc3RpbmF0aW9uCisgKiAJCQkJICAgICAgUmluZyBPdmVyZmxvdyBJbnRlcnJ1cHQgc3RhdHVzCisgKgorICogQGRfTUlTQ19JU19TUkNfUklOR19PVkVSRkxPV19NQVNLOiBCaXQgaW4gTWlzYyBJUyBpbmRpY2F0aW5nIFNvdXJjZSBSaW5nCisgKiAJCQkJICAgICAgT3ZlcmZsb3cgSW50ZXJydXB0IHN0YXR1cworICoKKyAqIEBkX1NSQ19XQVRFUk1BUktfTE9XX0xTQjogU291cmNlIFJpbmcgTG93IFdhdGVybWFyayBMU0IKKyAqCisgKiBAZF9TUkNfV0FURVJNQVJLX0hJR0hfTFNCOiBTb3VyY2UgUmluZyBMb3cgV2F0ZXJtYXJrIE1TQgorICoKKyAqIEBkX0RTVF9XQVRFUk1BUktfTE9XX0xTQjogRGVzdGluYXRpb24gUmluZyBMb3cgV2F0ZXJtYXJrIExTQgorICoKKyAqIEBkX0RTVF9XQVRFUk1BUktfSElHSF9MU0I6IERlc3RpbmF0aW9uIFJpbmcgSGlnaCBXYXRlcm1hcmsgTFNCCisgKgorICoKKyAqIEBkX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTUFTSzogQml0cyBpbgorICogCQkJCQkJICBkX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfQUREUgorICogCQkJCQkJICBpbmRpY2F0aW5nIENvcHkgZW5naW5lCisgKiAJCQkJCQkgIG1pc2NlbGxhbmVvdXMgaW50ZXJydXB0IHN1bW1hcnkKKyAqCisgKiBAZF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX0xTQjpCaXRzIGluCisgKiAJCQkJCQlkX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfQUREUgorICogCQkJCQkJaW5kaWNhdGluZyBIb3N0IGludGVycnVwdHMgc3VtbWFyeQorICoKKyAqIEBkX0NFX0NUUkwxX0RNQVhfTEVOR1RIX0xTQjogTFNCIG9mIERlc3RpbmF0aW9uIGJ1ZmZlciBNYXggTGVuZ3RoIHVzZWQgZm9yCisgKgkJCQllcnJvciBjaGVjaworICoKKyAqIEBkX0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9NQVNLOiBCaXRzIGluZGljYXRpbmcgU291cmNlIHJpbmcgQnl0ZSBTd2FwCisgKiAJCQkJCSAgIGVuYWJsZS4gVHJlYXRzIHNvdXJjZSByaW5nIG1lbW9yeQorICogCQkJCQkgICBvcmdhbmlzYXRpb24gYXMgYmlnLWVuZGlhbgorICoKKyAqIEBkX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9NQVNLOiBCaXRzIGluZGljYXRpbmcgRGVzdGluYXRpb24gcmluZworICogCQkJCQkgICBieXRlIHN3YXAgZW5hYmxlLiBUcmVhdHMgZGVzdGluYXRpb24KKyAqIAkJCQkJICAgcmluZyBtZW1vcnkgb3JnYW5pc2F0aW9uIGFzIGJpZy1lbmRpYW4KKyAqCisgKiBAZF9DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTFNCOiBMU0Igb2YgU291cmNlIHJpbmcgQnl0ZSBTd2FwIGVuYWJsZQorICoKKyAqIEBkX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9MU0I6IExTQiBvZiBEZXN0aW5hdGlvbiByaW5nIEJ5dGUgU3dhcCBlbmFibGUKKyAqCisgKiBAZF9DRV9XUkFQUEVSX0RFQlVHX09GRlNFVDogT2Zmc2V0IG9mIENFIE9CUyBCVVMgU2VsZWN0IHJlZ2lzdGVyCisgKgorICogQGRfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTVNCOiBNU0Igb2YgQ29udHJvbCByZWdpc3RlciBzZWxlY3RpbmcgaW5wdXRzIGZvcgorICoJCQkJdHJhY2UvZGVidWcKKyAqCisgKiBAZF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9MU0I6IExTQiBvZiBDb250cm9sIHJlZ2lzdGVyIHNlbGVjdGluZyBpbnB1dHMgZm9yCisgKiAJCQkJdHJhY2UvZGVidWcKKyAqCisgKiBAZF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9NQVNLOiBCaXRzIGluZGljYXRpbmcgQ29udHJvbCByZWdpc3RlciBzZWxlY3RpbmcKKyAqIAkJCQkgaW5wdXRzIGZvciB0cmFjZS9kZWJ1ZworICoKKyAqIEBkX0NFX0RFQlVHX09GRlNFVDogT2Zmc2V0IG9mIENvcHkgRW5naW5lIEZTTSBEZWJ1ZyBTdGF0dXMKKyAqCisgKiBAZF9DRV9ERUJVR19TRUxfTVNCOiBNU0Igb2YgQ29weSBFbmdpbmUgRlNNIERlYnVnIFN0YXR1cworICoKKyAqIEBkX0NFX0RFQlVHX1NFTF9MU0I6IExTQiBvZiBDb3B5IEVuZ2luZSBGU00gRGVidWcgU3RhdHVzCisgKgorICogQGRfQ0VfREVCVUdfU0VMX01BU0s6IEJpdHMgaW5kaWNhdGluZyBDb3B5IEVuZ2luZSBGU00gRGVidWcgU3RhdHVzCisgKgorKi8KKworc3RydWN0IGNlX3JlZ19kZWYgeworCS8qIGNvcHlfZW5naW5lLmMgKi8KKwl1aW50MzJfdCBkX0RTVF9XUl9JTkRFWF9BRERSRVNTOworCXVpbnQzMl90IGRfU1JDX1dBVEVSTUFSS19BRERSRVNTOworCXVpbnQzMl90IGRfU1JDX1dBVEVSTUFSS19MT1dfTUFTSzsKKwl1aW50MzJfdCBkX1NSQ19XQVRFUk1BUktfSElHSF9NQVNLOworCXVpbnQzMl90IGRfRFNUX1dBVEVSTUFSS19MT1dfTUFTSzsKKwl1aW50MzJfdCBkX0RTVF9XQVRFUk1BUktfSElHSF9NQVNLOworCXVpbnQzMl90IGRfQ1VSUkVOVF9TUlJJX0FERFJFU1M7CisJdWludDMyX3QgZF9DVVJSRU5UX0RSUklfQUREUkVTUzsKKwl1aW50MzJfdCBkX0hPU1RfSVNfU1JDX1JJTkdfSElHSF9XQVRFUk1BUktfTUFTSzsKKwl1aW50MzJfdCBkX0hPU1RfSVNfU1JDX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLOworCXVpbnQzMl90IGRfSE9TVF9JU19EU1RfUklOR19ISUdIX1dBVEVSTUFSS19NQVNLOworCXVpbnQzMl90IGRfSE9TVF9JU19EU1RfUklOR19MT1dfV0FURVJNQVJLX01BU0s7CisJdWludDMyX3QgZF9IT1NUX0lTX0FERFJFU1M7CisJdWludDMyX3QgZF9NSVNDX0lTX0FERFJFU1M7CisJdWludDMyX3QgZF9IT1NUX0lTX0NPUFlfQ09NUExFVEVfTUFTSzsKKwl1aW50MzJfdCBkX0NFX1dSQVBQRVJfQkFTRV9BRERSRVNTOworCXVpbnQzMl90IGRfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9BRERSRVNTOworCXVpbnQzMl90IGRfQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0xPVzsKKwl1aW50MzJfdCBkX0NFX1dSQVBQRVJfSU5ERVhfQkFTRV9ISUdIOworCXVpbnQzMl90IGRfSE9TVF9JRV9BRERSRVNTOworCXVpbnQzMl90IGRfSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0s7CisJdWludDMyX3QgZF9TUl9CQV9BRERSRVNTOworCXVpbnQzMl90IGRfU1JfQkFfQUREUkVTU19ISUdIOworCXVpbnQzMl90IGRfU1JfU0laRV9BRERSRVNTOworCXVpbnQzMl90IGRfQ0VfQ1RSTDFfQUREUkVTUzsKKwl1aW50MzJfdCBkX0NFX0NUUkwxX0RNQVhfTEVOR1RIX01BU0s7CisJdWludDMyX3QgZF9EUl9CQV9BRERSRVNTOworCXVpbnQzMl90IGRfRFJfQkFfQUREUkVTU19ISUdIOworCXVpbnQzMl90IGRfRFJfU0laRV9BRERSRVNTOworCXVpbnQzMl90IGRfQ0VfQ01EX1JFR0lTVEVSOworCXVpbnQzMl90IGRfQ0VfTVNJX0FERFJFU1M7CisJdWludDMyX3QgZF9DRV9NU0lfQUREUkVTU19ISUdIOworCXVpbnQzMl90IGRfQ0VfTVNJX0RBVEE7CisJdWludDMyX3QgZF9DRV9NU0lfRU5BQkxFX0JJVDsKKwl1aW50MzJfdCBkX01JU0NfSUVfQUREUkVTUzsKKwl1aW50MzJfdCBkX01JU0NfSVNfQVhJX0VSUl9NQVNLOworCXVpbnQzMl90IGRfTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSzsKKwl1aW50MzJfdCBkX01JU0NfSVNfU1JDX0xFTl9FUlJfTUFTSzsKKwl1aW50MzJfdCBkX01JU0NfSVNfRFNUX01BWF9MRU5fVklPX01BU0s7CisJdWludDMyX3QgZF9NSVNDX0lTX0RTVF9SSU5HX09WRVJGTE9XX01BU0s7CisJdWludDMyX3QgZF9NSVNDX0lTX1NSQ19SSU5HX09WRVJGTE9XX01BU0s7CisJdWludDMyX3QgZF9TUkNfV0FURVJNQVJLX0xPV19MU0I7CisJdWludDMyX3QgZF9TUkNfV0FURVJNQVJLX0hJR0hfTFNCOworCXVpbnQzMl90IGRfRFNUX1dBVEVSTUFSS19MT1dfTFNCOworCXVpbnQzMl90IGRfRFNUX1dBVEVSTUFSS19ISUdIX0xTQjsKKwl1aW50MzJfdCBkX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTUFTSzsKKwl1aW50MzJfdCBkX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTFNCOworCXVpbnQzMl90IGRfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTFNCOworCXVpbnQzMl90IGRfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0s7CisJdWludDMyX3QgZF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTUFTSzsKKwl1aW50MzJfdCBkX0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9MU0I7CisJdWludDMyX3QgZF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTFNCOworCXVpbnQzMl90IGRfQ0VfV1JBUFBFUl9ERUJVR19PRkZTRVQ7CisJdWludDMyX3QgZF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9NU0I7CisJdWludDMyX3QgZF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9MU0I7CisJdWludDMyX3QgZF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9NQVNLOworCXVpbnQzMl90IGRfQ0VfREVCVUdfT0ZGU0VUOworCXVpbnQzMl90IGRfQ0VfREVCVUdfU0VMX01TQjsKKwl1aW50MzJfdCBkX0NFX0RFQlVHX1NFTF9MU0I7CisJdWludDMyX3QgZF9DRV9ERUJVR19TRUxfTUFTSzsKKwl1aW50MzJfdCBkX0NFMF9CQVNFX0FERFJFU1M7CisJdWludDMyX3QgZF9DRTFfQkFTRV9BRERSRVNTOworCXVpbnQzMl90IGRfQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFUzsKKwl1aW50MzJfdCBkX0FfV0lGSV9BUEJfM19BX1dDTU5fQVBQU19DRV9JTlRSX1NUQVRVUzsKK307CisjZW5kaWYgLyogX1JFR1RBQkxFX0NFX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9pbmMvcmVndGFibGVfcGNpZS5oIGIvY29yZS9oaWYvaW5jL3JlZ3RhYmxlX3BjaWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWU3YjE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oaWYvaW5jL3JlZ3RhYmxlX3BjaWUuaApAQCAtMCwwICsxLDEwMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1JFR1RBQkxFX1BDSUVfSF8KKyNkZWZpbmUgX1JFR1RBQkxFX1BDSUVfSF8KKworI2RlZmluZSBNSVNTSU5HICAwCisKK3N0cnVjdCB0YXJnZXRkZWZfcyB7CisJdWludDMyX3QgZF9SVENfU09DX0JBU0VfQUREUkVTUzsKKwl1aW50MzJfdCBkX1JUQ19XTUFDX0JBU0VfQUREUkVTUzsKKwl1aW50MzJfdCBkX1NZU1RFTV9TTEVFUF9PRkZTRVQ7CisJdWludDMyX3QgZF9XTEFOX1NZU1RFTV9TTEVFUF9PRkZTRVQ7CisJdWludDMyX3QgZF9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX0xTQjsKKwl1aW50MzJfdCBkX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSzsKKwl1aW50MzJfdCBkX0NMT0NLX0NPTlRST0xfT0ZGU0VUOworCXVpbnQzMl90IGRfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0s7CisJdWludDMyX3QgZF9SRVNFVF9DT05UUk9MX09GRlNFVDsKKwl1aW50MzJfdCBkX1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfTUFTSzsKKwl1aW50MzJfdCBkX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLOworCXVpbnQzMl90IGRfV0xBTl9SRVNFVF9DT05UUk9MX09GRlNFVDsKKwl1aW50MzJfdCBkX1dMQU5fUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9NQVNLOworCXVpbnQzMl90IGRfV0xBTl9SRVNFVF9DT05UUk9MX1dBUk1fUlNUX01BU0s7CisJdWludDMyX3QgZF9HUElPX0JBU0VfQUREUkVTUzsKKwl1aW50MzJfdCBkX0dQSU9fUElOMF9PRkZTRVQ7CisJdWludDMyX3QgZF9HUElPX1BJTjFfT0ZGU0VUOworCXVpbnQzMl90IGRfR1BJT19QSU4wX0NPTkZJR19NQVNLOworCXVpbnQzMl90IGRfR1BJT19QSU4xX0NPTkZJR19NQVNLOworCXVpbnQzMl90IGRfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTFNCOworCXVpbnQzMl90IGRfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTUFTSzsKKwl1aW50MzJfdCBkX1NJX0NPTkZJR19JMkNfTFNCOworCXVpbnQzMl90IGRfU0lfQ09ORklHX0kyQ19NQVNLOworCXVpbnQzMl90IGRfU0lfQ09ORklHX1BPU19TQU1QTEVfTFNCOworCXVpbnQzMl90IGRfU0lfQ09ORklHX1BPU19TQU1QTEVfTUFTSzsKKwl1aW50MzJfdCBkX1NJX0NPTkZJR19JTkFDVElWRV9DTEtfTFNCOworCXVpbnQzMl90IGRfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19NQVNLOworCXVpbnQzMl90IGRfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTFNCOworCXVpbnQzMl90IGRfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSzsKKwl1aW50MzJfdCBkX1NJX0NPTkZJR19ESVZJREVSX0xTQjsKKwl1aW50MzJfdCBkX1NJX0NPTkZJR19ESVZJREVSX01BU0s7CisJdWludDMyX3QgZF9TSV9CQVNFX0FERFJFU1M7CisJdWludDMyX3QgZF9TSV9DT05GSUdfT0ZGU0VUOworCXVpbnQzMl90IGRfU0lfVFhfREFUQTBfT0ZGU0VUOworCXVpbnQzMl90IGRfU0lfVFhfREFUQTFfT0ZGU0VUOworCXVpbnQzMl90IGRfU0lfUlhfREFUQTBfT0ZGU0VUOworCXVpbnQzMl90IGRfU0lfUlhfREFUQTFfT0ZGU0VUOworCXVpbnQzMl90IGRfU0lfQ1NfT0ZGU0VUOworCXVpbnQzMl90IGRfU0lfQ1NfRE9ORV9FUlJfTUFTSzsKKwl1aW50MzJfdCBkX1NJX0NTX0RPTkVfSU5UX01BU0s7CisJdWludDMyX3QgZF9TSV9DU19TVEFSVF9MU0I7CisJdWludDMyX3QgZF9TSV9DU19TVEFSVF9NQVNLOworCXVpbnQzMl90IGRfU0lfQ1NfUlhfQ05UX0xTQjsKKwl1aW50MzJfdCBkX1NJX0NTX1JYX0NOVF9NQVNLOworCXVpbnQzMl90IGRfU0lfQ1NfVFhfQ05UX0xTQjsKKwl1aW50MzJfdCBkX1NJX0NTX1RYX0NOVF9NQVNLOworCXVpbnQzMl90IGRfQk9BUkRfREFUQV9TWjsKKwl1aW50MzJfdCBkX0JPQVJEX0VYVF9EQVRBX1NaOworCXVpbnQzMl90IGRfTUJPWF9CQVNFX0FERFJFU1M7CisJdWludDMyX3QgZF9MT0NBTF9TQ1JBVENIX09GRlNFVDsKKwl1aW50MzJfdCBkX0NQVV9DTE9DS19PRkZTRVQ7CisJdWludDMyX3QgZF9MUE9fQ0FMX09GRlNFVDsKKwl1aW50MzJfdCBkX0dQSU9fUElOMTBfT0ZGU0VUOworCXVpbnQzMl90IGRfR1BJT19QSU4xMV9PRkZTRVQ7CisJdWludDMyX3QgZF9HUElPX1BJTjEyX09GRlNFVDsKKwl1aW50MzJfdCBkX0dQSU9fUElOMTNfT0ZGU0VUOworCXVpbnQzMl90IGRfQ0xPQ0tfR1BJT19PRkZTRVQ7CisJdWludDMyX3QgZF9DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCOworCXVpbnQzMl90IGRfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0s7CisJdWludDMyX3QgZF9MUE9fQ0FMX0VOQUJMRV9MU0I7CisJdWludDMyX3QgZF9MUE9fQ0FMX0VOQUJMRV9NQVNLOworCXVpbnQzMl90IGRfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQjsKKwl1aW50MzJfdCBkX0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9NQVNLOworCXVpbnQzMl90IGRfQU5BTE9HX0lOVEZfQkFTRV9BRERSRVNTOworCXVpbnQzMl90IGRfV0xBTl9NQUNfQkFTRV9BRERSRVNTOworCXVpbnQzMl90IGRfRldfSU5ESUNBVE9SX0FERFJFU1M7CisJdWludDMyX3QgZF9EUkFNX0JBU0VfQUREUkVTUzsKKwl1aW50MzJfdCBkX1NPQ19DT1JFX0JBU0VfQUREUkVTUzsKKwl1aW50MzJfdCBkX0NPUkVfQ1RSTF9BRERSRVNTOworCXVpbnQzMl90IGRfQ0VfQ09VTlQ7CisJdWludDMyX3QgZF9NU0lfTlVNX1JFUVVFU1Q7CisJdWludDMyX3QgZF9NU0lfQVNTSUdOX0ZXOworCXVpbnQzMl90IGRfTVNJX0FTU0lHTl9DRV9JTklUSUFMOworCXVpbnQzMl90IGRfUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTOworCXVpbnQzMl90IGRfUENJRV9JTlRSX0NMUl9BRERSRVNTOworCXVpbnQzMl90IGRfUENJRV9JTlRSX0ZJUk1XQVJFX01BU0s7CisJdWludDMyX3QgZF9QQ0lFX0lOVFJfQ0VfTUFTS19BTEw7CisJdWludDMyX3QgZF9DT1JFX0NUUkxfQ1BVX0lOVFJfTUFTSzsKKwl1aW50MzJfdCBkX1NSX1dSX0lOREVYX0FERFJFU1M7CisJdWludDMyX3QgZF9EU1RfV0FURVJNQVJLX0FERFJFU1M7CisKKwkvKiBodHRfcnguYyAqLworCXVpbnQzMl90IGRfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX01BU0s7CisJdWludDMyX3QgZF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTFNCOworCXVpbnQzMl90IGRfUlhfTVBEVV9TVEFSVF8wX1JFVFJZX0xTQjsKKwl1aW50MzJfdCBkX1JYX01QRFVfU1RBUlRfMF9SRVRSWV9NQVNLOworCXVpbnQzMl90IGRfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTUFTSzsKKwl1aW50MzJfdCBkX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX0xTQjsKKwl1aW50MzJfdCBkX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9MU0I7CisJdWludDMyX3QgZF9SWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTUFTSzsKKwl1aW50MzJfdCBkX1JYX01QRFVfU1RBUlRfMl9USURfTFNCOworCXVpbnQzMl90IGRfUlhfTVBEVV9TVEFSVF8yX1RJRF9NQVNLOworCXVpbnQzMl90IGRfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9NQVNLOworCXVpbnQzMl90IGRfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0I7CisJdWludDMyX3QgZF9SWF9NU0RVX0VORF8xX0tFWV9JRF9PQ1RfTUFTSzsKKwl1aW50MzJfdCBkX1JYX01TRFVfRU5EXzFfS0VZX0lEX09DVF9MU0I7CisJdWludDMyX3QgZF9SWF9NU0RVX0VORF80X0xBU1RfTVNEVV9NQVNLOworCXVpbnQzMl90IGRfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCOworCXVpbnQzMl90IGRfUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTUFTSzsKKwl1aW50MzJfdCBkX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX0xTQjsKKwl1aW50MzJfdCBkX1JYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX01BU0s7CisJdWludDMyX3QgZF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0I7CisJdWludDMyX3QgZF9SWF9BVFRFTlRJT05fMF9NUERVX0xFTkdUSF9FUlJfTUFTSzsKKwl1aW50MzJfdCBkX1JYX0ZSQUdfSU5GT18wX1JJTkcyX01PUkVfQ09VTlRfTUFTSzsKKwl1aW50MzJfdCBkX1JYX0ZSQUdfSU5GT18wX1JJTkcyX01PUkVfQ09VTlRfTFNCOworCXVpbnQzMl90IGRfUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX01BU0s7CisJdWludDMyX3QgZF9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTFNCOworCXVpbnQzMl90IGRfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9PRkZTRVQ7CisJdWludDMyX3QgZF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX01BU0s7CisJdWludDMyX3QgZF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX0xTQjsKKwl1aW50MzJfdCBkX1JYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTUFTSzsKKwl1aW50MzJfdCBkX1JYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTFNCOworCXVpbnQzMl90IGRfUlhfQVRURU5USU9OXzBfTU9SRV9EQVRBX01BU0s7CisJdWludDMyX3QgZF9SWF9BVFRFTlRJT05fMF9NU0RVX0RPTkVfTUFTSzsKKwl1aW50MzJfdCBkX1JYX0FUVEVOVElPTl8wX1RDUF9VRFBfQ0hLU1VNX0ZBSUxfTUFTSzsKKwkvKiBlbmQgKi8KKworCS8qIFBMTCBzdGFydCAqLworCXVpbnQzMl90IGRfRUZVU0VfT0ZGU0VUOworCXVpbnQzMl90IGRfRUZVU0VfWFRBTF9TRUxfTVNCOworCXVpbnQzMl90IGRfRUZVU0VfWFRBTF9TRUxfTFNCOworCXVpbnQzMl90IGRfRUZVU0VfWFRBTF9TRUxfTUFTSzsKKwl1aW50MzJfdCBkX0JCX1BMTF9DT05GSUdfT0ZGU0VUOworCXVpbnQzMl90IGRfQkJfUExMX0NPTkZJR19PVVRESVZfTVNCOworCXVpbnQzMl90IGRfQkJfUExMX0NPTkZJR19PVVRESVZfTFNCOworCXVpbnQzMl90IGRfQkJfUExMX0NPTkZJR19PVVRESVZfTUFTSzsKKwl1aW50MzJfdCBkX0JCX1BMTF9DT05GSUdfRlJBQ19NU0I7CisJdWludDMyX3QgZF9CQl9QTExfQ09ORklHX0ZSQUNfTFNCOworCXVpbnQzMl90IGRfQkJfUExMX0NPTkZJR19GUkFDX01BU0s7CisJdWludDMyX3QgZF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NU0I7CisJdWludDMyX3QgZF9XTEFOX1BMTF9TRVRUTEVfVElNRV9MU0I7CisJdWludDMyX3QgZF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NQVNLOworCXVpbnQzMl90IGRfV0xBTl9QTExfU0VUVExFX09GRlNFVDsKKwl1aW50MzJfdCBkX1dMQU5fUExMX1NFVFRMRV9TV19NQVNLOworCXVpbnQzMl90IGRfV0xBTl9QTExfU0VUVExFX1JTVE1BU0s7CisJdWludDMyX3QgZF9XTEFOX1BMTF9TRVRUTEVfUkVTRVQ7CisJdWludDMyX3QgZF9XTEFOX1BMTF9DT05UUk9MX05PUFdEX01TQjsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTFNCOworCXVpbnQzMl90IGRfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NQVNLOworCXVpbnQzMl90IGRfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTVNCOworCXVpbnQzMl90IGRfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTFNCOworCXVpbnQzMl90IGRfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTUFTSzsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX1JFU0VUOworCXVpbnQzMl90IGRfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01TQjsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9MU0I7CisJdWludDMyX3QgZF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTUFTSzsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9SRVNFVDsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX01TQjsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX0xTQjsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX01BU0s7CisJdWludDMyX3QgZF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9SRVNFVDsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfRElWX01TQjsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfRElWX0xTQjsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfRElWX01BU0s7CisJdWludDMyX3QgZF9XTEFOX1BMTF9DT05UUk9MX0RJVl9SRVNFVDsKKwl1aW50MzJfdCBkX1dMQU5fUExMX0NPTlRST0xfT0ZGU0VUOworCXVpbnQzMl90IGRfV0xBTl9QTExfQ09OVFJPTF9TV19NQVNLOworCXVpbnQzMl90IGRfV0xBTl9QTExfQ09OVFJPTF9SU1RNQVNLOworCXVpbnQzMl90IGRfV0xBTl9QTExfQ09OVFJPTF9SRVNFVDsKKwl1aW50MzJfdCBkX1NPQ19DT1JFX0NMS19DVFJMX09GRlNFVDsKKwl1aW50MzJfdCBkX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9NU0I7CisJdWludDMyX3QgZF9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTFNCOworCXVpbnQzMl90IGRfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0s7CisJdWludDMyX3QgZF9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX01TQjsKKwl1aW50MzJfdCBkX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTFNCOworCXVpbnQzMl90IGRfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NQVNLOworCXVpbnQzMl90IGRfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19SRVNFVDsKKwl1aW50MzJfdCBkX1JUQ19TWU5DX1NUQVRVU19PRkZTRVQ7CisJdWludDMyX3QgZF9TT0NfQ1BVX0NMT0NLX09GRlNFVDsKKwl1aW50MzJfdCBkX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTVNCOworCXVpbnQzMl90IGRfU09DX0NQVV9DTE9DS19TVEFOREFSRF9MU0I7CisJdWludDMyX3QgZF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0s7CisJLyogUExMIGVuZCAqLworCisJdWludDMyX3QgZF9TT0NfUE9XRVJfUkVHX09GRlNFVDsKKwl1aW50MzJfdCBkX1BDSUVfSU5UUl9DQVVTRV9BRERSRVNTOworCXVpbnQzMl90IGRfU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUzsKKwl1aW50MzJfdCBkX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTUFTSzsKKwl1aW50MzJfdCBkX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTFNCOworCXVpbnQzMl90IGRfU09DX1JFU0VUX0NPTlRST0xfQ0VfUlNUX01BU0s7CisJdWludDMyX3QgZF9TT0NfUkVTRVRfQ09OVFJPTF9DUFVfV0FSTV9SU1RfTUFTSzsKKwl1aW50MzJfdCBkX0NQVV9JTlRSX0FERFJFU1M7CisJdWludDMyX3QgZF9TT0NfTEZfVElNRVJfQ09OVFJPTDBfQUREUkVTUzsKKwl1aW50MzJfdCBkX1NPQ19MRl9USU1FUl9DT05UUk9MMF9FTkFCTEVfTUFTSzsKKworCS8qIGNoaXAgaWQgc3RhcnQgKi8KKwl1aW50MzJfdCBkX1NPQ19DSElQX0lEX0FERFJFU1M7CisJdWludDMyX3QgZF9TT0NfQ0hJUF9JRF9WRVJTSU9OX01BU0s7CisJdWludDMyX3QgZF9TT0NfQ0hJUF9JRF9WRVJTSU9OX0xTQjsKKwl1aW50MzJfdCBkX1NPQ19DSElQX0lEX1JFVklTSU9OX01BU0s7CisJdWludDMyX3QgZF9TT0NfQ0hJUF9JRF9SRVZJU0lPTl9MU0I7CisJLyogY2hpcCBpZCBlbmQgKi8KKworCXVpbnQzMl90IGRfQV9TT0NfQ09SRV9TQ1JBVENIXzBfQUREUkVTUzsKKwl1aW50MzJfdCBkX0FfU09DX0NPUkVfU0NSQVRDSF8xX0FERFJFU1M7CisJdWludDMyX3QgZF9BX1NPQ19DT1JFX1NDUkFUQ0hfMl9BRERSRVNTOworCXVpbnQzMl90IGRfQV9TT0NfQ09SRV9TQ1JBVENIXzNfQUREUkVTUzsKKwl1aW50MzJfdCBkX0FfU09DX0NPUkVfU0NSQVRDSF80X0FERFJFU1M7CisJdWludDMyX3QgZF9BX1NPQ19DT1JFX1NDUkFUQ0hfNV9BRERSRVNTOworCXVpbnQzMl90IGRfQV9TT0NfQ09SRV9TQ1JBVENIXzZfQUREUkVTUzsKKwl1aW50MzJfdCBkX0FfU09DX0NPUkVfU0NSQVRDSF83X0FERFJFU1M7CisJdWludDMyX3QgZF9BX1NPQ19DT1JFX1NQQVJFXzBfUkVHSVNURVI7CisJdWludDMyX3QgZF9QQ0lFX0lOVFJfRklSTVdBUkVfUk9VVEVfTUFTSzsKKwl1aW50MzJfdCBkX0FfU09DX0NPUkVfUENJRV9JTlRSX0NBVVNFX0dSUDE7CisJdWludDMyX3QgZF9BX1NPQ19DT1JFX1NQQVJFXzFfUkVHSVNURVI7CisJdWludDMyX3QgZF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9DTFJfR1JQMTsKKwl1aW50MzJfdCBkX0FfU09DX0NPUkVfUENJRV9JTlRSX0VOQUJMRV9HUlAxOworCXVpbnQzMl90IGRfQV9TT0NfUENJRV9QQ0lFX1NDUkFUQ0hfMDsKKwl1aW50MzJfdCBkX0FfU09DX1BDSUVfUENJRV9TQ1JBVENIXzE7CisJdWludDMyX3QgZF9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX1RBUkdFVF9IT1NUX0RFTFRBOworCXVpbnQzMl90IGRfQV9TT0NfUENJRV9QQ0lFX1NDUkFUQ0hfMjsKKwl1aW50MzJfdCBkX0FfU09DX0NPUkVfUENJRV9JTlRSX0VOQUJMRV9HUlAwX1E2X01BU0s7CisKKwl1aW50MzJfdCBkX1dMQU5fREVCVUdfSU5QVVRfU0VMX09GRlNFVDsKKwl1aW50MzJfdCBkX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NU0I7CisJdWludDMyX3QgZF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTFNCOworCXVpbnQzMl90IGRfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01BU0s7CisJdWludDMyX3QgZF9XTEFOX0RFQlVHX0NPTlRST0xfT0ZGU0VUOworCXVpbnQzMl90IGRfV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9NU0I7CisJdWludDMyX3QgZF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX0xTQjsKKwl1aW50MzJfdCBkX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTUFTSzsKKwl1aW50MzJfdCBkX1dMQU5fREVCVUdfT1VUX09GRlNFVDsKKwl1aW50MzJfdCBkX1dMQU5fREVCVUdfT1VUX0RBVEFfTVNCOworCXVpbnQzMl90IGRfV0xBTl9ERUJVR19PVVRfREFUQV9MU0I7CisJdWludDMyX3QgZF9XTEFOX0RFQlVHX09VVF9EQVRBX01BU0s7CisJdWludDMyX3QgZF9BTUJBX0RFQlVHX0JVU19PRkZTRVQ7CisJdWludDMyX3QgZF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NU0I7CisJdWludDMyX3QgZF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9MU0I7CisJdWludDMyX3QgZF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NQVNLOworCXVpbnQzMl90IGRfQU1CQV9ERUJVR19CVVNfU0VMX01TQjsKKwl1aW50MzJfdCBkX0FNQkFfREVCVUdfQlVTX1NFTF9MU0I7CisJdWludDMyX3QgZF9BTUJBX0RFQlVHX0JVU19TRUxfTUFTSzsKKworI2lmZGVmIFFDQV9XSUZJXzNfMF9BRFJBU1RFQQorCXVpbnQzMl90IGRfUTZfRU5BQkxFX1JFR0lTVEVSXzA7CisJdWludDMyX3QgZF9RNl9FTkFCTEVfUkVHSVNURVJfMTsKKwl1aW50MzJfdCBkX1E2X0NBVVNFX1JFR0lTVEVSXzA7CisJdWludDMyX3QgZF9RNl9DQVVTRV9SRUdJU1RFUl8xOworCXVpbnQzMl90IGRfUTZfQ0xFQVJfUkVHSVNURVJfMDsKKwl1aW50MzJfdCBkX1E2X0NMRUFSX1JFR0lTVEVSXzE7CisjZW5kaWYKK307CisKKyNkZWZpbmUgQV9TT0NfQ09SRV9QQ0lFX0lOVFJfRU5BQkxFX0dSUDBfUTZfTUFTSyBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX0FfU09DX0NPUkVfUENJRV9JTlRSX0VOQUJMRV9HUlAwX1E2X01BU0spCisjZGVmaW5lIEFfU09DX0NPUkVfUENJRV9JTlRSX0NBVVNFX0dSUDEgXAorCShzY24tPnRhcmdldGRlZi0+ZF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9DQVVTRV9HUlAxKQorI2RlZmluZSBBX1NPQ19DT1JFX1NQQVJFXzFfUkVHSVNURVIgXAorCShzY24tPnRhcmdldGRlZi0+ZF9BX1NPQ19DT1JFX1NQQVJFXzFfUkVHSVNURVIpCisjZGVmaW5lIEFfU09DX0NPUkVfUENJRV9JTlRSX0NMUl9HUlAxIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfQV9TT0NfQ09SRV9QQ0lFX0lOVFJfQ0xSX0dSUDEpCisjZGVmaW5lIEFfU09DX0NPUkVfUENJRV9JTlRSX0VOQUJMRV9HUlAxIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfQV9TT0NfQ09SRV9QQ0lFX0lOVFJfRU5BQkxFX0dSUDEpCisjZGVmaW5lIEFfU09DX1BDSUVfUENJRV9TQ1JBVENIXzAgXAorCShzY24tPnRhcmdldGRlZi0+ZF9BX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8wKQorI2RlZmluZSBBX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8xIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfQV9TT0NfUENJRV9QQ0lFX1NDUkFUQ0hfMSkKKyNkZWZpbmUgQV9XSUZJX0FQQl8xX0FfV0ZTU19DRV9UQVJHRVRfSE9TVF9ERUxUQSBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfVEFSR0VUX0hPU1RfREVMVEEpCisjZGVmaW5lIEFfU09DX1BDSUVfUENJRV9TQ1JBVENIXzIgXAorCShzY24tPnRhcmdldGRlZi0+ZF9BX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8yKQorLyogZW5kIFE2IGlIZWxpdW0gZW11IHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSUVfSU5UUl9GSVJNV0FSRV9ST1VURV9NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfUENJRV9JTlRSX0ZJUk1XQVJFX1JPVVRFX01BU0spCisjZGVmaW5lIEFfU09DX0NPUkVfU1BBUkVfMF9SRUdJU1RFUiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX0FfU09DX0NPUkVfU1BBUkVfMF9SRUdJU1RFUikKKyNkZWZpbmUgQV9TT0NfQ09SRV9TQ1JBVENIXzBfQUREUkVTUyAgXAorCShzY24tPnRhcmdldGRlZi0+ZF9BX1NPQ19DT1JFX1NDUkFUQ0hfMF9BRERSRVNTKQorI2RlZmluZSBBX1NPQ19DT1JFX1NDUkFUQ0hfMV9BRERSRVNTICBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX0FfU09DX0NPUkVfU0NSQVRDSF8xX0FERFJFU1MpCisjZGVmaW5lIEFfU09DX0NPUkVfU0NSQVRDSF8yX0FERFJFU1MgIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfQV9TT0NfQ09SRV9TQ1JBVENIXzJfQUREUkVTUykKKyNkZWZpbmUgQV9TT0NfQ09SRV9TQ1JBVENIXzNfQUREUkVTUyAgXAorCShzY24tPnRhcmdldGRlZi0+ZF9BX1NPQ19DT1JFX1NDUkFUQ0hfM19BRERSRVNTKQorI2RlZmluZSBBX1NPQ19DT1JFX1NDUkFUQ0hfNF9BRERSRVNTICBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX0FfU09DX0NPUkVfU0NSQVRDSF80X0FERFJFU1MpCisjZGVmaW5lIEFfU09DX0NPUkVfU0NSQVRDSF81X0FERFJFU1MgIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfQV9TT0NfQ09SRV9TQ1JBVENIXzVfQUREUkVTUykKKyNkZWZpbmUgQV9TT0NfQ09SRV9TQ1JBVENIXzZfQUREUkVTUyAgXAorCShzY24tPnRhcmdldGRlZi0+ZF9BX1NPQ19DT1JFX1NDUkFUQ0hfNl9BRERSRVNTKQorI2RlZmluZSBBX1NPQ19DT1JFX1NDUkFUQ0hfN19BRERSRVNTICBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX0FfU09DX0NPUkVfU0NSQVRDSF83X0FERFJFU1MpCisjZGVmaW5lIFJUQ19TT0NfQkFTRV9BRERSRVNTICAoc2NuLT50YXJnZXRkZWYtPmRfUlRDX1NPQ19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFJUQ19XTUFDX0JBU0VfQUREUkVTUyAoc2NuLT50YXJnZXRkZWYtPmRfUlRDX1dNQUNfQkFTRV9BRERSRVNTKQorI2RlZmluZSBTWVNURU1fU0xFRVBfT0ZGU0VUICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NZU1RFTV9TTEVFUF9PRkZTRVQpCisjZGVmaW5lIFdMQU5fU1lTVEVNX1NMRUVQX09GRlNFVCBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fU1lTVEVNX1NMRUVQX09GRlNFVCkKKyNkZWZpbmUgV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9MU0IgXAorCShzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX0xTQikKKyNkZWZpbmUgV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9NQVNLKQorI2RlZmluZSBDTE9DS19DT05UUk9MX09GRlNFVCAoc2NuLT50YXJnZXRkZWYtPmRfQ0xPQ0tfQ09OVFJPTF9PRkZTRVQpCisjZGVmaW5lIENMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0spCisjZGVmaW5lIFJFU0VUX0NPTlRST0xfT0ZGU0VUICAgIChzY24tPnRhcmdldGRlZi0+ZF9SRVNFVF9DT05UUk9MX09GRlNFVCkKKyNkZWZpbmUgUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9NQVNLKQorI2RlZmluZSBSRVNFVF9DT05UUk9MX1NJMF9SU1RfTUFTSyBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLKQorI2RlZmluZSBXTEFOX1JFU0VUX0NPTlRST0xfT0ZGU0VUIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9SRVNFVF9DT05UUk9MX09GRlNFVCkKKyNkZWZpbmUgV0xBTl9SRVNFVF9DT05UUk9MX0NPTERfUlNUX01BU0sgXAorCShzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1JFU0VUX0NPTlRST0xfQ09MRF9SU1RfTUFTSykKKyNkZWZpbmUgV0xBTl9SRVNFVF9DT05UUk9MX1dBUk1fUlNUX01BU0sgXAorCShzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1JFU0VUX0NPTlRST0xfV0FSTV9SU1RfTUFTSykKKyNkZWZpbmUgR1BJT19CQVNFX0FERFJFU1MgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0dQSU9fQkFTRV9BRERSRVNTKQorI2RlZmluZSBHUElPX1BJTjBfT0ZGU0VUICAgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfR1BJT19QSU4wX09GRlNFVCkKKyNkZWZpbmUgR1BJT19QSU4xX09GRlNFVCAgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0dQSU9fUElOMV9PRkZTRVQpCisjZGVmaW5lIEdQSU9fUElOMF9DT05GSUdfTUFTSyAgIChzY24tPnRhcmdldGRlZi0+ZF9HUElPX1BJTjBfQ09ORklHX01BU0spCisjZGVmaW5lIEdQSU9fUElOMV9DT05GSUdfTUFTSyAgIChzY24tPnRhcmdldGRlZi0+ZF9HUElPX1BJTjFfQ09ORklHX01BU0spCisjZGVmaW5lIEFfU09DX0NPUkVfU0NSQVRDSF8wICAgIChzY24tPnRhcmdldGRlZi0+ZF9BX1NPQ19DT1JFX1NDUkFUQ0hfMCkKKyNkZWZpbmUgU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTFNCIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTFNCKQorI2RlZmluZSBTSV9DT05GSUdfQklESVJfT0RfREFUQV9NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTUFTSykKKyNkZWZpbmUgU0lfQ09ORklHX0kyQ19MU0IgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NJX0NPTkZJR19JMkNfTFNCKQorI2RlZmluZSBTSV9DT05GSUdfSTJDX01BU0sgXAorCShzY24tPnRhcmdldGRlZi0+ZF9TSV9DT05GSUdfSTJDX01BU0spCisjZGVmaW5lIFNJX0NPTkZJR19QT1NfU0FNUExFX0xTQiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1NJX0NPTkZJR19QT1NfU0FNUExFX0xTQikKKyNkZWZpbmUgU0lfQ09ORklHX1BPU19TQU1QTEVfTUFTSyBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1NJX0NPTkZJR19QT1NfU0FNUExFX01BU0spCisjZGVmaW5lIFNJX0NPTkZJR19JTkFDVElWRV9DTEtfTFNCIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19MU0IpCisjZGVmaW5lIFNJX0NPTkZJR19JTkFDVElWRV9DTEtfTUFTSyBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1NJX0NPTkZJR19JTkFDVElWRV9DTEtfTUFTSykKKyNkZWZpbmUgU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTFNCIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTFNCKQorI2RlZmluZSBTSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSykKKyNkZWZpbmUgU0lfQ09ORklHX0RJVklERVJfTFNCICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NJX0NPTkZJR19ESVZJREVSX0xTQikKKyNkZWZpbmUgU0lfQ09ORklHX0RJVklERVJfTUFTSyAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NJX0NPTkZJR19ESVZJREVSX01BU0spCisjZGVmaW5lIFNJX0JBU0VfQUREUkVTUyAgICAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9TSV9CQVNFX0FERFJFU1MpCisjZGVmaW5lIFNJX0NPTkZJR19PRkZTRVQgICAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9TSV9DT05GSUdfT0ZGU0VUKQorI2RlZmluZSBTSV9UWF9EQVRBMF9PRkZTRVQgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfU0lfVFhfREFUQTBfT0ZGU0VUKQorI2RlZmluZSBTSV9UWF9EQVRBMV9PRkZTRVQgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfU0lfVFhfREFUQTFfT0ZGU0VUKQorI2RlZmluZSBTSV9SWF9EQVRBMF9PRkZTRVQgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfU0lfUlhfREFUQTBfT0ZGU0VUKQorI2RlZmluZSBTSV9SWF9EQVRBMV9PRkZTRVQgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfU0lfUlhfREFUQTFfT0ZGU0VUKQorI2RlZmluZSBTSV9DU19PRkZTRVQgICAgICAgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfU0lfQ1NfT0ZGU0VUKQorI2RlZmluZSBTSV9DU19ET05FX0VSUl9NQVNLICAgICAoc2NuLT50YXJnZXRkZWYtPmRfU0lfQ1NfRE9ORV9FUlJfTUFTSykKKyNkZWZpbmUgU0lfQ1NfRE9ORV9JTlRfTUFTSyAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NJX0NTX0RPTkVfSU5UX01BU0spCisjZGVmaW5lIFNJX0NTX1NUQVJUX0xTQiAgICAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9TSV9DU19TVEFSVF9MU0IpCisjZGVmaW5lIFNJX0NTX1NUQVJUX01BU0sgICAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9TSV9DU19TVEFSVF9NQVNLKQorI2RlZmluZSBTSV9DU19SWF9DTlRfTFNCICAgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfU0lfQ1NfUlhfQ05UX0xTQikKKyNkZWZpbmUgU0lfQ1NfUlhfQ05UX01BU0sgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NJX0NTX1JYX0NOVF9NQVNLKQorI2RlZmluZSBTSV9DU19UWF9DTlRfTFNCICAgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfU0lfQ1NfVFhfQ05UX0xTQikKKyNkZWZpbmUgU0lfQ1NfVFhfQ05UX01BU0sgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NJX0NTX1RYX0NOVF9NQVNLKQorI2RlZmluZSBFRVBST01fU1ogICAgICAgICAgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfQk9BUkRfREFUQV9TWikKKyNkZWZpbmUgRUVQUk9NX0VYVF9TWiAgICAgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0JPQVJEX0VYVF9EQVRBX1NaKQorI2RlZmluZSBNQk9YX0JBU0VfQUREUkVTUyAgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfTUJPWF9CQVNFX0FERFJFU1MpCisjZGVmaW5lIExPQ0FMX1NDUkFUQ0hfT0ZGU0VUICAgIChzY24tPnRhcmdldGRlZi0+ZF9MT0NBTF9TQ1JBVENIX09GRlNFVCkKKyNkZWZpbmUgQ1BVX0NMT0NLX09GRlNFVCAgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0NQVV9DTE9DS19PRkZTRVQpCisjZGVmaW5lIExQT19DQUxfT0ZGU0VUICAgICAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9MUE9fQ0FMX09GRlNFVCkKKyNkZWZpbmUgR1BJT19QSU4xMF9PRkZTRVQgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0dQSU9fUElOMTBfT0ZGU0VUKQorI2RlZmluZSBHUElPX1BJTjExX09GRlNFVCAgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfR1BJT19QSU4xMV9PRkZTRVQpCisjZGVmaW5lIEdQSU9fUElOMTJfT0ZGU0VUICAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9HUElPX1BJTjEyX09GRlNFVCkKKyNkZWZpbmUgR1BJT19QSU4xM19PRkZTRVQgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0dQSU9fUElOMTNfT0ZGU0VUKQorI2RlZmluZSBDTE9DS19HUElPX09GRlNFVCAgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfQ0xPQ0tfR1BJT19PRkZTRVQpCisjZGVmaW5lIENQVV9DTE9DS19TVEFOREFSRF9MU0IgIChzY24tPnRhcmdldGRlZi0+ZF9DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCKQorI2RlZmluZSBDUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSyAoc2NuLT50YXJnZXRkZWYtPmRfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0spCisjZGVmaW5lIExQT19DQUxfRU5BQkxFX0xTQiAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9MUE9fQ0FMX0VOQUJMRV9MU0IpCisjZGVmaW5lIExQT19DQUxfRU5BQkxFX01BU0sgICAgIChzY24tPnRhcmdldGRlZi0+ZF9MUE9fQ0FMX0VOQUJMRV9NQVNLKQorI2RlZmluZSBDTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTFNCIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQikKKyNkZWZpbmUgQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX01BU0sgXAorCShzY24tPnRhcmdldGRlZi0+ZF9DTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTUFTSykKKyNkZWZpbmUgQU5BTE9HX0lOVEZfQkFTRV9BRERSRVNTIChzY24tPnRhcmdldGRlZi0+ZF9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MpCisjZGVmaW5lIFdMQU5fTUFDX0JBU0VfQUREUkVTUyAgICAoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9NQUNfQkFTRV9BRERSRVNTKQorI2RlZmluZSBGV19JTkRJQ0FUT1JfQUREUkVTUyAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0ZXX0lORElDQVRPUl9BRERSRVNTKQorI2RlZmluZSBEUkFNX0JBU0VfQUREUkVTUyAgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0RSQU1fQkFTRV9BRERSRVNTKQorI2RlZmluZSBTT0NfQ09SRV9CQVNFX0FERFJFU1MgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NPQ19DT1JFX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQ09SRV9DVFJMX0FERFJFU1MgICAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9DT1JFX0NUUkxfQUREUkVTUykKKyNkZWZpbmUgQ0VfQ09VTlQgICAgICAgICAgICAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9DRV9DT1VOVCkKKyNkZWZpbmUgUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTIChzY24tPnRhcmdldGRlZi0+ZF9QQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MpCisjZGVmaW5lIFBDSUVfSU5UUl9DTFJfQUREUkVTUyAgICAoc2NuLT50YXJnZXRkZWYtPmRfUENJRV9JTlRSX0NMUl9BRERSRVNTKQorI2RlZmluZSBQQ0lFX0lOVFJfRklSTVdBUkVfTUFTSyAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1BDSUVfSU5UUl9GSVJNV0FSRV9NQVNLKQorI2RlZmluZSBQQ0lFX0lOVFJfQ0VfTUFTS19BTEwgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1BDSUVfSU5UUl9DRV9NQVNLX0FMTCkKKyNkZWZpbmUgQ09SRV9DVFJMX0NQVV9JTlRSX01BU0sgIChzY24tPnRhcmdldGRlZi0+ZF9DT1JFX0NUUkxfQ1BVX0lOVFJfTUFTSykKKyNkZWZpbmUgUENJRV9JTlRSX0NBVVNFX0FERFJFU1MgIChzY24tPnRhcmdldGRlZi0+ZF9QQ0lFX0lOVFJfQ0FVU0VfQUREUkVTUykKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUyAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NPQ19SRVNFVF9DT05UUk9MX0FERFJFU1MpCisjZGVmaW5lIEhPU1RfR1JPVVAwX01BU0sgKFBDSUVfSU5UUl9GSVJNV0FSRV9NQVNLIHwgUENJRV9JTlRSX0NFX01BU0tfQUxMIHwgXAorCUFfU09DX0NPUkVfUENJRV9JTlRSX0VOQUJMRV9HUlAwX1E2X01BU0spCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0NFX1JTVF9NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfU09DX1JFU0VUX0NPTlRST0xfQ0VfUlNUX01BU0spCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfU09DX1JFU0VUX0NPTlRST0xfQ1BVX1dBUk1fUlNUX01BU0spCisjZGVmaW5lIENQVV9JTlRSX0FERFJFU1MgICAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9DUFVfSU5UUl9BRERSRVNTKQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDBfQUREUkVTUyBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1NPQ19MRl9USU1FUl9DT05UUk9MMF9BRERSRVNTKQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0sgXAorCShzY24tPnRhcmdldGRlZi0+ZF9TT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0spCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTFNCIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9MU0IpCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTUFTSyBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTUFTSykKKworI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX0dFVCh4KSBcCisJKCgoeCkgJiBTT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX01BU0spID4+IFwKKwkgU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9MU0IpCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfU0VUKHgpIFwKKwkoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX0xTQikgJiBcCisJCVNPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTUFTSykKKworLyogaGlmX3BjaS5jICovCisjZGVmaW5lIENISVBfSURfQUREUkVTUyAgICAgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NPQ19DSElQX0lEX0FERFJFU1MpCisjZGVmaW5lIFNPQ19DSElQX0lEX1JFVklTSU9OX01BU0sgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NPQ19DSElQX0lEX1JFVklTSU9OX01BU0spCisjZGVmaW5lIFNPQ19DSElQX0lEX1JFVklTSU9OX0xTQiAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NPQ19DSElQX0lEX1JFVklTSU9OX0xTQikKKyNkZWZpbmUgU09DX0NISVBfSURfVkVSU0lPTl9NQVNLICAoc2NuLT50YXJnZXRkZWYtPmRfU09DX0NISVBfSURfVkVSU0lPTl9NQVNLKQorI2RlZmluZSBTT0NfQ0hJUF9JRF9WRVJTSU9OX0xTQiAgIChzY24tPnRhcmdldGRlZi0+ZF9TT0NfQ0hJUF9JRF9WRVJTSU9OX0xTQikKKyNkZWZpbmUgQ0hJUF9JRF9SRVZJU0lPTl9HRVQoeCkgXAorCSgoKHgpICYgU09DX0NISVBfSURfUkVWSVNJT05fTUFTSykgPj4gU09DX0NISVBfSURfUkVWSVNJT05fTFNCKQorI2RlZmluZSBDSElQX0lEX1ZFUlNJT05fR0VUKHgpIFwKKwkoKCh4KSAmIFNPQ19DSElQX0lEX1ZFUlNJT05fTUFTSykgPj4gU09DX0NISVBfSURfVkVSU0lPTl9MU0IpCisvKiBoaWZfcGNpLmMgZW5kICovCisKKy8qIG1pc2MgKi8KKyNkZWZpbmUgU1JfV1JfSU5ERVhfQUREUkVTUyAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NSX1dSX0lOREVYX0FERFJFU1MpCisjZGVmaW5lIERTVF9XQVRFUk1BUktfQUREUkVTUyAgIChzY24tPnRhcmdldGRlZi0+ZF9EU1RfV0FURVJNQVJLX0FERFJFU1MpCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfT0ZGU0VUICAgIChzY24tPnRhcmdldGRlZi0+ZF9TT0NfUE9XRVJfUkVHX09GRlNFVCkKKy8qIGVuZCAqLworCisvKiBodHRfcnguYyAqLworI2RlZmluZSBSWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSyBcCisJKHBkZXYtPnRhcmdldGRlZi0+ZF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSykKKyNkZWZpbmUgUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX0xTQiBcCisJKHBkZXYtPnRhcmdldGRlZi0+ZF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTFNCKQorI2RlZmluZSBSWF9NUERVX1NUQVJUXzBfUkVUUllfTFNCICBcCisJKHBkZXYtPnRhcmdldGRlZi0+ZF9SWF9NUERVX1NUQVJUXzBfUkVUUllfTFNCKQorI2RlZmluZSBSWF9NUERVX1NUQVJUXzBfUkVUUllfTUFTSyAgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfTVBEVV9TVEFSVF8wX1JFVFJZX01BU0spCisjZGVmaW5lIFJYX01QRFVfU1RBUlRfMF9TRVFfTlVNX01BU0sgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTUFTSykKKyNkZWZpbmUgUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTFNCIFwKKwkocGRldi0+dGFyZ2V0ZGVmLT5kX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX0xTQikKKyNkZWZpbmUgUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX0xTQiBcCisJKHBkZXYtPnRhcmdldGRlZi0+ZF9SWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTFNCKQorI2RlZmluZSBSWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTUFTSyBcCisJKHBkZXYtPnRhcmdldGRlZi0+ZF9SWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTUFTSykKKyNkZWZpbmUgUlhfTVBEVV9TVEFSVF8yX1RJRF9MU0IgIFwKKwkocGRldi0+dGFyZ2V0ZGVmLT5kX1JYX01QRFVfU1RBUlRfMl9USURfTFNCKQorI2RlZmluZSBSWF9NUERVX1NUQVJUXzJfVElEX01BU0sgIFwKKwkocGRldi0+dGFyZ2V0ZGVmLT5kX1JYX01QRFVfU1RBUlRfMl9USURfTUFTSykKKyNkZWZpbmUgUlhfTVNEVV9FTkRfMV9LRVlfSURfT0NUX01BU0sgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfTVNEVV9FTkRfMV9LRVlfSURfT0NUX01BU0spCisjZGVmaW5lIFJYX01TRFVfRU5EXzFfS0VZX0lEX09DVF9MU0IgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfTVNEVV9FTkRfMV9LRVlfSURfT0NUX0xTQikKKyNkZWZpbmUgUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9NQVNLIFwKKwkocGRldi0+dGFyZ2V0ZGVmLT5kX1JYX01TRFVfRU5EXzFfRVhUX1dBUElfUE5fNjNfNDhfTUFTSykKKyNkZWZpbmUgUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0IgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0IpCisjZGVmaW5lIFJYX01TRFVfRU5EXzRfTEFTVF9NU0RVX01BU0sgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTUFTSykKKyNkZWZpbmUgUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCIFwKKwkocGRldi0+dGFyZ2V0ZGVmLT5kX1JYX01TRFVfRU5EXzRfTEFTVF9NU0RVX0xTQikKKyNkZWZpbmUgUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTUFTSyBcCisJKHBkZXYtPnRhcmdldGRlZi0+ZF9SWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9NQVNLKQorI2RlZmluZSBSWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9MU0IgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTFNCKQorI2RlZmluZSBSWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9NQVNLIFwKKwkocGRldi0+dGFyZ2V0ZGVmLT5kX1JYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX01BU0spCisjZGVmaW5lIFJYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX0xTQiBcCisJKHBkZXYtPnRhcmdldGRlZi0+ZF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0IpCisjZGVmaW5lIFJYX0FUVEVOVElPTl8wX01QRFVfTEVOR1RIX0VSUl9NQVNLIFwKKwkocGRldi0+dGFyZ2V0ZGVmLT5kX1JYX0FUVEVOVElPTl8wX01QRFVfTEVOR1RIX0VSUl9NQVNLKQorI2RlZmluZSBSWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX01BU0sgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9NQVNLKQorI2RlZmluZSBSWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX0xTQiBcCisJKHBkZXYtPnRhcmdldGRlZi0+ZF9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX0xTQikKKyNkZWZpbmUgUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX01BU0sgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX01BU0spCisjZGVmaW5lIFJYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9MU0IgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX0xTQikKKyNkZWZpbmUgUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9PRkZTRVQgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9PRkZTRVQpCisjZGVmaW5lIFJYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTUFTSyBcCisJKHBkZXYtPnRhcmdldGRlZi0+ZF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX01BU0spCisjZGVmaW5lIFJYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTFNCIFwKKwkocGRldi0+dGFyZ2V0ZGVmLT5kX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTFNCKQorI2RlZmluZSBSWF9NUERVX1NUQVJUXzBfRU5DUllQVEVEX01BU0sgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9NQVNLKQorI2RlZmluZSBSWF9NUERVX1NUQVJUXzBfRU5DUllQVEVEX0xTQiBcCisJKHBkZXYtPnRhcmdldGRlZi0+ZF9SWF9NUERVX1NUQVJUXzBfRU5DUllQVEVEX0xTQikKKyNkZWZpbmUgUlhfQVRURU5USU9OXzBfTU9SRV9EQVRBX01BU0sgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfQVRURU5USU9OXzBfTU9SRV9EQVRBX01BU0spCisjZGVmaW5lIFJYX0FUVEVOVElPTl8wX01TRFVfRE9ORV9NQVNLIFwKKwkocGRldi0+dGFyZ2V0ZGVmLT5kX1JYX0FUVEVOVElPTl8wX01TRFVfRE9ORV9NQVNLKQorI2RlZmluZSBSWF9BVFRFTlRJT05fMF9UQ1BfVURQX0NIS1NVTV9GQUlMX01BU0sgXAorCShwZGV2LT50YXJnZXRkZWYtPmRfUlhfQVRURU5USU9OXzBfVENQX1VEUF9DSEtTVU1fRkFJTF9NQVNLKQorLyogZW5kICovCisKKy8qIGNvcHlfZW5naW5lLmMgKi8KKy8qIGVuZCAqLworLyogUExMIHN0YXJ0ICovCisjZGVmaW5lIEVGVVNFX09GRlNFVCAgICAgICAgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0VGVVNFX09GRlNFVCkKKyNkZWZpbmUgRUZVU0VfWFRBTF9TRUxfTVNCICAgICAgICAoc2NuLT50YXJnZXRkZWYtPmRfRUZVU0VfWFRBTF9TRUxfTVNCKQorI2RlZmluZSBFRlVTRV9YVEFMX1NFTF9MU0IgICAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9FRlVTRV9YVEFMX1NFTF9MU0IpCisjZGVmaW5lIEVGVVNFX1hUQUxfU0VMX01BU0sgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0VGVVNFX1hUQUxfU0VMX01BU0spCisjZGVmaW5lIEJCX1BMTF9DT05GSUdfT0ZGU0VUICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0JCX1BMTF9DT05GSUdfT0ZGU0VUKQorI2RlZmluZSBCQl9QTExfQ09ORklHX09VVERJVl9NU0IgIChzY24tPnRhcmdldGRlZi0+ZF9CQl9QTExfQ09ORklHX09VVERJVl9NU0IpCisjZGVmaW5lIEJCX1BMTF9DT05GSUdfT1VURElWX0xTQiAgKHNjbi0+dGFyZ2V0ZGVmLT5kX0JCX1BMTF9DT05GSUdfT1VURElWX0xTQikKKyNkZWZpbmUgQkJfUExMX0NPTkZJR19PVVRESVZfTUFTSyAoc2NuLT50YXJnZXRkZWYtPmRfQkJfUExMX0NPTkZJR19PVVRESVZfTUFTSykKKyNkZWZpbmUgQkJfUExMX0NPTkZJR19GUkFDX01TQiAgICAoc2NuLT50YXJnZXRkZWYtPmRfQkJfUExMX0NPTkZJR19GUkFDX01TQikKKyNkZWZpbmUgQkJfUExMX0NPTkZJR19GUkFDX0xTQiAgICAoc2NuLT50YXJnZXRkZWYtPmRfQkJfUExMX0NPTkZJR19GUkFDX0xTQikKKyNkZWZpbmUgQkJfUExMX0NPTkZJR19GUkFDX01BU0sgICAoc2NuLT50YXJnZXRkZWYtPmRfQkJfUExMX0NPTkZJR19GUkFDX01BU0spCisjZGVmaW5lIFdMQU5fUExMX1NFVFRMRV9USU1FX01TQiAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX1NFVFRMRV9USU1FX01TQikKKyNkZWZpbmUgV0xBTl9QTExfU0VUVExFX1RJTUVfTFNCICAoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9QTExfU0VUVExFX1RJTUVfTFNCKQorI2RlZmluZSBXTEFOX1BMTF9TRVRUTEVfVElNRV9NQVNLIChzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NQVNLKQorI2RlZmluZSBXTEFOX1BMTF9TRVRUTEVfT0ZGU0VUICAgIChzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1BMTF9TRVRUTEVfT0ZGU0VUKQorI2RlZmluZSBXTEFOX1BMTF9TRVRUTEVfU1dfTUFTSyAgIChzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1BMTF9TRVRUTEVfU1dfTUFTSykKKyNkZWZpbmUgV0xBTl9QTExfU0VUVExFX1JTVE1BU0sgICAoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9QTExfU0VUVExFX1JTVE1BU0spCisjZGVmaW5lIFdMQU5fUExMX1NFVFRMRV9SRVNFVCAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX1NFVFRMRV9SRVNFVCkKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NU0IgIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NU0IpCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfTk9QV0RfTFNCICBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTFNCKQorI2RlZmluZSBXTEFOX1BMTF9DT05UUk9MX05PUFdEX01BU0sgXAorCShzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1BMTF9DT05UUk9MX05PUFdEX01BU0spCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfQllQQVNTX01TQiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01TQikKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTFNCIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTFNCKQorI2RlZmluZSBXTEFOX1BMTF9DT05UUk9MX0JZUEFTU19NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTUFTSykKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfUkVTRVQgXAorCShzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19SRVNFVCkKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01TQiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9NU0IpCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9MU0IgXAorCShzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTFNCKQorI2RlZmluZSBXTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTUFTSyBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9NQVNLKQorI2RlZmluZSBXTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfUkVTRVQgXAorCShzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfUkVTRVQpCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfUkVGRElWX01TQiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX01TQikKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTFNCIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTFNCKQorI2RlZmluZSBXTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTUFTSykKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfUkVTRVQgXAorCShzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9SRVNFVCkKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9ESVZfTVNCICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfRElWX01TQikKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9ESVZfTFNCICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfRElWX0xTQikKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9ESVZfTUFTSyAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfRElWX01BU0spCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfRElWX1JFU0VUIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9QTExfQ09OVFJPTF9ESVZfUkVTRVQpCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfT0ZGU0VUICAgIChzY24tPnRhcmdldGRlZi0+ZF9XTEFOX1BMTF9DT05UUk9MX09GRlNFVCkKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9TV19NQVNLICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfU1dfTUFTSykKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9SU1RNQVNLICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfUlNUTUFTSykKKyNkZWZpbmUgV0xBTl9QTExfQ09OVFJPTF9SRVNFVCAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fUExMX0NPTlRST0xfUkVTRVQpCisjZGVmaW5lIFNPQ19DT1JFX0NMS19DVFJMX09GRlNFVCAgIChzY24tPnRhcmdldGRlZi0+ZF9TT0NfQ09SRV9DTEtfQ1RSTF9PRkZTRVQpCisjZGVmaW5lIFNPQ19DT1JFX0NMS19DVFJMX0RJVl9NU0IgIChzY24tPnRhcmdldGRlZi0+ZF9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTVNCKQorI2RlZmluZSBTT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTFNCICAoc2NuLT50YXJnZXRkZWYtPmRfU09DX0NPUkVfQ0xLX0NUUkxfRElWX0xTQikKKyNkZWZpbmUgU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0sgXAorCShzY24tPnRhcmdldGRlZi0+ZF9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTUFTSykKKyNkZWZpbmUgUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NU0IgXAorCShzY24tPnRhcmdldGRlZi0+ZF9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX01TQikKKyNkZWZpbmUgUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19MU0IgXAorCShzY24tPnRhcmdldGRlZi0+ZF9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX0xTQikKKyNkZWZpbmUgUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NQVNLKQorI2RlZmluZSBSVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX1JFU0VUIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19SRVNFVCkKKyNkZWZpbmUgUlRDX1NZTkNfU1RBVFVTX09GRlNFVCAgICAgIChzY24tPnRhcmdldGRlZi0+ZF9SVENfU1lOQ19TVEFUVVNfT0ZGU0VUKQorI2RlZmluZSBTT0NfQ1BVX0NMT0NLX09GRlNFVCAgICAgICAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1NPQ19DUFVfQ0xPQ0tfT0ZGU0VUKQorI2RlZmluZSBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01TQiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTVNCKQorI2RlZmluZSBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCKQorI2RlZmluZSBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgXAorCShzY24tPnRhcmdldGRlZi0+ZF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0spCisvKiBQTEwgZW5kICovCisKKy8qIFNFVCBtYWNyb3MgKi8KKyNkZWZpbmUgV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9TRVQoeCkgXAorCSgoKHgpIDw8IFdMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTFNCKSAmIFwKKwkgICAgV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9NQVNLKQorI2RlZmluZSBTSV9DT05GSUdfQklESVJfT0RfREFUQV9TRVQoeCkgXAorCSgoKHgpIDw8IFNJX0NPTkZJR19CSURJUl9PRF9EQVRBX0xTQikgJiBTSV9DT05GSUdfQklESVJfT0RfREFUQV9NQVNLKQorI2RlZmluZSBTSV9DT05GSUdfSTJDX1NFVCh4KSAgKCgoeCkgPDwgU0lfQ09ORklHX0kyQ19MU0IpICYgU0lfQ09ORklHX0kyQ19NQVNLKQorI2RlZmluZSBTSV9DT05GSUdfUE9TX1NBTVBMRV9TRVQoeCkgXAorCSgoKHgpIDw8IFNJX0NPTkZJR19QT1NfU0FNUExFX0xTQikgJiBTSV9DT05GSUdfUE9TX1NBTVBMRV9NQVNLKQorI2RlZmluZSBTSV9DT05GSUdfSU5BQ1RJVkVfQ0xLX1NFVCh4KSBcCisJKCgoeCkgPDwgU0lfQ09ORklHX0lOQUNUSVZFX0NMS19MU0IpICYgU0lfQ09ORklHX0lOQUNUSVZFX0NMS19NQVNLKQorI2RlZmluZSBTSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9TRVQoeCkgXAorCSgoKHgpIDw8IFNJX0NPTkZJR19JTkFDVElWRV9EQVRBX0xTQikgJiBTSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9NQVNLKQorI2RlZmluZSBTSV9DT05GSUdfRElWSURFUl9TRVQoeCkgXAorCSgoKHgpIDw8IFNJX0NPTkZJR19ESVZJREVSX0xTQikgJiBTSV9DT05GSUdfRElWSURFUl9NQVNLKQorI2RlZmluZSBTSV9DU19TVEFSVF9TRVQoeCkgICgoKHgpIDw8IFNJX0NTX1NUQVJUX0xTQikgJiBTSV9DU19TVEFSVF9NQVNLKQorI2RlZmluZSBTSV9DU19SWF9DTlRfU0VUKHgpICgoKHgpIDw8IFNJX0NTX1JYX0NOVF9MU0IpICYgU0lfQ1NfUlhfQ05UX01BU0spCisjZGVmaW5lIFNJX0NTX1RYX0NOVF9TRVQoeCkgKCgoeCkgPDwgU0lfQ1NfVFhfQ05UX0xTQikgJiBTSV9DU19UWF9DTlRfTUFTSykKKyNkZWZpbmUgTFBPX0NBTF9FTkFCTEVfU0VUKHgpIFwKKwkoKCh4KSA8PCBMUE9fQ0FMX0VOQUJMRV9MU0IpICYgTFBPX0NBTF9FTkFCTEVfTUFTSykKKyNkZWZpbmUgQ1BVX0NMT0NLX1NUQU5EQVJEX1NFVCh4KSBcCisJKCgoeCkgPDwgQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQikgJiBDUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSykKKyNkZWZpbmUgQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX1NFVCh4KSBcCisJKCgoeCkgPDwgQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQikgJiBDTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTUFTSykKKy8qIGNvcHlfZW5naW5lLmMgKi8KKy8qIGVuZCAqLworLyogUExMIHN0YXJ0ICovCisjZGVmaW5lIEVGVVNFX1hUQUxfU0VMX0dFVCh4KSBcCisJKCgoeCkgJiBFRlVTRV9YVEFMX1NFTF9NQVNLKSA+PiBFRlVTRV9YVEFMX1NFTF9MU0IpCisjZGVmaW5lIEVGVVNFX1hUQUxfU0VMX1NFVCh4KSBcCisJKCgoeCkgPDwgRUZVU0VfWFRBTF9TRUxfTFNCKSAmIEVGVVNFX1hUQUxfU0VMX01BU0spCisjZGVmaW5lIEJCX1BMTF9DT05GSUdfT1VURElWX0dFVCh4KSBcCisJKCgoeCkgJiBCQl9QTExfQ09ORklHX09VVERJVl9NQVNLKSA+PiBCQl9QTExfQ09ORklHX09VVERJVl9MU0IpCisjZGVmaW5lIEJCX1BMTF9DT05GSUdfT1VURElWX1NFVCh4KSBcCisJKCgoeCkgPDwgQkJfUExMX0NPTkZJR19PVVRESVZfTFNCKSAmIEJCX1BMTF9DT05GSUdfT1VURElWX01BU0spCisjZGVmaW5lIEJCX1BMTF9DT05GSUdfRlJBQ19HRVQoeCkgXAorCSgoKHgpICYgQkJfUExMX0NPTkZJR19GUkFDX01BU0spID4+IEJCX1BMTF9DT05GSUdfRlJBQ19MU0IpCisjZGVmaW5lIEJCX1BMTF9DT05GSUdfRlJBQ19TRVQoeCkgXAorCSgoKHgpIDw8IEJCX1BMTF9DT05GSUdfRlJBQ19MU0IpICYgQkJfUExMX0NPTkZJR19GUkFDX01BU0spCisjZGVmaW5lIFdMQU5fUExMX1NFVFRMRV9USU1FX0dFVCh4KSBcCisJKCgoeCkgJiBXTEFOX1BMTF9TRVRUTEVfVElNRV9NQVNLKSA+PiBXTEFOX1BMTF9TRVRUTEVfVElNRV9MU0IpCisjZGVmaW5lIFdMQU5fUExMX1NFVFRMRV9USU1FX1NFVCh4KSBcCisJKCgoeCkgPDwgV0xBTl9QTExfU0VUVExFX1RJTUVfTFNCKSAmIFdMQU5fUExMX1NFVFRMRV9USU1FX01BU0spCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfTk9QV0RfR0VUKHgpIFwKKwkoKCh4KSAmIFdMQU5fUExMX0NPTlRST0xfTk9QV0RfTUFTSykgPj4gV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9MU0IpCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfTk9QV0RfU0VUKHgpIFwKKwkoKCh4KSA8PCBXTEFOX1BMTF9DT05UUk9MX05PUFdEX0xTQikgJiBXTEFOX1BMTF9DT05UUk9MX05PUFdEX01BU0spCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfQllQQVNTX0dFVCh4KSBcCisJKCgoeCkgJiBXTEFOX1BMTF9DT05UUk9MX0JZUEFTU19NQVNLKSA+PiBXTEFOX1BMTF9DT05UUk9MX0JZUEFTU19MU0IpCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfQllQQVNTX1NFVCh4KSBcCisJKCgoeCkgPDwgV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTFNCKSAmIFdMQU5fUExMX0NPTlRST0xfQllQQVNTX01BU0spCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9HRVQoeCkgXAorCSgoKHgpICYgV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01BU0spID4+IFdMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9MU0IpCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9TRVQoeCkgXAorCSgoKHgpIDw8IFdMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9MU0IpICYgV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01BU0spCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfUkVGRElWX0dFVCh4KSBcCisJKCgoeCkgJiBXTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NQVNLKSA+PiBXTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9MU0IpCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfUkVGRElWX1NFVCh4KSBcCisJKCgoeCkgPDwgV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTFNCKSAmIFdMQU5fUExMX0NPTlRST0xfUkVGRElWX01BU0spCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfRElWX0dFVCh4KSBcCisJKCgoeCkgJiBXTEFOX1BMTF9DT05UUk9MX0RJVl9NQVNLKSA+PiBXTEFOX1BMTF9DT05UUk9MX0RJVl9MU0IpCisjZGVmaW5lIFdMQU5fUExMX0NPTlRST0xfRElWX1NFVCh4KSBcCisJKCgoeCkgPDwgV0xBTl9QTExfQ09OVFJPTF9ESVZfTFNCKSAmIFdMQU5fUExMX0NPTlRST0xfRElWX01BU0spCisjZGVmaW5lIFNPQ19DT1JFX0NMS19DVFJMX0RJVl9HRVQoeCkgXAorCSgoKHgpICYgU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0spID4+IFNPQ19DT1JFX0NMS19DVFJMX0RJVl9MU0IpCisjZGVmaW5lIFNPQ19DT1JFX0NMS19DVFJMX0RJVl9TRVQoeCkgXAorCSgoKHgpIDw8IFNPQ19DT1JFX0NMS19DVFJMX0RJVl9MU0IpICYgU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0spCisjZGVmaW5lIFJUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfR0VUKHgpIFwKKwkoKCh4KSAmIFJUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTUFTSykgPj4gXAorCQlSVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX0xTQikKKyNkZWZpbmUgUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19TRVQoeCkgXAorCSgoKHgpIDw8IFJUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTFNCKSAmIFwKKwkJUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NQVNLKQorI2RlZmluZSBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0dFVCh4KSBcCisJKCgoeCkgJiBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0spID4+IFNPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCKQorI2RlZmluZSBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX1NFVCh4KSBcCisJKCgoeCkgPDwgU09DX0NQVV9DTE9DS19TVEFOREFSRF9MU0IpICYgU09DX0NQVV9DTE9DS19TVEFOREFSRF9NQVNLKQorLyogUExMIGVuZCAqLworCisjaWZkZWYgUUNBX1dJRklfM18wX0FEUkFTVEVBCisjZGVmaW5lIFE2X0VOQUJMRV9SRUdJU1RFUl8wIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfUTZfRU5BQkxFX1JFR0lTVEVSXzApCisjZGVmaW5lIFE2X0VOQUJMRV9SRUdJU1RFUl8xIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfUTZfRU5BQkxFX1JFR0lTVEVSXzEpCisjZGVmaW5lIFE2X0NBVVNFX1JFR0lTVEVSXzAgXAorCShzY24tPnRhcmdldGRlZi0+ZF9RNl9DQVVTRV9SRUdJU1RFUl8wKQorI2RlZmluZSBRNl9DQVVTRV9SRUdJU1RFUl8xIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfUTZfQ0FVU0VfUkVHSVNURVJfMSkKKyNkZWZpbmUgUTZfQ0xFQVJfUkVHSVNURVJfMCBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1E2X0NMRUFSX1JFR0lTVEVSXzApCisjZGVmaW5lIFE2X0NMRUFSX1JFR0lTVEVSXzEgXAorCShzY24tPnRhcmdldGRlZi0+ZF9RNl9DTEVBUl9SRUdJU1RFUl8xKQorI2VuZGlmCisKK3N0cnVjdCBob3N0ZGVmX3MgeworCUFfVUlOVDMyIGRfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTFNCOworCUFfVUlOVDMyIGRfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTUFTSzsKKwlBX1VJTlQzMiBkX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9MU0I7CisJQV9VSU5UMzIgZF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTUFTSzsKKwlBX1VJTlQzMiBkX0lOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTFNCOworCUFfVUlOVDMyIGRfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9NQVNLOworCUFfVUlOVDMyIGRfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX0xTQjsKKwlBX1VJTlQzMiBkX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9NQVNLOworCUFfVUlOVDMyIGRfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTFNCOworCUFfVUlOVDMyIGRfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTUFTSzsKKwlBX1VJTlQzMiBkX0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTFNCOworCUFfVUlOVDMyIGRfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19NQVNLOworCUFfVUlOVDMyIGRfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTFNCOworCUFfVUlOVDMyIGRfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSzsKKwlBX1VJTlQzMiBkX0lOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1M7CisJQV9VSU5UMzIgZF9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQjsKKwlBX1VJTlQzMiBkX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSzsKKwlBX1VJTlQzMiBkX0hPU1RfSU5UX1NUQVRVU19BRERSRVNTOworCUFfVUlOVDMyIGRfQ1BVX0lOVF9TVEFUVVNfQUREUkVTUzsKKwlBX1VJTlQzMiBkX0VSUk9SX0lOVF9TVEFUVVNfQUREUkVTUzsKKwlBX1VJTlQzMiBkX0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX01BU0s7CisJQV9VSU5UMzIgZF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0I7CisJQV9VSU5UMzIgZF9FUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPV19NQVNLOworCUFfVUlOVDMyIGRfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTFNCOworCUFfVUlOVDMyIGRfRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPV19NQVNLOworCUFfVUlOVDMyIGRfRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPV19MU0I7CisJQV9VSU5UMzIgZF9DT1VOVF9ERUNfQUREUkVTUzsKKwlBX1VJTlQzMiBkX0hPU1RfSU5UX1NUQVRVU19DUFVfTUFTSzsKKwlBX1VJTlQzMiBkX0hPU1RfSU5UX1NUQVRVU19DUFVfTFNCOworCUFfVUlOVDMyIGRfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX01BU0s7CisJQV9VSU5UMzIgZF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTFNCOworCUFfVUlOVDMyIGRfSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTUFTSzsKKwlBX1VJTlQzMiBkX0hPU1RfSU5UX1NUQVRVU19DT1VOVEVSX0xTQjsKKwlBX1VJTlQzMiBkX1JYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTOworCUFfVUlOVDMyIGRfV0lORE9XX0RBVEFfQUREUkVTUzsKKwlBX1VJTlQzMiBkX1dJTkRPV19SRUFEX0FERFJfQUREUkVTUzsKKwlBX1VJTlQzMiBkX1dJTkRPV19XUklURV9BRERSX0FERFJFU1M7CisJQV9VSU5UMzIgZF9TT0NfR0xPQkFMX1JFU0VUX0FERFJFU1M7CisJQV9VSU5UMzIgZF9SVENfU1RBVEVfQUREUkVTUzsKKwlBX1VJTlQzMiBkX1JUQ19TVEFURV9DT0xEX1JFU0VUX01BU0s7CisJQV9VSU5UMzIgZF9QQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUzsKKwlBX1VJTlQzMiBkX1BDSUVfU09DX1dBS0VfUkVTRVQ7CisJQV9VSU5UMzIgZF9QQ0lFX1NPQ19XQUtFX0FERFJFU1M7CisJQV9VSU5UMzIgZF9QQ0lFX1NPQ19XQUtFX1ZfTUFTSzsKKwlBX1VJTlQzMiBkX1JUQ19TVEFURV9WX01BU0s7CisJQV9VSU5UMzIgZF9SVENfU1RBVEVfVl9MU0I7CisJQV9VSU5UMzIgZF9GV19JTkRfRVZFTlRfUEVORElORzsKKwlBX1VJTlQzMiBkX0ZXX0lORF9JTklUSUFMSVpFRDsKKwlBX1VJTlQzMiBkX0ZXX0lORF9IRUxQRVI7CisJQV9VSU5UMzIgZF9SVENfU1RBVEVfVl9PTjsKKyNpZiBkZWZpbmVkKFNESU9fM18wKQorCUFfVUlOVDMyIGRfSE9TVF9JTlRfU1RBVFVTX01CT1hfREFUQV9NQVNLOworCUFfVUlOVDMyIGRfSE9TVF9JTlRfU1RBVFVTX01CT1hfREFUQV9MU0I7CisjZW5kaWYKKwlBX1VJTlQzMiBkX1BDSUVfU09DX1JEWV9TVEFUVVNfQUREUkVTUzsKKwlBX1VJTlQzMiBkX1BDSUVfU09DX1JEWV9TVEFUVVNfQkFSX01BU0s7CisJQV9VSU5UMzIgZF9TT0NfUENJRV9CQVNFX0FERFJFU1M7CisJQV9VSU5UMzIgZF9NU0lfTUFHSUNfQURSX0FERFJFU1M7CisJQV9VSU5UMzIgZF9NU0lfTUFHSUNfQUREUkVTUzsKKwl1aW50MzJfdCBkX0hPU1RfQ0VfQ09VTlQ7CisJdWludDMyX3QgZF9FTkFCTEVfTVNJOworCXVpbnQzMl90IGRfTVVYX0lEX01BU0s7CisJdWludDMyX3QgZF9UUkFOU0FDVElPTl9JRF9NQVNLOworCXVpbnQzMl90IGRfREVTQ19EQVRBX0ZMQUdfTUFTSzsKKwl1aW50MzJfdCBkX0FfU09DX1BDSUVfUENJRV9CQVIwX1NUQVJUOworfTsKKyNkZWZpbmUgQV9TT0NfUENJRV9QQ0lFX0JBUjBfU1RBUlQgKHNjbi0+aG9zdGRlZi0+ZF9BX1NPQ19QQ0lFX1BDSUVfQkFSMF9TVEFSVCkKKyNkZWZpbmUgREVTQ19EQVRBX0ZMQUdfTUFTSyAgICAgICAgKHNjbi0+aG9zdGRlZi0+ZF9ERVNDX0RBVEFfRkxBR19NQVNLKQorI2RlZmluZSBNVVhfSURfTUFTSyAgICAgICAgICAgICAgICAoc2NuLT5ob3N0ZGVmLT5kX01VWF9JRF9NQVNLKQorI2RlZmluZSBUUkFOU0FDVElPTl9JRF9NQVNLICAgICAgICAoc2NuLT5ob3N0ZGVmLT5kX1RSQU5TQUNUSU9OX0lEX01BU0spCisjZGVmaW5lIEhPU1RfQ0VfQ09VTlQgICAgICAgICAgICAgIChzY24tPmhvc3RkZWYtPmRfSE9TVF9DRV9DT1VOVCkKKyNkZWZpbmUgRU5BQkxFX01TSSAgICAgICAgICAgICAgICAgKHNjbi0+aG9zdGRlZi0+ZF9FTkFCTEVfTVNJKQorI2RlZmluZSBJTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9MU0IgXAorCShzY24tPmhvc3RkZWYtPmRfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTFNCKQorI2RlZmluZSBJTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9NQVNLIFwKKwkoc2NuLT5ob3N0ZGVmLT5kX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX01BU0spCisjZGVmaW5lIElOVF9TVEFUVVNfRU5BQkxFX0NQVV9MU0IgIChzY24tPmhvc3RkZWYtPmRfSU5UX1NUQVRVU19FTkFCTEVfQ1BVX0xTQikKKyNkZWZpbmUgSU5UX1NUQVRVU19FTkFCTEVfQ1BVX01BU0sgKHNjbi0+aG9zdGRlZi0+ZF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTUFTSykKKyNkZWZpbmUgSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9MU0IgXAorCShzY24tPmhvc3RkZWYtPmRfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9MU0IpCisjZGVmaW5lIElOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTUFTSyBcCisJKHNjbi0+aG9zdGRlZi0+ZF9JTlRfU1RBVFVTX0VOQUJMRV9DT1VOVEVSX01BU0spCisjZGVmaW5lIElOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9MU0IgXAorCShzY24tPmhvc3RkZWYtPmRfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX0xTQikKKyNkZWZpbmUgSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX01BU0sgXAorCShzY24tPmhvc3RkZWYtPmRfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX01BU0spCisjZGVmaW5lIEVSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX0xTQiBcCisJKHNjbi0+aG9zdGRlZi0+ZF9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19MU0IpCisjZGVmaW5lIEVSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX01BU0sgXAorCShzY24tPmhvc3RkZWYtPmRfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTUFTSykKKyNkZWZpbmUgRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19MU0IgXAorCShzY24tPmhvc3RkZWYtPmRfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19MU0IpCisjZGVmaW5lIEVSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTUFTSyBcCisJKHNjbi0+aG9zdGRlZi0+ZF9FUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XX01BU0spCisjZGVmaW5lIENPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiBcCisJKHNjbi0+aG9zdGRlZi0+ZF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IpCisjZGVmaW5lIENPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX01BU0sgXAorCShzY24tPmhvc3RkZWYtPmRfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSykKKyNkZWZpbmUgSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUyBcCisJKHNjbi0+aG9zdGRlZi0+ZF9JTlRfU1RBVFVTX0VOQUJMRV9BRERSRVNTKQorI2RlZmluZSBDUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiBcCisJKHNjbi0+aG9zdGRlZi0+ZF9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQikKKyNkZWZpbmUgQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLIFwKKwkoc2NuLT5ob3N0ZGVmLT5kX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSykKKyNkZWZpbmUgSE9TVF9JTlRfU1RBVFVTX0FERFJFU1MgICAgIChzY24tPmhvc3RkZWYtPmRfSE9TVF9JTlRfU1RBVFVTX0FERFJFU1MpCisjZGVmaW5lIENQVV9JTlRfU1RBVFVTX0FERFJFU1MgICAgICAoc2NuLT5ob3N0ZGVmLT5kX0NQVV9JTlRfU1RBVFVTX0FERFJFU1MpCisjZGVmaW5lIEVSUk9SX0lOVF9TVEFUVVNfQUREUkVTUyAgICAoc2NuLT5ob3N0ZGVmLT5kX0VSUk9SX0lOVF9TVEFUVVNfQUREUkVTUykKKyNkZWZpbmUgRVJST1JfSU5UX1NUQVRVU19XQUtFVVBfTUFTSyBcCisJKHNjbi0+aG9zdGRlZi0+ZF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9NQVNLKQorI2RlZmluZSBFUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IgXAorCShzY24tPmhvc3RkZWYtPmRfRVJST1JfSU5UX1NUQVRVU19XQUtFVVBfTFNCKQorI2RlZmluZSBFUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPV19NQVNLIFwKKwkoc2NuLT5ob3N0ZGVmLT5kX0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX01BU0spCisjZGVmaW5lIEVSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX0xTQiBcCisJKHNjbi0+aG9zdGRlZi0+ZF9FUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPV19MU0IpCisjZGVmaW5lIEVSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSyBcCisJKHNjbi0+aG9zdGRlZi0+ZF9FUlJPUl9JTlRfU1RBVFVTX1RYX09WRVJGTE9XX01BU0spCisjZGVmaW5lIEVSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTFNCIFwKKwkoc2NuLT5ob3N0ZGVmLT5kX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTFNCKQorI2RlZmluZSBDT1VOVF9ERUNfQUREUkVTUyAgICAgICAgICAoc2NuLT5ob3N0ZGVmLT5kX0NPVU5UX0RFQ19BRERSRVNTKQorI2RlZmluZSBIT1NUX0lOVF9TVEFUVVNfQ1BVX01BU0sgICAoc2NuLT5ob3N0ZGVmLT5kX0hPU1RfSU5UX1NUQVRVU19DUFVfTUFTSykKKyNkZWZpbmUgSE9TVF9JTlRfU1RBVFVTX0NQVV9MU0IgICAgKHNjbi0+aG9zdGRlZi0+ZF9IT1NUX0lOVF9TVEFUVVNfQ1BVX0xTQikKKyNkZWZpbmUgSE9TVF9JTlRfU1RBVFVTX0VSUk9SX01BU0sgKHNjbi0+aG9zdGRlZi0+ZF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTUFTSykKKyNkZWZpbmUgSE9TVF9JTlRfU1RBVFVTX0VSUk9SX0xTQiAgKHNjbi0+aG9zdGRlZi0+ZF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTFNCKQorI2RlZmluZSBIT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9NQVNLIFwKKwkoc2NuLT5ob3N0ZGVmLT5kX0hPU1RfSU5UX1NUQVRVU19DT1VOVEVSX01BU0spCisjZGVmaW5lIEhPU1RfSU5UX1NUQVRVU19DT1VOVEVSX0xTQiBcCisJKHNjbi0+aG9zdGRlZi0+ZF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9MU0IpCisjZGVmaW5lIFJYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTIChzY24tPmhvc3RkZWYtPmRfUlhfTE9PS0FIRUFEX1ZBTElEX0FERFJFU1MpCisjZGVmaW5lIFdJTkRPV19EQVRBX0FERFJFU1MgICAgICAgIChzY24tPmhvc3RkZWYtPmRfV0lORE9XX0RBVEFfQUREUkVTUykKKyNkZWZpbmUgV0lORE9XX1JFQURfQUREUl9BRERSRVNTICAgKHNjbi0+aG9zdGRlZi0+ZF9XSU5ET1dfUkVBRF9BRERSX0FERFJFU1MpCisjZGVmaW5lIFdJTkRPV19XUklURV9BRERSX0FERFJFU1MgIChzY24tPmhvc3RkZWYtPmRfV0lORE9XX1dSSVRFX0FERFJfQUREUkVTUykKKyNkZWZpbmUgU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTICAgKHNjbi0+aG9zdGRlZi0+ZF9TT0NfR0xPQkFMX1JFU0VUX0FERFJFU1MpCisjZGVmaW5lIFJUQ19TVEFURV9BRERSRVNTICAgICAgICAgIChzY24tPmhvc3RkZWYtPmRfUlRDX1NUQVRFX0FERFJFU1MpCisjZGVmaW5lIFJUQ19TVEFURV9DT0xEX1JFU0VUX01BU0sgIChzY24tPmhvc3RkZWYtPmRfUlRDX1NUQVRFX0NPTERfUkVTRVRfTUFTSykKKyNkZWZpbmUgUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgICAgKHNjbi0+aG9zdGRlZi0+ZF9QQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUENJRV9TT0NfV0FLRV9SRVNFVCAgICAgICAgKHNjbi0+aG9zdGRlZi0+ZF9QQ0lFX1NPQ19XQUtFX1JFU0VUKQorI2RlZmluZSBQQ0lFX1NPQ19XQUtFX0FERFJFU1MgICAgICAoc2NuLT5ob3N0ZGVmLT5kX1BDSUVfU09DX1dBS0VfQUREUkVTUykKKyNkZWZpbmUgUENJRV9TT0NfV0FLRV9WX01BU0sgICAgICAgKHNjbi0+aG9zdGRlZi0+ZF9QQ0lFX1NPQ19XQUtFX1ZfTUFTSykKKyNkZWZpbmUgUlRDX1NUQVRFX1ZfTUFTSyAgICAgICAgICAgKHNjbi0+aG9zdGRlZi0+ZF9SVENfU1RBVEVfVl9NQVNLKQorI2RlZmluZSBSVENfU1RBVEVfVl9MU0IgICAgICAgICAgICAoc2NuLT5ob3N0ZGVmLT5kX1JUQ19TVEFURV9WX0xTQikKKyNkZWZpbmUgRldfSU5EX0VWRU5UX1BFTkRJTkcgICAgICAgKHNjbi0+aG9zdGRlZi0+ZF9GV19JTkRfRVZFTlRfUEVORElORykKKyNkZWZpbmUgRldfSU5EX0lOSVRJQUxJWkVEICAgICAgICAgKHNjbi0+aG9zdGRlZi0+ZF9GV19JTkRfSU5JVElBTElaRUQpCisjZGVmaW5lIEZXX0lORF9IRUxQRVIgICAgICAgICAgICAgIChzY24tPmhvc3RkZWYtPmRfRldfSU5EX0hFTFBFUikKKyNkZWZpbmUgUlRDX1NUQVRFX1ZfT04gICAgICAgICAgICAgKHNjbi0+aG9zdGRlZi0+ZF9SVENfU1RBVEVfVl9PTikKKyNpZiBkZWZpbmVkKFNESU9fM18wKQorI2RlZmluZSBIT1NUX0lOVF9TVEFUVVNfTUJPWF9EQVRBX01BU0sgXAorCShzY24tPmhvc3RkZWYtPmRfSE9TVF9JTlRfU1RBVFVTX01CT1hfREFUQV9NQVNLKQorI2RlZmluZSBIT1NUX0lOVF9TVEFUVVNfTUJPWF9EQVRBX0xTQiBcCisJKHNjbi0+aG9zdGRlZi0+ZF9IT1NUX0lOVF9TVEFUVVNfTUJPWF9EQVRBX0xTQikKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoU09DX1BDSUVfQkFTRV9BRERSRVNTKQorI2RlZmluZSBTT0NfUENJRV9CQVNFX0FERFJFU1MgMAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChQQ0lFX1NPQ19SRFlfU1RBVFVTX0FERFJFU1MpCisjZGVmaW5lIFBDSUVfU09DX1JEWV9TVEFUVVNfQUREUkVTUyAwCisjZGVmaW5lIFBDSUVfU09DX1JEWV9TVEFUVVNfQkFSX01BU0sgMAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChNU0lfTUFHSUNfQURSX0FERFJFU1MpCisjZGVmaW5lIE1TSV9NQUdJQ19BRFJfQUREUkVTUyAwCisjZGVmaW5lIE1TSV9NQUdJQ19BRERSRVNTIDAKKyNlbmRpZgorCisvKiBTRVQvR0VUIG1hY3JvcyAqLworI2RlZmluZSBJTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9TRVQoeCkgXAorCSgoKHgpIDw8IElOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX0xTQikgJiBJTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9NQVNLKQorI2RlZmluZSBJTlRfU1RBVFVTX0VOQUJMRV9DUFVfU0VUKHgpIFwKKwkoKCh4KSA8PCBJTlRfU1RBVFVTX0VOQUJMRV9DUFVfTFNCKSAmIElOVF9TVEFUVVNfRU5BQkxFX0NQVV9NQVNLKQorI2RlZmluZSBJTlRfU1RBVFVTX0VOQUJMRV9DT1VOVEVSX1NFVCh4KSBcCisJKCgoeCkgPDwgSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9MU0IpICYgXAorCQlJTlRfU1RBVFVTX0VOQUJMRV9DT1VOVEVSX01BU0spCisjZGVmaW5lIElOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9TRVQoeCkgXAorCSgoKHgpIDw8IElOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9MU0IpICYgXAorCSBJTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEFfTUFTSykKKyNkZWZpbmUgQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9TRVQoeCkgXAorCSgoKHgpIDw8IENQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTFNCKSAmIFwKKwkJQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLKQorI2RlZmluZSBFUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19TRVQoeCkgXAorCSgoKHgpIDw8IEVSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX0xTQikgJiBcCisJCUVSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX01BU0spCisjZGVmaW5lIEVSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfU0VUKHgpIFwKKwkoKCh4KSA8PCBFUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XX0xTQikgJiBcCisJCUVSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTUFTSykKKyNkZWZpbmUgQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfU0VUKHgpIFwKKwkoKCh4KSA8PCBDT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IpICYgXAorCQlDT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLKQorI2RlZmluZSBFUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9HRVQoeCkgXAorCSgoKHgpICYgRVJST1JfSU5UX1NUQVRVU19XQUtFVVBfTUFTSykgPj4gXAorCQlFUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IpCisjZGVmaW5lIEVSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX0dFVCh4KSBcCisJKCgoeCkgJiBFUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPV19NQVNLKSA+PiBcCisJCUVSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX0xTQikKKyNkZWZpbmUgRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPV19HRVQoeCkgXAorCSgoKHgpICYgRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPV19NQVNLKSA+PiBcCisJCUVSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTFNCKQorI2RlZmluZSBIT1NUX0lOVF9TVEFUVVNfQ1BVX0dFVCh4KSBcCisJKCgoeCkgJiBIT1NUX0lOVF9TVEFUVVNfQ1BVX01BU0spID4+IEhPU1RfSU5UX1NUQVRVU19DUFVfTFNCKQorI2RlZmluZSBIT1NUX0lOVF9TVEFUVVNfRVJST1JfR0VUKHgpIFwKKwkoKCh4KSAmIEhPU1RfSU5UX1NUQVRVU19FUlJPUl9NQVNLKSA+PiBIT1NUX0lOVF9TVEFUVVNfRVJST1JfTFNCKQorI2RlZmluZSBIT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9HRVQoeCkgXAorCSgoKHgpICYgSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTUFTSykgPj4gSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTFNCKQorI2RlZmluZSBSVENfU1RBVEVfVl9HRVQoeCkgXAorCSgoKHgpICYgUlRDX1NUQVRFX1ZfTUFTSykgPj4gUlRDX1NUQVRFX1ZfTFNCKQorI2lmIGRlZmluZWQoU0RJT18zXzApCisjZGVmaW5lIEhPU1RfSU5UX1NUQVRVU19NQk9YX0RBVEFfR0VUKHgpIFwKKwkoKCh4KSAmIEhPU1RfSU5UX1NUQVRVU19NQk9YX0RBVEFfTUFTSykgPj4gXAorCQlIT1NUX0lOVF9TVEFUVVNfTUJPWF9EQVRBX0xTQikKKyNlbmRpZgorCisjZGVmaW5lIElOVkFMSURfUkVHX0xPQ19EVU1NWV9EQVRBIDB4QUEKKworI2RlZmluZSBBUjYzMjBfQ09SRV9DTEtfRElWX0FERFIgICAgICAgIDB4NDAzZmE4CisjZGVmaW5lIEFSNjMyMF9DUFVfUExMX0lOSVRfRE9ORV9BRERSICAgMHg0MDNmZDAKKyNkZWZpbmUgQVI2MzIwX0NQVV9TUEVFRF9BRERSICAgICAgICAgICAweDQwM2ZhNAorI2RlZmluZSBBUjYzMjBWMl9DT1JFX0NMS19ESVZfQUREUiAgICAgIDB4NDAzZmQ4CisjZGVmaW5lIEFSNjMyMFYyX0NQVV9QTExfSU5JVF9ET05FX0FERFIgMHg0MDNmZDAKKyNkZWZpbmUgQVI2MzIwVjJfQ1BVX1NQRUVEX0FERFIgICAgICAgICAweDQwM2ZkNAorI2RlZmluZSBBUjYzMjBWM19DT1JFX0NMS19ESVZfQUREUiAgICAgIDB4NDA0MDI4CisjZGVmaW5lIEFSNjMyMFYzX0NQVV9QTExfSU5JVF9ET05FX0FERFIgMHg0MDQwMjAKKyNkZWZpbmUgQVI2MzIwVjNfQ1BVX1NQRUVEX0FERFIgICAgICAgICAweDQwNDAyNAorCit0eXBlZGVmIGVudW0geworCVNPQ19SRUZDTEtfVU5LTk9XTiA9IC0xLCAvKiBVbnN1cHBvcnRlZCByZWYgY2xvY2sgLS0gdXNlIFBMTCBCeXBhc3MgKi8KKwlTT0NfUkVGQ0xLXzQ4X01IWiA9IDAsCisJU09DX1JFRkNMS18xOV8yX01IWiA9IDEsCisJU09DX1JFRkNMS18yNF9NSFogPSAyLAorCVNPQ19SRUZDTEtfMjZfTUhaID0gMywKKwlTT0NfUkVGQ0xLXzM3XzRfTUhaID0gNCwKKwlTT0NfUkVGQ0xLXzM4XzRfTUhaID0gNSwKKwlTT0NfUkVGQ0xLXzQwX01IWiA9IDYsCisJU09DX1JFRkNMS181Ml9NSFogPSA3LAorfSBBX3JlZmNsa19zcGVlZF90OworCisjZGVmaW5lIEFfUkVGQ0xLX1VOS05PV04gICAgU09DX1JFRkNMS19VTktOT1dOCisjZGVmaW5lIEFfUkVGQ0xLXzQ4X01IWiAgICAgU09DX1JFRkNMS180OF9NSFoKKyNkZWZpbmUgQV9SRUZDTEtfMTlfMl9NSFogICBTT0NfUkVGQ0xLXzE5XzJfTUhaCisjZGVmaW5lIEFfUkVGQ0xLXzI0X01IWiAgICAgU09DX1JFRkNMS18yNF9NSFoKKyNkZWZpbmUgQV9SRUZDTEtfMjZfTUhaICAgICBTT0NfUkVGQ0xLXzI2X01IWgorI2RlZmluZSBBX1JFRkNMS18zN180X01IWiAgIFNPQ19SRUZDTEtfMzdfNF9NSFoKKyNkZWZpbmUgQV9SRUZDTEtfMzhfNF9NSFogICBTT0NfUkVGQ0xLXzM4XzRfTUhaCisjZGVmaW5lIEFfUkVGQ0xLXzQwX01IWiAgICAgU09DX1JFRkNMS180MF9NSFoKKyNkZWZpbmUgQV9SRUZDTEtfNTJfTUhaICAgICBTT0NfUkVGQ0xLXzUyX01IWgorCisjZGVmaW5lIFRBUkdFVF9DUFVfRlJFUSAxNzYwMDAwMDAKKworc3RydWN0IHdsYW5fcGxsX3MgeworCXVpbnQzMl90IHJlZmRpdjsKKwl1aW50MzJfdCBkaXY7CisJdWludDMyX3Qgcm5mcmFjOworCXVpbnQzMl90IG91dGRpdjsKK307CisKK3N0cnVjdCBjbW5vc19jbG9ja19zIHsKKwlBX3JlZmNsa19zcGVlZF90IHJlZmNsa19zcGVlZDsKKwl1aW50MzJfdCByZWZjbGtfaHo7CisJdWludDMyX3QgcGxsX3NldHRsaW5nX3RpbWU7ICAgICAvKiA1MHVzICovCisJc3RydWN0IHdsYW5fcGxsX3Mgd2xhbl9wbGw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBUR1RfUkVHX1NFQ1RJT04geworCXVpbnQzMl90IHN0YXJ0X2FkZHI7CisJdWludDMyX3QgZW5kX2FkZHI7Cit9IHRndF9yZWdfc2VjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgVEdUX1JFR19UQUJMRSB7CisJdGd0X3JlZ19zZWN0aW9uICpzZWN0aW9uOworCXVpbnQzMl90IHNlY3Rpb25fc2l6ZTsKK30gdGd0X3JlZ190YWJsZTsKKworc3RydWN0IG9sX3NvZnRjOwordm9pZCB0YXJnZXRfcmVnaXN0ZXJfdGJsX2F0dGFjaChzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdTMyIHRhcmdldF90eXBlKTsKK3ZvaWQgaGlmX3JlZ2lzdGVyX3RibF9hdHRhY2goc3RydWN0IG9sX3NvZnRjICpzY24sIHUzMiBoaWZfdHlwZSk7CisKK3N0cnVjdCBob3N0X3NoYWRvd19yZWdzX3MgeworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzA7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTsKKwl1aW50MzJfdCBkX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8yOworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzM7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfNDsKKwl1aW50MzJfdCBkX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV81OworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzY7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfNzsKKwl1aW50MzJfdCBkX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV84OworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzk7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTA7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTE7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTI7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTM7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTQ7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTU7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTY7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTc7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTg7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTk7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjA7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjE7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjI7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjM7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18wOworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMTsKKwl1aW50MzJfdCBkX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzI7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18zOworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfNDsKKwl1aW50MzJfdCBkX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzU7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU182OworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfNzsKKwl1aW50MzJfdCBkX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzg7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU185OworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMTA7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xMTsKKwl1aW50MzJfdCBkX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEyOworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMTM7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xNDsKKwl1aW50MzJfdCBkX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE1OworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMTY7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xNzsKKwl1aW50MzJfdCBkX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE4OworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMTk7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18yMDsKKwl1aW50MzJfdCBkX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIxOworCXVpbnQzMl90IGRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMjI7CisJdWludDMyX3QgZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18yMzsKK307CisKKyNlbmRpZiAvKiBfUkVHVEFCTEVfUENJRV9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oaWYvc3JjL2FkcmFzdGVhX3JlZ19kZWYuaCBiL2NvcmUvaGlmL3NyYy9hZHJhc3RlYV9yZWdfZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzZDIyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9hZHJhc3RlYV9yZWdfZGVmLmgKQEAgLTAsMCArMSwyMzUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBBRFJBU1RFQV9SRUdfREVGX0gKKyNkZWZpbmUgQURSQVNURUFfUkVHX0RFRl9ICisKKy8qCisgKiAgU3RhcnQgYXV0by1nZW5lcmF0ZWQgaGVhZGVycyBmcm9tIHJlZ2lzdGVyIHBhcnNlcgorICoKKyAqICBETyBOT1QgQ0hBTkdFIE1BTlVBTExZCisqLworCisKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NNRF9fU1JDX0ZMVVNIX19fUyAxCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTBfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fUyAxMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTFfU1JfQkFfTE9XICgweDAwMjQxMDAwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTExX01JU0NfSVNfX0FYSV9USU1FT1VUX0VSUl9fX00gMHgwMDAwMDQwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDFfX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U5X01JU0NfSVNfX0FYSV9USU1FT1VUX0VSUl9fX00gMHgwMDAwMDQwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzJfX0FERFJFU1NfUkVHSVNURVJfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfRk9SQ0VfV0FLRV9fX00gMHgwMDAwMDAwMQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX0NFX0lOVFJfTUlTQ19QX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU2X19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMiAoMHgwMDAzMDAyOCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxM19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9DTEVBUl9fRk9SQ0VfV0FLRV9DTEVBUl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19FWFRFUk5BTF9JTlRSX19fUE9SIDB4MDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNF9TUl9CQV9MT1cgKDB4MDAyNDQwMDApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0NPTlRST0xfX1NPRlRfUkVTRVRfX19NIDB4MDAwMDAwMDEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19fTSAweDAwMDAwM0ZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX0FQUFNfQ0VfSU5UUl9FTkFCTEVTX0NMRUFSX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE3X19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfRElSVFlfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NNRF9fSEFMVF9TVEFUVVNfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0ZPUkNFX1dBS0UgKDB4MDAwMzIwNjApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNV9TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxNV9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzYgKDB4MDAwMzAwMzgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fQ0VfSU5UUl9USU1FT1VUX1BfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NXX1NDUkFUQ0ggKDB4MDAwMzIwNjQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0FERFJFU1NfVkFMSURfX0JJVFNfX19QT1IgMHgwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RSX0JBX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzRfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U4X01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19ESVJUWV9fX00gMHgwMEZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTZfTUlTQ19JU19fQVhJX0JVU19FUlJfX19NIDB4MDAwMDAyMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19FUlJfUkVTUF9DTEVBUl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19GT1JDRV9XQUtFX0NMRUFSX19fUyAxCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMV9TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE1X19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTRfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U0X1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEzX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMl9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19TIDEwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTIyX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVNfX0VDQUhCX1RJTUVPVVRfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fTUNJTV9JTlRfX19NIDB4MDAwMDAwMTAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRV9fV0xBTjJfSFcyU1dfR1JBTlRfX19NIDB4MDAwMDAwODAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RSX1NJWkVfX1NJWkVfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19FQ0FIQl9USU1FT1VUX19fTSAweDAwMDAwMDEwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9TSVpFX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFM19TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MwX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMV9fU1JDX1JJTkdfQllURV9TV0FQX0VOX19fUyAxNworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyX19WQUxVRV9SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19JTlZBTElEX0FERFJfQUNDRVNTX19fTSAweDAwMDNGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE5X19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTBfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX19fTSAweDAwMDAwMDAyCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUkNfV1JfSU5ERVhfX1NSQ19XUl9JTkRFWF9fX00gMHgwMDAwRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRV9DT01NT05fV1JBUFBFUl9DRV9XUkFQUEVSX0hPU1RfSU5URVJSVVBUX1NVTU1BUllfX19NIDB4MDBGRkYwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfQUREUkVTU19WQUxJRF9fX00gMHgwMEZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JfQkFfSElHSF9fQkFTRV9BRERSX0hJR0hfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UxMF9NSVNDX0lTX19BWElfQlVTX0VSUl9fX00gMHgwMDAwMDIwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxOF9fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzQgKDB4MDAwMzAwMzApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRThfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxNF9fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTVfU1JfQkFfTE9XX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFM19NSVNDX0lTX19BWElfQlVTX0VSUl9fX00gMHgwMDAwMDIwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fU1JDX0xFTl9FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fQ0VfSU5UUl9USU1FT1VUX1BfX19NIDB4MDAwMDAxMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19FQ0FIQl9USU1FT1VUX19fUyA0CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTIyX19WQUxVRV9SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fU1JDX1JJTkdfTE9XX1dBVEVSTUFSS19fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfQ09OVFJPTF9fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19ESVJUWV9CSVRfU0VUX19fTSAweDAwMDAwMDAxCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EU1RfV1JfSU5ERVggKDB4MDAyNDAwNDApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTICgweDAwMjQwMDM4KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU1X19WQUxVRV9SRUdJU1RFUl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX0lOVkFMSURfQkJfMV9JTlRSX19fUyAxMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU1X19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTBfX1ZBTFVFX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTZfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfQ09OVFJPTF9fU1JfUExMX1JFRl9NVVhfU0VMX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFU19DTEVBUiAoMHgwMDJGMTAwOCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyMF9fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyM19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTlfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzdfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFNF9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX0RTVF9NQVhfTEVOX1ZJT19fX00gMHgwMDAwMDA4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxNV9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX0JBX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE0X19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSVNfX0RTVF9SSU5HX0xPV19XQVRFUk1BUktfX19NIDB4MDAwMDAwMTAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxN19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19QTU1fU1JfTVNCX19TVEFUVVNfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTZfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U1X01JU0NfSVNfX0FYSV9USU1FT1VUX0VSUl9fX1MgMTAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19XQ1NTQU9OX1NSX0xTQl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTExX01JU0NfSVNfX0FYSV9USU1FT1VUX0VSUl9fX1MgMTAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFOV9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fQVBQU19DRV9JTlRSX0VOQUJMRVNfQ0xFQVJfX19NIDB4MDAwMDBGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxMV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ01EX19TUkNfRkxVU0hfX19NIDB4MDAwMDAwMDIKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M1X19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjAgKDB4MDAwMzAwNzApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUkNfV0FURVJNQVJLX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RTVF9XUl9JTkRFWF9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEyICgweDAwMDMyMDMwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9DT05UUk9MX19DTE9DS19HQVRFX0RJU0FCTEVfX19NIDB4MDAwMDAwMDIKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fQVBQU19DRV9JTlRSX0VOQUJMRVNfU0VUX19DRV9JTlRSX0xJTkVfSE9TVF9QX19fUE9SIDB4MDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fRVhURVJOQUxfSU5UUl9fX1MgMTgKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfVEVTVEJVU19fU0VMRUNUX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU5X19WQUxVRV9SRUdJU1RFUl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFNUX1dSX0lOREVYX19EU1RfV1JfSU5ERVhfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U3X01JU0NfSVNfX0FYSV9USU1FT1VUX0VSUl9fX00gMHgwMDAwMDQwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFU19fX00gMHgwMDAwMEZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19XQ1NTQU9OX1NSX0xTQiAoMHgwMDAzMjA3MCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19XTEFOMl9IVzJTV19HUkFOVF9fX00gMHgwMDAwMDA4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxMl9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX0FYSV9USU1FT1VUX0VSUl9fX1MgMTAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjFfX1ZBTFVFX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyMl9fQUREUkVTU19SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTlfU1JfQkFfTE9XX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTFfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTBfU1JfQkFfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMl9NSVNDX0lTX19BWElfQlVTX0VSUl9fX00gMHgwMDAwMDIwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzZfX0FERFJFU1NfUkVHSVNURVJfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX0RTVF9SSU5HX09WRVJGTE9XX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfQ0xFQVJfX1dMQU4yX0hXMlNXX0dSQU5UX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFU19DTEVBUl9fQ0VfSU5UUl9MSU5FX0hPU1RfUF9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRThfU1JfQkFfTE9XX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX1NUQVRVU19fUE1NX1NSX1hPX1NFVFRMRV9USU1FT1VUX19fUyA5CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lFX19DT1BZX0NPTVBMRVRFX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNl9NSVNDX0lTX19BWElfQlVTX0VSUl9fX1MgOQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIxX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEwX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9CQV9ISUdIX19CQVNFX0FERFJfSElHSF9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU5X19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTRfX1ZBTFVFX1JFR0lTVEVSX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9TSVpFX19TSVpFX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUkNfV1JfSU5ERVhfX19NIDB4MDAwMEZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMl9fVkFMVUVfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzZfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxNF9fQUREUkVTU19SRUdJU1RFUl9fX1BPUiAweDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19JTlZBTElEX0FERFJfQUNDRVNTX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMV9TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFNl9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX0JBX0hJR0hfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTExX1NSX0JBX0xPV19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lFX19EU1RfUklOR19ISUdIX1dBVEVSTUFSS19fX00gMHgwMDAwMDAwOAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxNV9fVkFMVUVfUkVHSVNURVJfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxNl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTNfX1ZBTFVFX1JFR0lTVEVSX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE4X19WQUxVRV9SRUdJU1RFUl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0ZPUkNFX1dBS0VfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxN19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFJfQkFfSElHSF9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTNV9fQUREUkVTU19SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JU19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ1VSUkVOVF9TUlJJX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEzICgweDAwMDMyMDM0KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUzX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMyAoMHgwMDAzMDAyQykKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MzX19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0lOVkFMSURfQUREUl9BQ0NFU1NfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfQUREUkVTU19WQUxJRCAoMHgwMDAzMDBFMCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjIgKDB4MDAwMzIwNTgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTNF9fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUwX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTExX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lFX19TUkNfUklOR19PVkVSRkxPV19fX00gMHgwMDAwMDAyMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIyX19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMV9fTVNJX0VOX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19QTU1fU1JfTVNCX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE5X19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE1X19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U4X1NSX0JBX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfQ0xFQVJfX1ZBTFVFX1JFR19VUERBVEVEX1dJVEhfSU5WQUxJRF9BRERSX19fTSAweDAwMDAwMDIwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjNfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fQVBQU19DRV9JTlRSX0VOQUJMRVNfQ0xFQVJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JfU0laRV9fU0laRV9fX00gMHgwMDAwRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19WQUxVRV9SRUdfVVBEQVRFRF9XSVRIX0lOVkFMSURfQUREUl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwyX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFM19NSVNDX0lTX19BWElfQlVTX0VSUl9fX1MgOQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTJfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTlfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSUVfX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTQgKDB4MDAwMzAwNTgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMl9fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFJfQkFfSElHSF9fX00gMHgwMDAwMDA3RgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9DT05UUk9MX19DTE9DS19HQVRFX0RJU0FCTEVfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMV9fSURYX1VQRF9FTl9fX1MgMTkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfUE1NX1NSX01TQl9fU1RBVFVTX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTBfX1ZBTFVFX1JFR0lTVEVSX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9CQV9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTJfU1JfQkFfTE9XX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEgKDB4MDAwMzIwMDQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTOF9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTlfU1JfQkFfTE9XX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19TUkNfUklOR19PVkVSRkxPV19fX1MgNQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JDX1dBVEVSTUFSS19fU1JfSElHSF9XQVRFUl9NQVJLX1RIUkVTSE9MRF9fX00gMHgwMDAwRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyM19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX0JNSF9JTlRfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxOF9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTNfU1JfQkFfTE9XX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTOF9fQUREUkVTU19SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dSRUdfU1RBVFVTX19XQ1NTX0NPUkVfV0FLRV9TTEVFUF9TVEFURV9fX00gMHgwMDAwMDAwOAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzFfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfX19NIDB4MDAwMDAwMDQKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRV9fRElSVFlfQklUX1NFVF9FTkFCTEVfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U2X1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX0FQUFNfQ0VfSU5UUl9FTkFCTEVTX1NFVF9fQ0VfSU5UUl9MSU5FX0hPU1RfUF9fX00gMHgwMDAwMEZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxNCAoMHgwMDAzMjAzOCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfQ09OVFJPTF9fU1JfUkZfWE9fTVVYX1NFTF9fX00gMHgwMDAwMDAxMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRThfTUlTQ19JU19fQVhJX0JVU19FUlJfX19NIDB4MDAwMDAyMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MzX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lFX19DT1BZX0NPTVBMRVRFX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEyX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX1NFQ1VSRV9XUkFQUEVSX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfX01JU0NfX19NIDB4MDAwMDBGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjFfX1ZBTFVFX1JFR0lTVEVSX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFOV9TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxN19fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRV9fUE1NX1NSX1hPX1NFVFRMRV9USU1FT1VUX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzExX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lFX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMV9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19TIDEwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0NPTU1JVF9SRVBMQVlfX0VOQUJMRV9fX00gMHgwMDAwMDAwMQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU3X19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0FERFJFU1NfVkFMSURfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19MQ01IX1NUUk9CRV9JTlRFUlJVUFRfX19TIDEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfV0NTU0FPTl9TUl9NU0JfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTlfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fUyAxMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEyX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEwX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTOV9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lFX19EU1RfUklOR19MT1dfV0FURVJNQVJLX19fTSAweDAwMDAwMDEwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTFfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSUVfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UzX01JU0NfSVNfX0FYSV9USU1FT1VUX0VSUl9fX00gMHgwMDAwMDQwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JU19fRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19fX1MgNAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JU19fX00gMHgwMDAwMDAxRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyMyAoMHgwMDAzMjA1QykKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUUgKDB4MDAyNDAwMzQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTJfX0FERFJFU1NfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxX19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTZfX0FERFJFU1NfUkVHSVNURVJfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfU0VDVVJFX1dSQVBQRVJfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE3X19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1BNTV9TUl9NU0JfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRV9TRUNVUkVfV1JBUFBFUl9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZICgweDAwMjREMDAwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTVfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMThfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE1ICgweDAwMDMwMDVDKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEwX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fV0xBTjFfU0xQX1RNUl9JTlRSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19DT01NSVRfUkVQTEFZX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyMl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE5X19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DVVJSRU5UX1NSUklfX0NVUlJFTlRfU1JSSV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JRSAoMHgwMDI0MDAyQykKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U2X1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19fX1MgNAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTRfTUlTQ19JU19fQVhJX0JVU19FUlJfX19NIDB4MDAwMDAyMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9DTEVBUl9fUE1NX1NSX1hPX1NFVFRMRV9USU1FT1VUX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19XTEFOMl9IVzJTV19HUkFOVF9fX1MgNworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxMV9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX0JBX0hJR0hfX19NIDB4MDAwMDAwMUYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTFfTUlTQ19JU19fQVhJX0JVU19FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0lOVkFMSURfQUREUl9BQ0NFU1NfX0FERFJFU1NfQklUU18xN19UT18yX19fTSAweDAwMDBGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVNfX0VDQUhCX1RJTUVPVVRfX19NIDB4MDAwMDAwMTAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX0FYSV9USU1FT1VUX0VSUl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfU0VDVVJFX1dSQVBQRVJfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9fX00gMHgwMUZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFJfQkFfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lFX19QQVJTRVJfSU5UX19fUE9SIDB4MDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19DT1BZX0NPTVBMRVRFX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19JTlZBTElEX0FERFJfQUNDRVNTX19BRERSRVNTX0JJVFNfMTdfVE9fMl9fX1BPUiAweDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfU0VDVVJFX1dSQVBQRVJfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9fSUxMX1JFR19fX1MgMjQKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M2X19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DVVJSRU5UX1NSUklfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTFfU1JfQkFfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lFX19EU1RfUklOR19PVkVSRkxPV19fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxOV9fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTFfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX0FQUFNfQ0VfSU5UUl9FTkFCTEVTX0NMRUFSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNl9TUl9CQV9MT1dfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XUkVHX1NUQVRVU19fU1RBVEVfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMCAoMHgwMDAzMjAwMCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyM19fQUREUkVTU19SRUdJU1RFUl9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JDX1dBVEVSTUFSS19fU1JfTE9XX1dBVEVSX01BUktfVEhSRVNPTERfX19NIDB4RkZGRjAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UyX1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxMF9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSICgweDAwMDMwMDE0KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEwX19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEyX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19DRV9JTlRSX01JU0NfUF9fX00gMHgwMDAwMDA4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxMV9fVkFMVUVfUkVHSVNURVJfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjAgKDB4MDAwMzIwNTApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fTE1IX0lOVF9fX1MgMworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ1VSUkVOVF9EUlJJX19DVVJSRU5UX0RSUklfX19NIDB4MDAwMEZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRV9fRVJSX1JFU1BfRU5BQkxFX19fUyAyCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTBfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19XTEFOMl9TTFBfVE1SX0lOVFJfX19NIDB4MDAwMDgwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxOF9fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxNF9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSQ19XUl9JTkRFWF9fU1JDX1dSX0lOREVYX19fUE9SIDB4MDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTVfTUlTQ19JU19fQVhJX0JVU19FUlJfX19NIDB4MDAwMDAyMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFN19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTdfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyM19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNF9TUl9CQV9MT1dfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwxX19TUkNfUklOR19CWVRFX1NXQVBfRU5fX19NIDB4MDAwMjAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UxMV9TUl9CQV9MT1cgKDB4MDAyNEIwMDApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX0FQUFNfQ0VfSU5UUl9FTkFCTEVTX1NFVCAoMHgwMDJGMTAwNCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMiAoMHgwMDAzMjAwOCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U3X1NSX0JBX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFJfQkFfSElHSF9fREVTQ19TS0lQX0RXT1JEX19fUyA1CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lFX19TUkNfUklOR19ISUdIX1dBVEVSTUFSS19fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfVEVTVEJVU19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EU1RfV0FURVJNQVJLX19EUl9MT1dfV0FURVJfTUFSS19USFJFU0hPTERfX19NIDB4RkZGRjAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0ZPUkNFX1dBS0VfX0ZPUkNFX1dBS0VfRU5BQkxFX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9CQV9ISUdIX19CQVNFX0FERFJfSElHSF9fX1BPUiAweDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNF9TUl9CQV9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19GT1JDRV9XQUtFX0VOQUJMRV9fX00gMHgwMDAwMDAwMgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEyX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fQVBQU19DRV9JTlRSX0VOQUJMRVNfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX0JNSF9JTlRfX19NIDB4MDAwMDAwMDEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwyX19EU1RfQVhJX01BWF9MRU5fX19TIDIKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RSX0JBX0hJR0hfX0RFU0NfU0tJUF9EV09SRF9fX00gMHgwMDAwMDA2MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fU01IX0lOVF9fX1MgNgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTVfU1JfQkFfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fRVhURVJOQUxfSU5UUl9fX00gMHgwRkZDMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU3X19WQUxVRV9SRUdJU1RFUl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxX19WQUxVRV9SRUdJU1RFUl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ1VSUkVOVF9EUlJJX19DVVJSRU5UX0RSUklfX19QT1IgMHgwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTM19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTdfX0FERFJFU1NfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX1NUQVRVU19fSU5WQUxJRF9BRERSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE3X19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVNfX1dMQU4xX0hXMlNXX0dSQU5UX19fUyA2CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX1BNTV9XQ1NTX1dBS0VVUF9JUlFfQUNLX19fUyA4CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9TSVpFX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNV9TUl9CQV9MT1cgKDB4MDAyNDUwMDApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUkNfV1JfSU5ERVhfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSVNfX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjIgKDB4MDAwMzAwNzgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fU01IX0lOVF9fX00gMHgwMDAwMDA0MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDJfX19QT1IgMHgwMDAwMDAwNQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzRfX0FERFJFU1NfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfQ09NTUlUX1JFUExBWV9fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ1VSUkVOVF9EUlJJX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NNRF9fSEFMVF9TVEFUVVNfX19TIDMKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX1NUQVRVU19fRElSVFlfQklUX1NFVF9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRV9TRUNVUkVfV1JBUFBFUl9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX19NSVNDX19fUE9SIDB4MDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1dDU1NBT05fU1JfTFNCX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX0ZPUkNFX1dBS0VfRU5BQkxFX19fUyAxCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lFX19TUkNfUklOR19PVkVSRkxPV19fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfSU5WQUxJRF9BRERSX0FDQ0VTU19fQUREUkVTU19CSVRTXzE3X1RPXzJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfQ0xFQVJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU2X19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTFfU1JfQkFfTE9XX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DVVJSRU5UX0RSUklfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U4X1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMl9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxMV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTdfU1JfQkFfTE9XX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M2X19BRERSRVNTX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE2X19WQUxVRV9SRUdJU1RFUl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDJfX0RTVF9BWElfTUFYX0xFTl9fX1BPUiAweDEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSQ19XQVRFUk1BUksgKDB4MDAyNDAwNEMpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVNfX0VSUl9SRVNQX19fTSAweDAwMDAwMDA0CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lFX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVNfX1BNTV9XQ1NTX1dBS0VVUF9JUlFfQUNLX19fTSAweDAwMDAwMTAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fSU5WQUxJRF9CQl8yX0lOVFJfX19TIDExCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTRfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTcgKDB4MDAwMzAwNjQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE2X19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRThfX1ZBTFVFX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTlfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFJfQkFfTE9XICgweDAwMjQwMDBDKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX0lOVkFMSURfQkJfMV9JTlRSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19BRERSRVNTX1ZBTElEX19CSVRTX19fTSAweDAwRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9CQV9ISUdIX19ERVNDX1NLSVBfRFdPUkRfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTBfU1JfQkFfTE9XICgweDAwMjRBMDAwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19XTEFOMV9IVzJTV19HUkFOVF9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxNV9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfQ0xFQVJfX0lOVkFMSURfQUREUl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTJfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSQ19XQVRFUk1BUktfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19NQ0lNX0lOVF9fX1MgNAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxM19fVkFMVUVfUkVHSVNURVJfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RTVF9XQVRFUk1BUktfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U0X1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTdfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTlfX1ZBTFVFX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwyX19TUkNfQVhJX01BWF9MRU5fX19NIDB4MDAwMDAwMDMKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M4X19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEwX19WQUxVRV9SRUdJU1RFUl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU4X19WQUxVRV9SRUdJU1RFUl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzVfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fRFNUX1JJTkdfT1ZFUkZMT1dfX19NIDB4MDAwMDAwNDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19QTU1fV0NTU19XQUtFVVBfSVJRX0FDS19fX00gMHgwMDAwMDEwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxMl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFNUX1dBVEVSTUFSS19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTBfU1JfQkFfTE9XX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV1JFR19TVEFUVVMgKDB4MDAwMzAwMDgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFOV9TUl9CQV9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9DT05UUk9MX19TUl9QTExfUkVGX01VWF9TRUxfX19TIDMKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M4X19BRERSRVNTX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMV9fTVNJX0VOX19fTSAweDAwMDEwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjJfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX1BBUlNFUl9JTlRfX19NIDB4MDAwRkY4MDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX1NSQ19MRU5fRVJSX19fUyA4CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX0VDQUhCX1RJTUVPVVRfX19NIDB4MDAwMDAwMTAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxNl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzFfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxOSAoMHgwMDAzMjA0QykKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSUVfX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX19fUyAzCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19TIDEwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFM19NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19TIDEwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTNSAoMHgwMDAzMDAzNCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX1NSQ19SSU5HX09WRVJGTE9XX19fTSAweDAwMDAwMDIwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX0FQUFNfQ0VfSU5UUl9FTkFCTEVTX0NMRUFSX19DRV9JTlRSX0xJTkVfSE9TVF9QX19fTSAweDAwMDAwRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1dfU0NSQVRDSF9fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRV9TRUNVUkVfV1JBUFBFUl9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX19IT1NUX19fTSAweDAwRkZGMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFM19NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRThfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfQ09OVFJPTF9fU1JfUkZfWE9fTVVYX1NFTF9fX1MgNAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDFfX01TSV9FTl9fX1MgMTYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTNfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19WQUxVRV9SRUdfVVBEQVRFRF9XSVRIX0lOVkFMSURfQUREUl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX19NIDB4MDAwRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX1BBUlNFUl9JTlRfX19NIDB4MDAwRkY4MDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMThfX1ZBTFVFX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUkNfV0FURVJNQVJLX19TUl9ISUdIX1dBVEVSX01BUktfVEhSRVNIT0xEX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyM19fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX1dGU1NfREJHX0lOVFJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTBfX1ZBTFVFX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U2X1NSX0JBX0xPV19fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFJfU0laRV9fU0laRV9fX00gMHgwMDAwRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ1VSUkVOVF9EUlJJX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fU1dfU0xQX1RNUl9JTlRSX19fTSAweDAwMDEwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EU1RfV0FURVJNQVJLX19EUl9ISUdIX1dBVEVSX01BUktfVEhSRVNIT0xEX19fUE9SIDB4MDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFU19fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEzX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9TSVpFX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFM19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9DTEVBUl9fUE1NX1dDU1NfV0FLRVVQX0lSUV9BQ0tfX19TIDgKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfV0NTU0FPTl9TUl9MU0JfX1NUQVRVU19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fRFNUX01BWF9MRU5fVklPX19fTSAweDAwMDAwMDgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX0NPTU1PTl9XUkFQUEVSX0NFX1dSQVBQRVJfSE9TVF9JTlRFUlJVUFRfU1VNTUFSWV9fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEzX19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9TSVpFX19TSVpFX19fUE9SIDB4MDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEwX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lTX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTUgKDB4MDAwMzIwMTQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX1RFU1RCVVNfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTJfX1ZBTFVFX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U0X01JU0NfSVNfX0FYSV9USU1FT1VUX0VSUl9fX1MgMTAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwxX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVMgKDB4MDAwMzAwMEMpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTFfTUlTQ19JU19fQVhJX0JVU19FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFOV9NSVNDX0lTX19BWElfQlVTX0VSUl9fX00gMHgwMDAwMDIwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19ESVJUWV9CSVRfU0VUX0NMRUFSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTN19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9DTEVBUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFJfQkFfSElHSF9fQkFTRV9BRERSX0hJR0hfX19NIDB4MDAwMDAwMUYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MwX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U0X1NSX0JBX0xPV19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ01EX19TUkNfRkxVU0hfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EU1RfV0FURVJNQVJLX19EUl9MT1dfV0FURVJfTUFSS19USFJFU0hPTERfX19TIDE2CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNV9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTkgKDB4MDAwMzIwMjQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19DT1BZX0NPTVBMRVRFX19fTSAweDAwMDAwMDAxCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DTURfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfSU5WQUxJRF9BRERSX0FDQ0VTU19fV1JJVEVfQUNDRVNTX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JRV9fX00gMHgwMDAwMDAxRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIzX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lFX19DT1BZX0NPTVBMRVRFX19fTSAweDAwMDAwMDAxCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTIxX19WQUxVRV9SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fUEFSU0VSX0lOVF9fX1MgMTEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyMV9fQUREUkVTU19SRUdJU1RFUl9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIwX19BRERSRVNTX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EU1RfV1JfSU5ERVhfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfU0VDVVJFX1dSQVBQRVJfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9fSE9TVF9fX1BPUiAweDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fRFNUX1JJTkdfT1ZFUkZMT1dfX19TIDYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTNfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U3X1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX1dMQU4xX1NMUF9UTVJfSU5UUl9fX00gMHgwMDAwNDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfQ0xFQVJfX0VSUl9SRVNQX0NMRUFSX19fTSAweDAwMDAwMDA0CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE1X19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFM19TUl9CQV9MT1dfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV1JFR19TVEFUVVNfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfSU5WQUxJRF9BRERSX0FDQ0VTU19fV1JJVEVfQUNDRVNTX19fTSAweDAwMDIwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMV9TUl9CQV9MT1dfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX0JBX0hJR0hfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfQUREUkVTU19WQUxJRF9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfQ0xFQVJfX1ZBTFVFX1JFR19VUERBVEVEX1dJVEhfSU5WQUxJRF9BRERSX19fUyA1CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMV9fREVTVF9NQVhfTEVOR1RIX19fTSAweDAwMDBGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNF9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19NIDB4MDAwMDA0MDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NNRF9fSEFMVF9TVEFUVVNfX19NIDB4MDAwMDAwMDgKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19MQ01IX1dDSTJfSU5URVJSVVBUX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzJfX0FERFJFU1NfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSVNfX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX19fTSAweDAwMDAwMDA4CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMV9TUl9CQV9MT1dfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwxX19fUE9SIDB4MDAwMDAwODAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTlfX1ZBTFVFX1JFR0lTVEVSX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTN19fQUREUkVTU19SRUdJU1RFUl9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19ESVJUWV9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9DTEVBUl9fRElSVFlfQklUX1NFVF9DTEVBUl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19QTU1fU1JfWE9fU0VUVExFX1RJTUVPVVRfX19TIDkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTggKDB4MDAwMzIwNDgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fTk9DX1dDTU5fSU5UUl9fX00gMHgwMDAwMTAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIxX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTBfX0FERFJFU1NfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RTVF9XQVRFUk1BUksgKDB4MDAyNDAwNTApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNF9NSVNDX0lTX19BWElfQlVTX0VSUl9fX1MgOQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTRfU1JfQkFfTE9XX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVNfX0RJUlRZX0JJVF9TRVRfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1dDU1NBT05fU1JfTFNCX19TVEFUVVNfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRV9fRElSVFlfQklUX1NFVF9FTkFCTEVfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTRfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwxX19JRFhfVVBEX0VOX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfQ0xFQVJfX1dMQU4xX0hXMlNXX0dSQU5UX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEyX19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjBfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UzX1NSX0JBX0xPVyAoMHgwMDI0MzAwMCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX1NJWkVfX1NUQVJUX09GRlNFVF9fX1MgMTYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M1X19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9TSVpFX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTOV9fQUREUkVTU19SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxNl9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFOV9fVkFMVUVfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19ESVJUWSAoMHgwMDAzMDA4MCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX0FYSV9USU1FT1VUX0VSUl9fX00gMHgwMDAwMDQwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19QTU1fU1JfTFNCX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U4X1NSX0JBX0xPVyAoMHgwMDI0ODAwMCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M2X19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjFfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjFfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxNV9fQUREUkVTU19SRUdJU1RFUl9fX1BPUiAweDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFU19TRVRfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSVNfX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfX19TIDIKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MzX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE2ICgweDAwMDMyMDQwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JRV9fRFNUX1JJTkdfSElHSF9XQVRFUk1BUktfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMThfX0FERFJFU1NfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XUkVHX1NUQVRVU19fX00gMHgwMDAwMDAwRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JU19fRFNUX1JJTkdfSElHSF9XQVRFUk1BUktfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U4X01JU0NfSVNfX0FYSV9USU1FT1VUX0VSUl9fX00gMHgwMDAwMDQwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9TSVpFX19TVEFSVF9PRkZTRVRfX19TIDE2CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTRfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfQ09NTU9OX1dSQVBQRVJfQ0VfV1JBUFBFUl9IT1NUX0lOVEVSUlVQVF9TVU1NQVJZICgweDAwMjRDMDAwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzZfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTEwX1NSX0JBX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTJfU1JfQkFfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX1dMQU4yX0hXMlNXX0dSQU5UX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JU19fQ09QWV9DT01QTEVURV9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19JTlZBTElEX0JCXzJfSU5UUl9fX00gMHgwMDAwMDgwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDFfX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9fX1MgMTgKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMF9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19JTlZBTElEX0FERFJfQUNDRVNTICgweDAwMDMyMDc4KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxM19fVkFMVUVfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTZfU1JfQkFfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9CQV9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19XQ1NTQU9OX1NSX01TQl9fU1RBVFVTX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NXX1NDUkFUQ0hfX1NQQVJFX1JFR0lTVEVSX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTVfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyMV9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0FERFJFU1NfVkFMSURfX0JJVFNfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M3X19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX1RFU1RCVVNfX1NFTEVDVF9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIzX19BRERSRVNTX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19TUkNfUklOR19MT1dfV0FURVJNQVJLX19fUyAyCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjFfX0FERFJFU1NfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19MTUhfSU5UX19fTSAweDAwMDAwMDA4CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0FERFJFU1NfVkFMSURfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTJfU1JfQkFfTE9XX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfUE1NX1NSX0xTQl9fU1RBVFVTX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE4X19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M4X19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxMiAoMHgwMDAzMDA1MCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U5X01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9URVNUQlVTX19TRUxFQ1RfX19NIDB4MDAwMDAwMDcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyM19fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIwX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fUE1IX0lOVF9fX00gMHgwMDAwMDAyMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTExX1NSX0JBX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyMF9fVkFMVUVfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19XQ1NTQU9OX1NSX01TQl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9DT05UUk9MX19FTkFCTEVfQVBTU19GVUxMX0FDQ0VTU19fX00gMHgwMDAwMDAwNAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX1dMQU4xX1NMUF9UTVJfSU5UUl9fX1MgMTQKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSVNfX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfX19NIDB4MDAwMDAwMDQKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfV0NTU0FPTl9TUl9NU0JfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwxX19EU1RfUklOR19CWVRFX1NXQVBfRU5fX19NIDB4MDAwNDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxMF9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTNfX0FERFJFU1NfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX1NUQVRVU19fUE1NX1dDU1NfV0FLRVVQX0lSUV9BQ0tfX19TIDgKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U5X1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fU1JDX0xFTl9FUlJfX19NIDB4MDAwMDAxMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTNfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfQ09NTUlUX1JFUExBWV9fRU5BQkxFX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzcgKDB4MDAwMzAwM0MpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DVVJSRU5UX0RSUklfX0NVUlJFTlRfRFJSSV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFNUX1dBVEVSTUFSS19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TV19TQ1JBVENIX19TUEFSRV9SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU4X19WQUxVRV9SRUdJU1RFUl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0ZPUkNFX1dBS0VfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX0RTVF9NQVhfTEVOX1ZJT19fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUICgweDAwMkYwMDg0KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFU19TRVRfX0NFX0lOVFJfTElORV9IT1NUX1BfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RTVF9XQVRFUk1BUktfX0RSX0hJR0hfV0FURVJfTUFSS19USFJFU0hPTERfX19NIDB4MDAwMEZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfSU5WQUxJRF9BRERSX0FDQ0VTU19fUkVBRF9BQ0NFU1NfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9TSVpFX19TSVpFX19fUE9SIDB4MDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9DT05UUk9MX19FTkFCTEVfQVBTU19GVUxMX0FDQ0VTU19fX1MgMgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFU19fQ0VfSU5UUl9MSU5FX0hPU1RfUF9fX1BPUiAweDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTlfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTZfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19DT01NSVRfUkVQTEFZX19FTkFCTEVfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX1NUQVRVU19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTOCAoMHgwMDAzMDA0MCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MwX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lTICgweDAwMjQwMDMwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19fX00gMHgwMDAwMDAxMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9DT05UUk9MX19TT0ZUX1JFU0VUX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIyX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTVfX0FERFJFU1NfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyMl9fQUREUkVTU19SRUdJU1RFUl9fX1BPUiAweDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyM19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxNSAoMHgwMDAzMjAzQykKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX19fTSAweDAwMDAwMDAyCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lFX19DT1BZX0NPTVBMRVRFX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9CQV9ISUdIICgweDAwMjQwMDA0KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dSRUdfU1RBVFVTX19TVEFURV9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFOF9fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzExX19BRERSRVNTX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0lOVkFMSURfQUREUl9BQ0NFU1NfX1dSSVRFX0FDQ0VTU19fX1MgMTcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMF9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX0FQUFNfQ0VfSU5UUl9FTkFCTEVTX1NFVF9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0NPTU1JVF9SRVBMQVlfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U1X1NSX0JBX0xPV19fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fRFNUX1JJTkdfT1ZFUkZMT1dfX19TIDYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M4X19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX1BNTV9TUl9YT19TRVRUTEVfVElNRU9VVF9fX00gMHgwMDAwMDIwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19FQ0FIQl9USU1FT1VUX19fUyA0CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE1X19WQUxVRV9SRUdJU1RFUl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMV9fREVTVF9NQVhfTEVOR1RIX19fUE9SIDB4MDA4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFNUX1dBVEVSTUFSS19fRFJfTE9XX1dBVEVSX01BUktfVEhSRVNIT0xEX19fUE9SIDB4MDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxMF9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTlfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX1NUQVRVU19fUE1NX1NSX1hPX1NFVFRMRV9USU1FT1VUX19fTSAweDAwMDAwMjAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVNfX1dMQU4xX0hXMlNXX0dSQU5UX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fRFNUX1JJTkdfSElHSF9XQVRFUk1BUktfX19TIDMKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UxMF9TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU3X19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNV9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19NIDB4MDAwMDA0MDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSVNfX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX19fUyAzCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFOF9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEzX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9DTEVBUl9fUE1NX1dDU1NfV0FLRVVQX0lSUV9BQ0tfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9CQV9MT1cgKDB4MDAyNDAwMDApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTNV9fQUREUkVTU19SRUdJU1RFUl9fX1BPUiAweDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE2X19BRERSRVNTX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE2X19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTMgKDB4MDAwMzAwNTQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fV0xBTjJfU0xQX1RNUl9JTlRSX19fUyAxNQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFJfQkFfSElHSCAoMHgwMDI0MDAxMCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFNF9fVkFMVUVfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEyX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTExX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX1BBUlNFUl9JTlRfX19TIDExCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9DTEVBUl9fRVJSX1JFU1BfQ0xFQVJfX19TIDIKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjBfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFNCAoMHgwMDAzMjAxMCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxNF9fQUREUkVTU19SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JU19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTBfX0FERFJFU1NfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfQ09NTUlUX1JFUExBWV9fX00gMHgwMDAwMDAwMQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzRfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzFfX0FERFJFU1NfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M1X19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX1BNTV9XQ1NTX1dBS0VVUF9JUlFfQUNLX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19QTU1fU1JfTFNCX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFOF9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19TIDEwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTExX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19TV19TTFBfVE1SX0lOVFJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lFX19BWElfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTdfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIzX19BRERSRVNTX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19EU1RfTUFYX0xFTl9WSU9fX19TIDcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSUVfX0RTVF9SSU5HX0xPV19XQVRFUk1BUktfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTM19fQUREUkVTU19SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fRFNUX01BWF9MRU5fVklPX19fUyA3CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMF9fQUREUkVTU19SRUdJU1RFUl9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lFX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M3X19BRERSRVNTX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNl9TUl9CQV9MT1cgKDB4MDAyNDYwMDApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX0FQUFNfQ0VfSU5UUl9FTkFCTEVTX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMV9fRFNUX1JJTkdfQllURV9TV0FQX0VOX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX0lOVkFMSURfQkJfMl9JTlRSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU3X19WQUxVRV9SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxM19fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX1NUQVRVU19fUE1NX1dDU1NfV0FLRVVQX0lSUV9BQ0tfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX0NPTU1PTl9XUkFQUEVSX0NFX1dSQVBQRVJfSE9TVF9JTlRFUlJVUFRfU1VNTUFSWV9fSE9TVF9fX1BPUiAweDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX05PQ19XQ01OX0lOVFJfX19TIDEyCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19QQVJTRVJfSU5UX19fUE9SIDB4MDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTFfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NNRF9fRFNUX0ZMVVNIX19fTSAweDAwMDAwMDA0CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE4X19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTBfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRThfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NXX1NDUkFUQ0hfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyMyAoMHgwMDAzMDA3QykKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfQ09OVFJPTF9fX00gMHgwMDAwMDAxRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTNfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUkNfV0FURVJNQVJLX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19EU1RfUklOR19PVkVSRkxPV19fX00gMHgwMDAwMDA0MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU2X19WQUxVRV9SRUdJU1RFUl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMV9fQUREUkVTU19SRUdJU1RFUl9fX1BPUiAweDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzlfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19TTUhfSU5UX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTEwX01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUyA5CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fU1dfU0xQX1RNUl9JTlRSX19fUyAxNgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxNF9fVkFMVUVfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRV9DT01NT05fV1JBUFBFUl9DRV9XUkFQUEVSX0hPU1RfSU5URVJSVVBUX1NVTU1BUllfX0hPU1RfX19TIDEyCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMl9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19NIDB4MDAwMDA0MDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfUE1NX1NSX0xTQl9fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JfQkFfSElHSF9fQkFTRV9BRERSX0hJR0hfX19QT1IgMHgwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fU1JDX0xFTl9FUlJfX19NIDB4MDAwMDAxMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19WQUxVRV9SRUdfVVBEQVRFRF9XSVRIX0lOVkFMSURfQUREUl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfRk9SQ0VfV0FLRV9fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TV19TQ1JBVENIX19TUEFSRV9SRUdJU1RFUl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lTX19TUkNfUklOR19ISUdIX1dBVEVSTUFSS19fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M0X19BRERSRVNTX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0ZPUkNFX1dBS0VfX0ZPUkNFX1dBS0VfRU5BQkxFX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JDX1dSX0lOREVYX19TUkNfV1JfSU5ERVhfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U1X01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUyA5CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1dDU1NBT05fU1JfTVNCX19TVEFUVVNfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19FUlJfUkVTUF9FTkFCTEVfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DVVJSRU5UX0RSUklfX19NIDB4MDAwMEZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFOF9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyMF9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9CQV9ISUdIX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX1NFQ1VSRV9XUkFQUEVSX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfX0lMTF9SRUdfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEyX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMl9fU1JDX0FYSV9NQVhfTEVOX19fUE9SIDB4MQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDEgKDB4MDAyNDAwMTgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFN19TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMF9fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE5ICgweDAwMDMwMDZDKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JDX1dSX0lOREVYICgweDAwMjQwMDNDKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyMF9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIwX19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DTURfX19NIDB4MDAwMDAwMEYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxOF9fQUREUkVTU19SRUdJU1RFUl9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19WQUxVRV9SRUdfVVBEQVRFRF9XSVRIX0lOVkFMSURfQUREUl9fX1MgNQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxX19WQUxVRV9SRUdJU1RFUl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTBfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fTSAweDAwMDAwNDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DVVJSRU5UX1NSUklfX0NVUlJFTlRfU1JSSV9fX1BPUiAweDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfQ09OVFJPTF9fU1JfUkZfWE9fTVVYX1NFTF9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwyX19fTSAweDAwMDAwMDBGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTJfX1ZBTFVFX1JFR0lTVEVSX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX0lOVkFMSURfQUREUl9fX00gMHgwMDAwMDAwOAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyMl9fVkFMVUVfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE2X19BRERSRVNTX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTNfX1ZBTFVFX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fX00gMHgwRkZGRERGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU3ICgweDAwMDMyMDFDKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JRV9fU1JDX1JJTkdfTE9XX1dBVEVSTUFSS19fX00gMHgwMDAwMDAwNAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19JTlZBTElEX0FERFJfX19TIDMKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwyX19EU1RfQVhJX01BWF9MRU5fX19NIDB4MDAwMDAwMEMKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U1X01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTExX01JU0NfSVNfX0FYSV9USU1FT1VUX0VSUl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MwX19BRERSRVNTX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTFfTUlTQ19JU19fQVhJX0JVU19FUlJfX19NIDB4MDAwMDAyMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSQ19XUl9JTkRFWF9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX1NFQ1VSRV9XUkFQUEVSX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfX01JU0NfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTVfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX0NPUFlfQ09NUExFVEVfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSQ19XQVRFUk1BUktfX1NSX0hJR0hfV0FURVJfTUFSS19USFJFU0hPTERfX19QT1IgMHgwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMl9fQUREUkVTU19SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE3X19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19NIDB4MDAwMDA0MDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfQ09OVFJPTF9fQ0xPQ0tfR0FURV9ESVNBQkxFX19fUyAxCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX1NFQ1VSRV9XUkFQUEVSX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfQ0xFQVJfX0RJUlRZX0JJVF9TRVRfQ0xFQVJfX19NIDB4MDAwMDAwMDEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRV9fRUNBSEJfVElNRU9VVF9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U2X01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU2X19WQUxVRV9SRUdJU1RFUl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVNfX0ZPUkNFX1dBS0VfX19TIDEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfUE1NX1NSX01TQl9fU1RBVFVTX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSQ19XQVRFUk1BUktfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX0FYSV9CVVNfRVJSX19fTSAweDAwMDAwMjAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMF9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19QTU1fU1JfWE9fU0VUVExFX1RJTUVPVVRfX19TIDkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX1NUQVRVU19fVkFMVUVfUkVHX1VQREFURURfV0lUSF9JTlZBTElEX0FERFJfX19TIDUKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFM19fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE4X19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1dDU1NBT05fU1JfTVNCX19TVEFUVVNfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRV9fVkFMVUVfUkVHX1VQREFURURfV0lUSF9JTlZBTElEX0FERFJfX19NIDB4MDAwMDAwMjAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UxMV9TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19DRV9JTlRSX01JU0NfUF9fX1MgNworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fU1JDX1JJTkdfT1ZFUkZMT1dfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9DTEVBUl9fSU5WQUxJRF9BRERSX19fUyAzCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMV9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EU1RfV1JfSU5ERVhfX0RTVF9XUl9JTkRFWF9fX00gMHgwMDAwRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX0xDTUhfU1RST0JFX0lOVEVSUlVQVF9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19fUldDIFFDU1JfUkVHX1dPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVNfX1BNTV9TUl9YT19TRVRUTEVfVElNRU9VVF9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fQVBQU19DRV9JTlRSX0VOQUJMRVNfX0NFX0lOVFJfTElORV9IT1NUX1BfX19NIDB4MDAwMDBGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSQ19XQVRFUk1BUktfX1NSX0xPV19XQVRFUl9NQVJLX1RIUkVTT0xEX19fUyAxNgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIwX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX1NUQVRVU19fRk9SQ0VfV0FLRV9fX00gMHgwMDAwMDAwMgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE2ICgweDAwMDMwMDYwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU0X19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTJfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UzX1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX1RFU1RCVVMgKDB4MDAwMzAxNDQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMV9TUl9CQV9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFNUX1dBVEVSTUFSS19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JfU0laRV9fU1RBUlRfT0ZGU0VUX19fUE9SIDB4MDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzVfX0FERFJFU1NfUkVHSVNURVJfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfQ09OVFJPTF9fU1JfUExMX1JFRl9NVVhfU0VMX19fTSAweDAwMDAwMDA4CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTNfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX0JBX0hJR0hfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTcgKDB4MDAwMzIwNDQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUkNfV1JfSU5ERVhfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX1NUQVRVU19fX00gMHgwMDAwMDNGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUzX19WQUxVRV9SRUdJU1RFUl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fV0ZTU19EQkdfSU5UUl9fX00gMHgwMDAyMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19XQ1NTQU9OX1NSX0xTQl9fU1RBVFVTX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfQ09OVFJPTF9fRU5BQkxFX0FQU1NfRlVMTF9BQ0NFU1NfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lTX19TUkNfUklOR19ISUdIX1dBVEVSTUFSS19fX00gMHgwMDAwMDAwMgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU1X19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX1NJWkVfX1NUQVJUX09GRlNFVF9fX00gMHhGRkZGMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxN19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ01EX19IQUxUX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JRV9fU1JDX1JJTkdfSElHSF9XQVRFUk1BUktfX19TIDEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UxX01JU0NfSVNfX0FYSV9CVVNfRVJSX19fTSAweDAwMDAwMjAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fQ0VfSU5UUl9USU1FT1VUX1BfX19TIDgKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSVNfX0NPUFlfQ09NUExFVEVfX19NIDB4MDAwMDAwMDEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RSX1NJWkVfX1NUQVJUX09GRlNFVF9fX1BPUiAweDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTZfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fTSAweDAwMDAwNDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19fTSAweDAwMEZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTBfU1JfQkFfTE9XX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fU1JDX1JJTkdfSElHSF9XQVRFUk1BUktfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX0VDQUhCX1RJTUVPVVRfX19TIDQKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwxX19fTSAweDAwMEZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMl9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTdfX0FERFJFU1NfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxNF9fQUREUkVTU19SRUdJU1RFUl9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19GT1JDRV9XQUtFX0VOQUJMRV9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfUE1NX1NSX0xTQl9fU1RBVFVTX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX1NFQ1VSRV9XUkFQUEVSX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U5X1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfQ0xFQVJfX0lOVkFMSURfQUREUl9fX00gMHgwMDAwMDAwOAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19QTU1fU1JfTVNCX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMThfX0FERFJFU1NfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfVEVTVEJVU19fX00gMHgwMDAwMDAwNworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE3X19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRV9fV0xBTjFfSFcyU1dfR1JBTlRfX19TIDYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE5X19BRERSRVNTX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19TUkNfUklOR19ISUdIX1dBVEVSTUFSS19fX1MgMQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTJfU1JfQkFfTE9XICgweDAwMjQyMDAwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M3X19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX1dMQU4yX0hXMlNXX0dSQU5UX19fUyA3CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTOV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19fX1MgNAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzlfX0FERFJFU1NfUkVHSVNURVJfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwxX19ERVNUX01BWF9MRU5HVEhfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRSAoMHgwMDAzMDAxMCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19GT1JDRV9XQUtFX0NMRUFSX19fTSAweDAwMDAwMDAyCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE2X19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTlfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFOCAoMHgwMDAzMjAyMCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U4X1NSX0JBX0xPV19fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRThfU1JfQkFfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTRfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFU19TRVRfX19NIDB4MDAwMDBGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U2X1NSX0JBX0xPV19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9TSVpFX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTBfTUlTQ19JU19fQVhJX0JVU19FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DTURfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxMV9fQUREUkVTU19SRUdJU1RFUl9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDFfX0lEWF9VUERfRU5fX19NIDB4MDAwODAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxOV9fQUREUkVTU19SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTdfTUlTQ19JU19fQVhJX0JVU19FUlJfX19TIDkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTFfX1ZBTFVFX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19CTUhfSU5UX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU3X19WQUxVRV9SRUdJU1RFUl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0NPTlRST0xfX1NPRlRfUkVTRVRfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M5X19BRERSRVNTX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9DTEVBUl9fV0xBTjFfSFcyU1dfR1JBTlRfX19TIDYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MwICgweDAwMDMwMDIwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX1BNSF9JTlRfX19TIDUKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RTVF9XUl9JTkRFWF9fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU5X19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX0NPTU1PTl9XUkFQUEVSX0NFX1dSQVBQRVJfSE9TVF9JTlRFUlJVUFRfU1VNTUFSWV9fSE9TVF9fX00gMHgwMEZGRjAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTNfU1JfQkFfTE9XX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RSX0JBX0xPV19fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFNUX1dSX0lOREVYX19EU1RfV1JfSU5ERVhfX19QT1IgMHgwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EU1RfV0FURVJNQVJLX19EUl9ISUdIX1dBVEVSX01BUktfVEhSRVNIT0xEX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNV9TUl9CQV9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRV9TRUNVUkVfV1JBUFBFUl9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX19JTExfUkVHX19fTSAweDAxMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTVfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjFfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSVNfX0RTVF9SSU5HX0xPV19XQVRFUk1BUktfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fV0xBTjJfU0xQX1RNUl9JTlRSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ01EX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMV9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxMSAoMHgwMDAzMDA0QykKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19QTUhfSU5UX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTRfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U4X1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX0lOVkFMSURfQkJfMV9JTlRSX19fTSAweDAwMDAwNDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFOV9NSVNDX0lTX19BWElfQlVTX0VSUl9fX1MgOQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JDX1dBVEVSTUFSS19fU1JfTE9XX1dBVEVSX01BUktfVEhSRVNPTERfX19QT1IgMHgwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9TSVpFX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1BNTV9TUl9NU0IgKDB4MDAwMzIwNkMpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX1BNTV9XQ1NTX1dBS0VVUF9JUlFfQUNLX19fTSAweDAwMDAwMTAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9TSVpFX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfSU5WQUxJRF9BRERSX0FDQ0VTU19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTFfX0FERFJFU1NfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTBfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX0RTVF9SSU5HX0xPV19XQVRFUk1BUktfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DVVJSRU5UX1NSUklfX19NIDB4MDAwMEZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19ESVJUWV9CSVRfU0VUX0VOQUJMRV9fX00gMHgwMDAwMDAwMQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFNUX1dSX0lOREVYX19fTSAweDAwMDBGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9TSVpFICgweDAwMjQwMDE0KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dSRUdfU1RBVFVTX19TVEFURV9fX00gMHgwMDAwMDAwNworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTZfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fUyAxMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxMSAoMHgwMDAzMjAyQykKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfQ09OVFJPTF9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DVVJSRU5UX0RSUkkgKDB4MDAyNDAwNDgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNl9TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XUkVHX1NUQVRVU19fV0NTU19DT1JFX1dBS0VfU0xFRVBfU1RBVEVfX19TIDMKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U0X01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTlfU1JfQkFfTE9XICgweDAwMjQ5MDAwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JRV9fRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19fX1MgNAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fU1JDX0xFTl9FUlJfX19TIDgKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjBfX1ZBTFVFX1JFR0lTVEVSX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNF9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9FTkFCTEVfX0VSUl9SRVNQX0VOQUJMRV9fX00gMHgwMDAwMDAwNAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxOF9fVkFMVUVfUkVHSVNURVJfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19MQ01IX1dDSTJfSU5URVJSVVBUX19fUyAyCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DTURfX0hBTFRfX19NIDB4MDAwMDAwMDEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XUkVHX1NUQVRVU19fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU2X19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lTX19TUkNfUklOR19ISUdIX1dBVEVSTUFSS19fX1MgMQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19ESVJUWV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxNF9fVkFMVUVfUkVHSVNURVJfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XUkVHX1NUQVRVU19fV0NTU19DT1JFX1dBS0VfU0xFRVBfU1RBVEVfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0lOVkFMSURfQUREUl9BQ0NFU1NfX1JFQURfQUNDRVNTX19fUyAxNgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9URVNUQlVTX19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9CQV9MT1dfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M4X19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0lOVkFMSURfQUREUl9BQ0NFU1NfX1JFQURfQUNDRVNTX19fTSAweDAwMDEwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19EU1RfUklOR19ISUdIX1dBVEVSTUFSS19fX00gMHgwMDAwMDAwOAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyMl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFU19DTEVBUl9fQ0VfSU5UUl9MSU5FX0hPU1RfUF9fX1BPUiAweDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9DT05UUk9MICgweDAwMDMwMDAwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIxX19BRERSRVNTX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DVVJSRU5UX1NSUkkgKDB4MDAyNDAwNDQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTlfX0FERFJFU1NfUkVHSVNURVJfX19NIDB4MDAzRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTRfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyMl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTFfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRThfTUlTQ19JU19fQVhJX0JVU19FUlJfX19TIDkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX0RTVF9NQVhfTEVOX1ZJT19fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfV0NTU0FPTl9TUl9MU0JfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTRfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfRElSVFlfX0JJVFNfX19NIDB4MDBGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFNV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19fTSAweDAwMDAwM0ZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DTUQgKDB4MDAyNDAwMjApCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE5X19WQUxVRV9SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTNfU1JfQkFfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjBfX0FERFJFU1NfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RSX1NJWkVfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfX19NIDB4MDAwMDAwMDQKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UyX01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUyA5CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fTk9DX1dDTU5fSU5UUl9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfU0VDVVJFX1dSQVBQRVJfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9fSE9TVF9fX1MgMTIKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTRfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19XQ1NTQU9OX1NSX0xTQl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lFX19DT1BZX0NPTVBMRVRFX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTFfTUlTQ19JU19fQVhJX0JVU19FUlJfX19TIDkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XUkVHX1NUQVRVU19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1BNTV9TUl9MU0JfX1NUQVRVU19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMTFfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX0FQUFNfQ0VfSU5UUl9FTkFCTEVTICgweDAwMkYxMDAwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTFfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fTSAweDAwMDAwNDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTVfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTlfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxOF9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTNl9fQUREUkVTU19SRUdJU1RFUl9fX1BPUiAweDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzkgKDB4MDAwMzAwNDQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxNV9fX1JXQyBRQ1NSX1JFR19SVworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU2ICgweDAwMDMyMDE4KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyMSAoMHgwMDAzMjA1NCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX0JBX0hJR0hfX0JBU0VfQUREUl9ISUdIX19fTSAweDAwMDAwMDFGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX0NPTU1PTl9XUkFQUEVSX0NFX1dSQVBQRVJfSE9TVF9JTlRFUlJVUFRfU1VNTUFSWV9fX1MgMTIKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NNRF9fSEFMVF9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTdfU1JfQkFfTE9XICgweDAwMjQ3MDAwKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE4ICgweDAwMDMwMDY4KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzdfX0FERFJFU1NfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFM19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fQVhJX0VSUl9fX1MgOQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19XTEFOMV9IVzJTV19HUkFOVF9fX00gMHgwMDAwMDA0MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19fX00gMHgwMDAwMDAxMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19JTlZBTElEX0FERFJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTIzX19WQUxVRV9SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19QTU1fU1JfTFNCX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTM19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fRFNUX1JJTkdfSElHSF9XQVRFUk1BUktfX19NIDB4MDAwMDAwMDgKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxNl9fX1JXQyBRQ1NSX1JFR19STworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19FUlJfUkVTUF9fX1MgMgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyMl9fVkFMVUVfUkVHSVNURVJfX19NIDB4RkZGRkZGRkYKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX1NJWkUgKDB4MDAyNDAwMDgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTIzX19WQUxVRV9SRUdJU1RFUl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0NPTlRST0xfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxM19fQUREUkVTU19SRUdJU1RFUl9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19ESVJUWV9fQklUU19fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fRFNUX1JJTkdfSElHSF9XQVRFUk1BUktfX19TIDMKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTdfX1ZBTFVFX1JFR0lTVEVSX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9DTEVBUl9fV0xBTjFfSFcyU1dfR1JBTlRfX19NIDB4MDAwMDAwNDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfM19BX1dDTU5fUURTUF9FUlJPUl9JTlRSX0VOQUJMRVNfU0VUX19MTUhfSU5UX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19XTEFOMl9IVzJTV19HUkFOVF9fX00gMHgwMDAwMDA4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTExX1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMSAoMHgwMDAzMDAyNCkKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwyICgweDAwMjQwMDFDKQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFU19fQ0VfSU5UUl9MSU5FX0hPU1RfUF9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzBfX0FERFJFU1NfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UxMV9NSVNDX0lTX19BWElfQlVTX0VSUl9fX1MgOQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUyM19fVkFMVUVfUkVHSVNURVJfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19XTEFOMl9IVzJTV19HUkFOVF9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1dfU0NSQVRDSF9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTNfTUlTQ19JU19fQVhJX0JVU19FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX0FQUFNfQ0VfSU5UUl9FTkFCTEVTX1NFVF9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX0xDTUhfU1RST0JFX0lOVEVSUlVQVF9fX00gMHgwMDAwMDAwMgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19WQUxVRV9SRUdfVVBEQVRFRF9XSVRIX0lOVkFMSURfQUREUl9fX00gMHgwMDAwMDAyMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX01DSU1fSU5UX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19GT1JDRV9XQUtFX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU2X19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfUE1NX1NSX01TQl9fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIxICgweDAwMDMwMDc0KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE0X19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFN19TUl9CQV9MT1dfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UyX1NSX0JBX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19ESVJUWV9fQklUU19fX1BPUiAweDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTJfU1JfQkFfTE9XX19CQVNFX0FERFJfTE9XX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NNRF9fRFNUX0ZMVVNIX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fQVhJX0VSUl9fX00gMHgwMDAwMDIwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19XTEFOMl9IVzJTV19HUkFOVF9fX1MgNworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfRU5BQkxFX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTJfX1ZBTFVFX1JFR0lTVEVSX19fTSAweEZGRkZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTIwX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DVVJSRU5UX1NSUklfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFNV9fVkFMVUVfUkVHSVNURVJfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTdfX1ZBTFVFX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX1NSQ19MRU5fRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTdfU1JfQkFfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX0NPTU1PTl9XUkFQUEVSX0NFX1dSQVBQRVJfSE9TVF9JTlRFUlJVUFRfU1VNTUFSWV9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTE3X19fUldDIFFDU1JfUkVHX1JXCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1dDU1NBT05fU1JfTVNCX19fUldDIFFDU1JfUkVHX1JPCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1dDU1NBT05fU1JfTVNCICgweDAwMDMyMDc0KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzlfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTJfTUlTQ19JU19fQVhJX0JVU19FUlJfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0ZPUkNFX1dBS0VfX0ZPUkNFX1dBS0VfRU5BQkxFX19fTSAweDAwMDAwMDAxCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DTURfX0RTVF9GTFVTSF9fX1MgMgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JRV9fU1JDX1JJTkdfTE9XX1dBVEVSTUFSS19fX1MgMgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFJfU0laRV9fU1RBUlRfT0ZGU0VUX19fTSAweEZGRkYwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTAgKDB4MDAwMzAwNDgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTNF9fX00gMHgwMDNGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JRV9fU1JDX1JJTkdfT1ZFUkZMT1dfX19TIDUKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NVUlJFTlRfU1JSSV9fQ1VSUkVOVF9TUlJJX19fTSAweDAwMDBGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTIxX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M0X19BRERSRVNTX1JFR0lTVEVSX19fTSAweDAwM0ZGRkZGCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lFX19TUkNfUklOR19ISUdIX1dBVEVSTUFSS19fX00gMHgwMDAwMDAwMgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JU19fQ09QWV9DT01QTEVURV9fX1MgMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19FUlJfUkVTUF9fX1BPUiAweDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX0NPUFlfQ09NUExFVEVfX19NIDB4MDAwMDAwMDEKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjBfX1ZBTFVFX1JFR0lTVEVSX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNV9TUl9CQV9MT1dfX0JBU0VfQUREUl9MT1dfX19QT1IgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTdfTUlTQ19JU19fQVhJX1RJTUVPVVRfRVJSX19fUyAxMAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTEwX1NSX0JBX0xPV19fQkFTRV9BRERSX0xPV19fX00gMHhGRkZGRkZGRgorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTlfU1JfQkFfTE9XX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NSX0lOVEVSUlVQVF9TVEFUVVNfX0lOVkFMSURfQUREUl9fX1MgMworI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzFfX19SV0MgUUNTUl9SRUdfUk8KKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19FQ0FIQl9USU1FT1VUX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TV19TQ1JBVENIX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUyA5CisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTVfX1ZBTFVFX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MzX19BRERSRVNTX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lFX19TUkNfUklOR19MT1dfV0FURVJNQVJLX19fUyAyCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMl9fU1JDX0FYSV9NQVhfTEVOX19fUyAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1BNTV9TUl9MU0IgKDB4MDAwMzIwNjgpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzNfQV9XQ01OX1FEU1BfRVJST1JfSU5UUl9FTkFCTEVTX1NFVF9fV0ZTU19EQkdfSU5UUl9fX1MgMTcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0NMRUFSX19QTU1fU1JfWE9fU0VUVExFX1RJTUVPVVRfX19NIDB4MDAwMDAyMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RSX0JBX0hJR0hfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU1JfSU5URVJSVVBUX0VOQUJMRV9fV0xBTjFfSFcyU1dfR1JBTlRfX19NIDB4MDAwMDAwNDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UxMV9TUl9CQV9MT1dfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U3X01JU0NfSVNfX0FYSV9CVVNfRVJSX19fTSAweDAwMDAwMjAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX0NPTU1JVF9SRVBMQVkgKDB4MDAwMzAwMDQpCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9CQV9MT1dfX19SV0MgUUNTUl9SRUdfUlcKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjFfX19TIDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U3X01JU0NfSVNfX0FYSV9CVVNfRVJSX19fUE9SIDB4MAorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8zX0FfV0NNTl9RRFNQX0VSUk9SX0lOVFJfRU5BQkxFU19TRVRfX0xDTUhfV0NJMl9JTlRFUlJVUFRfX19NIDB4MDAwMDAwMDQKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX0RTVF9SSU5HX0xPV19XQVRFUk1BUktfX19QT1IgMHgwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEwX19WQUxVRV9SRUdJU1RFUl9fX1BPUiAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTEwICgweDAwMDMyMDI4KQorI2RlZmluZSBBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TUl9JTlRFUlJVUFRfU1RBVFVTX19JTlZBTElEX0FERFJfX19NIDB4MDAwMDAwMDgKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMyAoMHgwMDAzMjAwQykKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTZfX1ZBTFVFX1JFR0lTVEVSX19fUE9SIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSUVfX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX19fUyAxCisjZGVmaW5lIEFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTJfX0FERFJFU1NfUkVHSVNURVJfX19TIDAKKworCisvKiBFbmQgYXV0by1nZW5lcmF0ZWQgaGVhZGVycyBmcm9tIHJlZ2lzdGVyIHBhcnNlciAqLworCisjZGVmaW5lIE1JU1NJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNTSU5HX0ZPUl9BRFJBU1RFQSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQURSQVNURUFfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTICAgICAgICAgICAwCisjZGVmaW5lIEFEUkFTVEVBX1dJRklfUlRDX1JFR19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDQ1MDAwCisjZGVmaW5lIEFEUkFTVEVBX1JUQ19TT0NfUkVHX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAweDExMzAwMAorI2RlZmluZSBBRFJBU1RFQV9HUElPX0FUSFJfV0xBTl9SRUdfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgMHg4NTAwMAorI2RlZmluZSBBRFJBU1RFQV9TSV9SRUdfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NDAwMAorI2RlZmluZSBBRFJBU1RFQV9TT0NfQ09SRV9SRUdfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgxMTMwMDAKKyNkZWZpbmUgQURSQVNURUFfQ0VfV1JBUFBFUl9SRUdfQ1NSX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBBRFJBU1RFQV9NQUNfV0lGSUNNTl9SRUdfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgTUlTU0lORworCisvKiBCYXNlIEFkZHJlc3NlcyAqLworI2RlZmluZSBBRFJBU1RFQV9SVENfU09DX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX1JUQ19XTUFDX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfTUFDX0NPRVhfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwZjAwMAorI2RlZmluZSBBRFJBU1RFQV9CVF9DT0VYX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19QQ0lFX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAxMzAwMDAKKyNkZWZpbmUgQURSQVNURUFfU09DX0NPUkVfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1VBUlRfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAweDAwMTExMDAwCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fU0lfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9HUElPX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9XTEFOX0FOQUxPR19JTlRGX0JBU0VfQUREUkVTUyAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fTUFDX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQURSQVNURUFfRUZVU0VfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAyNDAwMAorI2RlZmluZSBBRFJBU1RFQV9GUEdBX1JFR19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDM5MDAwCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fVUFSVDJfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgIDB4MDAwNTRjMDAKKworI2RlZmluZSBBRFJBU1RFQV9DRV9XUkFQUEVSX0JBU0VfQUREUkVTUyBcCisJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfQ09NTU9OX1dSQVBQRVJfQ0VfV1JBUFBFUl9IT1NUX0lOVEVSUlVQVF9TVU1NQVJZCisjZGVmaW5lIEFEUkFTVEVBX0NFMF9CQVNFX0FERFJFU1MgXAorCQkJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX0JBX0xPVworI2RlZmluZSBBRFJBU1RFQV9DRTFfQkFTRV9BRERSRVNTIFwKKwkJCUFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMV9TUl9CQV9MT1cKKyNkZWZpbmUgQURSQVNURUFfQ0UyX0JBU0VfQUREUkVTUyBcCisJCQlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTJfU1JfQkFfTE9XCisjZGVmaW5lIEFEUkFTVEVBX0NFM19CQVNFX0FERFJFU1MgXAorCQkJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UzX1NSX0JBX0xPVworI2RlZmluZSBBRFJBU1RFQV9DRTRfQkFTRV9BRERSRVNTIFwKKwkJCUFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNF9TUl9CQV9MT1cKKyNkZWZpbmUgQURSQVNURUFfQ0U1X0JBU0VfQUREUkVTUyBcCisJCQlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTVfU1JfQkFfTE9XCisjZGVmaW5lIEFEUkFTVEVBX0NFNl9CQVNFX0FERFJFU1MgXAorCQkJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U2X1NSX0JBX0xPVworI2RlZmluZSBBRFJBU1RFQV9DRTdfQkFTRV9BRERSRVNTIFwKKwkJCUFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFN19TUl9CQV9MT1cKKyNkZWZpbmUgQURSQVNURUFfQ0U4X0JBU0VfQUREUkVTUyBcCisJCQlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRThfU1JfQkFfTE9XCisjZGVmaW5lIEFEUkFTVEVBX0NFOV9CQVNFX0FERFJFU1MgXAorCQkJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U5X1NSX0JBX0xPVworI2RlZmluZSBBRFJBU1RFQV9DRTEwX0JBU0VfQUREUkVTUyBcCisJCQlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTEwX1NSX0JBX0xPVworI2RlZmluZSBBRFJBU1RFQV9DRTExX0JBU0VfQUREUkVTUyBcCisJCQlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTExX1NSX0JBX0xPVworCisjZGVmaW5lIEFEUkFTVEVBX0FfU09DX1BDSUVfU09DX1BDSUVfUkVHICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQURSQVNURUFfREJJX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBRFJBU1RFQV9XTEFOX0FOQUxPR19JTlRGX1BDSUVfQkFTRV9BRERSRVNTICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX1dJRklDTU5fQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQURSQVNURUFfQk9BUkRfREFUQV9TWiAgICAgICAgICAgICAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBRFJBU1RFQV9CT0FSRF9FWFRfREFUQV9TWiAgICAgICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0FfU09DX1BDSUVfUENJRV9CQVIwX1NUQVJUCQlNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0FfU09DX0NPUkVfU0NSQVRDSF8wX0FERFJFU1MgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQURSQVNURUFfQV9TT0NfQ09SRV9TUEFSRV8wX1JFR0lTVEVSICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBRFJBU1RFQV9QQ0lFX0lOVFJfRklSTVdBUkVfUk9VVEVfTUFTSyAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX1NDUkFUQ0hfM19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQURSQVNURUFfVEFSR19EUkFNX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9TT0NfU1lTVEVNX1NMRUVQX09GRlNFVCAgICAgICAgICAgICAgICAweDAwMDAwMGMwCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19SRVNFVF9DT05UUk9MX09GRlNFVCBcCisJKDB4MDAwMDAwMDAgKyBfUlRDX1NPQ19SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBBRFJBU1RFQV9TT0NfQ0xPQ0tfQ09OVFJPTF9PRkZTRVQgXAorCSgweDAwMDAwMDI4ICsgX1JUQ19TT0NfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQURSQVNURUFfU09DX0NMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBRFJBU1RFQV9TT0NfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0sgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fR1BJT19QSU4wX0FERFJFU1MgXAorCSgweDUwICsgX0dQSU9fQVRIUl9XTEFOX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fR1BJT19QSU4xX0FERFJFU1MgXAorCSgweDU0ICsgX0dQSU9fQVRIUl9XTEFOX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fR1BJT19QSU4wX0NPTkZJR19NQVNLICAgICAgICAgICAgIDB4MDAwMDc4MDAKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9HUElPX1BJTjFfQ09ORklHX01BU0sgICAgICAgICAgICAgMHgwMDAwNzgwMAorI2RlZmluZSBBRFJBU1RFQV9TT0NfQ1BVX0NMT0NLX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19MUE9fQ0FMX09GRlNFVCBcCisJKDB4ZTAgKyBfUlRDX1NPQ19SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBBRFJBU1RFQV9XTEFOX0dQSU9fUElOMTBfQUREUkVTUyBcCisJKDB4NzggKyBfR1BJT19BVEhSX1dMQU5fUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9HUElPX1BJTjExX0FERFJFU1MgXAorCSgweDdjICsgX0dQSU9fQVRIUl9XTEFOX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fR1BJT19QSU4xMl9BRERSRVNTIFwKKwkoMHg4MCArIF9HUElPX0FUSFJfV0xBTl9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBBRFJBU1RFQV9XTEFOX0dQSU9fUElOMTNfQUREUkVTUyBcCisJKDB4ODQgKyBfR1BJT19BVEhSX1dMQU5fUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQURSQVNURUFfU09DX0NQVV9DTE9DS19TVEFOREFSRF9MU0IgICAgICAgICAgICAgMAorI2RlZmluZSBBRFJBU1RFQV9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19MUE9fQ0FMX0VOQUJMRV9MU0IgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19MUE9fQ0FMX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKworI2RlZmluZSBBRFJBU1RFQV9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX0xTQiAgICAgICAgICAwCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSyAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9SRVNFVF9DT05UUk9MX0NPTERfUlNUX01BU0sgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1JFU0VUX0NPTlRST0xfV0FSTV9SU1RfTUFTSyAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFEUkFTVEVBX1NJX0NPTkZJR19CSURJUl9PRF9EQVRBX0xTQiAgICAgICAgICAgIDE4CisjZGVmaW5lIEFEUkFTVEVBX1NJX0NPTkZJR19CSURJUl9PRF9EQVRBX01BU0sgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQURSQVNURUFfU0lfQ09ORklHX0kyQ19MU0IgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQURSQVNURUFfU0lfQ09ORklHX0kyQ19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBRFJBU1RFQV9TSV9DT05GSUdfUE9TX1NBTVBMRV9MU0IgICAgICAgICAgICAgICA3CisjZGVmaW5lIEFEUkFTVEVBX1NJX0NPTkZJR19QT1NfU0FNUExFX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQURSQVNURUFfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19MU0IgICAgICAgICAgICAgNAorI2RlZmluZSBBRFJBU1RFQV9TSV9DT05GSUdfSU5BQ1RJVkVfQ0xLX01BU0sgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFEUkFTVEVBX1NJX0NPTkZJR19JTkFDVElWRV9EQVRBX0xTQiAgICAgICAgICAgIDUKKyNkZWZpbmUgQURSQVNURUFfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSyAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBRFJBU1RFQV9TSV9DT05GSUdfRElWSURFUl9MU0IgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFEUkFTVEVBX1NJX0NPTkZJR19ESVZJREVSX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgQURSQVNURUFfU0lfQ09ORklHX09GRlNFVCAgICAoMHgwMDAwMDAwMCArIF9TSV9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBBRFJBU1RFQV9TSV9UWF9EQVRBMF9PRkZTRVQgICgweDAwMDAwMDA4ICsgX1NJX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIEFEUkFTVEVBX1NJX1RYX0RBVEExX09GRlNFVCAgKDB4MDAwMDAwMGMgKyBfU0lfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQURSQVNURUFfU0lfUlhfREFUQTBfT0ZGU0VUICAoMHgwMDAwMDAxMCArIF9TSV9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBBRFJBU1RFQV9TSV9SWF9EQVRBMV9PRkZTRVQgICgweDAwMDAwMDE0ICsgX1NJX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIEFEUkFTVEVBX1NJX0NTX09GRlNFVCAgICAgICAgKDB4MDAwMDAwMDQgKyBfU0lfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQURSQVNURUFfU0lfQ1NfRE9ORV9FUlJfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBBRFJBU1RFQV9TSV9DU19ET05FX0lOVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEFEUkFTVEVBX1NJX0NTX1NUQVJUX0xTQiAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQURSQVNURUFfU0lfQ1NfU1RBUlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBRFJBU1RFQV9TSV9DU19SWF9DTlRfTFNCICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFEUkFTVEVBX1NJX0NTX1JYX0NOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgQURSQVNURUFfU0lfQ1NfVFhfQ05UX0xTQiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBRFJBU1RFQV9TSV9DU19UWF9DTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEFEUkFTVEVBX0NFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEFEUkFTVEVBX1NSX1dSX0lOREVYX09GRlNFVCAgIChBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfU1JDX1dSX0lOREVYIFwKKwkJCQkJCS0gQURSQVNURUFfQ0UwX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQURSQVNURUFfRFNUX1dBVEVSTUFSS19PRkZTRVQgKEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EU1RfV0FURVJNQVJLIFwKKwkJCQkJCS0gQURSQVNURUFfQ0UwX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQURSQVNURUFfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX0xTQiAgICAgICAgICAgMTQKKyNkZWZpbmUgQURSQVNURUFfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX01BU0sgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBBRFJBU1RFQV9SWF9NUERVX1NUQVJUXzBfU0VRX05VTV9MU0IgICAgICAgICAgICAxNgorI2RlZmluZSBBRFJBU1RFQV9SWF9NUERVX1NUQVJUXzBfU0VRX05VTV9NQVNLICAgICAgICAgICAweDBmZmYwMDAwCisjZGVmaW5lIEFEUkFTVEVBX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9MU0IgICAgICAgICAgIDAKKyNkZWZpbmUgQURSQVNURUFfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX01BU0sgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBBRFJBU1RFQV9SWF9NU0RVX0VORF8xX0VYVF9XQVBJX1BOXzYzXzQ4X0xTQiAgICAxNgorI2RlZmluZSBBRFJBU1RFQV9SWF9NU0RVX0VORF8xX0VYVF9XQVBJX1BOXzYzXzQ4X01BU0sgICAweGZmZmYwMDAwCisjZGVmaW5lIEFEUkFTVEVBX1JYX01TRFVfRU5EXzRfTEFTVF9NU0RVX0xTQiAgICAgICAgICAgIDE1CisjZGVmaW5lIEFEUkFTVEVBX1JYX01TRFVfRU5EXzRfTEFTVF9NU0RVX01BU0sgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQURSQVNURUFfUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTFNCICAgICAgICAgMgorI2RlZmluZSBBRFJBU1RFQV9SWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9NQVNLICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFEUkFTVEVBX1JYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX0xTQiAgICAgICAgICAgIDEzCisjZGVmaW5lIEFEUkFTVEVBX1JYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX01BU0sgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQURSQVNURUFfUlhfQVRURU5USU9OXzBfTVBEVV9MRU5HVEhfRVJSX01BU0sgICAgMHgwODAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX0xTQiAgICAxNgorI2RlZmluZSBBRFJBU1RFQV9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX01BU0sgICAweDAwZmYwMDAwCisjZGVmaW5lIEFEUkFTVEVBX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9MU0IgICAgICAgIDAKKyNkZWZpbmUgQURSQVNURUFfUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX01BU0sgICAgICAgMHgwMDAwM2ZmZgorCisjZGVmaW5lIEFEUkFTVEVBX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfT0ZGU0VUICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQURSQVNURUFfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9MU0IgICAgICAgOAorI2RlZmluZSBBRFJBU1RFQV9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX01BU0sgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIEFEUkFTVEVBX1JYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTFNCICAgICAgICAgIDEzCisjZGVmaW5lIEFEUkFTVEVBX1JYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTUFTSyAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQURSQVNURUFfUlhfQVRURU5USU9OXzBfTU9SRV9EQVRBX01BU0sgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBBRFJBU1RFQV9SWF9BVFRFTlRJT05fMF9NU0RVX0RPTkVfTUFTSyAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEFEUkFTVEVBX1JYX0FUVEVOVElPTl8wX1RDUF9VRFBfQ0hLU1VNX0ZBSUxfTUFTSyAgICAgMHgwMDA0MDAwMAorCisjZGVmaW5lIEFEUkFTVEVBX0RTVF9XUl9JTkRFWF9PRkZTRVQgKEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EU1RfV1JfSU5ERVhcCisJCQkJCS0gQURSQVNURUFfQ0UwX0JBU0VfQUREUkVTUykKKworI2RlZmluZSBBRFJBU1RFQV9TUkNfV0FURVJNQVJLX09GRlNFVCAoQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSQ19XQVRFUk1BUktcCisJCQkJCS0gQURSQVNURUFfQ0UwX0JBU0VfQUREUkVTUykKKworI2RlZmluZSBBRFJBU1RFQV9TUkNfV0FURVJNQVJLX0xPV19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgQURSQVNURUFfU1JDX1dBVEVSTUFSS19ISUdIX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEFEUkFTVEVBX0RTVF9XQVRFUk1BUktfTE9XX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBBRFJBU1RFQV9EU1RfV0FURVJNQVJLX0hJR0hfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKworI2RlZmluZSBBRFJBU1RFQV9DVVJSRU5UX1NSUklfT0ZGU0VUIChBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ1VSUkVOVF9TUlJJXAorCQkJCQktIEFEUkFTVEVBX0NFMF9CQVNFX0FERFJFU1MpCisKKyNkZWZpbmUgQURSQVNURUFfQ1VSUkVOVF9EUlJJX09GRlNFVCAoQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NVUlJFTlRfRFJSSVwKKwkJCQkJLSBBRFJBU1RFQV9DRTBfQkFTRV9BRERSRVNTKQorCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSVNfU1JDX1JJTkdfSElHSF9XQVRFUk1BUktfTUFTSyAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBRFJBU1RFQV9IT1NUX0lTX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfTUFTSyBcCisJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0hPU1RfSVNfX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfX19NCisKKyNkZWZpbmUgQURSQVNURUFfSE9TVF9JU19EU1RfUklOR19ISUdIX1dBVEVSTUFSS19NQVNLIFwKKwlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JU19fRFNUX1JJTkdfSElHSF9XQVRFUk1BUktfX19NCisKKyNkZWZpbmUgQURSQVNURUFfSE9TVF9JU19EU1RfUklOR19MT1dfV0FURVJNQVJLX01BU0sgXAorCUFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lTX19EU1RfUklOR19MT1dfV0FURVJNQVJLX19fTQorCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSVNfT0ZGU0VUIChBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JUyBcCisJCQkJLSBBRFJBU1RFQV9DRTBfQkFTRV9BRERSRVNTKQorCisjZGVmaW5lIEFEUkFTVEVBX01JU0NfSVNfT0ZGU0VUIChBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JUyBcCisJCQkJLSBBRFJBU1RFQV9DRTBfQkFTRV9BRERSRVNTKQorCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSVNfQ09QWV9DT01QTEVURV9NQVNLIFwKKwlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JU19fQ09QWV9DT01QTEVURV9fX00KKworI2RlZmluZSBBRFJBU1RFQV9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0FERFJFU1MgICAgICAgIDB4MDAwMAorI2RlZmluZSBBRFJBU1RFQV9DRV9XUkFQUEVSX0lOREVYX0JBU0VfTE9XICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBBRFJBU1RFQV9DRV9XUkFQUEVSX0lOREVYX0JBU0VfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwOAorCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSUVfT0ZGU0VUIChBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfSE9TVF9JRVwKKwkJCQktIEFEUkFTVEVBX0NFMF9CQVNFX0FERFJFU1MpCisKKyNkZWZpbmUgQURSQVNURUFfSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0sgXAorCUFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9IT1NUX0lFX19DT1BZX0NPTVBMRVRFX19fTQorCisjZGVmaW5lIEFEUkFTVEVBX1NSX0JBX09GRlNFVCAoQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSX0JBX0xPV1wKKwkJCQktIEFEUkFTVEVBX0NFMF9CQVNFX0FERFJFU1MpCisKKyNkZWZpbmUgQURSQVNURUFfU1JfQkFfQUREUkVTU19ISUdIX09GRlNFVCBcCisJCQkJKEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9CQV9ISUdIIFwKKwkJCQktIEFEUkFTVEVBX0NFMF9CQVNFX0FERFJFU1MpCisKKyNkZWZpbmUgQURSQVNURUFfU1JfU0laRV9PRkZTRVQgKEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUl9TSVpFIFwKKwkJCQkJLSBBRFJBU1RFQV9DRTBfQkFTRV9BRERSRVNTKQorCisjZGVmaW5lIEFEUkFTVEVBX0NFX0NUUkwxX09GRlNFVCAgIChBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDEgXAorCQkJCQktIEFEUkFTVEVBX0NFMF9CQVNFX0FERFJFU1MpCisKKyNkZWZpbmUgQURSQVNURUFfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTUFTSyBcCisJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwxX19ERVNUX01BWF9MRU5HVEhfX19NCisKKyNkZWZpbmUgQURSQVNURUFfRFJfQkFfT0ZGU0VUICAgICAgIChBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFJfQkFfTE9XXAorCQkJCQktIEFEUkFTVEVBX0NFMF9CQVNFX0FERFJFU1MpCisKKyNkZWZpbmUgQURSQVNURUFfRFJfQkFfQUREUkVTU19ISUdIX09GRlNFVCAgKEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9EUl9CQV9ISUdIXAorCQkJCQkJLSBBRFJBU1RFQV9DRTBfQkFTRV9BRERSRVNTKQorCisjZGVmaW5lIEFEUkFTVEVBX0RSX1NJWkVfT0ZGU0VUICAgICAoQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RSX1NJWkVcCisJCQkJCS0gQURSQVNURUFfQ0UwX0JBU0VfQUREUkVTUykKKworI2RlZmluZSBBRFJBU1RFQV9DRV9DTURfUkVHSVNURVJfT0ZGU0VUICAgICAoQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NNRFwKKwkJCQkJCS0gQURSQVNURUFfQ0UwX0JBU0VfQUREUkVTUykKKworI2RlZmluZSBBRFJBU1RFQV9NSVNDX0lFX09GRlNFVCBcCisJKEFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lFIC0gQURSQVNURUFfQ0UwX0JBU0VfQUREUkVTUykKKworI2RlZmluZSBBRFJBU1RFQV9NSVNDX0lTX0FYSV9FUlJfTUFTSyAweDAwMDAwMTAwCisKKyNkZWZpbmUgQURSQVNURUFfTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisKKyNkZWZpbmUgQURSQVNURUFfTUlTQ19JU19BWElfVElNRU9VVF9FUlIgXAorCUFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9NSVNDX0lTX19BWElfVElNRU9VVF9FUlJfX19NCisKKyNkZWZpbmUgQURSQVNURUFfTUlTQ19JU19TUkNfTEVOX0VSUl9NQVNLIFwKKwlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fU1JDX0xFTl9FUlJfX19NCisKKyNkZWZpbmUgQURSQVNURUFfTUlTQ19JU19EU1RfTUFYX0xFTl9WSU9fTUFTS1wKKwlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfTUlTQ19JU19fRFNUX01BWF9MRU5fVklPX19fTQorCisjZGVmaW5lIEFEUkFTVEVBX01JU0NfSVNfRFNUX1JJTkdfT1ZFUkZMT1dfTUFTSyBcCisJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX0RTVF9SSU5HX09WRVJGTE9XX19fTQorCisjZGVmaW5lIEFEUkFTVEVBX01JU0NfSVNfU1JDX1JJTkdfT1ZFUkZMT1dfTUFTSyBcCisJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX01JU0NfSVNfX1NSQ19SSU5HX09WRVJGTE9XX19fTQorCisjZGVmaW5lIEFEUkFTVEVBX1NSQ19XQVRFUk1BUktfTE9XX0xTQiBcCisJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX1NSQ19XQVRFUk1BUktfX1NSX0xPV19XQVRFUl9NQVJLX1RIUkVTT0xEX19fUworCisjZGVmaW5lIEFEUkFTVEVBX1NSQ19XQVRFUk1BUktfSElHSF9MU0IgXAorCUFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9TUkNfV0FURVJNQVJLX19TUl9ISUdIX1dBVEVSX01BUktfVEhSRVNIT0xEX19fUworCisjZGVmaW5lIEFEUkFTVEVBX0RTVF9XQVRFUk1BUktfTE9XX0xTQiBcCisJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0RTVF9XQVRFUk1BUktfX0RSX0xPV19XQVRFUl9NQVJLX1RIUkVTSE9MRF9fX1MKKworI2RlZmluZSBBRFJBU1RFQV9EU1RfV0FURVJNQVJLX0hJR0hfTFNCIFwKKwlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfRFNUX1dBVEVSTUFSS19fRFJfSElHSF9XQVRFUl9NQVJLX1RIUkVTSE9MRF9fX1MKKworI2RlZmluZSBBRFJBU1RFQV9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX01BU0sgXAorCUFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX0NPTU1PTl9XUkFQUEVSX0NFX1dSQVBQRVJfSE9TVF9JTlRFUlJVUFRfU1VNTUFSWV9fSE9TVF9fX00KKworI2RlZmluZSBBRFJBU1RFQV9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX0xTQiBcCisJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfQ09NTU9OX1dSQVBQRVJfQ0VfV1JBUFBFUl9IT1NUX0lOVEVSUlVQVF9TVU1NQVJZX19IT1NUX19fUworCisjZGVmaW5lIEFEUkFTVEVBX0NFX0NUUkwxX0RNQVhfTEVOR1RIX0xTQiBcCisJQURSQVNURUFfQV9XQ1NTX0hNX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UwX0NFX0NUUkwxX19ERVNUX01BWF9MRU5HVEhfX19TCisKKyNkZWZpbmUgQURSQVNURUFfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0sgXAorCUFEUkFTVEVBX0FfV0NTU19ITV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9DRV9DVFJMMV9fU1JDX1JJTkdfQllURV9TV0FQX0VOX19fTQorCisjZGVmaW5lIEFEUkFTVEVBX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9NQVNLIFwKKwlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDFfX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9fX00KKworI2RlZmluZSBBRFJBU1RFQV9DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTFNCIFwKKwlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDFfX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9fX1MKKworI2RlZmluZSBBRFJBU1RFQV9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTFNCIFwKKwlBRFJBU1RFQV9BX1dDU1NfSE1fQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfQ0VfQ1RSTDFfX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9fX1MKKworI2RlZmluZSBBRFJBU1RFQV9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX01BU0sgIDB4MDAwMDAwNAorI2RlZmluZSBBRFJBU1RFQV9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX0xTQiAgIDIKKyNkZWZpbmUgQURSQVNURUFfU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTIFwKKwkoMHgwMDA4ICsgQURSQVNURUFfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBBRFJBU1RFQV9SVENfU1RBVEVfQUREUkVTUyBcCisJKDB4MDAwMCArIEFEUkFTVEVBX1BDSUVfTE9DQUxfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQURSQVNURUFfUlRDX1NUQVRFX0NPTERfUkVTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAweDQwMAorCisjZGVmaW5lIEFEUkFTVEVBX1BDSUVfU09DX1dBS0VfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9QQ0lFX1NPQ19XQUtFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIChBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19GT1JDRV9XQUtFKQorI2RlZmluZSBBRFJBU1RFQV9QQ0lFX1NPQ19XQUtFX1ZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBBRFJBU1RFQV9SVENfU1RBVEVfVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgQURSQVNURUFfUlRDX1NUQVRFX1ZfTFNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFEUkFTVEVBX1JUQ19TVEFURV9WX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBRFJBU1RFQV9QQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBBRFJBU1RFQV9GV19JTkRfRVZFTlRfUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQURSQVNURUFfRldfSU5EX0lOSVRJQUxJWkVEICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFEUkFTVEVBX0ZXX0lORF9IRUxQRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIEFEUkFTVEVBX1BDSUVfSU5UUl9GSVJNV0FSRV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9QQ0lFX0lOVFJfQ0UwX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQURSQVNURUFfUENJRV9JTlRSX0NFX01BU0tfQUxMICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxZmZlCisKKyNkZWZpbmUgQURSQVNURUFfQ1BVX0lOVFJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19MRl9USU1FUl9DT05UUk9MMF9BRERSRVNTICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBBRFJBU1RFQV9TT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0sgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQURSQVNURUFfU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUyBcCisJKDB4MDAwMDAwMDAgKyBfUlRDX1NPQ19SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBBRFJBU1RFQV9TT0NfUkVTRVRfQ09OVFJPTF9DRV9SU1RfTUFTSyAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBBRFJBU1RFQV9TT0NfUkVTRVRfQ09OVFJPTF9DUFVfV0FSTV9SU1RfTUFTSyAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQURSQVNURUFfQ09SRV9DVFJMX0FERFJFU1MgICAgICAgICgweDAwMDAgKyBfU09DX0NPUkVfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQURSQVNURUFfQ09SRV9DVFJMX0NQVV9JTlRSX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFEUkFTVEVBX0xPQ0FMX1NDUkFUQ0hfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOAorI2RlZmluZSBBRFJBU1RFQV9DTE9DS19HUElPX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQURSQVNURUFfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIEFEUkFTVEVBX0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9NQVNLICAgICAgICAgICAgMAorI2RlZmluZSBBRFJBU1RFQV9TT0NfQ0hJUF9JRF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgQURSQVNURUFfU09DX0NISVBfSURfVkVSU0lPTl9NQVNLICAgICAgICAgICAgICAgICAweGZmZmMwMDAwCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19DSElQX0lEX1ZFUlNJT05fTFNCICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQURSQVNURUFfU09DX0NISVBfSURfUkVWSVNJT05fTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19DSElQX0lEX1JFVklTSU9OX0xTQiAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBBRFJBU1RFQV9TT0NfUE9XRVJfUkVHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMGMKKworLyogQ29weSBFbmdpbmUgRGVidWcgKi8KKyNkZWZpbmUgQURSQVNURUFfV0xBTl9ERUJVR19JTlBVVF9TRUxfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwMTBjCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NU0IgICAgICAgICAgICAgMworI2RlZmluZSBBRFJBU1RFQV9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTFNCICAgICAgICAgICAgIDAKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01BU0sgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fREVCVUdfQ09OVFJPTF9PRkZTRVQgICAgICAgICAgICAgICAgMHgwMDAwMDEwOAorI2RlZmluZSBBRFJBU1RFQV9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01TQiAgICAgICAgICAgIDAKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9MU0IgICAgICAgICAgICAwCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBRFJBU1RFQV9XTEFOX0RFQlVHX09VVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTAKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9ERUJVR19PVVRfREFUQV9NU0IgICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBBRFJBU1RFQV9XTEFOX0RFQlVHX09VVF9EQVRBX0xTQiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9ERUJVR19PVVRfREFUQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMGZmZmZmCisjZGVmaW5lIEFEUkFTVEVBX0FNQkFfREVCVUdfQlVTX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExYworI2RlZmluZSBBRFJBU1RFQV9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NU0IgICAgICAgIDEzCisjZGVmaW5lIEFEUkFTVEVBX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX0xTQiAgICAgICAgOAorI2RlZmluZSBBRFJBU1RFQV9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NQVNLICAgICAgIDB4MDAwMDNmMDAKKyNkZWZpbmUgQURSQVNURUFfQU1CQV9ERUJVR19CVVNfU0VMX01TQiAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFEUkFTVEVBX0FNQkFfREVCVUdfQlVTX1NFTF9MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBRFJBU1RFQV9BTUJBX0RFQlVHX0JVU19TRUxfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgQURSQVNURUFfQ0VfV1JBUFBFUl9ERUJVR19PRkZTRVQgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgQURSQVNURUFfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTVNCICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFEUkFTVEVBX0NFX1dSQVBQRVJfREVCVUdfU0VMX0xTQiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBRFJBU1RFQV9DRV9XUkFQUEVSX0RFQlVHX1NFTF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgQURSQVNURUFfQ0VfREVCVUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTQKKyNkZWZpbmUgQURSQVNURUFfQ0VfREVCVUdfU0VMX01TQiAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEFEUkFTVEVBX0NFX0RFQlVHX1NFTF9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBRFJBU1RFQV9DRV9ERUJVR19TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwM2YKKy8qIEVuZCAqLworCisvKiBQTEwgc3RhcnQgKi8KKyNkZWZpbmUgQURSQVNURUFfRUZVU0VfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzJjCisjZGVmaW5lIEFEUkFTVEVBX0VGVVNFX1hUQUxfU0VMX01TQiAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgQURSQVNURUFfRUZVU0VfWFRBTF9TRUxfTFNCICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEFEUkFTVEVBX0VGVVNFX1hUQUxfU0VMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBBRFJBU1RFQV9CQl9QTExfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyZjQKKyNkZWZpbmUgQURSQVNURUFfQkJfUExMX0NPTkZJR19PVVRESVZfTVNCICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBBRFJBU1RFQV9CQl9QTExfQ09ORklHX09VVERJVl9MU0IgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEFEUkFTVEVBX0JCX1BMTF9DT05GSUdfT1VURElWX01BU0sgICAgICAgICAgICAgICAgMHgwMDFjMDAwMAorI2RlZmluZSBBRFJBU1RFQV9CQl9QTExfQ09ORklHX0ZSQUNfTVNCICAgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIEFEUkFTVEVBX0JCX1BMTF9DT05GSUdfRlJBQ19MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBRFJBU1RFQV9CQl9QTExfQ09ORklHX0ZSQUNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwM2ZmZmYKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfU0VUVExFX1RJTUVfTVNCICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1BMTF9TRVRUTEVfVElNRV9MU0IgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfU0VUVExFX1RJTUVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwN2ZmCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUExMX1NFVFRMRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgMHgwMDE4CisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUExMX1NFVFRMRV9TV19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDdmZgorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1BMTF9TRVRUTEVfUlNUTUFTSyAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfU0VUVExFX1JFU0VUICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTVNCICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9MU0IgICAgICAgICAgICAgICAxOAorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX05PUFdEX01BU0sgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTVNCICAgICAgICAgICAgICAxNgorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19MU0IgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01BU0sgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19SRVNFVCAgICAgICAgICAgIDB4MQorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTVNCICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9MU0IgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01BU0sgICAgICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9SRVNFVCAgICAgICAgICAgMHgwCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX01TQiAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTFNCICAgICAgICAgICAgICAxMAorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NQVNLICAgICAgICAgICAgIDB4MDAwMDNjMDAKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfUkVTRVQgICAgICAgICAgICAweDAKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9ESVZfTVNCICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfRElWX0xTQiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX0RJVl9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAzZmYKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9ESVZfUkVTRVQgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfT0ZGU0VUICAgICAgICAgICAgICAgICAgMHgwMDE0CisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfU1dfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDFmZmZmZgorI2RlZmluZSBBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX1JTVE1BU0sgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9SRVNFVCAgICAgICAgICAgICAgICAgICAweDAwMDEwMDExCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19DT1JFX0NMS19DVFJMX09GRlNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDExNAorI2RlZmluZSBBRFJBU1RFQV9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTVNCICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQURSQVNURUFfU09DX0NPUkVfQ0xLX0NUUkxfRElWX0xTQiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBBRFJBU1RFQV9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX01TQiAgICAgICAgIDUKKyNkZWZpbmUgQURSQVNURUFfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19MU0IgICAgICAgICA1CisjZGVmaW5lIEFEUkFTVEVBX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTUFTSyAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBRFJBU1RFQV9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX1JFU0VUICAgICAgIDB4MAorI2RlZmluZSBBRFJBU1RFQV9SVENfU1lOQ19TVEFUVVNfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MDI0NAorI2RlZmluZSBBRFJBU1RFQV9TT0NfQ1BVX0NMT0NLX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQURSQVNURUFfU09DX0NQVV9DTE9DS19TVEFOREFSRF9NU0IgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFEUkFTVEVBX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBBRFJBU1RFQV9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKy8qIFBMTCBlbmQgKi8KKworI2RlZmluZSBBRFJBU1RFQV9QQ0lFX0lOVFJfQ0VfTUFTSyhuKSAoQURSQVNURUFfUENJRV9JTlRSX0NFMF9NQVNLIDw8IChuKSkKKyNkZWZpbmUgQURSQVNURUFfRFJBTV9CQVNFX0FERFJFU1MgICAgIEFEUkFTVEVBX1RBUkdfRFJBTV9TVEFSVAorI2RlZmluZSBBRFJBU1RFQV9GV19JTkRJQ0FUT1JfQUREUkVTUyBcCisJKEFEUkFTVEVBX1dJRklDTU5fQkFTRV9BRERSRVNTICsgQURSQVNURUFfU0NSQVRDSF8zX0FERFJFU1MpCisjZGVmaW5lIEFEUkFTVEVBX1NZU1RFTV9TTEVFUF9PRkZTRVQgICAgICAgQURSQVNURUFfU09DX1NZU1RFTV9TTEVFUF9PRkZTRVQKKyNkZWZpbmUgQURSQVNURUFfV0xBTl9TWVNURU1fU0xFRVBfT0ZGU0VUICAoMHgwMDJjICsgX1dJRklfUlRDX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIEFEUkFTVEVBX1dMQU5fUkVTRVRfQ09OVFJPTF9PRkZTRVQgKDB4MDAwMCArIF9XSUZJX1JUQ19SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBBRFJBU1RFQV9DTE9DS19DT05UUk9MX09GRlNFVCAgICAgIEFEUkFTVEVBX1NPQ19DTE9DS19DT05UUk9MX09GRlNFVAorI2RlZmluZSBBRFJBU1RFQV9DTE9DS19DT05UUk9MX1NJMF9DTEtfTUFTSyBcCisJQURSQVNURUFfU09DX0NMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLCisjZGVmaW5lIEFEUkFTVEVBX1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfTUFTSyAweDAwMDAwMDA0CisjZGVmaW5lIEFEUkFTVEVBX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLIFwKKwlBRFJBU1RFQV9TT0NfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0sKKyNkZWZpbmUgQURSQVNURUFfR1BJT19CQVNFX0FERFJFU1MgICAgICAgICBBRFJBU1RFQV9XTEFOX0dQSU9fQkFTRV9BRERSRVNTCisjZGVmaW5lIEFEUkFTVEVBX0dQSU9fUElOMF9PRkZTRVQgICAgICAgICAgQURSQVNURUFfV0xBTl9HUElPX1BJTjBfQUREUkVTUworI2RlZmluZSBBRFJBU1RFQV9HUElPX1BJTjFfT0ZGU0VUICAgICAgICAgIEFEUkFTVEVBX1dMQU5fR1BJT19QSU4xX0FERFJFU1MKKyNkZWZpbmUgQURSQVNURUFfR1BJT19QSU4wX0NPTkZJR19NQVNLICAgICBBRFJBU1RFQV9XTEFOX0dQSU9fUElOMF9DT05GSUdfTUFTSworI2RlZmluZSBBRFJBU1RFQV9HUElPX1BJTjFfQ09ORklHX01BU0sgICAgIEFEUkFTVEVBX1dMQU5fR1BJT19QSU4xX0NPTkZJR19NQVNLCisjZGVmaW5lIEFEUkFTVEVBX1NJX0JBU0VfQUREUkVTUyAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBRFJBU1RFQV9DUFVfQ0xPQ0tfT0ZGU0VUICAgICAgICAgICgweDIwICsgX1JUQ19TT0NfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQURSQVNURUFfTFBPX0NBTF9PRkZTRVQgICAgICAgICAgICBBRFJBU1RFQV9TT0NfTFBPX0NBTF9PRkZTRVQKKyNkZWZpbmUgQURSQVNURUFfR1BJT19QSU4xMF9PRkZTRVQgICAgICAgICBBRFJBU1RFQV9XTEFOX0dQSU9fUElOMTBfQUREUkVTUworI2RlZmluZSBBRFJBU1RFQV9HUElPX1BJTjExX09GRlNFVCAgICAgICAgIEFEUkFTVEVBX1dMQU5fR1BJT19QSU4xMV9BRERSRVNTCisjZGVmaW5lIEFEUkFTVEVBX0dQSU9fUElOMTJfT0ZGU0VUICAgICAgICAgQURSQVNURUFfV0xBTl9HUElPX1BJTjEyX0FERFJFU1MKKyNkZWZpbmUgQURSQVNURUFfR1BJT19QSU4xM19PRkZTRVQgICAgICAgICBBRFJBU1RFQV9XTEFOX0dQSU9fUElOMTNfQUREUkVTUworI2RlZmluZSBBRFJBU1RFQV9DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCICAgIDAKKyNkZWZpbmUgQURSQVNURUFfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgICAweDEKKyNkZWZpbmUgQURSQVNURUFfTFBPX0NBTF9FTkFCTEVfTFNCICAgICAgICBBRFJBU1RFQV9TT0NfTFBPX0NBTF9FTkFCTEVfTFNCCisjZGVmaW5lIEFEUkFTVEVBX0xQT19DQUxfRU5BQkxFX01BU0sgICAgICAgQURSQVNURUFfU09DX0xQT19DQUxfRU5BQkxFX01BU0sKKyNkZWZpbmUgQURSQVNURUFfQU5BTE9HX0lOVEZfQkFTRV9BRERSRVNTICBBRFJBU1RFQV9XTEFOX0FOQUxPR19JTlRGX0JBU0VfQUREUkVTUworI2RlZmluZSBBRFJBU1RFQV9NQk9YX0JBU0VfQUREUkVTUyAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQURSQVNURUFfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTFNCICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX01BU0sgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9MU0IgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9NQVNLICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0lOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTFNCICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0lOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTUFTSyAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9MU0IgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9NQVNLICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX0xTQiAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX01BU0sgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTFNCICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTUFTSyAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX01BU0sgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0lOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1MgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTFNCICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSyAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSU5UX1NUQVRVU19BRERSRVNTICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0NQVV9JTlRfU1RBVFVTX0FERFJFU1MgICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfQUREUkVTUyAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX01BU0sgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX0xTQiAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX01BU0sgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX0xTQiAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSyAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTFNCICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0NPVU5UX0RFQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSU5UX1NUQVRVU19DUFVfTUFTSyAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSU5UX1NUQVRVU19DUFVfTFNCICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSU5UX1NUQVRVU19FUlJPUl9NQVNLICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSU5UX1NUQVRVU19FUlJPUl9MU0IgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSU5UX1NUQVRVU19DT1VOVEVSX01BU0sgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX0hPU1RfSU5UX1NUQVRVU19DT1VOVEVSX0xTQiAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX1JYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX1dJTkRPV19EQVRBX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX1dJTkRPV19SRUFEX0FERFJfQUREUkVTUyAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFEUkFTVEVBX1dJTkRPV19XUklURV9BRERSX0FERFJFU1MgICAgICAgICAgICAgICBNSVNTSU5HCisKKy8qIFNoYWRvdyBSZWdpc3RlcnMgLSBTdGFydCAqLworI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMCBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTAKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEgXAorCQkJCQlBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUUxCisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8yIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMgorI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMyBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTMKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzQgXAorCQkJCQlBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU0CisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV81IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFNQorI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfNiBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTYKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzcgXAorCQkJCQlBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfVkFMVUU3CisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV84IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFOAorI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfOSBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19WQUxVRTkKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEwIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTAKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzExIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTEKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEyIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTIKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEzIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTMKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE0IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTQKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE1IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTUKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE2IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTYKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE3IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTcKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE4IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTgKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE5IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMTkKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIwIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjAKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIxIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjEKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIyIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjIKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIzIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX1ZBTFVFMjMKKworI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18wIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MwCisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEgXAorCQkJCQlBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMiBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMgorI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18zIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MzCisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzQgXAorCQkJCQlBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzQKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfNSBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTNQorI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU182IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M2CisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzcgXAorCQkJCQlBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzcKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfOCBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTOAorI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU185IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1M5CisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEwIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxMAorI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xMSBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTEKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMTIgXAorCQkJCQlBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzEyCisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEzIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxMworI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xNCBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTQKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMTUgXAorCQkJCQlBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE1CisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE2IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxNgorI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xNyBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMTcKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMTggXAorCQkJCQlBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzE4CisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE5IFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MxOQorI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18yMCBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjAKKyNkZWZpbmUgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMjEgXAorCQkJCQlBRFJBU1RFQV9BX1dDU1NfU1JfQVBTU19TSEFET1dfQUREUkVTUzIxCisjZGVmaW5lIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIyIFwKKwkJCQkJQURSQVNURUFfQV9XQ1NTX1NSX0FQU1NfU0hBRE9XX0FERFJFU1MyMgorI2RlZmluZSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18yMyBcCisJCQkJCUFEUkFTVEVBX0FfV0NTU19TUl9BUFNTX1NIQURPV19BRERSRVNTMjMKKworLyogUTYgaUhlbGl1bSBlbXVsYXRpb24gcmVnaXN0ZXJzICovCisjZGVmaW5lIEFEUkFTVEVBX0FfU09DX0NPUkVfUENJRV9JTlRSX0NBVVNFX0dSUDEJMHgwMDExMzAxOAorI2RlZmluZSBBRFJBU1RFQV9BX1NPQ19DT1JFX1NQQVJFXzFfUkVHSVNURVIJCTB4MDAxMTMxODQKKyNkZWZpbmUgQURSQVNURUFfQV9TT0NfQ09SRV9QQ0lFX0lOVFJfQ0xSX0dSUDEJCTB4MDAxMTMwMjAKKyNkZWZpbmUgQURSQVNURUFfQV9TT0NfQ09SRV9QQ0lFX0lOVFJfRU5BQkxFX0dSUDEJMHgwMDExMzAxMAorI2RlZmluZSBBRFJBU1RFQV9BX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8wCQkweDAwMTMwMDQwCisjZGVmaW5lIEFEUkFTVEVBX0FfU09DX1BDSUVfUENJRV9TQ1JBVENIXzEJCTB4MDAxMzAwNDQKKworI2RlZmluZSBBRFJBU1RFQV9IT1NUX0VOQUJMRV9SRUdJU1RFUiAgICAweDAwMTg4MDAwCisjZGVmaW5lIEFEUkFTVEVBX1E2X0VOQUJMRV9SRUdJU1RFUl8wICAgIDB4MDAxODgwMDQKKyNkZWZpbmUgQURSQVNURUFfUTZfRU5BQkxFX1JFR0lTVEVSXzEgICAgMHgwMDE4ODAwOAorI2RlZmluZSBBRFJBU1RFQV9IT1NUX0NBVVNFX1JFR0lTVEVSICAgICAweDAwMTg4MDBjCisjZGVmaW5lIEFEUkFTVEVBX1E2X0NBVVNFX1JFR0lTVEVSXzAgICAgIDB4MDAxODgwMTAKKyNkZWZpbmUgQURSQVNURUFfUTZfQ0FVU0VfUkVHSVNURVJfMSAgICAgMHgwMDE4ODAxNAorI2RlZmluZSBBRFJBU1RFQV9IT1NUX0NMRUFSX1JFR0lTVEVSICAgICAweDAwMTg4MDE4CisjZGVmaW5lIEFEUkFTVEVBX1E2X0NMRUFSX1JFR0lTVEVSXzAgICAgIDB4MDAxODgwMWMKKyNkZWZpbmUgQURSQVNURUFfUTZfQ0xFQVJfUkVHSVNURVJfMSAgICAgMHgwMDE4ODAyMAorCisjZGVmaW5lIEFEUkFTVEVBX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfVEFSR0VUX0hPU1RfREVMVEEJMHgwOAorI2RlZmluZSBBRFJBU1RFQV9BX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8yCQkJMHgwMDEzMDA1QworI2lmZGVmIFFDQV9XSUZJXzNfMF9JSEVMSVVNCisjZGVmaW5lIEFEUkFTVEVBX0FfU09DX0NPUkVfUENJRV9JTlRSX0VOQUJMRV9HUlAwX1E2X01BU0sgICAgICAgIDB4ZmYKKyNlbHNlCisjZGVmaW5lIEFEUkFTVEVBX0FfU09DX0NPUkVfUENJRV9JTlRSX0VOQUJMRV9HUlAwX1E2X01BU0sgICAgICAgIDB4MAorI2VuZGlmIC8qIFFDQV9XSUZJXzNfMF9JSEVMSVVNICovCisvKiBlbmQ6IFE2IGlIZWxpdW0gZW11bGF0aW9uIHJlZ2lzdGVycyAqLworCitzdHJ1Y3QgdGFyZ2V0ZGVmX3MgYWRyYXN0ZWFfdGFyZ2V0ZGVmID0geworCS5kX1JUQ19TT0NfQkFTRV9BRERSRVNTID0gQURSQVNURUFfUlRDX1NPQ19CQVNFX0FERFJFU1MsCisJLmRfUlRDX1dNQUNfQkFTRV9BRERSRVNTID0gQURSQVNURUFfUlRDX1dNQUNfQkFTRV9BRERSRVNTLAorCS5kX1NZU1RFTV9TTEVFUF9PRkZTRVQgPSBBRFJBU1RFQV9XTEFOX1NZU1RFTV9TTEVFUF9PRkZTRVQsCisJLmRfV0xBTl9TWVNURU1fU0xFRVBfT0ZGU0VUID0gQURSQVNURUFfV0xBTl9TWVNURU1fU0xFRVBfT0ZGU0VULAorCS5kX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTFNCID0KKwlBRFJBU1RFQV9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX0xTQiwKKwkuZF9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX01BU0sgPQorCUFEUkFTVEVBX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSywKKwkuZF9DTE9DS19DT05UUk9MX09GRlNFVCA9IEFEUkFTVEVBX0NMT0NLX0NPTlRST0xfT0ZGU0VULAorCS5kX0NMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLID0gQURSQVNURUFfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0ssCisJLmRfUkVTRVRfQ09OVFJPTF9PRkZTRVQgPSBBRFJBU1RFQV9TT0NfUkVTRVRfQ09OVFJPTF9PRkZTRVQsCisJLmRfUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9NQVNLID0gQURSQVNURUFfUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9NQVNLLAorCS5kX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLID0gQURSQVNURUFfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0ssCisJLmRfV0xBTl9SRVNFVF9DT05UUk9MX09GRlNFVCA9IEFEUkFTVEVBX1dMQU5fUkVTRVRfQ09OVFJPTF9PRkZTRVQsCisJLmRfV0xBTl9SRVNFVF9DT05UUk9MX0NPTERfUlNUX01BU0sgPQorCUFEUkFTVEVBX1dMQU5fUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9NQVNLLAorCS5kX1dMQU5fUkVTRVRfQ09OVFJPTF9XQVJNX1JTVF9NQVNLID0KKwlBRFJBU1RFQV9XTEFOX1JFU0VUX0NPTlRST0xfV0FSTV9SU1RfTUFTSywKKwkuZF9HUElPX0JBU0VfQUREUkVTUyA9IEFEUkFTVEVBX0dQSU9fQkFTRV9BRERSRVNTLAorCS5kX0dQSU9fUElOMF9PRkZTRVQgPSBBRFJBU1RFQV9HUElPX1BJTjBfT0ZGU0VULAorCS5kX0dQSU9fUElOMV9PRkZTRVQgPSBBRFJBU1RFQV9HUElPX1BJTjFfT0ZGU0VULAorCS5kX0dQSU9fUElOMF9DT05GSUdfTUFTSyA9IEFEUkFTVEVBX0dQSU9fUElOMF9DT05GSUdfTUFTSywKKwkuZF9HUElPX1BJTjFfQ09ORklHX01BU0sgPSBBRFJBU1RFQV9HUElPX1BJTjFfQ09ORklHX01BU0ssCisJLmRfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTFNCID0gQURSQVNURUFfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTFNCLAorCS5kX1NJX0NPTkZJR19CSURJUl9PRF9EQVRBX01BU0sgPSBBRFJBU1RFQV9TSV9DT05GSUdfQklESVJfT0RfREFUQV9NQVNLLAorCS5kX1NJX0NPTkZJR19JMkNfTFNCID0gQURSQVNURUFfU0lfQ09ORklHX0kyQ19MU0IsCisJLmRfU0lfQ09ORklHX0kyQ19NQVNLID0gQURSQVNURUFfU0lfQ09ORklHX0kyQ19NQVNLLAorCS5kX1NJX0NPTkZJR19QT1NfU0FNUExFX0xTQiA9IEFEUkFTVEVBX1NJX0NPTkZJR19QT1NfU0FNUExFX0xTQiwKKwkuZF9TSV9DT05GSUdfUE9TX1NBTVBMRV9NQVNLID0gQURSQVNURUFfU0lfQ09ORklHX1BPU19TQU1QTEVfTUFTSywKKwkuZF9TSV9DT05GSUdfSU5BQ1RJVkVfQ0xLX0xTQiA9IEFEUkFTVEVBX1NJX0NPTkZJR19JTkFDVElWRV9DTEtfTFNCLAorCS5kX1NJX0NPTkZJR19JTkFDVElWRV9DTEtfTUFTSyA9IEFEUkFTVEVBX1NJX0NPTkZJR19JTkFDVElWRV9DTEtfTUFTSywKKwkuZF9TSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9MU0IgPSBBRFJBU1RFQV9TSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9MU0IsCisJLmRfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSyA9IEFEUkFTVEVBX1NJX0NPTkZJR19JTkFDVElWRV9EQVRBX01BU0ssCisJLmRfU0lfQ09ORklHX0RJVklERVJfTFNCID0gQURSQVNURUFfU0lfQ09ORklHX0RJVklERVJfTFNCLAorCS5kX1NJX0NPTkZJR19ESVZJREVSX01BU0sgPSBBRFJBU1RFQV9TSV9DT05GSUdfRElWSURFUl9NQVNLLAorCS5kX1NJX0JBU0VfQUREUkVTUyA9IEFEUkFTVEVBX1NJX0JBU0VfQUREUkVTUywKKwkuZF9TSV9DT05GSUdfT0ZGU0VUID0gQURSQVNURUFfU0lfQ09ORklHX09GRlNFVCwKKwkuZF9TSV9UWF9EQVRBMF9PRkZTRVQgPSBBRFJBU1RFQV9TSV9UWF9EQVRBMF9PRkZTRVQsCisJLmRfU0lfVFhfREFUQTFfT0ZGU0VUID0gQURSQVNURUFfU0lfVFhfREFUQTFfT0ZGU0VULAorCS5kX1NJX1JYX0RBVEEwX09GRlNFVCA9IEFEUkFTVEVBX1NJX1JYX0RBVEEwX09GRlNFVCwKKwkuZF9TSV9SWF9EQVRBMV9PRkZTRVQgPSBBRFJBU1RFQV9TSV9SWF9EQVRBMV9PRkZTRVQsCisJLmRfU0lfQ1NfT0ZGU0VUID0gQURSQVNURUFfU0lfQ1NfT0ZGU0VULAorCS5kX1NJX0NTX0RPTkVfRVJSX01BU0sgPSBBRFJBU1RFQV9TSV9DU19ET05FX0VSUl9NQVNLLAorCS5kX1NJX0NTX0RPTkVfSU5UX01BU0sgPSBBRFJBU1RFQV9TSV9DU19ET05FX0lOVF9NQVNLLAorCS5kX1NJX0NTX1NUQVJUX0xTQiA9IEFEUkFTVEVBX1NJX0NTX1NUQVJUX0xTQiwKKwkuZF9TSV9DU19TVEFSVF9NQVNLID0gQURSQVNURUFfU0lfQ1NfU1RBUlRfTUFTSywKKwkuZF9TSV9DU19SWF9DTlRfTFNCID0gQURSQVNURUFfU0lfQ1NfUlhfQ05UX0xTQiwKKwkuZF9TSV9DU19SWF9DTlRfTUFTSyA9IEFEUkFTVEVBX1NJX0NTX1JYX0NOVF9NQVNLLAorCS5kX1NJX0NTX1RYX0NOVF9MU0IgPSBBRFJBU1RFQV9TSV9DU19UWF9DTlRfTFNCLAorCS5kX1NJX0NTX1RYX0NOVF9NQVNLID0gQURSQVNURUFfU0lfQ1NfVFhfQ05UX01BU0ssCisJLmRfQk9BUkRfREFUQV9TWiA9IEFEUkFTVEVBX0JPQVJEX0RBVEFfU1osCisJLmRfQk9BUkRfRVhUX0RBVEFfU1ogPSBBRFJBU1RFQV9CT0FSRF9FWFRfREFUQV9TWiwKKwkuZF9NQk9YX0JBU0VfQUREUkVTUyA9IEFEUkFTVEVBX01CT1hfQkFTRV9BRERSRVNTLAorCS5kX0xPQ0FMX1NDUkFUQ0hfT0ZGU0VUID0gQURSQVNURUFfTE9DQUxfU0NSQVRDSF9PRkZTRVQsCisJLmRfQ1BVX0NMT0NLX09GRlNFVCA9IEFEUkFTVEVBX0NQVV9DTE9DS19PRkZTRVQsCisJLmRfTFBPX0NBTF9PRkZTRVQgPSBBRFJBU1RFQV9MUE9fQ0FMX09GRlNFVCwKKwkuZF9HUElPX1BJTjEwX09GRlNFVCA9IEFEUkFTVEVBX0dQSU9fUElOMTBfT0ZGU0VULAorCS5kX0dQSU9fUElOMTFfT0ZGU0VUID0gQURSQVNURUFfR1BJT19QSU4xMV9PRkZTRVQsCisJLmRfR1BJT19QSU4xMl9PRkZTRVQgPSBBRFJBU1RFQV9HUElPX1BJTjEyX09GRlNFVCwKKwkuZF9HUElPX1BJTjEzX09GRlNFVCA9IEFEUkFTVEVBX0dQSU9fUElOMTNfT0ZGU0VULAorCS5kX0NMT0NLX0dQSU9fT0ZGU0VUID0gQURSQVNURUFfQ0xPQ0tfR1BJT19PRkZTRVQsCisJLmRfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiA9IEFEUkFTVEVBX0NQVV9DTE9DS19TVEFOREFSRF9MU0IsCisJLmRfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgPSBBRFJBU1RFQV9DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSywKKwkuZF9MUE9fQ0FMX0VOQUJMRV9MU0IgPSBBRFJBU1RFQV9MUE9fQ0FMX0VOQUJMRV9MU0IsCisJLmRfTFBPX0NBTF9FTkFCTEVfTUFTSyA9IEFEUkFTVEVBX0xQT19DQUxfRU5BQkxFX01BU0ssCisJLmRfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQiA9IEFEUkFTVEVBX0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9MU0IsCisJLmRfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX01BU0sgPQorCQlBRFJBU1RFQV9DTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTUFTSywKKwkuZF9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MgPSBBRFJBU1RFQV9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MsCisJLmRfV0xBTl9NQUNfQkFTRV9BRERSRVNTID0gQURSQVNURUFfV0xBTl9NQUNfQkFTRV9BRERSRVNTLAorCS5kX0ZXX0lORElDQVRPUl9BRERSRVNTID0gQURSQVNURUFfRldfSU5ESUNBVE9SX0FERFJFU1MsCisJLmRfRFJBTV9CQVNFX0FERFJFU1MgPSBBRFJBU1RFQV9EUkFNX0JBU0VfQUREUkVTUywKKwkuZF9TT0NfQ09SRV9CQVNFX0FERFJFU1MgPSBBRFJBU1RFQV9TT0NfQ09SRV9CQVNFX0FERFJFU1MsCisJLmRfQ09SRV9DVFJMX0FERFJFU1MgPSBBRFJBU1RFQV9DT1JFX0NUUkxfQUREUkVTUywKKwkuZF9DRV9DT1VOVCA9IEFEUkFTVEVBX0NFX0NPVU5ULAorCS5kX01TSV9OVU1fUkVRVUVTVCA9IE1TSV9OVU1fUkVRVUVTVCwKKwkuZF9NU0lfQVNTSUdOX0ZXID0gTVNJX0FTU0lHTl9GVywKKwkuZF9NU0lfQVNTSUdOX0NFX0lOSVRJQUwgPSBNU0lfQVNTSUdOX0NFX0lOSVRJQUwsCisJLmRfUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTID0gQURSQVNURUFfSE9TVF9FTkFCTEVfUkVHSVNURVIsCisJLmRfUENJRV9JTlRSX0NMUl9BRERSRVNTID0gQURSQVNURUFfSE9TVF9DTEVBUl9SRUdJU1RFUiwKKwkuZF9QQ0lFX0lOVFJfRklSTVdBUkVfTUFTSyA9IEFEUkFTVEVBX1BDSUVfSU5UUl9GSVJNV0FSRV9NQVNLLAorCS5kX1BDSUVfSU5UUl9DRV9NQVNLX0FMTCA9IEFEUkFTVEVBX1BDSUVfSU5UUl9DRV9NQVNLX0FMTCwKKwkuZF9DT1JFX0NUUkxfQ1BVX0lOVFJfTUFTSyA9IEFEUkFTVEVBX0NPUkVfQ1RSTF9DUFVfSU5UUl9NQVNLLAorCS5kX1NSX1dSX0lOREVYX0FERFJFU1MgPSBBRFJBU1RFQV9TUl9XUl9JTkRFWF9PRkZTRVQsCisJLmRfRFNUX1dBVEVSTUFSS19BRERSRVNTID0gQURSQVNURUFfRFNUX1dBVEVSTUFSS19PRkZTRVQsCisJLyogaHR0X3J4LmMgKi8KKwkuZF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSyA9CisJQURSQVNURUFfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX01BU0ssCisJLmRfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX0xTQiA9IEFEUkFTVEVBX1JYX01TRFVfRU5EXzRfRklSU1RfTVNEVV9MU0IsCisJLmRfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTUFTSyA9IEFEUkFTVEVBX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX01BU0ssCisJLmRfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTFNCID0gQURSQVNURUFfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTFNCLAorCS5kX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9MU0IgPSBBRFJBU1RFQV9SWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTFNCLAorCS5kX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9NQVNLID0KKwkJQURSQVNURUFfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX01BU0ssCisJLmRfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9NQVNLID0KKwkJQURSQVNURUFfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9NQVNLLAorCS5kX1JYX01TRFVfRU5EXzFfRVhUX1dBUElfUE5fNjNfNDhfTFNCID0KKwkJQURSQVNURUFfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0IsCisJLmRfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTUFTSyA9IEFEUkFTVEVBX1JYX01TRFVfRU5EXzRfTEFTVF9NU0RVX01BU0ssCisJLmRfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCID0gQURSQVNURUFfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCLAorCS5kX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX01BU0sgPQorCQlBRFJBU1RFQV9SWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9NQVNLLAorCS5kX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX0xTQiA9CisJCUFEUkFTVEVBX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX0xTQiwKKwkuZF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9NQVNLID0gQURSQVNURUFfUlhfQVRURU5USU9OXzBfRlJBR01FTlRfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0IgPSBBRFJBU1RFQV9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0IsCisJLmRfUlhfQVRURU5USU9OXzBfTVBEVV9MRU5HVEhfRVJSX01BU0sgPQorCQlBRFJBU1RFQV9SWF9BVFRFTlRJT05fMF9NUERVX0xFTkdUSF9FUlJfTUFTSywKKwkuZF9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX01BU0sgPQorCQlBRFJBU1RFQV9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX01BU0ssCisJLmRfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9MU0IgPQorCQlBRFJBU1RFQV9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX0xTQiwKKwkuZF9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTUFTSyA9CisJCUFEUkFTVEVBX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9NQVNLLAorCS5kX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9MU0IgPQorCQlBRFJBU1RFQV9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTFNCLAorCS5kX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfT0ZGU0VUID0KKwkJQURSQVNURUFfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9PRkZTRVQsCisJLmRfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9NQVNLID0KKwkJQURSQVNURUFfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9NQVNLLAorCS5kX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTFNCID0KKwkJQURSQVNURUFfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9MU0IsCisJLmRfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9NQVNLID0KKwkJQURSQVNURUFfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9NQVNLLAorCS5kX1JYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTFNCID0KKwkJQURSQVNURUFfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9MU0IsCisJLmRfUlhfQVRURU5USU9OXzBfTU9SRV9EQVRBX01BU0sgPQorCQlBRFJBU1RFQV9SWF9BVFRFTlRJT05fMF9NT1JFX0RBVEFfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9NU0RVX0RPTkVfTUFTSyA9CisJCUFEUkFTVEVBX1JYX0FUVEVOVElPTl8wX01TRFVfRE9ORV9NQVNLLAorCS5kX1JYX0FUVEVOVElPTl8wX1RDUF9VRFBfQ0hLU1VNX0ZBSUxfTUFTSyA9CisJCUFEUkFTVEVBX1JYX0FUVEVOVElPTl8wX1RDUF9VRFBfQ0hLU1VNX0ZBSUxfTUFTSywKKworCS8qIFBMTCBzdGFydCAqLworCS5kX0VGVVNFX09GRlNFVCA9IEFEUkFTVEVBX0VGVVNFX09GRlNFVCwKKwkuZF9FRlVTRV9YVEFMX1NFTF9NU0IgPSBBRFJBU1RFQV9FRlVTRV9YVEFMX1NFTF9NU0IsCisJLmRfRUZVU0VfWFRBTF9TRUxfTFNCID0gQURSQVNURUFfRUZVU0VfWFRBTF9TRUxfTFNCLAorCS5kX0VGVVNFX1hUQUxfU0VMX01BU0sgPSBBRFJBU1RFQV9FRlVTRV9YVEFMX1NFTF9NQVNLLAorCS5kX0JCX1BMTF9DT05GSUdfT0ZGU0VUID0gQURSQVNURUFfQkJfUExMX0NPTkZJR19PRkZTRVQsCisJLmRfQkJfUExMX0NPTkZJR19PVVRESVZfTVNCID0gQURSQVNURUFfQkJfUExMX0NPTkZJR19PVVRESVZfTVNCLAorCS5kX0JCX1BMTF9DT05GSUdfT1VURElWX0xTQiA9IEFEUkFTVEVBX0JCX1BMTF9DT05GSUdfT1VURElWX0xTQiwKKwkuZF9CQl9QTExfQ09ORklHX09VVERJVl9NQVNLID0gQURSQVNURUFfQkJfUExMX0NPTkZJR19PVVRESVZfTUFTSywKKwkuZF9CQl9QTExfQ09ORklHX0ZSQUNfTVNCID0gQURSQVNURUFfQkJfUExMX0NPTkZJR19GUkFDX01TQiwKKwkuZF9CQl9QTExfQ09ORklHX0ZSQUNfTFNCID0gQURSQVNURUFfQkJfUExMX0NPTkZJR19GUkFDX0xTQiwKKwkuZF9CQl9QTExfQ09ORklHX0ZSQUNfTUFTSyA9IEFEUkFTVEVBX0JCX1BMTF9DT05GSUdfRlJBQ19NQVNLLAorCS5kX1dMQU5fUExMX1NFVFRMRV9USU1FX01TQiA9IEFEUkFTVEVBX1dMQU5fUExMX1NFVFRMRV9USU1FX01TQiwKKwkuZF9XTEFOX1BMTF9TRVRUTEVfVElNRV9MU0IgPSBBRFJBU1RFQV9XTEFOX1BMTF9TRVRUTEVfVElNRV9MU0IsCisJLmRfV0xBTl9QTExfU0VUVExFX1RJTUVfTUFTSyA9IEFEUkFTVEVBX1dMQU5fUExMX1NFVFRMRV9USU1FX01BU0ssCisJLmRfV0xBTl9QTExfU0VUVExFX09GRlNFVCA9IEFEUkFTVEVBX1dMQU5fUExMX1NFVFRMRV9PRkZTRVQsCisJLmRfV0xBTl9QTExfU0VUVExFX1NXX01BU0sgPSBBRFJBU1RFQV9XTEFOX1BMTF9TRVRUTEVfU1dfTUFTSywKKwkuZF9XTEFOX1BMTF9TRVRUTEVfUlNUTUFTSyA9IEFEUkFTVEVBX1dMQU5fUExMX1NFVFRMRV9SU1RNQVNLLAorCS5kX1dMQU5fUExMX1NFVFRMRV9SRVNFVCA9IEFEUkFTVEVBX1dMQU5fUExMX1NFVFRMRV9SRVNFVCwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX05PUFdEX01TQiA9IEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTVNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTFNCID0gQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9MU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NQVNLID0gQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01TQiA9IEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01TQiwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19MU0IgPSBBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19MU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTUFTSyA9IEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01BU0ssCisJLmRfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfUkVTRVQgPQorCQlBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19SRVNFVCwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTVNCID0gQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01TQiwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTFNCID0gQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX0xTQiwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTUFTSyA9CisJCUFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9NQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9SRVNFVCA9CisJCUFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9SRVNFVCwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NU0IgPSBBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTFNCID0gQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTFNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX01BU0sgPSBBRFJBU1RFQV9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX1JFU0VUID0KKwkJQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfUkVTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9ESVZfTVNCID0gQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9ESVZfTVNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfRElWX0xTQiA9IEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfRElWX0xTQiwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0RJVl9NQVNLID0gQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9ESVZfTUFTSywKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0RJVl9SRVNFVCA9IEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfRElWX1JFU0VULAorCS5kX1dMQU5fUExMX0NPTlRST0xfT0ZGU0VUID0gQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9PRkZTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9TV19NQVNLID0gQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9TV19NQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfUlNUTUFTSyA9IEFEUkFTVEVBX1dMQU5fUExMX0NPTlRST0xfUlNUTUFTSywKKwkuZF9XTEFOX1BMTF9DT05UUk9MX1JFU0VUID0gQURSQVNURUFfV0xBTl9QTExfQ09OVFJPTF9SRVNFVCwKKwkuZF9TT0NfQ09SRV9DTEtfQ1RSTF9PRkZTRVQgPSBBRFJBU1RFQV9TT0NfQ09SRV9DTEtfQ1RSTF9PRkZTRVQsCisJLmRfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01TQiA9IEFEUkFTVEVBX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9NU0IsCisJLmRfU09DX0NPUkVfQ0xLX0NUUkxfRElWX0xTQiA9IEFEUkFTVEVBX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9MU0IsCisJLmRfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0sgPSBBRFJBU1RFQV9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTUFTSywKKwkuZF9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX01TQiA9CisJCUFEUkFTVEVBX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTVNCLAorCS5kX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTFNCID0KKwkJQURSQVNURUFfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19MU0IsCisJLmRfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NQVNLID0KKwkJQURSQVNURUFfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NQVNLLAorCS5kX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfUkVTRVQgPQorCQlBRFJBU1RFQV9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX1JFU0VULAorCS5kX1JUQ19TWU5DX1NUQVRVU19PRkZTRVQgPSBBRFJBU1RFQV9SVENfU1lOQ19TVEFUVVNfT0ZGU0VULAorCS5kX1NPQ19DUFVfQ0xPQ0tfT0ZGU0VUID0gQURSQVNURUFfU09DX0NQVV9DTE9DS19PRkZTRVQsCisJLmRfU09DX0NQVV9DTE9DS19TVEFOREFSRF9NU0IgPSBBRFJBU1RFQV9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01TQiwKKwkuZF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiA9IEFEUkFTVEVBX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCLAorCS5kX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSyA9IEFEUkFTVEVBX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSywKKwkvKiBQTEwgZW5kICovCisJLmRfU09DX1BPV0VSX1JFR19PRkZTRVQgPSBBRFJBU1RFQV9TT0NfUE9XRVJfUkVHX09GRlNFVCwKKwkuZF9QQ0lFX0lOVFJfQ0FVU0VfQUREUkVTUyA9IEFEUkFTVEVBX0hPU1RfQ0FVU0VfUkVHSVNURVIsCisJLmRfU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUyA9IEFEUkFTVEVBX1NPQ19SRVNFVF9DT05UUk9MX0FERFJFU1MsCisJLmRfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9NQVNLID0KKwkJQURSQVNURUFfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9NQVNLLAorCS5kX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTFNCID0KKwkJQURSQVNURUFfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9MU0IsCisJLmRfU09DX1JFU0VUX0NPTlRST0xfQ0VfUlNUX01BU0sgPQorCQlBRFJBU1RFQV9TT0NfUkVTRVRfQ09OVFJPTF9DRV9SU1RfTUFTSywKKwkuZF9TT0NfUkVTRVRfQ09OVFJPTF9DUFVfV0FSTV9SU1RfTUFTSyA9CisJCUFEUkFTVEVBX1NPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9NQVNLLAorCS5kX0NQVV9JTlRSX0FERFJFU1MgPSBBRFJBU1RFQV9DUFVfSU5UUl9BRERSRVNTLAorCS5kX1NPQ19MRl9USU1FUl9DT05UUk9MMF9BRERSRVNTID0KKwkJQURSQVNURUFfU09DX0xGX1RJTUVSX0NPTlRST0wwX0FERFJFU1MsCisJLmRfU09DX0xGX1RJTUVSX0NPTlRST0wwX0VOQUJMRV9NQVNLID0KKwkJQURSQVNURUFfU09DX0xGX1RJTUVSX0NPTlRST0wwX0VOQUJMRV9NQVNLLAorCS8qIGNoaXAgaWQgc3RhcnQgKi8KKwkuZF9TT0NfQ0hJUF9JRF9BRERSRVNTID0gQURSQVNURUFfU09DX0NISVBfSURfQUREUkVTUywKKwkuZF9TT0NfQ0hJUF9JRF9WRVJTSU9OX01BU0sgPSBBRFJBU1RFQV9TT0NfQ0hJUF9JRF9WRVJTSU9OX01BU0ssCisJLmRfU09DX0NISVBfSURfVkVSU0lPTl9MU0IgPSBBRFJBU1RFQV9TT0NfQ0hJUF9JRF9WRVJTSU9OX0xTQiwKKwkuZF9TT0NfQ0hJUF9JRF9SRVZJU0lPTl9NQVNLID0gQURSQVNURUFfU09DX0NISVBfSURfUkVWSVNJT05fTUFTSywKKwkuZF9TT0NfQ0hJUF9JRF9SRVZJU0lPTl9MU0IgPSBBRFJBU1RFQV9TT0NfQ0hJUF9JRF9SRVZJU0lPTl9MU0IsCisJLyogY2hpcCBpZCBlbmQgKi8KKwkuZF9BX1NPQ19DT1JFX1NDUkFUQ0hfMF9BRERSRVNTID0gQURSQVNURUFfQV9TT0NfQ09SRV9TQ1JBVENIXzBfQUREUkVTUywKKwkuZF9BX1NPQ19DT1JFX1NQQVJFXzBfUkVHSVNURVIgPSBBRFJBU1RFQV9BX1NPQ19DT1JFX1NQQVJFXzBfUkVHSVNURVIsCisJLmRfUENJRV9JTlRSX0ZJUk1XQVJFX1JPVVRFX01BU0sgPQorCQlBRFJBU1RFQV9QQ0lFX0lOVFJfRklSTVdBUkVfUk9VVEVfTUFTSywKKwkuZF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9DQVVTRV9HUlAxID0KKwkJQURSQVNURUFfQV9TT0NfQ09SRV9QQ0lFX0lOVFJfQ0FVU0VfR1JQMSwKKwkuZF9BX1NPQ19DT1JFX1NQQVJFXzFfUkVHSVNURVIgPQorCQlBRFJBU1RFQV9BX1NPQ19DT1JFX1NQQVJFXzFfUkVHSVNURVIsCisJLmRfQV9TT0NfQ09SRV9QQ0lFX0lOVFJfQ0xSX0dSUDEgPQorCQlBRFJBU1RFQV9BX1NPQ19DT1JFX1BDSUVfSU5UUl9DTFJfR1JQMSwKKwkuZF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9FTkFCTEVfR1JQMSA9CisJCUFEUkFTVEVBX0FfU09DX0NPUkVfUENJRV9JTlRSX0VOQUJMRV9HUlAxLAorCS5kX0FfU09DX1BDSUVfUENJRV9TQ1JBVENIXzAgPSBBRFJBU1RFQV9BX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8wLAorCS5kX0FfU09DX1BDSUVfUENJRV9TQ1JBVENIXzEgPSBBRFJBU1RFQV9BX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8xLAorCS5kX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfVEFSR0VUX0hPU1RfREVMVEEgPQorCQlBRFJBU1RFQV9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX1RBUkdFVF9IT1NUX0RFTFRBLAorCS5kX0FfU09DX1BDSUVfUENJRV9TQ1JBVENIXzIgPSBBRFJBU1RFQV9BX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8yLAorCS5kX0FfU09DX0NPUkVfUENJRV9JTlRSX0VOQUJMRV9HUlAwX1E2X01BU0sgPQorCQlBRFJBU1RFQV9BX1NPQ19DT1JFX1BDSUVfSU5UUl9FTkFCTEVfR1JQMF9RNl9NQVNLLAorCS5kX1dMQU5fREVCVUdfSU5QVVRfU0VMX09GRlNFVCA9IEFEUkFTVEVBX1dMQU5fREVCVUdfSU5QVVRfU0VMX09GRlNFVCwKKwkuZF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTVNCID0gQURSQVNURUFfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01TQiwKKwkuZF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTFNCID0gQURSQVNURUFfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX0xTQiwKKwkuZF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTUFTSyA9CisJCUFEUkFTVEVBX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NQVNLLAorCS5kX1dMQU5fREVCVUdfQ09OVFJPTF9PRkZTRVQgPSBBRFJBU1RFQV9XTEFOX0RFQlVHX0NPTlRST0xfT0ZGU0VULAorCS5kX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTVNCID0KKwkJQURSQVNURUFfV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9NU0IsCisJLmRfV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9MU0IgPQorCQlBRFJBU1RFQV9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX0xTQiwKKwkuZF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01BU0sgPQorCQlBRFJBU1RFQV9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01BU0ssCisJLmRfV0xBTl9ERUJVR19PVVRfT0ZGU0VUID0gQURSQVNURUFfV0xBTl9ERUJVR19PVVRfT0ZGU0VULAorCS5kX1dMQU5fREVCVUdfT1VUX0RBVEFfTVNCID0gQURSQVNURUFfV0xBTl9ERUJVR19PVVRfREFUQV9NU0IsCisJLmRfV0xBTl9ERUJVR19PVVRfREFUQV9MU0IgPSBBRFJBU1RFQV9XTEFOX0RFQlVHX09VVF9EQVRBX0xTQiwKKwkuZF9XTEFOX0RFQlVHX09VVF9EQVRBX01BU0sgPSBBRFJBU1RFQV9XTEFOX0RFQlVHX09VVF9EQVRBX01BU0ssCisJLmRfQU1CQV9ERUJVR19CVVNfT0ZGU0VUID0gQURSQVNURUFfQU1CQV9ERUJVR19CVVNfT0ZGU0VULAorCS5kX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX01TQiA9CisJCUFEUkFTVEVBX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX01TQiwKKwkuZF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9MU0IgPQorCQlBRFJBU1RFQV9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9MU0IsCisJLmRfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTUFTSyA9CisJCUFEUkFTVEVBX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX01BU0ssCisJLmRfQU1CQV9ERUJVR19CVVNfU0VMX01TQiA9IEFEUkFTVEVBX0FNQkFfREVCVUdfQlVTX1NFTF9NU0IsCisJLmRfQU1CQV9ERUJVR19CVVNfU0VMX0xTQiA9IEFEUkFTVEVBX0FNQkFfREVCVUdfQlVTX1NFTF9MU0IsCisJLmRfQU1CQV9ERUJVR19CVVNfU0VMX01BU0sgPSBBRFJBU1RFQV9BTUJBX0RFQlVHX0JVU19TRUxfTUFTSywKKworI2lmZGVmIFFDQV9XSUZJXzNfMF9BRFJBU1RFQQorCS5kX1E2X0VOQUJMRV9SRUdJU1RFUl8wID0gQURSQVNURUFfUTZfRU5BQkxFX1JFR0lTVEVSXzAsCisJLmRfUTZfRU5BQkxFX1JFR0lTVEVSXzEgPSBBRFJBU1RFQV9RNl9FTkFCTEVfUkVHSVNURVJfMSwKKwkuZF9RNl9DQVVTRV9SRUdJU1RFUl8wID0gQURSQVNURUFfUTZfQ0FVU0VfUkVHSVNURVJfMCwKKwkuZF9RNl9DQVVTRV9SRUdJU1RFUl8xID0gQURSQVNURUFfUTZfQ0FVU0VfUkVHSVNURVJfMSwKKwkuZF9RNl9DTEVBUl9SRUdJU1RFUl8wID0gQURSQVNURUFfUTZfQ0xFQVJfUkVHSVNURVJfMCwKKwkuZF9RNl9DTEVBUl9SRUdJU1RFUl8xID0gQURSQVNURUFfUTZfQ0xFQVJfUkVHSVNURVJfMSwKKyNlbmRpZgorfTsKKworc3RydWN0IGhvc3RkZWZfcyBhZHJhc3RlYV9ob3N0ZGVmID0geworCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX0xTQiA9IEFEUkFTVEVBX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX0xTQiwKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9NQVNLID0gQURSQVNURUFfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTUFTSywKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTFNCID0gQURSQVNURUFfSU5UX1NUQVRVU19FTkFCTEVfQ1BVX0xTQiwKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTUFTSyA9IEFEUkFTVEVBX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9NQVNLLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTFNCID0KKwkJQURSQVNURUFfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9MU0IsCisJLmRfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9NQVNLID0KKwkJQURSQVNURUFfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9NQVNLLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9MU0IgPQorCQlBRFJBU1RFQV9JTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEFfTFNCLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9NQVNLID0KKwkJQURSQVNURUFfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX01BU0ssCisJLmRfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTFNCID0KKwkJQURSQVNURUFfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTFNCLAorCS5kX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX01BU0sgPQorCQlBRFJBU1RFQV9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19NQVNLLAorCS5kX0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTFNCID0KKwkJQURSQVNURUFfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19MU0IsCisJLmRfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19NQVNLID0KKwkJQURSQVNURUFfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19NQVNLLAorCS5kX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiA9CisJCUFEUkFTVEVBX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiwKKwkuZF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLID0KKwkJQURSQVNURUFfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSywKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9BRERSRVNTID0gQURSQVNURUFfSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKKwkuZF9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiA9CisJCUFEUkFTVEVBX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTFNCLAorCS5kX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSyA9CisJCUFEUkFTVEVBX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfQUREUkVTUyA9IEFEUkFTVEVBX0hPU1RfSU5UX1NUQVRVU19BRERSRVNTLAorCS5kX0NQVV9JTlRfU1RBVFVTX0FERFJFU1MgPSBBRFJBU1RFQV9DUFVfSU5UX1NUQVRVU19BRERSRVNTLAorCS5kX0VSUk9SX0lOVF9TVEFUVVNfQUREUkVTUyA9IEFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfQUREUkVTUywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9NQVNLID0gQURSQVNURUFfRVJST1JfSU5UX1NUQVRVU19XQUtFVVBfTUFTSywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IgPSBBRFJBU1RFQV9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IsCisJLmRfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTUFTSyA9CisJCUFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX01BU0ssCisJLmRfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTFNCID0KKwkJQURSQVNURUFfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTFNCLAorCS5kX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSyA9CisJCUFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1RYX09WRVJGTE9XX0xTQiA9CisJCUFEUkFTVEVBX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTFNCLAorCS5kX0NPVU5UX0RFQ19BRERSRVNTID0gQURSQVNURUFfQ09VTlRfREVDX0FERFJFU1MsCisJLmRfSE9TVF9JTlRfU1RBVFVTX0NQVV9NQVNLID0gQURSQVNURUFfSE9TVF9JTlRfU1RBVFVTX0NQVV9NQVNLLAorCS5kX0hPU1RfSU5UX1NUQVRVU19DUFVfTFNCID0gQURSQVNURUFfSE9TVF9JTlRfU1RBVFVTX0NQVV9MU0IsCisJLmRfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX01BU0sgPSBBRFJBU1RFQV9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTFNCID0gQURSQVNURUFfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX0xTQiwKKwkuZF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9NQVNLID0gQURSQVNURUFfSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9MU0IgPSBBRFJBU1RFQV9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9MU0IsCisJLmRfUlhfTE9PS0FIRUFEX1ZBTElEX0FERFJFU1MgPSBBRFJBU1RFQV9SWF9MT09LQUhFQURfVkFMSURfQUREUkVTUywKKwkuZF9XSU5ET1dfREFUQV9BRERSRVNTID0gQURSQVNURUFfV0lORE9XX0RBVEFfQUREUkVTUywKKwkuZF9XSU5ET1dfUkVBRF9BRERSX0FERFJFU1MgPSBBRFJBU1RFQV9XSU5ET1dfUkVBRF9BRERSX0FERFJFU1MsCisJLmRfV0lORE9XX1dSSVRFX0FERFJfQUREUkVTUyA9IEFEUkFTVEVBX1dJTkRPV19XUklURV9BRERSX0FERFJFU1MsCisJLmRfU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTID0gQURSQVNURUFfU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTLAorCS5kX1JUQ19TVEFURV9BRERSRVNTID0gQURSQVNURUFfUlRDX1NUQVRFX0FERFJFU1MsCisJLmRfUlRDX1NUQVRFX0NPTERfUkVTRVRfTUFTSyA9IEFEUkFTVEVBX1JUQ19TVEFURV9DT0xEX1JFU0VUX01BU0ssCisJLmRfUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgPSBBRFJBU1RFQV9QQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUywKKwkuZF9QQ0lFX1NPQ19XQUtFX1JFU0VUID0gQURSQVNURUFfUENJRV9TT0NfV0FLRV9SRVNFVCwKKwkuZF9QQ0lFX1NPQ19XQUtFX0FERFJFU1MgPSBBRFJBU1RFQV9QQ0lFX1NPQ19XQUtFX0FERFJFU1MsCisJLmRfUENJRV9TT0NfV0FLRV9WX01BU0sgPSBBRFJBU1RFQV9QQ0lFX1NPQ19XQUtFX1ZfTUFTSywKKwkuZF9SVENfU1RBVEVfVl9NQVNLID0gQURSQVNURUFfUlRDX1NUQVRFX1ZfTUFTSywKKwkuZF9SVENfU1RBVEVfVl9MU0IgPSBBRFJBU1RFQV9SVENfU1RBVEVfVl9MU0IsCisJLmRfRldfSU5EX0VWRU5UX1BFTkRJTkcgPSBBRFJBU1RFQV9GV19JTkRfRVZFTlRfUEVORElORywKKwkuZF9GV19JTkRfSU5JVElBTElaRUQgPSBBRFJBU1RFQV9GV19JTkRfSU5JVElBTElaRUQsCisJLmRfRldfSU5EX0hFTFBFUiA9IEFEUkFTVEVBX0ZXX0lORF9IRUxQRVIsCisJLmRfUlRDX1NUQVRFX1ZfT04gPSBBRFJBU1RFQV9SVENfU1RBVEVfVl9PTiwKKyNpZiBkZWZpbmVkKFNESU9fM18wKQorCS5kX0hPU1RfSU5UX1NUQVRVU19NQk9YX0RBVEFfTUFTSyA9CisJCUFEUkFTVEVBX0hPU1RfSU5UX1NUQVRVU19NQk9YX0RBVEFfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfTUJPWF9EQVRBX0xTQiA9CisJCUFEUkFTVEVBX0hPU1RfSU5UX1NUQVRVU19NQk9YX0RBVEFfTFNCLAorI2VuZGlmCisJLmRfUENJRV9TT0NfUkRZX1NUQVRVU19BRERSRVNTID0gUENJRV9TT0NfUkRZX1NUQVRVU19BRERSRVNTLAorCS5kX1BDSUVfU09DX1JEWV9TVEFUVVNfQkFSX01BU0sgPSBQQ0lFX1NPQ19SRFlfU1RBVFVTX0JBUl9NQVNLLAorCS5kX1NPQ19QQ0lFX0JBU0VfQUREUkVTUyA9IFNPQ19QQ0lFX0JBU0VfQUREUkVTUywKKwkuZF9NU0lfTUFHSUNfQURSX0FERFJFU1MgPSBNU0lfTUFHSUNfQURSX0FERFJFU1MsCisJLmRfTVNJX01BR0lDX0FERFJFU1MgPSBNU0lfTUFHSUNfQUREUkVTUywKKwkuZF9IT1NUX0NFX0NPVU5UID0gOCwKKwkuZF9FTkFCTEVfTVNJID0gMCwKKwkuZF9NVVhfSURfTUFTSyA9IDB4ZjAwMCwKKwkuZF9UUkFOU0FDVElPTl9JRF9NQVNLID0gMHgwZmZmLAorCS5kX0RFU0NfREFUQV9GTEFHX01BU0sgPSAweDFGRkZFM0UwLAorCS5kX0FfU09DX1BDSUVfUENJRV9CQVIwX1NUQVJUID0gQURSQVNURUFfQV9TT0NfUENJRV9QQ0lFX0JBUjBfU1RBUlQsCit9OworCisKK3N0cnVjdCBjZV9yZWdfZGVmIGFkcmFzdGVhX2NlX3RhcmdldGRlZiA9IHsKKwkvKiBjb3B5X2VuZ2luZS5jICAqLworCS5kX0RTVF9XUl9JTkRFWF9BRERSRVNTID0gQURSQVNURUFfRFNUX1dSX0lOREVYX09GRlNFVCwKKwkuZF9TUkNfV0FURVJNQVJLX0FERFJFU1MgPSBBRFJBU1RFQV9TUkNfV0FURVJNQVJLX09GRlNFVCwKKwkuZF9TUkNfV0FURVJNQVJLX0xPV19NQVNLID0gQURSQVNURUFfU1JDX1dBVEVSTUFSS19MT1dfTUFTSywKKwkuZF9TUkNfV0FURVJNQVJLX0hJR0hfTUFTSyA9IEFEUkFTVEVBX1NSQ19XQVRFUk1BUktfSElHSF9NQVNLLAorCS5kX0RTVF9XQVRFUk1BUktfTE9XX01BU0sgPSBBRFJBU1RFQV9EU1RfV0FURVJNQVJLX0xPV19NQVNLLAorCS5kX0RTVF9XQVRFUk1BUktfSElHSF9NQVNLID0gQURSQVNURUFfRFNUX1dBVEVSTUFSS19ISUdIX01BU0ssCisJLmRfQ1VSUkVOVF9TUlJJX0FERFJFU1MgPSBBRFJBU1RFQV9DVVJSRU5UX1NSUklfT0ZGU0VULAorCS5kX0NVUlJFTlRfRFJSSV9BRERSRVNTID0gQURSQVNURUFfQ1VSUkVOVF9EUlJJX09GRlNFVCwKKwkuZF9IT1NUX0lTX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgPQorCQlBRFJBU1RFQV9IT1NUX0lTX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX01BU0ssCisJLmRfSE9TVF9JU19TUkNfUklOR19MT1dfV0FURVJNQVJLX01BU0sgPQorCQlBRFJBU1RFQV9IT1NUX0lTX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfTUFTSywKKwkuZF9IT1NUX0lTX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgPQorCQlBRFJBU1RFQV9IT1NUX0lTX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX01BU0ssCisJLmRfSE9TVF9JU19EU1RfUklOR19MT1dfV0FURVJNQVJLX01BU0sgPQorCQlBRFJBU1RFQV9IT1NUX0lTX0RTVF9SSU5HX0xPV19XQVRFUk1BUktfTUFTSywKKwkuZF9IT1NUX0lTX0FERFJFU1MgPSBBRFJBU1RFQV9IT1NUX0lTX09GRlNFVCwKKwkuZF9NSVNDX0lTX0FERFJFU1MgPSBBRFJBU1RFQV9NSVNDX0lTX09GRlNFVCwKKwkuZF9IT1NUX0lTX0NPUFlfQ09NUExFVEVfTUFTSyA9IEFEUkFTVEVBX0hPU1RfSVNfQ09QWV9DT01QTEVURV9NQVNLLAorCS5kX0NFX1dSQVBQRVJfQkFTRV9BRERSRVNTID0gQURSQVNURUFfQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MsCisJLmRfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9BRERSRVNTID0KKwkJQURSQVNURUFfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9BRERSRVNTLAorCS5kX0NFX1dSQVBQRVJfSU5ERVhfQkFTRV9MT1cgPSBBRFJBU1RFQV9DRV9XUkFQUEVSX0lOREVYX0JBU0VfTE9XLAorCS5kX0NFX1dSQVBQRVJfSU5ERVhfQkFTRV9ISUdIID0gQURSQVNURUFfQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0hJR0gsCisJLmRfSE9TVF9JRV9BRERSRVNTID0gQURSQVNURUFfSE9TVF9JRV9PRkZTRVQsCisJLmRfSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0sgPSBBRFJBU1RFQV9IT1NUX0lFX0NPUFlfQ09NUExFVEVfTUFTSywKKwkuZF9TUl9CQV9BRERSRVNTID0gQURSQVNURUFfU1JfQkFfT0ZGU0VULAorCS5kX1NSX1NJWkVfQUREUkVTUyA9IEFEUkFTVEVBX1NSX1NJWkVfT0ZGU0VULAorCS5kX0NFX0NUUkwxX0FERFJFU1MgPSBBRFJBU1RFQV9DRV9DVFJMMV9PRkZTRVQsCisJLmRfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTUFTSyA9IEFEUkFTVEVBX0NFX0NUUkwxX0RNQVhfTEVOR1RIX01BU0ssCisJLmRfRFJfQkFfQUREUkVTUyA9IEFEUkFTVEVBX0RSX0JBX09GRlNFVCwKKwkuZF9EUl9TSVpFX0FERFJFU1MgPSBBRFJBU1RFQV9EUl9TSVpFX09GRlNFVCwKKwkuZF9DRV9DTURfUkVHSVNURVIgPSBBRFJBU1RFQV9DRV9DTURfUkVHSVNURVJfT0ZGU0VULAorCS5kX0NFX01TSV9BRERSRVNTID0gTUlTU0lOR19GT1JfQURSQVNURUEsCisJLmRfQ0VfTVNJX0FERFJFU1NfSElHSCA9IE1JU1NJTkdfRk9SX0FEUkFTVEVBLAorCS5kX0NFX01TSV9EQVRBID0gTUlTU0lOR19GT1JfQURSQVNURUEsCisJLmRfQ0VfTVNJX0VOQUJMRV9CSVQgPSBNSVNTSU5HX0ZPUl9BRFJBU1RFQSwKKwkuZF9NSVNDX0lFX0FERFJFU1MgPSBBRFJBU1RFQV9NSVNDX0lFX09GRlNFVCwKKwkuZF9NSVNDX0lTX0FYSV9FUlJfTUFTSyA9IEFEUkFTVEVBX01JU0NfSVNfQVhJX0VSUl9NQVNLLAorCS5kX01JU0NfSVNfRFNUX0FERFJfRVJSX01BU0sgPSBBRFJBU1RFQV9NSVNDX0lTX0RTVF9BRERSX0VSUl9NQVNLLAorCS5kX01JU0NfSVNfU1JDX0xFTl9FUlJfTUFTSyA9IEFEUkFTVEVBX01JU0NfSVNfU1JDX0xFTl9FUlJfTUFTSywKKwkuZF9NSVNDX0lTX0RTVF9NQVhfTEVOX1ZJT19NQVNLID0gQURSQVNURUFfTUlTQ19JU19EU1RfTUFYX0xFTl9WSU9fTUFTSywKKwkuZF9NSVNDX0lTX0RTVF9SSU5HX09WRVJGTE9XX01BU0sgPQorCQlBRFJBU1RFQV9NSVNDX0lTX0RTVF9SSU5HX09WRVJGTE9XX01BU0ssCisJLmRfTUlTQ19JU19TUkNfUklOR19PVkVSRkxPV19NQVNLID0KKwkJQURSQVNURUFfTUlTQ19JU19TUkNfUklOR19PVkVSRkxPV19NQVNLLAorCS5kX1NSQ19XQVRFUk1BUktfTE9XX0xTQiA9IEFEUkFTVEVBX1NSQ19XQVRFUk1BUktfTE9XX0xTQiwKKwkuZF9TUkNfV0FURVJNQVJLX0hJR0hfTFNCID0gQURSQVNURUFfU1JDX1dBVEVSTUFSS19ISUdIX0xTQiwKKwkuZF9EU1RfV0FURVJNQVJLX0xPV19MU0IgPSBBRFJBU1RFQV9EU1RfV0FURVJNQVJLX0xPV19MU0IsCisJLmRfRFNUX1dBVEVSTUFSS19ISUdIX0xTQiA9IEFEUkFTVEVBX0RTVF9XQVRFUk1BUktfSElHSF9MU0IsCisJLmRfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9NQVNLID0KKwkJQURSQVNURUFfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9NQVNLLAorCS5kX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTFNCID0KKwkJQURSQVNURUFfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9MU0IsCisJLmRfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTFNCID0gQURSQVNURUFfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTFNCLAorCS5kX0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9NQVNLID0KKwkJQURSQVNURUFfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0ssCisJLmRfQ0VfQ1RSTDFfRFNUX1JJTkdfQllURV9TV0FQX0VOX01BU0sgPQorCQlBRFJBU1RFQV9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTUFTSywKKwkuZF9DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTFNCID0KKwkJQURSQVNURUFfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX0xTQiwKKwkuZF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTFNCID0KKwkJQURSQVNURUFfQ0VfQ1RSTDFfRFNUX1JJTkdfQllURV9TV0FQX0VOX0xTQiwKKwkuZF9DRV9XUkFQUEVSX0RFQlVHX09GRlNFVCA9IEFEUkFTVEVBX0NFX1dSQVBQRVJfREVCVUdfT0ZGU0VULAorCS5kX0NFX1dSQVBQRVJfREVCVUdfU0VMX01TQiA9IEFEUkFTVEVBX0NFX1dSQVBQRVJfREVCVUdfU0VMX01TQiwKKwkuZF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9MU0IgPSBBRFJBU1RFQV9DRV9XUkFQUEVSX0RFQlVHX1NFTF9MU0IsCisJLmRfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTUFTSyA9IEFEUkFTVEVBX0NFX1dSQVBQRVJfREVCVUdfU0VMX01BU0ssCisJLmRfQ0VfREVCVUdfT0ZGU0VUID0gQURSQVNURUFfQ0VfREVCVUdfT0ZGU0VULAorCS5kX0NFX0RFQlVHX1NFTF9NU0IgPSBBRFJBU1RFQV9DRV9ERUJVR19TRUxfTVNCLAorCS5kX0NFX0RFQlVHX1NFTF9MU0IgPSBBRFJBU1RFQV9DRV9ERUJVR19TRUxfTFNCLAorCS5kX0NFX0RFQlVHX1NFTF9NQVNLID0gQURSQVNURUFfQ0VfREVCVUdfU0VMX01BU0ssCisJLmRfQ0UwX0JBU0VfQUREUkVTUyA9IEFEUkFTVEVBX0NFMF9CQVNFX0FERFJFU1MsCisJLmRfQ0UxX0JBU0VfQUREUkVTUyA9IEFEUkFTVEVBX0NFMV9CQVNFX0FERFJFU1MsCisJLmRfQV9XSUZJX0FQQl8zX0FfV0NNTl9BUFBTX0NFX0lOVFJfRU5BQkxFUyA9CisJCU1JU1NJTkdfRk9SX0FEUkFTVEVBLAorCS5kX0FfV0lGSV9BUEJfM19BX1dDTU5fQVBQU19DRV9JTlRSX1NUQVRVUyA9CisJCU1JU1NJTkdfRk9SX0FEUkFTVEVBLAorfTsKKworCitzdHJ1Y3QgaG9zdF9zaGFkb3dfcmVnc19zIGFkcmFzdGVhX2hvc3Rfc2hhZG93X3JlZ3MgPSB7CisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzAgID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzAsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEgID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIgID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzMgID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzMsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzQgID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzQsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzUgID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzUsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzYgID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzYsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzcgID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzcsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzggID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzgsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzkgID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzksCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEwID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEwLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xMSA9CisJCUFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xMSwKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTIgPQorCQlBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTIsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEzID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEzLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xNCA9CisJCUFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xNCwKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTUgPQorCQlBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTUsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE2ID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE2LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xNyA9CisJCUFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xNywKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTggPQorCQlBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTgsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE5ID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE5LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8yMCA9CisJCUFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8yMCwKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjEgPQorCQlBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjEsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIyID0KKwkJQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIyLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8yMyA9CisJCUFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8yMywKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18wICA9CisJCSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18wLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEgID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMiAgPQorCQkgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMiwKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18zICA9CisJCSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18zLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzQgID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzQsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfNSAgPQorCQkgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfNSwKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU182ICA9CisJCSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU182LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzcgID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzcsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfOCAgPQorCQkgQURSQVNURUFfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfOCwKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU185ICA9CisJCSBBRFJBU1RFQV9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU185LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEwID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEwLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzExID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzExLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEyID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEyLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEzID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzEzLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE0ID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE0LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE1ID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE1LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE2ID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE2LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE3ID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE3LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE4ID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE4LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE5ID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzE5LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIwID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIwLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIxID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIxLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIyID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIyLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIzID0KKwkJIEFEUkFTVEVBX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIzCit9OworCisjZW5kaWYgLyogQURSQVNURUFfUkVHX0RFRl9IICovCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvYXI2MzIwZGVmLmggYi9jb3JlL2hpZi9zcmMvYXI2MzIwZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjY2U1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9hcjYzMjBkZWYuaApAQCAtMCwwICsxLDc5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQVI2MzIwREVGX0hfCisjZGVmaW5lICBfQVI2MzIwREVGX0hfCisKKy8qIEJhc2UgQWRkcmVzc2VzICovCisjZGVmaW5lIEFSNjMyMF9SVENfU09DX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQVI2MzIwX1JUQ19XTUFDX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBBUjYzMjBfTUFDX0NPRVhfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEFSNjMyMF9CVF9DT0VYX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQVI2MzIwX1NPQ19QQ0lFX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAzODAwMAorI2RlZmluZSBBUjYzMjBfU09DX0NPUkVfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDNhMDAwCisjZGVmaW5lIEFSNjMyMF9XTEFOX1VBUlRfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MDAwMGMwMDAKKyNkZWZpbmUgQVI2MzIwX1dMQU5fU0lfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBUjYzMjBfV0xBTl9HUElPX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDA1MDAwCisjZGVmaW5lIEFSNjMyMF9XTEFOX0FOQUxPR19JTlRGX0JBU0VfQUREUkVTUyAgICAgICAgICAgIDB4MDAwMDYwMDAKKyNkZWZpbmUgQVI2MzIwX1dMQU5fTUFDX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBUjYzMjBfRUZVU0VfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAweDAwMDI0MDAwCisjZGVmaW5lIEFSNjMyMF9GUEdBX1JFR19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMzkwMDAKKyNkZWZpbmUgQVI2MzIwX1dMQU5fVUFSVDJfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDA1NGMwMAorI2RlZmluZSBBUjYzMjBfQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDM0MDAwCisjZGVmaW5lIEFSNjMyMF9DRTBfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzQ0MDAKKyNkZWZpbmUgQVI2MzIwX0NFMV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzNDgwMAorI2RlZmluZSBBUjYzMjBfQ0UyX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDM0YzAwCisjZGVmaW5lIEFSNjMyMF9DRTNfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzUwMDAKKyNkZWZpbmUgQVI2MzIwX0NFNF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzNTQwMAorI2RlZmluZSBBUjYzMjBfQ0U1X0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDM1ODAwCisjZGVmaW5lIEFSNjMyMF9DRTZfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzVjMDAKKyNkZWZpbmUgQVI2MzIwX0NFN19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzNjAwMAorI2RlZmluZSBBUjYzMjBfREJJX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDNjMDAwCisjZGVmaW5lIEFSNjMyMF9XTEFOX0FOQUxPR19JTlRGX1BDSUVfQkFTRV9BRERSRVNTICAgICAgIDB4MDAwMDc4MDAKKworI2RlZmluZSBBUjYzMjBfU0NSQVRDSF8zX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjgKKyNkZWZpbmUgQVI2MzIwX1RBUkdfRFJBTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBBUjYzMjBfU09DX1NZU1RFTV9TTEVFUF9PRkZTRVQgICAgICAgICAgICAgICAgICAweDAwMDAwMGMwCisjZGVmaW5lIEFSNjMyMF9TT0NfUkVTRVRfQ09OVFJPTF9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQVI2MzIwX1NPQ19DTE9DS19DT05UUk9MX09GRlNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAyOAorI2RlZmluZSBBUjYzMjBfU09DX0NMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFSNjMyMF9TT0NfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQVI2MzIwX1dMQU5fR1BJT19QSU4wX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA2OAorI2RlZmluZSBBUjYzMjBfV0xBTl9HUElPX1BJTjFfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDZjCisjZGVmaW5lIEFSNjMyMF9XTEFOX0dQSU9fUElOMF9DT05GSUdfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDc4MDAKKyNkZWZpbmUgQVI2MzIwX1dMQU5fR1BJT19QSU4xX0NPTkZJR19NQVNLICAgICAgICAgICAgICAgMHgwMDAwNzgwMAorI2RlZmluZSBBUjYzMjBfU09DX0NQVV9DTE9DS19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEFSNjMyMF9TT0NfTFBPX0NBTF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZTAKKyNkZWZpbmUgQVI2MzIwX1dMQU5fR1BJT19QSU4xMF9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDA5MAorI2RlZmluZSBBUjYzMjBfV0xBTl9HUElPX1BJTjExX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDAwMDk0CisjZGVmaW5lIEFSNjMyMF9XTEFOX0dQSU9fUElOMTJfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwOTgKKyNkZWZpbmUgQVI2MzIwX1dMQU5fR1BJT19QSU4xM19BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDA5YworI2RlZmluZSBBUjYzMjBfU09DX0NQVV9DTE9DS19TVEFOREFSRF9MU0IgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgQVI2MzIwX1NPQ19MUE9fQ0FMX0VOQUJMRV9MU0IgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgQVI2MzIwX1NPQ19MUE9fQ0FMX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorCisjZGVmaW5lIEFSNjMyMF9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX0xTQiAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUjYzMjBfV0xBTl9SRVNFVF9DT05UUk9MX0NPTERfUlNUX01BU0sgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSNjMyMF9XTEFOX1JFU0VUX0NPTlRST0xfV0FSTV9SU1RfTUFTSyAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVI2MzIwX1NJX0NPTkZJR19CSURJUl9PRF9EQVRBX0xTQiAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVI2MzIwX1NJX0NPTkZJR19CSURJUl9PRF9EQVRBX01BU0sgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBBUjYzMjBfU0lfQ09ORklHX0kyQ19MU0IgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBBUjYzMjBfU0lfQ09ORklHX0kyQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFSNjMyMF9TSV9DT05GSUdfUE9TX1NBTVBMRV9MU0IgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQVI2MzIwX1NJX0NPTkZJR19QT1NfU0FNUExFX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBUjYzMjBfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19MU0IgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFSNjMyMF9TSV9DT05GSUdfSU5BQ1RJVkVfQ0xLX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQVI2MzIwX1NJX0NPTkZJR19JTkFDVElWRV9EQVRBX0xTQiAgICAgICAgICAgICAgNQorI2RlZmluZSBBUjYzMjBfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSyAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEFSNjMyMF9TSV9DT05GSUdfRElWSURFUl9MU0IgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwX1NJX0NPTkZJR19ESVZJREVSX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBBUjYzMjBfU0lfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSNjMyMF9TSV9UWF9EQVRBMF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQVI2MzIwX1NJX1RYX0RBVEExX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYworI2RlZmluZSBBUjYzMjBfU0lfUlhfREFUQTBfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFSNjMyMF9TSV9SWF9EQVRBMV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTQKKyNkZWZpbmUgQVI2MzIwX1NJX0NTX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBUjYzMjBfU0lfQ1NfRE9ORV9FUlJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEFSNjMyMF9TSV9DU19ET05FX0lOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQVI2MzIwX1NJX0NTX1NUQVJUX0xTQiAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBBUjYzMjBfU0lfQ1NfU1RBUlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEFSNjMyMF9TSV9DU19SWF9DTlRfTFNCICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVI2MzIwX1NJX0NTX1JYX0NOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBmMAorI2RlZmluZSBBUjYzMjBfU0lfQ1NfVFhfQ05UX0xTQiAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMF9TSV9DU19UWF9DTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgQVI2MzIwX0NFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBBUjYzMjBfU1JfV1JfSU5ERVhfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAweDAwM2MKKyNkZWZpbmUgQVI2MzIwX0RTVF9XQVRFUk1BUktfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDUwCisjZGVmaW5lIEFSNjMyMF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTFNCICAgICAgICAgICAgIDE0CisjZGVmaW5lIEFSNjMyMF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSyAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQVI2MzIwX1JYX01QRFVfU1RBUlRfMF9SRVRSWV9MU0IgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQVI2MzIwX1JYX01QRFVfU1RBUlRfMF9SRVRSWV9NQVNLICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBBUjYzMjBfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTFNCICAgICAgICAgICAgICAxNgorI2RlZmluZSBBUjYzMjBfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTUFTSyAgICAgICAgICAgICAweDBmZmYwMDAwCisjZGVmaW5lIEFSNjMyMF9SWF9NUERVX1NUQVJUXzJfVElEX0xTQiAgICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIEFSNjMyMF9SWF9NUERVX1NUQVJUXzJfVElEX01BU0sgICAgICAgICAgICAgICAgIDB4ZjAwMDAwMDAKKyNkZWZpbmUgQVI2MzIwX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9MU0IgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX01BU0sgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEFSNjMyMF9SWF9NU0RVX0VORF8xX0tFWV9JRF9PQ1RfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgQVI2MzIwX1JYX01TRFVfRU5EXzFfS0VZX0lEX09DVF9MU0IgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0IgICAgICAxNgorI2RlZmluZSBBUjYzMjBfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9NQVNLICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEFSNjMyMF9SWF9NU0RVX0VORF80X0xBU1RfTVNEVV9MU0IgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFSNjMyMF9SWF9NU0RVX0VORF80X0xBU1RfTVNEVV9NQVNLICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQVI2MzIwX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX0xTQiAgICAgICAgICAgMgorI2RlZmluZSBBUjYzMjBfUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTUFTSyAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFSNjMyMF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0IgICAgICAgICAgICAgIDEzCisjZGVmaW5lIEFSNjMyMF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9NQVNLICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQVI2MzIwX1JYX0FUVEVOVElPTl8wX01QRFVfTEVOR1RIX0VSUl9NQVNLICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBBUjYzMjBfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9MU0IgICAgICAxNgorI2RlZmluZSBBUjYzMjBfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9NQVNLICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEFSNjMyMF9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTFNCICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9NQVNLICAgICAgICAgMHgwMDAwM2ZmZgorI2RlZmluZSBBUjYzMjBfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9PRkZTRVQgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSNjMyMF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX0xTQiAgICAgICAgIDgKKyNkZWZpbmUgQVI2MzIwX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTUFTSyAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBBUjYzMjBfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9MU0IgICAgICAgICAgICAxMworI2RlZmluZSBBUjYzMjBfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9NQVNLICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFSNjMyMF9SWF9BVFRFTlRJT05fMF9NT1JFX0RBVEFfTUFTSyAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQVI2MzIwX1JYX0FUVEVOVElPTl8wX01TRFVfRE9ORV9NQVNLICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBBUjYzMjBfUlhfQVRURU5USU9OXzBfVENQX1VEUF9DSEtTVU1fRkFJTF9NQVNLICAweDAwMDQwMDAwCisjZGVmaW5lIEFSNjMyMF9EU1RfV1JfSU5ERVhfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBBUjYzMjBfU1JDX1dBVEVSTUFSS19BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwNGMKKyNkZWZpbmUgQVI2MzIwX1NSQ19XQVRFUk1BUktfTE9XX01BU0sgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBBUjYzMjBfU1JDX1dBVEVSTUFSS19ISUdIX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEFSNjMyMF9EU1RfV0FURVJNQVJLX0xPV19NQVNLICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgQVI2MzIwX0RTVF9XQVRFUk1BUktfSElHSF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBBUjYzMjBfQ1VSUkVOVF9TUlJJX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAwNDQKKyNkZWZpbmUgQVI2MzIwX0NVUlJFTlRfRFJSSV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDQ4CisjZGVmaW5lIEFSNjMyMF9IT1NUX0lTX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQVI2MzIwX0hPU1RfSVNfU1JDX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBUjYzMjBfSE9TVF9JU19EU1RfUklOR19ISUdIX1dBVEVSTUFSS19NQVNLICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSNjMyMF9IT1NUX0lTX0RTVF9SSU5HX0xPV19XQVRFUk1BUktfTUFTSyAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQVI2MzIwX0hPU1RfSVNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIEFSNjMyMF9IT1NUX0lTX0NPUFlfQ09NUExFVEVfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVI2MzIwX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfQUREUkVTUyAgICAgMHgwMDAwCisjZGVmaW5lIEFSNjMyMF9IT1NUX0lFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyYworI2RlZmluZSBBUjYzMjBfSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFSNjMyMF9TUl9CQV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBBUjYzMjBfU1JfU0laRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQVI2MzIwX0NFX0NUUkwxX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEFSNjMyMF9DRV9DVFJMMV9ETUFYX0xFTkdUSF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgQVI2MzIwX0RSX0JBX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEFSNjMyMF9EUl9TSVpFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwYworI2RlZmluZSBBUjYzMjBfTUlTQ19JRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzQKKyNkZWZpbmUgQVI2MzIwX01JU0NfSVNfQVhJX0VSUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBBUjYzMjBfTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEFSNjMyMF9NSVNDX0lTX1NSQ19MRU5fRVJSX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQVI2MzIwX01JU0NfSVNfRFNUX01BWF9MRU5fVklPX01BU0sgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBUjYzMjBfTUlTQ19JU19EU1RfUklOR19PVkVSRkxPV19NQVNLICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEFSNjMyMF9NSVNDX0lTX1NSQ19SSU5HX09WRVJGTE9XX01BU0sgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQVI2MzIwX1NSQ19XQVRFUk1BUktfTE9XX0xTQiAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQVI2MzIwX1NSQ19XQVRFUk1BUktfSElHSF9MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBfRFNUX1dBVEVSTUFSS19MT1dfTFNCICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBBUjYzMjBfRFNUX1dBVEVSTUFSS19ISUdIX0xTQiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX01BU0sgMHgwMDAwZmYwMAorI2RlZmluZSBBUjYzMjBfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9MU0IgIDgKKyNkZWZpbmUgQVI2MzIwX0NFX0NUUkwxX0RNQVhfTEVOR1RIX0xTQiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0sgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFSNjMyMF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTUFTSyAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQVI2MzIwX0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9MU0IgICAgICAgMTYKKyNkZWZpbmUgQVI2MzIwX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9MU0IgICAgICAgMTcKKyNkZWZpbmUgQVI2MzIwX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTUFTSyAweDAwMDAwMDIwCisjZGVmaW5lIEFSNjMyMF9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX0xTQiAgNQorI2RlZmluZSBBUjYzMjBfU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgQVI2MzIwX1JUQ19TVEFURV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFSNjMyMF9SVENfU1RBVEVfQ09MRF9SRVNFVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQVI2MzIwX1BDSUVfU09DX1dBS0VfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBUjYzMjBfUENJRV9TT0NfV0FLRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQVI2MzIwX1BDSUVfU09DX1dBS0VfVl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUjYzMjBfUlRDX1NUQVRFX1ZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEFSNjMyMF9SVENfU1RBVEVfVl9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwX1JUQ19TVEFURV9WX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUjYzMjBfTVVYX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVI2MzIwX1RSQU5TQUNUSU9OX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgzZmZmCisjZGVmaW5lIEFSNjMyMF9QQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4ODAwMDAKKyNkZWZpbmUgQVI2MzIwX0ZXX0lORF9FVkVOVF9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUjYzMjBfRldfSU5EX0lOSVRJQUxJWkVEICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFSNjMyMF9GV19JTkRfSEVMUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVI2MzIwX1BDSUVfSU5UUl9FTkFCTEVfQUREUkVTUyAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEFSNjMyMF9QQ0lFX0lOVFJfQ0xSX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBBUjYzMjBfUENJRV9JTlRSX0ZJUk1XQVJFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEFSNjMyMF9QQ0lFX0lOVFJfQ0UwX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQVI2MzIwX1BDSUVfSU5UUl9DRV9NQVNLX0FMTCAgICAgICAgICAgICAgICAgICAgMHgwMDA3ZjgwMAorI2RlZmluZSBBUjYzMjBfUENJRV9JTlRSX0NBVVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMGMKKyNkZWZpbmUgQVI2MzIwX0NQVV9JTlRSX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEFSNjMyMF9TT0NfTEZfVElNRVJfQ09OVFJPTDBfQUREUkVTUyAgICAgICAgICAgIDB4MDAwMDAwNTAKKyNkZWZpbmUgQVI2MzIwX1NPQ19MRl9USU1FUl9DT05UUk9MMF9FTkFCTEVfTUFTSyAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBUjYzMjBfU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUyAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSNjMyMF9TT0NfUkVTRVRfQ09OVFJPTF9DRV9SU1RfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVI2MzIwX1NPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9NQVNLICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBUjYzMjBfQ09SRV9DVFJMX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVI2MzIwX0NPUkVfQ1RSTF9DUFVfSU5UUl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBBUjYzMjBfTE9DQUxfU0NSQVRDSF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMGMwCisjZGVmaW5lIEFSNjMyMF9DTE9DS19HUElPX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQVI2MzIwX0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9MU0IgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX01BU0sgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMF9TT0NfQ0hJUF9JRF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgQVI2MzIwX1NPQ19DSElQX0lEX1ZFUlNJT05fTUFTSyAgICAgICAgICAgICAgICAgMHhmZmZjMDAwMAorI2RlZmluZSBBUjYzMjBfU09DX0NISVBfSURfVkVSU0lPTl9MU0IgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBBUjYzMjBfU09DX0NISVBfSURfUkVWSVNJT05fTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEFSNjMyMF9TT0NfQ0hJUF9JRF9SRVZJU0lPTl9MU0IgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQVI2MzIwX1NPQ19QT1dFUl9SRUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwYworCisvKiBDb3B5IEVuZ2luZSBEZWJ1ZyAqLworI2RlZmluZSBBUjYzMjBfV0xBTl9ERUJVR19JTlBVVF9TRUxfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwMTBjCisjZGVmaW5lIEFSNjMyMF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTVNCICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVI2MzIwX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19MU0IgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01BU0sgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEFSNjMyMF9XTEFOX0RFQlVHX0NPTlRST0xfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAxMDgKKyNkZWZpbmUgQVI2MzIwX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTVNCICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBfV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9MU0IgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVI2MzIwX1dMQU5fREVCVUdfT1VUX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAorI2RlZmluZSBBUjYzMjBfV0xBTl9ERUJVR19PVVRfREFUQV9NU0IgICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBBUjYzMjBfV0xBTl9ERUJVR19PVVRfREFUQV9MU0IgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMF9XTEFOX0RFQlVHX09VVF9EQVRBX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwZmZmZmYKKyNkZWZpbmUgQVI2MzIwX0FNQkFfREVCVUdfQlVTX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExYworI2RlZmluZSBBUjYzMjBfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTVNCICAgICAgICAxMworI2RlZmluZSBBUjYzMjBfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTFNCICAgICAgICA4CisjZGVmaW5lIEFSNjMyMF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NQVNLICAgICAgIDB4MDAwMDNmMDAKKyNkZWZpbmUgQVI2MzIwX0FNQkFfREVCVUdfQlVTX1NFTF9NU0IgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBUjYzMjBfQU1CQV9ERUJVR19CVVNfU0VMX0xTQiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMF9BTUJBX0RFQlVHX0JVU19TRUxfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgQVI2MzIwX0NFX1dSQVBQRVJfREVCVUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEFSNjMyMF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9NU0IgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVI2MzIwX0NFX1dSQVBQRVJfREVCVUdfU0VMX0xTQiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDNmCisjZGVmaW5lIEFSNjMyMF9DRV9ERUJVR19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NAorI2RlZmluZSBBUjYzMjBfQ0VfREVCVUdfU0VMX01TQiAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEFSNjMyMF9DRV9ERUJVR19TRUxfTFNCICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwX0NFX0RFQlVHX1NFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzZgorLyogRW5kICovCisKKy8qIFBMTCBzdGFydCAqLworI2RlZmluZSBBUjYzMjBfRUZVU0VfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzJjCisjZGVmaW5lIEFSNjMyMF9FRlVTRV9YVEFMX1NFTF9NU0IgICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEFSNjMyMF9FRlVTRV9YVEFMX1NFTF9MU0IgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQVI2MzIwX0VGVVNFX1hUQUxfU0VMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBBUjYzMjBfQkJfUExMX0NPTkZJR19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMmY0CisjZGVmaW5lIEFSNjMyMF9CQl9QTExfQ09ORklHX09VVERJVl9NU0IgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIEFSNjMyMF9CQl9QTExfQ09ORklHX09VVERJVl9MU0IgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEFSNjMyMF9CQl9QTExfQ09ORklHX09VVERJVl9NQVNLICAgICAgICAgICAgICAgIDB4MDAxYzAwMDAKKyNkZWZpbmUgQVI2MzIwX0JCX1BMTF9DT05GSUdfRlJBQ19NU0IgICAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgQVI2MzIwX0JCX1BMTF9DT05GSUdfRlJBQ19MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBfQkJfUExMX0NPTkZJR19GUkFDX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDNmZmZmCisjZGVmaW5lIEFSNjMyMF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NU0IgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEFSNjMyMF9XTEFOX1BMTF9TRVRUTEVfVElNRV9MU0IgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwX1dMQU5fUExMX1NFVFRMRV9USU1FX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDdmZgorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfU0VUVExFX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDAwMTgKKyNkZWZpbmUgQVI2MzIwX1dMQU5fUExMX1NFVFRMRV9TV19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDdmZgorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfU0VUVExFX1JTVE1BU0sgICAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEFSNjMyMF9XTEFOX1BMTF9TRVRUTEVfUkVTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTVNCICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTFNCICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTUFTSyAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTVNCICAgICAgICAgICAgICAxNgorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTFNCICAgICAgICAgICAgICAxNgorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTUFTSyAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19SRVNFVCAgICAgICAgICAgIDB4MQorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01TQiAgICAgICAgICAgICAxNQorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX0xTQiAgICAgICAgICAgICAxNAorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01BU0sgICAgICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfUkVTRVQgICAgICAgICAgIDB4MAorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTVNCICAgICAgICAgICAgICAxMworI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTFNCICAgICAgICAgICAgICAxMAorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTUFTSyAgICAgICAgICAgICAweDAwMDAzYzAwCisjZGVmaW5lIEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9SRVNFVCAgICAgICAgICAgIDB4MAorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9ESVZfTVNCICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX0RJVl9MU0IgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfRElWX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDNmZgorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9ESVZfUkVTRVQgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX09GRlNFVCAgICAgICAgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9TV19NQVNLICAgICAgICAgICAgICAgICAweDAwMWZmZmZmCisjZGVmaW5lIEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX1JTVE1BU0sgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfUkVTRVQgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAxMQorI2RlZmluZSBBUjYzMjBfU09DX0NPUkVfQ0xLX0NUUkxfT0ZGU0VUICAgICAgICAgICAgICAgICAweDAwMDAwMTE0CisjZGVmaW5lIEFSNjMyMF9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTVNCICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVI2MzIwX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9MU0IgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEFSNjMyMF9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX01TQiAgICAgICAgIDUKKyNkZWZpbmUgQVI2MzIwX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTFNCICAgICAgICAgNQorI2RlZmluZSBBUjYzMjBfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NQVNLICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEFSNjMyMF9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX1JFU0VUICAgICAgIDB4MAorI2RlZmluZSBBUjYzMjBfUlRDX1NZTkNfU1RBVFVTX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDAyNDQKKyNkZWZpbmUgQVI2MzIwX1NPQ19DUFVfQ0xPQ0tfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBUjYzMjBfU09DX0NQVV9DTE9DS19TVEFOREFSRF9NU0IgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFSNjMyMF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMworLyogUExMIGVuZCAqLworCisjZGVmaW5lIEFSNjMyMF9QQ0lFX0lOVFJfQ0VfTUFTSyhuKSBcCisJKEFSNjMyMF9QQ0lFX0lOVFJfQ0UwX01BU0sgPDwgKG4pKQorI2RlZmluZSBBUjYzMjBfRFJBTV9CQVNFX0FERFJFU1MgICAgICAgICAgQVI2MzIwX1RBUkdfRFJBTV9TVEFSVAorI2RlZmluZSBBUjYzMjBfRldfSU5ESUNBVE9SX0FERFJFU1MgXAorCShBUjYzMjBfU09DX0NPUkVfQkFTRV9BRERSRVNTICsgQVI2MzIwX1NDUkFUQ0hfM19BRERSRVNTKQorI2RlZmluZSBBUjYzMjBfU1lTVEVNX1NMRUVQX09GRlNFVCAgICAgICAgQVI2MzIwX1NPQ19TWVNURU1fU0xFRVBfT0ZGU0VUCisjZGVmaW5lIEFSNjMyMF9XTEFOX1NZU1RFTV9TTEVFUF9PRkZTRVQgICAweDAwMmMKKyNkZWZpbmUgQVI2MzIwX1dMQU5fUkVTRVRfQ09OVFJPTF9PRkZTRVQgIEFSNjMyMF9TT0NfUkVTRVRfQ09OVFJPTF9PRkZTRVQKKyNkZWZpbmUgQVI2MzIwX0NMT0NLX0NPTlRST0xfT0ZGU0VUICAgICAgIEFSNjMyMF9TT0NfQ0xPQ0tfQ09OVFJPTF9PRkZTRVQKKyNkZWZpbmUgQVI2MzIwX0NMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLIEFSNjMyMF9TT0NfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0sKKyNkZWZpbmUgQVI2MzIwX1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfTUFTSyAweDAwMDAwMDA0CisjZGVmaW5lIEFSNjMyMF9SRVNFVF9DT05UUk9MX1NJMF9SU1RfTUFTSyBBUjYzMjBfU09DX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLCisjZGVmaW5lIEFSNjMyMF9HUElPX0JBU0VfQUREUkVTUyAgICAgICAgICBBUjYzMjBfV0xBTl9HUElPX0JBU0VfQUREUkVTUworI2RlZmluZSBBUjYzMjBfR1BJT19QSU4wX09GRlNFVCAgICAgICAgICAgQVI2MzIwX1dMQU5fR1BJT19QSU4wX0FERFJFU1MKKyNkZWZpbmUgQVI2MzIwX0dQSU9fUElOMV9PRkZTRVQgICAgICAgICAgIEFSNjMyMF9XTEFOX0dQSU9fUElOMV9BRERSRVNTCisjZGVmaW5lIEFSNjMyMF9HUElPX1BJTjBfQ09ORklHX01BU0sgICAgICBBUjYzMjBfV0xBTl9HUElPX1BJTjBfQ09ORklHX01BU0sKKyNkZWZpbmUgQVI2MzIwX0dQSU9fUElOMV9DT05GSUdfTUFTSyAgICAgIEFSNjMyMF9XTEFOX0dQSU9fUElOMV9DT05GSUdfTUFTSworI2RlZmluZSBBUjYzMjBfU0lfQkFTRV9BRERSRVNTICAgICAgICAgICAgMHgwMDA1MDAwMAorI2RlZmluZSBBUjYzMjBfQ1BVX0NMT0NLX09GRlNFVCAgICAgICAgICAgQVI2MzIwX1NPQ19DUFVfQ0xPQ0tfT0ZGU0VUCisjZGVmaW5lIEFSNjMyMF9MUE9fQ0FMX09GRlNFVCAgICAgICAgICAgICBBUjYzMjBfU09DX0xQT19DQUxfT0ZGU0VUCisjZGVmaW5lIEFSNjMyMF9HUElPX1BJTjEwX09GRlNFVCAgICAgICAgICBBUjYzMjBfV0xBTl9HUElPX1BJTjEwX0FERFJFU1MKKyNkZWZpbmUgQVI2MzIwX0dQSU9fUElOMTFfT0ZGU0VUICAgICAgICAgIEFSNjMyMF9XTEFOX0dQSU9fUElOMTFfQUREUkVTUworI2RlZmluZSBBUjYzMjBfR1BJT19QSU4xMl9PRkZTRVQgICAgICAgICAgQVI2MzIwX1dMQU5fR1BJT19QSU4xMl9BRERSRVNTCisjZGVmaW5lIEFSNjMyMF9HUElPX1BJTjEzX09GRlNFVCAgICAgICAgICBBUjYzMjBfV0xBTl9HUElPX1BJTjEzX0FERFJFU1MKKyNkZWZpbmUgQVI2MzIwX0NQVV9DTE9DS19TVEFOREFSRF9MU0IgICAgIEFSNjMyMF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQgorI2RlZmluZSBBUjYzMjBfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgICAgQVI2MzIwX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSworI2RlZmluZSBBUjYzMjBfTFBPX0NBTF9FTkFCTEVfTFNCICAgICAgICAgQVI2MzIwX1NPQ19MUE9fQ0FMX0VOQUJMRV9MU0IKKyNkZWZpbmUgQVI2MzIwX0xQT19DQUxfRU5BQkxFX01BU0sgICAgICAgIEFSNjMyMF9TT0NfTFBPX0NBTF9FTkFCTEVfTUFTSworI2RlZmluZSBBUjYzMjBfQU5BTE9HX0lOVEZfQkFTRV9BRERSRVNTICAgQVI2MzIwX1dMQU5fQU5BTE9HX0lOVEZfQkFTRV9BRERSRVNTCisjZGVmaW5lIEFSNjMyMF9NQk9YX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBBUjYzMjBfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTFNCICAgICAgICAgICAgIDcKKyNkZWZpbmUgQVI2MzIwX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX01BU0sgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEFSNjMyMF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTFNCICAgICAgICAgICAgICAgNgorI2RlZmluZSBBUjYzMjBfSU5UX1NUQVRVU19FTkFCTEVfQ1BVX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQVI2MzIwX0lOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTFNCICAgICAgICAgICA0CisjZGVmaW5lIEFSNjMyMF9JTlRfU1RBVFVTX0VOQUJMRV9DT1VOVEVSX01BU0sgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBUjYzMjBfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX0xTQiAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEFSNjMyMF9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19MU0IgICAgMTcKKyNkZWZpbmUgQVI2MzIwX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX01BU0sgICAweDAwMDIwMDAwCisjZGVmaW5lIEFSNjMyMF9FUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XX0xTQiAgICAgMTYKKyNkZWZpbmUgQVI2MzIwX0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTUFTSyAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFSNjMyMF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IgICAgICAgMjQKKyNkZWZpbmUgQVI2MzIwX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX01BU0sgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIEFSNjMyMF9JTlRfU1RBVFVTX0VOQUJMRV9BRERSRVNTICAgICAgICAgICAgICAgMHgwODI4CisjZGVmaW5lIEFSNjMyMF9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiAgICAgICAgICAgOAorI2RlZmluZSBBUjYzMjBfQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLICAgICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgQVI2MzIwX0hPU1RfSU5UX1NUQVRVU19BRERSRVNTICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgQVI2MzIwX0NQVV9JTlRfU1RBVFVTX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDA4MDEKKyNkZWZpbmUgQVI2MzIwX0VSUk9SX0lOVF9TVEFUVVNfQUREUkVTUyAgICAgICAgICAgICAgICAweDA4MDIKKyNkZWZpbmUgQVI2MzIwX0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX01BU0sgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEFSNjMyMF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVI2MzIwX0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX01BU0sgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEFSNjMyMF9FUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPV19MU0IgICAgICAgMTcKKyNkZWZpbmUgQVI2MzIwX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSyAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFSNjMyMF9FUlJPUl9JTlRfU1RBVFVTX1RYX09WRVJGTE9XX0xTQiAgICAgICAgMTYKKyNkZWZpbmUgQVI2MzIwX0NPVU5UX0RFQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAweDA4NDAKKyNkZWZpbmUgQVI2MzIwX0hPU1RfSU5UX1NUQVRVU19DUFVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEFSNjMyMF9IT1NUX0lOVF9TVEFUVVNfQ1BVX0xTQiAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBBUjYzMjBfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQVI2MzIwX0hPU1RfSU5UX1NUQVRVU19FUlJPUl9MU0IgICAgICAgICAgICAgICA3CisjZGVmaW5lIEFSNjMyMF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9NQVNLICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBUjYzMjBfSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTFNCICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVI2MzIwX1JYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTICAgICAgICAgICAgICAweDA4MDUKKyNkZWZpbmUgQVI2MzIwX1dJTkRPV19EQVRBX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDA4NzQKKyNkZWZpbmUgQVI2MzIwX1dJTkRPV19SRUFEX0FERFJfQUREUkVTUyAgICAgICAgICAgICAgICAweDA4N2MKKyNkZWZpbmUgQVI2MzIwX1dJTkRPV19XUklURV9BRERSX0FERFJFU1MgICAgICAgICAgICAgICAweDA4NzgKKworc3RydWN0IHRhcmdldGRlZl9zIGFyNjMyMF90YXJnZXRkZWYgPSB7CisJLmRfUlRDX1NPQ19CQVNFX0FERFJFU1MgPSBBUjYzMjBfUlRDX1NPQ19CQVNFX0FERFJFU1MsCisJLmRfUlRDX1dNQUNfQkFTRV9BRERSRVNTID0gQVI2MzIwX1JUQ19XTUFDX0JBU0VfQUREUkVTUywKKwkuZF9TWVNURU1fU0xFRVBfT0ZGU0VUID0gQVI2MzIwX1dMQU5fU1lTVEVNX1NMRUVQX09GRlNFVCwKKwkuZF9XTEFOX1NZU1RFTV9TTEVFUF9PRkZTRVQgPSBBUjYzMjBfV0xBTl9TWVNURU1fU0xFRVBfT0ZGU0VULAorCS5kX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTFNCID0KKwkJQVI2MzIwX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTFNCLAorCS5kX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSyA9CisJCUFSNjMyMF9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX01BU0ssCisJLmRfQ0xPQ0tfQ09OVFJPTF9PRkZTRVQgPSBBUjYzMjBfQ0xPQ0tfQ09OVFJPTF9PRkZTRVQsCisJLmRfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0sgPSBBUjYzMjBfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0ssCisJLmRfUkVTRVRfQ09OVFJPTF9PRkZTRVQgPSBBUjYzMjBfU09DX1JFU0VUX0NPTlRST0xfT0ZGU0VULAorCS5kX1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfTUFTSyA9IEFSNjMyMF9SRVNFVF9DT05UUk9MX01CT1hfUlNUX01BU0ssCisJLmRfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0sgPSBBUjYzMjBfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0ssCisJLmRfV0xBTl9SRVNFVF9DT05UUk9MX09GRlNFVCA9IEFSNjMyMF9XTEFOX1JFU0VUX0NPTlRST0xfT0ZGU0VULAorCS5kX1dMQU5fUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9NQVNLID0KKwkJQVI2MzIwX1dMQU5fUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9NQVNLLAorCS5kX1dMQU5fUkVTRVRfQ09OVFJPTF9XQVJNX1JTVF9NQVNLID0KKwkJQVI2MzIwX1dMQU5fUkVTRVRfQ09OVFJPTF9XQVJNX1JTVF9NQVNLLAorCS5kX0dQSU9fQkFTRV9BRERSRVNTID0gQVI2MzIwX0dQSU9fQkFTRV9BRERSRVNTLAorCS5kX0dQSU9fUElOMF9PRkZTRVQgPSBBUjYzMjBfR1BJT19QSU4wX09GRlNFVCwKKwkuZF9HUElPX1BJTjFfT0ZGU0VUID0gQVI2MzIwX0dQSU9fUElOMV9PRkZTRVQsCisJLmRfR1BJT19QSU4wX0NPTkZJR19NQVNLID0gQVI2MzIwX0dQSU9fUElOMF9DT05GSUdfTUFTSywKKwkuZF9HUElPX1BJTjFfQ09ORklHX01BU0sgPSBBUjYzMjBfR1BJT19QSU4xX0NPTkZJR19NQVNLLAorCS5kX1NJX0NPTkZJR19CSURJUl9PRF9EQVRBX0xTQiA9IEFSNjMyMF9TSV9DT05GSUdfQklESVJfT0RfREFUQV9MU0IsCisJLmRfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTUFTSyA9IEFSNjMyMF9TSV9DT05GSUdfQklESVJfT0RfREFUQV9NQVNLLAorCS5kX1NJX0NPTkZJR19JMkNfTFNCID0gQVI2MzIwX1NJX0NPTkZJR19JMkNfTFNCLAorCS5kX1NJX0NPTkZJR19JMkNfTUFTSyA9IEFSNjMyMF9TSV9DT05GSUdfSTJDX01BU0ssCisJLmRfU0lfQ09ORklHX1BPU19TQU1QTEVfTFNCID0gQVI2MzIwX1NJX0NPTkZJR19QT1NfU0FNUExFX0xTQiwKKwkuZF9TSV9DT05GSUdfUE9TX1NBTVBMRV9NQVNLID0gQVI2MzIwX1NJX0NPTkZJR19QT1NfU0FNUExFX01BU0ssCisJLmRfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19MU0IgPSBBUjYzMjBfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19MU0IsCisJLmRfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19NQVNLID0gQVI2MzIwX1NJX0NPTkZJR19JTkFDVElWRV9DTEtfTUFTSywKKwkuZF9TSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9MU0IgPSBBUjYzMjBfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTFNCLAorCS5kX1NJX0NPTkZJR19JTkFDVElWRV9EQVRBX01BU0sgPSBBUjYzMjBfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSywKKwkuZF9TSV9DT05GSUdfRElWSURFUl9MU0IgPSBBUjYzMjBfU0lfQ09ORklHX0RJVklERVJfTFNCLAorCS5kX1NJX0NPTkZJR19ESVZJREVSX01BU0sgPSBBUjYzMjBfU0lfQ09ORklHX0RJVklERVJfTUFTSywKKwkuZF9TSV9CQVNFX0FERFJFU1MgPSBBUjYzMjBfU0lfQkFTRV9BRERSRVNTLAorCS5kX1NJX0NPTkZJR19PRkZTRVQgPSBBUjYzMjBfU0lfQ09ORklHX09GRlNFVCwKKwkuZF9TSV9UWF9EQVRBMF9PRkZTRVQgPSBBUjYzMjBfU0lfVFhfREFUQTBfT0ZGU0VULAorCS5kX1NJX1RYX0RBVEExX09GRlNFVCA9IEFSNjMyMF9TSV9UWF9EQVRBMV9PRkZTRVQsCisJLmRfU0lfUlhfREFUQTBfT0ZGU0VUID0gQVI2MzIwX1NJX1JYX0RBVEEwX09GRlNFVCwKKwkuZF9TSV9SWF9EQVRBMV9PRkZTRVQgPSBBUjYzMjBfU0lfUlhfREFUQTFfT0ZGU0VULAorCS5kX1NJX0NTX09GRlNFVCA9IEFSNjMyMF9TSV9DU19PRkZTRVQsCisJLmRfU0lfQ1NfRE9ORV9FUlJfTUFTSyA9IEFSNjMyMF9TSV9DU19ET05FX0VSUl9NQVNLLAorCS5kX1NJX0NTX0RPTkVfSU5UX01BU0sgPSBBUjYzMjBfU0lfQ1NfRE9ORV9JTlRfTUFTSywKKwkuZF9TSV9DU19TVEFSVF9MU0IgPSBBUjYzMjBfU0lfQ1NfU1RBUlRfTFNCLAorCS5kX1NJX0NTX1NUQVJUX01BU0sgPSBBUjYzMjBfU0lfQ1NfU1RBUlRfTUFTSywKKwkuZF9TSV9DU19SWF9DTlRfTFNCID0gQVI2MzIwX1NJX0NTX1JYX0NOVF9MU0IsCisJLmRfU0lfQ1NfUlhfQ05UX01BU0sgPSBBUjYzMjBfU0lfQ1NfUlhfQ05UX01BU0ssCisJLmRfU0lfQ1NfVFhfQ05UX0xTQiA9IEFSNjMyMF9TSV9DU19UWF9DTlRfTFNCLAorCS5kX1NJX0NTX1RYX0NOVF9NQVNLID0gQVI2MzIwX1NJX0NTX1RYX0NOVF9NQVNLLAorCS5kX0JPQVJEX0RBVEFfU1ogPSBBUjYzMjBfQk9BUkRfREFUQV9TWiwKKwkuZF9CT0FSRF9FWFRfREFUQV9TWiA9IEFSNjMyMF9CT0FSRF9FWFRfREFUQV9TWiwKKwkuZF9NQk9YX0JBU0VfQUREUkVTUyA9IEFSNjMyMF9NQk9YX0JBU0VfQUREUkVTUywKKwkuZF9MT0NBTF9TQ1JBVENIX09GRlNFVCA9IEFSNjMyMF9MT0NBTF9TQ1JBVENIX09GRlNFVCwKKwkuZF9DUFVfQ0xPQ0tfT0ZGU0VUID0gQVI2MzIwX0NQVV9DTE9DS19PRkZTRVQsCisJLmRfTFBPX0NBTF9PRkZTRVQgPSBBUjYzMjBfTFBPX0NBTF9PRkZTRVQsCisJLmRfR1BJT19QSU4xMF9PRkZTRVQgPSBBUjYzMjBfR1BJT19QSU4xMF9PRkZTRVQsCisJLmRfR1BJT19QSU4xMV9PRkZTRVQgPSBBUjYzMjBfR1BJT19QSU4xMV9PRkZTRVQsCisJLmRfR1BJT19QSU4xMl9PRkZTRVQgPSBBUjYzMjBfR1BJT19QSU4xMl9PRkZTRVQsCisJLmRfR1BJT19QSU4xM19PRkZTRVQgPSBBUjYzMjBfR1BJT19QSU4xM19PRkZTRVQsCisJLmRfQ0xPQ0tfR1BJT19PRkZTRVQgPSBBUjYzMjBfQ0xPQ0tfR1BJT19PRkZTRVQsCisJLmRfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiA9IEFSNjMyMF9DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCLAorCS5kX0NQVV9DTE9DS19TVEFOREFSRF9NQVNLID0gQVI2MzIwX0NQVV9DTE9DS19TVEFOREFSRF9NQVNLLAorCS5kX0xQT19DQUxfRU5BQkxFX0xTQiA9IEFSNjMyMF9MUE9fQ0FMX0VOQUJMRV9MU0IsCisJLmRfTFBPX0NBTF9FTkFCTEVfTUFTSyA9IEFSNjMyMF9MUE9fQ0FMX0VOQUJMRV9NQVNLLAorCS5kX0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9MU0IgPSBBUjYzMjBfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQiwKKwkuZF9DTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTUFTSyA9CisJCUFSNjMyMF9DTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTUFTSywKKwkuZF9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MgPSBBUjYzMjBfQU5BTE9HX0lOVEZfQkFTRV9BRERSRVNTLAorCS5kX1dMQU5fTUFDX0JBU0VfQUREUkVTUyA9IEFSNjMyMF9XTEFOX01BQ19CQVNFX0FERFJFU1MsCisJLmRfRldfSU5ESUNBVE9SX0FERFJFU1MgPSBBUjYzMjBfRldfSU5ESUNBVE9SX0FERFJFU1MsCisJLmRfRFJBTV9CQVNFX0FERFJFU1MgPSBBUjYzMjBfRFJBTV9CQVNFX0FERFJFU1MsCisJLmRfU09DX0NPUkVfQkFTRV9BRERSRVNTID0gQVI2MzIwX1NPQ19DT1JFX0JBU0VfQUREUkVTUywKKwkuZF9DT1JFX0NUUkxfQUREUkVTUyA9IEFSNjMyMF9DT1JFX0NUUkxfQUREUkVTUywKKwkuZF9DRV9DT1VOVCA9IEFSNjMyMF9DRV9DT1VOVCwKKwkuZF9NU0lfTlVNX1JFUVVFU1QgPSBNU0lfTlVNX1JFUVVFU1QsCisJLmRfTVNJX0FTU0lHTl9GVyA9IE1TSV9BU1NJR05fRlcsCisJLmRfTVNJX0FTU0lHTl9DRV9JTklUSUFMID0gTVNJX0FTU0lHTl9DRV9JTklUSUFMLAorCS5kX1BDSUVfSU5UUl9FTkFCTEVfQUREUkVTUyA9IEFSNjMyMF9QQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MsCisJLmRfUENJRV9JTlRSX0NMUl9BRERSRVNTID0gQVI2MzIwX1BDSUVfSU5UUl9DTFJfQUREUkVTUywKKwkuZF9QQ0lFX0lOVFJfRklSTVdBUkVfTUFTSyA9IEFSNjMyMF9QQ0lFX0lOVFJfRklSTVdBUkVfTUFTSywKKwkuZF9QQ0lFX0lOVFJfQ0VfTUFTS19BTEwgPSBBUjYzMjBfUENJRV9JTlRSX0NFX01BU0tfQUxMLAorCS5kX0NPUkVfQ1RSTF9DUFVfSU5UUl9NQVNLID0gQVI2MzIwX0NPUkVfQ1RSTF9DUFVfSU5UUl9NQVNLLAorCS5kX1NSX1dSX0lOREVYX0FERFJFU1MgPSBBUjYzMjBfU1JfV1JfSU5ERVhfQUREUkVTUywKKwkuZF9EU1RfV0FURVJNQVJLX0FERFJFU1MgPSBBUjYzMjBfRFNUX1dBVEVSTUFSS19BRERSRVNTLAorCS8qIGh0dF9yeC5jICovCisJLmRfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX01BU0sgPQorCQlBUjYzMjBfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX01BU0ssCisJLmRfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX0xTQiA9IEFSNjMyMF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTFNCLAorICAgIC5kX1JYX01QRFVfU1RBUlRfMF9SRVRSWV9MU0IgPSBBUjYzMjBfUlhfTVBEVV9TVEFSVF8wX1JFVFJZX0xTQiwKKyAgICAuZF9SWF9NUERVX1NUQVJUXzBfUkVUUllfTUFTSyA9IEFSNjMyMF9SWF9NUERVX1NUQVJUXzBfUkVUUllfTUFTSywKKwkuZF9SWF9NUERVX1NUQVJUXzBfU0VRX05VTV9NQVNLID0gQVI2MzIwX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX01BU0ssCisJLmRfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTFNCID0gQVI2MzIwX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX0xTQiwKKwkuZF9SWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTFNCID0gQVI2MzIwX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9MU0IsCisJLmRfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX01BU0sgPQorCQlBUjYzMjBfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX01BU0ssCisgICAgLmRfUlhfTVBEVV9TVEFSVF8yX1RJRF9MU0IgPSBBUjYzMjBfUlhfTVBEVV9TVEFSVF8yX1RJRF9MU0IsCisgICAgLmRfUlhfTVBEVV9TVEFSVF8yX1RJRF9NQVNLID0gQVI2MzIwX1JYX01QRFVfU1RBUlRfMl9USURfTUFTSywKKwkuZF9SWF9NU0RVX0VORF8xX0tFWV9JRF9PQ1RfTUFTSyA9CisJCUFSNjMyMF9SWF9NU0RVX0VORF8xX0tFWV9JRF9PQ1RfTUFTSywKKwkuZF9SWF9NU0RVX0VORF8xX0tFWV9JRF9PQ1RfTFNCID0gQVI2MzIwX1JYX01TRFVfRU5EXzFfS0VZX0lEX09DVF9MU0IsCisJLmRfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9NQVNLID0KKwkJQVI2MzIwX1JYX01TRFVfRU5EXzFfRVhUX1dBUElfUE5fNjNfNDhfTUFTSywKKwkuZF9SWF9NU0RVX0VORF8xX0VYVF9XQVBJX1BOXzYzXzQ4X0xTQiA9CisJCUFSNjMyMF9SWF9NU0RVX0VORF8xX0VYVF9XQVBJX1BOXzYzXzQ4X0xTQiwKKwkuZF9SWF9NU0RVX0VORF80X0xBU1RfTVNEVV9NQVNLID0gQVI2MzIwX1JYX01TRFVfRU5EXzRfTEFTVF9NU0RVX01BU0ssCisJLmRfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCID0gQVI2MzIwX1JYX01TRFVfRU5EXzRfTEFTVF9NU0RVX0xTQiwKKwkuZF9SWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9NQVNLID0KKwkJQVI2MzIwX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX01BU0ssCisJLmRfUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTFNCID0KKwkJQVI2MzIwX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX0xTQiwKKwkuZF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9NQVNLID0gQVI2MzIwX1JYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX01BU0ssCisJLmRfUlhfQVRURU5USU9OXzBfRlJBR01FTlRfTFNCID0gQVI2MzIwX1JYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX0xTQiwKKwkuZF9SWF9BVFRFTlRJT05fMF9NUERVX0xFTkdUSF9FUlJfTUFTSyA9CisJCUFSNjMyMF9SWF9BVFRFTlRJT05fMF9NUERVX0xFTkdUSF9FUlJfTUFTSywKKwkuZF9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX01BU0sgPQorCQlBUjYzMjBfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9NQVNLLAorCS5kX1JYX0ZSQUdfSU5GT18wX1JJTkcyX01PUkVfQ09VTlRfTFNCID0KKwkJQVI2MzIwX1JYX0ZSQUdfSU5GT18wX1JJTkcyX01PUkVfQ09VTlRfTFNCLAorCS5kX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9NQVNLID0KKwkJQVI2MzIwX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9NQVNLLAorCS5kX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9MU0IgPQorCQlBUjYzMjBfUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX0xTQiwKKwkuZF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX09GRlNFVCA9CisJCUFSNjMyMF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX09GRlNFVCwKKwkuZF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX01BU0sgPQorCQlBUjYzMjBfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9NQVNLLAorCS5kX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTFNCID0KKwkJQVI2MzIwX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTFNCLAorCS5kX1JYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTUFTSyA9CisJCUFSNjMyMF9SWF9NUERVX1NUQVJUXzBfRU5DUllQVEVEX01BU0ssCisJLmRfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9MU0IgPQorCQlBUjYzMjBfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9MU0IsCisJLmRfUlhfQVRURU5USU9OXzBfTU9SRV9EQVRBX01BU0sgPQorCQlBUjYzMjBfUlhfQVRURU5USU9OXzBfTU9SRV9EQVRBX01BU0ssCisJLmRfUlhfQVRURU5USU9OXzBfTVNEVV9ET05FX01BU0sgPQorCQlBUjYzMjBfUlhfQVRURU5USU9OXzBfTVNEVV9ET05FX01BU0ssCisJLmRfUlhfQVRURU5USU9OXzBfVENQX1VEUF9DSEtTVU1fRkFJTF9NQVNLID0KKwkJQVI2MzIwX1JYX0FUVEVOVElPTl8wX1RDUF9VRFBfQ0hLU1VNX0ZBSUxfTUFTSywKKyAgICAvKiBQTEwgc3RhcnQgKi8KKwkuZF9FRlVTRV9PRkZTRVQgPSBBUjYzMjBfRUZVU0VfT0ZGU0VULAorCS5kX0VGVVNFX1hUQUxfU0VMX01TQiA9IEFSNjMyMF9FRlVTRV9YVEFMX1NFTF9NU0IsCisJLmRfRUZVU0VfWFRBTF9TRUxfTFNCID0gQVI2MzIwX0VGVVNFX1hUQUxfU0VMX0xTQiwKKwkuZF9FRlVTRV9YVEFMX1NFTF9NQVNLID0gQVI2MzIwX0VGVVNFX1hUQUxfU0VMX01BU0ssCisJLmRfQkJfUExMX0NPTkZJR19PRkZTRVQgPSBBUjYzMjBfQkJfUExMX0NPTkZJR19PRkZTRVQsCisJLmRfQkJfUExMX0NPTkZJR19PVVRESVZfTVNCID0gQVI2MzIwX0JCX1BMTF9DT05GSUdfT1VURElWX01TQiwKKwkuZF9CQl9QTExfQ09ORklHX09VVERJVl9MU0IgPSBBUjYzMjBfQkJfUExMX0NPTkZJR19PVVRESVZfTFNCLAorCS5kX0JCX1BMTF9DT05GSUdfT1VURElWX01BU0sgPSBBUjYzMjBfQkJfUExMX0NPTkZJR19PVVRESVZfTUFTSywKKwkuZF9CQl9QTExfQ09ORklHX0ZSQUNfTVNCID0gQVI2MzIwX0JCX1BMTF9DT05GSUdfRlJBQ19NU0IsCisJLmRfQkJfUExMX0NPTkZJR19GUkFDX0xTQiA9IEFSNjMyMF9CQl9QTExfQ09ORklHX0ZSQUNfTFNCLAorCS5kX0JCX1BMTF9DT05GSUdfRlJBQ19NQVNLID0gQVI2MzIwX0JCX1BMTF9DT05GSUdfRlJBQ19NQVNLLAorCS5kX1dMQU5fUExMX1NFVFRMRV9USU1FX01TQiA9IEFSNjMyMF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NU0IsCisJLmRfV0xBTl9QTExfU0VUVExFX1RJTUVfTFNCID0gQVI2MzIwX1dMQU5fUExMX1NFVFRMRV9USU1FX0xTQiwKKwkuZF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NQVNLID0gQVI2MzIwX1dMQU5fUExMX1NFVFRMRV9USU1FX01BU0ssCisJLmRfV0xBTl9QTExfU0VUVExFX09GRlNFVCA9IEFSNjMyMF9XTEFOX1BMTF9TRVRUTEVfT0ZGU0VULAorCS5kX1dMQU5fUExMX1NFVFRMRV9TV19NQVNLID0gQVI2MzIwX1dMQU5fUExMX1NFVFRMRV9TV19NQVNLLAorCS5kX1dMQU5fUExMX1NFVFRMRV9SU1RNQVNLID0gQVI2MzIwX1dMQU5fUExMX1NFVFRMRV9SU1RNQVNLLAorCS5kX1dMQU5fUExMX1NFVFRMRV9SRVNFVCA9IEFSNjMyMF9XTEFOX1BMTF9TRVRUTEVfUkVTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NU0IgPSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9MU0IgPSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9MU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NQVNLID0gQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTUFTSywKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19NU0IgPSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTVNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX0xTQiA9IEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19MU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTUFTSyA9IEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19NQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX1JFU0VUID0KKwkJQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX1JFU0VULAorCS5kX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9NU0IgPSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01TQiwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTFNCID0gQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9MU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01BU0sgPQorCQlBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01BU0ssCisJLmRfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX1JFU0VUID0KKwkJQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9SRVNFVCwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NU0IgPSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTVNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX0xTQiA9IEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9MU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTUFTSyA9IEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX1JFU0VUID0KKwkJQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX1JFU0VULAorCS5kX1dMQU5fUExMX0NPTlRST0xfRElWX01TQiA9IEFSNjMyMF9XTEFOX1BMTF9DT05UUk9MX0RJVl9NU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9ESVZfTFNCID0gQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfRElWX0xTQiwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0RJVl9NQVNLID0gQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfRElWX01BU0ssCisJLmRfV0xBTl9QTExfQ09OVFJPTF9ESVZfUkVTRVQgPSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9ESVZfUkVTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9PRkZTRVQgPSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9PRkZTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9TV19NQVNLID0gQVI2MzIwX1dMQU5fUExMX0NPTlRST0xfU1dfTUFTSywKKwkuZF9XTEFOX1BMTF9DT05UUk9MX1JTVE1BU0sgPSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9SU1RNQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfUkVTRVQgPSBBUjYzMjBfV0xBTl9QTExfQ09OVFJPTF9SRVNFVCwKKwkuZF9TT0NfQ09SRV9DTEtfQ1RSTF9PRkZTRVQgPSBBUjYzMjBfU09DX0NPUkVfQ0xLX0NUUkxfT0ZGU0VULAorCS5kX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9NU0IgPSBBUjYzMjBfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01TQiwKKwkuZF9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTFNCID0gQVI2MzIwX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9MU0IsCisJLmRfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0sgPSBBUjYzMjBfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0ssCisJLmRfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NU0IgPQorCQlBUjYzMjBfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NU0IsCisJLmRfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19MU0IgPQorCQlBUjYzMjBfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19MU0IsCisJLmRfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NQVNLID0KKwkJQVI2MzIwX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTUFTSywKKwkuZF9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX1JFU0VUID0KKwkJQVI2MzIwX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfUkVTRVQsCisJLmRfUlRDX1NZTkNfU1RBVFVTX09GRlNFVCA9IEFSNjMyMF9SVENfU1lOQ19TVEFUVVNfT0ZGU0VULAorCS5kX1NPQ19DUFVfQ0xPQ0tfT0ZGU0VUID0gQVI2MzIwX1NPQ19DUFVfQ0xPQ0tfT0ZGU0VULAorCS5kX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTVNCID0gQVI2MzIwX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTVNCLAorCS5kX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCID0gQVI2MzIwX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCLAorCS5kX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSyA9IEFSNjMyMF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0ssCisJLyogUExMIGVuZCAqLworCS5kX1NPQ19QT1dFUl9SRUdfT0ZGU0VUID0gQVI2MzIwX1NPQ19QT1dFUl9SRUdfT0ZGU0VULAorCS5kX1BDSUVfSU5UUl9DQVVTRV9BRERSRVNTID0gQVI2MzIwX1BDSUVfSU5UUl9DQVVTRV9BRERSRVNTLAorCS5kX1NPQ19SRVNFVF9DT05UUk9MX0FERFJFU1MgPSBBUjYzMjBfU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUywKKwkuZF9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX01BU0sgPQorCQlBUjYzMjBfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9NQVNLLAorCS5kX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTFNCID0KKwkJQVI2MzIwX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTFNCLAorCS5kX1NPQ19SRVNFVF9DT05UUk9MX0NFX1JTVF9NQVNLID0KKwkJQVI2MzIwX1NPQ19SRVNFVF9DT05UUk9MX0NFX1JTVF9NQVNLLAorCS5kX1NPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9NQVNLID0KKwkJQVI2MzIwX1NPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9NQVNLLAorCS5kX0NQVV9JTlRSX0FERFJFU1MgPSBBUjYzMjBfQ1BVX0lOVFJfQUREUkVTUywKKwkuZF9TT0NfTEZfVElNRVJfQ09OVFJPTDBfQUREUkVTUyA9CisJCUFSNjMyMF9TT0NfTEZfVElNRVJfQ09OVFJPTDBfQUREUkVTUywKKwkuZF9TT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0sgPQorCQlBUjYzMjBfU09DX0xGX1RJTUVSX0NPTlRST0wwX0VOQUJMRV9NQVNLLAorCS8qIGNoaXAgaWQgc3RhcnQgKi8KKwkuZF9TT0NfQ0hJUF9JRF9BRERSRVNTID0gQVI2MzIwX1NPQ19DSElQX0lEX0FERFJFU1MsCisJLmRfU09DX0NISVBfSURfVkVSU0lPTl9NQVNLID0gQVI2MzIwX1NPQ19DSElQX0lEX1ZFUlNJT05fTUFTSywKKwkuZF9TT0NfQ0hJUF9JRF9WRVJTSU9OX0xTQiA9IEFSNjMyMF9TT0NfQ0hJUF9JRF9WRVJTSU9OX0xTQiwKKwkuZF9TT0NfQ0hJUF9JRF9SRVZJU0lPTl9NQVNLID0gQVI2MzIwX1NPQ19DSElQX0lEX1JFVklTSU9OX01BU0ssCisJLmRfU09DX0NISVBfSURfUkVWSVNJT05fTFNCID0gQVI2MzIwX1NPQ19DSElQX0lEX1JFVklTSU9OX0xTQiwKKwkvKiBjaGlwIGlkIGVuZCAqLworCisJLmRfV0xBTl9ERUJVR19JTlBVVF9TRUxfT0ZGU0VUID0gQVI2MzIwX1dMQU5fREVCVUdfSU5QVVRfU0VMX09GRlNFVCwKKwkuZF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTVNCID0gQVI2MzIwX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NU0IsCisJLmRfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX0xTQiA9IEFSNjMyMF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTFNCLAorCS5kX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NQVNLID0KKwkJQVI2MzIwX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NQVNLLAorCS5kX1dMQU5fREVCVUdfQ09OVFJPTF9PRkZTRVQgPSBBUjYzMjBfV0xBTl9ERUJVR19DT05UUk9MX09GRlNFVCwKKwkuZF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01TQiA9CisJCUFSNjMyMF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01TQiwKKwkuZF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX0xTQiA9CisJCUFSNjMyMF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX0xTQiwKKwkuZF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01BU0sgPQorCQlBUjYzMjBfV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9NQVNLLAorCS5kX1dMQU5fREVCVUdfT1VUX09GRlNFVCA9IEFSNjMyMF9XTEFOX0RFQlVHX09VVF9PRkZTRVQsCisJLmRfV0xBTl9ERUJVR19PVVRfREFUQV9NU0IgPSBBUjYzMjBfV0xBTl9ERUJVR19PVVRfREFUQV9NU0IsCisJLmRfV0xBTl9ERUJVR19PVVRfREFUQV9MU0IgPSBBUjYzMjBfV0xBTl9ERUJVR19PVVRfREFUQV9MU0IsCisJLmRfV0xBTl9ERUJVR19PVVRfREFUQV9NQVNLID0gQVI2MzIwX1dMQU5fREVCVUdfT1VUX0RBVEFfTUFTSywKKwkuZF9BTUJBX0RFQlVHX0JVU19PRkZTRVQgPSBBUjYzMjBfQU1CQV9ERUJVR19CVVNfT0ZGU0VULAorCS5kX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX01TQiA9CisJCUFSNjMyMF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NU0IsCisJLmRfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTFNCID0KKwkJQVI2MzIwX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX0xTQiwKKwkuZF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NQVNLID0KKwkJQVI2MzIwX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX01BU0ssCisJLmRfQU1CQV9ERUJVR19CVVNfU0VMX01TQiA9IEFSNjMyMF9BTUJBX0RFQlVHX0JVU19TRUxfTVNCLAorCS5kX0FNQkFfREVCVUdfQlVTX1NFTF9MU0IgPSBBUjYzMjBfQU1CQV9ERUJVR19CVVNfU0VMX0xTQiwKKwkuZF9BTUJBX0RFQlVHX0JVU19TRUxfTUFTSyA9IEFSNjMyMF9BTUJBX0RFQlVHX0JVU19TRUxfTUFTSywKKworfTsKKworc3RydWN0IGhvc3RkZWZfcyBhcjYzMjBfaG9zdGRlZiA9IHsKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9MU0IgPSBBUjYzMjBfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTFNCLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX01BU0sgPSBBUjYzMjBfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTUFTSywKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTFNCID0gQVI2MzIwX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9MU0IsCisJLmRfSU5UX1NUQVRVU19FTkFCTEVfQ1BVX01BU0sgPSBBUjYzMjBfSU5UX1NUQVRVU19FTkFCTEVfQ1BVX01BU0ssCisJLmRfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9MU0IgPQorCQlBUjYzMjBfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9MU0IsCisJLmRfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9NQVNLID0KKwkJQVI2MzIwX0lOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTUFTSywKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEFfTFNCID0KKwkJQVI2MzIwX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9MU0IsCisJLmRfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX01BU0sgPQorCQlBUjYzMjBfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX01BU0ssCisJLmRfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTFNCID0KKwkJQVI2MzIwX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX0xTQiwKKwkuZF9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19NQVNLID0KKwkJQVI2MzIwX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX01BU0ssCisJLmRfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19MU0IgPQorCQlBUjYzMjBfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19MU0IsCisJLmRfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19NQVNLID0KKwkJQVI2MzIwX0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTUFTSywKKwkuZF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IgPQorCQlBUjYzMjBfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTFNCLAorCS5kX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX01BU0sgPQorCQlBUjYzMjBfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSywKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9BRERSRVNTID0gQVI2MzIwX0lOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1MsCisJLmRfQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IgPQorCQlBUjYzMjBfQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IsCisJLmRfQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLID0KKwkJQVI2MzIwX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfQUREUkVTUyA9IEFSNjMyMF9IT1NUX0lOVF9TVEFUVVNfQUREUkVTUywKKwkuZF9DUFVfSU5UX1NUQVRVU19BRERSRVNTID0gQVI2MzIwX0NQVV9JTlRfU1RBVFVTX0FERFJFU1MsCisJLmRfRVJST1JfSU5UX1NUQVRVU19BRERSRVNTID0gQVI2MzIwX0VSUk9SX0lOVF9TVEFUVVNfQUREUkVTUywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9NQVNLID0gQVI2MzIwX0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX01BU0ssCisJLmRfRVJST1JfSU5UX1NUQVRVU19XQUtFVVBfTFNCID0gQVI2MzIwX0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX0xTQiwKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPV19NQVNLID0KKwkJQVI2MzIwX0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX01BU0ssCisJLmRfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTFNCID0KKwkJQVI2MzIwX0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX0xTQiwKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1RYX09WRVJGTE9XX01BU0sgPQorCQlBUjYzMjBfRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPV19NQVNLLAorCS5kX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTFNCID0KKwkJQVI2MzIwX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTFNCLAorCS5kX0NPVU5UX0RFQ19BRERSRVNTID0gQVI2MzIwX0NPVU5UX0RFQ19BRERSRVNTLAorCS5kX0hPU1RfSU5UX1NUQVRVU19DUFVfTUFTSyA9IEFSNjMyMF9IT1NUX0lOVF9TVEFUVVNfQ1BVX01BU0ssCisJLmRfSE9TVF9JTlRfU1RBVFVTX0NQVV9MU0IgPSBBUjYzMjBfSE9TVF9JTlRfU1RBVFVTX0NQVV9MU0IsCisJLmRfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX01BU0sgPSBBUjYzMjBfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX01BU0ssCisJLmRfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX0xTQiA9IEFSNjMyMF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTFNCLAorCS5kX0hPU1RfSU5UX1NUQVRVU19DT1VOVEVSX01BU0sgPSBBUjYzMjBfSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9MU0IgPSBBUjYzMjBfSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTFNCLAorCS5kX1JYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTID0gQVI2MzIwX1JYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTLAorCS5kX1dJTkRPV19EQVRBX0FERFJFU1MgPSBBUjYzMjBfV0lORE9XX0RBVEFfQUREUkVTUywKKwkuZF9XSU5ET1dfUkVBRF9BRERSX0FERFJFU1MgPSBBUjYzMjBfV0lORE9XX1JFQURfQUREUl9BRERSRVNTLAorCS5kX1dJTkRPV19XUklURV9BRERSX0FERFJFU1MgPSBBUjYzMjBfV0lORE9XX1dSSVRFX0FERFJfQUREUkVTUywKKwkuZF9TT0NfR0xPQkFMX1JFU0VUX0FERFJFU1MgPSBBUjYzMjBfU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTLAorCS5kX1JUQ19TVEFURV9BRERSRVNTID0gQVI2MzIwX1JUQ19TVEFURV9BRERSRVNTLAorCS5kX1JUQ19TVEFURV9DT0xEX1JFU0VUX01BU0sgPSBBUjYzMjBfUlRDX1NUQVRFX0NPTERfUkVTRVRfTUFTSywKKwkuZF9QQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUyA9IEFSNjMyMF9QQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUywKKwkuZF9QQ0lFX1NPQ19XQUtFX1JFU0VUID0gQVI2MzIwX1BDSUVfU09DX1dBS0VfUkVTRVQsCisJLmRfUENJRV9TT0NfV0FLRV9BRERSRVNTID0gQVI2MzIwX1BDSUVfU09DX1dBS0VfQUREUkVTUywKKwkuZF9QQ0lFX1NPQ19XQUtFX1ZfTUFTSyA9IEFSNjMyMF9QQ0lFX1NPQ19XQUtFX1ZfTUFTSywKKwkuZF9SVENfU1RBVEVfVl9NQVNLID0gQVI2MzIwX1JUQ19TVEFURV9WX01BU0ssCisJLmRfUlRDX1NUQVRFX1ZfTFNCID0gQVI2MzIwX1JUQ19TVEFURV9WX0xTQiwKKwkuZF9GV19JTkRfRVZFTlRfUEVORElORyA9IEFSNjMyMF9GV19JTkRfRVZFTlRfUEVORElORywKKwkuZF9GV19JTkRfSU5JVElBTElaRUQgPSBBUjYzMjBfRldfSU5EX0lOSVRJQUxJWkVELAorCS5kX0ZXX0lORF9IRUxQRVIgPSBBUjYzMjBfRldfSU5EX0hFTFBFUiwKKwkuZF9SVENfU1RBVEVfVl9PTiA9IEFSNjMyMF9SVENfU1RBVEVfVl9PTiwKKwkuZF9NVVhfSURfTUFTSyA9IEFSNjMyMF9NVVhfSURfTUFTSywKKwkuZF9UUkFOU0FDVElPTl9JRF9NQVNLID0gQVI2MzIwX1RSQU5TQUNUSU9OX0lEX01BU0ssCisjaWYgZGVmaW5lZChTRElPXzNfMCkKKwkuZF9IT1NUX0lOVF9TVEFUVVNfTUJPWF9EQVRBX01BU0sgPQorCQlBUjYzMjBfSE9TVF9JTlRfU1RBVFVTX01CT1hfREFUQV9NQVNLLAorCS5kX0hPU1RfSU5UX1NUQVRVU19NQk9YX0RBVEFfTFNCID0KKwkJQVI2MzIwX0hPU1RfSU5UX1NUQVRVU19NQk9YX0RBVEFfTFNCLAorI2VuZGlmCisJLmRfUENJRV9TT0NfUkRZX1NUQVRVU19BRERSRVNTID0gUENJRV9TT0NfUkRZX1NUQVRVU19BRERSRVNTLAorCS5kX1BDSUVfU09DX1JEWV9TVEFUVVNfQkFSX01BU0sgPSBQQ0lFX1NPQ19SRFlfU1RBVFVTX0JBUl9NQVNLLAorCS5kX1NPQ19QQ0lFX0JBU0VfQUREUkVTUyA9IFNPQ19QQ0lFX0JBU0VfQUREUkVTUywKKwkuZF9NU0lfTUFHSUNfQURSX0FERFJFU1MgPSBNU0lfTUFHSUNfQURSX0FERFJFU1MsCisJLmRfTVNJX01BR0lDX0FERFJFU1MgPSBNU0lfTUFHSUNfQUREUkVTUywKKwkuZF9IT1NUX0NFX0NPVU5UID0gOCwKKwkuZF9FTkFCTEVfTVNJID0gMCwKK307CisKKworc3RydWN0IGNlX3JlZ19kZWYgYXI2MzIwX2NlX3RhcmdldGRlZiA9IHsKKwkvKiBjb3B5X2VuZ2luZS5jICAqLworCS5kX0RTVF9XUl9JTkRFWF9BRERSRVNTID0gQVI2MzIwX0RTVF9XUl9JTkRFWF9BRERSRVNTLAorCS5kX1NSQ19XQVRFUk1BUktfQUREUkVTUyA9IEFSNjMyMF9TUkNfV0FURVJNQVJLX0FERFJFU1MsCisJLmRfU1JDX1dBVEVSTUFSS19MT1dfTUFTSyA9IEFSNjMyMF9TUkNfV0FURVJNQVJLX0xPV19NQVNLLAorCS5kX1NSQ19XQVRFUk1BUktfSElHSF9NQVNLID0gQVI2MzIwX1NSQ19XQVRFUk1BUktfSElHSF9NQVNLLAorCS5kX0RTVF9XQVRFUk1BUktfTE9XX01BU0sgPSBBUjYzMjBfRFNUX1dBVEVSTUFSS19MT1dfTUFTSywKKwkuZF9EU1RfV0FURVJNQVJLX0hJR0hfTUFTSyA9IEFSNjMyMF9EU1RfV0FURVJNQVJLX0hJR0hfTUFTSywKKwkuZF9DVVJSRU5UX1NSUklfQUREUkVTUyA9IEFSNjMyMF9DVVJSRU5UX1NSUklfQUREUkVTUywKKwkuZF9DVVJSRU5UX0RSUklfQUREUkVTUyA9IEFSNjMyMF9DVVJSRU5UX0RSUklfQUREUkVTUywKKwkuZF9IT1NUX0lTX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgPQorCQlBUjYzMjBfSE9TVF9JU19TUkNfUklOR19ISUdIX1dBVEVSTUFSS19NQVNLLAorCS5kX0hPU1RfSVNfU1JDX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLID0KKwkJQVI2MzIwX0hPU1RfSVNfU1JDX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLLAorCS5kX0hPU1RfSVNfRFNUX1JJTkdfSElHSF9XQVRFUk1BUktfTUFTSyA9CisJCUFSNjMyMF9IT1NUX0lTX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX01BU0ssCisJLmRfSE9TVF9JU19EU1RfUklOR19MT1dfV0FURVJNQVJLX01BU0sgPQorCQlBUjYzMjBfSE9TVF9JU19EU1RfUklOR19MT1dfV0FURVJNQVJLX01BU0ssCisJLmRfSE9TVF9JU19BRERSRVNTID0gQVI2MzIwX0hPU1RfSVNfQUREUkVTUywKKwkuZF9IT1NUX0lTX0NPUFlfQ09NUExFVEVfTUFTSyA9IEFSNjMyMF9IT1NUX0lTX0NPUFlfQ09NUExFVEVfTUFTSywKKwkuZF9DRV9XUkFQUEVSX0JBU0VfQUREUkVTUyA9IEFSNjMyMF9DRV9XUkFQUEVSX0JBU0VfQUREUkVTUywKKwkuZF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0FERFJFU1MgPQorCQlBUjYzMjBfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9BRERSRVNTLAorCS5kX0hPU1RfSUVfQUREUkVTUyA9IEFSNjMyMF9IT1NUX0lFX0FERFJFU1MsCisJLmRfSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0sgPSBBUjYzMjBfSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0ssCisJLmRfU1JfQkFfQUREUkVTUyA9IEFSNjMyMF9TUl9CQV9BRERSRVNTLAorCS5kX1NSX1NJWkVfQUREUkVTUyA9IEFSNjMyMF9TUl9TSVpFX0FERFJFU1MsCisJLmRfQ0VfQ1RSTDFfQUREUkVTUyA9IEFSNjMyMF9DRV9DVFJMMV9BRERSRVNTLAorCS5kX0NFX0NUUkwxX0RNQVhfTEVOR1RIX01BU0sgPSBBUjYzMjBfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTUFTSywKKwkuZF9EUl9CQV9BRERSRVNTID0gQVI2MzIwX0RSX0JBX0FERFJFU1MsCisJLmRfRFJfU0laRV9BRERSRVNTID0gQVI2MzIwX0RSX1NJWkVfQUREUkVTUywKKwkuZF9NSVNDX0lFX0FERFJFU1MgPSBBUjYzMjBfTUlTQ19JRV9BRERSRVNTLAorCS5kX01JU0NfSVNfQVhJX0VSUl9NQVNLID0gQVI2MzIwX01JU0NfSVNfQVhJX0VSUl9NQVNLLAorCS5kX01JU0NfSVNfRFNUX0FERFJfRVJSX01BU0sgPSBBUjYzMjBfTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSywKKwkuZF9NSVNDX0lTX1NSQ19MRU5fRVJSX01BU0sgPSBBUjYzMjBfTUlTQ19JU19TUkNfTEVOX0VSUl9NQVNLLAorCS5kX01JU0NfSVNfRFNUX01BWF9MRU5fVklPX01BU0sgPSBBUjYzMjBfTUlTQ19JU19EU1RfTUFYX0xFTl9WSU9fTUFTSywKKwkuZF9NSVNDX0lTX0RTVF9SSU5HX09WRVJGTE9XX01BU0sgPQorCQlBUjYzMjBfTUlTQ19JU19EU1RfUklOR19PVkVSRkxPV19NQVNLLAorCS5kX01JU0NfSVNfU1JDX1JJTkdfT1ZFUkZMT1dfTUFTSyA9CisJCUFSNjMyMF9NSVNDX0lTX1NSQ19SSU5HX09WRVJGTE9XX01BU0ssCisJLmRfU1JDX1dBVEVSTUFSS19MT1dfTFNCID0gQVI2MzIwX1NSQ19XQVRFUk1BUktfTE9XX0xTQiwKKwkuZF9TUkNfV0FURVJNQVJLX0hJR0hfTFNCID0gQVI2MzIwX1NSQ19XQVRFUk1BUktfSElHSF9MU0IsCisJLmRfRFNUX1dBVEVSTUFSS19MT1dfTFNCID0gQVI2MzIwX0RTVF9XQVRFUk1BUktfTE9XX0xTQiwKKwkuZF9EU1RfV0FURVJNQVJLX0hJR0hfTFNCID0gQVI2MzIwX0RTVF9XQVRFUk1BUktfSElHSF9MU0IsCisJLmRfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9NQVNLID0KKwkJQVI2MzIwX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTUFTSywKKwkuZF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX0xTQiA9CisJCUFSNjMyMF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX0xTQiwKKwkuZF9DRV9DVFJMMV9ETUFYX0xFTkdUSF9MU0IgPSBBUjYzMjBfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTFNCLAorCS5kX0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9NQVNLID0KKwkJQVI2MzIwX0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9NQVNLLAorCS5kX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9NQVNLID0KKwkJQVI2MzIwX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9NQVNLLAorCS5kX0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9MU0IgPQorCQlBUjYzMjBfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX0xTQiwKKwkuZF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTFNCID0KKwkJQVI2MzIwX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9MU0IsCisJLmRfQ0VfV1JBUFBFUl9ERUJVR19PRkZTRVQgPSBBUjYzMjBfQ0VfV1JBUFBFUl9ERUJVR19PRkZTRVQsCisJLmRfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTVNCID0gQVI2MzIwX0NFX1dSQVBQRVJfREVCVUdfU0VMX01TQiwKKwkuZF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9MU0IgPSBBUjYzMjBfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTFNCLAorCS5kX0NFX1dSQVBQRVJfREVCVUdfU0VMX01BU0sgPSBBUjYzMjBfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTUFTSywKKwkuZF9DRV9ERUJVR19PRkZTRVQgPSBBUjYzMjBfQ0VfREVCVUdfT0ZGU0VULAorCS5kX0NFX0RFQlVHX1NFTF9NU0IgPSBBUjYzMjBfQ0VfREVCVUdfU0VMX01TQiwKKwkuZF9DRV9ERUJVR19TRUxfTFNCID0gQVI2MzIwX0NFX0RFQlVHX1NFTF9MU0IsCisJLmRfQ0VfREVCVUdfU0VMX01BU0sgPSBBUjYzMjBfQ0VfREVCVUdfU0VMX01BU0ssCisJLmRfQ0UwX0JBU0VfQUREUkVTUyA9IEFSNjMyMF9DRTBfQkFTRV9BRERSRVNTLAorCS5kX0NFMV9CQVNFX0FERFJFU1MgPSBBUjYzMjBfQ0UxX0JBU0VfQUREUkVTUywKKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvYXI2MzIwdjJkZWYuaCBiL2NvcmUvaGlmL3NyYy9hcjYzMjB2MmRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiM2I5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hpZi9zcmMvYXI2MzIwdjJkZWYuaApAQCAtMCwwICsxLDgxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQVI2MzIwVjJERUZfSF8KKyNkZWZpbmUgX0FSNjMyMFYyREVGX0hfCisKKy8qIEJhc2UgQWRkcmVzc2VzICovCisjZGVmaW5lIEFSNjMyMFYyX1JUQ19TT0NfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBBUjYzMjBWMl9SVENfV01BQ19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQVI2MzIwVjJfTUFDX0NPRVhfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEFSNjMyMFYyX0JUX0NPRVhfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBBUjYzMjBWMl9TT0NfUENJRV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMzgwMDAKKyNkZWZpbmUgQVI2MzIwVjJfU09DX0NPUkVfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDNhMDAwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fVUFSVF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAwYzAwMAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1NJX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9HUElPX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDA1MDAwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fQU5BTE9HX0lOVEZfQkFTRV9BRERSRVNTICAgICAgICAgICAgMHgwMDAwNjAwMAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX01BQ19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfRUZVU0VfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAweDAwMDI0MDAwCisjZGVmaW5lIEFSNjMyMFYyX0ZQR0FfUkVHX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAzOTAwMAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1VBUlQyX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwNTRjMDAKKyNkZWZpbmUgQVI2MzIwVjJfQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDM0MDAwCisjZGVmaW5lIEFSNjMyMFYyX0NFMF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzNDQwMAorI2RlZmluZSBBUjYzMjBWMl9DRTFfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzQ4MDAKKyNkZWZpbmUgQVI2MzIwVjJfQ0UyX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDM0YzAwCisjZGVmaW5lIEFSNjMyMFYyX0NFM19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzNTAwMAorI2RlZmluZSBBUjYzMjBWMl9DRTRfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzU0MDAKKyNkZWZpbmUgQVI2MzIwVjJfQ0U1X0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDM1ODAwCisjZGVmaW5lIEFSNjMyMFYyX0NFNl9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzNWMwMAorI2RlZmluZSBBUjYzMjBWMl9DRTdfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzYwMDAKKyNkZWZpbmUgQVI2MzIwVjJfREJJX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDNjMDAwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fQU5BTE9HX0lOVEZfUENJRV9CQVNFX0FERFJFU1MgICAgICAgMHgwMDAwNzgwMAorCisjZGVmaW5lIEFSNjMyMFYyX1NDUkFUQ0hfM19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI4CisjZGVmaW5lIEFSNjMyMFYyX1RBUkdfRFJBTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBBUjYzMjBWMl9TT0NfU1lTVEVNX1NMRUVQX09GRlNFVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgQVI2MzIwVjJfU09DX1JFU0VUX0NPTlRST0xfT0ZGU0VUICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSNjMyMFYyX1NPQ19DTE9DS19DT05UUk9MX09GRlNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAyOAorI2RlZmluZSBBUjYzMjBWMl9TT0NfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVI2MzIwVjJfU09DX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fR1BJT19QSU4wX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA2OAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX0dQSU9fUElOMV9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNmMKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9HUElPX1BJTjBfQ09ORklHX01BU0sgICAgICAgICAgICAgICAweDAwMDA3ODAwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fR1BJT19QSU4xX0NPTkZJR19NQVNLICAgICAgICAgICAgICAgMHgwMDAwNzgwMAorI2RlZmluZSBBUjYzMjBWMl9TT0NfQ1BVX0NMT0NLX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQVI2MzIwVjJfU09DX0xQT19DQUxfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMGUwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fR1BJT19QSU4xMF9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDA5MAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX0dQSU9fUElOMTFfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwOTQKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9HUElPX1BJTjEyX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDAwMDk4CisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fR1BJT19QSU4xM19BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDA5YworI2RlZmluZSBBUjYzMjBWMl9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwVjJfU09DX0NQVV9DTE9DS19TVEFOREFSRF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEFSNjMyMFYyX1NPQ19MUE9fQ0FMX0VOQUJMRV9MU0IgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgQVI2MzIwVjJfU09DX0xQT19DQUxfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9MU0IgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1JFU0VUX0NPTlRST0xfQ09MRF9SU1RfTUFTSyAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9SRVNFVF9DT05UUk9MX1dBUk1fUlNUX01BU0sgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFSNjMyMFYyX1NJX0NPTkZJR19CSURJUl9PRF9EQVRBX0xTQiAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVI2MzIwVjJfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTUFTSyAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEFSNjMyMFYyX1NJX0NPTkZJR19JMkNfTFNCICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQVI2MzIwVjJfU0lfQ09ORklHX0kyQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFSNjMyMFYyX1NJX0NPTkZJR19QT1NfU0FNUExFX0xTQiAgICAgICAgICAgICAgICAgNworI2RlZmluZSBBUjYzMjBWMl9TSV9DT05GSUdfUE9TX1NBTVBMRV9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQVI2MzIwVjJfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19MU0IgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFSNjMyMFYyX1NJX0NPTkZJR19JTkFDVElWRV9DTEtfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBUjYzMjBWMl9TSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9MU0IgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVI2MzIwVjJfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSyAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEFSNjMyMFYyX1NJX0NPTkZJR19ESVZJREVSX0xTQiAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9TSV9DT05GSUdfRElWSURFUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgQVI2MzIwVjJfU0lfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSNjMyMFYyX1NJX1RYX0RBVEEwX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBUjYzMjBWMl9TSV9UWF9EQVRBMV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgQVI2MzIwVjJfU0lfUlhfREFUQTBfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFSNjMyMFYyX1NJX1JYX0RBVEExX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNAorI2RlZmluZSBBUjYzMjBWMl9TSV9DU19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVI2MzIwVjJfU0lfQ1NfRE9ORV9FUlJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEFSNjMyMFYyX1NJX0NTX0RPTkVfSU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBBUjYzMjBWMl9TSV9DU19TVEFSVF9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQVI2MzIwVjJfU0lfQ1NfU1RBUlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEFSNjMyMFYyX1NJX0NTX1JYX0NOVF9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBUjYzMjBWMl9TSV9DU19SWF9DTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgQVI2MzIwVjJfU0lfQ1NfVFhfQ05UX0xTQiAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMFYyX1NJX0NTX1RYX0NOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBBUjYzMjBWMl9DRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQVI2MzIwVjJfU1JfV1JfSU5ERVhfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAweDAwM2MKKyNkZWZpbmUgQVI2MzIwVjJfRFNUX1dBVEVSTUFSS19BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwNTAKKyNkZWZpbmUgQVI2MzIwVjJfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX0xTQiAgICAgICAgICAgICAxNAorI2RlZmluZSBBUjYzMjBWMl9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSyAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQVI2MzIwVjJfUlhfTVBEVV9TVEFSVF8wX1JFVFJZX0xTQiAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBBUjYzMjBWMl9SWF9NUERVX1NUQVJUXzBfUkVUUllfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQVI2MzIwVjJfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTFNCICAgICAgICAgICAgICAxNgorI2RlZmluZSBBUjYzMjBWMl9SWF9NUERVX1NUQVJUXzBfU0VRX05VTV9NQVNLICAgICAgICAgICAgIDB4MGZmZjAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMFYyX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9NQVNLICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBBUjYzMjBWMl9SWF9NUERVX1NUQVJUXzJfVElEX0xTQiAgICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIEFSNjMyMFYyX1JYX01QRFVfU1RBUlRfMl9USURfTUFTSyAgICAgICAgICAgICAgICAgMHhmMDAwMDAwMAorI2RlZmluZSBBUjYzMjBWMl9SWF9NU0RVX0VORF8xX0VYVF9XQVBJX1BOXzYzXzQ4X0xTQiAgICAgIDE2CisjZGVmaW5lIEFSNjMyMFYyX1JYX01TRFVfRU5EXzFfRVhUX1dBUElfUE5fNjNfNDhfTUFTSyAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBBUjYzMjBWMl9SWF9NU0RVX0VORF80X0xBU1RfTVNEVV9MU0IgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFSNjMyMFYyX1JYX01TRFVfRU5EXzRfTEFTVF9NU0RVX01BU0sgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBBUjYzMjBWMl9SWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9MU0IgICAgICAgICAgIDIKKyNkZWZpbmUgQVI2MzIwVjJfUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTUFTSyAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFSNjMyMFYyX1JYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX0xTQiAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQVI2MzIwVjJfUlhfQVRURU5USU9OXzBfRlJBR01FTlRfTUFTSyAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFSNjMyMFYyX1JYX0FUVEVOVElPTl8wX01QRFVfTEVOR1RIX0VSUl9NQVNLICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBBUjYzMjBWMl9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX0xTQiAgICAgIDE2CisjZGVmaW5lIEFSNjMyMFYyX1JYX0ZSQUdfSU5GT18wX1JJTkcyX01PUkVfQ09VTlRfTUFTSyAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBBUjYzMjBWMl9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTFNCICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwVjJfUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX01BU0sgICAgICAgICAweDAwMDAzZmZmCisKKyNkZWZpbmUgQVI2MzIwVjJfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9PRkZTRVQgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSNjMyMFYyX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTFNCICAgICAgICAgOAorI2RlZmluZSBBUjYzMjBWMl9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX01BU0sgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgQVI2MzIwVjJfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9MU0IgICAgICAgICAgICAxMworI2RlZmluZSBBUjYzMjBWMl9SWF9NUERVX1NUQVJUXzBfRU5DUllQVEVEX01BU0sgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQVI2MzIwVjJfUlhfQVRURU5USU9OXzBfTU9SRV9EQVRBX01BU0sgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEFSNjMyMFYyX1JYX0FUVEVOVElPTl8wX01TRFVfRE9ORV9NQVNLICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBBUjYzMjBWMl9SWF9BVFRFTlRJT05fMF9UQ1BfVURQX0NIS1NVTV9GQUlMX01BU0sgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfRFNUX1dSX0lOREVYX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgQVI2MzIwVjJfU1JDX1dBVEVSTUFSS19BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwNGMKKyNkZWZpbmUgQVI2MzIwVjJfU1JDX1dBVEVSTUFSS19MT1dfTUFTSyAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEFSNjMyMFYyX1NSQ19XQVRFUk1BUktfSElHSF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBBUjYzMjBWMl9EU1RfV0FURVJNQVJLX0xPV19NQVNLICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfRFNUX1dBVEVSTUFSS19ISUdIX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEFSNjMyMFYyX0NVUlJFTlRfU1JSSV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDQ0CisjZGVmaW5lIEFSNjMyMFYyX0NVUlJFTlRfRFJSSV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDQ4CisjZGVmaW5lIEFSNjMyMFYyX0hPU1RfSVNfU1JDX1JJTkdfSElHSF9XQVRFUk1BUktfTUFTSyAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBUjYzMjBWMl9IT1NUX0lTX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfTUFTSyAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVI2MzIwVjJfSE9TVF9JU19EU1RfUklOR19ISUdIX1dBVEVSTUFSS19NQVNLICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSNjMyMFYyX0hPU1RfSVNfRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBUjYzMjBWMl9IT1NUX0lTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMAorI2RlZmluZSBBUjYzMjBWMl9IT1NUX0lTX0NPUFlfQ09NUExFVEVfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVI2MzIwVjJfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9BRERSRVNTICAgICAweDAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfSE9TVF9JRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMmMKKyNkZWZpbmUgQVI2MzIwVjJfSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFSNjMyMFYyX1NSX0JBX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFSNjMyMFYyX1NSX1NJWkVfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEFSNjMyMFYyX0NFX0NUUkwxX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEFSNjMyMFYyX0NFX0NUUkwxX0RNQVhfTEVOR1RIX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBBUjYzMjBWMl9EUl9CQV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBBUjYzMjBWMl9EUl9TSVpFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwYworI2RlZmluZSBBUjYzMjBWMl9NSVNDX0lFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzNAorI2RlZmluZSBBUjYzMjBWMl9NSVNDX0lTX0FYSV9FUlJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQVI2MzIwVjJfTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEFSNjMyMFYyX01JU0NfSVNfU1JDX0xFTl9FUlJfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBUjYzMjBWMl9NSVNDX0lTX0RTVF9NQVhfTEVOX1ZJT19NQVNLICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQVI2MzIwVjJfTUlTQ19JU19EU1RfUklOR19PVkVSRkxPV19NQVNLICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEFSNjMyMFYyX01JU0NfSVNfU1JDX1JJTkdfT1ZFUkZMT1dfTUFTSyAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBUjYzMjBWMl9TUkNfV0FURVJNQVJLX0xPV19MU0IgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEFSNjMyMFYyX1NSQ19XQVRFUk1BUktfSElHSF9MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9EU1RfV0FURVJNQVJLX0xPV19MU0IgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEFSNjMyMFYyX0RTVF9XQVRFUk1BUktfSElHSF9MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX01BU0sgMHgwMDAwZmYwMAorI2RlZmluZSBBUjYzMjBWMl9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX0xTQiAgOAorI2RlZmluZSBBUjYzMjBWMl9DRV9DVFJMMV9ETUFYX0xFTkdUSF9MU0IgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwVjJfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0sgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFSNjMyMFYyX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9NQVNLICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBBUjYzMjBWMl9DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTFNCICAgICAgIDE2CisjZGVmaW5lIEFSNjMyMFYyX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9MU0IgICAgICAgMTcKKyNkZWZpbmUgQVI2MzIwVjJfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9NQVNLIDB4MDAwMDAwMjAKKyNkZWZpbmUgQVI2MzIwVjJfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9MU0IgIDUKKyNkZWZpbmUgQVI2MzIwVjJfU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgQVI2MzIwVjJfUlRDX1NUQVRFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfUlRDX1NUQVRFX0NPTERfUkVTRVRfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFSNjMyMFYyX1BDSUVfU09DX1dBS0VfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBUjYzMjBWMl9QQ0lFX1NPQ19XQUtFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBBUjYzMjBWMl9QQ0lFX1NPQ19XQUtFX1ZfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVI2MzIwVjJfUlRDX1NUQVRFX1ZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEFSNjMyMFYyX1JUQ19TVEFURV9WX0xTQiAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9SVENfU1RBVEVfVl9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVI2MzIwVjJfTVVYX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfVFJBTlNBQ1RJT05fSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDNmZmYKKyNkZWZpbmUgQVI2MzIwVjJfUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDgwMDAwCisjZGVmaW5lIEFSNjMyMFYyX0ZXX0lORF9FVkVOVF9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUjYzMjBWMl9GV19JTkRfSU5JVElBTElaRUQgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVI2MzIwVjJfRldfSU5EX0hFTFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFSNjMyMFYyX1BDSUVfSU5UUl9FTkFCTEVfQUREUkVTUyAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEFSNjMyMFYyX1BDSUVfSU5UUl9DTFJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDE0CisjZGVmaW5lIEFSNjMyMFYyX1BDSUVfSU5UUl9GSVJNV0FSRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBBUjYzMjBWMl9QQ0lFX0lOVFJfQ0UwX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQVI2MzIwVjJfUENJRV9JTlRSX0NFX01BU0tfQUxMICAgICAgICAgICAgICAgICAgICAweDAwMDdmODAwCisjZGVmaW5lIEFSNjMyMFYyX1BDSUVfSU5UUl9DQVVTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDBjCisjZGVmaW5lIEFSNjMyMFYyX0NQVV9JTlRSX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEFSNjMyMFYyX1NPQ19MRl9USU1FUl9DT05UUk9MMF9BRERSRVNTICAgICAgICAgICAgMHgwMDAwMDA1MAorI2RlZmluZSBBUjYzMjBWMl9TT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVI2MzIwVjJfU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUyAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSNjMyMFYyX1NPQ19SRVNFVF9DT05UUk9MX0NFX1JTVF9NQVNLICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUjYzMjBWMl9TT0NfUkVTRVRfQ09OVFJPTF9DUFVfV0FSTV9SU1RfTUFTSyAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQVI2MzIwVjJfQ09SRV9DVFJMX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfQ09SRV9DVFJMX0NQVV9JTlRSX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFSNjMyMFYyX0xPQ0FMX1NDUkFUQ0hfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBjMAorI2RlZmluZSBBUjYzMjBWMl9DTE9DS19HUElPX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQVI2MzIwVjJfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMFYyX0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9NQVNLICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9TT0NfQ0hJUF9JRF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgQVI2MzIwVjJfU09DX0NISVBfSURfVkVSU0lPTl9NQVNLICAgICAgICAgICAgICAgICAweGZmZmMwMDAwCisjZGVmaW5lIEFSNjMyMFYyX1NPQ19DSElQX0lEX1ZFUlNJT05fTFNCICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVI2MzIwVjJfU09DX0NISVBfSURfUkVWSVNJT05fTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEFSNjMyMFYyX1NPQ19DSElQX0lEX1JFVklTSU9OX0xTQiAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBBUjYzMjBWMl9TT0NfUE9XRVJfUkVHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMGMKKworLyogQ29weSBFbmdpbmUgRGVidWcgKi8KKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9ERUJVR19JTlBVVF9TRUxfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwMTBjCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NU0IgICAgICAgICAgICAgMworI2RlZmluZSBBUjYzMjBWMl9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTFNCICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01BU0sgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fREVCVUdfQ09OVFJPTF9PRkZTRVQgICAgICAgICAgICAgICAgMHgwMDAwMDEwOAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01TQiAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9MU0IgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUjYzMjBWMl9XTEFOX0RFQlVHX09VVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTAKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9ERUJVR19PVVRfREFUQV9NU0IgICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBBUjYzMjBWMl9XTEFOX0RFQlVHX09VVF9EQVRBX0xTQiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9ERUJVR19PVVRfREFUQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMGZmZmZmCisjZGVmaW5lIEFSNjMyMFYyX0FNQkFfREVCVUdfQlVTX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExYworI2RlZmluZSBBUjYzMjBWMl9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NU0IgICAgICAgIDEzCisjZGVmaW5lIEFSNjMyMFYyX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX0xTQiAgICAgICAgOAorI2RlZmluZSBBUjYzMjBWMl9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NQVNLICAgICAgIDB4MDAwMDNmMDAKKyNkZWZpbmUgQVI2MzIwVjJfQU1CQV9ERUJVR19CVVNfU0VMX01TQiAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFSNjMyMFYyX0FNQkFfREVCVUdfQlVTX1NFTF9MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9BTUJBX0RFQlVHX0JVU19TRUxfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgQVI2MzIwVjJfQ0VfV1JBUFBFUl9ERUJVR19PRkZTRVQgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgQVI2MzIwVjJfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTVNCICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEFSNjMyMFYyX0NFX1dSQVBQRVJfREVCVUdfU0VMX0xTQiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9DRV9XUkFQUEVSX0RFQlVHX1NFTF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwM2YKKyNkZWZpbmUgQVI2MzIwVjJfQ0VfREVCVUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTQKKyNkZWZpbmUgQVI2MzIwVjJfQ0VfREVCVUdfU0VMX01TQiAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEFSNjMyMFYyX0NFX0RFQlVHX1NFTF9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9DRV9ERUJVR19TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwM2YKKy8qIEVuZCAqLworCisvKiBQTEwgc3RhcnQgKi8KKyNkZWZpbmUgQVI2MzIwVjJfRUZVU0VfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzJjCisjZGVmaW5lIEFSNjMyMFYyX0VGVVNFX1hUQUxfU0VMX01TQiAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgQVI2MzIwVjJfRUZVU0VfWFRBTF9TRUxfTFNCICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEFSNjMyMFYyX0VGVVNFX1hUQUxfU0VMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBBUjYzMjBWMl9CQl9QTExfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyZjQKKyNkZWZpbmUgQVI2MzIwVjJfQkJfUExMX0NPTkZJR19PVVRESVZfTVNCICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBBUjYzMjBWMl9CQl9QTExfQ09ORklHX09VVERJVl9MU0IgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEFSNjMyMFYyX0JCX1BMTF9DT05GSUdfT1VURElWX01BU0sgICAgICAgICAgICAgICAgMHgwMDFjMDAwMAorI2RlZmluZSBBUjYzMjBWMl9CQl9QTExfQ09ORklHX0ZSQUNfTVNCICAgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIEFSNjMyMFYyX0JCX1BMTF9DT05GSUdfRlJBQ19MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9CQl9QTExfQ09ORklHX0ZSQUNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwM2ZmZmYKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfU0VUVExFX1RJTUVfTVNCICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1BMTF9TRVRUTEVfVElNRV9MU0IgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfU0VUVExFX1RJTUVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwN2ZmCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fUExMX1NFVFRMRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgMHgwMDE4CisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fUExMX1NFVFRMRV9TV19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDdmZgorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1BMTF9TRVRUTEVfUlNUTUFTSyAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfU0VUVExFX1JFU0VUICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTVNCICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9MU0IgICAgICAgICAgICAgICAxOAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX05PUFdEX01BU0sgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTVNCICAgICAgICAgICAgICAxNgorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19MU0IgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01BU0sgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19SRVNFVCAgICAgICAgICAgIDB4MQorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTVNCICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9MU0IgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01BU0sgICAgICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9SRVNFVCAgICAgICAgICAgMHgwCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX01TQiAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTFNCICAgICAgICAgICAgICAxMAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NQVNLICAgICAgICAgICAgIDB4MDAwMDNjMDAKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfUkVTRVQgICAgICAgICAgICAweDAKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9ESVZfTVNCICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfRElWX0xTQiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX0RJVl9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAzZmYKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9ESVZfUkVTRVQgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfT0ZGU0VUICAgICAgICAgICAgICAgICAgMHgwMDE0CisjZGVmaW5lIEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfU1dfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDFmZmZmZgorI2RlZmluZSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX1JTVE1BU0sgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9SRVNFVCAgICAgICAgICAgICAgICAgICAweDAwMDEwMDExCisjZGVmaW5lIEFSNjMyMFYyX1NPQ19DT1JFX0NMS19DVFJMX09GRlNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDExNAorI2RlZmluZSBBUjYzMjBWMl9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTVNCICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVI2MzIwVjJfU09DX0NPUkVfQ0xLX0NUUkxfRElWX0xTQiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNjMyMFYyX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBBUjYzMjBWMl9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX01TQiAgICAgICAgIDUKKyNkZWZpbmUgQVI2MzIwVjJfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19MU0IgICAgICAgICA1CisjZGVmaW5lIEFSNjMyMFYyX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTUFTSyAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBUjYzMjBWMl9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX1JFU0VUICAgICAgIDB4MAorI2RlZmluZSBBUjYzMjBWMl9SVENfU1lOQ19TVEFUVVNfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MDI0NAorI2RlZmluZSBBUjYzMjBWMl9TT0NfQ1BVX0NMT0NLX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQVI2MzIwVjJfU09DX0NQVV9DTE9DS19TVEFOREFSRF9NU0IgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFSNjMyMFYyX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjYzMjBWMl9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKy8qIFBMTCBlbmQgKi8KKworI2RlZmluZSBBUjYzMjBWMl9QQ0lFX0lOVFJfQ0VfTUFTSyhuKSBcCisJKEFSNjMyMFYyX1BDSUVfSU5UUl9DRTBfTUFTSyA8PCAobikpCisjZGVmaW5lIEFSNjMyMFYyX0RSQU1fQkFTRV9BRERSRVNTICAgICAgICAgICAgQVI2MzIwVjJfVEFSR19EUkFNX1NUQVJUCisjZGVmaW5lIEFSNjMyMFYyX0ZXX0lORElDQVRPUl9BRERSRVNTIFwKKwkoQVI2MzIwVjJfU09DX0NPUkVfQkFTRV9BRERSRVNTICsgQVI2MzIwVjJfU0NSQVRDSF8zX0FERFJFU1MpCisjZGVmaW5lIEFSNjMyMFYyX1NZU1RFTV9TTEVFUF9PRkZTRVQgICAgICAgICAgQVI2MzIwVjJfU09DX1NZU1RFTV9TTEVFUF9PRkZTRVQKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9TWVNURU1fU0xFRVBfT0ZGU0VUICAgICAweDAwMmMKKyNkZWZpbmUgQVI2MzIwVjJfV0xBTl9SRVNFVF9DT05UUk9MX09GRlNFVCAgICBBUjYzMjBWMl9TT0NfUkVTRVRfQ09OVFJPTF9PRkZTRVQKKyNkZWZpbmUgQVI2MzIwVjJfQ0xPQ0tfQ09OVFJPTF9PRkZTRVQgICAgICAgICBBUjYzMjBWMl9TT0NfQ0xPQ0tfQ09OVFJPTF9PRkZTRVQKKyNkZWZpbmUgQVI2MzIwVjJfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0sgXAorCUFSNjMyMFYyX1NPQ19DTE9DS19DT05UUk9MX1NJMF9DTEtfTUFTSworI2RlZmluZSBBUjYzMjBWMl9SRVNFVF9DT05UUk9MX01CT1hfUlNUX01BU0sgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVI2MzIwVjJfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0sgXAorCUFSNjMyMFYyX1NPQ19SRVNFVF9DT05UUk9MX1NJMF9SU1RfTUFTSworI2RlZmluZSBBUjYzMjBWMl9HUElPX0JBU0VfQUREUkVTUyAgICAgICAgIEFSNjMyMFYyX1dMQU5fR1BJT19CQVNFX0FERFJFU1MKKyNkZWZpbmUgQVI2MzIwVjJfR1BJT19QSU4wX09GRlNFVCAgICAgICAgICBBUjYzMjBWMl9XTEFOX0dQSU9fUElOMF9BRERSRVNTCisjZGVmaW5lIEFSNjMyMFYyX0dQSU9fUElOMV9PRkZTRVQgICAgICAgICAgQVI2MzIwVjJfV0xBTl9HUElPX1BJTjFfQUREUkVTUworI2RlZmluZSBBUjYzMjBWMl9HUElPX1BJTjBfQ09ORklHX01BU0sgICAgIEFSNjMyMFYyX1dMQU5fR1BJT19QSU4wX0NPTkZJR19NQVNLCisjZGVmaW5lIEFSNjMyMFYyX0dQSU9fUElOMV9DT05GSUdfTUFTSyAgICAgQVI2MzIwVjJfV0xBTl9HUElPX1BJTjFfQ09ORklHX01BU0sKKyNkZWZpbmUgQVI2MzIwVjJfU0lfQkFTRV9BRERSRVNTICAgICAgICAgICAweDAwMDUwMDAwCisjZGVmaW5lIEFSNjMyMFYyX0NQVV9DTE9DS19PRkZTRVQgICAgICAgICAgQVI2MzIwVjJfU09DX0NQVV9DTE9DS19PRkZTRVQKKyNkZWZpbmUgQVI2MzIwVjJfTFBPX0NBTF9PRkZTRVQgICAgICAgICAgICBBUjYzMjBWMl9TT0NfTFBPX0NBTF9PRkZTRVQKKyNkZWZpbmUgQVI2MzIwVjJfR1BJT19QSU4xMF9PRkZTRVQgICAgICAgICBBUjYzMjBWMl9XTEFOX0dQSU9fUElOMTBfQUREUkVTUworI2RlZmluZSBBUjYzMjBWMl9HUElPX1BJTjExX09GRlNFVCAgICAgICAgIEFSNjMyMFYyX1dMQU5fR1BJT19QSU4xMV9BRERSRVNTCisjZGVmaW5lIEFSNjMyMFYyX0dQSU9fUElOMTJfT0ZGU0VUICAgICAgICAgQVI2MzIwVjJfV0xBTl9HUElPX1BJTjEyX0FERFJFU1MKKyNkZWZpbmUgQVI2MzIwVjJfR1BJT19QSU4xM19PRkZTRVQgICAgICAgICBBUjYzMjBWMl9XTEFOX0dQSU9fUElOMTNfQUREUkVTUworI2RlZmluZSBBUjYzMjBWMl9DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCICAgIEFSNjMyMFYyX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCCisjZGVmaW5lIEFSNjMyMFYyX0NQVV9DTE9DS19TVEFOREFSRF9NQVNLICAgQVI2MzIwVjJfU09DX0NQVV9DTE9DS19TVEFOREFSRF9NQVNLCisjZGVmaW5lIEFSNjMyMFYyX0xQT19DQUxfRU5BQkxFX0xTQiAgICAgICAgQVI2MzIwVjJfU09DX0xQT19DQUxfRU5BQkxFX0xTQgorI2RlZmluZSBBUjYzMjBWMl9MUE9fQ0FMX0VOQUJMRV9NQVNLICAgICAgIEFSNjMyMFYyX1NPQ19MUE9fQ0FMX0VOQUJMRV9NQVNLCisjZGVmaW5lIEFSNjMyMFYyX0FOQUxPR19JTlRGX0JBU0VfQUREUkVTUyBcCisJQVI2MzIwVjJfV0xBTl9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MKKyNkZWZpbmUgQVI2MzIwVjJfTUJPWF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTFNCICAgICAgICAgICAgIDcKKyNkZWZpbmUgQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfQ1BVX0xTQiAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfQ1BVX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9MU0IgICAgICAgICAgIDQKKyNkZWZpbmUgQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9NQVNLICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX0xTQiAgICAgICAgIDAKKyNkZWZpbmUgQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX01BU0sgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgQVI2MzIwVjJfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTFNCICAgIDE3CisjZGVmaW5lIEFSNjMyMFYyX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX01BU0sgICAweDAwMDIwMDAwCisjZGVmaW5lIEFSNjMyMFYyX0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTFNCICAgICAxNgorI2RlZmluZSBBUjYzMjBWMl9FUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XX01BU0sgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBUjYzMjBWMl9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IgICAgICAgMjQKKyNkZWZpbmUgQVI2MzIwVjJfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSyAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUyAgICAgICAgICAgICAgIDB4MDgyOAorI2RlZmluZSBBUjYzMjBWMl9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiAgICAgICAgICAgOAorI2RlZmluZSBBUjYzMjBWMl9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX01BU0sgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBBUjYzMjBWMl9IT1NUX0lOVF9TVEFUVVNfQUREUkVTUyAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEFSNjMyMFYyX0NQVV9JTlRfU1RBVFVTX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDA4MDEKKyNkZWZpbmUgQVI2MzIwVjJfRVJST1JfSU5UX1NUQVRVU19BRERSRVNTICAgICAgICAgICAgICAgIDB4MDgwMgorI2RlZmluZSBBUjYzMjBWMl9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9NQVNLICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBBUjYzMjBWMl9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVI2MzIwVjJfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTUFTSyAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQVI2MzIwVjJfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTFNCICAgICAgIDE3CisjZGVmaW5lIEFSNjMyMFYyX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSyAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFSNjMyMFYyX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTFNCICAgICAgICAxNgorI2RlZmluZSBBUjYzMjBWMl9DT1VOVF9ERUNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHgwODQwCisjZGVmaW5lIEFSNjMyMFYyX0hPU1RfSU5UX1NUQVRVU19DUFVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEFSNjMyMFYyX0hPU1RfSU5UX1NUQVRVU19DUFVfTFNCICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIEFSNjMyMFYyX0hPU1RfSU5UX1NUQVRVU19FUlJPUl9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEFSNjMyMFYyX0hPU1RfSU5UX1NUQVRVU19FUlJPUl9MU0IgICAgICAgICAgICAgICA3CisjZGVmaW5lIEFSNjMyMFYyX0hPU1RfSU5UX1NUQVRVU19DT1VOVEVSX01BU0sgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFSNjMyMFYyX0hPU1RfSU5UX1NUQVRVU19DT1VOVEVSX0xTQiAgICAgICAgICAgICA0CisjZGVmaW5lIEFSNjMyMFYyX1JYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTICAgICAgICAgICAgICAweDA4MDUKKyNkZWZpbmUgQVI2MzIwVjJfV0lORE9XX0RBVEFfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MDg3NAorI2RlZmluZSBBUjYzMjBWMl9XSU5ET1dfUkVBRF9BRERSX0FERFJFU1MgICAgICAgICAgICAgICAgMHgwODdjCisjZGVmaW5lIEFSNjMyMFYyX1dJTkRPV19XUklURV9BRERSX0FERFJFU1MgICAgICAgICAgICAgICAweDA4NzgKKworc3RydWN0IHRhcmdldGRlZl9zIGFyNjMyMHYyX3RhcmdldGRlZiA9IHsKKwkuZF9SVENfU09DX0JBU0VfQUREUkVTUyA9IEFSNjMyMFYyX1JUQ19TT0NfQkFTRV9BRERSRVNTLAorCS5kX1JUQ19XTUFDX0JBU0VfQUREUkVTUyA9IEFSNjMyMFYyX1JUQ19XTUFDX0JBU0VfQUREUkVTUywKKwkuZF9TWVNURU1fU0xFRVBfT0ZGU0VUID0gQVI2MzIwVjJfV0xBTl9TWVNURU1fU0xFRVBfT0ZGU0VULAorCS5kX1dMQU5fU1lTVEVNX1NMRUVQX09GRlNFVCA9IEFSNjMyMFYyX1dMQU5fU1lTVEVNX1NMRUVQX09GRlNFVCwKKwkuZF9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX0xTQiA9CisJCUFSNjMyMFYyX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTFNCLAorCS5kX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSyA9CisJCUFSNjMyMFYyX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSywKKwkuZF9DTE9DS19DT05UUk9MX09GRlNFVCA9IEFSNjMyMFYyX0NMT0NLX0NPTlRST0xfT0ZGU0VULAorCS5kX0NMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLID0gQVI2MzIwVjJfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0ssCisJLmRfUkVTRVRfQ09OVFJPTF9PRkZTRVQgPSBBUjYzMjBWMl9TT0NfUkVTRVRfQ09OVFJPTF9PRkZTRVQsCisJLmRfUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9NQVNLID0gQVI2MzIwVjJfUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9NQVNLLAorCS5kX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLID0gQVI2MzIwVjJfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0ssCisJLmRfV0xBTl9SRVNFVF9DT05UUk9MX09GRlNFVCA9IEFSNjMyMFYyX1dMQU5fUkVTRVRfQ09OVFJPTF9PRkZTRVQsCisJLmRfV0xBTl9SRVNFVF9DT05UUk9MX0NPTERfUlNUX01BU0sgPQorCQlBUjYzMjBWMl9XTEFOX1JFU0VUX0NPTlRST0xfQ09MRF9SU1RfTUFTSywKKwkuZF9XTEFOX1JFU0VUX0NPTlRST0xfV0FSTV9SU1RfTUFTSyA9CisJCUFSNjMyMFYyX1dMQU5fUkVTRVRfQ09OVFJPTF9XQVJNX1JTVF9NQVNLLAorCS5kX0dQSU9fQkFTRV9BRERSRVNTID0gQVI2MzIwVjJfR1BJT19CQVNFX0FERFJFU1MsCisJLmRfR1BJT19QSU4wX09GRlNFVCA9IEFSNjMyMFYyX0dQSU9fUElOMF9PRkZTRVQsCisJLmRfR1BJT19QSU4xX09GRlNFVCA9IEFSNjMyMFYyX0dQSU9fUElOMV9PRkZTRVQsCisJLmRfR1BJT19QSU4wX0NPTkZJR19NQVNLID0gQVI2MzIwVjJfR1BJT19QSU4wX0NPTkZJR19NQVNLLAorCS5kX0dQSU9fUElOMV9DT05GSUdfTUFTSyA9IEFSNjMyMFYyX0dQSU9fUElOMV9DT05GSUdfTUFTSywKKwkuZF9TSV9DT05GSUdfQklESVJfT0RfREFUQV9MU0IgPSBBUjYzMjBWMl9TSV9DT05GSUdfQklESVJfT0RfREFUQV9MU0IsCisJLmRfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTUFTSyA9CisJCUFSNjMyMFYyX1NJX0NPTkZJR19CSURJUl9PRF9EQVRBX01BU0ssCisJLmRfU0lfQ09ORklHX0kyQ19MU0IgPSBBUjYzMjBWMl9TSV9DT05GSUdfSTJDX0xTQiwKKwkuZF9TSV9DT05GSUdfSTJDX01BU0sgPSBBUjYzMjBWMl9TSV9DT05GSUdfSTJDX01BU0ssCisJLmRfU0lfQ09ORklHX1BPU19TQU1QTEVfTFNCID0gQVI2MzIwVjJfU0lfQ09ORklHX1BPU19TQU1QTEVfTFNCLAorCS5kX1NJX0NPTkZJR19QT1NfU0FNUExFX01BU0sgPSBBUjYzMjBWMl9TSV9DT05GSUdfUE9TX1NBTVBMRV9NQVNLLAorCS5kX1NJX0NPTkZJR19JTkFDVElWRV9DTEtfTFNCID0gQVI2MzIwVjJfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19MU0IsCisJLmRfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19NQVNLID0gQVI2MzIwVjJfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19NQVNLLAorCS5kX1NJX0NPTkZJR19JTkFDVElWRV9EQVRBX0xTQiA9IEFSNjMyMFYyX1NJX0NPTkZJR19JTkFDVElWRV9EQVRBX0xTQiwKKwkuZF9TSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9NQVNLID0KKwkJQVI2MzIwVjJfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSywKKwkuZF9TSV9DT05GSUdfRElWSURFUl9MU0IgPSBBUjYzMjBWMl9TSV9DT05GSUdfRElWSURFUl9MU0IsCisJLmRfU0lfQ09ORklHX0RJVklERVJfTUFTSyA9IEFSNjMyMFYyX1NJX0NPTkZJR19ESVZJREVSX01BU0ssCisJLmRfU0lfQkFTRV9BRERSRVNTID0gQVI2MzIwVjJfU0lfQkFTRV9BRERSRVNTLAorCS5kX1NJX0NPTkZJR19PRkZTRVQgPSBBUjYzMjBWMl9TSV9DT05GSUdfT0ZGU0VULAorCS5kX1NJX1RYX0RBVEEwX09GRlNFVCA9IEFSNjMyMFYyX1NJX1RYX0RBVEEwX09GRlNFVCwKKwkuZF9TSV9UWF9EQVRBMV9PRkZTRVQgPSBBUjYzMjBWMl9TSV9UWF9EQVRBMV9PRkZTRVQsCisJLmRfU0lfUlhfREFUQTBfT0ZGU0VUID0gQVI2MzIwVjJfU0lfUlhfREFUQTBfT0ZGU0VULAorCS5kX1NJX1JYX0RBVEExX09GRlNFVCA9IEFSNjMyMFYyX1NJX1JYX0RBVEExX09GRlNFVCwKKwkuZF9TSV9DU19PRkZTRVQgPSBBUjYzMjBWMl9TSV9DU19PRkZTRVQsCisJLmRfU0lfQ1NfRE9ORV9FUlJfTUFTSyA9IEFSNjMyMFYyX1NJX0NTX0RPTkVfRVJSX01BU0ssCisJLmRfU0lfQ1NfRE9ORV9JTlRfTUFTSyA9IEFSNjMyMFYyX1NJX0NTX0RPTkVfSU5UX01BU0ssCisJLmRfU0lfQ1NfU1RBUlRfTFNCID0gQVI2MzIwVjJfU0lfQ1NfU1RBUlRfTFNCLAorCS5kX1NJX0NTX1NUQVJUX01BU0sgPSBBUjYzMjBWMl9TSV9DU19TVEFSVF9NQVNLLAorCS5kX1NJX0NTX1JYX0NOVF9MU0IgPSBBUjYzMjBWMl9TSV9DU19SWF9DTlRfTFNCLAorCS5kX1NJX0NTX1JYX0NOVF9NQVNLID0gQVI2MzIwVjJfU0lfQ1NfUlhfQ05UX01BU0ssCisJLmRfU0lfQ1NfVFhfQ05UX0xTQiA9IEFSNjMyMFYyX1NJX0NTX1RYX0NOVF9MU0IsCisJLmRfU0lfQ1NfVFhfQ05UX01BU0sgPSBBUjYzMjBWMl9TSV9DU19UWF9DTlRfTUFTSywKKwkuZF9CT0FSRF9EQVRBX1NaID0gQVI2MzIwX0JPQVJEX0RBVEFfU1osCisJLmRfQk9BUkRfRVhUX0RBVEFfU1ogPSBBUjYzMjBfQk9BUkRfRVhUX0RBVEFfU1osCisJLmRfTUJPWF9CQVNFX0FERFJFU1MgPSBBUjYzMjBWMl9NQk9YX0JBU0VfQUREUkVTUywKKwkuZF9MT0NBTF9TQ1JBVENIX09GRlNFVCA9IEFSNjMyMFYyX0xPQ0FMX1NDUkFUQ0hfT0ZGU0VULAorCS5kX0NQVV9DTE9DS19PRkZTRVQgPSBBUjYzMjBWMl9DUFVfQ0xPQ0tfT0ZGU0VULAorCS5kX0xQT19DQUxfT0ZGU0VUID0gQVI2MzIwVjJfTFBPX0NBTF9PRkZTRVQsCisJLmRfR1BJT19QSU4xMF9PRkZTRVQgPSBBUjYzMjBWMl9HUElPX1BJTjEwX09GRlNFVCwKKwkuZF9HUElPX1BJTjExX09GRlNFVCA9IEFSNjMyMFYyX0dQSU9fUElOMTFfT0ZGU0VULAorCS5kX0dQSU9fUElOMTJfT0ZGU0VUID0gQVI2MzIwVjJfR1BJT19QSU4xMl9PRkZTRVQsCisJLmRfR1BJT19QSU4xM19PRkZTRVQgPSBBUjYzMjBWMl9HUElPX1BJTjEzX09GRlNFVCwKKwkuZF9DTE9DS19HUElPX09GRlNFVCA9IEFSNjMyMFYyX0NMT0NLX0dQSU9fT0ZGU0VULAorCS5kX0NQVV9DTE9DS19TVEFOREFSRF9MU0IgPSBBUjYzMjBWMl9DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCLAorCS5kX0NQVV9DTE9DS19TVEFOREFSRF9NQVNLID0gQVI2MzIwVjJfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0ssCisJLmRfTFBPX0NBTF9FTkFCTEVfTFNCID0gQVI2MzIwVjJfTFBPX0NBTF9FTkFCTEVfTFNCLAorCS5kX0xQT19DQUxfRU5BQkxFX01BU0sgPSBBUjYzMjBWMl9MUE9fQ0FMX0VOQUJMRV9NQVNLLAorCS5kX0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9MU0IgPQorCQlBUjYzMjBWMl9DTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTFNCLAorCS5kX0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9NQVNLID0KKwkJQVI2MzIwVjJfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX01BU0ssCisJLmRfQU5BTE9HX0lOVEZfQkFTRV9BRERSRVNTID0gQVI2MzIwVjJfQU5BTE9HX0lOVEZfQkFTRV9BRERSRVNTLAorCS5kX1dMQU5fTUFDX0JBU0VfQUREUkVTUyA9IEFSNjMyMFYyX1dMQU5fTUFDX0JBU0VfQUREUkVTUywKKwkuZF9GV19JTkRJQ0FUT1JfQUREUkVTUyA9IEFSNjMyMFYyX0ZXX0lORElDQVRPUl9BRERSRVNTLAorCS5kX0RSQU1fQkFTRV9BRERSRVNTID0gQVI2MzIwVjJfRFJBTV9CQVNFX0FERFJFU1MsCisJLmRfU09DX0NPUkVfQkFTRV9BRERSRVNTID0gQVI2MzIwVjJfU09DX0NPUkVfQkFTRV9BRERSRVNTLAorCS5kX0NPUkVfQ1RSTF9BRERSRVNTID0gQVI2MzIwVjJfQ09SRV9DVFJMX0FERFJFU1MsCisJLmRfQ0VfQ09VTlQgPSBBUjYzMjBWMl9DRV9DT1VOVCwKKwkuZF9NU0lfTlVNX1JFUVVFU1QgPSBNU0lfTlVNX1JFUVVFU1QsCisJLmRfTVNJX0FTU0lHTl9GVyA9IE1TSV9BU1NJR05fRlcsCisJLmRfTVNJX0FTU0lHTl9DRV9JTklUSUFMID0gTVNJX0FTU0lHTl9DRV9JTklUSUFMLAorCS5kX1BDSUVfSU5UUl9FTkFCTEVfQUREUkVTUyA9IEFSNjMyMFYyX1BDSUVfSU5UUl9FTkFCTEVfQUREUkVTUywKKwkuZF9QQ0lFX0lOVFJfQ0xSX0FERFJFU1MgPSBBUjYzMjBWMl9QQ0lFX0lOVFJfQ0xSX0FERFJFU1MsCisJLmRfUENJRV9JTlRSX0ZJUk1XQVJFX01BU0sgPSBBUjYzMjBWMl9QQ0lFX0lOVFJfRklSTVdBUkVfTUFTSywKKwkuZF9QQ0lFX0lOVFJfQ0VfTUFTS19BTEwgPSBBUjYzMjBWMl9QQ0lFX0lOVFJfQ0VfTUFTS19BTEwsCisJLmRfQ09SRV9DVFJMX0NQVV9JTlRSX01BU0sgPSBBUjYzMjBWMl9DT1JFX0NUUkxfQ1BVX0lOVFJfTUFTSywKKwkuZF9TUl9XUl9JTkRFWF9BRERSRVNTID0gQVI2MzIwVjJfU1JfV1JfSU5ERVhfQUREUkVTUywKKwkuZF9EU1RfV0FURVJNQVJLX0FERFJFU1MgPSBBUjYzMjBWMl9EU1RfV0FURVJNQVJLX0FERFJFU1MsCisJLyogaHR0X3J4LmMgKi8KKwkuZF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSyA9CisJCUFSNjMyMFYyX1JYX01TRFVfRU5EXzRfRklSU1RfTVNEVV9NQVNLLAorCS5kX1JYX01TRFVfRU5EXzRfRklSU1RfTVNEVV9MU0IgPQorCQlBUjYzMjBWMl9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTFNCLAorICAgIC5kX1JYX01QRFVfU1RBUlRfMF9SRVRSWV9NQVNLID0KKwkJQVI2MzIwVjJfUlhfTVBEVV9TVEFSVF8wX1JFVFJZX01BU0ssCisgICAgLmRfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTUFTSyA9CisJCUFSNjMyMFYyX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX01BU0ssCisJLmRfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTUFTSyA9CisJCUFSNjMyMFYyX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX01BU0ssCisJLmRfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTFNCID0gQVI2MzIwVjJfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTFNCLAorCS5kX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9MU0IgPQorCQlBUjYzMjBWMl9SWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTFNCLAorCS5kX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9NQVNLID0KKwkJQVI2MzIwVjJfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX01BU0ssCisgICAgLmRfUlhfTVBEVV9TVEFSVF8yX1RJRF9MU0IgPQorCQlBUjYzMjBWMl9SWF9NUERVX1NUQVJUXzJfVElEX0xTQiwKKyAgICAuZF9SWF9NUERVX1NUQVJUXzJfVElEX01BU0sgPQorCQlBUjYzMjBWMl9SWF9NUERVX1NUQVJUXzJfVElEX01BU0ssCisJLmRfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9NQVNLID0KKwkJQVI2MzIwVjJfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9NQVNLLAorCS5kX1JYX01TRFVfRU5EXzFfRVhUX1dBUElfUE5fNjNfNDhfTFNCID0KKwkJQVI2MzIwVjJfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0IsCisJLmRfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTUFTSyA9CisJCUFSNjMyMFYyX1JYX01TRFVfRU5EXzRfTEFTVF9NU0RVX01BU0ssCisJLmRfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCID0gQVI2MzIwVjJfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCLAorCS5kX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX01BU0sgPQorCQlBUjYzMjBWMl9SWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9NQVNLLAorCS5kX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX0xTQiA9CisJCUFSNjMyMFYyX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX0xTQiwKKwkuZF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9NQVNLID0KKwkJQVI2MzIwVjJfUlhfQVRURU5USU9OXzBfRlJBR01FTlRfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0IgPSBBUjYzMjBWMl9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0IsCisJLmRfUlhfQVRURU5USU9OXzBfTVBEVV9MRU5HVEhfRVJSX01BU0sgPQorCQlBUjYzMjBWMl9SWF9BVFRFTlRJT05fMF9NUERVX0xFTkdUSF9FUlJfTUFTSywKKwkuZF9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX01BU0sgPQorCQlBUjYzMjBWMl9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX01BU0ssCisJLmRfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9MU0IgPQorCQlBUjYzMjBWMl9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX0xTQiwKKwkuZF9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTUFTSyA9CisJCUFSNjMyMFYyX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9NQVNLLAorCS5kX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9MU0IgPQorCQlBUjYzMjBWMl9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTFNCLAorCS5kX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfT0ZGU0VUID0KKwkJQVI2MzIwVjJfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9PRkZTRVQsCisJLmRfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9NQVNLID0KKwkJQVI2MzIwVjJfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9NQVNLLAorCS5kX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTFNCID0KKwkJQVI2MzIwVjJfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9MU0IsCisJLmRfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9NQVNLID0KKwkJQVI2MzIwVjJfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9NQVNLLAorCS5kX1JYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTFNCID0KKwkJQVI2MzIwVjJfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9MU0IsCisJLmRfUlhfQVRURU5USU9OXzBfTU9SRV9EQVRBX01BU0sgPQorCQlBUjYzMjBWMl9SWF9BVFRFTlRJT05fMF9NT1JFX0RBVEFfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9NU0RVX0RPTkVfTUFTSyA9CisJCUFSNjMyMFYyX1JYX0FUVEVOVElPTl8wX01TRFVfRE9ORV9NQVNLLAorCS5kX1JYX0FUVEVOVElPTl8wX1RDUF9VRFBfQ0hLU1VNX0ZBSUxfTUFTSyA9CisJCUFSNjMyMFYyX1JYX0FUVEVOVElPTl8wX1RDUF9VRFBfQ0hLU1VNX0ZBSUxfTUFTSywKKwkvKiBQTEwgc3RhcnQgKi8KKwkuZF9FRlVTRV9PRkZTRVQgPSBBUjYzMjBWMl9FRlVTRV9PRkZTRVQsCisJLmRfRUZVU0VfWFRBTF9TRUxfTVNCID0gQVI2MzIwVjJfRUZVU0VfWFRBTF9TRUxfTVNCLAorCS5kX0VGVVNFX1hUQUxfU0VMX0xTQiA9IEFSNjMyMFYyX0VGVVNFX1hUQUxfU0VMX0xTQiwKKwkuZF9FRlVTRV9YVEFMX1NFTF9NQVNLID0gQVI2MzIwVjJfRUZVU0VfWFRBTF9TRUxfTUFTSywKKwkuZF9CQl9QTExfQ09ORklHX09GRlNFVCA9IEFSNjMyMFYyX0JCX1BMTF9DT05GSUdfT0ZGU0VULAorCS5kX0JCX1BMTF9DT05GSUdfT1VURElWX01TQiA9IEFSNjMyMFYyX0JCX1BMTF9DT05GSUdfT1VURElWX01TQiwKKwkuZF9CQl9QTExfQ09ORklHX09VVERJVl9MU0IgPSBBUjYzMjBWMl9CQl9QTExfQ09ORklHX09VVERJVl9MU0IsCisJLmRfQkJfUExMX0NPTkZJR19PVVRESVZfTUFTSyA9IEFSNjMyMFYyX0JCX1BMTF9DT05GSUdfT1VURElWX01BU0ssCisJLmRfQkJfUExMX0NPTkZJR19GUkFDX01TQiA9IEFSNjMyMFYyX0JCX1BMTF9DT05GSUdfRlJBQ19NU0IsCisJLmRfQkJfUExMX0NPTkZJR19GUkFDX0xTQiA9IEFSNjMyMFYyX0JCX1BMTF9DT05GSUdfRlJBQ19MU0IsCisJLmRfQkJfUExMX0NPTkZJR19GUkFDX01BU0sgPSBBUjYzMjBWMl9CQl9QTExfQ09ORklHX0ZSQUNfTUFTSywKKwkuZF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NU0IgPSBBUjYzMjBWMl9XTEFOX1BMTF9TRVRUTEVfVElNRV9NU0IsCisJLmRfV0xBTl9QTExfU0VUVExFX1RJTUVfTFNCID0gQVI2MzIwVjJfV0xBTl9QTExfU0VUVExFX1RJTUVfTFNCLAorCS5kX1dMQU5fUExMX1NFVFRMRV9USU1FX01BU0sgPSBBUjYzMjBWMl9XTEFOX1BMTF9TRVRUTEVfVElNRV9NQVNLLAorCS5kX1dMQU5fUExMX1NFVFRMRV9PRkZTRVQgPSBBUjYzMjBWMl9XTEFOX1BMTF9TRVRUTEVfT0ZGU0VULAorCS5kX1dMQU5fUExMX1NFVFRMRV9TV19NQVNLID0gQVI2MzIwVjJfV0xBTl9QTExfU0VUVExFX1NXX01BU0ssCisJLmRfV0xBTl9QTExfU0VUVExFX1JTVE1BU0sgPSBBUjYzMjBWMl9XTEFOX1BMTF9TRVRUTEVfUlNUTUFTSywKKwkuZF9XTEFOX1BMTF9TRVRUTEVfUkVTRVQgPSBBUjYzMjBWMl9XTEFOX1BMTF9TRVRUTEVfUkVTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NU0IgPSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX05PUFdEX01TQiwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX05PUFdEX0xTQiA9IEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTFNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTUFTSyA9IEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTUFTSywKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19NU0IgPSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19NU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTFNCID0gQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTFNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01BU0sgPQorCQlBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19NQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX1JFU0VUID0KKwkJQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfUkVTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01TQiA9CisJCUFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9NU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX0xTQiA9CisJCUFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9MU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01BU0sgPQorCQlBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTUFTSywKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfUkVTRVQgPQorCQlBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfUkVTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTVNCID0gQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTVNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX0xTQiA9IEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX0xTQiwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NQVNLID0KKwkJQVI2MzIwVjJfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTUFTSywKKwkuZF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9SRVNFVCA9CisJCUFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX1JFU0VULAorCS5kX1dMQU5fUExMX0NPTlRST0xfRElWX01TQiA9IEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfRElWX01TQiwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0RJVl9MU0IgPSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX0RJVl9MU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9ESVZfTUFTSyA9IEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfRElWX01BU0ssCisJLmRfV0xBTl9QTExfQ09OVFJPTF9ESVZfUkVTRVQgPSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX0RJVl9SRVNFVCwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX09GRlNFVCA9IEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfT0ZGU0VULAorCS5kX1dMQU5fUExMX0NPTlRST0xfU1dfTUFTSyA9IEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfU1dfTUFTSywKKwkuZF9XTEFOX1BMTF9DT05UUk9MX1JTVE1BU0sgPSBBUjYzMjBWMl9XTEFOX1BMTF9DT05UUk9MX1JTVE1BU0ssCisJLmRfV0xBTl9QTExfQ09OVFJPTF9SRVNFVCA9IEFSNjMyMFYyX1dMQU5fUExMX0NPTlRST0xfUkVTRVQsCisJLmRfU09DX0NPUkVfQ0xLX0NUUkxfT0ZGU0VUID0gQVI2MzIwVjJfU09DX0NPUkVfQ0xLX0NUUkxfT0ZGU0VULAorCS5kX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9NU0IgPSBBUjYzMjBWMl9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTVNCLAorCS5kX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9MU0IgPSBBUjYzMjBWMl9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTFNCLAorCS5kX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9NQVNLID0gQVI2MzIwVjJfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0ssCisJLmRfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NU0IgPQorCQlBUjYzMjBWMl9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX01TQiwKKwkuZF9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX0xTQiA9CisJCUFSNjMyMFYyX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTFNCLAorCS5kX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTUFTSyA9CisJCUFSNjMyMFYyX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTUFTSywKKwkuZF9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX1JFU0VUID0KKwkJQVI2MzIwVjJfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19SRVNFVCwKKwkuZF9SVENfU1lOQ19TVEFUVVNfT0ZGU0VUID0gQVI2MzIwVjJfUlRDX1NZTkNfU1RBVFVTX09GRlNFVCwKKwkuZF9TT0NfQ1BVX0NMT0NLX09GRlNFVCA9IEFSNjMyMFYyX1NPQ19DUFVfQ0xPQ0tfT0ZGU0VULAorCS5kX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTVNCID0gQVI2MzIwVjJfU09DX0NQVV9DTE9DS19TVEFOREFSRF9NU0IsCisJLmRfU09DX0NQVV9DTE9DS19TVEFOREFSRF9MU0IgPSBBUjYzMjBWMl9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiwKKwkuZF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgPSBBUjYzMjBWMl9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0ssCisJLyogUExMIGVuZCAqLworCS5kX1NPQ19QT1dFUl9SRUdfT0ZGU0VUID0gQVI2MzIwVjJfU09DX1BPV0VSX1JFR19PRkZTRVQsCisJLmRfUENJRV9JTlRSX0NBVVNFX0FERFJFU1MgPSBBUjYzMjBWMl9QQ0lFX0lOVFJfQ0FVU0VfQUREUkVTUywKKwkuZF9TT0NfUkVTRVRfQ09OVFJPTF9BRERSRVNTID0gQVI2MzIwVjJfU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUywKKwkuZF9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX01BU0sgPQorCQlBUjYzMjBWMl9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX01BU0ssCisJLmRfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9MU0IgPQorCQlBUjYzMjBWMl9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX0xTQiwKKwkuZF9TT0NfUkVTRVRfQ09OVFJPTF9DRV9SU1RfTUFTSyA9CisJCUFSNjMyMFYyX1NPQ19SRVNFVF9DT05UUk9MX0NFX1JTVF9NQVNLLAorCS5kX1NPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9NQVNLID0KKwkJQVI2MzIwVjJfU09DX1JFU0VUX0NPTlRST0xfQ1BVX1dBUk1fUlNUX01BU0ssCisJLmRfQ1BVX0lOVFJfQUREUkVTUyA9IEFSNjMyMFYyX0NQVV9JTlRSX0FERFJFU1MsCisJLmRfU09DX0xGX1RJTUVSX0NPTlRST0wwX0FERFJFU1MgPQorCQlBUjYzMjBWMl9TT0NfTEZfVElNRVJfQ09OVFJPTDBfQUREUkVTUywKKwkuZF9TT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0sgPQorCQlBUjYzMjBWMl9TT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0ssCisJLyogY2hpcCBpZCBzdGFydCAqLworCS5kX1NPQ19DSElQX0lEX0FERFJFU1MgPSBBUjYzMjBWMl9TT0NfQ0hJUF9JRF9BRERSRVNTLAorCS5kX1NPQ19DSElQX0lEX1ZFUlNJT05fTUFTSyA9IEFSNjMyMFYyX1NPQ19DSElQX0lEX1ZFUlNJT05fTUFTSywKKwkuZF9TT0NfQ0hJUF9JRF9WRVJTSU9OX0xTQiA9IEFSNjMyMFYyX1NPQ19DSElQX0lEX1ZFUlNJT05fTFNCLAorCS5kX1NPQ19DSElQX0lEX1JFVklTSU9OX01BU0sgPSBBUjYzMjBWMl9TT0NfQ0hJUF9JRF9SRVZJU0lPTl9NQVNLLAorCS5kX1NPQ19DSElQX0lEX1JFVklTSU9OX0xTQiA9IEFSNjMyMFYyX1NPQ19DSElQX0lEX1JFVklTSU9OX0xTQiwKKwkvKiBjaGlwIGlkIGVuZCAqLworCisJLmRfV0xBTl9ERUJVR19JTlBVVF9TRUxfT0ZGU0VUID0gQVI2MzIwVjJfV0xBTl9ERUJVR19JTlBVVF9TRUxfT0ZGU0VULAorCS5kX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NU0IgPQorCQlBUjYzMjBWMl9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTVNCLAorCS5kX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19MU0IgPQorCQlBUjYzMjBWMl9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTFNCLAorCS5kX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NQVNLID0KKwkJQVI2MzIwVjJfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01BU0ssCisJLmRfV0xBTl9ERUJVR19DT05UUk9MX09GRlNFVCA9IEFSNjMyMFYyX1dMQU5fREVCVUdfQ09OVFJPTF9PRkZTRVQsCisJLmRfV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9NU0IgPQorCQlBUjYzMjBWMl9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01TQiwKKwkuZF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX0xTQiA9CisJCUFSNjMyMFYyX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTFNCLAorCS5kX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTUFTSyA9CisJCUFSNjMyMFYyX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTUFTSywKKwkuZF9XTEFOX0RFQlVHX09VVF9PRkZTRVQgPSBBUjYzMjBWMl9XTEFOX0RFQlVHX09VVF9PRkZTRVQsCisJLmRfV0xBTl9ERUJVR19PVVRfREFUQV9NU0IgPSBBUjYzMjBWMl9XTEFOX0RFQlVHX09VVF9EQVRBX01TQiwKKwkuZF9XTEFOX0RFQlVHX09VVF9EQVRBX0xTQiA9IEFSNjMyMFYyX1dMQU5fREVCVUdfT1VUX0RBVEFfTFNCLAorCS5kX1dMQU5fREVCVUdfT1VUX0RBVEFfTUFTSyA9IEFSNjMyMFYyX1dMQU5fREVCVUdfT1VUX0RBVEFfTUFTSywKKwkuZF9BTUJBX0RFQlVHX0JVU19PRkZTRVQgPSBBUjYzMjBWMl9BTUJBX0RFQlVHX0JVU19PRkZTRVQsCisJLmRfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTVNCID0KKwkJQVI2MzIwVjJfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTVNCLAorCS5kX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX0xTQiA9CisJCUFSNjMyMFYyX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX0xTQiwKKwkuZF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NQVNLID0KKwkJQVI2MzIwVjJfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTUFTSywKKwkuZF9BTUJBX0RFQlVHX0JVU19TRUxfTVNCID0gQVI2MzIwVjJfQU1CQV9ERUJVR19CVVNfU0VMX01TQiwKKwkuZF9BTUJBX0RFQlVHX0JVU19TRUxfTFNCID0gQVI2MzIwVjJfQU1CQV9ERUJVR19CVVNfU0VMX0xTQiwKKwkuZF9BTUJBX0RFQlVHX0JVU19TRUxfTUFTSyA9IEFSNjMyMFYyX0FNQkFfREVCVUdfQlVTX1NFTF9NQVNLLAorfTsKKworc3RydWN0IGhvc3RkZWZfcyBhcjYzMjB2Ml9ob3N0ZGVmID0geworCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX0xTQiA9IEFSNjMyMFYyX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX0xTQiwKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9NQVNLID0KKwkJQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTUFTSywKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTFNCID0gQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfQ1BVX0xTQiwKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTUFTSyA9IEFSNjMyMFYyX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9NQVNLLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTFNCID0KKwkJQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9MU0IsCisJLmRfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9NQVNLID0KKwkJQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9NQVNLLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9MU0IgPQorCQlBUjYzMjBWMl9JTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEFfTFNCLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9NQVNLID0KKwkJQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX01BU0ssCisJLmRfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTFNCID0KKwkJQVI2MzIwVjJfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTFNCLAorCS5kX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX01BU0sgPQorCQlBUjYzMjBWMl9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19NQVNLLAorCS5kX0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTFNCID0KKwkJQVI2MzIwVjJfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19MU0IsCisJLmRfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19NQVNLID0KKwkJQVI2MzIwVjJfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19NQVNLLAorCS5kX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiA9CisJCUFSNjMyMFYyX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiwKKwkuZF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLID0KKwkJQVI2MzIwVjJfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSywKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9BRERSRVNTID0gQVI2MzIwVjJfSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKKwkuZF9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiA9CisJCUFSNjMyMFYyX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTFNCLAorCS5kX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSyA9CisJCUFSNjMyMFYyX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfQUREUkVTUyA9IEFSNjMyMFYyX0hPU1RfSU5UX1NUQVRVU19BRERSRVNTLAorCS5kX0NQVV9JTlRfU1RBVFVTX0FERFJFU1MgPSBBUjYzMjBWMl9DUFVfSU5UX1NUQVRVU19BRERSRVNTLAorCS5kX0VSUk9SX0lOVF9TVEFUVVNfQUREUkVTUyA9IEFSNjMyMFYyX0VSUk9SX0lOVF9TVEFUVVNfQUREUkVTUywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9NQVNLID0KKwkJQVI2MzIwVjJfRVJST1JfSU5UX1NUQVRVU19XQUtFVVBfTUFTSywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IgPSBBUjYzMjBWMl9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IsCisJLmRfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTUFTSyA9CisJCUFSNjMyMFYyX0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX01BU0ssCisJLmRfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTFNCID0KKwkJQVI2MzIwVjJfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTFNCLAorCS5kX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSyA9CisJCUFSNjMyMFYyX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1RYX09WRVJGTE9XX0xTQiA9CisJCUFSNjMyMFYyX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTFNCLAorCS5kX0NPVU5UX0RFQ19BRERSRVNTID0gQVI2MzIwVjJfQ09VTlRfREVDX0FERFJFU1MsCisJLmRfSE9TVF9JTlRfU1RBVFVTX0NQVV9NQVNLID0gQVI2MzIwVjJfSE9TVF9JTlRfU1RBVFVTX0NQVV9NQVNLLAorCS5kX0hPU1RfSU5UX1NUQVRVU19DUFVfTFNCID0gQVI2MzIwVjJfSE9TVF9JTlRfU1RBVFVTX0NQVV9MU0IsCisJLmRfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX01BU0sgPSBBUjYzMjBWMl9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTFNCID0gQVI2MzIwVjJfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX0xTQiwKKwkuZF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9NQVNLID0KKwkJQVI2MzIwVjJfSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9MU0IgPSBBUjYzMjBWMl9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9MU0IsCisJLmRfUlhfTE9PS0FIRUFEX1ZBTElEX0FERFJFU1MgPSBBUjYzMjBWMl9SWF9MT09LQUhFQURfVkFMSURfQUREUkVTUywKKwkuZF9XSU5ET1dfREFUQV9BRERSRVNTID0gQVI2MzIwVjJfV0lORE9XX0RBVEFfQUREUkVTUywKKwkuZF9XSU5ET1dfUkVBRF9BRERSX0FERFJFU1MgPSBBUjYzMjBWMl9XSU5ET1dfUkVBRF9BRERSX0FERFJFU1MsCisJLmRfV0lORE9XX1dSSVRFX0FERFJfQUREUkVTUyA9IEFSNjMyMFYyX1dJTkRPV19XUklURV9BRERSX0FERFJFU1MsCisJLmRfU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTID0gQVI2MzIwVjJfU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTLAorCS5kX1JUQ19TVEFURV9BRERSRVNTID0gQVI2MzIwVjJfUlRDX1NUQVRFX0FERFJFU1MsCisJLmRfUlRDX1NUQVRFX0NPTERfUkVTRVRfTUFTSyA9IEFSNjMyMFYyX1JUQ19TVEFURV9DT0xEX1JFU0VUX01BU0ssCisJLmRfUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgPSBBUjYzMjBWMl9QQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUywKKwkuZF9QQ0lFX1NPQ19XQUtFX1JFU0VUID0gQVI2MzIwVjJfUENJRV9TT0NfV0FLRV9SRVNFVCwKKwkuZF9QQ0lFX1NPQ19XQUtFX0FERFJFU1MgPSBBUjYzMjBWMl9QQ0lFX1NPQ19XQUtFX0FERFJFU1MsCisJLmRfUENJRV9TT0NfV0FLRV9WX01BU0sgPSBBUjYzMjBWMl9QQ0lFX1NPQ19XQUtFX1ZfTUFTSywKKwkuZF9SVENfU1RBVEVfVl9NQVNLID0gQVI2MzIwVjJfUlRDX1NUQVRFX1ZfTUFTSywKKwkuZF9SVENfU1RBVEVfVl9MU0IgPSBBUjYzMjBWMl9SVENfU1RBVEVfVl9MU0IsCisJLmRfRldfSU5EX0VWRU5UX1BFTkRJTkcgPSBBUjYzMjBWMl9GV19JTkRfRVZFTlRfUEVORElORywKKwkuZF9GV19JTkRfSU5JVElBTElaRUQgPSBBUjYzMjBWMl9GV19JTkRfSU5JVElBTElaRUQsCisJLmRfRldfSU5EX0hFTFBFUiA9IEFSNjMyMFYyX0ZXX0lORF9IRUxQRVIsCisJLmRfUlRDX1NUQVRFX1ZfT04gPSBBUjYzMjBWMl9SVENfU1RBVEVfVl9PTiwKKwkuZF9NVVhfSURfTUFTSyA9IEFSNjMyMFYyX01VWF9JRF9NQVNLLAorCS5kX1RSQU5TQUNUSU9OX0lEX01BU0sgPSBBUjYzMjBWMl9UUkFOU0FDVElPTl9JRF9NQVNLLAorI2lmIGRlZmluZWQoU0RJT18zXzApCisJLmRfSE9TVF9JTlRfU1RBVFVTX01CT1hfREFUQV9NQVNLID0KKwkJQVI2MzIwVjJfSE9TVF9JTlRfU1RBVFVTX01CT1hfREFUQV9NQVNLLAorCS5kX0hPU1RfSU5UX1NUQVRVU19NQk9YX0RBVEFfTFNCID0KKwkJQVI2MzIwVjJfSE9TVF9JTlRfU1RBVFVTX01CT1hfREFUQV9MU0IsCisjZW5kaWYKKwkuZF9QQ0lFX1NPQ19SRFlfU1RBVFVTX0FERFJFU1MgPSBQQ0lFX1NPQ19SRFlfU1RBVFVTX0FERFJFU1MsCisJLmRfUENJRV9TT0NfUkRZX1NUQVRVU19CQVJfTUFTSyA9IFBDSUVfU09DX1JEWV9TVEFUVVNfQkFSX01BU0ssCisJLmRfU09DX1BDSUVfQkFTRV9BRERSRVNTID0gU09DX1BDSUVfQkFTRV9BRERSRVNTLAorCS5kX01TSV9NQUdJQ19BRFJfQUREUkVTUyA9IE1TSV9NQUdJQ19BRFJfQUREUkVTUywKKwkuZF9NU0lfTUFHSUNfQUREUkVTUyA9IE1TSV9NQUdJQ19BRERSRVNTLAorCS5kX0hPU1RfQ0VfQ09VTlQgPSA4LAorCS5kX0VOQUJMRV9NU0kgPSAwLAorfTsKKworc3RydWN0IGNlX3JlZ19kZWYgYXI2MzIwdjJfY2VfdGFyZ2V0ZGVmID0geworCS8qIGNvcHlfZW5naW5lLmMgICovCisJLmRfRFNUX1dSX0lOREVYX0FERFJFU1MgPSBBUjYzMjBWMl9EU1RfV1JfSU5ERVhfQUREUkVTUywKKwkuZF9TUkNfV0FURVJNQVJLX0FERFJFU1MgPSBBUjYzMjBWMl9TUkNfV0FURVJNQVJLX0FERFJFU1MsCisJLmRfU1JDX1dBVEVSTUFSS19MT1dfTUFTSyA9IEFSNjMyMFYyX1NSQ19XQVRFUk1BUktfTE9XX01BU0ssCisJLmRfU1JDX1dBVEVSTUFSS19ISUdIX01BU0sgPSBBUjYzMjBWMl9TUkNfV0FURVJNQVJLX0hJR0hfTUFTSywKKwkuZF9EU1RfV0FURVJNQVJLX0xPV19NQVNLID0gQVI2MzIwVjJfRFNUX1dBVEVSTUFSS19MT1dfTUFTSywKKwkuZF9EU1RfV0FURVJNQVJLX0hJR0hfTUFTSyA9IEFSNjMyMFYyX0RTVF9XQVRFUk1BUktfSElHSF9NQVNLLAorCS5kX0NVUlJFTlRfU1JSSV9BRERSRVNTID0gQVI2MzIwVjJfQ1VSUkVOVF9TUlJJX0FERFJFU1MsCisJLmRfQ1VSUkVOVF9EUlJJX0FERFJFU1MgPSBBUjYzMjBWMl9DVVJSRU5UX0RSUklfQUREUkVTUywKKwkuZF9IT1NUX0lTX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgPQorCQlBUjYzMjBWMl9IT1NUX0lTX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX01BU0ssCisJLmRfSE9TVF9JU19TUkNfUklOR19MT1dfV0FURVJNQVJLX01BU0sgPQorCQlBUjYzMjBWMl9IT1NUX0lTX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfTUFTSywKKwkuZF9IT1NUX0lTX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgPQorCQlBUjYzMjBWMl9IT1NUX0lTX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX01BU0ssCisJLmRfSE9TVF9JU19EU1RfUklOR19MT1dfV0FURVJNQVJLX01BU0sgPQorCQlBUjYzMjBWMl9IT1NUX0lTX0RTVF9SSU5HX0xPV19XQVRFUk1BUktfTUFTSywKKwkuZF9IT1NUX0lTX0FERFJFU1MgPSBBUjYzMjBWMl9IT1NUX0lTX0FERFJFU1MsCisJLmRfSE9TVF9JU19DT1BZX0NPTVBMRVRFX01BU0sgPSBBUjYzMjBWMl9IT1NUX0lTX0NPUFlfQ09NUExFVEVfTUFTSywKKwkuZF9DRV9XUkFQUEVSX0JBU0VfQUREUkVTUyA9IEFSNjMyMFYyX0NFX1dSQVBQRVJfQkFTRV9BRERSRVNTLAorCS5kX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfQUREUkVTUyA9CisJCUFSNjMyMFYyX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfQUREUkVTUywKKwkuZF9IT1NUX0lFX0FERFJFU1MgPSBBUjYzMjBWMl9IT1NUX0lFX0FERFJFU1MsCisJLmRfSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0sgPSBBUjYzMjBWMl9IT1NUX0lFX0NPUFlfQ09NUExFVEVfTUFTSywKKwkuZF9TUl9CQV9BRERSRVNTID0gQVI2MzIwVjJfU1JfQkFfQUREUkVTUywKKwkuZF9TUl9TSVpFX0FERFJFU1MgPSBBUjYzMjBWMl9TUl9TSVpFX0FERFJFU1MsCisJLmRfQ0VfQ1RSTDFfQUREUkVTUyA9IEFSNjMyMFYyX0NFX0NUUkwxX0FERFJFU1MsCisJLmRfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTUFTSyA9IEFSNjMyMFYyX0NFX0NUUkwxX0RNQVhfTEVOR1RIX01BU0ssCisJLmRfRFJfQkFfQUREUkVTUyA9IEFSNjMyMFYyX0RSX0JBX0FERFJFU1MsCisJLmRfRFJfU0laRV9BRERSRVNTID0gQVI2MzIwVjJfRFJfU0laRV9BRERSRVNTLAorCS5kX01JU0NfSUVfQUREUkVTUyA9IEFSNjMyMFYyX01JU0NfSUVfQUREUkVTUywKKwkuZF9NSVNDX0lTX0FYSV9FUlJfTUFTSyA9IEFSNjMyMFYyX01JU0NfSVNfQVhJX0VSUl9NQVNLLAorCS5kX01JU0NfSVNfRFNUX0FERFJfRVJSX01BU0sgPSBBUjYzMjBWMl9NSVNDX0lTX0RTVF9BRERSX0VSUl9NQVNLLAorCS5kX01JU0NfSVNfU1JDX0xFTl9FUlJfTUFTSyA9IEFSNjMyMFYyX01JU0NfSVNfU1JDX0xFTl9FUlJfTUFTSywKKwkuZF9NSVNDX0lTX0RTVF9NQVhfTEVOX1ZJT19NQVNLID0KKwkJQVI2MzIwVjJfTUlTQ19JU19EU1RfTUFYX0xFTl9WSU9fTUFTSywKKwkuZF9NSVNDX0lTX0RTVF9SSU5HX09WRVJGTE9XX01BU0sgPQorCQlBUjYzMjBWMl9NSVNDX0lTX0RTVF9SSU5HX09WRVJGTE9XX01BU0ssCisJLmRfTUlTQ19JU19TUkNfUklOR19PVkVSRkxPV19NQVNLID0KKwkJQVI2MzIwVjJfTUlTQ19JU19TUkNfUklOR19PVkVSRkxPV19NQVNLLAorCS5kX1NSQ19XQVRFUk1BUktfTE9XX0xTQiA9IEFSNjMyMFYyX1NSQ19XQVRFUk1BUktfTE9XX0xTQiwKKwkuZF9TUkNfV0FURVJNQVJLX0hJR0hfTFNCID0gQVI2MzIwVjJfU1JDX1dBVEVSTUFSS19ISUdIX0xTQiwKKwkuZF9EU1RfV0FURVJNQVJLX0xPV19MU0IgPSBBUjYzMjBWMl9EU1RfV0FURVJNQVJLX0xPV19MU0IsCisJLmRfRFNUX1dBVEVSTUFSS19ISUdIX0xTQiA9IEFSNjMyMFYyX0RTVF9XQVRFUk1BUktfSElHSF9MU0IsCisJLmRfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9NQVNLID0KKwkJQVI2MzIwVjJfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9NQVNLLAorCS5kX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTFNCID0KKwkJQVI2MzIwVjJfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9MU0IsCisJLmRfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTFNCID0gQVI2MzIwVjJfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTFNCLAorCS5kX0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9NQVNLID0KKwkJQVI2MzIwVjJfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0ssCisJLmRfQ0VfQ1RSTDFfRFNUX1JJTkdfQllURV9TV0FQX0VOX01BU0sgPQorCQlBUjYzMjBWMl9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTUFTSywKKwkuZF9DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTFNCID0KKwkJQVI2MzIwVjJfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX0xTQiwKKwkuZF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTFNCID0KKwkJQVI2MzIwVjJfQ0VfQ1RSTDFfRFNUX1JJTkdfQllURV9TV0FQX0VOX0xTQiwKKwkuZF9DRV9XUkFQUEVSX0RFQlVHX09GRlNFVCA9IEFSNjMyMFYyX0NFX1dSQVBQRVJfREVCVUdfT0ZGU0VULAorCS5kX0NFX1dSQVBQRVJfREVCVUdfU0VMX01TQiA9IEFSNjMyMFYyX0NFX1dSQVBQRVJfREVCVUdfU0VMX01TQiwKKwkuZF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9MU0IgPSBBUjYzMjBWMl9DRV9XUkFQUEVSX0RFQlVHX1NFTF9MU0IsCisJLmRfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTUFTSyA9IEFSNjMyMFYyX0NFX1dSQVBQRVJfREVCVUdfU0VMX01BU0ssCisJLmRfQ0VfREVCVUdfT0ZGU0VUID0gQVI2MzIwVjJfQ0VfREVCVUdfT0ZGU0VULAorCS5kX0NFX0RFQlVHX1NFTF9NU0IgPSBBUjYzMjBWMl9DRV9ERUJVR19TRUxfTVNCLAorCS5kX0NFX0RFQlVHX1NFTF9MU0IgPSBBUjYzMjBWMl9DRV9ERUJVR19TRUxfTFNCLAorCS5kX0NFX0RFQlVHX1NFTF9NQVNLID0gQVI2MzIwVjJfQ0VfREVCVUdfU0VMX01BU0ssCisJLmRfQ0UwX0JBU0VfQUREUkVTUyA9IEFSNjMyMFYyX0NFMF9CQVNFX0FERFJFU1MsCisJLmRfQ0UxX0JBU0VfQUREUkVTUyA9IEFSNjMyMFYyX0NFMV9CQVNFX0FERFJFU1MsCisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9oaWYvc3JjL2FyOTg4OGRlZi5oIGIvY29yZS9oaWYvc3JjL2FyOTg4OGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOTk4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hpZi9zcmMvYXI5ODg4ZGVmLmgKQEAgLTAsMCArMSw1OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0FSOTg4OERFRl9IXworI2RlZmluZSBBUjk4ODhfX0FSOTg4OERFRl9IXworCisvKiBCYXNlIEFkZHJlc3NlcyAqLworI2RlZmluZSBBUjk4ODhfUlRDX1NPQ19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEFSOTg4OF9SVENfV01BQ19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDUwMDAKKyNkZWZpbmUgQVI5ODg4X01BQ19DT0VYX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwNjAwMAorI2RlZmluZSBBUjk4ODhfQlRfQ09FWF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAwMDA3MDAwCisjZGVmaW5lIEFSOTg4OF9TT0NfUENJRV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQVI5ODg4X1NPQ19DT1JFX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTAwMAorI2RlZmluZSBBUjk4ODhfV0xBTl9VQVJUX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEFSOTg4OF9XTEFOX1NJX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQVI5ODg4X1dMQU5fR1BJT19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAxNDAwMAorI2RlZmluZSBBUjk4ODhfV0xBTl9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MgICAgICAgICAgICAweDAwMDFjMDAwCisjZGVmaW5lIEFSOTg4OF9XTEFOX01BQ19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQVI5ODg4X0VGVVNFX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBBUjk4ODhfRlBHQV9SRUdfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDM5MDAwCisjZGVmaW5lIEFSOTg4OF9XTEFOX1VBUlQyX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwNTRjMDAKKyNkZWZpbmUgQVI5ODg4X0NFX1dSQVBQRVJfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDA1NzAwMAorI2RlZmluZSBBUjk4ODhfQ0UwX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDU3NDAwCisjZGVmaW5lIEFSOTg4OF9DRTFfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNTc4MDAKKyNkZWZpbmUgQVI5ODg4X0NFMl9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA1N2MwMAorI2RlZmluZSBBUjk4ODhfQ0UzX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDU4MDAwCisjZGVmaW5lIEFSOTg4OF9DRTRfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNTg0MDAKKyNkZWZpbmUgQVI5ODg4X0NFNV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA1ODgwMAorI2RlZmluZSBBUjk4ODhfQ0U2X0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDU4YzAwCisjZGVmaW5lIEFSOTg4OF9DRTdfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNTkwMDAKKyNkZWZpbmUgQVI5ODg4X0RCSV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA2MDAwMAorI2RlZmluZSBBUjk4ODhfV0xBTl9BTkFMT0dfSU5URl9QQ0lFX0JBU0VfQUREUkVTUyAgICAgICAweDAwMDZjMDAwCisKKyNkZWZpbmUgQVI5ODg4X1NDUkFUQ0hfM19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIEFSOTg4OF9UQVJHX0RSQU1fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgQVI5ODg4X1NPQ19TWVNURU1fU0xFRVBfT0ZGU0VUICAgICAgICAgICAgICAgICAgMHgwMDAwMDBjNAorI2RlZmluZSBBUjk4ODhfU09DX1JFU0VUX0NPTlRST0xfT0ZGU0VUICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSOTg4OF9TT0NfQ0xPQ0tfQ09OVFJPTF9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjgKKyNkZWZpbmUgQVI5ODg4X1NPQ19DTE9DS19DT05UUk9MX1NJMF9DTEtfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUjk4ODhfU09DX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFSOTg4OF9XTEFOX0dQSU9fQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MDAwMTQwMDAKKyNkZWZpbmUgQVI5ODg4X1dMQU5fR1BJT19QSU4wX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyOAorI2RlZmluZSBBUjk4ODhfV0xBTl9HUElPX1BJTjFfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDJjCisjZGVmaW5lIEFSOTg4OF9XTEFOX0dQSU9fUElOMF9DT05GSUdfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDc4MDAKKyNkZWZpbmUgQVI5ODg4X1dMQU5fR1BJT19QSU4xX0NPTkZJR19NQVNLICAgICAgICAgICAgICAgMHgwMDAwNzgwMAorI2RlZmluZSBBUjk4ODhfV0xBTl9TSV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFSOTg4OF9TT0NfQ1BVX0NMT0NLX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQVI5ODg4X1NPQ19MUE9fQ0FMX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBlMAorI2RlZmluZSBBUjk4ODhfV0xBTl9HUElPX1BJTjEwX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDAwMDUwCisjZGVmaW5lIEFSOTg4OF9XTEFOX0dQSU9fUElOMTFfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTQKKyNkZWZpbmUgQVI5ODg4X1dMQU5fR1BJT19QSU4xMl9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDA1OAorI2RlZmluZSBBUjk4ODhfV0xBTl9HUElPX1BJTjEzX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDAwMDVjCisjZGVmaW5lIEFSOTg4OF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI5ODg4X1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBBUjk4ODhfU09DX0xQT19DQUxfRU5BQkxFX0xTQiAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBBUjk4ODhfU09DX0xQT19DQUxfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEFSOTg4OF9XTEFOX0FOQUxPR19JTlRGX0JBU0VfQUREUkVTUyAgICAgICAgICAgIDB4MDAwMWMwMDAKKworI2RlZmluZSBBUjk4ODhfV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9MU0IgICAgICAgICAgICAwCisjZGVmaW5lIEFSOTg4OF9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVI5ODg4X1dMQU5fUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9NQVNLICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBUjk4ODhfV0xBTl9SRVNFVF9DT05UUk9MX1dBUk1fUlNUX01BU0sgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFSOTg4OF9TSV9DT05GSUdfQklESVJfT0RfREFUQV9MU0IgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEFSOTg4OF9TSV9DT05GSUdfQklESVJfT0RfREFUQV9NQVNLICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQVI5ODg4X1NJX0NPTkZJR19JMkNfTFNCICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQVI5ODg4X1NJX0NPTkZJR19JMkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBUjk4ODhfU0lfQ09ORklHX1BPU19TQU1QTEVfTFNCICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIEFSOTg4OF9TSV9DT05GSUdfUE9TX1NBTVBMRV9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQVI5ODg4X1NJX0NPTkZJR19JTkFDVElWRV9DTEtfTFNCICAgICAgICAgICAgICAgNAorI2RlZmluZSBBUjk4ODhfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19NQVNLICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFSOTg4OF9TSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9MU0IgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVI5ODg4X1NJX0NPTkZJR19JTkFDVElWRV9EQVRBX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBUjk4ODhfU0lfQ09ORklHX0RJVklERVJfTFNCICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSOTg4OF9TSV9DT05GSUdfRElWSURFUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgQVI5ODg4X1NJX0NPTkZJR19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBUjk4ODhfU0lfVFhfREFUQTBfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSOTg4OF9TSV9UWF9EQVRBMV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgQVI5ODg4X1NJX1JYX0RBVEEwX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBUjk4ODhfU0lfUlhfREFUQTFfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0CisjZGVmaW5lIEFSOTg4OF9TSV9DU19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVI5ODg4X1NJX0NTX0RPTkVfRVJSX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBBUjk4ODhfU0lfQ1NfRE9ORV9JTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEFSOTg4OF9TSV9DU19TVEFSVF9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQVI5ODg4X1NJX0NTX1NUQVJUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBUjk4ODhfU0lfQ1NfUlhfQ05UX0xTQiAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFSOTg4OF9TSV9DU19SWF9DTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgQVI5ODg4X1NJX0NTX1RYX0NOVF9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjk4ODhfU0lfQ1NfVFhfQ05UX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEFSOTg4OF9DRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQVI5ODg4X1NSX1dSX0lOREVYX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgMHgwMDNjCisjZGVmaW5lIEFSOTg4OF9EU1RfV0FURVJNQVJLX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDA1MAorI2RlZmluZSBBUjk4ODhfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX0xTQiAgICAgICAgICAgICAxNAorI2RlZmluZSBBUjk4ODhfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX01BU0sgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEFSOTg4OF9SWF9NUERVX1NUQVJUXzBfU0VRX05VTV9MU0IgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEFSOTg4OF9SWF9NUERVX1NUQVJUXzBfU0VRX05VTV9NQVNLICAgICAgICAgICAgIDB4MGZmZjAwMDAKKyNkZWZpbmUgQVI5ODg4X1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9MU0IgICAgICAgICAgICAgMAorI2RlZmluZSBBUjk4ODhfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX01BU0sgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEFSOTg4OF9SWF9NU0RVX0VORF8xX0tFWV9JRF9PQ1RfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgQVI5ODg4X1JYX01TRFVfRU5EXzFfS0VZX0lEX09DVF9MU0IgICAgICAgICAgICAgMAorI2RlZmluZSBBUjk4ODhfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0IgICAgICAxNgorI2RlZmluZSBBUjk4ODhfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9NQVNLICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEFSOTg4OF9SWF9NU0RVX0VORF80X0xBU1RfTVNEVV9MU0IgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFSOTg4OF9SWF9NU0RVX0VORF80X0xBU1RfTVNEVV9NQVNLICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQVI5ODg4X1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX0xTQiAgICAgICAgICAgMgorI2RlZmluZSBBUjk4ODhfUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTUFTSyAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFSOTg4OF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0IgICAgICAgICAgICAgIDEzCisjZGVmaW5lIEFSOTg4OF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9NQVNLICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQVI5ODg4X1JYX0FUVEVOVElPTl8wX01QRFVfTEVOR1RIX0VSUl9NQVNLICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBBUjk4ODhfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9MU0IgICAgICAxNgorI2RlZmluZSBBUjk4ODhfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9NQVNLICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEFSOTg4OF9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTFNCICAgICAgICAgIDAKKyNkZWZpbmUgQVI5ODg4X1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9NQVNLICAgICAgICAgMHgwMDAwM2ZmZgorI2RlZmluZSBBUjk4ODhfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9PRkZTRVQgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSOTg4OF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX0xTQiAgICAgICAgIDgKKyNkZWZpbmUgQVI5ODg4X1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTUFTSyAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBBUjk4ODhfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9MU0IgICAgICAgICAgICAxMworI2RlZmluZSBBUjk4ODhfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9NQVNLICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFSOTg4OF9SWF9BVFRFTlRJT05fMF9NT1JFX0RBVEFfTUFTSyAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQVI5ODg4X1JYX0FUVEVOVElPTl8wX01TRFVfRE9ORV9NQVNLICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBBUjk4ODhfUlhfQVRURU5USU9OXzBfVENQX1VEUF9DSEtTVU1fRkFJTF9NQVNLICAweDAwMDQwMDAwCisjZGVmaW5lIEFSOTg4OF9EU1RfV1JfSU5ERVhfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBBUjk4ODhfU1JDX1dBVEVSTUFSS19BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwNGMKKyNkZWZpbmUgQVI5ODg4X1NSQ19XQVRFUk1BUktfTE9XX01BU0sgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBBUjk4ODhfU1JDX1dBVEVSTUFSS19ISUdIX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEFSOTg4OF9EU1RfV0FURVJNQVJLX0xPV19NQVNLICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgQVI5ODg4X0RTVF9XQVRFUk1BUktfSElHSF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBBUjk4ODhfQ1VSUkVOVF9TUlJJX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAwNDQKKyNkZWZpbmUgQVI5ODg4X0NVUlJFTlRfRFJSSV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDQ4CisjZGVmaW5lIEFSOTg4OF9IT1NUX0lTX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQVI5ODg4X0hPU1RfSVNfU1JDX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBUjk4ODhfSE9TVF9JU19EU1RfUklOR19ISUdIX1dBVEVSTUFSS19NQVNLICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSOTg4OF9IT1NUX0lTX0RTVF9SSU5HX0xPV19XQVRFUk1BUktfTUFTSyAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQVI5ODg4X0hPU1RfSVNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIEFSOTg4OF9IT1NUX0lTX0NPUFlfQ09NUExFVEVfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVI5ODg4X0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfQUREUkVTUyAgICAgMHgwMDAwCisjZGVmaW5lIEFSOTg4OF9IT1NUX0lFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyYworI2RlZmluZSBBUjk4ODhfSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFSOTg4OF9TUl9CQV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBBUjk4ODhfU1JfU0laRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQVI5ODg4X0NFX0NUUkwxX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEFSOTg4OF9DRV9DVFJMMV9ETUFYX0xFTkdUSF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgQVI5ODg4X0RSX0JBX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEFSOTg4OF9EUl9TSVpFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwYworI2RlZmluZSBBUjk4ODhfTUlTQ19JRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzQKKyNkZWZpbmUgQVI5ODg4X01JU0NfSVNfQVhJX0VSUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBBUjk4ODhfTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEFSOTg4OF9NSVNDX0lTX1NSQ19MRU5fRVJSX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQVI5ODg4X01JU0NfSVNfRFNUX01BWF9MRU5fVklPX01BU0sgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBUjk4ODhfTUlTQ19JU19EU1RfUklOR19PVkVSRkxPV19NQVNLICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEFSOTg4OF9NSVNDX0lTX1NSQ19SSU5HX09WRVJGTE9XX01BU0sgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQVI5ODg4X1NSQ19XQVRFUk1BUktfTE9XX0xTQiAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQVI5ODg4X1NSQ19XQVRFUk1BUktfSElHSF9MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjk4ODhfRFNUX1dBVEVSTUFSS19MT1dfTFNCICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBBUjk4ODhfRFNUX1dBVEVSTUFSS19ISUdIX0xTQiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSOTg4OF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX01BU0sgMHgwMDAwZmYwMAorI2RlZmluZSBBUjk4ODhfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9MU0IgIDgKKyNkZWZpbmUgQVI5ODg4X0NFX0NUUkwxX0RNQVhfTEVOR1RIX0xTQiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjk4ODhfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0sgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFSOTg4OF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTUFTSyAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQVI5ODg4X0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9MU0IgICAgICAgMTYKKyNkZWZpbmUgQVI5ODg4X0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9MU0IgICAgICAgMTcKKyNkZWZpbmUgQVI5ODg4X1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTUFTSyAweDAwMDAwMDA0CisjZGVmaW5lIEFSOTg4OF9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX0xTQiAgMgorI2RlZmluZSBBUjk4ODhfU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgQVI5ODg4X1JUQ19TVEFURV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFSOTg4OF9SVENfU1RBVEVfQ09MRF9SRVNFVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQVI5ODg4X1BDSUVfU09DX1dBS0VfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBUjk4ODhfUENJRV9TT0NfV0FLRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQVI5ODg4X1BDSUVfU09DX1dBS0VfVl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUjk4ODhfUlRDX1NUQVRFX1ZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEFSOTg4OF9SVENfU1RBVEVfVl9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI5ODg4X1JUQ19TVEFURV9WX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUjk4ODhfTVVYX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVI5ODg4X1RSQU5TQUNUSU9OX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgzZmZmCisjZGVmaW5lIEFSOTg4OF9QQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4ODAwMDAKKyNkZWZpbmUgQVI5ODg4X0ZXX0lORF9FVkVOVF9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUjk4ODhfRldfSU5EX0lOSVRJQUxJWkVEICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFSOTg4OF9QQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBBUjk4ODhfUENJRV9JTlRSX0NMUl9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMTQKKyNkZWZpbmUgQVI5ODg4X1BDSUVfSU5UUl9GSVJNV0FSRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBBUjk4ODhfUENJRV9JTlRSX0NFMF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEFSOTg4OF9QQ0lFX0lOVFJfQ0VfTUFTS19BTEwgICAgICAgICAgICAgICAgICAgIDB4MDAwN2Y4MDAKKyNkZWZpbmUgQVI5ODg4X1BDSUVfSU5UUl9DQVVTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDBjCisjZGVmaW5lIEFSOTg4OF9DUFVfSU5UUl9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBBUjk4ODhfU09DX0xGX1RJTUVSX0NPTlRST0wwX0FERFJFU1MgICAgICAgICAgICAweDAwMDAwMDUwCisjZGVmaW5lIEFSOTg4OF9TT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVI5ODg4X1NPQ19SRVNFVF9DT05UUk9MX0FERFJFU1MgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBUjk4ODhfU09DX1JFU0VUX0NPTlRST0xfQ0VfUlNUX01BU0sgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEFSOTg4OF9TT0NfUkVTRVRfQ09OVFJPTF9DUFVfV0FSTV9SU1RfTUFTSyAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQVI5ODg4X0NPUkVfQ1RSTF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFSOTg4OF9DT1JFX0NUUkxfQ1BVX0lOVFJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQVI5ODg4X0xPQ0FMX1NDUkFUQ0hfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBBUjk4ODhfQ0xPQ0tfR1BJT19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEFSOTg4OF9DTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTFNCICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI5ODg4X0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9NQVNLICAgICAgICAgICAgMAorCisjZGVmaW5lIEFSOTg4OF9QQ0lFX0lOVFJfQ0VfTUFTSyhuKSAoQVI5ODg4X1BDSUVfSU5UUl9DRTBfTUFTSyA8PCAobikpCisjZGVmaW5lIEFSOTg4OF9GV19FVkVOVF9QRU5ESU5HX0FERFJFU1MgXAorCShBUjk4ODhfU09DX0NPUkVfQkFTRV9BRERSRVNTICsgQVI5ODg4X1NDUkFUQ0hfM19BRERSRVNTKQorI2RlZmluZSBBUjk4ODhfRFJBTV9CQVNFX0FERFJFU1MgQVI5ODg4X1RBUkdfRFJBTV9TVEFSVAorI2RlZmluZSBBUjk4ODhfRldfSU5ESUNBVE9SX0FERFJFU1MgXAorCShBUjk4ODhfU09DX0NPUkVfQkFTRV9BRERSRVNTICsgQVI5ODg4X1NDUkFUQ0hfM19BRERSRVNTKQorI2RlZmluZSBBUjk4ODhfU1lTVEVNX1NMRUVQX09GRlNFVCAgICAgICAgQVI5ODg4X1NPQ19TWVNURU1fU0xFRVBfT0ZGU0VUCisjZGVmaW5lIEFSOTg4OF9XTEFOX1NZU1RFTV9TTEVFUF9PRkZTRVQgICBBUjk4ODhfU09DX1NZU1RFTV9TTEVFUF9PRkZTRVQKKyNkZWZpbmUgQVI5ODg4X1dMQU5fUkVTRVRfQ09OVFJPTF9PRkZTRVQgIEFSOTg4OF9TT0NfUkVTRVRfQ09OVFJPTF9PRkZTRVQKKyNkZWZpbmUgQVI5ODg4X0NMT0NLX0NPTlRST0xfT0ZGU0VUICAgICAgIEFSOTg4OF9TT0NfQ0xPQ0tfQ09OVFJPTF9PRkZTRVQKKyNkZWZpbmUgQVI5ODg4X0NMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLIEFSOTg4OF9TT0NfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0sKKyNkZWZpbmUgQVI5ODg4X1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfTUFTSyBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9SRVNFVF9DT05UUk9MX1NJMF9SU1RfTUFTSyBBUjk4ODhfU09DX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLCisjZGVmaW5lIEFSOTg4OF9HUElPX0JBU0VfQUREUkVTUyAgICAgICAgICBBUjk4ODhfV0xBTl9HUElPX0JBU0VfQUREUkVTUworI2RlZmluZSBBUjk4ODhfR1BJT19QSU4wX09GRlNFVCAgICAgICAgICAgQVI5ODg4X1dMQU5fR1BJT19QSU4wX0FERFJFU1MKKyNkZWZpbmUgQVI5ODg4X0dQSU9fUElOMV9PRkZTRVQgICAgICAgICAgIEFSOTg4OF9XTEFOX0dQSU9fUElOMV9BRERSRVNTCisjZGVmaW5lIEFSOTg4OF9HUElPX1BJTjBfQ09ORklHX01BU0sgICAgICBBUjk4ODhfV0xBTl9HUElPX1BJTjBfQ09ORklHX01BU0sKKyNkZWZpbmUgQVI5ODg4X0dQSU9fUElOMV9DT05GSUdfTUFTSyAgICAgIEFSOTg4OF9XTEFOX0dQSU9fUElOMV9DT05GSUdfTUFTSworI2RlZmluZSBBUjk4ODhfU0lfQkFTRV9BRERSRVNTICAgICAgICAgICAgQVI5ODg4X1dMQU5fU0lfQkFTRV9BRERSRVNTCisjZGVmaW5lIEFSOTg4OF9TQ1JBVENIX0JBU0VfQUREUkVTUyAgICAgICBBUjk4ODhfU09DX0NPUkVfQkFTRV9BRERSRVNTCisjZGVmaW5lIEFSOTg4OF9DUFVfQ0xPQ0tfT0ZGU0VUICAgICAgICAgICBBUjk4ODhfU09DX0NQVV9DTE9DS19PRkZTRVQKKyNkZWZpbmUgQVI5ODg4X0xQT19DQUxfT0ZGU0VUICAgICAgICAgICAgIEFSOTg4OF9TT0NfTFBPX0NBTF9PRkZTRVQKKyNkZWZpbmUgQVI5ODg4X0dQSU9fUElOMTBfT0ZGU0VUICAgICAgICAgIEFSOTg4OF9XTEFOX0dQSU9fUElOMTBfQUREUkVTUworI2RlZmluZSBBUjk4ODhfR1BJT19QSU4xMV9PRkZTRVQgICAgICAgICAgQVI5ODg4X1dMQU5fR1BJT19QSU4xMV9BRERSRVNTCisjZGVmaW5lIEFSOTg4OF9HUElPX1BJTjEyX09GRlNFVCAgICAgICAgICBBUjk4ODhfV0xBTl9HUElPX1BJTjEyX0FERFJFU1MKKyNkZWZpbmUgQVI5ODg4X0dQSU9fUElOMTNfT0ZGU0VUICAgICAgICAgIEFSOTg4OF9XTEFOX0dQSU9fUElOMTNfQUREUkVTUworI2RlZmluZSBBUjk4ODhfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiAgICAgQVI5ODg4X1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCCisjZGVmaW5lIEFSOTg4OF9DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSyAgICBBUjk4ODhfU09DX0NQVV9DTE9DS19TVEFOREFSRF9NQVNLCisjZGVmaW5lIEFSOTg4OF9MUE9fQ0FMX0VOQUJMRV9MU0IgICAgICAgICBBUjk4ODhfU09DX0xQT19DQUxfRU5BQkxFX0xTQgorI2RlZmluZSBBUjk4ODhfTFBPX0NBTF9FTkFCTEVfTUFTSyAgICAgICAgQVI5ODg4X1NPQ19MUE9fQ0FMX0VOQUJMRV9NQVNLCisjZGVmaW5lIEFSOTg4OF9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MgICBBUjk4ODhfV0xBTl9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MKKyNkZWZpbmUgQVI5ODg4X01CT1hfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9JTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9MU0IgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTUFTSyAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9MU0IgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTUFTSyAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9MU0IgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0lOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTUFTSyAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9JTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEFfTFNCICAgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX01BU0sgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX0xTQiAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19NQVNLICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19MU0IgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTUFTSyAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSyAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0lOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1MgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0hPU1RfSU5UX1NUQVRVU19BRERSRVNTICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9DUFVfSU5UX1NUQVRVU19BRERSRVNTICAgICAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfRVJST1JfSU5UX1NUQVRVU19BRERSRVNTICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX01BU0sgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTUFTSyAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX0xTQiAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9FUlJPUl9JTlRfU1RBVFVTX1RYX09WRVJGTE9XX01BU0sgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPV19MU0IgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0NPVU5UX0RFQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9IT1NUX0lOVF9TVEFUVVNfQ1BVX01BU0sgICAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfSE9TVF9JTlRfU1RBVFVTX0NQVV9MU0IgICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0hPU1RfSU5UX1NUQVRVU19FUlJPUl9NQVNLICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTFNCICAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTUFTSyAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X0hPU1RfSU5UX1NUQVRVU19DT1VOVEVSX0xTQiAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9SWF9MT09LQUhFQURfVkFMSURfQUREUkVTUyAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBBUjk4ODhfV0lORE9XX0RBVEFfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgQVI5ODg4X1dJTkRPV19SRUFEX0FERFJfQUREUkVTUyAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIEFSOTg4OF9XSU5ET1dfV1JJVEVfQUREUl9BRERSRVNTICAgICAgICAgICAgICAgTUlTU0lORworCitzdHJ1Y3QgdGFyZ2V0ZGVmX3MgYXI5ODg4X3RhcmdldGRlZiA9IHsKKwkuZF9SVENfU09DX0JBU0VfQUREUkVTUyA9IEFSOTg4OF9SVENfU09DX0JBU0VfQUREUkVTUywKKwkuZF9SVENfV01BQ19CQVNFX0FERFJFU1MgPSBBUjk4ODhfUlRDX1dNQUNfQkFTRV9BRERSRVNTLAorCS5kX1NZU1RFTV9TTEVFUF9PRkZTRVQgPSBBUjk4ODhfV0xBTl9TWVNURU1fU0xFRVBfT0ZGU0VULAorCS5kX1dMQU5fU1lTVEVNX1NMRUVQX09GRlNFVCA9IEFSOTg4OF9XTEFOX1NZU1RFTV9TTEVFUF9PRkZTRVQsCisJLmRfV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9MU0IgPQorCQlBUjk4ODhfV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9MU0IsCisJLmRfV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9NQVNLID0KKwkJQVI5ODg4X1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSywKKwkuZF9DTE9DS19DT05UUk9MX09GRlNFVCA9IEFSOTg4OF9DTE9DS19DT05UUk9MX09GRlNFVCwKKwkuZF9DTE9DS19DT05UUk9MX1NJMF9DTEtfTUFTSyA9IEFSOTg4OF9DTE9DS19DT05UUk9MX1NJMF9DTEtfTUFTSywKKwkuZF9SRVNFVF9DT05UUk9MX09GRlNFVCA9IEFSOTg4OF9TT0NfUkVTRVRfQ09OVFJPTF9PRkZTRVQsCisJLmRfUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9NQVNLID0gQVI5ODg4X1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfTUFTSywKKwkuZF9SRVNFVF9DT05UUk9MX1NJMF9SU1RfTUFTSyA9IEFSOTg4OF9SRVNFVF9DT05UUk9MX1NJMF9SU1RfTUFTSywKKwkuZF9XTEFOX1JFU0VUX0NPTlRST0xfT0ZGU0VUID0gQVI5ODg4X1dMQU5fUkVTRVRfQ09OVFJPTF9PRkZTRVQsCisJLmRfV0xBTl9SRVNFVF9DT05UUk9MX0NPTERfUlNUX01BU0sgPQorCQlBUjk4ODhfV0xBTl9SRVNFVF9DT05UUk9MX0NPTERfUlNUX01BU0ssCisJLmRfV0xBTl9SRVNFVF9DT05UUk9MX1dBUk1fUlNUX01BU0sgPQorCQlBUjk4ODhfV0xBTl9SRVNFVF9DT05UUk9MX1dBUk1fUlNUX01BU0ssCisJLmRfR1BJT19CQVNFX0FERFJFU1MgPSBBUjk4ODhfR1BJT19CQVNFX0FERFJFU1MsCisJLmRfR1BJT19QSU4wX09GRlNFVCA9IEFSOTg4OF9HUElPX1BJTjBfT0ZGU0VULAorCS5kX0dQSU9fUElOMV9PRkZTRVQgPSBBUjk4ODhfR1BJT19QSU4xX09GRlNFVCwKKwkuZF9HUElPX1BJTjBfQ09ORklHX01BU0sgPSBBUjk4ODhfR1BJT19QSU4wX0NPTkZJR19NQVNLLAorCS5kX0dQSU9fUElOMV9DT05GSUdfTUFTSyA9IEFSOTg4OF9HUElPX1BJTjFfQ09ORklHX01BU0ssCisJLmRfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTFNCID0gQVI5ODg4X1NJX0NPTkZJR19CSURJUl9PRF9EQVRBX0xTQiwKKwkuZF9TSV9DT05GSUdfQklESVJfT0RfREFUQV9NQVNLID0gQVI5ODg4X1NJX0NPTkZJR19CSURJUl9PRF9EQVRBX01BU0ssCisJLmRfU0lfQ09ORklHX0kyQ19MU0IgPSBBUjk4ODhfU0lfQ09ORklHX0kyQ19MU0IsCisJLmRfU0lfQ09ORklHX0kyQ19NQVNLID0gQVI5ODg4X1NJX0NPTkZJR19JMkNfTUFTSywKKwkuZF9TSV9DT05GSUdfUE9TX1NBTVBMRV9MU0IgPSBBUjk4ODhfU0lfQ09ORklHX1BPU19TQU1QTEVfTFNCLAorCS5kX1NJX0NPTkZJR19QT1NfU0FNUExFX01BU0sgPSBBUjk4ODhfU0lfQ09ORklHX1BPU19TQU1QTEVfTUFTSywKKwkuZF9TSV9DT05GSUdfSU5BQ1RJVkVfQ0xLX0xTQiA9IEFSOTg4OF9TSV9DT05GSUdfSU5BQ1RJVkVfQ0xLX0xTQiwKKwkuZF9TSV9DT05GSUdfSU5BQ1RJVkVfQ0xLX01BU0sgPSBBUjk4ODhfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19NQVNLLAorCS5kX1NJX0NPTkZJR19JTkFDVElWRV9EQVRBX0xTQiA9IEFSOTg4OF9TSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9MU0IsCisJLmRfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSyA9IEFSOTg4OF9TSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9NQVNLLAorCS5kX1NJX0NPTkZJR19ESVZJREVSX0xTQiA9IEFSOTg4OF9TSV9DT05GSUdfRElWSURFUl9MU0IsCisJLmRfU0lfQ09ORklHX0RJVklERVJfTUFTSyA9IEFSOTg4OF9TSV9DT05GSUdfRElWSURFUl9NQVNLLAorCS5kX1NJX0JBU0VfQUREUkVTUyA9IEFSOTg4OF9TSV9CQVNFX0FERFJFU1MsCisJLmRfU0lfQ09ORklHX09GRlNFVCA9IEFSOTg4OF9TSV9DT05GSUdfT0ZGU0VULAorCS5kX1NJX1RYX0RBVEEwX09GRlNFVCA9IEFSOTg4OF9TSV9UWF9EQVRBMF9PRkZTRVQsCisJLmRfU0lfVFhfREFUQTFfT0ZGU0VUID0gQVI5ODg4X1NJX1RYX0RBVEExX09GRlNFVCwKKwkuZF9TSV9SWF9EQVRBMF9PRkZTRVQgPSBBUjk4ODhfU0lfUlhfREFUQTBfT0ZGU0VULAorCS5kX1NJX1JYX0RBVEExX09GRlNFVCA9IEFSOTg4OF9TSV9SWF9EQVRBMV9PRkZTRVQsCisJLmRfU0lfQ1NfT0ZGU0VUID0gQVI5ODg4X1NJX0NTX09GRlNFVCwKKwkuZF9TSV9DU19ET05FX0VSUl9NQVNLID0gQVI5ODg4X1NJX0NTX0RPTkVfRVJSX01BU0ssCisJLmRfU0lfQ1NfRE9ORV9JTlRfTUFTSyA9IEFSOTg4OF9TSV9DU19ET05FX0lOVF9NQVNLLAorCS5kX1NJX0NTX1NUQVJUX0xTQiA9IEFSOTg4OF9TSV9DU19TVEFSVF9MU0IsCisJLmRfU0lfQ1NfU1RBUlRfTUFTSyA9IEFSOTg4OF9TSV9DU19TVEFSVF9NQVNLLAorCS5kX1NJX0NTX1JYX0NOVF9MU0IgPSBBUjk4ODhfU0lfQ1NfUlhfQ05UX0xTQiwKKwkuZF9TSV9DU19SWF9DTlRfTUFTSyA9IEFSOTg4OF9TSV9DU19SWF9DTlRfTUFTSywKKwkuZF9TSV9DU19UWF9DTlRfTFNCID0gQVI5ODg4X1NJX0NTX1RYX0NOVF9MU0IsCisJLmRfU0lfQ1NfVFhfQ05UX01BU0sgPSBBUjk4ODhfU0lfQ1NfVFhfQ05UX01BU0ssCisJLmRfQk9BUkRfREFUQV9TWiA9IEFSOTg4OF9CT0FSRF9EQVRBX1NaLAorCS5kX0JPQVJEX0VYVF9EQVRBX1NaID0gQVI5ODg4X0JPQVJEX0VYVF9EQVRBX1NaLAorCS5kX01CT1hfQkFTRV9BRERSRVNTID0gQVI5ODg4X01CT1hfQkFTRV9BRERSRVNTLAorCS5kX0xPQ0FMX1NDUkFUQ0hfT0ZGU0VUID0gQVI5ODg4X0xPQ0FMX1NDUkFUQ0hfT0ZGU0VULAorCS5kX0NQVV9DTE9DS19PRkZTRVQgPSBBUjk4ODhfQ1BVX0NMT0NLX09GRlNFVCwKKwkuZF9MUE9fQ0FMX09GRlNFVCA9IEFSOTg4OF9MUE9fQ0FMX09GRlNFVCwKKwkuZF9HUElPX1BJTjEwX09GRlNFVCA9IEFSOTg4OF9HUElPX1BJTjEwX09GRlNFVCwKKwkuZF9HUElPX1BJTjExX09GRlNFVCA9IEFSOTg4OF9HUElPX1BJTjExX09GRlNFVCwKKwkuZF9HUElPX1BJTjEyX09GRlNFVCA9IEFSOTg4OF9HUElPX1BJTjEyX09GRlNFVCwKKwkuZF9HUElPX1BJTjEzX09GRlNFVCA9IEFSOTg4OF9HUElPX1BJTjEzX09GRlNFVCwKKwkuZF9DTE9DS19HUElPX09GRlNFVCA9IEFSOTg4OF9DTE9DS19HUElPX09GRlNFVCwKKwkuZF9DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCID0gQVI5ODg4X0NQVV9DTE9DS19TVEFOREFSRF9MU0IsCisJLmRfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgPSBBUjk4ODhfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0ssCisJLmRfTFBPX0NBTF9FTkFCTEVfTFNCID0gQVI5ODg4X0xQT19DQUxfRU5BQkxFX0xTQiwKKwkuZF9MUE9fQ0FMX0VOQUJMRV9NQVNLID0gQVI5ODg4X0xQT19DQUxfRU5BQkxFX01BU0ssCisJLmRfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQiA9IEFSOTg4OF9DTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTFNCLAorCS5kX0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9NQVNLID0KKwkJQVI5ODg4X0NMT0NLX0dQSU9fQlRfQ0xLX09VVF9FTl9NQVNLLAorCS5kX0FOQUxPR19JTlRGX0JBU0VfQUREUkVTUyA9IEFSOTg4OF9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MsCisJLmRfV0xBTl9NQUNfQkFTRV9BRERSRVNTID0gQVI5ODg4X1dMQU5fTUFDX0JBU0VfQUREUkVTUywKKwkuZF9GV19JTkRJQ0FUT1JfQUREUkVTUyA9IEFSOTg4OF9GV19JTkRJQ0FUT1JfQUREUkVTUywKKwkuZF9EUkFNX0JBU0VfQUREUkVTUyA9IEFSOTg4OF9EUkFNX0JBU0VfQUREUkVTUywKKwkuZF9TT0NfQ09SRV9CQVNFX0FERFJFU1MgPSBBUjk4ODhfU09DX0NPUkVfQkFTRV9BRERSRVNTLAorCS5kX0NPUkVfQ1RSTF9BRERSRVNTID0gQVI5ODg4X0NPUkVfQ1RSTF9BRERSRVNTLAorCS5kX0NFX0NPVU5UID0gQVI5ODg4X0NFX0NPVU5ULAorCS5kX01TSV9OVU1fUkVRVUVTVCA9IE1TSV9OVU1fUkVRVUVTVCwKKwkuZF9NU0lfQVNTSUdOX0ZXID0gTVNJX0FTU0lHTl9GVywKKwkuZF9NU0lfQVNTSUdOX0NFX0lOSVRJQUwgPSBNU0lfQVNTSUdOX0NFX0lOSVRJQUwsCisJLmRfUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTID0gQVI5ODg4X1BDSUVfSU5UUl9FTkFCTEVfQUREUkVTUywKKwkuZF9QQ0lFX0lOVFJfQ0xSX0FERFJFU1MgPSBBUjk4ODhfUENJRV9JTlRSX0NMUl9BRERSRVNTLAorCS5kX1BDSUVfSU5UUl9GSVJNV0FSRV9NQVNLID0gQVI5ODg4X1BDSUVfSU5UUl9GSVJNV0FSRV9NQVNLLAorCS5kX1BDSUVfSU5UUl9DRV9NQVNLX0FMTCA9IEFSOTg4OF9QQ0lFX0lOVFJfQ0VfTUFTS19BTEwsCisJLmRfQ09SRV9DVFJMX0NQVV9JTlRSX01BU0sgPSBBUjk4ODhfQ09SRV9DVFJMX0NQVV9JTlRSX01BU0ssCisJLmRfU1JfV1JfSU5ERVhfQUREUkVTUyA9IEFSOTg4OF9TUl9XUl9JTkRFWF9BRERSRVNTLAorCS5kX0RTVF9XQVRFUk1BUktfQUREUkVTUyA9IEFSOTg4OF9EU1RfV0FURVJNQVJLX0FERFJFU1MsCisJLyogaHR0X3J4LmMgKi8KKwkuZF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSyA9CisJCUFSOTg4OF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSywKKwkuZF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTFNCID0gQVI5ODg4X1JYX01TRFVfRU5EXzRfRklSU1RfTVNEVV9MU0IsCisJLmRfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTUFTSyA9IEFSOTg4OF9SWF9NUERVX1NUQVJUXzBfU0VRX05VTV9NQVNLLAorCS5kX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX0xTQiA9IEFSOTg4OF9SWF9NUERVX1NUQVJUXzBfU0VRX05VTV9MU0IsCisJLmRfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX0xTQiA9IEFSOTg4OF9SWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTFNCLAorCS5kX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9NQVNLID0KKwkJQVI5ODg4X1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9NQVNLLAorCS5kX1JYX01TRFVfRU5EXzFfRVhUX1dBUElfUE5fNjNfNDhfTUFTSyA9CisJCUFSOTg4OF9SWF9NU0RVX0VORF8xX0VYVF9XQVBJX1BOXzYzXzQ4X01BU0ssCisJLmRfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0IgPQorCQlBUjk4ODhfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0IsCisJLmRfUlhfTVNEVV9FTkRfMV9LRVlfSURfT0NUX01BU0sgPQorCQlBUjk4ODhfUlhfTVNEVV9FTkRfMV9LRVlfSURfT0NUX01BU0ssCisJLmRfUlhfTVNEVV9FTkRfMV9LRVlfSURfT0NUX0xTQiA9IEFSOTg4OF9SWF9NU0RVX0VORF8xX0tFWV9JRF9PQ1RfTFNCLAorCS5kX1JYX01TRFVfRU5EXzRfTEFTVF9NU0RVX01BU0sgPSBBUjk4ODhfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTUFTSywKKwkuZF9SWF9NU0RVX0VORF80X0xBU1RfTVNEVV9MU0IgPSBBUjk4ODhfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCLAorCS5kX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX01BU0sgPQorCQlBUjk4ODhfUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9MU0IgPQorCQlBUjk4ODhfUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTFNCLAorCS5kX1JYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX01BU0sgPSBBUjk4ODhfUlhfQVRURU5USU9OXzBfRlJBR01FTlRfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0IgPSBBUjk4ODhfUlhfQVRURU5USU9OXzBfRlJBR01FTlRfTFNCLAorCS5kX1JYX0FUVEVOVElPTl8wX01QRFVfTEVOR1RIX0VSUl9NQVNLID0KKwkJQVI5ODg4X1JYX0FUVEVOVElPTl8wX01QRFVfTEVOR1RIX0VSUl9NQVNLLAorCS5kX1JYX0ZSQUdfSU5GT18wX1JJTkcyX01PUkVfQ09VTlRfTUFTSyA9CisJCUFSOTg4OF9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX01BU0ssCisJLmRfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9MU0IgPQorCQlBUjk4ODhfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9MU0IsCisJLmRfUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX01BU0sgPQorCQlBUjk4ODhfUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX01BU0ssCisJLmRfUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX0xTQiA9CisJCUFSOTg4OF9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTFNCLAorCS5kX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfT0ZGU0VUID0KKwkJQVI5ODg4X1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfT0ZGU0VULAorCS5kX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTUFTSyA9CisJCUFSOTg4OF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX01BU0ssCisJLmRfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9MU0IgPQorCQlBUjk4ODhfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9MU0IsCisJLmRfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9NQVNLID0KKwkJQVI5ODg4X1JYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTUFTSywKKwkuZF9SWF9NUERVX1NUQVJUXzBfRU5DUllQVEVEX0xTQiA9CisJCUFSOTg4OF9SWF9NUERVX1NUQVJUXzBfRU5DUllQVEVEX0xTQiwKKwkuZF9SWF9BVFRFTlRJT05fMF9NT1JFX0RBVEFfTUFTSyA9CisJCUFSOTg4OF9SWF9BVFRFTlRJT05fMF9NT1JFX0RBVEFfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9NU0RVX0RPTkVfTUFTSyA9CisJCUFSOTg4OF9SWF9BVFRFTlRJT05fMF9NU0RVX0RPTkVfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9UQ1BfVURQX0NIS1NVTV9GQUlMX01BU0sgPQorCQlBUjk4ODhfUlhfQVRURU5USU9OXzBfVENQX1VEUF9DSEtTVU1fRkFJTF9NQVNLLAorCisJLmRfUENJRV9JTlRSX0NBVVNFX0FERFJFU1MgPSBBUjk4ODhfUENJRV9JTlRSX0NBVVNFX0FERFJFU1MsCisJLmRfU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUyA9IEFSOTg4OF9TT0NfUkVTRVRfQ09OVFJPTF9BRERSRVNTLAorCS5kX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTUFTSyA9CisJCUFSOTg4OF9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX01BU0ssCisJLmRfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9MU0IgPQorCQlBUjk4ODhfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9MU0IsCisJLmRfU09DX1JFU0VUX0NPTlRST0xfQ0VfUlNUX01BU0sgPQorCQlBUjk4ODhfU09DX1JFU0VUX0NPTlRST0xfQ0VfUlNUX01BU0ssCisJLmRfU09DX1JFU0VUX0NPTlRST0xfQ1BVX1dBUk1fUlNUX01BU0sgPQorCQlBUjk4ODhfU09DX1JFU0VUX0NPTlRST0xfQ1BVX1dBUk1fUlNUX01BU0ssCisJLmRfQ1BVX0lOVFJfQUREUkVTUyA9IEFSOTg4OF9DUFVfSU5UUl9BRERSRVNTLAorCS5kX1NPQ19MRl9USU1FUl9DT05UUk9MMF9BRERSRVNTID0KKwkJQVI5ODg4X1NPQ19MRl9USU1FUl9DT05UUk9MMF9BRERSRVNTLAorCS5kX1NPQ19MRl9USU1FUl9DT05UUk9MMF9FTkFCTEVfTUFTSyA9CisJCUFSOTg4OF9TT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0ssCit9OworCitzdHJ1Y3QgaG9zdGRlZl9zIGFyOTg4OF9ob3N0ZGVmID0geworCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX0xTQiA9IEFSOTg4OF9JTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9MU0IsCisJLmRfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTUFTSyA9IEFSOTg4OF9JTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9NQVNLLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9MU0IgPSBBUjk4ODhfSU5UX1NUQVRVU19FTkFCTEVfQ1BVX0xTQiwKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTUFTSyA9IEFSOTg4OF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTUFTSywKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9DT1VOVEVSX0xTQiA9CisJCUFSOTg4OF9JTlRfU1RBVFVTX0VOQUJMRV9DT1VOVEVSX0xTQiwKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9DT1VOVEVSX01BU0sgPQorCQlBUjk4ODhfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9NQVNLLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9MU0IgPQorCQlBUjk4ODhfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX0xTQiwKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEFfTUFTSyA9CisJCUFSOTg4OF9JTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEFfTUFTSywKKwkuZF9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19MU0IgPQorCQlBUjk4ODhfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTFNCLAorCS5kX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX01BU0sgPQorCQlBUjk4ODhfRVJST1JfU1RBVFVTX0VOQUJMRV9SWF9VTkRFUkZMT1dfTUFTSywKKwkuZF9FUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XX0xTQiA9CisJCUFSOTg4OF9FUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XX0xTQiwKKwkuZF9FUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XX01BU0sgPQorCQlBUjk4ODhfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19NQVNLLAorCS5kX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiA9CisJCUFSOTg4OF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IsCisJLmRfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSyA9CisJCUFSOTg4OF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1MgPSBBUjk4ODhfSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKKwkuZF9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiA9CisJCUFSOTg4OF9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiwKKwkuZF9DUFVfSU5UX1NUQVRVU19FTkFCTEVfQklUX01BU0sgPQorCQlBUjk4ODhfQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLLAorCS5kX0hPU1RfSU5UX1NUQVRVU19BRERSRVNTID0gQVI5ODg4X0hPU1RfSU5UX1NUQVRVU19BRERSRVNTLAorCS5kX0NQVV9JTlRfU1RBVFVTX0FERFJFU1MgPSBBUjk4ODhfQ1BVX0lOVF9TVEFUVVNfQUREUkVTUywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX0FERFJFU1MgPSBBUjk4ODhfRVJST1JfSU5UX1NUQVRVU19BRERSRVNTLAorCS5kX0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX01BU0sgPSBBUjk4ODhfRVJST1JfSU5UX1NUQVRVU19XQUtFVVBfTUFTSywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IgPSBBUjk4ODhfRVJST1JfSU5UX1NUQVRVU19XQUtFVVBfTFNCLAorCS5kX0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX01BU0sgPQorCQlBUjk4ODhfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTUFTSywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPV19MU0IgPQorCQlBUjk4ODhfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTFNCLAorCS5kX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSyA9CisJCUFSOTg4OF9FUlJPUl9JTlRfU1RBVFVTX1RYX09WRVJGTE9XX01BU0ssCisJLmRfRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPV19MU0IgPQorCQlBUjk4ODhfRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPV19MU0IsCisJLmRfQ09VTlRfREVDX0FERFJFU1MgPSBBUjk4ODhfQ09VTlRfREVDX0FERFJFU1MsCisJLmRfSE9TVF9JTlRfU1RBVFVTX0NQVV9NQVNLID0gQVI5ODg4X0hPU1RfSU5UX1NUQVRVU19DUFVfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfQ1BVX0xTQiA9IEFSOTg4OF9IT1NUX0lOVF9TVEFUVVNfQ1BVX0xTQiwKKwkuZF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTUFTSyA9IEFSOTg4OF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTFNCID0gQVI5ODg4X0hPU1RfSU5UX1NUQVRVU19FUlJPUl9MU0IsCisJLmRfSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTUFTSyA9IEFSOTg4OF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9NQVNLLAorCS5kX0hPU1RfSU5UX1NUQVRVU19DT1VOVEVSX0xTQiA9IEFSOTg4OF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9MU0IsCisJLmRfUlhfTE9PS0FIRUFEX1ZBTElEX0FERFJFU1MgPSBBUjk4ODhfUlhfTE9PS0FIRUFEX1ZBTElEX0FERFJFU1MsCisJLmRfV0lORE9XX0RBVEFfQUREUkVTUyA9IEFSOTg4OF9XSU5ET1dfREFUQV9BRERSRVNTLAorCS5kX1dJTkRPV19SRUFEX0FERFJfQUREUkVTUyA9IEFSOTg4OF9XSU5ET1dfUkVBRF9BRERSX0FERFJFU1MsCisJLmRfV0lORE9XX1dSSVRFX0FERFJfQUREUkVTUyA9IEFSOTg4OF9XSU5ET1dfV1JJVEVfQUREUl9BRERSRVNTLAorCS5kX1NPQ19HTE9CQUxfUkVTRVRfQUREUkVTUyA9IEFSOTg4OF9TT0NfR0xPQkFMX1JFU0VUX0FERFJFU1MsCisJLmRfUlRDX1NUQVRFX0FERFJFU1MgPSBBUjk4ODhfUlRDX1NUQVRFX0FERFJFU1MsCisJLmRfUlRDX1NUQVRFX0NPTERfUkVTRVRfTUFTSyA9IEFSOTg4OF9SVENfU1RBVEVfQ09MRF9SRVNFVF9NQVNLLAorCS5kX1BDSUVfTE9DQUxfQkFTRV9BRERSRVNTID0gQVI5ODg4X1BDSUVfTE9DQUxfQkFTRV9BRERSRVNTLAorCS5kX1BDSUVfU09DX1dBS0VfUkVTRVQgPSBBUjk4ODhfUENJRV9TT0NfV0FLRV9SRVNFVCwKKwkuZF9QQ0lFX1NPQ19XQUtFX0FERFJFU1MgPSBBUjk4ODhfUENJRV9TT0NfV0FLRV9BRERSRVNTLAorCS5kX1BDSUVfU09DX1dBS0VfVl9NQVNLID0gQVI5ODg4X1BDSUVfU09DX1dBS0VfVl9NQVNLLAorCS5kX1JUQ19TVEFURV9WX01BU0sgPSBBUjk4ODhfUlRDX1NUQVRFX1ZfTUFTSywKKwkuZF9SVENfU1RBVEVfVl9MU0IgPSBBUjk4ODhfUlRDX1NUQVRFX1ZfTFNCLAorCS5kX0ZXX0lORF9FVkVOVF9QRU5ESU5HID0gQVI5ODg4X0ZXX0lORF9FVkVOVF9QRU5ESU5HLAorCS5kX0ZXX0lORF9JTklUSUFMSVpFRCA9IEFSOTg4OF9GV19JTkRfSU5JVElBTElaRUQsCisJLmRfUlRDX1NUQVRFX1ZfT04gPSBBUjk4ODhfUlRDX1NUQVRFX1ZfT04sCisJLmRfTVVYX0lEX01BU0sgPSBBUjk4ODhfTVVYX0lEX01BU0ssCisJLmRfVFJBTlNBQ1RJT05fSURfTUFTSyA9IEFSOTg4OF9UUkFOU0FDVElPTl9JRF9NQVNLLAorI2lmIGRlZmluZWQoU0RJT18zXzApCisJLmRfSE9TVF9JTlRfU1RBVFVTX01CT1hfREFUQV9NQVNLID0KKwkJQVI5ODg4X0hPU1RfSU5UX1NUQVRVU19NQk9YX0RBVEFfTUFTSywKKwkuZF9IT1NUX0lOVF9TVEFUVVNfTUJPWF9EQVRBX0xTQiA9CisJCUFSOTg4OF9IT1NUX0lOVF9TVEFUVVNfTUJPWF9EQVRBX0xTQiwKKyNlbmRpZgorCS5kX1BDSUVfU09DX1JEWV9TVEFUVVNfQUREUkVTUyA9IFBDSUVfU09DX1JEWV9TVEFUVVNfQUREUkVTUywKKwkuZF9QQ0lFX1NPQ19SRFlfU1RBVFVTX0JBUl9NQVNLID0gUENJRV9TT0NfUkRZX1NUQVRVU19CQVJfTUFTSywKKwkuZF9TT0NfUENJRV9CQVNFX0FERFJFU1MgPSBTT0NfUENJRV9CQVNFX0FERFJFU1MsCisJLmRfTVNJX01BR0lDX0FEUl9BRERSRVNTID0gTVNJX01BR0lDX0FEUl9BRERSRVNTLAorCS5kX01TSV9NQUdJQ19BRERSRVNTID0gTVNJX01BR0lDX0FERFJFU1MsCisJLmRfSE9TVF9DRV9DT1VOVCA9IDgsCisJLmRfRU5BQkxFX01TSSA9IDAsCit9OworCisKK3N0cnVjdCBjZV9yZWdfZGVmIGFyOTg4OF9jZV90YXJnZXRkZWYgPSB7CisJLyogY29weV9lbmdpbmUuYyAgKi8KKwkuZF9EU1RfV1JfSU5ERVhfQUREUkVTUyA9IEFSOTg4OF9EU1RfV1JfSU5ERVhfQUREUkVTUywKKwkuZF9TUkNfV0FURVJNQVJLX0FERFJFU1MgPSBBUjk4ODhfU1JDX1dBVEVSTUFSS19BRERSRVNTLAorCS5kX1NSQ19XQVRFUk1BUktfTE9XX01BU0sgPSBBUjk4ODhfU1JDX1dBVEVSTUFSS19MT1dfTUFTSywKKwkuZF9TUkNfV0FURVJNQVJLX0hJR0hfTUFTSyA9IEFSOTg4OF9TUkNfV0FURVJNQVJLX0hJR0hfTUFTSywKKwkuZF9EU1RfV0FURVJNQVJLX0xPV19NQVNLID0gQVI5ODg4X0RTVF9XQVRFUk1BUktfTE9XX01BU0ssCisJLmRfRFNUX1dBVEVSTUFSS19ISUdIX01BU0sgPSBBUjk4ODhfRFNUX1dBVEVSTUFSS19ISUdIX01BU0ssCisJLmRfQ1VSUkVOVF9TUlJJX0FERFJFU1MgPSBBUjk4ODhfQ1VSUkVOVF9TUlJJX0FERFJFU1MsCisJLmRfQ1VSUkVOVF9EUlJJX0FERFJFU1MgPSBBUjk4ODhfQ1VSUkVOVF9EUlJJX0FERFJFU1MsCisJLmRfSE9TVF9JU19TUkNfUklOR19ISUdIX1dBVEVSTUFSS19NQVNLID0KKwkJQVI5ODg4X0hPU1RfSVNfU1JDX1JJTkdfSElHSF9XQVRFUk1BUktfTUFTSywKKwkuZF9IT1NUX0lTX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfTUFTSyA9CisJCUFSOTg4OF9IT1NUX0lTX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfTUFTSywKKwkuZF9IT1NUX0lTX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgPQorCQlBUjk4ODhfSE9TVF9JU19EU1RfUklOR19ISUdIX1dBVEVSTUFSS19NQVNLLAorCS5kX0hPU1RfSVNfRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLID0KKwkJQVI5ODg4X0hPU1RfSVNfRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLLAorCS5kX0hPU1RfSVNfQUREUkVTUyA9IEFSOTg4OF9IT1NUX0lTX0FERFJFU1MsCisJLmRfSE9TVF9JU19DT1BZX0NPTVBMRVRFX01BU0sgPSBBUjk4ODhfSE9TVF9JU19DT1BZX0NPTVBMRVRFX01BU0ssCisJLmRfQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MgPSBBUjk4ODhfQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MsCisJLmRfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9BRERSRVNTID0KKwkJQVI5ODg4X0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfQUREUkVTUywKKwkuZF9IT1NUX0lFX0FERFJFU1MgPSBBUjk4ODhfSE9TVF9JRV9BRERSRVNTLAorCS5kX0hPU1RfSUVfQ09QWV9DT01QTEVURV9NQVNLID0gQVI5ODg4X0hPU1RfSUVfQ09QWV9DT01QTEVURV9NQVNLLAorCS5kX1NSX0JBX0FERFJFU1MgPSBBUjk4ODhfU1JfQkFfQUREUkVTUywKKwkuZF9TUl9TSVpFX0FERFJFU1MgPSBBUjk4ODhfU1JfU0laRV9BRERSRVNTLAorCS5kX0NFX0NUUkwxX0FERFJFU1MgPSBBUjk4ODhfQ0VfQ1RSTDFfQUREUkVTUywKKwkuZF9DRV9DVFJMMV9ETUFYX0xFTkdUSF9NQVNLID0gQVI5ODg4X0NFX0NUUkwxX0RNQVhfTEVOR1RIX01BU0ssCisJLmRfRFJfQkFfQUREUkVTUyA9IEFSOTg4OF9EUl9CQV9BRERSRVNTLAorCS5kX0RSX1NJWkVfQUREUkVTUyA9IEFSOTg4OF9EUl9TSVpFX0FERFJFU1MsCisJLmRfTUlTQ19JRV9BRERSRVNTID0gQVI5ODg4X01JU0NfSUVfQUREUkVTUywKKwkuZF9NSVNDX0lTX0FYSV9FUlJfTUFTSyA9IEFSOTg4OF9NSVNDX0lTX0FYSV9FUlJfTUFTSywKKwkuZF9NSVNDX0lTX0RTVF9BRERSX0VSUl9NQVNLID0gQVI5ODg4X01JU0NfSVNfRFNUX0FERFJfRVJSX01BU0ssCisJLmRfTUlTQ19JU19TUkNfTEVOX0VSUl9NQVNLID0gQVI5ODg4X01JU0NfSVNfU1JDX0xFTl9FUlJfTUFTSywKKwkuZF9NSVNDX0lTX0RTVF9NQVhfTEVOX1ZJT19NQVNLID0gQVI5ODg4X01JU0NfSVNfRFNUX01BWF9MRU5fVklPX01BU0ssCisJLmRfTUlTQ19JU19EU1RfUklOR19PVkVSRkxPV19NQVNLID0KKwkJQVI5ODg4X01JU0NfSVNfRFNUX1JJTkdfT1ZFUkZMT1dfTUFTSywKKwkuZF9NSVNDX0lTX1NSQ19SSU5HX09WRVJGTE9XX01BU0sgPQorCQlBUjk4ODhfTUlTQ19JU19TUkNfUklOR19PVkVSRkxPV19NQVNLLAorCS5kX1NSQ19XQVRFUk1BUktfTE9XX0xTQiA9IEFSOTg4OF9TUkNfV0FURVJNQVJLX0xPV19MU0IsCisJLmRfU1JDX1dBVEVSTUFSS19ISUdIX0xTQiA9IEFSOTg4OF9TUkNfV0FURVJNQVJLX0hJR0hfTFNCLAorCS5kX0RTVF9XQVRFUk1BUktfTE9XX0xTQiA9IEFSOTg4OF9EU1RfV0FURVJNQVJLX0xPV19MU0IsCisJLmRfRFNUX1dBVEVSTUFSS19ISUdIX0xTQiA9IEFSOTg4OF9EU1RfV0FURVJNQVJLX0hJR0hfTFNCLAorCS5kX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTUFTSyA9CisJCUFSOTg4OF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX01BU0ssCisJLmRfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9MU0IgPQorCQlBUjk4ODhfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9MU0IsCisJLmRfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTFNCID0gQVI5ODg4X0NFX0NUUkwxX0RNQVhfTEVOR1RIX0xTQiwKKwkuZF9DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTUFTSyA9CisJCUFSOTg4OF9DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTUFTSywKKwkuZF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTUFTSyA9CisJCUFSOTg4OF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTUFTSywKKwkuZF9DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTFNCID0KKwkJQVI5ODg4X0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9MU0IsCisJLmRfQ0VfQ1RSTDFfRFNUX1JJTkdfQllURV9TV0FQX0VOX0xTQiA9CisJCUFSOTg4OF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTFNCLAorCS5kX0NFMF9CQVNFX0FERFJFU1MgPSBBUjk4ODhfQ0UwX0JBU0VfQUREUkVTUywKKwkuZF9DRTFfQkFTRV9BRERSRVNTID0gQVI5ODg4X0NFMV9CQVNFX0FERFJFU1MsCisKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9hdGhfcHJvY2ZzLmMgYi9jb3JlL2hpZi9zcmMvYXRoX3Byb2Nmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YjMwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hpZi9zcmMvYXRoX3Byb2Nmcy5jCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVRIX1BST0NGU19ESUFHX1NVUFBPUlQpCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+ICAgICAgIC8qIFNwZWNpZmljYWxseSwgYSBtb2R1bGUgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gICAgICAgLyogV2UncmUgZG9pbmcga2VybmVsIHdvcmsgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ICAgICAgLyogV2UncmUgZG9pbmcga2VybmVsIHdvcmsgKi8KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+ICAgICAgLyogTmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIHRoZSBwcm9jIGZzICovCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4gICAgICAgIC8qIGZvciBjb3B5X2Zyb21fdXNlciAqLworI2luY2x1ZGUgIm9sX2lmX2F0aHZhci5oIgorI2luY2x1ZGUgImhpZi5oIgorI2lmIGRlZmluZWQoSElGX1BDSSkKKyNpbmNsdWRlICJpZl9wY2kuaCIKKyNlbGlmIGRlZmluZWQoSElGX1VTQikKKyNpbmNsdWRlICJpZl91c2IuaCIKKyNlbGlmIGRlZmluZWQoSElGX1NESU8pCisjaW5jbHVkZSAiaWZfYXRoX3NkaW8uaCIKKyNlbmRpZgorI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJoaWZfZGVidWcuaCIKKworI2RlZmluZSBQUk9DRlNfTkFNRSAgICAgICAgICAgICAiYXRoZGlhZ3BmcyIKKyNkZWZpbmUgUFJPQ0ZTX0RJUiAgICAgICAgICAgICAgImNsZCIKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkIGluZm9ybWF0aW9uIGFib3V0IHRoZSAvcHJvYyBmaWxlCisgKgorICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2ZpbGUsICpwcm9jX2RpcjsKKworc3RhdGljIHZvaWQgKmdldF9oaWZfaGRsX2Zyb21fZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbjsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTAsIDApKQorCXNjbiA9IChzdHJ1Y3Qgb2xfc29mdGMgKilQREVfREFUQShmaWxlX2lub2RlKGZpbGUpKTsKKyNlbHNlCisJc2NuID0gKHN0cnVjdCBvbF9zb2Z0YyAqKSgKKwkJUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5kYXRhKTsKKyNlbmRpZgorCXJldHVybiAodm9pZCAqKXNjbjsKK30KKworc3RhdGljIHNzaXplX3QgYXRoX3Byb2Nmc19kaWFnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJaGlmX2hhbmRsZV90IGhpZl9oZGw7CisJaW50IHJ2OworCXVpbnQ4X3QgKnJlYWRfYnVmZmVyID0gTlVMTDsKKworCXJlYWRfYnVmZmVyID0gY2RmX21lbV9tYWxsb2MoY291bnQpOworCWlmIChOVUxMID09IHJlYWRfYnVmZmVyKSB7CisJCUhJRl9FUlJPUigiJXM6IGNkZl9tZW1fYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwloaWZfaGRsID0gZ2V0X2hpZl9oZGxfZnJvbV9maWxlKGZpbGUpOworCUhJRl9EQkcoInJkIGJ1ZmYgMHglcCBjbnQgJXp1IG9mZnNldCAweCV4IGJ1ZiAweCVwIiwKKwkJIHJlYWRfYnVmZmVyLCBjb3VudCwgKGludCkqcG9zLCBidWYpOworCisJaWYgKChjb3VudCA9PSA0KSAmJiAoKCgodWludDMyX3QpICgqcG9zKSkgJiAzKSA9PSAwKSkgeworCQkvKiByZWFkaW5nIGEgd29yZD8gKi8KKwkJcnYgPSBoaWZfZGlhZ19yZWFkX2FjY2VzcyhoaWZfaGRsLCAodWludDMyX3QpKCpwb3MpLAorCQkJCQkgICh1aW50MzJfdCAqKXJlYWRfYnVmZmVyKTsKKwl9IGVsc2UgeworCQlydiA9IGhpZl9kaWFnX3JlYWRfbWVtKGhpZl9oZGwsICh1aW50MzJfdCkoKnBvcyksCisJCQkJICAgICAgICh1aW50OF90ICopcmVhZF9idWZmZXIsIGNvdW50KTsKKwl9CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcmVhZF9idWZmZXIsIGNvdW50KSkgeworCQljZGZfbWVtX2ZyZWUocmVhZF9idWZmZXIpOworCQlISUZfRVJST1IoIiVzOiBjb3B5X3RvX3VzZXIgZXJyb3IgaW4gL3Byb2MvJXMiLAorCQkJX19mdW5jX18sIFBST0NGU19OQU1FKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfSBlbHNlCisJCWNkZl9tZW1fZnJlZShyZWFkX2J1ZmZlcik7CisKKwlpZiAocnYgPT0gMCkgeworCQlyZXR1cm4gY291bnQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU87CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBhdGhfcHJvY2ZzX2RpYWdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwloaWZfaGFuZGxlX3QgaGlmX2hkbDsKKwlpbnQgcnY7CisJdWludDhfdCAqd3JpdGVfYnVmZmVyID0gTlVMTDsKKworCXdyaXRlX2J1ZmZlciA9IGNkZl9tZW1fbWFsbG9jKGNvdW50KTsKKwlpZiAoTlVMTCA9PSB3cml0ZV9idWZmZXIpIHsKKwkJSElGX0VSUk9SKCIlczogY2RmX21lbV9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIod3JpdGVfYnVmZmVyLCBidWYsIGNvdW50KSkgeworCQljZGZfbWVtX2ZyZWUod3JpdGVfYnVmZmVyKTsKKwkJSElGX0VSUk9SKCIlczogY29weV90b191c2VyIGVycm9yIGluIC9wcm9jLyVzIiwKKwkJCV9fZnVuY19fLCBQUk9DRlNfTkFNRSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWhpZl9oZGwgPSBnZXRfaGlmX2hkbF9mcm9tX2ZpbGUoZmlsZSk7CisJSElGX0RCRygid3IgYnVmZiAweCVwIGJ1ZiAweCVwIGNudCAlenUgb2Zmc2V0IDB4JXggdmFsdWUgMHgleCIsCisJCSB3cml0ZV9idWZmZXIsIGJ1ZiwgY291bnQsCisJCSAoaW50KSpwb3MsICooKHVpbnQzMl90ICopIHdyaXRlX2J1ZmZlcikpOworCisJaWYgKChjb3VudCA9PSA0KSAmJiAoKCgodWludDMyX3QpICgqcG9zKSkgJiAzKSA9PSAwKSkgeworCQkvKiByZWFkaW5nIGEgd29yZD8gKi8KKwkJdWludDMyX3QgdmFsdWUgPSAqKCh1aW50MzJfdCAqKXdyaXRlX2J1ZmZlcik7CisJCXJ2ID0gaGlmX2RpYWdfd3JpdGVfYWNjZXNzKGhpZl9oZGwsICh1aW50MzJfdCkoKnBvcyksIHZhbHVlKTsKKwl9IGVsc2UgeworCQlydiA9IGhpZl9kaWFnX3dyaXRlX21lbShoaWZfaGRsLCAodWludDMyX3QpKCpwb3MpLAorCQkJCQkodWludDhfdCAqKXdyaXRlX2J1ZmZlciwgY291bnQpOworCX0KKworCWNkZl9tZW1fZnJlZSh3cml0ZV9idWZmZXIpOworCWlmIChydiA9PSAwKSB7CisJCXJldHVybiBjb3VudDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF0aGRpYWdfZm9wcyA9IHsKKwkucmVhZCA9IGF0aF9wcm9jZnNfZGlhZ19yZWFkLAorCS53cml0ZSA9IGF0aF9wcm9jZnNfZGlhZ193cml0ZSwKK307CisKKy8qKgorICAgKlRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQKKyAqCisgKi8KK2ludCBhdGhkaWFnX3Byb2Nmc19pbml0KHZvaWQgKnNjbikKK3sKKwlwcm9jX2RpciA9IHByb2NfbWtkaXIoUFJPQ0ZTX0RJUiwgTlVMTCk7CisJaWYgKHByb2NfZGlyID09IE5VTEwpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ0ZTX0RJUiwgTlVMTCk7CisJCUhJRl9FUlJPUigiJXM6IEVycm9yOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSAvcHJvYy8lcyIsCisJCQlfX2Z1bmNfXywgUFJPQ0ZTX0RJUik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByb2NfZmlsZSA9IHByb2NfY3JlYXRlX2RhdGEoUFJPQ0ZTX05BTUUsCisJCQkJICAgICBTX0lSVVNSIHwgU19JV1VTUiwgcHJvY19kaXIsCisJCQkJICAgICAmYXRoZGlhZ19mb3BzLCAodm9pZCAqKXNjbik7CisJaWYgKHByb2NfZmlsZSA9PSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NGU19OQU1FLCBwcm9jX2Rpcik7CisJCUhJRl9FUlJPUigiJXM6IENvdWxkIG5vdCBpbml0aWFsaXplIC9wcm9jLyVzIiwKKwkJCV9fZnVuY19fLCBQUk9DRlNfTkFNRSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCUhJRl9EQkcoIi9wcm9jLyVzLyVzIGNyZWF0ZWQiLCBQUk9DRlNfRElSLCBQUk9DRlNfTkFNRSk7CisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogZXZlcnl0aGluZyBpcyBvayAqLworfQorCisvKioKKyAgICpUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQKKyAqCisgKi8KK3ZvaWQgYXRoZGlhZ19wcm9jZnNfcmVtb3ZlKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ0ZTX05BTUUsIHByb2NfZGlyKTsKKwlISUZfREJHKCIvcHJvYy8lcy8lcyByZW1vdmVkIiwgUFJPQ0ZTX0RJUiwgUFJPQ0ZTX05BTUUpOworCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NGU19ESVIsIE5VTEwpOworCUhJRl9EQkcoIi9wcm9jLyVzIHJlbW92ZWQiLCBQUk9DRlNfRElSKTsKK30KKyNlbHNlCitpbnQgYXRoZGlhZ19wcm9jZnNfaW5pdCh2b2lkICpzY24pCit7CisJcmV0dXJuIDA7Cit9Cit2b2lkIGF0aGRpYWdfcHJvY2ZzX3JlbW92ZSh2b2lkKSB7fQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvY2UvY2VfYXBpLmggYi9jb3JlL2hpZi9zcmMvY2UvY2VfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkZTc0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9jZS9jZV9hcGkuaApAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0NPUFlfRU5HSU5FX0FQSV9IX18KKyNkZWZpbmUgX19DT1BZX0VOR0lORV9BUElfSF9fCisKKyNpbmNsdWRlICJjZV9tYWluLmgiCisvKiBUQkRYWFg6IFVzZSBpbnQgcmV0dXJuIHZhbHVlcyBmb3IgY29uc2lzdGVuY3kgd2l0aCBUYXJnZXQgKi8KKworLyogVEJEWFhYOiBQZXJoYXBzIG1lcmdlIEhvc3QvVGFyZ2V0LS0+Y29tbW9uICovCisKKy8qCisgKiBDb3B5IEVuZ2luZSBzdXBwb3J0OiBsb3ctbGV2ZWwgVGFyZ2V0LXNpZGUgQ29weSBFbmdpbmUgQVBJLgorICogVGhpcyBpcyBhIGhhcmR3YXJlIGFjY2VzcyBsYXllciB1c2VkIGJ5IGNvZGUgdGhhdCB1bmRlcnN0YW5kcworICogaG93IHRvIHVzZSBjb3B5IGVuZ2luZXMuCisgKi8KKworLyoKKyAqIEEgInN0cnVjdCBDRV9oYW5kbGUgKiIgc2VydmVzIGFzIGFuIG9wYXF1ZSBwb2ludGVyLXNpemVkCisgKiBoYW5kbGUgdG8gYSBzcGVjaWZpYyBjb3B5IGVuZ2luZS4KKyAqLworc3RydWN0IENFX2hhbmRsZTsKKworLyoKKyAqICJTZW5kIENvbXBsZXRpb24iIGNhbGxiYWNrIHR5cGUgZm9yIFNlbmQgQ29tcGxldGlvbiBOb3RpZmljYXRpb24uCisgKgorICogSWYgYSBTZW5kIENvbXBsZXRpb24gY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCBhbmQgb25lIG9yIG1vcmUgc2VuZHMKKyAqIGhhdmUgY29tcGxldGVkLCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4KKyAqCisgKiBwZXJfY2Vfc2VuZF9jb250ZXh0IGlzIGEgY29udGV4dCBzdXBwbGllZCBieSB0aGUgY2FsbGluZyBsYXllcgorICogKHZpYSBjZV9zZW5kX2NiX3JlZ2lzdGVyKS4gSXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgY29weSBlbmdpbmUuCisgKgorICogcGVyX3RyYW5zZmVyX3NlbmRfY29udGV4dCBpcyBjb250ZXh0IHN1cHBsaWVkIGJ5IHRoZSBjYWxsaW5nIGxheWVyCisgKiAodmlhIHRoZSAic2VuZCIgY2FsbCkuICBJdCBtYXkgYmUgZGlmZmVyZW50IGZvciBlYWNoIGludm9jYXRpb24KKyAqIG9mIHNlbmQuCisgKgorICogVGhlIGJ1ZmZlciBwYXJhbWV0ZXIgaXMgdGhlIGZpcnN0IGJ5dGUgc2VudCBvZiB0aGUgZmlyc3QgYnVmZmVyCisgKiBzZW50IChpZiBtb3JlIHRoYW4gb25lIGJ1ZmZlcikuCisgKgorICogbmJ5dGVzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhhdCBidWZmZXIgdGhhdCB3ZXJlIHNlbnQuCisgKgorICogdHJhbnNmZXJfaWQgbWF0Y2hlcyB0aGUgdmFsdWUgdXNlZCB3aGVuIHRoZSBidWZmZXIgb3IKKyAqIGJ1Zl9saXN0IHdhcyBzZW50LgorICoKKyAqIEltcGxlbWVudGF0aW9uIG5vdGU6IFBvcHMgMSBjb21wbGV0ZWQgc2VuZCBidWZmZXIgZnJvbSBTb3VyY2UgcmluZworICovCit0eXBlZGVmIHZvaWQgKCpjZV9zZW5kX2NiKShzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLAorCQkJICAgdm9pZCAqcGVyX2NlX3NlbmRfY29udGV4dCwKKwkJCSAgIHZvaWQgKnBlcl90cmFuc2Zlcl9zZW5kX2NvbnRleHQsCisJCQkgICBjZGZfZG1hX2FkZHJfdCBidWZmZXIsCisJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLAorCQkJICAgdW5zaWduZWQgaW50IHRyYW5zZmVyX2lkLAorCQkJICAgdW5zaWduZWQgaW50IHN3X2luZGV4LAorCQkJICAgdW5zaWduZWQgaW50IGh3X2luZGV4LAorCQkJICAgdWludDMyX3QgdG9lcGxpdHpfaGFzaF9yZXN1bHQpOworCisvKgorICogIkJ1ZmZlciBSZWNlaXZlZCIgY2FsbGJhY2sgdHlwZSBmb3IgQnVmZmVyIFJlY2VpdmVkIE5vdGlmaWNhdGlvbi4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBub3RlOiBQb3BzIDEgY29tcGxldGVkIHJlY3YgYnVmZmVyIGZyb20gRGVzdCByaW5nCisgKi8KK3R5cGVkZWYgdm9pZCAoKkNFX3JlY3ZfY2IpKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcsCisJCSAgIHZvaWQgKnBlcl9DRV9yZWN2X2NvbnRleHQsCisJCSAgIHZvaWQgKnBlcl90cmFuc2Zlcl9yZWN2X2NvbnRleHQsCisJCSAgIGNkZl9kbWFfYWRkcl90IGJ1ZmZlciwKKwkJICAgdW5zaWduZWQgaW50IG5ieXRlcywKKwkJICAgdW5zaWduZWQgaW50IHRyYW5zZmVyX2lkLAorCQkgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisvKgorICogQ29weSBFbmdpbmUgV2F0ZXJtYXJrIGNhbGxiYWNrIHR5cGUuCisgKgorICogQWxsb3dzIHVwcGVyIGxheWVycyB0byBiZSBub3RpZmllZCB3aGVuIHdhdGVybWFya3MgYXJlIHJlYWNoZWQ6CisgKiAgIHNwYWNlIGlzIGF2YWlsYWJsZSBhbmQvb3IgcnVubmluZyBzaG9ydCBpbiBhIHNvdXJjZSByaW5nCisgKiAgIGJ1ZmZlcnMgYXJlIGV4aGF1c3RlZCBhbmQvb3IgYWJ1bmRhbnQgaW4gYSBkZXN0aW5hdGlvbiByaW5nCisgKgorICogVGhlIGZsYWdzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hpY2ggY29uZGl0aW9uIHRyaWdnZXJlZCB0aGlzCisgKiBjYWxsYmFjay4gIFNlZSBDRV9XTV9GTEFHXyouCisgKgorICogV2F0ZXJtYXJrIEFQSXMgYXJlIHByb3ZpZGVkIHRvIGFsbG93IHVwcGVyIGxheWVycyAiYmF0Y2giCisgKiBkZXNjcmlwdG9yIHByb2Nlc3NpbmcgYW5kIHRvIGFsbG93IHVwcGVyIGxheWVycyB0bworICogdGhyb3R0bGUvdW50aHJvdHRsZS4KKyAqLwordHlwZWRlZiB2b2lkICgqQ0Vfd2F0ZXJtYXJrX2NiKShzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLAorCQkJCXZvaWQgKnBlcl9DRV93bV9jb250ZXh0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisjZGVmaW5lIENFX1dNX0ZMQUdfU0VORF9ISUdIICAgMQorI2RlZmluZSBDRV9XTV9GTEFHX1NFTkRfTE9XICAgIDIKKyNkZWZpbmUgQ0VfV01fRkxBR19SRUNWX0hJR0ggICA0CisjZGVmaW5lIENFX1dNX0ZMQUdfUkVDVl9MT1cgICAgOAorCisvKiBBIGxpc3Qgb2YgYnVmZmVycyB0byBiZSBnYXRoZXJlZCBhbmQgc2VudCAqLworc3RydWN0IGNlX3NlbmRsaXN0OworCisvKiBDb3B5IEVuZ2luZSBzZXR0YWJsZSBhdHRyaWJ1dGVzICovCitzdHJ1Y3QgQ0VfYXR0cjsKKworLyo9PT09PT09PT09PT09PT09PT1TZW5kPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBjZV9zZW5kIGZsYWdzICovCisvKiBkaXNhYmxlIHJpbmcncyBieXRlIHN3YXAsIGV2ZW4gaWYgdGhlIGRlZmF1bHQgcG9saWN5IGlzIHRvIHN3YXAgKi8KKyNkZWZpbmUgQ0VfU0VORF9GTEFHX1NXQVBfRElTQUJMRSAgICAgICAgMQorCisvKgorICogUXVldWUgYSBzb3VyY2UgYnVmZmVyIHRvIGJlIHNlbnQgdG8gYW4gYW5vbnltb3VzIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqICAgY29weWVuZyAgICAgICAgIC0gd2hpY2ggY29weSBlbmdpbmUgdG8gdXNlCisgKiAgIGJ1ZmZlciAgICAgICAgICAtIGFkZHJlc3Mgb2YgYnVmZmVyCisgKiAgIG5ieXRlcyAgICAgICAgICAtIG51bWJlciBvZiBieXRlcyB0byBzZW5kCisgKiAgIHRyYW5zZmVyX2lkICAgICAtIGFyYml0cmFyeSBJRDsgcmVmbGVjdGVkIHRvIGRlc3RpbmF0aW9uCisgKiAgIGZsYWdzICAgICAgICAgICAtIENFX1NFTkRfRkxBR18qIHZhbHVlcworICogUmV0dXJucyAwIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSBhbiBlcnJvciBzdGF0dXMuCisgKgorICogTm90ZTogSWYgbm8gZmxhZ3MgYXJlIHNwZWNpZmllZCwgdXNlIENFJ3MgZGVmYXVsdCBkYXRhIHN3YXAgbW9kZS4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBub3RlOiBwdXNoZXMgMSBidWZmZXIgdG8gU291cmNlIHJpbmcKKyAqLworaW50IGNlX3NlbmQoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJdm9pZCAqcGVyX3RyYW5zZmVyX3NlbmRfY29udGV4dCwKKwkJY2RmX2RtYV9hZGRyX3QgYnVmZmVyLAorCQl1bnNpZ25lZCBpbnQgbmJ5dGVzLAorCQl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfaWQsCisJCXVuc2lnbmVkIGludCBmbGFncywKKwkJdW5zaWduZWQgaW50IHVzZXJfZmxhZ3MpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0ZBU1RQQVRICitpbnQgY2Vfc2VuZF9mYXN0KHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcsIGNkZl9uYnVmX3QgKm1zZHVzLAorCQkgdW5zaWduZWQgaW50IG51bV9tc2R1cywgdW5zaWduZWQgaW50IHRyYW5zZmVyX2lkKTsKKworI2VuZGlmCit2b2lkIGNlX3BrdF9kbF9sZW5fc2V0KHZvaWQgKmhpZl9zYywgdW5zaWduZWQgaW50IHBrdF9kb3dubG9hZF9sZW4pOworCisvKgorICogUmVnaXN0ZXIgYSBTZW5kIENhbGxiYWNrIGZ1bmN0aW9uLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgY29udGVudHMgb2YgYSBTZW5kCisgKiBoYXZlIHJlYWNoZWQgdGhlIGRlc3RpbmF0aW9uLCB1bmxlc3MgZGlzYWJsZV9pbnRlcnJ1cHRzIGlzCisgKiByZXF1ZXN0ZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gdGhlCisgKiBzZW5kIHN0YXR1cyBpcyBwb2xsZWQsIHNob3J0bHkgYWZ0ZXIgdGhlIHNlbmQgY29tcGxldGVzLgorICovCit2b2lkIGNlX3NlbmRfY2JfcmVnaXN0ZXIoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJCSBjZV9zZW5kX2NiIGZuX3B0ciwKKwkJCSB2b2lkICpwZXJfY2Vfc2VuZF9jb250ZXh0LCBpbnQgZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKworLyoKKyAqIFJldHVybiB0aGUgc2l6ZSBvZiBhIFNlbmRMaXN0LiBUaGlzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGFsbG9jYXRlCisgKiBhIFNlbmRMaXN0IHdoaWxlIHRoZSBTZW5kTGlzdCBzdHJ1Y3R1cmUgcmVtYWlucyBvcGFxdWUuCisgKi8KK3Vuc2lnbmVkIGludCBjZV9zZW5kbGlzdF9zaXplb2Yodm9pZCk7CisKKy8qIEluaXRpYWxpemUgYSBzZW5kbGlzdCAqLwordm9pZCBjZV9zZW5kbGlzdF9pbml0KHN0cnVjdCBjZV9zZW5kbGlzdCAqc2VuZGxpc3QpOworCisvKiBBcHBlbmQgYSBzaW1wbGUgYnVmZmVyIChhZGRyZXNzL2xlbmd0aCkgdG8gYSBzZW5kbGlzdC4gKi8KK2ludCBjZV9zZW5kbGlzdF9idWZfYWRkKHN0cnVjdCBjZV9zZW5kbGlzdCAqc2VuZGxpc3QsCisJCWNkZl9kbWFfYWRkcl90IGJ1ZmZlciwKKwkJdW5zaWduZWQgaW50IG5ieXRlcywKKwkJdWludDMyX3QgZmxhZ3MsIC8qIE9SLWVkIHdpdGggaW50ZXJuYWwgZmxhZ3MgKi8KKwkJdWludDMyX3QgdXNlcl9mbGFncyk7CisKKy8qCisgKiBRdWV1ZSBhICJzZW5kbGlzdCIgb2YgYnVmZmVycyB0byBiZSBzZW50IHVzaW5nIGdhdGhlciB0byBhIHNpbmdsZQorICogYW5vbnltb3VzIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogICBjb3B5ZW5nICAgICAgICAgLSB3aGljaCBjb3B5IGVuZ2luZSB0byB1c2UKKyAqICAgc2VuZGxpc3QgICAgICAgIC0gbGlzdCBvZiBzaW1wbGUgYnVmZmVycyB0byBzZW5kIHVzaW5nIGdhdGhlcgorICogICB0cmFuc2Zlcl9pZCAgICAgLSBhcmJpdHJhcnkgSUQ7IHJlZmxlY3RlZCB0byBkZXN0aW5hdGlvbgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSBhbiBlcnJvciBzdGF0dXMuCisgKgorICogSW1wbGVtZW5hdGlvbiBub3RlOiBQdXNoZXMgbXVsdGlwbGUgYnVmZmVycyB3aXRoIEdhdGhlciB0byBTb3VyY2UgcmluZy4KKyAqLworaW50IGNlX3NlbmRsaXN0X3NlbmQoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJdm9pZCAqcGVyX3RyYW5zZmVyX3NlbmRfY29udGV4dCwKKwkJc3RydWN0IGNlX3NlbmRsaXN0ICpzZW5kbGlzdCwKKwkJdW5zaWduZWQgaW50IHRyYW5zZmVyX2lkKTsKKworLyo9PT09PT09PT09PT09PT09PT1SZWN2PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogTWFrZSBhIGJ1ZmZlciBhdmFpbGFibGUgdG8gcmVjZWl2ZS4gVGhlIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IG9mIGEKKyAqIG1pbmltYWwgc2l6ZSBhcHByb3ByaWF0ZSBmb3IgdGhpcyBjb3B5IGVuZ2luZSAoc3JjX3N6X21heCBhdHRyaWJ1dGUpLgorICogICBjb3B5ZW5nICAgICAgICAgICAgICAgICAgICAtIHdoaWNoIGNvcHkgZW5naW5lIHRvIHVzZQorICogICBwZXJfdHJhbnNmZXJfcmVjdl9jb250ZXh0ICAtIGNvbnRleHQgcGFzc2VkIGJhY2sgdG8gY2FsbGVyJ3MgcmVjdl9jYgorICogICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAtIGFkZHJlc3Mgb2YgYnVmZmVyIGluIENFIHNwYWNlCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzczsgb3RoZXJ3aXNlIGFuIGVycm9yIHN0YXR1cy4KKyAqCisgKiBJbXBsZW1lbmF0aW9uIG5vdGU6IFB1c2hlcyBhIGJ1ZmZlciB0byBEZXN0IHJpbmcuCisgKi8KK2ludCBjZV9yZWN2X2J1Zl9lbnF1ZXVlKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcsCisJCQl2b2lkICpwZXJfdHJhbnNmZXJfcmVjdl9jb250ZXh0LAorCQkJY2RmX2RtYV9hZGRyX3QgYnVmZmVyKTsKKworLyoKKyAqIFJlZ2lzdGVyIGEgUmVjZWl2ZSBDYWxsYmFjayBmdW5jdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIHNvb24gYXMgZGF0YSBpcyByZWNlaXZlZAorICogZnJvbSB0aGUgc291cmNlLgorICovCit2b2lkIGNlX3JlY3ZfY2JfcmVnaXN0ZXIoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJCSBDRV9yZWN2X2NiIGZuX3B0ciwKKwkJCSB2b2lkICpwZXJfQ0VfcmVjdl9jb250ZXh0LAorCQkJIGludCBkaXNhYmxlX2ludGVycnVwdHMpOworCisvKj09PT09PT09PT09PT09PT09PUNFIFdhdGVybWFyaz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBSZWdpc3RlciBhIFdhdGVybWFyayBDYWxsYmFjayBmdW5jdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIHNvb24gYXMgYSB3YXRlcm1hcmsgbGV2ZWwKKyAqIGlzIGNyb3NzZWQuICBBIFdhdGVybWFyayBDYWxsYmFjayBmdW5jdGlvbiBpcyBmcmVlIHRvCisgKiBoYW5kbGUgcmVjZWl2ZWQgZGF0YSAiZW4gbWFzc2UiOyBidXQgdGhlbiBzb21lIGNvb3JkaW5hdGlvbgorICogaXMgcmVxdWlyZWQgd2l0aCBhIHJlZ2lzdGVyZWQgUmVjZWl2ZSBDYWxsYmFjayBmdW5jdGlvbi4KKyAqIFtTdWdnZXN0aW9uOiBFaXRoZXIgaGFuZGxlIFJlY2VpdmVzIGluIGEgUmVjZWl2ZSBDYWxsYmFjaworICogb3IgZW4gbWFzc2UgaW4gYSBXYXRlcm1hcmsgQ2FsbGJhY2s7IGJ1dCBub3QgYm90aC5dCisgKi8KK3ZvaWQgY2Vfd2F0ZXJtYXJrX2NiX3JlZ2lzdGVyKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcsCisJCQkgIENFX3dhdGVybWFya19jYiBmbl9wdHIsCisJCQkgIHZvaWQgKnBlcl9DRV93bV9jb250ZXh0KTsKKworLyoKKyAqIFNldCBsb3cvaGlnaCB3YXRlcm1hcmtzIGZvciB0aGUgc2VuZC9zb3VyY2Ugc2lkZSBvZiBhIGNvcHkgZW5naW5lLgorICoKKyAqIFR5cGljYWxseSwgdGhlIGRlc3RpbmF0aW9uIHNpZGUgQ1BVIG1hbmFnZXMgd2F0ZXJtYXJrcyBmb3IKKyAqIHRoZSByZWNlaXZlIHNpZGUgYW5kIHRoZSBzb3VyY2Ugc2lkZSBDUFUgbWFuYWdlcyB3YXRlcm1hcmtzCisgKiBmb3IgdGhlIHNlbmQgc2lkZS4KKyAqCisgKiBBIGxvdyB3YXRlcm1hcmsgb2YgMCBpcyBuZXZlciBoaXQgKHNvIHRoZSB3YXRlcm1hcmsgZnVuY3Rpb24KKyAqIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIGZvciBhIExvdyBXYXRlcm1hcmsgY29uZGl0aW9uKS4KKyAqCisgKiBBIGhpZ2ggd2F0ZXJtYXJrIGVxdWFsIHRvIG5lbnRyaWVzIGlzIG5ldmVyIGhpdCAoc28gdGhlCisgKiB3YXRlcm1hcmsgZnVuY3Rpb24gd2lsbCBuZXZlciBiZSBjYWxsZWQgZm9yIGEgSGlnaCBXYXRlcm1hcmsKKyAqIGNvbmRpdGlvbikuCisgKi8KK3ZvaWQgY2Vfc2VuZF93YXRlcm1hcmtzX3NldChzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLAorCQkJICAgIHVuc2lnbmVkIGludCBsb3dfYWxlcnRfbmVudHJpZXMsCisJCQkgICAgdW5zaWduZWQgaW50IGhpZ2hfYWxlcnRfbmVudHJpZXMpOworCisvKiBTZXQgbG93L2hpZ2ggd2F0ZXJtYXJrcyBmb3IgdGhlIHJlY2VpdmUvZGVzdGluYXRpb24gc2lkZSBvZiBjb3B5IGVuZ2luZS4gKi8KK3ZvaWQgY2VfcmVjdl93YXRlcm1hcmtzX3NldChzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLAorCQkJICAgIHVuc2lnbmVkIGludCBsb3dfYWxlcnRfbmVudHJpZXMsCisJCQkgICAgdW5zaWduZWQgaW50IGhpZ2hfYWxlcnRfbmVudHJpZXMpOworCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyB0aGF0IGNhbiBiZSBxdWV1ZWQKKyAqIHRvIGEgcmluZyBhdCBhbiBpbnN0YW50IGluIHRpbWUuCisgKgorICogRm9yIHNvdXJjZSByaW5nLCBkb2VzIG5vdCBpbXBseSB0aGF0IGRlc3RpbmF0aW9uLXNpZGUKKyAqIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZTsgbWVyZWx5IGluZGljYXRlcyBkZXNjcmlwdG9yIHNwYWNlCisgKiBpbiB0aGUgc291cmNlIHJpbmcuCisgKgorICogRm9yIGRlc3RpbmF0aW9uIHJpbmcsIGRvZXMgbm90IGltcGx5IHRoYXQgcHJldmlvdXNseQorICogcmVjZWl2ZWQgYnVmZmVycyBoYXZlIGJlZW4gcHJvY2Vzc2VkOyBtZXJlbHkgaW5kaWNhdGVzCisgKiBkZXNjcmlwdG9yIHNwYWNlIGluIGRlc3RpbmF0aW9uIHJpbmcuCisgKgorICogTWFpbmx5IGZvciB1c2Ugd2l0aCBDRSBXYXRlcm1hcmsgY2FsbGJhY2suCisgKi8KK3Vuc2lnbmVkIGludCBjZV9zZW5kX2VudHJpZXNfYXZhaWwoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZyk7Cit1bnNpZ25lZCBpbnQgY2VfcmVjdl9lbnRyaWVzX2F2YWlsKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcpOworCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcmluZyB0aGF0IGFyZSByZWFkeQorICogdG8gYmUgcHJvY2Vzc2VkIGJ5IHNvZnR3YXJlLgorICoKKyAqIEZvciBzb3VyY2UgcmluZywgdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyB0aGF0IGhhdmUKKyAqIGJlZW4gY29tcGxldGVkIGFuZCBjYW4gbm93IGJlIG92ZXJ3cml0dGVuIHdpdGggbmV3IHNlbmQKKyAqIGRlc2NyaXB0b3JzLgorICoKKyAqIEZvciBkZXN0aW5hdGlvbiByaW5nLCB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRoYXQKKyAqIGFyZSBhdmFpbGFibGUgdG8gYmUgcHJvY2Vzc2VkIChuZXdseSByZWNlaXZlZCBidWZmZXJzKS4KKyAqLwordW5zaWduZWQgaW50IGNlX3NlbmRfZW50cmllc19kb25lKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcpOwordW5zaWduZWQgaW50IGNlX3JlY3ZfZW50cmllc19kb25lKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcpOworCisvKiByZWN2IGZsYWdzICovCisvKiBEYXRhIGlzIGJ5dGUtc3dhcHBlZCAqLworI2RlZmluZSBDRV9SRUNWX0ZMQUdfU1dBUFBFRCAgICAgICAgICAgIDEKKwordm9pZCBjZV9lbmFibGVfbXNpKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLAorCQkgICB1bnNpZ25lZCBpbnQgQ0VfaWQsCisJCSAgIHVpbnQzMl90IG1zaV9hZGRyX2xvLAorCQkgICB1aW50MzJfdCBtc2lfYWRkcl9oaSwKKwkJICAgdWludDMyX3QgbXNpX2RhdGEpOworLyoKKyAqIFN1cHBseSBkYXRhIGZvciB0aGUgbmV4dCBjb21wbGV0ZWQgdW5wcm9jZXNzZWQgcmVjZWl2ZSBkZXNjcmlwdG9yLgorICoKKyAqIEZvciB1c2UKKyAqICAgIHdpdGggQ0UgV2F0ZXJtYXJrIGNhbGxiYWNrLAorICogICAgaW4gYSByZWN2X2NiIGZ1bmN0aW9uIHdoZW4gcHJvY2Vzc2luZyBidWZfbGlzdHMKKyAqICAgIGluIGEgcmVjdl9jYiBmdW5jdGlvbiBpbiBvcmRlciB0byBtaXRpZ2F0ZSByZWN2X2NiJ3MuCisgKgorICogSW1wbGVtZW5hdGlvbiBub3RlOiBQb3BzIGJ1ZmZlciBmcm9tIERlc3QgcmluZy4KKyAqLworaW50IGNlX2NvbXBsZXRlZF9yZWN2X25leHQoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJCSAgIHZvaWQgKipwZXJfQ0VfY29udGV4dHAsCisJCQkgICB2b2lkICoqcGVyX3RyYW5zZmVyX2NvbnRleHRwLAorCQkJICAgY2RmX2RtYV9hZGRyX3QgKmJ1ZmZlcnAsCisJCQkgICB1bnNpZ25lZCBpbnQgKm5ieXRlc3AsCisJCQkgICB1bnNpZ25lZCBpbnQgKnRyYW5zZmVyX2lkcCwKKwkJCSAgIHVuc2lnbmVkIGludCAqZmxhZ3NwKTsKKworLyoKKyAqIFN1cHBseSBkYXRhIGZvciB0aGUgbmV4dCBjb21wbGV0ZWQgdW5wcm9jZXNzZWQgc2VuZCBkZXNjcmlwdG9yLgorICoKKyAqIEZvciB1c2UKKyAqICAgIHdpdGggQ0UgV2F0ZXJtYXJrIGNhbGxiYWNrCisgKiAgICBpbiBhIHNlbmRfY2IgZnVuY3Rpb24gaW4gb3JkZXIgdG8gbWl0aWdhdGUgc2VuZF9jYidzLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG5vdGU6IFBvcHMgMSBjb21wbGV0ZWQgc2VuZCBidWZmZXIgZnJvbSBTb3VyY2UgcmluZworICovCitpbnQgY2VfY29tcGxldGVkX3NlbmRfbmV4dChzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLAorCQkJICAgdm9pZCAqKnBlcl9DRV9jb250ZXh0cCwKKwkJCSAgIHZvaWQgKipwZXJfdHJhbnNmZXJfY29udGV4dHAsCisJCQkgICBjZGZfZG1hX2FkZHJfdCAqYnVmZmVycCwKKwkJCSAgIHVuc2lnbmVkIGludCAqbmJ5dGVzcCwKKwkJCSAgIHVuc2lnbmVkIGludCAqdHJhbnNmZXJfaWRwLAorCQkJICAgdW5zaWduZWQgaW50ICpzd19pZHgsCisJCQkgICB1bnNpZ25lZCBpbnQgKmh3X2lkeCwKKwkJCSAgIHVpbnQzMl90ICp0b2VwbGl0el9oYXNoX3Jlc3VsdCk7CisKKy8qPT09PT09PT09PT09PT09PT09Q0UgRW5naW5lIEluaXRpYWxpemF0aW9uPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBhIENFICovCitzdHJ1Y3QgQ0VfaGFuZGxlICpjZV9pbml0KHN0cnVjdCBvbF9zb2Z0YyAqc2NuLAorCQkJICB1bnNpZ25lZCBpbnQgQ0VfaWQsIHN0cnVjdCBDRV9hdHRyICphdHRyKTsKKworLyo9PT09PT09PT09PT09PT09PT1DRSBFbmdpbmUgU2h1dGRvd249PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoKKyAqIFN1cHBvcnQgY2xlYW4gc2h1dGRvd24gYnkgYWxsb3dpbmcgdGhlIGNhbGxlciB0byByZXZva2UKKyAqIHJlY2VpdmUgYnVmZmVycy4gIFRhcmdldCBETUEgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB1c2luZworICogdGhpcyBBUEkuCisgKi8KK0NERl9TVEFUVVMKK2NlX3Jldm9rZV9yZWN2X25leHQoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJICAgIHZvaWQgKipwZXJfQ0VfY29udGV4dHAsCisJCSAgICB2b2lkICoqcGVyX3RyYW5zZmVyX2NvbnRleHRwLAorCQkgICAgY2RmX2RtYV9hZGRyX3QgKmJ1ZmZlcnApOworCisvKgorICogU3VwcG9ydCBjbGVhbiBzaHV0ZG93biBieSBhbGxvd2luZyB0aGUgY2FsbGVyIHRvIGNhbmNlbAorICogcGVuZGluZyBzZW5kcy4gIFRhcmdldCBETUEgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB1c2luZworICogdGhpcyBBUEkuCisgKi8KK0NERl9TVEFUVVMKK2NlX2NhbmNlbF9zZW5kX25leHQoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJICAgIHZvaWQgKipwZXJfQ0VfY29udGV4dHAsCisJCSAgICB2b2lkICoqcGVyX3RyYW5zZmVyX2NvbnRleHRwLAorCQkgICAgY2RmX2RtYV9hZGRyX3QgKmJ1ZmZlcnAsCisJCSAgICB1bnNpZ25lZCBpbnQgKm5ieXRlc3AsCisJCSAgICB1bnNpZ25lZCBpbnQgKnRyYW5zZmVyX2lkcCwKKwkJICAgIHVpbnQzMl90ICp0b2VwbGl0el9oYXNoX3Jlc3VsdCk7CisKK3ZvaWQgY2VfZmluaShzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nKTsKKworLyo9PT09PT09PT09PT09PT09PT1DRSBJbnRlcnJ1cHQgSGFuZGxlcnM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBjZV9wZXJfZW5naW5lX3NlcnZpY2VfYW55KGludCBpcnEsIHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK2ludCBjZV9wZXJfZW5naW5lX3NlcnZpY2Uoc3RydWN0IG9sX3NvZnRjICpzY24sIHVuc2lnbmVkIGludCBDRV9pZCk7Cit2b2lkIGNlX3Blcl9lbmdpbmVfc2VydmljZXJlYXAoc3RydWN0IG9sX3NvZnRjICpzY24sIHVuc2lnbmVkIGludCBDRV9pZCk7CisKKy8qPT09PT09PT09PT09PT09PT09PUNFIGNtcGwgaW50ZXJydXB0IEVuYWJsZS9EaXNhYmxlID09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgY2VfZGlzYWJsZV9hbnlfY29weV9jb21wbF9pbnRyKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK3ZvaWQgY2VfZW5hYmxlX2FueV9jb3B5X2NvbXBsX2ludHIoc3RydWN0IG9sX3NvZnRjICpzY24pOwordm9pZCBjZV9kaXNhYmxlX2FueV9jb3B5X2NvbXBsX2ludHJfbm9sb2NrKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK3ZvaWQgY2VfZW5hYmxlX2FueV9jb3B5X2NvbXBsX2ludHJfbm9sb2NrKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKKworLyogQVBJIHRvIGNoZWNrIGlmIGFueSBvZiB0aGUgY29weSBlbmdpbmUgcGlwZXMgaGFzCisgKiBwZW5kaW5nIGZyYW1lcyBmb3IgcHJjb2Vzc2luZworICovCitib29sIGNlX2dldF9yeF9wZW5kaW5nKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKKworLyogQ0VfYXR0ci5mbGFncyB2YWx1ZXMgKi8KKyNkZWZpbmUgQ0VfQVRUUl9OT19TTk9PUCAgICAgICAgICAgICAweDAxIC8qIFVzZSBOb25Tbm9vcGluZyBQQ0llIGFjY2Vzc2VzPyAqLworI2RlZmluZSBDRV9BVFRSX0JZVEVfU1dBUF9EQVRBICAgICAgIDB4MDIgLyogQnl0ZSBzd2FwIGRhdGEgd29yZHMgKi8KKyNkZWZpbmUgQ0VfQVRUUl9TV0laWkxFX0RFU0NSSVBUT1JTICAweDA0IC8qIFN3aXp6bGUgZGVzY3JpcHRvcnM/ICovCisjZGVmaW5lIENFX0FUVFJfRElTQUJMRV9JTlRSICAgICAgICAgMHgwOCAvKiBubyBpbnRlcnJ1cHQgb24gY29weSBjb21wbGV0aW9uICovCisjZGVmaW5lIENFX0FUVFJfRU5BQkxFX1BPTEwgICAgICAgICAgMHgxMCAvKiBwb2xsIGZvciByZXNpZHVlIGRlc2NyaXB0b3JzICovCisKKy8qIEF0dHJpYnV0ZXMgb2YgYW4gaW5zdGFuY2Ugb2YgYSBDb3B5IEVuZ2luZSAqLworc3RydWN0IENFX2F0dHIgeworCXVuc2lnbmVkIGludCBmbGFnczsgICAgICAgICAvKiBDRV9BVFRSXyogdmFsdWVzICovCisJdW5zaWduZWQgaW50IHByaW9yaXR5OyAgICAgIC8qIFRCRCAqLworCXVuc2lnbmVkIGludCBzcmNfbmVudHJpZXM7ICAvKiAjZW50cmllcyBpbiBzb3VyY2UgcmluZyAtCisJCQkJICAgICAqIE11c3QgYmUgYSBwb3dlciBvZiAyICovCisJdW5zaWduZWQgaW50IHNyY19zel9tYXg7ICAgIC8qIE1heCBzb3VyY2Ugc2VuZCBzaXplIGZvciB0aGlzIENFLgorCQkJCSAgICAgKiBUaGlzIGlzIGFsc28gdGhlIG1pbmltdW0gc2l6ZSBvZgorCQkJCSAgICAgKiBhIGRlc3RpbmF0aW9uIGJ1ZmZlci4gKi8KKwl1bnNpZ25lZCBpbnQgZGVzdF9uZW50cmllczsgLyogI2VudHJpZXMgaW4gZGVzdGluYXRpb24gcmluZyAtCisJCQkJICAgICAqIE11c3QgYmUgYSBwb3dlciBvZiAyICovCisJdm9pZCAqcmVzZXJ2ZWQ7ICAgICAgICAgICAgIC8qIEZ1dHVyZSB1c2UgKi8KK307CisKKy8qCisgKiBXaGVuIHVzaW5nIHNlbmRsaXN0X3NlbmQgdG8gdHJhbnNmZXIgbXVsdGlwbGUgYnVmZmVyIGZyYWdtZW50cywgdGhlCisgKiB0cmFuc2ZlciBjb250ZXh0IG9mIGVhY2ggZnJhZ21lbnQsIGV4Y2VwdCBsYXN0IG9uZSwgd2lsbCBiZSBmaWxsZWQKKyAqIHdpdGggQ0VfU0VORExJU1RfSVRFTV9DVFhULiBDRV9jb21wbGV0ZWRfc2VuZCB3aWxsIHJldHVybiBzdWNjZXNzIGZvcgorICogZWFjaCBmcmFnbWVudCBkb25lIHdpdGggc2VuZCBhbmQgdGhlIHRyYW5zZmVyIGNvbnRleHQgd291bGQgYmUKKyAqIENFX1NFTkRMSVNUX0lURU1fQ1RYVC4gVXBwZXIgbGF5ZXIgY291bGQgdXNlIHRoaXMgdG8gaWRlbnRpZnkgdGhlCisgKiBzdGF0dXMgb2YgYSBzZW5kIGNvbXBsZXRpb24uCisgKi8KKyNkZWZpbmUgQ0VfU0VORExJU1RfSVRFTV9DVFhUICAgKCh2b2lkICopMHhjZWNlYmVlZikKKworLyoKKyAqIFRoaXMgaXMgYW4gb3BhcXVlIHR5cGUgdGhhdCBpcyBhdCBsZWFzdCBsYXJnZSBlbm91Z2ggdG8gaG9sZAorICogYSBzZW5kbGlzdC4gQSBzZW5kbGlzdCBjYW4gb25seSBiZSBhY2Nlc3NlZCB0aHJvdWdoIENFIEFQSXMsCisgKiBidXQgdGhpcyBhbGxvd3MgYSBzZW5kbGlzdCB0byBiZSBhbGxvY2F0ZWQgb24gdGhlIHJ1bi10aW1lCisgKiBzdGFjay4gIFRCRFhYWDogdW4tb3BhcXVlIHdvdWxkIGJlIHNpbXBsZXIuLi4KKyAqLworc3RydWN0IGNlX3NlbmRsaXN0IHsKKwl1bnNpZ25lZCBpbnQgd29yZFs2Ml07Cit9OworCisjZGVmaW5lIEFUSF9JU1JfTk9TQ0hFRCAgMHgwMDAwICAvKiBEbyBub3Qgc2NoZWR1bGUgYm90dG9tIGhhbGYvRFBDICovCisjZGVmaW5lIEFUSF9JU1JfU0NIRUQgICAgMHgwMDAxICAvKiBTY2hlZHVsZSB0aGUgYm90dG9tIGhhbGYgZm9yIGV4ZWN1dGlvbiAqLworI2RlZmluZSBBVEhfSVNSX05PVE1JTkUgIDB4MDAwMiAgLyogZm9yIHNoYXJlZCBJUlEncyAqLworCisjaWZkZWYgSVBBX09GRkxPQUQKKy8qCisgKiBDb3B5IGVuZ2luZSBzaG91bGQgcmVsZWFzZSByZXNvdXJjZSB0byBtaWNybyBjb250cm9sbGVyCisgKiBNaWNybyBjb250cm9sbGVyIG5lZWRzCisgICAtIENvcHkgZW5naW5lIHNvdXJjZSBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcworICAgLSBDb3B5IGVuZ2luZSBzb3VyY2UgZGVzY3JpcHRvciBzaXplCisgICAtIFBDSSBCQVIgYWRkcmVzcyB0byBhY2Nlc3MgY29weSBlbmdpbmUgcmVnaXNlcgorICovCit2b2lkIGNlX2lwYV9nZXRfcmVzb3VyY2Uoc3RydWN0IENFX2hhbmRsZSAqY2UsCisJCQkgdWludDMyX3QgKmNlX3NyX2Jhc2VfcGFkZHIsCisJCQkgdWludDMyX3QgKmNlX3NyX3Jpbmdfc2l6ZSwKKwkJCSBjZGZfZG1hX2FkZHJfdCAqY2VfcmVnX3BhZGRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY2VfaXBhX2dldF9yZXNvdXJjZShzdHJ1Y3QgQ0VfaGFuZGxlICpjZSwKKwkJCSB1aW50MzJfdCAqY2Vfc3JfYmFzZV9wYWRkciwKKwkJCSB1aW50MzJfdCAqY2Vfc3JfcmluZ19zaXplLAorCQkJIGNkZl9kbWFfYWRkcl90ICpjZV9yZWdfcGFkZHIpCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZV9wa3RfZXJyb3JfY291bnRfaW5jcigKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpfaGlmX3N0YXRlLAorCWVudW0gb2xfYXRoX2hpZl9wa3RfZWNvZGVzIF9oaWZfZWNvZGUpCit7CisJaWYgKF9oaWZfZWNvZGUgPT0gSElGX1BJUEVfTk9fUkVTT1VSQ0UpCisJCShfaGlmX3N0YXRlLT5zY24tPnBrdF9zdGF0cy5oaWZfcGlwZV9ub19yZXNyY19jb3VudCkKKwkJKz0gMTsKK30KKworaW50IGhpZl9jb21wbGV0aW9uX3RocmVhZChzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUpOworYm9vbCBjZV9jaGVja19yeF9wZW5kaW5nKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBpbnQgY2VfaWQpOworI2lmIGRlZmluZWQoRkVBVFVSRV9MUk8pCit2b2lkIGNlX2xyb19mbHVzaF9jYl9yZWdpc3RlcihzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwKKwkgdm9pZCAoaGFuZGxlcikodm9pZCAqKSwgdm9pZCAqZGF0YSk7CisjZW5kaWYKKyNlbmRpZiAvKiBfX0NPUFlfRU5HSU5FX0FQSV9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9jZS9jZV9hc3NpZ25tZW50LmggYi9jb3JlL2hpZi9zcmMvY2UvY2VfYXNzaWdubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OTNkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hpZi9zcmMvY2UvY2VfYXNzaWdubWVudC5oCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBIb3N0LXNpZGUgSG9zdCBJbnRlckZhY2UgKEhJRikgQVBJCisgKiBmb3IgYSBIb3N0L1RhcmdldCBpbnRlcmNvbm5lY3QgdXNpbmcgQ29weSBFbmdpbmVzIG92ZXIgUENJZS4KKyAqLworCisjaWZuZGVmIF9fSElGX1BDSV9JTlRFUk5BTF9IX18KKyNkZWZpbmUgX19ISUZfUENJX0lOVEVSTkFMX0hfXworCisjZGVmaW5lIEhJRl9QQ0lfREVCVUcgICBBVEhfREVCVUdfTUFLRV9NT0RVTEVfTUFTSygwKQorI2RlZmluZSBISUZfUENJX0lQQV9VQ19BU1NJR05FRF9DRSAgNQorCisjaWYgZGVmaW5lZChERUJVRykKK3N0YXRpYyBBVEhfREVCVUdfTUFTS19ERVNDUklQVElPTiBnX2hpZl9kZWJ1Z19kZXNjcmlwdGlvbltdID0geworCXtISUZfUENJX0RFQlVHLCAiaGlmX3BjaSJ9LAorfTsKKworQVRIX0RFQlVHX0lOU1RBTlRJQVRFX01PRFVMRV9WQVIoaGlmLCAiaGlmIiwgIlBDSWUgSG9zdCBJbnRlcmZhY2UiLAorCQkJCUFUSF9ERUJVR19NQVNLX0RFRkFVTFRTIHwgQVRIX0RFQlVHX0lORk8sCisJCQkJQVRIX0RFQlVHX0RFU0NSSVBUSU9OX0NPVU5UCisJCQkJCSAoZ19oaWZfZGVidWdfZGVzY3JpcHRpb24pLAorCQkJCSBnX2hpZl9kZWJ1Z19kZXNjcmlwdGlvbik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BVEhfUENJRV9BQ0NFU1NfREVCVUcKK3NwaW5sb2NrX3QgcGNpZV9hY2Nlc3NfbG9nX2xvY2s7Cit1bnNpZ25lZCBpbnQgcGNpZV9hY2Nlc3NfbG9nX3NlcW51bSA9IDA7CitISUZfQUNDRVNTX0xPRyBwY2llX2FjY2Vzc19sb2dbUENJRV9BQ0NFU1NfTE9HX05VTV07CitzdGF0aWMgdm9pZCBoaWZfdGFyZ2V0X2R1bXBfYWNjZXNzX2xvZyh2b2lkKTsKKyNlbmRpZgorCisvKgorICogSG9zdCBzb2Z0d2FyZSdzIENvcHkgRW5naW5lIGNvbmZpZ3VyYXRpb24uCisgKiBUaGlzIHRhYmxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgQ0VfUENJIFRBQkxFLCBhYm92ZS4KKyAqLworI2lmZGVmIEJJR19FTkRJQU5fSE9TVAorI2RlZmluZSBDRV9BVFRSX0ZMQUdTIENFX0FUVFJfQllURV9TV0FQX0RBVEEKKyNlbHNlCisjZGVmaW5lIENFX0FUVFJfRkxBR1MgMAorI2VuZGlmCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIENvcHkgRW5naW5lJ3Mgc3VwcG9ydGVkICovCisjZGVmaW5lIENFX0hUVF9IMlRfTVNHX1NSQ19ORU5UUklFUyAyMDQ4CisKKyNkZWZpbmUgRElBR19DRV9JRCAgICAgICAgICAgNworI2RlZmluZSBFUFBJTkdfQ0VfRkxBR1NfUE9MTCBcCisJKENFX0FUVFJfRElTQUJMRV9JTlRSfENFX0FUVFJfRU5BQkxFX1BPTEx8Q0VfQVRUUl9GTEFHUykKKyNpZmRlZiBRQ0FfV0lGSV8zXzAKK3N0YXRpYyBzdHJ1Y3QgQ0VfYXR0ciBob3N0X2NlX2NvbmZpZ193bGFuW10gPSB7CisJLyogaG9zdC0+dGFyZ2V0IEhUQyBjb250cm9sIGFuZCByYXcgc3RyZWFtcyAqLworCXsgLyogQ0UwICovIENFX0FUVFJfRkxBR1MsIDAsIDE2LCAyMDQ4LCAwLCBOVUxMLH0sCisJLyogdGFyZ2V0LT5ob3N0IEhUVCArIEhUQyBjb250cm9sICovCisJeyAvKiBDRTEgKi8gQ0VfQVRUUl9GTEFHUywgMCwgMCwgIDIwNDgsIDUxMiwgTlVMTCx9LAorCS8qIHRhcmdldC0+aG9zdCBXTUkgKi8KKwl7IC8qIENFMiAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAwLCAgMjA0OCwgMzIsIE5VTEwsfSwKKwkvKiBob3N0LT50YXJnZXQgV01JICovCisJeyAvKiBDRTMgKi8gQ0VfQVRUUl9GTEFHUywgMCwgMzIsIDIwNDgsIDAsIE5VTEwsfSwKKwkvKiBob3N0LT50YXJnZXQgSFRUICovCisJeyAvKiBDRTQgKi8gKENFX0FUVFJfRkxBR1MgfCBDRV9BVFRSX0RJU0FCTEVfSU5UUiksIDAsCisJCUNFX0hUVF9IMlRfTVNHX1NSQ19ORU5UUklFUywgMjU2LCAwLCBOVUxMLH0sCisJLyogaXBhX3VjLT50YXJnZXQgSFRDIGNvbnRyb2wgKi8KKwl7IC8qIENFNSAqLyAoQ0VfQVRUUl9GTEFHUyB8IENFX0FUVFJfRElTQUJMRV9JTlRSKSwgMCwKKwkJMTAyNCwgNTEyLCAwLCBOVUxMLH0sCisJLyogVGFyZ2V0IGF1dG9ub21vdXMgSElGX21lbWNweSAqLworCXsgLyogQ0U2ICovIENFX0FUVFJfRkxBR1MsIDAsIDAsIDAsIDAsIE5VTEwsfSwKKwkvKiBjZV9kaWFnLCB0aGUgRGlhZ25vc3RpYyBXaW5kb3cgKi8KKwl7IC8qIENFNyAqLyAoQ0VfQVRUUl9GTEFHUyB8IENFX0FUVFJfRElTQUJMRV9JTlRSKSwgMCwKKwkJMiwgRElBR19UUkFOU0ZFUl9MSU1JVCwgMiwgTlVMTCx9LAorfTsKKworc3RhdGljIHN0cnVjdCBDRV9waXBlX2NvbmZpZyB0YXJnZXRfY2VfY29uZmlnX3dsYW5bXSA9IHsKKwkvKiBob3N0LT50YXJnZXQgSFRDIGNvbnRyb2wgYW5kIHJhdyBzdHJlYW1zICovCisJeyAvKiBDRTAgKi8gMCwgUElQRURJUl9PVVQsIDMyLCAyMDQ4LCBDRV9BVFRSX0ZMQUdTLCAwLH0sCisJLyogdGFyZ2V0LT5ob3N0IEhUVCAqLworCXsgLyogQ0UxICovIDEsIFBJUEVESVJfSU4sICAzMiwgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIHRhcmdldC0+aG9zdCBXTUkgICsgSFRDIGNvbnRyb2wgKi8KKwl7IC8qIENFMiAqLyAyLCBQSVBFRElSX0lOLCAgMzIsIDIwNDgsIENFX0FUVFJfRkxBR1MsIDAsfSwKKwkvKiBob3N0LT50YXJnZXQgV01JICovCisJeyAvKiBDRTMgKi8gMywgUElQRURJUl9PVVQsIDMyLCAyMDQ4LCBDRV9BVFRSX0ZMQUdTLCAwLH0sCisJLyogaG9zdC0+dGFyZ2V0IEhUVCAqLworCXsgLyogQ0U0ICovIDQsIFBJUEVESVJfT1VULCAyNTYsIDI1NiwKKwkJKENFX0FUVFJfRkxBR1MgfCBDRV9BVFRSX0RJU0FCTEVfSU5UUiksIDAsfSwKKwkvKiBOQjogNTAlIG9mIHNyYyBuZW50cmllcywgc2luY2UgdHggaGFzIDIgZnJhZ3MgKi8KKwkvKiBpcGFfdWMtPnRhcmdldCAqLworCXsgLyogQ0U1ICovIDUsIFBJUEVESVJfT1VULCAxMDI0LCAgIDY0LAorCQkoQ0VfQVRUUl9GTEFHUyB8IENFX0FUVFJfRElTQUJMRV9JTlRSKSwgMCx9LAorCS8qIFJlc2VydmVkIGZvciB0YXJnZXQgYXV0b25vbW91cyBISUZfbWVtY3B5ICovCisJeyAvKiBDRTYgKi8gNiwgUElQRURJUl9JTk9VVCwgMzIsIDQwOTYsIENFX0FUVFJfRkxBR1MsIDAsfSwKKwkvKiBDRTcgdXNlZCBvbmx5IGJ5IEhvc3QgKi8KKwl7IC8qIENFNyAqLyA3LCBQSVBFRElSX0lOT1VUX0gySCwgMCwgMCwKKwkJKENFX0FUVFJfRkxBR1MgfCBDRV9BVFRSX0RJU0FCTEVfSU5UUiksIDAsfSwKKwkvKiBDRTggdXNlZCBvbmx5IGJ5IElQQSAqLworCXsgLyogQ0U4ICovIDgsIFBJUEVESVJfSU4sIDMyLCAyMDQ4LCBDRV9BVFRSX0ZMQUdTLCAwLH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgQ0VfYXR0ciBob3N0X2NlX2NvbmZpZ193bGFuX2VwcGluZ19wb2xsW10gPSB7CisJLyogaG9zdC0+dGFyZ2V0IEhUQyBjb250cm9sIGFuZCByYXcgc3RyZWFtcyAqLworCXsgLyogQ0UwICovIENFX0FUVFJfRkxBR1MsIDAsIDE2LCAyMDQ4LCAwLCBOVUxMLH0sCisJLyogdGFyZ2V0LT5ob3N0IEVQLXBpbmcgKi8KKwl7IC8qIENFMSAqLyBFUFBJTkdfQ0VfRkxBR1NfUE9MTCwgMCwgMCwgMjA0OCwgMTI4LCBOVUxMLH0sCisJLyogdGFyZ2V0LT5ob3N0IEVQLXBpbmcgKi8KKwl7IC8qIENFMiAqLyBFUFBJTkdfQ0VfRkxBR1NfUE9MTCwgMCwgMCwgMjA0OCwgMTI4LCBOVUxMLH0sCisJLyogaG9zdC0+dGFyZ2V0IEVQLXBpbmcgKi8KKwl7IC8qIENFMyAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAxMjgsIDIwNDgsIDAsIE5VTEwsfSwKKwkvKiBob3N0LT50YXJnZXQgRVAtcGluZyAqLworCXsgLyogQ0U0ICovIENFX0FUVFJfRkxBR1MsIDAsIDEyOCwgMjA0OCwgMCwgTlVMTCx9LAorCS8qIEVQLXBpbmcgaGVhcnRiZWF0ICovCisJeyAvKiBDRTUgKi8gQ0VfQVRUUl9GTEFHUywgMCwgMCwgICAyMDQ4LCAxMjgsIE5VTEwsfSwKKwkvKiB1bnVzZWQgKi8KKwl7IC8qIENFNiAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAwLCAgIDAsIDAsIE5VTEwsfSwKKwkvKiBjZV9kaWFnLCB0aGUgRGlhZ25vc3RpYyBXaW5kb3cgKi8KKwl7IC8qIENFNyAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAyLCAgIERJQUdfVFJBTlNGRVJfTElNSVQsIDIsIE5VTEwsfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgQ0VfYXR0ciBob3N0X2NlX2NvbmZpZ193bGFuX2VwcGluZ19pcnFbXSA9IHsKKwkvKiBob3N0LT50YXJnZXQgSFRDIGNvbnRyb2wgYW5kIHJhdyBzdHJlYW1zICovCisJeyAvKiBDRTAgKi8gQ0VfQVRUUl9GTEFHUywgMCwgIDE2LCAyMDQ4LCAwLCBOVUxMLH0sCisJLyogdGFyZ2V0LT5ob3N0IEVQLXBpbmcgKi8KKwl7IC8qIENFMSAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAgIDAsIDIwNDgsIDEyOCwgTlVMTCx9LAorCS8qIHRhcmdldC0+aG9zdCBFUC1waW5nICovCisJeyAvKiBDRTIgKi8gQ0VfQVRUUl9GTEFHUywgMCwgICAwLCAyMDQ4LCAxMjgsIE5VTEwsfSwKKwkvKiBob3N0LT50YXJnZXQgRVAtcGluZyAqLworCXsgLyogQ0UzICovIENFX0FUVFJfRkxBR1MsIDAsIDEyOCwgMjA0OCwgMCwgTlVMTCx9LAorCS8qIGhvc3QtPnRhcmdldCBFUC1waW5nICovCisJeyAvKiBDRTQgKi8gQ0VfQVRUUl9GTEFHUywgMCwgMTI4LCAyMDQ4LCAwLCBOVUxMLH0sCisJLyogRVAtcGluZyBoZWFydGJlYXQgKi8KKwl7IC8qIENFNSAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAgIDAsIDIwNDgsIDEyOCwgTlVMTCx9LAorCS8qIHVudXNlZCAqLworCXsgLyogQ0U2ICovIENFX0FUVFJfRkxBR1MsIDAsICAgMCwgMCwgMCwgTlVMTCx9LAorCS8qIGNlX2RpYWcsIHRoZSBEaWFnbm9zdGljIFdpbmRvdyAqLworCXsgLyogQ0U3ICovIENFX0FUVFJfRkxBR1MsIDAsICAgMiwgRElBR19UUkFOU0ZFUl9MSU1JVCwgMiwgTlVMTCx9LAorfTsKKy8qCisgKiBFUC1waW5nIGZpcm13YXJlJ3MgQ0UgY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgc3RydWN0IENFX3BpcGVfY29uZmlnIHRhcmdldF9jZV9jb25maWdfd2xhbl9lcHBpbmdbXSA9IHsKKwkvKiBob3N0LT50YXJnZXQgSFRDIGNvbnRyb2wgYW5kIHJhdyBzdHJlYW1zICovCisJeyAvKiBDRTAgKi8gMCwgUElQRURJUl9PVVQsICAxNiwgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIHRhcmdldC0+aG9zdCBFUC1waW5nICovCisJeyAvKiBDRTEgKi8gMSwgUElQRURJUl9JTiwgIDEyOCwgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIHRhcmdldC0+aG9zdCBFUC1waW5nICovCisJeyAvKiBDRTIgKi8gMiwgUElQRURJUl9JTiwgIDEyOCwgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIGhvc3QtPnRhcmdldCBFUC1waW5nICovCisJeyAvKiBDRTMgKi8gMywgUElQRURJUl9PVVQsIDEyOCwgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIGhvc3QtPnRhcmdldCBFUC1waW5nICovCisJeyAvKiBDRTQgKi8gNCwgUElQRURJUl9PVVQsIDEyOCwgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIEVQLXBpbmcgaGVhcnRiZWF0ICovCisJeyAvKiBDRTUgKi8gNSwgUElQRURJUl9JTiwgIDEyOCwgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIHVudXNlZCAqLworCXsgLyogQ0U2ICovIDYsIFBJUEVESVJfSU5PVVQsIDAsIDAsIENFX0FUVFJfRkxBR1MsIDAsfSwKKwkvKiBDRTcgdXNlZCBvbmx5IGJ5IEhvc3QgKi8KKwl7IC8qIENFNyAqLyA3LCBQSVBFRElSX0lOT1VUX0gySCwgMCwgMCwgMCwgMCx9LAorCS8qIENFOCB1c2VkIG9ubHkgYnkgSVBBICovCisJeyAvKiBDRTggKi8gOCwgUElQRURJUl9JTiwgMzIsIDIwNDgsIENFX0FUVFJfRkxBR1MsIDAsfQorfTsKKyNlbHNlCitzdGF0aWMgc3RydWN0IENFX2F0dHIgaG9zdF9jZV9jb25maWdfd2xhbltdID0geworCS8qIGhvc3QtPnRhcmdldCBIVEMgY29udHJvbCBhbmQgcmF3IHN0cmVhbXMgKi8KKwl7IC8qIENFMCAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAxNiwgIDI1NiwgMCwgTlVMTCx9LAorCS8qIHRhcmdldC0+aG9zdCBIVFQgKyBIVEMgY29udHJvbCAqLworCXsgLyogQ0UxICovIENFX0FUVFJfRkxBR1MsIDAsIDAsICAyMDQ4LCA1MTIsIE5VTEwsfSwKKwkvKiB0YXJnZXQtPmhvc3QgV01JICovCisJeyAvKiBDRTIgKi8gQ0VfQVRUUl9GTEFHUywgMCwgMCwgIDIwNDgsIDMyLCBOVUxMLH0sCisJLyogaG9zdC0+dGFyZ2V0IFdNSSAqLworCXsgLyogQ0UzICovIENFX0FUVFJfRkxBR1MsIDAsIDMyLCAyMDQ4LCAwLCBOVUxMLH0sCisJLyogaG9zdC0+dGFyZ2V0IEhUVCAqLworCXsgLyogQ0U0ICovIENFX0FUVFJfRkxBR1MgfCBDRV9BVFRSX0RJU0FCTEVfSU5UUiwgMCwKKwkJQ0VfSFRUX0gyVF9NU0dfU1JDX05FTlRSSUVTLCAyNTYsIDAsIE5VTEwsfSwKKwkvKiBpcGFfdWMtPnRhcmdldCBIVEMgY29udHJvbCAqLworCXsgLyogQ0U1ICovIENFX0FUVFJfRkxBR1MgfCBDRV9BVFRSX0RJU0FCTEVfSU5UUiwgMCwKKwkJMTAyNCwgNTEyLCAwLCBOVUxMLH0sCisJLyogVGFyZ2V0IGF1dG9ub21vdXMgSElGX21lbWNweSAqLworCXsgLyogQ0U2ICovIENFX0FUVFJfRkxBR1MsIDAsIDAsIDAsIDAsIE5VTEwsfSwKKwkvKiBjZV9kaWFnLCB0aGUgRGlhZ25vc3RpYyBXaW5kb3cgKi8KKwl7IC8qIENFNyAqLyBDRV9BVFRSX0ZMQUdTIHwgQ0VfQVRUUl9ESVNBQkxFX0lOVFIsCisJCTAsIDIsIERJQUdfVFJBTlNGRVJfTElNSVQsIDIsIE5VTEwsfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgQ0VfcGlwZV9jb25maWcgdGFyZ2V0X2NlX2NvbmZpZ193bGFuW10gPSB7CisJLyogaG9zdC0+dGFyZ2V0IEhUQyBjb250cm9sIGFuZCByYXcgc3RyZWFtcyAqLworCXsgLyogQ0UwICovIDAsIFBJUEVESVJfT1VULCAzMiwgIDI1NiwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIHRhcmdldC0+aG9zdCBIVFQgKyBIVEMgY29udHJvbCAqLworCXsgLyogQ0UxICovIDEsIFBJUEVESVJfSU4sIDMyLCAgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIHRhcmdldC0+aG9zdCBXTUkgKi8KKwl7IC8qIENFMiAqLyAyLCBQSVBFRElSX0lOLCAzMiwgIDIwNDgsIENFX0FUVFJfRkxBR1MsIDAsfSwKKwkvKiBob3N0LT50YXJnZXQgV01JICovCisJeyAvKiBDRTMgKi8gMywgUElQRURJUl9PVVQsIDMyLCAyMDQ4LCBDRV9BVFRSX0ZMQUdTLCAwLH0sCisJLyogaG9zdC0+dGFyZ2V0IEhUVCAqLworCXsgLyogQ0U0ICovIDQsIFBJUEVESVJfT1VULCAyNTYsIDI1NiwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIE5COiA1MCUgb2Ygc3JjIG5lbnRyaWVzLCBzaW5jZSB0eCBoYXMgMiBmcmFncyAqLworCS8qIGlwYV91Yy0+dGFyZ2V0IEhUQyBjb250cm9sICovCisJeyAvKiBDRTUgKi8gNSwgUElQRURJUl9PVVQsIDEwMjQsICAgNjQsIENFX0FUVFJfRkxBR1MsIDAsfSwKKwkvKiBSZXNlcnZlZCBmb3IgdGFyZ2V0IGF1dG9ub21vdXMgSElGX21lbWNweSAqLworCXsgLyogQ0U2ICovIDYsIFBJUEVESVJfSU5PVVQsIDMyLCA0MDk2LCBDRV9BVFRSX0ZMQUdTLCAwLH0sCisJLyogQ0U3IHVzZWQgb25seSBieSBIb3N0ICovCisJeyAvKiBDRTcgKi8gNywgUElQRURJUl9JTk9VVF9IMkgsIDAsIDAsIDAsIDAsfSwKKwkvKiBDRTggdXNlZCBvbmx5IGJ5IElQQSAqLworCXsgLyogQ0U4ICovIDgsIFBJUEVESVJfSU4sIDMyLCAyMDQ4LCBDRV9BVFRSX0ZMQUdTLCAwLH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgQ0VfYXR0ciBob3N0X2NlX2NvbmZpZ193bGFuX2VwcGluZ19wb2xsW10gPSB7CisJLyogaG9zdC0+dGFyZ2V0IEhUQyBjb250cm9sIGFuZCByYXcgc3RyZWFtcyAqLworCXsgLyogQ0UwICovIENFX0FUVFJfRkxBR1MsIDAsIDE2LCAyNTYsIDAsIE5VTEwsfSwKKwkvKiB0YXJnZXQtPmhvc3QgRVAtcGluZyAqLworCXsgLyogQ0UxICovIEVQUElOR19DRV9GTEFHU19QT0xMLCAwLCAwLCAyMDQ4LCAxMjgsIE5VTEwsfSwKKwkvKiB0YXJnZXQtPmhvc3QgRVAtcGluZyAqLworCXsgLyogQ0UyICovIEVQUElOR19DRV9GTEFHU19QT0xMLCAwLCAwLCAyMDQ4LCAxMjgsIE5VTEwsfSwKKwkvKiBob3N0LT50YXJnZXQgRVAtcGluZyAqLworCXsgLyogQ0UzICovIENFX0FUVFJfRkxBR1MsIDAsIDEyOCwgMjA0OCwgMCwgTlVMTCx9LAorCS8qIGhvc3QtPnRhcmdldCBFUC1waW5nICovCisJeyAvKiBDRTQgKi8gQ0VfQVRUUl9GTEFHUywgMCwgMTI4LCAyMDQ4LCAwLCBOVUxMLH0sCisJLyogRVAtcGluZyBoZWFydGJlYXQgKi8KKwl7IC8qIENFNSAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAwLCAgIDIwNDgsIDEyOCwgTlVMTCx9LAorCS8qIHVudXNlZCAqLworCXsgLyogQ0U2ICovIENFX0FUVFJfRkxBR1MsIDAsIDAsICAgMCwgMCwgTlVMTCx9LAorCS8qIGNlX2RpYWcsIHRoZSBEaWFnbm9zdGljIFdpbmRvdyAqLworCXsgLyogQ0U3ICovIENFX0FUVFJfRkxBR1MsIDAsIDIsICAgRElBR19UUkFOU0ZFUl9MSU1JVCwgMiwgTlVMTCx9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgQ0VfYXR0ciBob3N0X2NlX2NvbmZpZ193bGFuX2VwcGluZ19pcnFbXSA9IHsKKwkvKiBob3N0LT50YXJnZXQgSFRDIGNvbnRyb2wgYW5kIHJhdyBzdHJlYW1zICovCisJeyAvKiBDRTAgKi8gQ0VfQVRUUl9GTEFHUywgMCwgMTYsIDI1NiwgMCwgTlVMTCx9LAorCS8qIHRhcmdldC0+aG9zdCBFUC1waW5nICovCisJeyAvKiBDRTEgKi8gQ0VfQVRUUl9GTEFHUywgMCwgMCwgMjA0OCwgMTI4LCBOVUxMLH0sCisJLyogdGFyZ2V0LT5ob3N0IEVQLXBpbmcgKi8KKwl7IC8qIENFMiAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAwLCAyMDQ4LCAxMjgsIE5VTEwsfSwKKwkvKiBob3N0LT50YXJnZXQgRVAtcGluZyAqLworCXsgLyogQ0UzICovIENFX0FUVFJfRkxBR1MsIDAsIDEyOCwgMjA0OCwgMCwgTlVMTCx9LAorCS8qIGhvc3QtPnRhcmdldCBFUC1waW5nICovCisJeyAvKiBDRTQgKi8gQ0VfQVRUUl9GTEFHUywgMCwgMTI4LCAyMDQ4LCAwLCBOVUxMLH0sCisJLyogRVAtcGluZyBoZWFydGJlYXQgKi8KKwl7IC8qIENFNSAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAwLCAyMDQ4LCAxMjgsIE5VTEwsfSwKKwkvKiB1bnVzZWQgKi8KKwl7IC8qIENFNiAqLyBDRV9BVFRSX0ZMQUdTLCAwLCAwLCAwLCAwLCBOVUxMLH0sCisJLyogY2VfZGlhZywgdGhlIERpYWdub3N0aWMgV2luZG93ICovCisJeyAvKiBDRTcgKi8gQ0VfQVRUUl9GTEFHUywgMCwgMiwgRElBR19UUkFOU0ZFUl9MSU1JVCwgMiwgTlVMTCx9LAorfTsKKy8qCisgKiBFUC1waW5nIGZpcm13YXJlJ3MgQ0UgY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgc3RydWN0IENFX3BpcGVfY29uZmlnIHRhcmdldF9jZV9jb25maWdfd2xhbl9lcHBpbmdbXSA9IHsKKwkvKiBob3N0LT50YXJnZXQgSFRDIGNvbnRyb2wgYW5kIHJhdyBzdHJlYW1zICovCisJeyAvKiBDRTAgKi8gMCwgUElQRURJUl9PVVQsIDE2LCAgIDI1NiwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIHRhcmdldC0+aG9zdCBFUC1waW5nICovCisJeyAvKiBDRTEgKi8gMSwgUElQRURJUl9JTiwgMTI4LCAgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIHRhcmdldC0+aG9zdCBFUC1waW5nICovCisJeyAvKiBDRTIgKi8gMiwgUElQRURJUl9JTiwgMTI4LCAgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIGhvc3QtPnRhcmdldCBFUC1waW5nICovCisJeyAvKiBDRTMgKi8gMywgUElQRURJUl9PVVQsIDEyOCwgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIGhvc3QtPnRhcmdldCBFUC1waW5nICovCisJeyAvKiBDRTQgKi8gNCwgUElQRURJUl9PVVQsIDEyOCwgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIEVQLXBpbmcgaGVhcnRiZWF0ICovCisJeyAvKiBDRTUgKi8gNSwgUElQRURJUl9JTiwgMTI4LCAgMjA0OCwgQ0VfQVRUUl9GTEFHUywgMCx9LAorCS8qIHVudXNlZCAqLworCXsgLyogQ0U2ICovIDYsIFBJUEVESVJfSU5PVVQsIDAsIDAsIENFX0FUVFJfRkxBR1MsIDAsfSwKKwkvKiBDRTcgdXNlZCBvbmx5IGJ5IEhvc3QgKi8KKwl7IC8qIENFNyAqLyA3LCBQSVBFRElSX0lOT1VUX0gySCwgMCwgMCwgMCwgMCx9LAorCS8qIENFOCB1c2VkIG9ubHkgYnkgSVBBICovCisJeyAvKiBDRTggKi8gOCwgUElQRURJUl9JTiwgMzIsIDIwNDgsIENFX0FUVFJfRkxBR1MsIDAsfQorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IENFX2F0dHIgKmhvc3RfY2VfY29uZmlnID0gaG9zdF9jZV9jb25maWdfd2xhbjsKK3N0YXRpYyBzdHJ1Y3QgQ0VfcGlwZV9jb25maWcgKnRhcmdldF9jZV9jb25maWcgPSB0YXJnZXRfY2VfY29uZmlnX3dsYW47CitzdGF0aWMgaW50IHRhcmdldF9jZV9jb25maWdfc3ogPSBzaXplb2YodGFyZ2V0X2NlX2NvbmZpZ193bGFuKTsKKyNlbmRpZiAvKiBfX0hJRl9QQ0lfSU5URVJOQUxfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvY2UvY2VfYm1pLmMgYi9jb3JlL2hpZi9zcmMvY2UvY2VfYm1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkNTQxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9jZS9jZV9ibWkuYwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxvc2RlcC5oPgorI2luY2x1ZGUgImFfdHlwZXMuaCIKKyNpbmNsdWRlICJhdGhkZWZzLmgiCisjaW5jbHVkZSAib3NhcGlfbGludXguaCIKKyNpbmNsdWRlICJ0YXJnY2ZnLmgiCisjaW5jbHVkZSAiY2RmX2xvY2suaCIKKyNpbmNsdWRlICJjZGZfc3RhdHVzLmgiCisjaW5jbHVkZSA8Y2RmX2F0b21pYy5oPiAgICAgICAgIC8qIGNkZl9hdG9taWNfcmVhZCAqLworI2luY2x1ZGUgPHRhcmdhZGRycy5oPgorI2luY2x1ZGUgPGJtaV9tc2cuaD4KKyNpbmNsdWRlICJoaWZfaW8zMi5oIgorI2luY2x1ZGUgPGhpZi5oPgorI2luY2x1ZGUgInJlZ3RhYmxlLmgiCisjZGVmaW5lIEFUSF9NT0RVTEVfTkFNRSBoaWYKKyNpbmNsdWRlIDxhX2RlYnVnLmg+CisjaW5jbHVkZSAiaGlmX21haW4uaCIKKyNpbmNsdWRlICJjZV9hcGkuaCIKKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2Vsc2UKKyNpbmNsdWRlICJjbnNzX3N0dWIuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGNkc19nZXRfYmluLmg+CisjaW5jbHVkZSAiZXBwaW5nX21haW4uaCIKKyNpbmNsdWRlICJoaWZfZGVidWcuaCIKKworLyogVHJhY2sgYSBCTUkgdHJhbnNhY3Rpb24gdGhhdCBpcyBpbiBwcm9ncmVzcyAqLworI2lmbmRlZiBCSVQKKyNkZWZpbmUgQklUKG4pICgxIDw8IChuKSkKKyNlbmRpZgorCitlbnVtIHsKKwlCTUlfUkVRX1NFTkRfRE9ORSA9IEJJVCgwKSwgICAvKiB0aGUgYm1pIHR4IGNvbXBsZXRpb24gKi8KKwlCTUlfUkVTUF9SRUNWX0RPTkUgPSBCSVQoMSksICAvKiB0aGUgYm1pIHJlc3BvbmQgaXMgcmVjZWl2ZWQgKi8KK307CisKK3N0cnVjdCBCTUlfdHJhbnNhY3Rpb24geworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZTsKKwljZGZfc2VtYXBob3JlX3QgYm1pX3RyYW5zYWN0aW9uX3NlbTsKKwl1aW50OF90ICpibWlfcmVxdWVzdF9ob3N0OyAgICAgICAgLyogUmVxIEJNSSBtc2cgaW4gSG9zdCBhZGRyIHNwYWNlICovCisJY2RmX2RtYV9hZGRyX3QgYm1pX3JlcXVlc3RfQ0U7ICAgIC8qIFJlcSBCTUkgbXNnIGluIENFIGFkZHIgc3BhY2UgKi8KKwl1aW50MzJfdCBibWlfcmVxdWVzdF9sZW5ndGg7ICAgICAgLyogTGVuZ3RoIG9mIEJNSSByZXF1ZXN0ICovCisJdWludDhfdCAqYm1pX3Jlc3BvbnNlX2hvc3Q7ICAgICAgIC8qIFJzcCBCTUkgbXNnIGluIEhvc3QgYWRkciBzcGFjZSAqLworCWNkZl9kbWFfYWRkcl90IGJtaV9yZXNwb25zZV9DRTsgICAvKiBSc3AgQk1JIG1zZyBpbiBDRSBhZGRyIHNwYWNlICovCisJdW5zaWduZWQgaW50IGJtaV9yZXNwb25zZV9sZW5ndGg7IC8qIExlbmd0aCBvZiByZWNlaXZlZCByZXNwb25zZSAqLworCXVuc2lnbmVkIGludCBibWlfdGltZW91dF9tczsKKwl1aW50MzJfdCBibWlfdHJhbnNhY3Rpb25fZmxhZ3M7ICAgLyogZmxhZ3MgZm9yIHRoZSB0cmFuc2NhdGlvbiAqLworfTsKKworLyoKKyAqIHNlbmQvcmVjdiBjb21wbGV0aW9uIGZ1bmN0aW9ucyBmb3IgQk1JLgorICogTkI6IFRoZSAibmV0X2J1ZiIgcGFyYW1ldGVyIGlzIGFjdHVhbGx5IGp1c3QgYQorICogc3RyYWlnaHQgYnVmZmVyLCBub3QgYW4gc2tfYnVmZi4KKyAqLwordm9pZCBoaWZfYm1pX3NlbmRfZG9uZShzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLCB2b2lkICpjZV9jb250ZXh0LAorCQkgIHZvaWQgKnRyYW5zZmVyX2NvbnRleHQsIGNkZl9kbWFfYWRkcl90IGRhdGEsCisJCSAgdW5zaWduZWQgaW50IG5ieXRlcywKKwkJICB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfaWQsIHVuc2lnbmVkIGludCBzd19pbmRleCwKKwkJICB1bnNpZ25lZCBpbnQgaHdfaW5kZXgsIHVpbnQzMl90IHRvZXBsaXR6X2hhc2hfcmVzdWx0KQoreworCXN0cnVjdCBCTUlfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uID0KKwkJKHN0cnVjdCBCTUlfdHJhbnNhY3Rpb24gKil0cmFuc2Zlcl9jb250ZXh0OworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gdHJhbnNhY3Rpb24tPmhpZl9zdGF0ZS0+c2NuOworCisjaWZkZWYgQk1JX1JTUF9QT0xMSU5HCisJLyoKKwkgKiBGaXggRVYxMTg3ODMsIFJlbGVhc2UgYSBzZW1hcGhvcmUgYWZ0ZXIgc2VuZGluZworCSAqIG5vIG1hdHRlciB3aGV0aGVyIGEgcmVzcG9uc2UgaXMgYmVlbiBleHBlY3Rpbmcgbm93LgorCSAqLworCWNkZl9zZW1hcGhvcmVfcmVsZWFzZShzY24tPmNkZl9kZXYsCisJCQkgICAgICAmdHJhbnNhY3Rpb24tPmJtaV90cmFuc2FjdGlvbl9zZW0pOworI2Vsc2UKKwkvKgorCSAqIElmIGEgcmVzcG9uc2UgaXMgYW50aWNpcGF0ZWQsIHdlJ2xsIGNvbXBsZXRlIHRoZQorCSAqIHRyYW5zYWN0aW9uIGlmIHRoZSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZC4KKwkgKiBJZiBubyByZXNwb25zZSBpcyBhbnRpY2lwYXRlZCwgY29tcGxldGUgdGhlCisJICogdHJhbnNhY3Rpb24gbm93LgorCSAqLworCXRyYW5zYWN0aW9uLT5ibWlfdHJhbnNhY3Rpb25fZmxhZ3MgfD0gQk1JX1JFUV9TRU5EX0RPTkU7CisKKwkvKiByZXNwIGlzJ3QgbmVlZGVkIG9yIGhhcyBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQsCisJICogbmV2ZXIgYXNzdW1lIHJlc3AgY29tZXMgbGF0ZXIgdGhlbiB0aGlzICovCisJaWYgKCF0cmFuc2FjdGlvbi0+Ym1pX3Jlc3BvbnNlX0NFIHx8CisJICAgICh0cmFuc2FjdGlvbi0+Ym1pX3RyYW5zYWN0aW9uX2ZsYWdzICYgQk1JX1JFU1BfUkVDVl9ET05FKSkgeworCQljZGZfc2VtYXBob3JlX3JlbGVhc2Uoc2NuLT5jZGZfZGV2LAorCQkJCSAgICAgICZ0cmFuc2FjdGlvbi0+Ym1pX3RyYW5zYWN0aW9uX3NlbSk7CisJfQorI2VuZGlmCit9CisKKyNpZm5kZWYgQk1JX1JTUF9QT0xMSU5HCit2b2lkIGhpZl9ibWlfcmVjdl9kYXRhKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcsIHZvaWQgKmNlX2NvbnRleHQsCisJCSAgdm9pZCAqdHJhbnNmZXJfY29udGV4dCwgY2RmX2RtYV9hZGRyX3QgZGF0YSwKKwkJICB1bnNpZ25lZCBpbnQgbmJ5dGVzLAorCQkgIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9pZCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBCTUlfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uID0KKwkJKHN0cnVjdCBCTUlfdHJhbnNhY3Rpb24gKil0cmFuc2Zlcl9jb250ZXh0OworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gdHJhbnNhY3Rpb24tPmhpZl9zdGF0ZS0+c2NuOworCisJdHJhbnNhY3Rpb24tPmJtaV9yZXNwb25zZV9sZW5ndGggPSBuYnl0ZXM7CisJdHJhbnNhY3Rpb24tPmJtaV90cmFuc2FjdGlvbl9mbGFncyB8PSBCTUlfUkVTUF9SRUNWX0RPTkU7CisKKwkvKiB3aGVuIGJvdGggc2VuZC9yZWN2IGFyZSBkb25lLCB0aGUgc2VtIGNhbiBiZSByZWxlYXNlZCAqLworCWlmICh0cmFuc2FjdGlvbi0+Ym1pX3RyYW5zYWN0aW9uX2ZsYWdzICYgQk1JX1JFUV9TRU5EX0RPTkUpIHsKKwkJY2RmX3NlbWFwaG9yZV9yZWxlYXNlKHNjbi0+Y2RmX2RldiwKKwkJCQkgICAgICAmdHJhbnNhY3Rpb24tPmJtaV90cmFuc2FjdGlvbl9zZW0pOworCX0KK30KKyNlbmRpZgorCitDREZfU1RBVFVTIGhpZl9leGNoYW5nZV9ibWlfbXNnKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLAorCQkgICAgIHVpbnQ4X3QgKmJtaV9yZXF1ZXN0LAorCQkgICAgIHVpbnQzMl90IHJlcXVlc3RfbGVuZ3RoLAorCQkgICAgIHVpbnQ4X3QgKmJtaV9yZXNwb25zZSwKKwkJICAgICB1aW50MzJfdCAqYm1pX3Jlc3BvbnNlX2xlbmd0aHAsIHVpbnQzMl90IFRpbWVvdXRNUykKK3sKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKXNjbi0+aGlmX2hkbDsKKwlzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqc2VuZF9waXBlX2luZm8gPQorCQkmKGhpZl9zdGF0ZS0+cGlwZV9pbmZvW0JNSV9DRV9OVU1fVE9fVEFSR10pOworCXN0cnVjdCBDRV9oYW5kbGUgKmNlX3NlbmRfaGRsID0gc2VuZF9waXBlX2luZm8tPmNlX2hkbDsKKwljZGZfZG1hX2FkZHJfdCBDRV9yZXF1ZXN0LCBDRV9yZXNwb25zZSA9IDA7CisJc3RydWN0IEJNSV90cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24gPSBOVUxMOworCWludCBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJc3RydWN0IEhJRl9DRV9waXBlX2luZm8gKnJlY3ZfcGlwZV9pbmZvID0KKwkJJihoaWZfc3RhdGUtPnBpcGVfaW5mb1tCTUlfQ0VfTlVNX1RPX0hPU1RdKTsKKwlzdHJ1Y3QgQ0VfaGFuZGxlICpjZV9yZWN2ID0gcmVjdl9waXBlX2luZm8tPmNlX2hkbDsKKwl1bnNpZ25lZCBpbnQgbXV4X2lkID0gMDsKKwl1bnNpZ25lZCBpbnQgdHJhbnNhY3Rpb25faWQgPSAweGZmZmY7CisJdW5zaWduZWQgaW50IHVzZXJfZmxhZ3MgPSAwOworI2lmZGVmIEJNSV9SU1BfUE9MTElORworCWNkZl9kbWFfYWRkcl90IGJ1ZjsKKwl1bnNpZ25lZCBpbnQgY29tcGxldGVkX25ieXRlcywgaWQsIGZsYWdzOworCWludCBpOworI2VuZGlmCisKKwl0cmFuc2FjdGlvbiA9CisJCShzdHJ1Y3QgQk1JX3RyYW5zYWN0aW9uICopY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCp0cmFuc2FjdGlvbikpOworCWlmICh1bmxpa2VseSghdHJhbnNhY3Rpb24pKSB7CisJCUhJRl9FUlJPUigiJXM6IG5vIG1lbW9yeSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJdHJhbnNhY3Rpb25faWQgPSAobXV4X2lkICYgTVVYX0lEX01BU0spIHwKKwkJKHRyYW5zYWN0aW9uX2lkICYgVFJBTlNBQ1RJT05fSURfTUFTSyk7CisjaWZkZWYgUUNBX1dJRklfM18wCisJdXNlcl9mbGFncyAmPSBERVNDX0RBVEFfRkxBR19NQVNLOworI2VuZGlmCisJQV9UQVJHRVRfQUNDRVNTX0xJS0VMWShzY24pOworCisJLyogSW5pdGlhbGl6ZSBibWlfdHJhbnNhY3Rpb25fc2VtIHRvIGJsb2NrICovCisJY2RmX3NlbWFwaG9yZV9pbml0KCZ0cmFuc2FjdGlvbi0+Ym1pX3RyYW5zYWN0aW9uX3NlbSk7CisJY2RmX3NlbWFwaG9yZV9hY3F1aXJlKHNjbi0+Y2RmX2RldiwgJnRyYW5zYWN0aW9uLT5ibWlfdHJhbnNhY3Rpb25fc2VtKTsKKworCXRyYW5zYWN0aW9uLT5oaWZfc3RhdGUgPSBoaWZfc3RhdGU7CisJdHJhbnNhY3Rpb24tPmJtaV9yZXF1ZXN0X2hvc3QgPSBibWlfcmVxdWVzdDsKKwl0cmFuc2FjdGlvbi0+Ym1pX3JlcXVlc3RfbGVuZ3RoID0gcmVxdWVzdF9sZW5ndGg7CisJdHJhbnNhY3Rpb24tPmJtaV9yZXNwb25zZV9sZW5ndGggPSAwOworCXRyYW5zYWN0aW9uLT5ibWlfdGltZW91dF9tcyA9IFRpbWVvdXRNUzsKKwl0cmFuc2FjdGlvbi0+Ym1pX3RyYW5zYWN0aW9uX2ZsYWdzID0gMDsKKworCS8qCisJICogQ0VfcmVxdWVzdCA9IGRtYV9tYXBfc2luZ2xlKGRldiwKKwkgKiAodm9pZCAqKWJtaV9yZXF1ZXN0LCByZXF1ZXN0X2xlbmd0aCwgRE1BX1RPX0RFVklDRSk7CisJICovCisJQ0VfcmVxdWVzdCA9IHNjbi0+Ym1pX2NtZF9kYTsKKwl0cmFuc2FjdGlvbi0+Ym1pX3JlcXVlc3RfQ0UgPSBDRV9yZXF1ZXN0OworCisJaWYgKGJtaV9yZXNwb25zZSkgeworCisJCS8qCisJCSAqIENFX3Jlc3BvbnNlID0gZG1hX21hcF9zaW5nbGUoZGV2LCBibWlfcmVzcG9uc2UsCisJCSAqIEJNSV9EQVRBU1pfTUFYLCBETUFfRlJPTV9ERVZJQ0UpOworCQkgKi8KKwkJQ0VfcmVzcG9uc2UgPSBzY24tPmJtaV9yc3BfZGE7CisJCXRyYW5zYWN0aW9uLT5ibWlfcmVzcG9uc2VfaG9zdCA9IGJtaV9yZXNwb25zZTsKKwkJdHJhbnNhY3Rpb24tPmJtaV9yZXNwb25zZV9DRSA9IENFX3Jlc3BvbnNlOworCQkvKiBkbWFfY2FjaGVfc3luYyhkZXYsIGJtaV9yZXNwb25zZSwKKwkJICAgIEJNSV9EQVRBU1pfTUFYLCBETUFfRlJPTV9ERVZJQ0UpOyAqLworCQljZGZfb3NfbWVtX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNjbi0+Y2RmX2RldiwKKwkJCQkJICAgICAgIENFX3Jlc3BvbnNlLAorCQkJCQkgICAgICAgQk1JX0RBVEFTWl9NQVgsCisJCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCQljZV9yZWN2X2J1Zl9lbnF1ZXVlKGNlX3JlY3YsIHRyYW5zYWN0aW9uLAorCQkJCSAgICB0cmFuc2FjdGlvbi0+Ym1pX3Jlc3BvbnNlX0NFKTsKKwkJLyogTkI6IHNlZSBISUZfQk1JX3JlY3ZfZG9uZSAqLworCX0gZWxzZSB7CisJCXRyYW5zYWN0aW9uLT5ibWlfcmVzcG9uc2VfaG9zdCA9IE5VTEw7CisJCXRyYW5zYWN0aW9uLT5ibWlfcmVzcG9uc2VfQ0UgPSAwOworCX0KKworCS8qIGRtYV9jYWNoZV9zeW5jKGRldiwgYm1pX3JlcXVlc3QsIHJlcXVlc3RfbGVuZ3RoLCBETUFfVE9fREVWSUNFKTsgKi8KKwljZGZfb3NfbWVtX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNjbi0+Y2RmX2RldiwgQ0VfcmVxdWVzdCwKKwkJCQkgICAgICAgcmVxdWVzdF9sZW5ndGgsIERNQV9UT19ERVZJQ0UpOworCisJc3RhdHVzID0KKwkJY2Vfc2VuZChjZV9zZW5kX2hkbCwgdHJhbnNhY3Rpb24sCisJCQlDRV9yZXF1ZXN0LCByZXF1ZXN0X2xlbmd0aCwKKwkJCXRyYW5zYWN0aW9uX2lkLCAwLCB1c2VyX2ZsYWdzKTsKKwlBU1NFUlQoc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUyk7CisJLyogTkI6IHNlZSBoaWZfYm1pX3NlbmRfZG9uZSAqLworCisJLyogVEJEWFhYOiBoYW5kbGUgdGltZW91dCAqLworCisJLyogV2FpdCBmb3IgQk1JIHJlcXVlc3QvcmVzcG9uc2UgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUgKi8KKwkvKiBBbHdheXMganVzdCB3YWl0IGZvciBCTUkgcmVxdWVzdCBoZXJlIGlmCisJICogQk1JX1JTUF9QT0xMSU5HIGlzIGRlZmluZWQgKi8KKwl3aGlsZSAoY2RmX3NlbWFwaG9yZV9hY3F1aXJlCisJCSAgICAgICAoc2NuLT5jZGZfZGV2LCAmdHJhbnNhY3Rpb24tPmJtaV90cmFuc2FjdGlvbl9zZW0pKSB7CisJCS8qbmVlZCBzb21lIGJyZWFrIG91dCBjb25kaXRpb24odGltZSBvdXQ/KSAqLworCX0KKworCWlmIChibWlfcmVzcG9uc2UpIHsKKyNpZmRlZiBCTUlfUlNQX1BPTExJTkcKKwkJLyogRml4IEVWMTE4NzgzLCBkbyBub3Qgd2FpdCBhIHNlbWFwaG9yZSBmb3IgdGhlIEJNSSByZXNwb25zZQorCQkgKiBzaW5jZSB0aGUgcmVsYXRpdmUgaW50ZXJydXB0aW9uIG1heSBiZSBsb3N0LgorCQkgKiBwb2xsIHRoZSBCTUkgcmVzcG9uc2UgaW5zdGVhZC4KKwkJICovCisJCWkgPSAwOworCQl3aGlsZSAoY2VfY29tcGxldGVkX3JlY3ZfbmV4dCgKKwkJCSAgICBjZV9yZWN2LCBOVUxMLCBOVUxMLCAmYnVmLAorCQkJICAgICZjb21wbGV0ZWRfbmJ5dGVzLCAmaWQsCisJCQkgICAgJmZsYWdzKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWlmIChpKysgPiBCTUlfUlNQX1RPX01JTExJU0VDKSB7CisJCQkJSElGX0VSUk9SKCIlczplcnJvciwgY2FuJ3QgZ2V0IGJtaSByZXNwb25zZVxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9CVVNZOworCQkJCWJyZWFrOworCQkJfQorCQkJT1NfREVMQVkoMTAwMCk7CisJCX0KKworCQlpZiAoKHN0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpICYmIGJtaV9yZXNwb25zZV9sZW5ndGhwKQorCQkJKmJtaV9yZXNwb25zZV9sZW5ndGhwID0gY29tcGxldGVkX25ieXRlczsKKyNlbHNlCisJCWlmICgoc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykgJiYgYm1pX3Jlc3BvbnNlX2xlbmd0aHApIHsKKwkJCSpibWlfcmVzcG9uc2VfbGVuZ3RocCA9CisJCQkJdHJhbnNhY3Rpb24tPmJtaV9yZXNwb25zZV9sZW5ndGg7CisJCX0KKyNlbmRpZgorCisJfQorCisJLyogZG1hX3VubWFwX3NpbmdsZShkZXYsIHRyYW5zYWN0aW9uLT5ibWlfcmVxdWVzdF9DRSwKKwkJcmVxdWVzdF9sZW5ndGgsIERNQV9UT19ERVZJQ0UpOyAqLworCS8qIGJ1c191bm1hcF9zaW5nbGUoc2NuLT5zY19vc2RldiwKKwkJIHRyYW5zYWN0aW9uLT5ibWlfcmVxdWVzdF9DRSwKKwkJcmVxdWVzdF9sZW5ndGgsIEJVU19ETUFfVE9ERVZJQ0UpOyAqLworCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJY2RmX2RtYV9hZGRyX3QgdW51c2VkX2J1ZmZlcjsKKwkJdW5zaWduZWQgaW50IHVudXNlZF9uYnl0ZXM7CisJCXVuc2lnbmVkIGludCB1bnVzZWRfaWQ7CisJCXVuc2lnbmVkIGludCB0b2VwbGl0el9oYXNoX3Jlc3VsdDsKKworCQljZV9jYW5jZWxfc2VuZF9uZXh0KGNlX3NlbmRfaGRsLAorCQkJTlVMTCwgTlVMTCwgJnVudXNlZF9idWZmZXIsCisJCQkmdW51c2VkX25ieXRlcywgJnVudXNlZF9pZCwKKwkJCSZ0b2VwbGl0el9oYXNoX3Jlc3VsdCk7CisJfQorCisJQV9UQVJHRVRfQUNDRVNTX1VOTElLRUxZKHNjbik7CisJY2RmX21lbV9mcmVlKHRyYW5zYWN0aW9uKTsKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvY29yZS9oaWYvc3JjL2NlL2NlX2JtaS5oIGIvY29yZS9oaWYvc3JjL2NlL2NlX2JtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWIyMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hpZi9zcmMvY2UvY2VfYm1pLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19DRV9CTUlfSF9fCisjZGVmaW5lIF9fQ0VfQk1JX0hfXworCisjaW5jbHVkZSA8Y2RmX2F0b21pYy5oPiAgICAgICAgIC8qIGNkZl9hdG9taWNfcmVhZCAqLworI2luY2x1ZGUgImNkZl9sb2NrLmgiCisjaW5jbHVkZSAiY2VfYXBpLmgiCisjaW5jbHVkZSAiY2VwY2kuaCIKKwordm9pZCBoaWZfYm1pX3JlY3ZfZGF0YShzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLCB2b2lkICpjZV9jb250ZXh0LAorCQkgIHZvaWQgKnRyYW5zZmVyX2NvbnRleHQsIGNkZl9kbWFfYWRkcl90IGRhdGEsCisJCSAgdW5zaWduZWQgaW50IG5ieXRlcywKKwkJICB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfaWQsIHVuc2lnbmVkIGludCBmbGFncyk7Cit2b2lkIGhpZl9ibWlfc2VuZF9kb25lKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcsIHZvaWQgKmNlX2NvbnRleHQsCisJCSAgdm9pZCAqdHJhbnNmZXJfY29udGV4dCwgY2RmX2RtYV9hZGRyX3QgZGF0YSwKKwkJICB1bnNpZ25lZCBpbnQgbmJ5dGVzLAorCQkgIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9pZCwgdW5zaWduZWQgaW50IHN3X2luZGV4LAorCQkgIHVuc2lnbmVkIGludCBod19pbmRleCwgdWludDMyX3QgdG9lcGxpdHpfaGFzaF9yZXN1bHQpOworI2VuZGlmIC8qIF9fQ0VfQk1JX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oaWYvc3JjL2NlL2NlX2RpYWcuYyBiL2NvcmUvaGlmL3NyYy9jZS9jZV9kaWFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3OGYyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9jZS9jZV9kaWFnLmMKQEAgLTAsMCArMSw0NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8b3NkZXAuaD4KKyNpbmNsdWRlICJhX3R5cGVzLmgiCisjaW5jbHVkZSAiYXRoZGVmcy5oIgorI2luY2x1ZGUgIm9zYXBpX2xpbnV4LmgiCisjaW5jbHVkZSAidGFyZ2NmZy5oIgorI2luY2x1ZGUgImNkZl9sb2NrLmgiCisjaW5jbHVkZSAiY2RmX3N0YXR1cy5oIgorI2luY2x1ZGUgPGNkZl9hdG9taWMuaD4gICAgICAgICAvKiBjZGZfYXRvbWljX3JlYWQgKi8KKyNpbmNsdWRlIDx0YXJnYWRkcnMuaD4KKyNpbmNsdWRlIDxibWlfbXNnLmg+CisjaW5jbHVkZSAiaGlmX2lvMzIuaCIKKyNpbmNsdWRlIDxoaWYuaD4KKyNpbmNsdWRlIDxodGNfc2VydmljZXMuaD4KKyNpbmNsdWRlICJyZWd0YWJsZS5oIgorI2luY2x1ZGUgPGFfZGVidWcuaD4KKyNpbmNsdWRlICJoaWZfbWFpbi5oIgorI2luY2x1ZGUgImNlX2FwaS5oIgorI2luY2x1ZGUgImNkZl90cmFjZS5oIgorI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpZmRlZiBDT05GSUdfQ05TUworI2luY2x1ZGUgPG5ldC9jbnNzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjZHNfZ2V0X2Jpbi5oPgorI2luY2x1ZGUgImhpZl9kZWJ1Zy5oIgorI2luY2x1ZGUgImVwcGluZ19tYWluLmgiCisKK3ZvaWQgaGlmX2R1bXBfdGFyZ2V0X21lbW9yeShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdm9pZCAqcmFtZHVtcF9iYXNlLAorCQkJICAgIHVpbnQzMl90IGFkZHJlc3MsIHVpbnQzMl90IHNpemUpCit7CisJdWludDMyX3QgbG9jID0gYWRkcmVzczsKKwl1aW50MzJfdCB2YWwgPSAwOworCXVpbnQzMl90IGogPSAwOworCXU4ICp0ZW1wID0gcmFtZHVtcF9iYXNlOworCisJQV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbik7CisJd2hpbGUgKGogPCBzaXplKSB7CisJCXZhbCA9IGhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKyBsb2MgKyBqKTsKKwkJY2RmX21lbV9jb3B5KHRlbXAsICZ2YWwsIDQpOworCQlqICs9IDQ7CisJCXRlbXAgKz0gNDsKKwl9CisJQV9UQVJHRVRfQUNDRVNTX0VORChzY24pOworfQorLyoKKyAqIFRCRFhYWDogU2hvdWxkIGJlIGEgZnVuY3Rpb24gY2FsbCBzcGVjaWZpYyB0byBlYWNoIFRhcmdldC10eXBlLgorICogVGhpcyBjb252b2x1dGVkIG1hY3JvIGNvbnZlcnRzIGZyb20gVGFyZ2V0IENQVSBWaXJ0dWFsIEFkZHJlc3MKKyAqIFNwYWNlIHRvIENFIEFkZHJlc3MgU3BhY2UuIEFzIHBhcnQgb2YgdGhpcyBwcm9jZXNzLCB3ZQorICogY29uc2VydmF0aXZlbHkgZmV0Y2ggdGhlIGN1cnJlbnQgUENJRV9CQVIuIE1PU1Qgb2YgdGhlIHRpbWUsCisgKiB0aGlzIHNob3VsZCBtYXRjaCB0aGUgdXBwZXIgYml0cyBvZiBQQ0kgc3BhY2UgZm9yIHRoaXMgZGV2aWNlOworICogYnV0IHRoYXQncyBub3QgZ3VhcmFudGVlZC4KKyAqLworI2lmZGVmIFFDQV9XSUZJXzNfMAorI2RlZmluZSBUQVJHX0NQVV9TUEFDRV9UT19DRV9TUEFDRShwY2lfYWRkciwgYWRkcikgXAorCShzY24tPm1lbV9wYSArIGFkZHIpCisjZWxzZQorI2RlZmluZSBUQVJHX0NQVV9TUEFDRV9UT19DRV9TUEFDRShwY2lfYWRkciwgYWRkcikgXAorCSgoKGhpZl9yZWFkMzJfbWIoKHBjaV9hZGRyKSArIFwKKwkoU09DX0NPUkVfQkFTRV9BRERSRVNTfENPUkVfQ1RSTF9BRERSRVNTKSkgJiAweDdmZikgPDwgMjEpIFwKKwkgfCAweDEwMDAwMCB8ICgoYWRkcikgJiAweGZmZmZmKSkKKyNlbmRpZgorLyogV2FpdCB1cCB0byB0aGlzIG1hbnkgTXMgZm9yIGEgRGlhZ25vc3RpYyBBY2Nlc3MgQ0Ugb3BlcmF0aW9uIHRvIGNvbXBsZXRlICovCisjZGVmaW5lIERJQUdfQUNDRVNTX0NFX1RJTUVPVVRfTVMgMTAKKworLyoKKyAqIERpYWdub3N0aWMgcmVhZC93cml0ZSBhY2Nlc3MgaXMgcHJvdmlkZWQgZm9yIHN0YXJ0dXAvY29uZmlnL2RlYnVnIHVzYWdlLgorICogQ2FsbGVyIG11c3QgZ3VhcmFudGVlIHByb3BlciBhbGlnbm1lbnQsIHdoZW4gYXBwbGljYWJsZSwgYW5kIHNpbmdsZSB1c2VyCisgKiBhdCBhbnkgbW9tZW50LgorICovCisKK0NERl9TVEFUVVMKK2hpZl9kaWFnX3JlYWRfbWVtKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB1aW50MzJfdCBhZGRyZXNzLCB1aW50OF90ICpkYXRhLAorCQkgIGludCBuYnl0ZXMpCit7CisJc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX3N0YXRlOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWNkZl9kbWFfYWRkcl90IGJ1ZjsKKwl1bnNpZ25lZCBpbnQgY29tcGxldGVkX25ieXRlcywgb3JpZ19uYnl0ZXMsIHJlbWFpbmluZ19ieXRlczsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBDRV9oYW5kbGUgKmNlX2RpYWc7CisJY2RmX2RtYV9hZGRyX3QgQ0VfZGF0YTsgICAgICAvKiBIb3N0IGJ1ZmZlciBhZGRyZXNzIGluIENFIHNwYWNlICovCisJY2RmX2RtYV9hZGRyX3QgQ0VfZGF0YV9iYXNlID0gMDsKKwl2b2lkICpkYXRhX2J1ZiA9IE5VTEw7CisJaW50IGk7CisJdW5zaWduZWQgaW50IG11eF9pZCA9IDA7CisJdW5zaWduZWQgaW50IHRyYW5zYWN0aW9uX2lkID0gMHhmZmZmOworCWNkZl9kbWFfYWRkcl90IGNlX3BoeV9hZGRyID0gYWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgdG9lcGxpdHpfaGFzaF9yZXN1bHQ7CisJdW5zaWduZWQgaW50IHVzZXJfZmxhZ3MgPSAwOworCisJaGlmX3N0YXRlID0gKHN0cnVjdCBISUZfQ0Vfc3RhdGUgKilzY24tPmhpZl9oZGw7CisKKwl0cmFuc2FjdGlvbl9pZCA9IChtdXhfaWQgJiBNVVhfSURfTUFTSykgfAorCQkgKHRyYW5zYWN0aW9uX2lkICYgVFJBTlNBQ1RJT05fSURfTUFTSyk7CisjaWZkZWYgUUNBX1dJRklfM18wCisJdXNlcl9mbGFncyAmPSBERVNDX0RBVEFfRkxBR19NQVNLOworI2VuZGlmCisKKwkvKiBUaGlzIGNvZGUgY2Fubm90IGhhbmRsZSByZWFkcyB0byBub24tbWVtb3J5IHNwYWNlLiBSZWRpcmVjdCB0byB0aGUKKwkgKiByZWdpc3RlciByZWFkIGZuIGJ1dCBwcmVzZXJ2ZSB0aGUgbXVsdGkgd29yZCByZWFkIGNhcGFiaWxpdHkgb2YKKwkgKiB0aGlzIGZuCisJICovCisJaWYgKGFkZHJlc3MgPCBEUkFNX0JBU0VfQUREUkVTUykgeworCisJCWlmICgoYWRkcmVzcyAmIDB4MykgfHwgKCh1aW50cHRyX3QpIGRhdGEgJiAweDMpKQorCQkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKworCQl3aGlsZSAoKG5ieXRlcyA+PSA0KSAmJgorCQkgICAgICAgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSAoc3RhdHVzID0KKwkJCQkgaGlmX2RpYWdfcmVhZF9hY2Nlc3Moc2NuLCBhZGRyZXNzLAorCQkJCSAgICAgICAodWludDMyX3QgKilkYXRhKSkpKSB7CisKKwkJCW5ieXRlcyAtPSBzaXplb2YodWludDMyX3QpOworCQkJYWRkcmVzcyArPSBzaXplb2YodWludDMyX3QpOworCQkJZGF0YSArPSBzaXplb2YodWludDMyX3QpOworCisJCX0KKworCQlyZXR1cm4gc3RhdHVzOworCX0KKwljZV9kaWFnID0gaGlmX3N0YXRlLT5jZV9kaWFnOworCisJQV9UQVJHRVRfQUNDRVNTX0xJS0VMWShzY24pOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBib3VuY2UgYnVmZmVyIHRvIGhvbGQgY2FsbGVyJ3MgZGF0YQorCSAqIHRvIGJlIERNQSdlZCBmcm9tIFRhcmdldC4gVGhpcyBndWFyYW50ZWVzCisJICogICAxKSA0LWJ5dGUgYWxpZ25tZW50CisJICogICAyKSBCdWZmZXIgaW4gRE1BLWFibGUgc3BhY2UKKwkgKi8KKwlvcmlnX25ieXRlcyA9IG5ieXRlczsKKwlkYXRhX2J1ZiA9IGNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudChzY24tPmNkZl9kZXYsCisJCQkJICAgIG9yaWdfbmJ5dGVzLCAmQ0VfZGF0YV9iYXNlLCAwKTsKKwlpZiAoIWRhdGFfYnVmKSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZ290byBkb25lOworCX0KKwljZGZfbWVtX3NldChkYXRhX2J1Ziwgb3JpZ19uYnl0ZXMsIDApOworCWNkZl9vc19tZW1fZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc2NuLT5jZGZfZGV2LCBDRV9kYXRhX2Jhc2UsCisJCQkJICAgICAgIG9yaWdfbmJ5dGVzLCBETUFfRlJPTV9ERVZJQ0UpOworCisJcmVtYWluaW5nX2J5dGVzID0gb3JpZ19uYnl0ZXM7CisJQ0VfZGF0YSA9IENFX2RhdGFfYmFzZTsKKwl3aGlsZSAocmVtYWluaW5nX2J5dGVzKSB7CisJCW5ieXRlcyA9IG1pbihyZW1haW5pbmdfYnl0ZXMsIERJQUdfVFJBTlNGRVJfTElNSVQpOworCQl7CisJCQlzdGF0dXMgPSBjZV9yZWN2X2J1Zl9lbnF1ZXVlKGNlX2RpYWcsIE5VTEwsIENFX2RhdGEpOworCQkJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQkJZ290byBkb25lOworCQl9CisKKwkJewkvKiBSZXF1ZXN0IENFIHRvIHNlbmQgZnJvbSBUYXJnZXQoISkKKwkJCSAqIGFkZHJlc3MgdG8gSG9zdCBidWZmZXIgKi8KKwkJCS8qCisJCQkgKiBUaGUgYWRkcmVzcyBzdXBwbGllZCBieSB0aGUgY2FsbGVyIGlzIGluIHRoZQorCQkJICogVGFyZ2V0IENQVSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisJCQkgKgorCQkJICogSW4gb3JkZXIgdG8gdXNlIHRoaXMgYWRkcmVzcyB3aXRoIHRoZSBkaWFnbm9zdGljIENFLAorCQkJICogY29udmVydCBpdCBmcm9tCisJCQkgKiAgICBUYXJnZXQgQ1BVIHZpcnR1YWwgYWRkcmVzcyBzcGFjZQorCQkJICogdG8KKwkJCSAqICAgIENFIGFkZHJlc3Mgc3BhY2UKKwkJCSAqLworCQkJQV9UQVJHRVRfQUNDRVNTX0JFR0lOX1JFVChzY24pOworCQkJY2VfcGh5X2FkZHIgPQorCQkJCVRBUkdfQ1BVX1NQQUNFX1RPX0NFX1NQQUNFKHNjbi0+bWVtLCBhZGRyZXNzKTsKKwkJCUFfVEFSR0VUX0FDQ0VTU19FTkRfUkVUKHNjbik7CisKKwkJCXN0YXR1cyA9CisJCQkJY2Vfc2VuZChjZV9kaWFnLCBOVUxMLCBjZV9waHlfYWRkciwgbmJ5dGVzLAorCQkJCQl0cmFuc2FjdGlvbl9pZCwgMCwgdXNlcl9mbGFncyk7CisJCQlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJCQlnb3RvIGRvbmU7CisJCX0KKworCQlpID0gMDsKKwkJd2hpbGUgKGNlX2NvbXBsZXRlZF9zZW5kX25leHQoY2VfZGlhZywgTlVMTCwgTlVMTCwgJmJ1ZiwKKwkJCQkmY29tcGxldGVkX25ieXRlcywgJmlkLCBOVUxMLCBOVUxMLAorCQkJCSZ0b2VwbGl0el9oYXNoX3Jlc3VsdCkgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQljZGZfbWRlbGF5KDEpOworCQkJaWYgKGkrKyA+IERJQUdfQUNDRVNTX0NFX1RJTUVPVVRfTVMpIHsKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfQlVTWTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0KKwkJaWYgKG5ieXRlcyAhPSBjb21wbGV0ZWRfbmJ5dGVzKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlpZiAoYnVmICE9IGNlX3BoeV9hZGRyKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWkgPSAwOworCQl3aGlsZSAoY2VfY29tcGxldGVkX3JlY3ZfbmV4dAorCQkJCShjZV9kaWFnLCBOVUxMLCBOVUxMLCAmYnVmLAorCQkJCSZjb21wbGV0ZWRfbmJ5dGVzLCAmaWQsCisJCQkJICZmbGFncykgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQljZGZfbWRlbGF5KDEpOworCQkJaWYgKGkrKyA+IERJQUdfQUNDRVNTX0NFX1RJTUVPVVRfTVMpIHsKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfQlVTWTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0KKwkJaWYgKG5ieXRlcyAhPSBjb21wbGV0ZWRfbmJ5dGVzKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlpZiAoYnVmICE9IENFX2RhdGEpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJZ290byBkb25lOworCQl9CisKKwkJcmVtYWluaW5nX2J5dGVzIC09IG5ieXRlczsKKwkJYWRkcmVzcyArPSBuYnl0ZXM7CisJCUNFX2RhdGEgKz0gbmJ5dGVzOworCX0KKworZG9uZToKKwlBX1RBUkdFVF9BQ0NFU1NfVU5MSUtFTFkoc2NuKTsKKworCWlmIChzdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQljZGZfbWVtX2NvcHkoZGF0YSwgZGF0YV9idWYsIG9yaWdfbmJ5dGVzKTsKKwllbHNlCisJCUhJRl9FUlJPUigiJXMgZmFpbHVyZSAoMHgleCkiLCBfX2Z1bmNfXywgYWRkcmVzcyk7CisKKwlpZiAoZGF0YV9idWYpCisJCWNkZl9vc19tZW1fZnJlZV9jb25zaXN0ZW50KHNjbi0+Y2RmX2Rldiwgb3JpZ19uYnl0ZXMsCisJCQkJICAgIGRhdGFfYnVmLCBDRV9kYXRhX2Jhc2UsIDApOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogUmVhZCA0LWJ5dGUgYWxpZ25lZCBkYXRhIGZyb20gVGFyZ2V0IG1lbW9yeSBvciByZWdpc3RlciAqLworQ0RGX1NUQVRVUyBoaWZfZGlhZ19yZWFkX2FjY2VzcyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwKKwkJCQl1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGU7CisKKwloaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKXNjbi0+aGlmX2hkbDsKKwlpZiAoYWRkcmVzcyA+PSBEUkFNX0JBU0VfQUREUkVTUykgeworCQkvKiBBc3N1bWUgcmFuZ2UgZG9lc24ndCBjcm9zcyB0aGlzIGJvdW5kYXJ5ICovCisJCXJldHVybiBoaWZfZGlhZ19yZWFkX21lbShzY24sIGFkZHJlc3MsICh1aW50OF90ICopIGRhdGEsCisJCQkJCSBzaXplb2YodWludDMyX3QpKTsKKwl9IGVsc2UgeworCQlBX1RBUkdFVF9BQ0NFU1NfQkVHSU5fUkVUKHNjbik7CisJCSpkYXRhID0gQV9UQVJHRVRfUkVBRChzY24sIGFkZHJlc3MpOworCQlBX1RBUkdFVF9BQ0NFU1NfRU5EX1JFVChzY24pOworCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorfQorCitDREZfU1RBVFVTIGhpZl9kaWFnX3dyaXRlX21lbShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwKKwkJCSAgICAgIHVpbnQzMl90IGFkZHJlc3MsIHVpbnQ4X3QgKmRhdGEsIGludCBuYnl0ZXMpCit7CisJc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX3N0YXRlOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWNkZl9kbWFfYWRkcl90IGJ1ZjsKKwl1bnNpZ25lZCBpbnQgY29tcGxldGVkX25ieXRlcywgb3JpZ19uYnl0ZXMsIHJlbWFpbmluZ19ieXRlczsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBDRV9oYW5kbGUgKmNlX2RpYWc7CisJdm9pZCAqZGF0YV9idWYgPSBOVUxMOworCWNkZl9kbWFfYWRkcl90IENFX2RhdGE7ICAgICAgLyogSG9zdCBidWZmZXIgYWRkcmVzcyBpbiBDRSBzcGFjZSAqLworCWNkZl9kbWFfYWRkcl90IENFX2RhdGFfYmFzZSA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgaW50IG11eF9pZCA9IDA7CisJdW5zaWduZWQgaW50IHRyYW5zYWN0aW9uX2lkID0gMHhmZmZmOworCWNkZl9kbWFfYWRkcl90IGNlX3BoeV9hZGRyID0gYWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgdG9lcGxpdHpfaGFzaF9yZXN1bHQ7CisJdW5zaWduZWQgaW50IHVzZXJfZmxhZ3MgPSAwOworCisJaGlmX3N0YXRlID0gKHN0cnVjdCBISUZfQ0Vfc3RhdGUgKilzY24tPmhpZl9oZGw7CisJY2VfZGlhZyA9IGhpZl9zdGF0ZS0+Y2VfZGlhZzsKKwl0cmFuc2FjdGlvbl9pZCA9IChtdXhfaWQgJiBNVVhfSURfTUFTSykgfAorCQkodHJhbnNhY3Rpb25faWQgJiBUUkFOU0FDVElPTl9JRF9NQVNLKTsKKyNpZmRlZiBRQ0FfV0lGSV8zXzAKKwl1c2VyX2ZsYWdzICY9IERFU0NfREFUQV9GTEFHX01BU0s7CisjZW5kaWYKKworCUFfVEFSR0VUX0FDQ0VTU19MSUtFTFkoc2NuKTsKKworCS8qCisJICogQWxsb2NhdGUgYSB0ZW1wb3JhcnkgYm91bmNlIGJ1ZmZlciB0byBob2xkIGNhbGxlcidzIGRhdGEKKwkgKiB0byBiZSBETUEnZWQgdG8gVGFyZ2V0LiBUaGlzIGd1YXJhbnRlZXMKKwkgKiAgIDEpIDQtYnl0ZSBhbGlnbm1lbnQKKwkgKiAgIDIpIEJ1ZmZlciBpbiBETUEtYWJsZSBzcGFjZQorCSAqLworCW9yaWdfbmJ5dGVzID0gbmJ5dGVzOworCWRhdGFfYnVmID0gY2RmX29zX21lbV9hbGxvY19jb25zaXN0ZW50KHNjbi0+Y2RmX2RldiwKKwkJCQkgICAgb3JpZ19uYnl0ZXMsICZDRV9kYXRhX2Jhc2UsIDApOworCWlmICghZGF0YV9idWYpIHsKKwkJc3RhdHVzID0gQV9OT19NRU1PUlk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBDb3B5IGNhbGxlcidzIGRhdGEgdG8gYWxsb2NhdGVkIERNQSBidWYgKi8KKwljZGZfbWVtX2NvcHkoZGF0YV9idWYsIGRhdGEsIG9yaWdfbmJ5dGVzKTsKKwljZGZfb3NfbWVtX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNjbi0+Y2RmX2RldiwgQ0VfZGF0YV9iYXNlLAorCQkJCSAgICAgICBvcmlnX25ieXRlcywgRE1BX1RPX0RFVklDRSk7CisKKwkvKgorCSAqIFRoZSBhZGRyZXNzIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgaXMgaW4gdGhlCisJICogVGFyZ2V0IENQVSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisJICoKKwkgKiBJbiBvcmRlciB0byB1c2UgdGhpcyBhZGRyZXNzIHdpdGggdGhlIGRpYWdub3N0aWMgQ0UsCisJICogY29udmVydCBpdCBmcm9tCisJICogICAgVGFyZ2V0IENQVSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKKwkgKiB0bworCSAqICAgIENFIGFkZHJlc3Mgc3BhY2UKKwkgKi8KKwlBX1RBUkdFVF9BQ0NFU1NfQkVHSU5fUkVUKHNjbik7CisJY2VfcGh5X2FkZHIgPSBUQVJHX0NQVV9TUEFDRV9UT19DRV9TUEFDRShzY24tPm1lbSwgYWRkcmVzcyk7CisJQV9UQVJHRVRfQUNDRVNTX0VORF9SRVQoc2NuKTsKKworCXJlbWFpbmluZ19ieXRlcyA9IG9yaWdfbmJ5dGVzOworCUNFX2RhdGEgPSBDRV9kYXRhX2Jhc2U7CisJd2hpbGUgKHJlbWFpbmluZ19ieXRlcykgeworCQluYnl0ZXMgPSBtaW4ocmVtYWluaW5nX2J5dGVzLCBESUFHX1RSQU5TRkVSX0xJTUlUKTsKKworCQl7ICAgLyogU2V0IHVwIHRvIHJlY2VpdmUgZGlyZWN0bHkgaW50byBUYXJnZXQoISkgYWRkcmVzcyAqLworCQkJc3RhdHVzID0gY2VfcmVjdl9idWZfZW5xdWV1ZShjZV9kaWFnLAorCQkJCQkJTlVMTCwgY2VfcGh5X2FkZHIpOworCQkJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQkJZ290byBkb25lOworCQl9CisKKwkJeworCQkJLyoKKwkJCSAqIFJlcXVlc3QgQ0UgdG8gc2VuZCBjYWxsZXItc3VwcGxpZWQgZGF0YSB0aGF0CisJCQkgKiB3YXMgY29waWVkIHRvIGJvdW5jZSBidWZmZXIgdG8gVGFyZ2V0KCEpIGFkZHJlc3MuCisJCQkgKi8KKwkJCXN0YXR1cyA9CisJCQkJY2Vfc2VuZChjZV9kaWFnLCBOVUxMLAorCQkJCQkoY2RmX2RtYV9hZGRyX3QpIENFX2RhdGEsIG5ieXRlcywKKwkJCQkJdHJhbnNhY3Rpb25faWQsIDAsIHVzZXJfZmxhZ3MpOworCQkJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQkJZ290byBkb25lOworCQl9CisKKwkJaSA9IDA7CisJCXdoaWxlIChjZV9jb21wbGV0ZWRfc2VuZF9uZXh0KGNlX2RpYWcsIE5VTEwsIE5VTEwsICZidWYsCisJCQkgICAgJmNvbXBsZXRlZF9uYnl0ZXMsICZpZCwKKwkJCSAgICBOVUxMLCBOVUxMLCAmdG9lcGxpdHpfaGFzaF9yZXN1bHQpICE9CisJCQkgICAgQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQljZGZfbWRlbGF5KDEpOworCQkJaWYgKGkrKyA+IERJQUdfQUNDRVNTX0NFX1RJTUVPVVRfTVMpIHsKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfQlVTWTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0KKworCQlpZiAobmJ5dGVzICE9IGNvbXBsZXRlZF9uYnl0ZXMpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJZ290byBkb25lOworCQl9CisKKwkJaWYgKGJ1ZiAhPSBDRV9kYXRhKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWkgPSAwOworCQl3aGlsZSAoY2VfY29tcGxldGVkX3JlY3ZfbmV4dAorCQkJKGNlX2RpYWcsIE5VTEwsIE5VTEwsICZidWYsCisJCQkmY29tcGxldGVkX25ieXRlcywgJmlkLAorCQkJJmZsYWdzKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWNkZl9tZGVsYXkoMSk7CisJCQlpZiAoaSsrID4gRElBR19BQ0NFU1NfQ0VfVElNRU9VVF9NUykgeworCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9CVVNZOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCisJCWlmIChuYnl0ZXMgIT0gY29tcGxldGVkX25ieXRlcykgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlpZiAoYnVmICE9IGNlX3BoeV9hZGRyKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXJlbWFpbmluZ19ieXRlcyAtPSBuYnl0ZXM7CisJCWFkZHJlc3MgKz0gbmJ5dGVzOworCQlDRV9kYXRhICs9IG5ieXRlczsKKwl9CisKK2RvbmU6CisJQV9UQVJHRVRfQUNDRVNTX1VOTElLRUxZKHNjbik7CisKKwlpZiAoZGF0YV9idWYpIHsKKwkJY2RmX29zX21lbV9mcmVlX2NvbnNpc3RlbnQoc2NuLT5jZGZfZGV2LCBvcmlnX25ieXRlcywKKwkJCQkgICAgZGF0YV9idWYsIENFX2RhdGFfYmFzZSwgMCk7CisJfQorCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJSElGX0VSUk9SKCIlcyBmYWlsdXJlICgweCVsbHUpIiwgX19mdW5jX18sCisJCQkodWludDY0X3QpY2VfcGh5X2FkZHIpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFdyaXRlIDRCIGRhdGEgdG8gVGFyZ2V0IG1lbW9yeSBvciByZWdpc3RlciAqLworQ0RGX1NUQVRVUworaGlmX2RpYWdfd3JpdGVfYWNjZXNzKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZTsKKworCWhpZl9zdGF0ZSA9IChzdHJ1Y3QgSElGX0NFX3N0YXRlICopc2NuLT5oaWZfaGRsOworCWlmIChhZGRyZXNzID49IERSQU1fQkFTRV9BRERSRVNTKSB7CisJCS8qIEFzc3VtZSByYW5nZSBkb2Vzbid0IGNyb3NzIHRoaXMgYm91bmRhcnkgKi8KKwkJdWludDMyX3QgZGF0YV9idWYgPSBkYXRhOworCisJCXJldHVybiBoaWZfZGlhZ193cml0ZV9tZW0oc2NuLCBhZGRyZXNzLAorCQkJCQkgICh1aW50OF90ICopICZkYXRhX2J1ZiwKKwkJCQkJICBzaXplb2YodWludDMyX3QpKTsKKwl9IGVsc2UgeworCQlBX1RBUkdFVF9BQ0NFU1NfQkVHSU5fUkVUKHNjbik7CisJCUFfVEFSR0VUX1dSSVRFKHNjbiwgYWRkcmVzcywgZGF0YSk7CisJCUFfVEFSR0VUX0FDQ0VTU19FTkRfUkVUKHNjbik7CisKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvY2UvY2VfaW50ZXJuYWwuaCBiL2NvcmUvaGlmL3NyYy9jZS9jZV9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZmE3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hpZi9zcmMvY2UvY2VfaW50ZXJuYWwuaApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX19DT1BZX0VOR0lORV9JTlRFUk5BTF9IX18KKyNkZWZpbmUgX19DT1BZX0VOR0lORV9JTlRFUk5BTF9IX18KKworI2luY2x1ZGUgPGhpZi5oPiAgICAgICAgICAgICAgICAvKiBBX1RBUkdFVF9XUklURSAqLworCisvKiBDb3B5IEVuZ2luZSBvcGVyYXRpb25hbCBzdGF0ZSAqLworZW51bSBDRV9vcF9zdGF0ZSB7CisJQ0VfVU5VU0VELAorCUNFX1BBVVNFRCwKKwlDRV9SVU5OSU5HLAorfTsKKworZW51bSBvbF9hdGhfaGlmX2NlX2Vjb2RlcyB7CisJQ0VfUklOR19ERUxUQV9GQUlMID0gMAorfTsKKworc3RydWN0IENFX3NyY19kZXNjOworCisvKiBDb3B5IEVuZ2luZSBSaW5nIGludGVybmFsIHN0YXRlICovCitzdHJ1Y3QgQ0VfcmluZ19zdGF0ZSB7CisKKwkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHJpbmc7IG11c3QgYmUgcG93ZXIgb2YgMiAqLworCXVuc2lnbmVkIGludCBuZW50cmllczsKKwl1bnNpZ25lZCBpbnQgbmVudHJpZXNfbWFzazsKKworCS8qCisJICogRm9yIGRlc3QgcmluZywgdGhpcyBpcyB0aGUgbmV4dCBpbmRleCB0byBiZSBwcm9jZXNzZWQKKwkgKiBieSBzb2Z0d2FyZSBhZnRlciBpdCB3YXMvaXMgcmVjZWl2ZWQgaW50by4KKwkgKgorCSAqIEZvciBzcmMgcmluZywgdGhpcyBpcyB0aGUgbGFzdCBkZXNjcmlwdG9yIHRoYXQgd2FzIHNlbnQKKwkgKiBhbmQgY29tcGxldGlvbiBwcm9jZXNzZWQgYnkgc29mdHdhcmUuCisJICoKKwkgKiBSZWdhcmRsZXNzIG9mIHNyYyBvciBkZXN0IHJpbmcsIHRoaXMgaXMgYW4gaW52YXJpYW50CisJICogKG1vZHVsbyByaW5nIHNpemUpOgorCSAqICAgICB3cml0ZSBpbmRleCA+PSByZWFkIGluZGV4ID49IHN3X2luZGV4CisJICovCisJdW5zaWduZWQgaW50IHN3X2luZGV4OworCXVuc2lnbmVkIGludCB3cml0ZV9pbmRleDsgICAgICAgLyogY2FjaGVkIGNvcHkgKi8KKwkvKgorCSAqIEZvciBzcmMgcmluZywgdGhpcyBpcyB0aGUgbmV4dCBpbmRleCBub3QgeWV0IHByb2Nlc3NlZCBieSBIVy4KKwkgKiBUaGlzIGlzIGEgY2FjaGVkIGNvcHkgb2YgdGhlIHJlYWwgSFcgaW5kZXggKHJlYWQgaW5kZXgpLCB1c2VkCisJICogZm9yIGF2b2lkaW5nIHJlYWRpbmcgdGhlIEhXIGluZGV4IHJlZ2lzdGVyIG1vcmUgb2Z0ZW4gdGhhbgorCSAqIG5lY2Vzc2FyeS4KKwkgKiBUaGlzIGV4dGVuZHMgdGhlIGludmFyaWFudDoKKwkgKiAgICAgd3JpdGUgaW5kZXggPj0gcmVhZCBpbmRleCA+PSBod19pbmRleCA+PSBzd19pbmRleAorCSAqCisJICogRm9yIGRlc3QgcmluZywgdGhpcyBpcyBjdXJyZW50bHkgdW51c2VkLgorCSAqLworCXVuc2lnbmVkIGludCBod19pbmRleDsgIC8qIGNhY2hlZCBjb3B5ICovCisKKwkvKiBTdGFydCBvZiBETUEtY29oZXJlbnQgYXJlYSByZXNlcnZlZCBmb3IgZGVzY3JpcHRvcnMgKi8KKwl2b2lkICpiYXNlX2FkZHJfb3duZXJfc3BhY2VfdW5hbGlnbmVkOyAgLyogSG9zdCBhZGRyZXNzIHNwYWNlICovCisJY2RmX2RtYV9hZGRyX3QgYmFzZV9hZGRyX0NFX3NwYWNlX3VuYWxpZ25lZDsgLyogQ0UgYWRkcmVzcyBzcGFjZSAqLworCisJLyoKKwkgKiBBY3R1YWwgc3RhcnQgb2YgZGVzY3JpcHRvcnMuCisJICogQWxpZ25lZCB0byBkZXNjcmlwdG9yLXNpemUgYm91bmRhcnkuCisJICogUG9pbnRzIGludG8gcmVzZXJ2ZWQgRE1BLWNvaGVyZW50IGFyZWEsIGFib3ZlLgorCSAqLworCXZvaWQgKmJhc2VfYWRkcl9vd25lcl9zcGFjZTsgICAgLyogSG9zdCBhZGRyZXNzIHNwYWNlICovCisJY2RmX2RtYV9hZGRyX3QgYmFzZV9hZGRyX0NFX3NwYWNlOyAgIC8qIENFIGFkZHJlc3Mgc3BhY2UgKi8KKwkvKgorCSAqIFN0YXJ0IG9mIHNoYWRvdyBjb3B5IG9mIGRlc2NyaXB0b3JzLCB3aXRoaW4gcmVndWxhciBtZW1vcnkuCisJICogQWxpZ25lZCB0byBkZXNjcmlwdG9yLXNpemUgYm91bmRhcnkuCisJICovCisJY2hhciAqc2hhZG93X2Jhc2VfdW5hbGlnbmVkOworCXN0cnVjdCBDRV9zcmNfZGVzYyAqc2hhZG93X2Jhc2U7CisKKwl1bnNpZ25lZCBpbnQgbG93X3dhdGVyX21hcmtfbmVudHJpZXM7CisJdW5zaWduZWQgaW50IGhpZ2hfd2F0ZXJfbWFya19uZW50cmllczsKKwl2b2lkICoqcGVyX3RyYW5zZmVyX2NvbnRleHQ7CisJT1NfRE1BX01FTV9DT05URVhUKGNlX2RtYWNvbnRleHQpIC8qIE9TIFNwZWNpZmljIERNQSBjb250ZXh0ICovCit9OworCisvKiBDb3B5IEVuZ2luZSBpbnRlcm5hbCBzdGF0ZSAqLworc3RydWN0IENFX3N0YXRlIHsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbjsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdW5zaWduZWQgaW50IGF0dHJfZmxhZ3M7ICAvKiBDRV9BVFRSXyogKi8KKwl1aW50MzJfdCBjdHJsX2FkZHI7ICAgICAgIC8qIHJlbGF0aXZlIHRvIEJBUiAqLworCWVudW0gQ0Vfb3Bfc3RhdGUgc3RhdGU7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRkFTVFBBVEgKKwl1X2ludDMyX3QgZG93bmxvYWRfbGVuOyAvKiBwa3QgZG93bmxvYWQgbGVuZ3RoIGZvciBzb3VyY2UgcmluZyAqLworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9GQVNUUEFUSCAqLworCisJY2Vfc2VuZF9jYiBzZW5kX2NiOworCXZvaWQgKnNlbmRfY29udGV4dDsKKworCUNFX3JlY3ZfY2IgcmVjdl9jYjsKKwl2b2lkICpyZWN2X2NvbnRleHQ7CisKKwkvKiBtaXNjX2NicyAtIGFyZSBhbnkgY2FsbGJhY2tzIGJlc2lkZXMgc2VuZCBhbmQgcmVjdiBlbmFibGVkPyAqLworCXVpbnQ4X3QgbWlzY19jYnM7CisKKwlDRV93YXRlcm1hcmtfY2Igd2F0ZXJtYXJrX2NiOworCXZvaWQgKndtX2NvbnRleHQ7CisKKwkvKlJlY29yZCB0aGUgc3RhdGUgb2YgdGhlIGNvcHkgY29tcGwgaW50ZXJydXB0ICovCisJaW50IGRpc2FibGVfY29weV9jb21wbF9pbnRyOworCisJdW5zaWduZWQgaW50IHNyY19zel9tYXg7CisJc3RydWN0IENFX3Jpbmdfc3RhdGUgKnNyY19yaW5nOworCXN0cnVjdCBDRV9yaW5nX3N0YXRlICpkZXN0X3Jpbmc7CisJYXRvbWljX3QgcnhfcGVuZGluZzsKKworCS8qIGVwcGluZyAqLworCWJvb2wgdGltZXJfaW5pdGVkOworCWNkZl9zb2Z0aXJxX3RpbWVyX3QgcG9sbF90aW1lcjsKKwl2b2lkICgqbHJvX2ZsdXNoX2NiKSh2b2lkICopOworCXZvaWQgKmxyb19kYXRhOworfTsKKworLyogRGVzY3JpcHRvciByaW5ncyBtdXN0IGJlIGFsaWduZWQgdG8gdGhpcyBib3VuZGFyeSAqLworI2RlZmluZSBDRV9ERVNDX1JJTkdfQUxJR04gOAorCisjaWZkZWYgUUNBX1dJRklfM18wCisjZGVmaW5lIEhJRl9DRV9ERVNDX0FERFJfVE9fRE1BKGRlc2MpIFwKKwkoY2RmX2RtYV9hZGRyX3QpKCgodWludDY0X3QpKGRlc2MpLT5idWZmZXJfYWRkciArIFwKKwkoKHVpbnQ2NF90KSgoZGVzYyktPmJ1ZmZlcl9hZGRyX2hpICYgMHgxRikgPDwgMzIpKSkKKyNlbHNlCisjZGVmaW5lIEhJRl9DRV9ERVNDX0FERFJfVE9fRE1BKGRlc2MpIFwKKwkoY2RmX2RtYV9hZGRyX3QpKChkZXNjKS0+YnVmZmVyX2FkZHIpCisjZW5kaWYKKworI2lmZGVmIFFDQV9XSUZJXzNfMAorc3RydWN0IENFX3NyY19kZXNjIHsKKwl1aW50MzJfdCBidWZmZXJfYWRkcjozMjsKKyNpZiBfQllURV9PUkRFUiA9PSBfQklHX0VORElBTgorCXVpbnQzMl90IGdhdGhlcjoxLAorCQllbmFibGVfMTFoOjEsCisJCW1ldGFfZGF0YV9sb3c6MiwgLyogZndfbWV0YWRhdGFfbG93ICovCisJCXBhY2tldF9yZXN1bHRfb2Zmc2V0OjEyLAorCQl0b2VwbGl0el9oYXNoX2VuYWJsZToxLAorCQlhZGRyX3lfc2VhcmNoX2Rpc2FibGU6MSwKKwkJYWRkcl94X3NlYXJjaF9kaXNhYmxlOjEsCisJCW1pc2NfaW50X2Rpc2FibGU6MSwKKwkJdGFyZ2V0X2ludF9kaXNhYmxlOjEsCisJCWhvc3RfaW50X2Rpc2FibGU6MSwKKwkJZGVzdF9ieXRlX3N3YXA6MSwKKwkJYnl0ZV9zd2FwOjEsCisJCXR5cGU6MiwKKwkJdHhfY2xhc3NpZnk6MSwKKwkJYnVmZmVyX2FkZHJfaGk6NTsKKwkJdWludDMyX3QgbWV0YV9kYXRhOjE2LCAvKiBmd19tZXRhZGF0YV9oaWdoICovCisJCW5ieXRlczoxNjsgICAgICAgLyogbGVuZ3RoIGluIHJlZ2lzdGVyIG1hcCAqLworI2Vsc2UKKwl1aW50MzJfdCBidWZmZXJfYWRkcl9oaTo1LAorCQl0eF9jbGFzc2lmeToxLAorCQl0eXBlOjIsCisJCWJ5dGVfc3dhcDoxLCAgICAgICAgICAvKiBzcmNfYnl0ZV9zd2FwICovCisJCWRlc3RfYnl0ZV9zd2FwOjEsCisJCWhvc3RfaW50X2Rpc2FibGU6MSwKKwkJdGFyZ2V0X2ludF9kaXNhYmxlOjEsCisJCW1pc2NfaW50X2Rpc2FibGU6MSwKKwkJYWRkcl94X3NlYXJjaF9kaXNhYmxlOjEsCisJCWFkZHJfeV9zZWFyY2hfZGlzYWJsZToxLAorCQl0b2VwbGl0el9oYXNoX2VuYWJsZToxLAorCQlwYWNrZXRfcmVzdWx0X29mZnNldDoxMiwKKwkJbWV0YV9kYXRhX2xvdzoyLCAvKiBmd19tZXRhZGF0YV9sb3cgKi8KKwkJZW5hYmxlXzExaDoxLAorCQlnYXRoZXI6MTsKKwkJdWludDMyX3QgbmJ5dGVzOjE2LCAvKiBsZW5ndGggaW4gcmVnaXN0ZXIgbWFwICovCisJCW1ldGFfZGF0YToxNjsgLyogZndfbWV0YWRhdGFfaGlnaCAqLworI2VuZGlmCisJdWludDMyX3QgdG9lcGxpdHpfaGFzaF9yZXN1bHQ6MzI7Cit9OworCitzdHJ1Y3QgQ0VfZGVzdF9kZXNjIHsKKwl1aW50MzJfdCBidWZmZXJfYWRkcjozMjsKKyNpZiBfQllURV9PUkRFUiA9PSBfQklHX0VORElBTgorCXVpbnQzMl90IGdhdGhlcjoxLAorCQllbmFibGVfMTFoOjEsCisJCW1ldGFfZGF0YV9sb3c6MiwgLyogZndfbWV0YWRhdGFfbG93ICovCisJCXBhY2tldF9yZXN1bHRfb2Zmc2V0OjEyLAorCQl0b2VwbGl0el9oYXNoX2VuYWJsZToxLAorCQlhZGRyX3lfc2VhcmNoX2Rpc2FibGU6MSwKKwkJYWRkcl94X3NlYXJjaF9kaXNhYmxlOjEsCisJCW1pc2NfaW50X2Rpc2FibGU6MSwKKwkJdGFyZ2V0X2ludF9kaXNhYmxlOjEsCisJCWhvc3RfaW50X2Rpc2FibGU6MSwKKwkJYnl0ZV9zd2FwOjEsCisJCXNyY19ieXRlX3N3YXA6MSwKKwkJdHlwZToyLAorCQl0eF9jbGFzc2lmeToxLAorCQlidWZmZXJfYWRkcl9oaTo1OworCQl1aW50MzJfdCBtZXRhX2RhdGE6MTYsIC8qIGZ3X21ldGFkYXRhX2hpZ2ggKi8KKwkJbmJ5dGVzOjE2OyAgICAgICAgICAvKiBsZW5ndGggaW4gcmVnaXN0ZXIgbWFwICovCisjZWxzZQorCXVpbnQzMl90IGJ1ZmZlcl9hZGRyX2hpOjUsCisJCXR4X2NsYXNzaWZ5OjEsCisJCXR5cGU6MiwKKwkJc3JjX2J5dGVfc3dhcDoxLAorCQlieXRlX3N3YXA6MSwgICAgICAgICAvKiBkZXN0X2J5dGVfc3dhcCAqLworCQlob3N0X2ludF9kaXNhYmxlOjEsCisJCXRhcmdldF9pbnRfZGlzYWJsZToxLAorCQltaXNjX2ludF9kaXNhYmxlOjEsCisJCWFkZHJfeF9zZWFyY2hfZGlzYWJsZToxLAorCQlhZGRyX3lfc2VhcmNoX2Rpc2FibGU6MSwKKwkJdG9lcGxpdHpfaGFzaF9lbmFibGU6MSwKKwkJcGFja2V0X3Jlc3VsdF9vZmZzZXQ6MTIsCisJCW1ldGFfZGF0YV9sb3c6MiwgLyogZndfbWV0YWRhdGFfbG93ICovCisJCWVuYWJsZV8xMWg6MSwKKwkJZ2F0aGVyOjE7CisJCXVpbnQzMl90IG5ieXRlczoxNiwgLyogbGVuZ3RoIGluIHJlZ2lzdGVyIG1hcCAqLworCQltZXRhX2RhdGE6MTY7ICAgIC8qIGZ3X21ldGFkYXRhX2hpZ2ggKi8KKyNlbmRpZgorCXVpbnQzMl90IHRvZXBsaXR6X2hhc2hfcmVzdWx0OjMyOworfTsKKyNlbHNlCitzdHJ1Y3QgQ0Vfc3JjX2Rlc2MgeworCXVpbnQzMl90IGJ1ZmZlcl9hZGRyOworI2lmIF9CWVRFX09SREVSID09IF9CSUdfRU5ESUFOCisJdWludDMyX3QgIG1ldGFfZGF0YToxNCwKKwkJYnl0ZV9zd2FwOjEsCisJCWdhdGhlcjoxLAorCQluYnl0ZXM6MTY7CisjZWxzZQorCisJCXVpbnQzMl90IG5ieXRlczoxNiwKKwkJZ2F0aGVyOjEsCisJCWJ5dGVfc3dhcDoxLAorCQltZXRhX2RhdGE6MTQ7CisjZW5kaWYKK307CisKK3N0cnVjdCBDRV9kZXN0X2Rlc2MgeworCXVpbnQzMl90IGJ1ZmZlcl9hZGRyOworI2lmIF9CWVRFX09SREVSID09IF9CSUdfRU5ESUFOCisJdWludDMyX3QgIG1ldGFfZGF0YToxNCwKKwkJYnl0ZV9zd2FwOjEsCisJCWdhdGhlcjoxLAorCQluYnl0ZXM6MTY7CisjZWxzZQorCXVpbnQzMl90IG5ieXRlczoxNiwKKwkJZ2F0aGVyOjEsCisJCWJ5dGVfc3dhcDoxLAorCQltZXRhX2RhdGE6MTQ7CisjZW5kaWYKK307CisjZW5kaWYgLyogUUNBX1dJRklfM18wICovCisKKyNkZWZpbmUgQ0VfU0VORExJU1RfSVRFTVNfTUFYIDEyCisKK2VudW0gY2Vfc2VuZGxpc3RfdHlwZV9lIHsKKwlDRV9TSU1QTEVfQlVGRkVSX1RZUEUsCisJLyogVEJEWFhYOiBDRV9SWF9ERVNDX0xJU1QsICovCit9OworCisvKgorICogVGhlcmUncyBhIHB1YmxpYyAiY2Vfc2VuZGxpc3QiIGFuZCBhIHByaXZhdGUgImNlX3NlbmRsaXN0X3MiLgorICogVGhlIGZvcm1lciBpcyBhbiBvcGFxdWUgc3RydWN0dXJlIHdpdGggc3VmZmljaWVudCBzcGFjZQorICogdG8gaG9sZCB0aGUgbGF0dGVyLiAgVGhlIGxhdHRlciBpcyB0aGUgYWN0dWFsIHN0cnVjdHVyZQorICogZGVmaW5pdGlvbiBhbmQgaXQgaXMgb25seSB1c2VkIGludGVybmFsbHkuICBUaGUgb3BhcXVlIHZlcnNpb24KKyAqIG9mIHRoZSBzdHJ1Y3R1cmUgYWxsb3dzIGNhbGxlcnMgdG8gYWxsb2NhdGUgYW4gaW5zdGFuY2Ugb24gdGhlCisgKiBydW4tdGltZSBzdGFjayB3aXRob3V0IGtub3dpbmcgYW55IG9mIHRoZSBkZXRhaWxzIG9mIHRoZQorICogc3RydWN0dXJlIGxheW91dC4KKyAqLworc3RydWN0IGNlX3NlbmRsaXN0X3MgeworCXVuc2lnbmVkIGludCBudW1faXRlbXM7CisJc3RydWN0IGNlX3NlbmRsaXN0X2l0ZW0geworCQllbnVtIGNlX3NlbmRsaXN0X3R5cGVfZSBzZW5kX3R5cGU7CisJCWRtYV9hZGRyX3QgZGF0YTsgICAgICAgIC8qIGUuZy4gYnVmZmVyIG9yIGRlc2MgbGlzdCAqLworCQl1bmlvbiB7CisJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzOyAgICAvKiBzaW1wbGUgYnVmZmVyICovCisJCQl1bnNpZ25lZCBpbnQgbmRlc2M7ICAgICAvKiBSeCBkZXNjcmlwdG9yIGxpc3QgKi8KKwkJfSB1OworCQkvKiBmbGFnczogZXh0ZXJuYWxseS1zcGVjaWZpZWQgZmxhZ3M7CisJCSAqIE9SLWVkIHdpdGggaW50ZXJuYWwgZmxhZ3MgKi8KKwkJdWludDMyX3QgZmxhZ3M7CisJCXVpbnQzMl90IHVzZXJfZmxhZ3M7CisJfSBpdGVtW0NFX1NFTkRMSVNUX0lURU1TX01BWF07Cit9OworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0ZBU1RQQVRICit2b2lkIGNlX2gydF90eF9jZV9jbGVhbnVwKHN0cnVjdCBDRV9oYW5kbGUgKmNlX2hkbCk7CisjZW5kaWYKKworLyogd2hpY2ggcmluZyBvZiBhIENFPyAqLworI2RlZmluZSBDRV9SSU5HX1NSQyAgMAorI2RlZmluZSBDRV9SSU5HX0RFU1QgMQorCisjZGVmaW5lIENEQ19XQVJfTUFHSUNfU1RSICAgMHhjZWVmMDAwMAorI2RlZmluZSBDRENfV0FSX0RBVEFfQ0UgICAgIDQKKworLyogQWRkaXRpb25hbCBpbnRlcm5hbC1vbmx5IGNlX3NlbmQgZmxhZ3MgKi8KKyNkZWZpbmUgQ0VfU0VORF9GTEFHX0dBVEhFUiAgICAgICAgICAgICAweDAwMDEwMDAwICAgICAgLyogVXNlIEdhdGhlciAqLworI2VuZGlmIC8qIF9fQ09QWV9FTkdJTkVfSU5URVJOQUxfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvY2UvY2VfbWFpbi5jIGIvY29yZS9oaWYvc3JjL2NlL2NlX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2YwMGYxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oaWYvc3JjL2NlL2NlX21haW4uYwpAQCAtMCwwICsxLDI1OTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8b3NkZXAuaD4KKyNpbmNsdWRlICJhX3R5cGVzLmgiCisjaW5jbHVkZSAiYXRoZGVmcy5oIgorI2luY2x1ZGUgIm9zYXBpX2xpbnV4LmgiCisjaW5jbHVkZSAidGFyZ2NmZy5oIgorI2luY2x1ZGUgImNkZl9sb2NrLmgiCisjaW5jbHVkZSAiY2RmX3N0YXR1cy5oIgorI2luY2x1ZGUgPGNkZl9hdG9taWMuaD4gICAgICAgICAvKiBjZGZfYXRvbWljX3JlYWQgKi8KKyNpbmNsdWRlIDx0YXJnYWRkcnMuaD4KKyNpbmNsdWRlIDxibWlfbXNnLmg+CisjaW5jbHVkZSAiaGlmX2lvMzIuaCIKKyNpbmNsdWRlIDxoaWYuaD4KKyNpbmNsdWRlICJyZWd0YWJsZS5oIgorI2RlZmluZSBBVEhfTU9EVUxFX05BTUUgaGlmCisjaW5jbHVkZSA8YV9kZWJ1Zy5oPgorI2luY2x1ZGUgImhpZl9tYWluLmgiCisjaWZkZWYgSElGX1BDSQorI2luY2x1ZGUgImNlX2JtaS5oIgorI2VuZGlmCisjaW5jbHVkZSAiY2VfYXBpLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2lmZGVmIENPTkZJR19DTlNTCisjaW5jbHVkZSA8bmV0L2Nuc3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGNkc19nZXRfYmluLmg+CisjaW5jbHVkZSAiZXBwaW5nX21haW4uaCIKKyNpbmNsdWRlICJoaWZfZGVidWcuaCIKKyNpbmNsdWRlICJjZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNlX3JlZy5oIgorI2luY2x1ZGUgImNlX2Fzc2lnbm1lbnQuaCIKKyNpbmNsdWRlICJjZV90YXNrbGV0LmgiCisjaWZkZWYgSElGX1BDSQorI2luY2x1ZGUgImljbnNzX3N0dWIuaCIKKyNlbHNlCisjaW5jbHVkZSA8c29jL3Fjb20vaWNuc3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgInF3bGFuX3ZlcnNpb24uaCIKKworI2RlZmluZSBDRV9QT0xMX1RJTUVPVVQgMTAgICAgICAvKiBtcyAqLworCisvKiBGb3J3YXJkIHJlZmVyZW5jZXMgKi8KK3N0YXRpYyBpbnQgaGlmX3Bvc3RfcmVjdl9idWZmZXJzX2Zvcl9waXBlKHN0cnVjdCBISUZfQ0VfcGlwZV9pbmZvICpwaXBlX2luZm8pOworCisvKgorICogRml4IEVWMTE4NzgzLCBwb2xsIHRvIGNoZWNrIHdoZXRoZXIgYSBCTUkgcmVzcG9uc2UgY29tZXMKKyAqIG90aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIGludGVycnVwdGlvbiB3aGljaCBtYXkgYmUgbG9zdC4KKyAqLworLyogI2RlZmluZSBCTUlfUlNQX1BPTExJTkcgKi8KKyNkZWZpbmUgQk1JX1JTUF9UT19NSUxMSVNFQyAgMTAwMAorCisKK3N0YXRpYyBpbnQgaGlmX3Bvc3RfcmVjdl9idWZmZXJzKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKKworc3RhdGljIHZvaWQgY2VfcG9sbF90aW1lb3V0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWFyZzsKKwlpZiAoQ0Vfc3RhdGUtPnRpbWVyX2luaXRlZCkgeworCQljZV9wZXJfZW5naW5lX3NlcnZpY2UoQ0Vfc3RhdGUtPnNjbiwgQ0Vfc3RhdGUtPmlkKTsKKwkJY2RmX3NvZnRpcnFfdGltZXJfbW9kKCZDRV9zdGF0ZS0+cG9sbF90aW1lciwgQ0VfUE9MTF9USU1FT1VUKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcm91bmR1cF9wd3IyKHVuc2lnbmVkIGludCBuKQoreworCWludCBpOworCXVuc2lnbmVkIGludCB0ZXN0X3B3cjI7CisKKwlpZiAoIShuICYgKG4gLSAxKSkpCisJCXJldHVybiBuOyAvKiBhbHJlYWR5IGEgcG93ZXIgb2YgMiAqLworCisJdGVzdF9wd3IyID0gNDsKKwlmb3IgKGkgPSAwOyBpIDwgMjk7IGkrKykgeworCQlpZiAodGVzdF9wd3IyID4gbikKKwkJCXJldHVybiB0ZXN0X3B3cjI7CisJCXRlc3RfcHdyMiA9IHRlc3RfcHdyMiA8PCAxOworCX0KKworCUNERl9BU1NFUlQoMCk7IC8qIG4gdG9vIGxhcmdlICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgQ29weSBFbmdpbmUgYmFzZWQgb24gY2FsbGVyLXN1cHBsaWVkIGF0dHJpYnV0ZXMuCisgKiBUaGlzIG1heSBiZSBjYWxsZWQgb25jZSB0byBpbml0aWFsaXplIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbgorICogcmluZ3Mgb3IgaXQgbWF5IGJlIGNhbGxlZCB0d2ljZSBmb3Igc2VwYXJhdGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbgorICogaW5pdGlhbGl6YXRpb24uIEl0IG1heSBiZSB0aGF0IG9ubHkgb25lIHNpZGUgb3IgdGhlIG90aGVyIGlzCisgKiBpbml0aWFsaXplZCBieSBzb2Z0d2FyZS9maXJtd2FyZS4KKyAqLworc3RydWN0IENFX2hhbmRsZSAqY2VfaW5pdChzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwKKwkJCSAgdW5zaWduZWQgaW50IENFX2lkLCBzdHJ1Y3QgQ0VfYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlOworCXVpbnQzMl90IGN0cmxfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbmVudHJpZXM7CisJY2RmX2RtYV9hZGRyX3QgYmFzZV9hZGRyOworCWJvb2wgbWFsbG9jX0NFX3N0YXRlID0gZmFsc2U7CisJYm9vbCBtYWxsb2Nfc3JjX3JpbmcgPSBmYWxzZTsKKworCUNERl9BU1NFUlQoQ0VfaWQgPCBzY24tPmNlX2NvdW50KTsKKwljdHJsX2FkZHIgPSBDRV9CQVNFX0FERFJFU1MoQ0VfaWQpOworCWNkZl9zcGluX2xvY2soJnNjbi0+dGFyZ2V0X2xvY2spOworCUNFX3N0YXRlID0gc2NuLT5jZV9pZF90b19zdGF0ZVtDRV9pZF07CisKKwlpZiAoIUNFX3N0YXRlKSB7CisJCWNkZl9zcGluX3VubG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisJCUNFX3N0YXRlID0KKwkJICAgIChzdHJ1Y3QgQ0Vfc3RhdGUgKiljZGZfbWVtX21hbGxvYyhzaXplb2YoKkNFX3N0YXRlKSk7CisJCWlmICghQ0Vfc3RhdGUpIHsKKwkJCUhJRl9FUlJPUigiJXM6IENFX3N0YXRlIGhhcyBubyBtZW0iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfSBlbHNlCisJCQltYWxsb2NfQ0Vfc3RhdGUgPSB0cnVlOworCQljZGZfbWVtX3plcm8oQ0Vfc3RhdGUsIHNpemVvZigqQ0Vfc3RhdGUpKTsKKwkJY2RmX3NwaW5fbG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisJCWlmICghc2NuLT5jZV9pZF90b19zdGF0ZVtDRV9pZF0pIHsgLyogcmUtY2hlY2sgdW5kZXIgbG9jayAqLworCQkJc2NuLT5jZV9pZF90b19zdGF0ZVtDRV9pZF0gPSBDRV9zdGF0ZTsKKworCQkJQ0Vfc3RhdGUtPmlkID0gQ0VfaWQ7CisJCQlDRV9zdGF0ZS0+Y3RybF9hZGRyID0gY3RybF9hZGRyOworCQkJQ0Vfc3RhdGUtPnN0YXRlID0gQ0VfUlVOTklORzsKKwkJCUNFX3N0YXRlLT5hdHRyX2ZsYWdzID0gYXR0ci0+ZmxhZ3M7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgcmVsZWFzZWQgdGFyZ2V0X2xvY2sgaW4gb3JkZXIgdG8gYWxsb2NhdGUKKwkJCSAqIENFIHN0YXRlLCBidXQgc29tZW9uZSBlbHNlIGJlYXQgdXMgdG8gaXQuCisJCQkgKiBDb250aW51ZSwgdXNpbmcgdGhhdCBDRV9zdGF0ZQorCQkJICogKGFuZCBmcmVlIHRoZSBvbmUgd2UgYWxsb2NhdGVkKS4KKwkJCSAqLworCQkJY2RmX21lbV9mcmVlKENFX3N0YXRlKTsKKwkJCW1hbGxvY19DRV9zdGF0ZSA9IGZhbHNlOworCQkJQ0Vfc3RhdGUgPSBzY24tPmNlX2lkX3RvX3N0YXRlW0NFX2lkXTsKKwkJfQorCX0KKwlDRV9zdGF0ZS0+c2NuID0gc2NuOworCWNkZl9zcGluX3VubG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisKKwljZGZfYXRvbWljX2luaXQoJkNFX3N0YXRlLT5yeF9wZW5kaW5nKTsKKwlpZiAoYXR0ciA9PSBOVUxMKSB7CisJCS8qIEFscmVhZHkgaW5pdGlhbGl6ZWQ7IGNhbGxlciB3YW50cyB0aGUgaGFuZGxlICovCisJCXJldHVybiAoc3RydWN0IENFX2hhbmRsZSAqKUNFX3N0YXRlOworCX0KKworI2lmZGVmIEFEUkFTVEVBX1NIQURPV19SRUdJU1RFUlMKKwlISUZfRVJST1IoIiVzOiBVc2luZyBTaGFkb3cgUmVnaXN0ZXJzIGluc3RlYWQgb2YgQ0UgUmVnaXN0ZXJzXG4iLAorCQkgIF9fZnVuY19fKTsKKyNlbmRpZgorCisJaWYgKENFX3N0YXRlLT5zcmNfc3pfbWF4KQorCQlDREZfQVNTRVJUKENFX3N0YXRlLT5zcmNfc3pfbWF4ID09IGF0dHItPnNyY19zel9tYXgpOworCWVsc2UKKwkJQ0Vfc3RhdGUtPnNyY19zel9tYXggPSBhdHRyLT5zcmNfc3pfbWF4OworCisJLyogc291cmNlIHJpbmcgc2V0dXAgKi8KKwluZW50cmllcyA9IGF0dHItPnNyY19uZW50cmllczsKKwlpZiAobmVudHJpZXMpIHsKKwkJc3RydWN0IENFX3Jpbmdfc3RhdGUgKnNyY19yaW5nOworCQl1bnNpZ25lZCBDRV9uYnl0ZXM7CisJCWNoYXIgKnB0cjsKKwkJdWludDY0X3QgZG1hX2FkZHI7CisJCW5lbnRyaWVzID0gcm91bmR1cF9wd3IyKG5lbnRyaWVzKTsKKwkJaWYgKENFX3N0YXRlLT5zcmNfcmluZykgeworCQkJQ0RGX0FTU0VSVChDRV9zdGF0ZS0+c3JjX3JpbmctPm5lbnRyaWVzID09IG5lbnRyaWVzKTsKKwkJfSBlbHNlIHsKKwkJCUNFX25ieXRlcyA9IHNpemVvZihzdHJ1Y3QgQ0VfcmluZ19zdGF0ZSkKKwkJCQkgICAgKyAobmVudHJpZXMgKiBzaXplb2Yodm9pZCAqKSk7CisJCQlwdHIgPSBjZGZfbWVtX21hbGxvYyhDRV9uYnl0ZXMpOworCQkJaWYgKCFwdHIpIHsKKwkJCQkvKiBjYW5ub3QgYWxsb2NhdGUgc3JjIHJpbmcuIElmIHRoZQorCQkJCSAqIENFX3N0YXRlIGlzIGFsbG9jYXRlZCBsb2NhbGx5IGZyZWUKKwkJCQkgKiBDRV9TdGF0ZSBhbmQgcmV0dXJuIGVycm9yLgorCQkJCSAqLworCQkJCUhJRl9FUlJPUigiJXM6IHNyYyByaW5nIGhhcyBubyBtZW0iLCBfX2Z1bmNfXyk7CisJCQkJaWYgKG1hbGxvY19DRV9zdGF0ZSkgeworCQkJCQkvKiBhbGxvY2F0ZWQgQ0Vfc3RhdGUgbG9jYWxseSAqLworCQkJCQljZGZfc3Bpbl9sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKKwkJCQkJc2NuLT5jZV9pZF90b19zdGF0ZVtDRV9pZF0gPSBOVUxMOworCQkJCQljZGZfc3Bpbl91bmxvY2soJnNjbi0+dGFyZ2V0X2xvY2spOworCQkJCQljZGZfbWVtX2ZyZWUoQ0Vfc3RhdGUpOworCQkJCQltYWxsb2NfQ0Vfc3RhdGUgPSBmYWxzZTsKKwkJCQl9CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIGNhbiBhbGxvY2F0ZSBzcmMgcmluZy4KKwkJCQkgKiBNYXJrIHRoYXQgdGhlIHNyYyByaW5nIGlzCisJCQkJICogYWxsb2NhdGVkIGxvY2FsbHkKKwkJCQkgKi8KKwkJCQltYWxsb2Nfc3JjX3JpbmcgPSB0cnVlOworCQkJfQorCQkJY2RmX21lbV96ZXJvKHB0ciwgQ0VfbmJ5dGVzKTsKKworCQkJc3JjX3JpbmcgPSBDRV9zdGF0ZS0+c3JjX3JpbmcgPQorCQkJCQkgICAoc3RydWN0IENFX3Jpbmdfc3RhdGUgKilwdHI7CisJCQlwdHIgKz0gc2l6ZW9mKHN0cnVjdCBDRV9yaW5nX3N0YXRlKTsKKwkJCXNyY19yaW5nLT5uZW50cmllcyA9IG5lbnRyaWVzOworCQkJc3JjX3JpbmctPm5lbnRyaWVzX21hc2sgPSBuZW50cmllcyAtIDE7CisJCQlBX1RBUkdFVF9BQ0NFU1NfQkVHSU5fUkVUX1BUUihzY24pOworCQkJc3JjX3JpbmctPmh3X2luZGV4ID0KKwkJCQlDRV9TUkNfUklOR19SRUFEX0lEWF9HRVQoc2NuLCBjdHJsX2FkZHIpOworCQkJc3JjX3JpbmctPnN3X2luZGV4ID0gc3JjX3JpbmctPmh3X2luZGV4OworCQkJc3JjX3JpbmctPndyaXRlX2luZGV4ID0KKwkJCQlDRV9TUkNfUklOR19XUklURV9JRFhfR0VUKHNjbiwgY3RybF9hZGRyKTsKKwkJCUFfVEFSR0VUX0FDQ0VTU19FTkRfUkVUX1BUUihzY24pOworCQkJc3JjX3JpbmctPmxvd193YXRlcl9tYXJrX25lbnRyaWVzID0gMDsKKwkJCXNyY19yaW5nLT5oaWdoX3dhdGVyX21hcmtfbmVudHJpZXMgPSBuZW50cmllczsKKwkJCXNyY19yaW5nLT5wZXJfdHJhbnNmZXJfY29udGV4dCA9ICh2b2lkICoqKXB0cjsKKworCQkJLyogTGVnYWN5IHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGNhY2hlCisJCQkgKiBjb2hlcmVudCBETUEgYXJlIHVuc3VwcG9ydGVkCisJCQkgKi8KKwkJCXNyY19yaW5nLT5iYXNlX2FkZHJfb3duZXJfc3BhY2VfdW5hbGlnbmVkID0KKwkJCQljZGZfb3NfbWVtX2FsbG9jX2NvbnNpc3RlbnQoc2NuLT5jZGZfZGV2LAorCQkJCQkJKG5lbnRyaWVzICoKKwkJCQkJCXNpemVvZihzdHJ1Y3QgQ0Vfc3JjX2Rlc2MpICsKKwkJCQkJCUNFX0RFU0NfUklOR19BTElHTiksCisJCQkJCQkmYmFzZV9hZGRyLCAwKTsKKwkJCWlmIChzcmNfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlX3VuYWxpZ25lZAorCQkJCQk9PSBOVUxMKSB7CisJCQkJSElGX0VSUk9SKCIlczogc3JjIHJpbmcgaGFzIG5vIERNQSBtZW0iLAorCQkJCQkgIF9fZnVuY19fKTsKKwkJCQlnb3RvIGVycm9yX25vX2RtYV9tZW07CisJCQl9CisJCQlzcmNfcmluZy0+YmFzZV9hZGRyX0NFX3NwYWNlX3VuYWxpZ25lZCA9IGJhc2VfYWRkcjsKKworCQkJaWYgKHNyY19yaW5nLT4KKwkJCSAgICBiYXNlX2FkZHJfQ0Vfc3BhY2VfdW5hbGlnbmVkICYgKENFX0RFU0NfUklOR19BTElHTgorCQkJCQkJCS0gMSkpIHsKKwkJCQlzcmNfcmluZy0+YmFzZV9hZGRyX0NFX3NwYWNlID0KKwkJCQkJKHNyY19yaW5nLT5iYXNlX2FkZHJfQ0Vfc3BhY2VfdW5hbGlnbmVkCisJCQkJCSsgQ0VfREVTQ19SSU5HX0FMSUdOIC0KKwkJCQkJIDEpICYgfihDRV9ERVNDX1JJTkdfQUxJR04gLSAxKTsKKworCQkJCXNyY19yaW5nLT5iYXNlX2FkZHJfb3duZXJfc3BhY2UgPQorCQkJCQkodm9pZAorCQkJCQkgKikoKChzaXplX3QpIHNyY19yaW5nLT4KKwkJCQkJICAgICBiYXNlX2FkZHJfb3duZXJfc3BhY2VfdW5hbGlnbmVkICsKKwkJCQkJICAgICBDRV9ERVNDX1JJTkdfQUxJR04gLQorCQkJCQkgICAgIDEpICYgfihDRV9ERVNDX1JJTkdfQUxJR04gLSAxKSk7CisJCQl9IGVsc2UgeworCQkJCXNyY19yaW5nLT5iYXNlX2FkZHJfQ0Vfc3BhY2UgPQorCQkJCQlzcmNfcmluZy0+YmFzZV9hZGRyX0NFX3NwYWNlX3VuYWxpZ25lZDsKKwkJCQlzcmNfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlID0KKwkJCQkJc3JjX3JpbmctPgorCQkJCQliYXNlX2FkZHJfb3duZXJfc3BhY2VfdW5hbGlnbmVkOworCQkJfQorCQkJLyoKKwkJCSAqIEFsc28gYWxsb2NhdGUgYSBzaGFkb3cgc3JjIHJpbmcgaW4KKwkJCSAqIHJlZ3VsYXIgbWVtIHRvIHVzZSBmb3IgZmFzdGVyIGFjY2Vzcy4KKwkJCSAqLworCQkJc3JjX3JpbmctPnNoYWRvd19iYXNlX3VuYWxpZ25lZCA9CisJCQkJY2RmX21lbV9tYWxsb2MobmVudHJpZXMgKgorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBDRV9zcmNfZGVzYykgKworCQkJCQkgICAgICAgQ0VfREVTQ19SSU5HX0FMSUdOKTsKKwkJCWlmIChzcmNfcmluZy0+c2hhZG93X2Jhc2VfdW5hbGlnbmVkID09IE5VTEwpIHsKKwkJCQlISUZfRVJST1IoIiVzOiBzcmMgcmluZyBubyBzaGFkb3dfYmFzZSBtZW0iLAorCQkJCQkgIF9fZnVuY19fKTsKKwkJCQlnb3RvIGVycm9yX25vX2RtYV9tZW07CisJCQl9CisJCQlzcmNfcmluZy0+c2hhZG93X2Jhc2UgPSAoc3RydWN0IENFX3NyY19kZXNjICopCisJCQkJKCgoc2l6ZV90KSBzcmNfcmluZy0+c2hhZG93X2Jhc2VfdW5hbGlnbmVkICsKKwkJCQlDRV9ERVNDX1JJTkdfQUxJR04gLSAxKSAmCisJCQkJIH4oQ0VfREVTQ19SSU5HX0FMSUdOIC0gMSkpOworCisJCQlBX1RBUkdFVF9BQ0NFU1NfQkVHSU5fUkVUX1BUUihzY24pOworCQkJZG1hX2FkZHIgPSBzcmNfcmluZy0+YmFzZV9hZGRyX0NFX3NwYWNlOworCQkJQ0VfU1JDX1JJTkdfQkFTRV9BRERSX1NFVChzY24sIGN0cmxfYWRkciwKKwkJCQkgKHVpbnQzMl90KShkbWFfYWRkciAmIDB4RkZGRkZGRkYpKTsKKyNpZmRlZiBXTEFOX0VOQUJMRV9RQ0E2MTgwCisJCQl7CisJCQkJdWludDMyX3QgdG1wOworCQkJCXRtcCA9IENFX1NSQ19SSU5HX0JBU0VfQUREUl9ISUdIX0dFVCgKKwkJCQkgICBzY24sIGN0cmxfYWRkcik7CisJCQkJdG1wICY9IH4weDFGOworCQkJCWRtYV9hZGRyID0gKChkbWFfYWRkciA+PiAzMikgJiAweDFGKXx0bXA7CisJCQkJQ0VfU1JDX1JJTkdfQkFTRV9BRERSX0hJR0hfU0VUKHNjbiwKKwkJCQkJIGN0cmxfYWRkciwgKHVpbnQzMl90KWRtYV9hZGRyKTsKKwkJCX0KKyNlbmRpZgorCQkJQ0VfU1JDX1JJTkdfU1pfU0VUKHNjbiwgY3RybF9hZGRyLCBuZW50cmllcyk7CisJCQlDRV9TUkNfUklOR19ETUFYX1NFVChzY24sIGN0cmxfYWRkciwgYXR0ci0+c3JjX3N6X21heCk7CisjaWZkZWYgQklHX0VORElBTl9IT1NUCisJCQkvKiBFbmFibGUgc291cmNlIHJpbmcgYnl0ZSBzd2FwIGZvciBiaWcgZW5kaWFuIGhvc3QgKi8KKwkJCUNFX1NSQ19SSU5HX0JZVEVfU1dBUF9TRVQoc2NuLCBjdHJsX2FkZHIsIDEpOworI2VuZGlmCisJCQlDRV9TUkNfUklOR19MT1dNQVJLX1NFVChzY24sIGN0cmxfYWRkciwgMCk7CisJCQlDRV9TUkNfUklOR19ISUdITUFSS19TRVQoc2NuLCBjdHJsX2FkZHIsIG5lbnRyaWVzKTsKKwkJCUFfVEFSR0VUX0FDQ0VTU19FTkRfUkVUX1BUUihzY24pOworCQl9CisJfQorCisJLyogZGVzdGluYXRpb24gcmluZyBzZXR1cCAqLworCW5lbnRyaWVzID0gYXR0ci0+ZGVzdF9uZW50cmllczsKKwlpZiAobmVudHJpZXMpIHsKKwkJc3RydWN0IENFX3Jpbmdfc3RhdGUgKmRlc3RfcmluZzsKKwkJdW5zaWduZWQgQ0VfbmJ5dGVzOworCQljaGFyICpwdHI7CisJCXVpbnQ2NF90IGRtYV9hZGRyOworCisJCW5lbnRyaWVzID0gcm91bmR1cF9wd3IyKG5lbnRyaWVzKTsKKwkJaWYgKENFX3N0YXRlLT5kZXN0X3JpbmcpIHsKKwkJCUNERl9BU1NFUlQoQ0Vfc3RhdGUtPmRlc3RfcmluZy0+bmVudHJpZXMgPT0gbmVudHJpZXMpOworCQl9IGVsc2UgeworCQkJQ0VfbmJ5dGVzID0gc2l6ZW9mKHN0cnVjdCBDRV9yaW5nX3N0YXRlKQorCQkJCSAgICArIChuZW50cmllcyAqIHNpemVvZih2b2lkICopKTsKKwkJCXB0ciA9IGNkZl9tZW1fbWFsbG9jKENFX25ieXRlcyk7CisJCQlpZiAoIXB0cikgeworCQkJCS8qIGNhbm5vdCBhbGxvY2F0ZSBkc3QgcmluZy4gSWYgdGhlIENFX3N0YXRlCisJCQkJICogb3Igc3JjIHJpbmcgaXMgYWxsb2NhdGVkIGxvY2FsbHkgZnJlZQorCQkJCSAqIENFX1N0YXRlIGFuZCBzcmMgcmluZyBhbmQgcmV0dXJuIGVycm9yLgorCQkJCSAqLworCQkJCUhJRl9FUlJPUigiJXM6IGRlc3QgcmluZyBoYXMgbm8gbWVtIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQkJaWYgKG1hbGxvY19zcmNfcmluZykgeworCQkJCQljZGZfbWVtX2ZyZWUoQ0Vfc3RhdGUtPnNyY19yaW5nKTsKKwkJCQkJQ0Vfc3RhdGUtPnNyY19yaW5nID0gTlVMTDsKKwkJCQkJbWFsbG9jX3NyY19yaW5nID0gZmFsc2U7CisJCQkJfQorCQkJCWlmIChtYWxsb2NfQ0Vfc3RhdGUpIHsKKwkJCQkJLyogYWxsb2NhdGVkIENFX3N0YXRlIGxvY2FsbHkgKi8KKwkJCQkJY2RmX3NwaW5fbG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisJCQkJCXNjbi0+Y2VfaWRfdG9fc3RhdGVbQ0VfaWRdID0gTlVMTDsKKwkJCQkJY2RmX3NwaW5fdW5sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKKwkJCQkJY2RmX21lbV9mcmVlKENFX3N0YXRlKTsKKwkJCQkJbWFsbG9jX0NFX3N0YXRlID0gZmFsc2U7CisJCQkJfQorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJY2RmX21lbV96ZXJvKHB0ciwgQ0VfbmJ5dGVzKTsKKworCQkJZGVzdF9yaW5nID0gQ0Vfc3RhdGUtPmRlc3RfcmluZyA9CisJCQkJCSAgICAoc3RydWN0IENFX3Jpbmdfc3RhdGUgKilwdHI7CisJCQlwdHIgKz0gc2l6ZW9mKHN0cnVjdCBDRV9yaW5nX3N0YXRlKTsKKwkJCWRlc3RfcmluZy0+bmVudHJpZXMgPSBuZW50cmllczsKKwkJCWRlc3RfcmluZy0+bmVudHJpZXNfbWFzayA9IG5lbnRyaWVzIC0gMTsKKwkJCUFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVRfUFRSKHNjbik7CisJCQlkZXN0X3JpbmctPnN3X2luZGV4ID0KKwkJCQlDRV9ERVNUX1JJTkdfUkVBRF9JRFhfR0VUKHNjbiwgY3RybF9hZGRyKTsKKwkJCWRlc3RfcmluZy0+d3JpdGVfaW5kZXggPQorCQkJCUNFX0RFU1RfUklOR19XUklURV9JRFhfR0VUKHNjbiwgY3RybF9hZGRyKTsKKwkJCUFfVEFSR0VUX0FDQ0VTU19FTkRfUkVUX1BUUihzY24pOworCQkJZGVzdF9yaW5nLT5sb3dfd2F0ZXJfbWFya19uZW50cmllcyA9IDA7CisJCQlkZXN0X3JpbmctPmhpZ2hfd2F0ZXJfbWFya19uZW50cmllcyA9IG5lbnRyaWVzOworCQkJZGVzdF9yaW5nLT5wZXJfdHJhbnNmZXJfY29udGV4dCA9ICh2b2lkICoqKXB0cjsKKworCQkJLyogTGVnYWN5IHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGNhY2hlCisJCQkgKiBjb2hlcmVudCBETUEgYXJlIHVuc3VwcG9ydGVkICovCisJCQlkZXN0X3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZV91bmFsaWduZWQgPQorCQkJCWNkZl9vc19tZW1fYWxsb2NfY29uc2lzdGVudChzY24tPmNkZl9kZXYsCisJCQkJCQkobmVudHJpZXMgKgorCQkJCQkJc2l6ZW9mKHN0cnVjdCBDRV9kZXN0X2Rlc2MpICsKKwkJCQkJCUNFX0RFU0NfUklOR19BTElHTiksCisJCQkJCQkmYmFzZV9hZGRyLCAwKTsKKwkJCWlmIChkZXN0X3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZV91bmFsaWduZWQKKwkJCQk9PSBOVUxMKSB7CisJCQkJSElGX0VSUk9SKCIlczogZGVzdCByaW5nIGhhcyBubyBETUEgbWVtIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQkJZ290byBlcnJvcl9ub19kbWFfbWVtOworCQkJfQorCQkJZGVzdF9yaW5nLT5iYXNlX2FkZHJfQ0Vfc3BhY2VfdW5hbGlnbmVkID0gYmFzZV9hZGRyOworCisJCQkvKiBDb3JyZWN0bHkgaW5pdGlhbGl6ZSBtZW1vcnkgdG8gMCB0bworCQkJICogcHJldmVudCBnYXJiYWdlIGRhdGEgY3Jhc2hpbmcgc3lzdGVtCisJCQkgKiB3aGVuIGRvd25sb2FkIGZpcm13YXJlCisJCQkgKi8KKwkJCWNkZl9tZW1femVybyhkZXN0X3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZV91bmFsaWduZWQsCisJCQkJICBuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgQ0VfZGVzdF9kZXNjKSArCisJCQkJICBDRV9ERVNDX1JJTkdfQUxJR04pOworCisJCQlpZiAoZGVzdF9yaW5nLT4KKwkJCSAgICBiYXNlX2FkZHJfQ0Vfc3BhY2VfdW5hbGlnbmVkICYgKENFX0RFU0NfUklOR19BTElHTiAtCisJCQkJCQkJICAgIDEpKSB7CisKKwkJCQlkZXN0X3JpbmctPmJhc2VfYWRkcl9DRV9zcGFjZSA9CisJCQkJCShkZXN0X3JpbmctPgorCQkJCQkgYmFzZV9hZGRyX0NFX3NwYWNlX3VuYWxpZ25lZCArCisJCQkJCSBDRV9ERVNDX1JJTkdfQUxJR04gLQorCQkJCQkgMSkgJiB+KENFX0RFU0NfUklOR19BTElHTiAtIDEpOworCisJCQkJZGVzdF9yaW5nLT5iYXNlX2FkZHJfb3duZXJfc3BhY2UgPQorCQkJCQkodm9pZAorCQkJCQkgKikoKChzaXplX3QpIGRlc3RfcmluZy0+CisJCQkJCSAgICAgYmFzZV9hZGRyX293bmVyX3NwYWNlX3VuYWxpZ25lZCArCisJCQkJCSAgICAgQ0VfREVTQ19SSU5HX0FMSUdOIC0KKwkJCQkJICAgICAxKSAmIH4oQ0VfREVTQ19SSU5HX0FMSUdOIC0gMSkpOworCQkJfSBlbHNlIHsKKwkJCQlkZXN0X3JpbmctPmJhc2VfYWRkcl9DRV9zcGFjZSA9CisJCQkJCWRlc3RfcmluZy0+YmFzZV9hZGRyX0NFX3NwYWNlX3VuYWxpZ25lZDsKKwkJCQlkZXN0X3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZSA9CisJCQkJCWRlc3RfcmluZy0+CisJCQkJCWJhc2VfYWRkcl9vd25lcl9zcGFjZV91bmFsaWduZWQ7CisJCQl9CisKKwkJCUFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVRfUFRSKHNjbik7CisJCQlkbWFfYWRkciA9IGRlc3RfcmluZy0+YmFzZV9hZGRyX0NFX3NwYWNlOworCQkJQ0VfREVTVF9SSU5HX0JBU0VfQUREUl9TRVQoc2NuLCBjdHJsX2FkZHIsCisJCQkJICh1aW50MzJfdCkoZG1hX2FkZHIgJiAweEZGRkZGRkZGKSk7CisjaWZkZWYgV0xBTl9FTkFCTEVfUUNBNjE4MAorCQkJeworCQkJCXVpbnQzMl90IHRtcDsKKwkJCQl0bXAgPSBDRV9ERVNUX1JJTkdfQkFTRV9BRERSX0hJR0hfR0VUKHNjbiwKKwkJCQkJCWN0cmxfYWRkcik7CisJCQkJdG1wICY9IH4weDFGOworCQkJCWRtYV9hZGRyID0gKChkbWFfYWRkciA+PiAzMikgJiAweDFGKXx0bXA7CisJCQkJQ0VfREVTVF9SSU5HX0JBU0VfQUREUl9ISUdIX1NFVChzY24sCisJCQkJCWN0cmxfYWRkciwgKHVpbnQzMl90KWRtYV9hZGRyKTsKKwkJCX0KKyNlbmRpZgorCQkJQ0VfREVTVF9SSU5HX1NaX1NFVChzY24sIGN0cmxfYWRkciwgbmVudHJpZXMpOworI2lmZGVmIEJJR19FTkRJQU5fSE9TVAorCQkJLyogRW5hYmxlIERlc3QgcmluZyBieXRlIHN3YXAgZm9yIGJpZyBlbmRpYW4gaG9zdCAqLworCQkJQ0VfREVTVF9SSU5HX0JZVEVfU1dBUF9TRVQoc2NuLCBjdHJsX2FkZHIsIDEpOworI2VuZGlmCisJCQlDRV9ERVNUX1JJTkdfTE9XTUFSS19TRVQoc2NuLCBjdHJsX2FkZHIsIDApOworCQkJQ0VfREVTVF9SSU5HX0hJR0hNQVJLX1NFVChzY24sIGN0cmxfYWRkciwgbmVudHJpZXMpOworCQkJQV9UQVJHRVRfQUNDRVNTX0VORF9SRVRfUFRSKHNjbik7CisKKwkJCS8qIGVwcGluZyAqLworCQkJLyogcG9sbCB0aW1lciAqLworCQkJaWYgKChDRV9zdGF0ZS0+YXR0cl9mbGFncyAmIENFX0FUVFJfRU5BQkxFX1BPTEwpKSB7CisJCQkJY2RmX3NvZnRpcnFfdGltZXJfaW5pdChzY24tPmNkZl9kZXYsCisJCQkJCQkgICAgICAgJkNFX3N0YXRlLT5wb2xsX3RpbWVyLAorCQkJCQkJICAgICAgIGNlX3BvbGxfdGltZW91dCwKKwkJCQkJCSAgICAgICBDRV9zdGF0ZSwKKwkJCQkJCSAgICAgICBDREZfVElNRVJfVFlQRV9TVyk7CisJCQkJQ0Vfc3RhdGUtPnRpbWVyX2luaXRlZCA9IHRydWU7CisJCQkJY2RmX3NvZnRpcnFfdGltZXJfbW9kKCZDRV9zdGF0ZS0+cG9sbF90aW1lciwKKwkJCQkJCSAgICAgIENFX1BPTExfVElNRU9VVCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBFbmFibGUgQ0UgZXJyb3IgaW50ZXJydXB0cyAqLworCUFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVRfUFRSKHNjbik7CisJQ0VfRVJST1JfSU5UUl9FTkFCTEUoc2NuLCBjdHJsX2FkZHIpOworCUFfVEFSR0VUX0FDQ0VTU19FTkRfUkVUX1BUUihzY24pOworCisJcmV0dXJuIChzdHJ1Y3QgQ0VfaGFuZGxlICopQ0Vfc3RhdGU7CisKK2Vycm9yX25vX2RtYV9tZW06CisJY2VfZmluaSgoc3RydWN0IENFX2hhbmRsZSAqKUNFX3N0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorLyoqCisgKiBjZV9oMnRfdHhfY2VfY2xlYW51cCgpIFBsYWNlIGhvbGRlciBmdW5jdGlvbiBmb3IgSDJUIENFIGNsZWFudXAuCisgKiBObyBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uLgorICogQGNlX2hkbDogQ29wZSBlbmdpbmUgaGFuZGxlCisgKiBVc2luZyBhbiBhc3NlcnQsIHRoaXMgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0LAorICogdGhlIFRYIENFIGhhcyBiZWVuIHByb2Nlc3NlZCBjb21wbGV0ZWx5LgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQKK2NlX2gydF90eF9jZV9jbGVhbnVwKHN0cnVjdCBDRV9oYW5kbGUgKmNlX2hkbCkKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKmNlX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWNlX2hkbDsKKwlzdHJ1Y3QgQ0VfcmluZ19zdGF0ZSAqc3JjX3JpbmcgPSBjZV9zdGF0ZS0+c3JjX3Jpbmc7CisJc3RydWN0IG9sX3NvZnRjICpzYyA9IGNlX3N0YXRlLT5zY247CisJdWludDMyX3Qgc3dfaW5kZXgsIHdyaXRlX2luZGV4OworCisJaWYgKHNjLT5mYXN0cGF0aF9tb2RlX29uICYmIChjZV9zdGF0ZS0+aWQgPT0gQ0VfSFRUX0gyVF9NU0cpKSB7CisJCUhJRl9JTkZPKCIlcyAlZCBGYXN0cGF0aCBtb2RlIE9OLCBDbGVhbmluZyB1cCBIVFQgVHggQ0VcbiIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWNkZl9zcGluX2xvY2tfYmgoJnNjLT50YXJnZXRfbG9jayk7CisJCXN3X2luZGV4ID0gc3JjX3JpbmctPnN3X2luZGV4OworCQl3cml0ZV9pbmRleCA9IHNyY19yaW5nLT5zd19pbmRleDsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZzYy0+dGFyZ2V0X2xvY2spOworCisJCS8qIEF0IHRoaXMgcG9pbnQgVHggQ0Ugc2hvdWxkIGJlIGNsZWFuICovCisJCWNkZl9hc3NlcnRfYWx3YXlzKHN3X2luZGV4ID09IHdyaXRlX2luZGV4KTsKKwl9Cit9CisjZWxzZQordm9pZCBjZV9oMnRfdHhfY2VfY2xlYW51cChzdHJ1Y3QgQ0VfaGFuZGxlICpjZV9oZGwpCit7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0ZBU1RQQVRIICovCisKK3ZvaWQgY2VfZmluaShzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nKQoreworCXN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGUgPSAoc3RydWN0IENFX3N0YXRlICopY29weWVuZzsKKwl1bnNpZ25lZCBpbnQgQ0VfaWQgPSBDRV9zdGF0ZS0+aWQ7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBDRV9zdGF0ZS0+c2NuOworCisJQ0Vfc3RhdGUtPnN0YXRlID0gQ0VfVU5VU0VEOworCXNjbi0+Y2VfaWRfdG9fc3RhdGVbQ0VfaWRdID0gTlVMTDsKKwlpZiAoQ0Vfc3RhdGUtPnNyY19yaW5nKSB7CisJCS8qIENsZWFudXAgdGhlIEhUVCBUeCByaW5nICovCisJCWNlX2gydF90eF9jZV9jbGVhbnVwKGNvcHllbmcpOworCisJCWlmIChDRV9zdGF0ZS0+c3JjX3JpbmctPnNoYWRvd19iYXNlX3VuYWxpZ25lZCkKKwkJCWNkZl9tZW1fZnJlZShDRV9zdGF0ZS0+c3JjX3JpbmctPnNoYWRvd19iYXNlX3VuYWxpZ25lZCk7CisJCWlmIChDRV9zdGF0ZS0+c3JjX3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZV91bmFsaWduZWQpCisJCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudChzY24tPmNkZl9kZXYsCisJCQkJCSAgICAoQ0Vfc3RhdGUtPnNyY19yaW5nLT5uZW50cmllcyAqCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBDRV9zcmNfZGVzYykgKworCQkJCQkgICAgIENFX0RFU0NfUklOR19BTElHTiksCisJCQkJCSAgICBDRV9zdGF0ZS0+c3JjX3JpbmctPgorCQkJCQkgICAgYmFzZV9hZGRyX293bmVyX3NwYWNlX3VuYWxpZ25lZCwKKwkJCQkJICAgIENFX3N0YXRlLT5zcmNfcmluZy0+CisJCQkJCSAgICBiYXNlX2FkZHJfQ0Vfc3BhY2UsIDApOworCQljZGZfbWVtX2ZyZWUoQ0Vfc3RhdGUtPnNyY19yaW5nKTsKKwl9CisJaWYgKENFX3N0YXRlLT5kZXN0X3JpbmcpIHsKKwkJaWYgKENFX3N0YXRlLT5kZXN0X3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZV91bmFsaWduZWQpCisJCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudChzY24tPmNkZl9kZXYsCisJCQkJCSAgICAoQ0Vfc3RhdGUtPmRlc3RfcmluZy0+bmVudHJpZXMgKgorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgQ0VfZGVzdF9kZXNjKSArCisJCQkJCSAgICAgQ0VfREVTQ19SSU5HX0FMSUdOKSwKKwkJCQkJICAgIENFX3N0YXRlLT5kZXN0X3JpbmctPgorCQkJCQkgICAgYmFzZV9hZGRyX293bmVyX3NwYWNlX3VuYWxpZ25lZCwKKwkJCQkJICAgIENFX3N0YXRlLT5kZXN0X3JpbmctPgorCQkJCQkgICAgYmFzZV9hZGRyX0NFX3NwYWNlLCAwKTsKKwkJY2RmX21lbV9mcmVlKENFX3N0YXRlLT5kZXN0X3JpbmcpOworCisJCS8qIGVwcGluZyAqLworCQlpZiAoQ0Vfc3RhdGUtPnRpbWVyX2luaXRlZCkgeworCQkJQ0Vfc3RhdGUtPnRpbWVyX2luaXRlZCA9IGZhbHNlOworCQkJY2RmX3NvZnRpcnFfdGltZXJfZnJlZSgmQ0Vfc3RhdGUtPnBvbGxfdGltZXIpOworCQl9CisJfQorCWNkZl9tZW1fZnJlZShDRV9zdGF0ZSk7Cit9CisKK3ZvaWQgaGlmX2RldGFjaF9odGMoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX3N0YXRlID0gKHN0cnVjdCBISUZfQ0Vfc3RhdGUgKilzY24tPmhpZl9oZGw7CisKKwljZGZfbWVtX3plcm8oJmhpZl9zdGF0ZS0+bXNnX2NhbGxiYWNrc19wZW5kaW5nLAorCQkgIHNpemVvZihoaWZfc3RhdGUtPm1zZ19jYWxsYmFja3NfcGVuZGluZykpOworCWNkZl9tZW1femVybygmaGlmX3N0YXRlLT5tc2dfY2FsbGJhY2tzX2N1cnJlbnQsCisJCSAgc2l6ZW9mKGhpZl9zdGF0ZS0+bXNnX2NhbGxiYWNrc19jdXJyZW50KSk7Cit9CisKKy8qIFNlbmQgdGhlIGZpcnN0IG5ieXRlcyBieXRlcyBvZiB0aGUgYnVmZmVyICovCitDREZfU1RBVFVTCitoaWZfc2VuZF9oZWFkKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLAorCSAgICAgIHVpbnQ4X3QgcGlwZSwgdW5zaWduZWQgaW50IHRyYW5zZmVyX2lkLCB1bnNpZ25lZCBpbnQgbmJ5dGVzLAorCSAgICAgIGNkZl9uYnVmX3QgbmJ1ZiwgdW5zaWduZWQgaW50IGRhdGFfYXR0cikKK3sKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKXNjbi0+aGlmX2hkbDsKKwlzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqcGlwZV9pbmZvID0gJihoaWZfc3RhdGUtPnBpcGVfaW5mb1twaXBlXSk7CisJc3RydWN0IENFX2hhbmRsZSAqY2VfaGRsID0gcGlwZV9pbmZvLT5jZV9oZGw7CisJaW50IGJ5dGVzID0gbmJ5dGVzLCBuZnJhZ3MgPSAwOworCXN0cnVjdCBjZV9zZW5kbGlzdCBzZW5kbGlzdDsKKwlpbnQgc3RhdHVzLCBpID0gMDsKKwl1bnNpZ25lZCBpbnQgbXV4X2lkID0gMDsKKworCUNERl9BU1NFUlQobmJ5dGVzIDw9IGNkZl9uYnVmX2xlbihuYnVmKSk7CisKKwl0cmFuc2Zlcl9pZCA9CisJCShtdXhfaWQgJiBNVVhfSURfTUFTSykgfAorCQkodHJhbnNmZXJfaWQgJiBUUkFOU0FDVElPTl9JRF9NQVNLKTsKKwlkYXRhX2F0dHIgJj0gREVTQ19EQVRBX0ZMQUdfTUFTSzsKKwkvKgorCSAqIFRoZSBjb21tb24gY2FzZSBpbnZvbHZlcyBzZW5kaW5nIG11bHRpcGxlIGZyYWdtZW50cyB3aXRoaW4gYQorCSAqIHNpbmdsZSBkb3dubG9hZCAodGhlIHR4IGRlc2NyaXB0b3IgYW5kIHRoZSB0eCBmcmFtZSBoZWFkZXIpLgorCSAqIFNvLCBvcHRpbWl6ZSBmb3IgdGhlIGNhc2Ugb2YgbXVsdGlwbGUgZnJhZ21lbnRzIGJ5IG5vdCBldmVuCisJICogY2hlY2tpbmcgd2hldGhlciBpdCdzIG5lY2Vzc2FyeSB0byB1c2UgYSBzZW5kbGlzdC4KKwkgKiBUaGUgb3ZlcmhlYWQgb2YgdXNpbmcgYSBzZW5kbGlzdCBmb3IgYSBzaW5nbGUgYnVmZmVyIGRvd25sb2FkCisJICogaXMgbm90IGEgYmlnIGRlYWwsIHNpbmNlIGl0IGhhcHBlbnMgcmFyZWx5IChmb3IgV01JIG1lc3NhZ2VzKS4KKwkgKi8KKwljZV9zZW5kbGlzdF9pbml0KCZzZW5kbGlzdCk7CisJZG8geworCQl1aW50MzJfdCBmcmFnX3BhZGRyOworCQlpbnQgZnJhZ19ieXRlczsKKworCQlmcmFnX3BhZGRyID0gY2RmX25idWZfZ2V0X2ZyYWdfcGFkZHJfbG8obmJ1ZiwgbmZyYWdzKTsKKwkJZnJhZ19ieXRlcyA9IGNkZl9uYnVmX2dldF9mcmFnX2xlbihuYnVmLCBuZnJhZ3MpOworCQkvKgorCQkgKiBDbGVhciB0aGUgcGFja2V0IG9mZnNldCBmb3IgYWxsIGJ1dCB0aGUgZmlyc3QgQ0UgZGVzYy4KKwkJICovCisJCWlmIChpKysgPiAwKQorCQkJZGF0YV9hdHRyICY9IH5DREZfQ0VfVFhfUEtUX09GRlNFVF9CSVRfTTsKKworCQlzdGF0dXMgPSBjZV9zZW5kbGlzdF9idWZfYWRkKCZzZW5kbGlzdCwgZnJhZ19wYWRkciwKKwkJCQkgICAgZnJhZ19ieXRlcyA+CisJCQkJICAgIGJ5dGVzID8gYnl0ZXMgOiBmcmFnX2J5dGVzLAorCQkJCSAgICBjZGZfbmJ1Zl9nZXRfZnJhZ19pc193b3Jkc3RyZWFtCisJCQkJICAgIChuYnVmLAorCQkJCSAgICBuZnJhZ3MpID8gMCA6CisJCQkJICAgIENFX1NFTkRfRkxBR19TV0FQX0RJU0FCTEUsCisJCQkJICAgIGRhdGFfYXR0cik7CisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlISUZfRVJST1IoIiVzOiBlcnJvciwgZnJhZ19udW0gJWQgbGFyZ2VyIHRoYW4gbGltaXQiLAorCQkJCV9fZnVuY19fLCBuZnJhZ3MpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlieXRlcyAtPSBmcmFnX2J5dGVzOworCQluZnJhZ3MrKzsKKwl9IHdoaWxlIChieXRlcyA+IDApOworCisJLyogTWFrZSBzdXJlIHdlIGhhdmUgcmVzb3VyY2VzIHRvIGhhbmRsZSB0aGlzIHJlcXVlc3QgKi8KKwljZGZfc3Bpbl9sb2NrX2JoKCZwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisJaWYgKHBpcGVfaW5mby0+bnVtX3NlbmRzX2FsbG93ZWQgPCBuZnJhZ3MpIHsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisJCWNlX3BrdF9lcnJvcl9jb3VudF9pbmNyKGhpZl9zdGF0ZSwgSElGX1BJUEVfTk9fUkVTT1VSQ0UpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwl9CisJcGlwZV9pbmZvLT5udW1fc2VuZHNfYWxsb3dlZCAtPSBuZnJhZ3M7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisKKwlpZiAoY2RmX3VubGlrZWx5KGNlX2hkbCA9PSBOVUxMKSkgeworCQlISUZfRVJST1IoIiVzOiBlcnJvciBDRSBoYW5kbGUgaXMgbnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCisJTkJVRl9VUERBVEVfVFhfUEtUX0NPVU5UKG5idWYsIE5CVUZfVFhfUEtUX0hJRik7CisJRFBUUkFDRShjZGZfZHBfdHJhY2UobmJ1ZiwgQ0RGX0RQX1RSQUNFX0hJRl9QQUNLRVRfUFRSX1JFQ09SRCwKKwkJCQkodWludDhfdCAqKShjZGZfbmJ1Zl9kYXRhKG5idWYpKSwKKwkJCQlzaXplb2YoY2RmX25idWZfZGF0YShuYnVmKSkpKTsKKwlzdGF0dXMgPSBjZV9zZW5kbGlzdF9zZW5kKGNlX2hkbCwgbmJ1ZiwgJnNlbmRsaXN0LCB0cmFuc2Zlcl9pZCk7CisJQ0RGX0FTU0VSVChzdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgaGlmX3NlbmRfY29tcGxldGVfY2hlY2soc3RydWN0IG9sX3NvZnRjICpzY24sIHVpbnQ4X3QgcGlwZSwgaW50IGZvcmNlKQoreworCWlmICghZm9yY2UpIHsKKwkJaW50IHJlc291cmNlczsKKwkJLyoKKwkJICogRGVjaWRlIHdoZXRoZXIgdG8gYWN0dWFsbHkgcG9sbCBmb3IgY29tcGxldGlvbnMsIG9yIGp1c3QKKwkJICogd2FpdCBmb3IgYSBsYXRlciBjaGFuY2UuIElmIHRoZXJlIHNlZW0gdG8gYmUgcGxlbnR5IG9mCisJCSAqIHJlc291cmNlcyBsZWZ0LCB0aGVuIGp1c3Qgd2FpdCwgc2luY2UgY2hlY2tpbmcgaW52b2x2ZXMKKwkJICogcmVhZGluZyBhIENFIHJlZ2lzdGVyLCB3aGljaCBpcyBhIHJlbGF0aXZlbHkgZXhwZW5zaXZlCisJCSAqIG9wZXJhdGlvbi4KKwkJICovCisJCXJlc291cmNlcyA9IGhpZl9nZXRfZnJlZV9xdWV1ZV9udW1iZXIoc2NuLCBwaXBlKTsKKwkJLyoKKwkJICogSWYgYXQgbGVhc3QgNTAlIG9mIHRoZSB0b3RhbCByZXNvdXJjZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSwKKwkJICogZG9uJ3QgYm90aGVyIGNoZWNraW5nIGFnYWluIHlldC4KKwkJICovCisJCWlmIChyZXNvdXJjZXMgPiAoaG9zdF9jZV9jb25maWdbcGlwZV0uc3JjX25lbnRyaWVzID4+IDEpKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisjaWZkZWYgIEFUSF8xMUFDX1RYQ09NUEFDVAorCWNlX3Blcl9lbmdpbmVfc2VydmljZXJlYXAoc2NuLCBwaXBlKTsKKyNlbHNlCisJY2VfcGVyX2VuZ2luZV9zZXJ2aWNlKHNjbiwgcGlwZSk7CisjZW5kaWYKK30KKwordWludDE2X3QgaGlmX2dldF9mcmVlX3F1ZXVlX251bWJlcihzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdWludDhfdCBwaXBlKQoreworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZSA9IChzdHJ1Y3QgSElGX0NFX3N0YXRlICopc2NuLT5oaWZfaGRsOworCXN0cnVjdCBISUZfQ0VfcGlwZV9pbmZvICpwaXBlX2luZm8gPSAmKGhpZl9zdGF0ZS0+cGlwZV9pbmZvW3BpcGVdKTsKKwl1aW50MTZfdCBydjsKKworCWNkZl9zcGluX2xvY2tfYmgoJnBpcGVfaW5mby0+Y29tcGxldGlvbl9mcmVlcV9sb2NrKTsKKwlydiA9IHBpcGVfaW5mby0+bnVtX3NlbmRzX2FsbG93ZWQ7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisJcmV0dXJuIHJ2OworfQorCisvKiBDYWxsZWQgYnkgbG93ZXIgKENFKSBsYXllciB3aGVuIGEgc2VuZCB0byBUYXJnZXQgY29tcGxldGVzLiAqLwordm9pZAoraGlmX3BjaV9jZV9zZW5kX2RvbmUoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywgdm9pZCAqY2VfY29udGV4dCwKKwkJICAgICB2b2lkICp0cmFuc2Zlcl9jb250ZXh0LCBjZGZfZG1hX2FkZHJfdCBDRV9kYXRhLAorCQkgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9pZCwKKwkJICAgICB1bnNpZ25lZCBpbnQgc3dfaW5kZXgsIHVuc2lnbmVkIGludCBod19pbmRleCwKKwkJICAgICB1bnNpZ25lZCBpbnQgdG9lcGxpdHpfaGFzaF9yZXN1bHQpCit7CisJc3RydWN0IEhJRl9DRV9waXBlX2luZm8gKnBpcGVfaW5mbyA9CisJCShzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqKWNlX2NvbnRleHQ7CisJc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX3N0YXRlID0gcGlwZV9pbmZvLT5ISUZfQ0Vfc3RhdGU7CisJc3RydWN0IEhJRl9DRV9jb21wbGV0aW9uX3N0YXRlICpjb21wbF9zdGF0ZTsKKwlzdHJ1Y3QgSElGX0NFX2NvbXBsZXRpb25fc3RhdGUgKmNvbXBsX3F1ZXVlX2hlYWQsICpjb21wbF9xdWV1ZV90YWlsOworCXVuc2lnbmVkIGludCBzd19pZHggPSBzd19pbmRleCwgaHdfaWR4ID0gaHdfaW5kZXg7CisKKwljb21wbF9xdWV1ZV9oZWFkID0gY29tcGxfcXVldWVfdGFpbCA9IE5VTEw7CisJZG8geworCQkvKgorCQkgKiBGb3IgdGhlIHNlbmQgY29tcGxldGlvbiBvZiBhbiBpdGVtIGluIHNlbmRsaXN0LCBqdXN0IGluY3JlbWVudAorCQkgKiBudW1fc2VuZHNfYWxsb3dlZC4gVGhlIHVwcGVyIGxheWVyIGNhbGxiYWNrIHdpbGwgYmUgdHJpZ2dlcmVkCisJCSAqIHdoZW4gbGFzdCBmcmFnbWVudCBpcyBkb25lIHdpdGggc2VuZC4KKwkJICovCisJCWlmICh0cmFuc2Zlcl9jb250ZXh0ID09IENFX1NFTkRMSVNUX0lURU1fQ1RYVCkgeworCQkJY2RmX3NwaW5fbG9jaygmcGlwZV9pbmZvLT5jb21wbGV0aW9uX2ZyZWVxX2xvY2spOworCQkJcGlwZV9pbmZvLT5udW1fc2VuZHNfYWxsb3dlZCsrOworCQkJY2RmX3NwaW5fdW5sb2NrKCZwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWNkZl9zcGluX2xvY2soJnBpcGVfaW5mby0+Y29tcGxldGlvbl9mcmVlcV9sb2NrKTsKKwkJY29tcGxfc3RhdGUgPSBwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfaGVhZDsKKwkJaWYgKCFjb21wbF9zdGF0ZSkgeworCQkJY2RmX3NwaW5fdW5sb2NrKCZwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisJCQlISUZfRVJST1IoIiVzOiBjZV9pZDolZCBudW1fYWxsb3dlZDolZCBwaXBlX2luZm86JXAiLAorCQkJCQkgX19mdW5jX18sIHBpcGVfaW5mby0+cGlwZV9udW0sCisJCQkJCSBwaXBlX2luZm8tPm51bV9zZW5kc19hbGxvd2VkLAorCQkJCQkgcGlwZV9pbmZvKTsKKwkJCUFTU0VSVCgwKTsKKwkJCWJyZWFrOworCQl9CisJCXBpcGVfaW5mby0+Y29tcGxldGlvbl9mcmVlcV9oZWFkID0gY29tcGxfc3RhdGUtPm5leHQ7CisJCWNkZl9zcGluX3VubG9jaygmcGlwZV9pbmZvLT5jb21wbGV0aW9uX2ZyZWVxX2xvY2spOworCisJCWNvbXBsX3N0YXRlLT5uZXh0ID0gTlVMTDsKKwkJY29tcGxfc3RhdGUtPnNlbmRfb3JfcmVjdiA9IEhJRl9DRV9DT01QTEVURV9TRU5EOworCQljb21wbF9zdGF0ZS0+Y29weWVuZyA9IGNvcHllbmc7CisJCWNvbXBsX3N0YXRlLT5jZV9jb250ZXh0ID0gY2VfY29udGV4dDsKKwkJY29tcGxfc3RhdGUtPnRyYW5zZmVyX2NvbnRleHQgPSB0cmFuc2Zlcl9jb250ZXh0OworCQljb21wbF9zdGF0ZS0+ZGF0YSA9IENFX2RhdGE7CisJCWNvbXBsX3N0YXRlLT5uYnl0ZXMgPSBuYnl0ZXM7CisJCWNvbXBsX3N0YXRlLT50cmFuc2Zlcl9pZCA9IHRyYW5zZmVyX2lkOworCQljb21wbF9zdGF0ZS0+ZmxhZ3MgPSAwOworCQljb21wbF9zdGF0ZS0+dG9lcGxpdHpfaGFzaF9yZXN1bHQgPSB0b2VwbGl0el9oYXNoX3Jlc3VsdDsKKworCQkvKiBFbnF1ZXVlIGF0IGVuZCBvZiBsb2NhbCBxdWV1ZSAqLworCQlpZiAoY29tcGxfcXVldWVfdGFpbCkgeworCQkJY29tcGxfcXVldWVfdGFpbC0+bmV4dCA9IGNvbXBsX3N0YXRlOworCQl9IGVsc2UgeworCQkJY29tcGxfcXVldWVfaGVhZCA9IGNvbXBsX3N0YXRlOworCQl9CisJCWNvbXBsX3F1ZXVlX3RhaWwgPSBjb21wbF9zdGF0ZTsKKwl9IHdoaWxlIChjZV9jb21wbGV0ZWRfc2VuZF9uZXh0KGNvcHllbmcsCisJCQkmY2VfY29udGV4dCwgJnRyYW5zZmVyX2NvbnRleHQsCisJCQkmQ0VfZGF0YSwgJm5ieXRlcywgJnRyYW5zZmVyX2lkLAorCQkJJnN3X2lkeCwgJmh3X2lkeCwKKwkJCSZ0b2VwbGl0el9oYXNoX3Jlc3VsdCkgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKTsKKworCWlmIChjb21wbF9xdWV1ZV9oZWFkID09IE5VTEwpIHsKKwkJLyoKKwkJICogSWYgb25seSBzb21lIG9mIHRoZSBpdGVtcyB3aXRoaW4gYSBzZW5kbGlzdCBoYXZlIGNvbXBsZXRlZCwKKwkJICogZG9uJ3QgaW52b2tlIGNvbXBsZXRpb24gcHJvY2Vzc2luZyB1bnRpbCB0aGUgZW50aXJlIHNlbmRsaXN0CisJCSAqIGhhcyBiZWVuIHNlbnQuCisJCSAqLworCQlyZXR1cm47CisJfQorCisJY2RmX3NwaW5fbG9jaygmaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX2xvY2spOworCisJLyogRW5xdWV1ZSB0aGUgbG9jYWwgY29tcGxldGlvbiBxdWV1ZSBvbiB0aGUKKwkgKiBwZXItZGV2aWNlIGNvbXBsZXRpb24gcXVldWUgKi8KKwlpZiAoaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX2hlYWQpIHsKKwkJaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX3RhaWwtPm5leHQgPSBjb21wbF9xdWV1ZV9oZWFkOworCQloaWZfc3RhdGUtPmNvbXBsZXRpb25fcGVuZGluZ3FfdGFpbCA9IGNvbXBsX3F1ZXVlX3RhaWw7CisJCWNkZl9zcGluX3VubG9jaygmaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX2xvY2spOworCX0gZWxzZSB7CisJCWhpZl9zdGF0ZS0+Y29tcGxldGlvbl9wZW5kaW5ncV9oZWFkID0gY29tcGxfcXVldWVfaGVhZDsKKwkJaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX3RhaWwgPSBjb21wbF9xdWV1ZV90YWlsOworCQljZGZfc3Bpbl91bmxvY2soJmhpZl9zdGF0ZS0+Y29tcGxldGlvbl9wZW5kaW5ncV9sb2NrKTsKKworCQkvKiBBbGVydCB0aGUgc2VuZCBjb21wbGV0aW9uIHNlcnZpY2UgdGhyZWFkICovCisJCWhpZl9jb21wbGV0aW9uX3RocmVhZChoaWZfc3RhdGUpOworCX0KK30KKworLyogQ2FsbGVkIGJ5IGxvd2VyIChDRSkgbGF5ZXIgd2hlbiBkYXRhIGlzIHJlY2VpdmVkIGZyb20gdGhlIFRhcmdldC4gKi8KK3ZvaWQKK2hpZl9wY2lfY2VfcmVjdl9kYXRhKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcsIHZvaWQgKmNlX2NvbnRleHQsCisJCSAgICAgdm9pZCAqdHJhbnNmZXJfY29udGV4dCwgY2RmX2RtYV9hZGRyX3QgQ0VfZGF0YSwKKwkJICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfaWQsCisJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBISUZfQ0VfcGlwZV9pbmZvICpwaXBlX2luZm8gPQorCQkoc3RydWN0IEhJRl9DRV9waXBlX2luZm8gKiljZV9jb250ZXh0OworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZSA9IHBpcGVfaW5mby0+SElGX0NFX3N0YXRlOworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gaGlmX3N0YXRlLT5zY247CisJc3RydWN0IEhJRl9DRV9jb21wbGV0aW9uX3N0YXRlICpjb21wbF9zdGF0ZTsKKwlzdHJ1Y3QgSElGX0NFX2NvbXBsZXRpb25fc3RhdGUgKmNvbXBsX3F1ZXVlX2hlYWQsICpjb21wbF9xdWV1ZV90YWlsOworCisJY29tcGxfcXVldWVfaGVhZCA9IGNvbXBsX3F1ZXVlX3RhaWwgPSBOVUxMOworCWRvIHsKKwkJY2RmX3NwaW5fbG9jaygmcGlwZV9pbmZvLT5jb21wbGV0aW9uX2ZyZWVxX2xvY2spOworCQljb21wbF9zdGF0ZSA9IHBpcGVfaW5mby0+Y29tcGxldGlvbl9mcmVlcV9oZWFkOworCQlBU1NFUlQoY29tcGxfc3RhdGUgIT0gTlVMTCk7CisJCXBpcGVfaW5mby0+Y29tcGxldGlvbl9mcmVlcV9oZWFkID0gY29tcGxfc3RhdGUtPm5leHQ7CisJCWNkZl9zcGluX3VubG9jaygmcGlwZV9pbmZvLT5jb21wbGV0aW9uX2ZyZWVxX2xvY2spOworCisJCWNvbXBsX3N0YXRlLT5uZXh0ID0gTlVMTDsKKwkJY29tcGxfc3RhdGUtPnNlbmRfb3JfcmVjdiA9IEhJRl9DRV9DT01QTEVURV9SRUNWOworCQljb21wbF9zdGF0ZS0+Y29weWVuZyA9IGNvcHllbmc7CisJCWNvbXBsX3N0YXRlLT5jZV9jb250ZXh0ID0gY2VfY29udGV4dDsKKwkJY29tcGxfc3RhdGUtPnRyYW5zZmVyX2NvbnRleHQgPSB0cmFuc2Zlcl9jb250ZXh0OworCQljb21wbF9zdGF0ZS0+ZGF0YSA9IENFX2RhdGE7CisJCWNvbXBsX3N0YXRlLT5uYnl0ZXMgPSBuYnl0ZXM7CisJCWNvbXBsX3N0YXRlLT50cmFuc2Zlcl9pZCA9IHRyYW5zZmVyX2lkOworCQljb21wbF9zdGF0ZS0+ZmxhZ3MgPSBmbGFnczsKKworCQkvKiBFbnF1ZXVlIGF0IGVuZCBvZiBsb2NhbCBxdWV1ZSAqLworCQlpZiAoY29tcGxfcXVldWVfdGFpbCkgeworCQkJY29tcGxfcXVldWVfdGFpbC0+bmV4dCA9IGNvbXBsX3N0YXRlOworCQl9IGVsc2UgeworCQkJY29tcGxfcXVldWVfaGVhZCA9IGNvbXBsX3N0YXRlOworCQl9CisJCWNvbXBsX3F1ZXVlX3RhaWwgPSBjb21wbF9zdGF0ZTsKKworCQljZGZfbmJ1Zl91bm1hcF9zaW5nbGUoc2NuLT5jZGZfZGV2LAorCQkJCSAgICAgIChjZGZfbmJ1Zl90KSB0cmFuc2Zlcl9jb250ZXh0LAorCQkJCSAgICAgIENERl9ETUFfRlJPTV9ERVZJQ0UpOworCisJCS8qCisJCSAqIEVWICMxMTI2OTMgLSBbUGVyZWdyaW5lXVtFUzFdW1dCMzQyXVtXaW44eDg2XVtQZXJmb3JtYW5jZV0KKwkJICogQlNvRF8weDEzMyBvY2N1cnJlZCBpbiBWSFQ4MCBVRFBfREwKKwkJICogQnJlYWsgb3V0IERQQyBieSBmb3JjZSBpZiBudW1iZXIgb2YgbG9vcHMgaW4KKwkJICogaGlmX3BjaV9jZV9yZWN2X2RhdGEgcmVhY2hlcyBNQVhfTlVNX09GX1JFQ0VJVkVTIHRvIGF2b2lkCisJCSAqIHNwZW5kaW5nIHRvbyBsb25nIHRpbWUgaW4gRFBDIGZvciBlYWNoIGludGVycnVwdCBoYW5kbGluZy4KKwkJICogU2NoZWR1bGUgYW5vdGhlciBEUEMgdG8gYXZvaWQgZGF0YSBsb3NzIGlmIHdlIGhhZCB0YWtlbgorCQkgKiBmb3JjZS1icmVhayBhY3Rpb24gYmVmb3JlIGFwcGx5IHRvIFdpbmRvd3MgT1Mgb25seQorCQkgKiBjdXJyZW50bHksIExpbnV4L01BQyBvcyBjYW4gZXhwYW5kIHRvIHRoZWlyIHBsYXRmb3JtCisJCSAqIGlmIG5lY2Vzc2FyeQorCQkgKi8KKworCQkvKiBTZXQgdXAgZm9yY2VfYnJlYWsgZmxhZyBpZiBudW0gb2YgcmVjZWljZXMgcmVhY2hlcworCQkgKiBNQVhfTlVNX09GX1JFQ0VJVkVTICovCisJCXNjbi0+cmVjZWl2ZV9jb3VudCsrOworCQlpZiAoY2RmX3VubGlrZWx5KGhpZl9tYXhfbnVtX3JlY2VpdmVzX3JlYWNoZWQoCisJCQkJc2NuLT5yZWNlaXZlX2NvdW50KSkpIHsKKwkJCXNjbi0+Zm9yY2VfYnJlYWsgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChjZV9jb21wbGV0ZWRfcmVjdl9uZXh0KGNvcHllbmcsICZjZV9jb250ZXh0LCAmdHJhbnNmZXJfY29udGV4dCwKKwkJCQkJJkNFX2RhdGEsICZuYnl0ZXMsICZ0cmFuc2Zlcl9pZCwKKwkJCQkJJmZsYWdzKSA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpOworCisJY2RmX3NwaW5fbG9jaygmaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX2xvY2spOworCisJLyogRW5xdWV1ZSB0aGUgbG9jYWwgY29tcGxldGlvbiBxdWV1ZSBvbiB0aGUKKwkgKiBwZXItZGV2aWNlIGNvbXBsZXRpb24gcXVldWUgKi8KKwlpZiAoaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX2hlYWQpIHsKKwkJaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX3RhaWwtPm5leHQgPSBjb21wbF9xdWV1ZV9oZWFkOworCQloaWZfc3RhdGUtPmNvbXBsZXRpb25fcGVuZGluZ3FfdGFpbCA9IGNvbXBsX3F1ZXVlX3RhaWw7CisJCWNkZl9zcGluX3VubG9jaygmaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX2xvY2spOworCX0gZWxzZSB7CisJCWhpZl9zdGF0ZS0+Y29tcGxldGlvbl9wZW5kaW5ncV9oZWFkID0gY29tcGxfcXVldWVfaGVhZDsKKwkJaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX3RhaWwgPSBjb21wbF9xdWV1ZV90YWlsOworCQljZGZfc3Bpbl91bmxvY2soJmhpZl9zdGF0ZS0+Y29tcGxldGlvbl9wZW5kaW5ncV9sb2NrKTsKKworCQkvKiBBbGVydCB0aGUgcmVjdiBjb21wbGV0aW9uIHNlcnZpY2UgdGhyZWFkICovCisJCWhpZl9jb21wbGV0aW9uX3RocmVhZChoaWZfc3RhdGUpOworCX0KK30KKworLyogVEJEWFhYOiBTZXQgQ0UgSGlnaCBXYXRlcm1hcms7IGludm9rZSB0eFJlc291cmNlQXZhaWxIYW5kbGVyIGluIHJlc3BvbnNlICovCisKK3ZvaWQKK2hpZl9wb3N0X2luaXQoc3RydWN0IG9sX3NvZnRjICpzY24sIHZvaWQgKnVudXNlZCwKKwkgICAgICBzdHJ1Y3QgaGlmX21zZ19jYWxsYmFja3MgKmNhbGxiYWNrcykKK3sKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKXNjbi0+aGlmX2hkbDsKKworI2lmZGVmIENPTkZJR19BVEhfUENJRV9BQ0NFU1NfREVCVUcKKwlzcGluX2xvY2tfaW5pdCgmcGNpZV9hY2Nlc3NfbG9nX2xvY2spOworI2VuZGlmCisJLyogU2F2ZSBjYWxsYmFja3MgZm9yIGxhdGVyIGluc3RhbGxhdGlvbiAqLworCWNkZl9tZW1fY29weSgmaGlmX3N0YXRlLT5tc2dfY2FsbGJhY2tzX3BlbmRpbmcsIGNhbGxiYWNrcywKKwkJIHNpemVvZihoaWZfc3RhdGUtPm1zZ19jYWxsYmFja3NfcGVuZGluZykpOworCit9CisKK3N0YXRpYyB2b2lkIGhpZl9wY2lfZnJlZV9jb21wbGV0ZV9zdGF0ZShzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqcGlwZV9pbmZvKQoreworICAgIHN0cnVjdCBISUZfQ0VfY29tcGxldGlvbl9zdGF0ZV9saXN0ICp0bXBfbGlzdDsKKworICAgIHdoaWxlIChwaXBlX2luZm8tPmNvbXBsZXRpb25fc3BhY2VfbGlzdCkgeworICAgICAgICB0bXBfbGlzdCA9IHBpcGVfaW5mby0+Y29tcGxldGlvbl9zcGFjZV9saXN0OworICAgICAgICBwaXBlX2luZm8tPmNvbXBsZXRpb25fc3BhY2VfbGlzdCA9IHRtcF9saXN0LT5uZXh0OworICAgICAgICBjZGZfbWVtX2ZyZWUodG1wX2xpc3QpOworICAgIH0KK30KKworc3RhdGljIGludCBoaWZfYWxsb2NfY29tcGxldGVfc3RhdGVfbGlzdCgKKwlzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqcGlwZV9pbmZvLAorCWludCBjb21wbGV0aW9uc19uZWVkZWQpCit7CisJc3RydWN0IEhJRl9DRV9jb21wbGV0aW9uX3N0YXRlICpjb21wbF9zdGF0ZTsKKwlzdHJ1Y3QgSElGX0NFX2NvbXBsZXRpb25fc3RhdGVfbGlzdCAqdG1wX2xpc3Q7CisJaW50IGk7CisJaW50IGlkeDsKKwlpbnQgbnVtX2xpc3Q7CisJaW50IGFsbG9jYXRlZF9ub2RlOworCWludCBudW1faW5fYmF0Y2g7CisJc2l6ZV90IGxlbjsKKworCWFsbG9jYXRlZF9ub2RlID0gMDsKKwludW1fbGlzdCA9IChjb21wbGV0aW9uc19uZWVkZWQgKyBISUZfQ0VfQ09NUExFVEVfU1RBVEVfTlVNIC0xKTsKKwludW1fbGlzdCAvPSBISUZfQ0VfQ09NUExFVEVfU1RBVEVfTlVNOworCWZvciAoaWR4ID0gMDsgaWR4IDwgbnVtX2xpc3Q7IGlkeCsrKSB7CisJCWlmIChjb21wbGV0aW9uc19uZWVkZWQgLSBhbGxvY2F0ZWRfbm9kZSA+PQorCQkJSElGX0NFX0NPTVBMRVRFX1NUQVRFX05VTSkKKwkJCW51bV9pbl9iYXRjaCA9IEhJRl9DRV9DT01QTEVURV9TVEFURV9OVU07CisJCWVsc2UKKwkJCW51bV9pbl9iYXRjaCA9IGNvbXBsZXRpb25zX25lZWRlZCAtIGFsbG9jYXRlZF9ub2RlOworCQlpZiAobnVtX2luX2JhdGNoIDw9IDApCisJCQlicmVhazsKKwkJbGVuID0gbnVtX2luX2JhdGNoICogc2l6ZW9mKHN0cnVjdCBISUZfQ0VfY29tcGxldGlvbl9zdGF0ZSkgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgSElGX0NFX2NvbXBsZXRpb25fc3RhdGVfbGlzdCk7CisJCS8qIEFsbG9jYXRlIHN0cnVjdHVyZXMgdG8gdHJhY2sgcGVuZGluZyBzZW5kL3JlY3YgY29tcGxldGlvbnMgKi8KKwkJdG1wX2xpc3QgPQorCQkJKHN0cnVjdCBISUZfQ0VfY29tcGxldGlvbl9zdGF0ZV9saXN0ICopCisJCQljZGZfbWVtX21hbGxvYyhsZW4pOworCQlpZiAoIXRtcF9saXN0KSB7CisJCQlISUZfRVJST1IoIiVzOiBjb21wbF9zdGF0ZSBoYXMgbm8gbWVtIiwgX19mdW5jX18pOworCQkJaGlmX3BjaV9mcmVlX2NvbXBsZXRlX3N0YXRlKHBpcGVfaW5mbyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY2RmX21lbV96ZXJvKHRtcF9saXN0LCBsZW4pOworCQljb21wbF9zdGF0ZSA9IChzdHJ1Y3QgSElGX0NFX2NvbXBsZXRpb25fc3RhdGUgKikKKwkJKCh1aW50OF90ICopdG1wX2xpc3QgKworCQkJIHNpemVvZihzdHJ1Y3QgSElGX0NFX2NvbXBsZXRpb25fc3RhdGVfbGlzdCkpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2luX2JhdGNoOyBpKyspIHsKKwkJCWNvbXBsX3N0YXRlLT5zZW5kX29yX3JlY3YgPSBISUZfQ0VfQ09NUExFVEVfRlJFRTsKKwkJCWNvbXBsX3N0YXRlLT5uZXh0ID0gTlVMTDsKKwkJCWlmIChwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfaGVhZCkKKwkJCQlwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfdGFpbC0+bmV4dCA9CisJCQkJCWNvbXBsX3N0YXRlOworCQkJZWxzZQorCQkJCXBpcGVfaW5mby0+Y29tcGxldGlvbl9mcmVlcV9oZWFkID0KKwkJCQkJY29tcGxfc3RhdGU7CisJCQlwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfdGFpbCA9IGNvbXBsX3N0YXRlOworCQkJY29tcGxfc3RhdGUrKzsKKwkJCWFsbG9jYXRlZF9ub2RlKys7CisJCX0KKwkJaWYgKHBpcGVfaW5mby0+Y29tcGxldGlvbl9zcGFjZV9saXN0ID09IE5VTEwpIHsKKwkJCXBpcGVfaW5mby0+Y29tcGxldGlvbl9zcGFjZV9saXN0ID0gdG1wX2xpc3Q7CisJCQl0bXBfbGlzdC0+bmV4dCA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQl0bXBfbGlzdC0+bmV4dCA9CisJCQkJcGlwZV9pbmZvLT5jb21wbGV0aW9uX3NwYWNlX2xpc3Q7CisJCQlwaXBlX2luZm8tPmNvbXBsZXRpb25fc3BhY2VfbGlzdCA9IHRtcF9saXN0OworCQl9CisJfQorCWNkZl9zcGlubG9ja19pbml0KCZwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisJcmV0dXJuIDA7Cit9CitpbnQgaGlmX2NvbXBsZXRpb25fdGhyZWFkX3N0YXJ0dXAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX3N0YXRlKQoreworCXN0cnVjdCBDRV9oYW5kbGUgKmNlX2RpYWcgPSBoaWZfc3RhdGUtPmNlX2RpYWc7CisJaW50IHBpcGVfbnVtOworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gaGlmX3N0YXRlLT5zY247CisKKwkvKiBkYWVtb25pemUoImhpZl9jb21wbF90aHJlYWQiKTsgKi8KKworCWNkZl9zcGlubG9ja19pbml0KCZoaWZfc3RhdGUtPmNvbXBsZXRpb25fcGVuZGluZ3FfbG9jayk7CisJaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX2hlYWQgPQorCQloaWZfc3RhdGUtPmNvbXBsZXRpb25fcGVuZGluZ3FfdGFpbCA9IE5VTEw7CisKKwlpZiAoc2NuLT5jZV9jb3VudCA9PSAwKSB7CisJCUhJRl9FUlJPUigiJXM6IEludmFsaWQgY2VfY291bnRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCUFfVEFSR0VUX0FDQ0VTU19MSUtFTFkoc2NuKTsKKwlmb3IgKHBpcGVfbnVtID0gMDsgcGlwZV9udW0gPCBzY24tPmNlX2NvdW50OyBwaXBlX251bSsrKSB7CisJCXN0cnVjdCBDRV9hdHRyIGF0dHI7CisJCXN0cnVjdCBISUZfQ0VfcGlwZV9pbmZvICpwaXBlX2luZm87CisJCWludCBjb21wbGV0aW9uc19uZWVkZWQ7CisKKwkJcGlwZV9pbmZvID0gJmhpZl9zdGF0ZS0+cGlwZV9pbmZvW3BpcGVfbnVtXTsKKwkJaWYgKHBpcGVfaW5mby0+Y2VfaGRsID09IGNlX2RpYWcpIHsKKwkJCWNvbnRpbnVlOyAgICAgICAvKiBIYW5kbGUgRGlhZ25vc3RpYyBDRSBzcGVjaWFsbHkgKi8KKwkJfQorCQlhdHRyID0gaG9zdF9jZV9jb25maWdbcGlwZV9udW1dOworCQljb21wbGV0aW9uc19uZWVkZWQgPSAwOworCQlpZiAoYXR0ci5zcmNfbmVudHJpZXMpIHsKKwkJCS8qIHBpcGUgdXNlZCB0byBzZW5kIHRvIHRhcmdldCAqLworCQkJSElGX0lORk9fTUVEKCIlczogcGlwZV9udW06JWQgcGlwZV9pbmZvOjB4JXAiLAorCQkJCQkgX19mdW5jX18sIHBpcGVfbnVtLCBwaXBlX2luZm8pOworCQkJY2Vfc2VuZF9jYl9yZWdpc3RlcihwaXBlX2luZm8tPmNlX2hkbCwKKwkJCQkJICAgIGhpZl9wY2lfY2Vfc2VuZF9kb25lLCBwaXBlX2luZm8sCisJCQkJCSAgICBhdHRyLmZsYWdzICYgQ0VfQVRUUl9ESVNBQkxFX0lOVFIpOworCQkJY29tcGxldGlvbnNfbmVlZGVkICs9IGF0dHIuc3JjX25lbnRyaWVzOworCQkJcGlwZV9pbmZvLT5udW1fc2VuZHNfYWxsb3dlZCA9IGF0dHIuc3JjX25lbnRyaWVzIC0gMTsKKwkJfQorCQlpZiAoYXR0ci5kZXN0X25lbnRyaWVzKSB7CisJCQkvKiBwaXBlIHVzZWQgdG8gcmVjZWl2ZSBmcm9tIHRhcmdldCAqLworCQkJY2VfcmVjdl9jYl9yZWdpc3RlcihwaXBlX2luZm8tPmNlX2hkbCwKKwkJCQkJICAgIGhpZl9wY2lfY2VfcmVjdl9kYXRhLCBwaXBlX2luZm8sCisJCQkJCSAgICBhdHRyLmZsYWdzICYgQ0VfQVRUUl9ESVNBQkxFX0lOVFIpOworCQkJY29tcGxldGlvbnNfbmVlZGVkICs9IGF0dHIuZGVzdF9uZW50cmllczsKKwkJfQorCisJCXBpcGVfaW5mby0+Y29tcGxldGlvbl9mcmVlcV9oZWFkID0KKwkJCXBpcGVfaW5mby0+Y29tcGxldGlvbl9mcmVlcV90YWlsID0gTlVMTDsKKwkJaWYgKGNvbXBsZXRpb25zX25lZWRlZCA+IDApIHsKKwkJCWludCByZXQ7CisKKwkJCXJldCA9IGhpZl9hbGxvY19jb21wbGV0ZV9zdGF0ZV9saXN0KHBpcGVfaW5mbywKKwkJCQljb21wbGV0aW9uc19uZWVkZWQpOworCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJSElGX0VSUk9SKCIlczogY2VfaWQgPSAlZCwgbm8gbWVtIiwKKwkJCQkJICBfX2Z1bmNfXywgcGlwZV9pbmZvLT5waXBlX251bSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKwlBX1RBUkdFVF9BQ0NFU1NfVU5MSUtFTFkoc2NuKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBoaWZfY29tcGxldGlvbl90aHJlYWRfc2h1dGRvd24oc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX3N0YXRlKQoreworCXN0cnVjdCBISUZfQ0VfY29tcGxldGlvbl9zdGF0ZSAqY29tcGxfc3RhdGU7CisJc3RydWN0IEhJRl9DRV9waXBlX2luZm8gKnBpcGVfaW5mbzsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGhpZl9zdGF0ZS0+c2NuOworCWludCBwaXBlX251bTsKKworCS8qCisJICogRHJvcCBwZW5kaW5nIGNvbXBsZXRpb25zLiAgVGhlc2UgaGF2ZSBhbHJlYWR5IGJlZW4KKwkgKiByZXBvcnRlZCBieSB0aGUgQ0UgbGF5ZXIgdG8gdXMgYnV0IHdlIGhhdmUgbm90IHlldAorCSAqIHBhc3NlZCB0aGVtIHVwc3RhY2suCisJICovCisJd2hpbGUgKChjb21wbF9zdGF0ZSA9IGhpZl9zdGF0ZS0+Y29tcGxldGlvbl9wZW5kaW5ncV9oZWFkKSAhPSBOVUxMKSB7CisJCWNkZl9uYnVmX3QgbmV0YnVmOworCisJCW5ldGJ1ZiA9IChjZGZfbmJ1Zl90KSBjb21wbF9zdGF0ZS0+dHJhbnNmZXJfY29udGV4dDsKKwkJY2RmX25idWZfZnJlZShuZXRidWYpOworCisJCWhpZl9zdGF0ZS0+Y29tcGxldGlvbl9wZW5kaW5ncV9oZWFkID0gY29tcGxfc3RhdGUtPm5leHQ7CisKKwkJLyoKKwkJICogTkI6IERvbid0IGJvdGhlciB0byBwbGFjZSBjb21wbF9zdGF0ZSBvbiBwaXBlJ3MgZnJlZSBxdWV1ZSwKKwkJICogYmVjYXVzZSB3ZSdsbCBmcmVlIHVuZGVybHlpbmcgbWVtb3J5IGZvciB0aGUgZnJlZSBxdWV1ZXMKKwkJICogaW4gYSBtb21lbnQgYW55d2F5LgorCQkgKi8KKwl9CisKKwlmb3IgKHBpcGVfbnVtID0gMDsgcGlwZV9udW0gPCBzY24tPmNlX2NvdW50OyBwaXBlX251bSsrKSB7CisJCXBpcGVfaW5mbyA9ICZoaWZfc3RhdGUtPnBpcGVfaW5mb1twaXBlX251bV07CisJCWhpZl9wY2lfZnJlZV9jb21wbGV0ZV9zdGF0ZShwaXBlX2luZm8pOworCQljZGZfc3BpbmxvY2tfZGVzdHJveSgmcGlwZV9pbmZvLT5jb21wbGV0aW9uX2ZyZWVxX2xvY2spOworCX0KKworCS8qIGhpZl9zdGF0ZS0+Y29tcGxfdGhyZWFkID0gTlVMTDsgKi8KKwkvKiBjb21wbGV0ZV9hbmRfZXhpdCgmaGlmX3N0YXRlLT5jb21wbF90aHJlYWRfZG9uZSwgMCk7ICovCit9CisKKy8qCisgKiBUaGlzIHRocmVhZCBwcm92aWRlcyBhIGNvbnRleHQgaW4gd2hpY2ggc2VuZC9yZWN2IGNvbXBsZXRpb25zCisgKiBhcmUgaGFuZGxlZC4KKyAqCisgKiBOb3RlOiBISUYgaW5zdGFsbHMgY2FsbGJhY2sgZnVuY3Rpb25zIHdpdGggdGhlIENFIGxheWVyLgorICogVGhvc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZGlyZWN0bHkgKGUuZy4gaW4gaW50ZXJydXB0IGNvbnRleHQpLgorICogVXBwZXIgbGF5ZXJzIChlLmcuIEhUQykgaGF2ZSBpbnN0YWxsZWQgY2FsbGJhY2tzIHdpdGggSElGIHdoaWNoCisgKiBleHBlY3QgdG8gYmUgY2FsbGVkIGluIGEgdGhyZWFkIGNvbnRleHQuIFRoaXMgaXMgd2hlcmUgdGhhdAorICogY29udmVyc2lvbiBvY2N1cnMuCisgKgorICogVEJEWFhYOiBDdXJyZW50bHkgd2UgdXNlIGp1c3Qgb25lIHRocmVhZCBmb3IgYWxsIHBpcGVzLgorICogVGhpcyBtaWdodCBiZSBzdWZmaWNpZW50IG9yIHdlIG1pZ2h0IG5lZWQgbXVsdGlwbGUgdGhyZWFkcy4KKyAqLworaW50CisvKiBoaWZfY29tcGxldGlvbl90aHJlYWQodm9pZCAqaGlmX2RldikgKi8KK2hpZl9jb21wbGV0aW9uX3RocmVhZChzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUpCit7CisJc3RydWN0IGhpZl9tc2dfY2FsbGJhY2tzICptc2dfY2FsbGJhY2tzID0KKwkJJmhpZl9zdGF0ZS0+bXNnX2NhbGxiYWNrc19jdXJyZW50OworCXN0cnVjdCBISUZfQ0VfY29tcGxldGlvbl9zdGF0ZSAqY29tcGxfc3RhdGU7CisKKwkvKiBBbGxvdyBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgdGhyZWFkIHRvIGV4ZWN1dGUgYXQgYSB0aW1lIHRvCisJICogcHJldmVudCBvdXQgb2Ygb3JkZXIgcHJvY2Vzc2luZyBvZiBtZXNzYWdlcyAtIHRoaXMgaXMgYmFkIGZvciBoaWdoZXIKKwkgKiBsYXllciBjb2RlCisJICovCisJaWYgKCFjZGZfYXRvbWljX2RlY19hbmRfdGVzdCgmaGlmX3N0YXRlLT5oaWZfdGhyZWFkX2lkbGUpKSB7CisJCS8qIFdlIHdlcmUgbm90IHRoZSBsdWNreSBvbmUgKi8KKwkJY2RmX2F0b21pY19pbmMoJmhpZl9zdGF0ZS0+aGlmX3RocmVhZF9pZGxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFtc2dfY2FsbGJhY2tzLT5md0V2ZW50SGFuZGxlcgorCSAgICB8fCAhbXNnX2NhbGxiYWNrcy0+dHhDb21wbGV0aW9uSGFuZGxlcgorCSAgICB8fCAhbXNnX2NhbGxiYWNrcy0+cnhDb21wbGV0aW9uSGFuZGxlcikgeworCQlyZXR1cm4gMDsKKwl9CisJd2hpbGUgKGF0b21pY19yZWFkKCZoaWZfc3RhdGUtPmZ3X2V2ZW50X3BlbmRpbmcpID4gMCkgeworCQkvKgorCQkgKiBDbGVhciBwZW5kaW5nIHN0YXRlIGJlZm9yZSBoYW5kbGluZywgaW4gY2FzZSB0aGVyZSdzCisJCSAqIGFub3RoZXIgd2hpbGUgd2UgcHJvY2VzcyB0aGUgZmlyc3QuCisJCSAqLworCQlhdG9taWNfc2V0KCZoaWZfc3RhdGUtPmZ3X2V2ZW50X3BlbmRpbmcsIDApOworCQltc2dfY2FsbGJhY2tzLT5md0V2ZW50SGFuZGxlcihtc2dfY2FsbGJhY2tzLT5Db250ZXh0LAorCQkJCQkgICAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSk7CisJfQorCisJaWYgKGhpZl9zdGF0ZS0+c2NuLT50YXJnZXRfc3RhdHVzID09IE9MX1RSR0VUX1NUQVRVU19SRVNFVCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKDs7ICkgeworCQlzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqcGlwZV9pbmZvOworCQlpbnQgc2VuZF9kb25lID0gMDsKKworCQljZGZfc3Bpbl9sb2NrKCZoaWZfc3RhdGUtPmNvbXBsZXRpb25fcGVuZGluZ3FfbG9jayk7CisKKwkJaWYgKCFoaWZfc3RhdGUtPmNvbXBsZXRpb25fcGVuZGluZ3FfaGVhZCkgeworCQkJLyogV2UgYXJlIGF0b21pY2FsbHkgc3VyZSB0aGF0CisJCQkgKiB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgKi8KKwkJCWNkZl9hdG9taWNfaW5jKCZoaWZfc3RhdGUtPmhpZl90aHJlYWRfaWRsZSk7CisJCQljZGZfc3Bpbl91bmxvY2soJmhpZl9zdGF0ZS0+Y29tcGxldGlvbl9wZW5kaW5ncV9sb2NrKTsKKwkJCWJyZWFrOyAgLyogQWxsIHBlbmRpbmcgY29tcGxldGlvbnMgYXJlIGhhbmRsZWQgKi8KKwkJfQorCisJCS8qIERlcXVldWUgdGhlIGZpcnN0IHVucHJvY2Vzc2VkIGJ1dCBjb21wbGV0ZWQgdHJhbnNmZXIgKi8KKwkJY29tcGxfc3RhdGUgPSBoaWZfc3RhdGUtPmNvbXBsZXRpb25fcGVuZGluZ3FfaGVhZDsKKwkJaGlmX3N0YXRlLT5jb21wbGV0aW9uX3BlbmRpbmdxX2hlYWQgPSBjb21wbF9zdGF0ZS0+bmV4dDsKKwkJY2RmX3NwaW5fdW5sb2NrKCZoaWZfc3RhdGUtPmNvbXBsZXRpb25fcGVuZGluZ3FfbG9jayk7CisKKwkJcGlwZV9pbmZvID0gKHN0cnVjdCBISUZfQ0VfcGlwZV9pbmZvICopY29tcGxfc3RhdGUtPmNlX2NvbnRleHQ7CisJCWlmIChjb21wbF9zdGF0ZS0+c2VuZF9vcl9yZWN2ID09IEhJRl9DRV9DT01QTEVURV9TRU5EKSB7CisJCQltc2dfY2FsbGJhY2tzLT50eENvbXBsZXRpb25IYW5kbGVyKG1zZ19jYWxsYmFja3MtPgorCQkJCSAgIENvbnRleHQsCisJCQkJICAgY29tcGxfc3RhdGUtPgorCQkJCSAgIHRyYW5zZmVyX2NvbnRleHQsCisJCQkJICAgY29tcGxfc3RhdGUtPgorCQkJCSAgIHRyYW5zZmVyX2lkLAorCQkJCSAgIGNvbXBsX3N0YXRlLT50b2VwbGl0el9oYXNoX3Jlc3VsdCk7CisJCQlzZW5kX2RvbmUgPSAxOworCQl9IGVsc2UgeworCQkJLyogY29tcGxfc3RhdGUtPnNlbmRfb3JfcmVjdiA9PSBISUZfQ0VfQ09NUExFVEVfUkVDViAqLworCQkJY2RmX25idWZfdCBuZXRidWY7CisJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzOworCisJCQlhdG9taWNfaW5jKCZwaXBlX2luZm8tPnJlY3ZfYnVmc19uZWVkZWQpOworCQkJaGlmX3Bvc3RfcmVjdl9idWZmZXJzKGhpZl9zdGF0ZS0+c2NuKTsKKworCQkJbmV0YnVmID0gKGNkZl9uYnVmX3QpIGNvbXBsX3N0YXRlLT50cmFuc2Zlcl9jb250ZXh0OworCQkJbmJ5dGVzID0gY29tcGxfc3RhdGUtPm5ieXRlczsKKwkJCS8qCisJCQkgKiBUbyBzZWUgdGhlIGZvbGxvd2luZyBkZWJ1ZyBvdXRwdXQsCisJCQkgKiBlbmFibGUgdGhlIEhJRl9QQ0lfREVCVUcgZmxhZyBpbgorCQkJICogdGhlIGRlYnVnIG1vZHVsZSBkZWNsYXJhdGlvbiBpbiB0aGlzIHNvdXJjZSBmaWxlCisJCQkgKi8KKwkJCUhJRl9EQkcoIiVzOiBuZXRidWY9JXAsIG5ieXRlcz0lZCIsCisJCQkJX19mdW5jX18sIG5ldGJ1ZiwgbmJ5dGVzKTsKKwkJCWlmIChuYnl0ZXMgPD0gcGlwZV9pbmZvLT5idWZfc3opIHsKKwkJCQljZGZfbmJ1Zl9zZXRfcGt0bGVuKG5ldGJ1ZiwgbmJ5dGVzKTsKKwkJCQltc2dfY2FsbGJhY2tzLT4KKwkJCQlyeENvbXBsZXRpb25IYW5kbGVyKG1zZ19jYWxsYmFja3MtPkNvbnRleHQsCisJCQkJCQkgICAgbmV0YnVmLAorCQkJCQkJICAgIHBpcGVfaW5mby0+cGlwZV9udW0pOworCQkJfSBlbHNlIHsKKwkJCQlISUZfRVJST1IoCisJCQkJCSIlczogSW52YWxpZCBSeCBtc2cgYnVmOiVwIG5ieXRlczolZCIsCisJCQkJCSBfX2Z1bmNfXywgbmV0YnVmLCBuYnl0ZXMpOworCQkJCWNkZl9uYnVmX2ZyZWUobmV0YnVmKTsKKwkJCX0KKwkJfQorCisJCS8qIFJlY3ljbGUgY29tcGxldGlvbiBzdGF0ZSBiYWNrIHRvIHRoZSBwaXBlIGl0IGNhbWUgZnJvbS4gKi8KKwkJY29tcGxfc3RhdGUtPm5leHQgPSBOVUxMOworCQljb21wbF9zdGF0ZS0+c2VuZF9vcl9yZWN2ID0gSElGX0NFX0NPTVBMRVRFX0ZSRUU7CisJCWNkZl9zcGluX2xvY2soJnBpcGVfaW5mby0+Y29tcGxldGlvbl9mcmVlcV9sb2NrKTsKKwkJaWYgKHBpcGVfaW5mby0+Y29tcGxldGlvbl9mcmVlcV9oZWFkKSB7CisJCQlwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfdGFpbC0+bmV4dCA9IGNvbXBsX3N0YXRlOworCQl9IGVsc2UgeworCQkJcGlwZV9pbmZvLT5jb21wbGV0aW9uX2ZyZWVxX2hlYWQgPSBjb21wbF9zdGF0ZTsKKwkJfQorCQlwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfdGFpbCA9IGNvbXBsX3N0YXRlOworCQlwaXBlX2luZm8tPm51bV9zZW5kc19hbGxvd2VkICs9IHNlbmRfZG9uZTsKKwkJY2RmX3NwaW5fdW5sb2NrKCZwaXBlX2luZm8tPmNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbnN0YWxsIHBlbmRpbmcgbXNnIGNhbGxiYWNrcy4KKyAqCisgKiBUQkRYWFg6IFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB1cHBlciBsYXllcnMgaW5zdGFsbCBtc2cgY2FsbGJhY2tzCisgKiBmb3IgdXNlIHdpdGggSFRDIGJlZm9yZSBCTUkgaXMgZG9uZTsgeWV0IHRoaXMgSElGIGltcGxlbWVudGF0aW9uCisgKiBuZWVkcyB0byBjb250aW51ZSB0byB1c2UgQk1JIG1zZyBjYWxsYmFja3MuIFJlYWxseSwgdXBwZXIgbGF5ZXJzCisgKiBzaG91bGQgbm90IHJlZ2lzdGVyIEhUQyBjYWxsYmFja3MgdW50aWwgQUZURVIgQk1JIHBoYXNlLgorICovCitzdGF0aWMgdm9pZCBoaWZfbXNnX2NhbGxiYWNrc19pbnN0YWxsKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZSA9IChzdHJ1Y3QgSElGX0NFX3N0YXRlICopc2NuLT5oaWZfaGRsOworCisJY2RmX21lbV9jb3B5KCZoaWZfc3RhdGUtPm1zZ19jYWxsYmFja3NfY3VycmVudCwKKwkJICZoaWZfc3RhdGUtPm1zZ19jYWxsYmFja3NfcGVuZGluZywKKwkJIHNpemVvZihoaWZfc3RhdGUtPm1zZ19jYWxsYmFja3NfcGVuZGluZykpOworfQorCit2b2lkIGhpZl9jbGFpbV9kZXZpY2Uoc3RydWN0IG9sX3NvZnRjICpzY24sIHZvaWQgKmNsYWltZWRDb250ZXh0KQoreworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZSA9IChzdHJ1Y3QgSElGX0NFX3N0YXRlICopc2NuLT5oaWZfaGRsOworCisJaGlmX3N0YXRlLT5jbGFpbWVkQ29udGV4dCA9IGNsYWltZWRDb250ZXh0OworfQorCit2b2lkIGhpZl9yZWxlYXNlX2RldmljZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKXNjbi0+aGlmX2hkbDsKKworCWhpZl9zdGF0ZS0+Y2xhaW1lZENvbnRleHQgPSBOVUxMOworfQorCit2b2lkCitoaWZfZ2V0X2RlZmF1bHRfcGlwZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdWludDhfdCAqVUxQaXBlLCB1aW50OF90ICpETFBpcGUpCit7CisJaW50IHVsX2lzX3BvbGxlZCwgZGxfaXNfcG9sbGVkOworCisJKHZvaWQpaGlmX21hcF9zZXJ2aWNlX3RvX3BpcGUoc2NuLCBIVENfQ1RSTF9SU1ZEX1NWQywKKwkJVUxQaXBlLCBETFBpcGUsICZ1bF9pc19wb2xsZWQsICZkbF9pc19wb2xsZWQpOworfQorCisvKiBUQkRYWFggLSB0ZW1wb3JhcnkgbWFwcGluZyB3aGlsZSB3ZSBoYXZlIHRvbyBmZXcgQ0UncyAqLworaW50CitoaWZfbWFwX3NlcnZpY2VfdG9fcGlwZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdWludDE2X3QgU2VydmljZUlkLAorCQkJdWludDhfdCAqVUxQaXBlLCB1aW50OF90ICpETFBpcGUsIGludCAqdWxfaXNfcG9sbGVkLAorCQkJaW50ICpkbF9pc19wb2xsZWQpCit7CisJaW50IHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCSpkbF9pc19wb2xsZWQgPSAwOyAgLyogcG9sbGluZyBmb3IgcmVjZWl2ZWQgbWVzc2FnZXMgbm90IHN1cHBvcnRlZCAqLworCXN3aXRjaCAoU2VydmljZUlkKSB7CisJY2FzZSBIVFRfREFUQV9NU0dfU1ZDOgorCQkvKgorCQkgKiBIb3N0LT50YXJnZXQgSFRUIGdldHMgaXRzIG93biBwaXBlLCBzbyBpdCBjYW4gYmUgcG9sbGVkCisJCSAqIHdoaWxlIG90aGVyIHBpcGVzIGFyZSBpbnRlcnJ1cHQgZHJpdmVuLgorCQkgKi8KKwkJKlVMUGlwZSA9IDQ7CisJCS8qCisJCSAqIFVzZSB0aGUgc2FtZSB0YXJnZXQtPmhvc3QgcGlwZSBmb3IgSFRDIGN0cmwsCisJCSAqIEhUQyByYXcgc3RyZWFtcywgYW5kIEhUVC4KKwkJICovCisJCSpETFBpcGUgPSAxOworCQlicmVhazsKKworCWNhc2UgSFRDX0NUUkxfUlNWRF9TVkM6CisJCSpVTFBpcGUgPSAwOworCQkqRExQaXBlID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIEhUQ19SQVdfU1RSRUFNU19TVkM6CisJCS8qCisJCSAqIE5vdGU6IEhUQ19SQVdfU1RSRUFNU19TVkMgaXMgY3VycmVudGx5IHVudXNlZCwgYW5kCisJCSAqIEhUQ19DVFJMX1JTVkRfU1ZDIGNvdWxkIHNoYXJlIHRoZSBzYW1lIHBpcGUgYXMgdGhlCisJCSAqIFdNSSBzZXJ2aWNlcy4gIFNvLCBpZiBhbm90aGVyIENFIGlzIG5lZWRlZCwgY2hhbmdlCisJCSAqIHRoaXMgdG8gKlVMUGlwZSA9IDMsIHdoaWNoIGZyZWVzIHVwIENFIDAuCisJCSAqLworCQkvKipVTFBpcGUgPSAzOyAqLworCQkqVUxQaXBlID0gMDsKKwkJKkRMUGlwZSA9IDI7CisJCWJyZWFrOworCisJY2FzZSBXTUlfREFUQV9CS19TVkM6CisJCS8qCisJCSAqIFRvIGF2b2lkIHNvbWUgY29uZnVzaW9ucywgYmV0dGVyIHRvIGludHJvZHVjZSBuZXcgRVAtcGluZworCQkgKiBzZXJ2aWNlIGluc3RlYWQgb2YgdXNpbmcgZXhpc3RlZCBzZXJ2aWNlcy4gVW50aWwgdGhlIG1haW4KKwkJICogZnJhbWV3b3JrIHN1cHBvcnQgdGhpcywga2VlcCB0aGlzIGRlc2lnbi4KKwkJICovCisJCWlmIChXTEFOX0lTX0VQUElOR19FTkFCTEVEKGNkc19nZXRfY29ucGFyYW0oKSkpIHsKKwkJCSpVTFBpcGUgPSA0OworCQkJKkRMUGlwZSA9IDE7CisJCQlicmVhazsKKwkJfQorCWNhc2UgV01JX0RBVEFfQkVfU1ZDOgorCWNhc2UgV01JX0RBVEFfVklfU1ZDOgorCWNhc2UgV01JX0RBVEFfVk9fU1ZDOgorCisJY2FzZSBXTUlfQ09OVFJPTF9TVkM6CisJCSpVTFBpcGUgPSAzOworCQkqRExQaXBlID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIFdESV9JUEFfVFhfU1ZDOgorCQkqVUxQaXBlID0gNTsKKwkJYnJlYWs7CisKKwkvKiBwaXBlIDUgdW51c2VkICAgKi8KKwkvKiBwaXBlIDYgcmVzZXJ2ZWQgKi8KKwkvKiBwaXBlIDcgcmVzZXJ2ZWQgKi8KKworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJYnJlYWs7CisJfQorCSp1bF9pc19wb2xsZWQgPQorCQkoaG9zdF9jZV9jb25maWdbKlVMUGlwZV0uZmxhZ3MgJiBDRV9BVFRSX0RJU0FCTEVfSU5UUikgIT0gMDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaGlmX2R1bXBfcGlwZV9kZWJ1Z19jb3VudCgpIC0gTG9nIGVycm9yIGNvdW50CisgKiBAc2NuOiBvbF9zb2Z0YyBwb2ludGVyLgorICoKKyAqIE91dHB1dCB0aGUgcGlwZSBlcnJvciBjb3VudHMgb2YgZWFjaCBwaXBlIHRvIGxvZyBmaWxlCisgKgorICogUmV0dXJuOiBOL0EKKyAqLwordm9pZCBoaWZfZHVtcF9waXBlX2RlYnVnX2NvdW50KHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZTsKKwlpbnQgcGlwZV9udW07CisKKwlpZiAoc2NuID09IE5VTEwpIHsKKwkJSElGX0VSUk9SKCIlcyBzY24gaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwloaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKXNjbi0+aGlmX2hkbDsKKwlpZiAoaGlmX3N0YXRlID09IE5VTEwpIHsKKwkJSElGX0VSUk9SKCIlcyBoaWZfc3RhdGUgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKHBpcGVfbnVtID0gMDsgcGlwZV9udW0gPCBzY24tPmNlX2NvdW50OyBwaXBlX251bSsrKSB7CisJCXN0cnVjdCBISUZfQ0VfcGlwZV9pbmZvICpwaXBlX2luZm87CisKKwlwaXBlX2luZm8gPSAmaGlmX3N0YXRlLT5waXBlX2luZm9bcGlwZV9udW1dOworCisJaWYgKHBpcGVfaW5mby0+bmJ1Zl9hbGxvY19lcnJfY291bnQgPiAwIHx8CisJCQlwaXBlX2luZm8tPm5idWZfZG1hX2Vycl9jb3VudCA+IDAgfHwKKwkJCXBpcGVfaW5mby0+bmJ1Zl9jZV9lbnF1ZXVlX2Vycl9jb3VudCkKKwkJSElGX0VSUk9SKAorCQkJIiVzOiBwaXBlX2lkID0gJWQsIHJlY3ZfYnVmc19uZWVkZWQgPSAlZCwgbmJ1Zl9hbGxvY19lcnJfY291bnQgPSAldSwgbmJ1Zl9kbWFfZXJyX2NvdW50ID0gJXUsIG5idWZfY2VfZW5xdWV1ZV9lcnJfY291bnQgPSAldSIsCisJCQlfX2Z1bmNfXywgcGlwZV9pbmZvLT5waXBlX251bSwKKwkJCWF0b21pY19yZWFkKCZwaXBlX2luZm8tPnJlY3ZfYnVmc19uZWVkZWQpLAorCQkJcGlwZV9pbmZvLT5uYnVmX2FsbG9jX2Vycl9jb3VudCwKKwkJCXBpcGVfaW5mby0+bmJ1Zl9kbWFfZXJyX2NvdW50LAorCQkJcGlwZV9pbmZvLT5uYnVmX2NlX2VucXVldWVfZXJyX2NvdW50KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGlmX3Bvc3RfcmVjdl9idWZmZXJzX2Zvcl9waXBlKHN0cnVjdCBISUZfQ0VfcGlwZV9pbmZvICpwaXBlX2luZm8pCit7CisJc3RydWN0IENFX2hhbmRsZSAqY2VfaGRsOworCWNkZl9zaXplX3QgYnVmX3N6OworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZSA9IHBpcGVfaW5mby0+SElGX0NFX3N0YXRlOworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gaGlmX3N0YXRlLT5zY247CisJQ0RGX1NUQVRVUyByZXQ7CisJdWludDMyX3QgYnVmc19wb3N0ZWQgPSAwOworCisJYnVmX3N6ID0gcGlwZV9pbmZvLT5idWZfc3o7CisJaWYgKGJ1Zl9zeiA9PSAwKSB7CisJCS8qIFVudXNlZCBDb3B5IEVuZ2luZSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwljZV9oZGwgPSBwaXBlX2luZm8tPmNlX2hkbDsKKworCWNkZl9zcGluX2xvY2tfYmgoJnBpcGVfaW5mby0+cmVjdl9idWZzX25lZWRlZF9sb2NrKTsKKwl3aGlsZSAoYXRvbWljX3JlYWQoJnBpcGVfaW5mby0+cmVjdl9idWZzX25lZWRlZCkgPiAwKSB7CisJCWNkZl9kbWFfYWRkcl90IENFX2RhdGE7ICAgICAgLyogQ0Ugc3BhY2UgYnVmZmVyIGFkZHJlc3MgKi8KKwkJY2RmX25idWZfdCBuYnVmOworCQlpbnQgc3RhdHVzOworCisJCWF0b21pY19kZWMoJnBpcGVfaW5mby0+cmVjdl9idWZzX25lZWRlZCk7CisJCWNkZl9zcGluX3VubG9ja19iaCgmcGlwZV9pbmZvLT5yZWN2X2J1ZnNfbmVlZGVkX2xvY2spOworCisJCW5idWYgPSBjZGZfbmJ1Zl9hbGxvYyhzY24tPmNkZl9kZXYsIGJ1Zl9zeiwgMCwgNCwgZmFsc2UpOworCQlpZiAoIW5idWYpIHsKKwkJCWNkZl9zcGluX2xvY2tfYmgoJnBpcGVfaW5mby0+cmVjdl9idWZzX25lZWRlZF9sb2NrKTsKKwkJCXBpcGVfaW5mby0+bmJ1Zl9hbGxvY19lcnJfY291bnQrKzsKKwkJCWNkZl9zcGluX3VubG9ja19iaCgKKwkJCQkmcGlwZV9pbmZvLT5yZWN2X2J1ZnNfbmVlZGVkX2xvY2spOworCQkJSElGX0VSUk9SKAorCQkJCSIlcyBidWYgYWxsb2MgZXJyb3IgWyVkXSBuZWVkZWQgJWQsIG5idWZfYWxsb2NfZXJyX2NvdW50ID0gJXUiLAorCQkJCSBfX2Z1bmNfXywgcGlwZV9pbmZvLT5waXBlX251bSwKKwkJCQkgYXRvbWljX3JlYWQoJnBpcGVfaW5mby0+cmVjdl9idWZzX25lZWRlZCksCisJCQkJcGlwZV9pbmZvLT5uYnVmX2FsbG9jX2Vycl9jb3VudCk7CisJCQlhdG9taWNfaW5jKCZwaXBlX2luZm8tPnJlY3ZfYnVmc19uZWVkZWQpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKgorCQkgKiBjZGZfbmJ1Zl9wZWVrX2hlYWRlcihuYnVmLCAmZGF0YSwgJnVudXNlZCk7CisJCSAqIENFX2RhdGEgPSBkbWFfbWFwX3NpbmdsZShkZXYsIGRhdGEsIGJ1Zl9zeiwgKTsKKwkJICogRE1BX0ZST01fREVWSUNFKTsKKwkJICovCisJCXJldCA9CisJCQljZGZfbmJ1Zl9tYXBfc2luZ2xlKHNjbi0+Y2RmX2RldiwgbmJ1ZiwKKwkJCQkJICAgIENERl9ETUFfRlJPTV9ERVZJQ0UpOworCisJCWlmICh1bmxpa2VseShyZXQgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSkgeworCQkJY2RmX3NwaW5fbG9ja19iaCgmcGlwZV9pbmZvLT5yZWN2X2J1ZnNfbmVlZGVkX2xvY2spOworCQkJcGlwZV9pbmZvLT5uYnVmX2RtYV9lcnJfY291bnQrKzsKKwkJCWNkZl9zcGluX3VubG9ja19iaCgmcGlwZV9pbmZvLT5yZWN2X2J1ZnNfbmVlZGVkX2xvY2spOworCQkJSElGX0VSUk9SKAorCQkJCSIlcyBidWYgYWxsb2MgZXJyb3IgWyVkXSBuZWVkZWQgJWQsIG5idWZfZG1hX2Vycl9jb3VudCA9ICV1IiwKKwkJCQkgX19mdW5jX18sIHBpcGVfaW5mby0+cGlwZV9udW0sCisJCQkJIGF0b21pY19yZWFkKCZwaXBlX2luZm8tPnJlY3ZfYnVmc19uZWVkZWQpLAorCQkJCXBpcGVfaW5mby0+bmJ1Zl9kbWFfZXJyX2NvdW50KTsKKwkJCWNkZl9uYnVmX2ZyZWUobmJ1Zik7CisJCQlhdG9taWNfaW5jKCZwaXBlX2luZm8tPnJlY3ZfYnVmc19uZWVkZWQpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlDRV9kYXRhID0gY2RmX25idWZfZ2V0X2ZyYWdfcGFkZHJfbG8obmJ1ZiwgMCk7CisKKwkJY2RmX29zX21lbV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzY24tPmNkZl9kZXYsIENFX2RhdGEsCisJCQkJCSAgICAgICBidWZfc3osIERNQV9GUk9NX0RFVklDRSk7CisJCXN0YXR1cyA9IGNlX3JlY3ZfYnVmX2VucXVldWUoY2VfaGRsLCAodm9pZCAqKW5idWYsIENFX2RhdGEpOworCQlDREZfQVNTRVJUKHN0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpOworCQlpZiAoc3RhdHVzICE9IEVPSykgeworCQkJY2RmX3NwaW5fbG9ja19iaCgmcGlwZV9pbmZvLT5yZWN2X2J1ZnNfbmVlZGVkX2xvY2spOworCQkJcGlwZV9pbmZvLT5uYnVmX2NlX2VucXVldWVfZXJyX2NvdW50Kys7CisJCQljZGZfc3Bpbl91bmxvY2tfYmgoJnBpcGVfaW5mby0+cmVjdl9idWZzX25lZWRlZF9sb2NrKTsKKwkJCUhJRl9FUlJPUigKKwkJCQkiJXMgYnVmIGFsbG9jIGVycm9yIFslZF0gbmVlZGVkICVkLCBuYnVmX2FsbG9jX2Vycl9jb3VudCA9ICV1IiwKKwkJCQlfX2Z1bmNfXywgcGlwZV9pbmZvLT5waXBlX251bSwKKwkJCQlhdG9taWNfcmVhZCgmcGlwZV9pbmZvLT5yZWN2X2J1ZnNfbmVlZGVkKSwKKwkJCQlwaXBlX2luZm8tPm5idWZfY2VfZW5xdWV1ZV9lcnJfY291bnQpOworCQkJYXRvbWljX2luYygmcGlwZV9pbmZvLT5yZWN2X2J1ZnNfbmVlZGVkKTsKKwkJCWNkZl9uYnVmX2ZyZWUobmJ1Zik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWNkZl9zcGluX2xvY2tfYmgoJnBpcGVfaW5mby0+cmVjdl9idWZzX25lZWRlZF9sb2NrKTsKKwkJYnVmc19wb3N0ZWQrKzsKKwl9CisJcGlwZV9pbmZvLT5uYnVmX2FsbG9jX2Vycl9jb3VudCA9CisJCShwaXBlX2luZm8tPm5idWZfYWxsb2NfZXJyX2NvdW50ID4gYnVmc19wb3N0ZWQpPworCQlwaXBlX2luZm8tPm5idWZfYWxsb2NfZXJyX2NvdW50IC0gYnVmc19wb3N0ZWQgOiAwOworCXBpcGVfaW5mby0+bmJ1Zl9kbWFfZXJyX2NvdW50ID0KKwkJKHBpcGVfaW5mby0+bmJ1Zl9kbWFfZXJyX2NvdW50ID4gYnVmc19wb3N0ZWQpPworCQlwaXBlX2luZm8tPm5idWZfZG1hX2Vycl9jb3VudCAtIGJ1ZnNfcG9zdGVkIDogMDsKKwlwaXBlX2luZm8tPm5idWZfY2VfZW5xdWV1ZV9lcnJfY291bnQgPQorCQkocGlwZV9pbmZvLT5uYnVmX2NlX2VucXVldWVfZXJyX2NvdW50ID4gYnVmc19wb3N0ZWQpPworCSAgICAgcGlwZV9pbmZvLT5uYnVmX2NlX2VucXVldWVfZXJyX2NvdW50IC0gYnVmc19wb3N0ZWQgOiAwOworCisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwaXBlX2luZm8tPnJlY3ZfYnVmc19uZWVkZWRfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRyeSB0byBwb3N0IGFsbCBkZXNpcmVkIHJlY2VpdmUgYnVmZmVycyBmb3IgYWxsIHBpcGVzLgorICogUmV0dXJucyAwIGlmIGFsbCBkZXNpcmVkIGJ1ZmZlcnMgYXJlIHBvc3RlZCwKKyAqIG5vbi16ZXJvIGlmIHdlcmUgd2VyZSB1bmFibGUgdG8gY29tcGxldGVseQorICogcmVwbGVuaXNoIHJlY2VpdmUgYnVmZmVycy4KKyAqLworc3RhdGljIGludCBoaWZfcG9zdF9yZWN2X2J1ZmZlcnMoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX3N0YXRlID0gKHN0cnVjdCBISUZfQ0Vfc3RhdGUgKilzY24tPmhpZl9oZGw7CisJaW50IHBpcGVfbnVtLCBydiA9IDA7CisKKwlBX1RBUkdFVF9BQ0NFU1NfTElLRUxZKHNjbik7CisJZm9yIChwaXBlX251bSA9IDA7IHBpcGVfbnVtIDwgc2NuLT5jZV9jb3VudDsgcGlwZV9udW0rKykgeworCQlzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqcGlwZV9pbmZvOworCisJCXBpcGVfaW5mbyA9ICZoaWZfc3RhdGUtPnBpcGVfaW5mb1twaXBlX251bV07CisJCWlmIChoaWZfcG9zdF9yZWN2X2J1ZmZlcnNfZm9yX3BpcGUocGlwZV9pbmZvKSkgeworCQkJcnYgPSAxOworCQkJZ290byBkb25lOworCQl9CisJfQorCitkb25lOgorCUFfVEFSR0VUX0FDQ0VTU19VTkxJS0VMWShzY24pOworCisJcmV0dXJuIHJ2OworfQorCitDREZfU1RBVFVTIGhpZl9zdGFydChzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKXNjbi0+aGlmX2hkbDsKKworCWlmIChoaWZfY29tcGxldGlvbl90aHJlYWRfc3RhcnR1cChoaWZfc3RhdGUpKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwloaWZfbXNnX2NhbGxiYWNrc19pbnN0YWxsKHNjbik7CisKKwkvKiBQb3N0IGJ1ZmZlcnMgb25jZSB0byBzdGFydCB0aGluZ3Mgb2ZmLiAqLworCSh2b2lkKWhpZl9wb3N0X3JlY3ZfYnVmZmVycyhzY24pOworCisJaGlmX3N0YXRlLT5zdGFydGVkID0gdHJ1ZTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRkFTVFBBVEgKKy8qKgorICogaGlmX2VuYWJsZV9mYXN0cGF0aCgpIFVwZGF0ZSB0aGF0IHdlIGhhdmUgZW5hYmxlZCBmYXN0cGF0aCBtb2RlCisgKiBAaGlmX2RldmljZTogSElGIGNvbnRleHQKKyAqCisgKiBGb3IgdXNlIGluIGRhdGEgcGF0aAorICoKKyAqIFJldHJ1bjogdm9pZAorICovCit2b2lkCitoaWZfZW5hYmxlX2Zhc3RwYXRoKHN0cnVjdCBvbF9zb2Z0YyAqaGlmX2RldmljZSkKK3sKKwlISUZfSU5GTygiRW5hYmxpbmcgZmFzdHBhdGggbW9kZVxuIik7CisJaGlmX2RldmljZS0+ZmFzdHBhdGhfbW9kZV9vbiA9IDE7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0ZBU1RQQVRIICovCisKK3ZvaWQgaGlmX3JlY3ZfYnVmZmVyX2NsZWFudXBfb25fcGlwZShzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqcGlwZV9pbmZvKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuOworCXN0cnVjdCBDRV9oYW5kbGUgKmNlX2hkbDsKKwl1aW50MzJfdCBidWZfc3o7CisJc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX3N0YXRlOworCWNkZl9uYnVmX3QgbmV0YnVmOworCWNkZl9kbWFfYWRkcl90IENFX2RhdGE7CisJdm9pZCAqcGVyX0NFX2NvbnRleHQ7CisKKwlidWZfc3ogPSBwaXBlX2luZm8tPmJ1Zl9zejsKKwlpZiAoYnVmX3N6ID09IDApIHsKKwkJLyogVW51c2VkIENvcHkgRW5naW5lICovCisJCXJldHVybjsKKwl9CisKKwloaWZfc3RhdGUgPSBwaXBlX2luZm8tPkhJRl9DRV9zdGF0ZTsKKwlpZiAoIWhpZl9zdGF0ZS0+c3RhcnRlZCkgeworCQlyZXR1cm47CisJfQorCisJc2NuID0gaGlmX3N0YXRlLT5zY247CisJY2VfaGRsID0gcGlwZV9pbmZvLT5jZV9oZGw7CisKKwlpZiAoc2NuLT5jZGZfZGV2ID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAoY2VfcmV2b2tlX3JlY3ZfbmV4dAorCQkgICAgICAgKGNlX2hkbCwgJnBlcl9DRV9jb250ZXh0LCAodm9pZCAqKikmbmV0YnVmLAorCQkJJkNFX2RhdGEpID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQljZGZfbmJ1Zl91bm1hcF9zaW5nbGUoc2NuLT5jZGZfZGV2LCBuZXRidWYsCisJCQkJICAgICAgQ0RGX0RNQV9GUk9NX0RFVklDRSk7CisJCWNkZl9uYnVmX2ZyZWUobmV0YnVmKTsKKwl9Cit9CisKK3ZvaWQgaGlmX3NlbmRfYnVmZmVyX2NsZWFudXBfb25fcGlwZShzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqcGlwZV9pbmZvKQoreworCXN0cnVjdCBDRV9oYW5kbGUgKmNlX2hkbDsKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGU7CisJY2RmX25idWZfdCBuZXRidWY7CisJdm9pZCAqcGVyX0NFX2NvbnRleHQ7CisJY2RmX2RtYV9hZGRyX3QgQ0VfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzOworCXVuc2lnbmVkIGludCBpZDsKKwl1aW50MzJfdCBidWZfc3o7CisJdWludDMyX3QgdG9lcGxpdHpfaGFzaF9yZXN1bHQ7CisKKwlidWZfc3ogPSBwaXBlX2luZm8tPmJ1Zl9zejsKKwlpZiAoYnVmX3N6ID09IDApIHsKKwkJLyogVW51c2VkIENvcHkgRW5naW5lICovCisJCXJldHVybjsKKwl9CisKKwloaWZfc3RhdGUgPSBwaXBlX2luZm8tPkhJRl9DRV9zdGF0ZTsKKwlpZiAoIWhpZl9zdGF0ZS0+c3RhcnRlZCkgeworCQlyZXR1cm47CisJfQorCisJY2VfaGRsID0gcGlwZV9pbmZvLT5jZV9oZGw7CisKKwl3aGlsZSAoY2VfY2FuY2VsX3NlbmRfbmV4dAorCQkgICAgICAgKGNlX2hkbCwgJnBlcl9DRV9jb250ZXh0LAorCQkgICAgICAgKHZvaWQgKiopJm5ldGJ1ZiwgJkNFX2RhdGEsICZuYnl0ZXMsCisJCSAgICAgICAmaWQsICZ0b2VwbGl0el9oYXNoX3Jlc3VsdCkgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWlmIChuZXRidWYgIT0gQ0VfU0VORExJU1RfSVRFTV9DVFhUKSB7CisJCQkvKgorCQkJICogUGFja2V0cyBlbnF1ZXVlZCBieSBodHRfaDJ0X3Zlcl9yZXFfbXNnKCkgYW5kCisJCQkgKiBodHRfaDJ0X3J4X3JpbmdfY2ZnX21zZ19sbCgpIGhhdmUgYWxyZWFkeSBiZWVuCisJCQkgKiBmcmVlZCBpbiBodHRfaHRjX21pc2NfcGt0X3Bvb2xfZnJlZSgpIGluCisJCQkgKiB3bGFudGxfY2xvc2UoKSwgc28gZG8gbm90IGZyZWUgdGhlbSBoZXJlIGFnYWluCisJCQkgKiBieSBjaGVja2luZyB3aGV0aGVyIGl0J3MgdGhlIEVuZFBvaW50CisJCQkgKiB3aGljaCB0aGV5IGFyZSBxdWV1ZWQgaW4uCisJCQkgKi8KKwkJCWlmIChpZCA9PSBoaWZfc3RhdGUtPnNjbi0+aHRjX2VuZHBvaW50KQorCQkJCXJldHVybjsKKwkJCS8qIEluZGljYXRlIHRoZSBjb21wbGV0aW9uIHRvIGhpZ2VyCisJCQkgKiBsYXllciB0byBmcmVlIHRoZSBidWZmZXIgKi8KKwkJCWhpZl9zdGF0ZS0+bXNnX2NhbGxiYWNrc19jdXJyZW50LgorCQkJdHhDb21wbGV0aW9uSGFuZGxlcihoaWZfc3RhdGUtPgorCQkJCQkgICAgbXNnX2NhbGxiYWNrc19jdXJyZW50LkNvbnRleHQsCisJCQkJCSAgICBuZXRidWYsIGlkLCB0b2VwbGl0el9oYXNoX3Jlc3VsdCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBDbGVhbnVwIHJlc2lkdWFsIGJ1ZmZlcnMgZm9yIGRldmljZSBzaHV0ZG93bjoKKyAqICAgIGJ1ZmZlcnMgdGhhdCB3ZXJlIGVucXVldWVkIGZvciByZWNlaXZlCisgKiAgICBidWZmZXJzIHRoYXQgd2VyZSB0byBiZSBzZW50CisgKiBOb3RlOiBCdWZmZXJzIHRoYXQgaGFkIGNvbXBsZXRlZCBidXQgd2hpY2ggd2VyZQorICogbm90IHlldCBwcm9jZXNzZWQgYXJlIG9uIGEgY29tcGxldGlvbiBxdWV1ZS4gVGhleQorICogYXJlIGhhbmRsZWQgd2hlbiB0aGUgY29tcGxldGlvbiB0aHJlYWQgc2h1dHMgZG93bi4KKyAqLwordm9pZCBoaWZfYnVmZmVyX2NsZWFudXAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX3N0YXRlKQoreworCWludCBwaXBlX251bTsKKworCWZvciAocGlwZV9udW0gPSAwOyBwaXBlX251bSA8IGhpZl9zdGF0ZS0+c2NuLT5jZV9jb3VudDsgcGlwZV9udW0rKykgeworCQlzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqcGlwZV9pbmZvOworCisJCXBpcGVfaW5mbyA9ICZoaWZfc3RhdGUtPnBpcGVfaW5mb1twaXBlX251bV07CisJCWhpZl9yZWN2X2J1ZmZlcl9jbGVhbnVwX29uX3BpcGUocGlwZV9pbmZvKTsKKwkJaGlmX3NlbmRfYnVmZmVyX2NsZWFudXBfb25fcGlwZShwaXBlX2luZm8pOworCX0KK30KKwordm9pZCBoaWZfZmx1c2hfc3VycHJpc2VfcmVtb3ZlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZSA9IChzdHJ1Y3QgSElGX0NFX3N0YXRlICopc2NuLT5oaWZfaGRsOworCWhpZl9idWZmZXJfY2xlYW51cChoaWZfc3RhdGUpOworfQorCit2b2lkIGhpZl9zdG9wKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZSA9IChzdHJ1Y3QgSElGX0NFX3N0YXRlICopc2NuLT5oaWZfaGRsOworCWludCBwaXBlX251bTsKKworCXNjbi0+aGlmX2luaXRfZG9uZSA9IGZhbHNlOworCWlmIChoaWZfc3RhdGUtPnN0YXJ0ZWQpIHsKKwkJLyogc3luYyBzaHV0ZG93biAqLworCQloaWZfY29tcGxldGlvbl90aHJlYWRfc2h1dGRvd24oaGlmX3N0YXRlKTsKKwkJaGlmX2NvbXBsZXRpb25fdGhyZWFkKGhpZl9zdGF0ZSk7CisJfSBlbHNlIHsKKwkJaGlmX2NvbXBsZXRpb25fdGhyZWFkX3NodXRkb3duKGhpZl9zdGF0ZSk7CisJfQorCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCBhc3luY2hyb25vdXMgdGhyZWFkcyBhcmUgc3RvcHBlZCwKKwkgKiBUaGUgVGFyZ2V0IHNob3VsZCBub3QgRE1BIG5vciBpbnRlcnJ1cHQsIEhvc3QgY29kZSBtYXkKKwkgKiBub3QgaW5pdGlhdGUgYW55dGhpbmcgbW9yZS4gIFNvIHdlIGp1c3QgbmVlZCB0byBjbGVhbgorCSAqIHVwIEhvc3Qtc2lkZSBzdGF0ZS4KKwkgKi8KKworCWlmIChzY24tPmF0aGRpYWdfcHJvY2ZzX2luaXRlZCkgeworCQlhdGhkaWFnX3Byb2Nmc19yZW1vdmUoKTsKKwkJc2NuLT5hdGhkaWFnX3Byb2Nmc19pbml0ZWQgPSBmYWxzZTsKKwl9CisKKwloaWZfYnVmZmVyX2NsZWFudXAoaGlmX3N0YXRlKTsKKworCWZvciAocGlwZV9udW0gPSAwOyBwaXBlX251bSA8IHNjbi0+Y2VfY291bnQ7IHBpcGVfbnVtKyspIHsKKwkJc3RydWN0IEhJRl9DRV9waXBlX2luZm8gKnBpcGVfaW5mbzsKKworCQlwaXBlX2luZm8gPSAmaGlmX3N0YXRlLT5waXBlX2luZm9bcGlwZV9udW1dOworCQlpZiAocGlwZV9pbmZvLT5jZV9oZGwpIHsKKwkJCWNlX2ZpbmkocGlwZV9pbmZvLT5jZV9oZGwpOworCQkJcGlwZV9pbmZvLT5jZV9oZGwgPSBOVUxMOworCQkJcGlwZV9pbmZvLT5idWZfc3ogPSAwOworCQl9CisJfQorCisJaWYgKGhpZl9zdGF0ZS0+c2xlZXBfdGltZXJfaW5pdCkgeworCQljZGZfc29mdGlycV90aW1lcl9jYW5jZWwoJmhpZl9zdGF0ZS0+c2xlZXBfdGltZXIpOworCQljZGZfc29mdGlycV90aW1lcl9mcmVlKCZoaWZfc3RhdGUtPnNsZWVwX3RpbWVyKTsKKwkJaGlmX3N0YXRlLT5zbGVlcF90aW1lcl9pbml0ID0gZmFsc2U7CisJfQorCisJaGlmX3N0YXRlLT5zdGFydGVkID0gZmFsc2U7Cit9CisKKyNkZWZpbmUgQURSQVNURUFfU1JDX1dSX0lOREVYX09GRlNFVCAweDNDCisjZGVmaW5lIEFEUkFTVEVBX0RTVF9XUl9JTkRFWF9PRkZTRVQgMHg0MAorCisKK3N0YXRpYyBzdHJ1Y3Qgc2hhZG93X3JlZ19jZmcgdGFyZ2V0X3NoYWRvd19yZWdfY2ZnX21hcFtdID0geworCXsgMCwgQURSQVNURUFfU1JDX1dSX0lOREVYX09GRlNFVH0sCisJeyAzLCBBRFJBU1RFQV9TUkNfV1JfSU5ERVhfT0ZGU0VUfSwKKwl7IDQsIEFEUkFTVEVBX1NSQ19XUl9JTkRFWF9PRkZTRVR9LAorCXsgNSwgQURSQVNURUFfU1JDX1dSX0lOREVYX09GRlNFVH0sCisJeyA3LCBBRFJBU1RFQV9TUkNfV1JfSU5ERVhfT0ZGU0VUfSwKKwl7IDEsIEFEUkFTVEVBX0RTVF9XUl9JTkRFWF9PRkZTRVR9LAorCXsgMiwgQURSQVNURUFfRFNUX1dSX0lOREVYX09GRlNFVH0sCisJeyA3LCBBRFJBU1RFQV9EU1RfV1JfSU5ERVhfT0ZGU0VUfSwKKwl7IDgsIEFEUkFTVEVBX0RTVF9XUl9JTkRFWF9PRkZTRVR9LAorfTsKKworCisKKy8qIENFX1BDSSBUQUJMRSAqLworLyoKKyAqIE5PVEU6IHRoZSB0YWJsZSBiZWxvdyBpcyBvdXQgb2YgZGF0ZSwgdGhvdWdoIHN0aWxsIGEgdXNlZnVsIHJlZmVyZW5jZS4KKyAqIFJlZmVyIHRvIHRhcmdldF9zZXJ2aWNlX3RvX2NlX21hcCBhbmQgaGlmX21hcF9zZXJ2aWNlX3RvX3BpcGUgZm9yIHRoZSBhY3R1YWwKKyAqIG1hcHBpbmcgb2YgSFRDIHNlcnZpY2VzIHRvIEhJRiBwaXBlcy4KKyAqLworLyoKKyAqIFRoaXMgYXV0aG9yaXRhdGl2ZSB0YWJsZSBkZWZpbmVzIENvcHkgRW5naW5lIGNvbmZpZ3VyYXRpb24gYW5kIHRoZSBtYXBwaW5nCisgKiBvZiBzZXJ2aWNlcy9lbmRwb2ludHMgdG8gQ0VzLiAgQSBzdWJzZXQgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcyBwYXNzZWQgdG8KKyAqIHRoZSBUYXJnZXQgZHVyaW5nIHN0YXJ0dXAgYXMgYSBwcmVyZXF1aXNpdGUgdG8gZW50ZXJpbmcgQk1JIHBoYXNlLgorICogU2VlOgorICogICAgdGFyZ2V0X3NlcnZpY2VfdG9fY2VfbWFwIC0gVGFyZ2V0LXNpZGUgbWFwcGluZworICogICAgaGlmX21hcF9zZXJ2aWNlX3RvX3BpcGUgICAgICAtIEhvc3Qtc2lkZSBtYXBwaW5nCisgKiAgICB0YXJnZXRfY2VfY29uZmlnICAgICAgICAgLSBUYXJnZXQtc2lkZSBjb25maWd1cmF0aW9uCisgKiAgICBob3N0X2NlX2NvbmZpZyAgICAgICAgICAgLSBIb3N0LXNpZGUgY29uZmlndXJhdGlvbgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgUHVycG9zZSAgICB8IFNlcnZpY2UgLyBFbmRwb2ludCAgIHwgQ0UgICB8IERpcmUgfCBYZmVyICAgICB8IFhmZXIKKyB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8IGN0aW8gfCBTaXplICAgICB8IEZyZXF1ZW5jeQorIHwgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgbiAgICB8ICAgICAgICAgIHwKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIHR4ICAgICAgICAgfCBIVFRfREFUQSAoZG93bmxpbmspICB8IENFIDAgfCBoLT50IHwgbWVkaXVtIC0gfCB2ZXJ5IGZyZXF1ZW50CisgICBkZXNjcmlwdG9yIHwgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICB8IE8oMTAwQikgIHwgYW5kIHJlZ3VsYXIKKyAgIGRvd25sb2FkICAgfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgcnggICAgICAgICB8IEhUVF9EQVRBICh1cGxpbmspICAgIHwgQ0UgMSB8IHQtPmggfCBzbWFsbCAtICB8IGZyZXF1ZW50IGFuZAorICAgaW5kaWNhdGlvbiB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgfCBPKDEwQikgICB8IHJlZ3VsYXIKKyAgIHVwbG9hZCAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgTVNEVSAgICAgICB8IERBVEFfQksgKHVwbGluaykgICAgIHwgQ0UgMiB8IHQtPmggfCBsYXJnZSAtICB8IHJhcmUKKyAgIHVwbG9hZCAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgIHwgTygxMDAwQikgfCAoZnJlcXVlbnQKKyAgIGUuZy4gbm9pc2UgfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgfCBkdXJpbmcgSVAxLjAKKyAgIHBhY2tldHMgICAgfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgfCB0ZXN0aW5nKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgTVNEVSAgICAgICB8IERBVEFfQksgKGRvd25saW5rKSAgIHwgQ0UgMyB8IGgtPnQgfCBsYXJnZSAtICB8IHZlcnkgcmFyZQorICAgZG93bmxvYWQgICB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgfCBPKDEwMDBCKSB8IChmcmVxdWVudAorICAgZS5nLiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgfCAgICAgICAgICB8IGR1cmluZyBJUDEuMAorICAgbWlzZGlyZWN0ZSB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgfCAgICAgICAgICB8IHRlc3RpbmcpCisgICBkIEVBUE9MICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICB8ICAgICAgICAgIHwKKyAgIHBhY2tldHMgICAgfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgbi9hICAgICAgICB8IERBVEFfQkUsIERBVEFfVkkgICAgIHwgQ0UgMiB8IHQtPmggfCAgICAgICAgICB8IG5ldmVyKD8pCisgfCBEQVRBX1ZPICh1cGxpbmspICAgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgbi9hICAgICAgICB8IERBVEFfQkUsIERBVEFfVkkgICAgIHwgQ0UgMyB8IGgtPnQgfCAgICAgICAgICB8IG5ldmVyKD8pCisgfCBEQVRBX1ZPIChkb3dubGluaykgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV01JIGV2ZW50cyB8IFdNSV9DT05UUk9MICh1cGxpbmspIHwgQ0UgNCB8IHQtPmggfCBtZWRpdW0gLSB8IGluZnJlcXVlbnQKKyB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgfCBPKDEwMEIpICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXTUkgICAgICAgIHwgV01JX0NPTlRST0wgICAgICAgICAgfCBDRSA1IHwgaC0+dCB8IG1lZGl1bSAtIHwgaW5mcmVxdWVudAorICAgbWVzc2FnZXMgICB8IChkb3dubGluaykgICAgICAgICAgIHwgICAgICB8ICAgICAgfCBPKDEwMEIpICB8CisgfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgbi9hICAgICAgICB8IEhUQ19DVFJMX1JTVkQsICAgICAgIHwgQ0UgMSB8IHQtPmggfCAgICAgICAgICB8IG5ldmVyKD8pCisgfCBIVENfUkFXX1NUUkVBTVMgICAgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgfAorIHwgKHVwbGluaykgICAgICAgICAgICAgfCAgICAgIHwgICAgICB8ICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIG4vYSAgICAgICAgfCBIVENfQ1RSTF9SU1ZELCAgICAgICB8IENFIDAgfCBoLT50IHwgICAgICAgICAgfCBuZXZlcig/KQorIHwgSFRDX1JBV19TVFJFQU1TICAgICAgfCAgICAgIHwgICAgICB8ICAgICAgICAgIHwKKyB8IChkb3dubGluaykgICAgICAgICAgIHwgICAgICB8ICAgICAgfCAgICAgICAgICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBkaWFnICAgICAgIHwgbm9uZSAocmF3IENFKSAgICAgICAgfCBDRSA3IHwgdDw+aCB8ICAgIDQgICAgIHwgRGlhZyBXaW5kb3cKKyB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgfCAgICAgICAgICB8IGluZnJlcXVlbnQKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICogTWFwIGZyb20gc2VydmljZS9lbmRwb2ludCB0byBDb3B5IEVuZ2luZS4KKyAqIFRoaXMgdGFibGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBDRV9QQ0kgVEFCTEUsIGFib3ZlLgorICogSXQgaXMgcGFzc2VkIHRvIHRoZSBUYXJnZXQgYXQgc3RhcnR1cCBmb3IgdXNlIGJ5IGZpcm13YXJlLgorICovCitzdGF0aWMgc3RydWN0IHNlcnZpY2VfdG9fcGlwZSB0YXJnZXRfc2VydmljZV90b19jZV9tYXBfd2xhbltdID0geworCXsKKwkJV01JX0RBVEFfVk9fU1ZDLAorCQlQSVBFRElSX09VVCwgICAgLyogb3V0ID0gVUwgPSBob3N0IC0+IHRhcmdldCAqLworCQkzLAorCX0sCisJeworCQlXTUlfREFUQV9WT19TVkMsCisJCVBJUEVESVJfSU4sICAgICAvKiBpbiA9IERMID0gdGFyZ2V0IC0+IGhvc3QgKi8KKwkJMiwKKwl9LAorCXsKKwkJV01JX0RBVEFfQktfU1ZDLAorCQlQSVBFRElSX09VVCwgICAgLyogb3V0ID0gVUwgPSBob3N0IC0+IHRhcmdldCAqLworCQkzLAorCX0sCisJeworCQlXTUlfREFUQV9CS19TVkMsCisJCVBJUEVESVJfSU4sICAgICAvKiBpbiA9IERMID0gdGFyZ2V0IC0+IGhvc3QgKi8KKwkJMiwKKwl9LAorCXsKKwkJV01JX0RBVEFfQkVfU1ZDLAorCQlQSVBFRElSX09VVCwgICAgLyogb3V0ID0gVUwgPSBob3N0IC0+IHRhcmdldCAqLworCQkzLAorCX0sCisJeworCQlXTUlfREFUQV9CRV9TVkMsCisJCVBJUEVESVJfSU4sICAgICAvKiBpbiA9IERMID0gdGFyZ2V0IC0+IGhvc3QgKi8KKwkJMiwKKwl9LAorCXsKKwkJV01JX0RBVEFfVklfU1ZDLAorCQlQSVBFRElSX09VVCwgICAgLyogb3V0ID0gVUwgPSBob3N0IC0+IHRhcmdldCAqLworCQkzLAorCX0sCisJeworCQlXTUlfREFUQV9WSV9TVkMsCisJCVBJUEVESVJfSU4sICAgICAvKiBpbiA9IERMID0gdGFyZ2V0IC0+IGhvc3QgKi8KKwkJMiwKKwl9LAorCXsKKwkJV01JX0NPTlRST0xfU1ZDLAorCQlQSVBFRElSX09VVCwgICAgLyogb3V0ID0gVUwgPSBob3N0IC0+IHRhcmdldCAqLworCQkzLAorCX0sCisJeworCQlXTUlfQ09OVFJPTF9TVkMsCisJCVBJUEVESVJfSU4sICAgICAvKiBpbiA9IERMID0gdGFyZ2V0IC0+IGhvc3QgKi8KKwkJMiwKKwl9LAorCXsKKwkJSFRDX0NUUkxfUlNWRF9TVkMsCisJCVBJUEVESVJfT1VULCAgICAvKiBvdXQgPSBVTCA9IGhvc3QgLT4gdGFyZ2V0ICovCisJCTAsICAgICAgICAgICAgICAvKiBjb3VsZCBiZSBtb3ZlZCB0byAzIChzaGFyZSB3aXRoIFdNSSkgKi8KKwl9LAorCXsKKwkJSFRDX0NUUkxfUlNWRF9TVkMsCisJCVBJUEVESVJfSU4sICAgICAvKiBpbiA9IERMID0gdGFyZ2V0IC0+IGhvc3QgKi8KKwkJMiwKKwl9LAorCXsKKwkJSFRDX1JBV19TVFJFQU1TX1NWQywgLyogbm90IGN1cnJlbnRseSB1c2VkICovCisJCVBJUEVESVJfT1VULCAgICAvKiBvdXQgPSBVTCA9IGhvc3QgLT4gdGFyZ2V0ICovCisJCTAsCisJfSwKKwl7CisJCUhUQ19SQVdfU1RSRUFNU19TVkMsIC8qIG5vdCBjdXJyZW50bHkgdXNlZCAqLworCQlQSVBFRElSX0lOLCAgICAgLyogaW4gPSBETCA9IHRhcmdldCAtPiBob3N0ICovCisJCTIsCisJfSwKKwl7CisJCUhUVF9EQVRBX01TR19TVkMsCisJCVBJUEVESVJfT1VULCAgICAvKiBvdXQgPSBVTCA9IGhvc3QgLT4gdGFyZ2V0ICovCisJCTQsCisJfSwKKwl7CisJCUhUVF9EQVRBX01TR19TVkMsCisJCVBJUEVESVJfSU4sICAgICAvKiBpbiA9IERMID0gdGFyZ2V0IC0+IGhvc3QgKi8KKwkJMSwKKwl9LAorCXsKKwkJV0RJX0lQQV9UWF9TVkMsCisJCVBJUEVESVJfT1VULCAgICAvKiBpbiA9IERMID0gdGFyZ2V0IC0+IGhvc3QgKi8KKwkJNSwKKwl9LAorCS8qIChBZGRpdGlvbnMgaGVyZSkgKi8KKworCXsgICAgICAgICAgICAgICAgICAgICAgIC8qIE11c3QgYmUgbGFzdCAqLworCQkwLAorCQkwLAorCQkwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNlcnZpY2VfdG9fcGlwZSAqdGFyZ2V0X3NlcnZpY2VfdG9fY2VfbWFwID0KKwl0YXJnZXRfc2VydmljZV90b19jZV9tYXBfd2xhbjsKK3N0YXRpYyBpbnQgdGFyZ2V0X3NlcnZpY2VfdG9fY2VfbWFwX3N6ID0gc2l6ZW9mKHRhcmdldF9zZXJ2aWNlX3RvX2NlX21hcF93bGFuKTsKKworc3RhdGljIHN0cnVjdCBzaGFkb3dfcmVnX2NmZyAqdGFyZ2V0X3NoYWRvd19yZWdfY2ZnID0gdGFyZ2V0X3NoYWRvd19yZWdfY2ZnX21hcDsKK3N0YXRpYyBpbnQgc2hhZG93X2NmZ19zeiA9IHNpemVvZih0YXJnZXRfc2hhZG93X3JlZ19jZmdfbWFwKTsKKworc3RhdGljIHN0cnVjdCBzZXJ2aWNlX3RvX3BpcGUgdGFyZ2V0X3NlcnZpY2VfdG9fY2VfbWFwX3dsYW5fZXBwaW5nW10gPSB7CisJe1dNSV9EQVRBX1ZPX1NWQywgUElQRURJUl9PVVQsIDMsfSwgICAgIC8qIG91dCA9IFVMID0gaG9zdCAtPiB0YXJnZXQgKi8KKwl7V01JX0RBVEFfVk9fU1ZDLCBQSVBFRElSX0lOLCAyLH0sICAgICAgLyogaW4gPSBETCA9IHRhcmdldCAtPiBob3N0ICovCisJe1dNSV9EQVRBX0JLX1NWQywgUElQRURJUl9PVVQsIDQsfSwgICAgIC8qIG91dCA9IFVMID0gaG9zdCAtPiB0YXJnZXQgKi8KKwl7V01JX0RBVEFfQktfU1ZDLCBQSVBFRElSX0lOLCAxLH0sICAgICAgLyogaW4gPSBETCA9IHRhcmdldCAtPiBob3N0ICovCisJe1dNSV9EQVRBX0JFX1NWQywgUElQRURJUl9PVVQsIDMsfSwgICAgIC8qIG91dCA9IFVMID0gaG9zdCAtPiB0YXJnZXQgKi8KKwl7V01JX0RBVEFfQkVfU1ZDLCBQSVBFRElSX0lOLCAyLH0sICAgICAgLyogaW4gPSBETCA9IHRhcmdldCAtPiBob3N0ICovCisJe1dNSV9EQVRBX1ZJX1NWQywgUElQRURJUl9PVVQsIDMsfSwgICAgIC8qIG91dCA9IFVMID0gaG9zdCAtPiB0YXJnZXQgKi8KKwl7V01JX0RBVEFfVklfU1ZDLCBQSVBFRElSX0lOLCAyLH0sICAgICAgLyogaW4gPSBETCA9IHRhcmdldCAtPiBob3N0ICovCisJe1dNSV9DT05UUk9MX1NWQywgUElQRURJUl9PVVQsIDMsfSwgICAgIC8qIG91dCA9IFVMID0gaG9zdCAtPiB0YXJnZXQgKi8KKwl7V01JX0NPTlRST0xfU1ZDLCBQSVBFRElSX0lOLCAyLH0sICAgICAgLyogaW4gPSBETCA9IHRhcmdldCAtPiBob3N0ICovCisJe0hUQ19DVFJMX1JTVkRfU1ZDLCBQSVBFRElSX09VVCwgMCx9LCAgIC8qIG91dCA9IFVMID0gaG9zdCAtPiB0YXJnZXQgKi8KKwl7SFRDX0NUUkxfUlNWRF9TVkMsIFBJUEVESVJfSU4sIDIsfSwgICAgLyogaW4gPSBETCA9IHRhcmdldCAtPiBob3N0ICovCisJe0hUQ19SQVdfU1RSRUFNU19TVkMsIFBJUEVESVJfT1VULCAwLH0sIC8qIG91dCA9IFVMID0gaG9zdCAtPiB0YXJnZXQgKi8KKwl7SFRDX1JBV19TVFJFQU1TX1NWQywgUElQRURJUl9JTiwgMix9LCAgLyogaW4gPSBETCA9IHRhcmdldCAtPiBob3N0ICovCisJe0hUVF9EQVRBX01TR19TVkMsIFBJUEVESVJfT1VULCA0LH0sICAgIC8qIG91dCA9IFVMID0gaG9zdCAtPiB0YXJnZXQgKi8KKwl7SFRUX0RBVEFfTVNHX1NWQywgUElQRURJUl9JTiwgMSx9LCAgICAgLyogaW4gPSBETCA9IHRhcmdldCAtPiBob3N0ICovCisJezAsIDAsIDAsfSwgICAgICAgICAgICAgLyogTXVzdCBiZSBsYXN0ICovCit9OworCisjaWZkZWYgSElGX1BDSQorLyoKKyAqIFNlbmQgYW4gaW50ZXJydXB0IHRvIHRoZSBkZXZpY2UgdG8gd2FrZSB1cCB0aGUgVGFyZ2V0IENQVQorICogc28gaXQgaGFzIGFuIG9wcG9ydHVuaXR5IHRvIG5vdGljZSBhbnkgY2hhbmdlZCBzdGF0ZS4KKyAqLwordm9pZCBoaWZfd2FrZV90YXJnZXRfY3B1KHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCUNERl9TVEFUVVMgcnY7CisJdWludDMyX3QgY29yZV9jdHJsOworCisJcnYgPSBoaWZfZGlhZ19yZWFkX2FjY2VzcyhzY24sCisJCQkJICBTT0NfQ09SRV9CQVNFX0FERFJFU1MgfCBDT1JFX0NUUkxfQUREUkVTUywKKwkJCQkgICZjb3JlX2N0cmwpOworCUNERl9BU1NFUlQocnYgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKTsKKwkvKiBBX0lOVU1fRklSTVdBUkUgaW50ZXJydXB0IHRvIFRhcmdldCBDUFUgKi8KKwljb3JlX2N0cmwgfD0gQ09SRV9DVFJMX0NQVV9JTlRSX01BU0s7CisKKwlydiA9IGhpZl9kaWFnX3dyaXRlX2FjY2VzcyhzY24sCisJCQkJICAgU09DX0NPUkVfQkFTRV9BRERSRVNTIHwgQ09SRV9DVFJMX0FERFJFU1MsCisJCQkJICAgY29yZV9jdHJsKTsKKwlDREZfQVNTRVJUKHJ2ID09IENERl9TVEFUVVNfU1VDQ0VTUyk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaGlmX3NsZWVwX2VudHJ5KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKWFyZzsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGhpZl9zdGF0ZS0+c2NuOworCXVpbnQzMl90IGlkbGVfbXM7CisJaWYgKHNjbi0+cmVjb3ZlcnkpCisJCXJldHVybjsKKworCWNkZl9zcGluX2xvY2tfaXJxc2F2ZSgmaGlmX3N0YXRlLT5rZWVwX2F3YWtlX2xvY2spOworCWlmIChoaWZfc3RhdGUtPnZlcmlmaWVkX2F3YWtlID09IGZhbHNlKSB7CisJCWlkbGVfbXMgPSBjZGZfc3lzdGVtX3RpY2tzX3RvX21zZWNzKGNkZl9zeXN0ZW1fdGlja3MoKQorCQkJCQkJICAgIC0gaGlmX3N0YXRlLT5zbGVlcF90aWNrcyk7CisJCWlmIChpZGxlX21zID49IEhJRl9NSU5fU0xFRVBfSU5BQ1RJVklUWV9USU1FX01TKSB7CisJCQlpZiAoIWNkZl9hdG9taWNfcmVhZCgmc2NuLT5saW5rX3N1c3BlbmRlZCkpIHsKKwkJCQlzb2Nfd2FrZV9yZXNldChzY24pOworCQkJCWhpZl9zdGF0ZS0+ZmFrZV9zbGVlcCA9IGZhbHNlOworCQkJfQorCQl9IGVsc2UgeworCQkJY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKCZoaWZfc3RhdGUtPnNsZWVwX3RpbWVyKTsKKwkJCWNkZl9zb2Z0aXJxX3RpbWVyX3N0YXJ0KCZoaWZfc3RhdGUtPnNsZWVwX3RpbWVyLAorCQkJCSAgICBISUZfU0xFRVBfSU5BQ1RJVklUWV9USU1FUl9QRVJJT0RfTVMpOworCQl9CisJfSBlbHNlIHsKKwkJY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKCZoaWZfc3RhdGUtPnNsZWVwX3RpbWVyKTsKKwkJY2RmX3NvZnRpcnFfdGltZXJfc3RhcnQoJmhpZl9zdGF0ZS0+c2xlZXBfdGltZXIsCisJCQkJCUhJRl9TTEVFUF9JTkFDVElWSVRZX1RJTUVSX1BFUklPRF9NUyk7CisJfQorCWNkZl9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZoaWZfc3RhdGUtPmtlZXBfYXdha2VfbG9jayk7Cit9CisjZGVmaW5lIEhJRl9ISUFfTUFYX1BPTExfTE9PUCAgICAxMDAwMDAwCisjZGVmaW5lIEhJRl9ISUFfUE9MTElOR19ERUxBWV9NUyAxMAorCisjaWZuZGVmIEhJRl9QQ0kKK2ludCBoaWZfc2V0X2hpYShzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitpbnQgaGlmX3NldF9oaWEoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJQ0RGX1NUQVRVUyBydjsKKwl1aW50MzJfdCBpbnRlcmNvbm5lY3RfdGFyZ19hZGRyID0gMDsKKwl1aW50MzJfdCBwY2llX3N0YXRlX3RhcmdfYWRkciA9IDA7CisJdWludDMyX3QgcGlwZV9jZmdfdGFyZ19hZGRyID0gMDsKKwl1aW50MzJfdCBzdmNfdG9fcGlwZV9tYXAgPSAwOworCXVpbnQzMl90IHBjaWVfY29uZmlnX2ZsYWdzID0gMDsKKwl1aW50MzJfdCBmbGFnMl92YWx1ZSA9IDA7CisJdWludDMyX3QgZmxhZzJfdGFyZ19hZGRyID0gMDsKKyNpZmRlZiBRQ0FfV0lGSV8zXzAKKwl1aW50MzJfdCBob3N0X2ludGVyZXN0X2FyZWEgPSAwOworCXVpbnQ4X3QgaTsKKyNlbHNlCisJdWludDMyX3QgZWFsbG9jX3ZhbHVlID0gMDsKKwl1aW50MzJfdCBlYWxsb2NfdGFyZ19hZGRyID0gMDsKKwl1aW50OF90IGJhbmtzX3N3aXRjaGVkID0gMTsKKwl1aW50MzJfdCBjaGlwX2lkOworI2VuZGlmCisJdWludDMyX3QgcGlwZV9jZmdfYWRkcjsKKworCUhJRl9UUkFDRSgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKwlpZiAoSUhFTElVTV9CVSB8fCBBRFJBU1RFQV9CVSkKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworI2lmZGVmIFFDQV9XSUZJXzNfMAorCWkgPSAwOworCXdoaWxlIChpIDwgSElGX0hJQV9NQVhfUE9MTF9MT09QKSB7CisJCWhvc3RfaW50ZXJlc3RfYXJlYSA9IGhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKworCQkJCQkJQV9TT0NfQ09SRV9TQ1JBVENIXzBfQUREUkVTUyk7CisJCWlmICgoaG9zdF9pbnRlcmVzdF9hcmVhICYgMHgwMSkgPT0gMCkgeworCQkJY2RmX21kZWxheShISUZfSElBX1BPTExJTkdfREVMQVlfTVMpOworCQkJaG9zdF9pbnRlcmVzdF9hcmVhID0gMDsKKwkJCWkrKzsKKwkJCWlmIChpID4gSElGX0hJQV9NQVhfUE9MTF9MT09QICYmIChpICUgMTAwMCA9PSAwKSkgeworCQkJCUhJRl9FUlJPUigiJXM6IHBvbGwgdGltZW91dCglZCkiLCBfX2Z1bmNfXywgaSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlob3N0X2ludGVyZXN0X2FyZWEgJj0gKH4weDAxKTsKKwkJCWhpZl93cml0ZTMyX21iKHNjbi0+bWVtICsgMHgxMTMwMTQsIDApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA+PSBISUZfSElBX01BWF9QT0xMX0xPT1ApIHsKKwkJSElGX0VSUk9SKCIlczogaGlhIHBvbGxpbmcgdGltZW91dCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGhvc3RfaW50ZXJlc3RfYXJlYSA9PSAwKSB7CisJCUhJRl9FUlJPUigiJXM6IGhvc3RfaW50ZXJlc3RfYXJlYSA9IDAiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWludGVyY29ubmVjdF90YXJnX2FkZHIgPSBob3N0X2ludGVyZXN0X2FyZWEgKworCQkJb2Zmc2V0b2Yoc3RydWN0IGhvc3RfaW50ZXJlc3RfYXJlYV90LAorCQkJaGlfaW50ZXJjb25uZWN0X3N0YXRlKTsKKworCWZsYWcyX3RhcmdfYWRkciA9IGhvc3RfaW50ZXJlc3RfYXJlYSArCisJCQlvZmZzZXRvZihzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9hcmVhX3QsIGhpX29wdGlvbl9mbGFnMik7CisKKyNlbHNlCisJaW50ZXJjb25uZWN0X3RhcmdfYWRkciA9IGhpZl9oaWFfaXRlbV9hZGRyZXNzKHNjbi0+dGFyZ2V0X3R5cGUsCisJCW9mZnNldG9mKHN0cnVjdCBob3N0X2ludGVyZXN0X3MsIGhpX2ludGVyY29ubmVjdF9zdGF0ZSkpOworCWVhbGxvY190YXJnX2FkZHIgPSBoaWZfaGlhX2l0ZW1fYWRkcmVzcyhzY24tPnRhcmdldF90eXBlLAorCQlvZmZzZXRvZihzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zLCBoaV9lYXJseV9hbGxvYykpOworCWZsYWcyX3RhcmdfYWRkciA9IGhpZl9oaWFfaXRlbV9hZGRyZXNzKHNjbi0+dGFyZ2V0X3R5cGUsCisJCW9mZnNldG9mKHN0cnVjdCBob3N0X2ludGVyZXN0X3MsIGhpX29wdGlvbl9mbGFnMikpOworI2VuZGlmCisJLyogU3VwcGx5IFRhcmdldC1zaWRlIENFIGNvbmZpZ3VyYXRpb24gKi8KKwlydiA9IGhpZl9kaWFnX3JlYWRfYWNjZXNzKHNjbiwgaW50ZXJjb25uZWN0X3RhcmdfYWRkciwKKwkJCSAgJnBjaWVfc3RhdGVfdGFyZ19hZGRyKTsKKwlpZiAocnYgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUhJRl9FUlJPUigiJXM6IGludGVyY29ubmVjdF90YXJnX2FkZHIgPSAweCUweCwgcmV0ID0gJWQiLAorCQkJICBfX2Z1bmNfXywgaW50ZXJjb25uZWN0X3RhcmdfYWRkciwgcnYpOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChwY2llX3N0YXRlX3RhcmdfYWRkciA9PSAwKSB7CisJCXJ2ID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCUhJRl9FUlJPUigiJXM6IHBjaWUgc3RhdGUgYWRkciBpcyAwIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCXBpcGVfY2ZnX2FkZHIgPSBwY2llX3N0YXRlX3RhcmdfYWRkciArCisJCQkgIG9mZnNldG9mKHN0cnVjdCBwY2llX3N0YXRlX3MsCisJCQkgIHBpcGVfY2ZnX2FkZHIpOworCXJ2ID0gaGlmX2RpYWdfcmVhZF9hY2Nlc3Moc2NuLAorCQkJICBwaXBlX2NmZ19hZGRyLAorCQkJICAmcGlwZV9jZmdfdGFyZ19hZGRyKTsKKwlpZiAocnYgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUhJRl9FUlJPUigiJXM6IHBpcGVfY2ZnX2FkZHIgPSAweCUweCwgcmV0ID0gJWQiLAorCQkJX19mdW5jX18sIHBpcGVfY2ZnX2FkZHIsIHJ2KTsKKwkJZ290byBkb25lOworCX0KKwlpZiAocGlwZV9jZmdfdGFyZ19hZGRyID09IDApIHsKKwkJcnYgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJSElGX0VSUk9SKCIlczogcGlwZSBjZmcgYWRkciBpcyAwIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJcnYgPSBoaWZfZGlhZ193cml0ZV9tZW0oc2NuLCBwaXBlX2NmZ190YXJnX2FkZHIsCisJCQkodWludDhfdCAqKSB0YXJnZXRfY2VfY29uZmlnLAorCQkJdGFyZ2V0X2NlX2NvbmZpZ19zeik7CisKKwlpZiAocnYgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUhJRl9FUlJPUigiJXM6IHdyaXRlIHBpcGUgY2ZnICglZCkiLCBfX2Z1bmNfXywgcnYpOworCQlnb3RvIGRvbmU7CisJfQorCisJcnYgPSBoaWZfZGlhZ19yZWFkX2FjY2VzcyhzY24sCisJCQkgIHBjaWVfc3RhdGVfdGFyZ19hZGRyICsKKwkJCSAgb2Zmc2V0b2Yoc3RydWN0IHBjaWVfc3RhdGVfcywKKwkJCSAgIHN2Y190b19waXBlX21hcCksCisJCQkgICZzdmNfdG9fcGlwZV9tYXApOworCWlmIChydiAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJSElGX0VSUk9SKCIlczogZ2V0IHN2Yy9waXBlIG1hcCAoJWQpIiwgX19mdW5jX18sIHJ2KTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoc3ZjX3RvX3BpcGVfbWFwID09IDApIHsKKwkJcnYgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJSElGX0VSUk9SKCIlczogc3ZjX3RvX3BpcGUgbWFwIGlzIDAiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlydiA9IGhpZl9kaWFnX3dyaXRlX21lbShzY24sCisJCQlzdmNfdG9fcGlwZV9tYXAsCisJCQkodWludDhfdCAqKSB0YXJnZXRfc2VydmljZV90b19jZV9tYXAsCisJCQl0YXJnZXRfc2VydmljZV90b19jZV9tYXBfc3opOworCWlmIChydiAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJSElGX0VSUk9SKCIlczogd3JpdGUgc3ZjL3BpcGUgbWFwICglZCkiLCBfX2Z1bmNfXywgcnYpOworCQlnb3RvIGRvbmU7CisJfQorCisJcnYgPSBoaWZfZGlhZ19yZWFkX2FjY2VzcyhzY24sCisJCQlwY2llX3N0YXRlX3RhcmdfYWRkciArCisJCQlvZmZzZXRvZihzdHJ1Y3QgcGNpZV9zdGF0ZV9zLAorCQkJY29uZmlnX2ZsYWdzKSwKKwkJCSZwY2llX2NvbmZpZ19mbGFncyk7CisJaWYgKHJ2ICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlISUZfRVJST1IoIiVzOiBnZXQgcGNpZSBjb25maWdfZmxhZ3MgKCVkKSIsIF9fZnVuY19fLCBydik7CisJCWdvdG8gZG9uZTsKKwl9CisjaWYgKENPTkZJR19QQ0lFX0VOQUJMRV9MMV9DTE9DS19HQVRFKQorCXBjaWVfY29uZmlnX2ZsYWdzIHw9IFBDSUVfQ09ORklHX0ZMQUdfRU5BQkxFX0wxOworI2Vsc2UKKwlwY2llX2NvbmZpZ19mbGFncyAmPSB+UENJRV9DT05GSUdfRkxBR19FTkFCTEVfTDE7CisjZW5kaWYgLyogQ09ORklHX1BDSUVfRU5BQkxFX0wxX0NMT0NLX0dBVEUgKi8KKwlwY2llX2NvbmZpZ19mbGFncyB8PSBQQ0lFX0NPTkZJR19GTEFHX0NMS19TV0lUQ0hfV0FJVDsKKyNpZiAoQ09ORklHX1BDSUVfRU5BQkxFX0FYSV9DTEtfR0FURSkKKwlwY2llX2NvbmZpZ19mbGFncyB8PSBQQ0lFX0NPTkZJR19GTEFHX0FYSV9DTEtfR0FURTsKKyNlbmRpZgorCXJ2ID0gaGlmX2RpYWdfd3JpdGVfbWVtKHNjbiwKKwkJCXBjaWVfc3RhdGVfdGFyZ19hZGRyICsKKwkJCW9mZnNldG9mKHN0cnVjdCBwY2llX3N0YXRlX3MsCisJCQljb25maWdfZmxhZ3MpLAorCQkJKHVpbnQ4X3QgKikgJnBjaWVfY29uZmlnX2ZsYWdzLAorCQkJc2l6ZW9mKHBjaWVfY29uZmlnX2ZsYWdzKSk7CisJaWYgKHJ2ICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlISUZfRVJST1IoIiVzOiB3cml0ZSBwY2llIGNvbmZpZ19mbGFncyAoJWQpIiwgX19mdW5jX18sIHJ2KTsKKwkJZ290byBkb25lOworCX0KKworI2lmbmRlZiBRQ0FfV0lGSV8zXzAKKwkvKiBjb25maWd1cmUgZWFybHkgYWxsb2NhdGlvbiAqLworCWVhbGxvY190YXJnX2FkZHIgPSBoaWZfaGlhX2l0ZW1fYWRkcmVzcyhzY24tPnRhcmdldF90eXBlLAorCQkJCQkJCW9mZnNldG9mKAorCQkJCQkJCXN0cnVjdCBob3N0X2ludGVyZXN0X3MsCisJCQkJCQkJaGlfZWFybHlfYWxsb2MpKTsKKworCXJ2ID0gaGlmX2RpYWdfcmVhZF9hY2Nlc3Moc2NuLCBlYWxsb2NfdGFyZ19hZGRyLAorCQkJJmVhbGxvY192YWx1ZSk7CisJaWYgKHJ2ICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlISUZfRVJST1IoIiVzOiBnZXQgZWFybHkgYWxsb2MgdmFsICglZCkiLCBfX2Z1bmNfXywgcnYpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogMSBiYW5rIGlzIHN3aXRjaGVkIHRvIElSQU0sIGV4Y2VwdCBST01FIDEuMCAqLworCWVhbGxvY192YWx1ZSB8PQorCQkoKEhJX0VBUkxZX0FMTE9DX01BR0lDIDw8IEhJX0VBUkxZX0FMTE9DX01BR0lDX1NISUZUKSAmCisJCSBISV9FQVJMWV9BTExPQ19NQUdJQ19NQVNLKTsKKworCXJ2ID0gaGlmX2RpYWdfcmVhZF9hY2Nlc3Moc2NuLAorCQkJICBDSElQX0lEX0FERFJFU1MgfAorCQkJICBSVENfU09DX0JBU0VfQUREUkVTUywgJmNoaXBfaWQpOworCWlmIChydiAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJSElGX0VSUk9SKCIlczogZ2V0IGNoaXAgaWQgdmFsICglZCkiLCBfX2Z1bmNfXywgcnYpOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChDSElQX0lEX1ZFUlNJT05fR0VUKGNoaXBfaWQpID09IDB4RCkgeworCQlzY24tPnRhcmdldF9yZXZpc2lvbiA9CisJCQlDSElQX0lEX1JFVklTSU9OX0dFVChjaGlwX2lkKTsKKwkJc3dpdGNoIChDSElQX0lEX1JFVklTSU9OX0dFVChjaGlwX2lkKSkgeworCQljYXNlIDB4MjogICAgICAgLyogUk9NRSAxLjMgKi8KKwkJCS8qIDIgYmFua3MgYXJlIHN3aXRjaGVkIHRvIElSQU0gKi8KKwkJCWJhbmtzX3N3aXRjaGVkID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDB4NDogICAgICAgLyogUk9NRSAyLjEgKi8KKwkJY2FzZSAweDU6ICAgICAgIC8qIFJPTUUgMi4yICovCisJCQliYW5rc19zd2l0Y2hlZCA9IDY7CisJCQlicmVhazsKKwkJY2FzZSAweDg6ICAgICAgIC8qIFJPTUUgMy4wICovCisJCWNhc2UgMHg5OiAgICAgICAvKiBST01FIDMuMSAqLworCQljYXNlIDB4QTogICAgICAgLyogUk9NRSAzLjIgKi8KKwkJCWJhbmtzX3N3aXRjaGVkID0gOTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDogICAgICAgLyogUk9NRSAxLjAgKi8KKwkJY2FzZSAweDE6ICAgICAgIC8qIFJPTUUgMS4xICovCisJCWRlZmF1bHQ6CisJCQkvKiAzIGJhbmtzIGFyZSBzd2l0Y2hlZCB0byBJUkFNICovCisJCQliYW5rc19zd2l0Y2hlZCA9IDM7CisJCQlicmVhazsKKwkJfQorCX0KKworCWVhbGxvY192YWx1ZSB8PQorCQkoKGJhbmtzX3N3aXRjaGVkIDw8IEhJX0VBUkxZX0FMTE9DX0lSQU1fQkFOS1NfU0hJRlQpCisJCSAmIEhJX0VBUkxZX0FMTE9DX0lSQU1fQkFOS1NfTUFTSyk7CisKKwlydiA9IGhpZl9kaWFnX3dyaXRlX2FjY2VzcyhzY24sCisJCQkJZWFsbG9jX3RhcmdfYWRkciwKKwkJCQllYWxsb2NfdmFsdWUpOworCWlmIChydiAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJSElGX0VSUk9SKCIlczogc2V0IGVhcmx5IGFsbG9jIHZhbCAoJWQpIiwgX19mdW5jX18sIHJ2KTsKKwkJZ290byBkb25lOworCX0KKyNlbmRpZgorCisJLyogVGVsbCBUYXJnZXQgdG8gcHJvY2VlZCB3aXRoIGluaXRpYWxpemF0aW9uICovCisJZmxhZzJfdGFyZ19hZGRyID0gaGlmX2hpYV9pdGVtX2FkZHJlc3Moc2NuLT50YXJnZXRfdHlwZSwKKwkJCQkJCW9mZnNldG9mKAorCQkJCQkJc3RydWN0IGhvc3RfaW50ZXJlc3RfcywKKwkJCQkJCWhpX29wdGlvbl9mbGFnMikpOworCisJcnYgPSBoaWZfZGlhZ19yZWFkX2FjY2VzcyhzY24sIGZsYWcyX3RhcmdfYWRkciwKKwkJCSAgJmZsYWcyX3ZhbHVlKTsKKwlpZiAocnYgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUhJRl9FUlJPUigiJXM6IGdldCBvcHRpb24gdmFsICglZCkiLCBfX2Z1bmNfXywgcnYpOworCQlnb3RvIGRvbmU7CisJfQorCisJZmxhZzJfdmFsdWUgfD0gSElfT1BUSU9OX0VBUkxZX0NGR19ET05FOworCXJ2ID0gaGlmX2RpYWdfd3JpdGVfYWNjZXNzKHNjbiwgZmxhZzJfdGFyZ19hZGRyLAorCQkJICAgZmxhZzJfdmFsdWUpOworCWlmIChydiAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJSElGX0VSUk9SKCIlczogc2V0IG9wdGlvbiB2YWwgKCVkKSIsIF9fZnVuY19fLCBydik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwloaWZfd2FrZV90YXJnZXRfY3B1KHNjbik7CisKK2RvbmU6CisKKwlyZXR1cm4gcnY7Cit9CisjZW5kaWYKKworLyoqCisgKiBoaWZfd2xhbl9lbmFibGUoKTogY2FsbCB0aGUgcGxhdGZvcm0gZHJpdmVyIHRvIGVuYWJsZSB3bGFuCisgKgorICogVGhpcyBmdW5jdGlvbiBwYXNzZXMgdGhlIGNvbl9tb2RlIGFuZCBDRSBjb25maWd1cmF0aW9uIHRvCisgKiBwbGF0Zm9ybSBkcml2ZXIgdG8gZW5hYmxlIHdsYW4uCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyBpbnQgaGlmX3dsYW5fZW5hYmxlKHZvaWQpCit7CisJc3RydWN0IGljbnNzX3dsYW5fZW5hYmxlX2NmZyBjZmc7CisJZW51bSBpY25zc19kcml2ZXJfbW9kZSBtb2RlOworCXVpbnQzMl90IGNvbl9tb2RlID0gY2RzX2dldF9jb25wYXJhbSgpOworCisJY2ZnLm51bV9jZV90Z3RfY2ZnID0gdGFyZ2V0X2NlX2NvbmZpZ19zeiAvCisJCXNpemVvZihzdHJ1Y3QgQ0VfcGlwZV9jb25maWcpOworCWNmZy5jZV90Z3RfY2ZnID0gKHN0cnVjdCBjZV90Z3RfcGlwZV9jZmcgKil0YXJnZXRfY2VfY29uZmlnOworCWNmZy5udW1fY2Vfc3ZjX3BpcGVfY2ZnID0gdGFyZ2V0X3NlcnZpY2VfdG9fY2VfbWFwX3N6IC8KKwkJc2l6ZW9mKHN0cnVjdCBzZXJ2aWNlX3RvX3BpcGUpOworCWNmZy5jZV9zdmNfY2ZnID0gKHN0cnVjdCBjZV9zdmNfcGlwZV9jZmcgKil0YXJnZXRfc2VydmljZV90b19jZV9tYXA7CisJY2ZnLm51bV9zaGFkb3dfcmVnX2NmZyA9IHNoYWRvd19jZmdfc3ogLyBzaXplb2Yoc3RydWN0IHNoYWRvd19yZWdfY2ZnKTsKKwljZmcuc2hhZG93X3JlZ19jZmcgPSAoc3RydWN0IGljbnNzX3NoYWRvd19yZWdfY2ZnICopIHRhcmdldF9zaGFkb3dfcmVnX2NmZzsKKworCXN3aXRjaCAoY29uX21vZGUpIHsKKwljYXNlIENERl9GVE1fTU9ERToKKwkJbW9kZSA9IElDTlNTX0ZUTTsKKwkJYnJlYWs7CisJY2FzZSBDREZfRVBQSU5HX01PREU6CisJCW1vZGUgPSBJQ05TU19FUFBJTkc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1vZGUgPSBJQ05TU19NSVNTSU9OOworCQlicmVhazsKKwl9CisJcmV0dXJuIGljbnNzX3dsYW5fZW5hYmxlKCZjZmcsIG1vZGUsIFFXTEFOX1ZFUlNJT05TVFIpOworfQorCisjaWYgKCghZGVmaW5lZChRQ0FfV0lGSV8zXzBfSUhFTElVTSkgJiYgIWRlZmluZWQoUUNBX1dJRklfM18wX0FEUkFTVEVBKSkgfHwgZGVmaW5lZChDT05GSUdfSUNOU1MpKQorc3RhdGljIGlubGluZSB2b2lkIGNuc3NfcGNpZV9ub3RpZnlfcTYodm9pZCkKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYKKworLyoKKyAqIENhbGxlZCBmcm9tIFBDSSBsYXllciB3aGVuZXZlciBhIG5ldyBQQ0kgZGV2aWNlIGlzIHByb2JlZC4KKyAqIEluaXRpYWxpemVzIHBlci1kZXZpY2UgSElGIHN0YXRlIGFuZCBub3RpZmllcyB0aGUgbWFpbgorICogZHJpdmVyIHRoYXQgYSBuZXcgSElGIGRldmljZSBpcyBwcmVzZW50LgorICovCitpbnQgaGlmX2NvbmZpZ19jZShoaWZfaGFuZGxlX3QgaGlmX2hkbCkKK3sKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGU7CisJc3RydWN0IEhJRl9DRV9waXBlX2luZm8gKnBpcGVfaW5mbzsKKwlpbnQgcGlwZV9udW07CisjaWZkZWYgQURSQVNURUFfU0hBRE9XX1JFR0lTVEVSUworCWludCBpOworI2VuZGlmCisJQ0RGX1NUQVRVUyBydiA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlpbnQgcmV0OworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gaGlmX2hkbDsKKwlzdHJ1Y3QgaWNuc3Nfc29jX2luZm8gc29jX2luZm87CisKKwkvKiBpZiBlcHBpbmcgaXMgZW5hYmxlZCB3ZSBuZWVkIHRvIHVzZSB0aGUgZXBwaW5nIGNvbmZpZ3VyYXRpb24uICovCisJaWYgKFdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoY2RzX2dldF9jb25wYXJhbSgpKSkgeworCQlpZiAoV0xBTl9JU19FUFBJTkdfSVJRKGNkc19nZXRfY29ucGFyYW0oKSkpCisJCQlob3N0X2NlX2NvbmZpZyA9IGhvc3RfY2VfY29uZmlnX3dsYW5fZXBwaW5nX2lycTsKKwkJZWxzZQorCQkJaG9zdF9jZV9jb25maWcgPSBob3N0X2NlX2NvbmZpZ193bGFuX2VwcGluZ19wb2xsOworCQl0YXJnZXRfY2VfY29uZmlnID0gdGFyZ2V0X2NlX2NvbmZpZ193bGFuX2VwcGluZzsKKwkJdGFyZ2V0X2NlX2NvbmZpZ19zeiA9IHNpemVvZih0YXJnZXRfY2VfY29uZmlnX3dsYW5fZXBwaW5nKTsKKwkJdGFyZ2V0X3NlcnZpY2VfdG9fY2VfbWFwID0KKwkJICAgIHRhcmdldF9zZXJ2aWNlX3RvX2NlX21hcF93bGFuX2VwcGluZzsKKwkJdGFyZ2V0X3NlcnZpY2VfdG9fY2VfbWFwX3N6ID0KKwkJCXNpemVvZih0YXJnZXRfc2VydmljZV90b19jZV9tYXBfd2xhbl9lcHBpbmcpOworCX0KKworCXJldCA9IGhpZl93bGFuX2VuYWJsZSgpOworCisJaWYgKHJldCkgeworCQlISUZfRVJST1IoIiVzOiBoaWZfd2xhbl9lbmFibGUgZXJyb3IgPSAlZCIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19OT1RfSU5JVElBTElaRUQ7CisJfQorCWlmIChJSEVMSVVNX0JVKSB7CisJCWNuc3NfcGNpZV9ub3RpZnlfcTYoKTsKKwkJSElGX1RSQUNFKCIlczogY25zc19wY2llX25vdGlmeV9xNiBkb25lLCBub3RpY2Vfc2VuZD0gJWQiLAorCQkJICBfX2Z1bmNfXywgc2NuLT5ub3RpY2Vfc2VuZCk7CisJfQorCisJc2NuLT5ub3RpY2Vfc2VuZCA9IHRydWU7CisKKwljZGZfbWVtX3plcm8oJnNvY19pbmZvLCBzaXplb2Yoc29jX2luZm8pKTsKKwlyZXQgPSBpY25zc19nZXRfc29jX2luZm8oJnNvY19pbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlISUZfRVJST1IoIiVzOiBpY25zc19nZXRfc29jX2luZm8gZXJyb3IgPSAlZCIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19OT1RfSU5JVElBTElaRUQ7CisJfQorCisJaGlmX3N0YXRlID0gKHN0cnVjdCBISUZfQ0Vfc3RhdGUgKiljZGZfbWVtX21hbGxvYyhzaXplb2YoKmhpZl9zdGF0ZSkpOworCWlmICghaGlmX3N0YXRlKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljZGZfbWVtX3plcm8oaGlmX3N0YXRlLCBzaXplb2YoKmhpZl9zdGF0ZSkpOworCisJaGlmX3N0YXRlLT5zY24gPSBzY247CisJc2NuLT5oaWZfaGRsID0gaGlmX3N0YXRlOworCXNjbi0+bWVtID0gc29jX2luZm8udl9hZGRyOworCXNjbi0+bWVtX3BhID0gc29jX2luZm8ucF9hZGRyOworCXNjbi0+c29jX3ZlcnNpb24gPSBzb2NfaW5mby52ZXJzaW9uOworCisJY2RmX3NwaW5sb2NrX2luaXQoJmhpZl9zdGF0ZS0+a2VlcF9hd2FrZV9sb2NrKTsKKworCWNkZl9hdG9taWNfaW5pdCgmaGlmX3N0YXRlLT5oaWZfdGhyZWFkX2lkbGUpOworCWNkZl9hdG9taWNfaW5jKCZoaWZfc3RhdGUtPmhpZl90aHJlYWRfaWRsZSk7CisKKwloaWZfc3RhdGUtPmtlZXBfYXdha2VfY291bnQgPSAwOworCisJaGlmX3N0YXRlLT5mYWtlX3NsZWVwID0gZmFsc2U7CisJaGlmX3N0YXRlLT5zbGVlcF90aWNrcyA9IDA7CisJY2RmX3NvZnRpcnFfdGltZXJfaW5pdChOVUxMLCAmaGlmX3N0YXRlLT5zbGVlcF90aW1lciwKKwkJCSAgICAgICBoaWZfc2xlZXBfZW50cnksICh2b2lkICopaGlmX3N0YXRlLAorCQkJICAgICAgIENERl9USU1FUl9UWVBFX1dBS0VfQVBQUyk7CisJaGlmX3N0YXRlLT5zbGVlcF90aW1lcl9pbml0ID0gdHJ1ZTsKKwloaWZfc3RhdGUtPmZ3X2luZGljYXRvcl9hZGRyZXNzID0gRldfSU5ESUNBVE9SX0FERFJFU1M7CisjaWZkZWYgSElGX1BDSQorI2lmIENPTkZJR19BVEhfUENJRV9NQVhfUEVSRiB8fCBDT05GSUdfQVRIX1BDSUVfQVdBS0VfV0hJTEVfRFJJVkVSX0xPQUQKKwkvKiBGb3JjZSBBV0FLRSBmb3JldmVyL3RpbGwgdGhlIGRyaXZlciBpcyBsb2FkZWQgKi8KKwlpZiAoaGlmX3RhcmdldF9zbGVlcF9zdGF0ZV9hZGp1c3Qoc2NuLCBmYWxzZSwgdHJ1ZSkgPCAwKQorCQlyZXR1cm4gLUVBQ0NFUzsKKyNlbmRpZgorI2VuZGlmCisKKwkvKiBEdXJpbmcgQ0UgaW5pdGlhbGl6dGlvbiAqLworCXNjbi0+Y2VfY291bnQgPSBIT1NUX0NFX0NPVU5UOworCUFfVEFSR0VUX0FDQ0VTU19MSUtFTFkoc2NuKTsKKwlmb3IgKHBpcGVfbnVtID0gMDsgcGlwZV9udW0gPCBzY24tPmNlX2NvdW50OyBwaXBlX251bSsrKSB7CisJCXN0cnVjdCBDRV9hdHRyICphdHRyOworCisJCXBpcGVfaW5mbyA9ICZoaWZfc3RhdGUtPnBpcGVfaW5mb1twaXBlX251bV07CisJCXBpcGVfaW5mby0+cGlwZV9udW0gPSBwaXBlX251bTsKKwkJcGlwZV9pbmZvLT5ISUZfQ0Vfc3RhdGUgPSBoaWZfc3RhdGU7CisJCWF0dHIgPSAmaG9zdF9jZV9jb25maWdbcGlwZV9udW1dOworCQlwaXBlX2luZm8tPmNlX2hkbCA9IGNlX2luaXQoc2NuLCBwaXBlX251bSwgYXR0cik7CisJCUNERl9BU1NFUlQocGlwZV9pbmZvLT5jZV9oZGwgIT0gTlVMTCk7CisJCWlmIChwaXBlX2luZm8tPmNlX2hkbCA9PSBOVUxMKSB7CisJCQlydiA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJQV9UQVJHRVRfQUNDRVNTX1VOTElLRUxZKHNjbik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWlmIChwaXBlX251bSA9PSBESUFHX0NFX0lEKSB7CisJCQkvKiBSZXNlcnZlIHRoZSB1bHRpbWF0ZSBDRSBmb3IKKwkJCSAqIERpYWdub3N0aWMgV2luZG93IHN1cHBvcnQgKi8KKwkJCWhpZl9zdGF0ZS0+Y2VfZGlhZyA9CisJCQkJaGlmX3N0YXRlLT5waXBlX2luZm9bc2NuLT5jZV9jb3VudCAtIDFdLmNlX2hkbDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcGlwZV9pbmZvLT5idWZfc3ogPSAoY2RmX3NpemVfdCkgKGF0dHItPnNyY19zel9tYXgpOworCQljZGZfc3BpbmxvY2tfaW5pdCgmcGlwZV9pbmZvLT5yZWN2X2J1ZnNfbmVlZGVkX2xvY2spOworCQlpZiAoYXR0ci0+ZGVzdF9uZW50cmllcyA+IDApIHsKKwkJCWF0b21pY19zZXQoJnBpcGVfaW5mby0+cmVjdl9idWZzX25lZWRlZCwKKwkJCQkgICBpbml0X2J1ZmZlcl9jb3VudChhdHRyLT5kZXN0X25lbnRyaWVzIC0gMSkpOworCQl9IGVsc2UgeworCQkJYXRvbWljX3NldCgmcGlwZV9pbmZvLT5yZWN2X2J1ZnNfbmVlZGVkLCAwKTsKKwkJfQorCQljZV90YXNrbGV0X2luaXQoaGlmX3N0YXRlLCAoMSA8PCBwaXBlX251bSkpOworCQljZV9yZWdpc3Rlcl9pcnEoaGlmX3N0YXRlLCAoMSA8PCBwaXBlX251bSkpOworCQlzY24tPnJlcXVlc3RfaXJxX2RvbmUgPSB0cnVlOworCX0KKworCWlmIChhdGhkaWFnX3Byb2Nmc19pbml0KHNjbikgIT0gMCkgeworCQlBX1RBUkdFVF9BQ0NFU1NfVU5MSUtFTFkoc2NuKTsKKwkJZ290byBlcnI7CisJfQorCXNjbi0+YXRoZGlhZ19wcm9jZnNfaW5pdGVkID0gdHJ1ZTsKKworCS8qCisJICogSW5pdGlhbGx5LCBlc3RhYmxpc2ggQ0UgY29tcGxldGlvbiBoYW5kbGVycyBmb3IgdXNlIHdpdGggQk1JLgorCSAqIFRoZXNlIGFyZSBvdmVyd3JpdHRlbiB3aXRoIGdlbmVyaWMgaGFuZGxlcnMgYWZ0ZXIgd2UgZXhpdCBCTUkgcGhhc2UuCisJICovCisJcGlwZV9pbmZvID0gJmhpZl9zdGF0ZS0+cGlwZV9pbmZvW0JNSV9DRV9OVU1fVE9fVEFSR107CisjaWZkZWYgSElGX1BDSQorCWNlX3NlbmRfY2JfcmVnaXN0ZXIoCisJICAgcGlwZV9pbmZvLT5jZV9oZGwsIGhpZl9ibWlfc2VuZF9kb25lLCBwaXBlX2luZm8sIDApOworI2lmbmRlZiBCTUlfUlNQX1BPTExJTkcKKwlwaXBlX2luZm8gPSAmaGlmX3N0YXRlLT5waXBlX2luZm9bQk1JX0NFX05VTV9UT19IT1NUXTsKKwljZV9yZWN2X2NiX3JlZ2lzdGVyKAorCSAgIHBpcGVfaW5mby0+Y2VfaGRsLCBoaWZfYm1pX3JlY3ZfZGF0YSwgcGlwZV9pbmZvLCAwKTsKKyNlbmRpZgorI2VuZGlmCisJSElGX0lORk9fTUVEKCIlczogY2VfaW5pdCBkb25lIiwgX19mdW5jX18pOworCisJcnYgPSBoaWZfc2V0X2hpYShzY24pOworCisJSElGX0lORk9fTUVEKCIlczogaGlmX3NldF9oaWEgZG9uZSIsIF9fZnVuY19fKTsKKworCUFfVEFSR0VUX0FDQ0VTU19VTkxJS0VMWShzY24pOworCisJaWYgKHJ2ICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnI7CisJZWxzZQorCQlpbml0X3Rhc2tsZXRfd29ya2VycygpOworCisJSElGX1RSQUNFKCIlczogWCwgcmV0ID0gJWRcbiIsIF9fZnVuY19fLCBydik7CisKKyNpZmRlZiBBRFJBU1RFQV9TSEFET1dfUkVHSVNURVJTCisJSElGX0VSUk9SKCJVc2luZyBTaGFkb3cgUmVnaXN0ZXJzIGluc3RlYWQgb2YgQ0UgUmVnaXN0ZXJzXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1NIQURPV19SRUdJU1RFUlM7IGkrKykgeworCQlISUZfRVJST1IoIiVzIFNoYWRvdyBSZWdpc3RlciVkIGlzIG1hcHBlZCB0byBhZGRyZXNzICV4XG4iLAorCQkJICBfX2Z1bmNfXywgaSwKKwkJCSAgKEFfVEFSR0VUX1JFQUQoc2NuLCAoU0hBRE9XX0FERFJFU1MoaSkpKSA8PCAyKSk7CisJfQorI2VuZGlmCisKKworCXJldHVybiBydiAhPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKK2VycjoKKwkvKiBGYWlsdXJlLCBzbyBjbGVhbiB1cCAqLworCWZvciAocGlwZV9udW0gPSAwOyBwaXBlX251bSA8IHNjbi0+Y2VfY291bnQ7IHBpcGVfbnVtKyspIHsKKwkJcGlwZV9pbmZvID0gJmhpZl9zdGF0ZS0+cGlwZV9pbmZvW3BpcGVfbnVtXTsKKwkJaWYgKHBpcGVfaW5mby0+Y2VfaGRsKSB7CisJCQljZV91bnJlZ2lzdGVyX2lycShoaWZfc3RhdGUsICgxIDw8IHBpcGVfbnVtKSk7CisJCQlzY24tPnJlcXVlc3RfaXJxX2RvbmUgPSBmYWxzZTsKKwkJCWNlX2ZpbmkocGlwZV9pbmZvLT5jZV9oZGwpOworCQkJcGlwZV9pbmZvLT5jZV9oZGwgPSBOVUxMOworCQkJcGlwZV9pbmZvLT5idWZfc3ogPSAwOworCQl9CisJfQorCWlmIChoaWZfc3RhdGUtPnNsZWVwX3RpbWVyX2luaXQpIHsKKwkJY2RmX3NvZnRpcnFfdGltZXJfY2FuY2VsKCZoaWZfc3RhdGUtPnNsZWVwX3RpbWVyKTsKKwkJY2RmX3NvZnRpcnFfdGltZXJfZnJlZSgmaGlmX3N0YXRlLT5zbGVlcF90aW1lcik7CisJCWhpZl9zdGF0ZS0+c2xlZXBfdGltZXJfaW5pdCA9IGZhbHNlOworCX0KKwlpZiAoc2NuLT5oaWZfaGRsKSB7CisJCXNjbi0+aGlmX2hkbCA9IE5VTEw7CisJCWNkZl9tZW1fZnJlZShoaWZfc3RhdGUpOworCX0KKwlhdGhkaWFnX3Byb2Nmc19yZW1vdmUoKTsKKwlzY24tPmF0aGRpYWdfcHJvY2ZzX2luaXRlZCA9IGZhbHNlOworCUhJRl9UUkFDRSgiJXM6IFgsIHJldCA9ICVkXG4iLCBfX2Z1bmNfXywgcnYpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgIT0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKworCisKKworCisjaWZkZWYgSVBBX09GRkxPQUQKK3ZvaWQgaGlmX2lwYV9nZXRfY2VfcmVzb3VyY2Uoc3RydWN0IG9sX3NvZnRjICpzY24sCisJCQkgICAgIHVpbnQzMl90ICpjZV9zcl9iYXNlX3BhZGRyLAorCQkJICAgICB1aW50MzJfdCAqY2Vfc3JfcmluZ19zaXplLAorCQkJICAgICBjZGZfZG1hX2FkZHJfdCAqY2VfcmVnX3BhZGRyKQoreworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZSA9IChzdHJ1Y3QgSElGX0NFX3N0YXRlICopc2NuLT5oaWZfaGRsOworCXN0cnVjdCBISUZfQ0VfcGlwZV9pbmZvICpwaXBlX2luZm8gPQorCQkmKGhpZl9zdGF0ZS0+cGlwZV9pbmZvW0hJRl9QQ0lfSVBBX1VDX0FTU0lHTkVEX0NFXSk7CisJc3RydWN0IENFX2hhbmRsZSAqY2VfaGRsID0gcGlwZV9pbmZvLT5jZV9oZGw7CisKKwljZV9pcGFfZ2V0X3Jlc291cmNlKGNlX2hkbCwgY2Vfc3JfYmFzZV9wYWRkciwgY2Vfc3JfcmluZ19zaXplLAorCQkJICAgIGNlX3JlZ19wYWRkcik7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCisKKworI2lmZGVmIEFEUkFTVEVBX1NIQURPV19SRUdJU1RFUlMKKworLyoKKwlDdXJyZW50IHNoYWRvdyByZWdpc3RlciBjb25maWcKKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU2hhZG93IFJlZ2lzdGVyICAgICAgfCAgICAgQ0UgICB8ICAgIHNyYy9kc3Qgd3JpdGUgaW5kZXgKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkwICAgICAgICAgICAgfCAgICAgMCAgICB8ICAgICAgICAgICBzcmMKKwkJMSAgICAgTm8gQ29uZmlnIC0gRG9lc24ndCBwb2ludCB0byBhbnl0aGluZworCQkyICAgICBObyBDb25maWcgLSBEb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nCisJCTMgICAgICAgICAgICB8ICAgICAzICAgIHwgICAgICAgICAgIHNyYworCQk0ICAgICAgICAgICAgfCAgICAgNCAgICB8ICAgICAgICAgICBzcmMKKwkJNSAgICAgICAgICAgIHwgICAgIDUgICAgfCAgICAgICAgICAgc3JjCisJCTYgICAgIE5vIENvbmZpZyAtIERvZXNuJ3QgcG9pbnQgdG8gYW55dGhpbmcKKwkJNyAgICAgICAgICAgIHwgICAgIDcgICAgfCAgICAgICAgICAgc3JjCisJCTggICAgIE5vIENvbmZpZyAtIERvZXNuJ3QgcG9pbnQgdG8gYW55dGhpbmcKKwkJOSAgICAgTm8gQ29uZmlnIC0gRG9lc24ndCBwb2ludCB0byBhbnl0aGluZworCQkxMCAgICBObyBDb25maWcgLSBEb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nCisJCTExICAgIE5vIENvbmZpZyAtIERvZXNuJ3QgcG9pbnQgdG8gYW55dGhpbmcKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkxMiAgICBObyBDb25maWcgLSBEb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nCisJCTEzICAgICAgICAgICB8ICAgICAxICAgIHwgICAgICAgICAgIGRzdAorCQkxNCAgICAgICAgICAgfCAgICAgMiAgICB8ICAgICAgICAgICBkc3QKKwkJMTUgICAgTm8gQ29uZmlnIC0gRG9lc24ndCBwb2ludCB0byBhbnl0aGluZworCQkxNiAgICBObyBDb25maWcgLSBEb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nCisJCTE3ICAgIE5vIENvbmZpZyAtIERvZXNuJ3QgcG9pbnQgdG8gYW55dGhpbmcKKwkJMTggICAgTm8gQ29uZmlnIC0gRG9lc24ndCBwb2ludCB0byBhbnl0aGluZworCQkxOSAgICAgICAgICAgfCAgICAgNyAgICB8ICAgICAgICAgICBkc3QKKwkJMjAgICAgICAgICAgIHwgICAgIDggICAgfCAgICAgICAgICAgZHN0CisJCTIxICAgIE5vIENvbmZpZyAtIERvZXNuJ3QgcG9pbnQgdG8gYW55dGhpbmcKKwkJMjIgICAgTm8gQ29uZmlnIC0gRG9lc24ndCBwb2ludCB0byBhbnl0aGluZworCQkyMyAgICBObyBDb25maWcgLSBEb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisJVG9EbyAtIE1vdmUgc2hhZG93IHJlZ2lzdGVyIGNvbmZpZyB0byBmb2xsb3dpbmcgaW4gdGhlIGZ1dHVyZQorCVRoaXMgaGVscHMgZnJlZSB1cCBhIGJsb2NrIG9mIHNoYWRvdyByZWdpc3RlcnMgdG93YXJkcyB0aGUgZW5kLgorCUNhbiBiZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcworCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlTaGFkb3cgUmVnaXN0ZXIgICAgICB8ICAgICBDRSAgIHwgICAgc3JjL2RzdCB3cml0ZSBpbmRleAorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCTAgICAgICAgICAgICB8ICAgICAwICAgIHwgICAgICAgICAgIHNyYworCQkxICAgICAgICAgICAgfCAgICAgMyAgICB8ICAgICAgICAgICBzcmMKKwkJMiAgICAgICAgICAgIHwgICAgIDQgICAgfCAgICAgICAgICAgc3JjCisJCTMgICAgICAgICAgICB8ICAgICA1ICAgIHwgICAgICAgICAgIHNyYworCQk0ICAgICAgICAgICAgfCAgICAgNyAgICB8ICAgICAgICAgICBzcmMKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQk1ICAgICAgICAgICAgfCAgICAgMSAgICB8ICAgICAgICAgICBkc3QKKwkJNiAgICAgICAgICAgIHwgICAgIDIgICAgfCAgICAgICAgICAgZHN0CisJCTcgICAgICAgICAgICB8ICAgICA3ICAgIHwgICAgICAgICAgIGRzdAorCQk4ICAgICAgICAgICAgfCAgICAgOCAgICB8ICAgICAgICAgICBkc3QKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQk5ICAgICBObyBDb25maWcgLSBEb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nCisJCTEyICAgIE5vIENvbmZpZyAtIERvZXNuJ3QgcG9pbnQgdG8gYW55dGhpbmcKKwkJMTMgICAgTm8gQ29uZmlnIC0gRG9lc24ndCBwb2ludCB0byBhbnl0aGluZworCQkxNCAgICBObyBDb25maWcgLSBEb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nCisJCTE1ICAgIE5vIENvbmZpZyAtIERvZXNuJ3QgcG9pbnQgdG8gYW55dGhpbmcKKwkJMTYgICAgTm8gQ29uZmlnIC0gRG9lc24ndCBwb2ludCB0byBhbnl0aGluZworCQkxNyAgICBObyBDb25maWcgLSBEb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nCisJCTE4ICAgIE5vIENvbmZpZyAtIERvZXNuJ3QgcG9pbnQgdG8gYW55dGhpbmcKKwkJMTkgICAgTm8gQ29uZmlnIC0gRG9lc24ndCBwb2ludCB0byBhbnl0aGluZworCQkyMCAgICBObyBDb25maWcgLSBEb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nCisJCTIxICAgIE5vIENvbmZpZyAtIERvZXNuJ3QgcG9pbnQgdG8gYW55dGhpbmcKKwkJMjIgICAgTm8gQ29uZmlnIC0gRG9lc24ndCBwb2ludCB0byBhbnl0aGluZworCQkyMyAgICBObyBDb25maWcgLSBEb2Vzbid0IHBvaW50IHRvIGFueXRoaW5nCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3UzMiBzaGFkb3dfc3Jfd3JfaW5kX2FkZHIoc3RydWN0IG9sX3NvZnRjICpzY24sIHUzMiBjdHJsX2FkZHIpCit7CisJdTMyIGFkZHIgPSAwOworCisJc3dpdGNoIChDT1BZX0VOR0lORV9JRChjdHJsX2FkZHIpKSB7CisJY2FzZSAwOgorCQlhZGRyID0gU0hBRE9XX1ZBTFVFMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlhZGRyID0gU0hBRE9XX1ZBTFVFMzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlhZGRyID0gU0hBRE9XX1ZBTFVFNDsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlhZGRyID0gU0hBRE9XX1ZBTFVFNTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlhZGRyID0gU0hBRE9XX1ZBTFVFNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJpbnZhbGlkIENFIGN0cmxfYWRkclxuIik7CisJCUNERl9BU1NFUlQoMCk7CisKKwl9CisJcmV0dXJuIGFkZHI7CisKK30KKwordTMyIHNoYWRvd19kc3Rfd3JfaW5kX2FkZHIoc3RydWN0IG9sX3NvZnRjICpzY24sIHUzMiBjdHJsX2FkZHIpCit7CisJdTMyIGFkZHIgPSAwOworCisJc3dpdGNoIChDT1BZX0VOR0lORV9JRChjdHJsX2FkZHIpKSB7CisJY2FzZSAxOgorCQlhZGRyID0gU0hBRE9XX1ZBTFVFMTM7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYWRkciA9IFNIQURPV19WQUxVRTE0OworCQlicmVhazsKKwljYXNlIDc6CisJCWFkZHIgPSBTSEFET1dfVkFMVUUxOTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlhZGRyID0gU0hBRE9XX1ZBTFVFMjA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiaW52YWxpZCBDRSBjdHJsX2FkZHJcbiIpOworCQlDREZfQVNTRVJUKDApOworCX0KKworCXJldHVybiBhZGRyOworCit9CisjZW5kaWYKKwordm9pZCBjZV9scm9fZmx1c2hfY2JfcmVnaXN0ZXIoc3RydWN0IG9sX3NvZnRjICpzY24sCisJIHZvaWQgKGhhbmRsZXIpKHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IENFX3N0YXRlICpjZV9zdGF0ZSA9IHNjbi0+Y2VfaWRfdG9fc3RhdGVbQ0VfSFRUX1QySF9NU0ddOworCWNlX3N0YXRlLT5scm9fZmx1c2hfY2IgPSBoYW5kbGVyOworCWNlX3N0YXRlLT5scm9fZGF0YSA9IGRhdGE7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvY2UvY2VfbWFpbi5oIGIvY29yZS9oaWYvc3JjL2NlL2NlX21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzBmZDQxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oaWYvc3JjL2NlL2NlX21haW4uaApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19DRV9IX18KKyNkZWZpbmUgX19DRV9IX18KKworI2luY2x1ZGUgImNkZl9hdG9taWMuaCIKKyNpbmNsdWRlICJjZGZfbG9jay5oIgorI2luY2x1ZGUgImhpZi5oIgorCisjZGVmaW5lIENFX0hUVF9UMkhfTVNHIDEKKyNkZWZpbmUgQ0VfSFRUX0gyVF9NU0cgNAorCisvKioKKyAqIGVudW0gY2VfaWRfdHlwZQorICoKKyAqIEBjZV9pZF90eXBlOiBDb3B5IGVuZ2luZSBJRAorICovCitlbnVtIGNlX2lkX3R5cGUgeworCUNFX0lEXzAsCisJQ0VfSURfMSwKKwlDRV9JRF8yLAorCUNFX0lEXzMsCisJQ0VfSURfNCwKKwlDRV9JRF81LAorCUNFX0lEXzYsCisJQ0VfSURfNywKKwlDRV9JRF84LAorCUNFX0lEXzksCisJQ0VfSURfMTAsCisJQ0VfSURfMTEsCisJQ0VfSURfTUFYCit9Oworc3RydWN0IEhJRl9DRV9jb21wbGV0aW9uX3N0YXRlIHsKKwlzdHJ1Y3QgSElGX0NFX2NvbXBsZXRpb25fc3RhdGUgKm5leHQ7CisJaW50IHNlbmRfb3JfcmVjdjsKKwlzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nOworCXZvaWQgKmNlX2NvbnRleHQ7CisJdm9pZCAqdHJhbnNmZXJfY29udGV4dDsKKwljZGZfZG1hX2FkZHJfdCBkYXRhOworCXVuc2lnbmVkIGludCBuYnl0ZXM7CisJdW5zaWduZWQgaW50IHRyYW5zZmVyX2lkOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1aW50MzJfdCB0b2VwbGl0el9oYXNoX3Jlc3VsdDsKK307CisKKy8qIGNvbXBsX3N0YXRlLnNlbmRfb3JfcmVjdiAqLworI2RlZmluZSBISUZfQ0VfQ09NUExFVEVfRlJFRSAwCisjZGVmaW5lIEhJRl9DRV9DT01QTEVURV9TRU5EIDEKKyNkZWZpbmUgSElGX0NFX0NPTVBMRVRFX1JFQ1YgMgorCitlbnVtIG9sX2F0aF9oaWZfcGt0X2Vjb2RlcyB7CisJSElGX1BJUEVfTk9fUkVTT1VSQ0UgPSAwCit9OworCitzdHJ1Y3QgSElGX0NFX3N0YXRlOworI2RlZmluZSBISUZfQ0VfQ09NUExFVEVfU1RBVEVfTlVNIDE4IC8qIDU2ICogMTggKyA0LzggPSAxMDEyLzEwMTYgYnl0ZXMgKi8KK3N0cnVjdCBISUZfQ0VfY29tcGxldGlvbl9zdGF0ZV9saXN0IHsKKwlzdHJ1Y3QgSElGX0NFX2NvbXBsZXRpb25fc3RhdGVfbGlzdCAqbmV4dDsKK307CisKKy8qIFBlci1waXBlIHN0YXRlLiAqLworc3RydWN0IEhJRl9DRV9waXBlX2luZm8geworCS8qIEhhbmRsZSBvZiB1bmRlcmx5aW5nIENvcHkgRW5naW5lICovCisJc3RydWN0IENFX2hhbmRsZSAqY2VfaGRsOworCisJLyogT3VyIHBpcGUgbnVtYmVyOyBmYWNpbGl0aWF0ZXMgdXNlIG9mIHBpcGVfaW5mbyBwdHJzLiAqLworCXVpbnQ4X3QgcGlwZV9udW07CisKKwkvKiBDb252ZW5pZW5jZSBiYWNrIHBvaW50ZXIgdG8gSElGX0NFX3N0YXRlLiAqLworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKkhJRl9DRV9zdGF0ZTsKKworCS8qIEluc3RhbnRhbmVvdXMgbnVtYmVyIG9mIHJlY2VpdmUgYnVmZmVycyB0aGF0IHNob3VsZCBiZSBwb3N0ZWQgKi8KKwlhdG9taWNfdCByZWN2X2J1ZnNfbmVlZGVkOworCWNkZl9zaXplX3QgYnVmX3N6OworCWNkZl9zcGlubG9ja190IHJlY3ZfYnVmc19uZWVkZWRfbG9jazsKKworCWNkZl9zcGlubG9ja190IGNvbXBsZXRpb25fZnJlZXFfbG9jazsKKwkvKiBMaW1pdCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIHNlbmQgcmVxdWVzdHMuICovCisJaW50IG51bV9zZW5kc19hbGxvd2VkOworCXN0cnVjdCBISUZfQ0VfY29tcGxldGlvbl9zdGF0ZV9saXN0ICpjb21wbGV0aW9uX3NwYWNlX2xpc3Q7CisJc3RydWN0IEhJRl9DRV9jb21wbGV0aW9uX3N0YXRlICpjb21wbGV0aW9uX2ZyZWVxX2hlYWQ7CisJc3RydWN0IEhJRl9DRV9jb21wbGV0aW9uX3N0YXRlICpjb21wbGV0aW9uX2ZyZWVxX3RhaWw7CisJLyogYWRkaW5nIHRocmVlIGNvdW50cyBmb3IgZGVidWdnaW5nIHJpbmcgYnVmZmVyIGVycm9ycyAqLworCXVpbnQzMl90IG5idWZfYWxsb2NfZXJyX2NvdW50OworCXVpbnQzMl90IG5idWZfZG1hX2Vycl9jb3VudDsKKwl1aW50MzJfdCBuYnVmX2NlX2VucXVldWVfZXJyX2NvdW50OworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2VfdGFza2xldF9lbnRyeQorICoKKyAqIEBpbnRyX3RxOiBpbnRyX3RxCisgKiBAY2VfaWQ6IGNlX2lkCisgKiBAaW5pdGVkOiBpbml0ZWQKKyAqIEBoaWZfY2Vfc3RhdGU6IGhpZl9jZV9zdGF0ZQorICogQGZyb21faXJxOiBmcm9tX2lycQorICovCitzdHJ1Y3QgY2VfdGFza2xldF9lbnRyeSB7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGludHJfdHE7CisJZW51bSBjZV9pZF90eXBlIGNlX2lkOworCWJvb2wgaW5pdGVkOworCXZvaWQgKmhpZl9jZV9zdGF0ZTsKKwlib29sIGZyb21faXJxOworfTsKKworc3RydWN0IEhJRl9DRV9zdGF0ZSB7CisJc3RydWN0IG9sX3NvZnRjICpzY247CisJYm9vbCBzdGFydGVkOworCXN0cnVjdCBjZV90YXNrbGV0X2VudHJ5IHRhc2tsZXRzW0NFX0NPVU5UX01BWF07CisJY2RmX3NwaW5sb2NrX3Qga2VlcF9hd2FrZV9sb2NrOworCXVuc2lnbmVkIGludCBrZWVwX2F3YWtlX2NvdW50OworCWJvb2wgdmVyaWZpZWRfYXdha2U7CisJYm9vbCBmYWtlX3NsZWVwOworCWNkZl9zb2Z0aXJxX3RpbWVyX3Qgc2xlZXBfdGltZXI7CisJYm9vbCBzbGVlcF90aW1lcl9pbml0OworCXVuc2lnbmVkIGxvbmcgc2xlZXBfdGlja3M7CisJY2RmX3NwaW5sb2NrX3QgY29tcGxldGlvbl9wZW5kaW5ncV9sb2NrOworCS8qIFF1ZXVlIG9mIHNlbmQvcmVjdiBjb21wbGV0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcHJvY2Vzc2VkICovCisJc3RydWN0IEhJRl9DRV9jb21wbGV0aW9uX3N0YXRlICpjb21wbGV0aW9uX3BlbmRpbmdxX2hlYWQ7CisJc3RydWN0IEhJRl9DRV9jb21wbGV0aW9uX3N0YXRlICpjb21wbGV0aW9uX3BlbmRpbmdxX3RhaWw7CisJYXRvbWljX3QgZndfZXZlbnRfcGVuZGluZzsKKwljZGZfYXRvbWljX3QgaGlmX3RocmVhZF9pZGxlOworCisJLyogd2FpdF9xdWV1ZV9oZWFkX3Qgc2VydmljZV93YWl0cTsgKi8KKwkvKiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvbXBsX3RocmVhZDsgKi8KKwkvKiBzdHJ1Y3QgY29tcGxldGlvbiBjb21wbF90aHJlYWRfZG9uZTsgKi8KKworCS8qIFBlci1waXBlIHN0YXRlLiAqLworCXN0cnVjdCBISUZfQ0VfcGlwZV9pbmZvIHBpcGVfaW5mb1tDRV9DT1VOVF9NQVhdOworCS8qIHRvIGJlIGFjdGl2YXRlZCBhZnRlciBCTUlfRE9ORSAqLworCXN0cnVjdCBoaWZfbXNnX2NhbGxiYWNrcyBtc2dfY2FsbGJhY2tzX3BlbmRpbmc7CisJLyogY3VycmVudCBtc2cgY2FsbGJhY2tzIGluIHVzZSAqLworCXN0cnVjdCBoaWZfbXNnX2NhbGxiYWNrcyBtc2dfY2FsbGJhY2tzX2N1cnJlbnQ7CisKKwl2b2lkICpjbGFpbWVkQ29udGV4dDsKKworCS8qIFRhcmdldCBhZGRyZXNzIHVzZWQgdG8gc2lnbmFsIGEgcGVuZGluZyBmaXJtd2FyZSBldmVudCAqLworCXVpbnQzMl90IGZ3X2luZGljYXRvcl9hZGRyZXNzOworCisJLyogQ29weSBFbmdpbmUgdXNlZCBmb3IgRGlhZ25vc3RpYyBBY2Nlc3NlcyAqLworCXN0cnVjdCBDRV9oYW5kbGUgKmNlX2RpYWc7Cit9OworI2VuZGlmIC8qIF9fQ0VfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvY2UvY2VfcmVnLmggYi9jb3JlL2hpZi9zcmMvY2UvY2VfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3NDM5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9jZS9jZV9yZWcuaApAQCAtMCwwICsxLDQ3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19DRV9SRUdfSF9fCisjZGVmaW5lIF9fQ0VfUkVHX0hfXworCisjZGVmaW5lIERTVF9XUl9JTkRFWF9BRERSRVNTICAgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfRFNUX1dSX0lOREVYX0FERFJFU1MpCisjZGVmaW5lIFNSQ19XQVRFUk1BUktfQUREUkVTUyAgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfU1JDX1dBVEVSTUFSS19BRERSRVNTKQorI2RlZmluZSBTUkNfV0FURVJNQVJLX0xPV19NQVNLICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX1NSQ19XQVRFUk1BUktfTE9XX01BU0spCisjZGVmaW5lIFNSQ19XQVRFUk1BUktfSElHSF9NQVNLIChzY24tPnRhcmdldF9jZV9kZWYtPmRfU1JDX1dBVEVSTUFSS19ISUdIX01BU0spCisjZGVmaW5lIERTVF9XQVRFUk1BUktfTE9XX01BU0sgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfRFNUX1dBVEVSTUFSS19MT1dfTUFTSykKKyNkZWZpbmUgRFNUX1dBVEVSTUFSS19ISUdIX01BU0sgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9EU1RfV0FURVJNQVJLX0hJR0hfTUFTSykKKyNkZWZpbmUgQ1VSUkVOVF9TUlJJX0FERFJFU1MgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DVVJSRU5UX1NSUklfQUREUkVTUykKKyNkZWZpbmUgQ1VSUkVOVF9EUlJJX0FERFJFU1MgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DVVJSRU5UX0RSUklfQUREUkVTUykKKworI2RlZmluZSBTSEFET1dfVkFMVUUwICAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8wKQorI2RlZmluZSBTSEFET1dfVkFMVUUxICAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xKQorI2RlZmluZSBTSEFET1dfVkFMVUUyICAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8yKQorI2RlZmluZSBTSEFET1dfVkFMVUUzICAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8zKQorI2RlZmluZSBTSEFET1dfVkFMVUU0ICAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV80KQorI2RlZmluZSBTSEFET1dfVkFMVUU1ICAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV81KQorI2RlZmluZSBTSEFET1dfVkFMVUU2ICAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV82KQorI2RlZmluZSBTSEFET1dfVkFMVUU3ICAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV83KQorI2RlZmluZSBTSEFET1dfVkFMVUU4ICAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV84KQorI2RlZmluZSBTSEFET1dfVkFMVUU5ICAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV85KQorI2RlZmluZSBTSEFET1dfVkFMVUUxMCAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xMCkKKyNkZWZpbmUgU0hBRE9XX1ZBTFVFMTEgICAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTEpCisjZGVmaW5lIFNIQURPV19WQUxVRTEyICAgICAgICAgIChzY24tPmhvc3Rfc2hhZG93X3JlZ3MtPmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEyKQorI2RlZmluZSBTSEFET1dfVkFMVUUxMyAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xMykKKyNkZWZpbmUgU0hBRE9XX1ZBTFVFMTQgICAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTQpCisjZGVmaW5lIFNIQURPV19WQUxVRTE1ICAgICAgICAgIChzY24tPmhvc3Rfc2hhZG93X3JlZ3MtPmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE1KQorI2RlZmluZSBTSEFET1dfVkFMVUUxNiAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xNikKKyNkZWZpbmUgU0hBRE9XX1ZBTFVFMTcgICAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTcpCisjZGVmaW5lIFNIQURPV19WQUxVRTE4ICAgICAgICAgIChzY24tPmhvc3Rfc2hhZG93X3JlZ3MtPmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE4KQorI2RlZmluZSBTSEFET1dfVkFMVUUxOSAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xOSkKKyNkZWZpbmUgU0hBRE9XX1ZBTFVFMjAgICAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjApCisjZGVmaW5lIFNIQURPV19WQUxVRTIxICAgICAgICAgIChzY24tPmhvc3Rfc2hhZG93X3JlZ3MtPmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIxKQorI2RlZmluZSBTSEFET1dfVkFMVUUyMiAgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8yMikKKyNkZWZpbmUgU0hBRE9XX1ZBTFVFMjMgICAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjMpCisjZGVmaW5lIFNIQURPV19BRERSRVNTMCAgICAgICAgIChzY24tPmhvc3Rfc2hhZG93X3JlZ3MtPmRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMCkKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxICAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xKQorI2RlZmluZSBTSEFET1dfQUREUkVTUzIgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzIpCisjZGVmaW5lIFNIQURPV19BRERSRVNTMyAgICAgICAgIChzY24tPmhvc3Rfc2hhZG93X3JlZ3MtPmRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfMykKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1M0ICAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU180KQorI2RlZmluZSBTSEFET1dfQUREUkVTUzUgICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzUpCisjZGVmaW5lIFNIQURPV19BRERSRVNTNiAgICAgICAgIChzY24tPmhvc3Rfc2hhZG93X3JlZ3MtPmRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfNikKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1M3ICAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU183KQorI2RlZmluZSBTSEFET1dfQUREUkVTUzggICAgICAgICAoc2NuLT5ob3N0X3NoYWRvd19yZWdzLT5kX0FfTE9DQUxfU0hBRE9XX1JFR19BRERSRVNTXzgpCisjZGVmaW5lIFNIQURPV19BRERSRVNTOSAgICAgICAgIChzY24tPmhvc3Rfc2hhZG93X3JlZ3MtPmRfQV9MT0NBTF9TSEFET1dfUkVHX0FERFJFU1NfOSkKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxMCAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xMCkKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxMSAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xMSkKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxMiAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xMikKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxMyAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xMykKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxNCAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xNCkKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxNSAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xNSkKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxNiAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xNikKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxNyAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xNykKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxOCAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xOCkKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MxOSAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18xOSkKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MyMCAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18yMCkKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MyMSAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18yMSkKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MyMiAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18yMikKKyNkZWZpbmUgU0hBRE9XX0FERFJFU1MyMyAgICAgICAgKHNjbi0+aG9zdF9zaGFkb3dfcmVncy0+ZF9BX0xPQ0FMX1NIQURPV19SRUdfQUREUkVTU18yMykKKworI2RlZmluZSBTSEFET1dfQUREUkVTUyhpKSAoU0hBRE9XX0FERFJFU1MwICsgaSooU0hBRE9XX0FERFJFU1MxLVNIQURPV19BRERSRVNTMCkpCisKKyNkZWZpbmUgSE9TVF9JU19TUkNfUklOR19ISUdIX1dBVEVSTUFSS19NQVNLIFwKKwkoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0hPU1RfSVNfU1JDX1JJTkdfSElHSF9XQVRFUk1BUktfTUFTSykKKyNkZWZpbmUgSE9TVF9JU19TUkNfUklOR19MT1dfV0FURVJNQVJLX01BU0sgXAorCShzY24tPnRhcmdldF9jZV9kZWYtPmRfSE9TVF9JU19TUkNfUklOR19MT1dfV0FURVJNQVJLX01BU0spCisjZGVmaW5lIEhPU1RfSVNfRFNUX1JJTkdfSElHSF9XQVRFUk1BUktfTUFTSyBcCisJKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9IT1NUX0lTX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX01BU0spCisjZGVmaW5lIEhPU1RfSVNfRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLIFwKKwkoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0hPU1RfSVNfRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLKQorI2RlZmluZSBNSVNDX0lTX0FERFJFU1MgICAgICAgICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX01JU0NfSVNfQUREUkVTUykKKyNkZWZpbmUgSE9TVF9JU19DT1BZX0NPTVBMRVRFX01BU0sgXAorCShzY24tPnRhcmdldF9jZV9kZWYtPmRfSE9TVF9JU19DT1BZX0NPTVBMRVRFX01BU0spCisjZGVmaW5lIENFX1dSQVBQRVJfQkFTRV9BRERSRVNTIChzY24tPnRhcmdldF9jZV9kZWYtPmRfQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MpCisjZGVmaW5lIENFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfQUREUkVTUyBcCisJKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0FERFJFU1MpCisjZGVmaW5lIENFX1dSQVBQRVJfSU5ERVhfQkFTRV9MT1cgXAorCShzY24tPnRhcmdldF9jZV9kZWYtPmRfQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0xPVykKKyNkZWZpbmUgQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0hJR0ggXAorCShzY24tPnRhcmdldF9jZV9kZWYtPmRfQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0hJR0gpCisjZGVmaW5lIEhPU1RfSUVfQ09QWV9DT01QTEVURV9NQVNLIFwKKwkoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0hPU1RfSUVfQ09QWV9DT01QTEVURV9NQVNLKQorI2RlZmluZSBTUl9CQV9BRERSRVNTICAgICAgICAgICAgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfU1JfQkFfQUREUkVTUykKKyNkZWZpbmUgU1JfQkFfQUREUkVTU19ISUdIICAgICAgICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX1NSX0JBX0FERFJFU1NfSElHSCkKKyNkZWZpbmUgU1JfU0laRV9BRERSRVNTICAgICAgICAgICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX1NSX1NJWkVfQUREUkVTUykKKyNkZWZpbmUgQ0VfQ1RSTDFfQUREUkVTUyAgICAgICAgICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0NFX0NUUkwxX0FERFJFU1MpCisjZGVmaW5lIENFX0NUUkwxX0RNQVhfTEVOR1RIX01BU0sgXAorCShzY24tPnRhcmdldF9jZV9kZWYtPmRfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTUFTSykKKyNkZWZpbmUgRFJfQkFfQUREUkVTUyAgICAgICAgICAgICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0RSX0JBX0FERFJFU1MpCisjZGVmaW5lIERSX0JBX0FERFJFU1NfSElHSCAgICAgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9EUl9CQV9BRERSRVNTX0hJR0gpCisjZGVmaW5lIERSX1NJWkVfQUREUkVTUyAgICAgICAgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9EUl9TSVpFX0FERFJFU1MpCisjZGVmaW5lIENFX0NNRF9SRUdJU1RFUiAgICAgICAgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRV9DTURfUkVHSVNURVIpCisjZGVmaW5lIENFX01TSV9BRERSRVNTICAgICAgICAgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRV9NU0lfQUREUkVTUykKKyNkZWZpbmUgQ0VfTVNJX0FERFJFU1NfSElHSCAgICAgICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0NFX01TSV9BRERSRVNTX0hJR0gpCisjZGVmaW5lIENFX01TSV9EQVRBICAgICAgICAgICAgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRV9NU0lfREFUQSkKKyNkZWZpbmUgQ0VfTVNJX0VOQUJMRV9CSVQgICAgICAgICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0NFX01TSV9FTkFCTEVfQklUKQorI2RlZmluZSBNSVNDX0lFX0FERFJFU1MgICAgICAgICAgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfTUlTQ19JRV9BRERSRVNTKQorI2RlZmluZSBNSVNDX0lTX0FYSV9FUlJfTUFTSyAgICAgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfTUlTQ19JU19BWElfRVJSX01BU0spCisjZGVmaW5lIE1JU0NfSVNfRFNUX0FERFJfRVJSX01BU0sgXAorCShzY24tPnRhcmdldF9jZV9kZWYtPmRfTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSykKKyNkZWZpbmUgTUlTQ19JU19TUkNfTEVOX0VSUl9NQVNLIFwKKwkoc2NuLT50YXJnZXRfY2VfZGVmLT5kX01JU0NfSVNfU1JDX0xFTl9FUlJfTUFTSykKKyNkZWZpbmUgTUlTQ19JU19EU1RfTUFYX0xFTl9WSU9fTUFTSyBcCisJKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9NSVNDX0lTX0RTVF9NQVhfTEVOX1ZJT19NQVNLKQorI2RlZmluZSBNSVNDX0lTX0RTVF9SSU5HX09WRVJGTE9XX01BU0sgXAorCShzY24tPnRhcmdldF9jZV9kZWYtPmRfTUlTQ19JU19EU1RfUklOR19PVkVSRkxPV19NQVNLKQorI2RlZmluZSBNSVNDX0lTX1NSQ19SSU5HX09WRVJGTE9XX01BU0sgXAorCShzY24tPnRhcmdldF9jZV9kZWYtPmRfTUlTQ19JU19TUkNfUklOR19PVkVSRkxPV19NQVNLKQorI2RlZmluZSBTUkNfV0FURVJNQVJLX0xPV19MU0IgICAgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfU1JDX1dBVEVSTUFSS19MT1dfTFNCKQorI2RlZmluZSBTUkNfV0FURVJNQVJLX0hJR0hfTFNCICAgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfU1JDX1dBVEVSTUFSS19ISUdIX0xTQikKKyNkZWZpbmUgRFNUX1dBVEVSTUFSS19MT1dfTFNCICAgICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0RTVF9XQVRFUk1BUktfTE9XX0xTQikKKyNkZWZpbmUgRFNUX1dBVEVSTUFSS19ISUdIX0xTQiAgICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0RTVF9XQVRFUk1BUktfSElHSF9MU0IpCisjZGVmaW5lIENFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTUFTSyBcCisJKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX01BU0spCisjZGVmaW5lIENFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTFNCICBcCisJKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX0xTQikKKyNkZWZpbmUgQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTFNCICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0NFX0NUUkwxX0RNQVhfTEVOR1RIX0xTQikKKyNkZWZpbmUgQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0sgXAorCShzY24tPnRhcmdldF9jZV9kZWYtPmRfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0spCisjZGVmaW5lIENFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9NQVNLIFwKKwkoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9NQVNLKQorI2RlZmluZSBDRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTFNCIFwKKwkoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9MU0IpCisjZGVmaW5lIENFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9MU0IgXAorCShzY24tPnRhcmdldF9jZV9kZWYtPmRfQ0VfQ1RSTDFfRFNUX1JJTkdfQllURV9TV0FQX0VOX0xTQikKKyNkZWZpbmUgV0xBTl9ERUJVR19JTlBVVF9TRUxfT0ZGU0VUIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9ERUJVR19JTlBVVF9TRUxfT0ZGU0VUKQorI2RlZmluZSBXTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTVNCIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01TQikKKyNkZWZpbmUgV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX0xTQiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19MU0IpCisjZGVmaW5lIFdMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01BU0spCisjZGVmaW5lIFdMQU5fREVCVUdfQ09OVFJPTF9PRkZTRVQgIChzY24tPnRhcmdldGRlZi0+ZF9XTEFOX0RFQlVHX0NPTlRST0xfT0ZGU0VUKQorI2RlZmluZSBXTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01TQiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTVNCKQorI2RlZmluZSBXTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX0xTQiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTFNCKQorI2RlZmluZSBXTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01BU0sgXAorCShzY24tPnRhcmdldGRlZi0+ZF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01BU0spCisjZGVmaW5lIFdMQU5fREVCVUdfT1VUX09GRlNFVCAgICAoc2NuLT50YXJnZXRkZWYtPmRfV0xBTl9ERUJVR19PVVRfT0ZGU0VUKQorI2RlZmluZSBXTEFOX0RFQlVHX09VVF9EQVRBX01TQiAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fREVCVUdfT1VUX0RBVEFfTVNCKQorI2RlZmluZSBXTEFOX0RFQlVHX09VVF9EQVRBX0xTQiAgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fREVCVUdfT1VUX0RBVEFfTFNCKQorI2RlZmluZSBXTEFOX0RFQlVHX09VVF9EQVRBX01BU0sgKHNjbi0+dGFyZ2V0ZGVmLT5kX1dMQU5fREVCVUdfT1VUX0RBVEFfTUFTSykKKyNkZWZpbmUgQU1CQV9ERUJVR19CVVNfT0ZGU0VUICAgIChzY24tPnRhcmdldGRlZi0+ZF9BTUJBX0RFQlVHX0JVU19PRkZTRVQpCisjZGVmaW5lIEFNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX01TQiBcCisJKHNjbi0+dGFyZ2V0ZGVmLT5kX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX01TQikKKyNkZWZpbmUgQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTFNCIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTFNCKQorI2RlZmluZSBBTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NQVNLIFwKKwkoc2NuLT50YXJnZXRkZWYtPmRfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTUFTSykKKyNkZWZpbmUgQU1CQV9ERUJVR19CVVNfU0VMX01TQiAgICAoc2NuLT50YXJnZXRkZWYtPmRfQU1CQV9ERUJVR19CVVNfU0VMX01TQikKKyNkZWZpbmUgQU1CQV9ERUJVR19CVVNfU0VMX0xTQiAgICAoc2NuLT50YXJnZXRkZWYtPmRfQU1CQV9ERUJVR19CVVNfU0VMX0xTQikKKyNkZWZpbmUgQU1CQV9ERUJVR19CVVNfU0VMX01BU0sgICAoc2NuLT50YXJnZXRkZWYtPmRfQU1CQV9ERUJVR19CVVNfU0VMX01BU0spCisjZGVmaW5lIENFX1dSQVBQRVJfREVCVUdfT0ZGU0VUICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRV9XUkFQUEVSX0RFQlVHX09GRlNFVCkKKyNkZWZpbmUgQ0VfV1JBUFBFUl9ERUJVR19TRUxfTVNCICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0NFX1dSQVBQRVJfREVCVUdfU0VMX01TQikKKyNkZWZpbmUgQ0VfV1JBUFBFUl9ERUJVR19TRUxfTFNCICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0NFX1dSQVBQRVJfREVCVUdfU0VMX0xTQikKKyNkZWZpbmUgQ0VfV1JBUFBFUl9ERUJVR19TRUxfTUFTSyAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0NFX1dSQVBQRVJfREVCVUdfU0VMX01BU0spCisjZGVmaW5lIENFX0RFQlVHX09GRlNFVCAgICAgICAgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRV9ERUJVR19PRkZTRVQpCisjZGVmaW5lIENFX0RFQlVHX1NFTF9NU0IgICAgICAgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRV9ERUJVR19TRUxfTVNCKQorI2RlZmluZSBDRV9ERUJVR19TRUxfTFNCICAgICAgICAgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfQ0VfREVCVUdfU0VMX0xTQikKKyNkZWZpbmUgQ0VfREVCVUdfU0VMX01BU0sgICAgICAgICAoc2NuLT50YXJnZXRfY2VfZGVmLT5kX0NFX0RFQlVHX1NFTF9NQVNLKQorI2RlZmluZSBIT1NUX0lFX0FERFJFU1MgICAgICAgICAgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfSE9TVF9JRV9BRERSRVNTKQorI2RlZmluZSBIT1NUX0lTX0FERFJFU1MgICAgICAgICAgIChzY24tPnRhcmdldF9jZV9kZWYtPmRfSE9TVF9JU19BRERSRVNTKQorCisjZGVmaW5lIFNSQ19XQVRFUk1BUktfTE9XX1NFVCh4KSBcCisJKCgoeCkgPDwgU1JDX1dBVEVSTUFSS19MT1dfTFNCKSAmIFNSQ19XQVRFUk1BUktfTE9XX01BU0spCisjZGVmaW5lIFNSQ19XQVRFUk1BUktfSElHSF9TRVQoeCkgXAorCSgoKHgpIDw8IFNSQ19XQVRFUk1BUktfSElHSF9MU0IpICYgU1JDX1dBVEVSTUFSS19ISUdIX01BU0spCisjZGVmaW5lIERTVF9XQVRFUk1BUktfTE9XX1NFVCh4KSBcCisJKCgoeCkgPDwgRFNUX1dBVEVSTUFSS19MT1dfTFNCKSAmIERTVF9XQVRFUk1BUktfTE9XX01BU0spCisjZGVmaW5lIERTVF9XQVRFUk1BUktfSElHSF9TRVQoeCkgXAorCSgoKHgpIDw8IERTVF9XQVRFUk1BUktfSElHSF9MU0IpICYgRFNUX1dBVEVSTUFSS19ISUdIX01BU0spCisjZGVmaW5lIENFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfR0VUKHgpIFwKKwkoKCh4KSAmIENFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTUFTSykgPj4gXAorCQlDRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX0xTQikKKyNkZWZpbmUgQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfU0VUKHgpIFwKKwkoKCh4KSA8PCBDRV9DVFJMMV9ETUFYX0xFTkdUSF9MU0IpICYgQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTUFTSykKKyNkZWZpbmUgQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX1NFVCh4KSBcCisJKCgoeCkgPDwgQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX0xTQikgJiBcCisJCUNFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9NQVNLKQorI2RlZmluZSBDRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fU0VUKHgpIFwKKwkoKCh4KSA8PCBDRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTFNCKSAmIFwKKwkJQ0VfQ1RSTDFfRFNUX1JJTkdfQllURV9TV0FQX0VOX01BU0spCisjZGVmaW5lIFdMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19HRVQoeCkgXAorCSgoKHgpICYgV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01BU0spID4+IFwKKwkJV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX0xTQikKKyNkZWZpbmUgV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX1NFVCh4KSBcCisJKCgoeCkgPDwgV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX0xTQikgJiBcCisJCVdMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NQVNLKQorI2RlZmluZSBXTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX0dFVCh4KSBcCisJKCgoeCkgJiBXTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01BU0spID4+IFwKKwkJV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9MU0IpCisjZGVmaW5lIFdMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfU0VUKHgpIFwKKwkoKCh4KSA8PCBXTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX0xTQikgJiBcCisJCVdMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTUFTSykKKyNkZWZpbmUgV0xBTl9ERUJVR19PVVRfREFUQV9HRVQoeCkgXAorCSgoKHgpICYgV0xBTl9ERUJVR19PVVRfREFUQV9NQVNLKSA+PiBXTEFOX0RFQlVHX09VVF9EQVRBX0xTQikKKyNkZWZpbmUgV0xBTl9ERUJVR19PVVRfREFUQV9TRVQoeCkgXAorCSgoKHgpIDw8IFdMQU5fREVCVUdfT1VUX0RBVEFfTFNCKSAmIFdMQU5fREVCVUdfT1VUX0RBVEFfTUFTSykKKyNkZWZpbmUgQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfR0VUKHgpIFwKKwkoKCh4KSAmIEFNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX01BU0spID4+IFwKKwkJQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTFNCKQorI2RlZmluZSBBTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9TRVQoeCkgXAorCSgoKHgpIDw8IEFNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX0xTQikgJiBcCisJCUFNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX01BU0spCisjZGVmaW5lIEFNQkFfREVCVUdfQlVTX1NFTF9HRVQoeCkgXAorCSgoKHgpICYgQU1CQV9ERUJVR19CVVNfU0VMX01BU0spID4+IEFNQkFfREVCVUdfQlVTX1NFTF9MU0IpCisjZGVmaW5lIEFNQkFfREVCVUdfQlVTX1NFTF9TRVQoeCkgXAorCSgoKHgpIDw8IEFNQkFfREVCVUdfQlVTX1NFTF9MU0IpICYgQU1CQV9ERUJVR19CVVNfU0VMX01BU0spCisjZGVmaW5lIENFX1dSQVBQRVJfREVCVUdfU0VMX0dFVCh4KSBcCisJKCgoeCkgJiBDRV9XUkFQUEVSX0RFQlVHX1NFTF9NQVNLKSA+PiBDRV9XUkFQUEVSX0RFQlVHX1NFTF9MU0IpCisjZGVmaW5lIENFX1dSQVBQRVJfREVCVUdfU0VMX1NFVCh4KSBcCisJKCgoeCkgPDwgQ0VfV1JBUFBFUl9ERUJVR19TRUxfTFNCKSAmIENFX1dSQVBQRVJfREVCVUdfU0VMX01BU0spCisjZGVmaW5lIENFX0RFQlVHX1NFTF9HRVQoeCkgKCgoeCkgJiBDRV9ERUJVR19TRUxfTUFTSykgPj4gQ0VfREVCVUdfU0VMX0xTQikKKyNkZWZpbmUgQ0VfREVCVUdfU0VMX1NFVCh4KSAoKCh4KSA8PCBDRV9ERUJVR19TRUxfTFNCKSAmIENFX0RFQlVHX1NFTF9NQVNLKQorCisjZGVmaW5lIENFX1NSQ19SSU5HX1JFQURfSURYX0dFVChzY24sIENFX2N0cmxfYWRkcikgXAorCUFfVEFSR0VUX1JFQUQoc2NuLCAoQ0VfY3RybF9hZGRyKSArIENVUlJFTlRfU1JSSV9BRERSRVNTKQorCisjZGVmaW5lIENFX1NSQ19SSU5HX0JBU0VfQUREUl9TRVQoc2NuLCBDRV9jdHJsX2FkZHIsIGFkZHIpIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgU1JfQkFfQUREUkVTUywgKGFkZHIpKQorCisjZGVmaW5lIENFX1NSQ19SSU5HX0JBU0VfQUREUl9ISUdIX1NFVChzY24sIENFX2N0cmxfYWRkciwgYWRkcikgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgKENFX2N0cmxfYWRkcikgKyBTUl9CQV9BRERSRVNTX0hJR0gsIChhZGRyKSkKKworI2RlZmluZSBDRV9TUkNfUklOR19CQVNFX0FERFJfSElHSF9HRVQoc2NuLCBDRV9jdHJsX2FkZHIpIFwKKwlBX1RBUkdFVF9SRUFEKHNjbiwgKENFX2N0cmxfYWRkcikgKyBTUl9CQV9BRERSRVNTX0hJR0gpCisKKyNkZWZpbmUgQ0VfU1JDX1JJTkdfU1pfU0VUKHNjbiwgQ0VfY3RybF9hZGRyLCBuKSBcCisJQV9UQVJHRVRfV1JJVEUoc2NuLCAoQ0VfY3RybF9hZGRyKSArIFNSX1NJWkVfQUREUkVTUywgKG4pKQorCisjZGVmaW5lIENFX1NSQ19SSU5HX0RNQVhfU0VUKHNjbiwgQ0VfY3RybF9hZGRyLCBuKSBcCisJQV9UQVJHRVRfV1JJVEUoc2NuLCAoQ0VfY3RybF9hZGRyKSArIENFX0NUUkwxX0FERFJFU1MsIFwKKwkgICAoQV9UQVJHRVRfUkVBRChzY24sIChDRV9jdHJsX2FkZHIpICsgXAorCSAgIENFX0NUUkwxX0FERFJFU1MpICYgfkNFX0NUUkwxX0RNQVhfTEVOR1RIX01BU0spIHwgXAorCSAgIENFX0NUUkwxX0RNQVhfTEVOR1RIX1NFVChuKSkKKworI2RlZmluZSBDRV9DTURfUkVHSVNURVJfR0VUKHNjbiwgQ0VfY3RybF9hZGRyKSBcCisJQV9UQVJHRVRfUkVBRChzY24sIChDRV9jdHJsX2FkZHIpICsgQ0VfQ01EX1JFR0lTVEVSKQorCisjZGVmaW5lIENFX0NNRF9SRUdJU1RFUl9TRVQoc2NuLCBDRV9jdHJsX2FkZHIsIG4pIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgQ0VfQ01EX1JFR0lTVEVSLCBuKQorCisjZGVmaW5lIENFX01TSV9BRERSX0xPV19TRVQoc2NuLCBDRV9jdHJsX2FkZHIsIGFkZHIpIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgQ0VfTVNJX0FERFJFU1MsIChhZGRyKSkKKworI2RlZmluZSBDRV9NU0lfQUREUl9ISUdIX1NFVChzY24sIENFX2N0cmxfYWRkciwgYWRkcikgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgKENFX2N0cmxfYWRkcikgKyBDRV9NU0lfQUREUkVTU19ISUdILCAoYWRkcikpCisKKyNkZWZpbmUgQ0VfTVNJX0RBVEFfU0VUKHNjbiwgQ0VfY3RybF9hZGRyLCBkYXRhKSBcCisJQV9UQVJHRVRfV1JJVEUoc2NuLCAoQ0VfY3RybF9hZGRyKSArIENFX01TSV9EQVRBLCAoZGF0YSkpCisKKyNkZWZpbmUgQ0VfQ1RSTF9SRUdJU1RFUjFfU0VUKHNjbiwgQ0VfY3RybF9hZGRyLCB2YWwpIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgQ0VfQ1RSTDFfQUREUkVTUywgdmFsKQorCisjZGVmaW5lIENFX0NUUkxfUkVHSVNURVIxX0dFVChzY24sIENFX2N0cmxfYWRkcikgXAorCUFfVEFSR0VUX1JFQUQoc2NuLCAoQ0VfY3RybF9hZGRyKSArIENFX0NUUkwxX0FERFJFU1MpCisKKyNkZWZpbmUgQ0VfU1JDX1JJTkdfQllURV9TV0FQX1NFVChzY24sIENFX2N0cmxfYWRkciwgbikgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgKENFX2N0cmxfYWRkcikgKyBDRV9DVFJMMV9BRERSRVNTLCBcCisJCSAgICAgICAoQV9UQVJHRVRfUkVBRCgodGFyZ2lkKSwgXAorCQkgICAgICAgKENFX2N0cmxfYWRkcikgKyBDRV9DVFJMMV9BRERSRVNTKSBcCisJCSAgICAgICAmIH5DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTUFTSykgfCBcCisJCSAgICAgICBDRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fU0VUKG4pKQorCisjZGVmaW5lIENFX0RFU1RfUklOR19CWVRFX1NXQVBfU0VUKHNjbiwgQ0VfY3RybF9hZGRyLCBuKSBcCisJQV9UQVJHRVRfV1JJVEUoc2NuLCAoQ0VfY3RybF9hZGRyKStDRV9DVFJMMV9BRERSRVNTLCBcCisJCSAgICAgICAoQV9UQVJHRVRfUkVBRCgodGFyZ2lkKSwgXAorCQkgICAgICAgKENFX2N0cmxfYWRkcikgKyBDRV9DVFJMMV9BRERSRVNTKSBcCisJCSAgICAgICAmIH5DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTUFTSykgfCBcCisJCSAgICAgICBDRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fU0VUKG4pKQorCisjZGVmaW5lIENFX0RFU1RfUklOR19SRUFEX0lEWF9HRVQoc2NuLCBDRV9jdHJsX2FkZHIpCVwKKwlBX1RBUkdFVF9SRUFEKHNjbiwgKENFX2N0cmxfYWRkcikgKyBDVVJSRU5UX0RSUklfQUREUkVTUykKKworI2RlZmluZSBDRV9ERVNUX1JJTkdfQkFTRV9BRERSX1NFVChzY24sIENFX2N0cmxfYWRkciwgYWRkcikgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgKENFX2N0cmxfYWRkcikgKyBEUl9CQV9BRERSRVNTLCAoYWRkcikpCisKKyNkZWZpbmUgQ0VfREVTVF9SSU5HX0JBU0VfQUREUl9ISUdIX1NFVChzY24sIENFX2N0cmxfYWRkciwgYWRkcikgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgKENFX2N0cmxfYWRkcikgKyBEUl9CQV9BRERSRVNTX0hJR0gsIChhZGRyKSkKKworI2RlZmluZSBDRV9ERVNUX1JJTkdfQkFTRV9BRERSX0hJR0hfR0VUKHNjbiwgQ0VfY3RybF9hZGRyKSBcCisJQV9UQVJHRVRfUkVBRChzY24sIChDRV9jdHJsX2FkZHIpICsgRFJfQkFfQUREUkVTU19ISUdIKQorCisjZGVmaW5lIENFX0RFU1RfUklOR19TWl9TRVQoc2NuLCBDRV9jdHJsX2FkZHIsIG4pIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgRFJfU0laRV9BRERSRVNTLCAobikpCisKKyNkZWZpbmUgQ0VfU1JDX1JJTkdfSElHSE1BUktfU0VUKHNjbiwgQ0VfY3RybF9hZGRyLCBuKSBcCisJQV9UQVJHRVRfV1JJVEUoc2NuLCAoQ0VfY3RybF9hZGRyKSArIFNSQ19XQVRFUk1BUktfQUREUkVTUywgXAorCQkgICAgICAgKEFfVEFSR0VUX1JFQUQoc2NuLCBcCisJCSAgICAgICAoQ0VfY3RybF9hZGRyKSArIFNSQ19XQVRFUk1BUktfQUREUkVTUykgXAorCQkgICAgICAgJiB+U1JDX1dBVEVSTUFSS19ISUdIX01BU0spIHwgXAorCQkgICAgICAgU1JDX1dBVEVSTUFSS19ISUdIX1NFVChuKSkKKworI2RlZmluZSBDRV9TUkNfUklOR19MT1dNQVJLX1NFVChzY24sIENFX2N0cmxfYWRkciwgbikgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgKENFX2N0cmxfYWRkcikgKyBTUkNfV0FURVJNQVJLX0FERFJFU1MsIFwKKwkJICAgICAgIChBX1RBUkdFVF9SRUFEKHNjbiwgXAorCQkgICAgICAgKENFX2N0cmxfYWRkcikgKyBTUkNfV0FURVJNQVJLX0FERFJFU1MpIFwKKwkJICAgICAgICYgflNSQ19XQVRFUk1BUktfTE9XX01BU0spIHwgXAorCQkgICAgICAgU1JDX1dBVEVSTUFSS19MT1dfU0VUKG4pKQorCisjZGVmaW5lIENFX0RFU1RfUklOR19ISUdITUFSS19TRVQoc2NuLCBDRV9jdHJsX2FkZHIsIG4pIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgRFNUX1dBVEVSTUFSS19BRERSRVNTLCBcCisJCSAgICAgICAoQV9UQVJHRVRfUkVBRChzY24sIFwKKwkJICAgICAgIChDRV9jdHJsX2FkZHIpICsgRFNUX1dBVEVSTUFSS19BRERSRVNTKSBcCisJCSAgICAgICAmIH5EU1RfV0FURVJNQVJLX0hJR0hfTUFTSykgfCBcCisJCSAgICAgICBEU1RfV0FURVJNQVJLX0hJR0hfU0VUKG4pKQorCisjZGVmaW5lIENFX0RFU1RfUklOR19MT1dNQVJLX1NFVChzY24sIENFX2N0cmxfYWRkciwgbikgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgKENFX2N0cmxfYWRkcikgKyBEU1RfV0FURVJNQVJLX0FERFJFU1MsIFwKKwkJICAgICAgIChBX1RBUkdFVF9SRUFEKHNjbiwgXAorCQkgICAgICAgKENFX2N0cmxfYWRkcikgKyBEU1RfV0FURVJNQVJLX0FERFJFU1MpIFwKKwkJICAgICAgICYgfkRTVF9XQVRFUk1BUktfTE9XX01BU0spIHwgXAorCQkgICAgICAgRFNUX1dBVEVSTUFSS19MT1dfU0VUKG4pKQorCisjZGVmaW5lIENFX0NPUFlfQ09NUExFVEVfSU5UUl9FTkFCTEUoc2NuLCBDRV9jdHJsX2FkZHIpIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgSE9TVF9JRV9BRERSRVNTLCBcCisJCSAgICAgICBBX1RBUkdFVF9SRUFEKHNjbiwgXAorCQkgICAgICAgKENFX2N0cmxfYWRkcikgKyBIT1NUX0lFX0FERFJFU1MpIHwgXAorCQkgICAgICAgSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0spCisKKyNkZWZpbmUgQ0VfQ09QWV9DT01QTEVURV9JTlRSX0RJU0FCTEUoc2NuLCBDRV9jdHJsX2FkZHIpIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgSE9TVF9JRV9BRERSRVNTLCBcCisJCSAgICAgICBBX1RBUkdFVF9SRUFEKHNjbiwgXAorCQkgICAgICAgKENFX2N0cmxfYWRkcikgKyBIT1NUX0lFX0FERFJFU1MpIFwKKwkJICAgICAgICYgfkhPU1RfSUVfQ09QWV9DT01QTEVURV9NQVNLKQorCisjZGVmaW5lIENFX0JBU0VfQUREUkVTUyhDRV9pZCkgXAorCUNFMF9CQVNFX0FERFJFU1MgKyAoKENFMV9CQVNFX0FERFJFU1MgLSBcCisJQ0UwX0JBU0VfQUREUkVTUykqKENFX2lkKSkKKworI2RlZmluZSBDRV9XQVRFUk1BUktfSU5UUl9FTkFCTEUoc2NuLCBDRV9jdHJsX2FkZHIpIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgSE9TVF9JRV9BRERSRVNTLCBcCisJCSAgICAgICBBX1RBUkdFVF9SRUFEKHNjbiwgXAorCQkgICAgICAgKENFX2N0cmxfYWRkcikgKyBIT1NUX0lFX0FERFJFU1MpIHwgXAorCQkgICAgICAgQ0VfV0FURVJNQVJLX01BU0spCisKKyNkZWZpbmUgQ0VfV0FURVJNQVJLX0lOVFJfRElTQUJMRShzY24sIENFX2N0cmxfYWRkcikJXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgKENFX2N0cmxfYWRkcikgKyBIT1NUX0lFX0FERFJFU1MsIFwKKwkJICAgICAgIEFfVEFSR0VUX1JFQUQoc2NuLCBcCisJCSAgICAgICAoQ0VfY3RybF9hZGRyKSArIEhPU1RfSUVfQUREUkVTUykgXAorCQkgICAgICAgJiB+Q0VfV0FURVJNQVJLX01BU0spCisKKyNkZWZpbmUgQ0VfRVJST1JfSU5UUl9FTkFCTEUoc2NuLCBDRV9jdHJsX2FkZHIpIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgTUlTQ19JRV9BRERSRVNTLCBcCisJCSAgICAgICBBX1RBUkdFVF9SRUFEKHNjbiwgXAorCQkgICAgICAgKENFX2N0cmxfYWRkcikgKyBNSVNDX0lFX0FERFJFU1MpIHwgQ0VfRVJST1JfTUFTSykKKworI2RlZmluZSBDRV9NSVNDX0lOVF9TVEFUVVNfR0VUKHNjbiwgQ0VfY3RybF9hZGRyKSBcCisJQV9UQVJHRVRfUkVBRChzY24sIChDRV9jdHJsX2FkZHIpICsgTUlTQ19JU19BRERSRVNTKQorCisjZGVmaW5lIENFX0VOR0lORV9JTlRfU1RBVFVTX0dFVChzY24sIENFX2N0cmxfYWRkcikgXAorCUFfVEFSR0VUX1JFQUQoc2NuLCAoQ0VfY3RybF9hZGRyKSArIEhPU1RfSVNfQUREUkVTUykKKworI2RlZmluZSBDRV9FTkdJTkVfSU5UX1NUQVRVU19DTEVBUihzY24sIENFX2N0cmxfYWRkciwgbWFzaykgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgKENFX2N0cmxfYWRkcikgKyBIT1NUX0lTX0FERFJFU1MsIChtYXNrKSkKKworI2RlZmluZSBDRV9XUkFQUEVSX0lOREVYX0JBU0VfTE9XX1NFVChzY24sIG4pIFwKKwlBX1RBUkdFVF9XUklURShzY24sIFwKKwkgICBDRV9XUkFQUEVSX0lOREVYX0JBU0VfTE9XICsgQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MsIG4pCisKKyNkZWZpbmUgQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0hJR0hfU0VUKHNjbiwgbikgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgXAorCSAgIENFX1dSQVBQRVJfSU5ERVhfQkFTRV9ISUdIICsgQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MsIG4pCisKKyNkZWZpbmUgQ0VfV0FURVJNQVJLX01BU0sgKEhPU1RfSVNfU1JDX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLICB8IFwKKwkJCSAgIEhPU1RfSVNfU1JDX1JJTkdfSElHSF9XQVRFUk1BUktfTUFTSyB8IFwKKwkJCSAgIEhPU1RfSVNfRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLICB8IFwKKwkJCSAgIEhPU1RfSVNfRFNUX1JJTkdfSElHSF9XQVRFUk1BUktfTUFTSykKKworI2RlZmluZSBDRV9FUlJPUl9NQVNLICAgICAoTUlTQ19JU19BWElfRVJSX01BU0sgICAgICAgICAgIHwgXAorCQkJICAgTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSyAgICAgIHwgXAorCQkJICAgTUlTQ19JU19TUkNfTEVOX0VSUl9NQVNLICAgICAgIHwgXAorCQkJICAgTUlTQ19JU19EU1RfTUFYX0xFTl9WSU9fTUFTSyAgIHwgXAorCQkJICAgTUlTQ19JU19EU1RfUklOR19PVkVSRkxPV19NQVNLIHwgXAorCQkJICAgTUlTQ19JU19TUkNfUklOR19PVkVSRkxPV19NQVNLKQorCisjZGVmaW5lIENFX1NSQ19SSU5HX1RPX0RFU0MoYmFkZHIsIGlkeCkgXAorCSgmKCgoc3RydWN0IENFX3NyY19kZXNjICopYmFkZHIpW2lkeF0pKQorI2RlZmluZSBDRV9ERVNUX1JJTkdfVE9fREVTQyhiYWRkciwgaWR4KSBcCisJKCYoKChzdHJ1Y3QgQ0VfZGVzdF9kZXNjICopYmFkZHIpW2lkeF0pKQorCisvKiBSaW5nIGFyaXRobWV0aWMgKG1vZHVsdXMgbnVtYmVyIG9mIGVudHJpZXMgaW4gcmluZywgd2hpY2ggaXMgYSBwd3Igb2YgMikuICovCisjZGVmaW5lIENFX1JJTkdfREVMVEEobmVudHJpZXNfbWFzaywgZnJvbWlkeCwgdG9pZHgpIFwKKwkoKChpbnQpKHRvaWR4KS0oaW50KShmcm9taWR4KSkgJiAobmVudHJpZXNfbWFzaykpCisKKyNkZWZpbmUgQ0VfUklOR19JRFhfSU5DUihuZW50cmllc19tYXNrLCBpZHgpIFwKKwkoKChpZHgpICsgMSkgJiAobmVudHJpZXNfbWFzaykpCisKKyNkZWZpbmUgQ0VfUklOR19JRFhfQUREKG5lbnRyaWVzX21hc2ssIGlkeCwgbnVtKSBcCisJKCgoaWR4KSArIChudW0pKSAmIChuZW50cmllc19tYXNrKSkKKworI2RlZmluZSBDRV9JTlRFUlJVUFRfU1VNTUFSWShzY24pIFwKKwlDRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX0dFVCggXAorCQlBX1RBUkdFVF9SRUFEKHNjbiwgQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MgKyBcCisJCUNFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfQUREUkVTUykpCisKKy8qTWFjcm8gdG8gaW5jcmVtZW50IENFIHBhY2tldCBlcnJvcnMqLworI2RlZmluZSBPTF9BVEhfQ0VfUEtUX0VSUk9SX0NPVU5UX0lOQ1IoX3NjbiwgX2NlX2Vjb2RlKSBcCisJZG8geyBpZiAoX2NlX2Vjb2RlID09IENFX1JJTkdfREVMVEFfRkFJTCkgXAorCQkJKF9zY24tPnBrdF9zdGF0cy5jZV9yaW5nX2RlbHRhX2ZhaWxfY291bnQpIFwKKwkJCSs9IDE7IH0gd2hpbGUgKDApCisKKy8qIEdpdmVuIGEgQ29weSBFbmdpbmUncyBJRCwgZGV0ZXJtaW5lIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGZvciB0aGF0CisgKiBjb3B5IGVuZ2luZSdzIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgQ0VfSURfVE9fSU5VTShpZCkgKEFfSU5VTV9DRTBfQ09QWV9DT01QX0JBU0UgKyAoaWQpKQorI2RlZmluZSBDRV9JTlVNX1RPX0lEKGludW0pICgoaW51bSkgLSBBX0lOVU1fQ0UwX0NPUFlfQ09NUF9CQVNFKQorI2RlZmluZSBDRTBfQkFTRV9BRERSRVNTICAgICAgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRTBfQkFTRV9BRERSRVNTKQorI2RlZmluZSBDRTFfQkFTRV9BRERSRVNTICAgICAgICAgKHNjbi0+dGFyZ2V0X2NlX2RlZi0+ZF9DRTFfQkFTRV9BRERSRVNTKQorCisjaWZkZWYgQURSQVNURUFfU0hBRE9XX1JFR0lTVEVSUworCisjZGVmaW5lIE5VTV9TSEFET1dfUkVHSVNURVJTIDI0CisKKyNkZWZpbmUgQ09QWV9FTkdJTkVfSUQoQ09QWV9FTkdJTkVfQkFTRV9BRERSRVNTKSAoKENPUFlfRU5HSU5FX0JBU0VfQUREUkVTUyBcCisJCS0gQ0UwX0JBU0VfQUREUkVTUykvKENFMV9CQVNFX0FERFJFU1MgLSBDRTBfQkFTRV9BRERSRVNTKSkKKwordTMyIHNoYWRvd19zcl93cl9pbmRfYWRkcihzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdTMyIGN0cmxfYWRkcik7Cit1MzIgc2hhZG93X2RzdF93cl9pbmRfYWRkcihzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdTMyIGN0cmxfYWRkcik7CisjZGVmaW5lIENFX1NSQ19SSU5HX1dSSVRFX0lEWF9TRVQoc2NuLCBDRV9jdHJsX2FkZHIsIG4pIFwKKwlBX1RBUkdFVF9XUklURShzY24sIHNoYWRvd19zcl93cl9pbmRfYWRkcihzY24sIENFX2N0cmxfYWRkciksIG4pCisKKyNkZWZpbmUgQ0VfU1JDX1JJTkdfV1JJVEVfSURYX0dFVChzY24sIENFX2N0cmxfYWRkcikgIFwKKwlBX1RBUkdFVF9SRUFEKHNjbiwgc2hhZG93X3NyX3dyX2luZF9hZGRyKHNjbiwgQ0VfY3RybF9hZGRyKSkKKworI2RlZmluZSBDRV9ERVNUX1JJTkdfV1JJVEVfSURYX1NFVChzY24sIENFX2N0cmxfYWRkciwgbikgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgc2hhZG93X2RzdF93cl9pbmRfYWRkcihzY24sIENFX2N0cmxfYWRkciksIG4pCisKKyNkZWZpbmUgQ0VfREVTVF9SSU5HX1dSSVRFX0lEWF9HRVQoc2NuLCBDRV9jdHJsX2FkZHIpIFwKKwlBX1RBUkdFVF9SRUFEKHNjbiwgc2hhZG93X2RzdF93cl9pbmRfYWRkcihzY24sIENFX2N0cmxfYWRkcikpCisKKyNlbHNlCisKKyNkZWZpbmUgQ0VfU1JDX1JJTkdfV1JJVEVfSURYX1NFVChzY24sIENFX2N0cmxfYWRkciwgbikgXAorCUFfVEFSR0VUX1dSSVRFKHNjbiwgKENFX2N0cmxfYWRkcikgKyBTUl9XUl9JTkRFWF9BRERSRVNTLCAobikpCisKKyNkZWZpbmUgQ0VfU1JDX1JJTkdfV1JJVEVfSURYX0dFVChzY24sIENFX2N0cmxfYWRkcikJXAorCUFfVEFSR0VUX1JFQUQoc2NuLCAoQ0VfY3RybF9hZGRyKSArIFNSX1dSX0lOREVYX0FERFJFU1MpCisKKyNkZWZpbmUgQ0VfREVTVF9SSU5HX1dSSVRFX0lEWF9TRVQoc2NuLCBDRV9jdHJsX2FkZHIsIG4pIFwKKwlBX1RBUkdFVF9XUklURShzY24sIChDRV9jdHJsX2FkZHIpICsgRFNUX1dSX0lOREVYX0FERFJFU1MsIChuKSkKKworI2RlZmluZSBDRV9ERVNUX1JJTkdfV1JJVEVfSURYX0dFVChzY24sIENFX2N0cmxfYWRkcikgXAorCUFfVEFSR0VUX1JFQUQoc2NuLCAoQ0VfY3RybF9hZGRyKSArIERTVF9XUl9JTkRFWF9BRERSRVNTKQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQ0VfUkVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oaWYvc3JjL2NlL2NlX3NlcnZpY2UuYyBiL2NvcmUvaGlmL3NyYy9jZS9jZV9zZXJ2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3Y2E2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9jZS9jZV9zZXJ2aWNlLmMKQEAgLTAsMCArMSwxNjc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8b3NkZXAuaD4KKyNpbmNsdWRlICJhX3R5cGVzLmgiCisjaW5jbHVkZSA8YXRoZGVmcy5oPgorI2luY2x1ZGUgIm9zYXBpX2xpbnV4LmgiCisjaW5jbHVkZSAiaGlmLmgiCisjaW5jbHVkZSAiaGlmX2lvMzIuaCIKKyNpbmNsdWRlICJjZV9hcGkuaCIKKyNpbmNsdWRlICJjZV9tYWluLmgiCisjaW5jbHVkZSAiY2VfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjZV9yZWcuaCIKKyNpbmNsdWRlICJjZGZfbG9jay5oIgorI2luY2x1ZGUgInJlZ3RhYmxlLmgiCisjaW5jbHVkZSA8Y2RzX2dldF9iaW4uaD4KKyNpbmNsdWRlICJlcHBpbmdfbWFpbi5oIgorI2luY2x1ZGUgImhpZl9tYWluLmgiCisjaW5jbHVkZSAiaGlmX2RlYnVnLmgiCisKKyNpZmRlZiBJUEFfT0ZGTE9BRAorI2lmZGVmIFFDQV9XSUZJXzNfMAorI2RlZmluZSBDRV9JUEFfUklOR19JTklUKGNlX2Rlc2MpICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQljZV9kZXNjLT5nYXRoZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgXAorCQljZV9kZXNjLT5lbmFibGVfMTFoID0gMDsgICAgICAgICAgICAgICAgXAorCQljZV9kZXNjLT5tZXRhX2RhdGFfbG93ID0gMDsgICAgICAgICAgICAgXAorCQljZV9kZXNjLT5wYWNrZXRfcmVzdWx0X29mZnNldCA9IDY0OyAgICAgXAorCQljZV9kZXNjLT50b2VwbGl0el9oYXNoX2VuYWJsZSA9IDA7ICAgICAgXAorCQljZV9kZXNjLT5hZGRyX3lfc2VhcmNoX2Rpc2FibGUgPSAwOyAgICAgXAorCQljZV9kZXNjLT5hZGRyX3hfc2VhcmNoX2Rpc2FibGUgPSAwOyAgICAgXAorCQljZV9kZXNjLT5taXNjX2ludF9kaXNhYmxlID0gMDsgICAgICAgICAgXAorCQljZV9kZXNjLT50YXJnZXRfaW50X2Rpc2FibGUgPSAwOyAgICAgICAgXAorCQljZV9kZXNjLT5ob3N0X2ludF9kaXNhYmxlID0gMDsgICAgICAgICAgXAorCQljZV9kZXNjLT5kZXN0X2J5dGVfc3dhcCA9IDA7ICAgICAgICAgICAgXAorCQljZV9kZXNjLT5ieXRlX3N3YXAgPSAwOyAgICAgICAgICAgICAgICAgXAorCQljZV9kZXNjLT50eXBlID0gMjsgICAgICAgICAgICAgICAgICAgICAgXAorCQljZV9kZXNjLT50eF9jbGFzc2lmeSA9IDE7ICAgICAgICAgICAgICAgXAorCQljZV9kZXNjLT5idWZmZXJfYWRkcl9oaSA9IDA7ICAgICAgICAgICAgXAorCQljZV9kZXNjLT5tZXRhX2RhdGEgPSAwOyAgICAgICAgICAgICAgICAgXAorCQljZV9kZXNjLT5uYnl0ZXMgPSAxMjg7ICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBDRV9JUEFfUklOR19JTklUKGNlX2Rlc2MpICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQljZV9kZXNjLT5ieXRlX3N3YXAgPSAwOyAgICAgICAgICAgICAgICAgXAorCQljZV9kZXNjLT5uYnl0ZXMgPSA2MDsgICAgICAgICAgICAgICAgICAgXAorCQljZV9kZXNjLT5nYXRoZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUgKDApCisjZW5kaWYgLyogUUNBX1dJRklfM18wICovCisjZW5kaWYgLyogSVBBX09GRkxPQUQgKi8KKworc3RhdGljIGludCB3YXIxX2FsbG93X3NsZWVwOworLyogaW8zMiB3cml0ZSB3b3JrYXJvdW5kICovCitzdGF0aWMgaW50IGhpZl9jZV93YXIxOworCisvKgorICogU3VwcG9ydCBmb3IgQ29weSBFbmdpbmUgaGFyZHdhcmUsIHdoaWNoIGlzIG1haW5seSB1c2VkIGZvcgorICogY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEhvc3QgYW5kIFRhcmdldCBvdmVyIGEgUENJZSBpbnRlcmNvbm5lY3QuCisgKi8KKworLyoKKyAqIEEgc2luZ2xlIENvcHlFbmdpbmUgKENFKSBjb21wcmlzZXMgdHdvICJyaW5ncyI6CisgKiAgIGEgc291cmNlIHJpbmcKKyAqICAgYSBkZXN0aW5hdGlvbiByaW5nCisgKgorICogRWFjaCByaW5nIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHdoaWNoIHNwZWNpZnkKKyAqIGFuIGFkZHJlc3MsIGxlbmd0aCwgYW5kIG1ldGEtZGF0YS4KKyAqCisgKiBUeXBpY2FsbHksIG9uZSBzaWRlIG9mIHRoZSBQQ0llIGludGVyY29ubmVjdCAoSG9zdCBvciBUYXJnZXQpCisgKiBjb250cm9scyBvbmUgcmluZyBhbmQgdGhlIG90aGVyIHNpZGUgY29udHJvbHMgdGhlIG90aGVyIHJpbmcuCisgKiBUaGUgc291cmNlIHNpZGUgY2hvb3NlcyB3aGVuIHRvIGluaXRpYXRlIGEgdHJhbnNmZXIgYW5kIGl0CisgKiBjaG9vc2VzIHdoYXQgdG8gc2VuZCAoYnVmZmVyIGFkZHJlc3MsIGxlbmd0aCkuIFRoZSBkZXN0aW5hdGlvbgorICogc2lkZSBrZWVwcyBhIHN1cHBseSBvZiAiYW5vbnltb3VzIHJlY2VpdmUgYnVmZmVycyIgYXZhaWxhYmxlIGFuZAorICogaXQgaGFuZGxlcyBpbmNvbWluZyBkYXRhIGFzIGl0IGFycml2ZXMgKHdoZW4gdGhlIGRlc3RpbmF0aW9uCisgKiByZWNpZXZlcyBhbiBpbnRlcnJ1cHQpLgorICoKKyAqIFRoZSBzZW5kZXIgbWF5IHNlbmQgYSBzaW1wbGUgYnVmZmVyIChhZGRyZXNzL2xlbmd0aCkgb3IgaXQgbWF5CisgKiBzZW5kIGEgc21hbGwgbGlzdCBvZiBidWZmZXJzLiAgV2hlbiBhIHNtYWxsIGxpc3QgaXMgc2VudCwgaGFyZHdhcmUKKyAqICJnYXRoZXJzIiB0aGVzZSBhbmQgdGhleSBlbmQgdXAgaW4gYSBzaW5nbGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiB3aXRoIGEgc2luZ2xlIGludGVycnVwdC4KKyAqCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCAiY29udGV4dHMiIG1hbmFnZWQgYnkgdGhpcyBsYXllciAtLSBtb3JlLCBpdAorICogbWF5IHNlZW0gLS0gdGhhbiBzaG91bGQgYmUgbmVlZGVkLiBUaGVzZSBhcmUgcHJvdmlkZWQgbWFpbmx5IGZvcgorICogbWF4aW11bSBmbGV4aWJpbGl0eSBhbmQgZXNwZWNpYWxseSB0byBmYWNpbGl0YXRlIGEgc2ltcGxlciBISUYKKyAqIGltcGxlbWVudGF0aW9uLiBUaGVyZSBhcmUgcGVyLUNvcHlFbmdpbmUgcmVjdiwgc2VuZCwgYW5kIHdhdGVybWFyaworICogY29udGV4dHMuIFRoZXNlIGFyZSBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHdoZW4gYSByZWN2LCBzZW5kLAorICogb3Igd2F0ZXJtYXJrIGhhbmRsZXIgaXMgZXN0YWJsaXNoZWQgYW5kIHRoZXkgYXJlIGVjaG9lZCBiYWNrIHRvCisgKiB0aGUgY2FsbGVyIHdoZW4gdGhlIHJlc3BlY3RpdmUgY2FsbGJhY2tzIGFyZSBpbnZva2VkLiBUaGVyZSBpcworICogYWxzbyBhIHBlci10cmFuc2ZlciBjb250ZXh0IHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgd2hlbiBhIGJ1ZmZlcgorICogKG9yIHNlbmRsaXN0KSBpcyBzZW50IGFuZCB3aGVuIGEgYnVmZmVyIGlzIGVucXVldWVkIGZvciByZWN2LgorICogVGhlc2UgcGVyLXRyYW5zZmVyIGNvbnRleHRzIGFyZSBlY2hvZWQgYmFjayB0byB0aGUgY2FsbGVyIHdoZW4KKyAqIHRoZSBidWZmZXIgaXMgc2VudC9yZWNlaXZlZC4KKyAqIFRhcmdldCBUWCBoYXJzaCByZXN1bHQgdG9lcGxpdHpfaGFzaF9yZXN1bHQKKyAqLworCisvKgorICogR3V0cyBvZiBjZV9zZW5kLCB1c2VkIGJ5IGJvdGggY2Vfc2VuZCBhbmQgY2Vfc2VuZGxpc3Rfc2VuZC4KKyAqIFRoZSBjYWxsZXIgdGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIGFueSBuZWVkZWQgbG9ja2luZy4KKyAqLworaW50CitjZV9jb21wbGV0ZWRfc2VuZF9uZXh0X25vbG9jayhzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlLAorCQkJICAgICAgdm9pZCAqKnBlcl9DRV9jb250ZXh0cCwKKwkJCSAgICAgIHZvaWQgKipwZXJfdHJhbnNmZXJfY29udGV4dHAsCisJCQkgICAgICBjZGZfZG1hX2FkZHJfdCAqYnVmZmVycCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqbmJ5dGVzcCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqdHJhbnNmZXJfaWRwLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpzd19pZHgsIHVuc2lnbmVkIGludCAqaHdfaWR4LAorCQkJICAgICAgdWludDMyX3QgKnRvZXBsaXR6X2hhc2hfcmVzdWx0KTsKKwordm9pZCB3YXJfY2Vfc3JjX3Jpbmdfd3JpdGVfaWR4X3NldChzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwKKwkJCQkgICB1MzIgY3RybF9hZGRyLCB1bnNpZ25lZCBpbnQgd3JpdGVfaW5kZXgpCit7CisJaWYgKGhpZl9jZV93YXIxKSB7CisJCXZvaWQgX19pb21lbSAqaW5kaWNhdG9yX2FkZHI7CisKKwkJaW5kaWNhdG9yX2FkZHIgPSBzY24tPm1lbSArIGN0cmxfYWRkciArIERTVF9XQVRFUk1BUktfQUREUkVTUzsKKworCQlpZiAoIXdhcjFfYWxsb3dfc2xlZXAKKwkJICAgICYmIGN0cmxfYWRkciA9PSBDRV9CQVNFX0FERFJFU1MoQ0RDX1dBUl9EQVRBX0NFKSkgeworCQkJaGlmX3dyaXRlMzJfbWIoaW5kaWNhdG9yX2FkZHIsCisJCQkJICAgICAgKENEQ19XQVJfTUFHSUNfU1RSIHwgd3JpdGVfaW5kZXgpKTsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCQkJbG9jYWxfaXJxX3NhdmUoaXJxX2ZsYWdzKTsKKwkJCWhpZl93cml0ZTMyX21iKGluZGljYXRvcl9hZGRyLCAxKTsKKworCQkJLyoKKwkJCSAqIFBDSUUgd3JpdGUgd2FpdHMgZm9yIEFDSyBpbiBJUFE4SywgdGhlcmUgaXMgbm8KKwkJCSAqIG5lZWQgdG8gcmVhZCBiYWNrIHZhbHVlLgorCQkJICovCisJCQkodm9pZCloaWZfcmVhZDMyX21iKGluZGljYXRvcl9hZGRyKTsKKwkJCSh2b2lkKWhpZl9yZWFkMzJfbWIoaW5kaWNhdG9yX2FkZHIpOyAvKiBjb25zZXJ2YXRpdmUgKi8KKworCQkJQ0VfU1JDX1JJTkdfV1JJVEVfSURYX1NFVChzY24sCisJCQkJCQkgIGN0cmxfYWRkciwgd3JpdGVfaW5kZXgpOworCisJCQloaWZfd3JpdGUzMl9tYihpbmRpY2F0b3JfYWRkciwgMCk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShpcnFfZmxhZ3MpOworCQl9CisJfSBlbHNlCisJCUNFX1NSQ19SSU5HX1dSSVRFX0lEWF9TRVQoc2NuLCBjdHJsX2FkZHIsIHdyaXRlX2luZGV4KTsKK30KKworaW50CitjZV9zZW5kX25vbG9jayhzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLAorCQkJICAgdm9pZCAqcGVyX3RyYW5zZmVyX2NvbnRleHQsCisJCQkgICBjZGZfZG1hX2FkZHJfdCBidWZmZXIsCisJCQkgICB1aW50MzJfdCBuYnl0ZXMsCisJCQkgICB1aW50MzJfdCB0cmFuc2Zlcl9pZCwKKwkJCSAgIHVpbnQzMl90IGZsYWdzLAorCQkJICAgdWludDMyX3QgdXNlcl9mbGFncykKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGUgPSAoc3RydWN0IENFX3N0YXRlICopY29weWVuZzsKKwlzdHJ1Y3QgQ0VfcmluZ19zdGF0ZSAqc3JjX3JpbmcgPSBDRV9zdGF0ZS0+c3JjX3Jpbmc7CisJdWludDMyX3QgY3RybF9hZGRyID0gQ0Vfc3RhdGUtPmN0cmxfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbmVudHJpZXNfbWFzayA9IHNyY19yaW5nLT5uZW50cmllc19tYXNrOworCXVuc2lnbmVkIGludCBzd19pbmRleCA9IHNyY19yaW5nLT5zd19pbmRleDsKKwl1bnNpZ25lZCBpbnQgd3JpdGVfaW5kZXggPSBzcmNfcmluZy0+d3JpdGVfaW5kZXg7CisJdWludDY0X3QgZG1hX2FkZHIgPSBidWZmZXI7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBDRV9zdGF0ZS0+c2NuOworCisJQV9UQVJHRVRfQUNDRVNTX0JFR0lOX1JFVChzY24pOworCWlmICh1bmxpa2VseShDRV9SSU5HX0RFTFRBKG5lbnRyaWVzX21hc2ssCisJCQkJd3JpdGVfaW5kZXgsIHN3X2luZGV4IC0gMSkgPD0gMCkpIHsKKwkJT0xfQVRIX0NFX1BLVF9FUlJPUl9DT1VOVF9JTkNSKHNjbiwgQ0VfUklOR19ERUxUQV9GQUlMKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCUFfVEFSR0VUX0FDQ0VTU19FTkRfUkVUKHNjbik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXsKKwkJc3RydWN0IENFX3NyY19kZXNjICpzcmNfcmluZ19iYXNlID0KKwkJCShzdHJ1Y3QgQ0Vfc3JjX2Rlc2MgKilzcmNfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlOworCQlzdHJ1Y3QgQ0Vfc3JjX2Rlc2MgKnNoYWRvd19iYXNlID0KKwkJCShzdHJ1Y3QgQ0Vfc3JjX2Rlc2MgKilzcmNfcmluZy0+c2hhZG93X2Jhc2U7CisJCXN0cnVjdCBDRV9zcmNfZGVzYyAqc3JjX2Rlc2MgPQorCQkJQ0VfU1JDX1JJTkdfVE9fREVTQyhzcmNfcmluZ19iYXNlLCB3cml0ZV9pbmRleCk7CisJCXN0cnVjdCBDRV9zcmNfZGVzYyAqc2hhZG93X3NyY19kZXNjID0KKwkJCUNFX1NSQ19SSU5HX1RPX0RFU0Moc2hhZG93X2Jhc2UsIHdyaXRlX2luZGV4KTsKKworCQkvKiBVcGRhdGUgbG93IDMyIGJpdHMgc291cmNlIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQlzaGFkb3dfc3JjX2Rlc2MtPmJ1ZmZlcl9hZGRyID0KKwkJCSh1aW50MzJfdCkoZG1hX2FkZHIgJiAweEZGRkZGRkZGKTsKKyNpZmRlZiBRQ0FfV0lGSV8zXzAKKwkJc2hhZG93X3NyY19kZXNjLT5idWZmZXJfYWRkcl9oaSA9CisJCQkodWludDMyX3QpKChkbWFfYWRkciA+PiAzMikgJiAweDFGKTsKKwkJdXNlcl9mbGFncyB8PSBzaGFkb3dfc3JjX2Rlc2MtPmJ1ZmZlcl9hZGRyX2hpOworCQltZW1jcHkoJigoKHVpbnQzMl90ICopc2hhZG93X3NyY19kZXNjKVsxXSksICZ1c2VyX2ZsYWdzLAorCQkJICAgc2l6ZW9mKHVpbnQzMl90KSk7CisjZW5kaWYKKwkJc2hhZG93X3NyY19kZXNjLT5tZXRhX2RhdGEgPSB0cmFuc2Zlcl9pZDsKKworCQkvKgorCQkgKiBTZXQgdGhlIHN3YXAgYml0IGlmOgorCQkgKiB0eXBpY2FsIHNlbmRzIG9uIHRoaXMgQ0UgYXJlIHN3YXBwZWQgKGhvc3QgaXMgYmlnLWVuZGlhbikKKwkJICogYW5kIHRoaXMgc2VuZCBkb2Vzbid0IGRpc2FibGUgdGhlIHN3YXBwaW5nCisJCSAqIChkYXRhIGlzIG5vdCBieXRlc3RyZWFtKQorCQkgKi8KKwkJc2hhZG93X3NyY19kZXNjLT5ieXRlX3N3YXAgPQorCQkJKCgoQ0Vfc3RhdGUtPmF0dHJfZmxhZ3MgJiBDRV9BVFRSX0JZVEVfU1dBUF9EQVRBKQorCQkJICE9IDApICYgKChmbGFncyAmIENFX1NFTkRfRkxBR19TV0FQX0RJU0FCTEUpID09IDApKTsKKwkJc2hhZG93X3NyY19kZXNjLT5nYXRoZXIgPSAoKGZsYWdzICYgQ0VfU0VORF9GTEFHX0dBVEhFUikgIT0gMCk7CisJCXNoYWRvd19zcmNfZGVzYy0+bmJ5dGVzID0gbmJ5dGVzOworCisJCSpzcmNfZGVzYyA9ICpzaGFkb3dfc3JjX2Rlc2M7CisKKwkJc3JjX3JpbmctPnBlcl90cmFuc2Zlcl9jb250ZXh0W3dyaXRlX2luZGV4XSA9CisJCQlwZXJfdHJhbnNmZXJfY29udGV4dDsKKworCQkvKiBVcGRhdGUgU291cmNlIFJpbmcgV3JpdGUgSW5kZXggKi8KKwkJd3JpdGVfaW5kZXggPSBDRV9SSU5HX0lEWF9JTkNSKG5lbnRyaWVzX21hc2ssIHdyaXRlX2luZGV4KTsKKworCQkvKiBXT1JLQVJPVU5EICovCisJCWlmICghc2hhZG93X3NyY19kZXNjLT5nYXRoZXIpIHsKKwkJCXdhcl9jZV9zcmNfcmluZ193cml0ZV9pZHhfc2V0KHNjbiwgY3RybF9hZGRyLAorCQkJCQkJICAgICAgd3JpdGVfaW5kZXgpOworCQl9CisKKwkJc3JjX3JpbmctPndyaXRlX2luZGV4ID0gd3JpdGVfaW5kZXg7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJQV9UQVJHRVRfQUNDRVNTX0VORF9SRVQoc2NuKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorY2Vfc2VuZChzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLAorCQl2b2lkICpwZXJfdHJhbnNmZXJfY29udGV4dCwKKwkJY2RmX2RtYV9hZGRyX3QgYnVmZmVyLAorCQl1aW50MzJfdCBuYnl0ZXMsCisJCXVpbnQzMl90IHRyYW5zZmVyX2lkLAorCQl1aW50MzJfdCBmbGFncywKKwkJdWludDMyX3QgdXNlcl9mbGFnKQoreworCXN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGUgPSAoc3RydWN0IENFX3N0YXRlICopY29weWVuZzsKKwlpbnQgc3RhdHVzOworCisJY2RmX3NwaW5fbG9ja19iaCgmQ0Vfc3RhdGUtPnNjbi0+dGFyZ2V0X2xvY2spOworCXN0YXR1cyA9IGNlX3NlbmRfbm9sb2NrKGNvcHllbmcsIHBlcl90cmFuc2Zlcl9jb250ZXh0LCBidWZmZXIsIG5ieXRlcywKKwkJCXRyYW5zZmVyX2lkLCBmbGFncywgdXNlcl9mbGFnKTsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3Vuc2lnbmVkIGludCBjZV9zZW5kbGlzdF9zaXplb2Yodm9pZCkKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBjZV9zZW5kbGlzdCk7Cit9CisKK3ZvaWQgY2Vfc2VuZGxpc3RfaW5pdChzdHJ1Y3QgY2Vfc2VuZGxpc3QgKnNlbmRsaXN0KQoreworCXN0cnVjdCBjZV9zZW5kbGlzdF9zICpzbCA9IChzdHJ1Y3QgY2Vfc2VuZGxpc3RfcyAqKXNlbmRsaXN0OworCXNsLT5udW1faXRlbXMgPSAwOworfQorCitpbnQKK2NlX3NlbmRsaXN0X2J1Zl9hZGQoc3RydWN0IGNlX3NlbmRsaXN0ICpzZW5kbGlzdCwKKwkJCQkJY2RmX2RtYV9hZGRyX3QgYnVmZmVyLAorCQkJCQl1aW50MzJfdCBuYnl0ZXMsCisJCQkJCXVpbnQzMl90IGZsYWdzLAorCQkJCQl1aW50MzJfdCB1c2VyX2ZsYWdzKQoreworCXN0cnVjdCBjZV9zZW5kbGlzdF9zICpzbCA9IChzdHJ1Y3QgY2Vfc2VuZGxpc3RfcyAqKXNlbmRsaXN0OworCXVuc2lnbmVkIGludCBudW1faXRlbXMgPSBzbC0+bnVtX2l0ZW1zOworCXN0cnVjdCBjZV9zZW5kbGlzdF9pdGVtICppdGVtOworCisJaWYgKG51bV9pdGVtcyA+PSBDRV9TRU5ETElTVF9JVEVNU19NQVgpIHsKKwkJQ0RGX0FTU0VSVChudW1faXRlbXMgPCBDRV9TRU5ETElTVF9JVEVNU19NQVgpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwl9CisKKwlpdGVtID0gJnNsLT5pdGVtW251bV9pdGVtc107CisJaXRlbS0+c2VuZF90eXBlID0gQ0VfU0lNUExFX0JVRkZFUl9UWVBFOworCWl0ZW0tPmRhdGEgPSBidWZmZXI7CisJaXRlbS0+dS5uYnl0ZXMgPSBuYnl0ZXM7CisJaXRlbS0+ZmxhZ3MgPSBmbGFnczsKKwlpdGVtLT51c2VyX2ZsYWdzID0gdXNlcl9mbGFnczsKKwlzbC0+bnVtX2l0ZW1zID0gbnVtX2l0ZW1zICsgMTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitpbnQKK2NlX3NlbmRsaXN0X3NlbmQoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJIHZvaWQgKnBlcl90cmFuc2Zlcl9jb250ZXh0LAorCQkgc3RydWN0IGNlX3NlbmRsaXN0ICpzZW5kbGlzdCwgdW5zaWduZWQgaW50IHRyYW5zZmVyX2lkKQoreworCWludCBzdGF0dXMgPSAtRU5PTUVNOworCXN0cnVjdCBjZV9zZW5kbGlzdF9zICpzbCA9IChzdHJ1Y3QgY2Vfc2VuZGxpc3RfcyAqKXNlbmRsaXN0OworCXN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGUgPSAoc3RydWN0IENFX3N0YXRlICopY29weWVuZzsKKwlzdHJ1Y3QgQ0VfcmluZ19zdGF0ZSAqc3JjX3JpbmcgPSBDRV9zdGF0ZS0+c3JjX3Jpbmc7CisJdW5zaWduZWQgaW50IG5lbnRyaWVzX21hc2sgPSBzcmNfcmluZy0+bmVudHJpZXNfbWFzazsKKwl1bnNpZ25lZCBpbnQgbnVtX2l0ZW1zID0gc2wtPm51bV9pdGVtczsKKwl1bnNpZ25lZCBpbnQgc3dfaW5kZXg7CisJdW5zaWduZWQgaW50IHdyaXRlX2luZGV4OworCisJQ0RGX0FTU0VSVCgobnVtX2l0ZW1zID4gMCkgJiYgKG51bV9pdGVtcyA8IHNyY19yaW5nLT5uZW50cmllcykpOworCisJY2RmX3NwaW5fbG9ja19iaCgmQ0Vfc3RhdGUtPnNjbi0+dGFyZ2V0X2xvY2spOworCXN3X2luZGV4ID0gc3JjX3JpbmctPnN3X2luZGV4OworCXdyaXRlX2luZGV4ID0gc3JjX3JpbmctPndyaXRlX2luZGV4OworCisJaWYgKENFX1JJTkdfREVMVEEobmVudHJpZXNfbWFzaywgd3JpdGVfaW5kZXgsIHN3X2luZGV4IC0gMSkgPj0KKwkgICAgbnVtX2l0ZW1zKSB7CisJCXN0cnVjdCBjZV9zZW5kbGlzdF9pdGVtICppdGVtOworCQlpbnQgaTsKKworCQkvKiBoYW5kbGUgYWxsIGJ1dCB0aGUgbGFzdCBpdGVtIHVuaWZvcm1seSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2l0ZW1zIC0gMTsgaSsrKSB7CisJCQlpdGVtID0gJnNsLT5pdGVtW2ldOworCQkJLyogVEJEWFhYOiBTdXBwb3J0IGV4dGVuc2libGUgc2VuZGxpc3RfdHlwZXM/ICovCisJCQlDREZfQVNTRVJUKGl0ZW0tPnNlbmRfdHlwZSA9PSBDRV9TSU1QTEVfQlVGRkVSX1RZUEUpOworCQkJc3RhdHVzID0gY2Vfc2VuZF9ub2xvY2soY29weWVuZywgQ0VfU0VORExJU1RfSVRFTV9DVFhULAorCQkJCShjZGZfZG1hX2FkZHJfdCkgaXRlbS0+ZGF0YSwKKwkJCQlpdGVtLT51Lm5ieXRlcywgdHJhbnNmZXJfaWQsCisJCQkJaXRlbS0+ZmxhZ3MgfCBDRV9TRU5EX0ZMQUdfR0FUSEVSLAorCQkJCWl0ZW0tPnVzZXJfZmxhZ3MpOworCQkJQ0RGX0FTU0VSVChzdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCQkvKiBwcm92aWRlIHZhbGlkIGNvbnRleHQgcG9pbnRlciBmb3IgZmluYWwgaXRlbSAqLworCQlpdGVtID0gJnNsLT5pdGVtW2ldOworCQkvKiBUQkRYWFg6IFN1cHBvcnQgZXh0ZW5zaWJsZSBzZW5kbGlzdF90eXBlcz8gKi8KKwkJQ0RGX0FTU0VSVChpdGVtLT5zZW5kX3R5cGUgPT0gQ0VfU0lNUExFX0JVRkZFUl9UWVBFKTsKKwkJc3RhdHVzID0gY2Vfc2VuZF9ub2xvY2soY29weWVuZywgcGVyX3RyYW5zZmVyX2NvbnRleHQsCisJCQkJCShjZGZfZG1hX2FkZHJfdCkgaXRlbS0+ZGF0YSwKKwkJCQkJaXRlbS0+dS5uYnl0ZXMsCisJCQkJCXRyYW5zZmVyX2lkLCBpdGVtLT5mbGFncywKKwkJCQkJaXRlbS0+dXNlcl9mbGFncyk7CisJCUNERl9BU1NFUlQoc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUyk7CisJCU5CVUZfVVBEQVRFX1RYX1BLVF9DT1VOVCgoY2RmX25idWZfdClwZXJfdHJhbnNmZXJfY29udGV4dCwKKwkJCQkJTkJVRl9UWF9QS1RfQ0UpOworCQlEUFRSQUNFKGNkZl9kcF90cmFjZSgoY2RmX25idWZfdClwZXJfdHJhbnNmZXJfY29udGV4dCwKKwkJCUNERl9EUF9UUkFDRV9DRV9QQUNLRVRfUFRSX1JFQ09SRCwKKwkJCSh1aW50OF90ICopKCgoY2RmX25idWZfdClwZXJfdHJhbnNmZXJfY29udGV4dCktPmRhdGEpLAorCQkJc2l6ZW9mKCgoY2RmX25idWZfdClwZXJfdHJhbnNmZXJfY29udGV4dCktPmRhdGEpKSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUHJvYmFibHkgbm90IHdvcnRoIHRoZSBhZGRpdGlvbmFsIGNvbXBsZXhpdHkgdG8gc3VwcG9ydAorCQkgKiBwYXJ0aWFsIHNlbmRzIHdpdGggY29udGludWF0aW9uIG9yIG5vdGlmaWNhdGlvbi4gIFdlIGV4cGVjdAorCQkgKiB0byB1c2UgbGFyZ2UgcmluZ3MgYW5kIHNtYWxsIHNlbmRsaXN0cy4gSWYgd2UgY2FuJ3QgaGFuZGxlCisJCSAqIHRoZSBlbnRpcmUgcmVxdWVzdCBhdCBvbmNlLCBwdW50IGl0IGJhY2sgdG8gdGhlIGNhbGxlci4KKwkJICovCisJfQorCWNkZl9zcGluX3VubG9ja19iaCgmQ0Vfc3RhdGUtPnNjbi0+dGFyZ2V0X2xvY2spOworCisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorI2lmZGVmIFFDQV9XSUZJXzNfMAorc3RhdGljIGlubGluZSB2b2lkCitjZV9idWZmZXJfYWRkcl9oaV9zZXQoc3RydWN0IENFX3NyY19kZXNjICpzaGFkb3dfc3JjX2Rlc2MsCisJCSAgICAgIHVpbnQ2NF90IGRtYV9hZGRyLAorCQkgICAgICB1aW50MzJfdCB1c2VyX2ZsYWdzKQoreworCXNoYWRvd19zcmNfZGVzYy0+YnVmZmVyX2FkZHJfaGkgPQorCQkJKHVpbnQzMl90KSgoZG1hX2FkZHIgPj4gMzIpICYgMHgxRik7CisJdXNlcl9mbGFncyB8PSBzaGFkb3dfc3JjX2Rlc2MtPmJ1ZmZlcl9hZGRyX2hpOworCW1lbWNweSgmKCgodWludDMyX3QgKilzaGFkb3dfc3JjX2Rlc2MpWzFdKSwgJnVzZXJfZmxhZ3MsCisJCQlzaXplb2YodWludDMyX3QpKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK2NlX2J1ZmZlcl9hZGRyX2hpX3NldChzdHJ1Y3QgQ0Vfc3JjX2Rlc2MgKnNoYWRvd19zcmNfZGVzYywKKwkJICAgICAgdWludDY0X3QgZG1hX2FkZHIsCisJCSAgICAgIHVpbnQzMl90IHVzZXJfZmxhZ3MpCit7Cit9CisjZW5kaWYKKworLyoqCisgKiBjZV9zZW5kX2Zhc3QoKSBDRSBsYXllciBUeCBidWZmZXIgcG9zdGluZyBmdW5jdGlvbgorICogQGNvcHllbmc6IGNvcHkgZW5naW5lIGhhbmRsZQorICogQG1zZHVzOiBpYXJyYXkgb2YgbXNkdSB0byBiZSBzZW50CisgKiBAbnVtX21zZHVzOiBudW1iZXIgb2YgbXNkdXMgaW4gYW4gYXJyYXkKKyAqIEB0cmFuc2Zlcl9pZDogdHJhbnNmZXJfaWQKKyAqCisgKiBBc3N1bXB0aW9uIDogQ2FsbGVkIHdpdGggYW4gYXJyYXkgb2YgTVNEVSdzCisgKiBGdW5jdGlvbjoKKyAqIEZvciBlYWNoIG1zZHUgaW4gdGhlIGFycmF5CisgKiAxLiBDaGVjayBuby4gb2YgYXZhaWxhYmxlIGVudHJpZXMKKyAqIDIuIENyZWF0ZSBzcmMgcmluZyBlbnRyaWVzIChhbGxvY2F0ZWQgaW4gY29uc2lzdGVudCBtZW1vcnkKKyAqIDMuIFdyaXRlIGluZGV4IHRvIGgvdworICoKKyAqIFJldHVybjogTm8uIG9mIHBhY2tldHMgdGhhdCBjb3VsZCBiZSBzZW50CisgKi8KKworaW50IGNlX3NlbmRfZmFzdChzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLCBjZGZfbmJ1Zl90ICptc2R1cywKKwkJIHVuc2lnbmVkIGludCBudW1fbXNkdXMsIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9pZCkKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKmNlX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWNvcHllbmc7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBjZV9zdGF0ZS0+c2NuOworCXN0cnVjdCBDRV9yaW5nX3N0YXRlICpzcmNfcmluZyA9IGNlX3N0YXRlLT5zcmNfcmluZzsKKwl1X2ludDMyX3QgY3RybF9hZGRyID0gY2Vfc3RhdGUtPmN0cmxfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbmVudHJpZXNfbWFzayA9IHNyY19yaW5nLT5uZW50cmllc19tYXNrOworCXVuc2lnbmVkIGludCB3cml0ZV9pbmRleDsKKwl1bnNpZ25lZCBpbnQgc3dfaW5kZXg7CisJdW5zaWduZWQgaW50IGZyYWdfbGVuOworCWNkZl9uYnVmX3QgbXNkdTsKKwlpbnQgaTsKKwl1aW50NjRfdCBkbWFfYWRkcjsKKwl1aW50MzJfdCB1c2VyX2ZsYWdzID0gMDsKKworCS8qCisJICogVGhpcyBsb2NrIGNvdWxkIGJlIG1vcmUgZmluZS1ncmFpbmVkLCBvbmUgcGVyIENFLAorCSAqIFRPRE8gOiBBZGQgdGhpcyBsb2NrIG5vdy4KKwkgKiBUaGF0IGlzIHRoZSBuZXh0IHN0ZXAgb2Ygb3B0aW1pemF0aW9uLgorCSAqLworCWNkZl9zcGluX2xvY2tfYmgoJnNjbi0+dGFyZ2V0X2xvY2spOworCXN3X2luZGV4ID0gc3JjX3JpbmctPnN3X2luZGV4OworCXdyaXRlX2luZGV4ID0gc3JjX3JpbmctPndyaXRlX2luZGV4OworCisJLyogMiBtc2R1cyBwZXIgcGFja2V0ICovCisJZm9yIChpID0gMDsgaSA8IG51bV9tc2R1czsgaSsrKSB7CisJCXN0cnVjdCBDRV9zcmNfZGVzYyAqc3JjX3JpbmdfYmFzZSA9CisJCQkoc3RydWN0IENFX3NyY19kZXNjICopc3JjX3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZTsKKwkJc3RydWN0IENFX3NyY19kZXNjICpzaGFkb3dfYmFzZSA9CisJCQkoc3RydWN0IENFX3NyY19kZXNjICopc3JjX3JpbmctPnNoYWRvd19iYXNlOworCQlzdHJ1Y3QgQ0Vfc3JjX2Rlc2MgKnNyY19kZXNjID0KKwkJCUNFX1NSQ19SSU5HX1RPX0RFU0Moc3JjX3JpbmdfYmFzZSwgd3JpdGVfaW5kZXgpOworCQlzdHJ1Y3QgQ0Vfc3JjX2Rlc2MgKnNoYWRvd19zcmNfZGVzYyA9CisJCQlDRV9TUkNfUklOR19UT19ERVNDKHNoYWRvd19iYXNlLCB3cml0ZV9pbmRleCk7CisKKwkJbXNkdSA9IG1zZHVzW2ldOworCisJCS8qCisJCSAqIEZpcnN0IGZpbGwgb3V0IHRoZSByaW5nIGRlc2NyaXB0b3IgZm9yIHRoZSBIVEMgSFRUIGZyYW1lCisJCSAqIGhlYWRlci4gVGhlc2UgYXJlIHVuY2FjaGVkIHdyaXRlcy4gU2hvdWxkIHdlIHVzZSBhIGxvY2FsCisJCSAqIHN0cnVjdHVyZSBpbnN0ZWFkPworCQkgKi8KKwkJLyogSFRUL0hUQyBoZWFkZXIgY2FuIGJlIHBhc3NlZCBhcyBhIGFyZ3VtZW50ICovCisJCWRtYV9hZGRyID0gY2RmX25idWZfZ2V0X2ZyYWdfcGFkZHJfbG8obXNkdSwgMCk7CisJCXNoYWRvd19zcmNfZGVzYy0+YnVmZmVyX2FkZHIgPSAodWludDMyX3QpKGRtYV9hZGRyICYKKwkJCQkJCQkgIDB4RkZGRkZGRkYpOworCQl1c2VyX2ZsYWdzID0gY2RmX25idWZfZGF0YV9hdHRyX2dldChtc2R1KSAmIERFU0NfREFUQV9GTEFHX01BU0s7CisJCWNlX2J1ZmZlcl9hZGRyX2hpX3NldChzaGFkb3dfc3JjX2Rlc2MsIGRtYV9hZGRyLCB1c2VyX2ZsYWdzKTsKKworCQlzaGFkb3dfc3JjX2Rlc2MtPm1ldGFfZGF0YSA9IHRyYW5zZmVyX2lkOworCQlzaGFkb3dfc3JjX2Rlc2MtPm5ieXRlcyA9IGNkZl9uYnVmX2dldF9mcmFnX2xlbihtc2R1LCAwKTsKKworCQkvKgorCQkgKiBIVEMgSFRUIGhlYWRlciBpcyBhIHdvcmQgc3RyZWFtLCBzbyBieXRlIHN3YXAgaWYgQ0UgYnl0ZQorCQkgKiBzd2FwIGVuYWJsZWQKKwkJICovCisJCXNoYWRvd19zcmNfZGVzYy0+Ynl0ZV9zd2FwID0gKChjZV9zdGF0ZS0+YXR0cl9mbGFncyAmCisJCQkJCUNFX0FUVFJfQllURV9TV0FQX0RBVEEpICE9IDApOworCQkvKiBGb3IgdGhlIGZpcnN0IG9uZSwgaXQgc3RpbGwgZG9lcyBub3QgbmVlZCB0byB3cml0ZSAqLworCQlzaGFkb3dfc3JjX2Rlc2MtPmdhdGhlciA9IDE7CisJCSpzcmNfZGVzYyA9ICpzaGFkb3dfc3JjX2Rlc2M7CisKKwkJLyogQnkgZGVmYXVsdCB3ZSBjb3VsZCBpbml0aWFsaXplIHRoZSB0cmFuc2ZlciBjb250ZXh0IHRvIHRoaXMKKwkJICogdmFsdWUKKwkJICovCisJCXNyY19yaW5nLT5wZXJfdHJhbnNmZXJfY29udGV4dFt3cml0ZV9pbmRleF0gPQorCQkJQ0VfU0VORExJU1RfSVRFTV9DVFhUOworCisJCXdyaXRlX2luZGV4ID0gQ0VfUklOR19JRFhfSU5DUihuZW50cmllc19tYXNrLCB3cml0ZV9pbmRleCk7CisKKwkJc3JjX2Rlc2MgPSBDRV9TUkNfUklOR19UT19ERVNDKHNyY19yaW5nX2Jhc2UsIHdyaXRlX2luZGV4KTsKKwkJc2hhZG93X3NyY19kZXNjID0gQ0VfU1JDX1JJTkdfVE9fREVTQyhzaGFkb3dfYmFzZSwgd3JpdGVfaW5kZXgpOworCQkvKgorCQkgKiBOb3cgZmlsbCBvdXQgdGhlIHJpbmcgZGVzY3JpcHRvciBmb3IgdGhlIGFjdHVhbCBkYXRhCisJCSAqIHBhY2tldAorCQkgKi8KKwkJZG1hX2FkZHIgPSBjZGZfbmJ1Zl9nZXRfZnJhZ19wYWRkcl9sbyhtc2R1LCAxKTsKKwkJc2hhZG93X3NyY19kZXNjLT5idWZmZXJfYWRkciA9ICh1aW50MzJfdCkoZG1hX2FkZHIgJgorCQkJCQkJCSAgMHhGRkZGRkZGRik7CisJCS8qCisJCSAqIENsZWFyIHBhY2tldCBvZmZzZXQgZm9yIGFsbCBidXQgdGhlIGZpcnN0IENFIGRlc2MuCisJCSAqLworCQl1c2VyX2ZsYWdzICY9IH5DREZfQ0VfVFhfUEtUX09GRlNFVF9CSVRfTTsKKwkJY2VfYnVmZmVyX2FkZHJfaGlfc2V0KHNoYWRvd19zcmNfZGVzYywgZG1hX2FkZHIsIHVzZXJfZmxhZ3MpOworCQlzaGFkb3dfc3JjX2Rlc2MtPm1ldGFfZGF0YSA9IHRyYW5zZmVyX2lkOworCisJCS8qIGdldCBhY3R1YWwgcGFja2V0IGxlbmd0aCAqLworCQlmcmFnX2xlbiA9IGNkZl9uYnVmX2dldF9mcmFnX2xlbihtc2R1LCAxKTsKKwkJc2hhZG93X3NyY19kZXNjLT5uYnl0ZXMgPSBmcmFnX2xlbiA+IGNlX3N0YXRlLT5kb3dubG9hZF9sZW4gPworCQkJY2Vfc3RhdGUtPmRvd25sb2FkX2xlbiA6IGZyYWdfbGVuOworCisJCS8qICBEYXRhIHBhY2tldCBpcyBhIGJ5dGUgc3RyZWFtLCBzbyBkaXNhYmxlIGJ5dGUgc3dhcCAqLworCQlzaGFkb3dfc3JjX2Rlc2MtPmJ5dGVfc3dhcCA9IDA7CisJCS8qIEZvciB0aGUgbGFzdCBvbmUsIGdhdGhlciBpcyBub3Qgc2V0ICovCisJCXNoYWRvd19zcmNfZGVzYy0+Z2F0aGVyICAgID0gMDsKKwkJKnNyY19kZXNjID0gKnNoYWRvd19zcmNfZGVzYzsKKwkJc3JjX3JpbmctPnBlcl90cmFuc2Zlcl9jb250ZXh0W3dyaXRlX2luZGV4XSA9IG1zZHU7CisJCXdyaXRlX2luZGV4ID0gQ0VfUklOR19JRFhfSU5DUihuZW50cmllc19tYXNrLCB3cml0ZV9pbmRleCk7CisJfQorCisJLyogV3JpdGUgdGhlIGZpbmFsIGluZGV4IHRvIGgvdyBvbmUtc2hvdCAqLworCWlmIChpKSB7CisJCXNyY19yaW5nLT53cml0ZV9pbmRleCA9IHdyaXRlX2luZGV4OworCQkvKiBEb24ndCBjYWxsIFdBUl9YWFggZnJvbSBoZXJlCisJCSAqIEp1c3QgY2FsbCBYWFggaW5zdGVhZCwgdGhhdCBoYXMgdGhlIHJlcWQuIGludGVsCisJCSAqLworCQl3YXJfY2Vfc3JjX3Jpbmdfd3JpdGVfaWR4X3NldChzY24sIGN0cmxfYWRkciwgd3JpdGVfaW5kZXgpOworCX0KKworCWNkZl9zcGluX3VubG9ja19iaCgmc2NuLT50YXJnZXRfbG9jayk7CisKKwkvKgorCSAqIElmIGFsbCBwYWNrZXRzIGluIHRoZSBhcnJheSBhcmUgdHJhbnNtaXR0ZWQsCisJICogaSA9IG51bV9tc2R1cworCSAqIFRlbXBvcmFyaWx5IGFkZCBhbiBBU1NFUlQKKwkgKi8KKwlBU1NFUlQoaSA9PSBudW1fbXNkdXMpOworCXJldHVybiBpOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9GQVNUUEFUSCAqLworCitpbnQKK2NlX3JlY3ZfYnVmX2VucXVldWUoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJICAgIHZvaWQgKnBlcl9yZWN2X2NvbnRleHQsIGNkZl9kbWFfYWRkcl90IGJ1ZmZlcikKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGUgPSAoc3RydWN0IENFX3N0YXRlICopY29weWVuZzsKKwlzdHJ1Y3QgQ0VfcmluZ19zdGF0ZSAqZGVzdF9yaW5nID0gQ0Vfc3RhdGUtPmRlc3RfcmluZzsKKwl1aW50MzJfdCBjdHJsX2FkZHIgPSBDRV9zdGF0ZS0+Y3RybF9hZGRyOworCXVuc2lnbmVkIGludCBuZW50cmllc19tYXNrID0gZGVzdF9yaW5nLT5uZW50cmllc19tYXNrOworCXVuc2lnbmVkIGludCB3cml0ZV9pbmRleDsKKwl1bnNpZ25lZCBpbnQgc3dfaW5kZXg7CisJaW50IHZhbCA9IDA7CisJdWludDY0X3QgZG1hX2FkZHIgPSBidWZmZXI7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBDRV9zdGF0ZS0+c2NuOworCisJY2RmX3NwaW5fbG9ja19iaCgmc2NuLT50YXJnZXRfbG9jayk7CisJd3JpdGVfaW5kZXggPSBkZXN0X3JpbmctPndyaXRlX2luZGV4OworCXN3X2luZGV4ID0gZGVzdF9yaW5nLT5zd19pbmRleDsKKworCUFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVRfRVhUKHNjbiwgdmFsKTsKKwlpZiAodmFsID09IC0xKSB7CisJCWNkZl9zcGluX3VubG9ja19iaCgmc2NuLT50YXJnZXRfbG9jayk7CisJCXJldHVybiB2YWw7CisJfQorCisJaWYgKENFX1JJTkdfREVMVEEobmVudHJpZXNfbWFzaywgd3JpdGVfaW5kZXgsIHN3X2luZGV4IC0gMSkgPiAwKSB7CisJCXN0cnVjdCBDRV9kZXN0X2Rlc2MgKmRlc3RfcmluZ19iYXNlID0KKwkJCShzdHJ1Y3QgQ0VfZGVzdF9kZXNjICopZGVzdF9yaW5nLT4KKwkJCSAgICBiYXNlX2FkZHJfb3duZXJfc3BhY2U7CisJCXN0cnVjdCBDRV9kZXN0X2Rlc2MgKmRlc3RfZGVzYyA9CisJCQlDRV9ERVNUX1JJTkdfVE9fREVTQyhkZXN0X3JpbmdfYmFzZSwgd3JpdGVfaW5kZXgpOworCisJCS8qIFVwZGF0ZSBsb3cgMzIgYml0IGRlc3RpbmF0aW9uIGRlc2NyaXB0b3IgKi8KKwkJZGVzdF9kZXNjLT5idWZmZXJfYWRkciA9ICh1aW50MzJfdCkoZG1hX2FkZHIgJiAweEZGRkZGRkZGKTsKKyNpZmRlZiBRQ0FfV0lGSV8zXzAKKwkJZGVzdF9kZXNjLT5idWZmZXJfYWRkcl9oaSA9CisJCQkodWludDMyX3QpKChkbWFfYWRkciA+PiAzMikgJiAweDFGKTsKKyNlbmRpZgorCQlkZXN0X2Rlc2MtPm5ieXRlcyA9IDA7CisKKwkJZGVzdF9yaW5nLT5wZXJfdHJhbnNmZXJfY29udGV4dFt3cml0ZV9pbmRleF0gPQorCQkJcGVyX3JlY3ZfY29udGV4dDsKKworCQkvKiBVcGRhdGUgRGVzdGluYXRpb24gUmluZyBXcml0ZSBJbmRleCAqLworCQl3cml0ZV9pbmRleCA9IENFX1JJTkdfSURYX0lOQ1IobmVudHJpZXNfbWFzaywgd3JpdGVfaW5kZXgpOworCQlDRV9ERVNUX1JJTkdfV1JJVEVfSURYX1NFVChzY24sIGN0cmxfYWRkciwgd3JpdGVfaW5kZXgpOworCQlkZXN0X3JpbmctPndyaXRlX2luZGV4ID0gd3JpdGVfaW5kZXg7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJQV9UQVJHRVRfQUNDRVNTX0VORF9SRVRfRVhUKHNjbiwgdmFsKTsKKwlpZiAodmFsID09IC0xKSB7CisJCWNkZl9zcGluX3VubG9ja19iaCgmc2NuLT50YXJnZXRfbG9jayk7CisJCXJldHVybiB2YWw7CisJfQorCisJY2RmX3NwaW5fdW5sb2NrX2JoKCZzY24tPnRhcmdldF9sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK2NlX3NlbmRfd2F0ZXJtYXJrc19zZXQoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJICAgICAgIHVuc2lnbmVkIGludCBsb3dfYWxlcnRfbmVudHJpZXMsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgaGlnaF9hbGVydF9uZW50cmllcykKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWNvcHllbmc7CisJdWludDMyX3QgY3RybF9hZGRyID0gQ0Vfc3RhdGUtPmN0cmxfYWRkcjsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IENFX3N0YXRlLT5zY247CisKKwljZGZfc3Bpbl9sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKKwlDRV9TUkNfUklOR19MT1dNQVJLX1NFVChzY24sIGN0cmxfYWRkciwgbG93X2FsZXJ0X25lbnRyaWVzKTsKKwlDRV9TUkNfUklOR19ISUdITUFSS19TRVQoc2NuLCBjdHJsX2FkZHIsIGhpZ2hfYWxlcnRfbmVudHJpZXMpOworCWNkZl9zcGluX3VubG9jaygmc2NuLT50YXJnZXRfbG9jayk7Cit9CisKK3ZvaWQKK2NlX3JlY3Zfd2F0ZXJtYXJrc19zZXQoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJICAgICAgIHVuc2lnbmVkIGludCBsb3dfYWxlcnRfbmVudHJpZXMsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgaGlnaF9hbGVydF9uZW50cmllcykKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWNvcHllbmc7CisJdWludDMyX3QgY3RybF9hZGRyID0gQ0Vfc3RhdGUtPmN0cmxfYWRkcjsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IENFX3N0YXRlLT5zY247CisKKwljZGZfc3Bpbl9sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKKwlDRV9ERVNUX1JJTkdfTE9XTUFSS19TRVQoc2NuLCBjdHJsX2FkZHIsCisJCQkJbG93X2FsZXJ0X25lbnRyaWVzKTsKKwlDRV9ERVNUX1JJTkdfSElHSE1BUktfU0VUKHNjbiwgY3RybF9hZGRyLAorCQkJCWhpZ2hfYWxlcnRfbmVudHJpZXMpOworCWNkZl9zcGluX3VubG9jaygmc2NuLT50YXJnZXRfbG9jayk7Cit9CisKK3Vuc2lnbmVkIGludCBjZV9zZW5kX2VudHJpZXNfYXZhaWwoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZykKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWNvcHllbmc7CisJc3RydWN0IENFX3Jpbmdfc3RhdGUgKnNyY19yaW5nID0gQ0Vfc3RhdGUtPnNyY19yaW5nOworCXVuc2lnbmVkIGludCBuZW50cmllc19tYXNrID0gc3JjX3JpbmctPm5lbnRyaWVzX21hc2s7CisJdW5zaWduZWQgaW50IHN3X2luZGV4OworCXVuc2lnbmVkIGludCB3cml0ZV9pbmRleDsKKworCWNkZl9zcGluX2xvY2soJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKKwlzd19pbmRleCA9IHNyY19yaW5nLT5zd19pbmRleDsKKwl3cml0ZV9pbmRleCA9IHNyY19yaW5nLT53cml0ZV9pbmRleDsKKwljZGZfc3Bpbl91bmxvY2soJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKKworCXJldHVybiBDRV9SSU5HX0RFTFRBKG5lbnRyaWVzX21hc2ssIHdyaXRlX2luZGV4LCBzd19pbmRleCAtIDEpOworfQorCit1bnNpZ25lZCBpbnQgY2VfcmVjdl9lbnRyaWVzX2F2YWlsKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcpCit7CisJc3RydWN0IENFX3N0YXRlICpDRV9zdGF0ZSA9IChzdHJ1Y3QgQ0Vfc3RhdGUgKiljb3B5ZW5nOworCXN0cnVjdCBDRV9yaW5nX3N0YXRlICpkZXN0X3JpbmcgPSBDRV9zdGF0ZS0+ZGVzdF9yaW5nOworCXVuc2lnbmVkIGludCBuZW50cmllc19tYXNrID0gZGVzdF9yaW5nLT5uZW50cmllc19tYXNrOworCXVuc2lnbmVkIGludCBzd19pbmRleDsKKwl1bnNpZ25lZCBpbnQgd3JpdGVfaW5kZXg7CisKKwljZGZfc3Bpbl9sb2NrKCZDRV9zdGF0ZS0+c2NuLT50YXJnZXRfbG9jayk7CisJc3dfaW5kZXggPSBkZXN0X3JpbmctPnN3X2luZGV4OworCXdyaXRlX2luZGV4ID0gZGVzdF9yaW5nLT53cml0ZV9pbmRleDsKKwljZGZfc3Bpbl91bmxvY2soJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKKworCXJldHVybiBDRV9SSU5HX0RFTFRBKG5lbnRyaWVzX21hc2ssIHdyaXRlX2luZGV4LCBzd19pbmRleCAtIDEpOworfQorCisvKgorICogR3V0cyBvZiBjZV9zZW5kX2VudHJpZXNfZG9uZS4KKyAqIFRoZSBjYWxsZXIgdGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIGFueSBuZWNlc3NhcnkgbG9ja2luZy4KKyAqLwordW5zaWduZWQgaW50CitjZV9zZW5kX2VudHJpZXNfZG9uZV9ub2xvY2soc3RydWN0IG9sX3NvZnRjICpzY24sCisJCQkgICAgc3RydWN0IENFX3N0YXRlICpDRV9zdGF0ZSkKK3sKKwlzdHJ1Y3QgQ0VfcmluZ19zdGF0ZSAqc3JjX3JpbmcgPSBDRV9zdGF0ZS0+c3JjX3Jpbmc7CisJdWludDMyX3QgY3RybF9hZGRyID0gQ0Vfc3RhdGUtPmN0cmxfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbmVudHJpZXNfbWFzayA9IHNyY19yaW5nLT5uZW50cmllc19tYXNrOworCXVuc2lnbmVkIGludCBzd19pbmRleDsKKwl1bnNpZ25lZCBpbnQgcmVhZF9pbmRleDsKKworCXN3X2luZGV4ID0gc3JjX3JpbmctPnN3X2luZGV4OworCXJlYWRfaW5kZXggPSBDRV9TUkNfUklOR19SRUFEX0lEWF9HRVQoc2NuLCBjdHJsX2FkZHIpOworCisJcmV0dXJuIENFX1JJTkdfREVMVEEobmVudHJpZXNfbWFzaywgc3dfaW5kZXgsIHJlYWRfaW5kZXgpOworfQorCit1bnNpZ25lZCBpbnQgY2Vfc2VuZF9lbnRyaWVzX2RvbmUoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZykKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWNvcHllbmc7CisJdW5zaWduZWQgaW50IG5lbnRyaWVzOworCisJY2RmX3NwaW5fbG9jaygmQ0Vfc3RhdGUtPnNjbi0+dGFyZ2V0X2xvY2spOworCW5lbnRyaWVzID0gY2Vfc2VuZF9lbnRyaWVzX2RvbmVfbm9sb2NrKENFX3N0YXRlLT5zY24sIENFX3N0YXRlKTsKKwljZGZfc3Bpbl91bmxvY2soJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKKworCXJldHVybiBuZW50cmllczsKK30KKworLyoKKyAqIEd1dHMgb2YgY2VfcmVjdl9lbnRyaWVzX2RvbmUuCisgKiBUaGUgY2FsbGVyIHRha2VzIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgbmVjZXNzYXJ5IGxvY2tpbmcuCisgKi8KK3Vuc2lnbmVkIGludAorY2VfcmVjdl9lbnRyaWVzX2RvbmVfbm9sb2NrKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLAorCQkJICAgIHN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGUpCit7CisJc3RydWN0IENFX3Jpbmdfc3RhdGUgKmRlc3RfcmluZyA9IENFX3N0YXRlLT5kZXN0X3Jpbmc7CisJdWludDMyX3QgY3RybF9hZGRyID0gQ0Vfc3RhdGUtPmN0cmxfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbmVudHJpZXNfbWFzayA9IGRlc3RfcmluZy0+bmVudHJpZXNfbWFzazsKKwl1bnNpZ25lZCBpbnQgc3dfaW5kZXg7CisJdW5zaWduZWQgaW50IHJlYWRfaW5kZXg7CisKKwlzd19pbmRleCA9IGRlc3RfcmluZy0+c3dfaW5kZXg7CisJcmVhZF9pbmRleCA9IENFX0RFU1RfUklOR19SRUFEX0lEWF9HRVQoc2NuLCBjdHJsX2FkZHIpOworCisJcmV0dXJuIENFX1JJTkdfREVMVEEobmVudHJpZXNfbWFzaywgc3dfaW5kZXgsIHJlYWRfaW5kZXgpOworfQorCit1bnNpZ25lZCBpbnQgY2VfcmVjdl9lbnRyaWVzX2RvbmUoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZykKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWNvcHllbmc7CisJdW5zaWduZWQgaW50IG5lbnRyaWVzOworCisJY2RmX3NwaW5fbG9jaygmQ0Vfc3RhdGUtPnNjbi0+dGFyZ2V0X2xvY2spOworCW5lbnRyaWVzID0gY2VfcmVjdl9lbnRyaWVzX2RvbmVfbm9sb2NrKENFX3N0YXRlLT5zY24sIENFX3N0YXRlKTsKKwljZGZfc3Bpbl91bmxvY2soJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKKworCXJldHVybiBuZW50cmllczsKK30KKworLyogRGVidWcgc3VwcG9ydCAqLwordm9pZCAqY2VfZGVidWdfY21wbHJuX2NvbnRleHQ7ICAvKiBjb21wbGV0ZWQgcmVjdiBuZXh0IGNvbnRleHQgKi8KK3ZvaWQgKmNlX2RlYnVnX2NuY2xzbl9jb250ZXh0OyAgLyogY2FuY2VsIHNlbmQgbmV4dCBjb250ZXh0ICovCit2b2lkICpjZV9kZWJ1Z19ydmtybl9jb250ZXh0OyAgIC8qIHJldm9rZSByZWNlaXZlIG5leHQgY29udGV4dCAqLwordm9pZCAqY2VfZGVidWdfY21wbHNuX2NvbnRleHQ7ICAvKiBjb21wbGV0ZWQgc2VuZCBuZXh0IGNvbnRleHQgKi8KKworLyoKKyAqIEd1dHMgb2YgY2VfY29tcGxldGVkX3JlY3ZfbmV4dC4KKyAqIFRoZSBjYWxsZXIgdGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIGFueSBuZWNlc3NhcnkgbG9ja2luZy4KKyAqLworaW50CitjZV9jb21wbGV0ZWRfcmVjdl9uZXh0X25vbG9jayhzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlLAorCQkJICAgICAgdm9pZCAqKnBlcl9DRV9jb250ZXh0cCwKKwkJCSAgICAgIHZvaWQgKipwZXJfdHJhbnNmZXJfY29udGV4dHAsCisJCQkgICAgICBjZGZfZG1hX2FkZHJfdCAqYnVmZmVycCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqbmJ5dGVzcCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqdHJhbnNmZXJfaWRwLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpmbGFnc3ApCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgQ0VfcmluZ19zdGF0ZSAqZGVzdF9yaW5nID0gQ0Vfc3RhdGUtPmRlc3RfcmluZzsKKwl1bnNpZ25lZCBpbnQgbmVudHJpZXNfbWFzayA9IGRlc3RfcmluZy0+bmVudHJpZXNfbWFzazsKKwl1bnNpZ25lZCBpbnQgc3dfaW5kZXggPSBkZXN0X3JpbmctPnN3X2luZGV4OworCisJc3RydWN0IENFX2Rlc3RfZGVzYyAqZGVzdF9yaW5nX2Jhc2UgPQorCQkoc3RydWN0IENFX2Rlc3RfZGVzYyAqKWRlc3RfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlOworCXN0cnVjdCBDRV9kZXN0X2Rlc2MgKmRlc3RfZGVzYyA9CisJCUNFX0RFU1RfUklOR19UT19ERVNDKGRlc3RfcmluZ19iYXNlLCBzd19pbmRleCk7CisJaW50IG5ieXRlczsKKwlzdHJ1Y3QgQ0VfZGVzdF9kZXNjIGRlc3RfZGVzY19pbmZvOworCS8qCisJICogQnkgY29weWluZyB0aGUgZGVzdF9kZXNjX2luZm8gZWxlbWVudCB0byBsb2NhbCBtZW1vcnksIHdlIGNvdWxkCisJICogYXZvaWQgZXh0cmEgbWVtb3J5IHJlYWQgZnJvbSBub24tY2FjaGFibGUgbWVtb3J5LgorCSAqLworCWRlc3RfZGVzY19pbmZvID0gICpkZXN0X2Rlc2M7CisJbmJ5dGVzID0gZGVzdF9kZXNjX2luZm8ubmJ5dGVzOworCWlmIChuYnl0ZXMgPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIGNsb3NlcyBhIHJlbGF0aXZlbHkgdW51c3VhbCByYWNlIHdoZXJlIHRoZSBIb3N0CisJCSAqIHNlZXMgdGhlIHVwZGF0ZWQgRFJSSSBiZWZvcmUgdGhlIHVwZGF0ZSB0byB0aGUKKwkJICogY29ycmVzcG9uZGluZyBkZXNjcmlwdG9yIGhhcyBjb21wbGV0ZWQuIFdlIHRyZWF0IHRoaXMKKwkJICogYXMgYSBkZXNjcmlwdG9yIHRoYXQgaXMgbm90IHlldCBkb25lLgorCQkgKi8KKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkZXN0X2Rlc2MtPm5ieXRlcyA9IDA7CisKKwkvKiBSZXR1cm4gZGF0YSBmcm9tIGNvbXBsZXRlZCBkZXN0aW5hdGlvbiBkZXNjcmlwdG9yICovCisJKmJ1ZmZlcnAgPSBISUZfQ0VfREVTQ19BRERSX1RPX0RNQSgmZGVzdF9kZXNjX2luZm8pOworCSpuYnl0ZXNwID0gbmJ5dGVzOworCSp0cmFuc2Zlcl9pZHAgPSBkZXN0X2Rlc2NfaW5mby5tZXRhX2RhdGE7CisJKmZsYWdzcCA9IChkZXN0X2Rlc2NfaW5mby5ieXRlX3N3YXApID8gQ0VfUkVDVl9GTEFHX1NXQVBQRUQgOiAwOworCisJaWYgKHBlcl9DRV9jb250ZXh0cCkgeworCQkqcGVyX0NFX2NvbnRleHRwID0gQ0Vfc3RhdGUtPnJlY3ZfY29udGV4dDsKKwl9CisKKwljZV9kZWJ1Z19jbXBscm5fY29udGV4dCA9IGRlc3RfcmluZy0+cGVyX3RyYW5zZmVyX2NvbnRleHRbc3dfaW5kZXhdOworCWlmIChwZXJfdHJhbnNmZXJfY29udGV4dHApIHsKKwkJKnBlcl90cmFuc2Zlcl9jb250ZXh0cCA9IGNlX2RlYnVnX2NtcGxybl9jb250ZXh0OworCX0KKwlkZXN0X3JpbmctPnBlcl90cmFuc2Zlcl9jb250ZXh0W3N3X2luZGV4XSA9IDA7ICAvKiBzYW5pdHkgKi8KKworCS8qIFVwZGF0ZSBzd19pbmRleCAqLworCXN3X2luZGV4ID0gQ0VfUklOR19JRFhfSU5DUihuZW50cmllc19tYXNrLCBzd19pbmRleCk7CisJZGVzdF9yaW5nLT5zd19pbmRleCA9IHN3X2luZGV4OworCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworZG9uZToKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK2NlX2NvbXBsZXRlZF9yZWN2X25leHQoc3RydWN0IENFX2hhbmRsZSAqY29weWVuZywKKwkJICAgICAgIHZvaWQgKipwZXJfQ0VfY29udGV4dHAsCisJCSAgICAgICB2b2lkICoqcGVyX3RyYW5zZmVyX2NvbnRleHRwLAorCQkgICAgICAgY2RmX2RtYV9hZGRyX3QgKmJ1ZmZlcnAsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKm5ieXRlc3AsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKnRyYW5zZmVyX2lkcCwgdW5zaWduZWQgaW50ICpmbGFnc3ApCit7CisJc3RydWN0IENFX3N0YXRlICpDRV9zdGF0ZSA9IChzdHJ1Y3QgQ0Vfc3RhdGUgKiljb3B5ZW5nOworCWludCBzdGF0dXM7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZDRV9zdGF0ZS0+c2NuLT50YXJnZXRfbG9jayk7CisJc3RhdHVzID0KKwkJY2VfY29tcGxldGVkX3JlY3ZfbmV4dF9ub2xvY2soQ0Vfc3RhdGUsIHBlcl9DRV9jb250ZXh0cCwKKwkJCQkJICAgICAgcGVyX3RyYW5zZmVyX2NvbnRleHRwLCBidWZmZXJwLAorCQkJCQkgICAgICBuYnl0ZXNwLCB0cmFuc2Zlcl9pZHAsIGZsYWdzcCk7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZDRV9zdGF0ZS0+c2NuLT50YXJnZXRfbG9jayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBOQjogTW9kZWxlZCBhZnRlciBjZV9jb21wbGV0ZWRfcmVjdl9uZXh0X25vbG9jayAqLworQ0RGX1NUQVRVUworY2VfcmV2b2tlX3JlY3ZfbmV4dChzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLAorCQkgICAgdm9pZCAqKnBlcl9DRV9jb250ZXh0cCwKKwkJICAgIHZvaWQgKipwZXJfdHJhbnNmZXJfY29udGV4dHAsIGNkZl9kbWFfYWRkcl90ICpidWZmZXJwKQoreworCXN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGU7CisJc3RydWN0IENFX3Jpbmdfc3RhdGUgKmRlc3RfcmluZzsKKwl1bnNpZ25lZCBpbnQgbmVudHJpZXNfbWFzazsKKwl1bnNpZ25lZCBpbnQgc3dfaW5kZXg7CisJdW5zaWduZWQgaW50IHdyaXRlX2luZGV4OworCUNERl9TVEFUVVMgc3RhdHVzOworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuOworCisJQ0Vfc3RhdGUgPSAoc3RydWN0IENFX3N0YXRlICopY29weWVuZzsKKwlkZXN0X3JpbmcgPSBDRV9zdGF0ZS0+ZGVzdF9yaW5nOworCWlmICghZGVzdF9yaW5nKSB7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlzY24gPSBDRV9zdGF0ZS0+c2NuOworCWNkZl9zcGluX2xvY2soJnNjbi0+dGFyZ2V0X2xvY2spOworCW5lbnRyaWVzX21hc2sgPSBkZXN0X3JpbmctPm5lbnRyaWVzX21hc2s7CisJc3dfaW5kZXggPSBkZXN0X3JpbmctPnN3X2luZGV4OworCXdyaXRlX2luZGV4ID0gZGVzdF9yaW5nLT53cml0ZV9pbmRleDsKKwlpZiAod3JpdGVfaW5kZXggIT0gc3dfaW5kZXgpIHsKKwkJc3RydWN0IENFX2Rlc3RfZGVzYyAqZGVzdF9yaW5nX2Jhc2UgPQorCQkJKHN0cnVjdCBDRV9kZXN0X2Rlc2MgKilkZXN0X3JpbmctPgorCQkJICAgIGJhc2VfYWRkcl9vd25lcl9zcGFjZTsKKwkJc3RydWN0IENFX2Rlc3RfZGVzYyAqZGVzdF9kZXNjID0KKwkJCUNFX0RFU1RfUklOR19UT19ERVNDKGRlc3RfcmluZ19iYXNlLCBzd19pbmRleCk7CisKKwkJLyogUmV0dXJuIGRhdGEgZnJvbSBjb21wbGV0ZWQgZGVzdGluYXRpb24gZGVzY3JpcHRvciAqLworCQkqYnVmZmVycCA9IEhJRl9DRV9ERVNDX0FERFJfVE9fRE1BKGRlc3RfZGVzYyk7CisKKwkJaWYgKHBlcl9DRV9jb250ZXh0cCkgeworCQkJKnBlcl9DRV9jb250ZXh0cCA9IENFX3N0YXRlLT5yZWN2X2NvbnRleHQ7CisJCX0KKworCQljZV9kZWJ1Z19ydmtybl9jb250ZXh0ID0KKwkJCWRlc3RfcmluZy0+cGVyX3RyYW5zZmVyX2NvbnRleHRbc3dfaW5kZXhdOworCQlpZiAocGVyX3RyYW5zZmVyX2NvbnRleHRwKSB7CisJCQkqcGVyX3RyYW5zZmVyX2NvbnRleHRwID0gY2VfZGVidWdfcnZrcm5fY29udGV4dDsKKwkJfQorCQlkZXN0X3JpbmctPnBlcl90cmFuc2Zlcl9jb250ZXh0W3N3X2luZGV4XSA9IDA7ICAvKiBzYW5pdHkgKi8KKworCQkvKiBVcGRhdGUgc3dfaW5kZXggKi8KKwkJc3dfaW5kZXggPSBDRV9SSU5HX0lEWF9JTkNSKG5lbnRyaWVzX21hc2ssIHN3X2luZGV4KTsKKwkJZGVzdF9yaW5nLT5zd19pbmRleCA9IHN3X2luZGV4OworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWNkZl9zcGluX3VubG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogR3V0cyBvZiBjZV9jb21wbGV0ZWRfc2VuZF9uZXh0LgorICogVGhlIGNhbGxlciB0YWtlcyByZXNwb25zaWJpbGl0eSBmb3IgYW55IG5lY2Vzc2FyeSBsb2NraW5nLgorICovCitpbnQKK2NlX2NvbXBsZXRlZF9zZW5kX25leHRfbm9sb2NrKHN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGUsCisJCQkgICAgICB2b2lkICoqcGVyX0NFX2NvbnRleHRwLAorCQkJICAgICAgdm9pZCAqKnBlcl90cmFuc2Zlcl9jb250ZXh0cCwKKwkJCSAgICAgIGNkZl9kbWFfYWRkcl90ICpidWZmZXJwLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpuYnl0ZXNwLAorCQkJICAgICAgdW5zaWduZWQgaW50ICp0cmFuc2Zlcl9pZHAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnN3X2lkeCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqaHdfaWR4LAorCQkJICAgICAgdWludDMyX3QgKnRvZXBsaXR6X2hhc2hfcmVzdWx0KQoreworCWludCBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwlzdHJ1Y3QgQ0VfcmluZ19zdGF0ZSAqc3JjX3JpbmcgPSBDRV9zdGF0ZS0+c3JjX3Jpbmc7CisJdWludDMyX3QgY3RybF9hZGRyID0gQ0Vfc3RhdGUtPmN0cmxfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbmVudHJpZXNfbWFzayA9IHNyY19yaW5nLT5uZW50cmllc19tYXNrOworCXVuc2lnbmVkIGludCBzd19pbmRleCA9IHNyY19yaW5nLT5zd19pbmRleDsKKwl1bnNpZ25lZCBpbnQgcmVhZF9pbmRleDsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IENFX3N0YXRlLT5zY247CisKKwlpZiAoc3JjX3JpbmctPmh3X2luZGV4ID09IHN3X2luZGV4KSB7CisJCS8qCisJCSAqIFRoZSBTVyBjb21wbGV0aW9uIGluZGV4IGhhcyBjYXVnaHQgdXAgd2l0aCB0aGUgY2FjaGVkCisJCSAqIHZlcnNpb24gb2YgdGhlIEhXIGNvbXBsZXRpb24gaW5kZXguCisJCSAqIFVwZGF0ZSB0aGUgY2FjaGVkIEhXIGNvbXBsZXRpb24gaW5kZXggdG8gc2VlIHdoZXRoZXIKKwkJICogdGhlIFNXIGhhcyByZWFsbHkgY2F1Z2h0IHVwIHRvIHRoZSBIVywgb3IgaWYgdGhlIGNhY2hlZAorCQkgKiB2YWx1ZSBvZiB0aGUgSFcgaW5kZXggaGFzIGJlY29tZSBzdGFsZS4KKwkJICovCisJCUFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVQoc2NuKTsKKwkJc3JjX3JpbmctPmh3X2luZGV4ID0KKwkJCUNFX1NSQ19SSU5HX1JFQURfSURYX0dFVChzY24sIGN0cmxfYWRkcik7CisJCUFfVEFSR0VUX0FDQ0VTU19FTkRfUkVUKHNjbik7CisJfQorCXJlYWRfaW5kZXggPSBzcmNfcmluZy0+aHdfaW5kZXg7CisKKwlpZiAoc3dfaWR4KQorCQkqc3dfaWR4ID0gc3dfaW5kZXg7CisKKwlpZiAoaHdfaWR4KQorCQkqaHdfaWR4ID0gcmVhZF9pbmRleDsKKworCWlmICgocmVhZF9pbmRleCAhPSBzd19pbmRleCkgJiYgKHJlYWRfaW5kZXggIT0gMHhmZmZmZmZmZikpIHsKKwkJc3RydWN0IENFX3NyY19kZXNjICpzaGFkb3dfYmFzZSA9CisJCQkoc3RydWN0IENFX3NyY19kZXNjICopc3JjX3JpbmctPnNoYWRvd19iYXNlOworCQlzdHJ1Y3QgQ0Vfc3JjX2Rlc2MgKnNoYWRvd19zcmNfZGVzYyA9CisJCQlDRV9TUkNfUklOR19UT19ERVNDKHNoYWRvd19iYXNlLCBzd19pbmRleCk7CisjaWZkZWYgUUNBX1dJRklfM18wCisJCXN0cnVjdCBDRV9zcmNfZGVzYyAqc3JjX3JpbmdfYmFzZSA9CisJCQkoc3RydWN0IENFX3NyY19kZXNjICopc3JjX3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZTsKKwkJc3RydWN0IENFX3NyY19kZXNjICpzcmNfZGVzYyA9CisJCQlDRV9TUkNfUklOR19UT19ERVNDKHNyY19yaW5nX2Jhc2UsIHN3X2luZGV4KTsKKyNlbmRpZgorCQkvKiBSZXR1cm4gZGF0YSBmcm9tIGNvbXBsZXRlZCBzb3VyY2UgZGVzY3JpcHRvciAqLworCQkqYnVmZmVycCA9IEhJRl9DRV9ERVNDX0FERFJfVE9fRE1BKHNoYWRvd19zcmNfZGVzYyk7CisJCSpuYnl0ZXNwID0gc2hhZG93X3NyY19kZXNjLT5uYnl0ZXM7CisJCSp0cmFuc2Zlcl9pZHAgPSBzaGFkb3dfc3JjX2Rlc2MtPm1ldGFfZGF0YTsKKyNpZmRlZiBRQ0FfV0lGSV8zXzAKKwkJKnRvZXBsaXR6X2hhc2hfcmVzdWx0ID0gc3JjX2Rlc2MtPnRvZXBsaXR6X2hhc2hfcmVzdWx0OworI2Vsc2UKKwkJKnRvZXBsaXR6X2hhc2hfcmVzdWx0ID0gMDsKKyNlbmRpZgorCQlpZiAocGVyX0NFX2NvbnRleHRwKSB7CisJCQkqcGVyX0NFX2NvbnRleHRwID0gQ0Vfc3RhdGUtPnNlbmRfY29udGV4dDsKKwkJfQorCisJCWNlX2RlYnVnX2NtcGxzbl9jb250ZXh0ID0KKwkJCXNyY19yaW5nLT5wZXJfdHJhbnNmZXJfY29udGV4dFtzd19pbmRleF07CisJCWlmIChwZXJfdHJhbnNmZXJfY29udGV4dHApIHsKKwkJCSpwZXJfdHJhbnNmZXJfY29udGV4dHAgPSBjZV9kZWJ1Z19jbXBsc25fY29udGV4dDsKKwkJfQorCQlzcmNfcmluZy0+cGVyX3RyYW5zZmVyX2NvbnRleHRbc3dfaW5kZXhdID0gMDsgICAvKiBzYW5pdHkgKi8KKworCQkvKiBVcGRhdGUgc3dfaW5kZXggKi8KKwkJc3dfaW5kZXggPSBDRV9SSU5HX0lEWF9JTkNSKG5lbnRyaWVzX21hc2ssIHN3X2luZGV4KTsKKwkJc3JjX3JpbmctPnN3X2luZGV4ID0gc3dfaW5kZXg7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBOQjogTW9kZWxlZCBhZnRlciBjZV9jb21wbGV0ZWRfc2VuZF9uZXh0ICovCitDREZfU1RBVFVTCitjZV9jYW5jZWxfc2VuZF9uZXh0KHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcsCisJCXZvaWQgKipwZXJfQ0VfY29udGV4dHAsCisJCXZvaWQgKipwZXJfdHJhbnNmZXJfY29udGV4dHAsCisJCWNkZl9kbWFfYWRkcl90ICpidWZmZXJwLAorCQl1bnNpZ25lZCBpbnQgKm5ieXRlc3AsCisJCXVuc2lnbmVkIGludCAqdHJhbnNmZXJfaWRwLAorCQl1aW50MzJfdCAqdG9lcGxpdHpfaGFzaF9yZXN1bHQpCit7CisJc3RydWN0IENFX3N0YXRlICpDRV9zdGF0ZTsKKwlzdHJ1Y3QgQ0VfcmluZ19zdGF0ZSAqc3JjX3Jpbmc7CisJdW5zaWduZWQgaW50IG5lbnRyaWVzX21hc2s7CisJdW5zaWduZWQgaW50IHN3X2luZGV4OworCXVuc2lnbmVkIGludCB3cml0ZV9pbmRleDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbjsKKworCUNFX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWNvcHllbmc7CisJc3JjX3JpbmcgPSBDRV9zdGF0ZS0+c3JjX3Jpbmc7CisJaWYgKCFzcmNfcmluZykgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJc2NuID0gQ0Vfc3RhdGUtPnNjbjsKKwljZGZfc3Bpbl9sb2NrKCZDRV9zdGF0ZS0+c2NuLT50YXJnZXRfbG9jayk7CisJbmVudHJpZXNfbWFzayA9IHNyY19yaW5nLT5uZW50cmllc19tYXNrOworCXN3X2luZGV4ID0gc3JjX3JpbmctPnN3X2luZGV4OworCXdyaXRlX2luZGV4ID0gc3JjX3JpbmctPndyaXRlX2luZGV4OworCisJaWYgKHdyaXRlX2luZGV4ICE9IHN3X2luZGV4KSB7CisJCXN0cnVjdCBDRV9zcmNfZGVzYyAqc3JjX3JpbmdfYmFzZSA9CisJCQkoc3RydWN0IENFX3NyY19kZXNjICopc3JjX3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZTsKKwkJc3RydWN0IENFX3NyY19kZXNjICpzcmNfZGVzYyA9CisJCQlDRV9TUkNfUklOR19UT19ERVNDKHNyY19yaW5nX2Jhc2UsIHN3X2luZGV4KTsKKworCQkvKiBSZXR1cm4gZGF0YSBmcm9tIGNvbXBsZXRlZCBzb3VyY2UgZGVzY3JpcHRvciAqLworCQkqYnVmZmVycCA9IEhJRl9DRV9ERVNDX0FERFJfVE9fRE1BKHNyY19kZXNjKTsKKwkJKm5ieXRlc3AgPSBzcmNfZGVzYy0+bmJ5dGVzOworCQkqdHJhbnNmZXJfaWRwID0gc3JjX2Rlc2MtPm1ldGFfZGF0YTsKKyNpZmRlZiBRQ0FfV0lGSV8zXzAKKwkJKnRvZXBsaXR6X2hhc2hfcmVzdWx0ID0gc3JjX2Rlc2MtPnRvZXBsaXR6X2hhc2hfcmVzdWx0OworI2Vsc2UKKwkJKnRvZXBsaXR6X2hhc2hfcmVzdWx0ID0gMDsKKyNlbmRpZgorCisJCWlmIChwZXJfQ0VfY29udGV4dHApIHsKKwkJCSpwZXJfQ0VfY29udGV4dHAgPSBDRV9zdGF0ZS0+c2VuZF9jb250ZXh0OworCQl9CisKKwkJY2VfZGVidWdfY25jbHNuX2NvbnRleHQgPQorCQkJc3JjX3JpbmctPnBlcl90cmFuc2Zlcl9jb250ZXh0W3N3X2luZGV4XTsKKwkJaWYgKHBlcl90cmFuc2Zlcl9jb250ZXh0cCkgeworCQkJKnBlcl90cmFuc2Zlcl9jb250ZXh0cCA9IGNlX2RlYnVnX2NuY2xzbl9jb250ZXh0OworCQl9CisJCXNyY19yaW5nLT5wZXJfdHJhbnNmZXJfY29udGV4dFtzd19pbmRleF0gPSAwOyAgIC8qIHNhbml0eSAqLworCisJCS8qIFVwZGF0ZSBzd19pbmRleCAqLworCQlzd19pbmRleCA9IENFX1JJTkdfSURYX0lOQ1IobmVudHJpZXNfbWFzaywgc3dfaW5kZXgpOworCQlzcmNfcmluZy0+c3dfaW5kZXggPSBzd19pbmRleDsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwljZGZfc3Bpbl91bmxvY2soJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFNoaWZ0IGJpdHMgdG8gY29udmVydCBJU18qX1JJTkdfKl9XQVRFUk1BUktfTUFTSyB0byBDRV9XTV9GTEFHXypfKiAqLworI2RlZmluZSBDRV9XTV9TSEZUIDEKKworaW50CitjZV9jb21wbGV0ZWRfc2VuZF9uZXh0KHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcsCisJCSAgICAgICB2b2lkICoqcGVyX0NFX2NvbnRleHRwLAorCQkgICAgICAgdm9pZCAqKnBlcl90cmFuc2Zlcl9jb250ZXh0cCwKKwkJICAgICAgIGNkZl9kbWFfYWRkcl90ICpidWZmZXJwLAorCQkgICAgICAgdW5zaWduZWQgaW50ICpuYnl0ZXNwLAorCQkgICAgICAgdW5zaWduZWQgaW50ICp0cmFuc2Zlcl9pZHAsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKnN3X2lkeCwKKwkJICAgICAgIHVuc2lnbmVkIGludCAqaHdfaWR4LAorCQkgICAgICAgdW5zaWduZWQgaW50ICp0b2VwbGl0el9oYXNoX3Jlc3VsdCkKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWNvcHllbmc7CisJaW50IHN0YXR1czsKKworCWNkZl9zcGluX2xvY2tfYmgoJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKKwlzdGF0dXMgPQorCQljZV9jb21wbGV0ZWRfc2VuZF9uZXh0X25vbG9jayhDRV9zdGF0ZSwgcGVyX0NFX2NvbnRleHRwLAorCQkJCQkgICAgICBwZXJfdHJhbnNmZXJfY29udGV4dHAsIGJ1ZmZlcnAsCisJCQkJCSAgICAgIG5ieXRlc3AsIHRyYW5zZmVyX2lkcCwgc3dfaWR4LAorCQkJCQkgICAgICBod19pZHgsIHRvZXBsaXR6X2hhc2hfcmVzdWx0KTsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKKy8qIENFIGVuZ2luZSBkZXNjcmlwdG9yIHJlYXAKKyAqIFNpbWlsYXIgdG8gY2VfcGVyX2VuZ2luZV9zZXJ2aWNlICwgT25seSBkaWZmZXJlbmNlIGlzIGNlX3Blcl9lbmdpbmVfc2VydmljZQorICogZG9lcyByZWNpZXZlIGFuZCByZWFwaW5nIG9mIGNvbXBsZXRlZCBkZXNjcmlwdG9yICwKKyAqIFRoaXMgZnVuY3Rpb24gb25seSBoYW5kbGVzIHJlYXBpbmcgb2YgVHggY29tcGxldGUgZGVzY3JpcHRvci4KKyAqIFRoZSBGdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aHJlc2hvbGQgcmVhcCAgcG9sbCByb3V0aW5lCisgKiBoaWZfc2VuZF9jb21wbGV0ZV9jaGVjayBzbyBzaG91bGQgbm90IGNvdW50YWluIHJlY2lldmUgZnVuY3Rpb25hbGl0eQorICogd2l0aGluIGl0IC4KKyAqLworCit2b2lkIGNlX3Blcl9lbmdpbmVfc2VydmljZXJlYXAoc3RydWN0IG9sX3NvZnRjICpzY24sIHVuc2lnbmVkIGludCBDRV9pZCkKK3sKKwl2b2lkICpDRV9jb250ZXh0OworCXZvaWQgKnRyYW5zZmVyX2NvbnRleHQ7CisJY2RmX2RtYV9hZGRyX3QgYnVmOworCXVuc2lnbmVkIGludCBuYnl0ZXM7CisJdW5zaWduZWQgaW50IGlkOworCXVuc2lnbmVkIGludCBzd19pZHgsIGh3X2lkeDsKKwl1aW50MzJfdCB0b2VwbGl0el9oYXNoX3Jlc3VsdDsKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gc2NuLT5jZV9pZF90b19zdGF0ZVtDRV9pZF07CisKKwlBX1RBUkdFVF9BQ0NFU1NfQkVHSU4oc2NuKTsKKworCS8qIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYm90aCB1c2VyIGNvbnRleHQgYW5kCisJICogdGFza2xldCBjb250ZXh0IHRoZSBzcGlubG9jayBoYXMgdG8gbG9jayB0aGUgYm90dG9tIGhhbHZlcy4KKwkgKiBUaGlzIGZpeCBhc3N1bWVzIHRoYXQgQVRIXzExQUNfVFhDT01QQUNUIGZsYWcgaXMgYWx3YXlzCisJICogZW5hYmxlZCBpbiBUWCBwb2xsaW5nIG1vZGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBtb3JlCisJICogYm90dG9tIGhhbHZlIHNwaW4gbG9jayBjaGFuZ2VzIGFyZSBuZWVkZWQuIER1ZSB0byBkYXRhIHBhdGgKKwkgKiBwZXJmb3JtYW5jZSBjb25jZXJuLCBhZnRlciBpbnRlcm5hbCBkaXNjdXNzaW9uIHdlJ3ZlIGRlY2lkZWQKKwkgKiB0byBtYWtlIG1pbmltdW0gY2hhbmdlLCBpLmUuLCBvbmx5IGFkZHJlc3MgdGhlIGlzc3VlIG9jY3VyZWQKKwkgKiBpbiB0aGlzIGZ1bmN0aW9uLiBUaGUgcG9zc2libGUgbmVnYXRpdmUgZWZmZWN0IG9mIHRoaXMgbWluaW11bQorCSAqIGNoYW5nZSBpcyB0aGF0LCBpbiB0aGUgZnV0dXJlLCBpZiBzb21lIG90aGVyIGZ1bmN0aW9uIHdpbGwgYWxzbworCSAqIGJlIG9wZW5lZCB0byBsZXQgdGhlIHVzZXIgY29udGV4dCB0byB1c2UsIHRob3NlIGNhc2VzIG5lZWQgdG8gYmUKKwkgKiBhZGRyZXNzZWQgYnkgY2hhbmdlIHNwaW5fbG9jayB0byBzcGluX2xvY2tfYmggYWxzby4KKwkgKi8KKworCWNkZl9zcGluX2xvY2tfYmgoJnNjbi0+dGFyZ2V0X2xvY2spOworCisJaWYgKENFX3N0YXRlLT5zZW5kX2NiKSB7CisJCXsKKwkJCS8qIFBvcCBjb21wbGV0ZWQgc2VuZCBidWZmZXJzIGFuZCBjYWxsIHRoZQorCQkJICogcmVnaXN0ZXJlZCBzZW5kIGNhbGxiYWNrIGZvciBlYWNoCisJCQkgKi8KKwkJCXdoaWxlIChjZV9jb21wbGV0ZWRfc2VuZF9uZXh0X25vbG9jaworCQkJCSAoQ0Vfc3RhdGUsICZDRV9jb250ZXh0LAorCQkJCSAgJnRyYW5zZmVyX2NvbnRleHQsICZidWYsCisJCQkJICAmbmJ5dGVzLCAmaWQsICZzd19pZHgsICZod19pZHgsCisJCQkJICAmdG9lcGxpdHpfaGFzaF9yZXN1bHQpID09CisJCQkJICBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlpZiAoQ0VfaWQgIT0gQ0VfSFRUX0gyVF9NU0cpIHsKKwkJCQkJY2RmX3NwaW5fdW5sb2NrX2JoKCZzY24tPnRhcmdldF9sb2NrKTsKKwkJCQkJQ0Vfc3RhdGUtPgorCQkJCQlzZW5kX2NiKChzdHJ1Y3QgQ0VfaGFuZGxlICopCisJCQkJCQlDRV9zdGF0ZSwgQ0VfY29udGV4dCwKKwkJCQkJCXRyYW5zZmVyX2NvbnRleHQsIGJ1ZiwKKwkJCQkJCW5ieXRlcywgaWQsIHN3X2lkeCwgaHdfaWR4LAorCQkJCQkJdG9lcGxpdHpfaGFzaF9yZXN1bHQpOworCQkJCQljZGZfc3Bpbl9sb2NrX2JoKCZzY24tPnRhcmdldF9sb2NrKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqcGlwZV9pbmZvID0KKwkJCQkJCShzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqKQorCQkJCQkJQ0VfY29udGV4dDsKKworCQkJCQljZGZfc3Bpbl9sb2NrX2JoKCZwaXBlX2luZm8tPgorCQkJCQkJIGNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisJCQkJCXBpcGVfaW5mby0+bnVtX3NlbmRzX2FsbG93ZWQrKzsKKwkJCQkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwaXBlX2luZm8tPgorCQkJCQkJICAgY29tcGxldGlvbl9mcmVlcV9sb2NrKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnNjbi0+dGFyZ2V0X2xvY2spOworCUFfVEFSR0VUX0FDQ0VTU19FTkQoc2NuKTsKK30KKworI2VuZGlmIC8qQVRIXzExQUNfVFhDT01QQUNUICovCisKKy8qCisgKiBOdW1iZXIgb2YgdGltZXMgdG8gY2hlY2sgZm9yIGFueSBwZW5kaW5nIHR4L3J4IGNvbXBsZXRpb24gb24KKyAqIGEgY29weSBlbmdpbmUsIHRoaXMgY291bnQgc2hvdWxkIGJlIGJpZyBlbm91Z2guIE9uY2Ugd2UgaGl0CisgKiB0aGlzIHRocmVhc2hvbGQgd2UnbGwgbm90IGNoZWNrIGZvciBhbnkgVHgvUnggY29tbHBldGlvbiBpbiBzYW1lCisgKiBpbnRlcnJ1cHQgaGFuZGxpbmcuIE5vdGUgdGhhdCB0aGlzIHRocmVhc2hvbGQgaXMgb25seSB1c2VkIGZvcgorICogUnggaW50ZXJydXB0IHByb2Nlc3NpbmcsIHRoaXMgY2FuIGJlIHVzZWQgdG9yIFR4IGFzIHdlbGwgaWYgd2UKKyAqIHN1c3BlY3QgYW55IGluZmluaXRlIGxvb3AgaW4gY2hlY2tpbmcgZm9yIHBlbmRpbmcgVHggY29tcGxldGlvbi4KKyAqLworI2RlZmluZSBDRV9UWFJYX0NPTVBfQ0hFQ0tfVEhSRVNIT0xEIDIwCisKKy8qCisgKiBHdXRzIG9mIGludGVycnVwdCBoYW5kbGVyIGZvciBwZXItZW5naW5lIGludGVycnVwdHMgb24gYSBwYXJ0aWN1bGFyIENFLgorICoKKyAqIEludm9rZXMgcmVnaXN0ZXJlZCBjYWxsYmFja3MgZm9yIHJlY3ZfY29tcGxldGUsCisgKiBzZW5kX2NvbXBsZXRlLCBhbmQgd2F0ZXJtYXJrcy4KKyAqCisgKiBSZXR1cm5zOiBudW1iZXIgb2YgbWVzc2FnZXMgcHJvY2Vzc2VkCisgKi8KKworaW50IGNlX3Blcl9lbmdpbmVfc2VydmljZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdW5zaWduZWQgaW50IENFX2lkKQoreworCXN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGUgPSBzY24tPmNlX2lkX3RvX3N0YXRlW0NFX2lkXTsKKwl1aW50MzJfdCBjdHJsX2FkZHIgPSBDRV9zdGF0ZS0+Y3RybF9hZGRyOworCXZvaWQgKkNFX2NvbnRleHQ7CisJdm9pZCAqdHJhbnNmZXJfY29udGV4dDsKKwljZGZfZG1hX2FkZHJfdCBidWY7CisJdW5zaWduZWQgaW50IG5ieXRlczsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVpbnQzMl90IENFX2ludF9zdGF0dXM7CisJdW5zaWduZWQgaW50IG1vcmVfY29tcF9jbnQgPSAwOworCXVuc2lnbmVkIGludCBtb3JlX3NuZF9jb21wX2NudCA9IDA7CisJdW5zaWduZWQgaW50IHN3X2lkeCwgaHdfaWR4OworCXVpbnQzMl90IHRvZXBsaXR6X2hhc2hfcmVzdWx0OworCisJaWYgKFFfVEFSR0VUX0FDQ0VTU19CRUdJTihzY24pIDwgMCkgeworCQlISUZfRVJST1IoIltwcmVtYXR1cmUgcmM9MF1cbiIpOworCQlyZXR1cm4gMDsgLyogbm8gd29yayBkb25lICovCisJfQorCisJY2RmX3NwaW5fbG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisKKwkvKiBDbGVhciBmb3JjZV9icmVhayBmbGFnIGFuZCByZS1pbml0aWFsaXplIHJlY2VpdmVfY291bnQgdG8gMCAqLworCisJLyogTkFQSTogc2NuIHZhcmlhYmxlcy0gdGhyZWFkL211bHRpLXByb2Nlc3Npbmcgc2FmZXR5PyAqLworCXNjbi0+cmVjZWl2ZV9jb3VudCA9IDA7CisJc2NuLT5mb3JjZV9icmVhayA9IDA7Cittb3JlX2NvbXBsZXRpb25zOgorCWlmIChDRV9zdGF0ZS0+cmVjdl9jYikgeworCisJCS8qIFBvcCBjb21wbGV0ZWQgcmVjdiBidWZmZXJzIGFuZCBjYWxsCisJCSAqIHRoZSByZWdpc3RlcmVkIHJlY3YgY2FsbGJhY2sgZm9yIGVhY2gKKwkJICovCisJCXdoaWxlIChjZV9jb21wbGV0ZWRfcmVjdl9uZXh0X25vbG9jaworCQkJCShDRV9zdGF0ZSwgJkNFX2NvbnRleHQsICZ0cmFuc2Zlcl9jb250ZXh0LAorCQkJCSZidWYsICZuYnl0ZXMsICZpZCwgJmZsYWdzKSA9PQorCQkJCUNERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJY2RmX3NwaW5fdW5sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKKwkJCUNFX3N0YXRlLT5yZWN2X2NiKChzdHJ1Y3QgQ0VfaGFuZGxlICopQ0Vfc3RhdGUsCisJCQkJCSAgQ0VfY29udGV4dCwgdHJhbnNmZXJfY29udGV4dCwgYnVmLAorCQkJCQkgIG5ieXRlcywgaWQsIGZsYWdzKTsKKworCQkJLyoKKwkJCSAqIEVWICMxMTI2OTMgLQorCQkJICogW1BlcmVncmluZV1bRVMxXVtXQjM0Ml1bV2luOHg4Nl1bUGVyZm9ybWFuY2VdCisJCQkgKiBCU29EXzB4MTMzIG9jY3VycmVkIGluIFZIVDgwIFVEUF9ETAorCQkJICogQnJlYWsgb3V0IERQQyBieSBmb3JjZSBpZiBudW1iZXIgb2YgbG9vcHMgaW4KKwkJCSAqIGhpZl9wY2lfY2VfcmVjdl9kYXRhIHJlYWNoZXMgTUFYX05VTV9PRl9SRUNFSVZFUworCQkJICogdG8gYXZvaWQgc3BlbmRpbmcgdG9vIGxvbmcgdGltZSBpbgorCQkJICogRFBDIGZvciBlYWNoIGludGVycnVwdCBoYW5kbGluZy4gU2NoZWR1bGUgYW5vdGhlcgorCQkJICogRFBDIHRvIGF2b2lkIGRhdGEgbG9zcyBpZiB3ZSBoYWQgdGFrZW4KKwkJCSAqIGZvcmNlLWJyZWFrIGFjdGlvbiBiZWZvcmUgYXBwbHkgdG8gV2luZG93cyBPUworCQkJICogb25seSBjdXJyZW50bHksIExpbnV4L01BQyBvcyBjYW4gZXhwYW5kIHRvIHRoZWlyCisJCQkgKiBwbGF0Zm9ybSBpZiBuZWNlc3NhcnkKKwkJCSAqLworCisJCQkvKiBCcmVhayB0aGUgcmVjZWl2ZSBwcm9jZXNzZXMgYnkKKwkJCSAqIGZvcmNlIGlmIGZvcmNlX2JyZWFrIHNldCB1cAorCQkJICovCisJCQlpZiAoY2RmX3VubGlrZWx5KHNjbi0+Zm9yY2VfYnJlYWspKSB7CisJCQkJY2RmX2F0b21pY19zZXQoJkNFX3N0YXRlLT5yeF9wZW5kaW5nLCAxKTsKKwkJCQlDRV9FTkdJTkVfSU5UX1NUQVRVU19DTEVBUihzY24sIGN0cmxfYWRkciwKKwkJCQkJSE9TVF9JU19DT1BZX0NPTVBMRVRFX01BU0spOworCQkJCWlmIChRX1RBUkdFVF9BQ0NFU1NfRU5EKHNjbikgPCAwKQorCQkJCQlISUZfRVJST1IoIjwtLVtwcmVtYXR1cmUgcmM9JWRdXG4iLAorCQkJCQkJICBzY24tPnJlY2VpdmVfY291bnQpOworCQkJCXJldHVybiBzY24tPnJlY2VpdmVfY291bnQ7CisJCQl9CisJCQljZGZfc3Bpbl9sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKKwkJfQorCX0KKworCS8qCisJICogQXR0ZW50aW9uOiBXZSBtYXkgZXhwZXJpZW5jZSBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBmb3IgYmVsb3cKKwkgKiBXaGlsZSBMb29wIGR1cmluZyBTZW5kaW5nIFN0cmVzcyB0ZXN0LgorCSAqIFJlc29sdmUgdGhlIHNhbWUgd2F5IGFzIFJlY2VpdmUgQ2FzZSAoUmVmZXIgdG8gRVYgIzExMjY5MykKKwkgKi8KKworCWlmIChDRV9zdGF0ZS0+c2VuZF9jYikgeworCQkvKiBQb3AgY29tcGxldGVkIHNlbmQgYnVmZmVycyBhbmQgY2FsbAorCQkgKiB0aGUgcmVnaXN0ZXJlZCBzZW5kIGNhbGxiYWNrIGZvciBlYWNoCisJCSAqLworCisjaWZkZWYgQVRIXzExQUNfVFhDT01QQUNUCisJCXdoaWxlIChjZV9jb21wbGV0ZWRfc2VuZF9uZXh0X25vbG9jaworCQkJIChDRV9zdGF0ZSwgJkNFX2NvbnRleHQsCisJCQkgJnRyYW5zZmVyX2NvbnRleHQsICZidWYsICZuYnl0ZXMsCisJCQkgJmlkLCAmc3dfaWR4LCAmaHdfaWR4LAorCQkJICZ0b2VwbGl0el9oYXNoX3Jlc3VsdCkgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisKKwkJCWlmIChDRV9pZCAhPSBDRV9IVFRfSDJUX01TRyB8fAorCQkJICAgIFdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoY2RzX2dldF9jb25wYXJhbSgpKSkgeworCQkJCWNkZl9zcGluX3VubG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisJCQkJQ0Vfc3RhdGUtPnNlbmRfY2IoKHN0cnVjdCBDRV9oYW5kbGUgKilDRV9zdGF0ZSwKKwkJCQkJCSAgQ0VfY29udGV4dCwgdHJhbnNmZXJfY29udGV4dCwKKwkJCQkJCSAgYnVmLCBuYnl0ZXMsIGlkLCBzd19pZHgsCisJCQkJCQkgIGh3X2lkeCwgdG9lcGxpdHpfaGFzaF9yZXN1bHQpOworCQkJCWNkZl9zcGluX2xvY2soJnNjbi0+dGFyZ2V0X2xvY2spOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgSElGX0NFX3BpcGVfaW5mbyAqcGlwZV9pbmZvID0KKwkJCQkJKHN0cnVjdCBISUZfQ0VfcGlwZV9pbmZvICopQ0VfY29udGV4dDsKKworCQkJCWNkZl9zcGluX2xvY2soJnBpcGVfaW5mby0+CisJCQkJCSAgICAgIGNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisJCQkJcGlwZV9pbmZvLT5udW1fc2VuZHNfYWxsb3dlZCsrOworCQkJCWNkZl9zcGluX3VubG9jaygmcGlwZV9pbmZvLT4KKwkJCQkJCWNvbXBsZXRpb25fZnJlZXFfbG9jayk7CisJCQl9CisJCX0KKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLypBVEhfMTFBQ19UWENPTVBBQ1QgKi8KKwkJd2hpbGUgKGNlX2NvbXBsZXRlZF9zZW5kX25leHRfbm9sb2NrCisJCQkgKENFX3N0YXRlLCAmQ0VfY29udGV4dCwKKwkJCSAgJnRyYW5zZmVyX2NvbnRleHQsICZidWYsICZuYnl0ZXMsCisJCQkgICZpZCwgJnN3X2lkeCwgJmh3X2lkeCwKKwkJCSAgJnRvZXBsaXR6X2hhc2hfcmVzdWx0KSA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWNkZl9zcGluX3VubG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisJCQlDRV9zdGF0ZS0+c2VuZF9jYigoc3RydWN0IENFX2hhbmRsZSAqKUNFX3N0YXRlLAorCQkJCSAgQ0VfY29udGV4dCwgdHJhbnNmZXJfY29udGV4dCwgYnVmLAorCQkJCSAgbmJ5dGVzLCBpZCwgc3dfaWR4LCBod19pZHgsCisJCQkJICB0b2VwbGl0el9oYXNoX3Jlc3VsdCk7CisJCQljZGZfc3Bpbl9sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKKwkJfQorI2VuZGlmIC8qQVRIXzExQUNfVFhDT01QQUNUICovCisJfQorCittb3JlX3dhdGVybWFya3M6CisJaWYgKENFX3N0YXRlLT5taXNjX2NicykgeworCQlDRV9pbnRfc3RhdHVzID0gQ0VfRU5HSU5FX0lOVF9TVEFUVVNfR0VUKHNjbiwgY3RybF9hZGRyKTsKKwkJaWYgKENFX2ludF9zdGF0dXMgJiBDRV9XQVRFUk1BUktfTUFTSykgeworCQkJaWYgKENFX3N0YXRlLT53YXRlcm1hcmtfY2IpIHsKKworCQkJCWNkZl9zcGluX3VubG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisJCQkJLyogQ29udmVydCBIVyBJUyBiaXRzIHRvIHNvZnR3YXJlIGZsYWdzICovCisJCQkJZmxhZ3MgPQorCQkJCQkoQ0VfaW50X3N0YXR1cyAmIENFX1dBVEVSTUFSS19NQVNLKSA+PgorCQkJCQlDRV9XTV9TSEZUOworCisJCQkJQ0Vfc3RhdGUtPgorCQkJCXdhdGVybWFya19jYigoc3RydWN0IENFX2hhbmRsZSAqKUNFX3N0YXRlLAorCQkJCQkgICAgIENFX3N0YXRlLT53bV9jb250ZXh0LCBmbGFncyk7CisJCQkJY2RmX3NwaW5fbG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIENsZWFyIHRoZSBtaXNjIGludGVycnVwdHMgKHdhdGVybWFyaykgdGhhdCB3ZXJlIGhhbmRsZWQgYWJvdmUsCisJICogYW5kIHRoYXQgd2lsbCBiZSBjaGVja2VkIGFnYWluIGJlbG93LgorCSAqIENsZWFyIGFuZCBjaGVjayBmb3IgY29weS1jb21wbGV0ZSBpbnRlcnJ1cHRzIGFnYWluLCBqdXN0IGluIGNhc2UKKwkgKiBtb3JlIGNvcHkgY29tcGxldGlvbnMgaGFwcGVuZWQgd2hpbGUgdGhlIG1pc2MgaW50ZXJydXB0cyB3ZXJlIGJlaW5nCisJICogaGFuZGxlZC4KKwkgKi8KKwlDRV9FTkdJTkVfSU5UX1NUQVRVU19DTEVBUihzY24sIGN0cmxfYWRkciwKKwkJCQkgICBDRV9XQVRFUk1BUktfTUFTSyB8CisJCQkJICAgSE9TVF9JU19DT1BZX0NPTVBMRVRFX01BU0spOworCisJLyoKKwkgKiBOb3cgdGhhdCBwZXItZW5naW5lIGludGVycnVwdHMgYXJlIGNsZWFyZWQsIHZlcmlmeSB0aGF0CisJICogbm8gcmVjdiBpbnRlcnJ1cHRzIGFycml2ZSB3aGlsZSBwcm9jZXNzaW5nIHNlbmQgaW50ZXJydXB0cywKKwkgKiBhbmQgbm8gcmVjdiBvciBzZW5kIGludGVycnVwdHMgaGFwcGVuZWQgd2hpbGUgcHJvY2Vzc2luZworCSAqIG1pc2MgaW50ZXJydXB0cy5HbyBiYWNrIGFuZCBjaGVjayBhZ2Fpbi5LZWVwIGNoZWNraW5nIHVudGlsCisJICogd2UgZmluZCBubyBtb3JlIGV2ZW50cyB0byBwcm9jZXNzLgorCSAqLworCWlmIChDRV9zdGF0ZS0+cmVjdl9jYiAmJiBjZV9yZWN2X2VudHJpZXNfZG9uZV9ub2xvY2soc2NuLCBDRV9zdGF0ZSkpIHsKKwkJaWYgKFdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoY2RzX2dldF9jb25wYXJhbSgpKSB8fAorCQkgICAgbW9yZV9jb21wX2NudCsrIDwgQ0VfVFhSWF9DT01QX0NIRUNLX1RIUkVTSE9MRCkgeworCQkJZ290byBtb3JlX2NvbXBsZXRpb25zOworCQl9IGVsc2UgeworCQkJSElGX0VSUk9SKAorCQkJCSIlczpQb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBkZXRlY3RlZCBkdXJpbmcgUnggcHJvY2Vzc2luZyBuZW50cmllc19tYXNrOjB4JXggc3cgcmVhZF9pZHg6MHgleCBodyByZWFkX2lkeDoweCV4IiwKKwkJCQlfX2Z1bmNfXywgQ0Vfc3RhdGUtPmRlc3RfcmluZy0+bmVudHJpZXNfbWFzaywKKwkJCQlDRV9zdGF0ZS0+ZGVzdF9yaW5nLT5zd19pbmRleCwKKwkJCQlDRV9ERVNUX1JJTkdfUkVBRF9JRFhfR0VUKHNjbiwKKwkJCQkJCQkgIENFX3N0YXRlLT5jdHJsX2FkZHIpKTsKKwkJfQorCX0KKworCWlmIChDRV9zdGF0ZS0+c2VuZF9jYiAmJiBjZV9zZW5kX2VudHJpZXNfZG9uZV9ub2xvY2soc2NuLCBDRV9zdGF0ZSkpIHsKKwkJaWYgKFdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoY2RzX2dldF9jb25wYXJhbSgpKSB8fAorCQkgICAgbW9yZV9zbmRfY29tcF9jbnQrKyA8IENFX1RYUlhfQ09NUF9DSEVDS19USFJFU0hPTEQpIHsKKwkJCWdvdG8gbW9yZV9jb21wbGV0aW9uczsKKwkJfSBlbHNlIHsKKwkJCUhJRl9FUlJPUigKKwkJCQkiJXM6UG90ZW50aWFsIGluZmluaXRlIGxvb3AgZGV0ZWN0ZWQgZHVyaW5nIHNlbmQgY29tcGxldGlvbiBuZW50cmllc19tYXNrOjB4JXggc3cgcmVhZF9pZHg6MHgleCBodyByZWFkX2lkeDoweCV4IiwKKwkJCQlfX2Z1bmNfXywgQ0Vfc3RhdGUtPnNyY19yaW5nLT5uZW50cmllc19tYXNrLAorCQkJCUNFX3N0YXRlLT5zcmNfcmluZy0+c3dfaW5kZXgsCisJCQkJQ0VfU1JDX1JJTkdfUkVBRF9JRFhfR0VUKHNjbiwKKwkJCQkJCQkgQ0Vfc3RhdGUtPmN0cmxfYWRkcikpOworCQl9CisJfQorCisJaWYgKENFX3N0YXRlLT5taXNjX2NicykgeworCQlDRV9pbnRfc3RhdHVzID0gQ0VfRU5HSU5FX0lOVF9TVEFUVVNfR0VUKHNjbiwgY3RybF9hZGRyKTsKKwkJaWYgKENFX2ludF9zdGF0dXMgJiBDRV9XQVRFUk1BUktfTUFTSykgeworCQkJaWYgKENFX3N0YXRlLT53YXRlcm1hcmtfY2IpIHsKKwkJCQlnb3RvIG1vcmVfd2F0ZXJtYXJrczsKKwkJCX0KKwkJfQorCX0KKworCWNkZl9zcGluX3VubG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisJY2RmX2F0b21pY19zZXQoJkNFX3N0YXRlLT5yeF9wZW5kaW5nLCAwKTsKKworCWlmIChRX1RBUkdFVF9BQ0NFU1NfRU5EKHNjbikgPCAwKQorCQlISUZfRVJST1IoIjwtLVtwcmVtYXR1cmUgcmM9JWRdXG4iLCBzY24tPnJlY2VpdmVfY291bnQpOworCXJldHVybiBzY24tPnJlY2VpdmVfY291bnQ7Cit9CisKKy8qCisgKiBIYW5kbGVyIGZvciBwZXItZW5naW5lIGludGVycnVwdHMgb24gQUxMIGFjdGl2ZSBDRXMuCisgKiBUaGlzIGlzIHVzZWQgaW4gY2FzZXMgd2hlcmUgdGhlIHN5c3RlbSBpcyBzaGFyaW5nIGEKKyAqIHNpbmdsZSBpbnRlcnJwdXQgZm9yIGFsbCBDRXMKKyAqLworCit2b2lkIGNlX3Blcl9lbmdpbmVfc2VydmljZV9hbnkoaW50IGlycSwgc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJaW50IENFX2lkOworCXVpbnQzMl90IGludHJfc3VtbWFyeTsKKworCUFfVEFSR0VUX0FDQ0VTU19CRUdJTihzY24pOworCWlmICghY2RmX2F0b21pY19yZWFkKCZzY24tPnRhc2tsZXRfZnJvbV9pbnRyKSkgeworCQlmb3IgKENFX2lkID0gMDsgQ0VfaWQgPCBzY24tPmNlX2NvdW50OyBDRV9pZCsrKSB7CisJCQlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gc2NuLT5jZV9pZF90b19zdGF0ZVtDRV9pZF07CisJCQlpZiAoY2RmX2F0b21pY19yZWFkKCZDRV9zdGF0ZS0+cnhfcGVuZGluZykpIHsKKwkJCQljZGZfYXRvbWljX3NldCgmQ0Vfc3RhdGUtPnJ4X3BlbmRpbmcsIDApOworCQkJCWNlX3Blcl9lbmdpbmVfc2VydmljZShzY24sIENFX2lkKTsKKwkJCX0KKwkJfQorCisJCUFfVEFSR0VUX0FDQ0VTU19FTkQoc2NuKTsKKwkJcmV0dXJuOworCX0KKworCWludHJfc3VtbWFyeSA9IENFX0lOVEVSUlVQVF9TVU1NQVJZKHNjbik7CisKKwlmb3IgKENFX2lkID0gMDsgaW50cl9zdW1tYXJ5ICYmIChDRV9pZCA8IHNjbi0+Y2VfY291bnQpOyBDRV9pZCsrKSB7CisJCWlmIChpbnRyX3N1bW1hcnkgJiAoMSA8PCBDRV9pZCkpIHsKKwkJCWludHJfc3VtbWFyeSAmPSB+KDEgPDwgQ0VfaWQpOworCQl9IGVsc2UgeworCQkJY29udGludWU7ICAgICAgIC8qIG5vIGludHIgcGVuZGluZyBvbiB0aGlzIENFICovCisJCX0KKworCQljZV9wZXJfZW5naW5lX3NlcnZpY2Uoc2NuLCBDRV9pZCk7CisJfQorCisJQV9UQVJHRVRfQUNDRVNTX0VORChzY24pOworfQorCisvKgorICogQWRqdXN0IGludGVycnVwdHMgZm9yIHRoZSBjb3B5IGNvbXBsZXRlIGhhbmRsZXIuCisgKiBJZiBpdCdzIG5lZWRlZCBmb3IgZWl0aGVyIHNlbmQgb3IgcmVjdiwgdGhlbiB1bm1hc2sKKyAqIHRoaXMgaW50ZXJydXB0OyBvdGhlcndpc2UsIG1hc2sgaXQuCisgKgorICogQ2FsbGVkIHdpdGggdGFyZ2V0X2xvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQKK2NlX3Blcl9lbmdpbmVfaGFuZGxlcl9hZGp1c3Qoc3RydWN0IENFX3N0YXRlICpDRV9zdGF0ZSwKKwkJCSAgICAgaW50IGRpc2FibGVfY29weV9jb21wbF9pbnRyKQoreworCXVpbnQzMl90IGN0cmxfYWRkciA9IENFX3N0YXRlLT5jdHJsX2FkZHI7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBDRV9zdGF0ZS0+c2NuOworCisJQ0Vfc3RhdGUtPmRpc2FibGVfY29weV9jb21wbF9pbnRyID0gZGlzYWJsZV9jb3B5X2NvbXBsX2ludHI7CisJQV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbik7CisJaWYgKCghZGlzYWJsZV9jb3B5X2NvbXBsX2ludHIpICYmCisJICAgIChDRV9zdGF0ZS0+c2VuZF9jYiB8fCBDRV9zdGF0ZS0+cmVjdl9jYikpIHsKKwkJQ0VfQ09QWV9DT01QTEVURV9JTlRSX0VOQUJMRShzY24sIGN0cmxfYWRkcik7CisJfSBlbHNlIHsKKwkJQ0VfQ09QWV9DT01QTEVURV9JTlRSX0RJU0FCTEUoc2NuLCBjdHJsX2FkZHIpOworCX0KKworCWlmIChDRV9zdGF0ZS0+d2F0ZXJtYXJrX2NiKSB7CisJCUNFX1dBVEVSTUFSS19JTlRSX0VOQUJMRShzY24sIGN0cmxfYWRkcik7CisJfSBlbHNlIHsKKwkJQ0VfV0FURVJNQVJLX0lOVFJfRElTQUJMRShzY24sIGN0cmxfYWRkcik7CisJfQorCUFfVEFSR0VUX0FDQ0VTU19FTkQoc2NuKTsKKworfQorCisvKkl0ZXJhdGUgdGhlIENFX3N0YXRlIGxpc3QgYW5kIGRpc2FibGUgdGhlIGNvbXBsIGludGVycnVwdAorICogaWYgaXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCBhbHJlYWR5LgorICovCit2b2lkIGNlX2Rpc2FibGVfYW55X2NvcHlfY29tcGxfaW50cl9ub2xvY2soc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJaW50IENFX2lkOworCisJQV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbik7CisJZm9yIChDRV9pZCA9IDA7IENFX2lkIDwgc2NuLT5jZV9jb3VudDsgQ0VfaWQrKykgeworCQlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gc2NuLT5jZV9pZF90b19zdGF0ZVtDRV9pZF07CisJCXVpbnQzMl90IGN0cmxfYWRkciA9IENFX3N0YXRlLT5jdHJsX2FkZHI7CisKKwkJLyogaWYgdGhlIGludGVycnVwdCBpcyBjdXJyZW50bHkgZW5hYmxlZCwgZGlzYWJsZSBpdCAqLworCQlpZiAoIUNFX3N0YXRlLT5kaXNhYmxlX2NvcHlfY29tcGxfaW50cgorCQkgICAgJiYgKENFX3N0YXRlLT5zZW5kX2NiIHx8IENFX3N0YXRlLT5yZWN2X2NiKSkgeworCQkJQ0VfQ09QWV9DT01QTEVURV9JTlRSX0RJU0FCTEUoc2NuLCBjdHJsX2FkZHIpOworCQl9CisKKwkJaWYgKENFX3N0YXRlLT53YXRlcm1hcmtfY2IpIHsKKwkJCUNFX1dBVEVSTUFSS19JTlRSX0RJU0FCTEUoc2NuLCBjdHJsX2FkZHIpOworCQl9CisJfQorCUFfVEFSR0VUX0FDQ0VTU19FTkQoc2NuKTsKK30KKwordm9pZCBjZV9lbmFibGVfYW55X2NvcHlfY29tcGxfaW50cl9ub2xvY2soc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJaW50IENFX2lkOworCisJQV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbik7CisJZm9yIChDRV9pZCA9IDA7IENFX2lkIDwgc2NuLT5jZV9jb3VudDsgQ0VfaWQrKykgeworCQlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gc2NuLT5jZV9pZF90b19zdGF0ZVtDRV9pZF07CisJCXVpbnQzMl90IGN0cmxfYWRkciA9IENFX3N0YXRlLT5jdHJsX2FkZHI7CisKKwkJLyoKKwkJICogSWYgdGhlIENFIGlzIHN1cHBvc2VkIHRvIGhhdmUgY29weSBjb21wbGV0ZSBpbnRlcnJ1cHRzCisJCSAqIGVuYWJsZWQgKGkuZS4gdGhlcmUgYSBjYWxsYmFjayByZWdpc3RlcmVkLCBhbmQgdGhlCisJCSAqICJkaXNhYmxlIiBmbGFnIGlzIG5vdCBzZXQpLCB0aGVuIHJlLWVuYWJsZSB0aGUgaW50ZXJydXB0LgorCQkgKi8KKwkJaWYgKCFDRV9zdGF0ZS0+ZGlzYWJsZV9jb3B5X2NvbXBsX2ludHIKKwkJICAgICYmIChDRV9zdGF0ZS0+c2VuZF9jYiB8fCBDRV9zdGF0ZS0+cmVjdl9jYikpIHsKKwkJCUNFX0NPUFlfQ09NUExFVEVfSU5UUl9FTkFCTEUoc2NuLCBjdHJsX2FkZHIpOworCQl9CisKKwkJaWYgKENFX3N0YXRlLT53YXRlcm1hcmtfY2IpIHsKKwkJCUNFX1dBVEVSTUFSS19JTlRSX0VOQUJMRShzY24sIGN0cmxfYWRkcik7CisJCX0KKwl9CisJQV9UQVJHRVRfQUNDRVNTX0VORChzY24pOworfQorCit2b2lkIGNlX2Rpc2FibGVfYW55X2NvcHlfY29tcGxfaW50cihzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwljZGZfc3Bpbl9sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKKwljZV9kaXNhYmxlX2FueV9jb3B5X2NvbXBsX2ludHJfbm9sb2NrKHNjbik7CisJY2RmX3NwaW5fdW5sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKK30KKworLypSZS1lbmFibGUgdGhlIGNvcHkgY29tcGwgaW50ZXJydXB0IGlmIGl0IGhhcyBub3QgYmVlbiBkaXNhYmxlZCBiZWZvcmUuKi8KK3ZvaWQgY2VfZW5hYmxlX2FueV9jb3B5X2NvbXBsX2ludHIoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJY2RmX3NwaW5fbG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisJY2VfZW5hYmxlX2FueV9jb3B5X2NvbXBsX2ludHJfbm9sb2NrKHNjbik7CisJY2RmX3NwaW5fdW5sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKK30KKwordm9pZAorY2Vfc2VuZF9jYl9yZWdpc3RlcihzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLAorCQkgICAgY2Vfc2VuZF9jYiBmbl9wdHIsCisJCSAgICB2b2lkICpjZV9zZW5kX2NvbnRleHQsIGludCBkaXNhYmxlX2ludGVycnVwdHMpCit7CisJc3RydWN0IENFX3N0YXRlICpDRV9zdGF0ZSA9IChzdHJ1Y3QgQ0Vfc3RhdGUgKiljb3B5ZW5nOworCisJY2RmX3NwaW5fbG9jaygmQ0Vfc3RhdGUtPnNjbi0+dGFyZ2V0X2xvY2spOworCUNFX3N0YXRlLT5zZW5kX2NiID0gZm5fcHRyOworCUNFX3N0YXRlLT5zZW5kX2NvbnRleHQgPSBjZV9zZW5kX2NvbnRleHQ7CisJY2VfcGVyX2VuZ2luZV9oYW5kbGVyX2FkanVzdChDRV9zdGF0ZSwgZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKwljZGZfc3Bpbl91bmxvY2soJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKK30KKwordm9pZAorY2VfcmVjdl9jYl9yZWdpc3RlcihzdHJ1Y3QgQ0VfaGFuZGxlICpjb3B5ZW5nLAorCQkgICAgQ0VfcmVjdl9jYiBmbl9wdHIsCisJCSAgICB2b2lkICpDRV9yZWN2X2NvbnRleHQsIGludCBkaXNhYmxlX2ludGVycnVwdHMpCit7CisJc3RydWN0IENFX3N0YXRlICpDRV9zdGF0ZSA9IChzdHJ1Y3QgQ0Vfc3RhdGUgKiljb3B5ZW5nOworCisJY2RmX3NwaW5fbG9jaygmQ0Vfc3RhdGUtPnNjbi0+dGFyZ2V0X2xvY2spOworCUNFX3N0YXRlLT5yZWN2X2NiID0gZm5fcHRyOworCUNFX3N0YXRlLT5yZWN2X2NvbnRleHQgPSBDRV9yZWN2X2NvbnRleHQ7CisJY2VfcGVyX2VuZ2luZV9oYW5kbGVyX2FkanVzdChDRV9zdGF0ZSwgZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKwljZGZfc3Bpbl91bmxvY2soJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKK30KKwordm9pZAorY2Vfd2F0ZXJtYXJrX2NiX3JlZ2lzdGVyKHN0cnVjdCBDRV9oYW5kbGUgKmNvcHllbmcsCisJCQkgQ0Vfd2F0ZXJtYXJrX2NiIGZuX3B0ciwgdm9pZCAqQ0Vfd21fY29udGV4dCkKK3sKKwlzdHJ1Y3QgQ0Vfc3RhdGUgKkNFX3N0YXRlID0gKHN0cnVjdCBDRV9zdGF0ZSAqKWNvcHllbmc7CisKKwljZGZfc3Bpbl9sb2NrKCZDRV9zdGF0ZS0+c2NuLT50YXJnZXRfbG9jayk7CisJQ0Vfc3RhdGUtPndhdGVybWFya19jYiA9IGZuX3B0cjsKKwlDRV9zdGF0ZS0+d21fY29udGV4dCA9IENFX3dtX2NvbnRleHQ7CisJY2VfcGVyX2VuZ2luZV9oYW5kbGVyX2FkanVzdChDRV9zdGF0ZSwgMCk7CisJaWYgKGZuX3B0cikgeworCQlDRV9zdGF0ZS0+bWlzY19jYnMgPSAxOworCX0KKwljZGZfc3Bpbl91bmxvY2soJkNFX3N0YXRlLT5zY24tPnRhcmdldF9sb2NrKTsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9GQVNUUEFUSAorLyoqCisgKiBjZV9wa3RfZGxfbGVuX3NldCgpIHNldCB0aGUgSFRUIHBhY2tldCBkb3dubG9hZCBsZW5ndGgKKyAqIEBoaWZfc2M6IEhJRiBjb250ZXh0CisgKiBAcGt0X2Rvd25sb2FkX2xlbjogZG93bmxvYWQgbGVuZ3RoCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgY2VfcGt0X2RsX2xlbl9zZXQodm9pZCAqaGlmX3NjLCB1X2ludDMyX3QgcGt0X2Rvd25sb2FkX2xlbikKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjID0gKHN0cnVjdCBvbF9zb2Z0YyAqKShoaWZfc2MpOworCXN0cnVjdCBDRV9zdGF0ZSAqY2Vfc3RhdGUgPSBzYy0+Y2VfaWRfdG9fc3RhdGVbQ0VfSFRUX0gyVF9NU0ddOworCisJY2RmX2Fzc2VydF9hbHdheXMoY2Vfc3RhdGUpOworCisJY2RmX3NwaW5fbG9ja19iaCgmc2MtPnRhcmdldF9sb2NrKTsKKwljZV9zdGF0ZS0+ZG93bmxvYWRfbGVuID0gcGt0X2Rvd25sb2FkX2xlbjsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnNjLT50YXJnZXRfbG9jayk7CisKKwljZGZfcHJpbnQoIiVzIENFICVkIFBrdCBkb3dubG9hZCBsZW5ndGggJWRcbiIsIF9fZnVuY19fLAorCQkgIGNlX3N0YXRlLT5pZCwgY2Vfc3RhdGUtPmRvd25sb2FkX2xlbik7Cit9CisjZWxzZQordm9pZCBjZV9wa3RfZGxfbGVuX3NldCh2b2lkICpoaWZfc2MsIHVfaW50MzJfdCBwa3RfZG93bmxvYWRfbGVuKQoreworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9GQVNUUEFUSCAqLworCitib29sIGNlX2dldF9yeF9wZW5kaW5nKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCWludCBDRV9pZDsKKworCWZvciAoQ0VfaWQgPSAwOyBDRV9pZCA8IHNjbi0+Y2VfY291bnQ7IENFX2lkKyspIHsKKwkJc3RydWN0IENFX3N0YXRlICpDRV9zdGF0ZSA9IHNjbi0+Y2VfaWRfdG9fc3RhdGVbQ0VfaWRdOworCQlpZiAoY2RmX2F0b21pY19yZWFkKCZDRV9zdGF0ZS0+cnhfcGVuZGluZykpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogY2VfY2hlY2tfcnhfcGVuZGluZygpIC0gY2VfY2hlY2tfcnhfcGVuZGluZworICogQHNjbjogb2xfc29mdGMKKyAqIEBjZV9pZDogY2VfaWQKKyAqCisgKiBSZXR1cm46IGJvb2wKKyAqLworYm9vbCBjZV9jaGVja19yeF9wZW5kaW5nKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBpbnQgY2VfaWQpCit7CisJc3RydWN0IENFX3N0YXRlICpDRV9zdGF0ZSA9IHNjbi0+Y2VfaWRfdG9fc3RhdGVbY2VfaWRdOworCWlmIChjZGZfYXRvbWljX3JlYWQoJkNFX3N0YXRlLT5yeF9wZW5kaW5nKSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9Cit2b2lkIGNlX2VuYWJsZV9tc2koc3RydWN0IG9sX3NvZnRjICpzY24sIHVuc2lnbmVkIGludCBDRV9pZCwKKwkJCQkgICB1aW50MzJfdCBtc2lfYWRkcl9sbywgdWludDMyX3QgbXNpX2FkZHJfaGksCisJCQkJICAgdWludDMyX3QgbXNpX2RhdGEpCit7CisjaWZkZWYgV0xBTl9FTkFCTEVfUUNBNjE4MAorCXN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGU7CisJQV90YXJnZXRfaWRfdCB0YXJnaWQ7CisJdV9pbnQzMl90IGN0cmxfYWRkcjsKKwl1aW50MzJfdCB0bXA7CisKKwlhZGZfb3Nfc3Bpbl9sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKKwlDRV9zdGF0ZSA9IHNjbi0+Y2VfaWRfdG9fc3RhdGVbQ0VfaWRdOworCWlmICghQ0Vfc3RhdGUpIHsKKwkJSElGX0VSUk9SKCIlczogZXJyb3IgLSBDRV9zdGF0ZSA9IE5VTEwiLCBfX2Z1bmNfXyk7CisJCWFkZl9vc19zcGluX3VubG9jaygmc2NuLT50YXJnZXRfbG9jayk7CisJCXJldHVybjsKKwl9CisJdGFyZ2lkID0gVEFSR0lEKHNjKTsKKwljdHJsX2FkZHIgPSBDRV9zdGF0ZS0+Y3RybF9hZGRyOworCUNFX01TSV9BRERSX0xPV19TRVQoc2NuLCBjdHJsX2FkZHIsIG1zaV9hZGRyX2xvKTsKKwlDRV9NU0lfQUREUl9ISUdIX1NFVChzY24sIGN0cmxfYWRkciwgbXNpX2FkZHJfaGkpOworCUNFX01TSV9EQVRBX1NFVChzY24sIGN0cmxfYWRkciwgbXNpX2RhdGEpOworCXRtcCA9IENFX0NUUkxfUkVHSVNURVIxX0dFVChzY24sIGN0cmxfYWRkcik7CisJdG1wIHw9ICgxIDw8IENFX01TSV9FTkFCTEVfQklUKTsKKwlDRV9DVFJMX1JFR0lTVEVSMV9TRVQoc2NuLCBjdHJsX2FkZHIsIHRtcCk7CisJYWRmX29zX3NwaW5fdW5sb2NrKCZzY24tPnRhcmdldF9sb2NrKTsKKyNlbmRpZgorfQorCisjaWZkZWYgSVBBX09GRkxPQUQKKy8qCisgKiBDb3B5IGVuZ2luZSBzaG91bGQgcmVsZWFzZSByZXNvdXJjZSB0byBtaWNybyBjb250cm9sbGVyCisgKiBNaWNybyBjb250cm9sbGVyIG5lZWRzCisgICAtIENvcHkgZW5naW5lIHNvdXJjZSBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcworICAgLSBDb3B5IGVuZ2luZSBzb3VyY2UgZGVzY3JpcHRvciBzaXplCisgICAtIFBDSSBCQVIgYWRkcmVzcyB0byBhY2Nlc3MgY29weSBlbmdpbmUgcmVnaXNlcgorICovCit2b2lkIGNlX2lwYV9nZXRfcmVzb3VyY2Uoc3RydWN0IENFX2hhbmRsZSAqY2UsCisJCQkgdWludDMyX3QgKmNlX3NyX2Jhc2VfcGFkZHIsCisJCQkgdWludDMyX3QgKmNlX3NyX3Jpbmdfc2l6ZSwKKwkJCSBjZGZfZG1hX2FkZHJfdCAqY2VfcmVnX3BhZGRyKQoreworCXN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGUgPSAoc3RydWN0IENFX3N0YXRlICopY2U7CisJdWludDMyX3QgcmluZ19sb29wOworCXN0cnVjdCBDRV9zcmNfZGVzYyAqY2VfZGVzYzsKKwljZGZfZG1hX2FkZHJfdCBwaHlfbWVtX2Jhc2U7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBDRV9zdGF0ZS0+c2NuOworCisJaWYgKENFX1JVTk5JTkcgIT0gQ0Vfc3RhdGUtPnN0YXRlKSB7CisJCSpjZV9zcl9iYXNlX3BhZGRyID0gMDsKKwkJKmNlX3NyX3Jpbmdfc2l6ZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKiBVcGRhdGUgZGVmYXVsdCB2YWx1ZSBmb3IgZGVzY3JpcHRvciAqLworCWZvciAocmluZ19sb29wID0gMDsgcmluZ19sb29wIDwgQ0Vfc3RhdGUtPnNyY19yaW5nLT5uZW50cmllczsKKwkgICAgIHJpbmdfbG9vcCsrKSB7CisJCWNlX2Rlc2MgPSAoc3RydWN0IENFX3NyY19kZXNjICopCisJCQkgICgoY2hhciAqKUNFX3N0YXRlLT5zcmNfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlICsKKwkJCSAgIHJpbmdfbG9vcCAqIChzaXplb2Yoc3RydWN0IENFX3NyY19kZXNjKSkpOworCQlDRV9JUEFfUklOR19JTklUKGNlX2Rlc2MpOworCX0KKworCS8qIEdldCBCQVIgYWRkcmVzcyAqLworCWhpZl9yZWFkX3BoeV9tZW1fYmFzZShDRV9zdGF0ZS0+c2NuLCAmcGh5X21lbV9iYXNlKTsKKworCSpjZV9zcl9iYXNlX3BhZGRyID0gKHVpbnQzMl90KSBDRV9zdGF0ZS0+c3JjX3JpbmctPmJhc2VfYWRkcl9DRV9zcGFjZTsKKwkqY2Vfc3JfcmluZ19zaXplID0gKHVpbnQzMl90KSBDRV9zdGF0ZS0+c3JjX3JpbmctPm5lbnRyaWVzOworCSpjZV9yZWdfcGFkZHIgPSBwaHlfbWVtX2Jhc2UgKyBDRV9CQVNFX0FERFJFU1MoQ0Vfc3RhdGUtPmlkKSArCisJCQlTUl9XUl9JTkRFWF9BRERSRVNTOworCXJldHVybjsKK30KKyNlbmRpZiAvKiBJUEFfT0ZGTE9BRCAqLworCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvY2UvY2VfdGFza2xldC5jIGIvY29yZS9oaWYvc3JjL2NlL2NlX3Rhc2tsZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmI1NTBlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oaWYvc3JjL2NlL2NlX3Rhc2tsZXQuYwpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxvc2RlcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlICJhX3R5cGVzLmgiCisjaW5jbHVkZSAiYXRoZGVmcy5oIgorI2luY2x1ZGUgImNkZl9sb2NrLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX3N0YXR1cy5oIgorI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJyZWd0YWJsZS5oIgorI2luY2x1ZGUgImhpZi5oIgorI2luY2x1ZGUgImhpZl9pbzMyLmgiCisjaW5jbHVkZSAiY2VfbWFpbi5oIgorI2luY2x1ZGUgImNlX2FwaS5oIgorI2luY2x1ZGUgImNlX3JlZy5oIgorI2luY2x1ZGUgImNlX2ludGVybmFsLmgiCisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2lmZGVmIEhJRl9QQ0kKKyNpbmNsdWRlICJpY25zc19zdHViLmgiCisjZWxzZQorI2luY2x1ZGUgPHNvYy9xY29tL2ljbnNzLmg+CisjZW5kaWYgLyogSElGX1BDSSAqLworI2VuZGlmCisjaW5jbHVkZSAiaGlmX2RlYnVnLmgiCisjaW5jbHVkZSAiaGlmX25hcGkuaCIKKworCisvKioKKyAqIGNlX2lycV9zdGF0dXMoKSAtIHJlYWQgQ0UgSVJRIHN0YXR1cworICogQHNjbjogc3RydWN0IG9sX3NvZnRjCisgKiBAY2VfaWQ6IGNlX2lkCisgKiBAaG9zdF9zdGF0dXM6IGhvc3Rfc3RhdHVzCisgKgorICogUmV0dXJuOiBJUlEgc3RhdHVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZV9pcnFfc3RhdHVzKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLAorCWludCBjZV9pZCwgdWludDMyX3QgKmhvc3Rfc3RhdHVzKQoreworCXVpbnQzMl90IG9mZnNldCA9IEhPU1RfSVNfQUREUkVTUyArIENFX0JBU0VfQUREUkVTUyhjZV9pZCk7CisKKwkqaG9zdF9zdGF0dXMgPSBoaWZfcmVhZDMyX21iKHNjbi0+bWVtICsgb2Zmc2V0KTsKK30KKworLyoqCisgKiByZXNjaGVkdWxlX2NlX3Rhc2tsZXRfd29ya19oYW5kbGVyKCkgLSByZXNjaGVkdWxlIHdvcmsKKyAqIEBjZV9pZDogY2VfaWQKKyAqCisgKiBSZXR1cm46IE4vQQorICovCitzdGF0aWMgdm9pZCByZXNjaGVkdWxlX2NlX3Rhc2tsZXRfd29ya19oYW5kbGVyKGludCBjZV9pZCkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRik7CisJc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX2NlX3N0YXRlOworCisJaWYgKE5VTEwgPT0gc2NuKSB7CisJCUhJRl9FUlJPUigiJXM6IHRhc2tsZXQgc2NuIGlzIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJaGlmX2NlX3N0YXRlID0gKHN0cnVjdCBISUZfQ0Vfc3RhdGUgKilzY24tPmhpZl9oZGw7CisKKwlpZiAoc2NuLT5oaWZfaW5pdF9kb25lID09IGZhbHNlKSB7CisJCUhJRl9FUlJPUigiJXM6IHdsYW4gZHJpdmVyIGlzIHVubG9hZGVkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXRhc2tsZXRfc2NoZWR1bGUoJmhpZl9jZV9zdGF0ZS0+dGFza2xldHNbY2VfaWRdLmludHJfdHEpOworCXJldHVybjsKK30KKworLyoqCisgKiBzdHJ1Y3QgdGFza2xldF93b3JrCisgKgorICogQGlkOiBjZV9pZAorICogQHdvcms6IHdvcmsKKyAqLworc3RydWN0IHRhc2tsZXRfd29yayB7CisJZW51bSBjZV9pZF90eXBlIGlkOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworfTsKKworc3RhdGljIHN0cnVjdCB0YXNrbGV0X3dvcmsgdGFza2xldF93b3JrZXJzW0NFX0lEX01BWF07CitzdGF0aWMgYm9vbCB3b3JrX2luaXRpYWxpemVkOworCisvKioKKyAqIHdvcmtfaGFuZGxlcigpIC0gd29ya19oYW5kbGVyCisgKiBAd29yazogc3RydWN0IHdvcmtfc3RydWN0CisgKgorICogUmV0dXJuOiBOL0EKKyAqLworc3RhdGljIHZvaWQgd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdGFza2xldF93b3JrICp0bXA7CisKKwl0bXAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRhc2tsZXRfd29yaywgd29yayk7CisJcmVzY2hlZHVsZV9jZV90YXNrbGV0X3dvcmtfaGFuZGxlcih0bXAtPmlkKTsKK30KKworLyoqCisgKiBpbml0X3Rhc2tsZXRfd29yaygpIC0gaW5pdF90YXNrbGV0X3dvcmsKKyAqIEB3b3JrOiBzdHJ1Y3Qgd29ya19zdHJ1Y3QKKyAqIEB3b3JrX2hhbmRsZXI6IHdvcmtfaGFuZGxlcgorICoKKyAqIFJldHVybjogTi9BCisgKi8KKyNpZmRlZiBDT05GSUdfQ05TUworc3RhdGljIHZvaWQgaW5pdF90YXNrbGV0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLAorCXdvcmtfZnVuY190IHdvcmtfaGFuZGxlcikKK3sKKwljbnNzX2luaXRfd29yayh3b3JrLCB3b3JrX2hhbmRsZXIpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGluaXRfdGFza2xldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywKKwl3b3JrX2Z1bmNfdCB3b3JrX2hhbmRsZXIpCit7CisJSU5JVF9XT1JLKHdvcmssIHdvcmtfaGFuZGxlcik7Cit9CisjZW5kaWYKKworLyoqCisgKiBpbml0X3Rhc2tsZXRfd29ya2VycygpIC0gaW5pdF90YXNrbGV0X3dvcmtlcnMKKyAqCisgKiBSZXR1cm46IE4vQQorICovCit2b2lkIGluaXRfdGFza2xldF93b3JrZXJzKHZvaWQpCit7CisJdWludDMyX3QgaWQ7CisKKwlmb3IgKGlkID0gMDsgaWQgPCBDRV9JRF9NQVg7IGlkKyspIHsKKwkJdGFza2xldF93b3JrZXJzW2lkXS5pZCA9IGlkOworCQlpbml0X3Rhc2tsZXRfd29yaygmdGFza2xldF93b3JrZXJzW2lkXS53b3JrLCB3b3JrX2hhbmRsZXIpOworCX0KKwl3b3JrX2luaXRpYWxpemVkID0gdHJ1ZTsKK30KKworI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHX09OCisvKioKKyAqIGNlX3NjaGVkdWxlX3Rhc2tsZXQoKSAtIHNjaGVkdWxlIGNlIHRhc2tsZXQKKyAqIEB0YXNrbGV0X2VudHJ5OiBzdHJ1Y3QgY2VfdGFza2xldF9lbnRyeQorICoKKyAqIFJldHVybjogTi9BCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZV9zY2hlZHVsZV90YXNrbGV0KHN0cnVjdCBjZV90YXNrbGV0X2VudHJ5ICp0YXNrbGV0X2VudHJ5KQoreworCWlmICh3b3JrX2luaXRpYWxpemVkICYmICh0YXNrbGV0X2VudHJ5LT5jZV9pZCA8PSBDRV9JRF9NQVgpKQorCQlzY2hlZHVsZV93b3JrKCZ0YXNrbGV0X3dvcmtlcnNbdGFza2xldF9lbnRyeS0+Y2VfaWRdLndvcmspOworCWVsc2UKKwkJSElGX0VSUk9SKCIlczogd29ya19pbml0aWFsaXplZCA9ICVkLCBjZV9pZCA9ICVkIiwKKwkJCV9fZnVuY19fLCB3b3JrX2luaXRpYWxpemVkLCB0YXNrbGV0X2VudHJ5LT5jZV9pZCk7Cit9CisjZWxzZQorLyoqCisgKiBjZV9zY2hlZHVsZV90YXNrbGV0KCkgLSBzY2hlZHVsZSBjZSB0YXNrbGV0CisgKiBAdGFza2xldF9lbnRyeTogc3RydWN0IGNlX3Rhc2tsZXRfZW50cnkKKyAqCisgKiBSZXR1cm46IE4vQQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2Vfc2NoZWR1bGVfdGFza2xldChzdHJ1Y3QgY2VfdGFza2xldF9lbnRyeSAqdGFza2xldF9lbnRyeSkKK3sKKwl0YXNrbGV0X3NjaGVkdWxlKCZ0YXNrbGV0X2VudHJ5LT5pbnRyX3RxKTsKK30KKyNlbmRpZgorCisvKioKKyAqIGNlX3Rhc2tsZXQoKSAtIGNlX3Rhc2tsZXQKKyAqIEBkYXRhOiBkYXRhCisgKgorICogUmV0dXJuOiBOL0EKKyAqLworc3RhdGljIHZvaWQgY2VfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGNlX3Rhc2tsZXRfZW50cnkgKnRhc2tsZXRfZW50cnkgPQorCQkoc3RydWN0IGNlX3Rhc2tsZXRfZW50cnkgKilkYXRhOworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9jZV9zdGF0ZSA9IHRhc2tsZXRfZW50cnktPmhpZl9jZV9zdGF0ZTsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGhpZl9jZV9zdGF0ZS0+c2NuOworCXN0cnVjdCBDRV9zdGF0ZSAqQ0Vfc3RhdGUgPSBzY24tPmNlX2lkX3RvX3N0YXRlW3Rhc2tsZXRfZW50cnktPmNlX2lkXTsKKworCWlmICh0YXNrbGV0X2VudHJ5LT5mcm9tX2lycSkKKwkJdGFza2xldF9lbnRyeS0+ZnJvbV9pcnEgPSBmYWxzZTsKKworCWlmIChjZGZfYXRvbWljX3JlYWQoJnNjbi0+bGlua19zdXNwZW5kZWQpKSB7CisJCUhJRl9FUlJPUigiJXM6IGNlICVkIHRhc2tsZXQgZmlyZWQgYWZ0ZXIgbGluayBzdXNwZW5kLiIsCisJCQkJX19mdW5jX18sIHRhc2tsZXRfZW50cnktPmNlX2lkKTsKKwkJQ0RGX0JVRygwKTsKKwl9CisKKwljZV9wZXJfZW5naW5lX3NlcnZpY2Uoc2NuLCB0YXNrbGV0X2VudHJ5LT5jZV9pZCk7CisKKwlpZiAodGFza2xldF9lbnRyeS0+Y2VfaWQgPT0gQ0VfSFRUX1QySF9NU0cgJiYKKwkJCSBDRV9zdGF0ZS0+bHJvX2ZsdXNoX2NiICE9IE5VTEwpIHsKKwkJQ0Vfc3RhdGUtPmxyb19mbHVzaF9jYihDRV9zdGF0ZS0+bHJvX2RhdGEpOworCX0KKworCWlmIChjZV9jaGVja19yeF9wZW5kaW5nKHNjbiwgdGFza2xldF9lbnRyeS0+Y2VfaWQpKSB7CisJCS8qCisJCSAqIFRoZXJlIGFyZSBmcmFtZXMgcGVuZGluZywgc2NoZWR1bGUgdGFza2xldCB0byBwcm9jZXNzIHRoZW0uCisJCSAqIEVuYWJsZSB0aGUgaW50ZXJydXB0IG9ubHkgd2hlbiB0aGVyZSBpcyBubyBwZW5kaW5nIGZyYW1lcyBpbgorCQkgKiBhbnkgb2YgdGhlIENvcHkgRW5naW5lIHBpcGVzLgorCQkgKi8KKwkJY2Vfc2NoZWR1bGVfdGFza2xldCh0YXNrbGV0X2VudHJ5KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzY24tPnRhcmdldF9zdGF0dXMgIT0gT0xfVFJHRVRfU1RBVFVTX1JFU0VUKQorCQljZV9pcnFfZW5hYmxlKHNjbiwgdGFza2xldF9lbnRyeS0+Y2VfaWQpOworCisJY2RmX2F0b21pY19kZWMoJnNjbi0+YWN0aXZlX3Rhc2tsZXRfY250KTsKK30KKy8qKgorICogY2VfdGFza2xldF9pbml0KCkgLSBjZV90YXNrbGV0X2luaXQKKyAqIEBoaWZfY2Vfc3RhdGU6IGhpZl9jZV9zdGF0ZQorICogQG1hc2s6IG1hc2sKKyAqCisgKiBSZXR1cm46IE4vQQorICovCit2b2lkIGNlX3Rhc2tsZXRfaW5pdChzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfY2Vfc3RhdGUsIHVpbnQzMl90IG1hc2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0VfQ09VTlRfTUFYOyBpKyspIHsKKwkJaWYgKG1hc2sgJiAoMSA8PCBpKSkgeworCQkJaGlmX2NlX3N0YXRlLT50YXNrbGV0c1tpXS5jZV9pZCA9IGk7CisJCQloaWZfY2Vfc3RhdGUtPnRhc2tsZXRzW2ldLmluaXRlZCA9IHRydWU7CisJCQloaWZfY2Vfc3RhdGUtPnRhc2tsZXRzW2ldLmhpZl9jZV9zdGF0ZSA9IGhpZl9jZV9zdGF0ZTsKKwkJCXRhc2tsZXRfaW5pdCgmaGlmX2NlX3N0YXRlLT50YXNrbGV0c1tpXS5pbnRyX3RxLAorCQkJCWNlX3Rhc2tsZXQsCisJCQkJKHVuc2lnbmVkIGxvbmcpJmhpZl9jZV9zdGF0ZS0+dGFza2xldHNbaV0pOworCQl9CisJfQorfQorLyoqCisgKiBjZV90YXNrbGV0X2tpbGwoKSAtIGNlX3Rhc2tsZXRfa2lsbAorICogQGhpZl9jZV9zdGF0ZTogaGlmX2NlX3N0YXRlCisgKgorICogUmV0dXJuOiBOL0EKKyAqLwordm9pZCBjZV90YXNrbGV0X2tpbGwoc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX2NlX3N0YXRlKQoreworCWludCBpOworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gaGlmX2NlX3N0YXRlLT5zY247CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0VfQ09VTlRfTUFYOyBpKyspCisJCWlmIChoaWZfY2Vfc3RhdGUtPnRhc2tsZXRzW2ldLmluaXRlZCkgeworCQkJdGFza2xldF9raWxsKCZoaWZfY2Vfc3RhdGUtPnRhc2tsZXRzW2ldLmludHJfdHEpOworCQkJaGlmX2NlX3N0YXRlLT50YXNrbGV0c1tpXS5pbml0ZWQgPSBmYWxzZTsKKwkJfQorCWNkZl9hdG9taWNfc2V0KCZzY24tPmFjdGl2ZV90YXNrbGV0X2NudCwgMCk7Cit9CisvKioKKyAqIGNlX2lycV9oYW5kbGVyKCkgLSBjZV9pcnFfaGFuZGxlcgorICogQGNlX2lkOiBjZV9pZAorICogQGNvbnRleHQ6IGNvbnRleHQKKyAqCisgKiBSZXR1cm46IE4vQQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgY2VfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgY2VfdGFza2xldF9lbnRyeSAqdGFza2xldF9lbnRyeSA9IGNvbnRleHQ7CisJc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX2NlX3N0YXRlID0gdGFza2xldF9lbnRyeS0+aGlmX2NlX3N0YXRlOworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gaGlmX2NlX3N0YXRlLT5zY247CisJaW50IGNlX2lkID0gaWNuc3NfZ2V0X2NlX2lkKGlycSk7CisJdWludDMyX3QgaG9zdF9zdGF0dXM7CisKKworCWlmICh0YXNrbGV0X2VudHJ5LT5jZV9pZCAhPSBjZV9pZCkgeworCQlISUZfRVJST1IoIiVzOiBjZV9pZCAoZXhwZWN0ICVkLCByZWNlaXZlZCAlZCkgZG9lcyBub3QgbWF0Y2giLAorCQkJICBfX2Z1bmNfXywgdGFza2xldF9lbnRyeS0+Y2VfaWQsIGNlX2lkKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworI2lmbmRlZiBISUZfUENJCisJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisjZW5kaWYKKwljZV9pcnFfZGlzYWJsZShzY24sIGNlX2lkKTsKKwljZV9pcnFfc3RhdHVzKHNjbiwgY2VfaWQsICZob3N0X3N0YXR1cyk7CisJY2RmX2F0b21pY19pbmMoJnNjbi0+YWN0aXZlX3Rhc2tsZXRfY250KTsKKwlpZiAoaGlmX25hcGlfZW5hYmxlZChzY24sIGNlX2lkKSkKKwkJaGlmX25hcGlfc2NoZWR1bGUoc2NuLCBjZV9pZCk7CisJZWxzZSB7CisJCXRhc2tsZXRfZW50cnktPmZyb21faXJxID0gdHJ1ZTsKKwkJdGFza2xldF9zY2hlZHVsZSgmdGFza2xldF9lbnRyeS0+aW50cl90cSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBjb25zdCBjaGFyICpjZV9uYW1lCisgKgorICogQGNlX25hbWU6IGNlX25hbWUKKyAqLworY29uc3QgY2hhciAqY2VfbmFtZVtJQ05TU19NQVhfSVJRX1JFR0lTVFJBVElPTlNdID0geworCSJXTEFOX0NFXzAiLAorCSJXTEFOX0NFXzEiLAorCSJXTEFOX0NFXzIiLAorCSJXTEFOX0NFXzMiLAorCSJXTEFOX0NFXzQiLAorCSJXTEFOX0NFXzUiLAorCSJXTEFOX0NFXzYiLAorCSJXTEFOX0NFXzciLAorCSJXTEFOX0NFXzgiLAorCSJXTEFOX0NFXzkiLAorCSJXTEFOX0NFXzEwIiwKKwkiV0xBTl9DRV8xMSIsCit9OworLyoqCisgKiBjZV91bnJlZ2lzdGVyX2lycSgpIC0gY2VfdW5yZWdpc3Rlcl9pcnEKKyAqIEBoaWZfY2Vfc3RhdGU6IGhpZl9jZV9zdGF0ZSBjb3B5IGVuZ2luZSBkZXZpY2UgaGFuZGxlCisgKiBAbWFzazogd2hpY2ggY29wcHkgZW5naW5lcyB0byB1bnJlZ2lzdGVyIGZvci4KKyAqCisgKiBVbnJlZ2lzdGVycyBjb3B5IGVuZ2luZSBpcnFzIG1hdGNoaW5nIG1hc2suICBJZiBhIDEgaXMgc2V0IGF0IGJpdCB4LAorICogdW5yZWdpc3RlciBmb3IgY29weSBlbmdpbmUgeC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBjZV91bnJlZ2lzdGVyX2lycShzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfY2Vfc3RhdGUsIHVpbnQzMl90IG1hc2spCit7CisJaW50IGlkOworCWludCByZXQ7CisKKwlpZiAoaGlmX2NlX3N0YXRlID09IE5VTEwpIHsKKwkJSElGX1dBUk4oIiVzOiBoaWZfY2Vfc3RhdGUgPSBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKwlmb3IgKGlkID0gMDsgaWQgPCBDRV9DT1VOVF9NQVg7IGlkKyspIHsKKwkJaWYgKChtYXNrICYgKDEgPDwgaWQpKSAmJiBoaWZfY2Vfc3RhdGUtPnRhc2tsZXRzW2lkXS5pbml0ZWQpIHsKKwkJCXJldCA9IGljbnNzX2NlX2ZyZWVfaXJxKGlkLAorCQkJCQkmaGlmX2NlX3N0YXRlLT50YXNrbGV0c1tpZF0pOworCQkJaWYgKHJldCA8IDApCisJCQkJSElGX0VSUk9SKAorCQkJCQkiJXM6IGljbnNzX3VucmVnaXN0ZXJfaXJxIGVycm9yIC0gY2VfaWQgPSAlZCwgcmV0ID0gJWQiLAorCQkJCQlfX2Z1bmNfXywgaWQsIHJldCk7CisJCX0KKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qKgorICogY2VfcmVnaXN0ZXJfaXJxKCkgLSBjZV9yZWdpc3Rlcl9pcnEKKyAqIEBoaWZfY2Vfc3RhdGU6IGhpZl9jZV9zdGF0ZQorICogQG1hc2s6IHdoaWNoIGNvcHB5IGVuZ2luZXMgdG8gdW5yZWdpc3RlciBmb3IuCisgKgorICogUmVnaXN0ZXJzIGNvcHkgZW5naW5lIGlycXMgbWF0Y2hpbmcgbWFzay4gIElmIGEgMSBpcyBzZXQgYXQgYml0IHgsCisgKiBSZWdpc3RlciBmb3IgY29weSBlbmdpbmUgeC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBjZV9yZWdpc3Rlcl9pcnEoc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX2NlX3N0YXRlLCB1aW50MzJfdCBtYXNrKQoreworCWludCBpZDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MgPSBJUlFGX1RSSUdHRVJfUklTSU5HOworCXVpbnQzMl90IGRvbmVfbWFzayA9IDA7CisKKwlmb3IgKGlkID0gMDsgaWQgPCBDRV9DT1VOVF9NQVg7IGlkKyspIHsKKwkJaWYgKChtYXNrICYgKDEgPDwgaWQpKSAmJiBoaWZfY2Vfc3RhdGUtPnRhc2tsZXRzW2lkXS5pbml0ZWQpIHsKKwkJCXJldCA9IGljbnNzX2NlX3JlcXVlc3RfaXJxKGlkLCBjZV9pcnFfaGFuZGxlciwKKwkJCQlpcnFmbGFncywgY2VfbmFtZVtpZF0sCisJCQkJJmhpZl9jZV9zdGF0ZS0+dGFza2xldHNbaWRdKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlISUZfRVJST1IoCisJCQkJCSIlczogY2Fubm90IHJlZ2lzdGVyIENFICVkIGlycSBoYW5kbGVyLCByZXQgPSAlZCIsCisJCQkJCV9fZnVuY19fLCBpZCwgcmV0KTsKKwkJCQljZV91bnJlZ2lzdGVyX2lycShoaWZfY2Vfc3RhdGUsIGRvbmVfbWFzayk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJCX0gZWxzZSB7CisJCQkJZG9uZV9tYXNrIHw9IDEgPDwgaWQ7CisJCQl9CisJCX0KKwl9CisKKyNpZm5kZWYgSElGX1BDSQorCS8qIG1vdmUgdG8gaGlmX2NvbmZpZ3VyZV9pcnEgKi8KKwljZV9lbmFibGVfaXJxX2luX2dyb3VwX3JlZyhoaWZfY2Vfc3RhdGUtPnNjbiwgZG9uZV9tYXNrKTsKKyNlbmRpZgorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9jZS9jZV90YXNrbGV0LmggYi9jb3JlL2hpZi9zcmMvY2UvY2VfdGFza2xldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTQ3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hpZi9zcmMvY2UvY2VfdGFza2xldC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQ0VfVEFTS0xFVF9IX18KKyNkZWZpbmUgX19DRV9UQVNLTEVUX0hfXwordm9pZCBpbml0X3Rhc2tsZXRfd29ya2Vycyh2b2lkKTsKK3ZvaWQgY2VfdGFza2xldF9pbml0KHN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9jZV9zdGF0ZSwgdWludDMyX3QgbWFzayk7Cit2b2lkIGNlX3Rhc2tsZXRfa2lsbChzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfY2Vfc3RhdGUpOworQ0RGX1NUQVRVUyBjZV9yZWdpc3Rlcl9pcnEoc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX2NlX3N0YXRlLCB1aW50MzJfdCBtYXNrKTsKK0NERl9TVEFUVVMgY2VfdW5yZWdpc3Rlcl9pcnEoc3RydWN0IEhJRl9DRV9zdGF0ZSAqaGlmX2NlX3N0YXRlLCB1aW50MzJfdCBtYXNrKTsKKyNlbmRpZiAvKiBfX0NFX1RBU0tMRVRfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvaGlmX2RlYnVnLmggYi9jb3JlL2hpZi9zcmMvaGlmX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiN2QxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9oaWZfZGVidWcuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fSElGX0RFQlVHX0hfXworI2RlZmluZSBfX0hJRl9ERUJVR19IX18KKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKworI2RlZmluZSBISUZfRVJST1IoYXJncyAuLi4pIFwKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9ISUYsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIyMgYXJncykKKyNkZWZpbmUgSElGX1dBUk4oYXJncyAuLi4pIFwKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9ISUYsIENERl9UUkFDRV9MRVZFTF9XQVJOLCAjIyBhcmdzKQorI2RlZmluZSBISUZfSU5GTyhhcmdzIC4uLikgXAorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hJRiwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sICMjIGFyZ3MpCisjZGVmaW5lIEhJRl9JTkZPX0hJKGFyZ3MgLi4uKSBcCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSElGLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAjIyBhcmdzKQorI2RlZmluZSBISUZfSU5GT19NRUQoYXJncyAuLi4pIFwKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9ISUYsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwgIyMgYXJncykKKyNkZWZpbmUgSElGX0lORk9fTE8oYXJncyAuLi4pIFwKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9ISUYsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywgIyMgYXJncykKKyNkZWZpbmUgSElGX1RSQUNFKGFyZ3MgLi4uKSBcCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSElGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsICMjIGFyZ3MpCisjZGVmaW5lIEhJRl9EQkcoYXJncyAuLi4pIFwKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9ISUYsIENERl9UUkFDRV9MRVZFTF9ERUJVRywgIyMgYXJncykKKyNlbmRpZiAvKiBfX0hJRl9ERUJVR19IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9oaWZfaHdfdmVyc2lvbi5oIGIvY29yZS9oaWYvc3JjL2hpZl9od192ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkNzZkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9oaWZfaHdfdmVyc2lvbi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKworI2lmbmRlZiBISUZfSFdfVkVSU0lPTl9ICisjZGVmaW5lIEhJRl9IV19WRVJTSU9OX0gKKworI2RlZmluZSBBUjYzMjBfUkVWMV9WRVJTSU9OICAgICAgICAgICAgIDB4NTAwMDAwMAorI2RlZmluZSBBUjYzMjBfUkVWMV8xX1ZFUlNJT04gICAgICAgICAgIDB4NTAwMDAwMQorI2RlZmluZSBBUjYzMjBfUkVWMV8zX1ZFUlNJT04gICAgICAgICAgIDB4NTAwMDAwMworI2RlZmluZSBBUjYzMjBfUkVWMl8xX1ZFUlNJT04gICAgICAgICAgIDB4NTAxMDAwMAorI2RlZmluZSBBUjYzMjBfUkVWM19WRVJTSU9OICAgICAgICAgICAgIDB4NTAyMDAwMAorI2RlZmluZSBBUjYzMjBfUkVWM18yX1ZFUlNJT04gICAgICAgICAgIDB4NTAzMDAwMAorCitzdHJ1Y3QgcXdsYW5faHcgeworCXUzMiBpZDsKKwl1MzIgc3ViaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcXdsYW5faHcgcXdsYW5faHdfbGlzdFtdID0geworCXsKKwkJLmlkID0gQVI2MzIwX1JFVjFfVkVSU0lPTiwKKwkJLnN1YmlkID0gMCwKKwkJLm5hbWUgPSAiUUNBNjE3NF9SRVYxIiwKKwl9LAorCXsKKwkJLmlkID0gQVI2MzIwX1JFVjFfMV9WRVJTSU9OLAorCQkuc3ViaWQgPSAweDEsCisJCS5uYW1lID0gIlFDQTYxNzRfUkVWMV8xIiwKKwl9LAorCXsKKwkJLmlkID0gQVI2MzIwX1JFVjFfM19WRVJTSU9OLAorCQkuc3ViaWQgPSAweDIsCisJCS5uYW1lID0gIlFDQTYxNzRfUkVWMV8zIiwKKwl9LAorCXsKKwkJLmlkID0gQVI2MzIwX1JFVjJfMV9WRVJTSU9OLAorCQkuc3ViaWQgPSAweDQsCisJCS5uYW1lID0gIlFDQTYxNzRfUkVWMl8xIiwKKwl9LAorCXsKKwkJLmlkID0gQVI2MzIwX1JFVjJfMV9WRVJTSU9OLAorCQkuc3ViaWQgPSAweDUsCisJCS5uYW1lID0gIlFDQTYxNzRfUkVWMl8yIiwKKwl9LAorCXsKKwkJLmlkID0gQVI2MzIwX1JFVjNfVkVSU0lPTiwKKwkJLnN1YmlkID0gMHg2LAorCQkubmFtZSA9ICJRQ0E2MTc0X1JFVjIuMyIsCisJfSwKKwl7CisJCS5pZCA9IEFSNjMyMF9SRVYzX1ZFUlNJT04sCisJCS5zdWJpZCA9IDB4OCwKKwkJLm5hbWUgPSAiUUNBNjE3NF9SRVYzIiwKKwl9LAorCXsKKwkJLmlkID0gQVI2MzIwX1JFVjNfVkVSU0lPTiwKKwkJLnN1YmlkID0gMHg5LAorCQkubmFtZSA9ICJRQ0E2MTc0X1JFVjNfMSIsCisJfSwKKwl7CisJCS5pZCA9IEFSNjMyMF9SRVYzXzJfVkVSU0lPTiwKKwkJLnN1YmlkID0gMHhBLAorCQkubmFtZSA9ICJBUjYzMjBfUkVWM18yX1ZFUlNJT04iLAorCX0KK307CisKKyNlbmRpZiAvKiBISUZfSFdfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvaGlmX2lvMzIuaCBiL2NvcmUvaGlmL3NyYy9oaWZfaW8zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTFmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hpZi9zcmMvaGlmX2lvMzIuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0hJRl9JTzMyX0hfXworI2RlZmluZSBfX0hJRl9JTzMyX0hfXworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlICJvbF9pZl9hdGh2YXIuaCIKKyNpbmNsdWRlICJoaWYuaCIKKyNpZmRlZiBISUZfUENJCisjaW5jbHVkZSAiaGlmX2lvMzJfcGNpLmgiCisjZWxzZQorI2luY2x1ZGUgImhpZl9pbzMyX3Nub2MuaCIKKyNlbmRpZiAvKiBISUZfUENJICovCisjZW5kaWYgLyogX19ISUZfSU8zMl9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9oaWZfbWFpbi5jIGIvY29yZS9oaWYvc3JjL2hpZl9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmZGUyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9oaWZfbWFpbi5jCkBAIC0wLDAgKzEsODk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPG9zZGVwLmg+CisjaW5jbHVkZSAiYV90eXBlcy5oIgorI2luY2x1ZGUgImF0aGRlZnMuaCIKKyNpbmNsdWRlICJvc2FwaV9saW51eC5oIgorI2luY2x1ZGUgInRhcmdjZmcuaCIKKyNpbmNsdWRlICJjZGZfbG9jay5oIgorI2luY2x1ZGUgImNkZl9zdGF0dXMuaCIKKyNpbmNsdWRlIDxjZGZfYXRvbWljLmg+ICAgICAgICAgLyogY2RmX2F0b21pY19yZWFkICovCisjaW5jbHVkZSA8dGFyZ2FkZHJzLmg+CisjaW5jbHVkZSA8Ym1pX21zZy5oPgorI2luY2x1ZGUgImhpZl9pbzMyLmgiCisjaW5jbHVkZSA8aGlmLmg+CisjaW5jbHVkZSA8aHRjX3NlcnZpY2VzLmg+CisjaW5jbHVkZSAicmVndGFibGUuaCIKKyNkZWZpbmUgQVRIX01PRFVMRV9OQU1FIGhpZgorI2luY2x1ZGUgPGFfZGVidWcuaD4KKyNpbmNsdWRlICJoaWZfbWFpbi5oIgorI2luY2x1ZGUgImhpZl9od192ZXJzaW9uLmgiCisjaW5jbHVkZSAiY2VfYXBpLmgiCisjaW5jbHVkZSAiY2VfdGFza2xldC5oIgorI2luY2x1ZGUgImNkZl90cmFjZS5oIgorI2luY2x1ZGUgImNkZl9zdGF0dXMuaCIKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y2RzX2dldF9iaW4uaD4KKyNpbmNsdWRlICJlcHBpbmdfbWFpbi5oIgorI2luY2x1ZGUgImhpZl9kZWJ1Zy5oIgorI2luY2x1ZGUgIm1wX2Rldi5oIgorI2lmZGVmIEhJRl9QQ0kKKyNpbmNsdWRlICJpY25zc19zdHViLmgiCisjZWxzZQorI2luY2x1ZGUgPHNvYy9xY29tL2ljbnNzLmg+CisjZW5kaWYKKworI2lmbmRlZiBSRU1PVkVfUEtUX0xPRworI2luY2x1ZGUgInBrdGxvZ19hYy5oIgorI2VuZGlmCisKKyNkZWZpbmUgQUdDX0RVTVAgICAgICAgICAxCisjZGVmaW5lIENIQU5JTkZPX0RVTVAgICAgMgorI2RlZmluZSBCQl9XQVRDSERPR19EVU1QIDMKKyNpZmRlZiBDT05GSUdfQVRIX1BDSUVfQUNDRVNTX0RFQlVHCisjZGVmaW5lIFBDSUVfQUNDRVNTX0RVTVAgNAorI2VuZGlmCisKK3ZvaWQgaGlmX2R1bXAoc3RydWN0IG9sX3NvZnRjICpzY24sIHVpbnQ4X3QgY21kX2lkLCBib29sIHN0YXJ0KQoreworCXN3aXRjaCAoY21kX2lkKSB7CisJY2FzZSBBR0NfRFVNUDoKKwkJaWYgKHN0YXJ0KQorCQkJcHJpdl9zdGFydF9hZ2Moc2NuKTsKKwkJZWxzZQorCQkJcHJpdl9kdW1wX2FnYyhzY24pOworCQlicmVhazsKKworCWNhc2UgQ0hBTklORk9fRFVNUDoKKwkJaWYgKHN0YXJ0KQorCQkJcHJpdl9zdGFydF9jYXBfY2hhbmluZm8oc2NuKTsKKwkJZWxzZQorCQkJcHJpdl9kdW1wX2NoYW5pbmZvKHNjbik7CisJCWJyZWFrOworCisJY2FzZSBCQl9XQVRDSERPR19EVU1QOgorCQlwcml2X2R1bXBfYmJ3YXRjaGRvZyhzY24pOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19BVEhfUENJRV9BQ0NFU1NfREVCVUcKKwljYXNlIFBDSUVfQUNDRVNTX0RVTVA6CisJCWhpZl90YXJnZXRfZHVtcF9hY2Nlc3NfbG9nKCk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJSElGX0VSUk9SKCIlczogSW52YWxpZCBodGMgZHVtcCBjb21tYW5kIiwgX19mdW5jX18pOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogaGlmX3NodXRfZG93bl9kZXZpY2UoKSAtIGhpZl9zaHV0X2Rvd25fZGV2aWNlCisgKgorICogU1RoaXMgZnVjbnRpb24gc2h1dHMgZG93biB0aGUgZGV2aWNlCisgKgorICogQHNjbjogb2xfc29mdGMKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCBoaWZfc2h1dF9kb3duX2RldmljZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlpZiAoc2NuICYmIHNjbi0+aGlmX2hkbCkgeworCQlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUgPQorCQkJKHN0cnVjdCBISUZfQ0Vfc3RhdGUgKilzY24tPmhpZl9oZGw7CisKKwkJaGlmX3N0b3Aoc2NuKTsKKwkJY2RmX21lbV9mcmVlKGhpZl9zdGF0ZSk7CisJCXNjbi0+aGlmX2hkbCA9IE5VTEw7CisJfQorCit9CisKKworCisvKioKKyAqIGhpZl9jYW5jZWxfZGVmZXJyZWRfdGFyZ2V0X3NsZWVwKCkgLSBjYW5jZWwgZGVmZXJyZWQgdGFyZ2V0IHNsZWVwCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW5jZWxzIHRoZSBkZWZlcmVkIHRhcmdldCBzbGVlcAorICoKKyAqIEBzY246IG9sX3NvZnRjCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgaGlmX2NhbmNlbF9kZWZlcnJlZF90YXJnZXRfc2xlZXAoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJaGlmX3BjaV9jYW5jZWxfZGVmZXJyZWRfdGFyZ2V0X3NsZWVwKHNjbik7Cit9CisKKy8qKgorICogaGlmX2dldF90YXJnZXRfaWQoKTogaGlmX2dldF90YXJnZXRfaWQKKyAqCisgKiBSZXR1cm4gdGhlIHZpcnR1YWwgbWVtb3J5IGJhc2UgYWRkcmVzcyB0byB0aGUgY2FsbGVyCisgKgorICogQHNjbjogb2xfc29mdGMKKyAqCisgKiBSZXR1cm46IEFfdGFyZ2V0X2lkX3QKKyAqLworQV90YXJnZXRfaWRfdCBoaWZfZ2V0X3RhcmdldF9pZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlyZXR1cm4gc2NuLT5tZW07Cit9CisKKy8qKgorICogaGlmX3NldF90YXJnZXRfc2xlZXAoKTogaGlmX3NldF90YXJnZXRfc2xlZXAKKyAqIEBzY246IHNjbgorICogQHNsZWVwX29rOiBzbGVlcF9vaworICogQHdhaXRfZm9yX2l0OiB3YWl0CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgaGlmX3NldF90YXJnZXRfc2xlZXAoc3RydWN0IG9sX3NvZnRjICpzY24sCisJCSAgICAgYm9vbCBzbGVlcF9vaywgYm9vbCB3YWl0X2Zvcl9pdCkKK3sKKwloaWZfdGFyZ2V0X3NsZWVwX3N0YXRlX2FkanVzdChzY24sCisJCQkJICAgICAgc2xlZXBfb2ssIHdhaXRfZm9yX2l0KTsKK30KKworLyoqCisgKiBoaWZfdGFyZ2V0X2ZvcmNlZF9hd2FrZSgpOiBoaWZfdGFyZ2V0X2ZvcmNlZF9hd2FrZQorICogQHNjbjogc2NuCisgKgorICogUmV0dXJuOiBib29sCisgKi8KK2Jvb2wgaGlmX3RhcmdldF9mb3JjZWRfYXdha2Uoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJQV90YXJnZXRfaWRfdCBhZGRyID0gc2NuLT5tZW07CisJYm9vbCBhd2FrZTsKKwlib29sIGZvcmNlZF9hd2FrZTsKKworCWF3YWtlID0gaGlmX3RhcmdfaXNfYXdha2Uoc2NuLCBhZGRyKTsKKworCWZvcmNlZF9hd2FrZSA9CisJCSEhKGhpZl9yZWFkMzJfbWIKKwkJCSAgIChhZGRyICsgUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgKworCQkJICAgUENJRV9TT0NfV0FLRV9BRERSRVNTKSAmIFBDSUVfU09DX1dBS0VfVl9NQVNLKTsKKworCXJldHVybiBhd2FrZSAmJiBmb3JjZWRfYXdha2U7Cit9CisKKy8qKgorICogaGlmX2Z3X2ludGVycnVwdF9oYW5kbGVyKCk6IEZXIGludGVycnVwdCBoYW5kbGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgRlcgaW50ZXJydXB0IGhhbmRsZGVyCisgKgorICogQGlycTogaXJxIG51bWJlcgorICogQGFyZzogdGhlIHVzZXIgcG9pbnRlcgorICoKKyAqIFJldHVybjogYm9vbAorICovCisjaWZuZGVmIFFDQV9XSUZJXzNfMAoraXJxcmV0dXJuX3QgaGlmX2Z3X2ludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGFyZzsKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKXNjbi0+aGlmX2hkbDsKKwl1aW50MzJfdCBmd19pbmRpY2F0b3JfYWRkcmVzcywgZndfaW5kaWNhdG9yOworCisJQV9UQVJHRVRfQUNDRVNTX0JFR0lOX1JFVChzY24pOworCisJZndfaW5kaWNhdG9yX2FkZHJlc3MgPSBoaWZfc3RhdGUtPmZ3X2luZGljYXRvcl9hZGRyZXNzOworCS8qIEZvciBzdWRkZW4gdW5wbHVnIHRoaXMgd2lsbCByZXR1cm4gfjAgKi8KKwlmd19pbmRpY2F0b3IgPSBBX1RBUkdFVF9SRUFEKHNjbiwgZndfaW5kaWNhdG9yX2FkZHJlc3MpOworCisJaWYgKChmd19pbmRpY2F0b3IgIT0gfjApICYmIChmd19pbmRpY2F0b3IgJiBGV19JTkRfRVZFTlRfUEVORElORykpIHsKKwkJLyogQUNLOiBjbGVhciBUYXJnZXQtc2lkZSBwZW5kaW5nIGV2ZW50ICovCisJCUFfVEFSR0VUX1dSSVRFKHNjbiwgZndfaW5kaWNhdG9yX2FkZHJlc3MsCisJCQkgICAgICAgZndfaW5kaWNhdG9yICYgfkZXX0lORF9FVkVOVF9QRU5ESU5HKTsKKwkJQV9UQVJHRVRfQUNDRVNTX0VORF9SRVQoc2NuKTsKKworCQlpZiAoaGlmX3N0YXRlLT5zdGFydGVkKSB7CisJCQkvKiBBbGVydCB0aGUgSG9zdC1zaWRlIHNlcnZpY2UgdGhyZWFkICovCisJCQlhdG9taWNfc2V0KCZoaWZfc3RhdGUtPmZ3X2V2ZW50X3BlbmRpbmcsIDEpOworCQkJaGlmX2NvbXBsZXRpb25fdGhyZWFkKGhpZl9zdGF0ZSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUHJvYmFibGUgVGFyZ2V0IGZhaWx1cmUgYmVmb3JlIHdlJ3JlIHByZXBhcmVkCisJCQkgKiB0byBoYW5kbGUgaXQuICBHZW5lcmFsbHkgdW5leHBlY3RlZC4KKwkJCSAqLworCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsCisJCQkJKCIlczogRWFybHkgZmlybXdhcmUgZXZlbnQgaW5kaWNhdGVkXG4iLAorCQkJCSBfX2Z1bmNfXykpOworCQl9CisJfSBlbHNlIHsKKwkJQV9UQVJHRVRfQUNDRVNTX0VORF9SRVQoc2NuKTsKKwl9CisKKwlyZXR1cm4gQVRIX0lTUl9TQ0hFRDsKK30KKyNlbHNlCitpcnFyZXR1cm5fdCBoaWZfZndfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQoreworCXJldHVybiBBVEhfSVNSX1NDSEVEOworfQorI2VuZGlmIC8qICNpZmRlZiBRQ0FfV0lGSV8zXzAgKi8KKworLyoqCisgKiBoaWZfZ2V0X3RhcmdldGRlZigpOiBoaWZfZ2V0X3RhcmdldGRlZgorICogQHNjbjogc2NuCisgKgorICogUmV0dXJuOiB2b2lkICoKKyAqLwordm9pZCAqaGlmX2dldF90YXJnZXRkZWYoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJcmV0dXJuIHNjbi0+dGFyZ2V0ZGVmOworfQorCisvKioKKyAqIGhpZl92b3RlX2xpbmtfZG93bigpOiB1bnZvdGUgZm9yIGxpbmsgdXAKKyAqCisgKiBDYWxsIGhpZl92b3RlX2xpbmtfZG93biB0byByZWxlYXNlIGEgcHJldmlvdXMgcmVxdWVzdCBtYWRlIHVzaW5nCisgKiBoaWZfdm90ZV9saW5rX3VwLiBBIGhpZl92b3RlX2xpbmtfZG93biBjYWxsIHNob3VsZCBvbmx5IGJlIG1hZGUKKyAqIGFmdGVyIGEgY29ycmVzcG9uZGluZyBoaWZfdm90ZV9saW5rX3VwLCBvdGhlcndpc2UgeW91IGNvdWxkIGJlCisgKiBuZWdhdGluZyBhIHZvdGUgZnJvbSBhbm90aGVyIHNvdXJjZS4gV2hlbiBubyB2b3RlcyBhcmUgcHJlc2VudAorICogaGlmIHdpbGwgbm90IGd1YXJhbnRlZSB0aGUgbGlua3N0YXRlIGFmdGVyIGhpZl9idXNfc3VzcGVuZC4KKyAqCisgKiBTWU5DSFJPTklaRSBXSVRIIGhpZl92b3RlX2xpbmtfdXAgYnkgb25seSBjYWxsaW5nIGluIE1DIHRocmVhZAorICogYW5kIGluaXRpYWxpemF0aW9uIGRlaW5pdGlhbGl6YXRpb24gc2VxdWVuY2VuY2VzLgorICoKKyAqIFJldHVybjogbi9hCisgKi8KK3ZvaWQgaGlmX3ZvdGVfbGlua19kb3duKHZvaWQpCit7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCUNERl9CVUcoc2NuKTsKKworCXNjbi0+bGlua3N0YXRlX3ZvdGUtLTsKKwlpZiAoc2NuLT5saW5rc3RhdGVfdm90ZSA9PSAwKQorCQloaWZfYnVzX3ByZXZlbnRfbGlua2Rvd24oZmFsc2UpOworfQorCisvKioKKyAqIGhpZl92b3RlX2xpbmtfdXAoKTogdm90ZSB0byBwcmV2ZW50IGJ1cyBmcm9tIHN1c3BlbmRpbmcKKyAqCisgKiBNYWtlcyBoaWYgZ3VhcmFudGVlIHRoYXQgZncgY2FuIG1lc3NhZ2UgdGhlIGhvc3Qgbm9ybWFsbHkKKyAqIGR1cnJpbmcgc3VzcGVuZC4KKyAqCisgKiBTWU5DSFJPTklaRSBXSVRIIGhpZl92b3RlX2xpbmtfdXAgYnkgb25seSBjYWxsaW5nIGluIE1DIHRocmVhZAorICogYW5kIGluaXRpYWxpemF0aW9uIGRlaW5pdGlhbGl6YXRpb24gc2VxdWVuY2VuY2VzLgorICoKKyAqIFJldHVybjogbi9hCisgKi8KK3ZvaWQgaGlmX3ZvdGVfbGlua191cCh2b2lkKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKwlDREZfQlVHKHNjbik7CisKKwlzY24tPmxpbmtzdGF0ZV92b3RlKys7CisJaWYgKHNjbi0+bGlua3N0YXRlX3ZvdGUgPT0gMSkKKwkJaGlmX2J1c19wcmV2ZW50X2xpbmtkb3duKHRydWUpOworfQorCisvKioKKyAqIGhpZl9jYW5fc3VzcGVuZF9saW5rKCk6IHF1ZXJ5IGlmIGhpZiBpcyBwZXJtaXR0ZWQgdG8gc3VzcGVuZCB0aGUgbGluaworICoKKyAqIEhpZiB3aWxsIGVuc3VyZSB0aGF0IHRoZSBsaW5rIHdvbid0IGJlIHN1c3BlbmRlZCBpZiB0aGUgdXBwZXJsYXllcnMKKyAqIGRvbid0IHdhbnQgaXQgdG8uCisgKgorICogU1lOQ0hST05JWkFUSU9OOiBNQyB0aHJlYWQgaXMgc3RvcHBlZCBiZWZvcmUgYnVzIHN1c3BlbmQgdGh1cworICogd2UgZG9uJ3QgbmVlZCBleHRyYSBsb2NraW5nIHRvIGVuc3VyZSB2b3RlcyBkb250IGNoYW5nZSB3aGlsZQorICogd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHN1c3BlbmRpbmcgb3IgcmVzdW1pbmcuCisgKgorICogUmV0dXJuOiBmYWxzZSBpZiBoaWYgd2lsbCBndWFyYW50ZWUgbGluayB1cCBkdXJyaW5nIHN1c3BlbmQuCisgKi8KK2Jvb2wgaGlmX2Nhbl9zdXNwZW5kX2xpbmsodm9pZCkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRik7CisJQ0RGX0JVRyhzY24pOworCisJcmV0dXJuIHNjbi0+bGlua3N0YXRlX3ZvdGUgPT0gMDsKK30KKworLyoqCisgKiBoaWZfaGlhX2l0ZW1fYWRkcmVzcygpOiBoaWZfaGlhX2l0ZW1fYWRkcmVzcworICogQHRhcmdldF90eXBlOiB0YXJnZXRfdHlwZQorICogQGl0ZW1fb2Zmc2V0OiBpdGVtX29mZnNldAorICoKKyAqIFJldHVybjogbi9hCisgKi8KK3VpbnQzMl90IGhpZl9oaWFfaXRlbV9hZGRyZXNzKHVpbnQzMl90IHRhcmdldF90eXBlLCB1aW50MzJfdCBpdGVtX29mZnNldCkKK3sKKwlzd2l0Y2ggKHRhcmdldF90eXBlKSB7CisJY2FzZSBUQVJHRVRfVFlQRV9BUjYwMDI6CisJCXJldHVybiBBUjYwMDJfSE9TVF9JTlRFUkVTVF9BRERSRVNTICsgaXRlbV9vZmZzZXQ7CisJY2FzZSBUQVJHRVRfVFlQRV9BUjYwMDM6CisJCXJldHVybiBBUjYwMDNfSE9TVF9JTlRFUkVTVF9BRERSRVNTICsgaXRlbV9vZmZzZXQ7CisJY2FzZSBUQVJHRVRfVFlQRV9BUjYwMDQ6CisJCXJldHVybiBBUjYwMDRfSE9TVF9JTlRFUkVTVF9BRERSRVNTICsgaXRlbV9vZmZzZXQ7CisJY2FzZSBUQVJHRVRfVFlQRV9BUjYwMDY6CisJCXJldHVybiBBUjYwMDZfSE9TVF9JTlRFUkVTVF9BRERSRVNTICsgaXRlbV9vZmZzZXQ7CisJY2FzZSBUQVJHRVRfVFlQRV9BUjk4ODg6CisJCXJldHVybiBBUjk4ODhfSE9TVF9JTlRFUkVTVF9BRERSRVNTICsgaXRlbV9vZmZzZXQ7CisJY2FzZSBUQVJHRVRfVFlQRV9BUjYzMjA6CisJY2FzZSBUQVJHRVRfVFlQRV9BUjYzMjBWMjoKKwkJcmV0dXJuIEFSNjMyMF9IT1NUX0lOVEVSRVNUX0FERFJFU1MgKyBpdGVtX29mZnNldDsKKwljYXNlIFRBUkdFVF9UWVBFX1FDQTYxODA6CisJCXJldHVybiBRQ0E2MTgwX0hPU1RfSU5URVJFU1RfQUREUkVTUyArIGl0ZW1fb2Zmc2V0OworCWNhc2UgVEFSR0VUX1RZUEVfQURSQVNURUE6CisJCS8qIEFEUkFTVEVBIGRvZXNuJ3QgaGF2ZSBhIGhvc3QgaW50ZXJlc3QgYWRkcmVzcyAqLworCQlBU1NFUlQoMCk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKioKKyAqIGhpZl9tYXhfbnVtX3JlY2VpdmVzX3JlYWNoZWQoKSAtIGNoZWNrIG1heCByZWNlaXZlIGlzIHJlYWNoZWQKKyAqIEBjb3VudDogdW5zaWduZWQgaW50LgorICoKKyAqIE91dHB1dCBjaGVjayBzdGF0dXMgYXMgYm9vbAorICoKKyAqIFJldHVybjogYm9vbAorICovCitib29sIGhpZl9tYXhfbnVtX3JlY2VpdmVzX3JlYWNoZWQodW5zaWduZWQgaW50IGNvdW50KQoreworCWlmIChXTEFOX0lTX0VQUElOR19FTkFCTEVEKGNkc19nZXRfY29ucGFyYW0oKSkpCisJCXJldHVybiBjb3VudCA+IDEyMDsKKwllbHNlCisJCXJldHVybiBjb3VudCA+IE1BWF9OVU1fT0ZfUkVDRUlWRVM7Cit9CisKKy8qKgorICogaW5pdF9idWZmZXJfY291bnQoKSAtIGluaXRpYWwgYnVmZmVyIGNvdW50CisgKiBAbWF4U2l6ZTogY2RmX3NpemVfdAorICoKKyAqIHJvdXRpbmUgdG8gbW9kaWZ5IHRoZSBpbml0aWFsIGJ1ZmZlciBjb3VudCB0byBiZSBhbGxvY2F0ZWQgb24gYW4gb3MKKyAqIHBsYXRmb3JtIGJhc2lzLiBQbGF0Zm9ybSBvd25lciB3aWxsIG5lZWQgdG8gbW9kaWZ5IHRoaXMgYXMgbmVlZGVkCisgKgorICogUmV0dXJuOiBjZGZfc2l6ZV90CisgKi8KK2NkZl9zaXplX3QgaW5pdF9idWZmZXJfY291bnQoY2RmX3NpemVfdCBtYXhTaXplKQoreworCXJldHVybiBtYXhTaXplOworfQorCisvKioKKyAqIGhpZl9pbml0X2NkZl9jdHgoKTogaGlmX2luaXRfY2RmX2N0eAorICogQGhpZl9jdHg6IGhpZl9jdHgKKyAqCisgKiBSZXR1cm46IGludAorICovCitpbnQgaGlmX2luaXRfY2RmX2N0eCh2b2lkICpoaWZfY3R4KQoreworCWNkZl9kZXZpY2VfdCBjZGZfY3R4OworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gKHN0cnVjdCBvbF9zb2Z0YyAqKWhpZl9jdHg7CisKKwljZGZfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfQ0RGX0RFVklDRSk7CisJaWYgKCFjZGZfY3R4KSB7CisJCUhJRl9FUlJPUigiJXM6IENERiBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljZGZfY3R4LT5kcnYgPSAmc2NuLT5hcHNfb3NkZXY7CisJY2RmX2N0eC0+ZHJ2X2hkbCA9IHNjbi0+YXBzX29zZGV2LmJkZXY7CisJY2RmX2N0eC0+ZGV2ID0gc2NuLT5hcHNfb3NkZXYuZGV2aWNlOworCXNjbi0+Y2RmX2RldiA9IGNkZl9jdHg7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGlmX2RlaW5pdF9jZGZfY3R4KCk6IGhpZl9kZWluaXRfY2RmX2N0eAorICogQGhpZl9jdHg6IGhpZl9jdHgKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCBoaWZfZGVpbml0X2NkZl9jdHgodm9pZCAqaGlmX2N0eCkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IChzdHJ1Y3Qgb2xfc29mdGMgKiloaWZfY3R4OworCisJaWYgKHNjbiA9PSBOVUxMIHx8ICFzY24tPmNkZl9kZXYpCisJCXJldHVybjsKKwlzY24tPmNkZl9kZXYgPSBOVUxMOworfQorCisvKioKKyAqIGhpZl9zYXZlX2h0Y19odHRfY29uZmlnX2VuZHBvaW50KCk6CisgKiBoaWZfc2F2ZV9odGNfaHR0X2NvbmZpZ19lbmRwb2ludAorICogQGh0Y19lbmRwb2ludDogaHRjX2VuZHBvaW50CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgaGlmX3NhdmVfaHRjX2h0dF9jb25maWdfZW5kcG9pbnQoaW50IGh0Y19lbmRwb2ludCkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRik7CisKKwlpZiAoIXNjbikgeworCQlISUZfRVJST1IoIiVzOiBlcnJvcjogc2NuIG9yIHNjbi0+aGlmX3NjIGlzIE5VTEwhIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXNjbi0+aHRjX2VuZHBvaW50ID0gaHRjX2VuZHBvaW50OworfQorCisvKioKKyAqIGhpZl9nZXRfaHdfbmFtZSgpOiBnZXQgYSBodW1hbiByZWFkYWJsZSBuYW1lIGZvciB0aGUgaGFyZHdhcmUKKyAqCisgKiBSZXR1cm46IGh1bWFuIHJlYWRpYmxlIG5hbWUgZm9yIHRoZSB1bmRlcmx5aW5nIHdpZmkgaGFyZHdhcmUuCisgKi8KK2NvbnN0IGNoYXIgKmhpZl9nZXRfaHdfbmFtZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShxd2xhbl9od19saXN0KTsgaSsrKSB7CisJCWlmIChzY24tPnRhcmdldF92ZXJzaW9uID09IHF3bGFuX2h3X2xpc3RbaV0uaWQgJiYKKwkJICAgIHNjbi0+dGFyZ2V0X3JldmlzaW9uID09IHF3bGFuX2h3X2xpc3RbaV0uc3ViaWQpIHsKKwkJCXJldHVybiBxd2xhbl9od19saXN0W2ldLm5hbWU7CisJCX0KKwl9CisKKwlyZXR1cm4gIlVua25vd24gRGV2aWNlIjsKK30KKworLyoqCisgKiBoaWZfZ2V0X2h3X2luZm8oKTogaGlmX2dldF9od19pbmZvCisgKiBAc2NuOiBzY24KKyAqIEB2ZXJzaW9uOiB2ZXJzaW9uCisgKiBAcmV2aXNpb246IHJldmlzaW9uCisgKgorICogUmV0dXJuOiBuL2EKKyAqLwordm9pZCBoaWZfZ2V0X2h3X2luZm8odm9pZCAqc2NuLCB1MzIgKnZlcnNpb24sIHUzMiAqcmV2aXNpb24sCisJCQljb25zdCBjaGFyICoqdGFyZ2V0X25hbWUpCit7CisJKnZlcnNpb24gPSAoKHN0cnVjdCBvbF9zb2Z0YyAqKXNjbiktPnRhcmdldF92ZXJzaW9uOworCSpyZXZpc2lvbiA9ICgoc3RydWN0IG9sX3NvZnRjICopc2NuKS0+dGFyZ2V0X3JldmlzaW9uOworCSp0YXJnZXRfbmFtZSA9IGhpZl9nZXRfaHdfbmFtZSgoc3RydWN0IG9sX3NvZnRjICopc2NuKTsKK30KKworLyoqCisgKiBoaWZfc2V0X2Z3X2luZm8oKTogc2V0IHRoZSB0YXJnZXRfZndfdmVyc2lvbgorICogQHNjbjogc2NuCisgKiBAdGFyZ2V0X2Z3X3ZlcnNpb246IHRhcmdldF9md192ZXJzaW9uCisgKgorICogUmV0dXJuOiBuL2EKKyAqLwordm9pZCBoaWZfc2V0X2Z3X2luZm8odm9pZCAqc2NuLCB1aW50MzJfdCB0YXJnZXRfZndfdmVyc2lvbikKK3sKKwkoKHN0cnVjdCBvbF9zb2Z0YyAqKXNjbiktPnRhcmdldF9md192ZXJzaW9uID0gdGFyZ2V0X2Z3X3ZlcnNpb247Cit9CisKKy8qKgorICogaGlmX29wZW4oKTogaGlmX29wZW4KKyAqCisgKiBSZXR1cm46IHNjbgorICovCitDREZfU1RBVFVTIGhpZl9vcGVuKHZvaWQpCit7CisJc3RydWN0IG9sX3NvZnRjICpzY247CisJdl9DT05URVhUX3QgY2RzX2NvbnRleHQ7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwljZHNfY29udGV4dCA9IGNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKTsKKwlzdGF0dXMgPSBjZHNfYWxsb2NfY29udGV4dChjZHNfY29udGV4dCwgQ0RGX01PRFVMRV9JRF9ISUYsCisJCQkJKHZvaWQgKiopJnNjbiwgc2l6ZW9mKCpzY24pKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlISUZfRVJST1IoIiVzOiBjYW5ub3QgYWxsb2Mgb2xfc2MiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJY2RmX21lbV96ZXJvKHNjbiwgc2l6ZW9mKCpzY24pKTsKKwlzY24tPmVuYWJsZXVhcnRwcmludCA9IDA7CisJc2NuLT5lbmFibGVmd2xvZyA9IDA7CisJc2NuLT5tYXhfbm9fb2ZfcGVlcnMgPSAxOworCXNjbi0+cGt0X2xvZ19pbml0ID0gZmFsc2U7CisJY2RmX2F0b21pY19pbml0KCZzY24tPndvd19kb25lKTsKKwljZGZfYXRvbWljX2luaXQoJnNjbi0+YWN0aXZlX3Rhc2tsZXRfY250KTsKKwljZGZfYXRvbWljX2luaXQoJnNjbi0+bGlua19zdXNwZW5kZWQpOworCWNkZl9hdG9taWNfaW5pdCgmc2NuLT50YXNrbGV0X2Zyb21faW50cik7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2NuLT5hcHNfb3NkZXYuZXZlbnRfcXVldWUpOworCWNkZl9zcGlubG9ja19pbml0KCZzY24tPnRhcmdldF9sb2NrKTsKKwlzY24tPmxpbmtzdGF0ZV92b3RlID0gMDsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGhpZl9jbG9zZSgpOiBoaWZfY2xvc2UKKyAqIEBoaWZfY3R4OiBoaWZfY3R4CisgKgorICogUmV0dXJuOiBuL2EKKyAqLwordm9pZCBoaWZfY2xvc2Uodm9pZCAqaGlmX2N0eCkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGhpZl9jdHg7CisKKwlpZiAoc2NuID09IE5VTEwpIHsKKwkJSElGX0VSUk9SKCIlczogb2xfc29mdGMgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzY24tPmF0aGRpYWdfcHJvY2ZzX2luaXRlZCkgeworCQlhdGhkaWFnX3Byb2Nmc19yZW1vdmUoKTsKKwkJc2NuLT5hdGhkaWFnX3Byb2Nmc19pbml0ZWQgPSBmYWxzZTsKKwl9CisKKwlpZiAoc2NuLT5oaWZfaGRsKSB7CisJCWNkZl9tZW1fZnJlZShzY24tPmhpZl9oZGwpOworCQlzY24tPmhpZl9oZGwgPSBOVUxMOworCX0KKwloaWZfYnVzX2Nsb3NlKHNjbik7CisJY2RzX2ZyZWVfY29udGV4dChjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCksCisJCUNERl9NT0RVTEVfSURfSElGLCBoaWZfY3R4KTsKK30KKworLyoqCisgKiBoaWZfZW5hYmxlKCk6IGhpZl9lbmFibGUKKyAqIEBoaWZfY3R4OiBoaWZfY3R4CisgKiBAZGV2OiBkZXYKKyAqIEBiZGV2OiBidXMgZGV2CisgKiBAYmlkOiBidXMgSUQKKyAqIEBidXNfdHlwZTogYnVzIHR5cGUKKyAqIEB0eXBlOiBlbmFibGUgdHlwZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIGhpZl9lbmFibGUodm9pZCAqaGlmX2N0eCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHZvaWQgKmJkZXYsIGNvbnN0IGhpZl9idXNfaWQgKmJpZCwKKwkJCQkJICBlbnVtIGF0aF9oYWxfYnVzX3R5cGUgYnVzX3R5cGUsCisJCQkJCSAgZW51bSBoaWZfZW5hYmxlX3R5cGUgdHlwZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGhpZl9jdHg7CisKKwlpZiAoc2NuID09IE5VTEwpIHsKKwkJSElGX0VSUk9SKCIlczogaGlmX2N0eCA9IE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTlVMTF9WQUxVRTsKKwl9CisKKwlzdGF0dXMgPSBoaWZfYnVzX29wZW4oc2NuLCBidXNfdHlwZSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJSElGX0VSUk9SKCIlczogaGlmX2J1c19vcGVuIGVycm9yID0gJWQsIGJ1c190eXBlID0gJWQiLAorCQkJCSAgX19mdW5jX18sIHN0YXR1cywgYnVzX3R5cGUpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGhpZl9lbmFibGVfYnVzKHNjbiwgZGV2LCBiZGV2LCBiaWQsIHR5cGUpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWhpZl9idXNfY2xvc2Uoc2NuKTsKKwkJSElGX0VSUk9SKCIlczogaGlmX2VuYWJsZV9idXMgZXJyb3IgPSAlZCIsCisJCQkJICBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoQURSQVNURUFfQlUpCisJCWhpZl92b3RlX2xpbmtfdXAoKTsKKworCWlmIChoaWZfY29uZmlnX2NlKHNjbikpIHsKKwkJSElGX0VSUk9SKCIlczogVGFyZ2V0IHByb2JlIGZhaWxlZC4iLCBfX2Z1bmNfXyk7CisJCWhpZl9kaXNhYmxlX2J1cyhzY24tPmFwc19vc2Rldi5iZGV2KTsKKwkJaGlmX2J1c19jbG9zZShzY24pOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJLyoKKwkgKiBGbGFnIHRvIGF2b2lkIHBvdGVudGlhbCB1bmFsbG9jYXRlZCBtZW1vcnkgYWNjZXNzIGZyb20gTVNJCisJICogaW50ZXJydXB0IGhhbmRsZXIgd2hpY2ggY291bGQgZ2V0IHNjaGVkdWxlZCBhcyBzb29uIGFzIE1TSQorCSAqIGlzIGVuYWJsZWQsIGkuZSB0byB0YWtlIGNhcmUgb2YgdGhlIHJhY2UgZHVlIHRvIHRoZSBvcmRlcgorCSAqIGluIHdoZXJlIE1TSSBpcyBlbmFibGVkIGJlZm9yZSB0aGUgbWVtb3J5LCB0aGF0IHdpbGwgYmUKKwkgKiBpbiBpbnRlcnJ1cHQgaGFuZGxlcnMsIGlzIGFsbG9jYXRlZC4KKwkgKi8KKworI2lmZGVmIEhJRl9QQ0kKKwlzdGF0dXMgPSBoaWZfY29uZmlndXJlX2lycShzY24tPmhpZl9zYyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJSElGX0VSUk9SKCIlczogRVJST1IgLSBjb25maWd1cmVfSVJRX2FuZF9DRSBmYWlsZWQsIHN0YXR1cyA9ICVkIiwKKwkJCSAgIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorI2VuZGlmCisKKwlzY24tPmhpZl9pbml0X2RvbmUgPSB0cnVlOworCisJSElGX1RSQUNFKCIlczogWCBPSyIsIF9fZnVuY19fKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogaGlmX3BrdGxvZ21vZF9leGl0KCk6IGhpZl9wa3Rsb2dtb2RfZXhpdAorICogQHNjbjogc2NuCisgKgorICogUmV0dXJuOiBuL2EKKyAqLworI2lmbmRlZiBSRU1PVkVfUEtUX0xPRwordm9pZCBoaWZfcGt0bG9nbW9kX2V4aXQodm9pZCAqaGlmX2N0eCkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGhpZl9jdHg7CisKKwlpZiAoc2NuICYmIGNkc19nZXRfY29ucGFyYW0oKSAhPSBDREZfRlRNX01PREUgJiYKKwkgICAgIVdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoY2RzX2dldF9jb25wYXJhbSgpKSAmJiBzY24tPnBrdF9sb2dfaW5pdCkgeworCQlwa3Rsb2dtb2RfZXhpdChzY24pOworCQlzY24tPnBrdF9sb2dfaW5pdCA9IGZhbHNlOworCX0KK30KKyNlbHNlCit2b2lkIGhpZl9wa3Rsb2dtb2RfZXhpdCh2b2lkICpoaWZfY3R4KQoreworfQorI2VuZGlmCisKKyNpZiAoKCFkZWZpbmVkKFFDQV9XSUZJXzNfMF9JSEVMSVVNKSAmJiAhZGVmaW5lZChRQ0FfV0lGSV8zXzBfQURSQVNURUEpKSB8fCBkZWZpbmVkKENPTkZJR19JQ05TUykpCitzdGF0aWMgaW5saW5lIHZvaWQgY25zc19wY2llX25vdGlmeV9xNih2b2lkKQoreworCXJldHVybjsKK30KKyNlbmRpZgorCisvKioKKyAqIGhpZl93bGFuX2Rpc2FibGUoKTogY2FsbCB0aGUgcGxhdGZvcm0gZHJpdmVyIHRvIGRpc2FibGUgd2xhbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFzc2VzIHRoZSBjb25fbW9kZSB0byBwbGF0Zm9ybSBkcml2ZXIgdG8gZGlzYWJsZQorICogd2xhbi4KKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCBoaWZfd2xhbl9kaXNhYmxlKHZvaWQpCit7CisJZW51bSBpY25zc19kcml2ZXJfbW9kZSBtb2RlOworCXVpbnQzMl90IGNvbl9tb2RlID0gY2RzX2dldF9jb25wYXJhbSgpOworCisJc3dpdGNoIChjb25fbW9kZSkgeworCWNhc2UgQ0RGX0ZUTV9NT0RFOgorCQltb2RlID0gSUNOU1NfRlRNOworCQlicmVhazsKKwljYXNlIENERl9FUFBJTkdfTU9ERToKKwkJbW9kZSA9IElDTlNTX0VQUElORzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbW9kZSA9IElDTlNTX01JU1NJT047CisJCWJyZWFrOworCX0KKworCWljbnNzX3dsYW5fZGlzYWJsZShtb2RlKTsKK30KKwordm9pZCBoaWZfZGlzYWJsZSh2b2lkICpoaWZfY3R4LCBlbnVtIGhpZl9kaXNhYmxlX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGhpZl9jdHg7CisKKwlpZiAoIXNjbikKKwkJcmV0dXJuOworCisJaGlmX25vaW50cnMoc2NuKTsKKwlpZiAoc2NuLT5oaWZfaW5pdF9kb25lID09IGZhbHNlKQorCQloaWZfc2h1dF9kb3duX2RldmljZShzY24pOworCWVsc2UKKwkJaGlmX3N0b3Aoc2NuKTsKKworCWlmIChBRFJBU1RFQV9CVSkKKwkJaGlmX3ZvdGVfbGlua19kb3duKCk7CisKKwlpZiAoc2NuLT5hcHNfb3NkZXYuYmRldikKKwkJaGlmX2Rpc2FibGVfYnVzKHNjbi0+YXBzX29zZGV2LmJkZXYpOworCisJaWYgKElIRUxJVU1fQlUpIHsKKwkJY25zc19wY2llX25vdGlmeV9xNigpOworCQlISUZfVFJBQ0UoIiVzOiBjbnNzX3BjaWVfbm90aWZ5X3E2IGRvbmUsIG5vdGljZV9zZW5kPSAlZCIsCisJCQkgIF9fZnVuY19fLCBzY24tPm5vdGljZV9zZW5kKTsKKwl9CisKKwloaWZfd2xhbl9kaXNhYmxlKCk7CisKKwlzY24tPm5vdGljZV9zZW5kID0gZmFsc2U7CisKKwlISUZfSU5GTygiJXM6IFgiLCBfX2Z1bmNfXyk7Cit9CisKKworLyoqCisgKiBoaWZfY3Jhc2hfc2h1dGRvd25fZHVtcF9jZV9yZWdpc3RlcigpOgorICogaGlmX2NyYXNoX3NodXRkb3duX2R1bXBfY2VfcmVnaXN0ZXIKKyAqIEBoaWZfY3R4OiBoaWZfY3R4CisgKgorICogUmV0dXJuOiBuL2EKKyAqLworI2lmIGRlZmluZWQoVEFSR0VUX1JBTURVTVBfQUZURVJfS0VSTkVMX1BBTklDKSBcCismJiBkZWZpbmVkKEhJRl9QQ0kpICYmIGRlZmluZWQoREVCVUcpCisKK3N0YXRpYyB2b2lkIGhpZl9jcmFzaF9zaHV0ZG93bl9kdW1wX2NlX3JlZ2lzdGVyKHZvaWQgKmhpZl9jdHgpCit7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBoaWZfY3R4OworCisJaWYgKGhpZl9jaGVja19zb2Nfc3RhdHVzKHNjbikKKwkgICAgfHwgZHVtcF9jZV9yZWdpc3RlcihzY24pKSB7CisJCXJldHVybjsKKwl9CisKKwlkdW1wX2NlX2RlYnVnX3JlZ2lzdGVyKHNjbik7Cit9CisKKy8qKgorICogaGlmX2NyYXNoX3NodXRkb3duKCk6IGhpZl9jcmFzaF9zaHV0ZG93bgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBwbGF0Zm9ybSBkcml2ZXIgdG8gZHVtcCBDRSByZWdpc3RlcnMKKyAqCisgKiBAaGlmX2N0eDogaGlmX2N0eAorICoKKyAqIFJldHVybjogbi9hCisgKi8KK3ZvaWQgaGlmX2NyYXNoX3NodXRkb3duKHZvaWQgKmhpZl9jdHgpCit7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBoaWZfY3R4OworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZTsKKworCWlmICghc2NuKQorCQlyZXR1cm47CisKKwloaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKXNjbi0+aGlmX2hkbDsKKwlpZiAoIWhpZl9zdGF0ZSkKKwkJcmV0dXJuOworCisKKwlpZiAoT0xfVFJHRVRfU1RBVFVTX1JFU0VUID09IHNjbi0+dGFyZ2V0X3N0YXR1cykgeworCQlISUZfSU5GT19NRUQoIiVzOiBUYXJnZXQgaXMgYWxyZWFkeSBhc3NlcnRlZCwgaWdub3JlISIsCisJCQkgICAgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKGNkc19pc19sb2FkX3VubG9hZF9pbl9wcm9ncmVzcygpKSB7CisJCUhJRl9FUlJPUigiJXM6IExvYWQvdW5sb2FkIGlzIGluIHByb2dyZXNzLCBpZ25vcmUhIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJY2RmX3NwaW5fbG9ja19pcnFzYXZlKCZzY24tPnRhcmdldF9sb2NrKTsKKworCWhpZl9jcmFzaF9zaHV0ZG93bl9kdW1wX2NlX3JlZ2lzdGVyKGhpZl9jdHgpOworCisJaWYgKG9sX2NvcHlfcmFtZHVtcChzY24pKQorCQlnb3RvIG91dDsKKworCUhJRl9JTkZPX01FRCgiJXM6IFJBTSBkdW1wIGNvbGxlY3RpbmcgY29tcGxldGVkISIsIF9fZnVuY19fKTsKKworb3V0OgorCWNkZl9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY24tPnRhcmdldF9sb2NrKTsKKwlyZXR1cm47Cit9CisjZWxzZQordm9pZCBoaWZfY3Jhc2hfc2h1dGRvd24odm9pZCAqaGlmX2N0eCkKK3sKKwlISUZfSU5GT19NRUQoIiVzOiBDb2xsZWN0aW5nIHRhcmdldCBSQU0gZHVtcCBkaXNhYmxlZCIsCisJCV9fZnVuY19fKTsKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogVEFSR0VUX1JBTURVTVBfQUZURVJfS0VSTkVMX1BBTklDICovCisKKyNpZmRlZiBRQ0FfV0lGSV8zXzAKKy8qKgorICogaGlmX2NoZWNrX2Z3X3JlZygpOiBoaWZfY2hlY2tfZndfcmVnCisgKiBAc2NuOiBzY24KKyAqIEBzdGF0ZToKKyAqCisgKiBSZXR1cm46IGludAorICovCitpbnQgaGlmX2NoZWNrX2Z3X3JlZyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgSVBBX09GRkxPQUQKKy8qKgorICogaGlmX3JlYWRfcGh5X21lbV9iYXNlKCk6IGhpZl9yZWFkX3BoeV9tZW1fYmFzZQorICogQHNjbjogc2NuCisgKiBAcGh5X21lbV9iYXNlOiBwaHlzaWNhbCBtZW0gYmFzZQorICoKKyAqIFJldHVybjogbi9hCisgKi8KK3ZvaWQgaGlmX3JlYWRfcGh5X21lbV9iYXNlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBjZGZfZG1hX2FkZHJfdCAqcGh5X21lbV9iYXNlKQoreworCSpwaHlfbWVtX2Jhc2UgPSBzY24tPm1lbV9wYTsKK30KKyNlbmRpZiAvKiBJUEFfT0ZGTE9BRCAqLworCisvKioKKyAqIGhpZl9nZXRfZGV2aWNlX3R5cGUoKTogaGlmX2dldF9kZXZpY2VfdHlwZQorICogQGRldmljZV9pZDogZGV2aWNlX2lkCisgKiBAcmV2aXNpb25faWQ6IHJldmlzaW9uX2lkCisgKiBAaGlmX3R5cGU6IHJldHVybmVkIGhpZl90eXBlCisgKiBAdGFyZ2V0X3R5cGU6IHJldHVybmVkIHRhcmdldF90eXBlCisgKgorICogUmV0dXJuOiBpbnQKKyAqLworaW50IGhpZl9nZXRfZGV2aWNlX3R5cGUodWludDMyX3QgZGV2aWNlX2lkLAorCQkJdWludDMyX3QgcmV2aXNpb25faWQsCisJCQl1aW50MzJfdCAqaGlmX3R5cGUsIHVpbnQzMl90ICp0YXJnZXRfdHlwZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisjaWZkZWYgUUNBX1dJRklfM18wX0FEUkFTVEVBCisJY2FzZSBBRFJBU1RFQV9ERVZJQ0VfSUQ6CisJY2FzZSBBRFJBU1RFQV9ERVZJQ0VfSURfUDJfRTEyOgorCisJCSpoaWZfdHlwZSA9IEhJRl9UWVBFX0FEUkFTVEVBOworCQkqdGFyZ2V0X3R5cGUgPSBUQVJHRVRfVFlQRV9BRFJBU1RFQTsKKwkJYnJlYWs7CisjZWxzZQorCWNhc2UgUUNBNjE4MF9ERVZJQ0VfSUQ6CisJCSpoaWZfdHlwZSA9IEhJRl9UWVBFX1FDQTYxODA7CisJCSp0YXJnZXRfdHlwZSA9IFRBUkdFVF9UWVBFX1FDQTYxODA7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIEFSOTg4OF9ERVZJQ0VfSUQ6CisJCSpoaWZfdHlwZSA9IEhJRl9UWVBFX0FSOTg4ODsKKwkJKnRhcmdldF90eXBlID0gVEFSR0VUX1RZUEVfQVI5ODg4OworCQlicmVhazsKKworCWNhc2UgQVI2MzIwX0RFVklDRV9JRDoKKwkJc3dpdGNoIChyZXZpc2lvbl9pZCkgeworCQljYXNlIEFSNjMyMF9GV18xXzE6CisJCWNhc2UgQVI2MzIwX0ZXXzFfMzoKKwkJCSpoaWZfdHlwZSA9IEhJRl9UWVBFX0FSNjMyMDsKKwkJCSp0YXJnZXRfdHlwZSA9IFRBUkdFVF9UWVBFX0FSNjMyMDsKKwkJCWJyZWFrOworCisJCWNhc2UgQVI2MzIwX0ZXXzJfMDoKKwkJY2FzZSBBUjYzMjBfRldfM18wOgorCQljYXNlIEFSNjMyMF9GV18zXzI6CisJCQkqaGlmX3R5cGUgPSBISUZfVFlQRV9BUjYzMjBWMjsKKwkJCSp0YXJnZXRfdHlwZSA9IFRBUkdFVF9UWVBFX0FSNjMyMFYyOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUhJRl9FUlJPUigiJXM6IGVycm9yIC0gZGV2X2lkID0gMHgleCwgcmV2X2lkID0gMHgleCIsCisJCQkJICAgX19mdW5jX18sIGRldmljZV9pZCwgcmV2aXNpb25faWQpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZW5kOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJSElGX0VSUk9SKCIlczogVW5zdXBwb3J0ZWQgZGV2aWNlIElEISIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJYnJlYWs7CisJfQorZW5kOgorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvaGlmX21haW4uaCBiL2NvcmUvaGlmL3NyYy9oaWZfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWM4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hpZi9zcmMvaGlmX21haW4uaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIE5COiBJbmFwcHJvcHJpYXRlIHJlZmVyZW5jZXMgdG8gIkhUQyIgYXJlIHVzZWQgaW4gdGhpcyAoYW5kIG90aGVyKQorICogSElGIGltcGxlbWVudGF0aW9ucy4gIEhUQyBpcyB0eXBpY2FsbHkgdGhlIGNhbGxpbmcgbGF5ZXIsIGJ1dCBpdAorICogdGhlb3JldGljYWxseSBjb3VsZCBiZSBzb21lIGFsdGVybmF0aXZlLgorICovCisKKy8qCisgKiBUaGlzIGhvbGRzIGFsbCBzdGF0ZSBuZWVkZWQgdG8gcHJvY2VzcyBhIHBlbmRpbmcgc2VuZC9yZWN2IGludGVycnVwdC4KKyAqIFRoZSBpbmZvcm1hdGlvbiBpcyBzYXZlZCBoZXJlIGFzIHNvb24gYXMgdGhlIGludGVycnVwdCBvY2N1cnMgKHRodXMKKyAqIGFsbG93aW5nIHRoZSB1bmRlcmx5aW5nIENFIHRvIHJlLXVzZSB0aGUgcmluZyBkZXNjcmlwdG9yKS4gVGhlCisgKiBpbmZvcm1hdGlvbiBoZXJlIGlzIGV2ZW50dWFsbHkgcHJvY2Vzc2VkIGJ5IGEgY29tcGxldGlvbiBwcm9jZXNzaW5nCisgKiB0aHJlYWQuCisgKi8KKworI2lmbmRlZiBfX0hJRl9NQUlOX0hfXworI2RlZmluZSBfX0hJRl9NQUlOX0hfXworCisjaW5jbHVkZSA8Y2RmX2F0b21pYy5oPiAgICAgICAgIC8qIGNkZl9hdG9taWNfcmVhZCAqLworI2luY2x1ZGUgImNkZl9sb2NrLmgiCisjaW5jbHVkZSAiY2VwY2kuaCIKKyNpbmNsdWRlICJoaWYuaCIKKworI2RlZmluZSBISUZfTUlOX1NMRUVQX0lOQUNUSVZJVFlfVElNRV9NUyAgICAgNTAKKyNkZWZpbmUgSElGX1NMRUVQX0lOQUNUSVZJVFlfVElNRVJfUEVSSU9EX01TIDYwCisKKy8qCisgKiBUaGlzIG1hY3JvIGltcGxlbWVudGF0aW9uIGlzIGV4cG9zZWQgZm9yIGVmZmljaWVuY3kgb25seS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgY2hhbmdlIGFuZCBjYWxsZXJzIHNob3VsZAorICogY29uc2lkZXIgdGhlIHRhcmdpZCB0byBiZSBhIGNvbXBsZXRlbHkgb3BhcXVlIGhhbmRsZS4KKyAqLworI2RlZmluZSBUQVJHSURfVE9fUENJX0FERFIodGFyZ2lkKSAoKigoQV90YXJnZXRfaWRfdCAqKSh0YXJnaWQpKSkKKworQV90YXJnZXRfaWRfdCBoaWZfZ2V0X3RhcmdldF9pZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7Citib29sIGhpZl90YXJnZXRfZm9yY2VkX2F3YWtlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKKworI2lmZGVmIFFDQV9XSUZJXzNfMAorI2RlZmluZSBESVNBQkxFX0wxU1NfU1RBVEVTIDEKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHX09OCisjZGVmaW5lIE1BWF9OVU1fT0ZfUkVDRUlWRVMgMTAwIC8qIE1heGltdW0gbnVtYmVyIG9mIFJ4IGJ1ZiB0byBwcm9jZXNzIGJlZm9yZSoKKwkJCQkgKiBicmVhayBvdXQgaW4gU0xVQiBkZWJ1ZyBidWlsZHMgKi8KKyNlbGlmIGRlZmluZWQoRkVBVFVSRV9OQVBJKQorI2RlZmluZSBNQVhfTlVNX09GX1JFQ0VJVkVTIEhJRl9OQVBJX01BWF9SRUNFSVZFUworI2Vsc2UgLyogbm8gU0xVQlMsIG5vIE5BUEkgKi8KKy8qIE1heGltdW0gbnVtYmVyIG9mIFJ4IGJ1ZiB0byBwcm9jZXNzIGJlZm9yZSBicmVhayBvdXQgKi8KKyNkZWZpbmUgTUFYX05VTV9PRl9SRUNFSVZFUyAxMDAwCisjZW5kaWYgLyogU0xVQl9ERUJVR19PTiAvIEZFQVRVUkVfTkFQSSAqLworCisjaWZkZWYgUUNBX1dJRklfM18wX0lIRUxJVU0KKyNkZWZpbmUgSUhFTElVTV9CVSAxCisjZWxzZQorI2RlZmluZSBJSEVMSVVNX0JVIDAKKyNlbmRpZgorCisjaWZkZWYgUUNBX1dJRklfM18wX0FEUkFTVEVBCisjZGVmaW5lIEFEUkFTVEVBX0JVIDEKKyNlbHNlCisjZGVmaW5lIEFEUkFTVEVBX0JVIDAKKyNlbmRpZgorCisjaWZkZWYgUUNBX1dJRklfM18wCisjZGVmaW5lIEhBU19GV19JTkRJQ0FUT1IgMAorI2Vsc2UKKyNkZWZpbmUgSEFTX0ZXX0lORElDQVRPUiAxCisjZW5kaWYKKworCisjZGVmaW5lIEFSOTg4OF9ERVZJQ0VfSUQgKDB4MDAzYykKKyNkZWZpbmUgQVI2MzIwX0RFVklDRV9JRCAoMHgwMDNlKQorI2RlZmluZSBBUjYzMjBfRldfMV8xICAoMHgxMSkKKyNkZWZpbmUgQVI2MzIwX0ZXXzFfMyAgKDB4MTMpCisjZGVmaW5lIEFSNjMyMF9GV18yXzAgICgweDIwKQorI2RlZmluZSBBUjYzMjBfRldfM18wICAoMHgzMCkKKyNkZWZpbmUgQVI2MzIwX0ZXXzNfMiAgKDB4MzIpCisjZGVmaW5lIEFEUkFTVEVBX0RFVklDRV9JRCAoMHhhYmNkKQorI2RlZmluZSBBRFJBU1RFQV9ERVZJQ0VfSURfUDJfRTEyICgweDcwMjEpCisjaWYgKGRlZmluZWQoUVZJVCkgfHwgZGVmaW5lZCAoUUNBX1dJRklfM18wX0lIRUxJVU0pKQorI2RlZmluZSBRQ0E2MTgwX0RFVklDRV9JRCAoMHhhYmNkKQorI2Vsc2UKKyNkZWZpbmUgUUNBNjE4MF9ERVZJQ0VfSUQgKDB4MDQxKQorI2VuZGlmCisKK0FfdGFyZ2V0X2lkX3QgaGlmX2dldF90YXJnZXRfaWQoc3RydWN0IG9sX3NvZnRjICpzY24pOwordm9pZCBoaWZfZHVtcF9waXBlX2RlYnVnX2NvdW50KHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKKworYm9vbCBoaWZfbWF4X251bV9yZWNlaXZlc19yZWFjaGVkKHVuc2lnbmVkIGludCBjb3VudCk7CitpbnQgaGlmX2NvbmZpZ19jZShoaWZfaGFuZGxlX3QgaGlmX2hkbCk7CitpbnQgYXRoZGlhZ19wcm9jZnNfaW5pdCh2b2lkICpzY24pOwordm9pZCBhdGhkaWFnX3Byb2Nmc19yZW1vdmUodm9pZCk7CisvKiByb3V0aW5lIHRvIG1vZGlmeSB0aGUgaW5pdGlhbCBidWZmZXIgY291bnQgdG8gYmUgYWxsb2NhdGVkIG9uIGFuIG9zCisgKiBwbGF0Zm9ybSBiYXNpcy4gUGxhdGZvcm0gb3duZXIgd2lsbCBuZWVkIHRvIG1vZGlmeSB0aGlzIGFzIG5lZWRlZAorICovCitjZGZfc2l6ZV90IGluaXRfYnVmZmVyX2NvdW50KGNkZl9zaXplX3QgbWF4U2l6ZSk7CisKK2lycXJldHVybl90IGhpZl9md19pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpOworaW50IGhpZl9nZXRfdGFyZ2V0X3R5cGUoc3RydWN0IG9sX3NvZnRjICpvbF9zYywgc3RydWN0IGRldmljZSAqZGV2LAorCXZvaWQgKmJkZXYsIGNvbnN0IGhpZl9idXNfaWQgKmJpZCwgdWludDMyX3QgKmhpZl90eXBlLAorCXVpbnQzMl90ICp0YXJnZXRfdHlwZSk7CitpbnQgaGlmX2dldF9kZXZpY2VfdHlwZSh1aW50MzJfdCBkZXZpY2VfaWQsCisJCQl1aW50MzJfdCByZXZpc2lvbl9pZCwKKwkJCXVpbnQzMl90ICpoaWZfdHlwZSwgdWludDMyX3QgKnRhcmdldF90eXBlKTsKKy8qVGhlc2UgZnVuY3Rpb25zIGFyZSBleHBvc2VkIHRvIEhERCovCitpbnQgaGlmX2luaXRfY2RmX2N0eCh2b2lkICpvbF9zYyk7Cit2b2lkIGhpZl9kZWluaXRfY2RmX2N0eCh2b2lkICpvbF9zYyk7Citib29sIGhpZl90YXJnX2lzX2F3YWtlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB2b2lkICpfX2lvbWVtICptZW0pOwordm9pZCBoaWZfbm9pbnRycyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7Cit2b2lkIGhpZl9idXNfY2xvc2Uoc3RydWN0IG9sX3NvZnRjICpvbF9zYyk7CitDREZfU1RBVFVTIGhpZl9idXNfb3BlbihzdHJ1Y3Qgb2xfc29mdGMgKm9sX3NjLAorCWVudW0gYXRoX2hhbF9idXNfdHlwZSBidXNfdHlwZSk7CitDREZfU1RBVFVTIGhpZl9lbmFibGVfYnVzKHN0cnVjdCBvbF9zb2Z0YyAqb2xfc2MsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwl2b2lkICpiZGV2LCBjb25zdCBoaWZfYnVzX2lkICpiaWQsIGVudW0gaGlmX2VuYWJsZV90eXBlIHR5cGUpOwordm9pZCBoaWZfZGlzYWJsZV9idXModm9pZCAqYmRldik7Cit2b2lkIGhpZl9idXNfcHJldmVudF9saW5rZG93bihib29sIGZsYWcpOworCisjZW5kaWYgLyogX19ISUZfTUFJTl9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9oaWZfbmFwaS5jIGIvY29yZS9oaWYvc3JjL2hpZl9uYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzZmI4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9oaWZfbmFwaS5jCkBAIC0wLDAgKzEsNDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBET0M6IGhpZl9uYXBpLmMKKyAqCisgKiBISUYgTkFQSSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+IC8qIG1lbXNldCAqLworCisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgPGhpZl9uYXBpLmg+CisjaW5jbHVkZSA8aGlmX2RlYnVnLmg+CisjaW5jbHVkZSA8aGlmX2lvMzIuaD4KKyNpbmNsdWRlIDxjZV9hcGkuaD4KKworZW51bSBuYXBpX2RlY2lzaW9uX3ZlY3RvciB7CisJSElGX05BUElfTk9FVkVOVCA9IDAsCisJSElGX05BUElfSU5JVEVEICA9IDEsCisJSElGX05BUElfQ09ORl9VUCA9IDIKK307CisjZGVmaW5lIEVOQUJMRV9OQVBJX01BU0sgKEhJRl9OQVBJX0lOSVRFRCB8IEhJRl9OQVBJX0NPTkZfVVApCisKKy8qKgorICogaGlmX25hcGlfY3JlYXRlKCkgLSBjcmVhdGVzIHRoZSBOQVBJIHN0cnVjdHVyZXMgZm9yIGEgZ2l2ZW4gQ0UKKyAqIEBoaWYgICAgOiBwb2ludGVyIHRvIGhpZiBjb250ZXh0CisgKiBAcGlwZV9pZDogdGhlIENFIGlkIG9uIHdoaWNoIHRoZSBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWQKKyAqIEBwb2xsICAgOiBwb2xsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIHRoaXMgTkFQSSBpbnN0YW5jZQorICogQGJ1ZGdldCA6IGJ1ZGdldCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhlIE5BUEkgaW5zdGFuY2UKKyAqIEBzY2FsZSAgOiBzY2FsZSBmYWN0b3Igb24gdGhlIHdlaWdodCAodG8gc2NhbGVyIGJ1ZGdldCB0byAxMDAwKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgQ3JlYXRlcyBOQVBJIGluc3RhbmNlcy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqICAgIHVuY29uZGl0aW9uYWxseSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIEl0IGNyZWF0ZXMKKyAqICAgIG5hcGkgc3RydWN0dXJlcyB0aHJvdWdoIHRoZSBwcm9wZXIgSFRDL0hJRiBjYWxscy4KKyAqICAgIFRoZSBzdHJ1Y3R1cmVzIGFyZSBkaXNhYmxlZCBvbiBjcmVhdGlvbi4KKyAqICAgIE5vdGUgdGhhdCBmb3IgZWFjaCBOQVBJIGluc3RhbmNlIGEgc2VwYXJhdGUgZHVtbXkgbmV0ZGV2IGlzIHVzZWQKKyAqCisgKiBSZXR1cm46CisgKiA8IDA6IGVycm9yCisgKiA9IDA6IDxzaG91bGQgbmV2ZXIgaGFwcGVuPgorICogPiAwOiBpZCBvZiB0aGUgY3JlYXRlZCBvYmplY3QgKGZvciBtdWx0aS1OQVBJLCBudW1iZXIgb2Ygb2JqZWN0cyBjcmVhdGVkKQorICovCitpbnQgaGlmX25hcGlfY3JlYXRlKHN0cnVjdCBvbF9zb2Z0YyAgICpoaWYsCisJCSAgICB1aW50OF90ICAgICAgICAgICAgcGlwZV9pZCwKKwkJICAgIGludCAoKnBvbGwpKHN0cnVjdCBuYXBpX3N0cnVjdCAqLCBpbnQpLAorCQkgICAgaW50ICAgICAgICAgICAgICAgIGJ1ZGdldCwKKwkJICAgIGludCAgICAgICAgICAgICAgICBzY2FsZSkKK3sKKwlzdHJ1Y3QgcWNhX25hcGlfZGF0YSAqbmFwaWQ7CisJc3RydWN0IHFjYV9uYXBpX2luZm8gKm5hcGlpOworCisJTkFQSV9ERUJVRygiLS0+KHBpcGU9JWQsIGJ1ZGdldD0lZCwgc2NhbGU9JWQpXG4iLAorCQkgICBwaXBlX2lkLCBidWRnZXQsIHNjYWxlKTsKKwlOQVBJX0RFQlVHKCJoaWYtPm5hcGlfZGF0YS5zdGF0ZSA9IDB4JTA4eFxuIiwKKwkJICAgaGlmLT5uYXBpX2RhdGEuc3RhdGUpOworCU5BUElfREVCVUcoImhpZi0+bmFwaV9kYXRhLmNlX21hcCA9IDB4JTA4eFxuIiwKKwkJICAgaGlmLT5uYXBpX2RhdGEuY2VfbWFwKTsKKworCW5hcGlkID0gJihoaWYtPm5hcGlfZGF0YSk7CisJaWYgKDAgPT0gKG5hcGlkLT5zdGF0ZSAmICBISUZfTkFQSV9JTklURUQpKSB7CisJCW1lbXNldChuYXBpZCwgMCwgc2l6ZW9mKHN0cnVjdCBxY2FfbmFwaV9kYXRhKSk7CisJCW11dGV4X2luaXQoJihuYXBpZC0+bXV0ZXgpKTsKKworCQlpbml0X2R1bW15X25ldGRldigmKG5hcGlkLT5uZXRkZXYpKTsKKworCQluYXBpZC0+c3RhdGUgfD0gSElGX05BUElfSU5JVEVEOworCQlISUZfSU5GTygiJXM6IE5BUEkgc3RydWN0dXJlcyBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOworCisJCU5BUElfREVCVUcoIk5BUEkgc3RydWN0dXJlcyBpbml0aWFsaXplZFxuIik7CisJfQorCW5hcGlpID0gJihuYXBpZC0+bmFwaXNbcGlwZV9pZF0pOworCW1lbXNldChuYXBpaSwgMCwgc2l6ZW9mKHN0cnVjdCBxY2FfbmFwaV9pbmZvKSk7CisJbmFwaWktPnNjYWxlID0gc2NhbGU7CisJbmFwaWktPmlkICAgID0gTkFQSV9QSVBFMklEKHBpcGVfaWQpOworCisJTkFQSV9ERUJVRygiYWRkaW5nIG5hcGk9JXAgdG8gbmV0ZGV2PSVwIChwb2xsPSVwLCBiZGd0PSVkKVxuIiwKKwkJICAgJihuYXBpaS0+bmFwaSksICYobmFwaWQtPm5ldGRldiksIHBvbGwsIGJ1ZGdldCk7CisJbmV0aWZfbmFwaV9hZGQoJihuYXBpZC0+bmV0ZGV2KSwgJihuYXBpaS0+bmFwaSksIHBvbGwsIGJ1ZGdldCk7CisKKwlOQVBJX0RFQlVHKCJhZnRlciBuYXBpX2FkZFxuIik7CisJTkFQSV9ERUJVRygibmFwaT0weCVwLCBuZXRkZXY9MHglcFxuIiwKKwkJICAgJihuYXBpaS0+bmFwaSksICYobmFwaWQtPm5ldGRldikpOworCU5BUElfREVCVUcoIm5hcGkuZGV2X2xpc3QucHJldj0weCVwLCBuZXh0PTB4JXBcbiIsCisJCSAgIG5hcGlpLT5uYXBpLmRldl9saXN0LnByZXYsIG5hcGlpLT5uYXBpLmRldl9saXN0Lm5leHQpOworCU5BUElfREVCVUcoImRldi5uYXBpX2xpc3QucHJldj0weCVwLCBuZXh0PTB4JXBcbiIsCisJCSAgIG5hcGlkLT5uZXRkZXYubmFwaV9saXN0LnByZXYsIG5hcGlkLT5uZXRkZXYubmFwaV9saXN0Lm5leHQpOworCisJLyogSXQgaXMgT0sgdG8gY2hhbmdlIHRoZSBzdGF0ZSB2YXJpYWJsZSBiZWxvdyB3aXRob3V0IHByb3RlY3Rpb24KKwkgICBhcyB0aGVyZSBzaG91bGQgYmUgbm8tb25lIGFyb3VuZCB5ZXQgKi8KKwluYXBpZC0+Y2VfbWFwIHw9ICgweDAxIDw8IHBpcGVfaWQpOworCUhJRl9JTkZPKCIlczogTkFQSSBpZCAlZCBjcmVhdGVkIGZvciBwaXBlICVkXG4iLCBfX2Z1bmNfXywKKwkJIG5hcGlpLT5pZCwgcGlwZV9pZCk7CisKKwlOQVBJX0RFQlVHKCJOQVBJIGlkICVkIGNyZWF0ZWQgZm9yIHBpcGUgJWRcbiIsIG5hcGlpLT5pZCwgcGlwZV9pZCk7CisJTkFQSV9ERUJVRygiPC0tbmFwaV9pZD0lZF1cbiIsIG5hcGlpLT5pZCk7CisJcmV0dXJuIG5hcGlpLT5pZDsKK30KKworLyoqCisgKgorICogaGlmX25hcGlfZGVzdHJveSgpIC0gZGVzdHJveXMgdGhlIE5BUEkgc3RydWN0dXJlcyBmb3IgYSBnaXZlbiBpbnN0YW5jZQorICogQGhpZiAgIDogcG9pbnRlciB0byBoaWYgY29udGV4dAorICogQGNlX2lkIDogdGhlIENFIGlkIHdob3NlIG5hcGkgaW5zdGFuY2Ugd2lsbCBiZSBkZXN0cm95ZWQKKyAqIEBmb3JjZSA6IGlmIHNldCwgd2lsbCBkZXN0cm95IGV2ZW4gaWYgZW50cnkgaXMgYWN0aXZlIChkZS1hY3RpdmF0ZXMpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBEZXN0cm95IGEgZ2l2ZW4gTkFQSSBpbnN0YW5jZS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqICAgIHVuY29uZGl0aW9uYWxseSBkdXJpbmcgY2xlYW51cC4KKyAqICAgIFJlZnVzZXMgdG8gZGVzdHJveSBhbiBlbnRyeSBvZiBpdCBpcyBzdGlsbCBlbmFibGVkICh1bmxlc3MgZm9yY2U9MSkKKyAqICAgIE1hcmtzIHRoZSB3aG9sZSBuYXBpX2RhdGEgaW52YWxpZCBpZiBhbGwgaW5zdGFuY2VzIGFyZSBkZXN0cm95ZWQuCisgKgorICogUmV0dXJuOgorICogLUVJTlZBTDogc3BlY2lmaWMgZW50cnkgaGFzIG5vdCBiZWVuIGNyZWF0ZWQKKyAqIC1FUEVSTSA6IHNwZWNpZmljIGVudHJ5IGlzIHN0aWxsIGFjdGl2ZQorICogMCA8ICAgIDogZXJyb3IKKyAqIDAgPSAgICA6IHN1Y2Nlc3MKKyAqLworaW50IGhpZl9uYXBpX2Rlc3Ryb3koc3RydWN0IG9sX3NvZnRjICpoaWYsCisJCSAgICAgdWludDhfdCAgICAgICAgICBpZCwKKwkJICAgICBpbnQgICAgICAgICAgICAgIGZvcmNlKQoreworCXVpbnQ4X3QgY2UgPSBOQVBJX0lEMlBJUEUoaWQpOworCWludCByYyA9IDA7CisKKwlOQVBJX0RFQlVHKCItLT4oaWQ9JWQsIGZvcmNlPSVkKVxuIiwgaWQsIGZvcmNlKTsKKworCWlmICgwID09IChoaWYtPm5hcGlfZGF0YS5zdGF0ZSAmIEhJRl9OQVBJX0lOSVRFRCkpIHsKKwkJSElGX0VSUk9SKCIlczogTkFQSSBub3QgaW5pdGlhbGl6ZWQgb3IgZW50cnkgJWQgbm90IGNyZWF0ZWRcbiIsCisJCQkgIF9fZnVuY19fLCBpZCk7CisJCXJjID0gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKDAgPT0gKGhpZi0+bmFwaV9kYXRhLmNlX21hcCAmICgweDAxIDw8IGNlKSkpIHsKKwkJSElGX0VSUk9SKCIlczogTkFQSSBpbnN0YW5jZSAlZCAocGlwZSAlZCkgbm90IGNyZWF0ZWRcbiIsCisJCQkgIF9fZnVuY19fLCBpZCwgY2UpOworCQlyYyA9IC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJc3RydWN0IHFjYV9uYXBpX2RhdGEgKm5hcGlkOworCQlzdHJ1Y3QgcWNhX25hcGlfaW5mbyAqbmFwaWk7CisJCW5hcGlkID0gJihoaWYtPm5hcGlfZGF0YSk7CisJCW5hcGlpID0gJihuYXBpZC0+bmFwaXNbY2VdKTsKKworCQlpZiAoaGlmLT5uYXBpX2RhdGEuc3RhdGUgPT0gSElGX05BUElfQ09ORl9VUCkgeworCQkJaWYgKGZvcmNlKSB7CisJCQkJbmFwaV9kaXNhYmxlKCYobmFwaWktPm5hcGkpKTsKKwkJCQlISUZfSU5GTygiJXM6IE5BUEkgZW50cnkgJWQgZm9yY2UgZGlzYWJsZWRcbiIsCisJCQkJCSBfX2Z1bmNfXywgaWQpOworCQkJCU5BUElfREVCVUcoIk5BUEkgJWQgZm9yY2UgZGlzYWJsZWRcbiIsIGlkKTsKKwkJCX0gZWxzZSB7CisJCQkJSElGX0VSUk9SKCIlczogQ2Fubm90IGRlc3Ryb3kgYWN0aXZlIE5BUEkgJWRcbiIsCisJCQkJCSAgX19mdW5jX18sIGlkKTsKKwkJCQlyYyA9IC1FUEVSTTsKKwkJCX0KKwkJfQorCQlpZiAoMCA9PSByYykgeworCQkJTkFQSV9ERUJVRygiYmVmb3JlIG5hcGlfZGVsXG4iKTsKKwkJCU5BUElfREVCVUcoIm5hcGkuZGxpc3QucHJ2PTB4JXAsIG5leHQ9MHglcFxuIiwKKwkJCQkgIG5hcGlpLT5uYXBpLmRldl9saXN0LnByZXYsCisJCQkJICBuYXBpaS0+bmFwaS5kZXZfbGlzdC5uZXh0KTsKKwkJCU5BUElfREVCVUcoImRldi5uYXBpX2wucHJ2PTB4JXAsIG5leHQ9MHglcFxuIiwKKwkJCQkgICBuYXBpZC0+bmV0ZGV2Lm5hcGlfbGlzdC5wcmV2LAorCQkJCSAgIG5hcGlkLT5uZXRkZXYubmFwaV9saXN0Lm5leHQpOworCisJCQluZXRpZl9uYXBpX2RlbCgmKG5hcGlpLT5uYXBpKSk7CisKKwkJCW5hcGlkLT5jZV9tYXAgJj0gfigweDAxIDw8IGNlKTsKKwkJCW5hcGlpLT5zY2FsZSAgPSAwOworCQkJSElGX0lORk8oIiVzOiBOQVBJICVkIGRlc3Ryb3llZFxuIiwgX19mdW5jX18sIGlkKTsKKworCQkJLyogaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBpbnN0YW5jZXMgYW5kCisJCQkgICBpZiB0aGV5IGFyZSBhbGwgZGVzdHJveWVkLAorCQkJICAgc2V0IHRoZSB3aG9sZSBzdHJ1Y3R1cmUgdG8gdW5pbml0aWFsaXplZCBzdGF0ZSAqLworCQkJaWYgKG5hcGlkLT5jZV9tYXAgPT0gMCkgeworCQkJCS8qIGhpZi0+bmFwaV9kYXRhLnN0YXRlID0gMDsgKi8KKwkJCQltZW1zZXQobmFwaWQsCisJCQkJICAgICAgIDAsIHNpemVvZihzdHJ1Y3QgcWNhX25hcGlfZGF0YSkpOworCQkJCUhJRl9JTkZPKCIlczogbm8gTkFQSSBpbnN0YW5jZXMuIFphcHBlZC5cbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoKKyAqIGhpZl9uYXBpX2dldF9hbGwoKSAtIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHdob2xlIEhJRiBOQVBJIHN0cnVjdHVyZQorICogQGhpZjogcG9pbnRlciB0byBoaWYgY29udGV4dAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgd2hvbGUgc3RydWN0dXJlCisgKgorICogUmV0dXJuOgorICogIDxhZGRyPjogYWRkcmVzcyBvZiB0aGUgd2hvbGUgSElGIE5BUEkgc3RydWN0dXJlCisgKi8KK2lubGluZSBzdHJ1Y3QgcWNhX25hcGlfZGF0YSAqaGlmX25hcGlfZ2V0X2FsbChzdHJ1Y3Qgb2xfc29mdGMgICAqaGlmKQoreworCXJldHVybiAmKGhpZi0+bmFwaV9kYXRhKTsKK30KKworLyoqCisgKgorICogaGlmX25hcGlfZXZlbnQoKSAtIERlY2lzaW9uLW1ha2VyIHRvIGVuYWJsZS9kaXNhYmxlIE5BUEkuCisgKiBAaGlmIDogcG9pbnRlciB0byBoaWYgY29udGV4dAorICogQGV2bnQ6IGV2ZW50IHRoYXQgaGFzIGJlZW4gZGV0ZWN0ZWQKKyAqIEBkYXRhOiBtb3JlIGRhdGEgcmVnYXJkaW5nIHRoZSBldmVudAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBUaGlzIGZ1bmN0aW9uIGRlY2lkZXMgd2hldGhlciBvciBub3QgTkFQSSBzaG91bGQgYmUgZW5hYmxlZC4KKyAqICAgTkFQSSB3aWxsIGJlIGVuYWJsZWQsIGlmIGFsbCB0aGUgZm9sbG93aW5nIGlzIHNhdGlzZmllZC4KKyAqICAgIDEtIGhhcyBiZWVuIGVuYWJsZWQgYWRtaW5pc3RyYXRpdmVseToKKyAqICAgICAgIHRoZSAuaW5pIGZpbGUgaGFzIHRoZSBlbmFibGVkIHNldHRpbmcgYW5kIGl0IGhhcyBub3QgYmVlbiBkaXNhYmxlZAorICogICAgICAgICAgIGJ5IGFuIHZlbmRvciBjb21tYW5kIG92ZXJyaWRlIGxhdGVyCisgKgorICogUmV0dXJuOgorICogIDwgMDogc29tZSBlcnJvcgorICogID0gMDogTkFQSSBpcyBub3cgZGlzYWJsZWQKKyAqICA9IDE6IE5BUEkgaXMgbm93IGVuYWJsZWQKKyAqLworaW50IGhpZl9uYXBpX2V2ZW50KHN0cnVjdCBvbF9zb2Z0YyAqaGlmLCBlbnVtIHFjYV9uYXBpX2V2ZW50IGV2ZW50LCB2b2lkICpkYXRhKQoreworCWludCAgICAgIHJjOworCXVpbnQzMl90IHByZXZfc3RhdGU7CisJaW50ICAgICAgaTsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGk7CisKKwlOQVBJX0RFQlVHKCItLT4oZXZlbnQ9JWQsIGF1eD0lcClcbiIsIGV2ZW50LCBkYXRhKTsKKworCW11dGV4X2xvY2soJihoaWYtPm5hcGlfZGF0YS5tdXRleCkpOworCXByZXZfc3RhdGUgPSBoaWYtPm5hcGlfZGF0YS5zdGF0ZTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOQVBJX0VWVF9JTklfRklMRToKKwljYXNlIE5BUElfRVZUX0NNRF9TVEFURTogeworCQlpbnQgb24gPSAoZGF0YSAhPSAoKHZvaWQgKikwKSk7CisJCUhJRl9JTkZPKCIlczogcmVjZWl2ZWQgZXZudDogQ09ORiAlczsgdiA9ICVkIChzdGF0ZT0weCUweClcbiIsCisJCQkgX19mdW5jX18sCisJCQkgKGV2ZW50ID09IE5BUElfRVZUX0lOSV9GSUxFKT8iLmluaSBmaWxlIjoiY21kIiwKKwkJCSBvbiwgcHJldl9zdGF0ZSk7CisJCWlmIChvbikKKwkJCWlmIChwcmV2X3N0YXRlICYgSElGX05BUElfQ09ORl9VUCkgeworCQkJCUhJRl9JTkZPKCIlczogZHVwbGljYXRlIE5BUEkgY29uZiBPTiBtc2dcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQl9IGVsc2UgeworCQkJCUhJRl9JTkZPKCIlczogc2V0dGluZyBjb25maWd1cmF0aW9uIHRvIE9OXG4iLAorCQkJCQkgX19mdW5jX18pOworCQkJCWhpZi0+bmFwaV9kYXRhLnN0YXRlIHw9IEhJRl9OQVBJX0NPTkZfVVA7CisJCQl9CisJCWVsc2UgLyogb2ZmIHJlcXVlc3QgKi8KKwkJCWlmIChwcmV2X3N0YXRlICYgSElGX05BUElfQ09ORl9VUCkgeworCQkJCUhJRl9JTkZPKCIlczogc2V0dGluZyBjb25maWd1cmF0aW9uIHRvIE9GRlxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJCWhpZi0+bmFwaV9kYXRhLnN0YXRlICY9IH5ISUZfTkFQSV9DT05GX1VQOworCQkJfSBlbHNlIHsKKwkJCQlISUZfSU5GTygiJXM6IGR1cGxpY2F0ZSBOQVBJIGNvbmYgT0ZGIG1zZ1xuIiwKKwkJCQkJIF9fZnVuY19fKTsKKwkJCX0KKwkJYnJlYWs7CisJfQorCS8qIGNhc2UgTkFQSV9JTklUX0ZJTEUvQ01EX1NUQVRFICovCisJZGVmYXVsdDogeworCQlISUZfRVJST1IoIiVzOiB1bmtub3duIGV2ZW50OiAlZCAoZGF0YT0weCUwbHgpXG4iLAorCQkJICBfX2Z1bmNfXywgZXZlbnQsICh1bnNpZ25lZCBsb25nKSBkYXRhKTsKKwkJYnJlYWs7CisJfSAvKiBkZWZhdWx0ICovCisJfTsgLyogc3dpdGNoICovCisKKworCW11dGV4X3VubG9jaygmKGhpZi0+bmFwaV9kYXRhLm11dGV4KSk7CisKKwlpZiAocHJldl9zdGF0ZSAhPSBoaWYtPm5hcGlfZGF0YS5zdGF0ZSkgeworCQlpZiAoaGlmLT5uYXBpX2RhdGEuc3RhdGUgPT0gRU5BQkxFX05BUElfTUFTSykgeworCQkJcmMgPSAxOworCQkJZm9yIChpID0gMDsgaSA8IENFX0NPVU5UX01BWDsgaSsrKQorCQkJCWlmICgoaGlmLT5uYXBpX2RhdGEuY2VfbWFwICYgKDB4MDEgPDwgaSkpKSB7CisJCQkJCW5hcGkgPSAmKGhpZi0+bmFwaV9kYXRhLm5hcGlzW2ldLm5hcGkpOworCQkJCQlOQVBJX0RFQlVHKCJlbmFibGluZyBOQVBJICVkXG4iLCBpKTsKKwkJCQkJbmFwaV9lbmFibGUobmFwaSk7CisJCQkJfQorCQl9IGVsc2UgeworCQkJcmMgPSAwOworCQkJZm9yIChpID0gMDsgaSA8IENFX0NPVU5UX01BWDsgaSsrKQorCQkJCWlmIChoaWYtPm5hcGlfZGF0YS5jZV9tYXAgJiAoMHgwMSA8PCBpKSkgeworCQkJCQluYXBpID0gJihoaWYtPm5hcGlfZGF0YS5uYXBpc1tpXS5uYXBpKTsKKwkJCQkJTkFQSV9ERUJVRygiZGlzYWJsaW5nIE5BUEkgJWRcbiIsIGkpOworCQkJCQluYXBpX2Rpc2FibGUobmFwaSk7CisJCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJSElGX0lORk8oIiVzOiBubyBjaGFuZ2UgaW4gaGlmIG5hcGkgc3RhdGUgKHN0aWxsICVkKVxuIiwKKwkJCSBfX2Z1bmNfXywgcHJldl9zdGF0ZSk7CisJCXJjID0gKGhpZi0+bmFwaV9kYXRhLnN0YXRlID09IEVOQUJMRV9OQVBJX01BU0spOworCX0KKworCU5BUElfREVCVUcoIjwtLVtyYz0lZF1cbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaGlmX25hcGlfZW5hYmxlZCgpIC0gY2hlY2tzIHdoZXRoZXIgTkFQSSBpcyBlbmFibGVkIGZvciBnaXZlbiBjZSBvciBub3QKKyAqIEBoaWY6IGhpZiBjb250ZXh0CisgKiBAY2UgOiBDRSBpbnN0YW5jZSAob3IgLTEsIHRvIGNoZWNrIGlmIGFueSBDRXMgYXJlIGVuYWJsZWQpCisgKgorICogUmV0dXJuOiBib29sCisgKi8KK2lubGluZSBpbnQgaGlmX25hcGlfZW5hYmxlZChzdHJ1Y3Qgb2xfc29mdGMgKmhpZiwgaW50IGNlKQoreworCWludCByYzsKKwlpZiAoLTEgPT0gY2UpCisJCXJjID0gKChoaWYtPm5hcGlfZGF0YS5zdGF0ZSA9PSBFTkFCTEVfTkFQSV9NQVNLKSk7CisJZWxzZQorCQlyYyA9ICgoaGlmLT5uYXBpX2RhdGEuc3RhdGUgPT0gRU5BQkxFX05BUElfTUFTSykgJiYKKwkJICAgICAgKGhpZi0+bmFwaV9kYXRhLmNlX21hcCAmICgweDAxIDw8IGNlKSkpOworCXJldHVybiByYzsKK307CisKKy8qKgorICogaGlmX25hcGlfZW5hYmxlX2lycSgpIC0gZW5hYmxlcyBidXMgaW50ZXJydXB0cyBhZnRlciBuYXBpX2NvbXBsZXRlCisgKgorICogQGhpZjogaGlmIGNvbnRleHQKKyAqIEBpZCA6IGlkIG9mIE5BUEkgaW5zdGFuY2UgY2FsbGluZyB0aGlzICh1c2VkIHRvIGRldGVybWluZSB0aGUgQ0UpCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK2lubGluZSB2b2lkIGhpZl9uYXBpX2VuYWJsZV9pcnEoc3RydWN0IG9sX3NvZnRjICpoaWYsIGludCBpZCkKK3sKKwljZV9pcnFfZW5hYmxlKGhpZiwgTkFQSV9JRDJQSVBFKGlkKSk7CisJcmV0dXJuOworfQorCisKKy8qKgorICogaGlmX25hcGlfc2NoZWR1bGUoKSAtIHNjaGVkdWxlcyBuYXBpLCB1cGRhdGVzIHN0YXRzCisgKiBAc2NuOiAgaGlmIGNvbnRleHQKKyAqIEBjZV9pZDogaW5kZXggb2YgbmFwaSBpbnN0YW5jZQorICoKKyAqIFJldHVybjogdm9pZAorICovCitpbnQgaGlmX25hcGlfc2NoZWR1bGUoc3RydWN0IG9sX3NvZnRjICpzY24sIGludCBjZV9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJc2NuLT5uYXBpX2RhdGEubmFwaXNbY2VfaWRdLnN0YXRzW2NwdV0ubmFwaV9zY2hlZHVsZXMrKzsKKwlOQVBJX0RFQlVHKCJzY2hlZHVsaW5nIG5hcGkgJWQgKGNlOiVkKVxuIiwKKwkJICAgc2NuLT5uYXBpX2RhdGEubmFwaXNbY2VfaWRdLmlkLCBjZV9pZCk7CisJbmFwaV9zY2hlZHVsZSgmKHNjbi0+bmFwaV9kYXRhLm5hcGlzW2NlX2lkXS5uYXBpKSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBoaWZfbmFwaV9wb2xsKCkgLSBOQVBJIHBvbGwgcm91dGluZQorICogQG5hcGkgIDogcG9pbnRlciB0byBOQVBJIHN0cnVjdCBhcyBrZXJuZWwgaG9sZHMgaXQKKyAqIEBidWRnZXQ6CisgKgorICogVGhpcyBpcyB0aGUgYm9keSBvZiB0aGUgcG9sbCBmdW5jdGlvbi4KKyAqIFRoZSBwb2xsIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBrZXJuZWwuIFNvLCB0aGVyZSBpcyBhIHdyYXBwZXIKKyAqIGZ1bmN0aW9uIGluIEhERCwgd2hpY2ggaW4gdHVybiBjYWxscyB0aGlzIGZ1bmN0aW9uLgorICogVHdvIG1haW4gcmVhc29ucyB3aHkgdGhlIHdob2xlIHRoaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBIREQ6CisgKiBhKSByZWZlcmVuY2VzIHRvIHRoaW5ncyBsaWtlIGNlX3NlcnZpY2UgdGhhdCBIREQgaXMgbm90IGF3YXJlIG9mCisgKiBiKSBwcm94aW1pdHkgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIGNlX3Rhc2tsZXQsIHdoaWNoIHRoZSBib2R5CisgKiAgICBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB2ZXJ5IGNsb3NlIHRvLgorICoKKyAqIE5PVEUgVE8gVEhFIE1BSU5UQUlORVI6CisgKiAgQ29uc2lkZXIgdGhpcyBmdW5jdGlvbiBhbmQgY2VfdGFza2xldCB2ZXJ5IHRpZ2h0bHkgY291cGxlZCBwYWlycy4KKyAqICBBbnkgY2hhbmdlcyB0byBjZV90YXNrbGV0IG9yIHRoaXMgZnVuY3Rpb24gbWF5IGxpa2VseSBuZWVkIHRvIGJlCisgKiAgcmVmbGVjdGVkIGluIHRoZSBjb3VudGVycGFydC4KKyAqCisgKiBSZXR1cm5zOgorICogIGludDogdGhlIGFtb3VudCBvZiB3b3JrIGRvbmUgaW4gdGhpcyBwb2xsICggPD0gYnVkZ2V0KQorICovCitpbnQgaGlmX25hcGlfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCit7CisJaW50IHJjLCBub3JtYWxpemVkLCBidWNrZXQ7CisJaW50ICAgIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3Qgb2xfc29mdGMgICAgICAqaGlmOworCXN0cnVjdCBxY2FfbmFwaV9pbmZvICpuYXBpX2luZm87CisKKwlOQVBJX0RFQlVHKCIlcyAtLT4oLi4sIGJ1ZGdldD0lZClcbiIsIGJ1ZGdldCk7CisKKwluYXBpX2luZm8gPSAoc3RydWN0IHFjYV9uYXBpX2luZm8gKikKKwkJY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBxY2FfbmFwaV9pbmZvLCBuYXBpKTsKKwluYXBpX2luZm8tPnN0YXRzW2NwdV0ubmFwaV9wb2xscysrOworCisJaGlmID0gKHN0cnVjdCBvbF9zb2Z0YyAqKWNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRik7CisJQ0RGX0FTU0VSVChoaWYgIT0gTlVMTCk7CisJcmMgPSBjZV9wZXJfZW5naW5lX3NlcnZpY2UoaGlmLCBOQVBJX0lEMlBJUEUobmFwaV9pbmZvLT5pZCkpOworCUhJRl9JTkZPX0hJKCIlczogY2VfcGVyX2VuZ2luZV9zZXJ2aWNlIHJlcG9ydHMgJWQgbXNncyBwcm9jZXNzZWQiLAorCQlfX2Z1bmNfXywgcmMpOworCW5hcGlfaW5mby0+c3RhdHNbY3B1XS5uYXBpX3dvcmtkb25lICs9IHJjOworCW5vcm1hbGl6ZWQgPSAocmMgLyBuYXBpX2luZm8tPnNjYWxlKTsKKwkvKiBkbyBub3QgcmV0dXJuIDAsIGlmIHRoZXJlIHdhcyBzb21lIHdvcmsgZG9uZSwKKwkgICBldmVuIGlmIGl0IGlzIGJlbG93IHRoZSBzY2FsZSAgICovCisJaWYgKHJjKQorCQlub3JtYWxpemVkKys7CisJYnVja2V0ICAgPSAobm9ybWFsaXplZCAvIFFDQV9OQVBJX0RFRl9TQ0FMRSk7CisJbmFwaV9pbmZvLT5zdGF0c1tjcHVdLm5hcGlfYnVkZ2V0X3VzZXNbYnVja2V0XSsrOworCisJLyogaWYgY2VfcGVyIGVuZ2luZSByZXBvcnRzIDAsIHRoZW4gd2Ugc2hvdWxkIG1ha2Ugc3VyZQorCSAgIHBvbGwgaXMgdGVybWluYXRlZCAqLworCWlmICgwID09IHJjKQorCQlOQVBJX0RFQlVHKCIlczolZDogbm90aGluZyBwcm9jZXNzZWQgYnkgQ0UuIENvbXBsZXRpbmcgTkFQSVxuIiwKKwkJCSAgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlpZiAocmMgPD0gSElGX05BUElfTUFYX1JFQ0VJVkVTKSB7CisJCW5hcGlfaW5mby0+c3RhdHNbY3B1XS5uYXBpX2NvbXBsZXRlcysrOworCQkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQloaWZfbmFwaV9lbmFibGVfaXJxKGhpZiwgbmFwaV9pbmZvLT5pZCk7CisKKwkJLyogc3VwcG9ydCBzdXNwZW5kL3Jlc3VtZSAqLworCQljZGZfYXRvbWljX2RlYygmKGhpZi0+YWN0aXZlX3Rhc2tsZXRfY250KSk7CisKKwkJTkFQSV9ERUJVRygiJXM6JWQ6IG5hcGlfY29tcGxldGUgKyBlbmFibGluZyB0aGUgaW50ZXJydXB0c1xuIiwKKwkJCSAgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJfQorCisJTkFQSV9ERUJVRygiJXMgPC0tW25vcm1hbGl6ZWQ9JWRdXG4iLCBfZnVuY19fLCBub3JtYWxpemVkKTsKKwlyZXR1cm4gbm9ybWFsaXplZDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9pY25zc19zdHViL2ljbnNzX3N0dWIuYyBiL2NvcmUvaGlmL3NyYy9pY25zc19zdHViL2ljbnNzX3N0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZiNDU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oaWYvc3JjL2ljbnNzX3N0dWIvaWNuc3Nfc3R1Yi5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmZGVmIEhJRl9QQ0kKKworI2luY2x1ZGUgImljbnNzX3N0dWIuaCIKKyNpbmNsdWRlICJoaWZfaW8zMi5oIgorI2luY2x1ZGUgPGhpZi5oPgorI2luY2x1ZGUgInJlZ3RhYmxlLmgiCisjaW5jbHVkZSAiaGlmX2RlYnVnLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgImNkZl9zdGF0dXMuaCIKKyNpbmNsdWRlICJxd2xhbl92ZXJzaW9uLmgiCisjaW5jbHVkZSA8bmV0L2Nuc3MuaD4KKworc3RhdGljIGludCBpY25zc19nZXRfaXJxX251bShpbnQgY2VfaWQpOworCisvKioKKyAqIHN0cnVjdCBpY25zc19zdHViX2VudHJ5CisgKgorICogQGlycV9oYW5kbGVyOiBpcnFfaGFuZGxlcgorICogQGRhdGE6IGRhdGEKKyAqIEBuYW1lOiBuYW1lCisgKiBAY2VfaWQ6IGNlX2lkCisgKi8KK3N0cnVjdCBpY25zc19zdHViX2VudHJ5IHsKKwlpcnFyZXR1cm5fdCAoKmlycV9oYW5kbGVyKShpbnQsIHZvaWQgKik7CisJdm9pZCAqZGF0YTsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBjZV9pZDsKK307CisKKy8qKgorICogc3RydWN0IGljbnNzX3N0dWJfY29udGV4dAorICoKKyAqIEBzdHViOiBpY25zc19zdHViX2VudHJ5CisgKiBAcmVnZ2VkX2lycTogcmVnZ2VkX2lycQorICovCitzdHJ1Y3QgaWNuc3Nfc3R1Yl9jb250ZXh0IHsKKwlzdHJ1Y3QgaWNuc3Nfc3R1Yl9lbnRyeSBzdHViW0lDTlNTX01BWF9JUlFfUkVHSVNUUkFUSU9OU107CisJdWludDMyX3QgcmVnZ2VkX2lycTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWNuc3Nfc3R1Yl9jb250ZXh0IGNuc3Nfc3R1YjsKKworI2lmbmRlZiBRQ0FfV0lGSV8zXzBfQURSQVNURUEKKy8qKgorICogaWNuc3Nfd2xhbl9lbmFibGUoKSAtIGljbnNzX3dsYW5fZW5hYmxlCisgKiBAY29uZmlnOiBjZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgKiBAbW9kZTogZHJpdmVyX21vZGUKKyAqIEBob3N0X3ZlcnNpb246IHZlcnNpb24gc3RyaW5nIHRvIHNlbmQgdG8gdGhlIGZ3CisgKgorICogUmV0dXJuOiBpbnQKKyAqLworaW50IGljbnNzX3dsYW5fZW5hYmxlKHN0cnVjdCBpY25zc193bGFuX2VuYWJsZV9jZmcgKmNvbmZpZywKKwllbnVtIGljbnNzX2RyaXZlcl9tb2RlIG1vZGUsIGNvbnN0IGNoYXIgKmhvc3RfdmVyc2lvbikKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpY25zc193bGFuX2Rpc2FibGUoKSAtIGljbnNzX3dsYW5fZGlzYWJsZQorICogQG1vZGU6IGRyaXZlcl9tb2RlCisgKgorICogUmV0dXJuOiBpbnQKKyAqLworaW50IGljbnNzX3dsYW5fZGlzYWJsZShlbnVtIGljbnNzX2RyaXZlcl9tb2RlIG1vZGUpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKy8qKgorICogaWNuc3Nfd2xhbl9lbmFibGUoKTogY2FsbCB0aGUgcGxhdGZvcm0gZHJpdmVyIHRvIGVuYWJsZSB3bGFuCisgKiBAY29uZmlnOiBjZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgKiBAbW9kZTogZHJpdmVyX21vZGUKKyAqIEBob3N0X3ZlcnNpb246IHZlcnNpb24gc3RyaW5nIHRvIHNlbmQgdG8gdGhlIGZ3CisgKgorICogVGhpcyBmdW5jdGlvbiBwYXNzZXMgdGhlIGNvbl9tb2RlIGFuZCBDRSBjb25maWd1cmF0aW9uIHRvCisgKiBwbGF0Zm9ybSBkcml2ZXIgdG8gZW5hYmxlIHdsYW4uCisgKiBjbnNzX3dsYW5fZW5hYmxlIGhhcyBiZWVuIGhhY2tlZCB0byBkbyBhIHFtaSBoYW5kc2hha2Ugd2l0aCBmdy4KKyAqIHRoaXMgaXMgbm90IG5lZWRlZCBmb3Igcm9tZS4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgbnVtYmVyIG90aGVyd2lzZS4KKyAqLworaW50IGljbnNzX3dsYW5fZW5hYmxlKHN0cnVjdCBpY25zc193bGFuX2VuYWJsZV9jZmcgKmNvbmZpZywKKwllbnVtIGljbnNzX2RyaXZlcl9tb2RlIG1vZGUsIGNvbnN0IGNoYXIgKmhvc3RfdmVyc2lvbikKK3sKKwlzdHJ1Y3QgY25zc193bGFuX2VuYWJsZV9jZmcgY2ZnOworCWVudW0gY25zc19kcml2ZXJfbW9kZSBjbnNzX21vZGU7CisKKwljZmcubnVtX2NlX3RndF9jZmcgPSBjb25maWctPm51bV9jZV90Z3RfY2ZnOworCWNmZy5jZV90Z3RfY2ZnID0gKHN0cnVjdCBjbnNzX2NlX3RndF9waXBlX2NmZyAqKQorCQljb25maWctPmNlX3RndF9jZmc7CisJY2ZnLm51bV9jZV9zdmNfcGlwZV9jZmcgPSBjb25maWctPm51bV9jZV9zdmNfcGlwZV9jZmc7CisJY2ZnLmNlX3N2Y19jZmcgPSAoc3RydWN0IGNuc3NfY2Vfc3ZjX3BpcGVfY2ZnICopCisJCWNvbmZpZy0+Y2Vfc3ZjX2NmZzsKKworCWNmZy5udW1fc2hhZG93X3JlZ19jZmcgPSBjb25maWctPm51bV9zaGFkb3dfcmVnX2NmZzsKKwljZmcuc2hhZG93X3JlZ19jZmcgPSAoc3RydWN0IGNuc3Nfc2hhZG93X3JlZ19jZmcgKikKKwkJY29uZmlnLT5zaGFkb3dfcmVnX2NmZzsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgSUNOU1NfRlRNOgorCQljbnNzX21vZGUgPSBDTlNTX0ZUTTsKKwkJYnJlYWs7CisJY2FzZSBJQ05TU19FUFBJTkc6CisJCWNuc3NfbW9kZSA9IENOU1NfRVBQSU5HOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljbnNzX21vZGUgPSBDTlNTX01JU1NJT047CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY25zc193bGFuX2VuYWJsZSgmY2ZnLCBjbnNzX21vZGUsIGhvc3RfdmVyc2lvbik7Cit9CisKKy8qKgorICogaWNuc3Nfd2xhbl9kaXNhYmxlKCk6IGNhbGwgdGhlIHBsYXRmb3JtIGRyaXZlciB0byBkaXNhYmxlIHdsYW4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBhc3NlcyB0aGUgY29uX21vZGUgdG8gcGxhdGZvcm0gZHJpdmVyIHRvIGRpc2FibGUgd2xhbi4KKyAqIGNuc3Nfd2xhbl9kaXNhYmxlIGhhcyBiZWVuIGhhY2tlZCB0byBkbyBhIHFtaSBoYW5kc2hha2Ugd2l0aCBmdy4KKyAqIHRoaXMgaXMgbm90IG5lZWRlZCBmb3Igcm9tZS4KKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworaW50IGljbnNzX3dsYW5fZGlzYWJsZShlbnVtIGljbnNzX2RyaXZlcl9tb2RlIGNvbl9tb2RlKQoreworCWVudW0gY25zc19kcml2ZXJfbW9kZSBtb2RlOworCisJc3dpdGNoIChjb25fbW9kZSkgeworCWNhc2UgSUNOU1NfRlRNOgorCQltb2RlID0gQ05TU19GVE07CisJCWJyZWFrOworCWNhc2UgSUNOU1NfRVBQSU5HOgorCQltb2RlID0gQ05TU19FUFBJTkc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1vZGUgPSBDTlNTX01JU1NJT047CisJCWJyZWFrOworCX0KKworCWNuc3Nfd2xhbl9kaXNhYmxlKG1vZGUpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qKgorICogaWNuc3NfY2VfcmVxdWVzdF9pcnEoKSAtIHJlZ2lzdGVyIGFuIGlycSBoYW5kbGVyCisgKiBAY2VfaWQ6IGNlX2lkCisgKiBAaGFuZGxlcjogaGFuZGxlcgorICogQGZsYWdzOiBmbGFncyB0byBwYXNzIHRvIHRoZSBrZXJuZWwgYXBpCisgKiBAbmFtZTogbmFtZQorICogQGNvbnRleHQ6IGNvbnRleHQgdG8gcGFzcyB0byB0aGUgaXJxIGhhbmRsZXIKKyAqCisgKiBSZXR1cm46IGludGVnZXIgc3RhdHVzCisgKi8KK2ludCBpY25zc19jZV9yZXF1ZXN0X2lycShpbnQgY2VfaWQsCisJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiksCisJdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqbmFtZSwKKwl2b2lkICpjb250ZXh0KQoreworCWlmIChjZV9pZCA+PSBJQ05TU19NQVhfSVJRX1JFR0lTVFJBVElPTlMpIHsKKwkJSElGX0VSUk9SKCIlczogaW52YWxpZCBjZV9pZCA9ICVkIiwgX19mdW5jX18sIGNlX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY25zc19zdHViLnN0dWJbY2VfaWRdLmlycV9oYW5kbGVyID0gaGFuZGxlcjsKKwljbnNzX3N0dWIuc3R1YltjZV9pZF0uY2VfaWQgPSBjZV9pZDsKKwljbnNzX3N0dWIuc3R1YltjZV9pZF0uZGF0YSA9IGNvbnRleHQ7CisJY25zc19zdHViLnN0dWJbY2VfaWRdLm5hbWUgPSBuYW1lOworCWNuc3Nfc3R1Yi5yZWdnZWRfaXJxIHw9ICgxIDw8IGNlX2lkKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpY25zc19jZV9mcmVlX2lycSgpIC0gaWNuc3NfdW5yZWdpc3Rlcl9pcnEKKyAqIEBjZV9pZDogdGhlIGNlX2lkIHRoYXQgdGhlIGlycSBiZWxvbmdzIHRvCisgKiBAY29udGV4dDogY29udGV4dCB3aXRoIHdpdGNoIHRoZSBpcnEgd2FzIHJlcXVlc3RlZC4KKyAqIFJldHVybjogaW50ZWdlciBzdGF0dXMKKyAqLworaW50IGljbnNzX2NlX2ZyZWVfaXJxKGludCBjZV9pZCwgdm9pZCAqY29udGV4dCkKK3sKKwlpZiAoY2VfaWQgPj0gSUNOU1NfTUFYX0lSUV9SRUdJU1RSQVRJT05TKSB7CisJCUhJRl9FUlJPUigiJXM6IGludmFsaWQgY2VfaWQgPSAlZCIsIF9fZnVuY19fLCBjZV9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjbnNzX3N0dWIuc3R1YltjZV9pZF0uZGF0YSAhPSBjb250ZXh0KSB7CisJCUhJRl9FUlJPUigiJXM6IGNvbnRleHQgbWF0Y2ggZmFpbHVyZSBmb3IgY2VfaWQgJWQiLAorCQlfX2Z1bmNfXywgY2VfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY25zc19zdHViLnJlZ2dlZF9pcnEgJiAoMSA8PCBjZV9pZCkpIHsKKwkJY25zc19zdHViLnN0dWJbY2VfaWRdLmlycV9oYW5kbGVyID0gTlVMTDsKKwkJY25zc19zdHViLnN0dWJbY2VfaWRdLmNlX2lkID0gMDsKKwkJY25zc19zdHViLnN0dWJbY2VfaWRdLmRhdGEgPSAwOworCQljbnNzX3N0dWIuc3R1YltjZV9pZF0ubmFtZSA9IE5VTEw7CisJCWNuc3Nfc3R1Yi5yZWdnZWRfaXJxICY9IH4oMSA8PCBjZV9pZCk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGljbnNzX2Rpc3BhdGNoX29uZV9jZV9pcnEoKSAtIGljbnNzX2Rpc3BhdGNoX29uZV9jZV9pcnEKKyAqIEBjZV9pZDogY2VfaWQKKyAqCisgKiBSZXR1cm46IGlycXJldHVybl90CisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpY25zc19kaXNwYXRjaF9vbmVfY2VfaXJxKGludCBjZV9pZCkKK3sKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKworCWlmIChjbnNzX3N0dWIuc3R1YltjZV9pZF0uaXJxX2hhbmRsZXIpCisJCXJldCA9IGNuc3Nfc3R1Yi5zdHViW2NlX2lkXS5pcnFfaGFuZGxlcigKKwkJCWljbnNzX2dldF9pcnFfbnVtKGNlX2lkKSwKKwkJCSh2b2lkICopY25zc19zdHViLnN0dWJbY2VfaWRdLmRhdGEpOworCWVsc2UKKwkJSElGX0VSUk9SKAorCQkJIiVzZDogZXJyb3IgLSBjZV9pZCA9ICVkLCBubyBJUlEgaGFuZGxlciIsCisJCQlfX2Z1bmNfXywgY2VfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpY25zc19kaXNwYXRjaF9jZV9pcnEoKSAtIGljbnNzX2Rpc3BhdGNoX2NlX2lycQorICogQHNjbjogc2NuCisgKgorICogUmV0dXJuOiBOL0EKKyAqLwordm9pZCBpY25zc19kaXNwYXRjaF9jZV9pcnEoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDMyX3QgaW50cl9zdW1tYXJ5OworCWludCBpZDsKKwlpcnFyZXR1cm5fdCByZXQ7CisKKwlpZiAoc2NuLT5oaWZfaW5pdF9kb25lICE9IHRydWUpCisJCXJldHVybjsKKworCUFfVEFSR0VUX0FDQ0VTU19CRUdJTihzY24pOworCWludHJfc3VtbWFyeSA9IENFX0lOVEVSUlVQVF9TVU1NQVJZKHNjbik7CisKKwlpZiAoaW50cl9zdW1tYXJ5ID09IDApIHsKKwkJaWYgKChzY24tPnRhcmdldF9zdGF0dXMgIT0gT0xfVFJHRVRfU1RBVFVTX1JFU0VUKSAmJgorCQkJKCFjZGZfYXRvbWljX3JlYWQoJnNjbi0+bGlua19zdXNwZW5kZWQpKSkgeworCisJCQloaWZfd3JpdGUzMl9tYihzY24tPm1lbSArCisJCQkJKFNPQ19DT1JFX0JBU0VfQUREUkVTUyB8CisJCQkJUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTKSwKKwkJCQlIT1NUX0dST1VQMF9NQVNLKTsKKworCQkJaGlmX3JlYWQzMl9tYihzY24tPm1lbSArCisJCQkJCShTT0NfQ09SRV9CQVNFX0FERFJFU1MgfAorCQkJCQlQQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MpKTsKKwkJfQorCQlBX1RBUkdFVF9BQ0NFU1NfRU5EKHNjbik7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlBX1RBUkdFVF9BQ0NFU1NfRU5EKHNjbik7CisJfQorCisJc2NuLT5jZV9pcnFfc3VtbWFyeSA9IGludHJfc3VtbWFyeTsKKwlmb3IgKGlkID0gMDsgaW50cl9zdW1tYXJ5ICYmIChpZCA8IHNjbi0+Y2VfY291bnQpOyBpZCsrKSB7CisJCWlmIChpbnRyX3N1bW1hcnkgJiAoMSA8PCBpZCkpIHsKKwkJCWludHJfc3VtbWFyeSAmPSB+KDEgPDwgaWQpOworCQkJcmV0ID0gaWNuc3NfZGlzcGF0Y2hfb25lX2NlX2lycShpZCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogaWNuc3NfZ2V0X3NvY19pbmZvKCkgLSBnZXQgc29jIGluZm8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHF1ZXJ5IHRoZSBzb2MgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGxhdGZvcm0KKyAqIGRyaXZlcgorICoKKyAqIEBpbmZvOiBzdHJ1Y3QgaWNuc3Nfc29jX2luZm8KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MKKyAqLworaW50IGljbnNzX2dldF9zb2NfaW5mbyhzdHJ1Y3QgaWNuc3Nfc29jX2luZm8gKmluZm8pCit7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCisJaWYgKCFzY24pIHsKKwkJSElGX0VSUk9SKCIlczogU0NOID0gTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWluZm8tPnZfYWRkciA9IHNjbi0+bWVtOworCWluZm8tPnBfYWRkciA9IHNjbi0+bWVtX3BhOworCWluZm8tPnZlcnNpb24gPSAwOworCXJldHVybiAwOworfQorCisKKy8qIGljbnNzX2dldF9pcnFfbnVtKCkgLSBnZW5lcmF0ZSBhIG51bWJlciB0byByZXByZXNlbnQgYW4gaXJxIG51bWJlcgorKi8KK3N0YXRpYyBpbnQgaWNuc3NfZ2V0X2lycV9udW0oaW50IGNlX2lkKQoreworCWlmIChjZV9pZCA8PSBJQ05TU19NQVhfSVJRX1JFR0lTVFJBVElPTlMgJiYgY2VfaWQgPj0gMCkKKwkJcmV0dXJuIGNlX2lkICsgMTAwOworCisJcHJfZXJyKCJpY25zczogTm8gaXJxIHJlZ2lzdGVyZWQgZm9yIENFIGlkICVkXG4iLCBjZV9pZCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBpY25zc19nZXRfY2VfaWQoaW50IGlycSkKK3sKKwlpbnQgY2VfaWQgPSBpcnEgLSAxMDA7CisJaWYgKGNlX2lkIDw9IElDTlNTX01BWF9JUlFfUkVHSVNUUkFUSU9OUyAmJiBjZV9pZCA+PSAwKQorCQlyZXR1cm4gY2VfaWQ7CisKKwlwcl9lcnIoImljbnNzOiBObyBtYXRjaGluZyBDRSBpZCBmb3IgaXJxICVkXG4iLCBpcnEpOworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmIC8qIEhJRl9QQ0kgKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9pY25zc19zdHViL2ljbnNzX3N0dWIuaCBiL2NvcmUvaGlmL3NyYy9pY25zc19zdHViL2ljbnNzX3N0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2UyMjlhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oaWYvc3JjL2ljbnNzX3N0dWIvaWNuc3Nfc3R1Yi5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmZGVmIEhJRl9QQ0kKKyNpZm5kZWYgX0lDTlNTX1dMQU5fSF8KKyNkZWZpbmUgX0lDTlNTX1dMQU5fSF8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorCisjZGVmaW5lIElDTlNTX01BWF9JUlFfUkVHSVNUUkFUSU9OUyAxMgorCisvKioKKyAqIHN0cnVjdCBjZV90Z3RfcGlwZV9jZmcKKyAqCisgKiBAcGlwZW51bTogcGlwZV9udW0KKyAqIEBwaXBlZGlyOiBwaXBlX2RpcgorICogQG5lbnRyaWVzOiBuZW50cmllcworICogQG5ieXRlc19tYXg6IG5ieXRlc19tYXgKKyAqIEBmbGFnczogZmxhZ3MKKyAqIEByZXNlcnZlZDogcmVzZXJ2ZWQKKyAqLworc3RydWN0IGNlX3RndF9waXBlX2NmZyB7CisJdWludDMyX3QgcGlwZV9udW07CisJdWludDMyX3QgcGlwZV9kaXI7CisJdWludDMyX3QgbmVudHJpZXM7CisJdWludDMyX3QgbmJ5dGVzX21heDsKKwl1aW50MzJfdCBmbGFnczsKKwl1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qKgorICogc3RydWN0IGNlX3N2Y19waXBlX2NmZworICoKKyAqIEBzZXJ2aWNlX2lkOiBzZXJ2aWNlX2lkCisgKiBAcGlwZWRpcjogcGlwZWRpcgorICogQHBpcGVudW06IHBpcGVudW0KKyAqLworc3RydWN0IGNlX3N2Y19waXBlX2NmZyB7CisJdWludDMyX3Qgc2VydmljZV9pZDsKKwl1aW50MzJfdCBwaXBlZGlyOworCXVpbnQzMl90IHBpcGVudW07Cit9OworCisvKioKKyAqIHN0cnVjdCBpY25zc19zaGFkb3dfcmVnX2NmZworICoKKyAqIEBjZV9pZDogQ29weSBlbmdpbmUgaWQKKyAqIEByZWdfb2Zmc2V0OiBSZWdpc3RlciBvZmZzZXQKKyAqLworc3RydWN0IGljbnNzX3NoYWRvd19yZWdfY2ZnIHsKKwl1MTYgY2VfaWQ7CisJdTE2IHJlZ19vZmZzZXQ7Cit9OworLyoqCisgKiBzdHJ1Y3QgaWNuc3Nfd2xhbl9lbmFibGVfY2ZnCisgKgorICogQG51bV9jZV90Z3RfY2ZnOiBudW1fY2VfdGd0X2NmZworICogQGNlX3RndF9jZmc6IGNlX3RndF9jZmcKKyAqIEBudW1fY2Vfc3ZjX3BpcGVfY2ZnOiBudW1fY2Vfc3ZjX3BpcGVfY2ZnCisgKiBAY2Vfc3ZjX2NmZzogY2Vfc3ZjX2NmZworICovCitzdHJ1Y3QgaWNuc3Nfd2xhbl9lbmFibGVfY2ZnIHsKKwl1aW50MzJfdCBudW1fY2VfdGd0X2NmZzsKKwlzdHJ1Y3QgY2VfdGd0X3BpcGVfY2ZnICpjZV90Z3RfY2ZnOworCXVpbnQzMl90IG51bV9jZV9zdmNfcGlwZV9jZmc7CisJc3RydWN0IGNlX3N2Y19waXBlX2NmZyAqY2Vfc3ZjX2NmZzsKKwl1MzIgbnVtX3NoYWRvd19yZWdfY2ZnOworCXN0cnVjdCBpY25zc19zaGFkb3dfcmVnX2NmZyAqc2hhZG93X3JlZ19jZmc7Cit9OworCisvKioKKyAqIGVudW0gZHJpdmVyX21vZGUKKyAqCisgKiBAZHJpdmVyX21vZGU6IGRyaXZlcl9tb2RlCisgKi8KK2VudW0gaWNuc3NfZHJpdmVyX21vZGUgeworCUlDTlNTX01JU1NJT04sCisJSUNOU1NfRlRNLAorCUlDTlNTX0VQUElORywKK307CisKKy8qKgorICogc3RydWN0IGljbnNzX3NvY19pbmZvCisgKgorICogQHZfYWRkcjogdmlydHVhbCBhZGRyZXNzCisgKiBAcF9hZGRyOiBwaHlzaWNhbCBhZGRyZXNzCisgKiBAdmVyOiB2ZXJzaW9uCisgKi8KK3N0cnVjdCBpY25zc19zb2NfaW5mbyB7CisJdm9pZCBfX2lvbWVtICp2X2FkZHI7CisJcGh5c19hZGRyX3QgcF9hZGRyOworCXVpbnQzMl90IHZlcnNpb247Cit9OworCitpbnQgaWNuc3Nfd2xhbl9lbmFibGUoc3RydWN0IGljbnNzX3dsYW5fZW5hYmxlX2NmZyAqY29uZmlnLAorCWVudW0gaWNuc3NfZHJpdmVyX21vZGUgbW9kZSwgY29uc3QgY2hhciAqaG9zdF92ZXJzaW9uKTsKK2ludCBpY25zc193bGFuX2Rpc2FibGUoZW51bSBpY25zc19kcml2ZXJfbW9kZSBtb2RlKTsKK2ludCBpY25zc19jZV9yZXF1ZXN0X2lycShpbnQgY2VfaWQsCisJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQgY2VfaWQsIHZvaWQgKmFyZyksCisJdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqY29udGV4dCk7CitpbnQgaWNuc3NfY2VfZnJlZV9pcnEoaW50IGlycSwgdm9pZCAqY29udGV4dCk7Cit2b2lkIGljbnNzX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGNlX2lkKTsKK3ZvaWQgaWNuc3NfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGNlX2lkKTsKK2ludCBpY25zc19nZXRfc29jX2luZm8oc3RydWN0IGljbnNzX3NvY19pbmZvICppbmZvKTsKK2ludCBpY25zc19nZXRfY2VfaWQoaW50IGlycSk7CisjZW5kaWYgLyogX0lDTlNTX1dMQU5fSF8gKi8KKyNlbmRpZiAvKiBISUZfUENJICovCisKZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9tcF9kZXYuYyBiL2NvcmUvaGlmL3NyYy9tcF9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzZlNjBhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oaWYvc3JjL21wX2Rldi5jCkBAIC0wLDAgKzEsMzEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAiaGlmX2lvMzIuaCIKKyNpbmNsdWRlICJoaWZfZGVidWcuaCIKKworLypjaGFuaW5mbyovCisjZGVmaW5lICBDSEFOSU5GT01FTV9TMl9SRUFEX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lICBDSEFOSU5GT19DVFJMX0NBUFRVUkVfQ0hBTl9JTkZPX01BU0sgICAweDAwMDAwMDAxCisjZGVmaW5lICBDSEFOSU5GT19DVFJMX0NIQU5JTkZPTUVNX0JXX01BU0sgICAgICAweDAwMDAwMDMwCisjZGVmaW5lICBNVUxUSUNIQUlOX0VOQUJMRV9SWF9DSEFJTl9NQVNLX01BU0sgICAweDAwMDAwMDA3CisKKy8qYWdjKi8KKyNkZWZpbmUgR0FJTlNfTUlOX09GRlNFVFNfQ0ZfQUdDX0hJU1RfRU5BQkxFX01BU0sgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgR0FJTlNfTUlOX09GRlNFVFNfQ0ZfQUdDX0hJU1RfR0NfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgR0FJTlNfTUlOX09GRlNFVFNfQ0ZfQUdDX0hJU1RfVk9USU5HX01BU0sgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgR0FJTlNfTUlOX09GRlNFVFNfQ0ZfQUdDX0hJU1RfUEhZX0VSUl9NQVNLICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgIEFHQ19ISVNUT1JZX0RVTVBfTUFTSyAoXAorCUdBSU5TX01JTl9PRkZTRVRTX0NGX0FHQ19ISVNUX0VOQUJMRV9NQVNLfCBcCisJR0FJTlNfTUlOX09GRlNFVFNfQ0ZfQUdDX0hJU1RfR0NfTUFTS3wgXAorCUdBSU5TX01JTl9PRkZTRVRTX0NGX0FHQ19ISVNUX1ZPVElOR19NQVNLfCBcCisJR0FJTlNfTUlOX09GRlNFVFNfQ0ZfQUdDX0hJU1RfUEhZX0VSUl9NQVNLIFwKKwkpCisKKyNkZWZpbmUgQkJfY2hhbmluZm9fY3RybCAgICAgICAgIDB4MWEzNzAKKyNkZWZpbmUgQkJfbXVsdGljaGFpbl9lbmFibGUgICAgIDB4MWEyYTAKKyNkZWZpbmUgQkJfY2huX3RhYmxlc19pbnRmX2FkZHIgIDB4MTk4OTQKKyNkZWZpbmUgQkJfY2huMV90YWJsZXNfaW50Zl9hZGRyIDB4MWE4OTQKKyNkZWZpbmUgQkJfY2huX3RhYmxlc19pbnRmX2RhdGEgIDB4MTk4OTgKKyNkZWZpbmUgQkJfY2huMV90YWJsZXNfaW50Zl9kYXRhIDB4MWE4OTgKKyNkZWZpbmUgQkJfZ2FpbnNfbWluX29mZnNldHMgICAgIDB4MTllMDgKKyNkZWZpbmUgQkJfY2hhbmluZm9fdGFiX2IwICAgICAgIDB4MDMyMDAKKyNkZWZpbmUgQkJfY2hhbmluZm9fdGFiX2IxICAgICAgIDB4MDMzMDAKKyNkZWZpbmUgQkJfd2F0Y2hkb2dfc3RhdHVzICAgICAgIDB4MWE3YzAKKyNkZWZpbmUgQkJfd2F0Y2hkb2dfY3RybF8xICAgICAgIDB4MWE3YzQKKyNkZWZpbmUgQkJfd2F0Y2hkb2dfY3RybF8yICAgICAgIDB4MWE3YzgKKyNkZWZpbmUgQkJfd2F0Y2hkb2dfc3RhdHVzX0IgICAgIDB4MWE3ZTAKKworc3RydWN0IHByaXZfY3RybF9jdHggeworCXVpbnQzMl90IGNoYW5pbmZvX2N0cmxfb3JpZzsKKwl1aW50MzJfdCBnYWluX21pbl9vZmZzZXRzX29yaWc7CisJdWludDMyX3QgYW55cmVnX3N0YXJ0OworCXVpbnQzMl90IGFueXJlZ19sZW47Cit9OworCitzdGF0aWMgc3RydWN0IHByaXZfY3RybF9jdHggZ19wcml2X2R1bXBfY3R4OworCitzdGF0aWMgSU5MSU5FIHZvaWQgc2V0X3RhcmdldF9yZWdfYml0cyh2b2lkIF9faW9tZW0gKm1lbSwgdWludDMyX3QgcmVnLAorCQkJCSAgICAgICB1aW50MzJfdCBiaXRtYXNrLCB1aW50MzJfdCB2YWwpCit7CisJdWludDMyX3QgdmFsdWUgPSBoaWZfcmVhZDMyX21iKG1lbSArIChyZWcpKTsKKwl1aW50MzJfdCBzaGlmdCA9IDA7CisJdmFsdWUgJj0gfihiaXRtYXNrKTsKKwl3aGlsZSAoISgoYml0bWFzayA+PiBzaGlmdCkgJiAweDAxKSkKKwkJc2hpZnQrKzsKKworCXZhbHVlIHw9ICgoKHZhbCkgPDwgc2hpZnQpICYgKGJpdG1hc2spKTsKKwloaWZfd3JpdGUzMl9tYihtZW0gKyAocmVnKSwgdmFsdWUpOworfQorCitzdGF0aWMgSU5MSU5FIHVpbnQzMl90IGdldF90YXJnZXRfcmVnX2JpdHModm9pZCBfX2lvbWVtICptZW0sCisJCQkJCSAgIHVpbnQzMl90IHJlZywgdWludDMyX3QgYml0bWFzaykKK3sKKwl1aW50MzJfdCB2YWx1ZSA9IGhpZl9yZWFkMzJfbWIobWVtICsgKHJlZykpOworCXVpbnQzMl90IHNoaWZ0ID0gMDsKKwl3aGlsZSAoISgoYml0bWFzayA+PiBzaGlmdCkgJiAweDAxKSkKKwkJc2hpZnQrKzsKKworCXJldHVybiAodmFsdWUgPj4gc2hpZnQpICYgYml0bWFzazsKK30KKwordm9pZCBwcml2X3N0YXJ0X2NhcF9jaGFuaW5mbyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlzZXRfdGFyZ2V0X3JlZ19iaXRzKHNjbi0+bWVtLCBCQl9jaGFuaW5mb19jdHJsLAorCQkJICAgIENIQU5JTkZPX0NUUkxfQ0FQVFVSRV9DSEFOX0lORk9fTUFTSywgMSk7Cit9CisKK3ZvaWQgcHJpdl9zdGFydF9hZ2Moc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJZ19wcml2X2R1bXBfY3R4LmdhaW5fbWluX29mZnNldHNfb3JpZyA9CisJCWhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKyBCQl9nYWluc19taW5fb2Zmc2V0cyk7CisJc2V0X3RhcmdldF9yZWdfYml0cyhzY24tPm1lbSwgQkJfZ2FpbnNfbWluX29mZnNldHMsCisJCQkgICAgQUdDX0hJU1RPUllfRFVNUF9NQVNLLAorCQkJICAgIDB4MGYpOworfQorCit2b2lkIHByaXZfc3RvcF9hZ2Moc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJc2V0X3RhcmdldF9yZWdfYml0cyhzY24tPm1lbSwgQkJfZ2FpbnNfbWluX29mZnNldHMsCisJCQkgICAgQUdDX0hJU1RPUllfRFVNUF9NQVNLLAorCQkJICAgIDApOworfQorCit2b2lkIHByaXZfZHVtcF9jaGFuaW5mbyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwl1aW50MzJfdCBidywgdmFsOworCXVpbnQzMl90IGxlbiwgaSwgdG1wOworCXVpbnQzMl90IGNoYWluX21hc2s7CisJdWludDMyX3QgY2hhaW4wLCBjaGFpbjE7CisKKwljaGFpbl9tYXNrID0KKwkJZ2V0X3RhcmdldF9yZWdfYml0cyhzY24tPm1lbSwgQkJfbXVsdGljaGFpbl9lbmFibGUsCisJCQkJICAgIE1VTFRJQ0hBSU5fRU5BQkxFX1JYX0NIQUlOX01BU0tfTUFTSyk7CisJY2hhaW4wID0gY2hhaW5fbWFzayAmIDE7CisJY2hhaW4xID0gY2hhaW5fbWFzayAmIDI7CisKKwlISUZfVFJBQ0UoIiVzOiBFIiwgX19mdW5jX18pOworCWJ3ID0gZ2V0X3RhcmdldF9yZWdfYml0cyhzY24tPm1lbSwgQkJfY2hhbmluZm9fY3RybCwKKwkJCQkgQ0hBTklORk9fQ1RSTF9DSEFOSU5GT01FTV9CV19NQVNLKTsKKworCWlmIChidyA9PSAwKQorCQlsZW4gPSA1MzsKKwllbHNlIGlmIChidyA9PSAxKQorCQlsZW4gPSA1NzsKKwllbHNlIGlmIChidyA9PSAyKQorCQlsZW4gPSA1OSAqIDIgLSAxOworCWVsc2UKKwkJbGVuID0gNjAgKiAyICsgNjEgKiAyOworCisJLyoKKwkgKiBlYWNoIHRvbmUgaXMgMTYgYml0IHZhbGlkLCB3cml0ZSB0byAzMmJpdCBidWZmZXIgZWFjaC4KKwkgKiBidz09MChsZWdhY3kyMCk6IDUzIHRvbmVzLgorCSAqIGJ3PT0xKGh0L3ZodDIwKTogNTcgdG9uZXMuCisJICogYnc9PTIoaHQvdmh0NDApOiA1OSs1OCB0b25lcy4KKwkgKiBidz09Myh2aHQ4MCk6IDYwKjIrNjEqMiB0b25lcy4KKwkgKi8KKworCWlmIChjaGFpbjApIHsKKwkJaGlmX3dyaXRlMzJfbWIoc2NuLT5tZW0gKyBCQl9jaG5fdGFibGVzX2ludGZfYWRkciwKKwkJCSAgICAgIDB4ODAwMDMyMDApOworCX0KKwlpZiAoY2hhaW4xKSB7CisJCWhpZl93cml0ZTMyX21iKHNjbi0+bWVtICsgQkJfY2huMV90YWJsZXNfaW50Zl9hZGRyLAorCQkJICAgICAgMHg4MDAwMzIwMCk7CisJfQorCisJc2V0X3RhcmdldF9yZWdfYml0cyhzY24tPm1lbSwgQkJfY2hhbmluZm9fY3RybCwKKwkJCUNIQU5JTkZPTUVNX1MyX1JFQURfTUFTSywgMCk7CisKKwlpZiAoY2hhaW4wKSB7CisJCWlmIChidyA8IDIpIHsKKwkJCWxlbiA9IChidyA9PSAwKSA/IDUzIDogNTc7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCQl2YWwgPQorCQkJCQloaWZfcmVhZDMyX21iKHNjbi0+bWVtICsKKwkJCQkJCSAgICAgQkJfY2huX3RhYmxlc19pbnRmX2RhdGEpICYKKwkJCQkJMHgwMDAwZmZmZjsKKwkJCQljZGZfcHJpbnQoIjB4JXhcdCIsIHZhbCk7CisJCQkJaWYgKGkgJSA0ID09IDApCisJCQkJCWNkZl9wcmludCgiXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxlbiA9IChidyA9PSAyKSA/IDU5IDogNjA7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCQl0bXAgPQorCQkJCQloaWZfcmVhZDMyX21iKHNjbi0+bWVtICsKKwkJCQkJCSAgICAgQkJfY2huX3RhYmxlc19pbnRmX2RhdGEpOworCQkJCWNkZl9wcmludCgiMHgleFx0IiwgKCh0bXAgPj4gMTYpICYgMHgwMDAwZmZmZikpOworCQkJCWNkZl9wcmludCgiMHgleFx0IiwgKHRtcCAmIDB4MDAwMGZmZmYpKTsKKwkJCQlpZiAoaSAlIDIgPT0gMCkKKwkJCQkJY2RmX3ByaW50KCJcbiIpOworCQkJfQorCQkJaWYgKGJ3ID4gMikgeworCQkJCS8qIGJ3ID09IDMgZm9yIHZodDgwICovCisJCQkJaGlmX3dyaXRlMzJfbWIoc2NuLT5tZW0gKworCQkJCQkgICAgICBCQl9jaG5fdGFibGVzX2ludGZfYWRkciwKKwkJCQkJICAgICAgMHg4MDAwMzMwMCk7CisJCQkJbGVuID0gNjE7CisJCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQkJCXRtcCA9CisJCQkJCQloaWZfcmVhZDMyX21iKHNjbi0+bWVtICsKKwkJCQkJCSAgICAgQkJfY2huX3RhYmxlc19pbnRmX2RhdGEpOworCQkJCQljZGZfcHJpbnQoIjB4JXhcdCIsCisJCQkJCSAgICAgICAoKHRtcCA+PiAxNikgJiAweDAwMDBmZmZmKSk7CisJCQkJCWNkZl9wcmludCgiMHgleFx0IiwgKHRtcCAmIDB4MDAwMGZmZmYpKTsKKwkJCQkJaWYgKGkgJSAyID09IDApCisJCQkJCQljZGZfcHJpbnQoIlxuIik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChjaGFpbjEpIHsKKwkJaWYgKGJ3IDwgMikgeworCQkJbGVuID0gKGJ3ID09IDApID8gNTMgOiA1NzsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJCXZhbCA9CisJCQkJCWhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKworCQkJCQkJQkJfY2huMV90YWJsZXNfaW50Zl9kYXRhKSAmCisJCQkJCTB4MDAwMGZmZmY7CisJCQkJY2RmX3ByaW50KCIweCV4XHQiLCB2YWwpOworCQkJCWlmIChpICUgNCA9PSAwKQorCQkJCQljZGZfcHJpbnQoIlxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsZW4gPSAoYncgPT0gMikgPyA1OSA6IDYwOworCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQkJdG1wID0KKwkJCQkJaGlmX3JlYWQzMl9tYihzY24tPm1lbSArCisJCQkJCQkgICAgIEJCX2NobjFfdGFibGVzX2ludGZfZGF0YSk7CisJCQkJY2RmX3ByaW50KCIweCV4XG4iLCAodG1wID4+IDE2KSAmIDB4MDAwMGZmZmYpOworCQkJCWNkZl9wcmludCgiMHgleFxuIiwgdG1wICYgMHgwMDAwZmZmZik7CisJCQkJaWYgKGkgJSAyID09IDApCisJCQkJCWNkZl9wcmludCgiXG4iKTsKKwkJCX0KKwkJCWlmIChidyA+IDIpIHsKKwkJCQkvKiBidyA9PSAzIGZvciB2aHQ4MCAqLworCQkJCWhpZl93cml0ZTMyX21iKHNjbi0+bWVtICsKKwkJCQkJICAgICAgQkJfY2huMV90YWJsZXNfaW50Zl9hZGRyLAorCQkJCQkgICAgICAweDgwMDAzMzAwKTsKKwkJCQlsZW4gPSA2MTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCQkJdG1wID0KKwkJCQkJCWhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKworCQkJCQkJICAgICBCQl9jaG4xX3RhYmxlc19pbnRmX2RhdGEpOworCQkJCQljZGZfcHJpbnQoIjB4JXhcdCIsCisJCQkJCSAgICAgICAoKHRtcCA+PiAxNikgJiAweDAwMDBmZmZmKSk7CisJCQkJCWNkZl9wcmludCgiMHgleFx0IiwgKHRtcCAmIDB4MDAwMGZmZmYpKTsKKwkJCQkJaWYgKGkgJSAyID09IDApCisJCQkJCQljZGZfcHJpbnQoIlxuIik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCUhJRl9UUkFDRSgiJXM6IFgiLCBfX2Z1bmNfXyk7Cit9CisKK3ZvaWQgcHJpdl9kdW1wX2FnYyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlpbnQgaSwgbGVuID0gMzA7ICAgICAgICAvKiBjaGVjayB0aGlzIHZhbHVlIGZvciBSb21lIGFuZCBQZXJlZ3JpbmUgKi8KKwl1aW50MzJfdCBjaGFpbjAsIGNoYWluMSwgY2hhaW5fbWFzaywgdmFsOworCisJY2hhaW5fbWFzayA9CisJCWdldF90YXJnZXRfcmVnX2JpdHMoc2NuLT5tZW0sIEJCX211bHRpY2hhaW5fZW5hYmxlLAorCQkJCSAgICBNVUxUSUNIQUlOX0VOQUJMRV9SWF9DSEFJTl9NQVNLX01BU0spOworCWNoYWluMCA9IGNoYWluX21hc2sgJiAxOworCWNoYWluMSA9IGNoYWluX21hc2sgJiAyOworCisJbGVuID0gbGVuIDw8IDE7ICAgICAgICAgLyogZWFjaCBhZ2MgaXRlbSBpcyA2NGJpdCwgdG90YWwqMiAqLworCXByaXZfc3RvcF9hZ2Moc2NuKTsKKworCXNldF90YXJnZXRfcmVnX2JpdHMoc2NuLT5tZW0sIEJCX2NoYW5pbmZvX2N0cmwsCisJCQlDSEFOSU5GT01FTV9TMl9SRUFEX01BU0ssIDApOworCisJSElGX1RSQUNFKCIlczogQUdDIGhpc3RvcnkgYnVmZmVyIGR1bXA6IEUiLCBfX2Z1bmNfXyk7CisJaWYgKGNoYWluMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCXZhbCA9CisJCQkJaGlmX3JlYWQzMl9tYihzY24tPm1lbSArIEJCX2NoYW5pbmZvX3RhYl9iMCArCisJCQkJCSAgICAgaSAqIDQpOworCQkJY2RmX3ByaW50KCIweCV4XHQiLCB2YWwpOworCQkJaWYgKGkgJSA0ID09IDApCisJCQkJY2RmX3ByaW50KCJcbiIpOworCQl9CisJfQorCWlmIChjaGFpbjEpIHsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQl2YWwgPQorCQkJCWhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKyBCQl9jaGFuaW5mb190YWJfYjEgKworCQkJCQkgICAgIGkgKiA0KTsKKwkJCWNkZl9wcmludCgiMHgleFx0IiwgdmFsKTsKKwkJCWlmIChpICUgNCA9PSAwKQorCQkJCWNkZl9wcmludCgiXG4iKTsKKwkJfQorCX0KKwlISUZfVFJBQ0UoIiVzOiBBR0MgaGlzdG9yeSBidWZmZXIgZHVtcCBYIiwgX19mdW5jX18pOworCS8qIHJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgKi8KKwloaWZfd3JpdGUzMl9tYihzY24tPm1lbSArIEJCX2dhaW5zX21pbl9vZmZzZXRzLAorCQkgICAgICBnX3ByaXZfZHVtcF9jdHguZ2Fpbl9taW5fb2Zmc2V0c19vcmlnKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgcHJpdl9kdW1wX2Jid2F0Y2hkb2coc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDMyX3QgdmFsOworCisJSElGX1RSQUNFKCIlczogQkIgd2F0Y2hkb2cgZHVtcCBFIiwgX19mdW5jX18pOworCXZhbCA9IGhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKyBCQl93YXRjaGRvZ19zdGF0dXMpOworCWNkZl9wcmludCgiMHgleFx0IiwgdmFsKTsKKwl2YWwgPSBoaWZfcmVhZDMyX21iKHNjbi0+bWVtICsgQkJfd2F0Y2hkb2dfY3RybF8xKTsKKwljZGZfcHJpbnQoIjB4JXhcdCIsIHZhbCk7CisJdmFsID0gaGlmX3JlYWQzMl9tYihzY24tPm1lbSArIEJCX3dhdGNoZG9nX2N0cmxfMik7CisJY2RmX3ByaW50KCIweCV4XHQiLCB2YWwpOworCXZhbCA9IGhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKyBCQl93YXRjaGRvZ19zdGF0dXNfQik7CisJY2RmX3ByaW50KCIweCV4IiwgdmFsKTsKKwlISUZfVFJBQ0UoIiVzOiBCQiB3YXRjaGRvZyBkdW1wIFgiLCBfX2Z1bmNfXyk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvbXBfZGV2LmggYi9jb3JlL2hpZi9zcmMvbXBfZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3ZTNkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9tcF9kZXYuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX01QX0RFVl9IX18KKyNkZWZpbmUgX19NUF9ERVZfSF9fCit2b2lkIHByaXZfc3RhcnRfYWdjKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK3ZvaWQgcHJpdl9kdW1wX2FnYyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7Cit2b2lkIHByaXZfc3RhcnRfY2FwX2NoYW5pbmZvKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK3ZvaWQgcHJpdl9kdW1wX2NoYW5pbmZvKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK3ZvaWQgcHJpdl9kdW1wX2Jid2F0Y2hkb2coc3RydWN0IG9sX3NvZnRjICpzY24pOwordm9pZCBoaWZfc2h1dF9kb3duX2RldmljZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CisjZW5kaWYgLyogX19NUF9ERVZfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvcGNpZS9jbnNzX3N0dWIuaCBiL2NvcmUvaGlmL3NyYy9wY2llL2Nuc3Nfc3R1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YWIxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hpZi9zcmMvcGNpZS9jbnNzX3N0dWIuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0NOU1NfU1RVQl9IX18KKyNkZWZpbmUgX19DTlNTX1NUVUJfSF9fCisKKyNpZm5kZWYgQ09ORklHX0NOU1MKK2lubGluZSB2b2lkIGNuc3Nfd2xhbl9wY2lfbGlua19kb3duKHZvaWQpIHt9CisKK2lubGluZSBpbnQgY25zc19wY2llX3NoYWRvd19jb250cm9sKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGJvb2wgZW5hYmxlKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKKyNlbmRpZiAvKiBfX0NOU1NfU1RVQl9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9wY2llL2hpZl9pbzMyX3BjaS5oIGIvY29yZS9oaWYvc3JjL3BjaWUvaGlmX2lvMzJfcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmYTMwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9wY2llL2hpZl9pbzMyX3BjaS5oCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0hJRl9JTzMyX1BDSV9IX18KKyNkZWZpbmUgX19ISUZfSU8zMl9QQ0lfSF9fCisKKyNpZmRlZiBISUZfUENJCisKKyNpbmNsdWRlICJoaWYuaCIKKyNpbmNsdWRlICJyZWd0YWJsZS5oIgorI2luY2x1ZGUgImNlX3JlZy5oIgorI2luY2x1ZGUgImNkZl9hdG9taWMuaCIKKyNpbmNsdWRlICJpZl9wY2kuaCIKKy8qCisgKiBGb3IgbWF4aW11bSBwZXJmb3JtYW5jZSBhbmQgbm8gcG93ZXIgbWFuYWdlbWVudCwgc2V0IHRoaXMgdG8gMS4KKyAqIEZvciBwb3dlciBtYW5hZ2VtZW50IGF0IHRoZSBjb3N0IG9mIHBlcmZvcm1hbmNlLCBzZXQgdGhpcyB0byAwLgorICovCisjZGVmaW5lIENPTkZJR19BVEhfUENJRV9NQVhfUEVSRiAwCisKKy8qCisgKiBGb3Iga2VlcGluZyB0aGUgdGFyZ2V0IGF3YWtlIHRpbGwgdGhlIGRyaXZlciBpcworICogbG9hZGVkLCBzZXQgdGhpcyB0byAxCisgKi8KKyNkZWZpbmUgQ09ORklHX0FUSF9QQ0lFX0FXQUtFX1dISUxFX0RSSVZFUl9MT0FEIDEKKworLyoKKyAqIFdoZW4gQ09ORklHX0FUSF9QQ0lFX01BWF9QRVJGIGlzIDA6CisgKiBUbyB1c2UgTElLRUxZIGhpbnRzLCBzZXQgdGhpcyB0byAxIChzbGlnaHRseSBiZXR0ZXIgcGVyZm9ybWFuY2UsIG1vcmUgcG93ZXIpCisgKiBUbyBpZ25vcmUgIkxJS0VMWSIgaGludHMsIHNldCB0aGlzIHRvIDAgKHNsaWdodGx5IHdvcnNlIHBlcmZvcm1hbmNlLAorICogbGVzcyBwb3dlcikKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0FUSF9QQ0lFX01BWF9QRVJGKQorI2RlZmluZSBDT05GSUdfQVRIX1BDSUVfQUNDRVNTX0xJS0VMWSAwCisjZWxzZQorI2RlZmluZSBDT05GSUdfQVRIX1BDSUVfQUNDRVNTX0xJS0VMWSAxCisjZW5kaWYKKworLyoKKyAqIFBDSS1FIEwxIEFTUFBNIHN1Yi1zdGF0ZXMKKyAqIFRvIGVuYWJsZSBjbG9jayBnYXRpbmcgaW4gTDEgc3RhdGUsIHNldCB0aGlzIHRvIDEuCisgKiAobGVzcyBwb3dlciwgc2xpZ2h0bHkgbW9yZSB3YWtldXAgbGF0ZW5jeSkKKyAqIFRvIGRpc2FibGUgY2xvY2sgZ2F0aW5nIGluIEwxIHN0YXRlLCBzZXQgdGhpcyB0byAwLiAoc2xpZ2hseSBtb3JlIHBvd2VyKQorICovCisjZGVmaW5lIENPTkZJR19QQ0lFX0VOQUJMRV9MMV9DTE9DS19HQVRFIDEKKworLyoKKyAqIFBDSUVfQUNDRVNTX0xPR19OVU0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YKKyAqIHJlYWQvd3JpdGUgcmVjb3JkcyB0byBzdG9yZQorICovCisjaWZkZWYgQ09ORklHX0FUSF9QQ0lFX0FDQ0VTU19ERUJVRworI2RlZmluZSBQQ0lFX0FDQ0VTU19MT0dfTlVNIDUwMAorI2VuZGlmCisKKy8qIDY0LWJpdCBNU0kgc3VwcG9ydCAqLworI2RlZmluZSBDT05GSUdfUENJRV82NEJJVF9NU0kgMAorCisvKiBCQVIwIHJlYWR5IGNoZWNraW5nIGZvciBBUjYzMjB2MiAqLworI2RlZmluZSBQQ0lFX0JBUjBfUkVBRFlfQ0hFQ0tJTkcgMAorCisvKiBBWEkgZ2F0aW5nIHdoZW4gTDEsIEwyIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbiAqLworI2RlZmluZSBDT05GSUdfUENJRV9FTkFCTEVfQVhJX0NMS19HQVRFIDAKKworI2RlZmluZSBoaWZfcmVhZDMyX21iKGFkZHIpICAgICAgICAgaW9yZWFkMzIoKHZvaWQgX19pb21lbSAqKWFkZHIpCisjZGVmaW5lIGhpZl93cml0ZTMyX21iKGFkZHIsIHZhbHVlKSBcCisJaW93cml0ZTMyKCh1MzIpKHZhbHVlKSwgKHZvaWQgX19pb21lbSAqKShhZGRyKSkKKworZXh0ZXJuIGludCBoaWZfdGFyZ2V0X3NsZWVwX3N0YXRlX2FkanVzdChzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwKKwkJCQkJIGJvb2wgc2xlZXBfb2ssCisJCQkJCSBib29sIHdhaXRfZm9yX2l0KTsKKworI2lmIENPTkZJR19BVEhfUENJRV9NQVhfUEVSRgorI2RlZmluZSBBX1RBUkdFVF9BQ0NFU1NfQkVHSU4oc2NuKSBcCisJZG8ge3N0cnVjdCBvbF9zb2Z0YyAqdW51c2VkID0gc2NuOyBcCisJICAgIHVudXNlZCA9IHVudXNlZDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBBX1RBUkdFVF9BQ0NFU1NfRU5EKHNjbikgXAorCWRvIHtzdHJ1Y3Qgb2xfc29mdGMgKnVudXNlZCA9IHNjbjsgXAorCSAgICB1bnVzZWQgPSB1bnVzZWQ7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX09LKHNjbikgMQorCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19MSUtFTFkoc2NuKSBcCisJZG8ge3N0cnVjdCBvbF9zb2Z0YyAqdW51c2VkID0gc2NuOyBcCisJICAgIHVudXNlZCA9IHVudXNlZDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBBX1RBUkdFVF9BQ0NFU1NfVU5MSUtFTFkoc2NuKSBcCisJZG8ge3N0cnVjdCBvbF9zb2Z0YyAqdW51c2VkID0gc2NuOyBcCisJICAgIHVudXNlZCA9IHVudXNlZDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBBX1RBUkdFVF9SRUFEKHNjbiwgb2Zmc2V0KSBcCisJaGlmX3JlYWQzMl9tYihzY24tPm1lbSArIChvZmZzZXQpKQorCit2b2lkIHdhcl9wY2lfd3JpdGUzMihjaGFyICphZGRyLCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOworI2RlZmluZSBBX1RBUkdFVF9XUklURShzY24sIG9mZnNldCwgdmFsdWUpIFwKKwl3YXJfcGNpX3dyaXRlMzIoc2NuLT5tZW0sIChvZmZzZXQpLCAodmFsdWUpKQorCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVQoc2NuKSBcCisJZG8ge3N0cnVjdCBvbF9zb2Z0YyAqdW51c2VkID0gc2NuOyBcCisJICAgIHVudXNlZCA9IHVudXNlZDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBBX1RBUkdFVF9BQ0NFU1NfQkVHSU5fUkVUX0VYVChzY24sIHZhbCkgXAorCWRvIHtzdHJ1Y3Qgb2xfc29mdGMgKnVudXNlZCA9IHNjbjsgXAorCSAgICB1bnVzZWQgPSB1bnVzZWQ7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX0JFR0lOX1JFVF9QVFIoc2NuKSBcCisJZG8ge3N0cnVjdCBvbF9zb2Z0YyAqdW51c2VkID0gc2NuOyBcCisJICAgIHVudXNlZCA9IHVudXNlZDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBBX1RBUkdFVF9BQ0NFU1NfRU5EX1JFVChzY24pCVwKKwlkbyB7c3RydWN0IG9sX3NvZnRjICp1bnVzZWQgPSBzY247IFwKKwkJdW51c2VkID0gdW51c2VkOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19FTkRfUkVUX0VYVChzY24sIHZhbCkgXAorCWRvIHtzdHJ1Y3Qgb2xfc29mdGMgKnVudXNlZCA9IHNjbjsgXAorCSAgICB1bnVzZWQgPSB1bnVzZWQ7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX0VORF9SRVRfUFRSKHNjbikgXAorCWRvIHtzdHJ1Y3Qgb2xfc29mdGMgKnVudXNlZCA9IHNjbjsgXAorCQl1bnVzZWQgPSB1bnVzZWQ7IH0gd2hpbGUgKDApCisKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09ORklHX0FUSF9QQ0lFX01BWF9QRVJGICovCisKK3ZvaWQgd2FyX3BjaV93cml0ZTMyKGNoYXIgKmFkZHIsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSk7CisKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX0JFR0lOX1JFVF9FWFQoc2NuLCB2YWwpIFwKK2RvIHsgXAorCWlmICghV0xBTl9JU19FUFBJTkdfRU5BQkxFRChjZHNfZ2V0X2NvbnBhcmFtKCkpICYmIFwKKwkJUV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbikgPCAwKSBcCisJCXZhbCA9IC0xOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVQoc2NuKSBcCitkbyB7IFwKKwlpZiAoIVdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoY2RzX2dldF9jb25wYXJhbSgpKSAmJiBcCisJICAgIFFfVEFSR0VUX0FDQ0VTU19CRUdJTihzY24pIDwgMCkgXAorCQlyZXR1cm4gQVRIX0lTUl9OT1NDSEVEOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVRfUFRSKHNjbikgXAorZG8geyBcCisJaWYgKCFXTEFOX0lTX0VQUElOR19FTkFCTEVEKGNkc19nZXRfY29ucGFyYW0oKSkgJiYgXAorCSAgICBRX1RBUkdFVF9BQ0NFU1NfQkVHSU4oc2NuKSA8IDApIFwKKwkJcmV0dXJuIE5VTEw7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbikgXAorZG8geyBcCisJaWYgKFFfVEFSR0VUX0FDQ0VTU19CRUdJTihzY24pIDwgMCkgXAorCQlyZXR1cm47IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbikgXAorCWhpZl90YXJnZXRfc2xlZXBfc3RhdGVfYWRqdXN0KHNjbiwgZmFsc2UsIHRydWUpCisKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX0VORF9SRVQoc2NuKQlcCitkbyB7IFwKKwlpZiAoIVdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoY2RzX2dldF9jb25wYXJhbSgpKSAmJiBcCisJICAgIFFfVEFSR0VUX0FDQ0VTU19FTkQoc2NuKSA8IDApIFwKKwkJcmV0dXJuIEFUSF9JU1JfTk9TQ0hFRDsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBX1RBUkdFVF9BQ0NFU1NfRU5EX1JFVF9FWFQoc2NuLCB2YWwpIFwKK2RvIHsgXAorCWlmICghV0xBTl9JU19FUFBJTkdfRU5BQkxFRChjZHNfZ2V0X2NvbnBhcmFtKCkpICYmIFwKKwkgICAgUV9UQVJHRVRfQUNDRVNTX0VORChzY24pIDwgMCkgXAorCQl2YWwgPSAtMTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBX1RBUkdFVF9BQ0NFU1NfRU5EX1JFVF9QVFIoc2NuKSBcCitkbyB7IFwKKwlpZiAoIVdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoY2RzX2dldF9jb25wYXJhbSgpKSAmJiBcCisJICAgIFFfVEFSR0VUX0FDQ0VTU19FTkQoc2NuKSA8IDApIFwKKwkJcmV0dXJuIE5VTEw7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19FTkQoc2NuKSBcCitkbyB7IFwKKwlpZiAoUV9UQVJHRVRfQUNDRVNTX0VORChzY24pIDwgMCkgXAorCQlyZXR1cm47IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUV9UQVJHRVRfQUNDRVNTX0VORChzY24pIFwKKwloaWZfdGFyZ2V0X3NsZWVwX3N0YXRlX2FkanVzdChzY24sIHRydWUsIGZhbHNlKQorCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19PSyhzY24pIGhpZl90YXJnZXRfZm9yY2VkX2F3YWtlKHNjbikKKworI2lmIENPTkZJR19BVEhfUENJRV9BQ0NFU1NfTElLRUxZCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19MSUtFTFkoc2NuKSBcCisJaGlmX3RhcmdldF9zbGVlcF9zdGF0ZV9hZGp1c3Qoc2NuLCBmYWxzZSwgZmFsc2UpCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19VTkxJS0VMWShzY24pIFwKKwloaWZfdGFyZ2V0X3NsZWVwX3N0YXRlX2FkanVzdChzY24sIHRydWUsIGZhbHNlKQorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDT05GSUdfQVRIX1BDSUVfQUNDRVNTX0xJS0VMWSAqLworI2RlZmluZSBBX1RBUkdFVF9BQ0NFU1NfTElLRUxZKHNjbikgXAorCWRvIHsgXAorCQl1bnNpZ25lZCBsb25nIHVudXNlZCA9ICh1bnNpZ25lZCBsb25nKShzY24pOyBcCisJCXVudXNlZCA9IHVudXNlZDsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX1VOTElLRUxZKHNjbikgXAorCWRvIHsgXAorCQl1bnNpZ25lZCBsb25nIHVudXNlZCA9ICh1bnNpZ25lZCBsb25nKShzY24pOyBcCisJCXVudXNlZCA9IHVudXNlZDsgXAorCX0gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX0FUSF9QQ0lFX0FDQ0VTU19MSUtFTFkgKi8KKworI2lmZGVmIENPTkZJR19BVEhfUENJRV9BQ0NFU1NfREVCVUcKK2V4dGVybiB1aW50MzJfdCBoaWZfdGFyZ2V0X3JlYWRfY2hlY2tlZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwKKwkJCQkJdWludDMyX3Qgb2Zmc2V0KTsKK2V4dGVybiB2b2lkIGhpZl90YXJnZXRfd3JpdGVfY2hlY2tlZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdWludDMyX3Qgb2Zmc2V0LAorCQkJCSAgICAgdWludDMyX3QgdmFsdWUpOworI2RlZmluZSBBX1RBUkdFVF9SRUFEKHNjbiwgb2Zmc2V0KSBcCisJaGlmX3RhcmdldF9yZWFkX2NoZWNrZWQoc2NuLCAob2Zmc2V0KSkKKyNkZWZpbmUgQV9UQVJHRVRfV1JJVEUoc2NuLCBvZmZzZXQsIHZhbHVlKSBcCisJaGlmX3RhcmdldF93cml0ZV9jaGVja2VkKHNjbiwgKG9mZnNldCksICh2YWx1ZSkpCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPTkZJR19BVEhfUENJRV9BQ0NFU1NfREVCVUcgKi8KKyNkZWZpbmUgQV9UQVJHRVRfUkVBRChzY24sIG9mZnNldCkgXAorCWhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKyAob2Zmc2V0KSkKKyNkZWZpbmUgQV9UQVJHRVRfV1JJVEUoc2NuLCBvZmZzZXQsIHZhbHVlKSBcCisJd2FyX3BjaV93cml0ZTMyKHNjbi0+bWVtLCAob2Zmc2V0KSwgKHZhbHVlKSkKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19BVEhfUENJRV9NQVhfUEVSRiAqLworCisvKioKKyAqIGNlX2lycV9lbmFibGUoKSAtIGNlX2lycV9lbmFibGUKKyAqIEBzY246IG9sX3NvZnRjCisgKiBAY2VfaWQ6IGNlX2lkCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZV9pcnFfZW5hYmxlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBpbnQgY2VfaWQpCit7CisJdWludDMyX3QgdG1wID0gMSA8PCBjZV9pZDsKKwlzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqc2MgPSBzY24tPmhpZl9zYzsKKworCWNkZl9zcGluX2xvY2tfaXJxc2F2ZSgmc2NuLT5pcnFfbG9jayk7CisJc2NuLT5jZV9pcnFfc3VtbWFyeSAmPSB+dG1wOworCWlmIChzY24tPmNlX2lycV9zdW1tYXJ5ID09IDApIHsKKwkJLyogRW5hYmxlIExlZ2FjeSBQQ0kgbGluZSBpbnRlcnJ1cHRzICovCisJCWlmIChMRUdBQ1lfSU5URVJSVVBUUyhzYykgJiYKKwkJCShzY24tPnRhcmdldF9zdGF0dXMgIT0gT0xfVFJHRVRfU1RBVFVTX1JFU0VUKSAmJgorCQkJKCFjZGZfYXRvbWljX3JlYWQoJnNjbi0+bGlua19zdXNwZW5kZWQpKSkgeworCisJCQloaWZfd3JpdGUzMl9tYihzY24tPm1lbSArCisJCQkJKFNPQ19DT1JFX0JBU0VfQUREUkVTUyB8CisJCQkJUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTKSwKKwkJCQlIT1NUX0dST1VQMF9NQVNLKTsKKworCQkJaGlmX3JlYWQzMl9tYihzY24tPm1lbSArCisJCQkJCShTT0NfQ09SRV9CQVNFX0FERFJFU1MgfAorCQkJCQlQQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MpKTsKKwkJfQorCX0KKwlpZiAoc2NuLT5oaWZfaW5pdF9kb25lID09IHRydWUpCisJCUFfVEFSR0VUX0FDQ0VTU19FTkQoc2NuKTsKKwljZGZfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NuLT5pcnFfbG9jayk7Cit9CisvKioKKyAqIGNlX2lycV9kaXNhYmxlKCkgLSBjZV9pcnFfZGlzYWJsZQorICogQHNjbjogb2xfc29mdGMKKyAqIEBjZV9pZDogY2VfaWQKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNlX2lycV9kaXNhYmxlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBpbnQgY2VfaWQpCit7CisJLyogRm9yIFJvbWUgb25seSBuZWVkIHRvIHdha2UgdXAgdGFyZ2V0ICovCisJQV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbik7Cit9CisvKioKKyAqIHNvY193YWtlX3Jlc2V0KCkgLSBzb2Nfd2FrZV9yZXNldAorICogQHNjbjogb2xfc29mdGMKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNvY193YWtlX3Jlc2V0KHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCWhpZl93cml0ZTMyX21iKHNjbi0+bWVtICsKKwkJUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgKworCQlQQ0lFX1NPQ19XQUtFX0FERFJFU1MsCisJCVBDSUVfU09DX1dBS0VfUkVTRVQpOworfQorI2VuZGlmIC8qIEhJRl9QQ0kgKi8KKyNlbmRpZiAvKiBfX0hJRl9JTzMyX1BDSV9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9wY2llL2lmX3BjaS5jIGIvY29yZS9oaWYvc3JjL3BjaWUvaWZfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmYjQxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9wY2llL2lmX3BjaS5jCkBAIC0wLDAgKzEsMjIzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPG9zZGVwLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2lmZGVmIENPTkZJR19QQ0lfTVNNCisjaW5jbHVkZSA8bGludXgvbXNtX3BjaWUuaD4KKyNlbmRpZgorI2luY2x1ZGUgImhpZl9pbzMyLmgiCisjaW5jbHVkZSAiaWZfcGNpLmgiCisjaW5jbHVkZSAiaGlmLmgiCisjaW5jbHVkZSAiaGlmX21haW4uaCIKKyNpbmNsdWRlICJjZV9hcGkuaCIKKyNpbmNsdWRlICJjZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNlX3JlZy5oIgorI2luY2x1ZGUgImJtaV9tc2cuaCIgICAgICAgICAgICAvKiBUQVJHRVRfVFlQRV8gKi8KKyNpbmNsdWRlICJyZWd0YWJsZS5oIgorI2luY2x1ZGUgIm9sX2Z3LmgiCisjaW5jbHVkZSA8b3NhcGlfbGludXguaD4KKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAiY2RmX3N0YXR1cy5oIgorI2luY2x1ZGUgImNkc19zY2hlZC5oIgorI2luY2x1ZGUgIndtYV9hcGkuaCIKKyNpbmNsdWRlICJjZGZfYXRvbWljLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfcG93ZXIuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2Vsc2UKKyNpbmNsdWRlICJjbnNzX3N0dWIuaCIKKyNlbmRpZgorI2luY2x1ZGUgImVwcGluZ19tYWluLmgiCisjaW5jbHVkZSAibXBfZGV2LmgiCisjaW5jbHVkZSAiaGlmX2RlYnVnLmgiCisKKyNpZm5kZWYgUkVNT1ZFX1BLVF9MT0cKKyNpbmNsdWRlICJvbF90eHJ4X3R5cGVzLmgiCisjaW5jbHVkZSAicGt0bG9nX2FjX2FwaS5oIgorI2luY2x1ZGUgInBrdGxvZ19hYy5oIgorI2VuZGlmCisjaW5jbHVkZSAiaWZfcGNpX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaWNuc3Nfc3R1Yi5oIgorI2luY2x1ZGUgImNlX3Rhc2tsZXQuaCIKKworLyogTWF4aW11bSBtcyB0aW1lb3V0IGZvciBob3N0IHRvIHdha2UgdXAgdGFyZ2V0ICovCisjZGVmaW5lIFBDSUVfV0FLRV9USU1FT1VUIDEwMDAKKyNkZWZpbmUgUkFNRFVNUF9FVkVOVF9USU1FT1VUIDI1MDAKKwordW5zaWduZWQgaW50IG1zaWVuYWJsZSA9IDA7Cittb2R1bGVfcGFyYW0obXNpZW5hYmxlLCBpbnQsIDA2NDQpOworCitpbnQgaGlmX3BjaV93YXIxID0gMDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socGNpd2FyX2xvY2spOworCisjaWZuZGVmIFJFTU9WRV9QS1RfTE9HCitzdHJ1Y3Qgb2xfcGxfb3NfZGVwX2Z1bmNzICpnX29sX3BsX29zX2RlcF9mdW5jcyA9IE5VTEw7CisjZW5kaWYKKworLyogU2V0dGluZyBTT0NfR0xPQkFMX1JFU0VUIGR1cmluZyBkcml2ZXIgdW5sb2FkIGNhdXNlcyBpbnRlcm1pdHRlbnQKKyAqIFBDSWUgZGF0YSBidXMgZXJyb3IKKyAqIEFzIHdvcmthcm91bmQgZm9yIHRoaXMgaXNzdWUgLSBjaGFuZ2luZyB0aGUgcmVzZXQgc2VxdWVuY2UgdG8KKyAqIHVzZSBUYXJnZXRDUFUgd2FybSByZXNldCAqIGluc3RlYWQgb2YgU09DX0dMT0JBTF9SRVNFVAorICovCisjZGVmaW5lIENQVV9XQVJNX1JFU0VUX1dBUgorLyoKKyAqIFRvcC1sZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgYWxsIFBDSSBpbnRlcnJ1cHRzIGZyb20gYSBUYXJnZXQuCisgKiBXaGVuIGEgYmxvY2sgb2YgTVNJIGludGVycnVwdHMgaXMgYWxsb2NhdGVkLCB0aGlzIHRvcC1sZXZlbCBoYW5kbGVyCisgKiBpcyBub3QgdXNlZDsgaW5zdGVhZCwgd2UgZGlyZWN0bHkgY2FsbCB0aGUgY29ycmVjdCBzdWItaGFuZGxlci4KKyAqLworc3RydWN0IGNlX2lycV9yZWdfdGFibGUgeworCXVpbnQzMl90IGlycV9lbmFibGU7CisJdWludDMyX3QgaXJxX3N0YXR1czsKK307CisKKyNpZiAhZGVmaW5lZChRQ0FfV0lGSV8zXzBfSUhFTElVTSkgJiYgIWRlZmluZWQoUUNBX1dJRklfM18wX0FEUkFTVEVBKQorc3RhdGljIGlubGluZSB2b2lkIGNuc3NfaW50cl9ub3RpZnlfcTYodm9pZCkKK3sKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUUNBX1dJRklfM18wX0lIRUxJVU0pICYmICFkZWZpbmVkKFFDQV9XSUZJXzNfMF9BRFJBU1RFQSkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqY25zc19nZXRfdGFyZ2V0X3NtZW0odm9pZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCit2b2lkIGhpZl9wY2lfcm91dGVfdGFyZ2V0X2ludGVycnVwdChzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqc2MpCit7CisJdWludDMyX3QgdGFyZ2V0X2NhdXNlMCwgdGFyZ2V0X2NhdXNlMSwgdGFyZ2V0X2NhdXNlMjsKKwl1aW50MzJfdCAqdGFyZ2V0X3NtZW07CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBzYy0+b2xfc2M7CisKKwl0YXJnZXRfc21lbSA9ICh1aW50MzJfdCAqKWNuc3NfZ2V0X3RhcmdldF9zbWVtKCk7CisJaWYgKCF0YXJnZXRfc21lbSkKKwkJcmV0dXJuOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJaGlmX3dyaXRlMzJfbWIoc2MtPm1lbSArCisJCSAgICAgICBBX1NPQ19DT1JFX1NDUkFUQ0hfMF9BRERSRVNTLCAwKTsKKwloaWZfd3JpdGUzMl9tYihzYy0+bWVtICsKKwkJICAgICAgIEFfU09DX0NPUkVfU0NSQVRDSF8xX0FERFJFU1MsIDApOworCWhpZl93cml0ZTMyX21iKHNjLT5tZW0gKworCQkgICAgICAgQV9TT0NfQ09SRV9TQ1JBVENIXzJfQUREUkVTUywgMCk7CisJLyogcmVhZCBjYXVzZSAqLworCXRhcmdldF9jYXVzZTAgPSBoaWZfcmVhZDMyX21iKHNjLT5tZW0gKworCQkJCSAgICAgIEFfU09DX0NPUkVfU0NSQVRDSF8zX0FERFJFU1MpOworCXRhcmdldF9jYXVzZTEgPSBoaWZfcmVhZDMyX21iKHNjLT5tZW0gKworCQkJCSAgICAgIEFfU09DX0NPUkVfU0NSQVRDSF80X0FERFJFU1MpOworCXRhcmdldF9jYXVzZTIgPSBoaWZfcmVhZDMyX21iKHNjLT5tZW0gKworCQkJCSAgICAgIEFfU09DX0NPUkVfU0NSQVRDSF81X0FERFJFU1MpOworCS8qIGNsZWFyIGNhdXNlIHJlZ2lzdGVycyAqLworCWhpZl93cml0ZTMyX21iKHNjLT5tZW0gKworCQkgICAgICAgQV9TT0NfQ09SRV9TQ1JBVENIXzNfQUREUkVTUywgMHhmZmZmZmZmZik7CisJaGlmX3dyaXRlMzJfbWIoc2MtPm1lbSArCisJCSAgICAgICBBX1NPQ19DT1JFX1NDUkFUQ0hfNF9BRERSRVNTLCAweGZmZmZmZmZmKTsKKwloaWZfd3JpdGUzMl9tYihzYy0+bWVtICsKKwkJICAgICAgIEFfU09DX0NPUkVfU0NSQVRDSF81X0FERFJFU1MsIDB4ZmZmZmZmZmYpOworCWhpZl93cml0ZTMyX21iKHNjLT5tZW0gKworCQkgICAgICAgQV9TT0NfQ09SRV9TQ1JBVENIXzNfQUREUkVTUywgMCk7CisJaGlmX3dyaXRlMzJfbWIoc2MtPm1lbSArCisJCSAgICAgICBBX1NPQ19DT1JFX1NDUkFUQ0hfNF9BRERSRVNTLCAwKTsKKwloaWZfd3JpdGUzMl9tYihzYy0+bWVtICsKKwkJICAgICAgIEFfU09DX0NPUkVfU0NSQVRDSF81X0FERFJFU1MsIDApOworCS8qIGNvcHkgY2F1c2UgdmFsdWUgdG8gUTYgKi8KKwkqdGFyZ2V0X3NtZW0gPSB0YXJnZXRfY2F1c2UwOworCSoodGFyZ2V0X3NtZW0gKyAxKSA9IHRhcmdldF9jYXVzZTE7CisJKih0YXJnZXRfc21lbSArIDIpID0gdGFyZ2V0X2NhdXNlMjsKKwlpZiAoc2NuLT5ub3RpY2Vfc2VuZCkKKwkJY25zc19pbnRyX25vdGlmeV9xNigpOworfQorCisjaWZuZGVmIFFDQV9XSUZJXzNfMF9BRFJBU1RFQQorc3RhdGljIGlubGluZSB2b2lkIGhpZl9wY2lfcm91dGVfYWRyYXN0ZWFfaW50ZXJydXB0KHN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYykKK3sKKwlyZXR1cm47Cit9CisjZWxzZQordm9pZCBoaWZfcGNpX3JvdXRlX2FkcmFzdGVhX2ludGVycnVwdChzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqc2MpCit7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBzYy0+b2xfc2M7CisJdW5zaWduZWQgaW50IHRhcmdldF9lbmFibGUwLCB0YXJnZXRfZW5hYmxlMTsKKwl1bnNpZ25lZCBpbnQgdGFyZ2V0X2NhdXNlMCwgdGFyZ2V0X2NhdXNlMTsKKworCXRhcmdldF9lbmFibGUwID0gaGlmX3JlYWQzMl9tYihzYy0+bWVtICsgUTZfRU5BQkxFX1JFR0lTVEVSXzApOworCXRhcmdldF9lbmFibGUxID0gaGlmX3JlYWQzMl9tYihzYy0+bWVtICsgUTZfRU5BQkxFX1JFR0lTVEVSXzEpOworCXRhcmdldF9jYXVzZTAgPSBoaWZfcmVhZDMyX21iKHNjLT5tZW0gKyBRNl9DQVVTRV9SRUdJU1RFUl8wKTsKKwl0YXJnZXRfY2F1c2UxID0gaGlmX3JlYWQzMl9tYihzYy0+bWVtICsgUTZfQ0FVU0VfUkVHSVNURVJfMSk7CisKKwlpZiAoKHRhcmdldF9lbmFibGUwICYgdGFyZ2V0X2NhdXNlMCkgfHwKKwkgICAgKHRhcmdldF9lbmFibGUxICYgdGFyZ2V0X2NhdXNlMSkpIHsKKwkJaGlmX3dyaXRlMzJfbWIoc2MtPm1lbSArIFE2X0VOQUJMRV9SRUdJU1RFUl8wLCAwKTsKKwkJaGlmX3dyaXRlMzJfbWIoc2MtPm1lbSArIFE2X0VOQUJMRV9SRUdJU1RFUl8xLCAwKTsKKworCQlpZiAoc2NuLT5ub3RpY2Vfc2VuZCkKKwkJCWNuc3NfaW50cl9ub3RpZnlfcTYoKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGlycXJldHVybl90IGhpZl9wY2lfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYyA9IChzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqKWFyZzsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IHNjLT5vbF9zYzsKKwlzdHJ1Y3QgSElGX0NFX3N0YXRlICpoaWZfc3RhdGUgPSAoc3RydWN0IEhJRl9DRV9zdGF0ZSAqKXNjbi0+aGlmX2hkbDsKKwl2b2xhdGlsZSBpbnQgdG1wOworCXVpbnQxNl90IHZhbDsKKwl1aW50MzJfdCBiYXIwOworCXVpbnQzMl90IGZ3X2luZGljYXRvcl9hZGRyZXNzLCBmd19pbmRpY2F0b3I7CisJYm9vbCBzc3JfaXJxID0gZmFsc2U7CisJdW5zaWduZWQgaW50IGhvc3RfY2F1c2UsIGhvc3RfZW5hYmxlOworCisJaWYgKExFR0FDWV9JTlRFUlJVUFRTKHNjKSkgeworCQlpZiAoUV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbikgPCAwKQorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJCWlmIChBRFJBU1RFQV9CVSkgeworCQkJaG9zdF9lbmFibGUgPSBoaWZfcmVhZDMyX21iKHNjLT5tZW0gKworCQkJCQkJICAgIFBDSUVfSU5UUl9FTkFCTEVfQUREUkVTUyk7CisJCQlob3N0X2NhdXNlID0gaGlmX3JlYWQzMl9tYihzYy0+bWVtICsKKwkJCQkJCSAgIFBDSUVfSU5UUl9DQVVTRV9BRERSRVNTKTsKKwkJCWlmICghKGhvc3RfZW5hYmxlICYgaG9zdF9jYXVzZSkpIHsKKwkJCQloaWZfcGNpX3JvdXRlX2FkcmFzdGVhX2ludGVycnVwdChzYyk7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQl9CisKKwkJLyogQ2xlYXIgTGVnYWN5IFBDSSBsaW5lIGludGVycnVwdHMKKwkJICogSU1QT1JUQU5UOiBJTlRSX0NMUiByZWdpc2VyIGhhcyB0byBiZSBzZXQKKwkJICogYWZ0ZXIgSU5UUl9FTkFCTEUgaXMgc2V0IHRvIDAsCisJCSAqIG90aGVyd2lzZSBpbnRlcnJ1cHQgY2FuIG5vdCBiZSByZWFsbHkgY2xlYXJlZCAqLworCQloaWZfd3JpdGUzMl9tYihzYy0+bWVtICsKKwkJCSAgICAgIChTT0NfQ09SRV9CQVNFX0FERFJFU1MgfAorCQkJICAgICAgIFBDSUVfSU5UUl9FTkFCTEVfQUREUkVTUyksIDApOworCQlpZiAoSUhFTElVTV9CVSkgeworCQkJaWYgKCFoaWZfcmVhZDMyX21iKHNjLT5tZW0gKyBQQ0lFX0lOVFJfQ0FVU0VfQUREUkVTUykpIHsKKwkJCQloaWZfcGNpX3JvdXRlX3RhcmdldF9pbnRlcnJ1cHQoc2MpOworCisJCQkJaGlmX3dyaXRlMzJfbWIoc2MtPm1lbSArCisJCQkJCSAgICAgICAoU09DX0NPUkVfQkFTRV9BRERSRVNTIHwKKwkJCQkJCVBDSUVfSU5UUl9FTkFCTEVfQUREUkVTUyksCisJCQkJCSAgICAgICBIT1NUX0dST1VQMF9NQVNLKTsKKworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJfQorCisJCWhpZl93cml0ZTMyX21iKHNjLT5tZW0gKworCQkJICAgICAgKFNPQ19DT1JFX0JBU0VfQUREUkVTUyB8IFBDSUVfSU5UUl9DTFJfQUREUkVTUyksCisJCQkgICAgICAgQURSQVNURUFfQlUgPworCQkJICAgICAgIChob3N0X2VuYWJsZSAmIGhvc3RfY2F1c2UpIDoKKwkJCSAgICAgIEhPU1RfR1JPVVAwX01BU0spOworCisJCWlmIChBRFJBU1RFQV9CVSkKKwkJCWhpZl93cml0ZTMyX21iKHNjLT5tZW0gKyAweDJmMTAwYyAsIChob3N0X2NhdXNlID4+IDEpKTsKKworCQkvKiBJTVBPUlRBTlQ6IHRoaXMgZXh0cmEgcmVhZCB0cmFuc2FjdGlvbiBpcyByZXF1aXJlZCB0bworCQkgKiBmbHVzaCB0aGUgcG9zdGVkIHdyaXRlIGJ1ZmZlciAqLworCQlpZiAoIUFEUkFTVEVBX0JVKSB7CisJCXRtcCA9CisJCQloaWZfcmVhZDMyX21iKHNjLT5tZW0gKworCQkJCSAgICAgKFNPQ19DT1JFX0JBU0VfQUREUkVTUyB8CisJCQkJICAgICAgUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTKSk7CisKKwkJaWYgKHRtcCA9PSAweGRlYWRiZWVmKSB7CisJCQlISUZfRVJST1IoIkJVRyglcyk6IFNvQyByZXR1cm5zIDB4ZGVhZGJlZWYhISIsCisJCQkgICAgICAgX19mdW5jX18pOworCisJCQlwY2lfcmVhZF9jb25maWdfd29yZChzYy0+cGRldiwgUENJX1ZFTkRPUl9JRCwgJnZhbCk7CisJCQlISUZfRVJST1IoIiVzOiBQQ0kgVmVuZG9yIElEID0gMHglMDR4IiwKKwkJCSAgICAgICBfX2Z1bmNfXywgdmFsKTsKKworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoc2MtPnBkZXYsIFBDSV9ERVZJQ0VfSUQsICZ2YWwpOworCQkJSElGX0VSUk9SKCIlczogUENJIERldmljZSBJRCA9IDB4JTA0eCIsCisJCQkgICAgICAgX19mdW5jX18sIHZhbCk7CisKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNjLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnZhbCk7CisJCQlISUZfRVJST1IoIiVzOiBQQ0kgQ29tbWFuZCA9IDB4JTA0eCIsIF9fZnVuY19fLAorCQkJICAgICAgIHZhbCk7CisKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNjLT5wZGV2LCBQQ0lfU1RBVFVTLCAmdmFsKTsKKwkJCUhJRl9FUlJPUigiJXM6IFBDSSBTdGF0dXMgPSAweCUwNHgiLCBfX2Z1bmNfXywKKwkJCSAgICAgICB2YWwpOworCisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2MtPnBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwKKwkJCQkJICAgICAgJmJhcjApOworCQkJSElGX0VSUk9SKCIlczogUENJIEJBUjAgPSAweCUwOHgiLCBfX2Z1bmNfXywKKwkJCSAgICAgICBiYXIwKTsKKworCQkJSElGX0VSUk9SKCIlczogUlRDX1NUQVRFX0FERFJFU1MgPSAweCUwOHgiLAorCQkJCSAgX19mdW5jX18sCisJCQkJICBoaWZfcmVhZDMyX21iKHNjLT5tZW0gKworCQkJCQkJUENJRV9MT0NBTF9CQVNFX0FERFJFU1MKKwkJCQkJCSsgUlRDX1NUQVRFX0FERFJFU1MpKTsKKwkJCUhJRl9FUlJPUigiJXM6IFBDSUVfU09DX1dBS0VfQUREUkVTUyA9IDB4JTA4eCIsCisJCQkJICBfX2Z1bmNfXywKKwkJCQkgIGhpZl9yZWFkMzJfbWIoc2MtPm1lbSArCisJCQkJCQlQQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUworCQkJCQkJKyBQQ0lFX1NPQ19XQUtFX0FERFJFU1MpKTsKKwkJCUhJRl9FUlJPUigiJXM6IDB4ODAwMDggPSAweCUwOHgsIDB4ODAwMGMgPSAweCUwOHgiLAorCQkJCSAgX19mdW5jX18sCisJCQkJICBoaWZfcmVhZDMyX21iKHNjLT5tZW0gKyAweDgwMDA4KSwKKwkJCQkgIGhpZl9yZWFkMzJfbWIoc2MtPm1lbSArIDB4ODAwMGMpKTsKKwkJCUhJRl9FUlJPUigiJXM6IDB4ODAwMTAgPSAweCUwOHgsIDB4ODAwMTQgPSAweCUwOHgiLAorCQkJCSAgX19mdW5jX18sCisJCQkJICBoaWZfcmVhZDMyX21iKHNjLT5tZW0gKyAweDgwMDEwKSwKKwkJCQkgIGhpZl9yZWFkMzJfbWIoc2MtPm1lbSArIDB4ODAwMTQpKTsKKwkJCUhJRl9FUlJPUigiJXM6IDB4ODAwMTggPSAweCUwOHgsIDB4ODAwMWMgPSAweCUwOHgiLAorCQkJCSAgX19mdW5jX18sCisJCQkJICBoaWZfcmVhZDMyX21iKHNjLT5tZW0gKyAweDgwMDE4KSwKKwkJCQkgIGhpZl9yZWFkMzJfbWIoc2MtPm1lbSArIDB4ODAwMWMpKTsKKwkJCUNERl9CVUcoMCk7CisJCX0KKworCQlQQ0lfQ0xSX0NBVVNFMF9SRUdJU1RFUihzYyk7CisJCX0KKworCQlpZiAoSEFTX0ZXX0lORElDQVRPUikgeworCQkJZndfaW5kaWNhdG9yX2FkZHJlc3MgPSBoaWZfc3RhdGUtPmZ3X2luZGljYXRvcl9hZGRyZXNzOworCQkJZndfaW5kaWNhdG9yID0gQV9UQVJHRVRfUkVBRChzY24sIGZ3X2luZGljYXRvcl9hZGRyZXNzKTsKKwkJCWlmICgoZndfaW5kaWNhdG9yICE9IH4wKSAmJgorCQkJICAgKGZ3X2luZGljYXRvciAmIEZXX0lORF9FVkVOVF9QRU5ESU5HKSkKKwkJCQlzc3JfaXJxID0gdHJ1ZTsKKwkJfQorCisJCWlmIChRX1RBUkdFVF9BQ0NFU1NfRU5EKHNjbikgPCAwKQorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwkvKiBUQkRYWFg6IEFkZCBzdXBwb3J0IGZvciBXTUFDICovCisKKwlpZiAoc3NyX2lycSkgeworCQlzYy0+aXJxX2V2ZW50ID0gaXJxOworCQljZGZfYXRvbWljX3NldCgmc2NuLT50YXNrbGV0X2Zyb21faW50ciwgMSk7CisKKwkJY2RmX2F0b21pY19pbmMoJnNjbi0+YWN0aXZlX3Rhc2tsZXRfY250KTsKKwkJdGFza2xldF9zY2hlZHVsZSgmc2MtPmludHJfdHEpOworCX0gZWxzZSB7CisJCWljbnNzX2Rpc3BhdGNoX2NlX2lycShzY24pOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGhpZl9wY2lfbXNpX2Z3X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYyA9IChzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqKWFyZzsKKworCShpcnFyZXR1cm5fdCkgaGlmX2Z3X2ludGVycnVwdF9oYW5kbGVyKHNjLT5pcnFfZXZlbnQsIHNjLT5vbF9zYyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2Jvb2wgaGlmX3RhcmdfaXNfYXdha2Uoc3RydWN0IG9sX3NvZnRjICpzY24sIHZvaWQgKl9faW9tZW0gKm1lbSkKK3sKKwlISUZfUENJX1RBUkdfSVNfQVdBS0Uoc2NuLCBtZW0pOworfQorCitib29sIGhpZl9wY2lfdGFyZ19pc19wcmVzZW50KHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB2b2lkICpfX2lvbWVtICptZW0pCit7CisJcmV0dXJuIDE7ICAgICAgICAgICAgICAgLyogRklYIFRISVMgKi8KK30KKworLyoqCisgKiBoaWZfcGNpX2NhbmNlbF9kZWZlcnJlZF90YXJnZXRfc2xlZXAoKSAtIGNhbmNlbHMgdGhlIGRlZmVyZWQgdGFyZ2V0IHNsZWVwCisgKiBAc2NuOiBvbF9zb2Z0YworICoKKyAqIFJldHVybjogdm9pZAorICovCisjaWYgQ09ORklHX0FUSF9QQ0lFX01BWF9QRVJGID09IDAKK3ZvaWQgaGlmX3BjaV9jYW5jZWxfZGVmZXJyZWRfdGFyZ2V0X3NsZWVwKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZSA9IChzdHJ1Y3QgSElGX0NFX3N0YXRlICopc2NuLT5oaWZfaGRsOworCUFfdGFyZ2V0X2lkX3QgcGNpX2FkZHIgPSBzY24tPm1lbTsKKworCWNkZl9zcGluX2xvY2tfaXJxc2F2ZSgmaGlmX3N0YXRlLT5rZWVwX2F3YWtlX2xvY2spOworCS8qCisJICogSWYgdGhlIGRlZmVycmVkIHNsZWVwIHRpbWVyIGlzIHJ1bm5pbmcgY2FuY2VsIGl0CisJICogYW5kIHB1dCB0aGUgc29jIGludG8gc2xlZXAuCisJICovCisJaWYgKGhpZl9zdGF0ZS0+ZmFrZV9zbGVlcCA9PSB0cnVlKSB7CisJCWNkZl9zb2Z0aXJxX3RpbWVyX2NhbmNlbCgmaGlmX3N0YXRlLT5zbGVlcF90aW1lcik7CisJCWlmIChoaWZfc3RhdGUtPnZlcmlmaWVkX2F3YWtlID09IGZhbHNlKSB7CisJCQloaWZfd3JpdGUzMl9tYihwY2lfYWRkciArIFBDSUVfTE9DQUxfQkFTRV9BRERSRVNTICsKKwkJCQkgICAgICBQQ0lFX1NPQ19XQUtFX0FERFJFU1MsCisJCQkJICAgICAgUENJRV9TT0NfV0FLRV9SRVNFVCk7CisJCX0KKwkJaGlmX3N0YXRlLT5mYWtlX3NsZWVwID0gZmFsc2U7CisJfQorCWNkZl9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZoaWZfc3RhdGUtPmtlZXBfYXdha2VfbG9jayk7Cit9CisjZWxzZQoraW5saW5lIHZvaWQgaGlmX3BjaV9jYW5jZWxfZGVmZXJyZWRfdGFyZ2V0X3NsZWVwKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXJldHVybjsKK30KKyNlbmRpZgorCisjZGVmaW5lIEFfUENJRV9MT0NBTF9SRUdfUkVBRChtZW0sIGFkZHIpIFwKKwloaWZfcmVhZDMyX21iKChjaGFyICopKG1lbSkgKyBcCisJUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgKyAodWludDMyX3QpKGFkZHIpKQorCisjZGVmaW5lIEFfUENJRV9MT0NBTF9SRUdfV1JJVEUobWVtLCBhZGRyLCB2YWwpIFwKKwloaWZfd3JpdGUzMl9tYigoKGNoYXIgKikobWVtKSArIFwKKwlQQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUyArICh1aW50MzJfdCkoYWRkcikpLCAodmFsKSkKKworI2RlZmluZSBBVEhfUENJX1JFU0VUX1dBSVRfTUFYIDEwICAgICAgIC8qIE1zICovCitzdGF0aWMgdm9pZCBoaWZfcGNpX2RldmljZV9yZXNldChzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqc2MpCit7CisJdm9pZCBfX2lvbWVtICptZW0gPSBzYy0+bWVtOworCWludCBpOworCXVpbnQzMl90IHZhbDsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IHNjLT5vbF9zYzsKKworCWlmICghc2NuLT5ob3N0ZGVmKQorCQlyZXR1cm47CisKKwkvKiBOQjogRG9uJ3QgY2hlY2sgcmVzZXRvayBoZXJlLiAgVGhpcyBmb3JtIG9mIHJlc2V0CisJICogaXMgaW50ZWdyYWwgdG8gY29ycmVjdCBvcGVyYXRpb24uICovCisKKwlpZiAoIVNPQ19HTE9CQUxfUkVTRVRfQUREUkVTUykgeworCQlyZXR1cm47CisJfQorCisJaWYgKCFtZW0pIHsKKwkJcmV0dXJuOworCX0KKworCUhJRl9FUlJPUigiJXM6IFJlc2V0IERldmljZSIsIF9fZnVuY19fKTsKKworCS8qCisJICogTkI6IElmIHdlIHRyeSB0byB3cml0ZSBTT0NfR0xPQkFMX1JFU0VUX0FERFJFU1Mgd2l0aG91dCBmaXJzdAorCSAqIHdyaXRpbmcgV0FLRV9WLCB0aGUgVGFyZ2V0IG1heSBzY3JpYmJsZSBvdmVyIEhvc3QgbWVtb3J5IQorCSAqLworCUFfUENJRV9MT0NBTF9SRUdfV1JJVEUobWVtLCBQQ0lFX1NPQ19XQUtFX0FERFJFU1MsCisJCQkgICAgICAgUENJRV9TT0NfV0FLRV9WX01BU0spOworCWZvciAoaSA9IDA7IGkgPCBBVEhfUENJX1JFU0VUX1dBSVRfTUFYOyBpKyspIHsKKwkJaWYgKGhpZl90YXJnX2lzX2F3YWtlKHNjbiwgbWVtKSkKKwkJCWJyZWFrOworCisJCWNkZl9tZGVsYXkoMSk7CisJfQorCisJLyogUHV0IFRhcmdldCwgaW5jbHVkaW5nIFBDSWUsIGludG8gUkVTRVQuICovCisJdmFsID0gQV9QQ0lFX0xPQ0FMX1JFR19SRUFEKG1lbSwgU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTKTsKKwl2YWwgfD0gMTsKKwlBX1BDSUVfTE9DQUxfUkVHX1dSSVRFKG1lbSwgU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTLCB2YWwpOworCWZvciAoaSA9IDA7IGkgPCBBVEhfUENJX1JFU0VUX1dBSVRfTUFYOyBpKyspIHsKKwkJaWYgKEFfUENJRV9MT0NBTF9SRUdfUkVBRChtZW0sIFJUQ19TVEFURV9BRERSRVNTKSAmCisJCSAgICBSVENfU1RBVEVfQ09MRF9SRVNFVF9NQVNLKQorCQkJYnJlYWs7CisKKwkJY2RmX21kZWxheSgxKTsKKwl9CisKKwkvKiBQdWxsIFRhcmdldCwgaW5jbHVkaW5nIFBDSWUsIG91dCBvZiBSRVNFVC4gKi8KKwl2YWwgJj0gfjE7CisJQV9QQ0lFX0xPQ0FMX1JFR19XUklURShtZW0sIFNPQ19HTE9CQUxfUkVTRVRfQUREUkVTUywgdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVRIX1BDSV9SRVNFVF9XQUlUX01BWDsgaSsrKSB7CisJCWlmICghCisJCSAgICAoQV9QQ0lFX0xPQ0FMX1JFR19SRUFEKG1lbSwgUlRDX1NUQVRFX0FERFJFU1MpICYKKwkJICAgICBSVENfU1RBVEVfQ09MRF9SRVNFVF9NQVNLKSkKKwkJCWJyZWFrOworCisJCWNkZl9tZGVsYXkoMSk7CisJfQorCisJQV9QQ0lFX0xPQ0FMX1JFR19XUklURShtZW0sIFBDSUVfU09DX1dBS0VfQUREUkVTUywgUENJRV9TT0NfV0FLRV9SRVNFVCk7Cit9CisKKy8qIENQVSB3YXJtIHJlc2V0IGZ1bmN0aW9uCisgKiBTdGVwczoKKyAqIDEuIERpc2FibGUgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAtIHNvIG5vIHBlbmRpbmcgaW50ZXJydXB0cyBvbiBXQVJNIHJlc2V0CisgKiAyLiBDbGVhciB0aGUgRldfSU5ESUNBVE9SX0FERFJFU1MgLXNvIFRyYWdldCBDUFUgaW50aWFsaXplcyBGVworICogICAgY29ycmVjdGx5IG9uIFdBUk0gcmVzZXQKKyAqIDMuIENsZWFyIFRBUkdFVCBDUFUgTEYgdGltZXIgaW50ZXJydXB0CisgKiA0LiBSZXNldCBhbGwgQ0VzIHRvIGNsZWFyIGFueSBwZW5kaW5nIENFIHRhcm5zYWN0aW9ucworICogNS4gV2FybSByZXNldCBDUFUKKyAqLwordm9pZCBoaWZfcGNpX2RldmljZV93YXJtX3Jlc2V0KHN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYykKK3sKKwl2b2lkIF9faW9tZW0gKm1lbSA9IHNjLT5tZW07CisJaW50IGk7CisJdWludDMyX3QgdmFsOworCXVpbnQzMl90IGZ3X2luZGljYXRvcjsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IHNjLT5vbF9zYzsKKworCS8qIE5COiBEb24ndCBjaGVjayByZXNldG9rIGhlcmUuICBUaGlzIGZvcm0gb2YgcmVzZXQgaXMKKwkgKiBpbnRlZ3JhbCB0byBjb3JyZWN0IG9wZXJhdGlvbi4gKi8KKworCWlmICghbWVtKSB7CisJCXJldHVybjsKKwl9CisKKwlISUZfSU5GT19NRUQoIiVzOiBUYXJnZXQgV2FybSBSZXNldCIsIF9fZnVuY19fKTsKKworCS8qCisJICogTkI6IElmIHdlIHRyeSB0byB3cml0ZSBTT0NfR0xPQkFMX1JFU0VUX0FERFJFU1Mgd2l0aG91dCBmaXJzdAorCSAqIHdyaXRpbmcgV0FLRV9WLCB0aGUgVGFyZ2V0IG1heSBzY3JpYmJsZSBvdmVyIEhvc3QgbWVtb3J5IQorCSAqLworCUFfUENJRV9MT0NBTF9SRUdfV1JJVEUobWVtLCBQQ0lFX1NPQ19XQUtFX0FERFJFU1MsCisJCQkgICAgICAgUENJRV9TT0NfV0FLRV9WX01BU0spOworCWZvciAoaSA9IDA7IGkgPCBBVEhfUENJX1JFU0VUX1dBSVRfTUFYOyBpKyspIHsKKwkJaWYgKGhpZl90YXJnX2lzX2F3YWtlKHNjbiwgbWVtKSkKKwkJCWJyZWFrOworCQljZGZfbWRlbGF5KDEpOworCX0KKworCS8qCisJICogRGlzYWJsZSBQZW5kaW5nIGludGVycnVwdHMKKwkgKi8KKwl2YWwgPQorCQloaWZfcmVhZDMyX21iKG1lbSArCisJCQkgICAgIChTT0NfQ09SRV9CQVNFX0FERFJFU1MgfAorCQkJICAgICAgUENJRV9JTlRSX0NBVVNFX0FERFJFU1MpKTsKKwlISUZfSU5GT19NRUQoIiVzOiBIb3N0IEludHIgQ2F1c2UgcmVnIDB4JXggOiB2YWx1ZSA6IDB4JXgiLCBfX2Z1bmNfXywKKwkJICAgIChTT0NfQ09SRV9CQVNFX0FERFJFU1MgfCBQQ0lFX0lOVFJfQ0FVU0VfQUREUkVTUyksIHZhbCk7CisJLyogVGFyZ2V0IENQVSBJbnRyIENhdXNlICovCisJdmFsID0gaGlmX3JlYWQzMl9tYihtZW0gKyAoU09DX0NPUkVfQkFTRV9BRERSRVNTIHwgQ1BVX0lOVFJfQUREUkVTUykpOworCUhJRl9JTkZPX01FRCgiJXM6IFRhcmdldCBDUFUgSW50ciBDYXVzZSAweCV4IiwgX19mdW5jX18sIHZhbCk7CisKKwl2YWwgPQorCQloaWZfcmVhZDMyX21iKG1lbSArCisJCQkgICAgIChTT0NfQ09SRV9CQVNFX0FERFJFU1MgfAorCQkJICAgICAgUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTKSk7CisJaGlmX3dyaXRlMzJfbWIoKG1lbSArCisJCSAgICAgICAoU09DX0NPUkVfQkFTRV9BRERSRVNTIHwgUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTKSksIDApOworCWhpZl93cml0ZTMyX21iKChtZW0gKyAoU09DX0NPUkVfQkFTRV9BRERSRVNTICsgUENJRV9JTlRSX0NMUl9BRERSRVNTKSksCisJCSAgICAgIEhPU1RfR1JPVVAwX01BU0spOworCisJY2RmX21kZWxheSgxMDApOworCisJLyogQ2xlYXIgRldfSU5ESUNBVE9SX0FERFJFU1MgKi8KKwlpZiAoSEFTX0ZXX0lORElDQVRPUikgeworCQlmd19pbmRpY2F0b3IgPSBoaWZfcmVhZDMyX21iKG1lbSArIEZXX0lORElDQVRPUl9BRERSRVNTKTsKKwkJaGlmX3dyaXRlMzJfbWIobWVtICsgRldfSU5ESUNBVE9SX0FERFJFU1MsIDApOworCX0KKworCS8qIENsZWFyIFRhcmdldCBMRiBUaW1lciBpbnRlcnJ1cHRzICovCisJdmFsID0KKwkJaGlmX3JlYWQzMl9tYihtZW0gKworCQkJICAgICAoUlRDX1NPQ19CQVNFX0FERFJFU1MgKworCQkJICAgICAgU09DX0xGX1RJTUVSX0NPTlRST0wwX0FERFJFU1MpKTsKKwlISUZfSU5GT19NRUQoIiVzOiBhZGRyIDB4JXggOiAgMHgleCIsIF9fZnVuY19fLAorCSAgICAgICAoUlRDX1NPQ19CQVNFX0FERFJFU1MgKyBTT0NfTEZfVElNRVJfQ09OVFJPTDBfQUREUkVTUyksIHZhbCk7CisJdmFsICY9IH5TT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0s7CisJaGlmX3dyaXRlMzJfbWIobWVtICsKKwkJICAgICAgKFJUQ19TT0NfQkFTRV9BRERSRVNTICsgU09DX0xGX1RJTUVSX0NPTlRST0wwX0FERFJFU1MpLAorCQkgICAgICB2YWwpOworCisJLyogUmVzZXQgQ0UgKi8KKwl2YWwgPQorCQloaWZfcmVhZDMyX21iKG1lbSArCisJCQkgICAgIChSVENfU09DX0JBU0VfQUREUkVTUyB8CisJCQkgICAgICBTT0NfUkVTRVRfQ09OVFJPTF9BRERSRVNTKSk7CisJdmFsIHw9IFNPQ19SRVNFVF9DT05UUk9MX0NFX1JTVF9NQVNLOworCWhpZl93cml0ZTMyX21iKChtZW0gKworCQkgICAgICAgKFJUQ19TT0NfQkFTRV9BRERSRVNTIHwgU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUykpLAorCQkgICAgICB2YWwpOworCXZhbCA9CisJCWhpZl9yZWFkMzJfbWIobWVtICsKKwkJCSAgICAgKFJUQ19TT0NfQkFTRV9BRERSRVNTIHwKKwkJCSAgICAgIFNPQ19SRVNFVF9DT05UUk9MX0FERFJFU1MpKTsKKwljZGZfbWRlbGF5KDEwKTsKKworCS8qIENFIHVucmVzZXQgKi8KKwl2YWwgJj0gflNPQ19SRVNFVF9DT05UUk9MX0NFX1JTVF9NQVNLOworCWhpZl93cml0ZTMyX21iKG1lbSArIChSVENfU09DX0JBU0VfQUREUkVTUyB8IFNPQ19SRVNFVF9DT05UUk9MX0FERFJFU1MpLAorCQkgICAgICB2YWwpOworCXZhbCA9CisJCWhpZl9yZWFkMzJfbWIobWVtICsKKwkJCSAgICAgKFJUQ19TT0NfQkFTRV9BRERSRVNTIHwKKwkJCSAgICAgIFNPQ19SRVNFVF9DT05UUk9MX0FERFJFU1MpKTsKKwljZGZfbWRlbGF5KDEwKTsKKworCS8qIFJlYWQgVGFyZ2V0IENQVSBJbnRyIENhdXNlICovCisJdmFsID0gaGlmX3JlYWQzMl9tYihtZW0gKyAoU09DX0NPUkVfQkFTRV9BRERSRVNTIHwgQ1BVX0lOVFJfQUREUkVTUykpOworCUhJRl9JTkZPX01FRCgiJXM6IFRhcmdldCBDUFUgSW50ciBDYXVzZSBhZnRlciBDRSByZXNldCAweCV4IiwKKwkJICAgIF9fZnVuY19fLCB2YWwpOworCisJLyogQ1BVIHdhcm0gUkVTRVQgKi8KKwl2YWwgPQorCQloaWZfcmVhZDMyX21iKG1lbSArCisJCQkgICAgIChSVENfU09DX0JBU0VfQUREUkVTUyB8CisJCQkgICAgICBTT0NfUkVTRVRfQ09OVFJPTF9BRERSRVNTKSk7CisJdmFsIHw9IFNPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9NQVNLOworCWhpZl93cml0ZTMyX21iKG1lbSArIChSVENfU09DX0JBU0VfQUREUkVTUyB8IFNPQ19SRVNFVF9DT05UUk9MX0FERFJFU1MpLAorCQkgICAgICB2YWwpOworCXZhbCA9CisJCWhpZl9yZWFkMzJfbWIobWVtICsKKwkJCSAgICAgKFJUQ19TT0NfQkFTRV9BRERSRVNTIHwKKwkJCSAgICAgIFNPQ19SRVNFVF9DT05UUk9MX0FERFJFU1MpKTsKKwlISUZfSU5GT19NRUQoIiVzOiBSRVNFVF9DT05UUk9MIGFmdGVyIGNwdSB3YXJtIHJlc2V0IDB4JXgiLAorCQkgICAgX19mdW5jX18sIHZhbCk7CisKKwljZGZfbWRlbGF5KDEwMCk7CisJSElGX0lORk9fTUVEKCIlczogVGFyZ2V0IFdhcm0gcmVzZXQgY29tcGxldGUiLCBfX2Z1bmNfXyk7CisKK30KKworI2lmbmRlZiBRQ0FfV0lGSV8zXzAKK2ludCBoaWZfY2hlY2tfZndfcmVnKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYyA9IHNjbi0+aGlmX3NjOworCXZvaWQgX19pb21lbSAqbWVtID0gc2MtPm1lbTsKKwl1aW50MzJfdCB2YWw7CisKKwlBX1RBUkdFVF9BQ0NFU1NfQkVHSU5fUkVUKHNjbik7CisJdmFsID0gaGlmX3JlYWQzMl9tYihtZW0gKyBGV19JTkRJQ0FUT1JfQUREUkVTUyk7CisJQV9UQVJHRVRfQUNDRVNTX0VORF9SRVQoc2NuKTsKKworCUhJRl9JTkZPX01FRCgiJXM6IEZXX0lORElDQVRPUiByZWdpc3RlciBpcyAweCV4IiwgX19mdW5jX18sIHZhbCk7CisKKwlpZiAodmFsICYgRldfSU5EX0hFTFBFUikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCitpbnQgaGlmX2NoZWNrX3NvY19zdGF0dXMoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDE2X3QgZGV2aWNlX2lkOworCXVpbnQzMl90IHZhbDsKKwl1aW50MTZfdCB0aW1lb3V0X2NvdW50ID0gMDsKKwlzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqc2MgPSBzY24tPmhpZl9zYzsKKworCS8qIENoZWNrIGRldmljZSBJRCBmcm9tIFBDSWUgY29uZmlndXJhdGlvbiBzcGFjZSBmb3IgbGluayBzdGF0dXMgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChzYy0+cGRldiwgUENJX0RFVklDRV9JRCwgJmRldmljZV9pZCk7CisJaWYgKGRldmljZV9pZCAhPSBzYy0+ZGV2aWQpIHsKKwkJSElGX0VSUk9SKCIlczogZGV2aWNlIElEIGRvZXMgbWF0Y2ggKHJlYWQgMHgleCwgZXhwZWN0IDB4JXgpIiwKKwkJCSAgX19mdW5jX18sIGRldmljZV9pZCwgc2MtPmRldmlkKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJLyogQ2hlY2sgUENJZSBsb2NhbCByZWdpc3RlciBmb3IgYmFyL21lbW9yeSBhY2Nlc3MgKi8KKwl2YWwgPSBoaWZfcmVhZDMyX21iKHNjLT5tZW0gKyBQQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUyArCisJCQkgICBSVENfU1RBVEVfQUREUkVTUyk7CisJSElGX0lORk9fTUVEKCIlczogUlRDX1NUQVRFX0FERFJFU1MgaXMgJTA4eCIsIF9fZnVuY19fLCB2YWwpOworCisJLyogVHJ5IHRvIHdha2UgdXAgdGFnZXQgaWYgaXQgc2xlZXBzICovCisJaGlmX3dyaXRlMzJfbWIoc2MtPm1lbSArIFBDSUVfTE9DQUxfQkFTRV9BRERSRVNTICsKKwkJUENJRV9TT0NfV0FLRV9BRERSRVNTLCBQQ0lFX1NPQ19XQUtFX1ZfTUFTSyk7CisJSElGX0lORk9fTUVEKCIlczogUENJRV9TT0NfV0FLRV9BRERSRVNTIGlzICUwOHgiLCBfX2Z1bmNfXywKKwkJaGlmX3JlYWQzMl9tYihzYy0+bWVtICsgUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgKworCQlQQ0lFX1NPQ19XQUtFX0FERFJFU1MpKTsKKworCS8qIENoZWNrIGlmIHRhZ2V0IGNhbiBiZSB3b2tlbiB1cCAqLworCXdoaWxlICghaGlmX3RhcmdfaXNfYXdha2Uoc2NuLCBzYy0+bWVtKSkgeworCQlpZiAodGltZW91dF9jb3VudCA+PSBQQ0lFX1dBS0VfVElNRU9VVCkgeworCQkJSElGX0VSUk9SKCIlczogd2FrZSB1cCB0aW1lb3V0LCAlMDh4LCAlMDh4IiwKKwkJCQlfX2Z1bmNfXywKKwkJCQloaWZfcmVhZDMyX21iKHNjLT5tZW0gKworCQkJCQkgICAgIFBDSUVfTE9DQUxfQkFTRV9BRERSRVNTICsKKwkJCQkJICAgICBSVENfU1RBVEVfQUREUkVTUyksCisJCQkJaGlmX3JlYWQzMl9tYihzYy0+bWVtICsKKwkJCQkJICAgICBQQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUyArCisJCQkJCVBDSUVfU09DX1dBS0VfQUREUkVTUykpOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKworCQloaWZfd3JpdGUzMl9tYihzYy0+bWVtICsgUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgKworCQkJICAgICAgUENJRV9TT0NfV0FLRV9BRERSRVNTLCBQQ0lFX1NPQ19XQUtFX1ZfTUFTSyk7CisKKwkJY2RmX21kZWxheSgxMDApOworCQl0aW1lb3V0X2NvdW50ICs9IDEwMDsKKwl9CisKKwkvKiBDaGVjayBQb3dlciByZWdpc3RlciBmb3IgU29DIGludGVybmFsIGJ1cyBpc3N1ZXMgKi8KKwl2YWwgPQorCQloaWZfcmVhZDMyX21iKHNjLT5tZW0gKyBSVENfU09DX0JBU0VfQUREUkVTUyArCisJCQkgICAgIFNPQ19QT1dFUl9SRUdfT0ZGU0VUKTsKKwlISUZfSU5GT19NRUQoIiVzOiBQb3dlciByZWdpc3RlciBpcyAlMDh4IiwgX19mdW5jX18sIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkdW1wX2NlX2RlYnVnX3JlZ2lzdGVyKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYyA9IHNjbi0+aGlmX3NjOworCXZvaWQgX19pb21lbSAqbWVtID0gc2MtPm1lbTsKKwl1aW50MzJfdCB2YWwsIGksIGo7CisJdWludDMyX3Qgd3JhcHBlcl9pZHhbXSA9IHsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSB9OworCXVpbnQzMl90IGNlX2Jhc2U7CisKKwlBX1RBUkdFVF9BQ0NFU1NfQkVHSU4oc2NuKTsKKworCS8qIERFQlVHX0lOUFVUX1NFTF9TUkMgPSAweDYgKi8KKwl2YWwgPQorCQloaWZfcmVhZDMyX21iKG1lbSArIEdQSU9fQkFTRV9BRERSRVNTICsKKwkJCSAgICAgV0xBTl9ERUJVR19JTlBVVF9TRUxfT0ZGU0VUKTsKKwl2YWwgJj0gfldMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NQVNLOworCXZhbCB8PSBXTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfU0VUKDB4Nik7CisJaGlmX3dyaXRlMzJfbWIobWVtICsgR1BJT19CQVNFX0FERFJFU1MgKyBXTEFOX0RFQlVHX0lOUFVUX1NFTF9PRkZTRVQsCisJCSAgICAgIHZhbCk7CisKKwkvKiBERUJVR19DT05UUk9MX0VOQUJMRSA9IDB4MSAqLworCXZhbCA9IGhpZl9yZWFkMzJfbWIobWVtICsgR1BJT19CQVNFX0FERFJFU1MgKworCQkJICAgV0xBTl9ERUJVR19DT05UUk9MX09GRlNFVCk7CisJdmFsICY9IH5XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01BU0s7CisJdmFsIHw9IFdMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfU0VUKDB4MSk7CisJaGlmX3dyaXRlMzJfbWIobWVtICsgR1BJT19CQVNFX0FERFJFU1MgKworCQkgICAgICBXTEFOX0RFQlVHX0NPTlRST0xfT0ZGU0VULCB2YWwpOworCisJSElGX0lORk9fTUVEKCIlczogRGVidWc6IGlucHV0c2VsOiAleCBkYmdjdHJsOiAleCIsIF9fZnVuY19fLAorCSAgICAgICBoaWZfcmVhZDMyX21iKG1lbSArIEdQSU9fQkFTRV9BRERSRVNTICsKKwkJCSAgICBXTEFOX0RFQlVHX0lOUFVUX1NFTF9PRkZTRVQpLAorCSAgICAgICBoaWZfcmVhZDMyX21iKG1lbSArIEdQSU9fQkFTRV9BRERSRVNTICsKKwkJCSAgICBXTEFOX0RFQlVHX0NPTlRST0xfT0ZGU0VUKSk7CisKKwlISUZfSU5GT19NRUQoIiVzOiBEZWJ1ZyBDRSIsIF9fZnVuY19fKTsKKwkvKiBMb29wIENFIGRlYnVnIG91dHB1dCAqLworCS8qIEFNQkFfREVCVUdfQlVTX1NFTCA9IDB4YyAqLworCXZhbCA9IGhpZl9yZWFkMzJfbWIobWVtICsgR1BJT19CQVNFX0FERFJFU1MgKyBBTUJBX0RFQlVHX0JVU19PRkZTRVQpOworCXZhbCAmPSB+QU1CQV9ERUJVR19CVVNfU0VMX01BU0s7CisJdmFsIHw9IEFNQkFfREVCVUdfQlVTX1NFTF9TRVQoMHhjKTsKKwloaWZfd3JpdGUzMl9tYihtZW0gKyBHUElPX0JBU0VfQUREUkVTUyArIEFNQkFfREVCVUdfQlVTX09GRlNFVCwgdmFsKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yod3JhcHBlcl9pZHgpIC8gc2l6ZW9mKHVpbnQzMl90KTsgaSsrKSB7CisJCS8qIEZvciAoaT0xLDIsMyw0LDgsOSkgd3JpdGUgQ0VfV1JBUFBFUl9ERUJVR19TRUwgPSBpICovCisJCXZhbCA9IGhpZl9yZWFkMzJfbWIobWVtICsgQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MgKworCQkJCSAgIENFX1dSQVBQRVJfREVCVUdfT0ZGU0VUKTsKKwkJdmFsICY9IH5DRV9XUkFQUEVSX0RFQlVHX1NFTF9NQVNLOworCQl2YWwgfD0gQ0VfV1JBUFBFUl9ERUJVR19TRUxfU0VUKHdyYXBwZXJfaWR4W2ldKTsKKwkJaGlmX3dyaXRlMzJfbWIobWVtICsgQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MgKworCQkJICAgICAgQ0VfV1JBUFBFUl9ERUJVR19PRkZTRVQsIHZhbCk7CisKKwkJSElGX0lORk9fTUVEKCIlczogY2Ugd3JhcHBlcjogJWQgYW1kYmc6ICV4IGNld2RiZzogJXgiLAorCQkJICAgIF9fZnVuY19fLCB3cmFwcGVyX2lkeFtpXSwKKwkJCSAgICBoaWZfcmVhZDMyX21iKG1lbSArIEdQSU9fQkFTRV9BRERSRVNTICsKKwkJCQlBTUJBX0RFQlVHX0JVU19PRkZTRVQpLAorCQkJICAgIGhpZl9yZWFkMzJfbWIobWVtICsgQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MgKworCQkJCUNFX1dSQVBQRVJfREVCVUdfT0ZGU0VUKSk7CisKKwkJaWYgKHdyYXBwZXJfaWR4W2ldIDw9IDcpIHsKKwkJCWZvciAoaiA9IDA7IGogPD0gNTsgaisrKSB7CisJCQkJY2VfYmFzZSA9IENFX0JBU0VfQUREUkVTUyh3cmFwcGVyX2lkeFtpXSk7CisJCQkJLyogRm9yIChqPTB+NSkgd3JpdGUgQ0VfREVCVUdfU0VMID0gaiAqLworCQkJCXZhbCA9CisJCQkJCWhpZl9yZWFkMzJfbWIobWVtICsgY2VfYmFzZSArCisJCQkJCQkgICAgIENFX0RFQlVHX09GRlNFVCk7CisJCQkJdmFsICY9IH5DRV9ERUJVR19TRUxfTUFTSzsKKwkJCQl2YWwgfD0gQ0VfREVCVUdfU0VMX1NFVChqKTsKKwkJCQloaWZfd3JpdGUzMl9tYihtZW0gKyBjZV9iYXNlICsgQ0VfREVCVUdfT0ZGU0VULAorCQkJCQkgICAgICB2YWwpOworCisJCQkJLyogcmVhZCAoQGdwaW9fYXRocl93bGFuX3JlZykKKwkJCQkgKiBXTEFOX0RFQlVHX09VVF9EQVRBICovCisJCQkJdmFsID0gaGlmX3JlYWQzMl9tYihtZW0gKyBHUElPX0JBU0VfQUREUkVTUyArCisJCQkJCQkgICBXTEFOX0RFQlVHX09VVF9PRkZTRVQpOworCQkJCXZhbCA9IFdMQU5fREVCVUdfT1VUX0RBVEFfR0VUKHZhbCk7CisKKwkJCQlISUZfSU5GT19NRUQoIiVzOiBtb2R1bGUlZDogY2VkYmc6ICV4IG91dDogJXgiLAorCQkJCQkgICAgX19mdW5jX18sIGosCisJCQkJCSAgICBoaWZfcmVhZDMyX21iKG1lbSArIGNlX2Jhc2UgKworCQkJCQkJICAgIENFX0RFQlVHX09GRlNFVCksIHZhbCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiByZWFkIChAZ3Bpb19hdGhyX3dsYW5fcmVnKSBXTEFOX0RFQlVHX09VVF9EQVRBICovCisJCQl2YWwgPQorCQkJCWhpZl9yZWFkMzJfbWIobWVtICsgR1BJT19CQVNFX0FERFJFU1MgKworCQkJCQkgICAgIFdMQU5fREVCVUdfT1VUX09GRlNFVCk7CisJCQl2YWwgPSBXTEFOX0RFQlVHX09VVF9EQVRBX0dFVCh2YWwpOworCisJCQlISUZfSU5GT19NRUQoIiVzOiBvdXQ6ICV4IiwgX19mdW5jX18sIHZhbCk7CisJCX0KKwl9CisKKwlISUZfSU5GT19NRUQoIiVzOiBEZWJ1ZyBQQ0llOiIsIF9fZnVuY19fKTsKKwkvKiBMb29wIFBDSWUgZGVidWcgb3V0cHV0ICovCisJLyogV3JpdGUgQU1CQV9ERUJVR19CVVNfU0VMID0gMHgxYyAqLworCXZhbCA9IGhpZl9yZWFkMzJfbWIobWVtICsgR1BJT19CQVNFX0FERFJFU1MgKyBBTUJBX0RFQlVHX0JVU19PRkZTRVQpOworCXZhbCAmPSB+QU1CQV9ERUJVR19CVVNfU0VMX01BU0s7CisJdmFsIHw9IEFNQkFfREVCVUdfQlVTX1NFTF9TRVQoMHgxYyk7CisJaGlmX3dyaXRlMzJfbWIobWVtICsgR1BJT19CQVNFX0FERFJFU1MgKyBBTUJBX0RFQlVHX0JVU19PRkZTRVQsIHZhbCk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDg7IGkrKykgeworCQkvKiBGb3IgKGk9MX44KSB3cml0ZSBBTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTCA9IGkgKi8KKwkJdmFsID0KKwkJCWhpZl9yZWFkMzJfbWIobWVtICsgR1BJT19CQVNFX0FERFJFU1MgKworCQkJCSAgICAgQU1CQV9ERUJVR19CVVNfT0ZGU0VUKTsKKwkJdmFsICY9IH5BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NQVNLOworCQl2YWwgfD0gQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfU0VUKGkpOworCQloaWZfd3JpdGUzMl9tYihtZW0gKyBHUElPX0JBU0VfQUREUkVTUyArIEFNQkFfREVCVUdfQlVTX09GRlNFVCwKKwkJCSAgICAgIHZhbCk7CisKKwkJLyogcmVhZCAoQGdwaW9fYXRocl93bGFuX3JlZykgV0xBTl9ERUJVR19PVVRfREFUQSAqLworCQl2YWwgPQorCQkJaGlmX3JlYWQzMl9tYihtZW0gKyBHUElPX0JBU0VfQUREUkVTUyArCisJCQkJICAgICBXTEFOX0RFQlVHX09VVF9PRkZTRVQpOworCQl2YWwgPSBXTEFOX0RFQlVHX09VVF9EQVRBX0dFVCh2YWwpOworCisJCUhJRl9JTkZPX01FRCgiJXM6IGFtZGJnOiAleCBvdXQ6ICV4ICV4IiwgX19mdW5jX18sCisJCSAgICAgICBoaWZfcmVhZDMyX21iKG1lbSArIEdQSU9fQkFTRV9BRERSRVNTICsKKwkJCQkgICAgV0xBTl9ERUJVR19PVVRfT0ZGU0VUKSwgdmFsLAorCQkgICAgICAgaGlmX3JlYWQzMl9tYihtZW0gKyBHUElPX0JBU0VfQUREUkVTUyArCisJCQkJICAgIFdMQU5fREVCVUdfT1VUX09GRlNFVCkpOworCX0KKworCUFfVEFSR0VUX0FDQ0VTU19FTkQoc2NuKTsKK30KKworLyoKKyAqIEhhbmRsZXIgZm9yIGEgcGVyLWVuZ2luZSBpbnRlcnJ1cHQgb24gYSBQQVJUSUNVTEFSIENFLgorICogVGhpcyBpcyB1c2VkIGluIGNhc2VzIHdoZXJlIGVhY2ggQ0UgaGFzIGEgcHJpdmF0ZQorICogTVNJIGludGVycnVwdC4KKyAqLworc3RhdGljIGlycXJldHVybl90IGNlX3Blcl9lbmdpbmVfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpCit7CisJc3RydWN0IGhpZl9wY2lfc29mdGMgKnNjID0gKHN0cnVjdCBoaWZfcGNpX3NvZnRjICopYXJnOworCWludCBDRV9pZCA9IGlycSAtIE1TSV9BU1NJR05fQ0VfSU5JVElBTDsKKworCS8qCisJICogTk9URTogV2UgYXJlIGFibGUgdG8gZGVyaXZlIENFX2lkIGZyb20gaXJxIGJlY2F1c2Ugd2UKKwkgKiB1c2UgYSBvbmUtdG8tb25lIG1hcHBpbmcgZm9yIENFJ3MgMC4uNS4KKwkgKiBDRSdzIDYgJiA3IGRvIG5vdCB1c2UgaW50ZXJydXB0cyBhdCBhbGwuCisJICoKKwkgKiBUaGlzIG1hcHBpbmcgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgbWFwcGluZworCSAqIHVzZWQgYnkgZmlybXdhcmUuCisJICovCisKKwljZV9wZXJfZW5naW5lX3NlcnZpY2Uoc2MtPm9sX3NjLCBDRV9pZCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBDT05GSUdfU0xVQl9ERUJVR19PTgorCisvKiB3b3JrZXIgdGhyZWFkIHRvIHNjaGVkdWxlIHdsYW5fdGFza2xldCBpbiBTTFVCIGRlYnVnIGJ1aWxkICovCitzdGF0aWMgdm9pZCByZXNjaGVkdWxlX3Rhc2tsZXRfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqcmVjb3ZlcnkpCit7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCXN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYzsKKworCWlmIChOVUxMID09IHNjbikgeworCQlISUZfRVJST1IoIiVzOiB0YXNrbGV0IHNjbiBpcyBudWxsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJc2MgPSBzY24tPmhpZl9zYzsKKworCWlmIChzY24tPmhpZl9pbml0X2RvbmUgPT0gZmFsc2UpIHsKKwkJSElGX0VSUk9SKCIlczogd2xhbiBkcml2ZXIgaXMgdW5sb2FkZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl0YXNrbGV0X3NjaGVkdWxlKCZzYy0+aW50cl90cSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgREVDTEFSRV9XT1JLKHJlc2NoZWR1bGVfdGFza2xldF93b3JrLCByZXNjaGVkdWxlX3Rhc2tsZXRfd29ya19oYW5kbGVyKTsKKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHdsYW5fdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGhpZl9wY2lfc29mdGMgKnNjID0gKHN0cnVjdCBoaWZfcGNpX3NvZnRjICopZGF0YTsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IHNjLT5vbF9zYzsKKworCWlmIChzY24tPmhpZl9pbml0X2RvbmUgPT0gZmFsc2UpCisJCWdvdG8gZW5kOworCisJaWYgKGNkZl9hdG9taWNfcmVhZCgmc2NuLT5saW5rX3N1c3BlbmRlZCkpCisJCWdvdG8gZW5kOworCisJaWYgKCFJSEVMSVVNX0JVICYmICFBRFJBU1RFQV9CVSkgeworCQkoaXJxcmV0dXJuX3QpIGhpZl9md19pbnRlcnJ1cHRfaGFuZGxlcihzYy0+aXJxX2V2ZW50LCBzY24pOworCQlpZiAoc2MtPm9sX3NjLT50YXJnZXRfc3RhdHVzID09IE9MX1RSR0VUX1NUQVRVU19SRVNFVCkKKwkJCWdvdG8gZW5kOworCX0KKworZW5kOgorCWNkZl9hdG9taWNfc2V0KCZzY24tPnRhc2tsZXRfZnJvbV9pbnRyLCAwKTsKKwljZGZfYXRvbWljX2RlYygmc2NuLT5hY3RpdmVfdGFza2xldF9jbnQpOworfQorCisjZGVmaW5lIEFUSF9QQ0lfUFJPQkVfUkVUUllfTUFYIDMKKy8qKgorICogaGlmX2J1c19vcGVuKCk6IGhpZl9idXNfb3BlbgorICogQHNjbjogc2NuCisgKiBAYnVzX3R5cGU6IGJ1cyB0eXBlCisgKgorICogUmV0dXJuOiBuL2EKKyAqLworQ0RGX1NUQVRVUyBoaWZfYnVzX29wZW4oc3RydWN0IG9sX3NvZnRjICpvbF9zYywgZW51bSBhdGhfaGFsX2J1c190eXBlIGJ1c190eXBlKQoreworCXN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYzsKKworCXNjID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpzYykpOworCWlmICghc2MpIHsKKwkJSElGX0VSUk9SKCIlczogbm8gbWVtIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwlvbF9zYy0+aGlmX3NjID0gKHZvaWQgKilzYzsKKwlzYy0+b2xfc2MgPSBvbF9zYzsKKwlvbF9zYy0+YnVzX3R5cGUgPSBidXNfdHlwZTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogaGlmX2J1c19jbG9zZSgpOiBoaWZfYnVzX2Nsb3NlCisgKgorICogUmV0dXJuOiBuL2EKKyAqLwordm9pZCBoaWZfYnVzX2Nsb3NlKHN0cnVjdCBvbF9zb2Z0YyAqb2xfc2MpCit7CisJc3RydWN0IGhpZl9wY2lfc29mdGMgKnNjOworCisJaWYgKG9sX3NjID09IE5VTEwpIHsKKwkJSElGX0VSUk9SKCIlczogb2xfc29mdGMgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlzYyA9IG9sX3NjLT5oaWZfc2M7CisJaWYgKHNjID09IE5VTEwpCisJCXJldHVybjsKKwljZGZfbWVtX2ZyZWUoc2MpOworCW9sX3NjLT5oaWZfc2MgPSBOVUxMOworfQorCisjZGVmaW5lIEJBUl9OVU0gMAorCitpbnQgaGlmX2VuYWJsZV9wY2koc3RydWN0IGhpZl9wY2lfc29mdGMgKnNjLAorCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXZvaWQgX19pb21lbSAqbWVtOworCWludCByZXQgPSAwOworCXVpbnQxNl90IGRldmljZV9pZDsKKwlzdHJ1Y3Qgb2xfc29mdGMgKm9sX3NjID0gc2MtPm9sX3NjOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldixQQ0lfREVWSUNFX0lELCZkZXZpY2VfaWQpOworCWlmKGRldmljZV9pZCAhPSBpZC0+ZGV2aWNlKSAgeworCQlISUZfRVJST1IoCisJCSAgICIlczogZGV2IGlkIG1pc21hdGNoLCBjb25maWcgaWQgPSAweCV4LCBwcm9iaW5nIGlkID0gMHgleCIsCisJCSAgIF9fZnVuY19fLCBkZXZpY2VfaWQsIGlkLT5kZXZpY2UpOworCQkvKiBwY2kgbGluayBpcyBkb3duLCBzbyByZXR1cmluZyB3aXRoIGVycm9yIGNvZGUgKi8KKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogRklYTUU6IHRlbXAuIGNvbW1lbnRpbmcgb3V0IGFzc2lnbl9yZXNvdXJjZQorCSAqIGNhbGwgZm9yIGRldl9hdHRhY2ggdG8gd29yayBvbiAyLjYuMzgga2VybmVsCisJICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDAsIDApICYmIFwKKyAgICAhZGVmaW5lZChfX0xJTlVYX0FSTV9BUkNIX18pCisJaWYgKHBjaV9hc3NpZ25fcmVzb3VyY2UocGRldiwgQkFSX05VTSkpIHsKKwkJSElGX0VSUk9SKCIlczogcGNpX2Fzc2lnbl9yZXNvdXJjZSBlcnJvciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorI2VuZGlmCisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJSElGX0VSUk9SKCIlczogcGNpX2VuYWJsZV9kZXZpY2UgZXJyb3IiLAorCQkJICAgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBSZXF1ZXN0IE1NSU8gcmVzb3VyY2VzICovCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIEJBUl9OVU0sICJhdGgiKTsKKwlpZiAocmV0KSB7CisJCUhJRl9FUlJPUigiJXM6IFBDSSBNTUlPIHJlc2VydmF0aW9uIGVycm9yIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9yZWdpb247CisJfQorI2lmZGVmIENPTkZJR19BUk1fTFBBRQorCS8qIGlmIENPTkZJR19BUk1fTFBBRSBpcyBlbmFibGVkLCB3ZSBoYXZlIHRvIHNldCA2NCBiaXRzIG1hc2sKKwkgKiBmb3IgMzIgYml0cyBkZXZpY2UgYWxzby4gKi8KKwlyZXQgPSAgcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwlpZiAocmV0KSB7CisJCUhJRl9FUlJPUigiJXM6IENhbm5vdCBlbmFibGUgNjQtYml0IHBjaSBETUEiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2RtYTsKKwl9CisJcmV0ID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmIChyZXQpIHsKKwkJSElGX0VSUk9SKCIlczogQ2Fubm90IGVuYWJsZSA2NC1iaXQgRE1BIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9kbWE7CisJfQorI2Vsc2UKKwlyZXQgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpIHsKKwkJSElGX0VSUk9SKCIlczogQ2Fubm90IGVuYWJsZSAzMi1iaXQgcGNpIERNQSIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfZG1hOworCX0KKwlyZXQgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJaWYgKHJldCkgeworCQlISUZfRVJST1IoIiVzOiBDYW5ub3QgZW5hYmxlIDMyLWJpdCBjb25zaXN0ZW50IERNQSEiLAorCQkJICAgX19mdW5jX18pOworCQlnb3RvIGVycl9kbWE7CisJfQorI2VuZGlmCisKKwlQQ0lfQ0ZHX1RPX0RJU0FCTEVfTDFTU19TVEFURVMocGRldiwgMHgxODgpOworCisJLyogU2V0IGJ1cyBtYXN0ZXIgYml0IGluIFBDSV9DT01NQU5EIHRvIGVuYWJsZSBETUEgKi8KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIEFycmFuZ2UgZm9yIGFjY2VzcyB0byBUYXJnZXQgU29DIHJlZ2lzdGVycy4gKi8KKwltZW0gPSBwY2lfaW9tYXAocGRldiwgQkFSX05VTSwgMCk7CisJaWYgKCFtZW0pIHsKKwkJSElGX0VSUk9SKCIlczogUENJIGlvbWFwIGVycm9yIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9pb21hcDsKKwl9CisJc2MtPm1lbSA9IG1lbTsKKwlzYy0+cGRldiA9IHBkZXY7CisJc2MtPmRldiA9ICZwZGV2LT5kZXY7CisJb2xfc2MtPmFwc19vc2Rldi5iZGV2ID0gcGRldjsKKwlvbF9zYy0+YXBzX29zZGV2LmRldmljZSA9ICZwZGV2LT5kZXY7CisJb2xfc2MtPmFwc19vc2Rldi5iYy5iY19oYW5kbGUgPSAodm9pZCAqKW1lbTsKKwlvbF9zYy0+YXBzX29zZGV2LmJjLmJjX2J1c3R5cGUgPSBIQUxfQlVTX1RZUEVfUENJOworCXNjLT5kZXZpZCA9IGlkLT5kZXZpY2U7CisJc2MtPmNhY2hlbGluZV9zeiA9IGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KCk7CisJLyogR2V0IFJBTSBkdW1wIG1lbW9yeSBhZGRyZXNzIGFuZCBzaXplICovCisJR0VUX1ZJUlRfUkFNRFVNUF9NRU0ob2xfc2MpOworCW9sX3NjLT5tZW0gPSBtZW07CisJc2MtPnBjaV9lbmFibGVkID0gdHJ1ZTsKKwlyZXR1cm4gcmV0OworCitlcnJfaW9tYXA6CisJcGNpX2NsZWFyX21hc3RlcihwZGV2KTsKK2Vycl9kbWE6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIEJBUl9OVU0pOworZXJyX3JlZ2lvbjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBoaWZfZGlzYWJsZV9wY2koc3RydWN0IGhpZl9wY2lfc29mdGMgKnNjKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqb2xfc2M7CisKKwlpZiAoIXNjKQorCQlyZXR1cm47CisKKwlvbF9zYyA9IHNjLT5vbF9zYzsKKwlpZiAob2xfc2MgPT0gTlVMTCkgeworCQlISUZfRVJST1IoIiVzOiBvbF9zYyA9IE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJcGNpX3NldF9kcnZkYXRhKHNjLT5wZGV2LCBOVUxMKTsKKwloaWZfcGNpX2RldmljZV9yZXNldChzYyk7CisJcGNpX2lvdW5tYXAoc2MtPnBkZXYsIHNjLT5tZW0pOworCXNjLT5tZW0gPSBOVUxMOworCW9sX3NjLT5tZW0gPSBOVUxMOworCXBjaV9jbGVhcl9tYXN0ZXIoc2MtPnBkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbihzYy0+cGRldiwgQkFSX05VTSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHNjLT5wZGV2KTsKK30KKworaW50IGhpZl9wY2lfcHJvYmVfdGd0X3dha2V1cChzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqc2MpCit7CisJaW50IHJldCA9IDA7CisJaW50IHRhcmdfYXdha2VfbGltaXQgPSA1MDA7CisjaWZuZGVmIFFDQV9XSUZJXzNfMAorCXVpbnQzMl90IGZ3X2luZGljYXRvcjsKKyNlbmRpZgorCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gc2MtPm9sX3NjOworCS8qCisJICogVmVyaWZ5IHRoYXQgdGhlIFRhcmdldCB3YXMgc3RhcnRlZCBjbGVhbmx5LioKKwkgKiBUaGUgY2FzZSB3aGVyZSB0aGlzIGlzIG1vc3QgbGlrZWx5IGlzIHdpdGggYW4gQVVYLXBvd2VyZWQKKwkgKiBUYXJnZXQgYW5kIGEgSG9zdCBpbiBXb1cgbW9kZS4gSWYgdGhlIEhvc3QgY3Jhc2hlcywKKwkgKiBsb3NlcyBwb3dlciwgb3IgaXMgcmVzdGFydGVkICh3aXRob3V0IHVubG9hZGluZyB0aGUgZHJpdmVyKQorCSAqIHRoZW4gdGhlIFRhcmdldCBpcyBsZWZ0IChhdXgpIHBvd2VyZWQgYW5kIHJ1bm5pbmcuICBPbiBhCisJICogc3Vic2VxdWVudCBkcml2ZXIgbG9hZCwgdGhlIFRhcmdldCBpcyBpbiBhbiB1bmV4cGVjdGVkIHN0YXRlLgorCSAqIFdlIHRyeSB0byBjYXRjaCB0aGF0IGhlcmUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIFRhcmdldCBhbmQKKwkgKiByZXRyeSB0aGUgcHJvYmUuCisJICovCisJaGlmX3dyaXRlMzJfbWIoc2MtPm1lbSArIFBDSUVfTE9DQUxfQkFTRV9BRERSRVNTICsKKwkJCQkgIFBDSUVfU09DX1dBS0VfQUREUkVTUywgUENJRV9TT0NfV0FLRV9WX01BU0spOworCXdoaWxlICghaGlmX3RhcmdfaXNfYXdha2Uoc2NuLCBzYy0+bWVtKSkgeworCQlpZiAoMCA9PSB0YXJnX2F3YWtlX2xpbWl0KSB7CisJCQlISUZfRVJST1IoIiVzOiB0YXJnZXQgYXdha2UgdGltZW91dCIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIGVuZDsKKwkJfQorCQljZGZfbWRlbGF5KDEpOworCQl0YXJnX2F3YWtlX2xpbWl0LS07CisJfQorCisjaWYgUENJRV9CQVIwX1JFQURZX0NIRUNLSU5HCisJeworCQlpbnQgd2FpdF9saW1pdCA9IDIwMDsKKwkJLyogU3luY2hyb25pemF0aW9uIHBvaW50OiB3YWl0IHRoZSBCQVIwIGlzIGNvbmZpZ3VyZWQgKi8KKwkJd2hpbGUgKHdhaXRfbGltaXQtLSAmJgorCQkJICAgIShoaWZfcmVhZDMyX21iKHNjLT5tZW0gKworCQkJCQkgIFBDSUVfTE9DQUxfQkFTRV9BRERSRVNTICsKKwkJCQkJICBQQ0lFX1NPQ19SRFlfU1RBVFVTX0FERFJFU1MpIFwKKwkJCQkJICAmIFBDSUVfU09DX1JEWV9TVEFUVVNfQkFSX01BU0spKSB7CisJCQljZGZfbWRlbGF5KDEwKTsKKwkJfQorCQlpZiAod2FpdF9saW1pdCA8IDApIHsKKwkJCS8qIEFSNjMyMHYxIGRvZXNuJ3Qgc3VwcG9ydCBjaGVja2luZyBvZiBCQVIwIGNvbmZpZ3VyYXRpb24sCisJCQkJIHRha2VzIG9uZSBzZWMgdG8gd2FpdCBCQVIwIHJlYWR5ICovCisJCQlISUZfSU5GT19NRUQoIiVzOiBBUjYzMjB2MSB3YWl0cyB0d28gc2VjIGZvciBCQVIwIiwKKwkJCQkgICAgX19mdW5jX18pOworCQl9CisgICAgfQorI2VuZGlmCisKKyNpZm5kZWYgUUNBX1dJRklfM18wCisJZndfaW5kaWNhdG9yID0gaGlmX3JlYWQzMl9tYihzYy0+bWVtICsgRldfSU5ESUNBVE9SX0FERFJFU1MpOworCWhpZl93cml0ZTMyX21iKHNjLT5tZW0gKyBQQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUyArCisJCQkJICBQQ0lFX1NPQ19XQUtFX0FERFJFU1MsIFBDSUVfU09DX1dBS0VfUkVTRVQpOworCisJaWYgKGZ3X2luZGljYXRvciAmIEZXX0lORF9JTklUSUFMSVpFRCkgeworCQlISUZfRVJST1IoIiVzOiBUYXJnZXQgaXMgaW4gYW4gdW5rbm93biBzdGF0ZS4gRUFHQUlOIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBlbmQ7CisJfQorI2VuZGlmCisKK2VuZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3bGFuX3Rhc2tsZXRfbXNpKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaGlmX3Rhc2tsZXRfZW50cnkgKmVudHJ5ID0gKHN0cnVjdCBoaWZfdGFza2xldF9lbnRyeSAqKWRhdGE7CisJc3RydWN0IGhpZl9wY2lfc29mdGMgKnNjID0gKHN0cnVjdCBoaWZfcGNpX3NvZnRjICopIGVudHJ5LT5oaWZfaGFuZGxlcjsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IHNjLT5vbF9zYzsKKworCWlmIChzYy0+b2xfc2MtPmhpZl9pbml0X2RvbmUgPT0gZmFsc2UpCisJCWdvdG8gaXJxX2hhbmRsZWQ7CisKKwlpZiAoY2RmX2F0b21pY19yZWFkKCZzYy0+b2xfc2MtPmxpbmtfc3VzcGVuZGVkKSkKKwkJZ290byBpcnFfaGFuZGxlZDsKKworCWNkZl9hdG9taWNfaW5jKCZzY24tPmFjdGl2ZV90YXNrbGV0X2NudCk7CisKKwlpZiAoZW50cnktPmlkID09IEhJRl9NQVhfVEFTS0xFVF9OVU0pIHsKKwkJLyogdGhlIGxhc3QgdGFza2xldCBpcyBmb3IgZncgSVJRICovCisJCShpcnFyZXR1cm5fdCloaWZfZndfaW50ZXJydXB0X2hhbmRsZXIoc2MtPmlycV9ldmVudCwgc2MtPm9sX3NjKTsKKwkJaWYgKHNjLT5vbF9zYy0+dGFyZ2V0X3N0YXR1cyA9PSBPTF9UUkdFVF9TVEFUVVNfUkVTRVQpCisJCQlnb3RvIGlycV9oYW5kbGVkOworCX0gZWxzZSBpZiAoZW50cnktPmlkIDwgc2MtPm9sX3NjLT5jZV9jb3VudCkgeworCQljZV9wZXJfZW5naW5lX3NlcnZpY2Uoc2MtPm9sX3NjLCBlbnRyeS0+aWQpOworCX0gZWxzZSB7CisJCUhJRl9FUlJPUigiJXM6IEVSUk9SIC0gaW52YWxpZCBDRV9pZCA9ICVkIiwKKwkJICAgICAgIF9fZnVuY19fLCBlbnRyeS0+aWQpOworCX0KKwlyZXR1cm47CisKK2lycV9oYW5kbGVkOgorCWNkZl9hdG9taWNfZGVjKCZzY24tPmFjdGl2ZV90YXNrbGV0X2NudCk7CisKK30KKworaW50IGhpZl9jb25maWd1cmVfbXNpKHN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbnVtX21zaV9kZXNpcmVkOworCWludCBydiA9IC0xOworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gc2MtPm9sX3NjOworCisJSElGX1RSQUNFKCIlczogRSIsIF9fZnVuY19fKTsKKworCW51bV9tc2lfZGVzaXJlZCA9IE1TSV9OVU1fUkVRVUVTVDsgLyogTXVsdGlwbGUgTVNJICovCisJaWYgKG51bV9tc2lfZGVzaXJlZCA8IDEpIHsKKwkJSElGX0VSUk9SKCIlczogTVNJIGlzIG5vdCBjb25maWd1cmVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobnVtX21zaV9kZXNpcmVkID4gMSkgeworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTYsIDApKQorCQlydiA9IHBjaV9lbmFibGVfbXNpX3JhbmdlKHNjLT5wZGV2LCBudW1fbXNpX2Rlc2lyZWQsCisJCQkJCQludW1fbXNpX2Rlc2lyZWQpOworI2Vsc2UKKwkJcnYgPSBwY2lfZW5hYmxlX21zaV9ibG9jayhzYy0+cGRldiwgbnVtX21zaV9kZXNpcmVkKTsKKyNlbmRpZgorCX0KKwlISUZfVFJBQ0UoIiVzOiBudW1fbXNpX2Rlc2lyZWQgPSAlZCwgYXZhaWxhYmxlX21zaSA9ICVkIiwKKwkJICBfX2Z1bmNfXywgbnVtX21zaV9kZXNpcmVkLCBydik7CisKKwlpZiAocnYgPT0gMCB8fCBydiA+PSBISUZfTUFYX1RBU0tMRVRfTlVNKSB7CisJCWludCBpOworCisJCXNjLT5udW1fbXNpX2ludHJzID0gSElGX01BWF9UQVNLTEVUX05VTTsKKwkJc2MtPnRhc2tsZXRfZW50cmllc1tISUZfTUFYX1RBU0tMRVRfTlVNIC0xXS5oaWZfaGFuZGxlciA9CisJCQkodm9pZCAqKXNjOworCQlzYy0+dGFza2xldF9lbnRyaWVzW0hJRl9NQVhfVEFTS0xFVF9OVU0gLTFdLmlkID0KKwkJCUhJRl9NQVhfVEFTS0xFVF9OVU07CisJCXRhc2tsZXRfaW5pdCgmc2MtPmludHJfdHEsIHdsYW5fdGFza2xldF9tc2ksCisJCQkgKHVuc2lnbmVkIGxvbmcpJnNjLT50YXNrbGV0X2VudHJpZXNbCisJCQkgSElGX01BWF9UQVNLTEVUX05VTSAtMV0pOworCQlyZXQgPSByZXF1ZXN0X2lycShzYy0+cGRldi0+aXJxICsgTVNJX0FTU0lHTl9GVywKKwkJCQkgIGhpZl9wY2lfbXNpX2Z3X2hhbmRsZXIsCisJCQkJICBJUlFGX1NIQVJFRCwgIndsYW5fcGNpIiwgc2MpOworCQlpZihyZXQpIHsKKwkJCUhJRl9FUlJPUigiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX2ludHI7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8PSBzY24tPmNlX2NvdW50OyBpKyspIHsKKwkJCXNjLT50YXNrbGV0X2VudHJpZXNbaV0uaGlmX2hhbmRsZXIgPSAodm9pZCAqKXNjOworCQkJc2MtPnRhc2tsZXRfZW50cmllc1tpXS5pZCA9IGk7CisJCQl0YXNrbGV0X2luaXQoJnNjLT5pbnRyX3RxLCB3bGFuX3Rhc2tsZXRfbXNpLAorCQkJCSAodW5zaWduZWQgbG9uZykmc2MtPnRhc2tsZXRfZW50cmllc1tpXSk7CisJCQlyZXQgPSByZXF1ZXN0X2lycSgoc2MtPnBkZXYtPmlycSArCisJCQkJCSAgIGkgKyBNU0lfQVNTSUdOX0NFX0lOSVRJQUwpLAorCQkJCQkgIGNlX3Blcl9lbmdpbmVfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkJCSAgIndsYW5fcGNpIiwgc2MpOworCQkJaWYocmV0KSB7CisJCQkJSElGX0VSUk9SKCIlczogcmVxdWVzdF9pcnEgZmFpbGVkIiwgX19mdW5jX18pOworCQkJCWdvdG8gZXJyX2ludHI7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHJ2ID4gMCkgeworCQlISUZfVFJBQ0UoIiVzOiB1c2Ugc2luZ2xlIG1zaSIsIF9fZnVuY19fKTsKKworCQlpZiAoKHJldCA9IHBjaV9lbmFibGVfbXNpKHNjLT5wZGV2KSkgPCAwKSB7CisJCQlISUZfRVJST1IoIiVzOiBzaW5nbGUgTVNJIGFsbG9jYXRpb24gZmFpbGVkIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCS8qIFRyeSBmb3IgbGVnYWN5IFBDSSBsaW5lIGludGVycnVwdHMgKi8KKwkJCXNjLT5udW1fbXNpX2ludHJzID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNjLT5udW1fbXNpX2ludHJzID0gMTsKKwkJCXRhc2tsZXRfaW5pdCgmc2MtPmludHJfdHEsCisJCQkJd2xhbl90YXNrbGV0LCAodW5zaWduZWQgbG9uZylzYyk7CisJCQlyZXQgPSByZXF1ZXN0X2lycShzYy0+cGRldi0+aXJxLAorCQkJCQkgIGhpZl9wY2lfaW50ZXJydXB0X2hhbmRsZXIsCisJCQkJCSAgSVJRRl9TSEFSRUQsICJ3bGFuX3BjaSIsIHNjKTsKKwkJCWlmKHJldCkgeworCQkJCUhJRl9FUlJPUigiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJCQlnb3RvIGVycl9pbnRyOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc2MtPm51bV9tc2lfaW50cnMgPSAwOworCQlyZXQgPSAtRUlPOworCQlISUZfRVJST1IoIiVzOiBkbyBub3Qgc3VwcG9ydCBNU0ksIHJ2ID0gJWQiLCBfX2Z1bmNfXywgcnYpOworCX0KKwlpZiAoKHJldCA9IHBjaV9lbmFibGVfbXNpKHNjLT5wZGV2KSkgPCAwKSB7CisJCUhJRl9FUlJPUigiJXM6IHNpbmdsZSBNU0kgaW50ZXJydXB0IGFsbG9jYXRpb24gZmFpbGVkIiwKKwkJCSAgX19mdW5jX18pOworCQkvKiBUcnkgZm9yIGxlZ2FjeSBQQ0kgbGluZSBpbnRlcnJ1cHRzICovCisJCXNjLT5udW1fbXNpX2ludHJzID0gMDsKKwl9IGVsc2UgeworCQlzYy0+bnVtX21zaV9pbnRycyA9IDE7CisJCXRhc2tsZXRfaW5pdCgmc2MtPmludHJfdHEsIHdsYW5fdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpc2MpOworCQlyZXQgPSByZXF1ZXN0X2lycShzYy0+cGRldi0+aXJxLAorCQkJCSAgaGlmX3BjaV9pbnRlcnJ1cHRfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkJICAid2xhbl9wY2kiLCBzYyk7CisJCWlmKHJldCkgeworCQkJSElGX0VSUk9SKCIlczogcmVxdWVzdF9pcnEgZmFpbGVkIiwgX19mdW5jX18pOworCQkJZ290byBlcnJfaW50cjsKKwkJfQorCX0KKworCWlmIChyZXQgPT0gMCkgeworCQloaWZfd3JpdGUzMl9tYihzYy0+bWVtKyhTT0NfQ09SRV9CQVNFX0FERFJFU1MgfAorCQkJICBQQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MpLAorCQkJICBIT1NUX0dST1VQMF9NQVNLKTsKKwkJaGlmX3dyaXRlMzJfbWIoc2MtPm1lbSArCisJCQkgIFBDSUVfTE9DQUxfQkFTRV9BRERSRVNTICsgUENJRV9TT0NfV0FLRV9BRERSRVNTLAorCQkJICBQQ0lFX1NPQ19XQUtFX1JFU0VUKTsKKwl9CisJSElGX1RSQUNFKCIlczogWCwgcmV0ID0gJWQiLCBfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7CisKK2Vycl9pbnRyOgoraWYgKHNjLT5udW1fbXNpX2ludHJzID49IDEpCisJCXBjaV9kaXNhYmxlX21zaShzYy0+cGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoaWZfcGNpX2NvbmZpZ3VyZV9sZWdhY3lfaXJxKHN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IHNjLT5vbF9zYzsKKworCUhJRl9UUkFDRSgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKwkvKiBkbyBub3RuIHN1cHBvcnQgTVNJIG9yIE1TSSBJUlEgZmFpbGVkICovCisJdGFza2xldF9pbml0KCZzYy0+aW50cl90cSwgd2xhbl90YXNrbGV0LCAodW5zaWduZWQgbG9uZylzYyk7CisJcmV0ID0gcmVxdWVzdF9pcnEoc2MtPnBkZXYtPmlycSwKKwkJCSAgaGlmX3BjaV9pbnRlcnJ1cHRfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkgICJ3bGFuX3BjaSIsIHNjKTsKKwlpZihyZXQpIHsKKwkJSElGX0VSUk9SKCIlczogcmVxdWVzdF9pcnEgZmFpbGVkLCByZXQgPSAlZCIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGVuZDsKKwl9CisJLyogVXNlIExlZ2FjeSBQQ0kgSW50ZXJydXB0cyAqLworCWhpZl93cml0ZTMyX21iKHNjLT5tZW0rKFNPQ19DT1JFX0JBU0VfQUREUkVTUyB8CisJCSAgUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTKSwKKwkJICBIT1NUX0dST1VQMF9NQVNLKTsKKwloaWZfd3JpdGUzMl9tYihzYy0+bWVtICsgUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgKworCQkgICAgICBQQ0lFX1NPQ19XQUtFX0FERFJFU1MsCisJCSAgUENJRV9TT0NfV0FLRV9SRVNFVCk7CitlbmQ6CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSElGLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogWCwgcmV0ID0gJWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGhpZl9ub2ludHJzKCk6IGRpc2FibGUgSVJRCisgKgorICogVGhpcyBmdW5jdGlvbiBzdG9wcyBpbnRlcnJ1cHQocykKKyAqCisgKiBAc2NuOiBzdHJ1Y3Qgb2xfc29mdGMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoaWZfbm9pbnRycyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqc2MgPSBzY24tPmhpZl9zYzsKKworCWlmIChzY24tPnJlcXVlc3RfaXJxX2RvbmUgPT0gZmFsc2UpCisJCXJldHVybjsKKwlpZiAoc2MtPm51bV9tc2lfaW50cnMgPiAwKSB7CisJCS8qIE1TSSBpbnRlcnJ1cHQocykgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNjLT5udW1fbXNpX2ludHJzOyBpKyspIHsKKwkJCWZyZWVfaXJxKHNjLT5wZGV2LT5pcnEgKyBpLCBzYyk7CisJCX0KKwkJc2MtPm51bV9tc2lfaW50cnMgPSAwOworCX0gZWxzZSB7CisJCS8qIExlZ2FjeSBQQ0kgbGluZSBpbnRlcnJ1cHQgKi8KKwkJZnJlZV9pcnEoc2MtPnBkZXYtPmlycSwgc2MpOworCX0KKwljZV91bnJlZ2lzdGVyX2lycShzY24tPmhpZl9oZGwsIDB4ZmZmKTsKKwlzY24tPnJlcXVlc3RfaXJxX2RvbmUgPSBmYWxzZTsKK30KKworLyoqCisgKiBoaWZfZGlzYWJsZV9idXMoKTogaGlmX2Rpc2FibGVfYnVzCisgKgorICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB0aGUgYnVzCisgKgorICogQGJkZXY6IGJ1cyBkZXYKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoaWZfZGlzYWJsZV9idXModm9pZCAqYmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGJkZXY7CisJc3RydWN0IGhpZl9wY2lfc29mdGMgKnNjID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuOworCXZvaWQgX19pb21lbSAqbWVtOworCisJLyogQXR0YWNoIGRpZCBub3Qgc3VjY2VlZCwgYWxsIHJlc291cmNlcyBoYXZlIGJlZW4KKwkgKiBmcmVlZCBpbiBlcnJvciBoYW5kbGVyCisJICovCisJaWYgKCFzYykKKwkJcmV0dXJuOworCisJc2NuID0gc2MtPm9sX3NjOworCisJaWYgKEFEUkFTVEVBX0JVKSB7CisJCWhpZl93cml0ZTMyX21iKHNjLT5tZW0gKyBQQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MsIDApOworCQloaWZfd3JpdGUzMl9tYihzYy0+bWVtICsgUENJRV9JTlRSX0NMUl9BRERSRVNTLAorCQkJICAgICAgIEhPU1RfR1JPVVAwX01BU0spOworCX0KKworCW1lbSA9ICh2b2lkIF9faW9tZW0gKilzYy0+bWVtOworCWlmIChtZW0pIHsKKwkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCQloaWZfZHVtcF9waXBlX2RlYnVnX2NvdW50KHNjbik7CisJCWhpZl9kZWluaXRfY2RmX2N0eChzY24pOworCQlpZiAoc2NuLT5hdGhkaWFnX3Byb2Nmc19pbml0ZWQpIHsKKwkJCWF0aGRpYWdfcHJvY2ZzX3JlbW92ZSgpOworCQkJc2NuLT5hdGhkaWFnX3Byb2Nmc19pbml0ZWQgPSBmYWxzZTsKKwkJfQorCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJCXBjaV9pb3VubWFwKHBkZXYsIG1lbSk7CisJCXNjbi0+bWVtID0gTlVMTDsKKwkJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIEJBUl9OVU0pOworCQlwY2lfY2xlYXJfbWFzdGVyKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJfQorCUhJRl9JTkZPKCIlczogWCIsIF9fZnVuY19fKTsKK30KKworI2RlZmluZSBPTF9BVEhfUENJX1BNX0NPTlRST0wgMHg0NAorCisjaWZkZWYgQ09ORklHX0NOU1MKKy8qKgorICogaGlmX2J1c19wcmV2ZW50X2xpbmtkb3duKCk6IGFsbG93IG9yIHBlcm1pdCBsaW5rZG93bgorICogQGZsYWc6IHRydWUgcHJldmVudHMgbGlua2Rvd24sIGZhbHNlIGFsbG93cworICoKKyAqIENhbGxzIGludG8gdGhlIHBsYXRmb3JtIGRyaXZlciB0byB2b3RlIGFnYWluc3QgdGFraW5nIGRvd24gdGhlCisgKiBwY2llIGxpbmsuCisgKgorICogUmV0dXJuOiBuL2EKKyAqLwordm9pZCBoaWZfYnVzX3ByZXZlbnRfbGlua2Rvd24oYm9vbCBmbGFnKQoreworCUhJRl9FUlJPUigid2xhbjogJXMgcGNpZSBwb3dlciBjb2xsYXBzZSIsCisJCQkoZmxhZyA/ICJkaXNhYmxlIiA6ICJlbmFibGUiKSk7CisJY25zc193bGFuX3BtX2NvbnRyb2woZmxhZyk7Cit9CisjZW5kaWYKKworLyoqCisgKiBoaWZfZHJhaW5fdGFza2xldHMoKTogd2FpdCB1bnRpbGwgbm8gdGFza2xldCBpcyBwZW5kaW5nCisgKiBAc2NuOiBoaWYgY29udGV4dAorICoKKyAqIExldCBydW5uaW5nIHRhc2tsZXRzIGNsZWFyIHBlbmRpbmcgdHJhZmljLgorICoKKyAqIFJldHVybjogMCBpZiBubyBib3R0b20gaGFsZiBpcyBpbiBwcm9ncmVzcyB3aGVuIGl0IHJldHVybnMuCisgKiAgIC1FRkFVTFQgaWYgaXQgdGltZXMgb3V0LgorICovCitzdGF0aWMgaW5saW5lIGludCBoaWZfZHJhaW5fdGFza2xldHMoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJdWludDMyX3QgY2VfZHJhaW5fd2FpdF9jbnQgPSAwOworCisJd2hpbGUgKGNkZl9hdG9taWNfcmVhZCgmc2NuLT5hY3RpdmVfdGFza2xldF9jbnQpKSB7CisJCWlmICgrK2NlX2RyYWluX3dhaXRfY250ID4gSElGX0NFX0RSQUlOX1dBSVRfQ05UKSB7CisJCQlISUZfRVJST1IoIiVzOiBDRSBzdGlsbCBub3QgZG9uZSB3aXRoIGFjY2VzcyIsCisJCQkgICAgICAgX19mdW5jX18pOworCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlISUZfSU5GTygiJXM6IFdhaXRpbmcgZm9yIENFIHRvIGZpbmlzaCBhY2Nlc3MiLCBfX2Z1bmNfXyk7CisJCW1zbGVlcCgxMCk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGhpZl9idXNfc3VzcGVuZF9saW5rX3VwKCkgLSBzdXNwZW5kIHRoZSBidXMKKyAqCisgKiBDb25maWd1cmVzIHRoZSBwY2kgaXJxIGxpbmUgYXMgYSB3YWtldXAgc291cmNlLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBhbmQgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoaWZfYnVzX3N1c3BlbmRfbGlua191cCh2b2lkKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlpbnQgc3RhdHVzOworCisJaWYgKCFzY24pCisJCXJldHVybiAtRUZBVUxUOworCisJcGRldiA9IHNjbi0+YXBzX29zZGV2LmJkZXY7CisKKwlzdGF0dXMgPSBoaWZfZHJhaW5fdGFza2xldHMoc2NuKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAodW5saWtlbHkoZW5hYmxlX2lycV93YWtlKHBkZXYtPmlycSkpKSB7CisJCUhJRl9FUlJPUigiJXM6IEZhaWwgdG8gZW5hYmxlIHdha2UgSVJRISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGlmX2J1c19yZXN1bWVfbGlua191cCgpIC0gaGlmIGJ1cyByZXN1bWUgQVBJCisgKgorICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB0aGUgd2FrZXVwIHNvdXJjZS4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MgYW5kIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgaGlmX2J1c19yZXN1bWVfbGlua191cCh2b2lkKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCWlmICghc2NuKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXBkZXYgPSBzY24tPmFwc19vc2Rldi5iZGV2OworCWlmICghcGRldikgeworCQlISUZfRVJST1IoIiVzOiBwY2lfZGV2IGlzIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICh1bmxpa2VseShkaXNhYmxlX2lycV93YWtlKHBkZXYtPmlycSkpKSB7CisJCUhJRl9FUlJPUigiJXM6IEZhaWwgdG8gZGlzYWJsZSB3YWtlIElSUSEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGhpZl9idXNfc3VzcGVuZF9saW5rX2Rvd24oKSAtIHN1c3BlbmQgdGhlIGJ1cworICoKKyAqIFN1c3BlbmRzIHRoZSBoaWYgbGF5ZXIgdGFraW5nIGNhcmUgb2YgZHJhaW5pbmcgcmVjaWV2ZSBxdWV1ZXMgYW5kCisgKiBzaHV0dGluZyBkb3duIGNvcHkgZW5naW5lcyBpZiBuZWVkZWQuIEVuc3VyZXMgb3B5IGVuZ2luZSBpbnRlcnJ1cHRzCisgKiBhcmUgZGlzYWJsZWQgd2hlbiBpdCByZXR1cm5zLiAgUHJldmVudHMgcmVnaXN0ZXIgYWNjZXNzIGFmdGVyIGl0CisgKiByZXR1cm5zLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBhbmQgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoaWZfYnVzX3N1c3BlbmRfbGlua19kb3duKHZvaWQpCit7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICghc2NuKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXBkZXYgPSBzY24tPmFwc19vc2Rldi5iZGV2OworCisJaGlmX3N0YXRlID0gKHN0cnVjdCBISUZfQ0Vfc3RhdGUgKilzY24tPmhpZl9oZGw7CisJaWYgKCFoaWZfc3RhdGUpIHsKKwkJSElGX0VSUk9SKCIlczogaGlmX3N0YXRlIGlzIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWRpc2FibGVfaXJxKHBkZXYtPmlycSk7CisKKwlzdGF0dXMgPSBoaWZfZHJhaW5fdGFza2xldHMoc2NuKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZW5hYmxlX2lycShwZGV2LT5pcnEpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIFN0b3AgdGhlIEhJRiBTbGVlcCBUaW1lciAqLworCWhpZl9jYW5jZWxfZGVmZXJyZWRfdGFyZ2V0X3NsZWVwKHNjbik7CisKKwljZGZfYXRvbWljX3NldCgmc2NuLT5saW5rX3N1c3BlbmRlZCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoaWZfYnVzX3Jlc3VtZV9saW5rX2Rvd24oKSAtIGhpZiBidXMgcmVzdW1lIEFQSQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzdW1lcyB0aGUgYnVzIHJlZW5hYmxpbmcgaW50ZXJ1cHRzLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBhbmQgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBoaWZfYnVzX3Jlc3VtZV9saW5rX2Rvd24odm9pZCkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwlpZiAoIXNjbikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlwZGV2ID0gc2NuLT5hcHNfb3NkZXYuYmRldjsKKwlpZiAoIXBkZXYpIHsKKwkJSElGX0VSUk9SKCIlczogcGNpX2RldiBpcyBudWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwljZGZfYXRvbWljX3NldCgmc2NuLT5saW5rX3N1c3BlbmRlZCwgMCk7CisKKwllbmFibGVfaXJxKHBkZXYtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoaWZfYnVzX3N1c3BlbmQoKTogcHJlcGFyZSBoaWYgZm9yIHN1c3BlbmQKKyAqIGNob3NlIHN1c3BlbmQgdHlwZSBiYXNlZCBvbiBsaW5rIHN1c3BlbmQgdm90aW5nLgorICoKKyAqIFJldHVybjogbGludXggc3RhdHVzCisgKi8KK2ludCBoaWZfYnVzX3N1c3BlbmQodm9pZCkKK3sKKwlpZiAoaGlmX2Nhbl9zdXNwZW5kX2xpbmsoKSkKKwkJcmV0dXJuIGhpZl9idXNfc3VzcGVuZF9saW5rX2Rvd24oKTsKKwllbHNlCisJCXJldHVybiBoaWZfYnVzX3N1c3BlbmRfbGlua191cCgpOworfQorCisvKioKKyAqIGhpZl9idXNfc3VzcGVuZCgpOiBwcmVwYXJlIGhpZiBmb3Igc3VzcGVuZAorICogY2hvc2Ugc3VzcGVuZCB0eXBlIGJhc2VkIG9uIGxpbmsgc3VzcGVuZCB2b3RpbmcuCisgKgorICogUmV0dXJuOiBsaW51eCBzdGF0dXMKKyAqLworaW50IGhpZl9idXNfcmVzdW1lKHZvaWQpCit7CisJaWYgKGhpZl9jYW5fc3VzcGVuZF9saW5rKCkpCisJCXJldHVybiBoaWZfYnVzX3Jlc3VtZV9saW5rX2Rvd24oKTsKKwllbHNlCisJCXJldHVybiBoaWZfYnVzX3Jlc3VtZV9saW5rX3VwKCk7Cit9CisKK3ZvaWQgaGlmX2Rpc2FibGVfaXNyKHZvaWQgKm9sX3NjKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gKHN0cnVjdCBvbF9zb2Z0YyAqKW9sX3NjOworCXN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYyA9IHNjbi0+aGlmX3NjOworCisJaGlmX25vaW50cnMob2xfc2MpOworI2lmIENPTkZJR19QQ0lFXzY0QklUX01TSQorCU9TX0ZSRUVfQ09OU0lTVEVOVCgmc2NuLT5hcHNfb3NkZXYsIDQsCisJCQkgICBzY24tPm1zaV9tYWdpYywgc2NuLT5tc2lfbWFnaWNfZG1hLAorCQkJICAgT1NfR0VUX0RNQV9NRU1fQ09OVEVYVChzY24sIE1TSV9kbWFjb250ZXh0KSk7CisJc2NuLT5tc2lfbWFnaWMgPSBOVUxMOworCXNjbi0+bXNpX21hZ2ljX2RtYSA9IDA7CisjZW5kaWYKKwkvKiBDYW5jZWwgdGhlIHBlbmRpbmcgdGFza2xldCAqLworCWNlX3Rhc2tsZXRfa2lsbChzY24tPmhpZl9oZGwpOworCXRhc2tsZXRfa2lsbCgmc2MtPmludHJfdHEpOworCWNkZl9hdG9taWNfc2V0KCZzY24tPmFjdGl2ZV90YXNrbGV0X2NudCwgMCk7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHJlc2V0IFNvQyAqLwordm9pZCBoaWZfcmVzZXRfc29jKHZvaWQgKm9sX3NjKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gKHN0cnVjdCBvbF9zb2Z0YyAqKW9sX3NjOworCXN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYyA9IHNjbi0+aGlmX3NjOworCisjaWYgZGVmaW5lZChDUFVfV0FSTV9SRVNFVF9XQVIpCisJLyogQ3VycmVudGx5IENQVSB3YXJtIHJlc2V0IHNlcXVlbmNlIGlzIHRlc3RlZCBvbmx5IGZvciBBUjk4ODhfUkVWMgorCSAqIE5lZWQgdG8gZW5hYmxlIGZvciBBUjk4ODhfUkVWMSBvbmNlIENQVSB3YXJtIHJlc2V0IHNlcXVlbmNlIGlzCisJICogdmVyaWZpZWQgZm9yIEFSOTg4OF9SRVYxCisJICovCisJaWYgKHNjbi0+dGFyZ2V0X3ZlcnNpb24gPT0gQVI5ODg4X1JFVjJfVkVSU0lPTikgeworCQloaWZfcGNpX2RldmljZV93YXJtX3Jlc2V0KHNjKTsKKwl9IGVsc2UgeworCQloaWZfcGNpX2RldmljZV9yZXNldChzYyk7CisJfQorI2Vsc2UKKwloaWZfcGNpX2RldmljZV9yZXNldChzYyk7CisjZW5kaWYKK30KKwordm9pZCBoaWZfZGlzYWJsZV9hc3BtKHZvaWQpCit7CisJc3RydWN0IG9sX3NvZnRjICpzY24gPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCXN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYzsKKworCWlmIChOVUxMID09IHNjbikgeworCQlISUZfRVJST1IoIiVzOiBDb3VsZCBub3QgZGlzYWJsZSBBU1BNIHNjbiBpcyBudWxsIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXNjID0gc2NuLT5oaWZfc2M7CisKKwkvKiBEaXNhYmxlIEFTUE0gd2hlbiBwa3QgbG9nIGlzIGVuYWJsZWQgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2MtPnBkZXYsIDB4ODAsICZzY24tPmxjcl92YWwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2MtPnBkZXYsIDB4ODAsIChzY24tPmxjcl92YWwgJiAweGZmZmZmZjAwKSk7Cit9CisKKy8qKgorICogaGlmX2VuYWJsZV9wb3dlcl9nYXRpbmcoKTogZW5hYmxlIEhXIHBvd2VyIGdhdGluZworICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBIVyBnYXRpbmcKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoaWZfZW5hYmxlX3Bvd2VyX2dhdGluZyh2b2lkICpoaWZfY3R4KQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gaGlmX2N0eDsKKwlzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqc2M7CisKKwlpZiAoTlVMTCA9PSBzY24pIHsKKwkJSElGX0VSUk9SKCIlczogQ291bGQgbm90IGRpc2FibGUgQVNQTSBzY24gaXMgbnVsbCIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJc2MgPSBzY24tPmhpZl9zYzsKKworCS8qIFJlLWVuYWJsZSBBU1BNIGFmdGVyIGZpcm13YXJlL09UUCBkb3dubG9hZCBpcyBjb21wbGV0ZSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2MtPnBkZXYsIDB4ODAsIHNjbi0+bGNyX3ZhbCk7CisJaWYgKHNjbi0+cGt0X2xvZ19pbml0ID09IGZhbHNlKSB7CisJCVBLVF9MT0dfTU9EX0lOSVQoc2NuKTsKKwkJc2NuLT5wa3RfbG9nX2luaXQgPSB0cnVlOworCX0KK30KKworI2lmZGVmIENPTkZJR19QQ0lfTVNNCitzdGF0aWMgaW5saW5lIHZvaWQgaGlmX21zbV9wY2llX2RlYnVnX2luZm8oc3RydWN0IGhpZl9wY2lfc29mdGMgKnNjKQoreworCW1zbV9wY2llX2RlYnVnX2luZm8oc2MtPnBkZXYsIDEzLCAxLCAwLCAwLCAwKTsKKwltc21fcGNpZV9kZWJ1Z19pbmZvKHNjLT5wZGV2LCAxMywgMiwgMCwgMCwgMCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGhpZl9tc21fcGNpZV9kZWJ1Z19pbmZvKHN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYykge307CisjZW5kaWYKKworLyoKKyAqIEZvciBub3csIHdlIHVzZSBzaW1wbGUgb24tZGVtYW5kIHNsZWVwL3dha2UuCisgKiBTb21lIHBvc3NpYmxlIGltcHJvdmVtZW50czoKKyAqICAtVXNlIHRoZSBIb3N0LWRlc3RpbmVkIEFfSU5VTV9QQ0lFX0FXQUtFIGludGVycnVwdCByYXRoZXIgdGhhbiBzcGluL2RlbGF5CisgKiAgIChvciBwZXJoYXBzIHNwaW4vZGVsYXkgZm9yIGEgc2hvcnQgd2hpbGUsIHRoZW4gY29udmVydCB0byBzbGVlcC9pbnRlcnJ1cHQpCisgKiAgIENhcmVmdWwsIHRob3VnaCwgdGhlc2UgZnVuY3Rpb25zIG1heSBiZSB1c2VkIGJ5CisgKiAgaW50ZXJydXB0IGhhbmRsZXJzICgiYXRvbWljIikKKyAqICAtRG9uJ3QgdXNlIGhvc3RfcmVnX3RhYmxlIGZvciB0aGlzIGNvZGU7IGluc3RlYWQgdXNlIHZhbHVlcyBkaXJlY3RseQorICogIC1Vc2UgYSBzZXBhcmF0ZSB0aW1lciB0byB0cmFjayBhY3Rpdml0eSBhbmQgYWxsb3cgVGFyZ2V0IHRvIHNsZWVwIG9ubHkKKyAqICAgaWYgaXQgaGFzbid0IGRvbmUgYW55dGhpbmcgZm9yIGEgd2hpbGU7IG1heSBldmVuIHdhbnQgdG8gZGVsYXkgc29tZQorICogICBwcm9jZXNzaW5nIGZvciBhIHNob3J0IHdoaWxlIGluIG9yZGVyIHRvICJiYXRjaCIgKGUuZy4pIHRyYW5zbWl0CisgKiAgIHJlcXVlc3RzIHdpdGggY29tcGxldGlvbiBwcm9jZXNzaW5nIGludG8gIndpbmRvd3Mgb2YgdXAgdGltZSIuICBDb3N0cworICogICBzb21lIHBlcmZvcm1hbmNlLCBidXQgaW1wcm92ZXMgcG93ZXIgdXRpbGl6YXRpb24uCisgKiAgLU9uIHNvbWUgcGxhdGZvcm1zLCBpdCBtaWdodCBiZSBwb3NzaWJsZSB0byBlbGltaW5hdGUgZXhwbGljaXQKKyAqICAgc2xlZXAvd2FrZXVwLiBJbnN0ZWFkLCB0YWtlIGEgY2hhbmNlIHRoYXQgZWFjaCBhY2Nlc3Mgd29ya3MgT0suIElmIG5vdCwKKyAqICAgcmVjb3ZlciBmcm9tIHRoZSBmYWlsdXJlIGJ5IGZvcmNpbmcgdGhlIFRhcmdldCBhd2FrZS4KKyAqICAtQ2hhbmdlIGtlZXBfYXdha2VfY291bnQgdG8gYW4gYXRvbWljX3QgaW4gb3JkZXIgdG8gYXZvaWQgc3BpbiBsb2NrCisgKiAgIG92ZXJoZWFkIGluIHNvbWUgY2FzZXMuIFBlcmhhcHMgdGhpcyBtYWtlcyBtb3JlIHNlbnNlIHdoZW4KKyAqICAgQ09ORklHX0FUSF9QQ0lFX0FDQ0VTU19MSUtFTFkgaXMgdXNlZCBhbmQgbGVzcyBzZW5zZSB3aGVuIExJS0VMWSBpcworICogICBkaXNhYmxlZC4KKyAqICAtSXQgaXMgcG9zc2libGUgdG8gY29tcGlsZSB0aGlzIGNvZGUgb3V0IGFuZCBzaW1wbHkgZm9yY2UgdGhlIFRhcmdldAorICogICB0byByZW1haW4gYXdha2UuICBUaGF0IHdvdWxkIHlpZWxkIG9wdGltYWwgcGVyZm9ybWFuY2UgYXQgdGhlIGNvc3Qgb2YKKyAqICAgaW5jcmVhc2VkIHBvd2VyLiBTZWUgQ09ORklHX0FUSF9QQ0lFX01BWF9QRVJGLgorICoKKyAqIE5vdGU6IHBhcmFtZXRlciB3YWl0X2Zvcl9pdCBoYXMgbWVhbmluZyBvbmx5IHdoZW4gd2FraW5nICh3aGVuIHNsZWVwX29rPT0wKS4KKyAqLworLyoqCisgKiBoaWZfdGFyZ2V0X3NsZWVwX3N0YXRlX2FkanVzdCgpIC0gb24tZGVtYW5kIHNsZWVwL3dha2UKKyAqIEBzY246IG9sX3NvZnRjIHBvaW50ZXIuCisgKiBAc2xlZXBfb2s6IGJvb2wKKyAqIEB3YWl0X2Zvcl9pdDogYm9vbAorICoKKyAqIE91dHB1dCB0aGUgcGlwZSBlcnJvciBjb3VudHMgb2YgZWFjaCBwaXBlIHRvIGxvZyBmaWxlCisgKgorICogUmV0dXJuOiBpbnQKKyAqLworI2lmICgoQ09ORklHX0FUSF9QQ0lFX01BWF9QRVJGID09IDApICYmIENPTkZJR19BVEhfUENJRV9BV0FLRV9XSElMRV9EUklWRVJfTE9BRCkKK2ludAoraGlmX3RhcmdldF9zbGVlcF9zdGF0ZV9hZGp1c3Qoc3RydWN0IG9sX3NvZnRjICpzY24sCisJCQkgICAgICBib29sIHNsZWVwX29rLCBib29sIHdhaXRfZm9yX2l0KQoreworCXN0cnVjdCBISUZfQ0Vfc3RhdGUgKmhpZl9zdGF0ZSA9IHNjbi0+aGlmX2hkbDsKKwlBX3RhcmdldF9pZF90IHBjaV9hZGRyID0gc2NuLT5tZW07CisJc3RhdGljIGludCBtYXhfZGVsYXk7CisJc3RydWN0IGhpZl9wY2lfc29mdGMgKnNjID0gc2NuLT5oaWZfc2M7CisJc3RhdGljIGludCBkZWJ1ZzsKKworCWlmIChzY24tPnJlY292ZXJ5KQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWlmIChjZGZfYXRvbWljX3JlYWQoJnNjbi0+bGlua19zdXNwZW5kZWQpKSB7CisJCUhJRl9FUlJPUigiJXM6aW52YWxpZCBhY2Nlc3MsIFBDSWUgbGluayBpcyBkb3duIiwgX19mdW5jX18pOworCQlkZWJ1ZyA9IHRydWU7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWlmIChkZWJ1ZykgeworCQl3YWl0X2Zvcl9pdCA9IHRydWU7CisJCUhJRl9FUlJPUigiJXM6IGRvaW5nIGRlYnVnIGZvciBpbnZhbGlkIGFjY2VzcywgUENJZSBsaW5rIGlzIHN1c3BlbmRlZCIsCisJCQkJX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCX0KKworCWlmIChzbGVlcF9vaykgeworCQljZGZfc3Bpbl9sb2NrX2lycXNhdmUoJmhpZl9zdGF0ZS0+a2VlcF9hd2FrZV9sb2NrKTsKKwkJaGlmX3N0YXRlLT5rZWVwX2F3YWtlX2NvdW50LS07CisJCWlmIChoaWZfc3RhdGUtPmtlZXBfYXdha2VfY291bnQgPT0gMCkgeworCQkJLyogQWxsb3cgc2xlZXAgKi8KKwkJCWhpZl9zdGF0ZS0+dmVyaWZpZWRfYXdha2UgPSBmYWxzZTsKKwkJCWhpZl9zdGF0ZS0+c2xlZXBfdGlja3MgPSBjZGZfc3lzdGVtX3RpY2tzKCk7CisJCX0KKwkJaWYgKGhpZl9zdGF0ZS0+ZmFrZV9zbGVlcCA9PSBmYWxzZSkgeworCQkJLyogU2V0IHRoZSBGYWtlIFNsZWVwICovCisJCQloaWZfc3RhdGUtPmZha2Vfc2xlZXAgPSB0cnVlOworCisJCQkvKiBTdGFydCB0aGUgU2xlZXAgVGltZXIgKi8KKwkJCWNkZl9zb2Z0aXJxX3RpbWVyX2NhbmNlbCgmaGlmX3N0YXRlLT5zbGVlcF90aW1lcik7CisJCQljZGZfc29mdGlycV90aW1lcl9zdGFydCgmaGlmX3N0YXRlLT5zbGVlcF90aW1lciwKKwkJCQlISUZfU0xFRVBfSU5BQ1RJVklUWV9USU1FUl9QRVJJT0RfTVMpOworCQl9CisJCWNkZl9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZoaWZfc3RhdGUtPmtlZXBfYXdha2VfbG9jayk7CisJfSBlbHNlIHsKKwkJY2RmX3NwaW5fbG9ja19pcnFzYXZlKCZoaWZfc3RhdGUtPmtlZXBfYXdha2VfbG9jayk7CisKKwkJaWYgKGhpZl9zdGF0ZS0+ZmFrZV9zbGVlcCkgeworCQkJaGlmX3N0YXRlLT52ZXJpZmllZF9hd2FrZSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlpZiAoaGlmX3N0YXRlLT5rZWVwX2F3YWtlX2NvdW50ID09IDApIHsKKwkJCQkvKiBGb3JjZSBBV0FLRSAqLworCQkJCWhpZl93cml0ZTMyX21iKHBjaV9hZGRyICsKKwkJCQkJICAgICAgUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgKworCQkJCQkgICAgICBQQ0lFX1NPQ19XQUtFX0FERFJFU1MsCisJCQkJCSAgICAgIFBDSUVfU09DX1dBS0VfVl9NQVNLKTsKKwkJCX0KKwkJfQorCQloaWZfc3RhdGUtPmtlZXBfYXdha2VfY291bnQrKzsKKwkJY2RmX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhpZl9zdGF0ZS0+a2VlcF9hd2FrZV9sb2NrKTsKKworCQlpZiAod2FpdF9mb3JfaXQgJiYgIWhpZl9zdGF0ZS0+dmVyaWZpZWRfYXdha2UpIHsKKyNkZWZpbmUgUENJRV9TTEVFUF9BREpVU1RfVElNRU9VVCA4MDAwICAvKiA4TXMgKi8KKwkJCWludCB0b3RfZGVsYXkgPSAwOworCQkJaW50IGN1cnJfZGVsYXkgPSA1OworCisJCQlmb3IgKDs7ICkgeworCQkJCWlmIChoaWZfdGFyZ19pc19hd2FrZShzY24sIHBjaV9hZGRyKSkgeworCQkJCQloaWZfc3RhdGUtPnZlcmlmaWVkX2F3YWtlID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlCisJCQkJaWYgKCFoaWZfcGNpX3RhcmdfaXNfcHJlc2VudAorCQkJCQkgICAgKHNjbiwgcGNpX2FkZHIpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAodG90X2RlbGF5ID4gUENJRV9TTEVFUF9BREpVU1RfVElNRU9VVCkgeworCQkJCQl1aW50MTZfdCB2YWw7CisJCQkJCXVpbnQzMl90IGJhcjsKKworCQkJCQlISUZfRVJST1IoIiVzOiBrZWVwX2F3YWtlX2NvdW50ID0gJWQiLAorCQkJCQkgICAgICAgX19mdW5jX18sCisJCQkJCSAgICAgICBoaWZfc3RhdGUtPmtlZXBfYXdha2VfY291bnQpOworCisJCQkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNjLT5wZGV2LAorCQkJCQkJCSAgICAgUENJX1ZFTkRPUl9JRCwKKwkJCQkJCQkgICAgICZ2YWwpOworCQkJCQlISUZfRVJST1IoIiVzOiBQQ0kgVmVuZG9yIElEID0gMHglMDR4IiwKKwkJCQkJICAgICAgIF9fZnVuY19fLCB2YWwpOworCisJCQkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNjLT5wZGV2LAorCQkJCQkJCSAgICAgUENJX0RFVklDRV9JRCwKKwkJCQkJCQkgICAgICZ2YWwpOworCQkJCQlISUZfRVJST1IoIiVzOiBQQ0kgRGV2aWNlIElEID0gMHglMDR4IiwKKwkJCQkJICAgICAgIF9fZnVuY19fLCB2YWwpOworCisJCQkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNjLT5wZGV2LAorCQkJCQkJCSAgICAgUENJX0NPTU1BTkQsICZ2YWwpOworCQkJCQlISUZfRVJST1IoIiVzOiBQQ0kgQ29tbWFuZCA9IDB4JTA0eCIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgdmFsKTsKKworCQkJCQlwY2lfcmVhZF9jb25maWdfd29yZChzYy0+cGRldiwKKwkJCQkJCQkgICAgIFBDSV9TVEFUVVMsICZ2YWwpOworCQkJCQlISUZfRVJST1IoIiVzOiBQQ0kgU3RhdHVzID0gMHglMDR4IiwKKwkJCQkJICAgICAgIF9fZnVuY19fLCB2YWwpOworCisJCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzYy0+cGRldiwKKwkJCQkJCVBDSV9CQVNFX0FERFJFU1NfMCwgJmJhcik7CisJCQkJCUhJRl9FUlJPUigiJXM6IFBDSSBCQVIgMCA9IDB4JTA4eCIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgYmFyKTsKKworCQkJCQlISUZfRVJST1IoIiVzOiBTT0NfV0FLRV9BRERSIDAlMDh4IiwKKwkJCQkJCV9fZnVuY19fLAorCQkJCQkJaGlmX3JlYWQzMl9tYihwY2lfYWRkciArCisJCQkJCQlQQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUworCQkJCQkJKyBQQ0lFX1NPQ19XQUtFX0FERFJFU1MpKTsKKwkJCQkJSElGX0VSUk9SKCIlczogUlRDX1NUQVRFX0FERFIgMHglMDh4IiwKKwkJCQkJCV9fZnVuY19fLAorCQkJCQkJaGlmX3JlYWQzMl9tYihwY2lfYWRkciArCisJCQkJCQlQQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUworCQkJCQkJKyBSVENfU1RBVEVfQUREUkVTUykpOworCisJCQkJCUhJRl9FUlJPUigiJXM6ZXJyb3IsIHdha2V1cCB0YXJnZXQiLAorCQkJCQkJX19mdW5jX18pOworCQkJCQloaWZfbXNtX3BjaWVfZGVidWdfaW5mbyhzYyk7CisJCQkJCWlmICghc2MtPm9sX3NjLT5lbmFibGVfc2VsZl9yZWNvdmVyeSkKKwkJCQkJCUNERl9CVUcoMCk7CisJCQkJCXNjbi0+cmVjb3ZlcnkgPSB0cnVlOworCQkJCQljZHNfc2V0X2xvZ3BfaW5fcHJvZ3Jlc3ModHJ1ZSk7CisJCQkJCWNuc3Nfd2xhbl9wY2lfbGlua19kb3duKCk7CisJCQkJCXJldHVybiAtRUFDQ0VTOworCQkJCX0KKworCQkJCU9TX0RFTEFZKGN1cnJfZGVsYXkpOworCQkJCXRvdF9kZWxheSArPSBjdXJyX2RlbGF5OworCisJCQkJaWYgKGN1cnJfZGVsYXkgPCA1MCkKKwkJCQkJY3Vycl9kZWxheSArPSA1OworCQkJfQorCisJCQkvKgorCQkJICogTkI6IElmIFRhcmdldCBoYXMgdG8gY29tZSBvdXQgb2YgRGVlcCBTbGVlcCwKKwkJCSAqIHRoaXMgbWF5IHRha2UgYSBmZXcgTXNlY3MuIFR5cGljYWxseSwgdGhvdWdoCisJCQkgKiB0aGlzIGRlbGF5IHNob3VsZCBiZSA8MzB1cy4KKwkJCSAqLworCQkJaWYgKHRvdF9kZWxheSA+IG1heF9kZWxheSkKKwkJCQltYXhfZGVsYXkgPSB0b3RfZGVsYXk7CisJCX0KKwl9CisKKwlpZiAoZGVidWcgJiYgaGlmX3N0YXRlLT52ZXJpZmllZF9hd2FrZSkgeworCQlkZWJ1ZyA9IDA7CisJCUhJRl9FUlJPUigiJXM6IElOVFJfRU5BQkxFX1JFRyA9IDB4JTA4eCwgSU5UUl9DQVVTRV9SRUcgPSAweCUwOHgsIENQVV9JTlRSX1JFRyA9IDB4JTA4eCwgSU5UUl9DTFJfUkVHID0gMHglMDh4LCBDRV9JTlRFUlJVUFRfU1VNTUFSWV9SRUcgPSAweCUwOHgiLAorCQkJX19mdW5jX18sCisJCQloaWZfcmVhZDMyX21iKHNjLT5tZW0gKyBTT0NfQ09SRV9CQVNFX0FERFJFU1MgKworCQkJCVBDSUVfSU5UUl9FTkFCTEVfQUREUkVTUyksCisJCQloaWZfcmVhZDMyX21iKHNjLT5tZW0gKyBTT0NfQ09SRV9CQVNFX0FERFJFU1MgKworCQkJCVBDSUVfSU5UUl9DQVVTRV9BRERSRVNTKSwKKwkJCWhpZl9yZWFkMzJfbWIoc2MtPm1lbSArIFNPQ19DT1JFX0JBU0VfQUREUkVTUyArCisJCQkJQ1BVX0lOVFJfQUREUkVTUyksCisJCQloaWZfcmVhZDMyX21iKHNjLT5tZW0gKyBTT0NfQ09SRV9CQVNFX0FERFJFU1MgKworCQkJCVBDSUVfSU5UUl9DTFJfQUREUkVTUyksCisJCQloaWZfcmVhZDMyX21iKHNjLT5tZW0gKyBDRV9XUkFQUEVSX0JBU0VfQUREUkVTUyArCisJCQkJQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9BRERSRVNTKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQoraW5saW5lIGludAoraGlmX3RhcmdldF9zbGVlcF9zdGF0ZV9hZGp1c3Qoc3RydWN0IG9sX3NvZnRjICpzY24sCisJCQkgICAgICBib29sIHNsZWVwX29rLCBib29sIHdhaXRfZm9yX2l0KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVRIX1BDSUVfQUNDRVNTX0RFQlVHCit1aW50MzJfdCBoaWZfdGFyZ2V0X3JlYWRfY2hlY2tlZChzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdWludDMyX3Qgb2Zmc2V0KQoreworCXVpbnQzMl90IHZhbHVlOworCXZvaWQgKmFkZHI7CisKKwlpZiAoIUFfVEFSR0VUX0FDQ0VTU19PSyhzY24pKQorCQloaV9mZGVidWcoKTsKKworCWFkZHIgPSBzY24tPm1lbSArIG9mZnNldDsKKwl2YWx1ZSA9IEFfUENJX1JFQUQzMihhZGRyKTsKKworCXsKKwkJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJCWludCBpZHggPSBwY2llX2FjY2Vzc19sb2dfc2VxbnVtICUgUENJRV9BQ0NFU1NfTE9HX05VTTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpZV9hY2Nlc3NfbG9nX2xvY2ssIGlycV9mbGFncyk7CisJCXBjaWVfYWNjZXNzX2xvZ1tpZHhdLnNlcW51bSA9IHBjaWVfYWNjZXNzX2xvZ19zZXFudW07CisJCXBjaWVfYWNjZXNzX2xvZ1tpZHhdLmlzX3dyaXRlID0gZmFsc2U7CisJCXBjaWVfYWNjZXNzX2xvZ1tpZHhdLmFkZHIgPSBhZGRyOworCQlwY2llX2FjY2Vzc19sb2dbaWR4XS52YWx1ZSA9IHZhbHVlOworCQlwY2llX2FjY2Vzc19sb2dfc2VxbnVtKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaWVfYWNjZXNzX2xvZ19sb2NrLCBpcnFfZmxhZ3MpOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKwordm9pZAoraGlmX3RhcmdldF93cml0ZV9jaGVja2VkKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKQoreworCXZvaWQgKmFkZHI7CisKKwlpZiAoIUFfVEFSR0VUX0FDQ0VTU19PSyhzY24pKQorCQloaV9mZGVidWcoKTsKKworCWFkZHIgPSBzY24tPm1lbSArIChvZmZzZXQpOworCWhpZl93cml0ZTMyX21iKGFkZHIsIHZhbHVlKTsKKworCXsKKwkJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJCWludCBpZHggPSBwY2llX2FjY2Vzc19sb2dfc2VxbnVtICUgUENJRV9BQ0NFU1NfTE9HX05VTTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpZV9hY2Nlc3NfbG9nX2xvY2ssIGlycV9mbGFncyk7CisJCXBjaWVfYWNjZXNzX2xvZ1tpZHhdLnNlcW51bSA9IHBjaWVfYWNjZXNzX2xvZ19zZXFudW07CisJCXBjaWVfYWNjZXNzX2xvZ1tpZHhdLmlzX3dyaXRlID0gdHJ1ZTsKKwkJcGNpZV9hY2Nlc3NfbG9nW2lkeF0uYWRkciA9IGFkZHI7CisJCXBjaWVfYWNjZXNzX2xvZ1tpZHhdLnZhbHVlID0gdmFsdWU7CisJCXBjaWVfYWNjZXNzX2xvZ19zZXFudW0rKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpZV9hY2Nlc3NfbG9nX2xvY2ssIGlycV9mbGFncyk7CisJfQorfQorCisvKioKKyAqIGhpX2ZkZWJ1ZygpIC0gbm90IG5lZWRlZCBpbiBQQ0kKKyAqCisgKgorICogUmV0dXJuOiBuL2EKKyAqLwordm9pZCBoaV9mZGVidWcodm9pZCkKK3sKKwkvKiBCVUdfT04oMSk7ICovCit9CisKKy8qKgorICogaGlmX3RhcmdldF9kdW1wX2FjY2Vzc19sb2coKSAtIGR1bXAgYWNjZXNzIGxvZworICoKKyAqIGR1bXAgYWNjZXNzIGxvZworICoKKyAqIFJldHVybjogbi9hCisgKi8KK3ZvaWQgaGlmX3RhcmdldF9kdW1wX2FjY2Vzc19sb2codm9pZCkKK3sKKwlpbnQgaWR4LCBsZW4sIHN0YXJ0X2lkeCwgY3VyX2lkeDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2llX2FjY2Vzc19sb2dfbG9jaywgaXJxX2ZsYWdzKTsKKwlpZiAocGNpZV9hY2Nlc3NfbG9nX3NlcW51bSA+IFBDSUVfQUNDRVNTX0xPR19OVU0pIHsKKwkJbGVuID0gUENJRV9BQ0NFU1NfTE9HX05VTTsKKwkJc3RhcnRfaWR4ID0gcGNpZV9hY2Nlc3NfbG9nX3NlcW51bSAlIFBDSUVfQUNDRVNTX0xPR19OVU07CisJfSBlbHNlIHsKKwkJbGVuID0gcGNpZV9hY2Nlc3NfbG9nX3NlcW51bTsKKwkJc3RhcnRfaWR4ID0gMDsKKwl9CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsgaWR4KyspIHsKKwkJY3VyX2lkeCA9IChzdGFydF9pZHggKyBpZHgpICUgUENJRV9BQ0NFU1NfTE9HX05VTTsKKwkJSElGX0VSUk9SKCIlczogaWR4OiVkIHNuOiV1IHdyOiVkIGFkZHI6JXAgdmFsOiV1LiIsCisJCSAgICAgICBfX2Z1bmNfXywgaWR4LAorCQkgICAgICAgcGNpZV9hY2Nlc3NfbG9nW2N1cl9pZHhdLnNlcW51bSwKKwkJICAgICAgIHBjaWVfYWNjZXNzX2xvZ1tjdXJfaWR4XS5pc193cml0ZSwKKwkJICAgICAgIHBjaWVfYWNjZXNzX2xvZ1tjdXJfaWR4XS5hZGRyLAorCQkgICAgICAgcGNpZV9hY2Nlc3NfbG9nW2N1cl9pZHhdLnZhbHVlKTsKKwl9CisKKwlwY2llX2FjY2Vzc19sb2dfc2VxbnVtID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2llX2FjY2Vzc19sb2dfbG9jaywgaXJxX2ZsYWdzKTsKK30KKyNlbmRpZgorCisvKioKKyAqIHdhcl9wY2lfd3JpdGUzMigpIC0gUENJZSBpbzMyIHdyaXRlIHdvcmthcm91bmQKKyAqIEBhZGRyOiBhZGRyCisgKiBAb2Zmc2V0OiBvZmZzZXQKKyAqIEB2YWx1ZTogdmFsdWUKKyAqCisgKiBpb3dyaXRlMzIKKyAqCisgKiBSZXR1cm46IGludAorICovCit2b2lkIHdhcl9wY2lfd3JpdGUzMihjaGFyICphZGRyLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKQoreworCWlmIChoaWZfcGNpX3dhcjEpIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaXdhcl9sb2NrLCBpcnFfZmxhZ3MpOworCisJCSh2b2lkKWlvcmVhZDMyKCh2b2lkIF9faW9tZW0gKikoYWRkciArIG9mZnNldCArIDQpKTsKKwkJKHZvaWQpaW9yZWFkMzIoKHZvaWQgX19pb21lbSAqKShhZGRyICsgb2Zmc2V0ICsgNCkpOworCQkodm9pZClpb3JlYWQzMigodm9pZCBfX2lvbWVtICopKGFkZHIgKyBvZmZzZXQgKyA0KSk7CisJCWlvd3JpdGUzMigodWludDMyX3QpICh2YWx1ZSksICh2b2lkIF9faW9tZW0gKikoYWRkciArIG9mZnNldCkpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaXdhcl9sb2NrLCBpcnFfZmxhZ3MpOworCX0gZWxzZSB7CisJCWlvd3JpdGUzMigodWludDMyX3QpICh2YWx1ZSksICh2b2lkIF9faW9tZW0gKikoYWRkciArIG9mZnNldCkpOworCX0KK30KKworLyoqCisgKiBoaWZfY29uZmlndXJlX2lycSgpOiBjb25maWd1cmUgaW50ZXJydXB0CisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIGludGVycnVwdChzKQorICoKKyAqIEBzYzogUENJZSBjb250cm9sIHN0cnVjdAorICogQGhpZl9oZGw6IHN0cnVjdCBISUZfQ0Vfc3RhdGUKKyAqCisgKiBSZXR1cm46IDAgLSBmb3Igc3VjY2VzcworICovCitpbnQgaGlmX2NvbmZpZ3VyZV9pcnEoc3RydWN0IGhpZl9wY2lfc29mdGMgKnNjKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gc2MtPm9sX3NjOworCisJSElGX1RSQUNFKCIlczogRSIsIF9fZnVuY19fKTsKKworCWlmIChFTkFCTEVfTVNJKSB7CisJCXJldCA9IGhpZl9jb25maWd1cmVfbXNpKHNjKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJZ290byBlbmQ7CisJfQorCS8qIE1TSSBmYWlsZWQuIFRyeSBsZWdhY3kgaXJxICovCisJcmV0ID0gaGlmX3BjaV9jb25maWd1cmVfbGVnYWN5X2lycShzYyk7CisJaWYgKHJldCA8IDApIHsKKwkJSElGX0VSUk9SKCIlczogaGlmX3BjaV9jb25maWd1cmVfbGVnYWN5X2lycSBlcnJvciA9ICVkIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KK2VuZDoKKwlzY24tPnJlcXVlc3RfaXJxX2RvbmUgPSB0cnVlOworCXJldHVybiAwOworfQorCisvKioKKyAqIGhpZl90YXJnZXRfc3luYygpIDogZW5zdXJlIHRoZSB0YXJnZXQgaXMgcmVhZHkKKyAqIEBzY246IGhpZiBjb250cm9sbCBzdHJ1Y3R1cmUKKyAqCisgKiBJbmZvcm1zIGZ3IHRoYXQgd2UgcGxhbiB0byB1c2UgbGVnYWN5IGludGVydXB0cyBzbyB0aGF0CisgKiBpdCBjYW4gYmVnaW4gYm9vdGluZy4gRW5zdXJlcyB0aGF0IHRoZSBmdyBmaW5pc2hlcyBib290aW5nCisgKiBiZWZvcmUgY29udGludWluZy4gU2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdHJ5aW5nIHRvIHdyaXRlCisgKiB0byB0aGUgdGFyZ2V0cyBvdGhlciByZWdpc3RlcnMgZm9yIHRoZSBmaXJzdCB0aW1lLgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGhpZl90YXJnZXRfc3luYyhzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwloaWZfd3JpdGUzMl9tYihzY24tPm1lbSsoU09DX0NPUkVfQkFTRV9BRERSRVNTIHwKKwkJCQlQQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MpLAorCQkJCVBDSUVfSU5UUl9GSVJNV0FSRV9NQVNLKTsKKworCWhpZl93cml0ZTMyX21iKHNjbi0+bWVtICsgUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgKworCQkJUENJRV9TT0NfV0FLRV9BRERSRVNTLAorCQkJUENJRV9TT0NfV0FLRV9WX01BU0spOworCXdoaWxlICghaGlmX3RhcmdfaXNfYXdha2Uoc2NuLCBzY24tPm1lbSkpCisJCTsKKworCWlmIChIQVNfRldfSU5ESUNBVE9SKSB7CisJCWludCB3YWl0X2xpbWl0ID0gNTAwOworCQlpbnQgZndfaW5kID0gMDsKKwkJSElGX1RSQUNFKCIlczogTG9vcCBjaGVja2luZyBGVyBzaWduYWwiLCBfX2Z1bmNfXyk7CisJCXdoaWxlICgxKSB7CisJCQlmd19pbmQgPSBoaWZfcmVhZDMyX21iKHNjbi0+aGlmX3NjLT5tZW0gKworCQkJCQlGV19JTkRJQ0FUT1JfQUREUkVTUyk7CisJCQlpZiAoZndfaW5kICYgRldfSU5EX0lOSVRJQUxJWkVEKQorCQkJCWJyZWFrOworCQkJaWYgKHdhaXRfbGltaXQtLSA8IDApCisJCQkJYnJlYWs7CisJCQloaWZfd3JpdGUzMl9tYihzY24tPm1lbSsoU09DX0NPUkVfQkFTRV9BRERSRVNTIHwKKwkJCQlQQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MpLAorCQkJCVBDSUVfSU5UUl9GSVJNV0FSRV9NQVNLKTsKKworCQkJY2RmX21kZWxheSgxMCk7CisJCX0KKwkJaWYgKHdhaXRfbGltaXQgPCAwKQorCQkJSElGX1RSQUNFKCIlczogRlcgc2lnbmFsIHRpbWVkIG91dCIsCisJCQkJCV9fZnVuY19fKTsKKwkJZWxzZQorCQkJSElGX1RSQUNFKCIlczogR290IEZXIHNpZ25hbCwgcmV0cmllcyA9ICV4IiwKKwkJCQkJX19mdW5jX18sIDUwMC13YWl0X2xpbWl0KTsKKwl9CisJaGlmX3dyaXRlMzJfbWIoc2NuLT5tZW0gKyBQQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUyArCisJCQlQQ0lFX1NPQ19XQUtFX0FERFJFU1MsIFBDSUVfU09DX1dBS0VfUkVTRVQpOworfQorCisvKioKKyAqIGhpZl9lbmFibGVfYnVzKCk6IGVuYWJsZSBidXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIGJ1cworICoKKyAqIEBvbF9zYzogc29mdF9zYyBzdHJ1Y3QKKyAqIEBkZXY6IGRldmljZSBwb2ludGVyCisgKiBAYmRldjogYnVzIGRldiBwb2ludGVyCisgKiBiaWQ6IGJ1cyBpZCBwb2ludGVyCisgKiB0eXBlOiBlbnVtIGhpZl9lbmFibGVfdHlwZSBzdWNoIGFzIEhJRl9FTkFCTEVfVFlQRV9QUk9CRQorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgaGlmX2VuYWJsZV9idXMoc3RydWN0IG9sX3NvZnRjICpvbF9zYywKKwkJCSAgc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpiZGV2LAorCQkJICBjb25zdCBoaWZfYnVzX2lkICpiaWQsCisJCQkgIGVudW0gaGlmX2VuYWJsZV90eXBlIHR5cGUpCit7CisJaW50IHJldCA9IDA7CisJdWludDMyX3QgaGlmX3R5cGUsIHRhcmdldF90eXBlOworCXN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYzsKKwl1aW50MTZfdCByZXZpc2lvbl9pZDsKKwl1aW50MzJfdCBsY3JfdmFsOworCWludCBwcm9iZV9hZ2FpbiA9IDA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBiZGV2OworCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCA9IGJpZDsKKworCUhJRl9UUkFDRSgiJXM6IGNvbl9tb2RlID0gMHgleCwgZGV2aWNlX2lkID0gMHgleCIsCisJCSAgX19mdW5jX18sIGNkc19nZXRfY29ucGFyYW0oKSwgaWQtPmRldmljZSk7CisKKwlvbF9zYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRik7CisJaWYgKCFvbF9zYykgeworCQlISUZfRVJST1IoIiVzOiBoaWZfY3R4IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCXNjID0gb2xfc2MtPmhpZl9zYzsKKwlvbF9zYy0+YXBzX29zZGV2LmJkZXYgPSBwZGV2OworCisJc2MtPnBkZXYgPSBwZGV2OworCXNjLT5kZXYgPSAmcGRldi0+ZGV2OworCW9sX3NjLT5hcHNfb3NkZXYuYmRldiA9IHBkZXY7CisJb2xfc2MtPmFwc19vc2Rldi5kZXZpY2UgPSAmcGRldi0+ZGV2OworCW9sX3NjLT5hcHNfb3NkZXYuYmMuYmNfaGFuZGxlID0gKHZvaWQgKilvbF9zYy0+bWVtOworCW9sX3NjLT5hcHNfb3NkZXYuYmMuYmNfYnVzdHlwZSA9IHR5cGU7CisJc2MtPmRldmlkID0gaWQtPmRldmljZTsKKwlzYy0+Y2FjaGVsaW5lX3N6ID0gZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQoKTsKK2FnYWluOgorCXJldCA9IGhpZl9lbmFibGVfcGNpKHNjLCBwZGV2LCBpZCk7CisJaWYgKHJldCA8IDApIHsKKwkJSElGX0VSUk9SKCIlczogRVJST1IgLSBoaWZfZW5hYmxlX3BjaSBlcnJvciA9ICVkIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9lbmFibGVfcGNpOworCX0KKwlISUZfVFJBQ0UoIiVzOiBoaWZfZW5hYmxlX3BjaSBkb25lIiwgX19mdW5jX18pOworCisJLyogVGVtcG9yYXJ5IEZJWDogZGlzYWJsZSBBU1BNIG9uIHBlcmVncmluZS4KKwkgKiBXaWxsIGJlIHJlbW92ZWQgYWZ0ZXIgdGhlIE9UUCBpcyBwcm9ncmFtbWVkCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4ODAsICZsY3JfdmFsKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4ODAsIChsY3JfdmFsICYgMHhmZmZmZmYwMCkpOworCisJZGV2aWNlX2Rpc2FibGVfYXN5bmNfc3VzcGVuZCgmcGRldi0+ZGV2KTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweDA4LCAmcmV2aXNpb25faWQpOworCisJcmV0ID0gaGlmX2dldF9kZXZpY2VfdHlwZShpZC0+ZGV2aWNlLCByZXZpc2lvbl9pZCwKKwkJCQkJCSZoaWZfdHlwZSwgJnRhcmdldF90eXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlISUZfRVJST1IoIiVzOiBpbnZhbGlkIGRldmljZSBpZC9yZXZpc2lvbl9pZCIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfdGd0c3RhdGU7CisJfQorCUhJRl9UUkFDRSgiJXM6IGhpZl90eXBlID0gMHgleCwgdGFyZ2V0X3R5cGUgPSAweCV4IiwKKwkJICBfX2Z1bmNfXywgaGlmX3R5cGUsIHRhcmdldF90eXBlKTsKKworCWhpZl9yZWdpc3Rlcl90YmxfYXR0YWNoKHNjLT5vbF9zYywgaGlmX3R5cGUpOworCXRhcmdldF9yZWdpc3Rlcl90YmxfYXR0YWNoKHNjLT5vbF9zYywgdGFyZ2V0X3R5cGUpOworCisJcmV0ID0gaGlmX3BjaV9wcm9iZV90Z3Rfd2FrZXVwKHNjKTsKKwlpZiAocmV0IDwgMCkgeworCQlISUZfRVJST1IoIiVzOiBFUlJPUiAtIGhpZl9wY2lfcHJvYl93YWtldXAgZXJyb3IgPSAlZCIsCisJCQkgICBfX2Z1bmNfXywgcmV0KTsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJcHJvYmVfYWdhaW4rKzsKKwkJZ290byBlcnJfdGd0c3RhdGU7CisJfQorCUhJRl9UUkFDRSgiJXM6IGhpZl9wY2lfcHJvYmVfdGd0X3dha2V1cCBkb25lIiwgX19mdW5jX18pOworCisJb2xfc2MtPnRhcmdldF90eXBlID0gdGFyZ2V0X3R5cGU7CisJc2MtPnNvY19wY2llX2JhcjAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgQkFSX05VTSk7CisJaWYgKCFzYy0+c29jX3BjaWVfYmFyMCkgeworCQlISUZfRVJST1IoIiVzOiBFUlJPUiAtIGNhbm5vdCBnZXQgQ0UgQkFSMCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfdGd0c3RhdGU7CisJfQorCW9sX3NjLT5tZW1fcGEgPSBzYy0+c29jX3BjaWVfYmFyMDsKKworCUJVR19PTihwY2lfZ2V0X2RydmRhdGEoc2MtPnBkZXYpICE9IE5VTEwpOworCXBjaV9zZXRfZHJ2ZGF0YShzYy0+cGRldiwgc2MpOworCisJcmV0ID0gaGlmX2luaXRfY2RmX2N0eChvbF9zYyk7CisJaWYgKHJldCAhPSAwKSB7CisJCUhJRl9FUlJPUigiJXM6IGNhbm5vdCBpbml0IENERiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfdGd0c3RhdGU7CisJfQorCisJaGlmX3RhcmdldF9zeW5jKG9sX3NjKTsKKwlyZXR1cm4gMDsKKworZXJyX3RndHN0YXRlOgorCWhpZl9kZWluaXRfY2RmX2N0eChvbF9zYyk7CisJaGlmX2Rpc2FibGVfcGNpKHNjKTsKKwlzYy0+cGNpX2VuYWJsZWQgPSBmYWxzZTsKKwlISUZfRVJST1IoIiVzOiBlcnJvciwgaGlmX2Rpc2FibGVfcGNpIGRvbmUiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIENERl9TVEFUVVNfRV9BQk9SVEVEOworCitlcnJfZW5hYmxlX3BjaToKKwlpZiAocHJvYmVfYWdhaW4gJiYgKHByb2JlX2FnYWluIDw9IEFUSF9QQ0lfUFJPQkVfUkVUUllfTUFYKSkgeworCQlpbnQgZGVsYXlfdGltZTsKKworCQlISUZfSU5GTygiJXM6IHBjaSByZXByb2JlIiwgX19mdW5jX18pOworCQkvKiAxMCwgNDAsIDkwLCAxMDAsIDEwMCwgLi4uICovCisJCWRlbGF5X3RpbWUgPSBtYXgoMTAwLCAxMCAqIChwcm9iZV9hZ2FpbiAqIHByb2JlX2FnYWluKSk7CisJCWNkZl9tZGVsYXkoZGVsYXlfdGltZSk7CisJCWdvdG8gYWdhaW47CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGlmX2dldF90YXJnZXRfdHlwZSgpOiBHZXQgdGhlIHRhcmdldCB0eXBlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHF1ZXJ5IHRoZSB0YXJnZXQgdHlwZS4KKyAqCisgKiBAb2xfc2M6IG9sX3NvZnRjIHN0cnVjdCBwb2ludGVyCisgKiBAZGV2OiBkZXZpY2UgcG9pbnRlcgorICogQGJkZXY6IGJ1cyBkZXYgcG9pbnRlcgorICogQGJpZDogYnVzIGlkIHBvaW50ZXIKKyAqIEBoaWZfdHlwZTogSElGIHR5cGUgc3VjaCBhcyBISUZfVFlQRV9RQ0E2MTgwCisgKiBAdGFyZ2V0X3R5cGU6IHRhcmdldCB0eXBlIHN1Y2ggYXMgVEFSR0VUX1RZUEVfUUNBNjE4MAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcworICovCitpbnQgaGlmX2dldF90YXJnZXRfdHlwZShzdHJ1Y3Qgb2xfc29mdGMgKm9sX3NjLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJdm9pZCAqYmRldiwgY29uc3QgaGlmX2J1c19pZCAqYmlkLCB1aW50MzJfdCAqaGlmX3R5cGUsCisJdWludDMyX3QgKnRhcmdldF90eXBlKQoreworCXVpbnQxNl90IHJldmlzaW9uX2lkOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYmRldjsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQgPSBiaWQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweDA4LCAmcmV2aXNpb25faWQpOworCXJldHVybiBoaWZfZ2V0X2RldmljZV90eXBlKGlkLT5kZXZpY2UsIHJldmlzaW9uX2lkLAorCQkJaGlmX3R5cGUsIHRhcmdldF90eXBlKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9wY2llL2lmX3BjaS5oIGIvY29yZS9oaWYvc3JjL3BjaWUvaWZfcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmNWJkNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9wY2llL2lmX3BjaS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQVRIX1BDSV9IX18KKyNkZWZpbmUgX19BVEhfUENJX0hfXworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjZGVmaW5lIEFUSF9EQkdfREVGQVVMVCAgIDAKKyNpbmNsdWRlIDxvc2RlcC5oPgorI2luY2x1ZGUgPG9sX2lmX2F0aHZhci5oPgorI2luY2x1ZGUgPGF0aGRlZnMuaD4KKyNpbmNsdWRlICJvc2FwaV9saW51eC5oIgorI2luY2x1ZGUgImhpZi5oIgorI2luY2x1ZGUgImNlcGNpLmgiCisKK3N0cnVjdCBDRV9zdGF0ZTsKK3N0cnVjdCBvbF9zb2Z0YzsKKworLyogQW4gYWRkcmVzcyAoZS5nLiBvZiBhIGJ1ZmZlcikgaW4gQ29weSBFbmdpbmUgc3BhY2UuICovCisKKyNkZWZpbmUgSElGX01BWF9UQVNLTEVUX05VTSAxMQorc3RydWN0IGhpZl90YXNrbGV0X2VudHJ5IHsKKwl1aW50OF90IGlkOyAgICAgICAgLyogMCAtIDk6IG1hcHMgdG8gQ0UsIDEwOiBmdyAqLworCXZvaWQgKmhpZl9oYW5kbGVyOyAvKiBzdHJ1Y3QgaGlmX3BjaV9zb2Z0YyAqLworfTsKK3N0cnVjdCBoaWZfcGNpX3NvZnRjIHsKKwl2b2lkIF9faW9tZW0gKm1lbTsgICAgICAvKiBQQ0kgYWRkcmVzcy4gKi8KKwkvKiBGb3IgZWZmaWNpZW5jeSwgc2hvdWxkIGJlIGZpcnN0IGluIHN0cnVjdCAqLworCisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBvbF9zb2Z0YyAqb2xfc2M7CisJaW50IG51bV9tc2lfaW50cnM7ICAgICAgLyogbnVtYmVyIG9mIE1TSSBpbnRlcnJ1cHRzIGdyYW50ZWQgKi8KKwkvKiAwIC0tPiB1c2luZyBsZWdhY3kgUENJIGxpbmUgaW50ZXJydXB0cyAqLworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpbnRyX3RxOyAgLyogdGFza2xldCAqLworCisKKwlpbnQgaXJxOworCWludCBpcnFfZXZlbnQ7CisJaW50IGNhY2hlbGluZV9zejsKKwl1MTYgZGV2aWQ7CisJY2RmX2RtYV9hZGRyX3Qgc29jX3BjaWVfYmFyMDsKKwlzdHJ1Y3QgaGlmX3Rhc2tsZXRfZW50cnkgdGFza2xldF9lbnRyaWVzW0hJRl9NQVhfVEFTS0xFVF9OVU1dOworCWJvb2wgcGNpX2VuYWJsZWQ7Cit9OworCitib29sIGhpZl9wY2lfdGFyZ19pc19wcmVzZW50KHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB2b2lkICpfX2lvbWVtICptZW0pOwordm9pZCBpY25zc19kaXNwYXRjaF9jZV9pcnEoc3RydWN0IG9sX3NvZnRjICpzY24pOworaW50IGhpZl9jb25maWd1cmVfaXJxKHN0cnVjdCBoaWZfcGNpX3NvZnRjICpzYyk7Cit2b2lkIGhpZl9wY2lfY2FuY2VsX2RlZmVycmVkX3RhcmdldF9zbGVlcChzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CisKKy8qCisgKiBBIGZpcm13YXJlIGludGVycnVwdCB0byB0aGUgSG9zdCBpcyBpbmRpY2F0ZWQgYnkgdGhlCisgKiBsb3cgYml0IG9mIFNDUkFUQ0hfM19BRERSRVNTIGJlaW5nIHNldC4KKyAqLworI2RlZmluZSBGV19FVkVOVF9QRU5ESU5HX1JFR19BRERSRVNTIFNDUkFUQ0hfM19BRERSRVNTCisKKy8qCisgKiBUeXBpY2FsbHksIE1TSSBJbnRlcnJ1cHRzIGFyZSB1c2VkIHdpdGggUENJZS4gVG8gZm9yY2UgdXNlIG9mIGxlZ2FjeQorICogIkFCQ0QiIFBDSSBsaW5lIGludGVycnVwdHMgcmF0aGVyIHRoYW4gTVNJLCBkZWZpbmUKKyAqIEZPUkNFX0xFR0FDWV9QQ0lfSU5URVJSVVBUUy4KKyAqIEV2ZW4gd2hlbiBOT1QgZm9yY2VkLCB0aGUgZHJpdmVyIG1heSBhdHRlbXB0IHRvIHVzZSBsZWdhY3kgUENJIGludGVycnVwdHMKKyAqIE1TSSBhbGxvY2F0aW9uIGZhaWxzCisgKi8KKyNkZWZpbmUgTEVHQUNZX0lOVEVSUlVQVFMoc2MpICgoc2MpLT5udW1fbXNpX2ludHJzID09IDApCisKKy8qCisgKiBUaGVyZSBtYXkgYmUgc29tZSBwZW5kaW5nIHR4IGZyYW1lcyBkdXJpbmcgcGxhdGZvcm0gc3VzcGVuZC4KKyAqIFN1c3BlbmQgb3BlcmF0aW9uIHNob3VsZCBiZSBkZWxheWVkIHVudGlsIHRob3NlIHR4IGZyYW1lcyBhcmUKKyAqIHRyYW5zZmVyZWQgZnJvbSB0aGUgaG9zdCB0byB0YXJnZXQuIFRoaXMgbWFjcm8gc3BlY2lmaWVzIGhvdworICogbG9uZyBzdXNwZW5kIHRocmVhZCBoYXMgdG8gc2xlZXAgYmVmb3JlIGNoZWNraW5nIHBlbmRpbmcgdHgKKyAqIGZyYW1lIGNvdW50LgorICovCisjZGVmaW5lIE9MX0FUSF9UWF9EUkFJTl9XQUlUX0RFTEFZICAgICA1MCAgICAgICAvKiBtcyAqLworCisjZGVmaW5lIEhJRl9DRV9EUkFJTl9XQUlUX0RFTEFZICAgICAgICAxMCAgICAgICAvKiBtcyAqLworLyoKKyAqIFdhaXQgdGltZSAoaW4gdW5pdCBvZiBPTF9BVEhfVFhfRFJBSU5fV0FJVF9ERUxBWSkgZm9yIHBlbmRpbmcKKyAqIHR4IGZyYW1lIGNvbXBsZXRpb24gYmVmb3JlIHN1c3BlbmQuIFJlZmVyOiBoaWZfcGNpX3N1c3BlbmQoKQorICovCisjaWZuZGVmIFFDQV9XSUZJXzNfMF9FTVUKKyNkZWZpbmUgT0xfQVRIX1RYX0RSQUlOX1dBSVRfQ05UICAgICAgIDEwCisjZWxzZQorI2RlZmluZSBPTF9BVEhfVFhfRFJBSU5fV0FJVF9DTlQgICAgICAgNjAKKyNlbmRpZgorCisjZGVmaW5lIEhJRl9DRV9EUkFJTl9XQUlUX0NOVCAgICAgICAgICAyMAorI2VuZGlmIC8qIF9fQVRIX1BDSV9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaGlmL3NyYy9wY2llL2lmX3BjaV9pbnRlcm5hbC5oIGIvY29yZS9oaWYvc3JjL3BjaWUvaWZfcGNpX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmMjhkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9wY2llL2lmX3BjaV9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0lGX1BDSV9JTlRFUk5BTF9IX18KKyNkZWZpbmUgX19JRl9QQ0lfSU5URVJOQUxfSF9fCisjaWZkZWYgQ09ORklHX0NOU1MKKyNkZWZpbmUgSElGX1JFR0lTVEVSX0RSSVZFUih3bGFuX2Rydl9pZCkgXAorCWNuc3Nfd2xhbl9yZWdpc3Rlcl9kcml2ZXIod2xhbl9kcnZfaWQpCisjZGVmaW5lIEhJRl9VTlJFR0lTVEVSX0RSSVZFUih3bGFuX2Rydl9pZCkgXAorCWNuc3Nfd2xhbl91bnJlZ2lzdGVyX2RyaXZlcih3bGFuX2Rydl9pZCkKKyNlbHNlCisjZGVmaW5lIEhJRl9SRUdJU1RFUl9EUklWRVIod2xhbl9kcnZfaWQpIFwKKwlwY2lfcmVnaXN0ZXJfZHJpdmVyKHdsYW5fZHJ2X2lkKQorI2RlZmluZSBISUZfVU5SRUdJU1RFUl9EUklWRVIod2xhbl9kcnZfaWQpIFwKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIod2xhbl9kcnZfaWQpCisjZW5kaWYKKworI2lmZGVmIERJU0FCTEVfTDFTU19TVEFURVMKKyNkZWZpbmUgUENJX0NGR19UT19ESVNBQkxFX0wxU1NfU1RBVEVTKHBkZXYsIGFkZHIpIFwKK3sgXAorCXVpbnQzMl90IGxjcl92YWw7IFwKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgYWRkciwgJmxjcl92YWwpOyBcCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBhZGRyLCAobGNyX3ZhbCAmIH4weDAwMDAwMDBmKSk7IFwKK30KKyNlbHNlCisjZGVmaW5lIFBDSV9DRkdfVE9fRElTQUJMRV9MMVNTX1NUQVRFUyhwZGV2LCBhZGRyKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTlNTKSAmJiAhZGVmaW5lZChRQ0FfV0lGSV8zXzApCisjZGVmaW5lIEdFVF9WSVJUX1JBTURVTVBfTUVNKG9sX3NjKSBcCit7IFwKKwlvbF9zYy0+cmFtZHVtcF9iYXNlID0gY25zc19nZXRfdmlydF9yYW1kdW1wX21lbSgmb2xfc2MtPnJhbWR1bXBfc2l6ZSk7IFwKKwlpZiAob2xfc2MtPnJhbWR1bXBfYmFzZSA9PSBOVUxMIHx8ICFvbF9zYy0+cmFtZHVtcF9zaXplKSBcCisJCUhJRl9FUlJPUigiJXM6IEZhaWxlZCB0byBnZXQgUkFNIGR1bXAgbWVtb3J5IGFkZHIgb3Igc2l6ZSEiLCBcCisJCQlfX2Z1bmNfXyk7IFwKK30KKyNlbHNlCisjZGVmaW5lIEdFVF9WSVJUX1JBTURVTVBfTUVNKG9sX3NjKQorI2VuZGlmCisKKyNpZmRlZiBRQ0FfV0lGSV8zXzAKKyNkZWZpbmUgUENJX0NMUl9DQVVTRTBfUkVHSVNURVIoc2MpIFwKK3sgXAorCXVpbnQzMl90IHRtcF9jYXVzZTA7IFwKKwl0bXBfY2F1c2UwID0gaGlmX3JlYWQzMl9tYihzYy0+bWVtICsgUENJRV9JTlRSX0NBVVNFX0FERFJFU1MpOyBcCisJaGlmX3dyaXRlMzJfbWIoc2MtPm1lbSArIFBDSUVfSU5UUl9DTFJfQUREUkVTUywgXAorCQkgICAgICBQQ0lFX0lOVFJfRklSTVdBUkVfTUFTSyB8IHRtcF9jYXVzZTApOyBcCisJaGlmX3JlYWQzMl9tYihzYy0+bWVtICsgUENJRV9JTlRSX0NMUl9BRERSRVNTKTsgXAorCWhpZl93cml0ZTMyX21iKHNjLT5tZW0gKyBQQ0lFX0lOVFJfQ0xSX0FERFJFU1MsIDApOyBcCisJaGlmX3JlYWQzMl9tYihzYy0+bWVtICsgUENJRV9JTlRSX0NMUl9BRERSRVNTKTsgXAorfQorCisjZGVmaW5lIEhJRl9QQ0lfVEFSR19JU19BV0FLRShzY24sIG1lbSkgXAoreyBcCisJcmV0dXJuIDE7IFwKK30KKyNlbHNlCisjZGVmaW5lIFBDSV9DTFJfQ0FVU0UwX1JFR0lTVEVSKHNjKQorCisjZGVmaW5lIEhJRl9QQ0lfVEFSR19JU19BV0FLRShzY24sIG1lbSkgXAoreyBcCisJdWludDMyX3QgdmFsOyBcCisJaWYgKHNjbi0+cmVjb3ZlcnkpIFwKKwkJcmV0dXJuIGZhbHNlOyBcCisJdmFsID0gaGlmX3JlYWQzMl9tYihtZW0gKyBQQ0lFX0xPQ0FMX0JBU0VfQUREUkVTUyBcCisJCSsgUlRDX1NUQVRFX0FERFJFU1MpOyBcCisJcmV0dXJuIFJUQ19TVEFURV9WX0dFVCh2YWwpID09IFJUQ19TVEFURV9WX09OOyBcCit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJFTU9WRV9QS1RfTE9HKSAmJiAhZGVmaW5lZChRVklUKQorI2RlZmluZSBQS1RfTE9HX01PRF9JTklUKG9sX3NjKSBcCit7IFwKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXZfdHhyeF9oYW5kbGU7IFwKKwlwZGV2X3R4cnhfaGFuZGxlID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7IFwKKwlpZiAoY2RzX2dldF9jb25wYXJhbSgpICE9IENERl9GVE1fTU9ERSAmJiBcCisJICAgICFXTEFOX0lTX0VQUElOR19FTkFCTEVEKGNkc19nZXRfY29ucGFyYW0oKSkpIHsgXAorCQlvbF9wbF9zZXRoYW5kbGUoJnBkZXZfdHhyeF9oYW5kbGUtPnBsX2Rldiwgb2xfc2MpOyBcCisJCWlmIChwa3Rsb2dtb2RfaW5pdChvbF9zYykpIFwKKwkJCUhJRl9FUlJPUigiJXM6IHBrdGxvZ21vZF9pbml0IGZhaWxlZCIsIF9fZnVuY19fKTsgXAorCX0gXAorfQorI2Vsc2UKKyNkZWZpbmUgUEtUX0xPR19NT0RfSU5JVChvbF9zYykKKyNlbmRpZgorI2VuZGlmIC8qIF9fSUZfUENJX0lOVEVSTkFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oaWYvc3JjL3FjYTYxODBkZWYuaCBiL2NvcmUvaGlmL3NyYy9xY2E2MTgwZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmYzJhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9xY2E2MTgwZGVmLmgKQEAgLTAsMCArMSwxMDA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9RQ0E2MTgwREVGX0hfCisjZGVmaW5lIF9RQ0E2MTgwREVGX0hfCisKKyNkZWZpbmUgTUlTU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIF9QQ0lFX0xPQ0FMX1JFR19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgxRTgwMDAKKyNkZWZpbmUgX1dJRklfUlRDX1JFR19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDQ1MDAwCisjZGVmaW5lIF9SVENfU09DX1JFR19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgMHgxMTMwMDAKKyNkZWZpbmUgX0dQSU9fQVRIUl9XTEFOX1JFR19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAweDg1MDAwCisjZGVmaW5lIF9TSV9SRUdfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NDAwMAorI2RlZmluZSBfU09DX0NPUkVfUkVHX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MTEzMDAwCisjZGVmaW5lIF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHgyNDAwMDAKKyNkZWZpbmUgX0NFMF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIF9DRV9XUkFQUEVSX1JFR19DU1JfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgMHhDMDAwCisjZGVmaW5lIF9NQUNfV0lGSUNNTl9SRUdfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgTUlTU0lORworCisvKiBCYXNlIEFkZHJlc3NlcyAqLworI2RlZmluZSBRQ0E2MTgwX1JUQ19TT0NfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUUNBNjE4MF9SVENfV01BQ19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFFDQTYxODBfTUFDX0NPRVhfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwZjAwMAorI2RlZmluZSBRQ0E2MTgwX0JUX0NPRVhfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUUNBNjE4MF9TT0NfUENJRV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMTMwMDAwCisjZGVmaW5lIFFDQTYxODBfU09DX0NPUkVfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fVUFSVF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgIDB4MDAxMTEwMDAKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1NJX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFFDQTYxODBfV0xBTl9HUElPX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fQU5BTE9HX0lOVEZfQkFTRV9BRERSRVNTICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX01BQ19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFFDQTYxODBfRUZVU0VfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAyNDAwMAorI2RlZmluZSBRQ0E2MTgwX0ZQR0FfUkVHX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwMzkwMDAKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1VBUlQyX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAweDAwMDU0YzAwCisjZGVmaW5lIFFDQTYxODBfQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgMHgyNEMwMDAKKyNkZWZpbmUgUUNBNjE4MF9DRTBfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAweDI0MDAwMAorI2RlZmluZSBRQ0E2MTgwX0NFMV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MjQxMDAwCisjZGVmaW5lIFFDQTYxODBfQ0UyX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHgyNDIwMDAKKyNkZWZpbmUgUUNBNjE4MF9DRTNfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAweDI0MzAwMAorI2RlZmluZSBRQ0E2MTgwX0NFNF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MjQ0MDAwCisjZGVmaW5lIFFDQTYxODBfQ0U1X0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHgyNDUwMDAKKyNkZWZpbmUgUUNBNjE4MF9DRTZfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAweDI0NjAwMAorI2RlZmluZSBRQ0E2MTgwX0NFN19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MjQ3MDAwCisjZGVmaW5lIFFDQTYxODBfQ0U4X0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHgyNDgwMDAKKyNkZWZpbmUgUUNBNjE4MF9DRTlfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAweDI0OTAwMAorI2RlZmluZSBRQ0E2MTgwX0NFMTBfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIDB4MjRBMDAwCisjZGVmaW5lIFFDQTYxODBfQ0UxMV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgMHgyNEIwMDAKKyNkZWZpbmUgUUNBNjE4MF9BX1NPQ19QQ0lFX1NPQ19QQ0lFX1JFRyAgICAgICAgICAgICAgICAweDEzMDAwMAorI2RlZmluZSBRQ0E2MTgwX0RCSV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwM2MwMDAKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX0FOQUxPR19JTlRGX1BDSUVfQkFTRV9BRERSRVNTICAgICAweDAwMDA3ODAwCisjZGVmaW5lIFFDQTYxODBfV0lGSUNNTl9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBRQ0E2MTgwX0JPQVJEX0RBVEFfU1ogICAgICAgICAgICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9CT0FSRF9FWFRfREFUQV9TWiAgICAgICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfQV9TT0NfUENJRV9QQ0lFX0JBUjBfU1RBUlQgXAorCSgweDAzMCArIFFDQTYxODBfQV9TT0NfUENJRV9TT0NfUENJRV9SRUcpCisjZGVmaW5lIFFDQTYxODBfQV9TT0NfQ09SRV9TQ1JBVENIXzBfQUREUkVTUyAgICAgICAgICAgMHgwMDExNDAwMAorI2RlZmluZSBRQ0E2MTgwX0FfU09DX0NPUkVfU0NSQVRDSF8xX0FERFJFU1MgICAgICAgICAgIDB4MDAxMTQwMDQKKyNkZWZpbmUgUUNBNjE4MF9BX1NPQ19DT1JFX1NDUkFUQ0hfMl9BRERSRVNTICAgICAgICAgICAweDAwMTE0MDA4CisjZGVmaW5lIFFDQTYxODBfQV9TT0NfQ09SRV9TQ1JBVENIXzNfQUREUkVTUyAgICAgICAgICAgMHgwMDExNDAwYworI2RlZmluZSBRQ0E2MTgwX0FfU09DX0NPUkVfU0NSQVRDSF80X0FERFJFU1MgICAgICAgICAgIDB4MDAxMTQwMTAKKyNkZWZpbmUgUUNBNjE4MF9BX1NPQ19DT1JFX1NDUkFUQ0hfNV9BRERSRVNTICAgICAgICAgICAweDAwMTE0MDE0CisjZGVmaW5lIFFDQTYxODBfQV9TT0NfQ09SRV9TQ1JBVENIXzZfQUREUkVTUyAgICAgICAgICAgMHgwMDExNDAxOAorI2RlZmluZSBRQ0E2MTgwX0FfU09DX0NPUkVfU0NSQVRDSF83X0FERFJFU1MgICAgICAgICAgIDB4MDAxMTQwMWMKKyNkZWZpbmUgUUNBNjE4MF9BX1NPQ19DT1JFX1NQQVJFXzBfUkVHSVNURVIgICAgICAgICAgICAweDAwMTEzMTgwCisjZGVmaW5lIFFDQTYxODBfUENJRV9JTlRSX0ZJUk1XQVJFX1JPVVRFX01BU0sgICAgICAgICAgMHhmZgorI2RlZmluZSBRQ0E2MTgwX1NDUkFUQ0hfM19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMTMwMjAKKyNkZWZpbmUgUUNBNjE4MF9UQVJHX0RSQU1fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIFFDQTYxODBfU09DX1NZU1RFTV9TTEVFUF9PRkZTRVQgICAgICAgICAgICAgICAgMHgwMDAwMDBjMAorI2RlZmluZSBRQ0E2MTgwX1NPQ19SRVNFVF9DT05UUk9MX09GRlNFVCBcCisJKDB4MDAwMDAwMDAgKyBfUlRDX1NPQ19SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1NPQ19DTE9DS19DT05UUk9MX09GRlNFVCBcCisJKDB4MDAwMDAwMjggKyBfUlRDX1NPQ19SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1NPQ19DTE9DS19DT05UUk9MX1NJMF9DTEtfTUFTSyAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUUNBNjE4MF9TT0NfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0sgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFFDQTYxODBfV0xBTl9HUElPX1BJTjBfQUREUkVTUyBcCisJKDB4NTAgKyBfR1BJT19BVEhSX1dMQU5fUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX0dQSU9fUElOMV9BRERSRVNTIFwKKwkoMHg1NCArIF9HUElPX0FUSFJfV0xBTl9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1dMQU5fR1BJT19QSU4wX0NPTkZJR19NQVNLICAgICAgICAgICAgIDB4MDAwMDc4MDAKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX0dQSU9fUElOMV9DT05GSUdfTUFTSyAgICAgICAgICAgICAweDAwMDA3ODAwCisjZGVmaW5lIFFDQTYxODBfU09DX0NQVV9DTE9DS19PRkZTRVQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBRQ0E2MTgwX1NPQ19MUE9fQ0FMX09GRlNFVCBcCisJKDB4ZTAgKyBfUlRDX1NPQ19SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1dMQU5fR1BJT19QSU4xMF9BRERSRVNTIFwKKwkoMHg3OCArIF9HUElPX0FUSFJfV0xBTl9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1dMQU5fR1BJT19QSU4xMV9BRERSRVNTIFwKKwkoMHg3YyArIF9HUElPX0FUSFJfV0xBTl9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1dMQU5fR1BJT19QSU4xMl9BRERSRVNTIFwKKwkoMHg4MCArIF9HUElPX0FUSFJfV0xBTl9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1dMQU5fR1BJT19QSU4xM19BRERSRVNTIFwKKwkoMHg4NCArIF9HUElPX0FUSFJfV0xBTl9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCICAgICAgICAgICAgIDAKKyNkZWZpbmUgUUNBNjE4MF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIFFDQTYxODBfU09DX0xQT19DQUxfRU5BQkxFX0xTQiAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgUUNBNjE4MF9TT0NfTFBPX0NBTF9FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX0xTQiAgICAgICAgICAwCisjZGVmaW5lIFFDQTYxODBfV0xBTl9TWVNURU1fU0xFRVBfRElTQUJMRV9NQVNLICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBRQ0E2MTgwX1dMQU5fUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9NQVNLICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1JFU0VUX0NPTlRST0xfV0FSTV9SU1RfTUFTSyAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFFDQTYxODBfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTFNCICAgICAgICAgICAgMTgKKyNkZWZpbmUgUUNBNjE4MF9TSV9DT05GSUdfQklESVJfT0RfREFUQV9NQVNLICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIFFDQTYxODBfU0lfQ09ORklHX0kyQ19MU0IgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUUNBNjE4MF9TSV9DT05GSUdfSTJDX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFFDQTYxODBfU0lfQ09ORklHX1BPU19TQU1QTEVfTFNCICAgICAgICAgICAgICAgNworI2RlZmluZSBRQ0E2MTgwX1NJX0NPTkZJR19QT1NfU0FNUExFX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUUNBNjE4MF9TSV9DT05GSUdfSU5BQ1RJVkVfQ0xLX0xTQiAgICAgICAgICAgICA0CisjZGVmaW5lIFFDQTYxODBfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19NQVNLICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBRQ0E2MTgwX1NJX0NPTkZJR19JTkFDVElWRV9EQVRBX0xTQiAgICAgICAgICAgIDUKKyNkZWZpbmUgUUNBNjE4MF9TSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9NQVNLICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFFDQTYxODBfU0lfQ09ORklHX0RJVklERVJfTFNCICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBRQ0E2MTgwX1NJX0NPTkZJR19ESVZJREVSX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgUUNBNjE4MF9TSV9DT05GSUdfT0ZGU0VUICAgICgweDAwMDAwMDAwICsgX1NJX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfU0lfVFhfREFUQTBfT0ZGU0VUICAoMHgwMDAwMDAwOCArIF9TSV9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1NJX1RYX0RBVEExX09GRlNFVCAgKDB4MDAwMDAwMGMgKyBfU0lfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9TSV9SWF9EQVRBMF9PRkZTRVQgICgweDAwMDAwMDEwICsgX1NJX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfU0lfUlhfREFUQTFfT0ZGU0VUICAoMHgwMDAwMDAxNCArIF9TSV9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1NJX0NTX09GRlNFVCAgICAgICAgKDB4MDAwMDAwMDQgKyBfU0lfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9TSV9DU19ET05FX0VSUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFFDQTYxODBfU0lfQ1NfRE9ORV9JTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBRQ0E2MTgwX1NJX0NTX1NUQVJUX0xTQiAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgUUNBNjE4MF9TSV9DU19TVEFSVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFFDQTYxODBfU0lfQ1NfUlhfQ05UX0xTQiAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBRQ0E2MTgwX1NJX0NTX1JYX0NOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgUUNBNjE4MF9TSV9DU19UWF9DTlRfTFNCICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFFDQTYxODBfU0lfQ1NfVFhfQ05UX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBRQ0E2MTgwX0NFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgUUNBNjE4MF9TUl9XUl9JTkRFWF9BRERSRVNTICAgKDB4MDAzQyArIF9DRTBfQ0VfUkVHX0NTUl9CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfRFNUX1dBVEVSTUFSS19BRERSRVNTICgweDAwNTAgKyBfQ0UwX0NFX1JFR19DU1JfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1JYX01TRFVfRU5EXzRfRklSU1RfTVNEVV9MU0IgICAgICAgICAgIDE0CisjZGVmaW5lIFFDQTYxODBfUlhfTVNEVV9FTkRfNF9GSVJTVF9NU0RVX01BU0sgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBRQ0E2MTgwX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX0xTQiAgICAgICAgICAgIDE2CisjZGVmaW5lIFFDQTYxODBfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTUFTSyAgICAgICAgICAgMHgwZmZmMDAwMAorI2RlZmluZSBRQ0E2MTgwX1JYX01QRFVfU1RBUlRfMl9QTl80N18zMl9MU0IgICAgICAgICAgIDAKKyNkZWZpbmUgUUNBNjE4MF9SWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTUFTSyAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIFFDQTYxODBfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0IgICAgMTYKKyNkZWZpbmUgUUNBNjE4MF9SWF9NU0RVX0VORF8xX0VYVF9XQVBJX1BOXzYzXzQ4X01BU0sgICAweGZmZmYwMDAwCisjZGVmaW5lIFFDQTYxODBfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTFNCICAgICAgICAgICAgMTUKKyNkZWZpbmUgUUNBNjE4MF9SWF9NU0RVX0VORF80X0xBU1RfTVNEVV9NQVNLICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFFDQTYxODBfUlhfQVRURU5USU9OXzBfTUNBU1RfQkNBU1RfTFNCICAgICAgICAgMgorI2RlZmluZSBRQ0E2MTgwX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUUNBNjE4MF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0IgICAgICAgICAgICAxMworI2RlZmluZSBRQ0E2MTgwX1JYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX01BU0sgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUUNBNjE4MF9SWF9BVFRFTlRJT05fMF9NUERVX0xFTkdUSF9FUlJfTUFTSyAgICAweDA4MDAwMDAwCisjZGVmaW5lIFFDQTYxODBfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9MU0IgICAgMTYKKyNkZWZpbmUgUUNBNjE4MF9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX01BU0sgICAweDAwZmYwMDAwCisjZGVmaW5lIFFDQTYxODBfUlhfTVNEVV9TVEFSVF8wX01TRFVfTEVOR1RIX0xTQiAgICAgICAgMAorI2RlZmluZSBRQ0E2MTgwX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9NQVNLICAgICAgIDB4MDAwMDNmZmYKKworI2RlZmluZSBRQ0E2MTgwX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfT0ZGU0VUICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUUNBNjE4MF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX0xTQiAgICAgICA4CisjZGVmaW5lIFFDQTYxODBfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9NQVNLICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBRQ0E2MTgwX1JYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTFNCICAgICAgICAgIDEzCisjZGVmaW5lIFFDQTYxODBfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9NQVNLICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBRQ0E2MTgwX1JYX0FUVEVOVElPTl8wX01PUkVfREFUQV9NQVNLICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUUNBNjE4MF9SWF9BVFRFTlRJT05fMF9NU0RVX0RPTkVfTUFTSyAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFFDQTYxODBfUlhfQVRURU5USU9OXzBfVENQX1VEUF9DSEtTVU1fRkFJTF9NQVNLICAgICAweDAwMDQwMDAwCisjZGVmaW5lIFFDQTYxODBfRFNUX1dSX0lOREVYX0FERFJFU1MgICgweDAwNDAgKyBfQ0UwX0NFX1JFR19DU1JfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1NSQ19XQVRFUk1BUktfQUREUkVTUyAoMHgwMDRjICsgX0NFMF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9TUkNfV0FURVJNQVJLX0xPV19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgUUNBNjE4MF9TUkNfV0FURVJNQVJLX0hJR0hfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgUUNBNjE4MF9EU1RfV0FURVJNQVJLX0xPV19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgUUNBNjE4MF9EU1RfV0FURVJNQVJLX0hJR0hfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgUUNBNjE4MF9DVVJSRU5UX1NSUklfQUREUkVTUyAoMHgwMDQ0ICsgX0NFMF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9DVVJSRU5UX0RSUklfQUREUkVTUyAoMHgwMDQ4ICsgX0NFMF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9IT1NUX0lTX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUUNBNjE4MF9IT1NUX0lTX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfTUFTSyAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUUNBNjE4MF9IT1NUX0lTX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUUNBNjE4MF9IT1NUX0lTX0RTVF9SSU5HX0xPV19XQVRFUk1BUktfTUFTSyAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgUUNBNjE4MF9IT1NUX0lTX0FERFJFU1MgKDB4MDAzMCArIF9DRTBfQ0VfUkVHX0NTUl9CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfTUlTQ19JU19BRERSRVNTICgweDAwMzggKyBfQ0UwX0NFX1JFR19DU1JfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0hPU1RfSVNfQ09QWV9DT01QTEVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBRQ0E2MTgwX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfQUREUkVTUyAgICAgICAgMHgwMDAwCisjZGVmaW5lIFFDQTYxODBfQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUUNBNjE4MF9DRV9XUkFQUEVSX0lOREVYX0JBU0VfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBRQ0E2MTgwX0hPU1RfSUVfQUREUkVTUyAoMHgwMDJDICsgX0NFMF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9IT1NUX0lFX0NPUFlfQ09NUExFVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUUNBNjE4MF9TUl9CQV9BRERSRVNTICAgICAgKDB4MDAwMCArIF9DRTBfQ0VfUkVHX0NTUl9CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfU1JfQkFfQUREUkVTU19ISUdIICgweDAwMDQgKyBfQ0UwX0NFX1JFR19DU1JfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1NSX1NJWkVfQUREUkVTUyAgICAoMHgwMDA4ICsgX0NFMF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9DRV9DVFJMMV9BRERSRVNTICAgKDB4MDAxOCArIF9DRTBfQ0VfUkVHX0NTUl9CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIFFDQTYxODBfRFJfQkFfQUREUkVTUyAgICAgICAoMHgwMDBDICsgX0NFMF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9EUl9CQV9BRERSRVNTX0hJR0ggICgweDAwMEMgKyBfQ0UwX0NFX1JFR19DU1JfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0RSX1NJWkVfQUREUkVTUyAgICAgKDB4MDAxNCArIF9DRTBfQ0VfUkVHX0NTUl9CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQ0VfQ01EX1JFR0lTVEVSICAgICAoMHgwMDIwICsgX0NFMF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9DRV9NU0lfQUREUkVTUyAgICAgICgweDAwNTggKyBfQ0UwX0NFX1JFR19DU1JfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0NFX01TSV9BRERSRVNTX0hJR0ggKDB4MDA1QyArIF9DRTBfQ0VfUkVHX0NTUl9CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQ0VfTVNJX0RBVEEgICAgICAgICAoMHgwMDYwICsgX0NFMF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9DRV9NU0lfRU5BQkxFX0JJVCAgIDE2CisjZGVmaW5lIFFDQTYxODBfTUlTQ19JRV9BRERSRVNTICAgICAoMHgwMDM0ICsgX0NFMF9DRV9SRUdfQ1NSX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9NSVNDX0lTX0FYSV9FUlJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgUUNBNjE4MF9NSVNDX0lTX0RTVF9BRERSX0VSUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgUUNBNjE4MF9NSVNDX0lTX1NSQ19MRU5fRVJSX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgUUNBNjE4MF9NSVNDX0lTX0RTVF9NQVhfTEVOX1ZJT19NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUUNBNjE4MF9NSVNDX0lTX0RTVF9SSU5HX09WRVJGTE9XX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgUUNBNjE4MF9NSVNDX0lTX1NSQ19SSU5HX09WRVJGTE9XX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgUUNBNjE4MF9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0FERFIgICAgICAgICAgICAgIDB4MDAyNEQwMDAKKyNkZWZpbmUgUUNBNjE4MF9TUkNfV0FURVJNQVJLX0xPV19MU0IgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFFDQTYxODBfU1JDX1dBVEVSTUFSS19ISUdIX0xTQiAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFFDQTYxODBfRFNUX1dBVEVSTUFSS19MT1dfTFNCICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBRQ0E2MTgwX0RTVF9XQVRFUk1BUktfSElHSF9MU0IgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBRQ0E2MTgwX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTUFTSyAgMHhmZmYwMDAKKyNkZWZpbmUgUUNBNjE4MF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX0xTQiAgIDEyCisjZGVmaW5lIFFDQTYxODBfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTFNCICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFFDQTYxODBfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0sgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFFDQTYxODBfQ0VfQ1RSTDFfRFNUX1JJTkdfQllURV9TV0FQX0VOX01BU0sgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIFFDQTYxODBfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX0xTQiAgICAgICAgICAxNworI2RlZmluZSBRQ0E2MTgwX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9MU0IgICAgICAgICAgMTgKKyNkZWZpbmUgUUNBNjE4MF9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX01BU0sgIDB4MDAwMDAwNAorI2RlZmluZSBRQ0E2MTgwX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTFNCICAgMgorI2RlZmluZSBRQ0E2MTgwX1NPQ19HTE9CQUxfUkVTRVRfQUREUkVTUyBcCisJKDB4MDAwOCArIF9QQ0lFX0xPQ0FMX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfUlRDX1NUQVRFX0FERFJFU1MgXAorCSgweDAwMDAgKyBfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1JUQ19TVEFURV9DT0xEX1JFU0VUX01BU0sgICAgICAgICAgICAgICAgICAgMHg0MDAKKworI2RlZmluZSBRQ0E2MTgwX1BDSUVfU09DX1dBS0VfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBRQ0E2MTgwX1BDSUVfU09DX1dBS0VfQUREUkVTUyAoMHgwMDA0ICsgX1BDSUVfTE9DQUxfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9QQ0lFX1NPQ19XQUtFX1ZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBRQ0E2MTgwX1JUQ19TVEFURV9WX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBRQ0E2MTgwX1JUQ19TVEFURV9WX0xTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBRQ0E2MTgwX1JUQ19TVEFURV9WX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBRQ0E2MTgwX1BDSUVfTE9DQUxfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFFDQTYxODBfRldfSU5EX0VWRU5UX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFFDQTYxODBfRldfSU5EX0lOSVRJQUxJWkVEICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFFDQTYxODBfRldfSU5EX0hFTFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgUUNBNjE4MF9QQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MgKDB4MDAwYyArIF9TT0NfQ09SRV9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX1BDSUVfSU5UUl9DTFJfQUREUkVTUyAgICAoMHgwMDFjICsgX1NPQ19DT1JFX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfUENJRV9JTlRSX0ZJUk1XQVJFX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFFDQTYxODBfUENJRV9JTlRSX0NFMF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFFDQTYxODBfUENJRV9JTlRSX0NFX01BU0tfQUxMICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIFFDQTYxODBfUENJRV9JTlRSX0NBVVNFX0FERFJFU1MgICgweDAwMTQgKyBfU09DX0NPUkVfUkVHX0JBU0VfQUREUkVTUykKKworI2RlZmluZSBRQ0E2MTgwX0NQVV9JTlRSX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBRQ0E2MTgwX1NPQ19MRl9USU1FUl9DT05UUk9MMF9BRERSRVNTICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBRQ0E2MTgwX1NPQ19MRl9USU1FUl9DT05UUk9MMF9FTkFCTEVfTUFTSyAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBRQ0E2MTgwX1NPQ19SRVNFVF9DT05UUk9MX0FERFJFU1MgXAorCSgweDAwMDAwMDAwICsgX1JUQ19TT0NfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9TT0NfUkVTRVRfQ09OVFJPTF9DRV9SU1RfTUFTSyAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBRQ0E2MTgwX1NPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9NQVNLICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBRQ0E2MTgwX0NPUkVfQ1RSTF9BRERSRVNTICAgICAgICAoMHgwMDAwICsgX1NPQ19DT1JFX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQ09SRV9DVFJMX0NQVV9JTlRSX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFFDQTYxODBfTE9DQUxfU0NSQVRDSF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE4CisjZGVmaW5lIFFDQTYxODBfQ0xPQ0tfR1BJT19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIFFDQTYxODBfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFFDQTYxODBfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX01BU0sgICAgICAgICAgICAwCisjZGVmaW5lIFFDQTYxODBfU09DX0NISVBfSURfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMGYwCisjZGVmaW5lIFFDQTYxODBfU09DX0NISVBfSURfVkVSU0lPTl9NQVNLICAgICAgICAgICAgICAgICAweGZmZmMwMDAwCisjZGVmaW5lIFFDQTYxODBfU09DX0NISVBfSURfVkVSU0lPTl9MU0IgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBRQ0E2MTgwX1NPQ19DSElQX0lEX1JFVklTSU9OX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBRQ0E2MTgwX1NPQ19DSElQX0lEX1JFVklTSU9OX0xTQiAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBRQ0E2MTgwX1NPQ19QT1dFUl9SRUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwYworCisvKiBDb3B5IEVuZ2luZSBEZWJ1ZyAqLworI2RlZmluZSBRQ0E2MTgwX1dMQU5fREVCVUdfSU5QVVRfU0VMX09GRlNFVCAgICAgICAgICAgICAgMHgwMDAwMDEwYworI2RlZmluZSBRQ0E2MTgwX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NU0IgICAgICAgICAgICAgMworI2RlZmluZSBRQ0E2MTgwX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19MU0IgICAgICAgICAgICAgMAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NQVNLICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBRQ0E2MTgwX1dMQU5fREVCVUdfQ09OVFJPTF9PRkZTRVQgICAgICAgICAgICAgICAgMHgwMDAwMDEwOAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTVNCICAgICAgICAgICAgMAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTFNCICAgICAgICAgICAgMAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBRQ0E2MTgwX1dMQU5fREVCVUdfT1VUX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fREVCVUdfT1VUX0RBVEFfTVNCICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX0RFQlVHX09VVF9EQVRBX0xTQiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX0RFQlVHX09VVF9EQVRBX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwZmZmZmYKKyNkZWZpbmUgUUNBNjE4MF9BTUJBX0RFQlVHX0JVU19PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMWMKKyNkZWZpbmUgUUNBNjE4MF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NU0IgICAgICAgIDEzCisjZGVmaW5lIFFDQTYxODBfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTFNCICAgICAgICA4CisjZGVmaW5lIFFDQTYxODBfQU1CQV9ERUJVR19CVVNfUENJRV9ERUJVR19TRUxfTUFTSyAgICAgICAweDAwMDAzZjAwCisjZGVmaW5lIFFDQTYxODBfQU1CQV9ERUJVR19CVVNfU0VMX01TQiAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFFDQTYxODBfQU1CQV9ERUJVR19CVVNfU0VMX0xTQiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFFDQTYxODBfQU1CQV9ERUJVR19CVVNfU0VMX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDFmCisjZGVmaW5lIFFDQTYxODBfQ0VfV1JBUFBFUl9ERUJVR19PRkZTRVQgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUUNBNjE4MF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9NU0IgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUUNBNjE4MF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9MU0IgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUUNBNjE4MF9DRV9XUkFQUEVSX0RFQlVHX1NFTF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgUUNBNjE4MF9DRV9ERUJVR19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NAorI2RlZmluZSBRQ0E2MTgwX0NFX0RFQlVHX1NFTF9NU0IgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBRQ0E2MTgwX0NFX0RFQlVHX1NFTF9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBRQ0E2MTgwX0NFX0RFQlVHX1NFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzZgorLyogRW5kICovCisKKy8qIFBMTCBzdGFydCAqLworI2RlZmluZSBRQ0E2MTgwX0VGVVNFX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyYworI2RlZmluZSBRQ0E2MTgwX0VGVVNFX1hUQUxfU0VMX01TQiAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgUUNBNjE4MF9FRlVTRV9YVEFMX1NFTF9MU0IgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgUUNBNjE4MF9FRlVTRV9YVEFMX1NFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgUUNBNjE4MF9CQl9QTExfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyZjQKKyNkZWZpbmUgUUNBNjE4MF9CQl9QTExfQ09ORklHX09VVERJVl9NU0IgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFFDQTYxODBfQkJfUExMX0NPTkZJR19PVVRESVZfTFNCICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBRQ0E2MTgwX0JCX1BMTF9DT05GSUdfT1VURElWX01BU0sgICAgICAgICAgICAgICAgMHgwMDFjMDAwMAorI2RlZmluZSBRQ0E2MTgwX0JCX1BMTF9DT05GSUdfRlJBQ19NU0IgICAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgUUNBNjE4MF9CQl9QTExfQ09ORklHX0ZSQUNfTFNCICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUUNBNjE4MF9CQl9QTExfQ09ORklHX0ZSQUNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwM2ZmZmYKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NU0IgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfU0VUVExFX1RJTUVfTFNCICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfU0VUVExFX1RJTUVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwN2ZmCisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfU0VUVExFX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDAwMTgKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1BMTF9TRVRUTEVfU1dfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDA3ZmYKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1BMTF9TRVRUTEVfUlNUTUFTSyAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1BMTF9TRVRUTEVfUkVTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1BMTF9DT05UUk9MX05PUFdEX01TQiAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9MU0IgICAgICAgICAgICAgICAxOAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTUFTSyAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01TQiAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1BMTF9DT05UUk9MX0JZUEFTU19MU0IgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTUFTSyAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfUkVTRVQgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTVNCICAgICAgICAgICAgIDE1CisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX0xTQiAgICAgICAgICAgICAxNAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9NQVNLICAgICAgICAgICAgMHgwMDAwYzAwMAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9SRVNFVCAgICAgICAgICAgMHgwCisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTVNCICAgICAgICAgICAgICAxMworI2RlZmluZSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfUkVGRElWX0xTQiAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NQVNLICAgICAgICAgICAgIDB4MDAwMDNjMDAKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9SRVNFVCAgICAgICAgICAgIDB4MAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfRElWX01TQiAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfRElWX0xTQiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfRElWX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDNmZgorI2RlZmluZSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfRElWX1JFU0VUICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfT0ZGU0VUICAgICAgICAgICAgICAgICAgMHgwMDE0CisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9TV19NQVNLICAgICAgICAgICAgICAgICAweDAwMWZmZmZmCisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9SU1RNQVNLICAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9SRVNFVCAgICAgICAgICAgICAgICAgICAweDAwMDEwMDExCisjZGVmaW5lIFFDQTYxODBfU09DX0NPUkVfQ0xLX0NUUkxfT0ZGU0VUICAgICAgICAgICAgICAgICAweDAwMDAwMTE0CisjZGVmaW5lIFFDQTYxODBfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01TQiAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFFDQTYxODBfU09DX0NPUkVfQ0xLX0NUUkxfRElWX0xTQiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFFDQTYxODBfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIFFDQTYxODBfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NU0IgICAgICAgICA1CisjZGVmaW5lIFFDQTYxODBfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19MU0IgICAgICAgICA1CisjZGVmaW5lIFFDQTYxODBfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NQVNLICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFFDQTYxODBfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19SRVNFVCAgICAgICAweDAKKyNkZWZpbmUgUUNBNjE4MF9SVENfU1lOQ19TVEFUVVNfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MDI0NAorI2RlZmluZSBRQ0E2MTgwX1NPQ19DUFVfQ0xPQ0tfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBRQ0E2MTgwX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTVNCICAgICAgICAgICAgICAgMQorI2RlZmluZSBRQ0E2MTgwX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBRQ0E2MTgwX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMworLyogUExMIGVuZCAqLworCisjZGVmaW5lIFFDQTYxODBfUENJRV9JTlRSX0NFX01BU0sobikgIChRQ0E2MTgwX1BDSUVfSU5UUl9DRTBfTUFTSyA8PCAobikpCisjZGVmaW5lIFFDQTYxODBfRFJBTV9CQVNFX0FERFJFU1MgICAgIFFDQTYxODBfVEFSR19EUkFNX1NUQVJUCisjZGVmaW5lIFFDQTYxODBfRldfSU5ESUNBVE9SX0FERFJFU1MgXAorCShRQ0E2MTgwX1dJRklDTU5fQkFTRV9BRERSRVNTICsgUUNBNjE4MF9TQ1JBVENIXzNfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9TWVNURU1fU0xFRVBfT0ZGU0VUICAgICAgIFFDQTYxODBfU09DX1NZU1RFTV9TTEVFUF9PRkZTRVQKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1NZU1RFTV9TTEVFUF9PRkZTRVQgICgweDAwMmMgKyBfV0lGSV9SVENfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9XTEFOX1JFU0VUX0NPTlRST0xfT0ZGU0VUICgweDAwMDAgKyBfV0lGSV9SVENfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9DTE9DS19DT05UUk9MX09GRlNFVCAgICAgIFFDQTYxODBfU09DX0NMT0NLX0NPTlRST0xfT0ZGU0VUCisjZGVmaW5lIFFDQTYxODBfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0sgXAorCVFDQTYxODBfU09DX0NMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLCisjZGVmaW5lIFFDQTYxODBfUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9NQVNLIDB4MDAwMDAwMDQKKyNkZWZpbmUgUUNBNjE4MF9SRVNFVF9DT05UUk9MX1NJMF9SU1RfTUFTSyBcCisJUUNBNjE4MF9TT0NfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0sKKyNkZWZpbmUgUUNBNjE4MF9HUElPX0JBU0VfQUREUkVTUyAgICAgICAgIFFDQTYxODBfV0xBTl9HUElPX0JBU0VfQUREUkVTUworI2RlZmluZSBRQ0E2MTgwX0dQSU9fUElOMF9PRkZTRVQgICAgICAgICAgUUNBNjE4MF9XTEFOX0dQSU9fUElOMF9BRERSRVNTCisjZGVmaW5lIFFDQTYxODBfR1BJT19QSU4xX09GRlNFVCAgICAgICAgICBRQ0E2MTgwX1dMQU5fR1BJT19QSU4xX0FERFJFU1MKKyNkZWZpbmUgUUNBNjE4MF9HUElPX1BJTjBfQ09ORklHX01BU0sgICAgIFFDQTYxODBfV0xBTl9HUElPX1BJTjBfQ09ORklHX01BU0sKKyNkZWZpbmUgUUNBNjE4MF9HUElPX1BJTjFfQ09ORklHX01BU0sgICAgIFFDQTYxODBfV0xBTl9HUElPX1BJTjFfQ09ORklHX01BU0sKKyNkZWZpbmUgUUNBNjE4MF9TSV9CQVNFX0FERFJFU1MgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUUNBNjE4MF9DUFVfQ0xPQ0tfT0ZGU0VUICAgICAgICAgICgweDIwICsgX1JUQ19TT0NfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9MUE9fQ0FMX09GRlNFVCAgICAgICAgICAgIFFDQTYxODBfU09DX0xQT19DQUxfT0ZGU0VUCisjZGVmaW5lIFFDQTYxODBfR1BJT19QSU4xMF9PRkZTRVQgICAgICAgICBRQ0E2MTgwX1dMQU5fR1BJT19QSU4xMF9BRERSRVNTCisjZGVmaW5lIFFDQTYxODBfR1BJT19QSU4xMV9PRkZTRVQgICAgICAgICBRQ0E2MTgwX1dMQU5fR1BJT19QSU4xMV9BRERSRVNTCisjZGVmaW5lIFFDQTYxODBfR1BJT19QSU4xMl9PRkZTRVQgICAgICAgICBRQ0E2MTgwX1dMQU5fR1BJT19QSU4xMl9BRERSRVNTCisjZGVmaW5lIFFDQTYxODBfR1BJT19QSU4xM19PRkZTRVQgICAgICAgICBRQ0E2MTgwX1dMQU5fR1BJT19QSU4xM19BRERSRVNTCisjZGVmaW5lIFFDQTYxODBfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiAgICAwCisjZGVmaW5lIFFDQTYxODBfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgICAweDEKKyNkZWZpbmUgUUNBNjE4MF9MUE9fQ0FMX0VOQUJMRV9MU0IgICAgICAgIFFDQTYxODBfU09DX0xQT19DQUxfRU5BQkxFX0xTQgorI2RlZmluZSBRQ0E2MTgwX0xQT19DQUxfRU5BQkxFX01BU0sgICAgICAgUUNBNjE4MF9TT0NfTFBPX0NBTF9FTkFCTEVfTUFTSworI2RlZmluZSBRQ0E2MTgwX0FOQUxPR19JTlRGX0JBU0VfQUREUkVTUyAgUUNBNjE4MF9XTEFOX0FOQUxPR19JTlRGX0JBU0VfQUREUkVTUworI2RlZmluZSBRQ0E2MTgwX01CT1hfQkFTRV9BRERSRVNTICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBRQ0E2MTgwX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX0xTQiAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTUFTSyAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9JTlRfU1RBVFVTX0VOQUJMRV9DUFVfTFNCICAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9NQVNLICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9MU0IgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9JTlRfU1RBVFVTX0VOQUJMRV9DT1VOVEVSX01BU0sgICAgICAgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9MU0IgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfSU5UX1NUQVRVU19FTkFCTEVfTUJPWF9EQVRBX01BU0sgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19MU0IgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX01BU0sgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfRVJST1JfU1RBVFVTX0VOQUJMRV9UWF9PVkVSRkxPV19MU0IgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9FUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XX01BU0sgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfQ09VTlRFUl9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSyAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9JTlRfU1RBVFVTX0VOQUJMRV9BRERSRVNTICAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTFNCICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9IT1NUX0lOVF9TVEFUVVNfQUREUkVTUyAgICAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX0NQVV9JTlRfU1RBVFVTX0FERFJFU1MgICAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfRVJST1JfSU5UX1NUQVRVU19BRERSRVNTICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9NQVNLICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX0xTQiAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTUFTSyAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9FUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPV19MU0IgICAgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSyAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPV19MU0IgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9DT1VOVF9ERUNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX0hPU1RfSU5UX1NUQVRVU19DUFVfTUFTSyAgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfSE9TVF9JTlRfU1RBVFVTX0NQVV9MU0IgICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTUFTSyAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX0hPU1RfSU5UX1NUQVRVU19FUlJPUl9MU0IgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTUFTSyAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9MU0IgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX1JYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfV0lORE9XX0RBVEFfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIE1JU1NJTkcKKyNkZWZpbmUgUUNBNjE4MF9XSU5ET1dfUkVBRF9BRERSX0FERFJFU1MgICAgICAgICAgICAgICAgTUlTU0lORworI2RlZmluZSBRQ0E2MTgwX1dJTkRPV19XUklURV9BRERSX0FERFJFU1MgICAgICAgICAgICAgICBNSVNTSU5HCisjZGVmaW5lIFFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzAgXAorCSgweDAwMjQgKyBfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xIFwKKwkoMHgwMDI4ICsgX1BDSUVfTE9DQUxfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMiBcCisJKDB4MDAyQyArIF9QQ0lFX0xPQ0FMX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzMgXAorCSgweDAwMzAgKyBfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV80IFwKKwkoMHgwMDM0ICsgX1BDSUVfTE9DQUxfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfNSBcCisJKDB4MDAzOCArIF9QQ0lFX0xPQ0FMX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzYgXAorCSgweDAwM0MgKyBfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV83IFwKKwkoMHgwMDQwICsgX1BDSUVfTE9DQUxfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfOCBcCisJKDB4MDA0NCArIF9QQ0lFX0xPQ0FMX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzkgXAorCSgweDAwNDggKyBfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xMCBcCisJKDB4MDA0QyArIF9QQ0lFX0xPQ0FMX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzExIFwKKwkoMHgwMDUwICsgX1BDSUVfTE9DQUxfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTIgXAorCSgweDAwNTQgKyBfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xMyBcCisJKDB4MDA1OCArIF9QQ0lFX0xPQ0FMX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE0IFwKKwkoMHgwMDVDICsgX1BDSUVfTE9DQUxfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTUgXAorCSgweDAwNjAgKyBfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xNiBcCisJKDB4MDA2NCArIF9QQ0lFX0xPQ0FMX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE3IFwKKwkoMHgwMDY4ICsgX1BDSUVfTE9DQUxfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTggXAorCSgweDAwNkMgKyBfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8xOSBcCisJKDB4MDA3MCArIF9QQ0lFX0xPQ0FMX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIwIFwKKwkoMHgwMDc0ICsgX1BDSUVfTE9DQUxfUkVHX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjEgXAorCSgweDAwNzggKyBfUENJRV9MT0NBTF9SRUdfQkFTRV9BRERSRVNTKQorI2RlZmluZSBRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8yMiBcCisJKDB4MDA3QyArIF9QQ0lFX0xPQ0FMX1JFR19CQVNFX0FERFJFU1MpCisjZGVmaW5lIFFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIzIFwKKwkoMHgwMDgwICsgX1BDSUVfTE9DQUxfUkVHX0JBU0VfQUREUkVTUykKKworCisvKiBRNiBpSGVsaXVtIGVtdWxhdGlvbiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUUNBNjE4MF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9DQVVTRV9HUlAxCTB4MDAxMTMwMTgKKyNkZWZpbmUgUUNBNjE4MF9BX1NPQ19DT1JFX1NQQVJFXzFfUkVHSVNURVIJMHgwMDExMzE4NAorI2RlZmluZSBRQ0E2MTgwX0FfU09DX0NPUkVfUENJRV9JTlRSX0NMUl9HUlAxCTB4MDAxMTMwMjAKKyNkZWZpbmUgUUNBNjE4MF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9FTkFCTEVfR1JQMQkweDAwMTEzMDEwCisjZGVmaW5lIFFDQTYxODBfQV9TT0NfUENJRV9QQ0lFX1NDUkFUQ0hfMAkweDAwMTMwMDQwCisjZGVmaW5lIFFDQTYxODBfQV9TT0NfUENJRV9QQ0lFX1NDUkFUQ0hfMQkweDAwMTMwMDQ0CisjZGVmaW5lIFFDQTYxODBfQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTBfVEFSR0VUX0lFCTB4MDAyNDAwMjQKKyNkZWZpbmUgUUNBNjE4MF9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMF9UQVJHRVRfSVMJMHgwMDI0MDAyOAorI2RlZmluZSBRQ0E2MTgwX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UxX1RBUkdFVF9JRQkweDAwMjQxMDI0CisjZGVmaW5lIFFDQTYxODBfQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTFfVEFSR0VUX0lTCTB4MDAyNDEwMjgKKyNkZWZpbmUgUUNBNjE4MF9BX1dJRklfQVBCXzFfQV9XRlNTX0NFMl9UQVJHRVRfSUUJMHgwMDI0MjAyNAorI2RlZmluZSBRQ0E2MTgwX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0UyX1RBUkdFVF9JUwkweDAwMjQyMDI4CisjZGVmaW5lIFFDQTYxODBfQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTNfVEFSR0VUX0lFCTB4MDAyNDMwMjQKKyNkZWZpbmUgUUNBNjE4MF9BX1dJRklfQVBCXzFfQV9XRlNTX0NFM19UQVJHRVRfSVMJMHgwMDI0MzAyOAorI2RlZmluZSBRQ0E2MTgwX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U0X1RBUkdFVF9JRQkweDAwMjQ0MDI0CisjZGVmaW5lIFFDQTYxODBfQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTRfVEFSR0VUX0lTCTB4MDAyNDQwMjgKKyNkZWZpbmUgUUNBNjE4MF9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNV9UQVJHRVRfSUUJMHgwMDI0NTAyNAorI2RlZmluZSBRQ0E2MTgwX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U1X1RBUkdFVF9JUwkweDAwMjQ1MDI4CisjZGVmaW5lIFFDQTYxODBfQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTZfVEFSR0VUX0lFCTB4MDAyNDYwMjQKKyNkZWZpbmUgUUNBNjE4MF9BX1dJRklfQVBCXzFfQV9XRlNTX0NFNl9UQVJHRVRfSVMJMHgwMDI0NjAyOAorI2RlZmluZSBRQ0E2MTgwX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0U3X1RBUkdFVF9JRQkweDAwMjQ3MDI0CisjZGVmaW5lIFFDQTYxODBfQV9XSUZJX0FQQl8xX0FfV0ZTU19DRTdfVEFSR0VUX0lTCTB4MDAyNDcwMjgKKyNkZWZpbmUgUUNBNjE4MF9BX1dJRklfQVBCXzFfQV9XRlNTX0NFX1RBUkdFVF9IT1NUX0RFTFRBCTB4MDgKKyNkZWZpbmUgUUNBNjE4MF9BX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8yCTB4MDAxMzAwNUMKKyNkZWZpbmUgUUNBNjE4MF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9FTkFCTEVfR1JQMF9RNl9NQVNLICAgICAgICAweDAKKy8qIGVuZDogUTYgaUhlbGl1bSBlbXVsYXRpb24gcmVnaXN0ZXJzICovCisKK3N0cnVjdCB0YXJnZXRkZWZfcyBxY2E2MTgwX3RhcmdldGRlZiA9IHsKKwkuZF9SVENfU09DX0JBU0VfQUREUkVTUyA9IFFDQTYxODBfUlRDX1NPQ19CQVNFX0FERFJFU1MsCisJLmRfUlRDX1dNQUNfQkFTRV9BRERSRVNTID0gUUNBNjE4MF9SVENfV01BQ19CQVNFX0FERFJFU1MsCisJLmRfU1lTVEVNX1NMRUVQX09GRlNFVCA9IFFDQTYxODBfV0xBTl9TWVNURU1fU0xFRVBfT0ZGU0VULAorCS5kX1dMQU5fU1lTVEVNX1NMRUVQX09GRlNFVCA9IFFDQTYxODBfV0xBTl9TWVNURU1fU0xFRVBfT0ZGU0VULAorCS5kX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTFNCID0KKwlRQ0E2MTgwX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTFNCLAorCS5kX1dMQU5fU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSyA9CisJUUNBNjE4MF9XTEFOX1NZU1RFTV9TTEVFUF9ESVNBQkxFX01BU0ssCisJLmRfQ0xPQ0tfQ09OVFJPTF9PRkZTRVQgPSBRQ0E2MTgwX0NMT0NLX0NPTlRST0xfT0ZGU0VULAorCS5kX0NMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLID0gUUNBNjE4MF9DTE9DS19DT05UUk9MX1NJMF9DTEtfTUFTSywKKwkuZF9SRVNFVF9DT05UUk9MX09GRlNFVCA9IFFDQTYxODBfU09DX1JFU0VUX0NPTlRST0xfT0ZGU0VULAorCS5kX1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfTUFTSyA9IFFDQTYxODBfUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9NQVNLLAorCS5kX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLID0gUUNBNjE4MF9SRVNFVF9DT05UUk9MX1NJMF9SU1RfTUFTSywKKwkuZF9XTEFOX1JFU0VUX0NPTlRST0xfT0ZGU0VUID0gUUNBNjE4MF9XTEFOX1JFU0VUX0NPTlRST0xfT0ZGU0VULAorCS5kX1dMQU5fUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9NQVNLID0KKwlRQ0E2MTgwX1dMQU5fUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9NQVNLLAorCS5kX1dMQU5fUkVTRVRfQ09OVFJPTF9XQVJNX1JTVF9NQVNLID0KKwlRQ0E2MTgwX1dMQU5fUkVTRVRfQ09OVFJPTF9XQVJNX1JTVF9NQVNLLAorCS5kX0dQSU9fQkFTRV9BRERSRVNTID0gUUNBNjE4MF9HUElPX0JBU0VfQUREUkVTUywKKwkuZF9HUElPX1BJTjBfT0ZGU0VUID0gUUNBNjE4MF9HUElPX1BJTjBfT0ZGU0VULAorCS5kX0dQSU9fUElOMV9PRkZTRVQgPSBRQ0E2MTgwX0dQSU9fUElOMV9PRkZTRVQsCisJLmRfR1BJT19QSU4wX0NPTkZJR19NQVNLID0gUUNBNjE4MF9HUElPX1BJTjBfQ09ORklHX01BU0ssCisJLmRfR1BJT19QSU4xX0NPTkZJR19NQVNLID0gUUNBNjE4MF9HUElPX1BJTjFfQ09ORklHX01BU0ssCisJLmRfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTFNCID0gUUNBNjE4MF9TSV9DT05GSUdfQklESVJfT0RfREFUQV9MU0IsCisJLmRfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTUFTSyA9IFFDQTYxODBfU0lfQ09ORklHX0JJRElSX09EX0RBVEFfTUFTSywKKwkuZF9TSV9DT05GSUdfSTJDX0xTQiA9IFFDQTYxODBfU0lfQ09ORklHX0kyQ19MU0IsCisJLmRfU0lfQ09ORklHX0kyQ19NQVNLID0gUUNBNjE4MF9TSV9DT05GSUdfSTJDX01BU0ssCisJLmRfU0lfQ09ORklHX1BPU19TQU1QTEVfTFNCID0gUUNBNjE4MF9TSV9DT05GSUdfUE9TX1NBTVBMRV9MU0IsCisJLmRfU0lfQ09ORklHX1BPU19TQU1QTEVfTUFTSyA9IFFDQTYxODBfU0lfQ09ORklHX1BPU19TQU1QTEVfTUFTSywKKwkuZF9TSV9DT05GSUdfSU5BQ1RJVkVfQ0xLX0xTQiA9IFFDQTYxODBfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19MU0IsCisJLmRfU0lfQ09ORklHX0lOQUNUSVZFX0NMS19NQVNLID0gUUNBNjE4MF9TSV9DT05GSUdfSU5BQ1RJVkVfQ0xLX01BU0ssCisJLmRfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTFNCID0gUUNBNjE4MF9TSV9DT05GSUdfSU5BQ1RJVkVfREFUQV9MU0IsCisJLmRfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSyA9IFFDQTYxODBfU0lfQ09ORklHX0lOQUNUSVZFX0RBVEFfTUFTSywKKwkuZF9TSV9DT05GSUdfRElWSURFUl9MU0IgPSBRQ0E2MTgwX1NJX0NPTkZJR19ESVZJREVSX0xTQiwKKwkuZF9TSV9DT05GSUdfRElWSURFUl9NQVNLID0gUUNBNjE4MF9TSV9DT05GSUdfRElWSURFUl9NQVNLLAorCS5kX1NJX0JBU0VfQUREUkVTUyA9IFFDQTYxODBfU0lfQkFTRV9BRERSRVNTLAorCS5kX1NJX0NPTkZJR19PRkZTRVQgPSBRQ0E2MTgwX1NJX0NPTkZJR19PRkZTRVQsCisJLmRfU0lfVFhfREFUQTBfT0ZGU0VUID0gUUNBNjE4MF9TSV9UWF9EQVRBMF9PRkZTRVQsCisJLmRfU0lfVFhfREFUQTFfT0ZGU0VUID0gUUNBNjE4MF9TSV9UWF9EQVRBMV9PRkZTRVQsCisJLmRfU0lfUlhfREFUQTBfT0ZGU0VUID0gUUNBNjE4MF9TSV9SWF9EQVRBMF9PRkZTRVQsCisJLmRfU0lfUlhfREFUQTFfT0ZGU0VUID0gUUNBNjE4MF9TSV9SWF9EQVRBMV9PRkZTRVQsCisJLmRfU0lfQ1NfT0ZGU0VUID0gUUNBNjE4MF9TSV9DU19PRkZTRVQsCisJLmRfU0lfQ1NfRE9ORV9FUlJfTUFTSyA9IFFDQTYxODBfU0lfQ1NfRE9ORV9FUlJfTUFTSywKKwkuZF9TSV9DU19ET05FX0lOVF9NQVNLID0gUUNBNjE4MF9TSV9DU19ET05FX0lOVF9NQVNLLAorCS5kX1NJX0NTX1NUQVJUX0xTQiA9IFFDQTYxODBfU0lfQ1NfU1RBUlRfTFNCLAorCS5kX1NJX0NTX1NUQVJUX01BU0sgPSBRQ0E2MTgwX1NJX0NTX1NUQVJUX01BU0ssCisJLmRfU0lfQ1NfUlhfQ05UX0xTQiA9IFFDQTYxODBfU0lfQ1NfUlhfQ05UX0xTQiwKKwkuZF9TSV9DU19SWF9DTlRfTUFTSyA9IFFDQTYxODBfU0lfQ1NfUlhfQ05UX01BU0ssCisJLmRfU0lfQ1NfVFhfQ05UX0xTQiA9IFFDQTYxODBfU0lfQ1NfVFhfQ05UX0xTQiwKKwkuZF9TSV9DU19UWF9DTlRfTUFTSyA9IFFDQTYxODBfU0lfQ1NfVFhfQ05UX01BU0ssCisJLmRfQk9BUkRfREFUQV9TWiA9IFFDQTYxODBfQk9BUkRfREFUQV9TWiwKKwkuZF9CT0FSRF9FWFRfREFUQV9TWiA9IFFDQTYxODBfQk9BUkRfRVhUX0RBVEFfU1osCisJLmRfTUJPWF9CQVNFX0FERFJFU1MgPSBRQ0E2MTgwX01CT1hfQkFTRV9BRERSRVNTLAorCS5kX0xPQ0FMX1NDUkFUQ0hfT0ZGU0VUID0gUUNBNjE4MF9MT0NBTF9TQ1JBVENIX09GRlNFVCwKKwkuZF9DUFVfQ0xPQ0tfT0ZGU0VUID0gUUNBNjE4MF9DUFVfQ0xPQ0tfT0ZGU0VULAorCS5kX0xQT19DQUxfT0ZGU0VUID0gUUNBNjE4MF9MUE9fQ0FMX09GRlNFVCwKKwkuZF9HUElPX1BJTjEwX09GRlNFVCA9IFFDQTYxODBfR1BJT19QSU4xMF9PRkZTRVQsCisJLmRfR1BJT19QSU4xMV9PRkZTRVQgPSBRQ0E2MTgwX0dQSU9fUElOMTFfT0ZGU0VULAorCS5kX0dQSU9fUElOMTJfT0ZGU0VUID0gUUNBNjE4MF9HUElPX1BJTjEyX09GRlNFVCwKKwkuZF9HUElPX1BJTjEzX09GRlNFVCA9IFFDQTYxODBfR1BJT19QSU4xM19PRkZTRVQsCisJLmRfQ0xPQ0tfR1BJT19PRkZTRVQgPSBRQ0E2MTgwX0NMT0NLX0dQSU9fT0ZGU0VULAorCS5kX0NQVV9DTE9DS19TVEFOREFSRF9MU0IgPSBRQ0E2MTgwX0NQVV9DTE9DS19TVEFOREFSRF9MU0IsCisJLmRfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgPSBRQ0E2MTgwX0NQVV9DTE9DS19TVEFOREFSRF9NQVNLLAorCS5kX0xQT19DQUxfRU5BQkxFX0xTQiA9IFFDQTYxODBfTFBPX0NBTF9FTkFCTEVfTFNCLAorCS5kX0xQT19DQUxfRU5BQkxFX01BU0sgPSBRQ0E2MTgwX0xQT19DQUxfRU5BQkxFX01BU0ssCisJLmRfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQiA9IFFDQTYxODBfQ0xPQ0tfR1BJT19CVF9DTEtfT1VUX0VOX0xTQiwKKwkuZF9DTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTUFTSyA9CisJUUNBNjE4MF9DTE9DS19HUElPX0JUX0NMS19PVVRfRU5fTUFTSywKKwkuZF9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MgPSBRQ0E2MTgwX0FOQUxPR19JTlRGX0JBU0VfQUREUkVTUywKKwkuZF9XTEFOX01BQ19CQVNFX0FERFJFU1MgPSBRQ0E2MTgwX1dMQU5fTUFDX0JBU0VfQUREUkVTUywKKwkuZF9GV19JTkRJQ0FUT1JfQUREUkVTUyA9IFFDQTYxODBfRldfSU5ESUNBVE9SX0FERFJFU1MsCisJLmRfRFJBTV9CQVNFX0FERFJFU1MgPSBRQ0E2MTgwX0RSQU1fQkFTRV9BRERSRVNTLAorCS5kX1NPQ19DT1JFX0JBU0VfQUREUkVTUyA9IFFDQTYxODBfU09DX0NPUkVfQkFTRV9BRERSRVNTLAorCS5kX0NPUkVfQ1RSTF9BRERSRVNTID0gUUNBNjE4MF9DT1JFX0NUUkxfQUREUkVTUywKKwkuZF9DRV9DT1VOVCA9IFFDQTYxODBfQ0VfQ09VTlQsCisJLmRfTVNJX05VTV9SRVFVRVNUID0gTVNJX05VTV9SRVFVRVNULAorCS5kX01TSV9BU1NJR05fRlcgPSBNU0lfQVNTSUdOX0ZXLAorCS5kX01TSV9BU1NJR05fQ0VfSU5JVElBTCA9IE1TSV9BU1NJR05fQ0VfSU5JVElBTCwKKwkuZF9QQ0lFX0lOVFJfRU5BQkxFX0FERFJFU1MgPSBRQ0E2MTgwX1BDSUVfSU5UUl9FTkFCTEVfQUREUkVTUywKKwkuZF9QQ0lFX0lOVFJfQ0xSX0FERFJFU1MgPSBRQ0E2MTgwX1BDSUVfSU5UUl9DTFJfQUREUkVTUywKKwkuZF9QQ0lFX0lOVFJfRklSTVdBUkVfTUFTSyA9IFFDQTYxODBfUENJRV9JTlRSX0ZJUk1XQVJFX01BU0ssCisJLmRfUENJRV9JTlRSX0NFX01BU0tfQUxMID0gUUNBNjE4MF9QQ0lFX0lOVFJfQ0VfTUFTS19BTEwsCisJLmRfQ09SRV9DVFJMX0NQVV9JTlRSX01BU0sgPSBRQ0E2MTgwX0NPUkVfQ1RSTF9DUFVfSU5UUl9NQVNLLAorCS5kX1NSX1dSX0lOREVYX0FERFJFU1MgPSBRQ0E2MTgwX1NSX1dSX0lOREVYX0FERFJFU1MsCisJLmRfRFNUX1dBVEVSTUFSS19BRERSRVNTID0gUUNBNjE4MF9EU1RfV0FURVJNQVJLX0FERFJFU1MsCisJLyogaHR0X3J4LmMgKi8KKwkuZF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSyA9CisJUUNBNjE4MF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTUFTSywKKwkuZF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTFNCID0gUUNBNjE4MF9SWF9NU0RVX0VORF80X0ZJUlNUX01TRFVfTFNCLAorCS5kX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX01BU0sgPSBRQ0E2MTgwX1JYX01QRFVfU1RBUlRfMF9TRVFfTlVNX01BU0ssCisJLmRfUlhfTVBEVV9TVEFSVF8wX1NFUV9OVU1fTFNCID0gUUNBNjE4MF9SWF9NUERVX1NUQVJUXzBfU0VRX05VTV9MU0IsCisJLmRfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX0xTQiA9IFFDQTYxODBfUlhfTVBEVV9TVEFSVF8yX1BOXzQ3XzMyX0xTQiwKKwkuZF9SWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTUFTSyA9CisJUUNBNjE4MF9SWF9NUERVX1NUQVJUXzJfUE5fNDdfMzJfTUFTSywKKwkuZF9SWF9NU0RVX0VORF8xX0VYVF9XQVBJX1BOXzYzXzQ4X01BU0sgPQorCQlRQ0E2MTgwX1JYX01TRFVfRU5EXzFfRVhUX1dBUElfUE5fNjNfNDhfTUFTSywKKwkuZF9SWF9NU0RVX0VORF8xX0VYVF9XQVBJX1BOXzYzXzQ4X0xTQiA9CisJCVFDQTYxODBfUlhfTVNEVV9FTkRfMV9FWFRfV0FQSV9QTl82M180OF9MU0IsCisJLmRfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTUFTSyA9IFFDQTYxODBfUlhfTVNEVV9FTkRfNF9MQVNUX01TRFVfTUFTSywKKwkuZF9SWF9NU0RVX0VORF80X0xBU1RfTVNEVV9MU0IgPSBRQ0E2MTgwX1JYX01TRFVfRU5EXzRfTEFTVF9NU0RVX0xTQiwKKwkuZF9SWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9NQVNLID0KKwkJUUNBNjE4MF9SWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9NQVNLLAorCS5kX1JYX0FUVEVOVElPTl8wX01DQVNUX0JDQVNUX0xTQiA9CisJUUNBNjE4MF9SWF9BVFRFTlRJT05fMF9NQ0FTVF9CQ0FTVF9MU0IsCisJLmRfUlhfQVRURU5USU9OXzBfRlJBR01FTlRfTUFTSyA9IFFDQTYxODBfUlhfQVRURU5USU9OXzBfRlJBR01FTlRfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9GUkFHTUVOVF9MU0IgPSBRQ0E2MTgwX1JYX0FUVEVOVElPTl8wX0ZSQUdNRU5UX0xTQiwKKwkuZF9SWF9BVFRFTlRJT05fMF9NUERVX0xFTkdUSF9FUlJfTUFTSyA9CisJCVFDQTYxODBfUlhfQVRURU5USU9OXzBfTVBEVV9MRU5HVEhfRVJSX01BU0ssCisJLmRfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9NQVNLID0KKwkJUUNBNjE4MF9SWF9GUkFHX0lORk9fMF9SSU5HMl9NT1JFX0NPVU5UX01BU0ssCisJLmRfUlhfRlJBR19JTkZPXzBfUklORzJfTU9SRV9DT1VOVF9MU0IgPQorCQlRQ0E2MTgwX1JYX0ZSQUdfSU5GT18wX1JJTkcyX01PUkVfQ09VTlRfTFNCLAorCS5kX1JYX01TRFVfU1RBUlRfMF9NU0RVX0xFTkdUSF9NQVNLID0KKwkJUUNBNjE4MF9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTUFTSywKKwkuZF9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTFNCID0KKwkJUUNBNjE4MF9SWF9NU0RVX1NUQVJUXzBfTVNEVV9MRU5HVEhfTFNCLAorCS5kX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfT0ZGU0VUID0KKwkJUUNBNjE4MF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX09GRlNFVCwKKwkuZF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX01BU0sgPQorCQlRQ0E2MTgwX1JYX01TRFVfU1RBUlRfMl9ERUNBUF9GT1JNQVRfTUFTSywKKwkuZF9SWF9NU0RVX1NUQVJUXzJfREVDQVBfRk9STUFUX0xTQiA9CisJCVFDQTYxODBfUlhfTVNEVV9TVEFSVF8yX0RFQ0FQX0ZPUk1BVF9MU0IsCisJLmRfUlhfTVBEVV9TVEFSVF8wX0VOQ1JZUFRFRF9NQVNLID0KKwlRQ0E2MTgwX1JYX01QRFVfU1RBUlRfMF9FTkNSWVBURURfTUFTSywKKwkuZF9SWF9NUERVX1NUQVJUXzBfRU5DUllQVEVEX0xTQiA9CisJUUNBNjE4MF9SWF9NUERVX1NUQVJUXzBfRU5DUllQVEVEX0xTQiwKKwkuZF9SWF9BVFRFTlRJT05fMF9NT1JFX0RBVEFfTUFTSyA9CisJUUNBNjE4MF9SWF9BVFRFTlRJT05fMF9NT1JFX0RBVEFfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9NU0RVX0RPTkVfTUFTSyA9CisJUUNBNjE4MF9SWF9BVFRFTlRJT05fMF9NU0RVX0RPTkVfTUFTSywKKwkuZF9SWF9BVFRFTlRJT05fMF9UQ1BfVURQX0NIS1NVTV9GQUlMX01BU0sgPQorCQlRQ0E2MTgwX1JYX0FUVEVOVElPTl8wX1RDUF9VRFBfQ0hLU1VNX0ZBSUxfTUFTSywKKworCS8qIFBMTCBzdGFydCAqLworCS5kX0VGVVNFX09GRlNFVCA9IFFDQTYxODBfRUZVU0VfT0ZGU0VULAorCS5kX0VGVVNFX1hUQUxfU0VMX01TQiA9IFFDQTYxODBfRUZVU0VfWFRBTF9TRUxfTVNCLAorCS5kX0VGVVNFX1hUQUxfU0VMX0xTQiA9IFFDQTYxODBfRUZVU0VfWFRBTF9TRUxfTFNCLAorCS5kX0VGVVNFX1hUQUxfU0VMX01BU0sgPSBRQ0E2MTgwX0VGVVNFX1hUQUxfU0VMX01BU0ssCisJLmRfQkJfUExMX0NPTkZJR19PRkZTRVQgPSBRQ0E2MTgwX0JCX1BMTF9DT05GSUdfT0ZGU0VULAorCS5kX0JCX1BMTF9DT05GSUdfT1VURElWX01TQiA9IFFDQTYxODBfQkJfUExMX0NPTkZJR19PVVRESVZfTVNCLAorCS5kX0JCX1BMTF9DT05GSUdfT1VURElWX0xTQiA9IFFDQTYxODBfQkJfUExMX0NPTkZJR19PVVRESVZfTFNCLAorCS5kX0JCX1BMTF9DT05GSUdfT1VURElWX01BU0sgPSBRQ0E2MTgwX0JCX1BMTF9DT05GSUdfT1VURElWX01BU0ssCisJLmRfQkJfUExMX0NPTkZJR19GUkFDX01TQiA9IFFDQTYxODBfQkJfUExMX0NPTkZJR19GUkFDX01TQiwKKwkuZF9CQl9QTExfQ09ORklHX0ZSQUNfTFNCID0gUUNBNjE4MF9CQl9QTExfQ09ORklHX0ZSQUNfTFNCLAorCS5kX0JCX1BMTF9DT05GSUdfRlJBQ19NQVNLID0gUUNBNjE4MF9CQl9QTExfQ09ORklHX0ZSQUNfTUFTSywKKwkuZF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NU0IgPSBRQ0E2MTgwX1dMQU5fUExMX1NFVFRMRV9USU1FX01TQiwKKwkuZF9XTEFOX1BMTF9TRVRUTEVfVElNRV9MU0IgPSBRQ0E2MTgwX1dMQU5fUExMX1NFVFRMRV9USU1FX0xTQiwKKwkuZF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NQVNLID0gUUNBNjE4MF9XTEFOX1BMTF9TRVRUTEVfVElNRV9NQVNLLAorCS5kX1dMQU5fUExMX1NFVFRMRV9PRkZTRVQgPSBRQ0E2MTgwX1dMQU5fUExMX1NFVFRMRV9PRkZTRVQsCisJLmRfV0xBTl9QTExfU0VUVExFX1NXX01BU0sgPSBRQ0E2MTgwX1dMQU5fUExMX1NFVFRMRV9TV19NQVNLLAorCS5kX1dMQU5fUExMX1NFVFRMRV9SU1RNQVNLID0gUUNBNjE4MF9XTEFOX1BMTF9TRVRUTEVfUlNUTUFTSywKKwkuZF9XTEFOX1BMTF9TRVRUTEVfUkVTRVQgPSBRQ0E2MTgwX1dMQU5fUExMX1NFVFRMRV9SRVNFVCwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX05PUFdEX01TQiA9IFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9MU0IgPSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTFNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfTk9QV0RfTUFTSyA9IFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9OT1BXRF9NQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01TQiA9IFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTVNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX0xTQiA9IFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfTFNCLAorCS5kX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01BU0sgPSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX01BU0ssCisJLmRfV0xBTl9QTExfQ09OVFJPTF9CWVBBU1NfUkVTRVQgPQorCQlRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfQllQQVNTX1JFU0VULAorCS5kX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9NU0IgPSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfQ0xLX1NFTF9NU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX0xTQiA9IFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX0xTQiwKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfTUFTSyA9CisJCVFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX01BU0ssCisJLmRfV0xBTl9QTExfQ09OVFJPTF9DTEtfU0VMX1JFU0VUID0KKwkJUUNBNjE4MF9XTEFOX1BMTF9DT05UUk9MX0NMS19TRUxfUkVTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTVNCID0gUUNBNjE4MF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9NU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTFNCID0gUUNBNjE4MF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9MU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTUFTSyA9IFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfTUFTSywKKwkuZF9XTEFOX1BMTF9DT05UUk9MX1JFRkRJVl9SRVNFVCA9CisJCVFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9SRUZESVZfUkVTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9ESVZfTVNCID0gUUNBNjE4MF9XTEFOX1BMTF9DT05UUk9MX0RJVl9NU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9ESVZfTFNCID0gUUNBNjE4MF9XTEFOX1BMTF9DT05UUk9MX0RJVl9MU0IsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9ESVZfTUFTSyA9IFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9ESVZfTUFTSywKKwkuZF9XTEFOX1BMTF9DT05UUk9MX0RJVl9SRVNFVCA9IFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9ESVZfUkVTRVQsCisJLmRfV0xBTl9QTExfQ09OVFJPTF9PRkZTRVQgPSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfT0ZGU0VULAorCS5kX1dMQU5fUExMX0NPTlRST0xfU1dfTUFTSyA9IFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9TV19NQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfUlNUTUFTSyA9IFFDQTYxODBfV0xBTl9QTExfQ09OVFJPTF9SU1RNQVNLLAorCS5kX1dMQU5fUExMX0NPTlRST0xfUkVTRVQgPSBRQ0E2MTgwX1dMQU5fUExMX0NPTlRST0xfUkVTRVQsCisJLmRfU09DX0NPUkVfQ0xLX0NUUkxfT0ZGU0VUID0gUUNBNjE4MF9TT0NfQ09SRV9DTEtfQ1RSTF9PRkZTRVQsCisJLmRfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01TQiA9IFFDQTYxODBfU09DX0NPUkVfQ0xLX0NUUkxfRElWX01TQiwKKwkuZF9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTFNCID0gUUNBNjE4MF9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTFNCLAorCS5kX1NPQ19DT1JFX0NMS19DVFJMX0RJVl9NQVNLID0gUUNBNjE4MF9TT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTUFTSywKKwkuZF9SVENfU1lOQ19TVEFUVVNfUExMX0NIQU5HSU5HX01TQiA9CisJCVFDQTYxODBfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NU0IsCisJLmRfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19MU0IgPQorCQlRQ0E2MTgwX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTFNCLAorCS5kX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfTUFTSyA9CisJCVFDQTYxODBfUlRDX1NZTkNfU1RBVFVTX1BMTF9DSEFOR0lOR19NQVNLLAorCS5kX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfUkVTRVQgPQorCQlRQ0E2MTgwX1JUQ19TWU5DX1NUQVRVU19QTExfQ0hBTkdJTkdfUkVTRVQsCisJLmRfUlRDX1NZTkNfU1RBVFVTX09GRlNFVCA9IFFDQTYxODBfUlRDX1NZTkNfU1RBVFVTX09GRlNFVCwKKwkuZF9TT0NfQ1BVX0NMT0NLX09GRlNFVCA9IFFDQTYxODBfU09DX0NQVV9DTE9DS19PRkZTRVQsCisJLmRfU09DX0NQVV9DTE9DS19TVEFOREFSRF9NU0IgPSBRQ0E2MTgwX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTVNCLAorCS5kX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTFNCID0gUUNBNjE4MF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQiwKKwkuZF9TT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0sgPSBRQ0E2MTgwX1NPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSywKKwkvKiBQTEwgZW5kICovCisJLmRfU09DX1BPV0VSX1JFR19PRkZTRVQgPSBRQ0E2MTgwX1NPQ19QT1dFUl9SRUdfT0ZGU0VULAorCS5kX1BDSUVfSU5UUl9DQVVTRV9BRERSRVNTID0gUUNBNjE4MF9QQ0lFX0lOVFJfQ0FVU0VfQUREUkVTUywKKwkuZF9TT0NfUkVTRVRfQ09OVFJPTF9BRERSRVNTID0gUUNBNjE4MF9TT0NfUkVTRVRfQ09OVFJPTF9BRERSRVNTLAorCS5kX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTUFTSyA9CisJCVFDQTYxODBfU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9NQVNLLAorCS5kX1NPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTFNCID0KKwkJUUNBNjE4MF9TT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX0xTQiwKKwkuZF9TT0NfUkVTRVRfQ09OVFJPTF9DRV9SU1RfTUFTSyA9CisJCVFDQTYxODBfU09DX1JFU0VUX0NPTlRST0xfQ0VfUlNUX01BU0ssCisJLmRfU09DX1JFU0VUX0NPTlRST0xfQ1BVX1dBUk1fUlNUX01BU0sgPQorCQlRQ0E2MTgwX1NPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9NQVNLLAorCS5kX0NQVV9JTlRSX0FERFJFU1MgPSBRQ0E2MTgwX0NQVV9JTlRSX0FERFJFU1MsCisJLmRfU09DX0xGX1RJTUVSX0NPTlRST0wwX0FERFJFU1MgPQorCQlRQ0E2MTgwX1NPQ19MRl9USU1FUl9DT05UUk9MMF9BRERSRVNTLAorCS5kX1NPQ19MRl9USU1FUl9DT05UUk9MMF9FTkFCTEVfTUFTSyA9CisJCVFDQTYxODBfU09DX0xGX1RJTUVSX0NPTlRST0wwX0VOQUJMRV9NQVNLLAorCS8qIGNoaXAgaWQgc3RhcnQgKi8KKwkuZF9TT0NfQ0hJUF9JRF9BRERSRVNTID0gUUNBNjE4MF9TT0NfQ0hJUF9JRF9BRERSRVNTLAorCS5kX1NPQ19DSElQX0lEX1ZFUlNJT05fTUFTSyA9IFFDQTYxODBfU09DX0NISVBfSURfVkVSU0lPTl9NQVNLLAorCS5kX1NPQ19DSElQX0lEX1ZFUlNJT05fTFNCID0gUUNBNjE4MF9TT0NfQ0hJUF9JRF9WRVJTSU9OX0xTQiwKKwkuZF9TT0NfQ0hJUF9JRF9SRVZJU0lPTl9NQVNLID0gUUNBNjE4MF9TT0NfQ0hJUF9JRF9SRVZJU0lPTl9NQVNLLAorCS5kX1NPQ19DSElQX0lEX1JFVklTSU9OX0xTQiA9IFFDQTYxODBfU09DX0NISVBfSURfUkVWSVNJT05fTFNCLAorCS8qIGNoaXAgaWQgZW5kICovCisJLmRfQV9TT0NfQ09SRV9TQ1JBVENIXzBfQUREUkVTUyA9IFFDQTYxODBfQV9TT0NfQ09SRV9TQ1JBVENIXzBfQUREUkVTUywKKwkuZF9BX1NPQ19DT1JFX1NDUkFUQ0hfMV9BRERSRVNTID0gUUNBNjE4MF9BX1NPQ19DT1JFX1NDUkFUQ0hfMV9BRERSRVNTLAorCS5kX0FfU09DX0NPUkVfU0NSQVRDSF8yX0FERFJFU1MgPSBRQ0E2MTgwX0FfU09DX0NPUkVfU0NSQVRDSF8yX0FERFJFU1MsCisJLmRfQV9TT0NfQ09SRV9TQ1JBVENIXzNfQUREUkVTUyA9IFFDQTYxODBfQV9TT0NfQ09SRV9TQ1JBVENIXzNfQUREUkVTUywKKwkuZF9BX1NPQ19DT1JFX1NDUkFUQ0hfNF9BRERSRVNTID0gUUNBNjE4MF9BX1NPQ19DT1JFX1NDUkFUQ0hfNF9BRERSRVNTLAorCS5kX0FfU09DX0NPUkVfU0NSQVRDSF81X0FERFJFU1MgPSBRQ0E2MTgwX0FfU09DX0NPUkVfU0NSQVRDSF81X0FERFJFU1MsCisJLmRfQV9TT0NfQ09SRV9TQ1JBVENIXzZfQUREUkVTUyA9IFFDQTYxODBfQV9TT0NfQ09SRV9TQ1JBVENIXzZfQUREUkVTUywKKwkuZF9BX1NPQ19DT1JFX1NDUkFUQ0hfN19BRERSRVNTID0gUUNBNjE4MF9BX1NPQ19DT1JFX1NDUkFUQ0hfN19BRERSRVNTLAorCS5kX0FfU09DX0NPUkVfU1BBUkVfMF9SRUdJU1RFUiA9IFFDQTYxODBfQV9TT0NfQ09SRV9TUEFSRV8wX1JFR0lTVEVSLAorCS5kX1BDSUVfSU5UUl9GSVJNV0FSRV9ST1VURV9NQVNLID0KKwkJUUNBNjE4MF9QQ0lFX0lOVFJfRklSTVdBUkVfUk9VVEVfTUFTSywKKwkuZF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9DQVVTRV9HUlAxID0KKwkJUUNBNjE4MF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9DQVVTRV9HUlAxLAorCS5kX0FfU09DX0NPUkVfU1BBUkVfMV9SRUdJU1RFUiA9CisJCVFDQTYxODBfQV9TT0NfQ09SRV9TUEFSRV8xX1JFR0lTVEVSLAorCS5kX0FfU09DX0NPUkVfUENJRV9JTlRSX0NMUl9HUlAxID0KKwkJUUNBNjE4MF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9DTFJfR1JQMSwKKwkuZF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9FTkFCTEVfR1JQMSA9CisJCVFDQTYxODBfQV9TT0NfQ09SRV9QQ0lFX0lOVFJfRU5BQkxFX0dSUDEsCisJLmRfQV9TT0NfUENJRV9QQ0lFX1NDUkFUQ0hfMCA9CisJCVFDQTYxODBfQV9TT0NfUENJRV9QQ0lFX1NDUkFUQ0hfMCwKKwkuZF9BX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8xID0KKwkJUUNBNjE4MF9BX1NPQ19QQ0lFX1BDSUVfU0NSQVRDSF8xLAorCS5kX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfVEFSR0VUX0hPU1RfREVMVEEgPQorCQlRQ0E2MTgwX0FfV0lGSV9BUEJfMV9BX1dGU1NfQ0VfVEFSR0VUX0hPU1RfREVMVEEsCisJLmRfQV9TT0NfUENJRV9QQ0lFX1NDUkFUQ0hfMiA9IFFDQTYxODBfQV9TT0NfUENJRV9QQ0lFX1NDUkFUQ0hfMiwKKwkuZF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9FTkFCTEVfR1JQMF9RNl9NQVNLID0KKwkJUUNBNjE4MF9BX1NPQ19DT1JFX1BDSUVfSU5UUl9FTkFCTEVfR1JQMF9RNl9NQVNLLAorCisJLmRfV0xBTl9ERUJVR19JTlBVVF9TRUxfT0ZGU0VUID0gUUNBNjE4MF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9PRkZTRVQsCisJLmRfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01TQiA9IFFDQTYxODBfV0xBTl9ERUJVR19JTlBVVF9TRUxfU1JDX01TQiwKKwkuZF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTFNCID0gUUNBNjE4MF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTFNCLAorCS5kX1dMQU5fREVCVUdfSU5QVVRfU0VMX1NSQ19NQVNLID0KKwkJUUNBNjE4MF9XTEFOX0RFQlVHX0lOUFVUX1NFTF9TUkNfTUFTSywKKwkuZF9XTEFOX0RFQlVHX0NPTlRST0xfT0ZGU0VUID0gUUNBNjE4MF9XTEFOX0RFQlVHX0NPTlRST0xfT0ZGU0VULAorCS5kX1dMQU5fREVCVUdfQ09OVFJPTF9FTkFCTEVfTVNCID0KKwkJUUNBNjE4MF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01TQiwKKwkuZF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX0xTQiA9CisJCVFDQTYxODBfV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9MU0IsCisJLmRfV0xBTl9ERUJVR19DT05UUk9MX0VOQUJMRV9NQVNLID0KKwkJUUNBNjE4MF9XTEFOX0RFQlVHX0NPTlRST0xfRU5BQkxFX01BU0ssCisJLmRfV0xBTl9ERUJVR19PVVRfT0ZGU0VUID0gUUNBNjE4MF9XTEFOX0RFQlVHX09VVF9PRkZTRVQsCisJLmRfV0xBTl9ERUJVR19PVVRfREFUQV9NU0IgPSBRQ0E2MTgwX1dMQU5fREVCVUdfT1VUX0RBVEFfTVNCLAorCS5kX1dMQU5fREVCVUdfT1VUX0RBVEFfTFNCID0gUUNBNjE4MF9XTEFOX0RFQlVHX09VVF9EQVRBX0xTQiwKKwkuZF9XTEFOX0RFQlVHX09VVF9EQVRBX01BU0sgPSBRQ0E2MTgwX1dMQU5fREVCVUdfT1VUX0RBVEFfTUFTSywKKwkuZF9BTUJBX0RFQlVHX0JVU19PRkZTRVQgPSBRQ0E2MTgwX0FNQkFfREVCVUdfQlVTX09GRlNFVCwKKwkuZF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NU0IgPQorCQlRQ0E2MTgwX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX01TQiwKKwkuZF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9MU0IgPQorCQlRQ0E2MTgwX0FNQkFfREVCVUdfQlVTX1BDSUVfREVCVUdfU0VMX0xTQiwKKwkuZF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NQVNLID0KKwkJUUNBNjE4MF9BTUJBX0RFQlVHX0JVU19QQ0lFX0RFQlVHX1NFTF9NQVNLLAorCS5kX0FNQkFfREVCVUdfQlVTX1NFTF9NU0IgPSBRQ0E2MTgwX0FNQkFfREVCVUdfQlVTX1NFTF9NU0IsCisJLmRfQU1CQV9ERUJVR19CVVNfU0VMX0xTQiA9IFFDQTYxODBfQU1CQV9ERUJVR19CVVNfU0VMX0xTQiwKKwkuZF9BTUJBX0RFQlVHX0JVU19TRUxfTUFTSyA9IFFDQTYxODBfQU1CQV9ERUJVR19CVVNfU0VMX01BU0ssCit9OworCitzdHJ1Y3QgaG9zdGRlZl9zIHFjYTYxODBfaG9zdGRlZiA9IHsKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9MU0IgPSBRQ0E2MTgwX0lOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX0xTQiwKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9NQVNLID0gUUNBNjE4MF9JTlRfU1RBVFVTX0VOQUJMRV9FUlJPUl9NQVNLLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9MU0IgPSBRQ0E2MTgwX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9MU0IsCisJLmRfSU5UX1NUQVRVU19FTkFCTEVfQ1BVX01BU0sgPSBRQ0E2MTgwX0lOVF9TVEFUVVNfRU5BQkxFX0NQVV9NQVNLLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTFNCID0KKwkJUUNBNjE4MF9JTlRfU1RBVFVTX0VOQUJMRV9DT1VOVEVSX0xTQiwKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9DT1VOVEVSX01BU0sgPQorCQlRQ0E2MTgwX0lOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTUFTSywKKwkuZF9JTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEFfTFNCID0KKwkJUUNBNjE4MF9JTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEFfTFNCLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQV9NQVNLID0KKwkJUUNBNjE4MF9JTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEFfTUFTSywKKwkuZF9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19MU0IgPQorCQlRQ0E2MTgwX0VSUk9SX1NUQVRVU19FTkFCTEVfUlhfVU5ERVJGTE9XX0xTQiwKKwkuZF9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19NQVNLID0KKwkJUUNBNjE4MF9FUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPV19NQVNLLAorCS5kX0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTFNCID0KKwkJUUNBNjE4MF9FUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XX0xTQiwKKwkuZF9FUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XX01BU0sgPQorCQlRQ0E2MTgwX0VSUk9SX1NUQVRVU19FTkFCTEVfVFhfT1ZFUkZMT1dfTUFTSywKKwkuZF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IgPQorCQlRQ0E2MTgwX0NPVU5URVJfSU5UX1NUQVRVU19FTkFCTEVfQklUX0xTQiwKKwkuZF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLID0KKwkJUUNBNjE4MF9DT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLLAorCS5kX0lOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1MgPSBRQ0E2MTgwX0lOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1MsCisJLmRfQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9MU0IgPQorCQlRQ0E2MTgwX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTFNCLAorCS5kX0NQVV9JTlRfU1RBVFVTX0VOQUJMRV9CSVRfTUFTSyA9CisJCVFDQTYxODBfQ1BVX0lOVF9TVEFUVVNfRU5BQkxFX0JJVF9NQVNLLAorCS5kX0hPU1RfSU5UX1NUQVRVU19BRERSRVNTID0gUUNBNjE4MF9IT1NUX0lOVF9TVEFUVVNfQUREUkVTUywKKwkuZF9DUFVfSU5UX1NUQVRVU19BRERSRVNTID0gUUNBNjE4MF9DUFVfSU5UX1NUQVRVU19BRERSRVNTLAorCS5kX0VSUk9SX0lOVF9TVEFUVVNfQUREUkVTUyA9IFFDQTYxODBfRVJST1JfSU5UX1NUQVRVU19BRERSRVNTLAorCS5kX0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX01BU0sgPSBRQ0E2MTgwX0VSUk9SX0lOVF9TVEFUVVNfV0FLRVVQX01BU0ssCisJLmRfRVJST1JfSU5UX1NUQVRVU19XQUtFVVBfTFNCID0gUUNBNjE4MF9FUlJPUl9JTlRfU1RBVFVTX1dBS0VVUF9MU0IsCisJLmRfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTUFTSyA9CisJCVFDQTYxODBfRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1dfTUFTSywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPV19MU0IgPQorCQlRQ0E2MTgwX0VSUk9SX0lOVF9TVEFUVVNfUlhfVU5ERVJGTE9XX0xTQiwKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1RYX09WRVJGTE9XX01BU0sgPQorCQlRQ0E2MTgwX0VSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1dfTUFTSywKKwkuZF9FUlJPUl9JTlRfU1RBVFVTX1RYX09WRVJGTE9XX0xTQiA9CisJCVFDQTYxODBfRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPV19MU0IsCisJLmRfQ09VTlRfREVDX0FERFJFU1MgPSBRQ0E2MTgwX0NPVU5UX0RFQ19BRERSRVNTLAorCS5kX0hPU1RfSU5UX1NUQVRVU19DUFVfTUFTSyA9IFFDQTYxODBfSE9TVF9JTlRfU1RBVFVTX0NQVV9NQVNLLAorCS5kX0hPU1RfSU5UX1NUQVRVU19DUFVfTFNCID0gUUNBNjE4MF9IT1NUX0lOVF9TVEFUVVNfQ1BVX0xTQiwKKwkuZF9IT1NUX0lOVF9TVEFUVVNfRVJST1JfTUFTSyA9IFFDQTYxODBfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX01BU0ssCisJLmRfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX0xTQiA9IFFDQTYxODBfSE9TVF9JTlRfU1RBVFVTX0VSUk9SX0xTQiwKKwkuZF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9NQVNLID0gUUNBNjE4MF9IT1NUX0lOVF9TVEFUVVNfQ09VTlRFUl9NQVNLLAorCS5kX0hPU1RfSU5UX1NUQVRVU19DT1VOVEVSX0xTQiA9IFFDQTYxODBfSE9TVF9JTlRfU1RBVFVTX0NPVU5URVJfTFNCLAorCS5kX1JYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTID0gUUNBNjE4MF9SWF9MT09LQUhFQURfVkFMSURfQUREUkVTUywKKwkuZF9XSU5ET1dfREFUQV9BRERSRVNTID0gUUNBNjE4MF9XSU5ET1dfREFUQV9BRERSRVNTLAorCS5kX1dJTkRPV19SRUFEX0FERFJfQUREUkVTUyA9IFFDQTYxODBfV0lORE9XX1JFQURfQUREUl9BRERSRVNTLAorCS5kX1dJTkRPV19XUklURV9BRERSX0FERFJFU1MgPSBRQ0E2MTgwX1dJTkRPV19XUklURV9BRERSX0FERFJFU1MsCisJLmRfU09DX0dMT0JBTF9SRVNFVF9BRERSRVNTID0gUUNBNjE4MF9TT0NfR0xPQkFMX1JFU0VUX0FERFJFU1MsCisJLmRfUlRDX1NUQVRFX0FERFJFU1MgPSBRQ0E2MTgwX1JUQ19TVEFURV9BRERSRVNTLAorCS5kX1JUQ19TVEFURV9DT0xEX1JFU0VUX01BU0sgPSBRQ0E2MTgwX1JUQ19TVEFURV9DT0xEX1JFU0VUX01BU0ssCisJLmRfUENJRV9MT0NBTF9CQVNFX0FERFJFU1MgPSBRQ0E2MTgwX1BDSUVfTE9DQUxfQkFTRV9BRERSRVNTLAorCS5kX1BDSUVfU09DX1dBS0VfUkVTRVQgPSBRQ0E2MTgwX1BDSUVfU09DX1dBS0VfUkVTRVQsCisJLmRfUENJRV9TT0NfV0FLRV9BRERSRVNTID0gUUNBNjE4MF9QQ0lFX1NPQ19XQUtFX0FERFJFU1MsCisJLmRfUENJRV9TT0NfV0FLRV9WX01BU0sgPSBRQ0E2MTgwX1BDSUVfU09DX1dBS0VfVl9NQVNLLAorCS5kX1JUQ19TVEFURV9WX01BU0sgPSBRQ0E2MTgwX1JUQ19TVEFURV9WX01BU0ssCisJLmRfUlRDX1NUQVRFX1ZfTFNCID0gUUNBNjE4MF9SVENfU1RBVEVfVl9MU0IsCisJLmRfRldfSU5EX0VWRU5UX1BFTkRJTkcgPSBRQ0E2MTgwX0ZXX0lORF9FVkVOVF9QRU5ESU5HLAorCS5kX0ZXX0lORF9JTklUSUFMSVpFRCA9IFFDQTYxODBfRldfSU5EX0lOSVRJQUxJWkVELAorCS5kX0ZXX0lORF9IRUxQRVIgPSBRQ0E2MTgwX0ZXX0lORF9IRUxQRVIsCisJLmRfUlRDX1NUQVRFX1ZfT04gPSBRQ0E2MTgwX1JUQ19TVEFURV9WX09OLAorI2lmIGRlZmluZWQoU0RJT18zXzApCisJLmRfSE9TVF9JTlRfU1RBVFVTX01CT1hfREFUQV9NQVNLID0KKwkJUUNBNjE4MF9IT1NUX0lOVF9TVEFUVVNfTUJPWF9EQVRBX01BU0ssCisJLmRfSE9TVF9JTlRfU1RBVFVTX01CT1hfREFUQV9MU0IgPQorCQlRQ0E2MTgwX0hPU1RfSU5UX1NUQVRVU19NQk9YX0RBVEFfTFNCLAorI2VuZGlmCisJLmRfUENJRV9TT0NfUkRZX1NUQVRVU19BRERSRVNTID0gUENJRV9TT0NfUkRZX1NUQVRVU19BRERSRVNTLAorCS5kX1BDSUVfU09DX1JEWV9TVEFUVVNfQkFSX01BU0sgPSBQQ0lFX1NPQ19SRFlfU1RBVFVTX0JBUl9NQVNLLAorCS5kX1NPQ19QQ0lFX0JBU0VfQUREUkVTUyA9IFNPQ19QQ0lFX0JBU0VfQUREUkVTUywKKwkuZF9NU0lfTUFHSUNfQURSX0FERFJFU1MgPSBNU0lfTUFHSUNfQURSX0FERFJFU1MsCisJLmRfTVNJX01BR0lDX0FERFJFU1MgPSBNU0lfTUFHSUNfQUREUkVTUywKKwkuZF9IT1NUX0NFX0NPVU5UID0gOCwKKwkuZF9FTkFCTEVfTVNJID0gMCwKKwkuZF9NVVhfSURfTUFTSyA9IDB4ZjAwMCwKKwkuZF9UUkFOU0FDVElPTl9JRF9NQVNLID0gMHgwZmZmLAorCS5kX0RFU0NfREFUQV9GTEFHX01BU0sgPSAweDFGRkZFM0UwLAorCS5kX0FfU09DX1BDSUVfUENJRV9CQVIwX1NUQVJUID0gUUNBNjE4MF9BX1NPQ19QQ0lFX1BDSUVfQkFSMF9TVEFSVCwKK307CisKKworc3RydWN0IGNlX3JlZ19kZWYgcWNhNjE4MF9jZV90YXJnZXRkZWYgPSB7CisJLyogY29weV9lbmdpbmUuYyAgKi8KKwkuZF9EU1RfV1JfSU5ERVhfQUREUkVTUyA9IFFDQTYxODBfRFNUX1dSX0lOREVYX0FERFJFU1MsCisJLmRfU1JDX1dBVEVSTUFSS19BRERSRVNTID0gUUNBNjE4MF9TUkNfV0FURVJNQVJLX0FERFJFU1MsCisJLmRfU1JDX1dBVEVSTUFSS19MT1dfTUFTSyA9IFFDQTYxODBfU1JDX1dBVEVSTUFSS19MT1dfTUFTSywKKwkuZF9TUkNfV0FURVJNQVJLX0hJR0hfTUFTSyA9IFFDQTYxODBfU1JDX1dBVEVSTUFSS19ISUdIX01BU0ssCisJLmRfRFNUX1dBVEVSTUFSS19MT1dfTUFTSyA9IFFDQTYxODBfRFNUX1dBVEVSTUFSS19MT1dfTUFTSywKKwkuZF9EU1RfV0FURVJNQVJLX0hJR0hfTUFTSyA9IFFDQTYxODBfRFNUX1dBVEVSTUFSS19ISUdIX01BU0ssCisJLmRfQ1VSUkVOVF9TUlJJX0FERFJFU1MgPSBRQ0E2MTgwX0NVUlJFTlRfU1JSSV9BRERSRVNTLAorCS5kX0NVUlJFTlRfRFJSSV9BRERSRVNTID0gUUNBNjE4MF9DVVJSRU5UX0RSUklfQUREUkVTUywKKwkuZF9IT1NUX0lTX1NSQ19SSU5HX0hJR0hfV0FURVJNQVJLX01BU0sgPQorCQlRQ0E2MTgwX0hPU1RfSVNfU1JDX1JJTkdfSElHSF9XQVRFUk1BUktfTUFTSywKKwkuZF9IT1NUX0lTX1NSQ19SSU5HX0xPV19XQVRFUk1BUktfTUFTSyA9CisJCVFDQTYxODBfSE9TVF9JU19TUkNfUklOR19MT1dfV0FURVJNQVJLX01BU0ssCisJLmRfSE9TVF9JU19EU1RfUklOR19ISUdIX1dBVEVSTUFSS19NQVNLID0KKwkJUUNBNjE4MF9IT1NUX0lTX0RTVF9SSU5HX0hJR0hfV0FURVJNQVJLX01BU0ssCisJLmRfSE9TVF9JU19EU1RfUklOR19MT1dfV0FURVJNQVJLX01BU0sgPQorCQlRQ0E2MTgwX0hPU1RfSVNfRFNUX1JJTkdfTE9XX1dBVEVSTUFSS19NQVNLLAorCS5kX0hPU1RfSVNfQUREUkVTUyA9IFFDQTYxODBfSE9TVF9JU19BRERSRVNTLAorCS5kX01JU0NfSVNfQUREUkVTUyA9IFFDQTYxODBfTUlTQ19JU19BRERSRVNTLAorCS5kX0hPU1RfSVNfQ09QWV9DT01QTEVURV9NQVNLID0gUUNBNjE4MF9IT1NUX0lTX0NPUFlfQ09NUExFVEVfTUFTSywKKwkuZF9DRV9XUkFQUEVSX0JBU0VfQUREUkVTUyA9IFFDQTYxODBfQ0VfV1JBUFBFUl9CQVNFX0FERFJFU1MsCisJLmRfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9BRERSRVNTID0KKwkJUUNBNjE4MF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0FERFJFU1MsCisJLmRfQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0xPVyA9IFFDQTYxODBfQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0xPVywKKwkuZF9DRV9XUkFQUEVSX0lOREVYX0JBU0VfSElHSCA9IFFDQTYxODBfQ0VfV1JBUFBFUl9JTkRFWF9CQVNFX0hJR0gsCisJLmRfSE9TVF9JRV9BRERSRVNTID0gUUNBNjE4MF9IT1NUX0lFX0FERFJFU1MsCisJLmRfSE9TVF9JRV9DT1BZX0NPTVBMRVRFX01BU0sgPSBRQ0E2MTgwX0hPU1RfSUVfQ09QWV9DT01QTEVURV9NQVNLLAorCS5kX1NSX0JBX0FERFJFU1MgPSBRQ0E2MTgwX1NSX0JBX0FERFJFU1MsCisJLmRfU1JfU0laRV9BRERSRVNTID0gUUNBNjE4MF9TUl9TSVpFX0FERFJFU1MsCisJLmRfQ0VfQ1RSTDFfQUREUkVTUyA9IFFDQTYxODBfQ0VfQ1RSTDFfQUREUkVTUywKKwkuZF9DRV9DVFJMMV9ETUFYX0xFTkdUSF9NQVNLID0gUUNBNjE4MF9DRV9DVFJMMV9ETUFYX0xFTkdUSF9NQVNLLAorCS5kX0RSX0JBX0FERFJFU1MgPSBRQ0E2MTgwX0RSX0JBX0FERFJFU1MsCisJLmRfRFJfU0laRV9BRERSRVNTID0gUUNBNjE4MF9EUl9TSVpFX0FERFJFU1MsCisJLmRfQ0VfQ01EX1JFR0lTVEVSID0gUUNBNjE4MF9DRV9DTURfUkVHSVNURVIsCisJLmRfQ0VfTVNJX0FERFJFU1MgPSBRQ0E2MTgwX0NFX01TSV9BRERSRVNTLAorCS5kX0NFX01TSV9BRERSRVNTX0hJR0ggPSBRQ0E2MTgwX0NFX01TSV9BRERSRVNTX0hJR0gsCisJLmRfQ0VfTVNJX0RBVEEgPSBRQ0E2MTgwX0NFX01TSV9EQVRBLAorCS5kX0NFX01TSV9FTkFCTEVfQklUID0gUUNBNjE4MF9DRV9NU0lfRU5BQkxFX0JJVCwKKwkuZF9NSVNDX0lFX0FERFJFU1MgPSBRQ0E2MTgwX01JU0NfSUVfQUREUkVTUywKKwkuZF9NSVNDX0lTX0FYSV9FUlJfTUFTSyA9IFFDQTYxODBfTUlTQ19JU19BWElfRVJSX01BU0ssCisJLmRfTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSyA9IFFDQTYxODBfTUlTQ19JU19EU1RfQUREUl9FUlJfTUFTSywKKwkuZF9NSVNDX0lTX1NSQ19MRU5fRVJSX01BU0sgPSBRQ0E2MTgwX01JU0NfSVNfU1JDX0xFTl9FUlJfTUFTSywKKwkuZF9NSVNDX0lTX0RTVF9NQVhfTEVOX1ZJT19NQVNLID0gUUNBNjE4MF9NSVNDX0lTX0RTVF9NQVhfTEVOX1ZJT19NQVNLLAorCS5kX01JU0NfSVNfRFNUX1JJTkdfT1ZFUkZMT1dfTUFTSyA9CisJCVFDQTYxODBfTUlTQ19JU19EU1RfUklOR19PVkVSRkxPV19NQVNLLAorCS5kX01JU0NfSVNfU1JDX1JJTkdfT1ZFUkZMT1dfTUFTSyA9CisJCVFDQTYxODBfTUlTQ19JU19TUkNfUklOR19PVkVSRkxPV19NQVNLLAorCS5kX1NSQ19XQVRFUk1BUktfTE9XX0xTQiA9IFFDQTYxODBfU1JDX1dBVEVSTUFSS19MT1dfTFNCLAorCS5kX1NSQ19XQVRFUk1BUktfSElHSF9MU0IgPSBRQ0E2MTgwX1NSQ19XQVRFUk1BUktfSElHSF9MU0IsCisJLmRfRFNUX1dBVEVSTUFSS19MT1dfTFNCID0gUUNBNjE4MF9EU1RfV0FURVJNQVJLX0xPV19MU0IsCisJLmRfRFNUX1dBVEVSTUFSS19ISUdIX0xTQiA9IFFDQTYxODBfRFNUX1dBVEVSTUFSS19ISUdIX0xTQiwKKwkuZF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX01BU0sgPQorCQlRQ0E2MTgwX0NFX1dSQVBQRVJfSU5URVJSVVBUX1NVTU1BUllfSE9TVF9NU0lfTUFTSywKKwkuZF9DRV9XUkFQUEVSX0lOVEVSUlVQVF9TVU1NQVJZX0hPU1RfTVNJX0xTQiA9CisJCVFDQTYxODBfQ0VfV1JBUFBFUl9JTlRFUlJVUFRfU1VNTUFSWV9IT1NUX01TSV9MU0IsCisJLmRfQ0VfQ1RSTDFfRE1BWF9MRU5HVEhfTFNCID0gUUNBNjE4MF9DRV9DVFJMMV9ETUFYX0xFTkdUSF9MU0IsCisJLmRfQ0VfQ1RSTDFfU1JDX1JJTkdfQllURV9TV0FQX0VOX01BU0sgPQorCQlRQ0E2MTgwX0NFX0NUUkwxX1NSQ19SSU5HX0JZVEVfU1dBUF9FTl9NQVNLLAorCS5kX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9NQVNLID0KKwkJUUNBNjE4MF9DRV9DVFJMMV9EU1RfUklOR19CWVRFX1NXQVBfRU5fTUFTSywKKwkuZF9DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTFNCID0KKwkJUUNBNjE4MF9DRV9DVFJMMV9TUkNfUklOR19CWVRFX1NXQVBfRU5fTFNCLAorCS5kX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9MU0IgPQorCQlRQ0E2MTgwX0NFX0NUUkwxX0RTVF9SSU5HX0JZVEVfU1dBUF9FTl9MU0IsCisJLmRfQ0VfV1JBUFBFUl9ERUJVR19PRkZTRVQgPSBRQ0E2MTgwX0NFX1dSQVBQRVJfREVCVUdfT0ZGU0VULAorCS5kX0NFX1dSQVBQRVJfREVCVUdfU0VMX01TQiA9IFFDQTYxODBfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTVNCLAorCS5kX0NFX1dSQVBQRVJfREVCVUdfU0VMX0xTQiA9IFFDQTYxODBfQ0VfV1JBUFBFUl9ERUJVR19TRUxfTFNCLAorCS5kX0NFX1dSQVBQRVJfREVCVUdfU0VMX01BU0sgPSBRQ0E2MTgwX0NFX1dSQVBQRVJfREVCVUdfU0VMX01BU0ssCisJLmRfQ0VfREVCVUdfT0ZGU0VUID0gUUNBNjE4MF9DRV9ERUJVR19PRkZTRVQsCisJLmRfQ0VfREVCVUdfU0VMX01TQiA9IFFDQTYxODBfQ0VfREVCVUdfU0VMX01TQiwKKwkuZF9DRV9ERUJVR19TRUxfTFNCID0gUUNBNjE4MF9DRV9ERUJVR19TRUxfTFNCLAorCS5kX0NFX0RFQlVHX1NFTF9NQVNLID0gUUNBNjE4MF9DRV9ERUJVR19TRUxfTUFTSywKKwkuZF9DRTBfQkFTRV9BRERSRVNTID0gUUNBNjE4MF9DRTBfQkFTRV9BRERSRVNTLAorCS5kX0NFMV9CQVNFX0FERFJFU1MgPSBRQ0E2MTgwX0NFMV9CQVNFX0FERFJFU1MsCit9OworCisKK3N0cnVjdCBob3N0X3NoYWRvd19yZWdzX3MgcWNhNjE4MF9ob3N0X3NoYWRvd19yZWdzID0geworCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8wICA9CisJCVFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzAsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEgID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMSwKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMiAgPQorCQlRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8yLAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV8zICA9CisJCVFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzMsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzQgID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfNCwKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfNSAgPQorCQlRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV81LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV82ICA9CisJCVFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzYsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzcgID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfNywKKwkuZF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfOCAgPQorCQlRQ0E2MTgwX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV84LAorCS5kX0FfTE9DQUxfU0hBRE9XX1JFR19WQUxVRV85ICA9CisJCVFDQTYxODBfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzksCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEwID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTAsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzExID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTEsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEyID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTIsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzEzID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTMsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE0ID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTQsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE1ID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTUsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE2ID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTYsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE3ID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTcsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE4ID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTgsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzE5ID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMTksCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIwID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjAsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIxID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjEsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIyID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjIsCisJLmRfQV9MT0NBTF9TSEFET1dfUkVHX1ZBTFVFXzIzID0KKwkJUUNBNjE4MF9BX0xPQ0FMX1NIQURPV19SRUdfVkFMVUVfMjMsCisKK307CisKKyNlbmRpZiAvKiBfUUNBNjE4MERFRl9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9oaWYvc3JjL3JlZ3RhYmxlLmMgYi9jb3JlL2hpZi9zcmMvcmVndGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQ4ZjhlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9oaWYvc3JjL3JlZ3RhYmxlLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgImJtaV9tc2cuaCIKKyNpbmNsdWRlICJ0YXJnYWRkcnMuaCIKKyNpbmNsdWRlICJjZXBjaS5oIgorI2luY2x1ZGUgInJlZ3RhYmxlLmgiCisjaW5jbHVkZSAiYXI5ODg4ZGVmLmgiCisjaW5jbHVkZSAiYXI2MzIwZGVmLmgiCisjaW5jbHVkZSAiYXI2MzIwdjJkZWYuaCIKKyNpbmNsdWRlICJxY2E2MTgwZGVmLmgiCisjaW5jbHVkZSAib2xfaWZfYXRodmFyLmgiCisjaW5jbHVkZSAiaGlmLmgiCisjaW5jbHVkZSAiYWRyYXN0ZWFfcmVnX2RlZi5oIgorCit2b2lkIHRhcmdldF9yZWdpc3Rlcl90YmxfYXR0YWNoKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCB1MzIgdGFyZ2V0X3R5cGUpCit7CisJc3dpdGNoICh0YXJnZXRfdHlwZSkgeworCWNhc2UgVEFSR0VUX1RZUEVfQVI5ODg4OgorCQlzY24tPnRhcmdldGRlZiA9ICZhcjk4ODhfdGFyZ2V0ZGVmOworCQlzY24tPnRhcmdldF9jZV9kZWYgPSAmYXI5ODg4X2NlX3RhcmdldGRlZjsKKwkJYnJlYWs7CisJY2FzZSBUQVJHRVRfVFlQRV9BUjYzMjA6CisJCXNjbi0+dGFyZ2V0ZGVmID0gJmFyNjMyMF90YXJnZXRkZWY7CisJCXNjbi0+dGFyZ2V0X2NlX2RlZiA9ICZhcjYzMjBfY2VfdGFyZ2V0ZGVmOworCQlicmVhazsKKwljYXNlIFRBUkdFVF9UWVBFX0FSNjMyMFYyOgorCQlzY24tPnRhcmdldGRlZiA9ICZhcjYzMjB2Ml90YXJnZXRkZWY7CisJCXNjbi0+dGFyZ2V0X2NlX2RlZiA9ICZhcjYzMjB2Ml9jZV90YXJnZXRkZWY7CisJCWJyZWFrOworCWNhc2UgVEFSR0VUX1RZUEVfUUNBNjE4MDoKKwkJc2NuLT50YXJnZXRkZWYgPSAmcWNhNjE4MF90YXJnZXRkZWY7CisJCXNjbi0+dGFyZ2V0X2NlX2RlZiA9ICZxY2E2MTgwX2NlX3RhcmdldGRlZjsKKwkJYnJlYWs7CisJY2FzZSBUQVJHRVRfVFlQRV9BRFJBU1RFQToKKwkJc2NuLT50YXJnZXRkZWYgPSAmYWRyYXN0ZWFfdGFyZ2V0ZGVmOworCQlzY24tPnRhcmdldF9jZV9kZWYgPSAmYWRyYXN0ZWFfY2VfdGFyZ2V0ZGVmOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgaGlmX3JlZ2lzdGVyX3RibF9hdHRhY2goc3RydWN0IG9sX3NvZnRjICpzY24sIHUzMiBoaWZfdHlwZSkKK3sKKwlzd2l0Y2ggKGhpZl90eXBlKSB7CisJY2FzZSBISUZfVFlQRV9BUjk4ODg6CisJCXNjbi0+aG9zdGRlZiA9ICZhcjk4ODhfaG9zdGRlZjsKKwkJYnJlYWs7CisJY2FzZSBISUZfVFlQRV9BUjYzMjA6CisJCXNjbi0+aG9zdGRlZiA9ICZhcjYzMjBfaG9zdGRlZjsKKwkJYnJlYWs7CisJY2FzZSBISUZfVFlQRV9BUjYzMjBWMjoKKwkJc2NuLT5ob3N0ZGVmID0gJmFyNjMyMHYyX2hvc3RkZWY7CisJCWJyZWFrOworCWNhc2UgSElGX1RZUEVfUUNBNjE4MDoKKwkJc2NuLT5ob3N0ZGVmID0gJnFjYTYxODBfaG9zdGRlZjsKKwkJc2NuLT5ob3N0X3NoYWRvd19yZWdzID0gJnFjYTYxODBfaG9zdF9zaGFkb3dfcmVnczsKKwkJYnJlYWs7CisJY2FzZSBISUZfVFlQRV9BRFJBU1RFQToKKwkJc2NuLT5ob3N0ZGVmID0gJmFkcmFzdGVhX2hvc3RkZWY7CisJCXNjbi0+aG9zdF9zaGFkb3dfcmVncyA9ICZhZHJhc3RlYV9ob3N0X3NoYWRvd19yZWdzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvc25vYy9oaWZfaW8zMl9zbm9jLmggYi9jb3JlL2hpZi9zcmMvc25vYy9oaWZfaW8zMl9zbm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwN2M0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9zbm9jL2hpZl9pbzMyX3Nub2MuaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiBoaWZfaW8zMl9zbm9jLmgKKyAqCisgKiBzbm9jIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBhbmQgY29uZmlndXJhdGlvbnMKKyAqLworCisjaWZuZGVmIF9fSElGX0lPMzJfU05PQ19IX18KKyNkZWZpbmUgX19ISUZfSU8zMl9TTk9DX0hfXworCisjaWZkZWYgSElGX1BDSQorI2Vycm9yIHNub2MgYW5kIHBjaSBjYW5ub3QgYmUgc3VwcG9ydGVkIGluIHBhcnJhbGxlbCBhdCB0aGlzIHRpbWUKKyNlbmRpZgorCisjaW5jbHVkZSAiaGlmLmgiCisjaW5jbHVkZSAicmVndGFibGUuaCIKKyNpbmNsdWRlICJjZV9yZWcuaCIKKyNpbmNsdWRlICJjZGZfYXRvbWljLmgiCisjaW5jbHVkZSA8c29jL3Fjb20vaWNuc3MuaD4KKyNpbmNsdWRlICJoaWZfbWFpbi5oIgorI2luY2x1ZGUgImhpZl9kZWJ1Zy5oIgorCisvKioKKyAqIEZvbGxvd2luZyBmZWF0dXJlcyBhcmUgbm90IHN1cHBvcnRlZCBmb3Igc25vYyBidXMKKyAqIEZvcmNlIDAgYW5kIGNvbnNpZGVyIG1vdmluZyBjb3JyZXNwb25kaW5nIGNvZGUgaW50bworICogcGNpIHNwZWNpZmljIGZpbGVzCisgKi8KKyNkZWZpbmUgQ09ORklHX0FUSF9QQ0lFX01BWF9QRVJGIDAKKyNkZWZpbmUgQ09ORklHX0FUSF9QQ0lFX0FXQUtFX1dISUxFX0RSSVZFUl9MT0FEIDAKKyNkZWZpbmUgQ09ORklHX0FUSF9QQ0lFX0FDQ0VTU19MSUtFTFkgMAorI2RlZmluZSBDT05GSUdfUENJRV9FTkFCTEVfTDFfQ0xPQ0tfR0FURSAwCisKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX0xJS0VMWShzY24pCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19VTkxJS0VMWShzY24pCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVRfUFRSKHNjbikKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX0VORF9SRVRfUFRSKHNjbikKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbikKKyNkZWZpbmUgQV9UQVJHRVRfQUNDRVNTX0VORChzY24pCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVQoc2NuKQorI2RlZmluZSBBX1RBUkdFVF9BQ0NFU1NfRU5EX1JFVChzY24pCisjZGVmaW5lIEFfVEFSR0VUX0FDQ0VTU19CRUdJTl9SRVRfRVhUKHNjbiwgdmFsKQorI2RlZmluZSBBX1RBUkdFVF9BQ0NFU1NfRU5EX1JFVF9FWFQoc2NuLCB2YWwpCisKKyNkZWZpbmUgUV9UQVJHRVRfQUNDRVNTX0JFR0lOKHNjbikgMAorI2RlZmluZSBRX1RBUkdFVF9BQ0NFU1NfRU5EKHNjbikgMAorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlmX3BjaV9jYW5jZWxfZGVmZXJyZWRfdGFyZ2V0X3NsZWVwKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhpZl90YXJnZXRfc2xlZXBfc3RhdGVfYWRqdXN0KHN0cnVjdCBvbF9zb2Z0YyAqc2NuLAorCQkJCQkJYm9vbCBzbGVlcF9vaywgYm9vbCB3YWl0X2Zvcl9pdCkKK3sKKwlyZXR1cm47Cit9CisKKy8qKgorICogc29jX3dha2VfcmVzZXQoKSAtIHNvY193YWtlX3Jlc2V0CisgKiBAc2NuOiBvbF9zb2Z0YworICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc29jX3dha2VfcmVzZXQoc3RydWN0IG9sX3NvZnRjICpzY24pCit7Cit9CisKKy8qKgorICogaGlmX3dyaXRlMzJfbWIgLSBTTk9DIHdyaXRlIDMyCisgKiBAYWRkcjogcGh5c2ljYWwgYWRkcmVzcworICogQHZhbHVlOiB2YWx1ZQorICoKKyAqIFJldHVybjogTi9BCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWZfd3JpdGUzMl9tYih2b2lkIF9faW9tZW0gKmFkZHIsIHVpbnQzMl90IHZhbHVlKQoreworCXdtYigpOyAvKiB3cml0ZSBtZW1vcnkgYmFycmllciAqLworCXdyaXRlbF9yZWxheGVkKCh2YWx1ZSksIChhZGRyKSk7CisJd21iKCk7IC8qIHdyaXRlIG1lbW9yeSBiYXJyaWVyICovCit9CisKKy8qKgorICogaGlmX3JlYWQzMl9tYiAtIFNOT0MgcmVhZCAzMgorICogQGFkZHI6IHBoeXNpY2FsIGFkZHJlc3MKKyAqCisgKiBSZXR1cm46IE4vQQorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGhpZl9yZWFkMzJfbWIodm9pZCBfX2lvbWVtICphZGRyKQoreworCXVpbnQzMl90IHRtcDsKKwlybWIoKTsgLyogcmVhZCBtZW1vcnkgYmFycmllciAqLworCXRtcCA9IHJlYWRsX3JlbGF4ZWQoYWRkcik7CisJcm1iKCk7IC8qIHJlYWQgbWVtb3J5IGJhcnJpZXIgKi8KKwlyZXR1cm4gdG1wOworfQorCisjZGVmaW5lIEFfVEFSR0VUX1JFQUQoc2NuLCBvZmZzZXQpIFwKKwloaWZfcmVhZDMyX21iKHNjbi0+bWVtICsgKG9mZnNldCkpCisjZGVmaW5lIEFfVEFSR0VUX1dSSVRFKHNjbiwgb2Zmc2V0LCB2YWx1ZSkgXAorCWhpZl93cml0ZTMyX21iKChzY24tPm1lbSArIG9mZnNldCksICh2YWx1ZSkpCisKKyNkZWZpbmUgQURSQVNURUFfQ0VfSU5UUl9FTkFCTEVTIDB4MDAyRjAwQTgKKyNkZWZpbmUgQURSQVNURUFfQ0VfSU5UUl9FTkFCTEVTX1NFVCAiQ09NSU5HIElOIFJFR0lTVEVSIFNFVDM2IgorI2RlZmluZSBBRFJBU1RFQV9DRV9JTlRSX0VOQUJMRVNfQ0xFQVIgIkNPTUlORyBJTiBSRUdJU1RFUiBTRVQzNiIKKworI2RlZmluZSBBRFJBU1RFQV9DRV9JTlRSX1NUQVRVUyAweDAwMkYwMEFDCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZV9lbmFibGVfaXJxX2luX2luZGl2aWR1YWxfcmVnaXN0ZXIoc3RydWN0IG9sX3NvZnRjICpzY24sCisJCWludCBjZV9pZCkKK3sKKwl1aW50MzJfdCBvZmZzZXQ7CisJb2Zmc2V0ID0gSE9TVF9JRV9BRERSRVNTICsgQ0VfQkFTRV9BRERSRVNTKGNlX2lkKTsKKwloaWZfd3JpdGUzMl9tYihzY24tPm1lbSArIG9mZnNldCwgMSk7CisJaGlmX3JlYWQzMl9tYihzY24tPm1lbSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZV9kaXNhYmxlX2lycV9pbl9pbmRpdmlkdWFsX3JlZ2lzdGVyKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLAorCQlpbnQgY2VfaWQpCit7CisJdWludDMyX3Qgb2Zmc2V0OworCW9mZnNldCA9IEhPU1RfSUVfQUREUkVTUyArIENFX0JBU0VfQUREUkVTUyhjZV9pZCk7CisJaGlmX3dyaXRlMzJfbWIoc2NuLT5tZW0gKyBvZmZzZXQsIDApOworCWhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2VfcmVhZF9pcnFfZ3JvdXBfc3RhdHVzKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXVpbnQzMl90IGdyb3VwX3N0YXR1cyA9IDA7CisJZ3JvdXBfc3RhdHVzID0gaGlmX3JlYWQzMl9tYihzY24tPm1lbSArCisJCQlBRFJBU1RFQV9DRV9JTlRSX1NUQVRVUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZV9jbGVhcl9pcnFfZ3JvdXBfc3RhdHVzKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBpbnQgbWFzaykKK3sKKwl1aW50MzJfdCBncm91cF9zdGF0dXMgPSAwOworCWdyb3VwX3N0YXR1cyA9IGhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKworCQkJQURSQVNURUFfQ0VfSU5UUl9TVEFUVVMpOworCisJaGlmX3dyaXRlMzJfbWIoc2NuLT5tZW0gKworCQkJQURSQVNURUFfQ0VfSU5UUl9TVEFUVVMsIG1hc2spOworCisJZ3JvdXBfc3RhdHVzID0gaGlmX3JlYWQzMl9tYihzY24tPm1lbSArCisJCQlBRFJBU1RFQV9DRV9JTlRSX1NUQVRVUyk7Cit9CisKKy8qIHRoaXMgd2lsbCBuZWVkIHRvIGJlIGNoYW5nZWQgd2hlbiB3ZSBtb3ZlIHRvIHJlZyBzZXQgMzYKKyAqIGJlY2F1c2Ugd2Ugd2lsbCBoYXZlIHNldCAmIGNsZWFyIHJlZ2lzdGVycyBwcm92aWRlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2VfZW5hYmxlX2lycV9pbl9ncm91cF9yZWcoc3RydWN0IG9sX3NvZnRjICpzY24sCisJCWludCBtYXNrKQoreworCWludCBuZXdfbWFzayA9IDA7CisJbmV3X21hc2sgPSBoaWZfcmVhZDMyX21iKHNjbi0+bWVtICsKKwkJCUFEUkFTVEVBX0NFX0lOVFJfRU5BQkxFUyk7CisKKwluZXdfbWFzayB8PSBtYXNrOworCisJaGlmX3dyaXRlMzJfbWIoc2NuLT5tZW0gKworCQkJQURSQVNURUFfQ0VfSU5UUl9FTkFCTEVTLCBuZXdfbWFzayk7CisJbWFzayA9IGhpZl9yZWFkMzJfbWIoc2NuLT5tZW0gKworCQkJQURSQVNURUFfQ0VfSU5UUl9FTkFCTEVTKTsKK30KKworLyogdGhpcyB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZCB3aGVuIHdlIG1vdmUgdG8gcmVnIHNldCAzNgorICogYmVjYXVzZSB3ZSB3aWxsIGhhdmUgc2V0ICYgY2xlYXIgcmVnaXN0ZXJzIHByb3ZpZGVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjZV9kaXNhYmxlX2lycV9pbl9ncm91cF9yZWcoc3RydWN0IG9sX3NvZnRjICpzY24sCisJCWludCBtYXNrKQoreworCWludCBuZXdfbWFzayA9IDA7CisJbmV3X21hc2sgPSBoaWZfcmVhZDMyX21iKHNjbi0+bWVtICsKKwkJCUFEUkFTVEVBX0NFX0lOVFJfRU5BQkxFUyk7CisKKwluZXdfbWFzayAmPSB+bWFzazsKKworCWhpZl93cml0ZTMyX21iKHNjbi0+bWVtICsKKwkJCUFEUkFTVEVBX0NFX0lOVFJfRU5BQkxFUywgbmV3X21hc2spOworCW1hc2sgPSBoaWZfcmVhZDMyX21iKHNjbi0+bWVtICsKKwkJCUFEUkFTVEVBX0NFX0lOVFJfRU5BQkxFUyk7Cit9CisKKy8qKgorICogY2VfaXJxX2VuYWJsZSgpIC0gZW5hYmxlIGNvcHkgZW5naW5lIElSUQorICogQHNjbjogc3RydWN0IG9sX3NvZnRjCisgKiBAY2VfaWQ6IGNlX2lkCisgKgorICogUmV0dXJuOiBOL0EKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNlX2lycV9lbmFibGUoc3RydWN0IG9sX3NvZnRjICpzY24sCisJCWludCBjZV9pZCkKK3sKKwlpY25zc19lbmFibGVfaXJxKGNlX2lkKTsKKwljZV9lbmFibGVfaXJxX2luX2luZGl2aWR1YWxfcmVnaXN0ZXIoc2NuLCBjZV9pZCk7CisJY2VfZW5hYmxlX2lycV9pbl9ncm91cF9yZWcoc2NuLCAxPDxjZV9pZCk7Cit9CisKKy8qKgorICogY2VfaXJxX2Rpc2FibGUoKSAtIGRpc2FibGUgY29weSBlbmdpbmUgSVJRCisgKiBAc2NuOiBzdHJ1Y3Qgb2xfc29mdGMKKyAqIEBjZV9pZDogY2VfaWQKKyAqCisgKiBSZXR1cm46IE4vQQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2VfaXJxX2Rpc2FibGUoc3RydWN0IG9sX3NvZnRjICpzY24sIGludCBjZV9pZCkKK3sKKwljZV9kaXNhYmxlX2lycV9pbl9ncm91cF9yZWcoc2NuLCAxPDxjZV9pZCk7CisJY2VfY2xlYXJfaXJxX2dyb3VwX3N0YXR1cyhzY24sIDE8PGNlX2lkKTsKKwljZV9kaXNhYmxlX2lycV9pbl9pbmRpdmlkdWFsX3JlZ2lzdGVyKHNjbiwgY2VfaWQpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2hpZi9zcmMvc25vYy9pZl9zbm9jLmMgYi9jb3JlL2hpZi9zcmMvc25vYy9pZl9zbm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmYTg4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGlmL3NyYy9zbm9jL2lmX3Nub2MuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogRE9DOiBpZl9zbm9jLmMKKyAqCisgKiBjIGZpbGUgZm9yIHNub2Mgc3BlY2lmIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisjaW5jbHVkZSAiaGlmLmgiCisjaW5jbHVkZSAiaGlmX21haW4uaCIKKyNpbmNsdWRlICJoaWZfZGVidWcuaCIKKyNpbmNsdWRlICJoaWZfaW8zMi5oIgorI2luY2x1ZGUgImNlX21haW4uaCIKKyNpbmNsdWRlICJjZV90YXNrbGV0LmgiCisKKy8qKgorICogaGlmX2J1c19wcmV2ZW50X2xpbmtkb3duKCk6IHByZXZlbnQgbGlua2Rvd24KKyAqCisgKiBEdW1teSBmdW5jdGlvbiBmb3IgYnVzc2VzIGFuZCBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydAorICogbGluayBkb3duLiAgVGhpcyBtYXkgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGEgd2FrZWxvY2suCisgKgorICogVGhpcyBpcyBkdXBsaWNhdGVkIGhlcmUgYmVjYXVzZSBDT05GSUdfQ05TUyBjYW4gYmUgZGVmaW5lZAorICogZXZlbiB0aG91Z2ggaXQgaXMgbm90IHVzZWQgZm9yIHRoZSBzbm9jIGJ1cy4KKyAqLwordm9pZCBoaWZfYnVzX3ByZXZlbnRfbGlua2Rvd24oYm9vbCBmbGFnKQoreworCUhJRl9FUlJPUigid2xhbjogJXMgcGNpZSBwb3dlciBjb2xsYXBzZSBpZ25vcmVkIiwKKwkJCShmbGFnID8gImRpc2FibGUiIDogImVuYWJsZSIpKTsKK30KKworLyoqCisgKiBoaWZfdGFyZ19pc19hd2FrZSgpOiBjaGVjayBpZiB0YXJnZXQgaXMgYXdha2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzIGF3YWtlCisgKgorICogQHNjbjogc3RydWN0IG9sX3NvZnRjCisgKiBAbWVtOiBtYXBwZWQgbWVtIGJhc2UKKyAqCisgKiBSZXR1cm46IGJvb2wKKyAqLworYm9vbCBoaWZfdGFyZ19pc19hd2FrZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgdm9pZCAqX19pb21lbSAqbWVtKQoreworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGhpZl9yZXNldF9zb2MoKTogcmVzZXQgc29jCisgKgorICogdGhpcyBmdW5jdGlvbiByZXNldHMgc29jCisgKgorICogQGhpZl9jdHg6IEhJRiBjb250ZXh0CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KKy8qIEZ1bmN0aW9uIHRvIHJlc2V0IFNvQyAqLwordm9pZCBoaWZfcmVzZXRfc29jKHZvaWQgKmhpZl9jdHgpCit7Cit9CisKKy8qKgorICogaGlmX2Rpc2FibGVfaXNyKCk6IGRpc2FibGUgaXNyCisgKgorICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyBpc3IgYW5kIGtpbGxzIHRhc2tsZXRzCisgKgorICogQGhpZl9jdHg6IHN0cnVjdCBvbF9zb2Z0YworICoKKyAqIFJldHVybjogdm9pZAorICovCit2b2lkIGhpZl9kaXNhYmxlX2lzcih2b2lkICpoaWZfY3R4KQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gKHN0cnVjdCBvbF9zb2Z0YyAqKWhpZl9jdHg7CisKKwloaWZfbm9pbnRycyhzY24pOworCWNlX3Rhc2tsZXRfa2lsbChzY24tPmhpZl9oZGwpOworCWNkZl9hdG9taWNfc2V0KCZzY24tPmFjdGl2ZV90YXNrbGV0X2NudCwgMCk7Cit9CisKKy8qKgorICogZHVtcF9jZV9kZWJ1Z19yZWdpc3RlcigpOiBkdW1wIENFIGRlYnVnIHJlZ2lzdGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gZHVtcHMgQ0UgZGVidWcgcmVnaXN0ZXJzCisgKgorICogQHNjbjogc3RydWN0IG9sX3NvZnRjCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgZHVtcF9jZV9kZWJ1Z19yZWdpc3RlcihzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlyZXR1cm47Cit9CisKKy8qKgorICogaGlmX2J1c19zdXNwZW5kKCkgLSBzdXNwZW5kIHRoZSBidXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHN1c3BlbmRzIHRoZSBidXMsIGJ1dCBzbm9jIGRvZXNuJ3QgbmVlZCB0byBzdXNwZW5kLgorICogVGhlcmVmb3JlIGRvIG5vdGhpbmcuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIGFuZCBub24temVybyBmb3IgZmFpbHVyZQorICovCitpbnQgaGlmX2J1c19zdXNwZW5kKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGlmX2J1c19yZXN1bWUoKSAtIGhpZiByZXN1bWUgQVBJCisgKgorICogVGhpcyBmdW5jdGlvbiByZXN1bWVzIHRoZSBidXMuIGJ1dCBzbm9jIGRvZXNuJ3QgbmVlZCB0byByZXN1bWUuCisgKiBUaGVyZWZvcmUgZG8gbm90aGluZy4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MgYW5kIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgKi8KK2ludCBoaWZfYnVzX3Jlc3VtZSh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIGhpZl9lbmFibGVfcG93ZXJfZ2F0aW5nKCk6IGVuYWJsZSBIVyBwb3dlciBnYXRpbmcKKyAqCisgKiBSZXR1cm46IG4vYQorICovCit2b2lkIGhpZl9lbmFibGVfcG93ZXJfZ2F0aW5nKHZvaWQgKmhpZl9jdHgpCit7Cit9CisKKy8qKgorICogaGlmX2Rpc2FibGVfYXNwbSgpOiBoaWZfZGlzYWJsZV9hc3BtCisgKgorICogUmV0dXJuOiBuL2EKKyAqLwordm9pZCBoaWZfZGlzYWJsZV9hc3BtKHZvaWQpCit7Cit9CisKKy8qKgorICogaGlmX2J1c19jbG9zZSgpOiBoaWZfYnVzX2Nsb3NlCisgKgorICogUmV0dXJuOiBuL2EKKyAqLwordm9pZCBoaWZfYnVzX2Nsb3NlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworfQorCisvKioKKyAqIGhpZl9idXNfb3BlbigpOiBoaWZfYnVzX29wZW4KKyAqIEBzY246IHNjbgorICogQGJ1c190eXBlOiBidXMgdHlwZQorICoKKyAqIFJldHVybjogbi9hCisgKi8KK0NERl9TVEFUVVMgaGlmX2J1c19vcGVuKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBlbnVtIGF0aF9oYWxfYnVzX3R5cGUgYnVzX3R5cGUpCit7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBoaWZfZ2V0X3RhcmdldF90eXBlKCk6IEdldCB0aGUgdGFyZ2V0IHR5cGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcXVlcnkgdGhlIHRhcmdldCB0eXBlLgorICoKKyAqIEBvbF9zYzogb2xfc29mdGMgc3RydWN0IHBvaW50ZXIKKyAqIEBkZXY6IGRldmljZSBwb2ludGVyCisgKiBAYmRldjogYnVzIGRldiBwb2ludGVyCisgKiBAYmlkOiBidXMgaWQgcG9pbnRlcgorICogQGhpZl90eXBlOiBISUYgdHlwZSBzdWNoIGFzIEhJRl9UWVBFX1FDQTYxODAKKyAqIEB0YXJnZXRfdHlwZTogdGFyZ2V0IHR5cGUgc3VjaCBhcyBUQVJHRVRfVFlQRV9RQ0E2MTgwCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzCisgKi8KK2ludCBoaWZfZ2V0X3RhcmdldF90eXBlKHN0cnVjdCBvbF9zb2Z0YyAqb2xfc2MsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwl2b2lkICpiZGV2LCBjb25zdCBoaWZfYnVzX2lkICpiaWQsIHVpbnQzMl90ICpoaWZfdHlwZSwKKwl1aW50MzJfdCAqdGFyZ2V0X3R5cGUpCit7CisJLyogVE9ETzogbmVlZCB0byB1c2UgQ05TUydzIEhXIHZlcnNpb24uIEhhcmQgY29kZSBmb3Igbm93ICovCisjaWZkZWYgUUNBX1dJRklfM18wX0FEUkFTVEVBCisJKmhpZl90eXBlID0gSElGX1RZUEVfQURSQVNURUE7CisJKnRhcmdldF90eXBlID0gVEFSR0VUX1RZUEVfQURSQVNURUE7CisjZWxzZQorCSpoaWZfdHlwZSA9IDA7CisJKnRhcmdldF90eXBlID0gMDsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKioKKyAqIGhpZl9lbmFibGVfYnVzKCk6IGhpZl9lbmFibGVfYnVzCisgKiBAZGV2OiBkZXYKKyAqIEBiZGV2OiBidXMgZGV2CisgKiBAYmlkOiBidXMgaWQKKyAqIEB0eXBlOiBidXMgdHlwZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIGhpZl9lbmFibGVfYnVzKHN0cnVjdCBvbF9zb2Z0YyAqb2xfc2MsCisJCQkgIHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqYmRldiwKKwkJCSAgY29uc3QgaGlmX2J1c19pZCAqYmlkLAorCQkJICBlbnVtIGhpZl9lbmFibGVfdHlwZSB0eXBlKQoreworCWludCByZXQ7CisJaW50IGhpZl90eXBlOworCWludCB0YXJnZXRfdHlwZTsKKwlyZXQgPSBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJaWYgKHJldCkgeworCQlISUZfRVJST1IoIiVzOiBmYWlsZWQgdG8gc2V0IGRtYSBtYXNrIGVycm9yID0gJWQiLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghb2xfc2MpIHsKKwkJSElGX0VSUk9SKCIlczogaGlmX2N0eCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCW9sX3NjLT5hcHNfb3NkZXYuZGV2aWNlID0gZGV2OworCW9sX3NjLT5hcHNfb3NkZXYuYmMuYmNfaGFuZGxlID0gKHZvaWQgKilvbF9zYy0+bWVtOworCW9sX3NjLT5hcHNfb3NkZXYuYmMuYmNfYnVzdHlwZSA9IHR5cGU7CisKKwlyZXQgPSBoaWZfZ2V0X3RhcmdldF90eXBlKG9sX3NjLCBkZXYsIGJkZXYsIGJpZCwKKwkJCSZoaWZfdHlwZSwgJnRhcmdldF90eXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlISUZfRVJST1IoIiVzOiBpbnZhbGlkIGRldmljZSBpZC9yZXZpc2lvbl9pZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWhpZl9yZWdpc3Rlcl90YmxfYXR0YWNoKG9sX3NjLCBoaWZfdHlwZSk7CisJdGFyZ2V0X3JlZ2lzdGVyX3RibF9hdHRhY2gob2xfc2MsIHRhcmdldF90eXBlKTsKKworCUhJRl9UUkFDRSgiJXM6IFggLSBoaWZfdHlwZSA9IDB4JXgsIHRhcmdldF90eXBlID0gMHgleCIsCisJCSAgX19mdW5jX18sIGhpZl90eXBlLCB0YXJnZXRfdHlwZSk7CisKKwlyZXQgPSBoaWZfaW5pdF9jZGZfY3R4KG9sX3NjKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJSElGX0VSUk9SKCIlczogY2Fubm90IGluaXQgQ0RGIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBoaWZfZGlzYWJsZV9idXMoKTogaGlmX2Rpc2FibGVfYnVzCisgKgorICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB0aGUgYnVzCisgKgorICogQGJkZXY6IGJ1cyBkZXYKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBoaWZfZGlzYWJsZV9idXModm9pZCAqYmRldikKK3sKK30KKworLyoqCisgKiBoaWZfbm9pbnRycygpOiBkaXNhYmxlIElSUQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc3RvcHMgaW50ZXJydXB0KHMpCisgKgorICogQHNjbjogc3RydWN0IG9sX3NvZnRjCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaGlmX25vaW50cnMoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJaWYgKHNjbi0+cmVxdWVzdF9pcnFfZG9uZSkgeworCQljZV91bnJlZ2lzdGVyX2lycShzY24tPmhpZl9oZGwsIDB4ZmZmKTsKKwkJc2NuLT5yZXF1ZXN0X2lycV9kb25lID0gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9odGMvZGxfbGlzdC5oIGIvY29yZS9odGMvZGxfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNWQ3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2h0Yy9kbF9saXN0LmgKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogRG91YmxlLWxpbmsgbGlzdCBkZWZpbml0aW9ucyAoYWRhcHRlZCBmcm9tIEF0aGVyb3MgU0RJTyBzdGFjaykgKi8KKy8qICovCisvKiBBdXRob3Iocyk6ID0iQXRoZXJvcyIgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZuZGVmIF9fRExfTElTVF9IX19fCisjZGVmaW5lIF9fRExfTElTVF9IX19fCisKKyNkZWZpbmUgQV9DT05UQUlOSU5HX1NUUlVDVChhZGRyZXNzLCBzdHJ1Y3RfdHlwZSwgZmllbGRfbmFtZSkgXAorCSgoc3RydWN0X3R5cGUgKikoKGNoYXIgKikoYWRkcmVzcykgLSAoY2hhciAqKSgmKChzdHJ1Y3RfdHlwZSAqKTApLT5maWVsZF9uYW1lKSkpCisKKy8qIGxpc3QgZnVuY3Rpb25zICovCisvKiBwb2ludGVycyBmb3IgdGhlIGxpc3QgKi8KK3R5cGVkZWYgc3RydWN0IF9ETF9MSVNUIHsKKwlzdHJ1Y3QgX0RMX0xJU1QgKnBQcmV2OworCXN0cnVjdCBfRExfTElTVCAqcE5leHQ7Cit9IERMX0xJU1QsICpQRExfTElTVDsKKy8qCisgKiBETF9MSVNUX0lOSVQgLCBpbml0aWFsaXplIGRvdWJseSBsaW5rZWQgbGlzdAorICovCisjZGVmaW5lIERMX0xJU1RfSU5JVChwTGlzdCkgXAorCXsocExpc3QpLT5wUHJldiA9IHBMaXN0OyAocExpc3QpLT5wTmV4dCA9IHBMaXN0OyB9CisKKy8qIGZhc3RlciBtYWNybyB0byBpbml0IGxpc3QgYW5kIGFkZCBhIHNpbmdsZSBpdGVtICovCisjZGVmaW5lIERMX0xJU1RfSU5JVF9BTkRfQUREKHBMaXN0LHBJdGVtKSBcCisJeyAgIChwTGlzdCktPnBQcmV2ID0gKHBJdGVtKTsgXAorCSAgICAocExpc3QpLT5wTmV4dCA9IChwSXRlbSk7IFwKKwkgICAgKHBJdGVtKS0+cE5leHQgPSAocExpc3QpOyBcCisJICAgIChwSXRlbSktPnBQcmV2ID0gKHBMaXN0KTsgXAorCX0KKworI2RlZmluZSBETF9MSVNUX0lTX0VNUFRZKHBMaXN0KSAoKChwTGlzdCktPnBQcmV2ID09IChwTGlzdCkpICYmICgocExpc3QpLT5wTmV4dCA9PSAocExpc3QpKSkKKyNkZWZpbmUgRExfTElTVF9HRVRfSVRFTV9BVF9IRUFEKHBMaXN0KSAocExpc3QpLT5wTmV4dAorI2RlZmluZSBETF9MSVNUX0dFVF9JVEVNX0FUX1RBSUwocExpc3QpIChwTGlzdCktPnBQcmV2CisvKgorICogSVRFUkFURV9PVkVSX0xJU1QgcFN0YXJ0IGlzIHRoZSBsaXN0LCBwVGVtcCBpcyBhIHRlbXAgbGlzdCBtZW1iZXIKKyAqIE5PVDogZG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHRoZSBpdGVtcyBpbiB0aGUgbGlzdCBhcmUgZGVsZXRlZCBpbnNpZGUgdGhlCisgKiBpdGVyYXRpb24gbG9vcAorICovCisjZGVmaW5lIElURVJBVEVfT1ZFUl9MSVNUKHBTdGFydCwgcFRlbXApIFwKKwlmb3IoKHBUZW1wKSA9KHBTdGFydCktPnBOZXh0OyBwVGVtcCAhPSAocFN0YXJ0KTsgKHBUZW1wKSA9IChwVGVtcCktPnBOZXh0KQorCitzdGF0aWMgX19pbmxpbmUgYm9vbCBkbF9saXN0X2lzX2VudHJ5X2luX2xpc3QoY29uc3QgRExfTElTVCAqcExpc3QsCisJCQkJCSAgICAgIGNvbnN0IERMX0xJU1QgKnBFbnRyeSkKK3sKKwljb25zdCBETF9MSVNUICpwVG1wOworCisJaWYgKHBMaXN0ID09IHBFbnRyeSkKKwkJcmV0dXJuIHRydWU7CisKKwlJVEVSQVRFX09WRVJfTElTVChwTGlzdCwgcFRtcCkgeworCQlpZiAocFRtcCA9PSBwRW50cnkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKiBzYWZlIGl0ZXJhdGUgbWFjcm8gdGhhdCBhbGxvd3MgdGhlIGl0ZW0gdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0CisgKiB0aGUgaXRlcmF0aW9uIGNvbnRpbnVlcyB0byB0aGUgbmV4dCBpdGVtIGluIHRoZSBsaXN0CisgKi8KKyNkZWZpbmUgSVRFUkFURV9PVkVSX0xJU1RfQUxMT1dfUkVNT1ZFKHBTdGFydCxwSXRlbSxzdCxvZmZzZXQpCVwKKwl7CQkJCQkJCVwKKwkJUERMX0xJU1QgcFRlbXA7CQkJCQkgICAgXAorCQlwVGVtcCA9IChwU3RhcnQpLT5wTmV4dDsJCQkgICAgXAorCQl3aGlsZSAocFRlbXAgIT0gKHBTdGFydCkpIHsJCQkgICAgXAorCQkJKHBJdGVtKSA9IEFfQ09OVEFJTklOR19TVFJVQ1QocFRlbXAsc3Qsb2Zmc2V0KTsJICBcCisJCQlwVGVtcCA9IHBUZW1wLT5wTmV4dDsJCQkgICAgICAgXAorCisjZGVmaW5lIElURVJBVEVfSVNfVkFMSUQocFN0YXJ0KSAgICBkbF9saXN0X2lzX2VudHJ5X2luX2xpc3QocFN0YXJ0LCBwVGVtcCkKKyNkZWZpbmUgSVRFUkFURV9SRVNFVChwU3RhcnQpICAgICAgIHBUZW1wPShwU3RhcnQpLT5wTmV4dAorCisjZGVmaW5lIElURVJBVEVfRU5EIH19CisKKy8qCisgKiBkbF9saXN0X2luc2VydF90YWlsIC0gaW5zZXJ0IHBBZGQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAorICovCitzdGF0aWMgX19pbmxpbmUgUERMX0xJU1QgZGxfbGlzdF9pbnNlcnRfdGFpbChQRExfTElTVCBwTGlzdCwgUERMX0xJU1QgcEFkZCkKK3sKKwkvKiBpbnNlcnQgYXQgdGFpbCAqLworCXBBZGQtPnBQcmV2ID0gcExpc3QtPnBQcmV2OworCXBBZGQtPnBOZXh0ID0gcExpc3Q7CisJaWYgKHBMaXN0LT5wUHJldikgeworCQlwTGlzdC0+cFByZXYtPnBOZXh0ID0gcEFkZDsKKwl9CisJcExpc3QtPnBQcmV2ID0gcEFkZDsKKwlyZXR1cm4gcEFkZDsKK30KKworLyoKKyAqIGRsX2xpc3RfaW5zZXJ0X2hlYWQgLSBpbnNlcnQgcEFkZCBpbnRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0CisgKi8KK3N0YXRpYyBfX2lubGluZSBQRExfTElTVCBkbF9saXN0X2luc2VydF9oZWFkKFBETF9MSVNUIHBMaXN0LCBQRExfTElTVCBwQWRkKQoreworCS8qIGluc2VydCBhdCBoZWFkICovCisJcEFkZC0+cFByZXYgPSBwTGlzdDsKKwlwQWRkLT5wTmV4dCA9IHBMaXN0LT5wTmV4dDsKKwlwTGlzdC0+cE5leHQtPnBQcmV2ID0gcEFkZDsKKwlwTGlzdC0+cE5leHQgPSBwQWRkOworCXJldHVybiBwQWRkOworfQorCisjZGVmaW5lIERMX0xpc3RBZGQocExpc3QscEl0ZW0pIGRsX2xpc3RfaW5zZXJ0X2hlYWQoKHBMaXN0KSwocEl0ZW0pKQorLyoKKyAqIGRsX2xpc3RfcmVtb3ZlIC0gcmVtb3ZlIHBEZWwgZnJvbSBsaXN0CisgKi8KK3N0YXRpYyBfX2lubGluZSBQRExfTElTVCBkbF9saXN0X3JlbW92ZShQRExfTElTVCBwRGVsKQoreworCWlmIChwRGVsLT5wTmV4dCAhPSBOVUxMKSB7CisJCXBEZWwtPnBOZXh0LT5wUHJldiA9IHBEZWwtPnBQcmV2OworCX0KKwlpZiAocERlbC0+cFByZXYgIT0gTlVMTCkgeworCQlwRGVsLT5wUHJldi0+cE5leHQgPSBwRGVsLT5wTmV4dDsKKwl9CisKKwkvKiBwb2ludCBiYWNrIHRvIGl0c2VsZiBqdXN0IHRvIGJlIHNhZmUsIGluY2FzZSByZW1vdmUgaXMgY2FsbGVkIGFnYWluICovCisJcERlbC0+cE5leHQgPSBwRGVsOworCXBEZWwtPnBQcmV2ID0gcERlbDsKKwlyZXR1cm4gcERlbDsKK30KKworLyoKKyAqIGRsX2xpc3RfcmVtb3ZlX2l0ZW1fZnJvbV9oZWFkIC0gZ2V0IGEgbGlzdCBpdGVtIGZyb20gdGhlIGhlYWQKKyAqLworc3RhdGljIF9faW5saW5lIFBETF9MSVNUIGRsX2xpc3RfcmVtb3ZlX2l0ZW1fZnJvbV9oZWFkKFBETF9MSVNUIHBMaXN0KQoreworCVBETF9MSVNUIHBJdGVtID0gTlVMTDsKKwlpZiAocExpc3QtPnBOZXh0ICE9IHBMaXN0KSB7CisJCXBJdGVtID0gcExpc3QtPnBOZXh0OworCQkvKiByZW1vdmUgdGhlIGZpcnN0IGl0ZW0gZnJvbSBoZWFkICovCisJCWRsX2xpc3RfcmVtb3ZlKHBJdGVtKTsKKwl9CisJcmV0dXJuIHBJdGVtOworfQorCitzdGF0aWMgX19pbmxpbmUgUERMX0xJU1QgZGxfbGlzdF9yZW1vdmVfaXRlbV9mcm9tX3RhaWwoUERMX0xJU1QgcExpc3QpCit7CisJUERMX0xJU1QgcEl0ZW0gPSBOVUxMOworCWlmIChwTGlzdC0+cFByZXYgIT0gcExpc3QpIHsKKwkJcEl0ZW0gPSBwTGlzdC0+cFByZXY7CisJCS8qIHJlbW92ZSB0aGUgaXRlbSBmcm9tIHRhaWwgKi8KKwkJZGxfbGlzdF9yZW1vdmUocEl0ZW0pOworCX0KKwlyZXR1cm4gcEl0ZW07Cit9CisKKy8qIHRyYW5zZmVyIHNyYyBsaXN0IGl0ZW1zIHRvIHRoZSB0YWlsIG9mIHRoZSBkZXN0aW5hdGlvbiBsaXN0ICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBkbF9saXN0X3RyYW5zZmVyX2l0ZW1zX3RvX3RhaWwoUERMX0xJU1QgcERlc3QsIFBETF9MSVNUIHBTcmMpCit7CisJLyogb25seSBjb25jYXRlbmF0ZSBpZiBzcmMgaXMgbm90IGVtcHR5ICovCisJaWYgKCFETF9MSVNUX0lTX0VNUFRZKHBTcmMpKSB7CisJCS8qIGN1dCBvdXQgY2lyY3VsYXIgbGlzdCBpbiBzcmMgYW5kIHJlLWF0dGFjaCB0byBlbmQgb2YgZGVzdCAqLworCQlwU3JjLT5wUHJldi0+cE5leHQgPSBwRGVzdDsKKwkJcFNyYy0+cE5leHQtPnBQcmV2ID0gcERlc3QtPnBQcmV2OworCQlwRGVzdC0+cFByZXYtPnBOZXh0ID0gcFNyYy0+cE5leHQ7CisJCXBEZXN0LT5wUHJldiA9IHBTcmMtPnBQcmV2OworCQkvKiB0ZXJtaW5hdGUgc3JjIGxpc3QsIGl0IGlzIG5vdyBlbXB0eSAqLworCQlwU3JjLT5wUHJldiA9IHBTcmM7CisJCXBTcmMtPnBOZXh0ID0gcFNyYzsKKwl9Cit9CisKKy8qIHRyYW5zZmVyIHNyYyBsaXN0IGl0ZW1zIHRvIHRoZSBoZWFkIG9mIHRoZSBkZXN0aW5hdGlvbiBsaXN0ICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBkbF9saXN0X3RyYW5zZmVyX2l0ZW1zX3RvX2hlYWQoUERMX0xJU1QgcERlc3QsIFBETF9MSVNUIHBTcmMpCit7CisJLyogb25seSBjb25jYXRlbmF0ZSBpZiBzcmMgaXMgbm90IGVtcHR5ICovCisJaWYgKCFETF9MSVNUX0lTX0VNUFRZKHBTcmMpKSB7CisJCS8qIGN1dCBvdXQgY2lyY3VsYXIgbGlzdCBpbiBzcmMgYW5kIHJlLWF0dGFjaCB0byBzdGFydCBvZiBkZXN0ICovCisJCXBTcmMtPnBOZXh0LT5wUHJldiA9IHBEZXN0OworCQlwRGVzdC0+cE5leHQtPnBQcmV2ID0gcFNyYy0+cFByZXY7CisJCXBTcmMtPnBQcmV2LT5wTmV4dCA9IHBEZXN0LT5wTmV4dDsKKwkJcERlc3QtPnBOZXh0ID0gcFNyYy0+cE5leHQ7CisJCS8qIHRlcm1pbmF0ZSBzcmMgbGlzdCwgaXQgaXMgbm93IGVtcHR5ICovCisJCXBTcmMtPnBQcmV2ID0gcFNyYzsKKwkJcFNyYy0+cE5leHQgPSBwU3JjOworCX0KK30KKworI2VuZGlmIC8qIF9fRExfTElTVF9IX19fICovCmRpZmYgLS1naXQgYS9jb3JlL2h0Yy9odGMuYyBiL2NvcmUvaHRjL2h0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYWJlZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2h0Yy9odGMuYwpAQCAtMCwwICsxLDgxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgIm9sX2lmX2F0aHZhci5oIgorI2luY2x1ZGUgImh0Y19kZWJ1Zy5oIgorI2luY2x1ZGUgImh0Y19pbnRlcm5hbC5oIgorI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90ICovCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+ICAgICAgICAgIC8qIGNkZl9wcmludCAqLworI2luY2x1ZGUgPGhpZi5oPgorI2luY2x1ZGUgPGNkc19nZXRfYmluLmg+CisjaW5jbHVkZSAiZXBwaW5nX21haW4uaCIKKyNpbmNsdWRlICJoaWZfaW8zMi5oIgorCisjaWZkZWYgREVCVUcKK3N0YXRpYyBBVEhfREVCVUdfTUFTS19ERVNDUklQVElPTiBnX2h0Y19kZWJ1Z19kZXNjcmlwdGlvbltdID0geworCXtBVEhfREVCVUdfU0VORCwgIlNlbmQifSwKKwl7QVRIX0RFQlVHX1JFQ1YsICJSZWN2In0sCisJe0FUSF9ERUJVR19TWU5DLCAiU3luYyJ9LAorCXtBVEhfREVCVUdfRFVNUCwgIkR1bXAgRGF0YSAoUlggb3IgVFgpIn0sCisJe0FUSF9ERUJVR19TRVRVUCwgIlNldHVwIn0sCit9OworCitBVEhfREVCVUdfSU5TVEFOVElBVEVfTU9EVUxFX1ZBUihodGMsCisJCQkJICJodGMiLAorCQkJCSAiSG9zdCBUYXJnZXQgQ29tbXVuaWNhdGlvbnMiLAorCQkJCSBBVEhfREVCVUdfTUFTS19ERUZBVUxUUyB8IEFUSF9ERUJVR19JTkZPIHwKKwkJCQkgQVRIX0RFQlVHX1NFVFVQLAorCQkJCSBBVEhfREVCVUdfREVTQ1JJUFRJT05fQ09VTlQKKwkJCQkJIChnX2h0Y19kZWJ1Z19kZXNjcmlwdGlvbiksCisJCQkJIGdfaHRjX2RlYnVnX2Rlc2NyaXB0aW9uKTsKKworI2VuZGlmCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgaHRjX2NyZWRpdF9mbG93OworCitzdGF0aWMgdm9pZCByZXNldF9lbmRwb2ludF9zdGF0ZXMoSFRDX1RBUkdFVCAqdGFyZ2V0KTsKKworc3RhdGljIHZvaWQgZGVzdHJveV9odGNfdHhfY3RybF9wYWNrZXQoSFRDX1BBQ0tFVCAqcFBhY2tldCkKK3sKKwljZGZfbmJ1Zl90IG5ldGJ1ZjsKKwluZXRidWYgPSAoY2RmX25idWZfdCkgR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKHBQYWNrZXQpOworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfVFJDLCAoImZyZWUgY3RybCBuZXRidWYgOjB4JXAgXG4iLCBuZXRidWYpKTsKKwlpZiAobmV0YnVmICE9IE5VTEwpIHsKKwkJY2RmX25idWZfZnJlZShuZXRidWYpOworCX0KKworCWNkZl9tZW1fZnJlZShwUGFja2V0KTsKK30KKworc3RhdGljIEhUQ19QQUNLRVQgKmJ1aWxkX2h0Y190eF9jdHJsX3BhY2tldChjZGZfZGV2aWNlX3Qgb3NkZXYpCit7CisJSFRDX1BBQ0tFVCAqcFBhY2tldCA9IE5VTEw7CisJY2RmX25idWZfdCBuZXRidWY7CisKKwlkbyB7CisJCXBQYWNrZXQgPSAoSFRDX1BBQ0tFVCAqKSBjZGZfbWVtX21hbGxvYyhzaXplb2YoSFRDX1BBQ0tFVCkpOworCQlpZiAoTlVMTCA9PSBwUGFja2V0KSB7CisJCQlicmVhazsKKwkJfQorCQlBX01FTVpFUk8ocFBhY2tldCwgc2l6ZW9mKEhUQ19QQUNLRVQpKTsKKwkJbmV0YnVmID0KKwkJCWNkZl9uYnVmX2FsbG9jKG9zZGV2LCBIVENfQ09OVFJPTF9CVUZGRVJfU0laRSwgMjAsIDQsIHRydWUpOworCQlpZiAoTlVMTCA9PSBuZXRidWYpIHsKKwkJCWNkZl9tZW1fZnJlZShwUGFja2V0KTsKKwkJCXBQYWNrZXQgPSBOVUxMOworCQkJY2RmX3ByaW50KCIlczogbmJ1ZiBhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfVFJDLAorCQkJCSgiYWxsb2MgY3RybCBuZXRidWYgOjB4JXAgXG4iLCBuZXRidWYpKTsKKwkJU0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKHBQYWNrZXQsIG5ldGJ1Zik7CisJfSB3aGlsZSAoZmFsc2UpOworCisJcmV0dXJuIHBQYWNrZXQ7Cit9CisKK3ZvaWQgaHRjX2ZyZWVfY29udHJvbF90eF9wYWNrZXQoSFRDX1RBUkdFVCAqdGFyZ2V0LCBIVENfUEFDS0VUICpwUGFja2V0KQoreworCisjaWZkZWYgVE9ET19GSVhNRQorCUxPQ0tfSFRDKHRhcmdldCk7CisJSFRDX1BBQ0tFVF9FTlFVRVVFKCZ0YXJnZXQtPkNvbnRyb2xCdWZmZXJUWEZyZWVMaXN0LCBwUGFja2V0KTsKKwlVTkxPQ0tfSFRDKHRhcmdldCk7CisJLyogVE9ET19GSVhNRSBuZXRidWZzIGNhbm5vdCBiZSBSRVNFVCEgKi8KKyNlbHNlCisJZGVzdHJveV9odGNfdHhfY3RybF9wYWNrZXQocFBhY2tldCk7CisjZW5kaWYKKworfQorCitIVENfUEFDS0VUICpodGNfYWxsb2NfY29udHJvbF90eF9wYWNrZXQoSFRDX1RBUkdFVCAqdGFyZ2V0KQoreworI2lmZGVmIFRPRE9fRklYTUUKKwlIVENfUEFDS0VUICpwUGFja2V0OworCisJTE9DS19IVEModGFyZ2V0KTsKKwlwUGFja2V0ID0gaHRjX3BhY2tldF9kZXF1ZXVlKCZ0YXJnZXQtPkNvbnRyb2xCdWZmZXJUWEZyZWVMaXN0KTsKKwlVTkxPQ0tfSFRDKHRhcmdldCk7CisKKwlyZXR1cm4gcFBhY2tldDsKKyNlbHNlCisJcmV0dXJuIGJ1aWxkX2h0Y190eF9jdHJsX3BhY2tldCh0YXJnZXQtPm9zZGV2KTsKKyNlbmRpZgorfQorCisvKiBTZXQgdGhlIHRhcmdldCBmYWlsdXJlIGhhbmRsaW5nIGNhbGxiYWNrICovCit2b2lkIGh0Y19zZXRfdGFyZ2V0X2ZhaWx1cmVfY2FsbGJhY2soSFRDX0hBTkRMRSBIVENIYW5kbGUsCisJCQkJICAgICBIVENfVEFSR0VUX0ZBSUxVUkUgQ2FsbGJhY2spCit7CisJSFRDX1RBUkdFVCAqdGFyZ2V0ID0gR0VUX0hUQ19UQVJHRVRfRlJPTV9IQU5ETEUoSFRDSGFuZGxlKTsKKwl0YXJnZXQtPkhUQ0luaXRJbmZvLlRhcmdldEZhaWx1cmUgPSBDYWxsYmFjazsKK30KKwordm9pZCBodGNfZHVtcChIVENfSEFORExFIEhUQ0hhbmRsZSwgdWludDhfdCBDbWRJZCwgYm9vbCBzdGFydCkKK3sKKwlIVENfVEFSR0VUICp0YXJnZXQgPSBHRVRfSFRDX1RBUkdFVF9GUk9NX0hBTkRMRShIVENIYW5kbGUpOworCWhpZl9kdW1wKHRhcmdldC0+aGlmX2RldiwgQ21kSWQsIHN0YXJ0KTsKK30KKworLyogY2xlYW51cCB0aGUgSFRDIGluc3RhbmNlICovCitzdGF0aWMgdm9pZCBodGNfY2xlYW51cChIVENfVEFSR0VUICp0YXJnZXQpCit7CisJSFRDX1BBQ0tFVCAqcFBhY2tldDsKKwkvKiBjZGZfbmJ1Zl90IG5ldGJ1ZjsgKi8KKworCWlmICh0YXJnZXQtPmhpZl9kZXYgIT0gTlVMTCkgeworCQloaWZfZGV0YWNoX2h0Yyh0YXJnZXQtPmhpZl9kZXYpOworCQl0YXJnZXQtPmhpZl9kZXYgPSBOVUxMOworCX0KKworCXdoaWxlICh0cnVlKSB7CisJCXBQYWNrZXQgPSBhbGxvY2F0ZV9odGNfcGFja2V0X2NvbnRhaW5lcih0YXJnZXQpOworCQlpZiAoTlVMTCA9PSBwUGFja2V0KSB7CisJCQlicmVhazsKKwkJfQorCQljZGZfbWVtX2ZyZWUocFBhY2tldCk7CisJfQorCisJcFBhY2tldCA9IHRhcmdldC0+cEJ1bmRsZUZyZWVMaXN0OworCXdoaWxlIChwUGFja2V0KSB7CisJCUhUQ19QQUNLRVQgKnBQYWNrZXRUbXAgPSAoSFRDX1BBQ0tFVCAqKSBwUGFja2V0LT5MaXN0TGluay5wTmV4dDsKKwkJY2RmX21lbV9mcmVlKHBQYWNrZXQpOworCQlwUGFja2V0ID0gcFBhY2tldFRtcDsKKwl9CisjaWZkZWYgVE9ET19GSVhNRQorCXdoaWxlICh0cnVlKSB7CisJCXBQYWNrZXQgPSBodGNfYWxsb2NfY29udHJvbF90eF9wYWNrZXQodGFyZ2V0KTsKKwkJaWYgKE5VTEwgPT0gcFBhY2tldCkgeworCQkJYnJlYWs7CisJCX0KKwkJbmV0YnVmID0gKGNkZl9uYnVmX3QpIEdFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVChwUGFja2V0KTsKKwkJaWYgKG5ldGJ1ZiAhPSBOVUxMKSB7CisJCQljZGZfbmJ1Zl9mcmVlKG5ldGJ1Zik7CisJCX0KKworCQljZGZfbWVtX2ZyZWUocFBhY2tldCk7CisJfQorI2VuZGlmCisKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmdGFyZ2V0LT5IVENMb2NrKTsKKwljZGZfc3BpbmxvY2tfZGVzdHJveSgmdGFyZ2V0LT5IVENSeExvY2spOworCWNkZl9zcGlubG9ja19kZXN0cm95KCZ0YXJnZXQtPkhUQ1R4TG9jayk7CisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJnRhcmdldC0+SFRDQ3JlZGl0TG9jayk7CisKKwkvKiBmcmVlIG91ciBpbnN0YW5jZSAqLworCWNkZl9tZW1fZnJlZSh0YXJnZXQpOworfQorCisvKiByZWdpc3RlcmVkIHRhcmdldCBhcnJpdmFsIGNhbGxiYWNrIGZyb20gdGhlIEhJRiBsYXllciAqLworSFRDX0hBTkRMRSBodGNfY3JlYXRlKHZvaWQgKm9sX3NjLCBIVENfSU5JVF9JTkZPICpwSW5mbywgY2RmX2RldmljZV90IG9zZGV2KQoreworCXN0cnVjdCBoaWZfbXNnX2NhbGxiYWNrcyBodGNDYWxsYmFja3M7CisJSFRDX0VORFBPSU5UICpwRW5kcG9pbnQgPSBOVUxMOworCUhUQ19UQVJHRVQgKnRhcmdldCA9IE5VTEw7CisJaW50IGk7CisKKwlpZiAob2xfc2MgPT0gTlVMTCkgeworCQlIVENfRVJST1IoIiVzOiBvbF9zYyA9IE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwlIVENfVFJBQ0UoIitodGNfY3JlYXRlIC4uICBISUYgOiVwIiwgb2xfc2MpOworCisJQV9SRUdJU1RFUl9NT0RVTEVfREVCVUdfSU5GTyhodGMpOworCisJdGFyZ2V0ID0gKEhUQ19UQVJHRVQgKikgY2RmX21lbV9tYWxsb2Moc2l6ZW9mKEhUQ19UQVJHRVQpKTsKKwlpZiAodGFyZ2V0ID09IE5VTEwpIHsKKwkJSFRDX0VSUk9SKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJQV9NRU1aRVJPKHRhcmdldCwgc2l6ZW9mKEhUQ19UQVJHRVQpKTsKKworCWNkZl9zcGlubG9ja19pbml0KCZ0YXJnZXQtPkhUQ0xvY2spOworCWNkZl9zcGlubG9ja19pbml0KCZ0YXJnZXQtPkhUQ1J4TG9jayk7CisJY2RmX3NwaW5sb2NrX2luaXQoJnRhcmdldC0+SFRDVHhMb2NrKTsKKwljZGZfc3BpbmxvY2tfaW5pdCgmdGFyZ2V0LT5IVENDcmVkaXRMb2NrKTsKKworCWRvIHsKKwkJQV9NRU1DUFkoJnRhcmdldC0+SFRDSW5pdEluZm8sIHBJbmZvLCBzaXplb2YoSFRDX0lOSVRfSU5GTykpOworCQl0YXJnZXQtPmhvc3RfaGFuZGxlID0gcEluZm8tPnBDb250ZXh0OworCQl0YXJnZXQtPm9zZGV2ID0gb3NkZXY7CisKKwkJcmVzZXRfZW5kcG9pbnRfc3RhdGVzKHRhcmdldCk7CisKKwkJSU5JVF9IVENfUEFDS0VUX1FVRVVFKCZ0YXJnZXQtPkNvbnRyb2xCdWZmZXJUWEZyZWVMaXN0KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgSFRDX1BBQ0tFVF9DT05UQUlORVJfQUxMT0NBVElPTjsgaSsrKSB7CisJCQlIVENfUEFDS0VUICpwUGFja2V0ID0KKwkJCQkoSFRDX1BBQ0tFVCAqKSBjZGZfbWVtX21hbGxvYyhzaXplb2YoSFRDX1BBQ0tFVCkpOworCQkJaWYgKHBQYWNrZXQgIT0gTlVMTCkgeworCQkJCUFfTUVNWkVSTyhwUGFja2V0LCBzaXplb2YoSFRDX1BBQ0tFVCkpOworCQkJCWZyZWVfaHRjX3BhY2tldF9jb250YWluZXIodGFyZ2V0LCBwUGFja2V0KTsKKwkJCX0KKwkJfQorCisjaWZkZWYgVE9ET19GSVhNRQorCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPTlRST0xfVFhfQlVGRkVSUzsgaSsrKSB7CisJCQlwUGFja2V0ID0gYnVpbGRfaHRjX3R4X2N0cmxfcGFja2V0KCk7CisJCQlpZiAoTlVMTCA9PSBwUGFja2V0KSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlodGNfZnJlZV9jb250cm9sX3R4X3BhY2tldCh0YXJnZXQsIHBQYWNrZXQpOworCQl9CisjZW5kaWYKKworCQkvKiBzZXR1cCBISUYgbGF5ZXIgY2FsbGJhY2tzICovCisJCWNkZl9tZW1femVybygmaHRjQ2FsbGJhY2tzLCBzaXplb2Yoc3RydWN0IGhpZl9tc2dfY2FsbGJhY2tzKSk7CisJCWh0Y0NhbGxiYWNrcy5Db250ZXh0ID0gdGFyZ2V0OworCQlodGNDYWxsYmFja3MucnhDb21wbGV0aW9uSGFuZGxlciA9IGh0Y19yeF9jb21wbGV0aW9uX2hhbmRsZXI7CisJCWh0Y0NhbGxiYWNrcy50eENvbXBsZXRpb25IYW5kbGVyID0gaHRjX3R4X2NvbXBsZXRpb25faGFuZGxlcjsKKwkJaHRjQ2FsbGJhY2tzLnR4UmVzb3VyY2VBdmFpbEhhbmRsZXIgPSBodGNfdHhfcmVzb3VyY2VfYXZhaWxfaGFuZGxlcjsKKwkJaHRjQ2FsbGJhY2tzLmZ3RXZlbnRIYW5kbGVyID0gaHRjX2Z3X2V2ZW50X2hhbmRsZXI7CisJCXRhcmdldC0+aGlmX2RldiA9IG9sX3NjOworCisJCS8qIEdldCBISUYgZGVmYXVsdCBwaXBlIGZvciBIVEMgbWVzc2FnZSBleGNoYW5nZSAqLworCQlwRW5kcG9pbnQgPSAmdGFyZ2V0LT5FbmRQb2ludFtFTkRQT0lOVF8wXTsKKworCQloaWZfcG9zdF9pbml0KHRhcmdldC0+aGlmX2RldiwgdGFyZ2V0LCAmaHRjQ2FsbGJhY2tzKTsKKwkJaGlmX2dldF9kZWZhdWx0X3BpcGUodGFyZ2V0LT5oaWZfZGV2LCAmcEVuZHBvaW50LT5VTF9QaXBlSUQsCisJCQkJICAgICAmcEVuZHBvaW50LT5ETF9QaXBlSUQpOworCisJfSB3aGlsZSAoZmFsc2UpOworCisJaHRjX3JlY3ZfaW5pdCh0YXJnZXQpOworCisJSFRDX1RSQUNFKCItaHRjX2NyZWF0ZTogKDB4JXApIiwgdGFyZ2V0KTsKKworCXJldHVybiAoSFRDX0hBTkRMRSkgdGFyZ2V0OworfQorCit2b2lkIGh0Y19kZXN0cm95KEhUQ19IQU5ETEUgSFRDSGFuZGxlKQoreworCUhUQ19UQVJHRVQgKnRhcmdldCA9IEdFVF9IVENfVEFSR0VUX0ZST01fSEFORExFKEhUQ0hhbmRsZSk7CisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19UUkMsCisJCQkoIitodGNfZGVzdHJveSAuLiAgRGVzdHJveWluZyA6MHglcFxuIiwgdGFyZ2V0KSk7CisJaWYgKHRhcmdldCkKKwkJaHRjX2NsZWFudXAodGFyZ2V0KTsKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1RSQywgKCItaHRjX2Rlc3Ryb3lcbiIpKTsKK30KKworLyogZ2V0IHRoZSBsb3cgbGV2ZWwgSElGIGRldmljZSBmb3IgdGhlIGNhbGxlciAsIHRoZSBjYWxsZXIgbWF5IHdpc2ggdG8gZG8gbG93IGxldmVsCisgKiBISUYgcmVxdWVzdHMgKi8KK3ZvaWQgKmh0Y19nZXRfaGlmX2RldmljZShIVENfSEFORExFIEhUQ0hhbmRsZSkKK3sKKwlIVENfVEFSR0VUICp0YXJnZXQgPSBHRVRfSFRDX1RBUkdFVF9GUk9NX0hBTkRMRShIVENIYW5kbGUpOworCXJldHVybiB0YXJnZXQtPmhpZl9kZXY7Cit9CisKK3ZvaWQgaHRjX2NvbnRyb2xfdHhfY29tcGxldGUodm9pZCAqQ29udGV4dCwgSFRDX1BBQ0tFVCAqcFBhY2tldCkKK3sKKwlIVENfVEFSR0VUICp0YXJnZXQgPSAoSFRDX1RBUkdFVCAqKSBDb250ZXh0OworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfVFJDLAorCQkJKCIrLWh0Y19jb250cm9sX3R4X2NvbXBsZXRlIDB4JXAgKGw6JWQpIFxuIiwgcFBhY2tldCwKKwkJCSBwUGFja2V0LT5BY3R1YWxMZW5ndGgpKTsKKwlodGNfZnJlZV9jb250cm9sX3R4X3BhY2tldCh0YXJnZXQsIHBQYWNrZXQpOworfQorCisvKiBUT0RPLCB0aGlzIGlzIGp1c3QgYSB0ZW1wb3JhcnkgbWF4IHBhY2tldCBzaXplICovCisjZGVmaW5lIE1BWF9NRVNTQUdFX1NJWkUgMTUzNgorCisvKioKKyAqIGh0Y19zZXR1cF90YXJnZXRfYnVmZmVyX2Fzc2lnbm1lbnRzKCkgLSBzZXR1cCB0YXJnZXQgYnVmZmVyIGFzc2lnbm1lbnRzCisgKiBAdGFyZ2V0OiBIVEMgVGFyZ2V0IFBvaW50ZXIKKyAqCisgKiBSZXR1cm46IEFfU1RBVFVTCisgKi8KK0FfU1RBVFVTIGh0Y19zZXR1cF90YXJnZXRfYnVmZmVyX2Fzc2lnbm1lbnRzKEhUQ19UQVJHRVQgKnRhcmdldCkKK3sKKwlIVENfU0VSVklDRV9UWF9DUkVESVRfQUxMT0NBVElPTiAqcEVudHJ5OworCUFfU1RBVFVTIHN0YXR1czsKKwlpbnQgY3JlZGl0czsKKwlpbnQgY3JlZGl0c1Blck1heE1zZzsKKworCWNyZWRpdHNQZXJNYXhNc2cgPSBNQVhfTUVTU0FHRV9TSVpFIC8gdGFyZ2V0LT5UYXJnZXRDcmVkaXRTaXplOworCWlmIChNQVhfTUVTU0FHRV9TSVpFICUgdGFyZ2V0LT5UYXJnZXRDcmVkaXRTaXplKSB7CisJCWNyZWRpdHNQZXJNYXhNc2crKzsKKwl9CisKKwkvKiBUT0RPLCB0aGlzIHNob3VsZCBiZSBjb25maWd1cmVkIGJ5IHRoZSBjYWxsZXIhICovCisKKwljcmVkaXRzID0gdGFyZ2V0LT5Ub3RhbFRyYW5zbWl0Q3JlZGl0czsKKwlwRW50cnkgPSAmdGFyZ2V0LT5TZXJ2aWNlVHhBbGxvY1RhYmxlWzBdOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbGwgY3JlZGlzdHMvSFRDIGJ1ZmZlcnMgdG8gV01JLgorCSAqIG5vIGJ1ZmZlcnMgYXJlIHVzZWQvcmVxdWlyZWQgZm9yIGRhdGEuIGRhdGEgYWx3YXlzCisJICogcmVtYWlucyBvbiBob3N0LgorCSAqLworCXN0YXR1cyA9IEFfT0s7CisJcEVudHJ5Kys7CisJcEVudHJ5LT5TZXJ2aWNlSUQgPSBXTUlfQ09OVFJPTF9TVkM7CisJcEVudHJ5LT5DcmVkaXRBbGxvY2F0aW9uID0gY3JlZGl0czsKKworCWlmIChXTEFOX0lTX0VQUElOR19FTkFCTEVEKGNkc19nZXRfY29ucGFyYW0oKSkpIHsKKwkJLyogZW5kcG9pbnQgcGluZyBpcyBhIHRlc3RpbmcgdG9vbCBkaXJlY3RseSBvbiB0b3Agb2YgSFRDIGluCisJCSAqIGJvdGggdGFyZ2V0IGFuZCBob3N0IHNpZGVzLgorCQkgKiBJbiB0YXJnZXQgc2lkZSwgdGhlIGVuZHBwaW50IHBpbmcgZncgaGFzIG5vIHdsYW4gc3RhY2sgYW5kIHRoZQorCQkgKiBGVyBtYm94cGluZyBhcHAgZGlyZWN0bHkgc2l0cyBvbiBIVEMgYW5kIGl0IHNpbXBseSBkcm9wcworCQkgKiBvciBsb29wcyBiYWNrIFRYIHBhY2tldHMuIEZvciByeCBwZXJmLCBGVyBtYm94cGluZyBhcHAKKwkJICogZ2VuZXJhdGVzIHBhY2tldHMgYW5kIHBhc3NlcyBwYWNrZXRzIHRvIEhUQyB0byBzZW5kIHRvIGhvc3QuCisJCSAqIFRoZXJlIGlzIG5vIFdNSSBtZXNhZ2UgZXhjaGFuZ2VzIGJldHdlZW4gaG9zdCBhbmQgdGFyZ2V0CisJCSAqIGluIGVuZHBvaW50IHBpbmcgY2FzZS4KKwkJICogSW4gaG9zdCBzaWRlLCB0aGUgZW5kcG9pbnQgcGluZyBkcml2ZXIgaXMgYSBFdGhlcm5ldCBkcml2ZXIKKwkJICogYW5kIGl0IGRpcmVjdGx5IHNpdHMgb24gSFRDLiBPbmx5IEhJRiwgSFRDLCBDREYsIEFERiBhcmUKKwkJICogdXNlZCBieSB0aGUgZW5kcG9pbnQgcGluZyBkcml2ZXIuIFRoZXJlIGlzIG5vIHdpZmkgc3RhY2sKKwkJICogYXQgYWxsIGluIGhvc3Qgc2lkZSBhbHNvLiBGb3IgdHggcGVyZiB1c2UgY2FzZSwKKwkJICogdGhlIHVzZXIgc3BhY2UgbWJveHBpbmcgYXBwIHNlbmRzIHRoZSByYXcgcGFja2V0cyB0byBlbmRwb2ludAorCQkgKiBwaW5nIGRyaXZlciBhbmQgaXQgZGlyZWN0bHkgZm9yd2FyZHMgdG8gSFRDIGZvciB0cmFuc21pc3Npb24KKwkJICogdG8gc3RyZXNzIHRoZSBidXMuIEZvciB0aGUgcnggcGVyZiwgSFRDIHBhc3NlcyB0aGUgcmVjZWl2ZWQKKwkJICogcGFja2V0cyB0byBlbmRwb2ludCBwaW5nIGRyaXZlciBhbmQgaXQgaXMgcGFzc2VkIHRvIHRoZSB1c2VyCisJCSAqIHNwYWNlIHRocm91Z2ggdGhlIEV0aGVybmV0IGludGVyZmFjZS4KKwkJICogRm9yIGNyZWRpdCBhbGxvY2F0aW9uLCBpbiBTRElPIGJ1cyBjYXNlLCBvbmx5IEJFIHNlcnZpY2UgaXMKKwkJICogdXNlZCBmb3IgdHgvcnggcGVyZiB0ZXN0aW5nIHNvIHRoYXQgYWxsIGNyZWRpdHMgYXJlIGdpdmVuCisJCSAqIHRvIEJFIHNlcnZpY2UuIEluIFBDSWUgYW5kIFVTQiBidXMgY2FzZSwgZW5kcG9pbnQgcGluZyB1c2VzIGJvdGgKKwkJICogQkUgYW5kIEJLIHNlcnZpY2VzIHRvIHN0cmVzcyB0aGUgYnVzIHNvIHRoYXQgdGhlIHRvdGFsIGNyZWRpdHMKKwkJICogYXJlIGVxdWFsbHkgZGlzdHJpYnV0ZWQgdG8gQkUgYW5kIEJLIHNlcnZpY2VzLgorCQkgKi8KKwkJcEVudHJ5LT5TZXJ2aWNlSUQgPSBXTUlfREFUQV9CRV9TVkM7CisJCXBFbnRyeS0+Q3JlZGl0QWxsb2NhdGlvbiA9IChjcmVkaXRzID4+IDEpOworCisJCXBFbnRyeSsrOworCQlwRW50cnktPlNlcnZpY2VJRCA9IFdNSV9EQVRBX0JLX1NWQzsKKwkJcEVudHJ5LT5DcmVkaXRBbGxvY2F0aW9uID0gKGNyZWRpdHMgPj4gMSk7CisJfQorCisJaWYgKEFfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgSFRDX01BWF9TRVJWSUNFX0FMTE9DX0VOVFJJRVM7IGkrKykgeworCQkJaWYgKHRhcmdldC0+U2VydmljZVR4QWxsb2NUYWJsZVtpXS5TZXJ2aWNlSUQgIT0gMCkgeworCQkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfSU5JVCwKKwkJCQkJCSgiSFRDIFNlcnZpY2UgSW5kZXggOiAlZCBUWCA6IDB4JTIuMlggOiBhbGxvYzolZCBcbiIsCisJCQkJCQkgaSwKKwkJCQkJCSB0YXJnZXQtPlNlcnZpY2VUeEFsbG9jVGFibGVbaV0uCisJCQkJCQkgU2VydmljZUlELAorCQkJCQkJIHRhcmdldC0+U2VydmljZVR4QWxsb2NUYWJsZVtpXS4KKwkJCQkJCSBDcmVkaXRBbGxvY2F0aW9uKSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitBX1VJTlQ4IGh0Y19nZXRfY3JlZGl0X2FsbG9jYXRpb24oSFRDX1RBUkdFVCAqdGFyZ2V0LCBBX1VJTlQxNiBTZXJ2aWNlSUQpCit7CisJQV9VSU5UOCBhbGxvY2F0aW9uID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIVENfTUFYX1NFUlZJQ0VfQUxMT0NfRU5UUklFUzsgaSsrKSB7CisJCWlmICh0YXJnZXQtPlNlcnZpY2VUeEFsbG9jVGFibGVbaV0uU2VydmljZUlEID09IFNlcnZpY2VJRCkgeworCQkJYWxsb2NhdGlvbiA9CisJCQkJdGFyZ2V0LT5TZXJ2aWNlVHhBbGxvY1RhYmxlW2ldLkNyZWRpdEFsbG9jYXRpb247CisJCX0KKwl9CisKKwlpZiAoMCA9PSBhbGxvY2F0aW9uKSB7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfSU5JVCwKKwkJCQkoIkhUQyBTZXJ2aWNlIFRYIDogMHglMi4yWCA6IGFsbG9jYXRpb24gaXMgemVybyEgXG4iLAorCQkJCSBTZXJ2aWNlSUQpKTsKKwl9CisKKwlyZXR1cm4gYWxsb2NhdGlvbjsKK30KKworQV9TVEFUVVMgaHRjX3dhaXRfdGFyZ2V0KEhUQ19IQU5ETEUgSFRDSGFuZGxlKQoreworCUFfU1RBVFVTIHN0YXR1cyA9IEFfT0s7CisJSFRDX1RBUkdFVCAqdGFyZ2V0ID0gR0VUX0hUQ19UQVJHRVRfRlJPTV9IQU5ETEUoSFRDSGFuZGxlKTsKKwlIVENfUkVBRFlfRVhfTVNHICpwUmVhZHlNc2c7CisJSFRDX1NFUlZJQ0VfQ09OTkVDVF9SRVEgY29ubmVjdDsKKwlIVENfU0VSVklDRV9DT05ORUNUX1JFU1AgcmVzcDsKKwlIVENfUkVBRFlfTVNHICpyZHlfbXNnOworCUFfVUlOVDE2IGh0Y19yZHlfbXNnX2lkOworCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19UUkMsCisJCQkoImh0Y193YWl0X3RhcmdldCAtIEVudGVyICh0YXJnZXQ6MHglcCkgXG4iLCBIVENIYW5kbGUpKTsKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0FOWSwgKCIrSFdUXG4iKSk7CisKKwlkbyB7CisKKwkJc3RhdHVzID0gaGlmX3N0YXJ0KHRhcmdldC0+aGlmX2Rldik7CisJCWlmIChBX0ZBSUxFRChzdGF0dXMpKSB7CisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUk9SLCAoImhpZl9zdGFydCBmYWlsZWRcbiIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3RhdHVzID0gaHRjX3dhaXRfcmVjdl9jdHJsX21lc3NhZ2UodGFyZ2V0KTsKKworCQlpZiAoQV9GQUlMRUQoc3RhdHVzKSkgeworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodGFyZ2V0LT5DdHJsUmVzcG9uc2VMZW5ndGggPCAoc2l6ZW9mKEhUQ19SRUFEWV9FWF9NU0cpKSkgeworCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsCisJCQkJCSgiSW52YWxpZCBIVEMgUmVhZHkgTXNnIExlbjolZCEgXG4iLAorCQkJCQkgdGFyZ2V0LT5DdHJsUmVzcG9uc2VMZW5ndGgpKTsKKwkJCXN0YXR1cyA9IEFfRUNPTU07CisJCQlicmVhazsKKwkJfQorCisJCXBSZWFkeU1zZyA9IChIVENfUkVBRFlfRVhfTVNHICopIHRhcmdldC0+Q3RybFJlc3BvbnNlQnVmZmVyOworCisJCXJkeV9tc2cgPSAmcFJlYWR5TXNnLT5WZXJzaW9uMl8wX0luZm87CisJCWh0Y19yZHlfbXNnX2lkID0KKwkJCUhUQ19HRVRfRklFTEQocmR5X21zZywgSFRDX1JFQURZX01TRywgTUVTU0FHRUlEKTsKKwkJaWYgKGh0Y19yZHlfbXNnX2lkICE9IEhUQ19NU0dfUkVBRFlfSUQpIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkoIkludmFsaWQgSFRDIFJlYWR5IE1zZyA6IDB4JVggISBcbiIsCisJCQkJCSBodGNfcmR5X21zZ19pZCkpOworCQkJc3RhdHVzID0gQV9FQ09NTTsKKwkJCWJyZWFrOworCQl9CisKKwkJdGFyZ2V0LT5Ub3RhbFRyYW5zbWl0Q3JlZGl0cyA9CisJCQlIVENfR0VUX0ZJRUxEKHJkeV9tc2csIEhUQ19SRUFEWV9NU0csIENSRURJVENPVU5UKTsKKwkJdGFyZ2V0LT5UYXJnZXRDcmVkaXRTaXplID0KKwkJCShpbnQpSFRDX0dFVF9GSUVMRChyZHlfbXNnLCBIVENfUkVBRFlfTVNHLCBDUkVESVRTSVpFKTsKKwkJdGFyZ2V0LT5NYXhNc2dzUGVySFRDQnVuZGxlID0KKwkJCShBX1VJTlQ4KSBwUmVhZHlNc2ctPk1heE1zZ3NQZXJIVENCdW5kbGU7CisJCS8qIGZvciBvbGQgZncgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gMC4gQnV0IHRoZSBtaW5pbXVtIHZhbHVlIHNob3VsZCBiZSAxLAorCQkgKiBpLmUuLCBubyBidW5kbGluZyAqLworCQlpZiAodGFyZ2V0LT5NYXhNc2dzUGVySFRDQnVuZGxlIDwgMSkKKwkJCXRhcmdldC0+TWF4TXNnc1BlckhUQ0J1bmRsZSA9IDE7CisKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTklULAorCQkJCSgiVGFyZ2V0IFJlYWR5ISA6IHRyYW5zbWl0IHJlc291cmNlcyA6ICVkIHNpemU6JWQsIE1heE1zZ3NQZXJIVENCdW5kbGUgPSAlZFxuIiwKKwkJCQkgdGFyZ2V0LT5Ub3RhbFRyYW5zbWl0Q3JlZGl0cywKKwkJCQkgdGFyZ2V0LT5UYXJnZXRDcmVkaXRTaXplLAorCQkJCSB0YXJnZXQtPk1heE1zZ3NQZXJIVENCdW5kbGUpKTsKKworCQlpZiAoKDAgPT0gdGFyZ2V0LT5Ub3RhbFRyYW5zbWl0Q3JlZGl0cykKKwkJICAgIHx8ICgwID09IHRhcmdldC0+VGFyZ2V0Q3JlZGl0U2l6ZSkpIHsKKwkJCXN0YXR1cyA9IEFfRUNPTU07CisJCQlicmVhazsKKwkJfQorCQkvKiBkb25lIHByb2Nlc3NpbmcgKi8KKwkJdGFyZ2V0LT5DdHJsUmVzcG9uc2VQcm9jZXNzaW5nID0gZmFsc2U7CisKKwkJaHRjX3NldHVwX3RhcmdldF9idWZmZXJfYXNzaWdubWVudHModGFyZ2V0KTsKKworCQkvKiBzZXR1cCBvdXIgcHNldWRvIEhUQyBjb250cm9sIGVuZHBvaW50IGNvbm5lY3Rpb24gKi8KKwkJQV9NRU1aRVJPKCZjb25uZWN0LCBzaXplb2YoY29ubmVjdCkpOworCQlBX01FTVpFUk8oJnJlc3AsIHNpemVvZihyZXNwKSk7CisJCWNvbm5lY3QuRXBDYWxsYmFja3MucENvbnRleHQgPSB0YXJnZXQ7CisJCWNvbm5lY3QuRXBDYWxsYmFja3MuRXBUeENvbXBsZXRlID0gaHRjX2NvbnRyb2xfdHhfY29tcGxldGU7CisJCWNvbm5lY3QuRXBDYWxsYmFja3MuRXBSZWN2ID0gaHRjX2NvbnRyb2xfcnhfY29tcGxldGU7CisJCWNvbm5lY3QuTWF4U2VuZFF1ZXVlRGVwdGggPSBOVU1fQ09OVFJPTF9UWF9CVUZGRVJTOworCQljb25uZWN0LlNlcnZpY2VJRCA9IEhUQ19DVFJMX1JTVkRfU1ZDOworCisJCS8qIGNvbm5lY3QgZmFrZSBzZXJ2aWNlICovCisJCXN0YXR1cyA9IGh0Y19jb25uZWN0X3NlcnZpY2UoKEhUQ19IQU5ETEUpIHRhcmdldCwKKwkJCQkJICAgICAmY29ubmVjdCwgJnJlc3ApOworCisJfSB3aGlsZSAoZmFsc2UpOworCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19UUkMsICgiaHRjX3dhaXRfdGFyZ2V0IC0gRXhpdCAoJWQpXG4iLCBzdGF0dXMpKTsKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0FOWSwgKCItSFdUXG4iKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogc3RhcnQgSFRDLCB0aGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgc2VydmljZXMgYXJlIGNvbm5lY3RlZCAqLworc3RhdGljIEFfU1RBVFVTIGh0Y19jb25maWdfdGFyZ2V0X2hpZl9waXBlKEhUQ19UQVJHRVQgKnRhcmdldCkKK3sKKworCXJldHVybiBBX09LOworfQorCitzdGF0aWMgdm9pZCByZXNldF9lbmRwb2ludF9zdGF0ZXMoSFRDX1RBUkdFVCAqdGFyZ2V0KQoreworCUhUQ19FTkRQT0lOVCAqcEVuZHBvaW50OworCWludCBpOworCisJZm9yIChpID0gRU5EUE9JTlRfMDsgaSA8IEVORFBPSU5UX01BWDsgaSsrKSB7CisJCXBFbmRwb2ludCA9ICZ0YXJnZXQtPkVuZFBvaW50W2ldOworCQlwRW5kcG9pbnQtPlNlcnZpY2VJRCA9IDA7CisJCXBFbmRwb2ludC0+TWF4TXNnTGVuZ3RoID0gMDsKKwkJcEVuZHBvaW50LT5NYXhUeFF1ZXVlRGVwdGggPSAwOworCQlwRW5kcG9pbnQtPklkID0gaTsKKwkJSU5JVF9IVENfUEFDS0VUX1FVRVVFKCZwRW5kcG9pbnQtPlR4UXVldWUpOworCQlJTklUX0hUQ19QQUNLRVRfUVVFVUUoJnBFbmRwb2ludC0+VHhMb29rdXBRdWV1ZSk7CisJCUlOSVRfSFRDX1BBQ0tFVF9RVUVVRSgmcEVuZHBvaW50LT5SeEJ1ZmZlckhvbGRRdWV1ZSk7CisJCXBFbmRwb2ludC0+dGFyZ2V0ID0gdGFyZ2V0OworCQkvKiBwRW5kcG9pbnQtPlR4Q3JlZGl0Rmxvd0VuYWJsZWQgPSAoQV9CT09MKWh0Y19jcmVkaXRfZmxvdzsgKi8KKwkJcEVuZHBvaW50LT5UeENyZWRpdEZsb3dFbmFibGVkID0gKEFfQk9PTCkgMTsKKwkJY2RmX2F0b21pY19pbml0KCZwRW5kcG9pbnQtPlR4UHJvY2Vzc0NvdW50KTsKKwl9Cit9CisKK0FfU1RBVFVTIGh0Y19zdGFydChIVENfSEFORExFIEhUQ0hhbmRsZSkKK3sKKwljZGZfbmJ1Zl90IG5ldGJ1ZjsKKwlBX1NUQVRVUyBzdGF0dXMgPSBBX09LOworCUhUQ19UQVJHRVQgKnRhcmdldCA9IEdFVF9IVENfVEFSR0VUX0ZST01fSEFORExFKEhUQ0hhbmRsZSk7CisJSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TRyAqcFNldHVwQ29tcDsKKwlIVENfUEFDS0VUICpwU2VuZFBhY2tldDsKKworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfVFJDLCAoImh0Y19zdGFydCBFbnRlclxuIikpOworCisJZG8geworCisJCWh0Y19jb25maWdfdGFyZ2V0X2hpZl9waXBlKHRhcmdldCk7CisKKwkJLyogYWxsb2NhdGUgYSBidWZmZXIgdG8gc2VuZCAqLworCQlwU2VuZFBhY2tldCA9IGh0Y19hbGxvY19jb250cm9sX3R4X3BhY2tldCh0YXJnZXQpOworCQlpZiAoTlVMTCA9PSBwU2VuZFBhY2tldCkgeworCQkJQVJfREVCVUdfQVNTRVJUKGZhbHNlKTsKKwkJCWNkZl9wcmludCgiJXM6IGFsbG9jQ29udHJvbFR4UGFja2V0IGZhaWxlZFxuIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXN0YXR1cyA9IEFfTk9fTUVNT1JZOworCQkJYnJlYWs7CisJCX0KKworCQluZXRidWYgPQorCQkJKGNkZl9uYnVmX3QpIEdFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVChwU2VuZFBhY2tldCk7CisJCS8qIGFzc2VtYmxlIHNldHVwIGNvbXBsZXRlIG1lc3NhZ2UgKi8KKwkJY2RmX25idWZfcHV0X3RhaWwobmV0YnVmLCBzaXplb2YoSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TRykpOworCQlwU2V0dXBDb21wID0KKwkJCShIVENfU0VUVVBfQ09NUExFVEVfRVhfTVNHICopIGNkZl9uYnVmX2RhdGEobmV0YnVmKTsKKwkJQV9NRU1aRVJPKHBTZXR1cENvbXAsIHNpemVvZihIVENfU0VUVVBfQ09NUExFVEVfRVhfTVNHKSk7CisKKwkJSFRDX1NFVF9GSUVMRChwU2V0dXBDb21wLCBIVENfU0VUVVBfQ09NUExFVEVfRVhfTVNHLAorCQkJICAgICAgTUVTU0FHRUlELCBIVENfTVNHX1NFVFVQX0NPTVBMRVRFX0VYX0lEKTsKKworCQlpZiAoIWh0Y19jcmVkaXRfZmxvdykgeworCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTklULAorCQkJCQkoIkhUQyB3aWxsIG5vdCB1c2UgVFggY3JlZGl0IGZsb3cgY29udHJvbFxuIikpOworCQkJcFNldHVwQ29tcC0+U2V0dXBGbGFncyB8PQorCQkJCUhUQ19TRVRVUF9DT01QTEVURV9GTEFHU19ESVNBQkxFX1RYX0NSRURJVF9GTE9XOworCQl9IGVsc2UgeworCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTklULAorCQkJCQkoIkhUQyB1c2luZyBUWCBjcmVkaXQgZmxvdyBjb250cm9sXG4iKSk7CisJCX0KKworI2lmZGVmIEhJRl9TRElPCisjaWYgRU5BQkxFX0JVTkRMRV9SWAorCQlpZiAoSFRDX0VOQUJMRV9CVU5ETEUodGFyZ2V0KSkKKwkJCXBTZXR1cENvbXAtPlNldHVwRmxhZ3MgfD0KKwkJCQlIVENfU0VUVVBfQ09NUExFVEVfRkxBR1NfRU5BQkxFX0JVTkRMRV9SRUNWOworI2VuZGlmIC8qIEVOQUJMRV9CVU5ETEVfUlggKi8KKyNlbmRpZiAvKiBISUZfU0RJTyAqLworCisJCVNFVF9IVENfUEFDS0VUX0lORk9fVFgocFNlbmRQYWNrZXQsCisJCQkJICAgICAgIE5VTEwsCisJCQkJICAgICAgIChBX1VJTlQ4ICopIHBTZXR1cENvbXAsCisJCQkJICAgICAgIHNpemVvZihIVENfU0VUVVBfQ09NUExFVEVfRVhfTVNHKSwKKwkJCQkgICAgICAgRU5EUE9JTlRfMCwgSFRDX1NFUlZJQ0VfVFhfUEFDS0VUX1RBRyk7CisKKwkJc3RhdHVzID0gaHRjX3NlbmRfcGt0KChIVENfSEFORExFKSB0YXJnZXQsIHBTZW5kUGFja2V0KTsKKwkJaWYgKEFfRkFJTEVEKHN0YXR1cykpIHsKKwkJCWJyZWFrOworCQl9CisKKwl9IHdoaWxlIChmYWxzZSk7CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1RSQywgKCJodGNfc3RhcnQgRXhpdFxuIikpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qZmx1c2ggYWxsIHF1ZXVlZCBidWZmZXJzIGZvciBzdXJwcmlzZXJlbW92ZSBjYXNlKi8KK3ZvaWQgaHRjX2ZsdXNoX3N1cnByaXNlX3JlbW92ZShIVENfSEFORExFIEhUQ0hhbmRsZSkKK3sKKwlIVENfVEFSR0VUICp0YXJnZXQgPSBHRVRfSFRDX1RBUkdFVF9GUk9NX0hBTkRMRShIVENIYW5kbGUpOworCWludCBpOworCUhUQ19FTkRQT0lOVCAqcEVuZHBvaW50OworI2lmZGVmIFJYX1NHX1NVUFBPUlQKKwljZGZfbmJ1Zl90IG5ldGJ1ZjsKKwljZGZfbmJ1Zl9xdWV1ZV90ICpyeF9zZ19xdWV1ZSA9ICZ0YXJnZXQtPlJ4U2dRdWV1ZTsKKyNlbmRpZgorCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19UUkMsICgiK2h0Y19mbHVzaF9zdXJwcmlzZV9yZW1vdmUgXG4iKSk7CisKKwkvKiBjbGVhbnVwIGVuZHBvaW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBFTkRQT0lOVF9NQVg7IGkrKykgeworCQlwRW5kcG9pbnQgPSAmdGFyZ2V0LT5FbmRQb2ludFtpXTsKKwkJaHRjX2ZsdXNoX3J4X2hvbGRfcXVldWUodGFyZ2V0LCBwRW5kcG9pbnQpOworCQlodGNfZmx1c2hfZW5kcG9pbnRfdHgodGFyZ2V0LCBwRW5kcG9pbnQsIEhUQ19UWF9QQUNLRVRfVEFHX0FMTCk7CisJfQorCisJaGlmX2ZsdXNoX3N1cnByaXNlX3JlbW92ZSh0YXJnZXQtPmhpZl9kZXYpOworCisjaWZkZWYgUlhfU0dfU1VQUE9SVAorCUxPQ0tfSFRDX1JYKHRhcmdldCk7CisJd2hpbGUgKChuZXRidWYgPSBjZGZfbmJ1Zl9xdWV1ZV9yZW1vdmUocnhfc2dfcXVldWUpKSAhPSBOVUxMKSB7CisJCWNkZl9uYnVmX2ZyZWUobmV0YnVmKTsKKwl9CisJUkVTRVRfUlhfU0dfQ09ORklHKHRhcmdldCk7CisJVU5MT0NLX0hUQ19SWCh0YXJnZXQpOworI2VuZGlmCisKKwlyZXNldF9lbmRwb2ludF9zdGF0ZXModGFyZ2V0KTsKKworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfVFJDLCAoIi1odGNfZmx1c2hfc3VycHJpc2VfcmVtb3ZlIFxuIikpOworfQorCisvKiBzdG9wIEhUQyBjb21tdW5pY2F0aW9ucywgaS5lLiBzdG9wIGludGVycnVwdCByZWNlcHRpb24sIGFuZCBmbHVzaCBhbGwgcXVldWVkIGJ1ZmZlcnMgKi8KK3ZvaWQgaHRjX3N0b3AoSFRDX0hBTkRMRSBIVENIYW5kbGUpCit7CisJSFRDX1RBUkdFVCAqdGFyZ2V0ID0gR0VUX0hUQ19UQVJHRVRfRlJPTV9IQU5ETEUoSFRDSGFuZGxlKTsKKwlpbnQgaTsKKwlIVENfRU5EUE9JTlQgKnBFbmRwb2ludDsKKyNpZmRlZiBSWF9TR19TVVBQT1JUCisJY2RmX25idWZfdCBuZXRidWY7CisJY2RmX25idWZfcXVldWVfdCAqcnhfc2dfcXVldWUgPSAmdGFyZ2V0LT5SeFNnUXVldWU7CisjZW5kaWYKKworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfVFJDLCAoIitodGNfc3RvcCBcbiIpKTsKKworCS8qIGNsZWFudXAgZW5kcG9pbnRzICovCisJZm9yIChpID0gMDsgaSA8IEVORFBPSU5UX01BWDsgaSsrKSB7CisJCXBFbmRwb2ludCA9ICZ0YXJnZXQtPkVuZFBvaW50W2ldOworCQlodGNfZmx1c2hfcnhfaG9sZF9xdWV1ZSh0YXJnZXQsIHBFbmRwb2ludCk7CisJCWh0Y19mbHVzaF9lbmRwb2ludF90eCh0YXJnZXQsIHBFbmRwb2ludCwgSFRDX1RYX1BBQ0tFVF9UQUdfQUxMKTsKKwkJaWYgKHBFbmRwb2ludC0+dWxfaXNfcG9sbGVkKSB7CisJCQljZGZfc29mdGlycV90aW1lcl9jYW5jZWwoJnBFbmRwb2ludC0+dWxfcG9sbF90aW1lcik7CisJCQljZGZfc29mdGlycV90aW1lcl9mcmVlKCZwRW5kcG9pbnQtPnVsX3BvbGxfdGltZXIpOworCQl9CisJfQorCisJLyogTm90ZTogaHRjX2ZsdXNoX2VuZHBvaW50X3R4IGZvciBhbGwgZW5kcG9pbnRzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCisJICogaGlmX3N0b3AgLSBvdGhlcndpc2UgaHRjX3R4X2NvbXBsZXRpb25faGFuZGxlciBjYWxsZWQgZnJvbQorCSAqIGhpZl9zZW5kX2J1ZmZlcl9jbGVhbnVwX29uX3BpcGUgZm9yIHJlc2lkdWFsIHR4IGZyYW1lcyBpbiBISUYgbGF5ZXIsCisJICogbWlnaHQgcXVldWUgdGhlIHBhY2tldCBhZ2FpbiB0byBISUYgTGF5ZXIgLSB3aGljaCBjb3VsZCBjYXVzZSB0eAorCSAqIGJ1ZmZlciBsZWFrCisJICovCisKKwloaWZfc3RvcCh0YXJnZXQtPmhpZl9kZXYpOworCisjaWZkZWYgUlhfU0dfU1VQUE9SVAorCUxPQ0tfSFRDX1JYKHRhcmdldCk7CisJd2hpbGUgKChuZXRidWYgPSBjZGZfbmJ1Zl9xdWV1ZV9yZW1vdmUocnhfc2dfcXVldWUpKSAhPSBOVUxMKSB7CisJCWNkZl9uYnVmX2ZyZWUobmV0YnVmKTsKKwl9CisJUkVTRVRfUlhfU0dfQ09ORklHKHRhcmdldCk7CisJVU5MT0NLX0hUQ19SWCh0YXJnZXQpOworI2VuZGlmCisKKwlyZXNldF9lbmRwb2ludF9zdGF0ZXModGFyZ2V0KTsKKworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfVFJDLCAoIi1odGNfc3RvcCBcbiIpKTsKK30KKwordm9pZCBodGNfZHVtcF9jcmVkaXRfc3RhdGVzKEhUQ19IQU5ETEUgSFRDSGFuZGxlKQoreworCUhUQ19UQVJHRVQgKnRhcmdldCA9IEdFVF9IVENfVEFSR0VUX0ZST01fSEFORExFKEhUQ0hhbmRsZSk7CisJSFRDX0VORFBPSU5UICpwRW5kcG9pbnQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRU5EUE9JTlRfTUFYOyBpKyspIHsKKwkJcEVuZHBvaW50ID0gJnRhcmdldC0+RW5kUG9pbnRbaV07CisJCWlmICgwID09IHBFbmRwb2ludC0+U2VydmljZUlEKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0FOWSwKKwkJCQkoIi0tLSBFUCA6ICVkICBTZXJ2aWNlSUQ6IDB4JVggICAgLS0tLS0tLS0tLS0tLS1cbiIsCisJCQkJIHBFbmRwb2ludC0+SWQsIHBFbmRwb2ludC0+U2VydmljZUlEKSk7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfQU5ZLAorCQkJCSgiIFR4Q3JlZGl0cyAgICAgICAgICA6ICVkIFxuIiwKKwkJCQkgcEVuZHBvaW50LT5UeENyZWRpdHMpKTsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19BTlksCisJCQkJKCIgVHhDcmVkaXRTaXplICAgICAgIDogJWQgXG4iLAorCQkJCSBwRW5kcG9pbnQtPlR4Q3JlZGl0U2l6ZSkpOworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0FOWSwKKwkJCQkoIiBUeENyZWRpdHNQZXJNYXhNc2cgOiAlZCBcbiIsCisJCQkJIHBFbmRwb2ludC0+VHhDcmVkaXRzUGVyTWF4TXNnKSk7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfQU5ZLAorCQkJCSgiIFR4UXVldWVEZXB0aCAgICAgICA6ICVkIFxuIiwKKwkJCQkgSFRDX1BBQ0tFVF9RVUVVRV9ERVBUSCgmcEVuZHBvaW50LT5UeFF1ZXVlKSkpOworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0FOWSwKKwkJCQkoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpKTsKKwl9Cit9CisKK0FfQk9PTCBodGNfZ2V0X2VuZHBvaW50X3N0YXRpc3RpY3MoSFRDX0hBTkRMRSBIVENIYW5kbGUsCisJCQkJICAgSFRDX0VORFBPSU5UX0lEIEVuZHBvaW50LAorCQkJCSAgIEhUQ19FTkRQT0lOVF9TVEFUX0FDVElPTiBBY3Rpb24sCisJCQkJICAgSFRDX0VORFBPSU5UX1NUQVRTICpwU3RhdHMpCit7CisjaWZkZWYgSFRDX0VQX1NUQVRfUFJPRklMSU5HCisJSFRDX1RBUkdFVCAqdGFyZ2V0ID0gR0VUX0hUQ19UQVJHRVRfRlJPTV9IQU5ETEUoSFRDSGFuZGxlKTsKKwlBX0JPT0wgY2xlYXJTdGF0cyA9IGZhbHNlOworCUFfQk9PTCBzYW1wbGUgPSBmYWxzZTsKKworCXN3aXRjaCAoQWN0aW9uKSB7CisJY2FzZSBIVENfRVBfU1RBVF9TQU1QTEU6CisJCXNhbXBsZSA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgSFRDX0VQX1NUQVRfU0FNUExFX0FORF9DTEVBUjoKKwkJc2FtcGxlID0gdHJ1ZTsKKwkJY2xlYXJTdGF0cyA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgSFRDX0VQX1NUQVRfQ0xFQVI6CisJCWNsZWFyU3RhdHMgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlBX0FTU0VSVChFbmRwb2ludCA8IEVORFBPSU5UX01BWCk7CisKKwkvKiBsb2NrIG91dCBUWCBhbmQgUlggd2hpbGUgd2Ugc2FtcGxlIGFuZC9vciBjbGVhciAqLworCUxPQ0tfSFRDX1RYKHRhcmdldCk7CisJTE9DS19IVENfUlgodGFyZ2V0KTsKKworCWlmIChzYW1wbGUpIHsKKwkJQV9BU1NFUlQocFN0YXRzICE9IE5VTEwpOworCQkvKiByZXR1cm4gdGhlIHN0YXRzIHRvIHRoZSBjYWxsZXIgKi8KKwkJQV9NRU1DUFkocFN0YXRzLCAmdGFyZ2V0LT5FbmRQb2ludFtFbmRwb2ludF0uRW5kUG9pbnRTdGF0cywKKwkJCSBzaXplb2YoSFRDX0VORFBPSU5UX1NUQVRTKSk7CisJfQorCisJaWYgKGNsZWFyU3RhdHMpIHsKKwkJLyogcmVzZXQgc3RhdHMgKi8KKwkJQV9NRU1aRVJPKCZ0YXJnZXQtPkVuZFBvaW50W0VuZHBvaW50XS5FbmRQb2ludFN0YXRzLAorCQkJICBzaXplb2YoSFRDX0VORFBPSU5UX1NUQVRTKSk7CisJfQorCisJVU5MT0NLX0hUQ19SWCh0YXJnZXQpOworCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKworCXJldHVybiB0cnVlOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCAqaHRjX2dldF90YXJnZXRkZWYoSFRDX0hBTkRMRSBodGNfaGFuZGxlKQoreworCUhUQ19UQVJHRVQgKnRhcmdldCA9IEdFVF9IVENfVEFSR0VUX0ZST01fSEFORExFKGh0Y19oYW5kbGUpOworCisJcmV0dXJuIGhpZl9nZXRfdGFyZ2V0ZGVmKHRhcmdldC0+aGlmX2Rldik7Cit9CisKKy8qKgorICogaHRjX3NldF90YXJnZXRfdG9fc2xlZXAoKSAtIHNldCB0YXJnZXQgdG8gc2xlZXAKKyAqIEBjb250ZXh0OiBvbF9zb2Z0YyBjb250ZXh0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaHRjX3NldF90YXJnZXRfdG9fc2xlZXAodm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IChzdHJ1Y3Qgb2xfc29mdGMgKiljb250ZXh0OworCisJaGlmX3NldF90YXJnZXRfc2xlZXAoc2NuLCB0cnVlLCBmYWxzZSk7Cit9CisKKy8qKgorICogaHRjX2NhbmNlbF9kZWZlcnJlZF90YXJnZXRfc2xlZXAoKSAtIGNhbmNlbCBkZWZlcnJlZCB0YXJnZXQgc2xlZXAKKyAqIEBjb250ZXh0OiBvbF9zb2Z0YyBjb250ZXh0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgaHRjX2NhbmNlbF9kZWZlcnJlZF90YXJnZXRfc2xlZXAodm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbiA9IChzdHJ1Y3Qgb2xfc29mdGMgKiljb250ZXh0OworCWhpZl9jYW5jZWxfZGVmZXJyZWRfdGFyZ2V0X3NsZWVwKHNjbik7Cit9CisKKyNpZmRlZiBJUEFfT0ZGTE9BRAordm9pZCBodGNfaXBhX2dldF9jZV9yZXNvdXJjZShIVENfSEFORExFIGh0Y19oYW5kbGUsCisJCQkgICAgIHVpbnQzMl90ICpjZV9zcl9iYXNlX3BhZGRyLAorCQkJICAgICB1aW50MzJfdCAqY2Vfc3JfcmluZ19zaXplLAorCQkJICAgICBjZGZfZG1hX2FkZHJfdCAqY2VfcmVnX3BhZGRyKQoreworCUhUQ19UQVJHRVQgKnRhcmdldCA9IEdFVF9IVENfVEFSR0VUX0ZST01fSEFORExFKGh0Y19oYW5kbGUpOworCisJaWYgKHRhcmdldC0+aGlmX2RldiAhPSBOVUxMKSB7CisJCWhpZl9pcGFfZ2V0X2NlX3Jlc291cmNlKHRhcmdldC0+aGlmX2RldiwKKwkJCQkJY2Vfc3JfYmFzZV9wYWRkciwKKwkJCQkJY2Vfc3JfcmluZ19zaXplLCBjZV9yZWdfcGFkZHIpOworCX0KK30KKyNlbmRpZiAvKiBJUEFfT0ZGTE9BRCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9odGMvaHRjX2FwaS5oIGIvY29yZS9odGMvaHRjX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzN2QzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2h0Yy9odGNfYXBpLmgKQEAgLTAsMCArMSw3MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0hUQ19BUElfSF8KKyNkZWZpbmUgX0hUQ19BUElfSF8KKworI2luY2x1ZGUgPGF0aGRlZnMuaD4KKyNpbmNsdWRlICJvc2FwaV9saW51eC5oIgorI2luY2x1ZGUgImh0Y19wYWNrZXQuaCIKKyNpbmNsdWRlIDxodGMuaD4KKyNpbmNsdWRlIDxodGNfc2VydmljZXMuaD4KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4gICAgICAgICAgLyogY2RmX2RldmljZV90ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyogVE9ETy4uIGZvciBCTUkgKi8KKyNkZWZpbmUgRU5EUE9JTlQxIDAKKy8qIFRPRE8gLXJlbW92ZSBtZSwgYnV0IHdlIGhhdmUgdG8gZml4IEJNSSBmaXJzdCAqLworI2RlZmluZSBIVENfTUFJTEJPWF9OVU1fTUFYICAgIDQKKworLyogdGhpcyBpcyB0aGUgYW1vdW50IG9mIGhlYWRlciByb29tIHJlcXVpcmVkIGJ5IHVzZXJzIG9mIEhUQyAqLworI2RlZmluZSBIVENfSEVBREVSX0xFTiAgICAgICAgIEhUQ19IRFJfTEVOR1RICisKK3R5cGVkZWYgdm9pZCAqSFRDX0hBTkRMRTsKKwordHlwZWRlZiBBX1VJTlQxNiBIVENfU0VSVklDRV9JRDsKKwordHlwZWRlZiB2b2lkICgqSFRDX1RBUkdFVF9GQUlMVVJFKSh2b2lkICpJbnN0YW5jZSwgQ0RGX1NUQVRVUyBTdGF0dXMpOworCit0eXBlZGVmIHN0cnVjdCBfSFRDX0lOSVRfSU5GTyB7CisJdm9pZCAqcENvbnRleHQ7ICAgICAgICAgLyogY29udGV4dCBmb3IgdGFyZ2V0IG5vdGlmaWNhdGlvbnMgKi8KKwl2b2lkICgqVGFyZ2V0RmFpbHVyZSkodm9pZCAqSW5zdGFuY2UsIENERl9TVEFUVVMgU3RhdHVzKTsKKwl2b2lkICgqVGFyZ2V0U2VuZFN1c3BlbmRDb21wbGV0ZSkodm9pZCAqY3R4KTsKK30gSFRDX0lOSVRfSU5GTzsKKworLyogU3RydWN0IGZvciBIVEMgbGF5ZXIgcGFja2V0IHN0YXRzKi8KK3N0cnVjdCBvbF9hdGhfaHRjX3N0YXRzIHsKKwlpbnQgaHRjX2dldF9wa3RfcV9mYWlsX2NvdW50OworCWludCBodGNfcGt0X3FfZW1wdHlfY291bnQ7CisJaW50IGh0Y19zZW5kX3FfZW1wdHlfY291bnQ7Cit9OworCisvKiBwZXIgc2VydmljZSBjb25uZWN0aW9uIHNlbmQgY29tcGxldGlvbiAqLwordHlwZWRlZiB2b2lkICgqSFRDX0VQX1NFTkRfUEtUX0NPTVBMRVRFKSh2b2lkICosIEhUQ19QQUNLRVQgKik7CisvKiBwZXIgc2VydmljZSBjb25uZWN0aW9uIGNhbGxiYWNrIHdoZW4gYSBwbHVyYWxpdHkgb2YgcGFja2V0cyBoYXZlIGJlZW4gc2VudAorICogVGhlIEhUQ19QQUNLRVRfUVVFVUUgaXMgYSB0ZW1wb3JhcnkgcXVldWUgb2JqZWN0IChlLmcuIGZyZWVkIG9uIHJldHVybiBmcm9tIHRoZSBjYWxsYmFjaykKKyAqIHRvIGhvbGQgYSBsaXN0IG9mIGNvbXBsZXRlZCBzZW5kIHBhY2tldHMuCisgKiBJZiB0aGUgaGFuZGxlciBjYW5ub3QgZnVsbHkgdHJhdmVyc2UgdGhlIHBhY2tldCBxdWV1ZSBiZWZvcmUgcmV0dXJuaW5nLCBpdCBzaG91bGQKKyAqIHRyYW5zZmVyIHRoZSBpdGVtcyBvZiB0aGUgcXVldWUgaW50byB0aGUgY2FsbGVyJ3MgcHJpdmF0ZSBxdWV1ZSB1c2luZzoKKyAqICAgSFRDX1BBQ0tFVF9FTlFVRVVFKCkgKi8KK3R5cGVkZWYgdm9pZCAoKkhUQ19FUF9TRU5EX1BLVF9DT01QX01VTFRJUExFKSh2b2lkICosCisJCQkJCSAgICAgIEhUQ19QQUNLRVRfUVVFVUUgKik7CisvKiBwZXIgc2VydmljZSBjb25uZWN0aW9uIHBrdCByZWNlaXZlZCAqLwordHlwZWRlZiB2b2lkICgqSFRDX0VQX1JFQ1ZfUEtUKSh2b2lkICosIEhUQ19QQUNLRVQgKik7CisvKiBwZXIgc2VydmljZSBjb25uZWN0aW9uIGNhbGxiYWNrIHdoZW4gYSBwbHVyYWxpdHkgb2YgcGFja2V0cyBhcmUgcmVjZWl2ZWQKKyAqIFRoZSBIVENfUEFDS0VUX1FVRVVFIGlzIGEgdGVtcG9yYXJ5IHF1ZXVlIG9iamVjdCAoZS5nLiBmcmVlZCBvbiByZXR1cm4gZnJvbSB0aGUgY2FsbGJhY2spCisgKiB0byBob2xkIGEgbGlzdCBvZiByZWN2IHBhY2tldHMuCisgKiBJZiB0aGUgaGFuZGxlciBjYW5ub3QgZnVsbHkgdHJhdmVyc2UgdGhlIHBhY2tldCBxdWV1ZSBiZWZvcmUgcmV0dXJuaW5nLCBpdCBzaG91bGQKKyAqIHRyYW5zZmVyIHRoZSBpdGVtcyBvZiB0aGUgcXVldWUgaW50byB0aGUgY2FsbGVyJ3MgcHJpdmF0ZSBxdWV1ZSB1c2luZzoKKyAqICAgSFRDX1BBQ0tFVF9FTlFVRVVFKCkgKi8KK3R5cGVkZWYgdm9pZCAoKkhUQ19FUF9SRUNWX1BLVF9NVUxUSVBMRSkodm9pZCAqLCBIVENfUEFDS0VUX1FVRVVFICopOworCisvKiBPcHRpb25hbCBwZXIgc2VydmljZSBjb25uZWN0aW9uIHJlY2VpdmUgYnVmZmVyIHJlLWZpbGwgY2FsbGJhY2ssCisgKiBPbiBzb21lIE9TZXMgKGxpa2UgTGludXgpIHBhY2tldHMgYXJlIGFsbG9jYXRlZCBmcm9tIGEgZ2xvYmFsIHBvb2wgYW5kIGluZGljYXRlZCB1cAorICogdG8gdGhlIG5ldHdvcmsgc3RhY2suICBUaGUgZHJpdmVyIG5ldmVyIGdldHMgdGhlIHBhY2tldHMgYmFjayBmcm9tIHRoZSBPUy4gIEZvciB0aGVzZSBPU2VzCisgKiBhIHJlZmlsbCBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byBhbGxvY2F0ZSBhbmQgcmUtcXVldWUgYnVmZmVycyBpbnRvIEhUQy4KKyAqCisgKiBPbiBvdGhlciBPU2VzLCB0aGUgbmV0d29yayBzdGFjayBjYW4gY2FsbCBpbnRvIHRoZSBkcml2ZXIncyBPUy1zcGVjaWZjICJyZXR1cm5fcGFja2V0IiBoYW5kbGVyIGFuZAorICogdGhlIGRyaXZlciBjYW4gcmUtcXVldWUgdGhlc2UgYnVmZmVycyBpbnRvIEhUQy4gSW4gdGhpcyByZWdhcmQgYSByZWZpbGwgY2FsbGJhY2sgaXMKKyAqIHVubmVjZXNzYXJ5ICovCit0eXBlZGVmIHZvaWQgKCpIVENfRVBfUkVDVl9SRUZJTEwpKHZvaWQgKiwgSFRDX0VORFBPSU5UX0lEIEVuZHBvaW50KTsKKworLyogT3B0aW9uYWwgcGVyIHNlcnZpY2UgY29ubmVjdGlvbiByZWNlaXZlIGJ1ZmZlciBhbGxvY2F0aW9uIGNhbGxiYWNrLgorICogT24gc29tZSBzeXN0ZW1zIHBhY2tldCBidWZmZXJzIGFyZSBhbiBleHRyZW1lbHkgbGltaXRlZCByZXNvdXJjZS4gIFJhdGhlciB0aGFuCisgKiBxdWV1ZSBsYXJnZXN0LXBvc3NpYmxlLXNpemVkIGJ1ZmZlcnMgdG8gSFRDLCBzb21lIHN5c3RlbXMgd291bGQgcmF0aGVyCisgKiBhbGxvY2F0ZSBhIHNwZWNpZmljIHNpemUgYXMgdGhlIHBhY2tldCBpcyByZWNlaXZlZC4gIFRoZSB0cmFkZSBvZmYgaXMKKyAqIHNsaWdodGx5IG1vcmUgcHJvY2Vzc2luZyAoY2FsbGJhY2sgaW52b2tlZCBmb3IgZWFjaCBSWCBwYWNrZXQpCisgKiBmb3IgdGhlIGJlbmVmaXQgb2YgY29tbWl0dGluZyBmZXdlciBidWZmZXIgcmVzb3VyY2VzIGludG8gSFRDLgorICoKKyAqIFRoZSBjYWxsYmFjayBpcyBwcm92aWRlZCB0aGUgbGVuZ3RoIG9mIHRoZSBwZW5kaW5nIHBhY2tldCB0byBmZXRjaC4gVGhpcyBpbmNsdWRlcyB0aGUKKyAqIEhUQyBoZWFkZXIgbGVuZ3RoIHBsdXMgdGhlIGxlbmd0aCBvZiBwYXlsb2FkLiAgVGhlIGNhbGxiYWNrIGNhbiByZXR1cm4gYSBwb2ludGVyIHRvCisgKiB0aGUgYWxsb2NhdGVkIEhUQyBwYWNrZXQgZm9yIGltbWVkaWF0ZSB1c2UuCisgKgorICogQWx0ZXJuYXRpdmVseSBhIHZhcmlhbnQgb2YgdGhpcyBoYW5kbGVyIGNhbiBiZSB1c2VkIHRvIGFsbG9jYXRlIGxhcmdlIHJlY2VpdmUgcGFja2V0cyBhcyBuZWVkZWQuCisgKiBGb3IgZXhhbXBsZSBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoZSByZWZpbGwgbWVjaGFuaXNtIGZvciBub3JtYWwgcGFja2V0cyBhbmQgdGhlIHJlY3YtYWxsb2MgbWVjaGFuaXNtIHRvCisgKiBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBsYXJnZSBwYWNrZXQgYnVmZmVyIGlzIHJlcXVpcmVkLiAgVGhpcyBjYW4gc2lnbmlmaWNhbnRseSByZWR1Y2UgdGhlCisgKiBhbW91bnQgb2YgImNvbW1pdHRlZCIgbWVtb3J5IHVzZWQgdG8gcmVjZWl2ZSBwYWNrZXRzLgorICoKKyAqICovCit0eXBlZGVmIEhUQ19QQUNLRVQgKigqSFRDX0VQX1JFQ1ZfQUxMT0MpKHZvaWQgKiwKKwkJCQkJIEhUQ19FTkRQT0lOVF9JRCBFbmRwb2ludCwKKwkJCQkJIGludCBMZW5ndGgpOworCit0eXBlZGVmIGVudW0gX0hUQ19TRU5EX0ZVTExfQUNUSU9OIHsKKwlIVENfU0VORF9GVUxMX0tFRVAgPSAwLCAgICAgICAgIC8qIHBhY2tldCB0aGF0IG92ZXJmbG93ZWQgc2hvdWxkIGJlIGtlcHQgaW4gdGhlIHF1ZXVlICovCisJSFRDX1NFTkRfRlVMTF9EUk9QID0gMSwgICAgICAgICAvKiBwYWNrZXQgdGhhdCBvdmVyZmxvd2VkIHNob3VsZCBiZSBkcm9wcGVkICovCit9IEhUQ19TRU5EX0ZVTExfQUNUSU9OOworCisvKiBPcHRpb25hbCBwZXIgc2VydmljZSBjb25uZWN0aW9uIGNhbGxiYWNrIHdoZW4gYSBzZW5kIHF1ZXVlIGlzIGZ1bGwuIFRoaXMgY2FuIG9jY3VyIGlmIHRoZQorICogaG9zdCBjb250aW51ZXMgcXVldWVpbmcgdXAgVFggcGFja2V0cyBmYXN0ZXIgdGhhbiBjcmVkaXRzIGNhbiBhcnJpdmUKKyAqIFRvIHByZXZlbnQgdGhlIGhvc3QgKG9uIHNvbWUgT3NlcyBsaWtlIExpbnV4KSBmcm9tIGNvbnRpbnVvdXNseSBxdWV1ZWluZyBwYWNrZXRzCisgKiBhbmQgY29uc3VtaW5nIHJlc291cmNlcywgdGhpcyBjYWxsYmFjayBpcyBwcm92aWRlZCBzbyB0aGF0IHRoYXQgdGhlIGhvc3QKKyAqIGNhbiBkaXNhYmxlIFRYIGluIHRoZSBzdWJzeXN0ZW0gKGkuZS4gbmV0d29yayBzdGFjaykuCisgKiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgZm9yIGVhY2ggcGFja2V0IHRoYXQgIm92ZXJmbG93cyIgdGhlIEhUQyBxdWV1ZS4gVGhlIGNhbGxiYWNrIGNhbgorICogZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5ldyBwYWNrZXQgdGhhdCBvdmVyZmxvd2VkIHRoZSBxdWV1ZSBjYW4gYmUga2VwdCAoSFRDX1NFTkRfRlVMTF9LRUVQKSBvcgorICogZHJvcHBlZCAoSFRDX1NFTkRfRlVMTF9EUk9QKS4gIElmIGEgcGFja2V0IGlzIGRyb3BwZWQsIHRoZSBFcFR4Q29tcGxldGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZAorICogYW5kIHRoZSBwYWNrZXQncyBzdGF0dXMgZmllbGQgd2lsbCBiZSBzZXQgdG8gQV9OT19SRVNPVVJDRS4KKyAqIE90aGVyIE9TZXMgcmVxdWlyZSBhICJwZXItcGFja2V0IiBpbmRpY2F0aW9uIGZvciBlYWNoIGNvbXBsZXRlZCBUWCBwYWNrZXQsIHRoaXMKKyAqIGNsb3NlZCBsb29wIG1lY2hhbmlzbSB3aWxsIHByZXZlbnQgdGhlIG5ldHdvcmsgc3RhY2sgZnJvbSBvdmVydW5uaW5nIHRoZSBOSUMKKyAqIFRoZSBwYWNrZXQgdG8ga2VlcCBvciBkcm9wIGlzIHBhc3NlZCBmb3IgaW5zcGVjdGlvbiB0byB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVyIHRoZSBoYW5kbGVyCisgKiBtdXN0IE9OTFkgaW5zcGVjdCB0aGUgcGFja2V0LCBpdCBtYXkgbm90IGZyZWUgb3IgcmVjbGFpbSB0aGUgcGFja2V0LiAqLwordHlwZWRlZiBIVENfU0VORF9GVUxMX0FDVElPTiAoKkhUQ19FUF9TRU5EX1FVRVVFX0ZVTEwpKHZvaWQgKiwKKwkJCQkJCSAgICAgICBIVENfUEFDS0VUICoKKwkJCQkJCSAgICAgICBwUGFja2V0KTsKKwordHlwZWRlZiBzdHJ1Y3QgX0hUQ19FUF9DQUxMQkFDS1MgeworCXZvaWQgKnBDb250ZXh0OyAgICAgICAgIC8qIGNvbnRleHQgZm9yIGVhY2ggY2FsbGJhY2sgKi8KKwlIVENfRVBfU0VORF9QS1RfQ09NUExFVEUgRXBUeENvbXBsZXRlOyAgICAgICAgICAvKiB0eCBjb21wbGV0aW9uIGNhbGxiYWNrIGZvciBjb25uZWN0ZWQgZW5kcG9pbnQgKi8KKwlIVENfRVBfUkVDVl9QS1QgRXBSZWN2OyAgICAgICAgIC8qIHJlY2VpdmUgY2FsbGJhY2sgZm9yIGNvbm5lY3RlZCBlbmRwb2ludCAqLworCUhUQ19FUF9SRUNWX1JFRklMTCBFcFJlY3ZSZWZpbGw7ICAgICAgICAgICAgICAgIC8qIE9QVElPTkFMIHJlY2VpdmUgcmUtZmlsbCBjYWxsYmFjayBmb3IgY29ubmVjdGVkIGVuZHBvaW50ICovCisJSFRDX0VQX1NFTkRfUVVFVUVfRlVMTCBFcFNlbmRGdWxsOyAgICAgICAgICAgICAgLyogT1BUSU9OQUwgc2VuZCBmdWxsIGNhbGxiYWNrICovCisJSFRDX0VQX1JFQ1ZfQUxMT0MgRXBSZWN2QWxsb2M7ICAgICAgICAgIC8qIE9QVElPTkFMIHJlY3YgYWxsb2NhdGlvbiBjYWxsYmFjayAqLworCUhUQ19FUF9SRUNWX0FMTE9DIEVwUmVjdkFsbG9jVGhyZXNoOyAgICAgICAgICAgIC8qIE9QVElPTkFMIHJlY3YgYWxsb2NhdGlvbiBjYWxsYmFjayBiYXNlZCBvbiBhIHRocmVzaG9sZCAqLworCUhUQ19FUF9TRU5EX1BLVF9DT01QX01VTFRJUExFIEVwVHhDb21wbGV0ZU11bHRpcGxlOyAgICAgICAgICAgICAvKiBPUFRJT05BTCBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIG11bHRpcGxlIGNvbXBsZXRlCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRpb25zIChFcFR4Q29tcGxldGUgbXVzdCBiZSBOVUxMKSAqLworCUhUQ19FUF9SRUNWX1BLVF9NVUxUSVBMRSBFcFJlY3ZQa3RNdWx0aXBsZTsgICAgICAgICAgICAgLyogT1BUSU9OQUwgY29tcGxldGlvbiBoYW5kbGVyIGZvciBtdWx0aXBsZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdiBwYWNrZXQgaW5kaWNhdGlvbnMgKEVwUmVjdiBtdXN0IGJlIE5VTEwpICovCisJaW50IFJlY3ZBbGxvY1RocmVzaG9sZDsgICAgICAgICAvKiBpZiBFcFJlY3ZBbGxvY1RocmVzaCBpcyBub24tTlVMTCwgSFRDIHdpbGwgY29tcGFyZSB0aGUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCB2YWx1ZSB0byB0aGUgY3VycmVudCByZWN2IHBhY2tldCBsZW5ndGggYW5kIGludm9rZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEVwUmVjdkFsbG9jVGhyZXNoIGNhbGxiYWNrIHRvIGFjcXVpcmUgYSBwYWNrZXQgYnVmZmVyICovCisJaW50IFJlY3ZSZWZpbGxXYXRlck1hcms7ICAgICAgICAgICAgICAgIC8qIGlmIGEgRXBSZWN2UmVmaWxsIGhhbmRsZXIgaXMgcHJvdmlkZWQsIHRoaXMgdmFsdWUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgdG8gc2V0IGEgdHJpZ2dlciByZWZpbGwgY2FsbGJhY2sKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgcmVjdiBxdWV1ZSBkcm9wcyBiZWxvdyB0aGlzIHZhbHVlCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNldCB0byAwLCB0aGUgcmVmaWxsIGlzIG9ubHkgY2FsbGVkIHdoZW4gcGFja2V0cworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZW1wdHkgKi8KK30gSFRDX0VQX0NBTExCQUNLUzsKKworLyogc2VydmljZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCBfSFRDX1NFUlZJQ0VfQ09OTkVDVF9SRVEgeworCUhUQ19TRVJWSUNFX0lEIFNlcnZpY2VJRDsgICAgICAgICAgICAgICAvKiBzZXJ2aWNlIElEIHRvIGNvbm5lY3QgdG8gKi8KKwlBX1VJTlQxNiBDb25uZWN0aW9uRmxhZ3M7ICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbiBmbGFncywgc2VlIGh0YyBwcm90b2NvbCBkZWZpbml0aW9uICovCisJQV9VSU5UOCAqcE1ldGFEYXRhOyAgICAgICAgICAgICAvKiBwdHIgdG8gb3B0aW9uYWwgc2VydmljZS1zcGVjaWZpYyBtZXRhLWRhdGEgKi8KKwlBX1VJTlQ4IE1ldGFEYXRhTGVuZ3RoOyAgICAgICAgIC8qIG9wdGlvbmFsIG1ldGEgZGF0YSBsZW5ndGggKi8KKwlIVENfRVBfQ0FMTEJBQ0tTIEVwQ2FsbGJhY2tzOyAgICAgICAgICAgLyogZW5kcG9pbnQgY2FsbGJhY2tzICovCisJaW50IE1heFNlbmRRdWV1ZURlcHRoOyAgICAgICAgICAvKiBtYXhpbXVtIGRlcHRoIG9mIGFueSBzZW5kIHF1ZXVlICovCisJQV9VSU5UMzIgTG9jYWxDb25uZWN0aW9uRmxhZ3M7ICAgICAgICAgIC8qIEhUQyBmbGFncyBmb3IgdGhlIGhvc3Qtc2lkZSAobG9jYWwpIGNvbm5lY3Rpb24gKi8KKwl1bnNpZ25lZCBpbnQgTWF4U2VuZE1zZ1NpemU7ICAgICAgICAgICAgLyogb3ZlcnJpZGUgbWF4IG1lc3NhZ2Ugc2l6ZSBpbiBzZW5kIGRpcmVjdGlvbiAqLworfSBIVENfU0VSVklDRV9DT05ORUNUX1JFUTsKKworI2RlZmluZSBIVENfTE9DQUxfQ09OTl9GTEFHU19FTkFCTEVfU0VORF9CVU5ETEVfUEFERElORyAoMSA8PCAwKSAgICAgICAgLyogZW5hYmxlIHNlbmQgYnVuZGxlIHBhZGRpbmcgZm9yIHRoaXMgZW5kcG9pbnQgKi8KKworLyogc2VydmljZSBjb25uZWN0aW9uIHJlc3BvbnNlIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCBfSFRDX1NFUlZJQ0VfQ09OTkVDVF9SRVNQIHsKKwlBX1VJTlQ4ICpwTWV0YURhdGE7ICAgICAgICAgICAgIC8qIGNhbGxlciBzdXBwbGllZCBidWZmZXIgdG8gb3B0aW9uYWwgbWV0YS1kYXRhICovCisJQV9VSU5UOCBCdWZmZXJMZW5ndGg7ICAgICAgICAgICAvKiBsZW5ndGggb2YgY2FsbGVyIHN1cHBsaWVkIGJ1ZmZlciAqLworCUFfVUlOVDggQWN0dWFsTGVuZ3RoOyAgICAgICAgICAgLyogYWN0dWFsIGxlbmd0aCBvZiBtZXRhIGRhdGEgKi8KKwlIVENfRU5EUE9JTlRfSUQgRW5kcG9pbnQ7ICAgICAgICAgICAgICAgLyogZW5kcG9pbnQgdG8gY29tbXVuaWNhdGUgb3ZlciAqLworCXVuc2lnbmVkIGludCBNYXhNc2dMZW5ndGg7ICAgICAgICAgICAgICAvKiBtYXggbGVuZ3RoIG9mIGFsbCBtZXNzYWdlcyBvdmVyIHRoaXMgZW5kcG9pbnQgKi8KKwlBX1VJTlQ4IENvbm5lY3RSZXNwQ29kZTsgICAgICAgICAgICAgICAgLyogY29ubmVjdCByZXNwb25zZSBjb2RlIGZyb20gdGFyZ2V0ICovCit9IEhUQ19TRVJWSUNFX0NPTk5FQ1RfUkVTUDsKKworLyogZW5kcG9pbnQgZGlzdHJpYnV0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX0hUQ19FTkRQT0lOVF9DUkVESVRfRElTVCB7CisJc3RydWN0IF9IVENfRU5EUE9JTlRfQ1JFRElUX0RJU1QgKnBOZXh0OworCXN0cnVjdCBfSFRDX0VORFBPSU5UX0NSRURJVF9ESVNUICpwUHJldjsKKwlIVENfU0VSVklDRV9JRCBTZXJ2aWNlSUQ7ICAgICAgICAgICAgICAgLyogU2VydmljZSBJRCAoc2V0IGJ5IEhUQykgKi8KKwlIVENfRU5EUE9JTlRfSUQgRW5kcG9pbnQ7ICAgICAgICAgICAgICAgLyogZW5kcG9pbnQgZm9yIHRoaXMgZGlzdHJpYnV0aW9uIHN0cnVjdCAoc2V0IGJ5IEhUQykgKi8KKwlBX1VJTlQzMiBEaXN0RmxhZ3M7ICAgICAgICAgICAgIC8qIGRpc3RyaWJ1dGlvbiBmbGFncywgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIGNhbgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGRlZmF1bHQgYWN0aXZpdHkgdXNpbmcgU0VUX0VQX0FDVElWRSgpIG1hY3JvICovCisJaW50IFR4Q3JlZGl0c05vcm07ICAgICAgICAgICAgICAvKiBjcmVkaXRzIGZvciBub3JtYWwgb3BlcmF0aW9uLCBhbnl0aGluZyBhYm92ZSB0aGlzCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGVuZHBvaW50IGlzIG92ZXItc3Vic2NyaWJlZCwgdGhpcyBmaWVsZAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgb25seSByZWxldmFudCB0byB0aGUgY3JlZGl0IGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiAqLworCWludCBUeENyZWRpdHNNaW47ICAgICAgICAgICAgICAgLyogZmxvb3IgZm9yIGNyZWRpdCBkaXN0cmlidXRpb24sIHRoaXMgZmllbGQgaXMKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgcmVsZXZhbnQgdG8gdGhlIGNyZWRpdCBkaXN0cmlidXRpb24gZnVuY3Rpb24gKi8KKwlpbnQgVHhDcmVkaXRzQXNzaWduZWQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBjcmVkaXRzIGFzc2lnbmVkIHRvIHRoaXMgRVAsIHRoaXMgZmllbGQKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlIGNyZWRpdCBkaXN0IGZ1bmN0aW9uICovCisJaW50IFR4Q3JlZGl0czsgICAgICAgICAgLyogY3VycmVudCBjcmVkaXRzIGF2YWlsYWJsZSwgdGhpcyBmaWVsZCBpcyB1c2VkIGJ5CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRDIHRvIGRldGVybWluZSB3aGV0aGVyIGEgbWVzc2FnZSBjYW4gYmUgc2VudCBvcgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgcXVldWVkICovCisJaW50IFR4Q3JlZGl0c1RvRGlzdDsgICAgICAgICAgICAvKiBwZW5kaW5nIGNyZWRpdHMgdG8gZGlzdHJpYnV0ZSBvbiB0aGlzIGVuZHBvaW50LCB0aGlzCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzZXQgYnkgSFRDIHdoZW4gY3JlZGl0IHJlcG9ydHMgYXJyaXZlLgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGNyZWRpdCBkaXN0cmlidXRpb24gZnVuY3Rpb25zIHNldHMgdGhpcyB0byB6ZXJvCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGl0IGRpc3RyaWJ1dGVzIHRoZSBjcmVkaXRzICovCisJaW50IFR4Q3JlZGl0c1NlZWs7ICAgICAgICAgICAgICAvKiB0aGlzIGlzIHRoZSBudW1iZXIgb2YgY3JlZGl0cyB0aGF0IHRoZSBjdXJyZW50IHBlbmRpbmcgVFgKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldCBuZWVkcyB0byB0cmFuc21pdC4gIFRoaXMgaXMgc2V0IGJ5IEhUQyB3aGVuCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZW5kcG9pbnQgbmVlZHMgY3JlZGl0cyBpbiBvcmRlciB0byB0cmFuc21pdCAqLworCWludCBUeENyZWRpdFNpemU7ICAgICAgICAgICAgICAgLyogc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGNyZWRpdCAoc2V0IGJ5IEhUQykgKi8KKwlpbnQgVHhDcmVkaXRzUGVyTWF4TXNnOyAgICAgICAgIC8qIGNyZWRpdHMgcmVxdWlyZWQgZm9yIGEgbWF4aW11bSBzaXplZCBtZXNzYWdlcyAoc2V0IGJ5IEhUQykgKi8KKwl2b2lkICpwSFRDUmVzZXJ2ZWQ7ICAgICAgICAgICAgIC8qIHJlc2VydmVkIGZvciBIVEMgdXNlICovCisJaW50IFR4UXVldWVEZXB0aDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlcHRoIG9mIFRYIHF1ZXVlICwgaS5lLiBtZXNzYWdlcyB3YWl0aW5nIGZvciBjcmVkaXRzCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHZhbGlkIG9ubHkgd2hlbiBIVENfQ1JFRElUX0RJU1RfQUNUSVZJVFlfQ0hBTkdFCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSBpcyBpbmRpY2F0ZWQgb24gYW4gZW5kcG9pbnQKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaGFzIG5vbi16ZXJvIGNyZWRpdHMgdG8gcmVjb3ZlcgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IEhUQ19FTkRQT0lOVF9DUkVESVRfRElTVDsKKworI2RlZmluZSBIVENfRVBfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQV9VSU5UMzIpICgxdSA8PCAzMSkpCisKKy8qIG1hY3JvIHRvIGNoZWNrIGlmIGFuIGVuZHBvaW50IGhhcyBnb25lIGFjdGl2ZSwgdXNlZnVsIGZvciBjcmVkaXQKKyAqIGRpc3RyaWJ1dGlvbnMgKi8KKyNkZWZpbmUgSVNfRVBfQUNUSVZFKGVwRGlzdCkgICgoZXBEaXN0KS0+RGlzdEZsYWdzICYgSFRDX0VQX0FDVElWRSkKKyNkZWZpbmUgU0VUX0VQX0FDVElWRShlcERpc3QpIChlcERpc3QpLT5EaXN0RmxhZ3MgfD0gSFRDX0VQX0FDVElWRQorCisvKiBjcmVkaXQgZGlzdGlidXRpb24gY29kZSB0aGF0IGlzIHBhc3NlZCBpbnRvIHRoZSBkaXN0cmJ1dGlvbiBmdW5jdGlvbiwKKyAqIHRoZXJlIGFyZSBtYW5kYXRvcnkgYW5kIG9wdGlvbmFsIGNvZGVzIHRoYXQgbXVzdCBiZSBoYW5kbGVkICovCit0eXBlZGVmIGVudW0gX0hUQ19DUkVESVRfRElTVF9SRUFTT04geworCUhUQ19DUkVESVRfRElTVF9TRU5EX0NPTVBMRVRFID0gMCwgICAgICAgICAgICAgIC8qIGNyZWRpdHMgYXZhaWxhYmxlIGFzIGEgcmVzdWx0IG9mIGNvbXBsZXRlZAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQgb3BlcmF0aW9ucyAoTUFOREFUT1JZKSByZXN1bHRpbmcgaW4gY3JlZGl0IHJlcG9ydHMgKi8KKwlIVENfQ1JFRElUX0RJU1RfQUNUSVZJVFlfQ0hBTkdFID0gMSwgICAgICAgICAgICAvKiBhIGNoYW5nZSBpbiBlbmRwb2ludCBhY3Rpdml0eSBvY2N1cmVkIChPUFRJT05BTCkgKi8KKwlIVENfQ1JFRElUX0RJU1RfU0VFS19DUkVESVRTLCAgICAgICAgICAgLyogYW4gZW5kcG9pbnQgbmVlZHMgdG8gInNlZWsiIGNyZWRpdHMgKE9QVElPTkFMKSAqLworCUhUQ19EVU1QX0NSRURJVF9TVEFURSAgICAgICAgICAgLyogZm9yIGRlYnVnZ2luZywgZHVtcCBhbnkgc3RhdGUgaW5mb3JtYXRpb24gdGhhdCBpcyBrZXB0IGJ5CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uICovCit9IEhUQ19DUkVESVRfRElTVF9SRUFTT047CisKK3R5cGVkZWYgdm9pZCAoKkhUQ19DUkVESVRfRElTVF9DQUxMQkFDSykodm9pZCAqQ29udGV4dCwKKwkJCQkJIEhUQ19FTkRQT0lOVF9DUkVESVRfRElTVCAqCisJCQkJCSBwRVBMaXN0LAorCQkJCQkgSFRDX0NSRURJVF9ESVNUX1JFQVNPTgorCQkJCQkgUmVhc29uKTsKKwordHlwZWRlZiB2b2lkICgqSFRDX0NSRURJVF9JTklUX0NBTExCQUNLKSh2b2lkICpDb250ZXh0LAorCQkJCQkgSFRDX0VORFBPSU5UX0NSRURJVF9ESVNUICoKKwkJCQkJIHBFUExpc3QsIGludCBUb3RhbENyZWRpdHMpOworCisvKiBlbmRwb2ludCBzdGF0aXN0aWNzIGFjdGlvbiAqLwordHlwZWRlZiBlbnVtIF9IVENfRU5EUE9JTlRfU1RBVF9BQ1RJT04geworCUhUQ19FUF9TVEFUX1NBTVBMRSA9IDAsICAgICAgICAgLyogb25seSByZWFkIHN0YXRpc3RpY3MgKi8KKwlIVENfRVBfU1RBVF9TQU1QTEVfQU5EX0NMRUFSID0gMSwgICAgICAgICAgICAgICAvKiBzYW1wbGUgYW5kIGltbWVkaWF0ZWx5IGNsZWFyIHN0YXRpc3RpY3MgKi8KKwlIVENfRVBfU1RBVF9DTEVBUiAgICAgICAgICAgICAgIC8qIGNsZWFyIG9ubHkgKi8KK30gSFRDX0VORFBPSU5UX1NUQVRfQUNUSU9OOworCisvKiBlbmRwb2ludCBzdGF0aXN0aWNzICovCit0eXBlZGVmIHN0cnVjdCBfSFRDX0VORFBPSU5UX1NUQVRTIHsKKwlBX1VJTlQzMiBUeFBvc3RlZDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBUWCBwYWNrZXRzIHBvc3RlZCB0byB0aGUgZW5kcG9pbnQgKi8KKwlBX1VJTlQzMiBUeENyZWRpdExvd0luZGljYXRpb25zOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdGltZXMgdGhlIGhvc3Qgc2V0IHRoZSBjcmVkaXQtbG93IGZsYWcgaW4gYSBzZW5kIG1lc3NhZ2Ugb24KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVuZHBvaW50ICovCisJQV9VSU5UMzIgVHhJc3N1ZWQ7ICAgICAgICAgICAgICAvKiBydW5uaW5nIGNvdW50IG9mIHRvdGFsIFRYIHBhY2tldHMgaXNzdWVkICovCisJQV9VSU5UMzIgVHhQYWNrZXRzQnVuZGxlZDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY291bnQgb2YgVFggcGFja2V0cyB0aGF0IHdlcmUgaXNzdWVkIGluIGJ1bmRsZXMgKi8KKwlBX1VJTlQzMiBUeEJ1bmRsZXM7ICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY291bnQgb2YgVFggYnVuZGxlcyB0aGF0IHdlcmUgaXNzdWVkICovCisJQV9VSU5UMzIgVHhEcm9wcGVkOyAgICAgICAgICAgICAvKiB0eCBwYWNrZXRzIHRoYXQgd2VyZSBkcm9wcGVkICovCisJQV9VSU5UMzIgVHhDcmVkaXRScHRzOyAgICAgICAgICAvKiBydW5uaW5nIGNvdW50IG9mIHRvdGFsIGNyZWRpdCByZXBvcnRzIHJlY2VpdmVkIGZvciB0aGlzIGVuZHBvaW50ICovCisJQV9VSU5UMzIgVHhDcmVkaXRScHRzRnJvbVJ4OyAgICAgICAgICAgIC8qIGNyZWRpdCByZXBvcnRzIHJlY2VpdmVkIGZyb20gdGhpcyBlbmRwb2ludCdzIFJYIHBhY2tldHMgKi8KKwlBX1VJTlQzMiBUeENyZWRpdFJwdHNGcm9tT3RoZXI7ICAgICAgICAgLyogY3JlZGl0IHJlcG9ydHMgcmVjZWl2ZWQgZnJvbSBSWCBwYWNrZXRzIG9mIG90aGVyIGVuZHBvaW50cyAqLworCUFfVUlOVDMyIFR4Q3JlZGl0UnB0c0Zyb21FcDA7ICAgICAgICAgICAvKiBjcmVkaXQgcmVwb3J0cyByZWNlaXZlZCBmcm9tIGVuZHBvaW50IDAgUlggcGFja2V0cyAqLworCUFfVUlOVDMyIFR4Q3JlZGl0c0Zyb21SeDsgICAgICAgICAgICAgICAvKiBjb3VudCBvZiBjcmVkaXRzIHJlY2VpdmVkIHZpYSBSeCBwYWNrZXRzIG9uIHRoaXMgZW5kcG9pbnQgKi8KKwlBX1VJTlQzMiBUeENyZWRpdHNGcm9tT3RoZXI7ICAgICAgICAgICAgLyogY291bnQgb2YgY3JlZGl0cyByZWNlaXZlZCB2aWEgYW5vdGhlciBlbmRwb2ludCAqLworCUFfVUlOVDMyIFR4Q3JlZGl0c0Zyb21FcDA7ICAgICAgICAgICAgICAvKiBjb3VudCBvZiBjcmVkaXRzIHJlY2VpdmVkIHZpYSBhbm90aGVyIGVuZHBvaW50ICovCisJQV9VSU5UMzIgVHhDcmVkaXRzQ29uc3VtbWVkOyAgICAgICAgICAgIC8qIGNvdW50IG9mIGNvbnN1bW1lZCBjcmVkaXRzICovCisJQV9VSU5UMzIgVHhDcmVkaXRzUmV0dXJuZWQ7ICAgICAgICAgICAgIC8qIGNvdW50IG9mIGNyZWRpdHMgcmV0dXJuZWQgKi8KKwlBX1VJTlQzMiBSeFJlY2VpdmVkOyAgICAgICAgICAgIC8qIGNvdW50IG9mIFJYIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwlBX1VJTlQzMiBSeExvb2tBaGVhZHM7ICAgICAgICAgIC8qIGNvdW50IG9mIGxvb2thaGVhZCByZWNvcmRzCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCBpbiBtZXNzYWdlcyByZWNlaXZlZCBvbiB0aGlzIGVuZHBvaW50ICovCisJQV9VSU5UMzIgUnhQYWNrZXRzQnVuZGxlZDsgICAgICAgICAgICAgIC8qIGNvdW50IG9mIHJlY3YgcGFja2V0cyByZWNlaXZlZCBpbiBhIGJ1bmRsZSAqLworCUFfVUlOVDMyIFJ4QnVuZGxlTG9va0FoZWFkczsgICAgICAgICAgICAvKiBjb3VudCBvZiBudW1iZXIgb2YgYnVuZGxlZCBsb29rYWhlYWRzICovCisJQV9VSU5UMzIgUnhCdW5kbGVJbmRGcm9tSGRyOyAgICAgICAgICAgIC8qIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYnVuZGxlIGluZGljYXRpb25zIGZyb20gdGhlIEhUQyBoZWFkZXIgKi8KKwlBX1VJTlQzMiBSeEFsbG9jVGhyZXNoSGl0OyAgICAgICAgICAgICAgLyogY291bnQgb2YgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcmVjdiBhbGxvY2F0aW9uIHRocmVzaGhvbGQgd2FzIGhpdCAqLworCUFfVUlOVDMyIFJ4QWxsb2NUaHJlc2hCeXRlczsgICAgICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgKi8KK30gSFRDX0VORFBPSU5UX1NUQVRTOworCisvKiAtLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0gKi8KKy8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyAgIEBkZXNjOiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgSFRDIG92ZXIgdGhlIHVuZGVybHlpbmcgSElGIGRldmljZQorICAgQGZ1bmN0aW9uIG5hbWU6IGh0Y19jcmVhdGUKKyAgIEBpbnB1dDogIEhpZkRldmljZSAtIGhpZiBkZXZpY2UgaGFuZGxlLAorICAgICAgICAgICBwSW5mbyAtIGluaXRpYWxpemF0aW9uIGluZm9ybWF0aW9uCisgICBAb3V0cHV0OgorICAgQHJldHVybjogSFRDX0hBTkRMRSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKKyAgIEBub3RlczoKKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOiBodGNfZGVzdHJveQorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLworSFRDX0hBTkRMRSBodGNfY3JlYXRlKHZvaWQgKkhpZkRldmljZSwKKwkJICAgICAgSFRDX0lOSVRfSU5GTyAqcEluZm8sIGNkZl9kZXZpY2VfdCBvc2Rldik7CisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgICBAZGVzYzogR2V0IHRoZSB1bmRlcmx5aW5nIEhJRiBkZXZpY2UgaGFuZGxlCisgICBAZnVuY3Rpb24gbmFtZTogaHRjX2dldF9oaWZfZGV2aWNlCisgICBAaW5wdXQ6ICBIVENIYW5kbGUgLSBoYW5kbGUgcGFzc2VkIGludG8gdGhlIEFkZEluc3RhbmNlIGNhbGxiYWNrCisgICBAb3V0cHV0OgorICAgQHJldHVybjogb3BhcXVlIEhJRiBkZXZpY2UgaGFuZGxlIHVzYWJsZSBpbiBISUYgQVBJIGNhbGxzLgorICAgQG5vdGVzOgorICAgQGV4YW1wbGU6CisgICBAc2VlIGFsc286CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCit2b2lkICpodGNfZ2V0X2hpZl9kZXZpY2UoSFRDX0hBTkRMRSBIVENIYW5kbGUpOworLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworICAgQGRlc2M6IFNldCBjcmVkaXQgZGlzdHJpYnV0aW9uIHBhcmFtZXRlcnMKKyAgIEBmdW5jdGlvbiBuYW1lOiBodGNfc2V0X2NyZWRpdF9kaXN0cmlidXRpb24KKyAgIEBpbnB1dDogIEhUQ0hhbmRsZSAtIEhUQyBoYW5kbGUKKyAgICAgICAgICAgcENyZWRpdERpc3RDb250IC0gY2FsbGVyIHN1cHBsaWVkIGNvbnRleHQgdG8gcGFzcyBpbnRvIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbnMKKyAgICAgICAgICAgQ3JlZGl0RGlzdEZ1bmMgLSBEaXN0cmlidXRpb24gZnVuY3Rpb24gY2FsbGJhY2sKKyAgICAgICAgICAgQ3JlZGl0RGlzdEluaXQgLSBDcmVkaXQgRGlzdHJpYnV0aW9uIGluaXRpYWxpemF0aW9uIGNhbGxiYWNrCisgICAgICAgICAgIFNlcnZpY2VQcmlvcml0eU9yZGVyIC0gQXJyYXkgY29udGFpbmluZyBsaXN0IG9mIHNlcnZpY2UgSURzLCBsb3dlc3QgaW5kZXggaXMgaGlnaGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5CisgICAgICAgICAgIExpc3RMZW5ndGggLSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU2VydmljZVByaW9yaXR5T3JkZXIKKyAgIEBvdXRwdXQ6CisgICBAcmV0dXJuOgorICAgQG5vdGVzOiAgVGhlIHVzZXIgY2FuIHNldCBhIGN1c3RvbSBjcmVkaXQgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIHRvIGhhbmRsZSBzcGVjaWFsIHJlcXVpcmVtZW50cworICAgICAgICAgICBmb3IgZWFjaCBlbmRwb2ludC4gIEEgZGVmYXVsdCBjcmVkaXQgZGlzdHJpYnV0aW9uIHJvdXRpbmUgY2FuIGJlIHVzZWQgYnkgc2V0dGluZworICAgICAgICAgICBDcmVkaXRJbml0RnVuYyB0byBOVUxMLiAgVGhlIGRlZmF1bHQgY3JlZGl0IGRpc3RyaWJ1dGlvbiBpcyBvbmx5IHByb3ZpZGVkIGZvciBzaW1wbGUKKyAgICAgICAgICAgImZhaXIiIGNyZWRpdCBkaXN0cmlidXRpb24gd2l0aG91dCByZWdhcmQgdG8gYW55IHByaW9yaXRpemF0aW9uLgorCisgICBAZXhhbXBsZToKKyAgIEBzZWUgYWxzbzoKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KK3ZvaWQgaHRjX3NldF9jcmVkaXRfZGlzdHJpYnV0aW9uKEhUQ19IQU5ETEUgSFRDSGFuZGxlLAorCQkJCSB2b2lkICpwQ3JlZGl0RGlzdENvbnRleHQsCisJCQkJIEhUQ19DUkVESVRfRElTVF9DQUxMQkFDSyBDcmVkaXREaXN0RnVuYywKKwkJCQkgSFRDX0NSRURJVF9JTklUX0NBTExCQUNLIENyZWRpdEluaXRGdW5jLAorCQkJCSBIVENfU0VSVklDRV9JRCBTZXJ2aWNlUHJpb3JpdHlPcmRlcltdLAorCQkJCSBpbnQgTGlzdExlbmd0aCk7CisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgICBAZGVzYzogV2FpdCBmb3IgdGhlIHRhcmdldCB0byBpbmRpY2F0ZSB0aGUgSFRDIGxheWVyIGlzIHJlYWR5CisgICBAZnVuY3Rpb24gbmFtZTogaHRjX3dhaXRfdGFyZ2V0CisgICBAaW5wdXQ6ICBIVENIYW5kbGUgLSBIVEMgaGFuZGxlCisgICBAb3V0cHV0OgorICAgQHJldHVybjoKKyAgIEBub3RlczogIFRoaXMgQVBJIGJsb2NrcyB1bnRpbCB0aGUgdGFyZ2V0IHJlc3BvbmRzIHdpdGggYW4gSFRDIHJlYWR5IG1lc3NhZ2UuCisgICAgICAgICAgIFRoZSBjYWxsZXIgc2hvdWxkIG5vdCBjb25uZWN0IHNlcnZpY2VzIHVudGlsIHRoZSB0YXJnZXQgaGFzIGluZGljYXRlZCBpdCBpcworICAgICAgICAgICByZWFkeS4KKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOiBodGNfY29ubmVjdF9zZXJ2aWNlCisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCitBX1NUQVRVUyBodGNfd2FpdF90YXJnZXQoSFRDX0hBTkRMRSBIVENIYW5kbGUpOworLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworICAgQGRlc2M6IFN0YXJ0IHRhcmdldCBzZXJ2aWNlIGNvbW11bmljYXRpb25zCisgICBAZnVuY3Rpb24gbmFtZTogaHRjX3N0YXJ0CisgICBAaW5wdXQ6ICBIVENIYW5kbGUgLSBIVEMgaGFuZGxlCisgICBAb3V0cHV0OgorICAgQHJldHVybjoKKyAgIEBub3RlczogVGhpcyBBUEkgaW5kaWNhdGVzIHRvIHRoZSB0YXJnZXQgdGhhdCB0aGUgc2VydmljZSBjb25uZWN0aW9uIHBoYXNlIGlzIGNvbXBsZXRlCisgICAgICAgICAgYW5kIHRoZSB0YXJnZXQgY2FuIGZyZWVseSBzdGFydCBhbGwgY29ubmVjdGVkIHNlcnZpY2VzLiAgVGhpcyBBUEkgc2hvdWxkIG9ubHkgYmUKKyAgICAgICAgICBjYWxsZWQgQUZURVIgYWxsIHNlcnZpY2UgY29ubmVjdGlvbnMgaGF2ZSBiZWVuIG1hZGUuICBUQ1N0YXJ0IHdpbGwgaXNzdWUgYQorICAgICAgICAgIFNFVFVQX0NPTVBMRVRFIG1lc3NhZ2UgdG8gdGhlIHRhcmdldCB0byBpbmRpY2F0ZSB0aGF0IGFsbCBzZXJ2aWNlIGNvbm5lY3Rpb25zCisgICAgICAgICAgaGF2ZSBiZWVuIG1hZGUgYW5kIHRoZSB0YXJnZXQgY2FuIHN0YXJ0IGNvbW11bmljYXRpbmcgb3ZlciB0aGUgZW5kcG9pbnRzLgorICAgQGV4YW1wbGU6CisgICBAc2VlIGFsc286IGh0Y19jb25uZWN0X3NlcnZpY2UKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KK0FfU1RBVFVTIGh0Y19zdGFydChIVENfSEFORExFIEhUQ0hhbmRsZSk7CisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgICBAZGVzYzogQWRkIHJlY2VpdmUgcGFja2V0IHRvIEhUQworICAgQGZ1bmN0aW9uIG5hbWU6IGh0Y19hZGRfcmVjZWl2ZV9wa3QKKyAgIEBpbnB1dDogIEhUQ0hhbmRsZSAtIEhUQyBoYW5kbGUKKyAgICAgICAgICAgcFBhY2tldCAtIEhUQyByZWNlaXZlIHBhY2tldCB0byBhZGQKKyAgIEBvdXRwdXQ6CisgICBAcmV0dXJuOiBBX09LIG9uIHN1Y2Nlc3MKKyAgIEBub3RlczogIHVzZXIgbXVzdCBzdXBwbHkgSFRDIHBhY2tldHMgZm9yIGNhcHR1cmluZyBpbmNvbW1pbmcgSFRDIGZyYW1lcy4gIFRoZSBjYWxsZXIKKyAgICAgICAgICAgbXVzdCBpbml0aWFsaXplIGVhY2ggSFRDIHBhY2tldCB1c2luZyB0aGUgU0VUX0hUQ19QQUNLRVRfSU5GT19SWF9SRUZJTEwoKQorICAgICAgICAgICBtYWNyby4KKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOgorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLworQV9TVEFUVVMgaHRjX2FkZF9yZWNlaXZlX3BrdChIVENfSEFORExFIEhUQ0hhbmRsZSwgSFRDX1BBQ0tFVCAqcFBhY2tldCk7CisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgICBAZGVzYzogQ29ubmVjdCB0byBhbiBIVEMgc2VydmljZQorICAgQGZ1bmN0aW9uIG5hbWU6IGh0Y19jb25uZWN0X3NlcnZpY2UKKyAgIEBpbnB1dDogIEhUQ0hhbmRsZSAtIEhUQyBoYW5kbGUKKyAgICAgICAgICAgcFJlcSAtIGNvbm5lY3Rpb24gZGV0YWlscworICAgQG91dHB1dDogcFJlc3AgLSBjb25uZWN0aW9uIHJlc3BvbnNlCisgICBAcmV0dXJuOgorICAgQG5vdGVzOiAgU2VydmljZSBjb25uZWN0aW9ucyBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgaHRjX3N0YXJ0LiAgVXNlciBwcm92aWRlcyBjYWxsYmFjayBoYW5kbGVycworICAgICAgICAgICBmb3IgdmFyaW91cyBlbmRwb2ludCBldmVudHMuCisgICBAZXhhbXBsZToKKyAgIEBzZWUgYWxzbzogaHRjX3N0YXJ0CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCitBX1NUQVRVUyBodGNfY29ubmVjdF9zZXJ2aWNlKEhUQ19IQU5ETEUgSFRDSGFuZGxlLAorCQkJICAgICBIVENfU0VSVklDRV9DT05ORUNUX1JFUSAqcFJlcSwKKwkJCSAgICAgSFRDX1NFUlZJQ0VfQ09OTkVDVF9SRVNQICpwUmVzcCk7CisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgICBAZGVzYzogSFRDIHJlZ2lzdGVyIGxvZyBkdW1wCisgICBAZnVuY3Rpb24gbmFtZTogaHRjX2R1bXAKKyAgIEBpbnB1dDogIEhUQ0hhbmRsZSAtIEhUQyBoYW5kbGUKKyAgICAgICAgICAgQ21kSWQgLSBMb2cgY29tbWFuZAorICAgICAgICAgICBzdGFydCAtIHN0YXJ0L3ByaW50IGxvZ3MKKyAgIEBvdXRwdXQ6CisgICBAcmV0dXJuOgorICAgQG5vdGVzOiBSZWdpc3RlciBsb2dzIHdpbGwgYmUgc3RhcnRlZC9wcmludGVkLgorICAgYmUgZmx1c2hlZC4KKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOgorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLworCit2b2lkIGh0Y19kdW1wKEhUQ19IQU5ETEUgSFRDSGFuZGxlLCB1aW50OF90IENtZElkLCBib29sIHN0YXJ0KTsKKy8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyAgIEBkZXNjOiBTZW5kIGFuIEhUQyBwYWNrZXQKKyAgIEBmdW5jdGlvbiBuYW1lOiBodGNfc2VuZF9wa3QKKyAgIEBpbnB1dDogIEhUQ0hhbmRsZSAtIEhUQyBoYW5kbGUKKyAgICAgICAgICAgcFBhY2tldCAtIHBhY2tldCB0byBzZW5kCisgICBAb3V0cHV0OgorICAgQHJldHVybjogQV9PSworICAgQG5vdGVzOiAgQ2FsbGVyIG11c3QgaW5pdGlhbGl6ZSBwYWNrZXQgdXNpbmcgU0VUX0hUQ19QQUNLRVRfSU5GT19UWCgpIG1hY3JvLgorICAgICAgICAgICBUaGlzIGludGVyZmFjZSBpcyBmdWxseSBhc3luY2hyb25vdXMuICBPbiBlcnJvciwgSFRDIFNlbmRQa3Qgd2lsbAorICAgICAgICAgICBjYWxsIHRoZSByZWdpc3RlcmVkIEVuZHBvaW50IGNhbGxiYWNrIHRvIGNsZWFudXAgdGhlIHBhY2tldC4KKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOiBodGNfZmx1c2hfZW5kcG9pbnQKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KK0FfU1RBVFVTIGh0Y19zZW5kX3BrdChIVENfSEFORExFIEhUQ0hhbmRsZSwgSFRDX1BBQ0tFVCAqcFBhY2tldCk7CisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgICBAZGVzYzogU2VuZCBhbiBIVEMgcGFja2V0IGNvbnRhaW5pbmcgYSB0eCBkZXNjcmlwdG9yIGFuZCBkYXRhCisgICBAZnVuY3Rpb24gbmFtZTogaHRjX3NlbmRfZGF0YV9wa3QKKyAgIEBpbnB1dDogIEhUQ0hhbmRsZSAtIEhUQyBoYW5kbGUKKyAgICAgICAgICAgcFBhY2tldCAtIHBhY2tldCB0byBzZW5kCisgICBAb3V0cHV0OgorICAgQHJldHVybjogQV9PSworICAgQG5vdGVzOiAgQ2FsbGVyIG11c3QgaW5pdGlhbGl6ZSBwYWNrZXQgdXNpbmcgU0VUX0hUQ19QQUNLRVRfSU5GT19UWCgpIG1hY3JvLgorICAgICAgICAgICBDYWxsZXIgbXVzdCBwcm92aWRlIGhlYWRyb29tIGluIGFuIGluaXRpYWwgZnJhZ21lbnQgYWRkZWQgdG8gdGhlCisgICAgICAgICAgIG5ldHdvcmsgYnVmZmVyIHRvIHN0b3JlIGEgSFRDX0ZSQU1FX0hEUi4KKyAgICAgICAgICAgVGhpcyBpbnRlcmZhY2UgaXMgZnVsbHkgYXN5bmNocm9ub3VzLiAgT24gZXJyb3IsIGh0Y19zZW5kX2RhdGFfcGt0IHdpbGwKKyAgICAgICAgICAgY2FsbCB0aGUgcmVnaXN0ZXJlZCBFbmRwb2ludCBFcERhdGFUeENvbXBsZXRlIGNhbGxiYWNrIHRvIGNsZWFudXAKKyAgICAgICAgICAgdGhlIHBhY2tldC4KKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOiBodGNfc2VuZF9wa3QKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KKyNpZmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKK0FfU1RBVFVTIGh0Y19zZW5kX2RhdGFfcGt0KEhUQ19IQU5ETEUgSFRDSGFuZGxlLCBjZGZfbmJ1Zl90IG5ldGJ1ZiwKKwkJCSAgIGludCBFcGlkLCBpbnQgQWN0dWFsTGVuZ3RoKTsKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLypBVEhfMTFBQ19UWENPTVBBQ1QgKi8KK0FfU1RBVFVTIGh0Y19zZW5kX2RhdGFfcGt0KEhUQ19IQU5ETEUgSFRDSGFuZGxlLCBIVENfUEFDS0VUICpwUGFja2V0LAorCQkJICAgQV9VSU5UOCBtb3JlX2RhdGEpOworI2VuZGlmIC8qQVRIXzExQUNfVFhDT01QQUNUICovCisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgICBAZGVzYzogRmx1c2ggSFRDIHdoZW4gdGFyZ2V0IGlzIHJlbW92ZWQgc3VycHJpc2VseSBzZXJ2aWNlIGNvbW11bmljYXRpb25zCisgICBAZnVuY3Rpb24gbmFtZTogaHRjX2ZsdXNoX3N1cnByaXNlX3JlbW92ZQorICAgQGlucHV0OiAgSFRDSGFuZGxlIC0gSFRDIGhhbmRsZQorICAgQG91dHB1dDoKKyAgIEByZXR1cm46CisgICBAbm90ZXM6IEFsbCByZWNlaXZlIGFuZCBwZW5kaW5nIFRYIHBhY2tldHMgd2lsbAorICAgICAgICAgIGJlIGZsdXNoZWQuCisgICBAZXhhbXBsZToKKyAgIEBzZWUgYWxzbzoKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KK3ZvaWQgaHRjX2ZsdXNoX3N1cnByaXNlX3JlbW92ZShIVENfSEFORExFIEhUQ0hhbmRsZSk7CisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgICBAZGVzYzogU3RvcCBIVEMgc2VydmljZSBjb21tdW5pY2F0aW9ucworICAgQGZ1bmN0aW9uIG5hbWU6IGh0Y19zdG9wCisgICBAaW5wdXQ6ICBIVENIYW5kbGUgLSBIVEMgaGFuZGxlCisgICBAb3V0cHV0OgorICAgQHJldHVybjoKKyAgIEBub3RlczogSFRDIGNvbW11bmljYXRpb25zIGlzIGhhbHRlZC4gIEFsbCByZWNlaXZlIGFuZCBwZW5kaW5nIFRYIHBhY2tldHMgd2lsbAorICAgICAgICAgIGJlIGZsdXNoZWQuCisgICBAZXhhbXBsZToKKyAgIEBzZWUgYWxzbzoKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KK3ZvaWQgaHRjX3N0b3AoSFRDX0hBTkRMRSBIVENIYW5kbGUpOworLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworICAgQGRlc2M6IERlc3RvcnkgSFRDIHNlcnZpY2UKKyAgIEBmdW5jdGlvbiBuYW1lOiBodGNfZGVzdHJveQorICAgQGlucHV0OiBIVENIYW5kbGUKKyAgIEBvdXRwdXQ6CisgICBAcmV0dXJuOgorICAgQG5vdGVzOiAgVGhpcyBjbGVhbnMgdXAgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgaHRjX2NyZWF0ZSgpLgorICAgQGV4YW1wbGU6CisgICBAc2VlIGFsc286IGh0Y19jcmVhdGUKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KK3ZvaWQgaHRjX2Rlc3Ryb3koSFRDX0hBTkRMRSBIVENIYW5kbGUpOworLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworICAgQGRlc2M6IEZsdXNoIHBlbmRpbmcgVFggcGFja2V0cworICAgQGZ1bmN0aW9uIG5hbWU6IGh0Y19mbHVzaF9lbmRwb2ludAorICAgQGlucHV0OiAgSFRDSGFuZGxlIC0gSFRDIGhhbmRsZQorICAgICAgICAgICBFbmRwb2ludCAtIEVuZHBvaW50IHRvIGZsdXNoCisgICAgICAgICAgIFRhZyAtIGZsdXNoIHRhZworICAgQG91dHB1dDoKKyAgIEByZXR1cm46CisgICBAbm90ZXM6ICBUaGUgVGFnIHBhcmFtZXRlciBpcyB1c2VkIHRvIHNlbGVjdGl2ZWx5IGZsdXNoIHBhY2tldHMgd2l0aCBtYXRjaGluZyB0YWdzLgorICAgICAgICAgICBUaGUgdmFsdWUgb2YgMCBmb3JjZXMgYWxsIHBhY2tldHMgdG8gYmUgZmx1c2ggcmVnYXJkbGVzcyBvZiB0YWcuCisgICBAZXhhbXBsZToKKyAgIEBzZWUgYWxzbzogaHRjX3NlbmRfcGt0CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCit2b2lkIGh0Y19mbHVzaF9lbmRwb2ludChIVENfSEFORExFIEhUQ0hhbmRsZSwgSFRDX0VORFBPSU5UX0lEIEVuZHBvaW50LAorCQkJSFRDX1RYX1RBRyBUYWcpOworLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworICAgQGRlc2M6IER1bXAgY3JlZGl0IGRpc3RyaWJ1dGlvbiBzdGF0ZQorICAgQGZ1bmN0aW9uIG5hbWU6IGh0Y19kdW1wX2NyZWRpdF9zdGF0ZXMKKyAgIEBpbnB1dDogIEhUQ0hhbmRsZSAtIEhUQyBoYW5kbGUKKyAgIEBvdXRwdXQ6CisgICBAcmV0dXJuOgorICAgQG5vdGVzOiAgVGhpcyBkdW1wcyBhbGwgY3JlZGl0IGRpc3RyaWJ1dGlvbiBpbmZvcm1hdGlvbiB0byB0aGUgZGVidWdnZXIKKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOgorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwordm9pZCBodGNfZHVtcF9jcmVkaXRfc3RhdGVzKEhUQ19IQU5ETEUgSFRDSGFuZGxlKTsKKy8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyAgIEBkZXNjOiBJbmRpY2F0ZSBhIHRyYWZmaWMgYWN0aXZpdHkgY2hhbmdlIG9uIGFuIGVuZHBvaW50CisgICBAZnVuY3Rpb24gbmFtZTogaHRjX2luZGljYXRlX2FjdGl2aXR5X2NoYW5nZQorICAgQGlucHV0OiAgSFRDSGFuZGxlIC0gSFRDIGhhbmRsZQorICAgICAgICAgICBFbmRwb2ludCAtIGVuZHBvaW50IGluIHdoaWNoIGFjdGl2aXR5IGhhcyBjaGFuZ2VkCisgICAgICAgICAgIEFjdGl2ZSAtIHRydWUgaWYgYWN0aXZlLCBmYWxzZSBpZiBpdCBoYXMgYmVjb21lIGluYWN0aXZlCisgICBAb3V0cHV0OgorICAgQHJldHVybjoKKyAgIEBub3RlczogIFRoaXMgdHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgY3JlZGl0IGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiB0bworICAgICAgICAgICByZS1hZGp1c3QgY3JlZGl0cyBmb3IgYWN0aXZlL2luYWN0aXZlIGVuZHBvaW50cy4KKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOgorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwordm9pZCBodGNfaW5kaWNhdGVfYWN0aXZpdHlfY2hhbmdlKEhUQ19IQU5ETEUgSFRDSGFuZGxlLAorCQkJCSAgSFRDX0VORFBPSU5UX0lEIEVuZHBvaW50LCBBX0JPT0wgQWN0aXZlKTsKKworLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworICAgQGRlc2M6IEdldCBlbmRwb2ludCBzdGF0aXN0aWNzCisgICBAZnVuY3Rpb24gbmFtZTogaHRjX2dldF9lbmRwb2ludF9zdGF0aXN0aWNzCisgICBAaW5wdXQ6ICBIVENIYW5kbGUgLSBIVEMgaGFuZGxlCisgICAgICAgICAgIEVuZHBvaW50IC0gRW5kcG9pbnQgaWRlbnRpZmllcgorICAgICAgICAgICBBY3Rpb24gLSBhY3Rpb24gdG8gdGFrZSB3aXRoIHN0YXRpc3RpY3MKKyAgIEBvdXRwdXQ6CisgICAgICAgICAgIHBTdGF0cyAtIHN0YXRpc3RpY3MgdGhhdCB3ZXJlIHNhbXBsZWQgKGNhbiBiZSBOVUxMIGlmIEFjdGlvbiBpcyBIVENfRVBfU1RBVF9DTEVBUikKKworICAgQHJldHVybjogdHJ1ZSBpZiBzdGF0aXN0aWNzIHByb2ZpbGluZyBpcyBlbmFibGVkLCBvdGhlcndpc2UgZmFsc2UuCisKKyAgIEBub3RlczogIFN0YXRpc3RpY3MgaXMgYSBjb21waWxlLXRpbWUgb3B0aW9uIGFuZCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gZmFsc2UKKyAgICAgICAgICAgaWYgSFRDIGlzIG5vdCBjb21waWxlZCB3aXRoIHByb2ZpbGluZy4KKworICAgICAgICAgICBUaGUgY2FsbGVyIGNhbiBzcGVjaWZ5IHRoZSBzdGF0aXN0aWMgImFjdGlvbiIgdG8gdGFrZSB3aGVuIHNhbXBsaW5nCisgICAgICAgICAgIHRoZSBzdGF0aXN0aWNzLiAgVGhpcyBpbmNsdWRlczoKKworICAgICAgICAgICBIVENfRVBfU1RBVF9TQU1QTEU6IFRoZSBwU3RhdHMgc3RydWN0dXJlIGlzIGZpbGxlZCB3aXRoIHRoZSBjdXJyZW50IHZhbHVlcy4KKyAgICAgICAgICAgSFRDX0VQX1NUQVRfU0FNUExFX0FORF9DTEVBUjogVGhlIHN0cnVjdHVyZSBpcyBmaWxsZWQgYW5kIHRoZSBjdXJyZW50IHN0YXRpc3RpY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGNsZWFyZWQuCisgICAgICAgICAgIEhUQ19FUF9TVEFUX0NMRUEgOiB0aGUgc3RhdGlzdGljcyBhcmUgY2xlYXJlZCwgdGhlIGNhbGxlZCBjYW4gcGFzcyBhIE5VTEwgdmFsdWUgZm9yCisgICAgICAgICAgICAgICAgICAgcFN0YXRzCisKKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOgorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLworQV9CT09MIGh0Y19nZXRfZW5kcG9pbnRfc3RhdGlzdGljcyhIVENfSEFORExFIEhUQ0hhbmRsZSwKKwkJCQkgICBIVENfRU5EUE9JTlRfSUQgRW5kcG9pbnQsCisJCQkJICAgSFRDX0VORFBPSU5UX1NUQVRfQUNUSU9OIEFjdGlvbiwKKwkJCQkgICBIVENfRU5EUE9JTlRfU1RBVFMgKnBTdGF0cyk7CisKKy8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyAgIEBkZXNjOiBVbmJsb2NrIEhUQyBtZXNzYWdlIHJlY2VwdGlvbgorICAgQGZ1bmN0aW9uIG5hbWU6IGh0Y191bmJsb2NrX3JlY3YKKyAgIEBpbnB1dDogIEhUQ0hhbmRsZSAtIEhUQyBoYW5kbGUKKyAgIEBvdXRwdXQ6CisgICBAcmV0dXJuOgorICAgQG5vdGVzOgorICAgICAgICAgICBIVEMgd2lsbCBibG9jayB0aGUgcmVjZWl2ZXIgaWYgdGhlIEVwUmVjdkFsbG9jIGNhbGxiYWNrIGZhaWxzIHRvIHByb3ZpZGUgYSBwYWNrZXQuCisgICAgICAgICAgIFRoZSBjYWxsZXIgY2FuIHVzZSB0aGlzIEFQSSB0byBpbmRpY2F0ZSB0byBIVEMgd2hlbiByZXNvdXJjZXMgKGJ1ZmZlcnMpIGFyZSBhdmFpbGFibGUKKyAgICAgICAgICAgc3VjaCB0aGF0IHRoZSAgcmVjZWl2ZXIgY2FuIGJlIHVuYmxvY2tlZCBhbmQgSFRDIG1heSByZS1hdHRlbXB0IGZldGNoaW5nIHRoZSBwZW5kaW5nIG1lc3NhZ2UuCisKKyAgICAgICAgICAgVGhpcyBBUEkgaXMgbm90IHJlcXVpcmVkIGlmIHRoZSB1c2VyIHVzZXMgdGhlIEVwUmVjdlJlZmlsbCBjYWxsYmFjayBvciB1c2VzIHRoZSBIVENBZGRSZWNlaXZlUGFja2V0KCkKKyAgICAgICAgICAgQVBJIHRvIHJlY3ljbGUgb3IgcHJvdmlkZSByZWNlaXZlIHBhY2tldHMgdG8gSFRDLgorCisgICBAZXhhbXBsZToKKyAgIEBzZWUgYWxzbzoKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KK3ZvaWQgaHRjX3VuYmxvY2tfcmVjdihIVENfSEFORExFIEhUQ0hhbmRsZSk7CisKKy8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyAgIEBkZXNjOiBzZW5kIGEgc2VyaWVzIG9mIEhUQyBwYWNrZXRzCisgICBAZnVuY3Rpb24gbmFtZTogaHRjX3NlbmRfcGt0c19tdWx0aXBsZQorICAgQGlucHV0OiAgSFRDSGFuZGxlIC0gSFRDIGhhbmRsZQorICAgICAgICAgICBwUGt0UXVldWUgLSBsb2NhbCBxdWV1ZSBob2xkaW5nIHBhY2tldHMgdG8gc2VuZAorICAgQG91dHB1dDoKKyAgIEByZXR1cm46IEFfT0sKKyAgIEBub3RlczogIENhbGxlciBtdXN0IGluaXRpYWxpemUgZWFjaCBwYWNrZXQgdXNpbmcgU0VUX0hUQ19QQUNLRVRfSU5GT19UWCgpIG1hY3JvLgorICAgICAgICAgICBUaGUgcXVldWUgbXVzdCBvbmx5IGNvbnRhaW4gcGFja2V0cyBkaXJlY3RlZCBhdCB0aGUgc2FtZSBlbmRwb2ludC4KKyAgICAgICAgICAgQ2FsbGVyIHN1cHBsaWVzIGEgcG9pbnRlciB0byBhbiBIVENfUEFDS0VUX1FVRVVFIHN0cnVjdHVyZSBob2xkaW5nIHRoZSBUWCBwYWNrZXRzIGluIEZJRk8gb3JkZXIuCisgICAgICAgICAgIFRoaXMgQVBJIHdpbGwgcmVtb3ZlIHRoZSBwYWNrZXRzIGZyb20gdGhlIHBrdCBxdWV1ZSBhbmQgcGxhY2UgdGhlbSBpbnRvIHRoZSBIVEMgVHggUXVldWUKKyAgICAgICAgICAgYW5kIGJ1bmRsZSBtZXNzYWdlcyB3aGVyZSBwb3NzaWJsZS4KKyAgICAgICAgICAgVGhlIGNhbGxlciBtYXkgYWxsb2NhdGUgdGhlIHBrdCBxdWV1ZSBvbiB0aGUgc3RhY2sgdG8gaG9sZCB0aGUgcGFja2V0cy4KKyAgICAgICAgICAgVGhpcyBpbnRlcmZhY2UgaXMgZnVsbHkgYXN5bmNocm9ub3VzLiAgT24gZXJyb3IsIGh0Y19zZW5kX3BrdHMgd2lsbAorICAgICAgICAgICBjYWxsIHRoZSByZWdpc3RlcmVkIEVuZHBvaW50IGNhbGxiYWNrIHRvIGNsZWFudXAgdGhlIHBhY2tldC4KKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOiBodGNfZmx1c2hfZW5kcG9pbnQKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KK0FfU1RBVFVTIGh0Y19zZW5kX3BrdHNfbXVsdGlwbGUoSFRDX0hBTkRMRSBIVENIYW5kbGUsCisJCQkJSFRDX1BBQ0tFVF9RVUVVRSAqcFBrdFF1ZXVlKTsKKworLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworICAgQGRlc2M6IEFkZCBtdWx0aXBsZSByZWNlaXZlIHBhY2tldHMgdG8gSFRDCisgICBAZnVuY3Rpb24gbmFtZTogaHRjX2FkZF9yZWNlaXZlX3BrdF9tdWx0aXBsZQorICAgQGlucHV0OiAgSFRDSGFuZGxlIC0gSFRDIGhhbmRsZQorICAgICAgICAgICBwUGt0UXVldWUgLSBIVEMgcmVjZWl2ZSBwYWNrZXQgcXVldWUgaG9sZGluZyBwYWNrZXRzIHRvIGFkZAorICAgQG91dHB1dDoKKyAgIEByZXR1cm46IEFfT0sgb24gc3VjY2VzcworICAgQG5vdGVzOiAgdXNlciBtdXN0IHN1cHBseSBIVEMgcGFja2V0cyBmb3IgY2FwdHVyaW5nIGluY29tbWluZyBIVEMgZnJhbWVzLiAgVGhlIGNhbGxlcgorICAgICAgICAgICBtdXN0IGluaXRpYWxpemUgZWFjaCBIVEMgcGFja2V0IHVzaW5nIHRoZSBTRVRfSFRDX1BBQ0tFVF9JTkZPX1JYX1JFRklMTCgpCisgICAgICAgICAgIG1hY3JvLiBUaGUgcXVldWUgbXVzdCBvbmx5IGNvbnRhaW4gcmVjdiBwYWNrZXRzIGZvciB0aGUgc2FtZSBlbmRwb2ludC4KKyAgICAgICAgICAgQ2FsbGVyIHN1cHBsaWVzIGEgcG9pbnRlciB0byBhbiBIVENfUEFDS0VUX1FVRVVFIHN0cnVjdHVyZSBob2xkaW5nIHRoZSByZWN2IHBhY2tldC4KKyAgICAgICAgICAgVGhpcyBBUEkgd2lsbCByZW1vdmUgdGhlIHBhY2tldHMgZnJvbSB0aGUgcGt0IHF1ZXVlIGFuZCBwbGFjZSB0aGVtIGludG8gaW50ZXJuYWwKKyAgICAgICAgICAgcmVjdiBwYWNrZXQgbGlzdC4KKyAgICAgICAgICAgVGhlIGNhbGxlciBtYXkgYWxsb2NhdGUgdGhlIHBrdCBxdWV1ZSBvbiB0aGUgc3RhY2sgdG8gaG9sZCB0aGUgcGFja2V0cy4KKyAgIEBleGFtcGxlOgorICAgQHNlZSBhbHNvOgorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLworQV9TVEFUVVMgaHRjX2FkZF9yZWNlaXZlX3BrdF9tdWx0aXBsZShIVENfSEFORExFIEhUQ0hhbmRsZSwKKwkJCQkgICAgICBIVENfUEFDS0VUX1FVRVVFICpwUGt0UXVldWUpOworCisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgICBAZGVzYzogQ2hlY2sgaWYgYW4gZW5kcG9pbnQgaXMgbWFya2VkIGFjdGl2ZQorICAgQGZ1bmN0aW9uIG5hbWU6IGh0Y19pc19lbmRwb2ludF9hY3RpdmUKKyAgIEBpbnB1dDogIEhUQ0hhbmRsZSAtIEhUQyBoYW5kbGUKKyAgICAgICAgICAgRW5kcG9pbnQgLSBlbmRwb2ludCB0byBjaGVjayBmb3IgYWN0aXZlIHN0YXRlCisgICBAb3V0cHV0OgorICAgQHJldHVybjogcmV0dXJucyB0cnVlIGlmIEVuZHBvaW50IGlzIEFjdGl2ZQorICAgQG5vdGVzOgorICAgQGV4YW1wbGU6CisgICBAc2VlIGFsc286CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCitBX0JPT0wgaHRjX2lzX2VuZHBvaW50X2FjdGl2ZShIVENfSEFORExFIEhUQ0hhbmRsZSwKKwkJCSAgICAgIEhUQ19FTkRQT0lOVF9JRCBFbmRwb2ludCk7CisKKy8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyAgIEBkZXNjOiBHZXQgdGhlIG51bWJlciBvZiByZWN2IGJ1ZmZlcnMgY3VycmVudGx5IHF1ZXVlZCBpbnRvIGFuIEhUQyBlbmRwb2ludAorICAgQGZ1bmN0aW9uIG5hbWU6IGh0Y19nZXRfbnVtX3JlY3ZfYnVmZmVycworICAgQGlucHV0OiAgSFRDSGFuZGxlIC0gSFRDIGhhbmRsZQorICAgICAgICAgICBFbmRwb2ludCAtIGVuZHBvaW50IHRvIGNoZWNrCisgICBAb3V0cHV0OgorICAgQHJldHVybjogcmV0dXJucyBudW1iZXIgb2YgYnVmZmVycyBpbiBxdWV1ZQorICAgQG5vdGVzOgorICAgQGV4YW1wbGU6CisgICBAc2VlIGFsc286CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCitpbnQgaHRjX2dldF9udW1fcmVjdl9idWZmZXJzKEhUQ19IQU5ETEUgSFRDSGFuZGxlLAorCQkJICAgICBIVENfRU5EUE9JTlRfSUQgRW5kcG9pbnQpOworCisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgICBAZGVzYzogU2V0IHRoZSB0YXJnZXQgZmFpbHVyZSBoYW5kbGluZyBjYWxsYmFjayBpbiBIVEMgbGF5ZXIKKyAgIEBmdW5jdGlvbiBuYW1lOiBodGNfc2V0X3RhcmdldF9mYWlsdXJlX2NhbGxiYWNrCisgICBAaW5wdXQ6ICBIVENIYW5kbGUgLSBIVEMgaGFuZGxlCisgICAgICAgICAgIENhbGxiYWNrIC0gdGFyZ2V0IGZhaWx1cmUgaGFuZGxpbmcgY2FsbGJhY2sKKyAgIEBvdXRwdXQ6CisgICBAcmV0dXJuOgorICAgQG5vdGVzOgorICAgQGV4YW1wbGU6CisgICBAc2VlIGFsc286CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCit2b2lkIGh0Y19zZXRfdGFyZ2V0X2ZhaWx1cmVfY2FsbGJhY2soSFRDX0hBTkRMRSBIVENIYW5kbGUsCisJCQkJICAgICBIVENfVEFSR0VUX0ZBSUxVUkUgQ2FsbGJhY2spOworCisvKiBpbnRlcm5hbGx5IHVzZWQgZnVuY3Rpb25zIGZvciB0ZXN0aW5nLi4uICovCit2b2lkIGh0Y19lbmFibGVfcmVjdihIVENfSEFORExFIEhUQ0hhbmRsZSk7Cit2b2lkIGh0Y19kaXNhYmxlX3JlY3YoSFRDX0hBTkRMRSBIVENIYW5kbGUpOworQV9TVEFUVVMgSFRDV2FpdEZvclBlbmRpbmdSZWN2KEhUQ19IQU5ETEUgSFRDSGFuZGxlLAorCQkJICAgICAgIEFfVUlOVDMyIFRpbWVvdXRJbk1zLAorCQkJICAgICAgIEFfQk9PTCAqcGJJc1JlY3ZQZW5kaW5nKTsKKworLyogZnVuY3Rpb24gdG8gZmV0Y2ggc3RhdHMgZnJvbSBodGMgbGF5ZXIqLworc3RydWN0IG9sX2F0aF9odGNfc3RhdHMgKmllZWU4MDIxMV9pb2N0bF9nZXRfaHRjX3N0YXRzKEhUQ19IQU5ETEUKKwkJCQkJCSAgICAgICBIVENIYW5kbGUpOworCisjaWZkZWYgIEhJRl9VU0IKKyNkZWZpbmUgSFRDUmV0dXJuUmVjZWl2ZVBrdCh0YXJnZXQscCxvc2J1ZikJCSAgICAgIFwKKwlBX05FVEJVRl9GUkVFKG9zYnVmKTsJCQkJCSAgXAorCWlmKHAtPlN0YXR1cyA9PSBBX0NMT05FKSB7CQkJCSAgXAorCQljZGZfbWVtX2ZyZWUocCk7CQkJCQkgICAgXAorCX0KKyNlbHNlCisjZGVmaW5lIEhUQ1JldHVyblJlY2VpdmVQa3QodGFyZ2V0LHAsb3NidWYpICAgICBodGNfYWRkX3JlY2VpdmVfcGt0KHRhcmdldCxwKQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRkFTVFBBVEgKKyNkZWZpbmUgSFRDX1RYX0RFU0NfRklMTChfaHRjX3R4X2Rlc2MsIF9kb3dubG9hZF9sZW4sIF9lcF9pZCwgX3NlcV9ubykJXAorZG8gewkJCQkJCQkJCVwKKwkJSFRDX1dSSVRFMzIoKF9odGNfdHhfZGVzYyksCQkJCVwKKwkJCVNNKChfZG93bmxvYWRfbGVuKSwgSFRDX0ZSQU1FX0hEUl9QQVlMT0FETEVOKSB8CVwKKwkJCVNNKChfZXBfaWQpLCBIVENfRlJBTUVfSERSX0VORFBPSU5USUQpKTsJXAorCQkJCQkJCQkJXAorCQlIVENfV1JJVEUzMigoQV9VSU5UMzIgKikoX2h0Y190eF9kZXNjKSArIDEsCQlcCisJCQkJU00oKF9zZXFfbm8pLCBIVENfRlJBTUVfSERSX0NPTlRST0xCWVRFUzEpKTtcCit9IHdoaWxlICgwKQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9GQVNUUEFUSCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgordm9pZCBodGNfZ2V0X2NvbnRyb2xfZW5kcG9pbnRfdHhfaG9zdF9jcmVkaXRzKEhUQ19IQU5ETEUgSFRDSGFuZGxlLCBpbnQgKmNyZWRpdCk7Cit2b2lkIGh0Y19kdW1wX2NvdW50ZXJfaW5mbyhIVENfSEFORExFIEhUQ0hhbmRsZSk7Cit2b2lkICpodGNfZ2V0X3RhcmdldGRlZihIVENfSEFORExFIGh0Y19oYW5kbGUpOwordm9pZCBodGNfc2V0X3RhcmdldF90b19zbGVlcCh2b2lkICpjb250ZXh0KTsKK3ZvaWQgaHRjX2NhbmNlbF9kZWZlcnJlZF90YXJnZXRfc2xlZXAodm9pZCAqY29udGV4dCk7CisKKy8qIERpc2FibGUgQVNQTSA6IERpc2FibGUgUENJZSBsb3cgcG93ZXIgKi8KK3ZvaWQgaHRjX2Rpc2FibGVfYXNwbSh2b2lkKTsKKworI2lmZGVmIElQQV9PRkZMT0FECit2b2lkIGh0Y19pcGFfZ2V0X2NlX3Jlc291cmNlKEhUQ19IQU5ETEUgaHRjX2hhbmRsZSwKKwkJCSAgICAgdWludDMyX3QgKmNlX3NyX2Jhc2VfcGFkZHIsCisJCQkgICAgIHVpbnQzMl90ICpjZV9zcl9yaW5nX3NpemUsCisJCQkgICAgIGNkZl9kbWFfYWRkcl90ICpjZV9yZWdfcGFkZHIpOworI2Vsc2UKKyNkZWZpbmUgaHRjX2lwYV9nZXRfY2VfcmVzb3VyY2UoaHRjX2hhbmRsZSwgICAgICAgICAgICAgICAgXAorCQkJY2Vfc3JfYmFzZV9wYWRkciwgICAgICAgICAgICAgICAgICBcCisJCQljZV9zcl9yaW5nX3NpemUsICAgICAgICAgICAgICAgICAgIFwKKwkJCWNlX3JlZ19wYWRkcikgICAgICAgICAgICAgICAgICAgICAgLyogTk8tT1AgKi8KKyNlbmRpZiAvKiBJUEFfT0ZGTE9BRCAqLworI2VuZGlmIC8qIF9IVENfQVBJX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2h0Yy9odGNfZGVidWcuaCBiL2NvcmUvaHRjL2h0Y19kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMGM4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2h0Yy9odGNfZGVidWcuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIEhUQ19ERUJVR19IXworI2RlZmluZSBIVENfREVCVUdfSF8KKworI2RlZmluZSBBVEhfTU9EVUxFX05BTUUgaHRjCisjaW5jbHVkZSAiYV9kZWJ1Zy5oIgorI2luY2x1ZGUgImNkZl90cmFjZS5oIgorCisvKiAtLS0tLS0tIERlYnVnIHJlbGF0ZWQgc3R1ZmYgLS0tLS0tLSAqLworCisjZGVmaW5lICBBVEhfREVCVUdfU0VORCBBVEhfREVCVUdfTUFLRV9NT0RVTEVfTUFTSygwKQorI2RlZmluZSAgQVRIX0RFQlVHX1JFQ1YgQVRIX0RFQlVHX01BS0VfTU9EVUxFX01BU0soMSkKKyNkZWZpbmUgIEFUSF9ERUJVR19TWU5DIEFUSF9ERUJVR19NQUtFX01PRFVMRV9NQVNLKDIpCisjZGVmaW5lICBBVEhfREVCVUdfRFVNUCBBVEhfREVCVUdfTUFLRV9NT0RVTEVfTUFTSygzKQorI2RlZmluZSAgQVRIX0RFQlVHX1NFVFVQICBBVEhfREVCVUdfTUFLRV9NT0RVTEVfTUFTSyg0KQorI2RlZmluZSBIVENfRVJST1IoYXJncyAuLi4pIFwKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IVEMsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIyMgYXJncykKKyNkZWZpbmUgSFRDX1dBUk4oYXJncyAuLi4pIFwKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IVEMsIENERl9UUkFDRV9MRVZFTF9XQVJOLCAjIyBhcmdzKQorI2RlZmluZSBIVENfSU5GTyhhcmdzIC4uLikgXAorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hUQywgQ0RGX1RSQUNFX0xFVkVMX0lORk8sICMjIGFyZ3MpCisjZGVmaW5lIEhUQ19UUkFDRShhcmdzIC4uLikgXAorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hUQywgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCAjIyBhcmdzKQorI2VuZGlmIC8qSFRDX0RFQlVHX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2h0Yy9odGNfaW50ZXJuYWwuaCBiL2NvcmUvaHRjL2h0Y19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDhiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2h0Yy9odGNfaW50ZXJuYWwuaApAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfSFRDX0lOVEVSTkFMX0hfCisjZGVmaW5lIF9IVENfSU5URVJOQUxfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSA8YXRoZGVmcy5oPgorI2luY2x1ZGUgImFfdHlwZXMuaCIKKyNpbmNsdWRlICJvc2FwaV9saW51eC5oIgorI2luY2x1ZGUgPGNkZl9uYnVmLmg+CisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8Y2RmX2xvY2suaD4KKyNpbmNsdWRlIDxjZGZfc29mdGlycV90aW1lci5oPgorI2luY2x1ZGUgPGNkZl9hdG9taWMuaD4KKyNpbmNsdWRlICJoaWYuaCIKKyNpbmNsdWRlIDxodGMuaD4KKyNpbmNsdWRlICJodGNfYXBpLmgiCisjaW5jbHVkZSAiaHRjX3BhY2tldC5oIgorCisvKiBIVEMgb3BlcmF0aW9uYWwgcGFyYW1ldGVycyAqLworI2RlZmluZSBIVENfVEFSR0VUX1JFU1BPTlNFX1RJTUVPVVQgICAgICAgICAyMDAwICAgICAgICAvKiBpbiBtcyAqLworI2RlZmluZSBIVENfVEFSR0VUX0RFQlVHX0lOVFJfTUFTSyAgICAgICAgICAweDAxCisjZGVmaW5lIEhUQ19UQVJHRVRfQ1JFRElUX0lOVFJfTUFTSyAgICAgICAgIDB4RjAKKyNkZWZpbmUgSFRDX01JTl9NU0dfUEVSX0JVTkRMRSAgICAgICAgICAgICAgMgorI2lmIGRlZmluZWQoSElGX1VTQikKKyNkZWZpbmUgSFRDX01BWF9NU0dfUEVSX0JVTkRMRSAgICAgICAgICAgICAgOQorI2Vsc2UKKyNkZWZpbmUgSFRDX01BWF9NU0dfUEVSX0JVTkRMRSAgICAgICAgICAgICAgMTYKKyNlbmRpZgorLyoKKyAqIEhUQ19NQVhfVFhfQlVORExFX1NFTkRfTElNSVQgLQorICogVGhpcyB2YWx1ZSBpcyBpbiB1bml0cyBvZiB0eCBmcmFtZSBmcmFnbWVudHMuCisgKiBJdCBuZWVkcyB0byBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdHggZnJhbWVzIGluIGEKKyAqIEhUQyBkb3dubG9hZCBidW5kbGUgdGltZXMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGZyYWdtZW50cyBpbiBlYWNoIHN1Y2ggZnJhbWUKKyAqIChJbiBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLCBzdWNoIGFzIExpbnV4LCB3ZSBleHBlY3QgdG8gb25seSBoYXZlCisgKiBhIHNpbmdsZSBmcmFnbWVudCBwZXIgZnJhbWUgYW55d2F5LikKKyAqLworI2RlZmluZSBIVENfTUFYX1RYX0JVTkRMRV9TRU5EX0xJTUlUICAgICAgICAyNTUKKworI2RlZmluZSBIVENfUEFDS0VUX0NPTlRBSU5FUl9BTExPQ0FUSU9OICAgICAzMgorI2RlZmluZSBOVU1fQ09OVFJPTF9UWF9CVUZGRVJTICAgICAgICAgICAgICAyCisjZGVmaW5lIEhUQ19DT05UUk9MX0JVRkZFUl9TSVpFICAgICAgICAgICAgIChIVENfTUFYX0NPTlRST0xfTUVTU0FHRV9MRU5HVEggKyBIVENfSERSX0xFTkdUSCkKKyNkZWZpbmUgSFRDX0NPTlRST0xfQlVGRkVSX0FMSUdOICAgICAgICAgICAgMzIKKyNkZWZpbmUgSFRDX1RBUkdFVF9SRVNQT05TRV9QT0xMX01TICAgICAgICAgMTAKKyNpZiAhZGVmaW5lZChBX1NJTU9TX0RFVkhPU1QpCisjZGVmaW5lIEhUQ19UQVJHRVRfTUFYX1JFU1BPTlNFX1BPTEwgICAgICAgIDIwMCAvKiBhY3R1YWwgSFcgKi8KKyNlbHNlCisjZGVmaW5lIEhUQ19UQVJHRVRfTUFYX1JFU1BPTlNFX1BPTEwgICAgICAgIDYwMCAvKiBob3N0ICsgdGFyZ2V0IHNpbXVsYXRpb24gKi8KKyNlbmRpZgorCisjZGVmaW5lIEhUQ19TRVJWSUNFX1RYX1BBQ0tFVF9UQUcgIEhUQ19UWF9QQUNLRVRfVEFHX0lOVEVSTkFMCisKKyNkZWZpbmUgSFRDX0NSRURJVF9ISVNUT1JZX01BWCAgICAgICAgICAgICAgMTAyNAorCit0eXBlZGVmIGVudW0geworCUhUQ19SRVFVRVNUX0NSRURJVCwKKwlIVENfUFJPQ0VTU19DUkVESVRfUkVQT1JULAorCUhUQ19TVVNQRU5EX0FDSywKKwlIVENfU1VTUEVORF9OQUNLLAorfSBodGNfY3JlZGl0X2V4Y2hhbmdlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlodGNfY3JlZGl0X2V4Y2hhbmdlX3R5cGUgdHlwZTsKKwl1aW50NjRfdCB0aW1lOworCXVpbnQzMl90IHR4X2NyZWRpdDsKKwl1aW50MzJfdCBodGNfdHhfcXVldWVfZGVwdGg7Cit9IEhUQ19DUkVESVRfSElTVE9SWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0hUQ19FTkRQT0lOVCB7CisJSFRDX0VORFBPSU5UX0lEIElkOworCUhUQ19TRVJWSUNFX0lEIFNlcnZpY2VJRDsgICAgICAgICAgICAgICAvKiBzZXJ2aWNlIElEIHRoaXMgZW5kcG9pbnQgaXMgYm91bmQgdG8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLXplcm8gdmFsdWUgbWVhbnMgdGhpcyBlbmRwb2ludCBpcyBpbiB1c2UgKi8KKwlIVENfRVBfQ0FMTEJBQ0tTIEVwQ2FsbEJhY2tzOyAgICAgICAgICAgLyogY2FsbGJhY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVuZHBvaW50ICovCisJSFRDX1BBQ0tFVF9RVUVVRSBUeFF1ZXVlOyAgICAgICAgICAgICAgIC8qIEhUQyBmcmFtZSBidWZmZXIgVFggcXVldWUgKi8KKwlpbnQgTWF4VHhRdWV1ZURlcHRoOyAgICAgICAgICAgIC8qIG1heCBkZXB0aCBvZiB0aGUgVFggcXVldWUgYmVmb3JlIHdlIG5lZWQgdG8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgZHJpdmVyJ3MgZnVsbCBoYW5kbGVyICovCisJaW50IE1heE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAvKiBtYXggbGVuZ3RoIG9mIGVuZHBvaW50IG1lc3NhZ2UgKi8KKwl1aW50OF90IFVMX1BpcGVJRDsKKwl1aW50OF90IERMX1BpcGVJRDsKKwlpbnQgdWxfaXNfcG9sbGVkOyAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gY2FsbCBISUYgdG8gZ2V0IHR4IGNvbXBsZXRpb24gY2FsbGJhY2tzPyAqLworCWNkZl9zb2Z0aXJxX3RpbWVyX3QgdWxfcG9sbF90aW1lcjsKKwlpbnQgdWxfcG9sbF90aW1lcl9hY3RpdmU7CisJaW50IHVsX291dHN0YW5kaW5nX2NudDsKKwlpbnQgZGxfaXNfcG9sbGVkOyAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gY2FsbCBISUYgdG8gZmV0Y2ggcng/ICAoTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuKSAqLworI2lmIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLworCWNkZl9zb2Z0aXJxX3RpbWVyX3QgZGxfcG9sbF90aW1lcjsKKyNlbmRpZgorCisJSFRDX1BBQ0tFVF9RVUVVRSBUeExvb2t1cFF1ZXVlOyAgICAgICAgIC8qIGxvb2t1cCBxdWV1ZSB0byBtYXRjaCBuZXRidWZzIHRvIGh0YyBwYWNrZXRzICovCisJSFRDX1BBQ0tFVF9RVUVVRSBSeEJ1ZmZlckhvbGRRdWV1ZTsgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IGhvbGQgcXVldWUgZm9yIGJhY2sgY29tcGF0aWJpbGl0eSAqLworCUFfVUlOVDggU2VxTm87ICAgICAgICAgIC8qIFRYIHNlcSBubyAoaGVscGZ1bCkgZm9yIGRlYnVnZ2luZyAqLworCWNkZl9hdG9taWNfdCBUeFByb2Nlc3NDb3VudDsgICAgICAgICAgICAvKiBzZXJpYWxpemF0aW9uICovCisJc3RydWN0IF9IVENfVEFSR0VUICp0YXJnZXQ7CisJaW50IFR4Q3JlZGl0czsgICAgICAgICAgLyogVFggY3JlZGl0cyBhdmFpbGFibGUgb24gdGhpcyBlbmRwb2ludCAqLworCWludCBUeENyZWRpdFNpemU7ICAgICAgICAgICAgICAgLyogc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGNyZWRpdCAoc2V0IGJ5IEhUQykgKi8KKwlpbnQgVHhDcmVkaXRzUGVyTWF4TXNnOyAgICAgICAgIC8qIGNyZWRpdHMgcmVxdWlyZWQgcGVyIG1heCBtZXNzYWdlIChwcmVjYWxjdWxhdGVkKSAqLworI2lmZGVmIEhUQ19FUF9TVEFUX1BST0ZJTElORworCUhUQ19FTkRQT0lOVF9TVEFUUyBFbmRQb2ludFN0YXRzOyAgICAgICAgICAgICAgIC8qIGVuZHBvaW50IHN0YXRpc3RpY3MgKi8KKyNlbmRpZgorCUFfQk9PTCBUeENyZWRpdEZsb3dFbmFibGVkOworfSBIVENfRU5EUE9JTlQ7CisKKyNpZmRlZiBIVENfRVBfU1RBVF9QUk9GSUxJTkcKKyNkZWZpbmUgSU5DX0hUQ19FUF9TVEFUKHAsc3RhdCxjb3VudCkgKHApLT5FbmRQb2ludFN0YXRzLnN0YXQgKz0gKGNvdW50KTsKKyNlbHNlCisjZGVmaW5lIElOQ19IVENfRVBfU1RBVChwLHN0YXQsY291bnQpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDE2IFNlcnZpY2VJRDsKKwlBX1VJTlQ4IENyZWRpdEFsbG9jYXRpb247Cit9IEhUQ19TRVJWSUNFX1RYX0NSRURJVF9BTExPQ0FUSU9OOworCisjZGVmaW5lIEhUQ19NQVhfU0VSVklDRV9BTExPQ19FTlRSSUVTIDgKKworLyogRXJyb3IgY29kZXMgZm9yIEhUQyBsYXllciBwYWNrZXQgc3RhdHMqLworZW51bSBvbF9hdGhfaHRjX3BrdF9lY29kZXMgeworCUdFVF9IVENfUEtUX1FfRkFJTCA9IDAsICAgICAgICAgLyogZXJyb3ItIGdldCBwYWNrZXQgYXQgaGVhZCBvZiBIVENfUEFDS0VUX1EgKi8KKwlIVENfUEtUX1FfRU1QVFksCisJSFRDX1NFTkRfUV9FTVBUWQorfTsKKy8qIG91ciBIVEMgdGFyZ2V0IHN0YXRlICovCit0eXBlZGVmIHN0cnVjdCBfSFRDX1RBUkdFVCB7CisJc3RydWN0IG9sX3NvZnRjICpoaWZfZGV2OworCUhUQ19FTkRQT0lOVCBFbmRQb2ludFtFTkRQT0lOVF9NQVhdOworCWNkZl9zcGlubG9ja190IEhUQ0xvY2s7CisJY2RmX3NwaW5sb2NrX3QgSFRDUnhMb2NrOworCWNkZl9zcGlubG9ja190IEhUQ1R4TG9jazsKKwljZGZfc3BpbmxvY2tfdCBIVENDcmVkaXRMb2NrOworCUFfVUlOVDMyIEhUQ1N0YXRlRmxhZ3M7CisJdm9pZCAqaG9zdF9oYW5kbGU7CisJSFRDX0lOSVRfSU5GTyBIVENJbml0SW5mbzsKKwlIVENfUEFDS0VUICpwSFRDUGFja2V0U3RydWN0UG9vbDsgICAgICAgICAgICAgICAvKiBwb29sIG9mIEhUQyBwYWNrZXRzICovCisJSFRDX1BBQ0tFVF9RVUVVRSBDb250cm9sQnVmZmVyVFhGcmVlTGlzdDsKKwlBX1VJTlQ4IEN0cmxSZXNwb25zZUJ1ZmZlcltIVENfTUFYX0NPTlRST0xfTUVTU0FHRV9MRU5HVEhdOworCWludCBDdHJsUmVzcG9uc2VMZW5ndGg7CisJY2RmX3NlbWFwaG9yZV90IEN0cmxSZXNwb25zZVZhbGlkOworCUFfQk9PTCBDdHJsUmVzcG9uc2VQcm9jZXNzaW5nOworCWludCBUb3RhbFRyYW5zbWl0Q3JlZGl0czsKKwlIVENfU0VSVklDRV9UWF9DUkVESVRfQUxMT0NBVElPTgorCQlTZXJ2aWNlVHhBbGxvY1RhYmxlW0hUQ19NQVhfU0VSVklDRV9BTExPQ19FTlRSSUVTXTsKKwlpbnQgVGFyZ2V0Q3JlZGl0U2l6ZTsKKyNpZmRlZiBSWF9TR19TVVBQT1JUCisJY2RmX25idWZfcXVldWVfdCBSeFNnUXVldWU7CisJQV9CT09MIElzUnhTZ0lucHJvZ3Jlc3M7CisJQV9VSU5UMzIgQ3VyUnhTZ1RvdGFsTGVuOyAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdG90YWwgbGVuZ3RoICovCisJQV9VSU5UMzIgRXhwUnhTZ1RvdGFsTGVuOyAgICAgICAgICAgICAgIC8qIGV4cGVjdGVkIHRvdGFsIGxlbmd0aCAqLworI2VuZGlmCisJY2RmX2RldmljZV90IG9zZGV2OworCXN0cnVjdCBvbF9hdGhfaHRjX3N0YXRzIGh0Y19wa3Rfc3RhdHM7CisJSFRDX1BBQ0tFVCAqcEJ1bmRsZUZyZWVMaXN0OworCUFfVUlOVDMyIGNlX3NlbmRfY250OworCUFfVUlOVDMyIFRYX2NvbXBfY250OworCUFfVUlOVDggTWF4TXNnc1BlckhUQ0J1bmRsZTsKK30gSFRDX1RBUkdFVDsKKworI2RlZmluZSBIVENfRU5BQkxFX0JVTkRMRSh0YXJnZXQpICh0YXJnZXQtPk1heE1zZ3NQZXJIVENCdW5kbGUgPiAxKQorI2lmZGVmIFJYX1NHX1NVUFBPUlQKKyNkZWZpbmUgUkVTRVRfUlhfU0dfQ09ORklHKF90YXJnZXQpIFwKKwlfdGFyZ2V0LT5FeHBSeFNnVG90YWxMZW4gPSAwOyBcCisJX3RhcmdldC0+Q3VyUnhTZ1RvdGFsTGVuID0gMDsgXAorCV90YXJnZXQtPklzUnhTZ0lucHJvZ3Jlc3MgPSBmYWxzZTsKKyNlbmRpZgorCisjZGVmaW5lIEhUQ19TVEFURV9TVE9QUElORyAgICAgICgxIDw8IDApCisjZGVmaW5lIEhUQ19TVE9QUElORyh0KSAgICAgICAgICgodCktPkhUQ1N0YXRlRmxhZ3MgJiBIVENfU1RBVEVfU1RPUFBJTkcpCisjZGVmaW5lIExPQ0tfSFRDKHQpICAgICAgICAgICAgIGNkZl9zcGluX2xvY2tfYmgoJih0KS0+SFRDTG9jayk7CisjZGVmaW5lIFVOTE9DS19IVEModCkgICAgICAgICAgIGNkZl9zcGluX3VubG9ja19iaCgmKHQpLT5IVENMb2NrKTsKKyNkZWZpbmUgTE9DS19IVENfUlgodCkgICAgICAgICAgY2RmX3NwaW5fbG9ja19iaCgmKHQpLT5IVENSeExvY2spOworI2RlZmluZSBVTkxPQ0tfSFRDX1JYKHQpICAgICAgICBjZGZfc3Bpbl91bmxvY2tfYmgoJih0KS0+SFRDUnhMb2NrKTsKKyNkZWZpbmUgTE9DS19IVENfVFgodCkgICAgICAgICAgY2RmX3NwaW5fbG9ja19iaCgmKHQpLT5IVENUeExvY2spOworI2RlZmluZSBVTkxPQ0tfSFRDX1RYKHQpICAgICAgICBjZGZfc3Bpbl91bmxvY2tfYmgoJih0KS0+SFRDVHhMb2NrKTsKKyNkZWZpbmUgTE9DS19IVENfQ1JFRElUKHQpICAgICAgY2RmX3NwaW5fbG9ja19iaCgmKHQpLT5IVENDcmVkaXRMb2NrKTsKKyNkZWZpbmUgVU5MT0NLX0hUQ19DUkVESVQodCkgICAgY2RmX3NwaW5fdW5sb2NrX2JoKCYodCktPkhUQ0NyZWRpdExvY2spOworCisjZGVmaW5lIEdFVF9IVENfVEFSR0VUX0ZST01fSEFORExFKGhuZCkgKChIVENfVEFSR0VUICopKGhuZCkpCisKKyNkZWZpbmUgSVNfVFhfQ1JFRElUX0ZMT1dfRU5BQkxFRChlcCkgICgoZXApLT5UeENyZWRpdEZsb3dFbmFibGVkKQorCisjZGVmaW5lIEhUQ19QT0xMX0NMRUFOVVBfUEVSSU9EX01TIDEwICAgLyogbWlsbGlzZWNvbmRzICovCisKKy8qIE1hY3JvIHRvIEluY3JlbWVudCB0aGUgIEhUQ19QQUNLRVRfRVJST1JTIGZvciBUeC4qLworI2RlZmluZSBPTF9BVEhfSFRDX1BLVF9FUlJPUl9DT1VOVF9JTkNSKF90YXJnZXQsX2Vjb2RlKQlcCisJZG8geyBcCisJCWlmKF9lY29kZT09R0VUX0hUQ19QS1RfUV9GQUlMKSAoX3RhcmdldC0+aHRjX3BrdF9zdGF0cy5odGNfZ2V0X3BrdF9xX2ZhaWxfY291bnQpKz0xOyBcCisJCWlmKF9lY29kZT09SFRDX1BLVF9RX0VNUFRZKSAoX3RhcmdldC0+aHRjX3BrdF9zdGF0cy5odGNfcGt0X3FfZW1wdHlfY291bnQpKz0xOyBcCisJCWlmKF9lY29kZT09SFRDX1NFTkRfUV9FTVBUWSkgKF90YXJnZXQtPmh0Y19wa3Rfc3RhdHMuaHRjX3NlbmRfcV9lbXB0eV9jb3VudCkrPTE7IFwKKwl9IHdoaWxlKDApOworLyogaW50ZXJuYWwgSFRDIGZ1bmN0aW9ucyAqLworCitDREZfU1RBVFVTIGh0Y19yeF9jb21wbGV0aW9uX2hhbmRsZXIodm9pZCAqQ29udGV4dCwgY2RmX25idWZfdCBuZXRidWYsCisJCQkJICAgdWludDhfdCBwaXBlSUQpOworQ0RGX1NUQVRVUyBodGNfdHhfY29tcGxldGlvbl9oYW5kbGVyKHZvaWQgKkNvbnRleHQsIGNkZl9uYnVmX3QgbmV0YnVmLAorCQkJCSAgIHVuc2lnbmVkIGludCB0cmFuc2ZlcklELCB1aW50MzJfdCB0b2VwbGl0el9oYXNoX3Jlc3VsdCk7CisKK0hUQ19QQUNLRVQgKmFsbG9jYXRlX2h0Y19idW5kbGVfcGFja2V0KEhUQ19UQVJHRVQgKnRhcmdldCk7Cit2b2lkIGZyZWVfaHRjX2J1bmRsZV9wYWNrZXQoSFRDX1RBUkdFVCAqdGFyZ2V0LCBIVENfUEFDS0VUICpwUGFja2V0KTsKKworSFRDX1BBQ0tFVCAqYWxsb2NhdGVfaHRjX3BhY2tldF9jb250YWluZXIoSFRDX1RBUkdFVCAqdGFyZ2V0KTsKK3ZvaWQgZnJlZV9odGNfcGFja2V0X2NvbnRhaW5lcihIVENfVEFSR0VUICp0YXJnZXQsIEhUQ19QQUNLRVQgKnBQYWNrZXQpOwordm9pZCBodGNfZmx1c2hfcnhfaG9sZF9xdWV1ZShIVENfVEFSR0VUICp0YXJnZXQsIEhUQ19FTkRQT0lOVCAqcEVuZHBvaW50KTsKK3ZvaWQgaHRjX2ZsdXNoX2VuZHBvaW50X3R4KEhUQ19UQVJHRVQgKnRhcmdldCwgSFRDX0VORFBPSU5UICpwRW5kcG9pbnQsCisJCQkgICBIVENfVFhfVEFHIFRhZyk7Cit2b2lkIGh0Y19yZWN2X2luaXQoSFRDX1RBUkdFVCAqdGFyZ2V0KTsKK0FfU1RBVFVTIGh0Y193YWl0X3JlY3ZfY3RybF9tZXNzYWdlKEhUQ19UQVJHRVQgKnRhcmdldCk7Cit2b2lkIGh0Y19mcmVlX2NvbnRyb2xfdHhfcGFja2V0KEhUQ19UQVJHRVQgKnRhcmdldCwgSFRDX1BBQ0tFVCAqcFBhY2tldCk7CitIVENfUEFDS0VUICpodGNfYWxsb2NfY29udHJvbF90eF9wYWNrZXQoSFRDX1RBUkdFVCAqdGFyZ2V0KTsKK0FfVUlOVDggaHRjX2dldF9jcmVkaXRfYWxsb2NhdGlvbihIVENfVEFSR0VUICp0YXJnZXQsIEFfVUlOVDE2IFNlcnZpY2VJRCk7Cit2b2lkIGh0Y190eF9yZXNvdXJjZV9hdmFpbF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIEFfVUlOVDggcGlwZUlEKTsKK3ZvaWQgaHRjX2NvbnRyb2xfcnhfY29tcGxldGUodm9pZCAqQ29udGV4dCwgSFRDX1BBQ0tFVCAqcFBhY2tldCk7Cit2b2lkIGh0Y19wcm9jZXNzX2NyZWRpdF9ycHQoSFRDX1RBUkdFVCAqdGFyZ2V0LAorCQkJICAgIEhUQ19DUkVESVRfUkVQT1JUICpwUnB0LAorCQkJICAgIGludCBOdW1FbnRyaWVzLCBIVENfRU5EUE9JTlRfSUQgRnJvbUVuZHBvaW50KTsKK3ZvaWQgaHRjX2Z3X2V2ZW50X2hhbmRsZXIodm9pZCAqY29udGV4dCwgQ0RGX1NUQVRVUyBzdGF0dXMpOwordm9pZCBodGNfc2VuZF9jb21wbGV0ZV9jaGVja19jbGVhbnVwKHZvaWQgKmNvbnRleHQpOworCit2b2lkIGh0Y19jcmVkaXRfcmVjb3JkKGh0Y19jcmVkaXRfZXhjaGFuZ2VfdHlwZSB0eXBlLCB1aW50MzJfdCB0eF9jcmVkaXQsCisJCSAgICAgICB1aW50MzJfdCBodGNfdHhfcXVldWVfZGVwdGgpOworCitzdGF0aWMgaW5saW5lIHZvaWQgaHRjX3NlbmRfY29tcGxldGVfcG9sbF90aW1lcl9zdG9wKEhUQ19FTkRQT0lOVCAqCisJCQkJCQkgICAgIHBFbmRwb2ludCkgeworCUxPQ0tfSFRDX1RYKHBFbmRwb2ludC0+dGFyZ2V0KTsKKwlpZiAocEVuZHBvaW50LT51bF9wb2xsX3RpbWVyX2FjdGl2ZSkgeworCQkvKiBjZGZfc29mdGlycV90aW1lcl9jYW5jZWwoJnBFbmRwb2ludC0+dWxfcG9sbF90aW1lcik7ICovCisJCXBFbmRwb2ludC0+dWxfcG9sbF90aW1lcl9hY3RpdmUgPSAwOworCX0KKwlVTkxPQ0tfSFRDX1RYKHBFbmRwb2ludC0+dGFyZ2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGh0Y19zZW5kX2NvbXBsZXRlX3BvbGxfdGltZXJfc3RhcnQoSFRDX0VORFBPSU5UICoKKwkJCQkJCSAgICAgIHBFbmRwb2ludCkgeworCUxPQ0tfSFRDX1RYKHBFbmRwb2ludC0+dGFyZ2V0KTsKKwlpZiAocEVuZHBvaW50LT51bF9vdXRzdGFuZGluZ19jbnQKKwkgICAgJiYgIXBFbmRwb2ludC0+dWxfcG9sbF90aW1lcl9hY3RpdmUpIHsKKwkJLyoKKwkJICAgY2RmX3NvZnRpcnFfdGltZXJfc3RhcnQoCisJCSAgICZwRW5kcG9pbnQtPnVsX3BvbGxfdGltZXIsIEhUQ19QT0xMX0NMRUFOVVBfUEVSSU9EX01TKTsKKwkJICovCisJCXBFbmRwb2ludC0+dWxfcG9sbF90aW1lcl9hY3RpdmUgPSAxOworCX0KKwlVTkxPQ0tfSFRDX1RYKHBFbmRwb2ludC0+dGFyZ2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitodGNfc2VuZF9jb21wbGV0ZV9jaGVjayhIVENfRU5EUE9JTlQgKnBFbmRwb2ludCwgaW50IGZvcmNlKSB7CisJLyoKKwkgKiBTdG9wIHRoZSBwb2xsaW5nLWNsZWFudXAgdGltZXIgdGhhdCB3aWxsIHJlc3VsdCBpbiBhIGxhdGVyIGNhbGwgdG8KKwkgKiB0aGlzIGZ1bmN0aW9uLiAgSXQgbWF5IGdldCBzdGFydGVkIGFnYWluIGJlbG93LCBpZiB0aGVyZSBhcmUgc3RpbGwKKwkgKiBvdXRzZW5kaW5nIHNlbmRzLgorCSAqLworCWh0Y19zZW5kX2NvbXBsZXRlX3BvbGxfdGltZXJfc3RvcChwRW5kcG9pbnQpOworCS8qCisJICogQ2hlY2sgd2hldGhlciBISUYgaGFzIGFueSBwcmlvciBzZW5kcyB0aGF0IGhhdmUgZmluaXNoZWQsCisJICogaGF2ZSBub3QgaGFkIHRoZSBwb3N0LXByb2Nlc3NpbmcgZG9uZS4KKwkgKi8KKwloaWZfc2VuZF9jb21wbGV0ZV9jaGVjayhwRW5kcG9pbnQtPnRhcmdldC0+aGlmX2RldiwKKwkJCQlwRW5kcG9pbnQtPlVMX1BpcGVJRCwgZm9yY2UpOworCS8qCisJICogSWYgdGhlcmUgYXJlIHN0aWxsIG91dHN0YW5kaW5nIHNlbmRzIGFmdGVyIHBvbGxpbmcsIHN0YXJ0IGEgdGltZXIKKwkgKiB0byBjaGVjayBhZ2FpbiBhIGxpdHRsZSBsYXRlci4KKwkgKi8KKwlodGNfc2VuZF9jb21wbGV0ZV9wb2xsX3RpbWVyX3N0YXJ0KHBFbmRwb2ludCk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNpZm5kZWYgREVCVUdfQlVORExFCisjZGVmaW5lIERFQlVHX0JVTkRMRSAwCisjZW5kaWYKKworI2lmZGVmIEhJRl9TRElPCisjaWZuZGVmIEVOQUJMRV9CVU5ETEVfVFgKKyNkZWZpbmUgRU5BQkxFX0JVTkRMRV9UWCAxCisjZW5kaWYKKworI2lmbmRlZiBFTkFCTEVfQlVORExFX1JYCisjZGVmaW5lIEVOQUJMRV9CVU5ETEVfUlggMQorI2VuZGlmCisjZW5kaWYgLyogSElGX1NESU8gKi8KKyNlbmRpZiAvKiAhX0hUQ19IT1NUX0lOVEVSTkFMX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2h0Yy9odGNfcGFja2V0LmggYi9jb3JlL2h0Yy9odGNfcGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwZDUxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaHRjL2h0Y19wYWNrZXQuaApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBIVENfUEFDS0VUX0hfCisjZGVmaW5lIEhUQ19QQUNLRVRfSF8KKworI2luY2x1ZGUgPG9zZGVwLmg+CisjaW5jbHVkZSA8YV90eXBlcy5oPiAgICAgICAgICAgIC8qIEFfVUlOVDE2LCBldGMuICovCisjaW5jbHVkZSAiZGxfbGlzdC5oIgorCisvKiAtLS0tLS0gRW5kcG9pbnQgSURTIC0tLS0tLSAqLwordHlwZWRlZiBlbnVtIHsKKwlFTkRQT0lOVF9VTlVTRUQgPSAtMSwKKwlFTkRQT0lOVF8wID0gMCwKKwlFTkRQT0lOVF8xID0gMSwKKwlFTkRQT0lOVF8yID0gMiwKKwlFTkRQT0lOVF8zLAorCUVORFBPSU5UXzQsCisJRU5EUE9JTlRfNSwKKwlFTkRQT0lOVF82LAorCUVORFBPSU5UXzcsCisJRU5EUE9JTlRfOCwKKwlFTkRQT0lOVF9NQVgsCit9IEhUQ19FTkRQT0lOVF9JRDsKKworc3RydWN0IF9IVENfUEFDS0VUOworCit0eXBlZGVmIHZvaWQgKCpIVENfUEFDS0VUX0NPTVBMRVRJT04pKHZvaWQgKiwgc3RydWN0IF9IVENfUEFDS0VUICopOworCit0eXBlZGVmIEFfVUlOVDE2IEhUQ19UWF9UQUc7CisKK3R5cGVkZWYgc3RydWN0IF9IVENfVFhfUEFDS0VUX0lORk8geworCUhUQ19UWF9UQUcgVGFnOyAgICAgICAgIC8qIHRhZyB1c2VkIHRvIHNlbGVjdGl2ZSBmbHVzaCBwYWNrZXRzICovCisJaW50IENyZWRpdHNVc2VkOyAgICAgICAgLyogbnVtYmVyIG9mIGNyZWRpdHMgdXNlZCBmb3IgdGhpcyBUWCBwYWNrZXQgKEhUQyBpbnRlcm5hbCkgKi8KKwlBX1VJTlQ4IFNlbmRGbGFnczsgICAgICAvKiBzZW5kIGZsYWdzIChIVEMgaW50ZXJuYWwpICovCisJaW50IFNlcU5vOyAgICAgICAgICAgICAgLyogaW50ZXJuYWwgc2VxIG5vIGZvciBkZWJ1Z2dpbmcgKEhUQyBpbnRlcm5hbCkgKi8KKwlBX1VJTlQzMiBGbGFnczsgICAgICAgICAvKiBpbnRlcm5hbCB1c2UgKi8KK30gSFRDX1RYX1BBQ0tFVF9JTkZPOworCisjZGVmaW5lIEhUQ19UWF9QQUNLRVRfVEFHX0FMTCAgICAgICAgICAwICAgICAgICAvKiBhIHRhZyBvZiB6ZXJvIGlzIHJlc2VydmVkIGFuZCB1c2VkIHRvIGZsdXNoIEFMTCBwYWNrZXRzICovCisjZGVmaW5lIEhUQ19UWF9QQUNLRVRfVEFHX0lOVEVSTkFMICAgICAxICAgICAgICAvKiBpbnRlcm5hbCB0YWdzIHN0YXJ0IGhlcmUgKi8KKyNkZWZpbmUgSFRDX1RYX1BBQ0tFVF9UQUdfVVNFUl9ERUZJTkVEIChIVENfVFhfUEFDS0VUX1RBR19JTlRFUk5BTCArIDkpIC8qIHVzZXItZGVmaW5lZCB0YWdzIHN0YXJ0IGhlcmUgKi8KKyNkZWZpbmUgSFRDX1RYX1BBQ0tFVF9UQUdfQlVORExFRCAgICAgIEhUQ19UWF9QQUNLRVRfVEFHX1VTRVJfREVGSU5FRCArIDEgICAgICAgLyogaW5kaWNhdGUgdGhpcyBpcyBidW5kbGVkIFRYIHBhY2tldCAqLworCisjZGVmaW5lIEhUQ19UWF9QQUNLRVRfRkxBR19GSVhVUF9ORVRCVUYgKDEgPDwgMCkKKwordHlwZWRlZiBzdHJ1Y3QgX0hUQ19SWF9QQUNLRVRfSU5GTyB7CisJQV9VSU5UMzIgRXhwZWN0ZWRIZHI7ICAgLyogSFRDIGludGVybmFsIHVzZSAqLworCUFfVUlOVDMyIEhUQ1J4RmxhZ3M7ICAgIC8qIEhUQyBpbnRlcm5hbCB1c2UgKi8KKwlBX1VJTlQzMiBJbmRpY2F0aW9uRmxhZ3M7ICAgICAgIC8qIGluZGljYXRpb24gZmxhZ3Mgc2V0IG9uIGVhY2ggUlggcGFja2V0IGluZGljYXRpb24gKi8KK30gSFRDX1JYX1BBQ0tFVF9JTkZPOworCisjZGVmaW5lIEhUQ19SWF9GTEFHU19JTkRJQ0FURV9NT1JFX1BLVFMgICgxIDw8IDApICAgICAgIC8qIG1vcmUgcGFja2V0cyBvbiB0aGlzIGVuZHBvaW50IGFyZSBiZWluZyBmZXRjaGVkICovCisKKy8qIHdyYXBwZXIgYXJvdW5kIGVuZHBvaW50LXNwZWNpZmljIHBhY2tldHMgKi8KK3R5cGVkZWYgc3RydWN0IF9IVENfUEFDS0VUIHsKKwlETF9MSVNUIExpc3RMaW5rOyAgICAgICAvKiBkb3VibGUgbGluayAqLworCXZvaWQgKnBQa3RDb250ZXh0OyAgICAgIC8qIGNhbGxlcidzIHBlciBwYWNrZXQgc3BlY2lmaWMgY29udGV4dCAqLworCisJQV9VSU5UOCAqcEJ1ZmZlclN0YXJ0OyAgLyogdGhlIHRydWUgYnVmZmVyIHN0YXJ0ICwgdGhlIGNhbGxlciBjYW4KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSB0aGUgcmVhbCBidWZmZXIgc3RhcnQgaGVyZS4gIEluCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZSBjYWxsYmFja3MsIHRoZSBIVEMgbGF5ZXIgc2V0cyBwQnVmZmVyCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkIHBhc3QgdGhlIGhlYWRlci4gVGhpcworCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGFsbG93cyB0aGUgY2FsbGVyIHRvIHJlc2V0IHBCdWZmZXIgd2hlbiBpdAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ljbGVzIHJlY2VpdmUgcGFja2V0cyBiYWNrIHRvIEhUQyAqLworCS8qCisJICogUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4gSW4gdGhlIHRyYW5zbWl0CisJICogZGlyZWN0aW9uIHRoaXMgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgcGF5bG9hZC4gSW4gdGhlCisJICogcmVjZWl2ZSBkaXJlY3Rpb24sIGhvd2V2ZXIsIHRoZSBidWZmZXIgd2hlbiBxdWV1ZWQgdXAKKwkgKiBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBIVEMgaGVhZGVyIGJ1dCB3aGVuIHJldHVybmVkCisJICogdG8gdGhlIGNhbGxlciBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkCisJICovCisJQV9VSU5UOCAqcEJ1ZmZlcjsgICAgICAgLyogcGF5bG9hZCBzdGFydCAoUlgvVFgpICovCisJQV9VSU5UMzIgQnVmZmVyTGVuZ3RoOyAgLyogbGVuZ3RoIG9mIGJ1ZmZlciAqLworCUFfVUlOVDMyIEFjdHVhbExlbmd0aDsgIC8qIGFjdHVhbCBsZW5ndGggb2YgcGF5bG9hZCAqLworCUhUQ19FTkRQT0lOVF9JRCBFbmRwb2ludDsgICAgICAgLyogZW5kcG9pbnQgdGhhdCB0aGlzIHBhY2tldCB3YXMgc2VudC9yZWN2J2QgZnJvbSAqLworCUFfU1RBVFVTIFN0YXR1czsgICAgICAgIC8qIGNvbXBsZXRpb24gc3RhdHVzICovCisJdW5pb24geworCQlIVENfVFhfUEFDS0VUX0lORk8gQXNUeDsgICAgICAgIC8qIFR4IFBhY2tldCBzcGVjaWZpYyBpbmZvICovCisJCUhUQ19SWF9QQUNLRVRfSU5GTyBBc1J4OyAgICAgICAgLyogUnggUGFja2V0IHNwZWNpZmljIGluZm8gKi8KKwl9IFBrdEluZm87CisKKwkvKiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgZm9yIGludGVybmFsIEhUQyB1c2UgKi8KKwlBX1VJTlQzMiBuZXRidWZPcmlnSGVhZFJvb207CisJSFRDX1BBQ0tFVF9DT01QTEVUSU9OIENvbXBsZXRpb247ICAgICAgIC8qIGNvbXBsZXRpb24gKi8KKwl2b2lkICpwQ29udGV4dDsgICAgICAgICAvKiBIVEMgcHJpdmF0ZSBjb21wbGV0aW9uIGNvbnRleHQgKi8KKwl2b2lkICpwTmV0QnVmQ29udGV4dDsgICAvKiBvcHRpbWl6YXRpb24gZm9yIG5ldHdvcmstb3JpZW50ZWQgZGF0YSwgdGhlIEhUQyBwYWNrZXQKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gcGFzcyB0aGUgbmV0d29yayBidWZmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgSFRDIHBhY2tldAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyIGxheWVycyBtYXkgb3B0aW1pemVkIHRoZSB0cmFuc2ZlciBrbm93aW5nIHRoaXMgaXMKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG5ldHdvcmsgYnVmZmVyICovCit9IEhUQ19QQUNLRVQ7CisKKyNkZWZpbmUgQ09NUExFVEVfSFRDX1BBQ0tFVChwLHN0YXR1cykJICAgICBcCisJewkJCQkJICAgICBcCisJCShwKS0+U3RhdHVzID0gKHN0YXR1cyk7CQkJIFwKKwkJKHApLT5Db21wbGV0aW9uKChwKS0+cENvbnRleHQsKHApKTsJIFwKKwl9CisKKyNkZWZpbmUgSU5JVF9IVENfUEFDS0VUX0lORk8ocCxiLGxlbikJCSAgXAorCXsJCQkJCQkgIFwKKwkJKHApLT5wQnVmZmVyU3RhcnQgPSAoYik7CQkgICAgICBcCisJCShwKS0+QnVmZmVyTGVuZ3RoID0gKGxlbik7CQkgICAgICBcCisJfQorCisvKiBtYWNybyB0byBzZXQgYW4gaW5pdGlhbCBSWCBwYWNrZXQgZm9yIHJlZmlsbGluZyBIVEMgKi8KKyNkZWZpbmUgU0VUX0hUQ19QQUNLRVRfSU5GT19SWF9SRUZJTEwocCxjLGIsbGVuLGVwKSBcCisJewkJCQkJCSAgXAorCQkocCktPnBQa3RDb250ZXh0ID0gKGMpOwkJCSAgICAgIFwKKwkJKHApLT5wQnVmZmVyID0gKGIpOwkJCSAgICAgIFwKKwkJKHApLT5wQnVmZmVyU3RhcnQgPSAoYik7CQkgICAgICBcCisJCShwKS0+QnVmZmVyTGVuZ3RoID0gKGxlbik7CQkgICAgICBcCisJCShwKS0+RW5kcG9pbnQgPSAoZXApOwkJCSAgICAgIFwKKwl9CisKKy8qIGZhc3QgbWFjcm8gdG8gcmVjeWNsZSBhbiBSWCBwYWNrZXQgdGhhdCB3aWxsIGJlIHJlLXF1ZXVlZCB0byBIVEMgKi8KKyNkZWZpbmUgSFRDX1BBQ0tFVF9SRVNFVF9SWChwKQkJICAgIFwKKwl7IChwKS0+cEJ1ZmZlciA9IChwKS0+cEJ1ZmZlclN0YXJ0OyAocCktPkFjdHVhbExlbmd0aCA9IDA7IH0KKworLyogbWFjcm8gdG8gc2V0IHBhY2tldCBwYXJhbWV0ZXJzIGZvciBUWCAqLworI2RlZmluZSBTRVRfSFRDX1BBQ0tFVF9JTkZPX1RYKHAsYyxiLGxlbixlcCx0YWcpICBcCisJewkJCQkJCSAgXAorCQkocCktPnBQa3RDb250ZXh0ID0gKGMpOwkJCSAgICAgIFwKKwkJKHApLT5wQnVmZmVyID0gKGIpOwkJCSAgICAgIFwKKwkJKHApLT5BY3R1YWxMZW5ndGggPSAobGVuKTsJCSAgICAgIFwKKwkJKHApLT5FbmRwb2ludCA9IChlcCk7CQkJICAgICAgXAorCQkocCktPlBrdEluZm8uQXNUeC5UYWcgPSAodGFnKTsJCSAgICAgIFwKKwkJKHApLT5Qa3RJbmZvLkFzVHguRmxhZ3MgPSAwOwkJICAgICAgXAorCX0KKworI2RlZmluZSBTRVRfSFRDX1BBQ0tFVF9ORVRfQlVGX0NPTlRFWFQocCxuYikgXAorCShwKS0+cE5ldEJ1ZkNvbnRleHQgPSAobmIpCisKKyNkZWZpbmUgR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKHApICAocCktPnBOZXRCdWZDb250ZXh0CisKKy8qIEhUQyBQYWNrZXQgUXVldWVpbmcgTWFjcm9zICovCit0eXBlZGVmIHN0cnVjdCBfSFRDX1BBQ0tFVF9RVUVVRSB7CisJRExfTElTVCBRdWV1ZUhlYWQ7CisJaW50IERlcHRoOworfSBIVENfUEFDS0VUX1FVRVVFOworCisvKiBpbml0aWFsaXplIHF1ZXVlICovCisjZGVmaW5lIElOSVRfSFRDX1BBQ0tFVF9RVUVVRShwUSkgICBcCisJewkJCQkgICAgXAorCQlETF9MSVNUX0lOSVQoJiAocFEpLT5RdWV1ZUhlYWQpOyBcCisJCShwUSktPkRlcHRoID0gMDsJCVwKKwl9CisKKy8qIGVucXVldWUgSFRDIHBhY2tldCB0byB0aGUgdGFpbCBvZiB0aGUgcXVldWUgKi8KKyNkZWZpbmUgSFRDX1BBQ0tFVF9FTlFVRVVFKHBRLHApCQkJXAorCXsgICBkbF9saXN0X2luc2VydF90YWlsKCYgKHBRKS0+UXVldWVIZWFkLCYgKHApLT5MaXN0TGluayk7IFwKKwkgICAgKHBRKS0+RGVwdGggKys7CQkJCQkgXAorCX0KKworLyogZW5xdWV1ZSBIVEMgcGFja2V0IHRvIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSAqLworI2RlZmluZSBIVENfUEFDS0VUX0VOUVVFVUVfVE9fSEVBRChwUSxwKQkJXAorCXsgICBkbF9saXN0X2luc2VydF9oZWFkKCYgKHBRKS0+UXVldWVIZWFkLCYgKHApLT5MaXN0TGluayk7IFwKKwkgICAgKHBRKS0+RGVwdGggKys7CQkJCQkgXAorCX0KKy8qIHRlc3QgaWYgYSBxdWV1ZSBpcyBlbXB0eSAqLworI2RlZmluZSBIVENfUVVFVUVfRU1QVFkocFEpICAgICAgICgocFEpLT5EZXB0aCA9PSAwKQorLyogZ2V0IHBhY2tldCBhdCBoZWFkIHdpdGhvdXQgcmVtb3ZpbmcgaXQgKi8KK3N0YXRpYyBJTkxJTkUgSFRDX1BBQ0tFVCAqaHRjX2dldF9wa3RfYXRfaGVhZChIVENfUEFDS0VUX1FVRVVFICpxdWV1ZSkKK3sKKwlpZiAocXVldWUtPkRlcHRoID09IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybgorCQlBX0NPTlRBSU5JTkdfU1RSVUNUKChETF9MSVNUX0dFVF9JVEVNX0FUX0hFQUQoJnF1ZXVlLT5RdWV1ZUhlYWQpKSwKKwkJCQkgICAgSFRDX1BBQ0tFVCwgTGlzdExpbmspOworfQorCisvKiByZW1vdmUgYSBwYWNrZXQgZnJvbSBhIHF1ZXVlLCB3aGVyZS1ldmVyIGl0IGlzIGluIHRoZSBxdWV1ZSAqLworI2RlZmluZSBIVENfUEFDS0VUX1JFTU9WRShwUSxwKQkgICAgXAorCXsJCQkJICAgIFwKKwkJZGxfbGlzdF9yZW1vdmUoJiAocCktPkxpc3RMaW5rKTsgIFwKKwkJKHBRKS0+RGVwdGggLS07CQkJIFwKKwl9CisKKy8qIGRlcXVldWUgYW4gSFRDIHBhY2tldCBmcm9tIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSAqLworc3RhdGljIElOTElORSBIVENfUEFDS0VUICpodGNfcGFja2V0X2RlcXVldWUoSFRDX1BBQ0tFVF9RVUVVRSAqcXVldWUpCit7CisJRExfTElTVCAqcEl0ZW0gPSBkbF9saXN0X3JlbW92ZV9pdGVtX2Zyb21faGVhZCgmcXVldWUtPlF1ZXVlSGVhZCk7CisJaWYgKHBJdGVtICE9IE5VTEwpIHsKKwkJcXVldWUtPkRlcHRoLS07CisJCXJldHVybiBBX0NPTlRBSU5JTkdfU1RSVUNUKHBJdGVtLCBIVENfUEFDS0VULCBMaXN0TGluayk7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBkZXF1ZXVlIGFuIEhUQyBwYWNrZXQgZnJvbSB0aGUgdGFpbCBvZiB0aGUgcXVldWUgKi8KK3N0YXRpYyBJTkxJTkUgSFRDX1BBQ0tFVCAqaHRjX3BhY2tldF9kZXF1ZXVlX3RhaWwoSFRDX1BBQ0tFVF9RVUVVRSAqcXVldWUpCit7CisJRExfTElTVCAqcEl0ZW0gPSBkbF9saXN0X3JlbW92ZV9pdGVtX2Zyb21fdGFpbCgmcXVldWUtPlF1ZXVlSGVhZCk7CisJaWYgKHBJdGVtICE9IE5VTEwpIHsKKwkJcXVldWUtPkRlcHRoLS07CisJCXJldHVybiBBX0NPTlRBSU5JTkdfU1RSVUNUKHBJdGVtLCBIVENfUEFDS0VULCBMaXN0TGluayk7CisJfQorCXJldHVybiBOVUxMOworfQorCisjZGVmaW5lIEhUQ19QQUNLRVRfUVVFVUVfREVQVEgocFEpIChwUSktPkRlcHRoCisKKyNkZWZpbmUgSFRDX0dFVF9FTkRQT0lOVF9GUk9NX1BLVChwKSAocCktPkVuZHBvaW50CisjZGVmaW5lIEhUQ19HRVRfVEFHX0ZST01fUEtUKHApICAgICAgKHApLT5Qa3RJbmZvLkFzVHguVGFnCisKKy8qIHRyYW5zZmVyIHRoZSBwYWNrZXRzIGZyb20gb25lIHF1ZXVlIHRvIHRoZSB0YWlsIG9mIGFub3RoZXIgcXVldWUgKi8KKyNkZWZpbmUgSFRDX1BBQ0tFVF9RVUVVRV9UUkFOU0ZFUl9UT19UQUlMKHBRRGVzdCxwUVNyYykJXAorCXsJCQkJCQkJCQkgICAgXAorCQlkbF9saXN0X3RyYW5zZmVyX2l0ZW1zX3RvX3RhaWwoJihwUURlc3QpLT5RdWV1ZUhlYWQsJihwUVNyYyktPlF1ZXVlSGVhZCk7ICAgXAorCQkocFFEZXN0KS0+RGVwdGggKz0gKHBRU3JjKS0+RGVwdGg7CQkJCQlcCisJCShwUVNyYyktPkRlcHRoID0gMDsJCQkJCQkJXAorCX0KKworLyoKKyAqIFRyYW5zZmVyIHRoZSBwYWNrZXRzIGZyb20gb25lIHF1ZXVlIHRvIHRoZSBoZWFkIG9mIGFub3RoZXIgcXVldWUuCisgKiBUaGlzIHhmZXJfdG9faGVhZChxMSxxMikgaXMgYmFzaWNhbGx5IGVxdWl2YWxlbnQgdG8geGZlcl90b190YWlsKHEyLHExKSwKKyAqIGJ1dCBpdCB1cGRhdGVzIHRoZSBxdWV1ZSBkZXNjcmlwdG9yIG9iamVjdCBmb3IgdGhlIGluaXRpYWwgcXVldWUgdG8gcmVmZXIKKyAqIHRvIHRoZSBjb25jYXRlbmF0ZWQgcXVldWUuCisgKi8KKyNkZWZpbmUgSFRDX1BBQ0tFVF9RVUVVRV9UUkFOU0ZFUl9UT19IRUFEKHBRRGVzdCwgcFFTcmMpICBcCisJewkJCQkJCQkJCSAgICBcCisJCWRsX2xpc3RfdHJhbnNmZXJfaXRlbXNfdG9faGVhZCgmKHBRRGVzdCktPlF1ZXVlSGVhZCwmKHBRU3JjKS0+UXVldWVIZWFkKTsgICBcCisJCShwUURlc3QpLT5EZXB0aCArPSAocFFTcmMpLT5EZXB0aDsJCQkJCVwKKwkJKHBRU3JjKS0+RGVwdGggPSAwOwkJCQkJCQlcCisJfQorCisvKiBmYXN0IHZlcnNpb24gdG8gaW5pdCBhbmQgYWRkIGEgc2luZ2xlIHBhY2tldCB0byBhIHF1ZXVlICovCisjZGVmaW5lIElOSVRfSFRDX1BBQ0tFVF9RVUVVRV9BTkRfQUREKHBRLHBQKSBcCisJewkJCQkJICAgICBcCisJCURMX0xJU1RfSU5JVF9BTkRfQUREKCYocFEpLT5RdWV1ZUhlYWQsJihwUCktPkxpc3RMaW5rKQlcCisJCShwUSktPkRlcHRoID0gMTsJCQkJCVwKKwl9CisKKyNkZWZpbmUgSFRDX1BBQ0tFVF9RVUVVRV9JVEVSQVRFX0FMTE9XX1JFTU9WRShwUSwgcFBUZW1wKSBcCisJSVRFUkFURV9PVkVSX0xJU1RfQUxMT1dfUkVNT1ZFKCYocFEpLT5RdWV1ZUhlYWQsKHBQVGVtcCksIEhUQ19QQUNLRVQsIExpc3RMaW5rKQorCisjZGVmaW5lIEhUQ19QQUNLRVRfUVVFVUVfSVRFUkFURV9JU19WQUxJRChwUSkgICBJVEVSQVRFX0lTX1ZBTElEKCYocFEpLT5RdWV1ZUhlYWQpCisjZGVmaW5lIEhUQ19QQUNLRVRfUVVFVUVfSVRFUkFURV9SRVNFVChwUSkgSVRFUkFURV9SRVNFVCgmKHBRKS0+UXVldWVIZWFkKQorCisjZGVmaW5lIEhUQ19QQUNLRVRfUVVFVUVfSVRFUkFURV9FTkQgSVRFUkFURV9FTkQKKworI2VuZGlmIC8qSFRDX1BBQ0tFVF9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9odGMvaHRjX3JlY3YuYyBiL2NvcmUvaHRjL2h0Y19yZWN2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4NzE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaHRjL2h0Y19yZWN2LmMKQEAgLTAsMCArMSw3NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlICJodGNfZGVidWcuaCIKKyNpbmNsdWRlICJodGNfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSA8Y2RmX25idWYuaD4gICAgICAgICAgIC8qIGNkZl9uYnVmX3QgKi8KKyNpbmNsdWRlIDxjZHNfZ2V0X2Jpbi5oPgorI2luY2x1ZGUgImVwcGluZ19tYWluLmgiCisKKyNpZmRlZiBERUJVRwordm9pZCBkZWJ1Z19kdW1wX2J5dGVzKEFfVUNIQVIgKmJ1ZmZlciwgQV9VSU5UMTYgbGVuZ3RoLCBjaGFyICpwRGVzY3JpcHRpb24pCit7CisJQV9DSEFSIHN0cmVhbVs2MF07CisJQV9DSEFSIGJ5dGVPZmZzZXRTdHJbMTBdOworCUFfVUlOVDMyIGk7CisJQV9VSU5UMTYgb2Zmc2V0LCBjb3VudCwgYnl0ZU9mZnNldDsKKworCUFfUFJJTlRGKCI8LS0tLS0tLS0tRHVtcGluZyAlZCBCeXRlcyA6ICVzIC0tLS0tLT5cbiIsIGxlbmd0aCwKKwkJIHBEZXNjcmlwdGlvbik7CisKKwljb3VudCA9IDA7CisJb2Zmc2V0ID0gMDsKKwlieXRlT2Zmc2V0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJQV9TTlBSSU5URihzdHJlYW0gKyBvZmZzZXQsIChzaXplb2Yoc3RyZWFtKSAtIG9mZnNldCksCisJCQkgICAiJTAyWCAiLCBidWZmZXJbaV0pOworCQljb3VudCsrOworCQlvZmZzZXQgKz0gMzsKKworCQlpZiAoY291bnQgPT0gMTYpIHsKKwkJCWNvdW50ID0gMDsKKwkJCW9mZnNldCA9IDA7CisJCQlBX1NOUFJJTlRGKGJ5dGVPZmZzZXRTdHIsIHNpemVvZihieXRlT2Zmc2V0KSwgIiU0LjRYIiwKKwkJCQkgICBieXRlT2Zmc2V0KTsKKwkJCUFfUFJJTlRGKCJbJXNdOiAlc1xuIiwgYnl0ZU9mZnNldFN0ciwgc3RyZWFtKTsKKwkJCUFfTUVNWkVSTyhzdHJlYW0sIDYwKTsKKwkJCWJ5dGVPZmZzZXQgKz0gMTY7CisJCX0KKwl9CisKKwlpZiAob2Zmc2V0ICE9IDApIHsKKwkJQV9TTlBSSU5URihieXRlT2Zmc2V0U3RyLCBzaXplb2YoYnl0ZU9mZnNldCksICIlNC40WCIsCisJCQkgICBieXRlT2Zmc2V0KTsKKwkJQV9QUklOVEYoIlslc106ICVzXG4iLCBieXRlT2Zmc2V0U3RyLCBzdHJlYW0pOworCX0KKworCUFfUFJJTlRGKCI8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiIpOworfQorI2Vsc2UKK3ZvaWQgZGVidWdfZHVtcF9ieXRlcyhBX1VDSEFSICpidWZmZXIsIEFfVUlOVDE2IGxlbmd0aCwgY2hhciAqcERlc2NyaXB0aW9uKQoreworfQorI2VuZGlmCisKK3N0YXRpYyBBX1NUQVRVUyBodGNfcHJvY2Vzc190cmFpbGVyKEhUQ19UQVJHRVQgKnRhcmdldCwKKwkJCQkgICAgQV9VSU5UOCAqcEJ1ZmZlciwKKwkJCQkgICAgaW50IExlbmd0aCwgSFRDX0VORFBPSU5UX0lEIEZyb21FbmRwb2ludCk7CisKK3N0YXRpYyB2b2lkIGRvX3JlY3ZfY29tcGxldGlvbihIVENfRU5EUE9JTlQgKnBFbmRwb2ludCwKKwkJCSAgICAgICBIVENfUEFDS0VUX1FVRVVFICpwUXVldWVUb0luZGljYXRlKQoreworCisJZG8geworCisJCWlmIChIVENfUVVFVUVfRU1QVFkocFF1ZXVlVG9JbmRpY2F0ZSkpIHsKKwkJCS8qIG5vdGhpbmcgdG8gaW5kaWNhdGUgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBFbmRwb2ludC0+RXBDYWxsQmFja3MuRXBSZWN2UGt0TXVsdGlwbGUgIT0gTlVMTCkgeworCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19SRUNWLAorCQkJCQkoIiBIVEMgY2FsbGluZyBlcCAlZCwgcmVjdiBtdWx0aXBsZSBjYWxsYmFjayAoJWQgcGt0cykgXG4iLAorCQkJCQkgcEVuZHBvaW50LT5JZCwKKwkJCQkJIEhUQ19QQUNLRVRfUVVFVUVfREVQVEgKKwkJCQkJCSAocFF1ZXVlVG9JbmRpY2F0ZSkpKTsKKwkJCS8qIGEgcmVjdiBtdWx0aXBsZSBoYW5kbGVyIGlzIGJlaW5nIHVzZWQsIHBhc3MgdGhlIHF1ZXVlIHRvIHRoZSBoYW5kbGVyICovCisJCQlwRW5kcG9pbnQtPkVwQ2FsbEJhY2tzLkVwUmVjdlBrdE11bHRpcGxlKHBFbmRwb2ludC0+CisJCQkJCQkJCSBFcENhbGxCYWNrcy4KKwkJCQkJCQkJIHBDb250ZXh0LAorCQkJCQkJCQkgcFF1ZXVlVG9JbmRpY2F0ZSk7CisJCQlJTklUX0hUQ19QQUNLRVRfUVVFVUUocFF1ZXVlVG9JbmRpY2F0ZSk7CisJCX0gZWxzZSB7CisJCQlIVENfUEFDS0VUICpwUGFja2V0OworCQkJLyogdXNpbmcgbGVnYWN5IEVwUmVjdiAqLworCQkJd2hpbGUgKCFIVENfUVVFVUVfRU1QVFkocFF1ZXVlVG9JbmRpY2F0ZSkpIHsKKwkJCQlwUGFja2V0ID0gaHRjX3BhY2tldF9kZXF1ZXVlKHBRdWV1ZVRvSW5kaWNhdGUpOworCQkJCWlmIChwRW5kcG9pbnQtPkVwQ2FsbEJhY2tzLkVwUmVjdiA9PSBOVUxMKSB7CisJCQkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkJCSgiSFRDIGVwICVkIGhhcyBOVUxMIHJlY3YgY2FsbGJhY2sgb24gcGFja2V0ICVwXG4iLAorCQkJCQkJCSBwRW5kcG9pbnQtPklkLAorCQkJCQkJCSBwUGFja2V0KSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1JFQ1YsCisJCQkJCQkoIkhUQyBjYWxsaW5nIGVwICVkIHJlY3YgY2FsbGJhY2sgb24gcGFja2V0ICVwXG4iLAorCQkJCQkJIHBFbmRwb2ludC0+SWQsIHBQYWNrZXQpKTsKKwkJCQlwRW5kcG9pbnQtPkVwQ2FsbEJhY2tzLkVwUmVjdihwRW5kcG9pbnQtPgorCQkJCQkJCSAgICAgIEVwQ2FsbEJhY2tzLgorCQkJCQkJCSAgICAgIHBDb250ZXh0LAorCQkJCQkJCSAgICAgIHBQYWNrZXQpOworCQkJfQorCQl9CisKKwl9IHdoaWxlIChmYWxzZSk7CisKK30KKworc3RhdGljIHZvaWQgcmVjdl9wYWNrZXRfY29tcGxldGlvbihIVENfVEFSR0VUICp0YXJnZXQsIEhUQ19FTkRQT0lOVCAqcEVuZHBvaW50LAorCQkJCSAgIEhUQ19QQUNLRVQgKnBQYWNrZXQpCit7CisJSFRDX1BBQ0tFVF9RVUVVRSBjb250YWluZXI7CisJSU5JVF9IVENfUEFDS0VUX1FVRVVFX0FORF9BREQoJmNvbnRhaW5lciwgcFBhY2tldCk7CisJLyogZG8gY29tcGxldGlvbiAqLworCWRvX3JlY3ZfY29tcGxldGlvbihwRW5kcG9pbnQsICZjb250YWluZXIpOworfQorCit2b2lkIGh0Y19jb250cm9sX3J4X2NvbXBsZXRlKHZvaWQgKkNvbnRleHQsIEhUQ19QQUNLRVQgKnBQYWNrZXQpCit7CisJLyogVE9ETywgY2FuJ3QgcmVhbGx5IHJlY2VpdmUgSFRDIGNvbnRyb2wgbWVzc2FnZXMgeWV0Li4uLiAqLworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJKCJJbnZhbGlkIGNhbGwgdG8gIGh0Y19jb250cm9sX3J4X2NvbXBsZXRlXG4iKSk7Cit9CisKK3ZvaWQgaHRjX3VuYmxvY2tfcmVjdihIVENfSEFORExFIEhUQ0hhbmRsZSkKK3sKKwkvKiBUT0RPICBmaW5kIHRoZSBOZWVkIGluIG5ldyBtb2RlbCAqLworfQorCit2b2lkIGh0Y19lbmFibGVfcmVjdihIVENfSEFORExFIEhUQ0hhbmRsZSkKK3sKKworCS8qIFRPRE8gIGZpbmQgdGhlIE5lZWQgaW4gbmV3IG1vZGVsICovCit9CisKK3ZvaWQgaHRjX2Rpc2FibGVfcmVjdihIVENfSEFORExFIEhUQ0hhbmRsZSkKK3sKKworCS8qIFRPRE8gIGZpbmQgdGhlIE5lZWQgaW4gbmV3IG1vZGVsICovCit9CisKK2ludCBodGNfZ2V0X251bV9yZWN2X2J1ZmZlcnMoSFRDX0hBTkRMRSBIVENIYW5kbGUsIEhUQ19FTkRQT0lOVF9JRCBFbmRwb2ludCkKK3sKKwlIVENfVEFSR0VUICp0YXJnZXQgPSBHRVRfSFRDX1RBUkdFVF9GUk9NX0hBTkRMRShIVENIYW5kbGUpOworCUhUQ19FTkRQT0lOVCAqcEVuZHBvaW50ID0gJnRhcmdldC0+RW5kUG9pbnRbRW5kcG9pbnRdOworCXJldHVybiBIVENfUEFDS0VUX1FVRVVFX0RFUFRIKCZwRW5kcG9pbnQtPlJ4QnVmZmVySG9sZFF1ZXVlKTsKK30KKworSFRDX1BBQ0tFVCAqYWxsb2NhdGVfaHRjX3BhY2tldF9jb250YWluZXIoSFRDX1RBUkdFVCAqdGFyZ2V0KQoreworCUhUQ19QQUNLRVQgKnBQYWNrZXQ7CisKKwlMT0NLX0hUQ19SWCh0YXJnZXQpOworCisJaWYgKE5VTEwgPT0gdGFyZ2V0LT5wSFRDUGFja2V0U3RydWN0UG9vbCkgeworCQlVTkxPQ0tfSFRDX1JYKHRhcmdldCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBQYWNrZXQgPSB0YXJnZXQtPnBIVENQYWNrZXRTdHJ1Y3RQb29sOworCXRhcmdldC0+cEhUQ1BhY2tldFN0cnVjdFBvb2wgPSAoSFRDX1BBQ0tFVCAqKSBwUGFja2V0LT5MaXN0TGluay5wTmV4dDsKKworCVVOTE9DS19IVENfUlgodGFyZ2V0KTsKKworCXBQYWNrZXQtPkxpc3RMaW5rLnBOZXh0ID0gTlVMTDsKKwlyZXR1cm4gcFBhY2tldDsKK30KKwordm9pZCBmcmVlX2h0Y19wYWNrZXRfY29udGFpbmVyKEhUQ19UQVJHRVQgKnRhcmdldCwgSFRDX1BBQ0tFVCAqcFBhY2tldCkKK3sKKwlMT0NLX0hUQ19SWCh0YXJnZXQpOworCisJaWYgKE5VTEwgPT0gdGFyZ2V0LT5wSFRDUGFja2V0U3RydWN0UG9vbCkgeworCQl0YXJnZXQtPnBIVENQYWNrZXRTdHJ1Y3RQb29sID0gcFBhY2tldDsKKwkJcFBhY2tldC0+TGlzdExpbmsucE5leHQgPSBOVUxMOworCX0gZWxzZSB7CisJCXBQYWNrZXQtPkxpc3RMaW5rLnBOZXh0ID0KKwkJCShETF9MSVNUICopIHRhcmdldC0+cEhUQ1BhY2tldFN0cnVjdFBvb2w7CisJCXRhcmdldC0+cEhUQ1BhY2tldFN0cnVjdFBvb2wgPSBwUGFja2V0OworCX0KKworCVVOTE9DS19IVENfUlgodGFyZ2V0KTsKK30KKworI2lmZGVmIFJYX1NHX1NVUFBPUlQKK2NkZl9uYnVmX3Qgcnhfc2dfdG9fc2luZ2xlX25ldGJ1ZihIVENfVEFSR0VUICp0YXJnZXQpCit7CisJY2RmX25idWZfdCBza2I7CisJdWludDhfdCAqYW5iZGF0YTsKKwl1aW50OF90ICphbmJkYXRhX25ldzsKKwl1aW50MzJfdCBhbmJsZW47CisJY2RmX25idWZfdCBuZXdfc2tiID0gTlVMTDsKKwl1aW50MzJfdCBzZ19xdWV1ZV9sZW47CisJY2RmX25idWZfcXVldWVfdCAqcnhfc2dfcXVldWUgPSAmdGFyZ2V0LT5SeFNnUXVldWU7CisKKwlzZ19xdWV1ZV9sZW4gPSBjZGZfbmJ1Zl9xdWV1ZV9sZW4ocnhfc2dfcXVldWUpOworCisJaWYgKHNnX3F1ZXVlX2xlbiA8PSAxKSB7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCSgicnhfc2dfdG9fc2luZ2xlX25ldGJ1ZjogaW52YWxpZCBzZyBxdWV1ZSBsZW4gJXVcbiIpKTsKKwkJZ290byBfZmFpbGVkOworCX0KKworCW5ld19za2IgPSBjZGZfbmJ1Zl9hbGxvYyh0YXJnZXQtPkV4cFJ4U2dUb3RhbExlbiwgMCwgNCwgZmFsc2UpOworCWlmIChuZXdfc2tiID09IE5VTEwpIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsCisJCQkJKCJyeF9zZ190b19zaW5nbGVfbmV0YnVmOiBjYW4ndCBhbGxvY2F0ZSAldSBzaXplIG5ldGJ1ZlxuIiwKKwkJCQkgdGFyZ2V0LT5FeHBSeFNnVG90YWxMZW4pKTsKKwkJZ290byBfZmFpbGVkOworCX0KKworCWNkZl9uYnVmX3BlZWtfaGVhZGVyKG5ld19za2IsICZhbmJkYXRhX25ldywgJmFuYmxlbik7CisKKwlza2IgPSBjZGZfbmJ1Zl9xdWV1ZV9yZW1vdmUocnhfc2dfcXVldWUpOworCWRvIHsKKwkJY2RmX25idWZfcGVla19oZWFkZXIoc2tiLCAmYW5iZGF0YSwgJmFuYmxlbik7CisJCWNkZl9tZW1fY29weShhbmJkYXRhX25ldywgYW5iZGF0YSwgY2RmX25idWZfbGVuKHNrYikpOworCQljZGZfbmJ1Zl9wdXRfdGFpbChuZXdfc2tiLCBjZGZfbmJ1Zl9sZW4oc2tiKSk7CisJCWFuYmRhdGFfbmV3ICs9IGNkZl9uYnVmX2xlbihza2IpOworCQljZGZfbmJ1Zl9mcmVlKHNrYik7CisJCXNrYiA9IGNkZl9uYnVmX3F1ZXVlX3JlbW92ZShyeF9zZ19xdWV1ZSk7CisJfSB3aGlsZSAoc2tiICE9IE5VTEwpOworCisJUkVTRVRfUlhfU0dfQ09ORklHKHRhcmdldCk7CisJcmV0dXJuIG5ld19za2I7CisKK19mYWlsZWQ6CisKKwl3aGlsZSAoKHNrYiA9IGNkZl9uYnVmX3F1ZXVlX3JlbW92ZShyeF9zZ19xdWV1ZSkpICE9IE5VTEwpIHsKKwkJY2RmX25idWZfZnJlZShza2IpOworCX0KKworCVJFU0VUX1JYX1NHX0NPTkZJRyh0YXJnZXQpOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK0NERl9TVEFUVVMgaHRjX3J4X2NvbXBsZXRpb25faGFuZGxlcih2b2lkICpDb250ZXh0LCBjZGZfbmJ1Zl90IG5ldGJ1ZiwKKwkJCQkgICB1aW50OF90IHBpcGVJRCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlIVENfRlJBTUVfSERSICpIdGNIZHI7CisJSFRDX1RBUkdFVCAqdGFyZ2V0ID0gKEhUQ19UQVJHRVQgKikgQ29udGV4dDsKKwl1aW50OF90ICpuZXRkYXRhOworCXVpbnQzMl90IG5ldGxlbjsKKwlIVENfRU5EUE9JTlQgKnBFbmRwb2ludDsKKwlIVENfUEFDS0VUICpwUGFja2V0OworCUFfVUlOVDE2IHBheWxvYWRMZW47CisJdWludDMyX3QgdHJhaWxlcmxlbiA9IDA7CisJQV9VSU5UOCBodGNfZXBfaWQ7CisKKyNpZmRlZiBSWF9TR19TVVBQT1JUCisJTE9DS19IVENfUlgodGFyZ2V0KTsKKwlpZiAodGFyZ2V0LT5Jc1J4U2dJbnByb2dyZXNzKSB7CisJCXRhcmdldC0+Q3VyUnhTZ1RvdGFsTGVuICs9IGNkZl9uYnVmX2xlbihuZXRidWYpOworCQljZGZfbmJ1Zl9xdWV1ZV9hZGQoJnRhcmdldC0+UnhTZ1F1ZXVlLCBuZXRidWYpOworCQlpZiAodGFyZ2V0LT5DdXJSeFNnVG90YWxMZW4gPT0gdGFyZ2V0LT5FeHBSeFNnVG90YWxMZW4pIHsKKwkJCW5ldGJ1ZiA9IHJ4X3NnX3RvX3NpbmdsZV9uZXRidWYodGFyZ2V0KTsKKwkJCWlmIChuZXRidWYgPT0gTlVMTCkgeworCQkJCVVOTE9DS19IVENfUlgodGFyZ2V0KTsKKwkJCQlnb3RvIF9vdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQluZXRidWYgPSBOVUxMOworCQkJVU5MT0NLX0hUQ19SWCh0YXJnZXQpOworCQkJZ290byBfb3V0OworCQl9CisJfQorCVVOTE9DS19IVENfUlgodGFyZ2V0KTsKKyNlbmRpZgorCisJbmV0ZGF0YSA9IGNkZl9uYnVmX2RhdGEobmV0YnVmKTsKKwluZXRsZW4gPSBjZGZfbmJ1Zl9sZW4obmV0YnVmKTsKKworCUh0Y0hkciA9IChIVENfRlJBTUVfSERSICopIG5ldGRhdGE7CisKKwlkbyB7CisKKwkJaHRjX2VwX2lkID0gSFRDX0dFVF9GSUVMRChIdGNIZHIsIEhUQ19GUkFNRV9IRFIsIEVORFBPSU5USUQpOworCisJCWlmIChodGNfZXBfaWQgPj0gRU5EUE9JTlRfTUFYKSB7CisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkJKCJIVEMgUng6IGludmFsaWQgRW5kcG9pbnRJRD0lZFxuIiwKKwkJCQkJIGh0Y19lcF9pZCkpOworCQkJZGVidWdfZHVtcF9ieXRlcygoQV9VSU5UOCAqKSBIdGNIZHIsCisJCQkJCSBzaXplb2YoSFRDX0ZSQU1FX0hEUiksICJCQUQgSFRDIEhlYWRlciIpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQlDREZfQlVHKDApOworCQkJYnJlYWs7CisJCX0KKworCQlwRW5kcG9pbnQgPSAmdGFyZ2V0LT5FbmRQb2ludFtodGNfZXBfaWRdOworCisJCS8qCisJCSAqIElmIHRoaXMgZW5kcG9pbnQgdGhhdCByZWNlaXZlZCBhIG1lc3NhZ2UgZnJvbSB0aGUgdGFyZ2V0IGhhcworCQkgKiBhIHRvLXRhcmdldCBISUYgcGlwZSB3aG9zZSBzZW5kIGNvbXBsZXRpb25zIGFyZSBwb2xsZWQgcmF0aGVyCisJCSAqIHRoYW4gaW50ZXJydXB0LWRyaXZlbiwgdGhpcyBpcyBhIGdvb2QgcG9pbnQgdG8gYXNrIEhJRiB0byBjaGVjaworCQkgKiB3aGV0aGVyIGl0IGhhcyBhbnkgY29tcGxldGVkIHNlbmRzIHRvIGhhbmRsZS4KKwkJICovCisJCWlmIChwRW5kcG9pbnQtPnVsX2lzX3BvbGxlZCkgeworCQkJaHRjX3NlbmRfY29tcGxldGVfY2hlY2socEVuZHBvaW50LCAxKTsKKwkJfQorCisJCXBheWxvYWRMZW4gPSBIVENfR0VUX0ZJRUxEKEh0Y0hkciwgSFRDX0ZSQU1FX0hEUiwgUEFZTE9BRExFTik7CisKKwkJaWYgKG5ldGxlbiA8IChwYXlsb2FkTGVuICsgSFRDX0hEUl9MRU5HVEgpKSB7CisjaWZkZWYgUlhfU0dfU1VQUE9SVAorCQkJTE9DS19IVENfUlgodGFyZ2V0KTsKKwkJCXRhcmdldC0+SXNSeFNnSW5wcm9ncmVzcyA9IHRydWU7CisJCQljZGZfbmJ1Zl9xdWV1ZV9pbml0KCZ0YXJnZXQtPlJ4U2dRdWV1ZSk7CisJCQljZGZfbmJ1Zl9xdWV1ZV9hZGQoJnRhcmdldC0+UnhTZ1F1ZXVlLCBuZXRidWYpOworCQkJdGFyZ2V0LT5FeHBSeFNnVG90YWxMZW4gPSAocGF5bG9hZExlbiArIEhUQ19IRFJfTEVOR1RIKTsKKwkJCXRhcmdldC0+Q3VyUnhTZ1RvdGFsTGVuICs9IG5ldGxlbjsKKwkJCVVOTE9DS19IVENfUlgodGFyZ2V0KTsKKwkJCW5ldGJ1ZiA9IE5VTEw7CisJCQlicmVhazsKKyNlbHNlCisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkJKCJIVEMgUng6IGluc3VmZmljaWVudCBsZW5ndGgsIGdvdDolZCBleHBlY3RlZCA9JXp1XG4iLAorCQkJCQkgbmV0bGVuLCBwYXlsb2FkTGVuICsgSFRDX0hEUl9MRU5HVEgpKTsKKwkJCWRlYnVnX2R1bXBfYnl0ZXMoKEFfVUlOVDggKikgSHRjSGRyLAorCQkJCQkgc2l6ZW9mKEhUQ19GUkFNRV9IRFIpLAorCQkJCQkgIkJBRCBSWCBwYWNrZXQgbGVuZ3RoIik7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCUNERl9CVUcoMCk7CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisjaWZkZWYgSFRDX0VQX1NUQVRfUFJPRklMSU5HCisJCUxPQ0tfSFRDX1JYKHRhcmdldCk7CisJCUlOQ19IVENfRVBfU1RBVChwRW5kcG9pbnQsIFJ4UmVjZWl2ZWQsIDEpOworCQlVTkxPQ0tfSFRDX1JYKHRhcmdldCk7CisjZW5kaWYKKworCQkvKiBpZiAoSVNfVFhfQ1JFRElUX0ZMT1dfRU5BQkxFRChwRW5kcG9pbnQpKSB7ICovCisJCXsKKwkJCUFfVUlOVDggdGVtcDsKKwkJCUFfU1RBVFVTIHRlbXBfc3RhdHVzOworCQkJLyogZ2V0IGZsYWdzIHRvIGNoZWNrIGZvciB0cmFpbGVyICovCisJCQl0ZW1wID0gSFRDX0dFVF9GSUVMRChIdGNIZHIsIEhUQ19GUkFNRV9IRFIsIEZMQUdTKTsKKwkJCWlmICh0ZW1wICYgSFRDX0ZMQUdTX1JFQ1ZfVFJBSUxFUikgeworCQkJCS8qIGV4dHJhY3QgdGhlIHRyYWlsZXIgbGVuZ3RoICovCisJCQkJdGVtcCA9CisJCQkJCUhUQ19HRVRfRklFTEQoSHRjSGRyLCBIVENfRlJBTUVfSERSLAorCQkJCQkJICAgICAgQ09OVFJPTEJZVEVTMCk7CisJCQkJaWYgKCh0ZW1wIDwgc2l6ZW9mKEhUQ19SRUNPUkRfSERSKSkKKwkJCQkgICAgfHwgKHRlbXAgPiBwYXlsb2FkTGVuKSkgeworCQkJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkJCSgiaHRjX3J4X2NvbXBsZXRpb25faGFuZGxlciwgaW52YWxpZCBoZWFkZXIgKHBheWxvYWRsZW5ndGggc2hvdWxkIGJlIDolZCwgQ0JbMF0gaXM6JWQpXG4iLAorCQkJCQkJcGF5bG9hZExlbiwgdGVtcCkpOworCQkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXRyYWlsZXJsZW4gPSB0ZW1wOworCQkJCS8qIHByb2Nlc3MgdHJhaWxlciBkYXRhIHRoYXQgZm9sbG93cyBIRFIgKyBhcHBsaWNhdGlvbiBwYXlsb2FkICovCisJCQkJdGVtcF9zdGF0dXMgPSBodGNfcHJvY2Vzc190cmFpbGVyKHRhcmdldCwKKwkJCQkJCQkgICAgICgoQV9VSU5UOCAqKSBIdGNIZHIgKworCQkJCQkJCSAgICAgIEhUQ19IRFJfTEVOR1RIICsKKwkJCQkJCQkgICAgICBwYXlsb2FkTGVuIC0gdGVtcCksCisJCQkJCQkJICAgICB0ZW1wLCBodGNfZXBfaWQpOworCQkJCWlmIChBX0ZBSUxFRCh0ZW1wX3N0YXR1cykpIHsKKwkJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQorCQl9CisKKwkJaWYgKCgoaW50KXBheWxvYWRMZW4gLSAoaW50KXRyYWlsZXJsZW4pIDw9IDApIHsKKwkJCS8qIHplcm8gbGVuZ3RoIHBhY2tldCB3aXRoIHRyYWlsZXIgZGF0YSwganVzdCBkcm9wIHRoZXNlICovCisJCQlicmVhazsKKwkJfQorCisJCWlmIChodGNfZXBfaWQgPT0gRU5EUE9JTlRfMCkgeworCQkJQV9VSU5UMTYgbWVzc2FnZV9pZDsKKwkJCUhUQ19VTktOT1dOX01TRyAqaHRjX21zZzsKKwkJCWludCB3b3dfbmFjayA9IDA7CisKKwkJCS8qIHJlbW92ZSBIVEMgaGVhZGVyICovCisJCQljZGZfbmJ1Zl9wdWxsX2hlYWQobmV0YnVmLCBIVENfSERSX0xFTkdUSCk7CisJCQluZXRkYXRhID0gY2RmX25idWZfZGF0YShuZXRidWYpOworCQkJbmV0bGVuID0gY2RmX25idWZfbGVuKG5ldGJ1Zik7CisKKwkJCWh0Y19tc2cgPSAoSFRDX1VOS05PV05fTVNHICopIG5ldGRhdGE7CisJCQltZXNzYWdlX2lkID0KKwkJCQlIVENfR0VUX0ZJRUxEKGh0Y19tc2csIEhUQ19VTktOT1dOX01TRywgTUVTU0FHRUlEKTsKKworCQkJc3dpdGNoIChtZXNzYWdlX2lkKSB7CisJCQlkZWZhdWx0OgorCQkJCS8qIGhhbmRsZSBIVEMgY29udHJvbCBtZXNzYWdlICovCisJCQkJaWYgKHRhcmdldC0+Q3RybFJlc3BvbnNlUHJvY2Vzc2luZykgeworCQkJCQkvKiB0aGlzIGlzIGEgZmF0YWwgZXJyb3IsIHRhcmdldCBzaG91bGQgbm90IGJlIHNlbmRpbmcgdW5zb2xpY2l0ZWQgbWVzc2FnZXMKKwkJCQkJICogb24gdGhlIGVuZHBvaW50IDAgKi8KKwkJCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsCisJCQkJCQkJKCJIVEMgUnggQ3RybCBzdGlsbCBwcm9jZXNzaW5nXG4iKSk7CisJCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlMT0NLX0hUQ19SWCh0YXJnZXQpOworCQkJCXRhcmdldC0+Q3RybFJlc3BvbnNlTGVuZ3RoID0KKwkJCQkJbWluKChpbnQpbmV0bGVuLAorCQkJCQkgICAgSFRDX01BWF9DT05UUk9MX01FU1NBR0VfTEVOR1RIKTsKKwkJCQlBX01FTUNQWSh0YXJnZXQtPkN0cmxSZXNwb25zZUJ1ZmZlciwgbmV0ZGF0YSwKKwkJCQkJIHRhcmdldC0+Q3RybFJlc3BvbnNlTGVuZ3RoKTsKKwkJCQlVTkxPQ0tfSFRDX1JYKHRhcmdldCk7CisKKwkJCQljZGZfc2VtYXBob3JlX3JlbGVhc2UodGFyZ2V0LT5vc2RldiwKKwkJCQkJCSAgICAgICZ0YXJnZXQtPgorCQkJCQkJICAgICAgQ3RybFJlc3BvbnNlVmFsaWQpOworCQkJCWJyZWFrOworCQkJY2FzZSBIVENfTVNHX1NFTkRfU1VTUEVORF9DT01QTEVURToKKwkJCQl3b3dfbmFjayA9IDA7CisJCQkJTE9DS19IVENfQ1JFRElUKHRhcmdldCk7CisJCQkJaHRjX2NyZWRpdF9yZWNvcmQoSFRDX1NVU1BFTkRfQUNLLAorCQkJCQlwRW5kcG9pbnQtPlR4Q3JlZGl0cywKKwkJCQkJSFRDX1BBQ0tFVF9RVUVVRV9ERVBUSCgKKwkJCQkJCSZwRW5kcG9pbnQtPlR4UXVldWUpKTsKKwkJCQlVTkxPQ0tfSFRDX0NSRURJVCh0YXJnZXQpOworCQkJCXRhcmdldC0+SFRDSW5pdEluZm8uCisJCQkJVGFyZ2V0U2VuZFN1c3BlbmRDb21wbGV0ZSgodm9pZCAqKQorCQkJCQkJCSAgJndvd19uYWNrKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSFRDX01TR19OQUNLX1NVU1BFTkQ6CisJCQkJd293X25hY2sgPSAxOworCQkJCUxPQ0tfSFRDX0NSRURJVCh0YXJnZXQpOworCQkJCWh0Y19jcmVkaXRfcmVjb3JkKEhUQ19TVVNQRU5EX0FDSywKKwkJCQkJcEVuZHBvaW50LT5UeENyZWRpdHMsCisJCQkJCUhUQ19QQUNLRVRfUVVFVUVfREVQVEgoCisJCQkJCQkmcEVuZHBvaW50LT5UeFF1ZXVlKSk7CisJCQkJVU5MT0NLX0hUQ19DUkVESVQodGFyZ2V0KTsKKworCQkJCXRhcmdldC0+SFRDSW5pdEluZm8uCisJCQkJVGFyZ2V0U2VuZFN1c3BlbmRDb21wbGV0ZSgodm9pZCAqKQorCQkJCQkJCSAgJndvd19uYWNrKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2RmX25idWZfZnJlZShuZXRidWYpOworCQkJbmV0YnVmID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogdGhlIGN1cnJlbnQgbWVzc2FnZSBiYXNlZCBISUYgYXJjaGl0ZWN0dXJlIGFsbG9jYXRlcyBuZXQgYnVmcyBmb3IgcmVjdiBwYWNrZXRzCisJCSAqIHNpbmNlIHRoaXMgbGF5ZXIgYnJpZGdlcyB0aGF0IEhJRiB0byB1cHBlciBsYXllcnMgLCB3aGljaCBleHBlY3RzIEhUQyBwYWNrZXRzLAorCQkgKiB3ZSBmb3JtIHRoZSBwYWNrZXRzIGhlcmUKKwkJICogVE9ET19GSVhNRSAqLworCQlwUGFja2V0ID0gYWxsb2NhdGVfaHRjX3BhY2tldF9jb250YWluZXIodGFyZ2V0KTsKKwkJaWYgKE5VTEwgPT0gcFBhY2tldCkgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwkJCWJyZWFrOworCQl9CisJCXBQYWNrZXQtPlN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJcFBhY2tldC0+RW5kcG9pbnQgPSBodGNfZXBfaWQ7CisJCXBQYWNrZXQtPnBQa3RDb250ZXh0ID0gbmV0YnVmOworCQlwUGFja2V0LT5wQnVmZmVyID0gY2RmX25idWZfZGF0YShuZXRidWYpICsgSFRDX0hEUl9MRU5HVEg7CisJCXBQYWNrZXQtPkFjdHVhbExlbmd0aCA9IG5ldGxlbiAtIEhUQ19IRUFERVJfTEVOIC0gdHJhaWxlcmxlbjsKKworCQljZGZfbmJ1Zl9wdWxsX2hlYWQobmV0YnVmLCBIVENfSEVBREVSX0xFTik7CisJCWNkZl9uYnVmX3NldF9wa3RsZW4obmV0YnVmLCBwUGFja2V0LT5BY3R1YWxMZW5ndGgpOworCisJCXJlY3ZfcGFja2V0X2NvbXBsZXRpb24odGFyZ2V0LCBwRW5kcG9pbnQsIHBQYWNrZXQpOworCQkvKiByZWNvdmVyIHRoZSBwYWNrZXQgY29udGFpbmVyICovCisJCWZyZWVfaHRjX3BhY2tldF9jb250YWluZXIodGFyZ2V0LCBwUGFja2V0KTsKKwkJbmV0YnVmID0gTlVMTDsKKworCX0gd2hpbGUgKGZhbHNlKTsKKworI2lmZGVmIFJYX1NHX1NVUFBPUlQKK19vdXQ6CisjZW5kaWYKKworCWlmIChuZXRidWYgIT0gTlVMTCkgeworCQljZGZfbmJ1Zl9mcmVlKG5ldGJ1Zik7CisJfQorCisJcmV0dXJuIHN0YXR1czsKKworfQorCitBX1NUQVRVUyBodGNfYWRkX3JlY2VpdmVfcGt0X211bHRpcGxlKEhUQ19IQU5ETEUgSFRDSGFuZGxlLAorCQkJCSAgICAgIEhUQ19QQUNLRVRfUVVFVUUgKnBQa3RRdWV1ZSkKK3sKKwlIVENfVEFSR0VUICp0YXJnZXQgPSBHRVRfSFRDX1RBUkdFVF9GUk9NX0hBTkRMRShIVENIYW5kbGUpOworCUhUQ19FTkRQT0lOVCAqcEVuZHBvaW50OworCUhUQ19QQUNLRVQgKnBGaXJzdFBhY2tldDsKKwlBX1NUQVRVUyBzdGF0dXMgPSBBX09LOworCUhUQ19QQUNLRVQgKnBQYWNrZXQ7CisKKwlwRmlyc3RQYWNrZXQgPSBodGNfZ2V0X3BrdF9hdF9oZWFkKHBQa3RRdWV1ZSk7CisKKwlpZiAoTlVMTCA9PSBwRmlyc3RQYWNrZXQpIHsKKwkJQV9BU1NFUlQoZmFsc2UpOworCQlyZXR1cm4gQV9FSU5WQUw7CisJfQorCisJQVJfREVCVUdfQVNTRVJUKHBGaXJzdFBhY2tldC0+RW5kcG9pbnQgPCBFTkRQT0lOVF9NQVgpOworCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19SRUNWLAorCQkJKCIrLSBodGNfYWRkX3JlY2VpdmVfcGt0X211bHRpcGxlIDogZW5kUG9pbnRJZDogJWQsIGNudDolZCwgbGVuZ3RoOiAlZFxuIiwKKwkJCSBwRmlyc3RQYWNrZXQtPkVuZHBvaW50LAorCQkJIEhUQ19QQUNLRVRfUVVFVUVfREVQVEgocFBrdFF1ZXVlKSwKKwkJCSBwRmlyc3RQYWNrZXQtPkJ1ZmZlckxlbmd0aCkpOworCisJcEVuZHBvaW50ID0gJnRhcmdldC0+RW5kUG9pbnRbcEZpcnN0UGFja2V0LT5FbmRwb2ludF07CisKKwlMT0NLX0hUQ19SWCh0YXJnZXQpOworCisJZG8geworCisJCWlmIChIVENfU1RPUFBJTkcodGFyZ2V0KSkgeworCQkJc3RhdHVzID0gQV9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogc3RvcmUgcmVjZWl2ZSBwYWNrZXRzICovCisJCUhUQ19QQUNLRVRfUVVFVUVfVFJBTlNGRVJfVE9fVEFJTCgmcEVuZHBvaW50LT5SeEJ1ZmZlckhvbGRRdWV1ZSwKKwkJCQkJCSAgcFBrdFF1ZXVlKTsKKworCX0gd2hpbGUgKGZhbHNlKTsKKworCVVOTE9DS19IVENfUlgodGFyZ2V0KTsKKworCWlmIChBX0ZBSUxFRChzdGF0dXMpKSB7CisJCS8qIHdhbGsgdGhyb3VnaCBxdWV1ZSBhbmQgbWFyayBlYWNoIG9uZSBjYW5jZWxlZCAqLworCQlIVENfUEFDS0VUX1FVRVVFX0lURVJBVEVfQUxMT1dfUkVNT1ZFKHBQa3RRdWV1ZSwgcFBhY2tldCkgeworCQkJcFBhY2tldC0+U3RhdHVzID0gQV9FQ0FOQ0VMRUQ7CisJCX0KKwkJSFRDX1BBQ0tFVF9RVUVVRV9JVEVSQVRFX0VORDsKKworCQlkb19yZWN2X2NvbXBsZXRpb24ocEVuZHBvaW50LCBwUGt0UXVldWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK0FfU1RBVFVTIGh0Y19hZGRfcmVjZWl2ZV9wa3QoSFRDX0hBTkRMRSBIVENIYW5kbGUsIEhUQ19QQUNLRVQgKnBQYWNrZXQpCit7CisJSFRDX1BBQ0tFVF9RVUVVRSBxdWV1ZTsKKwlJTklUX0hUQ19QQUNLRVRfUVVFVUVfQU5EX0FERCgmcXVldWUsIHBQYWNrZXQpOworCXJldHVybiBodGNfYWRkX3JlY2VpdmVfcGt0X211bHRpcGxlKEhUQ0hhbmRsZSwgJnF1ZXVlKTsKK30KKwordm9pZCBodGNfZmx1c2hfcnhfaG9sZF9xdWV1ZShIVENfVEFSR0VUICp0YXJnZXQsIEhUQ19FTkRQT0lOVCAqcEVuZHBvaW50KQoreworCUhUQ19QQUNLRVQgKnBQYWNrZXQ7CisJSFRDX1BBQ0tFVF9RVUVVRSBjb250YWluZXI7CisKKwlMT0NLX0hUQ19SWCh0YXJnZXQpOworCisJd2hpbGUgKDEpIHsKKwkJcFBhY2tldCA9IGh0Y19wYWNrZXRfZGVxdWV1ZSgmcEVuZHBvaW50LT5SeEJ1ZmZlckhvbGRRdWV1ZSk7CisJCWlmIChOVUxMID09IHBQYWNrZXQpIHsKKwkJCWJyZWFrOworCQl9CisJCVVOTE9DS19IVENfUlgodGFyZ2V0KTsKKwkJcFBhY2tldC0+U3RhdHVzID0gQV9FQ0FOQ0VMRUQ7CisJCXBQYWNrZXQtPkFjdHVhbExlbmd0aCA9IDA7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfUkVDViwKKwkJCQkoIiAgRmx1c2hpbmcgUlggcGFja2V0OiVwLCBsZW5ndGg6JWQsIGVwOiVkIFxuIiwKKwkJCQkgcFBhY2tldCwgcFBhY2tldC0+QnVmZmVyTGVuZ3RoLAorCQkJCSBwUGFja2V0LT5FbmRwb2ludCkpOworCQlJTklUX0hUQ19QQUNLRVRfUVVFVUVfQU5EX0FERCgmY29udGFpbmVyLCBwUGFja2V0KTsKKwkJLyogZ2l2ZSB0aGUgcGFja2V0IGJhY2sgKi8KKwkJZG9fcmVjdl9jb21wbGV0aW9uKHBFbmRwb2ludCwgJmNvbnRhaW5lcik7CisJCUxPQ0tfSFRDX1JYKHRhcmdldCk7CisJfQorCisJVU5MT0NLX0hUQ19SWCh0YXJnZXQpOworfQorCit2b2lkIGh0Y19yZWN2X2luaXQoSFRDX1RBUkdFVCAqdGFyZ2V0KQoreworCS8qIEluaXRpYWxpemUgQ3RybFJlc3BvbnNlVmFsaWQgdG8gYmxvY2sgKi8KKwljZGZfc2VtYXBob3JlX2luaXQoJnRhcmdldC0+Q3RybFJlc3BvbnNlVmFsaWQpOworCWNkZl9zZW1hcGhvcmVfYWNxdWlyZSh0YXJnZXQtPm9zZGV2LCAmdGFyZ2V0LT5DdHJsUmVzcG9uc2VWYWxpZCk7Cit9CisKKy8qIHBvbGxpbmcgcm91dGluZSB0byB3YWl0IGZvciBhIGNvbnRyb2wgcGFja2V0IHRvIGJlIHJlY2VpdmVkICovCitBX1NUQVRVUyBodGNfd2FpdF9yZWN2X2N0cmxfbWVzc2FnZShIVENfVEFSR0VUICp0YXJnZXQpCit7CisvKiAgICBpbnQgY291bnQgPSBIVENfVEFSR0VUX01BWF9SRVNQT05TRV9QT0xMOyAqLworCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19UUkMsICgiK0hUQ1dhaXRDdHJsTWVzc2FnZVJlY3ZcbiIpKTsKKworCS8qIFdhaXQgZm9yIEJNSSByZXF1ZXN0L3Jlc3BvbnNlIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKGNkZl9zZW1hcGhvcmVfYWNxdWlyZSh0YXJnZXQtPm9zZGV2LCAmdGFyZ2V0LT5DdHJsUmVzcG9uc2VWYWxpZCkpIHsKKwl9CisKKwlMT0NLX0hUQ19SWCh0YXJnZXQpOworCS8qIGNhbGxlciB3aWxsIGNsZWFyIHRoaXMgZmxhZyAqLworCXRhcmdldC0+Q3RybFJlc3BvbnNlUHJvY2Vzc2luZyA9IHRydWU7CisKKwlVTkxPQ0tfSFRDX1JYKHRhcmdldCk7CisKKyNpZiAwCisJd2hpbGUgKGNvdW50ID4gMCkgeworCisJCUxPQ0tfSFRDX1JYKHRhcmdldCk7CisKKwkJaWYgKHRhcmdldC0+Q3RybFJlc3BvbnNlVmFsaWQpIHsKKwkJCXRhcmdldC0+Q3RybFJlc3BvbnNlVmFsaWQgPSBmYWxzZTsKKwkJCS8qIGNhbGxlciB3aWxsIGNsZWFyIHRoaXMgZmxhZyAqLworCQkJdGFyZ2V0LT5DdHJsUmVzcG9uc2VQcm9jZXNzaW5nID0gdHJ1ZTsKKwkJCVVOTE9DS19IVENfUlgodGFyZ2V0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJVU5MT0NLX0hUQ19SWCh0YXJnZXQpOworCisJCWNvdW50LS07CisJCUFfTVNMRUVQKEhUQ19UQVJHRVRfUkVTUE9OU0VfUE9MTF9NUyk7CisJfQorCisJaWYgKGNvdW50IDw9IDApIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsCisJCQkJKCItSFRDV2FpdEN0cmxNZXNzYWdlUmVjdjogVGltZW91dCFcbiIpKTsKKwkJcmV0dXJuIEFfRUNPTU07CisJfQorI2VuZGlmCisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1RSQywgKCItSFRDV2FpdEN0cmxNZXNzYWdlUmVjdiBzdWNjZXNzXG4iKSk7CisJcmV0dXJuIEFfT0s7Cit9CisKK3N0YXRpYyBBX1NUQVRVUyBodGNfcHJvY2Vzc190cmFpbGVyKEhUQ19UQVJHRVQgKnRhcmdldCwKKwkJCQkgICAgQV9VSU5UOCAqcEJ1ZmZlciwKKwkJCQkgICAgaW50IExlbmd0aCwgSFRDX0VORFBPSU5UX0lEIEZyb21FbmRwb2ludCkKK3sKKwlIVENfUkVDT1JEX0hEUiAqcFJlY29yZDsKKwlBX1VJTlQ4IGh0Y19yZWNfaWQ7CisJQV9VSU5UOCBodGNfcmVjX2xlbjsKKwlBX1VJTlQ4ICpwUmVjb3JkQnVmOworCUFfVUlOVDggKnBPcmlnQnVmZmVyOworCWludCBvcmlnTGVuZ3RoOworCUFfU1RBVFVTIHN0YXR1czsKKworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfUkVDViwKKwkJCSgiK2h0Y19wcm9jZXNzX3RyYWlsZXIgKGxlbmd0aDolZCkgXG4iLCBMZW5ndGgpKTsKKworCWlmIChBUl9ERUJVR19MVkxfQ0hFQ0soQVRIX0RFQlVHX1JFQ1YpKSB7CisJCUFSX0RFQlVHX1BSSU5UQlVGKHBCdWZmZXIsIExlbmd0aCwgIlJlY3YgVHJhaWxlciIpOworCX0KKworCXBPcmlnQnVmZmVyID0gcEJ1ZmZlcjsKKwlvcmlnTGVuZ3RoID0gTGVuZ3RoOworCXN0YXR1cyA9IEFfT0s7CisKKwl3aGlsZSAoTGVuZ3RoID4gMCkgeworCisJCWlmIChMZW5ndGggPCBzaXplb2YoSFRDX1JFQ09SRF9IRFIpKSB7CisJCQlzdGF0dXMgPSBBX0VQUk9UTzsKKwkJCWJyZWFrOworCQl9CisJCS8qIHRoZXNlIGFyZSBieXRlIGFsaWduZWQgc3RydWN0cyAqLworCQlwUmVjb3JkID0gKEhUQ19SRUNPUkRfSERSICopIHBCdWZmZXI7CisJCUxlbmd0aCAtPSBzaXplb2YoSFRDX1JFQ09SRF9IRFIpOworCQlwQnVmZmVyICs9IHNpemVvZihIVENfUkVDT1JEX0hEUik7CisKKwkJaHRjX3JlY19sZW4gPSBIVENfR0VUX0ZJRUxEKHBSZWNvcmQsIEhUQ19SRUNPUkRfSERSLCBMRU5HVEgpOworCQlodGNfcmVjX2lkID0gSFRDX0dFVF9GSUVMRChwUmVjb3JkLCBIVENfUkVDT1JEX0hEUiwgUkVDT1JESUQpOworCisJCWlmIChodGNfcmVjX2xlbiA+IExlbmd0aCkgeworCQkJLyogbm8gcm9vbSBsZWZ0IGluIGJ1ZmZlciBmb3IgcmVjb3JkICovCisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkJKCIgaW52YWxpZCByZWNvcmQgbGVuZ3RoOiAlZCAoaWQ6JWQpIGJ1ZmZlciBoYXM6ICVkIGJ5dGVzIGxlZnQgXG4iLAorCQkJCQkgaHRjX3JlY19sZW4sIGh0Y19yZWNfaWQsIExlbmd0aCkpOworCQkJc3RhdHVzID0gQV9FUFJPVE87CisJCQlicmVhazsKKwkJfQorCQkvKiBzdGFydCBvZiByZWNvcmQgZm9sbG93cyB0aGUgaGVhZGVyICovCisJCXBSZWNvcmRCdWYgPSBwQnVmZmVyOworCisJCXN3aXRjaCAoaHRjX3JlY19pZCkgeworCQljYXNlIEhUQ19SRUNPUkRfQ1JFRElUUzoKKwkJCUFSX0RFQlVHX0FTU0VSVChodGNfcmVjX2xlbiA+PQorCQkJCQlzaXplb2YoSFRDX0NSRURJVF9SRVBPUlQpKTsKKwkJCWh0Y19wcm9jZXNzX2NyZWRpdF9ycHQodGFyZ2V0LAorCQkJCQkgICAgICAgKEhUQ19DUkVESVRfUkVQT1JUICopIHBSZWNvcmRCdWYsCisJCQkJCSAgICAgICBodGNfcmVjX2xlbiAvCisJCQkJCSAgICAgICAoc2l6ZW9mKEhUQ19DUkVESVRfUkVQT1JUKSksCisJCQkJCSAgICAgICBGcm9tRW5kcG9pbnQpOworCQkJYnJlYWs7CisKKyNpZmRlZiBISUZfU0RJTworCQljYXNlIEhUQ19SRUNPUkRfTE9PS0FIRUFEOgorCQkJLyogUHJvY2VzcyBpbiBISUYgbGF5ZXIgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgSFRDX1JFQ09SRF9MT09LQUhFQURfQlVORExFOgorCQkJLyogUHJvY2VzcyBpbiBISUYgbGF5ZXIgKi8KKwkJCWJyZWFrOworI2VuZGlmIC8qIEhJRl9TRElPICovCisKKwkJZGVmYXVsdDoKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkoIiBIVEMgdW5oYW5kbGVkIHJlY29yZDogaWQ6JWQgbGVuZ3RoOiVkIFxuIiwKKwkJCQkJIGh0Y19yZWNfaWQsIGh0Y19yZWNfbGVuKSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChBX0ZBSUxFRChzdGF0dXMpKSB7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGFkdmFuY2UgYnVmZmVyIHBhc3QgdGhpcyByZWNvcmQgZm9yIG5leHQgdGltZSBhcm91bmQgKi8KKwkJcEJ1ZmZlciArPSBodGNfcmVjX2xlbjsKKwkJTGVuZ3RoIC09IGh0Y19yZWNfbGVuOworCX0KKworCWlmIChBX0ZBSUxFRChzdGF0dXMpKSB7CisJCWRlYnVnX2R1bXBfYnl0ZXMocE9yaWdCdWZmZXIsIG9yaWdMZW5ndGgsICJCQUQgUmVjdiBUcmFpbGVyIik7CisJfQorCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19SRUNWLCAoIi1odGNfcHJvY2Vzc190cmFpbGVyIFxuIikpOworCXJldHVybiBzdGF0dXM7CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvaHRjL2h0Y19zZW5kLmMgYi9jb3JlL2h0Yy9odGNfc2VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTE1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2h0Yy9odGNfc2VuZC5jCkBAIC0wLDAgKzEsMTg1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgImh0Y19kZWJ1Zy5oIgorI2luY2x1ZGUgImh0Y19pbnRlcm5hbC5oIgorI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90ICovCisjaW5jbHVkZSA8Y2RmX21lbW9yeS5oPiAgICAgICAgIC8qIGNkZl9tZW1fbWFsbG9jICovCisjaW5jbHVkZSA8Y2RzX2dldF9iaW4uaD4KKyNpbmNsdWRlICJlcHBpbmdfbWFpbi5oIgorCisvKiAjZGVmaW5lIFVTQl9ISUZfU0lOR0xFX1BJUEVfREFUQV9TQ0hFRCAqLworLyogI2lmZGVmIFVTQl9ISUZfU0lOR0xFX1BJUEVfREFUQV9TQ0hFRCAqLworI2RlZmluZSBEQVRBX0VQX1NJWkUgNAorLyogI2VuZGlmICovCisjZGVmaW5lIEhUQ19EQVRBX1JFU09VUkNFX1RIUlMgMjU2CisjZGVmaW5lIEhUQ19EQVRBX01JTkRFU0NfUEVSUEFDS0VUIDIKKwordHlwZWRlZiBlbnVtIF9IVENfU0VORF9RVUVVRV9SRVNVTFQgeworCUhUQ19TRU5EX1FVRVVFX09LID0gMCwgIC8qIHBhY2tldCB3YXMgcXVldWVkICovCisJSFRDX1NFTkRfUVVFVUVfRFJPUCA9IDEsICAgICAgICAvKiB0aGlzIHBhY2tldCBzaG91bGQgYmUgZHJvcHBlZCAqLworfSBIVENfU0VORF9RVUVVRV9SRVNVTFQ7CisKKyNpZm5kZWYgREVCVUdfQ1JFRElUCisjZGVmaW5lIERFQlVHX0NSRURJVCAwCisjZW5kaWYKKworI2lmIERFQlVHX0NSRURJVAorLyogYml0IG1hc2sgdG8gZW5hYmxlIGRlYnVnIGNlcnRhaW4gZW5kcG9pbnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBlcF9kZWJ1Z19tYXNrID0KKwkoMSA8PCBFTkRQT0lOVF8wKSB8ICgxIDw8IEVORFBPSU5UXzEpIHwgKDEgPDwgRU5EUE9JTlRfMik7CisjZW5kaWYKKworLyogSFRDIENvbnRyb2wgUGF0aCBDcmVkaXQgSGlzdG9yeSAqLworQV9VSU5UMzIgZ19odGNfY3JlZGl0X2hpc3RvcnlfaWR4ID0gMDsKK0hUQ19DUkVESVRfSElTVE9SWSBodGNfY3JlZGl0X2hpc3RvcnlfYnVmZmVyW0hUQ19DUkVESVRfSElTVE9SWV9NQVhdOworCisvKioKKyAqIGh0Y19jcmVkaXRfcmVjb3JkKCkgLSByZWNvcmRzIHR4IHF1ZSBzdGF0ZSAmIGNyZWRpdCB0cmFuc2FjdGlvbnMKKyAqIEB0eXBlOgkJdHlwZSBvZiBlY2hhbmdlIGNhbiBiZSBIVENfUkVRVUVTVF9DUkVESVQKKyAqCQkJb3IgSFRDX1BST0NFU1NfQ1JFRElUX1JFUE9SVAorICogQHR4X2NyZWRpdHM6CQljdXJyZW50IG51bWJlciBvZiB0eF9jcmVkaXRzCisgKiBAaHRjX3R4X3F1ZXVlX2RlcHRoOgljdXJyZW50IGhjdCB0eCBxdWV1ZSBkZXB0aAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVjb3JkcyB0aGUgY3JlZGl0cyBhbmQgcGVuZGluZyBjb21tYW5kcyB3aGVuZXZlciBhIGNvbW1hbmQgaXMKKyAqIHNlbnQgb3IgY3JlZGl0cyBhcmUgcmV0dXJuZWQuICBDYWxsIHRoaXMgYWZ0ZXIgdGhlIGNyZWRpdHMgaGF2ZSBiZWVuIHVwZGF0ZWQKKyAqIGFjY29yZGluZyB0byB0aGUgdHJhbnNhY3Rpb24uICBDYWxsIHRoaXMgYmVmb3JlIGRlcXVlaW5nIGNvbW1hbmRzLgorICoKKyAqIENvbnNpZGVyIG1ha2luZyB0aGlzIGZ1bmN0aW9uIGFjY2VwdCBhbiBIVENfRU5EUE9JTlQgYW5kIGZpbmQgdGhlIGN1cnJlbnQKKyAqIGNyZWRpdHMgYW5kIHF1ZXVlIGRlcHRoIGl0c2VsZi4KKyAqCisgKiBDb25zaWRlciBtb3ZpbmcgdGhlIExPQ0tfSFRDX0NSRURJVCh0YXJnZXQpOyBsb2dpYyBpbnRvIHRoaXMgZnVuY3Rpb24gYXMgd2VsbC4KKyAqLwordm9pZCBodGNfY3JlZGl0X3JlY29yZChodGNfY3JlZGl0X2V4Y2hhbmdlX3R5cGUgdHlwZSwgdWludDMyX3QgdHhfY3JlZGl0LAorCQkgICAgICAgdWludDMyX3QgaHRjX3R4X3F1ZXVlX2RlcHRoKSB7CisJaWYgKEhUQ19DUkVESVRfSElTVE9SWV9NQVggPD0gZ19odGNfY3JlZGl0X2hpc3RvcnlfaWR4KQorCQlnX2h0Y19jcmVkaXRfaGlzdG9yeV9pZHggPSAwOworCisJaHRjX2NyZWRpdF9oaXN0b3J5X2J1ZmZlcltnX2h0Y19jcmVkaXRfaGlzdG9yeV9pZHhdLnR5cGUgPSB0eXBlOworCWh0Y19jcmVkaXRfaGlzdG9yeV9idWZmZXJbZ19odGNfY3JlZGl0X2hpc3RvcnlfaWR4XS50aW1lID0KKwkJY2RmX2dldF9sb2dfdGltZXN0YW1wKCk7CisJaHRjX2NyZWRpdF9oaXN0b3J5X2J1ZmZlcltnX2h0Y19jcmVkaXRfaGlzdG9yeV9pZHhdLnR4X2NyZWRpdCA9CisJCXR4X2NyZWRpdDsKKwlodGNfY3JlZGl0X2hpc3RvcnlfYnVmZmVyW2dfaHRjX2NyZWRpdF9oaXN0b3J5X2lkeF0uaHRjX3R4X3F1ZXVlX2RlcHRoID0KKwkJaHRjX3R4X3F1ZXVlX2RlcHRoOworCWdfaHRjX2NyZWRpdF9oaXN0b3J5X2lkeCsrOworCisjaWZkZWYgUUNBX1dJRklfM18wX0VNVQorCWlmICh0eXBlID09IEhUQ19SRVFVRVNUX0NSRURJVCkKKwkJcHJpbnRrKCJcbnJlcXVlc3RfY3JlZGl0cy0+IGN1cnJlbnRfY3JlZGl0ICVkLCBwZW5kaW5nIGNvbW1hbmRzICVkXG4iLAorCQkJdHhfY3JlZGl0LCBodGNfdHhfcXVldWVfZGVwdGgpOworCisJZWxzZSBpZiAodHlwZSA9PSBIVENfUFJPQ0VTU19DUkVESVRfUkVQT1JUKQorCQlwcmludGsoIlxuY3JlZGl0X3JlcG9ydDwtIGN1cnJlbnRfY3JlZGl0ICVkLCBwZW5kaW5nIGNvbW1hbmRzICVkXG4iLAorCQkJdHhfY3JlZGl0LCBodGNfdHhfcXVldWVfZGVwdGgpOworI2VuZGlmCit9CisKK3ZvaWQgaHRjX2R1bXBfY291bnRlcl9pbmZvKEhUQ19IQU5ETEUgSFRDSGFuZGxlKQoreworCUhUQ19UQVJHRVQgKnRhcmdldCA9IEdFVF9IVENfVEFSR0VUX0ZST01fSEFORExFKEhUQ0hhbmRsZSk7CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCSgiXG4lczogY2Vfc2VuZF9jbnQgPSAlZCwgVFhfY29tcF9jbnQgPSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgdGFyZ2V0LT5jZV9zZW5kX2NudCwgdGFyZ2V0LT5UWF9jb21wX2NudCkpOworfQorCit2b2lkIGh0Y19nZXRfY29udHJvbF9lbmRwb2ludF90eF9ob3N0X2NyZWRpdHMoSFRDX0hBTkRMRSBIVENIYW5kbGUsIGludCAqY3JlZGl0cykKK3sKKwlIVENfVEFSR0VUICp0YXJnZXQgPSBHRVRfSFRDX1RBUkdFVF9GUk9NX0hBTkRMRShIVENIYW5kbGUpOworCUhUQ19FTkRQT0lOVCAqcEVuZHBvaW50OworCWludCBpOworCisJaWYgKCFjcmVkaXRzIHx8ICF0YXJnZXQpIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsICgiJXM6IGludmFsaWQgYXJncyIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisKKwkqY3JlZGl0cyA9IDA7CisJTE9DS19IVENfVFgodGFyZ2V0KTsKKwlmb3IgKGkgPSAwOyBpIDwgRU5EUE9JTlRfTUFYOyBpKyspIHsKKwkJcEVuZHBvaW50ID0gJnRhcmdldC0+RW5kUG9pbnRbaV07CisJCWlmIChwRW5kcG9pbnQtPlNlcnZpY2VJRCA9PSBXTUlfQ09OVFJPTF9TVkMpIHsKKwkJCSpjcmVkaXRzID0gcEVuZHBvaW50LT5UeENyZWRpdHM7CisJCQlicmVhazsKKwkJfQorCX0KKwlVTkxPQ0tfSFRDX1RYKHRhcmdldCk7Cit9CisKK3N0YXRpYyBJTkxJTkUgdm9pZCByZXN0b3JlX3R4X3BhY2tldChIVENfVEFSR0VUICp0YXJnZXQsIEhUQ19QQUNLRVQgKnBQYWNrZXQpCit7CisJaWYgKHBQYWNrZXQtPlBrdEluZm8uQXNUeC5GbGFncyAmIEhUQ19UWF9QQUNLRVRfRkxBR19GSVhVUF9ORVRCVUYpIHsKKwkJY2RmX25idWZfdCBuZXRidWYgPSBHRVRfSFRDX1BBQ0tFVF9ORVRfQlVGX0NPTlRFWFQocFBhY2tldCk7CisJCWNkZl9uYnVmX3VubWFwKHRhcmdldC0+b3NkZXYsIG5ldGJ1ZiwgQ0RGX0RNQV9UT19ERVZJQ0UpOworCQljZGZfbmJ1Zl9wdWxsX2hlYWQobmV0YnVmLCBzaXplb2YoSFRDX0ZSQU1FX0hEUikpOworCQlwUGFja2V0LT5Qa3RJbmZvLkFzVHguRmxhZ3MgJj0gfkhUQ19UWF9QQUNLRVRfRkxBR19GSVhVUF9ORVRCVUY7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIGRvX3NlbmRfY29tcGxldGlvbihIVENfRU5EUE9JTlQgKnBFbmRwb2ludCwKKwkJCSAgICAgICBIVENfUEFDS0VUX1FVRVVFICpwUXVldWVUb0luZGljYXRlKQoreworCWRvIHsKKworCQlpZiAoSFRDX1FVRVVFX0VNUFRZKHBRdWV1ZVRvSW5kaWNhdGUpKSB7CisJCQkvKiBub3RoaW5nIHRvIGluZGljYXRlICovCisJCQlicmVhazsKKwkJfQorCisJCWlmIChwRW5kcG9pbnQtPkVwQ2FsbEJhY2tzLkVwVHhDb21wbGV0ZU11bHRpcGxlICE9IE5VTEwpIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfU0VORCwKKwkJCQkJKCIgSFRDIGNhbGxpbmcgZXAgJWQsIHNlbmQgY29tcGxldGUgbXVsdGlwbGUgY2FsbGJhY2sgKCVkIHBrdHMpIFxuIiwKKwkJCQkJIHBFbmRwb2ludC0+SWQsCisJCQkJCSBIVENfUEFDS0VUX1FVRVVFX0RFUFRICisJCQkJCQkgKHBRdWV1ZVRvSW5kaWNhdGUpKSk7CisJCQkvKiBhIG11bHRpcGxlIHNlbmQgY29tcGxldGUgaGFuZGxlciBpcyBiZWluZyB1c2VkLCBwYXNzIHRoZSBxdWV1ZSB0byB0aGUgaGFuZGxlciAqLworCQkJcEVuZHBvaW50LT5FcENhbGxCYWNrcy5FcFR4Q29tcGxldGVNdWx0aXBsZShwRW5kcG9pbnQtPgorCQkJCQkJCQkgICAgRXBDYWxsQmFja3MuCisJCQkJCQkJCSAgICBwQ29udGV4dCwKKwkJCQkJCQkJICAgIHBRdWV1ZVRvSW5kaWNhdGUpOworCQkJLyogYWxsIHBhY2tldHMgYXJlIG5vdyBvd25lZCBieSB0aGUgY2FsbGJhY2ssIHJlc2V0IHF1ZXVlIHRvIGJlIHNhZmUgKi8KKwkJCUlOSVRfSFRDX1BBQ0tFVF9RVUVVRShwUXVldWVUb0luZGljYXRlKTsKKwkJfSBlbHNlIHsKKwkJCUhUQ19QQUNLRVQgKnBQYWNrZXQ7CisJCQkvKiB1c2luZyBsZWdhY3kgRXBUeENvbXBsZXRlICovCisJCQlkbyB7CisJCQkJcFBhY2tldCA9IGh0Y19wYWNrZXRfZGVxdWV1ZShwUXVldWVUb0luZGljYXRlKTsKKwkJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsCisJCQkJCQkoIiBIVEMgY2FsbGluZyBlcCAlZCBzZW5kIGNvbXBsZXRlIGNhbGxiYWNrIG9uIHBhY2tldCAlcCBcbiIsCisJCQkJCQkgcEVuZHBvaW50LT5JZCwgcFBhY2tldCkpOworCQkJCXBFbmRwb2ludC0+RXBDYWxsQmFja3MuRXBUeENvbXBsZXRlKHBFbmRwb2ludC0+CisJCQkJCQkJCSAgICBFcENhbGxCYWNrcy4KKwkJCQkJCQkJICAgIHBDb250ZXh0LAorCQkJCQkJCQkgICAgcFBhY2tldCk7CisJCQl9IHdoaWxlICghSFRDX1FVRVVFX0VNUFRZKHBRdWV1ZVRvSW5kaWNhdGUpKTsKKwkJfQorCisJfSB3aGlsZSAoZmFsc2UpOworCit9CisKK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0X2NvbXBsZXRpb24oSFRDX1RBUkdFVCAqdGFyZ2V0LCBIVENfUEFDS0VUICpwUGFja2V0KQoreworCUhUQ19FTkRQT0lOVCAqcEVuZHBvaW50ID0gJnRhcmdldC0+RW5kUG9pbnRbcFBhY2tldC0+RW5kcG9pbnRdOworCUhUQ19QQUNLRVRfUVVFVUUgY29udGFpbmVyOworCisJcmVzdG9yZV90eF9wYWNrZXQodGFyZ2V0LCBwUGFja2V0KTsKKwlJTklUX0hUQ19QQUNLRVRfUVVFVUVfQU5EX0FERCgmY29udGFpbmVyLCBwUGFja2V0KTsKKworCS8qIGRvIGNvbXBsZXRpb24gKi8KKwlkb19zZW5kX2NvbXBsZXRpb24ocEVuZHBvaW50LCAmY29udGFpbmVyKTsKK30KKwordm9pZCBodGNfc2VuZF9jb21wbGV0ZV9jaGVja19jbGVhbnVwKHZvaWQgKmNvbnRleHQpCit7CisJSFRDX0VORFBPSU5UICpwRW5kcG9pbnQgPSAoSFRDX0VORFBPSU5UICopIGNvbnRleHQ7CisJaHRjX3NlbmRfY29tcGxldGVfY2hlY2socEVuZHBvaW50LCAxKTsKK30KKworSFRDX1BBQ0tFVCAqYWxsb2NhdGVfaHRjX2J1bmRsZV9wYWNrZXQoSFRDX1RBUkdFVCAqdGFyZ2V0KQoreworCUhUQ19QQUNLRVQgKnBQYWNrZXQ7CisJSFRDX1BBQ0tFVF9RVUVVRSAqcFF1ZXVlU2F2ZTsKKwljZGZfbmJ1Zl90IG5ldGJ1ZjsKKwlMT0NLX0hUQ19UWCh0YXJnZXQpOworCWlmIChOVUxMID09IHRhcmdldC0+cEJ1bmRsZUZyZWVMaXN0KSB7CisJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwkJbmV0YnVmID0gY2RmX25idWZfYWxsb2MoTlVMTCwKKwkJCQkJdGFyZ2V0LT5NYXhNc2dzUGVySFRDQnVuZGxlICoKKwkJCQkJdGFyZ2V0LT5UYXJnZXRDcmVkaXRTaXplLCAwLCA0LCBmYWxzZSk7CisJCUFSX0RFQlVHX0FTU0VSVChuZXRidWYpOworCQlpZiAoIW5ldGJ1ZikgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcFBhY2tldCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZihIVENfUEFDS0VUKSk7CisJCUFSX0RFQlVHX0FTU0VSVChwUGFja2V0KTsKKwkJaWYgKCFwUGFja2V0KSB7CisJCQljZGZfbmJ1Zl9mcmVlKG5ldGJ1Zik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwUXVldWVTYXZlID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKEhUQ19QQUNLRVRfUVVFVUUpKTsKKwkJQVJfREVCVUdfQVNTRVJUKHBRdWV1ZVNhdmUpOworCQlpZiAoIXBRdWV1ZVNhdmUpIHsKKwkJCWNkZl9uYnVmX2ZyZWUobmV0YnVmKTsKKwkJCWNkZl9tZW1fZnJlZShwUGFja2V0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCUlOSVRfSFRDX1BBQ0tFVF9RVUVVRShwUXVldWVTYXZlKTsKKwkJcFBhY2tldC0+cENvbnRleHQgPSBwUXVldWVTYXZlOworCQlTRVRfSFRDX1BBQ0tFVF9ORVRfQlVGX0NPTlRFWFQocFBhY2tldCwgbmV0YnVmKTsKKwkJcFBhY2tldC0+cEJ1ZmZlciA9IGNkZl9uYnVmX2RhdGEobmV0YnVmKTsKKwkJcFBhY2tldC0+QnVmZmVyTGVuZ3RoID0gY2RmX25idWZfbGVuKG5ldGJ1Zik7CisKKwkJLyogc3RvcmUgdGhlIG9yaWdpbmFsIGhlYWQgcm9vbSBzbyB0aGF0IHdlIGNhbiByZXN0b3JlIHRoaXMgd2hlbiB3ZSAiZnJlZSIgdGhlIHBhY2tldCAqLworCQkvKiBmcmVlIHBhY2tldCBwdXRzIHRoZSBwYWNrZXQgYmFjayBvbiB0aGUgZnJlZSBsaXN0ICovCisJCXBQYWNrZXQtPm5ldGJ1Zk9yaWdIZWFkUm9vbSA9IGNkZl9uYnVmX2hlYWRyb29tKG5ldGJ1Zik7CisJCXJldHVybiBwUGFja2V0OworCX0KKwkvKiBhbHJlYWR5IGRvbmUgbWFsbG9jIC0gcmVzdG9yZSBmcm9tIGZyZWUgbGlzdCAqLworCXBQYWNrZXQgPSB0YXJnZXQtPnBCdW5kbGVGcmVlTGlzdDsKKwlBUl9ERUJVR19BU1NFUlQocFBhY2tldCk7CisJaWYgKCFwUGFja2V0KSB7CisJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXRhcmdldC0+cEJ1bmRsZUZyZWVMaXN0ID0gKEhUQ19QQUNLRVQgKikgcFBhY2tldC0+TGlzdExpbmsucE5leHQ7CisJVU5MT0NLX0hUQ19UWCh0YXJnZXQpOworCXBQYWNrZXQtPkxpc3RMaW5rLnBOZXh0ID0gTlVMTDsKKworCXJldHVybiBwUGFja2V0OworfQorCit2b2lkIGZyZWVfaHRjX2J1bmRsZV9wYWNrZXQoSFRDX1RBUkdFVCAqdGFyZ2V0LCBIVENfUEFDS0VUICpwUGFja2V0KQoreworCUFfVUlOVDMyIGN1cmVudEhlYWRSb29tOworCWNkZl9uYnVmX3QgbmV0YnVmOworCUhUQ19QQUNLRVRfUVVFVUUgKnBRdWV1ZVNhdmU7CisKKwluZXRidWYgPSBHRVRfSFRDX1BBQ0tFVF9ORVRfQlVGX0NPTlRFWFQocFBhY2tldCk7CisJQVJfREVCVUdfQVNTRVJUKG5ldGJ1Zik7CisJaWYgKCFuZXRidWYpIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsICgiXG4lczogSW52YWxpZCBuZXRidWYgaW4gSFRDICIKKwkJCQkJCSJQYWNrZXRcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisJLyogSElGIGFkZHMgZGF0YSB0byB0aGUgaGVhZHJvb20gc2VjdGlvbiBvZiB0aGUgbmJ1ZiwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgKi8KKwkvKiBzaXplLiBJZiB0aGlzIGlzIG5vdCBkb25lLCBoZWFkcm9vbSBrZWVwcyBzaHJpbmtpbmcgd2l0aCBldmVyeSBISUYgc2VuZCAqLworCS8qIGFuZCBldmVudHVhbGx5IEhJRiBlbmRzIHVwIGRvaW5nIGFub3RoZXIgbWFsbG9jIGJpZyBlbm91Z2ggdG8gc3RvcmUgdGhlICovCisJLyogZGF0YSArIGl0cyBoZWFkZXIgKi8KKworCWN1cmVudEhlYWRSb29tID0gY2RmX25idWZfaGVhZHJvb20obmV0YnVmKTsKKwljZGZfbmJ1Zl9wdWxsX2hlYWQobmV0YnVmLAorCQkJICAgcFBhY2tldC0+bmV0YnVmT3JpZ0hlYWRSb29tIC0gY3VyZW50SGVhZFJvb20pOworCWNkZl9uYnVmX3RyaW1fdGFpbChuZXRidWYsIGNkZl9uYnVmX2xlbihuZXRidWYpKTsKKworCS8qIHJlc3RvcmUgdGhlIHBCdWZmZXIgcG9pbnRlci4gSElGIGNoYW5nZXMgdGhpcyAqLworCXBQYWNrZXQtPnBCdWZmZXIgPSBjZGZfbmJ1Zl9kYXRhKG5ldGJ1Zik7CisJcFBhY2tldC0+QnVmZmVyTGVuZ3RoID0gY2RmX25idWZfbGVuKG5ldGJ1Zik7CisKKwkvKiByZXN0b3JlIHF1ZXVlICovCisJcFF1ZXVlU2F2ZSA9IChIVENfUEFDS0VUX1FVRVVFICopIHBQYWNrZXQtPnBDb250ZXh0OworCUFSX0RFQlVHX0FTU0VSVChwUXVldWVTYXZlKTsKKworCUlOSVRfSFRDX1BBQ0tFVF9RVUVVRShwUXVldWVTYXZlKTsKKworCUxPQ0tfSFRDX1RYKHRhcmdldCk7CisJaWYgKHRhcmdldC0+cEJ1bmRsZUZyZWVMaXN0ID09IE5VTEwpIHsKKwkJdGFyZ2V0LT5wQnVuZGxlRnJlZUxpc3QgPSBwUGFja2V0OworCQlwUGFja2V0LT5MaXN0TGluay5wTmV4dCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcFBhY2tldC0+TGlzdExpbmsucE5leHQgPSAoRExfTElTVCAqKSB0YXJnZXQtPnBCdW5kbGVGcmVlTGlzdDsKKwkJdGFyZ2V0LT5wQnVuZGxlRnJlZUxpc3QgPSBwUGFja2V0OworCX0KKwlVTkxPQ0tfSFRDX1RYKHRhcmdldCk7Cit9CisKKyNpZiBkZWZpbmVkKEhJRl9VU0IpIHx8IGRlZmluZWQoSElGX1NESU8pCisjaWZkZWYgRU5BQkxFX0JVTkRMRV9UWAorc3RhdGljIEFfU1RBVFVTIGh0Y19zZW5kX2J1bmRsZWRfbmV0YnVmKEhUQ19UQVJHRVQgKnRhcmdldCwKKwkJCQkJSFRDX0VORFBPSU5UICpwRW5kcG9pbnQsCisJCQkJCXVuc2lnbmVkIGNoYXIgKnBCdW5kbGVCdWZmZXIsCisJCQkJCUhUQ19QQUNLRVQgKnBQYWNrZXRUeCkKK3sKKwljZGZfc2l6ZV90IGRhdGFfbGVuOworCUFfU1RBVFVTIHN0YXR1czsKKwljZGZfbmJ1Zl90IGJ1bmRsZUJ1ZjsKKwl1aW50MzJfdCBkYXRhX2F0dHIgPSAwOworCisJYnVuZGxlQnVmID0gR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKHBQYWNrZXRUeCk7CisJZGF0YV9sZW4gPSBwQnVuZGxlQnVmZmVyIC0gY2RmX25idWZfZGF0YShidW5kbGVCdWYpOworCWNkZl9uYnVmX3B1dF90YWlsKGJ1bmRsZUJ1ZiwgZGF0YV9sZW4pOworCVNFVF9IVENfUEFDS0VUX0lORk9fVFgocFBhY2tldFR4LAorCQkJICAgICAgIHRhcmdldCwKKwkJCSAgICAgICBwQnVuZGxlQnVmZmVyLAorCQkJICAgICAgIGRhdGFfbGVuLAorCQkJICAgICAgIHBFbmRwb2ludC0+SWQsIEhUQ19UWF9QQUNLRVRfVEFHX0JVTkRMRUQpOworCUxPQ0tfSFRDX1RYKHRhcmdldCk7CisJSFRDX1BBQ0tFVF9FTlFVRVVFKCZwRW5kcG9pbnQtPlR4TG9va3VwUXVldWUsIHBQYWNrZXRUeCk7CisJVU5MT0NLX0hUQ19UWCh0YXJnZXQpOworI2lmIERFQlVHX0JVTkRMRQorCWNkZl9wcmludCgiIFNlbmQgYnVuZGxlIEVQJWQgYnVmZmVyIHNpemU6MHgleCwgdG90YWw6MHgleCwgY291bnQ6JWQuXG4iLAorCQkgIHBFbmRwb2ludC0+SWQsCisJCSAgcEVuZHBvaW50LT5UeENyZWRpdFNpemUsCisJCSAgZGF0YV9sZW4sIGRhdGFfbGVuIC8gcEVuZHBvaW50LT5UeENyZWRpdFNpemUpOworI2VuZGlmCisJc3RhdHVzID0gaGlmX3NlbmRfaGVhZCh0YXJnZXQtPmhpZl9kZXYsCisJCQkgICAgICAgcEVuZHBvaW50LT5VTF9QaXBlSUQsCisJCQkgICAgICAgcEVuZHBvaW50LT5JZCwgZGF0YV9sZW4sIGJ1bmRsZUJ1ZiwgZGF0YV9hdHRyKTsKKwlpZiAoc3RhdHVzICE9IEFfT0spIHsKKwkJY2RmX3ByaW50KCIlczpoaWZfc2VuZF9oZWFkIGZhaWxlZChsZW49JWQpLlxuIiwgX19GVU5DVElPTl9fLAorCQkJICBkYXRhX2xlbik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGh0Y19pc3N1ZV9wYWNrZXRzX2J1bmRsZShIVENfVEFSR0VUICp0YXJnZXQsCisJCQkJICAgICBIVENfRU5EUE9JTlQgKnBFbmRwb2ludCwKKwkJCQkgICAgIEhUQ19QQUNLRVRfUVVFVUUgKnBQa3RRdWV1ZSkKK3sKKwlpbnQgaSwgZnJhZ19jb3VudCwgbmJ5dGVzOworCWNkZl9uYnVmX3QgbmV0YnVmLCBidW5kbGVCdWY7CisJdW5zaWduZWQgY2hhciAqcEJ1bmRsZUJ1ZmZlciA9IE5VTEw7CisJSFRDX1BBQ0tFVCAqcFBhY2tldCA9IE5VTEwsICpwUGFja2V0VHggPSBOVUxMOworCUhUQ19GUkFNRV9IRFIgKnBIdGNIZHI7CisJaW50IGNyZWRpdFBhZCwgY3JlZGl0UmVtYWluZGVyLCB0cmFuc2Zlckxlbmd0aCwgYnVuZGxlc1NwYWNlUmVtYWluaW5nID0KKwkJMDsKKwlIVENfUEFDS0VUX1FVRVVFICpwUXVldWVTYXZlID0gTlVMTDsKKworCWJ1bmRsZXNTcGFjZVJlbWFpbmluZyA9CisJCXRhcmdldC0+TWF4TXNnc1BlckhUQ0J1bmRsZSAqIHBFbmRwb2ludC0+VHhDcmVkaXRTaXplOworCXBQYWNrZXRUeCA9IGFsbG9jYXRlX2h0Y19idW5kbGVfcGFja2V0KHRhcmdldCk7CisJaWYgKCFwUGFja2V0VHgpIHsKKwkJLyogZ29vZCB0aW1lIHRvIHBhbmljICovCisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCSgiYWxsb2NhdGVfaHRjX2J1bmRsZV9wYWNrZXQgZmFpbGVkIFxuIikpOworCQlBUl9ERUJVR19BU1NFUlQoZmFsc2UpOworCQlyZXR1cm47CisJfQorCWJ1bmRsZUJ1ZiA9IEdFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVChwUGFja2V0VHgpOworCXBCdW5kbGVCdWZmZXIgPSBjZGZfbmJ1Zl9kYXRhKGJ1bmRsZUJ1Zik7CisJcFF1ZXVlU2F2ZSA9IChIVENfUEFDS0VUX1FVRVVFICopIHBQYWNrZXRUeC0+cENvbnRleHQ7CisJd2hpbGUgKDEpIHsKKwkJcFBhY2tldCA9IGh0Y19wYWNrZXRfZGVxdWV1ZShwUGt0UXVldWUpOworCQlpZiAocFBhY2tldCA9PSBOVUxMKSB7CisJCQlicmVhazsKKwkJfQorCQljcmVkaXRQYWQgPSAwOworCQl0cmFuc2Zlckxlbmd0aCA9IHBQYWNrZXQtPkFjdHVhbExlbmd0aCArIEhUQ19IRFJfTEVOR1RIOworCQljcmVkaXRSZW1haW5kZXIgPSB0cmFuc2Zlckxlbmd0aCAlIHBFbmRwb2ludC0+VHhDcmVkaXRTaXplOworCQlpZiAoY3JlZGl0UmVtYWluZGVyICE9IDApIHsKKwkJCWlmICh0cmFuc2Zlckxlbmd0aCA8IHBFbmRwb2ludC0+VHhDcmVkaXRTaXplKSB7CisJCQkJY3JlZGl0UGFkID0KKwkJCQkJcEVuZHBvaW50LT5UeENyZWRpdFNpemUgLSB0cmFuc2Zlckxlbmd0aDsKKwkJCX0gZWxzZSB7CisJCQkJY3JlZGl0UGFkID0gY3JlZGl0UmVtYWluZGVyOworCQkJfQorCQkJdHJhbnNmZXJMZW5ndGggKz0gY3JlZGl0UGFkOworCQl9CisKKwkJaWYgKGJ1bmRsZXNTcGFjZVJlbWFpbmluZyA8IHRyYW5zZmVyTGVuZ3RoKSB7CisJCQkvKiBzZW5kIG91dCBwcmV2aW91cyBidWZmZXIgKi8KKwkJCWh0Y19zZW5kX2J1bmRsZWRfbmV0YnVmKHRhcmdldCwgcEVuZHBvaW50LCBwQnVuZGxlQnVmZmVyLAorCQkJCQkJcFBhY2tldFR4KTsKKwkJCWlmIChIVENfUEFDS0VUX1FVRVVFX0RFUFRIKHBQa3RRdWV1ZSkgPAorCQkJICAgIEhUQ19NSU5fTVNHX1BFUl9CVU5ETEUpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlidW5kbGVzU3BhY2VSZW1haW5pbmcgPQorCQkJCXRhcmdldC0+TWF4TXNnc1BlckhUQ0J1bmRsZSAqCisJCQkJcEVuZHBvaW50LT5UeENyZWRpdFNpemU7CisJCQlwUGFja2V0VHggPSBhbGxvY2F0ZV9odGNfYnVuZGxlX3BhY2tldCh0YXJnZXQpOworCQkJaWYgKCFwUGFja2V0VHgpIHsKKwkJCQkvKiBnb29kIHRpbWUgdG8gcGFuaWMgKi8KKwkJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkJCSgiYWxsb2NhdGVfaHRjX2J1bmRsZV9wYWNrZXQgZmFpbGVkIFxuIikpOworCQkJCUFSX0RFQlVHX0FTU0VSVChmYWxzZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnVuZGxlQnVmID0gR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKHBQYWNrZXRUeCk7CisJCQlwQnVuZGxlQnVmZmVyID0gY2RmX25idWZfZGF0YShidW5kbGVCdWYpOworCQkJcFF1ZXVlU2F2ZSA9IChIVENfUEFDS0VUX1FVRVVFICopIHBQYWNrZXRUeC0+cENvbnRleHQ7CisJCX0KKworCQlidW5kbGVzU3BhY2VSZW1haW5pbmcgLT0gdHJhbnNmZXJMZW5ndGg7CisJCW5ldGJ1ZiA9IEdFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVChwUGFja2V0KTsKKwkJcEh0Y0hkciA9IChIVENfRlJBTUVfSERSICopIGNkZl9uYnVmX2dldF9mcmFnX3ZhZGRyKG5ldGJ1ZiwgMCk7CisJCUhUQ19XUklURTMyKHBIdGNIZHIsCisJCQkgICAgU00ocFBhY2tldC0+QWN0dWFsTGVuZ3RoLAorCQkJICAgICAgIEhUQ19GUkFNRV9IRFJfUEFZTE9BRExFTikgfCBTTShwUGFja2V0LT5Qa3RJbmZvLgorCQkJCQkJCSAgICAgIEFzVHguCisJCQkJCQkJICAgICAgU2VuZEZsYWdzIHwKKwkJCQkJCQkgICAgICBIVENfRkxBR1NfU0VORF9CVU5ETEUsCisJCQkJCQkJICAgICAgSFRDX0ZSQU1FX0hEUl9GTEFHUykKKwkJCSAgICB8IFNNKHBQYWNrZXQtPkVuZHBvaW50LCBIVENfRlJBTUVfSERSX0VORFBPSU5USUQpKTsKKwkJSFRDX1dSSVRFMzIoKEFfVUlOVDMyICopIHBIdGNIZHIgKyAxLAorCQkJICAgIFNNKHBQYWNrZXQtPlBrdEluZm8uQXNUeC5TZXFObywKKwkJCSAgICAgICBIVENfRlJBTUVfSERSX0NPTlRST0xCWVRFUzEpIHwgU00oY3JlZGl0UGFkLAorCQkJCQkJCQkgSFRDX0ZSQU1FX0hEUl9SRVNFUlZFRCkpOworCQlwSHRjSGRyLT5yZXNlcnZlZCA9IGNyZWRpdFBhZDsKKwkJZnJhZ19jb3VudCA9IGNkZl9uYnVmX2dldF9udW1fZnJhZ3MobmV0YnVmKTsKKwkJbmJ5dGVzID0gcFBhY2tldC0+QWN0dWFsTGVuZ3RoICsgSFRDX0hEUl9MRU5HVEg7CisJCWZvciAoaSA9IDA7IGkgPCBmcmFnX2NvdW50ICYmIG5ieXRlcyA+IDA7IGkrKykgeworCQkJaW50IGZyYWdfbGVuID0gY2RmX25idWZfZ2V0X2ZyYWdfbGVuKG5ldGJ1ZiwgaSk7CisJCQl1bnNpZ25lZCBjaGFyICpmcmFnX2FkZHIgPQorCQkJCWNkZl9uYnVmX2dldF9mcmFnX3ZhZGRyKG5ldGJ1ZiwgaSk7CisJCQlpZiAoZnJhZ19sZW4gPiBuYnl0ZXMpIHsKKwkJCQlmcmFnX2xlbiA9IG5ieXRlczsKKwkJCX0KKwkJCUFfTUVNQ1BZKHBCdW5kbGVCdWZmZXIsIGZyYWdfYWRkciwgZnJhZ19sZW4pOworCQkJbmJ5dGVzIC09IGZyYWdfbGVuOworCQkJcEJ1bmRsZUJ1ZmZlciArPSBmcmFnX2xlbjsKKwkJfQorCQlIVENfUEFDS0VUX0VOUVVFVUUocFF1ZXVlU2F2ZSwgcFBhY2tldCk7CisJCXBCdW5kbGVCdWZmZXIgKz0gY3JlZGl0UGFkOworCX0KKwlpZiAocEJ1bmRsZUJ1ZmZlciAhPSBjZGZfbmJ1Zl9kYXRhKGJ1bmRsZUJ1ZikpIHsKKwkJLyogc2VuZCBvdXQgcmVtYWluaW5nIGJ1ZmZlciAqLworCQlodGNfc2VuZF9idW5kbGVkX25ldGJ1Zih0YXJnZXQsIHBFbmRwb2ludCwgcEJ1bmRsZUJ1ZmZlciwKKwkJCQkJcFBhY2tldFR4KTsKKwl9IGVsc2UgeworCQlmcmVlX2h0Y19idW5kbGVfcGFja2V0KHRhcmdldCwgcFBhY2tldFR4KTsKKwl9Cit9CisjZW5kaWYgLyogRU5BQkxFX0JVTkRMRV9UWCAqLworI2VuZGlmCisKK3N0YXRpYyBBX1NUQVRVUyBodGNfaXNzdWVfcGFja2V0cyhIVENfVEFSR0VUICp0YXJnZXQsCisJCQkJICBIVENfRU5EUE9JTlQgKnBFbmRwb2ludCwKKwkJCQkgIEhUQ19QQUNLRVRfUVVFVUUgKnBQa3RRdWV1ZSkKK3sKKwlBX1NUQVRVUyBzdGF0dXMgPSBBX09LOworCWNkZl9uYnVmX3QgbmV0YnVmOworCUhUQ19QQUNLRVQgKnBQYWNrZXQgPSBOVUxMOworCXVpbnQxNl90IHBheWxvYWRMZW47CisJSFRDX0ZSQU1FX0hEUiAqcEh0Y0hkcjsKKwl1aW50MzJfdCBkYXRhX2F0dHIgPSAwOworCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19TRU5ELAorCQkJKCIraHRjX2lzc3VlX3BhY2tldHM6IFF1ZXVlOiAlcCwgUGt0cyAlZCBcbiIsIHBQa3RRdWV1ZSwKKwkJCSBIVENfUEFDS0VUX1FVRVVFX0RFUFRIKHBQa3RRdWV1ZSkpKTsKKwl3aGlsZSAodHJ1ZSkgeworI2lmIGRlZmluZWQoSElGX1VTQikgfHwgZGVmaW5lZChISUZfU0RJTykKKyNpZmRlZiBFTkFCTEVfQlVORExFX1RYCisJCWlmIChJU19UWF9DUkVESVRfRkxPV19FTkFCTEVEKHBFbmRwb2ludCkgJiYKKwkJICAgIEhUQ19FTkFCTEVfQlVORExFKHRhcmdldCkgJiYKKwkJICAgIEhUQ19QQUNLRVRfUVVFVUVfREVQVEgocFBrdFF1ZXVlKSA+PQorCQkgICAgSFRDX01JTl9NU0dfUEVSX0JVTkRMRSkgeworCQkJaHRjX2lzc3VlX3BhY2tldHNfYnVuZGxlKHRhcmdldCwgcEVuZHBvaW50LCBwUGt0UXVldWUpOworCQl9CisjZW5kaWYKKyNlbmRpZgorCQkvKiBpZiBub3QgYnVuZGxpbmcgb3IgdGhlcmUgd2FzIGEgcGFja2V0IHRoYXQgY291bGQgbm90IGJlIHBsYWNlZCBpbiBhIGJ1bmRsZSwKKwkJICogYW5kIHNlbmQgaXQgYnkgbm9ybWFsIHdheQorCQkgKi8KKwkJcFBhY2tldCA9IGh0Y19wYWNrZXRfZGVxdWV1ZShwUGt0UXVldWUpOworCQlpZiAoTlVMTCA9PSBwUGFja2V0KSB7CisJCQkvKiBsb2NhbCBxdWV1ZSBpcyBmdWxseSBkcmFpbmVkICovCisJCQlicmVhazsKKwkJfQorCisJCW5ldGJ1ZiA9IEdFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVChwUGFja2V0KTsKKwkJQVJfREVCVUdfQVNTRVJUKG5ldGJ1Zik7CisJCS8qIE5vbi1jcmVkaXQgZW5hYmxlZCBlbmRwb2ludHMgaGF2ZSBiZWVuIG1hcHBlZCBhbmQgc2V0dXAgYnkgbm93LAorCQkgKiBzbyBubyBuZWVkIHRvIHJldmlzaXQgdGhlIEhUQyBoZWFkZXJzCisJCSAqLworCQlpZiAoSVNfVFhfQ1JFRElUX0ZMT1dfRU5BQkxFRChwRW5kcG9pbnQpKSB7CisKKwkJCXBheWxvYWRMZW4gPSBwUGFja2V0LT5BY3R1YWxMZW5ndGg7CisJCQkvKiBzZXR1cCBIVEMgZnJhbWUgaGVhZGVyICovCisKKwkJCXBIdGNIZHIgPQorCQkJCShIVENfRlJBTUVfSERSICopIGNkZl9uYnVmX2dldF9mcmFnX3ZhZGRyKG5ldGJ1ZiwKKwkJCQkJCQkJCSAgMCk7CisJCQlBUl9ERUJVR19BU1NFUlQocEh0Y0hkcik7CisKKwkJCUhUQ19XUklURTMyKHBIdGNIZHIsCisJCQkJICAgIFNNKHBheWxvYWRMZW4sCisJCQkJICAgICAgIEhUQ19GUkFNRV9IRFJfUEFZTE9BRExFTikgfCBTTShwUGFja2V0LT4KKwkJCQkJCQkJICAgICAgUGt0SW5mby4KKwkJCQkJCQkJICAgICAgQXNUeC4KKwkJCQkJCQkJICAgICAgU2VuZEZsYWdzLAorCQkJCQkJCQkgICAgICBIVENfRlJBTUVfSERSX0ZMQUdTKQorCQkJCSAgICB8IFNNKHBQYWNrZXQtPkVuZHBvaW50LAorCQkJCQkgSFRDX0ZSQU1FX0hEUl9FTkRQT0lOVElEKSk7CisJCQlIVENfV1JJVEUzMigoKEFfVUlOVDMyICopIHBIdGNIZHIpICsgMSwKKwkJCQkgICAgU00ocFBhY2tldC0+UGt0SW5mby5Bc1R4LlNlcU5vLAorCQkJCSAgICAgICBIVENfRlJBTUVfSERSX0NPTlRST0xCWVRFUzEpKTsKKworCQkJLyoKKwkJCSAqIE5vdyB0aGF0IHRoZSBIVEMgZnJhbWUgaGVhZGVyIGhhcyBiZWVuIGFkZGVkLCB0aGUgbmV0YnVmIGNhbiBiZQorCQkJICogbWFwcGVkLiAgVGhpcyBvbmx5IGFwcGxpZXMgdG8gbm9uLWRhdGEgZnJhbWVzLCBzaW5jZSBkYXRhIGZyYW1lcworCQkJICogd2VyZSBhbHJlYWR5IG1hcHBlZCBhcyB0aGV5IGVudGVyZWQgaW50byB0aGUgZHJpdmVyLgorCQkJICogQ2hlY2sgdGhlICJGSVhVUF9ORVRCVUYiIGZsYWcgdG8gc2VlIHdoZXRoZXIgdGhpcyBpcyBhIGRhdGEgbmV0YnVmCisJCQkgKiB0aGF0IGlzIGFscmVhZHkgbWFwcGVkLCBvciBhIG5vbi1kYXRhIG5ldGJ1ZiB0aGF0IG5lZWRzIHRvIGJlCisJCQkgKiBtYXBwZWQuCisJCQkgKi8KKwkJCWlmIChwUGFja2V0LT5Qa3RJbmZvLkFzVHguCisJCQkgICAgRmxhZ3MgJiBIVENfVFhfUEFDS0VUX0ZMQUdfRklYVVBfTkVUQlVGKSB7CisJCQkJY2RmX25idWZfbWFwKHRhcmdldC0+b3NkZXYsCisJCQkJCSAgICAgR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUCisJCQkJCQkgICAgIChwUGFja2V0KSwgQ0RGX0RNQV9UT19ERVZJQ0UpOworCQkJfQorCQl9CisJCUxPQ0tfSFRDX1RYKHRhcmdldCk7CisJCS8qIHN0b3JlIGluIGxvb2sgdXAgcXVldWUgdG8gbWF0Y2ggY29tcGxldGlvbnMgKi8KKwkJSFRDX1BBQ0tFVF9FTlFVRVVFKCZwRW5kcG9pbnQtPlR4TG9va3VwUXVldWUsIHBQYWNrZXQpOworCQlJTkNfSFRDX0VQX1NUQVQocEVuZHBvaW50LCBUeElzc3VlZCwgMSk7CisJCXBFbmRwb2ludC0+dWxfb3V0c3RhbmRpbmdfY250Kys7CisJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKworCQlzdGF0dXMgPSBoaWZfc2VuZF9oZWFkKHRhcmdldC0+aGlmX2RldiwKKwkJCQkgICAgICAgcEVuZHBvaW50LT5VTF9QaXBlSUQsIHBFbmRwb2ludC0+SWQsCisJCQkJICAgICAgIEhUQ19IRFJfTEVOR1RIICsgcFBhY2tldC0+QWN0dWFsTGVuZ3RoLAorCQkJCSAgICAgICBuZXRidWYsIGRhdGFfYXR0cik7CisjaWYgREVCVUdfQlVORExFCisJCWNkZl9wcmludCgiIFNlbmQgc2luZ2xlIEVQJWQgYnVmZmVyIHNpemU6MHgleCwgdG90YWw6MHgleC5cbiIsCisJCQkgIHBFbmRwb2ludC0+SWQsCisJCQkgIHBFbmRwb2ludC0+VHhDcmVkaXRTaXplLAorCQkJICBIVENfSERSX0xFTkdUSCArIHBQYWNrZXQtPkFjdHVhbExlbmd0aCk7CisjZW5kaWYKKworCQl0YXJnZXQtPmNlX3NlbmRfY250Kys7CisKKwkJaWYgKGNkZl91bmxpa2VseShBX0ZBSUxFRChzdGF0dXMpKSkgeworCQkJaWYgKHN0YXR1cyAhPSBBX05PX1JFU09VUkNFKSB7CisJCQkJLyogVE9ETyA6IGlmIG1vcmUgdGhhbiAxIGVuZHBvaW50IG1hcHMgdG8gdGhlIHNhbWUgUGlwZUlEIGl0IGlzIHBvc3NpYmxlCisJCQkJICogdG8gcnVuIG91dCBvZiByZXNvdXJjZXMgaW4gdGhlIEhJRiBsYXllci4gRG9uJ3QgZW1pdCB0aGUgZXJyb3IgKi8KKwkJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkJCSgiaGlmX3NlbmQgRmFpbGVkIHN0YXR1czolZCBcbiIsCisJCQkJCQkgc3RhdHVzKSk7CisJCQl9CisJCQlMT0NLX0hUQ19UWCh0YXJnZXQpOworCQkJdGFyZ2V0LT5jZV9zZW5kX2NudC0tOworCQkJcEVuZHBvaW50LT51bF9vdXRzdGFuZGluZ19jbnQtLTsKKwkJCUhUQ19QQUNLRVRfUkVNT1ZFKCZwRW5kcG9pbnQtPlR4TG9va3VwUXVldWUsIHBQYWNrZXQpOworCQkJLyogcmVjbGFpbSBjcmVkaXRzICovCisjaWYgZGVmaW5lZChISUZfVVNCKQorCQkJaWYgKHBFbmRwb2ludC0+SWQgPj0gRU5EUE9JTlRfMgorCQkJICAgICYmIHBFbmRwb2ludC0+SWQgPD0gRU5EUE9JTlRfNSkKKwkJCQl0YXJnZXQtPmF2YWlsX3R4X2NyZWRpdHMgKz0KKwkJCQkJcFBhY2tldC0+UGt0SW5mby5Bc1R4LkNyZWRpdHNVc2VkOworCQkJZWxzZQorCQkJCXBFbmRwb2ludC0+VHhDcmVkaXRzICs9CisJCQkJCXBQYWNrZXQtPlBrdEluZm8uQXNUeC5DcmVkaXRzVXNlZDsKKyNlbHNlCisJCQlwRW5kcG9pbnQtPlR4Q3JlZGl0cyArPQorCQkJCXBQYWNrZXQtPlBrdEluZm8uQXNUeC5DcmVkaXRzVXNlZDsKKyNlbmRpZgorCQkJLyogcHV0IGl0IGJhY2sgaW50byB0aGUgY2FsbGVycyBxdWV1ZSAqLworCQkJSFRDX1BBQ0tFVF9FTlFVRVVFX1RPX0hFQUQocFBrdFF1ZXVlLCBwUGFja2V0KTsKKwkJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwkJCWJyZWFrOworCQl9CisKKwl9CisJaWYgKGNkZl91bmxpa2VseShBX0ZBSUxFRChzdGF0dXMpKSkgeworI2lmIGRlZmluZWQoSElGX1VTQikKKwkJaWYgKHBFbmRwb2ludC0+SWQgPj0gRU5EUE9JTlRfMiAmJiBwRW5kcG9pbnQtPklkIDw9IEVORFBPSU5UXzUpCisJCQl0YXJnZXQtPmF2YWlsX3R4X2NyZWRpdHMgKz0KKwkJCQlwUGFja2V0LT5Qa3RJbmZvLkFzVHguQ3JlZGl0c1VzZWQ7CisJCWVsc2UKKwkJCXBFbmRwb2ludC0+VHhDcmVkaXRzICs9CisJCQkJcFBhY2tldC0+UGt0SW5mby5Bc1R4LkNyZWRpdHNVc2VkOworI2VuZGlmCisJCXdoaWxlICghSFRDX1FVRVVFX0VNUFRZKHBQa3RRdWV1ZSkpIHsKKwkJCWlmIChzdGF0dXMgIT0gQV9OT19SRVNPVVJDRSkgeworCQkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkJKCJodGNfaXNzdWVfcGFja2V0cywgZmFpbGVkIHBrdDoweCVwIHN0YXR1czolZCBcbiIsCisJCQkJCQkgcFBhY2tldCwgc3RhdHVzKSk7CisJCQl9CisJCQlwUGFja2V0ID0gaHRjX3BhY2tldF9kZXF1ZXVlKHBQa3RRdWV1ZSk7CisJCQlpZiAocFBhY2tldCkgeworCQkJCXBQYWNrZXQtPlN0YXR1cyA9IHN0YXR1czsKKwkJCQlzZW5kX3BhY2tldF9jb21wbGV0aW9uKHRhcmdldCwgcFBhY2tldCk7CisJCQl9CisJCX0KKwl9CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsICgiLWh0Y19pc3N1ZV9wYWNrZXRzIFxuIikpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogZ2V0IEhUQyBzZW5kIHBhY2tldHMgZnJvbSB0aGUgVFggcXVldWUgb24gYW4gZW5kcG9pbnQsIGJhc2VkIG9uIGF2YWlsYWJsZSBjcmVkaXRzICovCit2b2lkIGdldF9odGNfc2VuZF9wYWNrZXRzX2NyZWRpdF9iYXNlZChIVENfVEFSR0VUICp0YXJnZXQsCisJCQkJICAgICAgIEhUQ19FTkRQT0lOVCAqcEVuZHBvaW50LAorCQkJCSAgICAgICBIVENfUEFDS0VUX1FVRVVFICpwUXVldWUpCit7CisJaW50IGNyZWRpdHNSZXF1aXJlZDsKKwlpbnQgcmVtYWluZGVyOworCUFfVUlOVDggc2VuZEZsYWdzOworCUhUQ19QQUNLRVQgKnBQYWNrZXQ7CisJdW5zaWduZWQgaW50IHRyYW5zZmVyTGVuZ3RoOworCisJLyoqKioqKiBOT1RFIDogdGhlIFRYIGxvY2sgaXMgaGVsZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICoqKioqKioqKioqKioqKioqLworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfU0VORCwgKCIrZ2V0X2h0Y19zZW5kX3BhY2tldHNfY3JlZGl0X2Jhc2VkIFxuIikpOworCisJLyogbG9vcCB1bnRpbCB3ZSBjYW4gZ3JhYiBhcyBtYW55IHBhY2tldHMgb3V0IG9mIHRoZSBxdWV1ZSBhcyB3ZSBjYW4gKi8KKwl3aGlsZSAodHJ1ZSkgeworCisJCXNlbmRGbGFncyA9IDA7CisJCS8qIGdldCBwYWNrZXQgYXQgaGVhZCwgYnV0IGRvbid0IHJlbW92ZSBpdCAqLworCQlwUGFja2V0ID0gaHRjX2dldF9wa3RfYXRfaGVhZCgmcEVuZHBvaW50LT5UeFF1ZXVlKTsKKwkJaWYgKHBQYWNrZXQgPT0gTlVMTCkgeworCQkJYnJlYWs7CisJCX0KKworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsCisJCQkJKCIgR290IGhlYWQgcGFja2V0OiVwICwgUXVldWUgRGVwdGg6ICVkXG4iLAorCQkJCSBwUGFja2V0LAorCQkJCSBIVENfUEFDS0VUX1FVRVVFX0RFUFRIKCZwRW5kcG9pbnQtPlR4UXVldWUpKSk7CisKKwkJdHJhbnNmZXJMZW5ndGggPSBwUGFja2V0LT5BY3R1YWxMZW5ndGggKyBIVENfSERSX0xFTkdUSDsKKworCQlpZiAodHJhbnNmZXJMZW5ndGggPD0gcEVuZHBvaW50LT5UeENyZWRpdFNpemUpIHsKKwkJCWNyZWRpdHNSZXF1aXJlZCA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBmaWd1cmUgb3V0IGhvdyBtYW55IGNyZWRpdHMgdGhpcyBtZXNzYWdlIHJlcXVpcmVzICovCisJCQljcmVkaXRzUmVxdWlyZWQgPQorCQkJCXRyYW5zZmVyTGVuZ3RoIC8gcEVuZHBvaW50LT5UeENyZWRpdFNpemU7CisJCQlyZW1haW5kZXIgPSB0cmFuc2Zlckxlbmd0aCAlIHBFbmRwb2ludC0+VHhDcmVkaXRTaXplOworCisJCQlpZiAocmVtYWluZGVyKSB7CisJCQkJY3JlZGl0c1JlcXVpcmVkKys7CisJCQl9CisJCX0KKworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsCisJCQkJKCIgQ3JlZGl0cyBSZXF1aXJlZDolZCAgIEdvdDolZFxuIiwKKwkJCQkgY3JlZGl0c1JlcXVpcmVkLCBwRW5kcG9pbnQtPlR4Q3JlZGl0cykpOworCisJCWlmIChwRW5kcG9pbnQtPklkID09IEVORFBPSU5UXzApIHsKKwkJCS8qIGVuZHBvaW50IDAgaXMgc3BlY2lhbCwgaXQgYWx3YXlzIGhhcyBhIGNyZWRpdCBhbmQgZG9lcyBub3QgcmVxdWlyZSBjcmVkaXQgYmFzZWQKKwkJCSAqIGZsb3cgY29udHJvbCAqLworCQkJY3JlZGl0c1JlcXVpcmVkID0gMDsKKyNpZiBkZWZpbmVkKEhJRl9VU0IpCisJCX0gZWxzZSBpZiAocEVuZHBvaW50LT5JZCA+PSBFTkRQT0lOVF8yCisJCQkgICAmJiBwRW5kcG9pbnQtPklkIDw9IEVORFBPSU5UXzUpIHsKKwkJCWlmICh0YXJnZXQtPmF2YWlsX3R4X2NyZWRpdHMgPCBjcmVkaXRzUmVxdWlyZWQpCisJCQkJYnJlYWs7CisKKwkJCXRhcmdldC0+YXZhaWxfdHhfY3JlZGl0cyAtPSBjcmVkaXRzUmVxdWlyZWQ7CisKKwkJCWlmICh0YXJnZXQtPmF2YWlsX3R4X2NyZWRpdHMgPCA5KSB7CisJCQkJLyogdGVsbCB0aGUgdGFyZ2V0IHdlIG5lZWQgY3JlZGl0cyBBU0FQISAqLworCQkJCXNlbmRGbGFncyB8PSBIVENfRkxBR1NfTkVFRF9DUkVESVRfVVBEQVRFOworCQkJCUlOQ19IVENfRVBfU1RBVChwRW5kcG9pbnQsCisJCQkJCQlUeENyZWRpdExvd0luZGljYXRpb25zLCAxKTsKKwkJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsCisJCQkJCQkoIiBIb3N0IE5lZWRzIENyZWRpdHMgIFxuIikpOworCQkJfQorI2VuZGlmCisJCX0gZWxzZSB7CisKKwkJCWlmIChwRW5kcG9pbnQtPlR4Q3JlZGl0cyA8IGNyZWRpdHNSZXF1aXJlZCkgeworI2lmIERFQlVHX0NSRURJVAorCQkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkJKCIgRVAlZCwgTm8gQ3JlZGl0IG5vdy4gJWQgPCAlZFxuIiwKKwkJCQkJCSBwRW5kcG9pbnQtPklkLAorCQkJCQkJIHBFbmRwb2ludC0+VHhDcmVkaXRzLAorCQkJCQkJIGNyZWRpdHNSZXF1aXJlZCkpOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBFbmRwb2ludC0+VHhDcmVkaXRzIC09IGNyZWRpdHNSZXF1aXJlZDsKKwkJCUlOQ19IVENfRVBfU1RBVChwRW5kcG9pbnQsIFR4Q3JlZGl0c0NvbnN1bW1lZCwKKwkJCQkJY3JlZGl0c1JlcXVpcmVkKTsKKworCQkJLyogY2hlY2sgaWYgd2UgbmVlZCBjcmVkaXRzIGJhY2sgZnJvbSB0aGUgdGFyZ2V0ICovCisJCQlpZiAocEVuZHBvaW50LT5UeENyZWRpdHMgPD0KKwkJCSAgICBwRW5kcG9pbnQtPlR4Q3JlZGl0c1Blck1heE1zZykgeworCQkJCS8qIHRlbGwgdGhlIHRhcmdldCB3ZSBuZWVkIGNyZWRpdHMgQVNBUCEgKi8KKwkJCQlzZW5kRmxhZ3MgfD0gSFRDX0ZMQUdTX05FRURfQ1JFRElUX1VQREFURTsKKworCQkJCWlmIChwRW5kcG9pbnQtPlNlcnZpY2VJRCA9PSBXTUlfQ09OVFJPTF9TVkMpIHsKKwkJCQkJTE9DS19IVENfQ1JFRElUKHRhcmdldCk7CisJCQkJCWh0Y19jcmVkaXRfcmVjb3JkKEhUQ19SRVFVRVNUX0NSRURJVCwKKwkJCQkJCQkgIHBFbmRwb2ludC0+VHhDcmVkaXRzLAorCQkJCQkJCSAgSFRDX1BBQ0tFVF9RVUVVRV9ERVBUSAorCQkJCQkJCQkgICgmcEVuZHBvaW50LT4KKwkJCQkJCQkJICBUeFF1ZXVlKSk7CisJCQkJCVVOTE9DS19IVENfQ1JFRElUKHRhcmdldCk7CisJCQkJfQorCisJCQkJSU5DX0hUQ19FUF9TVEFUKHBFbmRwb2ludCwKKwkJCQkJCVR4Q3JlZGl0TG93SW5kaWNhdGlvbnMsIDEpOworI2lmIERFQlVHX0NSRURJVAorCQkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkJKCIgRVAlZCBOZWVkcyBDcmVkaXRzXG4iLAorCQkJCQkJIHBFbmRwb2ludC0+SWQpKTsKKyNlbmRpZgorCQkJfQorCQl9CisKKwkJLyogbm93IHdlIGNhbiBmdWxseSBkZXF1ZXVlICovCisJCXBQYWNrZXQgPSBodGNfcGFja2V0X2RlcXVldWUoJnBFbmRwb2ludC0+VHhRdWV1ZSk7CisJCWlmIChwUGFja2V0KSB7CisJCQkvKiBzYXZlIHRoZSBudW1iZXIgb2YgY3JlZGl0cyB0aGlzIHBhY2tldCBjb25zdW1lZCAqLworCQkJcFBhY2tldC0+UGt0SW5mby5Bc1R4LkNyZWRpdHNVc2VkID0gY3JlZGl0c1JlcXVpcmVkOworCQkJLyogc2F2ZSBzZW5kIGZsYWdzICovCisJCQlwUGFja2V0LT5Qa3RJbmZvLkFzVHguU2VuZEZsYWdzID0gc2VuZEZsYWdzOworCisJCQkvKiBxdWV1ZSB0aGlzIHBhY2tldCBpbnRvIHRoZSBjYWxsZXIncyBxdWV1ZSAqLworCQkJSFRDX1BBQ0tFVF9FTlFVRVVFKHBRdWV1ZSwgcFBhY2tldCk7CisJCX0KKwl9CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsICgiLWdldF9odGNfc2VuZF9wYWNrZXRzX2NyZWRpdF9iYXNlZCBcbiIpKTsKKworfQorCit2b2lkIGdldF9odGNfc2VuZF9wYWNrZXRzKEhUQ19UQVJHRVQgKnRhcmdldCwKKwkJCSAgSFRDX0VORFBPSU5UICpwRW5kcG9pbnQsCisJCQkgIEhUQ19QQUNLRVRfUVVFVUUgKnBRdWV1ZSwgaW50IFJlc291cmNlcykKK3sKKworCUhUQ19QQUNLRVQgKnBQYWNrZXQ7CisKKwkvKioqKioqIE5PVEUgOiB0aGUgVFggbG9jayBpcyBoZWxkIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgKioqKioqKioqKioqKioqKiovCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19TRU5ELAorCQkJKCIrZ2V0X2h0Y19zZW5kX3BhY2tldHMgJWQgcmVzb3VyY2VzXG4iLCBSZXNvdXJjZXMpKTsKKworCS8qIGxvb3AgdW50aWwgd2UgY2FuIGdyYWIgYXMgbWFueSBwYWNrZXRzIG91dCBvZiB0aGUgcXVldWUgYXMgd2UgY2FuICovCisJd2hpbGUgKFJlc291cmNlcyA+IDApIHsKKwkJaW50IG51bV9mcmFnczsKKworCQlwUGFja2V0ID0gaHRjX3BhY2tldF9kZXF1ZXVlKCZwRW5kcG9pbnQtPlR4UXVldWUpOworCQlpZiAocFBhY2tldCA9PSBOVUxMKSB7CisJCQlicmVhazsKKwkJfQorCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsCisJCQkJKCIgR290IHBhY2tldDolcCAsIE5ldyBRdWV1ZSBEZXB0aDogJWRcbiIsCisJCQkJIHBQYWNrZXQsCisJCQkJIEhUQ19QQUNLRVRfUVVFVUVfREVQVEgoJnBFbmRwb2ludC0+VHhRdWV1ZSkpKTsKKwkJLyogRm9yIG5vbi1jcmVkaXQgcGF0aCB0aGUgc2VxdWVuY2UgbnVtYmVyIGlzIGFscmVhZHkgZW1iZWRkZWQKKwkJICogaW4gdGhlIGNvbnN0cnVjdGVkIEhUQyBoZWFkZXIKKwkJICovCisjaWYgMAorCQlwUGFja2V0LT5Qa3RJbmZvLkFzVHguU2VxTm8gPSBwRW5kcG9pbnQtPlNlcU5vOworCQlwRW5kcG9pbnQtPlNlcU5vKys7CisjZW5kaWYKKwkJcFBhY2tldC0+UGt0SW5mby5Bc1R4LlNlbmRGbGFncyA9IDA7CisJCXBQYWNrZXQtPlBrdEluZm8uQXNUeC5DcmVkaXRzVXNlZCA9IDA7CisJCS8qIHF1ZXVlIHRoaXMgcGFja2V0IGludG8gdGhlIGNhbGxlcidzIHF1ZXVlICovCisJCUhUQ19QQUNLRVRfRU5RVUVVRShwUXVldWUsIHBQYWNrZXQpOworCisJCS8qCisJCSAqIEZJWCBUSElTOgorCQkgKiBGb3Igbm93LCBhdm9pZCBjYWxsaW5nIGNkZl9uYnVmX2dldF9udW1fZnJhZ3MgYmVmb3JlIGNhbGxpbmcKKwkJICogY2RmX25idWZfbWFwLCBiZWNhdXNlIHRoZSBNYWNPUyB2ZXJzaW9uIG9mIGNkZl9uYnVmX3QgZG9lc24ndAorCQkgKiBzdXBwb3J0IGNkZl9uYnVmX2dldF9udW1fZnJhZ3MgdW50aWwgYWZ0ZXIgY2RmX25idWZfbWFwIGhhcworCQkgKiBiZWVuIGRvbmUuCisJCSAqIEFzc3VtZSB0aGF0IHRoZSBub24tZGF0YSBuZXRidWZzLCBpLmUuIHRoZSBXTUkgbWVzc2FnZSBuZXRidWZzLAorCQkgKiBjb25zaXN0IG9mIGEgc2luZ2xlIGZyYWdtZW50LgorCQkgKi8KKwkJbnVtX2ZyYWdzID0KKwkJCShwUGFja2V0LT5Qa3RJbmZvLkFzVHguCisJCQkgRmxhZ3MgJiBIVENfVFhfUEFDS0VUX0ZMQUdfRklYVVBfTkVUQlVGKSA/IDEKKwkJICAgICAgICAvKiBXTUkgbWVzc2FnZXMgYXJlIGluIGEgc2luZ2xlLWZyYWdtZW50IG5ldHdvcmsgYnVmZmVyICovIDoKKwkJCWNkZl9uYnVmX2dldF9udW1fZnJhZ3MoR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUCisJCQkJCQkgICAgICAgKHBQYWNrZXQpKTsKKwkJUmVzb3VyY2VzIC09IG51bV9mcmFnczsKKwl9CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsICgiLWdldF9odGNfc2VuZF9wYWNrZXRzIFxuIikpOworCit9CisKK3N0YXRpYyBIVENfU0VORF9RVUVVRV9SRVNVTFQgaHRjX3RyeV9zZW5kKEhUQ19UQVJHRVQgKnRhcmdldCwKKwkJCQkJICBIVENfRU5EUE9JTlQgKnBFbmRwb2ludCwKKwkJCQkJICBIVENfUEFDS0VUX1FVRVVFICpwQ2FsbGVyc1NlbmRRdWV1ZSkKK3sKKwlIVENfUEFDS0VUX1FVRVVFIHNlbmRRdWV1ZTsgICAgIC8qIHRlbXAgcXVldWUgdG8gaG9sZCBwYWNrZXRzIGF0IHZhcmlvdXMgc3RhZ2VzICovCisJSFRDX1BBQ0tFVCAqcFBhY2tldDsKKwlpbnQgdHhfcmVzb3VyY2VzOworCWludCBvdmVyZmxvdzsKKwlIVENfU0VORF9RVUVVRV9SRVNVTFQgcmVzdWx0ID0gSFRDX1NFTkRfUVVFVUVfT0s7CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsICgiK2h0Y190cnlfc2VuZCAoUXVldWU6JXAgRGVwdGg6JWQpXG4iLAorCQkJCQkgcENhbGxlcnNTZW5kUXVldWUsCisJCQkJCSAocENhbGxlcnNTZW5kUXVldWUgPT0KKwkJCQkJICBOVUxMKSA/IDAgOgorCQkJCQkgSFRDX1BBQ0tFVF9RVUVVRV9ERVBUSAorCQkJCQkJIChwQ2FsbGVyc1NlbmRRdWV1ZSkpKTsKKworCS8qIGluaXQgdGhlIGxvY2FsIHNlbmQgcXVldWUgKi8KKwlJTklUX0hUQ19QQUNLRVRfUVVFVUUoJnNlbmRRdWV1ZSk7CisKKwlkbyB7CisKKwkJaWYgKE5VTEwgPT0gcENhbGxlcnNTZW5kUXVldWUpIHsKKwkJCS8qIGNhbGxlciBkaWRuJ3QgcHJvdmlkZSBhIHF1ZXVlLCBqdXN0IHdhbnRzIHVzIHRvIGNoZWNrIHF1ZXVlcyBhbmQgc2VuZCAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoSFRDX1FVRVVFX0VNUFRZKHBDYWxsZXJzU2VuZFF1ZXVlKSkgeworCQkJLyogZW1wdHkgcXVldWUgKi8KKwkJCU9MX0FUSF9IVENfUEtUX0VSUk9SX0NPVU5UX0lOQ1IodGFyZ2V0LAorCQkJCQkJCUhUQ19QS1RfUV9FTVBUWSk7CisJCQlyZXN1bHQgPSBIVENfU0VORF9RVUVVRV9EUk9QOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoSFRDX1BBQ0tFVF9RVUVVRV9ERVBUSCgmcEVuZHBvaW50LT5UeFF1ZXVlKSA+PQorCQkgICAgcEVuZHBvaW50LT5NYXhUeFF1ZXVlRGVwdGgpIHsKKwkJCS8qIHdlJ3ZlIGFscmVhZHkgb3ZlcmZsb3dlZCAqLworCQkJb3ZlcmZsb3cgPSBIVENfUEFDS0VUX1FVRVVFX0RFUFRIKHBDYWxsZXJzU2VuZFF1ZXVlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2Ugd2lsbCBvdmVyZmxvdyBieSAqLworCQkJb3ZlcmZsb3cgPSBIVENfUEFDS0VUX1FVRVVFX0RFUFRIKCZwRW5kcG9pbnQtPlR4UXVldWUpOworCQkJb3ZlcmZsb3cgKz0gSFRDX1BBQ0tFVF9RVUVVRV9ERVBUSChwQ2FsbGVyc1NlbmRRdWV1ZSk7CisJCQkvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIHdlIHdpbGwgb3ZlcmZsb3cgdGhlIFRYIHF1ZXVlIGJ5ICovCisJCQlvdmVyZmxvdyAtPSBwRW5kcG9pbnQtPk1heFR4UXVldWVEZXB0aDsKKwkJfQorCisJCS8qIGlmIG92ZXJmbG93IGlzIG5lZ2F0aXZlIG9yIHplcm8sIHdlIGFyZSBva2F5ICovCisJCWlmIChvdmVyZmxvdyA+IDApIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfU0VORCwKKwkJCQkJKCIgRW5kcG9pbnQgJWQsIFRYIHF1ZXVlIHdpbGwgb3ZlcmZsb3cgOiVkICwgVHggRGVwdGg6JWQsIE1heDolZCBcbiIsCisJCQkJCSBwRW5kcG9pbnQtPklkLCBvdmVyZmxvdywKKwkJCQkJIEhUQ19QQUNLRVRfUVVFVUVfREVQVEgoJnBFbmRwb2ludC0+CisJCQkJCQkJCVR4UXVldWUpLAorCQkJCQkgcEVuZHBvaW50LT5NYXhUeFF1ZXVlRGVwdGgpKTsKKwkJfQorCQlpZiAoKG92ZXJmbG93IDw9IDApCisJCSAgICB8fCAocEVuZHBvaW50LT5FcENhbGxCYWNrcy5FcFNlbmRGdWxsID09IE5VTEwpKSB7CisJCQkvKiBhbGwgcGFja2V0cyB3aWxsIGZpdCBvciBjYWxsZXIgZGlkIG5vdCBwcm92aWRlIHNlbmQgZnVsbCBpbmRpY2F0aW9uIGhhbmRsZXIKKwkJCSAqIC0tICBqdXN0IG1vdmUgYWxsIG9mIHRoZW0gdG8gdGhlIGxvY2FsIHNlbmRRdWV1ZSBvYmplY3QgKi8KKwkJCUhUQ19QQUNLRVRfUVVFVUVfVFJBTlNGRVJfVE9fVEFJTCgmc2VuZFF1ZXVlLAorCQkJCQkJCSAgcENhbGxlcnNTZW5kUXVldWUpOworCQl9IGVsc2UgeworCQkJaW50IGk7CisJCQlpbnQgZ29vZFBrdHMgPQorCQkJCUhUQ19QQUNLRVRfUVVFVUVfREVQVEgocENhbGxlcnNTZW5kUXVldWUpIC0KKwkJCQlvdmVyZmxvdzsKKworCQkJQV9BU1NFUlQoZ29vZFBrdHMgPj0gMCk7CisJCQkvKiB3ZSBoYXZlIG92ZXJmbG93ZWQsIGFuZCBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkICovCisJCQkvKiBkZXF1ZXVlIGFsbCBub24tb3ZlcmZsb3cgcGFja2V0cyBpbnRvIHRoZSBzZW5kcXVldWUgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBnb29kUGt0czsgaSsrKSB7CisJCQkJLyogcG9wIG9mZiBjYWxsZXIncyBxdWV1ZSAqLworCQkJCXBQYWNrZXQgPSBodGNfcGFja2V0X2RlcXVldWUocENhbGxlcnNTZW5kUXVldWUpOworCQkJCUFfQVNTRVJUKHBQYWNrZXQgIT0gTlVMTCk7CisJCQkJLyogaW5zZXJ0IGludG8gbG9jYWwgcXVldWUgKi8KKwkJCQlIVENfUEFDS0VUX0VOUVVFVUUoJnNlbmRRdWV1ZSwgcFBhY2tldCk7CisJCQl9CisKKwkJCS8qIHRoZSBjYWxsZXIncyBxdWV1ZSBoYXMgYWxsIHRoZSBwYWNrZXRzIHRoYXQgd29uJ3QgZml0ICovCisJCQkvKiB3YWxrIHRocm91Z2ggdGhlIGNhbGxlcidzIHF1ZXVlIGFuZCBpbmRpY2F0ZSBlYWNoIG9uZSB0byB0aGUgc2VuZCBmdWxsIGhhbmRsZXIgKi8KKwkJCUlURVJBVEVfT1ZFUl9MSVNUX0FMTE9XX1JFTU9WRSgmcENhbGxlcnNTZW5kUXVldWUtPgorCQkJCQkJICAgICAgIFF1ZXVlSGVhZCwgcFBhY2tldCwKKwkJCQkJCSAgICAgICBIVENfUEFDS0VULCBMaXN0TGluaykgeworCisJCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19TRU5ELAorCQkJCQkJKCIgSW5kaWNhdGluZyBvdmVyZmxvd2VkIFRYIHBhY2tldDogJXAgXG4iLAorCQkJCQkJIHBQYWNrZXQpKTsKKwkJCQkvKgorCQkJCSAqIFJlbW92ZSBoZWFkcm9vbSByZXNlcnZlZCBmb3IgSFRDX0ZSQU1FX0hEUiBiZWZvcmUgZ2l2aW5nCisJCQkJICogdGhlIHBhY2tldCBiYWNrIHRvIHRoZSB1c2VyIHZpYSB0aGUgRXBTZW5kRnVsbCBjYWxsYmFjay4KKwkJCQkgKi8KKwkJCQlyZXN0b3JlX3R4X3BhY2tldCh0YXJnZXQsIHBQYWNrZXQpOworCisJCQkJaWYgKHBFbmRwb2ludC0+RXBDYWxsQmFja3MuCisJCQkJICAgIEVwU2VuZEZ1bGwocEVuZHBvaW50LT5FcENhbGxCYWNrcy5wQ29udGV4dCwKKwkJCQkJICAgICAgIHBQYWNrZXQpID09IEhUQ19TRU5EX0ZVTExfRFJPUCkgeworCQkJCQkvKiBjYWxsYmFjayB3YW50cyB0aGUgcGFja2V0IGRyb3BwZWQgKi8KKwkJCQkJSU5DX0hUQ19FUF9TVEFUKHBFbmRwb2ludCwgVHhEcm9wcGVkLAorCQkJCQkJCTEpOworCQkJCQkvKiBsZWF2ZSB0aGlzIG9uZSBpbiB0aGUgY2FsbGVyJ3MgcXVldWUgZm9yIGNsZWFudXAgKi8KKwkJCQl9IGVsc2UgeworCQkJCQkvKiBjYWxsYmFjayB3YW50cyB0byBrZWVwIHRoaXMgcGFja2V0LCByZW1vdmUgZnJvbSBjYWxsZXIncyBxdWV1ZSAqLworCQkJCQlIVENfUEFDS0VUX1JFTU9WRShwQ2FsbGVyc1NlbmRRdWV1ZSwKKwkJCQkJCQkgIHBQYWNrZXQpOworCQkJCQkvKiBwdXQgaXQgaW4gdGhlIHNlbmQgcXVldWUgKi8KKwkJCQkJLyogYWRkIEhUQ19GUkFNRV9IRFIgc3BhY2UgcmVzZXJ2YXRpb24gYWdhaW4gKi8KKwkJCQkJY2RmX25idWZfcHVzaF9oZWFkCisJCQkJCQkoR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUCisJCQkJCQkJKHBQYWNrZXQpLCBzaXplb2YoSFRDX0ZSQU1FX0hEUikpOworCisJCQkJCUhUQ19QQUNLRVRfRU5RVUVVRSgmc2VuZFF1ZXVlLCBwUGFja2V0KTsKKwkJCQl9CisKKwkJCX0KKwkJCUlURVJBVEVfRU5EOworCisJCQlpZiAoSFRDX1FVRVVFX0VNUFRZKCZzZW5kUXVldWUpKSB7CisJCQkJLyogbm8gcGFja2V0cyBtYWRlIGl0IGluLCBjYWxsZXIgd2lsbCBjbGVhbnVwICovCisJCQkJT0xfQVRIX0hUQ19QS1RfRVJST1JfQ09VTlRfSU5DUih0YXJnZXQsCisJCQkJCQkJCUhUQ19TRU5EX1FfRU1QVFkpOworCQkJCXJlc3VsdCA9IEhUQ19TRU5EX1FVRVVFX0RST1A7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCX0gd2hpbGUgKGZhbHNlKTsKKworCWlmIChyZXN1bHQgIT0gSFRDX1NFTkRfUVVFVUVfT0spIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19TRU5ELCAoIi1odGNfdHJ5X3NlbmQ6ICBcbiIpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlpZiAoIUlTX1RYX0NSRURJVF9GTE9XX0VOQUJMRUQocEVuZHBvaW50KSkgeworCQl0eF9yZXNvdXJjZXMgPQorCQkJaGlmX2dldF9mcmVlX3F1ZXVlX251bWJlcih0YXJnZXQtPmhpZl9kZXYsCisJCQkJCQkgIHBFbmRwb2ludC0+VUxfUGlwZUlEKTsKKwl9IGVsc2UgeworCQl0eF9yZXNvdXJjZXMgPSAwOworCX0KKworCUxPQ0tfSFRDX1RYKHRhcmdldCk7CisKKwlpZiAoIUhUQ19RVUVVRV9FTVBUWSgmc2VuZFF1ZXVlKSkgeworCQkvKiB0cmFuc2ZlciBwYWNrZXRzIHRvIHRhaWwgKi8KKwkJSFRDX1BBQ0tFVF9RVUVVRV9UUkFOU0ZFUl9UT19UQUlMKCZwRW5kcG9pbnQtPlR4UXVldWUsCisJCQkJCQkgICZzZW5kUXVldWUpOworCQlBX0FTU0VSVChIVENfUVVFVUVfRU1QVFkoJnNlbmRRdWV1ZSkpOworCQlJTklUX0hUQ19QQUNLRVRfUVVFVUUoJnNlbmRRdWV1ZSk7CisJfQorCisJLyogaW5jcmVtZW50IHR4IHByb2Nlc3NpbmcgY291bnQgb24gZW50cnkgKi8KKwljZGZfYXRvbWljX2luYygmcEVuZHBvaW50LT5UeFByb2Nlc3NDb3VudCk7CisJaWYgKGNkZl9hdG9taWNfcmVhZCgmcEVuZHBvaW50LT5UeFByb2Nlc3NDb3VudCkgPiAxKSB7CisJCS8qIGFub3RoZXIgdGhyZWFkIG9yIHRhc2sgaXMgZHJhaW5pbmcgdGhlIFRYIHF1ZXVlcyBvbiB0aGlzIGVuZHBvaW50CisJCSAqIHRoYXQgdGhyZWFkIHdpbGwgcmVzZXQgdGhlIHR4IHByb2Nlc3NpbmcgY291bnQgd2hlbiB0aGUgcXVldWUgaXMgZHJhaW5lZCAqLworCQljZGZfYXRvbWljX2RlYygmcEVuZHBvaW50LT5UeFByb2Nlc3NDb3VudCk7CisJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19TRU5ELCAoIi1odGNfdHJ5X3NlbmQgKGJ1c3kpIFxuIikpOworCQlyZXR1cm4gSFRDX1NFTkRfUVVFVUVfT0s7CisJfQorCisJLyoqKioqIGJleW9uZCB0aGlzIHBvaW50IG9ubHkgMSB0aHJlYWQgbWF5IGVudGVyICoqKioqKi8KKworCS8qIG5vdyBkcmFpbiB0aGUgZW5kcG9pbnQgVFggcXVldWUgZm9yIHRyYW5zbWlzc2lvbiBhcyBsb25nIGFzIHdlIGhhdmUgZW5vdWdoCisJICogdHJhbnNtaXQgcmVzb3VyY2VzICovCisJd2hpbGUgKHRydWUpIHsKKworCQlpZiAoSFRDX1BBQ0tFVF9RVUVVRV9ERVBUSCgmcEVuZHBvaW50LT5UeFF1ZXVlKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChJU19UWF9DUkVESVRfRkxPV19FTkFCTEVEKHBFbmRwb2ludCkpIHsKKyNpZiBERUJVR19DUkVESVQKKwkJCWludCBjcmVkID0gcEVuZHBvaW50LT5UeENyZWRpdHM7CisjZW5kaWYKKwkJCS8qIGNyZWRpdCBiYXNlZCBtZWNoYW5pc20gcHJvdmlkZXMgZmxvdyBjb250cm9sIGJhc2VkIG9uIHRhcmdldCB0cmFuc21pdCByZXNvdXJjZSBhdmFpbGFiaWxpdHksIHdlCisJCQkgKiBhc3N1bWUgdGhhdCB0aGUgSElGIGxheWVyIHdpbGwgYWx3YXlzIGhhdmUgYnVzIHJlc291cmNlcyBncmVhdGVyIHRoYW4gdGFyZ2V0IHRyYW5zbWl0IHJlc291cmNlcyAqLworCQkJZ2V0X2h0Y19zZW5kX3BhY2tldHNfY3JlZGl0X2Jhc2VkKHRhcmdldCwgcEVuZHBvaW50LAorCQkJCQkJCSAgJnNlbmRRdWV1ZSk7CisjaWYgREVCVUdfQ1JFRElUCisJCQlpZiAoZXBfZGVidWdfbWFzayAmICgxIDw8IHBFbmRwb2ludC0+SWQpKSB7CisJCQkJaWYgKGNyZWQgLSBwRW5kcG9pbnQtPlR4Q3JlZGl0cyA+IDApIHsKKwkJCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsCisJCQkJCQkJKCIgPEhUQz4gRGVjcmVhc2UgRVAlZCAlZCAtICVkID0gJWQgY3JlZGl0cy5cbiIsCisJCQkJCQkJIHBFbmRwb2ludC0+SWQsIGNyZWQsCisJCQkJCQkJIGNyZWQgLQorCQkJCQkJCSBwRW5kcG9pbnQtPlR4Q3JlZGl0cywKKwkJCQkJCQkgcEVuZHBvaW50LT5UeENyZWRpdHMpKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCS8qIGdldCBhbGwgdGhlIHBhY2tldHMgZm9yIHRoaXMgZW5kcG9pbnQgdGhhdCB3ZSBjYW4gZm9yIHRoaXMgcGFzcyAqLworCQkJZ2V0X2h0Y19zZW5kX3BhY2tldHModGFyZ2V0LCBwRW5kcG9pbnQsICZzZW5kUXVldWUsCisJCQkJCSAgICAgdHhfcmVzb3VyY2VzKTsKKwkJfQorCisJCWlmIChIVENfUEFDS0VUX1FVRVVFX0RFUFRIKCZzZW5kUXVldWUpID09IDApIHsKKwkJCS8qIGRpZG4ndCBnZXQgYW55IHBhY2tldHMgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMgb3IgVFggcXVldWUgd2FzIGRyYWluZWQgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJVU5MT0NLX0hUQ19UWCh0YXJnZXQpOworCisJCS8qIHNlbmQgd2hhdCB3ZSBjYW4gKi8KKwkJaHRjX2lzc3VlX3BhY2tldHModGFyZ2V0LCBwRW5kcG9pbnQsICZzZW5kUXVldWUpOworCisJCWlmICghSVNfVFhfQ1JFRElUX0ZMT1dfRU5BQkxFRChwRW5kcG9pbnQpKSB7CisJCQl0eF9yZXNvdXJjZXMgPQorCQkJCWhpZl9nZXRfZnJlZV9xdWV1ZV9udW1iZXIodGFyZ2V0LT5oaWZfZGV2LAorCQkJCQkJCSAgcEVuZHBvaW50LT5VTF9QaXBlSUQpOworCQl9CisKKwkJTE9DS19IVENfVFgodGFyZ2V0KTsKKworCX0KKworCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwkvKiBkb25lIHdpdGggdGhpcyBlbmRwb2ludCwgd2UgY2FuIGNsZWFyIHRoZSBjb3VudCAqLworCWNkZl9hdG9taWNfaW5pdCgmcEVuZHBvaW50LT5UeFByb2Nlc3NDb3VudCk7CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsICgiLWh0Y190cnlfc2VuZDogIFxuIikpOworCisJcmV0dXJuIEhUQ19TRU5EX1FVRVVFX09LOworfQorCisjaWZkZWYgVVNCX0hJRl9TSU5HTEVfUElQRV9EQVRBX1NDSEVECitzdGF0aWMgQV9VSU5UMTYgaHRjX3NlbmRfcGt0c19zY2hlZF9jaGVjayhIVENfSEFORExFIEhUQ0hhbmRsZSwgSFRDX0VORFBPSU5UX0lEIGlkKQoreworCUhUQ19UQVJHRVQgKnRhcmdldCA9IEdFVF9IVENfVEFSR0VUX0ZST01fSEFORExFKEhUQ0hhbmRsZSk7CisJSFRDX0VORFBPSU5UICpwRW5kcG9pbnQ7CisJSFRDX0VORFBPSU5UX0lEIGVpZDsKKwlIVENfUEFDS0VUX1FVRVVFICpwVHhRdWV1ZTsKKwlBX1VJTlQxNiByZXNvdXJjZXM7CisJQV9VSU5UMTYgYWNRdWV1ZVN0YXR1c1tEQVRBX0VQX1NJWkVdID0geyAwLCAwLCAwLCAwIH07CisKKwlpZiAoaWQgPCBFTkRQT0lOVF8yIHx8IGlkID4gRU5EUE9JTlRfNSkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKGVpZCA9IEVORFBPSU5UXzI7IGVpZCA8PSBFTkRQT0lOVF81OyBlaWQrKykgeworCQlwRW5kcG9pbnQgPSAmdGFyZ2V0LT5FbmRQb2ludFtlaWRdOworCQlwVHhRdWV1ZSA9ICZwRW5kcG9pbnQtPlR4UXVldWU7CisKKwkJaWYgKEhUQ19RVUVVRV9FTVBUWShwVHhRdWV1ZSkpIHsKKwkJCWFjUXVldWVTdGF0dXNbZWlkIC0gMl0gPSAxOworCQl9CisJfQorCisJc3dpdGNoIChpZCkgeworCWNhc2UgRU5EUE9JTlRfMjogICAgICAgIC8qIEJFICovCisJCXJldHVybiAoYWNRdWV1ZVN0YXR1c1swXSAmJiBhY1F1ZXVlU3RhdHVzWzJdCisJCQkmJiBhY1F1ZXVlU3RhdHVzWzNdKTsKKwljYXNlIEVORFBPSU5UXzM6ICAgICAgICAvKiBCSyAqLworCQlyZXR1cm4gKGFjUXVldWVTdGF0dXNbMF0gJiYgYWNRdWV1ZVN0YXR1c1sxXSAmJiBhY1F1ZXVlU3RhdHVzWzJdCisJCQkmJiBhY1F1ZXVlU3RhdHVzWzNdKTsKKwljYXNlIEVORFBPSU5UXzQ6ICAgICAgICAvKiBWSSAqLworCQlyZXR1cm4gKGFjUXVldWVTdGF0dXNbMl0gJiYgYWNRdWV1ZVN0YXR1c1szXSk7CisJY2FzZSBFTkRQT0lOVF81OiAgICAgICAgLyogVk8gKi8KKwkJcmV0dXJuIChhY1F1ZXVlU3RhdHVzWzNdKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKK30KKworc3RhdGljIEFfU1RBVFVTIGh0Y19zZW5kX3BrdHNfc2NoZWRfcXVldWUoSFRDX1RBUkdFVCAqdGFyZ2V0LAorCQkJCQkgIEhUQ19QQUNLRVRfUVVFVUUgKnBQa3RRdWV1ZSwKKwkJCQkJICBIVENfRU5EUE9JTlRfSUQgZWlkKQoreworCUhUQ19FTkRQT0lOVCAqcEVuZHBvaW50OworCUhUQ19QQUNLRVRfUVVFVUUgKnBUeFF1ZXVlOworCUhUQ19QQUNLRVQgKnBQYWNrZXQ7CisJaW50IGdvb2RQa3RzOworCisJcEVuZHBvaW50ID0gJnRhcmdldC0+RW5kUG9pbnRbZWlkXTsKKwlwVHhRdWV1ZSA9ICZwRW5kcG9pbnQtPlR4UXVldWU7CisKKwlMT0NLX0hUQ19UWCh0YXJnZXQpOworCisJZ29vZFBrdHMgPQorCQlwRW5kcG9pbnQtPk1heFR4UXVldWVEZXB0aCAtCisJCUhUQ19QQUNLRVRfUVVFVUVfREVQVEgoJnBFbmRwb2ludC0+VHhRdWV1ZSk7CisKKwlpZiAoZ29vZFBrdHMgPiAwKSB7CisJCXdoaWxlICghSFRDX1FVRVVFX0VNUFRZKHBQa3RRdWV1ZSkpIHsKKwkJCXBQYWNrZXQgPSBodGNfcGFja2V0X2RlcXVldWUocFBrdFF1ZXVlKTsKKwkJCUhUQ19QQUNLRVRfRU5RVUVVRShwVHhRdWV1ZSwgcFBhY2tldCk7CisJCQlnb29kUGt0cy0tOworCisJCQlpZiAoZ29vZFBrdHMgPD0gMCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKEhUQ19QQUNLRVRfUVVFVUVfREVQVEgocFBrdFF1ZXVlKSkgeworCQlJVEVSQVRFX09WRVJfTElTVF9BTExPV19SRU1PVkUoJnBQa3RRdWV1ZS0+UXVldWVIZWFkLCBwUGFja2V0LAorCQkJCQkgICAgICAgSFRDX1BBQ0tFVCwgTGlzdExpbmspIHsKKworCQkJaWYgKHBFbmRwb2ludC0+RXBDYWxsQmFja3MuCisJCQkgICAgRXBTZW5kRnVsbChwRW5kcG9pbnQtPkVwQ2FsbEJhY2tzLnBDb250ZXh0LAorCQkJCSAgICAgICBwUGFja2V0KSA9PSBIVENfU0VORF9GVUxMX0RST1ApIHsKKwkJCQlJTkNfSFRDX0VQX1NUQVQocEVuZHBvaW50LCBUeERyb3BwZWQsIDEpOworCQkJfSBlbHNlIHsKKwkJCQlIVENfUEFDS0VUX1JFTU9WRShwUGt0UXVldWUsIHBQYWNrZXQpOworCQkJCUhUQ19QQUNLRVRfRU5RVUVVRShwVHhRdWV1ZSwgcFBhY2tldCk7CisJCQl9CisJCX0KKwkJSVRFUkFURV9FTkQ7CisJfQorCisJVU5MT0NLX0hUQ19UWCh0YXJnZXQpOworCisJcmV0dXJuIEFfT0s7Cit9CisKKyNlbmRpZgorCitBX1NUQVRVUyBodGNfc2VuZF9wa3RzX211bHRpcGxlKEhUQ19IQU5ETEUgSFRDSGFuZGxlLCBIVENfUEFDS0VUX1FVRVVFICpwUGt0UXVldWUpCit7CisJSFRDX1RBUkdFVCAqdGFyZ2V0ID0gR0VUX0hUQ19UQVJHRVRfRlJPTV9IQU5ETEUoSFRDSGFuZGxlKTsKKwlIVENfRU5EUE9JTlQgKnBFbmRwb2ludDsKKwlIVENfUEFDS0VUICpwUGFja2V0OworCWNkZl9uYnVmX3QgbmV0YnVmOworCUhUQ19GUkFNRV9IRFIgKnBIdGNIZHI7CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsCisJCQkoIitodGNfc2VuZF9wa3RzX211bHRpcGxlOiBRdWV1ZTogJXAsIFBrdHMgJWQgXG4iLAorCQkJIHBQa3RRdWV1ZSwgSFRDX1BBQ0tFVF9RVUVVRV9ERVBUSChwUGt0UXVldWUpKSk7CisKKwkvKiBnZXQgcGFja2V0IGF0IGhlYWQgdG8gZmlndXJlIG91dCB3aGljaCBlbmRwb2ludCB0aGVzZSBwYWNrZXRzIHdpbGwgZ28gaW50byAqLworCXBQYWNrZXQgPSBodGNfZ2V0X3BrdF9hdF9oZWFkKHBQa3RRdWV1ZSk7CisJaWYgKE5VTEwgPT0gcFBhY2tldCkgeworCQlPTF9BVEhfSFRDX1BLVF9FUlJPUl9DT1VOVF9JTkNSKHRhcmdldCwgR0VUX0hUQ19QS1RfUV9GQUlMKTsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19TRU5ELCAoIi1odGNfc2VuZF9wa3RzX211bHRpcGxlIFxuIikpOworCQlyZXR1cm4gQV9FSU5WQUw7CisJfQorCisJQVJfREVCVUdfQVNTRVJUKHBQYWNrZXQtPkVuZHBvaW50IDwgRU5EUE9JTlRfTUFYKTsKKwlwRW5kcG9pbnQgPSAmdGFyZ2V0LT5FbmRQb2ludFtwUGFja2V0LT5FbmRwb2ludF07CisKKwlpZiAoIXBFbmRwb2ludC0+U2VydmljZUlEKSB7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfU0VORCwgKCIlcyBTZXJ2aWNlSUQgaXMgaW52YWxpZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pKTsKKwkJcmV0dXJuIEFfRUlOVkFMOworCX0KKworI2lmZGVmIEhUQ19FUF9TVEFUX1BST0ZJTElORworCUxPQ0tfSFRDX1RYKHRhcmdldCk7CisJSU5DX0hUQ19FUF9TVEFUKHBFbmRwb2ludCwgVHhQb3N0ZWQsIEhUQ19QQUNLRVRfUVVFVUVfREVQVEgocFBrdFF1ZXVlKSk7CisJVU5MT0NLX0hUQ19UWCh0YXJnZXQpOworI2VuZGlmCisKKwkvKiBwcm92aWRlIHJvb20gaW4gZWFjaCBwYWNrZXQncyBuZXRidWYgZm9yIHRoZSBIVEMgZnJhbWUgaGVhZGVyICovCisJSFRDX1BBQ0tFVF9RVUVVRV9JVEVSQVRFX0FMTE9XX1JFTU9WRShwUGt0UXVldWUsIHBQYWNrZXQpIHsKKwkJbmV0YnVmID0gR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKHBQYWNrZXQpOworCQlBUl9ERUJVR19BU1NFUlQobmV0YnVmKTsKKworCQljZGZfbmJ1Zl9wdXNoX2hlYWQobmV0YnVmLCBzaXplb2YoSFRDX0ZSQU1FX0hEUikpOworCQkvKiBzZXR1cCBIVEMgZnJhbWUgaGVhZGVyICovCisJCXBIdGNIZHIgPSAoSFRDX0ZSQU1FX0hEUiAqKSBjZGZfbmJ1Zl9nZXRfZnJhZ192YWRkcihuZXRidWYsIDApOworCQlBUl9ERUJVR19BU1NFUlQocEh0Y0hkcik7CisJCUhUQ19XUklURTMyKHBIdGNIZHIsCisJCQkgICAgU00ocFBhY2tldC0+QWN0dWFsTGVuZ3RoLAorCQkJICAgICAgIEhUQ19GUkFNRV9IRFJfUEFZTE9BRExFTikgfCBTTShwUGFja2V0LT5FbmRwb2ludCwKKwkJCQkJCQkgICAgICBIVENfRlJBTUVfSERSX0VORFBPSU5USUQpKTsKKworCQlMT0NLX0hUQ19UWCh0YXJnZXQpOworCisJCXBQYWNrZXQtPlBrdEluZm8uQXNUeC5TZXFObyA9IHBFbmRwb2ludC0+U2VxTm87CisJCXBFbmRwb2ludC0+U2VxTm8rKzsKKworCQlIVENfV1JJVEUzMigoKEFfVUlOVDMyICopIHBIdGNIZHIpICsgMSwKKwkJCSAgICBTTShwUGFja2V0LT5Qa3RJbmZvLkFzVHguU2VxTm8sCisJCQkgICAgICAgSFRDX0ZSQU1FX0hEUl9DT05UUk9MQllURVMxKSk7CisKKwkJVU5MT0NLX0hUQ19UWCh0YXJnZXQpOworCQkvKgorCQkgKiBOb3cgdGhhdCB0aGUgSFRDIGZyYW1lIGhlYWRlciBoYXMgYmVlbiBhZGRlZCwgdGhlIG5ldGJ1ZiBjYW4gYmUKKwkJICogbWFwcGVkLiAgVGhpcyBvbmx5IGFwcGxpZXMgdG8gbm9uLWRhdGEgZnJhbWVzLCBzaW5jZSBkYXRhIGZyYW1lcworCQkgKiB3ZXJlIGFscmVhZHkgbWFwcGVkIGFzIHRoZXkgZW50ZXJlZCBpbnRvIHRoZSBkcml2ZXIuCisJCSAqLworCQljZGZfbmJ1Zl9tYXAodGFyZ2V0LT5vc2RldiwKKwkJCSAgICAgR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKHBQYWNrZXQpLAorCQkJICAgICBDREZfRE1BX1RPX0RFVklDRSk7CisKKwkJcFBhY2tldC0+UGt0SW5mby5Bc1R4LkZsYWdzIHw9IEhUQ19UWF9QQUNLRVRfRkxBR19GSVhVUF9ORVRCVUY7CisJfQorCUhUQ19QQUNLRVRfUVVFVUVfSVRFUkFURV9FTkQ7CisKKyNpZmRlZiBVU0JfSElGX1NJTkdMRV9QSVBFX0RBVEFfU0NIRUQKKwlpZiAoIWh0Y19zZW5kX3BrdHNfc2NoZWRfY2hlY2soSFRDSGFuZGxlLCBwRW5kcG9pbnQtPklkKSkgeworCQlodGNfc2VuZF9wa3RzX3NjaGVkX3F1ZXVlKEhUQ0hhbmRsZSwgcFBrdFF1ZXVlLCBwRW5kcG9pbnQtPklkKTsKKwl9IGVsc2UgeworCQlodGNfdHJ5X3NlbmQodGFyZ2V0LCBwRW5kcG9pbnQsIHBQa3RRdWV1ZSk7CisJfQorI2Vsc2UKKwlodGNfdHJ5X3NlbmQodGFyZ2V0LCBwRW5kcG9pbnQsIHBQa3RRdWV1ZSk7CisjZW5kaWYKKworCS8qIGRvIGNvbXBsZXRpb24gb24gYW55IHBhY2tldHMgdGhhdCBjb3VsZG4ndCBnZXQgaW4gKi8KKwlpZiAoIUhUQ19RVUVVRV9FTVBUWShwUGt0UXVldWUpKSB7CisKKwkJSFRDX1BBQ0tFVF9RVUVVRV9JVEVSQVRFX0FMTE9XX1JFTU9WRShwUGt0UXVldWUsIHBQYWNrZXQpIHsKKwkJCS8qIHJlbW92ZSB0aGUgaGVhZHJvb20gcmVzZXJ2ZWQgZm9yIEhUQ19GUkFNRV9IRFIgKi8KKwkJCXJlc3RvcmVfdHhfcGFja2V0KHRhcmdldCwgcFBhY2tldCk7CisKKwkJCWlmIChIVENfU1RPUFBJTkcodGFyZ2V0KSkgeworCQkJCXBQYWNrZXQtPlN0YXR1cyA9IEFfRUNBTkNFTEVEOworCQkJfSBlbHNlIHsKKwkJCQlwUGFja2V0LT5TdGF0dXMgPSBBX05PX1JFU09VUkNFOworCQkJfQorCQl9CisJCUhUQ19QQUNLRVRfUVVFVUVfSVRFUkFURV9FTkQ7CisKKwkJZG9fc2VuZF9jb21wbGV0aW9uKHBFbmRwb2ludCwgcFBrdFF1ZXVlKTsKKwl9CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsICgiLWh0Y19zZW5kX3BrdHNfbXVsdGlwbGUgXG4iKSk7CisKKwlyZXR1cm4gQV9PSzsKK30KKworLyogSFRDIEFQSSAtIGh0Y19zZW5kX3BrdCAqLworQV9TVEFUVVMgaHRjX3NlbmRfcGt0KEhUQ19IQU5ETEUgSFRDSGFuZGxlLCBIVENfUEFDS0VUICpwUGFja2V0KQoreworCUhUQ19QQUNLRVRfUVVFVUUgcXVldWU7CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsCisJCQkoIistaHRjX3NlbmRfcGt0OiBFbnRlciBlbmRQb2ludElkOiAlZCwgYnVmZmVyOiAlcCwgbGVuZ3RoOiAlZCBcbiIsCisJCQkgcFBhY2tldC0+RW5kcG9pbnQsIHBQYWNrZXQtPnBCdWZmZXIsCisJCQkgcFBhY2tldC0+QWN0dWFsTGVuZ3RoKSk7CisJSU5JVF9IVENfUEFDS0VUX1FVRVVFX0FORF9BREQoJnF1ZXVlLCBwUGFja2V0KTsKKwlyZXR1cm4gaHRjX3NlbmRfcGt0c19tdWx0aXBsZShIVENIYW5kbGUsICZxdWV1ZSk7Cit9CisKKyNpZmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKKworQV9TVEFUVVMgaHRjX3NlbmRfZGF0YV9wa3QoSFRDX0hBTkRMRSBIVENIYW5kbGUsIGNkZl9uYnVmX3QgbmV0YnVmLCBpbnQgRXBpZCwKKwkJCSAgIGludCBBY3R1YWxMZW5ndGgpCit7CisJSFRDX1RBUkdFVCAqdGFyZ2V0ID0gR0VUX0hUQ19UQVJHRVRfRlJPTV9IQU5ETEUoSFRDSGFuZGxlKTsKKwlIVENfRU5EUE9JTlQgKnBFbmRwb2ludDsKKwlIVENfRlJBTUVfSERSICpwSHRjSGRyOworCUFfU1RBVFVTIHN0YXR1cyA9IEFfT0s7CisJaW50IHR4X3Jlc291cmNlczsKKwl1aW50MzJfdCBkYXRhX2F0dHIgPSAwOworCisJcEVuZHBvaW50ID0gJnRhcmdldC0+RW5kUG9pbnRbRXBpZF07CisKKwl0eF9yZXNvdXJjZXMgPQorCQloaWZfZ2V0X2ZyZWVfcXVldWVfbnVtYmVyKHRhcmdldC0+aGlmX2RldiwgcEVuZHBvaW50LT5VTF9QaXBlSUQpOworCisJaWYgKHR4X3Jlc291cmNlcyA8IEhUQ19EQVRBX1JFU09VUkNFX1RIUlMpIHsKKwkJaWYgKHBFbmRwb2ludC0+dWxfaXNfcG9sbGVkKSB7CisJCQloaWZfc2VuZF9jb21wbGV0ZV9jaGVjayhwRW5kcG9pbnQtPnRhcmdldC0+aGlmX2RldiwKKwkJCQkJCXBFbmRwb2ludC0+VUxfUGlwZUlELCAxKTsKKwkJCXR4X3Jlc291cmNlcyA9CisJCQkJaGlmX2dldF9mcmVlX3F1ZXVlX251bWJlcih0YXJnZXQtPmhpZl9kZXYsCisJCQkJCQkJICBwRW5kcG9pbnQtPlVMX1BpcGVJRCk7CisJCX0KKwkJaWYgKHR4X3Jlc291cmNlcyA8IEhUQ19EQVRBX01JTkRFU0NfUEVSUEFDS0VUKSB7CisJCQlyZXR1cm4gQV9FUlJPUjsKKwkJfQorCX0KKworCXBIdGNIZHIgPSAoSFRDX0ZSQU1FX0hEUiAqKSBjZGZfbmJ1Zl9nZXRfZnJhZ192YWRkcihuZXRidWYsIDApOworCUFSX0RFQlVHX0FTU0VSVChwSHRjSGRyKTsKKworCWRhdGFfYXR0ciA9IGNkZl9uYnVmX2RhdGFfYXR0cl9nZXQobmV0YnVmKTsKKworCUhUQ19XUklURTMyKHBIdGNIZHIsIFNNKEFjdHVhbExlbmd0aCwgSFRDX0ZSQU1FX0hEUl9QQVlMT0FETEVOKSB8CisJCSAgICBTTShFcGlkLCBIVENfRlJBTUVfSERSX0VORFBPSU5USUQpKTsKKwkvKgorCSAqIElmIHRoZSBISUYgcGlwZSBmb3IgdGhlIGRhdGEgZW5kcG9pbnQgaXMgcG9sbGVkIHJhdGhlciB0aGFuCisJICogaW50ZXJydXB0LWRyaXZlbiwgdGhpcyBpcyBhIGdvb2QgcG9pbnQgdG8gY2hlY2sgd2hldGhlciBhbnkKKwkgKiBkYXRhIHByZXZpb3VzbHkgc2VudCB0aHJvdWdoIHRoZSBISUYgcGlwZSBoYXZlIGZpbmlzaGVkIGJlaW5nCisJICogc2VudC4KKwkgKiBTaW5jZSB0aGlzIG1heSByZXN1bHQgaW4gY2FsbGJhY2tzIHRvIGh0Y190eF9jb21wbGV0aW9uX2hhbmRsZXIsCisJICogd2hpY2ggY2FuIHRha2UgdGhlIEhUQyB0eCBsb2NrLCBtYWtlIHRoZSBoaWZfc2VuZF9jb21wbGV0ZV9jaGVjaworCSAqIGNhbGwgYmVmb3JlIGFjcXVpcmluZyB0aGUgSFRDIHR4IGxvY2suCisJICogQ2FsbCBoaWZfc2VuZF9jb21wbGV0ZV9jaGVjayBkaXJlY3RseSwgcmF0aGVyIHRoYW4gY2FsbGluZworCSAqIGh0Y19zZW5kX2NvbXBsZXRlX2NoZWNrLCBhbmQgY2FsbCB0aGUgUG9sbFRpbWVyU3RhcnQgc2VwYXJhdGVseQorCSAqIGFmdGVyIGNhbGxpbmcgaGlmX3NlbmRfaGVhZCwgc28gdGhlIHRpbWVyIHdpbGwgYmUgc3RhcnRlZCB0bworCSAqIGNoZWNrIGZvciBjb21wbGV0aW9uIG9mIHRoZSBuZXcgb3V0c3RhbmRpbmcgZG93bmxvYWQgKGluIHRoZQorCSAqIHVuZXhwZWN0ZWQgZXZlbnQgdGhhdCBvdGhlciBwb2xsaW5nIGNhbGxzIGRvbid0IGNhdGNoIGl0KS4KKwkgKi8KKworCUxPQ0tfSFRDX1RYKHRhcmdldCk7CisKKwlIVENfV1JJVEUzMigoKEFfVUlOVDMyICopIHBIdGNIZHIpICsgMSwKKwkJICAgIFNNKHBFbmRwb2ludC0+U2VxTm8sIEhUQ19GUkFNRV9IRFJfQ09OVFJPTEJZVEVTMSkpOworCisJcEVuZHBvaW50LT5TZXFObysrOworCisJTkJVRl9VUERBVEVfVFhfUEtUX0NPVU5UKG5ldGJ1ZiwgTkJVRl9UWF9QS1RfSFRDKTsKKwlEUFRSQUNFKGNkZl9kcF90cmFjZShuZXRidWYsIENERl9EUF9UUkFDRV9IVENfUEFDS0VUX1BUUl9SRUNPUkQsCisJCQkJKHVpbnQ4X3QgKikoY2RmX25idWZfZGF0YShuZXRidWYpKSwKKwkJCQlzaXplb2YoY2RmX25idWZfZGF0YShuZXRidWYpKSkpOworCXN0YXR1cyA9IGhpZl9zZW5kX2hlYWQodGFyZ2V0LT5oaWZfZGV2LAorCQkJICAgICAgIHBFbmRwb2ludC0+VUxfUGlwZUlELAorCQkJICAgICAgIHBFbmRwb2ludC0+SWQsIEFjdHVhbExlbmd0aCwgbmV0YnVmLCBkYXRhX2F0dHIpOworCisJVU5MT0NLX0hUQ19UWCh0YXJnZXQpOworCXJldHVybiBzdGF0dXM7Cit9CisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQVRIXzExQUNfVFhDT01QQUNUICovCisKK0FfU1RBVFVTIGh0Y19zZW5kX2RhdGFfcGt0KEhUQ19IQU5ETEUgSFRDSGFuZGxlLCBIVENfUEFDS0VUICpwUGFja2V0LAorCQkJICAgQV9VSU5UOCBtb3JlX2RhdGEpCit7CisJSFRDX1RBUkdFVCAqdGFyZ2V0ID0gR0VUX0hUQ19UQVJHRVRfRlJPTV9IQU5ETEUoSFRDSGFuZGxlKTsKKwlIVENfRU5EUE9JTlQgKnBFbmRwb2ludDsKKwlIVENfRlJBTUVfSERSICpwSHRjSGRyOworCUhUQ19QQUNLRVRfUVVFVUUgc2VuZFF1ZXVlOworCWNkZl9uYnVmX3QgbmV0YnVmOworCWludCB0eF9yZXNvdXJjZXM7CisJQV9TVEFUVVMgc3RhdHVzID0gQV9PSzsKKwl1aW50MzJfdCBkYXRhX2F0dHIgPSAwOworCisJaWYgKHBQYWNrZXQpIHsKKwkJQVJfREVCVUdfQVNTRVJUKHBQYWNrZXQtPkVuZHBvaW50IDwgRU5EUE9JTlRfTUFYKTsKKwkJcEVuZHBvaW50ID0gJnRhcmdldC0+RW5kUG9pbnRbcFBhY2tldC0+RW5kcG9pbnRdOworCisJCS8qIGFkZCBIVENfRlJBTUVfSERSIGluIHRoZSBpbml0aWFsIGZyYWdtZW50ICovCisJCW5ldGJ1ZiA9IEdFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVChwUGFja2V0KTsKKwkJcEh0Y0hkciA9IChIVENfRlJBTUVfSERSICopIGNkZl9uYnVmX2dldF9mcmFnX3ZhZGRyKG5ldGJ1ZiwgMCk7CisJCUFSX0RFQlVHX0FTU0VSVChwSHRjSGRyKTsKKworCQlIVENfV1JJVEUzMihwSHRjSGRyLAorCQkJICAgIFNNKHBQYWNrZXQtPkFjdHVhbExlbmd0aCwKKwkJCSAgICAgICBIVENfRlJBTUVfSERSX1BBWUxPQURMRU4pIHwgU00ocFBhY2tldC0+UGt0SW5mby4KKwkJCQkJCQkgICAgICBBc1R4LlNlbmRGbGFncywKKwkJCQkJCQkgICAgICBIVENfRlJBTUVfSERSX0ZMQUdTKQorCQkJICAgIHwgU00ocFBhY2tldC0+RW5kcG9pbnQsIEhUQ19GUkFNRV9IRFJfRU5EUE9JTlRJRCkpOworCQkvKgorCQkgKiBJZiB0aGUgSElGIHBpcGUgZm9yIHRoZSBkYXRhIGVuZHBvaW50IGlzIHBvbGxlZCByYXRoZXIgdGhhbgorCQkgKiBpbnRlcnJ1cHQtZHJpdmVuLCB0aGlzIGlzIGEgZ29vZCBwb2ludCB0byBjaGVjayB3aGV0aGVyIGFueQorCQkgKiBkYXRhIHByZXZpb3VzbHkgc2VudCB0aHJvdWdoIHRoZSBISUYgcGlwZSBoYXZlIGZpbmlzaGVkIGJlaW5nCisJCSAqIHNlbnQuCisJCSAqIFNpbmNlIHRoaXMgbWF5IHJlc3VsdCBpbiBjYWxsYmFja3MgdG8gaHRjX3R4X2NvbXBsZXRpb25faGFuZGxlciwKKwkJICogd2hpY2ggY2FuIHRha2UgdGhlIEhUQyB0eCBsb2NrLCBtYWtlIHRoZSBoaWZfc2VuZF9jb21wbGV0ZV9jaGVjaworCQkgKiBjYWxsIGJlZm9yZSBhY3F1aXJpbmcgdGhlIEhUQyB0eCBsb2NrLgorCQkgKiBDYWxsIGhpZl9zZW5kX2NvbXBsZXRlX2NoZWNrIGRpcmVjdGx5LCByYXRoZXIgdGhhbiBjYWxsaW5nCisJCSAqIGh0Y19zZW5kX2NvbXBsZXRlX2NoZWNrLCBhbmQgY2FsbCB0aGUgUG9sbFRpbWVyU3RhcnQgc2VwYXJhdGVseQorCQkgKiBhZnRlciBjYWxsaW5nIGhpZl9zZW5kX2hlYWQsIHNvIHRoZSB0aW1lciB3aWxsIGJlIHN0YXJ0ZWQgdG8KKwkJICogY2hlY2sgZm9yIGNvbXBsZXRpb24gb2YgdGhlIG5ldyBvdXRzdGFuZGluZyBkb3dubG9hZCAoaW4gdGhlCisJCSAqIHVuZXhwZWN0ZWQgZXZlbnQgdGhhdCBvdGhlciBwb2xsaW5nIGNhbGxzIGRvbid0IGNhdGNoIGl0KS4KKwkJICovCisJCWlmIChwRW5kcG9pbnQtPnVsX2lzX3BvbGxlZCkgeworCQkJaHRjX3NlbmRfY29tcGxldGVfcG9sbF90aW1lcl9zdG9wKHBFbmRwb2ludCk7CisJCQloaWZfc2VuZF9jb21wbGV0ZV9jaGVjayhwRW5kcG9pbnQtPnRhcmdldC0+aGlmX2RldiwKKwkJCQkJCXBFbmRwb2ludC0+VUxfUGlwZUlELCAwKTsKKwkJfQorCisJCUxPQ0tfSFRDX1RYKHRhcmdldCk7CisKKwkJcFBhY2tldC0+UGt0SW5mby5Bc1R4LlNlcU5vID0gcEVuZHBvaW50LT5TZXFObzsKKwkJcEVuZHBvaW50LT5TZXFObysrOworCisJCUhUQ19XUklURTMyKCgoQV9VSU5UMzIgKikgcEh0Y0hkcikgKyAxLAorCQkJICAgIFNNKHBQYWNrZXQtPlBrdEluZm8uQXNUeC5TZXFObywKKwkJCSAgICAgICBIVENfRlJBTUVfSERSX0NPTlRST0xCWVRFUzEpKTsKKworCQkvKiBhcHBlbmQgbmV3IHBhY2tldCB0byBwRW5kcG9pbnQtPlR4UXVldWUgKi8KKwkJSFRDX1BBQ0tFVF9FTlFVRVVFKCZwRW5kcG9pbnQtPlR4UXVldWUsIHBQYWNrZXQpOworI2lmZGVmIEVOQUJMRV9CVU5ETEVfVFgKKwkJaWYgKEhUQ19FTkFCTEVfQlVORExFKHRhcmdldCkgJiYgKG1vcmVfZGF0YSkpIHsKKwkJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwkJCXJldHVybiBBX09LOworCQl9CisjZW5kaWYKKwl9IGVsc2UgeworCQlMT0NLX0hUQ19UWCh0YXJnZXQpOworCQlwRW5kcG9pbnQgPSAmdGFyZ2V0LT5FbmRQb2ludFsxXTsKKwl9CisKKwkvKiBpbmNyZW1lbnQgdHggcHJvY2Vzc2luZyBjb3VudCBvbiBlbnRyeSAqLworCWNkZl9hdG9taWNfaW5jKCZwRW5kcG9pbnQtPlR4UHJvY2Vzc0NvdW50KTsKKwlpZiAoY2RmX2F0b21pY19yZWFkKCZwRW5kcG9pbnQtPlR4UHJvY2Vzc0NvdW50KSA+IDEpIHsKKwkJLyoKKwkJICogQW5vdGhlciB0aHJlYWQgb3IgdGFzayBpcyBkcmFpbmluZyB0aGUgVFggcXVldWVzIG9uIHRoaXMgZW5kcG9pbnQuCisJCSAqIFRoYXQgdGhyZWFkIHdpbGwgcmVzZXQgdGhlIHR4IHByb2Nlc3NpbmcgY291bnQgd2hlbiB0aGUgcXVldWUgaXMKKwkJICogZHJhaW5lZC4KKwkJICovCisJCWNkZl9hdG9taWNfZGVjKCZwRW5kcG9pbnQtPlR4UHJvY2Vzc0NvdW50KTsKKwkJVU5MT0NLX0hUQ19UWCh0YXJnZXQpOworCQlyZXR1cm4gQV9PSzsKKwl9CisKKwkvKioqKiogYmV5b25kIHRoaXMgcG9pbnQgb25seSAxIHRocmVhZCBtYXkgZW50ZXIgKioqKioqLworCisJSU5JVF9IVENfUEFDS0VUX1FVRVVFKCZzZW5kUXVldWUpOworCWlmIChJU19UWF9DUkVESVRfRkxPV19FTkFCTEVEKHBFbmRwb2ludCkpIHsKKyNpZiBERUJVR19DUkVESVQKKwkJaW50IGNyZWQgPSBwRW5kcG9pbnQtPlR4Q3JlZGl0czsKKyNlbmRpZgorCQlnZXRfaHRjX3NlbmRfcGFja2V0c19jcmVkaXRfYmFzZWQodGFyZ2V0LCBwRW5kcG9pbnQsICZzZW5kUXVldWUpOworI2lmIERFQlVHX0NSRURJVAorCQlpZiAoZXBfZGVidWdfbWFzayAmICgxIDw8IHBFbmRwb2ludC0+SWQpKSB7CisJCQlpZiAoY3JlZCAtIHBFbmRwb2ludC0+VHhDcmVkaXRzID4gMCkgeworCQkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkJKCIgPEhUQz4gRGVjcmVhc2UgRVAlZCAlZCAtICVkID0gJWQgY3JlZGl0cy5cbiIsCisJCQkJCQkgcEVuZHBvaW50LT5JZCwgY3JlZCwKKwkJCQkJCSBjcmVkIC0gcEVuZHBvaW50LT5UeENyZWRpdHMsCisJCQkJCQkgcEVuZHBvaW50LT5UeENyZWRpdHMpKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwl9CisjaWZkZWYgRU5BQkxFX0JVTkRMRV9UWAorCWVsc2UgaWYgKEhUQ19FTkFCTEVfQlVORExFKHRhcmdldCkpIHsKKwkJLyogRGVxdWV1ZSBtYXggcGFja2V0cyBmcm9tIGVuZHBvaW50IHR4IHF1ZXVlICovCisJCWdldF9odGNfc2VuZF9wYWNrZXRzKHRhcmdldCwgcEVuZHBvaW50LCAmc2VuZFF1ZXVlLAorCQkJCSAgICAgSFRDX01BWF9UWF9CVU5ETEVfU0VORF9MSU1JVCk7CisJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwl9CisjZW5kaWYKKwllbHNlIHsKKwkJLyoKKwkJICogTm93IGRyYWluIHRoZSBlbmRwb2ludCBUWCBxdWV1ZSBmb3IgdHJhbnNtaXNzaW9uIGFzIGxvbmcgYXMgd2UgaGF2ZQorCQkgKiBlbm91Z2ggdHJhbnNtaXQgcmVzb3VyY2VzCisJCSAqLworCQl0eF9yZXNvdXJjZXMgPQorCQkJaGlmX2dldF9mcmVlX3F1ZXVlX251bWJlcih0YXJnZXQtPmhpZl9kZXYsCisJCQkJCQkgIHBFbmRwb2ludC0+VUxfUGlwZUlEKTsKKwkJZ2V0X2h0Y19zZW5kX3BhY2tldHModGFyZ2V0LCBwRW5kcG9pbnQsICZzZW5kUXVldWUsIHR4X3Jlc291cmNlcyk7CisJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwl9CisJTkJVRl9VUERBVEVfVFhfUEtUX0NPVU5UKG5ldGJ1ZiwgTkJVRl9UWF9QS1RfSFRDKTsKKwlEUFRSQUNFKGNkZl9kcF90cmFjZShuZXRidWYsIENERl9EUF9UUkFDRV9IVENfUEFDS0VUX1BUUl9SRUNPUkQsCisJCQkJKHVpbnQ4X3QgKikoY2RmX25idWZfZGF0YShuZXRidWYpKSwKKwkJCQlzaXplb2YoY2RmX25idWZfZGF0YShuZXRidWYpKSkpOworCisJLyogc2VuZCB3aGF0IHdlIGNhbiAqLworCXdoaWxlICh0cnVlKSB7CisjaWYgZGVmaW5lZChISUZfVVNCKSB8fCBkZWZpbmVkKEhJRl9TRElPKQorI2lmZGVmIEVOQUJMRV9CVU5ETEVfVFgKKwkJaWYgKEhUQ19FTkFCTEVfQlVORExFKHRhcmdldCkgJiYKKwkJICAgIEhUQ19QQUNLRVRfUVVFVUVfREVQVEgoJnNlbmRRdWV1ZSkgPj0KKwkJICAgIEhUQ19NSU5fTVNHX1BFUl9CVU5ETEUpIHsKKwkJCWh0Y19pc3N1ZV9wYWNrZXRzX2J1bmRsZSh0YXJnZXQsIHBFbmRwb2ludCwgJnNlbmRRdWV1ZSk7CisJCX0KKyNlbmRpZgorI2VuZGlmCisJCXBQYWNrZXQgPSBodGNfcGFja2V0X2RlcXVldWUoJnNlbmRRdWV1ZSk7CisJCWlmIChwUGFja2V0ID09IE5VTEwpIHsKKwkJCWJyZWFrOworCQl9CisJCW5ldGJ1ZiA9IEdFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVChwUGFja2V0KTsKKworCQlMT0NLX0hUQ19UWCh0YXJnZXQpOworCQkvKiBzdG9yZSBpbiBsb29rIHVwIHF1ZXVlIHRvIG1hdGNoIGNvbXBsZXRpb25zICovCisJCUhUQ19QQUNLRVRfRU5RVUVVRSgmcEVuZHBvaW50LT5UeExvb2t1cFF1ZXVlLCBwUGFja2V0KTsKKwkJSU5DX0hUQ19FUF9TVEFUKHBFbmRwb2ludCwgVHhJc3N1ZWQsIDEpOworCQlwRW5kcG9pbnQtPnVsX291dHN0YW5kaW5nX2NudCsrOworCQlVTkxPQ0tfSFRDX1RYKHRhcmdldCk7CisKKwkJc3RhdHVzID0gaGlmX3NlbmRfaGVhZCh0YXJnZXQtPmhpZl9kZXYsCisJCQkJICAgICAgIHBFbmRwb2ludC0+VUxfUGlwZUlELAorCQkJCSAgICAgICBwRW5kcG9pbnQtPklkLAorCQkJCSAgICAgICBIVENfSERSX0xFTkdUSCArIHBQYWNrZXQtPkFjdHVhbExlbmd0aCwKKwkJCQkgICAgICAgbmV0YnVmLCBkYXRhX2F0dHIpOworI2lmIERFQlVHX0JVTkRMRQorCQljZGZfcHJpbnQoIiBTZW5kIHNpbmdsZSBFUCVkIGJ1ZmZlciBzaXplOjB4JXgsIHRvdGFsOjB4JXguXG4iLAorCQkJICBwRW5kcG9pbnQtPklkLAorCQkJICBwRW5kcG9pbnQtPlR4Q3JlZGl0U2l6ZSwKKwkJCSAgSFRDX0hEUl9MRU5HVEggKyBwUGFja2V0LT5BY3R1YWxMZW5ndGgpOworI2VuZGlmCisKKwkJaWYgKGNkZl91bmxpa2VseShBX0ZBSUxFRChzdGF0dXMpKSkgeworCQkJTE9DS19IVENfVFgodGFyZ2V0KTsKKwkJCXBFbmRwb2ludC0+dWxfb3V0c3RhbmRpbmdfY250LS07CisJCQkvKiByZW1vdmUgdGhpcyBwYWNrZXQgZnJvbSB0aGUgdHggY29tcGxldGlvbiBxdWV1ZSAqLworCQkJSFRDX1BBQ0tFVF9SRU1PVkUoJnBFbmRwb2ludC0+VHhMb29rdXBRdWV1ZSwgcFBhY2tldCk7CisKKwkJCS8qCisJCQkgKiBEb24ndCBib3RoZXIgcmVjbGFpbWluZyBjcmVkaXRzIC0gSFRDIGZsb3cgY29udHJvbAorCQkJICogaXMgbm90IGFwcGxpY2FibGUgdG8gdHggZGF0YS4KKwkJCSAqIEluIExMIHN5c3RlbXMsIHRoZXJlIGlzIG5vIGRvd25sb2FkIGZsb3cgY29udHJvbCwKKwkJCSAqIHNpbmNlIHRoZXJlJ3MgdmlydHVhbGx5IG5vIGRvd25sb2FkIGRlbGF5LgorCQkJICogSW4gSEwgc3lzdGVtcywgdGhlIHR4cnggU1cgZXhwbGljaXRseSBwZXJmb3JtcyB0aGUKKwkJCSAqIHR4IGZsb3cgY29udHJvbC4KKwkJCSAqLworCQkJLyogcEVuZHBvaW50LT5UeENyZWRpdHMgKz0gcFBhY2tldC0+UGt0SW5mby5Bc1R4LkNyZWRpdHNVc2VkOyAqLworCisJCQkvKiBwdXQgdGhpcyBmcmFtZSBiYWNrIGF0IHRoZSBmcm9udCBvZiB0aGUgc2VuZFF1ZXVlICovCisJCQlIVENfUEFDS0VUX0VOUVVFVUVfVE9fSEVBRCgmc2VuZFF1ZXVlLCBwUGFja2V0KTsKKworCQkJLyogcHV0IHRoZSBzZW5kUXVldWUgYmFjayBhdCB0aGUgZnJvbnQgb2YgcEVuZHBvaW50LT5UeFF1ZXVlICovCisJCQlIVENfUEFDS0VUX1FVRVVFX1RSQU5TRkVSX1RPX0hFQUQoJnBFbmRwb2ludC0+VHhRdWV1ZSwKKwkJCQkJCQkgICZzZW5kUXVldWUpOworCQkJVU5MT0NLX0hUQ19UWCh0YXJnZXQpOworCQkJYnJlYWs7ICAvKiBzdGlsbCBuZWVkIHRvIHJlc2V0IFR4UHJvY2Vzc0NvdW50ICovCisJCX0KKwl9CisJLyogZG9uZSB3aXRoIHRoaXMgZW5kcG9pbnQsIHdlIGNhbiBjbGVhciB0aGUgY291bnQgKi8KKwljZGZfYXRvbWljX2luaXQoJnBFbmRwb2ludC0+VHhQcm9jZXNzQ291bnQpOworCisJaWYgKHBFbmRwb2ludC0+dWxfaXNfcG9sbGVkKSB7CisJCS8qCisJCSAqIFN0YXJ0IGEgY2xlYW51cCB0aW1lciB0byBwb2xsIGZvciBkb3dubG9hZCBjb21wbGV0aW9uLgorCQkgKiBUaGUgZG93bmxvYWQgY29tcGxldGlvbiBzaG91bGQgYmUgbm90aWNlZCBwcm9tcHRseSBmcm9tCisJCSAqIG90aGVyIHBvbGxpbmcgY2FsbHMsIGJ1dCB0aGUgdGltZXIgcHJvdmlkZXMgYSBzYWZldHkgbmV0CisJCSAqIGluIGNhc2Ugb3RoZXIgcG9sbGluZyBjYWxscyBkb24ndCBvY2N1ciBhcyBleHBlY3RlZC4KKwkJICovCisJCWh0Y19zZW5kX2NvbXBsZXRlX3BvbGxfdGltZXJfc3RhcnQocEVuZHBvaW50KTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qQVRIXzExQUNfVFhDT01QQUNUICovCisKKy8qCisgKiBJbiB0aGUgYWRhcHRlZCBISUYgbGF5ZXIsIGNkZl9uYnVmX3QgYXJlIHBhc3NlZCBiZXR3ZWVuIEhJRiBhbmQgSFRDLCBzaW5jZSB1cHBlciBsYXllcnMgZXhwZWN0cworICogSFRDX1BBQ0tFVCBjb250YWluZXJzIHdlIHVzZSB0aGUgY29tcGxldGVkIG5ldGJ1ZiBhbmQgbG9va3VwIGl0cyBjb3JyZXNwb25kaW5nIEhUQyBwYWNrZXQgYnVmZmVyCisgKiBmcm9tIGEgbG9va3VwIGxpc3QuCisgKiBUaGlzIGlzIGV4dHJhIG92ZXJoZWFkIHRoYXQgY2FuIGJlIGZpeGVkIGJ5IHJlLWFsaWduaW5nIEhJRiBpbnRlcmZhY2VzIHdpdGggSFRDLgorICoKKyAqLworc3RhdGljIEhUQ19QQUNLRVQgKmh0Y19sb29rdXBfdHhfcGFja2V0KEhUQ19UQVJHRVQgKnRhcmdldCwKKwkJCQkJSFRDX0VORFBPSU5UICpwRW5kcG9pbnQsCisJCQkJCWNkZl9uYnVmX3QgbmV0YnVmKQoreworCUhUQ19QQUNLRVQgKnBQYWNrZXQgPSBOVUxMOworCUhUQ19QQUNLRVQgKnBGb3VuZFBhY2tldCA9IE5VTEw7CisJSFRDX1BBQ0tFVF9RVUVVRSBsb29rdXBRdWV1ZTsKKworCUlOSVRfSFRDX1BBQ0tFVF9RVUVVRSgmbG9va3VwUXVldWUpOworCUxPQ0tfSFRDX1RYKHRhcmdldCk7CisKKwkvKiBtYXJrIHRoYXQgSElGIGhhcyBpbmRpY2F0ZWQgdGhlIHNlbmQgY29tcGxldGUgZm9yIGFub3RoZXIgcGFja2V0ICovCisJcEVuZHBvaW50LT51bF9vdXRzdGFuZGluZ19jbnQtLTsKKworCS8qIERlcXVldWUgZmlyc3QgcGFja2V0IGRpcmVjdGx5IGJlY2F1c2Ugb2YgaW4tb3JkZXIgY29tcGxldGlvbiAqLworCXBQYWNrZXQgPSBodGNfcGFja2V0X2RlcXVldWUoJnBFbmRwb2ludC0+VHhMb29rdXBRdWV1ZSk7CisJaWYgKGNkZl91bmxpa2VseSghcFBhY2tldCkpIHsKKwkJVU5MT0NLX0hUQ19UWCh0YXJnZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG5ldGJ1ZiA9PSAoY2RmX25idWZfdCkgR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKHBQYWNrZXQpKSB7CisJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwkJcmV0dXJuIHBQYWNrZXQ7CisJfSBlbHNlIHsKKwkJSFRDX1BBQ0tFVF9FTlFVRVVFKCZsb29rdXBRdWV1ZSwgcFBhY2tldCk7CisJfQorCisJLyoKKwkgKiBNb3ZlIFRYIGxvb2t1cCBxdWV1ZSB0byB0ZW1wIHF1ZXVlIGJlY2F1c2UgbW9zdCBvZiBwYWNrZXRzIHRoYXQgYXJlIG5vdCBpbmRleCAwCisJICogYXJlIG5vdCB0b3AgMTAgcGFja2V0cy4KKwkgKi8KKwlIVENfUEFDS0VUX1FVRVVFX1RSQU5TRkVSX1RPX1RBSUwoJmxvb2t1cFF1ZXVlLAorCQkJCQkgICZwRW5kcG9pbnQtPlR4TG9va3VwUXVldWUpOworCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKworCUlURVJBVEVfT1ZFUl9MSVNUX0FMTE9XX1JFTU9WRSgmbG9va3VwUXVldWUuUXVldWVIZWFkLCBwUGFja2V0LAorCQkJCSAgICAgICBIVENfUEFDS0VULCBMaXN0TGluaykgeworCisJCWlmIChOVUxMID09IHBQYWNrZXQpIHsKKwkJCXBGb3VuZFBhY2tldCA9IHBQYWNrZXQ7CisJCQlicmVhazsKKwkJfQorCQkvKiBjaGVjayBmb3IgcmVtb3ZhbCAqLworCQlpZiAobmV0YnVmID09CisJCSAgICAoY2RmX25idWZfdCkgR0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKHBQYWNrZXQpKSB7CisJCQkvKiBmb3VuZCBpdCAqLworCQkJSFRDX1BBQ0tFVF9SRU1PVkUoJmxvb2t1cFF1ZXVlLCBwUGFja2V0KTsKKwkJCXBGb3VuZFBhY2tldCA9IHBQYWNrZXQ7CisJCQlicmVhazsKKwkJfQorCisJfQorCUlURVJBVEVfRU5EOworCisJTE9DS19IVENfVFgodGFyZ2V0KTsKKwlIVENfUEFDS0VUX1FVRVVFX1RSQU5TRkVSX1RPX0hFQUQoJnBFbmRwb2ludC0+VHhMb29rdXBRdWV1ZSwKKwkJCQkJICAmbG9va3VwUXVldWUpOworCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKworCXJldHVybiBwRm91bmRQYWNrZXQ7Cit9CisKK0NERl9TVEFUVVMgaHRjX3R4X2NvbXBsZXRpb25faGFuZGxlcih2b2lkICpDb250ZXh0LAorCQkJCSAgIGNkZl9uYnVmX3QgbmV0YnVmLCB1bnNpZ25lZCBpbnQgRXBJRCwKKwkJCQkgICB1aW50MzJfdCB0b2VwbGl0el9oYXNoX3Jlc3VsdCkKK3sKKwlIVENfVEFSR0VUICp0YXJnZXQgPSAoSFRDX1RBUkdFVCAqKSBDb250ZXh0OworCUhUQ19FTkRQT0lOVCAqcEVuZHBvaW50OworCUhUQ19QQUNLRVQgKnBQYWNrZXQ7CisjaWZkZWYgVVNCX0hJRl9TSU5HTEVfUElQRV9EQVRBX1NDSEVECisJSFRDX0VORFBPSU5UX0lEIGVpZFtEQVRBX0VQX1NJWkVdID0KKwl7IEVORFBPSU5UXzUsIEVORFBPSU5UXzQsIEVORFBPSU5UXzIsIEVORFBPSU5UXzMgfTsKKwlpbnQgZXBpZElkeDsKKwlBX1VJTlQxNiByZXNvdXJjZXNUaHJlc2hbREFUQV9FUF9TSVpFXTsgLyogdXJiIHJlc291cmNlcyAqLworCUFfVUlOVDE2IHJlc291cmNlczsKKwlBX1VJTlQxNiByZXNvdXJjZXNNYXg7CisjZW5kaWYKKworCXBFbmRwb2ludCA9ICZ0YXJnZXQtPkVuZFBvaW50W0VwSURdOworCXRhcmdldC0+VFhfY29tcF9jbnQrKzsKKworCWRvIHsKKwkJcFBhY2tldCA9IGh0Y19sb29rdXBfdHhfcGFja2V0KHRhcmdldCwgcEVuZHBvaW50LCBuZXRidWYpOworCQlpZiAoTlVMTCA9PSBwUGFja2V0KSB7CisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkJKCJIVEMgVFggbG9va3VwIGZhaWxlZCFcbiIpKTsKKwkJCS8qIG1heSBoYXZlIGFscmVhZHkgYmVlbiBmbHVzaGVkIGFuZCBmcmVlZCAqLworCQkJbmV0YnVmID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChwUGFja2V0LT5Qa3RJbmZvLkFzVHguVGFnID09IEhUQ19UWF9QQUNLRVRfVEFHX0JVTkRMRUQpIHsKKwkJCUhUQ19QQUNLRVQgKnBQYWNrZXRUZW1wOworCQkJSFRDX1BBQ0tFVF9RVUVVRSAqcFF1ZXVlU2F2ZSA9CisJCQkJKEhUQ19QQUNLRVRfUVVFVUUgKikgcFBhY2tldC0+cENvbnRleHQ7CisJCQlIVENfUEFDS0VUX1FVRVVFX0lURVJBVEVfQUxMT1dfUkVNT1ZFKHBRdWV1ZVNhdmUsCisJCQkJCQkJICAgICAgcFBhY2tldFRlbXApIHsKKwkJCQlwUGFja2V0LT5TdGF0dXMgPSBBX09LOworCQkJCXNlbmRfcGFja2V0X2NvbXBsZXRpb24odGFyZ2V0LCBwUGFja2V0VGVtcCk7CisJCQl9CisJCQlIVENfUEFDS0VUX1FVRVVFX0lURVJBVEVfRU5EOworCQkJZnJlZV9odGNfYnVuZGxlX3BhY2tldCh0YXJnZXQsIHBQYWNrZXQpOworCQkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCQkvKiB3aWxsIGJlIGdpdmluZyB0aGlzIGJ1ZmZlciBiYWNrIHRvIHVwcGVyIGxheWVycyAqLworCQluZXRidWYgPSBOVUxMOworCQlwUGFja2V0LT5TdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCXNlbmRfcGFja2V0X2NvbXBsZXRpb24odGFyZ2V0LCBwUGFja2V0KTsKKworCX0gd2hpbGUgKGZhbHNlKTsKKworCWlmICghSVNfVFhfQ1JFRElUX0ZMT1dfRU5BQkxFRChwRW5kcG9pbnQpKSB7CisJCS8qIG5vdGU6IHdoZW4gdXNpbmcgVFggY3JlZGl0IGZsb3csIHRoZSByZS1jaGVja2luZyBvZiBxdWV1ZXMgaGFwcGVucworCQkqIHdoZW4gY3JlZGl0cyBmbG93IGJhY2sgZnJvbSB0aGUgdGFyZ2V0LgorCQkqIGluIHRoZSBub24tVFggY3JlZGl0IGNhc2UsIHdlIHJlY2hlY2sgYWZ0ZXIgdGhlIHBhY2tldCBjb21wbGV0ZXMgKi8KKwkJaHRjX3RyeV9zZW5kKHRhcmdldCwgcEVuZHBvaW50LCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiBjYWxsYmFjayB3aGVuIFRYIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlICovCit2b2lkIGh0Y190eF9yZXNvdXJjZV9hdmFpbF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIEFfVUlOVDggcGlwZUlEKQoreworCWludCBpOworCUhUQ19UQVJHRVQgKnRhcmdldCA9IChIVENfVEFSR0VUICopIGNvbnRleHQ7CisJSFRDX0VORFBPSU5UICpwRW5kcG9pbnQgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IEVORFBPSU5UX01BWDsgaSsrKSB7CisJCXBFbmRwb2ludCA9ICZ0YXJnZXQtPkVuZFBvaW50W2ldOworCQlpZiAocEVuZHBvaW50LT5TZXJ2aWNlSUQgIT0gMCkgeworCQkJaWYgKHBFbmRwb2ludC0+VUxfUGlwZUlEID09IHBpcGVJRCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPj0gRU5EUE9JTlRfTUFYKSB7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCSgiSW52YWxpZCBwaXBlIGluZGljYXRlZCBmb3IgVFggcmVzb3VyY2UgYXZhaWwgOiAlZCFcbiIsCisJCQkJIHBpcGVJRCkpOworCQlyZXR1cm47CisJfQorCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19TRU5ELAorCQkJKCJISUYgaW5kaWNhdGVkIG1vcmUgcmVzb3VyY2VzIGZvciBwaXBlOiVkIFxuIiwKKwkJCSBwaXBlSUQpKTsKKworCWh0Y190cnlfc2VuZCh0YXJnZXQsIHBFbmRwb2ludCwgTlVMTCk7Cit9CisKKy8qIGZsdXNoIGVuZHBvaW50IFRYIHF1ZXVlICovCit2b2lkIGh0Y19mbHVzaF9lbmRwb2ludF90eChIVENfVEFSR0VUICp0YXJnZXQsIEhUQ19FTkRQT0lOVCAqcEVuZHBvaW50LAorCQkJICAgSFRDX1RYX1RBRyBUYWcpCit7CisJSFRDX1BBQ0tFVCAqcFBhY2tldDsKKworCUxPQ0tfSFRDX1RYKHRhcmdldCk7CisJd2hpbGUgKEhUQ19QQUNLRVRfUVVFVUVfREVQVEgoJnBFbmRwb2ludC0+VHhRdWV1ZSkpIHsKKwkJcFBhY2tldCA9IGh0Y19wYWNrZXRfZGVxdWV1ZSgmcEVuZHBvaW50LT5UeFF1ZXVlKTsKKworCQlpZiAocFBhY2tldCkgeworCQkJLyogbGV0IHRoZSBzZW5kZXIga25vdyB0aGUgcGFja2V0IHdhcyBub3QgZGVsaXZlcmVkICovCisJCQlwUGFja2V0LT5TdGF0dXMgPSBBX0VDQU5DRUxFRDsKKwkJCXNlbmRfcGFja2V0X2NvbXBsZXRpb24odGFyZ2V0LCBwUGFja2V0KTsKKwkJfQorCX0KKwlVTkxPQ0tfSFRDX1RYKHRhcmdldCk7Cit9CisKKy8qIEhUQyBBUEkgdG8gZmx1c2ggYW4gZW5kcG9pbnQncyBUWCBxdWV1ZSovCit2b2lkIGh0Y19mbHVzaF9lbmRwb2ludChIVENfSEFORExFIEhUQ0hhbmRsZSwgSFRDX0VORFBPSU5UX0lEIEVuZHBvaW50LAorCQkJSFRDX1RYX1RBRyBUYWcpCit7CisJSFRDX1RBUkdFVCAqdGFyZ2V0ID0gR0VUX0hUQ19UQVJHRVRfRlJPTV9IQU5ETEUoSFRDSGFuZGxlKTsKKwlIVENfRU5EUE9JTlQgKnBFbmRwb2ludCA9ICZ0YXJnZXQtPkVuZFBvaW50W0VuZHBvaW50XTsKKworCWlmIChwRW5kcG9pbnQtPlNlcnZpY2VJRCA9PSAwKSB7CisJCUFSX0RFQlVHX0FTU0VSVChmYWxzZSk7CisJCS8qIG5vdCBpbiB1c2UuLiAqLworCQlyZXR1cm47CisJfQorCisJaHRjX2ZsdXNoX2VuZHBvaW50X3R4KHRhcmdldCwgcEVuZHBvaW50LCBUYWcpOworfQorCisvKiBIVEMgQVBJIHRvIGluZGljYXRlIGFjdGl2aXR5IHRvIHRoZSBjcmVkaXQgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uICovCit2b2lkIGh0Y19pbmRpY2F0ZV9hY3Rpdml0eV9jaGFuZ2UoSFRDX0hBTkRMRSBIVENIYW5kbGUsCisJCQkJICBIVENfRU5EUE9JTlRfSUQgRW5kcG9pbnQsIEFfQk9PTCBBY3RpdmUpCit7CisJLyogIFRPRE8gKi8KK30KKworQV9CT09MIGh0Y19pc19lbmRwb2ludF9hY3RpdmUoSFRDX0hBTkRMRSBIVENIYW5kbGUsIEhUQ19FTkRQT0lOVF9JRCBFbmRwb2ludCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogcHJvY2VzcyBjcmVkaXQgcmVwb3J0cyBhbmQgY2FsbCBkaXN0cmlidXRpb24gZnVuY3Rpb24gKi8KK3ZvaWQgaHRjX3Byb2Nlc3NfY3JlZGl0X3JwdChIVENfVEFSR0VUICp0YXJnZXQsIEhUQ19DUkVESVRfUkVQT1JUICpwUnB0LAorCQkJICAgIGludCBOdW1FbnRyaWVzLCBIVENfRU5EUE9JTlRfSUQgRnJvbUVuZHBvaW50KQoreworCWludCBpOworCUhUQ19FTkRQT0lOVCAqcEVuZHBvaW50OworCWludCB0b3RhbENyZWRpdHMgPSAwOworCUFfVUlOVDggcnB0X2NyZWRpdHMsIHJwdF9lcF9pZDsKKworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfU0VORCwKKwkJCSgiK2h0Y19wcm9jZXNzX2NyZWRpdF9ycHQsIENyZWRpdCBSZXBvcnQgRW50cmllczolZCBcbiIsCisJCQkgTnVtRW50cmllcykpOworCisJLyogbG9jayBvdXQgVFggd2hpbGUgd2UgdXBkYXRlIGNyZWRpdHMgKi8KKwlMT0NLX0hUQ19UWCh0YXJnZXQpOworCisJZm9yIChpID0gMDsgaSA8IE51bUVudHJpZXM7IGkrKywgcFJwdCsrKSB7CisKKwkJcnB0X2VwX2lkID0gSFRDX0dFVF9GSUVMRChwUnB0LCBIVENfQ1JFRElUX1JFUE9SVCwgRU5EUE9JTlRJRCk7CisKKwkJaWYgKHJwdF9lcF9pZCA+PSBFTkRQT0lOVF9NQVgpIHsKKwkJCUFSX0RFQlVHX0FTU0VSVChmYWxzZSk7CisJCQlicmVhazsKKwkJfQorCisJCXJwdF9jcmVkaXRzID0gSFRDX0dFVF9GSUVMRChwUnB0LCBIVENfQ1JFRElUX1JFUE9SVCwgQ1JFRElUUyk7CisKKwkJcEVuZHBvaW50ID0gJnRhcmdldC0+RW5kUG9pbnRbcnB0X2VwX2lkXTsKKyNpZiBERUJVR19DUkVESVQKKwkJaWYgKGVwX2RlYnVnX21hc2sgJiAoMSA8PCBwRW5kcG9pbnQtPklkKSkgeworCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsCisJCQkJCSgiIDxIVEM+IEluY3JlYXNlIEVQJWQgJWQgKyAlZCA9ICVkIGNyZWRpdHNcbiIsCisJCQkJCSBycHRfZXBfaWQsIHBFbmRwb2ludC0+VHhDcmVkaXRzLAorCQkJCQkgcnB0X2NyZWRpdHMsCisJCQkJCSBwRW5kcG9pbnQtPlR4Q3JlZGl0cyArIHJwdF9jcmVkaXRzKSk7CisJCX0KKyNlbmRpZgorCisjaWZkZWYgSFRDX0VQX1NUQVRfUFJPRklMSU5HCisKKwkJSU5DX0hUQ19FUF9TVEFUKHBFbmRwb2ludCwgVHhDcmVkaXRScHRzLCAxKTsKKwkJSU5DX0hUQ19FUF9TVEFUKHBFbmRwb2ludCwgVHhDcmVkaXRzUmV0dXJuZWQsIHJwdF9jcmVkaXRzKTsKKworCQlpZiAoRnJvbUVuZHBvaW50ID09IHJwdF9lcF9pZCkgeworCQkJLyogdGhpcyBjcmVkaXQgcmVwb3J0IGFycml2ZWQgb24gdGhlIHNhbWUgZW5kcG9pbnQgaW5kaWNhdGluZyBpdCBhcnJpdmVkIGluIGFuIFJYCisJCQkgKiBwYWNrZXQgKi8KKwkJCUlOQ19IVENfRVBfU1RBVChwRW5kcG9pbnQsIFR4Q3JlZGl0c0Zyb21SeCwKKwkJCQkJcnB0X2NyZWRpdHMpOworCQkJSU5DX0hUQ19FUF9TVEFUKHBFbmRwb2ludCwgVHhDcmVkaXRScHRzRnJvbVJ4LCAxKTsKKwkJfSBlbHNlIGlmIChGcm9tRW5kcG9pbnQgPT0gRU5EUE9JTlRfMCkgeworCQkJLyogdGhpcyBjcmVkaXQgYXJyaXZlZCBvbiBlbmRwb2ludCAwIGFzIGEgTlVMTCBtZXNzYWdlICovCisJCQlJTkNfSFRDX0VQX1NUQVQocEVuZHBvaW50LCBUeENyZWRpdHNGcm9tRXAwLAorCQkJCQlycHRfY3JlZGl0cyk7CisJCQlJTkNfSFRDX0VQX1NUQVQocEVuZHBvaW50LCBUeENyZWRpdFJwdHNGcm9tRXAwLCAxKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGFycml2ZWQgb24gYW5vdGhlciBlbmRwb2ludCAqLworCQkJSU5DX0hUQ19FUF9TVEFUKHBFbmRwb2ludCwgVHhDcmVkaXRzRnJvbU90aGVyLAorCQkJCQlycHRfY3JlZGl0cyk7CisJCQlJTkNfSFRDX0VQX1NUQVQocEVuZHBvaW50LCBUeENyZWRpdFJwdHNGcm9tT3RoZXIsIDEpOworCQl9CisKKyNlbmRpZgorI2lmIGRlZmluZWQoSElGX1VTQikKKwkJaWYgKHBFbmRwb2ludC0+SWQgPj0gRU5EUE9JTlRfMiAmJiBwRW5kcG9pbnQtPklkIDw9IEVORFBPSU5UXzUpIHsKKwkJCUhUQ19FTkRQT0lOVF9JRCBlaWRbREFUQV9FUF9TSVpFXSA9CisJCQl7IEVORFBPSU5UXzUsIEVORFBPSU5UXzQsIEVORFBPSU5UXzIsIEVORFBPSU5UXzMgfTsKKwkJCWludCBlcGlkX2lkeDsKKworCQkJdGFyZ2V0LT5hdmFpbF90eF9jcmVkaXRzICs9IHJwdF9jcmVkaXRzOworCisJCQlmb3IgKGVwaWRfaWR4ID0gMDsgZXBpZF9pZHggPCBEQVRBX0VQX1NJWkU7IGVwaWRfaWR4KyspIHsKKwkJCQlwRW5kcG9pbnQgPSAmdGFyZ2V0LT5FbmRQb2ludFtlaWRbZXBpZF9pZHhdXTsKKwkJCQlpZiAoSFRDX1BBQ0tFVF9RVUVVRV9ERVBUSCgmcEVuZHBvaW50LT5UeFF1ZXVlKSkgeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0KKwkJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKwkJCWh0Y190cnlfc2VuZCh0YXJnZXQsIHBFbmRwb2ludCwgTlVMTCk7CisJCQlMT0NLX0hUQ19UWCh0YXJnZXQpOworCQl9IGVsc2UgeworCQkJcEVuZHBvaW50LT5UeENyZWRpdHMgKz0gcnB0X2NyZWRpdHM7CisKKwkJCWlmIChwRW5kcG9pbnQtPlR4Q3JlZGl0cworCQkJICAgICYmIEhUQ19QQUNLRVRfUVVFVUVfREVQVEgoJnBFbmRwb2ludC0+VHhRdWV1ZSkpIHsKKwkJCQlVTkxPQ0tfSFRDX1RYKHRhcmdldCk7CisJCQkJaHRjX3RyeV9zZW5kKHRhcmdldCwgcEVuZHBvaW50LCBOVUxMKTsKKwkJCQlMT0NLX0hUQ19UWCh0YXJnZXQpOworCQkJfQorCQl9CisjZWxzZQorCQlwRW5kcG9pbnQtPlR4Q3JlZGl0cyArPSBycHRfY3JlZGl0czsKKworCQlpZiAocEVuZHBvaW50LT5TZXJ2aWNlSUQgPT0gV01JX0NPTlRST0xfU1ZDKSB7CisJCQlMT0NLX0hUQ19DUkVESVQodGFyZ2V0KTsKKwkJCWh0Y19jcmVkaXRfcmVjb3JkKEhUQ19QUk9DRVNTX0NSRURJVF9SRVBPUlQsCisJCQkJCSAgcEVuZHBvaW50LT5UeENyZWRpdHMsCisJCQkJCSAgSFRDX1BBQ0tFVF9RVUVVRV9ERVBUSCgmcEVuZHBvaW50LT4KKwkJCQkJCQkJIFR4UXVldWUpKTsKKwkJCVVOTE9DS19IVENfQ1JFRElUKHRhcmdldCk7CisJCX0KKworCQlpZiAocEVuZHBvaW50LT5UeENyZWRpdHMKKwkJICAgICYmIEhUQ19QQUNLRVRfUVVFVUVfREVQVEgoJnBFbmRwb2ludC0+VHhRdWV1ZSkpIHsKKwkJCVVOTE9DS19IVENfVFgodGFyZ2V0KTsKKyNpZmRlZiBBVEhfMTFBQ19UWENPTVBBQ1QKKwkJCWh0Y190cnlfc2VuZCh0YXJnZXQsIHBFbmRwb2ludCwgTlVMTCk7CisjZWxzZQorCQkJaWYgKHBFbmRwb2ludC0+U2VydmljZUlEID09IEhUVF9EQVRBX01TR19TVkMpIHsKKwkJCQlodGNfc2VuZF9kYXRhX3BrdCh0YXJnZXQsIE5VTEwsIDApOworCQkJfSBlbHNlIHsKKwkJCQlodGNfdHJ5X3NlbmQodGFyZ2V0LCBwRW5kcG9pbnQsIE5VTEwpOworCQkJfQorI2VuZGlmCisJCQlMT0NLX0hUQ19UWCh0YXJnZXQpOworCQl9CisjZW5kaWYKKwkJdG90YWxDcmVkaXRzICs9IHJwdF9jcmVkaXRzOworCX0KKworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfU0VORCwKKwkJCSgiICBSZXBvcnQgaW5kaWNhdGVkICVkIGNyZWRpdHMgdG8gZGlzdHJpYnV0ZSBcbiIsCisJCQkgdG90YWxDcmVkaXRzKSk7CisKKwlVTkxPQ0tfSFRDX1RYKHRhcmdldCk7CisKKwlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1NFTkQsICgiLWh0Y19wcm9jZXNzX2NyZWRpdF9ycHQgXG4iKSk7Cit9CisKKy8qIGZ1bmN0aW9uIHRvIGZldGNoIHN0YXRzIGZyb20gaHRjIGxheWVyKi8KK3N0cnVjdCBvbF9hdGhfaHRjX3N0YXRzICppZWVlODAyMTFfaW9jdGxfZ2V0X2h0Y19zdGF0cyhIVENfSEFORExFIEhUQ0hhbmRsZSkKK3sKKwlIVENfVEFSR0VUICp0YXJnZXQgPSBHRVRfSFRDX1RBUkdFVF9GUk9NX0hBTkRMRShIVENIYW5kbGUpOworCisJcmV0dXJuICgmKHRhcmdldC0+aHRjX3BrdF9zdGF0cykpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9odGMvaHRjX3NlcnZpY2VzLmMgYi9jb3JlL2h0Yy9odGNfc2VydmljZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDA2N2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9odGMvaHRjX3NlcnZpY2VzLmMKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlICJodGNfZGVidWcuaCIKKyNpbmNsdWRlICJodGNfaW50ZXJuYWwuaCIKKyNpbmNsdWRlIDxjZGZfbmJ1Zi5oPiAgICAgICAgICAgLyogY2RmX25idWZfdCAqLworI2luY2x1ZGUgImhpZi5oIgorCisvKiB1c2UgY3JlZGl0IGZsb3cgY29udHJvbCBvdmVyIEhUQyAqLwordW5zaWduZWQgaW50IGh0Y19jcmVkaXRfZmxvdyA9IDE7CisjaWZuZGVmIERFQlVHX0NSRURJVAorI2RlZmluZSBERUJVR19DUkVESVQgMAorI2VuZGlmCisKK0FfU1RBVFVTIGh0Y19jb25uZWN0X3NlcnZpY2UoSFRDX0hBTkRMRSBIVENIYW5kbGUsCisJCQkgICAgIEhUQ19TRVJWSUNFX0NPTk5FQ1RfUkVRICpwQ29ubmVjdFJlcSwKKwkJCSAgICAgSFRDX1NFUlZJQ0VfQ09OTkVDVF9SRVNQICpwQ29ubmVjdFJlc3ApCit7CisJSFRDX1RBUkdFVCAqdGFyZ2V0ID0gR0VUX0hUQ19UQVJHRVRfRlJPTV9IQU5ETEUoSFRDSGFuZGxlKTsKKwlBX1NUQVRVUyBzdGF0dXMgPSBBX09LOworCUhUQ19QQUNLRVQgKnBTZW5kUGFja2V0ID0gTlVMTDsKKwlIVENfQ09OTkVDVF9TRVJWSUNFX1JFU1BPTlNFX01TRyAqcFJlc3BvbnNlTXNnOworCUhUQ19DT05ORUNUX1NFUlZJQ0VfTVNHICpwQ29ubmVjdE1zZzsKKwlIVENfRU5EUE9JTlRfSUQgYXNzaWduZWRFbmRwb2ludCA9IEVORFBPSU5UX01BWDsKKwlIVENfRU5EUE9JTlQgKnBFbmRwb2ludDsKKwl1bnNpZ25lZCBpbnQgbWF4TXNnU2l6ZSA9IDA7CisJY2RmX25idWZfdCBuZXRidWY7CisJQV9VSU5UOCB0eEFsbG9jOworCWludCBsZW5ndGg7CisJQV9CT09MIGRpc2FibGVDcmVkaXRGbG93Q3RybCA9IGZhbHNlOworCUFfVUlOVDE2IGNvbm5fZmxhZ3M7CisJQV9VSU5UMTYgcnNwX21zZ19pZCwgcnNwX21zZ19zZXJ2X2lkLCByc3BfbXNnX21heF9tc2dfc2l6ZTsKKwlBX1VJTlQ4IHJzcF9tc2dfc3RhdHVzLCByc3BfbXNnX2VuZF9pZCwgcnNwX21zZ19zZXJ2X21ldGFfbGVuOworCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19UUkMsCisJCQkoIitodGNfY29ubmVjdF9zZXJ2aWNlLCB0YXJnZXQ6JXAgU3ZjSUQ6MHglWCBcbiIsIHRhcmdldCwKKwkJCSBwQ29ubmVjdFJlcS0+U2VydmljZUlEKSk7CisKKwlkbyB7CisKKwkJQVJfREVCVUdfQVNTRVJUKHBDb25uZWN0UmVxLT5TZXJ2aWNlSUQgIT0gMCk7CisKKwkJaWYgKEhUQ19DVFJMX1JTVkRfU1ZDID09IHBDb25uZWN0UmVxLT5TZXJ2aWNlSUQpIHsKKwkJCS8qIHNwZWNpYWwgY2FzZSBmb3IgcHNldWRvIGNvbnRyb2wgc2VydmljZSAqLworCQkJYXNzaWduZWRFbmRwb2ludCA9IEVORFBPSU5UXzA7CisJCQltYXhNc2dTaXplID0gSFRDX01BWF9DT05UUk9MX01FU1NBR0VfTEVOR1RIOworCQkJdHhBbGxvYyA9IDA7CisKKwkJfSBlbHNlIHsKKworCQkJdHhBbGxvYyA9CisJCQkJaHRjX2dldF9jcmVkaXRfYWxsb2NhdGlvbih0YXJnZXQsCisJCQkJCQkJICBwQ29ubmVjdFJlcS0+U2VydmljZUlEKTsKKwkJCWlmICghdHhBbGxvYykgeworCQkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfVFJDLAorCQkJCQkJKCJTZXJ2aWNlICVkIGRvZXMgbm90IGFsbG9jYXRlIHRhcmdldCBjcmVkaXRzIVxuIiwKKwkJCQkJCSBwQ29ubmVjdFJlcS0+U2VydmljZUlEKSk7CisJCQl9CisKKwkJCS8qIGFsbG9jYXRlIGEgcGFja2V0IHRvIHNlbmQgdG8gdGhlIHRhcmdldCAqLworCQkJcFNlbmRQYWNrZXQgPSBodGNfYWxsb2NfY29udHJvbF90eF9wYWNrZXQodGFyZ2V0KTsKKworCQkJaWYgKE5VTEwgPT0gcFNlbmRQYWNrZXQpIHsKKwkJCQlBUl9ERUJVR19BU1NFUlQoZmFsc2UpOworCQkJCXN0YXR1cyA9IEFfTk9fTUVNT1JZOworCQkJCWJyZWFrOworCQkJfQorCisJCQluZXRidWYgPQorCQkJCShjZGZfbmJ1Zl90KQorCQkJCUdFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVChwU2VuZFBhY2tldCk7CisJCQlsZW5ndGggPQorCQkJCXNpemVvZihIVENfQ09OTkVDVF9TRVJWSUNFX01TRykgKworCQkJCXBDb25uZWN0UmVxLT5NZXRhRGF0YUxlbmd0aDsKKworCQkJLyogYXNzZW1ibGUgY29ubmVjdCBzZXJ2aWNlIG1lc3NhZ2UgKi8KKwkJCWNkZl9uYnVmX3B1dF90YWlsKG5ldGJ1ZiwgbGVuZ3RoKTsKKwkJCXBDb25uZWN0TXNnID0KKwkJCQkoSFRDX0NPTk5FQ1RfU0VSVklDRV9NU0cgKikgY2RmX25idWZfZGF0YShuZXRidWYpOworCisJCQlpZiAoTlVMTCA9PSBwQ29ubmVjdE1zZykgeworCQkJCUFSX0RFQlVHX0FTU0VSVCgwKTsKKwkJCQlzdGF0dXMgPSBBX0VGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJQV9NRU1aRVJPKHBDb25uZWN0TXNnLCBzaXplb2YoSFRDX0NPTk5FQ1RfU0VSVklDRV9NU0cpKTsKKworCQkJY29ubl9mbGFncyA9CisJCQkJKHBDb25uZWN0UmVxLT4KKwkJCQkgQ29ubmVjdGlvbkZsYWdzICYgfkhUQ19TRVRfUkVDVl9BTExPQ19NQVNLKSB8CisJCQkJSFRDX0NPTk5FQ1RfRkxBR1NfU0VUX1JFQ1ZfQUxMT0NBVElPTih0eEFsbG9jKTsKKwkJCUhUQ19TRVRfRklFTEQocENvbm5lY3RNc2csIEhUQ19DT05ORUNUX1NFUlZJQ0VfTVNHLAorCQkJCSAgICAgIE1FU1NBR0VJRCwgSFRDX01TR19DT05ORUNUX1NFUlZJQ0VfSUQpOworCQkJSFRDX1NFVF9GSUVMRChwQ29ubmVjdE1zZywgSFRDX0NPTk5FQ1RfU0VSVklDRV9NU0csCisJCQkJICAgICAgU0VSVklDRV9JRCwgcENvbm5lY3RSZXEtPlNlcnZpY2VJRCk7CisJCQlIVENfU0VUX0ZJRUxEKHBDb25uZWN0TXNnLCBIVENfQ09OTkVDVF9TRVJWSUNFX01TRywKKwkJCQkgICAgICBDT05ORUNUSU9ORkxBR1MsIGNvbm5fZmxhZ3MpOworCisJCQlpZiAocENvbm5lY3RSZXEtPgorCQkJICAgIENvbm5lY3Rpb25GbGFncyAmCisJCQkgICAgSFRDX0NPTk5FQ1RfRkxBR1NfRElTQUJMRV9DUkVESVRfRkxPV19DVFJMKSB7CisJCQkJZGlzYWJsZUNyZWRpdEZsb3dDdHJsID0gdHJ1ZTsKKwkJCX0KKyNpZiBkZWZpbmVkKEhJRl9VU0IpCisJCQlpZiAoIWh0Y19jcmVkaXRfZmxvdykgeworCQkJCWRpc2FibGVDcmVkaXRGbG93Q3RybCA9IHRydWU7CisJCQl9CisjZWxzZQorCQkJLyogT25seSBlbmFibGUgY3JlZGl0IGZvciBXTUkgc2VydmljZSAqLworCQkJaWYgKCFodGNfY3JlZGl0X2Zsb3cKKwkJCSAgICAmJiBwQ29ubmVjdFJlcS0+U2VydmljZUlEICE9IFdNSV9DT05UUk9MX1NWQykgeworCQkJCWRpc2FibGVDcmVkaXRGbG93Q3RybCA9IHRydWU7CisJCQl9CisjZW5kaWYKKwkJCS8qIGNoZWNrIGNhbGxlciBpZiBpdCB3YW50cyB0byB0cmFuc2ZlciBtZXRhIGRhdGEgKi8KKwkJCWlmICgocENvbm5lY3RSZXEtPnBNZXRhRGF0YSAhPSBOVUxMKSAmJgorCQkJICAgIChwQ29ubmVjdFJlcS0+TWV0YURhdGFMZW5ndGggPD0KKwkJCSAgICAgSFRDX1NFUlZJQ0VfTUVUQV9EQVRBX01BWF9MRU5HVEgpKSB7CisJCQkJLyogY29weSBtZXRhIGRhdGEgaW50byBtZXNzYWdlIGJ1ZmZlciAoYWZ0ZXIgaGVhZGVyICkgKi8KKwkJCQlBX01FTUNQWSgoQV9VSU5UOCAqKSBwQ29ubmVjdE1zZyArCisJCQkJCSBzaXplb2YoSFRDX0NPTk5FQ1RfU0VSVklDRV9NU0cpLAorCQkJCQkgcENvbm5lY3RSZXEtPnBNZXRhRGF0YSwKKwkJCQkJIHBDb25uZWN0UmVxLT5NZXRhRGF0YUxlbmd0aCk7CisKKwkJCQlIVENfU0VUX0ZJRUxEKHBDb25uZWN0TXNnLAorCQkJCQkgICAgICBIVENfQ09OTkVDVF9TRVJWSUNFX01TRywKKwkJCQkJICAgICAgU0VSVklDRU1FVEFMRU5HVEgsCisJCQkJCSAgICAgIHBDb25uZWN0UmVxLT5NZXRhRGF0YUxlbmd0aCk7CisJCQl9CisKKwkJCVNFVF9IVENfUEFDS0VUX0lORk9fVFgocFNlbmRQYWNrZXQsCisJCQkJCSAgICAgICBOVUxMLAorCQkJCQkgICAgICAgKEFfVUlOVDggKikgcENvbm5lY3RNc2csCisJCQkJCSAgICAgICBsZW5ndGgsCisJCQkJCSAgICAgICBFTkRQT0lOVF8wLAorCQkJCQkgICAgICAgSFRDX1NFUlZJQ0VfVFhfUEFDS0VUX1RBRyk7CisKKwkJCXN0YXR1cyA9IGh0Y19zZW5kX3BrdCgoSFRDX0hBTkRMRSkgdGFyZ2V0LCBwU2VuZFBhY2tldCk7CisJCQkvKiB3ZSBkb24ndCBvd24gaXQgYW55bW9yZSAqLworCQkJcFNlbmRQYWNrZXQgPSBOVUxMOworCQkJaWYgKEFfRkFJTEVEKHN0YXR1cykpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogd2FpdCBmb3IgcmVzcG9uc2UgKi8KKwkJCXN0YXR1cyA9IGh0Y193YWl0X3JlY3ZfY3RybF9tZXNzYWdlKHRhcmdldCk7CisJCQlpZiAoQV9GQUlMRUQoc3RhdHVzKSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLyogd2UgY29udHJvbGxlZCB0aGUgYnVmZmVyIGNyZWF0aW9uIHNvIGl0IGhhcyB0byBiZSBwcm9wZXJseSBhbGlnbmVkICovCisJCQlwUmVzcG9uc2VNc2cgPQorCQkJCShIVENfQ09OTkVDVF9TRVJWSUNFX1JFU1BPTlNFX01TRyAqKSB0YXJnZXQtPgorCQkJCUN0cmxSZXNwb25zZUJ1ZmZlcjsKKworCQkJcnNwX21zZ19pZCA9IEhUQ19HRVRfRklFTEQocFJlc3BvbnNlTXNnLAorCQkJCQkJICAgSFRDX0NPTk5FQ1RfU0VSVklDRV9SRVNQT05TRV9NU0csCisJCQkJCQkgICBNRVNTQUdFSUQpOworCQkJcnNwX21zZ19zZXJ2X2lkID0KKwkJCQlIVENfR0VUX0ZJRUxEKHBSZXNwb25zZU1zZywKKwkJCQkJICAgICAgSFRDX0NPTk5FQ1RfU0VSVklDRV9SRVNQT05TRV9NU0csCisJCQkJCSAgICAgIFNFUlZJQ0VJRCk7CisJCQlyc3BfbXNnX3N0YXR1cyA9CisJCQkJSFRDX0dFVF9GSUVMRChwUmVzcG9uc2VNc2csCisJCQkJCSAgICAgIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHLAorCQkJCQkgICAgICBTVEFUVVMpOworCQkJcnNwX21zZ19lbmRfaWQgPQorCQkJCUhUQ19HRVRfRklFTEQocFJlc3BvbnNlTXNnLAorCQkJCQkgICAgICBIVENfQ09OTkVDVF9TRVJWSUNFX1JFU1BPTlNFX01TRywKKwkJCQkJICAgICAgRU5EUE9JTlRJRCk7CisJCQlyc3BfbXNnX21heF9tc2dfc2l6ZSA9CisJCQkJSFRDX0dFVF9GSUVMRChwUmVzcG9uc2VNc2csCisJCQkJCSAgICAgIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHLAorCQkJCQkgICAgICBNQVhNU0dTSVpFKTsKKwkJCXJzcF9tc2dfc2Vydl9tZXRhX2xlbiA9CisJCQkJSFRDX0dFVF9GSUVMRChwUmVzcG9uc2VNc2csCisJCQkJCSAgICAgIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHLAorCQkJCQkgICAgICBTRVJWSUNFTUVUQUxFTkdUSCk7CisKKwkJCWlmICgocnNwX21zZ19pZCAhPSBIVENfTVNHX0NPTk5FQ1RfU0VSVklDRV9SRVNQT05TRV9JRCkKKwkJCSAgICB8fCAodGFyZ2V0LT5DdHJsUmVzcG9uc2VMZW5ndGggPAorCQkJCXNpemVvZihIVENfQ09OTkVDVF9TRVJWSUNFX1JFU1BPTlNFX01TRykpKSB7CisJCQkJLyogdGhpcyBtZXNzYWdlIGlzIG5vdCB2YWxpZCAqLworCQkJCUFSX0RFQlVHX0FTU0VSVChmYWxzZSk7CisJCQkJc3RhdHVzID0gQV9FUFJPVE87CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfVFJDLAorCQkJCQkoImh0Y19jb25uZWN0X3NlcnZpY2UsIHNlcnZpY2UgMHglWCBjb25uZWN0IHJlc3BvbnNlIGZyb20gdGFyZ2V0IHN0YXR1czolZCwgYXNzaWduZWQgZXA6ICVkXG4iLAorCQkJCQkgcnNwX21zZ19zZXJ2X2lkLCByc3BfbXNnX3N0YXR1cywKKwkJCQkJIHJzcF9tc2dfZW5kX2lkKSk7CisKKwkJCXBDb25uZWN0UmVzcC0+Q29ubmVjdFJlc3BDb2RlID0gcnNwX21zZ19zdGF0dXM7CisKKwkJCS8qIGNoZWNrIHJlc3BvbnNlIHN0YXR1cyAqLworCQkJaWYgKHJzcF9tc2dfc3RhdHVzICE9IEhUQ19TRVJWSUNFX1NVQ0NFU1MpIHsKKwkJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkJCSgiIFRhcmdldCBmYWlsZWQgc2VydmljZSAweCVYIGNvbm5lY3QgcmVxdWVzdCAoc3RhdHVzOiVkKVxuIiwKKwkJCQkJCSByc3BfbXNnX3NlcnZfaWQsCisJCQkJCQkgcnNwX21zZ19zdGF0dXMpKTsKKwkJCQlzdGF0dXMgPSBBX0VQUk9UTzsKKyNpZmRlZiBRQ0FfVFhfSFRUMl9TVVBQT1JUCisJCQkJLyogS2VlcCB3b3JrIGFuZCBub3QgdG8gYmxvY2sgdGhlIGNvbnRyb2wgbWVzc2FnZS4gKi8KKwkJCQl0YXJnZXQtPkN0cmxSZXNwb25zZVByb2Nlc3NpbmcgPSBmYWxzZTsKKyNlbmRpZiAvKiBRQ0FfVFhfSFRUMl9TVVBQT1JUICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWFzc2lnbmVkRW5kcG9pbnQgPSAoSFRDX0VORFBPSU5UX0lEKSByc3BfbXNnX2VuZF9pZDsKKwkJCW1heE1zZ1NpemUgPSByc3BfbXNnX21heF9tc2dfc2l6ZTsKKworCQkJaWYgKChwQ29ubmVjdFJlc3AtPnBNZXRhRGF0YSAhPSBOVUxMKSAmJgorCQkJICAgIChyc3BfbXNnX3NlcnZfbWV0YV9sZW4gPiAwKSAmJgorCQkJICAgIChyc3BfbXNnX3NlcnZfbWV0YV9sZW4gPD0KKwkJCSAgICAgSFRDX1NFUlZJQ0VfTUVUQV9EQVRBX01BWF9MRU5HVEgpKSB7CisJCQkJLyogY2FsbGVyIHN1cHBsaWVkIGEgYnVmZmVyIGFuZCB0aGUgdGFyZ2V0IHJlc3BvbmRlZCB3aXRoIGRhdGEgKi8KKwkJCQlpbnQgY29weUxlbmd0aCA9CisJCQkJCW1pbigoaW50KXBDb25uZWN0UmVzcC0+QnVmZmVyTGVuZ3RoLAorCQkJCQkgICAgKGludClyc3BfbXNnX3NlcnZfbWV0YV9sZW4pOworCQkJCS8qIGNvcHkgdGhlIG1ldGEgZGF0YSAqLworCQkJCUFfTUVNQ1BZKHBDb25uZWN0UmVzcC0+cE1ldGFEYXRhLAorCQkJCQkgKChBX1VJTlQ4ICopIHBSZXNwb25zZU1zZykgKworCQkJCQkgc2l6ZW9mCisJCQkJCSAoSFRDX0NPTk5FQ1RfU0VSVklDRV9SRVNQT05TRV9NU0cpLAorCQkJCQkgY29weUxlbmd0aCk7CisJCQkJcENvbm5lY3RSZXNwLT5BY3R1YWxMZW5ndGggPSBjb3B5TGVuZ3RoOworCQkJfQorCQkJLyogZG9uZSBwcm9jZXNzaW5nIHJlc3BvbnNlIGJ1ZmZlciAqLworCQkJdGFyZ2V0LT5DdHJsUmVzcG9uc2VQcm9jZXNzaW5nID0gZmFsc2U7CisJCX0KKworCQkvKiB0aGUgcmVzdCBvZiB0aGVzZSBhcmUgcGFyYW1ldGVyIGNoZWNrcyBzbyBzZXQgdGhlIGVycm9yIHN0YXR1cyAqLworCQlzdGF0dXMgPSBBX0VQUk9UTzsKKworCQlpZiAoYXNzaWduZWRFbmRwb2ludCA+PSBFTkRQT0lOVF9NQVgpIHsKKwkJCUFSX0RFQlVHX0FTU0VSVChmYWxzZSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgwID09IG1heE1zZ1NpemUpIHsKKwkJCUFSX0RFQlVHX0FTU0VSVChmYWxzZSk7CisJCQlicmVhazsKKwkJfQorCisJCXBFbmRwb2ludCA9ICZ0YXJnZXQtPkVuZFBvaW50W2Fzc2lnbmVkRW5kcG9pbnRdOworCQlwRW5kcG9pbnQtPklkID0gYXNzaWduZWRFbmRwb2ludDsKKwkJaWYgKHBFbmRwb2ludC0+U2VydmljZUlEICE9IDApIHsKKwkJCS8qIGVuZHBvaW50IGFscmVhZHkgaW4gdXNlISAqLworCQkJQVJfREVCVUdfQVNTRVJUKGZhbHNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogcmV0dXJuIGFzc2lnbmVkIGVuZHBvaW50IHRvIGNhbGxlciAqLworCQlwQ29ubmVjdFJlc3AtPkVuZHBvaW50ID0gYXNzaWduZWRFbmRwb2ludDsKKwkJcENvbm5lY3RSZXNwLT5NYXhNc2dMZW5ndGggPSBtYXhNc2dTaXplOworCisJCS8qIHNldHVwIHRoZSBlbmRwb2ludCAqLworCQlwRW5kcG9pbnQtPlNlcnZpY2VJRCA9IHBDb25uZWN0UmVxLT5TZXJ2aWNlSUQ7ICAvKiB0aGlzIG1hcmtzIHRoZSBlbmRwb2ludCBpbiB1c2UgKi8KKwkJcEVuZHBvaW50LT5NYXhUeFF1ZXVlRGVwdGggPSBwQ29ubmVjdFJlcS0+TWF4U2VuZFF1ZXVlRGVwdGg7CisJCXBFbmRwb2ludC0+TWF4TXNnTGVuZ3RoID0gbWF4TXNnU2l6ZTsKKwkJcEVuZHBvaW50LT5UeENyZWRpdHMgPSB0eEFsbG9jOworCQlwRW5kcG9pbnQtPlR4Q3JlZGl0U2l6ZSA9IHRhcmdldC0+VGFyZ2V0Q3JlZGl0U2l6ZTsKKwkJcEVuZHBvaW50LT5UeENyZWRpdHNQZXJNYXhNc2cgPQorCQkJbWF4TXNnU2l6ZSAvIHRhcmdldC0+VGFyZ2V0Q3JlZGl0U2l6ZTsKKwkJaWYgKG1heE1zZ1NpemUgJSB0YXJnZXQtPlRhcmdldENyZWRpdFNpemUpIHsKKwkJCXBFbmRwb2ludC0+VHhDcmVkaXRzUGVyTWF4TXNnKys7CisJCX0KKyNpZiBERUJVR19DUkVESVQKKwkJY2RmX3ByaW50KCIgRW5kcG9pbnQlZCBpbml0aWFsIGNyZWRpdDolZCwgc2l6ZTolZC5cbiIsCisJCQkgIHBFbmRwb2ludC0+SWQsIHBFbmRwb2ludC0+VHhDcmVkaXRzLAorCQkJICBwRW5kcG9pbnQtPlR4Q3JlZGl0U2l6ZSk7CisjZW5kaWYKKworCQkvKiBjb3B5IGFsbCB0aGUgY2FsbGJhY2tzICovCisJCXBFbmRwb2ludC0+RXBDYWxsQmFja3MgPSBwQ29ubmVjdFJlcS0+RXBDYWxsYmFja3M7CisKKwkJc3RhdHVzID0gaGlmX21hcF9zZXJ2aWNlX3RvX3BpcGUodGFyZ2V0LT5oaWZfZGV2LAorCQkJCQkJIHBFbmRwb2ludC0+U2VydmljZUlELAorCQkJCQkJICZwRW5kcG9pbnQtPlVMX1BpcGVJRCwKKwkJCQkJCSAmcEVuZHBvaW50LT5ETF9QaXBlSUQsCisJCQkJCQkgJnBFbmRwb2ludC0+dWxfaXNfcG9sbGVkLAorCQkJCQkJICZwRW5kcG9pbnQtPmRsX2lzX3BvbGxlZCk7CisJCWlmIChBX0ZBSUxFRChzdGF0dXMpKSB7CisJCQlicmVhazsKKwkJfQorCisJCWNkZl9hc3NlcnQoIXBFbmRwb2ludC0+ZGxfaXNfcG9sbGVkKTsgICAvKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLworCisJCWlmIChwRW5kcG9pbnQtPnVsX2lzX3BvbGxlZCkgeworCQkJY2RmX3NvZnRpcnFfdGltZXJfaW5pdCh0YXJnZXQtPm9zZGV2LAorCQkJCSZwRW5kcG9pbnQtPnVsX3BvbGxfdGltZXIsCisJCQkJaHRjX3NlbmRfY29tcGxldGVfY2hlY2tfY2xlYW51cCwKKwkJCQlwRW5kcG9pbnQsCisJCQkJQ0RGX1RJTUVSX1RZUEVfU1cpOworCQl9CisKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19TRVRVUCwKKwkJCQkoIkhUQyBTZXJ2aWNlOjB4JTQuNFgsIFVMcGlwZTolZCBETHBpcGU6JWQgaWQ6JWQgUmVhZHlcbiIsCisJCQkJIHBFbmRwb2ludC0+U2VydmljZUlELCBwRW5kcG9pbnQtPlVMX1BpcGVJRCwKKwkJCQkgcEVuZHBvaW50LT5ETF9QaXBlSUQsIHBFbmRwb2ludC0+SWQpKTsKKworCQlpZiAoZGlzYWJsZUNyZWRpdEZsb3dDdHJsICYmIHBFbmRwb2ludC0+VHhDcmVkaXRGbG93RW5hYmxlZCkgeworCQkJcEVuZHBvaW50LT5UeENyZWRpdEZsb3dFbmFibGVkID0gZmFsc2U7CisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1dBUk4sCisJCQkJCSgiSFRDIFNlcnZpY2U6MHglNC40WCBlcDolZCBUWCBmbG93IGNvbnRyb2wgZGlzYWJsZWRcbiIsCisJCQkJCSBwRW5kcG9pbnQtPlNlcnZpY2VJRCwKKwkJCQkJIGFzc2lnbmVkRW5kcG9pbnQpKTsKKwkJfQorCisJfSB3aGlsZSAoZmFsc2UpOworCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19UUkMsICgiLWh0Y19jb25uZWN0X3NlcnZpY2UgXG4iKSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGh0Y19zZXRfY3JlZGl0X2Rpc3RyaWJ1dGlvbihIVENfSEFORExFIEhUQ0hhbmRsZSwKKwkJCQkgdm9pZCAqcENyZWRpdERpc3RDb250ZXh0LAorCQkJCSBIVENfQ1JFRElUX0RJU1RfQ0FMTEJBQ0sgQ3JlZGl0RGlzdEZ1bmMsCisJCQkJIEhUQ19DUkVESVRfSU5JVF9DQUxMQkFDSyBDcmVkaXRJbml0RnVuYywKKwkJCQkgSFRDX1NFUlZJQ0VfSUQgU2VydmljZVByaW9yaXR5T3JkZXJbXSwKKwkJCQkgaW50IExpc3RMZW5ndGgpCit7CisJLyogTk9UIFN1cHBvcnRlZCwgdGhpcyB0cmFuc3BvcnQgZG9lcyBub3QgdXNlIGEgY3JlZGl0IGJhc2VkIGZsb3cgY29udHJvbCBtZWNoYW5pc20gKi8KKworfQorCit2b2lkIGh0Y19md19ldmVudF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIENERl9TVEFUVVMgc3RhdHVzKQoreworCUhUQ19UQVJHRVQgKnRhcmdldCA9IChIVENfVEFSR0VUICopIGNvbnRleHQ7CisJSFRDX0lOSVRfSU5GTyAqaW5pdEluZm8gPSAmdGFyZ2V0LT5IVENJbml0SW5mbzsKKworCS8qIGNoZWNrIGlmIHRhcmdldCBmYWlsdXJlIGhhbmRsZXIgZXhpc3RzIGFuZCBwYXNzIGVycm9yIGNvZGUgdG8gaXQuICovCisJaWYgKHRhcmdldC0+SFRDSW5pdEluZm8uVGFyZ2V0RmFpbHVyZSAhPSBOVUxMKSB7CisJCWluaXRJbmZvLT5UYXJnZXRGYWlsdXJlKGluaXRJbmZvLT5wQ29udGV4dCwgc3RhdHVzKTsKKwl9Cit9CisKKy8qIERpc2FibGUgQVNQTSA6IGRpc2FibGUgUENJZSBsb3cgcG93ZXIgKi8KK3ZvaWQgaHRjX2Rpc2FibGVfYXNwbSh2b2lkKQoreworCWhpZl9kaXNhYmxlX2FzcG0oKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL2luYy9hbmlfZ2xvYmFsLmggYi9jb3JlL21hYy9pbmMvYW5pX2dsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYmVlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9pbmMvYW5pX2dsb2JhbC5oCkBAIC0wLDAgKzEsMTA2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQU5JR0xPQkFMX0gKKyNkZWZpbmUgX0FOSUdMT0JBTF9ICisKKy8qIFRha2UgY2FyZSB0byBhdm9pZCByZWRlZmluaXRpb24gb2YgdGhpcyB0eXBlLCBpZiBpdCBpcyAqLworLyogYWxyZWFkeSBkZWZpbmVkIGluICJoYWxXbW1BcGkuaCIgKi8KKyNpZiAhZGVmaW5lZChfSEFMTUFDX1dNTV9BUElfSCkKK3R5cGVkZWYgc3RydWN0IHNBbmlTaXJHbG9iYWwgKnRwQW5pU2lyR2xvYmFsOworI2VuZGlmCisKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJzaXJfY29tbW9uLmgiCisjaW5jbHVkZSAiYW5pX3N5c3RlbV9kZWZzLmgiCisjaW5jbHVkZSAic3lzX2RlZi5oIgorI2luY2x1ZGUgImRwaF9nbG9iYWwuaCIKKyNpbmNsdWRlICJsaW1fZ2xvYmFsLmgiCisjaW5jbHVkZSAic2NoX2dsb2JhbC5oIgorI2luY2x1ZGUgInN5c19nbG9iYWwuaCIKKyNpbmNsdWRlICJjZmdfZ2xvYmFsLmgiCisjaW5jbHVkZSAidXRpbHNfZ2xvYmFsLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorCisjaW5jbHVkZSAiY3NyX2FwaS5oIgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSAic21lX2Z0X2FwaS5oIgorI2VuZGlmCisjaW5jbHVkZSAiY3NyX3N1cHBvcnQuaCIKKyNpbmNsdWRlICJzbWVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzYXBfYXBpLmgiCisjaW5jbHVkZSAiY3NyX2ludGVybmFsLmgiCisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKyNpbmNsdWRlICJvZW1fZGF0YV9pbnRlcm5hbC5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNpbmNsdWRlICJzbWVfcnJtX2ludGVybmFsLmgiCisjaW5jbHVkZSAicnJtX2dsb2JhbC5oIgorI2VuZGlmCisjaW5jbHVkZSAicDJwX2FwaS5oIgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2luY2x1ZGUgPGxpbV9mdF9kZWZzLmg+CisjZW5kaWYKKworLyogQ2hlY2sgaWYgdGhpcyBkZWZpbml0aW9uIGNhbiBhY3R1YWxseSBtb3ZlIGhlcmUgZnJvbSBoYWxJbnRlcm5hbC5oIGV2ZW4gZm9yIFZvbGFucy4gSW4gdGhhdCBjYXNlICovCisvKiB0aGlzIGZlYXR1cml6YXRpb24gY2FuIGJlIHJlbW92ZWQuICovCisjZGVmaW5lIFBNQUNfU1RSVUNUKF9oSGFsKSAgKCh0cEFuaVNpckdsb2JhbClfaEhhbCkKKworI2RlZmluZSBBTklfRFJJVkVSX1RZUEUocE1hYykgICAgICgoKHRwQW5pU2lyR2xvYmFsKShwTWFjKSktPmdEcml2ZXJUeXBlKQorCisjZGVmaW5lIElTX01JUkFDQVNUX1NFU1NJT05fUFJFU0VOVChwTWFjKSAgICAgKCgodHBBbmlTaXJHbG9iYWwpKHBNYWMpKS0+Zk1pcmFjYXN0U2Vzc2lvblByZXNlbnQgPyAxIDogMCkKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEJzcyBRb3MgQ2FwcyBiaXQgbWFwIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgTElNX0JTU19DQVBTX09GRlNFVF9IQ0YgMAorI2RlZmluZSBMSU1fQlNTX0NBUFNfT0ZGU0VUX1dNRSAxCisjZGVmaW5lIExJTV9CU1NfQ0FQU19PRkZTRVRfV1NNIDIKKworI2RlZmluZSBMSU1fQlNTX0NBUFNfSENGICgxIDw8IExJTV9CU1NfQ0FQU19PRkZTRVRfSENGKQorI2RlZmluZSBMSU1fQlNTX0NBUFNfV01FICgxIDw8IExJTV9CU1NfQ0FQU19PRkZTRVRfV01FKQorI2RlZmluZSBMSU1fQlNTX0NBUFNfV1NNICgxIDw8IExJTV9CU1NfQ0FQU19PRkZTRVRfV1NNKQorCisvKiBjYXAgc2hvdWxkIGJlIG9uZSBvZiBIQ0YvV01FL1dTTSAqLworI2RlZmluZSBMSU1fQlNTX0NBUFNfR0VUKGNhcCwgdmFsKSAoKCh2YWwpICYgKExJTV9CU1NfQ0FQU18gIyMgY2FwKSkgPj4gTElNX0JTU19DQVBTX09GRlNFVF8gIyMgY2FwKQorI2RlZmluZSBMSU1fQlNTX0NBUFNfU0VUKGNhcCwgdmFsKSAoKHZhbCkgfD0gKExJTV9CU1NfQ0FQU18gIyMgY2FwKSkKKyNkZWZpbmUgTElNX0JTU19DQVBTX0NMUihjYXAsIHZhbCkgKCh2YWwpICY9ICh+KExJTV9CU1NfQ0FQU18gIyMgY2FwKSkpCisKKy8qIDQwIGJlYWNvbnMgcGVyIGhlYXJ0IGJlYXQgaW50ZXJ2YWwgaXMgdGhlIGRlZmF1bHQgKyAxIHRvIGNvdW50IHRoZSByZXN0ICovCisjZGVmaW5lIE1BWF9OT19CRUFDT05TX1BFUl9IRUFSVF9CRUFUX0lOVEVSVkFMIDQxCisKKy8qIG1heCBudW1iZXIgb2YgbGVnYWN5IGJzc2lkIHdlIGNhbiBzdG9yZSBkdXJpbmcgc2NhbiBvbiBvbmUgY2hhbm5lbCAqLworI2RlZmluZSBNQVhfTlVNX0xFR0FDWV9CU1NJRF9QRVJfQ0hBTk5FTCAgICAxMAorCisjZGVmaW5lIFAyUF9XSUxEQ0FSRF9TU0lEICJESVJFQ1QtIiAgICAgLyogVE9ETyBQdXQgaXQgaW4gcHJvcGVyIHBsYWNlOyAqLworI2RlZmluZSBQMlBfV0lMRENBUkRfU1NJRF9MRU4gNworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0NPTkNVUlJFTlRfUDJQCisjZGVmaW5lIE1BWF9OT19PRl9QMlBfU0VTU0lPTlMgIDUKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfQ09OQ1VSUkVOVF9QMlAgKi8KKworI2RlZmluZSBTUEFDRV9BU0NJSV9WQUxVRSAgMzIKKworI2RlZmluZSBXTEFOX0hPU1RfU0VRX05VTV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIFdMQU5fSE9TVF9TRVFfTlVNX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTUKKyNkZWZpbmUgTE9XX1NFUV9OVU1fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGCisjZGVmaW5lIEhJR0hfU0VRX05VTV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEZGMAorI2RlZmluZSBISUdIX1NFUV9OVU1fT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisKKy8qIHZlbmRvciBlbGVtZW50IElEICovCisjZGVmaW5lIElFX0VJRF9WRU5ET1IgICAgICAgICgyMjEpIC8qIDB4REQgKi8KKyNkZWZpbmUgSUVfTEVOX1NJWkUgICAgICAgICAgKDEpCisjZGVmaW5lIElFX0VJRF9TSVpFICAgICAgICAgICgxKQorLyogTWluaW11bSBzaXplIG9mIHZlbmRvciBJRSA9IDMgYnl0ZXMgb2Ygb3VpX2RhdGEgKyAxIGJ5dGUgb2YgZGF0YSAqLworI2RlZmluZSBJRV9WRU5ET1JfT1VJX1NJWkUgICAoNCkKKworLyoqCisgKiBlbnVtIGxvZ19ldmVudF90eXBlIC0gVHlwZSBvZiBldmVudCBpbml0aWF0aW5nIGJ1ZyByZXBvcnQKKyAqIEBXTEFOX0xPR19UWVBFX05PTl9GQVRBTDogTm9uIGZhdGFsIGV2ZW50CisgKiBAV0xBTl9MT0dfVFlQRV9GQVRBTDogRmF0YWwgZXZlbnQKKyAqCisgKiBFbnVtIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBpcyBpbml0aWF0aW5nIHRoZSBidWcgcmVwb3J0CisgKi8KK2VudW0gbG9nX2V2ZW50X3R5cGUgeworCVdMQU5fTE9HX1RZUEVfTk9OX0ZBVEFMLAorCVdMQU5fTE9HX1RZUEVfRkFUQUwsCit9OworCisvKioKKyAqIGVudW0gbG9nX2V2ZW50X2luZGljYXRvciAtIE1vZHVsZSB0cmlnZ2VyaW5nIGJ1ZyByZXBvcnQKKyAqIEBXTEFOX0xPR19JTkRJQ0FUT1JfVU5VU0VEOiBVbnVzZWQKKyAqIEBXTEFOX0xPR19JTkRJQ0FUT1JfRlJBTUVXT1JLOiBGcmFtZXdvcmsgdHJpZ2dlcnMgYnVnIHJlcG9ydAorICogQFdMQU5fTE9HX0lORElDQVRPUl9IT1NUX0RSSVZFUjogSG9zdCBkcml2ZXIgdHJpZ2dlcnMgYnVnIHJlcG9ydAorICogQFdMQU5fTE9HX0lORElDQVRPUl9GSVJNV0FSRTogRlcgaW5pdGlhdGVzIGJ1ZyByZXBvcnQKKyAqCisgKiBFbnVtIGluZGljYXRpbmcgdGhlIG1vZHVsZSB0aGF0IHRyaWdnZXJlZCB0aGUgYnVnIHJlcG9ydAorICovCitlbnVtIGxvZ19ldmVudF9pbmRpY2F0b3IgeworCVdMQU5fTE9HX0lORElDQVRPUl9VTlVTRUQsCisJV0xBTl9MT0dfSU5ESUNBVE9SX0ZSQU1FV09SSywKKwlXTEFOX0xPR19JTkRJQ0FUT1JfSE9TVF9EUklWRVIsCisJV0xBTl9MT0dfSU5ESUNBVE9SX0ZJUk1XQVJFLAorfTsKKworLyoqCisgKiBlbnVtIGxvZ19ldmVudF9ob3N0X3JlYXNvbl9jb2RlIC0gUmVhc29uIGNvZGUgZm9yIGJ1ZyByZXBvcnQKKyAqIEBXTEFOX0xPR19SRUFTT05fQ09ERV9VTlVTRUQ6IFVudXNlZAorICogQFdMQU5fTE9HX1JFQVNPTl9DT01NQU5EX1VOU1VDQ0VTU0ZVTDogQ29tbWFuZCByZXNwb25zZSBzdGF0dXMgZnJvbSBGVworICogaXMgZXJyb3IKKyAqIEBXTEFOX0xPR19SRUFTT05fUk9BTV9GQUlMOiBEcml2ZXIgaW5pdGlhdGVkIHJvYW0gaGFzIGZhaWxlZAorICogQFdMQU5fTE9HX1JFQVNPTl9USFJFQURfU1RVQ0s6IE1vbml0b3IgSGVhbHRoIG9mIGhvc3QgdGhyZWFkcyBhbmQgcmVwb3J0CisgKiBmYXRhbCBldmVudCBpZiBzb21lIHRocmVhZCBpcyBzdHVjaworICogQFdMQU5fTE9HX1JFQVNPTl9EQVRBX1NUQUxMOiBVbmFibGUgdG8gc2VuZC9yZWNlaXZlIGRhdGEgZHVlIHRvIGxvdyByZXNvdXJjZQorICogc2NlbmFyaW8gZm9yIGEgcHJvbG9uZ2VkIHBlcmlvZAorICogQFdMQU5fTE9HX1JFQVNPTl9TTUVfQ09NTUFORF9TVFVDSzogU01FIGNvbW1hbmQgaXMgc3R1Y2sgaW4gU01FIGFjdGl2ZSBxdWV1ZQorICogQFdMQU5fTE9HX1JFQVNPTl9aRVJPX1NDQU5fUkVTVUxUUzogRnVsbCBzY2FuIHJlc3VsdGVkIGluIHplcm8gc2NhbiByZXN1bHRzCisgKiBAV0xBTl9MT0dfUkVBU09OX1FVRVVFX0ZVTEw6IERlZmVyIHF1ZXVlIGJlY29tZXMgZnVsbCBmb3IgYSBwcm9sb25nZWQgcGVyaW9kCisgKiBAV0xBTl9MT0dfUkVBU09OX1BPV0VSX0NPTExBUFNFX0ZBSUw6IFVuYWJsZSB0byBhbGxvdyBhcHBzIHBvd2VyIGNvbGxhcHNlCisgKiBmb3IgYSBwcm9sb25nZWQgcGVyaW9kCisgKiBAV0xBTl9MT0dfUkVBU09OX1NTUl9GQUlMOiBVbmFibGUgdG8gZ3JhY2VmdWxseSBjb21wbGV0ZSBTU1IKKyAqIEBXTEFOX0xPR19SRUFTT05fRElTQ09OTkVDVF9GQUlMOiBEaXNjb25uZWN0IGZyb20gU3VwcGxpY2FudCBpcyBub3QKKyAqIHN1Y2Nlc3NmdWwKKyAqIEBXTEFOX0xPR19SRUFTT05fQ0xFQU5fVVBfRkFJTDogQ2xlYW4gdXAgb2YgIFRETFMgb3IgUHJlLUF1dGggU2Vzc2lvbnMKKyAqIG5vdCBzdWNjZXNzZnVsCisgKiBAV0xBTl9MT0dfUkVBU09OX01BTExPQ19GQUlMOiBNZW1vcnkgYWxsb2NhdGlvbiBGYWlscworICogQFdMQU5fTE9HX1JFQVNPTl9WT1NfTVNHX1VOREVSX1JVTjogVk9TIENvcmUgcnVucyBvdXQgb2YgbWVzc2FnZSB3cmFwcGVyCisgKiBAV0xBTl9MT0dfUkVBU09OX01TR19QT1NUX0ZBSUw6IFVuYWJsZSB0byBwb3N0IG1zZworICoKKyAqIFRoaXMgZW51bSBjb250YWlucyB0aGUgZGlmZmVyZW50IHJlYXNvbiBjb2RlcyBmb3IgYnVnIHJlcG9ydAorICovCitlbnVtIGxvZ19ldmVudF9ob3N0X3JlYXNvbl9jb2RlIHsKKwlXTEFOX0xPR19SRUFTT05fQ09ERV9VTlVTRUQsCisJV0xBTl9MT0dfUkVBU09OX0NPTU1BTkRfVU5TVUNDRVNTRlVMLAorCVdMQU5fTE9HX1JFQVNPTl9ST0FNX0ZBSUwsCisJV0xBTl9MT0dfUkVBU09OX1RIUkVBRF9TVFVDSywKKwlXTEFOX0xPR19SRUFTT05fREFUQV9TVEFMTCwKKwlXTEFOX0xPR19SRUFTT05fU01FX0NPTU1BTkRfU1RVQ0ssCisJV0xBTl9MT0dfUkVBU09OX1pFUk9fU0NBTl9SRVNVTFRTLAorCVdMQU5fTE9HX1JFQVNPTl9RVUVVRV9GVUxMLAorCVdMQU5fTE9HX1JFQVNPTl9QT1dFUl9DT0xMQVBTRV9GQUlMLAorCVdMQU5fTE9HX1JFQVNPTl9TU1JfRkFJTCwKKwlXTEFOX0xPR19SRUFTT05fRElTQ09OTkVDVF9GQUlMLAorCVdMQU5fTE9HX1JFQVNPTl9DTEVBTl9VUF9GQUlMLAorCVdMQU5fTE9HX1JFQVNPTl9NQUxMT0NfRkFJTCwKKwlXTEFOX0xPR19SRUFTT05fVk9TX01TR19VTkRFUl9SVU4sCisJV0xBTl9MT0dfUkVBU09OX01TR19QT1NUX0ZBSUwsCit9OworCisvKioKKyAqIGVudW0gdXNlcnNwYWNlX2xvZ19sZXZlbCAtIExvZyBsZXZlbCBhdCB1c2Vyc3BhY2UKKyAqIEBMT0dfTEVWRUxfTk9fQ09MTEVDVElPTjogdmVyYm9zZV9sZXZlbCAwIGNvcnJlc3BvbmRzIHRvIG5vIGNvbGxlY3Rpb24KKyAqIEBMT0dfTEVWRUxfTk9STUFMX0NPTExFQ1Q6IHZlcmJvc2VfbGV2ZWwgMSBjb3JyZXNwb25kIHRvIG5vcm1hbCBsb2cgbGV2ZWwsCisgKiB3aXRoIG1pbmltYWwgdXNlciBpbXBhY3QuIHRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUKKyAqIEBMT0dfTEVWRUxfSVNTVUVfUkVQUk86IHZlcmJvc2VfbGV2ZWwgMiBhcmUgZW5hYmxlZCB3aGVuIHVzZXIgaXMgbGF6aWx5CisgKiB0cnlpbmcgdG8gcmVwcm9kdWNlIGEgcHJvYmxlbSwgd2lmaSBwZXJmb3JtYW5jZXMgYW5kIHBvd2VyIGNhbiBiZSBpbXBhY3RlZAorICogYnV0IGRldmljZSBzaG91bGQgbm90IG90aGVyd2lzZSBiZSBzaWduaWZpY2FudGx5IGltcGFjdGVkCisgKiBATE9HX0xFVkVMX0FDVElWRTogdmVyYm9zZV9sZXZlbCAzKyBhcmUgdXNlZCB3aGVuIHRyeWluZyB0bworICogYWN0aXZlbHkgZGVidWcgYSBwcm9ibGVtCisgKgorICogVmFyaW91cyBsb2cgbGV2ZWxzIGRlZmluZWQgaW4gdGhlIHVzZXJzcGFjZSBmb3IgbG9nZ2luZyBhcHBsaWNhdGlvbnMKKyAqLworZW51bSB1c2Vyc3BhY2VfbG9nX2xldmVsIHsKKwlMT0dfTEVWRUxfTk9fQ09MTEVDVElPTiwKKwlMT0dfTEVWRUxfTk9STUFMX0NPTExFQ1QsCisJTE9HX0xFVkVMX0lTU1VFX1JFUFJPLAorCUxPR19MRVZFTF9BQ1RJVkUsCit9OworCisvKioKKyAqIGVudW0gd2lmaV9kcml2ZXJfbG9nX2xldmVsIC0gTG9nIGxldmVsIGRlZmluZWQgaW4gdGhlIGRyaXZlciBmb3IgbG9nZ2luZworICogQFdMQU5fTE9HX0xFVkVMX09GRjogTm8gbG9nZ2luZworICogQFdMQU5fTE9HX0xFVkVMX05PUk1BTDogRGVmYXVsdCBsb2dnaW5nCisgKiBAV0xBTl9MT0dfTEVWRUxfUkVQUk86IE5vcm1hbCBkZWJ1ZyBsZXZlbAorICogQFdMQU5fTE9HX0xFVkVMX0FDVElWRTogQWN0aXZlIGRlYnVnIGxldmVsCisgKgorICogTG9nIGxldmVscyBkZWZpbmVkIGZvciBsb2dnaW5nIGJ5IHRoZSB3aWZpIGRyaXZlcgorICovCitlbnVtIHdpZmlfZHJpdmVyX2xvZ19sZXZlbCB7CisJV0xBTl9MT0dfTEVWRUxfT0ZGLAorCVdMQU5fTE9HX0xFVkVMX05PUk1BTCwKKwlXTEFOX0xPR19MRVZFTF9SRVBSTywKKwlXTEFOX0xPR19MRVZFTF9BQ1RJVkUsCit9OworCisvKioKKyAqIGVudW0gd2lmaV9sb2dnaW5nX3JpbmdfaWQgLSBSaW5nIGlkIG9mIGxvZ2dpbmcgZW50aXRpZXMKKyAqIEBSSU5HX0lEX1dBS0VMT0NLOiAgICAgICAgIFBvd2VyIGV2ZW50cyByaW5nIGlkCisgKiBAUklOR19JRF9DT05ORUNUSVZJVFk6ICAgICBDb25uZWN0aXZpdHkgZXZlbnQgcmluZyBpZAorICogQFJJTkdfSURfUEVSX1BBQ0tFVF9TVEFUUzogUGVyIHBhY2tldCBzdGF0aXN0aWMgcmluZyBpZAorICogQFJJTkRfSURfRFJJVkVSX0RFQlVHOiAgICAgRHJpdmVyIGRlYnVnIG1lc3NhZ2VzIHJpbmcgaWQKKyAqIEBSSU5HX0lEX0ZJUk1XQVJFX0RFQlVHOiAgIEZpcm13YXJlIGRlYnVnIG1lc3NhZ2VzIHJpbmcgaWQKKyAqCisgKiBUaGlzIGVudW0gaGFzIHRoZSByaW5nIGlkIHZhbHVlcyBvZiBsb2dnaW5nIHJpbmdzCisgKi8KK2VudW0gd2lmaV9sb2dnaW5nX3JpbmdfaWQgeworCVJJTkdfSURfV0FLRUxPQ0ssCisJUklOR19JRF9DT05ORUNUSVZJVFksCisJUklOR19JRF9QRVJfUEFDS0VUX1NUQVRTLAorCVJJTkRfSURfRFJJVkVSX0RFQlVHLAorCVJJTkdfSURfRklSTVdBUkVfREVCVUcsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBDaGFuZ2UgY2hhbm5lbCBnZW5lcmljIHNjaGVtZSAqLwordHlwZWRlZiB2b2lkICgqQ0hBTkdFX0NIQU5ORUxfQ0FMTEJBQ0spKHRwQW5pU2lyR2xvYmFsIHBNYWMsIENERl9TVEFUVVMgc3RhdHVzLAorCQkJCQl1aW50MzJfdCAqZGF0YSwKKwkJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8qIC8gTElNIGdsb2JhbCBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVNpckxpbUlic3MgeworCXZvaWQgKnBIZHI7CisJdm9pZCAqcEJlYWNvbjsKK30gdEFuaVNpckxpbUlic3M7CisKK3R5cGVkZWYgc3RydWN0IHNEaWFsb2d1ZVRva2VuIHsKKwkvKiBieXRlcyAwLTMgKi8KKwl1aW50MTZfdCBhc3NvY0lkOworCXVpbnQ4X3QgdG9rZW47CisJdWludDhfdCByc3ZkMTsKKwkvKiBCeXRlcyA0LTcgKi8KKwl1aW50MTZfdCB0aWQ7CisJdWludDhfdCByc3ZkMlsyXTsKKworCXN0cnVjdCBzRGlhbG9ndWVUb2tlbiAqbmV4dDsKK30gdERpYWxvZ3VlVG9rZW4sICp0cERpYWxvZ3VlVG9rZW47CisKK3R5cGVkZWYgc3RydWN0IHNMaW1UaW1lcnMgeworCS8qIFRJTUVSUyBJTiBMSU0gQVJFIE5PVCBTVVBQT1NFRCBUTyBCRSBaRVJPRUQgT1VUIERVUklORyBSRVNFVC4gKi8KKwkvKiBEVVJJTkcgbGltX2luaXRpYWxpemUgRE9OT1QgWkVSTyBUSEVNIE9VVC4gKi8KKworLyogU1RBIFNQRUNJRklDIFRJTUVSUyAqLworCisJVFhfVElNRVIgZ0xpbVByZUF1dGhDbG51cFRpbWVyOworCisJLyogQXNzb2NpYXRpb24gcmVsYXRlZCB0aW1lcnMgKi8KKwlUWF9USU1FUiBnTGltQXNzb2NGYWlsdXJlVGltZXI7CisJVFhfVElNRVIgZ0xpbVJlYXNzb2NGYWlsdXJlVGltZXI7CisKKwkvKiAvIFdhaXQgZm9yIFByb2JlIGFmdGVyIEhlYXJ0YmVhdCBmYWlsdXJlIHRpbWVyIG9uIFNUQSAqLworCVRYX1RJTUVSIGdMaW1Qcm9iZUFmdGVySEJUaW1lcjsKKworCS8qIEF1dGhlbnRpY2F0aW9uIHJlbGF0ZWQgdGltZXJzICovCisJVFhfVElNRVIgZ0xpbUF1dGhGYWlsdXJlVGltZXI7CisKKwkvKiBKb2luIEZhaWx1cmUgdGltZW91dCBvbiBTVEEgKi8KKwlUWF9USU1FUiBnTGltSm9pbkZhaWx1cmVUaW1lcjsKKworCVRYX1RJTUVSIGdMaW1QZXJpb2RpY1Byb2JlUmVxVGltZXI7CisKKwkvKiBDTkZfV0FJVCB0aW1lciAqLworCVRYX1RJTUVSICpncExpbUNuZldhaXRUaW1lcjsKKworCS8qIFNlbmQgRGlzYXNzb2NpYXRlIGZyYW1lIHRocmVzaG9sZCBwYXJhbWV0ZXJzICovCisJVFhfVElNRVIgZ0xpbVNlbmREaXNhc3NvY0ZyYW1lVGhyZXNob2xkVGltZXI7CisKKwlUWF9USU1FUiBnTGltQWRkdHNSc3BUaW1lcjsgICAgIC8qIG1heCB3YWl0IGZvciBhIHJlc3BvbnNlICovCisKKwkvKiBVcGRhdGUgT0xCQyBDYWNoZSBUaW1lciAqLworCVRYX1RJTUVSIGdMaW1VcGRhdGVPbGJjQ2FjaGVUaW1lcjsKKworCVRYX1RJTUVSIGdMaW1DaGFubmVsU3dpdGNoVGltZXI7CisJLyogVGhpcyBUSU1FUiBpcyBzdGFydGVkIG9uIHRoZSBTVEEsIGFzIGluZGljYXRlZCBieSB0aGUgKi8KKwkvKiBBUCBpbiBpdHMgUXVpZXQgQlNTIElFLCBmb3IgdGhlIHNwZWNpZmllZCBpbnRlcnZhbCAqLworCVRYX1RJTUVSIGdMaW1RdWlldFRpbWVyOworCS8qIFRoaXMgVElNRVIgaXMgc3RhcnRlZCBvbiB0aGUgQVAsIHByaW9yIHRvIHRoZSBBUCBnb2luZyAqLworCS8qIGludG8gTEVBUk4gbW9kZSAqLworCS8qIFRoaXMgVElNRVIgaXMgc3RhcnRlZCBvbiB0aGUgU1RBLCBmb3IgdGhlIHNwZWNpZmllZCAqLworCS8qIHF1aWV0IGR1cmF0aW9uICovCisJVFhfVElNRVIgZ0xpbVF1aWV0QnNzVGltZXI7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCVRYX1RJTUVSIGdMaW1GVFByZUF1dGhSc3BUaW1lcjsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCVRYX1RJTUVSIGdMaW1Fc2VUc21UaW1lcjsKKyNlbmRpZgorCVRYX1RJTUVSIGdMaW1SZW1haW5PbkNoYW5uZWxUaW1lcjsKKworCVRYX1RJTUVSIGdMaW1QZXJpb2RpY0pvaW5Qcm9iZVJlcVRpbWVyOworCVRYX1RJTUVSIGdMaW1EaXNhc3NvY0Fja1RpbWVyOworCVRYX1RJTUVSIGdMaW1EZWF1dGhBY2tUaW1lcjsKKwkvKiBUaGlzIHRpbWVyIGlzIHN0YXJ0ZWQgd2hlbiBzaW5nbGUgc2hvdCBOT0EgaW5zZXJ0IG1zZyBpcyBzZW50IHRvIEZXIGZvciBzY2FuIGluIFAyUCBHTyBtb2RlICovCisJVFhfVElNRVIgZ0xpbVAycFNpbmdsZVNob3ROb2FJbnNlcnRUaW1lcjsKKwkvKiBUaGlzIHRpbWVyIGlzIHVzZWQgdG8gY29udmVydCBhY3RpdmUgY2hhbm5lbCB0bworCSAqIHBhc3NpdmUgY2hhbm5lbCB3aGVuIHRoZXJlIGlzIG5vIGJlYWNvbgorCSAqIGZvciBhIHBlcmlvZCBvZiB0aW1lIG9uIGEgcGFydGljdWxhciBERlMgY2hhbm5lbAorCSAqLworCVRYX1RJTUVSIGdMaW1BY3RpdmVUb1Bhc3NpdmVDaGFubmVsVGltZXI7CisKKy8qICoqKioqKioqKioqKioqKioqKioqVElNRVIgU0VDVElPTiBFTkRTKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIEFMTCBUSEUgRklFTERTIEJFTE9XIFRISVMgQ0FOIEJFIFpFUk9FRCBPVVQgaW4gbGltX2luaXRpYWxpemUgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworfSB0TGltVGltZXJzOworCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCAqcE1sbURpc2Fzc29jUmVxOworCXZvaWQgKnBNbG1EZWF1dGhSZXE7Cit9IHRMaW1EaXNhc3NvY0RlYXV0aENuZlJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVNpckxpbSB7CisJLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBUSU1FUiBSRUxBVEVEIFNUQVJUIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworCXRMaW1UaW1lcnMgbGltVGltZXJzOworCS8qIC8gRmxhZyB0byB0cmFjayBpZiBMSU0gdGltZXJzIGFyZSBjcmVhdGVkIG9yIG5vdCAqLworCXVpbnQzMl90IGdMaW1UaW1lcnNDcmVhdGVkOworCisJLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBUSU1FUiBSRUxBVEVEIEVORCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKwkvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgIFNDQU4vTEVBUk4gUkVMQVRFRCBTVEFSVCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisJLyoqCisJICogVGhpcyBmbGFnIHdoZW4gc2V0LCB3aWxsIHVzZSBzY2FuIG1vZGUgaW5zdGVhZCBvZgorCSAqIExlYXJuIG1vZGUgb24gQlAvQVAuIEJ5IGRlZmF1bHQgdGhpcyBmbGFnIGlzIHNldAorCSAqIHRvIHRydWUgdW50aWwgSElGIGdldHRpbmcgc3R1Y2sgaW4gMHg4MDAgc3RhdGUgaXMKKwkgKiBkZWJ1Z2dlZC4KKwkgKi8KKwl1aW50MzJfdCBnTGltVXNlU2Nhbk1vZGVGb3JMZWFybk1vZGU7CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbW9kdWxlcyBvdGhlciB0aGFuIExJTQorCSAqIHRvIHNlZSBpZiBzeXN0ZW0gaXMgaW4gc2Nhbi9sZWFybiBtb2RlIG9yIG5vdAorCSAqLworCXVpbnQzMl90IGdMaW1TeXN0ZW1JblNjYW5MZWFybk1vZGU7CisKKwkvKiBTY2FuIHJlbGF0ZWQgZ2xvYmFscyBvbiBTVEEgKi8KKwl1aW50OF90IGdMaW1SZXR1cm5BZnRlckZpcnN0TWF0Y2g7CisJdWludDhfdCBnTGltMjRCYW5kMTFkU2NhbkRvbmU7CisJdWludDhfdCBnTGltNTBCYW5kMTFkU2NhbkRvbmU7CisJdWludDhfdCBnTGltUmV0dXJuVW5pcXVlUmVzdWx0czsKKworCS8qIC8gUGxhY2UgaG9sZGVyIGZvciBjdXJyZW50IGNoYW5uZWwgSUQgKi8KKwkvKiAvIGJlaW5nIHNjYW5uZWQgKi8KKwl1aW50MzJfdCBnTGltQ3VycmVudFNjYW5DaGFubmVsSWQ7CisKKwkvKiBIb2xkIG9udG8gU0NBTiBjcml0ZXJpYSAqLworCS8qIFRoZSBiZWxvdyBpcyB1c2VkIGluIFAyUCBHTyBjYXNlIHdoZW4gd2UgbmVlZCB0byBkZWZlciBwcm9jZXNzaW5nIFNNRSBSZXEKKwkgKiB0byBMSU0gYW5kIGluc2VydCBOT0EgZmlyc3QgYW5kIHByb2Nlc3MgU01FIHJlcSBvbmNlIFNOT0EgaXMgc3RhcnRlZAorCSAqLworCXVpbnQxNl90IGdEZWZlck1zZ1R5cGVGb3JOT0E7CisJdWludDMyX3QgKmdwRGVmZFNtZU1zZ0Zvck5PQTsKKworCXRMaW1NbG1TY2FuUmVxICpncExpbU1sbVNjYW5SZXE7CisKKworCS8qIFVzZWQgdG8gc3RvcmUgdGhlIGxpc3Qgb2YgbGVnYWN5IGJzcyBzdGEgZGV0ZWN0ZWQgZHVyaW5nIHNjYW4gb24gb25lIGNoYW5uZWwgKi8KKwl1aW50MTZfdCBnTGltUmVzdG9yZUNCTnVtU2NhbkludGVydmFsOworCXVpbnQxNl90IGdMaW1SZXN0b3JlQ0JDb3VudDsKKwl0U2lyTWFjQWRkciBnTGltTGVnYWN5QnNzaWRMaXN0W01BWF9OVU1fTEVHQUNZX0JTU0lEX1BFUl9DSEFOTkVMXTsKKworCS8qIGFib3J0IHNjYW4gaXMgdXNlZCB0byBhYm9ydCBhbiBvbi1nb2luZyBzY2FuICovCisJdWludDhfdCBhYm9ydFNjYW47CisJdExpbVNjYW5DaG5JbmZvIHNjYW5DaG5JbmZvOworCisJLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBTQ0FOL0xFQVJOIFJFTEFURUQgU1RBUlQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCXRTaXJNYWNBZGRyIGdTZWxmTWFjQWRkcjsgICAgICAgLyogYWRkZWQgZm9yIEJULUFNUCBTdXBwb3J0ICovCisKKwkvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBCU1MgUkVMQVRFRCBFTkQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCS8qIFBsYWNlIGhvbGRlciBmb3IgU3RhcnRCc3NSZXEgbWVzc2FnZSAqLworCS8qIHJlY2VpdmVkIGJ5IFNNRSBzdGF0ZSBtYWNoaW5lICovCisKKwl1aW50OF90IGdMaW1DdXJyZW50QnNzVWFwc2Q7CisKKwkvKiBUaGlzIGlzIHVzZWQgZm9yIHRlc3Rpbmcgc3RhIGxlZ2FjeSBic3MgZGV0ZWN0IGZlYXR1cmUgKi8KKwl1aW50OF90IGdMaW1Gb3JjZU5vUHJvcElFOworCisJLyogKi8KKwkvKiBTdG9yZSB0aGUgQlNTIEluZGV4IHJldHVybmVkIGJ5IEhBTCBkdXJpbmcgKi8KKwkvKiBXTUFfQUREX0JTU19SU1AgaGVyZS4gKi8KKwkvKiAqLworCisJLyogRm9yIG5vdzogKi8KKwkvKiBUaGlzIHdpbGwgYmUgdXNlZCBkdXJpbmcgV01BX1NFVF9CU1NLRVlfUkVRIGluICovCisJLyogb3JkZXIgdG8gc2V0IHRoZSBHVEsgKi8KKwkvKiBMYXRlcjogKi8KKwkvKiBUaGVyZSBjb3VsZCBiZSBvdGhlciBpbnRlcmZhY2VzIG5lZWRpbmcgdGhpcyBpbmZvICovCisJLyogKi8KKworCS8qICovCisJLyogRHVlIHRvIHRoZSBhc3luY2hyb25vdXMgbmF0dXJlIG9mIHRoZSBpbnRlcmZhY2UgKi8KKwkvKiBiZXR3ZWVuIFBFIDwtPiBIQUwsIHNvbWUgdHJhbnNpZW50IGluZm9ybWF0aW9uICovCisJLyogbGlrZSB0aGlzIG5lZWRzIHRvIGJlIGNhY2hlZC4gKi8KKwkvKiBUaGlzIGlzIGNhY2hlZCB1cG9uIHJlY2VpcHQgb2YgZVdOSV9TTUVfU0VUQ09OVEVYVF9SRVEuICovCisJLyogVGhpcyBpcyByZWxlYXNlZCB3aGlsZSBwb3N0aW5nIExJTV9NTE1fU0VUS0VZU19DTkYgKi8KKwkvKiAqLworCXZvaWQgKmdwTGltTWxtU2V0S2V5c1JlcTsKKworCS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgIEJTUyBSRUxBVEVEIEVORCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKwkvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBJQlNTIFJFTEFURUQgU1RBUlQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCS8qIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBTVEEgY29hbGVzY2VkIGFuZCBhZGFwdGVyIHRvIHBlZXIncyBjYXBhYmlsaXRpZXMgb3Igbm90LiAqLworCXVpbnQ4X3QgZ0xpbUlic3NDb2FsZXNjaW5nSGFwcGVuZWQ7CisKKwkvKiAvIERlZmluaXRpb24gZm9yIHN0b3JpbmcgSUJTUyBwZWVycyBCU1MgZGVzY3JpcHRpb24gKi8KKwl0TGltSWJzc1BlZXJOb2RlICpnTGltSWJzc1BlZXJMaXN0OworCXVpbnQzMl90IGdMaW1OdW1JYnNzUGVlcnM7CisJdWludDMyX3QgaWJzc19yZXRyeV9jbnQ7CisKKwkvKiBpYnNzIGluZm8gLSBwYXJhbXMgZm9yIHdoaWNoIGlic3MgdG8gam9pbiB3aGlsZSBjb2FsZXNjaW5nICovCisJdEFuaVNpckxpbUlic3MgaWJzc0luZm87CisKKwkvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBJQlNTIFJFTEFURUQgRU5EIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworCS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgIFNUQVRTL0NPVU5URVIgUkVMQVRFRCBTVEFSVCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKwl1aW50MTZfdCBtYXhTdGF0aW9uOworCXVpbnQxNl90IG1heEJzc0lkOworCisJdWludDMyX3QgZ0xpbU51bUJlYWNvbnNSY3ZkOworCXVpbnQzMl90IGdMaW1OdW1CZWFjb25zSWdub3JlZDsKKworCXVpbnQzMl90IGdMaW1OdW1EZWZlcnJlZE1zZ3M7CisKKwkvKiAvIFZhcmlhYmxlIHRvIGtlZXAgdHJhY2sgb2YgbnVtYmVyIG9mIGN1cnJlbnRseSBhc3NvY2lhdGVkIFNUQXMgKi8KKwl1aW50MTZfdCBnTGltTnVtT2ZBbmlTVEFzOyAgICAgIC8qIGNvdW50IG9mIEFOSSBwZWVycyAqLworCXVpbnQxNl90IGdMaW1Bc3NvY1N0YUxpbWl0OworCisJLyogSGVhcnQtQmVhdCBpbnRlcnZhbCB2YWx1ZSAqLworCXVpbnQzMl90IGdMaW1IZWFydEJlYXRDb3VudDsKKwl0U2lyTWFjQWRkciBnTGltSGVhcnRCZWF0QXBNYWNbMl07CisJdWludDhfdCBnTGltSGVhcnRCZWF0QXBNYWNJbmRleDsKKworCS8qIFN0YXRpc3RpY3MgdG8ga2VlcCB0cmFjayBvZiBuby4gYmVhY29ucyByY3ZkIGluIGhlYXJ0IGJlYXQgaW50ZXJ2YWwgKi8KKwl1aW50MTZfdAorCQlnTGltSGVhcnRCZWF0QmVhY29uU3RhdHNbTUFYX05PX0JFQUNPTlNfUEVSX0hFQVJUX0JFQVRfSU5URVJWQUxdOworCisjaWZkZWYgV0xBTl9ERUJVRworCS8qIERlYnVnIGNvdW50ZXJzICovCisJdWludDMyX3QgbnVtVG90LCBudW1CYnQsIG51bVByb3RFcnIsIG51bUxlYXJuLCBudW1MZWFybklnbm9yZTsKKwl1aW50MzJfdCBudW1TbWUsIG51bU1BQ1s0XVsxNl07CisKKwkvKiBEZWJ1ZyBjb3VudGVyIHRvIHRyYWNrIG51bWJlciBvZiBBc3NvYyBSZXEgZnJhbWUgZHJvcHMgKi8KKwkvKiB3aGVuIHJlY2VpdmVkIGluIHBTdGFEcy0+bWxtU3RhdGUgb3RoZXIgdGhhbiBMSU5LX0VTVEFCTElTRUQgKi8KKwl1aW50MzJfdCBnTGltTnVtQXNzb2NSZXFEcm9wSW52bGRTdGF0ZTsKKwkvKiBjb3VudGVycyB0byB0cmFjayByZWplY3Rpb24gb2YgQXNzb2MgUmVxIGR1ZSB0byBBZG1pc3Npb24gQ29udHJvbCAqLworCXVpbnQzMl90IGdMaW1OdW1Bc3NvY1JlcURyb3BBQ1JlamVjdFRTOworCXVpbnQzMl90IGdMaW1OdW1Bc3NvY1JlcURyb3BBQ1JlamVjdFN0YTsKKwkvKiBEZWJ1ZyBjb3VudGVyIHRvIHRyYWNrIG51bWJlciBvZiBSZWFzc29jIFJlcSBmcmFtZSBkcm9wcyAqLworCS8qIHdoZW4gcmVjZWl2ZWQgaW4gcFN0YURzLT5tbG1TdGF0ZSBvdGhlciB0aGFuIExJTktfRVNUQUJMSVNFRCAqLworCXVpbnQzMl90IGdMaW1OdW1SZWFzc29jUmVxRHJvcEludmxkU3RhdGU7CisJLyogRGVidWcgY291bnRlciB0byB0cmFjayBudW1iZXIgb2YgSGFzaCBNaXNzIGV2ZW50IHRoYXQgKi8KKwkvKiB3aWxsIG5vdCBjYXVzZSBhIHNlbmRpbmcgb2YgZGUtYXV0aC9kZS1hc3NvY2lhdGUgZnJhbWUgKi8KKwl1aW50MzJfdCBnTGltTnVtSGFzaE1pc3NJZ25vcmVkOworCisJLyogRGVidWcgY291bnRlciB0byB0cmFjayBudW1iZXIgb2YgQmVhY29uIGZyYW1lcyAqLworCS8qIHJlY2VpdmVkIGluIHVuZXhwZWN0ZWQgc3RhdGUgKi8KKwl1aW50MzJfdCBnTGltVW5leHBCY25DbnQ7CisKKwkvKiBEZWJ1ZyBjb3VudGVyIHRvIHRyYWNrIG51bWJlciBvZiBCZWFjb24gZnJhbWVzICovCisJLyogcmVjZWl2ZWQgaW4gd3Qtam9pbi1zdGF0ZSB0aGF0IGRvIGhhdmUgU1NJRCBtaXNtYXRjaCAqLworCXVpbnQzMl90IGdMaW1CY25TU0lETWlzbWF0Y2hDbnQ7CisKKwkvKiBEZWJ1ZyBjb3VudGVyIHRvIHRyYWNrIG51bWJlciBvZiBMaW5rIGVzdGFibGlzaG1lbnRzIG9uIFNUQS9CUCAqLworCXVpbnQzMl90IGdMaW1OdW1MaW5rRXN0czsKKworCS8qIERlYnVnIGNvdW50ZXIgdG8gdHJhY2sgbnVtYmVyIG9mIFJ4IGNsZWFudXAgKi8KKwl1aW50MzJfdCBnTGltTnVtUnhDbGVhbnVwOworCisJLyogRGVidWcgY291bnRlciB0byB0cmFjayBkaWZmZXJlbnQgcGFyc2UgcHJvYmxlbSAqLworCXVpbnQzMl90IGdMaW0xMWJTdGFBc3NvY1JlamVjdENvdW50OworCisjZW5kaWYKKworCS8qIFRpbWUgc3RhbXAgb2YgdGhlIGxhc3QgYmVhY29uIHJlY2VpdmVkIGZyb20gdGhlIEJTUyB0byB3aGljaCBTVEEgaXMgY29ubmVjdGVkLiAqLworCXVpbnQ2NF90IGdMYXN0QmVhY29uVGltZVN0YW1wOworCS8qIFJYIEJlYWNvbiBjb3VudCBmb3IgdGhlIGN1cnJlbnQgQlNTIHRvIHdoaWNoIFNUQSBpcyBjb25uZWN0ZWQuICovCisJdWludDMyX3QgZ0N1cnJlbnRCc3NCZWFjb25DbnQ7CisJdWludDhfdCBnTGFzdEJlYWNvbkR0aW1Db3VudDsKKwl1aW50OF90IGdMYXN0QmVhY29uRHRpbVBlcmlvZDsKKworCS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgIFNUQVRTL0NPVU5URVIgUkVMQVRFRCBFTkQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisJLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgU1RBVEVTIFJFTEFURUQgU1RBUlQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCS8qIENvdW50cyBIZWFydGJlYXQgZmFpbHVyZXMgKi8KKwl1aW50OF90IGdMaW1IQmZhaWx1cmVDbnRJbkxpbmtFc3RTdGF0ZTsKKwl1aW50OF90IGdMaW1Qcm9iZUZhaWx1cmVBZnRlckhCZmFpbGVkQ250OworCXVpbnQ4X3QgZ0xpbUhCZmFpbHVyZUNudEluT3RoZXJTdGF0ZXM7CisKKwkvKioKKwkgKiBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB3aGV0aGVyIExJTSBtb2R1bGUgbmVlZCB0bworCSAqIHNlbmQgcmVzcG9uc2UgdG8gaG9zdC4gVXNlZCB0byBpZGVudGlmeSB3aGV0aGVyIGEgcmVxdWVzdAorCSAqIGlzIGdlbmVyYXRlZCBpbnRlcm5hbGx5IHdpdGhpbiBMSU0gbW9kdWxlIG9yIGJ5IGhvc3QKKwkgKi8KKwl1aW50OF90IGdMaW1Sc3BSZXFkOworCisJLyogLyBQcmV2aW91cyBTTUUgU3RhdGUgKi8KKwl0TGltU21lU3RhdGVzIGdMaW1QcmV2U21lU3RhdGU7CisKKwkvKiAvIE1MTSBTdGF0ZSB2aXNpYmxlIGFjcm9zcyBhbGwgU2lyaXVzIG1vZHVsZXMgKi8KKwl0TGltTWxtU3RhdGVzIGdMaW1NbG1TdGF0ZTsKKworCS8qIC8gUHJldmlvdXMgTUxNIFN0YXRlICovCisJdExpbU1sbVN0YXRlcyBnTGltUHJldk1sbVN0YXRlOworCisJLyogTElNIHRvIEhBTCBTQ0FOIE1hbmFnZW1lbnQgTWVzc2FnZSBJbnRlcmZhY2Ugc3RhdGVzICovCisJdExpbUxpbUhhbFNjYW5TdGF0ZSBnTGltSGFsU2NhblN0YXRlOworLyogV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZCAqLworCVNVU1BFTkRfUkVTVU1FX0xJTktfQ0FMTEJBQ0sgZ3BMaW1TdXNwZW5kQ2FsbGJhY2s7CisJdWludDMyX3QgKmdwTGltU3VzcGVuZERhdGE7CisJU1VTUEVORF9SRVNVTUVfTElOS19DQUxMQkFDSyBncExpbVJlc3VtZUNhbGxiYWNrOworCXVpbnQzMl90ICpncExpbVJlc3VtZURhdGE7CisvKiBlbmQgV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZCAqLworCS8qIENhbiBiZSBzZXQgdG8gaW52YWxpZCBjaGFubmVsLiBJZiBpdCBpcyBpbnZhbGlkLCBIQUwgKi8KKwkvKiBzaG91bGQgbW92ZSB0byBwcmV2aW91cyB2YWxpZCBjaGFubmVsIG9yIHN0YXkgaW4gdGhlICovCisJLyogY3VycmVudCBjaGFubmVsLiBDQiBzdGF0ZSBnb2VzIGFsb25nIHdpdGggY2hhbm5lbCB0byByZXN1bWUgdG8gKi8KKwl1aW50MTZfdCBnUmVzdW1lQ2hhbm5lbDsKKwllUGh5Q2hhbkJvbmRTdGF0ZSBnUmVzdW1lUGh5Q2JTdGF0ZTsKKworCS8qIENoYW5nZSBjaGFubmVsIGdlbmVyaWMgc2NoZW1lICovCisJQ0hBTkdFX0NIQU5ORUxfQ0FMTEJBQ0sgZ3BjaGFuZ2VDaGFubmVsQ2FsbGJhY2s7CisJdWludDMyX3QgKmdwY2hhbmdlQ2hhbm5lbERhdGE7CisKKwkvKiAvIFNNRSBTdGF0ZSB2aXNpYmxlIGFjcm9zcyBhbGwgU2lyaXVzIG1vZHVsZXMgKi8KKwl0TGltU21lU3RhdGVzIGdMaW1TbWVTdGF0ZTsKKwkvKiAvIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgd2UncmUgYW4gQVAsIFNUQSBpbiBCU1MvSUJTUyAqLworCXRMaW1TeXN0ZW1Sb2xlIGdMaW1TeXN0ZW1Sb2xlOworCisJLyogTnVtYmVyIG9mIFNUQXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBzaG9ydCBwcmVhbWJsZSAqLworCXRMaW1Ob1Nob3J0UGFyYW1zIGdMaW1Ob1Nob3J0UGFyYW1zOworCisJLyogTnVtYmVyIG9mIFNUQXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBzaG9ydCBzbG90IHRpbWUgKi8KKwl0TGltTm9TaG9ydFNsb3RQYXJhbXMgZ0xpbU5vU2hvcnRTbG90UGFyYW1zOworCisJLyogT0xCQyBwYXJhbWV0ZXJzICovCisJdExpbVByb3RTdGFQYXJhbXMgZ0xpbU92ZXJsYXAxMWdQYXJhbXM7CisKKwl0TGltUHJvdFN0YVBhcmFtcyBnTGltT3ZlcmxhcDExYVBhcmFtczsKKwl0TGltUHJvdFN0YVBhcmFtcyBnTGltT3ZlcmxhcEh0MjBQYXJhbXM7CisJdExpbVByb3RTdGFQYXJhbXMgZ0xpbU92ZXJsYXBOb25HZlBhcmFtczsKKworCS8qICovCisJLyogLS0tLS0tLS0tLS0tLS0tLSBEUEggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiB0aGVzZSB1c2VkIHRvIGxpdmUgaW4gRFBIIGJ1dCBhcmUgbm93IG1vdmVkIGhlcmUgKHdoZXJlIHRoZXkgYmVsb25nKSAqLworCXVpbnQzMl90IGdMaW1QaHlNb2RlOworCXVpbnQzMl90IHByb3BSYXRlQWRqdXN0UGVyaW9kOworCXVpbnQzMl90IHNjYW5TdGFydFRpbWU7IC8qIHVzZWQgdG8gbWVhc3VyZSBzY2FuIHRpbWUgKi8KKworCXVpbnQ4X3QgZ0xpbU15TWFjQWRkcls2XTsKKwl1aW50OF90IGFja1BvbGljeTsKKworCXVpbnQ4X3QgZ0xpbVFvc0VuYWJsZWQ6MTsgICAgICAgLyogMTFFICovCisJdWludDhfdCBnTGltV21lRW5hYmxlZDoxOyAgICAgICAvKiBXTUUgKi8KKwl1aW50OF90IGdMaW1Xc21FbmFibGVkOjE7ICAgICAgIC8qIFdTTSAqLworCXVpbnQ4X3QgZ0xpbUhjZkVuYWJsZWQ6MTsKKwl1aW50OF90IGdMaW0xMWRFbmFibGVkOjE7CisJdWludDhfdCBnTGltUHJvYmVSZXNwRGlzYWJsZUZsYWc6MTsgICAgLyogY29udHJvbCBvdmVyIHByb2JlIHJlc3BvbnNlICovCisJLyogLS0tLS0tLS0tLS0tLS0tLSBEUEggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgIFNUQVRFUyBSRUxBVEVEIEVORCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKwkvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBNSVNDIFJFTEFURUQgU1RBUlQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisJLyogRGVmZXJyZWQgUXVldWUgUGFyYW1ldGVycyAqLworCXRMaW1EZWZlcnJlZE1zZ1FQYXJhbXMgZ0xpbURlZmVycmVkTXNnUTsKKworCS8qIGFkZHRzIHJlcXVlc3QgaWYgYW55IC0gb25seSBvbmUgY2FuIGJlIG91dHN0YW5kaW5nIGF0IGFueSB0aW1lICovCisJdFNpckFkZHRzUmVxIGdMaW1BZGR0c1JlcTsKKwl1aW50OF90IGdMaW1BZGR0c1NlbnQ7CisJdWludDhfdCBnTGltQWRkdHNSc3BUaW1lckNvdW50OworCisJLyogcHJvdGVjdGlvbiByZWxhdGVkIGNvbmZpZyBjYWNoZSAqLworCXRDZmdQcm90ZWN0aW9uIGNmZ1Byb3RlY3Rpb247CisKKwl1aW50OF90IGdMaW1Qcm90ZWN0aW9uQ29udHJvbDsKKwkvKiBUaGlzIGZsYWcgd2lsbCByZW1haW4gdG8gYmUgc2V0IGV4Y2VwdCB3aGlsZSBMSU0gaXMgd2FpdGluZyBmb3Igc3BlY2lmaWMgcmVzcG9uc2UgbWVzc2FnZXMgKi8KKwkvKiBmcm9tIEhBTC4gZS5nIHdoZW4gTElNIGlzc3VlcyBBRERfU1RBIHJlcSBpdCB3aWxsIGNsZWFyIHRoaXMgZmxhZyBhbmQgd2hlbiBpdCB3aWxsIHJlY2VpdmUgKi8KKwkvKiB0aGUgcmVzcG9uc2UgdGhlIGZsYWcgd2lsbCBiZSBzZXQuICovCisJdWludDhfdCBnTGltUHJvY2Vzc0RlZmRNc2dzOworCisJLyogVUFQU0QgZmxhZyB1c2VkIG9uIEFQICovCisJdWludDhfdCBnVWFwc2RFbmFibGU7CisKKwkvKiBVc2VkIG9uIFNUQSwgdGhpcyBpcyBhIHN0YXRpYyBVQVBTRCBtYXNrIHNldHRpbmcKKwkgKiBkZXJpdmVkICBmcm9tIFNNRV9KT0lOX1JFUSBhbmQgU01FX1JFQVNTT0NfUkVRLiBJZiBhCisJICogcGFydGljdWxhciBBQyBiaXQgaXMgc2V0LCBpdCBtZWFucyB0aGUgQUMgaXMgYm90aAorCSAqIHRyaWdnZXIgZW5hYmxlZCBhbmQgZGVsaXZlcnkgZW5hYmxlZC4KKwkgKi8KKwl1aW50OF90IGdVYXBzZFBlckFjQml0bWFzazsKKworCS8qIFVzZWQgb24gU1RBIGZvciBBQyBkb3duZ3JhZGUuIFRoaXMgaXMgYSBkeW5hbWljIG1hc2sKKwkgKiBzZXR0aW5nIHdoaWNoIGtlZXAgdHJhY2tzIG9mIEFDcyBiZWluZyBhZG1pdHRlZC4KKwkgKiBJZiBiaXQgaXMgc2V0IHRvIDA6IFRoYXQgcGFydGl1bGFyIEFDIGlzIG5vdCBhZG1pdHRlZAorCSAqIElmIGJpdCBpcyBzZXQgdG8gMTogVGhhdCBwYXJ0aWN1bGFyIEFDIGlzIGFkbWl0dGVkCisJICovCisJdWludDhfdCBnQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fRElSRUNUXTsKKworCS8qIGRpYWxvZ3VlIHRva2VuIExpc3QgaGVhZC90YWlsIGZvciBBY3Rpb24gZnJhbWVzIHJlcXVlc3Qgc2VudC4gKi8KKwl0cERpYWxvZ3VlVG9rZW4gcERpYWxvZ3VlVG9rZW5IZWFkOworCXRwRGlhbG9ndWVUb2tlbiBwRGlhbG9ndWVUb2tlblRhaWw7CisKKwl0TGltVHNwZWNJbmZvIHRzcGVjSW5mb1tMSU1fTlVNX1RTUEVDX01BWF07CisKKwkvKiBhZG1pc3Npb24gY29udHJvbCBwb2xpY3kgaW5mb3JtYXRpb24gKi8KKwl0TGltQWRtaXRQb2xpY3lJbmZvIGFkbWl0UG9saWN5SW5mbzsKKwljZGZfbXV0ZXhfdCBsa1BlR2xvYmFsTG9jazsKKwl1aW50OF90IGRpc2FibGVMRFBDV2l0aFR4YmZBUDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXVpbnQ4X3QgZ0xpbVRETFNCdWZTdGFFbmFibGVkOworCXVpbnQ4X3QgZ0xpbVRETFNVYXBzZE1hc2s7CisJdWludDhfdCBnTGltVERMU09mZkNoYW5uZWxFbmFibGVkOworCXVpbnQ4X3QgZ0xpbVRETFNXbW1Nb2RlOworI2VuZGlmCisJLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgTUlTQyBSRUxBVEVEIEVORCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKwkvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBBU1NPQyBSRUxBVEVEIFNUQVJUIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKwkvKiBQbGFjZSBob2xkZXIgZm9yIEpvaW5SZXEgbWVzc2FnZSAqLworCS8qIHJlY2VpdmVkIGJ5IFNNRSBzdGF0ZSBtYWNoaW5lICovCisJLyogdHBTaXJTbWVKb2luUmVxICAgICAgIGdwTGltSm9pblJlcTsgKi8KKworCS8qIFBsYWNlIGhvbGRlciBmb3IgUmVhc3NvY1JlcSBtZXNzYWdlICovCisJLyogcmVjZWl2ZWQgYnkgU01FIHN0YXRlIG1hY2hpbmUgKi8KKwkvKiB0cFNpclNtZVJlYXNzb2NSZXEgICAgZ3BMaW1SZWFzc29jUmVxOyAgc2VwMjMgcmV2aWV3ICovCisKKwkvKiBDdXJyZW50IEF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCBhdCBTVEEgKi8KKwkvKiB0QW5pQXV0aFR5cGUgICAgICAgIGdMaW1DdXJyZW50QXV0aFR5cGU7ICovCisKKwkvKiBQbGFjZSBob2xkZXIgZm9yIGN1cnJlbnQgYXV0aGVudGljYXRpb24gcmVxdWVzdCAqLworCS8qIGJlaW5nIGhhbmRsZWQgKi8KKwl0TGltTWxtQXV0aFJlcSAqZ3BMaW1NbG1BdXRoUmVxOworCisJLyogUmVhc29uIGNvZGUgdG8gZGV0ZXJtaW5lIHRoZSBjaGFubmVsIGNoYW5nZSBjb250ZXh0IHdoaWxlIHNlbmRpbmcgKi8KKwkvKiBXTUFfQ0hOTF9TV0lUQ0hfUkVRIG1lc3NhZ2UgdG8gSEFMICovCisJdWludDMyX3QgY2hhbm5lbENoYW5nZVJlYXNvbkNvZGU7CisKKwkvKiAvIE1BQyBsZXZlbCBQcmUtYXV0aGVudGljYXRpb24gcmVsYXRlZCBnbG9iYWxzICovCisJdFNpck1hY0NoYW5OdW0gZ0xpbVByZUF1dGhDaGFubmVsTnVtYmVyOworCXRBbmlBdXRoVHlwZSBnTGltUHJlQXV0aFR5cGU7CisJdFNpck1hY0FkZHIgZ0xpbVByZUF1dGhQZWVyQWRkcjsKKwl1aW50MzJfdCBnTGltTnVtUHJlQXV0aENvbnRleHRzOworCXRMaW1QcmVBdXRoVGFibGUgZ0xpbVByZUF1dGhUaW1lclRhYmxlOworCisJLyogUGxhY2VkIGhvbGRlciB0byBkZWF1dGggcmVhc29uICovCisJdWludDE2X3QgZ0xpbURlYXV0aFJlYXNvbkNvZGU7CisKKwkvKiBQbGFjZSBob2xkZXIgZm9yIFByZS1hdXRoZW50aWNhdGlvbiBub2RlIGxpc3QgKi8KKwlzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICpwTGltUHJlQXV0aExpc3Q7CisKKwkvKiBTZW5kIERpc2Fzc29jaWF0ZSBmcmFtZSB0aHJlc2hvbGQgcGFyYW1ldGVycyAqLworCXVpbnQxNl90IGdMaW1EaXNhc3NvY0ZyYW1lVGhyZXNob2xkOworCXVpbnQxNl90IGdMaW1EaXNhc3NvY0ZyYW1lQ3JlZGl0OworCisJLyogQXNzb2Mgb3IgUmVBc3NvYyBSZXNwb25zZSBEYXRhL0ZyYW1lICovCisJdm9pZCAqZ0xpbUFzc29jUmVzcG9uc2VEYXRhOworCisJLyogT25lIGNhY2hlIGZvciBlYWNoIG92ZXJsYXAgYW5kIGFzc29jaWF0ZWQgY2FzZS4gKi8KKwl0Q2FjaGVQYXJhbXMgcHJvdFN0YU92ZXJsYXBDYWNoZVtMSU1fUFJPVF9TVEFfT1ZFUkxBUF9DQUNIRV9TSVpFXTsKKwl0Q2FjaGVQYXJhbXMgcHJvdFN0YUNhY2hlW0xJTV9QUk9UX1NUQV9DQUNIRV9TSVpFXTsKKworCS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgIEFTU09DIFJFTEFURUQgRU5EIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworCS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgSFQgUkVMQVRFRCAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisJLyogKi8KKwkvKiBUaGUgZm9sbG93aW5nIGdsb2JhbCBMSU0gdmFyaWFibGVzIG1haW50YWluL21hbmFnZSAqLworCS8qIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb25zIHJlbGF0ZWQgdG8gODAyLjExbiAqLworCisJLyogODAyLjExbiBTdGF0aW9uIGRldGVjdGVkIEhUIGNhcGFiaWxpdHkgaW4gQmVhY29uIEZyYW1lICovCisJdWludDhfdCBodENhcGFiaWxpdHlQcmVzZW50SW5CZWFjb247CisKKwkvKiA4MDIuMTEgSFQgY2FwYWJpbGl0eTogRW5hYmxlZCBvciBEaXNhYmxlZCAqLworCXVpbnQ4X3QgaHRDYXBhYmlsaXR5OworCisJdWludDhfdCBnSFRHcmVlbmZpZWxkOworCisJdWludDhfdCBnSFRTaG9ydEdJNDBNaHo7CisJdWludDhfdCBnSFRTaG9ydEdJMjBNaHo7CisKKwkvKiBTZXQgdG8gMCBmb3IgMzgzOSBvY3RldHMgKi8KKwkvKiBTZXQgdG8gMSBmb3IgNzkzNSBvY3RldHMgKi8KKwl1aW50OF90IGdIVE1heEFtc2R1TGVuZ3RoOworCisJLyogRFNTUy9DQ0sgYXQgNDAgTUh6OiBFbmFibGVkIDEgb3IgRGlzYWJsZWQgKi8KKwl1aW50OF90IGdIVERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0OworCisJLyogUFNNUCBTdXBwb3J0OiBFbmFibGVkIDEgb3IgRGlzYWJsZWQgMCAqLworCXVpbnQ4X3QgZ0hUUFNNUFN1cHBvcnQ7CisKKwkvKiBMLVNJRyBUWE9QIFByb3RlY3Rpb24gdXNlZCBvbmx5IGlmIHBlZXIgc3VwcG9ydCBhdmFpbGFibGUgKi8KKwl1aW50OF90IGdIVExzaWdUWE9QUHJvdGVjdGlvbjsKKworCS8qIE1JTU8gUG93ZXIgU2F2ZSAqLworCXRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSBnSFRNSU1PUFNTdGF0ZTsKKworCS8qIFNjYW4gSW4gUG93ZXIgU2F2ZSAqLworCXVpbnQ4X3QgZ1NjYW5JblBvd2Vyc2F2ZTsKKworCS8qICovCisJLyogQS1NUERVIERlbnNpdHkgKi8KKwkvKiAwMDAgLSBObyByZXN0cmljdGlvbiAqLworCS8qIDAwMSAtIDEvOCB1c2VjICovCisJLyogMDEwIC0gMS80IHVzZWMgKi8KKwkvKiAwMTEgLSAxLzIgdXNlYyAqLworCS8qIDEwMCAtIDEgdXNlYyAqLworCS8qIDEwMSAtIDIgdXNlYyAqLworCS8qIDExMCAtIDQgdXNlYyAqLworCS8qIDExMSAtIDggdXNlYyAqLworCS8qICovCisJdWludDhfdCBnSFRBTXBkdURlbnNpdHk7CisKKwlib29sIGdNYXhBbXNkdVNpemVFbmFibGVkOworCS8qIE1heGltdW0gVHgvUnggQS1NUERVIGZhY3RvciAqLworCXVpbnQ4X3QgZ0hUTWF4UnhBTXBkdUZhY3RvcjsKKworCS8qICovCisJLyogU2NoZWR1bGVkIFBTTVAgcmVsYXRlZCAtIFNlcnZpY2UgSW50ZXJ2YWwgR3JhbnVsYXJpdHkgKi8KKwkvKiAwMDAgLSA1IG1zICovCisJLyogMDAxIC0gMTAgbXMgKi8KKwkvKiAwMTAgLSAxNSBtcyAqLworCS8qIDAxMSAtIDIwIG1zICovCisJLyogMTAwIC0gMjUgbXMgKi8KKwkvKiAxMDEgLSAzMCBtcyAqLworCS8qIDExMCAtIDM1IG1zICovCisJLyogMTExIC0gNDAgbXMgKi8KKwkvKiAqLworCXVpbnQ4X3QgZ0hUU2VydmljZUludGVydmFsR3JhbnVsYXJpdHk7CisKKwkvKiBJbmRpY2F0ZXMgd2hldGhlciBhbiBBUCB3YW50cyB0byBhc3NvY2lhdGUgUFNNUCBlbmFibGVkIFN0YXRpb25zICovCisJdWludDhfdCBnSFRDb250cm9sbGVkQWNjZXNzT25seTsKKworCS8qIFJJRlMgTW9kZS4gU2V0IGlmIG5vIEFQU0QgbGVnYWN5IGRldmljZXMgYXNzb2NpYXRlZCAqLworCXVpbnQ4X3QgZ0hUUmlmc01vZGU7CisJLyogT0JzcyBNb2RlIC4gc2V0IHdoZW4gd2UgaGF2ZSBOb24gSFQgU1RBIGlzIGFzc29jaWF0ZWQgb3Igd2l0aCBpbiBvdmVybGFwIGJzcyAqLworCXVpbnQ4X3QgZ0hUT2Jzc01vZGU7CisKKwkvKiBJZGVudGlmaWVzIHRoZSBjdXJyZW50IE9wZXJhdGluZyBNb2RlICovCisJdFNpck1hY0hUT3BlcmF0aW5nTW9kZSBnSFRPcGVyTW9kZTsKKworCS8qIEluZGljYXRlcyBpZiBQQ08gaXMgYWN0aXZhdGVkIGluIHRoZSBCU1MgKi8KKwl1aW50OF90IGdIVFBDT0FjdGl2ZTsKKworCS8qICovCisJLyogSWYgUENPIGlzIGFjdGl2ZSwgaW5kaWNhdGVzIHdoaWNoIFBDTyBwaGFzZSB0byB1c2UgKi8KKwkvKiAwIC0gc3dpdGNoIHRvIDIwIE1IeiBwaGFzZSAqLworCS8qIDEgLSBzd2l0Y2ggdG8gNDAgTUh6IHBoYXNlICovCisJLyogKi8KKwl1aW50OF90IGdIVFBDT1BoYXNlOworCisJLyogKi8KKwkvKiBVc2VkIG9ubHkgaW4gYmVhY29ucy4gRm9yIFBSLCB0aGlzIGlzIHNldCB0byAwICovCisJLyogMCAtIFByaW1hcnkgYmVhY29uICovCisJLyogMSAtIFNlY29uZGFyeSBiZWFjb24gKi8KKwkvKiAqLworCXVpbnQ4X3QgZ0hUU2Vjb25kYXJ5QmVhY29uOworCisJLyogKi8KKwkvKiBEdWFsIENUUyBQcm90ZWN0aW9uICovCisJLyogMCAtIFVzZSBSVFMvQ1RTICovCisJLyogMSAtIER1YWwgQ1RTIFByb3RlY3Rpb24gaXMgdXNlZCAqLworCS8qICovCisJdWludDhfdCBnSFREdWFsQ1RTUHJvdGVjdGlvbjsKKworCS8qICovCisJLyogSWRlbnRpZmllcyBhIHNpbmdsZSBTVEJDIE1DUyB0aGF0IHNoYWxsIG5lIHVzZWQgZm9yICovCisJLyogU1RCQyBjb250cm9sIGZyYW1lcyBhbmQgU1RCQyBiZWFjb25zICovCisJLyogKi8KKwl1aW50OF90IGdIVFNUQkNCYXNpY01DUzsKKworCXVpbnQ4X3QgZ0hUTm9uR0ZEZXZpY2VzUHJlc2VudDsKKworCS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgSFQgUkVMQVRFRCAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXVpbnQ4X3QgZ0xpbUFkZFN0YVRkbHM7CisJdWludDhfdCBnTGltVGRsc0xpbmtNb2RlOworCS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgVERMUyBSRUxBVEVEICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisjZW5kaWYKKworCS8qIHdzYyBpbmZvIHJlcXVpcmVkIHRvIGZvcm0gdGhlIHdzYyBJRSAqLworCXRMaW1Xc2NJZUluZm8gd3NjSWVJbmZvOworCXRwUEVTZXNzaW9uIGdwU2Vzc2lvbjsgIC8qIFBvaW50ZXIgdG8gIHNlc3Npb24gdGFibGUgKi8KKwkvKgorCSAqIHNlc3Npb25JRCBhbmQgdHJhbnNhY3Rpb25JRCBmcm9tIFNNRSBpcyBzdG9yZWQgaGVyZSBmb3IgdGhvc2UgbWVzc2FnZXMsIGZvciB3aGljaAorCSAqIHRoZXJlIGlzIG5vIHNlc3Npb24gY29udGV4dCBpbiBQRSwgZS5nLiBTY2FuIHJlbGF0ZWQgbWVzc2FnZXMuCisJICoqLworCXVpbnQ4X3QgZ1NtZVNlc3Npb25JZDsKKwl1aW50MTZfdCBnVHJhbnNhY3Rpb25JZDsKKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCXRMaW1NbG1PZW1EYXRhUmVxICpncExpbU1sbU9lbURhdGFSZXE7CisJdExpbU1sbU9lbURhdGFSc3AgKmdwTGltTWxtT2VtRGF0YVJzcDsKKyNlbmRpZgorCisJdFNpclJlbWFpbk9uQ2huUmVxICpncExpbVJlbWFpbk9uQ2hhblJlcTsgICAgICAgLyogaG9sZCByZW1haW4gb24gY2hhbiByZXF1ZXN0IGluIHRoaXMgYnVmICovCisJY2RmX211dGV4X3QgbGltX2ZyYW1lX3JlZ2lzdGVyX2xvY2s7CisJY2RmX2xpc3RfdCBnTGltTWdtdEZyYW1lUmVnaXN0cmF0aW5RdWV1ZTsKKwl1aW50MzJfdCBtZ210RnJhbWVTZXNzaW9uSWQ7CisKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwl0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5OworCXVpbnQ4X3QgcmVBc3NvY1JldHJ5QXR0ZW1wdDsKKyNlbmRpZgorCXRMaW1EaXNhc3NvY0RlYXV0aENuZlJlcSBsaW1EaXNhc3NvY0RlYXV0aENuZlJlcTsKKwl1aW50OF90IGRlZmVycmVkTXNnQ250OworCXRTaXJERlNDaGFubmVsTGlzdCBkZnNjaGFubmVsTGlzdDsKKwl1aW50OF90IGRlYXV0aE1zZ0NudDsKKwl1aW50OF90IGdMaW1JYnNzU3RhTGltaXQ7CisKKwkvKiBOdW1iZXIgb2YgY2hhbm5lbCBzd2l0Y2ggSUVzIHNlbnQgc28gZmFyICovCisJdWludDhfdCBnTGltRGZzQ2hhblN3VHhDb3VudDsKKwl1aW50OF90IGdMaW1EZnNUYXJnZXRDaGFuTnVtOworCXVpbnQ4X3QgcHJvYmVDb3VudGVyOworCXVpbnQ4X3QgbWF4UHJvYmU7CisJQ0RGX1NUQVRVUygqYWRkX2Jzc2Rlc2NyX2NhbGxiYWNrKQorCQkodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJCc3NEZXNjcmlwdGlvbiBidWYsCisJCXVpbnQzMl90IHNjYW5faWQsIHVpbnQzMl90IGZsYWdzKTsKKwl1aW50OF90IHJldHJ5X3BhY2tldF9jbnQ7CisJdWludDhfdCBzY2FuX2Rpc2FibGVkOworfSB0QW5pU2lyTGltLCAqdHBBbmlTaXJMaW07CisKK3N0cnVjdCBtZ210X2ZybV9yZWdfaW5mbyB7CisJY2RmX2xpc3Rfbm9kZV90IG5vZGU7ICAgLyogTVVTVCBiZSBmaXJzdCBlbGVtZW50ICovCisJdWludDE2X3QgZnJhbWVUeXBlOworCXVpbnQxNl90IG1hdGNoTGVuOworCXVpbnQxNl90IHNlc3Npb25JZDsKKwl1aW50OF90IG1hdGNoRGF0YVsxXTsKK307CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKK3R5cGVkZWYgc3RydWN0IHNScm1Db250ZXh0IHsKKwl0UnJtU01FQ29udGV4dCBycm1TbWVDb250ZXh0OworCXRScm1QRUNvbnRleHQgcnJtUEVDb250ZXh0OworfSB0UnJtQ29udGV4dCwgKnRwUnJtQ29udGV4dDsKKyNlbmRpZgorCisvKioKKyAqIGVudW0gdERyaXZlclR5cGUgLSBJbmRpY2F0ZSB0aGUgZHJpdmVyIHR5cGUgdG8gdGhlIG1hYywgYW5kIGJhc2VkIG9uIHRoaXMKKyAqIGRvIGFwcHJvcHJpYXRlIGluaXRpYWxpemF0aW9uLgorICoKKyAqIEBlRFJJVkVSX1RZUEVfUFJPRFVDVElPTjoKKyAqIEBlRFJJVkVSX1RZUEVfTUZHOgorICoKKyAqLwordHlwZWRlZiBlbnVtIHsKKwllRFJJVkVSX1RZUEVfUFJPRFVDVElPTiA9IDAsCisJZURSSVZFUl9UWVBFX01GRyA9IDEsCit9IHREcml2ZXJUeXBlOworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisKKyAgICBcdHlwZWRlZiB0TWFjT3BlblBhcmFtZXRlcnMKKworICAgIFxicmllZiBQYXJhbWV0ZXJzIG5lZWRlZCBmb3IgRW51bWVyYXRpb24gb2YgYWxsIHN0YXR1cyBjb2RlcyByZXR1cm5lZCBieSB0aGUgaGlnaGVyIGxldmVsCisgICAgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYgc3RydWN0IHNNYWNPcGVuUGFyYW1ldGVycyB7CisJdWludDE2X3QgbWF4U3RhdGlvbjsKKwl1aW50MTZfdCBtYXhCc3NJZDsKKwl1aW50MzJfdCBmcmFtZVRyYW5zUmVxdWlyZWQ7CisJdWludDhfdCBwb3dlcnNhdmVPZmZsb2FkRW5hYmxlZDsKKwkvKiBQb3dlcnNhdmUgUGFyYW1ldGVycyAqLworCXVpbnQ4X3Qgc3RhTWF4TElNb2REdGltOworCXVpbnQ4X3Qgc3RhTW9kRHRpbTsKKwl1aW50OF90IHN0YUR5bmFtaWNEdGltOworCXREcml2ZXJUeXBlIGRyaXZlclR5cGU7CisJdWludDhfdCBtYXhXb1dGaWx0ZXJzOworCXVpbnQ4X3Qgd293RW5hYmxlOworLyogSGVyZSBvbEluaUluZm8gaXMgdXNlZCB0byBzdG9yZSBpbmkKKyAqIHN0YXR1cyBvZiBhcnAgb2ZmbG9hZCwgbnMgb2ZmbG9hZAorICogYW5kIG90aGVycy4gQ3VycmVudGx5IDFzdCBiaXQgaXMgdXNlZAorICogZm9yIGFycCBvZmYgbG9hZCBhbmQgMm5kIGJpdCBmb3IgbnMKKyAqIG9mZmxvYWQgY3VycmVudGx5LCByZXN0IGJpdHMgYXJlIHVudXNlZAorICovCisJdWludDhfdCBvbEluaUluZm87CisJYm9vbCBzc2RwOworCS8qCisJICogREZTIFBoeWVycm9yIEZpbHRlcmluZyBvZmZsb2FkIHN0YXR1cyBmcm9tIGluaQorCSAqIDAgaW5kaWNhdGVzIG9mZmxvYWQgZGlzYWJsZWQKKwkgKiAxIGluZGljYXRlcyBvZmZsb2FkIGVuYWJsZWQKKwkgKi8KKwl1aW50OF90IGRmc1BoeWVyckZpbHRlck9mZmxvYWQ7CisvKiBwYXNzIGludHJhLWJzcy1md2QgaW5mbyB0byB0eHJ4IG1vZHVsZSAqLworCXVpbnQ4X3QgYXBEaXNhYmxlSW50cmFCc3NGd2Q7CisKKwkvKiBtYXggb2ZmbG9hZCBwZWVyICovCisJdWludDhfdCBhcE1heE9mZmxvYWRQZWVyczsKKworCS8qIG1heCBvZmZsb2FkIHJlb3JkZXIgYnVmZnMgKi8KKwl1aW50OF90IGFwTWF4T2ZmbG9hZFJlb3JkZXJCdWZmczsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9SQV9GSUxURVJJTkcKKwl1aW50MTZfdCBSQXJhdGVMaW1pdEludGVydmFsOworCWJvb2wgSXNSQXJhdGVMaW1pdEVuYWJsZWQ7CisjZW5kaWYKKwkvKiBpcyBSWCByZS1vcmRlcmluZyBvZmZsb2FkZWQgdG8gdGhlIGZ3ICovCisJdWludDhfdCByZW9yZGVyT2ZmbG9hZDsKKworCS8qIGRmcyByYWRhciBwcmkgbXVsdGlwbGllciAqLworCWludDMyX3QgZGZzUmFkYXJQcmlNdWx0aXBsaWVyOworCisJLyogSVBBIE1pY3JvIGNvbnRyb2xsZXIgZGF0YSBwYXRoIG9mZmxvYWQgZW5hYmxlIGZsYWcgKi8KKwl1aW50OF90IHVjT2ZmbG9hZEVuYWJsZWQ7CisJLyogSVBBIE1pY3JvIGNvbnRyb2xsZXIgZGF0YSBwYXRoIG9mZmxvYWQgVFggYnVmZmVyIGNvdW50ICovCisJdWludDMyX3QgdWNUeEJ1ZkNvdW50OworCS8qIElQQSBNaWNybyBjb250cm9sbGVyIGRhdGEgcGF0aCBvZmZsb2FkIFRYIGJ1ZmZlciBzaXplICovCisJdWludDMyX3QgdWNUeEJ1ZlNpemU7CisJLyogSVBBIE1pY3JvIGNvbnRyb2xsZXIgZGF0YSBwYXRoIG9mZmxvYWQgUlggaW5kaWNhdGlvbiByaW5nIGNvdW50ICovCisJdWludDMyX3QgdWNSeEluZFJpbmdDb3VudDsKKwkvKiBJUEEgTWljcm8gY29udHJvbGxlciBkYXRhIHBhdGggb2ZmbG9hZCBUWCBwYXJ0aXRpb24gYmFzZSAqLworCXVpbnQzMl90IHVjVHhQYXJ0aXRpb25CYXNlOworCWJvb2wgZW5hYmxlX3J4dGhyZWFkOworCWJvb2wgaXBfdGNwX3VkcF9jaGVja3N1bV9vZmZsb2FkOworCisJLyogQ0UgYmFzZWQgY2xhc3NpZmljYXRpb24gZW5hYmxlZCAqLworCWJvb2wgY2VfY2xhc3NpZnlfZW5hYmxlZDsKKworCS8qIE1heGltdW0gbnVtYmVyIG9mIHBhcmFsbGVsIHNjYW5zICovCisJdWludDhfdCBtYXhfc2NhbjsKKworI2lmZGVmIFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIKKwkvKiBUaHJlc2hvbGQgdG8gc3RvcCBxdWV1ZSBpbiBwZXJjZW50YWdlICovCisJdWludDMyX3QgdHhfZmxvd19zdG9wX3F1ZXVlX3RoOworCS8qIFN0YXJ0IHF1ZXVlIG9mZnNldCBpbiBwZXJjZW50YWdlICovCisJdWludDMyX3QgdHhfZmxvd19zdGFydF9xdWV1ZV9vZmZzZXQ7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTFBTUworCWJvb2wgaXNfbHBhc3NfZW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9OQU4KKwlib29sIGlzX25hbl9lbmFibGVkOworI2VuZGlmCisJYm9vbCAgICAgIHR4X2NoYWluX21hc2tfY2NrOworCXVpbnQxNl90ICBzZWxmX2dlbl9mcm1fcHdyOworfSB0TWFjT3BlblBhcmFtZXRlcnM7CisKK3R5cGVkZWYgc3RydWN0IHNIYWxNYWNTdGFydFBhcmFtZXRlcnMgeworCS8qIHBhcmFtZXRlcyBmb3IgdGhlIEZpcm13YXJlICovCisJdERyaXZlclR5cGUgZHJpdmVyVHlwZTsKKworfSB0SGFsTWFjU3RhcnRQYXJhbWV0ZXJzOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAvIE1BQyBTaXJpdXMgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVNpckdsb2JhbCB7CisJdERyaXZlclR5cGUgZ0RyaXZlclR5cGU7CisKKwl0QW5pU2lyQ2ZnIGNmZzsKKwl0QW5pU2lyTGltIGxpbTsKKwl0QW5pU2lyU2NoIHNjaDsKKwl0QW5pU2lyU3lzIHN5czsKKwl0QW5pU2lyVXRpbHMgdXRpbHM7CisKKwkvKiBQQUwvSEREIGhhbmRsZSAqLworCXRIZGRIYW5kbGUgaEhkZDsKKworCisJdFNtZVN0cnVjdCBzbWU7CisJdFNhcFN0cnVjdCBzYXA7CisJdENzclNjYW5TdHJ1Y3Qgc2NhbjsKKwl0Q3NyUm9hbVN0cnVjdCByb2FtOworCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisJdE9lbURhdGFTdHJ1Y3Qgb2VtRGF0YTsKKyNlbmRpZgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXRScm1Db250ZXh0IHJybTsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9DT05DVVJSRU5UX1AyUAorCXRwMnBDb250ZXh0IHAycENvbnRleHRbTUFYX05PX09GX1AyUF9TRVNTSU9OU107CisjZWxzZQorCXRwMnBDb250ZXh0IHAycENvbnRleHQ7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJYm9vbCBpc190ZGxzX3Bvd2VyX3NhdmVfcHJvaGliaXRlZDsKKyNlbmRpZgorCisJdWludDhfdCBpc0NvYWxlc2luZ0luSUJTU0FsbG93ZWQ7CisKKwlib29sIGltcHNfZW5hYmxlZDsKKworCS8qIFBOTyBvZmZsb2FkICovCisJYm9vbCBwbm9PZmZsb2FkOworCisJY3NyX3JlYWR5VG9TdXNwZW5kQ2FsbGJhY2sgcmVhZHlUb1N1c3BlbmRDYWxsYmFjazsKKwl2b2lkICpyZWFkeVRvU3VzcGVuZENvbnRleHQ7CisJdWludDhfdCBsdGVDb2V4QW50U2hhcmU7CisJdWludDhfdCBiZWFjb25fb2ZmbG9hZDsKKwl1aW50MzJfdCBmRW5hYmxlRGVidWdMb2c7CisJdWludDE2X3QgbWdtdFNlcU51bTsKKwlib29sIGVuYWJsZTVnRUJUOworCS8qIE1pcmFjYXN0IHNlc3Npb24gMC1EaXNhYmxlZCwgMS1Tb3VyY2UsIDItc2luayAqLworCXVpbnQ4X3QgZk1pcmFjYXN0U2Vzc2lvblByZXNlbnQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCisJY3NyX3JlYWR5VG9FeHRXb1dDYWxsYmFjayByZWFkeVRvRXh0V29XQ2FsbGJhY2s7CisJdm9pZCAqcmVhZHlUb0V4dFdvV0NvbnRleHQ7CisjZW5kaWYKKwl1aW50MzJfdCBmX3N0YV9taXJhY2FzdF9tY2NfcmVzdF90aW1lX3ZhbDsKKwl1aW50OF90IGZfcHJlZmVyX25vbl9kZnNfb25fcmFkYXI7CisJaGRkX2Z0bV9tc2dfcHJvY2Vzc29yIGZ0bV9tc2dfcHJvY2Vzc29yX2NhbGxiYWNrOworCWJvb2wgcG9saWN5X21hbmFnZXJfZW5hYmxlZDsKKwl1aW50MzJfdCBmaW5lX3RpbWVfbWVhc19jYXA7CisKKwkvKiA4MDIuMTFwIGVuYWJsZSAqLworCWJvb2wgZW5hYmxlX2RvdDExcDsKKworCXVpbnQzMl90IGR1YWxfbWFjX2ZlYXR1cmVfZGlzYWJsZTsKKworCWJvb2wgZmlyc3Rfc2Nhbl9kb25lOworfSB0QW5pU2lyR2xvYmFsOworCit0eXBlZGVmIGVudW0geworCWVISURERU5fU1NJRF9OT1RfSU5fVVNFLAorCWVISURERU5fU1NJRF9aRVJPX0xFTiwKKwllSElEREVOX1NTSURfWkVST19DT05URU5UUworfSB0SGlkZGVuc3NJZDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisKKyNkZWZpbmUgUkZDMTA0Ml9IRFJfTEVOR1RIICAgICAgKDYpCisjZGVmaW5lIEdFVF9CRTE2KHgpICAgICAgICAgICAgICgodWludDE2X3QpICgoKHgpWzBdIDw8IDgpIHwgKHgpWzFdKSkKKyNkZWZpbmUgRVRIX1RZUEVfODlfMGQgICAgICAgICAgKDB4ODkwZCkKKyNkZWZpbmUgRVRIX1RZUEVfTEVOICAgICAgICAgICAgKDIpCisjZGVmaW5lIFBBWUxPQURfVFlQRV9URExTX1NJWkUgICgxKQorI2RlZmluZSBQQVlMT0FEX1RZUEVfVERMUyAgICAgICAoMikKKworI2VuZGlmCisKKyNlbmRpZiAvKiBfQU5JR0xPQkFMX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL2luYy9hbmlfc3lzdGVtX2RlZnMuaCBiL2NvcmUvbWFjL2luYy9hbmlfc3lzdGVtX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzhkMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvaW5jL2FuaV9zeXN0ZW1fZGVmcy5oCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBhbmlfc3lzdGVtX2RlZnMuaCBjb250YWlucyBkZWZpbml0aW9ucyB1c2VkIGJ5CisgKiB2YXJpb3VzIEFOSSBlbnRpdGllcworICogQXV0aG9yOiAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgIDA5LzE4LzIwMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfX0FOSV9TWVNURU1fREVGU19ICisjZGVmaW5lIF9fQU5JX1NZU1RFTV9ERUZTX0gKKworI2luY2x1ZGUgInNpcl90eXBlcy5oIgorI2luY2x1ZGUgInNpcl9tYWNfcHJvdF9kZWYuaCIKKworI2RlZmluZSBBTklfT1VJICAweDAwMEFGNQorCisvKiAvIE1heCBXRFMgaW5mbyBsZW5ndGguICovCisjZGVmaW5lIEFOSV9XRFNfSU5GT19NQVhfTEVOR1RIICAgICAgICA2NAorCisvKiBUaGlzIGlzIHRvIGZvcmNlIGNvbXBpbGVyIHRvIHVzZSB0aGUgbWF4aW11bSBvZiBhbiBpbnQgZm9yIGVudW0gKi8KKyNkZWZpbmUgU0lSX01BWF9FTlVNX1NJWkUgICAgMHg3RkZGRkZGRgorCisvKiBNYXgga2V5IHNpemUgIGluY2x1ZGluZyB0aGUgV0FQSSBhbmQgVEtJUCAqLworI2RlZmluZSBXTEFOX01BWF9LRVlfUlNDX0xFTiAgICAgICAgIDE2CisjZGVmaW5lIFdMQU5fV0FQSV9LRVlfUlNDX0xFTiAgICAgICAgMTYKKworI2lmbmRlZiBmYWxzZQorI3VuZGVmIGZhbHNlCisjZGVmaW5lIGZhbHNlICAgMAorI2VuZGlmCisjaWZuZGVmIHRydWUKKyN1bmRlZiB0cnVlCisjZGVmaW5lIHRydWUgICAgMQorI2VuZGlmCisKK3R5cGVkZWYgZW51bSBlQW5pQm9vbCB7CisJZVNJUl9GQUxTRSwKKwllU0lSX1RSVUUsCisJZVNJUl9ET05PVF9VU0VfQk9PTCA9IFNJUl9NQVhfRU5VTV9TSVpFCit9IHRBbmlCb29sOworCisvKiAvIEF1dGhlbnRpY2F0aW9uIHR5cGUgZW51bSB1c2VkIHdpdGggcGVlciAqLwordHlwZWRlZiBlbnVtIGVBbmlBdXRoVHlwZSB7CisJZVNJUl9PUEVOX1NZU1RFTSwKKwllU0lSX1NIQVJFRF9LRVksCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWVTSVJfRlRfQVVUSCwKKyNlbmRpZgorI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0VTRQorCWVTSVJfTEVBUF9BVVRIID0gMHg4MCwKKyNlbmRpZgorCWVTSVJfQVVUT19TV0lUQ0gsCisJZVNJUl9ET05PVF9VU0VfQVVUSF9UWVBFID0gU0lSX01BWF9FTlVNX1NJWkUKK30gdEFuaUF1dGhUeXBlOworCisvKiAvIEVuY3J5cHRpb24gdHlwZSBlbnVtIHVzZWQgd2l0aCBwZWVyICovCit0eXBlZGVmIGVudW0gZUFuaUVkVHlwZSB7CisJZVNJUl9FRF9OT05FLAorCWVTSVJfRURfV0VQNDAsCisJZVNJUl9FRF9XRVAxMDQsCisJZVNJUl9FRF9US0lQLAorCWVTSVJfRURfQ0NNUCwKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorCWVTSVJfRURfV1BJLAorI2VuZGlmCisJLypEUFUgSFcgdHJlYXRzIGVuY3J5cHRpb24gbW9kZSA0IHBsdXMgUk1GIGJpdCBzZXQgaW4gVFggQkQgYXMgQklQLgorCSAgIFRodXMgd2hpbGUgc2V0dGluZyBCSVAgZW5jcnlwdGlvbiBtb2RlIGluIGNvcnJlc3BvbmRpbmcgRFBVIERlc2MKKwkgICBlU0lSX0VEX0FFU18xMjhfQ01BQyBzaG91bGQgYmUgc2V0IHRvIGVTSVJfRURfQ0NNUCAqLworCWVTSVJfRURfQUVTXzEyOF9DTUFDLAorCWVTSVJfRURfTk9UX0lNUExFTUVOVEVEID0gU0lSX01BWF9FTlVNX1NJWkUKK30gdEFuaUVkVHlwZTsKKwordHlwZWRlZiBlbnVtIGVBbmlXZXBUeXBlIHsKKwllU0lSX1dFUF9TVEFUSUMsCisJZVNJUl9XRVBfRFlOQU1JQywKK30gdEFuaVdlcFR5cGU7CisKKy8qIC8gRW51bSB0byBzcGVjaWZ5IHdoZXRoZXIga2V5IGlzIHVzZWQgKi8KKy8qIC8gZm9yIFRYIG9ubHksIFJYIG9ubHkgb3IgYm90aCAqLwordHlwZWRlZiBlbnVtIGVBbmlLZXlEaXJlY3Rpb24geworCWVTSVJfVFhfT05MWSwKKwllU0lSX1JYX09OTFksCisJZVNJUl9UWF9SWCwKKwllU0lSX1RYX0RFRkFVTFQsCisJZVNJUl9ET05PVF9VU0VfS0VZX0RJUkVDVElPTiA9IFNJUl9NQVhfRU5VTV9TSVpFCit9IHRBbmlLZXlEaXJlY3Rpb247CisKK3R5cGVkZWYgc3RydWN0IHNBbmlTU0lEIHsKKwl1aW50OF90IGxlbmd0aDsKKwl1aW50OF90IHNzSWRbU0lSX01BQ19NQVhfU1NJRF9MRU5HVEhdOworfSB0QW5pU1NJRCwgKnRwQW5pU1NJRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaUFwTmFtZSB7CisJdWludDhfdCBsZW5ndGg7CisJdWludDhfdCBuYW1lW1NJUl9NQUNfTUFYX1NTSURfTEVOR1RIXTsKK30gdEFuaUFwTmFtZSwgKnRwQW5pQXBOYW1lOworCisvKiAvIFJTTiBJRSBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclJTTmllIHsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCByc25JRWRhdGFbU0lSX01BQ19NQVhfSUVfTEVOR1RIICsgMl07Cit9IHRTaXJSU05pZSwgKnRwU2lyUlNOaWU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJXQVBJaWUgeworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHdhcGlJRWRhdGFbU0lSX01BQ19NQVhfSUVfTEVOR1RIICsgMl07Cit9IHRTaXJXQVBJaWUsICp0cFNpcldBUElpZTsKKy8qIC8gQWRkaXRpb25hbCBJRSBpbmZvcm1hdGlvbiA6ICovCisvKiAvIFRoaXMgY2FuIGluY2x1ZGUgV1NDIElFLCBQMlAgSUUsIGFuZC9vciBGVElFIGZyb20gdXBwZXIgbGF5ZXIuICovCisvKiAvIE1BQyBsYXllciB0cmFuc3BhcmVudGx5IGNvbnZleSB0aGVzZSBJRSBpbmZvIGJldHdlZW4gcGVlciBTVEEgYW5kIHVwcGVyIGxheWVyLCAqLworLyogLyBidXQgbmV2ZXIgcmVxdWlyZXMgdG8gcGFyc2UgaXQuICovCit0eXBlZGVmIHN0cnVjdCBzU2lyQWRkaWUgeworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IGFkZElFZGF0YVtTSVJfTUFDX01BWF9BRERfSUVfTEVOR1RIICsgMl07Cit9IHRTaXJBZGRpZSwgKnRwU2lyQWRkaWU7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisKKy8qIFRoZSBDQ0tNIElFIG5lZWRzIHRvIGJlIGluIHRoZSAqLworLyogSm9pbiBhbmQgUmVhc3NvYyBSZXEuICovCit0eXBlZGVmIHN0cnVjdCBzU2lyQ0NLTWllIHsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBjY2ttSUVkYXRhW1NJUl9NQUNfTUFYX0lFX0xFTkdUSCArIDJdOworfSB0U2lyQ0NLTWllLCAqdHBTaXJDQ0tNaWU7CisKKyNlbmRpZgorCisvKiAvIERlZmluaXRpb24gZm9yIEVuY3J5cHRpb24gS2V5cyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpcktleXMgeworCXVpbnQ4X3Qga2V5SWQ7CisJdWludDhfdCB1bmljYXN0OyAgICAgICAgLyogMCBmb3IgbXVsdGljYXN0ICovCisJdEFuaUtleURpcmVjdGlvbiBrZXlEaXJlY3Rpb247CisJdWludDhfdCBrZXlSc2NbV0xBTl9NQVhfS0VZX1JTQ19MRU5dOyAgIC8qIFVzYWdlIGlzIHVua25vd24gKi8KKwl1aW50OF90IHBhZVJvbGU7ICAgICAgICAvKiA9MSBmb3IgYXV0aGVudGljYXRvciwgKi8KKwkvKiA9MCBmb3Igc3VwcGxpY2FudCAqLworCXVpbnQxNl90IGtleUxlbmd0aDsKKwl1aW50OF90IGtleVtTSVJfTUFDX01BWF9LRVlfTEVOR1RIXTsKK30gdFNpcktleXMsICp0cFNpcktleXM7CisKKy8qIC8gRGVmaW5pdGlvbiBmb3IgS2V5aW5nIG1hdGVyaWFsICovCit0eXBlZGVmIHN0cnVjdCBzU2lyS2V5TWF0ZXJpYWwgeworCXVpbnQxNl90IGxlbmd0aDsgICAgICAgIC8qIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBhbGwgKi8KKwkvKiBkYXRhIHRoYXQgZm9sbG93cyAqLworCXRBbmlFZFR5cGUgZWRUeXBlOyAgICAgIC8qIEVuY3J5cHRpb24vRGVjcnlwdGlvbiB0eXBlICovCisJdWludDhfdCBudW1LZXlzOworCXRTaXJLZXlzIGtleVsxXTsKK30gdFNpcktleU1hdGVyaWFsLCAqdHBTaXJLZXlNYXRlcmlhbDsKKworI2RlZmluZSBTSVJfQ0lQSEVSX1NFUV9DVFJfU0laRSA2CisvKiAvIERlZmluaXRpb24gZm9yIE1JQyBmYWlsdXJlIGluZGljYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNaWNGYWlsdXJlSW5mbyB7CisJdFNpck1hY0FkZHIgc3JjTWFjQWRkcjsgLyogYWRkcmVzcyB1c2VkIHRvIGNvbXB1dGUgTUlDICovCisJdFNpck1hY0FkZHIgdGFNYWNBZGRyOyAgLyogdHJhbnNtaXR0ZXIgYWRkcmVzcyAqLworCXRTaXJNYWNBZGRyIGRzdE1hY0FkZHI7CisJdEFuaUJvb2wgbXVsdGljYXN0OworCXVpbnQ4X3QgSVYxOyAgICAgICAgICAgIC8qIGZpcnN0IGJ5dGUgb2YgSVYgKi8KKwl1aW50OF90IGtleUlkOyAgICAgICAgICAvKiBzZWNvbmQgYnl0ZSBvZiBJViAqLworCXVpbnQ4X3QgVFNDW1NJUl9DSVBIRVJfU0VRX0NUUl9TSVpFXTsgICAvKiBzZXF1ZW5jZSBudW1iZXIgKi8KKwl0U2lyTWFjQWRkciByeE1hY0FkZHI7ICAvKiByZWNlaXZlIGFkZHJlc3MgKi8KKworfSB0U2lyTWljRmFpbHVyZUluZm8sICp0cFNpck1pY0ZhaWx1cmVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzVHJhZlN0cm1NZXRyaWNzIHsKKwl1aW50MTZfdCBVcGxpbmtQa3RRdWV1ZURseTsKKwl1aW50MTZfdCBVcGxpbmtQa3RRdWV1ZURseUhpc3RbNF07CisJdWludDMyX3QgVXBsaW5rUGt0VHhEbHk7CisJdWludDE2X3QgVXBsaW5rUGt0TG9zczsKKwl1aW50MTZfdCBVcGxpbmtQa3RDb3VudDsKKwl1aW50OF90IFJvYW1pbmdDb3VudDsKKwl1aW50MTZfdCBSb2FtaW5nRGx5OworfSBjZGZfcGFja2VkIHRUcmFmU3RybU1ldHJpY3MsICp0cFRyYWZTdHJtTWV0cmljczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0JjblJlcG9ydEZpZWxkcyB7CisJdWludDhfdCBDaGFuTnVtOworCXVpbnQ4X3QgU3BhcmU7CisJdWludDE2X3QgTWVhc0R1cmF0aW9uOworCXVpbnQ4X3QgUGh5VHlwZTsKKwl1aW50OF90IFJlY3ZTaWdQb3dlcjsKKwl0U2lyTWFjQWRkciBCc3NpZDsKKwl1aW50MzJfdCBQYXJlbnRUc2Y7CisJdWludDMyX3QgVGFyZ2V0VHNmWzJdOworCXVpbnQxNl90IEJjbkludGVydmFsOworCXVpbnQxNl90IENhcGFiaWxpdHlJbmZvOworfSBjZGZfcGFja2VkIHRCY25SZXBvcnRGaWVsZHMsICp0cEJjblJlcG9ydEZpZWxkczsKKworI2VuZGlmIC8qIF9fQU5JX1NZU1RFTV9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL2luYy9tYWNfaW5pdF9hcGkuaCBiL2NvcmUvbWFjL2luYy9tYWNfaW5pdF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTVmOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvaW5jL21hY19pbml0X2FwaS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogbWFjX2luaXRfYXBpLmMgLSBIZWFkZXIgZmlsZSBmb3IgbWFjIGxldmVsIGluaXQgZnVuY3Rpb25zCisgKiBBdXRob3I6ICAgIERpbmVzaCBVcGFkaHlheQorICogRGF0ZTogICAgICAwNC8yMy8yMDA3CisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgTW9kaWZpZWQgYnkgICAgICAgICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaWZuZGVmIF9fTUFDX0lOSVRfQVBJX0gKKyNkZWZpbmUgX19NQUNfSU5JVF9BUElfSAorCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgInNpcl90eXBlcy5oIgorCit0U2lyUmV0U3RhdHVzIG1hY19zdGFydCh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnBIYWxNYWNTdGFydFBhcmFtcyk7Cit0U2lyUmV0U3RhdHVzIG1hY19zdG9wKHRIYWxIYW5kbGUgaEhhbCwgdEhhbFN0b3BUeXBlIHN0b3BUeXBlKTsKK3RTaXJSZXRTdGF0dXMgbWFjX29wZW4odEhhbEhhbmRsZSAqcEhhbEhhbmRsZSwgdEhkZEhhbmRsZSBoSGRkLAorCQkgICAgICAgdE1hY09wZW5QYXJhbWV0ZXJzICpwTWFjT3BlblBhcm1zKTsKK3RTaXJSZXRTdGF0dXMgbWFjX2Nsb3NlKHRIYWxIYW5kbGUgaEhhbCk7CisKKyNlbmRpZiAvKiBfX01BQ19JTklUX0FQSV9IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9pbmMvbWFjX3RyYWNlLmggYi9jb3JlL21hYy9pbmMvbWFjX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlMDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL2luYy9tYWNfdHJhY2UuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAqICBcZmlsZSAgbWFjX3RyYWNlLmgKKworICogIFxicmllZiBkZWZpbml0aW9uIGZvciB0cmFjZSByZWxhdGVkIEFQSXMKKworICAgXGF1dGhvciBTdW5pdCBCaGF0aWEKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBfX01BQ19UUkFDRV9ICisjZGVmaW5lIF9fTUFDX1RSQUNFX0gKKworI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKworI2lmZGVmIFRSQUNFX1JFQ09SRAorCisjZGVmaW5lIE1BQ19UUkFDRV9HRVRfTU9EVUxFX0lEKGRhdGEpICgoZGF0YSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIE1BQ19UUkFDRV9HRVRfTVNHX0lEKGRhdGEpICAgICAgIChkYXRhICYgMHhmZmZmKQorCisjZGVmaW5lIGVMT0dfTk9EUk9QX01JU1NFRF9CRUFDT05fU0NFTkFSSU8gMAorI2RlZmluZSBlTE9HX1BST0NfREVBVVRIX0ZSQU1FX1NDRU5BUklPIDEKKwordm9pZCBtYWNfdHJhY2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBjb2RlLCB1aW50MTZfdCBzZXNzaW9uLAorCSAgICAgICB1aW50MzJfdCBkYXRhKTsKK3ZvaWQgbWFjX3RyYWNlX25ldyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IG1vZHVsZSwgdWludDhfdCBjb2RlLAorCQkgICB1aW50MTZfdCBzZXNzaW9uLCB1aW50MzJfdCBkYXRhKTsKK3VpbnQ4X3QgKm1hY190cmFjZV9nZXRfY2ZnX21zZ19zdHJpbmcodWludDE2X3QgY2ZnTXNnKTsKK3VpbnQ4X3QgKm1hY190cmFjZV9nZXRfbGltX21zZ19zdHJpbmcodWludDE2X3QgbGltTXNnKTsKK3VpbnQ4X3QgKm1hY190cmFjZV9nZXRfd21hX21zZ19zdHJpbmcodWludDE2X3Qgd21hTXNnKTsKK3VpbnQ4X3QgKm1hY190cmFjZV9nZXRfc21lX21zZ19zdHJpbmcodWludDE2X3Qgc21lTXNnKTsKK3VpbnQ4X3QgKm1hY190cmFjZV9nZXRfaW5mb19sb2dfc3RyaW5nKHVpbnQxNl90IGluZm9Mb2cpOworQ0RGX1NUQVRVUyBwZV9hY3F1aXJlX2dsb2JhbF9sb2NrKHRBbmlTaXJMaW0gKnBzUGUpOworQ0RGX1NUQVRVUyBwZV9yZWxlYXNlX2dsb2JhbF9sb2NrKHRBbmlTaXJMaW0gKnBzUGUpOworCit1aW50OF90ICptYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlKHVpbnQxNl90IG5laWdoYm91clJvYW1TdGF0ZSk7Cit1aW50OF90ICptYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3RhdGUodWludDE2X3QgY3NyX3JvYW1TdGF0ZSk7Cit1aW50OF90ICptYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3ViX3N0YXRlKHVpbnQxNl90IGNzcl9yb2FtU3ViU3RhdGUpOwordWludDhfdCAqbWFjX3RyYWNlX2dldF9saW1fc21lX3N0YXRlKHVpbnQxNl90IGxpbVN0YXRlKTsKK3VpbnQ4X3QgKm1hY190cmFjZV9nZXRfbGltX21sbV9zdGF0ZSh1aW50MTZfdCBtbG1TdGF0ZSk7Cit1aW50OF90ICptYWNfdHJhY2VfZ2V0X3RsX3N0YXRlKHVpbnQxNl90IHRsU3RhdGUpOworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL21hYy9pbmMvcXdsYW5fdmVyc2lvbi5oIGIvY29yZS9tYWMvaW5jL3F3bGFuX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE3N2QyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvaW5jL3F3bGFuX3ZlcnNpb24uaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFFXTEFOX1ZFUlNJT05fSAorI2RlZmluZSBRV0xBTl9WRVJTSU9OX0gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZJTEU6CisgICBxd2xhbl92ZXJzaW9uLmgKKworICAgQlJJRUYgREVTQ1JJUFRJT046CisgICBXTEFOIEhvc3QgVmVyc2lvbiBmaWxlLgorICAgQnVpbGQgbnVtYmVyIGF1dG9tYXRpY2x5IHVwZGF0ZWQgYnkgYnVpbGQgc2NyaXB0cy4KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBRV0xBTl9WRVJTSU9OX01BSk9SICAgICAgICAgICAgNQorI2RlZmluZSBRV0xBTl9WRVJTSU9OX01JTk9SICAgICAgICAgICAgMAorI2RlZmluZSBRV0xBTl9WRVJTSU9OX1BBVENIICAgICAgICAgICAgMAorI2RlZmluZSBRV0xBTl9WRVJTSU9OX0VYVFJBICAgICAgICAgICAgIiIKKyNkZWZpbmUgUVdMQU5fVkVSU0lPTl9CVUlMRCAgICAgICAgICAgIDEzOQorCisjZGVmaW5lIFFXTEFOX1ZFUlNJT05TVFIgICAgICAgICAgICAgICAiNS4wLjAuMTM5IgorCisjZW5kaWYgLyogUVdMQU5fVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9pbmMvc2lyX2FwaS5oIGIvY29yZS9tYWMvaW5jL3Npcl9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmUxOTdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvaW5jL3Npcl9hcGkuaApAQCAtMCwwICsxLDUzNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgc2lyX2FwaS5oIGNvbnRhaW5zIGRlZmluaXRpb25zIGV4cG9ydGVkIGJ5CisgKiBTaXJpdXMgc29mdHdhcmUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwNC8xNi8yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fU0lSX0FQSV9ICisjZGVmaW5lIF9fU0lSX0FQSV9ICisKKyNpbmNsdWRlICJzaXJfdHlwZXMuaCIKKyNpbmNsdWRlICJzaXJfbWFjX3Byb3RfZGVmLmgiCisjaW5jbHVkZSAiYW5pX3N5c3RlbV9kZWZzLmgiCisjaW5jbHVkZSAic2lyX3BhcmFtcy5oIgorCisjZGVmaW5lIE9GRlNFVF9PRihzdHJ1Y3RUeXBlLCBmbGROYW1lKSAgICgmKChzdHJ1Y3RUeXBlICopMCktPmZsZE5hbWUpCisKKy8qIC8gTWF4IHN1cHBvcnRlZCBjaGFubmVsIGxpc3QgKi8KKyNkZWZpbmUgU0lSX01BWF9TVVBQT1JURURfQ0hBTk5FTF9MSVNUICAgICAgOTYKKworI2RlZmluZSBTSVJfTURJRV9FTEVNRU5UX0lEICAgICAgICAgNTQKKyNkZWZpbmUgU0lSX01ESUVfU0laRSAgICAgICAgICAgICAgIDMKKworLyogSW5jcmVhc2UgZHdlbGwgdGltZSBmb3IgUDJQIHNlYXJjaCBpbiBtcyAqLworI2RlZmluZSBQMlBfU0VBUkNIX0RXRUxMX1RJTUVfSU5DUkVBU0UgICAyMAorI2RlZmluZSBQMlBfU09DSUFMX0NIQU5ORUxTICAgICAgICAgICAgICAzCisKKy8qIE1heCBudW1iZXIgb2YgY2hhbm5lbHMgYXJlIDE2NSwgYnV0IHRvIGFjY2VzcyAxNjV0aCBlbGVtZW50IG9mIGFycmF5LAorICAgKmFycmF5IG9mIDE2NiBpcyByZXF1aXJlZC4KKyAqLworI2RlZmluZSBTSVJfTUFYXzI0R181R19DSEFOTkVMX1JBTkdFICAgICAgMTY2CisjZGVmaW5lIFNJUl9CQ05fUkVQT1JUX01BWF9CU1NfREVTQyAgICAgICA0CisKKyNkZWZpbmUgU0lSX05VTV8xMUJfUkFURVMgNCAgICAgLyogMSwyLDUuNSwxMSAqLworI2RlZmluZSBTSVJfTlVNXzExQV9SQVRFUyA4ICAgICAvKiA2LDksMTIsMTgsMjQsMzYsNDgsNTQgKi8KKworI2RlZmluZSBTSVJfUE1fU0xFRVBfTU9ERSAgIDAKKyNkZWZpbmUgU0lSX1BNX0FDVElWRV9NT0RFICAgICAgICAxCisKKy8qIGhpZGRlbiBTU0lEIG9wdGlvbnMgKi8KKyNkZWZpbmUgU0lSX1NDQU5fTk9fSElEREVOX1NTSUQgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfU0NBTl9ISURERU5fU1NJRF9QRV9ERUNJU0lPTiAgICAgICAgICAgICAxCisKKyNkZWZpbmUgU0lSX01BQ19BRERSX0xFTiAgICAgICAgNgorI2RlZmluZSBTSVJfSVBWNF9BRERSX0xFTiAgICAgICA0CisKK3R5cGVkZWYgdWludDhfdCB0U2lySXB2NEFkZHJbU0lSX0lQVjRfQUREUl9MRU5dOworCisjZGVmaW5lIFNJUl9WRVJTSU9OX1NUUklOR19MRU4gNjQKK3R5cGVkZWYgdWludDhfdCB0U2lyVmVyc2lvblN0cmluZ1tTSVJfVkVSU0lPTl9TVFJJTkdfTEVOXTsKKworLyogUGVyaW9kaWMgVHggcGF0dGVybiBvZmZsb2FkIGZlYXR1cmUgKi8KKyNkZWZpbmUgUEVSSU9ESUNfVFhfUFRSTl9NQVhfU0laRSAxNTM2CisjZGVmaW5lIE1BWE5VTV9QRVJJT0RJQ19UWF9QVFJOUyA2CisjZGVmaW5lIFdJRklfU0NBTk5JTkdfTUFDX09VSV9MRU5HVEggMworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKworI2RlZmluZSBXTEFOX0VYVFNDQU5fTUFYX0NIQU5ORUxTICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBXTEFOX0VYVFNDQU5fTUFYX0JVQ0tFVFMgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBXTEFOX0VYVFNDQU5fTUFYX0hPVExJU1RfQVBTICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgV0xBTl9FWFRTQ0FOX01BWF9TSUdOSUZJQ0FOVF9DSEFOR0VfQVBTICAgNjQKKyNkZWZpbmUgV0xBTl9FWFRTQ0FOX01BWF9IT1RMSVNUX1NTSURTICAgICAgICAgICAgOAorCisvKiBUaGlzIHNob3VsZCBub3QgYmUgZ3JlYXRlciB0aGFuIE1BWF9OVU1CRVJfT0ZfQ09OQ19DT05ORUNUSU9OUyAqLworI2RlZmluZSBNQVhfVkRFVl9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICA0CisKK3R5cGVkZWYgZW51bSB7CisJZVNJUl9FWFRTQ0FOX0lOVkFMSUQsCisJZVNJUl9FWFRTQ0FOX1NUQVJUX1JTUCwKKwllU0lSX0VYVFNDQU5fU1RPUF9SU1AsCisJZVNJUl9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX1JTUCwKKwllU0lSX0VYVFNDQU5fU0VUX0JTU0lEX0hPVExJU1RfUlNQLAorCWVTSVJfRVhUU0NBTl9SRVNFVF9CU1NJRF9IT1RMSVNUX1JTUCwKKwllU0lSX0VYVFNDQU5fU0VUX1NJR05JRklDQU5UX1dJRklfQ0hBTkdFX1JTUCwKKwllU0lSX0VYVFNDQU5fUkVTRVRfU0lHTklGSUNBTlRfV0lGSV9DSEFOR0VfUlNQLAorCisJZVNJUl9FWFRTQ0FOX0dFVF9DQVBBQklMSVRJRVNfSU5ELAorCWVTSVJfRVhUU0NBTl9IT1RMSVNUX01BVENIX0lORCwKKwllU0lSX0VYVFNDQU5fU0lHTklGSUNBTlRfV0lGSV9DSEFOR0VfUkVTVUxUU19JTkQsCisJZVNJUl9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX0lORCwKKwllU0lSX0VYVFNDQU5fU0NBTl9SRVNfQVZBSUxBQkxFX0lORCwKKwllU0lSX0VYVFNDQU5fU0NBTl9QUk9HUkVTU19FVkVOVF9JTkQsCisJZVNJUl9FWFRTQ0FOX0ZVTExfU0NBTl9SRVNVTFRfSU5ELAorCWVTSVJfRVBOT19ORVRXT1JLX0ZPVU5EX0lORCwKKwllU0lSX1BBU1NQT0lOVF9ORVRXT1JLX0ZPVU5EX0lORCwKKwllU0lSX0VYVFNDQU5fU0VUX1NTSURfSE9UTElTVF9SU1AsCisJZVNJUl9FWFRTQ0FOX1JFU0VUX1NTSURfSE9UTElTVF9SU1AsCisJZVNJUl9FWFRTQ0FOX0hPVExJU1RfU1NJRF9NQVRDSF9JTkQsCisKKwkvKiBLZWVwIHRoaXMgbGFzdCAqLworCWVTSVJfRVhUU0NBTl9DQUxMQkFDS19UWVBFX01BWCwKK30gdFNpckV4dFNjYW5DYWxsYmFja1R5cGU7CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVhUU0NBTiAqLworCisjZGVmaW5lIFNJUl9LUktfS0VZX0xFTiAxNgorI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKyNkZWZpbmUgU0lSX0JUS19LRVlfTEVOIDMyCisjZGVmaW5lIFNJUl9LQ0tfS0VZX0xFTiAxNgorI2RlZmluZSBTSVJfS0VLX0tFWV9MRU4gMTYKKyNkZWZpbmUgU0lSX1JFUExBWV9DVFJfTEVOIDgKKworI2RlZmluZSBTSVJfVUFQU0RfQklUT0ZGU0VUX0FDVk8gICAgIDAKKyNkZWZpbmUgU0lSX1VBUFNEX0JJVE9GRlNFVF9BQ1ZJICAgICAxCisjZGVmaW5lIFNJUl9VQVBTRF9CSVRPRkZTRVRfQUNCSyAgICAgMgorI2RlZmluZSBTSVJfVUFQU0RfQklUT0ZGU0VUX0FDQkUgICAgIDMKKworI2RlZmluZSBTSVJfVUFQU0RfRkxBR19BQ1ZPICAgICAoMSA8PCBTSVJfVUFQU0RfQklUT0ZGU0VUX0FDVk8pCisjZGVmaW5lIFNJUl9VQVBTRF9GTEFHX0FDVkkgICAgICgxIDw8IFNJUl9VQVBTRF9CSVRPRkZTRVRfQUNWSSkKKyNkZWZpbmUgU0lSX1VBUFNEX0ZMQUdfQUNCSyAgICAgKDEgPDwgU0lSX1VBUFNEX0JJVE9GRlNFVF9BQ0JLKQorI2RlZmluZSBTSVJfVUFQU0RfRkxBR19BQ0JFICAgICAoMSA8PCBTSVJfVUFQU0RfQklUT0ZGU0VUX0FDQkUpCisjZGVmaW5lIFNJUl9VQVBTRF9HRVQoYWMsIG1hc2spICAgICAgKCgobWFzaykgJiAoU0lSX1VBUFNEX0ZMQUdfICMjIGFjKSkgPj4gU0lSX1VBUFNEX0JJVE9GRlNFVF8gIyMgYWMpCisjZW5kaWYKKworLyoqCisgKiBNb2R1bGUgSUQgZGVmaW5pdGlvbnMuCisgKi8KK2VudW0geworCVNJUl9CT09UX01PRFVMRV9JRCA9IDEsCisJU0lSX0hBTF9NT0RVTEVfSUQgPSAweDEwLAorCVNJUl9DRkdfTU9EVUxFX0lEID0gMHgxMiwKKwlTSVJfTElNX01PRFVMRV9JRCwKKwlTSVJfQVJRX01PRFVMRV9JRCwKKwlTSVJfU0NIX01PRFVMRV9JRCwKKwlTSVJfUE1NX01PRFVMRV9JRCwKKwlTSVJfTU5UX01PRFVMRV9JRCwKKwlTSVJfREJHX01PRFVMRV9JRCwKKwlTSVJfRFBIX01PRFVMRV9JRCwKKwlTSVJfU1lTX01PRFVMRV9JRCwKKwlTSVJfU01TX01PRFVMRV9JRCwKK307CisKKyNkZWZpbmUgU0lSX1dNQV9NT0RVTEVfSUQgU0lSX0hBTF9NT0RVTEVfSUQKKworLyoqCisgKiBGaXJzdCBhbmQgbGFzdCBtb2R1bGUgZGVmaW5pdGlvbiBmb3IgbG9nZ2luZyB1dGlsaXR5CisgKgorICogTk9URTogIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgbmVlZCB0byBiZSB1cGRhdGVkIGlmCisgKiAgICAgICAgdGhlIGFib3ZlIGxpc3QgaXMgY2hhbmdlZC4KKyAqLworI2RlZmluZSBTSVJfRklSU1RfTU9EVUxFX0lEICAgICBTSVJfSEFMX01PRFVMRV9JRAorI2RlZmluZSBTSVJfTEFTVF9NT0RVTEVfSUQgICAgICBTSVJfU01TX01PRFVMRV9JRAorCisvKiBUeXBlIGRlY2xhcmF0aW9ucyB1c2VkIGJ5IEZpcm13YXJlIGFuZCBIb3N0IHNvZnR3YXJlICovCisKKy8qIFNjYW4gdHlwZSBlbnVtIHVzZWQgaW4gc2NhbiByZXF1ZXN0ICovCit0eXBlZGVmIGVudW0gZVNpclNjYW5UeXBlIHsKKwllU0lSX1BBU1NJVkVfU0NBTiwKKwllU0lSX0FDVElWRV9TQ0FOLAorCWVTSVJfQkVBQ09OX1RBQkxFLAorfSB0U2lyU2NhblR5cGU7CisKKy8qIC8gUmVzdWx0IGNvZGVzIEZpcm13YXJlIHJldHVybiB0byBIb3N0IFNXICovCit0eXBlZGVmIGVudW0gZVNpclJlc3VsdENvZGVzIHsKKwllU0lSX1NNRV9TVUNDRVNTLAorCWVTSVJfTE9HUF9FWENFUFRJT04sCisJZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTID0gNTAwLAorCWVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFLAorCWVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRSwKKwkvKiBVbmFibGUgdG8gZmluZCBhIEJzc0Rlc2NyaXB0aW9uICovCisJZVNJUl9TTUVfU0NBTl9GQUlMRUQsCisJLyogbWF0Y2hpbmcgcmVxdWVzdGVkIHNjYW4gY3JpdGVyaWEgKi8KKwllU0lSX1NNRV9CU1NfQUxSRUFEWV9TVEFSVEVEX09SX0pPSU5FRCwKKwllU0lSX1NNRV9MT1NUX0xJTktfV0lUSF9QRUVSX1JFU1VMVF9DT0RFLAorCWVTSVJfU01FX1JFRlVTRUQsCisJZVNJUl9TTUVfSk9JTl9ERUFVVEhfRlJPTV9BUF9EVVJJTkdfQUREX1NUQSwKKwllU0lSX1NNRV9KT0lOX1RJTUVPVVRfUkVTVUxUX0NPREUsCisJZVNJUl9TTUVfQVVUSF9USU1FT1VUX1JFU1VMVF9DT0RFLAorCWVTSVJfU01FX0FTU09DX1RJTUVPVVRfUkVTVUxUX0NPREUsCisJZVNJUl9TTUVfUkVBU1NPQ19USU1FT1VUX1JFU1VMVF9DT0RFLAorCWVTSVJfU01FX01BWF9OVU1fT0ZfUFJFX0FVVEhfUkVBQ0hFRCwKKwllU0lSX1NNRV9BVVRIX1JFRlVTRUQsCisJZVNJUl9TTUVfSU5WQUxJRF9XRVBfREVGQVVMVF9LRVksCisJZVNJUl9TTUVfTk9fS0VZX01BUFBJTkdfS0VZX0ZPUl9QRUVSLAorCWVTSVJfU01FX0FTU09DX1JFRlVTRUQsCisJZVNJUl9TTUVfUkVBU1NPQ19SRUZVU0VELAorCS8qIFJlY3ZkIERlYXV0aCB3aGlsZSBqb2luL3ByZS1hdXRoICovCisJZVNJUl9TTUVfREVBVVRIX1dISUxFX0pPSU4sCisJZVNJUl9TTUVfU1RBX05PVF9BVVRIRU5USUNBVEVELAorCWVTSVJfU01FX1NUQV9OT1RfQVNTT0NJQVRFRCwKKwllU0lSX1NNRV9BTFJFQURZX0pPSU5FRF9BX0JTUywKKwkvKiBHaXZlbiBpbiBTTUVfU0NBTl9SU1AgbXNnICovCisJZVNJUl9TTUVfTU9SRV9TQ0FOX1JFU1VMVFNfRk9MTE9XLAorCS8qIHRoYXQgbW9yZSBTTUVfU0NBTl9SU1AgKi8KKwkvKiBtZXNzYWdlcyBhcmUgZm9sbG93aW5nLiAqLworCS8qIFNNRV9TQ0FOX1JTUCBtZXNzYWdlIHdpdGggKi8KKwkvKiBlU0lSX1NNRV9TVUNDRVNTIHN0YXR1cyAqLworCS8qIGNvZGUgaXMgdGhlIGxhc3Qgb25lLiAqLworCS8qIFNlbnQgaW4gU01FX0pPSU4vUkVBU1NPQ19SU1AgKi8KKwllU0lSX1NNRV9JTlZBTElEX0FTU09DX1JTUF9SWEVELAorCS8qIG1lc3NhZ2VzIHVwb24gcmVjZWl2aW5nICovCisJLyogaW52YWxpZCBSZS9Bc3NvYyBSc3AgZnJhbWUuICovCisJLyogU1RPUCBCU1MgdHJpZ2dlcmVkIGJ5IE1JQyBmYWlsdXJlczogTUFDIHNvZnR3YXJlIHRvCisJICogZGlzYXNzb2MgYWxsIHN0YXRpb25zCisJICovCisJZVNJUl9TTUVfTUlDX0NPVU5URVJfTUVBU1VSRVMsCisJLyogd2l0aCBNSUNfRkFJTFVSRSByZWFzb24gY29kZSBhbmQgcGVyZm9ybSB0aGUgc3RvcCBic3Mgb3BlcmF0aW9uICovCisJLyogZGlkbid0IGdldCByc3AgZnJvbSBwZWVyIHdpdGhpbiB0aW1lb3V0IGludGVydmFsICovCisJZVNJUl9TTUVfQUREVFNfUlNQX1RJTUVPVVQsCisJLyogZGlkbid0IGdldCBzdWNjZXNzIHJzcCBmcm9tIEhBTCAqLworCWVTSVJfU01FX0FERFRTX1JTUF9GQUlMRUQsCisJLyogZmFpbGVkIHRvIHNlbmQgY2ggc3dpdGNoIGFjdCBmcm0gKi8KKwllU0lSX1NNRV9DSEFOTkVMX1NXSVRDSF9GQUlMLAorCWVTSVJfU01FX0lOVkFMSURfU1RBVEUsCisJLyogU0lSX0hBTF9TSVJfSEFMX0lOSVRfU0NBTl9SU1AgcmV0dXJuZWQgZmFpbGVkIHN0YXR1cyAqLworCWVTSVJfU01FX0hBTF9TQ0FOX0lOSVRfRkFJTEVELAorCS8qIFNJUl9IQUxfRU5EX1NDQU5fUlNQIHJldHVybmVkIGZhaWxlZCBzdGF0dXMgKi8KKwllU0lSX1NNRV9IQUxfU0NBTl9FTkRfRkFJTEVELAorCS8qIFNJUl9IQUxfRklOSVNIX1NDQU5fUlNQIHJldHVybmVkIGZhaWxlZCBzdGF0dXMgKi8KKwllU0lSX1NNRV9IQUxfU0NBTl9GSU5JU0hfRkFJTEVELAorCS8qIEZhaWxlZCB0byBzZW5kIGEgbWVzc2FnZSB0byBIQUwgKi8KKwllU0lSX1NNRV9IQUxfU0VORF9NRVNTQUdFX0ZBSUwsCisJLyogRmFpbGVkIHRvIHN0b3AgdGhlIGJzcyAqLworCWVTSVJfU01FX1NUT1BfQlNTX0ZBSUxVUkUsCisJZVNJUl9TTUVfV09XTF9FTlRFUl9SRVFfRkFJTEVELAorCWVTSVJfU01FX1dPV0xfRVhJVF9SRVFfRkFJTEVELAorI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgXAorCWRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwllU0lSX1NNRV9GVF9SRUFTU09DX1RJTUVPVVRfRkFJTFVSRSwKKwllU0lSX1NNRV9GVF9SRUFTU09DX0ZBSUxVUkUsCisjZW5kaWYKKwllU0lSX1NNRV9TRU5EX0FDVElPTl9GQUlMLAorCWVTSVJfU01FX0RFQVVUSF9TVEFUVVMsCisJZVNJUl9QTk9fU0NBTl9TVUNDRVNTLAorCWVTSVJfRE9OT1RfVVNFX1JFU1VMVF9DT0RFID0gU0lSX01BWF9FTlVNX1NJWkUKK30gdFNpclJlc3VsdENvZGVzOworCisvKiBlYWNoIHN0YXRpb24gYWRkZWQgaGFzIGEgcmF0ZSBtb2RlIHdoaWNoIHNwZWNpZmllcyB0aGUgc3RhIGF0dHJpYnV0ZXMgKi8KK3R5cGVkZWYgZW51bSBlU3RhUmF0ZU1vZGUgeworCWVTVEFfVEFVUlVTID0gMCwKKwllU1RBX1RJVEFOLAorCWVTVEFfUE9MQVJJUywKKwllU1RBXzExYiwKKwllU1RBXzExYmcsCisJZVNUQV8xMWEsCisJZVNUQV8xMW4sCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwllU1RBXzExYWMsCisjZW5kaWYKKwllU1RBX0lOVkFMSURfUkFURV9NT0RFCit9IHRTdGFSYXRlTW9kZSwgKnRwU3RhUmF0ZU1vZGU7CisKKy8qCisgKiBhbHRob3VnaCBpbiB0U2lyU3VwcG9ydGVkUmF0ZXMgZWFjaCBJRSBpcyAxNmJpdCBidXQgUEUgb25seSBwYXNzZXMgSUVzIGluIDgKKyAqIGJpdHMgd2l0aCBNU0I9MSBmb3IgYmFzaWMgcmF0ZXMuIGNoYW5nZSB0aGUgbWFzayBmb3IgYml0MC03IG9ubHkgc28gSEFMIGdldHMKKyAqIGNvcnJlY3QgYmFzaWMgcmF0ZXMgZm9yIHNldHRpbmcgcmVzcG9uc2UgcmF0ZXMuCisgKi8KKyNkZWZpbmUgSUVSQVRFX0JBU0lDUkFURV9NQVNLICAgICAweDgwCisjZGVmaW5lIElFUkFURV9SQVRFX01BU0sgICAgICAgICAgMHg3ZgorI2RlZmluZSBJRVJBVEVfSVNfQkFTSUNSQVRFKHgpICAgKCh4KSAmIElFUkFURV9CQVNJQ1JBVEVfTUFTSykKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclN1cHBvcnRlZFJhdGVzIHsKKwkvKgorCSAqIEZvciBTZWxmIFNUQSBFbnRyeTogdGhpcyByZXByZXNlbnRzIFNlbGYgTW9kZS4KKwkgKiBGb3IgUGVlciBTdGF0aW9ucywgdGhpcyByZXByZXNlbnRzIHRoZSBtb2RlIG9mIHRoZSBwZWVyLgorCSAqIE9uIFN0YXRpb246CisJICogLS10aGlzIG1vZGUgaXMgdXBkYXRlZCB3aGVuIFBFIGFkZHMgdGhlIFNlbGYgRW50cnkuCisJICogLS0gT1Igd2hlbiBQRSBzZW5kcyAnQUREX0JTUycgbWVzc2FnZSBhbmQgc3RhdGlvbiBjb250ZXh0IGluIEJTUyBpcworCSAqIHVzZWQgdG8gaW5kaWNhdGUgdGhlIG1vZGUgb2YgdGhlIEFQLgorCSAqIE9OIEFQOgorCSAqIC0tIHRoaXMgbW9kZSBpcyB1cGRhdGVkIHdoZW4gUEUgc2VuZHMgJ0FERF9CU1MnIGFuZCBTdGEgZW50cnkgZm9yCisJICogdGhhdCBCU1MgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgc2VsZiBtb2RlIG9mIHRoZSBBUC4KKwkgKiAtLSBPUiB3aGVuIGEgc3RhdGlvbiBpcyBhc3NvY2lhdGVkLCBQRSBzZW5kcyAnQUREX1NUQScgbWVzc2FnZSB3aXRoCisJICogdGhpcyBtb2RlIHVwZGF0ZWQuCisJICovCisKKwl0U3RhUmF0ZU1vZGUgb3BSYXRlTW9kZTsKKwkvKgorCSAqIDExYiwgMTFhIGFuZCBhbmlMZWdhY3lSYXRlcyBhcmUgSUUgcmF0ZXMgd2hpY2ggZ2l2ZXMgcmF0ZSBpbiB1bml0CisJICogb2YgNTAwS2JwcworCSAqLworCXVpbnQxNl90IGxsYlJhdGVzW1NJUl9OVU1fMTFCX1JBVEVTXTsKKwl1aW50MTZfdCBsbGFSYXRlc1tTSVJfTlVNXzExQV9SQVRFU107CisJLyoKKwkgKiAwLTc2IGJpdHMgdXNlZCwgcmVtYWluaW5nIHJlc2VydmVkCisJICogYml0cyAwLTE1IGFuZCAzMiBzaG91bGQgYmUgc2V0LgorCSAqLworCXVpbnQ4X3Qgc3VwcG9ydGVkTUNTU2V0W1NJUl9NQUNfTUFYX1NVUFBPUlRFRF9NQ1NfU0VUXTsKKworCS8qCisJICogUlggSGlnaGVzdCBTdXBwb3J0ZWQgRGF0YSBSYXRlIGRlZmluZXMgdGhlIGhpZ2hlc3QgZGF0YQorCSAqIHJhdGUgdGhhdCB0aGUgU1RBIGlzIGFibGUgdG8gcmVjZWl2ZSwgaW4gdW5pdGVzIG9mIDFNYnBzLgorCSAqIFRoaXMgdmFsdWUgaXMgZGVyaXZlZCBmcm9tICJTdXBwb3J0ZWQgTUNTIFNldCBmaWVsZCIgaW5zaWRlCisJICogdGhlIEhUIGNhcGFiaWxpdHkgZWxlbWVudC4KKwkgKi8KKwl1aW50MTZfdCByeEhpZ2hlc3REYXRhUmF0ZTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJLypJbmRpY2F0ZXMgdGhlIE1heGltdW0gTUNTIHRoYXQgY2FuIGJlIHJlY2VpdmVkIGZvciBlYWNoIG51bWJlcgorCSAgIG9mIHNwYWNpYWwgc3RyZWFtcyAqLworCXVpbnQxNl90IHZodFJ4TUNTTWFwOworCS8qSW5kaWNhdGUgdGhlIGhpZ2hlc3QgVkhUIGRhdGEgcmF0ZSB0aGF0IHRoZSBTVEEgaXMgYWJsZSB0byByZWNlaXZlICovCisJdWludDE2X3Qgdmh0UnhIaWdoZXN0RGF0YVJhdGU7CisJLypJbmRpY2F0ZXMgdGhlIE1heGltdW0gTUNTIHRoYXQgY2FuIGJlIHRyYW5zbWl0dGVkIGZvciBlYWNoIG51bWJlcgorCSAgIG9mIHNwYWNpYWwgc3RyZWFtcyAqLworCXVpbnQxNl90IHZodFR4TUNTTWFwOworCS8qSW5kaWNhdGUgdGhlIGhpZ2hlc3QgVkhUIGRhdGEgcmF0ZSB0aGF0IHRoZSBTVEEgaXMgYWJsZSB0byB0cmFuc21pdCAqLworCXVpbnQxNl90IHZodFR4SGlnaGVzdERhdGFSYXRlOworI2VuZGlmCit9IHRTaXJTdXBwb3J0ZWRSYXRlcywgKnRwU2lyU3VwcG9ydGVkUmF0ZXM7CisKK3R5cGVkZWYgZW51bSBlU2lyUkZCYW5kIHsKKwlTSVJfQkFORF9VTktOT1dOLAorCVNJUl9CQU5EXzJfNF9HSFosCisJU0lSX0JBTkRfNV9HSFosCit9IHRTaXJSRkJhbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJSZW1haW5PbkNoblJlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7CisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyOworCXVpbnQ4X3QgY2huTnVtOworCXVpbnQ4X3QgcGh5TW9kZTsKKwl1aW50MzJfdCBkdXJhdGlvbjsKKwl1aW50OF90IGlzUHJvYmVSZXF1ZXN0QWxsb3dlZDsKKwl1aW50MzJfdCBzY2FuX2lkOworCXVpbnQ4X3QgcHJvYmVSc3BJZVsxXTsKK30gdFNpclJlbWFpbk9uQ2huUmVxLCAqdHBTaXJSZW1haW5PbkNoblJlcTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX3JvY19yc3AgLSBTdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIHJlbWFpbiBvbiBjaGFubmVsIHJlc3BvbnNlCisgKiBAbWVzc2FnZV90eXBlOiBNZXNzYWdlIFR5cGUKKyAqIEBsZW5ndGg6IE1lc3NhZ2UgTGVuZ3RoCisgKiBAc2Vzc2lvbl9pZDogU01FIHNlc3Npb24gSWQKKyAqIEBzY2FuX2lkIDogc2NhbiBpZGVudGlmaWVyCisgKiBAc3RhdHVzOiByZXN1bHQgc3RhdHVzCisgKi8KK3N0cnVjdCBzaXJfcm9jX3JzcCB7CisJdWludDE2X3QgbWVzc2FnZV90eXBlOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlc3Npb25faWQ7CisJdWludDMyX3Qgc2Nhbl9pZDsKKwl0U2lyUmVzdWx0Q29kZXMgc3RhdHVzOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclJlZ2lzdGVyTWdtdEZyYW1lIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJYm9vbCByZWdpc3RlckZyYW1lOworCXVpbnQxNl90IGZyYW1lVHlwZTsKKwl1aW50MTZfdCBtYXRjaExlbjsKKwl1aW50OF90IG1hdGNoRGF0YVsxXTsKK30gdFNpclJlZ2lzdGVyTWdtdEZyYW1lLCAqdHBTaXJSZWdpc3Rlck1nbXRGcmFtZTsKKworLyogLyBHZW5lcmljIHR5cGUgZm9yIHNlbmRpbmcgYSByZXNwb25zZSBtZXNzYWdlICovCisvKiAvIHdpdGggcmVzdWx0IGNvZGUgdG8gaG9zdCBzb2Z0d2FyZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVJzcCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfKl9SU1AgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogVG8gc3VwcG9ydCBCVC1BTVAgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOyAvKiBUbyBzdXBwb3J0IEJULUFNUCAqLworCXRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlOworfSB0U2lyU21lUnNwLCAqdHBTaXJTbWVSc3A7CisKKy8qIC8gRGVmaW5pdGlvbiBmb3IgaW5kaWNhdGluZyBhbGwgbW9kdWxlcyByZWFkeSBvbiBTVEEgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVSZWFkeVJlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfU1lTX1JFQURZX0lORCAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOworCXZvaWQgKmFkZF9ic3NkZXNjcl9jYjsKK30gdFNpclNtZVJlYWR5UmVxLCAqdHBTaXJTbWVSZWFkeVJlcTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX2h3X21vZGUgLSBGb3JtYXQgb2Ygc2V0IEhXIG1vZGUKKyAqIEBod19tb2RlX2luZGV4OiBJbmRleCBvZiBIVyBtb2RlIHRvIGJlIHNldAorICogQHNldF9od19tb2RlX2NiOiBIREQgc2V0IEhXIG1vZGUgY2FsbGJhY2sKKyAqLworc3RydWN0IHNpcl9od19tb2RlIHsKKwl1aW50MzJfdCBod19tb2RlX2luZGV4OworCXZvaWQgKnNldF9od19tb2RlX2NiOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc19zaXJfc2V0X2h3X21vZGUgLSBTZXQgSFcgbW9kZSByZXF1ZXN0CisgKiBAbWVzc2FnZVR5cGU6IE1lc3NhZ2UgdHlwZQorICogQGxlbmd0aDogTGVuZ3RoIG9mIHRoZSBtZXNzYWdlCisgKiBAc2V0X2h3OiBQYXJhbXMgY29udGFpbmluZyB0aGUgSFcgbW9kZSBpbmRleCBhbmQgY2FsbGJhY2sKKyAqLworc3RydWN0IHNfc2lyX3NldF9od19tb2RlIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsKKwl1aW50MTZfdCBsZW5ndGg7CisJc3RydWN0IHNpcl9od19tb2RlIHNldF9odzsKK307CisKKy8qKgorICogc3RydWN0IHNpcl9kdWFsX21hY19jb25maWcgLSBEdWFsIE1BQyBjb25maWd1cmF0aW9uCisgKiBAc2Nhbl9jb25maWc6IFNjYW4gY29uZmlndXJhdGlvbgorICogQGZ3X21vZGVfY29uZmlnOiBGVyBtb2RlIGNvbmZpZ3VyYXRpb24KKyAqIEBzZXRfZHVhbF9tYWNfY2I6IENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uIHJlc3BvbnNlIHRvIHRoZSBjb21tYW5kCisgKi8KK3N0cnVjdCBzaXJfZHVhbF9tYWNfY29uZmlnIHsKKwl1aW50MzJfdCBzY2FuX2NvbmZpZzsKKwl1aW50MzJfdCBmd19tb2RlX2NvbmZpZzsKKwl2b2lkICpzZXRfZHVhbF9tYWNfY2I7Cit9OworCisvKioKKyAqIHN0cnVjdCBzaXJfc2V0X2R1YWxfbWFjX2NmZyAtIFNldCBEdWFsIG1hYyBjb25maWcgcmVxdWVzdAorICogQG1lc3NhZ2VfdHlwZTogTWVzc2FnZSB0eXBlCisgKiBAbGVuZ3RoOiBMZW5ndGggb2YgdGhlIG1lc3NhZ2UKKyAqIEBzZXRfZHVhbF9tYWM6IFBhcmFtcyBjb250YWluaW5nIHRoZSBkdWFsIG1hYyBjb25maWcgYW5kIGNhbGxiYWNrCisgKi8KK3N0cnVjdCBzaXJfc2V0X2R1YWxfbWFjX2NmZyB7CisJdWludDE2X3QgbWVzc2FnZV90eXBlOworCXVpbnQxNl90IGxlbmd0aDsKKwlzdHJ1Y3Qgc2lyX2R1YWxfbWFjX2NvbmZpZyBzZXRfZHVhbF9tYWM7Cit9OworCisvKiAvIEJTUyB0eXBlIGVudW0gdXNlZCBpbiB3aGlsZSBzY2FubmluZy9qb2luaW5nIGV0YyAqLwordHlwZWRlZiBlbnVtIGVTaXJCc3NUeXBlIHsKKwllU0lSX0lORlJBU1RSVUNUVVJFX01PREUsCisJZVNJUl9JTkZSQV9BUF9NT0RFLCAgICAgLyogQWRkZWQgZm9yIHNvZnRBUCBzdXBwb3J0ICovCisJZVNJUl9JQlNTX01PREUsCisJZVNJUl9CVEFNUF9TVEFfTU9ERSwgICAgLyogQWRkZWQgZm9yIEJULUFNUCBzdXBwb3J0ICovCisJZVNJUl9CVEFNUF9BUF9NT0RFLCAgICAgLyogQWRkZWQgZm9yIEJULUFNUCBzdXBwb3J0ICovCisJZVNJUl9BVVRPX01PREUsCisJZVNJUl9ET05PVF9VU0VfQlNTX1RZUEUgPSBTSVJfTUFYX0VOVU1fU0laRQorfSB0U2lyQnNzVHlwZTsKKworLyogLyBQb3dlciBDYXBhYmlsaXR5IGluZm8gdXNlZCBpbiAxMUggKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNQb3dlckNhcEluZm8geworCXVpbnQ4X3QgbWluVHhQb3dlcjsKKwl1aW50OF90IG1heFR4UG93ZXI7Cit9IHRTaXJNYWNQb3dlckNhcEluZm8sICp0cFNpck1hY1Bvd2VyQ2FwSW5mbzsKKworLyogLyBTdXBwb3J0ZWQgQ2hhbm5lbCBpbmZvIHVzZWQgaW4gMTFIICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU3VwQ2hubCB7CisJdWludDhfdCBudW1DaG5sOworCXVpbnQ4X3QgY2hhbm5lbExpc3RbU0lSX01BWF9TVVBQT1JURURfQ0hBTk5FTF9MSVNUXTsKK30gdFNpclN1cENobmwsICp0cFNpclN1cENobmw7CisKK3R5cGVkZWYgZW51bSBlU2lyTndUeXBlIHsKKwllU0lSXzExQV9OV19UWVBFLAorCWVTSVJfMTFCX05XX1RZUEUsCisJZVNJUl8xMUdfTldfVFlQRSwKKwllU0lSXzExTl9OV19UWVBFLAorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJZVNJUl8xMUFDX05XX1RZUEUsCisjZW5kaWYKKwllU0lSX0RPTk9UX1VTRV9OV19UWVBFID0gU0lSX01BWF9FTlVNX1NJWkUKK30gdFNpck53VHlwZTsKKworLyogLyBEZWZpbml0aW9uIGZvciBuZXcgaUJzcyBwZWVyIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJOZXdJYnNzUGVlckluZm8geworCXRTaXJNYWNBZGRyIHBlZXJBZGRyOworCXVpbnQxNl90IGFpZDsKK30gdFNpck5ld0lic3NQZWVySW5mbywgKnRwU2lyTmV3SWJzc1BlZXJJbmZvOworCisvKiBIVCBjb25maWd1cmF0aW9uIHZhbHVlcyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npckh0Q29uZmlnIHsKKwkvKiBFbmFibGUvRGlzYWJsZSByZWNlaXZpbmcgTERQQyBjb2RlZCBwYWNrZXRzICovCisJdWludDMyX3QgaHRfcnhfbGRwYzoxOworCS8qIEVuYWJsZS9EaXNhYmxlIFRYIFNUQkMgKi8KKwl1aW50MzJfdCBodF90eF9zdGJjOjE7CisJLyogRW5hYmxlL0Rpc2FibGUgUlggU1RCQyAqLworCXVpbnQzMl90IGh0X3J4X3N0YmM6MjsKKwkvKiBFbmFibGUvRGlzYWJsZSBTR0kgKi8KKwl1aW50MzJfdCBodF9zZ2k6MTsKKwl1aW50MzJfdCB1bnVzZWQ6Mjc7Cit9IGNkZl9wYWNrZWQgdFNpckhUQ29uZmlnLCAqdHBTaXJIVENvbmZpZzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckFkZEllUGFyYW1zIHsKKwl1aW50MTZfdCBwcm9iZVJlc3BEYXRhTGVuOworCXVpbnQ4X3QgKnByb2JlUmVzcERhdGFfYnVmZjsKKwl1aW50MTZfdCBhc3NvY1Jlc3BEYXRhTGVuOworCXVpbnQ4X3QgKmFzc29jUmVzcERhdGFfYnVmZjsKKwl1aW50MTZfdCBwcm9iZVJlc3BCQ05EYXRhTGVuOworCXVpbnQ4X3QgKnByb2JlUmVzcEJDTkRhdGFfYnVmZjsKK30gdFNpckFkZEllUGFyYW1zLCAqdHBTaXJBZGRJZVBhcmFtczsKKworLyogLyBEZWZpbml0aW9uIGZvciBraWNrIHN0YXJ0aW5nIEJTUyAqLworLyogLyAtLS0+IE1BQyAqLworLyoqCisgKiBVc2FnZSBvZiBzc0lkLCBudW1TU0lEICYgc3NJZExpc3Q6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIDEuIHNzSWQubGVuZ3RoIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgQnJvYWRjYXN0L1N1cHByZXNzIFNTSUQKKyAqICAgIGZlYXR1cmUgaXMgZW5hYmxlZC4KKyAqIDIuIElmIHNzSWQubGVuZ3RoIGlzIHplcm8sIE1BQyBTVyB3aWxsIGFkdmVydGlzZSBOVUxMIFNTSUQKKyAqICAgIGFuZCBpbnRlcnByZXQgdGhlIFNTSUQgbGlzdCBmcm9tIG51bVNTSUQgJiBzc0lkTGlzdC4KKyAqIDMuIElmIHNzSWQubGVuZ3RoIGlzIG5vbi16ZXJvLCBNQUMgU1cgd2lsbCBhZHZlcnRpc2UgdGhlIFNTSUQKKyAqICAgIHNwZWNpZmllZCBpbiB0aGUgc3NJZCBmaWVsZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdAorICogICAgYXBwbGljYXRpb24gd2lsbCBzZXQgbnVtU1NJRCB0byBvbmUgKG9ubHkgb25lIFNTSUQgcHJlc2VudAorICogICAgaW4gdGhlIGxpc3QpIGFuZCBTU0lEIGluIHRoZSBsaXN0IGlzIHNhbWUgYXMgc3NJZCBmaWVsZC4KKyAqIDQuIEFwcGxpY2F0aW9uIHdpbGwgYWx3YXlzIHNldCBudW1TU0lEID49IDEuCisgKi8KKy8qICoqKioqIE5PVEU6IFBsZWFzZSBtYWtlIHN1cmUgYWxsIGNvZGVzIGFyZSB1cGRhdGVkIGlmIGluc2VydGluZyBmaWVsZCBpbnRvCisgKiB0aGlzIHN0cnVjdHVyZS4uKioqKioqKioqKiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVN0YXJ0QnNzUmVxIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9TVEFSVF9CU1NfUkVRICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIEFkZGVkIGZvciBCVC1BTVAgU3VwcG9ydCAqLworCXVpbnQxNl90IHRyYW5zYWN0aW9uSWQ7IC8qIEFkZGVkIGZvciBCVC1BTVAgU3VwcG9ydCAqLworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIEFkZGVkIGZvciBCVC1BTVAgU3VwcG9ydCAqLworCXRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyOyAgICAgICAgLyogQWRkZWQgZm9yIEJULUFNUCBTdXBwb3J0ICovCisJdWludDE2X3QgYmVhY29uSW50ZXJ2YWw7ICAgICAgICAvKiBBZGRlZCBmb3IgQlQtQU1QIFN1cHBvcnQgKi8KKwl1aW50OF90IGRvdDExbW9kZTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwl1aW50OF90IGNjX3N3aXRjaF9tb2RlOworI2VuZGlmCisJdFNpckJzc1R5cGUgYnNzVHlwZTsKKwl0U2lyTWFjU1NpZCBzc0lkOworCXVpbnQ4X3QgY2hhbm5lbElkOworCWVQaHlDaGFuQm9uZFN0YXRlIGNiTW9kZTsKKwl1aW50OF90IHZodF9jaGFubmVsX3dpZHRoOworCXVpbnQ4X3QgY2VudGVyX2ZyZXFfc2VnMDsKKwl1aW50OF90IGNlbnRlcl9mcmVxX3NlZzE7CisJdWludDhfdCBzZWNfY2hfb2Zmc2V0OworCisJdWludDhfdCBwcml2YWN5OworCXVpbnQ4X3QgYXBVYXBzZEVuYWJsZTsKKwl1aW50OF90IHNzaWRIaWRkZW47CisJYm9vbCBmd2RXUFNQQkNQcm9iZVJlcTsKKwlib29sIHByb3RFbmFibGVkOworCWJvb2wgb2Jzc1Byb3RFbmFibGVkOworCXVpbnQxNl90IGh0X2NhcGFiOworCXRBbmlBdXRoVHlwZSBhdXRoVHlwZTsKKwl1aW50MzJfdCBkdGltUGVyaW9kOworCXVpbnQ4X3Qgd3BzX3N0YXRlOworCXVpbnQ4X3QgaXNDb2FsZXNpbmdJbklCU1NBbGxvd2VkOyAgICAgICAvKiBDb2FsZXNpbmcgb24vb2ZmIGtub2IgKi8KKwl0Q0RGX0NPTl9NT0RFIGJzc1BlcnNvbmE7CisKKwl1aW50OF90IHR4TGRwY0luaUZlYXR1cmVFbmFibGVkOworCisJdFNpclJTTmllIHJzbklFOyAgICAgICAgLyogUlNOIElFIHRvIGJlIHNlbnQgaW4gKi8KKwkvKiBCZWFjb24gYW5kIFByb2JlICovCisJLyogUmVzcG9uc2UgZnJhbWVzICovCisJdFNpck53VHlwZSBud1R5cGU7ICAgICAgLyogSW5kaWNhdGVzIDExYS9iL2cgKi8KKwl0U2lyTWFjUmF0ZVNldCBvcGVyYXRpb25hbFJhdGVTZXQ7ICAgICAgLyogSGFzIDExYSBvciAxMWIgcmF0ZXMgKi8KKwl0U2lyTWFjUmF0ZVNldCBleHRlbmRlZFJhdGVTZXQ7IC8qIEhhcyAxMWcgcmF0ZXMgKi8KKwl0U2lySFRDb25maWcgaHRDb25maWc7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJYm9vbCBwbWZDYXBhYmxlOworCWJvb2wgcG1mUmVxdWlyZWQ7CisjZW5kaWYKKworCXRTaXJBZGRJZVBhcmFtcyBhZGRJZVBhcmFtczsKKworCWJvb2wgb2Jzc0VuYWJsZWQ7CisJdWludDhfdCBzYXBfZG90MTFtYzsKKworfSB0U2lyU21lU3RhcnRCc3NSZXEsICp0cFNpclNtZVN0YXJ0QnNzUmVxOworCisjZGVmaW5lIEdFVF9JRV9MRU5fSU5fQlNTKGxlbkluQnNzKSAobGVuSW5Cc3MgKyBzaXplb2YobGVuSW5Cc3MpIC0gXAorCQkJCSAgICAoKHVpbnRwdHJfdClPRkZTRVRfT0YodFNpckJzc0Rlc2NyaXB0aW9uLFwKKwkJCQkJCQkgIGllRmllbGRzKSkpCisKKyNkZWZpbmUgV1NDSUVfUFJPQkVfUlNQX0xFTiAoMzE3ICsgMikKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckJzc0Rlc2NyaXB0aW9uIHsKKwkvKiBvZmZzZXQgb2YgdGhlIGllRmllbGRzIGZyb20gYnNzSWQuICovCisJdWludDE2X3QgbGVuZ3RoOworCXRTaXJNYWNBZGRyIGJzc0lkOworCXZfVElNRV90IHNjYW5TeXNUaW1lTXNlYzsKKwl1aW50MzJfdCB0aW1lU3RhbXBbMl07CisJdWludDE2X3QgYmVhY29uSW50ZXJ2YWw7CisJdWludDE2X3QgY2FwYWJpbGl0eUluZm87CisJdFNpck53VHlwZSBud1R5cGU7ICAgICAgLyogSW5kaWNhdGVzIDExYS9iL2cgKi8KKwl1aW50OF90IHJlc2VydmVkX3BhZGRpbmcwOworCWludDhfdCByc3NpOworCWludDhfdCBzaW5yOworCS8qIGNoYW5uZWxJZCB3aGF0IHBlZXIgc2VudCBpbiBiZWFjb24vcHJvYmVyc3AuICovCisJdWludDhfdCBjaGFubmVsSWQ7CisJLyogY2hhbm5lbElkIG9uIHdoaWNoIHdlIGFyZSBwYXJrZWQgYXQuICovCisJLyogdXNlZCBvbmx5IGluIHNjYW4gY2FzZS4gKi8KKwl1aW50OF90IGNoYW5uZWxJZFNlbGY7CisJdWludDhfdCBzU2lyQnNzRGVzY3JpcHRpb25Sc3ZkWzNdOworCS8qIGJhc2Ugb24gYSB0aWNrIGNvdW50LiBJdCBpcyBhIHRpbWUgc3RhbXAsIG5vdCBhIHJlbGF0aXZlIHRpbWUuICovCisJdWludDMyX3QgblJlY2VpdmVkVGltZTsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwl1aW50MzJfdCBwYXJlbnRUU0Y7CisJdWludDMyX3Qgc3RhcnRUU0ZbMl07CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCXVpbnQ4X3QgbWRpZVByZXNlbnQ7CisJLyogTURJRSBmb3IgMTFyLCBwaWNrZWQgZnJvbSB0aGUgYmVhY29ucyAqLworCXVpbnQ4X3QgbWRpZVtTSVJfTURJRV9TSVpFXTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwl1aW50MTZfdCBRQlNTTG9hZF9wcmVzZW50OworCXVpbnQxNl90IFFCU1NMb2FkX2F2YWlsOworCS8qIFRvIGFjaGlldmUgOC1ieXRlIGFsaWdubWVudCB3aXRoIEVTRSBlbmFibGVkICovCisJdWludDMyX3QgcmVzZXJ2ZWRQYWRkaW5nNTsKKyNlbmRpZgorCS8qIFBsZWFzZSBrZWVwIHRoZSBzdHJ1Y3R1cmUgNCBieXRlcyBhbGlnbmVkIGFib3ZlIHRoZSBpZUZpZWxkcyAqLworCisJLyogd2hldGhlciBpdCBpcyBmcm9tIGEgcHJvYmUgcnNwICovCisJdWludDhfdCBmUHJvYmVSc3A7CisJdWludDhfdCByZXNlcnZlZFBhZGRpbmcxOworCXVpbnQ4X3QgcmVzZXJ2ZWRQYWRkaW5nMjsKKwl1aW50OF90IHJlc2VydmVkUGFkZGluZzM7CisJdWludDMyX3QgV3NjSWVMZW47CisJdWludDhfdCBXc2NJZVByb2JlUnNwW1dTQ0lFX1BST0JFX1JTUF9MRU5dOworCXVpbnQ4X3QgcmVzZXJ2ZWRQYWRkaW5nNDsKKwl1aW50MzJfdCB0c2ZfZGVsdGE7CisKKwl1aW50MzJfdCBpZUZpZWxkc1sxXTsKK30gdFNpckJzc0Rlc2NyaXB0aW9uLCAqdHBTaXJCc3NEZXNjcmlwdGlvbjsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZUhUUHJvZmlsZSB7CisJdWludDhfdCBkb3QxMW1vZGU7CisJdWludDhfdCBodENhcGFiaWxpdHk7CisJdWludDhfdCBodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKwl1aW50OF90IGh0UmVjb21tZW5kZWRUeFdpZHRoU2V0OworCWVQaHlDaGFuQm9uZFN0YXRlIGh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCXVpbnQ4X3Qgdmh0Q2FwYWJpbGl0eTsKKwl1aW50OF90IHZodFR4Q2hhbm5lbFdpZHRoU2V0OworCXVpbnQ4X3QgYXBDZW50ZXJDaGFuOworCXVpbnQ4X3QgYXBDaGFuV2lkdGg7CisjZW5kaWYKK30gdFNpclNtZUhUUHJvZmlsZTsKKyNlbmRpZgorLyogLyBEZWZpbml0aW9uIGZvciByZXNwb25zZSBtZXNzYWdlIHRvIHByZXZpb3VzbHkgKi8KKy8qIC8gaXNzdWVkIHN0YXJ0IEJTUyByZXF1ZXN0ICovCisvKiAvIE1BQyAtLS0+ICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lU3RhcnRCc3NSc3AgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX1NUQVJUX0JTU19SU1AgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDE2X3QgdHJhbnNhY3Rpb25JZDsgLyogdHJhbnNhY3Rpb24gSUQgZm9yIGNtZCAqLworCXRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlOworCXRTaXJCc3NUeXBlIGJzc1R5cGU7ICAgIC8qIEFkZCBuZXcgdHlwZSBmb3IgV0RTIG1vZGUgKi8KKwl1aW50MTZfdCBiZWFjb25JbnRlcnZhbDsgICAgICAgIC8qIEJlYWNvbiBJbnRlcnZhbCBmb3IgYm90aCB0eXBlICovCisJdWludDMyX3Qgc3RhSWQ7ICAgICAgICAgLyogU3RhaW9uIElEIGZvciBTZWxmICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisJdFNpclNtZUhUUHJvZmlsZSBIVFByb2ZpbGU7CisjZW5kaWYKKwl0U2lyQnNzRGVzY3JpcHRpb24gYnNzRGVzY3JpcHRpb247ICAgICAgLyogUGVlciBCU1MgZGVzY3JpcHRpb24gKi8KK30gdFNpclNtZVN0YXJ0QnNzUnNwLCAqdHBTaXJTbWVTdGFydEJzc1JzcDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckNoYW5uZWxMaXN0IHsKKwl1aW50OF90IG51bUNoYW5uZWxzOworCXVpbnQ4X3QgY2hhbm5lbE51bWJlcltTSVJfRVNFX01BWF9NRUFTX0lFX1JFUVNdOworfSB0U2lyQ2hhbm5lbExpc3QsICp0cFNpckNoYW5uZWxMaXN0OworCit0eXBlZGVmIHN0cnVjdCBzU2lyREZTQ2hhbm5lbExpc3QgeworCXVpbnQzMl90IHRpbWVTdGFtcFtTSVJfTUFYXzI0R181R19DSEFOTkVMX1JBTkdFXTsKKworfSB0U2lyREZTQ2hhbm5lbExpc3QsICp0cFNpckRGU0NoYW5uZWxMaXN0OworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQordHlwZWRlZiBzdHJ1Y3Qgc1RzcGVjSW5mbyB7CisJdWludDhfdCB2YWxpZDsKKwl0U2lyTWFjVHNwZWNJRSB0c3BlYzsKK30gdFRzcGVjSW5mbzsKKworI2RlZmluZSBTSVJfRVNFX01BWF9UU1BFQ19JRVMgICA0Cit0eXBlZGVmIHN0cnVjdCBzRVNFVHNwZWNUc3BlY0luZm8geworCXVpbnQ4X3QgbnVtVHNwZWNzOworCXRUc3BlY0luZm8gdHNwZWNbU0lSX0VTRV9NQVhfVFNQRUNfSUVTXTsKK30gdEVTRVRzcGVjSW5mbzsKKyNlbmRpZgorCisvKiAvIFR3byBCYWNrZ3JvdW5kIFNjYW4gbW9kZSAqLwordHlwZWRlZiBlbnVtIGVTaXJCYWNrZ3JvdW5kU2Nhbk1vZGUgeworCWVTSVJfUk9BTUlOR19TQ0FOID0gMiwKK30gdFNpckJhY2tncm91bmRTY2FuTW9kZTsKKworLyogLyBUd28gdHlwZXMgb2YgdHJhZmZpYyBjaGVjayAqLwordHlwZWRlZiBlbnVtIGVTaXJMaW5rVHJhZmZpY0NoZWNrIHsKKwllU0lSX0RPTlRfQ0hFQ0tfTElOS19UUkFGRklDX0JFRk9SRV9TQ0FOID0gMCwKKwllU0lSX0NIRUNLX0xJTktfVFJBRkZJQ19CRUZPUkVfU0NBTiA9IDEsCisJZVNJUl9DSEVDS19ST0FNSU5HX1NDQU4gPSAyLAorfSB0U2lyTGlua1RyYWZmaWNDaGVjazsKKworI2RlZmluZSBTSVJfQkdfU0NBTl9SRVRVUk5fQ0FDSEVEX1JFU1VMVFMgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBTSVJfQkdfU0NBTl9QVVJHRV9SRVNVVExTICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgU0lSX0JHX1NDQU5fUkVUVVJOX0ZSRVNIX1JFU1VMVFMgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFNJUl9TQ0FOX01BWF9OVU1fU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBTSVJfQkdfU0NBTl9SRVRVUk5fTEZSX0NBQ0hFRF9SRVNVTFRTICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU0lSX0JHX1NDQU5fUFVSR0VfTEZSX1JFU1VMVFMgICAgICAgICAgICAgICAgICAweDQwCisKKy8qIC8gRGVmaW5pdGlvbiBmb3Igc2NhbiByZXF1ZXN0ICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lU2NhblJlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfU0NBTl9SRVEgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXVpbnQxNl90IHRyYW5zYWN0aW9uSWQ7IC8qIFRyYW5zYWN0aW9uIElEIGZvciBjbWQgKi8KKwl0U2lyTWFjQWRkciBic3NJZDsKKwl0U2lyTWFjU1NpZCBzc0lkW1NJUl9TQ0FOX01BWF9OVU1fU1NJRF07CisJdFNpck1hY0FkZHIgc2VsZk1hY0FkZHI7ICAgICAgICAvKiBBZGRlZCBGb3IgQlQtQU1QIFN1cHBvcnQgKi8KKwl0U2lyQnNzVHlwZSBic3NUeXBlOworCXVpbnQ4X3QgZG90MTFtb2RlOworCXRTaXJTY2FuVHlwZSBzY2FuVHlwZTsKKwl1aW50MzJfdCBzY2FuX2lkOworCS8qKgorCSAqIG1pbkNoYW5uZWxUaW1lLiBOb3QgdXNlZCBpZiBzY2FuVHlwZSBpcyBwYXNzaXZlLgorCSAqIDB4MCAtIERvbnQgVXNlIG1pbiBjaGFubmVsIHRpbWVyLiBPbmx5IG1heCBjaGFubmVsIHRpbWVvdXQgd2lsbCB1c2VkLgorCSAqIDExayBtZWFzdXJlbWVudHMgc2V0IHRoaXMgdG8gMCB0byB1c2VyIG9ubHkgc2luZ2xlIGR1cmF0aW9uIGZvciBzY2FuLgorCSAqIDx2YWxpZCB0aW1lb3V0PiAtIFRpbWVvdXQgdmFsdWUgdXNlZCBmb3IgbWluIGNoYW5uZWwgdGltZW91dC4KKwkgKi8KKwl1aW50MzJfdCBtaW5DaGFubmVsVGltZTsKKwkvKioKKwkgKiBtYXhDaGFubmVsVGltZS4KKwkgKiAweDAgLSBJbnZhbGlkLiBJbiBjYXNlIG9mIGFjdGl2ZSBzY2FuLgorCSAqIEluIGNhc2Ugb2YgcGFzc2l2ZSBzY2FuLCBNQVgoIG1heENoYW5uZWxUaW1lLAorCSAqIFdOSV9DRkdfUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSkgaXMgdXNlZC4KKwkgKi8KKwl1aW50MzJfdCBtYXhDaGFubmVsVGltZTsKKwkvKioKKwkgKiByZXR1cm5BZnRlckZpcnN0TWF0Y2ggY2FuIHRha2UgZm9sbG93aW5nIHZhbHVlczoKKwkgKiAweDAwIC0gUmV0dXJuIFNDQU5fUlNQIG1lc3NhZ2UgYWZ0ZXIgY29tcGxldGUgY2hhbm5lbCBzY2FuCisJICogMHgwMSAtICBSZXR1cm4gU0NBTl9SU1AgbWVzc2FnZSBhZnRlciBjb2xsZWN0aW5nIEJTUyBkZXNjcmlwdGlvbgorCSAqICAgICAgICB0aGF0IG1hdGNoZXMgc2NhbiBjcml0ZXJpYS4KKwkgKiAweEMwIC0gUmV0dXJuIGFmdGVyIGNvbGxlY3RpbmcgZmlyc3QgMTFkIElFIGZyb20gMi40IEdIeiAmCisJICogICAgICAgIDUgR0h6IGJhbmQgY2hhbm5lbHMKKwkgKiAweDgwIC0gUmV0dXJuIGFmdGVyIGNvbGxlY3RpbmcgZmlyc3QgMTFkIElFIGZyb20gNSBHSHogYmFuZAorCSAqICAgICAgICBjaGFubmVscworCSAqIDB4NDAgLSBSZXR1cm4gYWZ0ZXIgY29sbGVjdGluZyBmaXJzdCAxMWQgSUUgZnJvbSAyLjQgR0h6CisJICogICAgICAgIGJhbmQgY2hhbm5lbHMKKwkgKgorCSAqIFZhbHVlcyBvZiAweEMwLCAweDgwICYgMHg0MCBhcmUgdG8gYmUgdXNlZCBieQorCSAqIFJvYW1pbmcvYXBwbGljYXRpb24gd2hlbiAxMWQgaXMgZW5hYmxlZC4KKwkgKi8KKwkvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMsIGlnbm9yZWQgd2hlbiBub3QgY29ubmVjdGVkICovCisJdWludDMyX3QgcmVzdFRpbWU7CisJdWludDhfdCByZXR1cm5BZnRlckZpcnN0TWF0Y2g7CisKKwkvKioKKwkgKiByZXR1cm5VbmlxdWVSZXN1bHRzIGNhbiB0YWtlIGZvbGxvd2luZyB2YWx1ZXM6CisJICogMCAtIENvbGxlY3QgJiByZXBvcnQgYWxsIHJlY2VpdmVkIEJTUyBkZXNjcmlwdGlvbnMgZnJvbSBzYW1lIEJTUy4KKwkgKiAxIC0gQ29sbGVjdCAmIHJlcG9ydCB1bmlxdWUgQlNTIGRlc2NyaXB0aW9uIGZyb20gc2FtZSBCU1MuCisJICovCisJdWludDhfdCByZXR1cm5VbmlxdWVSZXN1bHRzOworCisJLyoqCisJICogcmV0dXJuRnJlc2hSZXN1bHRzIGNhbiB0YWtlIGZvbGxvd2luZyB2YWx1ZXM6CisJICogMHgwMCAtIFJldHVybiBiYWNrZ3JvdW5kIHNjYW4gcmVzdWx0cy4KKwkgKiAweDgwIC0gUmV0dXJuICYgcHVyZ2UgYmFja2dyb3VuZCBzY2FuIHJlc3VsdHMKKwkgKiAweDAxIC0gVHJpZ2dlciBmcmVzaCBzY2FuIGluc3RlYWQgb2YgcmV0dXJuaW5nIGJhY2tncm91bmQgc2NhbgorCSAqICAgICAgICByZXN1bHRzLgorCSAqIDB4ODEgLSBUcmlnZ2VyIGZyZXNoIHNjYW4gaW5zdGVhZCBvZiByZXR1cm5pbmcgYmFja2dyb3VuZCBzY2FuCisJICogICAgICAgIHJlc3VsdHMgYW5kIHB1cmdlIGJhY2tncm91bmQgc2NhbiByZXN1bHRzLgorCSAqLworCXVpbnQ4X3QgcmV0dXJuRnJlc2hSZXN1bHRzOworCisJLyogIGJhY2tncm91bmRTY2FuTW9kZSBjYW4gdGFrZSBmb2xsb3dpbmcgdmFsdWVzOgorCSAqICAweDAgLSBhZ3Jlc3NpdmUgc2NhbgorCSAqICAweDEgLSBub3JtYWwgc2NhbiB3aGVyZSBIQUwgd2lsbCBjaGVjayBmb3IgbGluayB0cmFmZmljCisJICogICAgICAgIHByaW9yIHRvIHByb2NlZWRpbmcgd2l0aCB0aGUgc2NhbgorCSAqLworCXRTaXJCYWNrZ3JvdW5kU2Nhbk1vZGUgYmFja2dyb3VuZFNjYW5Nb2RlOworCisJdWludDhfdCBoaWRkZW5Tc2lkOworCisJLyogTnVtYmVyIG9mIFNTSURzIHRvIHNjYW4gKi8KKwl1aW50OF90IG51bVNzaWQ7CisKKwkvKiBjaGFubmVsTGlzdCBoYXMgdG8gYmUgdGhlIGxhc3QgbWVtYmVyIG9mIHRoaXMgc3RydWN0dXJlLiBDaGVjaworCSAqIHRTaXJDaGFubmVsTGlzdCBmb3IgdGhlIHJlYXNvbi4gVGhpcyBNVVNUIGJlIHRoZSBsYXN0IGZpZWxkIG9mIHRoZQorCSAqIHN0cnVjdHVyZQorCSAqLworCisJYm9vbCBwMnBTZWFyY2g7CisJdWludDE2X3QgdUlFRmllbGRMZW47CisJdWludDE2X3QgdUlFRmllbGRPZmZzZXQ7CisKKwkvKiBjaGFubmVsTGlzdCBNVVNUIGJlIHRoZSBsYXN0IGZpZWxkIG9mIHRoaXMgc3RydWN0dXJlICovCisJdFNpckNoYW5uZWxMaXN0IGNoYW5uZWxMaXN0OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICB0U2lyU21lU2NhblJlcS4uLi4KKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIHVJRUZpbGVkTGVuCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICB1SUVGaWxlZE9mZnNldCAgICAgICAgICAgICAgIC0tLS0rCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgfAorCSAgIGNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzICAgICAgICAgIHwKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICB8CisJICAgLi4uIHZhcmlhYmxlIHNpemUgdXAgdG8gICAgICAgICAgfAorCSAgIGNoYW5uZWxOdW1iZXJbbnVtQ2hhbm5lbHMtMV0gICAgIHwKKwkgICBUaGlzIGNhbiBiZSB6ZXJvLCBpZiAgICAgICAgICAgICB8CisJICAgbnVtQ2hhbm5lbCBpcyB6ZXJvLiAgICAgICAgICAgICAgfAorCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwtLSsKKwkgICAuLi4gdmFyaWFibGUgc2l6ZSB1SUVGaWxlZAorCSAgIHVwIHRvIHVJRUZpZWxkTGVuIChjYW4gYmUgMCkKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9IHRTaXJTbWVTY2FuUmVxLCAqdHBTaXJTbWVTY2FuUmVxOworCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lU2NhbkFib3J0UmVxIHsKKwl1aW50MTZfdCB0eXBlOworCXVpbnQxNl90IG1zZ0xlbjsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50MzJfdCBzY2FuX2lkOworfSB0U2lyU21lU2NhbkFib3J0UmVxLCAqdHBTaXJTbWVTY2FuQWJvcnRSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTY2FuQ2hhblJlcSB7CisJdWludDE2X3QgdHlwZTsKKwl1aW50MTZfdCBtc2dMZW47CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDE2X3QgdHJhbnNjYXRpb25JZDsKK30gdFNpclNtZUdldFNjYW5DaGFuUmVxLCAqdHBTaXJTbWVHZXRTY2FuQ2hhblJlcTsKKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCisjaWZuZGVmIE9FTV9EQVRBX1JFUV9TSVpFCisjZGVmaW5lIE9FTV9EQVRBX1JFUV9TSVpFIDI4MAorI2VuZGlmCisjaWZuZGVmIE9FTV9EQVRBX1JTUF9TSVpFCisjZGVmaW5lIE9FTV9EQVRBX1JTUF9TSVpFIDE3MjQKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzU2lyT2VtRGF0YVJlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfT0VNX0RBVEFfUkVRICovCisJdWludDE2X3QgbWVzc2FnZUxlbjsKKwl0U2lyTWFjQWRkciBzZWxmTWFjQWRkcjsKKwl1aW50OF90IG9lbURhdGFSZXFbT0VNX0RBVEFfUkVRX1NJWkVdOworfSB0U2lyT2VtRGF0YVJlcSwgKnRwU2lyT2VtRGF0YVJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck9lbURhdGFSc3AgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IG9lbURhdGFSc3BbT0VNX0RBVEFfUlNQX1NJWkVdOworfSB0U2lyT2VtRGF0YVJzcCwgKnRwU2lyT2VtRGF0YVJzcDsKKworI2VuZGlmIC8qIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVCAqLworCisvKiAvIERlZmluaXRpb24gZm9yIHJlc3BvbnNlIG1lc3NhZ2UgdG8gcHJldmlvdXNseSBpc3N1ZWQgc2NhbiByZXF1ZXN0ICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lU2NhblJzcCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfU0NBTl9SU1AgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisJdWludDE2X3QgdHJhbnNjYXRpb25JZDsKKwl1aW50MzJfdCBzY2FuX2lkOworfSB0U2lyU21lU2NhblJzcCwgKnRwU2lyU21lU2NhblJzcDsKKworLyogLyBEZWZpbml0aW9uIGZvciBqb2luIHJlcXVlc3QgKi8KKy8qIC8gLS0tPiBNQUMgKi8KKy8qIC8gV0FSTklORyEgSWYgeW91IGFkZCBhIGZpZWxkIGluIEpPSU4gUkVRLiAqLworLyogLyAgICAgICAgIE1ha2Ugc3VyZSB0byBhZGQgaXQgaW4gUkVBU1NPQyBSRVEgKi8KKy8qIC8gVGhlIFNlcmRlcyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhbmQgaXRzICovCisvKiAvIHNoYXJlZCB3aXRoIFJFQVNTT0MuIFNvIGlmIHdlIGFkZCBhIGZpZWxkICovCisvKiAgaGVyZSBhbmQgZG9udCBhZGQgaXQgaW4gUkVBU1NPQyBSRVEuIEl0IHdpbGwgQlJFQUshISEgUkVBU1NPQy4gKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVKb2luUmVxIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9KT0lOX1JFUSAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOworCXRTaXJNYWNTU2lkIHNzSWQ7CisJdFNpck1hY0FkZHIgc2VsZk1hY0FkZHI7ICAgICAgICAvKiBzZWxmIE1hYyBhZGRyZXNzICovCisJdFNpckJzc1R5cGUgYnNzdHlwZTsgICAgLyogYWRkIG5ldyB0eXBlIGZvciBCVC1BTVAgU1RBIGFuZCBBUCBNb2R1bGVzICovCisJdWludDhfdCBkb3QxMW1vZGU7ICAgICAgLyogdG8gc3VwcG9ydCBCVC1BTVAgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwl1aW50OF90IGNjX3N3aXRjaF9tb2RlOworI2VuZGlmCisJdENERl9DT05fTU9ERSBzdGFQZXJzb25hOyAgICAgICAvKiBQZXJzb25hICovCisJZVBoeUNoYW5Cb25kU3RhdGUgY2JNb2RlOyAgICAgICAvKiBQYXNzIENCIG1vZGUgdmFsdWUgaW4gSm9pbi4gKi8KKworCS8qVGhpcyBjb250YWlucyB0aGUgVUFQU0QgRmxhZyBmb3IgYWxsIDQgQUMKKwkgKiBCMDogQUNfVk8gVUFQU0QgRkxBRworCSAqIEIxOiBBQ19WSSBVQVBTRCBGTEFHCisJICogQjI6IEFDX0JLIFVBUFNEIEZMQUcKKwkgKiBCMzogQUNfQkUgVUFTUEQgRkxBRworCSAqLworCXVpbnQ4X3QgdWFwc2RQZXJBY0JpdG1hc2s7CisKKwl0U2lyTWFjUmF0ZVNldCBvcGVyYXRpb25hbFJhdGVTZXQ7ICAgICAgLyogSGFzIDExYSBvciAxMWIgcmF0ZXMgKi8KKwl0U2lyTWFjUmF0ZVNldCBleHRlbmRlZFJhdGVTZXQ7IC8qIEhhcyAxMWcgcmF0ZXMgKi8KKwl0U2lyUlNOaWUgcnNuSUU7ICAgICAgICAvKiBSU04gSUUgdG8gYmUgc2VudCBpbiAqLworCS8qIChSZSkgQXNzb2NpYXRpb24gUmVxdWVzdCAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkvKiBDQ01LIElFIHRvIGJlIGluY2x1ZGVkIGFzIGhhbmRsZXIgZm9yIGpvaW4gYW5kIHJlYXNzb2MgaXMgKi8KKwl0U2lyQ0NLTWllIGNja21JRTsKKwkvKiB0aGUgc2FtZS4gVGhlIGpvaW4gd2lsbCBuZXZlciBjYXJyeSBjY2ttLCBidXQgd2lsbCBiZSBzZXQgdG8gKi8KKwkvKiAwLiAqLworI2VuZGlmCisKKwl0U2lyQWRkaWUgYWRkSUVTY2FuOyAgICAvKiBBZGRpdGlvbmFsIElFIHRvIGJlIHNlbnQgaW4gKi8KKwkvKiAodW5pY2FzdCkgUHJvYmUgUmVxdWVzdCBhdCB0aGUgdGltZSBvZiBqb2luICovCisKKwl0U2lyQWRkaWUgYWRkSUVBc3NvYzsgICAvKiBBZGRpdGlvbmFsIElFIHRvIGJlIHNlbnQgaW4gKi8KKwkvKiAoUmUpIEFzc29jaWF0aW9uIFJlcXVlc3QgKi8KKworCXRBbmlFZFR5cGUgVUNFbmNyeXB0aW9uVHlwZTsKKworCXRBbmlFZFR5cGUgTUNFbmNyeXB0aW9uVHlwZTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwl0QW5pRWRUeXBlIE1nbXRFbmNyeXB0aW9uVHlwZTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwl0QW5pQm9vbCBpczExUmNvbm5lY3Rpb247CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJdEFuaUJvb2wgaXNFU0VGZWF0dXJlSW5pRW5hYmxlZDsKKwl0QW5pQm9vbCBpc0VTRWNvbm5lY3Rpb247CisJdEVTRVRzcGVjSW5mbyBlc2VUc3BlY0luZm87CisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgfHwgZGVmaW5lZCBGRUFUVVJFX1dMQU5fRVNFIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwl0QW5pQm9vbCBpc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwl0QW5pQm9vbCBpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKKworCXVpbnQ4X3QgdHhMZHBjSW5pRmVhdHVyZUVuYWJsZWQ7CisJdFNpckhUQ29uZmlnIGh0Q29uZmlnOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJdWludDhfdCB0eEJGSW5pRmVhdHVyZUVuYWJsZWQ7CisJdWludDhfdCB0eEJGQ3NuVmFsdWU7CisJdWludDhfdCB0eE11QmZvcm1lZTsKKwl1aW50OF90IGVuYWJsZVZodHBBaWQ7CisJdWludDhfdCBlbmFibGVWaHRHaWQ7CisjZW5kaWYKKwl1aW50OF90IGVuYWJsZUFtcGR1UHM7CisJdWludDhfdCBlbmFibGVIdFNtcHM7CisJdWludDhfdCBodFNtcHM7CisKKwl1aW50OF90IGlzQW1zZHVTdXBwb3J0SW5BTVBEVTsKKwl0QW5pQm9vbCBpc1dNRWVuYWJsZWQ7CisJdEFuaUJvb2wgaXNRb3NFbmFibGVkOworCXRBbmlCb29sIGlzT1NFTkNvbm5lY3Rpb247CisJdEFuaUJvb2wgc3BlY3RydW1NZ3RJbmRpY2F0b3I7CisJdFNpck1hY1Bvd2VyQ2FwSW5mbyBwb3dlckNhcDsKKwl0U2lyU3VwQ2hubCBzdXBwb3J0ZWRDaGFubmVsczsKKwl0U2lyQnNzRGVzY3JpcHRpb24gYnNzRGVzY3JpcHRpb247CisKK30gdFNpclNtZUpvaW5SZXEsICp0cFNpclNtZUpvaW5SZXE7CisKKy8qIC8gRGVmaW5pdGlvbiBmb3IgcmVwb25zZSBtZXNzYWdlIHRvIHByZXZpb3VzbHkgaXNzdWVkIGpvaW4gcmVxdWVzdCAqLworLyogLyBNQUMgLS0tPiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZUpvaW5Sc3AgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX0pPSU5fUlNQICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOyAvKiBUcmFuc2FjdGlvbiBJRCBmb3IgY21kICovCisJdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisJdEFuaUF1dGhUeXBlIGF1dGhUeXBlOworCXVpbnQzMl90IHZodF9jaGFubmVsX3dpZHRoOworCS8qIEl0IGhvbGRzIHJlYXNvbkNvZGUgd2hlbiBqb2luIGZhaWxzIGR1ZSB0byBkZWF1dGgvZGlzYXNzb2MgZnJhbWUuCisJICogT3RoZXJ3aXNlIGl0IGhvbGRzIHN0YXR1cyBjb2RlLgorCSAqLworCXVpbnQxNl90IHByb3RTdGF0dXNDb2RlOworCXVpbnQxNl90IGFpZDsKKwl1aW50MzJfdCBiZWFjb25MZW5ndGg7CisJdWludDMyX3QgYXNzb2NSZXFMZW5ndGg7CisJdWludDMyX3QgYXNzb2NSc3BMZW5ndGg7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwl1aW50MzJfdCBwYXJzZWRSaWNSc3BMZW47CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJdWludDMyX3QgdHNwZWNJZUxlbjsKKyNlbmRpZgorCXVpbnQzMl90IHN0YUlkOyAgICAgICAgIC8qIFN0YXRpb24gSUQgZm9yIHBlZXIgKi8KKworCS8qIFRoZSBEUFUgc2lnbmF0dXJlcyB3aWxsIGJlIHNlbnQgZXZlbnR1YWxseSB0byBUTCB0byBoZWxwIGl0IGRldGVybWluZQorCSAqIHRoZSBhc3NvY2lhdGlvbiB0byB3aGljaCBhIHBhY2tldCBiZWxvbmdzIHRvCisJICogVW5pY2FzdCBEUFUgc2lnbmF0dXJlCisJICovCisJdWludDhfdCB1Y2FzdFNpZzsKKworCS8qQnJvYWRjYXN0IERQVSBzaWduYXR1cmUgKi8KKwl1aW50OF90IGJjYXN0U2lnOworCisJLypUaW1pbmcgbWVhc3VyZW1lbnQgY2FwYWJpbGl0eSAqLworCXVpbnQ4X3QgdGltaW5nTWVhc0NhcDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJLyogVERMUyBwcm9oaWJpdGVkIGFuZCBURExTIGNoYW5uZWwgc3dpdGNoIHByb2hpYml0ZWQgYXJlIHNldCBhcworCSAqIHBlciBFeHRDYXAgSUUgaW4gcmVjZWl2ZWQgYXNzb2MvcmUtYXNzb2MgcmVzcG9uc2UgZnJvbSBBUAorCSAqLworCWJvb2wgdGRsc19wcm9oaWJpdGVkOworCWJvb2wgdGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCXRTaXJTbWVIVFByb2ZpbGUgSFRQcm9maWxlOworI2VuZGlmCisJdWludDhfdCBmcmFtZXNbMV07Cit9IHRTaXJTbWVKb2luUnNwLCAqdHBTaXJTbWVKb2luUnNwOworCisvKiAvIHByb2JlcmVxIGZyb20gcGVlciwgd2hlbiB3c2MgaXMgZW5hYmxlZCAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVByb2JlcmVxIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisJdWludDE2X3QgZGV2aWNlUGFzc3dkSWQ7Cit9IHRTaXJTbWVQcm9iZVJlcSwgKnRwU2lyU21lUHJvYmVSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVDaGFuSW5mbyB7CisJdWludDhfdCBjaGFuX2lkOworCXVpbnQzMl90IG1oejsKKwl1aW50MzJfdCBiYW5kX2NlbnRlcl9mcmVxMTsKKwl1aW50MzJfdCBiYW5kX2NlbnRlcl9mcmVxMjsKKwl1aW50MzJfdCBpbmZvOworCXVpbnQzMl90IHJlZ19pbmZvXzE7CisJdWludDMyX3QgcmVnX2luZm9fMjsKK30gdFNpclNtZUNoYW5JbmZvLCAqdHBTaXJTbWVDaGFuSW5mbzsKKy8qIC8gRGVmaW5pdGlvbiBmb3IgQXNzb2NpYXRpb24gaW5kaWNhdGlvbiBmcm9tIHBlZXIgKi8KKy8qIC8gTUFDIC0tLT4gKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVBc3NvY0luZCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfQVNTT0NfSU5EICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXVpbnQxNl90IGFpZDsKKwl0U2lyTWFjQWRkciBic3NJZDsgICAgICAvKiBTZWxmIEJTU0lEICovCisJdWludDE2X3Qgc3RhSWQ7ICAgICAgICAgLyogU3RhdGlvbiBJRCBmb3IgcGVlciAqLworCXVpbnQ4X3QgdW5pU2lnOyAgICAgICAgIC8qIERQVSBzaWduYXR1cmUgZm9yIHVuaWNhc3QgcGFja2V0cyAqLworCXVpbnQ4X3QgYmNhc3RTaWc7ICAgICAgIC8qIERQVSBzaWduYXR1cmUgZm9yIGJyb2FkY2FzdCBwYWNrZXRzICovCisJdEFuaUF1dGhUeXBlIGF1dGhUeXBlOworCXRBbmlTU0lEIHNzSWQ7ICAgICAgICAgIC8qIFNTSUQgdXNlZCBieSBTVEEgdG8gYXNzb2NpYXRlICovCisJdFNpcldBUElpZSB3YXBpSUU7ICAgICAgLyogV0FQSSBJRSByZWNlaXZlZCBmcm9tIHBlZXIgKi8KKwl0U2lyUlNOaWUgcnNuSUU7ICAgICAgICAvKiBSU04gSUUgcmVjZWl2ZWQgZnJvbSBwZWVyICovCisJLyogQWRkaXRpb25hbCBJRSByZWNlaXZlZCBmcm9tIHBlZXIsIHdoaWNoIHBvc3NpYmx5IGluY2x1ZGUKKwkgKiBXU0MgSUUgYW5kL29yIFAyUCBJRQorCSAqLworCXRTaXJBZGRpZSBhZGRJRTsKKworCS8qIHBvd2VyQ2FwICYgc3VwcG9ydGVkQ2hhbm5lbHMgYXJlIHByZXNlbnQgb25seSB3aGVuICovCisJLyogc3BlY3RydW1NZ3RJbmRpY2F0b3IgZmxhZyBpcyBzZXQgKi8KKwl0QW5pQm9vbCBzcGVjdHJ1bU1ndEluZGljYXRvcjsKKwl0U2lyTWFjUG93ZXJDYXBJbmZvIHBvd2VyQ2FwOworCXRTaXJTdXBDaG5sIHN1cHBvcnRlZENoYW5uZWxzOworCXRBbmlCb29sIHdtbUVuYWJsZWRTdGE7IC8qIGlmIHByZXNlbnQgLSBTVEEgaXMgV01NIGVuYWJsZWQgKi8KKwl0QW5pQm9vbCByZWFzc29jUmVxOworCS8qIFJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZXMgdG8gdXBwZXIgbGF5ZXIgKi8KKwl1aW50MzJfdCBiZWFjb25MZW5ndGg7CisJdWludDhfdCAqYmVhY29uUHRyOworCXVpbnQzMl90IGFzc29jUmVxTGVuZ3RoOworCXVpbnQ4X3QgKmFzc29jUmVxUHRyOworCisJLyogVGltaW5nIG1lYXN1cmVtZW50IGNhcGFiaWxpdHkgKi8KKwl1aW50OF90IHRpbWluZ01lYXNDYXA7CisJdFNpclNtZUNoYW5JbmZvIGNoYW5faW5mbzsKK30gdFNpclNtZUFzc29jSW5kLCAqdHBTaXJTbWVBc3NvY0luZDsKKworLyogLyBEZWZpbml0aW9uIGZvciBBc3NvY2lhdGlvbiBjb25maXJtICovCisvKiAvIC0tLT4gTUFDICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lQXNzb2NDbmYgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX0FTU09DX0NORiAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZTsKKwl0U2lyTWFjQWRkciBic3NJZDsgICAgICAvKiBTZWxmIEJTU0lEICovCisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisJdWludDE2X3QgYWlkOworCXRTaXJNYWNBZGRyIGFsdGVybmF0ZUJzc0lkOworCXVpbnQ4X3QgYWx0ZXJuYXRlQ2hhbm5lbElkOworfSB0U2lyU21lQXNzb2NDbmYsICp0cFNpclNtZUFzc29jQ25mOworCisvKiAvIEVudW0gZGVmaW5pdGlvbiBmb3IgIFdpcmVsZXNzIG1lZGl1bSBzdGF0dXMgY2hhbmdlIGNvZGVzICovCit0eXBlZGVmIGVudW0gZVNpclNtZVN0YXR1c0NoYW5nZUNvZGUgeworCWVTSVJfU01FX0RFQVVUSF9GUk9NX1BFRVIsCisJZVNJUl9TTUVfRElTQVNTT0NfRlJPTV9QRUVSLAorCWVTSVJfU01FX0xPU1RfTElOS19XSVRIX1BFRVIsCisJZVNJUl9TTUVfQ0hBTk5FTF9TV0lUQ0gsCisJZVNJUl9TTUVfSk9JTkVEX05FV19CU1MsCisJZVNJUl9TTUVfTEVBVklOR19CU1MsCisJZVNJUl9TTUVfSUJTU19BQ1RJVkUsCisJZVNJUl9TTUVfSUJTU19JTkFDVElWRSwKKwllU0lSX1NNRV9JQlNTX1BFRVJfREVQQVJURUQsCisJZVNJUl9TTUVfUkFEQVJfREVURUNURUQsCisJZVNJUl9TTUVfSUJTU19ORVdfUEVFUiwKKwllU0lSX1NNRV9BUF9DQVBTX0NIQU5HRUQsCit9IHRTaXJTbWVTdGF0dXNDaGFuZ2VDb2RlOworCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lTmV3QnNzSW5mbyB7CisJdFNpck1hY0FkZHIgYnNzSWQ7CisJdWludDhfdCBjaGFubmVsTnVtYmVyOworCXVpbnQ4X3QgcmVzZXJ2ZWQ7CisJdFNpck1hY1NTaWQgc3NJZDsKK30gdFNpclNtZU5ld0Jzc0luZm8sICp0cFNpclNtZU5ld0Jzc0luZm87CisKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVBcE5ld0NhcHMgeworCXVpbnQxNl90IGNhcGFiaWxpdHlJbmZvOworCXRTaXJNYWNBZGRyIGJzc0lkOworCXVpbnQ4X3QgY2hhbm5lbElkOworCXVpbnQ4X3QgcmVzZXJ2ZWRbM107CisJdFNpck1hY1NTaWQgc3NJZDsKK30gdFNpclNtZUFwTmV3Q2FwcywgKnRwU2lyU21lQXBOZXdDYXBzOworCisvKioKKyAqIFRhYmxlIGJlbG93IGluZGljYXRlcyB3aGF0IGluZm9ybWF0aW9uIGlzIHBhc3NlZCBmb3IgZWFjaCBvZgorICogdGhlIFdpcmVsZXNzIE1lZGlhIHN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uczoKKyAqCisgKiBTdGF0dXMgQ2hhbmdlIGNvZGUgICAgICAgICAgIFN0YXR1cyBjaGFuZ2UgaW5mbworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZVNJUl9TTUVfREVBVVRIX0ZST01fUEVFUiAgICAgICAgUmVhc29uIGNvZGUgcmVjZWl2ZWQgaW4gREVBVVRIIGZyYW1lCisgKiBlU0lSX1NNRV9ESVNBU1NPQ19GUk9NX1BFRVIgICAgICBSZWFzb24gY29kZSByZWNlaXZlZCBpbiBESVNBU1NPQyBmcmFtZQorICogZVNJUl9TTUVfTE9TVF9MSU5LX1dJVEhfUEVFUiAgICAgTm9uZQorICogZVNJUl9TTUVfQ0hBTk5FTF9TV0lUQ0ggICAgICAgICAgTmV3IGNoYW5uZWwgbnVtYmVyCisgKiBlU0lSX1NNRV9KT0lORURfTkVXX0JTUyAgICAgICAgICBCU1NJRCwgU1NJRCBhbmQgY2hhbm5lbCBudW1iZXIKKyAqIGVTSVJfU01FX0xFQVZJTkdfQlNTICAgICAgICAgICAgIE5vbmUKKyAqIGVTSVJfU01FX0lCU1NfQUNUSVZFICAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IGFub3RoZXIgU1RBIGpvaW5lZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJTUyBhcGFydCBmcm9tIHRoaXMgU1RBIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgSUJTUworICogZVNJUl9TTUVfSUJTU19JTkFDVElWRSAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgb25seSB0aGlzIFNUQSBpcyBsZWZ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBJQlNTCisgKiBlU0lSX1NNRV9SQURBUl9ERVRFQ1RFRCAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCByYWRhciBpcyBkZXRlY3RlZAorICogZVNJUl9TTUVfSUJTU19ORVdfUEVFUiAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgYSBuZXcgcGVlciBpcyBkZXRlY3RlZAorICogZVNJUl9TTUVfQVBfQ0FQU19DSEFOR0VEICAgICAgICAgSW5kaWNhdGVzIHRoYXQgY2FwYWJpbGl0aWVzIG9mIHRoZSBBUAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBTVEEgaXMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBjaGFuZ2VkLgorICovCisKKy8qIC8gRGVmaW5pdGlvbiBmb3IgV2lyZWxlc3MgbWVkaXVtIHN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lV21TdGF0dXNDaGFuZ2VOdGYgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX1dNX1NUQVRVU19DSEFOR0VfTlRGICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl0U2lyU21lU3RhdHVzQ2hhbmdlQ29kZSBzdGF0dXNDaGFuZ2VDb2RlOworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIFNlbGYgQlNTSUQgKi8KKwl1bmlvbiB7CisJCXVpbnQxNl90IGRlQXV0aFJlYXNvbkNvZGU7ICAgICAgLyogZVNJUl9TTUVfREVBVVRIX0ZST01fUEVFUiAqLworCQkvKiBlU0lSX1NNRV9ESVNBU1NPQ19GUk9NX1BFRVIgKi8KKwkJdWludDE2X3QgZGlzYXNzb2NSZWFzb25Db2RlOworCQkvKiBub25lIGZvciBlU0lSX1NNRV9MT1NUX0xJTktfV0lUSF9QRUVSICovCisJCXVpbnQ4X3QgbmV3Q2hhbm5lbElkOyAgIC8qIGVTSVJfU01FX0NIQU5ORUxfU1dJVENIICovCisJCXRTaXJTbWVOZXdCc3NJbmZvIG5ld0Jzc0luZm87ICAgLyogZVNJUl9TTUVfSk9JTkVEX05FV19CU1MgKi8KKwkJLyogbm9uZSBmb3IgZVNJUl9TTUVfTEVBVklOR19CU1MgKi8KKwkJLyogbm9uZSBmb3IgZVNJUl9TTUVfSUJTU19BQ1RJVkUgKi8KKwkJLyogbm9uZSBmb3IgZVNJUl9TTUVfSUJTU19JTkFDVElWRSAqLworCQkvKiBlU0lSX1NNRV9JQlNTX05FV19QRUVSICovCisJCXRTaXJOZXdJYnNzUGVlckluZm8gbmV3SWJzc1BlZXJJbmZvOworCQl0U2lyU21lQXBOZXdDYXBzIGFwTmV3Q2FwczsgICAgIC8qIGVTSVJfU01FX0FQX0NBUFNfQ0hBTkdFRCAqLworCX0gc3RhdHVzQ2hhbmdlSW5mbzsKK30gdFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmLCAqdHBTaXJTbWVXbVN0YXR1c0NoYW5nZU50ZjsKKworLyogRGVmaW5pdGlvbiBmb3IgRGlzYXNzb2NpYXRpb24gcmVxdWVzdCAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZURpc2Fzc29jUmVxIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9ESVNBU1NPQ19SRVEgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXVpbnQxNl90IHRyYW5zYWN0aW9uSWQ7IC8qIFRyYW5zYWN0aW9uIElEIGZvciBjbWQgKi8KKwl0U2lyTWFjQWRkciBic3NJZDsgICAgICAvKiBQZWVyIEJTU0lEICovCisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisJdWludDE2X3QgcmVhc29uQ29kZTsKKwkvKiBUaGlzIGZsYWcgdGVsbHMgTElNIHdoZXRoZXIgdG8gc2VuZCB0aGUgZGlzYXNzb2MgT1RBIG9yIG5vdCAqLworCS8qIFRoaXMgd2lsbCBiZSBzZXQgaW4gd2hpbGUgaGFuZGluZyBvZmYgZnJvbSBvbmUgQVAgdG8gb3RoZXIgKi8KKwl1aW50OF90IGRvTm90U2VuZE92ZXJUaGVBaXI7Cit9IGNkZl9wYWNrZWQgdFNpclNtZURpc2Fzc29jUmVxLCAqdHBTaXJTbWVEaXNhc3NvY1JlcTsKKworLyogLyBEZWZpbml0aW9uIGZvciBUa2lwIGNvdW50ZXJtZWFzdXJlcyByZXF1ZXN0ICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lVGtpcENudHJNZWFzUmVxIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9ESVNBU1NPQ19SRVEgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXVpbnQxNl90IHRyYW5zYWN0aW9uSWQ7IC8qIFRyYW5zYWN0aW9uIElEIGZvciBjbWQgKi8KKwl0U2lyTWFjQWRkciBic3NJZDsgICAgICAvKiBQZWVyIEJTU0lEICovCisJYm9vbCBiRW5hYmxlOyAgICAgICAgICAgLyogU3RhcnQvc3RvcCBjb3VudGVybWVhc3VyZXMgKi8KK30gY2RmX3BhY2tlZCB0U2lyU21lVGtpcENudHJNZWFzUmVxLCAqdHBTaXJTbWVUa2lwQ250ck1lYXNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNBbmk2NEJpdENvdW50ZXJzIHsKKwl1aW50MzJfdCBIaTsKKwl1aW50MzJfdCBMbzsKK30gdEFuaTY0Qml0Q291bnRlcnMsICp0cEFuaTY0Qml0Q291bnRlcnM7CisKK3R5cGVkZWYgc3RydWN0IHNBbmlTZWN1cml0eVN0YXQgeworCXRBbmk2NEJpdENvdW50ZXJzIHR4QmxrczsKKwl0QW5pNjRCaXRDb3VudGVycyByeEJsa3M7CisJdEFuaTY0Qml0Q291bnRlcnMgZm9ybWF0RXJyb3JDbnQ7CisJdEFuaTY0Qml0Q291bnRlcnMgZGVjcnlwdEVycjsKKwl0QW5pNjRCaXRDb3VudGVycyBwcm90RXhjbENudDsKKwl0QW5pNjRCaXRDb3VudGVycyB1bkRlY3J5cHRhYmxlQ250OworCXRBbmk2NEJpdENvdW50ZXJzIGRlY3J5cHRPa0NudDsKKworfSB0QW5pU2VjdXJpdHlTdGF0LCAqdHBBbmlTZWN1cml0eVN0YXQ7CisKK3R5cGVkZWYgc3RydWN0IHNBbmlUeFJ4U3RhdHMgeworCXRBbmk2NEJpdENvdW50ZXJzIHR4RnJhbWVzOworCXRBbmk2NEJpdENvdW50ZXJzIHJ4RnJhbWVzOworCXRBbmk2NEJpdENvdW50ZXJzIG5SY3ZCeXRlczsKKwl0QW5pNjRCaXRDb3VudGVycyBuWG1pdEJ5dGVzOworCit9IHRBbmlUeFJ4U3RhdHMsICp0cEFuaVR4UnhTdGF0czsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVNlY1N0YXRzIHsKKwl0QW5pU2VjdXJpdHlTdGF0IGFlczsKKwl0QW5pNjRCaXRDb3VudGVycyBhZXNSZXBsYXlzOworCXRBbmlTZWN1cml0eVN0YXQgdGtpcDsKKwl0QW5pNjRCaXRDb3VudGVycyB0a2lwUmVwbGF5czsKKwl0QW5pNjRCaXRDb3VudGVycyB0a2lwTWljRXJyb3I7CisKKwl0QW5pU2VjdXJpdHlTdGF0IHdlcDsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKSAmJiAhZGVmaW5lZChMSUJSQV9XQVBJX1NVUFBPUlQpCisJdEFuaVNlY3VyaXR5U3RhdCB3cGk7CisJdEFuaTY0Qml0Q291bnRlcnMgd3BpUmVwbGF5czsKKwl0QW5pNjRCaXRDb3VudGVycyB3cGlNaWNFcnJvcjsKKyNlbmRpZgorfSB0QW5pU2VjU3RhdHMsICp0cEFuaVNlY1N0YXRzOworCisjZGVmaW5lIFNJUl9NQVhfUlhfQ0hBSU5TIDMKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVN0YVN0YXRTdHJ1Y3QgeworCS8qIGZvbGxvd2luZyBzdGF0aXN0aWMgZWxlbWVudHMgdGlsbCBleHBhbmRQa3RSeENudExvIGFyZSBub3QgZmlsbGVkCisJICogd2l0aCB2YWxpZCBkYXRhLiBUaGVzZSBhcmUga2VwdCBhcyBpdCBpcywgc2luY2UgV1NNIGlzIHVzaW5nIHRoaXMKKwkgKiBzdHJ1Y3R1cmUuIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSByZW1vdmVkIHdoZW5ldmVyIFdTTSBpcyB1cGRhdGVkLgorCSAqIFBoeXN0YXRzIGlzIHVzZWQgdG8gaG9sZCBwaHlzdGF0cyBmcm9tIEJELgorCSAqLworCXVpbnQzMl90IHNlbnRBZXNCbGtzVWNhc3RIaTsKKwl1aW50MzJfdCBzZW50QWVzQmxrc1VjYXN0TG87CisJdWludDMyX3QgcmVjdkFlc0Jsa3NVY2FzdEhpOworCXVpbnQzMl90IHJlY3ZBZXNCbGtzVWNhc3RMbzsKKwl1aW50MzJfdCBhZXNGb3JtYXRFcnJvclVjYXN0Q250czsKKwl1aW50MzJfdCBhZXNSZXBsYXlzVWNhc3Q7CisJdWludDMyX3QgYWVzRGVjcnlwdEVyclVjYXN0OworCXVpbnQzMl90IHNpbmdsZVJldHJ5UGt0czsKKwl1aW50MzJfdCBmYWlsZWRUeFBrdHM7CisJdWludDMyX3QgYWNrVGltZW91dHM7CisJdWludDMyX3QgbXVsdGlSZXRyeVBrdHM7CisJdWludDMyX3QgZnJhZ1R4Q250c0hpOworCXVpbnQzMl90IGZyYWdUeENudHNMbzsKKwl1aW50MzJfdCB0cmFuc21pdHRlZFBrdHNIaTsKKwl1aW50MzJfdCB0cmFuc21pdHRlZFBrdHNMbzsKKwl1aW50MzJfdCBwaHlTdGF0SGk7ICAgICAvKiBUaGVzZSBhcmUgdXNlZCB0byBmaWxsIGluIHRoZSBwaHlzdGF0cy4gKi8KKwl1aW50MzJfdCBwaHlTdGF0TG87ICAgICAvKiBUaGlzIGlzIG9ubHkgZm9yIHByaXZhdGUgdXNlLiAqLworCisJdWludDMyX3QgdXBsaW5rUnNzaTsKKwl1aW50MzJfdCB1cGxpbmtTaW5yOworCXVpbnQzMl90IHVwbGlua1JhdGU7CisJdWludDMyX3QgZG93bmxpbmtSc3NpOworCXVpbnQzMl90IGRvd25saW5rU2lucjsKKwl1aW50MzJfdCBkb3dubGlua1JhdGU7CisJdWludDMyX3QgblJjdkJ5dGVzOworCXVpbnQzMl90IG5YbWl0Qnl0ZXM7CisKKwkvKgorCSAqIEZvbGxvd2luZyBlbGVtZW50cyBhcmUgdmFsaWQgYW5kIGZpbGxlZCBpbiBjb3JyZWN0bHkuIFRoZXkgaGF2ZQorCSAqIHZhbGlkIHZhbHVlcy4KKwkgKi8KKworCS8qIFVuaWNhc3QgZnJhbWVzIGFuZCBieXRlcy4gKi8KKwl0QW5pVHhSeFN0YXRzIHVjU3RhdHM7CisKKwkvKiBCcm9hZGNhc3QgZnJhbWVzIGFuZCBieXRlcy4gKi8KKwl0QW5pVHhSeFN0YXRzIGJjU3RhdHM7CisKKwkvKiBNdWx0aWNhc3QgZnJhbWVzIGFuZCBieXRlcy4gKi8KKwl0QW5pVHhSeFN0YXRzIG1jU3RhdHM7CisKKwl1aW50MzJfdCBjdXJyZW50VHhSYXRlOworCXVpbnQzMl90IGN1cnJlbnRSeFJhdGU7IC8qIFJhdGUgaW4gMTAwS2JwcyAqLworCisJdWludDMyX3QgbWF4VHhSYXRlOworCXVpbnQzMl90IG1heFJ4UmF0ZTsKKworCWludDhfdCByc3NpW1NJUl9NQVhfUlhfQ0hBSU5TXTsKKworCXRBbmlTZWNTdGF0cyBzZWN1cml0eVN0YXRzOworCisJdWludDhfdCBjdXJyZW50UnhSYXRlSWR4OyAgICAgICAvKiBUaGlzIHRoZSBzb2Z0bWFjIHJhdGUgSW5kZXguICovCisJdWludDhfdCBjdXJyZW50VHhSYXRlSWR4OworCit9IHRBbmlTdGFTdGF0U3RydWN0LCAqdHBBbmlTdGFTdGF0U3RydWN0OworCit0eXBlZGVmIGVudW0gc1BhY2tldFR5cGUgeworCWVQQUNLRVRfVFlQRV9VTktOT1dOLAorCWVQQUNLRVRfVFlQRV8xMUEsCisJZVBBQ0tFVF9UWVBFXzExRywKKwllUEFDS0VUX1RZUEVfMTFCLAorCWVQQUNLRVRfVFlQRV8xMU4KK30gdFBhY2tldFR5cGUsICp0cFBhY2tldFR5cGU7CisKKy8qIC8gRGVmaW5pdGlvbiBmb3IgRGlzYXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVEaXNhc3NvY1JzcCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfRElTQVNTT0NfUlNQICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOyAvKiBUcmFuc2FjdGlvbiBJRCBmb3IgY21kICovCisJdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisJdEFuaVN0YVN0YXRTdHJ1Y3QgcGVyU3RhU3RhdHM7ICAvKiBTVEEgc3RhdHMgKi8KKwl1aW50MTZfdCBzdGFJZDsKK30gY2RmX3BhY2tlZCB0U2lyU21lRGlzYXNzb2NSc3AsICp0cFNpclNtZURpc2Fzc29jUnNwOworCisvKiAvIERlZmluaXRpb24gZm9yIERpc2Fzc29jaWF0aW9uIGluZGljYXRpb24gZnJvbSBwZWVyICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lRGlzYXNzb2NJbmQgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX0RJU0FTU09DX0lORCAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBTZXNzaW9uIElkZW50aWZpZXIgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOyAvKiBUcmFuc2FjdGlvbiBJZGVudGlmaWVyIHdpdGggUEUgKi8KKwl0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZTsKKwl0U2lyTWFjQWRkciBic3NJZDsKKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl0QW5pU3RhU3RhdFN0cnVjdCBwZXJTdGFTdGF0czsgIC8qIFNUQSBzdGF0cyAqLworCXVpbnQxNl90IHN0YUlkOworCXVpbnQzMl90IHJlYXNvbkNvZGU7Cit9IHRTaXJTbWVEaXNhc3NvY0luZCwgKnRwU2lyU21lRGlzYXNzb2NJbmQ7CisKKy8qIC8gRGVmaW5pdGlvbiBmb3IgRGlzYXNzb2NpYXRpb24gY29uZmlybSAqLworLyogLyBNQUMgLS0tPiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZURpc2Fzc29jQ25mIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9ESVNBU1NPQ19DTkYgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisJdFNpck1hY0FkZHIgYnNzSWQ7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7Cit9IHRTaXJTbWVEaXNhc3NvY0NuZiwgKnRwU2lyU21lRGlzYXNzb2NDbmYsCisJdFNpclNtZURlYXV0aENuZiwgKnRwU2lyU21lRGVhdXRoQ25mOworCisvKiAvIERlZmluaXRpb24gZm9yIERlYXV0aGV0aWNhdGlvbiByZXF1ZXN0ICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lRGVhdXRoUmVxIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9ERUFVVEhfUkVRICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOyAvKiBUcmFuc2FjdGlvbiBJRCBmb3IgY21kICovCisJdFNpck1hY0FkZHIgYnNzSWQ7ICAgICAgLyogQVAgQlNTSUQgKi8KKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl1aW50MTZfdCByZWFzb25Db2RlOworfSB0U2lyU21lRGVhdXRoUmVxLCAqdHBTaXJTbWVEZWF1dGhSZXE7CisKKy8qIC8gRGVmaW5pdGlvbiBmb3IgRGVhdXRoZXRpY2F0aW9uIHJlc3BvbnNlICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lRGVhdXRoUnNwIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9ERUFVVEhfUlNQICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOyAvKiBUcmFuc2FjdGlvbiBJRCBmb3IgY21kICovCisJdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7Cit9IHRTaXJTbWVEZWF1dGhSc3AsICp0cFNpclNtZURlYXV0aFJzcDsKKworLyogLyBEZWZpbml0aW9uIGZvciBEZWF1dGhldGljYXRpb24gaW5kaWNhdGlvbiBmcm9tIHBlZXIgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVEZWF1dGhJbmQgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX0RFQVVUSF9JTkQgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogQWRkZWQgZm9yIEJULUFNUCAqLworCXVpbnQxNl90IHRyYW5zYWN0aW9uSWQ7IC8qIEFkZGVkIGZvciBCVC1BTVAgKi8KKwl0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZTsKKwl0U2lyTWFjQWRkciBic3NJZDsgICAgICAvKiBBUCBCU1NJRCAqLworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCisJdWludDE2X3Qgc3RhSWQ7CisJdWludDMyX3QgcmVhc29uQ29kZTsKK30gdFNpclNtZURlYXV0aEluZCwgKnRwU2lyU21lRGVhdXRoSW5kOworCisvKiAvIERlZmluaXRpb24gZm9yIHN0b3AgQlNTIHJlcXVlc3QgbWVzc2FnZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVN0b3BCc3NSZXEgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX1NUT1BfQlNTX1JFUSAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBTZXNzaW9uIElEICovCisJdWludDE2X3QgdHJhbnNhY3Rpb25JZDsgLyogdHJhblNhY3Rpb24gSUQgZm9yIGNtZCAqLworCXRTaXJSZXN1bHRDb2RlcyByZWFzb25Db2RlOworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIFNlbGYgQlNTSUQgKi8KK30gdFNpclNtZVN0b3BCc3NSZXEsICp0cFNpclNtZVN0b3BCc3NSZXE7CisKKy8qIC8gRGVmaW5pdGlvbiBmb3Igc3RvcCBCU1MgcmVzcG9uc2UgbWVzc2FnZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVN0b3BCc3NSc3AgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX1NUT1BfQlNTX1JTUCAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZTsKKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBTZXNzaW9uIElEICovCisJdWludDE2X3QgdHJhbnNhY3Rpb25JZDsgLyogVHJhbnNhY3Rpb24gSUQgZm9yIGNtZCAqLworfSB0U2lyU21lU3RvcEJzc1JzcCwgKnRwU2lyU21lU3RvcEJzc1JzcDsKKworLyogLyBEZWZpbml0aW9uIGZvciBDaGFubmVsIFN3aXRjaCBpbmRpY2F0aW9uIGZvciBzdGF0aW9uICovCisvKiAvIE1BQyAtLS0+ICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lU3dpdGNoQ2hhbm5lbEluZCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfU1dJVENIX0NITF9JTkQgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDE2X3QgbmV3Q2hhbm5lbElkOworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIEJTU0lEICovCit9IHRTaXJTbWVTd2l0Y2hDaGFubmVsSW5kLCAqdHBTaXJTbWVTd2l0Y2hDaGFubmVsSW5kOworCisvKiAvIERlZmluaXRpb24gZm9yIE5laWdoYm9yIEJTUyBpbmRpY2F0aW9uICovCisvKiAvIE1BQyAtLS0+ICovCisvKiAvIE1BQyByZXBvcnRzIHRoaXMgZWFjaCB0aW1lIGEgbmV3IEkvQlNTIGlzIGRldGVjdGVkICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lTmVpZ2hib3JCc3NJbmQgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX05FSUdIQk9SX0JTU19JTkQgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdFNpckJzc0Rlc2NyaXB0aW9uIGJzc0Rlc2NyaXB0aW9uWzFdOworfSB0U2lyU21lTmVpZ2hib3JCc3NJbmQsICp0cFNpclNtZU5laWdoYm9yQnNzSW5kOworCisvKiAvIERlZmluaXRpb24gZm9yIE1JQyBmYWlsdXJlIGluZGljYXRpb24gKi8KKy8qIC8gTUFDIC0tLT4gKi8KKy8qIC8gTUFDIHJlcG9ydHMgdGhpcyBlYWNoIHRpbWUgYSBNSUMgZmFpbHVyZSBvY2N1cmVzIG9uIFJ4IFRLSVAgcGFja2V0ICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lTWljRmFpbHVyZUluZCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfTUlDX0ZBSUxVUkVfSU5EICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIEJTU0lEICovCisJdFNpck1pY0ZhaWx1cmVJbmZvIGluZm87Cit9IHRTaXJTbWVNaWNGYWlsdXJlSW5kLCAqdHBTaXJTbWVNaWNGYWlsdXJlSW5kOworCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lTWlzc2VkQmVhY29uSW5kIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9NSVNTRURfQkVBQ09OX0lORCAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IGJzc0lkeDsKK30gdFNpclNtZU1pc3NlZEJlYWNvbkluZCwgKnRwU2lyU21lTWlzc2VkQmVhY29uSW5kOworCisvKiAvIERlZmluaXRpb24gZm9yIFNldCBDb250ZXh0IHJlcXVlc3QgKi8KKy8qIC8gLS0tPiBNQUMgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTZXRDb250ZXh0UmVxIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9TRVRfQ09OVEVYVF9SRVEgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXVpbnQxNl90IHRyYW5zYWN0aW9uSWQ7IC8qIFRyYW5zYWN0aW9uIElEIGZvciBjbWQgKi8KKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl0U2lyTWFjQWRkciBic3NJZDsgICAgICAvKiBCU1NJRCAqLworCXRTaXJLZXlNYXRlcmlhbCBrZXlNYXRlcmlhbDsKK30gdFNpclNtZVNldENvbnRleHRSZXEsICp0cFNpclNtZVNldENvbnRleHRSZXE7CisKKy8qIC8gRGVmaW5pdGlvbiBmb3IgU2V0IENvbnRleHQgcmVzcG9uc2UgKi8KKy8qIC8gTUFDIC0tLT4gKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTZXRDb250ZXh0UnNwIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9TRVRfQ09OVEVYVF9SU1AgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXVpbnQxNl90IHRyYW5zYWN0aW9uSWQ7IC8qIFRyYW5zYWN0aW9uIElEIGZvciBjbWQgKi8KKwl0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZTsKKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKK30gdFNpclNtZVNldENvbnRleHRSc3AsICp0cFNpclNtZVNldENvbnRleHRSc3A7CisKKy8qIC8gU3RhdGlzdGljIGRlZmluaXRpb25zICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBQZXIgU1RBIHN0YXRpc3RpYyBzdHJ1Y3R1cmU7IFRoaXMgc2FtZSBzdHJ1Y3Qgd2lsbCBiZSB1c2VkIGZvciBBZ2dyZWdhdGUgKi8KKy8qIFNUQSBzdGF0cyBhcyB3ZWxsLiAqLworCisvKiBDbGVhciByYWRpbyBzdGF0cyBhbmQgY2xlYXIgcGVyIHN0YSBzdGF0cyAqLwordHlwZWRlZiBlbnVtIHsKKwllQU5JX0NMRUFSX0FMTF9TVEFUUywgICAvKiBDbGVhcnMgYWxsIHN0YXRzICovCisJZUFOSV9DTEVBUl9SWF9TVEFUUywgICAgLyogQ2xlYXJzIFJYIHN0YXRzIG9mIHRoZSByYWRpbyBpbnRlcmZhY2UgKi8KKwllQU5JX0NMRUFSX1RYX1NUQVRTLCAgICAvKiBDbGVhcnMgVFggc3RhdHMgb2YgdGhlIHJhZGlvIGludGVyZmFjZSAqLworCWVBTklfQ0xFQVJfUkFESU9fU1RBVFMsIC8qIENsZWFycyBhbGwgdGhlIHJhZGlvIHN0YXRzICovCisJZUFOSV9DTEVBUl9QRVJfU1RBX1NUQVRTLCAgICAgICAvKiBDbGVhcnMgUGVyIFNUQSBzdGF0cyAqLworCWVBTklfQ0xFQVJfQUdHUl9QRVJfU1RBX1NUQVRTLCAgLyogQ2xlYXJzIGFnZ3JlZ2F0ZSBzdGF0cyAqLworCisJLyogVXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHBlciBzdGEgdG8gc2VjdXJpdHkgc3RhdHMuICovCisJLyogVXNlZCBvbmx5IGJ5IEFQLCBGVyBqdXN0IHJldHVybnMgdGhlIHNhbWUgcGFyYW0gYXMgaXQgcmVjZWl2ZWQuICovCisJZUFOSV9MSU5LX1NUQVRTLCAgICAgICAgLyogR2V0IFBlciBTVEEgc3RhdHMgKi8KKwllQU5JX1NFQ1VSSVRZX1NUQVRTLCAgICAvKiBHZXQgUGVyIFNUQSBzZWN1cml0eSBzdGF0cyAqLworCisJZUFOSV9DTEVBUl9TVEFUX1RZUEVTX0VORAorfSB0QW5pU3RhdFN1YlR5cGVzOworCit0eXBlZGVmIHN0cnVjdCBzQW5pVHhDdHJzIHsKKwkvKiBhZGQgdGhlIHJhdGUgY291bnRlcnMgaGVyZSAqLworCXVpbnQzMl90IHR4MU1icHM7CisJdWludDMyX3QgdHgyTWJwczsKKwl1aW50MzJfdCB0eDVfNU1icHM7CisJdWludDMyX3QgdHg2TWJwczsKKwl1aW50MzJfdCB0eDlNYnBzOworCXVpbnQzMl90IHR4MTFNYnBzOworCXVpbnQzMl90IHR4MTJNYnBzOworCXVpbnQzMl90IHR4MThNYnBzOworCXVpbnQzMl90IHR4MjRNYnBzOworCXVpbnQzMl90IHR4MzZNYnBzOworCXVpbnQzMl90IHR4NDhNYnBzOworCXVpbnQzMl90IHR4NTRNYnBzOworCXVpbnQzMl90IHR4NzJNYnBzOworCXVpbnQzMl90IHR4OTZNYnBzOworCXVpbnQzMl90IHR4MTA4TWJwczsKKworCS8qIHR4IHBhdGggcmFkaW8gY291bnRzICovCisJdWludDMyX3QgdHhGcmFnSGk7CisJdWludDMyX3QgdHhGcmFnTG87CisJdWludDMyX3QgdHhGcmFtZUhpOworCXVpbnQzMl90IHR4RnJhbWVMbzsKKwl1aW50MzJfdCB0eE11bHRpY2FzdEZyYW1lSGk7CisJdWludDMyX3QgdHhNdWx0aWNhc3RGcmFtZUxvOworCXVpbnQzMl90IHR4RmFpbGVkSGk7CisJdWludDMyX3QgdHhGYWlsZWRMbzsKKwl1aW50MzJfdCBtdWx0aXBsZVJldHJ5SGk7CisJdWludDMyX3QgbXVsdGlwbGVSZXRyeUxvOworCXVpbnQzMl90IHNpbmdsZVJldHJ5SGk7CisJdWludDMyX3Qgc2luZ2xlUmV0cnlMbzsKKwl1aW50MzJfdCBhY2tGYWlsdXJlSGk7CisJdWludDMyX3QgYWNrRmFpbHVyZUxvOworCXVpbnQzMl90IHhtaXRCZWFjb25zOworfSB0QW5pVHhDdHJzLCAqdHBBbmlUeEN0cnM7CisKK3R5cGVkZWYgc3RydWN0IHNBbmlSeEN0cnMgeworCS8qIHJlY2VpdmUgZnJhbWUgcmF0ZSBjb3VudGVycyAqLworCXVpbnQzMl90IHJ4MU1icHM7CisJdWludDMyX3QgcngyTWJwczsKKwl1aW50MzJfdCByeDVfNU1icHM7CisJdWludDMyX3Qgcng2TWJwczsKKwl1aW50MzJfdCByeDlNYnBzOworCXVpbnQzMl90IHJ4MTFNYnBzOworCXVpbnQzMl90IHJ4MTJNYnBzOworCXVpbnQzMl90IHJ4MThNYnBzOworCXVpbnQzMl90IHJ4MjRNYnBzOworCXVpbnQzMl90IHJ4MzZNYnBzOworCXVpbnQzMl90IHJ4NDhNYnBzOworCXVpbnQzMl90IHJ4NTRNYnBzOworCXVpbnQzMl90IHJ4NzJNYnBzOworCXVpbnQzMl90IHJ4OTZNYnBzOworCXVpbnQzMl90IHJ4MTA4TWJwczsKKworCS8qIHJlY2VpdmUgc2l6ZSBjb3VudGVyczsgJ0x0ZScgPSBMZXNzIHRoYW4gb3IgZXF1YWwgdG8gKi8KKwl1aW50MzJfdCByeEx0ZTY0OworCXVpbnQzMl90IHJ4THRlMTI4R3Q2NDsKKwl1aW50MzJfdCByeEx0ZTI1Nkd0MTI4OworCXVpbnQzMl90IHJ4THRlNTEyR3QyNTY7CisJdWludDMyX3QgcnhMdGUxa0d0NTEyOworCXVpbnQzMl90IHJ4THRlMTUxOEd0MWs7CisJdWludDMyX3QgcnhMdGUya0d0MTUxODsKKwl1aW50MzJfdCByeEx0ZTRrR3QyazsKKworCS8qIHJ4IHJhZGlvIHN0YXRzICovCisJdWludDMyX3QgcnhGcmFnOworCXVpbnQzMl90IHJ4RnJhbWU7CisJdWludDMyX3QgZmNzRXJyb3I7CisJdWludDMyX3QgcnhNdWx0aWNhc3Q7CisJdWludDMyX3QgZHVwbGljYXRlOworCXVpbnQzMl90IHJ0c1N1Y2Nlc3M7CisJdWludDMyX3QgcnRzRmFpbGVkOworCXVpbnQzMl90IHdlcFVuZGVjcnlwdGFibGVzOworCXVpbnQzMl90IGRyb3BzOworCXVpbnQzMl90IGFlc0Zvcm1hdEVycm9yVWNhc3RDbnRzOworCXVpbnQzMl90IGFlc1JlcGxheXNVY2FzdDsKKwl1aW50MzJfdCBhZXNEZWNyeXB0RXJyVWNhc3Q7Cit9IHRBbmlSeEN0cnMsICp0cEFuaVJ4Q3RyczsKKworLyogR2V0IFJhZGlvIFN0YXRzIHJlcXVlc3Qgc3RydWN0dXJlICovCisvKiBUaGlzIHN0cnVjdHVyZSBzaGFsbCBiZSB1c2VkIGZvciBib3RoIFJhZGlvIHN0YXRzIGFuZCBBZ2dyZWdhdGUgc3RhdHMgKi8KKy8qIEEgdmFsaWQgcmVxdWVzdCBtdXN0IGNvbnRhaW4gZW50aXJlIHN0cnVjdHVyZSB3aXRoL3dpdGhvdXQgdmFsaWQgZmllbGRzLiAqLworLyogQmFzZWQgb24gdGhlIHJlcXVlc3QgdHlwZSwgdGhlIHZhbGlkIGZpZWxkcyB3aWxsIGJlIGNoZWNrZWQuICovCit0eXBlZGVmIHN0cnVjdCBzQW5pR2V0U3RhdHNSZXEgeworCS8qIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXF1ZXN0cyAqLworCXVpbnQxNl90IG1zZ1R5cGU7ICAgICAgIC8qIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUgKi8KKwl1aW50MTZfdCBtc2dMZW47ICAgICAgICAvKiBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0ICovCisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXVpbnQxNl90IHRyYW5zYWN0aW9uSWQ7CisJdFNpck1hY0FkZHIgYnNzSWQ7ICAgICAgLyogQlNTSUQgKi8KKwkvKiBvbmx5IHVzZWQgZm9yIGNsZWFyIHN0YXRzIGFuZCBwZXIgc3RhIHN0YXRzIGNsZWFyICovCisJdEFuaVN0YXRTdWJUeXBlcyBzdGF0OyAgLyogQ2xlYXJzIHRoZSBzdGF0cyBvZiB0aGUgZGVzY3JpYmVkIHR5cGVzLiAqLworCXVpbnQzMl90IHN0YUlkOyAgICAgICAgIC8qIFBlciBTVEEgc3RhdHMgcmVxdWVzdCBtdXN0IGNvbnRhaW4gdmFsaWQgKi8KKwkvKiB2YWx1ZXMgKi8KKwl0U2lyTWFjQWRkciBtYWNBZGRyOworfSB0QW5pR2V0U3RhdHNSZXEsICp0cEFuaUdldFN0YXRzUmVxOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoqKioqKioqKioqKioqKioqKipQRSBTdGF0aXN0aWNzKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIHRwQW5pR2V0UEVTdGF0c1JlcSBpcyB0aWVkIHRvCisgKiBmb3IgU01FID09PiBQRSBlV05JX1NNRV9HRVRfU1RBVElTVElDU19SRVEgbXNnSWQgIGFuZAorICogZm9yIFBFID09PiBIQUwgU0lSX0hBTF9HRVRfU1RBVElTVElDU19SRVEgbXNnSWQKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0FuaUdldFBFU3RhdHNSZXEgeworCS8qIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXF1ZXN0cyAqLworCXVpbnQxNl90IG1zZ1R5cGU7ICAgICAgIC8qIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUgKi8KKwl1aW50MTZfdCBtc2dMZW47ICAgICAgICAvKiBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0ICovCisJdWludDMyX3Qgc3RhSWQ7ICAgICAgICAgLyogUGVyIFNUQSBzdGF0cyByZXF1ZXN0IG11c3QgY29udGFpbiB2YWxpZCAqLworCS8qIGNhdGVnb3JpZXMgb2Ygc3RhdHMgcmVxdWVzdGVkLiBsb29rIGF0IGVQRVN0YXRzTWFzayAqLworCXVpbnQzMl90IHN0YXRzTWFzazsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdEFuaUdldFBFU3RhdHNSZXEsICp0cEFuaUdldFBFU3RhdHNSZXE7CisKKy8qCisgKiB0cEFuaUdldFBFU3RhdHNSc3AgaXMgdGllZCB0bworICogZm9yIFBFID09PiBTTUUgZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUlNQIG1zZ0lkICBhbmQKKyAqIGZvciBIQUwgPT0+IFBFIFNJUl9IQUxfR0VUX1NUQVRJU1RJQ1NfUlNQIG1zZ0lkCisgKi8KK3R5cGVkZWYgc3RydWN0IHNBbmlHZXRQRVN0YXRzUnNwIHsKKwkvKiBDb21tb24gZm9yIGFsbCB0eXBlcyBhcmUgcmVzcG9uc2VzICovCisJdWludDE2X3QgbXNnVHlwZTsgICAgICAgLyogbWVzc2FnZSB0eXBlIGlzIHNhbWUgYXMgdGhlIHJlcXVlc3QgdHlwZSAqLworCS8qIGxlbmd0aCBvZiB0aGUgZW50aXJlIHJlcXVlc3QsIGluY2x1ZGVzIHRoZSBwU3RhdHNCdWYgbGVuZ3RoIHRvbyAqLworCXVpbnQxNl90IG1zZ0xlbjsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50MzJfdCByYzsgICAgICAgICAgICAvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKwl1aW50MzJfdCBzdGFJZDsgICAgICAgICAvKiBQZXIgU1RBIHN0YXRzIHJlcXVlc3QgbXVzdCBjb250YWluIHZhbGlkICovCisJLyogY2F0ZWdvcmllcyBvZiBzdGF0cyByZXF1ZXN0ZWQuIGxvb2sgYXQgZVBFU3RhdHNNYXNrICovCisJdWludDMyX3Qgc3RhdHNNYXNrOworCS8qIHZvaWQgICAgICAgICAgICAgICAgICAqcFN0YXRzQnVmOyAqLworCS8qCisJICogVGhlIFN0YXRzIGJ1ZmZlciBzdGFydHMgaGVyZSBhbmQgY2FuIGJlIGFuIGFnZ3JlZ2F0ZSBvZiBtb3JlIHRoYW4gb25lCisJICogc3RhdGlzdGljcyBzdHJ1Y3R1cmUgZGVwZW5kaW5nIG9uIHN0YXRzTWFzay4gVGhlIHZvaWQgcG9pbnRlcgorCSAqICJwU3RhdHNCdWYiIGlzIGNvbW1lbnRlZCBvdXQgaW50ZW50aW9uYWxseSBhbmQgdGhlIHNyYyBjb2RlIHRoYXQgdXNlcworCSAqIHRoaXMgc3RydWN0dXJlIHNob3VsZCB0YWtlIHRoYXQgaW50byBhY2NvdW50LgorCSAqLworfSB0QW5pR2V0UEVTdGF0c1JzcCwgKnRwQW5pR2V0UEVTdGF0c1JzcDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaUdldFJzc2lSZXEgeworCS8qIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXF1ZXN0cyAqLworCXVpbnQxNl90IG1zZ1R5cGU7ICAgICAgIC8qIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUgKi8KKwl1aW50MTZfdCBtc2dMZW47ICAgICAgICAvKiBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0ICovCisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDhfdCBzdGFJZDsKKwlpbnQ4X3QgbGFzdFJTU0k7ICAgICAgICAvKiBpbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gbGFzdCBSU1NJICovCisJdm9pZCAqcnNzaUNhbGxiYWNrOworCXZvaWQgKnBEZXZDb250ZXh0OyAgICAgIC8qIGRldmljZSBjb250ZXh0ICovCisJdm9pZCAqcF9jZHNfY29udGV4dDsgICAgLyogY2RzIGNvbnRleHQgKi8KKworfSB0QW5pR2V0UnNzaVJlcSwgKnRwQW5pR2V0UnNzaVJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaUdldFNuclJlcSB7CisJLyogQ29tbW9uIGZvciBhbGwgdHlwZXMgYXJlIHJlcXVlc3RzICovCisJdWludDE2X3QgbXNnVHlwZTsgICAgICAgLyogbWVzc2FnZSB0eXBlIGlzIHNhbWUgYXMgdGhlIHJlcXVlc3QgdHlwZSAqLworCXVpbnQxNl90IG1zZ0xlbjsgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgZW50aXJlIHJlcXVlc3QgKi8KKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IHN0YUlkOworCXZvaWQgKnNuckNhbGxiYWNrOworCXZvaWQgKnBEZXZDb250ZXh0OyAgICAgIC8qIGRldmljZSBjb250ZXh0ICovCisJaW50OF90IHNucjsKK30gdEFuaUdldFNuclJlcSwgKnRwQW5pR2V0U25yUmVxOworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQordHlwZWRlZiBzdHJ1Y3Qgc1NpclRzbUlFIHsKKwl1aW50OF90IHRzaWQ7CisJdWludDhfdCBzdGF0ZTsKKwl1aW50MTZfdCBtc210X2ludGVydmFsOworfSB0U2lyVHNtSUUsICp0cFNpclRzbUlFOwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVRzbUlFSW5kIHsKKwl0U2lyVHNtSUUgdHNtSWU7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRTaXJTbWVUc21JRUluZCwgKnRwU2lyU21lVHNtSUVJbmQ7Cit0eXBlZGVmIHN0cnVjdCBzQW5pVHJhZlN0cm1NZXRyaWNzIHsKKwl1aW50MTZfdCBVcGxpbmtQa3RRdWV1ZURseTsKKwl1aW50MTZfdCBVcGxpbmtQa3RRdWV1ZURseUhpc3RbNF07CisJdWludDMyX3QgVXBsaW5rUGt0VHhEbHk7CisJdWludDE2X3QgVXBsaW5rUGt0TG9zczsKKwl1aW50MTZfdCBVcGxpbmtQa3RDb3VudDsKKwl1aW50OF90IFJvYW1pbmdDb3VudDsKKwl1aW50MTZfdCBSb2FtaW5nRGx5OworfSB0QW5pVHJhZlN0cm1NZXRyaWNzLCAqdHBBbmlUcmFmU3RybU1ldHJpY3M7Cit0eXBlZGVmIHN0cnVjdCBzQW5pR2V0VHNtU3RhdHNSZXEgeworCS8qIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXF1ZXN0cyAqLworCXVpbnQxNl90IG1zZ1R5cGU7ICAgICAgIC8qIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUgKi8KKwl1aW50MTZfdCBtc2dMZW47ICAgICAgICAvKiBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0ICovCisJdWludDhfdCBzdGFJZDsKKwl1aW50OF90IHRpZDsgICAgICAgICAgICAvKiB0cmFmZmljIGlkICovCisJdFNpck1hY0FkZHIgYnNzSWQ7CisJdm9pZCAqdHNtU3RhdHNDYWxsYmFjazsKKwl2b2lkICpwRGV2Q29udGV4dDsgICAgICAvKiBkZXZpY2UgY29udGV4dCAqLworCXZvaWQgKnBfY2RzX2NvbnRleHQ7ICAgIC8qIGNkcyBjb250ZXh0ICovCit9IHRBbmlHZXRUc21TdGF0c1JlcSwgKnRwQW5pR2V0VHNtU3RhdHNSZXE7Cit0eXBlZGVmIHN0cnVjdCBzQW5pR2V0VHNtU3RhdHNSc3AgeworCS8qIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXNwb25zZXMgKi8KKwl1aW50MTZfdCBtc2dUeXBlOyAgICAgICAvKgorCQkJCSAqIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzCisJCQkJICogdGhlIHJlcXVlc3QgdHlwZQorCQkJCSAqLworCXVpbnQxNl90IG1zZ0xlbjsgICAgICAgIC8qCisJCQkJICogbGVuZ3RoIG9mIHRoZSBlbnRpcmUgcmVxdWVzdCwKKwkJCQkgKiBpbmNsdWRlcyB0aGUgcFN0YXRzQnVmIGxlbmd0aCB0b28KKwkJCQkgKi8KKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50MzJfdCByYzsgICAgICAgICAgICAvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKwl1aW50MzJfdCBzdGFJZDsgICAgICAgICAvKgorCQkJCSAqIFBlciBTVEEgc3RhdHMgcmVxdWVzdCBtdXN0CisJCQkJICogY29udGFpbiB2YWxpZAorCQkJCSAqLworCXRBbmlUcmFmU3RybU1ldHJpY3MgdHNtTWV0cmljczsKKwl2b2lkICp0c21TdGF0c1JlcTsgICAgICAvKiB0c20gc3RhdHMgcmVxdWVzdCBiYWNrdXAgKi8KK30gdEFuaUdldFRzbVN0YXRzUnNwLCAqdHBBbmlHZXRUc21TdGF0c1JzcDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckVzZUJjblJlcG9ydEJzc0luZm8geworCXRCY25SZXBvcnRGaWVsZHMgYmNuUmVwb3J0RmllbGRzOworCXVpbnQ4X3QgaWVMZW47CisJdWludDhfdCAqcEJ1ZjsKK30gdFNpckVzZUJjblJlcG9ydEJzc0luZm8sICp0cFNpckVzZUJjblJlcG9ydEJzc0luZm87CisKK3R5cGVkZWYgc3RydWN0IHNTaXJFc2VCY25SZXBvcnRSc3AgeworCXVpbnQxNl90IG1lYXN1cmVtZW50VG9rZW47CisJdWludDhfdCBmbGFnOyAgICAgICAgLyogRmxhZyB0byByZXBvcnQgbWVhc3VyZW1lbnQgZG9uZSBhbmQgbW9yZSBkYXRhICovCisJdWludDhfdCBudW1Cc3M7CisJdFNpckVzZUJjblJlcG9ydEJzc0luZm8gYmNuUmVwQnNzSW5mb1tTSVJfQkNOX1JFUE9SVF9NQVhfQlNTX0RFU0NdOworfSB0U2lyRXNlQmNuUmVwb3J0UnNwLCAqdHBTaXJFc2VCY25SZXBvcnRSc3A7CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFIHx8IEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisKKy8qIENoYW5nZSBjb3VudHJ5IGNvZGUgcmVxdWVzdCBNU0cgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBzQW5pQ2hhbmdlQ291bnRyeUNvZGVSZXEgeworCS8qIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXF1ZXN0cyAqLworCXVpbnQxNl90IG1zZ1R5cGU7ICAgICAgIC8qIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUgKi8KKwl1aW50MTZfdCBtc2dMZW47ICAgICAgICAvKiBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0ICovCisJdWludDhfdCBjb3VudHJ5Q29kZVtXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU5dOyAvKiAzIGNoYXIgY291bnRyeSBjb2RlICovCisJdEFuaUJvb2wgY291bnRyeUZyb21Vc2VyU3BhY2U7CisJdEFuaUJvb2wgc2VuZFJlZ0hpbnQ7ICAgLyogdHJ1ZSBpZiB3ZSB3YW50IHRvIHNlbmQgaGludCB0byBOTDgwMjExICovCisJdm9pZCAqY2hhbmdlQ0NDYWxsYmFjazsKKwl2b2lkICpwRGV2Q29udGV4dDsgICAgICAvKiBkZXZpY2UgY29udGV4dCAqLworCXZvaWQgKnBfY2RzX2NvbnRleHQ7ICAgIC8qIGNkcyBjb250ZXh0ICovCisKK30gdEFuaUNoYW5nZUNvdW50cnlDb2RlUmVxLCAqdHBBbmlDaGFuZ2VDb3VudHJ5Q29kZVJlcTsKKworLyoqCisgKiBzdHJ1Y3QgYW5pX3NjYW5fcmVxIC0gU2NhbiByZXF1ZXN0CisgKiBAbXNnX3R5cGU6IE1lc3NhZ2UgdHlwZQorICogQG1zZ19sZW46IE1lc3NhZ2UgTGVuZ3RoCisgKiBAc2Vzc2lvbl9pZDogU01FIHNlc3Npb24gSWQKKyAqIEBzY2FuX3BhcmFtOiBzY2FuIHJlcXVlc3QgcGFyYW1ldGVyCisgKiBAY2FsbGJhY2s6IGNhbGwgYmFjayBmdW5jdGlvbiBmb3Igc2NhbiByZXN1bHQKKyAqIEBjdHg6IEdsb2JhbCBjb250ZXh0CisgKgorICogU2NhbiByZXF1ZXN0IG1lc3NhZ2Ugc3RydWN0dXJlCisgKi8KK3N0cnVjdCBhbmlfc2Nhbl9yZXEgeworCS8qIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUgKi8KKwl1aW50MTZfdCBtc2dfdHlwZTsKKwkvKiBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0ICovCisJdWludDE2X3QgbXNnX2xlbjsKKwl1aW50MTZfdCBzZXNzaW9uX2lkOworCXZvaWQgKnNjYW5fcGFyYW07CisJdm9pZCAqY2FsbGJhY2s7CisJdm9pZCAqY3R4OworfTsKKworLyoqCisgKiBzdHJ1Y3QgYW5pX3JvY19yZXEgLSBSZW1haW4gb24gY2hhbm5lbCByZXF1ZXN0CisgKiBAbXNnX3R5cGU6IE1lc3NhZ2UgdHlwZQorICogQG1zZ19sZW46IE1lc3NhZ2UgTGVuZ3RoCisgKiBAc2Vzc2lvbl9pZDogU01FIHNlc3Npb24gSWQKKyAqIEBjaGFubmVsOiBjaGFubmVsIG51bWJlcgorICogQGNhbGxiYWNrOiBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHNjYW4gcmVzdWx0CisgKiBAZHVyYXRpb246IFJvYyBkdXJhdGlvbgorICogQGlzX3AycHByb2JlX2FsbG93ZWQgOiBmbGFnIGZvciBwMnAgcHJvYmUgcmVxdWVzdAorICogQGN0eDogR2xvYmFsIGNvbnRleHQKKyAqIEBzY2FuX2lkOiBTY2FuIElkZW50aWZpZXIKKyAqCisgKiBSZW1haW4gb24gY2hhbm5lbCByZXF1ZXN0IG1lc3NhZ2Ugc3RydWN0dXJlCisgKi8KK3N0cnVjdCBhbmlfcm9jX3JlcSB7CisJLyogbWVzc2FnZSB0eXBlIGlzIHNhbWUgYXMgdGhlIHJlcXVlc3QgdHlwZSAqLworCXVpbnQxNl90IG1zZ190eXBlOworCS8qIGxlbmd0aCBvZiB0aGUgZW50aXJlIHJlcXVlc3QgKi8KKwl1aW50MTZfdCBtc2dfbGVuOworCXVpbnQxNl90IHNlc3Npb25faWQ7CisJdWludDhfdCBjaGFubmVsOworCXVpbnQzMl90IGR1cmF0aW9uOworCXVpbnQ4X3QgaXNfcDJwcHJvYmVfYWxsb3dlZDsKKwl2b2lkICpjYWxsYmFjazsKKwl2b2lkICpjdHg7CisJdWludDMyX3Qgc2Nhbl9pZDsKK307CisKKy8qIGdlbmVyaWMgY291bnRyeSBjb2RlIGNoYW5nZSByZXF1ZXN0IE1TRyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHNBbmlHZW5lcmljQ2hhbmdlQ291bnRyeUNvZGVSZXEgeworCS8qIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXF1ZXN0cyAqLworCXVpbnQxNl90IG1zZ1R5cGU7ICAgICAgIC8qIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUgKi8KKwl1aW50MTZfdCBtc2dMZW47ICAgICAgICAvKiBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0ICovCisJdWludDhfdCBjb3VudHJ5Q29kZVtXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU5dOyAgLyogMyBjaGFyIGNvdW50cnkgY29kZSAqLworCXVpbnQxNl90IGRvbWFpbl9pbmRleDsKK30gdEFuaUdlbmVyaWNDaGFuZ2VDb3VudHJ5Q29kZVJlcSwgKnRwQW5pR2VuZXJpY0NoYW5nZUNvdW50cnlDb2RlUmVxOworCit0eXBlZGVmIHN0cnVjdCBzQW5pREhDUFN0b3BJbmQgeworCXVpbnQxNl90IG1zZ1R5cGU7ICAgICAgIC8qIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUgKi8KKwl1aW50MTZfdCBtc2dMZW47ICAgICAgICAvKiBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0ICovCisJdWludDhfdCBkZXZpY2VfbW9kZTsgICAgLyogTW9kZSBvZiB0aGUgZGV2aWNlKGV4OlNUQSwgQVApICovCisJdFNpck1hY0FkZHIgYWRhcHRlck1hY0FkZHI7ICAgICAvKiBNQUMgYWRkcmVzcyBvZiB0aGUgYWRhcHRlciAqLworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOyAgICAgICAgLyogTUFDIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3RlZCBwZWVyICovCisKK30gdEFuaURIQ1BJbmQsICp0cEFuaURIQ1BJbmQ7CisKK3R5cGVkZWYgZW51bSBlVHhSYXRlSW5mbyB7CisJZUhBTF9UWF9SQVRFX0xFR0FDWSA9IDB4MSwgICAgICAvKiBMZWdhY3kgcmF0ZXMgKi8KKwllSEFMX1RYX1JBVEVfSFQyMCA9IDB4MiwgICAgICAgIC8qIEhUMjAgcmF0ZXMgKi8KKwllSEFMX1RYX1JBVEVfSFQ0MCA9IDB4NCwgICAgICAgIC8qIEhUNDAgcmF0ZXMgKi8KKwllSEFMX1RYX1JBVEVfU0dJID0gMHg4LCAvKiBSYXRlIHdpdGggU2hvcnQgZ3VhcmQgaW50ZXJ2YWwgKi8KKwllSEFMX1RYX1JBVEVfTEdJID0gMHgxMCwgICAgICAgIC8qIFJhdGUgd2l0aCBMb25nIGd1YXJkIGludGVydmFsICovCisJZUhBTF9UWF9SQVRFX1ZIVDIwID0gMHgyMCwgICAgICAvKiBWSFQgMjAgcmF0ZXMgKi8KKwllSEFMX1RYX1JBVEVfVkhUNDAgPSAweDQwLCAgICAgIC8qIFZIVCA0MCByYXRlcyAqLworCWVIQUxfVFhfUkFURV9WSFQ4MCA9IDB4ODAgICAgICAgLyogVkhUIDgwIHJhdGVzICovCit9IHRUeHJhdGVpbmZvZmxhZ3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqUEUgU3RhdGlzdGljcyBlbmQqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBzU2lyUDJQTm9hU3RhcnQgeworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBic3NJZHg7Cit9IHRTaXJQMlBOb2FTdGFydCwgKnRwU2lyUDJQTm9hU3RhcnQ7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJUZGxzSW5kIHsKKwl1aW50MTZfdCBzdGF0dXM7CisJdWludDE2X3QgYXNzb2NJZDsKKwl1aW50MTZfdCBzdGFJZHg7CisJdWludDE2X3QgcmVhc29uQ29kZTsKK30gdFNpclRkbHNJbmQsICp0cFNpclRkbHNJbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJQMlBOb2FBdHRyIHsKKyNpZmRlZiBBTklfQklHX0JZVEVfRU5ESUFOCisJdWludDMyX3QgaW5kZXg6ODsKKwl1aW50MzJfdCBvcHBQc0ZsYWc6MTsKKwl1aW50MzJfdCBjdFdpbjo3OworCXVpbnQzMl90IHJzdmQxOjE2OworI2Vsc2UKKwl1aW50MzJfdCByc3ZkMToxNjsKKwl1aW50MzJfdCBjdFdpbjo3OworCXVpbnQzMl90IG9wcFBzRmxhZzoxOworCXVpbnQzMl90IGluZGV4Ojg7CisjZW5kaWYKKworI2lmZGVmIEFOSV9CSUdfQllURV9FTkRJQU4KKwl1aW50MzJfdCB1Tm9hMUludGVydmFsQ250Ojg7CisJdWludDMyX3QgcnN2ZDI6MjQ7CisjZWxzZQorCXVpbnQzMl90IHJzdmQyOjI0OworCXVpbnQzMl90IHVOb2ExSW50ZXJ2YWxDbnQ6ODsKKyNlbmRpZgorCXVpbnQzMl90IHVOb2ExRHVyYXRpb247CisJdWludDMyX3QgdU5vYTFJbnRlcnZhbDsKKwl1aW50MzJfdCB1Tm9hMVN0YXJ0VGltZTsKKworI2lmZGVmIEFOSV9CSUdfQllURV9FTkRJQU4KKwl1aW50MzJfdCB1Tm9hMkludGVydmFsQ250Ojg7CisJdWludDMyX3QgcnN2ZDM6MjQ7CisjZWxzZQorCXVpbnQzMl90IHJzdmQzOjI0OworCXVpbnQzMl90IHVOb2EySW50ZXJ2YWxDbnQ6ODsKKyNlbmRpZgorCXVpbnQzMl90IHVOb2EyRHVyYXRpb247CisJdWludDMyX3QgdU5vYTJJbnRlcnZhbDsKKwl1aW50MzJfdCB1Tm9hMlN0YXJ0VGltZTsKK30gdFNpclAyUE5vYUF0dHIsICp0cFNpclAyUE5vYUF0dHI7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJUY2xhc0luZm8geworCXRTaXJNYWNUY2xhc0lFIHRjbGFzOworCXVpbnQ4X3QgdmVyc2lvbjsgICAgICAgIC8qIGFwcGxpZXMgb25seSBmb3IgY2xhc3NpZmllciB0eXBlIGlwICovCisJdW5pb24geworCQl0U2lyTWFjVGNsYXNQYXJhbUV0aGVybmV0IGV0aDsKKwkJdFNpck1hY1RjbGFzUGFyYW1JUHY0IGlwdjQ7CisJCXRTaXJNYWNUY2xhc1BhcmFtSVB2NiBpcHY2OworCQl0U2lyTWFjVGNsYXNQYXJhbTgwMjFkcSB0ODAyMWRxOworCX0gY2RmX3BhY2tlZCB0Y2xhc1BhcmFtczsKK30gY2RmX3BhY2tlZCB0U2lyVGNsYXNJbmZvOworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorI2RlZmluZSBUU1JTXzExQUdfUkFURV82TUJQUyAgIDB4QworI2RlZmluZSBUU1JTXzExQl9SQVRFXzVfNU1CUFMgIDB4QgordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY0VTRVRTUlNJRSB7CisJdWludDhfdCB0c2lkOworCXVpbnQ4X3QgcmF0ZXNbOF07Cit9IHRTaXJNYWNFU0VUU1JTSUU7Cit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjRVNFVFNNSUUgeworCXVpbnQ4X3QgdHNpZDsKKwl1aW50OF90IHN0YXRlOworCXVpbnQxNl90IG1zbXRfaW50ZXJ2YWw7Cit9IHRTaXJNYWNFU0VUU01JRTsKK3R5cGVkZWYgc3RydWN0IHNUU01TdGF0cyB7CisJdWludDhfdCB0aWQ7CisJdFNpck1hY0FkZHIgYnNzSWQ7CisJdFRyYWZTdHJtTWV0cmljcyB0c21NZXRyaWNzOworfSB0VFNNU3RhdHMsICp0cFRTTVN0YXRzOwordHlwZWRlZiBzdHJ1Y3Qgc0VzZVRTTUNvbnRleHQgeworCXVpbnQ4X3QgdGlkOworCXRTaXJNYWNFU0VUU01JRSB0c21JbmZvOworCXRUcmFmU3RybU1ldHJpY3MgdHNtTWV0cmljczsKK30gdEVzZVRTTUNvbnRleHQsICp0cEVzZVRTTUNvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCBzRXNlUEVDb250ZXh0IHsKKwl0RXNlVFNNQ29udGV4dCB0c207Cit9IHRFc2VQRUNvbnRleHQsICp0cEVzZVBFQ29udGV4dDsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisKK3R5cGVkZWYgc3RydWN0IHNTaXJBZGR0c1JlcUluZm8geworCXVpbnQ4X3QgZGlhbG9nVG9rZW47CisJdFNpck1hY1RzcGVjSUUgdHNwZWM7CisKKwl1aW50OF90IG51bVRjbGFzOyAgICAgICAvKiBudW1iZXIgb2YgVGNsYXMgZWxlbWVudHMgKi8KKwl0U2lyVGNsYXNJbmZvIHRjbGFzSW5mb1tTSVJfTUFDX1RDTEFTSUVfTUFYTlVNXTsKKwl1aW50OF90IHRjbGFzUHJvYzsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpCisJdFNpck1hY0VTRVRTUlNJRSB0c3JzSUU7CisJdWludDhfdCB0c3JzUHJlc2VudDoxOworI2VuZGlmCisJdWludDhfdCB3bWVUc3BlY1ByZXNlbnQ6MTsKKwl1aW50OF90IHdzbVRzcGVjUHJlc2VudDoxOworCXVpbnQ4X3QgbGxlVHNwZWNQcmVzZW50OjE7CisJdWludDhfdCB0Y2xhc1Byb2NQcmVzZW50OjE7Cit9IHRTaXJBZGR0c1JlcUluZm8sICp0cFNpckFkZHRzUmVxSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckFkZHRzUnNwSW5mbyB7CisJdWludDhfdCBkaWFsb2dUb2tlbjsKKwl0U2lyTWFjU3RhdHVzQ29kZXMgc3RhdHVzOworCXRTaXJNYWNUc0RlbGF5SUUgZGVsYXk7CisKKwl0U2lyTWFjVHNwZWNJRSB0c3BlYzsKKwl1aW50OF90IG51bVRjbGFzOyAgICAgICAvKiBudW1iZXIgb2YgVGNsYXMgZWxlbWVudHMgKi8KKwl0U2lyVGNsYXNJbmZvIHRjbGFzSW5mb1tTSVJfTUFDX1RDTEFTSUVfTUFYTlVNXTsKKwl1aW50OF90IHRjbGFzUHJvYzsKKwl0U2lyTWFjU2NoZWR1bGVJRSBzY2hlZHVsZTsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisJdFNpck1hY0VTRVRTTUlFIHRzbUlFOworCXVpbnQ4X3QgdHNtUHJlc2VudDoxOworI2VuZGlmCisJdWludDhfdCB3bWVUc3BlY1ByZXNlbnQ6MTsKKwl1aW50OF90IHdzbVRzcGVjUHJlc2VudDoxOworCXVpbnQ4X3QgbGxlVHNwZWNQcmVzZW50OjE7CisJdWludDhfdCB0Y2xhc1Byb2NQcmVzZW50OjE7CisJdWludDhfdCBzY2hlZHVsZVByZXNlbnQ6MTsKK30gdFNpckFkZHRzUnNwSW5mbywgKnRwU2lyQWRkdHNSc3BJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzU2lyRGVsdHNSZXFJbmZvIHsKKwl0U2lyTWFjVFNJbmZvIHRzaW5mbzsKKwl0U2lyTWFjVHNwZWNJRSB0c3BlYzsKKwl1aW50OF90IHdtZVRzcGVjUHJlc2VudDoxOworCXVpbnQ4X3Qgd3NtVHNwZWNQcmVzZW50OjE7CisJdWludDhfdCBsbGVUc3BlY1ByZXNlbnQ6MTsKK30gdFNpckRlbHRzUmVxSW5mbywgKnRwU2lyRGVsdHNSZXFJbmZvOworCisvKiAvIEFkZCBhIHRzcGVjIGFzIGRlZmluZWQgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJBZGR0c1JlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfQUREVFNfUkVRICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIEJTU0lEICovCisJdWludDMyX3QgdGltZW91dDsgICAgICAgLyogaW4gbXMgKi8KKwl1aW50OF90IHJzcFJlcWQ7CisJdFNpckFkZHRzUmVxSW5mbyByZXE7Cit9IHRTaXJBZGR0c1JlcSwgKnRwU2lyQWRkdHNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJBZGR0c1JzcCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfQUREVFNfUlNQICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIHNtZSBzZXNzaW9uSWQgIEFkZGVkIGZvciBCVC1BTVAgc3VwcG9ydCAqLworCXVpbnQxNl90IHRyYW5zYWN0aW9uSWQ7IC8qIHNtZSB0cmFuc2FjdGlvbiBJZCAtIGZvciBCVC1BTVAgU3VwcG9ydCAqLworCXVpbnQzMl90IHJjOyAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisJdFNpckFkZHRzUnNwSW5mbyByc3A7Cit9IHRTaXJBZGR0c1JzcCwgKnRwU2lyQWRkdHNSc3A7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJEZWx0c1JlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfREVMVFNfUkVRICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIEJTU0lEICovCisJdWludDE2X3QgYWlkOyAgICAgICAgICAgLyogdXNlIDAgaWYgbWFjQWRkciBpcyBiZWluZyBzcGVjaWZpZWQgKi8KKwl0U2lyTWFjQWRkciBtYWNBZGRyOyAgICAvKiBvbmx5IG9uIEFQIHRvIHNwZWNpZnkgdGhlIFNUQSAqLworCXVpbnQ4X3QgcnNwUmVxZDsKKwl0U2lyRGVsdHNSZXFJbmZvIHJlcTsKK30gdFNpckRlbHRzUmVxLCAqdHBTaXJEZWx0c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckRlbHRzUnNwIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9ERUxUU19SU1AgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogc21lIHNlc3Npb25JZCAgQWRkZWQgZm9yIEJULUFNUCBzdXBwb3J0ICovCisJdWludDE2X3QgdHJhbnNhY3Rpb25JZDsgLyogc21lIHRyYW5zYWN0aW9uIElkIC0gZm9yIEJULUFNUCBTdXBwb3J0ICovCisJdWludDMyX3QgcmM7CisJdWludDE2X3QgYWlkOyAgICAgICAgICAgLyogdXNlIDAgaWYgbWFjQWRkciBpcyBiZWluZyBzcGVjaWZpZWQgKi8KKwl0U2lyTWFjQWRkciBtYWNBZGRyOyAgICAvKiBvbmx5IG9uIEFQIHRvIHNwZWNpZnkgdGhlIFNUQSAqLworCXRTaXJEZWx0c1JlcUluZm8gcnNwOworfSB0U2lyRGVsdHNSc3AsICp0cFNpckRlbHRzUnNwOworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQordHlwZWRlZiBzdHJ1Y3Qgc1NpclBsbVJlcSB7CisJdWludDE2X3QgZGlhZ190b2tlbjsgICAgLyogRGlhbG9nIHRva2VuICovCisJdWludDE2X3QgbWVhc190b2tlbjsgICAgLyogbWVhc3VyZW1lbnQgdG9rZW4gKi8KKwl1aW50MTZfdCBudW1CdXJzdHM7ICAgICAvKiB0b3RhbCBudW1iZXIgb2YgYnVyc3RzICovCisJdWludDE2X3QgYnVyc3RJbnQ7ICAgICAgLyogYnVyc3QgaW50ZXJ2YWwgaW4gc2Vjb25kcyAqLworCXVpbnQxNl90IG1lYXNEdXJhdGlvbjsgIC8qIGluIFRVJ3MsU1RBIGdvZXMgb2ZmLWNoICovCisJLyogbm8gb2YgdGltZXMgdGhlIFNUQSBzaG91bGQgY3ljbGUgdGhyb3VnaCBQTE0gY2ggbGlzdCAqLworCXVpbnQ4X3QgYnVyc3RMZW47CisJdFBvd2VyZEJtIGRlc2lyZWRUeFB3cjsgLyogZGVzaXJlZCB0eCBwb3dlciAqLworCXRTaXJNYWNBZGRyIG1hY0FkZHI7ICAgIC8qIE1DIGRlc3QgYWRkciAqLworCS8qIG5vIG9mIGNoYW5uZWxzICovCisJdWludDhfdCBwbG1OdW1DaDsKKwkvKiBjaGFubmVsIG51bWJlcnMgKi8KKwl1aW50OF90IHBsbUNoTGlzdFtXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCWJvb2wgZW5hYmxlOworfSB0U2lyUGxtUmVxLCAqdHBTaXJQbG1SZXE7CisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgfHwgZGVmaW5lZCBGRUFUVVJFX1dMQU5fRVNFIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKworI2RlZmluZSBTSVJfUU9TX05VTV9BQ19NQVggNAorCit0eXBlZGVmIHN0cnVjdCBzU2lyQWdnclFvc1JlcUluZm8geworCXVpbnQxNl90IHRzcGVjSWR4OworCXRTaXJBZGR0c1JlcUluZm8gYWdnckFkZFRzSW5mb1tTSVJfUU9TX05VTV9BQ19NQVhdOworfSB0U2lyQWdnclFvc1JlcUluZm8sICp0cFNpckFnZ3JRb3NSZXFJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzU2lyQWdnclFvc1JlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfQUREVFNfUkVRICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIEJTU0lEICovCisJdWludDMyX3QgdGltZW91dDsgICAgICAgLyogaW4gbXMgKi8KKwl1aW50OF90IHJzcFJlcWQ7CisJdFNpckFnZ3JRb3NSZXFJbmZvIGFnZ3JJbmZvOworfSB0U2lyQWdnclFvc1JlcSwgKnRwU2lyQWdnclFvc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckFnZ3JRb3NSc3BJbmZvIHsKKwl1aW50MTZfdCB0c3BlY0lkeDsKKwl0U2lyQWRkdHNSc3BJbmZvIGFnZ3JSc3BbU0lSX1FPU19OVU1fQUNfTUFYXTsKK30gdFNpckFnZ3JRb3NSc3BJbmZvLCAqdHBTaXJBZ2dyUW9zUnNwSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckFnZ3JRb3NSc3AgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl0U2lyQWdnclFvc1JzcEluZm8gYWdnckluZm87Cit9IHRTaXJBZ2dyUW9zUnNwLCAqdHBTaXJBZ2dyUW9zUnNwOworCisjZW5kaWYgLypXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiB8fCBGRUFUVVJFX1dMQU5fRVNFICovCisKK3R5cGVkZWYgc3RydWN0IHNTaXJRb3NNYXBTZXQgeworCXVpbnQ4X3QgcHJlc2VudDsKKwl1aW50OF90IG51bV9kc2NwX2V4Y2VwdGlvbnM7CisJdWludDhfdCBkc2NwX2V4Y2VwdGlvbnNbMjFdWzJdOworCXVpbnQ4X3QgZHNjcF9yYW5nZVs4XVsyXTsKK30gdFNpclFvc01hcFNldCwgKnRwU2lyUW9zTWFwU2V0OworCit0eXBlZGVmIHN0cnVjdCBzU21lSWJzc1BlZXJJbmQgeworCXVpbnQxNl90IG1lc2dUeXBlOworCXVpbnQxNl90IG1lc2dMZW47CisJdWludDhfdCBzZXNzaW9uSWQ7CisKKwl0U2lyTWFjQWRkciBwZWVyQWRkcjsKKwl1aW50MTZfdCBzdGFJZDsKKworCS8qCisJICogVGhlIERQVSBzaWduYXR1cmVzIHdpbGwgYmUgc2VudCBldmVudHVhbGx5IHRvIFRMIHRvIGhlbHAgaXQgZGV0ZXJtaW5lCisJICogdGhlIGFzc29jaWF0aW9uIHRvIHdoaWNoIGEgcGFja2V0IGJlbG9uZ3MgdG8KKwkgKi8KKwkvKiBVbmljYXN0IERQVSBzaWduYXR1cmUgKi8KKwl1aW50OF90IHVjYXN0U2lnOworCisJLypCcm9hZGNhc3QgRFBVIHNpZ25hdHVyZSAqLworCXVpbnQ4X3QgYmNhc3RTaWc7CisKKwkvKiBCZWFjb24gd2lsbCBiZSBhcHBlbmRlZCBmb3IgbmV3IFBlZXIgaW5kaWNhdGlvbi4gKi8KK30gdFNtZUlic3NQZWVySW5kLCAqdHBTbWVJYnNzUGVlckluZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npcklic3NQZWVySW5hY3Rpdml0eUluZCB7CisJdWludDhfdCBic3NJZHg7CisJdWludDhfdCBzdGFJZHg7CisJdFNpck1hY0FkZHIgcGVlckFkZHI7Cit9IHRTaXJJYnNzUGVlckluYWN0aXZpdHlJbmQsICp0cFNpcklic3NQZWVySW5hY3Rpdml0eUluZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbVNjYW5DaG4geworCXVpbnQxNl90IG51bVRpbWVTY2FuOyAgIC8qIGhvdyBtYW55IHRpbWUgdGhpcyBjaGFubmVsIGlzIHNjYW4gKi8KKwl1aW50OF90IGNoYW5uZWxJZDsKK30gdExpbVNjYW5DaG47CisKK3R5cGVkZWYgc3RydWN0IHNTbWVHZXRTY2FuQ2huUnNwIHsKKwkvKiBNZXNzYWdlIFR5cGUgKi8KKwl1aW50MTZfdCBtZXNnVHlwZTsKKwkvKiBNZXNzYWdlIExlbmd0aCAqLworCXVpbnQxNl90IG1lc2dMZW47CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDhfdCBudW1DaG47CisJdExpbVNjYW5DaG4gc2NhbkNoblsxXTsKK30gdFNtZUdldFNjYW5DaG5Sc3AsICp0cFNtZUdldFNjYW5DaG5Sc3A7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1TY2FuQ2huSW5mbyB7CisJdWludDhfdCBudW1DaG5JbmZvOyAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIGluIHNjYW5DaG4gKi8KKwl0TGltU2NhbkNobiBzY2FuQ2huW1NJUl9NQVhfU1VQUE9SVEVEX0NIQU5ORUxfTElTVF07Cit9IHRMaW1TY2FuQ2huSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZUdldEFzc29jU1RBc1JlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfR0VUX0FTU09DX1NUQVNfUkVRICovCisJdWludDE2X3QgbGVuZ3RoOworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIEJTU0lEICovCisJdWludDE2X3QgbW9kSWQ7CisJdm9pZCAqcFVzckNvbnRleHQ7CisJdm9pZCAqcFNhcEV2ZW50Q2FsbGJhY2s7CisJLyogUG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtIHBhc3NlZCBpbiB3bGFuc2FwX2dldF9hc3NvY19zdGF0aW9ucyBBUEkgKi8KKwl2b2lkICpwQXNzb2NTdGFzQXJyYXk7Cit9IHRTaXJTbWVHZXRBc3NvY1NUQXNSZXEsICp0cFNpclNtZUdldEFzc29jU1RBc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NtZU1heEFzc29jSW5kIHsKKwl1aW50MTZfdCBtZXNnVHlwZTsgICAgICAvKiBlV05JX1NNRV9NQVhfQVNTT0NfRVhDRUVERUQgKi8KKwl1aW50MTZfdCBtZXNnTGVuOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCS8qIHRoZSBuZXcgcGVlciB0aGF0IGdvdCByZWplY3RlZCBtYXggYXNzb2MgbGltaXQgcmVhY2hlZCAqLworCXRTaXJNYWNBZGRyIHBlZXJNYWM7Cit9IHRTbWVNYXhBc3NvY0luZCwgKnRwU21lTWF4QXNzb2NJbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNTbWVDc2FPZmZsb2FkSW5kIHsKKwl1aW50MTZfdCBtZXNnVHlwZTsgICAgICAvKiBlV05JX1NNRV9DU0FfT0ZGTE9BRF9FVkVOVCAqLworCXVpbnQxNl90IG1lc2dMZW47CisJdFNpck1hY0FkZHIgYnNzSWQ7ICAgICAgLyogQlNTSUQgKi8KK30gdFNtZUNzYU9mZmxvYWRJbmQsICp0cFNtZUNzYU9mZmxvYWRJbmQ7CisKKy8qIFdPVyByZWxhdGVkIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgU0lSX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRSAxNDYKKworLyoqCisgKiBzdHJ1Y3Qgd293X2FkZF9wYXR0ZXJuIC0gd293IHBhdHRlcm4gYWRkIHN0cnVjdHVyZQorICogQHBhdHRlcm5faWQ6IHBhdHRlcm4gaWQKKyAqIEBwYXR0ZXJuX2J5dGVfb2Zmc2V0OiBwYXR0ZXJuIGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHRoZSA4MDIuMTEKKyAqCQkJIHBhY2tldCB0byBzdGFydCBvZiB0aGUgd2FrZS11cCBwYXR0ZXJuCisgKiBAcGF0dGVybl9zaXplOiBwYXR0ZXJuIHNpemUKKyAqIEBwYXR0ZXJuOiBwYXR0ZXJuIGJ5dGUgc3RyZWFtCisgKiBAcGF0dGVybl9tYXNrX3NpemU6IHBhdHRlcm4gbWFzayBzaXplCisgKiBAcGF0dGVybl9tYXNrOiBwYXR0ZXJuIG1hc2sKKyAqIEBzZXNzaW9uX2lkOiBzZXNzaW9uIGlkCisgKi8KK3N0cnVjdCB3b3dfYWRkX3BhdHRlcm4geworCXVpbnQ4X3QgcGF0dGVybl9pZDsKKwl1aW50OF90IHBhdHRlcm5fYnl0ZV9vZmZzZXQ7CisJdWludDhfdCBwYXR0ZXJuX3NpemU7CisJdWludDhfdCBwYXR0ZXJuW1NJUl9XT1dMX0JDQVNUX1BBVFRFUk5fTUFYX1NJWkVdOworCXVpbnQ4X3QgcGF0dGVybl9tYXNrX3NpemU7CisJdWludDhfdCBwYXR0ZXJuX21hc2tbU0lSX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRV07CisJdWludDhfdCBzZXNzaW9uX2lkOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgd293X2RlbGV0ZV9wYXRlcm4gLSB3b3cgcGF0dGVybiBkZWxldGUgc3RydWN0dXJlCisgKiBAcGF0dGVybl9pZDogcGF0dGVybiBpZCBvZiB3YWtlIHVwIHBhdHRlcm4gdG8gYmUgZGVsZXRlZAorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqLworc3RydWN0IHdvd19kZWxldGVfcGF0dGVybiB7CisJdWludDhfdCBwYXR0ZXJuX2lkOworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsKK307CisKKy8qIFNNRS0+UEU6IEVudGVyIFdPV0xBTiBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lV293bEVudGVyUGFyYW1zIHsKKwl1aW50OF90IHNlc3Npb25JZDsKKworCS8qIEVuYWJsZXMvZGlzYWJsZXMgbWFnaWMgcGFja2V0IGZpbHRlcmluZyAqLworCXVpbnQ4X3QgdWNNYWdpY1BrdEVuYWJsZTsKKworCS8qIE1hZ2ljIHBhdHRlcm4gKi8KKwl0U2lyTWFjQWRkciBtYWdpY1B0cm47CisKKwkvKiBFbmFibGVzL2Rpc2FibGVzIHBhY2tldCBwYXR0ZXJuIGZpbHRlcmluZyAqLworCXVpbnQ4X3QgdWNQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlOworCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisJLyoKKwkgKiBUaGlzIGNvbmZpZ3VyYXRpb24gZGlyZWN0cyB0aGUgV29XIHBhY2tldCBmaWx0ZXJpbmcgdG8gbG9vayBhdCBFQVAtSUQKKwkgKiByZXF1ZXN0cyBlbWJlZGRlZCBpbiBFQVBPTCBmcmFtZXMgYW5kIHVzZSB0aGlzIGFzIGEgd2FrZSBzb3VyY2UuCisJICovCisJdWludDhfdCB1Y1dvV0VBUElEUmVxdWVzdEVuYWJsZTsKKworCS8qCisJICogVGhpcyBjb25maWd1cmF0aW9uIGRpcmVjdHMgdGhlIFdvVyBwYWNrZXQgZmlsdGVyaW5nIHRvIGxvb2sgZm9yCisJICogRUFQT0wtNFdBWSByZXF1ZXN0cyBhbmQgdXNlIHRoaXMgYXMgYSB3YWtlIHNvdXJjZS4KKwkgKi8KKwl1aW50OF90IHVjV29XRUFQT0w0V2F5RW5hYmxlOworCisJLyoKKwkgKiBUaGlzIGNvbmZpZ3VyYXRpb24gYWxsb3dzIGEgaG9zdCB3YWtldXAgb24gYW4gbmV0d29yayBzY2FuCisJICogb2ZmbG9hZCBtYXRjaC4KKwkgKi8KKwl1aW50OF90IHVjV293TmV0U2Nhbk9mZmxvYWRNYXRjaDsKKworCS8qIFRoaXMgY29uZmlndXJhdGlvbiBhbGxvd3MgYSBob3N0IHdha2V1cCBvbiBhbnkgR1RLIHJla2V5aW5nIGVycm9yLgorCSAqLworCXVpbnQ4X3QgdWNXb3dHVEtSZWtleUVycm9yOworCisJLyogVGhpcyBjb25maWd1cmF0aW9uIGFsbG93cyBhIGhvc3Qgd2FrZXVwIG9uIEJTUyBjb25uZWN0aW9uIGxvc3MuCisJICovCisJdWludDhfdCB1Y1dvV0JTU0Nvbm5Mb3NzOworI2VuZGlmIC8qIFdMQU5fV0FLRVVQX0VWRU5UUyAqLworCisJdFNpck1hY0FkZHIgYnNzSWQ7Cit9IHRTaXJTbWVXb3dsRW50ZXJQYXJhbXMsICp0cFNpclNtZVdvd2xFbnRlclBhcmFtczsKKworLyogUEU8LT5IQUw6IEVudGVyIFdPV0xBTiBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBzU2lySGFsV293bEVudGVyUGFyYW1zIHsKKwl1aW50OF90IHNlc3Npb25JZDsKKworCS8qIEVuYWJsZXMvZGlzYWJsZXMgbWFnaWMgcGFja2V0IGZpbHRlcmluZyAqLworCXVpbnQ4X3QgdWNNYWdpY1BrdEVuYWJsZTsKKworCS8qIE1hZ2ljIHBhdHRlcm4gKi8KKwl0U2lyTWFjQWRkciBtYWdpY1B0cm47CisKKwkvKiBFbmFibGVzL2Rpc2FibGVzIHBhY2tldCBwYXR0ZXJuIGZpbHRlcmluZyBpbiBmaXJtd2FyZS4KKwkgICBFbmFibGluZyB0aGlzIGZsYWcgZW5hYmxlcyBicm9hZGNhc3QgcGF0dGVybiBtYXRjaGluZworCSAgIGluIEZpcm13YXJlLiBJZiB1bmljYXN0IHBhdHRlcm4gbWF0Y2hpbmcgaXMgYWxzbyBkZXNpcmVkLAorCSAgIHVjVWNhc3RQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlIGZsYWcgbXVzdCBiZSBzZXQgdG90IHRydWUKKwkgICBhcyB3ZWxsCisJICovCisJdWludDhfdCB1Y1BhdHRlcm5GaWx0ZXJpbmdFbmFibGU7CisKKwkvKiBFbmFibGVzL2Rpc2FibGVzIHVuaWNhc3QgcGFja2V0IHBhdHRlcm4gZmlsdGVyaW5nLgorCSAgIFRoaXMgZmxhZyBzcGVjaWZpZXMgd2hldGhlciB3ZSB3YW50IHRvIGRvIHBhdHRlcm4gbWF0Y2gKKwkgICBvbiB1bmljYXN0IHBhY2tldHMgYXMgd2VsbCBhbmQgbm90IGp1c3QgYnJvYWRjYXN0IHBhY2tldHMuCisJICAgVGhpcyBmbGFnIGhhcyBubyBlZmZlY3QgaWYgdGhlIHVjUGF0dGVybkZpbHRlcmluZ0VuYWJsZQorCSAgIChtYWluIGNvbnRyb2xsaW5nIGZsYWcpIGlzIHNldCB0byBmYWxzZQorCSAqLworCXVpbnQ4X3QgdWNVY2FzdFBhdHRlcm5GaWx0ZXJpbmdFbmFibGU7CisKKwkvKiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQgb25seSB3aGVuIG1hZ2ljUGt0RW5hYmxlPTEuCisJICogSXQgcmVxdWVzdHMgaGFyZHdhcmUgdG8gd2FrZSB1cCB3aGVuIGl0IHJlY2VpdmVzIHRoZQorCSAqIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBGcmFtZS4KKwkgKi8KKwl1aW50OF90IHVjV293Q2hubFN3aXRjaFJjdjsKKworCS8qIFRoaXMgY29uZmlndXJhdGlvbiBpcyB2YWxpZCBvbmx5IHdoZW4gbWFnaWNQa3RFbmFibGU9MS4KKwkgKiBJdCByZXF1ZXN0cyBoYXJkd2FyZSB0byB3YWtlIHVwIHdoZW4gaXQgcmVjZWl2ZXMgdGhlCisJICogRGVhdXRoZW50aWNhdGlvbiBGcmFtZS4KKwkgKi8KKwl1aW50OF90IHVjV293RGVhdXRoUmN2OworCisJLyogVGhpcyBjb25maWd1cmF0aW9uIGlzIHZhbGlkIG9ubHkgd2hlbiBtYWdpY1BrdEVuYWJsZT0xLgorCSAqIEl0IHJlcXVlc3RzIGhhcmR3YXJlIHRvIHdha2UgdXAgd2hlbiBpdCByZWNlaXZlcyB0aGUKKwkgKiBEaXNhc3NvY2lhdGlvbiBGcmFtZS4KKwkgKi8KKwl1aW50OF90IHVjV293RGlzYXNzb2NSY3Y7CisKKwkvKiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQgb25seSB3aGVuIG1hZ2ljUGt0RW5hYmxlPTEuCisJICogSXQgcmVxdWVzdHMgaGFyZHdhcmUgdG8gd2FrZSB1cCB3aGVuIGl0IGhhcyBtaXNzZWQKKwkgKiBjb25zZWN1dGl2ZSBiZWFjb25zLiBUaGlzIGlzIGEgaGFyZHdhcmUgcmVnaXN0ZXIKKwkgKiBjb25maWd1cmF0aW9uIChOT1QgYSBmaXJtd2FyZSBjb25maWd1cmF0aW9uKS4KKwkgKi8KKwl1aW50OF90IHVjV293TWF4TWlzc2VkQmVhY29uczsKKworCS8qIFRoaXMgY29uZmlndXJhdGlvbiBpcyB2YWxpZCBvbmx5IHdoZW4gbWFnaWNQa3RFbmFibGU9MS4KKwkgKiBUaGlzIGlzIGEgdGltZW91dCB2YWx1ZSBpbiB1bml0cyBvZiBtaWNyb3NlYy4gSXQgcmVxdWVzdHMKKwkgKiBoYXJkd2FyZSB0byB1bmNvbmRpdGlvbmFsbHkgd2FrZSB1cCBhZnRlciBpdCBoYXMgc3RheWVkCisJICogaW4gV29XTEFOIG1vZGUgZm9yIHNvbWUgdGltZS4gU2V0IDAgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuCisJICovCisJdWludDhfdCB1Y1dvd01heFNsZWVwVXNlYzsKKworI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUworCS8qIFRoaXMgY29uZmlnIGRpcmVjdHMgdGhlIFdvVyBwa3QgZmlsdGVyaW5nIHRvIGxvb2sgZm9yIEVBUC1JRAorCSAqIHJlcXVlc3RzIGVtYmVkZGVkIGluIEVBUE9MIGZyYW1lcyBhbmQgdXNlIHRoaXMgYXMgYSB3YWtlIHNvdXJjZS4KKwkgKi8KKwl1aW50OF90IHVjV29XRUFQSURSZXF1ZXN0RW5hYmxlOworCisJLyogVGhpcyBjb25maWcgZGlyZWN0cyB0aGUgV29XIHBrdCBmaWx0ZXJpbmcgdG8gbG9vayBmb3IgRUFQT0wtNFdBWQorCSAqIHJlcXVlc3RzIGFuZCB1c2UgdGhpcyBhcyBhIHdha2Ugc291cmNlLgorCSAqLworCXVpbnQ4X3QgdWNXb1dFQVBPTDRXYXlFbmFibGU7CisKKwkvKiBUaGlzIGNvbmZpZyBhbGxvd3MgYSBob3N0IHdha2V1cCBvbiBhbiBuZXR3b3JrIHNjYW4gb2ZmbG9hZCBtYXRjaC4KKwkgKi8KKwl1aW50OF90IHVjV293TmV0U2Nhbk9mZmxvYWRNYXRjaDsKKworCS8qIFRoaXMgY29uZmlndXJhdGlvbiBhbGxvd3MgYSBob3N0IHdha2V1cCBvbiBhbnkgR1RLIHJla2V5aW5nIGVycm9yLgorCSAqLworCXVpbnQ4X3QgdWNXb3dHVEtSZWtleUVycm9yOworCisJLyogVGhpcyBjb25maWd1cmF0aW9uIGFsbG93cyBhIGhvc3Qgd2FrZXVwIG9uIEJTUyBjb25uZWN0aW9uIGxvc3MuCisJICovCisJdWludDhfdCB1Y1dvV0JTU0Nvbm5Mb3NzOworI2VuZGlmIC8qIFdMQU5fV0FLRVVQX0VWRU5UUyAqLworCisJLyogU3RhdHVzIGNvZGUgdG8gYmUgZmlsbGVkIGJ5IEhBTCB3aGVuIGl0IHNlbmRzCisJICogU0lSX0hBTF9XT1dMX0VOVEVSX1JTUCB0byBQRS4KKwkgKi8KKwlDREZfU1RBVFVTIHN0YXR1czsKKworCS8qQlNTSUQgdG8gZmluZCB0aGUgY3VycmVudCBzZXNzaW9uCisJICovCisJdWludDhfdCBic3NJZHg7Cit9IHRTaXJIYWxXb3dsRW50ZXJQYXJhbXMsICp0cFNpckhhbFdvd2xFbnRlclBhcmFtczsKKworLyogU01FLT5QRTogRXhpdCBXT1dMQU4gcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVdvd2xFeGl0UGFyYW1zIHsKKwl1aW50OF90IHNlc3Npb25JZDsKKworfSB0U2lyU21lV293bEV4aXRQYXJhbXMsICp0cFNpclNtZVdvd2xFeGl0UGFyYW1zOworCisvKiBQRTwtPkhBTDogRXhpdCBXT1dMQU4gcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpckhhbFdvd2xFeGl0UGFyYW1zIHsKKwl1aW50OF90IHNlc3Npb25JZDsKKworCS8qIFN0YXR1cyBjb2RlIHRvIGJlIGZpbGxlZCBieSBIQUwgd2hlbiBpdCBzZW5kcworCSAqIFNJUl9IQUxfV09XTF9FWElUX1JTUCB0byBQRS4KKwkgKi8KKwlDREZfU1RBVFVTIHN0YXR1czsKKworCS8qQlNTSURYIHRvIGZpbmQgdGhlIGN1cnJlbnQgc2Vzc2lvbgorCSAqLworCXVpbnQ4X3QgYnNzSWR4OworfSB0U2lySGFsV293bEV4aXRQYXJhbXMsICp0cFNpckhhbFdvd2xFeGl0UGFyYW1zOworCisjZGVmaW5lIFNJUl9NQVhfTkFNRV9TSVpFIDY0CisjZGVmaW5lIFNJUl9NQVhfVEVYVF9TSVpFIDMyCisKK3R5cGVkZWYgc3RydWN0IHNTaXJOYW1lIHsKKwl1aW50OF90IG51bV9uYW1lOworCXVpbnQ4X3QgbmFtZVtTSVJfTUFYX05BTUVfU0laRV07Cit9IHRTaXJOYW1lOworCit0eXBlZGVmIHN0cnVjdCBzU2lyVGV4dCB7CisJdWludDhfdCBudW1fdGV4dDsKKwl1aW50OF90IHRleHRbU0lSX01BWF9URVhUX1NJWkVdOworfSB0U2lyVGV4dDsKKworI2RlZmluZSBTSVJfV1BTX1BST0JSU1BfVkVSX1BSRVNFTlQgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTSVJfV1BTX1BST0JSU1BfU1RBVEVfUFJFU0VOVCAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9BUFNFVFVQTE9DS19QUkVTRU5UICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX1NFTEVDVEVEUkVHSVNUUkFfUFJFU0VOVCAgICAweDAwMDAwMDA4CisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9ERVZJQ0VQQVNTV09SRElEX1BSRVNFTlQgICAgMHgwMDAwMDAxMAorI2RlZmluZSBTSVJfV1BTX1BST0JSU1BfU0VMRUNURURSRUdJU1RSQUNGR01FVEhPRF9QUkVTRU5UICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX1JFU1BPTlNFVFlQRV9QUkVTRU5UICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX1VVSURFX1BSRVNFTlQgICAgMHgwMDAwMDA4MAorI2RlZmluZSBTSVJfV1BTX1BST0JSU1BfTUFOVUZBQ1RVUkVfUFJFU0VOVCAgICAweDAwMDAwMTAwCisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9NT0RFTE5BTUVfUFJFU0VOVCAgICAweDAwMDAwMjAwCisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9NT0RFTE5VTUJFUl9QUkVTRU5UICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX1NFUklBTE5VTUJFUl9QUkVTRU5UICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX1BSSU1BUllERVZJQ0VUWVBFX1BSRVNFTlQgICAgMHgwMDAwMTAwMAorI2RlZmluZSBTSVJfV1BTX1BST0JSU1BfREVWSUNFTkFNRV9QUkVTRU5UICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX0NPTkZJR01FVEhPRFNfUFJFU0VOVCAgICAweDAwMDA0MDAwCisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9SRl9CQU5EU19QUkVTRU5UICAgIDB4MDAwMDgwMDAKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldQU1Byb2JlUnNwSUUgeworCXVpbnQzMl90IEZpZWxkUHJlc2VudDsKKwl1aW50MzJfdCBWZXJzaW9uOyAgICAgICAvKiBWZXJzaW9uLiAweDEwID0gdmVyc2lvbiAxLjAsIDB4MTEgPSBldGMuICovCisJdWludDMyX3Qgd3BzU3RhdGU7ICAgICAgLyogMSA9IHVuY29uZmlndXJlZCwgMiA9IGNvbmZpZ3VyZWQuICovCisJYm9vbCBBUFNldHVwTG9ja2VkOyAgICAgLyogTXVzdCBiZSBpbmNsdWRlZCBpZiB2YWx1ZSBpcyB0cnVlICovCisJLyoKKwkgKiBCT09MOiAgaW5kaWNhdGVzIGlmIHRoZSB1c2VyIGhhcyByZWNlbnRseSBhY3RpdmF0ZWQgYSBSZWdpc3RyYXIgdG8KKwkgKiBhZGQgYW4gRW5yb2xsZWUuCisJICovCisJYm9vbCBTZWxlY3RlZFJlZ2lzdHJhOworCXVpbnQxNl90IERldmljZVBhc3N3b3JkSUQ7ICAgICAgLyogRGV2aWNlIFBhc3N3b3JkIElEICovCisJLyogU2VsZWN0ZWQgUmVnaXN0cmFyIGNvbmZpZyBtZXRob2QgKi8KKwl1aW50MTZfdCBTZWxlY3RlZFJlZ2lzdHJhQ2ZnTWV0aG9kOworCXVpbnQ4X3QgUmVzcG9uc2VUeXBlOyAgIC8qIFJlc3BvbnNlIHR5cGUgKi8KKwl1aW50OF90IFVVSURfRVsxNl07ICAgICAvKiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQVAuICovCisJdFNpck5hbWUgTWFudWZhY3R1cmU7CisJdFNpclRleHQgTW9kZWxOYW1lOworCXRTaXJUZXh0IE1vZGVsTnVtYmVyOworCXRTaXJUZXh0IFNlcmlhbE51bWJlcjsKKwkvKiBEZXZpY2UgQ2F0ZWdvcnkgSUQ6IDFDb21wdXRlciwgMklucHV0IERldmljZSwgLi4uICovCisJdWludDMyX3QgUHJpbWFyeURldmljZUNhdGVnb3J5OworCS8qIFZlbmRvciBzcGVjaWZpYyBPVUkgZm9yIERldmljZSBTdWIgQ2F0ZWdvcnkgKi8KKwl1aW50OF90IFByaW1hcnlEZXZpY2VPVUlbNF07CisJLyoKKwkgICBEZXZpY2UgU3ViIENhdGVnb3J5IElEOiAxLVBDLCAyLVNlcnZlciBpZiBEZXZpY2UgQ2F0ZWdvcnkgSUQKKwkgKiBpcyBjb21wdXRlcgorCSAqLworCXVpbnQzMl90IERldmljZVN1YkNhdGVnb3J5OworCXRTaXJUZXh0IERldmljZU5hbWU7CisJdWludDE2X3QgQ29uZmlnTWV0aG9kOyAgLyogQ29uZmlndWFyYXRpb24gbWV0aG9kICovCisJdWludDhfdCBSRkJhbmQ7ICAgICAgICAgLyogUkYgYmFuZHMgYXZhaWxhYmxlIG9uIHRoZSBBUCAqLworfSB0U2lyV1BTUHJvYmVSc3BJRTsKKworI2RlZmluZSBTSVJfV1BTX0JFQUNPTl9WRVJfUFJFU0VOVCAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNJUl9XUFNfQkVBQ09OX1NUQVRFX1BSRVNFTlQgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTSVJfV1BTX0JFQUNPTl9BUFNFVFVQTE9DS19QUkVTRU5UICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU0lSX1dQU19CRUFDT05fU0VMRUNURURSRUdJU1RSQV9QUkVTRU5UICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgU0lSX1dQU19CRUFDT05fREVWSUNFUEFTU1dPUkRJRF9QUkVTRU5UICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgU0lSX1dQU19CRUFDT05fU0VMRUNURURSRUdJU1RSQUNGR01FVEhPRF9QUkVTRU5UICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgU0lSX1dQU19CRUFDT05fVVVJREVfUFJFU0VOVCAgICAweDAwMDAwMDgwCisjZGVmaW5lIFNJUl9XUFNfQkVBQ09OX1JGX0JBTkRTX1BSRVNFTlQgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTSVJfV1BTX1VVSURfTEVOIDE2CisKK3R5cGVkZWYgc3RydWN0IHNTaXJXUFNCZWFjb25JRSB7CisJdWludDMyX3QgRmllbGRQcmVzZW50OworCXVpbnQzMl90IFZlcnNpb247ICAgICAgIC8qIFZlcnNpb24uIDB4MTAgPSB2ZXJzaW9uIDEuMCwgMHgxMSA9IGV0Yy4gKi8KKwl1aW50MzJfdCB3cHNTdGF0ZTsgICAgICAvKiAxID0gdW5jb25maWd1cmVkLCAyID0gY29uZmlndXJlZC4gKi8KKwlib29sIEFQU2V0dXBMb2NrZWQ7ICAgICAvKiBNdXN0IGJlIGluY2x1ZGVkIGlmIHZhbHVlIGlzIHRydWUgKi8KKwkvKgorCSAqIEJPT0w6ICBpbmRpY2F0ZXMgaWYgdGhlIHVzZXIgaGFzIHJlY2VudGx5IGFjdGl2YXRlZCBhIFJlZ2lzdHJhciB0bworCSAqIGFkZCBhbiBFbnJvbGxlZS4KKwkgKi8KKwlib29sIFNlbGVjdGVkUmVnaXN0cmE7CisJdWludDE2X3QgRGV2aWNlUGFzc3dvcmRJRDsgICAgICAvKiBEZXZpY2UgUGFzc3dvcmQgSUQgKi8KKwkvKiBTZWxlY3RlZCBSZWdpc3RyYXIgY29uZmlnIG1ldGhvZCAqLworCXVpbnQxNl90IFNlbGVjdGVkUmVnaXN0cmFDZmdNZXRob2Q7CisJdWludDhfdCBVVUlEX0VbU0lSX1dQU19VVUlEX0xFTl07ICAgICAvKiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQVAuICovCisJdWludDhfdCBSRkJhbmQ7ICAgICAgICAgLyogUkYgYmFuZHMgYXZhaWxhYmxlIG9uIHRoZSBBUCAqLworfSB0U2lyV1BTQmVhY29uSUU7CisKKyNkZWZpbmUgU0lSX1dQU19BU1NPQ1JTUF9WRVJfUFJFU0VOVCAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNJUl9XUFNfQVNTT0NSU1BfUkVTUE9OU0VUWVBFX1BSRVNFTlQgICAgMHgwMDAwMDAwMgorCit0eXBlZGVmIHN0cnVjdCBzU2lyV1BTQXNzb2NSc3BJRSB7CisJdWludDMyX3QgRmllbGRQcmVzZW50OworCXVpbnQzMl90IFZlcnNpb247CisJdWludDhfdCBSZXNwb3NlVHlwZTsKK30gdFNpcldQU0Fzc29jUnNwSUU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJBUFdQU0lFcyB7CisJdFNpcldQU1Byb2JlUnNwSUUgU2lyV1BTUHJvYmVSc3BJRTsgICAgIC8qV1BTIFNldCBQcm9iZSBSZXNwb3NlIElFICovCisJdFNpcldQU0JlYWNvbklFIFNpcldQU0JlYWNvbklFOyAvKldQUyBTZXQgQmVhY29uIElFICovCisJdFNpcldQU0Fzc29jUnNwSUUgU2lyV1BTQXNzb2NSc3BJRTsgICAgIC8qV1BTIFNldCBBc3NvYyBSZXNwb25zZSBJRSAqLworfSB0U2lyQVBXUFNJRXMsICp0cFNpcmlBUFdQU0lFczsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclVwZGF0ZUFQV1BTSUVzUmVxIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9VUERBVEVfQVBXUFNJRV9SRVEgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgdHJhbnNhY3Rpb25JZDsgLyogVHJhbnNhY3Rpb24gSUQgZm9yIGNtZCAqLworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIEJTU0lEICovCisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXRTaXJBUFdQU0lFcyBBUFdQU0lFczsKK30gdFNpclVwZGF0ZUFQV1BTSUVzUmVxLCAqdHBTaXJVcGRhdGVBUFdQU0lFc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclVwZGF0ZVBhcmFtcyB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7CisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50OF90IHNzaWRIaWRkZW47ICAgICAvKiBIaWRlIFNTSUQgKi8KK30gdFNpclVwZGF0ZVBhcmFtcywgKnRwU2lyVXBkYXRlUGFyYW1zOworCisvKiBCZWFjb24gSW50ZXJ2YWwgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJDaGFuZ2VCSVBhcmFtcyB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7CisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQxNl90IGJlYWNvbkludGVydmFsOyAgICAgICAgLyogQmVhY29uIEludGVydmFsICovCisJdFNpck1hY0FkZHIgYnNzSWQ7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworfSB0U2lyQ2hhbmdlQklQYXJhbXMsICp0cFNpckNoYW5nZUJJUGFyYW1zOworCisjaWZkZWYgUUNBX0hUXzIwNDBfQ09FWAordHlwZWRlZiBzdHJ1Y3Qgc1NpclNldEhUMjA0ME1vZGUgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IGNiTW9kZTsKKwlib29sIG9ic3NFbmFibGVkOworCXRTaXJNYWNBZGRyIGJzc0lkOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KK30gdFNpclNldEhUMjA0ME1vZGUsICp0cFNpclNldEhUMjA0ME1vZGU7CisjZW5kaWYKKworI2RlZmluZSBTSVJfV1BTX1BCQ19XQUxLX1RJTUUgICAxMjAgICAgIC8qIDEyMCBTZWNvbmQgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldQU1BCQ1Nlc3Npb24geworCXN0cnVjdCBzU2lyV1BTUEJDU2Vzc2lvbiAqbmV4dDsKKwl0U2lyTWFjQWRkciBhZGRyOworCXVpbnQ4X3QgdXVpZF9lW1NJUl9XUFNfVVVJRF9MRU5dOworCXVpbnQzMl90IHRpbWVzdGFtcDsKK30gdFNpcldQU1BCQ1Nlc3Npb247CisKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfR0VUX1dQU1BCQ19TRVNTSU9OX1JFUSAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl2b2lkICpwVXNyQ29udGV4dDsKKwl2b2lkICpwU2FwRXZlbnRDYWxsYmFjazsKKwl0U2lyTWFjQWRkciBic3NJZDsgICAgICAvKiBCU1NJRCAqLworCS8qIE1BQyBBZGRyZXNzIG9mIFNUQSBpbiBXUFMgU2Vzc2lvbiB0byBiZSByZW1vdmVkICovCisJdFNpck1hY0FkZHIgcFJlbW92ZU1hYzsKK30gdFNpclNtZUdldFdQU1BCQ1Nlc3Npb25zUmVxLCAqdHBTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldQU1BCQ1Byb2JlUmVxIHsKKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl1aW50MTZfdCBwcm9iZVJlcUlFTGVuOworCXVpbnQ4X3QgcHJvYmVSZXFJRVs1MTJdOworfSB0U2lyV1BTUEJDUHJvYmVSZXEsICp0cFNpcldQU1BCQ1Byb2JlUmVxOworCisvKiBwcm9iZXJlcSBmcm9tIHBlZXIsIHdoZW4gd3NjIGlzIGVuYWJsZWQgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVQcm9iZVJlcUluZCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogIGVXTklfU01FX1dQU19QQkNfUFJPQkVfUkVRX0lORCAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl0U2lyTWFjQWRkciBic3NJZDsKKwl0U2lyV1BTUEJDUHJvYmVSZXEgV1BTUEJDUHJvYmVSZXE7Cit9IHRTaXJTbWVQcm9iZVJlcUluZCwgKnRwU2lyU21lUHJvYmVSZXFJbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJVcGRhdGVBUFdQQVJTTklFc1JlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfU0VUX0FQV1BBUlNOSUVzX1JFUSAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOyAvKiBUcmFuc2FjdGlvbiBJRCBmb3IgY21kICovCisJdFNpck1hY0FkZHIgYnNzSWQ7ICAgICAgLyogQlNTSUQgKi8KKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBTZXNzaW9uIElEICovCisJdFNpclJTTmllIEFQV1BBUlNOSUVzOworfSB0U2lyVXBkYXRlQVBXUEFSU05JRXNSZXEsICp0cFNpclVwZGF0ZUFQV1BBUlNOSUVzUmVxOworCisjZGVmaW5lIFNJUl9ST0FNX01BWF9DSEFOTkVMUyAgICAgICAgICAgIDgwCisjZGVmaW5lIFNJUl9ST0FNX1NDQU5fTUFYX1BCX1JFUV9TSVpFICAgIDQ1MAorLyogT2NjdXBpZWQgY2hhbm5lbCBsaXN0IHJlbWFpbnMgc3RhdGljICovCisjZGVmaW5lIENIQU5ORUxfTElTVF9TVEFUSUMgICAgICAgICAgICAgICAgICAgMQorLyogT2NjdXBpZWQgY2hhbm5lbCBsaXN0IGNhbiBiZSBsZWFybnQgYWZ0ZXIgaW5pdCAqLworI2RlZmluZSBDSEFOTkVMX0xJU1RfRFlOQU1JQ19JTklUICAgICAgICAgICAgIDIKKy8qIE9jY3VwaWVkIGNoYW5uZWwgbGlzdCBjYW4gYmUgbGVhcm50IGFmdGVyIGZsdXNoICovCisjZGVmaW5lIENIQU5ORUxfTElTVF9EWU5BTUlDX0ZMVVNIICAgICAgICAgICAgMworLyogT2NjdXBpZWQgY2hhbm5lbCBsaXN0IGNhbiBiZSBsZWFybnQgYWZ0ZXIgdXBkYXRlICovCisjZGVmaW5lIENIQU5ORUxfTElTVF9EWU5BTUlDX1VQREFURSAgICAgICAgICAgNAorI2RlZmluZSBTSVJfUk9BTV9TQ0FOXzI0R19ERUZBVUxUX0NIICAgICAxCisjZGVmaW5lIFNJUl9ST0FNX1NDQU5fNUdfREVGQVVMVF9DSCAgICAgIDM2CisjZGVmaW5lIFNJUl9ST0FNX1NDQU5fUkVTRVJWRURfQllURVMgICAgIDYxCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisjZGVmaW5lIFNJUl9ST0FNX1NDQU5fUFNLX1NJWkUgICAgMzIKKyNkZWZpbmUgU0lSX1JPQU1fUjBLSF9JRF9NQVhfTEVOICA0OAorI2VuZGlmCisvKiBTTUUgLT4gSEFMIC0gVGhpcyBpcyB0aGUgaG9zdCBvZmZsb2FkIHJlcXVlc3QuICovCisjZGVmaW5lIFNJUl9JUFY0X0FSUF9SRVBMWV9PRkZMT0FEICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfSVBWNl9ORUlHSEJPUl9ESVNDT1ZFUllfT0ZGTE9BRCAgICAgICAgIDEKKyNkZWZpbmUgU0lSX0lQVjZfTlNfT0ZGTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNJUl9PRkZMT0FEX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfT0ZGTE9BRF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX09GRkxPQURfQkNBU1RfRklMVEVSX0VOQUJMRSAgICAgICAgICAgICAweDIKKyNkZWZpbmUgU0lSX09GRkxPQURfTUNBU1RfRklMVEVSX0VOQUJMRSAgICAgICAgICAgICAweDQKKyNkZWZpbmUgU0lSX09GRkxPQURfQVJQX0FORF9CQ0FTVF9GSUxURVJfRU5BQkxFICAgICAoU0lSX09GRkxPQURfRU5BQkxFfFNJUl9PRkZMT0FEX0JDQVNUX0ZJTFRFUl9FTkFCTEUpCisjZGVmaW5lIFNJUl9PRkZMT0FEX05TX0FORF9NQ0FTVF9GSUxURVJfRU5BQkxFICAgICAgKFNJUl9PRkZMT0FEX0VOQUJMRXxTSVJfT0ZGTE9BRF9NQ0FTVF9GSUxURVJfRU5BQkxFKQorCisjaWZkZWYgV0xBTl9OU19PRkZMT0FECit0eXBlZGVmIHN0cnVjdCBzU2lyTnNPZmZsb2FkUmVxIHsKKwl1aW50OF90IHNyY0lQdjZBZGRyWzE2XTsKKwl1aW50OF90IHNlbGZJUHY2QWRkcltTSVJfTUFDX05VTV9UQVJHRVRfSVBWNl9OU19PRkZMT0FEX05BXVtTSVJfTUFDX0lQVjZfQUREUl9MRU5dOworCXVpbnQ4X3QgdGFyZ2V0SVB2NkFkZHJbU0lSX01BQ19OVU1fVEFSR0VUX0lQVjZfTlNfT0ZGTE9BRF9OQV1bU0lSX01BQ19JUFY2X0FERFJfTEVOXTsKKwl0U2lyTWFjQWRkciBzZWxmTWFjQWRkcjsKKwl1aW50OF90IHNyY0lQdjZBZGRyVmFsaWQ7CisJdWludDhfdCB0YXJnZXRJUHY2QWRkclZhbGlkW1NJUl9NQUNfTlVNX1RBUkdFVF9JUFY2X05TX09GRkxPQURfTkFdOworCXVpbnQ4X3Qgc2xvdElkeDsKK30gdFNpck5zT2ZmbG9hZFJlcSwgKnRwU2lyTnNPZmZsb2FkUmVxOworI2VuZGlmIC8qIFdMQU5fTlNfT0ZGTE9BRCAqLworCit0eXBlZGVmIHN0cnVjdCBzU2lySG9zdE9mZmxvYWRSZXEgeworCXVpbnQ4X3Qgb2ZmbG9hZFR5cGU7CisJdWludDhfdCBlbmFibGVPckRpc2FibGU7CisJdWludDMyX3QgbnVtX25zX29mZmxvYWRfY291bnQ7CisJdW5pb24geworCQl1aW50OF90IGhvc3RJcHY0QWRkcls0XTsKKwkJdWludDhfdCBob3N0SXB2NkFkZHJbMTZdOworCX0gcGFyYW1zOworI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorCXRTaXJOc09mZmxvYWRSZXEgbnNPZmZsb2FkSW5mbzsKKyNlbmRpZiAvKiBXTEFOX05TX09GRkxPQUQgKi8KKwl0U2lyTWFjQWRkciBic3NJZDsKK30gdFNpckhvc3RPZmZsb2FkUmVxLCAqdHBTaXJIb3N0T2ZmbG9hZFJlcTsKKworLyogUGFja2V0IFR5cGVzLiAqLworI2RlZmluZSBTSVJfS0VFUF9BTElWRV9OVUxMX1BLVCAgICAgICAgICAgICAgMQorI2RlZmluZSBTSVJfS0VFUF9BTElWRV9VTlNPTElDSVRfQVJQX1JTUCAgICAgMgorCisvKiBLZWVwIEFsaXZlIHJlcXVlc3QuICovCit0eXBlZGVmIHN0cnVjdCBzU2lyS2VlcEFsaXZlUmVxIHsKKwl1aW50OF90IHBhY2tldFR5cGU7CisJdWludDMyX3QgdGltZVBlcmlvZDsKKwl0U2lySXB2NEFkZHIgaG9zdElwdjRBZGRyOworCXRTaXJJcHY0QWRkciBkZXN0SXB2NEFkZHI7CisJdFNpck1hY0FkZHIgZGVzdE1hY0FkZHI7CisJdFNpck1hY0FkZHIgYnNzSWQ7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRTaXJLZWVwQWxpdmVSZXEsICp0cFNpcktlZXBBbGl2ZVJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZU1nbXRGcmFtZUluZCB7CisJdWludDE2X3QgbWVzZ1R5cGU7CisJdWludDE2X3QgbWVzZ0xlbjsKKwl1aW50MzJfdCByeENoYW47CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDhfdCBmcmFtZVR5cGU7CisJaW50OF90IHJ4UnNzaTsKKwl1aW50OF90IGZyYW1lQnVmWzFdOyAgICAvKiB2YXJpYWJsZSAqLworfSB0U2lyU21lTWdtdEZyYW1lSW5kLCAqdHBTaXJTbWVNZ210RnJhbWVJbmQ7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lVW5wcm90TWdtdEZyYW1lSW5kIHsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IGZyYW1lVHlwZTsKKwl1aW50OF90IGZyYW1lTGVuOworCXVpbnQ4X3QgZnJhbWVCdWZbMV07ICAgIC8qIHZhcmlhYmxlICovCit9IHRTaXJTbWVVbnByb3RNZ210RnJhbWVJbmQsICp0cFNpclNtZVVucHJvdE1nbXRGcmFtZUluZDsKKyNlbmRpZgorCisjZGVmaW5lIFNJUl9JU19GVUxMX1BPV0VSX1JFQVNPTl9ESVNDT05ORUNURUQoZVJlYXNvbikgXAorCSgoZVNNRV9MSU5LX0RJU0NPTk5FQ1RFRF9CWV9IREQgPT0gKGVSZWFzb24pKSB8fCBcCisJIChlU01FX0xJTktfRElTQ09OTkVDVEVEX0JZX09USEVSID09IChlUmVhc29uKSkpCisjZGVmaW5lIFNJUl9JU19GVUxMX1BPV0VSX05FRURFRF9CWV9IREQoZVJlYXNvbikgXAorCSgoZVNNRV9MSU5LX0RJU0NPTk5FQ1RFRF9CWV9IREQgPT0gKGVSZWFzb24pKSB8fCBcCisJIChlU01FX0ZVTExfUFdSX05FRURFRF9CWV9IREQgPT0gKGVSZWFzb24pKSkKKworLyogUDJQIFBvd2VyIFNhdmUgUmVsYXRlZCAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck5vQVBhcmFtIHsKKwl1aW50OF90IGN0V2luZG93Ojc7CisJdWludDhfdCBPcHBQUzoxOworCXVpbnQ4X3QgY291bnQ7CisJdWludDMyX3QgZHVyYXRpb247CisJdWludDMyX3QgaW50ZXJ2YWw7CisJdWludDMyX3Qgc2luZ2xlTm9BRHVyYXRpb247CisJdWludDhfdCBwc1NlbGVjdGlvbjsKK30gdFNpck5vQVBhcmFtLCAqdHBTaXJOb0FQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldsYW5TdXNwZW5kUGFyYW0geworCXVpbnQ4X3QgY29uZmlndXJlZE1jc3RCY3N0RmlsdGVyU2V0dGluZzsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IGNvbm5lY3RlZFN0YXRlOworfSB0U2lyV2xhblN1c3BlbmRQYXJhbSwgKnRwU2lyV2xhblN1c3BlbmRQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldsYW5SZXN1bWVQYXJhbSB7CisJdWludDhfdCBjb25maWd1cmVkTWNzdEJjc3RGaWx0ZXJTZXR0aW5nOworfSB0U2lyV2xhblJlc3VtZVBhcmFtLCAqdHBTaXJXbGFuUmVzdW1lUGFyYW07CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRVhUV09XX1NVUFBPUlQKKwordHlwZWRlZiBlbnVtIGV4dF93b3dfdHlwZSB7CisJRVhUX1dPV19UWVBFX0FQUF9UWVBFMSwgLyogd293IHR5cGU6IG9ubHkgZW5hYmxlIHdha2V1cCBmb3IgYXBwIHR5cGUxICovCisJRVhUX1dPV19UWVBFX0FQUF9UWVBFMiwgLyogd293IHR5cGU6IG9ubHkgZW5hYmxlIHdha2V1cCBmb3IgYXBwIHR5cGUyICovCisJRVhUX1dPV19UWVBFX0FQUF9UWVBFMV8yLCAgLyogd293IHR5cGU6IGVuYWJsZSB3YWtldXAgZm9yIGFwcCB0eXBlMSYyICovCit9IEVYVF9XT1dfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgdmRldl9pZDsKKwlFWFRfV09XX1RZUEUgdHlwZTsKKwl1aW50MzJfdCB3YWtldXBfcGluX251bTsKK30gdFNpckV4dFdvV1BhcmFtcywgKnRwU2lyRXh0V29XUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCB2ZGV2X2lkOworCXRTaXJNYWNBZGRyIHdha2VlX21hY19hZGRyOworCXVpbnQ4X3QgaWRlbnRpZmljYXRpb25faWRbOF07CisJdWludDhfdCBwYXNzd29yZFsxNl07CisJdWludDMyX3QgaWRfbGVuZ3RoOworCXVpbnQzMl90IHBhc3NfbGVuZ3RoOworfSB0U2lyQXBwVHlwZTFQYXJhbXMsICp0cFNpckFwcFR5cGUxUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCB2ZGV2X2lkOworCisJdWludDhfdCByYzRfa2V5WzE2XTsKKwl1aW50MzJfdCByYzRfa2V5X2xlbjsKKworCS8qKiBpcCBoZWFkZXIgcGFyYW1ldGVyICovCisJdWludDMyX3QgaXBfaWQ7ICAgICAgICAgLyogTkMgaWQgKi8KKwl1aW50MzJfdCBpcF9kZXZpY2VfaXA7ICAvKiBOQyBJUCBhZGRyZXNzICovCisJdWludDMyX3QgaXBfc2VydmVyX2lwOyAgLyogUHVzaCBzZXJ2ZXIgSVAgYWRkcmVzcyAqLworCisJLyoqIHRjcCBoZWFkZXIgcGFyYW1ldGVyICovCisJdWludDE2X3QgdGNwX3NyY19wb3J0OyAgLyogTkMgVENQIHBvcnQgKi8KKwl1aW50MTZfdCB0Y3BfZHN0X3BvcnQ7ICAvKiBQdXNoIHNlcnZlciBUQ1AgcG9ydCAqLworCXVpbnQzMl90IHRjcF9zZXE7CisJdWludDMyX3QgdGNwX2Fja19zZXE7CisKKwl1aW50MzJfdCBrZWVwYWxpdmVfaW5pdDsgICAgICAgIC8qIEluaXRpYWwgcGluZyBpbnRlcnZhbCAqLworCXVpbnQzMl90IGtlZXBhbGl2ZV9taW47IC8qIE1pbmltdW0gcGluZyBpbnRlcnZhbCAqLworCXVpbnQzMl90IGtlZXBhbGl2ZV9tYXg7IC8qIE1heGltdW0gcGluZyBpbnRlcnZhbCAqLworCXVpbnQzMl90IGtlZXBhbGl2ZV9pbmM7IC8qIEluY3JlbWVudCBvZiBwaW5nIGludGVydmFsICovCisKKwl0U2lyTWFjQWRkciBnYXRld2F5X21hYzsKKwl1aW50MzJfdCB0Y3BfdHhfdGltZW91dF92YWw7CisJdWludDMyX3QgdGNwX3J4X3RpbWVvdXRfdmFsOworfSB0U2lyQXBwVHlwZTJQYXJhbXMsICp0cFNpckFwcFR5cGUyUGFyYW1zOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHNTaXJXbGFuU2V0UnhwRmlsdGVycyB7CisJdWludDhfdCBjb25maWd1cmVkTWNzdEJjc3RGaWx0ZXJTZXR0aW5nOworCXVpbnQ4X3Qgc2V0TWNzdEJjc3RGaWx0ZXI7Cit9IHRTaXJXbGFuU2V0UnhwRmlsdGVycywgKnRwU2lyV2xhblNldFJ4cEZpbHRlcnM7CisKKworI2RlZmluZSBBTklfTUFYX0lCU1NfUk9VVEVfVEFCTEVfRU5UUlkgICAxMDAKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURlc3RJcE5leHRIb3BNYWNQYWlyIHsKKwl1aW50OF90IGRlc3RJcHY0QWRkcltDREZfSVBWNF9BRERSX1NJWkVdOworCXVpbnQ4X3QgbmV4dEhvcE1hY0FkZHJbQ0RGX01BQ19BRERSX1NJWkVdOworfSB0QW5pRGVzdElwTmV4dEhvcE1hY1BhaXI7CisKK3R5cGVkZWYgc3RydWN0IHNBbmlJYnNzUm91dGVUYWJsZSB7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDE2X3QgbnVtRW50cmllczsKKwl0QW5pRGVzdElwTmV4dEhvcE1hY1BhaXIgZGVzdElwTmV4dEhvcFBhaXJbMV07Cit9IHRBbmlJYnNzUm91dGVUYWJsZTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworLyogKi8KKy8qIFBOTyBNZXNzYWdlcyAqLworLyogKi8KKworCisvKiBTZXQgUE5PICovCisjZGVmaW5lIFNJUl9QTk9fTUFYX05FVFdfQ0hBTk5FTFMgIDI2CisjZGVmaW5lIFNJUl9QTk9fTUFYX05FVFdfQ0hBTk5FTFNfRVggIDYwCisjZGVmaW5lIFNJUl9QTk9fTUFYX1NVUFBfTkVUV09SS1MgIDE2CisjZGVmaW5lIFNJUl9QTk9fTUFYX1NDQU5fVElNRVJTICAgIDEwCisKKy8qCisgKiBzaXplIGJhc2VkIG9mIGRvdDExIGRlY2xhcmF0aW9uIHdpdGhvdXQgZXh0cmEgSUVzIGFzIHdlIHdpbGwgbm90IGNhcnJ5IHRob3NlCisgKiBmb3IgUE5PCisgKi8KKyNkZWZpbmUgU0lSX1BOT19NQVhfUEJfUkVRX1NJWkUgICAgNDUwCisKKyNkZWZpbmUgU0lSX1BOT18yNEdfREVGQVVMVF9DSCAgICAgMQorI2RlZmluZSBTSVJfUE5PXzVHX0RFRkFVTFRfQ0ggICAgICAzNgorCit0eXBlZGVmIGVudW0geworCVNJUl9QTk9fTU9ERV9JTU1FRElBVEUsCisJU0lSX1BOT19NT0RFX09OX1NVU1BFTkQsCisJU0lSX1BOT19NT0RFX09OX1JFU1VNRSwKKwlTSVJfUE5PX01PREVfTUFYCit9IGVTaXJQTk9Nb2RlOworCit0eXBlZGVmIHN0cnVjdCB7CisJdFNpck1hY1NTaWQgc3NJZDsKKwl1aW50MzJfdCBhdXRoZW50aWNhdGlvbjsKKwl1aW50MzJfdCBlbmNyeXB0aW9uOworCXVpbnQzMl90IGJjYXN0TmV0d1R5cGU7CisJdWludDhfdCB1Y0NoYW5uZWxDb3VudDsKKwl1aW50OF90IGFDaGFubmVsc1tTSVJfUE5PX01BWF9ORVRXX0NIQU5ORUxTX0VYXTsKKwlpbnQzMl90IHJzc2lUaHJlc2hvbGQ7Cit9IHRTaXJOZXR3b3JrVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IHVUaW1lclZhbHVlOworCXVpbnQzMl90IHVUaW1lclJlcGVhdDsKK30gdFNpclNjYW5UaW1lcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgdWNTY2FuVGltZXJzQ291bnQ7CisJdFNpclNjYW5UaW1lciBhVGltZXJWYWx1ZXNbU0lSX1BOT19NQVhfU0NBTl9USU1FUlNdOworfSB0U2lyU2NhblRpbWVyc1R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJQTk9TY2FuUmVxIHsKKwl1aW50OF90IGVuYWJsZTsKKwllU2lyUE5PTW9kZSBtb2RlUE5POworCXVpbnQ4X3QgdWNOZXR3b3Jrc0NvdW50OworCXRTaXJOZXR3b3JrVHlwZSBhTmV0d29ya3NbU0lSX1BOT19NQVhfU1VQUF9ORVRXT1JLU107CisJdFNpclNjYW5UaW1lcnNUeXBlIHNjYW5UaW1lcnM7CisJdWludDhfdCBzZXNzaW9uSWQ7CisKKwl1aW50MTZfdCB1czI0R1Byb2JlVGVtcGxhdGVMZW47CisJdWludDhfdCBwMjRHUHJvYmVUZW1wbGF0ZVtTSVJfUE5PX01BWF9QQl9SRVFfU0laRV07CisJdWludDE2X3QgdXM1R1Byb2JlVGVtcGxhdGVMZW47CisJdWludDhfdCBwNUdQcm9iZVRlbXBsYXRlW1NJUl9QTk9fTUFYX1BCX1JFUV9TSVpFXTsKK30gdFNpclBOT1NjYW5SZXEsICp0cFNpclBOT1NjYW5SZXE7CisKKy8qIFByZWZlcnJlZCBOZXR3b3JrIEZvdW5kIEluZGljYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBtZXNnVHlwZTsKKwl1aW50MTZfdCBtZXNnTGVuOworCS8qIE5ldHdvcmsgdGhhdCB3YXMgZm91bmQgd2l0aCB0aGUgaGlnaGVzdCBSU1NJICovCisJdFNpck1hY1NTaWQgc3NJZDsKKwkvKiBJbmRpY2F0ZXMgdGhlIFJTU0kgKi8KKwl1aW50OF90IHJzc2k7CisJLyogTGVuZ3RoIG9mIHRoZSBiZWFjb24gb3IgcHJvYmUgcmVzcG9uc2UKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjYW5kaWRhdGUgZm91bmQgYnkgUE5PICovCisJdWludDMyX3QgZnJhbWVMZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJLyogSW5kZXggdG8gbWVtb3J5IGxvY2F0aW9uIHdoZXJlIHRoZSBjb250ZW50cyBvZgorCSAqIGJlYWNvbiBvciBwcm9iZSByZXNwb25zZSBmcmFtZSB3aWxsIGJlIGNvcGllZCAqLworCXVpbnQ4X3QgZGF0YVsxXTsKK30gdFNpclByZWZOZXR3b3JrRm91bmRJbmQsICp0cFNpclByZWZOZXR3b3JrRm91bmRJbmQ7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1NDQU5fUE5PICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBhY3ZvX3VhcHNkOjE7CisJdWludDhfdCBhY3ZpX3VhcHNkOjE7CisJdWludDhfdCBhY2JrX3VhcHNkOjE7CisJdWludDhfdCBhY2JlX3VhcHNkOjE7CisJdWludDhfdCByZXNlcnZlZDo0OworfSB0U2lyQWNVYXBzZCwgKnRwU2lyQWNVYXBzZDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdFNpck1hY1NTaWQgc3NJZDsKKwl1aW50OF90IGN1cnJBUGJzc2lkW0NERl9NQUNfQUREUl9TSVpFXTsKKwl1aW50MzJfdCBhdXRoZW50aWNhdGlvbjsKKwl1aW50OF90IGVuY3J5cHRpb247CisJdWludDhfdCBtY2VuY3J5cHRpb247CisJdWludDhfdCBDaGFubmVsQ291bnQ7CisJdWludDhfdCBDaGFubmVsQ2FjaGVbU0lSX1JPQU1fTUFYX0NIQU5ORUxTXTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJYm9vbCBtZnBfZW5hYmxlZDsKKyNlbmRpZgorCit9IHRTaXJSb2FtTmV0d29ya1R5cGU7CisKK3R5cGVkZWYgc3RydWN0IFNpck1vYmlsaXR5RG9tYWluSW5mbyB7CisJdWludDhfdCBtZGllUHJlc2VudDsKKwl1aW50MTZfdCBtb2JpbGl0eURvbWFpbjsKK30gdFNpck1vYmlsaXR5RG9tYWluSW5mbzsKKwordHlwZWRlZiBlbnVtIHsKKwlTSVJfUk9BTUlOR19ERlNfQ0hBTk5FTF9ESVNBQkxFRCA9IDAsCisJU0lSX1JPQU1JTkdfREZTX0NIQU5ORUxfRU5BQkxFRF9OT1JNQUwgPSAxLAorCVNJUl9ST0FNSU5HX0RGU19DSEFOTkVMX0VOQUJMRURfQUNUSVZFID0gMgorfSBlU2lyREZTUm9hbVNjYW5Nb2RlOworI2RlZmluZSBNQVhfU1NJRF9BTExPV0VEX0xJU1QgNAorI2RlZmluZSBNQVhfQlNTSURfQVZPSURfTElTVCAgMTYKKyNkZWZpbmUgTUFYX0JTU0lEX0ZBVk9SRUQgICAgIDE2CisvKioKKyAqIHN0cnVjdCByb2FtX2V4dF9wYXJhbXMgLSBTdHJ1Y3R1cmUgaG9sZGluZyByb2FtaW5nIHBhcmFtZXRlcnMKKyAqIEBudW1fYnNzaWRfYXZvaWRfbGlzdDogICAgICAgVGhlIG51bWJlciBvZiBCU1NJRCdzIHRoYXQgd2Ugc2hvdWxkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2b2lkIGNvbm5lY3RpbmcgdG8uIEl0IGlzIGxpa2UgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFja2xpc3Qgb2YgQlNTSUQncy4KKyAqIEBudW1fc3NpZF9hbGxvd2VkX2xpc3Q6ICAgICAgVGhlIG51bWJlciBvZiBTU0lEIHByb2ZpbGVzIHRoYXQgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBXaGl0ZWxpc3QuIFdoZW4gcm9hbWluZywgd2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2lkZXIgdGhlIEJTU0lEJ3Mgd2l0aCB0aGlzIFNTSUQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyBmb3Igcm9hbWluZyBhcGFydCBmcm9tIHRoZSBjb25uZWN0ZWQgb25lJ3MKKyAqIEBudW1fYnNzaWRfZmF2b3JlZDogICAgICAgICAgTnVtYmVyIG9mIEJTU0lEJ3Mgd2hpY2ggaGF2ZSBhIHByZWZlcmVuY2Ugb3ZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcnMKKyAqIEBzc2lkX2FsbG93ZWRfbGlzdDogICAgICAgICAgV2hpdGVsaXN0IFNTSUQncworICogQGJzc2lkX2F2b2lkX2xpc3Q6ICAgICAgICAgICBCbGFja2xpc3QgU1NJRCdzCisgKiBAYnNzaWRfZmF2b3JlZDogICAgICAgICAgICAgIEZhdm9yYWJsZSBCU1NJRCdzCisgKiBAYnNzaWRfZmF2b3JlZF9mYWN0b3I6ICAgICAgIFJTU0kgdG8gYmUgYWRkZWQgdG8gdGhpcyBCU1NJRCB0byBwcmVmZXIgaXQKKyAqIEByYWlzZV9yc3NpX3RocmVzaF81ZzogICAgICAgVGhlIFJTU0kgdGhyZXNob2xkIGJlbG93IHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZV9mYWN0b3JfNWcgKGJvb3N0IGZhY3Rvcikgc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuCisgKiBAZHJvcF9yc3NpX3RocmVzaF81ZzogICAgICAgIFRoZSBSU1NJIHRocmVzaG9sZCBiZXlvbmQgd2hpY2ggdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfZmFjdG9yXzVnIChwZW5hbHR5IGZhY3Rvcikgc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQKKyAqIEByYWlzZV9yc3NpX3R5cGVfNWc6ICAgICAgICAgQWxnb3JpdGhtIHRvIGFwcGx5IHRoZSBib29zdCBmYWN0b3IKKyAqIEByYWlzZV9mYWN0b3JfNWc6ICAgICAgICAgICAgQm9vc3QgZmFjdG9yCisgKiBAZHJvcF9yc3NpX3R5cGVfNWc6ICAgICAgICAgIEFsZ29yaXRobSB0byBhcHBseSB0aGUgcGVuYWx0eSBmYWN0b3IKKyAqIEBkcm9wX2ZhY3Rvcl81ZzogICAgICAgICAgICAgUGVuYWx0eSBmYWN0b3IKKyAqIEBtYXhfcmFpc2VfcnNzaV81ZzogICAgICAgICAgTWF4aW11bSBhbW91bnQgb2YgQm9vc3QgdGhhdCBjYW4gYWRkZWQKKyAqIEBtYXhfZHJvcF9yc3NpXzVnOiAgICAgICAgICAgTWF4aW11bSBhbW91bnQgb2YgcGVuYWx0eSB0aGF0IGNhbiBiZSBzdWJ0cmFjdGVkCisgKiBAZ29vZF9yc3NpX3RocmVzaG9sZDogICAgICAgIFRoZSBMb29rdXAgVVAgdGhyZXNob2xkIGJleW9uZCB3aGljaCByb2FtaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4gc2hvdWxkIGJlIHBlcmZvcm1lZC4KKyAqIEByc3NpX2RpZmY6ICAgICAgICAgICAgICAgICAgUlNTSSBkaWZmZXJlbmNlIGZvciB0aGUgQVAgdG8gYmUgYmV0dGVyIG92ZXIgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgQVAgdG8gYXZvaWQgcGluZyBwb25nIGVmZmVjdHMKKyAqIEBnb29kX3Jzc2lfcm9hbTogICAgICAgICAgICAgTGF6eSBSb2FtCisgKiBAaXNfNWdfcHJlZl9lbmFibGVkOiAgICAgICAgIDVHSHogQlNTSUQgcHJlZmVyZW5jZSBmZWF0dXJlIGVuYWJsZS9kaXNhYmxlLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFsbCB0aGUga2V5IHBhcmFtZXRlcnMgcmVsYXRlZCB0bworICogaW5pdGlhbCBjb25uZWN0aW9uIGFuZCBhbHNvIHJvYW1pbmcgY29ubmVjdGlvbnMuCisgKiAqLworc3RydWN0IHJvYW1fZXh0X3BhcmFtcyB7CisJdWludDhfdCBudW1fYnNzaWRfYXZvaWRfbGlzdDsKKwl1aW50OF90IG51bV9zc2lkX2FsbG93ZWRfbGlzdDsKKwl1aW50OF90IG51bV9ic3NpZF9mYXZvcmVkOworCXRTaXJNYWNTU2lkIHNzaWRfYWxsb3dlZF9saXN0W01BWF9TU0lEX0FMTE9XRURfTElTVF07CisJdFNpck1hY0FkZHIgYnNzaWRfYXZvaWRfbGlzdFtNQVhfQlNTSURfQVZPSURfTElTVF07CisJdFNpck1hY0FkZHIgYnNzaWRfZmF2b3JlZFtNQVhfQlNTSURfRkFWT1JFRF07CisJdWludDhfdCBic3NpZF9mYXZvcmVkX2ZhY3RvcltNQVhfQlNTSURfRkFWT1JFRF07CisJaW50IHJhaXNlX3Jzc2lfdGhyZXNoXzVnOworCWludCBkcm9wX3Jzc2lfdGhyZXNoXzVnOworCXVpbnQ4X3QgcmFpc2VfcnNzaV90eXBlXzVnOworCXVpbnQ4X3QgcmFpc2VfZmFjdG9yXzVnOworCXVpbnQ4X3QgZHJvcF9yc3NpX3R5cGVfNWc7CisJdWludDhfdCBkcm9wX2ZhY3Rvcl81ZzsKKwlpbnQgbWF4X3JhaXNlX3Jzc2lfNWc7CisJaW50IG1heF9kcm9wX3Jzc2lfNWc7CisJaW50IGFsZXJ0X3Jzc2lfdGhyZXNob2xkOworCWludCByc3NpX2RpZmY7CisJaW50IGdvb2RfcnNzaV9yb2FtOworCWJvb2wgaXNfNWdfcHJlZl9lbmFibGVkOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclJvYW1PZmZsb2FkU2NhblJlcSB7CisJYm9vbCBSb2FtU2Nhbk9mZmxvYWRFbmFibGVkOworCWJvb2wgTUFXQ0VuYWJsZWQ7CisJaW50OF90IExvb2t1cFRocmVzaG9sZDsKKwl1aW50OF90IGRlbGF5X2JlZm9yZV92ZGV2X3N0b3A7CisJdWludDhfdCBPcHBvcnR1bmlzdGljU2NhblRocmVzaG9sZERpZmY7CisJdWludDhfdCBSb2FtUmVzY2FuUnNzaURpZmY7CisJdWludDhfdCBSb2FtUnNzaURpZmY7CisJdWludDhfdCBDaGFubmVsQ2FjaGVUeXBlOworCXVpbnQ4X3QgQ29tbWFuZDsKKwl1aW50OF90IHJlYXNvbjsKKwl1aW50MTZfdCBOZWlnaGJvclNjYW5UaW1lclBlcmlvZDsKKwl1aW50MTZfdCBOZWlnaGJvclJvYW1TY2FuUmVmcmVzaFBlcmlvZDsKKwl1aW50MTZfdCBOZWlnaGJvclNjYW5DaGFubmVsTWluVGltZTsKKwl1aW50MTZfdCBOZWlnaGJvclNjYW5DaGFubmVsTWF4VGltZTsKKwl1aW50MTZfdCBFbXB0eVJlZnJlc2hTY2FuUGVyaW9kOworCXVpbnQ4X3QgVmFsaWRDaGFubmVsQ291bnQ7CisJdWludDhfdCBWYWxpZENoYW5uZWxMaXN0W1NJUl9ST0FNX01BWF9DSEFOTkVMU107CisJYm9vbCBJc0VTRUFzc29jOworCXVpbnQxNl90IHVzMjRHUHJvYmVUZW1wbGF0ZUxlbjsKKwl1aW50OF90IHAyNEdQcm9iZVRlbXBsYXRlW1NJUl9ST0FNX1NDQU5fTUFYX1BCX1JFUV9TSVpFXTsKKwl1aW50MTZfdCB1czVHUHJvYmVUZW1wbGF0ZUxlbjsKKwl1aW50OF90IHA1R1Byb2JlVGVtcGxhdGVbU0lSX1JPQU1fU0NBTl9NQVhfUEJfUkVRX1NJWkVdOworCXVpbnQ4X3QgUmVzZXJ2ZWRCeXRlc1tTSVJfUk9BTV9TQ0FOX1JFU0VSVkVEX0JZVEVTXTsKKwkvKlJlc2VydmVkQnl0ZXMgaXMgdG8gYWRkIGFueSBmdXJ0aGVyIHBhcmFtcyBpbiBmdXR1cmUKKwkgICB3aXRob3V0IGNoYW5naW5nIHRoZSBpbnRlcmZhY2UgcGFyYW1zIG9uIEhvc3QKKwkgICBhbmQgZmlybXdhcmUuVGhlIGZpcm13YXJlIHJpZ2h0IG5vdyBjaGVja3MKKwkgICBpZiB0aGUgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSBtYXRjaGVzIGFuZCB0aGVuCisJICAgcHJvY2VlZHMgd2l0aCB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgY29tbWFuZC4KKwkgICBTbywgaW4gZnV0dXJlLCBpZiB0aGVyZSBpcyBhbnkgbmVlZCB0byBhZGQKKwkgICBtb3JlIHBhcmFtcywgcGljayB0aGUgbWVtb3J5IGZyb20gcmVzZXJ2ZWQKKwkgICBieXRlcyBhbmQga2VlcCBkZWR1Y3RpbmcgdGhlIHJlc2VydmVkIGJ5dGVzCisJICAgYnkgdGhlIGFtb3VudCBvZiBieXRlcyBwaWNrZWQuICovCisJdWludDhfdCBuUHJvYmVzOworCXVpbnQxNl90IEhvbWVBd2F5VGltZTsKKwl0U2lyUm9hbU5ldHdvcmtUeXBlIENvbm5lY3RlZE5ldHdvcms7CisJdFNpck1vYmlsaXR5RG9tYWluSW5mbyBNRElEOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXVpbnQ4X3QgUm9hbUJtaXNzRmlyc3RCY250OworCXVpbnQ4X3QgUm9hbUJtaXNzRmluYWxCY250OworCXVpbnQ4X3QgUm9hbUJlYWNvblJzc2lXZWlnaHQ7CisJZVNpckRGU1JvYW1TY2FuTW9kZSBhbGxvd0RGU0NoYW5uZWxSb2FtOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwl1aW50OF90IFJvYW1PZmZsb2FkRW5hYmxlZDsKKwl1aW50OF90IFBTS19QTUtbU0lSX1JPQU1fU0NBTl9QU0tfU0laRV07CisJdWludDMyX3QgcG1rX2xlbjsKKwl1aW50OF90IFByZWZlcjVHSHo7CisJdWludDhfdCBSb2FtUnNzaUNhdEdhcDsKKwl1aW50OF90IFNlbGVjdDVHSHpNYXJnaW47CisJdWludDhfdCBLUktbU0lSX0tSS19LRVlfTEVOXTsKKwl1aW50OF90IEJUS1tTSVJfQlRLX0tFWV9MRU5dOworCXVpbnQzMl90IFJlYXNzb2NGYWlsdXJlVGltZW91dDsKKwl0U2lyQWNVYXBzZCBBY1VhcHNkOworCXVpbnQ4X3QgUjBLSF9JRFtTSVJfUk9BTV9SMEtIX0lEX01BWF9MRU5dOworCXVpbnQzMl90IFIwS0hfSURfTGVuZ3RoOworCXVpbnQ4X3QgUm9hbUtleU1nbXRPZmZsb2FkRW5hYmxlZDsKKyNlbmRpZgorCXN0cnVjdCByb2FtX2V4dF9wYXJhbXMgcm9hbV9wYXJhbXM7CisJdWludDhfdCAgbWlkZGxlX29mX3JvYW1pbmc7CisJdWludDMyX3QgaGlfcnNzaV9zY2FuX21heF9jb3VudDsKKwl1aW50MzJfdCBoaV9yc3NpX3NjYW5fcnNzaV9kZWx0YTsKKwl1aW50MzJfdCBoaV9yc3NpX3NjYW5fZGVsYXk7CisJaW50MzJfdCBoaV9yc3NpX3NjYW5fcnNzaV91YjsKK30gdFNpclJvYW1PZmZsb2FkU2NhblJlcSwgKnRwU2lyUm9hbU9mZmxvYWRTY2FuUmVxOworCit0eXBlZGVmIHN0cnVjdCBzU2lyUm9hbU9mZmxvYWRTY2FuUnNwIHsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50MzJfdCByZWFzb247Cit9IHRTaXJSb2FtT2ZmbG9hZFNjYW5Sc3AsICp0cFNpclJvYW1PZmZsb2FkU2NhblJzcDsKKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBQYWNrZXQgRmlsdGVyaW5nIFBhcmFtZXRlcnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lICAgIFNJUl9JUFY0X0FERFJfTEVOICAgICAgICAgICAgICAgICA0CisjZGVmaW5lICAgIFNJUl9NQUNfQUREUl9MRU4gICAgICAgICAgICAgICAgICA2CisjZGVmaW5lICAgIFNJUl9NQVhfRklMVEVSX1RFU1RfREFUQV9MRU4gICAgICAgOAorI2RlZmluZSAgICBTSVJfTUFYX05VTV9NVUxUSUNBU1RfQUREUkVTUyAgICAyNDAKKyNkZWZpbmUgICAgU0lSX01BWF9OVU1fRklMVEVSUyAgICAgICAgICAgICAgIDIwCisjZGVmaW5lICAgIFNJUl9NQVhfTlVNX1RFU1RTX1BFUl9GSUxURVIgICAgICAxMAorCisvKiAqLworLyogUmVjZWl2ZSBGaWx0ZXIgUGFyYW1ldGVycyAqLworLyogKi8KK3R5cGVkZWYgZW51bSB7CisJU0lSX1JDVl9GSUxURVJfVFlQRV9JTlZBTElELAorCVNJUl9SQ1ZfRklMVEVSX1RZUEVfRklMVEVSX1BLVCwKKwlTSVJfUkNWX0ZJTFRFUl9UWVBFX0JVRkZFUl9QS1QsCisJU0lSX1JDVl9GSUxURVJfVFlQRV9NQVhfRU5VTV9TSVpFCit9IGVTaXJSZWNlaXZlUGFja2V0RmlsdGVyVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlTSVJfRklMVEVSX0hEUl9UWVBFX0lOVkFMSUQsCisJU0lSX0ZJTFRFUl9IRFJfVFlQRV9NQUMsCisJU0lSX0ZJTFRFUl9IRFJfVFlQRV9BUlAsCisJU0lSX0ZJTFRFUl9IRFJfVFlQRV9JUFY0LAorCVNJUl9GSUxURVJfSERSX1RZUEVfSVBWNiwKKwlTSVJfRklMVEVSX0hEUl9UWVBFX1VEUCwKKwlTSVJfRklMVEVSX0hEUl9UWVBFX01BWAorfSBlU2lyUmN2UGt0Rmx0UHJvdG9jb2xUeXBlOworCit0eXBlZGVmIGVudW0geworCVNJUl9GSUxURVJfQ01QX1RZUEVfSU5WQUxJRCwKKwlTSVJfRklMVEVSX0NNUF9UWVBFX0VRVUFMLAorCVNJUl9GSUxURVJfQ01QX1RZUEVfTUFTS19FUVVBTCwKKwlTSVJfRklMVEVSX0NNUF9UWVBFX05PVF9FUVVBTCwKKwlTSVJfRklMVEVSX0NNUF9UWVBFX01BU0tfTk9UX0VRVUFMLAorCVNJUl9GSUxURVJfQ01QX1RZUEVfTUFYCit9IGVTaXJSY3ZQa3RGbHRDbXBGbGFnVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclJjdlBrdEZpbHRlckZpZWxkUGFyYW1zIHsKKwllU2lyUmN2UGt0Rmx0UHJvdG9jb2xUeXBlIHByb3RvY29sTGF5ZXI7CisJZVNpclJjdlBrdEZsdENtcEZsYWdUeXBlIGNtcEZsYWc7CisJLyogTGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGNvbXBhcmUgKi8KKwl1aW50MTZfdCBkYXRhTGVuZ3RoOworCS8qIGZyb20gc3RhcnQgb2YgdGhlIHJlc3BlY3RpdmUgZnJhbWUgaGVhZGVyICovCisJdWludDhfdCBkYXRhT2Zmc2V0OworCS8qIFJlc2VydmVkIGZpZWxkICovCisJdWludDhfdCByZXNlcnZlZDsKKwkvKiBEYXRhIHRvIGNvbXBhcmUgKi8KKwl1aW50OF90IGNvbXBhcmVEYXRhW1NJUl9NQVhfRklMVEVSX1RFU1RfREFUQV9MRU5dOworCS8qIE1hc2sgdG8gYmUgYXBwbGllZCBvbiB0aGUgcmVjZWl2ZWQgcGFja2V0IGRhdGEgYmVmb3JlIGNvbXBhcmUgKi8KKwl1aW50OF90IGRhdGFNYXNrW1NJUl9NQVhfRklMVEVSX1RFU1RfREFUQV9MRU5dOworfSB0U2lyUmN2UGt0RmlsdGVyRmllbGRQYXJhbXMsICp0cFNpclJjdlBrdEZpbHRlckZpZWxkUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCBzU2lyUmN2UGt0RmlsdGVyQ2ZnIHsKKwl1aW50OF90IGZpbHRlcklkOworCWVTaXJSZWNlaXZlUGFja2V0RmlsdGVyVHlwZSBmaWx0ZXJUeXBlOworCXVpbnQzMl90IG51bUZpZWxkUGFyYW1zOworCXVpbnQzMl90IGNvYWxlc2NlVGltZTsKKwl0U2lyTWFjQWRkciBzZWxmTWFjQWRkcjsKKwl0U2lyTWFjQWRkciBic3NJZDsgICAgICAvKiBCc3NpZCBvZiB0aGUgY29ubmVjdGVkIEFQICovCisJdFNpclJjdlBrdEZpbHRlckZpZWxkUGFyYW1zIHBhcmFtc0RhdGFbU0lSX01BWF9OVU1fVEVTVFNfUEVSX0ZJTFRFUl07Cit9IHRTaXJSY3ZQa3RGaWx0ZXJDZmdUeXBlLCAqdHBTaXJSY3ZQa3RGaWx0ZXJDZmdUeXBlOworCisvKiAqLworLyogRmlsdGVyIFBhY2tldCBNYXRjaCBDb3VudCBQYXJhbWV0ZXJzICovCisvKiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclJjdkZsdFBrdE1hdGNoQ250IHsKKwl1aW50OF90IGZpbHRlcklkOworCXVpbnQzMl90IG1hdGNoQ250OworfSB0U2lyUmN2Rmx0UGt0TWF0Y2hDbnQsIHRwU2lyUmN2Rmx0UGt0TWF0Y2hDbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJSY3ZGbHRQa3RNYXRjaFJzcCB7CisJdWludDE2X3QgbWVzZ1R5cGU7CisJdWludDE2X3QgbWVzZ0xlbjsKKworCS8qIFN1Y2Nlc3Mgb3IgRmFpbHVyZSAqLworCXVpbnQzMl90IHN0YXR1czsKKwl0U2lyUmN2Rmx0UGt0TWF0Y2hDbnQgZmlsdGVyTWF0Y2hDbnRbU0lSX01BWF9OVU1fRklMVEVSU107CisJdFNpck1hY0FkZHIgYnNzSWQ7Cit9IHRTaXJSY3ZGbHRQa3RNYXRjaFJzcCwgKnRwU2lyUmN2Rmx0UGt0TWF0Y2hSc3A7CisKKy8qICovCisvKiBSZWNlaXZlIEZpbHRlciBDbGVhciBQYXJhbWV0ZXJzICovCisvKiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclJjdkZsdFBrdENsZWFyUGFyYW0geworCXVpbnQzMl90IHN0YXR1czsgICAgICAgIC8qIG9ubHkgdmFsaWQgZm9yIHJlc3BvbnNlIG1lc3NhZ2UgKi8KKwl1aW50OF90IGZpbHRlcklkOworCXRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyOworCXRTaXJNYWNBZGRyIGJzc0lkOworfSB0U2lyUmN2Rmx0UGt0Q2xlYXJQYXJhbSwgKnRwU2lyUmN2Rmx0UGt0Q2xlYXJQYXJhbTsKKworLyogKi8KKy8qIE11bHRpY2FzdCBBZGRyZXNzIExpc3QgUGFyYW1ldGVycyAqLworLyogKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJSY3ZGbHRNY0FkZHJMaXN0IHsKKwl1aW50MzJfdCB1bE11bHRpY2FzdEFkZHJDbnQ7CisJdFNpck1hY0FkZHIgbXVsdGljYXN0QWRkcltTSVJfTUFYX05VTV9NVUxUSUNBU1RfQUREUkVTU107CisJdFNpck1hY0FkZHIgc2VsZk1hY0FkZHI7CisJdFNpck1hY0FkZHIgYnNzSWQ7CisJdWludDhfdCBhY3Rpb247Cit9IHRTaXJSY3ZGbHRNY0FkZHJMaXN0LCAqdHBTaXJSY3ZGbHRNY0FkZHJMaXN0OworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HICovCisKKy8qICovCisvKiBHZW5lcmljIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKy8qICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCByZXZpc2lvbjsKKwl1aW50OF90IHZlcnNpb247CisJdWludDhfdCBtaW5vcjsKKwl1aW50OF90IG1ham9yOworfSB0U2lyVmVyc2lvblR5cGU7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIFdNQV9HVEtfT0ZGTE9BRF9SRVEKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgdWxGbGFnczsgICAgICAgLyogb3B0aW9uYWwgZmxhZ3MgKi8KKwl1aW50OF90IGFLQ0tbMTZdOyAgICAgICAvKiBLZXkgY29uZmlybWF0aW9uIGtleSAqLworCXVpbnQ4X3QgYUtFS1sxNl07ICAgICAgIC8qIGtleSBlbmNyeXB0aW9uIGtleSAqLworCXVpbnQ2NF90IHVsbEtleVJlcGxheUNvdW50ZXI7ICAgLyogcmVwbGF5IGNvdW50ZXIgKi8KKwl0U2lyTWFjQWRkciBic3NJZDsKK30gdFNpckd0a09mZmxvYWRQYXJhbXMsICp0cFNpckd0a09mZmxvYWRQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHNpcl93aWZpX3N0YXJ0X2xvZyAtIFN0cnVjdHVyZSB0byBzdG9yZSB0aGUgcGFyYW1zIHNlbnQgdG8gc3RhcnQvCisgKiBzdG9wIGxvZ2dpbmcKKyAqIEBuYW1lOiAgICAgICAgICBBdHRyaWJ1dGUgd2hpY2ggaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGxvZ2dpbmcgbGlrZSBwZXIgcGFja2V0CisgKiAgICAgICAgICAgICAgICAgc3RhdGlzdGljcywgY29ubmVjdGl2aXR5IGV0Yy4KKyAqIEB2ZXJib3NlX2xldmVsOiBWZXJib3NlIGxldmVsIHdoaWNoIGNhbiBiZSAwLDEsMiwzCisgKiBAZmxhZzogICAgICAgICAgRmxhZyBmaWVsZCBmb3IgZnV0dXJlIHVzZQorICovCitzdHJ1Y3Qgc2lyX3dpZmlfc3RhcnRfbG9nIHsKKwl1aW50MzJfdCByaW5nX2lkOworCXVpbnQzMl90IHZlcmJvc2VfbGV2ZWw7CisJdWludDMyX3QgZmxhZzsKK307CisKKy8qKgorICogZW51bSBod19tb2RlX3NzX2NvbmZpZyAtIFBvc3NpYmxlIHNwYXRpYWwgc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyAqIEBTU18weDA6IFVudXNlZCBUeCBhbmQgUnggb2YgTUFDCisgKiBAU1NfMXgxOiAxIFR4IFNTIGFuZCAxIFJ4IFNTCisgKiBAU1NfMngyOiAyIFR4IFNTIGFuZCAyIFJ4IFNTCisgKiBAU1NfM3gzOiAzIFR4IFNTIGFuZCAzIFJ4IFNTCisgKiBAU1NfNHg0OiA0IFR4IFNTIGFuZCA0IFJ4IFNTCisgKgorICogTm90ZTogUmlnaHQgbm93IG9ubHkgMXgxIGFuZCAyeDIgYXJlIGJlaW5nIHN1cHBvcnRlZC4gT3RoZXIgbW9kZXMgc2hvdWxkCisgKiBiZSBhZGRlZCB3aGVuIHN1cHBvcnRlZC4gQXN5bW1ldHJpYyBjb25maWd1cmF0aW9uIGxpa2UgMXgyLCAyeDEgYXJlIGFsc28KKyAqIG5vdCBzdXBwb3J0ZWQgbm93LiBCdXQsIHRoZXkgYXJlIHN0aWxsIHZhbGlkLiBSaWdodCBub3csIFR4L1J4IFNTIHN1cHBvcnQgaXMKKyAqIDQgYml0cyBsb25nLiBTbywgd2UgY2FuIGdvIHVwdG8gMTV4MTUKKyAqLworZW51bSBod19tb2RlX3NzX2NvbmZpZyB7CisJSFdfTU9ERV9TU18weDAsCisJSFdfTU9ERV9TU18xeDEsCisJSFdfTU9ERV9TU18yeDIsCisJSFdfTU9ERV9TU18zeDMsCisJSFdfTU9ERV9TU180eDQsCit9OworCisvKioKKyAqIGVudW0gaHdfbW9kZV9iYW5kd2lkdGggLSBiYW5kd2lkdGggb2Ygd2lmaSBjaGFubmVsLgorICoKKyAqIEBIV19NT0RFXzVfTUhaOiA1IE1oeiBiYW5kd2lkdGgKKyAqIEBIV19NT0RFXzEwX01IWjogMTAgTWh6IGJhbmR3aWR0aAorICogQEhXX01PREVfMjBfTUhaOiAyMCBNaHogYmFuZHdpZHRoCisgKiBASFdfTU9ERV80MF9NSFo6IDQwIE1oeiBiYW5kd2lkdGgKKyAqIEBIV19NT0RFXzgwX01IWjogODAgTWh6IGJhbmR3aWR0aAorICogQEhXX01PREVfODBfUExVU184MF9NSFo6IDgwIE1oeiBwbHVzIDgwIE1oeiBiYW5kd2lkdGgKKyAqIEBIV19NT0RFXzE2MF9NSFo6IDE2MCBNaHogYmFuZHdpZHRoCisgKiBASFdfTU9ERV9NQVhfQkFORFdJRFRIOiBNYXggcGxhY2UgaG9sZGVyCisgKgorICogVGhlc2UgYXJlIGdlbmVyaWMgSURzIHRoYXQgaWRlbnRpZnkgdGhlIHZhcmlvdXMgcm9sZXMKKyAqIGluIHRoZSBzb2Z0d2FyZSBzeXN0ZW0KKyAqLworZW51bSBod19tb2RlX2JhbmR3aWR0aCB7CisJSFdfTU9ERV9CV19OT05FLAorCUhXX01PREVfNV9NSFosCisJSFdfTU9ERV8xMF9NSFosCisJSFdfTU9ERV8yMF9NSFosCisJSFdfTU9ERV80MF9NSFosCisJSFdfTU9ERV84MF9NSFosCisJSFdfTU9ERV84MF9QTFVTXzgwX01IWiwKKwlIV19NT0RFXzE2MF9NSFosCisJSFdfTU9ERV9NQVhfQkFORFdJRFRICit9OworCisvKioKKyAqIGVudW0gaHdfbW9kZV9kYnNfY2FwYWIgLSBEQlMgSFcgbW9kZSBjYXBhYmlsaXR5CisgKiBASFdfTU9ERV9EQlNfTk9ORTogTm9uIERCUyBjYXBhYmxlCisgKiBASFdfTU9ERV9EQlM6IERGUyBjYXBhYmxlCisgKi8KK2VudW0gaHdfbW9kZV9kYnNfY2FwYWIgeworCUhXX01PREVfREJTX05PTkUsCisJSFdfTU9ERV9EQlMsCit9OworCisvKioKKyAqIGVudW0gaHdfbW9kZV9hZ2lsZV9kZnNfY2FwYWIgLSBBZ2lsZSBERlMgSFcgbW9kZSBjYXBhYmlsaXR5CisgKiBASFdfTU9ERV9BR0lMRV9ERlNfTk9ORTogTm9uIEFnaWxlIERGUyBjYXBhYmxlCisgKiBASFdfTU9ERV9BR0lMRV9ERlM6IEFnaWxlIERGUyBjYXBhYmxlCisgKi8KK2VudW0gaHdfbW9kZV9hZ2lsZV9kZnNfY2FwYWIgeworCUhXX01PREVfQUdJTEVfREZTX05PTkUsCisJSFdfTU9ERV9BR0lMRV9ERlMsCit9OworCisvKioKKyAqIGVudW0gc2V0X2h3X21vZGVfc3RhdHVzIC0gU3RhdHVzIG9mIHNldCBIVyBtb2RlIGNvbW1hbmQKKyAqIEBTRVRfSFdfTU9ERV9TVEFUVVNfT0s6IGNvbW1hbmQgc3VjY2Vzc2Z1bAorICogQFNFVF9IV19NT0RFX1NUQVRVU19FSU5WQUw6IFJlcXVlc3RlZCBpbnZhbGlkIGh3X21vZGUKKyAqIEBTRVRfSFdfTU9ERV9TVEFUVVNfRUNBTkNFTEVEOiBIVyBtb2RlIGNoYW5nZSBjYW5jZWxsZWQKKyAqIEBTRVRfSFdfTU9ERV9TVEFUVVNfRU5PVFNVUDogSFcgbW9kZSBub3Qgc3VwcG9ydGVkCisgKiBAU0VUX0hXX01PREVfU1RBVFVTX0VIQVJEV0FSRTogSFcgbW9kZSBjaGFuZ2UgcHJldmVudGVkIGJ5IGhhcmR3YXJlCisgKiBAU0VUX0hXX01PREVfU1RBVFVTX0VQRU5ESU5HOiBIVyBtb2RlIGNoYW5nZSBpcyBwZW5kaW5nCisgKiBAU0VUX0hXX01PREVfU1RBVFVTX0VDT0VYOiBIVyBtb2RlIGNoYW5nZSBjb25mbGljdCB3aXRoIENvZXgKKyAqLworZW51bSBzZXRfaHdfbW9kZV9zdGF0dXMgeworCVNFVF9IV19NT0RFX1NUQVRVU19PSywKKwlTRVRfSFdfTU9ERV9TVEFUVVNfRUlOVkFMLAorCVNFVF9IV19NT0RFX1NUQVRVU19FQ0FOQ0VMRUQsCisJU0VUX0hXX01PREVfU1RBVFVTX0VOT1RTVVAsCisJU0VUX0hXX01PREVfU1RBVFVTX0VIQVJEV0FSRSwKKwlTRVRfSFdfTU9ERV9TVEFUVVNfRVBFTkRJTkcsCisJU0VUX0hXX01PREVfU1RBVFVTX0VDT0VYLAorfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX3BjbF9saXN0IC0gRm9ybWF0IG9mIFBDTAorICogQHBjbF9saXN0OiBMaXN0IG9mIHByZWZlcnJlZCBjaGFubmVscworICogQHBjbF9sZW46IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgUENMCisgKi8KK3N0cnVjdCBzaXJfcGNsX2xpc3QgeworCXVpbnQ4X3QgcGNsX2xpc3RbMTI4XTsKKwl1aW50MzJfdCBwY2xfbGVuOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX2h3X21vZGVfcGFyYW1zIC0gSFcgbW9kZSBwYXJhbXMKKyAqIEBtYWMwX3R4X3NzOiBNQUMwIFR4IHNwYXRpYWwgc3RyZWFtCisgKiBAbWFjMF9yeF9zczogTUFDMCBSeCBzcGF0aWFsIHN0cmVhbQorICogQG1hYzFfdHhfc3M6IE1BQzEgVHggc3BhdGlhbCBzdHJlYW0KKyAqIEBtYWMxX3J4X3NzOiBNQUMxIFJ4IHNwYXRpYWwgc3RyZWFtCisgKiBAbWFjMF9idzogTUFDMCBiYW5kd2lkdGgKKyAqIEBtYWMxX2J3OiBNQUMxIGJhbmR3aWR0aAorICogQGRic19jYXA6IERCUyBjYXBhYmFsaXR5CisgKiBAYWdpbGVfZGZzX2NhcDogQWdpbGUgREZTIGNhcGFiYWxpdHkKKyAqLworc3RydWN0IHNpcl9od19tb2RlX3BhcmFtcyB7CisJdWludDhfdCBtYWMwX3R4X3NzOworCXVpbnQ4X3QgbWFjMF9yeF9zczsKKwl1aW50OF90IG1hYzFfdHhfc3M7CisJdWludDhfdCBtYWMxX3J4X3NzOworCXVpbnQ4X3QgbWFjMF9idzsKKwl1aW50OF90IG1hYzFfYnc7CisJdWludDhfdCBkYnNfY2FwOworCXVpbnQ4X3QgYWdpbGVfZGZzX2NhcDsKK307CisKKy8qKgorICogc3RydWN0IHNpcl92ZGV2X21hY19tYXAgLSB2ZGV2IGlkLW1hYyBpZCBtYXAKKyAqIEB2ZGV2X2lkOiBWREVWIGlkCisgKiBAbWFjX2lkOiBNQUMgaWQKKyAqLworc3RydWN0IHNpcl92ZGV2X21hY19tYXAgeworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3QgbWFjX2lkOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX3NldF9od19tb2RlX3Jlc3AgLSBIVyBtb2RlIHJlc3BvbnNlCisgKiBAc3RhdHVzOiBTdGF0dXMKKyAqIEBjZmdkX2h3X21vZGVfaW5kZXg6IENvbmZpZ3VyZWQgSFcgbW9kZSBpbmRleAorICogQG51bV92ZGV2X21hY19lbnRyaWVzOiBOdW1iZXIgb2YgdmRldi1tYWMgaWQgZW50cmllcworICogQHZkZXZfbWFjX21hcDogdmRldiBpZC1tYWMgaWQgbWFwCisgKi8KK3N0cnVjdCBzaXJfc2V0X2h3X21vZGVfcmVzcCB7CisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IGNmZ2RfaHdfbW9kZV9pbmRleDsKKwl1aW50MzJfdCBudW1fdmRldl9tYWNfZW50cmllczsKKwlzdHJ1Y3Qgc2lyX3ZkZXZfbWFjX21hcCB2ZGV2X21hY19tYXBbTUFYX1ZERVZfU1VQUE9SVEVEXTsKK307CisKKy8qKgorICogc3RydWN0IHNpcl9od19tb2RlX3RyYW5zX2luZCAtIEhXIG1vZGUgdHJhbnNpdGlvbiBpbmRpY2F0aW9uCisgKiBAb2xkX2h3X21vZGVfaW5kZXg6IEluZGV4IG9mIG9sZCBIVyBtb2RlCisgKiBAbmV3X2h3X21vZGVfaW5kZXg6IEluZGV4IG9mIG5ldyBIVyBtb2RlCisgKiBAbnVtX3ZkZXZfbWFjX2VudHJpZXM6IE51bWJlciBvZiB2ZGV2LW1hYyBpZCBlbnRyaWVzCisgKiBAdmRldl9tYWNfbWFwOiB2ZGV2IGlkLW1hYyBpZCBtYXAKKyAqLworc3RydWN0IHNpcl9od19tb2RlX3RyYW5zX2luZCB7CisJdWludDMyX3Qgb2xkX2h3X21vZGVfaW5kZXg7CisJdWludDMyX3QgbmV3X2h3X21vZGVfaW5kZXg7CisJdWludDMyX3QgbnVtX3ZkZXZfbWFjX2VudHJpZXM7CisJc3RydWN0IHNpcl92ZGV2X21hY19tYXAgdmRldl9tYWNfbWFwW01BWF9WREVWX1NVUFBPUlRFRF07Cit9OworCisvKioKKyAqIHN0cnVjdCBzaXJfZHVhbF9tYWNfY29uZmlnX3Jlc3AgLSBEdWFsIE1BQyBjb25maWcgcmVzcG9uc2UKKyAqIEBzdGF0dXM6IFN0YXR1cyBvZiBzZXR0aW5nIHRoZSBkdWFsIG1hYyBjb25maWd1cmF0aW9uCisgKi8KK3N0cnVjdCBzaXJfZHVhbF9tYWNfY29uZmlnX3Jlc3AgeworCXVpbnQzMl90IHN0YXR1czsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIFdNQV9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JFUQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBtZXNnVHlwZTsKKwl1aW50MTZfdCBtZXNnTGVuOworCisJdWludDMyX3QgdWxTdGF0dXM7ICAgICAgLyogc3VjY2VzcyBvciBmYWlsdXJlICovCisJdWludDY0X3QgdWxsS2V5UmVwbGF5Q291bnRlcjsgICAvKiBjdXJyZW50IHJlcGxheSBjb3VudGVyIHZhbHVlICovCisJdWludDMyX3QgdWxUb3RhbFJla2V5Q291bnQ7ICAgICAvKiB0b3RhbCByZWtleSBhdHRlbXB0cyAqLworCXVpbnQzMl90IHVsR1RLUmVrZXlDb3VudDsgICAgICAgLyogc3VjY2Vzc2Z1bCBHVEsgcmVrZXlzICovCisJdWludDMyX3QgdWxJR1RLUmVrZXlDb3VudDsgICAgICAvKiBzdWNjZXNzZnVsIGlHVEsgcmVrZXlzICovCisJdFNpck1hY0FkZHIgYnNzSWQ7Cit9IHRTaXJHdGtPZmZsb2FkR2V0SW5mb1JzcFBhcmFtcywgKnRwU2lyR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXM7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FEICovCisKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB0U2lyV2FrZVJlYXNvbkluZAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBtZXNnVHlwZTsKKwl1aW50MTZfdCBtZXNnTGVuOworCXVpbnQzMl90IHVsUmVhc29uOyAgICAgIC8qIHNlZSB0V2FrZVJlYXNvblR5cGUgKi8KKwl1aW50MzJfdCB1bFJlYXNvbkFyZzsgICAvKiBhcmd1bWVudCBzcGVjaWZpYyB0byB0aGUgcmVhc29uIHR5cGUgKi8KKwkvKiBsZW5ndGggb2Ygb3B0aW9uYWwgZGF0YSBzdG9yZWQgaW4gdGhpcyBtZXNzYWdlLCBpbiBjYXNlCisJICogSEFMIHRydW5jYXRlcyB0aGUgZGF0YSAoaS5lLiBkYXRhIHBhY2tldHMpIHRoaXMgbGVuZ3RoCisJICogd2lsbCBiZSBsZXNzIHRoYW4gdGhlIGFjdHVhbCBsZW5ndGgKKwkgKi8KKwl1aW50MzJfdCB1bFN0b3JlZERhdGFMZW47CisJdWludDMyX3QgdWxBY3R1YWxEYXRhTGVuOyAgICAgICAvKiBhY3R1YWwgbGVuZ3RoIG9mIGRhdGEgKi8KKwkvKiB2YXJpYWJsZSBsZW5ndGggc3RhcnQgb2YgZGF0YSAobGVuZ3RoID09IHN0b3JlZERhdGFMZW4pCisJICogc2VlIHNwZWNpZmljIHdha2UgdHlwZQorCSAqLworCXVpbnQ4X3QgYURhdGFTdGFydFsxXTsKK30gdFNpcldha2VSZWFzb25JbmQsICp0cFNpcldha2VSZWFzb25JbmQ7CisjZW5kaWYgLyogV0xBTl9XQUtFVVBfRVZFTlRTICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzQW5pU2V0VG1MZXZlbFJlcQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNBbmlTZXRUbUxldmVsUmVxIHsKKwl1aW50MTZfdCB0bU1vZGU7CisJdWludDE2X3QgbmV3VG1MZXZlbDsKK30gdEFuaVNldFRtTGV2ZWxSZXEsICp0cEFuaVNldFRtTGV2ZWxSZXE7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworLyogVERMUyBSZXF1ZXN0IHN0cnVjdCBTTUUtLT5QRSAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclRkbHNTZW5kTWdtdFJlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfVERMU19ESVNDT1ZFUllfU1RBUlRfUkVRICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOyAvKiBUcmFuc2FjdGlvbiBJRCBmb3IgY21kICovCisJdWludDhfdCByZXFUeXBlOworCXVpbnQ4X3QgZGlhbG9nOworCXVpbnQxNl90IHN0YXR1c0NvZGU7CisJdWludDhfdCByZXNwb25kZXI7CisJdWludDMyX3QgcGVlckNhcGFiaWxpdHk7CisJLyogRm9yIG11bHRpLXNlc3Npb24sIGZvciBQRSB0byBsb2NhdGUgcGVTZXNzaW9uIElEICovCisJdFNpck1hY0FkZHIgYnNzaWQ7CisJdFNpck1hY0FkZHIgcGVlck1hYzsKKwkvKiBWYXJpYWJsZSBsZW5naHQuIERvbnQgYWRkIGFueSBmaWVsZCBhZnRlciB0aGlzLiAqLworCXVpbnQ4X3QgYWRkSWVbMV07Cit9IHRTaXJUZGxzU2VuZE1nbXRSZXEsICp0cFNpclNtZVRkbHNTZW5kTWdtdFJlcTsKKwordHlwZWRlZiBlbnVtIFRkbHNBZGRPcGVyIHsKKwlURExTX09QRVJfTk9ORSwKKwlURExTX09QRVJfQURELAorCVRETFNfT1BFUl9VUERBVEUKK30gZVRkbHNBZGRPcGVyOworCisvKiBURExTIFJlcXVlc3Qgc3RydWN0IFNNRS0tPlBFICovCit0eXBlZGVmIHN0cnVjdCBzU2lyVGRsc0FkZFN0YVJlcSB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfVERMU19ESVNDT1ZFUllfU1RBUlRfUkVRICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOyAvKiBUcmFuc2FjdGlvbiBJRCBmb3IgY21kICovCisJLyogRm9yIG11bHRpLXNlc3Npb24sIGZvciBQRSB0byBsb2NhdGUgcGVTZXNzaW9uIElEICovCisJdFNpck1hY0FkZHIgYnNzaWQ7CisJZVRkbHNBZGRPcGVyIHRkbHNBZGRPcGVyOworCXRTaXJNYWNBZGRyIHBlZXJNYWM7CisJdWludDE2X3QgY2FwYWJpbGl0eTsKKwl1aW50OF90IGV4dG5fY2FwYWJpbGl0eVtTSVJfTUFDX01BWF9FWFROX0NBUF07CisJdWludDhfdCBzdXBwb3J0ZWRfcmF0ZXNfbGVuZ3RoOworCXVpbnQ4X3Qgc3VwcG9ydGVkX3JhdGVzW1NJUl9NQUNfTUFYX1NVUFBfUkFURVNdOworCXVpbnQ4X3QgaHRjYXBfcHJlc2VudDsKKwl0U2lySFRDYXAgaHRDYXA7CisJdWludDhfdCB2aHRjYXBfcHJlc2VudDsKKwl0U2lyVkhUQ2FwIHZodENhcDsKKwl1aW50OF90IHVhcHNkX3F1ZXVlczsKKwl1aW50OF90IG1heF9zcDsKK30gdFNpclRkbHNBZGRTdGFSZXEsICp0cFNpclNtZVRkbHNBZGRTdGFSZXE7CisKKy8qIFRETFMgUmVzcG9uc2Ugc3RydWN0IFBFLS0+U01FICovCit0eXBlZGVmIHN0cnVjdCBzU2lyVGRsc0FkZFN0YVJzcCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7CisJdWludDE2X3QgbGVuZ3RoOworCXRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlOworCXRTaXJNYWNBZGRyIHBlZXJNYWM7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXVpbnQxNl90IHN0YUlkOworCXVpbnQxNl90IHN0YVR5cGU7CisJdWludDhfdCB1Y2FzdFNpZzsKKwl1aW50OF90IGJjYXN0U2lnOworCWVUZGxzQWRkT3BlciB0ZGxzQWRkT3BlcjsKK30gdFNpclRkbHNBZGRTdGFSc3A7CisKKy8qIFRETFMgUmVxdWVzdCBzdHJ1Y3QgU01FLS0+UEUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9URExTX0xJTktfRVNUQUJMSVNIX1JFUSAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBTZXNzaW9uIElEICovCisJdWludDE2X3QgdHJhbnNhY3Rpb25JZDsgLyogVHJhbnNhY3Rpb24gSUQgZm9yIGNtZCAqLworCXVpbnQ4X3QgdWFwc2RRdWV1ZXM7ICAgIC8qIFBlZXIncyB1YXBzZCBRdWV1ZXMgSW5mb3JtYXRpb24gKi8KKwl1aW50OF90IG1heFNwOyAgICAgICAgICAvKiBQZWVyJ3MgU3VwcG9ydGVkIE1heGltdW0gU2VydmljZSBQZXJpb2QgKi8KKwl1aW50OF90IGlzQnVmU3RhOyAgICAgICAvKiBEb2VzIFBlZXIgU3VwcG9ydCBhcyBCdWZmZXIgU3RhdGlvbi4gKi8KKwkvKiBEb2VzIFBlZXIgU3VwcG9ydCBhcyBURExTIE9mZiBDaGFubmVsLiAqLworCXVpbnQ4X3QgaXNPZmZDaGFubmVsU3VwcG9ydGVkOworCXVpbnQ4X3QgaXNSZXNwb25kZXI7ICAgIC8qIElzIFBlZXIgYSByZXNwb25kZXIuICovCisJLyogRm9yIG11bHRpLXNlc3Npb24sIGZvciBQRSB0byBsb2NhdGUgcGVTZXNzaW9uIElEICovCisJdFNpck1hY0FkZHIgYnNzaWQ7CisJdFNpck1hY0FkZHIgcGVlck1hYzsKKwl1aW50OF90IHN1cHBvcnRlZENoYW5uZWxzTGVuOworCXVpbnQ4X3Qgc3VwcG9ydGVkQ2hhbm5lbHNbU0lSX01BQ19NQVhfU1VQUF9DSEFOTkVMU107CisJdWludDhfdCBzdXBwb3J0ZWRPcGVyQ2xhc3Nlc0xlbjsKKwl1aW50OF90IHN1cHBvcnRlZE9wZXJDbGFzc2VzW1NJUl9NQUNfTUFYX1NVUFBfT1BFUl9DTEFTU0VTXTsKK30gdFNpclRkbHNMaW5rRXN0YWJsaXNoUmVxLCAqdHBTaXJUZGxzTGlua0VzdGFibGlzaFJlcTsKKworLyogVERMUyBSZXF1ZXN0IHN0cnVjdCBTTUUtLT5QRSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX1RETFNfTElOS19FU1RBQkxJU0hfUlNQICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkOyAvKiBUcmFuc2FjdGlvbiBJRCBmb3IgY21kICovCisJdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisJdFNpck1hY0FkZHIgcGVlck1hYzsKK30gdFNpclRkbHNMaW5rRXN0YWJsaXNoUmVxUnNwLCAqdHBTaXJUZGxzTGlua0VzdGFibGlzaFJlcVJzcDsKKworLyogVERMUyBSZXF1ZXN0IHN0cnVjdCBTTUUtLT5QRSAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclRkbHNEZWxTdGFSZXEgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX1RETFNfRElTQ09WRVJZX1NUQVJUX1JFUSAqLworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBTZXNzaW9uIElEICovCisJdWludDE2X3QgdHJhbnNhY3Rpb25JZDsgLyogVHJhbnNhY3Rpb24gSUQgZm9yIGNtZCAqLworCS8qIEZvciBtdWx0aS1zZXNzaW9uLCBmb3IgUEUgdG8gbG9jYXRlIHBlU2Vzc2lvbiBJRCAqLworCXRTaXJNYWNBZGRyIGJzc2lkOworCXRTaXJNYWNBZGRyIHBlZXJNYWM7Cit9IHRTaXJUZGxzRGVsU3RhUmVxLCAqdHBTaXJTbWVUZGxzRGVsU3RhUmVxOworLyogVERMUyBSZXNwb25zZSBzdHJ1Y3QgUEUtLT5TTUUgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJUZGxzRGVsU3RhUnNwIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlOworCXRTaXJNYWNBZGRyIHBlZXJNYWM7CisJdWludDE2X3Qgc3RhSWQ7Cit9IHRTaXJUZGxzRGVsU3RhUnNwLCAqdHBTaXJUZGxzRGVsU3RhUnNwOworLyogVERMUyBEZWxldGUgSW5kaWNhdGlvbiBzdHJ1Y3QgUEUtLT5TTUUgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJUZGxzRGVsU3RhSW5kIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXRTaXJNYWNBZGRyIHBlZXJNYWM7CisJdWludDE2X3Qgc3RhSWQ7CisJdWludDE2X3QgcmVhc29uQ29kZTsKK30gdFNpclRkbHNEZWxTdGFJbmQsICp0cFNpclRkbHNEZWxTdGFJbmQ7Cit0eXBlZGVmIHN0cnVjdCBzU2lyVGRsc0RlbEFsbFBlZXJJbmQgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBTZXNzaW9uIElEICovCit9IHRTaXJUZGxzRGVsQWxsUGVlckluZCwgKnRwU2lyVGRsc0RlbEFsbFBlZXJJbmQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFNfRElTQVBQRUFSX0FQCit0eXBlZGVmIHN0cnVjdCBzU2lyVGRsc0Rpc2FwcGVhckFQSW5kIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCAqLworCXVpbnQxNl90IHN0YUlkOworCXRTaXJNYWNBZGRyIHN0YUFkZHI7Cit9IHRTaXJUZGxzRGlzYXBwZWFyQVBJbmQsICp0cFNpclRkbHNEaXNhcHBlYXJBUEluZDsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3Qgc1Npck1nbXRUeENvbXBsZXRpb25JbmQgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBTZXNzaW9uIElEICovCisJdWludDMyX3QgdHhDb21wbGV0ZVN0YXR1czsKK30gdFNpck1nbXRUeENvbXBsZXRpb25JbmQsICp0cFNpck1nbXRUeENvbXBsZXRpb25JbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJUZGxzRXZlbnRub3RpZnkgeworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIHBlZXJNYWM7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7CisJdWludDMyX3QgcGVlcl9yZWFzb247Cit9IHRTaXJUZGxzRXZlbnRub3RpZnk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckFjdGl2ZU1vZGVTZXRCY25GaWx0ZXJSZXEgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90IHNlZXNpb25JZDsKK30gdFNpclNldEFjdGl2ZU1vZGVTZXRCbmNGaWx0ZXJSZXEsICp0cFNpclNldEFjdGl2ZU1vZGVTZXRCbmNGaWx0ZXJSZXE7CisKKy8qIFJlc2V0IEFQIENhcHMgQ2hhbmdlZCAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclJlc2V0QVBDYXBzQ2hhbmdlIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsKKwl1aW50MTZfdCBsZW5ndGg7CisJdFNpck1hY0FkZHIgYnNzSWQ7Cit9IHRTaXJSZXNldEFQQ2Fwc0NoYW5nZSwgKnRwU2lyUmVzZXRBUENhcHNDaGFuZ2U7CisKKy8qIC8gRGVmaW5pdGlvbiBmb3IgQ2FuZGlkYXRlIGZvdW5kIGluZGljYXRpb24gZnJvbSBGVyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZUNhbmRpZGF0ZUZvdW5kSW5kIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9DQU5ESURBVEVfRk9VTkRfSU5EICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSWRlbnRpZmllciAqLworfSB0U2lyU21lQ2FuZGlkYXRlRm91bmRJbmQsICp0cFNpclNtZUNhbmRpZGF0ZUZvdW5kSW5kOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldsYW5FeGNsdWRlVW5lbmNyeXB0UGFyYW0geworCWJvb2wgZXhjbHVkZVVuZW5jcnlwdDsKKwl0U2lyTWFjQWRkciBic3NJZDsKK30gdFNpcldsYW5FeGNsdWRlVW5lbmNyeXB0UGFyYW0sICp0cFNpcldsYW5FeGNsdWRlVW5lbmNyeXB0UGFyYW07CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKwlQMlBfU0NBTl9UWVBFX1NFQVJDSCA9IDEsICAgICAgIC8qIFAyUCBTZWFyY2ggKi8KKwlQMlBfU0NBTl9UWVBFX0xJU1RFTiAgICAvKiBQMlAgTGlzdGVuICovCit9IHRTaXJQMnBTY2FuVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaUhhbmRvZmZSZXEgeworCS8qIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXF1ZXN0cyAqLworCXVpbnQxNl90IG1zZ1R5cGU7ICAgICAgIC8qIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUgKi8KKwl1aW50MTZfdCBtc2dMZW47ICAgICAgICAvKiBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0ICovCisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDhfdCBic3NpZFtDREZfTUFDX0FERFJfU0laRV07CisJdWludDhfdCBjaGFubmVsOworCXVpbnQ4X3QgaGFuZG9mZl9zcmM7Cit9IHRBbmlIYW5kb2ZmUmVxLCAqdHBBbmlIYW5kb2ZmUmVxOworCit0eXBlZGVmIHN0cnVjdCBzU2lyU2Nhbk9mZmxvYWRSZXEgeworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIGJzc0lkOworCXVpbnQ4X3QgbnVtU3NpZDsKKwl0U2lyTWFjU1NpZCBzc0lkW1NJUl9TQ0FOX01BWF9OVU1fU1NJRF07CisJdWludDhfdCBoaWRkZW5Tc2lkOworCXRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyOworCXRTaXJCc3NUeXBlIGJzc1R5cGU7CisJdWludDhfdCBkb3QxMW1vZGU7CisJdFNpclNjYW5UeXBlIHNjYW5UeXBlOworCXVpbnQzMl90IG1pbkNoYW5uZWxUaW1lOworCXVpbnQzMl90IG1heENoYW5uZWxUaW1lOworCXVpbnQzMl90IHNjYW5faWQ7CisJLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzLCBpZ25vcmVkIHdoZW4gbm90IGNvbm5lY3RlZCAqLworCXVpbnQzMl90IHJlc3RUaW1lOworCXRTaXJQMnBTY2FuVHlwZSBwMnBTY2FuVHlwZTsKKwl1aW50MTZfdCB1SUVGaWVsZExlbjsKKwl1aW50MTZfdCB1SUVGaWVsZE9mZnNldDsKKwl0U2lyQ2hhbm5lbExpc3QgY2hhbm5lbExpc3Q7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgc1NpclNjYW5PZmZsb2FkUmVxLi4uLgorCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgIHVJRUZpZWxkTGVuCisJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgdUlFRmllbGRPZmZzZXQgICAgICAgICAgICAgICAtLS0tKworCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgfAorCSAgY2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgICAgICAgICAgfAorCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgfAorCSAgLi4uIHZhcmlhYmxlIHNpemUgdXAgdG8gICAgICAgICAgfAorCSAgY2hhbm5lbE51bWJlcltudW1DaGFubmVscy0xXSAgICAgfAorCSAgVGhpcyBjYW4gYmUgemVybywgaWYgICAgICAgICAgICAgfAorCSAgbnVtQ2hhbm5lbCBpcyB6ZXJvLiAgICAgICAgICAgICAgfAorCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC0tKworCSAgLi4uIHZhcmlhYmxlIHNpemUgdUlFRmllbGQKKwkgIHVwIHRvIHVJRUZpZWxkTGVuIChjYW4gYmUgMCkKKwkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK30gdFNpclNjYW5PZmZsb2FkUmVxLCAqdHBTaXJTY2FuT2ZmbG9hZFJlcTsKKwordHlwZWRlZiBlbnVtIHNTaXJTY2FuRXZlbnRUeXBlIHsKKwlTQ0FOX0VWRU5UX1NUQVJURUQgPSAweDEsICAgICAgIC8qIFNjYW4gY29tbWFuZCBhY2NlcHRlZCBieSBGVyAqLworCVNDQU5fRVZFTlRfQ09NUExFVEVEID0gMHgyLCAgICAgLyogU2NhbiBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgRlcgKi8KKwlTQ0FOX0VWRU5UX0JTU19DSEFOTkVMID0gMHg0LCAgIC8qIEZXIGlzIGdvaW5nIHRvIG1vdmUgdG8gSE9NRSBjaCAqLworCVNDQU5fRVZFTlRfRk9SRUlHTl9DSEFOTkVMID0gMHg4LCAgIC8qIEZXIGdvaW5nIHRvIG1vdmUgdG8gRk9SSUVHTiBjaCAqLworCVNDQU5fRVZFTlRfREVRVUVVRUQgPSAweDEwLCAgICAgLyogc2NhbiByZXF1ZXN0IGdvdCBkZXF1ZXVlZCAqLworCVNDQU5fRVZFTlRfUFJFRU1QVEVEID0gMHgyMCwgICAgLyogcHJlZW1wdGVkIGJ5IGhpZ2ggcHJpb3JpdHkgc2NhbiAqLworCVNDQU5fRVZFTlRfU1RBUlRfRkFJTEVEID0gMHg0MCwgLyogc2NhbiBzdGFydCBmYWlsZWQgKi8KKwlTQ0FOX0VWRU5UX1JFU1RBUlRFRCA9IDB4ODAsICAgIC8qc2NhbiByZXN0YXJ0ZWQgKi8KKwlTQ0FOX0VWRU5UX01BWCA9IDB4ODAwMAorfSB0U2lyU2NhbkV2ZW50VHlwZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNjYW5PZmZsb2FkRXZlbnQgeworCXRTaXJTY2FuRXZlbnRUeXBlIGV2ZW50OworCXRTaXJSZXN1bHRDb2RlcyByZWFzb25Db2RlOworCXVpbnQzMl90IGNoYW5GcmVxOworCXVpbnQzMl90IHJlcXVlc3RvcjsKKwl1aW50MzJfdCBzY2FuSWQ7CisJdFNpclAycFNjYW5UeXBlIHAycFNjYW5UeXBlOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworfSB0U2lyU2Nhbk9mZmxvYWRFdmVudCwgKnRwU2lyU2Nhbk9mZmxvYWRFdmVudDsKKworLyoqCisgKiBzdHJ1Y3Qgc1NpclVwZGF0ZUNoYW5QYXJhbSAtIGNoYW5uZWwgcGFyYW1ldGVycworICogQGNoYW5JZDogSUQgb2YgdGhlIGNoYW5uZWwKKyAqIEBwd3I6IHBvd2VyIGxldmVsCisgKiBAZGZzU2V0OiBpcyBkZnMgc3VwcG9ydGVkIG9yIG5vdAorICogQGhhbGZfcmF0ZTogaXMgdGhlIGNoYW5uZWwgb3BlcmF0aW5nIGF0IDEwTUh6CisgKiBAcXVhcnRlcl9yYXRlOiBpcyB0aGUgY2hhbm5lbCBvcGVyYXRpbmcgYXQgNU1IegorICovCit0eXBlZGVmIHN0cnVjdCBzU2lyVXBkYXRlQ2hhblBhcmFtIHsKKwl1aW50OF90IGNoYW5JZDsKKwl1aW50OF90IHB3cjsKKwlib29sIGRmc1NldDsKKwlib29sIGhhbGZfcmF0ZTsKKwlib29sIHF1YXJ0ZXJfcmF0ZTsKK30gdFNpclVwZGF0ZUNoYW5QYXJhbSwgKnRwU2lyVXBkYXRlQ2hhblBhcmFtOworCit0eXBlZGVmIHN0cnVjdCBzU2lyVXBkYXRlQ2hhbiB7CisJdWludDhfdCBudW1DaGFuOworCXRTaXJVcGRhdGVDaGFuUGFyYW0gY2hhblBhcmFtWzFdOworfSB0U2lyVXBkYXRlQ2hhbkxpc3QsICp0cFNpclVwZGF0ZUNoYW5MaXN0OworCit0eXBlZGVmIGVudW0gZVNpckFkZG9uUHNSZXEgeworCWVTSVJfQURET05fTk9USElORywKKwllU0lSX0FERE9OX0VOQUJMRV9VQVBTRCwKKwllU0lSX0FERE9OX0RJU0FCTEVfVUFQU0QKK30gdFNpckFkZG9uUHNSZXE7CisKKy8qIFBvd2Vyc2F2ZSBPZmZsb2FkIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJQc1JlcURhdGEgeworCS8qIEJTU0lEICovCisJdFNpck1hY0FkZHIgYnNzSWQ7CisKKwkvKiBBZGRpdGlvbmFsIEluZm8gKi8KKwl0U2lyQWRkb25Qc1JlcSBhZGRPblJlcTsKK30gdFNpclBzUmVxRGF0YSwgKnRwU2lyUHNSZXFEYXRhOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xQSEIKKyNkZWZpbmUgU0lSX0xQSEJfRklMVEVSX0xFTiAgIDY0CisKK3R5cGVkZWYgZW51bSB7CisJTFBIQl9TRVRfRU5fUEFSQU1TX0lORElELAorCUxQSEJfU0VUX1RDUF9QQVJBTVNfSU5ESUQsCisJTFBIQl9TRVRfVENQX1BLVF9GSUxURVJfSU5ESUQsCisJTFBIQl9TRVRfVURQX1BBUkFNU19JTkRJRCwKKwlMUEhCX1NFVF9VRFBfUEtUX0ZJTFRFUl9JTkRJRCwKKwlMUEhCX1NFVF9ORVRXT1JLX0lORk9fSU5ESUQsCit9IExQSEJJbmRUeXBlOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTFBIQkVuYWJsZVN0cnVjdCB7CisJdWludDhfdCBlbmFibGU7CisJdWludDhfdCBpdGVtOworCXVpbnQ4X3Qgc2Vzc2lvbjsKK30gdFNpckxQSEJFbmFibGVTdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJMUEhCVGNwUGFyYW1TdHJ1Y3QgeworCXVpbnQzMl90IHNydl9pcDsKKwl1aW50MzJfdCBkZXZfaXA7CisJdWludDE2X3Qgc3JjX3BvcnQ7CisJdWludDE2X3QgZHN0X3BvcnQ7CisJdWludDE2X3QgdGltZW91dDsKKwl1aW50OF90IHNlc3Npb247CisJdFNpck1hY0FkZHIgZ2F0ZXdheV9tYWM7CisJdWludDE2X3QgdGltZVBlcmlvZFNlYzsgLyogaW4gc2Vjb25kcyAqLworCXVpbnQzMl90IHRjcFNuOworfSB0U2lyTFBIQlRjcFBhcmFtU3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBzU2lyTFBIQlRjcEZpbHRlclN0cnVjdCB7CisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgb2Zmc2V0OworCXVpbnQ4X3Qgc2Vzc2lvbjsKKwl1aW50OF90IGZpbHRlcltTSVJfTFBIQl9GSUxURVJfTEVOXTsKK30gdFNpckxQSEJUY3BGaWx0ZXJTdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJMUEhCVWRwUGFyYW1TdHJ1Y3QgeworCXVpbnQzMl90IHNydl9pcDsKKwl1aW50MzJfdCBkZXZfaXA7CisJdWludDE2X3Qgc3JjX3BvcnQ7CisJdWludDE2X3QgZHN0X3BvcnQ7CisJdWludDE2X3QgaW50ZXJ2YWw7CisJdWludDE2X3QgdGltZW91dDsKKwl1aW50OF90IHNlc3Npb247CisJdFNpck1hY0FkZHIgZ2F0ZXdheV9tYWM7Cit9IHRTaXJMUEhCVWRwUGFyYW1TdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJMUEhCVWRwRmlsdGVyU3RydWN0IHsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDhfdCBvZmZzZXQ7CisJdWludDhfdCBzZXNzaW9uOworCXVpbnQ4X3QgZmlsdGVyW1NJUl9MUEhCX0ZJTFRFUl9MRU5dOworfSB0U2lyTFBIQlVkcEZpbHRlclN0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckxQSEJSZXEgeworCXVpbnQxNl90IGNtZDsKKwl1aW50MTZfdCBkdW1teTsKKwl1bmlvbiB7CisJCXRTaXJMUEhCRW5hYmxlU3RydWN0IGxwaGJFbmFibGVSZXE7CisJCXRTaXJMUEhCVGNwUGFyYW1TdHJ1Y3QgbHBoYlRjcFBhcmFtUmVxOworCQl0U2lyTFBIQlRjcEZpbHRlclN0cnVjdCBscGhiVGNwRmlsdGVyUmVxOworCQl0U2lyTFBIQlVkcFBhcmFtU3RydWN0IGxwaGJVZHBQYXJhbVJlcTsKKwkJdFNpckxQSEJVZHBGaWx0ZXJTdHJ1Y3QgbHBoYlVkcEZpbHRlclJlcTsKKwl9IHBhcmFtczsKK30gdFNpckxQSEJSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJMUEhCSW5kIHsKKwl1aW50OF90IHNlc3Npb25JZHg7CisJdWludDhfdCBwcm90b2NvbFR5cGU7ICAgLypUQ1Agb3IgVURQICovCisJdWludDhfdCBldmVudFJlYXNvbjsKK30gdFNpckxQSEJJbmQ7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0xQSEIgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAordHlwZWRlZiBzdHJ1Y3Qgc1NpckNoQXZvaWRVcGRhdGVSZXEgeworCXVpbnQzMl90IHJlc2VydmVkX3BhcmFtOworfSB0U2lyQ2hBdm9pZFVwZGF0ZVJlcTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckxpbmtTcGVlZEluZm8geworCS8qIE1BQyBBZGRyZXNzIGZvciB0aGUgcGVlciAqLworCXRTaXJNYWNBZGRyIHBlZXJfbWFjYWRkcjsKKwl1aW50MzJfdCBlc3RMaW5rU3BlZWQ7ICAvKiBMaW5rc3BlZWQgZnJvbSBmaXJtd2FyZSAqLworfSB0U2lyTGlua1NwZWVkSW5mbywgKnRwU2lyTGlua1NwZWVkSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckFkZFBlcmlvZGljVHhQdHJuIHsKKwkvKiBNQUMgQWRkcmVzcyBmb3IgdGhlIGFkYXB0ZXIgKi8KKwl0U2lyTWFjQWRkciBtYWNBZGRyZXNzOworCXVpbnQ4X3QgdWNQdHJuSWQ7ICAgICAgIC8qIFBhdHRlcm4gSUQgKi8KKwl1aW50MTZfdCB1Y1B0cm5TaXplOyAgICAvKiBQYXR0ZXJuIHNpemUgKi8KKwl1aW50MzJfdCB1c1B0cm5JbnRlcnZhbE1zOyAgICAgIC8qIEluIG1zZWMgKi8KKwl1aW50OF90IHVjUGF0dGVybltQRVJJT0RJQ19UWF9QVFJOX01BWF9TSVpFXTsgICAvKiBQYXR0ZXJuIGJ1ZmZlciAqLworfSB0U2lyQWRkUGVyaW9kaWNUeFB0cm4sICp0cFNpckFkZFBlcmlvZGljVHhQdHJuOworCit0eXBlZGVmIHN0cnVjdCBzU2lyRGVsUGVyaW9kaWNUeFB0cm4geworCS8qIE1BQyBBZGRyZXNzIGZvciB0aGUgYWRhcHRlciAqLworCXRTaXJNYWNBZGRyIG1hY0FkZHJlc3M7CisJLyogQml0bWFwIG9mIHBhdHRlcm4gSURzIHRoYXQgbmVlZCB0byBiZSBkZWxldGVkICovCisJdWludDMyX3QgdWNQYXR0ZXJuSWRCaXRtYXA7CisJdWludDhfdCB1Y1B0cm5JZDsgICAgICAgLyogUGF0dGVybiBJRCAqLworfSB0U2lyRGVsUGVyaW9kaWNUeFB0cm4sICp0cFNpckRlbFBlcmlvZGljVHhQdHJuOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgbWVzZ1R5cGU7CisJdWludDE2X3QgbWVzZ0xlbjsKKwlib29sIHN1c3BlbmRlZDsKK30gdFNpclJlYWR5VG9TdXNwZW5kSW5kLCAqdHBTaXJSZWFkeVRvU3VzcGVuZEluZDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRVhUV09XX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBtZXNnVHlwZTsKKwl1aW50MTZfdCBtZXNnTGVuOworCWJvb2wgc3RhdHVzOworfSB0U2lyUmVhZHlUb0V4dFdvV0luZCwgKnRwU2lyUmVhZHlUb0V4dFdvV0luZDsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3Qgc1NpclJhdGVVcGRhdGVJbmQgeworCXVpbnQ4X3QgbnNzOyAgICAgICAgICAgIC8qIDA6IDF4MSwgMTogMngyICovCisJdFNpck1hY0FkZHIgYnNzaWQ7CisJdENERl9DT05fTU9ERSBkZXZfbW9kZTsKKwlpbnQzMl90IGJjYXN0RGF0YVJhdGU7ICAvKiBiY2FzdCByYXRlIHVuaXQgTWJwc3gxMCwgLTE6bm90IHVzZWQgKi8KKwkvKgorCSAqIDAgaW1wbGllcyBSQSwgcG9zaXRpdmUgdmFsdWUgaW1wbGllcyBmaXhlZCByYXRlLCAtMSBpbXBsaWVzIGlnbm9yZQorCSAqIHRoaXMgcGFyYW0uCisJICovCisJaW50MzJfdCB1Y2FzdERhdGFSYXRlOworCisJLyogVFggZmxhZyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gSFQyMCwgSFQ0MCBldGMgKi8KKwl0VHhyYXRlaW5mb2ZsYWdzIHVjYXN0RGF0YVJhdGVUeEZsYWc7CisKKwkvKgorCSAqIDAgaW1wbGllcyBNQ0FTVCBSQSwgcG9zaXRpdmUgdmFsdWUgaW1wbGllcyBmaXhlZCByYXRlLAorCSAqIC0xIGltcGxpZXMgaWdub3JlIHRoaXMgcGFyYW0KKwkgKi8KKwlpbnQzMl90IHJlbGlhYmxlTWNhc3REYXRhUmF0ZTsgIC8qIHVuaXQgTWJwc3gxMCAqLworCisJLyogVFggZmxhZyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gSFQyMCwgSFQ0MCBldGMgKi8KKwl0VHhyYXRlaW5mb2ZsYWdzIHJlbGlhYmxlTWNhc3REYXRhUmF0ZVR4RmxhZzsKKworCS8qCisJICogTUNBU1Qob3IgQkNBU1QpIGZpeGVkIGRhdGEgcmF0ZSBpbiAyLjQgR0h6LCB1bml0IE1icHN4MTAsCisJICogMCBpbXBsaWVzIGlnbm9yZQorCSAqLworCXVpbnQzMl90IG1jYXN0RGF0YVJhdGUyNEdIejsKKworCS8qIFRYIGZsYWcgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIEhUMjAsIEhUNDAgZXRjICovCisJdFR4cmF0ZWluZm9mbGFncyBtY2FzdERhdGFSYXRlMjRHSHpUeEZsYWc7CisKKwkvKgorCSAqIE1DQVNUKG9yIEJDQVNUKSBmaXhlZCBkYXRhIHJhdGUgaW4gNSBHSHosCisJICogdW5pdCBNYnBzeDEwLCAwIGltcGxpZXMgaWdub3JlCisJICovCisJdWludDMyX3QgbWNhc3REYXRhUmF0ZTVHSHo7CisKKwkvKiBUWCBmbGFnIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBIVDIwLCBIVDQwIGV0YyAqLworCXRUeHJhdGVpbmZvZmxhZ3MgbWNhc3REYXRhUmF0ZTVHSHpUeEZsYWc7CisKK30gdFNpclJhdGVVcGRhdGVJbmQsICp0cFNpclJhdGVVcGRhdGVJbmQ7CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9DSF9BVk9JRCkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fRk9SQ0VfU0FQX1NDQykKKyNkZWZpbmUgU0lSX0NIX0FWT0lEX01BWF9SQU5HRSAgIDQKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckNoQXZvaWRGcmVxVHlwZSB7CisJdWludDMyX3Qgc3RhcnRfZnJlcTsKKwl1aW50MzJfdCBlbmRfZnJlcTsKK30gdFNpckNoQXZvaWRGcmVxVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckNoQXZvaWRJbmRUeXBlIHsKKwl1aW50MzJfdCBhdm9pZF9yYW5nZV9jb3VudDsKKwl0U2lyQ2hBdm9pZEZyZXFUeXBlIGF2b2lkX2ZyZXFfcmFuZ2VbU0lSX0NIX0FWT0lEX01BWF9SQU5HRV07Cit9IHRTaXJDaEF2b2lkSW5kVHlwZTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgfHwgRkVBVFVSRV9XTEFOX0ZPUkNFX1NBUF9TQ0MgKi8KKworI2RlZmluZSBTSVJfREZTX01BWF8yME1fU1VCX0NIIDgKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZURmc0NoYW5uZWxMaXN0IHsKKwl1aW50MzJfdCBuY2hhbm5lbHM7CisJLyogQ2ggbnVtIGluY2x1ZGluZyBib25kZWQgY2hhbm5lbHMgb24gd2hpY2ggdGhlIFJBREFSIGlzIHByZXNlbnQgKi8KKwl1aW50OF90IGNoYW5uZWxzW1NJUl9ERlNfTUFYXzIwTV9TVUJfQ0hdOworfSB0U2lyU21lRGZzQ2hhbm5lbExpc3QsICp0cFNpclNtZURmc0NoYW5uZWxMaXN0OworCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lRGZzRXZlbnRJbmQgeworCXVpbnQzMl90IHNlc3Npb25JZDsKKwl0U2lyU21lRGZzQ2hhbm5lbExpc3QgY2hhbl9saXN0OworCXVpbnQzMl90IGRmc19yYWRhcl9zdGF0dXM7CisJaW50IHVzZV9ub2w7Cit9IHRTaXJTbWVEZnNFdmVudEluZCwgKnRwU2lyU21lRGZzRXZlbnRJbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJDaGFuQ2hhbmdlUmVxdWVzdCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7CisJdWludDE2X3QgbWVzc2FnZUxlbjsKKwl1aW50OF90IHRhcmdldENoYW5uZWw7CisJdWludDhfdCBjYk1vZGU7CisJdWludDhfdCBjaGFubmVsX3dpZHRoOworCXVpbnQ4X3QgY2VudGVyX2ZyZXFfc2VnXzA7CisJdWludDhfdCBjZW50ZXJfZnJlcV9zZWdfMTsKKwl1aW50OF90IGJzc2lkW0NERl9NQUNfQUREUl9TSVpFXTsKKwl1aW50MzJfdCBkb3QxMW1vZGU7CisJdFNpck1hY1JhdGVTZXQgb3BlcmF0aW9uYWxfcmF0ZXNldDsKKwl0U2lyTWFjUmF0ZVNldCBleHRlbmRlZF9yYXRlc2V0OworfSB0U2lyQ2hhbkNoYW5nZVJlcXVlc3QsICp0cFNpckNoYW5DaGFuZ2VSZXF1ZXN0OworCit0eXBlZGVmIHN0cnVjdCBzU2lyQ2hhbkNoYW5nZVJlc3BvbnNlIHsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IG5ld0NoYW5uZWxOdW1iZXI7CisJdWludDhfdCBjaGFubmVsQ2hhbmdlU3RhdHVzOworCWVQaHlDaGFuQm9uZFN0YXRlIHNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7Cit9IHRTaXJDaGFuQ2hhbmdlUmVzcG9uc2UsICp0cFNpckNoYW5DaGFuZ2VSZXNwb25zZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclN0YXJ0QmVhY29uSW5kaWNhdGlvbiB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7CisJdWludDE2X3QgbWVzc2FnZUxlbjsKKwl1aW50OF90IGJlYWNvblN0YXJ0U3RhdHVzOworCXVpbnQ4X3QgYnNzaWRbQ0RGX01BQ19BRERSX1NJWkVdOworfSB0U2lyU3RhcnRCZWFjb25JbmRpY2F0aW9uLCAqdHBTaXJTdGFydEJlYWNvbkluZGljYXRpb247CisKKy8qIGFkZGl0aW9uYWwgSUUgdHlwZSAqLwordHlwZWRlZiBlbnVtIHRVcGRhdGVJRXNUeXBlIHsKKwllVVBEQVRFX0lFX05PTkUsCisJZVVQREFURV9JRV9QUk9CRV9CQ04sCisJZVVQREFURV9JRV9QUk9CRV9SRVNQLAorCWVVUERBVEVfSUVfQVNTT0NfUkVTUCwKKworCS8qIEFkZCB0eXBlIGFib3ZlIHRoaXMgbGluZSAqLworCS8qIHRoaXMgaXMgdXNlZCB0byByZXNldCBhbGwgYnVmZmVyICovCisJZVVQREFURV9JRV9BTEwsCisJZVVQREFURV9JRV9NQVgKK30gZVVwZGF0ZUlFc1R5cGU7CisKKy8qIE1vZGlmeSBwYXJ0aWN1bGFyIElFIGluIGFkZGl0aW9uIElFIGZvciBwcm9iIHJlc3AgQmNuICovCit0eXBlZGVmIHN0cnVjdCBzU2lyTW9kaWZ5SUUgeworCXRTaXJNYWNBZGRyIGJzc2lkOworCXVpbnQxNl90IHNtZVNlc3Npb25JZDsKKwlib29sIG5vdGlmeTsKKwl1aW50OF90IGllSUQ7CisJdWludDhfdCBpZUlETGVuOyAgICAgICAgLyppZSBsZW5ndGggYXMgcGVyIHNwZWMgKi8KKwl1aW50MTZfdCBpZUJ1ZmZlcmxlbmd0aDsKKwl1aW50OF90ICpwSUVCdWZmZXI7CisKK30gdFNpck1vZGlmeUlFLCAqdHBTaXJNb2RpZnlJRTsKKworLyogTWVzc2FnZSBmb3JtYXQgZm9yIFVwZGF0ZSBJRSBtZXNzYWdlIHNlbnQgdG8gUEUgICovCit0eXBlZGVmIHN0cnVjdCBzU2lyTW9kaWZ5SUVzSW5kIHsKKwl1aW50MTZfdCBtc2dUeXBlOworCXVpbnQxNl90IG1zZ0xlbjsKKwl0U2lyTW9kaWZ5SUUgbW9kaWZ5SUU7CisJZVVwZGF0ZUlFc1R5cGUgdXBkYXRlVHlwZTsKK30gdFNpck1vZGlmeUlFc0luZCwgKnRwU2lyTW9kaWZ5SUVzSW5kOworCisvKiBNZXNzYWdlIGZvcm1hdCBmb3IgVXBkYXRlIElFIG1lc3NhZ2Ugc2VudCB0byBQRSAgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJVcGRhdGVJRSB7CisJdFNpck1hY0FkZHIgYnNzaWQ7CisJdWludDE2X3Qgc21lU2Vzc2lvbklkOworCWJvb2wgYXBwZW5kOworCWJvb2wgbm90aWZ5OworCXVpbnQxNl90IGllQnVmZmVybGVuZ3RoOworCXVpbnQ4X3QgKnBBZGRpdGlvbklFQnVmZmVyOworfSB0U2lyVXBkYXRlSUUsICp0cFNpclVwZGF0ZUlFOworCisvKiBNZXNzYWdlIGZvcm1hdCBmb3IgVXBkYXRlIElFIG1lc3NhZ2Ugc2VudCB0byBQRSAgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJVcGRhdGVJRXNJbmQgeworCXVpbnQxNl90IG1zZ1R5cGU7CisJdWludDE2X3QgbXNnTGVuOworCXRTaXJVcGRhdGVJRSB1cGRhdGVJRTsKKwllVXBkYXRlSUVzVHlwZSB1cGRhdGVUeXBlOworfSB0U2lyVXBkYXRlSUVzSW5kLCAqdHBTaXJVcGRhdGVJRXNJbmQ7CisKKy8qIE1lc3NhZ2UgZm9ybWF0IGZvciByZXF1ZXN0aW5nIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCB0byBsb3dlciBsYXllcnMgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJEZnNDc2FJZVJlcXVlc3QgeworCXVpbnQxNl90IG1zZ1R5cGU7CisJdWludDE2X3QgbXNnTGVuOworCXVpbnQ4X3QgdGFyZ2V0Q2hhbm5lbDsKKwl1aW50OF90IGNzYUllUmVxdWlyZWQ7CisJdWludDhfdCBic3NpZFtDREZfTUFDX0FERFJfU0laRV07CisJdWludDhfdCBjaF9iYW5kd2lkdGg7Cit9IHRTaXJEZnNDc2FJZVJlcXVlc3QsICp0cFNpckRmc0NzYUllUmVxdWVzdDsKKworLyogSW5kaWNhdGlvbiBmcm9tIGxvd2VyIGxheWVyIGluZGljYXRpbmcgdGhlIGNvbXBsZXRpb24gb2YgZmlyc3QgYmVhY29uIHNlbmQKKyAqIGFmdGVyIHRoZSBiZWFjb24gdGVtcGxhdGUgdXBkYXRlCisgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJGaXJzdEJlYWNvblR4Q29tcGxldGVJbmQgeworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOyAgIC8qIGVXTklfU01FX01JU1NFRF9CRUFDT05fSU5EICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3QgYnNzSWR4OworfSB0U2lyRmlyc3RCZWFjb25UeENvbXBsZXRlSW5kLCAqdHBTaXJGaXJzdEJlYWNvblR4Q29tcGxldGVJbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVDU0FJZVR4Q29tcGxldGVSc3AgeworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXVpbnQ4X3QgY2hhblN3SWVUeFN0YXR1czsKK30gdFNpclNtZUNTQUllVHhDb21wbGV0ZVJzcCwgKnRwU2lyU21lQ1NBSWVUeENvbXBsZXRlUnNwOworCisvKiBUaGVybWFsIE1pdGlnYXRpb24qLworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgbWluVGVtcFRocmVzaG9sZDsKKwl1aW50MTZfdCBtYXhUZW1wVGhyZXNob2xkOworfSB0X3RoZXJtYWxfbGV2ZWxfaW5mbywgKnRwX3RoZXJtYWxfbGV2ZWxfaW5mbzsKKwordHlwZWRlZiBlbnVtIHsKKwlXTEFOX1dNQV9USEVSTUFMX0xFVkVMXzAsCisJV0xBTl9XTUFfVEhFUk1BTF9MRVZFTF8xLAorCVdMQU5fV01BX1RIRVJNQUxfTEVWRUxfMiwKKwlXTEFOX1dNQV9USEVSTUFMX0xFVkVMXzMsCisJV0xBTl9XTUFfTUFYX1RIRVJNQUxfTEVWRUxTCit9IHRfdGhlcm1hbF9sZXZlbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIEFycmF5IG9mIHRoZXJtYWwgbGV2ZWxzICovCisJdF90aGVybWFsX2xldmVsX2luZm8gdGhlcm1hbExldmVsc1tXTEFOX1dNQV9NQVhfVEhFUk1BTF9MRVZFTFNdOworCXVpbnQ4X3QgdGhlcm1hbEN1cnJMZXZlbDsKKwl1aW50OF90IHRoZXJtYWxNZ210RW5hYmxlZDsKKwl1aW50MzJfdCB0aHJvdHRsZVBlcmlvZDsKK30gdF90aGVybWFsX21nbXQsICp0cF90aGVybWFsX21nbXQ7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJUeFBvd2VyTGltaXQgeworCS8qIFRoZXJtYWwgbGltaXRzIGZvciAyZyBhbmQgNWcgKi8KKwl1aW50MzJfdCB0eFBvd2VyMmc7CisJdWludDMyX3QgdHhQb3dlcjVnOworfSB0U2lyVHhQb3dlckxpbWl0OworCisvKiBub3RpZnkgTU9ERU0gcG93ZXIgc3RhdGUgdG8gRlcgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBwYXJhbTsKK30gdFNpck1vZGVtUG93ZXJTdGF0ZUluZCwgKnRwU2lyTW9kZW1Qb3dlclN0YXRlSW5kOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1NUQVRTX0VYVAordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3QgZXZlbnRfZGF0YV9sZW47CisJdWludDhfdCBldmVudF9kYXRhW107Cit9IHRTaXJTdGF0c0V4dEV2ZW50LCAqdHBTaXJTdGF0c0V4dEV2ZW50OworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkFOCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgZXZlbnRfZGF0YV9sZW47CisJdWludDhfdCBldmVudF9kYXRhW107Cit9IHRTaXJOYW5FdmVudCwgKnRwU2lyTmFuRXZlbnQ7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECit0eXBlZGVmIHN0cnVjdCBzU2lyU21lUm9hbU9mZmxvYWRTeW5jaEluZCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyplV05JX1NNRV9ST0FNX09GRkxPQURfU1lOQ0hfSU5EICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQxNl90IGJlYWNvblByb2JlUmVzcE9mZnNldDsKKwl1aW50MTZfdCBiZWFjb25Qcm9iZVJlc3BMZW5ndGg7CisJdWludDE2X3QgcmVhc3NvY1Jlc3BPZmZzZXQ7CisJdWludDE2X3QgcmVhc3NvY1Jlc3BMZW5ndGg7CisJdWludDhfdCBpc0JlYWNvbjsKKwl1aW50OF90IHJvYW1lZFZkZXZJZDsKKwl0U2lyTWFjQWRkciBic3NJZDsKKwlpbnQ4X3QgdHhNZ210UG93ZXI7CisJdWludDMyX3QgYXV0aFN0YXR1czsKKwl1aW50OF90IHJzc2k7CisJdWludDhfdCByb2FtUmVhc29uOworCXVpbnQzMl90IGNoYW5fZnJlcTsKKwl1aW50OF90IGtja1tTSVJfS0NLX0tFWV9MRU5dOworCXVpbnQ4X3Qga2VrW1NJUl9LRUtfS0VZX0xFTl07CisJdWludDhfdCByZXBsYXlfY3RyW1NJUl9SRVBMQVlfQ1RSX0xFTl07CisJdHBTaXJCc3NEZXNjcmlwdGlvbiAgYnNzX2Rlc2NfcHRyOworfSByb2FtX29mZmxvYWRfc3luY2hfaW5kOworCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lUm9hbU9mZmxvYWRTeW5jaENuZiB7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRTaXJTbWVSb2FtT2ZmbG9hZFN5bmNoQ25mLCAqdHBTaXJTbWVSb2FtT2ZmbG9hZFN5bmNoQ25mOworCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lSE9GYWlsdXJlSW5kIHsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdFNpclNtZUhPRmFpbHVyZUluZCwgKnRwU2lyU21lSE9GYWlsdXJlSW5kOworCitzdHJ1Y3Qgcm9hbV9vZmZsb2FkX3N5bmNoX2ZhaWwgeworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsKK307CisKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKworLyoqCisgKiB0eXBlZGVmIGVudW0gd2lmaV9zY2FuX2ZsYWdzIC0gd2lmaSBzY2FuIGZsYWdzCisgKiBAV0lGSV9TQ0FOX0ZMQUdfSU5URVJSVVBURUQ6IEluZGljYXRlcyB0aGF0IHNjYW4gcmVzdWx0cyBhcmUgbm90IGNvbXBsZXRlCisgKgkJCQliZWNhdXNlIHByb2JlcyB3ZXJlIG5vdCBzZW50IG9uIHNvbWUgY2hhbm5lbHMKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlXSUZJX1NDQU5fRkxBR19JTlRFUlJVUFRFRCA9IDEsCit9IHdpZmlfc2Nhbl9mbGFnczsKKwordHlwZWRlZiBlbnVtIHsKKwlXSUZJX0JBTkRfVU5TUEVDSUZJRUQsCisJV0lGSV9CQU5EX0JHID0gMSwgICAgICAgLyogMi40IEdIeiAqLworCVdJRklfQkFORF9BID0gMiwgICAgICAgIC8qIDUgR0h6IHdpdGhvdXQgREZTICovCisJV0lGSV9CQU5EX0FCRyA9IDMsICAgICAgLyogMi40IEdIeiArIDUgR0h6OyBubyBERlMgKi8KKwlXSUZJX0JBTkRfQV9ERlNfT05MWSA9IDQsICAgICAgIC8qIDUgR0h6IERGUyBvbmx5ICovCisJLyogNSBpcyByZXNlcnZlZCAqLworCVdJRklfQkFORF9BX1dJVEhfREZTID0gNiwgICAgICAgLyogNSBHSHogd2l0aCBERlMgKi8KKwlXSUZJX0JBTkRfQUJHX1dJVEhfREZTID0gNywgICAgIC8qIDIuNCBHSHogKyA1IEdIeiB3aXRoIERGUyAqLworCisJLyogS2VlcCBpdCBsYXN0ICovCisJV0lGSV9CQU5EX01BWAorfSB0V2lmaUJhbmQ7CisKKy8qIHdpZmkgc2NhbiByZWxhdGVkIGV2ZW50cyAqLwordHlwZWRlZiBlbnVtIHsKKwlXSUZJX1NDQU5fQlVGRkVSX0ZVTEwsCisJV0lGSV9TQ0FOX0NPTVBMRVRFLAorfSB0V2lmaVNjYW5FdmVudFR5cGU7CisKKy8qKgorICogZW51bSBleHRzY2FuX2NvbmZpZ3VyYXRpb25fZmxhZ3MgLSBleHRzY2FuIGNvbmZpZyBmbGFncworICogQEVYVFNDQU5fTFBfRVhURU5ERURfQkFUQ0hJTkc6IGV4dGVuZGVkIGJhdGNoaW5nCisgKi8KK2VudW0gZXh0c2Nhbl9jb25maWd1cmF0aW9uX2ZsYWdzIHsKKwlFWFRTQ0FOX0xQX0VYVEVOREVEX0JBVENISU5HID0gMHgwMDAwMDAwMSwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkOworCisJLyogTG93IHRocmVzaG9sZCAqLworCWludDMyX3QgbG93OworCisJLyogSGlnaCB0aHJlc2hvbGQgKi8KKwlpbnQzMl90IGhpZ2g7Cit9IHRTaXJBUFRocmVzaG9sZFBhcmFtLCAqdHBTaXJBUFRocmVzaG9sZFBhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgcmVxdWVzdElkOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworfSB0U2lyR2V0RXh0U2NhbkNhcGFiaWxpdGllc1JlcVBhcmFtcywgKnRwU2lyR2V0RXh0U2NhbkNhcGFiaWxpdGllc1JlcVBhcmFtczsKKworLyoqCisgKiBzdHJ1Y3QgZXh0X3NjYW5fY2FwYWJpbGl0aWVzX3Jlc3BvbnNlIC0gZXh0c2NhbiBjYXBhYmlsaXRpZXMgcmVzcG9uc2UgZGF0YQorICogQHJlcXVlc3RJZDogcmVxdWVzdCBpZGVudGlmaWVyCisgKiBAc3RhdHVzOiAgICBzdGF0dXMKKyAqIEBtYXhfc2Nhbl9jYWNoZV9zaXplOiB0b3RhbCBzcGFjZSBhbGxvY2F0ZWQgZm9yIHNjYW4gKGluIGJ5dGVzKQorICogQG1heF9zY2FuX2J1Y2tldHM6IG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWwgYnVja2V0cworICogQG1heF9hcF9jYWNoZV9wZXJfc2NhbjogbWF4aW11bSBudW1iZXIgb2YgQVBzIHRoYXQgY2FuIGJlIHN0b3JlZCBwZXIgc2NhbgorICogQG1heF9yc3NpX3NhbXBsZV9zaXplOiBudW1iZXIgb2YgUlNTSSBzYW1wbGVzIHVzZWQgZm9yIGF2ZXJhZ2luZyBSU1NJCisgKiBAYXhfc2Nhbl9yZXBvcnRpbmdfdGhyZXNob2xkOiBtYXggcG9zc2libGUgcmVwb3J0X3RocmVzaG9sZAorICogQG1heF9ob3RsaXN0X2Jzc2lkczogbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBmb3IgaG90bGlzdCBBUHMKKyAqIEBtYXhfc2lnbmlmaWNhbnRfd2lmaV9jaGFuZ2VfYXBzOiBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGZvcgorICoJCQkJc2lnbmlmaWNhbnQgd2lmaSBjaGFuZ2UgQVBzCisgKiBAbWF4X2Jzc2lkX2hpc3RvcnlfZW50cmllczogbnVtYmVyIG9mIEJTU0lEL1JTU0kgZW50cmllcyB0aGF0IGRldmljZSBjYW4gaG9sZAorICogQG1heF9ob3RsaXN0X3NzaWRzOiBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGZvciBob3RsaXN0IFNTSURzCisgKiBAbWF4X251bWJlcl9lcG5vX25ldHdvcmtzOiBtYXggbnVtYmVyIG9mIGVwbm8gZW50cmllcworICogQG1heF9udW1iZXJfZXBub19uZXR3b3Jrc19ieV9zc2lkOiBtYXggbnVtYmVyIG9mIGVwbm8gZW50cmllcworICoJCQlpZiBzc2lkIGlzIHNwZWNpZmllZCwgdGhhdCBpcywgZXBubyBlbnRyaWVzIGZvcgorICoJCQl3aGljaCBhbiBleGFjdCBtYXRjaCBpcyByZXF1aXJlZCwKKyAqCQkJb3IgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIGhpZGRlbiBzc2lkcworICogQG1heF9udW1iZXJfb2Zfd2hpdGVfbGlzdGVkX3NzaWQ6IG1heCBudW1iZXIgb2Ygd2hpdGUgbGlzdGVkIFNTSURzCisgKi8KK3N0cnVjdCBleHRfc2Nhbl9jYXBhYmlsaXRpZXNfcmVzcG9uc2UgeworCXVpbnQzMl90IHJlcXVlc3RJZDsKKwl1aW50MzJfdCBzdGF0dXM7CisKKwl1aW50MzJfdCBtYXhfc2Nhbl9jYWNoZV9zaXplOworCXVpbnQzMl90IG1heF9zY2FuX2J1Y2tldHM7CisJdWludDMyX3QgbWF4X2FwX2NhY2hlX3Blcl9zY2FuOworCXVpbnQzMl90IG1heF9yc3NpX3NhbXBsZV9zaXplOworCXVpbnQzMl90IG1heF9zY2FuX3JlcG9ydGluZ190aHJlc2hvbGQ7CisKKwl1aW50MzJfdCBtYXhfaG90bGlzdF9ic3NpZHM7CisJdWludDMyX3QgbWF4X3NpZ25pZmljYW50X3dpZmlfY2hhbmdlX2FwczsKKworCXVpbnQzMl90IG1heF9ic3NpZF9oaXN0b3J5X2VudHJpZXM7CisJdWludDMyX3QgbWF4X2hvdGxpc3Rfc3NpZHM7CisJdWludDMyX3QgbWF4X251bWJlcl9lcG5vX25ldHdvcmtzOworCXVpbnQzMl90IG1heF9udW1iZXJfZXBub19uZXR3b3Jrc19ieV9zc2lkOworCXVpbnQzMl90IG1heF9udW1iZXJfb2Zfd2hpdGVfbGlzdGVkX3NzaWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgcmVxdWVzdElkOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCisJLyoKKwkgKiAxIC0gcmV0dXJuIGNhY2hlZCByZXN1bHRzIGFuZCBmbHVzaCBpdAorCSAqIDAgLSByZXR1cm4gY2FjaGVkIHJlc3VsdHMgYW5kIGRvIG5vdCBmbHVzaAorCSAqLworCWJvb2wgZmx1c2g7Cit9IHRTaXJFeHRTY2FuR2V0Q2FjaGVkUmVzdWx0c1JlcVBhcmFtcywgKnRwU2lyRXh0U2NhbkdldENhY2hlZFJlc3VsdHNSZXFQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCByZXF1ZXN0SWQ7CisJdWludDMyX3Qgc3RhdHVzOworfSB0U2lyRXh0U2NhbkdldENhY2hlZFJlc3VsdHNSc3BQYXJhbXMsICp0cFNpckV4dFNjYW5HZXRDYWNoZWRSZXN1bHRzUnNwUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogVGltZSBvZiBkaXNjb3ZlcnkgKi8KKwl1aW50NjRfdCB0czsKKworCS8qIE51bGwgdGVybWluYXRlZCBTU0lEICovCisJdWludDhfdCBzc2lkW1NJUl9NQUNfTUFYX1NTSURfTEVOR1RIICsgMV07CisKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkOworCisJLyogRnJlcXVlbmN5IGluIE1IeiAqLworCXVpbnQzMl90IGNoYW5uZWw7CisKKwkvKiBSU1NJIGluIGRCbSAqLworCWludDMyX3QgcnNzaTsKKworCS8qIFJUVCBpbiBuYW5vc2Vjb25kcyAqLworCXVpbnQzMl90IHJ0dDsKKworCS8qIFN0YW5kYXJkIGRldmlhdGlvbiBpbiBydHQgKi8KKwl1aW50MzJfdCBydHRfc2Q7CisKKwkvKiBQZXJpb2QgYWR2ZXJ0aXNlZCBpbiB0aGUgYmVhY29uICovCisJdWludDE2X3QgYmVhY29uUGVyaW9kOworCisJLyogQ2FwYWJpbGl0aWVzIGFkdmVydGlzZWQgaW4gdGhlIGJlYWNvbiAqLworCXVpbnQxNl90IGNhcGFiaWxpdHk7CisKKwl1aW50MTZfdCBpZUxlbmd0aDsKKworCXVpbnQ4X3QgaWVEYXRhW107Cit9IHRTaXJXaWZpU2NhblJlc3VsdCwgKnRwU2lyV2lmaVNjYW5SZXN1bHQ7CisKKy8qKgorICogc3RydWN0IGV4dHNjYW5faG90bGlzdF9tYXRjaCAtIGV4dHNjYW4gaG90bGlzdCBtYXRjaAorICogQHJlcXVlc3RJZDogcmVxdWVzdCBpZGVudGlmaWVyCisgKiBAbnVtT2ZBcHM6IG51bWJlciBvZiBic3NpZHMgcmV0cmlldmVkIGJ5IHRoZSBzY2FuCisgKiBAbW9yZURhdGE6IDAgLSBmb3IgbGFzdCBmcmFnbWVudAorICoJICAgICAgMSAtIHN0aWxsIG1vcmUgZnJhZ21lbnQocykgY29taW5nCisgKiBAYXA6IHdpZmkgc2NhbiByZXN1bHQKKyAqLworc3RydWN0IGV4dHNjYW5faG90bGlzdF9tYXRjaCB7CisJdWludDMyX3QgICAgcmVxdWVzdElkOworCWJvb2wgICAgICAgIG1vcmVEYXRhOworCWJvb2wgICAgICAgIGFwX2ZvdW5kOworCXVpbnQzMl90ICAgIG51bU9mQXBzOworCXRTaXJXaWZpU2NhblJlc3VsdCAgIGFwW107Cit9OworCisvKioKKyAqIHN0cnVjdCBleHRzY2FuX2NhY2hlZF9zY2FuX3Jlc3VsdCAtIGV4dHNjYW4gY2FjaGVkIHNjYW4gcmVzdWx0CisgKiBAc2Nhbl9pZDogYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjYW4gdW5pdAorICogQGZsYWdzOiBhIGJpdG1hc2sgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHNjYW4KKyAqIEBudW1fcmVzdWx0czogbnVtYmVyIG9mIGJzc2lkcyByZXRyaWV2ZWQgYnkgdGhlIHNjYW4KKyAqIEBhcDogd2lmaSBzY2FuIGJzc2lkIHJlc3VsdHMgaW5mbworICovCitzdHJ1Y3QgZXh0c2Nhbl9jYWNoZWRfc2Nhbl9yZXN1bHQgeworCXVpbnQzMl90ICAgIHNjYW5faWQ7CisJdWludDMyX3QgICAgZmxhZ3M7CisJdWludDMyX3QgICAgbnVtX3Jlc3VsdHM7CisJdFNpcldpZmlTY2FuUmVzdWx0ICphcDsKK307CisKKy8qKgorICogc3RydWN0IHRTaXJXaWZpU2NhblJlc3VsdEV2ZW50IC0gd2lmaSBzY2FuIHJlc3VsdCBldmVudAorICogQHJlcXVlc3RJZDogcmVxdWVzdCBpZGVudGlmaWVyCisgKiBAYXBfZm91bmQ6IGZsYWcgdG8gaW5kaWNhdGUgYXAgZm91bmQgb3Igbm90CisgKgkJdHJ1ZTogQVAgd2FzIGZvdW5kCisgKgkJZmFsc2U6IEFQIHdhcyBsb3N0CisgKiBAbnVtT2ZBcHM6IG51bWJlciBvZiBhcHMKKyAqIEBtb3JlRGF0YTogbW9yZSBkYXRhCisgKiBAYXA6IGJzc2lkIGluZm9ybWF0aW9uCisgKgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgICAgIHJlcXVlc3RJZDsKKwlib29sICAgICAgICAgYXBfZm91bmQ7CisJdWludDMyX3QgICAgIG51bU9mQXBzOworCWJvb2wgICAgICAgICBtb3JlRGF0YTsKKwl0U2lyV2lmaVNjYW5SZXN1bHQgICBhcFtdOworfSB0U2lyV2lmaVNjYW5SZXN1bHRFdmVudCwgKnRwU2lyV2lmaVNjYW5SZXN1bHRFdmVudDsKKworLyoqCisgKiBzdHJ1Y3QgZXh0c2Nhbl9jYWNoZWRfc2Nhbl9yZXN1bHRzIC0gZXh0c2NhbiBjYWNoZWQgc2NhbiByZXN1bHRzCisgKiBAcmVxdWVzdF9pZDogcmVxdWVzdCBpZGVudGlmaWVyCisgKiBAbW9yZV9kYXRhOiAwIC0gZm9yIGxhc3QgZnJhZ21lbnQKKyAqCSAgICAgICAxIC0gc3RpbGwgbW9yZSBmcmFnbWVudChzKSBjb21pbmcKKyAqIEBudW1fc2Nhbl9pZHM6IG51bWJlciBvZiBzY2FuIGlkcworICogQHJlc3VsdDogd2lmaSBzY2FuIHJlc3VsdAorICovCitzdHJ1Y3QgZXh0c2Nhbl9jYWNoZWRfc2Nhbl9yZXN1bHRzIHsKKwl1aW50MzJfdCAgICByZXF1ZXN0X2lkOworCWJvb2wgICAgICAgIG1vcmVfZGF0YTsKKwl1aW50MzJfdCAgICBudW1fc2Nhbl9pZHM7CisJc3RydWN0IGV4dHNjYW5fY2FjaGVkX3NjYW5fcmVzdWx0ICAqcmVzdWx0OworfTsKKworCisvKioKKyAqIHN0cnVjdCB0U2lyV2lmaUZ1bGxTY2FuUmVzdWx0RXZlbnQgLSBleHRzY2FuIGZ1bGwgc2NhbiBldmVudAorICogQHJlcXVlc3RfaWQ6IHJlcXVlc3QgaWRlbnRpZmllcgorICogQG1vcmVEYXRhOiAwIC0gZm9yIGxhc3QgZnJhZ21lbnQKKyAqICAgICAgICAgICAgIDEgLSBzdGlsbCBtb3JlIGZyYWdtZW50KHMpIGNvbWluZworICogQGFwOiBic3NpZCBpbmZvCisgKgorICogUmVwb3J0ZWQgd2hlbiBlYWNoIHByb2JlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLCBpZiByZXBvcnRFdmVudHMKKyAqIGVuYWJsZWQgaW4gdFNpcldpZmlTY2FuQ21kUmVxUGFyYW1zCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCAgICAgICAgICAgIHJlcXVlc3RJZDsKKwlib29sICAgICAgICAgICAgICAgIG1vcmVEYXRhOworCXRTaXJXaWZpU2NhblJlc3VsdCAgYXA7Cit9IHRTaXJXaWZpRnVsbFNjYW5SZXN1bHRFdmVudCwgKnRwU2lyV2lmaUZ1bGxTY2FuUmVzdWx0RXZlbnQ7CisKKy8qKgorICogc3RydWN0IHBub19tYXRjaF9mb3VuZCAtIGVwbm8gbWF0Y2ggZm91bmQKKyAqIEByZXF1ZXN0X2lkOiByZXF1ZXN0IGlkZW50aWZpZXIKKyAqIEBtb3JlRGF0YTogMCAtIGZvciBsYXN0IGZyYWdtZW50CisgICAgICogMSAtIHN0aWxsIG1vcmUgZnJhZ21lbnQocykgY29taW5nCisgKiBAbnVtX3Jlc3VsdHM6IG51bWJlciBvZiBic3NpZHMsIGRyaXZlciBzZW5kcyB0aGlzIGV2ZW50IHRvIHVwcGVyIGxheWVyCisgKgkJIGZvciBldmVyeSBiZWFjb24sIGhlbmNlICVudW1fcmVzdWx0cyBpcyBhbHdheXMgc2V0IHRvIDEuCisgKiBAYXA6IGJzc2lkIGluZm8KKyAqCisgKiBSZXBvcnRlZCB3aGVuIGVhY2ggYmVhY29uIHByb2JlIHJlc3BvbnNlIGlzIHJlY2VpdmVkIHdpdGgKKyAqIGVwbm8gbWF0Y2ggZm91bmQgdGFnLgorICAgICAqLworc3RydWN0IHBub19tYXRjaF9mb3VuZCB7CisJdWludDMyX3QgICAgICAgICAgICByZXF1ZXN0X2lkOworCWJvb2wgICAgICAgICAgICAgICAgbW9yZV9kYXRhOworCXVpbnQzMl90ICAgICAgICAgICAgbnVtX3Jlc3VsdHM7CisJdFNpcldpZmlTY2FuUmVzdWx0ICBhcFtdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIEZyZXF1ZW5jeSBpbiBNSHogKi8KKwl1aW50MzJfdCBjaGFubmVsOworCisJdWludDMyX3QgZHdlbGxUaW1lTXM7CisKKwkvKiAwID0+IGFjdGl2ZQorCSAgIDEgPT4gcGFzc2l2ZSBzY2FuOyBpZ25vcmVkIGZvciBERlMgKi8KKwlib29sIHBhc3NpdmU7CisKKwl1aW50OF90IGNobmxDbGFzczsKK30gdFNpcldpZmlTY2FuQ2hhbm5lbFNwZWMsICp0cFNpcldpZmlTY2FuQ2hhbm5lbFNwZWM7CisKKy8qKgorICogc3RydWN0IHRTaXJXaWZpU2NhbkJ1Y2tldFNwZWMgLSB3aWZpIHNjYW4gYnVja2V0IHNwZWMKKyAqIEBidWNrZXQ6IGJ1Y2tldCBpZGVudGlmaWVyCisgKiBAYmFuZDogd2lmaSBiYW5kCisgKiBAcGVyaW9kOiBEZXNpcmVkIHBlcmlvZCwgaW4gbWlsbGlzZWNvbmQ7IGlmIHRoaXMgaXMgdG9vCisgKgkJbG93LCB0aGUgZmlybXdhcmUgc2hvdWxkIGNob29zZSB0byBnZW5lcmF0ZSByZXN1bHRzIGFzIGZhc3QgYXMKKyAqCQlpdCBjYW4gaW5zdGVhZCBvZiBmYWlsaW5nIHRoZSBjb21tYW5kIGJ5dGUKKyAqCQlmb3IgZXhwb25lbnRpYWwgYmFja29mZiBidWNrZXQgdGhpcyBpcyB0aGUgbWluX3BlcmlvZAorICogQHJlcG9ydEV2ZW50czogMCA9PiBub3JtYWwgcmVwb3J0aW5nIChyZXBvcnRpbmcgcnNzaSBoaXN0b3J5CisgKgkJb25seSwgd2hlbiByc3NpIGhpc3RvcnkgYnVmZmVyIGlzICUgZnVsbCkKKyAqCQkxID0+IHNhbWUgYXMgMCArIHJlcG9ydCBhIHNjYW4gY29tcGxldGlvbiBldmVudCBhZnRlciBzY2FubmluZworICoJCXRoaXMgYnVja2V0CisgKgkJMiA9PiBzYW1lIGFzIDEgKyBmb3J3YXJkIHNjYW4gcmVzdWx0cworICoJCShiZWFjb25zL3Byb2JlIHJlc3BvbnNlcyArIElFcykgaW4gcmVhbCB0aW1lIHRvIEhBTAorICogQG1heF9wZXJpb2Q6IGlmIG1heF9wZXJpb2QgaXMgbm9uIHplcm8gb3IgZGlmZmVyZW50IHRoYW4gcGVyaW9kLAorICoJCXRoZW4gdGhpcyBidWNrZXQgaXMgYW4gZXhwb25lbnRpYWwgYmFja29mZiBidWNrZXQgYW5kCisgKgkJdGhlIHNjYW4gcGVyaW9kIHdpbGwgZ3JvdyBleHBvbmVudGlhbGx5IGFzIHBlciBmb3JtdWxhOgorICoJCWFjdHVhbF9wZXJpb2QoTikgPSBwZXJpb2QgXiAoTi8oc3RlcF9jb3VudCsxKSkgdG8gYQorICoJCW1heGltdW0gcGVyaW9kIG9mIG1heF9wZXJpb2QKKyAqIEBleHBvbmVudDogZm9yIGV4cG9uZW50aWFsIGJhY2sgb2ZmIGJ1Y2tldDogbXVsdGlwbGllcjoKKyAqCQluZXdfcGVyaW9kID0gb2xkX3BlcmlvZCAqIGV4cG9uZW50CisgKiBAc3RlcF9jb3VudDogZm9yIGV4cG9uZW50aWFsIGJhY2sgb2ZmIGJ1Y2tldCwgbnVtYmVyIG9mIHNjYW5zIHBlcmZvcm1lZAorICoJCWF0IGEgZ2l2ZW4gcGVyaW9kIGFuZCB1bnRpbCB0aGUgZXhwb25lbnQgaXMgYXBwbGllZAorICogQG51bUNoYW5uZWxzOiBjaGFubmVscyB0byBzY2FuOyB0aGVzZSBtYXkgaW5jbHVkZSBERlMgY2hhbm5lbHMKKyAqCQlOb3RlIHRoYXQgYSBnaXZlbiBjaGFubmVsIG1heSBhcHBlYXIgaW4gbXVsdGlwbGUgYnVja2V0cworICogQG1pbl9kd2VsbF90aW1lX2FjdGl2ZTogcGVyIGJ1Y2tldCBtaW5pbXVtIGFjdGl2ZSBkd2VsbCB0aW1lCisgKiBAbWF4X2R3ZWxsX3RpbWVfYWN0aXZlOiBwZXIgYnVja2V0IG1heGltdW0gYWN0aXZlIGR3ZWxsIHRpbWUKKyAqIEBtaW5fZHdlbGxfdGltZV9wYXNzaXZlOiBwZXIgYnVja2V0IG1pbmltdW0gcGFzc2l2ZSBkd2VsbCB0aW1lCisgKiBAbWF4X2R3ZWxsX3RpbWVfcGFzc2l2ZTogcGVyIGJ1Y2tldCBtYXhpbXVtIHBhc3NpdmUgZHdlbGwgdGltZQorICogQGNoYW5uZWxzOiBDaGFubmVsIGxpc3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgICAgICAgICBidWNrZXQ7CisJdFdpZmlCYW5kICAgICAgIGJhbmQ7CisJdWludDMyX3QgICAgICAgIHBlcmlvZDsKKwl1aW50MzJfdCAgICAgICAgcmVwb3J0RXZlbnRzOworCXVpbnQzMl90ICAgICAgICBtYXhfcGVyaW9kOworCXVpbnQzMl90ICAgICAgICBleHBvbmVudDsKKwl1aW50MzJfdCAgICAgICAgc3RlcF9jb3VudDsKKwl1aW50MzJfdCAgICAgICAgbnVtQ2hhbm5lbHM7CisKKwl1aW50MzJfdCAgICAgICAgbWluX2R3ZWxsX3RpbWVfYWN0aXZlOworCXVpbnQzMl90ICAgICAgICBtYXhfZHdlbGxfdGltZV9hY3RpdmU7CisJdWludDMyX3QgICAgICAgIG1pbl9kd2VsbF90aW1lX3Bhc3NpdmU7CisJdWludDMyX3QgICAgICAgIG1heF9kd2VsbF90aW1lX3Bhc3NpdmU7CisJdFNpcldpZmlTY2FuQ2hhbm5lbFNwZWMgY2hhbm5lbHNbV0xBTl9FWFRTQ0FOX01BWF9DSEFOTkVMU107Cit9IHRTaXJXaWZpU2NhbkJ1Y2tldFNwZWMsICp0cFNpcldpZmlTY2FuQnVja2V0U3BlYzsKKworLyoqCisgKiBzdHJ1Y3QgdFNpcldpZmlTY2FuQ21kUmVxUGFyYW1zIC0gd2lmaSBzY2FuIGNvbW1hbmQgcmVxdWVzdCBwYXJhbXMKKyAqIEBiYXNlUGVyaW9kOiBiYXNlIHRpbWVyIHBlcmlvZAorICogQG1heEFQcGVyU2NhbjogbWF4IGFwIHBlciBzY2FuCisgKiBAcmVwb3J0X3RocmVzaG9sZF9wZXJjZW50OiByZXBvcnQgdGhyZXNob2xkCisgKglpbiAlLCB3aGVuIGJ1ZmZlciBpcyB0aGlzIG11Y2ggZnVsbCwgd2FrZSB1cCBob3N0CisgKiBAcmVwb3J0X3RocmVzaG9sZF9udW1fc2NhbnM6IHJlcG9ydCB0aHJlc2hvbGQgbnVtYmVyIG9mIHNjYW5zCisgKglpbiBudW1iZXIgb2Ygc2NhbnMsIHdha2UgdXAgaG9zdCBhZnRlciB0aGVzZSBtYW55IHNjYW5zCisgKiBAcmVxdWVzdElkOiByZXF1ZXN0IGlkCisgKiBAc2Vzc2lvbklkOiBzZXNzaW9uIGlkCisgKiBAbnVtQnVja2V0czogbnVtYmVyIG9mIGJ1Y2tldHMKKyAqIEBtaW5fZHdlbGxfdGltZV9hY3RpdmU6IHBlciBidWNrZXQgbWluaW11bSBhY3RpdmUgZHdlbGwgdGltZQorICogQG1heF9kd2VsbF90aW1lX2FjdGl2ZTogcGVyIGJ1Y2tldCBtYXhpbXVtIGFjdGl2ZSBkd2VsbCB0aW1lCisgKiBAbWluX2R3ZWxsX3RpbWVfcGFzc2l2ZTogcGVyIGJ1Y2tldCBtaW5pbXVtIHBhc3NpdmUgZHdlbGwgdGltZQorICogQG1heF9kd2VsbF90aW1lX3Bhc3NpdmU6IHBlciBidWNrZXQgbWF4aW11bSBwYXNzaXZlIGR3ZWxsIHRpbWUKKyAqIEBjb25maWd1cmF0aW9uX2ZsYWdzOiBjb25maWd1cmF0aW9uIGZsYWdzCisgKiBAYnVja2V0czogYnVja2V0cyBhcnJheQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgYmFzZVBlcmlvZDsKKwl1aW50MzJfdCBtYXhBUHBlclNjYW47CisKKwl1aW50MzJfdCByZXBvcnRfdGhyZXNob2xkX3BlcmNlbnQ7CisJdWludDMyX3QgcmVwb3J0X3RocmVzaG9sZF9udW1fc2NhbnM7CisKKwl1aW50MzJfdCByZXF1ZXN0SWQ7CisJdWludDhfdCAgc2Vzc2lvbklkOworCXVpbnQzMl90IG51bUJ1Y2tldHM7CisKKwl1aW50MzJfdCBtaW5fZHdlbGxfdGltZV9hY3RpdmU7CisJdWludDMyX3QgbWF4X2R3ZWxsX3RpbWVfYWN0aXZlOworCXVpbnQzMl90IG1pbl9kd2VsbF90aW1lX3Bhc3NpdmU7CisJdWludDMyX3QgbWF4X2R3ZWxsX3RpbWVfcGFzc2l2ZTsKKwl1aW50MzJfdCBjb25maWd1cmF0aW9uX2ZsYWdzOworCXRTaXJXaWZpU2NhbkJ1Y2tldFNwZWMgYnVja2V0c1tXTEFOX0VYVFNDQU5fTUFYX0JVQ0tFVFNdOworfSB0U2lyV2lmaVNjYW5DbWRSZXFQYXJhbXMsICp0cFNpcldpZmlTY2FuQ21kUmVxUGFyYW1zOworCisvKioKKyAqIHN0cnVjdCBzaXJfZXh0c2Nhbl9nZW5lcmljX3Jlc3BvbnNlIC0KKyAqCUdlbmVyaWMgRXh0U2NhbiBSZXNwb25zZSBzdHJ1Y3R1cmUKKyAqIEByZXF1ZXN0X2lkOiBJRCBvZiB0aGUgcmVxdWVzdAorICogQHN0YXR1czogb3BlcmF0aW9uIHN0YXR1cyByZXR1cm5lZCBieSBmaXJtd2FyZQorICovCitzdHJ1Y3Qgc2lyX2V4dHNjYW5fZ2VuZXJpY19yZXNwb25zZSB7CisJdWludDMyX3QgcmVxdWVzdF9pZDsKKwl1aW50MzJfdCBzdGF0dXM7Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgcmVxdWVzdElkOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworfSB0U2lyRXh0U2NhblN0b3BSZXFQYXJhbXMsICp0cFNpckV4dFNjYW5TdG9wUmVxUGFyYW1zOworCisvKioKKyAqIHN0cnVjdCB0U2lyRXh0U2NhblNldEJzc2lkSG90TGlzdFJlcVBhcmFtcyAtIHNldCBob3RsaXN0IHJlcXVlc3QKKyAqIEByZXF1ZXN0SWQ6IHJlcXVlc3QgaWRlbnRpZmllcgorICogQHNlc3Npb25JZDogc2Vzc2lvbiBpZGVudGlmaWVyCisgKiBAbG9zdF9hcF9zYW1wbGVfc2l6ZTogbnVtYmVyIG9mIHNhbXBsZXMgdG8gY29uZmlybSBBUCBsb3NzCisgKiBAbnVtQXA6IE51bWJlciBvZiBob3RsaXN0IEFQcworICogQGFwOiBob3RsaXN0IEFQcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgIHJlcXVlc3RJZDsKKwl1aW50OF90ICAgc2Vzc2lvbklkOworCisJdWludDMyX3QgIGxvc3RfYXBfc2FtcGxlX3NpemU7CisJdWludDMyX3QgIG51bUFwOworCXRTaXJBUFRocmVzaG9sZFBhcmFtIGFwW1dMQU5fRVhUU0NBTl9NQVhfSE9UTElTVF9BUFNdOworfSB0U2lyRXh0U2NhblNldEJzc2lkSG90TGlzdFJlcVBhcmFtcywgKnRwU2lyRXh0U2NhblNldEJzc2lkSG90TGlzdFJlcVBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IHJlcXVlc3RJZDsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdFNpckV4dFNjYW5SZXNldEJzc2lkSG90bGlzdFJlcVBhcmFtcywKKyp0cFNpckV4dFNjYW5SZXNldEJzc2lkSG90bGlzdFJlcVBhcmFtczsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX3NzaWRfaG90bGlzdF9wYXJhbSAtIHBhcmFtIGZvciBTU0lEIEhvdGxpc3QKKyAqIEBzc2lkOiBTU0lEIHdoaWNoIGlzIGJlaW5nIGhvdGxpc3RlZAorICogQGJhbmQ6IEJhbmQgaW4gd2hpY2ggdGhlIGdpdmVuIFNTSUQgc2hvdWxkIGJlIHNjYW5uZWQKKyAqIEByc3NpX2xvdzogTG93IGJvdW5kIG9uIFJTU0kKKyAqIEByc3NpX2hpZ2g6IEhpZ2ggYm91bmQgb24gUlNTSQorICovCitzdHJ1Y3Qgc2lyX3NzaWRfaG90bGlzdF9wYXJhbSB7CisJdFNpck1hY1NTaWQgc3NpZDsKKwl1aW50OF90IGJhbmQ7CisJaW50MzJfdCByc3NpX2xvdzsKKwlpbnQzMl90IHJzc2lfaGlnaDsKK307CisKKy8qKgorICogc3RydWN0IHNpcl9zZXRfc3NpZF9ob3RsaXN0X3JlcXVlc3QgLSBzZXQgU1NJRCBob3RsaXN0IHJlcXVlc3Qgc3RydWN0CisgKiBAcmVxdWVzdF9pZDogSUQgb2YgdGhlIHJlcXVlc3QKKyAqIEBzZXNzaW9uX2lkOiBJRCBvZiB0aGUgc2Vzc2lvbgorICogQGxvc3Rfc3NpZF9zYW1wbGVfc2l6ZTogTnVtYmVyIG9mIGNvbnNlY3V0aXZlIHNjYW5zIGluIHdoaWNoIHRoZSBTU0lECisgKgltdXN0IG5vdCBiZSBzZWVuIGluIG9yZGVyIHRvIGNvbnNpZGVyIHRoZSBTU0lEICJsb3N0IgorICogQHNzaWRfY291bnQ6IE51bWJlciBvZiB2YWxpZCBlbnRyaWVzIGluIHRoZSBAc3NpZHMgYXJyYXkKKyAqIEBzc2lkczogQXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBTU0lEcyB0aGF0IGFyZSBpbiB0aGUgaG90bGlzdAorICovCitzdHJ1Y3Qgc2lyX3NldF9zc2lkX2hvdGxpc3RfcmVxdWVzdCB7CisJdWludDMyX3QgcmVxdWVzdF9pZDsKKwl1aW50OF90IHNlc3Npb25faWQ7CisJdWludDMyX3QgbG9zdF9zc2lkX3NhbXBsZV9zaXplOworCXVpbnQzMl90IHNzaWRfY291bnQ7CisJc3RydWN0IHNpcl9zc2lkX2hvdGxpc3RfcGFyYW0gc3NpZHNbV0xBTl9FWFRTQ0FOX01BWF9IT1RMSVNUX1NTSURTXTsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCByZXF1ZXN0SWQ7CisJdWludDhfdCBzZXNzaW9uSWQ7CisKKwkvKiBOdW1iZXIgb2Ygc2FtcGxlcyBmb3IgYXZlcmFnaW5nIFJTU0kgKi8KKwl1aW50MzJfdCByc3NpU2FtcGxlU2l6ZTsKKworCS8qIE51bWJlciBvZiBtaXNzZWQgc2FtcGxlcyB0byBjb25maXJtIEFQIGxvc3MgKi8KKwl1aW50MzJfdCBsb3N0QXBTYW1wbGVTaXplOworCisJLyogTnVtYmVyIG9mIEFQcyBicmVhY2hpbmcgdGhyZXNob2xkIHJlcXVpcmVkIGZvciBmaXJtd2FyZQorCSAqIHRvIGdlbmVyYXRlIGV2ZW50CisJICovCisJdWludDMyX3QgbWluQnJlYWNoaW5nOworCisJdWludDMyX3QgbnVtQXA7CisJdFNpckFQVGhyZXNob2xkUGFyYW0gYXBbV0xBTl9FWFRTQ0FOX01BWF9TSUdOSUZJQ0FOVF9DSEFOR0VfQVBTXTsKK30gdFNpckV4dFNjYW5TZXRTaWdDaGFuZ2VSZXFQYXJhbXMsICp0cFNpckV4dFNjYW5TZXRTaWdDaGFuZ2VSZXFQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkOworCXVpbnQzMl90IGNoYW5uZWw7CisJdWludDMyX3QgbnVtT2ZSc3NpOworCisJLyogUnNzaSBoaXN0b3J5IGluIGRiICovCisJaW50MzJfdCByc3NpW107Cit9IHRTaXJXaWZpU2lnbmlmaWNhbnRDaGFuZ2UsICp0cFNpcldpZmlTaWduaWZpY2FudENoYW5nZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IHJlcXVlc3RJZDsKKworCWJvb2wgbW9yZURhdGE7CisJdWludDMyX3QgbnVtUmVzdWx0czsKKwl0U2lyV2lmaVNpZ25pZmljYW50Q2hhbmdlIGFwW107Cit9IHRTaXJXaWZpU2lnbmlmaWNhbnRDaGFuZ2VFdmVudCwgKnRwU2lyV2lmaVNpZ25pZmljYW50Q2hhbmdlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCByZXF1ZXN0SWQ7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRTaXJFeHRTY2FuUmVzZXRTaWduaWZpY2FudENoYW5nZVJlcVBhcmFtcywKKyp0cFNpckV4dFNjYW5SZXNldFNpZ25pZmljYW50Q2hhbmdlUmVxUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgcmVxdWVzdElkOworCXVpbnQzMl90IG51bVJlc3VsdHNBdmFpbGFibGU7Cit9IHRTaXJFeHRTY2FuUmVzdWx0c0F2YWlsYWJsZUluZFBhcmFtcywgKnRwU2lyRXh0U2NhblJlc3VsdHNBdmFpbGFibGVJbmRQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCByZXF1ZXN0SWQ7CisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQ4X3Qgc2NhbkV2ZW50VHlwZTsKK30gdFNpckV4dFNjYW5PblNjYW5FdmVudEluZFBhcmFtcywgKnRwU2lyRXh0U2Nhbk9uU2NhbkV2ZW50SW5kUGFyYW1zOworCisvKioKKyAqIHN0cnVjdCB3aWZpX2Vwbm9fbmV0d29yayAtIGVuaGFuY2VkIHBubyBuZXR3b3JrIGJsb2NrCisgKiBAc3NpZDogc3NpZAorICogQHJzc2lfdGhyZXNob2xkOiB0aHJlc2hvbGQgZm9yIGNvbnNpZGVyaW5nIHRoaXMgU1NJRCBhcyBmb3VuZCwgcmVxdWlyZWQKKyAqCQkgICAgZ3JhbnVsYXJpdHkgZm9yIHRoaXMgdGhyZXNob2xkIGlzIDRkQm0gdG8gOGRCbQorICogQGZsYWdzOiBXSUZJX1BOT19GTEFHX1hYWAorICogQGF1dGhfYml0X2ZpZWxkOiBhdXRoIGJpdCBmaWVsZCBmb3IgbWF0Y2hpbmcgV1BBIElFCisgKi8KK3N0cnVjdCB3aWZpX2Vwbm9fbmV0d29yayB7CisJdFNpck1hY1NTaWQgIHNzaWQ7CisJaW50OF90ICAgICAgIHJzc2lfdGhyZXNob2xkOworCXVpbnQ4X3QgICAgICBmbGFnczsKKwl1aW50OF90ICAgICAgYXV0aF9iaXRfZmllbGQ7Cit9OworCisvKioKKyAqIHN0cnVjdCB3aWZpX2Vwbm9fcGFyYW1zIC0gZW5oYW5jZWQgcG5vIG5ldHdvcmsgcGFyYW1zCisgKiBAbnVtX25ldHdvcmtzOiBudW1iZXIgb2Ygc3NpZHMKKyAqIEBuZXR3b3JrczogUE5PIG5ldHdvcmtzCisgKi8KK3N0cnVjdCB3aWZpX2Vwbm9fcGFyYW1zIHsKKwl1aW50MzJfdCAgICByZXF1ZXN0X2lkOworCXVpbnQzMl90ICAgIHNlc3Npb25faWQ7CisJdWludDMyX3QgICAgbnVtX25ldHdvcmtzOworCXN0cnVjdCB3aWZpX2Vwbm9fbmV0d29yayBuZXR3b3Jrc1tdOworfTsKKworI2RlZmluZSBTSVJfUEFTU1BPSU5UX1JFQUxNX0xFTiAyNTYKKyNkZWZpbmUgU0lSX1BBU1NQT0lOVF9ST0FNSU5HX0NPTlNPUlRJVU1fSURfTlVNIDE2CisjZGVmaW5lIFNJUl9QQVNTUE9JTlRfUExNTl9MRU4gMworLyoqCisgKiBzdHJ1Y3Qgd2lmaV9wYXNzcG9pbnRfbmV0d29yayAtIHBhc3Nwb2ludCBuZXR3b3JrIGJsb2NrCisgKiBAaWQ6IGlkZW50aWZpZXIgb2YgdGhpcyBuZXR3b3JrIGJsb2NrCisgKiBAcmVhbG06IG51bGwgdGVybWluYXRlZCBVVEY4IGVuY29kZWQgcmVhbG0sIDAgaWYgdW5zcGVjaWZpZWQKKyAqIEByb2FtaW5nX2NvbnNvcnRpdW1faWRzOiByb2FtaW5nIGNvbnNvcnRpdW0gaWRzIHRvIG1hdGNoLCAwcyBpZiB1bnNwZWNpZmllZAorICogQHBsbW46IG1jYy9tbmMgY29tYmluYXRpb24gYXMgcGVyIHJ1bGVzLCAwcyBpZiB1bnNwZWNpZmllZAorICovCitzdHJ1Y3Qgd2lmaV9wYXNzcG9pbnRfbmV0d29yayB7CisJdWludDMyX3QgaWQ7CisJdWludDhfdCAgcmVhbG1bU0lSX1BBU1NQT0lOVF9SRUFMTV9MRU5dOworCWludDY0X3QgIHJvYW1pbmdfY29uc29ydGl1bV9pZHNbU0lSX1BBU1NQT0lOVF9ST0FNSU5HX0NPTlNPUlRJVU1fSURfTlVNXTsKKwl1aW50OF90ICBwbG1uW1NJUl9QQVNTUE9JTlRfUExNTl9MRU5dOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgd2lmaV9wYXNzcG9pbnRfcmVxIC0gcGFzc3BvaW50IHJlcXVlc3QKKyAqIEByZXF1ZXN0X2lkOiByZXF1ZXN0IGlkZW50aWZpZXIKKyAqIEBudW1fbmV0d29ya3M6IG51bWJlciBvZiBuZXR3b3JrcworICogQG5ldHdvcmtzOiBwYXNzcG9pbnQgbmV0d29ya3MKKyAqLworc3RydWN0IHdpZmlfcGFzc3BvaW50X3JlcSB7CisJdWludDMyX3QgcmVxdWVzdF9pZDsKKwl1aW50MzJfdCBzZXNzaW9uX2lkOworCXVpbnQzMl90IG51bV9uZXR3b3JrczsKKwlzdHJ1Y3Qgd2lmaV9wYXNzcG9pbnRfbmV0d29yayBuZXR3b3Jrc1tdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgd2lmaV9wYXNzcG9pbnRfbWF0Y2ggLSB3aWZpIHBhc3Nwb2ludCBuZXR3b3JrIG1hdGNoCisgKiBAaWQ6IG5ldHdvcmsgYmxvY2sgaWRlbnRpZmllciBmb3IgdGhlIG1hdGNoZWQgbmV0d29yaworICogQGFucXBfbGVuOiBsZW5ndGggb2YgQU5RUCBibG9iCisgKiBAYXA6IHNjYW4gcmVzdWx0LCB3aXRoIGNoYW5uZWwgYW5kIGJlYWNvbiBpbmZvcm1hdGlvbgorICogQGFucXA6IEFOUVAgZGF0YSwgaW4gdGhlIGluZm9ybWF0aW9uX2VsZW1lbnQgZm9ybWF0CisgKi8KK3N0cnVjdCB3aWZpX3Bhc3Nwb2ludF9tYXRjaCB7CisJdWludDMyX3QgIHJlcXVlc3RfaWQ7CisJdWludDMyX3QgIGlkOworCXVpbnQzMl90ICBhbnFwX2xlbjsKKwl0U2lyV2lmaVNjYW5SZXN1bHQgYXA7CisJdWludDhfdCAgIGFucXBbXTsKK307CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VYVFNDQU4gKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgdGltZXJfdmFsOworfSB0U2lyQXV0b1NodXRkb3duQ21kUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3Qgc2h1dGRvd25fcmVhc29uOworfSB0U2lyQXV0b1NodXRkb3duRXZ0UGFyYW1zOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgcmVxSWQ7CisJdWludDhfdCBzdGFJZDsKKwl1aW50MzJfdCBtcGR1U2l6ZVRocmVzaG9sZDsKKwl1aW50MzJfdCBhZ2dyZXNzaXZlU3RhdGlzdGljc0dhdGhlcmluZzsKK30gdFNpckxMU3RhdHNTZXRSZXEsICp0cFNpckxMU3RhdHNTZXRSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCByZXFJZDsKKwl1aW50OF90IHN0YUlkOworCXVpbnQzMl90IHBhcmFtSWRNYXNrOworfSB0U2lyTExTdGF0c0dldFJlcSwgKnRwU2lyTExTdGF0c0dldFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IHJlcUlkOworCXVpbnQ4X3Qgc3RhSWQ7CisJdWludDMyX3Qgc3RhdHNDbGVhclJlcU1hc2s7CisJdWludDhfdCBzdG9wUmVxOworfSB0U2lyTExTdGF0c0NsZWFyUmVxLCAqdHBTaXJMTFN0YXRzQ2xlYXJSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IG91aVtXSUZJX1NDQU5OSU5HX01BQ19PVUlfTEVOR1RIXTsKK30gdFNpclNjYW5NYWNPdWksICp0cFNpclNjYW5NYWNPdWk7CisKK2VudW0geworCVNJUl9BUF9SWF9EQVRBX09GRkxPQUQgICAgICAgICAgICAgPSAweDAwLAorCVNJUl9TVEFfUlhfREFUQV9PRkZMT0FEICAgICAgICAgICAgPSAweDAxLAorfTsKKworc3RydWN0IHNpcl9pcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZSB7CisJdWludDMyX3Qgb2ZmbG9hZF90eXBlOworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3QgZW5hYmxlOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdMQU5fSEFMX0xMX05PVElGWV9TVEFUUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkxJTksgTEFZRVIgU3RhdGlzdGljcyoqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgaW50IHRTaXJXaWZpUmFkaW87Cit0eXBlZGVmIGludCB0U2lyV2lmaUNoYW5uZWw7Cit0eXBlZGVmIGludCB0U2lyd2lmaVR4UmF0ZTsKKworLyogY2hhbm5lbCBvcGVyYXRpbmcgd2lkdGggKi8KK3R5cGVkZWYgZW51bSB7CisJV0lGSV9DSEFOX1dJRFRIXzIwID0gMCwKKwlXSUZJX0NIQU5fV0lEVEhfNDAgPSAxLAorCVdJRklfQ0hBTl9XSURUSF84MCA9IDIsCisJV0lGSV9DSEFOX1dJRFRIXzE2MCA9IDMsCisJV0lGSV9DSEFOX1dJRFRIXzgwUDgwID0gNCwKKwlXSUZJX0NIQU5fV0lEVEhfNSA9IDUsCisJV0lGSV9DSEFOX1dJRFRIXzEwID0gNiwKK30gdFNpcldpZmlDaGFubmVsV2lkdGg7CisKK3R5cGVkZWYgZW51bSB7CisJV0lGSV9ESVNDT05ORUNURUQgPSAwLAorCVdJRklfQVVUSEVOVElDQVRJTkcgPSAxLAorCVdJRklfQVNTT0NJQVRJTkcgPSAyLAorCVdJRklfQVNTT0NJQVRFRCA9IDMsCisJV0lGSV9FQVBPTF9TVEFSVEVEID0gNCwgLyogaWYgZG9uZSBieSBmaXJtd2FyZS9kcml2ZXIgKi8KKwlXSUZJX0VBUE9MX0NPTVBMRVRFRCA9IDUsICAgICAgIC8qIGlmIGRvbmUgYnkgZmlybXdhcmUvZHJpdmVyICovCit9IHRTaXJXaWZpQ29ubmVjdGlvblN0YXRlOworCit0eXBlZGVmIGVudW0geworCVdJRklfUk9BTUlOR19JRExFID0gMCwKKwlXSUZJX1JPQU1JTkdfQUNUSVZFID0gMSwKK30gdFNpcldpZmlSb2FtU3RhdGU7CisKK3R5cGVkZWYgZW51bSB7CisJV0lGSV9JTlRFUkZBQ0VfU1RBID0gMCwKKwlXSUZJX0lOVEVSRkFDRV9TT0ZUQVAgPSAxLAorCVdJRklfSU5URVJGQUNFX0lCU1MgPSAyLAorCVdJRklfSU5URVJGQUNFX1AyUF9DTElFTlQgPSAzLAorCVdJRklfSU5URVJGQUNFX1AyUF9HTyA9IDQsCisJV0lGSV9JTlRFUkZBQ0VfTkFOID0gNSwKKwlXSUZJX0lOVEVSRkFDRV9NRVNIID0gNiwKK30gdFNpcldpZmlJbnRlcmZhY2VNb2RlOworCisvKiBzZXQgZm9yIFFPUyBhc3NvY2lhdGlvbiAqLworI2RlZmluZSBXSUZJX0NBUEFCSUxJVFlfUU9TICAgICAgICAgIDB4MDAwMDAwMDEKKy8qIHNldCBmb3IgcHJvdGVjdGVkIGFzc29jICg4MDIuMTEgYmVhY29uIGZyYW1lIGNvbnRyb2wgcHJvdGVjdGVkIGJpdCBzZXQpICovCisjZGVmaW5lIFdJRklfQ0FQQUJJTElUWV9QUk9URUNURUQgICAgMHgwMDAwMDAwMgorLyogc2V0IGlmIDgwMi4xMSBFeHRlbmRlZCBDYXBhYmlsaXRpZXMgZWxlbWVudCBpbnRlcndvcmtpbmcgYml0IGlzIHNldCAqLworI2RlZmluZSBXSUZJX0NBUEFCSUxJVFlfSU5URVJXT1JLSU5HIDB4MDAwMDAwMDQKKy8qIHNldCBmb3IgSFMyMCBhc3NvY2lhdGlvbiAqLworI2RlZmluZSBXSUZJX0NBUEFCSUxJVFlfSFMyMCAgICAgICAgIDB4MDAwMDAwMDgKKy8qIHNldCBpcyA4MDIuMTEgRXh0ZW5kZWQgQ2FwYWJpbGl0aWVzIGVsZW1lbnQgVVRGLTggU1NJRCBiaXQgaXMgc2V0ICovCisjZGVmaW5lIFdJRklfQ0FQQUJJTElUWV9TU0lEX1VURjggICAgMHgwMDAwMDAxMAorLyogc2V0IGlzIDgwMi4xMSBDb3VudHJ5IEVsZW1lbnQgaXMgcHJlc2VudCAqLworI2RlZmluZSBXSUZJX0NBUEFCSUxJVFlfQ09VTlRSWSAgICAgIDB4MDAwMDAwMjAKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIHRTaXJXaWZpSW50ZXJmYWNlTW9kZSAqLworCS8qIGludGVyZmFjZSBtb2RlICovCisJdWludDhfdCBtb2RlOworCS8qIGludGVyZmFjZSBtYWMgYWRkcmVzcyAoc2VsZikgKi8KKwlzdHJ1Y3QgY2RmX21hY19hZGRyIG1hY0FkZHI7CisJLyogdFNpcldpZmlDb25uZWN0aW9uU3RhdGUgKi8KKwkvKiBjb25uZWN0aW9uIHN0YXRlICh2YWxpZCBmb3IgU1RBLCBDTEkgb25seSkgKi8KKwl1aW50OF90IHN0YXRlOworCS8qIHRTaXJXaWZpUm9hbVN0YXRlICovCisJLyogcm9hbWluZyBzdGF0ZSAqLworCXVpbnQzMl90IHJvYW1pbmc7CisJLyogV0lGSV9DQVBBQklMSVRZX1hYWCAoc2VsZikgKi8KKwl1aW50MzJfdCBjYXBhYmlsaXRpZXM7CisJLyogbnVsbCB0ZXJtaW5hdGVkIFNTSUQgKi8KKwl1aW50OF90IHNzaWRbMzNdOworCS8qIGJzc2lkICovCisJc3RydWN0IGNkZl9tYWNfYWRkciBic3NpZDsKKwkvKiBjb3VudHJ5IHN0cmluZyBhZHZlcnRpc2VkIGJ5IEFQICovCisJdWludDhfdCBhcENvdW50cnlTdHJbV05JX0NGR19DT1VOVFJZX0NPREVfTEVOXTsKKwkvKiBjb3VudHJ5IHN0cmluZyBmb3IgdGhpcyBhc3NvY2lhdGlvbiAqLworCXVpbnQ4X3QgY291bnRyeVN0cltXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU5dOworfSB0U2lyV2lmaUludGVyZmFjZUluZm8sICp0cFNpcldpZmlJbnRlcmZhY2VJbmZvOworCisvKiBjaGFubmVsIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyogY2hhbm5lbCB3aWR0aCAoMjAsIDQwLCA4MCwgODArODAsIDE2MCkgKi8KKwl0U2lyV2lmaUNoYW5uZWxXaWR0aCB3aWR0aDsKKwkvKiBwcmltYXJ5IDIwIE1IeiBjaGFubmVsICovCisJdFNpcldpZmlDaGFubmVsIGNlbnRlckZyZXE7CisJLyogY2VudGVyIGZyZXF1ZW5jeSAoTUh6KSBmaXJzdCBzZWdtZW50ICovCisJdFNpcldpZmlDaGFubmVsIGNlbnRlckZyZXEwOworCS8qIGNlbnRlciBmcmVxdWVuY3kgKE1Ieikgc2Vjb25kIHNlZ21lbnQgKi8KKwl0U2lyV2lmaUNoYW5uZWwgY2VudGVyRnJlcTE7Cit9IHRTaXJXaWZpQ2hhbm5lbEluZm8sICp0cFNpcldpZmlDaGFubmVsSW5mbzsKKworLyogd2lmaSByYXRlIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiAwOiBPRkRNLCAxOkNDSywgMjpIVCAzOlZIVCA0Li43IHJlc2VydmVkICovCisJdWludDMyX3QgcHJlYW1ibGU6MzsKKwkvKiAwOjF4MSwgMToyeDIsIDM6M3gzLCA0OjR4NCAqLworCXVpbnQzMl90IG5zczoyOworCS8qIDA6MjBNSHosIDE6NDBNaHosIDI6ODBNaHosIDM6MTYwTWh6ICovCisJdWludDMyX3QgYnc6MzsKKwkvKiBPRkRNL0NDSyByYXRlIGNvZGUgd291bGQgYmUgYXMgcGVyIGllZWUgc3RkIGluIHVuaXRzIG9mIDAuNW1icHMgKi8KKwkvKiBIVC9WSFQgaXQgd291bGQgYmUgbWNzIGluZGV4ICovCisJdWludDMyX3QgcmF0ZU1jc0lkeDo4OworCS8qIHJlc2VydmVkICovCisJdWludDMyX3QgcmVzZXJ2ZWQ6MTY7CisJLyogdW5pdHMgb2YgMTAwIEticHMgKi8KKwl1aW50MzJfdCBiaXRyYXRlOworfSB0U2lyV2lmaVJhdGUsICp0cFNpcldpZmlSYXRlOworCisvKiBjaGFubmVsIHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBjaGFubmVsICovCisJdFNpcldpZmlDaGFubmVsSW5mbyBjaGFubmVsOworCS8qIG1zZWNzIHRoZSByYWRpbyBpcyBhd2FrZSAoMzIgYml0cyBudW1iZXIgYWNjcnVpbmcgb3ZlciB0aW1lKSAqLworCXVpbnQzMl90IG9uVGltZTsKKwkvKiBtc2VjcyB0aGUgQ0NBIHJlZ2lzdGVyIGlzIGJ1c3kgKDMyIGJpdHMgbnVtYmVyIGFjY3J1aW5nIG92ZXIgdGltZSkgKi8KKwl1aW50MzJfdCBjY2FCdXN5VGltZTsKK30gdFNpcldpZmlDaGFubmVsU3RhdHMsICp0cFNpcldpZmlDaGFubmVsU3RhdHM7CisKKy8qIHJhZGlvIHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiB3aWZpIHJhZGlvIChpZiBtdWx0aXBsZSByYWRpbyBzdXBwb3J0ZWQpICovCisJdFNpcldpZmlSYWRpbyByYWRpbzsKKwkvKiBtc2VjcyB0aGUgcmFkaW8gaXMgYXdha2UgKDMyIGJpdHMgbnVtYmVyIGFjY3J1aW5nIG92ZXIgdGltZSkgKi8KKwl1aW50MzJfdCBvblRpbWU7CisJLyogbXNlY3MgdGhlIHJhZGlvIGlzIHRyYW5zbWl0dGluZworCSAqICgzMiBiaXRzIG51bWJlciBhY2NydWluZyBvdmVyIHRpbWUpCisJICovCisJdWludDMyX3QgdHhUaW1lOworCS8qIG1zZWNzIHRoZSByYWRpbyBpcyBpbiBhY3RpdmUgcmVjZWl2ZQorCSAgICooMzIgYml0cyBudW1iZXIgYWNjcnVpbmcgb3ZlciB0aW1lKQorCSAqLworCXVpbnQzMl90IHJ4VGltZTsKKwkvKiBtc2VjcyB0aGUgcmFkaW8gaXMgYXdha2UgZHVlIHRvIGFsbCBzY2FuCisJICogKDMyIGJpdHMgbnVtYmVyIGFjY3J1aW5nIG92ZXIgdGltZSkKKwkgKi8KKwl1aW50MzJfdCBvblRpbWVTY2FuOworCS8qIG1zZWNzIHRoZSByYWRpbyBpcyBhd2FrZSBkdWUgdG8gTkFOCisJICogKDMyIGJpdHMgbnVtYmVyIGFjY3J1aW5nIG92ZXIgdGltZSkKKwkgKi8KKwl1aW50MzJfdCBvblRpbWVOYmQ7CisJLyogbXNlY3MgdGhlIHJhZGlvIGlzIGF3YWtlIGR1ZSB0byBHc2NhbgorCSAqICgzMiBiaXRzIG51bWJlciBhY2NydWluZyBvdmVyIHRpbWUpCisJICovCisJdWludDMyX3Qgb25UaW1lR3NjYW47CisJLyogbXNlY3MgdGhlIHJhZGlvIGlzIGF3YWtlIGR1ZSB0byByb2FtP3NjYW4KKwkgKiAoMzIgYml0cyBudW1iZXIgYWNjcnVpbmcgb3ZlciB0aW1lKQorCSAqLworCXVpbnQzMl90IG9uVGltZVJvYW1TY2FuOworCS8qIG1zZWNzIHRoZSByYWRpbyBpcyBhd2FrZSBkdWUgdG8gUE5PIHNjYW4KKwkgKiAoMzIgYml0cyBudW1iZXIgYWNjcnVpbmcgb3ZlciB0aW1lKQorCSAqLworCXVpbnQzMl90IG9uVGltZVBub1NjYW47CisJLyogbXNlY3MgdGhlIHJhZGlvIGlzIGF3YWtlIGR1ZSB0byBIUzIuMCBzY2FucyBhbmQgR0FTIGV4Y2hhbmdlCisJICogKDMyIGJpdHMgbnVtYmVyIGFjY3J1aW5nIG92ZXIgdGltZSkKKwkgKi8KKwl1aW50MzJfdCBvblRpbWVIczIwOworCS8qIG51bWJlciBvZiBjaGFubmVscyAqLworCXVpbnQzMl90IG51bUNoYW5uZWxzOworCS8qIGNoYW5uZWwgc3RhdGlzdGljcyB0U2lyV2lmaUNoYW5uZWxTdGF0cyAqLworCXRTaXJXaWZpQ2hhbm5lbFN0YXRzIGNoYW5uZWxzWzBdOworfSB0U2lyV2lmaVJhZGlvU3RhdCwgKnRwU2lyV2lmaVJhZGlvU3RhdDsKKworLyogcGVyIHJhdGUgc3RhdGlzdGljcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIHJhdGUgaW5mb3JtYXRpb24gKi8KKwl0U2lyV2lmaVJhdGUgcmF0ZTsKKwkvKiBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkIGRhdGEgcGt0cyAoQUNLIHJjdmQpICovCisJdWludDMyX3QgdHhNcGR1OworCS8qIG51bWJlciBvZiByZWNlaXZlZCBkYXRhIHBrdHMgKi8KKwl1aW50MzJfdCByeE1wZHU7CisJLyogbnVtYmVyIG9mIGRhdGEgcGFja2V0IGxvc3NlcyAobm8gQUNLKSAqLworCXVpbnQzMl90IG1wZHVMb3N0OworCS8qIHRvdGFsIG51bWJlciBvZiBkYXRhIHBrdCByZXRyaWVzICogKi8KKwl1aW50MzJfdCByZXRyaWVzOworCS8qIG51bWJlciBvZiBzaG9ydCBkYXRhIHBrdCByZXRyaWVzICovCisJdWludDMyX3QgcmV0cmllc1Nob3J0OworCS8qIG51bWJlciBvZiBsb25nIGRhdGEgcGt0IHJldHJpZXMgKi8KKwl1aW50MzJfdCByZXRyaWVzTG9uZzsKK30gdFNpcldpZmlSYXRlU3RhdCwgKnRwU2lyV2lmaVJhdGVTdGF0OworCisvKiBhY2Nlc3MgY2F0ZWdvcmllcyAqLwordHlwZWRlZiBlbnVtIHsKKwlXSUZJX0FDX1ZPID0gMCwKKwlXSUZJX0FDX1ZJID0gMSwKKwlXSUZJX0FDX0JFID0gMiwKKwlXSUZJX0FDX0JLID0gMywKKwlXSUZJX0FDX01BWCA9IDQsCit9IHRTaXJXaWZpVHJhZmZpY0FjOworCisvKiB3aWZpIHBlZXIgdHlwZSAqLwordHlwZWRlZiBlbnVtIHsKKwlXSUZJX1BFRVJfU1RBLAorCVdJRklfUEVFUl9BUCwKKwlXSUZJX1BFRVJfUDJQX0dPLAorCVdJRklfUEVFUl9QMlBfQ0xJRU5ULAorCVdJRklfUEVFUl9OQU4sCisJV0lGSV9QRUVSX1RETFMsCisJV0lGSV9QRUVSX0lOVkFMSUQsCit9IHRTaXJXaWZpUGVlclR5cGU7CisKKy8qIHBlciBwZWVyIHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBwZWVyIHR5cGUgKEFQLCBURExTLCBHTyBldGMuKSAqLworCXRTaXJXaWZpUGVlclR5cGUgdHlwZTsKKwkvKiBtYWMgYWRkcmVzcyAqLworCXN0cnVjdCBjZGZfbWFjX2FkZHIgcGVlck1hY0FkZHJlc3M7CisJLyogcGVlciBXSUZJX0NBUEFCSUxJVFlfWFhYICovCisJdWludDMyX3QgY2FwYWJpbGl0aWVzOworCS8qIG51bWJlciBvZiByYXRlcyAqLworCXVpbnQzMl90IG51bVJhdGU7CisJLyogcGVyIHJhdGUgc3RhdGlzdGljcywgbnVtYmVyIG9mIGVudHJpZXMgID0gbnVtX3JhdGUgKi8KKwl0U2lyV2lmaVJhdGVTdGF0IHJhdGVTdGF0c1swXTsKK30gdFNpcldpZmlQZWVySW5mbywgKnRwU2lyV2lmaVBlZXJJbmZvOworCisvKiBwZXIgYWNjZXNzIGNhdGVnb3J5IHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiB0U2lyV2lmaVRyYWZmaWNBYyAqLworCS8qIGFjY2VzcyBjYXRlZ29yeSAoVkksIFZPLCBCRSwgQkspICovCisJdWludDMyX3QgYWM7CisJLyogbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCB1bmljYXN0IGRhdGEgcGt0cyAoQUNLIHJjdmQpICovCisJdWludDMyX3QgdHhNcGR1OworCS8qIG51bWJlciBvZiByZWNlaXZlZCB1bmljYXN0IG1wZHVzICovCisJdWludDMyX3QgcnhNcGR1OworCS8qIG51bWJlciBvZiBzdWNjZXNmdWxseSB0cmFuc21pdHRlZCBtdWx0aWNhc3QgZGF0YSBwYWNrZXRzICovCisJLyogU1RBIGNhc2U6IGltcGxpZXMgQUNLIHJlY2VpdmVkIGZyb20gQVAgZm9yIHRoZSB1bmljYXN0ICovCisJLyogcGFja2V0IGluIHdoaWNoIG1jYXN0IHBrdCB3YXMgc2VudCAqLworCXVpbnQzMl90IHR4TWNhc3Q7CisJLyogbnVtYmVyIG9mIHJlY2VpdmVkIG11bHRpY2FzdCBkYXRhIHBhY2tldHMgKi8KKwl1aW50MzJfdCByeE1jYXN0OworCS8qIG51bWJlciBvZiByZWNlaXZlZCB1bmljYXN0IGEtbXBkdXMgKi8KKwl1aW50MzJfdCByeEFtcGR1OworCS8qIG51bWJlciBvZiB0cmFuc21pdHRlZCB1bmljYXN0IGEtbXBkdXMgKi8KKwl1aW50MzJfdCB0eEFtcGR1OworCS8qIG51bWJlciBvZiBkYXRhIHBrdCBsb3NzZXMgKG5vIEFDSykgKi8KKwl1aW50MzJfdCBtcGR1TG9zdDsKKwkvKiB0b3RhbCBudW1iZXIgb2YgZGF0YSBwa3QgcmV0cmllcyAqLworCXVpbnQzMl90IHJldHJpZXM7CisJLyogbnVtYmVyIG9mIHNob3J0IGRhdGEgcGt0IHJldHJpZXMgKi8KKwl1aW50MzJfdCByZXRyaWVzU2hvcnQ7CisJLyogbnVtYmVyIG9mIGxvbmcgZGF0YSBwa3QgcmV0cmllcyAqLworCXVpbnQzMl90IHJldHJpZXNMb25nOworCS8qIGRhdGEgcGt0IG1pbiBjb250ZW50aW9uIHRpbWUgKHVzZWNzKSAqLworCXVpbnQzMl90IGNvbnRlbnRpb25UaW1lTWluOworCS8qIGRhdGEgcGt0IG1heCBjb250ZW50aW9uIHRpbWUgKHVzZWNzKSAqLworCXVpbnQzMl90IGNvbnRlbnRpb25UaW1lTWF4OworCS8qIGRhdGEgcGt0IGF2ZyBjb250ZW50aW9uIHRpbWUgKHVzZWNzKSAqLworCXVpbnQzMl90IGNvbnRlbnRpb25UaW1lQXZnOworCS8qIG51bSBvZiBkYXRhIHBrdHMgdXNlZCBmb3IgY29udGVudGlvbiBzdGF0aXN0aWNzICovCisJdWludDMyX3QgY29udGVudGlvbk51bVNhbXBsZXM7Cit9IHRTaXJXaWZpV21tQWNTdGF0LCAqdHBTaXJXaWZpV21tQWNTdGF0OworCisvKiBJbnRlcmZhY2Ugc3RhdGlzdGljcyAtIGNvcnJlc3BvbmRpbmcgdG8gMm5kIG1vc3QKKyAqIExTQiBpbiB3aWZpIHN0YXRpc3RpY3MgYml0bWFwICBmb3IgZ2V0dGluZyBzdGF0aXN0aWNzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbnRlcmZhY2UgKi8KKwl0U2lyV2lmaUludGVyZmFjZUluZm8gaW5mbzsKKwkvKiBhY2Nlc3MgcG9pbnQgYmVhY29uIHJlY2VpdmVkIGNvdW50IGZyb20gY29ubmVjdGVkIEFQICovCisJdWludDMyX3QgYmVhY29uUng7CisJLyogYWNjZXNzIHBvaW50IG1nbXQgZnJhbWVzIHJlY2VpdmVkIGNvdW50IGZyb20gKi8KKwkvKiBjb25uZWN0ZWQgQVAgKGluY2x1ZGluZyBCZWFjb24pICovCisJdWludDMyX3QgbWdtdFJ4OworCS8qIGFjdGlvbiBmcmFtZXMgcmVjZWl2ZWQgY291bnQgKi8KKwl1aW50MzJfdCBtZ210QWN0aW9uUng7CisJLyogYWN0aW9uIGZyYW1lcyB0cmFuc21pdCBjb3VudCAqLworCXVpbnQzMl90IG1nbXRBY3Rpb25UeDsKKwkvKiBhY2Nlc3MgUG9pbnQgQmVhY29uIGFuZCBNYW5hZ2VtZW50IGZyYW1lcyBSU1NJIChhdmVyYWdlZCkgKi8KKwl1aW50MzJfdCByc3NpTWdtdDsKKwkvKiBhY2Nlc3MgUG9pbnQgRGF0YSBGcmFtZXMgUlNTSSAoYXZlcmFnZWQpIGZyb20gY29ubmVjdGVkIEFQICovCisJdWludDMyX3QgcnNzaURhdGE7CisJLyogYWNjZXNzIFBvaW50IEFDSyBSU1NJIChhdmVyYWdlZCkgZnJvbSBjb25uZWN0ZWQgQVAgKi8KKwl1aW50MzJfdCByc3NpQWNrOworCS8qIG51bWJlciBvZiBwZWVycyAqLworCXVpbnQzMl90IG51bV9wZWVyczsKKwkvKgorCSAqIEluZGljYXRlcyBob3cgbWFueSBwZWVyX3N0YXRzIGV2ZW50cyB3aWxsIGJlIHNlbnQgZGVwZW5kaW5nIG9uIHRoZQorCSAqIG51bV9wZWVycy4KKwkgKi8KKwl1aW50MzJfdCBudW1fcGVlcl9ldmVudHM7CisJLyogbnVtYmVyIG9mIGFjICovCisJdWludDMyX3QgbnVtX2FjOworCS8qIFJvYW1pbmcgU3RhdCAqLworCXVpbnQzMl90IHJvYW1fc3RhdGU7CisJLyoKKwkgKiBBdmVyYWdlIEJlYWNvbiBzcHJlYWQgb2Zmc2V0IGlzIHRoZSBhdmVyYWdlZCB0aW1lIGRlbGF5IGJldHdlZW4gVEJUVAorCSAqIGFuZCBiZWFjb24gVFNGLiBVcHBlciAzMiBiaXRzIG9mIGF2ZXJhZ2VkIDY0IGJpdCBiZWFjb24gc3ByZWFkIG9mZnNldAorCSAqLworCXVpbnQzMl90IGF2Z19iY25fc3ByZWFkX29mZnNldF9oaWdoOworCS8qIExvd2VyIDMyIGJpdHMgb2YgYXZlcmFnZWQgNjQgYml0IGJlYWNvbiBzcHJlYWQgb2Zmc2V0ICovCisJdWludDMyX3QgYXZnX2Jjbl9zcHJlYWRfb2Zmc2V0X2xvdzsKKwkvKgorCSAqIFRha2VzIHZhbHVlIG9mIDEgaWYgQVAgbGVha3MgcGFja2V0cyBhZnRlciBzZW5kaW5nIGFuIEFDSyBmb3IgUE09MQorCSAqIG90aGVyd2lzZSAwCisJICovCisJdWludDMyX3QgaXNfbGVha3lfYXA7CisJLyoKKwkgKiBBdmVyYWdlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgZnJvbSBBUCBhZnRlciByZWNlaXZpbmcgdGhlIEFDSworCSAqIGZvciBhIGZyYW1lIHdpdGggUE0gPSAxCisJICovCisJdWludDMyX3QgYXZnX3J4X2ZybXNfbGVha2VkOworCS8qCisJICogIFJ4IGxlYWsgd2F0Y2ggd2luZG93IGN1cnJlbnRseSBpbiBmb3JjZSB0byBtaW5pbWl6ZSBkYXRhIGxvc3MKKwkgKiAgYmVjYXVzZSBvZiBsZWFreSBBUC4gUnggbGVhayB3aW5kb3cgaXMgdGhlCisJICogIHRpbWUgZHJpdmVyIHdhaXRzIGJlZm9yZSBzaHV0dGluZyBkb3duIHRoZSByYWRpbyBvciBzd2l0Y2hpbmcKKwkgKiAgdGhlIGNoYW5uZWwgYW5kIGFmdGVyIHJlY2VpdmluZyBhbiBBQ0sgZm9yCisJICogIGEgZGF0YSBmcmFtZSB3aXRoIFBNIGJpdCBzZXQuCisJICovCisJdWludDMyX3QgcnhfbGVha193aW5kb3c7CisJLyogcGVyIGFjIGRhdGEgcGFja2V0IHN0YXRpc3RpY3MgKi8KKwl0U2lyV2lmaVdtbUFjU3RhdCBBY2Nlc3NjbGFzc1N0YXRzW1dJRklfQUNfTUFYXTsKK30gdFNpcldpZmlJZmFjZVN0YXQsICp0cFNpcldpZmlJZmFjZVN0YXQ7CisKKy8qIFBlZXIgc3RhdGlzdGljcyAtIGNvcnJlc3BvbmRpbmcgdG8gM3JkIG1vc3QgTFNCIGluCisgKiB3aWZpIHN0YXRpc3RpY3MgYml0bWFwICBmb3IgZ2V0dGluZyBzdGF0aXN0aWNzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBudW1iZXIgb2YgcGVlcnMgKi8KKwl1aW50MzJfdCBudW1QZWVyczsKKwkvKiBwZXIgcGVlciBzdGF0aXN0aWNzICovCisJdFNpcldpZmlQZWVySW5mbyBwZWVySW5mb1swXTsKK30gdFNpcldpZmlQZWVyU3RhdCwgKnRwU2lyV2lmaVBlZXJTdGF0OworCisvKiB3aWZpIHN0YXRpc3RpY3MgYml0bWFwICBmb3IgZ2V0dGluZyBzdGF0aXN0aWNzICovCisjZGVmaW5lIFdNSV9MSU5LX1NUQVRTX1JBRElPICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgV01JX0xJTktfU1RBVFNfSUZBQ0UgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBXTUlfTElOS19TVEFUU19BTExfUEVFUiAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFdNSV9MSU5LX1NUQVRTX1BFUl9QRUVSICAgICAgIDB4MDAwMDAwMDgKKworLyogd2lmaSBzdGF0aXN0aWNzIGJpdG1hcCAgZm9yIGNsZWFyaW5nIHN0YXRpc3RpY3MgKi8KKy8qIGFsbCByYWRpbyBzdGF0aXN0aWNzICovCisjZGVmaW5lIFdJRklfU1RBVFNfUkFESU8gICAgICAgICAgICAgIDB4MDAwMDAwMDEKKy8qIGNjYV9idXN5X3RpbWUgKHdpdGhpbiByYWRpbyBzdGF0aXN0aWNzKSAqLworI2RlZmluZSBXSUZJX1NUQVRTX1JBRElPX0NDQSAgICAgICAgICAweDAwMDAwMDAyCisvKiBhbGwgY2hhbm5lbCBzdGF0aXN0aWNzICh3aXRoaW4gcmFkaW8gc3RhdGlzdGljcykgKi8KKyNkZWZpbmUgV0lGSV9TVEFUU19SQURJT19DSEFOTkVMUyAgICAgMHgwMDAwMDAwNAorLyogYWxsIHNjYW4gc3RhdGlzdGljcyAod2l0aGluIHJhZGlvIHN0YXRpc3RpY3MpICovCisjZGVmaW5lIFdJRklfU1RBVFNfUkFESU9fU0NBTiAgICAgICAgIDB4MDAwMDAwMDgKKy8qIGFsbCBpbnRlcmZhY2Ugc3RhdGlzdGljcyAqLworI2RlZmluZSBXSUZJX1NUQVRTX0lGQUNFICAgICAgICAgICAgICAweDAwMDAwMDEwCisvKiBhbGwgdHggcmF0ZSBzdGF0aXN0aWNzICh3aXRoaW4gaW50ZXJmYWNlIHN0YXRpc3RpY3MpICovCisjZGVmaW5lIFdJRklfU1RBVFNfSUZBQ0VfVFhSQVRFICAgICAgIDB4MDAwMDAwMjAKKy8qIGFsbCBhYyBzdGF0aXN0aWNzICh3aXRoaW4gaW50ZXJmYWNlIHN0YXRpc3RpY3MpICovCisjZGVmaW5lIFdJRklfU1RBVFNfSUZBQ0VfQUMgICAgICAgICAgIDB4MDAwMDAwNDAKKy8qIGFsbCBjb250ZW50aW9uIChtaW4sIG1heCwgYXZnKSBzdGF0aXN0aWNzICh3aXRoaW4gYWMgc3RhdGlzdGljcykgKi8KKyNkZWZpbmUgV0lGSV9TVEFUU19JRkFDRV9DT05URU5USU9OICAgMHgwMDAwMDA4MAorCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgcGFyYW1JZDsKKwl1aW50OF90IGlmYWNlSWQ7CisJdWludDMyX3QgcnNwSWQ7CisJdWludDMyX3QgbW9yZVJlc3VsdFRvRm9sbG93OworCXVuaW9uIHsKKwkJdWludDMyX3QgbnVtX3BlZXJzOworCQl1aW50MzJfdCBudW1fcmFkaW87CisJfTsKKworCXVpbnQzMl90IHBlZXJfZXZlbnRfbnVtYmVyOworCS8qIFZhcmlhYmxlICBsZW5ndGggZmllbGQgLSBEbyBub3QgYWRkIGFueXRoaW5nIGFmdGVyIHRoaXMgKi8KKwl1aW50OF90IHJlc3VsdHNbMF07Cit9IHRTaXJMTFN0YXRzUmVzdWx0cywgKnRwU2lyTExTdGF0c1Jlc3VsdHM7CisKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUyAqLworCit0eXBlZGVmIHN0cnVjdCBzQW5pR2V0TGlua1N0YXR1cyB7CisJdWludDE2X3QgbXNnVHlwZTsgICAgICAgLyogbWVzc2FnZSB0eXBlIGlzIHNhbWUgYXMgdGhlIHJlcXVlc3QgdHlwZSAqLworCXVpbnQxNl90IG1zZ0xlbjsgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgZW50aXJlIHJlcXVlc3QgKi8KKwl1aW50OF90IGxpbmtTdGF0dXM7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRBbmlHZXRMaW5rU3RhdHVzLCAqdHBBbmlHZXRMaW5rU3RhdHVzOworCisjaWZkZWYgREhDUF9TRVJWRVJfT0ZGTE9BRAordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3QgZGhjcFNydk9mZmxvYWRFbmFibGVkOworCXVpbnQzMl90IGRoY3BDbGllbnROdW07CisJdWludDMyX3QgZGhjcFNydklQOworfSB0U2lyRGhjcFNydk9mZmxvYWRJbmZvLCAqdHBTaXJEaGNwU3J2T2ZmbG9hZEluZm87CisjZW5kaWYgLyogREhDUF9TRVJWRVJfT0ZGTE9BRCAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9HUElPX0xFRF9GTEFTSElORwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IHJlcUlkOworCS8qIHBhdHRlcm4gaWRlbnRpZmllci4gMDogZGlzY29ubmVjdGVkIDE6IGNvbm5lY3RlZCAqLworCXVpbnQzMl90IHBhdHRlcm5faWQ7CisJdWludDMyX3QgbGVkX3gwOyAgICAgICAgLyogbGVkIGZsYXNoaW5nIHBhcmFtZXRlcjAgKi8KKwl1aW50MzJfdCBsZWRfeDE7ICAgICAgICAvKiBsZWQgZmxhc2hpbmcgcGFyYW1ldGVyMSAqLworfSB0U2lyTGVkRmxhc2hpbmdSZXEsICp0cFNpckxlZEZsYXNoaW5nUmVxOworI2VuZGlmCisvKiBmaW5kIHRoZSBzaXplIG9mIGdpdmVuIG1lbWJlciB3aXRoaW4gYSBzdHJ1Y3R1cmUgKi8KKyNpZm5kZWYgbWVtYmVyX3NpemUKKyNkZWZpbmUgbWVtYmVyX3NpemUodHlwZSwgbWVtYmVyKSAoc2l6ZW9mKCgodHlwZSAqKTApLT5tZW1iZXIpKQorI2VuZGlmCisKKyNkZWZpbmUgUlRUX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFJUVF9USU1JTkdfTUVBU19DQVBBQklMSVRZICAgICAgMHgwMQorI2RlZmluZSBSVFRfRklORV9USU1FX01FQVNfSU5JVElBVE9SX0NBUEFCSUxJVFkgMHgwMgorI2RlZmluZSBSVFRfRklORV9USU1FX01FQVNfUkVTUE9OREVSX0NBUEFCSUxJVFkgMHgwMworCisvKioKKyAqIGVudW0gZmluZV90aW1lX21lYXNfbWFzayAtIGJpdCBtYXNrIHRvIGlkZW50aWZ5IGRldmljZSdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5lIHRpbWluZyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5CisgKiBARklORV9USU1FX01FQVNfU1RBX0lOSVRJQVRPUiAtIFNUQSByb2xlLCBJbml0aWF0b3IgY2FwYWJpbGl0eSBpcyBzdXBwb3J0ZWQKKyAqIEBGSU5FX1RJTUVfTUVBU19TVEFfUkVTUE9OREVSIC0gU1RBIHJvbGUsIFJlc3BvbmRlciBjYXBhYmlsaXR5IGlzIHN1cHBvcnRlZAorICogQEZJTkVfVElNRV9NRUFTX1AyUENMSV9JTklUSUFUT1IgLSBQMlAtQ0xJIHN1cHBvcnRzIGluaXRpYXRvciBjYXBhYmlsaXR5CisgKiBARklORV9USU1FX01FQVNfUDJQQ0xJX1JFU1BPTkRFUiAtIFAyUC1DTEkgc3VwcG9ydHMgcmVzcG9uZGVyIGNhcGFiaWxpdHkKKyAqIEBGSU5FX1RJTUVfTUVBU19QMlBHT19JTklUSUFUT1IgLSBQMlAtR08gc3VwcG9ydHMgaW5pdGlhdG9yIGNhcGFiaWxpdHkKKyAqIEBGSU5FX1RJTUVfTUVBU19QMlBHT19SRVNQT05ERVIgLSBQMlAtR08gc3VwcG9ydHMgcmVzcG9uZGVyIGNhcGFiaWxpdHkKKyAqIEBGSU5FX1RJTUVfTUVBU19TQVBfSU5JVElBVE9SIC0gU0FQIHJvbGUsIEluaXRpYXRvciBjYXBhYmlsaXR5IGlzIHN1cHBvcnRlZAorICogQEZJTkVfVElNRV9NRUFTX1NBUF9SRVNQT05ERVIgLSBTQVAgcm9sZSwgUmVzcG9uZGVyIGNhcGFiaWxpdHkgaXMgc3VwcG9ydGVkCisgKi8KK2VudW0gZmluZV90aW1lX21lYXNfbWFzayB7CisJRklORV9USU1FX01FQVNfU1RBX0lOSVRJQVRPUiAgICA9ICgxIDw8ICgwKSksCisJRklORV9USU1FX01FQVNfU1RBX1JFU1BPTkRFUiAgICA9ICgxIDw8ICgxKSksCisJRklORV9USU1FX01FQVNfUDJQQ0xJX0lOSVRJQVRPUiA9ICgxIDw8ICgyKSksCisJRklORV9USU1FX01FQVNfUDJQQ0xJX1JFU1BPTkRFUiA9ICgxIDw8ICgzKSksCisJRklORV9USU1FX01FQVNfUDJQR09fSU5JVElBVE9SICA9ICgxIDw8ICg0KSksCisJRklORV9USU1FX01FQVNfUDJQR09fUkVTUE9OREVSICA9ICgxIDw8ICg1KSksCisJRklORV9USU1FX01FQVNfU0FQX0lOSVRJQVRPUiAgICA9ICgxIDw8ICg2KSksCisJRklORV9USU1FX01FQVNfU0FQX1JFU1BPTkRFUiAgICA9ICgxIDw8ICg3KSksCit9OworCisvKiBudW1iZXIgb2YgbmVpZ2hib3IgcmVwb3J0cyB0aGF0IHdlIGNhbiBoYW5kbGUgaW4gTmVpZ2hib3IgUmVwb3J0IFJlc3BvbnNlICovCisjZGVmaW5lIE1BWF9TVVBQT1JURURfTkVJR0hCT1JfUlBUIDE1CisKKy8qKgorICogc3RydWN0IHNpcl9zdGF0c19hdmdfZmFjdG9yCisgKiBAdmRldl9pZDogc2Vzc2lvbiBpZAorICogQHN0YXRzX2F2Z19mYWN0b3I6IGF2ZXJhZ2UgZmFjdG9yCisgKi8KK3N0cnVjdCBzaXJfc3RhdHNfYXZnX2ZhY3RvciB7CisJdWludDhfdCB2ZGV2X2lkOworCXVpbnQxNl90IHN0YXRzX2F2Z19mYWN0b3I7Cit9OworCisvKioKKyAqIHN0cnVjdCBzaXJfZ3VhcmRfdGltZV9yZXF1ZXN0CisgKiBAdmRldl9pZDogc2Vzc2lvbiBpZAorICogQGd1YXJkX3RpbWU6IGd1YXJkIHRpbWUKKyAqLworc3RydWN0IHNpcl9ndWFyZF90aW1lX3JlcXVlc3QgeworCXVpbnQ4X3QgdmRldl9pZDsKKwl1aW50MzJfdCBndWFyZF90aW1lOworfTsKKworLyogTWF4IG51bWJlciBvZiByYXRlcyBhbGxvd2VkIGluIFN1cHBvcnRlZCBSYXRlcyBJRSAqLworI2RlZmluZSBNQVhfTlVNX1NVUFBPUlRFRF9SQVRFUyAoOCkKKworLyoKKyAqIHN0cnVjdCByc3NpX21vbml0b3JfcmVxIC0gcnNzaSBtb25pdG9yaW5nCisgKiBAcmVxdWVzdF9pZDogcmVxdWVzdCBpZAorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqIEBtaW5fcnNzaTogbWluaW11bSByc3NpCisgKiBAbWF4X3Jzc2k6IG1heGltdW0gcnNzaQorICogQGNvbnRyb2w6IGZsYWcgdG8gaW5kaWNhdGUgc3RhcnQgb3Igc3RvcAorICovCitzdHJ1Y3QgcnNzaV9tb25pdG9yX3JlcSB7CisJdWludDMyX3QgcmVxdWVzdF9pZDsKKwl1aW50MzJfdCBzZXNzaW9uX2lkOworCWludDhfdCAgIG1pbl9yc3NpOworCWludDhfdCAgIG1heF9yc3NpOworCWJvb2wgICAgIGNvbnRyb2w7Cit9OworCisvKioKKyAqIHN0cnVjdCByc3NpX2JyZWFjaF9ldmVudCAtIHJzc2kgYnJlYWNoZWQgZXZlbnQgc3RydWN0dXJlCisgKiBAcmVxdWVzdF9pZDogcmVxdWVzdCBpZAorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqIEBjdXJyX3Jzc2k6IGN1cnJlbnQgcnNzaQorICogQGN1cnJfYnNzaWQ6IGN1cnJlbnQgYnNzaWQKKyAqLworc3RydWN0IHJzc2lfYnJlYWNoX2V2ZW50IHsKKwl1aW50MzJfdCAgICAgcmVxdWVzdF9pZDsKKwl1aW50MzJfdCAgICAgc2Vzc2lvbl9pZDsKKwlpbnQ4X3QgICAgICAgY3Vycl9yc3NpOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgIGN1cnJfYnNzaWQ7Cit9OworCisjZGVmaW5lIE1BWF9OVU1fRldfU0VHTUVOVFMgNAorCisvKioKKyAqIHN0cnVjdCBmd19kdW1wX3NlZ19yZXEgLSBpbmRpdmlkdWFsIHNlZ21lbnQgZGV0YWlscworICogQHNlZ19pZCAtIHNlZ21lbnQgaWQuCisgKiBAc2VnX3N0YXJ0X2FkZHJfbG8gLSBsb3dlciBhZGRyZXNzIG9mIHRoZSBzZWdtZW50LgorICogQHNlZ19zdGFydF9hZGRyX2hpIC0gaGlnaGVyIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQuCisgKiBAc2VnX2xlbmd0aCAtIGxlbmd0aCBvZiB0aGUgc2VnbWVudC4KKyAqIEBkc3RfYWRkcl9sbyAtIGxvd2VyIGFkZHJlc3Mgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqIEBkc3RfYWRkcl9oaSAtIGhpZ2hlciBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgY2FycmllcyB0aGUgaW5mb3JtYXRpb24gdG8gZmlybXdhcmUgYWJvdXQgdGhlCisgKiBpbmRpdmlkdWFsIHNlZ21lbnRzLiBUaGlzIHN0cnVjdHVyZSBpcyBwYXJ0IG9mIGZpcm13YXJlIG1lbW9yeQorICogZHVtcCByZXF1ZXN0LgorICovCitzdHJ1Y3QgZndfZHVtcF9zZWdfcmVxIHsKKwl1aW50OF90IHNlZ19pZDsKKwl1aW50MzJfdCBzZWdfc3RhcnRfYWRkcl9sbzsKKwl1aW50MzJfdCBzZWdfc3RhcnRfYWRkcl9oaTsKKwl1aW50MzJfdCBzZWdfbGVuZ3RoOworCXVpbnQzMl90IGRzdF9hZGRyX2xvOworCXVpbnQzMl90IGRzdF9hZGRyX2hpOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfZHVtcF9yZXEgLSBmaXJtd2FyZSBtZW1vcnkgZHVtcCByZXF1ZXN0IGRldGFpbHMuCisgKiBAcmVxdWVzdF9pZCAtIHJlcXVlc3QgaWQuCisgKiBAbnVtX3NlZyAtIHJlcXVlc3RlZCBudW1iZXIgb2Ygc2VnbWVudHMuCisgKiBAZndfZHVtcF9zZWdfcmVxIC0gaW5kaXZpZHVhbCBzZWdtZW50IGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGNhcnJpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpcm13YXJlCisgKiBtZW1vcnkgZHVtcCByZXF1ZXN0LgorICovCitzdHJ1Y3QgZndfZHVtcF9yZXEgeworCXVpbnQzMl90IHJlcXVlc3RfaWQ7CisJdWludDMyX3QgbnVtX3NlZzsKKwlzdHJ1Y3QgZndfZHVtcF9zZWdfcmVxIHNlZ21lbnRbTUFYX05VTV9GV19TRUdNRU5UU107Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19kdW1wX3JzcCAtIGZpcm13YXJlIGR1bXAgcmVzcG9uc2UgZGV0YWlscy4KKyAqIEByZXF1ZXN0X2lkIC0gcmVxdWVzdCBpZC4KKyAqIEBkdW1wX2NvbXBsZXRlIC0gY29weSBjb21wbGV0aW9uIHN0YXR1cy4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBmaXJtd2FyZSBkdW1wIGNvcHkgY29tcGxldGUKKyAqIHJlc3BvbnNlIGZyb20gdGhlIGZpcm13YXJlLgorICovCitzdHJ1Y3QgZndfZHVtcF9yc3AgeworCXVpbnQzMl90IHJlcXVlc3RfaWQ7CisJdWludDMyX3QgZHVtcF9jb21wbGV0ZTsKK307CisKKy8qKgorICogc3RydWN0IHZkZXZfaWVfaW5mbyAtIElFIGluZm8KKyAqIEB2ZGV2X2lkIC0gdmRldiBmb3Igd2hpY2ggdGhlIElFIGlzIGJlaW5nIHNlbnQKKyAqIEBpZV9pZCAtIElEIG9mIHRoZSBJRQorICogQGxlbmd0aCAtIGxlbmd0aCBvZiB0aGUgSUUgZGF0YQorICogQGRhdGEgLSBJRSBkYXRhCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSB0aGUgSUUgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCB2ZGV2X2llX2luZm8geworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3QgaWVfaWQ7CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQ4X3QgKmRhdGE7Cit9OworCisvKioKKyAqIHN0cnVjdCBzZW5kX2V4dGNhcF9pZSAtIHVzZWQgdG8gcGFzcyBzZW5kX2V4dGNhcF9pZSBtc2cgZnJvbSBTTUUgdG8gUEUKKyAqIEB0eXBlIC0gTVNHIHR5cGUKKyAqIEBsZW5ndGggLSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UKKyAqIEBzZWVzaW9uX2lkIC0gc2Vzc2lvbl9pZCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2UgaXMgaW50ZW5kZWQgZm9yCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIHNlbmRfZXh0Y2FwX2llIG1zZyBmcm9tIFNNRSB0byBQRQorICovCitzdHJ1Y3Qgc2VuZF9leHRjYXBfaWUgeworCXVpbnQxNl90IG1zZ190eXBlOyAvKiBlV05JX1NNRV9TRVRfSUVfUkVRICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsKK307CisKK3R5cGVkZWYgdm9pZCAoKmh3X21vZGVfY2IpKHVpbnQzMl90IHN0YXR1cywgdWludDMyX3QgY2ZnZF9od19tb2RlX2luZGV4LAorCQl1aW50MzJfdCBudW1fdmRldl9tYWNfZW50cmllcywKKwkJc3RydWN0IHNpcl92ZGV2X21hY19tYXAgKnZkZXZfbWFjX21hcCk7Cit0eXBlZGVmIHZvaWQgKCpod19tb2RlX3RyYW5zaXRpb25fY2IpKHVpbnQzMl90IG9sZF9od19tb2RlX2luZGV4LAorCQl1aW50MzJfdCBuZXdfaHdfbW9kZV9pbmRleCwKKwkJdWludDMyX3QgbnVtX3ZkZXZfbWFjX2VudHJpZXMsCisJCXN0cnVjdCBzaXJfdmRldl9tYWNfbWFwICp2ZGV2X21hY19tYXApOwordHlwZWRlZiB2b2lkICgqZHVhbF9tYWNfY2IpKHVpbnQzMl90IHN0YXR1cywgdWludDMyX3Qgc2Nhbl9jb25maWcsCisJCXVpbnQzMl90IGZ3X21vZGVfY29uZmlnKTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX25zc191cGRhdGVfcmVxdWVzdAorICogQG1zZ1R5cGU6IG5zcyB1cGRhdGUgbXNnIHR5cGUKKyAqIEBtc2dMZW46IGxlbmd0aCBvZiB0aGUgbXNnCisgKiBAbmV3X25zczogbmV3IHNwYXRpYWwgc3RyZWFtIHZhbHVlCisgKiBAdmRldl9pZDogc2Vzc2lvbiBpZAorICovCitzdHJ1Y3Qgc2lyX25zc191cGRhdGVfcmVxdWVzdCB7CisJdWludDE2X3QgbXNnVHlwZTsKKwl1aW50MTZfdCBtc2dMZW47CisJdWludDhfdCAgbmV3X25zczsKKwl1aW50MzJfdCB2ZGV2X2lkOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX2JlYWNvbl90eF9jb21wbGV0ZV9yc3AKKyAqCisgKiBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBmb3Igd2hpY2ggYmVhY29uIHVwZGF0ZSBoYXBwZW5lZAorICogQHR4X3N0YXR1czogc3RhdHVzIG9mIHRoZSBiZWFjb24gdHggZnJvbSBGVworICovCitzdHJ1Y3Qgc2lyX2JlYWNvbl90eF9jb21wbGV0ZV9yc3AgeworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsKKwl1aW50OF90IHR4X3N0YXR1czsKK307CisKK3R5cGVkZWYgdm9pZCAoKm5zc191cGRhdGVfY2IpKHZvaWQgKmNvbnRleHQsIHVpbnQ4X3QgdHhfc3RhdHVzLCB1aW50OF90IHZkZXZfaWQsCisJCXVpbnQ4X3QgbmV4dF9hY3Rpb24pOworCisvKioKKyAqIE9DQiBzdHJ1Y3R1cmVzCisgKi8KKworI2RlZmluZSBOVU1fQUMJCQkoNCkKKyNkZWZpbmUgT0NCX0NIQU5ORUxfTUFYCSg1KQorCitzdHJ1Y3Qgc2lyX3Fvc19wYXJhbXMgeworCXVpbnQ4X3QgYWlmc247CisJdWludDhfdCBjd21pbjsKKwl1aW50OF90IGN3bWF4OworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX29jYl9zZXRfY29uZmlnX3Jlc3BvbnNlCisgKiBAc3RhdHVzOiByZXNwb25zZSBzdGF0dXMKKyAqLworc3RydWN0IHNpcl9vY2Jfc2V0X2NvbmZpZ19yZXNwb25zZSB7CisJdWludDhfdCBzdGF0dXM7Cit9OworCisvKiogQ2FsbGJhY2sgZm9yIHRoZSBkY2Nfc3RhdHNfZXZlbnQgKi8KK3R5cGVkZWYgdm9pZCAoKmRjY19zdGF0c19ldmVudF9jYWxsYmFja190KSh2b2lkICpoZGRfY3R4LCB1aW50MzJfdCB2ZGV2X2lkLAorCXVpbnQzMl90IG51bV9jaGFubmVscywgdWludDMyX3Qgc3RhdHNfcGVyX2NoYW5uZWxfYXJyYXlfbGVuLAorCWNvbnN0IHZvaWQgKnN0YXRzX3Blcl9jaGFubmVsX2FycmF5KTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX29jYl9jb25maWdfY2hhbm5lbAorICogQGNoYW5fZnJlcTogZnJlcXVlbmN5IG9mIHRoZSBjaGFubmVsCisgKiBAYmFuZHdpZHRoOiBiYW5kd2lkdGggb2YgdGhlIGNoYW5uZWwsIGVpdGhlciAxMCBvciAyMCBNSHoKKyAqIEBtYWNfYWRkcmVzczogTUFDIGFkZHJlc3MgYXNzaWduZWQgdG8gdGhpcyBjaGFubmVsCisgKiBAcW9zX3BhcmFtczogUW9TIHBhcmFtZXRlcnMKKyAqIEBtYXhfcHdyOiBtYXhpbXVtIHRyYW5zbWl0IHBvd2VyIG9mIHRoZSBjaGFubmVsIChkQm0pCisgKiBAbWluX3B3cjogbWluaW11bSB0cmFuc21pdCBwb3dlciBvZiB0aGUgY2hhbm5lbCAoZEJtKQorICogQHJlZ19wd3I6IG1heGltdW0gdHJhbnNtaXQgcG93ZXIgc3BlY2lmaWVkIGJ5IHRoZSByZWd1bGF0b3J5IGRvbWFpbiAoZEJtKQorICogQGFudGVubmFfbWF4OiBtYXhpbXVtIGFudGVubmEgZ2FpbiBzcGVjaWZpZWQgYnkgdGhlIHJlZ3VsYXRvcnkgZG9tYWluIChkQikKKyAqLworc3RydWN0IHNpcl9vY2JfY29uZmlnX2NoYW5uZWwgeworCXVpbnQzMl90IGNoYW5fZnJlcTsKKwl1aW50MzJfdCBiYW5kd2lkdGg7CisJdFNpck1hY0FkZHIgbWFjX2FkZHJlc3M7CisJc3RydWN0IHNpcl9xb3NfcGFyYW1zIHFvc19wYXJhbXNbTUFYX05VTV9BQ107CisJdWludDMyX3QgbWF4X3B3cjsKKwl1aW50MzJfdCBtaW5fcHdyOworCXVpbnQ4X3QgcmVnX3B3cjsKKwl1aW50OF90IGFudGVubmFfbWF4OworCXVpbnQxNl90IGZsYWdzOworfTsKKworLyoqCisgKiBPQ0JfQ0hBTk5FTF9GTEFHX05PX1JYX0hEUiAtIERvbid0IGFkZCB0aGUgUlggc3RhdHMgaGVhZGVyIHRvIHBhY2tldHMKKyAqICAgICAgcmVjZWl2ZWQgb24gdGhpcyBjaGFubmVsLgorICovCisjZGVmaW5lIE9DQl9DSEFOTkVMX0ZMQUdfRElTQUJMRV9SWF9TVEFUU19IRFIJKDEgPDwgMCkKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX29jYl9jb25maWdfc2NoZWQKKyAqIEBjaGFuX2ZyZXE6IGZyZXF1ZW5jeSBvZiB0aGUgY2hhbm5lbAorICogQHRvdGFsX2R1cmF0aW9uOiBkdXJhdGlvbiBvZiB0aGUgc2NoZWR1bGUKKyAqIEBndWFyZF9pbnRlcnZhbDogZ3VhcmQgaW50ZXJ2YWwgb24gdGhlIHN0YXJ0IG9mIHRoZSBzY2hlZHVsZQorICovCitzdHJ1Y3Qgc2lyX29jYl9jb25maWdfc2NoZWQgeworCXVpbnQzMl90IGNoYW5fZnJlcTsKKwl1aW50MzJfdCB0b3RhbF9kdXJhdGlvbjsKKwl1aW50MzJfdCBndWFyZF9pbnRlcnZhbDsKK307CisKKy8qKgorICogc3RydWN0IHNpcl9vY2JfY29uZmlnCisgKiBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBpZAorICogQGNoYW5uZWxfY291bnQ6IG51bWJlciBvZiBjaGFubmVscworICogQHNjaGVkdWxlX3NpemU6IHNpemUgb2YgdGhlIGNoYW5uZWwgc2NoZWR1bGUKKyAqIEBmbGFnczogcmVzZXJ2ZWQKKyAqIEBjaGFubmVsczogYXJyYXkgb2YgT0NCIGNoYW5uZWxzCisgKiBAc2NoZWR1bGU6IGFycmF5IG9mIE9DQiBzY2hlZHVsZSBlbGVtZW50cworICogQGRjY19uZGxfY2hhbl9saXN0X2xlbjogc2l6ZSBvZiB0aGUgbmRsX2NoYW4gYXJyYXkKKyAqIEBkY2NfbmRsX2NoYW5fbGlzdDogYXJyYXkgb2YgZGNjIGNoYW5uZWwgaW5mbworICogQGRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3RfbGVuOiBzaXplIG9mIHRoZSBhY3RpdmUgc3RhdGUgYXJyYXkKKyAqIEBkY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0OiBhcnJheSBvZiBhY3RpdmUgc3RhdGVzCisgKiBAYWRhcHRlcjogdGhlIE9DQiBhZGFwdGVyCisgKiBAZGNjX3N0YXRzX2NhbGxiYWNrOiBjYWxsYmFjayBmb3IgdGhlIHJlc3BvbnNlIGV2ZW50CisgKi8KK3N0cnVjdCBzaXJfb2NiX2NvbmZpZyB7CisJdWludDhfdCBzZXNzaW9uX2lkOworCXVpbnQzMl90IGNoYW5uZWxfY291bnQ7CisJdWludDMyX3Qgc2NoZWR1bGVfc2l6ZTsKKwl1aW50MzJfdCBmbGFnczsKKwlzdHJ1Y3Qgc2lyX29jYl9jb25maWdfY2hhbm5lbCAqY2hhbm5lbHM7CisJc3RydWN0IHNpcl9vY2JfY29uZmlnX3NjaGVkICpzY2hlZHVsZTsKKwl1aW50MzJfdCBkY2NfbmRsX2NoYW5fbGlzdF9sZW47CisJdm9pZCAqZGNjX25kbF9jaGFuX2xpc3Q7CisJdWludDMyX3QgZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdF9sZW47CisJdm9pZCAqZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdDsKK307CisKKy8qIFRoZSBzaXplIG9mIHRoZSB1dGMgdGltZSBpbiBieXRlcy4gKi8KKyNkZWZpbmUgU0laRV9VVENfVElNRSAoMTApCisvKiBUaGUgc2l6ZSBvZiB0aGUgdXRjIHRpbWUgZXJyb3IgaW4gYnl0ZXMuICovCisjZGVmaW5lIFNJWkVfVVRDX1RJTUVfRVJST1IgKDUpCisKKy8qKgorICogc3RydWN0IHNpcl9vY2JfdXRjCisgKiBAdmRldl9pZDogc2Vzc2lvbiBpZAorICogQHV0Y190aW1lOiBudW1iZXIgb2YgbmFub3NlY29uZHMgZnJvbSBKYW4gMXN0IDE5NTgKKyAqIEB0aW1lX2Vycm9yOiB0aGUgZXJyb3IgaW4gdGhlIFVUQyB0aW1lLiBBbGwgMSdzIGZvciB1bmtub3duCisgKi8KK3N0cnVjdCBzaXJfb2NiX3V0YyB7CisJdWludDMyX3QgdmRldl9pZDsKKwl1aW50OF90IHV0Y190aW1lW1NJWkVfVVRDX1RJTUVdOworCXVpbnQ4X3QgdGltZV9lcnJvcltTSVpFX1VUQ19USU1FX0VSUk9SXTsKK307CisKKy8qKgorICogc3RydWN0IHNpcl9vY2JfdGltaW5nX2FkdmVydAorICogQHZkZXZfaWQ6IHNlc3Npb24gaWQKKyAqIEBjaGFuX2ZyZXE6IGZyZXF1ZW5jeSBvbiB3aGljaCB0byBhZHZlcnRpc2UKKyAqIEByZXBlYXRfcmF0ZTogdGhlIG51bWJlciBvZiB0aW1lcyBpdCB3aWxsIHNlbmQgVEEgaW4gNSBzZWNvbmRzCisgKiBAdGltZXN0YW1wX29mZnNldDogb2Zmc2V0IG9mIHRoZSB0aW1lc3RhbXAgZmllbGQgaW4gdGhlIFRBIGZyYW1lCisgKiBAdGltZV92YWx1ZV9vZmZzZXQ6IG9mZnNldCBvZiB0aGUgdGltZV92YWx1ZSBmaWVsZCBpbiB0aGUgVEEgZnJhbWUKKyAqIEB0ZW1wbGF0ZV9sZW5ndGg6IHNpemUgaW4gYnl0ZXMgb2YgdGhlIFRBIGZyYW1lCisgKiBAdGVtcGxhdGVfdmFsdWU6IHRoZSBUQSBmcmFtZQorICovCitzdHJ1Y3Qgc2lyX29jYl90aW1pbmdfYWR2ZXJ0IHsKKwl1aW50MzJfdCB2ZGV2X2lkOworCXVpbnQzMl90IGNoYW5fZnJlcTsKKwl1aW50MzJfdCByZXBlYXRfcmF0ZTsKKwl1aW50MzJfdCB0aW1lc3RhbXBfb2Zmc2V0OworCXVpbnQzMl90IHRpbWVfdmFsdWVfb2Zmc2V0OworCXVpbnQzMl90IHRlbXBsYXRlX2xlbmd0aDsKKwl1aW50OF90ICp0ZW1wbGF0ZV92YWx1ZTsKK307CisKKy8qKgorICogc3RydWN0IHNpcl9vY2JfZ2V0X3RzZl90aW1lcl9yZXNwb25zZQorICogQHZkZXZfaWQ6IHNlc3Npb24gaWQKKyAqIEB0aW1lcl9oaWdoOiBoaWdoZXIgMzItYml0cyBvZiB0aGUgdGltZXIKKyAqIEB0aW1lcl9sb3c6IGxvd2VyIDMyLWJpdHMgb2YgdGhlIHRpbWVyCisgKi8KK3N0cnVjdCBzaXJfb2NiX2dldF90c2ZfdGltZXJfcmVzcG9uc2UgeworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3QgdGltZXJfaGlnaDsKKwl1aW50MzJfdCB0aW1lcl9sb3c7Cit9OworCisvKioKKyAqIHN0cnVjdCBzaXJfb2NiX2dldF90c2ZfdGltZXIKKyAqIEB2ZGV2X2lkOiBzZXNzaW9uIGlkCisgKi8KK3N0cnVjdCBzaXJfb2NiX2dldF90c2ZfdGltZXIgeworCXVpbnQzMl90IHZkZXZfaWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBzaXJfZGNjX2dldF9zdGF0c19yZXNwb25zZQorICogQHZkZXZfaWQ6IHNlc3Npb24gaWQKKyAqIEBudW1fY2hhbm5lbHM6IG51bWJlciBvZiBkY2MgY2hhbm5lbHMKKyAqIEBjaGFubmVsX3N0YXRzX2FycmF5X2xlbjogc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RhdHMgYXJyYXkKKyAqIEBjaGFubmVsX3N0YXRzX2FycmF5OiB0aGUgc3RhdHMgYXJyYXkKKyAqLworc3RydWN0IHNpcl9kY2NfZ2V0X3N0YXRzX3Jlc3BvbnNlIHsKKwl1aW50MzJfdCB2ZGV2X2lkOworCXVpbnQzMl90IG51bV9jaGFubmVsczsKKwl1aW50MzJfdCBjaGFubmVsX3N0YXRzX2FycmF5X2xlbjsKKwl2b2lkICpjaGFubmVsX3N0YXRzX2FycmF5OworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX2RjY19nZXRfc3RhdHMKKyAqIEB2ZGV2X2lkOiBzZXNzaW9uIGlkCisgKiBAY2hhbm5lbF9jb3VudDogbnVtYmVyIG9mIGRjYyBjaGFubmVscworICogQHJlcXVlc3RfYXJyYXlfbGVuOiBzaXplIGluIGJ5dGVzIG9mIHRoZSByZXF1ZXN0IGFycmF5CisgKiBAcmVxdWVzdF9hcnJheTogdGhlIHJlcXVlc3QgYXJyYXkKKyAqLworc3RydWN0IHNpcl9kY2NfZ2V0X3N0YXRzIHsKKwl1aW50MzJfdCB2ZGV2X2lkOworCXVpbnQzMl90IGNoYW5uZWxfY291bnQ7CisJdWludDMyX3QgcmVxdWVzdF9hcnJheV9sZW47CisJdm9pZCAqcmVxdWVzdF9hcnJheTsKK307CisKKy8qKgorICogc3RydWN0IHNpcl9kY2NfY2xlYXJfc3RhdHMKKyAqIEB2ZGV2X2lkOiBzZXNzaW9uIGlkCisgKiBAZGNjX3N0YXRzX2JpdG1hcDogYml0bWFwIG9mIGNsZWFyIG9wdGlvbgorICovCitzdHJ1Y3Qgc2lyX2RjY19jbGVhcl9zdGF0cyB7CisJdWludDMyX3QgdmRldl9pZDsKKwl1aW50MzJfdCBkY2Nfc3RhdHNfYml0bWFwOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX2RjY191cGRhdGVfbmRsX3Jlc3BvbnNlCisgKiBAdmRldl9pZDogc2Vzc2lvbiBpZAorICogQHN0YXR1czogcmVzcG9uc2Ugc3RhdHVzCisgKi8KK3N0cnVjdCBzaXJfZGNjX3VwZGF0ZV9uZGxfcmVzcG9uc2UgeworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3Qgc3RhdHVzOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2lyX2RjY191cGRhdGVfbmRsCisgKiBAdmRldl9pZDogc2Vzc2lvbiBpZAorICogQGNoYW5uZWxfY291bnQ6IG51bWJlciBvZiBjaGFubmVscyB0byBiZSB1cGRhdGVkCisgKiBAZGNjX25kbF9jaGFuX2xpc3RfbGVuOiBzaXplIGluIGJ5dGVzIG9mIHRoZSBuZGxfY2hhbiBhcnJheQorICogQGRjY19uZGxfY2hhbl9saXN0OiB0aGUgbmRsX2NoYW4gYXJyYXkKKyAqIEBkY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbjogc2l6ZSBpbiBieXRlcyBvZiB0aGUgYWN0aXZlX3N0YXRlIGFycmF5CisgKiBAZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdDogdGhlIGFjdGl2ZSBzdGF0ZSBhcnJheQorICovCitzdHJ1Y3Qgc2lyX2RjY191cGRhdGVfbmRsIHsKKwl1aW50MzJfdCB2ZGV2X2lkOworCXVpbnQzMl90IGNoYW5uZWxfY291bnQ7CisJdWludDMyX3QgZGNjX25kbF9jaGFuX2xpc3RfbGVuOworCXZvaWQgKmRjY19uZGxfY2hhbl9saXN0OworCXVpbnQzMl90IGRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3RfbGVuOworCXZvaWQgKmRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3Q7Cit9OworCisvKioKKyAqIGVudW0gcG93ZXJzYXZlX3Fwb3dlcl9tb2RlOiBRUE9XRVIgbW9kZXMKKyAqIEBRUE9XRVJfRElTQUJMRUQ6IFFwb3dlciBpcyBkaXNhYmxlZAorICogQFFQT1dFUl9FTkFCTEVEOiBRcG93ZXIgaXMgZW5hYmxlZAorICogQFFQT1dFUl9EVVRZX0NZQ0xJTkc6IFFwb3dlciBpcyBlbmFibGVkIHdpdGggZHV0eSBjeWNsaW5nCisgKi8KK2VudW0gcG93ZXJzYXZlX3Fwb3dlcl9tb2RlIHsKKwlRUE9XRVJfRElTQUJMRUQgPSAwLAorCVFQT1dFUl9FTkFCTEVEID0gMSwKKwlRUE9XRVJfRFVUWV9DWUNMSU5HID0gMgorfTsKKworLyoqCisgKiBlbnVtIHBvd2Vyc2F2ZV9xcG93ZXJfbW9kZTogcG93ZXJzYXZlX21vZGUKKyAqIEBQU19OT1RfU1VQUE9SVEVEOiBQb3dlciBzYXZlIGlzIG5vdCBzdXBwb3J0ZWQKKyAqIEBQU19MRUdBQ1lfTk9ERUVQU0xFRVA6IExlZ2FjeSBwb3dlciBzYXZlIGVuYWJsZWQgYW5kIGRlZXAgc2xlZXAgZGlzYWJsZWQKKyAqIEBQU19RUE9XRVJfTk9ERUVQU0xFRVA6IFFQT1dFUiBlbmFibGVkIGFuZCBkZWVwIHNsZWVwIGRpc2FibGVkCisgKiBAUFNfTEVHQUNZX0RFRVBTTEVFUDogTGVnYWN5IHBvd2VyIHNhdmUgZW5hYmxlZCBhbmQgZGVlcCBzbGVlcCBlbmFibGVkCisgKiBAUFNfUVBPV0VSX0RFRVBTTEVFUDogUVBPV0VSIGVuYWJsZWQgYW5kIGRlZXAgc2xlZXAgZW5hYmxlZAorICogQFBTX0RVVFlfQ1lDTElOR19RUE9XRVI6IFFQT1dFUiBlbmFibGVkIGluIGR1dHkgY3ljbGluZyBtb2RlCisgKi8KK2VudW0gcG93ZXJzYXZlX21vZGUgeworCVBTX05PVF9TVVBQT1JURUQgPSAwLAorCVBTX0xFR0FDWV9OT0RFRVBTTEVFUCA9IDEsCisJUFNfUVBPV0VSX05PREVFUFNMRUVQID0gMiwKKwlQU19MRUdBQ1lfREVFUFNMRUVQID0gMywKKwlQU19RUE9XRVJfREVFUFNMRUVQID0gNCwKKwlQU19EVVRZX0NZQ0xJTkdfUVBPV0VSID0gNQorfTsKKworI2VuZGlmIC8qIF9fU0lSX0FQSV9IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9pbmMvc2lyX21hY19wcm9wX2V4dHMuaCBiL2NvcmUvbWFjL2luYy9zaXJfbWFjX3Byb3BfZXh0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjRhODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9pbmMvc2lyX21hY19wcm9wX2V4dHMuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGZpbGUgc2lyX21hY19wcm9wX2V4dHMuaCBjb250YWlucyB0aGUgTUFDIHByb3RvY29sCisgKiBleHRlbnNpb25zIHRvIHN1cHBvcnQgQU5JIGZlYXR1cmUgc2V0LgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMTEvMjcvMDIKKyAqLworI2lmbmRlZiBfX01BQ19QUk9QX0VYVFNfSAorI2RlZmluZSBfX01BQ19QUk9QX0VYVFNfSAorCisjaW5jbHVkZSAic2lyX3R5cGVzLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorI2luY2x1ZGUgImFuaV9zeXN0ZW1fZGVmcy5oIgorCisvKiAvIEVJRCAoRWxlbWVudCBJRCkgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBQUk9QX0NBUEFCSUxJVFlfR0VUKGJpdG5hbWUsIHZhbHVlKSBcCisJKCgodmFsdWUpID4+IFNJUl9NQUNfUFJPUF9DQVBBQklMSVRZXyAjIyBiaXRuYW1lKSAmIDEpCisKKyNkZWZpbmUgSVNfRE9UMTFfTU9ERV9IVChkb3QxMU1vZGUpIFwKKwkoKChkb3QxMU1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExTikgfHwgXAorCSAgKGRvdDExTW9kZSA9PSAgV05JX0NGR19ET1QxMV9NT0RFXzExTl9PTkxZKSB8fCBcCisJICAoZG90MTFNb2RlID09ICBXTklfQ0ZHX0RPVDExX01PREVfMTFBQykgfHwgXAorCSAgKGRvdDExTW9kZSA9PSAgV05JX0NGR19ET1QxMV9NT0RFXzExQUNfT05MWSkgfHwgXAorCSAgKGRvdDExTW9kZSA9PSAgV05JX0NGR19ET1QxMV9NT0RFX0FMTCkpID8gdHJ1ZTpmYWxzZSkKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisjZGVmaW5lIElTX0RPVDExX01PREVfVkhUKGRvdDExTW9kZSkgXAorCSgoKGRvdDExTW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFBQykgfHwgXAorCSAgKGRvdDExTW9kZSA9PSAgV05JX0NGR19ET1QxMV9NT0RFXzExQUNfT05MWSkgfHwgXAorCSAgKGRvdDExTW9kZSA9PSAgV05JX0NGR19ET1QxMV9NT0RFX0FMTCkpID8gdHJ1ZTpmYWxzZSkKKyNlbmRpZgorCisjZGVmaW5lIElTX0RPVDExX01PREVfMTFCKGRvdDExTW9kZSkgIFwKKwkoKGRvdDExTW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFCKSA/IHRydWU6ZmFsc2UpCisKKyNkZWZpbmUgSVNfQlNTX1ZIVF9DQVBBQkxFKHZodENhcHMpIFwKKwkoKHZodENhcHMpLnByZXNlbnQgJiYgXAorCSAoKHZodENhcHMpLnJ4TUNTTWFwICE9IDB4RkZGRikgJiYgXAorCSAoKHZodENhcHMpLnR4TUNTTWFwICE9IDB4RkZGRikpCisKKyNkZWZpbmUgV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF8yMF80ME1IWgkJMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzgwTUhaCQkxCisjZGVmaW5lIFdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfMTYwTUhaCQkyCisjZGVmaW5lIFdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfODBfUExVU184ME1IWgkzCisKKy8qIC8gUHJvcHJpZXRhcnkgSUUgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1Byb3BJRSB7CisJdWludDhfdCBlbGVtZW50SUQ7ICAgICAgLyogU0lSX01BQ19BTklfUFJPUF9JRV9FSUQgKi8KKwl1aW50OF90IGxlbmd0aDsKKwl1aW50OF90IG91aVszXTsgICAgICAgICAvKiBBTklfT1VJIGZvciBBaXJnbyBwcm9kdWN0cyAqLworCXVpbnQ4X3QgaW5mb1sxXTsKK30gdFNpck1hY1Byb3BJRSwgKnRwU2lyTWFjUHJvcElFOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjUHJvcFJhdGVTZXQgeworCXVpbnQ4X3QgbnVtUHJvcFJhdGVzOworCXVpbnQ4X3QgcHJvcFJhdGVbOF07Cit9IHRTaXJNYWNQcm9wUmF0ZVNldCwgKnRwU2lyTWFjUHJvcFJhdGVTZXQ7CisKKyNkZWZpbmUgU0lSX1BST1BfVkVSU0lPTl9TVFJfTUFYIDIwCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjUHJvcFZlcnNpb24geworCXVpbnQzMl90IGNoaXBfcmV2OyAgICAgIC8qIGJvYXJkLCBjaGlwc2V0IGluZm8gKi8KKwl1aW50OF90IGNhcmRfdHlwZTsgICAgICAvKiBUeXBlIG9mIENhcmQgKi8KKwkvKiBidWlsZCB2ZXJzaW9uIHN0cmluZyAqLworCXVpbnQ4X3QgYnVpbGRfdmVyc2lvbltTSVJfUFJPUF9WRVJTSU9OX1NUUl9NQVhdOworfSB0U2lyTWFjUHJvcFZlcnNpb24sICp0cFNpck1hY1Byb3BWZXJzaW9uOworCisvKiBEZWZhdWx0IHZhbHVlIGZvciBnTGltUmVzdG9yZUNCTnVtU2NhbkludGVydmFsICovCisjZGVmaW5lIExJTV9SRVNUT1JFX0NCX05VTV9TQ0FOX0lOVEVSVkFMX0RFRkFVTFQgICAgICAgIDIKKworLyogZ2VuZXJpYyBwcm9wcmlldGFyeSBJRSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclByb3BJRVN0cnVjdCB7CisJdWludDhfdCBwcm9wUmF0ZXNQcmVzZW50OjE7CisJdWludDhfdCBhcE5hbWVQcmVzZW50OjE7CisJdWludDhfdCBsb2FkQmFsYW5jZUluZm9QcmVzZW50OjE7CisJdWludDhfdCB2ZXJzaW9uUHJlc2VudDoxOworCXVpbnQ4X3QgZWRjYVBhcmFtUHJlc2VudDoxOworCXVpbnQ4X3QgY2FwYWJpbGl0eVByZXNlbnQ6MTsKKwl1aW50OF90IHByb3BDaGFubmVsU3dpdGNoUHJlc2VudDoxOworCXVpbnQ4X3QgdHJpZ2dlclN0YVNjYW5QcmVzZW50OjE7CisJdWludDhfdCByc3ZkOjg7CisKKwl0U2lyTWFjUHJvcFJhdGVTZXQgcHJvcFJhdGVzOworCXRBbmlBcE5hbWUgYXBOYW1lOyAgICAgIC8qIHVzZWQgaW4gYmVhY29uL3Byb2JlIG9ubHkgKi8KKwl1aW50MTZfdCBjYXBhYmlsaXR5OyAgICAvKiBjYXBhYmlsaXR5IGJpdCBtYXAgKi8KKwl0U2lyTWFjUHJvcFZlcnNpb24gdmVyc2lvbjsKKwl0U2lyTWFjRWRjYVBhcmFtU2V0SUUgZWRjYTsKKwl1aW50OF90IHRyaWdnZXJTdGFTY2FuRW5hYmxlOworCit9IHRTaXJQcm9wSUVTdHJ1Y3QsICp0cFNpclByb3BJRVN0cnVjdDsKKworI2VuZGlmIC8qIF9fTUFDX1BST1BfRVhUU19IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9pbmMvc2lyX21hY19wcm90X2RlZi5oIGIvY29yZS9tYWMvaW5jL3Npcl9tYWNfcHJvdF9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2MyZGNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvaW5jL3Npcl9tYWNfcHJvdF9kZWYuaApAQCAtMCwwICsxLDIxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKworLyoKKyAqIFRoaXMgZmlsZSBzaXJfbWFjX3Byb3RfZGVmLmggY29udGFpbnMgdGhlIE1BQy9QSFkgcHJvdG9jb2wKKyAqIGRlZmluaXRpb25zIHVzZWQgYWNyb3NzIHZhcmlvdXMgcHJvamVjdHMuCisgKi8KKworI2lmbmRlZiBfX01BQ19QUk9UX0RFRlNfSAorI2RlZmluZSBfX01BQ19QUk9UX0RFRlNfSAorCisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJzaXJfdHlwZXMuaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisKKy8qIC9DYXBhYmlsaXR5IGluZm9ybWF0aW9uIHJlbGF0ZWQgKi8KKyNkZWZpbmUgQ0FQQUJJTElUWV9JTkZPX0RFTEFZRURfQkFfQklUIDE0CisjZGVmaW5lIENBUEFCSUxJVFlfSU5GT19JTU1FRElBVEVfQkFfQklUIDE1CisKKy8qIC8gMTFoIE1BQyBkZWZhdWx0cyAqLworI2RlZmluZSBTSVJfMTFBX0NIQU5ORUxfQkVHSU4gICAgICAgICAgIDM0CisjZGVmaW5lIFNJUl8xMUFfQ0hBTk5FTF9FTkQgICAgICAgICAgICAgMTY1CisjZGVmaW5lIFNJUl8xMUJfQ0hBTk5FTF9CRUdJTiAgICAgICAgICAgMQorI2RlZmluZSBTSVJfMTFCX0NIQU5ORUxfRU5EICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNJUl8xMUFfRlJFUVVFTkNZX09GRlNFVCAgICAgICAgNAorI2RlZmluZSBTSVJfMTFCX0ZSRVFVRU5DWV9PRkZTRVQgICAgICAgIDEKKyNkZWZpbmUgU0lSXzExUF9DSEFOTkVMX0JFR0lOICAgICAgICAgICAxNzAKKyNkZWZpbmUgU0lSXzExUF9DSEFOTkVMX0VORCAgICAgICAgICAgICAxODQKKworLyogLyBDdXJyZW50IHZlcnNpb24gb2YgODAyLjExICovCisjZGVmaW5lIFNJUl9NQUNfUFJPVE9DT0xfVkVSU0lPTiAwCisKKy8qIEZyYW1lIFR5cGUgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBTSVJfTUFDX01HTVRfRlJBTUUgICAgMHgwCisjZGVmaW5lIFNJUl9NQUNfQ1RSTF9GUkFNRSAgICAweDEKKyNkZWZpbmUgU0lSX01BQ19EQVRBX0ZSQU1FICAgIDB4MgorCisjZGVmaW5lIFNJUl9NQUNfRlJBTUVfVFlQRV9TVEFSVCAgIDB4MAorI2RlZmluZSBTSVJfTUFDX0ZSQU1FX1RZUEVfRU5EICAgICAweDMKKworLyogQ29udHJvbCBmcmFtZSBzdWJ0eXBlIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgU0lSX01BQ19DVFJMX1JSICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX0NUUkxfQkFSICAgICAgICA4CisjZGVmaW5lIFNJUl9NQUNfQ1RSTF9CQSAgICAgICAgIDkKKyNkZWZpbmUgU0lSX01BQ19DVFJMX1BTX1BPTEwgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19DVFJMX1JUUyAgICAgICAgMTEKKyNkZWZpbmUgU0lSX01BQ19DVFJMX0NUUyAgICAgICAgMTIKKyNkZWZpbmUgU0lSX01BQ19DVFJMX0FDSyAgICAgICAgMTMKKyNkZWZpbmUgU0lSX01BQ19DVFJMX0NGX0VORCAgICAgMTQKKyNkZWZpbmUgU0lSX01BQ19DVFJMX0NGX0VORF9BQ0sgMTUKKworI2RlZmluZSBTSVJfTUFDX01BWF9EVVJBVElPTl9NSUNST19TRUNPTkRTICAgICAgIDMyNzY3CisKKy8qIERhdGEgZnJhbWUgc3VidHlwZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTSVJfTUFDX0RBVEFfREFUQSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX0RBVEFfREFUQV9BQ0sgICAgICAgICAgICAgMQorI2RlZmluZSBTSVJfTUFDX0RBVEFfREFUQV9QT0xMICAgICAgICAgICAgMgorI2RlZmluZSBTSVJfTUFDX0RBVEFfREFUQV9BQ0tfUE9MTCAgICAgICAgMworI2RlZmluZSBTSVJfTUFDX0RBVEFfTlVMTCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX0RBVEFfTlVMTF9BQ0sgICAgICAgICAgICAgNQorI2RlZmluZSBTSVJfTUFDX0RBVEFfTlVMTF9QT0xMICAgICAgICAgICAgNgorI2RlZmluZSBTSVJfTUFDX0RBVEFfTlVMTF9BQ0tfUE9MTCAgICAgICAgNworI2RlZmluZSBTSVJfTUFDX0RBVEFfUU9TX0RBVEEgICAgICAgICAgICAgOAorI2RlZmluZSBTSVJfTUFDX0RBVEFfUU9TX0RBVEFfQUNLICAgICAgICAgOQorI2RlZmluZSBTSVJfTUFDX0RBVEFfUU9TX0RBVEFfUE9MTCAgICAgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19EQVRBX1FPU19EQVRBX0FDS19QT0xMICAgIDExCisjZGVmaW5lIFNJUl9NQUNfREFUQV9RT1NfTlVMTCAgICAgICAgICAgICAxMgorI2RlZmluZSBTSVJfTUFDX0RBVEFfUU9TX05VTExfQUNLICAgICAgICAgMTMKKyNkZWZpbmUgU0lSX01BQ19EQVRBX1FPU19OVUxMX1BPTEwgICAgICAgIDE0CisjZGVmaW5lIFNJUl9NQUNfREFUQV9RT1NfTlVMTF9BQ0tfUE9MTCAgICAxNQorCisjZGVmaW5lIFNJUl9NQUNfRlJBTUVfU1VCVFlQRV9TVEFSVCAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfRlJBTUVfU1VCVFlQRV9FTkQgICAgICAgICAxNgorCisjZGVmaW5lIFNJUl9NQUNfREFUQV9RT1NfTUFTSyAgICAgICAgICAgICA4CisjZGVmaW5lIFNJUl9NQUNfREFUQV9OVUxMX01BU0sgICAgICAgICAgICA0CisjZGVmaW5lIFNJUl9NQUNfREFUQV9QT0xMX01BU0sgICAgICAgICAgICAyCisjZGVmaW5lIFNJUl9NQUNfREFUQV9BQ0tfTUFTSyAgICAgICAgICAgICAxCisKKy8qIE1hbmFnZW1lbnQgZnJhbWUgc3VidHlwZSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIFNJUl9NQUNfTUdNVF9BU1NPQ19SRVEgICAgMHgwCisjZGVmaW5lIFNJUl9NQUNfTUdNVF9BU1NPQ19SU1AgICAgMHgxCisjZGVmaW5lIFNJUl9NQUNfTUdNVF9SRUFTU09DX1JFUSAgMHgyCisjZGVmaW5lIFNJUl9NQUNfTUdNVF9SRUFTU09DX1JTUCAgMHgzCisjZGVmaW5lIFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEgICAgMHg0CisjZGVmaW5lIFNJUl9NQUNfTUdNVF9QUk9CRV9SU1AgICAgMHg1CisjZGVmaW5lIFNJUl9NQUNfTUdNVF9USU1FX0FEVkVSVCAgMHg2CisjZGVmaW5lIFNJUl9NQUNfTUdNVF9CRUFDT04gICAgICAgMHg4CisjZGVmaW5lIFNJUl9NQUNfTUdNVF9BVElNICAgICAgICAgMHg5CisjZGVmaW5lIFNJUl9NQUNfTUdNVF9ESVNBU1NPQyAgICAgMHhBCisjZGVmaW5lIFNJUl9NQUNfTUdNVF9BVVRIICAgICAgICAgMHhCCisjZGVmaW5lIFNJUl9NQUNfTUdNVF9ERUFVVEggICAgICAgMHhDCisjZGVmaW5lIFNJUl9NQUNfTUdNVF9BQ1RJT04gICAgICAgMHhECisjZGVmaW5lIFNJUl9NQUNfTUdNVF9SRVNFUlZFRDE1ICAgMHhGCisKKy8qIEFjdGlvbiBmcmFtZSBjYXRlZ29yaWVzICovCisKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fU1BFQ1RSVU1fTUdNVCAgIDAKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fUU9TX01HTVQgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fRExQICAgICAgICAgICAgIDIKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fUFVCTElDX1VTQUdFICAgIDQKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fUlJNICAgICAgICAgICAgIDUKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fRkFTVF9CU1NfVFJOU1QgIDYKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fSFQgICAgICAgICAgICAgIDcKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fU0FfUVVFUlkgICAgICAgIDgKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fUFJPVF9EVUFMX1BVQiAgIDkKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fV05NICAgICAgICAgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fVU5QUk9UX1dOTSAgICAgMTEKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fVERMUyAgICAgICAgICAgMTIKKyNkZWZpbmUgU0lSX01BQ19BQ0lUT05fTUVTSCAgICAgICAgICAgMTMKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fTUhGICAgICAgICAgICAgMTQKKyNkZWZpbmUgU0lSX01BQ19TRUxGX1BST1RFQ1RFRCAgICAgICAgMTUKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fV01FICAgICAgICAgICAgMTcKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fVkhUICAgICAgICAgICAgMjEKKworLyogUW9TIG1hbmFnZW1lbnQgYWN0aW9uIGNvZGVzICovCisKKyNkZWZpbmUgU0lSX01BQ19RT1NfQUREX1RTX1JFUSAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19RT1NfQUREX1RTX1JTUCAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19RT1NfREVMX1RTX1JFUSAgICAgIDIKKyNkZWZpbmUgU0lSX01BQ19RT1NfU0NIRURVTEUgICAgICAgIDMKKyNkZWZpbmUgU0lSX01BQ19RT1NfTUFQX0NPTkZJR1VSRSAgIDQKKy8qIGFuZCB0aGVzZSBhcmUgcHJvcHJpZXRhcnkgKi8KKyNkZWZpbmUgU0lSX01BQ19RT1NfREVGX0JBX1JFUSAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19RT1NfREVGX0JBX1JTUCAgICAgIDUKKworI2lmZGVmIEFOSV9TVVBQT1JUXzExSAorI2RlZmluZSBTSVJfTUFDX0FDVElPTl9NRUFTVVJFX1JFUVVFU1RfSUQgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfQUNUSU9OX01FQVNVUkVfUkVQT1JUX0lEICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fVFBDX1JFUVVFU1RfSUQgICAgICAgICAgMgorI2RlZmluZSBTSVJfTUFDX0FDVElPTl9UUENfUkVQT1JUX0lEICAgICAgICAgICAzCisjZW5kaWYgLyogQU5JX1NVUFBPUlRfMTFIICovCisjZGVmaW5lIFNJUl9NQUNfQUNUSU9OX0NIQU5ORUxfU1dJVENIX0lEICAgICAgIDQKKworI2lmZGVmIEFOSV9TVVBQT1JUXzExSAorI2RlZmluZSBTSVJfTUFDX0JBU0lDX01FQVNVUkVNRU5UX1RZUEUgICAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfQ0NBX01FQVNVUkVNRU5UX1RZUEUgICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19SUElfTUVBU1VSRU1FTlRfVFlQRSAgICAgICAgICAgMgorI2VuZGlmIC8qIEFOSV9TVVBQT1JUXzExSCAqLworCisvKiBSUk0gcmVsYXRlZC4gKi8KKy8qIFJlZmVyIElFRUUgU3RkIDgwMi4xMWstMjAwOCwgU2VjdGlvbiA3LjMuMi4yMSwgdGFibGUgNy4yOSAqLworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCisjZGVmaW5lIFNJUl9NQUNfUlJNX0NIQU5ORUxfTE9BRF9UWVBFICAgICAgICAgIDMKKyNkZWZpbmUgU0lSX01BQ19SUk1fTk9JU0VfSElTVE9HUkFNX0JFQUNPTiAgICAgNAorI2RlZmluZSBTSVJfTUFDX1JSTV9CRUFDT05fVFlQRSAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNJUl9NQUNfUlJNX0ZSQU1FX1RZUEUgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU0lSX01BQ19SUk1fU1RBX1NUQVRJU1RJQ1NfVFlQRSAgICAgICAgNworI2RlZmluZSBTSVJfTUFDX1JSTV9MQ0lfVFlQRSAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFNJUl9NQUNfUlJNX1RTTV9UWVBFICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgU0lSX01BQ19SUk1fTE9DQVRJT05fQ0lWSUNfVFlQRSAgICAgICAgMTEKKyNkZWZpbmUgU0lSX01BQ19SUk1fRklORV9USU1FX01FQVNfVFlQRSAgICAgICAgMTYKKworLyogUlJNIGFjdGlvbiBjb2RlcyAqLworI2RlZmluZSBTSVJfTUFDX1JSTV9SQURJT19NRUFTVVJFX1JFUSAgICAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfUlJNX1JBRElPX01FQVNVUkVfUlBUICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19SUk1fTElOS19NRUFTVVJFTUVOVF9SRVEgICAgICAgMgorI2RlZmluZSBTSVJfTUFDX1JSTV9MSU5LX01FQVNVUkVNRU5UX1JQVCAgICAgICAzCisjZGVmaW5lIFNJUl9NQUNfUlJNX05FSUdIQk9SX1JFUSAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19SUk1fTkVJR0hCT1JfUlBUICAgICAgICAgICAgICAgNQorCisjZW5kaWYKKworLyogVkhUIEFjdGlvbiBGaWVsZCAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisjZGVmaW5lIFNJUl9NQUNfVkhUX0dJRF9OT1RJRklDQVRJT04gICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19WSFRfT1BNT0RFX05PVElGSUNBVElPTiAgICAgICAgMgorI2VuZGlmCisKKyNkZWZpbmUgTlVNX09GX1NPVU5ESU5HX0RJTUVOU0lPTlMJMSAvKk5zcyAtIDEsIChOc3MgPSAyIGZvciAyeDIpKi8KKy8qIEhUIEFjdGlvbiBGaWVsZCBDb2RlcyAqLworI2RlZmluZSBTSVJfTUFDX1NNX1BPV0VSX1NBVkUgICAgICAgMQorCisvKiBETFAgYWN0aW9uIGZyYW1lIHR5cGVzICovCisjZGVmaW5lIFNJUl9NQUNfRExQX1JFUSAgICAgICAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfRExQX1JTUCAgICAgICAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfRExQX1RFQVJET1dOICAgICAgICAyCisKKy8qIGJsb2NrIGFja25vd2xlZGdlbWVudCBhY3Rpb24gZnJhbWUgdHlwZXMgKi8KKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fVkVORE9SX1NQRUNJRklDIDkKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fVkVORE9SX1NQRUNJRklDX0NBVEVHT1JZICAgICAweDdGCisjZGVmaW5lIFNJUl9NQUNfQUNUSU9OX1AyUF9TVUJUWVBFX1BSRVNFTkNFX1JTUCAgICAgMgorCisvKiBQdWJsaWMgQWN0aW9uIGZvciAyMC80MCBCU1MgQ29leGlzdGVuY2UgKi8KKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fMjA0MF9CU1NfQ09FWElTVEVOQ0UgICAgIDAKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKy8qIDExdyBTQSBxdWVyeSByZXF1ZXN0L3Jlc3BvbnNlIGFjdGlvbiBmcmFtZSBjYXRlZ29yeSBjb2RlICovCisjZGVmaW5lIFNJUl9NQUNfU0FfUVVFUllfUkVRICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19TQV9RVUVSWV9SU1AgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworI2RlZmluZSBTSVJfTUFDX1RETFNfU0VUVVBfUkVRICAgICAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfVERMU19TRVRVUF9SU1AgICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19URExTX1NFVFVQX0NORiAgICAgICAgICAgMgorI2RlZmluZSBTSVJfTUFDX1RETFNfVEVBUkRPV04gICAgICAgICAgICAzCisjZGVmaW5lIFNJUl9NQUNfVERMU19QRUVSX1RSQUZGSUNfSU5EICAgIDQKKyNkZWZpbmUgU0lSX01BQ19URExTX0NIX1NXSVRDSF9SRVEgICAgICAgNQorI2RlZmluZSBTSVJfTUFDX1RETFNfQ0hfU1dJVENIX1JTUCAgICAgICA2CisjZGVmaW5lIFNJUl9NQUNfVERMU19QRUVSX1RSQUZGSUNfUlNQICAgIDkKKyNkZWZpbmUgU0lSX01BQ19URExTX0RJU19SRVEgICAgICAgICAgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19URExTX0RJU19SU1AgICAgICAgICAgICAgMTQKKyNlbmRpZgorCisvKiBXTk0gQWN0aW9uIGZpZWxkIHZhbHVlczsgSUVFRSBTdGQgODAyLjExLTIwMTIsIDguNS4xNC4xLCBUYWJsZSA4LTI1MCAqLworI2RlZmluZSBTSVJfTUFDX1dOTV9CU1NfVE1fUVVFUlkgICAgICAgICA2CisjZGVmaW5lIFNJUl9NQUNfV05NX0JTU19UTV9SRVFVRVNUICAgICAgIDcKKyNkZWZpbmUgU0lSX01BQ19XTk1fQlNTX1RNX1JFU1BPTlNFICAgICAgOAorI2RlZmluZSBTSVJfTUFDX1dOTV9OT1RJRl9SRVFVRVNUICAgICAgICAyNgorI2RlZmluZSBTSVJfTUFDX1dOTV9OT1RJRl9SRVNQT05TRSAgICAgICAyNworCisjZGVmaW5lIFNJUl9NQUNfTUFYX1JBTkRPTV9MRU5HVEggICAyMzA2CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBFSUQgKEVsZW1lbnQgSUQpIGRlZmluaXRpb25zICovCisvKiBhbmQgdGhlaXIgbWluL21heCBsZW5ndGhzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNJUl9NQUNfU1NJRF9FSUQgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfU1NJRF9FSURfTUlOICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX1NTSURfRUlEX01BWCAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFNJUl9NQUNfUkFURVNFVF9FSUQgICAgICAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfUkFURVNFVF9FSURfTUlOICAgICAgICAgICAgMQorI2RlZmluZSBTSVJfTUFDX1JBVEVTRVRfRUlEX01BWCAgICAgICAgICAgIDEyCisjZGVmaW5lIFNJUl9NQUNfRkhfUEFSQU1fU0VUX0VJRCAgICAgICAyCisjZGVmaW5lIFNJUl9NQUNfRkhfUEFSQU1fU0VUX0VJRF9NSU4gICAgICAgNQorI2RlZmluZSBTSVJfTUFDX0ZIX1BBUkFNX1NFVF9FSURfTUFYICAgICAgIDUKKyNkZWZpbmUgU0lSX01BQ19EU19QQVJBTV9TRVRfRUlEICAgICAgIDMKKyNkZWZpbmUgU0lSX01BQ19EU19QQVJBTV9TRVRfRUlEX01JTiAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfRFNfUEFSQU1fU0VUX0VJRF9NQVggICAgICAgMQorI2RlZmluZSBTSVJfTUFDX0NGX1BBUkFNX1NFVF9FSUQgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX0NGX1BBUkFNX1NFVF9FSURfTUlOICAgICAgIDYKKyNkZWZpbmUgU0lSX01BQ19DRl9QQVJBTV9TRVRfRUlEX01BWCAgICAgICA2CisjZGVmaW5lIFNJUl9NQUNfVElNX0VJRCAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNJUl9NQUNfVElNX0VJRF9NSU4gICAgICAgICAgICAgICAgMworI2RlZmluZSBTSVJfTUFDX1RJTV9FSURfTUFYICAgICAgICAgICAgICAgIDI1NAorI2RlZmluZSBTSVJfTUFDX0lCU1NfUEFSQU1fU0VUX0VJRCAgICAgNgorI2RlZmluZSBTSVJfTUFDX0lCU1NfUEFSQU1fU0VUX0VJRF9NSU4gICAgIDIKKyNkZWZpbmUgU0lSX01BQ19JQlNTX1BBUkFNX1NFVF9FSURfTUFYICAgICAyCisjZGVmaW5lIFNJUl9NQUNfQ09VTlRSWV9FSUQgICAgICAgICAgICA3CisjZGVmaW5lIFNJUl9NQUNfQ09VTlRSWV9FSURfTUlOICAgICAgICAgICAgNgorI2RlZmluZSBTSVJfTUFDX0NPVU5UUllfRUlEX01BWCAgICAgICAgICAgIDI1NAorI2RlZmluZSBTSVJfTUFDX0ZIX1BBUkFNU19FSUQgICAgICAgICAgOAorI2RlZmluZSBTSVJfTUFDX0ZIX1BBUkFNU19FSURfTUlOICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19GSF9QQVJBTVNfRUlEX01BWCAgICAgICAgICA0CisjZGVmaW5lIFNJUl9NQUNfRkhfUEFUVEVSTl9FSUQgICAgICAgICA5CisjZGVmaW5lIFNJUl9NQUNfRkhfUEFUVEVSTl9FSURfTUlOICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX0ZIX1BBVFRFUk5fRUlEX01BWCAgICAgICAgIDI1NAorI2RlZmluZSBTSVJfTUFDX1JFUVVFU1RfRUlEICAgICAgICAgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19SRVFVRVNUX0VJRF9NSU4gICAgICAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfUkVRVUVTVF9FSURfTUFYICAgICAgICAgICAgMjU1CisjZGVmaW5lIFNJUl9NQUNfUUJTU19MT0FEX0VJRCAgICAgICAgICAxMQorI2RlZmluZSBTSVJfTUFDX1FCU1NfTE9BRF9FSURfTUlOICAgICAgICAgIDUKKyNkZWZpbmUgU0lSX01BQ19RQlNTX0xPQURfRUlEX01BWCAgICAgICAgICA1CisjZGVmaW5lIFNJUl9NQUNfRURDQV9QQVJBTV9TRVRfRUlEICAgICAxMiAgICAgICAvKiBFRENBIHBhcmFtZXRlciBzZXQgKi8KKyNkZWZpbmUgU0lSX01BQ19FRENBX1BBUkFNX1NFVF9FSURfTUlOICAgICAxOAorI2RlZmluZSBTSVJfTUFDX0VEQ0FfUEFSQU1fU0VUX0VJRF9NQVggICAgIDIwICAgLyogVEJEIHRlbXAgLSBjaGFuZ2UgYmFja3RvIDE4ICovCisjZGVmaW5lIFNJUl9NQUNfVFNQRUNfRUlEICAgICAgICAgICAgICAxMworI2RlZmluZSBTSVJfTUFDX1RTUEVDX0VJRF9NSU4gICAgICAgICAgICAgIDU1CisjZGVmaW5lIFNJUl9NQUNfVFNQRUNfRUlEX01BWCAgICAgICAgICAgICAgNTUKKyNkZWZpbmUgU0lSX01BQ19UQ0xBU19FSUQgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNJUl9NQUNfVENMQVNfRUlEX01JTiAgICAgICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX1RDTEFTX0VJRF9NQVggICAgICAgICAgICAgIDI1NQorI2RlZmluZSBTSVJfTUFDX1FPU19TQ0hFRFVMRV9FSUQgICAgICAgMTUKKyNkZWZpbmUgU0lSX01BQ19RT1NfU0NIRURVTEVfRUlEX01JTiAgICAgICAxNAorI2RlZmluZSBTSVJfTUFDX1FPU19TQ0hFRFVMRV9FSURfTUFYICAgICAgIDE0CisjZGVmaW5lIFNJUl9NQUNfQ0hBTExFTkdFX1RFWFRfRUlEICAgICAxNgorI2RlZmluZSBTSVJfTUFDX0NIQUxMRU5HRV9URVhUX0VJRF9NSU4gICAgIDEKKyNkZWZpbmUgU0lSX01BQ19DSEFMTEVOR0VfVEVYVF9FSURfTUFYICAgICAyNTMKKy8qIHJlc2VydmVkICAgICAgIDE3LTMxICovCisjZGVmaW5lIFNJUl9NQUNfUFdSX0NPTlNUUkFJTlRfRUlEICAgICAzMgorI2RlZmluZSBTSVJfTUFDX1BXUl9DT05TVFJBSU5UX0VJRF9NSU4gICAgIDEKKyNkZWZpbmUgU0lSX01BQ19QV1JfQ09OU1RSQUlOVF9FSURfTUFYICAgICAxCisjZGVmaW5lIFNJUl9NQUNfUFdSX0NBUEFCSUxJVFlfRUlEICAgICAzMworI2RlZmluZSBTSVJfTUFDX1BXUl9DQVBBQklMSVRZX0VJRF9NSU4gICAgIDIKKyNkZWZpbmUgU0lSX01BQ19QV1JfQ0FQQUJJTElUWV9FSURfTUFYICAgICAyCisjZGVmaW5lIFNJUl9NQUNfVFBDX1JFUV9FSUQgICAgICAgICAgICAzNAorI2RlZmluZSBTSVJfTUFDX1RQQ19SRVFfRUlEX01JTiAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19UUENfUkVRX0VJRF9NQVggICAgICAgICAgICAyNTUKKy8qIFNJUl9NQUNfRVhURU5ERURfQ0FQX0VJRCAgICAzNSAqLworI2RlZmluZSBTSVJfTUFDX1RQQ19SUFRfRUlEICAgICAgICAgICAgMzUKKyNkZWZpbmUgU0lSX01BQ19UUENfUlBUX0VJRF9NSU4gICAgICAgICAgICAyCisjZGVmaW5lIFNJUl9NQUNfVFBDX1JQVF9FSURfTUFYICAgICAgICAgICAgMgorI2RlZmluZSBTSVJfTUFDX1NQUlREX0NITkxTX0VJRCAgICAgICAgMzYKKyNkZWZpbmUgU0lSX01BQ19TUFJURF9DSE5MU19FSURfTUlOICAgICAgICAyCisjZGVmaW5lIFNJUl9NQUNfU1BSVERfQ0hOTFNfRUlEX01BWCAgICAgICAgMjU0CisjZGVmaW5lIFNJUl9NQUNfQ0hOTF9TV0lUQ0hfQU5OX0VJRCAgICAzNworI2RlZmluZSBTSVJfTUFDX0NITkxfU1dJVENIX0FOTl9FSURfTUlOICAgIDMKKyNkZWZpbmUgU0lSX01BQ19DSE5MX1NXSVRDSF9BTk5fRUlEX01BWCAgICAzCisjZGVmaW5lIFNJUl9NQUNfTUVBU19SRVFfRUlEICAgICAgICAgICAzOAorI2RlZmluZSBTSVJfTUFDX01FQVNfUkVRX0VJRF9NSU4gICAgICAgICAgIDMKKyNkZWZpbmUgU0lSX01BQ19NRUFTX1JFUV9FSURfTUFYICAgICAgICAgICAyNTUKKyNkZWZpbmUgU0lSX01BQ19NRUFTX1JQVF9FSUQgICAgICAgICAgIDM5CisjZGVmaW5lIFNJUl9NQUNfTUVBU19SUFRfRUlEX01JTiAgICAgICAgICAgMworI2RlZmluZSBTSVJfTUFDX01FQVNfUlBUX0VJRF9NQVggICAgICAgICAgIDI1NQorI2RlZmluZSBTSVJfTUFDX1FVSUVUX0VJRCAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgU0lSX01BQ19RVUlFVF9FSURfTUlOICAgICAgICAgICAgICA2CisjZGVmaW5lIFNJUl9NQUNfUVVJRVRfRUlEX01BWCAgICAgICAgICAgICAgNgorI2RlZmluZSBTSVJfTUFDX0lCU1NfREZTX0VJRCAgICAgICAgICAgNDEKKyNkZWZpbmUgU0lSX01BQ19JQlNTX0RGU19FSURfTUlOICAgICAgICAgICA3CisjZGVmaW5lIFNJUl9NQUNfSUJTU19ERlNfRUlEX01BWCAgICAgICAgICAgMjU1CisjZGVmaW5lIFNJUl9NQUNfRVJQX0lORk9fRUlEICAgICAgICAgICA0MgorI2RlZmluZSBTSVJfTUFDX0VSUF9JTkZPX0VJRF9NSU4gICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19FUlBfSU5GT19FSURfTUFYICAgICAgICAgICAyNTUKKyNkZWZpbmUgU0lSX01BQ19UU19ERUxBWV9FSUQgICAgICAgICAgIDQzCisjZGVmaW5lIFNJUl9NQUNfVFNfREVMQVlfRUlEX01JTiAgICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX1RTX0RFTEFZX0VJRF9NQVggICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19UQ0xBU19QUk9DX0VJRCAgICAgICAgIDQ0CisjZGVmaW5lIFNJUl9NQUNfVENMQVNfUFJPQ19FSURfTUlOICAgICAgICAgMQorI2RlZmluZSBTSVJfTUFDX1RDTEFTX1BST0NfRUlEX01BWCAgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19RT1NfQ0FQQUJJTElUWV9FSUQgICAgIDQ2CisjZGVmaW5lIFNJUl9NQUNfUU9TX0NBUEFCSUxJVFlfRUlEX01JTiAgICAgMQorI2RlZmluZSBTSVJfTUFDX1FPU19DQVBBQklMSVRZX0VJRF9NQVggICAgIDEKKyNkZWZpbmUgU0lSX01BQ19SU05fRUlEICAgICAgICAgICAgICAgIDQ4CisjZGVmaW5lIFNJUl9NQUNfUlNOX0VJRF9NSU4gICAgICAgICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX1JTTl9FSURfTUFYICAgICAgICAgICAgICAgIDI1NAorCisvKiB1c2luZyByZXNlcnZlZCBFSUQgZm9yIFFvcyBBY3Rpb24gSUUgZm9yIG5vdywgKi8KKy8qIG5lZWQgdG8gY2hlY2sgMTFlIHNwZWMgZm9yIHRoZSBhY3R1YWwgRUlEICovCisjZGVmaW5lIFNJUl9NQUNfUU9TX0FDVElPTl9FSUQgICAgICAgICA0OQorI2RlZmluZSBTSVJfTUFDX1FPU19BQ1RJT05fRUlEX01JTiAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19RT1NfQUNUSU9OX0VJRF9NQVggICAgICAgICAyNTUKKyNkZWZpbmUgU0lSX01BQ19FWFRFTkRFRF9SQVRFX0VJRCAgICAgIDUwCisjZGVmaW5lIFNJUl9NQUNfRVhURU5ERURfUkFURV9FSURfTUlOICAgICAgMAorI2RlZmluZSBTSVJfTUFDX0VYVEVOREVEX1JBVEVfRUlEX01BWCAgICAgIDI1NQorLyogcmVzZXJ2ZWQgICAgICAgNTEtNjkgKi8KKyNkZWZpbmUgU0lSX01BQ19STV9FTkFCTEVEX0NBUEFCSUxJVFlfRUlEICAgICAgNzAKKyNkZWZpbmUgU0lSX01BQ19STV9FTkFCTEVEX0NBUEFCSUxJVFlfRUlEX01JTiAgNQorI2RlZmluZSBTSVJfTUFDX1JNX0VOQUJMRURfQ0FQQUJJTElUWV9FSURfTUFYICA1CisvKiByZXNlcnZlZCAgICAgICA3MS0yMjAgKi8KKyNkZWZpbmUgU0lSX01BQ19XUEFfRUlEICAgICAgICAgICAgICAgIDIyMQorI2RlZmluZSBTSVJfTUFDX1dQQV9FSURfTUlOICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19XUEFfRUlEX01BWCAgICAgICAgICAgICAgICAyNTUKKworI2RlZmluZSBTSVJfTUFDX0VJRF9WRU5ET1IgICAgICAgICAgICAgICAgMjIxCisKKyNkZWZpbmUgU0lSX01BQ19XQVBJX0VJRCAgICAgICAgICAgICAgICA2OAorLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIyLTI1NCAqLworI2RlZmluZSBTSVJfTUFDX0hUX0NBUEFCSUxJVElFU19FSUQgICAgNDUKKyNkZWZpbmUgU0lSX01BQ19IVF9DQVBBQklMSVRJRVNfRUlEX01JTiAgICAwCisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQQUJJTElUSUVTX0VJRF9NQVggICAgMjU1CisjZGVmaW5lIFNJUl9NQUNfSFRfSU5GT19FSUQgICAgICA2MQorI2RlZmluZSBTSVJfTUFDX0hUX0lORk9fRUlEX01JTiAgICAwCisjZGVmaW5lIFNJUl9NQUNfSFRfSU5GT19FSURfTUFYICAgIDI1NQorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKyNkZWZpbmUgU0lSX01BQ19WSFRfQ0FQQUJJTElUSUVTX0VJRCAgIDE5MQorI2RlZmluZSBTSVJfTUFDX1ZIVF9PUEVSQVRJT05fRUlEICAgICAgMTkyCisjZGVmaW5lIFNJUl9NQUNfVkhUX0VYVF9CU1NfTE9BRF9FSUQgICAxOTMKKyNkZWZpbmUgU0lSX01BQ19WSFRfT1BNT0RFX0VJRCAgICAgICAgIDE5OQorI2VuZGlmCisjZGVmaW5lIFNJUl9NQUNfTUFYX1NVUFBPUlRFRF9NQ1NfU0VUICAgIDE2CisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKyNkZWZpbmUgU0lSX01BQ19RQ09NX1ZFTkRPUl9FSUQgICAgICAyMDAKKyNkZWZpbmUgU0lSX01BQ19RQ09NX1ZFTkRPUl9PVUkgICAgICAiXHgwMFx4QTBceEM2IgorI2RlZmluZSBTSVJfTUFDX1FDT01fVkVORE9SX1NJWkUgICAgIDMKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKworLyogLyBXb3JrYXJvdW5kIElFIHRvIGNoYW5nZSBiZWFjb24gbGVuZ3RoIHdoZW4gaXQgaXMgNCpuKzEgKi8KKyNkZWZpbmUgU0lSX01BQ19BTklfV09SS0FST1VORF9FSUQgICAgIDI1NQorI2RlZmluZSBTSVJfTUFDX0FOSV9XT1JLQVJPVU5EX0VJRF9NSU4gICAgIDAKKyNkZWZpbmUgU0lSX01BQ19BTklfV09SS0FST1VORF9FSURfTUFYICAgICAyNTUKKworI2RlZmluZSBTSVJfTUFDX01BWF9BRERfSUVfTEVOR1RIICAgICAgIDUwMAorCisvKiAvIE1heGltdW0gbGVuZ3RoIG9mIGVhY2ggSUUgKi8KKyNkZWZpbmUgU0lSX01BQ19NQVhfSUVfTEVOR1RIICAgICAgIDI1NQorCisvKiAvIE1heGltdW0gbGVuZ3RoIG9mIGVhY2ggSUUgKi8KKyNkZWZpbmUgU0lSX01BQ19SU05fSUVfTUFYX0xFTkdUSCAgIDI1NQorI2RlZmluZSBTSVJfTUFDX1dQQV9JRV9NQVhfTEVOR1RIICAgMjU1CisvKiAvIE1pbmltdW0gbGVuZ3RoIG9mIGVhY2ggSUUgKi8KKyNkZWZpbmUgU0lSX01BQ19SU05fSUVfTUlOX0xFTkdUSCAgIDIKKyNkZWZpbmUgU0lSX01BQ19XUEFfSUVfTUlOX0xFTkdUSCAgIDYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKyNkZWZpbmUgRVNFX1ZFUlNJT05fNCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgRVNFX1ZFUlNJT05fU1VQUE9SVEVEICAgICAgIEVTRV9WRVJTSU9OXzQKKworLyogV2hlbiBzdGF0aW9uIHNlbmRzIFJhZGlvIE1hbmFnZW1lbnQgQ2FwLiAqLworLyogU3RhdGUgc2hvdWxkIGJlIG5vcm1hbD0xICovCisvKiBNYnNzaWQgTWFzayBzaG91bGQgYmUgMCAqLworI2RlZmluZSBSTV9TVEFURV9OT1JNQUwgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNkZWZpbmUgU0lSX01BQ19PVUlfVkVSU0lPTl8xICAgICAgICAgMQorCisvKiBPVUkgYW5kIHR5cGUgZGVmaW5pdGlvbiBmb3IgV1BBIElFIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworI2RlZmluZSBTSVJfTUFDX1dQQV9PVUkgICAgICAgICAgICAgMHgwMUYyNTAwMAorI2RlZmluZSBTSVJfTUFDX1dNRV9PVUkgICAgICAgICAgICAgMHgwMkYyNTAwMAorI2RlZmluZSBTSVJfTUFDX1dTTV9PVUkgICAgICAgICAgICAgU0lSX01BQ19XTUVfT1VJCisjZGVmaW5lIFNJUl9NQUNfV1NDX09VSSAgICAgICAgICAgICAiXHgwMFx4NTBceGYyXHgwNCIKKyNkZWZpbmUgU0lSX01BQ19XU0NfT1VJX1NJWkUgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19QMlBfT1VJICAgICAgICAgICAgICJceDUwXHg2Zlx4OWFceDA5IgorI2RlZmluZSBTSVJfTUFDX1AyUF9PVUlfU0laRSAgICAgICAgNAorI2RlZmluZSBTSVJfUDJQX05PQV9BVFRSICAgICAgICAgICAgMTIKKyNkZWZpbmUgU0lSX01BWF9OT0FfQVRUUl9MRU4gICAgICAgIDMxCisjZGVmaW5lIFNJUl9NQVhfTk9BX0RFU0NSICAgICAgICAgICAyCisjZGVmaW5lIFNJUl9QMlBfSUVfSEVBREVSX0xFTiAgICAgICA2CisKKyNkZWZpbmUgU0lSX01BQ19DSVNDT19PVUkgIlx4MDBceDQwXHg5NiIKKyNkZWZpbmUgU0lSX01BQ19DSVNDT19PVUlfU0laRSAzCisKKy8qIG1pbiBzaXplIG9mIHdtZSBvdWkgaGVhZGVyOiBvdWkoMykgKyB0eXBlICsgc3VidHlwZSArIHZlcnNpb24gKi8KKyNkZWZpbmUgU0lSX01BQ19PVUlfV01FX0hEUl9NSU4gICAgICAgNgorCisvKiBPVUkgc3VidHlwZSBhbmQgdGhlaXIgbGVuZ3RocyAqLworI2RlZmluZSBTSVJfTUFDX09VSV9TVUJUWVBFX1dNRV9JTkZPICAwCisjZGVmaW5lIFNJUl9NQUNfT1VJX1dNRV9JTkZPX01JTiAgICAgIDcKKyNkZWZpbmUgU0lSX01BQ19PVUlfV01FX0lORk9fTUFYICAgICAgNworCisjZGVmaW5lIFNJUl9NQUNfT1VJX1NVQlRZUEVfV01FX1BBUkFNIDEKKyNkZWZpbmUgU0lSX01BQ19PVUlfV01FX1BBUkFNX01JTiAgICAgMjQKKyNkZWZpbmUgU0lSX01BQ19PVUlfV01FX1BBUkFNX01BWCAgICAgMjQKKworI2RlZmluZSBTSVJfTUFDX09VSV9TVUJUWVBFX1dNRV9UU1BFQyAyCisjZGVmaW5lIFNJUl9NQUNfT1VJX1dNRV9UU1BFQ19NSU4gICAgIDYxCisjZGVmaW5lIFNJUl9NQUNfT1VJX1dNRV9UU1BFQ19NQVggICAgIDYxCisKKyNkZWZpbmUgU0lSX01BQ19PVUlfU1VCVFlQRV9XU01fVFNQRUMgMiAvKiBzYW1lIGFzIFdNRSBUU1BFQyAqLworI2RlZmluZSBTSVJfTUFDX09VSV9XU01fVFNQRUNfTUlOICAgICA2MQorI2RlZmluZSBTSVJfTUFDX09VSV9XU01fVFNQRUNfTUFYICAgICA2MQorCisvKiByZXNlcnZlZCBzdWJ0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgIDMtNCAqLworLyogV1NNIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgU0lSX01BQ19PVUlfU1VCVFlQRV9XU01fQ0FQQUJMRSAgICAgNQorI2RlZmluZSBTSVJfTUFDX09VSV9XU01fQ0FQQUJMRV9NSU4gICAgICAgICA3CisjZGVmaW5lIFNJUl9NQUNfT1VJX1dTTV9DQVBBQkxFX01BWCAgICAgICAgIDcKKy8qIFdTTSBjbGFzc2lmaWVyICovCisjZGVmaW5lIFNJUl9NQUNfT1VJX1NVQlRZUEVfV1NNX1RDTEFTICAgICAgIDYKKyNkZWZpbmUgU0lSX01BQ19PVUlfV1NNX1RDTEFTX01JTiAgICAgICAgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19PVUlfV1NNX1RDTEFTX01BWCAgICAgICAgICAgMjU1CisvKiBjbGFzc2lmaWVyIHByb2Nlc3NpbmcgZWxlbWVudCAqLworI2RlZmluZSBTSVJfTUFDX09VSV9TVUJUWVBFX1dTTV9UQ0xBU1BST0MgICA3CisjZGVmaW5lIFNJUl9NQUNfT1VJX1dTTV9UQ0xBU1BST0NfTUlOICAgICAgIDcKKyNkZWZpbmUgU0lSX01BQ19PVUlfV1NNX1RDTEFTUFJPQ19NQVggICAgICAgNworLyogdHNwZWMgZGVsYXkgZWxlbWVudCAqLworI2RlZmluZSBTSVJfTUFDX09VSV9TVUJUWVBFX1dTTV9UU0RFTEFZICAgICA4CisjZGVmaW5lIFNJUl9NQUNfT1VJX1dTTV9UU0RFTEFZX01JTiAgICAgICAgIDEwCisjZGVmaW5lIFNJUl9NQUNfT1VJX1dTTV9UU0RFTEFZX01BWCAgICAgICAgIDEwCisvKiBzY2hlZHVsZSBlbGVtZW50ICovCisjZGVmaW5lIFNJUl9NQUNfT1VJX1NVQlRZUEVfV1NNX1NDSEVEVUxFICAgIDkKKyNkZWZpbmUgU0lSX01BQ19PVUlfV1NNX1NDSEVEVUxFX01JTiAgICAgICAgMjAKKyNkZWZpbmUgU0lSX01BQ19PVUlfV1NNX1NDSEVEVUxFX01BWCAgICAgICAgMjAKKworI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorI2RlZmluZSBTSVJfTUFDX05TX09GRkxPQURfU0laRSAgICAgICAgICAgICAxICAgLyogc3VwcG9ydCBvbmx5IG9uZSBJUHY2IG9mZmxvYWQgKi8KKy8qIE51bWJlciBvZiB0YXJnZXQgSVAgVjYgYWRkcmVzc2VzIGZvciBOUyBvZmZsb2FkICovCisjZGVmaW5lIFNJUl9NQUNfTlVNX1RBUkdFVF9JUFY2X05TX09GRkxPQURfTkEgICAxNgorI2RlZmluZSBTSVJfTUFDX0lQVjZfQUREUl9MRU4gICAgICAgICAgICAgICAxNgorI2RlZmluZSBTSVJfSVBWNl9BRERSX1ZBTElEICAgICAgICAgICAgICAgICAxCisjZW5kaWYgLyogV0xBTl9OU19PRkZMT0FEICovCisjZGVmaW5lIFNJUl9NQUNfQVJQX09GRkxPQURfU0laRSAgICAgICAgMQorCisvKiB0b3RhbCBsZW5ndGggb2YgYW4gSW5mbyBlbGVtZW50IGluY2x1ZGluZyBUL0wgZmllbGRzICovCisjZGVmaW5lIEVJRF9MRU4oZWlkKSAoMiArIChlaWQpKQorCisvKiBzdXBwb3J0IGZvciByYWRhciBEZXRlY3QsIENoYW5uZWwgU3dpdGNoICovCisjZGVmaW5lIENIQU5ORUxfU1dJVENIX01BWF9GUkFNRV9TSVpFICAgICAgICAgICAgICAgMjU2CisKKy8qIExlbmd0aCBvZiBDaGFubmVsIFN3aXRjaCByZWxhdGVkIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU0lSX1NNRV9DSEFOTkVMX1NXSVRDSF9TSVpFIFwKKwkoc2l6ZW9mKHVpbnQ4X3QpICsgMiAqIHNpemVvZih1aW50MTZfdCkgKyBzaXplb2YodWludDMyX3QpICtcCisJc2l6ZW9mKGVQaHlDaGFuQm9uZFN0YXRlKSkKKyNkZWZpbmUgU0lSX0NIQU5ORUxfU1dJVENIX0lFX1NJWkUgICAgICAgICBFSURfTEVOKFNJUl9NQUNfQ0hOTF9TV0lUQ0hfQU5OX0VJRF9NSU4pCisKKy8qIE1lYXN1cmVtZW50IFJlcXVlc3QvUmVwb3J0IG1lc3NhZ2VzICovCisjZGVmaW5lIFNJUl9NRUFTX1JFUV9GSUVMRF9TSVpFICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFNJUl9NRUFTX1JFUV9JRV9TSVpFICAgICAgICAgICAgICAgICAgICg1ICsgU0lSX01FQVNfUkVRX0ZJRUxEX1NJWkUpCisjZGVmaW5lIFNJUl9NRUFTX1JFUV9BQ1RJT05fRlJBTUVfU0laRSAgICAgICAgICgzICsgU0lSX01FQVNfUkVRX0lFX1NJWkUpCisjZGVmaW5lIFNJUl9NRUFTX01BWF9GUkFNRV9TSVpFICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBTSVJfTUVBU19SRVBPUlRfTUlOX0ZSQU1FX1NJWkUgICAgICAgICAoMyArIEVJRF9MRU4oU0lSX01BQ19NRUFTX1JQVF9FSURfTUlOKSkKKworI2RlZmluZSBTSVJfTUFDX1NFVF9NRUFTX1JFUV9FTkFCTEUoeCkgICAgICAgICAoKCh1aW50OF90KSB4KSB8IDIpCisjZGVmaW5lIFNJUl9NQUNfU0VUX01FQVNfUkVRX1JFUVVFU1QoeCkgICAgICAgICgoKHVpbnQ4X3QpIHgpIHwgNCkKKyNkZWZpbmUgU0lSX01BQ19TRVRfTUVBU19SRVFfUkVQT1JUKHgpICAgICAgICAgKCgodWludDhfdCkgeCkgfCA4KQorCisjZGVmaW5lIFNJUl9NQUNfU0VUX01FQVNfUkVQT1JUX0xBVEUoeCkgICAgICAgICgoKHVpbnQ4X3QpIHgpIHwgMSkKKyNkZWZpbmUgU0lSX01BQ19TRVRfTUVBU19SRVBPUlRfSU5DQVBBQkxFKHgpICAgKCgodWludDhfdCkgeCkgfCAyKQorI2RlZmluZSBTSVJfTUFDX1NFVF9NRUFTX1JFUE9SVF9SRUZVU0UoeCkgICAgICAoKCh1aW50OF90KSB4KSB8IDQpCisKKy8qIExlbmd0aCBvZiBUUEMgUmVxdWVzdCBBY3Rpb24gRnJhbWUgKi8KKyNkZWZpbmUgU0lSX1RQQ19SRVFfQUNUSU9OX0ZSQU1FX1NJWkUgICAgICAgICAgKDMgKyBFSURfTEVOKFNJUl9NQUNfVFBDX1JFUV9FSURfTUlOKSkKKyNkZWZpbmUgU0lSX1RQQ19SRVBPUlRfQUNUSU9OX0ZSQU1FX1NJWkUgICAgICAgKDMgKyBFSURfTEVOKFNJUl9NQUNfVFBDX1JQVF9FSURfTUlOKSkKKyNkZWZpbmUgU0lSX1RQQ19NQVhfRlJBTUVfU0laRSAgICAgICAgICAgICAgICAgMjU2CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBPRkZTRVQgZGVmaW5pdGlvbnMgZm9yIGZpeGVkIGZpZWxkcyBpbiBNYW5hZ2VtZW50IGZyYW1lcyAqLworCisvKiBCZWFjb24vUHJvYmUgUmVzcG9uc2Ugb2Zmc2V0cyAqLworI2RlZmluZSBTSVJfTUFDX1RTX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX0JFQUNPTl9JTlRfT0ZGU0VUICAgICAgICAgICAgOCAgLyogQmVhY29uIEludGVydmFsIG9mZnNldCAqLworI2RlZmluZSBTSVJfTUFDX0JfUFJfQ0FQQUJfT0ZGU0VUICAgICAgICAgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VUICAgICAgICAgICAgIDEyCisKKy8qIEFzc29jaWF0aW9uL1JlYXNzb2NpYXRpb24gb2Zmc2V0cyAqLworI2RlZmluZSBTSVJfTUFDX0FTU09DX0NBUEFCX09GRlNFVCAgICAgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX0xJU1RFTl9JTlRfT0ZGU0VUICAgICAgICAgICAgMiAgLyogTGlzdGVuIEludGVydmFsIG9mZnNldCAqLworI2RlZmluZSBTSVJfTUFDX0FTU09DX1NTSURfT0ZGU0VUICAgICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX0NVUlJFTlRfQVBfT0ZGU0VUICAgICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX1JFQVNTT0NfU1NJRF9PRkZTRVQgICAgICAgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19BU1NPQ19TVEFUVVNfQ09ERV9PRkZTRVQgICAgIDIKKyNkZWZpbmUgU0lSX01BQ19BU1NPQ19BSURfT0ZGU0VUICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19BU1NPQ19SU1BfUkFURV9PRkZTRVQgICAgICAgIDYKKworLyogRGlzYXNzb2NpYXRpb24vRGVhdXRoZW50aWNhdGlvbiBvZmZzZXRzICovCisjZGVmaW5lIFNJUl9NQUNfUkVBU09OX0NPREVfT0ZGU0VUICAgICAgICAgICAwCisKKy8qIFByb2JlIFJlcXVlc3Qgb2Zmc2V0ICovCisjZGVmaW5lIFNJUl9NQUNfUFJPQkVfUkVRX1NTSURfT0ZGU0VUICAgICAgICAwCisKKy8qIEF1dGhlbnRpY2F0aW9uIG9mZnNldHMgKi8KKyNkZWZpbmUgU0lSX01BQ19BVVRIX0FMR09fT0ZGU0VUICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19BVVRIX1hBQ1RfU0VRTlVNX09GRlNFVCAgICAgIDIKKyNkZWZpbmUgU0lSX01BQ19BVVRIX1NUQVRVU19DT0RFX09GRlNFVCAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9PRkZTRVQgICAgICAgIDYKKworLyogLyBUcmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgZGVmaW5pdGlvbnMgKHVzZWQgaW4gQXV0aGVudGljYXRpb24gZnJhbWVzKSAqLworI2RlZmluZSAgICBTSVJfTUFDX0FVVEhfRlJBTUVfMSAgICAgICAgMQorI2RlZmluZSAgICBTSVJfTUFDX0FVVEhfRlJBTUVfMiAgICAgICAgMgorI2RlZmluZSAgICBTSVJfTUFDX0FVVEhfRlJBTUVfMyAgICAgICAgMworI2RlZmluZSAgICBTSVJfTUFDX0FVVEhfRlJBTUVfNCAgICAgICAgNAorCisvKiAvIFByb3RvY29sIGRlZmluZWQgTUFYIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNJUl9NQUNfTUFYX1NTSURfTEVOR1RIICAgICAgICAgICAgICAzMgorI2RlZmluZSBTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVMgICAgICAgICAgMTIKKyNkZWZpbmUgU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZUyAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19LRVlfTEVOR1RIICAgICAgICAgICAgICAgICAgIDEzIC8qIFdFUCBNYXhpbXVtIGtleSBsZW5ndGggc2l6ZSAqLworI2RlZmluZSBTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX0xFTkdUSCAgICAgICAgMTI4CisjZGVmaW5lIFNJUl9NQUNfV0VQX0lWX0xFTkdUSCAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFNJUl9NQUNfV0VQX0lDVl9MRU5HVEggICAgICAgICAgICAgICA0CisKKy8qIC8gTUFYIGtleSBsZW5ndGggd2hlbiBVTEEgaXMgdXNlZCAqLworI2RlZmluZSBTSVJfTUFDX01BWF9LRVlfTEVOR1RIICAgICAgICAgICAgICAgMzIKKworLyogLyBNYWNybyBkZWZpbml0aW9ucyBmb3IgZ2V0L3NldCBvbiBGQyBmaWVsZHMgKi8KKyNkZWZpbmUgU0lSX01BQ19HRVRfUFJPVF9WRVJTSU9OKHgpICAgICAgKCgoKHVpbnQxNl90KSB4KSAmIDB4MDMwMCkgPj4gOCkKKyNkZWZpbmUgU0lSX01BQ19HRVRfRlJBTUVfVFlQRSh4KSAgICAgICAgKCgoKHVpbnQxNl90KSB4KSAmIDB4MEMwMCkgPj4gOCkKKyNkZWZpbmUgU0lSX01BQ19HRVRfRlJBTUVfU1VCX1RZUEUoeCkgICAgKCgoKHVpbnQxNl90KSB4KSAmIDB4RjAwMCkgPj4gMTIpCisjZGVmaW5lIFNJUl9NQUNfR0VUX1dFUF9CSVRfSU5fRkMoeCkgICAgICgoKHVpbnQxNl90KSB4KSAmIDB4MDA0MCkKKyNkZWZpbmUgU0lSX01BQ19TRVRfUFJPVF9WRVJTSU9OKHgpICAgICAgKCh1aW50MTZfdCkgeCkKKyNkZWZpbmUgU0lSX01BQ19TRVRfRlJBTUVfVFlQRSh4KSAgICAgICAgKCgodWludDE2X3QpIHgpIDw8IDIpCisjZGVmaW5lIFNJUl9NQUNfU0VUX0ZSQU1FX1NVQl9UWVBFKHgpICAgICgoKHVpbnQxNl90KSB4KSA8PCA0KQorI2RlZmluZSBTSVJfTUFDX1NFVF9XRVBfQklUX0lOX0ZDKHgpICAgICAoKCh1aW50MTZfdCkgeCkgPDwgMTQpCisKKy8qIC8gTWFjcm8gZGVmaW5pdGlvbnMgZm9yIGdldC9zZXQgb24gY2FwYWJpbGl0eUluZm8gYml0cyAqLworI2RlZmluZSBTSVJfTUFDX0dFVF9FU1MoeCkgICAgICAgICAgICAgICAoKCh1aW50MTZfdCkgeCkgJiAweDAwMDEpCisjZGVmaW5lIFNJUl9NQUNfR0VUX0lCU1MoeCkgICAgICAgICAgICAgICgoKCh1aW50MTZfdCkgeCkgJiAweDAwMDIpID4+IDEpCisjZGVmaW5lIFNJUl9NQUNfR0VUX0NGX1BPTExBQkxFKHgpICAgICAgICgoKCh1aW50MTZfdCkgeCkgJiAweDAwMDQpID4+IDIpCisjZGVmaW5lIFNJUl9NQUNfR0VUX0NGX1BPTExfUkVRKHgpICAgICAgICgoKCh1aW50MTZfdCkgeCkgJiAweDAwMDgpID4+IDMpCisjZGVmaW5lIFNJUl9NQUNfR0VUX1BSSVZBQ1koeCkgICAgICAgICAgICgoKCh1aW50MTZfdCkgeCkgJiAweDAwMTApID4+IDQpCisjZGVmaW5lIFNJUl9NQUNfR0VUX1NIT1JUX1BSRUFNQkxFKHgpICAgICgoKCh1aW50MTZfdCkgeCkgJiAweDAwMjApID4+IDUpCisjZGVmaW5lIFNJUl9NQUNfR0VUX1NQRUNUUlVNX01HTVQoeCkgICAgICgoKCh1aW50MTZfdCkgeCkgJiAweDAxMDApID4+IDgpCisjZGVmaW5lIFNJUl9NQUNfR0VUX1FPUyh4KSAgICAgICAgICAgICAgICgoKCh1aW50MTZfdCkgeCkgJiAweDAyMDApID4+IDkpCisjZGVmaW5lIFNJUl9NQUNfR0VUX1NIT1JUX1NMT1RfVElNRSh4KSAgICgoKCh1aW50MTZfdCkgeCkgJiAweDA0MDApID4+IDEwKQorI2RlZmluZSBTSVJfTUFDX0dFVF9BUFNEKHgpICAgICAgICAgICAgICAoKCgodWludDE2X3QpIHgpICYgMHgwODAwKSA+PiAxMSkKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNkZWZpbmUgU0lSX01BQ19HRVRfUlJNKHgpICAgICAgICAgICAgICAgKCgoKHVpbnQxNl90KSB4KSAmIDB4MTAwMCkgPj4gMTIpCisjZW5kaWYKKyNkZWZpbmUgU0lSX01BQ19HRVRfQkxPQ0tfQUNLKHgpICAgICAgICAgKCgoKHVpbnQxNl90KSB4KSAmIDB4YzAwMCkgPj4gQ0FQQUJJTElUWV9JTkZPX0RFTEFZRURfQkFfQklUKQorI2RlZmluZSBTSVJfTUFDX1NFVF9FU1MoeCkgICAgICAgICAgICAgICAoKCh1aW50MTZfdCkgeCkgfCAweDAwMDEpCisjZGVmaW5lIFNJUl9NQUNfU0VUX0lCU1MoeCkgICAgICAgICAgICAgICgoKHVpbnQxNl90KSB4KSB8IDB4MDAwMikKKyNkZWZpbmUgU0lSX01BQ19TRVRfQ0ZfUE9MTEFCTEUoeCkgICAgICAgKCgodWludDE2X3QpIHgpIHwgMHgwMDA0KQorI2RlZmluZSBTSVJfTUFDX1NFVF9DRl9QT0xMX1JFUSh4KSAgICAgICAoKCh1aW50MTZfdCkgeCkgfCAweDAwMDgpCisjZGVmaW5lIFNJUl9NQUNfU0VUX1BSSVZBQ1koeCkgICAgICAgICAgICgoKHVpbnQxNl90KSB4KSB8IDB4MDAxMCkKKyNkZWZpbmUgU0lSX01BQ19TRVRfU0hPUlRfUFJFQU1CTEUoeCkgICAgKCgodWludDE2X3QpIHgpIHwgMHgwMDIwKQorI2RlZmluZSBTSVJfTUFDX1NFVF9TUEVDVFJVTV9NR01UKHgpICAgICAoKCh1aW50MTZfdCkgeCkgfCAweDAxMDApCisjZGVmaW5lIFNJUl9NQUNfU0VUX1FPUyh4KSAgICAgICAgICAgICAgICgoKHVpbnQxNl90KSB4KSB8IDB4MDIwMCkKKyNkZWZpbmUgU0lSX01BQ19TRVRfU0hPUlRfU0xPVF9USU1FKHgpICAgKCgodWludDE2X3QpIHgpIHwgMHgwNDAwKQorI2RlZmluZSBTSVJfTUFDX1NFVF9BUFNEKHgpICAgICAgICAgICAgICAoKCh1aW50MTZfdCkgeCkgfCAweDA4MDApCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisjZGVmaW5lIFNJUl9NQUNfU0VUX1JSTSh4KSAgICAgICAgICAgICAgICgoKHVpbnQxNl90KSB4KSB8IDB4MTAwMCkKKyNlbmRpZgorI2RlZmluZSBTSVJfTUFDX1NFVF9HUk9VUF9BQ0soeCkgICAgICAgICAoKCh1aW50MTZfdCkgeCkgfCAweDQwMDApCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworI2RlZmluZSBTSVJfTUFDX0dFVF9WSFRfTUFYX0FNUERVX0VYUE8oeCkgKCgoKHVpbnQzMl90KSB4KSAmIDB4MDM4MDAwMDApID4+IDIzKQorI2VuZGlmCisKKy8qIGJpdG5hbWUgbXVzdCBiZSBvbmUgb2YgdGhlIGFib3ZlLCBlZyBFU1MsIENGX1BPTExBQkxFLCBldGMuICovCisjZGVmaW5lIFNJUl9NQUNfQ0xFQVJfQ0FQQUJJTElUWSh1MTZ2YWx1ZSwgYml0bmFtZSkgXAorCSgodTE2dmFsdWUpICY9ICh+KFNJUl9NQUNfU0VUXyAjIyBiaXRuYW1lKDApKSkpCisKKyNkZWZpbmUgSVNfV0VTX01PREVfRU5BQkxFRCh4KSBcCisJKCh4KS0+cm9hbS5jb25maWdQYXJhbS5pc1dFU01vZGVFbmFibGVkKQorCisjZGVmaW5lIEJBX1JFQ0lQSUVOVCAgICAgICAxCisjZGVmaW5lIEJBX0lOSVRJQVRPUiAgICAgICAyCisjZGVmaW5lIEJBX0JPVEhfRElSRUNUSU9OUyAzCisKKy8qIC8gU3RhdHVzIENvZGUgKHByZXNlbnQgaW4gTWFuYWdlbWVudCByZXNwb25zZSBmcmFtZXMpIGVudW0gKi8KKwordHlwZWRlZiBlbnVtIGVTaXJNYWNTdGF0dXNDb2RlcyB7CisJZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMgPSAwLCAgICAvKiBSZXNlcnZlZCAqLworCWVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUyA9IDEsICAgICAvKiBVbnNwZWNpZmllZCByZWFzb24gKi8KKwkvKiA4MDIuMTEgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLTkgKi8KKwkvKgorCSAgIFdNTSBzdGF0dXMgY29kZXMoc3RhbmRhcmQgMS4xIHRhYmxlIDkpCisJICAgVGFibGUgOSBBRERUUyBSZXNwb25zZSBTdGF0dXMgQ29kZXMKKwkgICBWYWx1ZSBPcGVyYXRpb24KKwkgICAwIEFkbWlzc2lvbiBhY2NlcHRlZAorCSAgIDEgSW52YWxpZCBwYXJhbWV0ZXJzCisJICAgMiBSZXNlcnZlZAorCSAgIDMgUmVmdXNlZAorCSAgIDQtMjU1IFJlc2VydmVkCisJICovCisJZVNJUl9NQUNfV01FX0lOVkFMSURfUEFSQU1TX1NUQVRVUyA9IDEsIC8qID8/ICovCisJZVNJUl9NQUNfV01FX1JFRlVTRURfU1RBVFVTID0gMywgICAgICAgIC8qID8/ICovCisJZVNJUl9NQUNfQ0FQQUJJTElUSUVTX05PVF9TVVBQT1JURURfU1RBVFVTID0gMTAsICAgICAgICAvKiBDYW5ub3Qgc3VwcG9ydCBhbGwgcmVxdWVzdGVkIGNhcGFiaWxpdGllcyBpbiB0aGUgQ2FwYWJpbGl0eSBJbmZvcm1hdGlvbiBmaWVsZCAqLworCWVTSVJfTUFDX0lOQUJMSVRZX1RPX0NPTkZJUk1fQVNTT0NfU1RBVFVTID0gMTEsIC8qIFJlYXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byBpbmFiaWxpdHkgdG8gY29uZmlybSB0aGF0IGFzc29jaWF0aW9uIGV4aXN0cyAqLworCWVTSVJfTUFDX09VVFNJREVfU0NPUEVfT0ZfU1BFQ19TVEFUVVMgPSAxMiwgICAgIC8qIEFzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVhc29uIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgc3RhbmRhcmQgKi8KKwllU0lSX01BQ19BVVRIX0FMR09fTk9UX1NVUFBPUlRFRF9TVEFUVVMgPSAxMywgICAvKiBSZXNwb25kaW5nIHN0YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSAqLworCWVTSVJfTUFDX0FVVEhfRlJBTUVfT1VUX09GX1NFUV9TVEFUVVMgPSAxNCwgICAgIC8qIFJlY2VpdmVkIGFuIEF1dGhlbnRpY2F0aW9uIGZyYW1lIHdpdGggYXV0aGVudGljYXRpb24gdHJhbnNhY3Rpb24gc2VxdWVuY2UgbnVtYmVyICovCisJLyogb3V0IG9mIGV4cGVjdGVkIHNlcXVlbmNlICovCisJZVNJUl9NQUNfQ0hBTExFTkdFX0ZBSUxVUkVfU1RBVFVTID0gMTUsIC8qIEF1dGhlbnRpY2F0aW9uIHJlamVjdGVkIGJlY2F1c2Ugb2YgY2hhbGxlbmdlIGZhaWx1cmUgKi8KKwllU0lSX01BQ19BVVRIX1JTUF9USU1FT1VUX1NUQVRVUyA9IDE2LCAgLyogQXV0aGVudGljYXRpb24gcmVqZWN0ZWQgZHVlIHRvIHRpbWVvdXQgd2FpdGluZyBmb3IgbmV4dCBmcmFtZSBpbiBzZXF1ZW5jZSAqLworCWVTSVJfTUFDX01BWF9BU1NPQ19TVEFfUkVBQ0hFRF9TVEFUVVMgPSAxNywgICAgIC8qIEFzc29jaWF0aW9uIGRlbmllZCBiZWNhdXNlIEFQIGlzIHVuYWJsZSB0byBoYW5kbGUgYWRkaXRpb25hbCBhc3NvY2lhdGVkIHN0YXRpb25zICovCisJZVNJUl9NQUNfQkFTSUNfUkFURVNfTk9UX1NVUFBPUlRFRF9TVEFUVVMgPSAxOCwgLyogQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgYWxsIG9mIHRoZSBkYXRhIHJhdGVzIGluIHRoZSAqLworCS8qIEJTU0Jhc2ljUmF0ZVNldCBwYXJhbWV0ZXIgKi8KKwllU0lSX01BQ19TSE9SVF9QUkVBTUJMRV9OT1RfU1VQUE9SVEVEX1NUQVRVUyA9IDE5LCAgICAgIC8qIEFzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVxdWVzdGluZyBzdGF0aW9uIG5vdCBzdXBwb3J0aW5nIHRoZSBzaG9ydCBwcmVhbWJsZSAqLworCS8qIG9wdGlvbiAqLworCWVTSVJfTUFDX1BCQ0NfTk9UX1NVUFBPUlRFRF9TVEFUVVMgPSAyMCwgICAgICAgIC8qIEFzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVxdWVzdGluZyBzdGF0aW9uIG5vdCBzdXBwb3J0aW5nIHRoZSBQQkNDIG1vZHVsYXRpb24gKi8KKwkvKiBvcHRpb24gKi8KKwllU0lSX01BQ19DSEFOTkVMX0FHSUxJVFlfTk9UX1NVUFBPUlRFRF9TVEFUVVMgPSAyMSwgICAgIC8qIEFzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVxdWVzdGluZyBzdGF0aW9uIG5vdCBzdXBwb3J0aW5nIHRoZSBDaGFubmVsIEFnaWxpdHkgKi8KKwkvKiBvcHRpb24gKi8KKwllU0lSX01BQ19TUEVDVFJVTV9NR01UX1JFUURfU1RBVFVTID0gMjIsICAgICAgICAvKiBBc3NvY2lhdGlvbiByZXF1ZXN0IHJlamVjdGVkIGJlY2F1c2UgU3BlY3RydW0gTWFuYWdlbWVudCBjYXBhYmlsaXR5IGlzIHJlcXVpcmVkICovCisJZVNJUl9NQUNfUFdSX0NBUEFCSUxJVFlfQkFEX1NUQVRVUyA9IDIzLCAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCByZWplY3RlZCBiZWNhdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgUG93ZXIgQ2FwYWJpbGl0eSAqLworCS8qIGVsZW1lbnQgaXMgdW5hY2NlcHRhYmxlICovCisJZVNJUl9NQUNfU1BSVERfQ0hBTk5FTFNfQkFEX1NUQVRVUyA9IDI0LCAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCByZWplY3RlZCBiZWNhdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgU3VwcG9ydGVkIENoYW5uZWxzICovCisJLyogZWxlbWVudCBpcyB1bmFjY2VwdGFibGUgKi8KKwllU0lSX01BQ19TSE9SVF9TTE9UX05PVF9TVVBPUlRFRF9TVEFUVVMgPSAyNSwgICAvKiBBc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIHJlcXVlc3Rpbmcgc3RhdGlvbiBub3Qgc3VwcG9ydGluZyB0aGUgU2hvcnQgU2xvdCBUaW1lICovCisJLyogb3B0aW9uICovCisJZVNJUl9NQUNfRFNTU19PRkRNX05PVF9TVVBQT1JURURfU1RBVFVTID0gMjYsICAgLyogQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgdGhlIERTU1MtT0ZETSBvcHRpb24gKi8KKwkvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNy0yOSAqLworCWVTSVJfTUFDX1RSWV9BR0FJTl9MQVRFUiA9IDMwLCAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCByZWplY3RlZCB0ZW1wb3JhcmlseSwgdHJ5IGFnYWluIGxhdGVyICovCisJLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgKi8KKwllU0lSX01BQ19RT1NfVU5TUEVDSUZJRURfRkFJTFVSRV9TVEFUVVMgPSAzMiwgICAvKiBVbnNwZWNpZmllZCwgUW9TLXJlbGF0ZWQgZmFpbHVyZSAqLworCWVTSVJfTUFDX1FBUF9OT19CQU5EV0lEVEhfU1RBVFVTID0gMzMsICAvKiBBc3NvY2lhdGlvbiBkZW5pZWQgYmVjYXVzZSBRb1MgQVAgaGFzIGluc3VmZmljaWVudCBiYW5kd2lkdGggdG8gaGFuZGxlIGFub3RoZXIgKi8KKwkvKiBRb1MgU1RBICovCisJZVNJUl9NQUNfWFNfRlJBTUVfTE9TU19TVEFUVVMgPSAzNCwgICAgIC8qIEFzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gZXhjZXNzaXZlIGZyYW1lIGxvc3MgcmF0ZXMgYW5kL29yIHBvb3IgY29uZGl0aW9ucyBvbiBjdXItICovCisJLyogcmVudCBvcGVyYXRpbmcgY2hhbm5lbCAqLworCWVTSVJfTUFDX1NUQV9RT1NfTk9UX1NVUFBPUlRFRF9TVEFUVVMgPSAzNSwgICAgIC8qIEFzc29jaWF0aW9uICh3aXRoIFFvUyBCU1MpIGRlbmllZCBiZWNhdXNlIHRoZSByZXF1ZXN0aW5nIFNUQSBkb2VzIG5vdCBzdXBwb3J0IHRoZSAqLworCS8qIFFvUyBmYWNpbGl0eSAqLworCWVTSVJfTUFDX1NUQV9CTEtfQUNLX05PVF9TVVBQT1JURURfU1RBVFVTID0gMzYsIC8qIFJlc2VydmVkICovCisJZVNJUl9NQUNfUkVRX0RFQ0xJTkVEX1NUQVRVUyA9IDM3LCAgICAgIC8qIFRoZSByZXF1ZXN0IGhhcyBiZWVuIGRlY2xpbmVkICovCisJZVNJUl9NQUNfSU5WQUxJRF9QQVJBTV9TVEFUVVMgPSAzOCwgICAgIC8qIFRoZSByZXF1ZXN0IGhhcyBub3QgYmVlbiBzdWNjZXNzZnVsIGFzIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMgaGF2ZSBpbnZhbGlkIHZhbHVlcyAqLworCWVTSVJfTUFDX1RTX05PVF9IT05PVVJFRF9TVEFUVVMgPSAzOSwgICAvKiBUaGUgVFMgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgYmVjYXVzZSB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgaG9ub3JlZDsgaG93ZXZlciwgYSBzdWdnZXN0ZWQgKi8KKwkvKiBUU1BFQyBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBpbml0aWF0aW5nIFNUQSBtYXkgYXR0ZW1wdCB0byBzZXQgYW5vdGhlciBUUyAqLworCS8qIHdpdGggdGhlIHN1Z2dlc3RlZCBjaGFuZ2VzIHRvIHRoZSBUU1BFQyAqLworCWVTSVJfTUFDX0lOVkFMSURfSU5GT1JNQVRJT05fRUxFTUVOVF9TVEFUVVMgPSA0MCwgICAgICAgLyogSW52YWxpZCBpbmZvcm1hdGlvbiBlbGVtZW50LCBpLmUuLCBhbiBpbmZvcm1hdGlvbiBlbGVtZW50IGRlZmluZWQgaW4gdGhpcyBzdGFuZGFyZCBmb3IgKi8KKwkvKiB3aGljaCB0aGUgY29udGVudCBkb2VzIG5vdCBtZWV0IHRoZSBzcGVjaWZpY2F0aW9ucyBpbiBDbGF1c2UgNyAqLworCWVTSVJfTUFDX0lOVkFMSURfR1JPVVBfQ0lQSEVSX1NUQVRVUyA9IDQxLCAgICAgIC8qIEludmFsaWQgZ3JvdXAgY2lwaGVyICovCisJZVNJUl9NQUNfSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVJfU1RBVFVTID0gNDIsICAgLyogSW52YWxpZCBwYWlyd2lzZSBjaXBoZXIgKi8KKwllU0lSX01BQ19JTlZBTElEX0FLTVBfU1RBVFVTID0gNDMsICAgICAgLyogSW52YWxpZCBBS01QICovCisJZVNJUl9NQUNfVU5TVVBQT1JURURfUlNOX0lFX1ZFUlNJT05fU1RBVFVTID0gNDQsICAgICAgICAvKiBVbnN1cHBvcnRlZCBSU04gaW5mb3JtYXRpb24gZWxlbWVudCB2ZXJzaW9uICovCisJZVNJUl9NQUNfSU5WQUxJRF9SU05fSUVfQ0FQQUJJTElUSUVTX1NUQVRVUyA9IDQ1LCAgICAgICAvKiBJbnZhbGlkIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50IGNhcGFiaWxpdGllcyAqLworCWVTSVJfTUFDX0NJUEhFUl9TVUlURV9SRUpFQ1RFRF9TVEFUVVMgPSA0NiwgICAgIC8qIENpcGhlciBzdWl0ZSByZWplY3RlZCBiZWNhdXNlIG9mIHNlY3VyaXR5IHBvbGljeSAqLworCWVTSVJfTUFDX1RTX05PVF9DUkVBVEVEX1NUQVRVUyA9IDQ3LCAgICAvKiBUaGUgVFMgaGFzIG5vdCBiZWVuIGNyZWF0ZWQ7IGhvd2V2ZXIsIHRoZSBIQyBtYXkgYmUgY2FwYWJsZSBvZiBjcmVhdGluZyBhIFRTLCBpbiAqLworCS8qIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCwgYWZ0ZXIgdGhlIHRpbWUgaW5kaWNhdGVkIGluIHRoZSBUUyBEZWxheSBlbGVtZW50ICovCisJZVNJUl9NQUNfRExfTk9UX0FMTE9XRURfU1RBVFVTID0gNDgsICAgIC8qIERpcmVjdCBsaW5rIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBCU1MgYnkgcG9saWN5ICovCisJZVNJUl9NQUNfREVTVF9TVEFfTk9UX0tOT1dOX1NUQVRVUyA9IDQ5LCAgICAgICAgLyogVGhlIERlc3RpbmF0aW9uIFNUQSBpcyBub3QgcHJlc2VudCB3aXRoaW4gdGhpcyBCU1MgKi8KKwllU0lSX01BQ19ERVNUX1NUQV9OT1RfUVNUQV9TVEFUVVMgPSA1MCwgLyogVGhlIERlc3RpbmF0aW9uIFNUQSBpcyBub3QgYSBRb1MgU1RBICovCisJZVNJUl9NQUNfSU5WQUxJRF9MSVNURU5fSU5URVJWQUxfU1RBVFVTID0gNTEsICAgLyogQXNzb2NpYXRpb24gZGVuaWVkIGJlY2F1c2UgdGhlIExpc3RlbkludGVydmFsIGlzIHRvbyBsYXJnZSAqLworCisJZVNJUl9NQUNfRFNTU19DQ0tfUkFURV9NVVNUX1NVUFBPUlRfU1RBVFVTID0gNTIsICAgICAgICAvKiBGSVhNRTogKi8KKwllU0lSX01BQ19EU1NTX0NDS19SQVRFX05PVF9TVVBQT1JUX1NUQVRVUyA9IDUzLAorCWVTSVJfTUFDX1BTTVBfQ09OVFJPTExFRF9BQ0NFU1NfT05MWV9TVEFUVVMgPSA1NCwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJZVNJUl9NQUNfRVNFX1VOU1BFQ0lGSUVEX1FPU19GQUlMVVJFX1NUQVRVUyA9IDIwMCwgICAgICAvKiBFU0UtVW5zcGVjaWZpZWQsIFFvUyByZWxhdGVkIGZhaWx1cmUgaW4gKFJlKUFzc29jIHJlc3BvbnNlIGZyYW1lcyAqLworCWVTSVJfTUFDX0VTRV9UU1BFQ19SRVFfUkVGVVNFRF9TVEFUVVMgPSAyMDEsICAgIC8qIEVTRS1UU1BFQyByZXF1ZXN0IHJlZnVzZWQgZHVlIHRvIEFQJ3MgcG9saWN5IGNvbmZpZ3VyYXRpb24gaW4gQWRkVHMgUnNwLCAoUmUpQXNzb2MgUnNwLiAqLworCWVTSVJfTUFDX0VTRV9BU1NPQ19ERU5JRURfSU5TVUZGX0JXX1NUQVRVUyA9IDIwMiwgICAgICAgLyogRVNFLUFzc29jIGRlbmllZCBkdWUgdG8gaW5zdWZmaWNpZW50IGJhbmR3aWR0aCB0byBoYW5kbGUgbmV3IFRTIGluIChSZSlBc3NvYyBSc3AuICovCisJZVNJUl9NQUNfRVNFX0lOVkFMSURfUEFSQU1FVEVSU19TVEFUVVMgPSAyMDMsICAgLyogRVNFLUludmFsaWQgcGFyYW1ldGVycy4gKFJlKUFzc29jIHJlcXVlc3QgaGFkIG9uZSBvciBtb3JlIFRTUEVDIHBhcmFtZXRlcnMgd2l0aCAqLworCS8qIGludmFsaWQgdmFsdWVzLiAqLworI2VuZGlmCisKK30gdFNpck1hY1N0YXR1c0NvZGVzOworCisvKioKKyAqIFJlYXNvbiBDb2RlIChwcmVzZW50IGluIERlYXV0aGVudGljYXRpb24vRGlzYXNzb2NpYXRpb24KKyAqIE1hbmFnZW1lbnQgZnJhbWVzKSBlbnVtCisgKi8KK3R5cGVkZWYgZW51bSBlU2lyTWFjUmVhc29uQ29kZXMgeworCWVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTiA9IDEsICAgICAvKiBVbnNwZWNpZmllZCByZWFzb24gKi8KKwllU0lSX01BQ19QUkVWX0FVVEhfTk9UX1ZBTElEX1JFQVNPTiA9IDIsICAgICAgICAvKiBQcmV2aW91cyBhdXRoZW50aWNhdGlvbiBubyBsb25nZXIgdmFsaWQgKi8KKwllU0lSX01BQ19ERUFVVEhfTEVBVklOR19CU1NfUkVBU09OID0gMywgLyogRGVhdXRoZW50aWNhdGVkIGJlY2F1c2Ugc2VuZGluZyBzdGF0aW9uIGlzIGxlYXZpbmcgKG9yIGhhcyBsZWZ0KSBJQlNTIG9yIEVTUyAqLworCWVTSVJfTUFDX0RJU0FTU09DX0RVRV9UT19JTkFDVElWSVRZX1JFQVNPTiA9IDQsIC8qIERpc2Fzc29jaWF0ZWQgZHVlIHRvIGluYWN0aXZpdHkgKi8KKwllU0lSX01BQ19ESVNBU1NPQ19EVUVfVE9fRElTQUJJTElUWV9SRUFTT04gPSA1LCAvKiBEaXNhc3NvY2lhdGVkIGJlY2F1c2UgQVAgaXMgdW5hYmxlIHRvIGhhbmRsZSBhbGwgY3VycmVudGx5IGFzc29jaWF0ZWQgc3RhdGlvbnMgKi8KKwllU0lSX01BQ19DTEFTUzJfRlJBTUVfRlJPTV9OT05fQVVUSF9TVEFfUkVBU09OID0gNiwgICAgIC8qIENsYXNzIDIgZnJhbWUgcmVjZWl2ZWQgZnJvbSBub25hdXRoZW50aWNhdGVkIHN0YXRpb24gKi8KKwllU0lSX01BQ19DTEFTUzNfRlJBTUVfRlJPTV9OT05fQVNTT0NfU1RBX1JFQVNPTiA9IDcsICAgIC8qIENsYXNzIDMgZnJhbWUgcmVjZWl2ZWQgZnJvbSBub25hc3NvY2lhdGVkIHN0YXRpb24gKi8KKwllU0lSX01BQ19ESVNBU1NPQ19MRUFWSU5HX0JTU19SRUFTT04gPSA4LCAgICAgICAvKiBEaXNhc3NvY2lhdGVkIGJlY2F1c2Ugc2VuZGluZyBzdGF0aW9uIGlzIGxlYXZpbmcgKG9yIGhhcyBsZWZ0KSBCU1MgKi8KKwllU0lSX01BQ19TVEFfTk9UX1BSRV9BVVRIRU5USUNBVEVEX1JFQVNPTiA9IDksICAvKiBTdGF0aW9uIHJlcXVlc3RpbmcgKHJlKWFzc29jaWF0aW9uIGlzIG5vdCBhdXRoZW50aWNhdGVkIHdpdGggcmVzcG9uZGluZyBzdGF0aW9uICovCisJZVNJUl9NQUNfUFdSX0NBUEFCSUxJVFlfQkFEX1JFQVNPTiA9IDEwLCAgICAgICAgLyogRGlzYXNzb2NpYXRlZCBiZWNhdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgUG93ZXIgQ2FwYWJpbGl0eSBlbGVtZW50IGlzIHVuYWNjZXB0YWJsZSAqLworCWVTSVJfTUFDX1NQUlREX0NIQU5ORUxTX0JBRF9SRUFTT04gPSAxMSwgICAgICAgIC8qIERpc2Fzc29jaWF0ZWQgYmVjYXVzZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIFN1cHBvcnRlZCBDaGFubmVscyBlbGVtZW50IGlzIHVuYWNjZXB0YWJsZSAqLworCS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICovCisJZVNJUl9NQUNfSU5WQUxJRF9JRV9SRUFTT04gPSAxMywgICAgICAgIC8qIEludmFsaWQgaW5mb3JtYXRpb24gZWxlbWVudCwgaS5lLiwgYW4gaW5mb3JtYXRpb24gZWxlbWVudCBkZWZpbmVkIGluIHRoaXMgc3RhbmRhcmQgZm9yICovCisJLyogd2hpY2ggdGhlIGNvbnRlbnQgZG9lcyBub3QgbWVldCB0aGUgc3BlY2lmaWNhdGlvbnMgaW4gQ2xhdXNlIDcgKi8KKwllU0lSX01BQ19NSUNfRkFJTFVSRV9SRUFTT04gPSAxNCwgICAgICAgLyogTWVzc2FnZSBpbnRlZ3JpdHkgY29kZSAoTUlDKSBmYWlsdXJlICovCisJZVNJUl9NQUNfNFdBWV9IQU5EU0hBS0VfVElNRU9VVF9SRUFTT04gPSAxNSwgICAgLyogNC1XYXkgSGFuZHNoYWtlIHRpbWVvdXQgKi8KKwllU0lSX01BQ19HUl9LRVlfVVBEQVRFX1RJTUVPVVRfUkVBU09OID0gMTYsICAgICAvKiBHcm91cCBLZXkgSGFuZHNoYWtlIHRpbWVvdXQgKi8KKwllU0lSX01BQ19SU05fSUVfTUlTTUFUQ0hfUkVBU09OID0gMTcsICAgLyogSW5mb3JtYXRpb24gZWxlbWVudCBpbiA0LVdheSBIYW5kc2hha2UgZGlmZmVyZW50IGZyb20gKFJlKUFzc29jaWF0aW9uIFJlcXVlc3QvUHJvYmUgKi8KKwkvKiBSZXNwb25zZS9CZWFjb24gZnJhbWUgKi8KKwllU0lSX01BQ19JTlZBTElEX01DX0NJUEhFUl9SRUFTT04gPSAxOCwgLyogSW52YWxpZCBncm91cCBjaXBoZXIgKi8KKwllU0lSX01BQ19JTlZBTElEX1VDX0NJUEhFUl9SRUFTT04gPSAxOSwgLyogSW52YWxpZCBwYWlyd2lzZSBjaXBoZXIgKi8KKwllU0lSX01BQ19JTlZBTElEX0FLTVBfUkVBU09OID0gMjAsICAgICAgLyogSW52YWxpZCBBS01QICovCisJZVNJUl9NQUNfVU5TVVBQT1JURURfUlNOX0lFX1ZFUl9SRUFTT04gPSAyMSwgICAgLyogVW5zdXBwb3J0ZWQgUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQgdmVyc2lvbiAqLworCWVTSVJfTUFDX0lOVkFMSURfUlNOX0NBUEFCSUxJVElFU19SRUFTT04gPSAyMiwgIC8qIEludmFsaWQgUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQgY2FwYWJpbGl0aWVzICovCisJZVNJUl9NQUNfMVhfQVVUSF9GQUlMVVJFX1JFQVNPTiA9IDIzLCAgIC8qIElFRUUgODAyLjFYIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCAqLworCWVTSVJfTUFDX0NJUEhFUl9TVUlURV9SRUpFQ1RFRF9SRUFTT04gPSAyNCwgICAgIC8qIENpcGhlciBzdWl0ZSByZWplY3RlZCBiZWNhdXNlIG9mIHRoZSBzZWN1cml0eSBwb2xpY3kgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWVTSVJfTUFDX1RETFNfVEVBUkRPV05fUEVFUl9VTlJFQUNIQUJMRSA9IDI1LCAgIC8qIFRETFMgZGlyZWN0IGxpbmsgdGVhcmRvd24gZHVlIHRvIFRETFMgcGVlciBTVEEgdW5yZWFjaGFibGUgdmlhIHRoZSBURExTIGRpcmVjdCBsaW5rICovCisJZVNJUl9NQUNfVERMU19URUFSRE9XTl9VTlNQRUNfUkVBU09OID0gMjYsICAgICAgLyogVERMUyBkaXJlY3QgbGluayB0ZWFyZG93biBmb3IgdW5zcGVjaWZpZWQgcmVhc29uICovCisjZW5kaWYKKwkvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNyAtIDMwICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWVTSVJfTUFDX1JPQlVTVF9NR01UX0ZSQU1FU19QT0xJQ1lfVklPTEFUSU9OID0gMzEsICAgICAgLyogUm9idXN0IG1hbmFnZW1lbnQgZnJhbWVzIHBvbGljeSB2aW9sYXRpb24gKi8KKyNlbmRpZgorCWVTSVJfTUFDX1FPU19VTlNQRUNJRklFRF9SRUFTT04gPSAzMiwgICAvKiBEaXNhc3NvY2lhdGVkIGZvciB1bnNwZWNpZmllZCwgUW9TLXJlbGF0ZWQgcmVhc29uICovCisJZVNJUl9NQUNfUUFQX05PX0JBTkRXSURUSF9SRUFTT04gPSAzMywgIC8qIERpc2Fzc29jaWF0ZWQgYmVjYXVzZSBRb1MgQVAgbGFja3Mgc3VmZmljaWVudCBiYW5kd2lkdGggZm9yIHRoaXMgUW9TIFNUQSAqLworCWVTSVJfTUFDX1hTX1VOQUNLRURfRlJBTUVTX1JFQVNPTiA9IDM0LCAvKiBEaXNhc3NvY2lhdGVkIGJlY2F1c2UgZXhjZXNzaXZlIG51bWJlciBvZiBmcmFtZXMgbmVlZCB0byBiZSBhY2tub3dsZWRnZWQsIGJ1dCBhcmUgbm90ICovCisJLyogYWNrbm93bGVkZ2VkIGR1ZSB0byBBUCB0cmFuc21pc3Npb25zIGFuZC9vciBwb29yIGNoYW5uZWwgY29uZGl0aW9ucyAqLworCWVTSVJfTUFDX0JBRF9UWE9QX1VTRV9SRUFTT04gPSAzNSwgICAgICAvKiBEaXNhc3NvY2lhdGVkIGJlY2F1c2UgU1RBIGlzIHRyYW5zbWl0dGluZyBvdXRzaWRlIHRoZSBsaW1pdHMgb2YgaXRzIFRYT1BzICovCisJZVNJUl9NQUNfUEVFUl9TVEFfUkVRX0xFQVZJTkdfQlNTX1JFQVNPTiA9IDM2LCAgLyogUmVxdWVzdGVkIGZyb20gcGVlciBTVEEgYXMgdGhlIFNUQSBpcyBsZWF2aW5nIHRoZSBCU1MgKG9yIHJlc2V0dGluZykgKi8KKwllU0lSX01BQ19QRUVSX1JFSkVDVF9NRUNIQU5JU0lNX1JFQVNPTiA9IDM3LCAgICAvKiBSZXF1ZXN0ZWQgZnJvbSBwZWVyIFNUQSBhcyBpdCBkb2VzIG5vdCB3YW50IHRvIHVzZSB0aGUgbWVjaGFuaXNtICovCisJZVNJUl9NQUNfTUVDSEFOSVNNX05PVF9TRVRVUF9SRUFTT04gPSAzOCwgICAgICAgLyogUmVxdWVzdGVkIGZyb20gcGVlciBTVEEgYXMgdGhlIFNUQSByZWNlaXZlZCBmcmFtZXMgdXNpbmcgdGhlIG1lY2hhbmlzbSBmb3Igd2hpY2ggYSAqLworCS8qIHNldHVwIGlzIHJlcXVpcmVkICovCisJZVNJUl9NQUNfUEVFUl9USU1FRE9VVF9SRUFTT04gPSAzOSwgICAgIC8qIFJlcXVlc3RlZCBmcm9tIHBlZXIgU1RBIGR1ZSB0byB0aW1lb3V0ICovCisJZVNJUl9NQUNfQ0lQSEVSX05PVF9TVVBQT1JURURfUkVBU09OID0gNDUsICAgICAgLyogUGVlciBTVEEgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIGNpcGhlciBzdWl0ZSAqLworCWVTSVJfTUFDX0RJU0FTU09DX0RVRV9UT19GVEhBTkRPRkZfUkVBU09OID0gNDYsIC8qIEZUIHJlYXNvbiAqLworCS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NyAtIDY1NTM1LiAqLworCWVTSVJfQkVBQ09OX01JU1NFRCA9IDY1NTM0LCAgICAgLyogV2UgaW52ZW50ZWQgdGhpcyB0byB0ZWxsIGJlYWNvbiBtaXNzZWQgY2FzZSAqLworfSB0U2lyTWFjUmVhc29uQ29kZXM7CisKKy8qIEJBIEluaXRpYXRvciB2L3MgUmVjaXBpZW50ICovCit0eXBlZGVmIGVudW0gZUJBRGlyZWN0aW9uIHsKKwllQkFfUkVDSVBJRU5ULAorCWVCQV9JTklUSUFUT1IKK30gdEJBRGlyZWN0aW9uOworCisvKiBBLU1QRFUvQkEgRW5hYmxlL0Rpc2FibGUgaW4gVHgvUnggZGlyZWN0aW9uICovCit0eXBlZGVmIGVudW0gZUJBRW5hYmxlIHsKKwllQkFfRElTQUJMRSwKKwllQkFfRU5BQkxFCit9IHRCQUVuYWJsZTsKKworLyogQS1NUERVL0JBIFBvbGljeSAqLwordHlwZWRlZiBlbnVtIGVCQVBvbGljeSB7CisJZUJBX1VOQ09NUFJFU1NFRCwKKwllQkFfQ09NUFJFU1NFRAorfSB0QkFQb2xpY3k7CisKKy8qIEEtTVBEVS9CQSBQb2xpY3kgKi8KK3R5cGVkZWYgZW51bSBlQkFQb2xpY3lUeXBlIHsKKwllQkFfUE9MSUNZX0RFTEFZRUQsCisJZUJBX1BPTElDWV9JTU1FRElBVEUKK30gdEJBUG9saWN5VHlwZTsKKworLyogLyBGcmFtZSBjb250cm9sIGZpZWxkIGZvcm1hdCAoMiBieXRlcykgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNGcmFtZUN0bCB7CisKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisKKwl1aW50OF90IHN1YlR5cGU6NDsKKwl1aW50OF90IHR5cGU6MjsKKwl1aW50OF90IHByb3RWZXI6MjsKKworCXVpbnQ4X3Qgb3JkZXI6MTsKKwl1aW50OF90IHdlcDoxOworCXVpbnQ4X3QgbW9yZURhdGE6MTsKKwl1aW50OF90IHBvd2VyTWdtdDoxOworCXVpbnQ4X3QgcmV0cnk6MTsKKwl1aW50OF90IG1vcmVGcmFnOjE7CisJdWludDhfdCBmcm9tRFM6MTsKKwl1aW50OF90IHRvRFM6MTsKKworI2Vsc2UKKworCXVpbnQ4X3QgcHJvdFZlcjoyOworCXVpbnQ4X3QgdHlwZToyOworCXVpbnQ4X3Qgc3ViVHlwZTo0OworCisJdWludDhfdCB0b0RTOjE7CisJdWludDhfdCBmcm9tRFM6MTsKKwl1aW50OF90IG1vcmVGcmFnOjE7CisJdWludDhfdCByZXRyeToxOworCXVpbnQ4X3QgcG93ZXJNZ210OjE7CisJdWludDhfdCBtb3JlRGF0YToxOworCXVpbnQ4X3Qgd2VwOjE7CisJdWludDhfdCBvcmRlcjoxOworCisjZW5kaWYKKworfSBjZGZfcGFja2VkIHRTaXJNYWNGcmFtZUN0bCwgKnRwU2lyTWFjRnJhbWVDdGw7CisKKy8qIC8gU2VxdWVuY2UgY29udHJvbCBmaWVsZCAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1NlcUN0bCB7CisKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisKKwl1aW50OF90IHNlcU51bUxvOjQ7CisJdWludDhfdCBmcmFnTnVtOjQ7CisKKwl1aW50OF90IHNlcU51bUhpOjg7CisKKyNlbHNlCisKKwl1aW50OF90IGZyYWdOdW06NDsKKwl1aW50OF90IHNlcU51bUxvOjQ7CisJdWludDhfdCBzZXFOdW1IaTo4OworCisjZW5kaWYKK30gY2RmX3BhY2tlZCB0U2lyTWFjU2VxQ3RsLCAqdHBTaXJNYWNTZXFDdGw7CisKKy8qIC8gUW9TIGNvbnRyb2wgZmllbGQgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNRb3NDdGwgeworCisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorCisJdWludDhfdCByc3ZkOjE7CisJdWludDhfdCBhY2tQb2xpY3k6MjsKKwl1aW50OF90IGVzb3BfdHhvcFVuaXQ6MTsKKwl1aW50OF90IHRpZDo0OworCisJdWludDhfdCB0eG9wOjg7CisKKyNlbHNlCisKKwl1aW50OF90IHRpZDo0OworCXVpbnQ4X3QgZXNvcF90eG9wVW5pdDoxOworCXVpbnQ4X3QgYWNrUG9saWN5OjI7CisJdWludDhfdCByc3ZkOjE7CisKKwl1aW50OF90IHR4b3A6ODsKKworI2VuZGlmCit9IGNkZl9wYWNrZWQgdFNpck1hY1Fvc0N0bCwgKnRwU2lyTWFjUW9zQ3RsOworCisvKiAvIExlbmd0aCAoaW4gYnl0ZXMpIG9mIE1BQyBoZWFkZXIgaW4gMyBhZGRyZXNzIGZvcm1hdCAqLworI2RlZmluZSBTSVJfTUFDX0hEUl9MRU5fM0EgICAgMjQKKwordHlwZWRlZiB1aW50OF90IHRTaXJNYWNBZGRyW0VUSF9BTEVOXTsKKworLyogLyAzIGFkZHJlc3MgTUFDIGRhdGEgaGVhZGVyIGZvcm1hdCAoMjQvMjYgYnl0ZXMpICovCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjRG90M0hkciB7CisJdFNpck1hY0FkZHIgZGE7CisJdFNpck1hY0FkZHIgc2E7CisJdWludDE2X3QgbGVuZ3RoOworfSBjZGZfcGFja2VkIHRTaXJNYWNEb3QzSGRyLCAqdHBTaXJNYWNEb3QzSGRyOworCisvKiAvIDMgYWRkcmVzcyBNQUMgZGF0YSBoZWFkZXIgZm9ybWF0ICgyNC8yNiBieXRlcykgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNEYXRhSGRyM2EgeworCXRTaXJNYWNGcmFtZUN0bCBmYzsKKwl1aW50OF90IGR1cmF0aW9uTG87CisJdWludDhfdCBkdXJhdGlvbkhpOworCXRTaXJNYWNBZGRyIGFkZHIxOworCXRTaXJNYWNBZGRyIGFkZHIyOworCXRTaXJNYWNBZGRyIGFkZHIzOworCXRTaXJNYWNTZXFDdGwgc2VxQ29udHJvbDsKKwl0U2lyTWFjUW9zQ3RsIHFvc0NvbnRyb2w7Cit9IGNkZl9wYWNrZWQgdFNpck1hY0RhdGFIZHIzYSwgKnRwU2lyTWFjRGF0YUhkcjNhOworCisvKiAvIE1hbmFnZW1lbnQgaGVhZGVyIGZvcm1hdCAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY01nbXRIZHIgeworCXRTaXJNYWNGcmFtZUN0bCBmYzsKKwl1aW50OF90IGR1cmF0aW9uTG87CisJdWludDhfdCBkdXJhdGlvbkhpOworCXRTaXJNYWNBZGRyIGRhOworCXRTaXJNYWNBZGRyIHNhOworCXRTaXJNYWNBZGRyIGJzc0lkOworCXRTaXJNYWNTZXFDdGwgc2VxQ29udHJvbDsKK30gY2RmX3BhY2tlZCB0U2lyTWFjTWdtdEhkciwgKnRwU2lyTWFjTWdtdEhkcjsKKworLyogLyBFUlAgaW5mb3JtYXRpb24gZmllbGQgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNFcnBJbmZvIHsKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDhfdCByZXNlcnZlZDo1OworCXVpbnQ4X3QgYmFya2VyUHJlYW1ibGVNb2RlOjE7CisJdWludDhfdCB1c2VQcm90ZWN0aW9uOjE7CisJdWludDhfdCBub25FcnBQcmVzZW50OjE7CisjZWxzZQorCXVpbnQ4X3Qgbm9uRXJwUHJlc2VudDoxOworCXVpbnQ4X3QgdXNlUHJvdGVjdGlvbjoxOworCXVpbnQ4X3QgYmFya2VyUHJlYW1ibGVNb2RlOjE7CisJdWludDhfdCByZXNlcnZlZDo1OworI2VuZGlmCit9IGNkZl9wYWNrZWQgdFNpck1hY0VycEluZm8sICp0cFNpck1hY0VycEluZm87CisKKy8qIC8gQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBmaWVsZCAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY0NhcGFiaWxpdHlJbmZvIHsKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDE2X3QgaW1tZWRpYXRlQkE6MTsKKwl1aW50MTZfdCBkZWxheWVkQkE6MTsKKwl1aW50MTZfdCBkc3NzT2ZkbToxOworCXVpbnQxNl90IHJybToxOworCXVpbnQxNl90IGFwc2Q6MTsKKwl1aW50MTZfdCBzaG9ydFNsb3RUaW1lOjE7CisJdWludDE2X3QgcW9zOjE7CisJdWludDE2X3Qgc3BlY3RydW1NZ3Q6MTsKKwl1aW50MTZfdCBjaGFubmVsQWdpbGl0eToxOworCXVpbnQxNl90IHBiY2M6MTsKKwl1aW50MTZfdCBzaG9ydFByZWFtYmxlOjE7CisJdWludDE2X3QgcHJpdmFjeToxOworCXVpbnQxNl90IGNmUG9sbFJlcToxOworCXVpbnQxNl90IGNmUG9sbGFibGU6MTsKKwl1aW50MTZfdCBpYnNzOjE7CisJdWludDE2X3QgZXNzOjE7CisjZWxzZQorCXVpbnQxNl90IGVzczoxOworCXVpbnQxNl90IGlic3M6MTsKKwl1aW50MTZfdCBjZlBvbGxhYmxlOjE7CisJdWludDE2X3QgY2ZQb2xsUmVxOjE7CisJdWludDE2X3QgcHJpdmFjeToxOworCXVpbnQxNl90IHNob3J0UHJlYW1ibGU6MTsKKwl1aW50MTZfdCBwYmNjOjE7CisJdWludDE2X3QgY2hhbm5lbEFnaWxpdHk6MTsKKwl1aW50MTZfdCBzcGVjdHJ1bU1ndDoxOworCXVpbnQxNl90IHFvczoxOworCXVpbnQxNl90IHNob3J0U2xvdFRpbWU6MTsKKwl1aW50MTZfdCBhcHNkOjE7CisJdWludDE2X3QgcnJtOjE7CisJdWludDE2X3QgZHNzc09mZG06MTsKKwl1aW50MTZfdCBkZWxheWVkQkE6MTsKKwl1aW50MTZfdCBpbW1lZGlhdGVCQToxOworI2VuZGlmCit9IGNkZl9wYWNrZWQgdFNpck1hY0NhcGFiaWxpdHlJbmZvLCAqdHBTaXJNYWNDYXBhYmlsaXR5SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY0NmUGFyYW1TZXQgeworCXVpbnQ4X3QgY2ZwQ291bnQ7CisJdWludDhfdCBjZnBQZXJpb2Q7CisJdWludDE2X3QgY2ZwTWF4RHVyYXRpb247CisJdWludDE2X3QgY2ZwRHVyUmVtYWluaW5nOworfSBjZGZfcGFja2VkIHRTaXJNYWNDZlBhcmFtU2V0OworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjVGltIHsKKwl1aW50OF90IGR0aW1Db3VudDsKKwl1aW50OF90IGR0aW1QZXJpb2Q7CisJdWludDhfdCBiaXRtYXBDb250cm9sOworCXVpbnQ4X3QgYml0bWFwTGVuZ3RoOworCXVpbnQ4X3QgYml0bWFwWzI1MV07Cit9IGNkZl9wYWNrZWQgdFNpck1hY1RpbTsKKworLyogMTIgQnl0ZXMgbG9uZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCByYXRlICovCisvKiBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXQgSUVzICovCisvKiBUaGUgcGFyc2VyIGFzc3VtZSB0aGlzIHRvIGJlIGF0IGxlYXN0IDEyICovCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjUmF0ZVNldCB7CisJdWludDhfdCBudW1SYXRlczsKKwl1aW50OF90IHJhdGVbU0lSX01BQ19SQVRFU0VUX0VJRF9NQVhdOworfSBjZGZfcGFja2VkIHRTaXJNYWNSYXRlU2V0OworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjU1NpZCB7CisJdWludDhfdCBsZW5ndGg7CisJdWludDhfdCBzc0lkW1NJUl9NQUNfTUFYX1NTSURfTEVOR1RIXTsKK30gY2RmX3BhY2tlZCB0U2lyTWFjU1NpZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1dwYUluZm8geworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgaW5mb1tTSVJfTUFDX01BWF9JRV9MRU5HVEhdOworfSBjZGZfcGFja2VkIHRTaXJNYWNXcGFJbmZvLCAqdHBTaXJNYWNXcGFJbmZvLAordFNpck1hY1JzbkluZm8sICp0cFNpck1hY1JzbkluZm87Cit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjV2FwaUluZm8geworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgaW5mb1tTSVJfTUFDX01BWF9JRV9MRU5HVEhdOworfSBjZGZfcGFja2VkIHRTaXJNYWNXYXBpSW5mbywgKnRwU2lyTWFjV2FwaUluZm8sCit0U2lyTWFjV2FwaUluZm8sICp0cFNpck1hY1dhcGlJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjRkhQYXJhbVNldCB7CisJdWludDE2X3QgZHdlbGxUaW1lOworCXVpbnQ4X3QgaG9wU2V0OworCXVpbnQ4X3QgaG9wUGF0dGVybjsKKwl1aW50OF90IGhvcEluZGV4OworfSB0U2lyTWFjRkhQYXJhbVNldCwgKnRwU2lyTWFjRkhQYXJhbVNldDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY0lCU1NQYXJhbXMgeworCXVpbnQxNl90IGF0aW07Cit9IHRTaXJNYWNJQlNTUGFyYW1zLCAqdHBTaXJNYWNJQlNTUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjUlJNRW5hYmxlZENhcCB7CisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorCXVpbnQ4X3QgcmVzZXJ2ZWQ6NjsKKwl1aW50OF90IEFudGVubmFJbmZvcm1hdGlvbjoxOworCXVpbnQ4X3QgQlNTQXZhaWxBZG1pc3Npb246MTsKKwl1aW50OF90IEJzc0F2Z0FjY2Vzc0RlbGF5OjE7CisJdWludDhfdCBSU05JTWVhc3VyZW1lbnQ6MTsKKwl1aW50OF90IFJDUElNZWFzdXJlbWVudDoxOworCXVpbnQ4X3QgTmVpZ2hib3JUU0ZPZmZzZXQ6MTsKKwl1aW50OF90IE1lYXN1cmVtZW50UGlsb3RFbmFibGVkOjE7CisJdWludDhfdCBNZWFzdXJlbWVudFBpbG90OjM7CisJdWludDhfdCBub25PcGVyYXRpbkNoYW5NYXg6MzsKKwl1aW50OF90IG9wZXJhdGluZ0NoYW5NYXg6MzsKKwl1aW50OF90IFJSTU1JQkVuYWJsZWQ6MTsKKwl1aW50OF90IEFQQ2hhblJlcG9ydDoxOworCXVpbnQ4X3QgdHJpZ2dlcmVkVENNOjE7CisJdWludDhfdCBUQ01DYXBhYmlsaXR5OjE7CisJdWludDhfdCBMQ0lBemltdXRoOjE7CisJdWludDhfdCBMQ0lNZWFzdXJlbWVudDoxOworCXVpbnQ4X3Qgc3RhdGlzdGljczoxOworCXVpbnQ4X3QgTm9pc2VIaXN0b2dyYW06MTsKKwl1aW50OF90IENoYW5uZWxMb2FkOjE7CisJdWludDhfdCBGcmFtZU1lYXN1cmVtZW50OjE7CisJdWludDhfdCBCZWFjb25SZXBDb25kOjE7CisJdWludDhfdCBCZWFjb25UYWJsZToxOworCXVpbnQ4X3QgQmVhY29uQWN0aXZlOjE7CisJdWludDhfdCBCZWFjb25QYXNzaXZlOjE7CisJdWludDhfdCByZXBlYXRlZDoxOworCXVpbnQ4X3QgcGFyYWxsZWw6MTsKKwl1aW50OF90IE5laWdoYm9yUnB0OjE7CisJdWludDhfdCBMaW5rTWVhc3VyZW1lbnQ6MTsKKwl1aW50OF90IHByZXNlbnQ7CisjZWxzZQorCXVpbnQ4X3QgcHJlc2VudDsKKwl1aW50OF90IExpbmtNZWFzdXJlbWVudDoxOworCXVpbnQ4X3QgTmVpZ2hib3JScHQ6MTsKKwl1aW50OF90IHBhcmFsbGVsOjE7CisJdWludDhfdCByZXBlYXRlZDoxOworCXVpbnQ4X3QgQmVhY29uUGFzc2l2ZToxOworCXVpbnQ4X3QgQmVhY29uQWN0aXZlOjE7CisJdWludDhfdCBCZWFjb25UYWJsZToxOworCXVpbnQ4X3QgQmVhY29uUmVwQ29uZDoxOworCXVpbnQ4X3QgRnJhbWVNZWFzdXJlbWVudDoxOworCXVpbnQ4X3QgQ2hhbm5lbExvYWQ6MTsKKwl1aW50OF90IE5vaXNlSGlzdG9ncmFtOjE7CisJdWludDhfdCBzdGF0aXN0aWNzOjE7CisJdWludDhfdCBMQ0lNZWFzdXJlbWVudDoxOworCXVpbnQ4X3QgTENJQXppbXV0aDoxOworCXVpbnQ4X3QgVENNQ2FwYWJpbGl0eToxOworCXVpbnQ4X3QgdHJpZ2dlcmVkVENNOjE7CisJdWludDhfdCBBUENoYW5SZXBvcnQ6MTsKKwl1aW50OF90IFJSTU1JQkVuYWJsZWQ6MTsKKwl1aW50OF90IG9wZXJhdGluZ0NoYW5NYXg6MzsKKwl1aW50OF90IG5vbk9wZXJhdGluQ2hhbk1heDozOworCXVpbnQ4X3QgTWVhc3VyZW1lbnRQaWxvdDozOworCXVpbnQ4X3QgTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQ6MTsKKwl1aW50OF90IE5laWdoYm9yVFNGT2Zmc2V0OjE7CisJdWludDhfdCBSQ1BJTWVhc3VyZW1lbnQ6MTsKKwl1aW50OF90IFJTTklNZWFzdXJlbWVudDoxOworCXVpbnQ4X3QgQnNzQXZnQWNjZXNzRGVsYXk6MTsKKwl1aW50OF90IEJTU0F2YWlsQWRtaXNzaW9uOjE7CisJdWludDhfdCBBbnRlbm5hSW5mb3JtYXRpb246MTsKKwl1aW50OF90IHJlc2VydmVkOjY7CisjZW5kaWYKK30gdFNpck1hY1JSTUVuYWJsZWRDYXAsICp0cFNpck1hY1JSTUVuYWJsZWRDYXA7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0KKyAqICBFRENBIFByb2ZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIEVEQ0FfQUNfQkUgMAorI2RlZmluZSBFRENBX0FDX0JLIDEKKyNkZWZpbmUgRURDQV9BQ19WSSAyCisjZGVmaW5lIEVEQ0FfQUNfVk8gMworI2RlZmluZSBBQ19NR01UX0xPIDQKKyNkZWZpbmUgQUNfTUdNVF9ISSA1CisjZGVmaW5lIE1BWF9OVU1fQUMgNAorCisvKiBhY2Nlc3MgY2F0ZWdvcmllcyAqLworI2RlZmluZSBTSVJfTUFDX0VEQ0FBQ0lfQkVTVEVGRk9SVCAgKEVEQ0FfQUNfQkUpCisjZGVmaW5lIFNJUl9NQUNfRURDQUFDSV9CQUNLR1JPVU5EICAoRURDQV9BQ19CSykKKyNkZWZpbmUgU0lSX01BQ19FRENBQUNJX1ZJREVPICAgICAgIChFRENBX0FDX1ZJKQorI2RlZmluZSBTSVJfTUFDX0VEQ0FBQ0lfVk9JQ0UgICAgICAgKEVEQ0FfQUNfVk8pCisKKy8qIGFjY2VzcyBjYXRlZ29yeSByZWNvcmQgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNBY2lBaWZzbiB7CisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorCXVpbnQ4X3QgcnN2ZDoxOworCXVpbnQ4X3QgYWNpOjI7CisJdWludDhfdCBhY206MTsKKwl1aW50OF90IGFpZnNuOjQ7CisjZWxzZQorCXVpbnQ4X3QgYWlmc246NDsKKwl1aW50OF90IGFjbToxOworCXVpbnQ4X3QgYWNpOjI7CisJdWludDhfdCByc3ZkOjE7CisjZW5kaWYKK30gY2RmX3BhY2tlZCB0U2lyTWFjQWNpQWlmc247CisKKy8qIGNvbnRlbnRpb24gd2luZG93IHNpemUgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNDVyB7CisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorCXVpbnQ4X3QgbWF4OjQ7CisJdWludDhfdCBtaW46NDsKKyNlbHNlCisJdWludDhfdCBtaW46NDsKKwl1aW50OF90IG1heDo0OworI2VuZGlmCit9IGNkZl9wYWNrZWQgdFNpck1hY0NXOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjRWRjYVBhcmFtUmVjb3JkIHsKKwl0U2lyTWFjQWNpQWlmc24gYWNpOworCXRTaXJNYWNDVyBjdzsKKwl1aW50MTZfdCB0eG9wbGltaXQ7Cit9IGNkZl9wYWNrZWQgdFNpck1hY0VkY2FQYXJhbVJlY29yZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1Fvc0luZm8geworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKwl1aW50OF90IHVhcHNkOjE7CisJdWludDhfdCB0eG9wcmVxOjE7CisJdWludDhfdCBxcmVxOjE7CisJdWludDhfdCBxYWNrOjE7CisJdWludDhfdCBjb3VudDo0OworI2Vsc2UKKwl1aW50OF90IGNvdW50OjQ7CisJdWludDhfdCBxYWNrOjE7CisJdWludDhfdCBxcmVxOjE7CisJdWludDhfdCB0eG9wcmVxOjE7CisJdWludDhfdCB1YXBzZDoxOworI2VuZGlmCit9IGNkZl9wYWNrZWQgdFNpck1hY1Fvc0luZm87CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNRb3NJbmZvU3RhdGlvbiB7CisjaWZkZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDhfdCBhY3ZvX3VhcHNkOjE7CisJdWludDhfdCBhY3ZpX3VhcHNkOjE7CisJdWludDhfdCBhY2JrX3VhcHNkOjE7CisJdWludDhfdCBhY2JlX3VhcHNkOjE7CisJdWludDhfdCBxYWNrOjE7CisJdWludDhfdCBtYXhTcExlbjoyOworCXVpbnQ4X3QgbW9yZURhdGFBY2s6MTsKKyNlbHNlCisJdWludDhfdCBtb3JlRGF0YUFjazoxOworCXVpbnQ4X3QgbWF4U3BMZW46MjsKKwl1aW50OF90IHFhY2s6MTsKKwl1aW50OF90IGFjYmVfdWFwc2Q6MTsKKwl1aW50OF90IGFjYmtfdWFwc2Q6MTsKKwl1aW50OF90IGFjdmlfdWFwc2Q6MTsKKwl1aW50OF90IGFjdm9fdWFwc2Q6MTsKKyNlbmRpZgorfSBjZGZfcGFja2VkIHRTaXJNYWNRb3NJbmZvU3RhdGlvbiwgKnRwU2lyTWFjUW9zSW5mb1N0YXRpb247CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNFZGNhUGFyYW1TZXRJRSB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgbGVuZ3RoOworCXRTaXJNYWNRb3NJbmZvIHFvc0luZm87CisJdWludDhfdCByc3ZkOworCXRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgYWNiZTsgICAgLyogYmVzdCBlZmZvcnQgKi8KKwl0U2lyTWFjRWRjYVBhcmFtUmVjb3JkIGFjYms7ICAgIC8qIGJhY2tncm91bmQgKi8KKwl0U2lyTWFjRWRjYVBhcmFtUmVjb3JkIGFjdmk7ICAgIC8qIHZpZGVvICovCisJdFNpck1hY0VkY2FQYXJhbVJlY29yZCBhY3ZvOyAgICAvKiB2b2ljZSAqLworfSBjZGZfcGFja2VkIHRTaXJNYWNFZGNhUGFyYW1TZXRJRTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1FvU1BhcmFtcyB7CisJdWludDhfdCBjb3VudDsKKwl1aW50MTZfdCBsaW1pdDsKKwl1aW50OF90IENXbWluWzhdOworCXVpbnQ4X3QgQUlGU1s4XTsKK30gY2RmX3BhY2tlZCB0U2lyTWFjUW9TUGFyYW1zOworCisvKiB0cyBpbmZvIGRpcmVjdGlvbiBmaWVsZCBjYW4gdGFrZSBhbnkgb2YgdGhlc2UgdmFsdWVzICovCisjZGVmaW5lIFNJUl9NQUNfRElSRUNUSU9OX1VQTElOSyAgICAwCisjZGVmaW5lIFNJUl9NQUNfRElSRUNUSU9OX0ROTElOSyAgICAxCisjZGVmaW5lIFNJUl9NQUNfRElSRUNUSU9OX0RJUkVDVCAgICAyCisjZGVmaW5lIFNJUl9NQUNfRElSRUNUSU9OX0JJRElSICAgICAzCisKKy8qIGFjY2VzcyBwb2xpY3kgKi8KKy8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgIDAgKi8KKyNkZWZpbmUgU0lSX01BQ19BQ0NFU1NQT0xJQ1lfRURDQSAgIDEKKyNkZWZpbmUgU0lSX01BQ19BQ0NFU1NQT0xJQ1lfSENDQSAgIDIKKyNkZWZpbmUgU0lSX01BQ19BQ0NFU1NQT0xJQ1lfQk9USCAgIDMKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1RTSW5mb1RmYyB7CisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorCXVpbnQ4X3QgYnVyc3RTaXplRGVmbjoxOworCXVpbnQ4X3QgcmVzZXJ2ZWQ6NzsKKyNlbHNlCisJdWludDhfdCByZXNlcnZlZDo3OworCXVpbnQ4X3QgYnVyc3RTaXplRGVmbjoxOworI2VuZGlmCisKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDE2X3QgYWNrUG9saWN5OjI7CisJdWludDE2X3QgdXNlclByaW86MzsKKwl1aW50MTZfdCBwc2I6MTsKKwl1aW50MTZfdCBhZ2dyZWdhdGlvbjoxOworCXVpbnQxNl90IGFjY2Vzc1BvbGljeToyOworCXVpbnQxNl90IGRpcmVjdGlvbjoyOworCXVpbnQxNl90IHRzaWQ6NDsKKwl1aW50MTZfdCB0cmFmZmljVHlwZToxOworI2Vsc2UKKwl1aW50MTZfdCB0cmFmZmljVHlwZToxOworCXVpbnQxNl90IHRzaWQ6NDsKKwl1aW50MTZfdCBkaXJlY3Rpb246MjsKKwl1aW50MTZfdCBhY2Nlc3NQb2xpY3k6MjsKKwl1aW50MTZfdCBhZ2dyZWdhdGlvbjoxOworCXVpbnQxNl90IHBzYjoxOworCXVpbnQxNl90IHVzZXJQcmlvOjM7CisJdWludDE2X3QgYWNrUG9saWN5OjI7CisjZW5kaWYKK30gY2RmX3BhY2tlZCB0U2lyTWFjVFNJbmZvVGZjOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjVFNJbmZvU2NoIHsKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDhfdCByc3ZkOjc7CisJdWludDhfdCBzY2hlZHVsZToxOworI2Vsc2UKKwl1aW50OF90IHNjaGVkdWxlOjE7CisJdWludDhfdCByc3ZkOjc7CisjZW5kaWYKK30gY2RmX3BhY2tlZCB0U2lyTWFjVFNJbmZvU2NoOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjVFNJbmZvIHsKKwl0U2lyTWFjVFNJbmZvVGZjIHRyYWZmaWM7CisJdFNpck1hY1RTSW5mb1NjaCBzY2hlZHVsZTsKK30gY2RmX3BhY2tlZCB0U2lyTWFjVFNJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjVHNwZWNJRSB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgbGVuZ3RoOworCXRTaXJNYWNUU0luZm8gdHNpbmZvOworCXVpbnQxNl90IG5vbU1zZHVTejsKKwl1aW50MTZfdCBtYXhNc2R1U3o7CisJdWludDMyX3QgbWluU3ZjSW50ZXJ2YWw7CisJdWludDMyX3QgbWF4U3ZjSW50ZXJ2YWw7CisJdWludDMyX3QgaW5hY3RJbnRlcnZhbDsKKwl1aW50MzJfdCBzdXNwZW5kSW50ZXJ2YWw7CisJdWludDMyX3Qgc3ZjU3RhcnRUaW1lOworCXVpbnQzMl90IG1pbkRhdGFSYXRlOworCXVpbnQzMl90IG1lYW5EYXRhUmF0ZTsKKwl1aW50MzJfdCBwZWFrRGF0YVJhdGU7CisJdWludDMyX3QgbWF4QnVyc3RTejsKKwl1aW50MzJfdCBkZWxheUJvdW5kOworCXVpbnQzMl90IG1pblBoeVJhdGU7CisJdWludDE2X3Qgc3VycGx1c0J3OworCXVpbnQxNl90IG1lZGl1bVRpbWU7Cit9IGNkZl9wYWNrZWQgdFNpck1hY1RzcGVjSUU7CisKKy8qIGZyYW1lIGNsYXNzaWZpZXIgdHlwZXMgKi8KKyNkZWZpbmUgU0lSX01BQ19UQ0xBU1RZUEVfRVRIRVJORVQgMAorI2RlZmluZSBTSVJfTUFDX1RDTEFTVFlQRV9UQ1BVRFBJUCAxCisjZGVmaW5lIFNJUl9NQUNfVENMQVNUWVBFXzgwMjFEUSAgIDIKKy8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgMy0yNTUgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1RjbGFzUGFyYW1FdGhlcm5ldCB7CisJdFNpck1hY0FkZHIgc3JjQWRkcjsKKwl0U2lyTWFjQWRkciBkc3RBZGRyOworCXVpbnQxNl90IHR5cGU7Cit9IGNkZl9wYWNrZWQgdFNpck1hY1RjbGFzUGFyYW1FdGhlcm5ldDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1RjbGFzUGFyYW1JUHY0IHsKKwl1aW50OF90IHZlcnNpb247CisJdWludDhfdCBzcmNJcEFkZHJbNF07CisJdWludDhfdCBkc3RJcEFkZHJbNF07CisJdWludDE2X3Qgc3JjUG9ydDsKKwl1aW50MTZfdCBkc3RQb3J0OworCXVpbnQ4X3QgZHNjcDsKKwl1aW50OF90IHByb3RvY29sOworCXVpbnQ4X3QgcnN2ZDsKK30gY2RmX3BhY2tlZCB0U2lyTWFjVGNsYXNQYXJhbUlQdjQ7CisKKyNkZWZpbmUgU0lSX01BQ19UQ0xBU19JUFY0ICA0CisjZGVmaW5lIFNJUl9NQUNfVENMQVNfSVBWNiAgNgorCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjVGNsYXNQYXJhbUlQdjYgeworCXVpbnQ4X3QgdmVyc2lvbjsKKwl1aW50OF90IHNyY0lwQWRkclsxNl07CisJdWludDhfdCBkc3RJcEFkZHJbMTZdOworCXVpbnQxNl90IHNyY1BvcnQ7CisJdWludDE2X3QgZHN0UG9ydDsKKwl1aW50OF90IGZsb3dMYWJlbFszXTsKK30gY2RmX3BhY2tlZCB0U2lyTWFjVGNsYXNQYXJhbUlQdjY7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNUY2xhc1BhcmFtODAyMWRxIHsKKwl1aW50MTZfdCB0YWc7Cit9IGNkZl9wYWNrZWQgdFNpck1hY1RjbGFzUGFyYW04MDIxZHE7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNUY2xhc0lFIHsKKwl1aW50OF90IHR5cGU7CisJdWludDhfdCBsZW5ndGg7CisJdWludDhfdCB1c2VyUHJpbzsKKwl1aW50OF90IGNsYXNzaWZpZXJUeXBlOworCXVpbnQ4X3QgY2xhc3NpZmllck1hc2s7Cit9IGNkZl9wYWNrZWQgdFNpck1hY1RjbGFzSUU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNUc0RlbGF5SUUgeworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IGxlbmd0aDsKKwl1aW50MzJfdCBkZWxheTsKK30gY2RmX3BhY2tlZCB0U2lyTWFjVHNEZWxheUlFOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjU2NoZWR1bGVJbmZvIHsKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDE2X3QgcnN2ZDo5OworCXVpbnQxNl90IGRpcmVjdGlvbjoyOworCXVpbnQxNl90IHRzaWQ6NDsKKwl1aW50MTZfdCBhZ2dyZWdhdGlvbjoxOworI2Vsc2UKKwl1aW50MTZfdCBhZ2dyZWdhdGlvbjoxOworCXVpbnQxNl90IHRzaWQ6NDsKKwl1aW50MTZfdCBkaXJlY3Rpb246MjsKKwl1aW50MTZfdCByc3ZkOjk7CisjZW5kaWYKK30gY2RmX3BhY2tlZCB0U2lyTWFjU2NoZWR1bGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjU2NoZWR1bGVJRSB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgbGVuZ3RoOworCXRTaXJNYWNTY2hlZHVsZUluZm8gaW5mbzsKKwl1aW50MzJfdCBzdmNTdGFydFRpbWU7CisJdWludDMyX3Qgc3ZjSW50ZXJ2YWw7CisJdWludDE2X3QgbWF4U3ZjRHVyYXRpb247CisJdWludDE2X3Qgc3BlY0ludGVydmFsOworfSBjZGZfcGFja2VkIHRTaXJNYWNTY2hlZHVsZUlFOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjUW9zQ2FwYWJpbGl0eUlFIHsKKwl1aW50OF90IHR5cGU7CisJdWludDhfdCBsZW5ndGg7CisJdFNpck1hY1Fvc0luZm8gcW9zSW5mbzsKK30gY2RmX3BhY2tlZCB0U2lyTWFjUW9zQ2FwYWJpbGl0eUlFOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjUW9zQ2FwYWJpbGl0eVN0YUlFIHsKKwl1aW50OF90IHR5cGU7CisJdWludDhfdCBsZW5ndGg7CisJdFNpck1hY1Fvc0luZm9TdGF0aW9uIHFvc0luZm87Cit9IGNkZl9wYWNrZWQgdFNpck1hY1Fvc0NhcGFiaWxpdHlTdGFJRTsKKwordHlwZWRlZiB1aW50MzJfdCB0U2lyTWFjVGltZVN0YW1wWzJdOworCit0eXBlZGVmIHVpbnQxNl90IHRTaXJNYWNCZWFjb25JbnRlcnZhbDsKKwordHlwZWRlZiB1aW50MTZfdCB0U2lyTWFjTGlzdGVuSW50ZXJ2YWw7CisKK3R5cGVkZWYgdWludDhfdCB0U2lyTWFjQ2hhbk51bTsKKworLyogSUUgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNTU2lkSUUgeworCXVpbnQ4X3QgdHlwZTsKKwl0U2lyTWFjU1NpZCBzc0lkOworfSBjZGZfcGFja2VkIHRTaXJNYWNTU2lkSUU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNSYXRlU2V0SUUgeworCXVpbnQ4X3QgdHlwZTsKKwl0U2lyTWFjUmF0ZVNldCBzdXBwb3J0ZWRSYXRlU2V0OworfSBjZGZfcGFja2VkIHRTaXJNYWNSYXRlU2V0SUU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNEc1BhcmFtU2V0SUUgeworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IGxlbmd0aDsKKwl0U2lyTWFjQ2hhbk51bSBjaGFubmVsTnVtYmVyOworfSBjZGZfcGFja2VkIHRTaXJNYWNEc1BhcmFtU2V0SUU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNDZlBhcmFtU2V0SUUgeworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IGxlbmd0aDsKKwl0U2lyTWFjQ2ZQYXJhbVNldCBjZlBhcmFtczsKK30gY2RmX3BhY2tlZCB0U2lyTWFjQ2ZQYXJhbVNldElFOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjQ2hhbkluZm8geworCXRTaXJNYWNDaGFuTnVtIGZpcnN0Q2hhbk51bTsKKwl1aW50OF90IG51bUNoYW5uZWxzOworCWludDhfdCBtYXhUeFBvd2VyOworfSBjZGZfcGFja2VkIHRTaXJNYWNDaGFuSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY05vbkVycFByZXNlbnRJRSB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgZXJwOworfSBjZGZfcGFja2VkIHRTaXJNYWNOb25FcnBQcmVzZW50SUU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNQb3dlckNhcGFiaWxpdHlJRSB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgbWluVHhQb3dlcjsKKwl1aW50OF90IG1heFR4UG93ZXI7Cit9IHRTaXJNYWNQb3dlckNhcGFiaWxpdHlJRTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1N1cHBvcnRlZENoYW5uZWxJRSB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc3VwcG9ydGVkQ2hhbm5lbHNbOTZdOworfSB0U2lyTWFjU3VwcG9ydGVkQ2hhbm5lbElFOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjTWVhc1JlcUZpZWxkIHsKKwl1aW50OF90IGNoYW5uZWxOdW1iZXI7CisJdWludDhfdCBtZWFzU3RhcnRUaW1lWzhdOworCXVpbnQxNl90IG1lYXNEdXJhdGlvbjsKK30gdFNpck1hY01lYXNSZXFGaWVsZCwgKnRwU2lyTWFjTWVhc1JlcUZpZWxkOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjTWVhc1JlcUlFIHsKKwl1aW50OF90IHR5cGU7CisJdWludDhfdCBsZW5ndGg7CisJdWludDhfdCBtZWFzVG9rZW47CisJdWludDhfdCBtZWFzUmVxTW9kZTsKKwl1aW50OF90IG1lYXNUeXBlOworCXRTaXJNYWNNZWFzUmVxRmllbGQgbWVhc1JlcUZpZWxkOworfSB0U2lyTWFjTWVhc1JlcUlFLCAqdHBTaXJNYWNNZWFzUmVxSUU7CisKKyNkZWZpbmUgU0lSX01BQ19NQVhfU1VQUF9SQVRFUyAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgU0lSX01BQ19NQVhfU1VQUF9DSEFOTkVMUyAgICAgICAgICAgIDEwMAorI2RlZmluZSBTSVJfTUFDX01BWF9TVVBQX09QRVJfQ0xBU1NFUyAgICAgICAgMzIKKyNkZWZpbmUgU0lSX01BQ19NQVhfRVhUTl9DQVAgICAgICAgICAgICAgICA4CisKKy8qIFZIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1ZIVENhcGFiaWxpdHlJbmZvIHsKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDMyX3QgcmVzZXJ2ZWQxOjI7CisJdWludDMyX3QgdHhBbnRQYXR0ZXJuOjE7CisJdWludDMyX3QgcnhBbnRQYXR0ZXJuOjE7CisJdWludDMyX3Qgdmh0TGlua0FkYXB0Q2FwOjI7CisJdWludDMyX3QgbWF4QU1QRFVMZW5FeHA6MzsKKwl1aW50MzJfdCBodGNWSFRDYXA6MTsKKwl1aW50MzJfdCB2aHRUWE9QUFM6MTsKKwl1aW50MzJfdCBtdUJlYW1mb3JtZWVDYXA6MTsKKwl1aW50MzJfdCBtdUJlYW1mb3JtZXJDYXA6MTsKKwl1aW50MzJfdCBudW1Tb3VuZGluZ0RpbTozOworCXVpbnQzMl90IGNzbm9mQmVhbWZvcm1lckFudFN1cDozOworCXVpbnQzMl90IHN1QmVhbWZvcm1lZUNhcDoxOworCXVpbnQzMl90IHN1QmVhbUZvcm1lckNhcDoxOworCXVpbnQzMl90IHJ4U1RCQzozOworCXVpbnQzMl90IHR4U1RCQzoxOworCXVpbnQzMl90IHNob3J0R0kxNjBhbmQ4MHBsdXM4ME1IejoxOworCXVpbnQzMl90IHNob3J0R0k4ME1IejoxOworCXVpbnQzMl90IGxkcGNDb2RpbmdDYXA6MTsKKwl1aW50MzJfdCBzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ6MjsKKwl1aW50MzJfdCBtYXhNUERVTGVuOjI7CisjZWxzZQorCXVpbnQzMl90IG1heE1QRFVMZW46MjsKKwl1aW50MzJfdCBzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ6MjsKKwl1aW50MzJfdCBsZHBjQ29kaW5nQ2FwOjE7CisJdWludDMyX3Qgc2hvcnRHSTgwTUh6OjE7CisJdWludDMyX3Qgc2hvcnRHSTE2MGFuZDgwcGx1czgwTUh6OjE7CisJdWludDMyX3QgdHhTVEJDOjE7CisJdWludDMyX3QgcnhTVEJDOjM7CisJdWludDMyX3Qgc3VCZWFtRm9ybWVyQ2FwOjE7CisJdWludDMyX3Qgc3VCZWFtZm9ybWVlQ2FwOjE7CisJdWludDMyX3QgY3Nub2ZCZWFtZm9ybWVyQW50U3VwOjM7CisJdWludDMyX3QgbnVtU291bmRpbmdEaW06MzsKKwl1aW50MzJfdCBtdUJlYW1mb3JtZXJDYXA6MTsKKwl1aW50MzJfdCBtdUJlYW1mb3JtZWVDYXA6MTsKKwl1aW50MzJfdCB2aHRUWE9QUFM6MTsKKwl1aW50MzJfdCBodGNWSFRDYXA6MTsKKwl1aW50MzJfdCBtYXhBTVBEVUxlbkV4cDozOworCXVpbnQzMl90IHZodExpbmtBZGFwdENhcDoyOworCXVpbnQzMl90IHJ4QW50UGF0dGVybjoxOworCXVpbnQzMl90IHR4QW50UGF0dGVybjoxOworCXVpbnQzMl90IHJlc2VydmVkMToyOworI2VuZGlmCit9IGNkZl9wYWNrZWQgdFNpck1hY1ZIVENhcGFiaWxpdHlJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjVkhUVHhTdXBEYXRhUmF0ZUluZm8geworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKwl1aW50MTZfdCByZXNlcnZlZDozOworCXVpbnQxNl90IHR4U3VwRGF0YVJhdGU6MTM7CisjZWxzZQorCXVpbnQxNl90IHR4U3VwRGF0YVJhdGU6MTM7CisJdWludDE2X3QgcmVzZXJ2ZWQ6MzsKKyNlbmRpZgorfSBjZGZfcGFja2VkIHRTaXJNYWNWSFRUeFN1cERhdGFSYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1ZIVFJ4U3VwRGF0YVJhdGVJbmZvIHsKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDE2X3QgcmVzZXJ2ZWQ6MzsKKwl1aW50MTZfdCByeFN1cERhdGFSYXRlOjEzOworI2Vsc2UKKwl1aW50MTZfdCByeFN1cERhdGFSYXRlOjEzOworCXVpbnQxNl90IHJlc2VydmVkOjM7CisjZW5kaWYKK30gY2RmX3BhY2tlZCB0U2lyTWFjVkhUUnhTdXBEYXRhUmF0ZUluZm87CisKKy8qKgorICogc3RydWN0IHNTaXJWaHRNY3NJbmZvIC0gVkhUIE1DUyBpbmZvcm1hdGlvbgorICogQHJ4X21jc19tYXA6IFJYIE1DUyBtYXAgMiBiaXRzIGZvciBlYWNoIHN0cmVhbSwgdG90YWwgOCBzdHJlYW1zCisgKiBAcnhfaGlnaGVzdDogSW5kaWNhdGVzIGhpZ2hlc3QgbG9uZyBHSSBWSFQgUFBEVSBkYXRhIHJhdGUKKyAqICAgICAgU1RBIGNhbiByZWNlaXZlLiBSYXRlIGV4cHJlc3NlZCBpbiB1bml0cyBvZiAxIE1icHMuCisgKiAgICAgIElmIHRoaXMgZmllbGQgaXMgMCB0aGlzIHZhbHVlIHNob3VsZCBub3QgYmUgdXNlZCB0bworICogICAgICBjb25zaWRlciB0aGUgaGlnaGVzdCBSWCBkYXRhIHJhdGUgc3VwcG9ydGVkLgorICogQHR4X21jc19tYXA6IFRYIE1DUyBtYXAgMiBiaXRzIGZvciBlYWNoIHN0cmVhbSwgdG90YWwgOCBzdHJlYW1zCisgKiBAdHhfaGlnaGVzdDogSW5kaWNhdGVzIGhpZ2hlc3QgbG9uZyBHSSBWSFQgUFBEVSBkYXRhIHJhdGUKKyAqICAgICAgU1RBIGNhbiB0cmFuc21pdC4gUmF0ZSBleHByZXNzZWQgaW4gdW5pdHMgb2YgMSBNYnBzLgorICogICAgICBJZiB0aGlzIGZpZWxkIGlzIDAgdGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlIHVzZWQgdG8KKyAqICAgICAgY29uc2lkZXIgdGhlIGhpZ2hlc3QgVFggZGF0YSByYXRlIHN1cHBvcnRlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclZodE1jc0luZm8geworCXVpbnQxNl90IHJ4TWNzTWFwOworCXVpbnQxNl90IHJ4SGlnaGVzdDsKKwl1aW50MTZfdCB0eE1jc01hcDsKKwl1aW50MTZfdCB0eEhpZ2hlc3Q7Cit9IHRTaXJWaHRNY3NJbmZvOworCisvKioKKyAqIHN0cnVjdCBzU2lyVkh0Q2FwIC0gVkhUIGNhcGFiaWxpdGllcworICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHRoZSAiVkhUIGNhcGFiaWxpdGllcyBlbGVtZW50IiBhcworICogZGVzY3JpYmVkIGluIDgwMi4xMWFjIEQzLjAgOC40LjIuMTYwCisgKiBAdmh0X2NhcF9pbmZvOiBWSFQgY2FwYWJpbGl0eSBpbmZvCisgKiBAc3VwcF9tY3M6IFZIVCBNQ1Mgc3VwcG9ydGVkIHJhdGVzCisgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJWSHRDYXAgeworCXVpbnQzMl90IHZodENhcEluZm87CisJdFNpclZodE1jc0luZm8gc3VwcE1jczsKK30gdFNpclZIVENhcDsKKworLyoqCisgKiBzdHJ1Y3Qgc1Npckh0Q2FwIC0gSFQgY2FwYWJpbGl0aWVzCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgcmVmZXJzIHRvICJIVCBjYXBhYmlsaXRpZXMgZWxlbWVudCIgYXMKKyAqIGRlc2NyaWJlZCBpbiA4MDIuMTFuIGRyYWZ0IHNlY3Rpb24gNy4zLjIuNTIKKyAqLworCit0eXBlZGVmIHN0cnVjdCBzU2lySHRDYXAgeworCXVpbnQxNl90IGNhcEluZm87CisJdWludDhfdCBhbXBkdVBhcmFtc0luZm87CisJdWludDhfdCBzdXBwTWNzU2V0WzE2XTsKKwl1aW50MTZfdCBleHRlbmRlZEh0Q2FwSW5mbzsKKwl1aW50MzJfdCB0eEJGQ2FwSW5mbzsKKwl1aW50OF90IGFudGVubmFTZWxlY3Rpb25JbmZvOworfSB0U2lySFRDYXA7CisKKy8qIEhUIENhcCBhbmQgSFQgSUUgU2l6ZSBkZWZpbmVzICovCisjZGVmaW5lIEhUX0NBUEFCSUxJVFlfSUVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgSFRfSU5GT19JRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKKworLyogKi8KKy8qIERldGVybWluZXMgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIDgwMi4xMW4gU1RBICovCisvKiAqLworCit0eXBlZGVmIGVudW0gZVNpck1hY0hUT3BlcmF0aW5nTW9kZSB7CisJZVNJUl9IVF9PUF9NT0RFX1BVUkUsICAgLyogTm8gUHJvdGVjdGlvbiAqLworCWVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSwgLyogT3ZlcmxhcCBMZWdhY3kgZGV2aWNlIHByZXNlbnQsIHByb3RlY3Rpb24gaXMgb3B0aW9uYWwgKi8KKwllU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hULCAgICAgLyogTm8gbGVnYWN5IGRldmljZSwgYnV0IDIwIE1IeiBIVCBwcmVzZW50ICovCisJZVNJUl9IVF9PUF9NT0RFX01JWEVEICAgLyogUHJvdGV0aW9uIGlzIHJlcXVpcmVkICovCit9IHRTaXJNYWNIVE9wZXJhdGluZ01vZGU7CisKKy8qIFNwYXRpYWwgTXVsdGlwbGV4aW5nKFNNKSBQb3dlciBTYXZlIG1vZGUgKi8KK3R5cGVkZWYgZW51bSBlU2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUgeworCWVTSVJfSFRfTUlNT19QU19TVEFUSUMgPSAwLCAgICAgLyogU3RhdGljIFNNIFBvd2VyIFNhdmUgbW9kZSAqLworCWVTSVJfSFRfTUlNT19QU19EWU5BTUlDID0gMSwgICAgLyogRHluYW1pYyBTTSBQb3dlciBTYXZlIG1vZGUgKi8KKwllU0lSX0hUX01JTU9fUFNfTkEgPSAyLCAvKiByZXNlcnZlZCAqLworCWVTSVJfSFRfTUlNT19QU19OT19MSU1JVCA9IDMgICAgLyogU00gUG93ZXIgU2F2ZSBkaXNhYmxlZCAqLworfSB0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGU7CisKK3R5cGVkZWYgZW51bSBlU2lyTWFjSFRDaGFubmVsV2lkdGggeworCWVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaID0gMCwKKwllSFRfQ0hBTk5FTF9XSURUSF80ME1IWiA9IDEsCisJZUhUX0NIQU5ORUxfV0lEVEhfODBNSFogPSAyLAorCWVIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWiA9IDMsCisJZUhUX0NIQU5ORUxfV0lEVEhfODBQODBNSFogPSA0LAorCWVIVF9NQVhfQ0hBTk5FTF9XSURUSAorfSB0U2lyTWFjSFRDaGFubmVsV2lkdGg7CisKK3R5cGVkZWYgZW51bSBlU2lyTWFjSFRDaGFubmVsVHlwZSB7CisJZUhUX0NIQU5fTk9fSFQgPSAwLAorCWVIVF9DSEFOX0hUMjAgPSAxLAorCWVIVF9DSEFOX0hUNDBNSU5VUyA9IDIsCisJZUhUX0NIQU5fSFQ0MFBMVVMgPSAzCit9IHRTaXJNYWNIVENoYW5uZWxUeXBlOworCisvKiBQYWNrZXQgc3RydWN0IGZvciBIVCBjYXBhYmlsaXR5ICovCit0eXBlZGVmIHN0cnVjdCBzSHRDYXBzIHsKKwl1aW50MTZfdCBhZHZDb2RpbmdDYXA6MTsKKwl1aW50MTZfdCBzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ6MTsKKwl1aW50MTZfdCBtaW1vUG93ZXJTYXZlOjI7CisJdWludDE2X3QgZ3JlZW5GaWVsZDoxOworCXVpbnQxNl90IHNob3J0R0kyME1IejoxOworCXVpbnQxNl90IHNob3J0R0k0ME1IejoxOworCXVpbnQxNl90IHR4U1RCQzoxOworCXVpbnQxNl90IHJ4U1RCQzoyOworCXVpbnQxNl90IGRlbGF5ZWRCQToxOworCXVpbnQxNl90IG1heGltYWxBTVNEVXNpemU6MTsKKwl1aW50MTZfdCBkc3NzQ2NrTW9kZTQwTUh6OjE7CisJdWludDE2X3QgcHNtcDoxOworCXVpbnQxNl90IHN0YmNDb250cm9sRnJhbWU6MTsKKwl1aW50MTZfdCBsc2lnVFhPUFByb3RlY3Rpb246MTsKKwl1aW50OF90IG1heFJ4QU1QRFVGYWN0b3I6MjsKKwl1aW50OF90IG1wZHVEZW5zaXR5OjM7CisJdWludDhfdCByZXNlcnZlZDE6MzsKKwl1aW50OF90IHN1cHBvcnRlZE1DU1NldFsxNl07CisJdWludDE2X3QgcGNvOjE7CisJdWludDE2X3QgdHJhbnNpdGlvblRpbWU6MjsKKwl1aW50MTZfdCByZXNlcnZlZDI6NTsKKwl1aW50MTZfdCBtY3NGZWVkYmFjazoyOworCXVpbnQxNl90IHJlc2VydmVkMzo2OworCXVpbnQzMl90IHR4QkY6MTsKKwl1aW50MzJfdCByeFN0YWdnZXJlZFNvdW5kaW5nOjE7CisJdWludDMyX3QgdHhTdGFnZ2VyZWRTb3VuZGluZzoxOworCXVpbnQzMl90IHJ4WkxGOjE7CisJdWludDMyX3QgdHhaTEY6MTsKKwl1aW50MzJfdCBpbXBsaWNpdFR4QkY6MTsKKwl1aW50MzJfdCBjYWxpYnJhdGlvbjoyOworCXVpbnQzMl90IGV4cGxpY2l0Q1NJVHhCRjoxOworCXVpbnQzMl90IGV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXg6MTsKKwl1aW50MzJfdCBleHBsaWNpdEJGQ1NJRmVlZGJhY2s6MzsKKwl1aW50MzJfdCBleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2s6MzsKKwl1aW50MzJfdCBleHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrOjM7CisJdWludDMyX3QgY3NpTnVtQkZBbnRlbm5hZToyOworCXVpbnQzMl90IHVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZToyOworCXVpbnQzMl90IGNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU6MjsKKwl1aW50MzJfdCByZXNlcnZlZDQ6NzsKKwl1aW50OF90IGFudGVubmFTZWxlY3Rpb246MTsKKwl1aW50OF90IGV4cGxpY2l0Q1NJRmVlZGJhY2tUeDoxOworCXVpbnQ4X3QgYW50ZW5uYUluZGljZXNGZWVkYmFja1R4OjE7CisJdWludDhfdCBleHBsaWNpdENTSUZlZWRiYWNrOjE7CisJdWludDhfdCBhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrOjE7CisJdWludDhfdCByeEFTOjE7CisJdWludDhfdCB0eFNvdW5kaW5nUFBEVXM6MTsKKwl1aW50OF90IHJlc2VydmVkNToxOworCit9IGNkZl9wYWNrZWQgdEh0Q2FwczsKKworLyogRHVyaW5nIDExaCBjaGFubmVsIHN3aXRjaCwgdGhlIEFQIGNhbiBpbmRpY2F0ZSBpZiB0aGUKKyAqIFNUQSBuZWVkcyB0byBzdG9wIHRoZSB0cmFuc21pc3Npb24gb3IgY29udGludWUgdW50aWwgdGhlCisgKiBjaGFubmVsLXN3aXRjaC4KKyAqIGVTSVJfQ0hBTlNXX01PREVfTk9STUFMIC0gU1RBIGNhbiBjb250aW51ZSB0cmFuc21pc3Npb24KKyAqIGVTSVJfQ0hBTlNXX01PREVfU0lMRU5UIC0gU1RBIHNob3VsZCBzdG9wIHRyYW5zbWlzc2lvbgorICovCit0eXBlZGVmIGVudW0gZVNpck1hY0NoYW5Td01vZGUgeworCWVTSVJfQ0hBTlNXX01PREVfTk9STUFMID0gMCwKKwllU0lSX0NIQU5TV19NT0RFX1NJTEVOVCA9IDEKK30gdFNpck1hY0NoYW5Td2l0Y2hNb2RlOworCit0eXBlZGVmIHN0cnVjdCBfQmFyQ29udHJvbCB7CisKKyNpZm5kZWYgQU5JX0JJR19CWVRFX0VORElBTgorCisJdWludDE2X3QgYmFyQWNrUG9saWN5OjE7CisJdWludDE2X3QgbXVsdGlUSUQ6MTsKKwl1aW50MTZfdCBiaXRNYXA6MTsKKwl1aW50MTZfdCByc3ZkOjk7CisJdWludDE2X3QgbnVtVElEOjQ7CisKKyNlbHNlCisJdWludDE2X3QgbnVtVElEOjQ7CisJdWludDE2X3QgcnN2ZDo5OworCXVpbnQxNl90IGJpdE1hcDoxOworCXVpbnQxNl90IG11bHRpVElEOjE7CisJdWludDE2X3QgYmFyQWNrUG9saWN5OjE7CisKKyNlbmRpZgorCit9IGNkZl9wYWNrZWQgYmFyQ3RybFR5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9CQVJGcm1TdHJ1Y3QgeworCXRTaXJNYWNGcmFtZUN0bCBmYzsKKwl1aW50MTZfdCBkdXJhdGlvbjsKKwl0U2lyTWFjQWRkciByeEFkZHI7CisJdFNpck1hY0FkZHIgdHhBZGRyOworCWJhckN0cmxUeXBlIGJhckNvbnRyb2w7CisJdFNpck1hY1NlcUN0bCBzc25DdHJsOworfSBjZGZfcGFja2VkIEJBUkZybVR5cGU7CisKKy8qIFN1cHBvcnRlZCBNQ1Mgc2V0ICovCisjZGVmaW5lIFNJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFNJWkVfT0ZfQkFTSUNfTUNTX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFZBTElEX01DU19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc3ICAgLyogMC03NiAqLworI2RlZmluZSBNQ1NfUlhfSElHSEVTVF9TVVBQT1JURURfUkFURV9CWVRFX09GRlNFVCAgICAgICAgICAxMAorI2RlZmluZSBWQUxJRF9NQVhfTUNTX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisKKy8qICovCisvKiBUaGUgZm9sbG93aW5nIGVudW1zIHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlICJjdXJyZW50IiBIVCBDYXBhYmlsaXRpZXMgb2YgKi8KKy8qIHRoZSBsb2NhbCBTVEEgaW4gYSBnZW5lcmljIGZhc2hpb24uIEluIG90aGVyIHdvcmRzLCB0aGUgZm9sbG93aW5nIGVudW1zICovCisvKiBpZGVudGlmeSB0aGUgSFQgY2FwYWJpbGl0aWVzIHRoYXQgY2FuIGJlIHF1ZXJpZWQgb3Igc2V0LiAqLworLyogKi8KK3R5cGVkZWYgZW51bSBlSFRDYXBhYmlsaXR5IHsKKwllSFRfTFNJR19UWE9QX1BST1RFQ1RJT04sCisJZUhUX1NUQkNfQ09OVFJPTF9GUkFNRSwKKwllSFRfUFNNUCwKKwllSFRfRFNTU19DQ0tfTU9ERV80ME1IWiwKKwllSFRfTUFYX0FNU0RVX0xFTkdUSCwKKwllSFRfUlhfU1RCQywKKwllSFRfVFhfU1RCQywKKwllSFRfU0hPUlRfR0lfNDBNSFosCisJZUhUX1NIT1JUX0dJXzIwTUhaLAorCWVIVF9HUkVFTkZJRUxELAorCWVIVF9NSU1PX1BPV0VSX1NBVkUsCisJZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVCwKKwllSFRfQURWQU5DRURfQ09ESU5HLAorCWVIVF9NQVhfUlhfQU1QRFVfRkFDVE9SLAorCWVIVF9NUERVX0RFTlNJVFksCisJZUhUX1BDTywKKwllSFRfVFJBTlNJVElPTl9USU1FLAorCWVIVF9NQ1NfRkVFREJBQ0ssCisJZUhUX1RYX0JFQU1GT1JNSU5HLAorCWVIVF9BTlRFTk5BX1NFTEVDVElPTiwKKwkvKiBUaGUgZm9sbG93aW5nIGNvbWUgdW5kZXIgQWRkaXRpb25hbCBIVCBDYXBhYmlsaXRpZXMgKi8KKwllSFRfU0lfR1JBTlVMQVJJVFksCisJZUhUX0NPTlRST0xMRURfQUNDRVNTLAorCWVIVF9SSUZTX01PREUsCisJZUhUX1JFQ09NTUVOREVEX1RYX1dJRFRIX1NFVCwKKwllSFRfRVhURU5TSU9OX0NIQU5ORUxfT0ZGU0VULAorCWVIVF9PUF9NT0RFLAorCWVIVF9CQVNJQ19TVEJDX01DUywKKwllSFRfRFVBTF9DVFNfUFJPVEVDVElPTiwKKwllSFRfTFNJR19UWE9QX1BST1RFQ1RJT05fRlVMTF9TVVBQT1JULAorCWVIVF9QQ09fQUNUSVZFLAorCWVIVF9QQ09fUEhBU0UKK30gdEhUQ2FwYWJpbGl0eTsKKworLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNIVENhcGFiaWxpdHlJbmZvIHsKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDE2X3QgbHNpZ1RYT1BQcm90ZWN0aW9uOjE7ICAvKiBEeW5hbWljIHN0YXRlICovCisJdWludDE2X3Qgc3RiY0NvbnRyb2xGcmFtZToxOyAgICAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQxNl90IHBzbXA6MTsgICAgICAgIC8qIFN0YXRpYyB2aWEgQ0ZHICovCisJdWludDE2X3QgZHNzc0Nja01vZGU0ME1IejoxOyAgICAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQxNl90IG1heGltYWxBTVNEVXNpemU6MTsgICAgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50MTZfdCBkZWxheWVkQkE6MTsgICAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQxNl90IHJ4U1RCQzoyOyAgICAgIC8qIFN0YXRpYyB2aWEgQ0ZHICovCisJdWludDE2X3QgdHhTVEJDOjE7ICAgICAgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50MTZfdCBzaG9ydEdJNDBNSHo6MTsgICAgICAgIC8qIFN0YXRpYyB2aWEgQ0ZHICovCisJdWludDE2X3Qgc2hvcnRHSTIwTUh6OjE7ICAgICAgICAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQxNl90IGdyZWVuRmllbGQ6MTsgIC8qIFN0YXRpYyB2aWEgQ0ZHICovCisJdWludDE2X3QgbWltb1Bvd2VyU2F2ZToyOyAgICAgICAvKiBEeW5hbWljIHN0YXRlICovCisJdWludDE2X3Qgc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OjE7ICAgIC8qIFN0YXRpYyB2aWEgQ0ZHICovCisJdWludDE2X3QgYWR2Q29kaW5nQ2FwOjE7ICAgICAgICAvKiBTdGF0aWMgdmlhIENGRyAqLworI2Vsc2UKKwl1aW50MTZfdCBhZHZDb2RpbmdDYXA6MTsKKwl1aW50MTZfdCBzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ6MTsKKwl1aW50MTZfdCBtaW1vUG93ZXJTYXZlOjI7CisJdWludDE2X3QgZ3JlZW5GaWVsZDoxOworCXVpbnQxNl90IHNob3J0R0kyME1IejoxOworCXVpbnQxNl90IHNob3J0R0k0ME1IejoxOworCXVpbnQxNl90IHR4U1RCQzoxOworCXVpbnQxNl90IHJ4U1RCQzoyOworCXVpbnQxNl90IGRlbGF5ZWRCQToxOworCXVpbnQxNl90IG1heGltYWxBTVNEVXNpemU6MTsKKwl1aW50MTZfdCBkc3NzQ2NrTW9kZTQwTUh6OjE7CisJdWludDE2X3QgcHNtcDoxOworCXVpbnQxNl90IHN0YmNDb250cm9sRnJhbWU6MTsKKwl1aW50MTZfdCBsc2lnVFhPUFByb3RlY3Rpb246MTsKKyNlbmRpZgorfSBjZGZfcGFja2VkIHRTaXJNYWNIVENhcGFiaWxpdHlJbmZvOworCisvKiBIVCBQYXJhbWV0ZXJzIEluZm8gKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNIVFBhcmFtZXRlcnNJbmZvIHsKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDhfdCByZXNlcnZlZDozOworCXVpbnQ4X3QgbXBkdURlbnNpdHk6MzsgIC8qIER5bmFtaWMgc3RhdGUgKi8KKwl1aW50OF90IG1heFJ4QU1QRFVGYWN0b3I6MjsgICAgIC8qIER5bmFtaWMgc3RhdGUgKi8KKyNlbHNlCisJdWludDhfdCBtYXhSeEFNUERVRmFjdG9yOjI7CisJdWludDhfdCBtcGR1RGVuc2l0eTozOworCXVpbnQ4X3QgcmVzZXJ2ZWQ6MzsKKyNlbmRpZgorfSBjZGZfcGFja2VkIHRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvOworCisvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY0V4dGVuZGVkSFRDYXBhYmlsaXR5SW5mbyB7CisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorCXVpbnQxNl90IHJlc2VydmVkMjo2OworCXVpbnQxNl90IG1jc0ZlZWRiYWNrOjI7IC8qIFN0YXRpYyB2aWEgQ0ZHICovCisJdWludDE2X3QgcmVzZXJ2ZWQxOjU7CisJdWludDE2X3QgdHJhbnNpdGlvblRpbWU6MjsgICAgICAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQxNl90IHBjbzoxOyAgICAgICAgIC8qIFN0YXRpYyB2aWEgQ0ZHICovCisjZWxzZQorCXVpbnQxNl90IHBjbzoxOworCXVpbnQxNl90IHRyYW5zaXRpb25UaW1lOjI7CisJdWludDE2X3QgcmVzZXJ2ZWQxOjU7CisJdWludDE2X3QgbWNzRmVlZGJhY2s6MjsKKwl1aW50MTZfdCByZXNlcnZlZDI6NjsKKyNlbmRpZgorfSBjZGZfcGFja2VkIHRTaXJNYWNFeHRlbmRlZEhUQ2FwYWJpbGl0eUluZm87CisKKy8qIElFRUUgODAyLjExbi9ENy4wIC0gNy4zLjIuNTcuNCAqLworLyogUGFydCBvZiB0aGUgInN1cHBvcnRlZCBNQ1Mgc2V0IGZpZWxkIiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1J4SGlnaGVzdFN1cHBvcnRSYXRlIHsKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDE2X3QgcmVzZXJ2ZWQ6NjsKKwl1aW50MTZfdCByYXRlOjEwOworI2Vsc2UKKwl1aW50MTZfdCByYXRlOjEwOworCXVpbnQxNl90IHJlc2VydmVkOjY7CisjZW5kaWYKK30gY2RmX3BhY2tlZCB0U2lyTWFjUnhIaWdoZXN0U3VwcG9ydFJhdGUsICp0cFNpck1hY1J4SGlnaGVzdFN1cHBvcnRSYXRlOworCisvKiBUcmFuc21pdCBCZWFtIEZvcm1pbmcgQ2FwYWJpbGl0aWVzIEluZm8gKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNUeEJGQ2FwYWJpbGl0eUluZm8geworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKwl1aW50MzJfdCByZXNlcnZlZDo3OworCXVpbnQzMl90IGNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU6MjsgIC8qIFN0YXRpYyB2aWEgQ0ZHICovCisJLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50MzJfdCB1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU6MjsKKwl1aW50MzJfdCBjc2lOdW1CRkFudGVubmFlOjI7ICAgIC8qIFN0YXRpYyB2aWEgQ0ZHICovCisJLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50MzJfdCBleHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrOjM7CisJLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50MzJfdCBleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2s6MzsKKwl1aW50MzJfdCBleHBsaWNpdEJGQ1NJRmVlZGJhY2s6MzsgICAgICAgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50MzJfdCBleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4OjE7ICAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQzMl90IGV4cGxpY2l0Q1NJVHhCRjoxOyAgICAgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50MzJfdCBjYWxpYnJhdGlvbjoyOyAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQzMl90IGltcGxpY2l0VHhCRjoxOyAgICAgICAgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50MzJfdCB0eFpMRjoxOyAgICAgICAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQzMl90IHJ4WkxGOjE7ICAgICAgIC8qIFN0YXRpYyB2aWEgQ0ZHICovCisJdWludDMyX3QgdHhTdGFnZ2VyZWRTb3VuZGluZzoxOyAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQzMl90IHJ4U3RhZ2dlcmVkU291bmRpbmc6MTsgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50MzJfdCB0eEJGOjE7ICAgICAgICAvKiBTdGF0aWMgdmlhIENGRyAqLworI2Vsc2UKKwl1aW50MzJfdCB0eEJGOjE7CisJdWludDMyX3QgcnhTdGFnZ2VyZWRTb3VuZGluZzoxOworCXVpbnQzMl90IHR4U3RhZ2dlcmVkU291bmRpbmc6MTsKKwl1aW50MzJfdCByeFpMRjoxOworCXVpbnQzMl90IHR4WkxGOjE7CisJdWludDMyX3QgaW1wbGljaXRUeEJGOjE7CisJdWludDMyX3QgY2FsaWJyYXRpb246MjsKKwl1aW50MzJfdCBleHBsaWNpdENTSVR4QkY6MTsKKwl1aW50MzJfdCBleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4OjE7CisJdWludDMyX3QgZXhwbGljaXRCRkNTSUZlZWRiYWNrOjM7CisJdWludDMyX3QgZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrOjM7CisJdWludDMyX3QgZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjazozOworCXVpbnQzMl90IGNzaU51bUJGQW50ZW5uYWU6MjsKKwl1aW50MzJfdCB1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU6MjsKKwl1aW50MzJfdCBjb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlOjI7CisJdWludDMyX3QgcmVzZXJ2ZWQ6NzsKKyNlbmRpZgorfSBjZGZfcGFja2VkIHRTaXJNYWNUeEJGQ2FwYWJpbGl0eUluZm87CisKKy8qIEFudGVubmEgU2VsZWN0aW9uIENhcGFiaWxpdHkgSW5mbyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY0FTQ2FwYWJpbGl0eUluZm8geworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKwl1aW50OF90IHJlc2VydmVkMjoxOworCXVpbnQ4X3QgdHhTb3VuZGluZ1BQRFVzOjE7ICAgICAgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50OF90IHJ4QVM6MTsgICAgICAgICAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQ4X3QgYW50ZW5uYUluZGljZXNGZWVkYmFjazoxOyAgICAgICAvKiBTdGF0aWMgdmlhIENGRyAqLworCXVpbnQ4X3QgZXhwbGljaXRDU0lGZWVkYmFjazoxOyAgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50OF90IGFudGVubmFJbmRpY2VzRmVlZGJhY2tUeDoxOyAgICAgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50OF90IGV4cGxpY2l0Q1NJRmVlZGJhY2tUeDoxOyAgICAgICAgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50OF90IGFudGVubmFTZWxlY3Rpb246MTsgICAgIC8qIFN0YXRpYyB2aWEgQ0ZHICovCisjZWxzZQorCXVpbnQ4X3QgYW50ZW5uYVNlbGVjdGlvbjoxOworCXVpbnQ4X3QgZXhwbGljaXRDU0lGZWVkYmFja1R4OjE7CisJdWludDhfdCBhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHg6MTsKKwl1aW50OF90IGV4cGxpY2l0Q1NJRmVlZGJhY2s6MTsKKwl1aW50OF90IGFudGVubmFJbmRpY2VzRmVlZGJhY2s6MTsKKwl1aW50OF90IHJ4QVM6MTsKKwl1aW50OF90IHR4U291bmRpbmdQUERVczoxOworCXVpbnQ4X3QgcmVzZXJ2ZWQyOjE7CisjZW5kaWYKK30gY2RmX3BhY2tlZCB0U2lyTWFjQVNDYXBhYmlsaXR5SW5mbzsKKworLyogQWRkaXRpb25hbCBIVCBJRSBGaWVsZDEgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNIVEluZm9GaWVsZDEgeworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKwl1aW50OF90IHNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5OjM7ICAgLyogRHluYW1pYyBzdGF0ZSAqLworCXVpbnQ4X3QgY29udHJvbGxlZEFjY2Vzc09ubHk6MTsgLyogU3RhdGljIHZpYSBDRkcgKi8KKwl1aW50OF90IHJpZnNNb2RlOjE7ICAgICAvKiBEeW5hbWljIHN0YXRlICovCisJdWludDhfdCByZWNvbW1lbmRlZFR4V2lkdGhTZXQ6MTsgICAgICAgIC8qIER5bmFtaWMgc3RhdGUgKi8KKwl1aW50OF90IHNlY29uZGFyeUNoYW5uZWxPZmZzZXQ6MjsgICAgICAgLyogRHluYW1pYyBzdGF0ZSAqLworI2Vsc2UKKwl1aW50OF90IHNlY29uZGFyeUNoYW5uZWxPZmZzZXQ6MjsKKwl1aW50OF90IHJlY29tbWVuZGVkVHhXaWR0aFNldDoxOworCXVpbnQ4X3Qgcmlmc01vZGU6MTsKKwl1aW50OF90IGNvbnRyb2xsZWRBY2Nlc3NPbmx5OjE7CisJdWludDhfdCBzZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eTozOworI2VuZGlmCit9IGNkZl9wYWNrZWQgdFNpck1hY0hUSW5mb0ZpZWxkMTsKKworLyogQWRkaXRpb25hbCBIVCBJRSBGaWVsZDIgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNIVEluZm9GaWVsZDIgeworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKwl1aW50MTZfdCByZXNlcnZlZDoxMTsKKwl1aW50MTZfdCBvYnNzTm9uSFRTdGFQcmVzZW50OjE7IC8qYWRkZWQgZm9yIE9ic3MgICovCisJdWludDE2X3QgdHJhbnNtaXRCdXJzdExpbWl0OjE7CisJdWludDE2X3Qgbm9uR0ZEZXZpY2VzUHJlc2VudDoxOworCXVpbnQxNl90IG9wTW9kZToyOyAgICAgIC8qIER5bmFtaWMgc3RhdGUgKi8KKyNlbHNlCisJdWludDE2X3Qgb3BNb2RlOjI7CisJdWludDE2X3Qgbm9uR0ZEZXZpY2VzUHJlc2VudDoxOworCXVpbnQxNl90IHRyYW5zbWl0QnVyc3RMaW1pdDoxOworCXVpbnQxNl90IG9ic3NOb25IVFN0YVByZXNlbnQ6MTsgLyphZGRlZCBmb3IgT2JzcyAgKi8KKwl1aW50MTZfdCByZXNlcnZlZDoxMTsKKyNlbmRpZgorfSBjZGZfcGFja2VkIHRTaXJNYWNIVEluZm9GaWVsZDI7CisKKy8qIEFkZGl0aW9uYWwgSFQgSUUgRmllbGQzICovCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjSFRJbmZvRmllbGQzIHsKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJdWludDE2X3QgcmVzZXJ2ZWQ6NDsKKwl1aW50MTZfdCBwY29QaGFzZToxOyAgICAvKiBEeW5hbWljIHN0YXRlICovCisJdWludDE2X3QgcGNvQWN0aXZlOjE7ICAgLyogRHluYW1pYyBzdGF0ZSAqLworCXVpbnQxNl90IGxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OjE7ICAgICAgIC8qIER5bmFtaWMgc3RhdGUgKi8KKwl1aW50MTZfdCBzZWNvbmRhcnlCZWFjb246MTsgICAgIC8qIER5bmFtaWMgc3RhdGUgKi8KKwl1aW50MTZfdCBkdWFsQ1RTUHJvdGVjdGlvbjoxOyAgIC8qIER5bmFtaWMgc3RhdGUgKi8KKwl1aW50MTZfdCBiYXNpY1NUQkNNQ1M6NzsgICAgICAgIC8qIER5bmFtaWMgc3RhdGUgKi8KKyNlbHNlCisJdWludDE2X3QgYmFzaWNTVEJDTUNTOjc7CisJdWludDE2X3QgZHVhbENUU1Byb3RlY3Rpb246MTsKKwl1aW50MTZfdCBzZWNvbmRhcnlCZWFjb246MTsKKwl1aW50MTZfdCBsc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDoxOworCXVpbnQxNl90IHBjb0FjdGl2ZToxOworCXVpbnQxNl90IHBjb1BoYXNlOjE7CisJdWludDE2X3QgcmVzZXJ2ZWQ6NDsKKyNlbmRpZgorfSBjZGZfcGFja2VkIHRTaXJNYWNIVEluZm9GaWVsZDM7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNQcm9iZVJlcUZyYW1lIHsKKwl0U2lyTWFjU1NpZElFIHNzSWRJRTsKKwl0U2lyTWFjUmF0ZVNldElFIHJhdGVTZXRJRTsKKwl0U2lyTWFjUmF0ZVNldElFIGV4dGVuZGVkUmF0ZVNldElFOworfSBjZGZfcGFja2VkIHRTaXJNYWNQcm9iZVJlcUZyYW1lLCAqdHBTaXJNYWNQcm9iZVJlcUZyYW1lOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjUHJvYmVSc3BGcmFtZSB7CisJdFNpck1hY1RpbWVTdGFtcCB0czsKKwl0U2lyTWFjQmVhY29uSW50ZXJ2YWwgYmVhY29uSW50ZXJ2YWw7CisJdFNpck1hY0NhcGFiaWxpdHlJbmZvIGNhcGFiaWxpdHlJbmZvOworCXRTaXJNYWNTU2lkSUUgc3NJZElFOworCXRTaXJNYWNSYXRlU2V0SUUgcmF0ZVNldElFOworCXRTaXJNYWNSYXRlU2V0SUUgZXh0ZW5kZWRSYXRlU2V0SUU7CisJdFNpck1hY05vbkVycFByZXNlbnRJRSBub25FcnBQcmVzZW50OworCXRTaXJNYWNEc1BhcmFtU2V0SUUgZHNQYXJhbXNJRTsKKwl0U2lyTWFjQ2ZQYXJhbVNldElFIGNmUGFyYW1zSUU7Cit9IGNkZl9wYWNrZWQgdFNpck1hY1Byb2JlUnNwRnJhbWUsICp0cFNpck1hY1Byb2JlUnNwRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNBdXRoRnJhbWVCb2R5IHsKKwl1aW50MTZfdCBhdXRoQWxnb051bWJlcjsKKwl1aW50MTZfdCBhdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXI7CisJdWludDE2X3QgYXV0aFN0YXR1c0NvZGU7CisJdWludDhfdCB0eXBlOyAgICAgICAgICAgLyogPSBTSVJfTUFDX0NIQUxMRU5HRV9URVhUX0VJRCAqLworCXVpbnQ4X3QgbGVuZ3RoOyAgICAgICAgIC8qID0gU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9MRU5HVEggKi8KKwl1aW50OF90IGNoYWxsZW5nZVRleHRbU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9MRU5HVEhdOworfSBjZGZfcGFja2VkIHRTaXJNYWNBdXRoRnJhbWVCb2R5LCAqdHBTaXJNYWNBdXRoRnJhbWVCb2R5OworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjQXV0aGVudGljYXRpb25GcmFtZSB7CisJdFNpck1hY0F1dGhGcmFtZUJvZHkgYXV0aEZyYW1lQm9keTsKK30gY2RmX3BhY2tlZCB0U2lyTWFjQXV0aEZyYW1lLCAqdHBTaXJNYWNBdXRoRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNBc3NvY1JlcUZyYW1lIHsKKwl0U2lyTWFjQ2FwYWJpbGl0eUluZm8gY2FwYWJpbGl0eUluZm87CisJdWludDE2X3QgbGlzdGVuSW50ZXJ2YWw7CisJdFNpck1hY1NTaWRJRSBzc0lkSUU7CisJdFNpck1hY1JhdGVTZXRJRSByYXRlU2V0SUU7CisJdFNpck1hY1JhdGVTZXRJRSBleHRlbmRlZFJhdGVTZXRJRTsKK30gY2RmX3BhY2tlZCB0U2lyTWFjQXNzb2NSZXFGcmFtZSwgKnRwU2lyTWFjQXNzb2NSZXFGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY0Fzc29jUnNwRnJhbWUgeworCXRTaXJNYWNDYXBhYmlsaXR5SW5mbyBjYXBhYmlsaXR5SW5mbzsKKwl1aW50MTZfdCBzdGF0dXNDb2RlOworCXVpbnQxNl90IGFpZDsKKwl0U2lyTWFjUmF0ZVNldElFIHN1cHBvcnRlZFJhdGVzOworCXRTaXJNYWNSYXRlU2V0SUUgZXh0ZW5kZWRSYXRlU2V0SUU7Cit9IGNkZl9wYWNrZWQgdFNpck1hY0Fzc29jUnNwRnJhbWUsICp0cFNpck1hY0Fzc29jUnNwRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNEaXNhc3NvY0ZyYW1lIHsKKwl1aW50MTZfdCByZWFzb25Db2RlOworfSBjZGZfcGFja2VkIHRTaXJNYWNEaXNhc3NvY0ZyYW1lLCAqdHBTaXJNYWNEaXNhc3NvY0ZyYW1lOworCit0eXBlZGVmIHN0cnVjdCBzRFNpck1hY0RlYXV0aEZyYW1lIHsKKwl1aW50MTZfdCByZWFzb25Db2RlOworfSBjZGZfcGFja2VkIHRTaXJNYWNEZWF1dGhGcmFtZSwgKnRwU2lyTWFjRGVhdXRoRnJhbWU7CisKKy8qIC8gQ29tbW9uIGhlYWRlciBmb3IgYWxsIGFjdGlvbiBmcmFtZXMgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNBY3Rpb25GcmFtZUhkciB7CisJdWludDhfdCBjYXRlZ29yeTsKKwl1aW50OF90IGFjdGlvbklEOworfSBjZGZfcGFja2VkIHRTaXJNYWNBY3Rpb25GcmFtZUhkciwgKnRwU2lyTWFjQWN0aW9uRnJhbWVIZHI7CisKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNWZW5kb3JTcGVjaWZpY0ZyYW1lSGRyIHsKKwl1aW50OF90IGNhdGVnb3J5OworCXVpbnQ4X3QgT3VpWzRdOworfSBjZGZfcGFja2VkIHRTaXJNYWNWZW5kb3JTcGVjaWZpY0ZyYW1lSGRyLAorKnRwU2lyTWFjVmVuZG9yU3BlY2lmaWNGcmFtZUhkcjsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjVmVuZG9yU3BlY2lmaWNQdWJsaWNBY3Rpb25GcmFtZUhkciB7CisJdWludDhfdCBjYXRlZ29yeTsKKwl1aW50OF90IGFjdGlvbklEOworCXVpbnQ4X3QgT3VpWzRdOworCXVpbnQ4X3QgT3VpU3ViVHlwZTsKKwl1aW50OF90IGRpYWxvZ1Rva2VuOworfSBjZGZfcGFja2VkIHRTaXJNYWNWZW5kb3JTcGVjaWZpY1B1YmxpY0FjdGlvbkZyYW1lSGRyLAorKnRwU2lyTWFjVmVuZG9yU3BlY2lmaWNQdWJsaWNBY3Rpb25GcmFtZUhkcjsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1AyUEFjdGlvbkZyYW1lSGRyIHsKKwl1aW50OF90IGNhdGVnb3J5OworCXVpbnQ4X3QgT3VpWzRdOworCXVpbnQ4X3QgT3VpU3ViVHlwZTsKKwl1aW50OF90IGRpYWxvZ1Rva2VuOworfSBjZGZfcGFja2VkIHRTaXJNYWNQMlBBY3Rpb25GcmFtZUhkciwgKnRwU2lyTWFjUDJQQWN0aW9uRnJhbWVIZHI7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNNZWFzQWN0aW9uRnJhbWVIZHIgeworCXVpbnQ4X3QgY2F0ZWdvcnk7CisJdWludDhfdCBhY3Rpb25JRDsKKwl1aW50OF90IGRpYWxvZ1Rva2VuOworfSB0U2lyTWFjTWVhc0FjdGlvbkZyYW1lSGRyLCAqdHBTaXJNYWNNZWFzQWN0aW9uRnJhbWVIZHI7CisKKyNpZmRlZiBBTklfU1VQUE9SVF8xMUgKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNUcGNSZXFBY3Rpb25GcmFtZSB7CisJdFNpck1hY01lYXNBY3Rpb25GcmFtZUhkciBhY3Rpb25IZWFkZXI7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgbGVuZ3RoOworfSB0U2lyTWFjVHBjUmVxQWN0aW9uRnJhbWUsICp0cFNpck1hY1RwY1JlcUFjdGlvbkZyYW1lOwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY01lYXNSZXFBY3Rpb25GcmFtZSB7CisJdFNpck1hY01lYXNBY3Rpb25GcmFtZUhkciBhY3Rpb25IZWFkZXI7CisJdFNpck1hY01lYXNSZXFJRSBtZWFzUmVxSUU7Cit9IHRTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUsICp0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNOZWlnaGJvclJlcG9ydFJlcSB7CisJdWludDhfdCBkaWFsb2dUb2tlbjsKKwl1aW50OF90IHNzaWRfcHJlc2VudDsKKwl0U2lyTWFjU1NpZCBzc2lkOworfSB0U2lyTWFjTmVpZ2hib3JSZXBvcnRSZXEsICp0cFNpck1hY05laWdoYm9yUmVwb3J0UmVxOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjTGlua1JlcG9ydCB7CisJdWludDhfdCBkaWFsb2dUb2tlbjsKKwl1aW50OF90IHR4UG93ZXI7CisJdWludDhfdCByeEFudGVubmE7CisJdWludDhfdCB0eEFudGVubmE7CisJdWludDhfdCByY3BpOworCXVpbnQ4X3QgcnNuaTsKK30gdFNpck1hY0xpbmtSZXBvcnQsICp0cFNpck1hY0xpbmtSZXBvcnQ7CisKKyNkZWZpbmUgQkVBQ09OX1JFUE9SVF9NQVhfSUVTIDIyNCAgICAgICAvKiBSZWZlciBJRUVFIDgwMi4xMWstMjAwOCwgVGFibGUgNy0zMWQgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNCZWFjb25SZXBvcnQgeworCXVpbnQ4X3QgcmVnQ2xhc3M7CisJdWludDhfdCBjaGFubmVsOworCXVpbnQ4X3QgbWVhc1N0YXJ0VGltZVs4XTsKKwl1aW50OF90IG1lYXNEdXJhdGlvbjsKKwl1aW50OF90IHBoeVR5cGU7CisJdWludDhfdCBiY25Qcm9iZVJzcDsKKwl1aW50OF90IHJzbmk7CisJdWludDhfdCByY3BpOworCXRTaXJNYWNBZGRyIGJzc2lkOworCXVpbnQ4X3QgYW50ZW5uYUlkOworCXVpbnQzMl90IHBhcmVudFRTRjsKKwl1aW50OF90IG51bUllczsKKwl1aW50OF90IEllc1tCRUFDT05fUkVQT1JUX01BWF9JRVNdOworCit9IHRTaXJNYWNCZWFjb25SZXBvcnQsICp0cFNpck1hY0JlYWNvblJlcG9ydDsKKworI2RlZmluZSBSQURJT19SRVBPUlRTX01BWF9JTl9BX0ZSQU1FIDQKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQgeworCXVpbnQ4X3QgdG9rZW47CisJdWludDhfdCByZWZ1c2VkOworCXVpbnQ4X3QgaW5jYXBhYmxlOworCXVpbnQ4X3QgdHlwZTsKKwl1bmlvbiB7CisJCXRTaXJNYWNCZWFjb25SZXBvcnQgYmVhY29uUmVwb3J0OworCX0gcmVwb3J0OworCit9IHRTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQsICp0cFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydDsKKworI2VuZGlmCisKKy8qIFFPUyBhY3Rpb24gZnJhbWUgZGVmaW5pdGlvbnMgKi8KKworLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSB0Y2xhcyBlbGVtZW50cyBpbiBhbnkgZnJhbWUgKi8KKyNkZWZpbmUgU0lSX01BQ19UQ0xBU0lFX01BWE5VTSAgMgorCisvKiAxMWIgcmF0ZSBlbmNvZGluZyBpbiBNQUMgZm9ybWF0ICovCisKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzEgICAweDAyCisjZGVmaW5lIFNJUl9NQUNfUkFURV8yICAgMHgwNAorI2RlZmluZSBTSVJfTUFDX1JBVEVfNV81IDB4MEIKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzExICAweDE2CisKKy8qIDExYS9nIHJhdGUgZW5jb2RpbmcgaW4gTUFDIGZvcm1hdCAqLworCisjZGVmaW5lIFNJUl9NQUNfUkFURV82ICAgMHgwQworI2RlZmluZSBTSVJfTUFDX1JBVEVfOSAgIDB4MTIKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzEyICAweDE4CisjZGVmaW5lIFNJUl9NQUNfUkFURV8xOCAgMHgyNAorI2RlZmluZSBTSVJfTUFDX1JBVEVfMjQgIDB4MzAKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzM2ICAweDQ4CisjZGVmaW5lIFNJUl9NQUNfUkFURV80OCAgMHg2MAorI2RlZmluZSBTSVJfTUFDX1JBVEVfNTQgIDB4NkMKKworLyogQU5JIGxlZ2FjeSBzdXBwb3J0ZWQgcmF0ZXMgKi8KKyNkZWZpbmUgU0lSX01BQ19SQVRFXzcyICAweDAxCisjZGVmaW5lIFNJUl9NQUNfUkFURV85NiAgMHgwMworI2RlZmluZSBTSVJfTUFDX1JBVEVfMTA4IDB4MDUKKworLyogQU5JIGVuaGFuY2VkIHJhdGVzICovCisjZGVmaW5lIFNJUl9NQUNfUkFURV80MiAgMTAwMAorI2RlZmluZSBTSVJfTUFDX1JBVEVfODQgIDEwMDEKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzEyNiAxMDAyCisjZGVmaW5lIFNJUl9NQUNfUkFURV8xNDQgMTAwMworI2RlZmluZSBTSVJfTUFDX1JBVEVfMTY4IDEwMDQKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzE5MiAxMDA1CisjZGVmaW5lIFNJUl9NQUNfUkFURV8yMTYgMTAwNgorI2RlZmluZSBTSVJfTUFDX1JBVEVfMjQwIDEwMDcKKworI2RlZmluZSBTSVJfTUFDX1JBVEVfMV9CSVRNQVAgICAgKDE8PDApCisjZGVmaW5lIFNJUl9NQUNfUkFURV8yX0JJVE1BUCAgICAoMTw8MSkKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzVfNV9CSVRNQVAgICgxPDwyKQorI2RlZmluZSBTSVJfTUFDX1JBVEVfMTFfQklUTUFQICAgKDE8PDMpCisjZGVmaW5lIFNJUl9NQUNfUkFURV82X0JJVE1BUCAgICAoMTw8NCkKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzlfQklUTUFQICAgICgxPDw1KQorI2RlZmluZSBTSVJfTUFDX1JBVEVfMTJfQklUTUFQICAgKDE8PDYpCisjZGVmaW5lIFNJUl9NQUNfUkFURV8xOF9CSVRNQVAgICAoMTw8NykKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzI0X0JJVE1BUCAgICgxPDw4KQorI2RlZmluZSBTSVJfTUFDX1JBVEVfMzZfQklUTUFQICAgKDE8PDkpCisjZGVmaW5lIFNJUl9NQUNfUkFURV80OF9CSVRNQVAgICAoMTw8MTApCisjZGVmaW5lIFNJUl9NQUNfUkFURV81NF9CSVRNQVAgICAoMTw8MTEpCisKKyNkZWZpbmUgc2lySXNBcmF0ZSh4KSAoKCgodWludDhfdCl4KSA9PSBTSVJfTUFDX1JBVEVfNikgIHx8IFwKKwkJICAgICAgICgoKHVpbnQ4X3QpeCkgPT0gU0lSX01BQ19SQVRFXzkpICB8fCBcCisJCSAgICAgICAoKCh1aW50OF90KXgpID09IFNJUl9NQUNfUkFURV8xMikgfHwgXAorCQkgICAgICAgKCgodWludDhfdCl4KSA9PSBTSVJfTUFDX1JBVEVfMTgpIHx8IFwKKwkJICAgICAgICgoKHVpbnQ4X3QpeCkgPT0gU0lSX01BQ19SQVRFXzI0KSB8fCBcCisJCSAgICAgICAoKCh1aW50OF90KXgpID09IFNJUl9NQUNfUkFURV8zNikgfHwgXAorCQkgICAgICAgKCgodWludDhfdCl4KSA9PSBTSVJfTUFDX1JBVEVfNDgpIHx8IFwKKwkJICAgICAgICgoKHVpbnQ4X3QpeCkgPT0gU0lSX01BQ19SQVRFXzU0KSkKKworI2RlZmluZSBzaXJJc0JyYXRlKHgpICgoKCh1aW50OF90KXgpID09IFNJUl9NQUNfUkFURV8xKSAgIHx8IFwKKwkJICAgICAgICgoKHVpbnQ4X3QpeCkgPT0gU0lSX01BQ19SQVRFXzIpICAgfHwgXAorCQkgICAgICAgKCgodWludDhfdCl4KSA9PSBTSVJfTUFDX1JBVEVfNV81KSB8fCBcCisJCSAgICAgICAoKCh1aW50OF90KXgpID09IFNJUl9NQUNfUkFURV8xMSkpCisKKyNkZWZpbmUgc2lySXNHcmF0ZSh4KSAoKCgodWludDhfdCl4KSA9PSBTSVJfTUFDX1JBVEVfMSkgICB8fCBcCisJCSAgICAgICAoKCh1aW50OF90KXgpID09IFNJUl9NQUNfUkFURV8yKSAgIHx8IFwKKwkJICAgICAgICgoKHVpbnQ4X3QpeCkgPT0gU0lSX01BQ19SQVRFXzVfNSkgfHwgXAorCQkgICAgICAgKCgodWludDhfdCl4KSA9PSBTSVJfTUFDX1JBVEVfMTEpICB8fCBcCisJCSAgICAgICAoKCh1aW50OF90KXgpID09IFNJUl9NQUNfUkFURV82KSAgIHx8IFwKKwkJICAgICAgICgoKHVpbnQ4X3QpeCkgPT0gU0lSX01BQ19SQVRFXzkpICAgfHwgXAorCQkgICAgICAgKCgodWludDhfdCl4KSA9PSBTSVJfTUFDX1JBVEVfMTIpICB8fCBcCisJCSAgICAgICAoKCh1aW50OF90KXgpID09IFNJUl9NQUNfUkFURV8xOCkgIHx8IFwKKwkJICAgICAgICgoKHVpbnQ4X3QpeCkgPT0gU0lSX01BQ19SQVRFXzI0KSAgfHwgXAorCQkgICAgICAgKCgodWludDhfdCl4KSA9PSBTSVJfTUFDX1JBVEVfMzYpICB8fCBcCisJCSAgICAgICAoKCh1aW50OF90KXgpID09IFNJUl9NQUNfUkFURV80OCkgIHx8IFwKKwkJICAgICAgICgoKHVpbnQ4X3QpeCkgPT0gU0lSX01BQ19SQVRFXzU0KSkKKworI2RlZmluZSBTSVJfTUFDX01JTl9JRV9MRU4gMiAgICAvKiBNaW5pbXVtIElFIGxlbmd0aCBmb3IgSUUgdmFsaWRhdGlvbiAqLworCisjZGVmaW5lIFNJUl9NQUNfVElfVFlQRV9SRUFTU09DX0RFQURMSU5FICAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfVElfVFlQRV9LRVlfTElGRVRJTUUgICAgICAgICAgICAyCisjZGVmaW5lIFNJUl9NQUNfVElfVFlQRV9BU1NPQ19DT01FQkFDSyAgICAgICAgICAzCisKKyNkZWZpbmUgU0lSX01BQ19WSFRfQ0FQX01BWF9NUERVX0xFTiAgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfU1VQUF9DSF9XSURUSF9TRVQgICAgICAgICAyCisjZGVmaW5lIFNJUl9NQUNfVkhUX0NBUF9MRFBDX0NPRElOR19DQVAgICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19WSFRfQ0FQX1NIT1JUR0lfODBNSFogICAgICAgICAgICAgNQorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfU0hPUlRHSV8xNjBfODBfODBNSFogICAgICA2CisjZGVmaW5lIFNJUl9NQUNfVkhUX0NBUF9UWFNUQkMgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgU0lSX01BQ19WSFRfQ0FQX1JYU1RCQyAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfU1VfQkVBTUZPUk1FUl9DQVAgICAgICAgICAxMQorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfU1VfQkVBTUZPUk1FRV9DQVAgICAgICAgICAxMgorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfQ1NOX0JFQU1PUk1FUl9BTlRfU1VQICAgICAxMworI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfTlVNX1NPVU5ESU5HX0RJTSAgICAgICAgICAxNgorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfTlVNX0JFQU1fRk9STUVSX0NBUCAgICAgICAxOQorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfTlVNX0JFQU1fRk9STUVFX0NBUCAgICAgICAyMAorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfVFhPUFBTICAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfSFRDX0NBUCAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfTUFYX0FNRFVfTEVOX0VYUE8gICAgICAgICAyMworI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfTElOS19BREFQVF9DQVAgICAgICAgICAgICAyNgorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfUlhfQU5URU5OQV9QQVRURVJOICAgICAgICAyOAorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfVFhfQU5URU5OQV9QQVRURVJOICAgICAgICAyOQorI2RlZmluZSBTSVJfTUFDX1ZIVF9DQVBfUkVTRVJWRUQyICAgICAgICAgICAgICAgICAzMAorCisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX0FEVkNPRElOR19TICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX0NIV0lEVEg0MF9TICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX1NNUE9XRVJTQVZFX0RZTkFNSUNfUyAgICAgICAyCisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX1NNX1JFU0VSVkVEX1MgICAgICAgICAgICAgICAzCisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX0dSRUVORklFTERfUyAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX1NIT1JUR0kyME1IWl9TICAgICAgICAgICAgICA1CisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX1NIT1JUR0k0ME1IWl9TICAgICAgICAgICAgICA2CisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX1RYU1RCQ19TICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX1JYU1RCQ19TICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX0RFTEFZRURCTEtBQ0tfUyAgICAgICAgICAgIDEwCisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX01BWEFNU0RVU0laRV9TICAgICAgICAgICAgIDExCisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX0RTU1NDQ0s0MF9TICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX1BTTVBfUyAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX0lOVE9MRVJBTlQ0MF9TICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQX0xTSUdUWE9QUFJPVF9TICAgICAgICAgICAgIDE1CisKKyNkZWZpbmUgU0lSX01BQ19UWFNUQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19SWFNUQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2VuZGlmIC8qIF9fTUFDX1BST1RfREVGU19IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9pbmMvc2lyX3R5cGVzLmggYi9jb3JlL21hYy9pbmMvc2lyX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwMzJhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL2luYy9zaXJfdHlwZXMuaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGZpbGUgc2lyX3R5cGVzLmggY29udGFpbnMgdGhlIGNvbW1vbiB0eXBlcworICoKKyAqIEF1dGhvcjogICAgVi4gSy4gS2FuZGFycGEKKyAqIERhdGU6ICAgICAgMDQvMTIvMjAwMgorICovCisKKyNpZm5kZWYgX19TSVJfVFlQRVNfSAorI2RlZmluZSBfX1NJUl9UWVBFU19ICisKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKworICAgIFx0eXBlZGVmIHRIYWxIYW5kbGUKKworICAgIFxicmllZiBIYW5kbGUgdG8gdGhlIEhBTC4gIFRoZSBIQUwgaGFuZGxlIGlzIHJldHVybmVkIGJ5IHRoZSBIQUwgYWZ0ZXIgaXQKKyAgICBpcyBvcGVuZWQgKGJ5IGNhbGxpbmcgaGFsT3BlbikuCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit0eXBlZGVmIHZvaWQgKnRIYWxIYW5kbGU7CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorCisgICAgXHR5cGVkZWYgdEhkZEhhbmRsZQorCisgICAgXGJyaWVmIEhhbmRsZSB0byB0aGUgSERELiAgVGhlIEhERCBoYW5kbGUgaXMgZ2l2ZW4gdG8gdGhlIEhBTCBmcm9tCisgICAgdGhlIEhERCBvbiBoYWxPcGVuLiAgVGhlIEhERCBoYW5kbGUgaXMgYW4gaW5wdXQgdG8gYWxsIEhERC9QQUwgZnVuY3Rpb24KKyAgICBjYWxscyBhbmQgcmVwcmVzZW50cyBhbiBvcGFxdWUgaGFuZGxlIHRvIHRoZSBIREQgaW5zdGFuY2UgdGhhdCBpcyB0aWVkCisgICAgdG8gdGhlIEhBTCBpbnN0YW5jZSwgb3BlbmVkIHRocm91Z2ggaGFsT3Blbi4KKworICAgIFRoZSBIREQgbXVzdCBiZSBhYmxlIHRvIGRlcml2ZSBpdCdzIGludGVybmFsIGluc3RhbmNlIHN0cnVjdHVyZSBwb2ludGVyCisgICAgdGhyb3VnaCB0aGlzIGhhbmRsZS4gIGhpbnQgaGludC4uLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordHlwZWRlZiB2b2lkICp0SGRkSGFuZGxlOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICBTSVJJVVMgRVJST1IgQ29kZXMgLyBSZXR1cm4gQ29kZXMgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiAvIFJldHVybiBzdGF0dXMgdHlwZSAqLwordHlwZWRlZiBlbnVtIGVTaXJSZXRTdGF0dXMgeworCWVTSVJfU1VDQ0VTUywKKwllU0lSX0ZBSUxVUkUsCisKKwkvKiAvIFN5c3RlbSBFcnJvcnMgKi8KKwllU0lSX1NZU19FUlJPUl9CQVNFID0gMHgxMDAsCisJZVNJUl9TWVNfVFhfVEhSRUFEX0NSRUFURV9GQUlMRUQsCisJZVNJUl9TWVNfVFhfVEhSRUFEX1JFU1VNRV9GQUlMRUQsCisJZVNJUl9TWVNfVFhfTVNHX1FfQ1JFQVRFX0ZBSUxFRCwKKwllU0lSX1NZU19UWF9RX1NFTkRfRkFJTEVELAorCWVTSVJfU1lTX1RYX1FfUkVDVl9GQUlMRUQsCisJZVNJUl9TWVNfVFhfVElNRVJfQUNUSVZBVEVfRkFJTEVELAorCWVTSVJfU1lTX1RYX1RJTUVSX0NIQU5HRV9GQUlMRUQsCisJZVNJUl9TWVNfVFhfVElNRVJfQ1JFQVRFX0ZBSUxFRCwKKwllU0lSX01FTV9BTExPQ19GQUlMRUQsCisJZVNJUl9QQ0lfRVJST1IsCisKKwkvKiBEcml2ZXIgUmV0dXJuIENvZGVzICovCisJZVNJUl9IQUxfRVJST1JfQkFTRSA9IDB4MTAwMCwKKwllU0lSX0hBTF9TVEFJRF9JTlZBTElELCAvKiAxICovCisJZVNJUl9IQUxfVENERVNDX0lOVkFMSUQsICAgICAgICAvKiAyICovCisJZVNJUl9IQUxfVFhfV1FfTk9UX1ZBTElELCAgICAgICAvKiAzICovCisJZVNJUl9IQUxfUFJFVl9CTVVfQ01EX0lOQ09NUExFVEUsICAgICAgIC8qIDQgKi8KKwllU0lSX0hBTF9FRVBST01fQ1JDX0ZBSUxFRCwgICAgIC8qIDUgKi8KKwllU0lSX0hBTF9QQ0lfUkVWSURfSU5WQUxJRCwgICAgIC8qIDYgKi8KKwllU0lSX0hBTF9TVEFfVENfSURfSU5WQUxJRCwgICAgIC8qIDcgKi8KKwllU0lSX0hBTF9UWFdRX0VNUFRZLCAgICAvKiA4ICovCisJZVNJUl9IQUxfUk9VVF9UQkxfVFlQRV9TVFlQRV9JTlZBTElELCAgIC8qIDkgKi8KKwllU0lSX0hBTF9URlBfRU5BQkxFX0ZBSUxFRCwgICAgIC8qIGEgKi8KKwllU0lSX0hBTF9URlBfQUJPUlRfQ01EX0ZBSUxFRCwgIC8qIGIgKi8KKwllU0lSX0hBTF9URlBfVEVNUExfQkNOTEVOX0lOVkFMSUQsICAgICAgLyogYyAqLworCWVTSVJfSEFMX1RGUF9URU1QTF9TQ0hMRU5fSU5WQUxJRCwgICAgICAvKiBkICovCisJZVNJUl9IQUxfVEZQX1RFTVBMX0NGRU5ETEVOX0lOVkFMSUQsICAgIC8qIGUgKi8KKwllU0lSX0hBTF9URlBfVEVNUExfUlJMRU5fSU5WQUxJRCwgICAgICAgLyogZiAqLworCWVTSVJfSEFMX1RGUF9URU1QTF9QU1BPTExMRU5fSU5WQUxJRCwgICAvKiAxMCAqLworCWVTSVJfSEFMX1RGUF9URU1QTF9DVFNMRU5fSU5WQUxJRCwgICAgICAvKiAxMSAqLworCWVTSVJfSEFMX1RGUF9URU1QTF9DRlBPTExMRU5fSU5WQUxJRCwgICAvKiAxMiAqLworCWVTSVJfSEFMX1RGUF9URU1QTF9CQUNLTEVOX0lOVkFMSUQsICAgICAvKiAxMyAqLworCWVTSVJfSEFMX0lOUFVUX0lOVkFMSUQsIC8qIDE0ICovCisJZVNJUl9IQUxfR0VUX1BEVV9GQUlMRUQsICAgICAgICAvKiAxNSAqLworCWVTSVJfSEFMX0FERF9TVEFfQUNLX1BPTElDWV9JTlZBTElELCAgICAvKiAxNiAqLworCWVTSVJfSEFMX1NUQV9FWElTVFMsICAgIC8qIDE3ICovCisJZVNJUl9IQUxfU1RBX0RPRVNfTk9UX0VYSVNULCAgICAvKiAxOCAqLworCWVTSVJfSEFMX01BU1RFUl9XUV9JRF9JTlZBTElELCAgLyogMTkgKi8KKwllU0lSX0hBTF9XUV9OT1RfRU1QVFksICAvKiAxYSAqLworCWVTSVJfSEFMX1dRX0VNUFRZLCAgICAgIC8qIDFiICovCisJZVNJUl9IQUxfUERVQ05UX0FORF9ORVhUUFRSX01JU01BVENILCAgIC8qIDFjICovCisJZVNJUl9IQUxfRVJSX05VTV9CWVRFU19UT19CRV9TRVRfVE9PX0JJRywgICAgICAgLyogMWQgKi8KKwllU0lSX0hBTF9HRVRfUEtUX0xFTkdUSF9JTlZBTElELCAgICAgICAgLyogMWUgKi8KKwllU0lSX0hBTF9BU19DTlRfSU5WQUxJRCwgICAgICAgIC8qIDFmICovCisJZVNJUl9IQUxfUkZQX0FHRV9DTURfU0VRRkFJTCwgICAvKiAyMCAqLworCWVTSVJfSEFMX1JGUF9BR0VfQ01EX0FHRV9DTURfVENGQUlMLCAgICAvKiAyMSAqLworCWVTSVJfSEFMX1JGUF9BR0VfQ01EX1BBU1MsICAgICAgLyogMjIgKi8KKwllU0lSX0hBTF9SRlBfQUdFX0NNRF9USU1FRE9VVCwgIC8qIDIzICovCisJZVNJUl9IQUxfUkhQX0hBU0hfQ01EX1RJTUVPVVQsICAvKiAyNCAqLworCWVTSVJfSEFMX1JIUF9ST1VUSU5HX1RCTF9TRVRfRkFJTEVELCAgICAvKiAyNSAqLworCWVTSVJfSEFMX1JIUF9ST1VUSU5HX1RCTF9HRVRfRkFJTEVELCAgICAvKiAyNiAqLworCisJZVNJUl9IQUxfQ0FMX1NUQVRVU19DSEtfRkFJTEVELAorCisJZVNJUl9IQUxfU1lTX0FSTV9EQkdfTU9ERV9TRVRfRkFJTEVELAorCWVTSVJfSEFMX1RGUF9CQ05fU0VOVCwKKwllU0lSX0hBTF9URlBfQkNOX05PVF9TRU5ULAorCWVTSVJfSEFMX1RGUF9CS09GX0lEX0lOVkFMSUQsCisJZVNJUl9IQUxfVEZQX0NGQl9FTkFCTEVfSU5QVVRfSU5WQUxJRCwKKwllU0lSX0hBTF9URlBfRURDRl9UWE9QX0lOVkFMSUQsCisJZVNJUl9IQUxfVEZQX1RFTVBMX0xFTl9JTlZBTElELAorCWVTSVJfSEFMX0tFWV9JRF9JTlZBTElELAorCWVTSVJfSEFMX0tFWV9MRU5fSU5WQUxJRCwKKwllU0lSX0hBTF9DSElEX0lOVkFMSUQsCisJZVNJUl9IQUxfSElGX0JVUlNUX1JFQURfRkFJTEVELAorCWVTSVJfSEFMX0hJRl9CVVJTVF9XUklURV9GQUlMRUQsCisJZVNJUl9IQUxfSElGX0JVUlNUX0xFTl9SRVFfSU5WQUxJRCwKKwllU0lSX0hBTF9ISUZfVFhfTk9fRlJBR19ERVNDLAorCisJZVNJUl9IQUxfSU5WQUxJRF9QUk9EVUNUX0lELCAgICAvKiA0NCAqLworCisJZVNJUl9IQUxfSU5WQUxJRF9DQVBBQklMSVRZLCAgICAvKiA0OCAqLworCWVTSVJfSEFMX0NCX05PVF9FTkFCTEVELCAgICAgICAgLyogNDkgKi8KKwllU0lSX0hBTF9NQUNfUkFURV9JTlZBTElELCAgICAgIC8qIDRhICovCisJZVNJUl9IQUxfUkhQX0hBTkcsICAgICAgLyogNGIgKi8KKwllU0lSX0hBTF9VTlNVUFBPUlRFRCwgICAvKiA0YyAqLworCWVTSVJfSEFMX1RTUEVDX0lOVkFMSUQsIC8qIDRkICovCisKKwkvKiBOSU0gUmV0dXJuIENvZGVzICovCisJZVNJUl9OSU1fRVJST1JfQkFTRSA9IDB4MjAwMCwKKwllU0lSX05JTV9FUlJfSU5WQUxJRF9FVkVOVCwKKworCS8qIE1NSCBSZXR1cm4gQ29kZXMgKi8KKwllU0lSX05JTV9NTUhfRVJST1JfQkFTRSA9IDB4MjEwMCwKKwllU0lSX05JTV9NTUhfRVJSX0lOVl9FVkVOVCwKKwllU0lSX05JTV9NTUhfRVJSX01TR19MRU4sCisJZVNJUl9OSU1fTU1IX0VSUl9JTl9RX1RZUEUsCisKKwkvKiBNTlQgUmV0dXJuIENvZGVzICovCisJZVNJUl9OSU1fTU5UX0VSUk9SX0JBU0UgPSAweDIxNDAsCisKKwkvKiBXRFQgRXJyb3JzICovCisJZVNJUl9OSU1fV0RUX0VSUk9SX0JBU0UgPSAweDIxODAsCisKKwkvKiBMSU0gUmV0dXJuIENvZGVzICovCisJZVNJUl9MSU1fRVJST1JfQkFTRSA9IDB4MjIwMCwKKwllU0lSX0xJTV9JR05PUkVfQkVBQ09OLAorCWVTSVJfTElNX0lOVkFMSURfU1RBLAorCWVTSVJfTElNX01BWF9TVEFfUkVBQ0hFRF9FUlJPUiwKKworCS8qIFNDSCBSZXR1cm4gQ29kZXMgKi8KKwllU0lSX1NDSF9FUlJPUl9CQVNFID0gMHgyMzAwLAorCisJLyogUE1NIFJldHVybiBDb2RlcyAqLworCWVTSVJfUE1NX0VSUk9SX0JBU0UgPSAweDI0MDAsCisJZVNJUl9QTU1fSU5WQUxJRF9NT0RFLAorCWVTSVJfUE1NX0lOVkFMSURfU1RBVEUsCisJZVNJUl9QTU1fSU5WQUxJRF9ST0xFLAorCWVTSVJfUE1NX1NUQV9OT1RfQVNTT0NJQVRFRCwKKwllU0lSX1BNTV9IRUFSVF9CRUFUX1RNT1VULAorCWVTSVJfUE1NX05USF9CRUFDT05fREVMSVZFUlksCisKKwkvKiBBUlEgUmV0dXJuIENvZGVzICovCisJZVNJUl9BUlFfRVJST1JfQkFTRSA9IDB4MjUwMCwKKworCS8qIENGRyBSZXR1cm4gQ29kZXMgKi8KKwllU0lSX0NGR19FUlJPUl9CQVNFID0gMjYwMCwKKwllU0lSX0NGR19JTlZBTElEX0lELAorCWVTSVJfQ0ZHX0lOVkFMSURfTEVOLAorCisJLyogcGFyc2VyIFJldHVybiBDb2RlcyAqLworCWVTSVJfUFJTX0VSUk9SX0JBU0UgPSAweDI3MDAsCisJZVNJUl9JR05PUkVfSUUsCisKKwkvKiBQdXQgYWxsIHlvdXIgcmV0dXJuIGNvZGVzIGFib3ZlIHRoaXMgbGluZSAqLworCWVTSVJfRVJST1JfTEFTVAorfSB0U2lyUmV0U3RhdHVzOworCisjZGVmaW5lIElTX1NJUl9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpIChlU0lSX1NVQ0NFU1MgPT0gc3RhdHVzKQordHlwZWRlZiBlbnVtIHsKKwlIQUxfU1RPUF9UWVBFX1NZU19SRVNFVCwKKwlIQUxfU1RPUF9UWVBFX1NZU19ERUVQX1NMRUVQLAorCUhBTF9TVE9QX1RZUEVfUkZfS0lMTCwKK30gdEhhbFN0b3BUeXBlOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfVlNUQV9GRUFUVVJFCisjZGVmaW5lIEhBTF9OVU1fQVNTT0NfU1RBICAgICAgICAgICAzMgorI2RlZmluZSBIQUxfTlVNX1NUQSAgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgSEFMX05VTV9IV19TVEEgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEhBTF9OVU1fR1BTVEEgICAgICAgICAgICAgICA0CisKKy8qIGlzIHRoZSBTVEEgYSBIVyBTVEEgKGV4Y2x1ZGluZyBHUCBTVEFzKSAqLworI2RlZmluZSBJU19IV1NUQV9JRFgoX194KSBcCisJKChfX3gpIDwgKEhBTF9OVU1fSFdfU1RBLUhBTF9OVU1fR1BTVEEpKQorCisjZWxzZQorLypJbiBwcmltYSAxMiBIVyBzdGF0aW9ucyBhcmUgc3VwcG9ydGVkIGluY2x1ZGluZyBCQ0FTVCBTVEEoc3RhSWQgMCkKKyAgIGFuZCBTRUxGIFNUQShzdGFJZCAxKSBzbyB0b3RhbCBBU1NPQyBzdGF0aW9ucyB3aGljaCBjYW4gY29ubmVjdCB0byBQcmltYQorICAgU29mdEFQID0gMTIgLSAxKFNlbGYgU1RhKSAtIDEoQmNhc3QgU3RhKSA9IDEwIFN0YXRpb25zLiAqLworI2RlZmluZSBIQUxfTlVNX1NUQSAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgSEFMX05VTV9BU1NPQ19TVEEgICAgICAgICAgIDEwCisjZGVmaW5lIEhBTF9OVU1fSFdfU1RBICAgICAgICAgICAgICAxMgorI2VuZGlmCisKKyNkZWZpbmUgU1RBQ0ZHX01BWF9UQyAgICAgICAgICAgICAgIDgKKworI2VuZGlmIC8qIF9fU0lSX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL2luYy93bmlfYXBpLmggYi9jb3JlL21hYy9pbmMvd25pX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMjc5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9pbmMvd25pX2FwaS5oCkBAIC0wLDAgKzEsNTM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHduaV9hcGkuaCBjb250YWlucyBtZXNzYWdlIGRlZmluaXRpb25zIGV4cG9ydGVkIGJ5CisgKiBTaXJpdXMgc29mdHdhcmUgbW9kdWxlcy4KKyAqIE5PVEU6IFNlZSBwcm9qZWN0cy9zaXJpdXMvaW5jbHVkZS9zaXJfYXBpLmggZm9yIHN0cnVjdHVyZQorICogZGVmaW5pdGlvbnMgb2YgdGhlIGhvc3QvRlcgbWVzc2FnZXMuCisgKgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDQvMTEvMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfX1dOSV9BUElfSAorI2RlZmluZSBfX1dOSV9BUElfSAorCisvKiAvIFN0YXJ0IG9mIFNpcml1cy9Ib3N0IG1lc3NhZ2UgdHlwZXMgKi8KKyNkZWZpbmUgV05JX0hPU1RfTVNHX1NUQVJUICAgICAgICAgICAgIDB4MTUwMAorCitlbnVtIGVXbmlNc2dUeXBlcyB7CisJLyogLyBDRkcgbWVzc2FnZSB0eXBlcyAqLworCWVXTklfQ0ZHX01TR19UWVBFU19CRUdJTiA9IFdOSV9IT1NUX01TR19TVEFSVCwKKwllV05JX0NGR19NU0dfVFlQRVNfRU5EID0gZVdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOICsgMHhGRiwKKworCS8qIC8gU01FIG1lc3NhZ2UgdHlwZXMgKi8KKwllV05JX1NNRV9NU0dfVFlQRVNfQkVHSU4gPSBlV05JX0NGR19NU0dfVFlQRVNfRU5ELAorCWVXTklfU01FX1NZU19SRUFEWV9JTkQsCisJZVdOSV9TTUVfU0NBTl9SRVEsCisJZVdOSV9TTUVfU0NBTl9BQk9SVF9JTkQsCisJZVdOSV9TTUVfU0NBTl9SU1AsCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisJZVdOSV9TTUVfT0VNX0RBVEFfUkVRLAorCWVXTklfU01FX09FTV9EQVRBX1JTUCwKKyNlbmRpZgorCWVXTklfU01FX0pPSU5fUkVRLAorCWVXTklfU01FX0pPSU5fUlNQLAorCWVXTklfU01FX1NFVENPTlRFWFRfUkVRLAorCWVXTklfU01FX1NFVENPTlRFWFRfUlNQLAorCWVXTklfU01FX1JFQVNTT0NfUkVRLAorCWVXTklfU01FX1JFQVNTT0NfUlNQLAorCWVXTklfU01FX0RJU0FTU09DX1JFUSwKKwllV05JX1NNRV9ESVNBU1NPQ19SU1AsCisJZVdOSV9TTUVfRElTQVNTT0NfSU5ELAorCWVXTklfU01FX0RJU0FTU09DX0NORiwKKwllV05JX1NNRV9ERUFVVEhfUkVRLAorCWVXTklfU01FX0RFQVVUSF9SU1AsCisJZVdOSV9TTUVfREVBVVRIX0lORCwKKwllV05JX1NNRV9XTV9TVEFUVVNfQ0hBTkdFX05URiwKKwllV05JX1NNRV9JQlNTX05FV19QRUVSX0lORCwKKwllV05JX1NNRV9JQlNTX1BFRVJfREVQQVJURURfSU5ELAorCWVXTklfU01FX1NUQVJUX0JTU19SRVEsCisJZVdOSV9TTUVfU1RBUlRfQlNTX1JTUCwKKwllV05JX1NNRV9BU1NPQ19JTkQsCisJZVdOSV9TTUVfQVNTT0NfQ05GLAorCWVXTklfU01FX1NXSVRDSF9DSExfSU5ELAorCWVXTklfU01FX1NUT1BfQlNTX1JFUSwKKwllV05JX1NNRV9TVE9QX0JTU19SU1AsCisJZVdOSV9TTUVfTkVJR0hCT1JfQlNTX0lORCwKKwllV05JX1NNRV9ERUFVVEhfQ05GLAorCWVXTklfU01FX01JQ19GQUlMVVJFX0lORCwKKwllV05JX1NNRV9BRERUU19SRVEsCisJZVdOSV9TTUVfQUREVFNfUlNQLAorCWVXTklfU01FX0RFTFRTX1JFUSwKKwllV05JX1NNRV9ERUxUU19SU1AsCisJZVdOSV9TTUVfREVMVFNfSU5ELAorCWVXTklfU01FX0dFVF9TVEFUSVNUSUNTX1JFUSwKKwllV05JX1NNRV9HRVRfU1RBVElTVElDU19SU1AsCisJZVdOSV9TTUVfR0VUX1JTU0lfUkVRLAorCWVXTklfU01FX0dFVF9BU1NPQ19TVEFTX1JFUSwKKwllV05JX1NNRV9US0lQX0NOVFJfTUVBU19SRVEsCisJZVdOSV9TTUVfVVBEQVRFX0FQV1BTSUVfUkVRLAorCWVXTklfU01FX0dFVF9XUFNQQkNfU0VTU0lPTl9SRVEsCisJZVdOSV9TTUVfV1BTX1BCQ19QUk9CRV9SRVFfSU5ELAorCWVXTklfU01FX1NFVF9BUFdQQVJTTklFc19SRVEsCisJZVdOSV9TTUVfVVBQRVJfTEFZRVJfQVNTT0NfQ05GLAorCWVXTklfU01FX0hJREVfU1NJRF9SRVEsCisJZVdOSV9TTUVfQ0hOR19NQ0NfQkVBQ09OX0lOVEVSVkFMLAorCWVXTklfU01FX1JFTUFJTl9PTl9DSEFOTkVMX1JFUSwKKwllV05JX1NNRV9SRU1BSU5fT05fQ0hOX1JTUCwKKwllV05JX1NNRV9NR01UX0ZSTV9JTkQsCisJZVdOSV9TTUVfUkVNQUlOX09OX0NITl9SRFlfSU5ELAorCWVXTklfU01FX1NFTkRfQUNUSU9OX0ZSQU1FX0lORCwKKwllV05JX1NNRV9BQ1RJT05fRlJBTUVfU0VORF9DTkYsCisJZVdOSV9TTUVfQUJPUlRfUkVNQUlOX09OX0NIQU5fSU5ELAorCWVXTklfU01FX1VQREFURV9OT0EsCisJZVdOSV9TTUVfQ0xFQVJfREZTX0NIQU5ORUxfTElTVCwKKwllV05JX1NNRV9HRVRfU05SX1JFUSwKKwkvKiBHZW5lcmFsIFBvd2VyIFNhdmUgTWVzc2FnZXMgKi8KKwllV05JX1BNQ19NU0dfVFlQRVNfQkVHSU4sCisKKwkvKiBXT1dMIE1lc3NhZ2VzICovCisJZVdOSV9QTUNfU01QU19TVEFURV9JTkQsCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwllV05JX1NNRV9SUk1fTVNHX1RZUEVfQkVHSU4sCisKKwllV05JX1NNRV9ORUlHSEJPUl9SRVBPUlRfUkVRX0lORCwKKwllV05JX1NNRV9ORUlHSEJPUl9SRVBPUlRfSU5ELAorCWVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVRX0lORCwKKwllV05JX1NNRV9CRUFDT05fUkVQT1JUX1JFU1BfWE1JVF9JTkQsCisKKyNlbmRpZgorCWVXTklfU01FX0FERF9TVEFfU0VMRl9SU1AsCisJZVdOSV9TTUVfREVMX1NUQV9TRUxGX1JTUCwKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwllV05JX1NNRV9GVF9QUkVfQVVUSF9SRVEsCisJZVdOSV9TTUVfRlRfUFJFX0FVVEhfUlNQLAorCWVXTklfU01FX0ZUX1VQREFURV9LRVksCisJZVdOSV9TTUVfRlRfQUdHUl9RT1NfUkVRLAorCWVXTklfU01FX0ZUX0FHR1JfUU9TX1JTUCwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fRVNFCisJZVdOSV9TTUVfRVNFX0FESkFDRU5UX0FQX1JFUE9SVCwKKyNlbmRpZgorCisJZVdOSV9TTUVfUkVHSVNURVJfTUdNVF9GUkFNRV9SRVEsCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisJZVdOSV9TTUVfUFJFRl9ORVRXT1JLX0ZPVU5EX0lORCwKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKworCWVXTklfU01FX0NIQU5HRV9DT1VOVFJZX0NPREUsCisJZVdOSV9TTUVfR0VORVJJQ19DSEFOR0VfQ09VTlRSWV9DT0RFLAorCWVXTklfU01FX01BWF9BU1NPQ19FWENFRURFRCwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWVXTklfU01FX1RETFNfU0VORF9NR01UX1JFUSwKKwllV05JX1NNRV9URExTX1NFTkRfTUdNVF9SU1AsCisJZVdOSV9TTUVfVERMU19BRERfU1RBX1JFUSwKKwllV05JX1NNRV9URExTX0FERF9TVEFfUlNQLAorCWVXTklfU01FX1RETFNfREVMX1NUQV9SRVEsCisJZVdOSV9TTUVfVERMU19ERUxfU1RBX1JTUCwKKwllV05JX1NNRV9URExTX0RFTF9TVEFfSU5ELAorCWVXTklfU01FX1RETFNfREVMX0FMTF9QRUVSX0lORCwKKwllV05JX1NNRV9NR01UX0ZSTV9UWF9DT01QTEVUSU9OX0lORCwKKwllV05JX1NNRV9URExTX0xJTktfRVNUQUJMSVNIX1JFUSwKKwllV05JX1NNRV9URExTX0xJTktfRVNUQUJMSVNIX1JTUCwKKwllV05JX1NNRV9URExTX1NIT1VMRF9ESVNDT1ZFUiwKKwllV05JX1NNRV9URExTX1NIT1VMRF9URUFSRE9XTiwKKwllV05JX1NNRV9URExTX1BFRVJfRElTQ09OTkVDVEVELAorI2VuZGlmCisJLyogTk9URTogSWYgeW91IGFyZSBwbGFubmluZyB0byBhZGQgbW9yZSBtZXNhZ2VzLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgKi8KKwkvKiBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gaXMgbW92ZWQgYXBwcm9wcmlhdGVseS4gSXQgaXMgc2V0IGFzICovCisJLyogU0lSX0xJTV9NU0dfVFlQRVNfQkVHSU4rMHhCMCA9IDEyQjAgKHdoaWNoIG1lYW5zIG1heCBvZiAxNzYgbWVzc2FnZXMgYW5kICovCisJLyogZVdOSV9TTUVfVERMU19ERUxfU1RBX1JTUCA9IDE3NS4gKi8KKwkvKiBTaG91bGQgZml4IGFib3ZlIGlzc3VlIHRvIGVuYWJsZSBURExTX0lOVEVSTkFMICovCisJZVdOSV9TTUVfU0VUX0JDTl9GSUxURVJfUkVRLAorCWVXTklfU01FX1JFU0VUX0FQX0NBUFNfQ0hBTkdFRCwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJZVdOSV9TTUVfVU5QUk9UX01HTVRfRlJNX0lORCwKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCWVXTklfUE1DX0dUS19PRkZMT0FEX0dFVElORk9fUlNQLAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRCAqLworCWVXTklfU01FX0NBTkRJREFURV9GT1VORF9JTkQsICAgLypST0FNIGNhbmRpZGF0ZSBpbmRpY2F0aW9uIGZyb20gRlcgKi8KKwllV05JX1NNRV9IQU5ET0ZGX1JFUSwgICAvKnVwcGVyIGxheWVyIHJlcXVlc3RlZCBoYW5kb2ZmIHRvIGRyaXZlciBpbiBTVEEgbW9kZSAqLworCWVXTklfU01FX1JPQU1fU0NBTl9PRkZMT0FEX1JTUCwgLypGd2QgdGhlIExGUiBzY2FuIG9mZmxvYWQgcnNwIGZyb20gRlcgdG8gU01FICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xQSEIKKwllV05JX1NNRV9MUEhCX0lORCwKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTFBIQiAqLworCisJZVdOSV9TTUVfR0VUX1RTTV9TVEFUU19SRVEsCisJZVdOSV9TTUVfR0VUX1RTTV9TVEFUU19SU1AsCisJZVdOSV9TTUVfVFNNX0lFX0lORCwKKworCWVXTklfU01FX1JFQURZX1RPX1NVU1BFTkRfSU5ELAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAorCWVXTklfU01FX0NIX0FWT0lEX0lORCwKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgKi8KKwkvKiBERlMgRVZFTlRTICovCisJZVdOSV9TTUVfREZTX1JBREFSX0ZPVU5ELCAgICAgICAvKiBSQURBUiBmb3VuZCBpbmRpY2F0aW9uIGZyb20gREZTICovCisJZVdOSV9TTUVfQ0hBTk5FTF9DSEFOR0VfUkVRLCAgICAvKiBDaGFubmVsIENoYW5nZSBSZXF1ZXN0IGZyb20gU0FQICovCisJZVdOSV9TTUVfQ0hBTk5FTF9DSEFOR0VfUlNQLCAgICAvKiBDaGFubmVsIENoYW5nZSBSZXNwb25zZSBmcm9tIFdNQSAqLworCWVXTklfU01FX1NUQVJUX0JFQUNPTl9SRVEsICAgICAgLyogU3RhcnQgQmVhY29uIFRyYW5zbWlzc2lvbi4gKi8KKwllV05JX1NNRV9ERlNfQkVBQ09OX0NIQU5fU1dfSUVfUkVRLCAgICAgLyogVHJhbnNtaXQgQ1NBIElFIGluIGJlYWNvbnMgKi8KKwllV05JX1NNRV9ERlNfQ1NBSUVfVFhfQ09NUExFVEVfSU5ELCAgICAgLyogVG8gaW5kaWNhdGUgY29tcGxldGlvbiBvZiBDU0EgSUUgKi8KKwkvKiB1cGRhdGUgaW4gYmVhY29ucy9wcm9iZSByc3AgKi8KKwllV05JX1NNRV9TVEFUU19FWFRfRVZFTlQsCisJZVdOSV9TTUVfTElOS19TUEVFRF9JTkQsICAgICAgICAvKiBJbmRpY2F0ZSBsaW5rc3BlZWQgcmVzcG9uc2UgZnJvbSBXTUEgKi8KKwllV05JX1NNRV9DU0FfT0ZGTE9BRF9FVkVOVCwKKwllV05JX1NNRV9VUERBVEVfQURESVRJT05BTF9JRVMsIC8qIGluZGljYXRlcyBBZGRpdGlvbmFsIElFIGZyb20gaGRkIHRvIFBFICovCisJZVdOSV9TTUVfTU9ESUZZX0FERElUSU9OQUxfSUVTLCAvKiBUbyBpbmRpY2F0ZSBJRSBtb2RpZnkgZnJvbSBoZGQgdG8gUEUgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgorCWVXTklfU01FX0FVVE9fU0hVVERPV05fSU5ELAorI2VuZGlmCisjaWZkZWYgUUNBX0hUXzIwNDBfQ09FWAorCWVXTklfU01FX1NFVF9IVF8yMDQwX01PREUsCisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJZVdOSV9TTUVfUk9BTV9PRkZMT0FEX1NZTkNIX0lORCwgICAgICAgIC8qIFJvYW0gU3luY2ggSW5kaWNhdGlvbiBmcm9tIFdNQSB0byBTTUUgKi8KKwllV05JX1NNRV9IT19GQUlMX0lORCwgICAvKiBIYW5kIE9mZiBGYWlsdXJlIEluZCBmcm9tIFdNQSB0byBTTUUgKi8KKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9OQU4KKwllV05JX1NNRV9OQU5fRVZFTlQsCisjZW5kaWYKKwllV05JX1NNRV9MSU5LX1NUQVRVU19JTkQsCisjaWZkZWYgV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCisJZVdOSV9TTUVfUkVBRFlfVE9fRVhUV09XX0lORCwKKyNlbmRpZgorCWVXTklfU01FX01TR19HRVRfVEVNUEVSQVRVUkVfSU5ELAorCWVXTklfU01FX1NOUl9JTkQsCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwllV05JX1NNRV9FWFRTQ0FOX0ZVTExfU0NBTl9SRVNVTFRfSU5ELAorCWVXTklfU01FX0VQTk9fTkVUV09SS19GT1VORF9JTkQsCisjZW5kaWYKKwllV05JX1NNRV9GV19EVU1QX0lORCwKKwllV05JX1NNRV9TRVRfSFdfTU9ERV9SRVEsCisJZVdOSV9TTUVfU0VUX0hXX01PREVfUkVTUCwKKwllV05JX1NNRV9IV19NT0RFX1RSQU5TX0lORCwKKwllV05JX1NNRV9OU1NfVVBEQVRFX1JFUSwKKwllV05JX1NNRV9OU1NfVVBEQVRFX1JTUCwKKwllV05JX1NNRV9TQ0FOX0NNRCwKKwllV05JX1NNRV9PQ0JfU0VUX0NPTkZJR19SU1AsCisJZVdOSV9TTUVfT0NCX0dFVF9UU0ZfVElNRVJfUlNQLAorCWVXTklfU01FX0RDQ19HRVRfU1RBVFNfUlNQLAorCWVXTklfU01FX0RDQ19VUERBVEVfTkRMX1JTUCwKKwllV05JX1NNRV9EQ0NfU1RBVFNfRVZFTlQsCisJZVdOSV9TTUVfU0VUX0RVQUxfTUFDX0NGR19SRVEsCisJZVdOSV9TTUVfU0VUX0RVQUxfTUFDX0NGR19SRVNQLAorCWVXTklfU01FX1JPQ19DTUQsCisJZVdOSV9TTUVfU0VUX1RIRVJNQUxfTEVWRUxfSU5ELAorCWVXTklfU01FX1NFVF9JRV9SRVEsCisJZVdOSV9TTUVfTVNHX1RZUEVTX0VORAorfTsKKwordHlwZWRlZiBlbnVtIHsKKwllV05JX1RETFNfVEVBUkRPV05fUkVBU09OX1RYLAorCWVXTklfVERMU19URUFSRE9XTl9SRUFTT05fUlNTSSwKKwllV05JX1RETFNfVEVBUkRPV05fUkVBU09OX1NDQU4sCisJZVdOSV9URExTX0RJU0NPTk5FQ1RFRF9SRUFTT05fUEVFUl9ERUxFVEUsCisJZVdOSV9URExTX1RFQVJET1dOX1JFQVNPTl9QVFJfVElNRU9VVCwKKwllV05JX1RETFNfVEVBUkRPV05fUkVBU09OX0JBRF9QVFIsCisJZVdOSV9URExTX1RFQVJET1dOX1JFQVNPTl9OT19SRVNQT05TRSwKK30gZVduaVRkbHNUZWFyZG93blJlYXNvbjsKKworI2RlZmluZSBXTklfQ0ZHX01TR19UWVBFU19CRUdJTiAgICAgICAgMHgxMjAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENGRyBNb2R1bGUgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ0ZHIG1lc3NhZ2UgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXTklfQ0ZHX01TR19IRFJfTUFTSyAgICAweGZmZmYwMDAwCisjZGVmaW5lIFdOSV9DRkdfTVNHX0xFTl9NQVNLICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgV05JX0NGR19NQl9IRFJfTEVOICAgICAgNAorI2RlZmluZSBXTklfQ0ZHX01BWF9QQVJBTV9OVU0gICAzMgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDRkcgdG8gSEREIG1lc3NhZ2UgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdOSV9DRkdfUEFSQU1fVVBEQVRFX0lORCAgICAgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDAwKQorI2RlZmluZSBXTklfQ0ZHX0ROTERfUkVRICAgICAgICAgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwMSkKKyNkZWZpbmUgV05JX0NGR19ETkxEX0NORiAgICAgICAgICAgICAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4MDIpCisjZGVmaW5lIFdOSV9DRkdfR0VUX1JTUCAgICAgICAgICAgICAgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDAzKQorI2RlZmluZSBXTklfQ0ZHX1NFVF9DTkYgICAgICAgICAgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwNCkKKyNkZWZpbmUgV05JX0NGR19HRVRfQVRUUklCX1JTUCAgICAgICAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4MDUpCisjZGVmaW5lIFdOSV9DRkdfQUREX0dSUF9BRERSX0NORiAgICAgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDA2KQorI2RlZmluZSBXTklfQ0ZHX0RFTF9HUlBfQUREUl9DTkYgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwNykKKworI2RlZmluZSBBTklfQ0ZHX0dFVF9SQURJT19TVEFUX1JTUCAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwOCkKKyNkZWZpbmUgQU5JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JTUCAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4MDkpCisjZGVmaW5lIEFOSV9DRkdfR0VUX0FHR19TVEFfU1RBVF9SU1AgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDBhKQorI2RlZmluZSBBTklfQ0ZHX0NMRUFSX1NUQVRfUlNQICAgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwYikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ0ZHIHRvIEhERCBtZXNzYWdlIHBhcmFtdGVyIGluZGljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiAgIFRoZSBmb2xsb3dpbmdzIGFyZSB3b3JkIGluZGljZXMgc3RhcnRpbmcgZnJvbSB0aGUgbWVzc2FnZSBib2R5ICAgICovCisKKy8qICAgV05JX0NGR194eHh4X3h4eHhfeHh4eDogICAgICAgICBpbmRleCBvZiBwYXJhbWV0ZXIgICAgICAgICAgICAgICAgKi8KKy8qICAgV05JX0NGR194eHh4X3h4eHhfTlVNOiAgICAgICAgICBudW1iZXIgb2YgcGFyYW1ldGVycyBpbiBtZXNzYWdlICAgKi8KKworLyogICBXTklfQ0ZHX3h4eHhfeHh4eF9MRU46ICAgICAgICAgIGJ5dGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW5jbHVkaW5nICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBXTklfQ0ZHX3h4eHhfeHh4eF9QQVJUSUFMX0xFTjogIGJ5dGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW5jbHVkaW5nICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYW5kIE1CIGhlYWRlciBidXQgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGluZyB2YXJpYWJsZSBkYXRhIGxlbmd0aCAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQYXJhbWV0ZXIgdXBkYXRlIGluZGljYXRpb24gKi8KKyNkZWZpbmUgV05JX0NGR19QQVJBTV9VUERBVEVfSU5EX1BJRCAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BBUkFNX1VQREFURV9JTkRfTlVNICAgMQorI2RlZmluZSBXTklfQ0ZHX1BBUkFNX1VQREFURV9JTkRfTEVOICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKwkJCQkJKFdOSV9DRkdfUEFSQU1fVVBEQVRFX0lORF9OVU0gPDwgMikpCisKKy8qIENvbmZpZ3VyYXRpb24gZG93bmxvYWQgcmVxdWVzdCAqLworI2RlZmluZSBXTklfQ0ZHX0ROTERfUkVRX05VTSAgICAgICAgICAgMAorI2RlZmluZSBXTklfQ0ZHX0ROTERfUkVRX0xFTiAgICAgICAgICAgV05JX0NGR19NQl9IRFJfTEVOCisKKy8qIENvbmZpZ3VyYXRpb24gZG93bmxvYWQgY29uZmlybSAqLworI2RlZmluZSBXTklfQ0ZHX0ROTERfQ05GX1JFUyAgICAgICAgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRE5MRF9DTkZfTlVNICAgICAgICAgICAxCisjZGVmaW5lIFdOSV9DRkdfRE5MRF9DTkZfTEVOICAgICAgICAgICAoV05JX0NGR19NQl9IRFJfTEVOICsgXAorCQkJCQkoV05JX0NGR19ETkxEX0NORl9OVU0gPDwgMikpCisvKiBHZXQgcmVzcG9uc2UgKi8KKyNkZWZpbmUgV05JX0NGR19HRVRfUlNQX1JFUyAgICAgICAgICAgIDAKKyNkZWZpbmUgV05JX0NGR19HRVRfUlNQX1BJRCAgICAgICAgICAgIDEKKyNkZWZpbmUgV05JX0NGR19HRVRfUlNQX1BMRU4gICAgICAgICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX0dFVF9SU1BfTlVNICAgICAgICAgICAgMworI2RlZmluZSBXTklfQ0ZHX0dFVF9SU1BfUEFSVElBTF9MRU4gICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKwkJCQkJKFdOSV9DRkdfR0VUX1JTUF9OVU0gPDwgMikpCisvKiBTZXQgY29uZmlybSAqLworI2RlZmluZSBXTklfQ0ZHX1NFVF9DTkZfUkVTICAgICAgICAgICAgMAorI2RlZmluZSBXTklfQ0ZHX1NFVF9DTkZfUElEICAgICAgICAgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfU0VUX0NORl9OVU0gICAgICAgICAgICAyCisjZGVmaW5lIFdOSV9DRkdfU0VUX0NORl9MRU4gICAgICAgICAgICAoV05JX0NGR19NQl9IRFJfTEVOICsgXAorCQkJCQkoV05JX0NGR19TRVRfQ05GX05VTSA8PCAyKSkKKy8qIEdldCBhdHRyaWJ1dGUgcmVzcG9uc2UgKi8KKyNkZWZpbmUgV05JX0NGR19HRVRfQVRUUklCX1JTUF9SRVMgICAgIDAKKyNkZWZpbmUgV05JX0NGR19HRVRfQVRUUklCX1JTUF9QSUQgICAgIDEKKyNkZWZpbmUgV05JX0NGR19HRVRfQVRUUklCX1JTUF9UWVBFICAgIDIKKyNkZWZpbmUgV05JX0NGR19HRVRfQVRUUklCX1JTUF9QTEVOICAgIDMKKyNkZWZpbmUgV05JX0NGR19HRVRfQVRUUklCX1JTUF9SVyAgICAgIDQKKworI2RlZmluZSBXTklfQ0ZHX0dFVF9BVFRSSUJfUlNQX05VTSAgICAgNQorI2RlZmluZSBXTklfQ0ZHX0dFVF9BVFRSSUJfUlNQX0xFTiAgICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKwkJCQkJKFdOSV9DRkdfR0VUX0FUVFJJQl9SU1BfTlVNIDw8IDIpKQorCisvKiBBZGQgZ3JvdXAgYWRkcmVzcyBjb25maXJtICovCisjZGVmaW5lIFdOSV9DRkdfQUREX0dSUF9BRERSX0NORl9SRVMgICAwCisKKyNkZWZpbmUgV05JX0NGR19BRERfR1JQX0FERFJfQ05GX05VTSAgIDEKKyNkZWZpbmUgV05JX0NGR19BRERfR1JQX0FERFJfQ05GX0xFTiAgIChXTklfQ0ZHX01CX0hEUl9MRU4gKyBcCisJCQkJCShXTklfQ0ZHX0FERF9HUlBfQUREUl9DTkZfTlVNIDw8IDIpKQorCisvKiBEZWxldGUgZ3JvdXAgYWRkcmVzcyBjb25maXJtICovCisjZGVmaW5lIFdOSV9DRkdfREVMX0dSUF9BRERSX0NORl9SRVMgICAwCisKKyNkZWZpbmUgV05JX0NGR19ERUxfR1JQX0FERFJfQ05GX05VTSAgIDEKKyNkZWZpbmUgV05JX0NGR19ERUxfR1JQX0FERFJfQ05GX0xFTiAgIChXTklfQ0ZHX01CX0hEUl9MRU4gKyBcCisJCQkJCShXTklfQ0ZHX0RFTF9HUlBfQUREUl9DTkZfTlVNIDw8IDIpKQorCisjZGVmaW5lIElTX0NGR19NU0cobXNnKSAoKG1zZyAmIDB4ZmYwMCkgPT0gV05JX0NGR19NU0dfVFlQRVNfQkVHSU4pCisKKy8qIENsZWFyIHN0YXRzIHR5cGVzLiAqLworI2RlZmluZSBBTklfQ0xFQVJfQUxMX1NUQVRTICAgICAgICAgIDAKKyNkZWZpbmUgQU5JX0NMRUFSX1JYX1NUQVRTICAgICAgICAgICAxCisjZGVmaW5lIEFOSV9DTEVBUl9UWF9TVEFUUyAgICAgICAgICAgMgorI2RlZmluZSBBTklfQ0xFQVJfUEVSX1NUQV9TVEFUUyAgICAgIDMKKyNkZWZpbmUgQU5JX0NMRUFSX0FHR1JfUEVSX1NUQV9TVEFUUyA0CisjZGVmaW5lIEFOSV9DTEVBUl9TVEFUX1RZUEVTX0VORCAgICAgNQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBIREQgdG8gQ0ZHIG1lc3NhZ2UgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdOSV9DRkdfRE5MRF9SU1AgICAgICAgICAgICAgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDgwKQorI2RlZmluZSBXTklfQ0ZHX0dFVF9SRVEgICAgICAgICAgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHg4MSkKKyNkZWZpbmUgV05JX0NGR19TRVRfUkVRICAgICAgICAgICAgICAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4ODIpCisjZGVmaW5lIFdOSV9DRkdfU0VUX1JFUV9OT19SU1AgICAgICAgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDgzKSAvKiBObyBSU1AgZm9yIHRoaXMgc2V0ICovCisKKy8qIFNoYWxsIGJlIHJlbW92ZWQgYWZ0ZXIgc3RhdHMgaW50ZWdyYXRpb24gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogSEREIHRvIENGRyBtZXNzYWdlIHBhcmFtdGVyIGluZGljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGUgZm9sbG93aW5ncyBhcmUgd29yZCBpbmRpY2VzIHN0YXJ0aW5nIGZyb20gdGhlIG1lc3NhZ2UgYm9keSAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBXTklfQ0ZHX3h4eHhfeHh4eF94eHh4OiAgICAgICAgIGluZGV4IG9mIHBhcmFtZXRlciAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBXTklfQ0ZHX3h4eHhfeHh4eF9OVU06ICAgICAgICAgIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIG1lc3NhZ2UgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBXTklfQ0ZHX3h4eHhfeHh4eF9MRU46ICAgICAgICAgIGJ5dGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW5jbHVkaW5nICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBXTklfQ0ZHX3h4eHhfeHh4eF9QQVJUSUFMX0xFTjogIGJ5dGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW5jbHVkaW5nICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYW5kIE1CIGhlYWRlciBidXQgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGluZyB2YXJpYWJsZSBkYXRhIGxlbmd0aCAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBEb3dubG9hZCByZXNwb25zZSAqLworI2RlZmluZSBXTklfQ0ZHX0ROTERfUlNQX0JJTl9MRU4gICAgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRE5MRF9SU1BfTlVNICAgICAgICAgICAxCisjZGVmaW5lIFdOSV9DRkdfRE5MRF9SU1BfUEFSVElBTF9MRU4gICAoV05JX0NGR19NQl9IRFJfTEVOICsgXAorCQkJCQkoV05JX0NGR19ETkxEX1JTUF9OVU0gPDwgMikpCisKKy8qIFNldCBwYXJhbWV0ZXIgcmVxdWVzdCAqLworI2RlZmluZSBXTklfQ0ZHX1NFVF9SRVFfUElEICAgICAgICAgICAgMAorI2RlZmluZSBXTklfQ0ZHX1NFVF9SRVFfUExFTiAgICAgICAgICAgMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDRkcgcmV0dXJuIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdOSV9DRkdfU1VDQ0VTUyAgICAgICAgICAgICAxCisjZGVmaW5lIFdOSV9DRkdfTk9UX1JFQURZICAgICAgICAgICAyCisjZGVmaW5lIFdOSV9DRkdfSU5WQUxJRF9QSUQgICAgICAgICAzCisjZGVmaW5lIFdOSV9DRkdfSU5WQUxJRF9MRU4gICAgICAgICA0CisjZGVmaW5lIFdOSV9DRkdfUk9fUEFSQU0gICAgICAgICAgICA1CisjZGVmaW5lIFdOSV9DRkdfV09fUEFSQU0gICAgICAgICAgICA2CisjZGVmaW5lIFdOSV9DRkdfSU5WQUxJRF9TVEFJRCAgICAgICA3CisjZGVmaW5lIFdOSV9DRkdfT1RIRVJfRVJST1IgICAgICAgICA4CisjZGVmaW5lIFdOSV9DRkdfTkVFRF9SRVNUQVJUICAgICAgICA5CisjZGVmaW5lIFdOSV9DRkdfTkVFRF9SRUxPQUQgICAgICAgIDEwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENGRyBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2hhbGwgYmUgcmVtb3ZlZCBhZnRlciBpbnRlZ3JhdGlvbiBvZiBzdGF0cy4gKi8KKy8qIEdldCBzdGF0aXN0aWMgcmVzcG9uc2UgKi8KKyNkZWZpbmUgV05JX0NGR19HRVRfU1RBVF9SU1BfUkVTICAgICAgIDAKKyNkZWZpbmUgV05JX0NGR19HRVRfU1RBVF9SU1BfUEFSQU1JRCAgIDEKKyNkZWZpbmUgV05JX0NGR19HRVRfU1RBVF9SU1BfVkFMVUUgICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX0dFVF9TVEFUX1JTUF9OVU0gICAgICAgMworI2RlZmluZSBXTklfQ0ZHX0dFVF9TVEFUX1JTUF9MRU4gICAgICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKwkJCQkJKFdOSV9DRkdfR0VUX1NUQVRfUlNQX05VTSA8PCAyKSkKKy8qIEdldCBwZXIgc3RhdGlvbiBzdGF0aXN0aWMgcmVzcG9uc2UgKi8KKyNkZWZpbmUgV05JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JTUF9SRVMgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SU1BfU1RBSUQgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTklfQ0ZHX0dFVF9QRVJfU1RBX1NUQVRfUlNQX0ZJUlNUX1BBUkFNICAgICAgICAgICAgICAgIDIKKworLyogUGVyIFNUQSBzdGF0aXN0aWMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBzQW5pQ2ZnUGVyU3RhU3RhdFN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBzZW50QWVzQmxrc1VjYXN0SGk7CisJdW5zaWduZWQgbG9uZyBzZW50QWVzQmxrc1VjYXN0TG87CisKKwl1bnNpZ25lZCBsb25nIHJlY3ZBZXNCbGtzVWNhc3RIaTsKKwl1bnNpZ25lZCBsb25nIHJlY3ZBZXNCbGtzVWNhc3RMbzsKKworCXVuc2lnbmVkIGxvbmcgYWVzRm9ybWF0RXJyb3JVY2FzdENudHM7CisKKwl1bnNpZ25lZCBsb25nIGFlc1JlcGxheXNVY2FzdDsKKworCXVuc2lnbmVkIGxvbmcgYWVzRGVjcnlwdEVyclVjYXN0OworCisJdW5zaWduZWQgbG9uZyBzaW5nbGVSZXRyeVBrdHM7CisKKwl1bnNpZ25lZCBsb25nIGZhaWxlZFR4UGt0czsKKworCXVuc2lnbmVkIGxvbmcgYWNrVGltZW91dHM7CisKKwl1bnNpZ25lZCBsb25nIG11bHRpUmV0cnlQa3RzOworCisJdW5zaWduZWQgbG9uZyBmcmFnVHhDbnRzSGk7CisJdW5zaWduZWQgbG9uZyBmcmFnVHhDbnRzTG87CisKKwl1bnNpZ25lZCBsb25nIHRyYW5zbWl0dGVkUGt0c0hpOworCXVuc2lnbmVkIGxvbmcgdHJhbnNtaXR0ZWRQa3RzTG87CisKKwl1bnNpZ25lZCBsb25nIHBoeVN0YXRIaTsKKwl1bnNpZ25lZCBsb25nIHBoeVN0YXRMbzsKK30gdENmZ1BlclN0YVN0YXRTdHJ1Y3QsICp0cEFuaUNmZ1BlclN0YVN0YXRTdHJ1Y3Q7CisKKyNkZWZpbmUgV05JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JTUF9OVU0gICAgICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SU1BfTEVOICAgIChXTklfQ0ZHX01CX0hEUl9MRU4gKyBcCisJCQkJCSAgICAgKFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SU1BfTlVNIDw8IDIpKQorCisvKiBTaGFsbCBiZSByZW1vdmVkIGFmdGVyIGludGVncmF0aW5nIHN0YXRzLiAqLworI2RlZmluZSBXTklfQ0ZHX0dFVF9TVEFUX1JTUCAgICAgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwOCkKKyNkZWZpbmUgV05JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JTUCAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4MDkpCisjZGVmaW5lIFdOSV9DRkdfR0VUX0FHR19TVEFfU1RBVF9SU1AgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDBhKQorI2RlZmluZSBXTklfQ0ZHX0dFVF9UWF9SQVRFX0NUUl9SU1AgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwYikKKworI2RlZmluZSBXTklfQ0ZHX0dFVF9BR0dfU1RBX1NUQVRfUlNQX05VTSAgICAyMQorI2RlZmluZSBXTklfQ0ZHX0dFVF9BR0dfU1RBX1NUQVRfUlNQX0xFTiAgICAoV05JX0NGR19NQl9IRFJfTEVOICsgXAorCQkJCQkgICAgIChXTklfQ0ZHX0dFVF9BR0dfU1RBX1NUQVRfUlNQX05VTSA8PCAyKSkKKyNkZWZpbmUgV05JX0NGR19HRVRfQUdHX1NUQV9TVEFUX1JTUF9SRVMgMAorCisvKiBHZXQgVFggcmF0ZSBiYXNlZCBzdGF0cyAqLworI2RlZmluZSBXTklfQ0ZHX0dFVF9UWF9SQVRFX0NUUl9SU1BfUkVTICAgICAgICAgICAgICAgICAgICAgICAgMAorCit0eXBlZGVmIHN0cnVjdCBzQW5pQ2ZnVHhSYXRlQ3RycyB7CisvKiBhZGQgdGhlIHJhdGUgY291bnRlcnMgaGVyZSAqLworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfMU1icHM7CisJdW5zaWduZWQgbG9uZyBUeEZyYW1lc18yTWJwczsKKwl1bnNpZ25lZCBsb25nIFR4RnJhbWVzXzVfNU1icHM7CisJdW5zaWduZWQgbG9uZyBUeEZyYW1lc182TWJwczsKKwl1bnNpZ25lZCBsb25nIFR4RnJhbWVzXzlNYnBzOworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfMTFNYnBzOworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfMTJNYnBzOworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfMThNYnBzOworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfMjRNYnBzOworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfMzZNYnBzOworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfNDhNYnBzOworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfNTRNYnBzOworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfNzJNYnBzOworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfOTZNYnBzOworCXVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfMTA4TWJwczsKKworfSB0QW5pQ2ZnVHhSYXRlQ3RycywgKnRwQW5pQ2ZnVHhSYXRlQ3RyczsKKworI2RlZmluZSBXTklfQ0ZHX0dFVF9TVEFUX1JFUSAgICAgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHg4NikKKyNkZWZpbmUgV05JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JFUSAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4ODcpCisjZGVmaW5lIFdOSV9DRkdfR0VUX0FHR19TVEFfU1RBVF9SRVEgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDg4KQorI2RlZmluZSBXTklfQ0ZHX0dFVF9UWF9SQVRFX0NUUl9SRVEgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHg4OSkKKworLyogR2V0IHN0YXRpc3RpYyByZXF1ZXN0ICovCisjZGVmaW5lIFdOSV9DRkdfR0VUX1NUQVRfUkVRX1BBUkFNSUQgICAwCisKKyNkZWZpbmUgV05JX0NGR19HRVRfU1RBVF9SRVFfTlVNICAgICAgIDEKKyNkZWZpbmUgV05JX0NGR19HRVRfU1RBVF9SRVFfTEVOICAgICAgIChXTklfQ0ZHX01CX0hEUl9MRU4gKyBcCisJCQkJCShXTklfQ0ZHX0dFVF9TVEFUX1JFUV9OVU0gPDwgMikpCisKKy8qIEdldCBwZXIgc3RhdGlvbiBzdGF0aXN0aWMgcmVxdWVzdCAqLworI2RlZmluZSBXTklfQ0ZHX0dFVF9QRVJfU1RBX1NUQVRfUkVRX1NUQUlEIDAKKworI2RlZmluZSBXTklfQ0ZHX0dFVF9QRVJfU1RBX1NUQVRfUkVRX05VTSAgIDEKKyNkZWZpbmUgV05JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JFUV9MRU4gICAoV05JX0NGR19NQl9IRFJfTEVOICsgXAorCQkJCQkgICAgKFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SRVFfTlVNIDw8IDIpKQorCisjZGVmaW5lIERZTkFNSUNfQ0ZHX1RZUEVfU0VMRUNURURfUkVHSVNUUkFSICAgKDApCisjZGVmaW5lIERZTkFNSUNfQ0ZHX1RZUEVfV1BTX1NUQVRFICAgICAgICAgICAgKDEpCisKKyNlbmRpZiAvKiBfX1dOSV9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvaW5jL3duaV9jZmcuaCBiL2NvcmUvbWFjL2luYy93bmlfY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ODNkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL2luYy93bmlfY2ZnLmgKQEAgLTAsMCArMSwxNTcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fV05JQ0ZHX0gKKyNkZWZpbmUgX19XTklDRkdfSAorCisvKgorICogQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgSUQgZm9yIFNUQQorICovCisKK2VudW0geworCVdOSV9DRkdfU1RBX0lELAorCVdOSV9DRkdfQ0ZfUE9MTEFCTEUsCisJV05JX0NGR19DRlBfUEVSSU9ELAorCVdOSV9DRkdfQ0ZQX01BWF9EVVJBVElPTiwKKwlXTklfQ0ZHX1NTSUQsCisJV05JX0NGR19CRUFDT05fSU5URVJWQUwsCisJV05JX0NGR19EVElNX1BFUklPRCwKKwlXTklfQ0ZHX1dFUF9LRVlfTEVOR1RILAorCVdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzEsCisJV05JX0NGR19XRVBfREVGQVVMVF9LRVlfMiwKKwlXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8zLAorCVdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzQsCisJV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRCwKKwlXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURUQsCisJV05JX0NGR19SVFNfVEhSRVNIT0xELAorCVdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVQsCisJV05JX0NGR19MT05HX1JFVFJZX0xJTUlULAorCVdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsCisJV05JX0NGR19BQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUsCisJV05JX0NGR19BQ1RJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUUsCisJV05JX0NGR19QQVNTSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FLAorCVdOSV9DRkdfUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSwKKwlXTklfQ0ZHX0pPSU5fRkFJTFVSRV9USU1FT1VULAorCVdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVCwKKwlXTklfQ0ZHX0FVVEhFTlRJQ0FURV9SU1BfVElNRU9VVCwKKwlXTklfQ0ZHX0FTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVCwKKwlXTklfQ0ZHX1JFQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VULAorCVdOSV9DRkdfUkFfUEVSSU9ESUNJVFlfVElNRU9VVF9JTl9QUywKKwlXTklfQ0ZHX1BTX0VOQUJMRV9CQ05fRklMVEVSLAorCVdOSV9DRkdfUFNfRU5BQkxFX0hFQVJUX0JFQVQsCisJV05JX0NGR19QU19FTkFCTEVfUlNTSV9NT05JVE9SLAorCVdOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVQsCisJV05JX0NGR19SRl9TRVRUTElOR19USU1FX0NMSywKKwlXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUIsCisJV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBLAorCVdOSV9DRkdfUEhZX01PREUsCisJV05JX0NGR19ET1QxMV9NT0RFLAorCVdOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVQsCisJV05JX0NGR19FWFRFTkRFRF9PUEVSQVRJT05BTF9SQVRFX1NFVCwKKwlXTklfQ0ZHX1BST1BSSUVUQVJZX09QRVJBVElPTkFMX1JBVEVfU0VULAorCVdOSV9DRkdfTElTVEVOX0lOVEVSVkFMLAorCVdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNULAorCVdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMLAorCVdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzVHSFosCisJV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFosCisJV05JX0NGR19SQVRFX0FEQVBUQVRJT05fVFlQRSwKKwlXTklfQ0ZHX0ZJWEVEX1JBVEUsCisJV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWiwKKwlXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFosCisJV05JX0NGR19SRVRSWVJBVEVfUE9MSUNZLAorCVdOSV9DRkdfUkVUUllSQVRFX1NFQ09OREFSWSwKKwlXTklfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWSwKKwlXTklfQ0ZHX0FQU0RfRU5BQkxFRCwKKwlXTklfQ0ZHX1NIQVJFRF9LRVlfQVVUSF9FTkFCTEUsCisJV05JX0NGR19PUEVOX1NZU1RFTV9BVVRIX0VOQUJMRSwKKwlXTklfQ0ZHX0FVVEhFTlRJQ0FUSU9OX1RZUEUsCisJV05JX0NGR19DRl9QT0xMX1JFUVVFU1QsCisJV05JX0NGR19QUklWQUNZX0VOQUJMRUQsCisJV05JX0NGR19TSE9SVF9QUkVBTUJMRSwKKwlXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRSwKKwlXTklfQ0ZHX0FDQ0VQVF9TSE9SVF9TTE9UX0FTU09DX09OTFksCisJV05JX0NGR19RT1NfRU5BQkxFRCwKKwlXTklfQ0ZHX0hDRl9FTkFCTEVELAorCVdOSV9DRkdfUlNOX0VOQUJMRUQsCisJV05JX0NGR19NQVhfTlVNX1BSRV9BVVRILAorCVdOSV9DRkdfUFJFQVVUSF9DTE5VUF9USU1FT1VULAorCVdOSV9DRkdfUkVMRUFTRV9BSURfVElNRU9VVCwKKwlXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xELAorCVdOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VULAorCVdOSV9DRkdfTUFOVUZBQ1RVUkVSX09VSSwKKwlXTklfQ0ZHX01BTlVGQUNUVVJFUl9OQU1FLAorCVdOSV9DRkdfTU9ERUxfTlVNQkVSLAorCVdOSV9DRkdfTU9ERUxfTkFNRSwKKwlXTklfQ0ZHX01BTlVGQUNUVVJFUl9QUk9EVUNUX05BTUUsCisJV05JX0NGR19NQU5VRkFDVFVSRVJfUFJPRFVDVF9WRVJTSU9OLAorCVdOSV9DRkdfMTFEX0VOQUJMRUQsCisJV05JX0NGR19NQVhfVFhfUE9XRVJfMl80LAorCVdOSV9DRkdfTUFYX1RYX1BPV0VSXzUsCisJV05JX0NGR19ORVRXT1JLX0RFTlNJVFksCisJV05JX0NGR19BREFQVElWRV9USFJFU0hPTERfQUxHT1JJVEhNLAorCVdOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BLAorCVdOSV9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BLAorCVdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTCwKKwlXTklfQ0ZHX05FV19CU1NfRk9VTkRfSU5ELAorCVdOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRCwKKwlXTklfQ0ZHX0FQX05PREVfTkFNRSwKKwlXTklfQ0ZHX0NPVU5UUllfQ09ERSwKKwlXTklfQ0ZHXzExSF9FTkFCTEVELAorCVdOSV9DRkdfV1RfQ05GX1RJTUVPVVQsCisJV05JX0NGR19QUk9YSU1JVFksCisJV05JX0NGR19MT0dfTEVWRUwsCisJV05JX0NGR19PTEJDX0RFVEVDVF9USU1FT1VULAorCVdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVELAorCVdOSV9DRkdfMTFHX1BST1RFQ1RJT05fQUxXQVlTLAorCVdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04sCisJV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRCwKKwlXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRCwKKwlXTklfQ0ZHXzExR19PTkxZX1BPTElDWSwKKwlXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTiwKKwlXTklfQ0ZHX1dNRV9FTkFCTEVELAorCVdOSV9DRkdfQUREVFNfUlNQX1RJTUVPVVQsCisJV05JX0NGR19NQVhfU1BfTEVOR1RILAorCVdOSV9DRkdfS0VFUF9BTElWRV9TVEFfTElNSVRfVEhSRVNIT0xELAorCVdOSV9DRkdfU0VORF9TSU5HTEVfU1NJRF9BTFdBWVMsCisJV05JX0NGR19XU01fRU5BQkxFRCwKKwlXTklfQ0ZHX0VEQ0FfUFJPRklMRSwKKwlXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUwsCisJV05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMLAorCVdOSV9DRkdfRURDQV9BTklfQUNWSV9MT0NBTCwKKwlXTklfQ0ZHX0VEQ0FfQU5JX0FDVk9fTE9DQUwsCisJV05JX0NGR19FRENBX0FOSV9BQ0JLLAorCVdOSV9DRkdfRURDQV9BTklfQUNCRSwKKwlXTklfQ0ZHX0VEQ0FfQU5JX0FDVkksCisJV05JX0NGR19FRENBX0FOSV9BQ1ZPLAorCVdOSV9DRkdfRURDQV9XTUVfQUNCS19MT0NBTCwKKwlXTklfQ0ZHX0VEQ0FfV01FX0FDQkVfTE9DQUwsCisJV05JX0NGR19FRENBX1dNRV9BQ1ZJX0xPQ0FMLAorCVdOSV9DRkdfRURDQV9XTUVfQUNWT19MT0NBTCwKKwlXTklfQ0ZHX0VEQ0FfV01FX0FDQkssCisJV05JX0NGR19FRENBX1dNRV9BQ0JFLAorCVdOSV9DRkdfRURDQV9XTUVfQUNWSSwKKwlXTklfQ0ZHX0VEQ0FfV01FX0FDVk8sCisJV05JX0NGR19SREVUX0ZMQUcsCisJV05JX0NGR19SQURBUl9DSEFOTkVMX0xJU1QsCisJV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5ULAorCVdOSV9DRkdfQURNSVRfUE9MSUNZLAorCVdOSV9DRkdfQURNSVRfQldGQUNUT1IsCisJV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkUsCisJV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSwKKwlXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFLAorCVdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfWkVSTywKKwlXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORSwKKwlXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1RXTywKKwlXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU4sCisJV05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HLAorCVdOSV9DRkdfU0NBTl9DT05UUk9MX0xJU1QsCisJV05JX0NGR19NSU1PX0VOQUJMRUQsCisJV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRCwKKwlXTklfQ0ZHX0hUX1JYX1NUQkMsCisJV05JX0NGR19IVF9DQVBfSU5GTywKKwlXTklfQ0ZHX0hUX0FNUERVX1BBUkFNUywKKwlXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorCVdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPLAorCVdOSV9DRkdfVFhfQkZfQ0FQLAorCVdOSV9DRkdfQVNfQ0FQLAorCVdOSV9DRkdfSFRfSU5GT19GSUVMRDEsCisJV05JX0NGR19IVF9JTkZPX0ZJRUxEMiwKKwlXTklfQ0ZHX0hUX0lORk9fRklFTEQzLAorCVdOSV9DRkdfQkFTSUNfTUNTX1NFVCwKKwlXTklfQ0ZHX0NVUlJFTlRfTUNTX1NFVCwKKwlXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWSwKKwlXTklfQ0ZHX1ZIVF9NQVhfTVBEVV9MRU5HVEgsCisJV05JX0NGR19WSFRfU1VQUE9SVEVEX0NIQU5fV0lEVEhfU0VULAorCVdOSV9DRkdfVkhUX0xEUENfQ09ESU5HX0NBUCwKKwlXTklfQ0ZHX1ZIVF9TSE9SVF9HSV84ME1IWiwKKwlXTklfQ0ZHX1ZIVF9TSE9SVF9HSV8xNjBfQU5EXzgwX1BMVVNfODBNSFosCisJV05JX0NGR19WSFRfVFhTVEJDLAorCVdOSV9DRkdfVkhUX1JYU1RCQywKKwlXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVSX0NBUCwKKwlXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVFX0NBUCwKKwlXTklfQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVELAorCVdOSV9DRkdfVkhUX05VTV9TT1VORElOR19ESU1FTlNJT05TLAorCVdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRVJfQ0FQLAorCVdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRUVfQ0FQLAorCVdOSV9DRkdfVkhUX1RYT1BfUFMsCisJV05JX0NGR19WSFRfSFRDX1ZIVENfQ0FQLAorCVdOSV9DRkdfVkhUX0FNUERVX0xFTl9FWFBPTkVOVCwKKwlXTklfQ0ZHX1ZIVF9MSU5LX0FEQVBUQVRJT05fQ0FQLAorCVdOSV9DRkdfVkhUX1JYX0FOVF9QQVRURVJOLAorCVdOSV9DRkdfVkhUX1RYX0FOVF9QQVRURVJOLAorCVdOSV9DRkdfVkhUX1JYX01DU19NQVAsCisJV05JX0NGR19WSFRfVFhfTUNTX01BUCwKKwlXTklfQ0ZHX1ZIVF9SWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEUsCisJV05JX0NGR19WSFRfVFhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFLAorCVdOSV9DRkdfVkhUX0NIQU5ORUxfQ0VOVEVSX0ZSRVFfU0VHTUVOVDEsCisJV05JX0NGR19WSFRfQ0hBTk5FTF9DRU5URVJfRlJFUV9TRUdNRU5UMiwKKwlXTklfQ0ZHX1ZIVF9CQVNJQ19NQ1NfU0VULAorCVdOSV9DRkdfVkhUX01VX01JTU9fQ0FQX1NUQV9DT1VOVCwKKwlXTklfQ0ZHX1ZIVF9TU19VTkRFUl9VVElMLAorCVdOSV9DRkdfVkhUXzQwTUhaX1VUSUxJWkFUSU9OLAorCVdOSV9DRkdfVkhUXzgwTUhaX1VUSUxJWkFUSU9OLAorCVdOSV9DRkdfVkhUXzE2ME1IWl9VVElMSVpBVElPTiwKKwlXTklfQ0ZHX01BWF9BTVNEVV9MRU5HVEgsCisJV05JX0NGR19NUERVX0RFTlNJVFksCisJV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SLAorCVdOSV9DRkdfU0hPUlRfR0lfMjBNSFosCisJV05JX0NGR19TSE9SVF9HSV80ME1IWiwKKwlXTklfQ0ZHX1JJRlNfRU5BQkxFRCwKKwlXTklfQ0ZHX01BWF9QU19QT0xMLAorCVdOSV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFLAorCVdOSV9DRkdfUlNTSV9GSUxURVJfUEVSSU9ELAorCVdOSV9DRkdfTUlOX1JTU0lfVEhSRVNIT0xELAorCVdOSV9DRkdfQlJPQURDQVNUX0ZSQU1FX0ZJTFRFUl9FTkFCTEUsCisJV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRSwKKwlXTklfQ0ZHX0lHTk9SRV9EVElNLAorCVdOSV9DRkdfV09XTEFOX1VDQVNUX1BBVFRFUk5fRklMVEVSX0VOQUJMRSwKKwlXTklfQ0ZHX1dPV0xBTl9DSEFOTkVMX1NXSVRDSF9FTkFCTEUsCisJV05JX0NGR19XT1dMQU5fREVBVVRIX0VOQUJMRSwKKwlXTklfQ0ZHX1dPV0xBTl9ESVNBU1NPQ19FTkFCTEUsCisJV05JX0NGR19XT1dMQU5fTUFYX01JU1NFRF9CRUFDT04sCisJV05JX0NGR19XT1dMQU5fTUFYX1NMRUVQX1BFUklPRCwKKwlXTklfQ0ZHX0JHX1NDQU5fQ0hBTk5FTF9MSVNULAorCVdOSV9DRkdfTUFYX01FRElVTV9USU1FLAorCVdOSV9DRkdfTUFYX01QRFVTX0lOX0FNUERVLAorCVdOSV9DRkdfSUJTU19BVVRPX0JTU0lELAorCVdOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9GTEFHLAorCVdOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9EQVRBLAorCVdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHLAorCVdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMSwKKwlXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTIsCisJV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEzLAorCVdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9GTEFHLAorCVdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9EQVRBLAorCVdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9GTEFHLAorCVdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9EQVRBLAorCVdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBRywKKwlXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEEsCisJV05JX0NGR19XUFNfRU5BQkxFLAorCVdOSV9DRkdfV1BTX1NUQVRFLAorCVdOSV9DRkdfV1BTX1BST0JFX1JFUV9GTEFHLAorCVdOSV9DRkdfV1BTX1ZFUlNJT04sCisJV05JX0NGR19XUFNfUkVRVUVTVF9UWVBFLAorCVdOSV9DRkdfV1BTX0NGR19NRVRIT0QsCisJV05JX0NGR19XUFNfVVVJRCwKKwlXTklfQ0ZHX1dQU19QUklNQVJZX0RFVklDRV9DQVRFR09SWSwKKwlXTklfQ0ZHX1dQU19QSU1BUllfREVWSUNFX09VSSwKKwlXTklfQ0ZHX1dQU19ERVZJQ0VfU1VCX0NBVEVHT1JZLAorCVdOSV9DRkdfV1BTX0FTU09DSUFUSU9OX1NUQVRFLAorCVdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1IsCisJV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lELAorCVdOSV9DRkdfV1BTX0FTU09DX01FVEhPRCwKKwlXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFLAorCVdOSV9DRkdfRU5BQkxFX1BIWV9BR0NfTElTVEVOX01PREUsCisJV05JX0NGR19SUEVfUE9MTElOR19USFJFU0hPTEQsCisJV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzBfUkVHLAorCVdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMxX1JFRywKKwlXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMl9SRUcsCisJV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzNfUkVHLAorCVdOSV9DRkdfTk9fT0ZfT05DSElQX1JFT1JERVJfU0VTU0lPTlMsCisJV05JX0NGR19TSU5HTEVfVElEX1JDLAorCVdOSV9DRkdfUlJNX0VOQUJMRUQsCisJV05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYLAorCVdOSV9DRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVgsCisJV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEUsCisJV05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElORywKKwlXTklfQ0ZHX0JUQ19ESENQX0JUX1NMT1RTX1RPX0JMT0NLLAorCVdOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFLAorCVdOSV9DRkdfUFNfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VULAorCVdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOLAorCVdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTEksCisJV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlMsCisJV05JX0NGR19URUxFX0JDTl9NQVhfTEksCisJV05JX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TLAorCVdOSV9DRkdfQlRDX0EyRFBfREhDUF9CVF9TVUJfSU5URVJWQUxTLAorCVdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9ELAorCVdOSV9DRkdfQVNTT0NfU1RBX0xJTUlULAorCVdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX1NUQVJUX0NIQU5ORUwsCisJV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfRU5EX0NIQU5ORUwsCisJV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkQsCisJV05JX0NGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9ELAorCVdOSV9DRkdfRU5BQkxFX0NMT1NFX0xPT1AsCisJV05JX0NGR19FTkFCTEVfTFRFX0NPRVgsCisJV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVQsCisJV05JX0NGR19HT19LRUVQX0FMSVZFX1RJTUVPVVQsCisJV05JX0NGR19FTkFCTEVfTUNfQUREUl9MSVNULAorCVdOSV9DRkdfRU5BQkxFX1VDX0ZJTFRFUiwKKwlXTklfQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OLAorCVdOSV9DRkdfRU5BQkxFX01DQ19BREFQVElWRV9TQ0hFRCwKKwlXTklfQ0ZHX0RJU0FCTEVfTERQQ19XSVRIX1RYQkZfQVAsCisJV05JX0NGR19BUF9MSU5LX01PTklUT1JfVElNRU9VVCwKKwlXTklfQ0ZHX1RETFNfUU9TX1dNTV9VQVBTRF9NQVNLLAorCVdOSV9DRkdfVERMU19CVUZfU1RBX0VOQUJMRUQsCisJV05JX0NGR19URExTX1BVQVBTRF9JTkFDVF9USU1FLAorCVdOSV9DRkdfVERMU19SWF9GUkFNRV9USFJFU0hPTEQsCisJV05JX0NGR19QTUZfU0FfUVVFUllfTUFYX1JFVFJJRVMsCisJV05JX0NGR19QTUZfU0FfUVVFUllfUkVUUllfSU5URVJWQUwsCisJV05JX0NGR19FTkFCTEVfQURBUFRfUlhfRFJBSU4sCisJV05JX0NGR19GTEVYX0NPTk5FQ1RfUE9XRVJfRkFDVE9SLAorCVdOSV9DRkdfQU5URU5OQV9ESVZFU0lUWSwKKwlXTklfQ0ZHX0dPX0xJTktfTU9OSVRPUl9USU1FT1VULAorCVdOSV9DRkdfUk1DX0FDVElPTl9QRVJJT0RfRlJFUVVFTkNZLAorCVdOSV9DRkdfQ1VSUkVOVF9SU1NJLAorCVdOSV9DRkdfUlRUM19FTkFCTEUsCisJV05JX0NGR19ERUJVR19QMlBfUkVNQUlOX09OX0NIQU5ORUwsCisJV05JX0NGR19URExTX09GRl9DSEFOTkVMX0VOQUJMRUQsCisJV05JX0NGR19JQlNTX0FUSU1fV0lOX1NJWkUsCisJV05JX0NGR19ERlNfTUFTVEVSX0VOQUJMRUQsCisJV05JX0NGR19WSFRfRU5BQkxFX1RYQkZfMjBNSFosCisJV05JX0NGR19URExTX1dNTV9NT0RFX0VOQUJMRUQKK307CisvKgorICogU3RyaW5nIHBhcmFtZXRlciBsZW5ndGhzCisgKi8KKworI2RlZmluZSBXTklfQ0ZHX1NUQV9JRF9MRU4gICAgNgorI2RlZmluZSBXTklfQ0ZHX1NTSURfTEVOICAgIDMyCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzFfTEVOICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzJfTEVOICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzNfTEVOICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzRfTEVOICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQl9MRU4gICAgNAorI2RlZmluZSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUFfTEVOICAgIDgKKyNkZWZpbmUgV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVF9MRU4gICAgMTIKKyNkZWZpbmUgV05JX0NGR19FWFRFTkRFRF9PUEVSQVRJT05BTF9SQVRFX1NFVF9MRU4gICAgOAorI2RlZmluZSBXTklfQ0ZHX1BST1BSSUVUQVJZX09QRVJBVElPTkFMX1JBVEVfU0VUX0xFTiAgICA0CisjZGVmaW5lIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTiAgICAxMDAKKyNkZWZpbmUgV05JX0NGR19NQU5VRkFDVFVSRVJfT1VJX0xFTiAgICAzCisjZGVmaW5lIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX05BTUVfTEVOICAgIDY0CisjZGVmaW5lIFdOSV9DRkdfTU9ERUxfTlVNQkVSX0xFTiAgICAzMgorI2RlZmluZSBXTklfQ0ZHX01PREVMX05BTUVfTEVOICAgIDMyCisjZGVmaW5lIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfTkFNRV9MRU4gICAgMzIKKyNkZWZpbmUgV05JX0NGR19NQU5VRkFDVFVSRVJfUFJPRFVDVF9WRVJTSU9OX0xFTiAgICAzMgorI2RlZmluZSBXTklfQ0ZHX01BWF9UWF9QT1dFUl8yXzRfTEVOICAgIDEyOAorI2RlZmluZSBXTklfQ0ZHX01BWF9UWF9QT1dFUl81X0xFTiAgICAxMjgKKyNkZWZpbmUgV05JX0NGR19BUF9OT0RFX05BTUVfTEVOICAgIDMyCisjZGVmaW5lIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiAgICAzCisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDVklfTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNWT19MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ0JLX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDQkVfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNWSV9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ1ZPX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDQktfTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNCRV9MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ1ZJX0xPQ0FMX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVk9fTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNCS19MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ0JFX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVklfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNWT19MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19SQURBUl9DSEFOTkVMX0xJU1RfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfU0NBTl9DT05UUk9MX0xJU1RfTEVOICAgIDEyOAorI2RlZmluZSBXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VUX0xFTiAgICAxNgorI2RlZmluZSBXTklfQ0ZHX0JBU0lDX01DU19TRVRfTEVOICAgIDE2CisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9NQ1NfU0VUX0xFTiAgICAxNgorI2RlZmluZSBXTklfQ0ZHX0JHX1NDQU5fQ0hBTk5FTF9MSVNUX0xFTiAgICAxMDAKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETklFX0RBVEFfTEVOICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTFfTEVOICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTJfTEVOICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTNfTEVOICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfREFUQV9MRU4gICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9EQVRBX0xFTiAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBX0xFTiAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19XUFNfVVVJRF9MRU4gICAgMTYKKworLyoKKyAqIEludGVnZXIgcGFyYW1ldGVyIG1pbi9tYXgvZGVmYXVsdCB2YWx1ZXMKKyAqLworCisjZGVmaW5lIFdOSV9DRkdfQ0ZQX1BFUklPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NGUF9QRVJJT0RfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0NGUF9QRVJJT0RfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT05fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19DRlBfTUFYX0RVUkFUSU9OX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT05fU1RBREVGICAgIDMwMDAwCisKKyNkZWZpbmUgV05JX0NGR19CRUFDT05fSU5URVJWQUxfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19CRUFDT05fSU5URVJWQUxfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMX1NUQURFRiAgICAxMDAKKworI2RlZmluZSBXTklfQ0ZHX0RUSU1fUEVSSU9EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFRJTV9QRVJJT0RfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfRFRJTV9QRVJJT0RfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIX1NUQU1JTiAgICA1CisjZGVmaW5lIFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfU1RBTUFYICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfU1RBREVGICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzUgICAgNQorI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzICAgIDEzCisKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEX1NUQU1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEXzAgICAgMAorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEXzEgICAgMQorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEXzIgICAgMgorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEXzMgICAgMworCisjZGVmaW5lIFdOSV9DRkdfRVhDTFVERV9VTkVOQ1JZUFRFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19FWENMVURFX1VORU5DUllQVEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFNQVggICAgMTA0ODU3NgorI2RlZmluZSBXTklfQ0ZHX1JUU19USFJFU0hPTERfU1RBREVGICAgIDIzNDcKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVRfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlUX1NUQURFRiAgICA2CisKKyNkZWZpbmUgV05JX0NGR19MT05HX1JFVFJZX0xJTUlUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVF9TVEFERUYgICAgNgorCisjZGVmaW5lIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBTUlOICAgIDI1NgorI2RlZmluZSBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX1NUQU1BWCAgICA4MDAwCisjZGVmaW5lIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBREVGICAgIDgwMDAKKworI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19BQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUVfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19BQ1RJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BQ1RJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQUNUSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX1NUQURFRiAgICA0MAorCisjZGVmaW5lIFdOSV9DRkdfUEFTU0lWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUVfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUEFTU0lWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFERUYgICAgNjAKKworI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBREVGICAgIDExMAorCisjZGVmaW5lIFdOSV9DRkdfSk9JTl9GQUlMVVJFX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVF9TVEFERUYgICAgMzAwMAorCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVRfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VUX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9SU1BfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFERUYgICAgMjAwMAorCisjZGVmaW5lIFdOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfUkFfUEVSSU9ESUNJVFlfVElNRU9VVF9JTl9QU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JBX1BFUklPRElDSVRZX1RJTUVPVVRfSU5fUFNfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUkFfUEVSSU9ESUNJVFlfVElNRU9VVF9JTl9QU19TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVJfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUl9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9CQ05fRklMVEVSX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfSEVBUlRfQkVBVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9IRUFSVF9CRUFUX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX0hFQVJUX0JFQVRfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1JfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfUlNTSV9NT05JVE9SX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19SRl9TRVRUTElOR19USU1FX0NMS19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLX1NUQU1BWCAgICA2MDAwMAorI2RlZmluZSBXTklfQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLX1NUQURFRiAgICAxNTAwCisKKyNkZWZpbmUgV05JX0NGR19QSFlfTU9ERV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BIWV9NT0RFX1NUQU1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfUEhZX01PREVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BIWV9NT0RFXzExQSAgICAwCisjZGVmaW5lIFdOSV9DRkdfUEhZX01PREVfMTFCICAgIDEKKyNkZWZpbmUgV05JX0NGR19QSFlfTU9ERV8xMUcgICAgMgorI2RlZmluZSBXTklfQ0ZHX1BIWV9NT0RFX05PTkUgICAgMworCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfU1RBTUFYICAgIDExCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9BTEwgICAgMAorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfMTFBICAgIDEKKyNkZWZpbmUgV05JX0NGR19ET1QxMV9NT0RFXzExQiAgICAyCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUcgICAgMworI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfMTFOICAgIDQKKyNkZWZpbmUgV05JX0NGR19ET1QxMV9NT0RFXzExR19PTkxZICAgIDUKKyNkZWZpbmUgV05JX0NGR19ET1QxMV9NT0RFXzExTl9PTkxZICAgIDYKKyNkZWZpbmUgV05JX0NGR19ET1QxMV9NT0RFXzExQUMgICAgNworI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfMTFBQ19PTkxZICAgIDgKKworI2RlZmluZSBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19MSVNURU5fSU5URVJWQUxfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9TVEFNQVggICAgMTY1CisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haX1NUQU1BWCAgICAxMQorI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haX1NUQURFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFpfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFpfU1RBTUFYICAgIDMxCisjZGVmaW5lIFdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19SQVRFX0FEQVBUQVRJT05fVFlQRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JBVEVfQURBUFRBVElPTl9UWVBFX1NUQU1BWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1JBVEVfQURBUFRBVElPTl9UWVBFX0ZJWEVEICAgIDAKKyNkZWZpbmUgV05JX0NGR19SQVRFX0FEQVBUQVRJT05fVFlQRV9BVVRPICAgIDEKKyNkZWZpbmUgV05JX0NGR19SQVRFX0FEQVBUQVRJT05fVFlQRV9TTlJfQkFTRUQgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfU1RBTUFYICAgIDQ0CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9BVVRPICAgIDAKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzFNQlBTICAgIDEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzJNQlBTICAgIDIKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzVfNU1CUFMgICAgMworI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMTFNQlBTICAgIDQKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzZNQlBTICAgIDUKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzlNQlBTICAgIDYKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzEyTUJQUyAgICA3CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8xOE1CUFMgICAgOAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMjRNQlBTICAgIDkKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzM2TUJQUyAgICAxMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNDhNQlBTICAgIDExCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV81NE1CUFMgICAgMTIKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzZfNU1CUFNfTUNTMF8yME1IWl9TSU1PICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8xM01CUFNfTUNTMV8yME1IWl9TSU1PICAgIDE0CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8xOV81TUJQU19NQ1MyXzIwTUhaX1NJTU8gICAgMTUKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzI2TUJQU19NQ1MzXzIwTUhaX1NJTU8gICAgMTYKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzM5TUJQU19NQ1M0XzIwTUhaX1NJTU8gICAgMTcKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzUyTUJQU19NQ1M1XzIwTUhaX1NJTU8gICAgMTgKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzU4XzVNQlBTX01DUzZfMjBNSFpfU0lNTyAgICAxOQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNjVNQlBTX01DUzdfMjBNSFpfU0lNTyAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfN18yTUJQU19NQ1MwXzIwTUhaX1NJTU9fU0dJICAgIDIxCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8xNF80TUJQU19NQ1MxXzIwTUhaX1NJTU9fU0dJICAgIDIyCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8yMV83TUJQU19NQ1MyXzIwTUhaX1NJTU9fU0dJICAgIDIzCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8yOF85TUJQU19NQ1MzXzIwTUhaX1NJTU9fU0dJICAgIDI0CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV80M18zTUJQU19NQ1M0XzIwTUhaX1NJTU9fU0dJICAgIDI1CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV81N184TUJQU19NQ1M1XzIwTUhaX1NJTU9fU0dJICAgIDI2CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV82NU1CUFNfTUNTNl8yME1IWl9TSU1PX1NHSSAgICAyNworI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNzJfMk1CUFNfTUNTN18yME1IWl9TSU1PX1NHSSAgICAyOAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMF8yNU1CUFNfU0xSXzIwTUhaX1NJTU8gICAgMjkKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzBfNU1CUFNfU0xSXzIwTUhaX1NJTU8gICAgMzAKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzY4XzI1TUJQU19RQ19QUk9QXzIwTUhaX1NJTU8gICAgMzEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzU0TUJQU19NQ1MzXzQwTUhaX1NJTU8gICAgMzIKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzgxTUJQU19NQ1M0XzQwTUhaX1NJTU8gICAgMzMKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzEwOE1CUFNfTUNTNV80ME1IWl9TSU1PICAgIDM0CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8xMjFfNU1CUFNfTUNTNl80ME1IWl9TSU1PICAgIDM1CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8xMzVNQlBTX01DUzdfNDBNSFpfU0lNTyAgICAzNgorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMTVNQlBTX01DUzBfNDBNSFpfU0lNT19TR0kgICAgMzcKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzMwTUJQU19NQ1MxXzQwTUhaX1NJTU9fU0dJICAgIDM4CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV80NU1CUFNfTUNTMl80ME1IWl9TSU1PX1NHSSAgICAzOQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNjBNQlBTX01DUzNfNDBNSFpfU0lNT19TR0kgICAgNDAKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzkwTUJQU19NQ1M0XzQwTUhaX1NJTU9fU0dJICAgIDQxCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8xMjBNQlBTX01DUzVfNDBNSFpfU0lNT19TR0kgICAgNDIKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzEzNU1CUFNfTUNTNl80ME1IWl9TSU1PX1NHSSAgICA0MworI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMTUwTUJQU19NQ1M3XzQwTUhaX1NJTU9fU0dJICAgIDQ0CisKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzI0R0haX1NUQU1BWCAgICAzMQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzI0R0haX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF81R0haX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWl9TVEFNQVggICAgMzEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF81R0haX1NUQURFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfUE9MSUNZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9TVEFERUYgICAgNAorCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9NSU5fU1VQUE9SVEVEICAgIDAKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfUE9MSUNZX1BSSU1BUlkgICAgMQorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfUkVTRVJWRUQgICAgMgorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfQ0xPU0VTVCAgICAzCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9BVVRPU0VMRUNUICAgIDQKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfUE9MSUNZX01BWCAgICA1CisKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1NFQ09OREFSWV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1NFQ09OREFSWV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfVEVSVElBUllfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FQU0RfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FQU0RfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0FQU0RfRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfU0hBUkVEX0tFWV9BVVRIX0VOQUJMRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NIQVJFRF9LRVlfQVVUSF9FTkFCTEVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19PUEVOX1NZU1RFTV9BVVRIX0VOQUJMRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX09QRU5fU1lTVEVNX0FVVEhfRU5BQkxFX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0FVVEhFTlRJQ0FUSU9OX1RZUEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FVVEhFTlRJQ0FUSU9OX1RZUEVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9QUkVBTUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9TTE9UX1RJTUVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9TTE9UX1RJTUVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9TTE9UX1RJTUVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0FDQ0VQVF9TSE9SVF9TTE9UX0FTU09DX09OTFlfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BQ0NFUFRfU0hPUlRfU0xPVF9BU1NPQ19PTkxZX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQUNDRVBUX1NIT1JUX1NMT1RfQVNTT0NfT05MWV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUU9TX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19RT1NfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1FPU19FTkFCTEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19IQ0ZfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hDRl9FTkFCTEVEX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfSENGX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1JTTl9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlNOX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19SU05fRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQkFDS0dST1VORF9TQ0FOX1BFUklPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9QRVJJT0RfU1RBTUFYICAgIDE4MDAwMAorI2RlZmluZSBXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9QRVJJT0RfU1RBREVGICAgIDUwMDAKKworI2RlZmluZSBXTklfQ0ZHX01BWF9OVU1fUFJFX0FVVEhfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfTlVNX1BSRV9BVVRIX1NUQU1BWCAgICAyNTYKKyNkZWZpbmUgV05JX0NGR19NQVhfTlVNX1BSRV9BVVRIX1NUQURFRiAgICA2NAorCisjZGVmaW5lIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTERfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRF9TVEFERUYgICAgNDAKKworI2RlZmluZSBXTklfQ0ZHX1BST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVF9TVEFNSU4gICAgMTAKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9BRlRFUl9IQl9GQUlMX1RJTUVPVVRfU1RBTUFYICAgIDEwMDAwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VUX1NUQURFRiAgICA0MAorCisjZGVmaW5lIFdOSV9DRkdfMTFEX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR18xMURfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHXzExRF9FTkFCTEVEX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfU1RBTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfU1RBREVGICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX05FVFdPUktfREVOU0lUWV9MT1cgICAgMAorI2RlZmluZSBXTklfQ0ZHX05FVFdPUktfREVOU0lUWV9NRURJVU0gICAgMQorI2RlZmluZSBXTklfQ0ZHX05FVFdPUktfREVOU0lUWV9ISUdIICAgIDIKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfQURBUFRJVkUgICAgMworCisjZGVmaW5lIFdOSV9DRkdfQURBUFRJVkVfVEhSRVNIT0xEX0FMR09SSVRITV9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX0FEQVBUSVZFX1RIUkVTSE9MRF9BTEdPUklUSE1fU1RBTUFYICAgIDIKKyNkZWZpbmUgV05JX0NGR19BREFQVElWRV9USFJFU0hPTERfQUxHT1JJVEhNX1NUQURFRiAgICAyCisKKyNkZWZpbmUgV05JX0NGR19BREFQVElWRV9USFJFU0hPTERfQUxHT1JJVEhNX0NBUlJJRVIgICAgMQorI2RlZmluZSBXTklfQ0ZHX0FEQVBUSVZFX1RIUkVTSE9MRF9BTEdPUklUSE1fQ09SUkVMQVRJT04gICAgMgorCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BX1NUQU1JTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1JYX0FOVEVOTkFfU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1JYX0FOVEVOTkFfU1RBTUFYICAgIDIKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1JYX0FOVEVOTkFfU1RBREVGICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfVFhfUE9XRVJfTEVWRUxfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMX1NUQU1BWCAgICAxMjgKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMX1NUQURFRiAgICAyNworCisKKworI2RlZmluZSBXTklfQ0ZHX05FV19CU1NfRk9VTkRfSU5EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTkVXX0JTU19GT1VORF9JTkRfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19ORVdfQlNTX0ZPVU5EX0lORF9TVEFERUYgICAgMAorCisKKyNkZWZpbmUgV05JX0NGR19QUk9QUklFVEFSWV9SQVRFU19FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST1BSSUVUQVJZX1JBVEVTX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHXzExSF9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfMTFIX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR18xMUhfRU5BQkxFRF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfU1RBTUlOICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfU1RBTUFYICAgIDMwMDAKKyNkZWZpbmUgV05JX0NGR19XVF9DTkZfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPWElNSVRZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPWElNSVRZX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFJPWElNSVRZX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9YSU1JVFlfT0ZGICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9YSU1JVFlfT04gICAgMQorCisjZGVmaW5lIFdOSV9DRkdfTE9HX0xFVkVMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTE9HX0xFVkVMX1NUQU1BWCAgICA3CisjZGVmaW5lIFdOSV9DRkdfTE9HX0xFVkVMX1NUQURFRiAgICA0CisKKyNkZWZpbmUgV05JX0NGR19PTEJDX0RFVEVDVF9USU1FT1VUX1NUQU1JTiAgICAxMDAwCisjZGVmaW5lIFdOSV9DRkdfT0xCQ19ERVRFQ1RfVElNRU9VVF9TVEFNQVggICAgMzAwMDAKKyNkZWZpbmUgV05JX0NGR19PTEJDX0RFVEVDVF9USU1FT1VUX1NUQURFRiAgICAxMDAwMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9TVEFERUYgICAgNjU1MzUKKworI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9GUk9NX2xsQSAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX0ZST01fbGxCICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfRlJPTV9sbEcgICAgMgorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9IVF8yMCAgICAzCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX05PTl9HRiAgICA0CisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX0xTSUdfVFhPUCAgICA1CisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX1JJRlMgICAgNgorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PQlNTICAgIDcKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0xCQ19GUk9NX2xsQSAgICA4CisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09MQkNfRlJPTV9sbEIgICAgOQorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX0ZST01fbGxHICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09MQkNfSFQyMCAgICAxMQorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX05PTl9HRiAgICAxMgorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX0xTSUdfVFhPUCAgICAxMworI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX1JJRlMgICAgMTQKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0xCQ19PQlNTICAgIDE1CisKKyNkZWZpbmUgV05JX0NGR18xMUdfUFJPVEVDVElPTl9BTFdBWVNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR18xMUdfUFJPVEVDVElPTl9BTFdBWVNfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR18xMUdfUFJPVEVDVElPTl9BTFdBWVNfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fU1RBTUFYICAgIDUKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9TVEFERUYgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fRElTQUJMRSAgICAwCisjZGVmaW5lIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fQ1RTICAgIDEKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9SVFMgICAgMgorI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0RVQUxfQ1RTICAgIDMKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9SVFNfQUxXQVlTICAgIDQKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9BVVRPICAgIDUKKworI2RlZmluZSBXTklfQ0ZHXzExR19TSE9SVF9QUkVBTUJMRV9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfMTFHX1NIT1JUX1BSRUFNQkxFX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVEX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVEX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR18xMUdfT05MWV9QT0xJQ1lfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR18xMUdfT05MWV9QT0xJQ1lfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR18xMUdfT05MWV9QT0xJQ1lfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUEFDS0VUX0NMQVNTSUZJQ0FUSU9OX0RJU0FCTEVEICAgIDAKKyNkZWZpbmUgV05JX0NGR19QQUNLRVRfQ0xBU1NJRklDQVRJT05fRFNDUCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUEFDS0VUX0NMQVNTSUZJQ0FUSU9OXzgwMjFQICAgIDIKKyNkZWZpbmUgV05JX0NGR19QQUNLRVRfQ0xBU1NJRklDQVRJT05fQUxMICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX1dNRV9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV01FX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19XTUVfRU5BQkxFRF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfQUREVFNfUlNQX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BRERUU19SU1BfVElNRU9VVF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19BRERUU19SU1BfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX1NQX0xFTkdUSF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9TUF9MRU5HVEhfU1RBTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19NQVhfU1BfTEVOR1RIX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19TRU5EX1NJTkdMRV9TU0lEX0FMV0FZU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NFTkRfU0lOR0xFX1NTSURfQUxXQVlTX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0VORF9TSU5HTEVfU1NJRF9BTFdBWVNfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dTTV9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1NNX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19XU01fRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9BTkkgICAgMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9XTU0gICAgMQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9USVRfREVNTyAgICAyCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX01BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0FDTV9JRFggICAgMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9BSUZTTl9JRFggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01JTkFfSURYICAgIDIKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNQVhBX0lEWCAgICA0CisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX1RYT1BBX0lEWCAgICA2CisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUlOQl9JRFggICAgNworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01BWEJfSURYICAgIDkKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfVFhPUEJfSURYICAgIDExCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUlOR19JRFggICAgMTIKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNQVhHX0lEWCAgICAxNAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9UWE9QR19JRFggICAgMTYKKworI2RlZmluZSBXTklfQ0ZHX1JERVRfRkxBR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JERVRfRkxBR19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1JERVRfRkxBR19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUkRFVF9GTEFHX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfUkRFVF9GTEFHX0RJU0FCTEUgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlRfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlRfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9TVEFNQVggICAgMgorI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfUE9MSUNZX0FETUlUX0FMTCAgICAwCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfUE9MSUNZX1JFSkVDVF9BTEwgICAgMQorI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9CV19GQUNUT1IgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfQldGQUNUT1JfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BRE1JVF9CV0ZBQ1RPUl9TVEFNQVggICAgMTAwCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfQldGQUNUT1JfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkVfU1RBTUFYICAgIDI1NgorI2RlZmluZSBXTklfQ0ZHX01BWF9DT05TRUNVVElWRV9CQUNLR1JPVU5EX1NDQU5fRkFJTFVSRV9TVEFERUYgICAgNjAKKworI2RlZmluZSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfU1RBTUFYICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEUgICAgMAorI2RlZmluZSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfSUZfTk9fTEVHQUNZX0JTUyAgICAyCisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfSUZfTk9fTEVHQUNZX0FMTCAgICAzCisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfSU5URUxMSUdFTlQgICAgNAorCisjZGVmaW5lIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9TVEFNQVggICAgMTAKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfTk9ORSAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfTE9XRVIgICAgMQorI2RlZmluZSBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFX0hJR0hFUiAgICAyCisjZGVmaW5lIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfMTFBQ18yME1IWl9MT1dfNDBNSFpfQ0VOVEVSRUQgICAgMworI2RlZmluZSBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFXzExQUNfMjBNSFpfQ0VOVEVSRURfNDBNSFpfQ0VOVEVSRUQgICAgNAorI2RlZmluZSBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFXzExQUNfMjBNSFpfSElHSF80ME1IWl9DRU5URVJFRCAgICA1CisjZGVmaW5lIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfMTFBQ18yME1IWl9MT1dfNDBNSFpfTE9XICAgIDYKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV8xMUFDXzIwTUhaX0hJR0hfNDBNSFpfTE9XICAgIDcKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV8xMUFDXzIwTUhaX0xPV180ME1IWl9ISUdIICAgIDgKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV8xMUFDXzIwTUhaX0hJR0hfNDBNSFpfSElHSCAgICA5CisKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfWkVST19TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfWkVST19TVEFERUYgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9PTkVfU1RBREVGICAgIDQKKworI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1RXT19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1RXT19TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfVFdPX1NUQURFRiAgICA2CisKKyNkZWZpbmUgV05JX0NGR19UUklHX1NUQV9CS19TQ0FOX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTl9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU5fU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfUFJPRklMRV9TV0lUQ0hJTkdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HX1NUQURFRiAgICAyNTUKKworI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfUFJPRklMRV9TV0lUQ0hJTkdfVU5VU0VEICAgIDI1NQorCisjZGVmaW5lIFdOSV9DRkdfTUlNT19FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUlNT19FTkFCTEVEX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfTUlNT19FTkFCTEVEX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19NSU1PX0VOQUJMRURfRU5BQkxFICAgIDEKKyNkZWZpbmUgV05JX0NGR19NSU1PX0VOQUJMRURfRElTQUJMRSAgICAwCisKKyNkZWZpbmUgV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEX1NUQU1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEX0RFTEFZRUQgICAgMAorI2RlZmluZSBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEX0lNTUVESUFURSAgICAxCisKKyNkZWZpbmUgV05JX0NGR19IVF9SWF9TVEJDX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfUlhfU1RCQ19TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX0hUX1JYX1NUQkNfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fU1RBREVGICAgIDM2NAorCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fQURWQU5DRV9DT0RJTkcgICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NVUFBPUlRFRF9DSEFOX1dJRFRIX1NFVCAgICAxCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fU01fUE9XRVJfU0FWRSAgICAyCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fR1JFRU5fRklFTEQgICAgNAorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NIT1JUX0dJXzIwTUhaICAgIDUKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19TSE9SVF9HSV80ME1IWiAgICA2CisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fVFhfU1RCQyAgICA3CisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fUlhfU1RCQyAgICA4CisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fREVMQVlFRF9CQSAgICAxMAorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX01BWF9BTVNEVV9TSVpFICAgIDExCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fRFNTU19DQ0tfTU9ERV80ME1IWiAgICAxMgorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1BTTVAgICAgMTMKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19TVEJDX0NPTlRST0xfRlJBTUUgICAgMTQKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19MU0lHX1RYT1BfUFJPVEVDVElPTiAgICAxNQorCisjZGVmaW5lIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19IVF9BTVBEVV9QQVJBTVNfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNU19NQVhfUlhfQU1QRFVfRkFDVE9SICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9BTVBEVV9QQVJBTVNfTVBEVV9ERU5TSVRZICAgIDIKKyNkZWZpbmUgV05JX0NGR19IVF9BTVBEVV9QQVJBTVNfUkVTRVJWRUQgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19TVEFERUYgICAgMTAyNAorCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1BDTyAgICAwCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1RSQU5TSVRJT05fVElNRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1JFU0VSVkVEMSAgICAzCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX01DU19GRUVEQkFDSyAgICA4CisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX0hUQ19TVVBQT1JUICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1JEX1JFU1BPTkRFUiAgICAxMQorI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19SRVNFUlZFRDIgICAgMTIKKworI2RlZmluZSBXTklfQ0ZHX1RYX0JGX0NBUF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1RYX0JGX0NBUF9TVEFNQVggICAgNDI5NDk2NzI5NQorI2RlZmluZSBXTklfQ0ZHX1RYX0JGX0NBUF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19BU19DQVBfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9BTlRFTk5BX1NFTEVDVElPTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX0VYUExJQ0lUX0NTSV9GRUVEQkFDS19UWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX0FOVEVOTkFfSU5ESUNFU19GRUVEQkFDS19UWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX0VYUExJQ0lUX0NTSV9GRUVEQkFDSyAgICAzCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX0FOVEVOTkFfSU5ESUNFU19GRUVEQkFDSyAgICA0CisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX1JYX0FTICAgIDUKKyNkZWZpbmUgV05JX0NGR19BU19DQVBfVFhfU09VTkRJTkdfUFBEVVMgICAgNgorI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9SRVNFUlZFRCAgICA3CisKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQxX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9TVEFERUYgICAgMTUKKworI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQxX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVCAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDFfUkVDT01NRU5ERURfQ0hBTk5FTF9XSURUSCAgICAyCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDFfUklGU19NT0RFICAgIDMKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9QU01QX0FDQ0VTU19PTkxZICAgIDQKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9TRVJWSUNFX0lOVEVSVkFMX0dSQU5VTEFSSVRZICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQyX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDJfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDJfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQyX09QX01PREUgICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQyX05PTl9HRl9ERVZJQ0VTX1BSRVNFTlQgICAgMgorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQyX1JFU0VSVkVEICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX0JBU0lDX1NUQkNfTUNTICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEM19EVUFMX1NUQkNfUFJPVEVDVElPTiAgICA3CisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfU0VDT05EQVJZX0JFQUNPTiAgICA4CisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfTFNJR19UWE9QX1BST1RFQ1RJT05fRlVMTF9TVVBQT1JUICAgIDkKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEM19QQ09fQUNUSVZFICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfUENPX1BIQVNFICAgIDExCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfUkVTRVJWRUQgICAgMTIKKworI2RlZmluZSBXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZX0RJU0FCTEUgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVkhUX01BWF9NUERVX0xFTkdUSF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9NQVhfTVBEVV9MRU5HVEhfU1RBTUFYICAgIDIKKyNkZWZpbmUgV05JX0NGR19WSFRfTUFYX01QRFVfTEVOR1RIX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19WSFRfU1VQUE9SVEVEX0NIQU5fV0lEVEhfU0VUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX1NVUFBPUlRFRF9DSEFOX1dJRFRIX1NFVF9TVEFNQVggICAgMgorI2RlZmluZSBXTklfQ0ZHX1ZIVF9TVVBQT1JURURfQ0hBTl9XSURUSF9TRVRfU1RBREVGICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9MRFBDX0NPRElOR19DQVBfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfTERQQ19DT0RJTkdfQ0FQX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfVkhUX0xEUENfQ09ESU5HX0NBUF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVkhUX1NIT1JUX0dJXzgwTUhaX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX1NIT1JUX0dJXzgwTUhaX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfVkhUX1NIT1JUX0dJXzgwTUhaX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19WSFRfU0hPUlRfR0lfMTYwX0FORF84MF9QTFVTXzgwTUhaX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX1NIT1JUX0dJXzE2MF9BTkRfODBfUExVU184ME1IWl9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1ZIVF9TSE9SVF9HSV8xNjBfQU5EXzgwX1BMVVNfODBNSFpfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9UWFNUQkNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfVFhTVEJDX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfVkhUX1RYU1RCQ19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVkhUX1JYU1RCQ19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9SWFNUQkNfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19WSFRfUlhTVEJDX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19WSFRfU1VfQkVBTUZPUk1FUl9DQVBfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfU1VfQkVBTUZPUk1FUl9DQVBfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19WSFRfU1VfQkVBTUZPUk1FUl9DQVBfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVFX0NBUF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVFX0NBUF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVFX0NBUF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVkhUX0NTTl9CRUFNRk9STUVFX0FOVF9TVVBQT1JURURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfQ1NOX0JFQU1GT1JNRUVfQU5UX1NVUFBPUlRFRF9TVEFNQVggICAgNAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19WSFRfTlVNX1NPVU5ESU5HX0RJTUVOU0lPTlNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfTlVNX1NPVU5ESU5HX0RJTUVOU0lPTlNfU1RBTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19WSFRfTlVNX1NPVU5ESU5HX0RJTUVOU0lPTlNfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9NVV9CRUFNRk9STUVSX0NBUF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9NVV9CRUFNRk9STUVSX0NBUF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1ZIVF9NVV9CRUFNRk9STUVSX0NBUF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRUVfQ0FQX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRUVfQ0FQX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRUVfQ0FQX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19WSFRfVFhPUF9QU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9UWE9QX1BTX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfVkhUX1RYT1BfUFNfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9IVENfVkhUQ19DQVBfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfSFRDX1ZIVENfQ0FQX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfVkhUX0hUQ19WSFRDX0NBUF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVkhUX0FNUERVX0xFTl9FWFBPTkVOVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9BTVBEVV9MRU5fRVhQT05FTlRfU1RBTUFYICAgIDcKKyNkZWZpbmUgV05JX0NGR19WSFRfQU1QRFVfTEVOX0VYUE9ORU5UX1NUQURFRiAgICAzCisKKyNkZWZpbmUgV05JX0NGR19WSFRfTElOS19BREFQVEFUSU9OX0NBUF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9MSU5LX0FEQVBUQVRJT05fQ0FQX1NUQU1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfVkhUX0xJTktfQURBUFRBVElPTl9DQVBfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9SWF9BTlRfUEFUVEVSTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9SWF9BTlRfUEFUVEVSTl9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1ZIVF9SWF9BTlRfUEFUVEVSTl9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfVkhUX1RYX0FOVF9QQVRURVJOX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX1RYX0FOVF9QQVRURVJOX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfVkhUX1RYX0FOVF9QQVRURVJOX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19WSFRfUlhfTUNTX01BUF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9SWF9NQ1NfTUFQX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1ZIVF9SWF9NQ1NfTUFQX1NUQURFRiAgICA2NTUzNAorCisjZGVmaW5lIFdOSV9DRkdfVkhUX1RYX01DU19NQVBfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfVFhfTUNTX01BUF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19WSFRfVFhfTUNTX01BUF9TVEFERUYgICAgNjU1MzQKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9SWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfUlhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFX1NUQU1BWCAgICA3ODAKKyNkZWZpbmUgV05JX0NGR19WSFRfUlhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFX1NUQURFRiAgICA3ODAKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9UWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfVFhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFX1NUQU1BWCAgICA3ODAKKyNkZWZpbmUgV05JX0NGR19WSFRfVFhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFX1NUQURFRiAgICA3ODAKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9DSEFOTkVMX0NFTlRFUl9GUkVRX1NFR01FTlQxX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX0NIQU5ORUxfQ0VOVEVSX0ZSRVFfU0VHTUVOVDFfU1RBTUFYICAgIDI1NgorI2RlZmluZSBXTklfQ0ZHX1ZIVF9DSEFOTkVMX0NFTlRFUl9GUkVRX1NFR01FTlQxX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19WSFRfQ0hBTk5FTF9DRU5URVJfRlJFUV9TRUdNRU5UMl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9DSEFOTkVMX0NFTlRFUl9GUkVRX1NFR01FTlQyX1NUQU1BWCAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX0NIQU5ORUxfQ0VOVEVSX0ZSRVFfU0VHTUVOVDJfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9CQVNJQ19NQ1NfU0VUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX0JBU0lDX01DU19TRVRfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfVkhUX0JBU0lDX01DU19TRVRfU1RBREVGICAgIDY1NTM0CisKKyNkZWZpbmUgV05JX0NGR19WSFRfTVVfTUlNT19DQVBfU1RBX0NPVU5UX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX01VX01JTU9fQ0FQX1NUQV9DT1VOVF9TVEFNQVggICAgNAorI2RlZmluZSBXTklfQ0ZHX1ZIVF9NVV9NSU1PX0NBUF9TVEFfQ09VTlRfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF9TU19VTkRFUl9VVElMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX1NTX1VOREVSX1VUSUxfU1RBTUFYICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfU1NfVU5ERVJfVVRJTF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVkhUXzQwTUhaX1VUSUxJWkFUSU9OX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUXzQwTUhaX1VUSUxJWkFUSU9OX1NUQU1BWCAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUXzQwTUhaX1VUSUxJWkFUSU9OX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19WSFRfODBNSFpfVVRJTElaQVRJT05fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfODBNSFpfVVRJTElaQVRJT05fU1RBTUFYICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfODBNSFpfVVRJTElaQVRJT05fU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1ZIVF8xNjBNSFpfVVRJTElaQVRJT05fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19WSFRfMTYwTUhaX1VUSUxJWkFUSU9OX1NUQU1BWCAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUXzE2ME1IWl9VVElMSVpBVElPTl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9BTVNEVV9MRU5HVEhfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19NQVhfQU1TRFVfTEVOR1RIX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19NQVhfQU1TRFVfTEVOR1RIX1NIT1JUXzM4MzlfQllURVMgICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9BTVNEVV9MRU5HVEhfTE9OR183OTM1X19CWVRFUyAgICAxCisKKyNkZWZpbmUgV05JX0NGR19NUERVX0RFTlNJVFlfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NUERVX0RFTlNJVFlfU1RBTUFYICAgIDcKKyNkZWZpbmUgV05JX0NGR19NUERVX0RFTlNJVFlfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX05VTV9CVUZGX0FEVkVSVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX05VTV9CVUZGX0FEVkVSVF9TVEFNQVggICAgMTI4CisjZGVmaW5lIFdOSV9DRkdfTlVNX0JVRkZfQURWRVJUX1NUQURFRiAgICA2NAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfU1RBTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SX1NUQURFRiAgICAzCisKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV8yME1IWl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfRElTQUJMRSAgICAwCisKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV80ME1IWl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfRElTQUJMRSAgICAwCisKKyNkZWZpbmUgV05JX0NGR19SSUZTX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SSUZTX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19SSUZTX0VOQUJMRURfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1JJRlNfRU5BQkxFRF9FTkFCTEUgICAgMQorI2RlZmluZSBXTklfQ0ZHX1JJRlNfRU5BQkxFRF9ESVNBQkxFICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX01BWF9QU19QT0xMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX1BTX1BPTExfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX01BWF9QU19QT0xMX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0VfU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0VfU1RBTUFYICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFX1NUQURFRiAgICAyMAorCisjZGVmaW5lIFdOSV9DRkdfUlNTSV9GSUxURVJfUEVSSU9EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlNTSV9GSUxURVJfUEVSSU9EX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19SU1NJX0ZJTFRFUl9QRVJJT0RfU1RBREVGICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX01JTl9SU1NJX1RIUkVTSE9MRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01JTl9SU1NJX1RIUkVTSE9MRF9TVEFNQVggICAgMTAKKyNkZWZpbmUgV05JX0NGR19NSU5fUlNTSV9USFJFU0hPTERfU1RBREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19CUk9BRENBU1RfRlJBTUVfRklMVEVSX0VOQUJMRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JST0FEQ0FTVF9GUkFNRV9GSUxURVJfRU5BQkxFX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQlJPQURDQVNUX0ZSQU1FX0ZJTFRFUl9FTkFCTEVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfSUdOT1JFX0RUSU1fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19JR05PUkVfRFRJTV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0lHTk9SRV9EVElNX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fVUNBU1RfUEFUVEVSTl9GSUxURVJfRU5BQkxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX1VDQVNUX1BBVFRFUk5fRklMVEVSX0VOQUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9VQ0FTVF9QQVRURVJOX0ZJTFRFUl9FTkFCTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9DSEFOTkVMX1NXSVRDSF9FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fQ0hBTk5FTF9TV0lUQ0hfRU5BQkxFX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX0NIQU5ORUxfU1dJVENIX0VOQUJMRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX0RFQVVUSF9FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fREVBVVRIX0VOQUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9ERUFVVEhfRU5BQkxFX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fRElTQVNTT0NfRU5BQkxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX0RJU0FTU09DX0VOQUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9ESVNBU1NPQ19FTkFCTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTl9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fTUFYX01JU1NFRF9CRUFDT05fU1RBREVGICAgIDQwCisKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fTUFYX1NMRUVQX1BFUklPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9NQVhfU0xFRVBfUEVSSU9EX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9NQVhfU0xFRVBfUEVSSU9EX1NUQURFRiAgICA2NTUzNQorCisjZGVmaW5lIFdOSV9DRkdfTUFYX01FRElVTV9USU1FX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX01FRElVTV9USU1FX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFERUYgICAgMjA0OAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX01QRFVTX0lOX0FNUERVX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX01QRFVTX0lOX0FNUERVX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVV9TVEFERUYgICAgNjQKKworI2RlZmluZSBXTklfQ0ZHX0lCU1NfQVVUT19CU1NJRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0lCU1NfQVVUT19CU1NJRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0lCU1NfQVVUT19CU1NJRF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9GTEFHX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9GTEFHX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9GTEFHX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0ZMQUdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0ZMQUdfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0ZMQUdfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBR19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBR19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9GTEFHX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9GTEFHX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9GTEFHX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBR19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0ZMQUdfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dQU19FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfRU5BQkxFX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19XUFNfRU5BQkxFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XUFNfRU5BQkxFX0FQICAgIDEKKyNkZWZpbmUgV05JX0NGR19XUFNfRU5BQkxFX1NUQSAgICAyCisKKyNkZWZpbmUgV05JX0NGR19XUFNfU1RBVEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfU1RBVEVfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1dQU19TVEFURV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfV1BTX1BST0JFX1JFUV9GTEFHX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX1BST0JFX1JFUV9GTEFHX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfV1BTX1BST0JFX1JFUV9GTEFHX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XUFNfVkVSU0lPTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19WRVJTSU9OX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19XUFNfVkVSU0lPTl9TVEFERUYgICAgMTYKKworI2RlZmluZSBXTklfQ0ZHX1dQU19SRVFVRVNUX1RZUEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfUkVRVUVTVF9UWVBFX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19XUFNfUkVRVUVTVF9UWVBFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XUFNfQ0ZHX01FVEhPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19DRkdfTUVUSE9EX1NUQU1BWCAgICA0Mjk0OTY3Mjk1CisjZGVmaW5lIFdOSV9DRkdfV1BTX0NGR19NRVRIT0RfU1RBREVGICAgIDgKKworI2RlZmluZSBXTklfQ0ZHX1dQU19QUklNQVJZX0RFVklDRV9DQVRFR09SWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19QUklNQVJZX0RFVklDRV9DQVRFR09SWV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJJTUFSWV9ERVZJQ0VfQ0FURUdPUllfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dQU19QSU1BUllfREVWSUNFX09VSV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19QSU1BUllfREVWSUNFX09VSV9TVEFNQVggICAgNDI5NDk2NzI5NQorI2RlZmluZSBXTklfQ0ZHX1dQU19QSU1BUllfREVWSUNFX09VSV9TVEFERUYgICAgNTMwNDgzNgorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0RFVklDRV9TVUJfQ0FURUdPUllfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1NVQl9DQVRFR09SWV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1NVQl9DQVRFR09SWV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0FTU09DSUFUSU9OX1NUQVRFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX0FTU09DSUFUSU9OX1NUQVRFX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ0lBVElPTl9TVEFURV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1JfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfQ09ORklHVVJBVElPTl9FUlJPUl9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XUFNfQ09ORklHVVJBVElPTl9FUlJPUl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0RFVklDRV9QQVNTV09SRF9JRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19ERVZJQ0VfUEFTU1dPUkRfSURfU1RBTUFYICAgIDQyOTQ5NjcyOTUKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XUFNfQVNTT0NfTUVUSE9EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX0FTU09DX01FVEhPRF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XUFNfQVNTT0NfTUVUSE9EX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19MT1dfR0FJTl9PVkVSUklERV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfTE9XX0dBSU5fT1ZFUlJJREVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9QSFlfQUdDX0xJU1RFTl9NT0RFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX1BIWV9BR0NfTElTVEVOX01PREVfU1RBTUFYICAgIDEyOAorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9QSFlfQUdDX0xJU1RFTl9NT0RFX1NUQURFRiAgICAxMjgKKworI2RlZmluZSBXTklfQ0ZHX1JQRV9QT0xMSU5HX1RIUkVTSE9MRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JQRV9QT0xMSU5HX1RIUkVTSE9MRF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SUEVfUE9MTElOR19USFJFU0hPTERfU1RBREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzBfUkVHX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMwX1JFR19TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzBfUkVHX1NUQURFRiAgICAzMAorCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMxX1JFR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUdfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMxX1JFR19TVEFERUYgICAgMzAKKworI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMl9SRUdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzJfUkVHX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMl9SRUdfU1RBREVGICAgIDMwCisKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzNfUkVHX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMzX1JFR19TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzNfUkVHX1NUQURFRiAgICAzMAorCisjZGVmaW5lIFdOSV9DRkdfTk9fT0ZfT05DSElQX1JFT1JERVJfU0VTU0lPTlNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19OT19PRl9PTkNISVBfUkVPUkRFUl9TRVNTSU9OU19TVEFNQVggICAgMgorI2RlZmluZSBXTklfQ0ZHX05PX09GX09OQ0hJUF9SRU9SREVSX1NFU1NJT05TX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19TSU5HTEVfVElEX1JDX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0lOR0xFX1RJRF9SQ19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1NJTkdMRV9USURfUkNfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1JSTV9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlJNX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19SUk1fRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUlJNX09QRVJBVElOR19DSEFOX01BWF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfU1RBTUFYICAgIDgKKyNkZWZpbmUgV05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX1NUQU1BWCAgICA4CisjZGVmaW5lIFdOSV9DRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1RYX1BXUl9DVFJMX0VOQUJMRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1RYX1BXUl9DVFJMX0VOQUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1RYX1BXUl9DVFJMX0VOQUJMRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElOR19TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX01DQVNUX0JDQVNUX0ZJTFRFUl9TRVRUSU5HX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19CVENfREhDUF9CVF9TTE9UU19UT19CTE9DS19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JUQ19ESENQX0JUX1NMT1RTX1RPX0JMT0NLX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19CVENfREhDUF9CVF9TTE9UU19UT19CTE9DS19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BTX1BPTExfVkFMVUVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BTX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BTX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVF9TVEFNQVggICAgODAKKyNkZWZpbmUgV05JX0NGR19QU19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTl9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9TVEFNQVggICAgNworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX1NUQURFRiAgICAzCisKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlNfU1RBTUlOICAgIDUKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlNfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0lETEVfQkNOU19TVEFERUYgICAgMTAKKworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9TVEFNQVggICAgNworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9TVEFERUYgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJX0lETEVfQkNOU19TVEFNSU4gICAgNQorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlNfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlNfU1RBREVGICAgIDE1CisKKyNkZWZpbmUgV05JX0NGR19CVENfQTJEUF9ESENQX0JUX1NVQl9JTlRFUlZBTFNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19CVENfQTJEUF9ESENQX0JUX1NVQl9JTlRFUlZBTFNfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0JUQ19BMkRQX0RIQ1BfQlRfU1VCX0lOVEVSVkFMU19TVEFERUYgICAgNworCisjZGVmaW5lIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EX1NUQU1BWCAgICAxMDAwCisjZGVmaW5lIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BU1NPQ19TVEFfTElNSVRfU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19BU1NPQ19TVEFfTElNSVRfU1RBTUFYICAgIDMyCisjZGVmaW5lIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQURFRiAgICAxMAorCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX1NUQVJUX0NIQU5ORUxfU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9TVEFNQVggICAgMjUyCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX1NUQVJUX0NIQU5ORUxfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTF9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTF9TVEFNQVggICAgMjUyCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX0VORF9DSEFOTkVMX1NUQURFRiAgICAxMQorCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5EX1NUQU1BWCAgICA1CisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5EX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX1NUQURFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfQ0xPU0VfTE9PUF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX0NMT1NFX0xPT1BfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQVBfS0VFUF9BTElWRV9USU1FT1VUX1NUQU1JTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfQVBfS0VFUF9BTElWRV9USU1FT1VUX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FQX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFERUYgICAgMjAKKworI2RlZmluZSBXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19HT19LRUVQX0FMSVZFX1RJTUVPVVRfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfTUNfQUREUl9MSVNUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX01DX0FERFJfTElTVF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9NQ19BRERSX0xJU1RfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9VQ19GSUxURVJfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfVUNfRklMVEVSX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX1VDX0ZJTFRFUl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX0xQV1JfSU1HX1RSQU5TSVRJT05fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfTFBXUl9JTUdfVFJBTlNJVElPTl9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfTUNDX0FEQVBUSVZFX1NDSEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX01DQ19BREFQVElWRV9TQ0hFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9NQ0NfQURBUFRJVkVfU0NIRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0RJU0FCTEVfTERQQ19XSVRIX1RYQkZfQVBfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19ESVNBQkxFX0xEUENfV0lUSF9UWEJGX0FQX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfRElTQUJMRV9MRFBDX1dJVEhfVFhCRl9BUF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQVBfTElOS19NT05JVE9SX1RJTUVPVVRfU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19BUF9MSU5LX01PTklUT1JfVElNRU9VVF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfQVBfTElOS19NT05JVE9SX1RJTUVPVVRfU1RBREVGICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX1RETFNfUU9TX1dNTV9VQVBTRF9NQVNLX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVERMU19RT1NfV01NX1VBUFNEX01BU0tfU1RBTUFYICAgIDE1CisjZGVmaW5lIFdOSV9DRkdfVERMU19RT1NfV01NX1VBUFNEX01BU0tfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1RETFNfQlVGX1NUQV9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVERMU19CVUZfU1RBX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19URExTX0JVRl9TVEFfRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVERMU19QVUFQU0RfSU5BQ1RfVElNRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1RETFNfUFVBUFNEX0lOQUNUX1RJTUVfU1RBTUFYICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfVERMU19QVUFQU0RfSU5BQ1RfVElNRV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVERMU19SWF9GUkFNRV9USFJFU0hPTERfU1RBTUlOICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfVERMU19SWF9GUkFNRV9USFJFU0hPTERfU1RBTUFYICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfVERMU19SWF9GUkFNRV9USFJFU0hPTERfU1RBREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19QTUZfU0FfUVVFUllfTUFYX1JFVFJJRVNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QTUZfU0FfUVVFUllfTUFYX1JFVFJJRVNfU1RBTUFYICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfUE1GX1NBX1FVRVJZX01BWF9SRVRSSUVTX1NUQURFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19QTUZfU0FfUVVFUllfUkVUUllfSU5URVJWQUxfU1RBTUlOICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfUE1GX1NBX1FVRVJZX1JFVFJZX0lOVEVSVkFMX1NUQU1BWCAgICAyMDAwCisjZGVmaW5lIFdOSV9DRkdfUE1GX1NBX1FVRVJZX1JFVFJZX0lOVEVSVkFMX1NUQURFRiAgICAyMDAKKworI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTl9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTl9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfRkxFWF9DT05ORUNUX1BPV0VSX0ZBQ1RPUl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZMRVhfQ09OTkVDVF9QT1dFUl9GQUNUT1JfU1RBTUFYICAgIDkKKyNkZWZpbmUgV05JX0NGR19GTEVYX0NPTk5FQ1RfUE9XRVJfRkFDVE9SX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BTlRFTk5BX0RJVkVTSVRZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQU5URU5OQV9ESVZFU0lUWV9TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX0FOVEVOTkFfRElWRVNJVFlfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0dPX0xJTktfTU9OSVRPUl9USU1FT1VUX1NUQU1JTiAgICAzCisjZGVmaW5lIFdOSV9DRkdfR09fTElOS19NT05JVE9SX1RJTUVPVVRfU1RBTUFYICAgIDUwCisjZGVmaW5lIFdOSV9DRkdfR09fTElOS19NT05JVE9SX1RJTUVPVVRfU1RBREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19STUNfQUNUSU9OX1BFUklPRF9GUkVRVUVOQ1lfU1RBTUlOICAgIDEwMAorI2RlZmluZSBXTklfQ0ZHX1JNQ19BQ1RJT05fUEVSSU9EX0ZSRVFVRU5DWV9TVEFNQVggICAgMTAwMAorI2RlZmluZSBXTklfQ0ZHX1JNQ19BQ1RJT05fUEVSSU9EX0ZSRVFVRU5DWV9TVEFERUYgICAgMzAwCisKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1JTU0lfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1JTU0lfU1RBTUFYICAgIDEyNworI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfUlNTSV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUlRUM19FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SVFQzX0VOQUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1JUVDNfRU5BQkxFX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19ERUJVR19QMlBfUkVNQUlOX09OX0NIQU5ORUxfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19ERUJVR19QMlBfUkVNQUlOX09OX0NIQU5ORUxfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19ERUJVR19QMlBfUkVNQUlOX09OX0NIQU5ORUxfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1RETFNfT0ZGX0NIQU5ORUxfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1RETFNfT0ZGX0NIQU5ORUxfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1RETFNfT0ZGX0NIQU5ORUxfRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfSUJTU19BVElNX1dJTl9TSVpFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSUJTU19BVElNX1dJTl9TSVpFX1NUQU1BWCAgICAxMDAKKyNkZWZpbmUgV05JX0NGR19JQlNTX0FUSU1fV0lOX1NJWkVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0RGU19NQVNURVJfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RGU19NQVNURVJfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0RGU19NQVNURVJfRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVkhUX0VOQUJMRV9UWEJGXzIwTUhaX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVkhUX0VOQUJMRV9UWEJGXzIwTUhaX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfVkhUX0VOQUJMRV9UWEJGXzIwTUhaX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19URExTX1dNTV9NT0RFX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19URExTX1dNTV9NT0RFX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19URExTX1dNTV9NT0RFX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBDRkdfUEFSQU1fTUFYX05VTSAgICAgICAgMjg5CisjZGVmaW5lIENGR19TVEFfSUJVRl9NQVhfU0laRSAgICAyMzcKKyNkZWZpbmUgQ0ZHX1NUQV9TQlVGX01BWF9TSVpFICAgIDMxOTkKKworI2RlZmluZSBDRkdfU1RBX01BR0lDX0RXT1JEICAgIDB4YmVlZmJlZWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvY2ZnL2NmZ1V0aWwvY2ZnLnR4dCBiL2NvcmUvbWFjL3NyYy9jZmcvY2ZnVXRpbC9jZmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDcxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvY2ZnL2NmZ1V0aWwvY2ZnLnR4dApAQCAtMCwwICsxLDQ0NzQgQEAKKyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyoKKyoKKyogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisqIGNvcGllcy4KKyoKKyogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisKKyoKKyogVGhpcyBpcyB0aGUgZGF0YSBkZWZpbml0aW9uIGZpbGUgZm9yIHRoZSBDRkcgbW9kdWxlLgorKiBBdXRob3I6ICAgICAgICAgS2V2aW4gTmd1eWVuCisqIERhdGU6ICAgICAgICAgICAwMy8xOC8wMgorKiBIaXN0b3J5Oi0KKyogMDMvMTgvMDIgICAgICAgIENyZWF0ZWQuCisqIDA4LzEwLzA1ICB3dzogYWRkIG1hb2UgY2hhbm5lbHMgdG8gaGF2ZSBhIGNvbXBsZXRlIGNoYW5uZWwgbGlzdGluZzogKHNlZSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCkKKyogMDgvMTAvMDUgd3c6IFdOSV9DRkdfU0NBTl9DT05UUk9MX0xJU1QgaGFzIGEgbmV3IGNvbnRlbnRzCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbnMgb2YgYWxsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworKiBmb3IgYm90aCBTVEEgYW5kIEFQLgorKgorKiBPVVRQVVQ6CisqIC0tLS0tLS0KKyogVGhlIG91dHB1dCBmaWxlcyBhcmU6CisqICAgIHduaUNmZ1N0YS5oICAgICAtIEMgaGVhZGVyIGZpbGUgZm9yIFNUQSBtb2RlIG9ubHkKKyogICAgd25pQ2ZnQXAuaCAgICAgIC0gQyBoZWFkZXIgZmlsZSBmb3IgYm90aCBTVEEgYW5kIEFQCisqICAgIHduaUNmZ1N0YS5iaW4gICAtIENvbnRyb2wgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciBTVEEgc3lzdGVtCisqICAgIHduaUNmZ0FwLmJpbiAgICAtIENvbnRyb2wgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciBBUCBzeXN0ZW0KKyoKKyogUEFSQU1FVEVSIERFU0NSSVBUSU9OOgorKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIEZvciBlYWNoIHBhcmFtZXRlciwgdGhlIGRlc2NyaXB0aW9uIG11c3QgYmUgb24gc2VwYXJhdGUgbGluZXMgYW5kCisqIGV4YWN0bHkgYXMgc3BlY2lmaWVkIGJlbG93LiAgW10gYXJlIGNvbW1lbnRzIGFuZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkLgorKgorKiAgICAgW0NvbW1vbiBpbmZvXSAgICBwYXJhbWV0ZXJfbmFtZSAgICB0eXBlICAgIG1heExlbiAgICBzZW1JbmR4CisqICAgICBbU1RBIGZsYWdzXSAgICAgIHZhbGlkICAgIFJXICAgIFAvTlAgICAgUkVTVEFSVC9SRUxPQUQKKyogICAgIFtTVEFfTlRGXSAgICAgICAgbm90aWZpY2F0aW9uX21hc2sKKyogICAgIFtTVEEgdmFsdWVzXSAgICAgbWluICAgIG1heCAgICB2YWx1ZSAgW2ZvciBpbnRlZ2VyXQorKiAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggYnl0ZTEgYnl0ZTIgLi4uIFtmb3Igc3RyaW5nXQorKiAgICAgW0FQIGZsYWdzXSAgICAgICB2YWxpZCAgICBSVy9STy9XTyAgICBQL05QICAgIFJFU1RBUlQvUkVMT0FECisqICAgICBbQVBfTlRGXSAgICAgICAgIG5vdGlmaWNhdGlvbl9tYXNrCisqICAgICBbQVAgdmFsdWVzXSAgICAgIG1pbiAgICBtYXggICAgdmFsdWUgIFtmb3IgaW50ZWdlcl0KKyogICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIGJ5dGUxIGJ5dGUyIC4uLiBbZm9yIHN0cmluZ10KKyoKKyogcGFyYW1ldGVyX25hbWU6CisqICAgICAgICAgVGhpcyB3aWxsIGJlIHVzZWQgYXMgdGhlIGJhc2UgbmFtZSBmb3IgQyBtYWNybyBkZWZpbml0aW9uLgorKiAgICAgICAgIFRoZXJlZm9yZSwgQyBzeW50YXggcnVsZSBtdXN0IGJlIG9ic2VydmVkLgorKgorKiB0eXBlOgorKiAgICAgICAgU3BlY2lmaWVzIHBhcmFtZXRlciB0eXBlCisqICAgICAgICAgICAgUyAtIHZhcmlhYmxlLWxlbmd0aCBzdHJpbmcKKyogICAgICAgICAgICBJIC0gaW50ZWdlcgorKgorKiBtYXhMZW46CisqICAgICAgICBTcGVjaWZpZXMgbWF4aW11bSBwYXJhbWV0ZXIgbGVuZ3RoIGluIGJ5dGVzLgorKgorKiBzZW1JbmR4OgorKiAgICAgICAgU3BlY2lmaWVzIHNlbWFwaG9yZSBpbmRleCB0byB1c2UgZm9yIGxvY2tpbmcgdGhpcyBwYXJhbWV0ZXIuCisqICAgICAgICBNb3JlIHRoYW4gb25lIHBhcmFtZXRlcnMgKHRob3NlIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBncm91cCkKKyogICAgICAgIGNhbiBzaGFyZSB0aGUgc2FtZSBzZW1hcGhvcmUgaW5kZXguCisqCisqIHZhbGlkOgorKiAgICAgICAgIFNwZWNpZmllcyBpZiB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHZhbGlkIGluIGN1cnJlbnQgbW9kZS4KKyogICAgICAgICAgICBWICAtIFZhbGlkCisqICAgICAgICAgICAgTlYgLSBOb3QgdmFsaWQKKyoKKyogUlc6CisqICAgICAgICBTcGVjaWZpZXMgUmVhZC9Xcml0ZSBtb2RlLgorKiAgICAgICAgICAgIFJPIC0gUmVhZCBvbmx5CisqICAgICAgICAgICAgUlcgLSBSZWFkL1dyaXRlCisqICAgICAgICAgICAgV08gLSBXcml0ZSBvbmx5CisqICAgICAgICAgICAgWFggLSBOb3QgYWNjZXNzaWJsZSBmcm9tIGhvc3QKKyoKKyogUDoKKyogICAgICAgIFNwZWNpZmllcyBwZXJzaXN0ZW50IG1lbW9yeSBvcHRpb24KKyogICAgICAgICAgICBQICAtIFNhdmUgdG8gcGVyc2lzdGVudCBtZW1vcnkKKyogICAgICAgICAgICBOUCAtIE5vIHNhdmUKKyoKKyogUkVMT0FEOgorKiAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc2V0dGluZyB0aGlzIHJlcXVpcmVzIHJlbG9hZGluZyB0aGUgTUFDIG1vZHVsZQorKiAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGNoYW5nZWQgb25seSB3aGVuIFNNRSBpcyBpbiBPRkZMSU5FIG9yIFNVU1BFTkQoT0ZGTElORSkgc3RhdGUKKyoKKyogUkVTVEFSVDoKKyogICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNldHRpbmcgdGhpcyByZXF1aXJlcyAocmUpYXNzb2MgYXQgU1RBIGFuZCByZXN0YXJ0IGF0IEFQCisqICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjYW4gYmUgY2hhbmdlZCBvbmx5IHdoZW4gU01FIGlzIGluIE9GRkxJTkUsIFNVU1BFTkQoT0ZGTElORSksCisqICAgICAgICBJRExFIG9yIFNVU1BFTkQoSURMRSkgc3RhdGVzCisqCisqIFNUQV9ub3RpZmljYXRpb246CisqICAgICAgICBMaXN0cyBtb2R1bGVzIHRvIGJlIG5vdGlmaWVkIGluIFNUQSBtb2RlLiAgVmFsaWQgbW9kdWxlcyBhcmU6CisqICAgICAgICBIREQsIExJTSwgU0NILCBBUlEsIERQSCwgTklNLCBTUCwgUkZQLCBSSFAsIFRGUC4gIE1vcmUgdGhhbiBvbmUKKyogICAgICAgIG1vZHVsZXMgY2FuIGJlIGxpc3RlZCBvbiB0aGUgc2FtZSBsaW5lIHVzaW5nIHNwYWNlIG9yIHRhYiBhcyB0aGUKKyogICAgICAgIHNlcGFyYXRvci4gIElmIG5vIG5vdGlmaWNhdGlvbiBpcyByZXF1aXJlZCwgJ05PTkUnIG11c3QgYmUgc3BlY2lmaWVkLgorKgorKiBBUF9ub3RpZmljYXRpb246CisqICAgICAgICBMaXN0cyBtb2R1bGUgdG8gYmUgbm90aWZpZWQgaW4gQVAgbW9kZS4gIFZhbGlkIG1vZHVsZXMgYXJlOgorKiAgICAgICAgSERELCBMSU0sIFNDSCwgQVJRLCBEUEgsIE5JTSwgU1AsIFJGUCwgUkhQLCBURlAuICBNb3JlIHRoYW4gb25lCisqICAgICAgICBtb2R1bGVzIGNhbiBiZSBsaXN0ZWQgb24gdGhlIHNhbWUgbGluZSB1c2luZyBzcGFjZSBvciB0YWIgYXMgdGhlCisqICAgICAgICBzZXBhcmF0b3IuICBJZiBubyBub3RpZmljYXRpb24gaXMgcmVxdWlyZWQsICdOT05FJyBtdXN0IGJlIHNwZWNpZmllZC4KKyoKKyogU1RBL0FQIGludGVnZXIgdmFsdWVzOgorKiAgICAgICAgbWluOgorKiAgICAgICAgU3BlY2lmaWVzIG1pbmltdW0gdmFsdWUgZm9yIGFuIGludGVnZXIgcGFyYW1ldGVyLiAgVGhpcyBmaWVsZCBpcworKiAgICAgICAgaWdub3JlZCBpZiB0aGUgcGFyYW1ldGVyIHR5cGUgaXMgc3RyaW5nLiAgSG93ZXZlciwgdGhpcyBmaWVsZCBtdXN0CisqICAgICAgICBub3QgYmUgb21pdHRlZC4KKyoKKyogICAgICAgIG1heDoKKyogICAgICAgIFNwZWNpZmllcyBtYXhpbXVtIHZhbHVlIGZvciBhbiBpbnRlZ2VyIHBhcmFtZXRlci4gIFRoaXMgZmllbGQgaXMKKyogICAgICAgIGlnbm9yZWQgaWYgdGhlIHBhcmFtZXRlciB0eXBlIGlzIHN0cmluZy4gIEhvd2V2ZXIsIHRoaXMgZmllbGQgbXVzdAorKiAgICAgICAgbm90IGJlIG9taXR0ZWQuCisqCisqICAgICAgICBkZWZhdWx0OgorKiAgICAgICAgU3BlY2lmaWVzIGRlZmF1bHQgdmFsdWUgZm9yIGFuIGludGVnZXIgcGFyYW1ldGVyLiAgVGhpcyBmaWVsZCBpcworKiAgICAgICAgaWdub3JlZCBpZiB0aGUgcGFyYW1ldGVyIHR5cGUgaXMgc3RyaW5nLiAgSG93ZXZlciwgdGhpcyBmaWVsZCBtdXN0CisqICAgICAgICBub3QgYmUgb21pdHRlZC4KKyoKKyogU1RBL0FQIHN0cmluZyB2YWx1ZXM6CisqICAgICAgICBsZW46CisqICAgICAgICBUaGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgc3RyaW5nCisqCisqICAgICAgICBieXRlaToKKyogICAgICAgIGJ5dGUgaSBvZiB0aGUgc3RyaW5nIHdoZXJlIGkgdmFyaWVzIGZyb20gMSB0byBsZW4KKyoKKyogVEFCTEUgR0VORVJBVElPTjoKKyogLS0tLS0tLS0tLS0tLS0tLS0KKyogICAgICAgIFRhYmxlIGNhbiBiZSBnZW5lcmF0ZWQgdXNpbmcga2V5d29yZHMgJyNUQUJMRScgYW5kICcjRU5EJyBhcyBiZWxvdzoKKyoKKyogICAgICAgICNUQUJMRSAgdGFibGVfbmFtZSAgIG51bWJlcl9vZl9yb3cKKyogICAgICAgIFdOSV9DRkdfeHh4eAorKiAgICAgICAgLi4uLi4uLgorKiAgICAgICAgLi4uLi4uLgorKiAgICAgICAgI0VORAorKgorKiAgICAgICAgVGhlIENGRyB1dGlsaXR5IHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBvdXRwdXQ6CisqICAgICAgICBXTklfQ0ZHX3RhYmxlX3h4eF9JRCAgICB4eHgKKyogICAgICAgIFdOSV9DRkdfdGFibGVfeHh4X1JPVyAgIG51bWJlcl9vZl9yb3dzCisqICAgICAgICBXTklfQ0ZHX3RhYmxlX3h4eF9DT0wgICBudW1iZXJfb2ZfY29sdW1ucworKgorKiAgICAgICAgVGhlc2Ugd2lsbCBiZSBmb2xsb3dlZCBieSB0aGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGVhY2ggZW50cnkgaW4KKyogICAgICAgIHRoZSB0YWJsZS4gIFRhYmxlIGlzIG9yZ2FuaXplZCBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuCisqCisqICAgICAgICAjRU5UUllfVkFMVUVTIDEKKyogICAgICAgIDAgICAgNCAgICAxCisqICAgICAgICAwICAgIDAgICAgMAorKiAgICAgICAgI0VOVFJZX1ZBTFVFUyAyCisqICAgICAgICAwICAgIDQgICAgMgorKiAgICAgICAgMCAgICAwICAgIDAKKyogICAgICAgICNFTlRSWV9WQUxVRVMgMworKiAgICAgICAgMCAgICA0ICAgIDMKKyogICAgICAgIDAgICAgMCAgICAwCisqICAgICAgICAjRU5UUllfVkFMVUVTIDQKKyogICAgICAgIDAgICAgNCAgICA0CisqICAgICAgICAwICAgIDAgICAgMAorKgorKgorKiBFTlVNRVJBVElPTgorKiAtLS0tLS0tLS0tLQorKiAgICAgICAgRW51bWVyYXRpb25zIGNhbiBiZSBkZWZpbmUgdXNpbmcga2V5d29yZCAnI0VOVU0nCisqCisqICAgICAgICAjRU5VTSB4eHggICB2YWwKKyoKKyogICAgICAgIFRoZSBjZmcgdXRpbGl0eSB3aWxsIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgb3V0cHV0IGluIHRoZSBoZWFkZXIgZmlsZQorKiAgICAgICAgI2RlZmluZSBwYXJhbW5hbWVfeHh4ICAgIHZhbAorKgorCisKKyoKKyogU3RhdGlvbiBJRCAoY2hhbmdpbmcgcmVxdWlyZXMgcmVzdGFydCkKKyoKKworV05JX0NGR19TVEFfSUQgICAgUyAgICA2ICAgIDEKK1YgICAgUlcgICAgTlAgUkVMT0FECitIQUwKKzYgICAgMHgyMiAweDIyIDB4NDQgMHg0NCAweDMzIDB4MzMKK1YgICAgUlcgICAgTlAgUkVMT0FECitIQUwKKzYgICAgMHgyMiAweDIyIDB4MTEgMHgxMSAweDMzIDB4MzMKKworKgorKiBDRiBQb2xsYWJsZQorKgorCitXTklfQ0ZHX0NGX1BPTExBQkxFICAgIEkgICAgNCAgICAxCitOViAgICBSTyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDAgICAgMAorViAgICBSTyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMAorCisqCisqIENGUCBQZXJpb2QKKyoKKworV05JX0NGR19DRlBfUEVSSU9EICAgIEkgICAgNCAgICAxCitWICAgIFJPICAgIE5QCitOT05FCiswICAgIDI1NSAgIDEKK1YgICAgUlcgICAgTlAKK1NDSAorMCAgICAyNTUgICAxCisKKyoKKyogQ0ZQIE1heCBEdXJhdGlvbgorKgorCitXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT04gICAgSSAgICA0ICAgIDEKK1YgICAgUk8gICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAzMDAwMAorViAgICBSVyAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMzAwMDAKKworKgorKiBTU0lEIChjaGFuZ2luZyByZXF1aXJlcyByZXN0YXJ0KQorKgorCitXTklfQ0ZHX1NTSUQgICAgUyAgICAzMiAgICAxCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzEwICAgIDEgMiAzIDQgNSA2IDcgOCA5IDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMTAgICAgMSAyIDMgNCA1IDYgNyA4IDkgMAorCisqCisqIEJlYWNvbiBQZXJpb2QKKyogQ2FuJ3QgYmUgY2hhbmdlZCBvbiBTVEEgaW4gaW5mcmFzdHJ1Y3R1cmUsIGlnbm9yZSBub3RpZmljYXRpb24gYXQgU0NICisqCisKK1dOSV9DRkdfQkVBQ09OX0lOVEVSVkFMICAgIEkgICAgNCAgICAyCitWICAgIFJXICAgIE5QCitTQ0gKKzAgICAgNjU1MzUgICAgMTAwCitWICAgIFJXICAgIE5QCitTQ0gKKzAgICAgNjU1MzUgICAgMTAwCisKKyoKKyogRFRJTSBQZXJpb2QKKyoKKworV05JX0NGR19EVElNX1BFUklPRCAgICAgICAgSSAgICA0ICAgIDIKK1YgICAgUk8gICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgMQorViAgICBSVyAgICBOUAorU0NICiswICAgIDY1NTM1ICAgIDEKKworCisqCisqIFdFUCBLZXkgTGVuZ3RoICg1IG9yIDEzIGJ5dGVzKQorKgorCitXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIICAgIEkgICAgNCAgICA1CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzUgICAgMTMgICAgNQorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCis1ICAgIDEzICAgIDUKKworI0VOVU0gNSAgICA1CisjRU5VTSAxMyAgIDEzCisKKyoKKyogRGVmYXVsdCBLZXkgVGFibGUKKyoKKworI1RBQkxFICAgIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZX1RBQkxFICAgIDQKKworV05JX0NGR19XRVBfREVGQVVMVF9LRVkgICAgUyAgICAxMyAgICA0CitWICAgIFdPICAgIE5QIFJFU1RBUlQKK05PTkUKKzAKK1YgICAgV08gICAgTlAgUkVTVEFSVAorTk9ORQorMAorCisjRU5ECisKKyoKKyogV0VQIERlZmF1bHQgS2V5IGlkCisqCisKK1dOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSUQgICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAzICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAzICAgIDAKKworI0VOVU0gMCAgICAwCisjRU5VTSAxICAgIDEKKyNFTlVNIDIgICAgMgorI0VOVU0gMyAgICAzCisKKyoKKyogRXhjbHVkZSB1bmVuY3J5cHRlZCBmcmFtZXMgKFdFUCkKKyoKKworV05JX0NGR19FWENMVURFX1VORU5DUllQVEVEICAgIEkgICAgNCAgICA1CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAwCisKKyoKKyogUlRTIFRocmVzaG9sZAorKgorCitXTklfQ0ZHX1JUU19USFJFU0hPTEQgICAgSSAgICA0ICAgIDYKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxMDQ4NTc2ICAgMjM0NworViAgICBSVyAgICBOUAorSEFMCiswICAgIDEwNDg1NzYgICAyMzQ3CisKKyoKKyogU2hvcnQgUmV0cnkgTGltaXQKKyoKKworV05JX0NGR19TSE9SVF9SRVRSWV9MSU1JVCAgICBJICAgIDQgICAgNgorViAgICBSVyAgICBOUAorSEFMCiswICAgIDI1NSAgIDYKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAyNTUgICA2CisKKyoKKyogTG9uZyBSZXRyeSBMaW1pdAorKgorCitXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVQgICAgSSAgICA0ICAgIDYKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAyNTUgICA2CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgNgorCisKKyoKKyogRnJhZ21lbnRhdGlvbiBUaHJlc2hvbGQKKyoKKworV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAgICBJICAgIDQgICAgNgorViAgICBSVyAgICBOUAorSEFMCisyNTYgICAgODAwMCAgICA4MDAwCitWICAgIFJXICAgIE5QCitIQUwKKzI1NiAgICA4MDAwICAgIDgwMDAKKworCisqCisqIE1pbmltdW0gQ2hhbm5lbCBUaW1lIChUVSkKKyoKKworV05JX0NGR19BQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUgICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgIDIwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAyMAorCisqCisqIE1heGltdW0gQ2hhbm5lbCBUaW1lIChUVSkKKyoKKworV05JX0NGR19BQ1RJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUUgICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgNDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgNDAKKyoKKyogTWluaW11bSBDaGFubmVsIFRpbWUgKFRVKQorKgorCitXTklfQ0ZHX1BBU1NJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUgICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgIDYwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICA2MAorCisqCisqIE1heGltdW0gQ2hhbm5lbCBUaW1lIChUVSkKKyoKKworV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDExMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAxMTAKKworKgorKiBKb2luIEZhaWx1cmUgVGltZW91dCAoVFUpCisqCisKK1dOSV9DRkdfSk9JTl9GQUlMVVJFX1RJTUVPVVQgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgMzAwMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAzMDAwCisKKyoKKyogQXV0aGVudGljYXRlIEZhaWx1cmUgVGltZW91dCAoVFUpCisqCisKK1dOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAxMDAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDEwMDAKKworKgorKiBBdXRoZW50aWNhdGUgUmVzcG9uc2UgVGltZW91dCAoVFUpCisqCisKK1dOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VUICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDEwMDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgMTAwMAorCisqCisqIEFzc29jYXRpb24gRmFpbHVyZSBUaW1lb3V0IChUVSkKKyoKKworV05JX0NGR19BU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICA2NTUzNSAyMDAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgNjU1MzUgMzAwMAorCisqCisqIFJlYXNzb2NpYXRpb24gRmFpbHVyZSBUaW1lb3V0IChUVSkKKyoKKworV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAxMDAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDMwMDAKKworCisqCisqIFJBIHBlcmlvZGljaXR5IFRpbWVvdXQgKFRVKQorKgorCitXTklfQ0ZHX1JBX1BFUklPRElDSVRZX1RJTUVPVVRfSU5fUFMgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAxMDAwCitOViAgICBSVyAgICBOUAorTk9ORQorMCAgICAwICAgIDAKKworKgorKiBCZWFjb24gRmlsdGVyIEVuYWJsZS9EaXNhYmxlIChUVSkKKyoKKworV05JX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUiAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDEgICAgMQorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAxCisKKyoKKyogSGVhcnQgQmVhdCBFbmFibGUvRGlzYWJsZSAoVFUpCisqCisKK1dOSV9DRkdfUFNfRU5BQkxFX0hFQVJUX0JFQVQgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgIDEKK05WICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorCisqCisqIFJTU0kgTW9uaXRvciBFbmFibGUvRGlzYWJsZSAoVFUpCisqCisKK1dOSV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUiAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDEgICAgMAorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAwCisKKworKgorKiBQUyBEYXRhIEluQWN0aXZpdHkgVGltZW91dCAoVFUpCisqCisKK1dOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVQgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMSAgICAyNTUgICAgMjAKK05WICAgIFJXICAgIE5QCitOT05FCisxICAgIDI1NSAgICAyMAorCisKKyoKKyogUkYgU2V0dGxpbmcgVGltZSBDbGsgKEluIFVTKQorKgorCitXTklfQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjAwMDAgICAgMTUwMAorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjAwMDAgICAgMTUwMAorCisqCisqIFN1cHBvcnRlZCBSYXRlIFNldCBmb3IgMTFiCisqCisKK1dOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQiAgICBTICAgIDQgICAgMgorViAgICBSTyAgICBOUAorTk9ORQorNCAgICAgMiA0IDExIDIyCitWICAgIFJPICAgIE5QCitOT05FCis0ICAgICAyIDQgMTEgMjIKKworKgorKiBTdXBwb3J0ZWQgUmF0ZSBTZXQgZm9yIDExYQorKgorCitXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUEgICAgUyAgICA4ICAgIDcKK1YgICAgUk8gICAgTlAKK05PTkUKKzggICAgMTIgMTggMjQgMzYgNDggNzIgOTYgMTA4CitWICAgIFJPICAgIE5QCitOT05FCis4ICAgIDEyIDE4IDI0IDM2IDQ4IDcyIDk2IDEwOAorCisKKyoKKyogUEhZIE1vZGUKKyoKKworV05JX0NGR19QSFlfTU9ERSAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDMgICAgMAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDMgICAgMAorCisjRU5VTSAgMTFBICAwCisjRU5VTSAgMTFCICAxCisjRU5VTSAgMTFHICAyCisjRU5VTSAgTk9ORSAzCisKKworKgorKlRoZSBEb3QxMSBtb2RlIGNhbiBjaGFuZ2UgZHluYW1pY2FsbHkgb24gU1RBCisqCitXTklfQ0ZHX0RPVDExX01PREUgICAgIEkgICAgIDQgICAgIDkKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTElNCiswICAgIDExICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTElNCiswICAgIDExICAgIDAKKworI0VOVU0gIEFMTCAgICAgICAgICAgMAorI0VOVU0gIDExQSAgICAgICAgICAgMQorI0VOVU0gIDExQiAgICAgICAgICAgMgorI0VOVU0gIDExRyAgICAgICAgICAgMworI0VOVU0gIDExTiAgICAgICAgICAgNAorI0VOVU0gIDExR19PTkxZICAgICAgNQorI0VOVU0gIDExTl9PTkxZICAgICAgNgorI0VOVU0gIDExQUMgICAgICAgICAgNworI0VOVU0gIDExQUNfT05MWSAgICAgOAorCisKKworCisKKworKgorKiBPcGVyYXRpb25hbCBSYXRlIFNldCAoZ29lcyBpbiBiZWFjb24sIHByb2JlIHJzcCBhbmQgYXNzb2MgcmVxKQorKgorCitXTklfQ0ZHX09QRVJBVElPTkFMX1JBVEVfU0VUICAgIFMgICAgMTIgICAgMgorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzQgICAgIDB4ODIgMHg4NCAxMSAyMgorKiA4ICAgIDB4OGMgMTggMjQgMzYgNDggNzIgOTYgMTA4CisKKyoKKyogRXh0ZW5kZWQgT3BlcmF0aW9uYWwgUmF0ZSBTZXQgKGdvZXMgaW4gYmVhY29uLCBhc3NvYyByZXEpCisqIHJlcXVpcmVkIGZvciAxMWcKKyoKKworV05JX0NGR19FWFRFTkRFRF9PUEVSQVRJT05BTF9SQVRFX1NFVCAgICBTICAgIDggICAgNworViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAKKworKgorKiBQcm9wcmlldGFyeSBPcGVyYXRpb25hbCBSYXRlIFNldAorKgorCitXTklfQ0ZHX1BST1BSSUVUQVJZX09QRVJBVElPTkFMX1JBVEVfU0VUICAgIFMgICAgNCAgICA3CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzQgICAgMSAzIDUgNworViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCis0ICAgIDEgMyA1IDcKKworKgorKiBCU1NJRAorKiBJbiBJQlNTLCB0aGlzIGNhbiBiZSBjaGFuZ2VkIGZvciBjb2FsZXNjaW5nLCBzaG91bGQgU01FIGdvIGludG8gSURMRSBzdGF0ZT8KKyoKKworKgorKiBMaXN0ZW4gSW50ZXJ2YWwKKyoKKworV05JX0NGR19MSVNURU5fSU5URVJWQUwgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICA2NTUzNSAxCitWICAgIFJPICAgIE5QCitOT05FCiswICAgIDY1NTM1IDEKKworKgorKiBWYWxpZCBDaGFubmVsIExpc3QKKyoKKworV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QgICAgUyAgICAxMDAgICAgOAorViAgICBSVyAgICBOUCBSRVNUQVJUCitMSU0KKzU1ICAgMzYgNDAgNDQgNDggNTIgNTYgNjAgNjQgMSA2IDExIDM0IDM4IDQyIDQ2IDIgMyA0IDUgNyA4IDkgMTAgMTIgMTMgMTQgMTAwIDEwNCAxMDggMTEyIDExNiAxMjAgMTI0IDEyOCAxMzIgMTM2IDE0MCAxNDkgMTUxIDE1MyAxNTUgMTU3IDE1OSAxNjEgNTAgNTQgNTggNjIgMjQwIDI0MiAyNDQgMjQ2IDI0OCAyNTAgMjUyCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK0xJTQorNTUgICAzNiA0MCA0NCA0OCA1MiA1NiA2MCA2NCAxIDYgMTEgMzQgMzggNDIgNDYgMiAzIDQgNSA3IDggOSAxMCAxMiAxMyAxNCAxMDAgMTA0IDEwOCAxMTIgMTE2IDEyMCAxMjQgMTI4IDEzMiAxMzYgMTQwIDE0OSAxNTEgMTUzIDE1NSAxNTcgMTU5IDE2MSA1MCA1NCA1OCA2MiAyNDAgMjQyIDI0NCAyNDYgMjQ4IDI1MCAyNTIKKworKgorKiBDdXJyZW50IENoYW5uZWwKKyoKKworV05JX0NGR19DVVJSRU5UX0NIQU5ORUwgICAgSSAgICA0ICAgIDkKK1YgICAgUk8gICAgTlAKK05PTkUKKzAgICAgMTY1ICAgIDEKK1YgICAgUk8gICAgTlAKK05PTkUKKzAgICAgMTY1ICAgIDEKKworCisqCisqIEZvciAxMWEgb3IgcHVyZSAxMWcsIHVzZSA2TWJwcyhyYXRlaW5kZXggMTEpCisqIGFzIHRoZSBkZWZhdWx0IGJlYWNvblJhdGVJbmRleCBhbmQKKyogbm9uQmVhY29uUmF0ZUluZGV4LgorKgorV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWiAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxMSAgICA1CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDExICAgIDUKKworKgorKiBGb3IgMTFiL2csIHVzZSAxTWJwcworKiBhcyB0aGUgZGVmYXVsdCBiZWFjb25SYXRlSW5kZXggYW5kCisqIG5vbkJlYWNvblJhdGVJbmRleC4KKyoKK1dOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDMxICAgIDEKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMzEgICAgMQorCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFJhdGUgYWRhcHRhdGlvbiB0eXBlCisqCisKK1dOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEUgIEkgICA0ICAgMAorViAgICBSVyAgICBOUAorU0NICiswICAgIDIgICAgIDEKK1YgICAgUlcgICAgTlAKK1NDSAorMCAgICAyICAgICAxCisKKyNFTlVNIEZJWEVEIDAKKyNFTlVNIEFVVE8gIDEKKyNFTlVNIFNOUl9CQVNFRCAyCisKKyoKKyogUmF0ZSBhZGFwdGF0aW9uIGZpeGVkIHJhdGUKKyogVXNlZCB0byBkZXRlcm1pbmUgdGhlIHJhdGUgZm9yIGFsbCBwZWVyIHN0YXRpb25zCisqCisqCisKK1dOSV9DRkdfRklYRURfUkFURSAgSSAgIDQgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNDQgICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA0NCAgICAgMAorCisjRU5VTSBBVVRPCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisjRU5VTSAxTUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNFTlVNIDJNQlBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI0VOVU0gNV81TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjRU5VTSAxMU1CUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKworI0VOVU0gNk1CUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjRU5VTSA5TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNFTlVNIDEyTUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI0VOVU0gMThNQlBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjRU5VTSAyNE1CUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNFTlVNIDM2TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNFTlVNIDQ4TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNFTlVNIDU0TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKworI0VOVU0gNl81TUJQU19NQ1MwXzIwTUhaX1NJTU8JICAgICAgICAgICAgMTMKKyNFTlVNIDEzTUJQU19NQ1MxXzIwTUhaX1NJTU8gICAgICAgICAgICAgICAgMTQKKyNFTlVNIDE5XzVNQlBTX01DUzJfMjBNSFpfU0lNTyAgICAgICAgICAgICAgMTUKKyNFTlVNIDI2TUJQU19NQ1MzXzIwTUhaX1NJTU8gICAgICAgICAgICAgICAgMTYKKyNFTlVNIDM5TUJQU19NQ1M0XzIwTUhaX1NJTU8gICAgICAgICAgICAgICAgMTcKKyNFTlVNIDUyTUJQU19NQ1M1XzIwTUhaX1NJTU8gICAgICAgICAgICAgICAgMTgKKyNFTlVNIDU4XzVNQlBTX01DUzZfMjBNSFpfU0lNTyAgICAgICAgICAgICAgMTkKKyNFTlVNIDY1TUJQU19NQ1M3XzIwTUhaX1NJTU8gICAgICAgICAgICAgICAgMjAKKworI0VOVU0gN18yTUJQU19NQ1MwXzIwTUhaX1NJTU9fU0dJICAgICAgICAgICAyMQorI0VOVU0gMTRfNE1CUFNfTUNTMV8yME1IWl9TSU1PX1NHSSAgICAgICAgICAyMgorI0VOVU0gMjFfN01CUFNfTUNTMl8yME1IWl9TSU1PX1NHSSAgICAgICAgICAyMworI0VOVU0gMjhfOU1CUFNfTUNTM18yME1IWl9TSU1PX1NHSSAgICAgICAgICAyNAorI0VOVU0gNDNfM01CUFNfTUNTNF8yME1IWl9TSU1PX1NHSSAgICAgICAgICAyNQorI0VOVU0gNTdfOE1CUFNfTUNTNV8yME1IWl9TSU1PX1NHSSAgICAgICAgICAyNgorI0VOVU0gNjVNQlBTX01DUzZfMjBNSFpfU0lNT19TR0kgICAgICAgICAgICAyNworI0VOVU0gNzJfMk1CUFNfTUNTN18yME1IWl9TSU1PX1NHSSAgICAgICAgICAyOAorCisjRU5VTSAwXzI1TUJQU19TTFJfMjBNSFpfU0lNTyAgICAgICAgICAgICAgIDI5CisjRU5VTSAwXzVNQlBTX1NMUl8yME1IWl9TSU1PICAgICAgICAgICAgICAgIDMwCisKKyNFTlVNIDY4XzI1TUJQU19RQ19QUk9QXzIwTUhaX1NJTU8gICAgICAgICAgMzEKKyNFTlVNIDU0TUJQU19NQ1MzXzQwTUhaX1NJTU8gICAgICAgICAgICAgICAgMzIKKyNFTlVNIDgxTUJQU19NQ1M0XzQwTUhaX1NJTU8gICAgICAgICAgICAgICAgMzMKKyNFTlVNIDEwOE1CUFNfTUNTNV80ME1IWl9TSU1PICAgICAgICAgICAgICAgMzQKKyNFTlVNIDEyMV81TUJQU19NQ1M2XzQwTUhaX1NJTU8gICAgICAgICAgICAgMzUKKyNFTlVNIDEzNU1CUFNfTUNTN180ME1IWl9TSU1PICAgICAgICAgICAgICAgMzYKKyNFTlVNIDE1TUJQU19NQ1MwXzQwTUhaX1NJTU9fU0dJICAgICAgICAgICAgMzcKKyNFTlVNIDMwTUJQU19NQ1MxXzQwTUhaX1NJTU9fU0dJICAgICAgICAgICAgMzgKKyNFTlVNIDQ1TUJQU19NQ1MyXzQwTUhaX1NJTU9fU0dJICAgICAgICAgICAgMzkKKyNFTlVNIDYwTUJQU19NQ1MzXzQwTUhaX1NJTU9fU0dJICAgICAgICAgICAgNDAKKyNFTlVNIDkwTUJQU19NQ1M0XzQwTUhaX1NJTU9fU0dJICAgICAgICAgICAgNDEKKyNFTlVNIDEyME1CUFNfTUNTNV80ME1IWl9TSU1PX1NHSSAgICAgICAgICAgNDIKKyNFTlVNIDEzNU1CUFNfTUNTNl80ME1IWl9TSU1PX1NHSSAgICAgICAgICAgNDMKKyNFTlVNIDE1ME1CUFNfTUNTN180ME1IWl9TSU1PX1NHSSAgICAgICAgICAgNDQKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogQnJvYWRjYXN0L211dGxpY2FzdCByYXRlcyBmb3IgMi40R0haCisqIHVzZXMgdGhlIHNhbWUgcmF0ZSBpbmRpY2VzIGRlZmluaXRpb24gYXMgV05JX0NGR19GSVhFRF9SQVRFCisqIGRlZmF1bHQgdmFsdWUgY29ycmVzcG9uZHMgdG8gMU0KKworV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWiAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDMxICAgIDEKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAzMSAgICAxCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEJyb2FkY2FzdC9tdXRsaWNhc3QgcmF0ZXMgZm9yIDUgR0haCisqIHVzZXMgdGhlIHNhbWUgcmF0ZSBpbmRpY2VzIGRlZmluaXRpb24gYXMgV05JX0NGR19GSVhFRF9SQVRFCisqIGRlZmF1bHQgdmFsdWUgY29ycmVzcG9uZHMgdG8gNk0KKworV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF81R0haICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMzEgICA1CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMzEgICA1CisKKyoKKyogcmV0cnkgcmF0ZSBzZWxlY3Rpb24gcG9saWN5CisqIDAgPT4gdXNlIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCByYXRlCisqIDEgPT4gdXNlIHRoZSBzYW1lIHJhdGUgYXMgdGhlIGNob3NlbiBwcmltYXJ5IHJhdGUKKyogMiA9PiB1c2UgdGhlIHJhdGUgc3BlY2lmaWVkIGluIFJFVFJZUkFURV9TRUNPTkRBUlkKKyogMyA9PiB1c2UgdGhlIHJhdGUgY2xvc2VzdCB0byB0aGUgcHJpbWFyeQorKiA0ID0+IGF1dG9zZWxlY3QgdGhlIHJldHJ5IHJhdGUgYmFzZWQgb24gUkEgYWxnb3JpdGhtCisqCisKK1dOSV9DRkdfUkVUUllSQVRFX1BPTElDWSAgSSAgIDQgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA0CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA0CisKKyNFTlVNIE1JTl9TVVBQT1JURUQgMAorI0VOVU0gUFJJTUFSWSAgICAgICAxCisjRU5VTSBSRVNFUlZFRCAgICAgIDIKKyNFTlVNIENMT1NFU1QgICAgICAgMworI0VOVU0gQVVUT1NFTEVDVCAgICA0CisjRU5VTSBNQVggICAgICAgICAgIDUKKworKgorKiB0aGUgZm9sbG93aW5nIHR3byBDRkcncyBhcmUKKyogdXNlZCBvbmx5IGlmIHRoZSByZXRyeXJhdGUgcG9saWN5ID09IDIKKyogVGhlc2Ugc2hvdWxkIGJlIHNldCB0byBvbmUgb2YgdGhlIHZhbHVlcyB1c2VkCisqIGZvciBjb25maWd1cmluZyBmaXhlZCByYXRlcyAoc2VlIGVudW1lcmF0ZWQgcmF0ZXMpCisqCisKK1dOSV9DRkdfUkVUUllSQVRFX1NFQ09OREFSWSAgSSAgIDQgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICAwCisKK1dOSV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZICBJICAgNCAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAyNTUgICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAyNTUgICAgIDAKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogQXV0b21hdGljIFBvd2VyIFNhdmUgRGVsaXZlcnkgY2FwYWJpbGl0eQorKgorCitXTklfQ0ZHX0FQU0RfRU5BQkxFRCBJICAgNCAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCisKKyoKKyogU2hhcmVkIGtleSBhdXRoZW50aWNhdGlvbiBzdXBwb3J0ZWQKKyoKKworV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFICAgIEkgICA0ICAgOAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAxCisKKyoKKyogT3BlbiBzeXN0ZW0gYXV0aGVudGljYXRpb24gc3VwcG9ydGVkCisqCisKK1dOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEUgICAgSSAgIDQgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDEKKworKgorKiBBdXRoZW50aWNhdGlvbiBUeXBlIChjaGFuZ2UgcmVxdWlyZXMgcmVzdGFydCkKKyoKKworV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgNjU1MzUgICAgMAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDY1NTM1ICAgIDAKKworKgorKiBDRiBQb2xsIFJlcXVlc3QgKGNoYW5nZSByZXF1aXJlcyByZXN0YXJ0KQorKgorCitXTklfQ0ZHX0NGX1BPTExfUkVRVUVTVCAgICBJICAgIDQgICAgOAorTlYgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworKgorKiBQcml2YWN5IEVuYWJsZWQgKGNoYW5nZSByZXF1aXJlcyByZXN0YXJ0KQorKgorCitXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRCAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMAorCisqCisqIFNob3J0IFByZWFtYmxlIChjaGFuZ2UgcmVxdWlyZXMgcmVzdGFydCkKKyoKKworV05JX0NGR19TSE9SVF9QUkVBTUJMRSAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMQorCisqCisqIFNob3J0IFNsb3QgdGltZQorKiBUaGlzIGlzIHRoZSBvcGVyYXRpb25hbCBzdGF0ZSBvZiB0aGUgQlNTCisKK1dOSV9DRkdfU0hPUlRfU0xPVF9USU1FICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKKworCisqCisqIEFDQ0VQVCBTaG9ydCBTbG90IEFzc29jaWF0aW9uIG9ubHkKKyoKKyogMTogIElmIEFQIHN1cHBvcnRzIHNob3J0U2xvdCwgdGhlbiBBUCB3aWxsIGFjY2VwdAorKiAgICAgYXNzb2NpYXRpb24gb25seSBmcm9tIHN0YXRpb25zIHRoYXQgc3VwcG9ydHMKKyogICAgIHN1cHBvcnRzIHNob3J0IHNsb3QKKyogMDogIEFQIHN1cHBvcnRzIHNob3J0U2xvdCwgYnV0IEFQIHdpbGwgYWNjZXB0IGFzc29jaWF0aW9uCisqICAgICBmcm9tIHN0YXRpb25zIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBzdGF0aW9uIHN1cHBvcnRzCisqICAgICBzaG9ydCBzbG90IG9yIGxvbmcgc2xvdAorKgorV05JX0NGR19BQ0NFUFRfU0hPUlRfU0xPVF9BU1NPQ19PTkxZICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCisKKworKgorKiBRT1MgRW5hYmxlZCAoY2hhbmdlIHJlcXVpcmVzIHJlc3RhcnQpCisqCisKK1dOSV9DRkdfUU9TX0VOQUJMRUQgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworKgorKiBIQ0YgRW5hYmxlZCAoY2hhbmdlIHJlcXVpcmVzIHJlc3RhcnQpCisqCisKK1dOSV9DRkdfSENGX0VOQUJMRUQgICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCisKKyoKKyogUlNOICgxMWkvV1BBKSBFbmFibGVkCisqCisKK1dOSV9DRkdfUlNOX0VOQUJMRUQgICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCisKKyoKKyogQmFja2dyb3VuZCBzY2FubmluZyBwZXJpb2RpY2l0eSAoa2lsbyB1c2VjKQorKgorCitXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9QRVJJT0QgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxODAwMDAgICAgNTAwMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDE4MDAwICAgIDUwMDAKKworKgorKiBNYXggbnVtYmVyIG9mIFByZWF1dGhlbnRpY2F0aW9uCisqCisKK1dOSV9DRkdfTUFYX05VTV9QUkVfQVVUSCAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTk9ORQorMCAgICAyNTYgICAgNjQKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK05PTkUKKzAgICAgMjU2ICAgIDY0CisKKyoKKyogUHJlYXV0aGVudGljYXRpb24gQ2xlYW51cCBUaW1lb3V0IChraWxvIHVzZWMpCisqCisKK1dOSV9DRkdfUFJFQVVUSF9DTE5VUF9USU1FT1VUICAgIEkgICAgNCAgICA4CitOViAgICBYWCAgICBOUAorTk9ORQorMCAgICAgMCAgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDEyMDAwMCAgICAzMDAwMAorCisqCisqIFJlbGVhc2UgQUlEIFRpbWVvdXQKKyoKKworV05JX0NGR19SRUxFQVNFX0FJRF9USU1FT1VUICAgIEkgICAgNCAgICA4CitOViAgICBYWCAgICBOUAorTk9ORQorMCAgICAwICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxMDAwMDAgICAgMTAwMAorKgorKiBIZWFydGJlYXQgVGhyZXNob2xkCisqCisKK1dOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICA2NTUzNSAgICA0MAorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgNDAKKworKgorKiBQcm9iZSByZXNwb25zZSB3YWl0IHRpbWUgb3V0IGFmdGVyIGhlYXJ0YmVhdCBmYWlsdXJlCisqCisKK1dOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VUICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCisxMCAgICAxMDAwMCAgICA0MAorViAgICBSVyAgICBOUAorTk9ORQorMTAgICAgMTAwMDAgICAgNDAKKworKgorKiBNYW51ZmFjdHVyZXIgT1VJIChmcm9tIGVlcHJvbSkKKyoKKworV05JX0NGR19NQU5VRkFDVFVSRVJfT1VJICAgIFMgICAgMyAgICA4CitWICAgIFJPICAgIE5QCitOT05FCiszICAgIDB4MCAweGEgMHhmNQorViAgICBSTyAgICBOUAorTk9ORQorMyAgICAweDAgMHhhIDB4ZjUKKworKgorKiBNYW51ZmFjdHVyZSBOYW1lIChmcm9tIGVlcHJvbSkKKyoKKworV05JX0NGR19NQU5VRkFDVFVSRVJfTkFNRSAgICBTICAgIDY1ICAgIDgKK1YgICAgUk8gICAgTlAKK05PTkUKKzggICAgMHg1MSAweDc1IDB4NjEgMHg2YyAweDYzIDB4NmYgMHg2RCAweDZECitWICAgIFJPICAgIE5QCitOT05FCis4ICAgIDB4NTEgMHg3NSAweDYxIDB4NmMgMHg2MyAweDZmIDB4NkQgMHg2RAorCisqCisqIE1vZGVsIE51bWJlciAoZnJvbSBlZXByb20pCisqCisKK1dOSV9DRkdfTU9ERUxfTlVNQkVSICAgIFMgICAgMzMgICAgOAorViAgICBSTyAgICBOUAorTk9ORQorNiAgICAweDRkIDB4NGUgMHgzMSAweDMyIDB4MzMgMHgzNAorViAgICBSTyAgICBOUAorTk9ORQorNiAgICAweDRkIDB4NGUgMHgzMSAweDMyIDB4MzMgMHgzNAorCisKKworKgorKiBNb2RlbCBOYW1lIChmcm9tIGVlcHJvbSkKKyogV0ZSNDAzMQorKgorCitXTklfQ0ZHX01PREVMX05BTUUgICAgUyAgICAzMyAgICA4CitWICAgIFJPICAgIE5QCitOT05FCis3ICAgIDB4NTcgMHg0NiAweDUyIDB4MzQgMHgzMCAweDMzIDB4MzEKK1YgICAgUk8gICAgTlAKK05PTkUKKzcgICAgMHg1NyAweDQ2IDB4NTIgMHgzNCAweDMwIDB4MzMgMHgzMQorCisKKworCisqCisqIE1hbnVmYWN0dXJlIFByb2R1Y3QgTmFtZSAoZnJvbSBlZXByb20pCisqCisKK1dOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfTkFNRSAgICBTICAgIDMzICAgIDgKK1YgICAgUk8gICAgTlAKK05PTkUKKzYgICAgMHgzMSAweDMxIDB4NmUgMHgyRCAweDQxIDB4NTAKK1YgICAgUk8gICAgTlAKK05PTkUKKzYgICAgMHgzMSAweDMxIDB4NmUgMHgyRCAweDQxIDB4NTAKKworCisqCisqIE1hbnVmYWN0dXJlIFByb2R1Y3QgVmVyc2lvbiAoZnJvbSBlZXByb20pCisqCisKK1dOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfVkVSU0lPTiAgICBTICAgIDMzICAgIDgKK1YgICAgUk8gICAgTlAKK05PTkUKKzYgICAgMHg1MyAweDRlIDB4MzEgMHgzMiAweDMzIDB4MzQKK1YgICAgUk8gICAgTlAKK05PTkUKKzYgICAgMHg1MyAweDRlIDB4MzEgMHgzMiAweDMzIDB4MzQKKworKgorKiBNdWx0aSBEb21haW4gQ2FwYWJpbGl0eSAoMTFkKSBFbmFibGUKKyoKKworV05JX0NGR18xMURfRU5BQkxFRCAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCisKKyoKKyogcGVyIGNoYW5uZWwgTWF4IHBvd2VyIHRyYW5zbWl0ICAoaW4gZEJtKQorKiB0aGlzIHBhcmFtZXRlciBjb3JyZXNwb25kIHRvIHRoZSBNQVhfQ09VTlRSWV9FSUQKKyogdGFibGUgb2YgKENoYW5uZWwgTnVtYmVyL251bSBjaGFubmVsL21heCB0eCBwb3dlcikKKyoKKyogVGhlcmUgaXMgb25lIHRhYmxlIGZvciA1R0h6IGNoYW5uZWxzIGFuZCBvbmUgdGFibGUgZm9yIDIuNEdIeiBjaGFubmVscworKgorCitXTklfQ0ZHX01BWF9UWF9QT1dFUl8yXzQgICAgUyAgICAxMjggICAgOAorViAgICBSVyAgICBOUAorTk9ORQorMyAgIDEgMTQgMjAKK1YgICAgUlcgICAgTlAKK05PTkUKKzMgICAxIDE0IDIwCisKK1dOSV9DRkdfTUFYX1RYX1BPV0VSXzUgICAgUyAgICAxMjggICAgOAorViAgICBSVyAgICBOUAorTk9ORQorMyAzNiAxMjYgMjAKK1YgICAgUlcgICAgTlAKK05PTkUKKzMgMzYgMTI2IDIwCisKKyoKKyogQ2VsbCBzaXplIGNvbmZpZ3VyYXRpb25zLiBUaGVzZSBhcmUgY2FubmVkIGNvbmZpZ3VyYXRpb25zIGZvciBhIHNwZWNpZmllZAorKiBjZWxsIHNpemUuCisqCitXTklfQ0ZHX05FVFdPUktfREVOU0lUWSAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUAorSEFMCiswICAgIDMgICAgMworViAgICBSVyAgICBOUAorSEFMCiswICAgIDMgICAgMAorCisjRU5VTSBMT1cgICAgICAwCisjRU5VTSBNRURJVU0gICAxCisjRU5VTSBISUdIICAgICAyCisjRU5VTSBBREFQVElWRSAzCisKKworKgorKiBBZGFwdGl2ZSBUaHJlc2hvbGQgQWxnb3JpdGhtCisqCitXTklfQ0ZHX0FEQVBUSVZFX1RIUkVTSE9MRF9BTEdPUklUSE0gICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAKK0hBTAorMSAgICAyICAgIDIKK1YgICAgUlcgICAgTlAKK0hBTAorMSAgICAyICAgIDIKKworI0VOVU0gQ0FSUklFUiAgICAgIDEKKyNFTlVNIENPUlJFTEFUSU9OICAyCisKKworCisqCisqIEN1cnJlbnQgVFggQW50ZW5uYQorKgorCitXTklfQ0ZHX0NVUlJFTlRfVFhfQU5URU5OQSAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUAorSEFMCisxICAgIDEgICAgMQorViAgICBSVyAgICBOUAorSEFMCisxICAgIDIgICAgMgorCisqCisqIEN1cnJlbnQgUlggQW50ZW5uYQorKgorCitXTklfQ0ZHX0NVUlJFTlRfUlhfQU5URU5OQSAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUAorSEFMCisxICAgIDIgICAgMgorViAgICBSVyAgICBOUAorSEFMCisxICAgIDMgICAgMworCisqCisqIEN1cnJlbnQgVFggUG93ZXIgTGV2ZWwKKyoKKworV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEyOCAgICAyNworViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxMjggICAgMjcKKworCisqCisKKworCisKKyogUGFyYW1ldGVyIHRvIGluZGljYXRlIG9yIG5vdCBuZXcgQlNTIGZvdW5kCisqCisKK1dOSV9DRkdfTkVXX0JTU19GT1VORF9JTkQgICAgICAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKK1YgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKKworCisqCisqIFF1YWxjb21tIFByb3AgUmF0ZXMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKKyoKK1dOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRCAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworCisqCisqIEFQIG5vZGUgTmFtZQorKgorCitXTklfQ0ZHX0FQX05PREVfTkFNRSAgICBTICAgIDMyICAgIDgKK05WICAgIFJPICAgIE5QCitOT05FCiswCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAKKworKgorKiBDb3VudHJ5IGNvZGUgKGZyb20gRUVQUk9NKQorKgorCitXTklfQ0ZHX0NPVU5UUllfQ09ERSAgICBTICAgIDMgICAgOAorViAgICBSVyAgICBOUAorTk9ORQorMAorViAgICBSVyAgICBOUAorTk9ORQorMyAweDExIDB4MjIgMHgzMworCisqCisqIFNwZWN0cnVtIE1hbmFnZW1lbnQgKDExaCkgZW5hYmxlL2Rpc2FibGUKKyoKKworV05JX0NGR18xMUhfRU5BQkxFRCAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDEKKworKgorKiBXYWl0IGZvciBDTkYgVGltZW91dC4gQ05GIGluY2x1ZGUgKFJFKUFTU09DLCBESVNBU1NPQywgQVVUSCwgREVBVVRILAorKiBEVU1NWSBwYWNrZXQKKyoKKworV05JX0NGR19XVF9DTkZfVElNRU9VVCAgICBJICAgIDQgICAgMTIKK1YgICBSVyAgICBOUAorTk9ORQorMTAgICAgMzAwMCAgIDEwMDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzEwICAgIDMwMDAgICAxMDAwCisKKyoKKyogUHJveGltaXR5LCBzZXQgaXQgZm9yIHZlcnkgc2hvcnQgZGlzdGFuY2VzCisqIFByb3htaXR5IHNldHRpbmcgaXMgYXBwbGllZCB2aWEgaGFsUGh5U2V0TndEZW5zaXR5KCkKKyoKKyogY2xvc2UgcHJveGltaXR5IG9mZiA9IGRlbnNpdHlPbiBpcyB0cnVlLiBuZXR3b3JrIGRlbnNpdHkgY29uZmlnIGFwcGxpZXMuCisqIGNsb3NlIHByb3hpbWl0eSBvbiA9IGRlbnNpdHlPbiBpcyBmYWxzZS4gRG9uJ3QgY2FyZSBhYm91dCBuZXR3b3JrIGRlbnNpdHkgY29uZmlnLgorKgorCitXTklfQ0ZHX1BST1hJTUlUWSAgICBJICAgIDQgICAgMTIKK1YgICBSVyAgICBOUAorSEFMCiswICAgMSAgICAwCitWICAgUlcgICAgTlAKK0hBTAorMCAgIDEgICAgMAorCisjRU5VTSBPRkYgICAgICAwCisjRU5VTSBPTiAgICAgICAxCisKKyoKKyogRGVmYXVsdCBMT0cgbGV2ZWwKKyoKKworV05JX0NGR19MT0dfTEVWRUwgICAgSSAgICA0ICAgIDEyCitWICAgUlcgICAgTlAKK05PTkUKKzAgICA3ICAgNAorViAgIFJXICAgIE5QCitOT05FCiswICAgNyAgIDQKKworKgorKiBPTEJDIGRldGVjdGlvbiB0aW1lb3V0CisqCisKK1dOSV9DRkdfT0xCQ19ERVRFQ1RfVElNRU9VVCAgICBJICAgIDQgICAgMTIKK1YgICBSVyAgICBOUAorTk9ORQorMTAwMCAgICAzMDAwMCAgIDEwMDAwCitWICAgIFJXICAgIE5QCitOT05FCisxMDAwICAgIDMwMDAwICAgMTAwMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQcm90ZWN0aW9uIEVuYWJsZQorKgorKkxPV0VSIGJ5dGUgZm9yIGFzc29jaWF0ZWQgc3RhdGlvbnMKKypVUFBFUiBieXRlIGZvciBvdmVybGFwcGluZyBzdGF0aW9ucy4KKyoxMWcgPT0+IHByb3RlY3Rpb24gZnJvbSAxMWcKKyoxMWIgPT0+IHByb3RlY3Rpb24gZnJvbSAxMWIKKyplYWNoIGJ5dGUgd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgaW5mbworKmJpdDcJICBiaXQ2CSBiaXQ1ICAgYml0NCBiaXQzICAgYml0MiAgYml0MSBiaXQwCisqcmVzZXJ2ZWQgcmVzZXJ2ZWQgUklGUyBMc2lnIG4tR0YgaHQyMCAxMWcgMTFiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRCAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTElNCiswICAgIDB4ZmZmZiAgICAweGZmZmYKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK0xJTQorMCAgICAweGZmZmYgICAgMHhmZmZmCisKKyNFTlVNIEZST01fbGxBIDAKKyNFTlVNIEZST01fbGxCIDEKKyNFTlVNIEZST01fbGxHIDIKKyNFTlVNIEhUXzIwIDMKKyNFTlVNIE5PTl9HRiA0CisjRU5VTSBMU0lHX1RYT1AgNQorI0VOVU0gUklGUyA2CisjRU5VTSBPQlNTIDcKKyNFTlVNIE9MQkNfRlJPTV9sbEEgOAorI0VOVU0gT0xCQ19GUk9NX2xsQiA5CisjRU5VTSBPTEJDX0ZST01fbGxHIDEwCisjRU5VTSBPTEJDX0hUMjAgMTEKKyNFTlVNIE9MQkNfTk9OX0dGIDEyCisjRU5VTSBPTEJDX0xTSUdfVFhPUCAxMworI0VOVU0gT0xCQ19SSUZTIDE0CisjRU5VTSBPTEJDX09CU1MgMTUKKworCisqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogMTFHIFByb3RlY3Rpb24gRW5hYmxlIEFsd2F5cworKiBWYWxpZCBvbmx5IGlmIHByb3RlY3Rpb24gaXMgZW5hYmxlZAorKiBmb3JjZXMgdXNlcyBvZiBwcm90ZWN0aW9uIHJlZ2FyZGxlc3Mgb2YgbGVnYWN5IHN0YXRpb25zCisqCisKK1dOSV9DRkdfMTFHX1BST1RFQ1RJT05fQUxXQVlTICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QICBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZvcmNlIHByb3RlY3Rpb24KKyogMCA6ICBkaXNhYmxlIHByb3RlY3Rpb24KKyogMSA6ICBDVFMKKyogMiA6ICBSVFMgYnkgdGhyZXNob2xkICh0aHJlc2hvbGQgbm9uemVybykKKyogMyA6ICBkdWFsIENUUyAobm90IHN1cHBvcnRlZCByaWdodCBub3cpCisqIDQgOiAgUlRTICh0aHJlc2hvbGQgMCkKKyogNSA6ICBhdXRvCisKK1dOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04gICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK0hBTAorMCAgICA1ICAgIDUKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK0hBTAorMCAgICA1ICAgIDUKKworI0VOVU0gRElTQUJMRSAgICAgICAgICAgICAgICAwCisjRU5VTSBDVFMgICAgICAgICAgICAgICAgICAgIDEKKyNFTlVNIFJUUyAgICAgICAgICAgICAgICAgICAgMgorI0VOVU0gRFVBTF9DVFMgICAgICAgICAgICAgICAzCisjRU5VTSBSVFNfQUxXQVlTICAgICAgICAgICAgIDQKKyNFTlVNIEFVVE8gICAgICAgICAgICAgICAgICAgNQorCisKKworCisKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogMTFHIFNob3J0IFByZWFtYmxlIEVuYWJsZQorKgorCitXTklfQ0ZHXzExR19TSE9SVF9QUkVBTUJMRV9FTkFCTEVEICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QICBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworKgorKiAxMUcgU2hvcnQgU2xvdCBUaW1lIEVuYWJsZSAoY2hhbmdlIHJlcXVpcmVzIHJlc3RhcnQpCisqIFRoaXMgaXMgdGhlIGFkbWluIHN0YXRlIG9mIHNob3J0IHNsb3Qgc3VwcG9ydC4KKworV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRUQgICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAxCitWICAgIFJXICAgIE5QICBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMQorCisqCisqIENhbGlicmF0aW9uIHBlcmlvZGljaXR5IChtaW51dGVzKQorKgorCitXTklfQ0ZHX0NBTF9QRVJJT0QgICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QCitIQUwKKzIgICAgMTAgICAgNQorViAgICBSVyAgICBOUAorSEFMCisyICAgIDEwICAgIDUKKworKgorKiBTdGF0aXN0aWNzIGNvbGxlY3Rpb24gcGVyaW9kaWNpdHkgKHNlY29uZHMpCisqCisKK1dOSV9DRkdfU1RBVFNfUEVSSU9EICAgIEkgICAgNCAgICAxMgorViAgICBSVyAgICBOUAorSEFMCisxICAgIDEwICAgIDEwCitWICAgIFJXICAgIE5QCitIQUwKKzEgICAgMTAgICAgMTAKKworKgorKiBDYWxpYnJhdGlvbiBvbi9vZmYgY29udHJvbAorKgorCitXTklfQ0ZHX0NBTF9DT05UUk9MICAgIEkgICAgNCAgICAxMgorViAgICBSVyAgICBOUAorSEFMCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDEgICAgMAorCisjRU5VTSBDQUxfT04gIDAKKyNFTlVNIENBTF9PRkYgMQorCisKKyoKKyogUGFyYW1ldGVyIHRvIGFsbG93IDExZyBvbmx5IFNUQXMgd2hpbGUgb3BlcmF0aW5nIGluIDExZyBtb2RlCisqCisKK1dOSV9DRkdfMTFHX09OTFlfUE9MSUNZICAgIEkgICAgNCAgICAxMgorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgIDAKKworKgorKiBQYWNrZXQgQ2xhc3NpZmljYXRpb24KKyogVGhpcyBmbGFnIGlzIGEgYml0bWFzayB1c2VkIHRvIGluZGljYXRlIHdoaWNoCisqIGZyYW1lIGNsYXNzaWZpZXIgdG8gYmUgZW5hYmxlZDoKKyogICAgYjA6IERTQ1AKKyogICAgYjE6IDgwMi4xUAorKgorCitXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTiAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAzICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAzICAgIDAKKworI0VOVU0gIERJU0FCTEVEICAwCisjRU5VTSAgRFNDUCAgICAgIDEKKyNFTlVNICA4MDIxUCAgICAgMgorI0VOVU0gIEFMTCAgICAgICAzCisKKyoKKyogV01FIEVuYWJsZWQgKGNoYW5nZSByZXF1aXJlcyByZXN0YXJ0KQorKgorCitXTklfQ0ZHX1dNRV9FTkFCTEVEICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAxCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAxCisKKyoKKyogQUREVFMgcmVzcG9uc2UgdGltZW91dCAoaW4gbXMpCisqCisKK1dOSV9DRkdfQUREVFNfUlNQX1RJTUVPVVQgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgMTAwMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAxMDAwCisKKworICogTWF4IFNQIExlbmd0aCBpbmRpY2F0ZXMgdGhlIG1heCBudW1iZXIgb2YKKyAqIHRvdGFsIGJ1ZmZlcmVkIE1TRFVzIGFuZCBNTVBEVXMgdGhlIFdNTSBBUAorICogbWF5IGRlbGl2ZXIgdG8gV01NIFNUQSBkdXJpbmcgYW55IHNlcnZpY2UgcGVyaW9kCisgKiB0cmlnZ2VyZWQgYnkgV01NIFNUQS4KKyAqIDEpIElmIEFQIHNlbmRzIFdNTSBJRSB3aXRoIHRoZSBVQVBTRCBiaXQgMCwgbWF4X3NwX2xlbmd0aD0wCisgKiAyKSBJZiBXTU0gU1RBJ3MgYWxsIDQgVUFQU0QgZmxhZyBhcmUgc2V0IHRvIDAsIG1heF9zcF9sZW5ndGg9MAorICogMykgSWYgQVAgc2VuZHMgV01NIElFIHdpdGggVUFQU0Q9MSwgYW5kIGF0IGxlYXN0IG9uZSBvZiBzdGF0aW9ucworICogICAgVUFQU0QgZmxhZyBpcyBzZXQgdG8gMSwgdGhlbiBtYXhfc3BfbGVuZ3RoIGNhbiBiZSBzZXQgdG86CisgKiAgICBbYjU6YjZdPTB4MDA6IFdNTSBBUCBtYXkgZGVsaXZlciBhbGwgYnVmZmVyZWQgZnJhbWVzCisgKiAgICBbYjU6YjZdPTB4MTA6IFdNTSBBUCBtYXkgZGVsaXZlciBtYXggMiBidWZmZXJlZCBmcmFtZXMKKyAqICAgIFtiNTpiNl09MHgwMTogV01NIEFQIG1heSBkZWxpdmVyIG1heCA0IGJ1ZmZlcmVkIGZyYW1lcworICogICAgW2I1OmI2XT0weDExOiBXTU0gQVAgbWF5IGRlbGl2ZXIgbWF4IDYgYnVmZmVyZWQgZnJhbWVzCisKK1dOSV9DRkdfTUFYX1NQX0xFTkdUSCAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDMgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAzICAgIDAKKworCisqCisqIEtFRVAgQUxJVkUgU1RBIExpbWl0IFRocmVzaG9sZCAsIHVzZWQgaW4gQVAgdG8gZGVsZXRlIHRoZSBTVEEKKyogICAgICAgZnJvbSBTdGF0aW9uIFRhYmxlIHdoaWNoIGRpZG4ndCByZXNwb25kIHRvIFByb2JlIFJlc3BvbnNlIE1lc3NhZ2VzCisqCisKK1dOSV9DRkdfS0VFUF9BTElWRV9TVEFfTElNSVRfVEhSRVNIT0xEIEkgICAgNCAgICA4CitOViAgICBSVyAgICBOUAorTk9ORQorMCAgICAzMiAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAzMiAgMAorCisqCisqIFBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHRvIHNlbmQgU1NJRAorKiBpbiBQcm9iZSBSZXNwb25zZSB3aGVuIFNTSUQgaXMgc3VwcHJlc3NlZAorKgorCitXTklfQ0ZHX1NFTkRfU0lOR0xFX1NTSURfQUxXQVlTICAgIEkgICAgNCAgICAxMgorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgIDAKKworKgorKiBXU00gRW5hYmxlZCAoY2hhbmdlIHJlcXVpcmVzIHJlc3RhcnQpCisqIFRha2VzIGVmZmVjdCBvbmx5IGlmIFdNRSBpcyBhbHNvIGVuYWJsZWQKKyoKKworV05JX0NGR19XU01fRU5BQkxFRCAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgIDAKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisKKworCisqIEJhY2tncm91bmQgQ2hhbm5lbCBMaXN0CisqICAgQ29udGFpbnMgcGFpcnMgb2Yge2NoYW5uZWxOdW1iZXIsIHNjYW5UeXBlfQorKiAgIHdoZXJlIHNjYW5UeXBlID0gMCBpbmRpY2F0ZXMgYWN0aXZlIHNjYW4gYW5kCisqICAgICAgICAgICAgICAgICAgPSAxIGluZGljYXRlcyBwYXNzaXZlIHNjYW4KKyoKKyoKKypXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9MSVNUICAgIFMgICAgMTI4ICAgIDgKKypWICAgIFJXICAgIE5QIFJFU1RBUlQKKypMSU0KKyo2MCAgIDM2IDAgNDAgMCA0NCAwIDQ4IDAgNTIgMCA1NiAwIDYwIDAgNjQgMCAxIDAgNiAwIDExIDAgMzQgMCAzOCAwIDQyIDAgNDYgMCAyIDAgMyAwIDQgMCA1IDAgNyAwIDggMCA5IDAgMTAgMCAxMiAwIDEzIDAgMTQgMCAxNDkgMCAxNTMgMCAxNTcgMCAxNjEgMAorKlYgICAgUlcgICAgTlAgUkVTVEFSVAorKkxJTQorKjYwICAgMSAwIDIgMCAzIDAgNCAwIDUgMCA2IDAgNyAwIDggMCA5IDAgMTAgMCAxMSAwIDEyIDAgMTMgMCAxNCAwIDM0IDAgMzYgMCAzOCAwIDQwIDAgNDIgMCA0NCAwIDQ2IDAgNDggMCA1MiAwIDU2IDAgNjAgMCA2NCAwIDE0OSAwIDE1MyAwIDE1NyAwIDE2MSAwCisqCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBFRENBIHBhcmFtdGVycyBhcmUgY29udGFpbmVkIGluIHByb2ZpbGVzIC0gZWFjaCBwcm9maWxlIGNvbnRhaW5zCisqIHRoZSBwYXJhbWV0ZXJzIFtBQ00sIEFJRlNOLCBDV21pbiwgQ1dtYXgsIFR4T3BdIGZvciBmb3VyCisqIGFjY2VzcyBjYXRlZ29yaWVzIChpLmUuLCBmb3VyIHNldHMpLiBUd28gc3VjaCBzZXRzIG9mIGZvdXIgcGFyYW1ldGVycworKiBtYWtlIGEgc2luZ2xlIHByb2ZpbGU6IE9uZSBzZXQgaXMgdXNlZCBsb2NhbGx5IGJ5IHRoZSBBUCwgdGhlIG90aGVyIHNldAorKiBpcyBicm9hZGNhc3QgZm9yIHVzZSBieSBzdGF0aW9ucy4KKyoKKyogQ3dtaW4gYW5kIEN3bWF4IGFyZSB0d28gYnl0ZXMgZWFjaCwgTVNCIGZpcnN0LiBTbyBDd21pbiBvZiBbMyAyNTVdIGlzCisqIGVxdWl2YWxlbnQgdG8gMHgzZmYsIGkuZS4gMyoyNTYrMjU1PTEwMjMKKyoKKyogVGhlIHByb2ZpbGUgdG8gdXNlIGlzIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSB2YWx1cyBvZiB0aGUgcHJvZmlsZSBzZWxlY3QgcGFyYW0KKyogU2VlIEVOVU1zIGJlbG93IGZvciBkZWZpbml0aW9ucyBvZiBwcm9maWxlIHZhbHVlcworKgorCitXTklfQ0ZHX0VEQ0FfUFJPRklMRSAgICBJICAgNCAgIDgKK1YgICBSVyAgTlAKK1NDSAorMCAgIDI1NSAgIDEKK1YgICBSVyAgTlAKK1NDSAorMCAgIDI1NSAgIDEKKworI0VOVU0gQU5JICAgICAgMAorI0VOVU0gV01NICAgICAgMQorI0VOVU0gVElUX0RFTU8gMgorI0VOVU0gTUFYICAgICAgMworCisjRU5VTSBBQ01fSURYICAgIDAKKyNFTlVNIEFJRlNOX0lEWCAgMQorI0VOVU0gQ1dNSU5BX0lEWCAyCisjRU5VTSBDV01BWEFfSURYIDQKKyNFTlVNIFRYT1BBX0lEWCAgNgorI0VOVU0gQ1dNSU5CX0lEWCA3CisjRU5VTSBDV01BWEJfSURYIDkKKyNFTlVNIFRYT1BCX0lEWCAgMTEKKyNFTlVNIENXTUlOR19JRFggMTIKKyNFTlVNIENXTUFYR19JRFggMTQKKyNFTlVNIFRYT1BHX0lEWCAgMTYKKworCisqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUHJvZmlsZSAwIChBaXJnbykgcGFyYW1ldGVycyAtIEFDX0JLIExvY2FsCisqIEFDTSwgQUlGU04sIFtDV21pbkgsIENXbWluTCwgQ1dtYXhILCBDV21heEwsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTCAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAzMSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAzMSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorCisqCisqIFByb2ZpbGUgMCAoQWlyZ28pIHBhcmFtZXRlcnMgQUNfQkUgTG9jYWwKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAxNSAgMyAyNTUgIDEwMCAgICAwIDMxICAzIDI1NSAgMTAwICAgMCAxNSAgMyAyNTUgIDEwMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgMTUgIDMgMjU1ICAxMDAgICAgMCAzMSAgMyAyNTUgIDEwMCAgIDAgMTUgIDMgMjU1ICAxMDAKKworKgorKiBQcm9maWxlIDAgKEFpcmdvKSBwYXJhbWV0ZXJzIEFDX1ZJIExvY2FsCisqIEFDTSwgQUlGU04sIFtDV21pbiwgQ1dtYXgsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9BTklfQUNWSV9MT0NBTCAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgNyAgMCAxNSAgMjAwICAgMCAxNSAgMCAzMSAgMTg4ICAgMCA3ICAwIDE1ICAyMDAKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDIgICAwIDcgIDAgMTUgIDIwMCAgIDAgMTUgIDAgMzEgIDE4OCAgIDAgNyAgMCAxNSAgMjAwCisKKyoKKyogUHJvZmlsZSAwIChBaXJnbykgcGFyYW1ldGVycyBBQ19WTyBMb2NhbAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfQU5JX0FDVk9fTE9DQUwgICBTICAgMjAgIDgKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDIgICAwIDMgIDAgNyAgMTAwICAgMCA3ICAwIDE1ICAxMDIgICAwIDMgIDAgNyAgMTAwCitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAzICAwIDcgIDEwMCAgIDAgNyAgMCAxNSAgMTAyICAgMCAzICAwIDcgIDEwMAorCisqCisqIFByb2ZpbGUgMCAoQWlyZ28pIHBhcmFtZXRlcnMgLSBBQ19CSyBCcm9hZGNhc3QKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX0FOSV9BQ0JLICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCA3ICAgMCAxNSAgMyAyNTUgIDAgICAwIDMxICAzIDI1NSAgMCAgIDAgMTUgIDMgMjU1ICAwCitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCA3ICAgMCAxNSAgMyAyNTUgIDAgICAwIDMxICAzIDI1NSAgMCAgIDAgMTUgIDMgMjU1ICAwCisKKyoKKyogUHJvZmlsZSAwIChBaXJnbykgcGFyYW1ldGVycyBBQ19CRSBCcm9hZGNhc3QKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX0FOSV9BQ0JFICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAxNSAgMyAyNTUgIDEwMCAgIDAgMzEgIDMgMjU1ICAxMDAgICAwIDE1ICAzIDI1NSAgMTAwCitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAxNSAgMyAyNTUgIDEwMCAgIDAgMzEgIDMgMjU1ICAxMDAgICAwIDE1ICAzIDI1NSAgMTAwCisKKyoKKyogUHJvZmlsZSAwIChBaXJnbykgcGFyYW1ldGVycyBBQ19WSSBCcm9hZGNhc3QKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX0FOSV9BQ1ZJICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCA3ICAwIDE1ICAyMDAgICAwIDE1ICAwIDMxICAxODggICAwIDcgIDAgMTUgIDIwMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgNyAgMCAxNSAgMjAwICAgMCAxNSAgMCAzMSAgMTg4ICAgMCA3ICAwIDE1ICAyMDAKKworKgorKiBQcm9maWxlIDAgKEFpcmdvKSBwYXJhbWV0ZXJzIEFDX1ZPIEJyb2FkY2FzdAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfQU5JX0FDVk8gICBTICAgMjAgIDgKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDIgICAwIDMgIDAgNyAgMTAwICAgMCA3ICAwIDE1ICAxMDIgICAwIDMgIDAgNyAgMTAwCitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAzICAwIDcgIDEwMCAgIDAgNyAgMCAxNSAgMTAyICAgMCAzICAwIDcgIDEwMAorCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQcm9maWxlIDEgKFdNRSkgcGFyYW1ldGVycyAtIEFDX0JLIExvY2FsCisqIEFDTSwgQUlGU04sIFtDV21pbiwgQ1dtYXgsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9XTUVfQUNCS19MT0NBTCAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAzMSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAxNSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorCisKKyoKKyogUHJvZmlsZSAxIChXTUUpIHBhcmFtZXRlcnMgQUNfQkUgTG9jYWwKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX1dNRV9BQ0JFX0xPQ0FMICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAzICAgMCAxNSAgMCA2MyAgMCAgIDAgMzEgIDMgMjU1ICAwICAgMCAxNSAgMCA2MyAgMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMyAgIDAgMTUgIDAgNjMgIDAgICAwIDE1ICAwIDYzICAwICAgMCAxNSAgMCA2MyAgMAorCisqCisqIFByb2ZpbGUgMSAoV01FKSBwYXJhbWV0ZXJzIEFDX1ZJIExvY2FsCisqIEFDTSwgQUlGU04sIFtDV21pbiwgQ1dtYXgsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9XTUVfQUNWSV9MT0NBTCAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMSAgMCA3ICAwIDE1ICA5NCAgMCA3ICAwIDE1ICAxODggICAwIDcgIDAgMTUgIDk0CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAxICAwIDcgIDAgMTUgIDk0ICAwIDcgIDAgMTUgIDE4OCAgIDAgNyAgMCAxNSAgOTQKKworKgorKiBQcm9maWxlIDEgKFdNRSkgcGFyYW1ldGVycyBBQ19WTyBMb2NhbAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfV01FX0FDVk9fTE9DQUwgICBTICAgMjAgIDgKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDEgICAwIDMgIDAgNyAgNDcgICAwIDMgIDAgNyAgMTAyICAgMCAzICAwIDcgIDQ3CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAxICAgMCAzICAwIDcgIDQ3ICAgMCAzICAwIDcgIDEwMiAgIDAgMyAgMCA3ICA0NworCisqCisqIFByb2ZpbGUgMSAoV01FKSBwYXJhbWV0ZXJzIC0gQUNfQksgQnJvYWRjYXN0CisqIEFDTSwgQUlGU04sIFtDV21pbiwgQ1dtYXgsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9XTUVfQUNCSyAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAxNSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAxNSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorCisqCisqIFByb2ZpbGUgMSAoV01FKSBwYXJhbWV0ZXJzIEFDX0JFIEJyb2FkY2FzdAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfV01FX0FDQkUgICBTICAgMjAgIDgKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDMgICAwIDE1ICAzIDI1NSAgMCAgIDAgMTUgIDMgMjU1ICAwICAgMCAxNSAgMyAyNTUgIDAKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDMgICAwIDE1ICAzIDI1NSAgMCAgIDAgMTUgIDMgMjU1ICAwICAgMCAxNSAgMyAyNTUgIDAKKworKgorKiBQcm9maWxlIDEgKFdNRSkgcGFyYW1ldGVycyBBQ19WSSBCcm9hZGNhc3QKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX1dNRV9BQ1ZJICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCA3ICAwIDE1ICA5NCAgIDAgNyAgMCAxNSAgMTg4ICAgMCA3ICAwIDE1ICA5NAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgNyAgMCAxNSAgOTQgICAwIDcgIDAgMTUgIDE4OCAgIDAgNyAgMCAxNSAgOTQKKworKgorKiBQcm9maWxlIDEgKFdNRSkgcGFyYW1ldGVycyBBQ19WTyBCcm9hZGNhc3QKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX1dNRV9BQ1ZPICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAzICAwIDcgIDQ3ICAgMCAzICAwIDcgIDEwMiAgIDAgMyAgMCA3ICA0NworViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgMyAgMCA3ICA0NyAgIDAgMyAgMCA3ICAxMDIgICAwIDMgIDAgNyAgNDcKKworKgorKiBSYWRhciBkZXRlY3RvciBmbGFnIGVuYWJsZS9kaXNhYmxlCisqCisKK1dOSV9DRkdfUkRFVF9GTEFHICAgSSAgIDQgICA5CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKKworI0VOVU0gRU5BQkxFICAxCisjRU5VTSBESVNBQkxFIDAKKworV05JX0NGR19SQURBUl9DSEFOTkVMX0xJU1QgICAgUyAgICAyMCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzE1ICAgNTIgNTYgNjAgNjQgMTAwIDEwNCAxMDggMTEyIDExNiAxMjAgMTI0IDEyOCAxMzIgMTM2IDE0MAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCisxNSAgIDUyIDU2IDYwIDY0IDEwMCAxMDQgMTA4IDExMiAxMTYgMTIwIDEyNCAxMjggMTMyIDEzNiAxNDAKKworKgorKiBMb2NhbCBQb3dlciBDb25zdHJhaW50IChkQm0pCisqCisKK1dOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAyNTUgICAgMAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDI1NSAgICAwCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEFkbWlzc2lvbiBDb250cm9sIFBvbGljeQorKiB1c2VkIGZvciBhZG1pdHRpbmcgdHNwZWMncyB3aGVuIGVpdGhlciBlZGNhIG9yIGhjY2EgYXJlIGluIHVzZQorKgorCitXTklfQ0ZHX0FETUlUX1BPTElDWSAgSSAgIDQgICA4CitWICBSVyAgTlAgIFJFU1RBUlQKK05PTkUKKzAgIDIgICAwCitWICBSVyAgTlAKK1NDSAorMCAgMiAgIDAKKworI0VOVU0gIEFETUlUX0FMTCAgIDAKKyNFTlVNICBSRUpFQ1RfQUxMICAxCisjRU5VTSAgQldfRkFDVE9SICAgMgorCisqCisqIE92ZXJzdWJzY3JpcHRpb24gZmFjdG9yIGZvciBhZG1pc3Npb24gY29udHJvbAorKiB2YWxpZCBvbmx5IHdoZW4gYWRtaXQgcG9saWN5IGlzIHNldCB0byBCV19GQUNUT1IKKyogdW5pdHMgYXJlIGluIHRlcm1zIG9mIDEvMTB0aCBvZiBhdmFpbGFibGUgYmFuZHdpZHRoCisqCisKK1dOSV9DRkdfQURNSVRfQldGQUNUT1IgIEkgICA0ICAgOAorViAgUlcgIE5QICBSRVNUQVJUCitOT05FCiswICAxMDAgICAyMAorViAgUlcgIE5QCitTQ0gKKzAgIDEwMCAgIDIwCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE51bWJlciBvZiAiY29uc2VjdXRpdmUiIEJhY2tncm91bmQgU2NhbiBGYWlsdXJlIG5lZWRlZAorKiBiZWZvcmUgTElNIGlzIGZvcmNlZCB0byBwZXJmb3JtIDEgYWdncmVzc2l2ZSBiYWNrZ3JvdW5kIHNjYW4KKyoKK1dOSV9DRkdfTUFYX0NPTlNFQ1VUSVZFX0JBQ0tHUk9VTkRfU0NBTl9GQUlMVVJFICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QICBSRVNUQVJUCitOT05FCiswICAgIDI1NiAgICA2MAorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTk9ORQorMCAgICAyNTYgICAgNjAKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZlYXR1cmU6ICAgQ2hhbm5lbCBCb25kaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICBHbG9iYWwgZmxhZyB0byBlbmFibGUvZGlzYWJsZSBDaGFubmVsIEJvbmRpbmcKKyogIDAgLSBEaXNhYmxlOiAgICAgICBGb3JjZSBkaXNhYmxlIGNoYW5uZWwgYm9uZGluZyBmb3IgYWxsIFRDLWlkcworKiAgMSAtIEVuYWJsZTogICAgICAgIEZvcmNlIGVuYWJsZSBjaGFubmVsIGJvbmRpbmcgZm9yIGFsbCBUQy1pZHMKKyogIDIgLSBubyBsZWdhY3kgYnNzOiBFbmFibGUgY2hhbm5lbCBib25kaW5nIGlmIG5vIGxlZ2FjeSBCU1MgYXJlIHByZXNlbnQKKyogIDMgLSBubyBsZWdhY3kgYWxsOiBFbmFibGUgY2hhbm5lbCBib25kaW5nIGlmIG5vIGxlZ2FjeSBCU1Mgb3IgZGV2aWNlcyBhcmUgcHJlc2VudAorKiAgNCAtIGludGVsbGlnZW50OiAgIEVuYWJsZSBjaGFubmVsIGJvbmRpbmcgZGVwZW5kaW5nIG9uIGxvYWQgbGV2ZWwgb24gc2Vjb25kYXJ5IGNoYW5uZWwKKyoKK1dOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREUgICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK0xJTQorMCAgICAxMCAgICAgMAorViAgICBSVyAgICBOUCAgICBSRVNUQVJUCitMSU0KKzAgICAgMTAgICAgIDAKKworI0VOVU0gRElTQUJMRSAgICAgICAgICAwCisjRU5VTSBFTkFCTEUgICAgICAgICAgIDEKKyNFTlVNIElGX05PX0xFR0FDWV9CU1MgMgorI0VOVU0gSUZfTk9fTEVHQUNZX0FMTCAzCisjRU5VTSBJTlRFTExJR0VOVCAgICAgIDQKKworCisqCisqICBXaGVuIHRoZSBjaGFubmVsIGlzIDQwTUh6IHdpZGUsIHRoaXMgQ0ZHIGluZGljYXRlcworKiAgaWYgdGhlIHNlY29uZGFyeSBjaGFubmVsIGlzIGxvY2F0ZWQgYWJvdmUgKGF0CisqICBhIGhpZ2hlciBmcmVxdWVuY3kpLCBvciBsb2NhdGVkIGJlbG93IChhdCBhCisqICBsb3dlciBmcmVxdWVuY3kpLgorKgorKiAgMCAtIFRoZXJlIGlzIG5vIHNlY29uZGFyeSBjaGFubmVsLiBUaGUgY2hhbm5lbCBpcyAyME1oegorKiAgMSAtIExPV0VSOiAgU2Vjb25kYXJ5IGNoYW5uZWwgNDBNSFogaXMgbG9jYXRlZCBiZWxvdyB0aGUgcHJpbWFyeSBjaGFubmVsCisqICAyIC0gQ0VOVEVSRUQ6U2Vjb25kYXJ5IGNoYW5uZWwgYW5kIHByaW1hcnkgbG9jYXRlZCBhdCBjZW50ZXJlZAorKiAgMyAtIEhJR0hFUjogU2Vjb25kYXJ5IGNoYW5uZWwgNDAgTUhaIGlzIGxvY2F0ZWQgYWJvdmUgdGhlIHByaW1hcnkgY2hhbm5lbAorKiAgNCAtIDgwTUhaX0xPV19DRU5URVJFRCA6IDIwLzQwTUhaIG9mZnNldCBMT1cgNDAvODBNSFogb2Zmc2V0IENFTlRFUkVECisqICA1IC0gODBNSFpfQ0VOVEVSRURfQ0VOVEVSRUQgOiAyMC80ME1IWiBvZmZzZXQgQ0VOVEVSRUQgNDAvODBNSFogb2Zmc2V0IENFTlRFUkVECisqICA2IC0gODBNSFpfSElHSF9DRU5URVJFRCA6IDIwLzQwTUhaIG9mZnNldCBISUdIIDQwLzgwTUhaIG9mZnNldCBDRU5URVJFRAorKiAgNyAtIDgwTUhaX0xPV19MT1c6IDIwLzQwTUhaIG9mZnNldCBMT1cgNDAvODBNSFogb2Zmc2V0IExPVworKiAgOCAtIDgwTUhaX0hJR0hfTE9XOiAyMC80ME1IWiBvZmZzZXQgSElHSCA0MC84ME1IWiBvZmZzZXQgTE9XCisqICA5IC0gODBNSFpfTE9XX0hJR0g6IDIwLzQwTUhaIG9mZnNldCBMT1cgNDAvODBNSFogb2Zmc2V0IEhJR0gKKyogIDEwIC0gODBNSFpfSElHSF9ISUdIOiAyMC80ME1IWiBvZmZzZXQgSElHSCA0MC84ME1IWiBvZmZzZXQgSElHSAorKgorV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURSAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMTAgICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMTAgICAgIDAKKworI0VOVU0gTk9ORSAgICAgICAgICAgICAwCisjRU5VTSBMT1dFUiAgICAgICAgICAgIDEKKyNFTlVNIEhJR0hFUiAgICAgICAgICAgMgorI0VOVU0gMTFBQ18yME1IWl9MT1dfNDBNSFpfQ0VOVEVSRUQgICAgICAgMworI0VOVU0gMTFBQ18yME1IWl9DRU5URVJFRF80ME1IWl9DRU5URVJFRCAgNAorI0VOVU0gMTFBQ18yME1IWl9ISUdIXzQwTUhaX0NFTlRFUkVEICAgICAgNQorI0VOVU0gMTFBQ18yME1IWl9MT1dfNDBNSFpfTE9XICAgICAgICAgICAgNgorI0VOVU0gMTFBQ18yME1IWl9ISUdIXzQwTUhaX0xPVyAgICAgICAgICAgNworI0VOVU0gMTFBQ18yME1IWl9MT1dfNDBNSFpfSElHSCAgICAgICAgICAgOAorI0VOVU0gMTFBQ18yME1IWl9ISUdIXzQwTUhaX0hJR0ggICAgICAgICAgOQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZlYXR1cmU6ICAgRHluYW1pYyBSZXRyeSBSYXRlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgV2hlbiB0aGUgc2hvcnQvbG9uZyByZXRyeSBjb3VudCByZWFjaCB0aGUKKyogIGFkYXB0aXZlX3JldHJ5X3RocmVzaG9sZCgwKSwgdGhlbiB0aGUgcmV0cnkwCisqICB0ZW1wbGF0ZSBzaGFsbCBiZSB1c2VkCisqCitXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk8gICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICAyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICAyCisKKyoKKyogIFdoZW4gdGhlIHNob3J0L2xvbmcgcmV0cnkgY291bnQgcmVhY2ggdGhlCisqICBhZGFwdGl2ZV9yZXRyeV90aHJlc2hvbGQoMSksIHRoZW4gdGhlIHJldHJ5MQorKiAgdGVtcGxhdGUgc2hhbGwgYmUgdXNlZAorKgorV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9PTkUgICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA0CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA0CisKKyoKKyogIFdoZW4gdGhlIHNob3J0L2xvbmcgcmV0cnkgY291bnQgcmVhY2ggdGhlCisqICBhZGFwdGl2ZV9yZXRyeV90aHJlc2hvbGQoMiksIHRoZW4gdGhlIHJldHJ5MgorKiAgdGVtcGxhdGUgc2hhbGwgYmUgdXNlZAorKgorV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV08gICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA2CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA2CisKKworKgorKiAgVHJpZ2dlciBTdGF0aW9uIEJhY2tncm91bmQgU2NhbiBGbGFnCisqCitXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU4gICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAxCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNvbnRyb2wgb2YgZHluYW1pYyBFRENBIHBhcmFtZXRlciBwcm9maWxlIHN3aXRjaGluZworKgorKiBPT0IsIHdlIHdvdWxkIGxpa2UgdG8gc3VwcG9ydCBXTU0gc3RhbmRhcmQgZWRjYSBwcm9maWxlCisqIEhvd2V2ZXIsIHdoZW4gQWlyZ28gU1RBJ3Mgam9pbiB0aGUgQlNTLCB3ZSB3b3VsZCBsaWtlCisqIHRvIHN3aXRjaCB0aGUgcHJvZmlsZSB0byBBaXJnbyBoaWdoLXBlcmZvcm1hbmNlICBlZGNhIHBhcmFtZXRlcnMKKyoKKyogVGhpcyBjZmcgc3VwcG9ydHMgdGhhdCBiZWhhdmlvdXIuIEl0IGlzIHVzZWQgb25seSBpZiAxMWUgcW9zCisqIGhhcyBiZWVuIGVuYWJsZWQgYW5kIGlzIGlnbm9yZWQgb3RoZXJ3aXNlLgorKgorKiBXaGVuIHNldCB0byBhbnkgdmFsdWUgKG90aGVyIHRoYW4gdW51c2VkKSwgaXQgZGV0ZXJtaW5lcyB0aGUKKyogZWRjYSBwcm9maWxlIHRvIHN3aXRjaCB0byB3aGVuIGFuIEFpcmdvIFNUQSBqb2lucyB0aGUgQlNTLgorKgorKiBCeSBkZWZhdWx0LCB3ZSBjaG9vc2UgdG8gc3dpdGNoIHRvIEFpcmdvIHByb2ZpbGUuCisqCisqIE5PVEU6IFRoaXMgcGFyYW1ldGVyIGFwcGxpZXMgb25seSB0byBhbiBBUAorKgorCitXTklfQ0ZHX0RZTkFNSUNfUFJPRklMRV9TV0lUQ0hJTkcgICAgSSAgIDQgICA4CitWICAgUlcgIE5QICBSRVNUQVJUCitOT05FCiswICAgMjU1ICAgMjU1CitWICAgUlcgIE5QICAgUkVTVEFSVAorTk9ORQorMCAgIDI1NSAgIDEKKworI0VOVU0gIFVOVVNFRCAyNTUKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogU2NhbiBjb250cm9sIGxpc3QKKyogICBDb250YWlucyBwYWlycyBvZiB7Y2hhbm5lbE51bWJlciwgYWN0aXZlU2NhbkFsbG93ZWRGbGFnfQorKiAgIHdoZXJlIHNjYW5UeXBlID0gMSBpbmRpY2F0ZXMgYWN0aXZlIHNjYW4gaXMgIGFsbG93ZWQsIGFuZAorKiAgICAgICAgICAgICAgICAgID0gMCBpbmRpY2F0ZXMgcGFzc2l2ZSBzY2FuIGlzIHVzZWQKKyogICBJZiBhIGNoYW5uZWwgaXMgbm90IG9uIHRoaXMgbGlzdCwgYWN0aXZlIHNjYW4gaXMgTk9UIGFsbG93ZWQuIFNvIGl0IGlzCisqICAgc3VmZmljaWVudCB0byBpbmx1ZGUgb25seSB0aG9zZSBjaGFubmVscyB3aGVyZSBhY3RpdmUgc2NhbiBpcyBhbGxvd2VkCisqICAgb24gdGhpcyBsaXN0LgorKgorKiAgIFRoZSBsaXN0IGRldGVybWluZXMgb25seSB3aGV0aGVyIGFjdGl2ZSBzY2FuIGlzIGFsbG93ZWQgb3Igbm90OyBpdCBkb2VzIG5vdAorKiAgIGRldGVybWluZSB3aGljaCB0eXBlIG9mIHNjYW4gaXMgYWN0dWFsbHkgcGVyZm9ybWVkLgorKgorCitXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNUICAgIFMgICAgMTI4ICAgIDgKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTElNCisxMTIgICAxIDEgMiAxIDMgMSA0IDEgNSAxIDYgMSA3IDEgOCAxIDkgMSAxMCAxIDExIDEgMTIgMSAxMyAxIDE0IDEgMzQgMSAzNiAxIDM4IDEgNDAgMSA0MiAxIDQ0IDEgNDYgMSA0OCAxIDUwIDEgNTIgMCA1NCAwIDU2IDAgNTggMCA2MCAwIDYyIDAgNjQgMCAxMDAgMCAxMDQgMCAxMDggMCAxMTIgMCAxMTYgMCAxMjAgMCAxMjQgMCAxMjggMCAxMzIgMCAxMzYgMCAxNDAgMCAxNDkgMSAxNTEgMSAxNTMgMSAxNTUgMSAxNTcgMSAxNTkgMSAxNjEgMSAxNjUgMSAyNDAgMSAyNDIgMSAyNDQgMSAyNDYgMSAyNDggMSAyNTAgMSAyNTIgMQorViAgICBSVyAgICBOUCBSRVNUQVJUCitMSU0KKzExMiAgIDEgMSAyIDEgMyAxIDQgMSA1IDEgNiAxIDcgMSA4IDEgOSAxIDEwIDEgMTEgMSAxMiAxIDEzIDEgMTQgMSAzNCAxIDM2IDEgMzggMSA0MCAxIDQyIDEgNDQgMSA0NiAxIDQ4IDEgNTAgMSA1MiAwIDU0IDAgNTYgMCA1OCAwIDYwIDAgNjIgMCA2NCAwIDEwMCAwIDEwNCAwIDEwOCAwIDExMiAwIDExNiAwIDEyMCAwIDEyNCAwIDEyOCAwIDEzMiAwIDEzNiAwIDE0MCAwIDE0OSAxIDE1MSAxIDE1MyAxIDE1NSAxIDE1NyAxIDE1OSAxIDE2MSAxIDE2NSAxIDI0MCAxIDI0MiAxIDI0NCAxIDI0NiAxIDI0OCAxIDI1MCAxIDI1MiAxCisKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE1JTU8gcmF0ZXMgZW5hYmxlZCAoZm9yIHJhdGUgYWRhcHRhdGlvbiwgdG8gc3RhcnQpCisqCisKK1dOSV9DRkdfTUlNT19FTkFCTEVEICAgSSAgIDQgICA5CitWICAgIFJXICAgIE5QIFJFTE9BRAorTk9ORQorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAgUkVMT0FECitOSU0KKzAgICAgMSAgICAxCisKKyNFTlVNIEVOQUJMRSAgMQorI0VOVU0gRElTQUJMRSAwCisKKworCisqCisqIEJMT0NLIEFDSyBFbmFibGVkIChjaGFuZ2UgcmVxdWlyZXMgcmVzdGFydCkKKyogIGNoYW5nZSBkZWZhdWx0IHRvIE9OCisqICAgYml0IDAJPT0+IGRlbGF5ZWQgQkEKKyogICBiaXQgMQk9PT4gaW1tZWRpYXRlIEJBCitXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK0xJTQorMCAgICAzICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTElNCiswICAgIDMgICAgMAorCisjRU5VTSBERUxBWUVEIDAKKyNFTlVNIElNTUVESUFURSAxCisKKworKgorKkJBIEFjdGl2aXR5IGNoZWNrIGdsb2JhbCB0aW1lcgorKgorV05JX0NGR19CQV9BQ1RJVklUWV9DSEVDS19USU1FT1VUICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMTAwMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDEwMDAKKworCisqCisqIFJ4IFNUQkMgc3VwcG9ydAorKgorV05JX0NGR19IVF9SWF9TVEJDICBJCTQgICA3CitWICAgIFJXICAgIE5QICAgUkVTVEFSVAorTElNCiswCTMJMQorViAgICBSVyAgICBOUCAgIFJFU1RBUlQKK0xJTQorMAkzCTEKKworCisqCisqIDEuIEhUIGNhcGFiaWxpdGllcyBJbmZvOiAyIGJ5dGVzIHNpemUKKyoKKyogU3VwcG9ydGVkIGNoYW5uZWwgV2lkdGggaXMgc2V0IHRvIDEgKDQwIE1oeikKKyogU00gUG93ZXIgU2F2ZSBpcyBkaXNhYmxlZC4KKyogR3JlZW5GaWVsZCBzdXBwb3J0IGlzIGVuYWJsZWQuCisqIFNob3J0IEdJIGZvciAyMCBhbmQgNDBNaHogaXMgZW5hYmxlZC4KKyogTWF4IEFNU0RVIFNpemUgaXMgc2V0IHRvIDAoMzgzOSBPY3RldHMpCisqIERTU1MtQ0NLIE1vZGUgaXMgZW5hYmxlZC4KKyogTFNJRyBUWE9QIFByb3RlY3Rpb24gaXMgZGlzYWJsZWQKKyogUmVzdCBvZiB0aGUgZmVhdHVyZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyBtb21lbnQuCisqCisqIGZlZGMgYmE5OCA3NjU0IDMyMTAKKyogMDAwMCAwMDAxIDAwMTAgMDAwMAorKgorV05JX0NGR19IVF9DQVBfSU5GTyAgIEkgICAgNCAgICAxMAorViAgICBSVyAgICBOUCAgICAgICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZmZmICAgIDB4MDE2YworViAgICBSVyAgICBOUCAgICAgICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZmZmICAgIDB4MTA2ZQorCisjRU5VTSBBRFZBTkNFX0NPRElORyAgICAgICAgICAgIDAKKyNFTlVNIFNVUFBPUlRFRF9DSEFOX1dJRFRIX1NFVCAgMQorI0VOVU0gU01fUE9XRVJfU0FWRSAgICAgICAgICAgICAyCisjRU5VTSBHUkVFTl9GSUVMRCAgICAgICAgICAgICAgIDQKKyNFTlVNIFNIT1JUX0dJXzIwTUhaICAgICAgICAgICAgNQorI0VOVU0gU0hPUlRfR0lfNDBNSFogICAgICAgICAgICA2CisjRU5VTSBUWF9TVEJDICAgICAgICAgICAgICAgICAgIDcKKyNFTlVNIFJYX1NUQkMgICAgICAgICAgICAgICAgICAgOAorI0VOVU0gREVMQVlFRF9CQSAgICAgICAgICAgICAgIDEwCisjRU5VTSBNQVhfQU1TRFVfU0laRSAgICAgICAgICAgMTEKKyNFTlVNIERTU1NfQ0NLX01PREVfNDBNSFogICAgICAxMgorI0VOVU0gUFNNUCAgICAgICAgICAgICAgICAgICAgIDEzCisjRU5VTSBTVEJDX0NPTlRST0xfRlJBTUUgICAgICAgMTQKKyNFTlVNIExTSUdfVFhPUF9QUk9URUNUSU9OICAgICAxNQorCisqCisqIDIuIEhUIFBhcmFtZXRlcnMgSW5mbzogMSBieXRlIHNpemUKKyoKKyogTWF4IEFNUERVIFJ4IEZhY3RvciBpcyBkZWZpbmVkIHVzaW5nIGJpdCAjMCBhbmQgIzEKKyogTVBEVSBEZW5zaXR5IGlzIGRlZmluZWQgdXNpbmcgYml0ICMyIHRocnUgIzQuCisqIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUsCisqIDc2NTQgMzIxMAorKiAwMDAwIDAwMTAgIC0tPiAyIGZvciBSWCBBTVBEVSBGYWN0b3IsIDAgZm9yIE1QRFUgZGVuc2l0eQorKgorV05JX0NGR19IVF9BTVBEVV9QQVJBTVMgICAgSSAgIDQgICA3CitWICAgIFJXICAgTlAgICAgICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmYgICAgMHgwMAorViAgICBSVyAgIE5QICAgICAgIFJFU1RBUlQKK0xJTQorMCAgICAweGZmICAgIDB4MDIKKworI0VOVU0gTUFYX1JYX0FNUERVX0ZBQ1RPUiAgICAgICAgMAorI0VOVU0gTVBEVV9ERU5TSVRZICAgICAgICAgICAgICAgMgorI0VOVU0gUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgNQorCisqCisqIDMuIFN1cHBvcnRlZCBNQ1MgU2V0OiAxNiBieXRlcyBzaXplCisqCisqIE1DUyAjMC0xNSBhbmQgIzMyIGlzIHN1cHBvcnRlZC4KKyoKK1dOSV9DRkdfU1VQUE9SVEVEX01DU19TRVQgICAgUyAgICAxNiAgICA3CitWICAgIFJXICAgIFAgICAgUkVTVEFSVAorTElNCisxNiAyNTUgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKK1YgICAgUlcgICAgUCAgICBSRVNUQVJUCitMSU0KKzE2IDI1NSAyNTUgMCAwIDEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCisKKyoKKyogNC4gRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm86IDIgYnl0ZXMgc2l6ZQorKgorKiBPbmx5IEhUQyBTdXBwb3J0IGlzIGVuYWJsZWQsIHJlc3QgYWxsIGZlYXR1cmVzIGFyZSBub3QKKyogc3VwcG9ydGVkIGF0IHRoaXMgbW9tZW50LgorKgorKiBmZWRjIGJhOTggNzY1NCAzMjEwCisqIDAwMDAgMDEwMCAwMDAwIDAwMDAKKyoKK1dOSV9DRkdfRVhUX0hUX0NBUF9JTkZPICAgIEkgICAgNCAgICAxMAorViAgICBSVyAgIFAgICAgICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmZmZiAgICAweDA0MDAKK1YgICAgUlcgICBQICAgICAgIFJFU1RBUlQKK0xJTQorMCAgICAweGZmZmYgICAgMHgwNDAwCisKKyNFTlVNIFBDTyAgICAgICAgICAgICAgICAgICAgICAgICAwCisjRU5VTSBUUkFOU0lUSU9OX1RJTUUgICAgICAxCisjRU5VTSBSRVNFUlZFRDEgICAgICAgICAgICAgICAgMworI0VOVU0gTUNTX0ZFRURCQUNLICAgICAgICAgIDgKKyNFTlVNIEhUQ19TVVBQT1JUICAgICAgICAgICAgMTAKKyNFTlVNIFJEX1JFU1BPTkRFUiAgICAgICAgICAgMTEKKyNFTlVNIFJFU0VSVkVEMiAgICAgICAgICAgICAgICAxMgorCisKKyoKKyogNS4gVHJhbnNtaXQgQmVhbSBGb3JtaW5nIENhcGFiaWxpcmllcyBJbmZvOiA0IGJ5dGVzIHNpemUKKyoKK1dOSV9DRkdfVFhfQkZfQ0FQICAgIEkgICA0ICAgNworViAgICBSTyAgIE5QICAgICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmZmZmZmZmYgICAgMHgwMDAwMDAwMAorViAgICBSTyAgIE5QICAgICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmZmZmZmZmYgICAgMHgwMDAwMDAwMAorCisqCisqIDYuIEFudGVubmEgU2VsZWN0aW9uIENhcGFiaWxpdGllczogMSBieXRlIHNpemUKKyoKK1dOSV9DRkdfQVNfQ0FQICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgUCAgICAgIFJFU1RBUlQKK0xJTQorMCAgICAweGZmICAgIDB4MDAKK1YgICAgUlcgICBQICAgICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmYgICAgMHgwMAorCisjRU5VTSBBTlRFTk5BX1NFTEVDVElPTiAgICAgICAgICAgIDAKKyNFTlVNIEVYUExJQ0lUX0NTSV9GRUVEQkFDS19UWCAgICAgMQorI0VOVU0gQU5URU5OQV9JTkRJQ0VTX0ZFRURCQUNLX1RYICAyCisjRU5VTSBFWFBMSUNJVF9DU0lfRkVFREJBQ0sgICAgICAgIDMKKyNFTlVNIEFOVEVOTkFfSU5ESUNFU19GRUVEQkFDSyAgICAgNAorI0VOVU0gUlhfQVMgICAgICAgICAgICAgICAgICAgICAgICA1CisjRU5VTSBUWF9TT1VORElOR19QUERVUyAgICAgICAgICAgIDYKKyNFTlVNIFJFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgNworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQmVhY29uICBIVCAoSGlnaCBUaHJvdWdoKSBJbmZvIElFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogMy4gSFQgSW5mbyBGaWVsZDE6IDEgYnl0ZSBzaXplLgorKgorKiBTZWNvbmRhcnkgQ2hhbm5lbCBPZmZzZXQgaXMgc2V0IHRvIDMgKERvd24pIGJ5IGRlZmF1bHQgYW5kIHdpbGwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1cGRhdGVkIGR5bmFtaWNhbGx5IGJ5IERGUyBhbGdvcml0aG0uCisqIENoYW5uZWwgV2lkdGggaXMgc2V0IHRvIDEgKDQwIE1oeikKKyogUklGUyBNb2RlIGlzIGVuYWJsZWQKKyogUmVzdCBvZiB0aGUgZmVhdHVyZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyBtb21lbnQuCisqCisqIDc2NTQgMzIxMAorKiAwMDAwIDExMTEKKyoKK1dOSV9DRkdfSFRfSU5GT19GSUVMRDEgICAgSSAgICA0ICAgIDEwCitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK0xJTQorMCAgICAweGZmICAgIDB4MGYKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmYgICAgMHgwZgorCisjRU5VTSBTRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVQgICAgICAgMAorI0VOVU0gUkVDT01NRU5ERURfQ0hBTk5FTF9XSURUSCAgICAgICAyCisjRU5VTSBSSUZTX01PREUgICAgICAgICAgICAgICAgICAgICAgMworI0VOVU0gUFNNUF9BQ0NFU1NfT05MWSAgICAgICAgICA0CisjRU5VTSBTRVJWSUNFX0lOVEVSVkFMX0dSQU5VTEFSSVRZICAgNQorCisqCisqIDQuICBIVCBJbmZvIEZpZWxkMjogMiBieXRlcworKgorKiBPcGVyYXRpb24gbW9kZSBpcyBzZXQgdG8gMChQdXJlLCBHRikgdG8gYmVnaW4gd2l0aCBhbmQKKyogICAgICAgICAgICAgICAgIHdpbGwgYmUgdXBkYXRlZCBkeW5hbWljYWxseS4KKyogJ05vbkdGIERldmljZXMgcHJlc2VudCBpcyBhbHNvIHNldCB0byB6ZXJvIGFuZAorKiAgICAgICAgICAgICAgICAgd2lsbCBiZSB1cGRhdGVkIGR5bmFtaWNhbGx5LgorKgorKiBmZWRjIGJhOTggNzY1NCAzMjEwCisqIDAwMDAgMDAwMCAwMDAwIDAwMDAKKyoKK1dOSV9DRkdfSFRfSU5GT19GSUVMRDIgICAgSSAgICA0ICAgIDEwCitWICAgIFJXICAgIFAKK0xJTQorMCAgICAweGZmZmYgICAgMHgwMAorViAgICBSVyAgICBQCitMSU0KKzAgICAgMHhmZmZmICAgIDB4MDAKKworI0VOVU0gT1BfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI0VOVU0gTk9OX0dGX0RFVklDRVNfUFJFU0VOVCAgMgorI0VOVU0gUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgMworCisqCisqIDUuIEhUIEluZm8gRmllbGQzOiAyIGJ5dGVzCisqCisqIGZlZGMgYmE5OCA3NjU0IDMyMTAKKyogMDAwMCAwMDAwIDAwMDAgMDAwMAorKgorKiBMU0lHIFRYT1AgRnVsbCBQcm90ZWN0aW9uIHdpbGwgYmUgemVybyB0byBiZWdpbiB3aXRoIGFuZAorKiB1cGRhdGVkIGR5bmFtaWNhbGx5LgorKiBFdmVyeXRoaW5nIGVsc2UgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGlzIG1vbWVudC4KKyoKK1dOSV9DRkdfSFRfSU5GT19GSUVMRDMgICAgSSAgICA0ICAgIDEwCitWICAgIFJXICAgIFAKK0xJTQorMCAgICAweGZmZmYgICAgMHgwMDAwCitWICAgIFJXICAgIFAKK0xJTQorMCAgICAweGZmZmYgICAgMHgwMDAwCisKKyNFTlVNIEJBU0lDX1NUQkNfTUNTICAgICAgICAgICAgICAgICAgICAgIDAKKyNFTlVNIERVQUxfU1RCQ19QUk9URUNUSU9OICAgICAgICAgICAgICAgIDcKKyNFTlVNIFNFQ09OREFSWV9CRUFDT04gICAgICAgICAgICAgICAgICAgIDgKKyNFTlVNIExTSUdfVFhPUF9QUk9URUNUSU9OX0ZVTExfU1VQUE9SVCAgIDkKKyNFTlVNIFBDT19BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNFTlVNIFBDT19QSEFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNFTlVNIFJFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKworKgorKiA2LiBCYXNpYyBNQ1MgU2V0OiAxNiBieXRlcyBzaXplCisqCisqIEZvciBub3cgc2V0IHRoaXMgdG8gemVybyBhbmQgZG9uJ3QgcHV0IGFueSByZXN0cmljdGlvbnMuCisqCitXTklfQ0ZHX0JBU0lDX01DU19TRVQgICAgUyAgICAxNiAgICA3CitWICAgIFJXICAgIFAgICAgUkVTVEFSVAorTElNCisxNiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCitWICAgIFJXICAgIFAgICAgUkVTVEFSVAorTElNCisxNiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCisKKyoKKyogNy4gQ3VycmVudCBzdXBwb3J0ZWQgTUNTIFNldDogMTYgYnl0ZXMgc2l6ZQorKgorKiBGb3Igbm93IHNldCB0aGlzIHRvIHplcm8gYW5kIGRvbid0IHB1dCBhbnkgcmVzdHJpY3Rpb25zLgorKgorV05JX0NGR19DVVJSRU5UX01DU19TRVQgICAgUyAgICAxNiAgICA3CitWICAgIFJXICAgIFAgICAgUkVTVEFSVAorTElNCisxNiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCitWICAgIFJXICAgIFAgICAgUkVTVEFSVAorTElNCisxNiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCisKKworCisqCisqIEdyZWVuZmllbGQgQ2FwYWJpbGl0eQorKiBCeSBkZWZhdWx0IEdyZWVuZmllbGQgaXMgZW5hYmxlZAorKgorV05JX0NGR19HUkVFTkZJRUxEX0NBUEFCSUxJVFkgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK0xJTQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDEgICAgMAorCisjRU5VTSBFTkFCTEUgICAgMQorI0VOVU0gRElTQUJMRSAgIDAKKworKgorKiBNYXhpbXVtIEFNUERVIExlbmd0aAorKiBCeSBkZWZhdWx0IHNldCB0byB6ZXJvIGZvciAzODk1IG9jdGV0cworKgorV05JX0NGR19WSFRfTUFYX01QRFVfTEVOR1RIICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAyICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAyICAgIDAKKworKgorKiBTdXBwb3J0ZWQgQ2hhbm5lbCBXaWR0aCBTZXQKKyogQnkgZGVmYXVsdCBzZXQgdG8gemVybyBmb3IKKyogU1RBcyBkb2VzIG5vdCBzdXBwb3J0IGVpdGhlciAxNjAgb3IgODArODBNSHoKKyoKK1dOSV9DRkdfVkhUX1NVUFBPUlRFRF9DSEFOX1dJRFRIX1NFVCAgSSAgICA0ICAgIDE5CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMCAgICAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMCAgICAwCisKKyoKKyogTERQQyBDb2RpbmcgQ2FwYWJpbGl0eQorKiBSaXZhL1Byb250byBzdXBwb3J0cywgZGVmYXVsdCBzZXQgdG8gMQorKgorV05JX0NGR19WSFRfTERQQ19DT0RJTkdfQ0FQICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKKworKgorKiBTaG9ydCBHSSBmb3IgODBNSHoKKyogUml2YS9Qcm9udG8gc3VwcG9ydHMsIGRlZmF1bHQgc2V0IHRvIDEKKyoKK1dOSV9DRkdfVkhUX1NIT1JUX0dJXzgwTUhaICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDEKKworKgorKiBTaG9ydCBHSSBmb3IgMTYwTUh6IGFuZCA4MCs4ME1IegorKiBSaXZhL1Byb250byBkb2VzIG5vdCBzdXBwb3J0cywgZGVmYXVsdCBzZXQgdG8gMAorKgorV05JX0NGR19WSFRfU0hPUlRfR0lfMTYwX0FORF84MF9QTFVTXzgwTUhaICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKKworKgorKiBTdXBwb3J0IGZvciBUcmFuc21pc3Npb24gb2YgMngxIFNUQkMKKyogUml2YS9Qcm9udG8gZG9lcyBub3Qgc3VwcG9ydHMsIGRlZmF1bHQgc2V0IHRvIDAKKyoKK1dOSV9DRkdfVkhUX1RYU1RCQyAgSSAgICA0ICAgIDE5CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAwCisKKyoKKyogU3VwcG9ydCBmb3IgUmVjZXB0aW9uIG9mIFBQRFVzIHVzaW5nIFNUQkMKKyogUml2YS9Qcm9udG8gc3VwcG9ydHMsIGRlZmF1bHQgc2V0IHRvIDEKKyoKK1dOSV9DRkdfVkhUX1JYU1RCQyAgSSAgICA0ICAgIDE5CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAxCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAxCisKKyoKKyogU3VwcG9ydCBmb3IgT3BlcmF0aW5nIGFzIFNVIEJlYW1mb3JtZXIKKyogUml2YS9Qcm9udG8gZG9lcyBub3Qgc3VwcG9ydHMsIGRlZmF1bHQgc2V0IHRvIDAKKyoKK1dOSV9DRkdfVkhUX1NVX0JFQU1GT1JNRVJfQ0FQICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKKworKgorKiBTdXBwb3J0IGZvciBPcGVyYXRpbmcgYXMgU1UgQmVhbWZvcm1lZQorKiBSaXZhIGRvZXMgbm90IHN1cHBvcnQsIEJ1dCBQcm9udG8gc3VwcG9ydHMsIGRlZmF1bHQgc2V0IHRvIDAKKyoKK1dOSV9DRkdfVkhUX1NVX0JFQU1GT1JNRUVfQ0FQICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKKworKgorKiBDb21wcmVzc2VkIFN0ZWVyaW5nIE51bWJlciBvZiBCZWFtZm9ybWVyIEFudGVubmFzIFN1cHBvcnRlZAorKiBSaXZhIGRvZXMgbm90IHN1cHBvcnQsUHJvbnRvIHN1cHBvcnRzLCBkZWZhdWx0IHNldCB0byAwCisqCitXTklfQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVEICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICA0ICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICA0ICAgIDAKKworKgorKiBOdW1iZXIgb2YgU291bmRpbmcgRGltZW5zaW9ucyBpbmRpY2F0ZXMgTnVtYmVyCisqIG9mIGFudGVubmFzIHVzZWQgYnkgdGhlIGJlYW1mb3JtZXIgd2hlbiBzZW5kaW5nIGJlYW1mb3JtZWQgdHJhbnNtaXNzaW9ucworKiBSaXZhL1Byb250byBkb2VzIG5vdCBzdXBwb3J0IGJlYW1mb3JtZXIsIGRlZmF1bHQgc2V0IHRvIDAKKyoKK1dOSV9DRkdfVkhUX05VTV9TT1VORElOR19ESU1FTlNJT05TICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAzICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAzICAgIDAKKworKgorKiBNVSBCZWFtZm9ybWVyIENhcGFibGUKKyogUml2YS9Qcm9udG8gZG9lcyBub3Qgc3VwcG9ydCwgZGVmYXVsdCBzZXQgdG8gMAorKgorV05JX0NGR19WSFRfTVVfQkVBTUZPUk1FUl9DQVAgIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMAorCisqCisqIE1VIEJlYW1mb3JtZWUgQ2FwYWJsZQorKiBSaXZhIGRvZXMgbm90IHN1cHBvcnQgYnV0IHByb250byBzdXBwb3J0cywgZGVmYXVsdCBzZXQgdG8gMAorKgorV05JX0NGR19WSFRfTVVfQkVBTUZPUk1FRV9DQVAgIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMAorCisqCisqIFZIVCBUWE9QIFBTCisqIFJpdmEgZG9lcyBub3Qgc3VwcG9ydCBidXQgcHJvbnRvIHN1cHBvcnRzLCBkZWZhdWx0IHNldCB0byAwCisqCitXTklfQ0ZHX1ZIVF9UWE9QX1BTICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKKworKgorKiArSFRDLVZIVCBDYXBhYmxlCisqIFJpdmEgZG9lcyBub3Qgc3VwcG9ydCBidXQgcHJvbnRvIHN1cHBvcnRzLCBkZWZhdWx0IHNldCB0byAwCisqCitXTklfQ0ZHX1ZIVF9IVENfVkhUQ19DQVAgIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMAorCisqCisqIE1heGltdW0gQU1QRFUgTGVuZ3RoIGV4cG9uZW50IHJhbmdlIDAtNworKiAyXigxMytNYXggQU1QRFUgTGVuZ3RoKS0xLCBkZWZhdWx0IHNldCB0byAwCisqCitXTklfQ0ZHX1ZIVF9BTVBEVV9MRU5fRVhQT05FTlQgIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgIDcgICAgMworViAgICBSVyAgICBOUAorTElNCiswICAgIDcgICAgMworCisqCisqIFZIVCBMaW5rIEFkYXB0YXRpb24gQ2FwYWJsZQorKiBSaXZhIGRvZXMgbm90IHN1cHBvcnQgYnV0IHByb250byBzdXBwb3J0cywgZGVmYXVsdCBzZXQgdG8gMAorKgorV05JX0NGR19WSFRfTElOS19BREFQVEFUSU9OX0NBUCAgSSAgICA0ICAgIDE5CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMyAgICAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMyAgICAwCisKKyoKKyogVkhUIFJ4IEFudGVubmEgUGF0dGVybiBDb25zaXN0ZW5jeQorKgorV05JX0NGR19WSFRfUlhfQU5UX1BBVFRFUk4gIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMQorCisqCisqIFZIVCBUeCBBbnRlbm5hIFBhdHRlcm4gQ29uc2lzdGVuY3kKKyoKK1dOSV9DRkdfVkhUX1RYX0FOVF9QQVRURVJOICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDEKKworKgorKiBSeE1DUyBNYXAgaXMgMTYgYml0cywgVGhlIDJiaXQgTWF4IE1DUyBmb3IgbiBTUyBmaWVsZC4KKyogSW5kaWNhdGVzIHRoZSBtYXhpbXVtIE1DUyB0aGF0IGNhbiBiZSByZWNlaXZlZCBmb3IgZWFjaAorKiBudW1iZXIgb2Ygc3BhY2lhbCBzdHJlYW1zLiBSaXZhIHN1cHBvcnRzIE1DUyAwLTkKKyoKK1dOSV9DRkdfVkhUX1JYX01DU19NQVAgIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgIDB4RkZGRiAgICAweEZGRkUKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAweEZGRkYgICAgMHhGRkZFCisKKyogVHhNQ1MgTWFwIGlzIDE2IGJpdHMsIFRoZSAyYml0IE1heCBNQ1MgZm9yIG4gU1MgZmllbGQuCisqIEluZGljYXRlcyB0aGUgbWF4aW11bSBNQ1MgdGhhdCBjYW4gYmUgdHJhbnNtaXR0ZWQgZm9yIGVhY2gKKyogbnVtYmVyIG9mIHNwYWNpYWwgc3RyZWFtcy4KKyoKK1dOSV9DRkdfVkhUX1RYX01DU19NQVAgIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgIDB4RkZGRiAgICAweEZGRkUKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAweEZGRkYgICAgMHhGRkZFCisKKyoKKyogUnggSGlnaGVzdCBzdXBwb3J0ZWQgZGF0YSByYXRlLgorKgorV05JX0NGR19WSFRfUlhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICA3ODAgICA3ODAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICA3ODAgICA3ODAKKworKgorKiBUeCBIaWdoZXN0IHN1cHBvcnRlZCBkYXRhIHJhdGUuCisqCitXTklfQ0ZHX1ZIVF9UWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEUgIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgIDc4MCAgICA3ODAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICA3ODAgICAgNzgwCisKKyoKKyogQ2hhbm5lbCBjZW50ZXIgZnJlcSBTZWcxCisqCitXTklfQ0ZHX1ZIVF9DSEFOTkVMX0NFTlRFUl9GUkVRX1NFR01FTlQxICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAyNTYgICAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMjU2ICAgMAorCisqCisqIENoYW5uZWwgY2VudGVyIGZyZXEgU2VnMiBmb3IgODArODAgTWh6CisqCitXTklfQ0ZHX1ZIVF9DSEFOTkVMX0NFTlRFUl9GUkVRX1NFR01FTlQyICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAwICAgICAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMCAgICAgMAorCisqCisqIEJhc2ljIE1DUyBTZXQKKyoKK1dOSV9DRkdfVkhUX0JBU0lDX01DU19TRVQgIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgIDB4RkZGRiAgICAweEZGRkUKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAweEZGRkYgICAgMHhGRkZFCisKKyoKKyogTVUtTUlNTyBDYXBhYmxlIFNUQSBDb3VudAorKgorV05JX0NGR19WSFRfTVVfTUlNT19DQVBfU1RBX0NPVU5UICBJICAgIDQgICAgMTkKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAgNCAgICAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgIDQgICAgIDAKKworKgorKiBTcGF0aWFsIFN0cmVhbSBVbmRlci1VdGlsaXphdGlvbgorKgorV05JX0NGR19WSFRfU1NfVU5ERVJfVVRJTCAgSSAgICA0ICAgIDE5CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgIDAgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgICAwICAgICAwCisKKyoKKyogRm9ydHkgTUhaIFV0aWxpemF0aW9uCisqCitXTklfQ0ZHX1ZIVF80ME1IWl9VVElMSVpBVElPTiAgSSAgICA0ICAgIDE5CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgIDAgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgICAwICAgICAwCisKKyoKKyogRWlnaHR5IE1IeiBVdGlsaXphdGlvbgorKgorV05JX0NGR19WSFRfODBNSFpfVVRJTElaQVRJT04gIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgICAwICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAgMCAgICAgMAorCisqCisqIEh1bmRyZWQgU2l4dHkgTUh6IFV0aWxpemF0aW9uCisqCitXTklfQ0ZHX1ZIVF8xNjBNSFpfVVRJTElaQVRJT04gIEkgICAgNCAgICAxOQorViAgICBSVyAgICBOUAorTElNCiswICAgICAwICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAgMCAgICAgMAorCisqCisqIE1heGltdW0gQU1TRFUgbGVuZ3RoCisqIFVzZXIgY2FuIHNldCBpdCB0byBlaXRoZXIgMzgzOSBvciA3OTM1IGJ5dGVzLgorKgorV05JX0NGR19NQVhfQU1TRFVfTEVOR1RIICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK0xJTQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDEgICAgMAorCisjRU5VTSBTSE9SVF8zODM5X0JZVEVTICAgMAorI0VOVU0gTE9OR183OTM1X19CWVRFUyAgIDEKKworCisqCisqIE1pbmltdW0gTVBEVSBTdGFydCBTcGFjaW5nCisqIERldGVybWluZXMgdGhlIG1pbmltdW0gdGltZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBhZGphY2VudCBNUERVcyB3aXRoaW4gYW4gQU1QRFUuCisqIFNldCB0byAwIGZvciBubyByZXN0cmljdGlvbgorKiBTZXQgdG8gMSBmb3IgMS80IHMKKyogU2V0IHRvIDIgZm9yIDEvMiBzCisqIFNldCB0byAzIGZvciAxIHMKKyogU2V0IHRvIDQgZm9yIDIgcworKiBTZXQgdG8gNSBmb3IgNCBzCisqIFNldCB0byA2IGZvciA4IHMKKyogU2V0IHRvIDcgZm9yIDE2IHMKKyogZGVmYXVsdCBpcyBzZXQgdG8gMAorV05JX0NGR19NUERVX0RFTlNJVFkgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDcgICAgMAorViAgICBSVyAgICBOUCAgICBSRVNUQVJUCitMSU0KKzAgICAgNyAgICAwCisKKyoKKyogTlVNIEJVRkZFUlMgQURWRVJUSVNFRAorKiBEZWZpbmVzIG51bWJlciBvZiBidWZmZXJzIGFkdmVydGlzZWQgaW4gQUREQkEKKyoKK1dOSV9DRkdfTlVNX0JVRkZfQURWRVJUICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTElNCiswICAgIDEyOCAgICA2NAorViAgICBSVyAgICBOUAorTElNCiswICAgIDEyOCAgICA2NAorCisqCisqIE1heGltdW0gUnggQU1QRFUgRmFjdG9yCisqIEluZGljYXRlcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgQS1NUERVCisqIHRoYXQgdGhlIFNUQSBjYW4gcmVjZWl2ZS4KKyogVGhlIE1heGltdW0gUnggQS1NUERVIGRlZmluZWQgYnkgdGhpcyBmaWVsZCBpcyBlcXVhbCB0byAgKDIgXiAoMTMgKyBNQVggUlggQU1QRFUgRkFjdG9yKSktMSAgb2N0ZXRzLgorKiBNYXhpbXVtIFJ4IEEtTVBEVSBGYWN0b3IgaXMgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMCB0byAzLgorKiBkZWZhdWx0IGlzIHNldCB0byAyIGZvciAzMksgbWF4IFJYIHNpZGUuCisqCitXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1IgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDMgICAgMworViAgICBSVyAgICBOUCAgICBSRVNUQVJUCitMSU0KKzAgICAgMyAgICAzCisKKworKgorKiBTaG9ydCBHSSBzdXBwb3J0IGZvciB0aGUgcmVjZXB0aW9uIG9mIDIwTWh6IHBhY2tldHMKKyogQnkgZGVmYXVsdCBpdCBpcyBlbmFibGVkCisqCitXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaICBJICAgIDQgICAgNworViAgICBSVyAgICBOUCAgICBSRVNUQVJUCitMSU0KKzAgICAgMSAgICAxCitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK0xJTQorMCAgICAxICAgIDEKKworCisjRU5VTSBFTkFCTEUgICAgMQorI0VOVU0gRElTQUJMRSAgIDAKKworCisqCisqIFNob3J0IEdJIHN1cHBvcnQgZm9yIHRoZSByZWNlcHRpb24gb2YgNDBNaHogcGFja2V0cworKiBCeSBkZWZhdWx0IGl0IGlzIGVuYWJsZWQKKyoKK1dOSV9DRkdfU0hPUlRfR0lfNDBNSFogIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK0xJTQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDEgICAgMQorCisKKyNFTlVNIEVOQUJMRSAgICAxCisjRU5VTSBESVNBQkxFICAgMAorCisKKyoKKyogUklGUyBzdXBwb3J0IG9uIFRYIFNpZGUKKyogb24gUlggc2lkZSBpdCBpcyBhbHdheXMgc3VwcG9ydGVkLCBpdCBpcyBtYW5kYXRvcnkKKyoKK1dOSV9DRkdfUklGU19FTkFCTEVEICAgSSAgIDQgICA3CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAxCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAxCisKKyNFTlVNIEVOQUJMRSAgMQorI0VOVU0gRElTQUJMRSAwCisKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogUG93ZXIgU2F2ZSBDb25maWd1cmF0aW9uCisqCitXTklfQ0ZHX01BWF9QU19QT0xMICAgIEkgICAgNCAgICA1CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgIDI1NSAgICAgMAorTlYgICAgUlcgICAgTlAKK0xJTQorMCAgICAgMjU1ICAgICAwCisKKworV05JX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0UgICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAKK0xJTQorMSAgICAyMCAgICAyMAorTlYgICAgUlcgICAgTlAKK0xJTQorMSAgICAyMCAgICAyMAorCisKKyoKKyogUGVyaW9kIGZvciB3aGljaCBGaXJtd2FyZSB3aWxsIGNvbGxlY3QgdGhlCisqIFJTU0kgc3RhdHMuIEl0cyBpbiB1bml0cyBvZiBiZWFjb24gaW50ZXJ2YWwuCisqIFJzc2kgRmlsdGVyIHBlcmlvZCBzaG91bGQgYWx3YXlzIGJlID49CisqIHRoZSBudW1fYmVhY29uX3Blcl9yc3NpX2F2ZXJhZ2UuCisqCitXTklfQ0ZHX1JTU0lfRklMVEVSX1BFUklPRCAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTElNCiswICAgIDI1NSAgICA1CitOViAgICBSVyAgICBOUAorTElNCiswICAgIDI1NSAgICA1CisKKworV05JX0NGR19NSU5fUlNTSV9USFJFU0hPTEQgICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxMCAgICAxMAorTlYgICAgUlcgICAgTlAKK0xJTQorMCAgICAxMCAgICAxMAorCisKK1dOSV9DRkdfTlRIX0JFQUNPTl9GSUxURVIgICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAyNTUgICAxMAorTlYgICAgUlcgICAgTlAKK0xJTQorMCAgICAyNTUgICAgMTAKKworCitXTklfQ0ZHX0JST0FEQ0FTVF9GUkFNRV9GSUxURVJfRU5BQkxFICAgIEkgICAgNCAgICA1CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAwCitOViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMAorCisKK1dOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkUgICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDEKKworCisqCisqIElnbm9yZSBEVElNIHN1cHBvcnQgLSBJZiBkaXNhYmxlZCh2YWx1ZT0wKSwgSEFMIHdpbGwKKyogdHJ5IHRvIGFsaWduIHRoZSBMaXN0ZW4gSW50ZXJ2YWwgdG8gdGhlIERUSU0KKyogcGVyaW9kIGFuZCB0aGUgZm9sbG93aW5nIHJ1bGVzIHdpbGwgYmUgYXBwbGllZDoKKyogMSkgSWYgTEk9RFRJTSwgdGhlbiBzZXQgTEk9RFRJTQorKiAyKSBJZiBMSTxEVElNLCB0aGVuIGFsaWduIExJIHRvIERUSU0KKyogMykgSWYgTEk+RFRJTSwgdGhlbiBzZXQgTEk9RFRJTQorKgorV05JX0NGR19JR05PUkVfRFRJTSAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAwCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFdvV0xBTiBDb25maWd1cmF0aW9uICBUaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb25zCisqIGFyZSB2YWxpZCBvbmx5IHdoZW4gbWFnaWNQa3RFbmFibGUgPSAxLgorKgorV05JX0NGR19XT1dMQU5fVUNBU1RfUEFUVEVSTl9GSUxURVJfRU5BQkxFICAgIEkgICAgNCAgICA1CitWICAgIFJXICAgIE5QCitOT05FCiswICAgICAxICAgICAxCitOViAgICBSVyAgICBOUAorTk9ORQorMCAgICAgMSAgICAgMAorCisKK1dOSV9DRkdfV09XTEFOX0NIQU5ORUxfU1dJVENIX0VOQUJMRSAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAgMSAgICAgMQorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgIDEgICAgIDAKKworCitXTklfQ0ZHX1dPV0xBTl9ERUFVVEhfRU5BQkxFICAgIEkgICAgNCAgICA1CitWICAgIFJXICAgIE5QCitOT05FCiswICAgICAxICAgICAxCitOViAgICBSVyAgICBOUAorTk9ORQorMCAgICAgMSAgICAgMAorCisKK1dOSV9DRkdfV09XTEFOX0RJU0FTU09DX0VOQUJMRSAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAgMSAgICAgMQorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgIDEgICAgIDAKKworCitXTklfQ0ZHX1dPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTiAgIEkgICAgNCAgICA1CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDQwCitOViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICA0MAorCisqCisqIFRpbWVvdXQgdmFsdWUgaW4gdW5pdHMgb2YgdXMuIEl0IHJlcXVlc3RzCisqIGhhcmR3YXJlIHRvIHVuY29uZGl0aW9uYWxseSB3YWtlIHVwIGFmdGVyCisqIGl0IGhhcyBzdGF5ZWQgaW4gV29XTEFOIG1vZGUgZm9yIHNvbWUgdGltZS4KKyoKK1dOSV9DRkdfV09XTEFOX01BWF9TTEVFUF9QRVJJT0QgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICA2NTUzNQorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgNjU1MzUKKworCisqCisqIEJBIHRpbWVvdXQgaW4gVFVzLCBzZXQgdG8gMSBtaW51dGUgPSBhcHByb3ggNTg1OTMgVFVzCisqIDE2IGJpdCB3aWRlCisqCitXTklfQ0ZHX0JBX1RJTUVPVVQgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QICAgUkVTVEFSVAorSEFMCiswICAgIDB4ZmZmZiAgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMHhmZmZmICAgIDAKKworCisqCisqIFRoaXMgdGhyZXNob2xkIGlzIHJlZ2lzdGVyZWQgd2l0aCBhIHRyYWZmaWMgbW9uaXRvcmluZyBpbnRlcmZhY2UgKHByb2JhYmx5IEhBTCksCisqIG9uIGEgcGVyLVNUQSwgcGVyLVRJRCBiYXNpcy4gT25jZSB0aGlzIHRocmVzaG9sZCBoYXMgYmVlbiByZWFjaGVkLAorKiBIQUwgd2lsbCBpbmRpY2F0ZSB0byBQRSB0aGF0IHRoZSB0aHJlc2hvbGQgaGFzIGJlZW4gcmVhY2hlZCBmb3IgdGhhdCBUSUQuCisqIFBFIGlzIHRoZW4gZnJlZSB0byBuZWdvdGlhdGUgYSBCQSBzZXNzaW9uIGZvciB0aGF0IHBlZXIKKyogZGVmYXVsdHMgdG8gMTI4CisqIDE2IGJpdCB3aWRlCisqCitXTklfQ0ZHX0JBX1RIUkVTSE9MRF9ISUdIICAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUCAgIFJFU1RBUlQKK0hBTAorMCAgICAweGZmZmYgICAgMHg4MAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDB4ZmZmZiAgICAweDgwCisKKworKgorKiBNQVggQkEgQnVmZmVycyB0byBiZSBhbGxvY2F0ZWQuCisqIFRoaXMgY291bnQgaXMgc3lzdGVtIHdpZGUuCisqIDE2IGJpdCB3aWRlCisqCitXTklfQ0ZHX01BWF9CQV9CVUZGRVJTICAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUCAgIFJFU1RBUlQKK0hBTAorMCAgICAyNTYwICAgIDI1NjAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAyNTYwICAgIDI1NjAKKworCisqCisqIE1BWCBCQSBTZXNzaW9ucy4KKyogVGhpcyBjb3VudCBpcyBzeXN0ZW0gd2lkZS4KKyogMTYgYml0IHdpZGUKKyoKK1dOSV9DRkdfTUFYX0JBX1NFU1NJT05TICAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUCAgIFJFU1RBUlQKK0hBTAorMCAgICA2NCAgICA0MAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY0ICAgIDQwCisKKworKgorKiBCQSBzZXR1cCBiYXNlZCBvbiBUcmFmZmljCisqCitXTklfQ0ZHX0JBX0FVVE9fU0VUVVAgICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QICAgUkVTVEFSVAorSEFMCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUCAgUkVTVEFSVAorSEFMCiswICAgIDEgICAgMQorCisjRU5VTSBFTkFCTEUgIDEKKyNFTlVNIERJU0FCTEUgMAorCisqCisqIERlY2xpbmUgYW4gQUREQkEgUmVxdWVzdAorKgorV05JX0NGR19BRERCQV9SRVFfREVDTElORSAgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZiAgICAwCitWICAgIFJXICAgIE5QICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZiAgICAwCisKKyoKKyogVmFsaWQgQ2hhbm5lbCBMaXN0CisqCisKK1dOSV9DRkdfQkdfU0NBTl9DSEFOTkVMX0xJU1QgICAgUyAgICAxMDAgICAgOAorViAgICBSVyAgICBOUAorTElNCis1NSAgIDM2IDQwIDQ0IDQ4IDUyIDU2IDYwIDY0IDEgNiAxMSAzNCAzOCA0MiA0NiAyIDMgNCA1IDcgOCA5IDEwIDEyIDEzIDE0IDEwMCAxMDQgMTA4IDExMiAxMTYgMTIwIDEyNCAxMjggMTMyIDEzNiAxNDAgMTQ5IDE1MSAxNTMgMTU1IDE1NyAxNTkgMTYxIDUwIDU0IDU4IDYyIDI0MCAyNDIgMjQ0IDI0NiAyNDggMjUwIDI1MgorViAgICBSVyAgICBOUAorTElNCis1NSAgIDM2IDQwIDQ0IDQ4IDUyIDU2IDYwIDY0IDEgNiAxMSAzNCAzOCA0MiA0NiAyIDMgNCA1IDcgOCA5IDEwIDEyIDEzIDE0IDEwMCAxMDQgMTA4IDExMiAxMTYgMTIwIDEyNCAxMjggMTMyIDEzNiAxNDAgMTQ5IDE1MSAxNTMgMTU1IDE1NyAxNTkgMTYxIDUwIDU0IDU4IDYyIDI0MCAyNDIgMjQ0IDI0NiAyNDggMjUwIDI1MgorCisKKyoKKyogQU1QRFUgZGVmYXVsdCBUWCBtZWRpdW0gVGltZSAoaW4gdXMpCisqCitXTklfQ0ZHX01BWF9NRURJVU1fVElNRSAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDIwNDgKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAyMDQ4CisKKworKgorKiBNYXhpbXVtIG51bWJlciBvZiBNUERVcyBpbiBzaW5nbGUgQS1NUERVLgorKgorV05JX0NGR19NQVhfTVBEVVNfSU5fQU1QRFUgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICA2NAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDY0CisKKworKgorKiBBdXRvIEJTU0lEIC0gV2hlbiBzZXQsIEJTU0lEIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGluIElCU1MsIGVsc2UgQlNTSUQgaW4gY2ZnIHdpbGwgYmUgdXNlZC4KKyoKKworV05JX0NGR19JQlNTX0FVVE9fQlNTSUQgICAgICBJICAgIDQgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgIDEKK05WICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAgMQorCisqCisqIEluY2x1ZGUgQWRkaXRpb25hbCBJRXMgaW4gcHJvYmUgcmVxdWVzdC4KKyoKK1dOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9GTEFHICAgIEkgICAgNCAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDEgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAxIDAKKworKgorKiBJbmNsdWRlIEFkZGl0aW9uYWwgSUUgaW4gcHJvYmUgcmVxdWVzdC4KKyoKK1dOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9EQVRBICAgIFMgICAgIDI1NSAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMAorCisqCisqIEluY2x1ZGUgQWRkaXRpb25hbCBJRXMgaW4gcHJvYmUgcmVzcG9uc2UuCisqCitXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfRkxBRyAgICBJICAgIDQgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAxIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMSAwCisKKyoKKyogSW5jbHVkZSBBZGRpdGlvbmFsIElFIGluIHByb2JlIHJlc3BvbnNlLgorKgorV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExICAgIFMgICAgIDI1NSAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMAorCisqCisqIEluY2x1ZGUgQWRkaXRpb25hbCBJRSBpbiBwcm9iZSByZXNwb25zZS4KKyoKK1dOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMiAgICBTICAgICAyNTUgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDAKKworKgorKiBJbmNsdWRlIEFkZGl0aW9uYWwgSUUgaW4gcHJvYmUgcmVzcG9uc2UuCisqCitXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTMgICAgUyAgICAgMjU1ICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAwCisKKyoKKyogSW5jbHVkZSBBZGRpdGlvbmFsIElFcyBpbiBhc3NvYyByZXNwb25zZS4KKyoKK1dOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9GTEFHICAgIEkgICAgNCAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDEgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAxIDAKKworKgorKiBJbmNsdWRlIEFkZGl0aW9uYWwgSUUgaW4gYXNzb2MgcmVzcG9uc2UuCisqCitXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfREFUQSAgICBTICAgICAyNTUgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDAKKworKgorKiBJbmNsdWRlIEFkZGl0aW9uYWwgUDJQIElFcyBpbiBwcm9iZSByZXF1ZXN0LgorKgorV05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0ZMQUcgICAgSSAgICA0ICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMSAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDEgMAorCisqCisqIEluY2x1ZGUgQWRkaXRpb25hbCBQMlAgSUUgaW4gcHJvYmUgcmVxdWVzdC4KKyoKK1dOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9EQVRBICAgIFMgICAgIDI1NSAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMAorCisKKyoKKyogSW5jbHVkZSBBZGRpdGlvbmFsIElFcyBpbiBwcm9iZSByZXNwb25zZS9iZWFjb24uCisqCitXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0ZMQUcgICAgSSAgICA0ICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAxIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAxIDAKKworCisqCisqIEluY2x1ZGUgQWRkaXRpb25hbCBJRXMgaW4gcHJvYmUgcmVzcG9uc2UvYmVhY29uLgorKgorV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBICAgIFMgICAgMjU1ICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgMAorCisKKyoKKyogd3BzQXBFbmFibGUgYW5kIHdwc1N0YUVuYWJsZSBpcyBzcGVjaWZpZWQgaW4gaGVyZQorKiB3cHNBcEVuYWJsZSBpcyBiaXQgIzAgYW5kIHdwc1N0YUVuYWJsZSBpcyBiaXQgIzEKKyoKK1dOSV9DRkdfV1BTX0VOQUJMRSAgSSAgIDQgICA3CitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmYgICAgMAorViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmICAgIDAKKworI0VOVU0gQVAgICAgICAgICAxCisjRU5VTSBTVEEgICAgICAgIDIKKworV05JX0NGR19XUFNfU1RBVEUgIEkgICA0ICAgNworViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmICAgMQorViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmICAgMQorCisqCisqIFRSVUUgPT4gaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGluIFByb2JlIFJlcXVlc3RzLCBGQUxTRSA9PiBvbWl0IGl0CisqCisKK1dOSV9DRkdfV1BTX1BST0JFX1JFUV9GTEFHICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitMSU0KKzAgMSAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgMSAwCisKKyoKKyogV2ktRmkgUHJvdGVjdGVkIFNldHVwIFZlcnNpb24KKyoKKyogVGhpcyAgb25lLWJ5dGUgZmllbGQgaXMgYnJva2VuIGludG8gYSBmb3VyLWJpdCBtYWpvcgorKiBwYXJ0IHVzaW5nIHRoZSB0b3AgTVNCcyBhbmQgZm91ci1iaXQgIG1pbm9yIHBhcnQKKyogdXNpbmcgdGhlIExTQnMuIEFzIGFuIGV4YW1wbGUsIHZlcnNpb24gMy4yIHdvdWxkIGJlIDB4MzIuCisqCisKK1dOSV9DRkdfV1BTX1ZFUlNJT04gIEkgICA0ICAgNworViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmICAgMHgxMAorViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmICAgMHgxMAorCisqCisqIFdpLUZpIFByb3RlY3RlZCBTZXR1cCBSZXF1ZXN0IHR5cGUKKyogMHgwMDogRW5yb2xsZWUsIEluZm8gb25seQorKiAweDAxOiBFbnJvbGxlZSwgb3BlbiA4MDIuMVgKKyogMHgwMjogUmVnaXN0cmFyCisqIDB4MDM6IFdMQU4gTWFuYWdlciBSZWdpc3RyYXIKKworV05JX0NGR19XUFNfUkVRVUVTVF9UWVBFICBJICAgNCAgIDcKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZiAgIDB4MDAKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZiAgIDB4MDMKKworKiBDb25maWd1cmF0aW9uIE1ldGhvZChzKQorKgorKiBUaGUgQ29uZmlnIE1ldGhvZHMgRGF0YSBjb21wb25lbnQgbGlzdHMgdGhlIGNvbmZpZ3VyYXRpb24gbWV0aG9kcworKiB0aGUgRW5yb2xsZWUgb3IgUmVnaXN0cmFyIHN1cHBvcnRzLiAgVGhlIGxpc3QgaXMgYSBiaXR3aXNlIE9SIG9mCisqIHZhbHVlcyBmcm9tIHRoZSB0YWJsZSBiZWxvdy4gSW4gYWRkaXRpb24gdG8gQ29uZmlnIE1ldGhvZHMsIEFQcyBhbmQKKyogU1RBcyB0aGF0IHN1cHBvcnQgdGhlIFVQblAgTWFuYWdlbWVudCBJbnRlcmZhY2UgbXVzdCBzdXBwb3J0IHRoZQorKiBQZXJtaXR0ZWQgQ29uZmlnIE1ldGhvZHMgYXR0cmlidXRlLCB3aGljaCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlCisqIENvbmZpZyBNZXRob2RzIHRoYXQgYXJlIGVuYWJsZWQgb24gdGhhdCBBUC4KKyoKKyogVmFsdWUgICBIYXJkd2FyZSBJbnRlcmZhY2UKKyogMHgwMDAxICBVU0JBIChGbGFzaCBEcml2ZSkKKyogMHgwMDAyICBFdGhlcm5ldAorKiAweDAwMDQgIExhYmVsCisqIDB4MDAwOCAgRGlzcGxheQorKiAweDAwMTAgIEV4dGVybmFsIE5GQyBUb2tlbgorKiAweDAwMjAgIEludGVncmF0ZWQgTkZDIFRva2VuCisqIDB4MDA0MCAgTkZDIEludGVyZmFjZQorKiAweDAwODAgIFB1c2hCdXR0b24KKyogMHgwMTAwICBLZXlwYWQKKyoKKyogVGhlIGJvdHRvbSAxNiBiaXRzIGNvbnRhaW4gdGhlIGNvbmZpZ3VyYXRpb24gbWV0aG9kKHMpIHdoZW4gYWN0aW5nCisqIGFzIGFuIEVucm9sbGVlLCBhbmQgdGhlIHRvcCAxNiB3aGVuIGFjdGluZyBhcyBhIFJlZ2lzdHJhci4KKyoKKyogUU5FLVRPRE86IE1lcmdlIHRoaXMgd2l0aCB0aGUgaW5hcHByb3ByaWF0ZWx5IG5hbWVkCisqICdXTklfQ0ZHX1dTQ19BUF9DRkdfTUVUSE9EJy0tIHRoaXMgb25lIGNhbiBzZXJ2ZSBib3RoIHB1cG9zZXMuCisqCisKK1dOSV9DRkdfV1BTX0NGR19NRVRIT0QgIEkgICA0ICAgNworViAgICBSVyAgICBOUAorTElNCiswICAgIDB4RkZGRkZGRkYgICAweDAwMDAwMDA4CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMHhGRkZGRkZGRiAgIDB4MDE4YzAxOGUKKworKiBVVUlECisqIFRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciAoVVVJRCkgZWxlbWVudCBpcyBhIHVuaXF1ZQorKiBHVUlEIGdlbmVyYXRlZCBieSB0aGUgRW5yb2xsZWUgb3IgUmVnaXN0cmFyLiBJdCB1bmlxdWVseSBpZGVudGlmaWVzCisqIGFuIG9wZXJhdGlvbmFsIGRldmljZSBhbmQgc2hvdWxkIHN1cnZpdmUgcmVib290cyBhbmQgcmVzZXRzLiAgVGhlCisqIFVVSUQgaXMgcHJvdmlkZWQgaW4gYmluYXJ5IGZvcm1hdC4gSWYgdGhlIGRldmljZSBhbHNvIHN1cHBvcnRzIFVQblAsCisqIHRoZW4gdGhlIFVVSUQgY29ycmVzcG9uZHMgdG8gdGhlIFVQblAgVVVJRC4KKyoKKyogUU5FLVRPRE86IFJlLW5hbWUgdGhlaXIgY2ZnIGZyb20gJ1dOSV9DRkdfVVVJRCcKKworV05JX0NGR19XUFNfVVVJRCAgICBTICAgIDE2ICAgIDgKK1YgICAgUlcgICAgTlAKK0xJTQorNiAgICAweGEgMHhiIDB4YyAweGQgMHhlIDB4ZgorViAgICBSVyAgICBOUAorTElNCis2ICAgIDB4YSAweGIgMHhjIDB4ZCAweGUgMHhmCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGUgZm9sbG93aW5nIGNmZ3MgY29udGFpbnMgdGhlIHByaW1hcnkgdHlwZSBvZiB0aGUgZGV2aWNlLiBJdHMgZm9ybWF0CisqIGZvbGxvd3M6CisqCisqICAwIDEgMiAzCisqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICB8IEF0dHJpYnV0ZSBJRCAgICAgICAgICAgICAgICAgICB8IExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyogIHwgQ2F0ZWdvcnkgSUQgICAgICAgICAgICAgICAgICAgIHwgT1VJICgxLTIpICAgICAgICAgICAgICAgICAgICB8CisqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworKiAgfCBPVUkgKDMtNCkgICAgICAgICAgICAgICAgICAgICAgfCBTdWIgQ2F0ZWdvcnkgSUQgICAgICAgICAgICAgIHwKKyogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqCisqIFZlbmRvci1zcGVjaWZpYyBzdWItY2F0ZWdvcmllcyAgYXJlIGRlc2lnbmF0ZWQgYnkgIHNldHRpbmcgdGhlIE9VSSAgdG8gdGhlCisqIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAgdGhhdCB2ZW5kb3IuICBOb3RlIHRoYXQgYSAgZm91ci1ieXRlIHN1YmRpdmlkZWQgT1VJCisqIGlzIHVzZWQuIEZvciB0aGUgcHJlZGVmaW5lZCB2YWx1ZXMsIHRoZSAgV2ktRmkgQWxsaWFuY2UgT1VJIG9mIDAwIDUwIEYyIDA0CisqIGlzIHVzZWQuICBUaGUgcHJlZGVmaW5lZCB2YWx1ZXMgIGZvciBDYXRlZ29yeSBJRCAgYW5kIFN1YiBDYXRlZ29yeSAgSUQgYXJlCisqIHByb3ZpZGVkIGluIHRoZSBuZXh0IHRhYmxlLiBUaGVyZSAgaXMgbm8gd2F5IHRvIGluZGljYXRlIGEgdmVuZG9yLXNwZWNpZmljCisqIG1haW4gZGV2aWNlICBjYXRlZ29yeS4gVGhlIE9VSSBhcHBsaWVzICBvbmx5IHRvIHRoZSAgaW50ZXJwcmV0YXRpb24gb2YgdGhlCisqIFN1YiBDYXRlZ29yeS4gSWYgIGEgdmVuZG9yIGRvZXMgbm90IHVzZSBzdWIgY2F0ZWdvcmllcyAgZm9yIHRoZWlyIE9VSSwgdGhlCisqIHRocmVlLWJ5dGUgT1VJICBvY2N1cGllcyB0aGUgZmlyc3QgIHRocmVlIGJ5dGVzIG9mICB0aGUgT1VJIGZpZWxkICBhbmQgdGhlCisqIGZvdXJ0aCBieXRlIGlzIHNldCB0byB6ZXJvLgorKgorKiAgQ2F0ZWdvcnkgICAgICAgICAgICAgIElEIFZhbHVlICBTdWIgQ2F0ZWdvcnkgICAgICAgICAgICAgSUQgVmFsdWUKKyogIENvbXB1dGVyICAgICAgICAgICAgICAxICAgICAgICAgUEMgICAgICAgICAgICAgICAgICAgICAgIDEKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyICAgICAgICAgICAgICAgICAgIDIKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWEgQ2VudGVyICAgICAgICAgICAgIDMKKyogIElucHV0IERldmljZSAgICAgICAgICAyCisqICBQcmludGVycywgU2Nhbm5lcnMsICAgICAgICAgICAgIFByaW50ZXIgICAgICAgICAgICAgICAgICAxCisqICBGYXhlcyBhbmQgQ29waWVycyAgICAgMyAgICAgICAgIFNjYW5uZXIgICAgICAgICAgICAgICAgICAyCisqICBDYW1lcmEgICAgICAgICAgICAgICAgNCAgICAgICAgIERpZ2l0YWwgU3RpbGwgQ2FtZXJhICAgICAxCisqICBTdG9yYWdlICAgICAgICAgICAgICAgNSAgICAgICAgIE5BUyAgICAgICAgICAgICAgICAgICAgICAxCisqICBOZXR3b3JrICAgICAgICAgICAgICAgICAgICAgICAgIEFQICAgICAgICAgICAgICAgICAgICAgICAxCisqICBJbmZyYXN0cnVjdHVyZSAgICAgICAgNiAgICAgICAgIFJvdXRlciAgICAgICAgICAgICAgICAgICAyCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaCAgICAgICAgICAgICAgICAgICAzCisqICBEaXNwbGF5cyAgICAgICAgICAgICAgNyAgICAgICAgIFRlbGV2aXNpb24gICAgICAgICAgICAgICAxCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZWN0cm9uaWMgUGljdHVyZSBGcmFtZSAyCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3RvciAgICAgICAgICAgICAgICAzCisqICBNdWx0aW1lZGlhIERldmljZXMgICAgOCAgICAgICAgIERBUiAgICAgICAgICAgICAgICAgICAgICAxCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBWUiAgICAgICAgICAgICAgICAgICAgICAyCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DWCAgICAgICAgICAgICAgICAgICAgICAzCisqICBHYW1pbmcgRGV2aWNlcyAgICAgICAgOSAgICAgICAgIFhib3ggICAgICAgICAgICAgICAgICAgICAxCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhib3gzNjAgICAgICAgICAgICAgICAgICAyCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXlzdGF0aW9uICAgICAgICAgICAgICAzCisqICBUZWxlcGhvbmUgICAgICAgICAgICAgMTAgICAgICAgIFdpbmRvd3MgTW9iaWxlICAgICAgICAgICAxCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKiBRTkUtVE9ETzogUmVuYW1lIHRoZWlyIGNmZyBmcm9tICdXTklfQ0ZHX1BSSU1fREVWSUNFX0NBVEVHT1JZJworV05JX0NGR19XUFNfUFJJTUFSWV9ERVZJQ0VfQ0FURUdPUlkgIEkgICA0ICAgNworViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmZmYgICAxCitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmZmZiAgIDYKKworKiBRTkUtVE9ETzogUmVuYW1lIHRoZWlyIGNmZyBmcm9tICdXTklfQ0ZHX1BSSU1fREVWSUNFX09VSScKK1dOSV9DRkdfV1BTX1BJTUFSWV9ERVZJQ0VfT1VJICBJICAgNCAgIDcKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmZmZmZiAgIDB4MDA1MGYyMDQKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmZmZmZiAgIDB4MDA1MGYyMDQKKworKiBRTkUtVE9ETzogUmVuYW1lIHRoZWlyIGNmZyBmcm9tICdXTklfQ0ZHX1BSSU1fREVWSUNFX1NVQl9DQVRFR09SWScKK1dOSV9DRkdfV1BTX0RFVklDRV9TVUJfQ0FURUdPUlkgIEkgICA0ICAgNworViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmZmYgICAxCitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmZmZiAgIDEKKworKiBBc3NvY2lhdGlvbiBTdGF0ZQorKgorCisqIFRoZSBBc3NvY2lhdGlvbiBTdGF0ZSBjb21wb25lbnQgc2hvd3MgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHByZXZpb3VzCisqIGFzc29jaWF0aW9uIHN0YXRlIG9mIHRoZSB3aXJlbGVzcyBzdGF0aW9uIHdoZW4gc2VuZGluZyBhIERpc2NvdmVyeQorKiByZXF1ZXN0LgorKgorKiBBc3NvY2lhdGlvbiBTdGF0ZSAgICBEZXNjcmlwdGlvbgorKiAwICAgICAgICAgICAgICAgICAgICBOb3QgQXNzb2NpYXRlZAorKiAxICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIFN1Y2Nlc3MKKyogMiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBGYWlsdXJlCisqIDMgICAgICAgICAgICAgICAgICAgIEFzc29jaWF0aW9uIEZhaWx1cmUKKyogNCAgICAgICAgICAgICAgICAgICAgSVAgRmFpbHVyZQorCitXTklfQ0ZHX1dQU19BU1NPQ0lBVElPTl9TVEFURSAgSSAgIDQgICA3CitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmZmZiAgIDAKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmICAgMAorCisqIENvbmZpZ3VyYXRpb24gRXJyb3IKKyoKKyogVGhlICBDb25maWd1cmF0aW9uICBFcnJvciAgY29tcG9uZW50ICAgc2hvd3MgIHRoZSAgcmVzdWx0ICBvZiAgdGhlICBkZXZpY2UKKyogYXR0ZW1wdGluZyB0byBjb25maWd1cmUgaXRzZWxmIGFuZCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgV0xBTi4KKyoKKyogIENvbmZpZ3VyYXRpb24gRXJyb3IgIERlc2NyaXB0aW9uCisqICAgMCAgICAgICAgICAgICAgICAgICBObyBFcnJvcgorKiAgIDEgICAgICAgICAgICAgICAgICAgT09CIEludGVyZmFjZSBSZWFkIEVycm9yCisqICAgMiAgICAgICAgICAgICAgICAgICBEZWNyeXB0aW9uIENSQyBGYWlsdXJlCisqICAgMyAgICAgICAgICAgICAgICAgICAyLjQgY2hhbm5lbCBub3Qgc3VwcG9ydGVkCisqICAgNCAgICAgICAgICAgICAgICAgICA1LjAgY2hhbm5lbCBub3Qgc3VwcG9ydGVkCisqICAgNSAgICAgICAgICAgICAgICAgICBTaWduYWwgdG9vIHdlYWsKKyogICA2ICAgICAgICAgICAgICAgICAgIE5ldHdvcmsgYXV0aCBmYWlsdXJlCisqICAgNyAgICAgICAgICAgICAgICAgICBOZXR3b3JrIGFzc29jaWF0aW9uIGZhaWx1cmUKKyogICA4ICAgICAgICAgICAgICAgICAgIE5vIERIQ1AgcmVzcG9uc2UKKyogICA5ICAgICAgICAgICAgICAgICAgIEZhaWxlZCBESENQIGNvbmZpZworKiAgMTAgICAgICAgICAgICAgICAgICAgSVAgYWRkcmVzcyBjb25mbGljdAorKiAgMTEgICAgICAgICAgICAgICAgICAgQ291bGRudCBjb25uZWN0IHRvIFJlZ2lzdHJhcgorKiAgMTIgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgUEJDIHNlc3Npb25zIGRldGVjdGVkCisqICAxMyAgICAgICAgICAgICAgICAgICBSb2d1ZSBhY3Rpdml0eSBzdXNwZWN0ZWQKKyogIDE0ICAgICAgICAgICAgICAgICAgIERldmljZSBidXN5CisqICAxNSAgICAgICAgICAgICAgICAgICBTZXR1cCBsb2NrZWQKKyogIDE2ICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgVGltZW91dAorKiAgMTcgICAgICAgICAgICAgICAgICAgUmVnaXN0cmF0aW9uIFNlc3Npb24gVGltZW91dAorKiAgMTggICAgICAgICAgICAgICAgICAgRGV2aWNlIFBhc3N3b3JkIEF1dGggRmFpbHVyZQorKgorKiBUaGUgRGV2aWNlIGJ1c3kgZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIHNlbmRpbmcgZGV2aWNlIGlzIHVuYWJsZSB0bworKiByZXNwb25kIHRvIHRoZSByZXF1ZXN0IGR1ZSB0byBzb21lIGludGVybmFsIGNvbmZsaWN0IG9yIHJlc291cmNlCisqIGNvbnRlbnRpb24gaXNzdWUuIEZvciBleGFtcGxlLCBpZiBhIGRldmljZSBpcyBvbmx5IGNhcGFibGUgb2YKKyogcGVyZm9ybWluZyBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgUmVnaXN0cmF0aW9uIFByb3RvY29sIGF0IGEgdGltZSwKKyogaXQgbWF5IHJldHVybiB0aGlzIGVycm9yIGluIHJlc3BvbnNlIHRvIGF0dGVtcHRzIHRvIHN0YXJ0IGFub3RoZXIKKyogaW5zdGFuY2UgaW4gdGhlIG1pZGRsZSBvZiBhbiBhY3RpdmUgc2Vzc2lvbi4KKworV05JX0NGR19XUFNfQ09ORklHVVJBVElPTl9FUlJPUiAgSSAgIDQgICA3CitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmZmZiAgIDAKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmICAgMAorCisqIERldmljZSBQYXNzd29yZCBJRAorKgorCisqIFRoaXMgIGF0dHJpYnV0ZSBpcyAgdXNlZCAgdG8gaWRlbnRpZnkgIGEgIGRldmljZSBwYXNzd29yZC4gIFRoZXJlIGFyZSAgc2l4CisqIHByZWRlZmluZWQgdmFsdWVzICBhbmQgdGVuIHJlc2VydmVkIHZhbHVlcy4gIElmIHRoZSBEZXZpY2UgIFBhc3N3b3JkIElEIGlzCisqIERlZmF1bHQsICB0aGUgRW5yb2xsZWUgIHNob3VsZCB1c2UgIGl0cyBQSU4gIHBhc3N3b3JkIChmcm9tICB0aGUgIGxhYmVsIG9yCisqIGRpc3BsYXkpLiAgVGhpcyAgcGFzc3dvcmQgbWF5ICBjb3JyZXNwb25kICB0byAgdGhlICBsYWJlbCwgZGlzcGxheSwgIG9yICBhCisqIHVzZXItZGVmaW5lZCAgcGFzc3dvcmQgdGhhdCBoYXMgIGJlZW4gY29uZmlndXJlZCAgdG8gcmVwbGFjZSAgdGhlIG9yaWdpbmFsCisqIGRldmljZSBwYXNzd29yZC4KKyoKKyogVXNlci1zcGVjaWZpZWQgaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgIGhhcyBvdmVycmlkZGVuIHRoZSBwYXNzd29yZCB3aXRoIGEKKyogbWFudWFsbHkgIHNlbGVjdGVkIHZhbHVlLiAgTWFjaGluZS1zcGVjaWZpZWQgIGluZGljYXRlcyB0aGF0ICB0aGUgb3JpZ2luYWwKKyogUElOICBwYXNzd29yZCBoYXMgIGJlZW4gb3ZlcnJpZGRlbiAgYnkgYSAgc3Ryb25nLCAgbWFjaGluZWdlbmVyYXRlZCBkZXZpY2UKKyogcGFzc3dvcmQgIHZhbHVlLiAgVGhlIFJla2V5ICB2YWx1ZSAgaW5kaWNhdGVzICB0aGF0ICB0aGUgZGV2aWNlJ3MgIDI1Ni1iaXQKKyogcmVrZXlpbmcgcGFzc3dvcmQgIHdpbGwgYmUgdXNlZC4gIFRoZSBQdXNoQnV0dG9uIHZhbHVlIGluZGljYXRlcyAgdGhhdCB0aGUKKyogUElOICBpcyAgdGhlIGFsbC16ZXJvICB2YWx1ZSAgcmVzZXJ2ZWQgIGZvciAgdGhlIFB1c2hCdXR0b24gIENvbmZpZ3VyYXRpb24KKyogbWV0aG9kLgorKgorKiBUaGUgUmVnaXN0cmFyLXNwZWNpZmllZCB2YWx1ZSBpbmRpY2F0ZXMgYSAgUElOIHRoYXQgaGFzIGJlZW4gb2J0YWluZWQgZnJvbQorKiB0aGUgUmVnaXN0cmFyICh2aWEgYSBkaXNwbGF5ICBvciBvdGhlciBvdXQtb2YtYmFuZCBtZXRob2QpLiBUaGlzIHZhbHVlIG1heQorKiBiZSBmdXJ0aGVyICBhdWdtZW50ZWQgd2l0aCB0aGUgIG9wdGlvbmFsICdJZGVudGl0eScgYXR0cmlidXRlIGluICBNMS4gVGhpcworKiBhdWdtZW50YXRpb24gaXMgdXNlZnVsIHdoZW4gbXVsdGlwbGUgcHJlZGVmaW5lZCBVc2VySUQvUElOIHBhaXJzIGhhdmUgYmVlbgorKiBlc3RhYmxpc2hlZCAgYnkgYSAgUmVnaXN0cmFyIHN1Y2ggIGFzICBhbiBhdXRoZW50aWNhdG9yICB1c2VkIGZvciAgSG90c3BvdAorKiBhY2Nlc3MuIElmIHRoZSAgRGV2aWNlIFBhc3N3b3JkIElEIGluICBNMSBpcyBub3Qgb25lIG9mICB0aGUgcHJlZGVmaW5lZCBvcgorKiByZXNlcnZlZCB2YWx1ZXMsIGl0IGNvcnJlc3BvbmRzIHRvIGEgcGFzc3dvcmQgZ2l2ZW4gdG8gdGhlIFJlZ2lzdHJhciBhcyBhbgorKiBPT0IgRGV2aWNlIFBhc3N3b3JkLgorKgorKiAgVmFsdWUgICAgICAgICAgICBEZXNjcmlwdGlvbgorKiAgMHgwMDAwICAgICAgICAgICBEZWZhdWx0IChQSU4pCisqICAweDAwMDEgICAgICAgICAgIFVzZXItc3BlY2lmaWVkCisqICAweDAwMDIgICAgICAgICAgIE1hY2hpbmUtc3BlY2lmaWVkCisqICAweDAwMDMgICAgICAgICAgIFJla2V5CisqICAweDAwMDQgICAgICAgICAgIFB1c2hCdXR0b24KKyogIDB4MDAwNSAgICAgICAgICAgUmVnaXN0cmFyLXNwZWNpZmllZAorKiAgMHgwMDA2IC0gMHgwMDBGICBSZXNlcnZlZCcKKyoKKworV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEICBJICAgNCAgIDcKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmZmZmZiAgIDAKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmZmZmZiAgIDAKKworKgorKiBXUFMgQXNzb2NpYXRpb24KKyoKKyogV2ktRmkgUHJvdGVjdGVkIFNldHVwIHJlcXVpcmVzICBhIHByb3NwZWN0aXZlIGVucm9sbGVlIHRvIGFzc29jaWF0ZSB0bworKiBhbiBBUCAgaW4gdGhlICBuZXR3b3JrIGluIHdoaWNoICB0aGUgU1RBICB3b3VsZCBsaWtlIHRvICBlbnJvbGwuICBPbmNlCisqIGFzc29jaWF0ZWQsICB0aGUgZW5yb2xsbWVudCAgdGFrZXMgIHBsYWNlIG92ZXIgIGFuIEVBUE9MICBjb252ZXJzYXRpb24KKyogKHRoZXJlJ3MgIGFjdHVhbGx5ICBhICBuZXcgICBFQVAgIG1ldGhvZDogIEVBUC1XU0MpLiAgIFRoZSAgU1RBICB3b3VsZAorKiBwcmVzdW1hYmx5ICBzZW5kIGFuIEVBUE9MLVN0YXJ0ICBvdmVyIGhpcyAgbmV3IGxpbmssICB0byB3aGljaCAgdGhlIEFQCisqIHdvdWxkIHJlc3BvbmQgd2l0aCAgYW4gRUFQIElkZW50aXR5IFJlcXVlc3QuICBXaGVuICB0aGUgU1RBIHNlbmRzIGJhY2sKKyogIldTQy1FbnJvbGxlZS0xIiBhcyBoaXMgRUFQIElkZW50aXR5LCB0aGUgQVAga25vd3MgdGhhdCBoZSdzIGdvdCBhIFdQUworKiBzdXBwbGljYW50IG9uIGhpcyBoYW5kcywgYW5kIHByb2NlZWRzIHRvIHRhbGsgRUFQLVdTQy4KKyoKKyogVG93YXJkIHRoZSBlbmQgb2YgdGhlICBzcGVjaWZpY2F0aW9uJ3MgZGV2ZWxvcG1lbnQsIGEgcHJvYmxlbSBjYW1lIHVwLgorKiBNaWNyb3NvZnQncyBFQVAgc3VwcGxpY2FudCAgb24gWFAgU1AxICYgU1AyICB3aWxsIHNlbmQgYW4gRUFQT0wtU3RhcnQsCisqIG5vIG1hdHRlciAgd2hhdC4gIEV2ZW4gIGlmIHRoZSAgQVAgaXMgYmVhY29uaW5nICBXUEEtUFNLLCBzYXksICB0aGUgTVMKKyogc3VwcGxpY2FudCB3aWxsIHNlbmQgIGFuIEVBUE9MLVN0YXJ0LiAgSWYgaXQgcmVjZWl2ZXMgIGFuIEVBUCBJZGVudGl0eQorKiBSZXF1ZXN0ICBpbiByZXR1cm4sICBpdCBkZWNpZGVzICB0aGF0IHRoZSAgQVAgaXMgIHJlYWxseSAgdXNpbmcgODAyLjF4CisqIGF1dGhlbnRpY2F0aW9uLCBhbmQgcHJvY2VlZHMgb24gdGhhdCBhc3N1bXB0aW9uLgorKgorKiBOb3csIGltYWdpbmUgYW4gQVAgdGhhdCBpcyBjb25maWd1cmVkIGZvciBXUEEtUFNLLCBhbmQgaXMgV1BTLWNhcGFibGUuCisqIEl0IHJlY2VpdmVzICBhbiBhc3NvY2lhdGlvbiAgcmVxdWVzdCBmcm9tIHNvbWUgIFNUQSwgYW5kIHRoZW4gIHNlZXMgYW4KKyogRUFQT0wtU3RhcnQgZnJvbSB0aGUgbmV3bHkgam9pbmVkIFNUQS4gIEl0IG5hdHVyYWxseSBzZW5kcyBiYWNrIGFuIEVBUAorKiBJZGVudGl0eSBSZXF1ZXN0ICB0byBzZWUgIGlmIHRoZSAgbmV3IFNUQSB3YW50cyAgdG8gdGFsayAgRUFQLVdTQy4gIE9uCisqIFdpbmRvd3MgWFAgU1AxICYgU1AyLCB0aGUgIHN1cHBsaWNhbnQgd2lsbCB0YWtlIHRoYXQgdG8gbWVhbiB0aGF0IHRoaXMKKyogQVAgaXMgdXNpbmcgODAyLjF4IGF1dGhlbnRpY2F0aW9uLCBhbmQgd2lsbCBuZXZlciBsZXQgdGhlIHVzZXIgcHJvdmlkZQorKiB0aGUgUFNLLiBDb25zZXF1ZW50bHksICBXWkMgd2lsbCBuZXZlciBiZSBhYmxlICB0byBhc3NvY2lhdGUgd2l0aCB0aGlzCisqIEFQLgorKgorKiBOYXR1cmFsbHksICBNaWNyb3NvZnQncyAgc29sdXRpb24gd2FzICB0byAgaGF2ZSAgdGhlICB3b3JsZCBjaGFuZ2UgIHRvCisqIGFjY29tbW9kYXRlIHRoZW0uICBBZnRlciBhIGxvdCBvZiBiYWNrICYgZm9ydGgsIHRoZSBXRkEgZGVjaWRlZCBvbiB0aGUKKyogZm9sbG93aW5nIGNoYW5nZSB0byB0aGUgV1BTIHNwZWM6IHdoZW4gYXNzb2NpYXRpbmcgZm9yIHB1cnBvc2VzIG9mIFdQUworKiBlbnJvbGxtZW50LCAiQSAgY2xpZW50IHRoYXQgaW50ZW5kcyB0byAgdXNlIHRoZSBFQVAtV1NDICBtZXRob2Qgd2l0aCBhCisqIFdTQyAgZW5hYmxlZCBBUCBtYXkgIGluY2x1ZGUgYSAgV1NDIElFICBpbiBpdHMgIDgwMi4xMSAocmUpYXNzb2NpYXRpb24KKyogcmVxdWVzdC4gSWYgYSBXU0MgSUUgaXMgcHJlc2VudCBpbiB0aGUgKHJlKWFzc29jaWF0aW9uIHJlcXVlc3QsIHRoZSBBUAorKiBzaGFsbCBlbmdhZ2UgIGluIEVBUC1XU0Mgd2l0aCB0aGUgIHN0YXRpb24gYW5kIG11c3QgIG5vdCBhdHRlbXB0IG90aGVyCisqIHNlY3VyaXR5IGhhbmRzaGFrZS4gIElmIHRoZSBjbGllbnQgIGRvZXMgbm90IGluY2x1ZGUgIGEgV1NDIElFICBpbiBpdHMKKyogODAyLjExIChyZSlhc3NvY2lhdGlvbiByZXF1ZXN0LCBpdCBtdXN0IHNlbmQgaXRzIDgwMi4xMSBBdXRoZW50aWNhdGlvbgorKiBmcmFtZSAgd2l0aCAgQXV0aGVudGljYXRpb24gc2V0ICB0byAgb3BlbiAgYW5kICBhbiA4MDIuMTEgIEFzc29jaWF0aW9uCisqIFJlcXVlc3QgZnJhbWUgd2l0aG91dCAgYW4gUlNOIElFIG9yIFNTTiBJRSwgIHJlZ2FyZGxlc3Mgb2YgdGhlIG5ldHdvcmsKKyogdHlwZSB0aGF0IGlzICBob3N0ZWQgYnkgdGhlIEFQLiBPbiAgc3VjY2Vzc2Z1bCBhc3NvY2lhdGlvbiwgdGhlIGNsaWVudAorKiB3aWxsICAgdGhlbiAgIHNlbmQgIGFuICAgRUFQT0wtU3RhcnQgICB0byAgIHRoZSAgIEFQICBhbmQgICB3YWl0ICAgZm9yCisqIEVBUC1SZXF1ZXN0L0lkZW50aXR5LiAgV2hlbiAgdGhlICAgY2xpZW50ICByZWNlaXZlcyAgYW4gIEVBUCAgUmVxdWVzdC8KKyogSWRlbnRpdHksICAgaXQgIHdpbGwgIHJlc3BvbmQgICB3aXRoICBFQVAtUmVzcG9uc2UvSWRlbnRpdHkgICBhbmQgIHRoZQorKiBhcHByb3ByaWF0ZSBXU0Mgc3RyaW5nIHRvIGluZGljYXRlICBpZiBpdCBpcyBhbiBFbnJvbGxlZSBvciBSZWdpc3RyYXIuCisqICcKKyoKKyogVGhpcyBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGNvbnRhaW5zIGEgYml0dmVjdG9yOgorKgorKiAweDAwMDEgSW5jbGR1ZSB0aGUgV1BTIEluZm9ybWF0aW9uIEVsZW1lbnQgaW4gQXNzb2MgUmVxdWVzdCBmcmFtZXMKKyogMHgwMDAyIEVsaWRlIHRoZSB0aGUgV1BBIGFuZCBSU04gSW5mb3JtYXRpb24gRWxlbWVudHMgZnJvbSB0aGUKKyogICAgICAgIEFzc29jIFJlcXVlc3QgZnJhbWUKKyoKKworV05JX0NGR19XUFNfQVNTT0NfTUVUSE9EICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitMSU0KKzAgMHhmZmZmIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAweGZmZmYgMAorCisqCisqIExvdyBnYWluIG92ZXJyaWRlCisqCisKK1dOSV9DRkdfTE9XX0dBSU5fT1ZFUlJJREUgICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgIDAKKworKgorKiBMaXN0ZW4gTW9kZSBFbmFibGUvRGlzYWJsZQorKgorCitXTklfQ0ZHX0VOQUJMRV9QSFlfQUdDX0xJU1RFTl9NT0RFICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMTI4ICAgIDEyOAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDEyOCAgICAxMjgKKworKgorKiBPbiBjaGlwIHJlb2RlcmluZyBwb2xsaW5nIHRocmVzaG9sZAorKgorCitXTklfQ0ZHX1JQRV9QT0xMSU5HX1RIUkVTSE9MRCAgICBJICAgIDQgICAgMgorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDEwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMTAKKworKgorKiBPbiBjaGlwIHJlb2RlcmluZyBhZ2luZyB0aHJlc2hvbGQgZm9yIEFDMAorKgorCitXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMF9SRUcgICAgSSAgICA0ICAgIDIKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAzMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDMwCisKKyoKKyogT24gY2hpcCByZW9kZXJpbmcgYWdpbmcgdGhyZXNob2xkIGZvciBBQzEKKyoKKworV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzFfUkVHICAgIEkgICAgNCAgICAyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMzAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAzMAorCisqCisqIE9uIGNoaXAgcmVvZGVyaW5nIGFnaW5nIHRocmVzaG9sZCBmb3IgQUMyCisqCisKK1dOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMyX1JFRyAgICBJICAgIDQgICAgMgorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDMwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMzAKKworKgorKiBPbiBjaGlwIHJlb2RlcmluZyBhZ2luZyB0aHJlc2hvbGQgZm9yIEFDMworKgorCitXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDM19SRUcgICAgSSAgICA0ICAgIDIKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAzMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDMwCisKKyoKKyogTnVtYmVyIG9mIE9uLUNoaXAgcmVvcmRlciBzZXNzaW9ucworKgorCitXTklfQ0ZHX05PX09GX09OQ0hJUF9SRU9SREVSX1NFU1NJT05TICAgIEkgICAgNCAgICAyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMiAgICAxCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMiAgICAxCisKKworKgorKiBTaW5nbGUgUkMgZm9yIGFsbCBUSUQKKyoKKworV05JX0NGR19TSU5HTEVfVElEX1JDICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDEKKworKgorKiBSUk0gRW5hYmxlZAorKgorCitXTklfQ0ZHX1JSTV9FTkFCTEVEICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKKworKgorKiBSUk0gbWVhc3VyZW1lbnQgbWF4IGR1cmF0aW9uLiBTZWN0aW9uIDExLjEwLjMgODAyLjExay0yMDA4LgorKiBNYXggRHVyYXRpb24gcmVwcmVzZW50ZWQgYXMgbWF4RHVyYXRpb24gaW5UVXMgPSAyXigqV05JX0NGR19SUk1fSU5fQ0hBTl9NQVggLSA0KSAqIGJjbkludHZsCisqIE9wZXJhdGluZyBjaGFubmVsIG1heCBtZWFzdXJlbWVudCBkdXJhdGlvbi4KKyoKKworV05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDggICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA4ICAgIDAKKworKgorKiBOb24tT3BlcmF0aW5nIGNoYW5uZWwgbWF4IG1lYXN1cmVtZW50IGR1cmF0aW9uLgorKgorCitXTklfQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDggICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA4ICAgIDAKKworKgorKiBUWCBwb3dlciBjb250cm9sIGZlYXR1cmUKKyoKKworV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEUgICAgSSAgIDQgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDEKKworKgorKiAgTUNBU1QgQkNBU1QgZmlsdGVyIFNldHRpbmcKKyogIDA6IE5vIGZpbHRlciwgMTogQmxvY2sgTWNhc3QsIDI6IEJsb2NrIEJjYXN0LCAzOiBCbG9jayBNY2FzdCBhbmQgQmNhc3QKKyoKKworV05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElORyAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDMgICAgMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDMgICAgMAorCisqCisqICBCVEMgREhDUCBObyBvZiBCdCBzbG90cyB0byBibG9jaworKgorV05JX0NGR19CVENfREhDUF9CVF9TTE9UU19UT19CTE9DSyAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDB4RkYgICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAweEZGICAgICAwCisKKyoKKyogIENvbmZpZyBwYXJhbWV0ZXIgdG8gRW5hYmxlL0Rpc2FibGUgRHluYW1pYyBQUy1Qb2xsIG1lY2hhbmlzbQorKiAgMDogRGlzYWJsZSwgeDogRlcgd2lsbCBzZW5kIHggbnVtYmVyIG9mIE5VTEwgZnJhbWVzIGJlZm9yZSBzd2l0Y2hpbmcgdG8gUFMtUG9sbCBtZXhoYW5pc20KKyoKK1dOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMHhGRiAgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMHhGRiAgICAwCisKKyoKKyogUFMgRGF0YSBJbkFjdGl2aXR5IFRpbWVvdXQgKFRVKQorKgorCitXTklfQ0ZHX1BTX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDgwICAgIDAKK05WICAgIFJXICAgIE5QCitOT05FCiswICAgIDgwICAgIDAKKworKgorKiAgQ29uZmlnIHBhcmFtZXRlciB0byBFbmFibGUvRGlzYWJsZSBUZWxlc2NvcGljIEJjbiBXYWtldXBzCisqICAwOiBEaXNhYmxlLCAxOiBFbmFibGUKKyoKKworV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU4gICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgIDAKKworCisqCisqICBDb25maWcgcGFyYW1ldGVyIGZvciBUcmFuc2llbnQgTEkKKyogIDA6IERpc2FibGUsIHg6IFRyYW5zaWVudCBMSQorKgorCitXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNyAgICAzCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNyAgICAzCisKKyoKKyogIENvbmZpZyBwYXJhbWV0ZXIgZm9yIElkbGUgYmNucyBmb3IgVHJhbnNpZW50IExJCisqICB4OiBOdW0gSWRsZSBiY25zIGJlZm9yZSBzd2l0Y2ggdG8gdHJhbnMgTEkKKyoKKworV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlMgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorNSAgICAyNTUgICAgMTAKK1YgICAgUlcgICAgTlAKK0hBTAorNSAgICAyNTUgICAgMTAKKworKgorKiAgQ29uZmlnIHBhcmFtZXRlciBmb3IgTWF4IExJCisqICAwOiBEaXNhYmxlLCB4OiBNYXggTEkKKyoKKworV05JX0NGR19URUxFX0JDTl9NQVhfTEkgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA3ICAgIDUKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA3ICAgIDUKKworKgorKiAgQ29uZmlnIHBhcmFtZXRlciBmb3IgSWRsZSBiY25zIGZvciBtYXggTEkKKyogIHg6IE51bSBJZGxlIGJjbnMgYmVmb3JlIHN3aXRjaCB0byBtYXggTEkKKyoKKworV05JX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzUgICAgMjU1ICAgIDE1CitWICAgIFJXICAgIE5QCitIQUwKKzUgICAgMjU1ICAgIDE1CisKKyoKKyogIEJUQyBESENQIE5vIG9mIEJ0IHN1YiBpbnRlcnZhbCBkdXJpbmcgREhDUAorKgorV05JX0NGR19CVENfQTJEUF9ESENQX0JUX1NVQl9JTlRFUlZBTFMgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAweEZGICAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMHhGRiAgICAgNworCisqCisqIEluZnJhIFNUQSBtb2RlIEtlZXAgYWxpdmUgcGVyaW9kIChpbiBzZWNzKSBmb3IKKyogc2VuZGluZyBrZWVwIGFsaXZlIChRb3MpTnVsbCBmcmFtZXMgdG8gdGhlIEFQLgorKiAwID0gZGlzYWJsZWQuIFJlY29tbWVuZGVkIHZhbHVlcyBpcyAzMCBzZWNzCisqCitXTklfQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRCAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMTAwMCAgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMTAwMCAgICAwCisKKyogTGltaXQgb24gbnVtYmVyIG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMKKyogKGFwcGxpZXMgdG8gcGVlciBzdGF0aW9ucyBpbiBJQlNTLCBTb2Z0QVAsIEJULUFNUCBBUCwgJiBQMlAtR08gbW9kZXMpCisqCisKK1dOSV9DRkdfQVNTT0NfU1RBX0xJTUlUICAgIEkgICA0ICAgOAorViAgICBSVyAgICBOUAorTElNCisxICAgIDMyICAgIDEwCitWICAgIFJXICAgIE5QCitMSU0KKzEgICAgMzIgICAgMTAKKworKgorKiAgU0FQIGNoYW5uZWwgc2VsZWN0IHN0YXJ0IGNoYW5uZWwgbnVtYmVyCisqCitXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitOT05FCisxICAgIDB4RkMgIDEKK1YgICAgUlcgICAgTlAKK05PTkUKKzEgICAgMHhGQyAgMQorCisqCisqICBTQVAgY2hhbm5lbCBzZWxlY3QgZW5kIGNoYW5uZWwgbnVtYmVyCisqCitXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTk9ORQorMSAgICAweEZDICAxMQorViAgICBSVyAgICBOUAorTk9ORQorMSAgICAweEZDICAxMQorCisqCisqICBTQVAgY2hhbm5lbCBzZWxlY3Qgb3BlcmF0aW5nIGJhbmQKKyogIDAtIDIuNEdIWiAvIDEtIExvdyA1R0haIC8yLU1JRCAvMy1ISUdILzQtSmFwYW40LjlHSFoKKyoKK1dOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5EICAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTk9ORQorMCAgICAweDUgICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMHg1ICAgICAwCisKKyoKKyogU29mdGFwIGRhdGEgYXZhaWxhYmxlIHBvbGwgcGVyaW9kIChpbiBtaWxsaXNlY29uZHMpIGZvcgorKiBxdWV1ZWluZyAoUW9zKU51bGwgZnJhbWVzIHRvIHRoZSBzdGF0aW9uIGlmIHRoZXJlCisqIGlzIG5vIGRhdGEgYXZhaWxhYmxlIGFuZCBQUy1Qb2xsL1RyaWdnZXIgZnJhbWUgaXMgcGVuZGluZy4KKyogMCA9IGRpc2FibGVkLiBSZWNvbW1lbmRlZCB2YWx1ZXMgaXMgNW1zCisqCitXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0QgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICA1CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDUKKworKgorKiBDbG9zZSBsb29wIHBvd2VyIGNvbnRyb2wgd2lsbCBiZSBlbmFibGVkIGlmIHZhbHVlIGlzIHNldCB0byAxCisqCisqCisqCitXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QICBJICAgNCAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCisKKyoKKyogTFRFIENvZXhpc3RlbmNlIHdpbGwgYmUgZW5hYmxlZCBpZiB2YWx1ZSBpcyBzZXQgdG8gMQorKgorKgorKgorV05JX0NGR19FTkFCTEVfTFRFX0NPRVggIEkgICA0ICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgIDAKKworKgorKiBBUCBLZWVwIEFsaXZlIFRpbWVvdXQgKFRVKQorKgorV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVQgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMSAgICA2NTUzNSAgICAyMAorViAgICBSVyAgICBOUAorSEFMCisxICAgIDY1NTM1ICAgIDIwCisKKyoKKyogR08gS2VlcCBBbGl2ZSBUaW1lb3V0IChUVSkKKyoKK1dOSV9DRkdfR09fS0VFUF9BTElWRV9USU1FT1VUICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzEgICAgNjU1MzUgICAgMjAKK1YgICAgUlcgICAgTlAKK0hBTAorMSAgICA2NTUzNSAgICAyMAorCisqCisqIE1DIEFkZHIgTGlzdCBwb3dlciBjb250cm9sIHdpbGwgYmUgZW5hYmxlZCBpZiB2YWx1ZSBpcyBzZXQgdG8gMQorKgorKgorKgorV05JX0NGR19FTkFCTEVfTUNfQUREUl9MSVNUICBJICAgNCAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMSAgICAgMAorCisqCisqIFVDIEZpbHRlciB3aWxsIGJlIGVuYWJsZWQgaWYgdmFsdWUgaXMgc2V0IHRvIDEKKyoKKyoKKyoKK1dOSV9DRkdfRU5BQkxFX1VDX0ZJTFRFUiAgSSAgIDQgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMSAgICAgMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDEgICAgIDAKKworKgorKiBMb3cgUG93ZXIgSW1hZ2UgVHJhbnNpdGlvbiB3aWxsIGJlIGVuYWJsZWQgaWYgdmFsdWUgaXMgc2V0IHRvIDEKKyoKKyoKKyoKK1dOSV9DRkdfRU5BQkxFX0xQV1JfSU1HX1RSQU5TSVRJT04gIEkgICA0ICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgIDAKKworKgorKiBNQ0MgQWRhcHRpdmUgU2NoZWR1bGVyIHdpbGwgYmUgZW5hYmxlZCBpZiB2YWx1ZSBpcyBzZXQgdG8gMQorKgorKgorKgorV05JX0NGR19FTkFCTEVfTUNDX0FEQVBUSVZFX1NDSEVEICBJICAgNCAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCisqCisqRGlzYWJsZSBMRFBDIGluIFNUQSBtb2RlIHdoZW4gQVAgaXMgVFhCRiBjYXBhYmxlCisqCisqCisqCitXTklfQ0ZHX0RJU0FCTEVfTERQQ19XSVRIX1RYQkZfQVAgIEkgICA0ICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgIDAKKworKgorKiBBUCBMaW5rIE1vbml0b3IgVGltZW91dCAoVFUpCisqCitXTklfQ0ZHX0FQX0xJTktfTU9OSVRPUl9USU1FT1VUICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzEgICAgMjU1ICAgIDMKK1YgICAgUlcgICAgTlAKK0hBTAorMSAgICAyNTUgICAgMworCisqCisqVERMUyBTdGF0aW9uJ3MgVUFQU0QgTUFTSyBDb25maWd1cmF0aW9uCisqCisqCisqCitXTklfQ0ZHX1RETFNfUU9TX1dNTV9VQVBTRF9NQVNLICBJICAgNCAgIDcKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxNSAgICAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMTUgICAwCisqCisqVERMUyBTdGF0aW9ucyBCdWZmZXIgU1RBIENhcGFiaWxpdHkKKyoKKyoKKyoKK1dOSV9DRkdfVERMU19CVUZfU1RBX0VOQUJMRUQgIEkgICA0ICAgNworViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMAorKlRETFMgU3RhdGlvbnMgUFVBUFNEIEluYWN0aXZpdHkgVGltZXIKKyoKKyoKKyoKK1dOSV9DRkdfVERMU19QVUFQU0RfSU5BQ1RfVElNRSAgSSAgIDQgICA3CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMTAgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDEwICAgIDAKKypURExTIFN0YXRpb25zIFBVQVBTRCBSWCBGcmFtZSBUaHJlc2hvbGQKKyoKKyoKKyoKK1dOSV9DRkdfVERMU19SWF9GUkFNRV9USFJFU0hPTEQgIEkgICA0ICAgNworViAgICBSVyAgICBOUAorTElNCisxMCAgIDIwICAgIDEwCitWICAgIFJXICAgIE5QCitMSU0KKzEwICAgMjAgICAgMTAKKworKgorKiBQTUYgU0EgUXVlcnkgTWF4aW11bSBSZXRyaWVzCisqCisKK1dOSV9DRkdfUE1GX1NBX1FVRVJZX01BWF9SRVRSSUVTICAgIEkgICAgNCAgICAxCitWICAgIFJXICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAyMCAgIDUKK1YgICAgUlcgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDIwICAgNQorCisqCisqIFBNRiBTQSBRdWVyeSBSZXRyeSBJbnRlcnZhbCAoaW4gVFVzKQorKgorCitXTklfQ0ZHX1BNRl9TQV9RVUVSWV9SRVRSWV9JTlRFUlZBTCAgICBJICAgIDQgICAgMQorViAgICBSVyAgIE5QIFJFU1RBUlQKK05PTkUKKzEwICAgIDIwMDAgMjAwCitWICAgIFJXICAgTlAgUkVTVEFSVAorTk9ORQorMTAgICAgMjAwMCAyMDAKKworCisqCisqTUNDIEVOQUJMRS9ESVNBQkxFIEFEQVBUSVZFIFJYIERyYWluIGZlYXR1cmUKKyoKKyoKKyoKK1dOSV9DRkdfRU5BQkxFX0FEQVBUX1JYX0RSQUlOIEkgICA0ICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDEgICAgMQorTlYgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgIDEKKworKgorKiBGbGV4Q29ubmVjdCBQb3dlciBGYWN0b3IKKyogRGVmYXVsdCBpcyBzZXQgdG8gMCAoZGlzYWJsZSkKKyoKKyoKK1dOSV9DRkdfRkxFWF9DT05ORUNUX1BPV0VSX0ZBQ1RPUiAgSSAgIDQgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDkgICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgOSAgICAgMAorCisqCisqIEFudGVubmEgRGl2ZXJzaXR5CisqCisqIDAgPSBkaXNhYmxlZAorKiAxID0gQW50IDEKKyogMiA9IEFudCAyCisqIDMgPSBBZGFwdGl2ZQorKgorV05JX0NGR19BTlRFTk5BX0RJVkVTSVRZICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMyAgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMyAgICAwCisKKyogR08gTGluayBNb25pdG9yIFRpbWVvdXQgKFRVKQorKgorV05JX0NGR19HT19MSU5LX01PTklUT1JfVElNRU9VVCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiszICAgNTAgICAgMTAKK1YgICAgUlcgICAgTlAKK0hBTAorMyAgIDUwICAgIDEwCisqCisqCisKKyogUk1DIGFjdGlvbiBwZXJpb2QgZnJlcXVlbmN5IChtaWxsaSBzZWNvbmRzKQorKgorV05JX0NGR19STUNfQUNUSU9OX1BFUklPRF9GUkVRVUVOQ1kgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMTAwICAgMTAwMCAgICAzMDAKK1YgICAgUlcgICAgTlAKK0hBTAorMTAwICAgMTAwMCAgICAzMDAKKyoKKyoKKworKiBDdXJyZW50IFJTU0kgdmFsdWUgKG9mIGNvbm5lY3RlZCBBUCkKKyoKK1dOSV9DRkdfQ1VSUkVOVF9SU1NJIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitOT05FCiswICAgMTI3ICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAxMjcgICAgMAorCisqIFJUVDMgQml0IFZhbHVlCisqCitXTklfQ0ZHX1JUVDNfRU5BQkxFICAgIEkgICAgMSAgICAxCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDEKKworKiBEZWJ1ZyBwMnAgcmVtYWluIG9uIGNoYW5uZWwKKyoKK1dOSV9DRkdfREVCVUdfUDJQX1JFTUFJTl9PTl9DSEFOTkVMICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKKworKgorKiBURExTIE9mZiBDaGFubmVsIEltcGxlbWVudGF0aW9uCisqCitXTklfQ0ZHX1RETFNfT0ZGX0NIQU5ORUxfRU5BQkxFRCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgICAwCisKK1dOSV9DRkdfSUJTU19BVElNX1dJTl9TSVpFIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitOT05FCiswICAgMTAwICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAxMDAgICAgMAorCisqCisqIERGUyBNYXN0ZXIgY2FwYWJpbGl0eSAoMTFoKSBlbmFibGUvZGlzYWJsZQorKgorCitXTklfQ0ZHX0RGU19NQVNURVJfRU5BQkxFRCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAwCisKK1dOSV9DRkdfVkhUX0VOQUJMRV9UWEJGXzIwTUhaICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKKyoKKypURExTIFdNTSBNb2RlCisqCisqCitXTklfQ0ZHX1RETFNfV01NX01PREVfRU5BQkxFRCAgIEkgICA0ICAgNworViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMApkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL2NmZy9jZmdVdGlsL2RvdDExZi5mcm1zIGIvY29yZS9tYWMvc3JjL2NmZy9jZmdVdGlsL2RvdDExZi5mcm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTY1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvY2ZnL2NmZ1V0aWwvZG90MTFmLmZybXMKQEAgLTAsMCArMSwzNjExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogXGZpbGUgZG90MTFmLmZybXMKKyAqCisgKiBcYnJpZWYgUHJpbWFyeSAnZnJhbWVzJyBmaWxlIGZvciB0aGUgTUFDIHBhcnNlcgorICoKKyAqCisgKiBUaGlzICBmaWxlIGRlZmluZXMgIHNldmVyYWwgIDgwMi4xMSBmcmFtZXMgIChhbG9uZyAgd2l0aCB0aGVpciAgYXNzb2NpYXRlZAorICogY29uc3RpdHVlbnRzKSBpbiBhIGxpdHRsZSBsYW5ndWFnZSAgY2FsbGVkICJmcmFtZXMiLiAgV2hlbiBydW4gdGhyb3VnaCB0aGUKKyAqICdmcmFtZXNjJyBwcm9ncmFtLCBpdCB3aWxsIGdlbmVyYXRlICBDIGNvZGUgZm9yIHdvcmtpbmcgd2l0aCB0aGVzZSBmcmFtZXM6CisgKiBDICBzdHJ1Y3RzICByZXByZXNlbnRpbmcgdGhlICA4MDIuMTEgIGZyYW1lICB0b2dldGhlciAgd2l0aCBmdW5jdGlvbnMgIGZvcgorICogcGFja2luZyAmIHVucGFja2luZyB0aGVtLgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSAiZnJhbWVzIiBsYW5ndWFnZSwgcnVuICdmcmFtZXNjIC0taGVscCcuLi4KKyAqCisgKgorICovCisKKworLy8gVGVsbCBmcmFtZXNjIHdoYXQgdHlwZXMgdG8gdXNlIGZvci4uLgorJTgtYml0LXR5cGUgICB1aW50OF90ICAvLyA4LAorJTE2LWJpdC10eXBlICB1aW50MTZfdCAvLyAxNiwKKyUzMi1iaXQtdHlwZSAgdWludDMyX3QgLy8gJiAzMi1iaXQgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMuICBUaGVzZSBjYW4gYWxzbworICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKworLy8gRGVmaW5lIHNvbWUgbW5lbW9uaWMgY29uc3RhbnRzOyB0aGVzZSBhcmUganVzdCBmb3Igb3VyIHVzZSB3aXRoIHRoZSBmcmFtZXMKKy8vIGZpbGVzIHdlJ3JlIGNvbXBpbGluZy4gIElPVywgdGhleSB3b24ndCByZXN1bHQgaW4gYW55IEMgY29kZSBiZWluZworLy8gZW1pdHRlZC4KKworY29uc3QgRUlEX1NTSUQgICAgICAgICAgICAgICAgICAgICAgID0gICAwOworY29uc3QgRUlEX1NVUFBfUkFURVMgICAgICAgICAgICAgICAgID0gICAxOworY29uc3QgRUlEX0ZIX1BBUkFNX1NFVCAgICAgICAgICAgICAgID0gICAyOworY29uc3QgRUlEX0RTX1BBUkFNX1NFVCAgICAgICAgICAgICAgID0gICAzOworY29uc3QgRUlEX0NGX1BBUkFNX1NFVCAgICAgICAgICAgICAgID0gICA0OworY29uc3QgRUlEX1RJTSAgICAgICAgICAgICAgICAgICAgICAgID0gICA1OworY29uc3QgRUlEX0lCU1NfUEFSQU1fU0VUICAgICAgICAgICAgID0gICA2OworY29uc3QgRUlEX0NPVU5UUlkgICAgICAgICAgICAgICAgICAgID0gICA3OworY29uc3QgRUlEX0ZIX1BBVFRFUk4gICAgICAgICAgICAgICAgID0gICA4OworY29uc3QgRUlEX0ZIX1BBVFRfVEFCTEUgICAgICAgICAgICAgID0gICA5OworY29uc3QgRUlEX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgID0gIDEwOworY29uc3QgRUlEX1FCU1NfTE9BRCAgICAgICAgICAgICAgICAgID0gIDExOworY29uc3QgRUlEX0VEQ0FfUEFSQU1fU0VUICAgICAgICAgICAgID0gIDEyOworY29uc3QgRUlEX1RTUEVDICAgICAgICAgICAgICAgICAgICAgID0gIDEzOworY29uc3QgRUlEX1RDTEFTICAgICAgICAgICAgICAgICAgICAgID0gIDE0OworY29uc3QgRUlEX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgID0gIDE1OworY29uc3QgRUlEX0NIQUxMRU5HRV9URVhUICAgICAgICAgICAgID0gIDE2OworY29uc3QgRUlEX1BPV0VSX0NPTlNUUkFJTlRTICAgICAgICAgID0gIDMyOworY29uc3QgRUlEX1BPV0VSX0NBUEFCSUxJVFkgICAgICAgICAgID0gIDMzOworY29uc3QgRUlEX1RQQ19SRVFVRVNUICAgICAgICAgICAgICAgID0gIDM0OworY29uc3QgRUlEX1RQQ19SRVBPUlQgICAgICAgICAgICAgICAgID0gIDM1OworY29uc3QgRUlEX1NVUFBPUlRFRF9DSEFOTkVMUyAgICAgICAgID0gIDM2OworY29uc3QgRUlEX0NIQU5ORUxfU1dJVENIX0FOTiAgICAgICAgID0gIDM3OworY29uc3QgRUlEX01FQVNfUkVRVUVTVCAgICAgICAgICAgICAgID0gIDM4OworY29uc3QgRUlEX01FQVNfUkVQT1JUICAgICAgICAgICAgICAgID0gIDM5OworY29uc3QgRUlEX1FVSUVUICAgICAgICAgICAgICAgICAgICAgID0gIDQwOworY29uc3QgRUlEX0VSUF9JTkZPICAgICAgICAgICAgICAgICAgID0gIDQyOworY29uc3QgRUlEX1RTX0RFTEFZICAgICAgICAgICAgICAgICAgID0gIDQzOworY29uc3QgRUlEX1RDTEFTU19QUk9DICAgICAgICAgICAgICAgID0gIDQ0OworY29uc3QgRUlEX0hUX0NBUEFCSUxJVElFUyAgICAgICAgICAgID0gIDQ1OworY29uc3QgRUlEX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgID0gIDQ2OworY29uc3QgRUlEX1JTTiAgICAgICAgICAgICAgICAgICAgICAgID0gIDQ4OworY29uc3QgRUlEX0VYVF9TVVBQX1JBVEVTICAgICAgICAgICAgID0gIDUwOworY29uc3QgRUlEX0FQX0NIQU5fUkVQT1JUICAgICAgICAgICAgID0gIDUxOworY29uc3QgRUlEX05FSUdIQk9SX1JFUE9SVCAgICAgICAgICAgID0gIDUyOworY29uc3QgRUlEX1JDUEkgICAgICAgICAgICAgICAgICAgICAgID0gIDUzOworY29uc3QgRUlEX0ZUX01PQklMSVRZX0RPTUFJTiAgICAgICAgID0gIDU0OworY29uc3QgRUlEX0ZUX0lORk8gICAgICAgICAgICAgICAgICAgID0gIDU1OworY29uc3QgRUlEX1RJTUVPVVRfSU5URVJWQUwgICAgICAgICAgID0gIDU2OworY29uc3QgRUlEX0ZUX1JJQ19EQVRBICAgICAgICAgICAgICAgID0gIDU3OworY29uc3QgRUlEX1NVUFBPUlRFRF9PUEVSX0NMQVNTRVMgICAgID0gIDU5OworY29uc3QgRUlEX0VYVF9DSEFOX1NXSVRDSCAgICAgICAgICAgID0gIDYwOworY29uc3QgRUlEX0hUX0lORk8gICAgICAgICAgICAgICAgICAgID0gIDYxOworY29uc3QgRUlEX1NFQ19DSEFOX09GRlNFVCAgICAgICAgICAgID0gIDYyOworY29uc3QgRUlEX1JTTkkgICAgICAgICAgICAgICAgICAgICAgID0gIDY1OworY29uc3QgRUlEX1JSTV9NRUFTX1BJTE9UX1RYX0lORk8gICAgID0gIDY2OworY29uc3QgRUlEX1dBUEkgICAgICAgICAgICAgICAgICAgICAgID0gIDY4OworY29uc3QgRUlEX1RJTUVfQURWRVJUSVNFTUVOVCAgICAgICAgID0gIDY5OworY29uc3QgRUlEX1JSTV9FTkFCTEVEX0NBUFMgICAgICAgICAgID0gIDcwOworY29uc3QgRUlEX01VTFRJUExFX0JTU0lEICAgICAgICAgICAgID0gIDcxOworY29uc3QgRUlEXzIwXzQwX0JTU19DT0VYSVNURU5DRSAgICAgID0gIDcyOworY29uc3QgRUlEXzIwXzQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVD0gIDczOworY29uc3QgRUlEX09CU1NfU0NBTl9QQVJBTUVURVJTICAgICAgID0gIDc0OworY29uc3QgRUlEX0ZUX1JJQ19ERVNDUklQVE9SICAgICAgICAgID0gIDc1OworY29uc3QgRUlEX0xJTktfSURFTlRJRklFUiAgICAgICAgICAgID0gMTAxOworY29uc3QgRUlEX1BUSV9DT05UUk9MICAgICAgICAgICAgICAgID0gMTA1OworY29uc3QgRUlEX1BVX0JVRkZFUl9TVEFUVVMgICAgICAgICAgID0gMTA2OworY29uc3QgRUlEX1FPU19NQVBfU0VUICAgICAgICAgICAgICAgID0gMTEwOworY29uc3QgRUlEX0VTRV9TUEVDSUZJQyAgICAgICAgICAgICAgID0gMTUwOworY29uc3QgRUlEX0VTRV9DQ0tNX1NQRUNJRklDICAgICAgICAgID0gMTU2OworY29uc3QgRUlEX1ZIVF9DQVBBQklMSVRJRVMgICAgICAgICAgID0gIDE5MTsKK2NvbnN0IEVJRF9WSFRfT1BFUkFUSU9OX0VMRU1FTlQgICAgICA9ICAxOTI7Citjb25zdCBFSURfVkhUX0VYVF9CU1NfTE9BRCAgICAgICAgICAgPSAgMTkzOworY29uc3QgRUlEX0FJRCAgICAgICAgICAgICAgICAgICAgICAgID0gIDE5NzsKK2NvbnN0IEVJRF9FWFRfQ0FQICAgICAgICAgICAJICAgICA9ICAxMjc7Citjb25zdCBFSURfT1BFUkFUSU5HX01PREUgICAgICAgICAgICAgPSAgMTk5OworY29uc3QgRUlEX1dJREVSX0JXX0NIQU5ORUxfU1dJVENIX0FOTj0gIDE5NDsKK2NvbnN0IEVJRF9DSEFOTkVMX1NXSVRDSF9XUkFQUEVSICAgICA9IDE5NjsKK2NvbnN0IEVJRF9WRU5ET1JfU1BFQ0lGSUMgICAgICAgICAgICA9IDIyMTsKKworY29uc3QgU0lSX01BQ19QUk9QX0VYVF9SQVRFU19UWVBFICAgID0gICAwOworY29uc3QgU0lSX01BQ19QUk9QX0FQX05BTUVfVFlQRSAgICAgID0gICAxOworY29uc3QgU0lSX01BQ19QUk9QX0hDRl9UWVBFICAgICAgICAgID0gICAyOworY29uc3QgU0lSX01BQ19QUk9QX1dEU19UWVBFICAgICAgICAgID0gICAzOworY29uc3QgU0lSX01BQ19QUk9QX0JQX0lORF9UWVBFICAgICAgID0gICA0OworY29uc3QgU0lSX01BQ19QUk9QX05FSUdIQk9SX0JTU19UWVBFID0gICA1OworY29uc3QgU0lSX01BQ19QUk9QX0xPQURfSU5GT19UWVBFICAgID0gICA2OworY29uc3QgU0lSX01BQ19QUk9QX0FTU09DX1RZUEUgICAgICAgID0gICA3OworY29uc3QgU0lSX01BQ19QUk9QX0xPQURfQkFMQU5DRV9UWVBFID0gICA4OworY29uc3QgU0lSX01BQ19QUk9QX0xMX0FUVFJfVFlQRSAgICAgID0gICA5OworY29uc3QgU0lSX01BQ19QUk9QX0NBUEFCSUxJVFkgICAgICAgID0gIDEwOworY29uc3QgU0lSX01BQ19QUk9QX1ZFUlNJT04gICAgICAgICAgID0gIDExOworY29uc3QgU0lSX01BQ19QUk9QX0VEQ0FQQVJBTVMgICAgICAgID0gIDEyOworY29uc3QgU0lSX01BQ19QUk9QX0NIQU5ORUxfU1dJVENIICAgID0gIDE1OworY29uc3QgU0lSX01BQ19QUk9QX1FVSUVUX0JTUyAgICAgICAgID0gIDE2OworY29uc3QgU0lSX01BQ19QUk9QX1RSSUdfU1RBX0JLX1NDQU4JID0gIDE3OworCitjb25zdCBBTklfV0RTX0lORk9fTUFYX0xFTkdUSCAgICAgICAgPSAgNjQ7Citjb25zdCBTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVMgICAgPSAgMTI7Citjb25zdCBIVF9NQVhfU1VQUE9SVEVEX01DU19TRVQgICAgICAgPSAgMTY7Citjb25zdCBNQVhfU1VQUE9SVEVEX05FSUdIQk9SX1JQVCAgICAgPSAgMTU7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgIFdpLUZpIFByb3RlY3RlZCBTZXR1cCBUTFYgSWRlbnRpZmllcnMgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICBXU0MgVmVyc2lvbiAyLjAuMCBUYWJsZSAyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICBXaS1GaSBTaW1wbGUgQ29uZmlndXJhdGlvbiBUTFYgSWRlbnRpZmllcnMgICAgICAgICAgICAgLy8KKy8vIFdGQSBWZW5kb3IgRXh0ZW5zaW9uIFN1YmVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworY29uc3QgVExWX1ZFUlNJT04yICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Citjb25zdCBUTFZfQVVUSE9SSVpFRF9NQUMgICAgICAgICAgICAgICAgICAgID0gMTsKK2NvbnN0IFRMVl9ORVRXT1JLX0tFWV9TSEFSRUFCTEUgICAgICAgICAgICAgPSAyOworY29uc3QgVExWX1JFUVVFU1RfVE9fRU5ST0xMICAgICAgICAgICAgICAgICA9IDM7Citjb25zdCBUTFZfU0VUVElOR1NfREVMQVlfVElNRSAgICAgICAgICAgICAgID0gNDsKKworY29uc3QgVExWX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTA0QTsKK2NvbnN0IFRMVl9XSV9GSV9TSU1QTEVfQ09ORklHX1NUQVRFICAgICAgICAgPSAweDEwNDQ7Citjb25zdCBUTFZfQVBfU0VUVVBfTE9DS0VEICAgICAgICAgICAgICAgICAgID0gMHgxMDU3OworY29uc3QgVExWX1NFTEVDVEVEX1JFR0lTVFJBUl9DT05GSUdfTUVUSE9EUyA9IDB4MTA1MzsKK2NvbnN0IFRMVl9ERVZJQ0VfUEFTU1dPUkRfSUQgICAgICAgICAgICAgICAgPSAweDEwMTI7Citjb25zdCBUTFZfVVVJRF9FICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMDQ3OworY29uc3QgVExWX1VVSURfUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTA0ODsKK2NvbnN0IFRMVl9SRl9CQU5EUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEwM0M7Citjb25zdCBUTFZfUkVRVUVTVF9UWVBFICAgICAgICAgICAgICAgICAgICAgID0gMHgxMDNBOworY29uc3QgVExWX1JFU1BPTlNFX1RZUEUgICAgICAgICAgICAgICAgICAgICA9IDB4MTAzQjsKK2NvbnN0IFRMVl9DT05GSUdfTUVUSE9EUyAgICAgICAgICAgICAgICAgICAgPSAweDEwMDg7Citjb25zdCBUTFZfUFJJTUFSWV9ERVZJQ0VfVFlQRSAgICAgICAgICAgICAgID0gMHgxMDU0OworY29uc3QgVExWX0FTU09DSUFUSU9OX1NUQVRFICAgICAgICAgICAgICAgICA9IDB4MTAwMjsKK2NvbnN0IFRMVl9DT05GSUdVUkFUSU9OX0VSUk9SICAgICAgICAgICAgICAgPSAweDEwMDk7Citjb25zdCBUTFZfTUFOVUZBQ1RVUkVSICAgICAgICAgICAgICAgICAgICAgID0gMHgxMDIxOworY29uc3QgVExWX01PREVMX05BTUUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAyMzsKK2NvbnN0IFRMVl9NT0RFTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgPSAweDEwMjQ7Citjb25zdCBUTFZfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgID0gMHgxMDQyOworY29uc3QgVExWX0RFVklDRV9OQU1FICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAxMTsKK2NvbnN0IFRMVl9TRUxFQ1RFRF9SRUdJU1RSQVIgICAgICAgICAgICAgICAgPSAweDEwNDE7Citjb25zdCBUTFZfVkVORE9SX0VYVEVOU0lPTiAgICAgICAgICAgICAgICAgID0gMHgxMDQ5OworY29uc3QgVExWX1JFUVVFU1RFRF9ERVZJQ0VfVFlQRSAgICAgICAgICAgICA9IDB4MTA2QTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgV2ktRmkgRGlyZWN0L1AyUCBUTFYgSWRlbnRpZmllcnMgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworY29uc3QgVExWX1AyUF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAgIDA7Citjb25zdCBUTFZfTUlOT1JfUkVBU09OX0NPREUgICAgICAgICAgICAgICAgICA9ICAgMTsKK2NvbnN0IFRMVl9QMlBfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAgICAgID0gICAyOworY29uc3QgVExWX1AyUF9ERVZJQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgPSAgIDM7Citjb25zdCBUTFZfUDJQX0dST1VQX09XTkVSX0lOVEVOVCAgICAgICAgICAgICA9ICAgNDsKK2NvbnN0IFRMVl9DT05GSUdVUkFUSU9OX1RJTUVPVVQgICAgICAgICAgICAgID0gICA1OworY29uc3QgVExWX0xJU1RFTl9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAgPSAgIDY7Citjb25zdCBUTFZfUDJQX0dST1VQX0JTU0lEICAgICAgICAgICAgICAgICAgICA9ICAgNzsKK2NvbnN0IFRMVl9FWFRFTkRFRF9MSVNURU5fVElNSU5HICAgICAgICAgICAgID0gICA4OworY29uc3QgVExWX0lOVEVOREVEX1AyUF9JTlRFUkZBQ0VfQUREUkVTUyAgICAgPSAgIDk7Citjb25zdCBUTFZfUDJQX01BTkFHRUFCSUxJVFkgICAgICAgICAgICAgICAgICA9ICAxMDsKK2NvbnN0IFRMVl9DSEFOTkVMX0xJU1QgICAgICAgICAgICAgICAgICAgICAgID0gIDExOworY29uc3QgVExWX05PVElDRV9PRl9BQlNFTkNFICAgICAgICAgICAgICAgICAgPSAgMTI7Citjb25zdCBUTFZfUDJQX0RFVklDRV9JTkZPICAgICAgICAgICAgICAgICAgICA9ICAxMzsKK2NvbnN0IFRMVl9QMlBfR1JPVVBfSU5GTyAgICAgICAgICAgICAgICAgICAgID0gIDE0OworY29uc3QgVExWX1AyUF9HUk9VUF9JRCAgICAgICAgICAgICAgICAgICAgICAgPSAgMTU7Citjb25zdCBUTFZfUDJQX0lOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICA9ICAxNjsKK2NvbnN0IFRMVl9PUEVSQVRJTkdfQ0hBTk5FTCAgICAgICAgICAgICAgICAgID0gIDE3OworY29uc3QgVExWX0lOVklUQVRJT05fRkxBR1MgICAgICAgICAgICAgICAgICAgPSAgMTg7Citjb25zdCBUTFZfUDJQX1ZFTkRPUl9TUEVDSUZJQyAgICAgICAgICAgICAgICA9IDIyMTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZpeGVkIEZpZWxkcworCitGRiBBdXRoQWxnbyAoMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDLmYuIFNlYy4gNy4zLjEuMQoreworICAgIGFsZ28sIDI7Cit9CisKK0ZGIEF1dGhTZXFObyAoMikgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDcuMy4xLjIKK3sKKyAgICBubywgMjsKK30KKworRkYgQmVhY29uSW50ZXJ2YWwgKDIpICAgICAgICAgICAgICAgICAgICAgLy8gNy4zLjEuMworeworICAgIGludGVydmFsLCAyOworfQorCitGRiBDYXBhYmlsaXRpZXMgKDIpICAgICAgICAgICAgICAgICAgICAgICAvLyA3LjMuMS40Cit7CisgICAgeworICAgICAgICBlc3M6ICAgICAgICAgICAgMTsKKyAgICAgICAgaWJzczogICAgICAgICAgIDE7CisgICAgICAgIGNmUG9sbGFibGU6ICAgICAxOworICAgICAgICBjZlBvbGxSZXE6ICAgICAgMTsKKyAgICAgICAgcHJpdmFjeTogICAgICAgIDE7CisgICAgICAgIHNob3J0UHJlYW1ibGU6ICAxOworICAgICAgICBwYmNjOiAgICAgICAgICAgMTsKKyAgICAgICAgY2hhbm5lbEFnaWxpdHk6IDE7CisgICAgICAgIHNwZWN0cnVtTWd0OiAgICAxOworICAgICAgICBxb3M6ICAgICAgICAgICAgMTsKKyAgICAgICAgc2hvcnRTbG90VGltZTogIDE7CisgICAgICAgIGFwc2Q6ICAgICAgICAgICAxOworICAgICAgICBycm06ICAgICAgICAgICAgMTsKKyAgICAgICAgZHNzc09mZG06ICAgICAgIDE7CisgICAgICAgIGRlbGF5ZWRCQTogICAgICAxOworICAgICAgICBpbW1lZGlhdGVCQTogICAgMTsKKyAgICB9Cit9CisKK0ZGIEN1cnJlbnRBUEFkZHJlc3MoNikgICAgICAgICAgICAgICAgICAgIC8vIDcuMy4xLjUKK3sKKyAgICBtYWNbNl07Cit9CisKK0ZGIExpc3RlbkludGVydmFsICgyKSAgICAgICAgICAgICAgICAgICAgIC8vIDcuMy4xLjYKK3sKKyAgICBpbnRlcnZhbCwgMjsKK30KKworRkYgUmVhc29uICgyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNy4zLjEuNworeworICAgIGNvZGUsIDI7Cit9CisKK0ZGIEFJRCAoMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDcuMy4xLjgKK3sKKyAgICBhc3NvY2lkLCAyOworfQorCitGRiBTdGF0dXMgKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LjMuMS45Cit7CisgICAgc3RhdHVzLCAyOworfQorCitGRiBUaW1lU3RhbXAgKDgpICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LjMuMS4xMAoreworICAgIHRpbWVzdGFtcCwgODsKK30KKworRkYgQ2F0ZWdvcnkgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNy4zLjEuMTEKK3sKKyAgICBjYXRlZ29yeSwgMTsKK30KKworRkYgQWN0aW9uICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNy4zLjEuMTEKK3sKKyAgICBhY3Rpb24sIDE7Cit9CisKK0ZGIFRyYW5zYWN0aW9uSWQgKDIpICAgICAgICAgICAgICAgICAgICAgIC8vIDcuMy4xLjExCit7CisgICAgdHJhbnNJZFsyXTsKK30KKworRkYgRGlhbG9nVG9rZW4gKDEpICAgICAgICAgICAgICAgICAgICAgICAgLy8gNy4zLjEuMTIKK3sKKyAgICB0b2tlbiwgMTsKK30KKworRkYgU3RhdHVzQ29kZSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV01NIFNwZWMgMi4yLjEwCit7CisgICAgc3RhdHVzQ29kZSwgMTsKK30KKworRkYgT3BlcmF0aW5nTW9kZSAoMSkKK3sKKyAgIHsKKyAgICAvL09wZXJhdGluZyBNb2RlIGZpZWxkCisgICAgY2hhbldpZHRoOiAgICAyOworICAgIHJlc2VydmVkOiAgICAgMjsKKyAgICByeE5TUzogICAgICAgIDM7CisgICAgcnhOU1NUeXBlOiAgICAxOworICAgIH0KK30KKworRkYgU01Qb3dlck1vZGVTZXQgKDEpCQkJCS8vNy4zLjEuMjUKK3sKKyAgICB7CisgICAgICAgIFBvd2VyU2F2ZV9FbjogMTsKKyAgICAgICAgTW9kZTogMTsKKyAgICAgICAgcmVzZXJ2ZWQ6IDY7CisgICAgIH0KK30KKworRkYgVFNJbmZvICgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNy4zLjIuMzAKK3sKKyAgICB7CisgICAgICAgIHRyYWZmaWNfdHlwZTogICAgMTsKKyAgICAgICAgdHNpZDogICAgICAgICAgICA0OworICAgICAgICBkaXJlY3Rpb246ICAgICAgIDI7CisgICAgICAgIGFjY2Vzc19wb2xpY3k6ICAgMjsKKyAgICAgICAgYWdncmVnYXRpb246ICAgICAxOworICAgICAgICBwc2I6ICAgICAgICAgICAgIDE7CisgICAgICAgIHVzZXJfcHJpb3JpdHk6ICAgMzsKKyAgICAgICAgdHNpbmZvX2Fja19wb2w6ICAyOworICAgICAgICBzY2hlZHVsZTogICAgICAgIDE7CisgICAgICAgIHVudXNlZDogICAgICAgICAxNTsKKyAgICB9Cit9CisKK0ZGIE51bU9mUmVwZXRpdGlvbnMgKDIpCit7CisgICAgIHJlcGV0aXRpb25zLCAyOworfQorCitGRiBUeFBvd2VyICgxKQoreworICAgICB0eFBvd2VyLCAxOworfQorCitGRiBNYXhUeFBvd2VyICgxKQoreworICAgICBtYXhUeFBvd2VyLCAxOworfQorRkYgVFBDRWxlSUQgKDEpCit7CisgICAgIFRQQ0lkLCAxOworfQorRkYgVFBDRWxlTGVuICgxKQoreworICAgICBUUENMZW4sIDE7Cit9CitGRiBMaW5rTWFyZ2luICgxKQoreworICAgICBsaW5rTWFyZ2luLCAxOworfQorRkYgUnhBbnRlbm5hSWQgKDEpCit7CisgICAgIGFudGVubmFJZCwgMTsKK30KK0ZGIFR4QW50ZW5uYUlkICgxKQoreworICAgICBhbnRlbm5hSWQsIDE7Cit9CitGRiBSQ1BJICgxKQoreworICAgICByY3BpLCAxOworfQorRkYgUlNOSSAoMSkKK3sKKyAgICAgcnNuaSwgMTsKK30KKworRkYgVmh0TWVtYmVyc2hpcFN0YXR1c0FycmF5KDgpICAgICAgICAgICAgICAgICAgICAvLyA4LjQuMS41MQoreworICAgIG1lbWJlcnNoaXBTdGF0dXNBcnJheVs4XTsKK30KKworRkYgVmh0VXNlclBvc2l0aW9uQXJyYXkoMTYpICAgICAgICAgICAgICAgICAgICAvLyA4LjQuMS41MgoreworICAgIHVzZXJQb3NpdGlvbkFycmF5WzE2XTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExWcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogXGJyaWVmIFZlcnNpb24KKyAqCisgKiBXUFMgMS4waAorICogVmVyc2lvbiBzcGVjaWZpZXMgIHRoZSBFYXN5ICBTZXR1cCB2ZXJzaW9uLiBUaGUgIG9uZS1ieXRlIGZpZWxkICBpcyBicm9rZW4KKyAqIGludG8gYSAgZm91ci1iaXQgbWFqb3IgIHBhcnQgdXNpbmcgIHRoZSB0b3AgTVNCcyAgYW5kIGZvdXItYml0ICBtaW5vciBwYXJ0CisgKiB1c2luZyB0aGUgTFNCcy4gQXMgYW4gZXhhbXBsZSwgdmVyc2lvbiAzLjIgd291bGQgYmUgMHgzMi4KKyAqCisgKiBXU0MgMi4wLjAKKyAqIERlcHJlY2F0ZWQgVmVyc2lvbiBtZWNoYW5pc20uIFRoaXMgYXR0cmlidXRlIGlzIGFsd2F5cyBzZXQgdG8gdmFsdWUgMHgxMAorICogKHZlcnNpb24gMS4wKSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFZlcnNpb24gMS4waCBvZiB0aGUgc3BlY2lmaWNhdGlvbgorICogZGlkIG5vdCBmdWxseSBkZXNjcmliZSB0aGUgdmVyc2lvbiBuZWdvdGlhdGlvbiBtZWNoYW5pc20gYW5kIHZlcnNpb24gMi4wCisgKiBpbnRyb2R1Y2VkIGEgbmV3IHN1YmVsZW1lbnQgKFZlcnNpb24yKSBmb3IgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBudW1iZXIKKyAqIHRvIGF2b2lkIHBvdGVudGlhbCBpbnRlcm9wZXJhYmlsaXR5IGlzc3VlcyB3aXRoIGRlcGxveWVkIDEuMGgtYmFzZWQgZGV2aWNlcy4KKyAqCisgKi8KKworVExWIFZlcnNpb24oIFRMVl9WRVJTSU9OICkgKCAyIDogMiApIE1TQgoreworICB7CisgICAgICBtaW5vcjogNDsKKyAgICAgIG1ham9yOiA0OworICB9Cit9CisKKy8vLyBXaS1GaSBQcm90ZWN0ZWQgU2V0dXAgU3RhdGUKK1RMViBXUFNTdGF0ZSggVExWX1dJX0ZJX1NJTVBMRV9DT05GSUdfU1RBVEUgKSAoIDIgOiAyICkgTVNCCit7CisgIHN0YXRlLCAxOworfQorCisvKioKKyAqIFxicmllZiBBUCBTZXR1cCBMb2NrZWQKKyAqCisgKgorICogVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQVAgaGFzIGVudGVyZWQgYSBzdGF0ZSBpbiB3aGljaCBpdCB3aWxsCisgKiByZWZ1c2UgdG8gYWxsb3cgYW4gZXh0ZXJuYWwgUmVnaXN0cmFyIHRvIGF0dGVtcHQgdG8gcnVuIHRoZSBSZWdpc3RyYXRpb24KKyAqIFByb3RvY29sIHVzaW5nIHRoZSBBUD9zIFBJTiAod2l0aCB0aGUgQVAgYWN0aW5nIGFzIEVucm9sbGVlKS4gVGhlIEFQCisgKiBzaG91bGQgZW50ZXIgdGhpcyBzdGF0ZSBpZiBpdCBiZWxpZXZlcyBhIGJydXRlIGZvcmNlIGF0dGFjayBpcyB1bmRlcndheQorICogYWdhaW5zdCB0aGUgQVA/cyBQSU4uCisgKgorICogV2hlbiB0aGUgQVAgaXMgaW4gdGhpcyBzdGF0ZSwgaXQgTVVTVCBjb250aW51ZSB0byBhbGxvdyBvdGhlciBFbnJvbGxlZXMgdG8KKyAqIGNvbm5lY3QgYW5kIHJ1biB0aGUgUmVnaXN0cmF0aW9uICBQcm90b2NvbCB3aXRoIGFueSBleHRlcm5hbCBSZWdpc3RyYXJzIG9yCisgKiB0aGUgQVAncyBidWlsdC1pbiAgUmVnaXN0cmFyIChpZiBhbnkpLiBJdCAgaXMgb25seSB0aGUgdXNlIG9mICB0aGUgQVAnIFBJTgorICogZm9yIGFkZGluZyBleHRlcm5hbCBSZWdpc3RyYXJzIHRoYXQgaXMgZGlzYWJsZWQgaW4gdGhpcyBzdGF0ZS4KKyAqCisgKiBUaGUgQVAgU2V0dXAgTG9ja2VkIHN0YXRlIGNhbiBiZSByZXNldCB0byBGQUxTRSB0aHJvdWdoIGFuIGF1dGhlbnRpY2F0ZWQKKyAqIGNhbGwgdG8gU2V0QVBTZXR0aW5ncy4gQVBzIG1heSBwcm92aWRlIG90aGVyIGltcGxlbWVudGF0aW9uLXNwZWNpZmljCisgKiBtZXRob2RzIG9mIHJlc2V0dGluZyB0aGUgQVAgU2V0dXAgTG9ja2VkIHN0YXRlIGFzIHdlbGwuCisgKgorICoKKyAqLworCitUTFYgQVBTZXR1cExvY2tlZCggVExWX0FQX1NFVFVQX0xPQ0tFRCApICggMiA6IDIgKSBNU0IKK3sKKyAgICBmTG9ja2VkLCAxOworfQorCisvKioKKyAqIFxicmllZiBTZWxlY3RlZCBSZWdpc3RyYXIgQ29uZmlnIE1ldGhvZHMKKyAqCisgKgorICogVGhpcyBhdHRyaWJ1dGUgaGFzIHRoZSBzYW1lIHZhbHVlcyB0aGF0IENvbmZpZyBNZXRob2RzIGhhdmUuIEl0IGlzIHVzZWQgaW4KKyAqIFByb2JlIFJlc3BvbnNlIG1lc3NhZ2VzIHRvIGNvbnZleSB0aGUgQ29uZmlnIE1ldGhvZHMgb2YgdGhlIHNlbGVjdGVkCisgKiBSZWdpc3RyYXIuCisgKgorICoKKyAqLworCitUTFYgU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzICggVExWX1NFTEVDVEVEX1JFR0lTVFJBUl9DT05GSUdfTUVUSE9EUyApICggMiA6IDIgKSBNU0IKK3sKKyAgICBtZXRob2RzLCAyOworfQorCisvKioKKyAqIFxicmllZiBVVUlELUUKKyAqCisgKgorICogVGhlICB1bml2ZXJzYWxseSAgdW5pcXVlICBpZGVudGlmaWVyICAoVVVJRCkgIGVsZW1lbnQgIGlzICBhICB1bmlxdWUgIEdVSUQKKyAqIGdlbmVyYXRlZCBieSAgdGhlIEVucm9sbGVlLiBJdCAgdW5pcXVlbHkgaWRlbnRpZmllcyBhbiAgb3BlcmF0aW9uYWwgZGV2aWNlCisgKiBhbmQgIHNob3VsZCBzdXJ2aXZlIHJlYm9vdHMgIGFuZCByZXNldHMuICBUaGUgVVVJRCAgaXMgcHJvdmlkZWQgIGluIGJpbmFyeQorICogZm9ybWF0LiBJZiB0aGUgZGV2aWNlIGFsc28gc3VwcG9ydHMgVVBuUCwgdGhlbiB0aGUgVVVJRCBjb3JyZXNwb25kcyB0byB0aGUKKyAqIFVQblAgVVVJRC4KKyAqCisgKgorICovCisKK1RMViBVVUlEX0UgKCBUTFZfVVVJRF9FICkgKCAyIDogMiApIE1TQgoreworICAgIHV1aWRbIDE2IF07Cit9CisKKy8qKgorICogXGJyaWVmIFVVSUQtUgorICoKKyAqCisgKiBUaGUgIHVuaXZlcnNhbGx5ICB1bmlxdWUgIGlkZW50aWZpZXIgIChVVUlEKSAgZWxlbWVudCAgaXMgIGEgIHVuaXF1ZSAgR1VJRAorICogZ2VuZXJhdGVkIGJ5ICB0aGUgUmVnaXN0cmFyLiBJdCB1bmlxdWVseSBpZGVudGlmaWVzICBhbiBvcGVyYXRpb25hbCBkZXZpY2UKKyAqIGFuZCAgc2hvdWxkIHN1cnZpdmUgcmVib290cyAgYW5kIHJlc2V0cy4gIFRoZSBVVUlEICBpcyBwcm92aWRlZCAgaW4gYmluYXJ5CisgKiBmb3JtYXQuIElmIHRoZSBkZXZpY2UgYWxzbyBzdXBwb3J0cyBVUG5QLCB0aGVuIHRoZSBVVUlEIGNvcnJlc3BvbmRzIHRvIHRoZQorICogVVBuUCBVVUlELgorICoKKyAqCisgKi8KKworVExWIFVVSURfUiAoIFRMVl9VVUlEX1IgKSAoIDIgOiAyICkgTVNCCit7CisgICAgdXVpZFsgMTYgXTsKK30KKworLyoqCisgKiBcYnJpZWYgUkYgQmFuZHMKKyAqCisgKgorIFxjb2RlCisKKyAgMHgwMSAyLjRHSHoKKyAgMHgwMiA1LjBHSHoKKworIFxlbmRjb2RlCisgKgorICoKKyAqLworCitUTFYgUkZCYW5kcyAoIFRMVl9SRl9CQU5EUyApICggMiA6IDIgKSBNU0IKK3sKKyAgICBiYW5kcywgMTsKK30KKworCisvKioKKyAqIFxicmllZiBTZWxlY3RlZCBSZWdpc3RyYXIKKyAqCisgKgorICogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhhdCBhIFJlZ2lzdHJhciBoYXMgYmVlbiBzZWxlY3RlZCBieSBhIHVzZXIgYW5kIHRoYXQKKyAqIGFuIEVucm9sbGVlICBzaG91bGQgcHJvY2VlZCAgd2l0aCBzZXR0aW5nIHVwICBhbiA4MDIuMVggIHVuY29udHJvbGxlZCBkYXRhCisgKiBwb3J0IHdpdGggdGhlIFJlZ2lzdHJhci4KKyAqCisgKgorICovCisKK1RMViBTZWxlY3RlZFJlZ2lzdHJhciAoIFRMVl9TRUxFQ1RFRF9SRUdJU1RSQVIgKSAoIDIgOiAyICkgTVNCCit7CisgICAgc2VsZWN0ZWQsIDE7Cit9CisKKy8qKgorICogXGJyaWVmIENvbmZpZyBNZXRob2RzCisgKgorICoKKyAqIFRoZSAgQ29uZmlnIE1ldGhvZHMgIERhdGEgY29tcG9uZW50ICBsaXN0cyB0aGUgIGNvbmZpZ3VyYXRpb24gIG1ldGhvZHMgdGhlCisgKiBFbnJvbGxlZSBvciBSZWdpc3RyYXIgIHN1cHBvcnRzLiAgVGhlIGxpc3QgaXMgYSBiaXR3aXNlICBPUiBvZiB2YWx1ZXMgZnJvbQorICogdGhlIHRhYmxlIGJlbG93LiBJbiBhZGRpdGlvbiB0byAgQ29uZmlnIE1ldGhvZHMsIEFQcyBhbmQgU1RBcyB0aGF0IHN1cHBvcnQKKyAqIHRoZSBVUG5QICBNYW5hZ2VtZW50IEludGVyZmFjZSBtdXN0ICBzdXBwb3J0IHRoZSBQZXJtaXR0ZWQgIENvbmZpZyBNZXRob2RzCisgKiBhdHRyaWJ1dGUsIHdoaWNoIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgQ29uZmlnIE1ldGhvZHMgdGhhdCBhcmUgZW5hYmxlZCBvbgorICogdGhhdCBBUC4KKyAqCisgXGNvZGUKKworICAgVmFsdWUgICBIYXJkd2FyZSBJbnRlcmZhY2UKKyAgIDB4MDAwMSAgVVNCQSAoRmxhc2ggRHJpdmUpCisgICAweDAwMDIgIEV0aGVybmV0CisgICAweDAwMDQgIExhYmVsCisgICAweDAwMDggIERpc3BsYXkKKyAgIDB4MDAxMCAgRXh0ZXJuYWwgTkZDIFRva2VuCisgICAweDAwMjAgIEludGVncmF0ZWQgTkZDIFRva2VuCisgICAweDAwNDAgIE5GQyBJbnRlcmZhY2UKKyAgIDB4MDA4MCAgUHVzaEJ1dHRvbgorICAgMHgwMTAwICBLZXlwYWQKKworIFxlbmRjb2RlCisgKgorICoKKyAqLworCitUTFYgQ29uZmlnTWV0aG9kcyAoIFRMVl9DT05GSUdfTUVUSE9EUyApICggMiA6IDIgKSBNU0IKK3sKKyAgICBtZXRob2RzLCAyOworfQorCisvKioKKyAqIFxicmllZiBBc3NvY2lhdGlvbiBTdGF0ZQorICoKKyAqCisgKiBUaGUgIEFzc29jaWF0aW9uICBTdGF0ZSBjb21wb25lbnQgIHNob3dzICB0aGUgIGNvbmZpZ3VyYXRpb24gYW5kICBwcmV2aW91cworICogYXNzb2NpYXRpb24gIHN0YXRlICBvZiAgdGhlICB3aXJlbGVzcyAgc3RhdGlvbiB3aGVuICBzZW5kaW5nICBhICBEaXNjb3ZlcnkKKyAqIHJlcXVlc3QuCisgKgorIFxjb2RlCisKKyAgQXNzb2NpYXRpb24gU3RhdGUgICAgRGVzY3JpcHRpb24KKyAgMCAgICAgICAgICAgICAgICAgICAgTm90IEFzc29jaWF0ZWQKKyAgMSAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBTdWNjZXNzCisgIDIgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gRmFpbHVyZQorICAzICAgICAgICAgICAgICAgICAgICBBc3NvY2lhdGlvbiBGYWlsdXJlCisgIDQgICAgICAgICAgICAgICAgICAgIElQIEZhaWx1cmUKKworIFxlbmRjb2RlCisgKgorICoKKyAqLworCitUTFYgQXNzb2NpYXRpb25TdGF0ZSAoIFRMVl9BU1NPQ0lBVElPTl9TVEFURSApICggMiA6IDIgKSBNU0IKK3sKKyAgICBzdGF0ZSwgMjsKK30KKworLyoqCisgKiBcYnJpZWYgQ29uZmlndXJhdGlvbiBFcnJvcgorICoKKyAqCisgKiBUaGUgIENvbmZpZ3VyYXRpb24gIEVycm9yICBjb21wb25lbnQgICBzaG93cyAgdGhlICByZXN1bHQgIG9mICB0aGUgIGRldmljZQorICogYXR0ZW1wdGluZyB0byBjb25maWd1cmUgaXRzZWxmIGFuZCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgV0xBTi4KKyAqCisgXGNvZGUKKworICAgQ29uZmlndXJhdGlvbiBFcnJvciAgRGVzY3JpcHRpb24KKyAgICAwICAgICAgICAgICAgICAgICAgIE5vIEVycm9yCisgICAgMSAgICAgICAgICAgICAgICAgICBPT0IgSW50ZXJmYWNlIFJlYWQgRXJyb3IKKyAgICAyICAgICAgICAgICAgICAgICAgIERlY3J5cHRpb24gQ1JDIEZhaWx1cmUKKyAgICAzICAgICAgICAgICAgICAgICAgIDIuNCBjaGFubmVsIG5vdCBzdXBwb3J0ZWQKKyAgICA0ICAgICAgICAgICAgICAgICAgIDUuMCBjaGFubmVsIG5vdCBzdXBwb3J0ZWQKKyAgICA1ICAgICAgICAgICAgICAgICAgIFNpZ25hbCB0b28gd2VhaworICAgIDYgICAgICAgICAgICAgICAgICAgTmV0d29yayBhdXRoIGZhaWx1cmUKKyAgICA3ICAgICAgICAgICAgICAgICAgIE5ldHdvcmsgYXNzb2NpYXRpb24gZmFpbHVyZQorICAgIDggICAgICAgICAgICAgICAgICAgTm8gREhDUCByZXNwb25zZQorICAgIDkgICAgICAgICAgICAgICAgICAgRmFpbGVkIERIQ1AgY29uZmlnCisgICAxMCAgICAgICAgICAgICAgICAgICBJUCBhZGRyZXNzIGNvbmZsaWN0CisgICAxMSAgICAgICAgICAgICAgICAgICBDb3VsZG4ndCBjb25uZWN0IHRvIFJlZ2lzdHJhcgorICAgMTIgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgUEJDIHNlc3Npb25zIGRldGVjdGVkCisgICAxMyAgICAgICAgICAgICAgICAgICBSb2d1ZSBhY3Rpdml0eSBzdXNwZWN0ZWQKKyAgIDE0ICAgICAgICAgICAgICAgICAgIERldmljZSBidXN5CisgICAxNSAgICAgICAgICAgICAgICAgICBTZXR1cCBsb2NrZWQKKyAgIDE2ICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgVGltZW91dAorICAgMTcgICAgICAgICAgICAgICAgICAgUmVnaXN0cmF0aW9uIFNlc3Npb24gVGltZW91dAorICAgMTggICAgICAgICAgICAgICAgICAgRGV2aWNlIFBhc3N3b3JkIEF1dGggRmFpbHVyZQorCisgXGVuZGNvZGUKKyAqCisgKiBUaGUgIERldmljZSBidXN5ICBlcnJvciBpcyAgcmV0dXJuZWQgaWYgIHRoZSBzZW5kaW5nICBkZXZpY2UgaXMgIHVuYWJsZSB0bworICogcmVzcG9uZCAgdG8gIHRoZSAgcmVxdWVzdCAgZHVlICB0byAgc29tZSAgaW50ZXJuYWwgIGNvbmZsaWN0ICBvciAgcmVzb3VyY2UKKyAqIGNvbnRlbnRpb24gaXNzdWUuIEZvciBleGFtcGxlLCBpZiBhIGRldmljZSBpcyBvbmx5IGNhcGFibGUgb2YgcGVyZm9ybWluZyBhCisgKiBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIFJlZ2lzdHJhdGlvbiBQcm90b2NvbCBhdCBhIHRpbWUsIGl0IG1heSByZXR1cm4gdGhpcworICogZXJyb3IgaW4gcmVzcG9uc2UgIHRvIGF0dGVtcHRzIHRvIHN0YXJ0IGFub3RoZXIgaW5zdGFuY2UgIGluIHRoZSBtaWRkbGUgb2YKKyAqIGFuIGFjdGl2ZSBzZXNzaW9uLgorICoKKyAqCisgKi8KKworVExWIENvbmZpZ3VyYXRpb25FcnJvciAoIFRMVl9DT05GSUdVUkFUSU9OX0VSUk9SICkgKCAyIDogMiApIE1TQgoreworICAgIGVycm9yLCAyOworfQorCitUTFYgTWFudWZhY3R1cmVyICggVExWX01BTlVGQUNUVVJFUiApICggMiA6IDIgKSBNU0IKK3sKKyAgICBuYW1lWyAwLi42NCBdOworfQorCitUTFYgTW9kZWxOYW1lICggVExWX01PREVMX05BTUUgKSAoIDIgOiAyICkgTVNCCit7CisgICAgdGV4dFsgMC4uMzIgXTsKK30KKworVExWIE1vZGVsTnVtYmVyICggVExWX01PREVMX05VTUJFUiApICggMiA6IDIgKSBNU0IKK3sKKyAgICB0ZXh0WyAwLi4zMiBdOworfQorCitUTFYgU2VyaWFsTnVtYmVyICggVExWX1NFUklBTF9OVU1CRVIgKSAoIDIgOiAyICkgTVNCCit7CisgICAgdGV4dFsgMC4uMzIgXTsKK30KKworVExWIERldmljZU5hbWUgKCBUTFZfREVWSUNFX05BTUUgKSAoIDIgOiAyICkgTVNCCit7CisgICAgdGV4dFsgMC4uMzIgXTsKK30KKworLyoqCisgKiBcYnJpZWYgRGV2aWNlIFBhc3N3b3JkIElECisgKgorICoKKyAqIFRoaXMgIGF0dHJpYnV0ZSBpcyAgdXNlZCAgdG8gaWRlbnRpZnkgIGEgIGRldmljZSBwYXNzd29yZC4gIFRoZXJlIGFyZSAgc2l4CisgKiBwcmVkZWZpbmVkIHZhbHVlcyAgYW5kIHRlbiByZXNlcnZlZCB2YWx1ZXMuICBJZiB0aGUgRGV2aWNlICBQYXNzd29yZCBJRCBpcworICogRGVmYXVsdCwgIHRoZSBFbnJvbGxlZSAgc2hvdWxkIHVzZSAgaXRzIFBJTiAgcGFzc3dvcmQgKGZyb20gIHRoZSAgbGFiZWwgb3IKKyAqIGRpc3BsYXkpLiAgVGhpcyAgcGFzc3dvcmQgbWF5ICBjb3JyZXNwb25kICB0byAgdGhlICBsYWJlbCwgZGlzcGxheSwgIG9yICBhCisgKiB1c2VyLWRlZmluZWQgIHBhc3N3b3JkIHRoYXQgaGFzICBiZWVuIGNvbmZpZ3VyZWQgIHRvIHJlcGxhY2UgIHRoZSBvcmlnaW5hbAorICogZGV2aWNlIHBhc3N3b3JkLgorICoKKyAqIFVzZXItc3BlY2lmaWVkIGluZGljYXRlcyB0aGF0IHRoZSB1c2VyICBoYXMgb3ZlcnJpZGRlbiB0aGUgcGFzc3dvcmQgd2l0aCBhCisgKiBtYW51YWxseSAgc2VsZWN0ZWQgdmFsdWUuICBNYWNoaW5lLXNwZWNpZmllZCAgaW5kaWNhdGVzIHRoYXQgIHRoZSBvcmlnaW5hbAorICogUElOICBwYXNzd29yZCBoYXMgIGJlZW4gb3ZlcnJpZGRlbiAgYnkgYSAgc3Ryb25nLCAgbWFjaGluZWdlbmVyYXRlZCBkZXZpY2UKKyAqIHBhc3N3b3JkICB2YWx1ZS4gIFRoZSBSZWtleSAgdmFsdWUgIGluZGljYXRlcyAgdGhhdCAgdGhlIGRldmljZSdzICAyNTYtYml0CisgKiByZWtleWluZyBwYXNzd29yZCAgd2lsbCBiZSB1c2VkLiAgVGhlIFB1c2hCdXR0b24gdmFsdWUgaW5kaWNhdGVzICB0aGF0IHRoZQorICogUElOICBpcyAgdGhlIGFsbC16ZXJvICB2YWx1ZSAgcmVzZXJ2ZWQgIGZvciAgdGhlIFB1c2hCdXR0b24gIENvbmZpZ3VyYXRpb24KKyAqIG1ldGhvZC4KKyAqCisgKiBUaGUgUmVnaXN0cmFyLXNwZWNpZmllZCB2YWx1ZSBpbmRpY2F0ZXMgYSAgUElOIHRoYXQgaGFzIGJlZW4gb2J0YWluZWQgZnJvbQorICogdGhlIFJlZ2lzdHJhciAodmlhIGEgZGlzcGxheSAgb3Igb3RoZXIgb3V0LW9mLWJhbmQgbWV0aG9kKS4gVGhpcyB2YWx1ZSBtYXkKKyAqIGJlIGZ1cnRoZXIgIGF1Z21lbnRlZCB3aXRoIHRoZSAgb3B0aW9uYWwgJ0lkZW50aXR5JyBhdHRyaWJ1dGUgaW4gIE0xLiBUaGlzCisgKiBhdWdtZW50YXRpb24gaXMgdXNlZnVsIHdoZW4gbXVsdGlwbGUgcHJlZGVmaW5lZCBVc2VySUQvUElOIHBhaXJzIGhhdmUgYmVlbgorICogZXN0YWJsaXNoZWQgIGJ5IGEgIFJlZ2lzdHJhciBzdWNoICBhcyAgYW4gYXV0aGVudGljYXRvciAgdXNlZCBmb3IgIEhvdHNwb3QKKyAqIGFjY2Vzcy4gSWYgdGhlICBEZXZpY2UgUGFzc3dvcmQgSUQgaW4gIE0xIGlzIG5vdCBvbmUgb2YgIHRoZSBwcmVkZWZpbmVkIG9yCisgKiByZXNlcnZlZCB2YWx1ZXMsIGl0IGNvcnJlc3BvbmRzIHRvIGEgcGFzc3dvcmQgZ2l2ZW4gdG8gdGhlIFJlZ2lzdHJhciBhcyBhbgorICogT09CIERldmljZSBQYXNzd29yZC4KKyAqCisgXGNvZGUKKworICAgVmFsdWUgICAgICAgICAgICBEZXNjcmlwdGlvbgorCisgICAweDAwMDAgICAgICAgICAgIERlZmF1bHQgKFBJTikKKyAgIDB4MDAwMSAgICAgICAgICAgVXNlci1zcGVjaWZpZWQKKyAgIDB4MDAwMiAgICAgICAgICAgTWFjaGluZS1zcGVjaWZpZWQKKyAgIDB4MDAwMyAgICAgICAgICAgUmVrZXkKKyAgIDB4MDAwNCAgICAgICAgICAgUHVzaEJ1dHRvbgorICAgMHgwMDA1ICAgICAgICAgICBSZWdpc3RyYXItc3BlY2lmaWVkCisgICAweDAwMDYgLSAweDAwMEYgIFJlc2VydmVkCisKKyBcZW5kY29kZQorICoKKyAqCisgKi8KKworVExWIERldmljZVBhc3N3b3JkSUQgKCBUTFZfREVWSUNFX1BBU1NXT1JEX0lEICkgKCAyIDogMiApIE1TQgoreworICAgIGlkLCAyOworfQorCisKKy8qKgorICogXGJyaWVmIFByaW1hcnkgRGV2aWNlIFR5cGUKKyAqCisgKgorICogVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgdGhlIHByaW1hcnkgdHlwZSBvZiB0aGUgZGV2aWNlLiBJdHMgZm9ybWF0CisgKiBmb2xsb3dzOgorICoKKyBcY29kZQorCisgICAwIDEgMiAzCisgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB8IEF0dHJpYnV0ZSBJRCAgICAgICAgICAgICAgICAgICB8IExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHwgQ2F0ZWdvcnkgSUQgICAgICAgICAgICAgICAgICAgIHwgT1VJICgxLTIpICAgICAgICAgICAgICAgICAgICB8CisgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgfCBPVUkgKDMtNCkgICAgICAgICAgICAgICAgICAgICAgfCBTdWIgQ2F0ZWdvcnkgSUQgICAgICAgICAgICAgIHwKKyAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKKyBcZW5kY29kZQorICoKKyAqIFZlbmRvci1zcGVjaWZpYyBzdWItY2F0ZWdvcmllcyAgYXJlIGRlc2lnbmF0ZWQgYnkgIHNldHRpbmcgdGhlIE9VSSAgdG8gdGhlCisgKiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggIHRoYXQgdmVuZG9yLiAgTm90ZSB0aGF0IGEgIGZvdXItYnl0ZSBzdWJkaXZpZGVkIE9VSQorICogaXMgdXNlZC4gRm9yIHRoZSBwcmVkZWZpbmVkIHZhbHVlcywgdGhlICBXaS1GaSBBbGxpYW5jZSBPVUkgb2YgMDAgNTAgRjIgMDQKKyAqIGlzIHVzZWQuICBUaGUgcHJlZGVmaW5lZCB2YWx1ZXMgIGZvciBDYXRlZ29yeSBJRCAgYW5kIFN1YiBDYXRlZ29yeSAgSUQgYXJlCisgKiBwcm92aWRlZCBpbiB0aGUgbmV4dCB0YWJsZS4gVGhlcmUgIGlzIG5vIHdheSB0byBpbmRpY2F0ZSBhIHZlbmRvci1zcGVjaWZpYworICogbWFpbiBkZXZpY2UgIGNhdGVnb3J5LiBUaGUgT1VJIGFwcGxpZXMgIG9ubHkgdG8gdGhlICBpbnRlcnByZXRhdGlvbiBvZiB0aGUKKyAqIFN1YiBDYXRlZ29yeS4gSWYgIGEgdmVuZG9yIGRvZXMgbm90IHVzZSBzdWIgY2F0ZWdvcmllcyAgZm9yIHRoZWlyIE9VSSwgdGhlCisgKiB0aHJlZS1ieXRlIE9VSSAgb2NjdXBpZXMgdGhlIGZpcnN0ICB0aHJlZSBieXRlcyBvZiAgdGhlIE9VSSBmaWVsZCAgYW5kIHRoZQorICogZm91cnRoIGJ5dGUgaXMgc2V0IHRvIHplcm8uCisgKgorICoKKyBcY29kZQorCisgICBDYXRlZ29yeSAgICAgICAgICAgICAgSUQgVmFsdWUgIFN1YiBDYXRlZ29yeSAgICAgICAgICAgICBJRCBWYWx1ZQorICAgQ29tcHV0ZXIgICAgICAgICAgICAgIDEgICAgICAgICBQQyAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXIgICAgICAgICAgICAgICAgICAgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYSBDZW50ZXIgICAgICAgICAgICAgMworICAgSW5wdXQgRGV2aWNlICAgICAgICAgIDIKKyAgIFByaW50ZXJzLCBTY2FubmVycywgICAgICAgICAgICAgUHJpbnRlciAgICAgICAgICAgICAgICAgIDEKKyAgIEZheGVzIGFuZCBDb3BpZXJzICAgICAzICAgICAgICAgU2Nhbm5lciAgICAgICAgICAgICAgICAgIDIKKyAgIENhbWVyYSAgICAgICAgICAgICAgICA0ICAgICAgICAgRGlnaXRhbCBTdGlsbCBDYW1lcmEgICAgIDEKKyAgIFN0b3JhZ2UgICAgICAgICAgICAgICA1ICAgICAgICAgTkFTICAgICAgICAgICAgICAgICAgICAgIDEKKyAgIE5ldHdvcmsgICAgICAgICAgICAgICAgICAgICAgICAgQVAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgIEluZnJhc3RydWN0dXJlICAgICAgICA2ICAgICAgICAgUm91dGVyICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoICAgICAgICAgICAgICAgICAgIDMKKyAgIERpc3BsYXlzICAgICAgICAgICAgICA3ICAgICAgICAgVGVsZXZpc2lvbiAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlY3Ryb25pYyBQaWN0dXJlIEZyYW1lIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdG9yICAgICAgICAgICAgICAgIDMKKyAgIE11bHRpbWVkaWEgRGV2aWNlcyAgICA4ICAgICAgICAgREFSICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZSICAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNYICAgICAgICAgICAgICAgICAgICAgIDMKKyAgIEdhbWluZyBEZXZpY2VzICAgICAgICA5ICAgICAgICAgWGJveCAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGJveDM2MCAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheXN0YXRpb24gICAgICAgICAgICAgIDMKKyAgIFRlbGVwaG9uZSAgICAgICAgICAgICAxMCAgICAgICAgV2luZG93cyBNb2JpbGUgICAgICAgICAgIDEKKworIFxlbmRjb2RlCisgKgorICoKKyAqLworCitUTFYgUHJpbWFyeURldmljZVR5cGUgKCBUTFZfUFJJTUFSWV9ERVZJQ0VfVFlQRSApICggMiA6IDIgKSBNU0IKK3sKKyAgICBwcmltYXJ5X2NhdGVnb3J5LCAyOworICAgIG91aVsgNCBdOworICAgIHN1Yl9jYXRlZ29yeSwgMjsKK30KKworCisvKioKKyAqIFxicmllZiBSZXF1ZXN0IFR5cGUKKyAqCisgKgorICogVGhlIFJlcXVlc3QgIFR5cGUgY29tcG9uZW50ICBzcGVjaWZpZXMgdGhlIG1vZGUgIGluIHdoaWNoIHRoZSAgZGV2aWNlIHdpbGwKKyAqIG9wZXJhdGUgaW4gZm9yICB0aGlzIHNldHVwIGV4Y2hhbmdlLiBJZiB0aGUgZGV2aWNlIGlzICBhbiBFbnJvbGxlZSwgaXQgbWF5CisgKiBzZW5kIG9ubHkgIGRpc2NvdmVyeSBtZXNzYWdlcyAgb3IgaXQgbWF5ICBhbHNvIHJlcXVlc3QgdGhhdCAgdGhlIFJlZ2lzdHJhcgorICogcHJvY2VlZCB3aXRoIG9wZW5pbmcgYSBkYXRhICBjb25uZWN0aW9uLiBUaGlzIHByb3RvY29sIGFsbG93cyBFbnJvbGxlZXMgdG8KKyAqIG1vcmUgZWZmaWNpZW50bHkgZGlzY292ZXIgZGV2aWNlcyBvbiB0aGUgbmV0d29yay4KKworICogSWYgIHRoZSBkZXZpY2UgIGluZGljYXRlcyB0aGF0ICBpdCAgaW50ZW5kcyB0byAgZW5nYWdlIHNldHVwICBlaXRoZXIgYXMgIGEKKyAqIFJlZ2lzdHJhciBvciBhbiAgRW5yb2xsZWUsIHRoZSBBY2Nlc3MgUG9pbnQgY29udGludWVzICB0byBpbmRpY2F0ZSB0aGF0IGl0CisgKiB3aWxsICBvcGVyYXRlIGFzICBhbiBBUCAgaW4gdGhlICByZXNwb25zZS4gVGhlICBSZXF1ZXN0IFR5cGUgIGF0dHJpYnV0ZSBpcworICogY2FycmllZCAgdGhyb3VnaG91dCB0aGUgIDgwMi4xWCBkYXRhICBjaGFubmVsIHNldHVwICBwcm9jZXNzIGluICB0aGUgV2ktRmkKKyAqIFByb3RlY3RlZCBTZXR1cCBJRS4gICBUaGVyZSBhcmUgdHdvIHN1Yi10eXBlcyBvZiAgUmVnaXN0cmFyczogV0xBTiBNYW5hZ2VyCisgKiBSZWdpc3RyYXIgaW5kaWNhdGVzICB0aGF0IHRoaXMgUmVnaXN0cmFyIGludGVuZHMgIHRvIG1hbmFnZSB0aGUgIEFQIG9yIFNUQQorICogc2V0dGluZ3MgdXNpbmcgVVBuUC4gIEl0IHdpbGwgZGVyaXZlIGEgVVBuUCBBUCBvciAgU1RBIE1hbmFnZW1lbnQga2V5LiBUaGUKKyAqIG9yZGluYXJ5IFJlZ2lzdHJhciB0eXBlICBpbmRpY2F0ZXMgdGhhdCB0aGlzIFJlZ2lzdHJhciBkb2VzICBub3QgaW50ZW5kIHRvCisgKiBzdWJzZXF1ZW50bHkgIG1hbmFnZSAgdGhlIEVucm9sbGVlJ3MgIHNldHRpbmdzLiAgQVBzICBtdXN0ICBub3QgZGVyaXZlICBBUAorICogTWFuYWdlbWVudCBLZXlzIGZvciBhbiBvcmRpbmFyeSAgUmVnaXN0cmFyLiBJZiBhIFJlZ2lzdHJhciBkb2VzIG5vdCBpbnRlbmQKKyAqIHRvICBiZSAgYSBXTEFOICBNYW5hZ2VyICBSZWdpc3RyYXIsICBpdCBzaG91bGQgIHNldCAgdGhlICBSZXF1ZXN0IFR5cGUgIHRvCisgKiBSZWdpc3RyYXIuIERvaW5nIHNvIGF2b2lkcyBuZWVkbGVzc2x5IGNvbnN1bWluZyByZXNvdXJjZXMgb24gdGhlIEFQLgorCisgXGNvZGUKKworIFJlcXVlc3QgVHlwZSBWYWx1ZSAgICAgICAgRGVzY3JpcHRpb24KKyAweDAwICAgICAgICAgICAgICAgICAgICAgIEVucm9sbGVlLCBJbmZvIG9ubHkKKyAweDAxICAgICAgICAgICAgICAgICAgICAgIEVucm9sbGVlLCBvcGVuIDgwMi4xWAorIDB4MDIgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0cmFyCisgMHgwMyAgICAgICAgICAgICAgICAgICAgICBXTEFOIE1hbmFnZXIgUmVnaXN0cmFyCisKKyBcZW5kY29kZQorICoKKyAqCisgKi8KKworVExWIFJlcXVlc3RUeXBlICggVExWX1JFUVVFU1RfVFlQRSApICggMiA6IDIgKSBNU0IKK3sKKyAgICByZXFUeXBlLCAxOworfQorCisvKioKKyAqIFxicmllZiBSZXNwb25zZSBUeXBlCisgKgorICoKKyAqIFRoZSBSZXNwb25zZSBUeXBlIGNvbXBvbmVudCBzcGVjaWZpZXMgdGhlIG9wZXJhdGlvbmFsIG1vZGUgb2YgdGhlCisgKiBkZXZpY2UgZm9yIHRoaXMgc2V0dXAgZXhjaGFuZ2UuIFRoZSBSZXNwb25zZSBUeXBlIElFIGlzIGNhcnJpZWQKKyAqIHRocm91Z2hvdXQgdGhlIDgwMi4xWCBkYXRhIGNoYW5uZWwgc2V0dXAgcHJvY2Vzcy4KKworIFxjb2RlCisKKyBSZXNwb25zZSBUeXBlIFZhbHVlICAgICAgIERlc2NyaXB0aW9uCisgMHgwMCAgICAgICAgICAgICAgICAgICAgICBFbnJvbGxlZSwgSW5mbyBvbmx5CisgMHgwMSAgICAgICAgICAgICAgICAgICAgICBFbnJvbGxlZSwgb3BlbiA4MDIuMVgKKyAweDAyICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdHJhcgorIDB4MDMgICAgICAgICAgICAgICAgICAgICAgQVAKKworXGVuZGNvZGUKKyAqCisgKgorICovCisKK1RMViBSZXNwb25zZVR5cGUgKCBUTFZfUkVTUE9OU0VfVFlQRSAgKSAoIDIgOiAyICkgTVNCCit7CisgICAgcmVzVHlwZSwgMTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICBXaUZpIERpcmVjdC9QMlAgVExWcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogXGJyaWVmIFAyUCBTdGF0dXMgQXR0cmlidXRlCisgKi8KKworVExWIFAyUFN0YXR1cyAoIFRMVl9QMlBfU1RBVFVTICkgKCAxIDogMiApIExTQgoreworICAgIHN0YXR1cywgMTsKK30KKworCisvKioKKyAqIFxicmllZiBNaW5vciBSZWFzb24gQ29kZSBBdHRyaWJ1dGUKKyAqLworCitUTFYgTWlub3JSZWFzb25Db2RlICggVExWX01JTk9SX1JFQVNPTl9DT0RFICkgKCAxIDogMiApIExTQgoreworICAgIG1pbm9yUmVhc29uQ29kZSwgMTsKK30KKworCisvKioKKyAqIFxicmllZiBQMlAgQ2FwYWJpbGl0eSBBdHRyaWJ1dGUKKyAqLworCitUTFYgUDJQQ2FwYWJpbGl0eSAoIFRMVl9QMlBfQ0FQQUJJTElUWSApICggMSA6IDIgKSBMU0IKK3sKKyAgICBkZXZpY2VDYXBhYmlsaXR5LCAxOworICAgIGdyb3VwQ2FwYWJpbGl0eSwgMTsKK30KKworCisvKioKKyAqIFxicmllZiBQMlAgRGV2aWNlIElkIEF0dHJpYnV0ZQorICovCisKK1RMViBQMlBEZXZpY2VJZCAoIFRMVl9QMlBfREVWSUNFX0lEICkgKCAxIDogMiApIExTQgoreworICAgIFAyUERldmljZUFkZHJlc3NbNl07Cit9CisKKy8qKgorICogXGJyaWVmIExpc3RlbiBDaGFubmVsIEF0dHJpYnV0ZQorICovCisKK1RMViBMaXN0ZW5DaGFubmVsICggVExWX0xJU1RFTl9DSEFOTkVMICkgKCAxIDogMiApIExTQgoreworICAgIGNvdW50cnlTdHJpbmdbM107CisgICAgcmVndWxhdG9yeUNsYXNzLCAxOworICAgIGNoYW5uZWwsICAgICAgICAgMTsKK30KKworLyoqCisgKiBcYnJpZWYgRXh0ZW5kZWQgTGlzdGVuIEF0dHJpYnV0ZQorICovCisKK1RMViBFeHRlbmRlZExpc3RlblRpbWluZyAoIFRMVl9FWFRFTkRFRF9MSVNURU5fVElNSU5HICkgKCAxIDogMiApIExTQgoreworICAgIGF2YWlsaWJpbGl0eVBlcmlvZCwgMjsKKyAgICBhdmFpbGliaWxpdHlJbnRlcnZhbCwgMjsKK30KKworCisvKioKKyAqIFxicmllZiBQMlAgTWFuYWdlYWJpbGl0eSBBdHRyaWJ1dGUKKyAqLworCitUTFYgUDJQTWFuYWdlYWJpbGl0eSAoIFRMVl9QMlBfTUFOQUdFQUJJTElUWSApICggMSA6IDIgKSBMU0IKK3sKKyAgICBtYW5hZ2VhYmlsaXR5LCAxOworfQorCisKKy8qKgorICogXGJyaWVmIE5vdGljZSBvZiBBYnNlbmNlCisgKi8KKworVExWIE5vdGljZU9mQWJzZW5jZSAoIFRMVl9OT1RJQ0VfT0ZfQUJTRU5DRSApICggMSA6IDIgKSBMU0IKK3sKKyAgICBpbmRleCwgMTsKKyAgICBDVFNXaW5kb3dPcHBQUywgMTsKKyAgICBOb0FEZXNjWzAuLjM2XTsKK30KKworLyoqCisgKiBcYnJpZWYgUDJQIERldmljZSBJbmZvIEF0dHJpYnV0ZQorICovCisKK1RMViBQMlBEZXZpY2VJbmZvICggVExWX1AyUF9ERVZJQ0VfSU5GTyApICggMSA6IDIgKSBMU0IKK3sKKyAgICBQMlBEZXZpY2VBZGRyZXNzWzZdOworICAgIGNvbmZpZ01ldGhvZCwgMiAsIEZMSVBCWVRFT1JERVI7CisgICAgcHJpbWFyeURldmljZVR5cGVbOF07CisgICAgTUFOREFUT1JZVExWIERldmljZU5hbWU7Cit9CisKKworLyoqCisgKiBcYnJpZWYgUDJQIEdyb3VwIEluZm8gQXR0cmlidXRlCisgKi8KKworVExWIFAyUEdyb3VwSW5mbyAoIFRMVl9QMlBfR1JPVVBfSU5GTyApICggMSA6IDIgKSBMU0IKK3sKKyAgICBQMlBDbGllbnRJbmZvRGVzY1swLi4xMDI0XTsKK30KKworCisvKioKKyAqIFxicmllZiBQMlAgSW50ZXJmYWNlIEF0dHJpYnV0ZQorICovCisKK1RMViBQMlBJbnRlcmZhY2UgKCBUTFZfUDJQX0lOVEVSRkFDRSApICggMSA6IDIgKSBMU0IKK3sKKyAgICBQMlBEZXZpY2VBZGRyZXNzWzZdOworfQorCisKKy8qKgorICogXGJyaWVmIE9wZXJhdGluZyBDaGFubmVsIEF0dHJpYnV0ZQorICovCisKK1RMViBPcGVyYXRpbmdDaGFubmVsICggVExWX09QRVJBVElOR19DSEFOTkVMICkgKCAxIDogMiApIExTQgoreworICAgIGNvdW50cnlTdHJpbmdbM107CisgICAgcmVndWxhdG9yeUNsYXNzLCAxOworICAgIGNoYW5uZWwsICAgICAgICAgMTsKK30KKworCisvKioKKyAqIFxicmllZiBWZW5kb3IgRXh0ZW5zaW9uCisgKgorICogVGhpcyB2YXJpYWJsZSBwZXJtaXRzIHZlbmRvciBleHRlbnNpb25zIGluIHRoZSBXaS1GaSBTaW1wbGUKKyAqIENvbmZpZ3VyYXRpb24gVExWIGZyYW1ld29yay4gVGhlIFZlbmRvciBFeHRlbnNpb24gZmlndXJlCisgKiBpbGx1c3RyYXRlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdmVuZG9yIGV4dGVuc2lvbnMuIFZlbmRvcgorICogSUQgaXMgdGhlIFNNSSBuZXR3b3JrIG1hbmFnZW1lbnQgcHJpdmF0ZSBlbnRlcnByaXNlIGNvZGUKKyAqCisgKiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgVmVuZG9yIElEIHwgICBWZW5kb3IgRGF0YSAgICAgICAgfAorICogKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8PC0tLSAzIC0tLT58PC0tLS0tIDEgLSAxMDIxIC0tLS0tPnwKKyAqCisgKi8KKworVExWIFZlbmRvckV4dGVuc2lvbiAoIFRMVl9WRU5ET1JfRVhURU5TSU9OICkgKCAyIDogMiApIE1TQgoreworICAgIC8qCisgICAgICogdmVuZG9ySWQgaXMgdGhlIFNNSSBuZXR3b3JrIG1hbmFnZW1lbnQgcHJpdmF0ZSBlbnRlcnByaXNlIGNvZGUuCisgICAgICogV0ZBIFZlbmRvciBJRCAweDAwMzcyQQorICAgICAqCisgICAgICovCisgICAgdmVuZG9ySWRbIDMgXTsKKworICAgIC8qKgorICAgICAqIFxicmVpZiBWZXJzaW9uMgorICAgICAqCisgICAgICogVGhlIFZlcnNpb24yIGZpZWxkIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBXaS1GaSBTaW1wbGUKKyAgICAgKiBDb25maWd1cmF0aW9uIGltcGxlbWVudGVkIGJ5IHRoZSBkZXZpY2Ugc2VuZGluZyB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgKiBUaGUgb25lLWJ5dGUgZmllbGQgaXMgYnJva2VuIGludG8gYSBmb3VyLWJpdCBtYWpvciBwYXJ0IHVzaW5nCisgICAgICogdGhlIHRvcCBNU0JzIGFuZCBmb3VyLWJpdCBtaW5vciBwYXJ0IHVzaW5nIHRoZSBMU0JzLiBBcyBhbiBleGFtcGxlLAorICAgICAqIHZlcnNpb24gMy4yIHdvdWxkIGJlIDB4MzIuIFRoaXMgc3ViZWxlbWVudCB3YXMgYWRkZWQgaW4gdGhlCisgICAgICogc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDIuMCBhbmQgaWYgdGhlIHN1YmVsZW1lbnQgaXMgbm90IGluY2x1ZGVkCisgICAgICogaW4gYSBtZXNzYWdlLCB0aGUgdHJhbnNtaXR0ZXIgb2YgdGhlIG1lc3NhZ2UgaXMgYXNzdW1lZCB0bworICAgICAqIHVzZSB2ZXJzaW9uIDEuMC4KKyAgICAgKgorICAgICAqLworICAgIE9QVElPTkFMVExWIFRMViBWZXJzaW9uMiAoIFRMVl9WRVJTSU9OMiApICAoIDEgOiAxICkgTVNCCisgICAgeworICAgICAgeworICAgICAgICAgIG1pbm9yOiA0OworICAgICAgICAgIG1ham9yOiA0OworICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQXV0aG9yaXplZE1BQ3MKKyAgICAgKgorICAgICAqIFRoaXMgc3ViZWxlbWVudCBjb250YWlucyBhIGxpc3Qgb2YgRW5yb2xsZWUgTUFDIGFkZHJlc3NlcyAoZWFjaAorICAgICAqIGJlaW5nIHNpeCBieXRlcyBpbiBsZW5ndGgpIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgdG8gc3RhcnQgV1NDLgorICAgICAqIFRoZSBBUCBpbmNsdWRlcyB0aGlzIGZpZWxkIGluIEJlYWNvbiBhbmQgUHJvYmUgUmVzcG9uc2UgZnJhbWVzIHNvCisgICAgICogRW5yb2xsZWVzIGNhbiB0ZWxsIGlmIHRoZXkgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgdG8gc3RhcnQgV1NDLiBUaGVyZQorICAgICAqIG1heSBiZSBtdWx0aXBsZSBFbnJvbGxlZXMgYWN0aXZlIG9uIHRoZSBuZXR3b3JrLCBidXQgbm90IGFsbCBvZiB0aGVtIGhhdmUKKyAgICAgKiBiZWVuIHJlZ2lzdGVyZWQgdG8gc3RhcnQgV1NDLiBUaGlzIGVsZW1lbnQgYWxsb3dzIGFuIEVucm9sbGVlIHRvIGRldGVjdAorICAgICAqIGlmIHRoZXkgc2hvdWxkIHN0YXJ0IFdTQyB3aXRoIHRoZSBBUC4gVGhlIEF1dGhvcml6ZWRNQUNzIGZpZWxkIGF1Z21lbnRzCisgICAgICogdGhlIHVzZSBvZiB0aGUgU2VsZWN0ZWQgUmVnaXN0cmFyLgorICAgICoKKyAgICAgKi8KKyAgICBPUFRJT05BTFRMViBUTFYgQXV0aG9yaXplZE1BQ3MgKCBUTFZfQVVUSE9SSVpFRF9NQUMgKSAoIDEgOiAxICkgTVNCCisgICAgeworICAgICAgICBtYWNbNl07CisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIFJlcXVlc3QgdG8gRW5yb2xsCisgICAgICoKKyAgICAgKiBUaGlzIG9wdGlvbmFsIHN1YmVsZW1lbnQgaW4gdGhlIFdTQyBJRSBpbiBQcm9iZSBSZXF1ZXN0IG9yIE0xIGluZGljYXRlcworICAgICAqIHRoZSBkZXNpcmUgdG8gZW5yb2xsIGluIHRoZSBuZXR3b3JrIGJ5IHNldHRpbmcgaXRzIHZhbHVlIHRvIFRSVUUuIElmIHRoZQorICAgICAqIFJlZ2lzdHJhciBnZXRzIHRoaXMgc3ViZWxlbWVudCBpdCBjYW4gdXNlIHRoaXMgYXMgYSB0cmlnZ2VyIHRoYXQgYSBkZXZpY2UKKyAgICAgKiB3YW50cyB0byBlbnJvbGwgKG1heWJlIGFuIGluZGljYXRpb24gY2FuIGJlIHNob3duIHRvIHRoZSB1c2VyKS4gVGhlIGRldmljZQorICAgICAqIG11c3Qgc2V0IGl0IHRvIEZBTFNFIGFmdGVyIHRoZSByZWdpc3RyYXRpb24gcHJvdG9jb2wgY29tcGxldGlvbi4KKyAgICAgKgorICAgICAqLworICAgIE9QVElPTkFMVExWIFRMViBSZXF1ZXN0VG9FbnJvbGwoIFRMVl9SRVFVRVNUX1RPX0VOUk9MTCApICggMSA6IDEgKSBNU0IKKyAgICB7CisgICAgICAgIHJlcSwgMTsKKyAgICB9Cit9CisKKy8qKgorICogXGJyaWVmIFJlcXVlc3RlZCBEZXZpY2UgVHlwZQorICoKKyAqIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIHR5cGUgb2YgYSBXaS1GaQorICogRGlyZWN0IGRldmljZS4KKyAqCisgKiBUaGlzIGF0dHJpYnV0ZSBhbGxvd3MgYSBkZXZpY2UgdG8gc3BlY2lmeSB0aGUgUHJpbWFyeSBEZXZpY2UgVHlwZQorICogb3IgdGhlIFNlY29uZGFyeSBEZXZpY2UgVHlwZSBvZiBvdGhlciBkZXZpY2VzIGl0IGlzIGludGVyZXN0ZWQgaW4uCisgKiBPbmx5IGEgZGV2aWNlIHRoYXQgcmVjZWl2ZXMgYSBQcm9iZSBSZXF1ZXN0IGNvbnRhaW5pbmcgYSBXU0MgSUUgd2l0aAorICogdGhpcyBhdHRyaWJ1dGUgYW5kIHdpdGggYSBQcmltYXJ5IERldmljZSBUeXBlIG9yIFNlY29uZGFyeSBEZXZpY2UgVHlwZQorICogdGhhdCBtYXRjaGVzIHRoZSBSZXF1ZXN0ZWQgRGV2aWNlIFR5cGUgd2lsbCByZXNwb25kIHdpdGggYSBQcm9iZSBSZXNwb25zZS4KKyAqCisgKiBJdHMgZm9ybWF0IGFuZCBjb250ZW50cyBpcyBpZGVudGljYWwgdG8gdGhlICdQcmltYXJ5IERldmljZSBUeXBlJy4KKyAqCisgKiBCb3RoIHRoZSBDYXRlZ29yeSBJRCBhbmQgU3ViIENhdGVnb3J5IElEIGNhbiBiZSB1c2VkIGFzIGEgZmlsdGVyLiBJZiBvbmx5CisgKiBsb29raW5nIGZvciBkZXZpY2VzIHdpdGggYSBjZXJ0YWluIENhdGVnb3J5IElELCB0aGUgT1VJIGFuZCBTdWIgQ2F0ZWdvcnkgSUQKKyAqIGZpZWxkcyB3aWxsIGhhdmUgdG8gYmUgc2V0IHRvIHplcm8uCisgKgorICovCitUTFYgUmVxdWVzdERldmljZVR5cGUgKCBUTFZfUkVRVUVTVEVEX0RFVklDRV9UWVBFICkgKCAyIDogMiApIE1TQgoreworICAgIHByaW1hcnlfY2F0ZWdvcnksIDI7CisgICAgb3VpWyA0IF07CisgICAgc3ViX2NhdGVnb3J5LCAyOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW5mb3JtYXRpb24gRWxlbWVudHMKKworSUUgU1NJRCAoRUlEX1NTSUQpICAgICAgICAgICAgICAgICAgICAgICAgLy8gQy5mLiBTZWMuIDcuMy4yLjEKK3sKKyAgICBzc2lkWzAuLjMyXTsKK30KKworSUUgU3VwcFJhdGVzIChFSURfU1VQUF9SQVRFUykgICAgICAgICAgICAgLy8gNy4zLjIuMgoreworICAgIHJhdGVzWzAuLlNJUl9NQUNfTUFYX05VTUJFUl9PRl9SQVRFU107Cit9CisKK0lFIEZIUGFyYW1TZXQgKEVJRF9GSF9QQVJBTV9TRVQpICAgICAgICAgIC8vIDcuMy4yLjMKK3sKKyAgICBkd2VsbF90aW1lLCAgMjsKKyAgICBob3Bfc2V0LCAgICAgMTsKKyAgICBob3BfcGF0dGVybiwgMTsKKyAgICBob3BfaW5kZXgsICAgMTsKK30KKworSUUgRFNQYXJhbXMgKEVJRF9EU19QQVJBTV9TRVQpICAgICAgICAgICAgLy8gNy4zLjIuNAoreworICAgIGN1cnJfY2hhbm5lbCwgMTsKK30KKworSUUgQ0ZQYXJhbXMgKEVJRF9DRl9QQVJBTV9TRVQpICAgICAgICAgICAgLy8gNy4zLjIuNQoreworICAgIGNmcF9jb3VudCwgICAgICAgIDE7CisgICAgY2ZwX3BlcmlvZCwgICAgICAgMTsKKyAgICBjZnBfbWF4ZHVyYXRpb24sICAyOworICAgIGNmcF9kdXJyZW1haW5pbmcsIDI7Cit9CisKK0lFIFRJTSAoRUlEX1RJTSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDcuMy4yLjYKK3sKKyAgICBkdGltX2NvdW50LCAgICAxOworICAgIGR0aW1fcGVyaW9kLCAgIDE7CisgICAgYm1wY3RsLCAgICAgICAgMTsKKyAgICB2Ym1wWzEuLjI1MV07Cit9CisKK0lFIElCU1NQYXJhbXMgKEVJRF9JQlNTX1BBUkFNX1NFVCkgICAgICAgIC8vIDcuMy4yLjcKK3sKKyAgICBhdGltLCAyOworfQorCitJRSBDaGFsbGVuZ2VUZXh0IChFSURfQ0hBTExFTkdFX1RFWFQpICAgICAvLyA3LjMuMi44Cit7CisgICAgdGV4dFsxLi4yNTNdOworfQorCitJRSBSZXF1ZXN0ZWRJbmZvIChFSURfUkVRVUVTVCkgICAgICAgICAgICAvLyA3LjMuMi4xMgoreworICAgIHJlcXVlc3RlZF9laWRzWzAuLjI1NV07Cit9CisKK0lFIENvdW50cnkgKEVJRF9DT1VOVFJZKSAgICAgICAgICAgICAgICAgIC8vIDcuMy4yLjkKK3sKKyAgICBjb3VudHJ5WzNdOworICAgIE9QVElPTkFMIHRyaXBsZXRzWzNdWzAuLjg0XTsKK30KKworSUUgRkhQYXJhbXMgKEVJRF9GSF9QQVRURVJOKSAgICAgICAgICAgICAgLy8gNy4zLjIuMTAKK3sKKyAgICByYWRpeCwgMTsKKyAgICBuY2hhbm5lbHMsIDE7Cit9CisKK0lFIEZIUGF0dFRhYmxlIChFSURfRkhfUEFUVF9UQUJMRSkgICAgICAgIC8vIDcuMy4yLjExCit7CisgICAgZmxhZywgICAgMTsKKyAgICBuc2V0cywgICAxOworICAgIG1vZHVsdXMsIDE7CisgICAgb2Zmc2V0LCAgMTsKKyAgICByYW5kdGFibGVbMC4uMjUxXTsKK30KKworSUUgRVJQSW5mbyAoRUlEX0VSUF9JTkZPKSAgICAgICAgICAgICAgICAgLy8gNy4zLjIuMTMKK3sKKyAgICB7CisgICAgICAgIG5vbl9lcnBfcHJlc2VudCA6IDE7CisgICAgICAgIHVzZV9wcm90OiAgICAgICAgIDE7CisgICAgICAgIGJhcmtlcl9wcmVhbWJsZTogIDE7CisgICAgICAgIHVudXNlZDogICAgICAgICAgIDU7CisgICAgfQorfQorCitJRSBFeHRTdXBwUmF0ZXMgKEVJRF9FWFRfU1VQUF9SQVRFUykgICAgICAvLyA3LjMuMi4xNAoreworICAgIHJhdGVzWzEuLlNJUl9NQUNfTUFYX05VTUJFUl9PRl9SQVRFU107Cit9CisKK0lFIFBvd2VyQ29uc3RyYWludHMgKEVJRF9QT1dFUl9DT05TVFJBSU5UUykgLy8gNy4zLjIuMTUKK3sKKyAgICBsb2NhbFBvd2VyQ29uc3RyYWludHMsIDE7Cit9CisKK0lFIFBvd2VyQ2FwcyAoRUlEX1BPV0VSX0NBUEFCSUxJVFkpICAgICAgIC8vIDcuMy4yLjE2Cit7CisgICAgbWluVHhQb3dlciwgMTsKKyAgICBtYXhUeFBvd2VyLCAxOworfQorCitJRSBUUENSZXF1ZXN0IChFSURfVFBDX1JFUVVFU1QpICAgICAgICAgICAvLyA3LjMuMi4xNworeyB9CisKK0lFIFRQQ1JlcG9ydCAoRUlEX1RQQ19SRVBPUlQpICAgICAgICAgICAgIC8vIDcuMy4yLjE4Cit7CisgICAgdHhfcG93ZXIsICAgIDE7CisgICAgbGlua19tYXJnaW4sIDE7Cit9CisKK0lFIFN1cHBDaGFubmVscyAoRUlEX1NVUFBPUlRFRF9DSEFOTkVMUykgIC8vIDcuMi4zLjE5Cit7CisgICAgYmFuZHNbMl1bMS4uNDhdOworfQorCitJRSBTdXBwT3BlcmF0aW5nQ2xhc3NlcyAoRUlEX1NVUFBPUlRFRF9PUEVSX0NMQVNTRVMpCit7CisgICAgY2xhc3Nlc1sxLi4zMl07Cit9CisKK0lFIENoYW5Td2l0Y2hBbm4gKEVJRF9DSEFOTkVMX1NXSVRDSF9BTk4pIC8vIDcuMy4yLjIwCit7CisgICAgc3dpdGNoTW9kZSwgIDE7CisgICAgbmV3Q2hhbm5lbCwgIDE7CisgICAgc3dpdGNoQ291bnQsIDE7Cit9CisKK0lFIGV4dF9jaGFuX3N3aXRjaF9hbm4gKEVJRF9FWFRfQ0hBTl9TV0lUQ0gpIC8vIDguNC4yLjU1Cit7CisgICAgc3dpdGNoX21vZGUsICAgMTsKKyAgICBuZXdfcmVnX2NsYXNzLCAxOworICAgIG5ld19jaGFubmVsLCAgIDE7CisgICAgc3dpdGNoX2NvdW50LCAgMTsKK30KKworSUUgc2VjX2NoYW5fb2Zmc2V0X2VsZSAoRUlEX1NFQ19DSEFOX09GRlNFVCkgLy8gNy4zLjIuMjBhCit7CisJc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCwgMTsKK30KKworSUUgUXVpZXQgKEVJRF9RVUlFVCkgICAgICAgICAgICAgICAgICAgICAgLy8gNy4zLjIuMjMKK3sKKyAgICBjb3VudCwgICAgMTsKKyAgICBwZXJpb2QsICAgMTsKKyAgICBkdXJhdGlvbiwgMjsKKyAgICBvZmZzZXQsICAgMjsKK30KKworSUUgUlNOIChFSURfUlNOKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNy4zLjIuMjUKK3sKKyAgICAvLyBUaGUgdmVyc2lvbiBpcyAyIG9jdGV0cywgYW5kIHdlIG9ubHkgc3VwcG9ydCB2ZXJzaW9uIDEuCisgICAgdmVyc2lvbiwgMiBNVVNUQkUgMTsKKyAgICAvLyBUaGUgbmV4dCBmb3VyIG9jdGV0cyB3aWxsIGJlIHRoZSBHcm91cCBDaXBoZXIgU3VpdGUKKyAgICBncF9jaXBoZXJfc3VpdGVbNF07CisgICAgLy8gVGhlIElFICptYXkqIHN0b3AgaGVyZTsgaWYgdGhlcmUncyBhbnkgbW9yZSwgd2Ugc2hvdWxkIHNlZSB0d28gbW9yZQorICAgIC8vIG9jdGV0cyBnaXZpbmcgdGhlIG51bWJlciBvZiBQYWlyd2lzZSBDaXBoZXIgU3VpdGVzCisgICAgT1BUSU9OQUwgcHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50LCAyOworICAgIC8vIEkgZG9uJ3Qgc2VlIGFueXRoaW5nIGluIHRoZSBTdGFuZGFyZCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIFBhaXJ3aXNlCisgICAgLy8gQ3lwaGVyIFN1aXRlcywgb3RoZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gSUUsIHdoaWNoIGxpbWl0cyB1cworICAgIC8vIHRvIDYxLiAgSG93ZXZlciwgdGhhdCBzZWVtcyBuZWVkbGVzc2x5IHdhc3RlZnVsIG9mIHNwYWNlLgorICAgIHB3aXNlX2NpcGhlcl9zdWl0ZXNbNF1bMC4uNF0gQ09VTlRJUyBwd2lzZV9jaXBoZXJfc3VpdGVfY291bnQ7CisgICAgLy8gT3B0aW9uYWwgY291bnQgb2YgQUtNIHN1aXRlIHNlbGVjdG9ycworICAgIE9QVElPTkFMIGFrbV9zdWl0ZV9jb3VudCwgMjsKKyAgICAvLyBBZ2FpbiwgSSBzZWUgbm90aGluZyBpbiB0aGUgU3RhbmRhcmQgZXhwbGljaXRseSBsaW1pdGluZyB0aGUgbnVtYmVyIG9mCisgICAgLy8gQUtNIHN1aXRlIHNlbGVjdG9ycyBvdGhlciB0aGFuIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gSUUuCisgICAgYWttX3N1aXRlc1s0XVswLi40XSBDT1VOVElTIGFrbV9zdWl0ZV9jb3VudDsKKyAgICBPUFRJT05BTCBSU05fQ2FwWzJdOworICAgIC8vIEZpbmFsbHksIHRoZSBJRSBtYXkgY29udGFpbiB6ZXJvIG9yIG1vcmUgUE1LSURzOgorICAgIE9QVElPTkFMIHBta2lkX2NvdW50LCAyOworICAgIHBta2lkWzE2XVswLi40XSBDT1VOVElTIHBta2lkX2NvdW50OworICAgIE9QVElPTkFMIGdwX21nbXRfY2lwaGVyX3N1aXRlWzRdOworfQorCitJRSBSU05PcGFxdWUgKEVJRF9SU04pICAgICAgICAgICAgICAgICAgICAvLyA3LjMuMi4yNQoreworICAgIGRhdGFbIDYuLjI1MyBdOworfQorCitJRSBXQVBJIChFSURfV0FQSSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDcuMy4yLjI1Cit7CisgICAgLy8gVGhlIHZlcnNpb24gaXMgMiBvY3RldHMsIGFuZCB3ZSBvbmx5IHN1cHBvcnQgdmVyc2lvbiAxLgorICAgIHZlcnNpb24sIDIgTVVTVEJFIDE7CisgICAgLy8gY291bnQgb2YgQUtNIHN1aXRlIHNlbGVjdG9ycworICAgIGFrbV9zdWl0ZV9jb3VudCwgMjsKKyAgICAvLyBBZ2FpbiwgSSBzZWUgbm90aGluZyBpbiB0aGUgU3RhbmRhcmQgZXhwbGljaXRseSBsaW1pdGluZyB0aGUgbnVtYmVyIG9mCisgICAgLy8gQUtNIHN1aXRlIHNlbGVjdG9ycyBvdGhlciB0aGFuIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gSUUuCisgICAgYWttX3N1aXRlc1s0XVswLi40XSBDT1VOVElTIGFrbV9zdWl0ZV9jb3VudDsKKyAgICAvLyB3ZSBzaG91bGQgc2VlIHR3byBtb3JlCisgICAgLy8gb2N0ZXRzIGdpdmluZyB0aGUgbnVtYmVyIG9mIFVuaWNhc3QgQ2lwaGVyIFN1aXRlcworICAgIHVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50LCAyOworICAgIC8vIEkgZG9uJ3Qgc2VlIGFueXRoaW5nIGluIHRoZSBTdGFuZGFyZCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIFBhaXJ3aXNlCisgICAgLy8gQ3lwaGVyIFN1aXRlcywgb3RoZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gSUUsIHdoaWNoIGxpbWl0cyB1cworICAgIC8vIHRvIDYxLiAgSG93ZXZlciwgdGhhdCBzZWVtcyBuZWVkbGVzc2x5IHdhc3RlZnVsIG9mIHNwYWNlLgorICAgIHVuaWNhc3RfY2lwaGVyX3N1aXRlc1s0XVswLi40XSBDT1VOVElTIHVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50OworICAgIC8vIFRoZSBuZXh0IGZvdXIgb2N0ZXRzIHdpbGwgYmUgdGhlIE11bHRpY2FzdCBDaXBoZXIgU3VpdGUKKyAgICBtdWx0aWNhc3RfY2lwaGVyX3N1aXRlWzRdOworICAgIC8vIFdBUEkgY2FwYWJpbGl0aWVzCisgICAgeworICAgICAgICBwcmVhdXRoOiAgICAgICAgICAgICAgIDE7CisgICAgICAgIHJlc2VydmVkOiAgICAgICAgICAgICAxNTsKKyAgICB9CisgICAgLy8gRmluYWxseSwgdGhlIElFIG1heSBjb250YWluIHplcm8gb3IgbW9yZSBCS0lEczoKKyAgICBPUFRJT05BTCBia2lkX2NvdW50LCAyOworICAgIGJraWRbMTZdWzAuLjRdIENPVU5USVMgYmtpZF9jb3VudDsKK30KKworSUUgV0FQSU9wYXF1ZSAoRUlEX1dBUEkpICAgICAgICAgICAgICAgICAgICAvLyA3LjMuMi4yNQoreworICAgIGRhdGFbIDYuLjI1MyBdOworfQorCitJRSBRQlNTTG9hZCAoRUlEX1FCU1NfTE9BRCkgICAgICAgICAgICAgICAvLyA3LjMuMi4yOAoreworICAgIHN0YWNvdW50LCAyOworICAgIGNoYXV0aWwsICAxOworICAgIGF2YWlsLCAgICAyOworfQorCitJRSBFRENBUGFyYW1TZXQgKEVJRF9FRENBX1BBUkFNX1NFVCkgICAgICAvLyA3LjMuMi4yOQoreworICAgIHFvcywgMTsgICAgICAgICAgICAgICAgICAgICAvLyBUb0RvOiBUaGlzIGlzIGEgYml0ZmllbGQgd2hvc2UgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZHMgb24gd2hldGhlciB0aGlzIGlzIGZyb20gYW4gQVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYSBTVEEsIGluZm9ybWF0aW9uIHdoaWNoIEknbSBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VyZSB3ZSBoYXZlIGF0IHBhcnNlIHRpbWUuLi4KKyAgICByZXNlcnZlZCwgMTsKKyAgICB7CisgICAgICAgIGFjYmVfYWlmc246IDQ7CisgICAgICAgIGFjYmVfYWNtOiAgIDE7CisgICAgICAgIGFjYmVfYWNpOiAgIDI7CisgICAgICAgIHVudXNlZDE6ICAgIDE7CisgICAgfQorICAgIHsKKyAgICAgICAgYWNiZV9hY3dtaW46IDQ7CisgICAgICAgIGFjYmVfYWN3bWF4OiA0OworICAgIH0KKyAgICBhY2JlX3R4b3BsaW1pdCwgMjsKKyAgICB7CisgICAgICAgIGFjYmtfYWlmc246IDQ7CisgICAgICAgIGFjYmtfYWNtOiAgIDE7CisgICAgICAgIGFjYmtfYWNpOiAgIDI7CisgICAgICAgIHVudXNlZDI6ICAgIDE7CisgICAgfQorICAgIHsKKyAgICAgICAgYWNia19hY3dtaW46IDQ7CisgICAgICAgIGFjYmtfYWN3bWF4OiA0OworICAgIH0KKyAgICBhY2JrX3R4b3BsaW1pdCwgMjsKKyAgICB7CisgICAgICAgIGFjdmlfYWlmc246IDQ7CisgICAgICAgIGFjdmlfYWNtOiAgIDE7CisgICAgICAgIGFjdmlfYWNpOiAgIDI7CisgICAgICAgIHVudXNlZDM6ICAgIDE7CisgICAgfQorICAgIHsKKyAgICAgICAgYWN2aV9hY3dtaW46IDQ7CisgICAgICAgIGFjdmlfYWN3bWF4OiA0OworICAgIH0KKyAgICBhY3ZpX3R4b3BsaW1pdCwgMjsKKyAgICB7CisgICAgICAgIGFjdm9fYWlmc246IDQ7CisgICAgICAgIGFjdm9fYWNtOiAgIDE7CisgICAgICAgIGFjdm9fYWNpOiAgIDI7CisgICAgICAgIHVudXNlZDQ6ICAgIDE7CisgICAgfQorICAgIHsKKyAgICAgICAgYWN2b19hY3dtaW46IDQ7CisgICAgICAgIGFjdm9fYWN3bWF4OiA0OworICAgIH0KKyAgICBhY3ZvX3R4b3BsaW1pdCwgMjsKK30KKworSUUgVFNQRUMgKEVJRF9UU1BFQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDcuMy4yLjMwCit7CisKKyAgICAvLyBUUyBJbmZvCisgICAgeworICAgICAgICB0cmFmZmljX3R5cGU6ICAgIDE7CisgICAgICAgIHRzaWQ6ICAgICAgICAgICAgNDsKKyAgICAgICAgZGlyZWN0aW9uOiAgICAgICAyOworICAgICAgICBhY2Nlc3NfcG9saWN5OiAgIDI7CisgICAgICAgIGFnZ3JlZ2F0aW9uOiAgICAgMTsKKyAgICAgICAgcHNiOiAgICAgICAgICAgICAxOworICAgICAgICB1c2VyX3ByaW9yaXR5OiAgIDM7CisgICAgICAgIHRzaW5mb19hY2tfcG9sOiAgMjsKKyAgICB9CisgICAgeworICAgICAgICBzY2hlZHVsZTogICAgICAgIDE7CisgICAgICAgIHVudXNlZDogICAgICAgICAgNzsKKyAgICB9CisKKyAgICAvLyBOb21pbmFsIE1TRFUgU2l6ZQorICAgIHsKKyAgICAgICAgc2l6ZTogIDE1OworICAgICAgICBmaXhlZDogMTsKKyAgICB9CisKKyAgICBtYXhfbXNkdV9zaXplLCAgICAgICAgMjsKKyAgICBtaW5fc2VydmljZV9pbnQsICAgICAgNDsKKyAgICBtYXhfc2VydmljZV9pbnQsICAgICAgNDsKKyAgICBpbmFjdGl2aXR5X2ludCwgICAgICAgNDsKKyAgICBzdXNwZW5zaW9uX2ludCwgICAgICAgNDsKKyAgICBzZXJ2aWNlX3N0YXJ0X3RpbWUsICAgNDsKKyAgICBtaW5fZGF0YV9yYXRlLCAgICAgICAgNDsKKyAgICBtZWFuX2RhdGFfcmF0ZSwgICAgICAgNDsKKyAgICBwZWFrX2RhdGFfcmF0ZSwgICAgICAgNDsKKyAgICBidXJzdF9zaXplLCAgICAgICAgICAgNDsKKyAgICBkZWxheV9ib3VuZCwgICAgICAgICAgNDsKKyAgICBtaW5fcGh5X3JhdGUsICAgICAgICAgNDsKKyAgICBzdXJwbHVzX2J3X2FsbG93YW5jZSwgMjsKKyAgICBtZWRpdW1fdGltZSwgICAgICAgICAgMjsKKworfSAvLyBFbmQgSUUgVFNQRUMuCisKK0lFIFRDTEFTIChFSURfVENMQVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LjMuMi4zMQoreworICAgIHVzZXJfcHJpb3JpdHksIDE7CisgICAgY2xhc3NpZmllcl90eXBlLCAxOworICAgIGNsYXNzaWZpZXJfbWFzaywgMTsKKyAgICBVTklPTiBpbmZvIChESVNDUklNSU5BVE9SIGNsYXNzaWZpZXJfdHlwZSkKKyAgICB7CisgICAgICAgIEV0aFBhcmFtcyAoY2xhc3NpZmllcl90eXBlIElTIDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNvdXJjZVs2XTsKKyAgICAgICAgICAgIGRlc3RbNl07CisgICAgICAgICAgICB0eXBlLCAyOworICAgICAgICB9CisgICAgICAgIElwUGFyYW1zIChjbGFzc2lmaWVyX3R5cGUgSVMgMSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyc2lvbiwgMTsKKyAgICAgICAgICAgIFVOSU9OIHBhcmFtcyAoRElTQ1JJTUlOQVRPUiB2ZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElwVjRQYXJhbXMgKHZlcnNpb24gSVMgNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZVs0XTsKKyAgICAgICAgICAgICAgICAgICAgZGVzdFs0XTsKKyAgICAgICAgICAgICAgICAgICAgc3JjX3BvcnQsIDI7CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9ydCwgMjsKKyAgICAgICAgICAgICAgICAgICAgRFNDUCwgMTsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8sIDE7CisgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkLCAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJcFY2UGFyYW1zICh2ZXJzaW9uIElTIDYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2VbMTZdOworICAgICAgICAgICAgICAgICAgICBkZXN0WzE2XTsKKyAgICAgICAgICAgICAgICAgICAgc3JjX3BvcnQsIDI7CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9ydCwgMjsKKyAgICAgICAgICAgICAgICAgICAgZmxvd19sYWJlbFszXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIFBhcmFtczgwMjFkcSAoY2xhc3NpZmllcl90eXBlIElTIDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhZ190eXBlLCAyOworICAgICAgICB9CisgICAgfTsKK30gLy8gRW5kIElFIFRDTEFTUworCitjb25zdCBFSURfUlJNX0JFQUNPTl9SRVBPUlRJTkcgICAgID0gMTsKK2NvbnN0IEVJRF9SUk1fQkNOX1JFUE9SVElOR19ERVRBSUwgPSAyOworCitJRSBCZWFjb25SZXBvcnRpbmcgKEVJRF9SUk1fQkVBQ09OX1JFUE9SVElORykKK3sKKyAgICAgcmVwb3J0aW5nQ29uZGl0aW9uLCAxOworICAgICB0aHJlc2hvbGQsICAgICAgICAgIDE7Cit9CisKK0lFIEJjblJlcG9ydGluZ0RldGFpbCAoRUlEX1JSTV9CQ05fUkVQT1JUSU5HX0RFVEFJTCkKK3sKKyAgICAgcmVwb3J0aW5nRGV0YWlsLCAxOworfQorCitJRSBBUENoYW5uZWxSZXBvcnQgKEVJRF9BUF9DSEFOX1JFUE9SVCkKK3sKKyAgICAgcmVndWxhdG9yeUNsYXNzLCAxOworICAgICBjaGFubmVsTGlzdFswLi41MF07Cit9CisKK0lFIE1lYXN1cmVtZW50UmVxdWVzdCAoRUlEX01FQVNfUkVRVUVTVCkgIC8vIDcuMy4yLjIxCit7CisgICAgbWVhc3VyZW1lbnRfdG9rZW4sIDE7CisKKyAgICAvLyBNZWFzdXJlbWVudCBSZXF1ZXN0IE1vZGUKKyAgICB7CisgICAgICAgIHBhcmFsbGVsOiAgICAgICAgICAxOworICAgICAgICBlbmFibGU6ICAgICAgICAgICAgMTsKKyAgICAgICAgcmVxdWVzdDogICAgICAgICAgIDE7CisgICAgICAgIHJlcG9ydDogICAgICAgICAgICAxOworICAgICAgICBkdXJhdGlvbk1hbmRhdG9yeTogMTsKKyAgICAgICAgdW51c2VkOiAgICAgICAgICAgIDM7CisgICAgfQorCisgICAgbWVhc3VyZW1lbnRfdHlwZSwgMTsKKyAgICBVTklPTiBtZWFzdXJlbWVudF9yZXF1ZXN0IChESVNDUklNSU5BVE9SIG1lYXN1cmVtZW50X3R5cGUpCisgICAgeworICAgICAgIEJhc2ljIChtZWFzdXJlbWVudF90eXBlIElTIDApCisgICAgICAgeworICAgICAgICAgICBjaGFubmVsX25vLCAgICAgICAxOworICAgICAgICAgICBtZWFzX3N0YXJ0X3RpbWVbOF07CisgICAgICAgICAgIG1lYXNfZHVyYXRpb24sICAgIDI7CisgICAgICAgfQorICAgICAgIENDQSAobWVhc3VyZW1lbnRfdHlwZSBJUyAxKQorICAgICAgIHsKKyAgICAgICAgICAgY2hhbm5lbF9ubywgICAgICAgMTsKKyAgICAgICAgICAgbWVhc19zdGFydF90aW1lWzhdOworICAgICAgICAgICBtZWFzX2R1cmF0aW9uLCAgICAyOworICAgICAgIH0KKyAgICAgICBSUElIaXN0b2dyYW0gKG1lYXN1cmVtZW50X3R5cGUgSVMgMikKKyAgICAgICB7CisgICAgICAgICAgIGNoYW5uZWxfbm8sICAgICAgIDE7CisgICAgICAgICAgIG1lYXNfc3RhcnRfdGltZVs4XTsKKyAgICAgICAgICAgbWVhc19kdXJhdGlvbiwgICAgMjsKKyAgICAgICB9CisgICAgICAgQmVhY29uIChtZWFzdXJlbWVudF90eXBlIElTIDUpCisgICAgICAgeworICAgICAgICAgIHJlZ0NsYXNzLCAgICAgICAgICAxOworICAgICAgICAgIGNoYW5uZWwsICAgICAgICAgICAxOworICAgICAgICAgIHJhbmRvbWl6YXRpb24sICAgICAyOworICAgICAgICAgIG1lYXNfZHVyYXRpb24sICAgICAyOworICAgICAgICAgIG1lYXNfbW9kZSwgICAgICAgICAxOworICAgICAgICAgIEJTU0lEWzZdOworICAgICAgICAgIE9QVElFIFNTSUQ7CisgICAgICAgICAgT1BUSUUgQmVhY29uUmVwb3J0aW5nOworICAgICAgICAgIE9QVElFIEJjblJlcG9ydGluZ0RldGFpbDsKKyAgICAgICAgICBPUFRJRSBSZXF1ZXN0ZWRJbmZvOworICAgICAgICAgIE9QVElFIEFQQ2hhbm5lbFJlcG9ydFswLi4yXTsKKyAgICAgICAgICAvL09QVElPTkFMIHZlbmRvcl9zcGVjaWZpY1sxLi4yMzldOworICAgICAgIH0KKworICAgIH07Cit9CisKK2NvbnN0IEVJRF9CQ05fUkVQT1JUX0ZSQU1FX0JPRFkgICAgPSAxOworSUUgQmVhY29uUmVwb3J0RnJtQm9keSAoRUlEX0JDTl9SRVBPUlRfRlJBTUVfQk9EWSkKK3sKKyAgICAgcmVwb3J0ZWRGaWVsZHNbMC4uMjI0XTsKK30KKworSUUgTWVhc3VyZW1lbnRSZXBvcnQgKEVJRF9NRUFTX1JFUE9SVCkgICAgLy8gNy4zLjIuMjIKK3sKKyAgICB0b2tlbiwgMTsKKyAgICAvLyBNZWFzdXJlbWVudCBSZXBvcnQgTW9kZQorICAgIHsKKyAgICAgICAgbGF0ZTogICAgICAxOworICAgICAgICBpbmNhcGFibGU6IDE7CisgICAgICAgIHJlZnVzZWQ6ICAgMTsKKyAgICAgICAgdW51c2VkOiAgICA1OworICAgIH0KKyAgICB0eXBlLCAxOworICAgIE9QVElPTkFMIFVOSU9OIHJlcG9ydCAoRElTQ1JJTUlOQVRPUiB0eXBlKQorICAgIHsKKyAgICAgICAgQmFzaWMgKHR5cGUgSVMgMCkgICAgICAgICAgICAgICAgIC8vIDcuMy4yLjIyLjEKKyAgICAgICAgeworICAgICAgICAgICAgY2hhbm5lbCwgICAgICAgICAxOworICAgICAgICAgICAgbWVhc19zdGFydF90aW1lLCA4OworICAgICAgICAgICAgbWVhc19kdXJhdGlvbiwgICAyOworICAgICAgICAgICAgLy8gTWFwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnNzOiAgICAgICAgICAgMTsKKyAgICAgICAgICAgICAgICBvZmRtX3ByZWFtYmxlOiAxOworICAgICAgICAgICAgICAgIHVuaWRfc2lnbmFsOiAgIDE7CisgICAgICAgICAgICAgICAgcmFkZXI6ICAgICAgICAgMTsKKyAgICAgICAgICAgICAgICB1bm1lYXN1cmVkOiAgICAxOworICAgICAgICAgICAgICAgIHVudXNlZDogICAgICAgIDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ0NBICh0eXBlIElTIDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYW5uZWwsICAgICAgICAgICAxOworICAgICAgICAgICAgbWVhc19zdGFydF90aW1lLCAgIDg7CisgICAgICAgICAgICBtZWFzX2R1cmF0aW9uLCAgICAgMjsKKyAgICAgICAgICAgIGNjYV9idXN5X2ZyYWN0aW9uLCAxOworICAgICAgICB9CisgICAgICAgIFJQSUhpc3RvZ3JhbSAodHlwZSBJUyAyKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFubmVsLCAgICAgICAgIDE7CisgICAgICAgICAgICBtZWFzX3N0YXJ0X3RpbWUsIDg7CisgICAgICAgICAgICBtZWFzX2R1cmF0aW9uLCAgIDI7CisgICAgICAgICAgICBycGkwX2RlbnNpdHksICAgIDE7CisgICAgICAgICAgICBycGkxX2RlbnNpdHksICAgIDE7CisgICAgICAgICAgICBycGkyX2RlbnNpdHksICAgIDE7CisgICAgICAgICAgICBycGkzX2RlbnNpdHksICAgIDE7CisgICAgICAgICAgICBycGk0X2RlbnNpdHksICAgIDE7CisgICAgICAgICAgICBycGk1X2RlbnNpdHksICAgIDE7CisgICAgICAgICAgICBycGk2X2RlbnNpdHksICAgIDE7CisgICAgICAgICAgICBycGk3X2RlbnNpdHksICAgIDE7CisgICAgICAgIH0KKyAgICAgICBCZWFjb24gKHR5cGUgSVMgNSkKKyAgICAgICB7CisgICAgICAgICAgIHJlZ0NsYXNzLCAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgIGNoYW5uZWwsICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgIG1lYXNfc3RhcnRfdGltZSwgICAgICAgIDg7CisgICAgICAgICAgIG1lYXNfZHVyYXRpb24sICAgICAgICAgIDI7CisgICAgICAgICAgIC8vIHJlcG9ydGVkX2ZyYW1lX2luZm8sCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uZGVuc2VkX1BIWTogICAgICAgIDc7CisgICAgICAgICAgICAgIHJlcG9ydGVkX2ZyYW1lX3R5cGU6IDE7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgUkNQSSwgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICAgUlNOSSwgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICAgQlNTSURbNl07CisgICAgICAgICAgIGFudGVubmFfaWQsICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICAgcGFyZW50X1RTRiwgICAgICAgICAgICAgIDQ7CisgICAgICAgICAgIE9QVElFIEJlYWNvblJlcG9ydEZybUJvZHk7CisgICAgICAgICAgIC8vSUUgdmVuZG9yX3NwZWNpZmljCisgICAgIH0KKyAgICB9OworfQorCitJRSBUU0RlbGF5IChFSURfVFNfREVMQVkpICAgICAgICAgICAgICAgICAvLyA3LjMuMi4zMgoreworICAgIGRlbGF5LCA0OworfQorCitJRSBUQ0xBU1NQUk9DIChFSURfVENMQVNTX1BST0MpICAgICAgICAgICAvLyA3LjMuMi4zMworeworICAgIHByb2Nlc3NpbmcsIDE7Cit9CisKK0lFIFNjaGVkdWxlIChFSURfU0NIRURVTEUpICAgICAgICAgICAgICAgIC8vIDcuMy4yLjM0Cit7CisgICAgeworICAgICAgICBhZ2dyZWdhdGlvbjogMTsKKyAgICAgICAgdHNpZDogICAgICAgIDQ7CisgICAgICAgIGRpcmVjdGlvbjogICAyOworICAgICAgICByZXNlcnZlZDogICAgOTsKKyAgICB9CisgICAgc2VydmljZV9zdGFydF90aW1lLCA0OworICAgIHNlcnZpY2VfaW50ZXJ2YWwsICAgNDsKKyAgICBtYXhfc2VydmljZV9kdXIsICAgIDI7CisgICAgc3BlY19pbnRlcnZhbCwgICAgICAyOworfQorCitJRSBRT1NDYXBzQXAgKEVJRF9RT1NfQ0FQQUJJTElUWSkgICAgICAgICAgIC8vIDcuMy4yLjM1Cit7CisgICAgeworICAgICAgICBjb3VudDogICA0OworICAgICAgICBxYWNrOiAgICAxOworICAgICAgICBxcmVxOiAgICAxOworICAgICAgICB0eG9wcmVxOiAxOworICAgICAgICByZXNlcnZlZDogMTsKKyAgICB9Cit9CisKK0lFIFFPU0NhcHNTdGF0aW9uIChFSURfUU9TX0NBUEFCSUxJVFkpICAgICAgICAgICAvLyA3LjMuMi4zNQoreworICAgIHsKKyAgICAgICAgYWN2b191YXBzZDogICAgMTsKKyAgICAgICAgYWN2aV91YXBzZDogICAgMTsKKyAgICAgICAgYWNia191YXBzZDogICAgMTsKKyAgICAgICAgYWNiZV91YXBzZDogICAgMTsKKyAgICAgICAgcWFjazogICAgICAgICAgMTsKKyAgICAgICAgbWF4X3NwX2xlbmd0aDogMjsKKyAgICAgICAgbW9yZV9kYXRhX2FjazogMTsKKyAgICB9Cit9CisKK0lFIExpbmtJZGVudGlmaWVyIChFSURfTElOS19JREVOVElGSUVSKSAgICAgICAgICAvLyA3LjMuMi42MgoreworICAgIGJzc2lkWzZdOworICAgIEluaXRTdGFBZGRyWzZdOworICAgIFJlc3BTdGFBZGRyWzZdOworfQorCitJRSBXUEEgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSAoMHgwMCwgMHg1MCwgMHhGMiwgMHgwMSkKK3sKKyAgICAvLyBUaGlzIElFJ3MgZmlyc3QgdHdvIG9jdGV0cyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSB2ZXJzaW9uIG51bWJlcjsKKyAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgdmVyc2lvbiAxLgorICAgIHZlcnNpb24sIDIgTVVTVEJFIDE7CisgICAgLy8gQSBmb3VyLW9jdGV0IE11bHRpY2FzdCBDaXBoZXIgbWF5IG9yIG1heSBub3QgYXBwZWFyIG5leHQgKGhlbmNlIHRoZQorICAgIC8vIE9QVElPTkFMIGtleXdvcmQpCisgICAgT1BUSU9OQUwgbXVsdGljYXN0X2NpcGhlcls0XTsKKyAgICAvLyBPcHRpb25hbCBVbmljYXN0IENpcGhlciBjb3VudAorICAgIE9QVElPTkFMIHVuaWNhc3RfY2lwaGVyX2NvdW50LCAyOworICAgIC8vIE5leHQgY29tZXMgYW4gYXJyYXkgb2YgZm91ci1vY3RldCBDaXBoZXIgU3VpdGUgc2VsZWN0b3JzOyB0aGUgQ09VTlRJUworICAgIC8vIGNsYXVzZSBpbmRpY2F0ZXMgdGhhdCB0aGUgYWN0dWFsIG51bWJlciBvZiBzZWxlY3RvcnMgc2VlbiBpcyBpbiB0aGUKKyAgICAvLyBtZW1iZXIgJ3VuaWNhc3RfY2lwaGVyX2NvdW50Jy4KKyAgICB1bmljYXN0X2NpcGhlcnNbNF1bMC4uNF0gQ09VTlRJUyB1bmljYXN0X2NpcGhlcl9jb3VudDsKKyAgICAvLyAoT3B0aW9uYWwpIEF1dGhlbnRpY2F0aW9uIHN1aXRlczoKKyAgICBPUFRJT05BTCBhdXRoX3N1aXRlX2NvdW50LCAyOworICAgIGF1dGhfc3VpdGVzWzRdWzAuLjRdIENPVU5USVMgYXV0aF9zdWl0ZV9jb3VudDsKKyAgICAvLyBUaGlzIGZpZWxkIGlzIGRlY2xhcmVkIG9wdGlvbmFsIGFzIHBlciBidWdzIDE1MjM0LCAxNDc1NSwgJiAxNDk5MS4KKyAgICBPUFRJT05BTCBjYXBzLCAyOworfQorCitJRSBXUEFPcGFxdWUgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSAoMHgwMCwgMHg1MCwgMHhGMiwgMHgwMSkKK3sKKyAgICBkYXRhWyAyLi4yNDkgXTsKK30KKworSUUgV01NSW5mb1N0YXRpb24gKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSgweDAwLCAweDUwLCAweEYyLCAweDAyLCAweDAwKQoreworICAgIC8vIFRoaXMgSUUgY29udGFpbnMgdGhlIFFvUyBJbmZvIGZpZWxkIHdoZW4gc2VudCBmcm9tIFdNTSBTdGF0aW9uCisgICAgdmVyc2lvbiwgMTsKKyAgICB7CisgICAgICAgIGFjdm9fdWFwc2Q6ICAgIDE7CisgICAgICAgIGFjdmlfdWFwc2Q6ICAgIDE7CisgICAgICAgIGFjYmtfdWFwc2Q6ICAgIDE7CisgICAgICAgIGFjYmVfdWFwc2Q6ICAgIDE7CisgICAgICAgIHJlc2VydmVkMTogICAgIDE7CisgICAgICAgIG1heF9zcF9sZW5ndGg6IDI7CisgICAgICAgIHJlc2VydmVkMjogICAgIDE7CisgICAgfQorfQorCitJRSBXTU1JbmZvQXAgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSgweDAwLCAweDUwLCAweEYyLCAweDAyLCAweDAwKQoreworICAgIC8vIFRoaXMgSUUgY29udGFpbnMgdGhlIFFvUyBJbmZvIGZpZWxkIHdoZW4gc2VudCBmcm9tIFdNTSBBUAorICAgIHZlcnNpb24sIDE7CisgICAgeworICAgICAgICBwYXJhbV9zZXRfY291bnQ6IDQ7CisgICAgICAgIHJlc2VydmVkOiAgICAgICAgMzsKKyAgICAgICAgdWFwc2Q6ICAgICAgICAgICAxOworICAgIH0KK30KKworCitJRSBXTU1QYXJhbXMgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSgweDAwLCAweDUwLCAweEYyLCAweDAyLCAweDAxKQoreworICAgIHZlcnNpb24sIDEgTVVTVEJFIDE7CisgICAgcW9zSW5mbywgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb0RvOiBUaGlzIGlzIGFjdHVhbGx5IGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdGZpZWxkLCBidXQgaXQncyBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhcmllcyBkZXBlbmRpbmcgb24gd2hldGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlbmRlciBpcyBhIFNUQSBvciBBUC4uLgorICAgIHJlc2VydmVkMiwgMTsKKyAgICB7CisgICAgICAgIGFjYmVfYWlmc246IDQ7CisgICAgICAgIGFjYmVfYWNtOiAxOworICAgICAgICBhY2JlX2FjaTogMjsKKyAgICAgICAgdW51c2VkMTogMTsKKyAgICB9CisgICAgeworICAgICAgICBhY2JlX2Fjd21pbjogNDsKKyAgICAgICAgYWNiZV9hY3dtYXg6IDQ7CisgICAgfQorICAgIGFjYmVfdHhvcGxpbWl0LCAyOworICAgIHsKKyAgICAgICAgYWNia19haWZzbjogNDsKKyAgICAgICAgYWNia19hY206IDE7CisgICAgICAgIGFjYmtfYWNpOiAyOworICAgICAgICB1bnVzZWQyOiAxOworICAgIH0KKyAgICB7CisgICAgICAgIGFjYmtfYWN3bWluOiA0OworICAgICAgICBhY2JrX2Fjd21heDogNDsKKyAgICB9CisgICAgYWNia190eG9wbGltaXQsIDI7CisgICAgeworICAgICAgICBhY3ZpX2FpZnNuOiA0OworICAgICAgICBhY3ZpX2FjbTogMTsKKyAgICAgICAgYWN2aV9hY2k6IDI7CisgICAgICAgIHVudXNlZDM6IDE7CisgICAgfQorICAgIHsKKyAgICAgICAgYWN2aV9hY3dtaW46IDQ7CisgICAgICAgIGFjdmlfYWN3bWF4OiA0OworICAgIH0KKyAgICBhY3ZpX3R4b3BsaW1pdCwgMjsKKyAgICB7CisgICAgICAgIGFjdm9fYWlmc246IDQ7CisgICAgICAgIGFjdm9fYWNtOiAxOworICAgICAgICBhY3ZvX2FjaTogMjsKKyAgICAgICAgdW51c2VkNDogMTsKKyAgICB9CisgICAgeworICAgICAgICBhY3ZvX2Fjd21pbjogNDsKKyAgICAgICAgYWN2b19hY3dtYXg6IDQ7CisgICAgfQorICAgIGFjdm9fdHhvcGxpbWl0LCAyOworfQorCitJRSBXTU1UU1BFQyAoRUlEX1ZFTkRPUl9TUEVDSUZJQykgT1VJICgweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAyKQoreworICAgIHZlcnNpb24sIDEgTVVTVEJFIDE7CisKKyAgICAvLyBUUyBJbmZvCisgICAgeworICAgICAgICB0cmFmZmljX3R5cGU6ICAgIDE7CisgICAgICAgIHRzaWQ6ICAgICAgICAgICAgNDsKKyAgICAgICAgZGlyZWN0aW9uOiAgICAgICAyOworICAgICAgICBhY2Nlc3NfcG9saWN5OiAgIDI7CisgICAgICAgIGFnZ3JlZ2F0aW9uOiAgICAgMTsKKyAgICAgICAgcHNiOiAgICAgICAgICAgICAxOworICAgICAgICB1c2VyX3ByaW9yaXR5OiAgIDM7CisgICAgICAgIHRzaW5mb19hY2tfcG9sOiAgMjsKKyAgICB9CisgICAgeworICAgICAgIHRzaW5mb19yc3ZkOiAgICAgIDc7CisgICAgICAgYnVyc3Rfc2l6ZV9kZWZuOiAgMTsKKyAgICB9CisKKyAgICAvLyBOb21pbmFsIE1TRFUgU2l6ZQorICAgIHsKKyAgICAgICAgc2l6ZTogIDE1OworICAgICAgICBmaXhlZDogMTsKKyAgICB9CisKKyAgICBtYXhfbXNkdV9zaXplLCAgICAgICAgMjsKKyAgICBtaW5fc2VydmljZV9pbnQsICAgICAgNDsKKyAgICBtYXhfc2VydmljZV9pbnQsICAgICAgNDsKKyAgICBpbmFjdGl2aXR5X2ludCwgICAgICAgNDsKKyAgICBzdXNwZW5zaW9uX2ludCwgICAgICAgNDsKKyAgICBzZXJ2aWNlX3N0YXJ0X3RpbWUsICAgNDsKKyAgICBtaW5fZGF0YV9yYXRlLCAgICAgICAgNDsKKyAgICBtZWFuX2RhdGFfcmF0ZSwgICAgICAgNDsKKyAgICBwZWFrX2RhdGFfcmF0ZSwgICAgICAgNDsKKyAgICBidXJzdF9zaXplLCAgICAgICAgICAgNDsKKyAgICBkZWxheV9ib3VuZCwgICAgICAgICAgNDsKKyAgICBtaW5fcGh5X3JhdGUsICAgICAgICAgNDsKKyAgICBzdXJwbHVzX2J3X2FsbG93YW5jZSwgMjsKKyAgICBtZWRpdW1fdGltZSwgICAgICAgICAgMjsKKworfSAvLyBFbmQgSUUgV01NVFNwZWMuCisKK0lFIFdNTUNhcHMgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSAoMHgwMCwgMHg1MCwgMHhGMiwgMHgwMiwgMHgwNSkKK3sKKyAgICB2ZXJzaW9uLCAxIE1VU1RCRSAxOworICAgIHsKKyAgICAgICAgcmVzZXJ2ZWQ6ICAgICAgNDsKKyAgICAgICAgcWFjazogICAgICAgICAgMTsKKyAgICAgICAgcXVldWVfcmVxdWVzdDogMTsKKyAgICAgICAgdHhvcF9yZXF1ZXN0OiAgMTsKKyAgICAgICAgbW9yZV9hY2s6ICAgICAgMTsKKyAgICB9Cit9CisKK0lFIFdNTVRDTEFTIChFSURfVkVORE9SX1NQRUNJRklDKSBPVUkgKDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIsIDB4MDYpCit7CisgICAgdmVyc2lvbiwgMSBNVVNUQkUgMTsKKworICAgIHVzZXJfcHJpb3JpdHksIDE7CisgICAgY2xhc3NpZmllcl90eXBlLCAxOworICAgIGNsYXNzaWZpZXJfbWFzaywgMTsKKyAgICBVTklPTiBpbmZvIChESVNDUklNSU5BVE9SIGNsYXNzaWZpZXJfdHlwZSkKKyAgICB7CisgICAgICAgIEV0aFBhcmFtcyAoY2xhc3NpZmllcl90eXBlIElTIDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNvdXJjZVs2XTsKKyAgICAgICAgICAgIGRlc3RbNl07CisgICAgICAgICAgICB0eXBlLCAyOworICAgICAgICB9CisgICAgICAgIElwUGFyYW1zIChjbGFzc2lmaWVyX3R5cGUgSVMgMSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyc2lvbiwgMTsKKyAgICAgICAgICAgIFVOSU9OIHBhcmFtcyAoRElTQ1JJTUlOQVRPUiB2ZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElwVjRQYXJhbXMgKHZlcnNpb24gSVMgNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZVs0XTsKKyAgICAgICAgICAgICAgICAgICAgZGVzdFs0XTsKKyAgICAgICAgICAgICAgICAgICAgc3JjX3BvcnQsIDI7CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9ydCwgMjsKKyAgICAgICAgICAgICAgICAgICAgRFNDUCwgMTsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8sIDE7CisgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkLCAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJcFY2UGFyYW1zICh2ZXJzaW9uIElTIDYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2VbMTZdOworICAgICAgICAgICAgICAgICAgICBkZXN0WzE2XTsKKyAgICAgICAgICAgICAgICAgICAgc3JjX3BvcnQsIDI7CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9ydCwgMjsKKyAgICAgICAgICAgICAgICAgICAgZmxvd19sYWJlbFszXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIFBhcmFtczgwMjFkcSAoY2xhc3NpZmllcl90eXBlIElTIDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhZ190eXBlLCAyOworICAgICAgICB9CisgICAgfTsKKworfQorCitJRSBXTU1UQ0xBU1BST0MgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSAoMHgwMCwgMHg1MCwgMHhGMiwgMHgwMiwgMHgwNykKK3sKKyAgICB2ZXJzaW9uLCAxIE1VU1RCRSAxOworICAgIHByb2Nlc3NpbmcsIDE7Cit9CisKK0lFIFdNTVRTRGVsYXkgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSAoMHgwMCwgMHg1MCwgMHhGMiwgMHgwMiwgMHgwOCkKK3sKKyAgICB2ZXJzaW9uLCAxIE1VU1RCRSAxOworICAgIGRlbGF5LCA0OworfQorCitJRSBXTU1TY2hlZHVsZSAoRUlEX1ZFTkRPUl9TUEVDSUZJQykgT1VJICgweDAwLCAweDUwLCAweEYyLCAweDAyLCAweDA5KQoreworICAgIHZlcnNpb24sIDEgTVVTVEJFIDE7CisKKyAgICB7CisgICAgICAgIGFnZ3JlZ2F0aW9uOiAxOworICAgICAgICB0c2lkOiAgICAgICAgNDsKKyAgICAgICAgZGlyZWN0aW9uOiAgIDI7CisgICAgICAgIHJlc2VydmVkOiAgICA5OworICAgIH0KKworICAgIHNlcnZpY2Vfc3RhcnRfdGltZSwgNDsKKyAgICBzZXJ2aWNlX2ludGVydmFsLCAgIDQ7CisgICAgbWF4X3NlcnZpY2VfZHVyLCAgICAyOworICAgIHNwZWNfaW50ZXJ2YWwsICAgICAgMjsKK30KKworSUUgRVNFUmFkTWdtdENhcCAoRUlEX1ZFTkRPUl9TUEVDSUZJQykgT1VJICgweDAwLCAweDQwLCAweDk2LCAweDAxKQoreworCisgICAgbWdtdF9zdGF0ZSwgIDE7CisKKyAgICB7CisgICAgICAgIG1ic3NpZF9tYXNrOiAgICAzOworICAgICAgICByZXNlcnZlZDogICAgICAgNTsKKyAgICB9CisKK30KKworSUUgVmVuZG9yMUlFIChFSURfVkVORE9SX1NQRUNJRklDKSBPVUkgKDB4MDAsIDB4MTAsIDB4MTgpCit7Cit9CisKK0lFIFZlbmRvcjNJRSAoRUlEX1ZFTkRPUl9TUEVDSUZJQykgT1VJICgweDAwLCAweDE2LCAweDMyKQoreworfQorCitJRSBRQ29tVmVuZG9ySUUgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSAoMHgwMCwgMHhBMCwgMHhDNikKK3sKKyAgICB0eXBlLCAgICAgIDE7CisgICAgY2hhbm5lbCwgICAxOworfQorCitJRSBFU0VUcmFmU3RybU1ldCAoRUlEX1ZFTkRPUl9TUEVDSUZJQykgT1VJICgweDAwLCAweDQwLCAweDk2LCAweDA3KQoreworICAgIHRzaWQsICAgICAgICAgICAxOworICAgIHN0YXRlLCAgICAgICAgICAxOworICAgIG1zbXRfaW50ZXJ2YWwsICAyOworfQorCitJRSBFU0VUcmFmU3RybVJhdGVTZXQgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSAoMHgwMCwgMHg0MCwgMHg5NiwgMHgwOCkKK3sKKyAgICB0c2lkLCAgICAgICAgIDE7CisgICAgdHNyYXRlc1swLi44XTsKK30KKworSUUgRVNFVmVyc2lvbiAoRUlEX1ZFTkRPUl9TUEVDSUZJQykgT1VJICgweDAwLCAweDQwLCAweDk2LCAweDAzKQoreworICAgIHZlcnNpb24sICAgICAgICAgICAxOworfQorCitJRSBFU0VUeG1pdFBvd2VyIChFSURfRVNFX1NQRUNJRklDKSBPVUkgKDB4MDAsIDB4NDAsIDB4OTYsIDB4MDApCit7CisgICAgcG93ZXJfbGltaXQsICAgIDE7CisgICAgcmVzZXJ2ZWQsICAgICAgIDE7Cit9CisKK0lFIEVTRUNja21PcGFxdWUgKEVJRF9FU0VfQ0NLTV9TUEVDSUZJQykgT1VJICgweDAwLCAweDQwLCAweDk2LCAweDAwKQoreworICAgIGRhdGFbIDYuLjIwIF07Cit9CisKK0lFIFJSTUVuYWJsZWRDYXAgKEVJRF9SUk1fRU5BQkxFRF9DQVBTKQoreworICAgICAvL0NhcGFiaWxpdHkgYml0bWFwCisgICAgIHsKKyAgICAgICAgICBMaW5rTWVhc3VyZW1lbnQ6ICAgICAgICAgMTsKKyAgICAgICAgICBOZWlnaGJvclJwdDogICAgICAgICAgICAgMTsKKyAgICAgICAgICBwYXJhbGxlbDogICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICByZXBlYXRlZDogICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICBCZWFjb25QYXNzaXZlOiAgICAgICAgICAgMTsKKyAgICAgICAgICBCZWFjb25BY3RpdmU6ICAgICAgICAgICAgMTsKKyAgICAgICAgICBCZWFjb25UYWJsZTogICAgICAgICAgICAgMTsKKyAgICAgICAgICBCZWFjb25SZXBDb25kOiAgICAgICAgICAgMTsKKyAgICAgfQorICAgICB7CisgICAgICAgICAgRnJhbWVNZWFzdXJlbWVudDogICAgICAgIDE7CisgICAgICAgICAgQ2hhbm5lbExvYWQ6ICAgICAgICAgICAgIDE7CisgICAgICAgICAgTm9pc2VIaXN0b2dyYW06ICAgICAgICAgIDE7CisgICAgICAgICAgc3RhdGlzdGljczogICAgICAgICAgICAgIDE7CisgICAgICAgICAgTENJTWVhc3VyZW1lbnQ6ICAgICAgICAgIDE7CisgICAgICAgICAgTENJQXppbXV0aDogICAgICAgICAgICAgIDE7CisgICAgICAgICAgVENNQ2FwYWJpbGl0eTogICAgICAgICAgIDE7CisgICAgICAgICAgdHJpZ2dlcmVkVENNOiAgICAgICAgICAgIDE7CisgICAgIH0KKyAgICAgeworICAgICAgICAgIEFQQ2hhblJlcG9ydDogICAgICAgICAgICAxOworICAgICAgICAgIFJSTU1JQkVuYWJsZWQ6ICAgICAgICAgICAxOworICAgICAgICAgIG9wZXJhdGluZ0NoYW5NYXg6ICAgICAgICAzOworICAgICAgICAgIG5vbk9wZXJhdGluQ2hhbk1heDogICAgICAzOworICAgICB9CisgICAgIHsKKyAgICAgICAgICBNZWFzdXJlbWVudFBpbG90OiAgICAgICAgMzsKKyAgICAgICAgICBNZWFzdXJlbWVudFBpbG90RW5hYmxlZDogMTsKKyAgICAgICAgICBOZWlnaGJvclRTRk9mZnNldDogICAgICAgMTsKKyAgICAgICAgICBSQ1BJTWVhc3VyZW1lbnQ6ICAgICAgICAgMTsKKyAgICAgICAgICBSU05JTWVhc3VyZW1lbnQ6ICAgICAgICAgMTsKKyAgICAgICAgICBCc3NBdmdBY2Nlc3NEZWxheTogICAgICAgMTsKKyAgICAgfQorICAgICB7CisgICAgICAgICAgQlNTQXZhaWxBZG1pc3Npb246ICAgICAgIDE7CisgICAgICAgICAgQW50ZW5uYUluZm9ybWF0aW9uOiAgICAgIDE7CisgICAgICAgICAgZmluZV90aW1lX21lYXNfcnB0OiAgICAgIDE7CisgICAgICAgICAgbGNpX2NhcGFiaWxpdHk6ICAgICAgICAgIDE7CisgICAgICAgICAgcmVzZXJ2ZWQ6ICAgICAgICAgICAgICAgIDQ7CisgICAgIH0KK30KKworSUUgTWVhc3VyZW1lbnRQaWxvdCAoRUlEX1JSTV9NRUFTX1BJTE9UX1RYX0lORk8pCit7CisgICAgIG1lYXN1cmVtZW50UGlsb3QsIDE7CisgICAgIHZlbmRvclNwZWNpZmljWzAuLjI1NV07IC8vU2hvdWxkIGJlIGFuIElFLiBCdXQgY3VycmVudGx5IG9ubHkgb25lIGxldmVsIG9mIG5lc3RpbmcgYWxsb3dlZC4gQ2FuIGlnbm9yZSBmb3Igbm93LgorfQorCitJRSBNdWx0aUJzc2lkIChFSURfTVVMVElQTEVfQlNTSUQpCit7CisgICAgIG1heEJTU0lESW5kaWNhdG9yLCAxOworICAgICB2ZW5kb3JTcGVjaWZpY1swLi4yNTVdOworfQorCitJRSBPQlNTU2NhblBhcmFtZXRlcnMgKEVJRF9PQlNTX1NDQU5fUEFSQU1FVEVSUykKK3sKKyAgICBvYnNzU2NhblBhc3NpdmVEd2VsbCwgMjsKKwlvYnNzU2NhbkFjdGl2ZUR3ZWxsLCAyOworCWJzc0NoYW5uZWxXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwsIDI7CisJb2Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsLCAyOworCW9ic3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsLCAyOworCWJzc1dpZHRoQ2hhbm5lbFRyYW5zaXRpb25EZWxheUZhY3RvciwgMjsKKyAgICBvYnNzU2NhbkFjdGl2aXR5VGhyZXNob2xkLCAyOworfQorCitJRSBodDIwNDBfYnNzX2NvZXhpc3RlbmNlIChFSURfMjBfNDBfQlNTX0NPRVhJU1RFTkNFKQoreworICAgICAvLyAyMC80MCBCU1MgQ29leGlzdGVuY2UgSW5mb3JtYXRpb24KKyAgICB7CisgICAgICAgIGluZm9fcmVxdWVzdDogICAgICAgICAgICAgICAxOworICAgICAgICBmb3J0eV9taHpfaW50b2xlcmFudDogICAgICAgMTsKKyAgICAgICAgdHdlbnR5X21oel9ic3N3aWR0aF9yZXE6ICAgIDE7CisgICAgICAgIG9ic3Nfc2Nhbl9leGVtcHRpb25fcmVxOiAgICAxOworICAgICAgICBvYnNzX3NjYW5fZXhlbXB0aW9uX2dyYW50OiAgMTsKKyAgICAgICAgdW51c2VkOiAgICAgICAgICAgICAgICAgICAgIDM7CisgICAgfQorfQorCitJRSBodDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0IChFSURfMjBfNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUKQoreworICAgICBvcGVyYXRpbmdfY2xhc3MsIDE7CisgICAgIGNoYW5uZWxfbGlzdFswLi41MF07Cit9CisKK2NvbnN0IEVJRF9SUk1fTkJSX1JQVF9UU0YgICAgICAgICAgICAgID0gICAgMTsKK2NvbnN0IEVJRF9SUk1fTkJSX0NEX0NPVU5UUlkgICAgICAgICAgID0gICAgMjsKK2NvbnN0IEVJRF9SUk1fTkJSX01TTVRfUElMT1RfVFhfSU5GTyAgID0gICA2NjsKKworSUUgTmVpZ2hib3JSZXBvcnQgKEVJRF9ORUlHSEJPUl9SRVBPUlQpCit7CisgICAgIGJzc2lkWzZdOworICAgICAvL0Jzc2lkIEluZm8KKyAgICAgeworICAgICAgICAgIEFQUmVhY2hhYmlsaXR5OiAyOworICAgICAgICAgIFNlY3VyaXR5OiAgICAgICAxOworICAgICAgICAgIEtleVNjb3BlOiAgICAgICAxOworICAgICAgICAgIC8vQ2FwYWJpbGl0aWVzCisgICAgICAgICAgU3BlY01nbXRDYXA6ICAgIDE7CisgICAgICAgICAgUW9zQ2FwOiAgICAgICAgIDE7CisgICAgICAgICAgYXBzZDogICAgICAgICAgIDE7CisgICAgICAgICAgcnJtOiAgICAgICAgICAgIDE7CisgICAgIH0KKyAgICAgLy9DYXBhYmlsaXRpZXMgY29udGQuCisgICAgIHsKKyAgICAgICAgICBEZWxheWVkQkE6ICAgICAgMTsKKyAgICAgICAgICBJbW1CQTogICAgICAgICAgMTsKKyAgICAgLy9DYXBhYmlsaXRpZXMgZW5kLgorICAgICAgICAgIE1vYmlsaXR5RG9tYWluOiAxOworICAgICAgICAgIHJlc2VydmVkOiAgICAgICA1OworICAgICB9CisKKyAgICAgICAgICByZXNlcnZlZDEsICAgICAgMjsgLy9wYXJ0IG9mIEJTU0lEIEluZm8uCisKKyAgICAgcmVndWxhdG9yeUNsYXNzLCAxOworICAgICBjaGFubmVsLCAgICAgICAgIDE7CisgICAgIFBoeVR5cGUsICAgICAgICAgMTsKKyAgICAgT1BUSUUgSUUgVFNGSW5mbyAoRUlEX1JSTV9OQlJfUlBUX1RTRikKKyAgICAgeworICAgICAgICAgIFRzZk9mZnNldCwgMjsKKyAgICAgICAgICBCZWFjb25JbnR2bCwgMjsKKyAgICAgfQorICAgICBPUFRJRSBJRSBDb25kZW5zZWRDb3VudHJ5U3RyIChFSURfUlJNX05CUl9DRF9DT1VOVFJZKQorICAgICB7CisgICAgICAgICAgY291bnRyeVN0clsyXTsKKyAgICAgfQorICAgICBPUFRJRSBJRSBNZWFzdXJlbWVudFBpbG90OyAvLyAoRUlEX1JSTV9OQlJfTVNNVF9QSUxPVF9UWF9JTkZPKQorLy8gICAgIHsKKy8vICAgICAgICAgIG1lYXN1cmVtZW50UGlsb3QsIDE7CisvLyAgICAgICAgICB2ZW5kb3JTcGVjaWZpY1swLi4yNTVdOyAvL1Nob3VsZCBiZSBhbiBJRS4gQnV0IGN1cnJlbnRseSBvbmx5IG9uZSBsZXZlbCBvZiBuZXN0aW5nIGFsbG93ZWQuIENhbiBpZ25vcmUgZm9yIG5vdy4KKy8vICAgICB9CisgICAgIE9QVElFIElFIFJSTUVuYWJsZWRDYXA7CisgICAgIE9QVElFIElFIE11bHRpQnNzaWQ7CisgICAgIC8vSWdub3JpbmcgdmVuZG9yIHNwZWNpZmljLgorfQorCitJRSBSQ1BJSUUgKEVJRF9SQ1BJKQoreworICAgICByY3BpLCAxOworfQorCitJRSBSU05JSUUgKEVJRF9SU05JKQoreworICAgICByc25pLCAxOworfQorCitJRSBXRkFUUEMgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSAoMHgwMCwgMHg1MCwgMHhGMiwgMHgwOCwgMHgwMCkKK3sKKyAgICAgdHhQb3dlciwgMTsKKyAgICAgbGlua01hcmdpbiwgMTsKK30KKworSUUgTW9iaWxpdHlEb21haW4gKEVJRF9GVF9NT0JJTElUWV9ET01BSU4pCit7CisgICBNRElELCAyOworICAgLy9GVCBDYXBhYmlsaXR5IGFuZCBwb2xpY3kKKyAgIHsKKyAgICAgIG92ZXJEU0NhcDogICAgICAgICAxOworICAgICAgcmVzb3VyY2VSZXFDYXA6ICAgIDE7CisgICAgICByZXNlcnZlZDogICAgICAgICAgNjsKKyAgIH0KK30KK2NvbnN0IFNVQl9FSURfRlRfUjFLSF9JRCA9IDE7Citjb25zdCBTVUJfRUlEX0ZUX0dUSyAgICAgPSAyOworY29uc3QgU1VCX0VJRF9GVF9SMEtIX0lEID0gMzsKK2NvbnN0IFNVQl9FSURfRlRfSUdUSyAgICA9IDQ7CitJRSBGVEluZm8gKEVJRF9GVF9JTkZPKQoreworICAgLy8gTWljQ29udHJvbCwgMjsKKyAgIHsKKyAgICAgIHJlc2VydmVkOiA4OworICAgICAgSUVDb3VudDogIDg7CisgICB9CisgICBNSUNbMTZdOworICAgQW5vbmNlWzMyXTsKKyAgIFNub25jZVszMl07CisKKyAgIE9QVElFIElFIFIxS0hfSUQgKFNVQl9FSURfRlRfUjFLSF9JRCkKKyAgIHsKKyAgICAgIFBNS19SMV9JRFs2XTsKKyAgIH0KKworICAgT1BUSUUgSUUgR1RLIChTVUJfRUlEX0ZUX0dUSykKKyAgIHsKKyAgICAgIC8vS2V5IEluZm8KKyAgICAgIHsKKyAgICAgICAgIGtleUlkOiAyOworICAgICAgICAgcmVzZXJ2ZWQ6IDE0OworICAgICAgfQorICAgICAga2V5TGVuZ3RoLCAxOworICAgICAgUlNDWzhdOworICAgICAga2V5WzUuLjMyXTsKKyAgIH0KKworICAgT1BUSUUgSUUgUjBLSF9JRCAoU1VCX0VJRF9GVF9SMEtIX0lEKQorICAgeworICAgICAgUE1LX1IwX0lEWzEuLjQ4XTsKKyAgIH0KKworICAgT1BUSUUgSUUgSUdUSyAoU1VCX0VJRF9GVF9JR1RLKQorICAgeworICAgICAgLy9LZXkgSW5mbworICAgICAga2V5SURbMl07CisgICAgICBJUE5bNl07CisgICAgICBrZXlMZW5ndGgsIDE7CisgICAgICBrZXlbMjRdOworICAgfQorfQorCitJRSBUaW1lb3V0SW50ZXJ2YWwgKEVJRF9USU1FT1VUX0lOVEVSVkFMKQoreworICAgdGltZW91dFR5cGUsIDE7CisgICB0aW1lb3V0VmFsdWUsIDQ7Cit9CisKKy8vVE9ETzogbmVlZCB0byBkZWZpbmUgdGhpcyBwcm9wZXJseS4KK0lFIFJJQ0RhdGEgKEVJRF9GVF9SSUNfREFUQSkKK3sKKyAgIElkZW50aWZpZXIsIDE7CisgICByZXNvdXJjZURlc2NDb3VudCwgMTsKKyAgIHN0YXR1c0NvZGUsIDI7Cit9CisKK0lFIFJJQ0Rlc2NyaXB0b3IgKEVJRF9GVF9SSUNfREVTQ1JJUFRPUikKK3sKKyAgIHJlc291cmNlVHlwZSwgMTsKKyAgIHZhcmlhYmxlRGF0YVswLi4yNTVdOyAvL0Jsb2NrIGFjayBwYXJhbSBzZXQuLi5UT0RPOgorfQorCitJRSBXc2NJRU9wYXF1ZSAoRUlEX1ZFTkRPUl9TUEVDSUZJQykgT1VJICggMHgwMCwgMHg1MCwgMHhGMiwgMHgwNCApCit7CisgICAgZGF0YVsgMi4uMjQ5IF07Cit9CisKK0lFIFAyUElFT3BhcXVlIChFSURfVkVORE9SX1NQRUNJRklDKSBPVUkgKCAweDUwLCAweDZGLCAweDlBLCAweDA5ICkKK3sKKyAgICBkYXRhWyAyLi4yNDkgXTsKK30KKworSUUgV0ZESUVPcGFxdWUgKEVJRF9WRU5ET1JfU1BFQ0lGSUMpIE9VSSAoIDB4NTAsIDB4NkYsIDB4OUEsIDB4MEEgKQoreworICAgIGRhdGFbIDIuLjI0OSBdOworfQorCitJRSBQVElDb250cm9sIChFSURfUFRJX0NPTlRST0wpICAgICAgICAgICAgICAgICAvLyA3LjMuMi42NQoreworICAgIHRpZCwgICAgICAgICAgICAgICAgICAxOworICAgIHNlcXVlbmNlX2NvbnRyb2wsICAgICAyOworfQorCitJRSBQVUJ1ZmZlclN0YXR1cyAoRUlEX1BVX0JVRkZFUl9TVEFUVVMpICAgICAgICAvLyA3LjMuMi42NgoreworICAgIHsKKyAgICAgICAgYWNfYmtfdHJhZmZpY19hdmFsOiAgICAgICAgICAxOworICAgICAgICBhY19iZV90cmFmZmljX2F2YWw6ICAgICAgICAgIDE7CisgICAgICAgIGFjX3ZpX3RyYWZmaWNfYXZhbDogICAgICAgICAgMTsKKyAgICAgICAgYWNfdm9fdHJhZmZpY19hdmFsOiAgICAgICAgICAxOworICAgICAgICByZXNlcnZlZDogICAgNDsKKyAgICB9Cit9CisKKworCitJRSBWSFRDYXBzIChFSURfVkhUX0NBUEFCSUxJVElFUykKK3sKKyAgICAvL1ZIVCBDYXBhYmlsaXR5IEluZm8KKyAgICB7CisgICAgICAgIG1heE1QRFVMZW46ICAgICAgICAgICAgICAgMjsKKyAgICAgICAgc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OiAyOworICAgICAgICBsZHBjQ29kaW5nQ2FwOiAgICAgICAgICAgIDE7CisgICAgICAgIHNob3J0R0k4ME1IejogICAgICAgICAgICAgMTsKKyAgICAgICAgc2hvcnRHSTE2MGFuZDgwcGx1czgwTUh6OiAxOworICAgICAgICB0eFNUQkM6ICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgIHJ4U1RCQzogICAgICAgICAgICAgICAgICAgMzsKKyAgICAgICAgc3VCZWFtRm9ybWVyQ2FwOiAgICAgICAgICAxOworICAgICAgICBzdUJlYW1mb3JtZWVDYXA6ICAgICAgICAgIDE7CisgICAgICAgIGNzbm9mQmVhbWZvcm1lckFudFN1cDogICAgMzsKKyAgICAgICAgbnVtU291bmRpbmdEaW06ICAgICAgICAgICAzOworICAgICAgICBtdUJlYW1mb3JtZXJDYXA6ICAgICAgICAgIDE7CisgICAgICAgIG11QmVhbWZvcm1lZUNhcDogICAgICAgICAgMTsKKyAgICAgICAgdmh0VFhPUFBTOiAgICAgICAgICAgICAgICAxOworICAgICAgICBodGNWSFRDYXA6ICAgICAgICAgICAgICAgIDE7CisgICAgICAgIG1heEFNUERVTGVuRXhwOiAgICAgICAgICAgMzsKKyAgICAgICAgdmh0TGlua0FkYXB0Q2FwOiAgICAgICAgICAyOworICAgICAgICByeEFudFBhdHRlcm46ICAgICAgICAgICAgIDE7CisgICAgICAgIHR4QW50UGF0dGVybjogICAgICAgICAgICAgMTsKKyAgICAgICAgcmVzZXJ2ZWQxOiAgICAgICAgICAgICAgICAyOworICAgIH0KKyAgICByeE1DU01hcCwgICAgICAgICAgICAgICAgICAgICAyOworICAgIHsKKyAgICAgICAgIHJ4SGlnaFN1cERhdGFSYXRlOiAgICAgICAxMzsKKyAgICAgICAgIHJlc2VydmVkMjogICAgICAgICAgICAgICAzOworICAgIH0KKyAgICB0eE1DU01hcCwgICAgICAgICAgICAgICAgICAgICAyOworICAgIHsKKyAgICAgICAgdHhTdXBEYXRhUmF0ZTogICAgICAgICAgICAxMzsKKyAgICAgICAgcmVzZXJ2ZWQzOiAgICAgICAgICAgICAgICAzOworICAgIH0KK30KKworSUUgVkhUT3BlcmF0aW9uIChFSURfVkhUX09QRVJBVElPTl9FTEVNRU5UKQoreworICAgIGNoYW5XaWR0aCwgICAgICAgICAgIDE7CisgICAgY2hhbkNlbnRlckZyZXFTZWcxLCAgMTsKKyAgICBjaGFuQ2VudGVyRnJlcVNlZzIsICAxOworICAgIGJhc2ljTUNTU2V0LCAgICAgICAgIDI7Cit9CisKK0lFIFZIVEV4dEJzc0xvYWQgKEVJRF9WSFRfRVhUX0JTU19MT0FEKQoreworICAgIG11TUlNT0NhcFN0YUNvdW50LCAgICAxOworICAgIHNzVW5kZXJVdGlsLCAgICAgICAgICAxOworICAgIEZvcnR5TUh6VXRpbCwgICAgICAgICAxOworICAgIEVpZ2h0eU1IelV0aWwsICAgICAgICAxOworICAgIE9uZVNpeHR5TUh6VXRpbCwgICAgICAxOworfQorCitJRSBBSUQgKEVJRF9BSUQpCit7CisgICAgYXNzb2NJZCwgICAgICAgICAgICAgIDI7Cit9CisKK0lFIFdpZGVyQldDaGFuU3dpdGNoQW5uIChFSURfV0lERVJfQldfQ0hBTk5FTF9TV0lUQ0hfQU5OKQoreworICAgbmV3Q2hhbldpZHRoLCAgICAgICAgICAxOworICAgbmV3Q2VudGVyQ2hhbkZyZXEwLCAgICAxOworICAgbmV3Q2VudGVyQ2hhbkZyZXExLCAgICAxOworfQorCitJRSBDaGFubmVsU3dpdGNoV3JhcHBlciAoRUlEX0NIQU5ORUxfU1dJVENIX1dSQVBQRVIpCit7CisgICAgT1BUSUUgSUUgIFdpZGVyQldDaGFuU3dpdGNoQW5uOworfQorSUUgRXh0Q2FwIChFSURfRVhUX0NBUCkKK3sKKyAgICBieXRlc1s4Li45XTsKK30KKworSUUgSFRDYXBzIChFSURfSFRfQ0FQQUJJTElUSUVTKQoreworICAgIC8vIEhUIENhcGFiaWxpdHkgSW5mbworICAgIHsKKyAgICAgICAgYWR2Q29kaW5nQ2FwOiAgICAgICAgICAgICAxOworICAgICAgICBzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ6IDE7CisgICAgICAgIG1pbW9Qb3dlclNhdmU6ICAgICAgICAgICAgMjsKKyAgICAgICAgZ3JlZW5GaWVsZDogICAgICAgICAgICAgICAxOworICAgICAgICBzaG9ydEdJMjBNSHo6ICAgICAgICAgICAgIDE7CisgICAgICAgIHNob3J0R0k0ME1IejogICAgICAgICAgICAgMTsKKyAgICAgICAgdHhTVEJDOiAgICAgICAgICAgICAgICAgICAxOworICAgICAgICByeFNUQkM6ICAgICAgICAgICAgICAgICAgIDI7CisgICAgICAgIGRlbGF5ZWRCQTogICAgICAgICAgICAgICAgMTsKKyAgICAgICAgbWF4aW1hbEFNU0RVc2l6ZTogICAgICAgICAxOworICAgICAgICBkc3NzQ2NrTW9kZTQwTUh6OiAgICAgICAgIDE7CisgICAgICAgIHBzbXA6ICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgc3RiY0NvbnRyb2xGcmFtZTogICAgICAgICAxOworICAgICAgICBsc2lnVFhPUFByb3RlY3Rpb246ICAgICAgIDE7CisgICAgfQorICAgIC8vIEhUIFBhcmFtZXRlcnMgSW5mbzsKKyAgICB7CisgICAgICAgIG1heFJ4QU1QRFVGYWN0b3I6IDI7CisgICAgICAgIG1wZHVEZW5zaXR5OiAgICAgIDM7CisgICAgICAgIHJlc2VydmVkMTogICAgICAgIDM7CisgICAgfQorCisgICAgc3VwcG9ydGVkTUNTU2V0WyBIVF9NQVhfU1VQUE9SVEVEX01DU19TRVQgXTsKKworICAgIC8vIEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbworICAgIHsKKyAgICAgICAgcGNvOiAgICAgICAgICAgIDE7CisgICAgICAgIHRyYW5zaXRpb25UaW1lOiAyOworICAgICAgICByZXNlcnZlZDI6ICAgICAgNTsKKyAgICAgICAgbWNzRmVlZGJhY2s6ICAgIDI7CisgICAgICAgIHJlc2VydmVkMzogICAgICA2OworICAgIH0KKyAgICAvLyBUWEJGIENhcGFiaWxpdHkgSW5mbworICAgIHsKKyAgICAgICAgdHhCRjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICByeFN0YWdnZXJlZFNvdW5kaW5nOiAgICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgIHR4U3RhZ2dlcmVkU291bmRpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgcnhaTEY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICB0eFpMRjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgIGltcGxpY2l0VHhCRjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgY2FsaWJyYXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOworICAgICAgICBleHBsaWNpdENTSVR4QkY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgIGV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXg6ICAgICAgICAgMTsKKyAgICAgICAgZXhwbGljaXRCRkNTSUZlZWRiYWNrOiAgICAgICAgICAgICAgICAgICAgICAzOworICAgICAgICBleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2s6IDM7CisgICAgICAgIGV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2s6ICAgMzsKKyAgICAgICAgY3NpTnVtQkZBbnRlbm5hZTogICAgICAgICAgICAgICAgICAgICAgICAgICAyOworICAgICAgICB1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU6ICAgICAgIDI7CisgICAgICAgIGNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU6ICAgICAgICAgMjsKKyAgICAgICAgcmVzZXJ2ZWQ0OiAgICAgICAgICAgNzsKKyAgICB9CisgICAgLy8gQVMgQ2FwYWJpbGl0eSBJbmZvCisgICAgeworICAgICAgICBhbnRlbm5hU2VsZWN0aW9uOiAgICAgICAgIDE7CisgICAgICAgIGV4cGxpY2l0Q1NJRmVlZGJhY2tUeDogICAgMTsKKyAgICAgICAgYW50ZW5uYUluZGljZXNGZWVkYmFja1R4OiAxOworICAgICAgICBleHBsaWNpdENTSUZlZWRiYWNrOiAgICAgIDE7CisgICAgICAgIGFudGVubmFJbmRpY2VzRmVlZGJhY2s6ICAgMTsKKyAgICAgICAgcnhBUzogICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICB0eFNvdW5kaW5nUFBEVXM6ICAgICAgICAgIDE7CisgICAgICAgIHJlc2VydmVkNTogICAgICAgICAgICAgICAgMTsKKyAgICB9CisgICAgLy9UT0RPOiB0YWtlIGl0IG91dCB3aGVuIGdlbmVyaWMgZml4IHRvIHJlbW92ZSBleHRyYSBieXRlcyBpbiBJRSBpcyBhdmFpbGFibGUuCisgICAgLy9UaGlzIGlzIHJlcXVpcmVkIHRvIGludGVyb3Agd2l0aCBEbGluayBBUCB3aGljaCBpcyBzZW5kaW5nIDIgYnl0ZXMgZXh0cmEgaW4gSFRJbmZvIElFLgorICAgIHJzdmRbMC4uMzJdOworCit9IC8vIEVuZCBJRSBIVENhcHMuCisKK0lFIEhUSW5mbyAoRUlEX0hUX0lORk8pCit7CisgICAgcHJpbWFyeUNoYW5uZWwsIDE7CisKKyAgICAvLyBhaHRJbmZvRmllbGQxCisgICAgeworICAgICAgICBzZWNvbmRhcnlDaGFubmVsT2Zmc2V0OiAgICAgMjsKKyAgICAgICAgcmVjb21tZW5kZWRUeFdpZHRoU2V0OiAgICAgIDE7CisgICAgICAgIHJpZnNNb2RlOiAgICAgICAgICAgICAgICAgICAxOworICAgICAgICBjb250cm9sbGVkQWNjZXNzT25seTogICAgICAgMTsKKyAgICAgICAgc2VydmljZUludGVydmFsR3JhbnVsYXJpdHk6IDM7CisgICAgfQorCisgICAgLy8gYWh0SW5mb0ZpZWxkMgorCisKKyAgICAvLyBhaHRJbmZvRmllbGQyCisgICAgeworICAgICAgICBvcE1vZGU6ICAgICAgICAgICAgICAyOworICAgICAgICBub25HRkRldmljZXNQcmVzZW50OiAxOworICAgICAgICB0cmFuc21pdEJ1cnN0TGltaXQ6IDE7CisgICAgICAgIG9ic3NOb25IVFN0YVByZXNlbnQ6MTsKKyAgICAgICAgcmVzZXJ2ZWQ6ICAgICAgICAgICAxMTsKKyAgICB9CisKKworICAgIC8vIGFodEluZm9GaWVsZDMKKyAgICB7CisgICAgICAgIGJhc2ljU1RCQ01DUzogICAgICAgICAgICAgICAgICA3OworICAgICAgICBkdWFsQ1RTUHJvdGVjdGlvbjogICAgICAgICAgICAgMTsKKyAgICAgICAgc2Vjb25kYXJ5QmVhY29uOiAgICAgICAgICAgICAgIDE7CisgICAgICAgIGxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OiAxOworICAgICAgICBwY29BY3RpdmU6ICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgcGNvUGhhc2U6ICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgIHJlc2VydmVkMjogICAgICAgICAgICAgICAgICAgICA0OworICAgIH0KKworICAgIGJhc2ljTUNTU2V0WyBIVF9NQVhfU1VQUE9SVEVEX01DU19TRVQgXTsKKworICAgIC8vVE9ETzogdGFrZSBpdCBvdXQgd2hlbiBnZW5lcmljIGZpeCB0byByZW1vdmUgZXh0cmEgYnl0ZXMgaW4gSUUgaXMgYXZhaWxhYmxlLgorICAgIC8vVGhpcyBpcyByZXF1aXJlZCB0byBpbnRlcm9wIHdpdGggRGxpbmsgQVAgd2hpY2ggaXMgc2VuZGluZyAyIGJ5dGVzIGV4dHJhIGluIEhUSW5mbyBJRS4KKyAgICByc3ZkWzAuLjMyXTsKKworfSAvLyBFbmQgSUUgSFRJbmZvLgorCisKK0lFIE9wZXJhdGluZ01vZGUgKEVJRF9PUEVSQVRJTkdfTU9ERSkKK3sKKyAgICB7IC8vT3BlcmF0aW5nIE1vZGUgZmllbGQKKyAgICAgICAgY2hhbldpZHRoOiAgICAyOworICAgICAgICByZXNlcnZlZDogICAgIDI7CisgICAgICAgIHJ4TlNTOiAgICAgICAgMzsKKyAgICAgICAgcnhOU1NUeXBlOiAgICAxOworICAgIH0KK30KKworSUUgUW9zTWFwU2V0IChFSURfUU9TX01BUF9TRVQpCit7CisgICAgZHNjcF9leGNlcHRpb25zWzAuLjYwXTsKK30KKworQ09OVEFJTkVSSUUgUklDRGF0YURlc2MKK3sKKyAgTUFORElFIFJJQ0RhdGE7CisgIE9QVElFICBSSUNEZXNjcmlwdG9yOworICBPUFRJRSAgVFNQRUM7CisgIE9QVElFICBUQ0xBU1swLi4yXTsKKyAgT1BUSUUgIFRDTEFTU1BST0M7CisgIE9QVElFICBUU0RlbGF5OworICBPUFRJRSAgU2NoZWR1bGU7CisgIE9QVElFICBXTU1UU1BFQzsKKyAgT1BUSUUgIFdNTVRDTEFTWzAuLjJdOworICBPUFRJRSAgV01NVENMQVNQUk9DOworICBPUFRJRSAgV01NVFNEZWxheTsKKyAgT1BUSUUgIFdNTVNjaGVkdWxlOworfQorCitJRSBUaW1lQWR2ZXJ0aXNlbWVudCAoRUlEX1RJTUVfQURWRVJUSVNFTUVOVCkgICAvLyA4LjQuMi42MworeworICAgIHRpbWluZ19jYXBhYmlsaXRpZXMsIDE7CisgICAgdGltZV92YWx1ZVsxMF07CisgICAgdGltZV9lcnJvcls1XTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVUxUSUlFcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitNVUxUSUlFIFdTQyAoIEVJRF9WRU5ET1JfU1BFQ0lGSUMgKSBPVUkoIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDQgKQoreworICAgIE1BTkRBVE9SWVRMViBWZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIDB4MTAKKyAgICBPUFRJT05BTFRMViAgV1BTU3RhdGU7CisgICAgT1BUSU9OQUxUTFYgIEFQU2V0dXBMb2NrZWQ7CisgICAgT1BUSU9OQUxUTFYgIFNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczsKKyAgICBPUFRJT05BTFRMViAgVVVJRF9FOworICAgIE9QVElPTkFMVExWICBVVUlEX1I7CisgICAgT1BUSU9OQUxUTFYgIFJGQmFuZHM7CisgICAgT1BUSU9OQUxUTFYgIFNlbGVjdGVkUmVnaXN0cmFyOworICAgIE9QVElPTkFMVExWICBDb25maWdNZXRob2RzOworICAgIE9QVElPTkFMVExWICBBc3NvY2lhdGlvblN0YXRlOworICAgIE9QVElPTkFMVExWICBDb25maWd1cmF0aW9uRXJyb3I7CisgICAgT1BUSU9OQUxUTFYgIE1hbnVmYWN0dXJlcjsKKyAgICBPUFRJT05BTFRMViAgTW9kZWxOYW1lOworICAgIE9QVElPTkFMVExWICBNb2RlbE51bWJlcjsKKyAgICBPUFRJT05BTFRMViAgU2VyaWFsTnVtYmVyOworICAgIE9QVElPTkFMVExWICBEZXZpY2VOYW1lOworICAgIE9QVElPTkFMVExWICBEZXZpY2VQYXNzd29yZElEOworICAgIE9QVElPTkFMVExWICBQcmltYXJ5RGV2aWNlVHlwZTsKKyAgICBPUFRJT05BTFRMViAgUmVxdWVzdFR5cGU7CisgICAgT1BUSU9OQUxUTFYgIFJlc3BvbnNlVHlwZTsKKyAgICBPUFRJT05BTFRMViAgVmVuZG9yRXh0ZW5zaW9uOworICAgIE9QVElPTkFMVExWICBSZXF1ZXN0RGV2aWNlVHlwZTsKK30KKworTVVMVElJRSBXc2NCZWFjb24gKCBFSURfVkVORE9SX1NQRUNJRklDICkgT1VJKCAweDAwLCAweDUwLCAweEYyLCAweDA0ICkKK3sKKyAgICBNQU5EQVRPUllUTFYgVmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDEwID0gdmVyc2lvbiAxLjAsIDB4MTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9IHZlcnNpb24gMS4xLCBldGMuCisgICAgTUFOREFUT1JZVExWIFdQU1N0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgLy8gMSA9IHVuY29uZmlndXJlZCwgMiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlndXJlZAorICAgIE9QVElPTkFMVExWICBBUFNldHVwTG9ja2VkOyAgICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgaW5jbHVkZWQgaWYgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBUUlVFCisgICAgT1BUSU9OQUxUTFYgIFNlbGVjdGVkUmVnaXN0cmFyOyAgICAgICAgICAgICAgLy8gQk9PTDogaW5kaWNhdGVzIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXIgaGFzIHJlY2VudGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZhdGVkIGEgUmVnaXN0cmFyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGFuIEVucm9sbGVlLgorICAgIE9QVElPTkFMVExWICBEZXZpY2VQYXNzd29yZElEOyAgICAgICAgICAgICAgIC8vIERldmljZSBQYXNzd29yZCBJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlcyB0aGUgbWV0aG9kIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWRlbnRpZmllcyB0aGUgc3BlY2lmaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzd29yZCB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkIFJlZ2lzdHJhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVuZHMgdG8gdXNlLgorICAgIE9QVElPTkFMVExWICBTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHM7IC8vIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbmZpZyBtZXRob2RzIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdHJhci4KKyAgICBPUFRJT05BTFRMViAgVVVJRF9FOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQVAncyBVVUlEIGlzIHByb3ZpZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB3aGVuIHRoZSBBUCBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVhbC1iYW5kIEFQIGluIHB1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXR0b24gbW9kZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0aW5nIHB1c2ggYnV0dG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9kZSBvbiBib3RoIHJhZGlvcworICAgIE9QVElPTkFMVExWICBSRkJhbmRzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGljYXRlcyBhbGwgUkYgYmFuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUgb24gdGhlIEFQLiBBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVhbC1iYW5kIEFQIG11c3QgcHJvdmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYXR0cmlidXRlLgorICAgIC8vIFdTQyAyLjAKKyAgICBPUFRJT05BTFRMViAgVmVuZG9yRXh0ZW5zaW9uOyAgICAgICAgICAgICAgICAvLyBWZXJzaW9uMiBhbmQgQXV0aG9yaXplZE1BQ3MKKworfSAvLyBFbmQgTXVsdGktSUUgV3NjQmVhY29uLgorCitNVUxUSUlFIFdzY0Fzc29jUmVxICggRUlEX1ZFTkRPUl9TUEVDSUZJQyApIE9VSSggMHgwMCwgMHg1MCwgMHhGMiwgMHgwNCApCit7CisgICAgTUFOREFUT1JZVExWIFZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgxMCA9IHZlcnNpb24gMS4wLCAweDExCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPSB2ZXJzaW9uIDEuMSwgZXRjLgorICAgIE1BTkRBVE9SWVRMViBSZXF1ZXN0VHlwZTsgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAvLyBXU0MgMi4wCisgICAgT1BUSU9OQUxUTFYgIFZlbmRvckV4dGVuc2lvbjsgICAgICAgICAgICAgICAgLy8gVmVyc2lvbjIKKworfSAvLyBFbmQgTXVsdGktSUUgV3NjQXNzb2NSZXEuCisKKworTVVMVElJRSBXc2NBc3NvY1JlcyAoIEVJRF9WRU5ET1JfU1BFQ0lGSUMgKSBPVUkoIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDQgKQoreworICAgIE1BTkRBVE9SWVRMViBWZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MTAgPSB2ZXJzaW9uIDEuMCwgMHgxMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID0gdmVyc2lvbiAxLjEsIGV0Yy4KKyAgICBNQU5EQVRPUllUTFYgUmVzcG9uc2VUeXBlOyAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgLy8gV1NDIDIuMAorICAgIE9QVElPTkFMVExWICBWZW5kb3JFeHRlbnNpb247ICAgICAgICAgICAgICAgIC8vIFZlcnNpb24yCisKK30gLy8gRW5kIE11bHRpLUlFIFdzY0Fzc29jUmVzLgorCitNVUxUSUlFIFdzY1JlYXNzb2NSZXMgKCAyMjEgKSBPVUkoIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDQgKQoreworICAgIE1BTkRBVE9SWVRMViBWZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MTAgPSB2ZXJzaW9uIDEuMCwgMHgxMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID0gdmVyc2lvbiAxLjEsIGV0Yy4KKyAgICBNQU5EQVRPUllUTFYgUmVzcG9uc2VUeXBlOyAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgLy8gV1NDIDIuMAorICAgIE9QVElPTkFMVExWICBWZW5kb3JFeHRlbnNpb247ICAgICAgICAgICAgICAgIC8vIFZlcnNpb24yCisKK30gLy8gRW5kIE11bHRpLUlFIFdzY1JlYXNzb2NSZXMKKworTVVMVElJRSBXc2NQcm9iZVJlcSAoIEVJRF9WRU5ET1JfU1BFQ0lGSUMgKSBPVUkoIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDQgKQoreworICAgIE1BTkRBVE9SWVRMViBWZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MTAgPSB2ZXJzaW9uIDEuMCwgMHgxMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID0gdmVyc2lvbiAxLjEsIGV0Yy4KKyAgICBNQU5EQVRPUllUTFYgUmVxdWVzdFR5cGU7ICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgTUFOREFUT1JZVExWIENvbmZpZ01ldGhvZHM7ICAgICAgICAgICAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBtZXRob2RzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVucm9sbGVlIG9yIFJlZ2lzdHJhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRzCisgICAgTUFOREFUT1JZVExWIFVVSURfRTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEdVSUQgZ2VuZXJhdGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIEVucm9sbGVlLgorICAgIE1BTkRBVE9SWVRMViBQcmltYXJ5RGV2aWNlVHlwZTsKKyAgICBNQU5EQVRPUllUTFYgUkZCYW5kczsgICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGVjaWZpYyBSRiBiYW5kcyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgbWVzc2FnZQorICAgIE1BTkRBVE9SWVRMViBBc3NvY2lhdGlvblN0YXRlOyAgICAgICAgICAgICAgIC8vIENvbmZpZ3VyYXRpb24gYW5kIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzb2NpYXRpb24gc3RhdGUKKyAgICBNQU5EQVRPUllUTFYgQ29uZmlndXJhdGlvbkVycm9yOworICAgIE1BTkRBVE9SWVRMViBEZXZpY2VQYXNzd29yZElEOworCisgICAgLy8gV1NDIDIuMAorICAgIE9QVElPTkFMVExWICBNYW51ZmFjdHVyZXI7ICAgICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgaW5jbHVkZWQgaW4gdmVyIDIuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGhpZ2hlci4KKyAgICBPUFRJT05BTFRMViAgTW9kZWxOYW1lOyAgICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGluY2x1ZGVkIGluIHZlciAyLjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBoaWdoZXIuCisgICAgT1BUSU9OQUxUTFYgIE1vZGVsTnVtYmVyOyAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBpbmNsdWRlZCBpbiB2ZXIgMi4wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgaGlnaGVyLgorICAgIE9QVElPTkFMVExWICBEZXZpY2VOYW1lOyAgICAgICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgaW5jbHVkZWQgaW4gdmVyIDIuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGhpZ2hlci4KKyAgICBPUFRJT05BTFRMViAgVmVuZG9yRXh0ZW5zaW9uOyAgICAgICAgICAgICAgICAvLyBWZXJzaW9uMiBhbmQgUmVxdWVzdFRvRW50cm9sbAorCisgICAgT1BUSU9OQUxUTFYgIFJlcXVlc3REZXZpY2VUeXBlOyAgICAgICAgICAgICAgLy8gV2hlbiBhIGRldmljZSByZWNlaXZlcyBhIFByb2JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVxdWVzdCBjb250YWluaW5nIHRoaXMgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCB3aWxsIG9ubHkgcmVwb25zZSBpZiBQcmltYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgU2Vjb25kYXJ5IERldmljZSBUeXBlIG1hdGNoZXMuCisKK30gLy8gRW5kIE11bHRpLUlFIFdzY1Byb2JlUmVxLgorCitNVUxUSUlFIFdzY1Byb2JlUmVzICggRUlEX1ZFTkRPUl9TUEVDSUZJQyApIE9VSSggMHgwMCwgMHg1MCwgMHhGMiwgMHgwNCApCit7CisgICAgTUFOREFUT1JZVExWIFZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgxMCA9IHZlcnNpb24gMS4wLCAweDExCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPSB2ZXJzaW9uIDEuMSwgZXRjLgorICAgIE1BTkRBVE9SWVRMViBXUFNTdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgPSB1bmNvbmZpZ3VyZWQsIDIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmZpZ3VyZWQKKyAgICBPUFRJT05BTFRMViAgQVBTZXR1cExvY2tlZDsgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGluY2x1ZGVkIGlmIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgVFJVRQorICAgIE9QVElPTkFMVExWICBTZWxlY3RlZFJlZ2lzdHJhcjsgICAgICAgICAgICAgIC8vIEJPT0w6IGluZGljYXRlcyBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIGhhcyByZWNlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGl2YXRlZCBhIFJlZ2lzdHJhciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBhbiBFbnJvbGxlZS4KKyAgICBPUFRJT05BTFRMViAgRGV2aWNlUGFzc3dvcmRJRDsgICAgICAgICAgICAgICAvLyBEZXZpY2UgUGFzc3dvcmQgSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgdGhlIG1ldGhvZCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlkZW50aWZpZXMgdGhlIHNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc3dvcmQgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZCBSZWdpc3RyYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbmRzIHRvIHVzZS4KKyAgICBPUFRJT05BTFRMViAgU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOyAvLyBUaGlzIGF0dHJpYnV0ZSBjb250YWlucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25maWcgbWV0aG9kcyBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWdpc3RyYXIuCisgICAgTUFOREFUT1JZVExWIFJlc3BvbnNlVHlwZTsKKyAgICBNQU5EQVRPUllUTFYgVVVJRF9FOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmlxdWUgaWRlbnRpZmllciBvZiBBUAorICAgIE1BTkRBVE9SWVRMViBNYW51ZmFjdHVyZXI7CisgICAgTUFOREFUT1JZVExWIE1vZGVsTmFtZTsKKyAgICBNQU5EQVRPUllUTFYgTW9kZWxOdW1iZXI7CisgICAgTUFOREFUT1JZVExWIFNlcmlhbE51bWJlcjsKKyAgICBNQU5EQVRPUllUTFYgUHJpbWFyeURldmljZVR5cGU7CisgICAgTUFOREFUT1JZVExWIERldmljZU5hbWU7ICAgICAgICAgICAgICAgICAgICAgLy8gVXNlci1mcmllbmRseSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGRldmljZQorICAgIE1BTkRBVE9SWVRMViBDb25maWdNZXRob2RzOyAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBNZXRob2RzIGNvcnJlc3BvbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIG1ldGhvZHMgdGhlIEFQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydHMgYXMgYW4gRW5yb2xsZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYWRkaW5nIGV4dGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVnaXN0cmFycy4KKyAgICBPUFRJT05BTFRMViBSRkJhbmRzOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZXMgYWxsIFJGIGJhbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIG9uIHRoZSBBUC4gQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1YWwtYmFuZCBBUCBtdXN0IHByb3ZpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGF0dHJpYnV0ZS4KKyAgICAvLyBXU0MgMi4wCisgICAgT1BUSU9OQUxUTFYgIFZlbmRvckV4dGVuc2lvbjsgICAgICAgICAgICAgICAgLy8gVmVyc2lvbjIgYW5kIEF1dGhvcml6ZWRNQUNzCisKK30gLy8gV3NjUHJvYmVSZXMuCisKKy8vIFRoaXMgTVVMVElJRSBjb21iaW5lcyB0aGUgZmllbGRzIGZyb20gdGhlIFdTQyBJRXMgYXMgdGhleSBhcHBlYXIgaW4KKy8vIEJlYWNvbnMgKmFuZCogaW4gUHJvYmUgUmVzcG9uc2VzLCB3aXRoIHRoZSBkaWZmZXJlbmNlIHRoYXQgdGhleSdyZSBhbGwKKy8vIG9wdGlvbmFsLiAgSW4gb3VyIGRldmljZSBkcml2ZXJzLCB3ZSBjb21iaW5lIFByb2JlIFJlc3BvbnNlcyBhbmQgQmVhY29ucworLy8gaW50byBvbmUgbGlzdCwgYW5kIHBhcnNlIHRoZWlyIElFcyBsYXRlciAoYy5mLiBmcmFtZSBCZWFjb25JRXMpLiAgQmVjYXVzZQorLy8gdGhlIFdTQyBJRSBkaWZmZXJzIGluIHRob3NlIHR3byBmcmFtZXMsIHdlJ2Qgb2Z0ZW4gc2VlIHdhcm5pbmcgbWVzc2FnZXMKKy8vIGFib3V0IGVpdGhlciB1bmV4cGVjdGVkIGZpZWxkcyBzaG93aW5nIHVwIChpZiB3ZSB0aG91Z2h0IHdlIHdlcmUgcGFyc2luZyBhCisvLyBCZWFjb24sIGFuZCB3ZSBpbiBmYWN0IGhhZCBkYXRhIGZyb20gYSBQcm9iZSBSZXNwb25zZSkgb3IgbWFuZGF0b3J5IGZpZWxkcworLy8gbWlzc2luZyAoaWYgd2UgdGhvdWdodCB3ZSB3ZXJlIHBhcnNpbmcgYSBQcm9iZSBSZXNwb25zZSwgYW5kIGluIGZhY3QgaGFkCisvLyBkYXRhIGZyb20gYSBCZWFjb24pLgorCisvLyBJIGNyZWF0ZWQgdGhpcyBNVUxUSUlFIHRvIHN0dWZmIGludG8gdGhlIEJlYWNvbklFcyBmcmFtZXMgdG8gYXZvaWQgdGhpcy4KKy8vIEl0J3MgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiB1bnBhY2sgb25seSwgYW5kIHRvIGRvIHNvIGluIGEgdmVyeSBmb3JnaXZpbmcKKy8vIHdheS4KKworTVVMVElJRSBXc2NCZWFjb25Qcm9iZVJlcyAoIEVJRF9WRU5ET1JfU1BFQ0lGSUMgKSBPVUkoIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDQgKQoreworICAgIE9QVElPTkFMVExWIFZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgxMCA9IHZlcnNpb24gMS4wLCAweDExCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPSB2ZXJzaW9uIDEuMSwgZXRjLgorICAgIE9QVElPTkFMVExWIFdQU1N0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgLy8gMSA9IHVuY29uZmlndXJlZCwgMiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlndXJlZAorICAgIE9QVElPTkFMVExWICBBUFNldHVwTG9ja2VkOyAgICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgaW5jbHVkZWQgaWYgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBUUlVFCisgICAgT1BUSU9OQUxUTFYgIFNlbGVjdGVkUmVnaXN0cmFyOyAgICAgICAgICAgICAgLy8gQk9PTDogaW5kaWNhdGVzIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXIgaGFzIHJlY2VudGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZhdGVkIGEgUmVnaXN0cmFyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGFuIEVucm9sbGVlLgorICAgIE9QVElPTkFMVExWICBEZXZpY2VQYXNzd29yZElEOyAgICAgICAgICAgICAgIC8vIERldmljZSBQYXNzd29yZCBJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlcyB0aGUgbWV0aG9kIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWRlbnRpZmllcyB0aGUgc3BlY2lmaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzd29yZCB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkIFJlZ2lzdHJhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVuZHMgdG8gdXNlLgorICAgIE9QVElPTkFMVExWICBTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHM7IC8vIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbmZpZyBtZXRob2RzIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdHJhci4KKyAgICBPUFRJT05BTFRMViBSZXNwb25zZVR5cGU7CisgICAgT1BUSU9OQUxUTFYgVVVJRF9FOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmlxdWUgaWRlbnRpZmllciBvZiBBUAorICAgIE9QVElPTkFMVExWIE1hbnVmYWN0dXJlcjsKKyAgICBPUFRJT05BTFRMViBNb2RlbE5hbWU7CisgICAgT1BUSU9OQUxUTFYgTW9kZWxOdW1iZXI7CisgICAgT1BUSU9OQUxUTFYgU2VyaWFsTnVtYmVyOworICAgIE9QVElPTkFMVExWIFByaW1hcnlEZXZpY2VUeXBlOworICAgIE9QVElPTkFMVExWIERldmljZU5hbWU7ICAgICAgICAgICAgICAgICAgICAgLy8gVXNlci1mcmllbmRseSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGRldmljZQorICAgIE9QVElPTkFMVExWIENvbmZpZ01ldGhvZHM7ICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIE1ldGhvZHMgY29ycmVzcG9uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgbWV0aG9kcyB0aGUgQVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0cyBhcyBhbiBFbnJvbGxlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhZGRpbmcgZXh0ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWdpc3RyYXJzLgorICAgIE9QVElPTkFMVExWIFJGQmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGljYXRlcyBhbGwgUkYgYmFuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUgb24gdGhlIEFQLiBBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVhbC1iYW5kIEFQIG11c3QgcHJvdmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYXR0cmlidXRlLgorICAgIC8vIFdTQyAyLjAKKyAgICBPUFRJT05BTFRMViAgVmVuZG9yRXh0ZW5zaW9uOyAgICAgICAgICAgICAgICAvLyBWZXJzaW9uMiBhbmQgQXV0aG9yaXplZE1BQ3MKKworfSAvLyBXc2NQcm9iZVJlcy4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMVElJRXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTVVMVElJRSBQMlBCZWFjb24gKCBFSURfVkVORE9SX1NQRUNJRklDICkgT1VJKCAweDUwLCAweDZGLCAweDlBLCAweDA5ICkKK3sKKyAgICBNQU5EQVRPUllUTFYgUDJQQ2FwYWJpbGl0eTsgICAgICAgICAgICAgICAgICAvLyBDb250YWlucyBQMlAgRGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIFAyUCBHcm91cCBDYXBhYmlsaXR5CisgICAgTUFOREFUT1JZVExWIFAyUERldmljZUlkOyAgICAgICAgICAgICAgICAgICAgLy8gQ29udGFpbnMgUDJQIERldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZHJlc3MKKyAgICBPUFRJT05BTFRMViAgTm90aWNlT2ZBYnNlbmNlOyAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZXMgTm90aWNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWJzZW5jZSBzY2hlZHVsZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDVCBXaW5kb3cKKworfSAvLyBFbmQgUDJQQmVhY29uCisKKworTVVMVElJRSBQMlBBc3NvY1JlcSAoIEVJRF9WRU5ET1JfU1BFQ0lGSUMgKSBPVUkoIDB4NTAsIDB4NkYsIDB4OUEsIDB4MDkgKQoreworICAgIE1BTkRBVE9SWVRMViBQMlBDYXBhYmlsaXR5OyAgICAgICAgICAgICAgICAgIC8vIENvbnRhaW5zIFAyUCBEZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgUDJQIEdyb3VwIENhcGFiaWxpdHkKKyAgICBPUFRJT05BTFRMViAgRXh0ZW5kZWRMaXN0ZW5UaW1pbmc7CisgICAgTUFOREFUT1JZVExWIFAyUERldmljZUluZm87CisKK30gLy8gRW5kIFAyUEFzc29jUmVxCisKKworTVVMVElJRSBQMlBBc3NvY1JlcyAoIEVJRF9WRU5ET1JfU1BFQ0lGSUMgKSBPVUkoIDB4NTAsIDB4NkYsIDB4OUEsIDB4MDkgKQoreworICAgIE1BTkRBVE9SWVRMViBQMlBTdGF0dXM7CisgICAgT1BUSU9OQUxUTFYgIEV4dGVuZGVkTGlzdGVuVGltaW5nOworCit9IC8vIEVuZCBQMlBBc3NvY1JlcworCisKK01VTFRJSUUgUDJQUHJvYmVSZXEgKCBFSURfVkVORE9SX1NQRUNJRklDICkgT1VJKCAweDUwLCAweDZGLCAweDlBLCAweDA5ICkKK3sKKyAgICBNQU5EQVRPUllUTFYgUDJQQ2FwYWJpbGl0eTsKKyAgICBPUFRJT05BTFRMViAgUDJQRGV2aWNlSWQ7CisgICAgTUFOREFUT1JZVExWIExpc3RlbkNoYW5uZWw7CisgICAgT1BUSU9OQUxUTFYgIEV4dGVuZGVkTGlzdGVuVGltaW5nOworICAgIE9QVElPTkFMVExWICBPcGVyYXRpbmdDaGFubmVsOworfSAvLyBFbmQgUDJQUHJvYmVSZXEKKworCitNVUxUSUlFIFAyUFByb2JlUmVzICggRUlEX1ZFTkRPUl9TUEVDSUZJQyApIE9VSSggMHg1MCwgMHg2RiwgMHg5QSwgMHgwOSApCit7CisgICAgTUFOREFUT1JZVExWIFAyUENhcGFiaWxpdHk7CisgICAgT1BUSU9OQUxUTFYgIEV4dGVuZGVkTGlzdGVuVGltaW5nOworICAgIE9QVElPTkFMVExWICBOb3RpY2VPZkFic2VuY2U7CisgICAgTUFOREFUT1JZVExWIFAyUERldmljZUluZm87CisgICAgT1BUSU9OQUxUTFYgIFAyUEdyb3VwSW5mbzsKKworfSAvLyBFbmQgUDJQUHJvYmVSZXMKKworCitNVUxUSUlFIFAyUEJlYWNvblByb2JlUmVzICggRUlEX1ZFTkRPUl9TUEVDSUZJQyApIE9VSSggMHg1MCwgMHg2RiwgMHg5QSwgMHgwOSApCit7CisgICAgT1BUSU9OQUxUTFYgUDJQQ2FwYWJpbGl0eTsKKyAgICBPUFRJT05BTFRMViBQMlBEZXZpY2VJZDsKKyAgICBPUFRJT05BTFRMViBFeHRlbmRlZExpc3RlblRpbWluZzsKKyAgICBPUFRJT05BTFRMViBOb3RpY2VPZkFic2VuY2U7CisgICAgT1BUSU9OQUxUTFYgUDJQRGV2aWNlSW5mbzsKKyAgICBPUFRJT05BTFRMViBQMlBHcm91cEluZm87CisKK30gLy8gRW5kIFAyUEJlYWNvblByb2JlUmVzCisKKworTVVMVElJRSBQMlBEZUF1dGggKCBFSURfVkVORE9SX1NQRUNJRklDICkgT1VJKCAweDUwLCAweDZGLCAweDlBLCAweDA5ICkKK3sKKyAgIE1BTkRBVE9SWVRMViBNaW5vclJlYXNvbkNvZGU7Cit9CisKKworTVVMVElJRSBQMlBEaXNBc3NvYyAoIEVJRF9WRU5ET1JfU1BFQ0lGSUMgKSBPVUkoIDB4NTAsIDB4NkYsIDB4OUEsIDB4MDkgKQoreworICAgTUFOREFUT1JZVExWIE1pbm9yUmVhc29uQ29kZTsKK30KKworSUUgdmVuZG9yMl9pZSAoRUlEX1ZFTkRPUl9TUEVDSUZJQykgT1VJICgweDAwLCAweDkwLCAweDRjKQoreworICAgdHlwZSwgMTsKKyAgIHN1Yl90eXBlLCAxOworICAgT1BUSUUgSUUgVkhUQ2FwczsKKyAgIE9QVElFIElFIFZIVE9wZXJhdGlvbjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZyYW1lcworCitGUkFNRSBCZWFjb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDLmYuIFNlYy4gNy4yLjMuMQoreworICAgIEZGICAgICBUaW1lU3RhbXA7CisgICAgRkYgICAgIEJlYWNvbkludGVydmFsOworICAgIEZGICAgICBDYXBhYmlsaXRpZXM7CisgICAgTUFORElFIFNTSUQ7CisgICAgTUFORElFIFN1cHBSYXRlczsKKyAgICBPUFRJRSAgRkhQYXJhbVNldDsKKyAgICBPUFRJRSAgRFNQYXJhbXM7CisgICAgT1BUSUUgIENGUGFyYW1zOworICAgIE9QVElFICBJQlNTUGFyYW1zOworICAgIE9QVElFICBUSU07CisgICAgT1BUSUUgIENvdW50cnk7CisgICAgT1BUSUUgIEZIUGFyYW1zOworICAgIE9QVElFICBGSFBhdHRUYWJsZTsKKyAgICBPUFRJRSAgUG93ZXJDb25zdHJhaW50czsKKyAgICBPUFRJRSAgQ2hhblN3aXRjaEFubjsKKyAgICBPUFRJRSAgZXh0X2NoYW5fc3dpdGNoX2FubjsKKyAgICBPUFRJRSAgUXVpZXQ7CisgICAgT1BUSUUgIFRQQ1JlcG9ydDsKKyAgICBPUFRJRSAgRVJQSW5mbzsKKyAgICBPUFRJRSAgRXh0U3VwcFJhdGVzOworICAgIE9QVElFICBSU047CisgICAgT1BUSUUgIFFCU1NMb2FkOworICAgIE9QVElFICBFRENBUGFyYW1TZXQ7CisgICAgT1BUSUUgIFFPU0NhcHNBcDsKKyAgICBPUFRJRSAgQVBDaGFubmVsUmVwb3J0OworICAgIE9QVElFICBSUk1FbmFibGVkQ2FwOworICAgIE9QVElFICBNb2JpbGl0eURvbWFpbjsKKyAgICBPUFRJRSAgV1BBOworICAgIE9QVElFICBIVENhcHM7CisgICAgT1BUSUUgIEhUSW5mbzsKKyAgICBPUFRJRSAgc2VjX2NoYW5fb2Zmc2V0X2VsZTsKKyAgICBPUFRJRSAgV01NSW5mb0FwOworICAgIE9QVElFICBXTU1QYXJhbXM7CisgICAgT1BUSUUgIFdNTUNhcHM7CisgICAgT1BUSUUgIFdBUEk7CisgICAgT1BUSUUgIEVTRVJhZE1nbXRDYXA7CisgICAgT1BUSUUgIEVTRVRyYWZTdHJtTWV0OworICAgIE9QVElFICBFU0VUeG1pdFBvd2VyOworCisgICAgT1BUSUUgIFdzY0JlYWNvbjsKKyAgICBPUFRJRSAgUDJQQmVhY29uOworICAgIE9QVElFICBWSFRDYXBzOworICAgIE9QVElFICBWSFRPcGVyYXRpb247CisgICAgT1BUSUUgIFZIVEV4dEJzc0xvYWQ7CisgICAgT1BUSUUgIEV4dENhcDsKKyAgICBPUFRJRSAgT3BlcmF0aW5nTW9kZTsKKyAgICBPUFRJRSAgV2lkZXJCV0NoYW5Td2l0Y2hBbm47CisgICAgT1BUSUUgIE9CU1NTY2FuUGFyYW1ldGVyczsKKyAgICBPUFRJRSAgVmVuZG9yMUlFOworICAgIE9QVElFICB2ZW5kb3IyX2llOworICAgIE9QVElFICBWZW5kb3IzSUU7CisgICAgT1BUSUUgIENoYW5uZWxTd2l0Y2hXcmFwcGVyOworICAgIE9QVElFICBRQ29tVmVuZG9ySUU7CisgICAgT1BUSUUgIEVTRVZlcnNpb247Cit9IC8vIEVuZCBmcmFtZSBCZWFjb24uCisKKy8vIE9rLCBoZXJlJ3MgIHRoZSBzdG9yeSBvbiAgQmVhY29uMSAmIEJlYWNvbjIuICAgV2UgcHJlc3VtYWJseSBiZWFjb24gIGEgbG90CisvLyBtb3JlIHRoYW4gd2UgIGNoYW5nZSBjb25maWd1cmF0aW9uLiAgU28gaXQgbWFrZXMgc2Vuc2UgIHRvIGtlZXAgdGhlIGJlYWNvbgorLy8gd2UgcGxhbiB0byBzZW5kIG5leHQgaW4gIHNlcmlhbGl6ZWQgZm9ybWF0LiAgV2UgZG8gdGhpcyBpbiBzdHJ1Y3Qgc2NoTWlzYy4KKy8vIFdoZW5ldmVyIG91ciAgY29uZmlnIGNoYW5nZXMgaW4gIGEgd2F5IHRoYXQgIHdvdWxkIGFmZmVjdCBvdXIgIGJlYWNvbnMsIHdlCisvLyBqdXN0ICB1cGRhdGUgIG91ciBpbnRlcm5hbCAgZGF0YXN0cnVjdHVyZXMgICYgIHJlLWdlbmVyYXRlIHRoZSAgc2VyaWFsaXplZAorLy8gYmVhY29uLgorCisvLyBUaGUgcHJvYmxlbSAgaXMgdGhhdCB0aGVyZSAgYXJlICpzb21lKiBmaWVsZHMgIHRoYXQgbmVlZCB0byBiZSAgdXBkYXRlZCBhdAorLy8gc2VuZCB0aW1lLCAgc3BlY2lmaWNhbGx5IHRoZSBDRiBQYXJhbSAgU2V0ICYgdGhlICBUSU0uICBTbywgd2hhdCB3ZSAgZG8gaXMKKy8vIHRoaXM6IHdoZW5ldmVyICBvdXIgY29uZmlnIGNoYW5nZXMsICBjYWxsIHNjaFNldEZpeGVkQmVhY29uRmllbGRzLiAgVGhlcmUsCisvLyB3ZSBzZXJpYWxpemUgdGhlIGZvbGxvd2luZyAgQmVhY29uIGZpZWxkcyBpbnRvIGdTY2hCZWFjb25GcmFtZUJlZ2luIChhZnRlcgorLy8gdGhlIHBvd2VyIHRlbXBsYXRlICYgTUFDIGhlYWRlcik6IFRpbWVTdGFtcCwgQmVhY29uSW50ZXJ2YWwsIENhcGFiaWxpdGllcywKKy8vIFNTSUQsIFN1cHBSYXRlcywgRFNQYXJhbXMsICYgSUJTU1BhcmFtcy4gIEl0IHNldHMgZ1NjaEJlYWNvbk9mZnNldEJlZ2luIHRvCisvLyB0aGUgbGVuZ3RoIG9mIHRoaXMgYnVmZmVyIChpbmNsLiBwb3dlciB0ZW1wbGF0ZSAmIE1BQyBoZWFkZXIpLgorCisvLyBOZXh0LCBpdCBzZXJpYWxpemVzIHRoZSBmb2xsb3dpbmcgZmllbGRzIGludG8gZ1NjaEJlYWNvbkZyYW1lRW5kOiBDb3VudHJ5LAorLy8gRURDQVBhcmFtU2V0LCAgIFBvd2VyQ29uc3RyYWludHMsICAgVFBDUmVwb3J0LCAgQ2hhbm5lbFN3aXRjaEFubiwgICBRdWlldCwKKy8vIEVSUEluZm8sICAgICAgSFRDYXBzLCAgICAgIEhUSW5mbywgICAgICBFeHRTdXBwUmF0ZXMsIFdQQSwgUlNOLCAgV01NSW5mbywKKy8vIFdNTVBhcmFtcywgV01NQ2Fwcy4KKy8vIFRoZSBsZW5ndGggb2YgKnRoaXMqIGJ1ZmZlciBpcyBrZXB0IGluIGdTY2hCZWFjb25PZmZzZXRFbmQuCisKKy8vIFRoZW4sIGluICdzY2hCZWFjb25JbnRlcnJ1cHRIYW5kbGVyJywgIHdlIHdyaXRlIENGUGFyYW1zICYgVElNICBhdCB0aGUgZW5kCisvLyBvZiBnU2NoQmVhY29uRnJhbWVCZWdpbiwga2VlcGluZyB0cmFjayBvZiB0aGUgKG5ldykgc2l6ZSBvZiB0aGlzIGJ1ZmZlciBpbgorLy8gdGhlIGxvY2FsICdiZWFjb25TaXplJy4KKworLy8gQWZ0ZXIgIHRoYXQsICB3ZSAgY2FsbCAgJ3NwZWNpYWxCZWFjb25Qcm9jZXNzaW5nJy4gICBOb3RlICB0aGF0ICB0aGlzICBtYXkKKy8vIGFjdHVhbGx5IGNhbGwgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzIHJlcGVhdGVkbHkhICBUaGUgIGNvbW1lbnRzIHNheSB0aGV5CisvLyB0cnkgdG8gYXZvaWQgdGhpcywgYnV0Li4uCisKKy8vIEZpbmFsbHksIHdlIGNhbGwgd3JpdGVCZWFjb25Ub1RGUCwgd2hlcmUgdGhlIGZpcnN0IHRoaW5nIHdlIGRvIGlzIGNvcHkgdGhlCisvLyBnU2NoQmVhY29uRnJhbWVFbmQgYnVmZmVyIGFmdGVyIHRoZSBlbmQgb2YgZ1NjaEJlYWNvbkZyYW1lQmVnaW4uCisKK0ZSQU1FIEJlYWNvbjEKK3sKKyAgICBGRiAgICAgVGltZVN0YW1wOworICAgIEZGICAgICBCZWFjb25JbnRlcnZhbDsKKyAgICBGRiAgICAgQ2FwYWJpbGl0aWVzOworICAgIE1BTkRJRSBTU0lEOworICAgIE1BTkRJRSBTdXBwUmF0ZXM7CisgICAgT1BUSUUgIERTUGFyYW1zOworICAgIE9QVElFICBJQlNTUGFyYW1zOworfQorCitGUkFNRSBCZWFjb24yCit7CisgICAgT1BUSUUgIENvdW50cnk7CisgICAgT1BUSUUgIFBvd2VyQ29uc3RyYWludHM7CisgICAgT1BUSUUgIENoYW5Td2l0Y2hBbm47CisgICAgT1BUSUUgIGV4dF9jaGFuX3N3aXRjaF9hbm47CisgICAgT1BUSUUgIFF1aWV0OworICAgIE9QVElFICBUUENSZXBvcnQ7CisgICAgT1BUSUUgIEVSUEluZm87CisgICAgT1BUSUUgIEV4dFN1cHBSYXRlczsKKyAgICBPUFRJRSAgUlNOT3BhcXVlOworICAgIE9QVElFICBFRENBUGFyYW1TZXQ7CisgICAgT1BUSUUgIEFQQ2hhbm5lbFJlcG9ydDsKKyAgICBPUFRJRSAgUlJNRW5hYmxlZENhcDsKKyAgICBPUFRJRSAgTW9iaWxpdHlEb21haW47CisgICAgT1BUSUUgIFdQQTsKKyAgICBPUFRJRSAgSFRDYXBzOworICAgIE9QVElFICBIVEluZm87CisgICAgT1BUSUUgIHNlY19jaGFuX29mZnNldF9lbGU7CisgICAgT1BUSUUgIFdNTUluZm9BcDsKKyAgICBPUFRJRSAgV01NUGFyYW1zOworICAgIE9QVElFICBXTU1DYXBzOworICAgIE9QVElFICBXc2NCZWFjb247CisgICAgT1BUSUUgIFdBUEk7CisgICAgT1BUSUUgIEVTRVJhZE1nbXRDYXA7CisgICAgT1BUSUUgIEVTRVRyYWZTdHJtTWV0OworICAgIE9QVElFICBFU0VUeG1pdFBvd2VyOworICAgIE9QVElFICBQMlBCZWFjb247CisgICAgT1BUSUUgIFZIVENhcHM7CisgICAgT1BUSUUgIFZIVE9wZXJhdGlvbjsKKyAgICBPUFRJRSAgVkhURXh0QnNzTG9hZDsKKyAgICBPUFRJRSAgRXh0Q2FwOworICAgIE9QVElFICBPcGVyYXRpbmdNb2RlOworICAgIE9QVElFICBXaWRlckJXQ2hhblN3aXRjaEFubjsKKyAgICBPUFRJRSAgT0JTU1NjYW5QYXJhbWV0ZXJzOworICAgIE9QVElFICBWZW5kb3IxSUU7CisgICAgT1BUSUUgIHZlbmRvcjJfaWU7CisgICAgT1BUSUUgIFZlbmRvcjNJRTsKKyAgICBPUFRJRSAgQ2hhbm5lbFN3aXRjaFdyYXBwZXI7CisgICAgT1BUSUUgIFFDb21WZW5kb3JJRTsKKyAgICBPUFRJRSAgRVNFVmVyc2lvbjsKK30KKworLy8gVGhpcyBmcmFtZSBpcyBqdXN0IEJlYWNvbiB3aXRoIGl0cyBGaXhlZCBGaWVsZHMgc3RyaXBwZWQgb3V0LiAgSXQncyBoYW5keQorLy8gZm9yIHVzZSB3aXRoIHN0cnVjdCAndFNpckJzc0Rlc2NyaXB0aW9uJywgd2hpY2ggaGFzIG1lbWJlcnMgY29ycmVzcG9uZGluZworLy8gdG8gc29tZSBmaXhlZCBmaWVsZHMsIGJ1dCBrZWVwcyBpdHMgSUVzIGluIHVuLXBhcnNlZCBmb3JtYXQuCisKKy8vIE5vdGUgdGhhdCBpdCBhbHNvIGluY2x1ZGVzIHRoZSBJRSAnV3NjQmVhY29uUHJvYmVSZXMnLgorCitGUkFNRSBCZWFjb25JRXMKK3sKKworICAgIE1BTkRJRSBTU0lEOworICAgIE1BTkRJRSBTdXBwUmF0ZXM7CisgICAgT1BUSUUgIEZIUGFyYW1TZXQ7CisgICAgT1BUSUUgIERTUGFyYW1zOworICAgIE9QVElFICBDRlBhcmFtczsKKyAgICBPUFRJRSAgSUJTU1BhcmFtczsKKyAgICBPUFRJRSAgVElNOworICAgIE9QVElFICBDb3VudHJ5OworICAgIE9QVElFICBGSFBhcmFtczsKKyAgICBPUFRJRSAgRkhQYXR0VGFibGU7CisgICAgT1BUSUUgIFBvd2VyQ29uc3RyYWludHM7CisgICAgT1BUSUUgIENoYW5Td2l0Y2hBbm47CisgICAgT1BUSUUgIGV4dF9jaGFuX3N3aXRjaF9hbm47CisgICAgT1BUSUUgIFF1aWV0OworICAgIE9QVElFICBUUENSZXBvcnQ7CisgICAgT1BUSUUgIEVSUEluZm87CisgICAgT1BUSUUgIEV4dFN1cHBSYXRlczsKKyAgICBPUFRJRSAgUlNOOworICAgIE9QVElFICBRQlNTTG9hZDsKKyAgICBPUFRJRSAgRURDQVBhcmFtU2V0OworICAgIE9QVElFICBRT1NDYXBzQXA7CisgICAgT1BUSUUgIEFQQ2hhbm5lbFJlcG9ydDsKKyAgICBPUFRJRSAgUlJNRW5hYmxlZENhcDsKKyAgICBPUFRJRSAgTW9iaWxpdHlEb21haW47CisgICAgT1BUSUUgIFdQQTsKKyAgICBPUFRJRSAgSFRDYXBzOworICAgIE9QVElFICBIVEluZm87CisgICAgT1BUSUUgIHNlY19jaGFuX29mZnNldF9lbGU7CisgICAgT1BUSUUgIFdNTUluZm9BcDsKKyAgICBPUFRJRSAgV01NUGFyYW1zOworICAgIE9QVElFICBXTU1DYXBzOworICAgIE9QVElFICBXQVBJOworICAgIE9QVElFICBFU0VWZXJzaW9uOworICAgIE9QVElFICBFU0VSYWRNZ210Q2FwOworICAgIE9QVElFICBFU0VUcmFmU3RybU1ldDsKKyAgICBPUFRJRSAgRVNFVHhtaXRQb3dlcjsKKworICAgIE9QVElFICBXc2NCZWFjb25Qcm9iZVJlczsKKyAgICBPUFRJRSAgUDJQQmVhY29uUHJvYmVSZXM7CisgICAgT1BUSUUgIFZIVENhcHM7CisgICAgT1BUSUUgIFZIVE9wZXJhdGlvbjsKKyAgICBPUFRJRSAgVkhURXh0QnNzTG9hZDsKKyAgICBPUFRJRSAgRXh0Q2FwOworICAgIE9QVElFICBPcGVyYXRpbmdNb2RlOworICAgIE9QVElFICBXaWRlckJXQ2hhblN3aXRjaEFubjsKKyAgICBPUFRJRSAgT0JTU1NjYW5QYXJhbWV0ZXJzOworICAgIE9QVElFICBWZW5kb3IxSUU7CisgICAgT1BUSUUgIHZlbmRvcjJfaWU7CisgICAgT1BUSUUgIFZlbmRvcjNJRTsKKyAgICBPUFRJRSAgQ2hhbm5lbFN3aXRjaFdyYXBwZXI7CisgICAgT1BUSUUgIFFDb21WZW5kb3JJRTsKK30gLy8gRW5kIGZyYW1lIEJlYWNvbklFcy4KKworRlJBTUUgRGlzYXNzb2NpYXRpb24gICAgICAgICAgICAgICAgICAgICAgLy8gNy4zLjMuMworeworICAgIEZGICAgIFJlYXNvbjsKKyAgICBPUFRJRSBQMlBEaXNBc3NvYzsKK30KKworRlJBTUUgQXNzb2NSZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gNy4yLjMuNAoreworICAgIEZGICAgICBDYXBhYmlsaXRpZXM7CisgICAgRkYgICAgIExpc3RlbkludGVydmFsOworICAgIE1BTkRJRSBTU0lEOworICAgIE1BTkRJRSBTdXBwUmF0ZXM7CisgICAgT1BUSUUgIEV4dFN1cHBSYXRlczsKKyAgICBPUFRJRSAgUG93ZXJDYXBzOworICAgIE9QVElFICBTdXBwQ2hhbm5lbHM7CisgICAgT1BUSUUgIFJTTk9wYXF1ZTsKKyAgICBPUFRJRSAgUU9TQ2Fwc1N0YXRpb247CisgICAgT1BUSUUgIFJSTUVuYWJsZWRDYXA7CisgICAgT1BUSUUgIE1vYmlsaXR5RG9tYWluOworICAgIE9QVElFICBXUEFPcGFxdWU7CisgICAgT1BUSUUgIEhUQ2FwczsKKyAgICBPUFRJRSAgV01NQ2FwczsKKyAgICBPUFRJRSAgV01NSW5mb1N0YXRpb247CisgICAgT1BUSUUgIFdzY0lFT3BhcXVlOworICAgIE9QVElFICBXQVBJT3BhcXVlOworICAgIE9QVElFICBXQVBJOworICAgIE9QVElFICBFU0VSYWRNZ210Q2FwOworICAgIE9QVElFICBFU0VWZXJzaW9uOworICAgIE9QVElFICBQMlBJRU9wYXF1ZTsKKyAgICBPUFRJRSAgV0ZESUVPcGFxdWU7CisgICAgT1BUSUUgIFZIVENhcHM7CisgICAgT1BUSUUgIEV4dENhcDsKKyAgICBPUFRJRSAgT3BlcmF0aW5nTW9kZTsKKyAgICBPUFRJRSAgUW9zTWFwU2V0OworICAgIE9QVElFICB2ZW5kb3IyX2llOworfSAvLyBFbmQgZnJhbWUgQXNzb2NSZXF1ZXN0LgorCitGUkFNRSBBc3NvY1Jlc3BvbnNlICAgICAgICAgICAgICAgICAgICAgICAvLyA3LjIuMy41Cit7CisgICAgRkYgICAgIENhcGFiaWxpdGllczsKKyAgICBGRiAgICAgU3RhdHVzOworICAgIEZGICAgICBBSUQ7CisgICAgTUFORElFIFN1cHBSYXRlczsKKyAgICBPUFRJRSAgRXh0U3VwcFJhdGVzOworICAgIE9QVElFICBFRENBUGFyYW1TZXQ7CisgICAgT1BUSUUgIFJDUElJRTsKKyAgICBPUFRJRSAgUlNOSUlFOworICAgIE9QVElFICBSUk1FbmFibGVkQ2FwOworICAgIE9QVElFICBNb2JpbGl0eURvbWFpbjsKKyAgICBPUFRJRSAgRlRJbmZvOworICAgIE9QVElFICBSSUNEYXRhRGVzY1syXTsKKyAgICBPUFRJRSAgV1BBOworICAgIE9QVElFICBUaW1lb3V0SW50ZXJ2YWw7CisgICAgT1BUSUUgIEhUQ2FwczsKKyAgICBPUFRJRSAgSFRJbmZvOworICAgIE9QVElFICBXTU1QYXJhbXM7CisgICAgT1BUSUUgIFdNTUNhcHM7CisgICAgT1BUSUUgIEVTRVJhZE1nbXRDYXA7CisgICAgT1BUSUUgIEVTRVRyYWZTdHJtTWV0OworICAgIE9QVElFICBFU0VUeG1pdFBvd2VyOworICAgIE9QVElFICBXTU1UU1BFQ1swLi40XTsKKyAgICBPUFRJRSAgV3NjQXNzb2NSZXM7CisgICAgT1BUSUUgIFAyUEFzc29jUmVzOworICAgIE9QVElFICBWSFRDYXBzOworICAgIE9QVElFICBWSFRPcGVyYXRpb247CisgICAgT1BUSUUgIEV4dENhcDsKKyAgICBPUFRJRSAgT0JTU1NjYW5QYXJhbWV0ZXJzOworICAgIE9QVElFICBRb3NNYXBTZXQ7CisgICAgT1BUSUUgIHZlbmRvcjJfaWU7Cit9IC8vIEVuZCBmcmFtZSBBc3NvY1Jlc3BvbnNlLgorCitGUkFNRSBSZUFzc29jUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAvLyA3LjIuMy42Cit7CisgICAgRkYgICAgIENhcGFiaWxpdGllczsKKyAgICBGRiAgICAgTGlzdGVuSW50ZXJ2YWw7CisgICAgRkYgICAgIEN1cnJlbnRBUEFkZHJlc3M7CisgICAgTUFORElFIFNTSUQ7CisgICAgTUFORElFIFN1cHBSYXRlczsKKyAgICBPUFRJRSAgRXh0U3VwcFJhdGVzOworICAgIE9QVElFICBQb3dlckNhcHM7CisgICAgT1BUSUUgIFN1cHBDaGFubmVsczsKKyAgICBPUFRJRSAgUlNOT3BhcXVlOworICAgIE9QVElFICBRT1NDYXBzU3RhdGlvbjsKKyAgICBPUFRJRSAgUlJNRW5hYmxlZENhcDsKKyAgICBPUFRJRSAgTW9iaWxpdHlEb21haW47CisgICAgT1BUSUUgIEZUSW5mbzsKKyAgICBPUFRJRSAgUklDRGF0YURlc2NbMl07CisgICAgT1BUSUUgIFdQQU9wYXF1ZTsKKyAgICBPUFRJRSAgSFRDYXBzOworICAgIE9QVElFICBXTU1DYXBzOworICAgIE9QVElFICBXTU1JbmZvU3RhdGlvbjsKKyAgICBPUFRJRSAgV3NjSUVPcGFxdWU7CisgICAgT1BUSUUgIFdBUElPcGFxdWU7CisgICAgT1BUSUUgIFdBUEk7CisgICAgT1BUSUUgIEVTRVJhZE1nbXRDYXA7CisgICAgT1BUSUUgIEVTRVZlcnNpb247CisgICAgT1BUSUUgIEVTRUNja21PcGFxdWU7CisgICAgT1BUSUUgIFdNTVRTUEVDWzAuLjRdOworICAgIE9QVElFICBFU0VUcmFmU3RybVJhdGVTZXQ7CisgICAgT1BUSUUgIFAyUElFT3BhcXVlOworICAgIE9QVElFICBXRkRJRU9wYXF1ZTsKKyAgICBPUFRJRSAgVkhUQ2FwczsKKyAgICBPUFRJRSAgRXh0Q2FwOworICAgIE9QVElFICBPcGVyYXRpbmdNb2RlOworICAgIE9QVElFICBRb3NNYXBTZXQ7CisgICAgT1BUSUUgIHZlbmRvcjJfaWU7Cit9IC8vIEVuZCBmcmFtZSBSZUFzc29jUmVxdWVzdC4KKworRlJBTUUgUmVBc3NvY1Jlc3BvbnNlICAgICAgICAgICAgICAgICAgICAgLy8gNy4yLjMuNworeworICAgIEZGICAgICBDYXBhYmlsaXRpZXM7CisgICAgRkYgICAgIFN0YXR1czsKKyAgICBGRiAgICAgQUlEOworICAgIE1BTkRJRSBTdXBwUmF0ZXM7CisgICAgT1BUSUUgIEV4dFN1cHBSYXRlczsKKyAgICBPUFRJRSAgRURDQVBhcmFtU2V0OworICAgIE9QVElFICBSQ1BJSUU7CisgICAgT1BUSUUgIFJTTklJRTsKKyAgICBPUFRJRSAgUlJNRW5hYmxlZENhcDsKKyAgICBPUFRJRSAgUlNOT3BhcXVlOworICAgIE9QVElFICBNb2JpbGl0eURvbWFpbjsKKyAgICBPUFRJRSAgRlRJbmZvOworICAgIE9QVElFICBSSUNEYXRhRGVzY1syXTsKKyAgICBPUFRJRSAgV1BBOworICAgIE9QVElFICBUaW1lb3V0SW50ZXJ2YWw7CisgICAgT1BUSUUgIEhUQ2FwczsKKyAgICBPUFRJRSAgSFRJbmZvOworICAgIE9QVElFICBXTU1QYXJhbXM7CisgICAgT1BUSUUgIEVTRVJhZE1nbXRDYXA7CisgICAgT1BUSUUgIEVTRVRyYWZTdHJtTWV0OworICAgIE9QVElFICBFU0VUeG1pdFBvd2VyOworICAgIE9QVElFICBXTU1UU1BFQ1swLi40XTsKKyAgICBPUFRJRSAgRVNFVHJhZlN0cm1SYXRlU2V0OworICAgIE9QVElFICBXc2NSZWFzc29jUmVzOworICAgIE9QVElFICBQMlBBc3NvY1JlczsKKyAgICBPUFRJRSAgVkhUQ2FwczsKKyAgICBPUFRJRSAgVkhUT3BlcmF0aW9uOworICAgIE9QVElFICBFeHRDYXA7CisgICAgT1BUSUUgIE9CU1NTY2FuUGFyYW1ldGVyczsKKyAgICBPUFRJRSAgUW9zTWFwU2V0OworICAgIE9QVElFICB2ZW5kb3IyX2llOworfSAvLyBFbmQgZnJhbWUgUmVBc3NvY1Jlc3BvbnNlLgorCitGUkFNRSBQcm9iZVJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LjIuMy44Cit7CisgICAgTUFORElFIFNTSUQ7CisgICAgTUFORElFIFN1cHBSYXRlczsKKyAgICBPUFRJRSAgUmVxdWVzdGVkSW5mbzsKKyAgICBPUFRJRSAgRXh0U3VwcFJhdGVzOworICAgIE9QVElFICBEU1BhcmFtczsKKyAgICBPUFRJRSAgSFRDYXBzOworICAgIE9QVElFICBXc2NQcm9iZVJlcTsKKyAgICBPUFRJRSAgV0ZBVFBDOworICAgIE9QVElFICBQMlBQcm9iZVJlcTsKKyAgICBPUFRJRSAgVkhUQ2FwczsKKyAgICBPUFRJRSAgRXh0Q2FwOworfSAvLyBFbmQgZnJhbWUgUHJvYmVSZXF1ZXN0LgorCitGUkFNRSBQcm9iZVJlc3BvbnNlICAgICAgICAgICAgICAgICAgICAgICAvLyA3LjIuMy45Cit7CisgICAgRkYgICAgIFRpbWVTdGFtcDsKKyAgICBGRiAgICAgQmVhY29uSW50ZXJ2YWw7CisgICAgRkYgICAgIENhcGFiaWxpdGllczsKKyAgICBNQU5ESUUgU1NJRDsKKyAgICBNQU5ESUUgU3VwcFJhdGVzOworICAgIE9QVElFICBGSFBhcmFtU2V0OworICAgIE9QVElFICBEU1BhcmFtczsKKyAgICBPUFRJRSAgQ0ZQYXJhbXM7CisgICAgT1BUSUUgIElCU1NQYXJhbXM7CisgICAgT1BUSUUgIENvdW50cnk7CisgICAgT1BUSUUgIEZIUGFyYW1zOworICAgIE9QVElFICBGSFBhdHRUYWJsZTsKKyAgICBPUFRJRSAgUG93ZXJDb25zdHJhaW50czsKKyAgICBPUFRJRSAgQ2hhblN3aXRjaEFubjsKKyAgICBPUFRJRSAgZXh0X2NoYW5fc3dpdGNoX2FubjsKKyAgICBPUFRJRSAgUXVpZXQ7CisgICAgT1BUSUUgIFRQQ1JlcG9ydDsKKyAgICBPUFRJRSAgRVJQSW5mbzsKKyAgICBPUFRJRSAgRXh0U3VwcFJhdGVzOworICAgIE9QVElFICBSU05PcGFxdWU7CisgICAgT1BUSUUgIFFCU1NMb2FkOworICAgIE9QVElFICBFRENBUGFyYW1TZXQ7CisgICAgT1BUSUUgIFJSTUVuYWJsZWRDYXA7CisgICAgT1BUSUUgIEFQQ2hhbm5lbFJlcG9ydDsKKyAgICBPUFRJRSAgTW9iaWxpdHlEb21haW47CisgICAgT1BUSUUgIFdQQTsKKyAgICBPUFRJRSAgSFRDYXBzOworICAgIE9QVElFICBIVEluZm87CisgICAgT1BUSUUgIHNlY19jaGFuX29mZnNldF9lbGU7CisgICAgT1BUSUUgIFdNTUluZm9BcDsKKyAgICBPUFRJRSAgV01NUGFyYW1zOworICAgIE9QVElFICBXTU1DYXBzOworICAgIE9QVElFICBXQVBJOworICAgIE9QVElFICBFU0VSYWRNZ210Q2FwOworICAgIE9QVElFICBFU0VUcmFmU3RybU1ldDsKKyAgICBPUFRJRSAgRVNFVHhtaXRQb3dlcjsKKworICAgIE9QVElFICBXc2NQcm9iZVJlczsKKyAgICBPUFRJRSAgUDJQUHJvYmVSZXM7CisKKyAgICBPUFRJRSAgVkhUQ2FwczsKKyAgICBPUFRJRSAgVkhUT3BlcmF0aW9uOworICAgIE9QVElFICBWSFRFeHRCc3NMb2FkOworICAgIE9QVElFICBFeHRDYXA7CisgICAgT1BUSUUgIE9CU1NTY2FuUGFyYW1ldGVyczsKKyAgICBPUFRJRSAgVmVuZG9yMUlFOworICAgIE9QVElFICB2ZW5kb3IyX2llOworICAgIE9QVElFICBWZW5kb3IzSUU7CisgICAgT1BUSUUgIENoYW5uZWxTd2l0Y2hXcmFwcGVyOworICAgIE9QVElFICBRQ29tVmVuZG9ySUU7CisgICAgT1BUSUUgIEVTRVZlcnNpb247Cit9IC8vIEVuZCBmcmFtZSBQcm9iZVJlc3BvbnNlLgorCitGUkFNRSBBdXRoZW50aWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAvLyA3LjIuMy4xMAoreworICAgIEZGICAgIEF1dGhBbGdvOworICAgIEZGICAgIEF1dGhTZXFObzsKKyAgICBGRiAgICBTdGF0dXM7CisgICAgT1BUSUUgQ2hhbGxlbmdlVGV4dDsKKyAgICBPUFRJRSAgUlNOT3BhcXVlOworICAgIE9QVElFICBNb2JpbGl0eURvbWFpbjsKKyAgICBPUFRJRSAgRlRJbmZvOworICAgIE9QVElFICBUaW1lb3V0SW50ZXJ2YWw7CisgICAgT1BUSUUgIFJJQ0RhdGFEZXNjWzJdOworfSAvLyBFbmQgZnJhbWUgQXV0aC4KKworRlJBTUUgRGVBdXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNy4yLjMuMTEKK3sKKyAgICBGRiAgICBSZWFzb247CisgICAgT1BUSUUgUDJQRGVBdXRoOworfQorCitGUkFNRSBBZGRUU1JlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LjQuMi4xCit7CisKKyAgICBGRiAgICAgQ2F0ZWdvcnk7CisgICAgRkYgICAgIEFjdGlvbjsKKyAgICBGRiAgICAgRGlhbG9nVG9rZW47CisgICAgTUFORElFIFRTUEVDOworICAgIE9QVElFICBUQ0xBU1swLi4yXTsKKyAgICBPUFRJRSAgVENMQVNTUFJPQzsKKworICAgIC8vIFRoZXNlIElFcyBhcmVuJ3QgaW4gdGhlIHNwZWMsIGJ1dCBvdXIgZXh0YW50IGNvZGUgKndpbGwqIHBhcnNlIHRoZW0gaWYKKyAgICAvLyB0aGV5J3JlIHByZXNlbnQuICBJIGluY2x1ZGVkIHRoZW0gdG8gcHJlc2VydmUgdGhhdCBjYXBhYmlsaXR5CisKKyAgICBPUFRJRSAgV01NVFNQRUM7CisgICAgT1BUSUUgIFdNTVRDTEFTWzAuLjJdOworICAgIE9QVElFICBXTU1UQ0xBU1BST0M7CisgICAgT1BUSUUgIEVTRVRyYWZTdHJtUmF0ZVNldDsKKworfSAvLyBFbmQgZnJhbWUgQWRkVFNSZXF1ZXN0LgorCitGUkFNRSBXTU1BZGRUU1JlcXVlc3QKK3sKKyAgICBGRiAgICAgQ2F0ZWdvcnk7CisgICAgRkYgICAgIEFjdGlvbjsKKyAgICBGRiAgICAgRGlhbG9nVG9rZW47CisgICAgRkYgICAgIFN0YXR1c0NvZGU7CisgICAgTUFORElFIFdNTVRTUEVDOworICAgIE9QVElFICBFU0VUcmFmU3RybVJhdGVTZXQ7Cit9IC8vIEVuZCBGcmFtZSBXTU1BZGRUU1JlcXVlc3QKKworRlJBTUUgQWRkVFNSZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgLy8gNy40LjIuMgoreworCisgICAgRkYgICAgIENhdGVnb3J5OworICAgIEZGICAgICBBY3Rpb247CisgICAgRkYgICAgIERpYWxvZ1Rva2VuOworICAgIEZGICAgICBTdGF0dXM7CisgICAgTUFORElFIFRTRGVsYXk7CisgICAgTUFORElFIFRTUEVDOworICAgIE9QVElFICBUQ0xBU1swLi4yXTsKKyAgICBPUFRJRSAgVENMQVNTUFJPQzsKKyAgICBPUFRJRSAgU2NoZWR1bGU7CisKKyAgICAvLyBUaGVzZSBJRXMgYXJlbid0IGluIHRoZSBzcGVjLCBidXQgb3VyIGV4dGFudCBjb2RlICp3aWxsKiBwYXJzZSB0aGVtIGlmCisgICAgLy8gdGhleSdyZSBwcmVzZW50LiAgSSBpbmNsdWRlZCB0aGVtIHRvIHByZXNlcnZlIHRoYXQgY2FwYWJpbGl0eQorICAgIE9QVElFICBXTU1UU0RlbGF5OworICAgIE9QVElFICBXTU1TY2hlZHVsZTsKKyAgICBPUFRJRSAgV01NVFNQRUM7CisgICAgT1BUSUUgIFdNTVRDTEFTWzAuLjJdOworICAgIE9QVElFICBXTU1UQ0xBU1BST0M7CisgICAgT1BUSUUgIEVTRVRyYWZTdHJtTWV0OworCit9IC8vIEVuZCBmcmFtZSBBZGRUU1Jlc3BvbnNlLgorCitGUkFNRSBXTU1BZGRUU1Jlc3BvbnNlCit7CisKKyAgICBGRiAgICAgQ2F0ZWdvcnk7CisgICAgRkYgICAgIEFjdGlvbjsKKyAgICBGRiAgICAgRGlhbG9nVG9rZW47CisgICAgRkYgICAgIFN0YXR1c0NvZGU7CisgICAgT1BUSUUgIFdNTVRTUEVDOworICAgIE9QVElFICBFU0VUcmFmU3RybU1ldDsKKworfSAvLyBFbmQgZnJhbWUgV01NQWRkVFNSZXNwb25zZS4KKworRlJBTUUgRGVsVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNy40LjIuMworeworICAgIEZGICAgICBDYXRlZ29yeTsKKyAgICBGRiAgICAgQWN0aW9uOworICAgIEZGICAgICBUU0luZm87CisgICAgRkYgICAgIFJlYXNvbjsKK30KKworRlJBTUUgV01NRGVsVFMKK3sKKyAgICBGRiAgICAgQ2F0ZWdvcnk7CisgICAgRkYgICAgIEFjdGlvbjsKKyAgICBGRiAgICAgRGlhbG9nVG9rZW47CisgICAgRkYgICAgIFN0YXR1c0NvZGU7CisgICAgTUFORElFIFdNTVRTUEVDOworfQorCitGUkFNRSBUUENSZXF1ZXN0Cit7CisgICAgRkYgICAgIENhdGVnb3J5OworICAgIEZGICAgICBBY3Rpb247CisgICAgRkYgICAgIERpYWxvZ1Rva2VuOworICAgIE1BTkRJRSBUUENSZXF1ZXN0OworfQorCitGUkFNRSBUUENSZXBvcnQKK3sKKyAgICBGRiAgICAgQ2F0ZWdvcnk7CisgICAgRkYgICAgIEFjdGlvbjsKKyAgICBGRiAgICAgRGlhbG9nVG9rZW47CisgICAgTUFORElFIFRQQ1JlcG9ydDsKK30KKworRlJBTUUgQ2hhbm5lbFN3aXRjaAoreworICAgIEZGICAgICBDYXRlZ29yeTsKKyAgICBGRiAgICAgQWN0aW9uOworICAgIE1BTkRJRSBDaGFuU3dpdGNoQW5uOworICAgIE9QVElFICBzZWNfY2hhbl9vZmZzZXRfZWxlOworICAgIE9QVElFICBXaWRlckJXQ2hhblN3aXRjaEFubjsKK30KKworRlJBTUUgTWVhc3VyZW1lbnRSZXF1ZXN0Cit7CisgICAgRkYgICAgIENhdGVnb3J5OworICAgIEZGICAgICBBY3Rpb247CisgICAgRkYgICAgIERpYWxvZ1Rva2VuOworICAgIE1BTkRJRSBNZWFzdXJlbWVudFJlcXVlc3RbMS4uNF07Cit9CisKK0ZSQU1FIE1lYXN1cmVtZW50UmVwb3J0Cit7CisgICAgRkYgICAgIENhdGVnb3J5OworICAgIEZGICAgICBBY3Rpb247CisgICAgRkYgICAgIERpYWxvZ1Rva2VuOworICAgIE1BTkRJRSBNZWFzdXJlbWVudFJlcG9ydDsKK30KKworRlJBTUUgU01Qb3dlclNhdmUKK3sKKyAgICBGRiAgICBDYXRlZ29yeTsKKyAgICBGRiAgICBBY3Rpb247CisgICAgRkYgICAgU01Qb3dlck1vZGVTZXQ7Cit9CisKK0ZSQU1FIFJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0Cit7CisgICBGRiAgICBDYXRlZ29yeTsKKyAgIEZGICAgIEFjdGlvbjsKKyAgIEZGICAgIERpYWxvZ1Rva2VuOworICAgRkYgICAgTnVtT2ZSZXBldGl0aW9uczsKKyAgIC8vTWVhc3VyZW1lbnQgUmVxdWVzdCBJRS4KKyAgIE1BTkRJRSBNZWFzdXJlbWVudFJlcXVlc3RbMS4uMl07Cit9CisKK0ZSQU1FIFJhZGlvTWVhc3VyZW1lbnRSZXBvcnQKK3sKKyAgIEZGICAgQ2F0ZWdvcnk7CisgICBGRiAgIEFjdGlvbjsKKyAgIEZGICAgRGlhbG9nVG9rZW47CisgICAvL01lYXN1cmVtZW50IFJlcG9ydCBlbGVtZW50cy4KKyAgIE1BTkRJRSBNZWFzdXJlbWVudFJlcG9ydFsxLi40XTsKK30KKworRlJBTUUgTGlua01lYXN1cmVtZW50UmVxdWVzdAoreworICAgRkYgICBDYXRlZ29yeTsKKyAgIEZGICAgQWN0aW9uOworICAgRkYgICBEaWFsb2dUb2tlbjsKKyAgIEZGICAgVHhQb3dlcjsKKyAgIEZGICAgTWF4VHhQb3dlcjsKKyAgIC8vT3B0aW9uYWwgU3ViIEllcworfQorCitGUkFNRSBMaW5rTWVhc3VyZW1lbnRSZXBvcnQKK3sKKyAgIEZGICAgQ2F0ZWdvcnk7CisgICBGRiAgIEFjdGlvbjsKKyAgIEZGICAgRGlhbG9nVG9rZW47CisgICBGRiAgIFRQQ0VsZUlEOworICAgRkYgICBUUENFbGVMZW47CisgICBGRiAgIFR4UG93ZXI7CisgICBGRiAgIExpbmtNYXJnaW47CisgICBGRiAgIFJ4QW50ZW5uYUlkOworICAgRkYgICBUeEFudGVubmFJZDsKKyAgIEZGICAgUkNQSTsKKyAgIEZGICAgUlNOSTsKKyAgIC8vT3B0aW9uYWwgVmVuZG9yIHNwZWNpZmljIElFcyAuLi4gaWdub3JpbmcKK30KKworRlJBTUUgTmVpZ2hib3JSZXBvcnRSZXF1ZXN0Cit7CisgICBGRiAgICAgQ2F0ZWdvcnk7CisgICBGRiAgICAgQWN0aW9uOworICAgRkYgICAgIERpYWxvZ1Rva2VuOworICAgT1BUSUUgIFNTSUQ7CisgICAvL09wdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBJRS4uLmlnbm9yaW5nLgorfQorCitGUkFNRSBOZWlnaGJvclJlcG9ydFJlc3BvbnNlCit7CisgICBGRiAgICAgQ2F0ZWdvcnk7CisgICBGRiAgICAgQWN0aW9uOworICAgRkYgICAgIERpYWxvZ1Rva2VuOworICAgT1BUSUUgIE5laWdoYm9yUmVwb3J0WzEuLk1BWF9TVVBQT1JURURfTkVJR0hCT1JfUlBUXTsKK30KKworRlJBTUUgT3BlcmF0aW5nTW9kZQoreworICAgIEZGICAgICAgICBDYXRlZ29yeTsKKyAgICBGRiAgICAgICAgQWN0aW9uOworICAgIC8vT3BlcmF0aW5nIE1vZGUgZmllbGQKKyAgICBGRiAgICAgICAgT3BlcmF0aW5nTW9kZTsKK30KKworRlJBTUUgVERMU0Rpc1JlcQoreworICAgIEZGICAgICBDYXRlZ29yeTsKKyAgICBGRiAgICAgQWN0aW9uOworICAgIEZGICAgICBEaWFsb2dUb2tlbjsKKyAgICBNQU5ESUUgTGlua0lkZW50aWZpZXI7Cit9CisKK0ZSQU1FIFRETFNEaXNSc3AKK3sKKyAgICBGRiAgICAgQ2F0ZWdvcnk7CisgICAgRkYgICAgIEFjdGlvbjsKKyAgICBGRiAgICAgRGlhbG9nVG9rZW47CisgICAgRkYgICAgIENhcGFiaWxpdGllczsKKyAgICBNQU5ESUUgU3VwcFJhdGVzOworICAgIE9QVElFICBFeHRTdXBwUmF0ZXM7CisgICAgT1BUSUUgIFN1cHBDaGFubmVsczsKKyAgICBPUFRJRSAgU3VwcE9wZXJhdGluZ0NsYXNzZXM7CisgICAgT1BUSUUgIFJTTjsKKyAgICBPUFRJRSAgRXh0Q2FwOworICAgIE9QVElFICBGVEluZm87CisgICAgT1BUSUUgIFRpbWVvdXRJbnRlcnZhbDsKKyAgICBPUFRJRSAgUklDRGF0YTsKKyAgICBPUFRJRSAgSFRDYXBzOworICAgIE9QVElFICBodDIwNDBfYnNzX2NvZXhpc3RlbmNlOworICAgIE1BTkRJRSBMaW5rSWRlbnRpZmllcjsKKyAgICBPUFRJRSAgVkhUQ2FwczsKK30KKworRlJBTUUgVERMU1NldHVwUmVxCit7CisgICAgRkYgICAgIENhdGVnb3J5OworICAgIEZGICAgICBBY3Rpb247CisgICAgRkYgICAgIERpYWxvZ1Rva2VuOworICAgIEZGICAgICBDYXBhYmlsaXRpZXM7CisgICAgTUFORElFIFN1cHBSYXRlczsKKyAgICBPUFRJRSAgQ291bnRyeTsKKyAgICBPUFRJRSAgRXh0U3VwcFJhdGVzOworICAgIE9QVElFICBTdXBwQ2hhbm5lbHM7CisgICAgT1BUSUUgIFJTTjsKKyAgICBPUFRJRSAgRXh0Q2FwOworICAgIE9QVElFICBTdXBwT3BlcmF0aW5nQ2xhc3NlczsKKyAgICBPUFRJRSAgUU9TQ2Fwc1N0YXRpb247CisgICAgT1BUSUUgIEZUSW5mbzsKKyAgICBPUFRJRSAgVGltZW91dEludGVydmFsOworICAgIE9QVElFICBSSUNEYXRhOworICAgIE9QVElFICBIVENhcHM7CisgICAgT1BUSUUgIGh0MjA0MF9ic3NfY29leGlzdGVuY2U7CisgICAgTUFORElFIExpbmtJZGVudGlmaWVyOworICAgIE9QVElFICBXTU1JbmZvU3RhdGlvbjsKKyAgICBPUFRJRSAgQUlEOworICAgIE9QVElFICBWSFRDYXBzOworfQorCitGUkFNRSBURExTU2V0dXBSc3AKK3sKKyAgICBGRiAgICAgQ2F0ZWdvcnk7CisgICAgRkYgICAgIEFjdGlvbjsKKyAgICBGRiAgICAgU3RhdHVzOworICAgIEZGICAgICBEaWFsb2dUb2tlbjsKKyAgICBGRiAgICAgQ2FwYWJpbGl0aWVzIDsKKyAgICBPUFRJRSAgU3VwcFJhdGVzOworICAgIE9QVElFICBDb3VudHJ5OworICAgIE9QVElFICBFeHRTdXBwUmF0ZXM7CisgICAgT1BUSUUgIFN1cHBDaGFubmVsczsKKyAgICBPUFRJRSAgUlNOOworICAgIE9QVElFICBFeHRDYXA7CisgICAgT1BUSUUgIFN1cHBPcGVyYXRpbmdDbGFzc2VzOworICAgIE9QVElFICBRT1NDYXBzU3RhdGlvbjsKKyAgICBPUFRJRSAgRlRJbmZvOworICAgIE9QVElFICBUaW1lb3V0SW50ZXJ2YWw7CisgICAgT1BUSUUgIFJJQ0RhdGE7CisgICAgT1BUSUUgIEhUQ2FwczsKKyAgICBPUFRJRSAgaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZTsKKyAgICBPUFRJRSAgTGlua0lkZW50aWZpZXI7CisgICAgT1BUSUUgIFdNTUluZm9TdGF0aW9uOworICAgIE9QVElFICBBSUQ7CisgICAgT1BUSUUgIFZIVENhcHM7CisgICAgT1BUSUUgIE9wZXJhdGluZ01vZGU7Cit9CisKK0ZSQU1FIFRETFNTZXR1cENuZgoreworICAgIEZGICAgICBDYXRlZ29yeTsKKyAgICBGRiAgICAgQWN0aW9uOworICAgIEZGICAgICBTdGF0dXM7CisgICAgRkYgICAgIERpYWxvZ1Rva2VuOworICAgIE9QVElFICBSU047CisgICAgT1BUSUUgIEVEQ0FQYXJhbVNldDsKKyAgICBPUFRJRSAgRlRJbmZvOworICAgIE9QVElFICBUaW1lb3V0SW50ZXJ2YWw7CisgICAgT1BUSUUgIEhUSW5mbzsKKyAgICBPUFRJRSAgTGlua0lkZW50aWZpZXI7CisgICAgT1BUSUUgIFdNTVBhcmFtczsKKyAgICBPUFRJRSAgVkhUT3BlcmF0aW9uOworICAgIE9QVElFICBPcGVyYXRpbmdNb2RlOworfQorRlJBTUUgVERMU1RlYXJkb3duCit7CisgICAgRkYgICAgIENhdGVnb3J5OworICAgIEZGICAgICBBY3Rpb247CisgICAgRkYgICAgIFJlYXNvbjsKKyAgICBPUFRJRSAgRlRJbmZvOworICAgIE1BTkRJRSBMaW5rSWRlbnRpZmllcjsKK30KKworRlJBTUUgVERMU1BlZXJUcmFmZmljSW5kCit7CisgICAgRkYgICAgIENhdGVnb3J5OworICAgIEZGICAgICBBY3Rpb247CisgICAgRkYgICAgIERpYWxvZ1Rva2VuOworICAgIE1BTkRJRSBMaW5rSWRlbnRpZmllcjsKKyAgICBPUFRJRSAgUFRJQ29udHJvbDsKKyAgICBNQU5ESUUgUFVCdWZmZXJTdGF0dXM7Cit9CisKK0ZSQU1FIFRETFNQZWVyVHJhZmZpY1JzcAoreworICAgIEZGICAgICBDYXRlZ29yeTsKKyAgICBGRiAgICAgQWN0aW9uOworICAgIEZGICAgICBEaWFsb2dUb2tlbjsKKyAgICBNQU5ESUUgTGlua0lkZW50aWZpZXI7Cit9CisKK0ZSQU1FIFNhUXVlcnlSZXEKK3sKKyAgICBGRiAgICAgQ2F0ZWdvcnk7CisgICAgRkYgICAgIEFjdGlvbjsKKyAgICBGRiAgICAgVHJhbnNhY3Rpb25JZDsKK30KKworRlJBTUUgU2FRdWVyeVJzcAoreworICAgIEZGICAgICBDYXRlZ29yeTsKKyAgICBGRiAgICAgQWN0aW9uOworICAgIEZGICAgICBUcmFuc2FjdGlvbklkOworfQorCitGUkFNRSBRb3NNYXBDb25maWd1cmUKK3sKKyAgICBGRiAgICAgQ2F0ZWdvcnk7CisgICAgRkYgICAgIEFjdGlvbjsKKyAgICBNQU5ESUUgIFFvc01hcFNldDsKK30KKworRlJBTUUgVkhUR2lkTWFuYWdlbWVudEFjdGlvbkZyYW1lCit7CisgICAgRkYgICAgIENhdGVnb3J5OworICAgIEZGICAgICBBY3Rpb247CisgICAgRkYgICAgIFZodE1lbWJlcnNoaXBTdGF0dXNBcnJheTsKKyAgICBGRiAgICAgVmh0VXNlclBvc2l0aW9uQXJyYXk7Cit9CisKK0ZSQU1FIGh0MjA0MF9ic3NfY29leGlzdGVuY2VfbWdtdF9hY3Rpb25fZnJhbWUKK3sKKyAgICBGRiAgICAgQ2F0ZWdvcnk7CisgICAgRkYgICAgIEFjdGlvbjsKKyAgICBNQU5ESUUgaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZTsKKyAgICBNQU5ESUUgaHQyMDQwX2Jzc19pbnRvbGVyYW50X3JlcG9ydDsKK30KKworRlJBTUUgVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lICAgICAgICAgICAgLy8gOC4zLjMuMTUKK3sKKyAgICBGRiAgICAgVGltZVN0YW1wOworICAgIEZGICAgICBDYXBhYmlsaXRpZXM7CisgICAgT1BUSUUgIENvdW50cnk7CisgICAgT1BUSUUgIFBvd2VyQ29uc3RyYWludHM7CisgICAgT1BUSUUgIFRpbWVBZHZlcnRpc2VtZW50OworICAgIE9QVElFICBFeHRDYXA7CisgICAgT1BUSUUgIFZlbmRvcjFJRTsKKyAgICBPUFRJRSAgVmVuZG9yM0lFOworfQorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOiBjKysKKy8vIGZpbGwtY29sdW1uOiA3NworLy8gY29tbWVudC1jb2x1bW46IDQyCisvLyBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKy8vIHNob3ctdHJhaWxpbmctd2hpdGVzcGFjZTogdAorLy8gRW5kOgorCisvLyBwYXJzZXIuZnJtcyBlbmRzIGhlcmUuCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvY2ZnL2NmZ19hcGkuYyBiL2NvcmUvbWFjL3NyYy9jZmcvY2ZnX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMGQ2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvY2ZnL2NmZ19hcGkuYwpAQCAtMCwwICsxLDk0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIGZvciBDRkcgQVBJIGZ1bmN0aW9ucy4KKyAqCisgKiBBdXRob3I6ICAgICAgS2V2aW4gTmd1eWVuCisgKiBEYXRlOiAgICAgICAgMDQvMDkvMDIKKyAqIEhpc3Rvcnk6LQorICogMDQvMDkvMDIgICAgICAgIENyZWF0ZWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAiY2ZnX3ByaXYuaCIKKyNpbmNsdWRlICJjZmdfZGVidWcuaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU3RhdGljIFZhcmlhYmxlcyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHRDZmdDdGwgX19nX2NmZ19lbnRyeVtDRkdfUEFSQU1fTUFYX05VTV07CitzdGF0aWMgdWludDMyX3QgX19nX2NmZ19pX2J1Zl9taW5bQ0ZHX1NUQV9JQlVGX01BWF9TSVpFXTsKK3N0YXRpYyB1aW50MzJfdCBfX2dfY2ZnX2lfYnVmX21heFtDRkdfU1RBX0lCVUZfTUFYX1NJWkVdOworc3RhdGljIHVpbnQzMl90IF9fZ19jZmdfaV9idWZbQ0ZHX1NUQV9JQlVGX01BWF9TSVpFXTsKK3N0YXRpYyB1aW50OF90IF9fZ19jZmdfc19idWZbQ0ZHX1NUQV9TQlVGX01BWF9TSVpFXTsKK3N0YXRpYyB1aW50OF90IF9fZ19zX2J1ZmZlcltDRkdfTUFYX1NUUl9MRU5dOworc3RhdGljIHVpbnQzMl90IF9fZ19wYXJhbV9saXN0W1dOSV9DRkdfTUFYX1BBUkFNX05VTSArCisJCQkgICAgIFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SU1BfTlVNXTsKKworc3RhdGljIHZvaWQgbm90aWZ5KHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdWludDMyX3QpOworCit0eXBlZGVmIGVudW0geworCWVSRl9CQU5EX1VOS05PV04gPSAwLAorCWVSRl9CQU5EXzJfNF9HSFogPSAxLAorCWVSRl9CQU5EXzVfR0haID0gMgorfSBlUmZCYW5kTW9kZTsKKworZXh0ZXJuIGNmZ3N0YXRpY19zdHJpbmcgY2ZnX3N0YXRpY19zdHJpbmdbQ0ZHX01BWF9TVEFUSUNfU1RSSU5HXTsKK2V4dGVybiBjZ3N0YXRpYyBjZmdfc3RhdGljW0NGR19QQVJBTV9NQVhfTlVNXSA7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordWludDMyX3QgY2ZnX25lZWRfcmVzdGFydCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBjZmdJZCkKK3sKKwlpZiAoIXBNYWMtPmNmZy5nQ2ZnRW50cnkpIHsKKwkJUEVMT0dFKGNmZ19sb2cocE1hYywgTE9HRSwgRkwoImdDZmdFbnRyeSBpcyBOVUxMIikpOykKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAhIShwTWFjLT5jZmcuZ0NmZ0VudHJ5W2NmZ0lkXS5jb250cm9sICYgQ0ZHX0NUTF9SRVNUQVJUKTsKK30KKwordm9pZCBjZmdfZ2V0X3N0cmluZGV4KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGNmZ0lkKQoreworCXVpbnQxNl90IGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IENGR19NQVhfU1RBVElDX1NUUklORzsgaSsrKSB7CisJCWlmIChjZmdJZCA9PSBjZmdfc3RhdGljX3N0cmluZ1tpXS5jZmdJZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBDRkdfTUFYX1NUQVRJQ19TVFJJTkcpIHsKKwkJUEVMT0dFKGNmZ19sb2cocE1hYywgTE9HRSwgRkwoIkVudHJ5IG5vdCBmb3VuZCBmb3IgY2ZnIGlkIDolZCIpLCBjZmdJZCk7KQorCQljZmdfc3RhdGljW2NmZ0lkXS5wU3RyRGF0YSA9IE5VTEw7CisJCXJldHVybjsKKwl9CisJY2ZnX3N0YXRpY1tjZmdJZF0ucFN0ckRhdGEgPSAmY2ZnX3N0YXRpY19zdHJpbmdbaV07Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3VpbnQzMl90IGNmZ19uZWVkX3JlbG9hZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBjZmdJZCkKK3sKKwlpZiAoIXBNYWMtPmNmZy5nQ2ZnRW50cnkpIHsKKwkJUEVMT0dFKGNmZ19sb2cocE1hYywgTE9HRSwgRkwoImdDZmdFbnRyeSBpcyBOVUxMIikpOykKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAhIShwTWFjLT5jZmcuZ0NmZ0VudHJ5W2NmZ0lkXS5jb250cm9sICYgQ0ZHX0NUTF9SRUxPQUQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3RTaXJSZXRTdGF0dXMgY2ZnX2luaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl1aW50MTZfdCBpID0gMDsKKwlwTWFjLT5jZmcuZ0NmZ0lCdWZNaW4gPSBfX2dfY2ZnX2lfYnVmX21pbjsKKwlwTWFjLT5jZmcuZ0NmZ0lCdWZNYXggPSBfX2dfY2ZnX2lfYnVmX21heDsKKwlwTWFjLT5jZmcuZ0NmZ0lCdWYgPSBfX2dfY2ZnX2lfYnVmOworCXBNYWMtPmNmZy5nQ2ZnU0J1ZiA9IF9fZ19jZmdfc19idWY7CisJcE1hYy0+Y2ZnLmdTQnVmZmVyID0gX19nX3NfYnVmZmVyOworCXBNYWMtPmNmZy5nQ2ZnRW50cnkgPSBfX2dfY2ZnX2VudHJ5OworCXBNYWMtPmNmZy5nUGFyYW1MaXN0ID0gX19nX3BhcmFtX2xpc3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0ZHX1BBUkFNX01BWF9OVU07IGkrKykgeworCQlpZiAoIShjZmdfc3RhdGljW2ldLmNvbnRyb2wgJiBDRkdfQ1RMX0lOVCkpIHsKKwkJCWNmZ19nZXRfc3RyaW5kZXgocE1hYywgaSk7CisJCX0gZWxzZSB7CisJCQljZmdfc3RhdGljW2ldLnBTdHJEYXRhID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gKGVTSVJfU1VDQ0VTUyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgY2ZnX2RlX2luaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlwTWFjLT5jZmcuZ0NmZ0lCdWZNaW4gPSBOVUxMOworCXBNYWMtPmNmZy5nQ2ZnSUJ1Zk1heCA9IE5VTEw7CisJcE1hYy0+Y2ZnLmdDZmdJQnVmID0gTlVMTDsKKwlwTWFjLT5jZmcuZ0NmZ1NCdWYgPSBOVUxMOworCXBNYWMtPmNmZy5nU0J1ZmZlciA9IE5VTEw7CisJcE1hYy0+Y2ZnLmdDZmdFbnRyeSA9IE5VTEw7CisJcE1hYy0+Y2ZnLmdQYXJhbUxpc3QgPSBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogY2ZnX2NoZWNrX3ZhbGlkKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIGlmIGEgcGFyYW1ldGVyIGlzIHZhbGlkCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gY2ZnSWQ6ICAxNi1iaXQgQ0ZHIHBhcmFtZXRlciBJRAorICoKKyAqIEByZXR1cm4gZVNJUl9TVUNDRVNTOiAgcmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgKiBAcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfSUQ6ICBpbnZhbGlkIENGRyBwYXJhbWV0ZXIgSUQKKyAqLwordFNpclJldFN0YXR1cyBjZmdfY2hlY2tfdmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgY2ZnSWQsCisJCQkJCXVpbnQzMl90ICppbmRleCkKK3sKKwl1aW50MzJfdCBjb250cm9sOworCisJaWYgKGNmZ0lkID49IENGR19QQVJBTV9NQVhfTlVNKSB7CisJCVBFTE9HRShjZmdfbG9nKHBNYWMsIExPRzMsIEZMKCJJbnZhbGlkIGNmZyBpZCAlZCIpLCBjZmdJZCk7KQorCQlyZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKwl9CisJaWYgKCFwTWFjLT5jZmcuZ0NmZ0VudHJ5KSB7CisJCVBFTE9HRShjZmdfbG9nKHBNYWMsIExPR0UsIEZMKCJnQ2ZnRW50cnkgaXMgTlVMTCIpKTspCisJCXJldHVybiBlU0lSX0NGR19JTlZBTElEX0lEOworCX0KKworCWNvbnRyb2wgPSBwTWFjLT5jZmcuZ0NmZ0VudHJ5W2NmZ0lkXS5jb250cm9sOworCisJLyogQ2hlY2sgaWYgcGFyYW1ldGVyIGlzIHZhbGlkICovCisJaWYgKChjb250cm9sICYgQ0ZHX0NUTF9WQUxJRCkgPT0gMCkgeworCQlQRUxPR0UoY2ZnX2xvZyhwTWFjLCBMT0dFLCBGTCgiTm90IHZhbGlkIGNmZyBpZCAlZCIpLCBjZmdJZCk7KQorCQlyZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKwl9CisKKwkqaW5kZXggPSBjb250cm9sICYgQ0ZHX0JVRl9JTkRYX01BU0s7CisKKwlpZiAoKmluZGV4ID49IENGR19TVEFfU0JVRl9NQVhfU0laRSkgeworCQlQRUxPR0UoY2ZnX2xvZyhwTWFjLCBMT0dFLCBGTCgiY2ZnIGluZGV4IG91dCBvZiBib3VuZHMgJWQiKSwKKwkJCQkJKmluZGV4KTspCisJCXJldHVybiBlU0lSX0NGR19JTlZBTElEX0lEOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyoqKiBlbmQgY2ZnX2NoZWNrX3ZhbGlkKCkgKioqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogY2ZnX3NldF9pbnQoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdXBkYXRlIGFuIGludGVnZXIgcGFyYW1ldGVyLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogLSBSYW5nZSBjaGVja2luZyBpcyBwZXJmb3JtZWQgYnkgdGhlIGNhbGxpbmcgZnVuY3Rpb24uICBJbiBjYXNlIHRoaXMKKyAqICAgZnVuY3Rpb24gY2FsbCBpcyBiZWluZyB0cmlnZ2VyZWQgYnkgYSByZXF1ZXN0IGZyb20gaG9zdCwgdGhlbiBob3N0CisgKiAgIGlzIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIHJhbmdlIGNoZWNraW5nIGJlZm9yZSBzZW5kaW5nIHRoZQorICogICByZXF1ZXN0LgorICoKKyAqIC0gSG9zdCBSVyBwZXJtaXNzaW9uIGNoZWNraW5nIHNob3VsZCBhbHJlYWR5IGJlIGRvbmUgcHJpb3IgdG8gY2FsbGluZworICogICB0aGlzIGZ1bmN0aW9uIGJ5IHRoZSBtZXNzYWdlIHByb2Nlc3NpbmcgZnVuY3Rpb24uCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gY2ZnSWQ6ICAgICAxNi1iaXQgQ0ZHIHBhcmFtZXRlciBJRAorICogQHBhcmFtIHZhbHVlOiAgICAgMzItYml0IHVuc2lnbmVkIHZhbHVlCisgKgorICogQHJldHVybiBlU0lSX1NVQ0NFU1M6ICByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAqIEByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9JRDogIGludmFsaWQgQ0ZHIHBhcmFtZXRlciBJRAorICovCisKK3RTaXJSZXRTdGF0dXMgY2ZnX3NldF9pbnQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgY2ZnSWQsIHVpbnQzMl90IHZhbHVlKQoreworCXVpbnQzMl90IGluZGV4OworCXVpbnQzMl90IGNvbnRyb2w7CisJdWludDMyX3QgbWFzazsKKwl0U2lyUmV0U3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGNmZ19jaGVja192YWxpZChwTWFjLCBjZmdJZCwgJmluZGV4KTsKKworCWlmIChlU0lSX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKChwTWFjLT5jZmcuZ0NmZ0lCdWZNaW5baW5kZXhdID4gdmFsdWUpIHx8CisJCQkocE1hYy0+Y2ZnLmdDZmdJQnVmTWF4W2luZGV4XSA8IHZhbHVlKSkgeworCQlQRUxPR0UoY2ZnX2xvZyAocE1hYywgTE9HRSwgRkwoCisJCQkiVmFsdWUgJWQgb3V0IG9mIHJhbmdlIFslZCwlZF0gY2ZnIGlkICVkIiksIHZhbHVlLAorCQkJICAgICAgIHBNYWMtPmNmZy5nQ2ZnSUJ1Zk1pbltpbmRleF0sCisJCQkgICAgICAgcE1hYy0+Y2ZnLmdDZmdJQnVmTWF4W2luZGV4XSwgY2ZnSWQpOykKKwkJcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfSUQ7CisJfSBlbHNlIHsKKwkJLyogV3JpdGUgaW50ZWdlciB2YWx1ZSAqLworCQlwTWFjLT5jZmcuZ0NmZ0lCdWZbaW5kZXhdID0gdmFsdWU7CisKKwkJY29udHJvbCA9IHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLmNvbnRyb2w7CisJCS8qIFVwZGF0ZSBoYXJkd2FyZSBpZiBuZWNlc3NhcnkgKi8KKwkJbWFzayA9IGNvbnRyb2wgJiBDRkdfQ1RMX05URl9NQVNLOworCQlpZiAoKG1hc2sgJiBDRkdfQ1RMX05URl9IVykgIT0gMCkKKwkJCVBFTE9HRShjZmdfbG9nKHBNYWMsIExPR0UsIEZMKAorCQkJCSJDRkcgbm90aWZ5IEhXIG5vdCBzdXBwb3J0ZWQhISEiKSk7KQorCQkJLyogbm90aWZ5IG90aGVyIG1vZHVsZXMgaWYgbmVjZXNzYXJ5ICovCisJCQlpZiAoKG1hc2sgJiBDRkdfQ1RMX05URl9NQVNLKSAhPSAwKQorCQkJCW5vdGlmeShwTWFjLCBjZmdJZCwgbWFzayk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qKiogZW5kIGNmZ19zZXRfaW50ICoqKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHdsYW5fY2ZnX2dldF9pbnQoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCBhbiBpbnRlZ2VyIHBhcmFtZXRlci4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBjZmdJZDogIDE2LWJpdCBDRkcgcGFyYW1ldGVyIElECisgKiBAcGFyYW0gcFZhbDogICBhZGRyZXNzIHdoZXJlIHBhcmFtZXRlciB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4KKyAqCisgKiBAcmV0dXJuIGVTSVJfU1VDQ0VTUzogIHJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICogQHJldHVybiBlU0lSX0NGR19JTlZBTElEX0lEOiAgaW52YWxpZCBDRkcgcGFyYW1ldGVyIElECisgKi8KKwordFNpclJldFN0YXR1cyB3bGFuX2NmZ19nZXRfaW50KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGNmZ0lkLAorCQkJCXVpbnQzMl90ICpwVmFsdWUpCit7CisJdWludDMyX3QgaW5kZXg7CisJdFNpclJldFN0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBjZmdfY2hlY2tfdmFsaWQocE1hYywgY2ZnSWQsICZpbmRleCk7CisKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIEdldCBpbnRlZ2VyIHZhbHVlICovCisJKnBWYWx1ZSA9IHBNYWMtPmNmZy5nQ2ZnSUJ1ZltpbmRleF07CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqIGVuZCB3bGFuX2NmZ19nZXRfaW50KCkgKioqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogY2ZnX3NldF9zdHIoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0IGEgc3RyaW5nIHBhcmFtZXRlci4KKyAqCisgKiBMT0dJQzoKKyAqIFRoaXMgZnVuY3Rpb24gaW52b2tlcyB0aGUgY2ZnX3NldF9zdHJfbm90aWZ5IGZ1bmN0aW9uIHBhc3NpbmcgdGhlIG5vdGlmeQorICogYm9vbCB2YWx1ZSBzZXQgdG8gdHJ1ZS4gVGhpcyBiYXNpY2FsbHkgbWVhbnMgdGhhdCBIQUwgbmVlZHMgdG8gYmUKKyAqIG5vdGlmaWVkLiBUaGlzIGlzIHRydWUgaW4gdGhlIGNhc2Ugb2Ygbm9uLWludGVncmF0ZWQgU09DJ3Mgb3IgTGlicmEvVm9sYW5zLgorICogSW4gdGhlIGNhc2Ugb2YgUHJpbWEgdGhlIGNmZ19zZXRfc3RyX25vdGlmeSBpcyBpbnZva2VkIHdpdGggdGhlIGJvb2wgdmFsdWUKKyAqIHNldCB0byBmYWxzZS4KKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIC0gYWx3YXlzIG5vdGlmeSBoYXMgdG8gYmUgY2FsbGVkCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gY2ZnSWQ6ICAgICAxNi1iaXQgQ0ZHIHBhcmFtZXRlciBJRAorICogQHBhcmFtIHBTdHI6ICAgICAgYWRkcmVzcyBvZiBzdHJpbmcgZGF0YQorICogQHBhcmFtIGxlbjogICAgICAgc3RyaW5nIGxlbmd0aAorICoKKyAqIEByZXR1cm4gZVNJUl9TVUNDRVNTOiAgcmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgKiBAcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfSUQ6ICBpbnZhbGlkIENGRyBwYXJhbWV0ZXIgSUQKKyAqIEByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9MRU46ICBpbnZhbGlkIENGRyBwYXJhbWV0ZXIgbGVuZ3RoCisgKgorICovCisKK3RTaXJSZXRTdGF0dXMgY2ZnX3NldF9zdHIodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgY2ZnSWQsIHVpbnQ4X3QgKnBTdHIsCisJCQkgIHVpbnQzMl90IGxlbmd0aCkKK3sKKwlyZXR1cm4gY2ZnX3NldF9zdHJfbm90aWZ5KHBNYWMsIGNmZ0lkLCBwU3RyLCBsZW5ndGgsIHRydWUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogY2ZnX3NldF9zdHJfbm90aWZ5KCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCBhIHN0cmluZyBwYXJhbWV0ZXIuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiAtIE5vIGxlbmd0aCBjaGVja2luZyB3aWxsIGJlIHBlcmZvcm1lZC4gIFNob3VsZCBiZSBkb25lIGJ5IGNhbGxpbmcKKyAqICAgbW9kdWxlLgorICogLSBIb3N0IFJXIHBlcm1pc3Npb24gc2hvdWxkIGJlIGNoZWNrZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzCisgKiAgIGZ1bmN0aW9uLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGNmZ0lkOiAgICAgMTYtYml0IENGRyBwYXJhbWV0ZXIgSUQKKyAqIEBwYXJhbSBwU3RyOiAgICAgIGFkZHJlc3Mgb2Ygc3RyaW5nIGRhdGEKKyAqIEBwYXJhbSBsZW46ICAgICAgIHN0cmluZyBsZW5ndGgKKyAqIEBwYXJhbSBub3RpZnlNb2QuIG5vdGlmeSByZXNwZWN0aXZlIE1vZHVsZQorICoKKyAqIEByZXR1cm4gZVNJUl9TVUNDRVNTOiAgcmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgKiBAcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfSUQ6ICBpbnZhbGlkIENGRyBwYXJhbWV0ZXIgSUQKKyAqIEByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9MRU46ICBpbnZhbGlkIENGRyBwYXJhbWV0ZXIgbGVuZ3RoCisgKgorICovCisKK3RTaXJSZXRTdGF0dXMgY2ZnX3NldF9zdHJfbm90aWZ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGNmZ0lkLAorCQkJCQl1aW50OF90ICpwU3RyLCB1aW50MzJfdCBsZW5ndGgsCisJCQkJCWludCBub3RpZnlNb2QpCit7CisJdWludDhfdCAqcERzdCwgKnBEc3RFbmQ7CisJdWludDMyX3QgaW5kZXgsIHBhcmFtTGVuLCBtYXNrOworCXVpbnQzMl90IGNvbnRyb2w7CisJdFNpclJldFN0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBjZmdfY2hlY2tfdmFsaWQocE1hYywgY2ZnSWQsICZpbmRleCk7CisKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCXBEc3QgPSAmcE1hYy0+Y2ZnLmdDZmdTQnVmW2luZGV4XTsKKwlwYXJhbUxlbiA9ICpwRHN0Kys7CisJY29udHJvbCA9IHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLmNvbnRyb2w7CisJaWYgKGxlbmd0aCA+IHBhcmFtTGVuKSB7CisJCVBFTE9HRShjZmdfbG9nKHBNYWMsIExPR0UsIEZMKAorCQkJIkludmFsaWQgbGVuZ3RoICVkICg+JWQpIGNmZyBpZCAlZCIpLAorCQkJbGVuZ3RoLCBwYXJhbUxlbiwgY2ZnSWQpOykKKwkJCXJldHVybiBlU0lSX0NGR19JTlZBTElEX0xFTjsKKwl9IGVsc2UgeworCQkqcERzdCsrID0gKHVpbnQ4X3QpIGxlbmd0aDsKKwkJcERzdEVuZCA9IHBEc3QgKyBsZW5ndGg7CisJCXdoaWxlIChwRHN0IDwgcERzdEVuZCkgeworCQkJKnBEc3QrKyA9ICpwU3RyKys7CisJCX0KKwkJaWYgKG5vdGlmeU1vZCkgeworCQkJLyogVXBkYXRlIGhhcmR3YXJlIGlmIG5lY2Vzc2FyeSAqLworCQkJbWFzayA9IGNvbnRyb2wgJiBDRkdfQ1RMX05URl9NQVNLOworCQkJaWYgKChtYXNrICYgQ0ZHX0NUTF9OVEZfSFcpICE9IDApIHsKKwkJCQlQRUxPR0UoY2ZnX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkJIkNGRyBub3RpZnkgSFcgbm90IHN1cHBvcnRlZCEiKSk7KQorCQkJfQorCQkJLyogbm90aWZ5IG90aGVyIG1vZHVsZXMgaWYgbmVjZXNzYXJ5ICovCisJCQlpZiAoKG1hc2sgJiBDRkdfQ1RMX05URl9NQVNLKSAhPSAwKSB7CisJCQkJbm90aWZ5KHBNYWMsIGNmZ0lkLCBtYXNrKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqIGVuZCBjZmdfc2V0X3N0cl9ub3RpZnkoKSAqKiovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiB3bGFuX2NmZ19nZXRfc3RyKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCBhIHN0cmluZyBwYXJhbWV0ZXIuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiAtIEhvc3QgUlcgcGVybWlzc2lvbiBzaG91bGQgYmUgY2hlY2tlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMKKyAqICAgZnVuY3Rpb24uCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gY2ZnSWQ6ICAgICAxNi1iaXQgQ0ZHIHBhcmFtZXRlciBJRAorICogQHBhcmFtIHBCdWY6ICAgICAgYWRkcmVzcyBvZiBzdHJpbmcgYnVmZmVyCisgKiBAcGFyYW0gcExlbjogICAgICBhZGRyZXNzIG9mIG1heCBidWZmZXIgbGVuZ3RoCisgKiAgICAgICAgICAgICAgICAgICBhY3R1YWwgbGVuZ3RoIHdpbGwgYmUgcmV0dXJuZWQgYXQgdGhpcyBhZGRyZXNzCisgKgorICogQHJldHVybiBlU0lSX1NVQ0NFU1M6ICByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAqIEByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9JRDogIGludmFsaWQgQ0ZHIHBhcmFtZXRlciBJRAorICogQHJldHVybiBlU0lSX0NGR19JTlZBTElEX0xFTjogIGludmFsaWQgQ0ZHIHBhcmFtZXRlciBsZW5ndGgKKyAqCisgKi8KKwordFNpclJldFN0YXR1cyB3bGFuX2NmZ19nZXRfc3RyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGNmZ0lkLAorCQkJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90ICpwTGVuZ3RoKQoreworCXVpbnQ4X3QgKnBTcmMsICpwU3JjRW5kOworCXVpbnQzMl90IGluZGV4OworCXRTaXJSZXRTdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gY2ZnX2NoZWNrX3ZhbGlkKHBNYWMsIGNmZ0lkLCAmaW5kZXgpOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBHZXQgc3RyaW5nICovCisJcFNyYyA9ICZwTWFjLT5jZmcuZ0NmZ1NCdWZbaW5kZXhdOworCXBTcmMrKzsgICAgICAgICAvKiBza2lwIG92ZXIgbWF4IGxlbmd0aCAqLworCWlmICgqcExlbmd0aCA8ICpwU3JjKSB7CisJCVBFTE9HRShjZmdfbG9nKHBNYWMsIExPR0UsIEZMKAorCQkJIkludmFsaWQgbGVuZ3RoICVkICg8JWQpIGNmZyBpZCAlZCIpLAorCQkJKnBMZW5ndGgsICpwU3JjLCBjZmdJZCk7KQorCQkJcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfTEVOOworCX0gZWxzZSB7CisJCSpwTGVuZ3RoID0gKnBTcmMrKzsgICAgIC8qIHNhdmUgcGFyYW1ldGVyIGxlbmd0aCAqLworCQlwU3JjRW5kID0gcFNyYyArICpwTGVuZ3RoOworCQl3aGlsZSAocFNyYyA8IHBTcmNFbmQpCisJCQkqcEJ1ZisrID0gKnBTcmMrKzsKKwl9CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyoqKiBlbmQgd2xhbl9jZmdfZ2V0X3N0cigpICoqKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHdsYW5fY2ZnX2dldF9zdHJfbWF4X2xlbigpCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgYSBzdHJpbmcgbWF4aW11bSBsZW5ndGguCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiAtIEhvc3QgUlcgcGVybWlzc2lvbiBzaG91bGQgYmUgY2hlY2tlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMKKyAqICAgZnVuY3Rpb24uCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gY2ZnSWQ6ICAgICAxNi1iaXQgQ0ZHIHBhcmFtZXRlciBJRAorICogQHBhcmFtIHBMZW46ICAgICAgbWF4aW11bSBsZW5ndGggd2lsbCBiZSByZXR1cm5lZCBhdCB0aGlzIGFkZHJlc3MKKyAqCisgKiBAcmV0dXJuIGVTSVJfU1VDQ0VTUzogIHJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICogQHJldHVybiBlU0lSX0NGR19JTlZBTElEX0lEOiAgaW52YWxpZCBDRkcgcGFyYW1ldGVyIElECisgKgorICovCisKK3RTaXJSZXRTdGF0dXMgd2xhbl9jZmdfZ2V0X3N0cl9tYXhfbGVuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGNmZ0lkLAorCQkJCQl1aW50MzJfdCAqcExlbmd0aCkKK3sKKwl1aW50MzJfdCBpbmRleDsKKwl0U2lyUmV0U3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGNmZ19jaGVja192YWxpZChwTWFjLCBjZmdJZCwgJmluZGV4KTsKKworCWlmIChlU0lSX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJKnBMZW5ndGggPSBwTWFjLT5jZmcuZ0NmZ1NCdWZbaW5kZXhdOworCisJcmV0dXJuIHN0YXR1czsKK30gLyoqKiBlbmQgd2xhbl9jZmdfZ2V0X3N0cl9tYXhfbGVuKCkgKioqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogd2xhbl9jZmdfZ2V0X3N0cl9sZW4oKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IGEgc3RyaW5nIGxlbmd0aC4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIC0gSG9zdCBSVyBwZXJtaXNzaW9uIHNob3VsZCBiZSBjaGVja2VkIHByaW9yIHRvIGNhbGxpbmcgdGhpcworICogICBmdW5jdGlvbi4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBjZmdJZDogICAgIDE2LWJpdCBDRkcgcGFyYW1ldGVyIElECisgKiBAcGFyYW0gcExlbjogICAgICBjdXJyZW50IGxlbmd0aCB3aWxsIGJlIHJldHVybmVkIGF0IHRoaXMgYWRkcmVzcworICoKKyAqIEByZXR1cm4gZVNJUl9TVUNDRVNTOiAgICAgICAgIHJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICogQHJldHVybiBlU0lSX0NGR19JTlZBTElEX0lEOiAgaW52YWxpZCBDRkcgcGFyYW1ldGVyIElECisgKgorICovCisKK3RTaXJSZXRTdGF0dXMgd2xhbl9jZmdfZ2V0X3N0cl9sZW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgY2ZnSWQsCisJCXVpbnQzMl90ICpwTGVuZ3RoKQoreworCXVpbnQzMl90IGluZGV4OworCXRTaXJSZXRTdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gY2ZnX2NoZWNrX3ZhbGlkKHBNYWMsIGNmZ0lkLCAmaW5kZXgpOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwkqcExlbmd0aCA9IHBNYWMtPmNmZy5nQ2ZnU0J1ZltpbmRleCArIDFdOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKioqIGVuZCB3bGFuX2NmZ19nZXRfc3RyX2xlbigpICoqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgIGNmZ19nZXRfZG90MTFkX3RyYW5zbWl0X3Bvd2VyCisgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVndWxhdG9yeSBtYXggdHJhbnNtaXQgcG93ZXIKKyAgIFxwYXJhbSAgcE1hYworICAgXHJldHVybiB0UG93ZXJkQm0gLSBQb3dlcgorIFwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB0UG93ZXJkQm0KK2NmZ19nZXRfZG90MTFkX3RyYW5zbWl0X3Bvd2VyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGNmZ0lkLAorCQkJICAgICAgdWludDMyX3QgY2ZnTGVuZ3RoLCB1aW50OF90IGNoYW5uZWwpCit7CisJdWludDhfdCAqcENvdW50cnlJbmZvID0gTlVMTDsKKwl1aW50OF90IGNvdW50ID0gMDsKKwl0UG93ZXJkQm0gbWF4VHhQd3IgPSBXTUFfTUFYX1RYUE9XRVJfSU5WQUxJRDsKKworCS8qIEF0IGxlYXN0IG9uZSBlbGVtZW50IGlzIHByZXNlbnQgKi8KKwlpZiAoY2ZnTGVuZ3RoIDwgc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbykpIHsKKwkJUEVMT0dFKGNmZ19sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTCgiSW52YWxpZCBDRkdMRU5HVEggJWQgd2hpbGUgZ2V0dGluZyAxMWQgdHhwb3dlciIpLAorCQkJICAgICAgIGNmZ0xlbmd0aCk7CisJCSAgICAgICApCisJCWdvdG8gZXJyb3I7CisJfQorCisJcENvdW50cnlJbmZvID0gY2RmX21lbV9tYWxsb2MoY2ZnTGVuZ3RoKTsKKwlpZiAoTlVMTCA9PSBwQ291bnRyeUluZm8pIHsKKwkJY2ZnX2xvZyhwTWFjLCBMT0dQLCBGTCgiIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkiKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFRoZSBDU1Igd2lsbCBhbHdheXMgdXBkYXRlIHRoaXMgQ0ZHLiBUaGUgY29udGVudHMgd2lsbCBiZSBmcm9tIGNvdW50cnkgSUUgaWYgcmVndWxhdG9yeSBkb21haW4KKwkgKiBpcyBlbmFibGVkIG9uIEFQIGVsc2Ugd2lsbCBjb250YWluIEVFUFJPTSBjb250ZW50cworCSAqLworCWlmICh3bGFuX2NmZ19nZXRfc3RyKHBNYWMsIGNmZ0lkLCBwQ291bnRyeUluZm8sICZjZmdMZW5ndGgpICE9CisJICAgIGVTSVJfU1VDQ0VTUykgeworCQljZGZfbWVtX2ZyZWUocENvdW50cnlJbmZvKTsKKwkJcENvdW50cnlJbmZvID0gTlVMTDsKKworCQljZmdfbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgiRmFpbGVkIHRvIHJldHJpZXZlIDExZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgd2hpbGUgcmV0cmlldmluZyAxMWQgdHVwbGVzIikpOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBJZGVudGlmeSB0aGUgY2hhbm5lbCBhbmQgbWF4dHhwb3dlciAqLworCXdoaWxlIChjb3VudCA8PSAoY2ZnTGVuZ3RoIC0gKHNpemVvZih0U2lyTWFjQ2hhbkluZm8pKSkpIHsKKwkJdWludDhfdCBmaXJzdENoYW5uZWwsIG1heENoYW5uZWxzOworCisJCWZpcnN0Q2hhbm5lbCA9IHBDb3VudHJ5SW5mb1tjb3VudCsrXTsKKwkJbWF4Q2hhbm5lbHMgPSBwQ291bnRyeUluZm9bY291bnQrK107CisJCW1heFR4UHdyID0gcENvdW50cnlJbmZvW2NvdW50KytdOworCisJCWlmICgoY2hhbm5lbCA+PSBmaXJzdENoYW5uZWwpICYmCisJCSAgICAoY2hhbm5lbCA8IChmaXJzdENoYW5uZWwgKyBtYXhDaGFubmVscykpKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworZXJyb3I6CisJaWYgKE5VTEwgIT0gcENvdW50cnlJbmZvKQorCQljZGZfbWVtX2ZyZWUocENvdW50cnlJbmZvKTsKKworCXJldHVybiBtYXhUeFB3cjsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuICAgICBjZmdfZ2V0X3JlZ3VsYXRvcnlfbWF4X3RyYW5zbWl0X3Bvd2VyCisKKyAgIFxicmllZiAgR2V0cyByZWd1bGF0b3J5IHR4IHBvd2VyIG9uIHRoZSBjdXJyZW50IGNoYW5uZWwuCisKKyAgIFxwYXJhbSAgcE1hYworICAgXHBhcmFtICBjaGFubmVsCisgICBccGFyYW0gIHJmQmFuZAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFBvd2VyZEJtIGNmZ19nZXRfcmVndWxhdG9yeV9tYXhfdHJhbnNtaXRfcG93ZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBjaGFubmVsKQoreworCXVpbnQzMl90IGNmZ0xlbmd0aCA9IDA7CisJdWludDE2X3QgY2ZnSWQgPSAwOworCXRQb3dlcmRCbSBtYXhUeFB3cjsKKwllUmZCYW5kTW9kZSByZkJhbmQgPSBlUkZfQkFORF9VTktOT1dOOworCisJaWYgKChjaGFubmVsID49IFNJUl8xMUFfQ0hBTk5FTF9CRUdJTikgJiYKKwkgICAgKGNoYW5uZWwgPD0gU0lSXzExQV9DSEFOTkVMX0VORCkpCisJCXJmQmFuZCA9IGVSRl9CQU5EXzVfR0haOworCWVsc2UKKwkJcmZCYW5kID0gZVJGX0JBTkRfMl80X0dIWjsKKworCS8qIEdldCB0aGUgbWF4IHRyYW5zbWl0IHBvd2VyIGZvciBjdXJyZW50IGNoYW5uZWwgZm9yIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluICovCisJc3dpdGNoIChyZkJhbmQpIHsKKwljYXNlIGVSRl9CQU5EXzJfNF9HSFo6CisJCWNmZ0lkID0gV05JX0NGR19NQVhfVFhfUE9XRVJfMl80OworCQljZmdMZW5ndGggPSBXTklfQ0ZHX01BWF9UWF9QT1dFUl8yXzRfTEVOOworCQlQRUxPRzIoY2ZnX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cyLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiSEFMOiBSZWFkaW5nIENGRyBmb3IgMi40IEdIeiBjaGFubmVscyB0byBnZXQgcmVndWxhdG9yeSBtYXggdHggcG93ZXIiKSk7CisJCSAgICAgICApCisJCWJyZWFrOworCisJY2FzZSBlUkZfQkFORF81X0dIWjoKKwkJY2ZnSWQgPSBXTklfQ0ZHX01BWF9UWF9QT1dFUl81OworCQljZmdMZW5ndGggPSBXTklfQ0ZHX01BWF9UWF9QT1dFUl81X0xFTjsKKwkJUEVMT0cyKGNmZ19sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMiwKKwkJCSAgICAgICBGTAorCQkJCSAgICAgICAoIkhBTDogUmVhZGluZyBDRkcgZm9yIDUuMCBHSHogY2hhbm5lbHMgdG8gZ2V0IHJlZ3VsYXRvcnkgbWF4IHR4IHBvd2VyIikpOworCQkgICAgICAgKQorCQlicmVhazsKKworCWNhc2UgZVJGX0JBTkRfVU5LTk9XTjoKKwlkZWZhdWx0OgorCQlQRUxPRzIoY2ZnX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cyLAorCQkJICAgICAgIEZMKCJIQUw6IEludmFsaWQgY3VycmVudCB3b3JraW5nIGJhbmQgZm9yIHRoZSBkZXZpY2UiKSk7CisJCSAgICAgICApCisJCXJldHVybiBXTUFfTUFYX1RYUE9XRVJfSU5WQUxJRDsgICAgICAgICAvKiBJdHMgcmV0dXJuLCBub3QgYnJlYWsuICovCisJfQorCisJbWF4VHhQd3IgPSBjZmdfZ2V0X2RvdDExZF90cmFuc21pdF9wb3dlcihwTWFjLCBjZmdJZCwgY2ZnTGVuZ3RoLCBjaGFubmVsKTsKKworCXJldHVybiAobWF4VHhQd3IpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogY2ZnX2dldF9jYXBhYmlsaXR5X2luZm8KKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzIGNmZ19nZXRfY2FwYWJpbGl0eV9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90ICpwQ2FwLAorCQkJdHBQRVNlc3Npb24gc2Vzc2lvbkVudHJ5KQoreworCXVpbnQzMl90IHZhbCA9IDA7CisJdHBTaXJNYWNDYXBhYmlsaXR5SW5mbyBwQ2FwSW5mbzsKKworCSpwQ2FwID0gMDsKKwlwQ2FwSW5mbyA9ICh0cFNpck1hY0NhcGFiaWxpdHlJbmZvKSBwQ2FwOworCisJaWYgKExJTV9JU19JQlNTX1JPTEUoc2Vzc2lvbkVudHJ5KSkKKwkJcENhcEluZm8tPmlic3MgPSAxOyAgICAgLyogSUJTUyBiaXQgKi8KKwllbHNlIGlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uRW50cnkpIHx8CisJCUxJTV9JU19CVF9BTVBfQVBfUk9MRShzZXNzaW9uRW50cnkpIHx8CisJCUxJTV9JU19CVF9BTVBfU1RBX1JPTEUoc2Vzc2lvbkVudHJ5KSB8fAorCQlMSU1fSVNfU1RBX1JPTEUoc2Vzc2lvbkVudHJ5KSkKKwkJcENhcEluZm8tPmVzcyA9IDE7ICAgICAgLyogRVNTIGJpdCAqLworCWVsc2UgaWYgKExJTV9JU19QMlBfREVWSUNFX1JPTEUoc2Vzc2lvbkVudHJ5KSkgeworCQlwQ2FwSW5mby0+ZXNzID0gMDsKKwkJcENhcEluZm8tPmlic3MgPSAwOworCX0gZWxzZQorCQljZmdfbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiY2FuJ3QgZ2V0IGNhcGFiaWxpdHksIHJvbGUgaXMgVU5LTk9XTiEhIikpOworCisJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb25FbnRyeSkpIHsKKwkJdmFsID0gc2Vzc2lvbkVudHJ5LT5wcml2YWN5OworCX0gZWxzZSB7CisJCS8qIFBSSVZBQ1kgYml0ICovCisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfUFJJVkFDWV9FTkFCTEVELCAmdmFsKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQljZmdfbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoImNmZyBnZXQgV05JX0NGR19QUklWQUNZX0VOQUJMRUQgZmFpbGVkIikpOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCX0KKwlpZiAodmFsKQorCQlwQ2FwSW5mby0+cHJpdmFjeSA9IDE7CisKKwkvKiBTaG9ydCBwcmVhbWJsZSBiaXQgKi8KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFLCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJY2ZnX2xvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFIGZhaWxlZCIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJaWYgKHZhbCkKKwkJcENhcEluZm8tPnNob3J0UHJlYW1ibGUgPSAxOworCisJLyogUEJDQyBiaXQgKi8KKwlwQ2FwSW5mby0+cGJjYyA9IDA7CisKKwkvKiBDaGFubmVsIGFnaWxpdHkgYml0ICovCisJcENhcEluZm8tPmNoYW5uZWxBZ2lsaXR5ID0gMDsKKwkvKiBJZiBTVEEvQVAgb3BlcmF0aW5nIGluIDExQiBtb2RlLCBkb24ndCBzZXQgcmVzdCBvZiB0aGUgY2FwYWJpbGl0eSBpbmZvIGJpdHMuICovCisJaWYgKHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUIpCisJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKKwkvKiBTaG9ydCBzbG90IHRpbWUgYml0ICovCisJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb25FbnRyeSkpIHsKKwkJcENhcEluZm8tPnNob3J0U2xvdFRpbWUgPSBzZXNzaW9uRW50cnktPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQ7CisJfSBlbHNlIHsKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQKKwkJCSAgICAocE1hYywgV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRUQsICZ2YWwpCisJCSAgICAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCWNmZ19sb2cocE1hYywgTE9HUCwKKwkJCQlGTAorCQkJCQkoImNmZyBnZXQgV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FIGZhaWxlZCIpKTsKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCX0KKwkJLyogV2hlbiBpbiBTVEEgbW9kZSwgd2UgbmVlZCB0byBjaGVjayBpZiBzaG9ydCBzbG90IGlzIGVuYWJsZWQgYXMgd2VsbCBhcyBjaGVjayBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcKKwkJICogbW9kZSBpcyBzaG9ydCBzbG90IHRpbWUgYW5kIHRoZW4gZGVjaWRlIHdoZXRoZXIgdG8gZW5hYmxlIHNob3J0IHNsb3Qgb3Igbm90LiBJdCBpcyBzYWZlIHRvIGNoZWNrIGJvdGgKKwkJICogY2ZnIHZhbHVlcyB0byBkZXRlcm1pbmUgc2hvcnQgc2xvdCB2YWx1ZSBpbiB0aGlzIGZ1bmNuIHNpbmNlIHRoaXMgZnVuY24gaXMgYWx3YXlzIHVzZWQgYWZ0ZXIgYXNzb2Mgd2hlbgorCQkgKiB0aGVzZSBjZmcgdmFsdWVzIGFyZSBhbHJlYWR5IHNldCBiYXNlZCBvbiBwZWVyJ3MgY2FwYWJpbGl0eS4gRXZlbiBpbiBjYXNlIG9mIElCU1MsIGl0cyB2YWx1ZSBpcyBzZXQgdG8KKwkJICogY29ycmVjdCB2YWx1ZSBlaXRoZXIgaW4gZGVsQlNTIGFzIHBhcnQgb2YgZGVsZXRpbmcgdGhlIHByZXZpb3VzIElCU1Mgb3IgaW4gc3RhcnQgQlNTIGFzIHBhcnQgb2YgY29hbGVzY2luZworCQkgKi8KKwkJaWYgKHZhbCkgeworCQkJcENhcEluZm8tPnNob3J0U2xvdFRpbWUgPQorCQkJCXNlc3Npb25FbnRyeS0+c2hvcnRTbG90VGltZVN1cHBvcnRlZDsKKwkJfQorCX0KKworCS8qIFNwZWN0cnVtIE1hbmFnZW1lbnQgYml0ICovCisJaWYgKCFMSU1fSVNfSUJTU19ST0xFKHNlc3Npb25FbnRyeSkgJiYgc2Vzc2lvbkVudHJ5LT5saW0xMWhFbmFibGUpIHsKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR18xMUhfRU5BQkxFRCwgJnZhbCkgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJY2ZnX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMKCJjZmcgZ2V0IFdOSV9DRkdfMTFIX0VOQUJMRUQgZmFpbGVkIikpOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCQlpZiAodmFsKQorCQkJcENhcEluZm8tPnNwZWN0cnVtTWd0ID0gMTsKKwl9CisJLyogUW9TIGJpdCAqLworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfUU9TX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQljZmdfbG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IFdOSV9DRkdfUU9TX0VOQUJMRUQgZmFpbGVkIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlpZiAodmFsKQorCQlwQ2FwSW5mby0+cW9zID0gMTsKKworCS8qIEFQU0QgYml0ICovCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19BUFNEX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQljZmdfbG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IFdOSV9DRkdfQVBTRF9FTkFCTEVEIGZhaWxlZCIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJaWYgKHZhbCkKKwkJcENhcEluZm8tPmFwc2QgPSAxOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJaWYgKExJTV9JU19TVEFfUk9MRShzZXNzaW9uRW50cnkpKSB7CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfUlJNX0VOQUJMRUQsICZ2YWwpICE9CisJCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJCWNmZ19sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiY2ZnIGdldCBXTklfQ0ZHX1JSTV9FTkFCTEVEIGZhaWxlZCIpKTsKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCX0KKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJCVBFTE9HRShjZmdfbG9nKHBNYWMsIExPR0UsICJSUk0gPSAlZCIsIHZhbCk7KQorI2VuZGlmCisJCWlmICh2YWwpCisJCQlwQ2FwSW5mby0+cnJtID0gMTsKKwl9CisjZW5kaWYKKwkvKiBEU1NTLU9GRE0gKi8KKwkvKiBGSVhNRSA6IG5vIGNvbmZpZyBkZWZpbmVkIHlldC4gKi8KKworCS8qIEJsb2NrIGFjayBiaXQgKi8KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVELCAmdmFsKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJY2ZnX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNmZyBnZXQgV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRCBmYWlsZWQiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCXBDYXBJbmZvLT5kZWxheWVkQkEgPQorCQkodWludDE2X3QpICgodmFsID4+IFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRURfREVMQVlFRCkgJiAxKTsKKwlwQ2FwSW5mby0+aW1tZWRpYXRlQkEgPQorCQkodWludDE2X3QpICgodmFsID4+IFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRURfSU1NRURJQVRFKSAmIDEpOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogY2ZnX3NldF9jYXBhYmlsaXR5X2luZm8KKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIEJQIGJhc2VkIG9uIHRoZSBjYXBhYmlsaXRpZXMKKyAqIHJlY2VpdmVkIGluIFNNRV9KT0lOL1JFQVNTT0NfUkVRIG1lc3NhZ2UuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URTogMS4gRVNTL0lCU1MgY2FwYWJpbGl0aWVzIGFyZSBiYXNlZCBvbiBzeXN0ZW0gcm9sZS4KKyAqICAgICAgIDIuIFNpbmNlIFBCQ0MsIENoYW5uZWwgYWdpbGl0eSBhbmQgRXh0ZW5kZWQgY2FwYWJpbGl0aWVzCisgKiAgICAgICAgICBhcmUgbm90IHN1cHBvcnRlZCwgdGhleSdyZSBub3Qgc2V0IGF0IENGRworICoKKyAqIEBwYXJhbSAgcE1hYyAgIFBvaW50ZXIgdG8gZ2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgY2FwcyAgIDE2LWJpdCBDYXBhYmlsaXR5IEluZm8gZmllbGQKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgY2ZnX3NldF9jYXBhYmlsaXR5X2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgY2FwcykKK3sKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIGNmZ19jbGVhbnVwKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIENGRyBjbGVhbnVwIGZ1bmN0aW9uLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBkdXJpbmcgc3lzdGVtIHNodXRkb3duLgorICoKKyAqIEBwYXJhbSBOb25lCisgKgorICogQHJldHVybiBOb25lLgorICoKKyAqLworCit2b2lkIGNmZ19jbGVhbnVwKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJLyogU2V0IHN0YXR1cyB0byBub3QtcmVhZHkgKi8KKwlwTWFjLT5jZmcuZ0NmZ1N0YXR1cyA9IENGR19JTkNPTVBMRVRFOworCit9IC8qKiogZW5kIENmZ0NsZWFudXAoKSAqKiovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBub3RpZnkoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gbm90aWZ5IG90aGVyIG1vZHVsZXMgb2YgcGFyYW1ldGVyIHVwZGF0ZS4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBjZmdJZDogICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgSUQKKyAqIEBwYXJhbSBtYXNrOiAgICAgbm90aWZpY2F0aW9uIG1hc2sKKyAqCisgKiBAcmV0dXJuIE5vbmUuCisgKgorICovCisKK3N0YXRpYyB2b2lkIG5vdGlmeSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBjZmdJZCwgdWludDMyX3QgbnRmTWFzaykKK3sKKworCXRTaXJNc2dRIG1taE1zZzsKKworCW1taE1zZy50eXBlID0gU0lSX0NGR19QQVJBTV9VUERBVEVfSU5EOworCW1taE1zZy5ib2R5dmFsID0gKHVpbnQzMl90KSBjZmdJZDsKKwltbWhNc2cuYm9keXB0ciA9IE5VTEw7CisKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBOT19TRVNTSU9OLCBtbWhNc2cudHlwZSkpOworCisJaWYgKChudGZNYXNrICYgQ0ZHX0NUTF9OVEZfU0NIKSAhPSAwKQorCQlzY2hfcG9zdF9tZXNzYWdlKHBNYWMsICZtbWhNc2cpOworCisJaWYgKChudGZNYXNrICYgQ0ZHX0NUTF9OVEZfTElNKSAhPSAwKQorCQlsaW1fcG9zdF9tc2dfYXBpKHBNYWMsICZtbWhNc2cpOworCisJaWYgKChudGZNYXNrICYgQ0ZHX0NUTF9OVEZfSEFMKSAhPSAwKQorCQl3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbW1oTXNnKTsKKworCS8qIG5vdGlmeSBBUlEgKi8KKworfSAvKioqIGVuZCBub3RpZnkoKSAqKiovCisKKy8qKgorICogY2ZnX2dldF92ZW5kb3JfaWVfcHRyX2Zyb21fb3VpKCkgLSByZXR1cm5zIElFIHBvaW50ZXIgaW4gSUUgYnVmZmVyIGdpdmVuIGl0cworICogT1VJIGFuZCBPVUkgc2l6ZQorICogQG1hY19jdHg6ICAgIG1hYyBjb250ZXh0LgorICogQG91aTogICAgICAgIE9VSSBzdHJpbmcuCisgKiBAb3VpX3NpemU6ICAgbGVuZ3RoIG9mIE9VSSBzdHJpbmcKKyAqICAgICAgICAgICAgICBPbmUgY2FuIHByb3ZpZGUgbXVsdGlwbGUgbGluZSBkZXNjcmlwdGlvbnMKKyAqICAgICAgICAgICAgICBmb3IgYXJndW1lbnRzLgorICogQGllOiAgICAgICAgIGllIGJ1ZmZlcgorICogQGllX2xlbjogICAgIGxlbmd0aCBvZiBpZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgSUUgYnVmZmVyIGFuZCBmaW5kcyB0aGUgZ2l2ZW4gT1VJIGFuZCByZXR1cm5zIGl0cworICogcG9pbnRlcgorICoKKyAqIFJldHVybjogcG9pbnRlciBvZiBnaXZlbiBPVUkgSUUgZWxzZSBOVUxMCisgKi8KK3VpbnQ4X3QgKmNmZ19nZXRfdmVuZG9yX2llX3B0cl9mcm9tX291aSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQl1aW50OF90ICpvdWksCisJCQkJCXVpbnQ4X3Qgb3VpX3NpemUsCisJCQkJCXVpbnQ4X3QgKmllLAorCQkJCQl1aW50MTZfdCBpZV9sZW4pCit7CisJaW50MzJfdCBsZWZ0ID0gaWVfbGVuOworCXVpbnQ4X3QgKnB0ciA9IGllOworCXVpbnQ4X3QgZWxlbV9pZCwgZWxlbV9sZW47CisKKwl3aGlsZSAobGVmdCA+PSAyKSB7CisJCWVsZW1faWQgID0gcHRyWzBdOworCQllbGVtX2xlbiA9IHB0clsxXTsKKwkJbGVmdCAtPSAyOworCQlpZiAoZWxlbV9sZW4gPiBsZWZ0KSB7CisJCQljZmdfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIkludmFsaWQgSUVzIGVpZCA9ICVkIGVsZW1fbGVuPSVkIGxlZnQ9JWQiKSwKKwkJCQllbGVtX2lkLCBlbGVtX2xlbiwgbGVmdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoU0lSX01BQ19FSURfVkVORE9SID09IGVsZW1faWQpIHsKKwkJCWlmIChtZW1jbXAoJnB0clsyXSwgb3VpLCBvdWlfc2l6ZSkgPT0gMCkKKwkJCQlyZXR1cm4gcHRyOworCQl9CisKKwkJbGVmdCAtPSBlbGVtX2xlbjsKKwkJcHRyICs9IChlbGVtX2xlbiArIDIpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL2NmZy9jZmdfZGVidWcuYyBiL2NvcmUvbWFjL3NyYy9jZmcvY2ZnX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwOWM5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9jZmcvY2ZnX2RlYnVnLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIGNmZ19kZWJ1Zy5jCisKKyAgIFxicmllZiBpbXBsZW1lbnRhdGlvbiBmb3IgbG9nIERlYnVnIHJlbGF0ZWQgQVBJcworCisgICBcYXV0aG9yIFN1bml0IEJoYXRpYQorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAiY2ZnX2RlYnVnLmgiCisKK3ZvaWQgY2ZnX2xvZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBsb2dsZXZlbCwgY29uc3QgY2hhciAqcFN0cmluZywgLi4uKQoreworI2lmZGVmIFdMQU5fREVCVUcKKwkvKiBWZXJpZnkgYWdhaW5zdCBjdXJyZW50IGxvZyBsZXZlbCAqLworCWlmIChsb2dsZXZlbCA+CisJICAgIHBNYWMtPnV0aWxzLmdMb2dEYmdMZXZlbFtMT0dfSU5ERVhfRk9SX01PRFVMRShTSVJfQ0ZHX01PRFVMRV9JRCldKQorCQlyZXR1cm47CisJZWxzZSB7CisJCXZhX2xpc3QgbWFya2VyOworCisJCXZhX3N0YXJ0KG1hcmtlciwgcFN0cmluZyk7ICAgICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZSBhcmd1bWVudHMuICovCisKKwkJbG9nX2RlYnVnKHBNYWMsIFNJUl9DRkdfTU9EVUxFX0lELCBsb2dsZXZlbCwgcFN0cmluZywgbWFya2VyKTsKKworCQl2YV9lbmQobWFya2VyKTsgLyogUmVzZXQgdmFyaWFibGUgYXJndW1lbnRzLiAgICAgICovCisJfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvY2ZnL2NmZ19kZWJ1Zy5oIGIvY29yZS9tYWMvc3JjL2NmZy9jZmdfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjQxNTJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL2NmZy9jZmdfZGVidWcuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogQXV0aG9yOiAgICAgIEtldmluIE5ndXllbgorICogRGF0ZTogICAgICAgIDA0LzA5LzAyCisgKiBIaXN0b3J5Oi0KKyAqIDA0LzA5LzAyICAgICAgICBDcmVhdGVkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fQ0ZHX0RFQlVHX0hfXworI2RlZmluZSBfX0NGR19ERUJVR19IX18KKworI2luY2x1ZGUgInNpcl9kZWJ1Zy5oIgorI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgImxpbV90cmFjZS5oIgorCisjaWYgIWRlZmluZWQoX19wcmludGYpCisjZGVmaW5lIF9fcHJpbnRmKGEsIGIpCisjZW5kaWYKKwordm9pZCBfX3ByaW50ZigzLCA0KSBjZmdfbG9nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IGxvZ2xldmVsLAorCQkJICAgIGNvbnN0IGNoYXIgKnBTdHJpbmcsIC4uLik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL2NmZy9jZmdfZGVmLmggYi9jb3JlL21hYy9zcmMvY2ZnL2NmZ19kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjM5NTM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL2NmZy9jZmdfZGVmLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGlzIHRoZSBwcml2YXRlIGhlYWRlciBmaWxlIGZvciBDRkcgbW9kdWxlLgorICoKKyAqIEF1dGhvcjogICAgICAgIEtldmluIE5ndXllbgorICogRGF0ZTogICAgICAgIDAzLzIwLzAyCisgKiBIaXN0b3J5Oi0KKyAqIDAzLzIwLzAyICAgICAgICBDcmVhdGVkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmbmRlZiBfX0NGR0RFRl9ICisjZGVmaW5lIF9fQ0ZHREVGX0gKKworLyoKKyAqIENGRyBDb250cm9sIEZsYWcgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBDRkdfQ1RMX1ZBTElEICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBDRkdfQ1RMX1JFICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBDRkdfQ1RMX1dFICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBDRkdfQ1RMX0lOVCAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBDRkdfQ1RMX1NBVkUgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBDRkdfQ1RMX1JFU1RBUlQgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBDRkdfQ1RMX1JFTE9BRCAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBDRkdfQ1RMX05URl9QSFkgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBDRkdfQ1RMX05URl9NQUMgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBDRkdfQ1RMX05URl9MT0cgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBDRkdfQ1RMX05URl9IQUwgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBDRkdfQ1RMX05URl9EUEggICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBDRkdfQ1RMX05URl9BUlEgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBDRkdfQ1RMX05URl9TQ0ggICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBDRkdfQ1RMX05URl9MSU0gICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBDRkdfQ1RMX05URl9IREQgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBDRkdfQ1RMX05URl9NQVNLICAgICAgMHhGRkUwMDAwMAorCisjZGVmaW5lIENGR19DVExfTlRGX1RGUCAgICAgICBDRkdfQ1RMX05URl9NQUMKKyNkZWZpbmUgQ0ZHX0NUTF9OVEZfUkhQICAgICAgIENGR19DVExfTlRGX01BQworI2RlZmluZSBDRkdfQ1RMX05URl9SRlAgICAgICAgQ0ZHX0NUTF9OVEZfTUFDCisjZGVmaW5lIENGR19DVExfTlRGX1NQICAgICAgICBDRkdfQ1RMX05URl9NQUMKKyNkZWZpbmUgQ0ZHX0NUTF9OVEZfSFcgICAgICAgIChDRkdfQ1RMX05URl9NQUMgfCBDRkdfQ1RMX05URl9QSFkpCisKKyNkZWZpbmUgQ0ZHX0JVRl9JTkRYX01BU0sgICAgIDB4MDAwMDBmZmYKKworI2VuZGlmIC8qIF9fQ0ZHREVGX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9jZmcvY2ZnX3BhcmFtX25hbWUuYyBiL2NvcmUvbWFjL3NyYy9jZmcvY2ZnX3BhcmFtX25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGJlNTVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL2NmZy9jZmdfcGFyYW1fbmFtZS5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBETyBOT1QgRURJVCAtIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseQorICovCisKKy8qCisgKiBJTVBPUlRBTlQ6ICBUaGlzIGZpbGUgaXMgZm9yIHN5c3RlbSB0aGF0IHN1cHBvcnRzIFNUQSBtb2RlIE9OTFkuCisgKi8KKyNpbmNsdWRlICJjZmdfcHJpdi5oIgorCit1bnNpZ25lZCBjaGFyICpnX2NmZ19wYXJhbV9uYW1lW10gPSB7CisJKHVuc2lnbmVkIGNoYXIgKikiU1RBX0lEIiwKKwkodW5zaWduZWQgY2hhciAqKSJDRl9QT0xMQUJMRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiQ0ZQX1BFUklPRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiQ0ZQX01BWF9EVVJBVElPTiIsCisJKHVuc2lnbmVkIGNoYXIgKikiU1NJRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiQkVBQ09OX0lOVEVSVkFMIiwKKwkodW5zaWduZWQgY2hhciAqKSJEVElNX1BFUklPRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiV0VQX0tFWV9MRU5HVEgiLAorCSh1bnNpZ25lZCBjaGFyICopIldFUF9ERUZBVUxUX0tFWV8xIiwKKwkodW5zaWduZWQgY2hhciAqKSJXRVBfREVGQVVMVF9LRVlfMiIsCisJKHVuc2lnbmVkIGNoYXIgKikiV0VQX0RFRkFVTFRfS0VZXzMiLAorCSh1bnNpZ25lZCBjaGFyICopIldFUF9ERUZBVUxUX0tFWV80IiwKKwkodW5zaWduZWQgY2hhciAqKSJXRVBfREVGQVVMVF9LRVlJRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiRVhDTFVERV9VTkVOQ1JZUFRFRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiUlRTX1RIUkVTSE9MRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiU0hPUlRfUkVUUllfTElNSVQiLAorCSh1bnNpZ25lZCBjaGFyICopIkxPTkdfUkVUUllfTElNSVQiLAorCSh1bnNpZ25lZCBjaGFyICopIkZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIiwKKwkodW5zaWduZWQgY2hhciAqKSJBQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUiLAorCSh1bnNpZ25lZCBjaGFyICopIkFDVElWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiUEFTU0lWRV9NSU5JTVVNX0NIQU5ORUxfVElNRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiSk9JTl9GQUlMVVJFX1RJTUVPVVQiLAorCSh1bnNpZ25lZCBjaGFyICopIkFVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVQiLAorCSh1bnNpZ25lZCBjaGFyICopIkFVVEhFTlRJQ0FURV9SU1BfVElNRU9VVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUIiwKKwkodW5zaWduZWQgY2hhciAqKSJSRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiUkFfUEVSSU9ESUNJVFlfVElNRU9VVF9JTl9QUyIsCisJKHVuc2lnbmVkIGNoYXIgKikiUFNfRU5BQkxFX0JDTl9GSUxURVIiLAorCSh1bnNpZ25lZCBjaGFyICopIlBTX0VOQUJMRV9IRUFSVF9CRUFUIiwKKwkodW5zaWduZWQgY2hhciAqKSJQU19FTkFCTEVfUlNTSV9NT05JVE9SIiwKKwkodW5zaWduZWQgY2hhciAqKSJQU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiUkZfU0VUVExJTkdfVElNRV9DTEsiLAorCSh1bnNpZ25lZCBjaGFyICopIlNVUFBPUlRFRF9SQVRFU18xMUIiLAorCSh1bnNpZ25lZCBjaGFyICopIlNVUFBPUlRFRF9SQVRFU18xMUEiLAorCSh1bnNpZ25lZCBjaGFyICopIlBIWV9NT0RFIiwKKwkodW5zaWduZWQgY2hhciAqKSJET1QxMV9NT0RFIiwKKwkodW5zaWduZWQgY2hhciAqKSJPUEVSQVRJT05BTF9SQVRFX1NFVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVQiLAorCSh1bnNpZ25lZCBjaGFyICopIlBST1BSSUVUQVJZX09QRVJBVElPTkFMX1JBVEVfU0VUIiwKKwkodW5zaWduZWQgY2hhciAqKSJMSVNURU5fSU5URVJWQUwiLAorCSh1bnNpZ25lZCBjaGFyICopIlZBTElEX0NIQU5ORUxfTElTVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiQ1VSUkVOVF9DSEFOTkVMIiwKKwkodW5zaWduZWQgY2hhciAqKSJERUZBVUxUX1JBVEVfSU5ERVhfNUdIWiIsCisJKHVuc2lnbmVkIGNoYXIgKikiREVGQVVMVF9SQVRFX0lOREVYXzI0R0haIiwKKwkodW5zaWduZWQgY2hhciAqKSJSQVRFX0FEQVBUQVRJT05fVFlQRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiRklYRURfUkFURSIsCisJKHVuc2lnbmVkIGNoYXIgKikiRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFoiLAorCSh1bnNpZ25lZCBjaGFyICopIkZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFoiLAorCSh1bnNpZ25lZCBjaGFyICopIlJFVFJZUkFURV9QT0xJQ1kiLAorCSh1bnNpZ25lZCBjaGFyICopIlJFVFJZUkFURV9TRUNPTkRBUlkiLAorCSh1bnNpZ25lZCBjaGFyICopIlJFVFJZUkFURV9URVJUSUFSWSIsCisJKHVuc2lnbmVkIGNoYXIgKikiQVBTRF9FTkFCTEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSJTSEFSRURfS0VZX0FVVEhfRU5BQkxFIiwKKwkodW5zaWduZWQgY2hhciAqKSJPUEVOX1NZU1RFTV9BVVRIX0VOQUJMRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiQVVUSEVOVElDQVRJT05fVFlQRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiQ0ZfUE9MTF9SRVFVRVNUIiwKKwkodW5zaWduZWQgY2hhciAqKSJQUklWQUNZX0VOQUJMRUQiLAorCSh1bnNpZ25lZCBjaGFyICopIlNIT1JUX1BSRUFNQkxFIiwKKwkodW5zaWduZWQgY2hhciAqKSJTSE9SVF9TTE9UX1RJTUUiLAorCSh1bnNpZ25lZCBjaGFyICopIkFDQ0VQVF9TSE9SVF9TTE9UX0FTU09DX09OTFkiLAorCSh1bnNpZ25lZCBjaGFyICopIlFPU19FTkFCTEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSJIQ0ZfRU5BQkxFRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiUlNOX0VOQUJMRUQiLAorCSh1bnNpZ25lZCBjaGFyICopIkJBQ0tHUk9VTkRfU0NBTl9QRVJJT0QiLAorCSh1bnNpZ25lZCBjaGFyICopIk1BWF9OVU1fUFJFX0FVVEgiLAorCSh1bnNpZ25lZCBjaGFyICopIlBSRUFVVEhfQ0xOVVBfVElNRU9VVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiUkVMRUFTRV9BSURfVElNRU9VVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiSEVBUlRfQkVBVF9USFJFU0hPTEQiLAorCSh1bnNpZ25lZCBjaGFyICopIlBST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiTUFOVUZBQ1RVUkVSX09VSSIsCisJKHVuc2lnbmVkIGNoYXIgKikiTUFOVUZBQ1RVUkVSX05BTUUiLAorCSh1bnNpZ25lZCBjaGFyICopIk1PREVMX05VTUJFUiIsCisJKHVuc2lnbmVkIGNoYXIgKikiTU9ERUxfTkFNRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiTUFOVUZBQ1RVUkVSX1BST0RVQ1RfTkFNRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiTUFOVUZBQ1RVUkVSX1BST0RVQ1RfVkVSU0lPTiIsCisJKHVuc2lnbmVkIGNoYXIgKikiMTFEX0VOQUJMRUQiLAorCSh1bnNpZ25lZCBjaGFyICopIk1BWF9UWF9QT1dFUl8yXzQiLAorCSh1bnNpZ25lZCBjaGFyICopIk1BWF9UWF9QT1dFUl81IiwKKwkodW5zaWduZWQgY2hhciAqKSJORVRXT1JLX0RFTlNJVFkiLAorCSh1bnNpZ25lZCBjaGFyICopIkFEQVBUSVZFX1RIUkVTSE9MRF9BTEdPUklUSE0iLAorCSh1bnNpZ25lZCBjaGFyICopIkNVUlJFTlRfVFhfQU5URU5OQSIsCisJKHVuc2lnbmVkIGNoYXIgKikiQ1VSUkVOVF9SWF9BTlRFTk5BIiwKKwkodW5zaWduZWQgY2hhciAqKSJDVVJSRU5UX1RYX1BPV0VSX0xFVkVMIiwKKwkodW5zaWduZWQgY2hhciAqKSJORVdfQlNTX0ZPVU5EX0lORCIsCisJKHVuc2lnbmVkIGNoYXIgKikiUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiQVBfTk9ERV9OQU1FIiwKKwkodW5zaWduZWQgY2hhciAqKSJDT1VOVFJZX0NPREUiLAorCSh1bnNpZ25lZCBjaGFyICopIjExSF9FTkFCTEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSJXVF9DTkZfVElNRU9VVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiS0VFUEFMSVZFX1RJTUVPVVQiLAorCSh1bnNpZ25lZCBjaGFyICopIlBST1hJTUlUWSIsCisJKHVuc2lnbmVkIGNoYXIgKikiTE9HX0xFVkVMIiwKKwkodW5zaWduZWQgY2hhciAqKSJPTEJDX0RFVEVDVF9USU1FT1VUIiwKKwkodW5zaWduZWQgY2hhciAqKSJQUk9URUNUSU9OX0VOQUJMRUQiLAorCSh1bnNpZ25lZCBjaGFyICopIjExR19QUk9URUNUSU9OX0FMV0FZUyIsCisJKHVuc2lnbmVkIGNoYXIgKikiRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04iLAorCSh1bnNpZ25lZCBjaGFyICopIjExR19TSE9SVF9QUkVBTUJMRV9FTkFCTEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSIxMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRUQiLAorCSh1bnNpZ25lZCBjaGFyICopIjExR19PTkxZX1BPTElDWSIsCisJKHVuc2lnbmVkIGNoYXIgKikiUEFDS0VUX0NMQVNTSUZJQ0FUSU9OIiwKKwkodW5zaWduZWQgY2hhciAqKSJXTUVfRU5BQkxFRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiQUREVFNfUlNQX1RJTUVPVVQiLAorCSh1bnNpZ25lZCBjaGFyICopIk1BWF9TUF9MRU5HVEgiLAorCSh1bnNpZ25lZCBjaGFyICopIktFRVBfQUxJVkVfU1RBX0xJTUlUX1RIUkVTSE9MRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiU0VORF9TSU5HTEVfU1NJRF9BTFdBWVMiLAorCSh1bnNpZ25lZCBjaGFyICopIldTTV9FTkFCTEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSJFRENBX1BST0ZJTEUiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDQktfTE9DQUwiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDQkVfTE9DQUwiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDVklfTE9DQUwiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDVk9fTE9DQUwiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDQksiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDQkUiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDVkkiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDVk8iLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDQktfTE9DQUwiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDQkVfTE9DQUwiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDVklfTE9DQUwiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDVk9fTE9DQUwiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDQksiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDQkUiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDVkkiLAorCSh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDVk8iLAorCSh1bnNpZ25lZCBjaGFyICopIlJERVRfRkxBRyIsCisJKHVuc2lnbmVkIGNoYXIgKikiUkFEQVJfQ0hBTk5FTF9MSVNUIiwKKwkodW5zaWduZWQgY2hhciAqKSJMT0NBTF9QT1dFUl9DT05TVFJBSU5UIiwKKwkodW5zaWduZWQgY2hhciAqKSJBRE1JVF9QT0xJQ1kiLAorCSh1bnNpZ25lZCBjaGFyICopIkFETUlUX0JXRkFDVE9SIiwKKwkodW5zaWduZWQgY2hhciAqKSJNQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkUiLAorCSh1bnNpZ25lZCBjaGFyICopIkNIQU5ORUxfQk9ORElOR19NT0RFIiwKKwkodW5zaWduZWQgY2hhciAqKSJDQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURSIsCisJKHVuc2lnbmVkIGNoYXIgKikiRFlOQU1JQ19USFJFU0hPTERfWkVSTyIsCisJKHVuc2lnbmVkIGNoYXIgKikiRFlOQU1JQ19USFJFU0hPTERfT05FIiwKKwkodW5zaWduZWQgY2hhciAqKSJEWU5BTUlDX1RIUkVTSE9MRF9UV08iLAorCSh1bnNpZ25lZCBjaGFyICopIlRSSUdfU1RBX0JLX1NDQU4iLAorCSh1bnNpZ25lZCBjaGFyICopIkRZTkFNSUNfUFJPRklMRV9TV0lUQ0hJTkciLAorCSh1bnNpZ25lZCBjaGFyICopIlNDQU5fQ09OVFJPTF9MSVNUIiwKKwkodW5zaWduZWQgY2hhciAqKSJNSU1PX0VOQUJMRUQiLAorCSh1bnNpZ25lZCBjaGFyICopIkJMT0NLX0FDS19FTkFCTEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSJIVF9SWF9TVEJDIiwKKwkodW5zaWduZWQgY2hhciAqKSJIVF9DQVBfSU5GTyIsCisJKHVuc2lnbmVkIGNoYXIgKikiSFRfQU1QRFVfUEFSQU1TIiwKKwkodW5zaWduZWQgY2hhciAqKSJTVVBQT1JURURfTUNTX1NFVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiRVhUX0hUX0NBUF9JTkZPIiwKKwkodW5zaWduZWQgY2hhciAqKSJUWF9CRl9DQVAiLAorCSh1bnNpZ25lZCBjaGFyICopIkFTX0NBUCIsCisJKHVuc2lnbmVkIGNoYXIgKikiSFRfSU5GT19GSUVMRDEiLAorCSh1bnNpZ25lZCBjaGFyICopIkhUX0lORk9fRklFTEQyIiwKKwkodW5zaWduZWQgY2hhciAqKSJIVF9JTkZPX0ZJRUxEMyIsCisJKHVuc2lnbmVkIGNoYXIgKikiQkFTSUNfTUNTX1NFVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiQ1VSUkVOVF9NQ1NfU0VUIiwKKwkodW5zaWduZWQgY2hhciAqKSJHUkVFTkZJRUxEX0NBUEFCSUxJVFkiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9NQVhfTVBEVV9MRU5HVEgiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9TVVBQT1JURURfQ0hBTl9XSURUSF9TRVQiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9MRFBDX0NPRElOR19DQVAiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9TSE9SVF9HSV84ME1IWiIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX1NIT1JUX0dJXzE2MF9BTkRfODBfUExVU184ME1IWiIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX1RYU1RCQyIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX1JYU1RCQyIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX1NVX0JFQU1GT1JNRVJfQ0FQIiwKKwkodW5zaWduZWQgY2hhciAqKSJWSFRfU1VfQkVBTUZPUk1FRV9DQVAiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSJWSFRfTlVNX1NPVU5ESU5HX0RJTUVOU0lPTlMiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9NVV9CRUFNRk9STUVSX0NBUCIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX01VX0JFQU1GT1JNRUVfQ0FQIiwKKwkodW5zaWduZWQgY2hhciAqKSJWSFRfVFhPUF9QUyIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX0hUQ19WSFRDX0NBUCIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX0FNUERVX0xFTl9FWFBPTkVOVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX0xJTktfQURBUFRBVElPTl9DQVAiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9SWF9BTlRfUEFUVEVSTiIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX1RYX0FOVF9QQVRURVJOIiwKKwkodW5zaWduZWQgY2hhciAqKSJWSFRfUlhfTUNTX01BUCIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX1RYX01DU19NQVAiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9SWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEUiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9UWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEUiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9DSEFOTkVMX0NFTlRFUl9GUkVRX1NFR01FTlQxIiwKKwkodW5zaWduZWQgY2hhciAqKSJWSFRfQ0hBTk5FTF9DRU5URVJfRlJFUV9TRUdNRU5UMiIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUX0JBU0lDX01DU19TRVQiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9NVV9NSU1PX0NBUF9TVEFfQ09VTlQiLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF9TU19VTkRFUl9VVElMIiwKKwkodW5zaWduZWQgY2hhciAqKSJWSFRfNDBNSFpfVVRJTElaQVRJT04iLAorCSh1bnNpZ25lZCBjaGFyICopIlZIVF84ME1IWl9VVElMSVpBVElPTiIsCisJKHVuc2lnbmVkIGNoYXIgKikiVkhUXzE2ME1IWl9VVElMSVpBVElPTiIsCisJKHVuc2lnbmVkIGNoYXIgKikiTUFYX0FNU0RVX0xFTkdUSCIsCisJKHVuc2lnbmVkIGNoYXIgKikiTVBEVV9ERU5TSVRZIiwKKwkodW5zaWduZWQgY2hhciAqKSJOVU1fQlVGRl9BRFZFUlQiLAorCSh1bnNpZ25lZCBjaGFyICopIk1BWF9SWF9BTVBEVV9GQUNUT1IiLAorCSh1bnNpZ25lZCBjaGFyICopIlNIT1JUX0dJXzIwTUhaIiwKKwkodW5zaWduZWQgY2hhciAqKSJTSE9SVF9HSV80ME1IWiIsCisJKHVuc2lnbmVkIGNoYXIgKikiUklGU19FTkFCTEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSJNQVhfUFNfUE9MTCIsCisJKHVuc2lnbmVkIGNoYXIgKikiTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFIiwKKwkodW5zaWduZWQgY2hhciAqKSJSU1NJX0ZJTFRFUl9QRVJJT0QiLAorCSh1bnNpZ25lZCBjaGFyICopIk1JTl9SU1NJX1RIUkVTSE9MRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiTlRIX0JFQUNPTl9GSUxURVIiLAorCSh1bnNpZ25lZCBjaGFyICopIkJST0FEQ0FTVF9GUkFNRV9GSUxURVJfRU5BQkxFIiwKKwkodW5zaWduZWQgY2hhciAqKSJTQ0FOX0lOX1BPV0VSU0FWRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiSUdOT1JFX0RUSU0iLAorCSh1bnNpZ25lZCBjaGFyICopIldPV0xBTl9VQ0FTVF9QQVRURVJOX0ZJTFRFUl9FTkFCTEUiLAorCSh1bnNpZ25lZCBjaGFyICopIldPV0xBTl9DSEFOTkVMX1NXSVRDSF9FTkFCTEUiLAorCSh1bnNpZ25lZCBjaGFyICopIldPV0xBTl9ERUFVVEhfRU5BQkxFIiwKKwkodW5zaWduZWQgY2hhciAqKSJXT1dMQU5fRElTQVNTT0NfRU5BQkxFIiwKKwkodW5zaWduZWQgY2hhciAqKSJXT1dMQU5fTUFYX01JU1NFRF9CRUFDT04iLAorCSh1bnNpZ25lZCBjaGFyICopIldPV0xBTl9NQVhfU0xFRVBfUEVSSU9EIiwKKwkodW5zaWduZWQgY2hhciAqKSJCQV9USFJFU0hPTERfSElHSCIsCisJKHVuc2lnbmVkIGNoYXIgKikiQkdfU0NBTl9DSEFOTkVMX0xJU1QiLAorCSh1bnNpZ25lZCBjaGFyICopIk1BWF9NRURJVU1fVElNRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiTUFYX01QRFVTX0lOX0FNUERVIiwKKwkodW5zaWduZWQgY2hhciAqKSJJQlNTX0FVVE9fQlNTSUQiLAorCSh1bnNpZ25lZCBjaGFyICopIlBST0JFX1JFUV9BREROSUVfRkxBRyIsCisJKHVuc2lnbmVkIGNoYXIgKikiUFJPQkVfUkVRX0FERE5JRV9EQVRBIiwKKwkodW5zaWduZWQgY2hhciAqKSJQUk9CRV9SU1BfQURETklFX0ZMQUciLAorCSh1bnNpZ25lZCBjaGFyICopIlBST0JFX1JTUF9BREROSUVfREFUQTEiLAorCSh1bnNpZ25lZCBjaGFyICopIlBST0JFX1JTUF9BREROSUVfREFUQTIiLAorCSh1bnNpZ25lZCBjaGFyICopIlBST0JFX1JTUF9BREROSUVfREFUQTMiLAorCSh1bnNpZ25lZCBjaGFyICopIkFTU09DX1JTUF9BREROSUVfRkxBRyIsCisJKHVuc2lnbmVkIGNoYXIgKikiQVNTT0NfUlNQX0FERE5JRV9EQVRBIiwKKwkodW5zaWduZWQgY2hhciAqKSJQUk9CRV9SRVFfQURETlAyUElFX0ZMQUciLAorCSh1bnNpZ25lZCBjaGFyICopIlBST0JFX1JFUV9BREROUDJQSUVfREFUQSIsCisJKHVuc2lnbmVkIGNoYXIgKikiUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBRyIsCisJKHVuc2lnbmVkIGNoYXIgKikiUFJPQkVfUlNQX0JDTl9BREROSUVfREFUQSIsCisJKHVuc2lnbmVkIGNoYXIgKikiV1BTX0VOQUJMRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiV1BTX1NUQVRFIiwKKwkodW5zaWduZWQgY2hhciAqKSJXUFNfUFJPQkVfUkVRX0ZMQUciLAorCSh1bnNpZ25lZCBjaGFyICopIldQU19WRVJTSU9OIiwKKwkodW5zaWduZWQgY2hhciAqKSJXUFNfUkVRVUVTVF9UWVBFIiwKKwkodW5zaWduZWQgY2hhciAqKSJXUFNfQ0ZHX01FVEhPRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiV1BTX1VVSUQiLAorCSh1bnNpZ25lZCBjaGFyICopIldQU19QUklNQVJZX0RFVklDRV9DQVRFR09SWSIsCisJKHVuc2lnbmVkIGNoYXIgKikiV1BTX1BJTUFSWV9ERVZJQ0VfT1VJIiwKKwkodW5zaWduZWQgY2hhciAqKSJXUFNfREVWSUNFX1NVQl9DQVRFR09SWSIsCisJKHVuc2lnbmVkIGNoYXIgKikiV1BTX0FTU09DSUFUSU9OX1NUQVRFIiwKKwkodW5zaWduZWQgY2hhciAqKSJXUFNfQ09ORklHVVJBVElPTl9FUlJPUiIsCisJKHVuc2lnbmVkIGNoYXIgKikiV1BTX0RFVklDRV9QQVNTV09SRF9JRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiV1BTX0FTU09DX01FVEhPRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiTE9XX0dBSU5fT1ZFUlJJREUiLAorCSh1bnNpZ25lZCBjaGFyICopIkVOQUJMRV9QSFlfQUdDX0xJU1RFTl9NT0RFIiwKKwkodW5zaWduZWQgY2hhciAqKSJSUEVfUE9MTElOR19USFJFU0hPTEQiLAorCSh1bnNpZ25lZCBjaGFyICopIlJQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMF9SRUciLAorCSh1bnNpZ25lZCBjaGFyICopIlJQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUciLAorCSh1bnNpZ25lZCBjaGFyICopIlJQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMl9SRUciLAorCSh1bnNpZ25lZCBjaGFyICopIlJQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDM19SRUciLAorCSh1bnNpZ25lZCBjaGFyICopIk5PX09GX09OQ0hJUF9SRU9SREVSX1NFU1NJT05TIiwKKwkodW5zaWduZWQgY2hhciAqKSJTSU5HTEVfVElEX1JDIiwKKwkodW5zaWduZWQgY2hhciAqKSJSUk1fRU5BQkxFRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiUlJNX09QRVJBVElOR19DSEFOX01BWCIsCisJKHVuc2lnbmVkIGNoYXIgKikiUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVgiLAorCSh1bnNpZ25lZCBjaGFyICopIlRYX1BXUl9DVFJMX0VOQUJMRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkciLAorCSh1bnNpZ25lZCBjaGFyICopIkJUQ19ESENQX0JUX1NMT1RTX1RPX0JMT0NLIiwKKwkodW5zaWduZWQgY2hhciAqKSJEWU5BTUlDX1BTX1BPTExfVkFMVUUiLAorCSh1bnNpZ25lZCBjaGFyICopIlBTX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiVEVMRV9CQ05fV0FLRVVQX0VOIiwKKwkodW5zaWduZWQgY2hhciAqKSJURUxFX0JDTl9UUkFOU19MSSIsCisJKHVuc2lnbmVkIGNoYXIgKikiVEVMRV9CQ05fVFJBTlNfTElfSURMRV9CQ05TIiwKKwkodW5zaWduZWQgY2hhciAqKSJURUxFX0JDTl9NQVhfTEkiLAorCSh1bnNpZ25lZCBjaGFyICopIlRFTEVfQkNOX01BWF9MSV9JRExFX0JDTlMiLAorCSh1bnNpZ25lZCBjaGFyICopIkJUQ19BMkRQX0RIQ1BfQlRfU1VCX0lOVEVSVkFMUyIsCisJKHVuc2lnbmVkIGNoYXIgKikiSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EIiwKKwkodW5zaWduZWQgY2hhciAqKSJBU1NPQ19TVEFfTElNSVQiLAorCSh1bnNpZ25lZCBjaGFyICopIlNBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMIiwKKwkodW5zaWduZWQgY2hhciAqKSJTQVBfQ0hBTk5FTF9TRUxFQ1RfRU5EX0NIQU5ORUwiLAorCSh1bnNpZ25lZCBjaGFyICopIlNBUF9DSEFOTkVMX1NFTEVDVF9PUEVSQVRJTkdfQkFORCIsCisJKHVuc2lnbmVkIGNoYXIgKikiQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiRU5BQkxFX0NMT1NFX0xPT1AiLAorCSh1bnNpZ25lZCBjaGFyICopIkVOQUJMRV9MVEVfQ09FWCIsCisJKHVuc2lnbmVkIGNoYXIgKikiQVBfS0VFUF9BTElWRV9USU1FT1VUIiwKKwkodW5zaWduZWQgY2hhciAqKSJHT19LRUVQX0FMSVZFX1RJTUVPVVQiLAorCSh1bnNpZ25lZCBjaGFyICopIkVOQUJMRV9NQ19BRERSX0xJU1QiLAorCSh1bnNpZ25lZCBjaGFyICopIkVOQUJMRV9VQ19GSUxURVIiLAorCSh1bnNpZ25lZCBjaGFyICopIkVOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OIiwKKwkodW5zaWduZWQgY2hhciAqKSJFTkFCTEVfTUNDX0FEQVBUSVZFX1NDSEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSJESVNBQkxFX0xEUENfV0lUSF9UWEJGX0FQIiwKKwkodW5zaWduZWQgY2hhciAqKSJBUF9MSU5LX01PTklUT1JfVElNRU9VVCIsCisJKHVuc2lnbmVkIGNoYXIgKikiVERMU19RT1NfV01NX1VBUFNEX01BU0siLAorCSh1bnNpZ25lZCBjaGFyICopIlRETFNfQlVGX1NUQV9FTkFCTEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSJURExTX1BVQVBTRF9JTkFDVF9USU1FIiwKKwkodW5zaWduZWQgY2hhciAqKSJURExTX1JYX0ZSQU1FX1RIUkVTSE9MRCIsCisJKHVuc2lnbmVkIGNoYXIgKikiUE1GX1NBX1FVRVJZX01BWF9SRVRSSUVTIiwKKwkodW5zaWduZWQgY2hhciAqKSJQTUZfU0FfUVVFUllfUkVUUllfSU5URVJWQUwiLAorCSh1bnNpZ25lZCBjaGFyICopIkVOQUJMRV9BREFQVF9SWF9EUkFJTiIsCisJKHVuc2lnbmVkIGNoYXIgKikiRkxFWF9DT05ORUNUX1BPV0VSX0ZBQ1RPUiIsCisJKHVuc2lnbmVkIGNoYXIgKikiQU5URU5OQV9ESVZFU0lUWSIsCisJKHVuc2lnbmVkIGNoYXIgKikiR09fTElOS19NT05JVE9SX1RJTUVPVVQiLAorCSh1bnNpZ25lZCBjaGFyICopIlJNQ19BQ1RJT05fUEVSSU9EX0ZSRVFVRU5DWSIsCisJKHVuc2lnbmVkIGNoYXIgKikiQ1VSUkVOVF9SU1NJIiwKKwkodW5zaWduZWQgY2hhciAqKSJSVFQzX0VOQUJMRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiREVCVUdfUDJQX1JFTUFJTl9PTl9DSEFOTkVMIiwKKwkodW5zaWduZWQgY2hhciAqKSJURExTX09GRl9DSEFOTkVMX0VOQUJMRUQiLAorCSh1bnNpZ25lZCBjaGFyICopIklCU1NfQVRJTV9XSU5fU0laRSIsCisJKHVuc2lnbmVkIGNoYXIgKikiREZTX01BU1RFUl9FTkFCTEVEIiwKKwkodW5zaWduZWQgY2hhciAqKSJWSFRfRU5BQkxFX1RYQkZfMjBNSFoiLAorCSh1bnNpZ25lZCBjaGFyICopIlRETFNfV01NX01PREVfRU5BQkxFRCIsCit9OwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL2NmZy9jZmdfcHJpdi5oIGIvY29yZS9tYWMvc3JjL2NmZy9jZmdfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NzY5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvY2ZnL2NmZ19wcml2LmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGlzIHRoZSBwcml2YXRlIGhlYWRlciBmaWxlIGZvciBDRkcgbW9kdWxlLgorICoKKyAqIEF1dGhvcjogICAgICAgIEtldmluIE5ndXllbgorICogRGF0ZTogICAgICAgIDAzLzIwLzAyCisgKiBIaXN0b3J5Oi0KKyAqIDAzLzIwLzAyICAgICAgICBDcmVhdGVkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmbmRlZiBfX0NGR1BSSVZfSAorI2RlZmluZSBfX0NGR1BSSVZfSAorCisjaW5jbHVkZSA8c2lyX2NvbW1vbi5oPgorI2luY2x1ZGUgPHNpcl90eXBlcy5oPgorI2luY2x1ZGUgPHNpcl9kZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzX2FwaS5oPgorI2luY2x1ZGUgPGxpbV9hcGkuaD4KKyNpbmNsdWRlIDxzY2hfYXBpLmg+CisjaW5jbHVkZSA8Y2ZnX2FwaS5oPgorI2luY2x1ZGUgImNmZ19kZWYuaCIKKworI2luY2x1ZGUgPHduaV9jZmcuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDRkcgbWlzY2VsbGFuZW91cyBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBGdW5jdGlvbiBpbmRleCBiaXQgbWFzayAqLworI2RlZmluZSBDRkdfRlVOQ19JTkRYX01BU0sgICAweDdmCisjZGVmaW5lIENGR19HRVRfRlVOQ19JTkRYKHZhbCkgKHZhbCAmIENGR19GVU5DX0lORFhfTUFTSykKKworLyogTWFjcm8gdG8gY29udmVydCByZXR1cm4gY29kZSB0byBkZWJ1ZyBzdHJpbmcgaW5kZXggKi8KKyNkZWZpbmUgQ0ZHX0dFVF9EQkdfSU5EWCh2YWwpICh2YWwgLSBlQ0ZHX1NVQ0NFU1MgLSAxKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEJpbmFyeSBoZWFkZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCBzQ2ZnQmluSGRyIHsKKwl1aW50MzJfdCBoZHJJbmZvOworCXVpbnQzMl90IGNvbnRyb2xTaXplOworCXVpbnQzMl90IGlCdWZTaXplOworCXVpbnQzMl90IHNCdWZTaXplOworfSB0Q2ZnQmluSGRyLCAqdHBDZmdCaW5IZHI7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUG9sYXJpcyBIVyBjb3VudGVyIGFjY2VzcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBDRkdfU1RBVF9DTlRfTE9fTUFTSyAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIENGR19TVEFUX0NOVF9ISV9NQVNLICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgQ0ZHX1NUQVRfQ05UX0hJX0lOQ1IgICAgICAgMHgwMDAxMDAwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENGRyBmdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2V4dGVybiB2b2lkIGNmZ19zZW5kX2hvc3RfbXNnKHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdWludDMyX3QsIHVpbnQzMl90LAorCQkJICAgICAgdWludDMyX3QgKiwgdWludDMyX3QsIHVpbnQzMl90ICopOworCisjZW5kaWYgLyogX19DRkdQUklWX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9jZmcvY2ZnX3Byb2NfbXNnLmMgYi9jb3JlL21hYy9zcmMvY2ZnL2NmZ19wcm9jX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDc3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvY2ZnL2NmZ19wcm9jX21zZy5jCkBAIC0wLDAgKzEsMjYwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBDRkcgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIGhvc3QgbWVzc2FnZXMuCisgKi8KKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgImNmZ19wcml2LmgiCisjaW5jbHVkZSAiY2ZnX2RlYnVnLmgiCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisKK2Nnc3RhdGljIGNmZ19zdGF0aWNbQ0ZHX1BBUkFNX01BWF9OVU1dID0geworCXtXTklfQ0ZHX1NUQV9JRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX1JFTE9BRCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCTAsIDI1NSwgMX0sCisJe1dOSV9DRkdfQ0ZfUE9MTEFCTEUsCisJQ0ZHX0NUTF9SRSB8IENGR19DVExfSU5UIHwgQ0ZHX0NUTF9SRVNUQVJULAorCTAsIDI1NSwgMX0sCisJe1dOSV9DRkdfQ0ZQX1BFUklPRCwKKwlDRkdfQ1RMX1ZBTElEICB8IENGR19DVExfUkUgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0NGUF9QRVJJT0RfU1RBTUlOLAorCVdOSV9DRkdfQ0ZQX1BFUklPRF9TVEFNQVgsCisJV05JX0NGR19DRlBfUEVSSU9EX1NUQURFRn0sCisJe1dOSV9DRkdfQ0ZQX01BWF9EVVJBVElPTiwKKwlDRkdfQ1RMX1ZBTElEICB8IENGR19DVExfUkUgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT05fU1RBTUlOLAorCVdOSV9DRkdfQ0ZQX01BWF9EVVJBVElPTl9TVEFNQVgsCisJV05JX0NGR19DRlBfTUFYX0RVUkFUSU9OX1NUQURFRn0sCisJe1dOSV9DRkdfU1NJRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX1JFU1RBUlQsCisJMCwgMjU1LCA2fSwKKwl7V05JX0NGR19CRUFDT05fSU5URVJWQUwsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX1NDSCwKKwlXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTF9TVEFNSU4sCisJV05JX0NGR19CRUFDT05fSU5URVJWQUxfU1RBTUFYLAorCVdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMX1NUQURFRn0sCisJe1dOSV9DRkdfRFRJTV9QRVJJT0QsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0RUSU1fUEVSSU9EX1NUQU1JTiwKKwlXTklfQ0ZHX0RUSU1fUEVSSU9EX1NUQU1BWCwKKwlXTklfQ0ZHX0RUSU1fUEVSSU9EX1NUQURFRn0sCisJe1dOSV9DRkdfV0VQX0tFWV9MRU5HVEgsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCwKKwlXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIX1NUQU1JTiwKKwlXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIX1NUQU1BWCwKKwlXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIX1NUQURFRn0sCisJe1dOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzEsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfV0UgfCBDRkdfQ1RMX1JFU1RBUlQsCisJMCwgNjU1MzUsIDB9LAorCXtXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8yLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9SRVNUQVJULAorCTEsIDEsIDF9LAorCXtXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8zLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9SRVNUQVJULAorCTAsIDUsIDV9LAorCXtXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV80LAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9SRVNUQVJULAorCTAsIDEsIDB9LAorCXtXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRF9TVEFNSU4sCisJV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRF9TVEFNQVgsCisJV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRF9TVEFERUZ9LAorCXtXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURUQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURURfU1RBTUlOLAorCVdOSV9DRkdfRVhDTFVERV9VTkVOQ1JZUFRFRF9TVEFNQVgsCisJV05JX0NGR19FWENMVURFX1VORU5DUllQVEVEX1NUQURFRn0sCisJe1dOSV9DRkdfUlRTX1RIUkVTSE9MRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFNSU4sCisJV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1BWCwKKwlXTklfQ0ZHX1JUU19USFJFU0hPTERfU1RBREVGfSwKKwl7V05JX0NGR19TSE9SVF9SRVRSWV9MSU1JVCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVRfU1RBTUlOLAorCVdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVRfU1RBTUFYLAorCVdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVRfU1RBREVGfSwKKwl7V05JX0NGR19MT05HX1JFVFJZX0xJTUlULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19MT05HX1JFVFJZX0xJTUlUX1NUQU1JTiwKKwlXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVRfU1RBTUFYLAorCVdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVF9TVEFERUZ9LAorCXtXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNSU4sCisJV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNQVgsCisJV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFERUZ9LAorCXtXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNSU4sCisJV05JX0NGR19BQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUVfU1RBTUFYLAorCVdOSV9DRkdfQUNUSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FX1NUQURFRn0sCisJe1dOSV9DRkdfQUNUSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfQUNUSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX1NUQU1JTiwKKwlXTklfQ0ZHX0FDVElWRV9NQVhJTVVNX0NIQU5ORUxfVElNRV9TVEFNQVgsCisJV05JX0NGR19BQ1RJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBREVGfSwKKwl7V05JX0NGR19QQVNTSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfUEFTU0lWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNSU4sCisJV05JX0NGR19QQVNTSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FX1NUQU1BWCwKKwlXTklfQ0ZHX1BBU1NJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUVfU1RBREVGfSwKKwl7V05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRV9TVEFNSU4sCisJV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX1NUQU1BWCwKKwlXTklfQ0ZHX1BBU1NJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBREVGfSwKKwl7V05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0pPSU5fRkFJTFVSRV9USU1FT1VUX1NUQU1JTiwKKwlXTklfQ0ZHX0pPSU5fRkFJTFVSRV9USU1FT1VUX1NUQU1BWCwKKwlXTklfQ0ZHX0pPSU5fRkFJTFVSRV9USU1FT1VUX1NUQURFRn0sCisJe1dOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0FVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVRfU1RBTUlOLAorCVdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVF9TVEFNQVgsCisJV05JX0NGR19BVVRIRU5USUNBVEVfRkFJTFVSRV9USU1FT1VUX1NUQURFRn0sCisJe1dOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VUX1NUQU1JTiwKKwlXTklfQ0ZHX0FVVEhFTlRJQ0FURV9SU1BfVElNRU9VVF9TVEFNQVgsCisJV05JX0NGR19BVVRIRU5USUNBVEVfUlNQX1RJTUVPVVRfU1RBREVGfSwKKwl7V05JX0NGR19BU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX0FTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFNSU4sCisJV05JX0NGR19BU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVRfU1RBTUFYLAorCVdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUX1NUQURFRn0sCisJe1dOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFNSU4sCisJV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFNQVgsCisJV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFERUZ9LAorCXtXTklfQ0ZHX1JBX1BFUklPRElDSVRZX1RJTUVPVVRfSU5fUFMsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX1JBX1BFUklPRElDSVRZX1RJTUVPVVRfSU5fUFNfU1RBTUlOLAorCVdOSV9DRkdfUkFfUEVSSU9ESUNJVFlfVElNRU9VVF9JTl9QU19TVEFNQVgsCisJV05JX0NGR19SQV9QRVJJT0RJQ0lUWV9USU1FT1VUX0lOX1BTX1NUQURFRn0sCisJe1dOSV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVIsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX1BTX0VOQUJMRV9CQ05fRklMVEVSX1NUQU1JTiwKKwlXTklfQ0ZHX1BTX0VOQUJMRV9CQ05fRklMVEVSX1NUQU1BWCwKKwlXTklfQ0ZHX1BTX0VOQUJMRV9CQ05fRklMVEVSX1NUQURFRn0sCisJe1dOSV9DRkdfUFNfRU5BQkxFX0hFQVJUX0JFQVQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX1BTX0VOQUJMRV9IRUFSVF9CRUFUX1NUQU1JTiwKKwlXTklfQ0ZHX1BTX0VOQUJMRV9IRUFSVF9CRUFUX1NUQU1BWCwKKwlXTklfQ0ZHX1BTX0VOQUJMRV9IRUFSVF9CRUFUX1NUQURFRn0sCisJe1dOSV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUl9TVEFNSU4sCisJV05JX0NGR19QU19FTkFCTEVfUlNTSV9NT05JVE9SX1NUQU1BWCwKKwlXTklfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1JfU1RBREVGfSwKKwl7V05JX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfU1RBTUlOLAorCVdOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfU1RBTUFYLAorCVdOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfU1RBREVGfSwKKwl7V05JX0NGR19SRl9TRVRUTElOR19USU1FX0NMSywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfUkZfU0VUVExJTkdfVElNRV9DTEtfU1RBTUlOLAorCVdOSV9DRkdfUkZfU0VUVExJTkdfVElNRV9DTEtfU1RBTUFYLAorCVdOSV9DRkdfUkZfU0VUVExJTkdfVElNRV9DTEtfU1RBREVGfSwKKwl7V05JX0NGR19TVVBQT1JURURfUkFURVNfMTFCLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFLAorCTAsIDMsIDF9LAorCXtXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUEsIENGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFLAorCTAsIDI1NSwgMTV9LAorCXtXTklfQ0ZHX1BIWV9NT0RFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR19QSFlfTU9ERV9TVEFNSU4sCisJV05JX0NGR19QSFlfTU9ERV9TVEFNQVgsCisJV05JX0NGR19QSFlfTU9ERV9TVEFERUZ9LAorCXtXTklfQ0ZHX0RPVDExX01PREUsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfCBDRkdfQ1RMX1JFU1RBUlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX0RPVDExX01PREVfU1RBTUlOLAorCVdOSV9DRkdfRE9UMTFfTU9ERV9TVEFNQVgsCisJV05JX0NGR19ET1QxMV9NT0RFX1NUQURFRn0sCisJe1dOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9SRVNUQVJULAorCTAsIDEsIDF9LAorCXtXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCA2NTUzNSwgNjU1MzR9LAorCXtXTklfQ0ZHX1BST1BSSUVUQVJZX09QRVJBVElPTkFMX1JBVEVfU0VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19MSVNURU5fSU5URVJWQUwsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCwKKwlXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTF9TVEFNSU4sCisJV05JX0NGR19MSVNURU5fSU5URVJWQUxfU1RBTUFYLAorCVdOSV9DRkdfTElTVEVOX0lOVEVSVkFMX1NUQURFRn0sCisJe1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCTAsIDEsIDF9LAorCXtXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1JTiwKKwlXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9TVEFNQVgsCisJV05JX0NGR19DVVJSRU5UX0NIQU5ORUxfU1RBREVGfSwKKwl7V05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haX1NUQU1JTiwKKwlXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haX1NUQU1BWCwKKwlXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haX1NUQURFRn0sCisJe1dOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haX1NUQU1JTiwKKwlXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWl9TVEFNQVgsCisJV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFpfU1RBREVGfSwKKwl7V05JX0NGR19SQVRFX0FEQVBUQVRJT05fVFlQRSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfU0NILAorCVdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEVfU1RBTUlOLAorCVdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEVfU1RBTUFYLAorCVdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEVfU1RBREVGfSwKKwl7V05JX0NGR19GSVhFRF9SQVRFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19GSVhFRF9SQVRFX1NUQU1JTiwKKwlXTklfQ0ZHX0ZJWEVEX1JBVEVfU1RBTUFYLAorCVdOSV9DRkdfRklYRURfUkFURV9TVEFERUZ9LAorCXtXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzI0R0haLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWl9TVEFNSU4sCisJV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWl9TVEFNQVgsCisJV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWl9TVEFERUZ9LAorCXtXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFosCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFpfU1RBTUlOLAorCVdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWl9TVEFNQVgsCisJV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF81R0haX1NUQURFRn0sCisJe1dOSV9DRkdfUkVUUllSQVRFX1BPTElDWSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9TVEFNSU4sCisJV05JX0NGR19SRVRSWVJBVEVfUE9MSUNZX1NUQU1BWCwKKwlXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfU1RBREVGfSwKKwl7V05JX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZX1NUQU1JTiwKKwlXTklfQ0ZHX1JFVFJZUkFURV9TRUNPTkRBUllfU1RBTUFYLAorCVdOSV9DRkdfUkVUUllSQVRFX1NFQ09OREFSWV9TVEFERUZ9LAorCXtXTklfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZX1NUQU1JTiwKKwlXTklfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWV9TVEFNQVgsCisJV05JX0NGR19SRVRSWVJBVEVfVEVSVElBUllfU1RBREVGfSwKKwl7V05JX0NGR19BUFNEX0VOQUJMRUQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19BUFNEX0VOQUJMRURfU1RBTUlOLAorCVdOSV9DRkdfQVBTRF9FTkFCTEVEX1NUQU1BWCwKKwlXTklfQ0ZHX0FQU0RfRU5BQkxFRF9TVEFERUZ9LAorCXtXTklfQ0ZHX1NIQVJFRF9LRVlfQVVUSF9FTkFCTEUsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFX1NUQU1JTiwKKwlXTklfQ0ZHX1NIQVJFRF9LRVlfQVVUSF9FTkFCTEVfU1RBTUFYLAorCVdOSV9DRkdfU0hBUkVEX0tFWV9BVVRIX0VOQUJMRV9TVEFERUZ9LAorCXtXTklfQ0ZHX09QRU5fU1lTVEVNX0FVVEhfRU5BQkxFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEVfU1RBTUlOLAorCVdOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEVfU1RBTUFYLAorCVdOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEVfU1RBREVGfSwKKwl7V05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFX1NUQU1JTiwKKwlXTklfQ0ZHX0FVVEhFTlRJQ0FUSU9OX1RZUEVfU1RBTUFYLAorCVdOSV9DRkdfQVVUSEVOVElDQVRJT05fVFlQRV9TVEFERUZ9LAorCXtXTklfQ0ZHX0NGX1BPTExfUkVRVUVTVCwKKwlDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwgQ0ZHX0NUTF9SRVNUQVJULAorCTAsIDI1NSwgMX0sCisJe1dOSV9DRkdfUFJJVkFDWV9FTkFCTEVELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR19QUklWQUNZX0VOQUJMRURfU1RBTUlOLAorCVdOSV9DRkdfUFJJVkFDWV9FTkFCTEVEX1NUQU1BWCwKKwlXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRF9TVEFERUZ9LAorCXtXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR19TSE9SVF9QUkVBTUJMRV9TVEFNSU4sCisJV05JX0NGR19TSE9SVF9QUkVBTUJMRV9TVEFNQVgsCisJV05JX0NGR19TSE9SVF9QUkVBTUJMRV9TVEFERUZ9LAorCXtXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRV9TVEFNSU4sCisJV05JX0NGR19TSE9SVF9TTE9UX1RJTUVfU1RBTUFYLAorCVdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX1NUQURFRn0sCisJe1dOSV9DRkdfQUNDRVBUX1NIT1JUX1NMT1RfQVNTT0NfT05MWSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJULAorCVdOSV9DRkdfQUNDRVBUX1NIT1JUX1NMT1RfQVNTT0NfT05MWV9TVEFNSU4sCisJV05JX0NGR19BQ0NFUFRfU0hPUlRfU0xPVF9BU1NPQ19PTkxZX1NUQU1BWCwKKwlXTklfQ0ZHX0FDQ0VQVF9TSE9SVF9TTE9UX0FTU09DX09OTFlfU1RBREVGfSwKKwl7V05JX0NGR19RT1NfRU5BQkxFRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJULAorCVdOSV9DRkdfUU9TX0VOQUJMRURfU1RBTUlOLAorCVdOSV9DRkdfUU9TX0VOQUJMRURfU1RBTUFYLAorCVdOSV9DRkdfUU9TX0VOQUJMRURfU1RBREVGfSwKKwl7V05JX0NGR19IQ0ZfRU5BQkxFRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJULAorCVdOSV9DRkdfSENGX0VOQUJMRURfU1RBTUlOLAorCVdOSV9DRkdfSENGX0VOQUJMRURfU1RBTUFYLAorCVdOSV9DRkdfSENGX0VOQUJMRURfU1RBREVGfSwKKwl7V05JX0NGR19SU05fRU5BQkxFRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJULAorCVdOSV9DRkdfUlNOX0VOQUJMRURfU1RBTUlOLAorCVdOSV9DRkdfUlNOX0VOQUJMRURfU1RBTUFYLAorCVdOSV9DRkdfUlNOX0VOQUJMRURfU1RBREVGfSwKKwl7V05JX0NGR19NQVhfTlVNX1BSRV9BVVRILAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR19NQVhfTlVNX1BSRV9BVVRIX1NUQU1JTiwKKwlXTklfQ0ZHX01BWF9OVU1fUFJFX0FVVEhfU1RBTUFYLAorCVdOSV9DRkdfTUFYX05VTV9QUkVfQVVUSF9TVEFERUZ9LAorCXtXTklfQ0ZHX1BSRUFVVEhfQ0xOVVBfVElNRU9VVCwKKwlDRkdfQ1RMX0lOVCwKKwkwLCAyNTUsIDF9LAorCXtXTklfQ0ZHX1JFTEVBU0VfQUlEX1RJTUVPVVQsCisJQ0ZHX0NUTF9JTlQsCisJMCwgMjU1LCAxfSwKKwl7V05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTERfU1RBTUlOLAorCVdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTERfU1RBTUFYLAorCVdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTERfU1RBREVGfSwKKwl7V05JX0NGR19QUk9CRV9BRlRFUl9IQl9GQUlMX1RJTUVPVVQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwKKwlDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX1BST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVF9TVEFNSU4sCisJV05JX0NGR19QUk9CRV9BRlRFUl9IQl9GQUlMX1RJTUVPVVRfU1RBTUFYLAorCVdOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VUX1NUQURFRn0sCisJe1dOSV9DRkdfTUFOVUZBQ1RVUkVSX09VSSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19NQU5VRkFDVFVSRVJfTkFNRSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19NT0RFTF9OVU1CRVIsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUsCisJMCwgMCwgMH0sCisJe1dOSV9DRkdfTU9ERUxfTkFNRSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19NQU5VRkFDVFVSRVJfUFJPRFVDVF9OQU1FLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFLAorCTAsIDAsIDB9LAorCXtXTklfQ0ZHX01BTlVGQUNUVVJFUl9QUk9EVUNUX1ZFUlNJT04sCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUsCisJMCwgMCwgMH0sCisJe1dOSV9DRkdfMTFEX0VOQUJMRUQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCwKKwlXTklfQ0ZHXzExRF9FTkFCTEVEX1NUQU1JTiwKKwlXTklfQ0ZHXzExRF9FTkFCTEVEX1NUQU1BWCwKKwlXTklfQ0ZHXzExRF9FTkFCTEVEX1NUQURFRn0sCisJe1dOSV9DRkdfTUFYX1RYX1BPV0VSXzJfNCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UsCisJMCwgMCwgMH0sCisJe1dOSV9DRkdfTUFYX1RYX1BPV0VSXzUsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFLAorCTAsIDAsIDB9LAorCXtXTklfQ0ZHX05FVFdPUktfREVOU0lUWSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfTkVUV09SS19ERU5TSVRZX1NUQU1JTiwKKwlXTklfQ0ZHX05FVFdPUktfREVOU0lUWV9TVEFNQVgsCisJV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfU1RBREVGfSwKKwl7V05JX0NGR19BREFQVElWRV9USFJFU0hPTERfQUxHT1JJVEhNLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19BREFQVElWRV9USFJFU0hPTERfQUxHT1JJVEhNX1NUQU1JTiwKKwlXTklfQ0ZHX0FEQVBUSVZFX1RIUkVTSE9MRF9BTEdPUklUSE1fU1RBTUFYLAorCVdOSV9DRkdfQURBUFRJVkVfVEhSRVNIT0xEX0FMR09SSVRITV9TVEFERUZ9LAorCXtXTklfQ0ZHX0NVUlJFTlRfVFhfQU5URU5OQSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BX1NUQU1JTiwKKwlXTklfQ0ZHX0NVUlJFTlRfVFhfQU5URU5OQV9TVEFNQVgsCisJV05JX0NGR19DVVJSRU5UX1RYX0FOVEVOTkFfU1RBREVGfSwKKwl7V05JX0NGR19DVVJSRU5UX1JYX0FOVEVOTkEsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX0NVUlJFTlRfUlhfQU5URU5OQV9TVEFNSU4sCisJV05JX0NGR19DVVJSRU5UX1JYX0FOVEVOTkFfU1RBTUFYLAorCVdOSV9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BX1NUQURFRn0sCisJe1dOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0NVUlJFTlRfVFhfUE9XRVJfTEVWRUxfU1RBTUlOLAorCVdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9TVEFNQVgsCisJV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMX1NUQURFRn0sCisJe1dOSV9DRkdfTkVXX0JTU19GT1VORF9JTkQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19ORVdfQlNTX0ZPVU5EX0lORF9TVEFNSU4sCisJV05JX0NGR19ORVdfQlNTX0ZPVU5EX0lORF9TVEFNQVgsCisJV05JX0NGR19ORVdfQlNTX0ZPVU5EX0lORF9TVEFERUZ9LAorCXtXTklfQ0ZHX1BST1BSSUVUQVJZX1JBVEVTX0VOQUJMRUQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCwKKwlXTklfQ0ZHX1BST1BSSUVUQVJZX1JBVEVTX0VOQUJMRURfU1RBTUlOLAorCVdOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRF9TVEFNQVgsCisJV05JX0NGR19QUk9QUklFVEFSWV9SQVRFU19FTkFCTEVEX1NUQURFRn0sCisJe1dOSV9DRkdfQVBfTk9ERV9OQU1FLAorCUNGR19DVExfUkUsCisJMCwgMjU1LCAxfSwKKwl7V05JX0NGR19DT1VOVFJZX0NPREUsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFLAorCTAsIDAsIDB9LAorCXtXTklfQ0ZHXzExSF9FTkFCTEVELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR18xMUhfRU5BQkxFRF9TVEFNSU4sCisJV05JX0NGR18xMUhfRU5BQkxFRF9TVEFNQVgsCisJV05JX0NGR18xMUhfRU5BQkxFRF9TVEFERUZ9LAorCXtXTklfQ0ZHX1dUX0NORl9USU1FT1VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfU1RBTUlOLAorCVdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfU1RBTUFYLAorCVdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfU1RBREVGfSwKKwl7V05JX0NGR19QUk9YSU1JVFksCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX1BST1hJTUlUWV9TVEFNSU4sCisJV05JX0NGR19QUk9YSU1JVFlfU1RBTUFYLAorCVdOSV9DRkdfUFJPWElNSVRZX1NUQURFRn0sCisJe1dOSV9DRkdfTE9HX0xFVkVMLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfTE9HX0xFVkVMX1NUQU1JTiwKKwlXTklfQ0ZHX0xPR19MRVZFTF9TVEFNQVgsCisJV05JX0NGR19MT0dfTEVWRUxfU1RBREVGfSwKKwl7V05JX0NGR19PTEJDX0RFVEVDVF9USU1FT1VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfT0xCQ19ERVRFQ1RfVElNRU9VVF9TVEFNSU4sCisJV05JX0NGR19PTEJDX0RFVEVDVF9USU1FT1VUX1NUQU1BWCwKKwlXTklfQ0ZHX09MQkNfREVURUNUX1RJTUVPVVRfU1RBREVGfSwKKwl7V05JX0NGR19QUk9URUNUSU9OX0VOQUJMRUQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCB8IENGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9TVEFNSU4sCisJV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfU1RBTUFYLAorCVdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX1NUQURFRn0sCisJe1dOSV9DRkdfMTFHX1BST1RFQ1RJT05fQUxXQVlTLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR18xMUdfUFJPVEVDVElPTl9BTFdBWVNfU1RBTUlOLAorCVdOSV9DRkdfMTFHX1BST1RFQ1RJT05fQUxXQVlTX1NUQU1BWCwKKwlXTklfQ0ZHXzExR19QUk9URUNUSU9OX0FMV0FZU19TVEFERUZ9LAorCXtXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQgfCBDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9TVEFNSU4sCisJV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9TVEFNQVgsCisJV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9TVEFERUZ9LAorCXtXTklfQ0ZHXzExR19TSE9SVF9QUkVBTUJMRV9FTkFCTEVELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRF9TVEFNSU4sCisJV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRF9TVEFNQVgsCisJV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRF9TVEFERUZ9LAorCXtXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJULAorCVdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVEX1NUQU1JTiwKKwlXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9TVEFNQVgsCisJV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfU1RBREVGfSwKKwl7V05JX0NGR18xMUdfT05MWV9QT0xJQ1ksCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR18xMUdfT05MWV9QT0xJQ1lfU1RBTUlOLAorCVdOSV9DRkdfMTFHX09OTFlfUE9MSUNZX1NUQU1BWCwKKwlXTklfQ0ZHXzExR19PTkxZX1BPTElDWV9TVEFERUZ9LAorCXtXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfUEFDS0VUX0NMQVNTSUZJQ0FUSU9OX1NUQU1JTiwKKwlXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9TVEFNQVgsCisJV05JX0NGR19QQUNLRVRfQ0xBU1NJRklDQVRJT05fU1RBREVGfSwKKwl7V05JX0NGR19XTUVfRU5BQkxFRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJULAorCVdOSV9DRkdfV01FX0VOQUJMRURfU1RBTUlOLAorCVdOSV9DRkdfV01FX0VOQUJMRURfU1RBTUFYLAorCVdOSV9DRkdfV01FX0VOQUJMRURfU1RBREVGfSwKKwl7V05JX0NGR19BRERUU19SU1BfVElNRU9VVCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0FERFRTX1JTUF9USU1FT1VUX1NUQU1JTiwKKwlXTklfQ0ZHX0FERFRTX1JTUF9USU1FT1VUX1NUQU1BWCwKKwlXTklfQ0ZHX0FERFRTX1JTUF9USU1FT1VUX1NUQURFRn0sCisJe1dOSV9DRkdfTUFYX1NQX0xFTkdUSCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX01BWF9TUF9MRU5HVEhfU1RBTUlOLAorCVdOSV9DRkdfTUFYX1NQX0xFTkdUSF9TVEFNQVgsCisJV05JX0NGR19NQVhfU1BfTEVOR1RIX1NUQURFRn0sCisJe1dOSV9DRkdfS0VFUF9BTElWRV9TVEFfTElNSVRfVEhSRVNIT0xELAorCUNGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJMCwgMjU1LCAxfSwKKwl7V05JX0NGR19TRU5EX1NJTkdMRV9TU0lEX0FMV0FZUywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX1NFTkRfU0lOR0xFX1NTSURfQUxXQVlTX1NUQU1JTiwKKwlXTklfQ0ZHX1NFTkRfU0lOR0xFX1NTSURfQUxXQVlTX1NUQU1BWCwKKwlXTklfQ0ZHX1NFTkRfU0lOR0xFX1NTSURfQUxXQVlTX1NUQURFRn0sCisJe1dOSV9DRkdfV1NNX0VOQUJMRUQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19XU01fRU5BQkxFRF9TVEFNSU4sCisJV05JX0NGR19XU01fRU5BQkxFRF9TVEFNQVgsCisJV05JX0NGR19XU01fRU5BQkxFRF9TVEFERUZ9LAorCXtXTklfQ0ZHX0VEQ0FfUFJPRklMRSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfU0NILAorCVdOSV9DRkdfRURDQV9QUk9GSUxFX1NUQU1JTiwKKwlXTklfQ0ZHX0VEQ0FfUFJPRklMRV9TVEFNQVgsCisJV05JX0NGR19FRENBX1BST0ZJTEVfU1RBREVGfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ1ZJX0xPQ0FMLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ1ZPX0xPQ0FMLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ0JLLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ0JFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ1ZJLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ1ZPLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX1dNRV9BQ0JLX0xPQ0FMLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX1dNRV9BQ0JFX0xPQ0FMLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX1dNRV9BQ1ZJX0xPQ0FMLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX1dNRV9BQ1ZPX0xPQ0FMLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX1dNRV9BQ0JLLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX1dNRV9BQ0JFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX1dNRV9BQ1ZJLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19FRENBX1dNRV9BQ1ZPLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19SREVUX0ZMQUcsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19SREVUX0ZMQUdfU1RBTUlOLAorCVdOSV9DRkdfUkRFVF9GTEFHX1NUQU1BWCwKKwlXTklfQ0ZHX1JERVRfRkxBR19TVEFERUZ9LAorCXtXTklfQ0ZHX1JBREFSX0NIQU5ORUxfTElTVCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX1JFU1RBUlQsCisJMCwgMCwgMH0sCisJe1dOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJULAorCVdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVF9TVEFNSU4sCisJV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5UX1NUQU1BWCwKKwlXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlRfU1RBREVGfSwKKwl7V05JX0NGR19BRE1JVF9QT0xJQ1ksCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCwKKwlXTklfQ0ZHX0FETUlUX1BPTElDWV9TVEFNSU4sCisJV05JX0NGR19BRE1JVF9QT0xJQ1lfU1RBTUFYLAorCVdOSV9DRkdfQURNSVRfUE9MSUNZX1NUQURFRn0sCisJe1dOSV9DRkdfQURNSVRfQldGQUNUT1IsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCwKKwlXTklfQ0ZHX0FETUlUX0JXRkFDVE9SX1NUQU1JTiwKKwlXTklfQ0ZHX0FETUlUX0JXRkFDVE9SX1NUQU1BWCwKKwlXTklfQ0ZHX0FETUlUX0JXRkFDVE9SX1NUQURFRn0sCisJe1dOSV9DRkdfTUFYX0NPTlNFQ1VUSVZFX0JBQ0tHUk9VTkRfU0NBTl9GQUlMVVJFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkVfU1RBTUlOLAorCVdOSV9DRkdfTUFYX0NPTlNFQ1VUSVZFX0JBQ0tHUk9VTkRfU0NBTl9GQUlMVVJFX1NUQU1BWCwKKwlXTklfQ0ZHX01BWF9DT05TRUNVVElWRV9CQUNLR1JPVU5EX1NDQU5fRkFJTFVSRV9TVEFERUZ9LAorCXtXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQgfCBDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9TVEFNSU4sCisJV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9TVEFNQVgsCisJV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9TVEFERUZ9LAorCXtXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfU1RBTUlOLAorCVdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfU1RBTUFYLAorCVdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfU1RBREVGfSwKKwl7V05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPX1NUQU1JTiwKKwlXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk9fU1RBTUFYLAorCVdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfWkVST19TVEFERUZ9LAorCXtXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FX1NUQU1JTiwKKwlXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORV9TVEFNQVgsCisJV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9PTkVfU1RBREVGfSwKKwl7V05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV08sCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1RXT19TVEFNSU4sCisJV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV09fU1RBTUFYLAorCVdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfVFdPX1NUQURFRn0sCisJe1dOSV9DRkdfVFJJR19TVEFfQktfU0NBTiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVFJJR19TVEFfQktfU0NBTl9TVEFNSU4sCisJV05JX0NGR19UUklHX1NUQV9CS19TQ0FOX1NUQU1BWCwKKwlXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU5fU1RBREVGfSwKKwl7V05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HX1NUQU1JTiwKKwlXTklfQ0ZHX0RZTkFNSUNfUFJPRklMRV9TV0lUQ0hJTkdfU1RBTUFYLAorCVdOSV9DRkdfRFlOQU1JQ19QUk9GSUxFX1NXSVRDSElOR19TVEFERUZ9LAorCXtXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfUkVTVEFSVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCTAsIDAsIDB9LAorCXtXTklfQ0ZHX01JTU9fRU5BQkxFRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRUxPQUQsCisJV05JX0NGR19NSU1PX0VOQUJMRURfU1RBTUlOLAorCVdOSV9DRkdfTUlNT19FTkFCTEVEX1NUQU1BWCwKKwlXTklfQ0ZHX01JTU9fRU5BQkxFRF9TVEFERUZ9LAorCXtXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQgfCBDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9TVEFNSU4sCisJV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9TVEFNQVgsCisJV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9TVEFERUZ9LAorCXtXTklfQ0ZHX0hUX1JYX1NUQkMsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCB8IENGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX0hUX1JYX1NUQkNfU1RBTUlOLAorCVdOSV9DRkdfSFRfUlhfU1RCQ19TVEFNQVgsCisJV05JX0NGR19IVF9SWF9TVEJDX1NUQURFRn0sCisJe1dOSV9DRkdfSFRfQ0FQX0lORk8sCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCB8IENGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX0hUX0NBUF9JTkZPX1NUQU1JTiwKKwlXTklfQ0ZHX0hUX0NBUF9JTkZPX1NUQU1BWCwKKwlXTklfQ0ZHX0hUX0NBUF9JTkZPX1NUQURFRn0sCisJe1dOSV9DRkdfSFRfQU1QRFVfUEFSQU1TLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQgfCBDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19IVF9BTVBEVV9QQVJBTVNfU1RBTUlOLAorCVdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TX1NUQU1BWCwKKwlXTklfQ0ZHX0hUX0FNUERVX1BBUkFNU19TVEFERUZ9LAorCXtXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfU0FWRSB8CisJQ0ZHX0NUTF9SRVNUQVJUIHwgQ0ZHX0NUTF9OVEZfTElNLAorCTAsIDAsIDB9LAorCXtXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GTywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8IENGR19DVExfU0FWRSB8CisJQ0ZHX0NUTF9SRVNUQVJUIHwgQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1NUQU1JTiwKKwlXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19TVEFNQVgsCisJV05JX0NGR19FWFRfSFRfQ0FQX0lORk9fU1RBREVGfSwKKwl7V05JX0NGR19UWF9CRl9DQVAsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX0lOVCB8IENGR19DVExfUkVTVEFSVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVFhfQkZfQ0FQX1NUQU1JTiwKKwk0Mjk0OTY3Mjk1dSwKKwlXTklfQ0ZHX1RYX0JGX0NBUF9TVEFERUZ9LAorCXtXTklfQ0ZHX0FTX0NBUCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8IENGR19DVExfU0FWRSB8CisJQ0ZHX0NUTF9SRVNUQVJUIHwgQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfQVNfQ0FQX1NUQU1JTiwKKwlXTklfQ0ZHX0FTX0NBUF9TVEFNQVgsCisJV05JX0NGR19BU19DQVBfU1RBREVGfSwKKwl7V05JX0NGR19IVF9JTkZPX0ZJRUxEMSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJUIHwgQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfSFRfSU5GT19GSUVMRDFfU1RBTUlOLAorCVdOSV9DRkdfSFRfSU5GT19GSUVMRDFfU1RBTUFYLAorCVdOSV9DRkdfSFRfSU5GT19GSUVMRDFfU1RBREVGfSwKKwl7V05JX0NGR19IVF9JTkZPX0ZJRUxEMiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8IENGR19DVExfU0FWRSB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfSFRfSU5GT19GSUVMRDJfU1RBTUlOLAorCVdOSV9DRkdfSFRfSU5GT19GSUVMRDJfU1RBTUFYLAorCVdOSV9DRkdfSFRfSU5GT19GSUVMRDJfU1RBREVGfSwKKwl7V05JX0NGR19IVF9JTkZPX0ZJRUxEMywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8IENGR19DVExfU0FWRSB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfSFRfSU5GT19GSUVMRDNfU1RBTUlOLAorCVdOSV9DRkdfSFRfSU5GT19GSUVMRDNfU1RBTUFYLAorCVdOSV9DRkdfSFRfSU5GT19GSUVMRDNfU1RBREVGfSwKKwl7V05JX0NGR19CQVNJQ19NQ1NfU0VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfU0FWRSB8CisJQ0ZHX0NUTF9SRVNUQVJUIHwgQ0ZHX0NUTF9OVEZfTElNLAorCTAsIDAsIDB9LAorCXtXTklfQ0ZHX0NVUlJFTlRfTUNTX1NFVCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX1NBVkUgfAorCUNGR19DVExfUkVTVEFSVCB8IENGR19DVExfTlRGX0xJTSwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19HUkVFTkZJRUxEX0NBUEFCSUxJVFksCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfCBDRkdfQ1RMX1JFU1RBUlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWV9TVEFNSU4sCisJV05JX0NGR19HUkVFTkZJRUxEX0NBUEFCSUxJVFlfU1RBTUFYLAorCVdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX01BWF9NUERVX0xFTkdUSCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVkhUX01BWF9NUERVX0xFTkdUSF9TVEFNSU4sCisJV05JX0NGR19WSFRfTUFYX01QRFVfTEVOR1RIX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9NQVhfTVBEVV9MRU5HVEhfU1RBREVGfSwKKwl7V05JX0NGR19WSFRfU1VQUE9SVEVEX0NIQU5fV0lEVEhfU0VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfU1VQUE9SVEVEX0NIQU5fV0lEVEhfU0VUX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9TVVBQT1JURURfQ0hBTl9XSURUSF9TRVRfU1RBTUFYLAorCVdOSV9DRkdfVkhUX1NVUFBPUlRFRF9DSEFOX1dJRFRIX1NFVF9TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9MRFBDX0NPRElOR19DQVAsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9MRFBDX0NPRElOR19DQVBfU1RBTUlOLAorCVdOSV9DRkdfVkhUX0xEUENfQ09ESU5HX0NBUF9TVEFNQVgsCisJV05JX0NGR19WSFRfTERQQ19DT0RJTkdfQ0FQX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX1NIT1JUX0dJXzgwTUhaLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfU0hPUlRfR0lfODBNSFpfU1RBTUlOLAorCVdOSV9DRkdfVkhUX1NIT1JUX0dJXzgwTUhaX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9TSE9SVF9HSV84ME1IWl9TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9TSE9SVF9HSV8xNjBfQU5EXzgwX1BMVVNfODBNSFosCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9TSE9SVF9HSV8xNjBfQU5EXzgwX1BMVVNfODBNSFpfU1RBTUlOLAorCVdOSV9DRkdfVkhUX1NIT1JUX0dJXzE2MF9BTkRfODBfUExVU184ME1IWl9TVEFNQVgsCisJV05JX0NGR19WSFRfU0hPUlRfR0lfMTYwX0FORF84MF9QTFVTXzgwTUhaX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX1RYU1RCQywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVkhUX1RYU1RCQ19TVEFNSU4sCisJV05JX0NGR19WSFRfVFhTVEJDX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9UWFNUQkNfU1RBREVGfSwKKwl7V05JX0NGR19WSFRfUlhTVEJDLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfUlhTVEJDX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9SWFNUQkNfU1RBTUFYLAorCVdOSV9DRkdfVkhUX1JYU1RCQ19TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVSX0NBUCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVkhUX1NVX0JFQU1GT1JNRVJfQ0FQX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVSX0NBUF9TVEFNQVgsCisJV05JX0NGR19WSFRfU1VfQkVBTUZPUk1FUl9DQVBfU1RBREVGfSwKKwl7V05JX0NGR19WSFRfU1VfQkVBTUZPUk1FRV9DQVAsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVFX0NBUF9TVEFNSU4sCisJV05JX0NGR19WSFRfU1VfQkVBTUZPUk1FRV9DQVBfU1RBTUFYLAorCVdOSV9DRkdfVkhUX1NVX0JFQU1GT1JNRUVfQ0FQX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX0NTTl9CRUFNRk9STUVFX0FOVF9TVVBQT1JURUQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVEX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVEX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVEX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX05VTV9TT1VORElOR19ESU1FTlNJT05TLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfTlVNX1NPVU5ESU5HX0RJTUVOU0lPTlNfU1RBTUlOLAorCVdOSV9DRkdfVkhUX05VTV9TT1VORElOR19ESU1FTlNJT05TX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9OVU1fU09VTkRJTkdfRElNRU5TSU9OU19TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9NVV9CRUFNRk9STUVSX0NBUCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRVJfQ0FQX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9NVV9CRUFNRk9STUVSX0NBUF9TVEFNQVgsCisJV05JX0NGR19WSFRfTVVfQkVBTUZPUk1FUl9DQVBfU1RBREVGfSwKKwl7V05JX0NGR19WSFRfTVVfQkVBTUZPUk1FRV9DQVAsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9NVV9CRUFNRk9STUVFX0NBUF9TVEFNSU4sCisJV05JX0NGR19WSFRfTVVfQkVBTUZPUk1FRV9DQVBfU1RBTUFYLAorCVdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRUVfQ0FQX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX1RYT1BfUFMsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9UWE9QX1BTX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9UWE9QX1BTX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9UWE9QX1BTX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX0hUQ19WSFRDX0NBUCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVkhUX0hUQ19WSFRDX0NBUF9TVEFNSU4sCisJV05JX0NGR19WSFRfSFRDX1ZIVENfQ0FQX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9IVENfVkhUQ19DQVBfU1RBREVGfSwKKwl7V05JX0NGR19WSFRfQU1QRFVfTEVOX0VYUE9ORU5ULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfQU1QRFVfTEVOX0VYUE9ORU5UX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9BTVBEVV9MRU5fRVhQT05FTlRfU1RBTUFYLAorCVdOSV9DRkdfVkhUX0FNUERVX0xFTl9FWFBPTkVOVF9TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9MSU5LX0FEQVBUQVRJT05fQ0FQLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfTElOS19BREFQVEFUSU9OX0NBUF9TVEFNSU4sCisJV05JX0NGR19WSFRfTElOS19BREFQVEFUSU9OX0NBUF9TVEFNQVgsCisJV05JX0NGR19WSFRfTElOS19BREFQVEFUSU9OX0NBUF9TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9SWF9BTlRfUEFUVEVSTiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVkhUX1JYX0FOVF9QQVRURVJOX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9SWF9BTlRfUEFUVEVSTl9TVEFNQVgsCisJV05JX0NGR19WSFRfUlhfQU5UX1BBVFRFUk5fU1RBREVGfSwKKwl7V05JX0NGR19WSFRfVFhfQU5UX1BBVFRFUk4sCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9UWF9BTlRfUEFUVEVSTl9TVEFNSU4sCisJV05JX0NGR19WSFRfVFhfQU5UX1BBVFRFUk5fU1RBTUFYLAorCVdOSV9DRkdfVkhUX1RYX0FOVF9QQVRURVJOX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX1JYX01DU19NQVAsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9SWF9NQ1NfTUFQX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9SWF9NQ1NfTUFQX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9SWF9NQ1NfTUFQX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX1RYX01DU19NQVAsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9UWF9NQ1NfTUFQX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9UWF9NQ1NfTUFQX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9UWF9NQ1NfTUFQX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX1JYX0hJR0hFU1RfU1VQUE9SVEVEX0RBVEFfUkFURSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVkhUX1JYX0hJR0hFU1RfU1VQUE9SVEVEX0RBVEFfUkFURV9TVEFNSU4sCisJV05JX0NGR19WSFRfUlhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9SWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEVfU1RBREVGfSwKKwl7V05JX0NGR19WSFRfVFhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfVFhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9UWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEVfU1RBTUFYLAorCVdOSV9DRkdfVkhUX1RYX0hJR0hFU1RfU1VQUE9SVEVEX0RBVEFfUkFURV9TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9DSEFOTkVMX0NFTlRFUl9GUkVRX1NFR01FTlQxLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfQ0hBTk5FTF9DRU5URVJfRlJFUV9TRUdNRU5UMV9TVEFNSU4sCisJV05JX0NGR19WSFRfQ0hBTk5FTF9DRU5URVJfRlJFUV9TRUdNRU5UMV9TVEFNQVgsCisJV05JX0NGR19WSFRfQ0hBTk5FTF9DRU5URVJfRlJFUV9TRUdNRU5UMV9TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9DSEFOTkVMX0NFTlRFUl9GUkVRX1NFR01FTlQyLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfQ0hBTk5FTF9DRU5URVJfRlJFUV9TRUdNRU5UMl9TVEFNSU4sCisJV05JX0NGR19WSFRfQ0hBTk5FTF9DRU5URVJfRlJFUV9TRUdNRU5UMl9TVEFNQVgsCisJV05JX0NGR19WSFRfQ0hBTk5FTF9DRU5URVJfRlJFUV9TRUdNRU5UMl9TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9CQVNJQ19NQ1NfU0VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfQkFTSUNfTUNTX1NFVF9TVEFNSU4sCisJV05JX0NGR19WSFRfQkFTSUNfTUNTX1NFVF9TVEFNQVgsCisJV05JX0NGR19WSFRfQkFTSUNfTUNTX1NFVF9TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9NVV9NSU1PX0NBUF9TVEFfQ09VTlQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9NVV9NSU1PX0NBUF9TVEFfQ09VTlRfU1RBTUlOLAorCVdOSV9DRkdfVkhUX01VX01JTU9fQ0FQX1NUQV9DT1VOVF9TVEFNQVgsCisJV05JX0NGR19WSFRfTVVfTUlNT19DQVBfU1RBX0NPVU5UX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUX1NTX1VOREVSX1VUSUwsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1ZIVF9TU19VTkRFUl9VVElMX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF9TU19VTkRFUl9VVElMX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9TU19VTkRFUl9VVElMX1NUQURFRn0sCisJe1dOSV9DRkdfVkhUXzQwTUhaX1VUSUxJWkFUSU9OLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfNDBNSFpfVVRJTElaQVRJT05fU1RBTUlOLAorCVdOSV9DRkdfVkhUXzQwTUhaX1VUSUxJWkFUSU9OX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF80ME1IWl9VVElMSVpBVElPTl9TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF84ME1IWl9VVElMSVpBVElPTiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVkhUXzgwTUhaX1VUSUxJWkFUSU9OX1NUQU1JTiwKKwlXTklfQ0ZHX1ZIVF84ME1IWl9VVElMSVpBVElPTl9TVEFNQVgsCisJV05JX0NGR19WSFRfODBNSFpfVVRJTElaQVRJT05fU1RBREVGfSwKKwl7V05JX0NGR19WSFRfMTYwTUhaX1VUSUxJWkFUSU9OLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19WSFRfODBNSFpfVVRJTElaQVRJT05fU1RBREVGLAorCVdOSV9DRkdfVkhUXzE2ME1IWl9VVElMSVpBVElPTl9TVEFNQVgsCisJV05JX0NGR19WSFRfMTYwTUhaX1VUSUxJWkFUSU9OX1NUQURFRn0sCisJe1dOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJUIHwgQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSF9TVEFNSU4sCisJV05JX0NGR19NQVhfQU1TRFVfTEVOR1RIX1NUQU1BWCwKKwlXTklfQ0ZHX01BWF9BTVNEVV9MRU5HVEhfU1RBREVGfSwKKwl7V05JX0NGR19NUERVX0RFTlNJVFksCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCB8IENGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX01QRFVfREVOU0lUWV9TVEFNSU4sCisJV05JX0NGR19NUERVX0RFTlNJVFlfU1RBTUFYLAorCVdOSV9DRkdfTVBEVV9ERU5TSVRZX1NUQURFRn0sCisJe1dOSV9DRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJUIHwgQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9TVEFNSU4sCisJV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SX1NUQU1BWCwKKwlXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfU1RBTUFYfSwKKwl7V05JX0NGR19TSE9SVF9HSV8yME1IWiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJUIHwgQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfU1RBTUlOLAorCVdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfU1RBTUFYLAorCVdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfU1RBREVGfSwKKwl7V05JX0NGR19TSE9SVF9HSV80ME1IWiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9SRVNUQVJUIHwgQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfU1RBTUlOLAorCVdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfU1RBTUFYLAorCVdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfU1RBREVGfSwKKwl7V05JX0NGR19SSUZTX0VOQUJMRUQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCwKKwlXTklfQ0ZHX1JJRlNfRU5BQkxFRF9TVEFNSU4sCisJV05JX0NGR19SSUZTX0VOQUJMRURfU1RBTUFYLAorCVdOSV9DRkdfUklGU19FTkFCTEVEX1NUQURFRn0sCisJe1dOSV9DRkdfTUFYX1BTX1BPTEwsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX01BWF9QU19QT0xMX1NUQU1JTiwKKwlXTklfQ0ZHX01BWF9QU19QT0xMX1NUQU1BWCwKKwlXTklfQ0ZHX01BWF9QU19QT0xMX1NUQURFRn0sCisJe1dOSV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0VfU1RBTUlOLAorCVdOSV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFX1NUQU1BWCwKKwlXTklfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRV9TVEFERUZ9LAorCXtXTklfQ0ZHX1JTU0lfRklMVEVSX1BFUklPRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfUlNTSV9GSUxURVJfUEVSSU9EX1NUQU1JTiwKKwlXTklfQ0ZHX1JTU0lfRklMVEVSX1BFUklPRF9TVEFNQVgsCisJV05JX0NGR19SU1NJX0ZJTFRFUl9QRVJJT0RfU1RBREVGfSwKKwl7V05JX0NGR19NSU5fUlNTSV9USFJFU0hPTEQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX01JTl9SU1NJX1RIUkVTSE9MRF9TVEFNSU4sCisJV05JX0NGR19NSU5fUlNTSV9USFJFU0hPTERfU1RBTUFYLAorCVdOSV9DRkdfTUlOX1JTU0lfVEhSRVNIT0xEX1NUQURFRn0sCisJe1dOSV9DRkdfQlJPQURDQVNUX0ZSQU1FX0ZJTFRFUl9FTkFCTEUsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX0JST0FEQ0FTVF9GUkFNRV9GSUxURVJfRU5BQkxFX1NUQU1JTiwKKwlXTklfQ0ZHX0JST0FEQ0FTVF9GUkFNRV9GSUxURVJfRU5BQkxFX1NUQU1BWCwKKwlXTklfQ0ZHX0JST0FEQ0FTVF9GUkFNRV9GSUxURVJfRU5BQkxFX1NUQURFRn0sCisJe1dOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkUsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFX1NUQU1JTiwKKwlXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFX1NUQU1BWCwKKwlXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFX1NUQURFRn0sCisJe1dOSV9DRkdfSUdOT1JFX0RUSU0sCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19JR05PUkVfRFRJTV9TVEFNSU4sCisJV05JX0NGR19JR05PUkVfRFRJTV9TVEFNQVgsCisJV05JX0NGR19JR05PUkVfRFRJTV9TVEFERUZ9LAorCXtXTklfQ0ZHX1dPV0xBTl9VQ0FTVF9QQVRURVJOX0ZJTFRFUl9FTkFCTEUsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19XT1dMQU5fVUNBU1RfUEFUVEVSTl9GSUxURVJfRU5BQkxFX1NUQU1JTiwKKwlXTklfQ0ZHX1dPV0xBTl9VQ0FTVF9QQVRURVJOX0ZJTFRFUl9FTkFCTEVfU1RBTUFYLAorCVdOSV9DRkdfV09XTEFOX1VDQVNUX1BBVFRFUk5fRklMVEVSX0VOQUJMRV9TVEFERUZ9LAorCXtXTklfQ0ZHX1dPV0xBTl9DSEFOTkVMX1NXSVRDSF9FTkFCTEUsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19XT1dMQU5fQ0hBTk5FTF9TV0lUQ0hfRU5BQkxFX1NUQU1JTiwKKwlXTklfQ0ZHX1dPV0xBTl9DSEFOTkVMX1NXSVRDSF9FTkFCTEVfU1RBTUFYLAorCVdOSV9DRkdfV09XTEFOX0NIQU5ORUxfU1dJVENIX0VOQUJMRV9TVEFERUZ9LAorCXtXTklfQ0ZHX1dPV0xBTl9ERUFVVEhfRU5BQkxFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfV09XTEFOX0RFQVVUSF9FTkFCTEVfU1RBTUlOLAorCVdOSV9DRkdfV09XTEFOX0RFQVVUSF9FTkFCTEVfU1RBTUFYLAorCVdOSV9DRkdfV09XTEFOX0RFQVVUSF9FTkFCTEVfU1RBREVGfSwKKwl7V05JX0NGR19XT1dMQU5fRElTQVNTT0NfRU5BQkxFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfV09XTEFOX0RJU0FTU09DX0VOQUJMRV9TVEFNSU4sCisJV05JX0NGR19XT1dMQU5fRElTQVNTT0NfRU5BQkxFX1NUQU1BWCwKKwlXTklfQ0ZHX1dPV0xBTl9ESVNBU1NPQ19FTkFCTEVfU1RBREVGfSwKKwl7V05JX0NGR19XT1dMQU5fTUFYX01JU1NFRF9CRUFDT04sCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19XT1dMQU5fTUFYX01JU1NFRF9CRUFDT05fU1RBTUlOLAorCVdOSV9DRkdfV09XTEFOX01BWF9NSVNTRURfQkVBQ09OX1NUQU1BWCwKKwlXTklfQ0ZHX1dPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTl9TVEFERUZ9LAorCXtXTklfQ0ZHX1dPV0xBTl9NQVhfU0xFRVBfUEVSSU9ELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfV09XTEFOX01BWF9TTEVFUF9QRVJJT0RfU1RBTUlOLAorCVdOSV9DRkdfV09XTEFOX01BWF9TTEVFUF9QRVJJT0RfU1RBTUFYLAorCVdOSV9DRkdfV09XTEFOX01BWF9TTEVFUF9QRVJJT0RfU1RBREVGfSwKKwl7V05JX0NGR19CR19TQ0FOX0NIQU5ORUxfTElTVCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX05URl9MSU0sCisJMCwgMCwgMH0sCisJe1dOSV9DRkdfTUFYX01FRElVTV9USU1FLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19NQVhfTUVESVVNX1RJTUVfU1RBTUlOLAorCVdOSV9DRkdfTUFYX01FRElVTV9USU1FX1NUQU1BWCwKKwlXTklfQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFERUZ9LAorCXtXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfTUFYX01QRFVTX0lOX0FNUERVX1NUQU1JTiwKKwlXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVV9TVEFNQVgsCisJV05JX0NGR19NQVhfTVBEVVNfSU5fQU1QRFVfU1RBREVGfSwKKwl7V05JX0NGR19JQlNTX0FVVE9fQlNTSUQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19JQlNTX0FVVE9fQlNTSURfU1RBTUlOLAorCVdOSV9DRkdfSUJTU19BVVRPX0JTU0lEX1NUQU1BWCwKKwlXTklfQ0ZHX0lCU1NfQVVUT19CU1NJRF9TVEFERUZ9LAorCXtXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfRkxBRywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfRkxBR19TVEFNSU4sCisJV05JX0NGR19QUk9CRV9SRVFfQURETklFX0ZMQUdfU1RBTUFYLAorCVdOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9GTEFHX1NUQURFRn0sCisJe1dOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9EQVRBLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19QUk9CRV9SU1BfQURETklFX0ZMQUcsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19QUk9CRV9SU1BfQURETklFX0ZMQUdfU1RBTUlOLAorCVdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHX1NUQU1BWCwKKwlXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfRkxBR19TVEFERUZ9LAorCXtXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTEsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFLAorCTAsIDAsIDB9LAorCXtXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTIsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFLAorCTAsIDAsIDB9LAorCXtXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTMsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFLAorCTAsIDAsIDB9LAorCXtXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBRywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBR19TVEFNSU4sCisJV05JX0NGR19BU1NPQ19SU1BfQURETklFX0ZMQUdfU1RBTUFYLAorCVdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9GTEFHX1NUQURFRn0sCisJe1dOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9EQVRBLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0ZMQUcsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0ZMQUdfU1RBTUlOLAorCVdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9GTEFHX1NUQU1BWCwKKwlXTklfQ0ZHX1BST0JFX1JFUV9BREROUDJQSUVfRkxBR19TVEFERUZ9LAorCXtXTklfQ0ZHX1BST0JFX1JFUV9BREROUDJQSUVfREFUQSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UsCisJMCwgMCwgMH0sCisJe1dOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBRywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBR19TVEFNSU4sCisJV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHX1NUQU1BWCwKKwlXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0ZMQUdfU1RBREVGfSwKKwl7V05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfTlRGX0xJTSwKKwkwLCAwLCAwfSwKKwl7V05JX0NGR19XUFNfRU5BQkxFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19XUFNfRU5BQkxFX1NUQU1JTiwKKwlXTklfQ0ZHX1dQU19FTkFCTEVfU1RBTUFYLAorCVdOSV9DRkdfV1BTX0VOQUJMRV9TVEFERUZ9LAorCXtXTklfQ0ZHX1dQU19TVEFURSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfV1BTX1NUQVRFX1NUQU1JTiwKKwlXTklfQ0ZHX1dQU19TVEFURV9TVEFNQVgsCisJV05JX0NGR19XUFNfU1RBVEVfU1RBREVGfSwKKwl7V05JX0NGR19XUFNfUFJPQkVfUkVRX0ZMQUcsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1dQU19QUk9CRV9SRVFfRkxBR19TVEFNSU4sCisJV05JX0NGR19XUFNfUFJPQkVfUkVRX0ZMQUdfU1RBTUFYLAorCVdOSV9DRkdfV1BTX1BST0JFX1JFUV9GTEFHX1NUQURFRn0sCisJe1dOSV9DRkdfV1BTX1ZFUlNJT04sCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1dQU19WRVJTSU9OX1NUQU1JTiwKKwlXTklfQ0ZHX1dQU19WRVJTSU9OX1NUQU1BWCwKKwlXTklfQ0ZHX1dQU19WRVJTSU9OX1NUQURFRn0sCisJe1dOSV9DRkdfV1BTX1JFUVVFU1RfVFlQRSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfV1BTX1JFUVVFU1RfVFlQRV9TVEFNSU4sCisJV05JX0NGR19XUFNfUkVRVUVTVF9UWVBFX1NUQU1BWCwKKwlXTklfQ0ZHX1dQU19SRVFVRVNUX1RZUEVfU1RBREVGfSwKKwl7V05JX0NGR19XUFNfQ0ZHX01FVEhPRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfV1BTX0NGR19NRVRIT0RfU1RBTUlOLAorCTQyOTQ5NjcyOTV1LAorCVdOSV9DRkdfV1BTX0NGR19NRVRIT0RfU1RBREVGfSwKKwl7V05JX0NGR19XUFNfVVVJRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX05URl9MSU0sCisJMCwgMCwgMH0sCisJe1dOSV9DRkdfV1BTX1BSSU1BUllfREVWSUNFX0NBVEVHT1JZLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19XUFNfUFJJTUFSWV9ERVZJQ0VfQ0FURUdPUllfU1RBTUlOLAorCVdOSV9DRkdfV1BTX1BSSU1BUllfREVWSUNFX0NBVEVHT1JZX1NUQU1BWCwKKwlXTklfQ0ZHX1dQU19QUklNQVJZX0RFVklDRV9DQVRFR09SWV9TVEFERUZ9LAorCXtXTklfQ0ZHX1dQU19QSU1BUllfREVWSUNFX09VSSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfV1BTX1BJTUFSWV9ERVZJQ0VfT1VJX1NUQU1JTiwKKwk0Mjk0OTY3Mjk1dSwKKwlXTklfQ0ZHX1dQU19QSU1BUllfREVWSUNFX09VSV9TVEFERUZ9LAorCXtXTklfQ0ZHX1dQU19ERVZJQ0VfU1VCX0NBVEVHT1JZLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19XUFNfREVWSUNFX1NVQl9DQVRFR09SWV9TVEFNSU4sCisJV05JX0NGR19XUFNfREVWSUNFX1NVQl9DQVRFR09SWV9TVEFNQVgsCisJV05JX0NGR19XUFNfREVWSUNFX1NVQl9DQVRFR09SWV9TVEFERUZ9LAorCXtXTklfQ0ZHX1dQU19BU1NPQ0lBVElPTl9TVEFURSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfV1BTX0FTU09DSUFUSU9OX1NUQVRFX1NUQU1JTiwKKwlXTklfQ0ZHX1dQU19BU1NPQ0lBVElPTl9TVEFURV9TVEFNQVgsCisJV05JX0NGR19XUFNfQVNTT0NJQVRJT05fU1RBVEVfU1RBREVGfSwKKwl7V05JX0NGR19XUFNfQ09ORklHVVJBVElPTl9FUlJPUiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1JfU1RBTUlOLAorCVdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1JfU1RBTUFYLAorCVdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1JfU1RBREVGfSwKKwl7V05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEX1NUQU1JTiwKKwk0Mjk0OTY3Mjk1dSwKKwlXTklfQ0ZHX1dQU19ERVZJQ0VfUEFTU1dPUkRfSURfU1RBREVGfSwKKwl7V05JX0NGR19XUFNfQVNTT0NfTUVUSE9ELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9MSU0sCisJV05JX0NGR19XUFNfQVNTT0NfTUVUSE9EX1NUQU1JTiwKKwlXTklfQ0ZHX1dQU19BU1NPQ19NRVRIT0RfU1RBTUFYLAorCVdOSV9DRkdfV1BTX0FTU09DX01FVEhPRF9TVEFERUZ9LAorCXtXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19MT1dfR0FJTl9PVkVSUklERV9TVEFNSU4sCisJV05JX0NGR19MT1dfR0FJTl9PVkVSUklERV9TVEFNQVgsCisJV05JX0NGR19MT1dfR0FJTl9PVkVSUklERV9TVEFERUZ9LAorCXtXTklfQ0ZHX0VOQUJMRV9QSFlfQUdDX0xJU1RFTl9NT0RFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERV9TVEFNSU4sCisJV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERV9TVEFNQVgsCisJV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERV9TVEFERUZ9LAorCXtXTklfQ0ZHX1JQRV9QT0xMSU5HX1RIUkVTSE9MRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfUlBFX1BPTExJTkdfVEhSRVNIT0xEX1NUQU1JTiwKKwlXTklfQ0ZHX1JQRV9QT0xMSU5HX1RIUkVTSE9MRF9TVEFNQVgsCisJV05JX0NGR19SUEVfUE9MTElOR19USFJFU0hPTERfU1RBREVGfSwKKwl7V05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzBfUkVHLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzBfUkVHX1NUQU1JTiwKKwlXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMF9SRUdfU1RBTUFYLAorCVdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMwX1JFR19TVEFERUZ9LAorCXtXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUcsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUdfU1RBTUlOLAorCVdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMxX1JFR19TVEFNQVgsCisJV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzFfUkVHX1NUQURFRn0sCisJe1dOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMyX1JFRywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMyX1JFR19TVEFNSU4sCisJV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzJfUkVHX1NUQU1BWCwKKwlXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMl9SRUdfU1RBREVGfSwKKwl7V05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzNfUkVHLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzNfUkVHX1NUQU1JTiwKKwlXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDM19SRUdfU1RBTUFYLAorCVdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMzX1JFR19TVEFERUZ9LAorCXtXTklfQ0ZHX05PX09GX09OQ0hJUF9SRU9SREVSX1NFU1NJT05TLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19OT19PRl9PTkNISVBfUkVPUkRFUl9TRVNTSU9OU19TVEFNSU4sCisJV05JX0NGR19OT19PRl9PTkNISVBfUkVPUkRFUl9TRVNTSU9OU19TVEFNQVgsCisJV05JX0NGR19OT19PRl9PTkNISVBfUkVPUkRFUl9TRVNTSU9OU19TVEFERUZ9LAorCXtXTklfQ0ZHX1NJTkdMRV9USURfUkMsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19TSU5HTEVfVElEX1JDX1NUQU1JTiwKKwlXTklfQ0ZHX1NJTkdMRV9USURfUkNfU1RBTUFYLAorCVdOSV9DRkdfU0lOR0xFX1RJRF9SQ19TVEFERUZ9LAorCXtXTklfQ0ZHX1JSTV9FTkFCTEVELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfUlJNX0VOQUJMRURfU1RBTUlOLAorCVdOSV9DRkdfUlJNX0VOQUJMRURfU1RBTUFYLAorCVdOSV9DRkdfUlJNX0VOQUJMRURfU1RBREVGfSwKKwl7V05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfUlJNX09QRVJBVElOR19DSEFOX01BWF9TVEFNSU4sCisJV05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX1NUQU1BWCwKKwlXTklfQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfU1RBREVGfSwKKwl7V05JX0NGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX1NUQU1JTiwKKwlXTklfQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX1NUQU1BWCwKKwlXTklfQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX1NUQURFRn0sCisJe1dOSV9DRkdfVFhfUFdSX0NUUkxfRU5BQkxFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfVFhfUFdSX0NUUkxfRU5BQkxFX1NUQU1JTiwKKwlXTklfQ0ZHX1RYX1BXUl9DVFJMX0VOQUJMRV9TVEFNQVgsCisJV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEVfU1RBREVGfSwKKwl7V05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElORywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfU1RBTUlOLAorCVdOSV9DRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfU1RBTUFYLAorCVdOSV9DRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfU1RBREVGfSwKKwl7V05JX0NGR19CVENfREhDUF9CVF9TTE9UU19UT19CTE9DSywKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0tfU1RBTUlOLAorCVdOSV9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0tfU1RBTUFYLAorCVdOSV9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0tfU1RBREVGfSwKKwl7V05JX0NGR19EWU5BTUlDX1BTX1BPTExfVkFMVUUsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX0RZTkFNSUNfUFNfUE9MTF9WQUxVRV9TVEFNSU4sCisJV05JX0NGR19EWU5BTUlDX1BTX1BPTExfVkFMVUVfU1RBTUFYLAorCVdOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFX1NUQURFRn0sCisJe1dOSV9DRkdfUFNfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19QU19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfU1RBTUlOLAorCVdOSV9DRkdfUFNfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VUX1NUQU1BWCwKKwlXTklfQ0ZHX1BTX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVF9TVEFERUZ9LAorCXtXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOX1NUQU1JTiwKKwlXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTl9TVEFNQVgsCisJV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU5fU1RBREVGfSwKKwl7V05JX0NGR19URUxFX0JDTl9UUkFOU19MSSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfU1RBTUlOLAorCVdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfU1RBTUFYLAorCVdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfU1RBREVGfSwKKwl7V05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlMsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0lETEVfQkNOU19TVEFNSU4sCisJV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlNfU1RBTUFYLAorCVdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfSURMRV9CQ05TX1NUQURFRn0sCisJe1dOSV9DRkdfVEVMRV9CQ05fTUFYX0xJLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19URUxFX0JDTl9NQVhfTElfU1RBTUlOLAorCVdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJX1NUQU1BWCwKKwlXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9TVEFERUZ9LAorCXtXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlMsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlNfU1RBTUlOLAorCVdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJX0lETEVfQkNOU19TVEFNQVgsCisJV05JX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TX1NUQURFRn0sCisJe1dOSV9DRkdfQlRDX0EyRFBfREhDUF9CVF9TVUJfSU5URVJWQUxTLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19CVENfQTJEUF9ESENQX0JUX1NVQl9JTlRFUlZBTFNfU1RBTUlOLAorCVdOSV9DRkdfQlRDX0EyRFBfREhDUF9CVF9TVUJfSU5URVJWQUxTX1NUQU1BWCwKKwlXTklfQ0ZHX0JUQ19BMkRQX0RIQ1BfQlRfU1VCX0lOVEVSVkFMU19TVEFERUZ9LAorCXtXTklfQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EX1NUQU1JTiwKKwlXTklfQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRF9TVEFNQVgsCisJV05JX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfU1RBREVGfSwKKwl7V05JX0NGR19BU1NPQ19TVEFfTElNSVQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVF9TVEFNSU4sCisJV05JX0NGR19BU1NPQ19TVEFfTElNSVRfU1RBTUFYLAorCVdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQURFRn0sCisJe1dOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX1NUQVJUX0NIQU5ORUwsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9TVEFNSU4sCisJV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9TVEFNQVgsCisJV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9TVEFERUZ9LAorCXtXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTF9TVEFNSU4sCisJV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfRU5EX0NIQU5ORUxfU1RBTUFYLAorCVdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX0VORF9DSEFOTkVMX1NUQURFRn0sCisJe1dOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5ELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5EX1NUQU1JTiwKKwlXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9PUEVSQVRJTkdfQkFORF9TVEFNQVgsCisJV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfU1RBREVGfSwKKwl7V05JX0NGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9ELAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9TVEFNSU4sCisJV05JX0NGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX1NUQU1BWCwKKwlXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfU1RBREVGfSwKKwl7V05JX0NGR19FTkFCTEVfQ0xPU0VfTE9PUCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX1NUQU1JTiwKKwlXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX1NUQU1BWCwKKwlXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX1NUQURFRn0sCisJe1dOSV9DRkdfRU5BQkxFX0xURV9DT0VYLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfRU5BQkxFX0xURV9DT0VYX1NUQU1JTiwKKwlXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWF9TVEFNQVgsCisJV05JX0NGR19FTkFCTEVfTFRFX0NPRVhfU1RBREVGfSwKKwl7V05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX0FQX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFNSU4sCisJV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVRfU1RBTUFYLAorCVdOSV9DRkdfQVBfS0VFUF9BTElWRV9USU1FT1VUX1NUQURFRn0sCisJe1dOSV9DRkdfR09fS0VFUF9BTElWRV9USU1FT1VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19HT19LRUVQX0FMSVZFX1RJTUVPVVRfU1RBTUlOLAorCVdOSV9DRkdfR09fS0VFUF9BTElWRV9USU1FT1VUX1NUQU1BWCwKKwlXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFERUZ9LAorCXtXTklfQ0ZHX0VOQUJMRV9NQ19BRERSX0xJU1QsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX0VOQUJMRV9NQ19BRERSX0xJU1RfU1RBTUlOLAorCVdOSV9DRkdfRU5BQkxFX01DX0FERFJfTElTVF9TVEFNQVgsCisJV05JX0NGR19FTkFCTEVfTUNfQUREUl9MSVNUX1NUQURFRn0sCisJe1dOSV9DRkdfRU5BQkxFX1VDX0ZJTFRFUiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfRU5BQkxFX1VDX0ZJTFRFUl9TVEFNSU4sCisJV05JX0NGR19FTkFCTEVfVUNfRklMVEVSX1NUQU1BWCwKKwlXTklfQ0ZHX0VOQUJMRV9VQ19GSUxURVJfU1RBREVGfSwKKwl7V05JX0NGR19FTkFCTEVfTFBXUl9JTUdfVFJBTlNJVElPTiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OX1NUQU1JTiwKKwlXTklfQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OX1NUQU1BWCwKKwlXTklfQ0ZHX0VOQUJMRV9MUFdSX0lNR19UUkFOU0lUSU9OX1NUQURFRn0sCisJe1dOSV9DRkdfRU5BQkxFX01DQ19BREFQVElWRV9TQ0hFRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0VOQUJMRV9NQ0NfQURBUFRJVkVfU0NIRURfU1RBTUlOLAorCVdOSV9DRkdfRU5BQkxFX01DQ19BREFQVElWRV9TQ0hFRF9TVEFNQVgsCisJV05JX0NGR19FTkFCTEVfTUNDX0FEQVBUSVZFX1NDSEVEX1NUQURFRn0sCisJe1dOSV9DRkdfRElTQUJMRV9MRFBDX1dJVEhfVFhCRl9BUCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCwKKwlXTklfQ0ZHX0RJU0FCTEVfTERQQ19XSVRIX1RYQkZfQVBfU1RBTUlOLAorCVdOSV9DRkdfRElTQUJMRV9MRFBDX1dJVEhfVFhCRl9BUF9TVEFNQVgsCisJV05JX0NGR19ESVNBQkxFX0xEUENfV0lUSF9UWEJGX0FQX1NUQURFRn0sCisJe1dOSV9DRkdfQVBfTElOS19NT05JVE9SX1RJTUVPVVQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0hBTCwKKwlXTklfQ0ZHX0FQX0xJTktfTU9OSVRPUl9USU1FT1VUX1NUQU1JTiwKKwlXTklfQ0ZHX0FQX0xJTktfTU9OSVRPUl9USU1FT1VUX1NUQU1BWCwKKwlXTklfQ0ZHX0FQX0xJTktfTU9OSVRPUl9USU1FT1VUX1NUQURFRn0sCisJe1dOSV9DRkdfVERMU19RT1NfV01NX1VBUFNEX01BU0ssCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1RETFNfUU9TX1dNTV9VQVBTRF9NQVNLX1NUQU1JTiwKKwlXTklfQ0ZHX1RETFNfUU9TX1dNTV9VQVBTRF9NQVNLX1NUQU1BWCwKKwlXTklfQ0ZHX1RETFNfUU9TX1dNTV9VQVBTRF9NQVNLX1NUQURFRn0sCisJe1dOSV9DRkdfVERMU19CVUZfU1RBX0VOQUJMRUQsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfTlRGX0xJTSwKKwlXTklfQ0ZHX1RETFNfQlVGX1NUQV9FTkFCTEVEX1NUQU1JTiwKKwlXTklfQ0ZHX1RETFNfQlVGX1NUQV9FTkFCTEVEX1NUQU1BWCwKKwlXTklfQ0ZHX1RETFNfQlVGX1NUQV9FTkFCTEVEX1NUQURFRn0sCisJe1dOSV9DRkdfVERMU19QVUFQU0RfSU5BQ1RfVElNRSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVERMU19QVUFQU0RfSU5BQ1RfVElNRV9TVEFNSU4sCisJV05JX0NGR19URExTX1BVQVBTRF9JTkFDVF9USU1FX1NUQU1BWCwKKwlXTklfQ0ZHX1RETFNfUFVBUFNEX0lOQUNUX1RJTUVfU1RBREVGfSwKKwl7V05JX0NGR19URExTX1JYX0ZSQU1FX1RIUkVTSE9MRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVERMU19SWF9GUkFNRV9USFJFU0hPTERfU1RBTUlOLAorCVdOSV9DRkdfVERMU19SWF9GUkFNRV9USFJFU0hPTERfU1RBTUFYLAorCVdOSV9DRkdfVERMU19SWF9GUkFNRV9USFJFU0hPTERfU1RBREVGfSwKKwl7V05JX0NGR19QTUZfU0FfUVVFUllfTUFYX1JFVFJJRVMsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQgfAorCUNGR19DVExfUkVTVEFSVCwKKwlXTklfQ0ZHX1BNRl9TQV9RVUVSWV9NQVhfUkVUUklFU19TVEFNSU4sCisJV05JX0NGR19QTUZfU0FfUVVFUllfTUFYX1JFVFJJRVNfU1RBTUFYLAorCVdOSV9DRkdfUE1GX1NBX1FVRVJZX01BWF9SRVRSSUVTX1NUQURFRn0sCisJe1dOSV9DRkdfUE1GX1NBX1FVRVJZX1JFVFJZX0lOVEVSVkFMLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX1JFU1RBUlQsCisJV05JX0NGR19QTUZfU0FfUVVFUllfUkVUUllfSU5URVJWQUxfU1RBTUlOLAorCVdOSV9DRkdfUE1GX1NBX1FVRVJZX1JFVFJZX0lOVEVSVkFMX1NUQU1BWCwKKwlXTklfQ0ZHX1BNRl9TQV9RVUVSWV9SRVRSWV9JTlRFUlZBTF9TVEFERUZ9LAorCXtXTklfQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTiwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfRU5BQkxFX0FEQVBUX1JYX0RSQUlOX1NUQU1JTiwKKwlXTklfQ0ZHX0VOQUJMRV9BREFQVF9SWF9EUkFJTl9TVEFNQVgsCisJV05JX0NGR19FTkFCTEVfQURBUFRfUlhfRFJBSU5fU1RBREVGfSwKKwl7V05JX0NGR19GTEVYX0NPTk5FQ1RfUE9XRVJfRkFDVE9SLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfRkxFWF9DT05ORUNUX1BPV0VSX0ZBQ1RPUl9TVEFNSU4sCisJV05JX0NGR19GTEVYX0NPTk5FQ1RfUE9XRVJfRkFDVE9SX1NUQU1BWCwKKwlXTklfQ0ZHX0ZMRVhfQ09OTkVDVF9QT1dFUl9GQUNUT1JfU1RBREVGfSwKKwl7V05JX0NGR19BTlRFTk5BX0RJVkVTSVRZLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19BTlRFTk5BX0RJVkVTSVRZX1NUQU1JTiwKKwlXTklfQ0ZHX0FOVEVOTkFfRElWRVNJVFlfU1RBTUFYLAorCVdOSV9DRkdfQU5URU5OQV9ESVZFU0lUWV9TVEFERUZ9LAorCXtXTklfQ0ZHX0dPX0xJTktfTU9OSVRPUl9USU1FT1VULAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5UIHwKKwlDRkdfQ1RMX05URl9IQUwsCisJV05JX0NGR19HT19MSU5LX01PTklUT1JfVElNRU9VVF9TVEFNSU4sCisJV05JX0NGR19HT19MSU5LX01PTklUT1JfVElNRU9VVF9TVEFNQVgsCisJV05JX0NGR19HT19MSU5LX01PTklUT1JfVElNRU9VVF9TVEFERUZ9LAorCXtXTklfQ0ZHX1JNQ19BQ1RJT05fUEVSSU9EX0ZSRVFVRU5DWSwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfSEFMLAorCVdOSV9DRkdfUk1DX0FDVElPTl9QRVJJT0RfRlJFUVVFTkNZX1NUQU1JTiwKKwlXTklfQ0ZHX1JNQ19BQ1RJT05fUEVSSU9EX0ZSRVFVRU5DWV9TVEFNQVgsCisJV05JX0NGR19STUNfQUNUSU9OX1BFUklPRF9GUkVRVUVOQ1lfU1RBREVGfSwKKwl7V05JX0NGR19DVVJSRU5UX1JTU0ksCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19DVVJSRU5UX1JTU0lfU1RBTUlOLAorCVdOSV9DRkdfQ1VSUkVOVF9SU1NJX1NUQU1BWCwKKwlXTklfQ0ZHX0NVUlJFTlRfUlNTSV9TVEFERUZ9LAorCXtXTklfQ0ZHX1JUVDNfRU5BQkxFLAorCUNGR19DVExfVkFMSUQgfCBDRkdfQ1RMX1JFIHwgQ0ZHX0NUTF9XRSB8IENGR19DVExfSU5ULAorCVdOSV9DRkdfUlRUM19FTkFCTEVfU1RBTUlOLAorCVdOSV9DRkdfUlRUM19FTkFCTEVfU1RBTUFYLAorCVdOSV9DRkdfUlRUM19FTkFCTEVfU1RBREVGfSwKKwl7V05JX0NGR19ERUJVR19QMlBfUkVNQUlOX09OX0NIQU5ORUwsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19ERUJVR19QMlBfUkVNQUlOX09OX0NIQU5ORUxfU1RBTUlOLAorCVdOSV9DRkdfREVCVUdfUDJQX1JFTUFJTl9PTl9DSEFOTkVMX1NUQU1BWCwKKwlXTklfQ0ZHX0RFQlVHX1AyUF9SRU1BSU5fT05fQ0hBTk5FTF9TVEFERUZ9LAorCXtXTklfQ0ZHX1RETFNfT0ZGX0NIQU5ORUxfRU5BQkxFRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVERMU19PRkZfQ0hBTk5FTF9FTkFCTEVEX1NUQU1JTiwKKwlXTklfQ0ZHX1RETFNfT0ZGX0NIQU5ORUxfRU5BQkxFRF9TVEFNQVgsCisJV05JX0NGR19URExTX09GRl9DSEFOTkVMX0VOQUJMRURfU1RBREVGfSwKKwl7V05JX0NGR19JQlNTX0FUSU1fV0lOX1NJWkUsCisJQ0ZHX0NUTF9WQUxJRCB8IENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19JQlNTX0FUSU1fV0lOX1NJWkVfU1RBTUlOLAorCVdOSV9DRkdfSUJTU19BVElNX1dJTl9TSVpFX1NUQU1BWCwKKwlXTklfQ0ZHX0lCU1NfQVRJTV9XSU5fU0laRV9TVEFERUZ9LAorCXtXTklfQ0ZHX0RGU19NQVNURVJfRU5BQkxFRCwKKwlDRkdfQ1RMX1ZBTElEIHwgIENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19ERlNfTUFTVEVSX0VOQUJMRURfU1RBTUlOLAorCVdOSV9DRkdfREZTX01BU1RFUl9FTkFCTEVEX1NUQU1BWCwKKwlXTklfQ0ZHX0RGU19NQVNURVJfRU5BQkxFRF9TVEFERUZ9LAorCXtXTklfQ0ZHX1ZIVF9FTkFCTEVfVFhCRl8yME1IWiwKKwlDRkdfQ1RMX1ZBTElEIHwgIENGR19DVExfUkUgfCBDRkdfQ1RMX1dFIHwgQ0ZHX0NUTF9JTlQsCisJV05JX0NGR19WSFRfRU5BQkxFX1RYQkZfMjBNSFpfU1RBTUlOLAorCVdOSV9DRkdfVkhUX0VOQUJMRV9UWEJGXzIwTUhaX1NUQU1BWCwKKwlXTklfQ0ZHX1ZIVF9FTkFCTEVfVFhCRl8yME1IWl9TVEFERUZ9LAorCXtXTklfQ0ZHX1RETFNfV01NX01PREVfRU5BQkxFRCwKKwlDRkdfQ1RMX1ZBTElEIHwgQ0ZHX0NUTF9SRSB8IENGR19DVExfV0UgfCBDRkdfQ1RMX0lOVCB8CisJQ0ZHX0NUTF9OVEZfTElNLAorCVdOSV9DRkdfVERMU19XTU1fTU9ERV9FTkFCTEVEX1NUQU1JTiwKKwlXTklfQ0ZHX1RETFNfV01NX01PREVfRU5BQkxFRF9TVEFNQVgsCisJV05JX0NGR19URExTX1dNTV9NT0RFX0VOQUJMRURfU1RBREVGfQorfTsKKworCitjZmdzdGF0aWNfc3RyaW5nIGNmZ19zdGF0aWNfc3RyaW5nW0NGR19NQVhfU1RBVElDX1NUUklOR10gPSB7CisKKwl7V05JX0NGR19TVEFfSUQsCisJV05JX0NGR19TVEFfSURfTEVOLAorCTYsCisJezB4MjIsIDB4MjIsIDB4NDQsIDB4NDQsIDB4MzMsIDB4MzN9IH0sCisJe1dOSV9DRkdfU1NJRCwKKwlXTklfQ0ZHX1NTSURfTEVOLAorCTEwLAorCXsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwfSB9LAorCXtXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8xLAorCVdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzFfTEVOLAorCTAsCisJezB9IH0sCisJe1dOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzIsCisJV05JX0NGR19XRVBfREVGQVVMVF9LRVlfMl9MRU4sCisJMCwKKwl7MH0gfSwKKwl7V05JX0NGR19XRVBfREVGQVVMVF9LRVlfMywKKwlXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8zX0xFTiwKKwkwLAorCXswfSB9LAorCXtXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV80LAorCVdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzRfTEVOLAorCTAsCisJezB9IH0sCisJe1dOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQiwKKwlXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUJfTEVOLAorCTQsCisJezIsIDQsIDExLCAyMn0gfSwKKwl7V05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBLAorCVdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQV9MRU4sCisJOCwKKwl7MTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOH0gfSwKKwl7V05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVCwKKwlXTklfQ0ZHX09QRVJBVElPTkFMX1JBVEVfU0VUX0xFTiwKKwkwLAorCXswfSB9LAorCXtXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VULAorCVdOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOLAorCTAsCisJezB9IH0sCisJe1dOSV9DRkdfUFJPUFJJRVRBUllfT1BFUkFUSU9OQUxfUkFURV9TRVQsCisJV05JX0NGR19QUk9QUklFVEFSWV9PUEVSQVRJT05BTF9SQVRFX1NFVF9MRU4sCisJNCwKKwl7MSwgMywgNSwgN30gfSwKKwl7V05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QsCisJV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOLAorCTU1LAorCXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEsIDYsIDExLCAzNCwgMzgsIDQyLCA0NiwgMiwgMywgNCwKKwkgNSwgNywgOCwgOSwgMTAsIDEyLCAxMywgMTQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LAorCSAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MSwgMTUzLCAxNTUsIDE1NywgMTU5LCAxNjEsIDUwLCA1NCwgNTgsIDYyLCAyNDAsCisJIDI0MiwgMjQ0LCAyNDYsIDI0OCwgMjUwLCAyNTJ9IH0sCisKKwl7V05JX0NGR19NQU5VRkFDVFVSRVJfT1VJLAorCVdOSV9DRkdfTUFOVUZBQ1RVUkVSX09VSV9MRU4sCisJMywKKwl7MHgwLCAweGEsIDB4ZjV9IH0sCisJe1dOSV9DRkdfTUFOVUZBQ1RVUkVSX05BTUUsCisJV05JX0NGR19NQU5VRkFDVFVSRVJfTkFNRV9MRU4sCisJOCwKKwl7MHg1MSwgMHg3NSwgMHg2MSwgMHg2YywgMHg2MywgMHg2ZiwgMHg2ZCwgMHg2ZH0gfSwKKwl7V05JX0NGR19NT0RFTF9OVU1CRVIsCisJV05JX0NGR19NT0RFTF9OVU1CRVJfTEVOLAorCTYsCisJezB4NGQsIDB4NGUsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzR9IH0sCisJe1dOSV9DRkdfTU9ERUxfTkFNRSwKKwlXTklfQ0ZHX01PREVMX05BTUVfTEVOLAorCTcsCisJezB4NTcsIDB4NDYsIDB4NTIsIDB4MzQsIDB4MzAsIDB4MzMsIDB4MzF9IH0sCisJe1dOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfTkFNRSwKKwlXTklfQ0ZHX01BTlVGQUNUVVJFUl9QUk9EVUNUX05BTUVfTEVOLAorCTYsCisJezB4MzEsIDB4MzEsIDB4NmUsIDB4MmQsIDB4NDEsIDB4NTB9IH0sCisJe1dOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfVkVSU0lPTiwKKwlXTklfQ0ZHX01BTlVGQUNUVVJFUl9QUk9EVUNUX1ZFUlNJT05fTEVOLAorCTYsCisJezB4NTMsIDB4NGUsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzR9IH0sCisJe1dOSV9DRkdfTUFYX1RYX1BPV0VSXzJfNCwKKwlXTklfQ0ZHX01BWF9UWF9QT1dFUl8yXzRfTEVOLAorCTMsCisJezB4MSwgMHhlLCAweDE0fSB9LAorCXtXTklfQ0ZHX01BWF9UWF9QT1dFUl81LAorCVdOSV9DRkdfTUFYX1RYX1BPV0VSXzVfTEVOLAorCTMsCisJezB4MjQsIDB4N2UsIDB4MTR9IH0sCisJe1dOSV9DRkdfQVBfTk9ERV9OQU1FLAorCVdOSV9DRkdfQVBfTk9ERV9OQU1FX0xFTiwKKwkwLAorCXswfSB9LAorCXtXTklfQ0ZHX0NPVU5UUllfQ09ERSwKKwlXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4sCisJMCwKKwl7MH0gfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMLAorCVdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU4sCisJMTcsCisJezB4MCwgMHg3LCAweDAsIDB4ZiwgMHgzLCAweGZmLCAweDAsIDB4MCwgMHgxZiwgMHgzLCAweGZmLCAweDAsIDB4MCwKKwkgMHhmLCAweDMsIDB4ZmYsIDB4MH0gfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMLAorCVdOSV9DRkdfRURDQV9BTklfQUNCRV9MT0NBTF9MRU4sCisJMTcsCisJezB4MCwgMHgyLCAweDAsIDB4ZiwgMHgzLCAweGZmLCAweDY0LCAweDAsIDB4MWYsIDB4MywgMHhmZiwgMHg2NCwgMHgwLAorCSAweGYsIDB4MywgMHhmZiwgMHg2NH0gfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ1ZJX0xPQ0FMLAorCVdOSV9DRkdfRURDQV9BTklfQUNWSV9MT0NBTF9MRU4sCisJMTcsCisJezB4MCwgMHgyLCAweDAsIDB4NywgMHgwLCAweGYsIDB4YzgsIDB4MCwgMHhmLCAweDAsIDB4MWYsIDB4YmMsIDB4MCwKKwkgMHg3LCAweDAsIDB4ZiwgMHhjOH0gfSwKKwl7V05JX0NGR19FRENBX0FOSV9BQ1ZPX0xPQ0FMLAorCVdOSV9DRkdfRURDQV9BTklfQUNWT19MT0NBTF9MRU4sCisJMTcsCisJezB4MCwgMHgyLCAweDAsIDB4MywgMHgwLCAweDcsIDB4NjQsIDB4MCwgMHg3LCAweDAsIDB4ZiwgMHg2NiwgMHgwLAorCSAweDMsIDB4MCwgMHg3LCAweDY0fSB9LAorCXtXTklfQ0ZHX0VEQ0FfQU5JX0FDQkssCisJV05JX0NGR19FRENBX0FOSV9BQ0JLX0xFTiwKKwkxNywKKwl7MHgwLCAweDcsIDB4MCwgMHhmLCAweDMsIDB4ZmYsIDB4MCwgMHgwLCAweDFmLCAweDMsIDB4ZmYsIDB4MCwgMHgwLAorCSAweGYsIDB4MywgMHhmZiwgMHgwfSB9LAorCXtXTklfQ0ZHX0VEQ0FfQU5JX0FDQkUsCisJV05JX0NGR19FRENBX0FOSV9BQ0JFX0xFTiwKKwkxNywKKwl7MHgwLCAweDIsIDB4MCwgMHhmLCAweDMsIDB4ZmYsIDB4NjQsIDB4MCwgMHgxZiwgMHgzLCAweGZmLCAweDY0LCAweDAsCisJIDB4ZiwgMHgzLCAweGZmLCAweDY0fSB9LAorCXtXTklfQ0ZHX0VEQ0FfQU5JX0FDVkksCisJV05JX0NGR19FRENBX0FOSV9BQ1ZJX0xFTiwKKwkxNywgezB4MCwgMHgyLCAweDAsIDB4NywgMHgwLCAweGYsIDB4YzgsIDB4MCwgMHhmLCAweDAsIDB4MWYsCisJMHhiYywgMHgwLCAweDcsIDB4MCwgMHhmLCAweGM4fSB9LAorCXtXTklfQ0ZHX0VEQ0FfQU5JX0FDVk8sCisJV05JX0NGR19FRENBX0FOSV9BQ1ZPX0xFTiwKKwkxNywKKwl7MHgwLCAweDIsIDB4MCwgMHgzLCAweDAsIDB4NywgMHg2NCwgMHgwLCAweDcsIDB4MCwgMHhmLCAweDY2LCAweDAsIDB4MywKKwkgMHgwLCAweDcsIDB4NjR9IH0sCisJe1dOSV9DRkdfRURDQV9XTUVfQUNCS19MT0NBTCwKKwlXTklfQ0ZHX0VEQ0FfV01FX0FDQktfTE9DQUxfTEVOLAorCTE3LCB7MHgwLCAweDcsIDB4MCwgMHhmLCAweDMsIDB4ZmYsIDB4MCwgMHgwLCAweDFmLCAweDMsIDB4ZmYsCisJMHgwLCAweDAsIDB4ZiwgMHgzLCAweGZmLCAweDB9IH0sCisJe1dOSV9DRkdfRURDQV9XTUVfQUNCRV9MT0NBTCwKKwlXTklfQ0ZHX0VEQ0FfV01FX0FDQkVfTE9DQUxfTEVOLAorCTE3LCB7MHgwLCAweDMsIDB4MCwgMHhmLCAweDAsIDB4M2YsIDB4MCwgMHgwLCAweDFmLCAweDMsIDB4ZmYsCisJMHgwLCAweDAsIDB4ZiwgMHgwLCAweDNmLCAweDB9IH0sCisJe1dOSV9DRkdfRURDQV9XTUVfQUNWSV9MT0NBTCwKKwlXTklfQ0ZHX0VEQ0FfV01FX0FDVklfTE9DQUxfTEVOLAorCTE3LAorCXsweDAsIDB4MSwgMHgwLCAweDcsIDB4MCwgMHhmLCAweDVlLCAweDAsIDB4NywgMHgwLCAweGYsIDB4YmMsIDB4MCwgMHg3LAorCSAweDAsIDB4ZiwgMHg1ZX0gfSwKKwl7V05JX0NGR19FRENBX1dNRV9BQ1ZPX0xPQ0FMLAorCVdOSV9DRkdfRURDQV9XTUVfQUNWT19MT0NBTF9MRU4sCisJMTcsCisJezB4MCwgMHgxLCAweDAsIDB4MywgMHgwLCAweDcsIDB4MmYsIDB4MCwgMHgzLCAweDAsIDB4NywgMHg2NiwgMHgwLCAweDMsCisJIDB4MCwgMHg3LCAweDJmfSB9LAorCXtXTklfQ0ZHX0VEQ0FfV01FX0FDQkssCisJV05JX0NGR19FRENBX1dNRV9BQ0JLX0xFTiwKKwkxNywKKwl7MHgwLCAweDcsIDB4MCwgMHhmLCAweDMsIDB4ZmYsIDB4MCwgMHgwLCAweGYsIDB4MywgMHhmZiwgMHgwLCAweDAsIDB4ZiwKKwkgMHgzLCAweGZmLCAweDB9IH0sCisJe1dOSV9DRkdfRURDQV9XTUVfQUNCRSwKKwlXTklfQ0ZHX0VEQ0FfV01FX0FDQkVfTEVOLAorCTE3LAorCXsweDAsIDB4MywgMHgwLCAweGYsIDB4MywgMHhmZiwgMHgwLCAweDAsIDB4ZiwgMHgzLCAweGZmLCAweDAsIDB4MCwgMHhmLAorCSAweDMsIDB4ZmYsIDB4MH0gfSwKKwl7V05JX0NGR19FRENBX1dNRV9BQ1ZJLAorCVdOSV9DRkdfRURDQV9XTUVfQUNWSV9MRU4sCisJMTcsCisJezB4MCwgMHgyLCAweDAsIDB4NywgMHgwLCAweGYsIDB4NWUsIDB4MCwgMHg3LCAweDAsIDB4ZiwgMHhiYywgMHgwLCAweDcsCisJIDB4MCwgMHhmLCAweDVlfSB9LAorCXtXTklfQ0ZHX0VEQ0FfV01FX0FDVk8sCisJV05JX0NGR19FRENBX1dNRV9BQ1ZPX0xFTiwKKwkxNywKKwl7MHgwLCAweDIsIDB4MCwgMHgzLCAweDAsIDB4NywgMHgyZiwgMHgwLCAweDMsIDB4MCwgMHg3LCAweDY2LCAweDAsIDB4MywKKwkgMHgwLCAweDcsIDB4MmZ9IH0sCisJe1dOSV9DRkdfUkFEQVJfQ0hBTk5FTF9MSVNULAorCVdOSV9DRkdfUkFEQVJfQ0hBTk5FTF9MSVNUX0xFTiwKKwkxNSwKKwl7MHgzNCwgMHgzOCwgMHgzYywgMHg0MCwgMHg2NCwgMHg2OCwgMHg2YywgMHg3MCwgMHg3NCwgMHg3OCwgMHg3YywgMHg4MCwKKwkgMHg4NCwgMHg4OCwgMHg4Y30gfSwKKwl7V05JX0NGR19TQ0FOX0NPTlRST0xfTElTVCwKKwlXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNUX0xFTiwKKwkxMTQsCisJezB4MSwgMHgxLCAweDIsIDB4MSwgMHgzLCAweDEsIDB4NCwgMHgxLCAweDUsIDB4MSwgMHg2LCAweDEsIDB4NywgMHgxLAorCSAweDgsIDB4MSwgMHg5LCAweDEsIDB4YSwgMHgxLCAweGIsIDB4MSwgMHhjLCAweDEsIDB4ZCwgMHgxLCAweGUsIDB4MSwKKwkgMHgyMiwgMHgxLCAweDI0LCAweDEsIDB4MjYsIDB4MSwgMHgyOCwgMHgxLCAweDJhLCAweDEsIDB4MmMsIDB4MSwgMHgyZSwKKwkgMHgxLCAweDMwLCAweDEsIDB4MzIsIDB4MSwgMHgzNCwgMHgwLCAweDM2LCAweDAsIDB4MzgsIDB4MCwgMHgzYSwgMHgwLAorCSAweDNjLCAweDAsIDB4M2UsIDB4MCwgMHg0MCwgMHgwLCAweDY0LCAweDAsIDB4NjgsIDB4MCwgMHg2YywgMHgwLCAweDcwLAorCSAweDAsIDB4NzQsIDB4MCwgMHg3OCwgMHgwLCAweDdjLCAweDAsIDB4ODAsIDB4MCwgMHg4NCwgMHgwLCAweDg4LCAweDAsCisJIDB4OGMsIDB4MCwgMHg5MCwgMHgwLCAweDk1LCAweDEsIDB4OTcsIDB4MSwgMHg5OSwgMHgxLCAweDliLCAweDEsIDB4OWQsCisJIDB4MSwgMHg5ZiwgMHgxLCAweGExLCAweDEsIDB4YTUsIDB4MSwgMHhmMCwgMHgxLCAweGYyLCAweDEsIDB4ZjQsIDB4MSwKKwkgMHhmNiwgMHgxLCAweGY4LCAweDEsIDB4ZmEsIDB4MSwgMHhmYywgMHgxfSB9LAorCXtXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorCVdOSV9DRkdfU1VQUE9SVEVEX01DU19TRVRfTEVOLAorCTE2LAorCXsweGZmLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsCisJIDB4MCwgMHgwfSB9LAorCXtXTklfQ0ZHX0JBU0lDX01DU19TRVQsCisJV05JX0NGR19CQVNJQ19NQ1NfU0VUX0xFTiwKKwkxNiwKKwl7MHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsCisJIDB4MCwgMHgwfSB9LAorCXtXTklfQ0ZHX0NVUlJFTlRfTUNTX1NFVCwKKwlXTklfQ0ZHX0NVUlJFTlRfTUNTX1NFVF9MRU4sCisJMTYsCisJezB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLAorCSAweDAsIDB4MH0gfSwKKwl7V05JX0NGR19CR19TQ0FOX0NIQU5ORUxfTElTVCwKKwlXTklfQ0ZHX0JHX1NDQU5fQ0hBTk5FTF9MSVNUX0xFTiwKKwk1NSwKKwl7MHgyNCwgMHgyOCwgMHgyYywgMHgzMCwgMHgzNCwgMHgzOCwgMHgzYywgMHg0MCwgMHgxLCAweDYsIDB4YiwgMHgyMiwKKwkgMHgyNiwgMHgyYSwgMHgyZSwgMHgyLCAgMHgzLCAweDQsIDB4NSwgMHg3LCAweDgsIDB4OSwgMHhhLCAweGMsIDB4ZCwKKwkgMHhlLCAweDY0LCAweDY4LCAweDZjLCAweDcwLCAweDc0LCAweDc4LCAweDdjLCAweDgwLCAweDg0LCAweDg4LCAweDhjLAorCSAweDk1LCAweDk3LCAweDk5LCAweDliLCAweDlkLCAweDlmLCAweGExLCAweDMyLCAweDM2LCAweDNhLCAweDNlLCAweGYwLAorCSAweGYyLCAweGY0LCAweGY2LCAweGY4LCAweGZhLCAweGZjfSB9LAorCXtXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfREFUQSwKKwlXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfREFUQV9MRU4sCisJMCwKKwl7MH0gfSwKKwl7V05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExLAorCVdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMV9MRU4sCisJMCwKKwl7MH0gfSwKKwl7V05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEyLAorCVdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMl9MRU4sCisJMCwKKwl7MH0gfSwKKwl7V05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEzLAorCVdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBM19MRU4sCisJMCwKKwl7MH0gfSwKKwl7V05JX0NGR19BU1NPQ19SU1BfQURETklFX0RBVEEsCisJV05JX0NGR19BU1NPQ19SU1BfQURETklFX0RBVEFfTEVOLAorCTAsCisJezB9IH0sCisJe1dOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9EQVRBLAorCVdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9EQVRBX0xFTiwKKwkwLAorCXswfSB9LAorCXtXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEEsCisJV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBX0xFTiwKKwkwLAorCXswfSB9LAorCXtXTklfQ0ZHX1dQU19VVUlELAorCVdOSV9DRkdfV1BTX1VVSURfTEVOLAorCTYsCisJezB4YSwgMHhiLCAweGMsIDB4ZCwgMHhlLCAweGZ9IH0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHByb2NfZG5sZF9yc3AodHBBbmlTaXJHbG9iYWwsIHVpbnQxNl90LCB1aW50MzJfdCAqKTsKK3N0YXRpYyB2b2lkIHByb2NfZ2V0X3JlcSh0cEFuaVNpckdsb2JhbCwgdWludDE2X3QsIHVpbnQzMl90ICopOworc3RhdGljIHZvaWQgcHJvY19zZXRfcmVxKHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdWludDMyX3QgKik7CitzdGF0aWMgdm9pZCBwcm9jX3NldF9yZXFfbm9fcnNwKHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdWludDMyX3QgKik7CisKK3N0YXRpYyB1aW50OF90IGNoZWNrX3BhcmFtKHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdWludDMyX3QsIHVpbnQzMl90LAorCQkJICAgdWludDMyX3QgKik7CitzdGF0aWMgdm9pZCBnZXRfc3RyX3ZhbHVlKHVpbnQ4X3QgKiwgdWludDhfdCAqLCB1aW50MzJfdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogTW9kdWxlIGdsb2JhbCB2YXJpYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ0ZHIGZ1bmN0aW9uIHRhYmxlICovCit2b2lkICgqZ19jZmdfZnVuY1tdKSh0cEFuaVNpckdsb2JhbCwgdWludDE2X3QsIHVpbnQzMl90ICopID0geworCXByb2NfZG5sZF9yc3AsIHByb2NfZ2V0X3JlcSwgcHJvY19zZXRfcmVxLCBwcm9jX3NldF9yZXFfbm9fcnNwCit9OworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNmZ19wcm9jZXNzX21iX21zZygpCisgKgorICoqKkZVTkNUSU9OOgorICogQ0ZHIG1haWxib3ggbWVzc2FnZSBwcm9jZXNzaW5nIGZ1bmN0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSBwTXNnICAgIE1lc3NhZ2UgcG9pbnRlcgorICoKKyAqIEByZXR1cm4gTm9uZS4KKyAqCisgKi8KK3ZvaWQgY2ZnX3Byb2Nlc3NfbWJfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYk1zZyAqcE1zZykKK3sKKwl1aW50MTZfdCBpbmRleDsKKwl1aW50MTZfdCBsZW47CisJdWludDMyX3QgKnBQYXJhbTsKKworCS8qIFVzZSB0eXBlWzc6MF0gYXMgaW5kZXggdG8gZnVuY3Rpb24gdGFibGUgKi8KKwlpbmRleCA9IENGR19HRVRfRlVOQ19JTkRYKHBNc2ctPnR5cGUpOworCisJaWYgKGluZGV4ID49IENERl9BUlJBWV9TSVpFKGdfY2ZnX2Z1bmMpKSB7CisJCWNkZl9tZW1fZnJlZShwTXNnKTsKKwkJcmV0dXJuOworCX0KKwlsZW4gPSBwTXNnLT5tc2dMZW4gLSBXTklfQ0ZHX01CX0hEUl9MRU47CisJcFBhcmFtID0gKCh1aW50MzJfdCAqKSBwTXNnKSArIDE7CisKKwkvKiBDYWxsIHByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKwlnX2NmZ19mdW5jW2luZGV4XSAocE1hYywgbGVuLCBwUGFyYW0pOworCisJLyogRnJlZSB1cCBidWZmZXIgKi8KKwljZGZfbWVtX2ZyZWUocE1zZyk7CisKK30gLyoqKiBlbmQgY2ZnX3Byb2Nlc3NfbWJfbXNnKCkgKioqLworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHByb2NfZG5sZF9yc3AoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgQ0ZHX0ROTERfUlNQIG1lc3NhZ2UgZnJvbSBob3N0LgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGxlbmd0aDogIG1lc3NhZ2UgbGVuZ3RoCisgKiBAcGFyYW0gcFBhcmFtOiAgcGFyYW1ldGVyIGxpc3QgcG9pbnRlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICoKKyAqLworc3RhdGljIHZvaWQgcHJvY19kbmxkX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBsZW5ndGgsIHVpbnQzMl90ICpwUGFyYW0pCit7CisJaW50MzJfdCBpOworCisJdWludDMyX3QgZXhwTGVuLCByZXRWYWwsIGJ1ZlN0YXJ0LCBidWZFbmQ7CisJdWludDMyX3QgKnBTcmMsICpwRHN0LCAqcERzdEVuZDsKKwl1aW50MzJfdCBzdHJTaXplLCBqOworCXVpbnQ4X3QgcFN0cltDRkdfTUFYX1NUUl9MRU5dOworCXRwQ2ZnQmluSGRyIHBIZHI7CisJdWludDMyX3QgbG9nTGV2ZWw7CisJdFNpck1zZ1EgbW1oTXNnOworCisJLyogRmlyc3QgRHdvcmQgbXVzdCBjb250YWluIHRoZSBBUCBvciBTVEEgbWFnaWMgZHdvcmQgKi8KKwlQRUxPR1coY2ZnX2xvZyhwTWFjLCBMT0dXLCBGTCgiQ0ZHIHNpemUgJWQgYnl0ZXMgTUFHSUMgZHdvcmQgaXMgMHgleCIpLAorCQkgICAgICAgbGVuZ3RoLCBzaXJfcmVhZF91MzJfbigodWludDhfdCAqKSBwUGFyYW0pKTsKKwkgICAgICAgKQorCS8qIGlmIHRoZSBzdHJpbmcgaXMgbm90IGNvcnJlY3QsIHJldHVybiBmYWlsdXJlICovCisJaWYgKCpwUGFyYW0gPT0gQ0ZHX1NUQV9NQUdJQ19EV09SRCkgeworCX0KKworCWVsc2UgeworCQlQRUxPR0UoY2ZnX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBtYWdpYyBkd29yZCAweCV4IiksCisJCQkgICAgICAgc2lyX3JlYWRfdTMyX24oKHVpbnQ4X3QgKikgcFBhcmFtKSk7CisJCSAgICAgICApCisJCXJldFZhbCA9IFdOSV9DRkdfSU5WQUxJRF9MRU47CisJCWdvdG8gZW5kOworCX0KKworCXBQYXJhbSsrOworCWxlbmd0aCAtPSA0OworCisJLyogVmVyaWZ5IG1lc3NhZ2UgbGVuZ3RoICovCisJeworCQlwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplID0gQ0ZHX1NUQV9JQlVGX01BWF9TSVpFOworCQlwTWFjLT5jZmcuZ0NmZ01heFNCdWZTaXplID0gQ0ZHX1NUQV9TQlVGX01BWF9TSVpFOworCX0KKworCS8qIFBhcnNlIHRoZSBDZmcgaGVhZGVyICovCisJcEhkciA9ICh0cENmZ0JpbkhkcikgcFBhcmFtOworCXBQYXJhbSArPSAoc2l6ZW9mKHRDZmdCaW5IZHIpID4+IDIpOworCVBFTE9HVyhjZmdfbG9nCisJCSAgICAgICAocE1hYywgTE9HVywKKwkJICAgICAgIEZMKCJDRkcgaGRyIHRvdFBhcmFtcyAlZCBpbnRQYXJhbXMgJWQgc3RyQnVmU2l6ZSAlZC8lZCIpLAorCQkgICAgICAgcEhkci0+Y29udHJvbFNpemUsIHBIZHItPmlCdWZTaXplLCBwSGRyLT5zQnVmU2l6ZSwKKwkJICAgICAgIHBNYWMtPmNmZy5nQ2ZnTWF4U0J1ZlNpemUpOworCSAgICAgICApCisKKwlleHBMZW4gPQorCQkoKENGR19QQVJBTV9NQVhfTlVNICsgMyAqIHBNYWMtPmNmZy5nQ2ZnTWF4SUJ1ZlNpemUpIDw8IDIpICsKKwkJcEhkci0+c0J1ZlNpemUgKyBzaXplb2YodENmZ0Jpbkhkcik7CisKKwlpZiAobGVuZ3RoICE9IGV4cExlbikgeworCQlQRUxPR0UoY2ZnX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCI8Q0ZHPiBETkxEX1JTUCBpbnZhbGlkIGxlbmd0aCAlZCAoZXhwICVkKSIpLCBsZW5ndGgsCisJCQkgICAgICAgZXhwTGVuKTsKKwkJICAgICAgICkKKwkJcmV0VmFsID0gV05JX0NGR19JTlZBTElEX0xFTjsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKHBIZHItPmNvbnRyb2xTaXplICE9IENGR19QQVJBTV9NQVhfTlVNKSB7CisJCVBFTE9HRShjZmdfbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCI8Q0ZHPiBUb3RhbCBwYXJhbWV0ZXIgY291bnQgbWlzbWF0Y2giKSk7CisJCSAgICAgICApCisJCXJldFZhbCA9IFdOSV9DRkdfSU5WQUxJRF9MRU47CisJCWdvdG8gZW5kOworCX0KKworCWlmIChwSGRyLT5pQnVmU2l6ZSAhPSBwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplKSB7CisJCVBFTE9HRShjZmdfbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwoIjxDRkc+IEludGVnZXIgcGFyYW1ldGVyIGNvdW50IG1pc21hdGNoIikpOworCQkgICAgICAgKQorCQlyZXRWYWwgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworCQlnb3RvIGVuZDsKKwl9CisJLyogQ29weSBjb250cm9sIGFycmF5ICovCisJcERzdCA9ICh1aW50MzJfdCAqKSBwTWFjLT5jZmcuZ0NmZ0VudHJ5OworCXBEc3RFbmQgPSBwRHN0ICsgQ0ZHX1BBUkFNX01BWF9OVU07CisJcFNyYyA9IHBQYXJhbTsKKwl3aGlsZSAocERzdCA8IHBEc3RFbmQpIHsKKwkJKnBEc3QrKyA9ICpwU3JjKys7CisJfQorCS8qIENvcHkgZGVmYXVsdCB2YWx1ZXMgKi8KKwlwRHN0ID0gcE1hYy0+Y2ZnLmdDZmdJQnVmOworCXBEc3RFbmQgPSBwRHN0ICsgcE1hYy0+Y2ZnLmdDZmdNYXhJQnVmU2l6ZTsKKwl3aGlsZSAocERzdCA8IHBEc3RFbmQpIHsKKwkJKnBEc3QrKyA9ICpwU3JjKys7CisJfQorCisJLyogQ29weSBtaW4gdmFsdWVzICovCisJcERzdCA9IHBNYWMtPmNmZy5nQ2ZnSUJ1Zk1pbjsKKwlwRHN0RW5kID0gcERzdCArIHBNYWMtPmNmZy5nQ2ZnTWF4SUJ1ZlNpemU7CisJd2hpbGUgKHBEc3QgPCBwRHN0RW5kKSB7CisJCSpwRHN0KysgPSAqcFNyYysrOworCX0KKworCS8qIENvcHkgbWF4IHZhbHVlcyAqLworCXBEc3QgPSBwTWFjLT5jZmcuZ0NmZ0lCdWZNYXg7CisJcERzdEVuZCA9IHBEc3QgKyBwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplOworCXdoaWxlIChwRHN0IDwgcERzdEVuZCkgeworCQkqcERzdCsrID0gKnBTcmMrKzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcE1hYy0+Y2ZnLmdDZmdNYXhJQnVmU2l6ZTsgaSsrKQorCQlpZiAocE1hYy0+Y2ZnLmdDZmdJQnVmW2ldIDwgcE1hYy0+Y2ZnLmdDZmdJQnVmTWluW2ldIHx8CisJCSAgICBwTWFjLT5jZmcuZ0NmZ0lCdWZbaV0gPiBwTWFjLT5jZmcuZ0NmZ0lCdWZNYXhbaV0pIHsKKwkJCVBFTE9HRShjZmdfbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiY2ZnIGlkICVkIEludmFsaWQgZGVmIHZhbHVlICVkICIKKwkJCQkJICAibWluICVkIG1heCAlZCIpLCBpLCBwTWFjLT5jZmcuZ0NmZ0lCdWZbaV0sCisJCQkJICAgICAgIHBNYWMtPmNmZy5nQ2ZnSUJ1Zk1pbltpXSwKKwkJCQkgICAgICAgcE1hYy0+Y2ZnLmdDZmdJQnVmTWF4W2ldKTsKKwkJCSAgICAgICApCisJCX0KKwkvKiBDYWxjdWxhdGUgbWF4IHN0cmluZyBidWZmZXIgbGVuZ3RocyBmb3IgYWxsIHN0cmluZyBwYXJhbWV0ZXJzICovCisJYnVmRW5kID0gcE1hYy0+Y2ZnLmdDZmdNYXhTQnVmU2l6ZTsKKwlmb3IgKGkgPSBDRkdfUEFSQU1fTUFYX05VTSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWlmICgocE1hYy0+Y2ZnLmdDZmdFbnRyeVtpXS5jb250cm9sICYgQ0ZHX0NUTF9JTlQpICE9IDApCisJCQljb250aW51ZTsKKworCQlpZiAoKHBNYWMtPmNmZy5nQ2ZnRW50cnlbaV0uY29udHJvbCAmIENGR19DVExfVkFMSUQpID09IDApCisJCQljb250aW51ZTsKKworCQlidWZTdGFydCA9IHBNYWMtPmNmZy5nQ2ZnRW50cnlbaV0uY29udHJvbCAmIENGR19CVUZfSU5EWF9NQVNLOworCQlwTWFjLT5jZmcuZ0NmZ1NCdWZbYnVmU3RhcnRdID0KKwkJCSh1aW50OF90KSAoYnVmRW5kIC0gYnVmU3RhcnQgLSAyKTsKKworCQlQRUxPRzEoY2ZnX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cxLCBGTCgiaWQgJWQgbWF4ICVkIGJ1ZlN0YXJ0ICVkIGJ1ZkVuZCAlZCIpLCBpLAorCQkJICAgICAgIHBNYWMtPmNmZy5nQ2ZnU0J1ZltidWZTdGFydF0sIGJ1ZlN0YXJ0LCBidWZFbmQpOworCQkgICAgICAgKQorCisJCWJ1ZkVuZCA9IGJ1ZlN0YXJ0OworCX0KKworCS8qIEluaXRpYWxpemUgc3RyaW5nIGRlZmF1bHRzICovCisJc3RyU2l6ZSA9IHBIZHItPnNCdWZTaXplOworCXdoaWxlIChzdHJTaXplKSB7CisJCXVpbnQzMl90IHBhcmFtSWQsIHBhcmFtTGVuLCBwYXJhbUxlbkNlaWw0OworCisJCWlmIChzdHJTaXplIDwgNCkgeworCQkJUEVMT0dFKGNmZ19sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJFcnJvciBwYXJzaW5nIHN0ciBkZWZhdWx0cywgcmVtICVkIGJ5dGVzIiksCisJCQkJICAgICAgIHN0clNpemUpOworCQkJICAgICAgICkKKwkJCXJldFZhbCA9IFdOSV9DRkdfSU5WQUxJRF9MRU47CisJCQlnb3RvIGVuZDsKKwkJfQorCQlwYXJhbUlkID0gKnBTcmMgPj4gMTY7CisJCXBhcmFtTGVuID0gKnBTcmMgJiAweGZmOworCQlwU3JjKys7CisJCXN0clNpemUgLT0gNDsKKworCQlwYXJhbUxlbkNlaWw0ID0gKChwYXJhbUxlbiArIDMpID4+IDIpOworCQlpZiAoc3RyU2l6ZSA8IHBhcmFtTGVuQ2VpbDQgPDwgMikgeworCQkJUEVMT0dFKGNmZ19sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJFcnJvciBwYXJzaW5nIHN0ciBkZWZhdWx0cywgcmVtICVkIGJ5dGVzIiksCisJCQkJICAgICAgIHN0clNpemUpOworCQkJICAgICAgICkKKwkJCVBFTE9HRShjZmdfbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgicGFyYW0gaWQgJWQgbGVuICVkIGJ5dGVzIiksCisJCQkJICAgICAgIHBhcmFtSWQsIHBhcmFtTGVuKTsKKwkJCSAgICAgICApCisJCQlyZXRWYWwgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworCQkJZ290byBlbmQ7CisJCX0KKwkJZm9yIChqID0gMDsgaiA8IHBhcmFtTGVuQ2VpbDQ7IGorKykgeworCQkJcFN0cls0ICogal0gPSAodWludDhfdCkgKCpwU3JjID4+IDI0KSAmIDB4ZmY7CisJCQlwU3RyWzQgKiBqICsgMV0gPSAodWludDhfdCkgKCpwU3JjID4+IDE2KSAmIDB4ZmY7CisJCQlwU3RyWzQgKiBqICsgMl0gPSAodWludDhfdCkgKCpwU3JjID4+IDgpICYgMHhmZjsKKwkJCXBTdHJbNCAqIGogKyAzXSA9ICh1aW50OF90KSAoKnBTcmMpICYgMHhmZjsKKworCQkJcFNyYysrOworCQkJc3RyU2l6ZSAtPSA0OworCQl9CisKKwkJUEVMT0cxKGNmZ19sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMSwgRkwoInNldCBzdHIgaWQgJWQgbGVuICVkIiksIHBhcmFtSWQsCisJCQkgICAgICAgcGFyYW1MZW4pOworCQkgICAgICAgKQorCisJCWlmIChjZmdfc2V0X3N0cihwTWFjLCAodWludDE2X3QpIHBhcmFtSWQsIHBTdHIsIHBhcmFtTGVuKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQlQRUxPR0UoY2ZnX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoIkVycm9yIHNldHRpbmcgc3RyIGRlZmF1bHQgcGFyYW0gJWQgbGVuICVkIiksCisJCQkJICAgICAgIHBhcmFtSWQsIHBhcmFtTGVuKTsKKwkJCSAgICAgICApCisJCQlyZXRWYWwgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworCQkJZ290byBlbmQ7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIGRlZmF1bHQgbG9nIGxldmVsIGJhc2VkIG9uIGNvbmZpZyAqLworCXdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19MT0dfTEVWRUwsICZsb2dMZXZlbCk7CisJZm9yIChpID0gMDsgaSA8IExPR19FTlRSWV9OVU07IGkrKykKKwkJcE1hYy0+dXRpbHMuZ0xvZ0V2dExldmVsW2ldID0gcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW2ldID0KKwkJCQkJCSAgICAgIGxvZ0xldmVsOworCisJLyogU2V0IHN0YXR1cyB0byBSRUFEWSAqLworCXBNYWMtPmNmZy5nQ2ZnU3RhdHVzID0gQ0ZHX1NVQ0NFU1M7CisJcmV0VmFsID0gV05JX0NGR19TVUNDRVNTOworCVBFTE9HMShjZmdfbG9nKHBNYWMsIExPRzEsICI8Q0ZHPiBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Iik7KQorCitlbmQgOgorCisJaWYgKHJldFZhbCAhPSBXTklfQ0ZHX1NVQ0NFU1MpCisJCXBNYWMtPmNmZy5nQ2ZnU3RhdHVzID0gQ0ZHX0ZBSUxVUkU7CisKKwkvKiBTZW5kIHJlc3BvbnNlIG1lc3NhZ2UgdG8gaG9zdCAqLworCXBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfRE5MRF9DTkZfUkVTXSA9IHJldFZhbDsKKwljZmdfc2VuZF9ob3N0X21zZyhwTWFjLCBXTklfQ0ZHX0ROTERfQ05GLCBXTklfQ0ZHX0ROTERfQ05GX0xFTiwKKwkJCSAgV05JX0NGR19ETkxEX0NORl9OVU0sIHBNYWMtPmNmZy5nUGFyYW1MaXN0LCAwLCAwKTsKKworCS8qIG5vdGlmeSBXTUEgdGhhdCB0aGUgY29uZmlnIGhhcyBkb3dubG9hZGVkICovCisJbW1oTXNnLnR5cGUgPSBTSVJfQ0ZHX0RPV05MT0FEX0NPTVBMRVRFX0lORDsKKwltbWhNc2cuYm9keXB0ciA9IE5VTEw7CisJbW1oTXNnLmJvZHl2YWwgPSAwOworCisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbW1oTXNnLnR5cGUpKTsKKwlpZiAod21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1taE1zZykgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShjZmdfbG9nKHBNYWMsIExPR0UsIEZMKCJXTUFQb3N0TXNnQXBpIGZhaWxlZCEiKSk7KQorCX0KKworfSAvKioqIGVuZCBwcm9jRG5sZFJzcCgpICoqKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBwcm9jX2dldF9yZXEoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgQ0ZHX0dFVF9SRVEgbWVzc2FnZSBmcm9tIGhvc3QuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqIEZvciBldmVyeSBwYXJhbWV0ZXIgSUQgc3BlY2lmaWVkIG9uIHRoZSBsaXN0LCBDRkcgd2lsbCBzZW5kIGEgc2VwYXJhdGUKKyAqIENGR19HRVRfUlNQIGJhY2sgdG8gaG9zdC4KKyAqCisgKiBAcGFyYW0gbGVuZ3RoOiAgbWVzc2FnZSBsZW5ndGgKKyAqIEBwYXJhbSBwUGFyYW06ICBwYXJhbWV0ZXIgbGlzdCBwb2ludGVyCisgKgorICogQHJldHVybiBOb25lCisgKgorICovCitzdGF0aWMgdm9pZCBwcm9jX2dldF9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgbGVuZ3RoLCB1aW50MzJfdCAqcFBhcmFtKQoreworCXVpbnQxNl90IGNmZ0lkLCBpOworCXVpbnQzMl90IHZhbHVlLCB2YWx1ZUxlbiwgcmVzdWx0OworCXVpbnQzMl90ICpwVmFsdWU7CisKKwlQRUxPRzEoY2ZnX2xvZyhwTWFjLCBMT0cxLCBGTCgiUmN2ZCBjZmcgZ2V0IHJlcXVlc3QgJWQgYnl0ZXMiKSwgbGVuZ3RoKTspCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aCAvIDQ7IGkrKykKKwkJUEVMT0cyKGNmZ19sb2cocE1hYywgTE9HMiwgRkwoIlslMmRdIDB4JTA4eCIpLCBpLCBwUGFyYW1baV0pOykKKworCQlpZiAoIXBNYWMtPmNmZy5nQ2ZnU3RhdHVzKSB7CisJCQljZmdJZCA9ICh1aW50MTZfdCkgc2lyX3JlYWRfdTMyX24oKHVpbnQ4X3QgKikgcFBhcmFtKTsKKwkJCVBFTE9HRShjZmdfbG9nKHBNYWMsIExPR0UsIEZMKCJDRkcgbm90IHJlYWR5LCBwYXJhbSAlZCIpLCBjZmdJZCk7KQorCQkJcE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19HRVRfUlNQX1JFU10gPQorCQkJCVdOSV9DRkdfTk9UX1JFQURZOworCQkJcE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19HRVRfUlNQX1BJRF0gPSBjZmdJZDsKKwkJCXBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfR0VUX1JTUF9QTEVOXSA9IDA7CisJCQljZmdfc2VuZF9ob3N0X21zZyhwTWFjLCBXTklfQ0ZHX0dFVF9SU1AsCisJCQkJCSAgV05JX0NGR19HRVRfUlNQX1BBUlRJQUxfTEVOLCBXTklfQ0ZHX0dFVF9SU1BfTlVNLAorCQkJCQkgIHBNYWMtPmNmZy5nUGFyYW1MaXN0LCAwLCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFByb2Nlc3MgYWxsIHBhcmFtZXRlciBJRCdzIG9uIHRoZSBsaXN0ICovCisJCQl3aGlsZSAobGVuZ3RoID49IHNpemVvZih1aW50MzJfdCkpIHsKKwkJCQljZmdJZCA9ICh1aW50MTZfdCkgKnBQYXJhbSsrOworCQkJCXBWYWx1ZSA9IDA7CisJCQkJdmFsdWVMZW4gPSAwOworCisJCQkJUEVMT0cxKGNmZ19sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0cxLCBGTCgiQ2ZnIGdldCBwYXJhbSAlZCIpLCBjZmdJZCk7CisJCQkJICAgICAgICkKKwkJCQkvKiBDaGVjayBmb3IgdmFsaWQgcGFyYW1ldGVyIElELCBldGMuLi4gKi8KKwkJCQlpZiAoY2hlY2tfcGFyYW0KKwkJCQkJICAgIChwTWFjLCBjZmdJZCwgQ0ZHX0NUTF9SRSwgV05JX0NGR19XT19QQVJBTSwKKwkJCQkJICAgICZyZXN1bHQpKSB7CisJCQkJCWlmICgocE1hYy0+Y2ZnLmdDZmdFbnRyeVtjZmdJZF0uCisJCQkJCSAgICAgY29udHJvbCAmIENGR19DVExfSU5UKSAhPSAwKSB7CisJCQkJCQkvKiBHZXQgaW50ZWdlciBwYXJhbWV0ZXIgKi8KKwkJCQkJCXJlc3VsdCA9CisJCQkJCQkJKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgY2ZnSWQsICZ2YWx1ZSkKKwkJCQkJCQkgPT0KKwkJCQkJCQkgZVNJUl9TVUNDRVNTID8gV05JX0NGR19TVUNDRVNTIDoKKwkJCQkJCQkgV05JX0NGR19PVEhFUl9FUlJPUik7CisJCQkJCQlwVmFsdWUgPSAmdmFsdWU7CisJCQkJCQl2YWx1ZUxlbiA9IHNpemVvZih1aW50MzJfdCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBHZXQgc3RyaW5nIHBhcmFtZXRlciAqLworCQkJCQkJdmFsdWVMZW4gPSBzaXplb2YocE1hYy0+Y2ZnLmdTQnVmZmVyKTsKKwkJCQkJCXJlc3VsdCA9CisJCQkJCQkJKHdsYW5fY2ZnX2dldF9zdHIKKwkJCQkJCQkJIChwTWFjLCBjZmdJZCwgcE1hYy0+Y2ZnLmdTQnVmZmVyLAorCQkJCQkJCQkgJnZhbHVlTGVuKQorCQkJCQkJCSA9PSBlU0lSX1NVQ0NFU1MgPyBXTklfQ0ZHX1NVQ0NFU1MgOgorCQkJCQkJCSBXTklfQ0ZHX09USEVSX0VSUk9SKTsKKwkJCQkJCXBWYWx1ZSA9CisJCQkJCQkJKHVpbnQzMl90ICopIHBNYWMtPmNmZy5nU0J1ZmZlcjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCVBFTE9HRShjZmdfbG9nCisJCQkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJCQkgICAgICAgRkwoIkNoZWNrIHBhcmFtIGZhaWxlZCwgcGFyYW0gJWQiKSwKKwkJCQkJCSAgICAgICBjZmdJZCk7CisJCQkJCSAgICAgICApCisJCQkJCXJlc3VsdCA9IFdOSV9DRkdfSU5WQUxJRF9MRU47CisJCQkJfQorCisJCQkJLyogU2VuZCByZXNwb25zZSBtZXNzYWdlIHRvIGhvc3QgKi8KKwkJCQlwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX0dFVF9SU1BfUkVTXSA9IHJlc3VsdDsKKwkJCQlwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX0dFVF9SU1BfUElEXSA9IGNmZ0lkOworCQkJCXBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfR0VUX1JTUF9QTEVOXSA9IHZhbHVlTGVuOworCisJCQkJLyogV2UgbmVlZCB0byByb3VuZCB1cCBidWZmZXIgbGVuZ3RoIHRvIHdvcmQtaW5jcmVtZW50ICovCisJCQkJdmFsdWVMZW4gPSAoKCh2YWx1ZUxlbiArIDMpID4+IDIpIDw8IDIpOworCQkJCWNmZ19zZW5kX2hvc3RfbXNnKHBNYWMsIFdOSV9DRkdfR0VUX1JTUCwKKwkJCQkJCSAgV05JX0NGR19HRVRfUlNQX1BBUlRJQUxfTEVOICsgdmFsdWVMZW4sCisJCQkJCQkgIFdOSV9DRkdfR0VUX1JTUF9OVU0sCisJCQkJCQkgIHBNYWMtPmNmZy5nUGFyYW1MaXN0LCB2YWx1ZUxlbiwgcFZhbHVlKTsKKworCQkJCS8qIERlY3JlbWVudCBsZW5ndGggKi8KKwkJCQlsZW5ndGggLT0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCX0KKwkJfQorCit9IC8qKiogZW5kIHByb2NHZXRSZXEoKSAqKiovCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcHJvY19zZXRfcmVxX2ludGVybmFsKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIENGR19TRVRfUkVRIG1lc3NhZ2UgZnJvbSBob3N0LgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogLSBUaGUgbWVzc2FnZSBjb250ZW50IGlzIGNvZGVkIGluIFRMViBmb3JtYXQuCisgKiAtIEZvciBzdHJpbmcgcGFyYW1ldGVyLCB0aGUgbGVuZ3RoIGZpZWxkIGlzIGJ5dGUgYWNjdXJhdGUuICBIb3dldmVyLAorICogICB0aGUgbmV4dCBUTFYgc2V0IHdpbGwgYmVnaW4gb24gdGhlIG5leHQgd29yZCBib3VuZGFyeS4KKyAqCisgKiBOT1RFOgorICogLSBGb3IgZXZlcnkgcGFyYW1ldGVyIElEIHNwZWNpZmllZCBvbiB0aGUgbGlzdCwgQ0ZHIHdpbGwgc2VuZCBhIHNlcGFyYXRlCisgKiBDRkdfU0VUX1JTUCBiYWNrIHRvIGhvc3QuCisgKgorICogQHBhcmFtIGxlbmd0aDogIG1lc3NhZ2UgbGVuZ3RoCisgKiBAcGFyYW0gcFBhcmFtOiAgcGFyYW1ldGVyIGxpc3QgcG9pbnRlcgorICogQHBhcmFtIGZSc3A6IHdoZXRoZXIgdG8gc2VuZCByZXNwb25zZSB0byBob3N0LiB0cnVlIG1lYW5zIHNlbmRpbmcuCisgKiBAcmV0dXJuIE5vbmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitwcm9jX3NldF9yZXFfaW50ZXJuYWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgbGVuZ3RoLCB1aW50MzJfdCAqcFBhcmFtLAorCQkgICAgICBib29sIGZSc3ApCit7CisJdWludDE2X3QgY2ZnSWQsIHZhbHVlTGVuLCB2YWx1ZUxlblJvdW5kZWRVcDQ7CisJdWludDMyX3QgdmFsdWUsIHJlc3VsdDsKKworCVBFTE9HMShjZmdfbG9nKHBNYWMsIExPR2wsIEZMKCJSY3ZkIGNmZyBzZXQgcmVxdWVzdCAlZCBieXRlcyIpLCBsZW5ndGgpOykKKworCWlmICghcE1hYy0+Y2ZnLmdDZmdTdGF0dXMpIHsKKwkJY2ZnSWQgPSAodWludDE2X3QpIHNpcl9yZWFkX3UzMl9uKCh1aW50OF90ICopIHBQYXJhbSk7CisJCVBFTE9HMShjZmdfbG9nKHBNYWMsIExPR1csIEZMKCJDRkcgbm90IHJlYWR5LCBwYXJhbSAlZCIpLCBjZmdJZCk7KQorCQlwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX1NFVF9DTkZfUkVTXSA9CisJCQlXTklfQ0ZHX05PVF9SRUFEWTsKKwkJcE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19TRVRfQ05GX1BJRF0gPSBjZmdJZDsKKwkJaWYgKGZSc3ApIHsKKwkJCWNmZ19zZW5kX2hvc3RfbXNnKHBNYWMsIFdOSV9DRkdfU0VUX0NORiwKKwkJCQkJICBXTklfQ0ZHX1NFVF9DTkZfTEVOLCBXTklfQ0ZHX1NFVF9DTkZfTlVNLAorCQkJCQkgIHBNYWMtPmNmZy5nUGFyYW1MaXN0LCAwLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFByb2Nlc3MgYWxsIFRMVnMgaW4gYnVmZmVyICovCisJCXdoaWxlIChsZW5ndGggPj0gKHNpemVvZih1aW50MzJfdCkgKiAyKSkgeworCQkJY2ZnSWQgPSAodWludDE2X3QpICpwUGFyYW0rKzsKKwkJCXZhbHVlTGVuID0gKHVpbnQxNl90KSAqcFBhcmFtKys7CisJCQlsZW5ndGggLT0gKHNpemVvZih1aW50MzJfdCkgKiAyKTsKKwkJCS8qIHZhbHVlIGxlbmd0aCByb3VuZGVkIHVwIHRvIGEgNCBieXRlIG11bHRpcGxlICovCisJCQl2YWx1ZUxlblJvdW5kZWRVcDQgPSAoKCh2YWx1ZUxlbiArIDMpID4+IDIpIDw8IDIpOworCisJCQkvKiBDaGVjayBmb3IgdmFsaWQgcmVxdWVzdCBiZWZvcmUgcHJvY2VlZGluZyAqLworCQkJaWYgKGNoZWNrX3BhcmFtCisJCQkJICAgIChwTWFjLCBjZmdJZCwgQ0ZHX0NUTF9XRSwgV05JX0NGR19ST19QQVJBTSwKKwkJCQkgICAgJnJlc3VsdCkpIHsKKwkJCQlQRUxPRzEoY2ZnX2xvZworCQkJCQkgICAgICAgKHBNYWMsIExPR1csCisJCQkJCSAgICAgICAoY2hhciAqKWdfY2ZnX3BhcmFtX25hbWVbY2ZnSWRdKTsKKwkJCQkgICAgICAgKQorCQkJCS8qIFByb2Nlc3MgaW50ZWdlciBwYXJhbWV0ZXIgKi8KKwkJCQlpZiAoKHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLgorCQkJCSAgICAgY29udHJvbCAmIENGR19DVExfSU5UKSAhPSAwKSB7CisJCQkJCS8qIFNldCBWQUxVRSAqLworCQkJCQlpZiAodmFsdWVMZW4gIT0gc2l6ZW9mKHVpbnQzMl90KSkgeworCQkJCQkJUEVMT0dFKGNmZ19sb2cKKwkJCQkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJCQkJICAgICAgIEZMCisJCQkJCQkJCSAgICAgICAoIkludmFsaWQgdmFsdWUgbGVuZ3RoICVkIGluIHNldCBwYXJhbSAlZCAodG90ICVkKSIpLAorCQkJCQkJCSAgICAgICB2YWx1ZUxlbiwgY2ZnSWQsCisJCQkJCQkJICAgICAgIGxlbmd0aCk7CisJCQkJCQkgICAgICAgKQorCQkJCQkJcmVzdWx0ID0KKwkJCQkJCQlXTklfQ0ZHX0lOVkFMSURfTEVOOworCQkJCQl9IGVsc2UgeworCQkJCQkJdmFsdWUgPSAqcFBhcmFtOworCQkJCQkJUEVMT0cxKGNmZ19sb2cKKwkJCQkJCQkgICAgICAgKHBNYWMsIExPR1csCisJCQkJCQkJICAgICAgIEZMCisJCQkJCQkJCSAgICAgICAoIkNmZyBzZXQgaW50ICVkIGxlbiAlZCglZCkgdmFsICVkIiksCisJCQkJCQkJICAgICAgIGNmZ0lkLCB2YWx1ZUxlbiwKKwkJCQkJCQkgICAgICAgdmFsdWVMZW5Sb3VuZGVkVXA0LAorCQkJCQkJCSAgICAgICB2YWx1ZSk7CisJCQkJCQkgICAgICAgKQorCQkJCQkJcmVzdWx0ID0KKwkJCQkJCQkoY2ZnX3NldF9pbnQKKwkJCQkJCQkJIChwTWFjLCBjZmdJZCwKKwkJCQkJCQkJIHZhbHVlKSA9PQorCQkJCQkJCSBlU0lSX1NVQ0NFU1MgPworCQkJCQkJCSBXTklfQ0ZHX1NVQ0NFU1MgOgorCQkJCQkJCSBXTklfQ0ZHX09USEVSX0VSUk9SKTsKKwkJCQkJCWlmIChyZXN1bHQgPT0gV05JX0NGR19TVUNDRVNTKSB7CisJCQkJCQkJaWYgKGNmZ19uZWVkX3Jlc3RhcnQKKwkJCQkJCQkJICAgIChwTWFjLCBjZmdJZCkpIHsKKwkJCQkJCQkJcmVzdWx0ID0KKwkJCQkJCQkJCVdOSV9DRkdfTkVFRF9SRVNUQVJUOworCQkJCQkJCX0gZWxzZQorCQkJCQkJCWlmIChjZmdfbmVlZF9yZWxvYWQKKwkJCQkJCQkJICAgIChwTWFjLCBjZmdJZCkpIHsKKwkJCQkJCQkJcmVzdWx0ID0KKwkJCQkJCQkJCVdOSV9DRkdfTkVFRF9SRUxPQUQ7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCS8qIFByb2Nlc3Mgc3RyaW5nIHBhcmFtZXRlciAqLworCQkJCWVsc2UgeworCQkJCQlpZiAodmFsdWVMZW5Sb3VuZGVkVXA0ID4gbGVuZ3RoKSB7CisJCQkJCQlQRUxPR0UoY2ZnX2xvZworCQkJCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkJCQkgICAgICAgRkwKKwkJCQkJCQkJICAgICAgICgiSW52YWxpZCBzdHJpbmcgbGVuZ3RoICVkIgorCQkJCQkJCQkgICAgICAgImluIHNldCBwYXJhbSAlZCAodG90ICVkKSIpLAorCQkJCQkJCSAgICAgICB2YWx1ZUxlbiwgY2ZnSWQsCisJCQkJCQkJICAgICAgIGxlbmd0aCk7CisJCQkJCQkgICAgICAgKQorCQkJCQkJcmVzdWx0ID0KKwkJCQkJCQlXTklfQ0ZHX0lOVkFMSURfTEVOOworCQkJCQl9IGVsc2UgeworCQkJCQkJZ2V0X3N0cl92YWx1ZSgodWludDhfdCAqKSBwUGFyYW0sCisJCQkJCQkJICAgICAgcE1hYy0+Y2ZnLmdTQnVmZmVyLAorCQkJCQkJCSAgICAgIHZhbHVlTGVuKTsKKwkJCQkJCVBFTE9HMShjZmdfbG9nCisJCQkJCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJCQkJCSAgICAgICBGTAorCQkJCQkJCQkgICAgICAgKCJDZmcgc2V0IHN0ciAlZCBsZW4gJWQoJWQpIGJ5dGVzIiksCisJCQkJCQkJICAgICAgIGNmZ0lkLCB2YWx1ZUxlbiwKKwkJCQkJCQkgICAgICAgdmFsdWVMZW5Sb3VuZGVkVXA0KTsKKwkJCQkJCSAgICAgICApCisJCQkJCQlyZXN1bHQgPQorCQkJCQkJCShjZmdfc2V0X3N0cgorCQkJCQkJCQkgKHBNYWMsIGNmZ0lkLAorCQkJCQkJCQkgcE1hYy0+Y2ZnLmdTQnVmZmVyLAorCQkJCQkJCQkgdmFsdWVMZW4pID09CisJCQkJCQkJIGVTSVJfU1VDQ0VTUyA/CisJCQkJCQkJIFdOSV9DRkdfU1VDQ0VTUyA6CisJCQkJCQkJIFdOSV9DRkdfT1RIRVJfRVJST1IpOworCQkJCQkJaWYgKHJlc3VsdCA9PSBXTklfQ0ZHX1NVQ0NFU1MpIHsKKwkJCQkJCQlpZiAoY2ZnX25lZWRfcmVzdGFydAorCQkJCQkJCQkgICAgKHBNYWMsIGNmZ0lkKSkgeworCQkJCQkJCQlyZXN1bHQgPQorCQkJCQkJCQkJV05JX0NGR19ORUVEX1JFU1RBUlQ7CisJCQkJCQkJfSBlbHNlCisJCQkJCQkJaWYgKGNmZ19uZWVkX3JlbG9hZAorCQkJCQkJCQkgICAgKHBNYWMsIGNmZ0lkKSkgeworCQkJCQkJCQlyZXN1bHQgPQorCQkJCQkJCQkJV05JX0NGR19ORUVEX1JFTE9BRDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVBFTE9HRShjZmdfbG9nCisJCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkJICAgICAgIEZMKCJDaGVjayBwYXJhbSBmYWlsZWQsIHBhcmFtICVkIiksCisJCQkJCSAgICAgICBjZmdJZCk7CisJCQkJICAgICAgICkKKwkJCQlyZXN1bHQgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworCQkJfQorCisJCQkvKiBTZW5kIGNvbmZpcm0gbWVzc2FnZSB0byBob3N0ICovCisJCQlwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX1NFVF9DTkZfUkVTXSA9IHJlc3VsdDsKKwkJCXBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfU0VUX0NORl9QSURdID0gY2ZnSWQ7CisJCQlpZiAoZlJzcCkgeworCQkJCWNmZ19zZW5kX2hvc3RfbXNnKHBNYWMsIFdOSV9DRkdfU0VUX0NORiwKKwkJCQkJCSAgV05JX0NGR19TRVRfQ05GX0xFTiwKKwkJCQkJCSAgV05JX0NGR19TRVRfQ05GX05VTSwKKwkJCQkJCSAgcE1hYy0+Y2ZnLmdQYXJhbUxpc3QsIDAsIDApOworCQkJfSBlbHNlIHsKKwkJCQlQRUxPR1coY2ZnX2xvZworCQkJCQkgICAgICAgKHBNYWMsIExPRzIsICIgIENGR0lEICVkIG5vIHJzcCIsIGNmZ0lkKTsKKwkJCQkgICAgICAgKQorCQkJfQorCisJCQlpZiAodmFsdWVMZW5Sb3VuZGVkVXA0ID4gbGVuZ3RoKQorCQkJCWxlbmd0aCA9IDA7CisJCQllbHNlIHsKKwkJCQlsZW5ndGggLT0gdmFsdWVMZW5Sb3VuZGVkVXA0OworCQkJCXBQYXJhbSArPSAodmFsdWVMZW5Sb3VuZGVkVXA0ID4+IDIpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwcm9jX3NldF9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgbGVuZ3RoLCB1aW50MzJfdCAqcFBhcmFtKQoreworCXByb2Nfc2V0X3JlcV9pbnRlcm5hbChwTWFjLCBsZW5ndGgsIHBQYXJhbSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jX3NldF9yZXFfbm9fcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGxlbmd0aCwgdWludDMyX3QgKnBQYXJhbSkKK3sKKwlwcm9jX3NldF9yZXFfaW50ZXJuYWwocE1hYywgbGVuZ3RoLCBwUGFyYW0sIGZhbHNlKTsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBjaGVja19wYXJhbSgpCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2sgb24gYSBwYXJhbWV0ZXIuCisgKgorICogTE9HSUM6CisgKiAtICBJZiBjZmdJZCBpcyBvdXQgb2YgYm91bmQgb3IgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgcmVzdWx0CisgKiAgICBXTklfQ0ZHX0lOVkFMSURfUElEIGlzIHJldHVybmVkIGF0IGFkZHJlc3Mgc3BlY2lmaWVkIGluIHBSZXN1bHQuCisgKgorICogLSAgSWYgc3BlY2lmaWVkICdmbGFnJyBpcyBub3Qgc2V0IGluIHRoZSBwYXJhbWV0ZXIgY29udHJvbCBlbnRyeSwKKyAqICAgICdmYWlsZWRSZXN1bHQnIGlzIHJldHVybmVkIGF0IGFkZHJlc3Mgc3BlY2lmaWVkIGluIHBSZXN1bHQuCisgKgorICogQVNTVU1QVElPTlM6CisgKiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWxseSwgJ3BSZXN1bHQnIGlzIGFsd2F5cyB2YWxpZC4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKgorICogQHJldHVybiB0cnVlOiAgIFBhcmFtZXRlciBpcyB2YWxpZCBhbmQgbWF0Y2hlcyBjaGVja2VkIGNvbmRpdGlvbiBcbgorICogQHJldHVybiBmYWxzZTogIFBhcmFtZXRlciBlaXRoZXIgaXMgbm90IHZhbGlkIG9yIGRvZXMgbm90IG1hdGNoCisgKiAgICAgICAgICAgICAgICAgY2hlY2tlZCBjb25kaXRpb24uCisgKgorICovCitzdGF0aWMgdWludDhfdAorY2hlY2tfcGFyYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgY2ZnSWQsIHVpbnQzMl90IGZsYWcsCisJICAgIHVpbnQzMl90IGZhaWxlZFJlc3VsdCwgdWludDMyX3QgKnBSZXN1bHQpCit7CisJLyogQ2hlY2sgaWYgcGFyYW1ldGVyIElEIGlzIG91dCBvZiBib3VuZCAqLworCWlmIChjZmdJZCA+PSBDRkdfUEFSQU1fTUFYX05VTSkgeworCQlQRUxPR0UoY2ZnX2xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBwYXJhbSBpZCAlZCIpLCBjZmdJZCk7KQorCQkqIHBSZXN1bHQgPSBXTklfQ0ZHX0lOVkFMSURfUElEOworCX0gZWxzZSB7CisJCS8qIENoZWNrIGlmIHBhcmFtZXRlciBpcyB2YWxpZCAqLworCQlpZiAoKHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLmNvbnRyb2wgJiBDRkdfQ1RMX1ZBTElEKSA9PSAwKSB7CisJCQlQRUxPR0UoY2ZnX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoIlBhcmFtIGlkICVkIG5vdCB2YWxpZCIpLCBjZmdJZCk7CisJCQkgICAgICAgKQorCQkJKiBwUmVzdWx0ID0gV05JX0NGR19JTlZBTElEX1BJRDsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIGNvbnRyb2wgZmllbGQgYWdhaW5zdCBmbGFnICovCisJCQlpZiAoKHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLmNvbnRyb2wgJiBmbGFnKSA9PSAwKSB7CisJCQkJUEVMT0dFKGNmZ19sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCQkgICAgICAgRkwoIlBhcmFtIGlkICVkIHdyb25nIHBlcm1pc3Npb25zICV4IiksCisJCQkJCSAgICAgICBjZmdJZCwKKwkJCQkJICAgICAgIHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLmNvbnRyb2wpOworCQkJCSAgICAgICApCisJCQkJKiBwUmVzdWx0ID0gZmFpbGVkUmVzdWx0OworCQkJfSBlbHNlCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworCit9IC8qKiogY2ZnUGFyYW1DaGVjaygpICoqKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBnZXRfc3RyX3ZhbHVlKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gY29waWVzIGEgc3RyaW5nIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcEJ1ZjogICAgaW5wdXQgZGF0YSBidWZmZXIKKyAqIEBwYXJhbSBwVmFsdWU6ICBhZGRyZXNzIHdoZXJlIGRhdGEgaXMgcmV0dXJuZWQKKyAqIEBwYXJhbSBsZW5ndGg6ICBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICoKKyAqIEByZXR1cm4gTm9uZQorICoKKyAqLworc3RhdGljIHZvaWQgZ2V0X3N0cl92YWx1ZSh1aW50OF90ICpwQnVmLCB1aW50OF90ICpwVmFsdWUsIHVpbnQzMl90IGxlbmd0aCkKK3sKKwl1aW50OF90ICpwRW5kOworCisJcEVuZCA9IHBWYWx1ZSArIGxlbmd0aDsKKwl3aGlsZSAocFZhbHVlIDwgcEVuZCkKKwkJKnBWYWx1ZSsrID0gKnBCdWYrKzsKK30gLyoqKiBlbmQgZ2V0X3N0cl92YWx1ZSgpICoqKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBwcm9jZXNzX2NmZ19kb3dubG9hZF9yZXEoKQorICoKKyAqIEZVTkNUSU9OOiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIENmZyBEb3dubG9hZCBhbmQgaXMgaW52b2tlZAorICogICAgICAgICAgIG9ubHkgaW4gdGhlIGNhc2Ugb2YgUHJpbWEgb3IgdGhlIEludGVncmF0ZWQgU09DCisgKiAgICAgICAgICAgc29sdXRpb25zLiBOb3QgYXBwbGljYWJsZSB0byBWb2xhbnMgb3IgTGlicmEKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjOiBQb2ludGVyIHRvIE1hYyBTdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqCisgKi8KKwordm9pZAorcHJvY2Vzc19jZmdfZG93bmxvYWRfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJaW50MzJfdCBpOworCXVpbnQzMl90ICAgIGluZGV4OworCXVpbnQ4X3QgICAgKnBEc3RUZXN0LCAqcFNyY1Rlc3Q7CisJdWludDhfdCAgICAgbGVuOworCWNmZ3N0YXRpY19zdHJpbmcgKnBTdHJDZmc7CisJdWludDMyX3QgICAgYnVmU3RhcnQsIGJ1ZkVuZDsKKwl1aW50MzJfdCAgICBsb2dMZXZlbCwgcmV0VmFsOworCXVpbnQzMl90ICAgIGlDb3VudCA9IDA7CisJdWludDMyX3QgICAgc0NvdW50ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBDRkdfUEFSQU1fTUFYX05VTSA7IGkrKykgeworCQlpZiAoKGNmZ19zdGF0aWNbaV0uY29udHJvbCAmIENGR19DVExfVkFMSUQpICE9IDApIHsKKwkJCWlmICghKGNmZ19zdGF0aWNbaV0uY29udHJvbCAmIENGR19DVExfSU5UKSkgeworCQkJCXBTdHJDZmcgPSAoY2Znc3RhdGljX3N0cmluZyAqKWNmZ19zdGF0aWNbaV0uCisJCQkJCQkJCXBTdHJEYXRhOworCQkJCWlmIChwU3RyQ2ZnID09IE5VTEwpIHsKKwkJCQkJUEVMT0dFKGNmZ19sb2cocE1hYywgTE9HRSwKKwkJCQkJICBGTCgicFN0ckNmZyBpcyBOVUxMIGZvciBDZmlnSUQgOiAlZCIpLAorCQkJCQkgIGkpOykKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWluZGV4ID0gc0NvdW50ICYgQ0ZHX0JVRl9JTkRYX01BU0s7CisJCQkJc0NvdW50ICs9IHBTdHJDZmctPm1heExlbiArIDEgKyAxOworCQkJfSBlbHNlIHsKKwkJCQlpbmRleCA9IGlDb3VudCAmIENGR19CVUZfSU5EWF9NQVNLOworCQkJCWlDb3VudCsrOworCQkJfQorCQl9IGVsc2UgeworCQkJaW5kZXggPSAwOworCQl9CisJCXBNYWMtPmNmZy5nQ2ZnRW50cnlbaV0uY29udHJvbCA9IGNmZ19zdGF0aWNbaV0uY29udHJvbCB8IGluZGV4OworCX0KKworCS8qRmlsbCB0aGUgU0JVRiB3aWggbWF4TGVuZ3RoKi8KKwlidWZFbmQgPSBwTWFjLT5jZmcuZ0NmZ01heFNCdWZTaXplOworCWZvciAoaSA9IENGR19QQVJBTV9NQVhfTlVNIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKChwTWFjLT5jZmcuZ0NmZ0VudHJ5W2ldLmNvbnRyb2wgJiBDRkdfQ1RMX0lOVCkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmICgocE1hYy0+Y2ZnLmdDZmdFbnRyeVtpXS5jb250cm9sICYgQ0ZHX0NUTF9WQUxJRCkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWJ1ZlN0YXJ0ID0gcE1hYy0+Y2ZnLmdDZmdFbnRyeVtpXS5jb250cm9sICYgQ0ZHX0JVRl9JTkRYX01BU0s7CisJCXBNYWMtPmNmZy5nQ2ZnU0J1ZltidWZTdGFydF0gPSAodWludDhfdCkoYnVmRW5kIC0gYnVmU3RhcnQgLSAyKTsKKworCQlQRUxPRzEoY2ZnTG9nKHBNYWMsIExPRzEsIEZMKCJpZCAlZCBtYXggJWQgYnVmU3RhcnQgJWQgYnVmRW5kICVkIiksCisJCQkJCWksIHBNYWMtPmNmZy5nQ2ZnU0J1ZltidWZTdGFydF0sCisJCQkJCQlidWZTdGFydCwgYnVmRW5kKTspCisJCQlidWZFbmQgPSBidWZTdGFydDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0ZHX1BBUkFNX01BWF9OVU0gOyBpKyspIHsKKwkJaW5kZXggPSBwTWFjLT5jZmcuZ0NmZ0VudHJ5W2ldLmNvbnRyb2wgJiBDRkdfQlVGX0lORFhfTUFTSzsKKworCQlpZiAoKHBNYWMtPmNmZy5nQ2ZnRW50cnlbaV0uY29udHJvbCAmIENGR19DVExfSU5UKSAhPSAwKSB7CisJCQlwTWFjLT5jZmcuZ0NmZ0lCdWZNaW5baW5kZXhdID0gY2ZnX3N0YXRpY1tpXS5jZmdJTWluOworCQkJcE1hYy0+Y2ZnLmdDZmdJQnVmTWF4W2luZGV4XSA9IGNmZ19zdGF0aWNbaV0uY2ZnSU1heDsKKwkJCXBNYWMtPmNmZy5nQ2ZnSUJ1ZltpbmRleF0gICAgPSBjZmdfc3RhdGljW2ldLmNmZ0lWYWw7CisJCX0gZWxzZSB7CisJCQl1aW50OF90IG1heFNhdmVkTGVuOworCQkJaWYgKChwTWFjLT5jZmcuZ0NmZ0VudHJ5W2ldLmNvbnRyb2wgJiBDRkdfQ1RMX1ZBTElEKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGluZGV4ID49IENGR19TVEFfU0JVRl9NQVhfU0laRSkKKwkJCQljb250aW51ZTsKKworCQkJcERzdFRlc3QgPSAmcE1hYy0+Y2ZnLmdDZmdTQnVmW2luZGV4XTsKKwkJCXBTdHJDZmcgPSAoY2Znc3RhdGljX3N0cmluZyAqKWNmZ19zdGF0aWNbaV0ucFN0ckRhdGE7CisJCQlwU3JjVGVzdCA9IHBTdHJDZmctPmRhdGE7CisJCQlpZiAoKHBEc3RUZXN0ID09IE5VTEwpIHx8IChwU3RyQ2ZnID09IE5VTEwpIHx8CisJCQkJCQkJKHBTcmNUZXN0ID09IE5VTEwpKQorCQkJCWNvbnRpbnVlOworCQkJbWF4U2F2ZWRMZW4gPSAqcERzdFRlc3Q7CisJCQlsZW4gPSBwU3RyQ2ZnLT5sZW5ndGg7CisJCQlpZiAobGVuID4gbWF4U2F2ZWRMZW4pCisJCQkJY29udGludWU7CisJCQkqcERzdFRlc3QrKyA9IHBTdHJDZmctPm1heExlbjsKKwkJCSpwRHN0VGVzdCsrID0gbGVuOworCQkJd2hpbGUgKGxlbikgeworCQkJCSpwRHN0VGVzdCsrID0gKnBTcmNUZXN0Kys7CisJCQkJbGVuLS07CisJCQl9CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIGRlZmF1bHQgbG9nIGxldmVsIGJhc2VkIG9uIGNvbmZpZyAqLworCXdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19MT0dfTEVWRUwsICZsb2dMZXZlbCk7CisJZm9yIChpID0gMDsgaSA8IExPR19FTlRSWV9OVU07IGkrKykKKwkJcE1hYy0+dXRpbHMuZ0xvZ0V2dExldmVsW2ldID0gcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW2ldID0KKwkJCQkJCSAgICAgIGxvZ0xldmVsOworCisJLyogU2V0IHN0YXR1cyB0byBSRUFEWSAqLworCXBNYWMtPmNmZy5nQ2ZnU3RhdHVzID0gQ0ZHX1NVQ0NFU1M7CisJcmV0VmFsID0gV05JX0NGR19TVUNDRVNTOworCVBFTE9HMShjZmdfbG9nKHBNYWMsIExPRzEsICI8Q0ZHPiBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Iik7KQorCisJcE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19ETkxEX0NORl9SRVNdID0gcmV0VmFsOworCit9IC8qKiogZW5kIFByb2Nlc3NEb3dubG9hZFJlcSgpICoqKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9jZmcvY2ZnX3NlbmRfbXNnLmMgYi9jb3JlL21hYy9zcmMvY2ZnL2NmZ19zZW5kX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYWQ3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvY2ZnL2NmZ19zZW5kX21zZy5jCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSBmb3IgY29tcG9zaW5nIGFuZCBzZW5kaW5nIG1lc3NhZ2VzCisgKiB0byBob3N0LgorICoKKyAqIEF1dGhvcjogICAgICBLZXZpbiBOZ3V5ZW4KKyAqIERhdGU6ICAgICAgICAwNC8wOS8wMgorICogSGlzdG9yeTotCisgKiAwNC8wOS8wMiAgICAgQ3JlYXRlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAiY2ZnX3ByaXYuaCIKKyNpbmNsdWRlICJsaW1fdHJhY2UuaCIKKyNpbmNsdWRlICJjZmdfZGVidWcuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBBVFRFTlRJT046ICBUaGUgZnVuY3Rpb25zIGNvbnRhaW5lZCBpbiB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgdXNlZCAgKi8KKy8qICAgICAgICAgICAgIGJ5IENGRyBtb2R1bGUgT05MWS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY2ZnX3NlbmRfaG9zdF9tc2coKQorICoKKyAqIEZVTkNUSU9OOgorICogU2VuZCBDTkYvUlNQIHRvIGhvc3QuCisgKgorICogTE9HSUM6CisgKiBQbGVhc2Ugc2VlIENvbmZpZ3VyYXRpb24gJiBTdGF0aXN0aWMgQ29sbGVjdGlvbiBNaWNyby1BcmNoaXRlY3R1cmUKKyAqIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gbXNnVHlwZTogICAgIG1lc3NhZ2UgdHlwZQorICogQHBhcmFtIG1zZ0xlbjogICAgICBtZXNzYWdlIGxlbmd0aAorICogQHBhcmFtIHBhcmFtTnVtOiAgICBudW1iZXIgb2YgcGFyYW1ldGVycworICogQHBhcmFtIHBQYXJhbUxpc3Q6ICBwb2ludGVyIHRvIHBhcmFtZXRlciBsaXN0CisgKiBAcGFyYW0gZGF0YUxlbjogICAgIGRhdGEgbGVuZ3RoCisgKiBAcGFyYW0gcERhdGE6ICAgICAgIHBvaW50ZXIgdG8gYWRkaXRpb25hbCBkYXRhCisgKgorICogQHJldHVybiBOb25lLgorICoKKyAqLwordm9pZAorY2ZnX3NlbmRfaG9zdF9tc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgbXNnVHlwZSwgdWludDMyX3QgbXNnTGVuLAorCQkgIHVpbnQzMl90IHBhcmFtTnVtLCB1aW50MzJfdCAqcFBhcmFtTGlzdCwgdWludDMyX3QgZGF0YUxlbiwKKwkJICB1aW50MzJfdCAqcERhdGEpCit7CisJdWludDMyX3QgKnBNc2csICpwRW5kOworCXRTaXJNc2dRIG1taE1zZzsKKworCS8qIHNhbml0eSAqLworCWlmICgocGFyYW1OdW0gPiAwKSAmJiAoTlVMTCA9PSBwUGFyYW1MaXN0KSkgeworCQlQRUxPR0UoY2ZnX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgicFBhcmFtTGlzdCBOVUxMIHdoZW4gcGFyYW1OdW0gZ3JlYXRlciB0aGFuIDAhIikpOworCQkgICAgICAgKQorCQlyZXR1cm47CisJfQorCWlmICgoZGF0YUxlbiA+IDApICYmIChOVUxMID09IHBEYXRhKSkgeworCQlQRUxPR0UoY2ZnX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJwRGF0YSBOVUxMIHdoZW4gZGF0YUxlbiBncmVhdGVyIHRoYW4gMCEiKSk7CisJCSAgICAgICApCisJCXJldHVybjsKKwl9CisJLyogQWxsb2NhdGUgbWVzc2FnZSBidWZmZXIgKi8KKwlwTXNnID0gY2RmX21lbV9tYWxsb2MobXNnTGVuKTsKKwlpZiAoTlVMTCA9PSBwTXNnKSB7CisJCVBFTE9HRShjZmdfbG9nKHBNYWMsIExPR0UsIEZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlISIpKTspCisJCXJldHVybjsKKwl9CisJLyogRmlsbCBpbiBtZXNzYWdlIGRldGFpbHMgKi8KKwltbWhNc2cudHlwZSA9IG1zZ1R5cGU7CisJbW1oTXNnLmJvZHlwdHIgPSBwTXNnOworCW1taE1zZy5ib2R5dmFsID0gMDsKKwkoKHRTaXJNYk1zZyAqKSBwTXNnKS0+dHlwZSA9IG1zZ1R5cGU7CisJKCh0U2lyTWJNc2cgKikgcE1zZyktPm1zZ0xlbiA9ICh1aW50MTZfdCkgbXNnTGVuOworCisJc3dpdGNoIChtc2dUeXBlKSB7CisJY2FzZSBXTklfQ0ZHX0dFVF9SU1A6CisJY2FzZSBXTklfQ0ZHX1BBUkFNX1VQREFURV9JTkQ6CisJY2FzZSBXTklfQ0ZHX0ROTERfUkVROgorCWNhc2UgV05JX0NGR19ETkxEX0NORjoKKwljYXNlIFdOSV9DRkdfU0VUX0NORjoKKwkJLyogRmlsbCBpbiBwYXJhbWV0ZXJzICovCisJCXBNc2crKzsKKwkJaWYgKE5VTEwgIT0gcFBhcmFtTGlzdCkgeworCQkJcEVuZCA9IHBNc2cgKyBwYXJhbU51bTsKKwkJCXdoaWxlIChwTXNnIDwgcEVuZCkgeworCQkJCSpwTXNnKysgPSAqcFBhcmFtTGlzdCsrOworCQkJfQorCQl9CisJCS8qIENvcHkgZGF0YSBpZiB0aGVyZSBpcyBhbnkgKi8KKwkJaWYgKE5VTEwgIT0gcERhdGEpIHsKKwkJCXBFbmQgPSBwTXNnICsgKGRhdGFMZW4gPj4gMik7CisJCQl3aGlsZSAocE1zZyA8IHBFbmQpIHsKKwkJCQkqcE1zZysrID0gKnBEYXRhKys7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRUxPR0UoY2ZnX2xvZyhwTWFjLCBMT0dFLCBGTCgiVW5rbm93biBtc2cgJWQhIiksIChpbnQpbXNnVHlwZSk7KQorCQljZGZfbWVtX2ZyZWUocE1zZyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBTaGlwIGl0ICovCisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbW1oTXNnLnR5cGUpKTsKKwlzeXNfcHJvY2Vzc19tbWhfbXNnKHBNYWMsICZtbWhNc2cpOworCit9IC8qKiogZW5kIGNmZ19zZW5kX2hvc3RfbXNnKCkgKioqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL2RwaC9kcGhfaGFzaF90YWJsZS5jIGIvY29yZS9tYWMvc3JjL2RwaC9kcGhfaGFzaF90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYmJlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvZHBoL2RwaF9oYXNoX3RhYmxlLmMKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGRwaF9oYXNoX3RhYmxlLmNjIGltcGxlbWVudHMgdGhlIG1lbWJlciBmdW5jdGlvbnMgb2YKKyAqIERQSCBoYXNoIHRhYmxlIGNsYXNzLgorICoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAic2NoX2FwaS5oIgorI2luY2x1ZGUgImRwaF9nbG9iYWwuaCIKKyNpbmNsdWRlICJsaW1fZGVidWcuaCIKKworI2luY2x1ZGUgIndtYV9pZi5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogZHBoSGFzaFRhYmxlQ2xhc3MoKQorICoKKyAqIEZVTkNUSU9OOgorICogQ29uc3RydWN0b3IgZnVuY3Rpb24KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGRwaF9oYXNoX3RhYmxlX2NsYXNzX2luaXQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgICBkcGhIYXNoVGFibGVDbGFzcyAqcERwaEhhc2hUYWJsZSkKK3sKKwl1aW50MTZfdCBpOworCisJZm9yIChpID0gMDsgaSA8IHBEcGhIYXNoVGFibGUtPnNpemU7IGkrKykgeworCQlwRHBoSGFzaFRhYmxlLT5wSGFzaFRhYmxlW2ldID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcERwaEhhc2hUYWJsZS0+c2l6ZTsgaSsrKSB7CisJCXBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbaV0udmFsaWQgPSAwOworCQlwRHBoSGFzaFRhYmxlLT5wRHBoTm9kZUFycmF5W2ldLmFkZGVkID0gMDsKKwkJcERwaEhhc2hUYWJsZS0+cERwaE5vZGVBcnJheVtpXS5hc3NvY0lkID0gaTsKKwl9CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIGhhc2hfZnVuY3Rpb24KKyAqCisgKiBGVU5DVElPTjoKKyAqIEhhc2hpbmcgZnVuY3Rpb24KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFBZGRyIE1BQyBhZGRyZXNzIG9mIHRoZSBzdGF0aW9uCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit1aW50MTZfdCBoYXNoX2Z1bmN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc3RhQWRkcltdLCB1aW50MTZfdCBudW1TdGEpCit7CisJaW50IGk7CisJdWludDE2X3Qgc3VtID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXN1bSArPSBzdGFBZGRyW2ldOworCisJcmV0dXJuIChzdW0gJSBudW1TdGEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogZHBoX2xvb2t1cF9oYXNoX2VudHJ5CisgKgorICogRlVOQ1RJT046CisgKiBMb29rIHVwIGFuIGVudHJ5IGluIGhhc2ggdGFibGUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFBZGRyIE1BQyBhZGRyZXNzIG9mIHRoZSBzdGF0aW9uCisgKiBAcGFyYW0gcFN0YUlkIHBvaW50ZXIgdG8gdGhlIFN0YXRpb24gSUQgYXNzaWduZWQgdG8gdGhlIHN0YXRpb24KKyAqIEByZXR1cm4gcG9pbnRlciB0byBTVEEgaGFzaCBlbnRyeSBpZiBsb29rdXAgd2FzIGEgc3VjY2VzcyBcbgorICogICAgICAgICBOVUxMIGlmIGxvb2t1cCB3YXMgYSBmYWlsdXJlCisgKi8KKwordHBEcGhIYXNoTm9kZSBkcGhfbG9va3VwX2hhc2hfZW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzdGFBZGRyW10sCisJCQkJICAgIHVpbnQxNl90ICpwQXNzb2NJZCwKKwkJCQkgICAgZHBoSGFzaFRhYmxlQ2xhc3MgKnBEcGhIYXNoVGFibGUpCit7CisJdHBEcGhIYXNoTm9kZSBwdHIgPSBOVUxMOworCXVpbnQxNl90IGluZGV4ID0gaGFzaF9mdW5jdGlvbihwTWFjLCBzdGFBZGRyLCBwRHBoSGFzaFRhYmxlLT5zaXplKTsKKworCWZvciAocHRyID0gcERwaEhhc2hUYWJsZS0+cEhhc2hUYWJsZVtpbmRleF07IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CisJCWlmIChkcGhfY29tcGFyZV9tYWNfYWRkcihzdGFBZGRyLCBwdHItPnN0YUFkZHIpKSB7CisJCQkqcEFzc29jSWQgPSBwdHItPmFzc29jSWQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcHRyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogZHBoX2dldF9oYXNoX2VudHJ5CisgKgorICogRlVOQ1RJT046CisgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBoYXNoIG5vZGUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFJZCBTdGF0aW9uIElECisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gU1RBIGhhc2ggZW50cnkgaWYgbG9va3VwIHdhcyBhIHN1Y2Nlc3MgXG4KKyAqICAgICAgICAgTlVMTCBpZiBsb29rdXAgd2FzIGEgZmFpbHVyZQorICovCisKK3RwRHBoSGFzaE5vZGUgZHBoX2dldF9oYXNoX2VudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IHBlZXJJZHgsCisJCQkJIGRwaEhhc2hUYWJsZUNsYXNzICpwRHBoSGFzaFRhYmxlKQoreworCWlmIChwZWVySWR4IDwgcERwaEhhc2hUYWJsZS0+c2l6ZSkgeworCQlpZiAocERwaEhhc2hUYWJsZS0+cERwaE5vZGVBcnJheVtwZWVySWR4XS5hZGRlZCkKKwkJCXJldHVybiAmcERwaEhhc2hUYWJsZS0+cERwaE5vZGVBcnJheVtwZWVySWR4XTsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfSBlbHNlCisJCXJldHVybiBOVUxMOworCit9CisKK3N0YXRpYyBpbmxpbmUgdHBEcGhIYXNoTm9kZSBnZXRfbm9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGFzc29jSWQsCisJCQkJICAgICBkcGhIYXNoVGFibGVDbGFzcyAqcERwaEhhc2hUYWJsZSkKK3sKKwlyZXR1cm4gJnBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbYXNzb2NJZF07Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBkcGhfbG9va3VwX2Fzc29jX2lkCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGxvb2tzIHVwIGFzc29jSUQgZ2l2ZW4gdGhlIHN0YXRpb24gSWQuIEl0IHRyYXZlcnNlcyB0aGUgY29tcGxldGUgdGFibGUgdG8gZG8gdGhpcy4KKyAqIE5lZWQgdG8gZmluZCBhbiBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMuCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjIHBvaW50ZXIgdG8gZ2xvYmFsIE1hYyBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gc3RhSWR4IHN0YXRpb24gSUQKKyAqIEBwYXJhbSAqYXNzb2NJZCBwb2ludGVyIHRvIGFzc29jaWQgdG8gYmUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgZHBoIG5vZGUuCisgKi8KK3RwRHBoSGFzaE5vZGUgZHBoX2xvb2t1cF9hc3NvY19pZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBzdGFJZHgsCisJCQkJICB1aW50MTZfdCAqYXNzb2NJZCwKKwkJCQkgIGRwaEhhc2hUYWJsZUNsYXNzICpwRHBoSGFzaFRhYmxlKQoreworCXVpbnQ4X3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwRHBoSGFzaFRhYmxlLT5zaXplOyBpKyspIHsKKwkJaWYgKChwRHBoSGFzaFRhYmxlLT5wRHBoTm9kZUFycmF5W2ldLmFkZGVkKSAmJgorCQkgICAgKHBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbaV0uc3RhSW5kZXggPT0gc3RhSWR4KSkgeworCQkJKmFzc29jSWQgPSBpOworCQkJYnJlYWs7CisJCX0KKworCX0KKwlpZiAoaSA9PSBwRHBoSGFzaFRhYmxlLT5zaXplKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJnBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbaV07CisKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBkcGhfaW5pdF9zdGFfc3RhdGUKKyAgIFxicmllZiBJbml0aWFsaXplIFNUQSBzdGF0ZS4gdGhpcyBmdW5jdGlvbiBzYXZlcyB0aGUgc3RhSWQgZnJvbSB0aGUgY3VycmVudCBlbnRyeSBpbiB0aGUgRFBIIHRhYmxlIHdpdGggZ2l2ZW4gYXNzb2NJZAorIFwgaWYgdmFsaWRTdGFJZHggZmxhZyBpcyBzZXQuIE90aGVyd2lzZSBpdCBzZXRzIHRoZSBzdGFJZCB0byBpbnZhbGlkLgorICAgXHBhcmFtICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCisgICBccGFyYW0gIHRTaXJNYWNBZGRyIHN0YUFkZHIKKyAgIFxwYXJhbSAgdWludDE2X3QgYXNzb2NJZAorICAgXHBhcmFtICB1aW50OF90IHZhbGlkU3RhSWR4IC0gICB0cnVlID09PiB0aGUgc3RhSWQgaW4gdGhlIERQSCBlbnRyeSB3aXRoIGdpdmVuIGFzc29jSWQgaXMgdmFsaWQgYW5kIHJlc3RvcmUgaXQgYmFjay4KKyBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlID09PiBzZXQgdGhlIHN0YUlkIHRvIGludmFsaWQuCisgICBccmV0dXJuIHRwRHBoSGFzaE5vZGUgLSBEUEggaGFzaCBub2RlIGlmIGZvdW5kLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RwRHBoSGFzaE5vZGUgZHBoX2luaXRfc3RhX3N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHN0YUFkZHIsCisJCQkJIHVpbnQxNl90IGFzc29jSWQsIHVpbnQ4X3QgdmFsaWRTdGFJZHgsCisJCQkJIGRwaEhhc2hUYWJsZUNsYXNzICpwRHBoSGFzaFRhYmxlKQoreworCXVpbnQzMl90IHZhbDsKKworCXRwRHBoSGFzaE5vZGUgcFN0YURzOworCXVpbnQxNl90IHN0YUlkeCA9IFNUQV9JTlZBTElEX0lEWDsKKworCWlmIChhc3NvY0lkID49IHBEcGhIYXNoVGFibGUtPnNpemUpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgQXNzb2MgSWQgJWQiKSwgYXNzb2NJZCk7KQorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwU3RhRHMgPSBnZXRfbm9kZShwTWFjLCAodWludDhfdCkgYXNzb2NJZCwgcERwaEhhc2hUYWJsZSk7CisJc3RhSWR4ID0gcFN0YURzLT5zdGFJbmRleDsKKworCVBFTE9HMShsaW1fbG9nCisJCSAgICAgICAocE1hYywgTE9HMSwgRkwoIkFzc29jIElkICVkLCBBZGRyICUwOFgiKSwgYXNzb2NJZCwgcFN0YURzKTsKKwkgICAgICAgKQorCS8qIENsZWFyIHRoZSBTVEEgbm9kZSBleGNlcHQgZm9yIHRoZSBuZXh0IHBvaW50ZXIgKGxhc3QgNCBieXRlcykgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBwU3RhRHMsCisJCSAgICBzaXplb2YodERwaEhhc2hOb2RlKSAtIHNpemVvZih0cERwaEhhc2hOb2RlKSwgMCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBhc3NvY0lkICovCisJcFN0YURzLT5hc3NvY0lkID0gYXNzb2NJZDsKKwlpZiAodHJ1ZSA9PSB2YWxpZFN0YUlkeCkKKwkJcFN0YURzLT5zdGFJbmRleCA9IHN0YUlkeDsKKwllbHNlCisJCXBTdGFEcy0+c3RhSW5kZXggPSBTVEFfSU5WQUxJRF9JRFg7CisKKwkvKiBJbml0aWFsaXplIFNUQSBtYWMgYWRkcmVzcyAqLworCWNkZl9tZW1fY29weShwU3RhRHMtPnN0YUFkZHIsIHN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJLyogSW5pdGlhbGl6ZSBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsICZ2YWwpICE9CisJICAgIGVTSVJfU1VDQ0VTUykKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCIpKTsKKwllbHNlCisJCXBTdGFEcy0+ZnJhZ1NpemUgPSAodWludDE2X3QpIHZhbDsKKworCXBTdGFEcy0+YWRkZWQgPSAxOworCXBTdGFEcy0+ZW5jUG9saWN5ID0gRU5DX1BPTElDWV9OVUxMOworCXBTdGFEcy0+aXNfZGlzYXNzb2NfZGVhdXRoX2luX3Byb2dyZXNzID0gMDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJcFN0YURzLT5sYXN0X2Fzc29jX3JlY2VpdmVkX3RpbWUgPSAwOworI2VuZGlmCisJcFN0YURzLT52YWxpZCA9IDE7CisJcmV0dXJuIHBTdGFEczsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIGRwaF9hZGRfaGFzaF9lbnRyeQorICoKKyAqIEZVTkNUSU9OOgorICogQWRkIGVudHJ5IHRvIGhhc2ggdGFibGUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFBZGRyIE1BQyBhZGRyZXNzIG9mIHRoZSBzdGF0aW9uCisgKiBAcGFyYW0gc3RhSWQgU3RhdGlvbiBJRCBhc3NpZ25lZCB0byB0aGUgc3RhdGlvbgorICogQHJldHVybiBQb2ludGVyIHRvIFNUQSBoYXNoIGVudHJ5CisgKi8KKwordHBEcGhIYXNoTm9kZSBkcGhfYWRkX2hhc2hfZW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgc3RhQWRkciwKKwkJCQkgdWludDE2X3QgYXNzb2NJZCwKKwkJCQkgZHBoSGFzaFRhYmxlQ2xhc3MgKnBEcGhIYXNoVGFibGUpCit7CisJdHBEcGhIYXNoTm9kZSBwdHIsIG5vZGU7CisJdWludDE2X3QgaW5kZXggPSBoYXNoX2Z1bmN0aW9uKHBNYWMsIHN0YUFkZHIsIHBEcGhIYXNoVGFibGUtPnNpemUpOworCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoImFzc29jSWQgJWQgaW5kZXggJWQgU1RBIGFkZHIiKSwKKwkJICAgICAgIGFzc29jSWQsIGluZGV4KTsgZHBoX3ByaW50X21hY19hZGRyKHBNYWMsIHN0YUFkZHIsIExPRzEpOworCSAgICAgICApCisKKwlpZiAoYXNzb2NJZCA+PSBwRHBoSGFzaFRhYmxlLT5zaXplKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJpbnZhbGlkIFNUQSBpZCAlZCIpLCBhc3NvY0lkKTspCisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChwRHBoSGFzaFRhYmxlLT5wRHBoTm9kZUFycmF5W2Fzc29jSWRdLmFkZGVkKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJhbHJlYWR5IGFkZGVkIFNUQSAlZCIpLCBhc3NvY0lkKTspCisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAocHRyID0gcERwaEhhc2hUYWJsZS0+cEhhc2hUYWJsZVtpbmRleF07IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7CisJCWlmIChwdHIgPT0gcHRyLT5uZXh0KSB7CisJCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiSW5maW5pdGUgTG9vcCIpKTspCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmIChkcGhfY29tcGFyZV9tYWNfYWRkcihzdGFBZGRyLCBwdHItPnN0YUFkZHIpCisJCSAgICB8fCBwdHItPmFzc29jSWQgPT0gYXNzb2NJZCkKKwkJCWJyZWFrOworCX0KKworCWlmIChwdHIpIHsKKwkJLyogRHVwbGljYXRlIGVudHJ5ICovCisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoImFzc29jSWQgJWQgaGFzaEluZGV4ICVkIGVudHJ5IGV4aXN0cyIpLAorCQkJYXNzb2NJZCwgaW5kZXgpOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgeworCQlpZiAoZHBoX2luaXRfc3RhX3N0YXRlCisJCQkgICAgKHBNYWMsIHN0YUFkZHIsIGFzc29jSWQsIGZhbHNlLCBwRHBoSGFzaFRhYmxlKSA9PSBOVUxMKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCBJbml0IFNUQWlkPSVkIiksCisJCQkJICAgICAgIGFzc29jSWQpOworCQkJICAgICAgICkKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8qIEFkZCB0aGUgbm9kZSB0byB0aGUgbGluayBsaXN0ICovCisJCXBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbYXNzb2NJZF0ubmV4dCA9CisJCQlwRHBoSGFzaFRhYmxlLT5wSGFzaFRhYmxlW2luZGV4XTsKKwkJcERwaEhhc2hUYWJsZS0+cEhhc2hUYWJsZVtpbmRleF0gPQorCQkJJnBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbYXNzb2NJZF07CisKKwkJbm9kZSA9IHBEcGhIYXNoVGFibGUtPnBIYXNoVGFibGVbaW5kZXhdOworCQlyZXR1cm4gbm9kZTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBkcGhfZGVsZXRlX2hhc2hfZW50cnkKKyAqCisgKiBGVU5DVElPTjoKKyAqIERlbGV0ZSBlbnRyeSBmcm9tIGhhc2ggdGFibGUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFBZGRyIE1BQyBhZGRyZXNzIG9mIHRoZSBzdGF0aW9uCisgKiBAcGFyYW0gc3RhSWQgU3RhdGlvbiBJRCBhc3NpZ25lZCB0byB0aGUgc3RhdGlvbgorICogQHJldHVybiBlU0lSX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCxcbgorICogICAgICAgICBlU0lSX0ZBSUxVUkUgb3RoZXJ3aXNlCisgKi8KKwordFNpclJldFN0YXR1cyBkcGhfZGVsZXRlX2hhc2hfZW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgc3RhQWRkciwKKwkJCQkgICAgdWludDE2X3QgYXNzb2NJZCwKKwkJCQkgICAgZHBoSGFzaFRhYmxlQ2xhc3MgKnBEcGhIYXNoVGFibGUpCit7CisJdHBEcGhIYXNoTm9kZSBwdHIsIHByZXY7CisJdWludDE2X3QgaW5kZXggPSBoYXNoX2Z1bmN0aW9uKHBNYWMsIHN0YUFkZHIsIHBEcGhIYXNoVGFibGUtPnNpemUpOworCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoImFzc29jSWQgJWQgaW5kZXggJWQgU1RBIGFkZHIiKSwKKwkJICAgICAgIGFzc29jSWQsIGluZGV4KTsgZHBoX3ByaW50X21hY19hZGRyKHBNYWMsIHN0YUFkZHIsIExPRzEpOworCSAgICAgICApCisKKwlpZiAoYXNzb2NJZCA+PSBwRHBoSGFzaFRhYmxlLT5zaXplKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJpbnZhbGlkIFNUQSBpZCAlZCIpLCBhc3NvY0lkKTspCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJaWYgKHBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbYXNzb2NJZF0uYWRkZWQgPT0gMCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiU1RBICVkIG5ldmVyIGFkZGVkIiksIGFzc29jSWQpOykKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlmb3IgKHByZXYgPSAwLCBwdHIgPSBwRHBoSGFzaFRhYmxlLT5wSGFzaFRhYmxlW2luZGV4XTsKKwkgICAgIHB0cjsgcHJldiA9IHB0ciwgcHRyID0gcHRyLT5uZXh0KSB7CisJCWlmIChkcGhfY29tcGFyZV9tYWNfYWRkcihzdGFBZGRyLCBwdHItPnN0YUFkZHIpKQorCQkJYnJlYWs7CisJCWlmIChwcmV2ID09IHB0cikgeworCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkluZmluaXRlIExvb3AiKSk7KQorCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCX0KKworCWlmIChwdHIpIHsKKwkJLyogLyBEZWxldGUgdGhlIGVudHJ5IGFmdGVyIGludmFsaWRhdGluZyBpdCAqLworCQlwdHItPnZhbGlkID0gMDsKKwkJbWVtc2V0KHB0ci0+c3RhQWRkciwgMCwgc2l6ZW9mKHB0ci0+c3RhQWRkcikpOworCQlpZiAocHJldiA9PSAwKQorCQkJcERwaEhhc2hUYWJsZS0+cEhhc2hUYWJsZVtpbmRleF0gPSBwdHItPm5leHQ7CisJCWVsc2UKKwkJCXByZXYtPm5leHQgPSBwdHItPm5leHQ7CisJCXB0ci0+YWRkZWQgPSAwOworCQlwdHItPmlzX2Rpc2Fzc29jX2RlYXV0aF9pbl9wcm9ncmVzcyA9IDA7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQlwdHItPmxhc3RfYXNzb2NfcmVjZWl2ZWRfdGltZSA9IDA7CisjZW5kaWYKKwkJcHRyLT5uZXh0ID0gMDsKKwl9IGVsc2UgeworCQkvKiAvIEVudHJ5IG5vdCBwcmVzZW50ICovCisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJFbnRyeSBub3QgcHJlc2VudCBTVEEgYWRkciIpKTsKKwkJICAgICAgIGRwaF9wcmludF9tYWNfYWRkcihwTWFjLCBzdGFBZGRyLCBMT0dFKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogZHBoX3ByaW50X21hY19hZGRyCisgKgorICogRlVOQ1RJT046CisgKiBQcmludCBhIE1BQyBhZGRyZXNzCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gYWRkciBNQUMgYWRkcmVzcworICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBkcGhfcHJpbnRfbWFjX2FkZHIodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBhZGRyW10sIHVpbnQzMl90IGxldmVsKQoreworCWxpbV9sb2cocE1hYywgKHVpbnQxNl90KSBsZXZlbCwgRkwoIk1BQyBBRERSID0gJWQ6JWQ6JWQ6JWQ6JWQ6JWQiKSwKKwkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9kcGgvZHBoX2hhc2hfdGFibGUuaCBiL2NvcmUvbWFjL3NyYy9kcGgvZHBoX2hhc2hfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTU1ZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL2RwaC9kcGhfaGFzaF90YWJsZS5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBkcGhfaGFzaF90YWJsZS5oIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzY2hlZHVsZXIgY2xhc3MuCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19EUEhfSEFTSF9UQUJMRV9IX18KKyNkZWZpbmUgX19EUEhfSEFTSF9UQUJMRV9IX18KKworI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKy8qIENvbXBhcmUgTUFDIGFkZHJlc3NlcywgcmV0dXJuIHRydWUgaWYgc2FtZSAqLworc3RhdGljIGlubGluZSB1aW50OF90IGRwaF9jb21wYXJlX21hY19hZGRyKHVpbnQ4X3QgYWRkcjFbXSwgdWludDhfdCBhZGRyMltdKQoreworCXJldHVybiAoYWRkcjFbMF0gPT0gYWRkcjJbMF0pICYmCisJCShhZGRyMVsxXSA9PSBhZGRyMlsxXSkgJiYKKwkJKGFkZHIxWzJdID09IGFkZHIyWzJdKSAmJgorCQkoYWRkcjFbM10gPT0gYWRkcjJbM10pICYmCisJCShhZGRyMVs0XSA9PSBhZGRyMls0XSkgJiYgKGFkZHIxWzVdID09IGFkZHIyWzVdKTsKK30KKworLyogSGFzaCB0YWJsZSBjbGFzcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCisJLyogVGhlIGhhc2ggdGFibGUgaXRzZWxmICovCisJdHBEcGhIYXNoTm9kZSAqcEhhc2hUYWJsZTsKKworCS8qIFRoZSBzdGF0ZSBhcnJheSAqLworCXREcGhIYXNoTm9kZSAqcERwaE5vZGVBcnJheTsKKwl1aW50MTZfdCBzaXplOworfSBkcGhIYXNoVGFibGVDbGFzczsKKworLyogVGhlIGhhc2ggdGFibGUgb2JqZWN0ICovCitleHRlcm4gZHBoSGFzaFRhYmxlQ2xhc3MgZHBoSGFzaFRhYmxlOworCisvKiBQcmludCBNQUMgYWRkcmVzc2UgKi8KK2V4dGVybiB2b2lkIGRwaF9wcmludF9tYWNfYWRkcihzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywgdWludDhfdCBhZGRyW10sCisJCQkgICAgICAgdWludDMyX3QpOworCit0cERwaEhhc2hOb2RlIGRwaF9sb29rdXBfaGFzaF9lbnRyeSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHN0YUFkZHJbXSwKKwkJCQkgICAgdWludDE2X3QgKnBTdGFJZCwKKwkJCQkgICAgZHBoSGFzaFRhYmxlQ2xhc3MgKnBEcGhIYXNoVGFibGUpOwordHBEcGhIYXNoTm9kZSBkcGhfbG9va3VwX2Fzc29jX2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IHN0YUlkeCwKKwkJCQkgIHVpbnQxNl90ICphc3NvY0lkLAorCQkJCSAgZHBoSGFzaFRhYmxlQ2xhc3MgKnBEcGhIYXNoVGFibGUpOworCisvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBoYXNoIG5vZGUgKi8KK2V4dGVybiB0cERwaEhhc2hOb2RlIGRwaF9nZXRfaGFzaF9lbnRyeSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBzdGFJZCwKKwkJCQkJZHBoSGFzaFRhYmxlQ2xhc3MgKnBEcGhIYXNoVGFibGUpOworCisvKiBBZGQgYW4gZW50cnkgdG8gdGhlIGhhc2ggdGFibGUgKi8KK2V4dGVybiB0cERwaEhhc2hOb2RlIGRwaF9hZGRfaGFzaF9lbnRyeSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl0U2lyTWFjQWRkciBzdGFBZGRyLAorCQkJCQl1aW50MTZfdCBzdGFJZCwKKwkJCQkJZHBoSGFzaFRhYmxlQ2xhc3MgKnBEcGhIYXNoVGFibGUpOworCisvKiBEZWxldGUgYW4gZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZSAqLworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgZHBoX2RlbGV0ZV9oYXNoX2VudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgIHRTaXJNYWNBZGRyIHN0YUFkZHIsIHVpbnQxNl90IHN0YUlkLAorCQkJCQkgICBkcGhIYXNoVGFibGVDbGFzcyAqcERwaEhhc2hUYWJsZSk7CisKK3ZvaWQgZHBoX2hhc2hfdGFibGVfY2xhc3NfaW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgIGRwaEhhc2hUYWJsZUNsYXNzICpwRHBoSGFzaFRhYmxlKTsKKy8qIEluaXRpYWxpemUgU1RBIHN0YXRlICovCitleHRlcm4gdHBEcGhIYXNoTm9kZSBkcGhfaW5pdF9zdGFfc3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJdFNpck1hY0FkZHIgc3RhQWRkciwKKwkJCQkJdWludDE2X3Qgc3RhSWQsIHVpbnQ4X3QgdmFsaWRTdGFJZHgsCisJCQkJCWRwaEhhc2hUYWJsZUNsYXNzICpwRHBoSGFzaFRhYmxlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvaW5jbHVkZS9jZmdfYXBpLmggYi9jb3JlL21hYy9zcmMvaW5jbHVkZS9jZmdfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2NWQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9pbmNsdWRlL2NmZ19hcGkuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIEF1dGhvcjogICAgICBLZXZpbiBOZ3V5ZW4KKyAqIERhdGU6ICAgICAgICAwNC8wOS8wMgorICogSGlzdG9yeTotCisgKiAwNC8wOS8wMiAgICAgICAgQ3JlYXRlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19DRkdBUElfSAorI2RlZmluZSBfX0NGR0FQSV9ICisKKyNpbmNsdWRlIDxzaXJfY29tbW9uLmg+CisjaW5jbHVkZSA8c2lyX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNpcl9tYWNfcHJvdF9kZWYuaD4KKyNpbmNsdWRlIDx3bmlfYXBpLmg+CisjaW5jbHVkZSA8YW5pX2dsb2JhbC5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDRkcgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENGRyBzdGF0dXMgKi8KK3R5cGVkZWYgZW51bSBlQ2ZnU3RhdHVzVHlwZXMgeworCUNGR19JTkNPTVBMRVRFLAorCUNGR19TVUNDRVNTLAorCUNGR19GQUlMVVJFCit9IHRDZmdTdGF0dXNUeXBlczsKKworLyogV0VQIGtleSBtYXBwaW5nIHRhYmxlIHJvdyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGtleU1hcHBpbmdBZGRyW0NERl9NQUNfQUREUl9TSVpFXTsKKwl1aW50MzJfdCB3ZXBPbjsKKwl1aW50OF90IGtleVtTSVJfTUFDX0tFWV9MRU5HVEhdOworCXVpbnQzMl90IHN0YXR1czsKK30gdENmZ1dlcEtleUVudHJ5OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDRkcgZnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3VpbnQzMl90IGNmZ19uZWVkX3Jlc3RhcnQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgY2ZnSWQpOwordWludDMyX3QgY2ZnX25lZWRfcmVsb2FkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGNmZ0lkKTsKKworLyogLyBQcm9jZXNzIGhvc3QgbWVzc2FnZSAqLwordm9pZCBjZmdfcHJvY2Vzc19tYl9tc2codHBBbmlTaXJHbG9iYWwsIHRTaXJNYk1zZyAqKTsKKworLyogLyBTZXQgaW50ZWdlciBwYXJhbWV0ZXIgdmFsdWUgKi8KK3RTaXJSZXRTdGF0dXMgY2ZnX3NldF9pbnQodHBBbmlTaXJHbG9iYWwsIHVpbnQxNl90LCB1aW50MzJfdCk7CisKKy8qIC8gQ2hlY2sgaWYgdGhlIHBhcmFtZXRlciBpcyB2YWxpZCAqLwordFNpclJldFN0YXR1cyBjZmdfY2hlY2tfdmFsaWQodHBBbmlTaXJHbG9iYWwsIHVpbnQxNl90LCB1aW50MzJfdCAqKTsKKworLyogLyBHZXQgaW50ZWdlciBwYXJhbWV0ZXIgdmFsdWUgKi8KK3RTaXJSZXRTdGF0dXMgd2xhbl9jZmdfZ2V0X2ludCh0cEFuaVNpckdsb2JhbCwgdWludDE2X3QsIHVpbnQzMl90ICopOworCisvKiAvIFNldCBzdHJpbmcgcGFyYW1ldGVyIHZhbHVlICovCit0U2lyUmV0U3RhdHVzIGNmZ19zZXRfc3RyKHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdWludDhfdCAqLCB1aW50MzJfdCk7CisKK3RTaXJSZXRTdGF0dXMgY2ZnX3NldF9zdHJfbm90aWZ5KHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdWludDhfdCAqLCB1aW50MzJfdCwKKwkJCQkgaW50KTsKKworLyogQ2ZnIERvd25sb2FkIGZ1bmN0aW9uIGZvciBQcmltYSBvciBJbnRlZ3JhdGVkIHNvbHV0aW9ucy4gKi8KK3ZvaWQgcHJvY2Vzc19jZmdfZG93bmxvYWRfcmVxKHRwQW5pU2lyR2xvYmFsKTsKKworLyogLyBHZXQgc3RyaW5nIHBhcmFtZXRlciB2YWx1ZSAqLwordFNpclJldFN0YXR1cyB3bGFuX2NmZ19nZXRfc3RyKHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdWludDhfdCAqLCB1aW50MzJfdCAqKTsKKworLyogLyBHZXQgc3RyaW5nIHBhcmFtZXRlciBtYXhpbXVtIGxlbmd0aCAqLwordFNpclJldFN0YXR1cyB3bGFuX2NmZ19nZXRfc3RyX21heF9sZW4odHBBbmlTaXJHbG9iYWwsIHVpbnQxNl90LCB1aW50MzJfdCAqKTsKKworLyogLyBHZXQgc3RyaW5nIHBhcmFtZXRlciBtYXhpbXVtIGxlbmd0aCAqLwordFNpclJldFN0YXR1cyB3bGFuX2NmZ19nZXRfc3RyX2xlbih0cEFuaVNpckdsb2JhbCwgdWludDE2X3QsIHVpbnQzMl90ICopOworCisvKiAvIEdldCB0aGUgcmVndWxhdG9yeSB0eCBwb3dlciBvbiBnaXZlbiBjaGFubmVsICovCit0UG93ZXJkQm0gY2ZnX2dldF9yZWd1bGF0b3J5X21heF90cmFuc21pdF9wb3dlcih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdWludDhfdCBjaGFubmVsKTsKKworLyogLyBEdW1wIENGRyBkYXRhIHRvIG1lbW9yeSAqLwordm9pZCBjZmdEdW1wKHVpbnQzMl90ICopOworCisvKiAvIFNhdmUgcGFyYW1ldGVycyB3aXRoIFAgZmxhZyBzZXQgKi8KK3ZvaWQgY2ZnU2F2ZSh2b2lkKTsKKworLyogLyBHZXQgY2FwYWJpbGl0eSBpbmZvICovCitleHRlcm4gdFNpclJldFN0YXR1cyBjZmdfZ2V0X2NhcGFiaWxpdHlfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCAqcENhcCwKKwkJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLyogLyBTZXQgY2FwYWJpbGl0eSBpbmZvICovCitleHRlcm4gdm9pZCBjZmdfc2V0X2NhcGFiaWxpdHlfaW5mbyh0cEFuaVNpckdsb2JhbCwgdWludDE2X3QpOworCisvKiAvIENsZWFudXAgQ0ZHIG1vZHVsZSAqLwordm9pZCBjZmdfY2xlYW51cCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworZXh0ZXJuIHVpbnQ4X3QgKmdfY2ZnX3BhcmFtX25hbWVbXTsKKwordWludDhfdCAqY2ZnX2dldF92ZW5kb3JfaWVfcHRyX2Zyb21fb3VpKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJCXVpbnQ4X3QgKm91aSwKKwkJCQkJdWludDhfdCBvdWlfc2l6ZSwKKwkJCQkJdWludDhfdCAqaWUsCisJCQkJCXVpbnQxNl90IGllX2xlbik7CisKKyNlbmRpZiAvKiBfX0NGR0FQSV9IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvaW5jbHVkZS9jZmdfZ2xvYmFsLmggYi9jb3JlL21hYy9zcmMvaW5jbHVkZS9jZmdfZ2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3OGYyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9pbmNsdWRlL2NmZ19nbG9iYWwuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8wOS8wMworICogSGlzdG9yeTotCisgKiAwNC8wOS8wMiAgICAgICAgQ3JlYXRlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19DRkdHTE9CQUxfSAorI2RlZmluZSBfX0NGR0dMT0JBTF9ICisKKyNpbmNsdWRlICJzaXJfY29tbW9uLmgiCisjaW5jbHVkZSAic2lyX3R5cGVzLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorCisjZGVmaW5lIENGR19NQVhfTlVNX1NUQSAgICAgIFNJUl9NQVhfTlVNX1NUQV9JTl9JQlNTCisKKyNkZWZpbmUgQ0ZHX01BWF9TVEFUSUNfU1RSSU5HICAgNzAKKy8qIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgZ3Jvd3MsIDEyOCBpcyBub3QgYmlnIGVub3VnaCAqLworI2RlZmluZSBDRkdfTUFYX1NUUl9MRU4gICAgICAgMjU2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29uZmlndXJhdGlvbiBDb250cm9sIFN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBjb250cm9sOworfSB0Q2ZnQ3RsOworCisKK3R5cGVkZWYgc3RydWN0IHNBbmlTaXJDZmdTdGF0aWNTdHJpbmcgeworCXVpbnQxNl90IGNmZ0lkOworCXVpbnQ4X3QgIG1heExlbjsKKwl1aW50OF90ICBsZW5ndGg7CisJdWludDhfdCAgZGF0YVsyNTVdOworfSBjZmdzdGF0aWNfc3RyaW5nOworCit0eXBlZGVmIHN0cnVjdCBzQW5pU2lyQ2ZnU3RhdGljIHsKKwl1aW50MTZfdCBjZmdJZDsKKwl1aW50MzJfdCBjb250cm9sOworCXVpbnQzMl90IGNmZ0lNaW47CisJdWludDMyX3QgY2ZnSU1heDsKKwl1aW50MzJfdCBjZmdJVmFsOworCXZvaWQgICAgICpwU3RyRGF0YTsKK30gY2dzdGF0aWM7CisKK3R5cGVkZWYgc3RydWN0IHNBbmlTaXJDZmcgeworCS8qIENGRyBtb2R1bGUgc3RhdHVzICovCisJdWludDhfdCBnQ2ZnU3RhdHVzOworCisJdENmZ0N0bCAqZ0NmZ0VudHJ5OworCXVpbnQzMl90ICpnQ2ZnSUJ1Zk1pbjsKKwl1aW50MzJfdCAqZ0NmZ0lCdWZNYXg7CisJdWludDMyX3QgKmdDZmdJQnVmOworCXVpbnQ4X3QgKmdDZmdTQnVmOworCisJdWludDE2X3QgZ0NmZ01heElCdWZTaXplOworCXVpbnQxNl90IGdDZmdNYXhTQnVmU2l6ZTsKKworCS8qIFN0YXRpYyBidWZmZXIgZm9yIHN0cmluZyBwYXJhbWV0ZXIgKG11c3QgYmUgd29yZC1hbGlnbmVkKSAqLworCXVpbnQ4X3QgKmdTQnVmZmVyOworCisJLyogTWVzc2FnZSBwYXJhbSBsaXN0IGJ1ZmZlciAoZW5vdWdoIGZvciBsYXJnZXN0IHBvc3NpYmxlIHJlc3BvbnNlKSAqLworCXVpbnQzMl90ICpnUGFyYW1MaXN0OworfSB0QW5pU2lyQ2ZnLCAqdHBBbmlTaXJDZmc7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL2luY2x1ZGUvZG90MTFmLmggYi9jb3JlL21hYy9zcmMvaW5jbHVkZS9kb3QxMWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjU4YWJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL2luY2x1ZGUvZG90MTFmLmgKQEAgLTAsMCArMSw4OTIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIERPVDExRl9ICisjZGVmaW5lIERPVDExRl9ICisvKgorICogXGZpbGUgZG90MTFmLmgKKyAqCisgKiBcYnJpZWYgU3RydWN0dXJlcywgZnVuY3Rpb24gcHJvdG90eXBlcyAmIGRlZmluaXRpb25zCisgKiBmb3Igd29ya2luZyB3aXRoIDgwMi4xMSBGcmFtZXMKKyAqCisgKgorICogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSAnZnJhbWVzYycKKyAqIFdlZCBPY3QgMTQgMTA6MTQ6NDIgMjAxNSBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZShzKToKKyAqCisgKiBkb3QxMWYuZnJtcworICoKKyAqIFBMRUFTRSBET04nVCBFRElUIFRISVMgRklMRSBCWSBIQU5EIQorICoKKyAqIEluc3RlYWQsIHBsZWFzZSB1cGRhdGUgdGhlIGlucHV0IGZpbGVzICYgcmUtcnVuCisgKiAnZnJhbWVzYycgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uICdmcmFtZXNjJyAmIHRoZQorICogZnJhbWVzIGxhbmd1YWdlLCAgcnVuICdmcmFtZXNjIC0taGVscCcuCisgKgorICovCisKK3R5cGVkZWYgdWludDMyX3QgdERPVDExRl9VNjRbMl07CisKKyNpZiBkZWZpbmVkIChfTVNDX1ZFUikKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTo0MjE0KQkvKiBub25zdGFuZGFyZCBleHRlbnNpb24gdXNlZCAqLworI2VuZGlmIC8qIE1pY3Jvc29mdCBDL0MrKyAgICAgICAgICAgICBiaXQgZmllbGQgdHlwZXMgb3RoZXIgdGhhbiBpbnQgKi8KKworLyoKKyAqIEZyYW1lcyBSZXR1cm4gQ29kZXM6CisgKgorICogU3VjY2VzcyBpcyBpbmRpY2F0ZWQgYnkgYSByZXR1cm4gdmFsdWUgb2YgemVyby4gIEZhaWx1cmUgaXMgaW5kaWNhdGVkCisgKiBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGhpZ2ggYml0LiAgV2FybmluZ3MgZW5jb3VudGVyZWQgaW4gdGhlIGNvdXJzZQorICogb2YgYSBzdWNjZXNzZnVsIHBhcnNlIGFyZSBpbmRpY2F0ZWQgYnkgdmFyaW91cyBiaXRzIGluIHRoZSBsb3dlciAzMQorICogYmVpbmcgdHVybmVkIG9uLgorICoKKyAqIEZvciBpbnN0YW5jZSwgYSByZXR1cm4gdmFsdWUgb2YgMHgwMDAwMDAwYSB3b3VsZCBpbmRpY2F0ZSB0aGF0IHRoZQorICogcGFyc2Ugc3VjY2VlZGVkLCBidXQgdGhhdCBhIG1hbmRhdG9yeSBJRSB3YXNuJ3QgcHJlc2VudCwgYW5kIHNvbWUgSUUKKyAqIHdhcyBmb3VuZCB0byBiZSBjb3JydXB0LgorICoKKyAqCisgKi8KKworI2RlZmluZSBET1QxMUZfUEFSU0VfU1VDQ0VTUyAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBET1QxMUZfVU5LTk9XTl9JRVMgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBET1QxMUZfTUFOREFUT1JZX0lFX01JU1NJTkcgICgweDAwMDAwMDAyKQorI2RlZmluZSBET1QxMUZfSU5DT01QTEVURV9JRSAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBET1QxMUZfU0tJUFBFRF9CQURfSUUgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBET1QxMUZfTEFTVF9JRV9UT09fTE9ORyAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBET1QxMUZfRFVQTElDQVRFX0lFICAgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBET1QxMUZfQkFEX0ZJWEVEX1ZBTFVFICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBET1QxMUZfSU5DT01QTEVURV9UTFYgICAgICAgICgweDAwMDAwMDgwKQorI2RlZmluZSBET1QxMUZfSU5WQUxJRF9UTFZfTEVOR1RIICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBET1QxMUZfU0tJUFBFRF9CQURfVExWICAgICAgICgweDAwMDAwMjAwKQorI2RlZmluZSBET1QxMUZfVU5LTk9XTl9UTFZTICAgICAgICAgICgweDAwMDAwNDAwKQorI2RlZmluZSBET1QxMUZfTEFTVF9UTFZfVE9PX0xPTkcgICAgICgweDAwMDAwODAwKQorI2RlZmluZSBET1QxMUZfSU5URVJOQUxfRVJST1IgICAgICAgICgweDEwMDAwMDAxKQorI2RlZmluZSBET1QxMUZfTUlTU0lOR19GSVhFRF9GSUVMRCAgICgweDEwMDAwMDAyKQorI2RlZmluZSBET1QxMUZfQkFEX0lOUFVUX0JVRkZFUiAgICAgICgweDEwMDAwMDAzKQorI2RlZmluZSBET1QxMUZfQkFEX09VVFBVVF9CVUZGRVIgICAgICgweDEwMDAwMDA0KQorI2RlZmluZSBET1QxMUZfQlVGRkVSX09WRVJGTE9XICAgICAgICgweDEwMDAwMDA1KQorI2RlZmluZSBET1QxMUZfTUFOREFUT1JZX1RMVl9NSVNTSU5HICgweDAwMDAxMDAwKQorI2RlZmluZSBET1QxMUZfRkFJTEVEKGNvZGUpICAgICAgICAgICgoY29kZSkgJiAweDEwMDAwMDAwKQorI2RlZmluZSBET1QxMUZfV0FSTkVEKGNvZGUpICAgICAgICAgICgoKDAgPT0gKGNvZGUpKSAmIDB4MTAwMDAwMDApICYmIGNvZGUpCisjZGVmaW5lIERPVDExRl9TVUNDRUVERUQoY29kZSkgICAgICAgKChjb2RlKSA9PSAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBGaWVsZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZkFJRCB7CisJdWludDE2X3QgYXNzb2NpZDsKK30gdERvdDExZkZmQUlEOworCisjZGVmaW5lIERPVDExRl9GRl9BSURfTEVOICgyKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfQUlEKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosIHREb3QxMWZGZkFJRCAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9haWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZkFJRCAqLCB1aW50OF90ICopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZBY3Rpb24geworCXVpbnQ4X3QgYWN0aW9uOworfSB0RG90MTFmRmZBY3Rpb247CisKKyNkZWZpbmUgRE9UMTFGX0ZGX0FDVElPTl9MRU4gKDEpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9hY3Rpb24odHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwgdERvdDExZkZmQWN0aW9uICopOworCit2b2lkIGRvdDExZl9wYWNrX2ZmX2FjdGlvbih0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmQWN0aW9uICosIHVpbnQ4X3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZkF1dGhBbGdvIHsKKwl1aW50MTZfdCBhbGdvOworfSB0RG90MTFmRmZBdXRoQWxnbzsKKworI2RlZmluZSBET1QxMUZfRkZfQVVUSEFMR09fTEVOICgyKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfQXV0aEFsZ28odHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwKKwkJCSAgICAgICB0RG90MTFmRmZBdXRoQWxnbyAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9hdXRoX2FsZ28odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZkF1dGhBbGdvICosIHVpbnQ4X3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZkF1dGhTZXFObyB7CisJdWludDE2X3Qgbm87Cit9IHREb3QxMWZGZkF1dGhTZXFObzsKKworI2RlZmluZSBET1QxMUZfRkZfQVVUSFNFUU5PX0xFTiAoMikKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX0F1dGhTZXFObyh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJCXREb3QxMWZGZkF1dGhTZXFObyAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9hdXRoX3NlcV9ubyh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmQXV0aFNlcU5vICosCisJCQkgICAgICB1aW50OF90ICopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZCZWFjb25JbnRlcnZhbCB7CisJdWludDE2X3QgaW50ZXJ2YWw7Cit9IHREb3QxMWZGZkJlYWNvbkludGVydmFsOworCisjZGVmaW5lIERPVDExRl9GRl9CRUFDT05JTlRFUlZBTF9MRU4gKDIpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9CZWFjb25JbnRlcnZhbCh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJCSAgICAgdERvdDExZkZmQmVhY29uSW50ZXJ2YWwgKik7CisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfYmVhY29uX2ludGVydmFsKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZCZWFjb25JbnRlcnZhbCAqLAorCQkJCSAgIHVpbnQ4X3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZkNhcGFiaWxpdGllcyB7CisJdWludDE2X3QgICAgICAgICAgICAgZXNzOjE7CisJdWludDE2X3QgICAgICAgICAgICBpYnNzOjE7CisJdWludDE2X3QgICAgICBjZlBvbGxhYmxlOjE7CisJdWludDE2X3QgICAgICAgY2ZQb2xsUmVxOjE7CisJdWludDE2X3QgICAgICAgICBwcml2YWN5OjE7CisJdWludDE2X3QgICBzaG9ydFByZWFtYmxlOjE7CisJdWludDE2X3QgICAgICAgICAgICBwYmNjOjE7CisJdWludDE2X3QgIGNoYW5uZWxBZ2lsaXR5OjE7CisJdWludDE2X3QgICAgIHNwZWN0cnVtTWd0OjE7CisJdWludDE2X3QgICAgICAgICAgICAgcW9zOjE7CisJdWludDE2X3QgICBzaG9ydFNsb3RUaW1lOjE7CisJdWludDE2X3QgICAgICAgICAgICBhcHNkOjE7CisJdWludDE2X3QgICAgICAgICAgICAgcnJtOjE7CisJdWludDE2X3QgICAgICAgIGRzc3NPZmRtOjE7CisJdWludDE2X3QgICAgICAgZGVsYXllZEJBOjE7CisJdWludDE2X3QgICAgIGltbWVkaWF0ZUJBOjE7Cit9IHREb3QxMWZGZkNhcGFiaWxpdGllczsKKworI2RlZmluZSBET1QxMUZfRkZfQ0FQQUJJTElUSUVTX0xFTiAoMikKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX2NhcGFiaWxpdGllcyh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJCSAgIHREb3QxMWZGZkNhcGFiaWxpdGllcyAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9jYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZkNhcGFiaWxpdGllcyAqLAorCQkJCSB1aW50OF90ICopOworCisjZGVmaW5lIENBUEFCSUxJVElFU19FU1NfT0ZGU0VUICAgICAgICAgICAgMAorI2RlZmluZSBDQVBBQklMSVRJRVNfRVNTX1dJRFRIICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0lCU1NfT0ZGU0VUICAgICAgICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19JQlNTX1dJRFRIICAgICAgICAgICAgMQorI2RlZmluZSBDQVBBQklMSVRJRVNfQ0ZQT0xMQUJMRV9PRkZTRVQgICAgIDIKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0NGUE9MTEFCTEVfV0lEVEggICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19DRlBPTExSRVFfT0ZGU0VUICAgICAgMworI2RlZmluZSBDQVBBQklMSVRJRVNfQ0ZQT0xMUkVRX1dJRFRIICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1BSSVZBQ1lfT0ZGU0VUICAgICAgICA0CisjZGVmaW5lIENBUEFCSUxJVElFU19QUklWQUNZX1dJRFRIICAgICAgICAgMQorI2RlZmluZSBDQVBBQklMSVRJRVNfU0hPUlRQUkVBTUJMRV9PRkZTRVQgIDUKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1NIT1JUUFJFQU1CTEVfV0lEVEggICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19QQkNDX09GRlNFVCAgICAgICAgICAgNgorI2RlZmluZSBDQVBBQklMSVRJRVNfUEJDQ19XSURUSCAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0NIQU5ORUxBR0lMSVRZX09GRlNFVCA3CisjZGVmaW5lIENBUEFCSUxJVElFU19DSEFOTkVMQUdJTElUWV9XSURUSCAgMQorI2RlZmluZSBDQVBBQklMSVRJRVNfU1BFQ1RSVU1NR1RfT0ZGU0VUICAgIDgKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1NQRUNUUlVNTUdUX1dJRFRIICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19RT1NfT0ZGU0VUICAgICAgICAgICAgOQorI2RlZmluZSBDQVBBQklMSVRJRVNfUU9TX1dJRFRIICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1NIT1JUU0xPVFRJTUVfT0ZGU0VUICAxMAorI2RlZmluZSBDQVBBQklMSVRJRVNfU0hPUlRTTE9UVElNRV9XSURUSCAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0FQU0RfT0ZGU0VUICAgICAgICAgICAxMQorI2RlZmluZSBDQVBBQklMSVRJRVNfQVBTRF9XSURUSCAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1JSTV9PRkZTRVQgICAgICAgICAgICAxMgorI2RlZmluZSBDQVBBQklMSVRJRVNfUlJNX1dJRFRIICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0RTU1NPRkRNX09GRlNFVCAgICAgICAxMworI2RlZmluZSBDQVBBQklMSVRJRVNfRFNTU09GRE1fV0lEVEggICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0RFTEFZRURCQV9PRkZTRVQgICAgICAxNAorI2RlZmluZSBDQVBBQklMSVRJRVNfREVMQVlFREJBX1dJRFRIICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0lNTUVESUFURUJBX09GRlNFVCAgICAxNQorI2RlZmluZSBDQVBBQklMSVRJRVNfSU1NRURJQVRFQkFfV0lEVEggICAgIDEKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmQ2F0ZWdvcnkgeworCXVpbnQ4X3QgY2F0ZWdvcnk7Cit9IHREb3QxMWZGZkNhdGVnb3J5OworCisjZGVmaW5lIERPVDExRl9GRl9DQVRFR09SWV9MRU4gKDEpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9jYXRlZ29yeSh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJICAgICAgIHREb3QxMWZGZkNhdGVnb3J5ICopOworCit2b2lkIGRvdDExZl9wYWNrX2ZmX2NhdGVnb3J5KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZDYXRlZ29yeSAqLCB1aW50OF90ICopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZDdXJyZW50QVBBZGRyZXNzIHsKKwl1aW50OF90IG1hY1s2XTsKK30gdERvdDExZkZmQ3VycmVudEFQQWRkcmVzczsKKworI2RlZmluZSBET1QxMUZfRkZfQ1VSUkVOVEFQQUREUkVTU19MRU4gKDYpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9jdXJyZW50X2FwX2FkZHJlc3ModHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwKKwkJCQkgICAgICAgdERvdDExZkZmQ3VycmVudEFQQWRkcmVzcyAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9jdXJyZW50X2FwX2FkZHJlc3ModHBBbmlTaXJHbG9iYWwsCisJCQkJICAgICB0RG90MTFmRmZDdXJyZW50QVBBZGRyZXNzICosCisJCQkJICAgICB1aW50OF90ICopOworCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZkRpYWxvZ1Rva2VuIHsKKwl1aW50OF90IHRva2VuOworfSB0RG90MTFmRmZEaWFsb2dUb2tlbjsKKworI2RlZmluZSBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOICgxKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfZGlhbG9nX3Rva2VuKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosCisJCQkJICB0RG90MTFmRmZEaWFsb2dUb2tlbiAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9kaWFsb2dfdG9rZW4odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZkRpYWxvZ1Rva2VuICosCisJCQkJdWludDhfdCAqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmTGlua01hcmdpbiB7CisJdWludDhfdCBsaW5rTWFyZ2luOworfSB0RG90MTFmRmZMaW5rTWFyZ2luOworCisjZGVmaW5lIERPVDExRl9GRl9MSU5LTUFSR0lOX0xFTiAoMSkKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX2xpbmtfbWFyZ2luKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosCisJCQkJIHREb3QxMWZGZkxpbmtNYXJnaW4gKik7CisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfbGlua19tYXJnaW4odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZkxpbmtNYXJnaW4gKiwKKwkJCSAgICAgICB1aW50OF90ICopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZMaXN0ZW5JbnRlcnZhbCB7CisJdWludDE2X3QgaW50ZXJ2YWw7Cit9IHREb3QxMWZGZkxpc3RlbkludGVydmFsOworCisjZGVmaW5lIERPVDExRl9GRl9MSVNURU5JTlRFUlZBTF9MRU4gKDIpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9MaXN0ZW5JbnRlcnZhbCh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJCSAgICAgdERvdDExZkZmTGlzdGVuSW50ZXJ2YWwgKik7CisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfbGlzdGVuX2ludGVydmFsKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZMaXN0ZW5JbnRlcnZhbCAqLAorCQkJCSAgIHVpbnQ4X3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZk1heFR4UG93ZXIgeworCXVpbnQ4X3QgbWF4VHhQb3dlcjsKK30gdERvdDExZkZmTWF4VHhQb3dlcjsKKworI2RlZmluZSBET1QxMUZfRkZfTUFYVFhQT1dFUl9MRU4gKDEpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9tYXhfdHhfcG93ZXIodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwKKwkJCQkgdERvdDExZkZmTWF4VHhQb3dlciAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9tYXhfdHhfcG93ZXIodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZk1heFR4UG93ZXIgKiwKKwkJCSAgICAgICB1aW50OF90ICopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZOdW1PZlJlcGV0aXRpb25zIHsKKwl1aW50MTZfdCByZXBldGl0aW9uczsKK30gdERvdDExZkZmTnVtT2ZSZXBldGl0aW9uczsKKworI2RlZmluZSBET1QxMUZfRkZfTlVNT0ZSRVBFVElUSU9OU19MRU4gKDIpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9udW1fb2ZfcmVwZXRpdGlvbnModHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwKKwkJCQkgICAgICAgdERvdDExZkZmTnVtT2ZSZXBldGl0aW9ucyAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9udW1fb2ZfcmVwZXRpdGlvbnModHBBbmlTaXJHbG9iYWwsCisJCQkJICAgICB0RG90MTFmRmZOdW1PZlJlcGV0aXRpb25zICosCisJCQkJICAgICB1aW50OF90ICopOworCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZk9wZXJhdGluZ01vZGUgeworCXVpbnQ4X3QgIGNoYW5XaWR0aDoyOworCXVpbnQ4X3QgICByZXNlcnZlZDoyOworCXVpbnQ4X3QgICAgICByeE5TUzozOworCXVpbnQ4X3QgIHJ4TlNTVHlwZToxOworfSB0RG90MTFmRmZPcGVyYXRpbmdNb2RlOworCisjZGVmaW5lIERPVDExRl9GRl9PUEVSQVRJTkdNT0RFX0xFTiAoMSkKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX29wZXJhdGluZ19tb2RlKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosCisJCQkJICAgIHREb3QxMWZGZk9wZXJhdGluZ01vZGUgKik7CisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfb3BlcmF0aW5nX21vZGUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZk9wZXJhdGluZ01vZGUgKiwKKwkJCQkgIHVpbnQ4X3QgKik7CisKKyNkZWZpbmUgT1BFUkFUSU5HTU9ERV9DSEFOV0lEVEhfT0ZGU0VUIDAKKyNkZWZpbmUgT1BFUkFUSU5HTU9ERV9DSEFOV0lEVEhfV0lEVEggIDIKKyNkZWZpbmUgT1BFUkFUSU5HTU9ERV9SRVNFUlZFRF9PRkZTRVQgIDIKKyNkZWZpbmUgT1BFUkFUSU5HTU9ERV9SRVNFUlZFRF9XSURUSCAgIDIKKyNkZWZpbmUgT1BFUkFUSU5HTU9ERV9SWE5TU19PRkZTRVQgICAgIDQKKyNkZWZpbmUgT1BFUkFUSU5HTU9ERV9SWE5TU19XSURUSCAgICAgIDMKKyNkZWZpbmUgT1BFUkFUSU5HTU9ERV9SWE5TU1RZUEVfT0ZGU0VUIDcKKyNkZWZpbmUgT1BFUkFUSU5HTU9ERV9SWE5TU1RZUEVfV0lEVEggIDEKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmUkNQSSB7CisJdWludDhfdCByY3BpOworfSB0RG90MTFmRmZSQ1BJOworCisjZGVmaW5lIERPVDExRl9GRl9SQ1BJX0xFTiAoMSkKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX3JjcGkodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwgdERvdDExZkZmUkNQSSAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9yY3BpKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZSQ1BJICosIHVpbnQ4X3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlJTTkkgeworCXVpbnQ4X3QgcnNuaTsKK30gdERvdDExZkZmUlNOSTsKKworI2RlZmluZSBET1QxMUZfRkZfUlNOSV9MRU4gKDEpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9yc25pKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosIHREb3QxMWZGZlJTTkkgKik7CisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfcnNuaSh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmUlNOSSAqLCB1aW50OF90ICopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZSZWFzb24geworCXVpbnQxNl90IGNvZGU7Cit9IHREb3QxMWZGZlJlYXNvbjsKKworI2RlZmluZSBET1QxMUZfRkZfUkVBU09OX0xFTiAoMikKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX1JlYXNvbih0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLCB0RG90MTFmRmZSZWFzb24gKik7CisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfcmVhc29uKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZSZWFzb24gKiwgdWludDhfdCAqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmUnhBbnRlbm5hSWQgeworCXVpbnQ4X3QgYW50ZW5uYUlkOworfSB0RG90MTFmRmZSeEFudGVubmFJZDsKKworI2RlZmluZSBET1QxMUZfRkZfUlhBTlRFTk5BSURfTEVOICgxKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfcnhfYW50ZW5uYV9pZCh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJCSAgdERvdDExZkZmUnhBbnRlbm5hSWQgKik7CisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfcnhfYW50ZW5uYV9pZCh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmUnhBbnRlbm5hSWQgKiwKKwkJCQl1aW50OF90ICopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZTTVBvd2VyTW9kZVNldCB7CisJdWludDhfdCAgUG93ZXJTYXZlX0VuOjE7CisJdWludDhfdCAgICAgICAgICBNb2RlOjE7CisJdWludDhfdCAgICAgIHJlc2VydmVkOjY7Cit9IHREb3QxMWZGZlNNUG93ZXJNb2RlU2V0OworCisjZGVmaW5lIERPVDExRl9GRl9TTVBPV0VSTU9ERVNFVF9MRU4gKDEpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9zbV9wb3dlcl9tb2RlX3NldCh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJCSAgICAgdERvdDExZkZmU01Qb3dlck1vZGVTZXQgKik7CisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfc21fcG93ZXJfbW9kZV9zZXQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlNNUG93ZXJNb2RlU2V0ICosCisJCQkJICAgdWludDhfdCAqKTsKKworI2RlZmluZSBTTVBPV0VSTU9ERVNFVF9QT1dFUlNBVkVfRU5fT0ZGU0VUIDAKKyNkZWZpbmUgU01QT1dFUk1PREVTRVRfUE9XRVJTQVZFX0VOX1dJRFRIICAxCisjZGVmaW5lIFNNUE9XRVJNT0RFU0VUX01PREVfT0ZGU0VUICAgICAgICAgMQorI2RlZmluZSBTTVBPV0VSTU9ERVNFVF9NT0RFX1dJRFRIICAgICAgICAgIDEKKyNkZWZpbmUgU01QT1dFUk1PREVTRVRfUkVTRVJWRURfT0ZGU0VUICAgICAyCisjZGVmaW5lIFNNUE9XRVJNT0RFU0VUX1JFU0VSVkVEX1dJRFRIICAgICAgNgorCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZTdGF0dXMgeworCXVpbnQxNl90IHN0YXR1czsKK30gdERvdDExZkZmU3RhdHVzOworCisjZGVmaW5lIERPVDExRl9GRl9TVEFUVVNfTEVOICgyKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfU3RhdHVzKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosIHREb3QxMWZGZlN0YXR1cyAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9zdGF0dXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlN0YXR1cyAqLCB1aW50OF90ICopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZTdGF0dXNDb2RlIHsKKwl1aW50OF90IHN0YXR1c0NvZGU7Cit9IHREb3QxMWZGZlN0YXR1c0NvZGU7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1NUQVRVU0NPREVfTEVOICgxKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfc3RhdHVzX2NvZGUodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwKKwkJCQkgdERvdDExZkZmU3RhdHVzQ29kZSAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl9zdGF0dXNfY29kZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmU3RhdHVzQ29kZSAqLAorCQkJICAgICAgIHVpbnQ4X3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlRQQ0VsZUlEIHsKKwl1aW50OF90IFRQQ0lkOworfSB0RG90MTFmRmZUUENFbGVJRDsKKworI2RlZmluZSBET1QxMUZfRkZfVFBDRUxFSURfTEVOICgxKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfdHBjX2VsZV9pZCh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJICAgICAgIHREb3QxMWZGZlRQQ0VsZUlEICopOworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3RwY19lbGVfaWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlRQQ0VsZUlEICosIHVpbnQ4X3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlRQQ0VsZUxlbiB7CisJdWludDhfdCBUUENMZW47Cit9IHREb3QxMWZGZlRQQ0VsZUxlbjsKKworI2RlZmluZSBET1QxMUZfRkZfVFBDRUxFTEVOX0xFTiAoMSkKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX3RwY19lbGVfbGVuKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosCisJCQkJdERvdDExZkZmVFBDRWxlTGVuICopOworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3RwY19lbGVfbGVuKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZUUENFbGVMZW4gKiwKKwkJCSAgICAgIHVpbnQ4X3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlRTSW5mbyB7CisJdWludDMyX3QgICAgdHJhZmZpY190eXBlOjE7CisJdWludDMyX3QgICAgICAgICAgICB0c2lkOjQ7CisJdWludDMyX3QgICAgICAgZGlyZWN0aW9uOjI7CisJdWludDMyX3QgICBhY2Nlc3NfcG9saWN5OjI7CisJdWludDMyX3QgICAgIGFnZ3JlZ2F0aW9uOjE7CisJdWludDMyX3QgICAgICAgICAgICAgcHNiOjE7CisJdWludDMyX3QgICB1c2VyX3ByaW9yaXR5OjM7CisJdWludDMyX3QgIHRzaW5mb19hY2tfcG9sOjI7CisJdWludDMyX3QgICAgICAgIHNjaGVkdWxlOjE7CisJdWludDMyX3QgICAgICAgICAgdW51c2VkOjE1OworfSB0RG90MTFmRmZUU0luZm87CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1RTSU5GT19MRU4gKDMpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl90c19pbmZvKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosIHREb3QxMWZGZlRTSW5mbyAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl90c19pbmZvKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZUU0luZm8gKiwgdWludDhfdCAqKTsKKworI2RlZmluZSBUU0lORk9fVFJBRkZJQ19UWVBFX09GRlNFVCAgIDAKKyNkZWZpbmUgVFNJTkZPX1RSQUZGSUNfVFlQRV9XSURUSCAgICAxCisjZGVmaW5lIFRTSU5GT19UU0lEX09GRlNFVCAgICAgICAgICAgMQorI2RlZmluZSBUU0lORk9fVFNJRF9XSURUSCAgICAgICAgICAgIDQKKyNkZWZpbmUgVFNJTkZPX0RJUkVDVElPTl9PRkZTRVQgICAgICA1CisjZGVmaW5lIFRTSU5GT19ESVJFQ1RJT05fV0lEVEggICAgICAgMgorI2RlZmluZSBUU0lORk9fQUNDRVNTX1BPTElDWV9PRkZTRVQgIDcKKyNkZWZpbmUgVFNJTkZPX0FDQ0VTU19QT0xJQ1lfV0lEVEggICAyCisjZGVmaW5lIFRTSU5GT19BR0dSRUdBVElPTl9PRkZTRVQgICAgOQorI2RlZmluZSBUU0lORk9fQUdHUkVHQVRJT05fV0lEVEggICAgIDEKKyNkZWZpbmUgVFNJTkZPX1BTQl9PRkZTRVQgICAgICAgICAgICAxMAorI2RlZmluZSBUU0lORk9fUFNCX1dJRFRIICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFNJTkZPX1VTRVJfUFJJT1JJVFlfT0ZGU0VUICAxMQorI2RlZmluZSBUU0lORk9fVVNFUl9QUklPUklUWV9XSURUSCAgIDMKKyNkZWZpbmUgVFNJTkZPX1RTSU5GT19BQ0tfUE9MX09GRlNFVCAxNAorI2RlZmluZSBUU0lORk9fVFNJTkZPX0FDS19QT0xfV0lEVEggIDIKKyNkZWZpbmUgVFNJTkZPX1NDSEVEVUxFX09GRlNFVCAgICAgICAxNgorI2RlZmluZSBUU0lORk9fU0NIRURVTEVfV0lEVEggICAgICAgIDEKKyNkZWZpbmUgVFNJTkZPX1VOVVNFRF9PRkZTRVQgICAgICAgICAxNworI2RlZmluZSBUU0lORk9fVU5VU0VEX1dJRFRIICAgICAgICAgIDE1CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlRpbWVTdGFtcCB7CisJdERPVDExRl9VNjQgdGltZXN0YW1wOworfSB0RG90MTFmRmZUaW1lU3RhbXA7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1RJTUVTVEFNUF9MRU4gKDgpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl90aW1lX3N0YW1wKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosCisJCQkJdERvdDExZkZmVGltZVN0YW1wICopOworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3RpbWVfc3RhbXAodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlRpbWVTdGFtcCAqLAorCQkJICAgICAgdWludDhfdCAqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmVHJhbnNhY3Rpb25JZCB7CisJdWludDhfdCB0cmFuc0lkWzJdOworfSB0RG90MTFmRmZUcmFuc2FjdGlvbklkOworCisjZGVmaW5lIERPVDExRl9GRl9UUkFOU0FDVElPTklEX0xFTiAoMikKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX3RyYW5zYWN0aW9uX2lkKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosCisJCQkJICAgIHREb3QxMWZGZlRyYW5zYWN0aW9uSWQgKik7CisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfdHJhbnNhY3Rpb25faWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlRyYW5zYWN0aW9uSWQgKiwKKwkJCQkgIHVpbnQ4X3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlR4QW50ZW5uYUlkIHsKKwl1aW50OF90IGFudGVubmFJZDsKK30gdERvdDExZkZmVHhBbnRlbm5hSWQ7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1RYQU5URU5OQUlEX0xFTiAoMSkKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX3R4X2FudGVubmFfaWQodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwKKwkJCQkgIHREb3QxMWZGZlR4QW50ZW5uYUlkICopOworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3R4X2FudGVubmFfaWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlR4QW50ZW5uYUlkICosCisJCQkJdWludDhfdCAqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmVHhQb3dlciB7CisJdWludDhfdCB0eFBvd2VyOworfSB0RG90MTFmRmZUeFBvd2VyOworCisjZGVmaW5lIERPVDExRl9GRl9UWFBPV0VSX0xFTiAoMSkKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX3R4X3Bvd2VyKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosCisJCQkgICAgICB0RG90MTFmRmZUeFBvd2VyICopOworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3R4X3Bvd2VyKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZUeFBvd2VyICosIHVpbnQ4X3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlZodE1lbWJlcnNoaXBTdGF0dXNBcnJheSB7CisJdWludDhfdCBtZW1iZXJzaGlwU3RhdHVzQXJyYXlbOF07Cit9IHREb3QxMWZGZlZodE1lbWJlcnNoaXBTdGF0dXNBcnJheTsKKworI2RlZmluZSBET1QxMUZfRkZfVkhUTUVNQkVSU0hJUFNUQVRVU0FSUkFZX0xFTiAoOCkKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX3ZodF9tZW1iZXJzaGlwX3N0YXR1c19hcnJheSh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJCQkgICAgICAgdERvdDExZkZmVmh0TWVtYmVyc2hpcFN0YXR1c0FycmF5ICopOworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3ZodF9tZW1iZXJzaGlwX3N0YXR1c19hcnJheSh0cEFuaVNpckdsb2JhbCwKKwkJCQkJICAgICB0RG90MTFmRmZWaHRNZW1iZXJzaGlwU3RhdHVzQXJyYXkgKiwKKwkJCQkJICAgICB1aW50OF90ICopOworCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlZodFVzZXJQb3NpdGlvbkFycmF5IHsKKwl1aW50OF90IHVzZXJQb3NpdGlvbkFycmF5WzE2XTsKK30gdERvdDExZkZmVmh0VXNlclBvc2l0aW9uQXJyYXk7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1ZIVFVTRVJQT1NJVElPTkFSUkFZX0xFTiAoMTYpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl92aHRfdXNlcl9wb3NpdGlvbl9hcnJheSh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJCQkgICB0RG90MTFmRmZWaHRVc2VyUG9zaXRpb25BcnJheSAqKTsKKwordm9pZCBkb3QxMWZfcGFja19mZl92aHRfdXNlcl9wb3NpdGlvbl9hcnJheSh0cEFuaVNpckdsb2JhbCwKKwkJCQkJIHREb3QxMWZGZlZodFVzZXJQb3NpdGlvbkFycmF5ICosCisJCQkJCSB1aW50OF90ICopOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRMVnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBJRCAxICgweDAwMDEpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWQXV0aG9yaXplZE1BQ3MgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG1hY1s2XTsKK30gdERvdDExZlRMVkF1dGhvcml6ZWRNQUNzOworCisjZGVmaW5lIERPVDExRl9UTFZfQVVUSE9SSVpFRE1BQ1MgKDEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9BVVRIT1JJWkVETUFDU19NSU5fTEVOICg2KQorCisjZGVmaW5lIERPVDExRl9UTFZfQVVUSE9SSVpFRE1BQ1NfTUFYX0xFTiAoNikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X2F1dGhvcml6ZWRfbWFfY3MoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQxNl90LAorCXREb3QxMWZUTFZBdXRob3JpemVkTUFDcyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfYXV0aG9yaXplZF9tYV9jcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X0F1dGhvcml6ZWRNQUNzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZBdXRob3JpemVkTUFDcyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIElEIDMgKDB4MDAwMykgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHJlcTsKK30gdERvdDExZlRMVlJlcXVlc3RUb0Vucm9sbDsKKworI2RlZmluZSBET1QxMUZfVExWX1JFUVVFU1RUT0VOUk9MTCAoMykKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX1JFUVVFU1RUT0VOUk9MTF9NSU5fTEVOICgxKQorCisjZGVmaW5lIERPVDExRl9UTFZfUkVRVUVTVFRPRU5ST0xMX01BWF9MRU4gKDEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9SZXF1ZXN0VG9FbnJvbGwoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQxNl90LAorCXREb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3JlcXVlc3RfdG9fZW5yb2xsKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X1JlcXVlc3RUb0Vucm9sbCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWUmVxdWVzdFRvRW5yb2xsICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgMCAoMHgwMDAwKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlZlcnNpb24yIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICAgICBtaW5vcjo0OworCXVpbnQ4X3QgICAgICAgICAgICAgICAgbWFqb3I6NDsKK30gdERvdDExZlRMVlZlcnNpb24yOworCisjZGVmaW5lIERPVDExRl9UTFZfVkVSU0lPTjIgKDApCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9WRVJTSU9OMl9NSU5fTEVOICgxKQorCisjZGVmaW5lIERPVDExRl9UTFZfVkVSU0lPTjJfTUFYX0xFTiAoMSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3ZlcnNpb24yKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWVmVyc2lvbjIqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3ZlcnNpb24yKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZWZXJzaW9uMiAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfVmVyc2lvbjIoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlZlcnNpb24yICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgNDE4MyAoMHgxMDU3KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVkFQU2V0dXBMb2NrZWQgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGZMb2NrZWQ7Cit9IHREb3QxMWZUTFZBUFNldHVwTG9ja2VkOworCisjZGVmaW5lIERPVDExRl9UTFZfQVBTRVRVUExPQ0tFRCAoNDE4MykKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX0FQU0VUVVBMT0NLRURfTUlOX0xFTiAoMykKKworI2RlZmluZSBET1QxMUZfVExWX0FQU0VUVVBMT0NLRURfTUFYX0xFTiAoMykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X0FQU2V0dXBMb2NrZWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQxNl90LAorCXREb3QxMWZUTFZBUFNldHVwTG9ja2VkKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9hcF9zZXR1cF9sb2NrZWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVkFQU2V0dXBMb2NrZWQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X0FQU2V0dXBMb2NrZWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVkFQU2V0dXBMb2NrZWQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MDk4ICgweDEwMDIpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWQXNzb2NpYXRpb25TdGF0ZSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQxNl90ICAgICAgICAgICAgc3RhdGU7Cit9IHREb3QxMWZUTFZBc3NvY2lhdGlvblN0YXRlOworCisjZGVmaW5lIERPVDExRl9UTFZfQVNTT0NJQVRJT05TVEFURSAoNDA5OCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX0FTU09DSUFUSU9OU1RBVEVfTUlOX0xFTiAoNCkKKworI2RlZmluZSBET1QxMUZfVExWX0FTU09DSUFUSU9OU1RBVEVfTUFYX0xFTiAoNCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X0Fzc29jaWF0aW9uU3RhdGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQxNl90LAorCXREb3QxMWZUTFZBc3NvY2lhdGlvblN0YXRlKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9hc3NvY2lhdGlvbl9zdGF0ZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWQXNzb2NpYXRpb25TdGF0ZSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfQXNzb2NpYXRpb25TdGF0ZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWQXNzb2NpYXRpb25TdGF0ZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIElEIDQxMDQgKDB4MTAwOCkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZDb25maWdNZXRob2RzIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDE2X3QgICAgICAgICAgICBtZXRob2RzOworfSB0RG90MTFmVExWQ29uZmlnTWV0aG9kczsKKworI2RlZmluZSBET1QxMUZfVExWX0NPTkZJR01FVEhPRFMgKDQxMDQpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9DT05GSUdNRVRIT0RTX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9DT05GSUdNRVRIT0RTX01BWF9MRU4gKDQpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9Db25maWdNZXRob2RzKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWQ29uZmlnTWV0aG9kcyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfY29uZmlnX21ldGhvZHMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVkNvbmZpZ01ldGhvZHMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X0NvbmZpZ01ldGhvZHMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVkNvbmZpZ01ldGhvZHMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MTA1ICgweDEwMDkpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWQ29uZmlndXJhdGlvbkVycm9yIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDE2X3QgICAgICAgICAgICBlcnJvcjsKK30gdERvdDExZlRMVkNvbmZpZ3VyYXRpb25FcnJvcjsKKworI2RlZmluZSBET1QxMUZfVExWX0NPTkZJR1VSQVRJT05FUlJPUiAoNDEwNSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX0NPTkZJR1VSQVRJT05FUlJPUl9NSU5fTEVOICg0KQorCisjZGVmaW5lIERPVDExRl9UTFZfQ09ORklHVVJBVElPTkVSUk9SX01BWF9MRU4gKDQpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9Db25maWd1cmF0aW9uRXJyb3IoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQxNl90LAorCXREb3QxMWZUTFZDb25maWd1cmF0aW9uRXJyb3IqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X2NvbmZpZ3VyYXRpb25fZXJyb3IoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVkNvbmZpZ3VyYXRpb25FcnJvciAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfQ29uZmlndXJhdGlvbkVycm9yKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZDb25maWd1cmF0aW9uRXJyb3IgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MTEzICgweDEwMTEpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWRGV2aWNlTmFtZSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX3RleHQ7CisJdWludDhfdCAgICAgICAgICAgICB0ZXh0WzMyXTsKK30gdERvdDExZlRMVkRldmljZU5hbWU7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9ERVZJQ0VOQU1FICg0MTEzKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfREVWSUNFTkFNRV9NSU5fTEVOICgyKQorCisjZGVmaW5lIERPVDExRl9UTFZfREVWSUNFTkFNRV9NQVhfTEVOICgzNCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X2RldmljZV9uYW1lKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWRGV2aWNlTmFtZSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfZGV2aWNlX25hbWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVkRldmljZU5hbWUgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X0RldmljZU5hbWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVkRldmljZU5hbWUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MTE0ICgweDEwMTIpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWRGV2aWNlUGFzc3dvcmRJRCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQxNl90ICAgICAgICAgICAgaWQ7Cit9IHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElEOworCisjZGVmaW5lIERPVDExRl9UTFZfREVWSUNFUEFTU1dPUkRJRCAoNDExNCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX0RFVklDRVBBU1NXT1JESURfTUlOX0xFTiAoNCkKKworI2RlZmluZSBET1QxMUZfVExWX0RFVklDRVBBU1NXT1JESURfTUFYX0xFTiAoNCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X0RldmljZVBhc3N3b3JkSUQoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQxNl90LAorCXREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElEKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9kZXZpY2VfcGFzc3dvcmRfaWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X0RldmljZVBhc3N3b3JkSUQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA4ICgweDAwMDgpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmcgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgICAgIGF2YWlsaWJpbGl0eVBlcmlvZDsKKwl1aW50MTZfdCAgICAgICAgICAgIGF2YWlsaWJpbGl0eUludGVydmFsOworfSB0RG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmc7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9FWFRFTkRFRExJU1RFTlRJTUlORyAoOCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX0VYVEVOREVETElTVEVOVElNSU5HX01JTl9MRU4gKDUpCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9FWFRFTkRFRExJU1RFTlRJTUlOR19NQVhfTEVOICg1KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfZXh0ZW5kZWRfbGlzdGVuX3RpbWluZygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9leHRlbmRlZF9saXN0ZW5fdGltaW5nKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfRXh0ZW5kZWRMaXN0ZW5UaW1pbmcoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgNiAoMHgwMDA2KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVkxpc3RlbkNoYW5uZWwgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGNvdW50cnlTdHJpbmdbM107CisJdWludDhfdCAgICAgICAgICAgICByZWd1bGF0b3J5Q2xhc3M7CisJdWludDhfdCAgICAgICAgICAgICBjaGFubmVsOworfSB0RG90MTFmVExWTGlzdGVuQ2hhbm5lbDsKKworI2RlZmluZSBET1QxMUZfVExWX0xJU1RFTkNIQU5ORUwgKDYpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9MSVNURU5DSEFOTkVMX01JTl9MRU4gKDYpCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9MSVNURU5DSEFOTkVMX01BWF9MRU4gKDYpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9saXN0ZW5fY2hhbm5lbCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVkxpc3RlbkNoYW5uZWwqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X2xpc3Rlbl9jaGFubmVsKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZMaXN0ZW5DaGFubmVsICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9MaXN0ZW5DaGFubmVsKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZMaXN0ZW5DaGFubmVsICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgNDEyOSAoMHgxMDIxKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVk1hbnVmYWN0dXJlciB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX25hbWU7CisJdWludDhfdCAgICAgICAgICAgICBuYW1lWzY0XTsKK30gdERvdDExZlRMVk1hbnVmYWN0dXJlcjsKKworI2RlZmluZSBET1QxMUZfVExWX01BTlVGQUNUVVJFUiAoNDEyOSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX01BTlVGQUNUVVJFUl9NSU5fTEVOICgyKQorCisjZGVmaW5lIERPVDExRl9UTFZfTUFOVUZBQ1RVUkVSX01BWF9MRU4gKDY2KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfbWFudWZhY3R1cmVyKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWTWFudWZhY3R1cmVyKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9tYW51ZmFjdHVyZXIoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVk1hbnVmYWN0dXJlciAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfTWFudWZhY3R1cmVyKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZNYW51ZmFjdHVyZXIgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCAxICgweDAwMDEpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWTWlub3JSZWFzb25Db2RlIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBtaW5vclJlYXNvbkNvZGU7Cit9IHREb3QxMWZUTFZNaW5vclJlYXNvbkNvZGU7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9NSU5PUlJFQVNPTkNPREUgKDEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9NSU5PUlJFQVNPTkNPREVfTUlOX0xFTiAoMikKKworI2RlZmluZSBET1QxMUZfVExWX01JTk9SUkVBU09OQ09ERV9NQVhfTEVOICgyKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfTWlub3JSZWFzb25Db2RlKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWTWlub3JSZWFzb25Db2RlKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9taW5vcl9yZWFzb25fY29kZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWTWlub3JSZWFzb25Db2RlICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9NaW5vclJlYXNvbkNvZGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVk1pbm9yUmVhc29uQ29kZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIElEIDQxMzEgKDB4MTAyMykgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZNb2RlbE5hbWUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG51bV90ZXh0OworCXVpbnQ4X3QgICAgICAgICAgICAgdGV4dFszMl07Cit9IHREb3QxMWZUTFZNb2RlbE5hbWU7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9NT0RFTE5BTUUgKDQxMzEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9NT0RFTE5BTUVfTUlOX0xFTiAoMikKKworI2RlZmluZSBET1QxMUZfVExWX01PREVMTkFNRV9NQVhfTEVOICgzNCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X21vZGVsX25hbWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQxNl90LAorCXREb3QxMWZUTFZNb2RlbE5hbWUqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X21vZGVsX25hbWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVk1vZGVsTmFtZSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfTW9kZWxOYW1lKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZNb2RlbE5hbWUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MTMyICgweDEwMjQpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWTW9kZWxOdW1iZXIgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG51bV90ZXh0OworCXVpbnQ4X3QgICAgICAgICAgICAgdGV4dFszMl07Cit9IHREb3QxMWZUTFZNb2RlbE51bWJlcjsKKworI2RlZmluZSBET1QxMUZfVExWX01PREVMTlVNQkVSICg0MTMyKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfTU9ERUxOVU1CRVJfTUlOX0xFTiAoMikKKworI2RlZmluZSBET1QxMUZfVExWX01PREVMTlVNQkVSX01BWF9MRU4gKDM0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfbW9kZWxfbnVtYmVyKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWTW9kZWxOdW1iZXIqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X21vZGVsX251bWJlcigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWTW9kZWxOdW1iZXIgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X01vZGVsTnVtYmVyKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZNb2RlbE51bWJlciAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIElEIDEyICgweDAwMGMpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWTm90aWNlT2ZBYnNlbmNlIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBpbmRleDsKKwl1aW50OF90ICAgICAgICAgICAgIENUU1dpbmRvd09wcFBTOworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX05vQURlc2M7CisJdWludDhfdCAgICAgICAgICAgICBOb0FEZXNjWzM2XTsKK30gdERvdDExZlRMVk5vdGljZU9mQWJzZW5jZTsKKworI2RlZmluZSBET1QxMUZfVExWX05PVElDRU9GQUJTRU5DRSAoMTIpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9OT1RJQ0VPRkFCU0VOQ0VfTUlOX0xFTiAoMykKKworI2RlZmluZSBET1QxMUZfVExWX05PVElDRU9GQUJTRU5DRV9NQVhfTEVOICgzOSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X25vdGljZV9vZl9hYnNlbmNlKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9ub3RpY2Vfb2ZfYWJzZW5jZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9Ob3RpY2VPZkFic2VuY2UoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIElEIDE3ICgweDAwMTEpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWT3BlcmF0aW5nQ2hhbm5lbCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgY291bnRyeVN0cmluZ1szXTsKKwl1aW50OF90ICAgICAgICAgICAgIHJlZ3VsYXRvcnlDbGFzczsKKwl1aW50OF90ICAgICAgICAgICAgIGNoYW5uZWw7Cit9IHREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsOworCisjZGVmaW5lIERPVDExRl9UTFZfT1BFUkFUSU5HQ0hBTk5FTCAoMTcpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9PUEVSQVRJTkdDSEFOTkVMX01JTl9MRU4gKDYpCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9PUEVSQVRJTkdDSEFOTkVMX01BWF9MRU4gKDYpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9vcGVyYXRpbmdfY2hhbm5lbCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X29wZXJhdGluZ19jaGFubmVsKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9PcGVyYXRpbmdDaGFubmVsKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgMiAoMHgwMDAyKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlAyUENhcGFiaWxpdHkgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGRldmljZUNhcGFiaWxpdHk7CisJdWludDhfdCAgICAgICAgICAgICBncm91cENhcGFiaWxpdHk7Cit9IHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5OworCisjZGVmaW5lIERPVDExRl9UTFZfUDJQQ0FQQUJJTElUWSAoMikKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX1AyUENBUEFCSUxJVFlfTUlOX0xFTiAoMykKKworI2RlZmluZSBET1QxMUZfVExWX1AyUENBUEFCSUxJVFlfTUFYX0xFTiAoMykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3AyX3BfY2FwYWJpbGl0eSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlAyUENhcGFiaWxpdHkqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3AyX3BfY2FwYWJpbGl0eSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfUDJQQ2FwYWJpbGl0eSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIElEIDMgKDB4MDAwMykgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZQMlBEZXZpY2VJZCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgUDJQRGV2aWNlQWRkcmVzc1s2XTsKK30gdERvdDExZlRMVlAyUERldmljZUlkOworCisjZGVmaW5lIERPVDExRl9UTFZfUDJQREVWSUNFSUQgKDMpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBERVZJQ0VJRF9NSU5fTEVOICg3KQorCisjZGVmaW5lIERPVDExRl9UTFZfUDJQREVWSUNFSURfTUFYX0xFTiAoNykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3AyX3BfZGV2aWNlX2lkKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWUDJQRGV2aWNlSWQqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3AyX3BfZGV2aWNlX2lkKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZQMlBEZXZpY2VJZCAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfUDJQRGV2aWNlSWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlAyUERldmljZUlkICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgMTMgKDB4MDAwZCkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZQMlBEZXZpY2VJbmZvIHsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgUDJQRGV2aWNlQWRkcmVzc1s2XTsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgY29uZmlnTWV0aG9kOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5RGV2aWNlVHlwZVs4XTsKKwl0RG90MTFmVExWRGV2aWNlTmFtZSAgICAgICAgRGV2aWNlTmFtZTsKK30gdERvdDExZlRMVlAyUERldmljZUluZm87CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBERVZJQ0VJTkZPICgxMykKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX1AyUERFVklDRUlORk9fTUlOX0xFTiAoMTcpCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBERVZJQ0VJTkZPX01BWF9MRU4gKDUzKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfcDJfcF9kZXZpY2VfaW5mbygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlAyUERldmljZUluZm8qKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3AyX3BfZGV2aWNlX2luZm8oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlAyUERldmljZUluZm8gKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X1AyUERldmljZUluZm8oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlAyUERldmljZUluZm8gKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCAxNCAoMHgwMDBlKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlAyUEdyb3VwSW5mbyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX1AyUENsaWVudEluZm9EZXNjOworCXVpbnQ4X3QgICAgICAgICAgICAgUDJQQ2xpZW50SW5mb0Rlc2NbMTAyNF07Cit9IHREb3QxMWZUTFZQMlBHcm91cEluZm87CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBHUk9VUElORk8gKDE0KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfUDJQR1JPVVBJTkZPX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBHUk9VUElORk9fTUFYX0xFTiAoMTAyNSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3AyX3BfZ3JvdXBfaW5mbygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlAyUEdyb3VwSW5mbyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcDJfcF9ncm91cF9pbmZvKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZQMlBHcm91cEluZm8gKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X1AyUEdyb3VwSW5mbygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWUDJQR3JvdXBJbmZvICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgMCAoMHgwMDAwKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlAyUFN0YXR1cyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgc3RhdHVzOworfSB0RG90MTFmVExWUDJQU3RhdHVzOworCisjZGVmaW5lIERPVDExRl9UTFZfUDJQU1RBVFVTICgwKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfUDJQU1RBVFVTX01JTl9MRU4gKDIpCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBTVEFUVVNfTUFYX0xFTiAoMikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X1AyUFN0YXR1cygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlAyUFN0YXR1cyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcDJfcF9zdGF0dXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlAyUFN0YXR1cyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfUDJQU3RhdHVzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZQMlBTdGF0dXMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MTgwICgweDEwNTQpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWUHJpbWFyeURldmljZVR5cGUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgICAgIHByaW1hcnlfY2F0ZWdvcnk7CisJdWludDhfdCAgICAgICAgICAgICBvdWlbNF07CisJdWludDE2X3QgICAgICAgICAgICBzdWJfY2F0ZWdvcnk7Cit9IHREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZTsKKworI2RlZmluZSBET1QxMUZfVExWX1BSSU1BUllERVZJQ0VUWVBFICg0MTgwKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfUFJJTUFSWURFVklDRVRZUEVfTUlOX0xFTiAoMTApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QUklNQVJZREVWSUNFVFlQRV9NQVhfTEVOICgxMCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3ByaW1hcnlfZGV2aWNlX3R5cGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQxNl90LAorCXREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcHJpbWFyeV9kZXZpY2VfdHlwZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGUgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X1ByaW1hcnlEZXZpY2VUeXBlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIElEIDQxNTYgKDB4MTAzYykgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZSRkJhbmRzIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBiYW5kczsKK30gdERvdDExZlRMVlJGQmFuZHM7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9SRkJBTkRTICg0MTU2KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfUkZCQU5EU19NSU5fTEVOICgzKQorCisjZGVmaW5lIERPVDExRl9UTFZfUkZCQU5EU19NQVhfTEVOICgzKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfUkZCYW5kcygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlJGQmFuZHMqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3JmX2JhbmRzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZSRkJhbmRzICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9SRkJhbmRzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZSRkJhbmRzICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgNDIwMiAoMHgxMDZhKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDE2X3QgICAgICAgICAgICBwcmltYXJ5X2NhdGVnb3J5OworCXVpbnQ4X3QgICAgICAgICAgICAgb3VpWzRdOworCXVpbnQxNl90ICAgICAgICAgICAgc3ViX2NhdGVnb3J5OworfSB0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGU7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9SRVFVRVNUREVWSUNFVFlQRSAoNDIwMikKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX1JFUVVFU1RERVZJQ0VUWVBFX01JTl9MRU4gKDEwKQorCisjZGVmaW5lIERPVDExRl9UTFZfUkVRVUVTVERFVklDRVRZUEVfTUFYX0xFTiAoMTApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9yZXF1ZXN0X2RldmljZV90eXBlKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3JlcXVlc3RfZGV2aWNlX3R5cGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9SZXF1ZXN0RGV2aWNlVHlwZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MTU0ICgweDEwM2EpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWUmVxdWVzdFR5cGUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHJlcVR5cGU7Cit9IHREb3QxMWZUTFZSZXF1ZXN0VHlwZTsKKworI2RlZmluZSBET1QxMUZfVExWX1JFUVVFU1RUWVBFICg0MTU0KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfUkVRVUVTVFRZUEVfTUlOX0xFTiAoMykKKworI2RlZmluZSBET1QxMUZfVExWX1JFUVVFU1RUWVBFX01BWF9MRU4gKDMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9SZXF1ZXN0VHlwZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlJlcXVlc3RUeXBlKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9yZXF1ZXN0X3R5cGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlJlcXVlc3RUeXBlICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9SZXF1ZXN0VHlwZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWUmVxdWVzdFR5cGUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MTU1ICgweDEwM2IpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWUmVzcG9uc2VUeXBlIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICByZXNUeXBlOworfSB0RG90MTFmVExWUmVzcG9uc2VUeXBlOworCisjZGVmaW5lIERPVDExRl9UTFZfUkVTUE9OU0VUWVBFICg0MTU1KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfUkVTUE9OU0VUWVBFX01JTl9MRU4gKDMpCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9SRVNQT05TRVRZUEVfTUFYX0xFTiAoMykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X1Jlc3BvbnNlVHlwZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlJlc3BvbnNlVHlwZSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcmVzcG9uc2VfdHlwZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWUmVzcG9uc2VUeXBlICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9SZXNwb25zZVR5cGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlJlc3BvbnNlVHlwZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIElEIDQxNjEgKDB4MTA0MSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhciB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgc2VsZWN0ZWQ7Cit9IHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhcjsKKworI2RlZmluZSBET1QxMUZfVExWX1NFTEVDVEVEUkVHSVNUUkFSICg0MTYxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVJfTUlOX0xFTiAoMykKKworI2RlZmluZSBET1QxMUZfVExWX1NFTEVDVEVEUkVHSVNUUkFSX01BWF9MRU4gKDMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9TZWxlY3RlZFJlZ2lzdHJhcigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9zZWxlY3RlZF9yZWdpc3RyYXIoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9TZWxlY3RlZFJlZ2lzdHJhcigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MTc5ICgweDEwNTMpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDE2X3QgICAgICAgICAgICBtZXRob2RzOworfSB0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOworCisjZGVmaW5lIERPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVJDT05GSUdNRVRIT0RTICg0MTc5KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVJDT05GSUdNRVRIT0RTX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9TRUxFQ1RFRFJFR0lTVFJBUkNPTkZJR01FVEhPRFNfTUFYX0xFTiAoNCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X1NlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfc2VsZWN0ZWRfcmVnaXN0cmFyX2NvbmZpZ19tZXRob2RzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X1NlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgNDE2MiAoMHgxMDQyKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlNlcmlhbE51bWJlciB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX3RleHQ7CisJdWludDhfdCAgICAgICAgICAgICB0ZXh0WzMyXTsKK30gdERvdDExZlRMVlNlcmlhbE51bWJlcjsKKworI2RlZmluZSBET1QxMUZfVExWX1NFUklBTE5VTUJFUiAoNDE2MikKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX1NFUklBTE5VTUJFUl9NSU5fTEVOICgyKQorCisjZGVmaW5lIERPVDExRl9UTFZfU0VSSUFMTlVNQkVSX01BWF9MRU4gKDM0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfc2VyaWFsX251bWJlcigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlNlcmlhbE51bWJlciopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfc2VyaWFsX251bWJlcigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWU2VyaWFsTnVtYmVyICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9TZXJpYWxOdW1iZXIoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlNlcmlhbE51bWJlciAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIElEIDQxNjcgKDB4MTA0NykgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZVVUlEX0UgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHV1aWRbMTZdOworfSB0RG90MTFmVExWVVVJRF9FOworCisjZGVmaW5lIERPVDExRl9UTFZfVVVJRF9FICg0MTY3KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9UTFZfVVVJRF9FX01JTl9MRU4gKDE4KQorCisjZGVmaW5lIERPVDExRl9UTFZfVVVJRF9FX01BWF9MRU4gKDE4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfdXVpZF9lKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWVVVJRF9FKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl91dWlkX2UoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlVVSURfRSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfVVVJRF9FKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZVVUlEX0UgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MTY4ICgweDEwNDgpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWVVVJRF9SIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICB1dWlkWzE2XTsKK30gdERvdDExZlRMVlVVSURfUjsKKworI2RlZmluZSBET1QxMUZfVExWX1VVSURfUiAoNDE2OCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX1VVSURfUl9NSU5fTEVOICgxOCkKKworI2RlZmluZSBET1QxMUZfVExWX1VVSURfUl9NQVhfTEVOICgxOCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3V1aWRfcigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlVVSURfUiopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfdXVpZF9yKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZVVUlEX1IgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X1VVSURfUigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWVVVJRF9SICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgNDE2OSAoMHgxMDQ5KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlZlbmRvckV4dGVuc2lvbiB7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JJZFszXTsKKwl0RG90MTFmVExWVmVyc2lvbjIgICAgICAgICAgICAgICBWZXJzaW9uMjsKKwl0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MgICAgICAgICBBdXRob3JpemVkTUFDczsKKwl0RG90MTFmVExWUmVxdWVzdFRvRW5yb2xsICAgICAgICBSZXF1ZXN0VG9FbnJvbGw7Cit9IHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb247CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9WRU5ET1JFWFRFTlNJT04gKDQxNjkpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9WRU5ET1JFWFRFTlNJT05fTUlOX0xFTiAoNSkKKworI2RlZmluZSBET1QxMUZfVExWX1ZFTkRPUkVYVEVOU0lPTl9NQVhfTEVOICgxOSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3ZlbmRvcl9leHRlbnNpb24oCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQxNl90LAorCXREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24qKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3ZlbmRvcl9leHRlbnNpb24oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfVmVuZG9yRXh0ZW5zaW9uKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24gKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCA0MTcwICgweDEwNGEpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWVmVyc2lvbiB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgICAgbWlub3I6NDsKKwl1aW50OF90ICAgICAgICAgICAgICAgIG1ham9yOjQ7Cit9IHREb3QxMWZUTFZWZXJzaW9uOworCisjZGVmaW5lIERPVDExRl9UTFZfVkVSU0lPTiAoNDE3MCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX1ZFUlNJT05fTUlOX0xFTiAoMykKKworI2RlZmluZSBET1QxMUZfVExWX1ZFUlNJT05fTUFYX0xFTiAoMykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3ZlcnNpb24oCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQxNl90LAorCXREb3QxMWZUTFZWZXJzaW9uKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl92ZXJzaW9uKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZWZXJzaW9uICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9WZXJzaW9uKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZWZXJzaW9uICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogSUQgNDE2NCAoMHgxMDQ0KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVldQU1N0YXRlIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBzdGF0ZTsKK30gdERvdDExZlRMVldQU1N0YXRlOworCisjZGVmaW5lIERPVDExRl9UTFZfV1BTU1RBVEUgKDQxNjQpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9XUFNTVEFURV9NSU5fTEVOICgzKQorCisjZGVmaW5lIERPVDExRl9UTFZfV1BTU1RBVEVfTUFYX0xFTiAoMykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X1dQU1N0YXRlKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWV1BTU3RhdGUqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3dwc19zdGF0ZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmVExWV1BTU3RhdGUgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGx2X1dQU1N0YXRlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZXUFNTdGF0ZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIElEIDE2ICgweDAwMTApICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWUDJQSW50ZXJmYWNlIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBQMlBEZXZpY2VBZGRyZXNzWzZdOworfSB0RG90MTFmVExWUDJQSW50ZXJmYWNlOworCisjZGVmaW5lIERPVDExRl9UTFZfUDJQSU5URVJGQUNFICgxNikKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfVExWX1AyUElOVEVSRkFDRV9NSU5fTEVOICg3KQorCisjZGVmaW5lIERPVDExRl9UTFZfUDJQSU5URVJGQUNFX01BWF9MRU4gKDcpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9wMl9wX2ludGVyZmFjZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDE2X3QsCisJdERvdDExZlRMVlAyUEludGVyZmFjZSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcDJfcF9pbnRlcmZhY2UoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZlRMVlAyUEludGVyZmFjZSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90bHZfUDJQSW50ZXJmYWNlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZQMlBJbnRlcmZhY2UgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBJRCAxMCAoMHgwMDBhKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlAyUE1hbmFnZWFiaWxpdHkgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG1hbmFnZWFiaWxpdHk7Cit9IHREb3QxMWZUTFZQMlBNYW5hZ2VhYmlsaXR5OworCisjZGVmaW5lIERPVDExRl9UTFZfUDJQTUFOQUdFQUJJTElUWSAoMTApCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBNQU5BR0VBQklMSVRZX01JTl9MRU4gKDIpCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBNQU5BR0VBQklMSVRZX01BWF9MRU4gKDIpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9QMlBNYW5hZ2VhYmlsaXR5KAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50MTZfdCwKKwl0RG90MTFmVExWUDJQTWFuYWdlYWJpbGl0eSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcDJfcF9tYW5hZ2VhYmlsaXR5KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZQMlBNYW5hZ2VhYmlsaXR5ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Rsdl9QMlBNYW5hZ2VhYmlsaXR5KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZUTFZQMlBNYW5hZ2VhYmlsaXR5ICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluZm9ybWF0aW9uIEVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBFSUQgMiAoMHgwMikgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGNvdW50cnlTdHJbMl07Cit9IHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHI7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9DT05ERU5TRURDT1VOVFJZU1RSICgyKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfQ09OREVOU0VEQ09VTlRSWVNUUl9NSU5fTEVOICgyKQorCisjZGVmaW5lIERPVDExRl9JRV9DT05ERU5TRURDT1VOVFJZU1RSX01BWF9MRU4gKDIpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2NvbmRlbnNlZF9jb3VudHJ5X3N0cigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2NvbmRlbnNlZF9jb3VudHJ5X3N0cigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0NvbmRlbnNlZENvdW50cnlTdHIoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFQ29uZGVuc2VkQ291bnRyeVN0ciAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyICgweDAyKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFR1RLIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDE2X3QgICAgICAgICAgICAgICAga2V5SWQ6MjsKKwl1aW50MTZfdCAgICAgICAgICAgICByZXNlcnZlZDoxNDsKKwl1aW50OF90ICAgICAgICAgICAgIGtleUxlbmd0aDsKKwl1aW50OF90ICAgICAgICAgICAgIFJTQ1s4XTsKKwl1aW50OF90ICAgICAgICAgICAgIG51bV9rZXk7CisJdWludDhfdCAgICAgICAgICAgICBrZXlbMzJdOworfSB0RG90MTFmSUVHVEs7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9HVEsgKDIpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9HVEtfTUlOX0xFTiAoMTYpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0dUS19NQVhfTEVOICg0MykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfZ3RrKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUdUSyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9ndGsoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFR1RLICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0dUSygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVHVEsgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNCAoMHgwNCkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUlHVEsgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGtleUlEWzJdOworCXVpbnQ4X3QgICAgICAgICAgICAgSVBOWzZdOworCXVpbnQ4X3QgICAgICAgICAgICAga2V5TGVuZ3RoOworCXVpbnQ4X3QgICAgICAgICAgICAga2V5WzI0XTsKK30gdERvdDExZklFSUdUSzsKKworI2RlZmluZSBET1QxMUZfRUlEX0lHVEsgKDQpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9JR1RLX01JTl9MRU4gKDMzKQorCisjZGVmaW5lIERPVDExRl9JRV9JR1RLX01BWF9MRU4gKDMzKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9pZ3RrKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUlHVEsqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfaWd0aygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVJR1RLICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0lHVEsoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFSUdUSyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAzICgweDAzKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUjBLSF9JRCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX1BNS19SMF9JRDsKKwl1aW50OF90ICAgICAgICAgICAgIFBNS19SMF9JRFs0OF07Cit9IHREb3QxMWZJRVIwS0hfSUQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9SMEtIX0lEICgzKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUjBLSF9JRF9NSU5fTEVOICgxKQorCisjZGVmaW5lIERPVDExRl9JRV9SMEtIX0lEX01BWF9MRU4gKDQ4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9yMF9raF9pZCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVSMEtIX0lEKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3IwX2toX2lkKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVIwS0hfSUQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfUjBLSF9JRCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVSMEtIX0lEICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDEgKDB4MDEpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVSMUtIX0lEIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBQTUtfUjFfSURbNl07Cit9IHREb3QxMWZJRVIxS0hfSUQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9SMUtIX0lEICgxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUjFLSF9JRF9NSU5fTEVOICg2KQorCisjZGVmaW5lIERPVDExRl9JRV9SMUtIX0lEX01BWF9MRU4gKDYpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3IxX2toX2lkKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVIxS0hfSUQqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcjFfa2hfaWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUjFLSF9JRCAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9SMUtIX0lEKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVIxS0hfSUQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMSAoMHgwMSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVRTRkluZm8geworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgICAgIFRzZk9mZnNldDsKKwl1aW50MTZfdCAgICAgICAgICAgIEJlYWNvbkludHZsOworfSB0RG90MTFmSUVUU0ZJbmZvOworCisjZGVmaW5lIERPVDExRl9FSURfVFNGSU5GTyAoMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1RTRklORk9fTUlOX0xFTiAoNCkKKworI2RlZmluZSBET1QxMUZfSUVfVFNGSU5GT19NQVhfTEVOICg0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV90c2ZfaW5mbygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVUU0ZJbmZvKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3RzZl9pbmZvKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVRTRkluZm8gKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfVFNGSW5mbygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVUU0ZJbmZvICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDUxICgweDMzKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQVBDaGFubmVsUmVwb3J0IHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICByZWd1bGF0b3J5Q2xhc3M7CisJdWludDhfdCAgICAgICAgICAgICBudW1fY2hhbm5lbExpc3Q7CisJdWludDhfdCAgICAgICAgICAgICBjaGFubmVsTGlzdFs1MF07Cit9IHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydDsKKworI2RlZmluZSBET1QxMUZfRUlEX0FQQ0hBTk5FTFJFUE9SVCAoNTEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9BUENIQU5ORUxSRVBPUlRfTUlOX0xFTiAoMSkKKworI2RlZmluZSBET1QxMUZfSUVfQVBDSEFOTkVMUkVQT1JUX01BWF9MRU4gKDUxKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9hcF9jaGFubmVsX3JlcG9ydCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfYXBfY2hhbm5lbF9yZXBvcnQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFQVBDaGFubmVsUmVwb3J0ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0FQQ2hhbm5lbFJlcG9ydCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMiAoMHgwMikgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUJjblJlcG9ydGluZ0RldGFpbCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgcmVwb3J0aW5nRGV0YWlsOworfSB0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWw7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9CQ05SRVBPUlRJTkdERVRBSUwgKDIpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9CQ05SRVBPUlRJTkdERVRBSUxfTUlOX0xFTiAoMSkKKworI2RlZmluZSBET1QxMUZfSUVfQkNOUkVQT1JUSU5HREVUQUlMX01BWF9MRU4gKDEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2Jjbl9yZXBvcnRpbmdfZGV0YWlsKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUJjblJlcG9ydGluZ0RldGFpbCopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9iY25fcmVwb3J0aW5nX2RldGFpbCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWwgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfQmNuUmVwb3J0aW5nRGV0YWlsKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUJjblJlcG9ydGluZ0RldGFpbCAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxICgweDAxKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX3JlcG9ydGVkRmllbGRzOworCXVpbnQ4X3QgICAgICAgICAgICAgcmVwb3J0ZWRGaWVsZHNbMjI0XTsKK30gdERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keTsKKworI2RlZmluZSBET1QxMUZfRUlEX0JFQUNPTlJFUE9SVEZSTUJPRFkgKDEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9CRUFDT05SRVBPUlRGUk1CT0RZX01JTl9MRU4gKDApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0JFQUNPTlJFUE9SVEZSTUJPRFlfTUFYX0xFTiAoMjI0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9iZWFjb25fcmVwb3J0X2ZybV9ib2R5KAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUJlYWNvblJlcG9ydEZybUJvZHkqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfYmVhY29uX3JlcG9ydF9mcm1fYm9keSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0JlYWNvblJlcG9ydEZybUJvZHkoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxICgweDAxKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQmVhY29uUmVwb3J0aW5nIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICByZXBvcnRpbmdDb25kaXRpb247CisJdWludDhfdCAgICAgICAgICAgICB0aHJlc2hvbGQ7Cit9IHREb3QxMWZJRUJlYWNvblJlcG9ydGluZzsKKworI2RlZmluZSBET1QxMUZfRUlEX0JFQUNPTlJFUE9SVElORyAoMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX0JFQUNPTlJFUE9SVElOR19NSU5fTEVOICgyKQorCisjZGVmaW5lIERPVDExRl9JRV9CRUFDT05SRVBPUlRJTkdfTUFYX0xFTiAoMikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfYmVhY29uX3JlcG9ydGluZygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVCZWFjb25SZXBvcnRpbmcqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfYmVhY29uX3JlcG9ydGluZygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVCZWFjb25SZXBvcnRpbmcgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfQmVhY29uUmVwb3J0aW5nKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUJlYWNvblJlcG9ydGluZyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA2NiAoMHg0MikgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG1lYXN1cmVtZW50UGlsb3Q7CisJdWludDhfdCAgICAgICAgICAgICBudW1fdmVuZG9yU3BlY2lmaWM7CisJdWludDhfdCAgICAgICAgICAgICB2ZW5kb3JTcGVjaWZpY1syNTVdOworfSB0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90OworCisjZGVmaW5lIERPVDExRl9FSURfTUVBU1VSRU1FTlRQSUxPVCAoNjYpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9NRUFTVVJFTUVOVFBJTE9UX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX0lFX01FQVNVUkVNRU5UUElMT1RfTUFYX0xFTiAoMjU2KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9tZWFzdXJlbWVudF9waWxvdCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90Kik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX21lYXN1cmVtZW50X3BpbG90KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfTWVhc3VyZW1lbnRQaWxvdCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90ICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDcxICgweDQ3KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFTXVsdGlCc3NpZCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbWF4QlNTSURJbmRpY2F0b3I7CisJdWludDhfdCAgICAgICAgICAgICBudW1fdmVuZG9yU3BlY2lmaWM7CisJdWludDhfdCAgICAgICAgICAgICB2ZW5kb3JTcGVjaWZpY1syNTVdOworfSB0RG90MTFmSUVNdWx0aUJzc2lkOworCisjZGVmaW5lIERPVDExRl9FSURfTVVMVElCU1NJRCAoNzEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9NVUxUSUJTU0lEX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX0lFX01VTFRJQlNTSURfTUFYX0xFTiAoMjU2KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9tdWx0aV9ic3NpZCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVNdWx0aUJzc2lkKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX211bHRpX2Jzc2lkKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRU11bHRpQnNzaWQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfTXVsdGlCc3NpZCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVNdWx0aUJzc2lkICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDU3ICgweDM5KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUklDRGF0YSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgSWRlbnRpZmllcjsKKwl1aW50OF90ICAgICAgICAgICAgIHJlc291cmNlRGVzY0NvdW50OworCXVpbnQxNl90ICAgICAgICAgICAgc3RhdHVzQ29kZTsKK30gdERvdDExZklFUklDRGF0YTsKKworI2RlZmluZSBET1QxMUZfRUlEX1JJQ0RBVEEgKDU3KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUklDREFUQV9NSU5fTEVOICg0KQorCisjZGVmaW5lIERPVDExRl9JRV9SSUNEQVRBX01BWF9MRU4gKDQpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3JpY19kYXRhKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVJJQ0RhdGEqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcmljX2RhdGEoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUklDRGF0YSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9SSUNEYXRhKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVJJQ0RhdGEgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNzUgKDB4NGIpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVSSUNEZXNjcmlwdG9yIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICByZXNvdXJjZVR5cGU7CisJdWludDhfdCAgICAgICAgICAgICBudW1fdmFyaWFibGVEYXRhOworCXVpbnQ4X3QgICAgICAgICAgICAgdmFyaWFibGVEYXRhWzI1NV07Cit9IHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3I7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9SSUNERVNDUklQVE9SICg3NSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1JJQ0RFU0NSSVBUT1JfTUlOX0xFTiAoMSkKKworI2RlZmluZSBET1QxMUZfSUVfUklDREVTQ1JJUFRPUl9NQVhfTEVOICgyNTYpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3JpY19kZXNjcmlwdG9yKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcmljX2Rlc2NyaXB0b3IoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUklDRGVzY3JpcHRvciAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9SSUNEZXNjcmlwdG9yKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNzAgKDB4NDYpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVSUk1FbmFibGVkQ2FwIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgIExpbmtNZWFzdXJlbWVudDoxOworCXVpbnQ4X3QgICAgICAgICAgTmVpZ2hib3JScHQ6MTsKKwl1aW50OF90ICAgICAgICAgICAgIHBhcmFsbGVsOjE7CisJdWludDhfdCAgICAgICAgICAgICByZXBlYXRlZDoxOworCXVpbnQ4X3QgICAgICAgIEJlYWNvblBhc3NpdmU6MTsKKwl1aW50OF90ICAgICAgICAgQmVhY29uQWN0aXZlOjE7CisJdWludDhfdCAgICAgICAgICBCZWFjb25UYWJsZToxOworCXVpbnQ4X3QgICAgICAgIEJlYWNvblJlcENvbmQ6MTsKKwl1aW50OF90ICAgICBGcmFtZU1lYXN1cmVtZW50OjE7CisJdWludDhfdCAgICAgICAgICBDaGFubmVsTG9hZDoxOworCXVpbnQ4X3QgICAgICAgTm9pc2VIaXN0b2dyYW06MTsKKwl1aW50OF90ICAgICAgICAgICBzdGF0aXN0aWNzOjE7CisJdWludDhfdCAgICAgICBMQ0lNZWFzdXJlbWVudDoxOworCXVpbnQ4X3QgICAgICAgICAgIExDSUF6aW11dGg6MTsKKwl1aW50OF90ICAgICAgICBUQ01DYXBhYmlsaXR5OjE7CisJdWludDhfdCAgICAgICAgIHRyaWdnZXJlZFRDTToxOworCXVpbnQ4X3QgICAgICAgICBBUENoYW5SZXBvcnQ6MTsKKwl1aW50OF90ICAgICAgICBSUk1NSUJFbmFibGVkOjE7CisJdWludDhfdCAgICAgb3BlcmF0aW5nQ2hhbk1heDozOworCXVpbnQ4X3QgICBub25PcGVyYXRpbkNoYW5NYXg6MzsKKwl1aW50OF90ICAgICBNZWFzdXJlbWVudFBpbG90OjM7CisJdWludDhfdCBNZWFzdXJlbWVudFBpbG90RW5hYmxlZDoxOworCXVpbnQ4X3QgICAgTmVpZ2hib3JUU0ZPZmZzZXQ6MTsKKwl1aW50OF90ICAgICAgUkNQSU1lYXN1cmVtZW50OjE7CisJdWludDhfdCAgICAgIFJTTklNZWFzdXJlbWVudDoxOworCXVpbnQ4X3QgICAgQnNzQXZnQWNjZXNzRGVsYXk6MTsKKwl1aW50OF90ICAgIEJTU0F2YWlsQWRtaXNzaW9uOjE7CisJdWludDhfdCAgIEFudGVubmFJbmZvcm1hdGlvbjoxOworCXVpbnQ4X3QgICBmaW5lX3RpbWVfbWVhc19ycHQ6MTsKKwl1aW50OF90ICAgICAgIGxjaV9jYXBhYmlsaXR5OjE7CisJdWludDhfdCAgICAgICAgICAgICByZXNlcnZlZDo0OworfSB0RG90MTFmSUVSUk1FbmFibGVkQ2FwOworCisjZGVmaW5lIERPVDExRl9FSURfUlJNRU5BQkxFRENBUCAoNzApCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9SUk1FTkFCTEVEQ0FQX01JTl9MRU4gKDUpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1JSTUVOQUJMRURDQVBfTUFYX0xFTiAoNSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcnJtX2VuYWJsZWRfY2FwKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVJSTUVuYWJsZWRDYXAqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcnJtX2VuYWJsZWRfY2FwKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVJSTUVuYWJsZWRDYXAgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfUlJNRW5hYmxlZENhcCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVSUk1FbmFibGVkQ2FwICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDEwICgweDBhKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUmVxdWVzdGVkSW5mbyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX3JlcXVlc3RlZF9laWRzOworCXVpbnQ4X3QgICAgICAgICAgICAgcmVxdWVzdGVkX2VpZHNbMjU1XTsKK30gdERvdDExZklFUmVxdWVzdGVkSW5mbzsKKworI2RlZmluZSBET1QxMUZfRUlEX1JFUVVFU1RFRElORk8gKDEwKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUkVRVUVTVEVESU5GT19NSU5fTEVOICgwKQorCisjZGVmaW5lIERPVDExRl9JRV9SRVFVRVNURURJTkZPX01BWF9MRU4gKDI1NSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcmVxdWVzdGVkX2luZm8oCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFUmVxdWVzdGVkSW5mbyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9yZXF1ZXN0ZWRfaW5mbygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVSZXF1ZXN0ZWRJbmZvICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1JlcXVlc3RlZEluZm8oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUmVxdWVzdGVkSW5mbyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAwICgweDAwKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFU1NJRCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX3NzaWQ7CisJdWludDhfdCAgICAgICAgICAgICBzc2lkWzMyXTsKK30gdERvdDExZklFU1NJRDsKKworI2RlZmluZSBET1QxMUZfRUlEX1NTSUQgKDApCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9TU0lEX01JTl9MRU4gKDApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1NTSURfTUFYX0xFTiAoMzIpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3NzaWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFU1NJRCopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9zc2lkKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVNTSUQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfU1NJRCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVTU0lEICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDE1ICgweDBmKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFU2NoZWR1bGUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgICBhZ2dyZWdhdGlvbjoxOworCXVpbnQxNl90ICAgICAgICAgICAgICAgICB0c2lkOjQ7CisJdWludDE2X3QgICAgICAgICAgICBkaXJlY3Rpb246MjsKKwl1aW50MTZfdCAgICAgICAgICAgICByZXNlcnZlZDo5OworCXVpbnQzMl90ICAgICAgICAgICAgc2VydmljZV9zdGFydF90aW1lOworCXVpbnQzMl90ICAgICAgICAgICAgc2VydmljZV9pbnRlcnZhbDsKKwl1aW50MTZfdCAgICAgICAgICAgIG1heF9zZXJ2aWNlX2R1cjsKKwl1aW50MTZfdCAgICAgICAgICAgIHNwZWNfaW50ZXJ2YWw7Cit9IHREb3QxMWZJRVNjaGVkdWxlOworCisjZGVmaW5lIERPVDExRl9FSURfU0NIRURVTEUgKDE1KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfU0NIRURVTEVfTUlOX0xFTiAoMTQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1NDSEVEVUxFX01BWF9MRU4gKDE0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9zY2hlZHVsZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVTY2hlZHVsZSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9zY2hlZHVsZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVTY2hlZHVsZSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9TY2hlZHVsZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVTY2hlZHVsZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxNCAoMHgwZSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVRDTEFTIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICB1c2VyX3ByaW9yaXR5OworCXVpbnQ4X3QgICAgICAgICAgICAgY2xhc3NpZmllcl90eXBlOworCXVpbnQ4X3QgICAgICAgICAgICAgY2xhc3NpZmllcl9tYXNrOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3Qgc291cmNlWzZdOworCQkJdWludDhfdCBkZXN0WzZdOworCQkJdWludDE2X3QgdHlwZTsKKwkJfSBFdGhQYXJhbXM7IC8qIGNsYXNzaWZpZXJfdHlwZSA9IDAgKi8KKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgdmVyc2lvbjsKKwkJCXVuaW9uIHsKKwkJCQlzdHJ1Y3QgeworCQkJCQl1aW50OF90IHNvdXJjZVs0XTsKKwkJCQkJdWludDhfdCBkZXN0WzRdOworCQkJCQl1aW50MTZfdCBzcmNfcG9ydDsKKwkJCQkJdWludDE2X3QgZGVzdF9wb3J0OworCQkJCQl1aW50OF90IERTQ1A7CisJCQkJCXVpbnQ4X3QgcHJvdG87CisJCQkJCXVpbnQ4X3QgcmVzZXJ2ZWQ7CisJCQkJfSBJcFY0UGFyYW1zOyAvKiB2ZXJzaW9uID0gNCAqLworCQkJCXN0cnVjdCB7CisJCQkJCXVpbnQ4X3Qgc291cmNlWzE2XTsKKwkJCQkJdWludDhfdCBkZXN0WzE2XTsKKwkJCQkJdWludDE2X3Qgc3JjX3BvcnQ7CisJCQkJCXVpbnQxNl90IGRlc3RfcG9ydDsKKwkJCQkJdWludDhfdCBmbG93X2xhYmVsWzNdOworCQkJCX0gSXBWNlBhcmFtczsgLyogdmVyc2lvbiA9IDYgKi8KKwkJCX0gcGFyYW1zOworCQl9IElwUGFyYW1zOyAvKiBjbGFzc2lmaWVyX3R5cGUgPSAxICovCisJCXN0cnVjdCB7CisJCQl1aW50MTZfdCB0YWdfdHlwZTsKKwkJfSBQYXJhbXM4MDIxZHE7IC8qIGNsYXNzaWZpZXJfdHlwZSA9IDIgKi8KKwl9IGluZm87Cit9IHREb3QxMWZJRVRDTEFTOworCisjZGVmaW5lIERPVDExRl9FSURfVENMQVMgKDE0KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfVENMQVNfTUlOX0xFTiAoNSkKKworI2RlZmluZSBET1QxMUZfSUVfVENMQVNfTUFYX0xFTiAoNDMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3RjbGFzKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVRDTEFTKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3RjbGFzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVRDTEFTICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2lldGNsYXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVENMQVMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNDQgKDB4MmMpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVUQ0xBU1NQUk9DIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBwcm9jZXNzaW5nOworfSB0RG90MTFmSUVUQ0xBU1NQUk9DOworCisjZGVmaW5lIERPVDExRl9FSURfVENMQVNTUFJPQyAoNDQpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9UQ0xBU1NQUk9DX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1RDTEFTU1BST0NfTUFYX0xFTiAoMSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdGNsYXNTUFJPQygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVUQ0xBU1NQUk9DKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3RjbGFzc3Byb2MoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVENMQVNTUFJPQyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXRjbGFzU1BST0MoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVENMQVNTUFJPQyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA0MyAoMHgyYikgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVRTRGVsYXkgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MzJfdCAgICAgICAgICAgIGRlbGF5OworfSB0RG90MTFmSUVUU0RlbGF5OworCisjZGVmaW5lIERPVDExRl9FSURfVFNERUxBWSAoNDMpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9UU0RFTEFZX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1RTREVMQVlfTUFYX0xFTiAoNCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdHNfZGVsYXkoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFVFNEZWxheSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV90c19kZWxheSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVUU0RlbGF5ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1RTRGVsYXkoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVFNEZWxheSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxMyAoMHgwZCkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVRTUEVDIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDE2X3QgICAgICAgICB0cmFmZmljX3R5cGU6MTsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgdHNpZDo0OworCXVpbnQxNl90ICAgICAgICAgICAgZGlyZWN0aW9uOjI7CisJdWludDE2X3QgICAgICAgIGFjY2Vzc19wb2xpY3k6MjsKKwl1aW50MTZfdCAgICAgICAgICBhZ2dyZWdhdGlvbjoxOworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcHNiOjE7CisJdWludDE2X3QgICAgICAgIHVzZXJfcHJpb3JpdHk6MzsKKwl1aW50MTZfdCAgICAgICB0c2luZm9fYWNrX3BvbDoyOworCXVpbnQ4X3QgICAgICAgICAgICAgc2NoZWR1bGU6MTsKKwl1aW50OF90ICAgICAgICAgICAgICAgdW51c2VkOjc7CisJdWludDE2X3QgICAgICAgICAgICAgICAgIHNpemU6MTU7CisJdWludDE2X3QgICAgICAgICAgICAgICAgZml4ZWQ6MTsKKwl1aW50MTZfdCAgICAgICAgICAgIG1heF9tc2R1X3NpemU7CisJdWludDMyX3QgICAgICAgICAgICBtaW5fc2VydmljZV9pbnQ7CisJdWludDMyX3QgICAgICAgICAgICBtYXhfc2VydmljZV9pbnQ7CisJdWludDMyX3QgICAgICAgICAgICBpbmFjdGl2aXR5X2ludDsKKwl1aW50MzJfdCAgICAgICAgICAgIHN1c3BlbnNpb25faW50OworCXVpbnQzMl90ICAgICAgICAgICAgc2VydmljZV9zdGFydF90aW1lOworCXVpbnQzMl90ICAgICAgICAgICAgbWluX2RhdGFfcmF0ZTsKKwl1aW50MzJfdCAgICAgICAgICAgIG1lYW5fZGF0YV9yYXRlOworCXVpbnQzMl90ICAgICAgICAgICAgcGVha19kYXRhX3JhdGU7CisJdWludDMyX3QgICAgICAgICAgICBidXJzdF9zaXplOworCXVpbnQzMl90ICAgICAgICAgICAgZGVsYXlfYm91bmQ7CisJdWludDMyX3QgICAgICAgICAgICBtaW5fcGh5X3JhdGU7CisJdWludDE2X3QgICAgICAgICAgICBzdXJwbHVzX2J3X2FsbG93YW5jZTsKKwl1aW50MTZfdCAgICAgICAgICAgIG1lZGl1bV90aW1lOworfSB0RG90MTFmSUVUU1BFQzsKKworI2RlZmluZSBET1QxMUZfRUlEX1RTUEVDICgxMykKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1RTUEVDX01JTl9MRU4gKDU1KQorCisjZGVmaW5lIERPVDExRl9JRV9UU1BFQ19NQVhfTEVOICg1NSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdHNwZWMoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFVFNQRUMqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfdHNwZWMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVFNQRUMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfVFNQRUMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVFNQRUMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMTkxICgweGJmKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFVkhUQ2FwcyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQzMl90ICAgICAgICAgICBtYXhNUERVTGVuOjI7CisJdWludDMyX3Qgc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OjI7CisJdWludDMyX3QgICAgICAgIGxkcGNDb2RpbmdDYXA6MTsKKwl1aW50MzJfdCAgICAgICAgIHNob3J0R0k4ME1IejoxOworCXVpbnQzMl90IHNob3J0R0kxNjBhbmQ4MHBsdXM4ME1IejoxOworCXVpbnQzMl90ICAgICAgICAgICAgICAgdHhTVEJDOjE7CisJdWludDMyX3QgICAgICAgICAgICAgICByeFNUQkM6MzsKKwl1aW50MzJfdCAgICAgIHN1QmVhbUZvcm1lckNhcDoxOworCXVpbnQzMl90ICAgICAgc3VCZWFtZm9ybWVlQ2FwOjE7CisJdWludDMyX3QgY3Nub2ZCZWFtZm9ybWVyQW50U3VwOjM7CisJdWludDMyX3QgICAgICAgbnVtU291bmRpbmdEaW06MzsKKwl1aW50MzJfdCAgICAgIG11QmVhbWZvcm1lckNhcDoxOworCXVpbnQzMl90ICAgICAgbXVCZWFtZm9ybWVlQ2FwOjE7CisJdWludDMyX3QgICAgICAgICAgICB2aHRUWE9QUFM6MTsKKwl1aW50MzJfdCAgICAgICAgICAgIGh0Y1ZIVENhcDoxOworCXVpbnQzMl90ICAgICAgIG1heEFNUERVTGVuRXhwOjM7CisJdWludDMyX3QgICAgICB2aHRMaW5rQWRhcHRDYXA6MjsKKwl1aW50MzJfdCAgICAgICAgIHJ4QW50UGF0dGVybjoxOworCXVpbnQzMl90ICAgICAgICAgdHhBbnRQYXR0ZXJuOjE7CisJdWludDMyX3QgICAgICAgICAgICByZXNlcnZlZDE6MjsKKwl1aW50MTZfdCAgICAgICAgICAgIHJ4TUNTTWFwOworCXVpbnQxNl90ICAgIHJ4SGlnaFN1cERhdGFSYXRlOjEzOworCXVpbnQxNl90ICAgICAgICAgICAgcmVzZXJ2ZWQyOjM7CisJdWludDE2X3QgICAgICAgICAgICB0eE1DU01hcDsKKwl1aW50MTZfdCAgICAgICAgdHhTdXBEYXRhUmF0ZToxMzsKKwl1aW50MTZfdCAgICAgICAgICAgIHJlc2VydmVkMzozOworfSB0RG90MTFmSUVWSFRDYXBzOworCisjZGVmaW5lIERPVDExRl9FSURfVkhUQ0FQUyAoMTkxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfVkhUQ0FQU19NSU5fTEVOICgxMikKKworI2RlZmluZSBET1QxMUZfSUVfVkhUQ0FQU19NQVhfTEVOICgxMikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdmh0X2NhcHMoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFVkhUQ2FwcyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV92aHRfY2FwcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVWSFRDYXBzICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1ZIVENhcHMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVkhUQ2FwcyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxOTIgKDB4YzApICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVWSFRPcGVyYXRpb24geworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGNoYW5XaWR0aDsKKwl1aW50OF90ICAgICAgICAgICAgIGNoYW5DZW50ZXJGcmVxU2VnMTsKKwl1aW50OF90ICAgICAgICAgICAgIGNoYW5DZW50ZXJGcmVxU2VnMjsKKwl1aW50MTZfdCAgICAgICAgICAgIGJhc2ljTUNTU2V0OworfSB0RG90MTFmSUVWSFRPcGVyYXRpb247CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9WSFRPUEVSQVRJT04gKDE5MikKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1ZIVE9QRVJBVElPTl9NSU5fTEVOICg1KQorCisjZGVmaW5lIERPVDExRl9JRV9WSFRPUEVSQVRJT05fTUFYX0xFTiAoNSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdmh0X29wZXJhdGlvbigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVWSFRPcGVyYXRpb24qKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfdmh0X29wZXJhdGlvbigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVWSFRPcGVyYXRpb24gKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfVkhUT3BlcmF0aW9uKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVZIVE9wZXJhdGlvbiAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwOX0gKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdNTVNjaGVkdWxlIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICB2ZXJzaW9uIC8qIE11c3QgYmUgMSEgKi87CisJdWludDE2X3QgICAgICAgICAgYWdncmVnYXRpb246MTsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgdHNpZDo0OworCXVpbnQxNl90ICAgICAgICAgICAgZGlyZWN0aW9uOjI7CisJdWludDE2X3QgICAgICAgICAgICAgcmVzZXJ2ZWQ6OTsKKwl1aW50MzJfdCAgICAgICAgICAgIHNlcnZpY2Vfc3RhcnRfdGltZTsKKwl1aW50MzJfdCAgICAgICAgICAgIHNlcnZpY2VfaW50ZXJ2YWw7CisJdWludDE2X3QgICAgICAgICAgICBtYXhfc2VydmljZV9kdXI7CisJdWludDE2X3QgICAgICAgICAgICBzcGVjX2ludGVydmFsOworfSB0RG90MTFmSUVXTU1TY2hlZHVsZTsKKworI2RlZmluZSBET1QxMUZfRUlEX1dNTVNDSEVEVUxFICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9XTU1TQ0hFRFVMRV9NSU5fTEVOICgyMCkKKworI2RlZmluZSBET1QxMUZfSUVfV01NU0NIRURVTEVfTUFYX0xFTiAoMjApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dtbV9zY2hlZHVsZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVXTU1TY2hlZHVsZSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93bW1fc2NoZWR1bGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV01NU2NoZWR1bGUgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfV01NU2NoZWR1bGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV01NU2NoZWR1bGUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDZ9ICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXTU1UQ0xBUyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgdmVyc2lvbiAvKiBNdXN0IGJlIDEhICovOworCXVpbnQ4X3QgICAgICAgICAgICAgdXNlcl9wcmlvcml0eTsKKwl1aW50OF90ICAgICAgICAgICAgIGNsYXNzaWZpZXJfdHlwZTsKKwl1aW50OF90ICAgICAgICAgICAgIGNsYXNzaWZpZXJfbWFzazsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IHNvdXJjZVs2XTsKKwkJCXVpbnQ4X3QgZGVzdFs2XTsKKwkJCXVpbnQxNl90IHR5cGU7CisJCX0gRXRoUGFyYW1zOyAvKiBjbGFzc2lmaWVyX3R5cGUgPSAwICovCisJCXN0cnVjdCB7CisJCQl1aW50OF90IHZlcnNpb247CisJCQl1bmlvbiB7CisJCQkJc3RydWN0IHsKKwkJCQkJdWludDhfdCBzb3VyY2VbNF07CisJCQkJCXVpbnQ4X3QgZGVzdFs0XTsKKwkJCQkJdWludDE2X3Qgc3JjX3BvcnQ7CisJCQkJCXVpbnQxNl90IGRlc3RfcG9ydDsKKwkJCQkJdWludDhfdCBEU0NQOworCQkJCQl1aW50OF90IHByb3RvOworCQkJCQl1aW50OF90IHJlc2VydmVkOworCQkJCX0gSXBWNFBhcmFtczsgLyogdmVyc2lvbiA9IDQgKi8KKwkJCQlzdHJ1Y3QgeworCQkJCQl1aW50OF90IHNvdXJjZVsxNl07CisJCQkJCXVpbnQ4X3QgZGVzdFsxNl07CisJCQkJCXVpbnQxNl90IHNyY19wb3J0OworCQkJCQl1aW50MTZfdCBkZXN0X3BvcnQ7CisJCQkJCXVpbnQ4X3QgZmxvd19sYWJlbFszXTsKKwkJCQl9IElwVjZQYXJhbXM7IC8qIHZlcnNpb24gPSA2ICovCisJCQl9IHBhcmFtczsKKwkJfSBJcFBhcmFtczsgLyogY2xhc3NpZmllcl90eXBlID0gMSAqLworCQlzdHJ1Y3QgeworCQkJdWludDE2X3QgdGFnX3R5cGU7CisJCX0gUGFyYW1zODAyMWRxOyAvKiBjbGFzc2lmaWVyX3R5cGUgPSAyICovCisJfSBpbmZvOworfSB0RG90MTFmSUVXTU1UQ0xBUzsKKworI2RlZmluZSBET1QxMUZfRUlEX1dNTVRDTEFTICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9XTU1UQ0xBU19NSU5fTEVOICgxMSkKKworI2RlZmluZSBET1QxMUZfSUVfV01NVENMQVNfTUFYX0xFTiAoNDkpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dtbXRjbGFzKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVdNTVRDTEFTKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dtbXRjbGFzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdNTVRDTEFTICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2lld21tdGNsYXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV01NVENMQVMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDd9ICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXTU1UQ0xBU1BST0MgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHZlcnNpb24gLyogTXVzdCBiZSAxISAqLzsKKwl1aW50OF90ICAgICAgICAgICAgIHByb2Nlc3Npbmc7Cit9IHREb3QxMWZJRVdNTVRDTEFTUFJPQzsKKworI2RlZmluZSBET1QxMUZfRUlEX1dNTVRDTEFTUFJPQyAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfV01NVENMQVNQUk9DX01JTl9MRU4gKDcpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dNTVRDTEFTUFJPQ19NQVhfTEVOICg3KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93bW10Y2xhc3Byb2MoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFV01NVENMQVNQUk9DKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dtbXRjbGFzcHJvYygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXTU1UQ0xBU1BST0MgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWV3bW10Y2xhc1BST0MoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV01NVENMQVNQUk9DICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDA4fSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV01NVFNEZWxheSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgdmVyc2lvbiAvKiBNdXN0IGJlIDEhICovOworCXVpbnQzMl90ICAgICAgICAgICAgZGVsYXk7Cit9IHREb3QxMWZJRVdNTVRTRGVsYXk7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XTU1UU0RFTEFZICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9XTU1UU0RFTEFZX01JTl9MRU4gKDEwKQorCisjZGVmaW5lIERPVDExRl9JRV9XTU1UU0RFTEFZX01BWF9MRU4gKDEwKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93bW10c19kZWxheSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVXTU1UU0RlbGF5Kik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dtbXRzX2RlbGF5KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdNTVRTRGVsYXkgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfV01NVFNEZWxheSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXTU1UU0RlbGF5ICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAyfSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV01NVFNQRUMgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHZlcnNpb24gLyogTXVzdCBiZSAxISAqLzsKKwl1aW50MTZfdCAgICAgICAgIHRyYWZmaWNfdHlwZToxOworCXVpbnQxNl90ICAgICAgICAgICAgICAgICB0c2lkOjQ7CisJdWludDE2X3QgICAgICAgICAgICBkaXJlY3Rpb246MjsKKwl1aW50MTZfdCAgICAgICAgYWNjZXNzX3BvbGljeToyOworCXVpbnQxNl90ICAgICAgICAgIGFnZ3JlZ2F0aW9uOjE7CisJdWludDE2X3QgICAgICAgICAgICAgICAgICBwc2I6MTsKKwl1aW50MTZfdCAgICAgICAgdXNlcl9wcmlvcml0eTozOworCXVpbnQxNl90ICAgICAgIHRzaW5mb19hY2tfcG9sOjI7CisJdWludDhfdCAgICAgICAgICB0c2luZm9fcnN2ZDo3OworCXVpbnQ4X3QgICAgICBidXJzdF9zaXplX2RlZm46MTsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgc2l6ZToxNTsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICBmaXhlZDoxOworCXVpbnQxNl90ICAgICAgICAgICAgbWF4X21zZHVfc2l6ZTsKKwl1aW50MzJfdCAgICAgICAgICAgIG1pbl9zZXJ2aWNlX2ludDsKKwl1aW50MzJfdCAgICAgICAgICAgIG1heF9zZXJ2aWNlX2ludDsKKwl1aW50MzJfdCAgICAgICAgICAgIGluYWN0aXZpdHlfaW50OworCXVpbnQzMl90ICAgICAgICAgICAgc3VzcGVuc2lvbl9pbnQ7CisJdWludDMyX3QgICAgICAgICAgICBzZXJ2aWNlX3N0YXJ0X3RpbWU7CisJdWludDMyX3QgICAgICAgICAgICBtaW5fZGF0YV9yYXRlOworCXVpbnQzMl90ICAgICAgICAgICAgbWVhbl9kYXRhX3JhdGU7CisJdWludDMyX3QgICAgICAgICAgICBwZWFrX2RhdGFfcmF0ZTsKKwl1aW50MzJfdCAgICAgICAgICAgIGJ1cnN0X3NpemU7CisJdWludDMyX3QgICAgICAgICAgICBkZWxheV9ib3VuZDsKKwl1aW50MzJfdCAgICAgICAgICAgIG1pbl9waHlfcmF0ZTsKKwl1aW50MTZfdCAgICAgICAgICAgIHN1cnBsdXNfYndfYWxsb3dhbmNlOworCXVpbnQxNl90ICAgICAgICAgICAgbWVkaXVtX3RpbWU7Cit9IHREb3QxMWZJRVdNTVRTUEVDOworCisjZGVmaW5lIERPVDExRl9FSURfV01NVFNQRUMgKDIyMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1dNTVRTUEVDX01JTl9MRU4gKDYxKQorCisjZGVmaW5lIERPVDExRl9JRV9XTU1UU1BFQ19NQVhfTEVOICg2MSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd21tdHNwZWMoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFV01NVFNQRUMqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd21tdHNwZWMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV01NVFNQRUMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfV01NVFNQRUMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV01NVFNQRUMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMTk0ICgweGMyKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4geworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG5ld0NoYW5XaWR0aDsKKwl1aW50OF90ICAgICAgICAgICAgIG5ld0NlbnRlckNoYW5GcmVxMDsKKwl1aW50OF90ICAgICAgICAgICAgIG5ld0NlbnRlckNoYW5GcmVxMTsKK30gdERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm47CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XSURFUkJXQ0hBTlNXSVRDSEFOTiAoMTk0KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfV0lERVJCV0NIQU5TV0lUQ0hBTk5fTUlOX0xFTiAoMykKKworI2RlZmluZSBET1QxMUZfSUVfV0lERVJCV0NIQU5TV0lUQ0hBTk5fTUFYX0xFTiAoMykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd2lkZXJfYndfY2hhbl9zd2l0Y2hfYW5uKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVdpZGVyQldDaGFuU3dpdGNoQW5uKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dpZGVyX2J3X2NoYW5fc3dpdGNoX2FubigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXaWRlckJXQ2hhblN3aXRjaEFubiAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9XaWRlckJXQ2hhblN3aXRjaEFubigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXaWRlckJXQ2hhblN3aXRjaEFubiAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxOTcgKDB4YzUpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVBSUQgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgICAgIGFzc29jSWQ7Cit9IHREb3QxMWZJRUFJRDsKKworI2RlZmluZSBET1QxMUZfRUlEX0FJRCAoMTk3KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfQUlEX01JTl9MRU4gKDIpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0FJRF9NQVhfTEVOICgyKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9haWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFQUlEKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2FpZCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVBSUQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfQUlEKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUFJRCAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA0ICgweDA0KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQ0ZQYXJhbXMgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGNmcF9jb3VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGNmcF9wZXJpb2Q7CisJdWludDE2X3QgICAgICAgICAgICBjZnBfbWF4ZHVyYXRpb247CisJdWludDE2X3QgICAgICAgICAgICBjZnBfZHVycmVtYWluaW5nOworfSB0RG90MTFmSUVDRlBhcmFtczsKKworI2RlZmluZSBET1QxMUZfRUlEX0NGUEFSQU1TICg0KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfQ0ZQQVJBTVNfTUlOX0xFTiAoNikKKworI2RlZmluZSBET1QxMUZfSUVfQ0ZQQVJBTVNfTUFYX0xFTiAoNikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfY2ZfcGFyYW1zKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUNGUGFyYW1zKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2NmX3BhcmFtcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVDRlBhcmFtcyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9DRlBhcmFtcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVDRlBhcmFtcyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxNiAoMHgxMCkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUNoYWxsZW5nZVRleHQgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG51bV90ZXh0OworCXVpbnQ4X3QgICAgICAgICAgICAgdGV4dFsyNTNdOworfSB0RG90MTFmSUVDaGFsbGVuZ2VUZXh0OworCisjZGVmaW5lIERPVDExRl9FSURfQ0hBTExFTkdFVEVYVCAoMTYpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9DSEFMTEVOR0VURVhUX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0NIQUxMRU5HRVRFWFRfTUFYX0xFTiAoMjUzKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9jaGFsbGVuZ2VfdGV4dCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVDaGFsbGVuZ2VUZXh0Kik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2NoYWxsZW5nZV90ZXh0KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUNoYWxsZW5nZVRleHQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfQ2hhbGxlbmdlVGV4dCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVDaGFsbGVuZ2VUZXh0ICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDM3ICgweDI1KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQ2hhblN3aXRjaEFubiB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgc3dpdGNoTW9kZTsKKwl1aW50OF90ICAgICAgICAgICAgIG5ld0NoYW5uZWw7CisJdWludDhfdCAgICAgICAgICAgICBzd2l0Y2hDb3VudDsKK30gdERvdDExZklFQ2hhblN3aXRjaEFubjsKKworI2RlZmluZSBET1QxMUZfRUlEX0NIQU5TV0lUQ0hBTk4gKDM3KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfQ0hBTlNXSVRDSEFOTl9NSU5fTEVOICgzKQorCisjZGVmaW5lIERPVDExRl9JRV9DSEFOU1dJVENIQU5OX01BWF9MRU4gKDMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2NoYW5fc3dpdGNoX2FubigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVDaGFuU3dpdGNoQW5uKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2NoYW5fc3dpdGNoX2FubigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVDaGFuU3dpdGNoQW5uICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0NoYW5Td2l0Y2hBbm4oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFQ2hhblN3aXRjaEFubiAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxOTYgKDB4YzQpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVDaGFubmVsU3dpdGNoV3JhcHBlciB7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQ7CisJdERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4gICAgICAgIFdpZGVyQldDaGFuU3dpdGNoQW5uOworfSB0RG90MTFmSUVDaGFubmVsU3dpdGNoV3JhcHBlcjsKKworI2RlZmluZSBET1QxMUZfRUlEX0NIQU5ORUxTV0lUQ0hXUkFQUEVSICgxOTYpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9DSEFOTkVMU1dJVENIV1JBUFBFUl9NSU5fTEVOICgwKQorCisjZGVmaW5lIERPVDExRl9JRV9DSEFOTkVMU1dJVENIV1JBUFBFUl9NQVhfTEVOICg1KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9jaGFubmVsX3N3aXRjaF93cmFwcGVyKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUNoYW5uZWxTd2l0Y2hXcmFwcGVyKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2NoYW5uZWxfc3dpdGNoX3dyYXBwZXIoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFQ2hhbm5lbFN3aXRjaFdyYXBwZXIgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfY2hhbm5lbF9zd2l0Y2hfd3JhcHBlcigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVDaGFubmVsU3dpdGNoV3JhcHBlciAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA3ICgweDA3KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQ291bnRyeSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgY291bnRyeVszXTsKKwl1aW50OF90ICAgICAgICAgICAgIG51bV90cmlwbGV0czsKKwl1aW50OF90ICAgICAgICAgICAgIHRyaXBsZXRzWzg0XVszXTsKK30gdERvdDExZklFQ291bnRyeTsKKworI2RlZmluZSBET1QxMUZfRUlEX0NPVU5UUlkgKDcpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9DT1VOVFJZX01JTl9MRU4gKDMpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0NPVU5UUllfTUFYX0xFTiAoMjU1KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9jb3VudHJ5KAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUNvdW50cnkqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfY291bnRyeSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVDb3VudHJ5ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX2NvdW50cnkoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFQ291bnRyeSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAzICgweDAzKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFRFNQYXJhbXMgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGN1cnJfY2hhbm5lbDsKK30gdERvdDExZklFRFNQYXJhbXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9EU1BBUkFNUyAoMykKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX0RTUEFSQU1TX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0RTUEFSQU1TX01BWF9MRU4gKDEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX0RTUGFyYW1zKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRURTUGFyYW1zKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2RzX3BhcmFtcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVEU1BhcmFtcyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9EU1BhcmFtcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVEU1BhcmFtcyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxMiAoMHgwYykgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUVEQ0FQYXJhbVNldCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgcW9zOworCXVpbnQ4X3QgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJdWludDhfdCAgICAgICAgICAgYWNiZV9haWZzbjo0OworCXVpbnQ4X3QgICAgICAgICAgICAgYWNiZV9hY206MTsKKwl1aW50OF90ICAgICAgICAgICAgIGFjYmVfYWNpOjI7CisJdWludDhfdCAgICAgICAgICAgICAgdW51c2VkMToxOworCXVpbnQ4X3QgICAgICAgICAgYWNiZV9hY3dtaW46NDsKKwl1aW50OF90ICAgICAgICAgIGFjYmVfYWN3bWF4OjQ7CisJdWludDE2X3QgICAgICAgICAgICBhY2JlX3R4b3BsaW1pdDsKKwl1aW50OF90ICAgICAgICAgICBhY2JrX2FpZnNuOjQ7CisJdWludDhfdCAgICAgICAgICAgICBhY2JrX2FjbToxOworCXVpbnQ4X3QgICAgICAgICAgICAgYWNia19hY2k6MjsKKwl1aW50OF90ICAgICAgICAgICAgICB1bnVzZWQyOjE7CisJdWludDhfdCAgICAgICAgICBhY2JrX2Fjd21pbjo0OworCXVpbnQ4X3QgICAgICAgICAgYWNia19hY3dtYXg6NDsKKwl1aW50MTZfdCAgICAgICAgICAgIGFjYmtfdHhvcGxpbWl0OworCXVpbnQ4X3QgICAgICAgICAgIGFjdmlfYWlmc246NDsKKwl1aW50OF90ICAgICAgICAgICAgIGFjdmlfYWNtOjE7CisJdWludDhfdCAgICAgICAgICAgICBhY3ZpX2FjaToyOworCXVpbnQ4X3QgICAgICAgICAgICAgIHVudXNlZDM6MTsKKwl1aW50OF90ICAgICAgICAgIGFjdmlfYWN3bWluOjQ7CisJdWludDhfdCAgICAgICAgICBhY3ZpX2Fjd21heDo0OworCXVpbnQxNl90ICAgICAgICAgICAgYWN2aV90eG9wbGltaXQ7CisJdWludDhfdCAgICAgICAgICAgYWN2b19haWZzbjo0OworCXVpbnQ4X3QgICAgICAgICAgICAgYWN2b19hY206MTsKKwl1aW50OF90ICAgICAgICAgICAgIGFjdm9fYWNpOjI7CisJdWludDhfdCAgICAgICAgICAgICAgdW51c2VkNDoxOworCXVpbnQ4X3QgICAgICAgICAgYWN2b19hY3dtaW46NDsKKwl1aW50OF90ICAgICAgICAgIGFjdm9fYWN3bWF4OjQ7CisJdWludDE2X3QgICAgICAgICAgICBhY3ZvX3R4b3BsaW1pdDsKK30gdERvdDExZklFRURDQVBhcmFtU2V0OworCisjZGVmaW5lIERPVDExRl9FSURfRURDQVBBUkFNU0VUICgxMikKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX0VEQ0FQQVJBTVNFVF9NSU5fTEVOICgxOCkKKworI2RlZmluZSBET1QxMUZfSUVfRURDQVBBUkFNU0VUX01BWF9MRU4gKDE4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9lZGNhX3BhcmFtX3NldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVFRENBUGFyYW1TZXQqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZWRjYV9wYXJhbV9zZXQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFRURDQVBhcmFtU2V0ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0VEQ0FQYXJhbVNldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVFRENBUGFyYW1TZXQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNDIgKDB4MmEpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVFUlBJbmZvIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgIG5vbl9lcnBfcHJlc2VudDoxOworCXVpbnQ4X3QgICAgICAgICAgICAgdXNlX3Byb3Q6MTsKKwl1aW50OF90ICAgICAgYmFya2VyX3ByZWFtYmxlOjE7CisJdWludDhfdCAgICAgICAgICAgICAgIHVudXNlZDo1OworfSB0RG90MTFmSUVFUlBJbmZvOworCisjZGVmaW5lIERPVDExRl9FSURfRVJQSU5GTyAoNDIpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9FUlBJTkZPX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0VSUElORk9fTUFYX0xFTiAoMSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfZXJwX2luZm8oCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFRVJQSW5mbyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9lcnBfaW5mbygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVFUlBJbmZvICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0VSUEluZm8oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFRVJQSW5mbyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxNTYgKDB4OWMpIHtPVUkgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMH0gKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUVTRUNja21PcGFxdWUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG51bV9kYXRhOworCXVpbnQ4X3QgICAgICAgICAgICAgZGF0YVsyMF07Cit9IHREb3QxMWZJRUVTRUNja21PcGFxdWU7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9FU0VDQ0tNT1BBUVVFICgxNTYpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9FU0VDQ0tNT1BBUVVFX01JTl9MRU4gKDEwKQorCisjZGVmaW5lIERPVDExRl9JRV9FU0VDQ0tNT1BBUVVFX01BWF9MRU4gKDI0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9lc2VfY2NrbV9vcGFxdWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFRVNFQ2NrbU9wYXF1ZSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9lc2VfY2NrbV9vcGFxdWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFRVNFQ2NrbU9wYXF1ZSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9FU0VDY2ttT3BhcXVlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUVTRUNja21PcGFxdWUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDF9ICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVFU0VSYWRNZ210Q2FwIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBtZ210X3N0YXRlOworCXVpbnQ4X3QgICAgICAgICAgbWJzc2lkX21hc2s6MzsKKwl1aW50OF90ICAgICAgICAgICAgIHJlc2VydmVkOjU7Cit9IHREb3QxMWZJRUVTRVJhZE1nbXRDYXA7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9FU0VSQURNR01UQ0FQICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9FU0VSQURNR01UQ0FQX01JTl9MRU4gKDYpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0VTRVJBRE1HTVRDQVBfTUFYX0xFTiAoNikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfZXNlX3JhZF9tZ210X2NhcCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVFU0VSYWRNZ210Q2FwKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2VzZV9yYWRfbWdtdF9jYXAoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFRVNFUmFkTWdtdENhcCAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9FU0VSYWRNZ210Q2FwKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUVTRVJhZE1nbXRDYXAgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDd9ICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVFU0VUcmFmU3RybU1ldCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgdHNpZDsKKwl1aW50OF90ICAgICAgICAgICAgIHN0YXRlOworCXVpbnQxNl90ICAgICAgICAgICAgbXNtdF9pbnRlcnZhbDsKK30gdERvdDExZklFRVNFVHJhZlN0cm1NZXQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9FU0VUUkFGU1RSTU1FVCAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfRVNFVFJBRlNUUk1NRVRfTUlOX0xFTiAoOCkKKworI2RlZmluZSBET1QxMUZfSUVfRVNFVFJBRlNUUk1NRVRfTUFYX0xFTiAoOCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfZXNlX3RyYWZfc3RybV9tZXQoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFRVNFVHJhZlN0cm1NZXQqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZXNlX3RyYWZfc3RybV9tZXQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFRVNFVHJhZlN0cm1NZXQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfRVNFVHJhZlN0cm1NZXQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFRVNFVHJhZlN0cm1NZXQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDh9ICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVFU0VUcmFmU3RybVJhdGVTZXQgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHRzaWQ7CisJdWludDhfdCAgICAgICAgICAgICBudW1fdHNyYXRlczsKKwl1aW50OF90ICAgICAgICAgICAgIHRzcmF0ZXNbOF07Cit9IHREb3QxMWZJRUVTRVRyYWZTdHJtUmF0ZVNldDsKKworI2RlZmluZSBET1QxMUZfRUlEX0VTRVRSQUZTVFJNUkFURVNFVCAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfRVNFVFJBRlNUUk1SQVRFU0VUX01JTl9MRU4gKDUpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0VTRVRSQUZTVFJNUkFURVNFVF9NQVhfTEVOICgxMykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfZXNlX3RyYWZfc3RybV9yYXRlX3NldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVFU0VUcmFmU3RybVJhdGVTZXQqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZXNlX3RyYWZfc3RybV9yYXRlX3NldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVFU0VUcmFmU3RybVJhdGVTZXQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfRVNFVHJhZlN0cm1SYXRlU2V0KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUVTRVRyYWZTdHJtUmF0ZVNldCAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxNTAgKDB4OTYpIHtPVUkgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMH0gKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUVTRVR4bWl0UG93ZXIgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHBvd2VyX2xpbWl0OworCXVpbnQ4X3QgICAgICAgICAgICAgcmVzZXJ2ZWQ7Cit9IHREb3QxMWZJRUVTRVR4bWl0UG93ZXI7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9FU0VUWE1JVFBPV0VSICgxNTApCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9FU0VUWE1JVFBPV0VSX01JTl9MRU4gKDYpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0VTRVRYTUlUUE9XRVJfTUFYX0xFTiAoNikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfZXNlX3R4bWl0X3Bvd2VyKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUVTRVR4bWl0UG93ZXIqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZXNlX3R4bWl0X3Bvd2VyKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUVTRVR4bWl0UG93ZXIgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfRVNFVHhtaXRQb3dlcigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVFU0VUeG1pdFBvd2VyICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDQwLCAweDk2LCAweDAzfSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFRVNFVmVyc2lvbiB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgdmVyc2lvbjsKK30gdERvdDExZklFRVNFVmVyc2lvbjsKKworI2RlZmluZSBET1QxMUZfRUlEX0VTRVZFUlNJT04gKDIyMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX0VTRVZFUlNJT05fTUlOX0xFTiAoNSkKKworI2RlZmluZSBET1QxMUZfSUVfRVNFVkVSU0lPTl9NQVhfTEVOICg1KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9lc2VfdmVyc2lvbigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVFU0VWZXJzaW9uKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2VzZV92ZXJzaW9uKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUVTRVZlcnNpb24gKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfRVNFVmVyc2lvbigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVFU0VWZXJzaW9uICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDEyNyAoMHg3ZikgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUV4dENhcCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX2J5dGVzOworCXVpbnQ4X3QgICAgICAgICAgICAgYnl0ZXNbOV07Cit9IHREb3QxMWZJRUV4dENhcDsKKworI2RlZmluZSBET1QxMUZfRUlEX0VYVENBUCAoMTI3KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfRVhUQ0FQX01JTl9MRU4gKDgpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0VYVENBUF9NQVhfTEVOICg5KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9leHRfY2FwKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUV4dENhcCopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9leHRfY2FwKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUV4dENhcCAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9FeHRDYXAoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFRXh0Q2FwICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDUwICgweDMyKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFRXh0U3VwcFJhdGVzIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBudW1fcmF0ZXM7CisJdWludDhfdCAgICAgICAgICAgICByYXRlc1sxMl07Cit9IHREb3QxMWZJRUV4dFN1cHBSYXRlczsKKworI2RlZmluZSBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUyAoNTApCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9FWFRTVVBQUkFURVNfTUlOX0xFTiAoMSkKKworI2RlZmluZSBET1QxMUZfSUVfRVhUU1VQUFJBVEVTX01BWF9MRU4gKDEyKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9leHRfc3VwcF9yYXRlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVFeHRTdXBwUmF0ZXMqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZXh0X3N1cHBfcmF0ZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFRXh0U3VwcFJhdGVzICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0V4dFN1cHBSYXRlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMiAoMHgwMikgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUZIUGFyYW1TZXQgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgICAgIGR3ZWxsX3RpbWU7CisJdWludDhfdCAgICAgICAgICAgICBob3Bfc2V0OworCXVpbnQ4X3QgICAgICAgICAgICAgaG9wX3BhdHRlcm47CisJdWludDhfdCAgICAgICAgICAgICBob3BfaW5kZXg7Cit9IHREb3QxMWZJRUZIUGFyYW1TZXQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9GSFBBUkFNU0VUICgyKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfRkhQQVJBTVNFVF9NSU5fTEVOICg1KQorCisjZGVmaW5lIERPVDExRl9JRV9GSFBBUkFNU0VUX01BWF9MRU4gKDUpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2ZoX3BhcmFtX3NldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVGSFBhcmFtU2V0Kik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2ZoX3BhcmFtX3NldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVGSFBhcmFtU2V0ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0ZIUGFyYW1TZXQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFRkhQYXJhbVNldCAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA4ICgweDA4KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFRkhQYXJhbXMgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHJhZGl4OworCXVpbnQ4X3QgICAgICAgICAgICAgbmNoYW5uZWxzOworfSB0RG90MTFmSUVGSFBhcmFtczsKKworI2RlZmluZSBET1QxMUZfRUlEX0ZIUEFSQU1TICg4KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfRkhQQVJBTVNfTUlOX0xFTiAoMikKKworI2RlZmluZSBET1QxMUZfSUVfRkhQQVJBTVNfTUFYX0xFTiAoMikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfZmhfcGFyYW1zKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUZIUGFyYW1zKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2ZoX3BhcmFtcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVGSFBhcmFtcyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9GSFBhcmFtcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVGSFBhcmFtcyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA5ICgweDA5KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFRkhQYXR0VGFibGUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGZsYWc7CisJdWludDhfdCAgICAgICAgICAgICBuc2V0czsKKwl1aW50OF90ICAgICAgICAgICAgIG1vZHVsdXM7CisJdWludDhfdCAgICAgICAgICAgICBvZmZzZXQ7CisJdWludDhfdCAgICAgICAgICAgICBudW1fcmFuZHRhYmxlOworCXVpbnQ4X3QgICAgICAgICAgICAgcmFuZHRhYmxlWzI1MV07Cit9IHREb3QxMWZJRUZIUGF0dFRhYmxlOworCisjZGVmaW5lIERPVDExRl9FSURfRkhQQVRUVEFCTEUgKDkpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9GSFBBVFRUQUJMRV9NSU5fTEVOICg0KQorCisjZGVmaW5lIERPVDExRl9JRV9GSFBBVFRUQUJMRV9NQVhfTEVOICgyNTUpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2ZoX3BhdHRfdGFibGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFRkhQYXR0VGFibGUqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZmhfcGF0dF90YWJsZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVGSFBhdHRUYWJsZSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9GSFBhdHRUYWJsZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVGSFBhdHRUYWJsZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA1NSAoMHgzNykgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUZUSW5mbyB7CisJdWludDhfdCAgICAgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ6ODsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIElFQ291bnQ6ODsKKwl1aW50OF90ICAgICAgICAgICAgICAgICBNSUNbMTZdOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgIEFub25jZVszMl07CisJdWludDhfdCAgICAgICAgICAgICAgICAgU25vbmNlWzMyXTsKKwl0RG90MTFmSUVSMUtIX0lEICAgICAgICBSMUtIX0lEOworCXREb3QxMWZJRUdUSyAgICAgICAgICAgIEdUSzsKKwl0RG90MTFmSUVSMEtIX0lEICAgICAgICBSMEtIX0lEOworCXREb3QxMWZJRUlHVEsgICAgICAgICAgIElHVEs7Cit9IHREb3QxMWZJRUZUSW5mbzsKKworI2RlZmluZSBET1QxMUZfRUlEX0ZUSU5GTyAoNTUpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9GVElORk9fTUlOX0xFTiAoODIpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0ZUSU5GT19NQVhfTEVOICgyMjApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2Z0X2luZm8oCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFRlRJbmZvKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2Z0X2luZm8oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFRlRJbmZvICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llZnRfaW5mbygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVGVEluZm8gKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNDUgKDB4MmQpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVIVENhcHMgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgIGFkdkNvZGluZ0NhcDoxOworCXVpbnQxNl90IHN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDoxOworCXVpbnQxNl90ICAgICAgICBtaW1vUG93ZXJTYXZlOjI7CisJdWludDE2X3QgICAgICAgICAgIGdyZWVuRmllbGQ6MTsKKwl1aW50MTZfdCAgICAgICAgIHNob3J0R0kyME1IejoxOworCXVpbnQxNl90ICAgICAgICAgc2hvcnRHSTQwTUh6OjE7CisJdWludDE2X3QgICAgICAgICAgICAgICB0eFNUQkM6MTsKKwl1aW50MTZfdCAgICAgICAgICAgICAgIHJ4U1RCQzoyOworCXVpbnQxNl90ICAgICAgICAgICAgZGVsYXllZEJBOjE7CisJdWludDE2X3QgICAgIG1heGltYWxBTVNEVXNpemU6MTsKKwl1aW50MTZfdCAgICAgZHNzc0Nja01vZGU0ME1IejoxOworCXVpbnQxNl90ICAgICAgICAgICAgICAgICBwc21wOjE7CisJdWludDE2X3QgICAgIHN0YmNDb250cm9sRnJhbWU6MTsKKwl1aW50MTZfdCAgIGxzaWdUWE9QUHJvdGVjdGlvbjoxOworCXVpbnQ4X3QgICAgIG1heFJ4QU1QRFVGYWN0b3I6MjsKKwl1aW50OF90ICAgICAgICAgIG1wZHVEZW5zaXR5OjM7CisJdWludDhfdCAgICAgICAgICAgIHJlc2VydmVkMTozOworCXVpbnQ4X3QgICAgICAgICAgICAgc3VwcG9ydGVkTUNTU2V0WzE2XTsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHBjbzoxOworCXVpbnQxNl90ICAgICAgIHRyYW5zaXRpb25UaW1lOjI7CisJdWludDE2X3QgICAgICAgICAgICByZXNlcnZlZDI6NTsKKwl1aW50MTZfdCAgICAgICAgICBtY3NGZWVkYmFjazoyOworCXVpbnQxNl90ICAgICAgICAgICAgcmVzZXJ2ZWQzOjY7CisJdWludDMyX3QgICAgICAgICAgICAgICAgIHR4QkY6MTsKKwl1aW50MzJfdCAgcnhTdGFnZ2VyZWRTb3VuZGluZzoxOworCXVpbnQzMl90ICB0eFN0YWdnZXJlZFNvdW5kaW5nOjE7CisJdWludDMyX3QgICAgICAgICAgICAgICAgcnhaTEY6MTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICB0eFpMRjoxOworCXVpbnQzMl90ICAgICAgICAgaW1wbGljaXRUeEJGOjE7CisJdWludDMyX3QgICAgICAgICAgY2FsaWJyYXRpb246MjsKKwl1aW50MzJfdCAgICAgIGV4cGxpY2l0Q1NJVHhCRjoxOworCXVpbnQzMl90IGV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXg6MTsKKwl1aW50MzJfdCBleHBsaWNpdEJGQ1NJRmVlZGJhY2s6MzsKKwl1aW50MzJfdCBleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2s6MzsKKwl1aW50MzJfdCBleHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrOjM7CisJdWludDMyX3QgICAgIGNzaU51bUJGQW50ZW5uYWU6MjsKKwl1aW50MzJfdCB1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU6MjsKKwl1aW50MzJfdCBjb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlOjI7CisJdWludDMyX3QgICAgICAgICAgICByZXNlcnZlZDQ6NzsKKwl1aW50OF90ICAgICBhbnRlbm5hU2VsZWN0aW9uOjE7CisJdWludDhfdCBleHBsaWNpdENTSUZlZWRiYWNrVHg6MTsKKwl1aW50OF90IGFudGVubmFJbmRpY2VzRmVlZGJhY2tUeDoxOworCXVpbnQ4X3QgIGV4cGxpY2l0Q1NJRmVlZGJhY2s6MTsKKwl1aW50OF90IGFudGVubmFJbmRpY2VzRmVlZGJhY2s6MTsKKwl1aW50OF90ICAgICAgICAgICAgICAgICByeEFTOjE7CisJdWludDhfdCAgICAgIHR4U291bmRpbmdQUERVczoxOworCXVpbnQ4X3QgICAgICAgICAgICByZXNlcnZlZDU6MTsKKwl1aW50OF90ICAgICAgICAgICAgIG51bV9yc3ZkOworCXVpbnQ4X3QgICAgICAgICAgICAgcnN2ZFszMl07Cit9IHREb3QxMWZJRUhUQ2FwczsKKworI2RlZmluZSBET1QxMUZfRUlEX0hUQ0FQUyAoNDUpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9IVENBUFNfTUlOX0xFTiAoMjYpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0hUQ0FQU19NQVhfTEVOICg1OCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfaHRfY2FwcygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVIVENhcHMqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfaHRfY2FwcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVIVENhcHMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfSFRDYXBzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUhUQ2FwcyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA2MSAoMHgzZCkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUhUSW5mbyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgcHJpbWFyeUNoYW5uZWw7CisJdWludDhfdCBzZWNvbmRhcnlDaGFubmVsT2Zmc2V0OjI7CisJdWludDhfdCByZWNvbW1lbmRlZFR4V2lkdGhTZXQ6MTsKKwl1aW50OF90ICAgICAgICAgICAgIHJpZnNNb2RlOjE7CisJdWludDhfdCBjb250cm9sbGVkQWNjZXNzT25seToxOworCXVpbnQ4X3Qgc2VydmljZUludGVydmFsR3JhbnVsYXJpdHk6MzsKKwl1aW50MTZfdCAgICAgICAgICAgICAgIG9wTW9kZToyOworCXVpbnQxNl90ICBub25HRkRldmljZXNQcmVzZW50OjE7CisJdWludDE2X3QgICB0cmFuc21pdEJ1cnN0TGltaXQ6MTsKKwl1aW50MTZfdCAgb2Jzc05vbkhUU3RhUHJlc2VudDoxOworCXVpbnQxNl90ICAgICAgICAgICAgIHJlc2VydmVkOjExOworCXVpbnQxNl90ICAgICAgICAgYmFzaWNTVEJDTUNTOjc7CisJdWludDE2X3QgICAgZHVhbENUU1Byb3RlY3Rpb246MTsKKwl1aW50MTZfdCAgICAgIHNlY29uZGFyeUJlYWNvbjoxOworCXVpbnQxNl90IGxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OjE7CisJdWludDE2X3QgICAgICAgICAgICBwY29BY3RpdmU6MTsKKwl1aW50MTZfdCAgICAgICAgICAgICBwY29QaGFzZToxOworCXVpbnQxNl90ICAgICAgICAgICAgcmVzZXJ2ZWQyOjQ7CisJdWludDhfdCAgICAgICAgICAgICBiYXNpY01DU1NldFsxNl07CisJdWludDhfdCAgICAgICAgICAgICBudW1fcnN2ZDsKKwl1aW50OF90ICAgICAgICAgICAgIHJzdmRbMzJdOworfSB0RG90MTFmSUVIVEluZm87CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9IVElORk8gKDYxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfSFRJTkZPX01JTl9MRU4gKDIyKQorCisjZGVmaW5lIERPVDExRl9JRV9IVElORk9fTUFYX0xFTiAoNTQpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2h0X2luZm8oCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFSFRJbmZvKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2h0X2luZm8oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFSFRJbmZvICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0hUSW5mbygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVIVEluZm8gKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNiAoMHgwNikgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUlCU1NQYXJhbXMgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgICAgIGF0aW07Cit9IHREb3QxMWZJRUlCU1NQYXJhbXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9JQlNTUEFSQU1TICg2KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfSUJTU1BBUkFNU19NSU5fTEVOICgyKQorCisjZGVmaW5lIERPVDExRl9JRV9JQlNTUEFSQU1TX01BWF9MRU4gKDIpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2lic3NfcGFyYW1zKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRUlCU1NQYXJhbXMqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfaWJzc19wYXJhbXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFSUJTU1BhcmFtcyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9JQlNTUGFyYW1zKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUlCU1NQYXJhbXMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMTAxICgweDY1KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFTGlua0lkZW50aWZpZXIgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGJzc2lkWzZdOworCXVpbnQ4X3QgICAgICAgICAgICAgSW5pdFN0YUFkZHJbNl07CisJdWludDhfdCAgICAgICAgICAgICBSZXNwU3RhQWRkcls2XTsKK30gdERvdDExZklFTGlua0lkZW50aWZpZXI7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9MSU5LSURFTlRJRklFUiAoMTAxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfTElOS0lERU5USUZJRVJfTUlOX0xFTiAoMTgpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0xJTktJREVOVElGSUVSX01BWF9MRU4gKDE4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9saW5rX2lkZW50aWZpZXIoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFTGlua0lkZW50aWZpZXIqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfbGlua19pZGVudGlmaWVyKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUxpbmtJZGVudGlmaWVyICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX0xpbmtJZGVudGlmaWVyKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRUxpbmtJZGVudGlmaWVyICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDM5ICgweDI3KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHRva2VuOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgIGxhdGU6MTsKKwl1aW50OF90ICAgICAgICAgICAgaW5jYXBhYmxlOjE7CisJdWludDhfdCAgICAgICAgICAgICAgcmVmdXNlZDoxOworCXVpbnQ4X3QgICAgICAgICAgICAgICB1bnVzZWQ6NTsKKwl1aW50OF90ICAgICAgICAgICAgIHR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBjaGFubmVsOworCQkJdERPVDExRl9VNjQgbWVhc19zdGFydF90aW1lOworCQkJdWludDE2X3QgbWVhc19kdXJhdGlvbjsKKwkJCXVpbnQ4X3QgICAgICAgICAgICBic3M6MTsKKwkJCXVpbnQ4X3QgIG9mZG1fcHJlYW1ibGU6MTsKKwkJCXVpbnQ4X3QgICAgdW5pZF9zaWduYWw6MTsKKwkJCXVpbnQ4X3QgICAgICAgICAgcmFkZXI6MTsKKwkJCXVpbnQ4X3QgICAgIHVubWVhc3VyZWQ6MTsKKwkJCXVpbnQ4X3QgICAgICAgICB1bnVzZWQ6MzsKKwkJfSBCYXNpYzsgLyogdHlwZSA9IDAgKi8KKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgY2hhbm5lbDsKKwkJCXRET1QxMUZfVTY0IG1lYXNfc3RhcnRfdGltZTsKKwkJCXVpbnQxNl90IG1lYXNfZHVyYXRpb247CisJCQl1aW50OF90IGNjYV9idXN5X2ZyYWN0aW9uOworCQl9IENDQTsgLyogdHlwZSA9IDEgKi8KKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgY2hhbm5lbDsKKwkJCXRET1QxMUZfVTY0IG1lYXNfc3RhcnRfdGltZTsKKwkJCXVpbnQxNl90IG1lYXNfZHVyYXRpb247CisJCQl1aW50OF90IHJwaTBfZGVuc2l0eTsKKwkJCXVpbnQ4X3QgcnBpMV9kZW5zaXR5OworCQkJdWludDhfdCBycGkyX2RlbnNpdHk7CisJCQl1aW50OF90IHJwaTNfZGVuc2l0eTsKKwkJCXVpbnQ4X3QgcnBpNF9kZW5zaXR5OworCQkJdWludDhfdCBycGk1X2RlbnNpdHk7CisJCQl1aW50OF90IHJwaTZfZGVuc2l0eTsKKwkJCXVpbnQ4X3QgcnBpN19kZW5zaXR5OworCQl9IFJQSUhpc3RvZ3JhbTsgLyogdHlwZSA9IDIgKi8KKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcmVnQ2xhc3M7CisJCQl1aW50OF90IGNoYW5uZWw7CisJCQl0RE9UMTFGX1U2NCBtZWFzX3N0YXJ0X3RpbWU7CisJCQl1aW50MTZfdCBtZWFzX2R1cmF0aW9uOworCQkJdWludDhfdCAgICAgICAgY29uZGVuc2VkX1BIWTo3OworCQkJdWludDhfdCAgcmVwb3J0ZWRfZnJhbWVfdHlwZToxOworCQkJdWludDhfdCBSQ1BJOworCQkJdWludDhfdCBSU05JOworCQkJdWludDhfdCBCU1NJRFs2XTsKKwkJCXVpbnQ4X3QgYW50ZW5uYV9pZDsKKwkJCXVpbnQzMl90IHBhcmVudF9UU0Y7CisJdERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSBCZWFjb25SZXBvcnRGcm1Cb2R5OworCQl9IEJlYWNvbjsgLyogdHlwZSA9IDUgKi8KKwl9IHJlcG9ydDsKK30gdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9NRUFTVVJFTUVOVFJFUE9SVCAoMzkpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9NRUFTVVJFTUVOVFJFUE9SVF9NSU5fTEVOICgzKQorCisjZGVmaW5lIERPVDExRl9JRV9NRUFTVVJFTUVOVFJFUE9SVF9NQVhfTEVOICgyOSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfbWVhc3VyZW1lbnRfcmVwb3J0KAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0Kik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX21lYXN1cmVtZW50X3JlcG9ydCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9tZWFzdXJlbWVudF9yZXBvcnQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMzggKDB4MjYpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG1lYXN1cmVtZW50X3Rva2VuOworCXVpbnQ4X3QgICAgICAgICAgICAgcGFyYWxsZWw6MTsKKwl1aW50OF90ICAgICAgICAgICAgICAgZW5hYmxlOjE7CisJdWludDhfdCAgICAgICAgICAgICAgcmVxdWVzdDoxOworCXVpbnQ4X3QgICAgICAgICAgICAgICByZXBvcnQ6MTsKKwl1aW50OF90ICAgIGR1cmF0aW9uTWFuZGF0b3J5OjE7CisJdWludDhfdCAgICAgICAgICAgICAgIHVudXNlZDozOworCXVpbnQ4X3QgICAgICAgICAgICAgbWVhc3VyZW1lbnRfdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IGNoYW5uZWxfbm87CisJCQl1aW50OF90IG1lYXNfc3RhcnRfdGltZVs4XTsKKwkJCXVpbnQxNl90IG1lYXNfZHVyYXRpb247CisJCX0gQmFzaWM7IC8qIG1lYXN1cmVtZW50X3R5cGUgPSAwICovCisJCXN0cnVjdCB7CisJCQl1aW50OF90IGNoYW5uZWxfbm87CisJCQl1aW50OF90IG1lYXNfc3RhcnRfdGltZVs4XTsKKwkJCXVpbnQxNl90IG1lYXNfZHVyYXRpb247CisJCX0gQ0NBOyAvKiBtZWFzdXJlbWVudF90eXBlID0gMSAqLworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBjaGFubmVsX25vOworCQkJdWludDhfdCBtZWFzX3N0YXJ0X3RpbWVbOF07CisJCQl1aW50MTZfdCBtZWFzX2R1cmF0aW9uOworCQl9IFJQSUhpc3RvZ3JhbTsgLyogbWVhc3VyZW1lbnRfdHlwZSA9IDIgKi8KKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcmVnQ2xhc3M7CisJCQl1aW50OF90IGNoYW5uZWw7CisJCQl1aW50MTZfdCByYW5kb21pemF0aW9uOworCQkJdWludDE2X3QgbWVhc19kdXJhdGlvbjsKKwkJCXVpbnQ4X3QgbWVhc19tb2RlOworCQkJdWludDhfdCBCU1NJRFs2XTsKKwl0RG90MTFmSUVTU0lEIFNTSUQ7CisJdERvdDExZklFQmVhY29uUmVwb3J0aW5nIEJlYWNvblJlcG9ydGluZzsKKwl0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWwgQmNuUmVwb3J0aW5nRGV0YWlsOworCXREb3QxMWZJRVJlcXVlc3RlZEluZm8gUmVxdWVzdGVkSW5mbzsKKwl1aW50MTZfdCBudW1fQVBDaGFubmVsUmVwb3J0OworCXREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCBBUENoYW5uZWxSZXBvcnRbMl07CisJCX0gQmVhY29uOyAvKiBtZWFzdXJlbWVudF90eXBlID0gNSAqLworCX0gbWVhc3VyZW1lbnRfcmVxdWVzdDsKK30gdERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0OworCisjZGVmaW5lIERPVDExRl9FSURfTUVBU1VSRU1FTlRSRVFVRVNUICgzOCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX01FQVNVUkVNRU5UUkVRVUVTVF9NSU5fTEVOICgxNCkKKworI2RlZmluZSBET1QxMUZfSUVfTUVBU1VSRU1FTlRSRVFVRVNUX01BWF9MRU4gKDE2KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9tZWFzdXJlbWVudF9yZXF1ZXN0KAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9tZWFzdXJlbWVudF9yZXF1ZXN0KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9tZWFzdXJlbWVudF9yZXF1ZXN0KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA1NCAoMHgzNikgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRU1vYmlsaXR5RG9tYWluIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDE2X3QgICAgICAgICAgICBNRElEOworCXVpbnQ4X3QgICAgICAgICAgICBvdmVyRFNDYXA6MTsKKwl1aW50OF90ICAgICAgIHJlc291cmNlUmVxQ2FwOjE7CisJdWludDhfdCAgICAgICAgICAgICByZXNlcnZlZDo2OworfSB0RG90MTFmSUVNb2JpbGl0eURvbWFpbjsKKworI2RlZmluZSBET1QxMUZfRUlEX01PQklMSVRZRE9NQUlOICg1NCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX01PQklMSVRZRE9NQUlOX01JTl9MRU4gKDMpCisKKyNkZWZpbmUgRE9UMTFGX0lFX01PQklMSVRZRE9NQUlOX01BWF9MRU4gKDMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX21vYmlsaXR5X2RvbWFpbigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVNb2JpbGl0eURvbWFpbiopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9tb2JpbGl0eV9kb21haW4oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFTW9iaWxpdHlEb21haW4gKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfTW9iaWxpdHlEb21haW4oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFTW9iaWxpdHlEb21haW4gKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNTIgKDB4MzQpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVOZWlnaGJvclJlcG9ydCB7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NpZFs2XTsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICBBUFJlYWNoYWJpbGl0eToyOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5OjE7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5U2NvcGU6MTsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjTWdtdENhcDoxOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUW9zQ2FwOjE7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwc2Q6MTsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJybToxOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsYXllZEJBOjE7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tQkE6MTsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICBNb2JpbGl0eURvbWFpbjoxOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkOjU7CisJdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRvcnlDbGFzczsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoeVR5cGU7CisJdERvdDExZklFVFNGSW5mbyAgICAgICAgICAgICAgICAgICAgVFNGSW5mbzsKKwl0RG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyICAgICAgICBDb25kZW5zZWRDb3VudHJ5U3RyOworCXREb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QgICAgICAgICAgIE1lYXN1cmVtZW50UGlsb3Q7CisJdERvdDExZklFUlJNRW5hYmxlZENhcCAgICAgICAgICAgICAgUlJNRW5hYmxlZENhcDsKKwl0RG90MTFmSUVNdWx0aUJzc2lkICAgICAgICAgICAgICAgICBNdWx0aUJzc2lkOworfSB0RG90MTFmSUVOZWlnaGJvclJlcG9ydDsKKworI2RlZmluZSBET1QxMUZfRUlEX05FSUdIQk9SUkVQT1JUICg1MikKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX05FSUdIQk9SUkVQT1JUX01JTl9MRU4gKDEzKQorCisjZGVmaW5lIERPVDExRl9JRV9ORUlHSEJPUlJFUE9SVF9NQVhfTEVOICg1NDYpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX25laWdoYm9yX3JlcG9ydCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVOZWlnaGJvclJlcG9ydCopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9uZWlnaGJvcl9yZXBvcnQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFTmVpZ2hib3JSZXBvcnQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfbmVpZ2hib3JfcmVwb3J0KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRU5laWdoYm9yUmVwb3J0ICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDc0ICgweDRhKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFT0JTU1NjYW5QYXJhbWV0ZXJzIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDE2X3QgICAgICAgICAgICBvYnNzU2NhblBhc3NpdmVEd2VsbDsKKwl1aW50MTZfdCAgICAgICAgICAgIG9ic3NTY2FuQWN0aXZlRHdlbGw7CisJdWludDE2X3QgICAgICAgICAgICBic3NDaGFubmVsV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsOworCXVpbnQxNl90ICAgICAgICAgICAgb2Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsOworCXVpbnQxNl90ICAgICAgICAgICAgb2Jzc1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWw7CisJdWludDE2X3QgICAgICAgICAgICBic3NXaWR0aENoYW5uZWxUcmFuc2l0aW9uRGVsYXlGYWN0b3I7CisJdWludDE2X3QgICAgICAgICAgICBvYnNzU2NhbkFjdGl2aXR5VGhyZXNob2xkOworfSB0RG90MTFmSUVPQlNTU2NhblBhcmFtZXRlcnM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9PQlNTU0NBTlBBUkFNRVRFUlMgKDc0KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfT0JTU1NDQU5QQVJBTUVURVJTX01JTl9MRU4gKDE0KQorCisjZGVmaW5lIERPVDExRl9JRV9PQlNTU0NBTlBBUkFNRVRFUlNfTUFYX0xFTiAoMTQpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX29ic3Nfc2Nhbl9wYXJhbWV0ZXJzKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRU9CU1NTY2FuUGFyYW1ldGVycyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9vYnNzX3NjYW5fcGFyYW1ldGVycygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVPQlNTU2NhblBhcmFtZXRlcnMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfT0JTU1NjYW5QYXJhbWV0ZXJzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRU9CU1NTY2FuUGFyYW1ldGVycyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxOTkgKDB4YzcpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVPcGVyYXRpbmdNb2RlIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgIGNoYW5XaWR0aDoyOworCXVpbnQ4X3QgICAgICAgICAgICAgcmVzZXJ2ZWQ6MjsKKwl1aW50OF90ICAgICAgICAgICAgICAgIHJ4TlNTOjM7CisJdWludDhfdCAgICAgICAgICAgIHJ4TlNTVHlwZToxOworfSB0RG90MTFmSUVPcGVyYXRpbmdNb2RlOworCisjZGVmaW5lIERPVDExRl9FSURfT1BFUkFUSU5HTU9ERSAoMTk5KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfT1BFUkFUSU5HTU9ERV9NSU5fTEVOICgxKQorCisjZGVmaW5lIERPVDExRl9JRV9PUEVSQVRJTkdNT0RFX01BWF9MRU4gKDEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX29wZXJhdGluZ19tb2RlKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRU9wZXJhdGluZ01vZGUqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfb3BlcmF0aW5nX21vZGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFT3BlcmF0aW5nTW9kZSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9PcGVyYXRpbmdNb2RlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRU9wZXJhdGluZ01vZGUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4NTAsIDB4NmYsIDB4OWEsIDB4MDl9IChNdWx0aS1JRSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVAyUEFzc29jUmVxIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdERvdDExZlRMVlAyUENhcGFiaWxpdHkgUDJQQ2FwYWJpbGl0eTsKKwl0RG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmcgRXh0ZW5kZWRMaXN0ZW5UaW1pbmc7CisJdERvdDExZlRMVlAyUERldmljZUluZm8gUDJQRGV2aWNlSW5mbzsKK30gdERvdDExZklFUDJQQXNzb2NSZXE7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBBU1NPQ1JFUSAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUDJQQVNTT0NSRVFfTUlOX0xFTiAoNCkKKworI2RlZmluZSBET1QxMUZfSUVfUDJQQVNTT0NSRVFfTUFYX0xFTiAoNzEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3AyX3BfYXNzb2NfcmVxKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVAyUEFzc29jUmVxKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3AyX3BfYXNzb2NfcmVxKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVAyUEFzc29jUmVxICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9hc3NvY19yZXEoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUDJQQXNzb2NSZXEgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4NTAsIDB4NmYsIDB4OWEsIDB4MDl9IChNdWx0aS1JRSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVAyUEFzc29jUmVzIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdERvdDExZlRMVlAyUFN0YXR1cyBQMlBTdGF0dXM7CisJdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nIEV4dGVuZGVkTGlzdGVuVGltaW5nOworfSB0RG90MTFmSUVQMlBBc3NvY1JlczsKKworI2RlZmluZSBET1QxMUZfRUlEX1AyUEFTU09DUkVTICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9QMlBBU1NPQ1JFU19NSU5fTEVOICg0KQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBBU1NPQ1JFU19NQVhfTEVOICgxNSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcDJfcF9hc3NvY19yZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFUDJQQXNzb2NSZXMqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcDJfcF9hc3NvY19yZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUDJQQXNzb2NSZXMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX2Fzc29jX3JlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQMlBBc3NvY1JlcyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQQmVhY29uIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdERvdDExZlRMVlAyUENhcGFiaWxpdHkgUDJQQ2FwYWJpbGl0eTsKKwl0RG90MTFmVExWUDJQRGV2aWNlSWQgUDJQRGV2aWNlSWQ7CisJdERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSBOb3RpY2VPZkFic2VuY2U7Cit9IHREb3QxMWZJRVAyUEJlYWNvbjsKKworI2RlZmluZSBET1QxMUZfRUlEX1AyUEJFQUNPTiAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUDJQQkVBQ09OX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUEJFQUNPTl9NQVhfTEVOICg1OSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcDJfcF9iZWFjb24oCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFUDJQQmVhY29uKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3AyX3BfYmVhY29uKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVAyUEJlYWNvbiAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfYmVhY29uKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVAyUEJlYWNvbiAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQQmVhY29uUHJvYmVSZXMgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSBQMlBDYXBhYmlsaXR5OworCXREb3QxMWZUTFZQMlBEZXZpY2VJZCBQMlBEZXZpY2VJZDsKKwl0RG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmcgRXh0ZW5kZWRMaXN0ZW5UaW1pbmc7CisJdERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSBOb3RpY2VPZkFic2VuY2U7CisJdERvdDExZlRMVlAyUERldmljZUluZm8gUDJQRGV2aWNlSW5mbzsKKwl0RG90MTFmVExWUDJQR3JvdXBJbmZvIFAyUEdyb3VwSW5mbzsKK30gdERvdDExZklFUDJQQmVhY29uUHJvYmVSZXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBCRUFDT05QUk9CRVJFUyAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUDJQQkVBQ09OUFJPQkVSRVNfTUlOX0xFTiAoNCkKKworI2RlZmluZSBET1QxMUZfSUVfUDJQQkVBQ09OUFJPQkVSRVNfTUFYX0xFTiAoMTE0OCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcDJfcF9iZWFjb25fcHJvYmVfcmVzKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3AyX3BfYmVhY29uX3Byb2JlX3JlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfYmVhY29uX3Byb2JlX3JlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQRGVBdXRoIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdERvdDExZlRMVk1pbm9yUmVhc29uQ29kZSBNaW5vclJlYXNvbkNvZGU7Cit9IHREb3QxMWZJRVAyUERlQXV0aDsKKworI2RlZmluZSBET1QxMUZfRUlEX1AyUERFQVVUSCAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUDJQREVBVVRIX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUERFQVVUSF9NQVhfTEVOICg4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9wMl9wX2RlX2F1dGgoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFUDJQRGVBdXRoKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3AyX3BfZGVfYXV0aCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQMlBEZUF1dGggKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX2RlX2F1dGgoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUDJQRGVBdXRoICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDIyMSAoMHhkZCkge09VSSAweDUwLCAweDZmLCAweDlhLCAweDA5fSAoTXVsdGktSUUpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQMlBEaXNBc3NvYyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXREb3QxMWZUTFZNaW5vclJlYXNvbkNvZGUgTWlub3JSZWFzb25Db2RlOworfSB0RG90MTFmSUVQMlBEaXNBc3NvYzsKKworI2RlZmluZSBET1QxMUZfRUlEX1AyUERJU0FTU09DICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9QMlBESVNBU1NPQ19NSU5fTEVOICg0KQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBESVNBU1NPQ19NQVhfTEVOICg4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9wMl9wX2Rpc19hc3NvYygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVQMlBEaXNBc3NvYyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9wMl9wX2Rpc19hc3NvYygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQMlBEaXNBc3NvYyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfZGlzX2Fzc29jKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVAyUERpc0Fzc29jICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDIyMSAoMHhkZCkge09VSSAweDUwLCAweDZmLCAweDlhLCAweDA5fSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQSUVPcGFxdWUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG51bV9kYXRhOworCXVpbnQ4X3QgICAgICAgICAgICAgZGF0YVsyNDldOworfSB0RG90MTFmSUVQMlBJRU9wYXF1ZTsKKworI2RlZmluZSBET1QxMUZfRUlEX1AyUElFT1BBUVVFICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9QMlBJRU9QQVFVRV9NSU5fTEVOICg2KQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBJRU9QQVFVRV9NQVhfTEVOICgyNTMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3AyX3BpZV9vcGFxdWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFUDJQSUVPcGFxdWUqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcDJfcGllX29wYXF1ZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQMlBJRU9wYXF1ZSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9QMlBJRU9wYXF1ZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQMlBJRU9wYXF1ZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQUHJvYmVSZXEgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSBQMlBDYXBhYmlsaXR5OworCXREb3QxMWZUTFZQMlBEZXZpY2VJZCBQMlBEZXZpY2VJZDsKKwl0RG90MTFmVExWTGlzdGVuQ2hhbm5lbCBMaXN0ZW5DaGFubmVsOworCXREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZyBFeHRlbmRlZExpc3RlblRpbWluZzsKKwl0RG90MTFmVExWT3BlcmF0aW5nQ2hhbm5lbCBPcGVyYXRpbmdDaGFubmVsOworfSB0RG90MTFmSUVQMlBQcm9iZVJlcTsKKworI2RlZmluZSBET1QxMUZfRUlEX1AyUFBST0JFUkVRICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9QMlBQUk9CRVJFUV9NSU5fTEVOICg0KQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBQUk9CRVJFUV9NQVhfTEVOICg0MSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcDJfcF9wcm9iZV9yZXEoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFUDJQUHJvYmVSZXEqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcDJfcF9wcm9iZV9yZXEoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUDJQUHJvYmVSZXEgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX3Byb2JlX3JlcSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQMlBQcm9iZVJlcSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQUHJvYmVSZXMgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSBQMlBDYXBhYmlsaXR5OworCXREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZyBFeHRlbmRlZExpc3RlblRpbWluZzsKKwl0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlIE5vdGljZU9mQWJzZW5jZTsKKwl0RG90MTFmVExWUDJQRGV2aWNlSW5mbyBQMlBEZXZpY2VJbmZvOworCXREb3QxMWZUTFZQMlBHcm91cEluZm8gUDJQR3JvdXBJbmZvOworfSB0RG90MTFmSUVQMlBQcm9iZVJlczsKKworI2RlZmluZSBET1QxMUZfRUlEX1AyUFBST0JFUkVTICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9QMlBQUk9CRVJFU19NSU5fTEVOICg0KQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBQUk9CRVJFU19NQVhfTEVOICgxMTM5KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9wMl9wX3Byb2JlX3JlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVQMlBQcm9iZVJlcyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9wMl9wX3Byb2JlX3JlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQMlBQcm9iZVJlcyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfcHJvYmVfcmVzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVAyUFByb2JlUmVzICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDEwNSAoMHg2OSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVBUSUNvbnRyb2wgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHRpZDsKKwl1aW50MTZfdCAgICAgICAgICAgIHNlcXVlbmNlX2NvbnRyb2w7Cit9IHREb3QxMWZJRVBUSUNvbnRyb2w7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QVElDT05UUk9MICgxMDUpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9QVElDT05UUk9MX01JTl9MRU4gKDMpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1BUSUNPTlRST0xfTUFYX0xFTiAoMykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcHRpX2NvbnRyb2woCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFUFRJQ29udHJvbCopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9wdGlfY29udHJvbCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQVElDb250cm9sICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1BUSUNvbnRyb2woCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUFRJQ29udHJvbCAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAxMDYgKDB4NmEpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQVUJ1ZmZlclN0YXR1cyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICBhY19ia190cmFmZmljX2F2YWw6MTsKKwl1aW50OF90ICAgYWNfYmVfdHJhZmZpY19hdmFsOjE7CisJdWludDhfdCAgIGFjX3ZpX3RyYWZmaWNfYXZhbDoxOworCXVpbnQ4X3QgICBhY192b190cmFmZmljX2F2YWw6MTsKKwl1aW50OF90ICAgICAgICAgICAgIHJlc2VydmVkOjQ7Cit9IHREb3QxMWZJRVBVQnVmZmVyU3RhdHVzOworCisjZGVmaW5lIERPVDExRl9FSURfUFVCVUZGRVJTVEFUVVMgKDEwNikKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1BVQlVGRkVSU1RBVFVTX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1BVQlVGRkVSU1RBVFVTX01BWF9MRU4gKDEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3B1X2J1ZmZlcl9zdGF0dXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFUFVCdWZmZXJTdGF0dXMqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcHVfYnVmZmVyX3N0YXR1cygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQVUJ1ZmZlclN0YXR1cyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9QVUJ1ZmZlclN0YXR1cygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQVUJ1ZmZlclN0YXR1cyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAzMyAoMHgyMSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVBvd2VyQ2FwcyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbWluVHhQb3dlcjsKKwl1aW50OF90ICAgICAgICAgICAgIG1heFR4UG93ZXI7Cit9IHREb3QxMWZJRVBvd2VyQ2FwczsKKworI2RlZmluZSBET1QxMUZfRUlEX1BPV0VSQ0FQUyAoMzMpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9QT1dFUkNBUFNfTUlOX0xFTiAoMikKKworI2RlZmluZSBET1QxMUZfSUVfUE9XRVJDQVBTX01BWF9MRU4gKDIpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3Bvd2VyX2NhcHMoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFUG93ZXJDYXBzKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3Bvd2VyX2NhcHMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUG93ZXJDYXBzICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1Bvd2VyQ2FwcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQb3dlckNhcHMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMzIgKDB4MjApICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQb3dlckNvbnN0cmFpbnRzIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBsb2NhbFBvd2VyQ29uc3RyYWludHM7Cit9IHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QT1dFUkNPTlNUUkFJTlRTICgzMikKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1BPV0VSQ09OU1RSQUlOVFNfTUlOX0xFTiAoMSkKKworI2RlZmluZSBET1QxMUZfSUVfUE9XRVJDT05TVFJBSU5UU19NQVhfTEVOICgxKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9wb3dlcl9jb25zdHJhaW50cygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3Bvd2VyX2NvbnN0cmFpbnRzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfUG93ZXJDb25zdHJhaW50cygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDExICgweDBiKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUUJTU0xvYWQgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgICAgIHN0YWNvdW50OworCXVpbnQ4X3QgICAgICAgICAgICAgY2hhdXRpbDsKKwl1aW50MTZfdCAgICAgICAgICAgIGF2YWlsOworfSB0RG90MTFmSUVRQlNTTG9hZDsKKworI2RlZmluZSBET1QxMUZfRUlEX1FCU1NMT0FEICgxMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1FCU1NMT0FEX01JTl9MRU4gKDUpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1FCU1NMT0FEX01BWF9MRU4gKDUpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3Fic3NfbG9hZCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVRQlNTTG9hZCopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9xYnNzX2xvYWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUUJTU0xvYWQgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfUUJTU0xvYWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUUJTU0xvYWQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4YTAsIDB4YzZ9ICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVRQ29tVmVuZG9ySUUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHR5cGU7CisJdWludDhfdCAgICAgICAgICAgICBjaGFubmVsOworfSB0RG90MTFmSUVRQ29tVmVuZG9ySUU7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9RQ09NVkVORE9SSUUgKDIyMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1FDT01WRU5ET1JJRV9NSU5fTEVOICg1KQorCisjZGVmaW5lIERPVDExRl9JRV9RQ09NVkVORE9SSUVfTUFYX0xFTiAoNSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfUUNvbVZlbmRvcklFKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVFDb21WZW5kb3JJRSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9RQ29tVmVuZG9ySUUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUUNvbVZlbmRvcklFICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1FDb21WZW5kb3JJRSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVRQ29tVmVuZG9ySUUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNDYgKDB4MmUpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVRT1NDYXBzQXAgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgICAgIGNvdW50OjQ7CisJdWludDhfdCAgICAgICAgICAgICAgICAgcWFjazoxOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgIHFyZXE6MTsKKwl1aW50OF90ICAgICAgICAgICAgICB0eG9wcmVxOjE7CisJdWludDhfdCAgICAgICAgICAgICByZXNlcnZlZDoxOworfSB0RG90MTFmSUVRT1NDYXBzQXA7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9RT1NDQVBTQVAgKDQ2KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUU9TQ0FQU0FQX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1FPU0NBUFNBUF9NQVhfTEVOICgxKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9xb3NfY2Fwc19hcCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVRT1NDYXBzQXAqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcW9zX2NhcHNfYXAoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUU9TQ2Fwc0FwICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1FPU0NhcHNBcCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVRT1NDYXBzQXAgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNDYgKDB4MmUpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVRT1NDYXBzU3RhdGlvbiB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgIGFjdm9fdWFwc2Q6MTsKKwl1aW50OF90ICAgICAgICAgICBhY3ZpX3VhcHNkOjE7CisJdWludDhfdCAgICAgICAgICAgYWNia191YXBzZDoxOworCXVpbnQ4X3QgICAgICAgICAgIGFjYmVfdWFwc2Q6MTsKKwl1aW50OF90ICAgICAgICAgICAgICAgICBxYWNrOjE7CisJdWludDhfdCAgICAgICAgbWF4X3NwX2xlbmd0aDoyOworCXVpbnQ4X3QgICAgICAgIG1vcmVfZGF0YV9hY2s6MTsKK30gdERvdDExZklFUU9TQ2Fwc1N0YXRpb247CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9RT1NDQVBTU1RBVElPTiAoNDYpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9RT1NDQVBTU1RBVElPTl9NSU5fTEVOICgxKQorCisjZGVmaW5lIERPVDExRl9JRV9RT1NDQVBTU1RBVElPTl9NQVhfTEVOICgxKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9xb3NfY2Fwc19zdGF0aW9uKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVFPU0NhcHNTdGF0aW9uKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3Fvc19jYXBzX3N0YXRpb24oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUU9TQ2Fwc1N0YXRpb24gKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfUU9TQ2Fwc1N0YXRpb24oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUU9TQ2Fwc1N0YXRpb24gKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMTEwICgweDZlKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUW9zTWFwU2V0IHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBudW1fZHNjcF9leGNlcHRpb25zOworCXVpbnQ4X3QgICAgICAgICAgICAgZHNjcF9leGNlcHRpb25zWzYwXTsKK30gdERvdDExZklFUW9zTWFwU2V0OworCisjZGVmaW5lIERPVDExRl9FSURfUU9TTUFQU0VUICgxMTApCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9RT1NNQVBTRVRfTUlOX0xFTiAoMCkKKworI2RlZmluZSBET1QxMUZfSUVfUU9TTUFQU0VUX01BWF9MRU4gKDYwKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9xb3NfbWFwX3NldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVRb3NNYXBTZXQqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcW9zX21hcF9zZXQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUW9zTWFwU2V0ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1Fvc01hcFNldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVRb3NNYXBTZXQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNDAgKDB4MjgpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVRdWlldCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgY291bnQ7CisJdWludDhfdCAgICAgICAgICAgICBwZXJpb2Q7CisJdWludDE2X3QgICAgICAgICAgICBkdXJhdGlvbjsKKwl1aW50MTZfdCAgICAgICAgICAgIG9mZnNldDsKK30gdERvdDExZklFUXVpZXQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9RVUlFVCAoNDApCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9RVUlFVF9NSU5fTEVOICg2KQorCisjZGVmaW5lIERPVDExRl9JRV9RVUlFVF9NQVhfTEVOICg2KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9xdWlldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVRdWlldCopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9xdWlldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVRdWlldCAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9RdWlldCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVRdWlldCAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA1MyAoMHgzNSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVJDUElJRSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgcmNwaTsKK30gdERvdDExZklFUkNQSUlFOworCisjZGVmaW5lIERPVDExRl9FSURfUkNQSUlFICg1MykKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1JDUElJRV9NSU5fTEVOICgxKQorCisjZGVmaW5lIERPVDExRl9JRV9SQ1BJSUVfTUFYX0xFTiAoMSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcmNwaWllKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVJDUElJRSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9yY3BpaWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUkNQSUlFICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1JDUElJRSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVSQ1BJSUUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNTcgKDB4MzkpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVSSUNEYXRhRGVzYyB7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudDsKKwl0RG90MTFmSUVSSUNEYXRhICAgICAgICAgICAgICBSSUNEYXRhOworCXREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IgICAgICAgIFJJQ0Rlc2NyaXB0b3I7CisJdERvdDExZklFVFNQRUMgICAgICAgICAgICAgICAgVFNQRUM7CisJdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgbnVtX1RDTEFTOworCXREb3QxMWZJRVRDTEFTICAgICAgICAgICAgICAgIFRDTEFTWzJdOworCXREb3QxMWZJRVRDTEFTU1BST0MgICAgICAgICAgIFRDTEFTU1BST0M7CisJdERvdDExZklFVFNEZWxheSAgICAgICAgICAgICAgVFNEZWxheTsKKwl0RG90MTFmSUVTY2hlZHVsZSAgICAgICAgICAgICBTY2hlZHVsZTsKKwl0RG90MTFmSUVXTU1UU1BFQyAgICAgICAgICAgICBXTU1UU1BFQzsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICBudW1fV01NVENMQVM7CisJdERvdDExZklFV01NVENMQVMgICAgICAgICAgICAgV01NVENMQVNbMl07CisJdERvdDExZklFV01NVENMQVNQUk9DICAgICAgICAgV01NVENMQVNQUk9DOworCXREb3QxMWZJRVdNTVRTRGVsYXkgICAgICAgICAgIFdNTVRTRGVsYXk7CisJdERvdDExZklFV01NU2NoZWR1bGUgICAgICAgICAgV01NU2NoZWR1bGU7Cit9IHREb3QxMWZJRVJJQ0RhdGFEZXNjOworCisjZGVmaW5lIERPVDExRl9FSURfUklDREFUQURFU0MgKDU3KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUklDREFUQURFU0NfTUlOX0xFTiAoMCkKKworI2RlZmluZSBET1QxMUZfSUVfUklDREFUQURFU0NfTUFYX0xFTiAoNTQ4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9yaWNfZGF0YV9kZXNjKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVJJQ0RhdGFEZXNjKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3JpY19kYXRhX2Rlc2MoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUklDRGF0YURlc2MgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVyaWNfZGF0YV9kZXNjKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVJJQ0RhdGFEZXNjICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDQ4ICgweDMwKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUlNOIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDE2X3QgICAgICAgICAgICB2ZXJzaW9uIC8qIE11c3QgYmUgMSEgKi87CisJdWludDhfdCAgICAgICAgICAgICBncF9jaXBoZXJfc3VpdGVbNF07CisJdWludDE2X3QgICAgICAgICAgICBwd2lzZV9jaXBoZXJfc3VpdGVfY291bnQ7CisJdWludDhfdCAgICAgICAgICAgICBwd2lzZV9jaXBoZXJfc3VpdGVzWzRdWzRdOworCXVpbnQxNl90ICAgICAgICAgICAgYWttX3N1aXRlX2NvdW50OworCXVpbnQ4X3QgICAgICAgICAgICAgYWttX3N1aXRlc1s0XVs0XTsKKwl1aW50OF90ICAgICAgICAgICAgIFJTTl9DYXBbMl07CisJdWludDE2X3QgICAgICAgICAgICBwbWtpZF9jb3VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHBta2lkWzRdWzE2XTsKKwl1aW50OF90ICAgICAgICAgICAgIGdwX21nbXRfY2lwaGVyX3N1aXRlWzRdOworfSB0RG90MTFmSUVSU047CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9SU04gKDQ4KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUlNOX01JTl9MRU4gKDYpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1JTTl9NQVhfTEVOICgxMTQpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3JzbigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVSU04qKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcnNuKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVJTTiAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXJzbigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVSU04gKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNjUgKDB4NDEpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVSU05JSUUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHJzbmk7Cit9IHREb3QxMWZJRVJTTklJRTsKKworI2RlZmluZSBET1QxMUZfRUlEX1JTTklJRSAoNjUpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9SU05JSUVfTUlOX0xFTiAoMSkKKworI2RlZmluZSBET1QxMUZfSUVfUlNOSUlFX01BWF9MRU4gKDEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3JzbmlpZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVSU05JSUUqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcnNuaWllKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVJTTklJRSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXJzbklJRSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVSU05JSUUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNDggKDB4MzApICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVSU05PcGFxdWUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG51bV9kYXRhOworCXVpbnQ4X3QgICAgICAgICAgICAgZGF0YVsyNTNdOworfSB0RG90MTFmSUVSU05PcGFxdWU7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9SU05PUEFRVUUgKDQ4KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfUlNOT1BBUVVFX01JTl9MRU4gKDYpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1JTTk9QQVFVRV9NQVhfTEVOICgyNTMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3Jzbl9vcGFxdWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFUlNOT3BhcXVlKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3Jzbl9vcGFxdWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFUlNOT3BhcXVlICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llcnNuT3BhcXVlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVJTTk9wYXF1ZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAzNiAoMHgyNCkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVN1cHBDaGFubmVscyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX2JhbmRzOworCXVpbnQ4X3QgICAgICAgICAgICAgYmFuZHNbNDhdWzJdOworfSB0RG90MTFmSUVTdXBwQ2hhbm5lbHM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9TVVBQQ0hBTk5FTFMgKDM2KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfU1VQUENIQU5ORUxTX01JTl9MRU4gKDIpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1NVUFBDSEFOTkVMU19NQVhfTEVOICg5NikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfc3VwcF9jaGFubmVscygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVTdXBwQ2hhbm5lbHMqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfc3VwcF9jaGFubmVscygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVTdXBwQ2hhbm5lbHMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfU3VwcENoYW5uZWxzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVN1cHBDaGFubmVscyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA1OSAoMHgzYikgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVN1cHBPcGVyYXRpbmdDbGFzc2VzIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBudW1fY2xhc3NlczsKKwl1aW50OF90ICAgICAgICAgICAgIGNsYXNzZXNbMzJdOworfSB0RG90MTFmSUVTdXBwT3BlcmF0aW5nQ2xhc3NlczsKKworI2RlZmluZSBET1QxMUZfRUlEX1NVUFBPUEVSQVRJTkdDTEFTU0VTICg1OSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1NVUFBPUEVSQVRJTkdDTEFTU0VTX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1NVUFBPUEVSQVRJTkdDTEFTU0VTX01BWF9MRU4gKDMyKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9zdXBwX29wZXJhdGluZ19jbGFzc2VzKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVN1cHBPcGVyYXRpbmdDbGFzc2VzKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3N1cHBfb3BlcmF0aW5nX2NsYXNzZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfU3VwcE9wZXJhdGluZ0NsYXNzZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMSAoMHgwMSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVN1cHBSYXRlcyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX3JhdGVzOworCXVpbnQ4X3QgICAgICAgICAgICAgcmF0ZXNbMTJdOworfSB0RG90MTFmSUVTdXBwUmF0ZXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9TVVBQUkFURVMgKDEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9TVVBQUkFURVNfTUlOX0xFTiAoMCkKKworI2RlZmluZSBET1QxMUZfSUVfU1VQUFJBVEVTX01BWF9MRU4gKDEyKQorCisjZGVmaW5lIERPVDExRl9JU19CR19SQVRFKF94KSAgKCgoX3gpID09IDAyKSB8fCBcCisJCQkJKChfeCkgPT0gMDQpIHx8IFwKKwkJCQkoKF94KSA9PSAxMSkgfHwgXAorCQkJCSgoX3gpID09IDIyKSB8fCBcCisJCQkJKChfeCkgPT0gMTIpIHx8IFwKKwkJCQkoKF94KSA9PSAxOCkgfHwgXAorCQkJCSgoX3gpID09IDI0KSB8fCBcCisJCQkJKChfeCkgPT0gMzYpIHx8IFwKKwkJCQkoKF94KSA9PSA0OCkgfHwgXAorCQkJCSgoX3gpID09IDcyKSB8fCBcCisJCQkJKChfeCkgPT0gOTYpIHx8IFwKKwkJCQkoKF94KSA9PSAxMDgpKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9zdXBwX3JhdGVzKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVN1cHBSYXRlcyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9zdXBwX3JhdGVzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVN1cHBSYXRlcyAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9TdXBwUmF0ZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFU3VwcFJhdGVzICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDUgKDB4MDUpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVUSU0geworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIGR0aW1fY291bnQ7CisJdWludDhfdCAgICAgICAgICAgICBkdGltX3BlcmlvZDsKKwl1aW50OF90ICAgICAgICAgICAgIGJtcGN0bDsKKwl1aW50OF90ICAgICAgICAgICAgIG51bV92Ym1wOworCXVpbnQ4X3QgICAgICAgICAgICAgdmJtcFsyNTFdOworfSB0RG90MTFmSUVUSU07CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9USU0gKDUpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9USU1fTUlOX0xFTiAoNCkKKworI2RlZmluZSBET1QxMUZfSUVfVElNX01BWF9MRU4gKDI1NCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdGltKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVRJTSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV90aW0oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVElNICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1RJTSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVUSU0gKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMzUgKDB4MjMpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVUUENSZXBvcnQgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHR4X3Bvd2VyOworCXVpbnQ4X3QgICAgICAgICAgICAgbGlua19tYXJnaW47Cit9IHREb3QxMWZJRVRQQ1JlcG9ydDsKKworI2RlZmluZSBET1QxMUZfRUlEX1RQQ1JFUE9SVCAoMzUpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9UUENSRVBPUlRfTUlOX0xFTiAoMikKKworI2RlZmluZSBET1QxMUZfSUVfVFBDUkVQT1JUX01BWF9MRU4gKDIpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3RwY19yZXBvcnQoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFVFBDUmVwb3J0Kik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3RwY19yZXBvcnQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVFBDUmVwb3J0ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1RQQ1JlcG9ydCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVUUENSZXBvcnQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMzQgKDB4MjIpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVUUENSZXF1ZXN0IHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7Cit9IHREb3QxMWZJRVRQQ1JlcXVlc3Q7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9UUENSRVFVRVNUICgzNCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1RQQ1JFUVVFU1RfTUlOX0xFTiAoMCkKKworI2RlZmluZSBET1QxMUZfSUVfVFBDUkVRVUVTVF9NQVhfTEVOICgwKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV90cGNfcmVxdWVzdCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVUUENSZXF1ZXN0Kik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3RwY19yZXF1ZXN0KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVRQQ1JlcXVlc3QgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfVFBDUmVxdWVzdCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVUUENSZXF1ZXN0ICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDY5ICgweDQ1KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFVGltZUFkdmVydGlzZW1lbnQgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHRpbWluZ19jYXBhYmlsaXRpZXM7CisJdWludDhfdCAgICAgICAgICAgICB0aW1lX3ZhbHVlWzEwXTsKKwl1aW50OF90ICAgICAgICAgICAgIHRpbWVfZXJyb3JbNV07Cit9IHREb3QxMWZJRVRpbWVBZHZlcnRpc2VtZW50OworCisjZGVmaW5lIERPVDExRl9FSURfVElNRUFEVkVSVElTRU1FTlQgKDY5KQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfVElNRUFEVkVSVElTRU1FTlRfTUlOX0xFTiAoMTYpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1RJTUVBRFZFUlRJU0VNRU5UX01BWF9MRU4gKDE2KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV90aW1lX2FkdmVydGlzZW1lbnQoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFVGltZUFkdmVydGlzZW1lbnQqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfdGltZV9hZHZlcnRpc2VtZW50KAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVRpbWVBZHZlcnRpc2VtZW50ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX3RpbWVfYWR2ZXJ0aXNlbWVudCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVUaW1lQWR2ZXJ0aXNlbWVudCAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA1NiAoMHgzOCkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgdGltZW91dFR5cGU7CisJdWludDMyX3QgICAgICAgICAgICB0aW1lb3V0VmFsdWU7Cit9IHREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbDsKKworI2RlZmluZSBET1QxMUZfRUlEX1RJTUVPVVRJTlRFUlZBTCAoNTYpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9USU1FT1VUSU5URVJWQUxfTUlOX0xFTiAoNSkKKworI2RlZmluZSBET1QxMUZfSUVfVElNRU9VVElOVEVSVkFMX01BWF9MRU4gKDUpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3RpbWVvdXRfaW50ZXJ2YWwoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFVGltZW91dEludGVydmFsKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3RpbWVvdXRfaW50ZXJ2YWwoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVGltZW91dEludGVydmFsICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1RpbWVvdXRJbnRlcnZhbCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVUaW1lb3V0SW50ZXJ2YWwgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMTkzICgweGMxKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFVkhURXh0QnNzTG9hZCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbXVNSU1PQ2FwU3RhQ291bnQ7CisJdWludDhfdCAgICAgICAgICAgICBzc1VuZGVyVXRpbDsKKwl1aW50OF90ICAgICAgICAgICAgIEZvcnR5TUh6VXRpbDsKKwl1aW50OF90ICAgICAgICAgICAgIEVpZ2h0eU1IelV0aWw7CisJdWludDhfdCAgICAgICAgICAgICBPbmVTaXh0eU1IelV0aWw7Cit9IHREb3QxMWZJRVZIVEV4dEJzc0xvYWQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9WSFRFWFRCU1NMT0FEICgxOTMpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9WSFRFWFRCU1NMT0FEX01JTl9MRU4gKDUpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1ZIVEVYVEJTU0xPQURfTUFYX0xFTiAoNSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdmh0X2V4dF9ic3NfbG9hZCgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVWSFRFeHRCc3NMb2FkKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3ZodF9leHRfYnNzX2xvYWQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVkhURXh0QnNzTG9hZCAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9WSFRFeHRCc3NMb2FkKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVZIVEV4dEJzc0xvYWQgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4MTAsIDB4MTh9ICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVWZW5kb3IxSUUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKK30gdERvdDExZklFVmVuZG9yMUlFOworCisjZGVmaW5lIERPVDExRl9FSURfVkVORE9SMUlFICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9WRU5ET1IxSUVfTUlOX0xFTiAoMykKKworI2RlZmluZSBET1QxMUZfSUVfVkVORE9SMUlFX01BWF9MRU4gKDMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3ZlbmRvcjFfaWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFVmVuZG9yMUlFKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3ZlbmRvcjFfaWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVmVuZG9yMUlFICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1ZlbmRvcjFJRSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVWZW5kb3IxSUUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4MTYsIDB4MzJ9ICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVWZW5kb3IzSUUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKK30gdERvdDExZklFVmVuZG9yM0lFOworCisjZGVmaW5lIERPVDExRl9FSURfVkVORE9SM0lFICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9WRU5ET1IzSUVfTUlOX0xFTiAoMykKKworI2RlZmluZSBET1QxMUZfSUVfVkVORE9SM0lFX01BWF9MRU4gKDMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3ZlbmRvcjNfaWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFVmVuZG9yM0lFKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3ZlbmRvcjNfaWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFVmVuZG9yM0lFICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1ZlbmRvcjNJRSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVWZW5kb3IzSUUgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNjggKDB4NDQpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXQVBJIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDE2X3QgICAgICAgICAgICB2ZXJzaW9uIC8qIE11c3QgYmUgMSEgKi87CisJdWludDE2X3QgICAgICAgICAgICBha21fc3VpdGVfY291bnQ7CisJdWludDhfdCAgICAgICAgICAgICBha21fc3VpdGVzWzRdWzRdOworCXVpbnQxNl90ICAgICAgICAgICAgdW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQ7CisJdWludDhfdCAgICAgICAgICAgICB1bmljYXN0X2NpcGhlcl9zdWl0ZXNbNF1bNF07CisJdWludDhfdCAgICAgICAgICAgICBtdWx0aWNhc3RfY2lwaGVyX3N1aXRlWzRdOworCXVpbnQxNl90ICAgICAgICAgICAgICBwcmVhdXRoOjE7CisJdWludDE2X3QgICAgICAgICAgICAgcmVzZXJ2ZWQ6MTU7CisJdWludDE2X3QgICAgICAgICAgICBia2lkX2NvdW50OworCXVpbnQ4X3QgICAgICAgICAgICAgYmtpZFs0XVsxNl07Cit9IHREb3QxMWZJRVdBUEk7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XQVBJICg2OCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1dBUElfTUlOX0xFTiAoMTIpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dBUElfTUFYX0xFTiAoMTEwKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93YXBpKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVdBUEkqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd2FwaSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXQVBJICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2lld2FwaSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXQVBJICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDY4ICgweDQ0KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV0FQSU9wYXF1ZSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX2RhdGE7CisJdWludDhfdCAgICAgICAgICAgICBkYXRhWzI1M107Cit9IHREb3QxMWZJRVdBUElPcGFxdWU7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XQVBJT1BBUVVFICg2OCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1dBUElPUEFRVUVfTUlOX0xFTiAoNikKKworI2RlZmluZSBET1QxMUZfSUVfV0FQSU9QQVFVRV9NQVhfTEVOICgyNTMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dhcGlfb3BhcXVlKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVdBUElPcGFxdWUqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd2FwaV9vcGFxdWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV0FQSU9wYXF1ZSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXdhcGlPcGFxdWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV0FQSU9wYXF1ZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwOCwgMHgwMH0gKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdGQVRQQyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgdHhQb3dlcjsKKwl1aW50OF90ICAgICAgICAgICAgIGxpbmtNYXJnaW47Cit9IHREb3QxMWZJRVdGQVRQQzsKKworI2RlZmluZSBET1QxMUZfRUlEX1dGQVRQQyAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfV0ZBVFBDX01JTl9MRU4gKDcpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dGQVRQQ19NQVhfTEVOICg3KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93ZmF0cGMoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFV0ZBVFBDKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dmYXRwYygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXRkFUUEMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfV0ZBVFBDKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdGQVRQQyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwYX0gKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdGRElFT3BhcXVlIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBudW1fZGF0YTsKKwl1aW50OF90ICAgICAgICAgICAgIGRhdGFbMjQ5XTsKK30gdERvdDExZklFV0ZESUVPcGFxdWU7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XRkRJRU9QQVFVRSAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfV0ZESUVPUEFRVUVfTUlOX0xFTiAoNikKKworI2RlZmluZSBET1QxMUZfSUVfV0ZESUVPUEFRVUVfTUFYX0xFTiAoMjUzKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93ZmRpZV9vcGFxdWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFV0ZESUVPcGFxdWUqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd2ZkaWVfb3BhcXVlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdGRElFT3BhcXVlICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1dGRElFT3BhcXVlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdGRElFT3BhcXVlICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDA1fSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV01NQ2FwcyB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgdmVyc2lvbiAvKiBNdXN0IGJlIDEhICovOworCXVpbnQ4X3QgICAgICAgICAgICAgcmVzZXJ2ZWQ6NDsKKwl1aW50OF90ICAgICAgICAgICAgICAgICBxYWNrOjE7CisJdWludDhfdCAgICAgICAgcXVldWVfcmVxdWVzdDoxOworCXVpbnQ4X3QgICAgICAgICB0eG9wX3JlcXVlc3Q6MTsKKwl1aW50OF90ICAgICAgICAgICAgIG1vcmVfYWNrOjE7Cit9IHREb3QxMWZJRVdNTUNhcHM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XTU1DQVBTICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9XTU1DQVBTX01JTl9MRU4gKDcpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dNTUNBUFNfTUFYX0xFTiAoNykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd21tX2NhcHMoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFV01NQ2FwcyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93bW1fY2FwcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXTU1DYXBzICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1dNTUNhcHMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV01NQ2FwcyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMH0gKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdNTUluZm9BcCB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgdmVyc2lvbjsKKwl1aW50OF90ICAgICAgcGFyYW1fc2V0X2NvdW50OjQ7CisJdWludDhfdCAgICAgICAgICAgICByZXNlcnZlZDozOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgdWFwc2Q6MTsKK30gdERvdDExZklFV01NSW5mb0FwOworCisjZGVmaW5lIERPVDExRl9FSURfV01NSU5GT0FQICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9XTU1JTkZPQVBfTUlOX0xFTiAoNykKKworI2RlZmluZSBET1QxMUZfSUVfV01NSU5GT0FQX01BWF9MRU4gKDcpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dtbV9pbmZvX2FwKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVdNTUluZm9BcCopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93bW1faW5mb19hcCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXTU1JbmZvQXAgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfV01NSW5mb0FwKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdNTUluZm9BcCAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMH0gKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdNTUluZm9TdGF0aW9uIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICB2ZXJzaW9uOworCXVpbnQ4X3QgICAgICAgICAgIGFjdm9fdWFwc2Q6MTsKKwl1aW50OF90ICAgICAgICAgICBhY3ZpX3VhcHNkOjE7CisJdWludDhfdCAgICAgICAgICAgYWNia191YXBzZDoxOworCXVpbnQ4X3QgICAgICAgICAgIGFjYmVfdWFwc2Q6MTsKKwl1aW50OF90ICAgICAgICAgICAgcmVzZXJ2ZWQxOjE7CisJdWludDhfdCAgICAgICAgbWF4X3NwX2xlbmd0aDoyOworCXVpbnQ4X3QgICAgICAgICAgICByZXNlcnZlZDI6MTsKK30gdERvdDExZklFV01NSW5mb1N0YXRpb247CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XTU1JTkZPU1RBVElPTiAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfV01NSU5GT1NUQVRJT05fTUlOX0xFTiAoNykKKworI2RlZmluZSBET1QxMUZfSUVfV01NSU5GT1NUQVRJT05fTUFYX0xFTiAoNykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd21tX2luZm9fc3RhdGlvbigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93bW1faW5mb19zdGF0aW9uKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdNTUluZm9TdGF0aW9uICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1dNTUluZm9TdGF0aW9uKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdNTUluZm9TdGF0aW9uICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAxfSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV01NUGFyYW1zIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICB2ZXJzaW9uIC8qIE11c3QgYmUgMSEgKi87CisJdWludDhfdCAgICAgICAgICAgICBxb3NJbmZvOworCXVpbnQ4X3QgICAgICAgICAgICAgcmVzZXJ2ZWQyOworCXVpbnQ4X3QgICAgICAgICAgIGFjYmVfYWlmc246NDsKKwl1aW50OF90ICAgICAgICAgICAgIGFjYmVfYWNtOjE7CisJdWludDhfdCAgICAgICAgICAgICBhY2JlX2FjaToyOworCXVpbnQ4X3QgICAgICAgICAgICAgIHVudXNlZDE6MTsKKwl1aW50OF90ICAgICAgICAgIGFjYmVfYWN3bWluOjQ7CisJdWludDhfdCAgICAgICAgICBhY2JlX2Fjd21heDo0OworCXVpbnQxNl90ICAgICAgICAgICAgYWNiZV90eG9wbGltaXQ7CisJdWludDhfdCAgICAgICAgICAgYWNia19haWZzbjo0OworCXVpbnQ4X3QgICAgICAgICAgICAgYWNia19hY206MTsKKwl1aW50OF90ICAgICAgICAgICAgIGFjYmtfYWNpOjI7CisJdWludDhfdCAgICAgICAgICAgICAgdW51c2VkMjoxOworCXVpbnQ4X3QgICAgICAgICAgYWNia19hY3dtaW46NDsKKwl1aW50OF90ICAgICAgICAgIGFjYmtfYWN3bWF4OjQ7CisJdWludDE2X3QgICAgICAgICAgICBhY2JrX3R4b3BsaW1pdDsKKwl1aW50OF90ICAgICAgICAgICBhY3ZpX2FpZnNuOjQ7CisJdWludDhfdCAgICAgICAgICAgICBhY3ZpX2FjbToxOworCXVpbnQ4X3QgICAgICAgICAgICAgYWN2aV9hY2k6MjsKKwl1aW50OF90ICAgICAgICAgICAgICB1bnVzZWQzOjE7CisJdWludDhfdCAgICAgICAgICBhY3ZpX2Fjd21pbjo0OworCXVpbnQ4X3QgICAgICAgICAgYWN2aV9hY3dtYXg6NDsKKwl1aW50MTZfdCAgICAgICAgICAgIGFjdmlfdHhvcGxpbWl0OworCXVpbnQ4X3QgICAgICAgICAgIGFjdm9fYWlmc246NDsKKwl1aW50OF90ICAgICAgICAgICAgIGFjdm9fYWNtOjE7CisJdWludDhfdCAgICAgICAgICAgICBhY3ZvX2FjaToyOworCXVpbnQ4X3QgICAgICAgICAgICAgIHVudXNlZDQ6MTsKKwl1aW50OF90ICAgICAgICAgIGFjdm9fYWN3bWluOjQ7CisJdWludDhfdCAgICAgICAgICBhY3ZvX2Fjd21heDo0OworCXVpbnQxNl90ICAgICAgICAgICAgYWN2b190eG9wbGltaXQ7Cit9IHREb3QxMWZJRVdNTVBhcmFtczsKKworI2RlZmluZSBET1QxMUZfRUlEX1dNTVBBUkFNUyAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfV01NUEFSQU1TX01JTl9MRU4gKDI0KQorCisjZGVmaW5lIERPVDExRl9JRV9XTU1QQVJBTVNfTUFYX0xFTiAoMjQpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dtbV9wYXJhbXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFV01NUGFyYW1zKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dtbV9wYXJhbXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV01NUGFyYW1zICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1dNTVBhcmFtcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXTU1QYXJhbXMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9ICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXUEEgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50MTZfdCAgICAgICAgICAgIHZlcnNpb24gLyogTXVzdCBiZSAxISAqLzsKKwkvKiBmaWVsZCBhZGRlZCB0byBmaXggdGhlIGJ1ZyBpbiBkb3QxMWZQYWNrSUVXUEEgKi8KKwl1aW50OF90ICAgICAgICAgICAgIG11bHRpY2FzdF9jaXBoZXJfcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIG11bHRpY2FzdF9jaXBoZXJbNF07CisJdWludDE2X3QgICAgICAgICAgICB1bmljYXN0X2NpcGhlcl9jb3VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHVuaWNhc3RfY2lwaGVyc1s0XVs0XTsKKwl1aW50MTZfdCAgICAgICAgICAgIGF1dGhfc3VpdGVfY291bnQ7CisJdWludDhfdCAgICAgICAgICAgICBhdXRoX3N1aXRlc1s0XVs0XTsKKwl1aW50MTZfdCAgICAgICAgICAgIGNhcHM7Cit9IHREb3QxMWZJRVdQQTsKKworI2RlZmluZSBET1QxMUZfRUlEX1dQQSAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfV1BBX01JTl9MRU4gKDYpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dQQV9NQVhfTEVOICg0OCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd3BhKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVdQQSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93cGEoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV1BBICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2lld3BhKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdQQSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMX0gKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdQQU9wYXF1ZSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX2RhdGE7CisJdWludDhfdCAgICAgICAgICAgICBkYXRhWzI0OV07Cit9IHREb3QxMWZJRVdQQU9wYXF1ZTsKKworI2RlZmluZSBET1QxMUZfRUlEX1dQQU9QQVFVRSAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfV1BBT1BBUVVFX01JTl9MRU4gKDYpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dQQU9QQVFVRV9NQVhfTEVOICgyNTMpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dwYV9vcGFxdWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFV1BBT3BhcXVlKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dwYV9vcGFxdWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV1BBT3BhcXVlICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2lld3BhT3BhcXVlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdQQU9wYXF1ZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNH0gKE11bHRpLUlFKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV1NDIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdERvdDExZlRMVlZlcnNpb24gICBWZXJzaW9uOworCXREb3QxMWZUTFZXUFNTdGF0ZSAgV1BTU3RhdGU7CisJdERvdDExZlRMVkFQU2V0dXBMb2NrZWQgQVBTZXR1cExvY2tlZDsKKwl0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzIFNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczsKKwl0RG90MTFmVExWVVVJRF9FICAgIFVVSURfRTsKKwl0RG90MTFmVExWVVVJRF9SICAgIFVVSURfUjsKKwl0RG90MTFmVExWUkZCYW5kcyAgIFJGQmFuZHM7CisJdERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyIFNlbGVjdGVkUmVnaXN0cmFyOworCXREb3QxMWZUTFZDb25maWdNZXRob2RzIENvbmZpZ01ldGhvZHM7CisJdERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUgQXNzb2NpYXRpb25TdGF0ZTsKKwl0RG90MTFmVExWQ29uZmlndXJhdGlvbkVycm9yIENvbmZpZ3VyYXRpb25FcnJvcjsKKwl0RG90MTFmVExWTWFudWZhY3R1cmVyIE1hbnVmYWN0dXJlcjsKKwl0RG90MTFmVExWTW9kZWxOYW1lIE1vZGVsTmFtZTsKKwl0RG90MTFmVExWTW9kZWxOdW1iZXIgTW9kZWxOdW1iZXI7CisJdERvdDExZlRMVlNlcmlhbE51bWJlciBTZXJpYWxOdW1iZXI7CisJdERvdDExZlRMVkRldmljZU5hbWUgRGV2aWNlTmFtZTsKKwl0RG90MTFmVExWRGV2aWNlUGFzc3dvcmRJRCBEZXZpY2VQYXNzd29yZElEOworCXREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSBQcmltYXJ5RGV2aWNlVHlwZTsKKwl0RG90MTFmVExWUmVxdWVzdFR5cGUgUmVxdWVzdFR5cGU7CisJdERvdDExZlRMVlJlc3BvbnNlVHlwZSBSZXNwb25zZVR5cGU7CisJdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiBWZW5kb3JFeHRlbnNpb247CisJdERvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlIFJlcXVlc3REZXZpY2VUeXBlOworfSB0RG90MTFmSUVXU0M7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XU0MgKDIyMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ19NSU5fTEVOICg0KQorCisjZGVmaW5lIERPVDExRl9JRV9XU0NfTUFYX0xFTiAoMzY2KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93c2MoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFV1NDKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dzYygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXU0MgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWV3c2MoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV1NDICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDA0fSAoTXVsdGktSUUpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXc2NBc3NvY1JlcSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXREb3QxMWZUTFZWZXJzaW9uICAgVmVyc2lvbjsKKwl0RG90MTFmVExWUmVxdWVzdFR5cGUgUmVxdWVzdFR5cGU7CisJdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiBWZW5kb3JFeHRlbnNpb247Cit9IHREb3QxMWZJRVdzY0Fzc29jUmVxOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDQVNTT0NSRVEgKDIyMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0FTU09DUkVRX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0FTU09DUkVRX01BWF9MRU4gKDM1KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93c2NfYXNzb2NfcmVxKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVdzY0Fzc29jUmVxKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dzY19hc3NvY19yZXEoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV3NjQXNzb2NSZXEgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX2Fzc29jX3JlcSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXc2NBc3NvY1JlcSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNH0gKE11bHRpLUlFKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV3NjQXNzb2NSZXMgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl0RG90MTFmVExWVmVyc2lvbiAgIFZlcnNpb247CisJdERvdDExZlRMVlJlc3BvbnNlVHlwZSBSZXNwb25zZVR5cGU7CisJdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiBWZW5kb3JFeHRlbnNpb247Cit9IHREb3QxMWZJRVdzY0Fzc29jUmVzOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDQVNTT0NSRVMgKDIyMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0FTU09DUkVTX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0FTU09DUkVTX01BWF9MRU4gKDM1KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93c2NfYXNzb2NfcmVzKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRVdzY0Fzc29jUmVzKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dzY19hc3NvY19yZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV3NjQXNzb2NSZXMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX2Fzc29jX3JlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXc2NBc3NvY1JlcyAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNH0gKE11bHRpLUlFKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV3NjQmVhY29uIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdERvdDExZlRMVlZlcnNpb24gICBWZXJzaW9uOworCXREb3QxMWZUTFZXUFNTdGF0ZSAgV1BTU3RhdGU7CisJdERvdDExZlRMVkFQU2V0dXBMb2NrZWQgQVBTZXR1cExvY2tlZDsKKwl0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIgU2VsZWN0ZWRSZWdpc3RyYXI7CisJdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQgRGV2aWNlUGFzc3dvcmRJRDsKKwl0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzIFNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczsKKwl0RG90MTFmVExWVVVJRF9FICAgIFVVSURfRTsKKwl0RG90MTFmVExWUkZCYW5kcyAgIFJGQmFuZHM7CisJdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiBWZW5kb3JFeHRlbnNpb247Cit9IHREb3QxMWZJRVdzY0JlYWNvbjsKKworI2RlZmluZSBET1QxMUZfRUlEX1dTQ0JFQUNPTiAoMjIxKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfV1NDQkVBQ09OX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0JFQUNPTl9NQVhfTEVOICg4MikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd3NjX2JlYWNvbigKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVXc2NCZWFjb24qKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd3NjX2JlYWNvbigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXc2NCZWFjb24gKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX2JlYWNvbigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXc2NCZWFjb24gKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9IChNdWx0aS1JRSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdERvdDExZlRMVlZlcnNpb24gICBWZXJzaW9uOworCXREb3QxMWZUTFZXUFNTdGF0ZSAgV1BTU3RhdGU7CisJdERvdDExZlRMVkFQU2V0dXBMb2NrZWQgQVBTZXR1cExvY2tlZDsKKwl0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIgU2VsZWN0ZWRSZWdpc3RyYXI7CisJdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQgRGV2aWNlUGFzc3dvcmRJRDsKKwl0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzIFNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczsKKwl0RG90MTFmVExWUmVzcG9uc2VUeXBlIFJlc3BvbnNlVHlwZTsKKwl0RG90MTFmVExWVVVJRF9FICAgIFVVSURfRTsKKwl0RG90MTFmVExWTWFudWZhY3R1cmVyIE1hbnVmYWN0dXJlcjsKKwl0RG90MTFmVExWTW9kZWxOYW1lIE1vZGVsTmFtZTsKKwl0RG90MTFmVExWTW9kZWxOdW1iZXIgTW9kZWxOdW1iZXI7CisJdERvdDExZlRMVlNlcmlhbE51bWJlciBTZXJpYWxOdW1iZXI7CisJdERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlIFByaW1hcnlEZXZpY2VUeXBlOworCXREb3QxMWZUTFZEZXZpY2VOYW1lIERldmljZU5hbWU7CisJdERvdDExZlRMVkNvbmZpZ01ldGhvZHMgQ29uZmlnTWV0aG9kczsKKwl0RG90MTFmVExWUkZCYW5kcyAgIFJGQmFuZHM7CisJdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiBWZW5kb3JFeHRlbnNpb247Cit9IHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDQkVBQ09OUFJPQkVSRVMgKDIyMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0JFQUNPTlBST0JFUkVTX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0JFQUNPTlBST0JFUkVTX01BWF9MRU4gKDMxNykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd3NjX2JlYWNvbl9wcm9iZV9yZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd3NjX2JlYWNvbl9wcm9iZV9yZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX2JlYWNvbl9wcm9iZV9yZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9ICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXc2NJRU9wYXF1ZSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgbnVtX2RhdGE7CisJdWludDhfdCAgICAgICAgICAgICBkYXRhWzI0OV07Cit9IHREb3QxMWZJRVdzY0lFT3BhcXVlOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDSUVPUEFRVUUgKDIyMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0lFT1BBUVVFX01JTl9MRU4gKDYpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0lFT1BBUVVFX01BWF9MRU4gKDI1MykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd3NjX2llX29wYXF1ZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVXc2NJRU9wYXF1ZSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93c2NfaWVfb3BhcXVlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdzY0lFT3BhcXVlICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX1dzY0lFT3BhcXVlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdzY0lFT3BhcXVlICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDA0fSAoTXVsdGktSUUpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXc2NQcm9iZVJlcSB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXREb3QxMWZUTFZWZXJzaW9uICAgVmVyc2lvbjsKKwl0RG90MTFmVExWUmVxdWVzdFR5cGUgUmVxdWVzdFR5cGU7CisJdERvdDExZlRMVkNvbmZpZ01ldGhvZHMgQ29uZmlnTWV0aG9kczsKKwl0RG90MTFmVExWVVVJRF9FICAgIFVVSURfRTsKKwl0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGUgUHJpbWFyeURldmljZVR5cGU7CisJdERvdDExZlRMVlJGQmFuZHMgICBSRkJhbmRzOworCXREb3QxMWZUTFZBc3NvY2lhdGlvblN0YXRlIEFzc29jaWF0aW9uU3RhdGU7CisJdERvdDExZlRMVkNvbmZpZ3VyYXRpb25FcnJvciBDb25maWd1cmF0aW9uRXJyb3I7CisJdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQgRGV2aWNlUGFzc3dvcmRJRDsKKwl0RG90MTFmVExWTWFudWZhY3R1cmVyIE1hbnVmYWN0dXJlcjsKKwl0RG90MTFmVExWTW9kZWxOYW1lIE1vZGVsTmFtZTsKKwl0RG90MTFmVExWTW9kZWxOdW1iZXIgTW9kZWxOdW1iZXI7CisJdERvdDExZlRMVkRldmljZU5hbWUgRGV2aWNlTmFtZTsKKwl0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uIFZlbmRvckV4dGVuc2lvbjsKKwl0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUgUmVxdWVzdERldmljZVR5cGU7Cit9IHREb3QxMWZJRVdzY1Byb2JlUmVxOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDUFJPQkVSRVEgKDIyMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ1BST0JFUkVRX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ1BST0JFUkVRX01BWF9MRU4gKDI4NCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd3NjX3Byb2JlX3JlcSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVXc2NQcm9iZVJlcSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93c2NfcHJvYmVfcmVxKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdzY1Byb2JlUmVxICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX3dzY19wcm9iZV9yZXEoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV3NjUHJvYmVSZXEgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9IChNdWx0aS1JRSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdzY1Byb2JlUmVzIHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdERvdDExZlRMVlZlcnNpb24gICBWZXJzaW9uOworCXREb3QxMWZUTFZXUFNTdGF0ZSAgV1BTU3RhdGU7CisJdERvdDExZlRMVkFQU2V0dXBMb2NrZWQgQVBTZXR1cExvY2tlZDsKKwl0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIgU2VsZWN0ZWRSZWdpc3RyYXI7CisJdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQgRGV2aWNlUGFzc3dvcmRJRDsKKwl0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzIFNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczsKKwl0RG90MTFmVExWUmVzcG9uc2VUeXBlIFJlc3BvbnNlVHlwZTsKKwl0RG90MTFmVExWVVVJRF9FICAgIFVVSURfRTsKKwl0RG90MTFmVExWTWFudWZhY3R1cmVyIE1hbnVmYWN0dXJlcjsKKwl0RG90MTFmVExWTW9kZWxOYW1lIE1vZGVsTmFtZTsKKwl0RG90MTFmVExWTW9kZWxOdW1iZXIgTW9kZWxOdW1iZXI7CisJdERvdDExZlRMVlNlcmlhbE51bWJlciBTZXJpYWxOdW1iZXI7CisJdERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlIFByaW1hcnlEZXZpY2VUeXBlOworCXREb3QxMWZUTFZEZXZpY2VOYW1lIERldmljZU5hbWU7CisJdERvdDExZlRMVkNvbmZpZ01ldGhvZHMgQ29uZmlnTWV0aG9kczsKKwl0RG90MTFmVExWUkZCYW5kcyAgIFJGQmFuZHM7CisJdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiBWZW5kb3JFeHRlbnNpb247Cit9IHREb3QxMWZJRVdzY1Byb2JlUmVzOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDUFJPQkVSRVMgKDIyMSkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ1BST0JFUkVTX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ1BST0JFUkVTX01BWF9MRU4gKDMxNykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd3NjX3Byb2JlX3JlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVXc2NQcm9iZVJlcyopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93c2NfcHJvYmVfcmVzKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRVdzY1Byb2JlUmVzICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX3dzY19wcm9iZV9yZXMoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFV3NjUHJvYmVSZXMgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9IChNdWx0aS1JRSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdzY1JlYXNzb2NSZXMgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl0RG90MTFmVExWVmVyc2lvbiAgIFZlcnNpb247CisJdERvdDExZlRMVlJlc3BvbnNlVHlwZSBSZXNwb25zZVR5cGU7CisJdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiBWZW5kb3JFeHRlbnNpb247Cit9IHREb3QxMWZJRVdzY1JlYXNzb2NSZXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XU0NSRUFTU09DUkVTICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9XU0NSRUFTU09DUkVTX01JTl9MRU4gKDQpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ1JFQVNTT0NSRVNfTUFYX0xFTiAoMzUpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dzY19yZWFzc29jX3JlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVXc2NSZWFzc29jUmVzKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dzY19yZWFzc29jX3JlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXc2NSZWFzc29jUmVzICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX3dzY19yZWFzc29jX3JlcygKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVXc2NSZWFzc29jUmVzICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworLyogRUlEIDYwICgweDNjKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFZXh0X2NoYW5fc3dpdGNoX2FubiB7CisJdWludDhfdCAgICAgICAgICAgICBwcmVzZW50OworCXVpbnQ4X3QgICAgICAgICAgICAgc3dpdGNoX21vZGU7CisJdWludDhfdCAgICAgICAgICAgICBuZXdfcmVnX2NsYXNzOworCXVpbnQ4X3QgICAgICAgICAgICAgbmV3X2NoYW5uZWw7CisJdWludDhfdCAgICAgICAgICAgICBzd2l0Y2hfY291bnQ7Cit9IHREb3QxMWZJRWV4dF9jaGFuX3N3aXRjaF9hbm47CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9FWFRfQ0hBTl9TV0lUQ0hfQU5OICg2MCkKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX0VYVF9DSEFOX1NXSVRDSF9BTk5fTUlOX0xFTiAoNCkKKworI2RlZmluZSBET1QxMUZfSUVfRVhUX0NIQU5fU1dJVENIX0FOTl9NQVhfTEVOICg0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9leHRfY2hhbl9zd2l0Y2hfYW5uKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRWV4dF9jaGFuX3N3aXRjaF9hbm4qKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZXh0X2NoYW5fc3dpdGNoX2FubigKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVleHRfY2hhbl9zd2l0Y2hfYW5uICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX2V4dF9jaGFuX3N3aXRjaF9hbm4oCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFZXh0X2NoYW5fc3dpdGNoX2FubiAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA3MiAoMHg0OCkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRWh0MjA0MF9ic3NfY29leGlzdGVuY2UgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgaW5mb19yZXF1ZXN0OjE7CisJdWludDhfdCBmb3J0eV9taHpfaW50b2xlcmFudDoxOworCXVpbnQ4X3QgdHdlbnR5X21oel9ic3N3aWR0aF9yZXE6MTsKKwl1aW50OF90IG9ic3Nfc2Nhbl9leGVtcHRpb25fcmVxOjE7CisJdWludDhfdCBvYnNzX3NjYW5fZXhlbXB0aW9uX2dyYW50OjE7CisJdWludDhfdCAgICAgICAgICAgICAgIHVudXNlZDozOworfSB0RG90MTFmSUVodDIwNDBfYnNzX2NvZXhpc3RlbmNlOworCisjZGVmaW5lIERPVDExRl9FSURfSFQyMDQwX0JTU19DT0VYSVNURU5DRSAoNzIpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9IVDIwNDBfQlNTX0NPRVhJU1RFTkNFX01JTl9MRU4gKDEpCisKKyNkZWZpbmUgRE9UMTFGX0lFX0hUMjA0MF9CU1NfQ09FWElTVEVOQ0VfTUFYX0xFTiAoMSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl1aW50OF90ICosCisJdWludDhfdCwKKwl0RG90MTFmSUVodDIwNDBfYnNzX2NvZXhpc3RlbmNlKik7CisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2h0MjA0MF9ic3NfY29leGlzdGVuY2UoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSAqLAorCXVpbnQ4X3QgKiwKKwl1aW50MzJfdCwKKwl1aW50MzJfdCopOworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9odDIwNDBfYnNzX2NvZXhpc3RlbmNlKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRWh0MjA0MF9ic3NfY29leGlzdGVuY2UgKiwKKwl1aW50MzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvKiBFSUQgNzMgKDB4NDkpICovCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVodDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0IHsKKwl1aW50OF90ICAgICAgICAgICAgIHByZXNlbnQ7CisJdWludDhfdCAgICAgICAgICAgICBvcGVyYXRpbmdfY2xhc3M7CisJdWludDhfdCAgICAgICAgICAgICBudW1fY2hhbm5lbF9saXN0OworCXVpbnQ4X3QgICAgICAgICAgICAgY2hhbm5lbF9saXN0WzUwXTsKK30gdERvdDExZklFaHQyMDQwX2Jzc19pbnRvbGVyYW50X3JlcG9ydDsKKworI2RlZmluZSBET1QxMUZfRUlEX0hUMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQgKDczKQorCisvKiBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aCAqLworI2RlZmluZSBET1QxMUZfSUVfSFQyMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVF9NSU5fTEVOICgxKQorCisjZGVmaW5lIERPVDExRl9JRV9IVDIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUX01BWF9MRU4gKDUxKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9odDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0KAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfaHQyMDQwX2Jzc19pbnRvbGVyYW50X3JlcG9ydCgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVodDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0ICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX2h0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFaHQyMDQwX2Jzc19pbnRvbGVyYW50X3JlcG9ydCAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCA2MiAoMHgzZSkgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRXNlY19jaGFuX29mZnNldF9lbGUgeworCXVpbnQ4X3QgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgIHNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7Cit9IHREb3QxMWZJRXNlY19jaGFuX29mZnNldF9lbGU7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9TRUNfQ0hBTl9PRkZTRVRfRUxFICg2MikKKworLyogTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGggKi8KKyNkZWZpbmUgRE9UMTFGX0lFX1NFQ19DSEFOX09GRlNFVF9FTEVfTUlOX0xFTiAoMSkKKworI2RlZmluZSBET1QxMUZfSUVfU0VDX0NIQU5fT0ZGU0VUX0VMRV9NQVhfTEVOICgxKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9zZWNfY2hhbl9vZmZzZXRfZWxlKAorCXRwQW5pU2lyR2xvYmFsLAorCXVpbnQ4X3QgKiwKKwl1aW50OF90LAorCXREb3QxMWZJRXNlY19jaGFuX29mZnNldF9lbGUqKTsKKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfc2VjX2NoYW5fb2Zmc2V0X2VsZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUVzZWNfY2hhbl9vZmZzZXRfZWxlICosCisJdWludDhfdCAqLAorCXVpbnQzMl90LAorCXVpbnQzMl90Kik7CisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX3NlY19jaGFuX29mZnNldF9lbGUoCisJdHBBbmlTaXJHbG9iYWwsCisJdERvdDExZklFc2VjX2NoYW5fb2Zmc2V0X2VsZSAqLAorCXVpbnQzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKy8qIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg5MCwgMHg0Y30gKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRXZlbmRvcjJfaWUgeworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgIHR5cGU7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICBzdWJfdHlwZTsKKwl0RG90MTFmSUVWSFRDYXBzICAgICAgICAgICAgIFZIVENhcHM7CisJdERvdDExZklFVkhUT3BlcmF0aW9uICAgICAgICBWSFRPcGVyYXRpb247Cit9IHREb3QxMWZJRXZlbmRvcjJfaWU7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9WRU5ET1IyX0lFICgyMjEpCisKKy8qIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoICovCisjZGVmaW5lIERPVDExRl9JRV9WRU5ET1IyX0lFX01JTl9MRU4gKDUpCisKKyNkZWZpbmUgRE9UMTFGX0lFX1ZFTkRPUjJfSUVfTUFYX0xFTiAoMjYpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3ZlbmRvcjJfaWUoCisJdHBBbmlTaXJHbG9iYWwsCisJdWludDhfdCAqLAorCXVpbnQ4X3QsCisJdERvdDExZklFdmVuZG9yMl9pZSopOworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV92ZW5kb3IyX2llKAorCXRwQW5pU2lyR2xvYmFsLAorCXREb3QxMWZJRXZlbmRvcjJfaWUgKiwKKwl1aW50OF90ICosCisJdWludDMyX3QsCisJdWludDMyX3QqKTsKKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfdmVuZG9yMl9pZSgKKwl0cEFuaVNpckdsb2JhbCwKKwl0RG90MTFmSUV2ZW5kb3IyX2llICosCisJdWludDMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZyYW1lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZBZGRUU1JlcXVlc3R7CisJdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgICAgIERpYWxvZ1Rva2VuOworCXREb3QxMWZJRVRTUEVDICAgICAgICAgICAgICAgICAgICAgVFNQRUM7CisJdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fVENMQVM7CisJdERvdDExZklFVENMQVMgICAgICAgICAgICAgICAgICAgICBUQ0xBU1syXTsKKwl0RG90MTFmSUVUQ0xBU1NQUk9DICAgICAgICAgICAgICAgIFRDTEFTU1BST0M7CisJdERvdDExZklFV01NVFNQRUMgICAgICAgICAgICAgICAgICBXTU1UU1BFQzsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9XTU1UQ0xBUzsKKwl0RG90MTFmSUVXTU1UQ0xBUyAgICAgICAgICAgICAgICAgIFdNTVRDTEFTWzJdOworCXREb3QxMWZJRVdNTVRDTEFTUFJPQyAgICAgICAgICAgICAgV01NVENMQVNQUk9DOworCXREb3QxMWZJRUVTRVRyYWZTdHJtUmF0ZVNldCAgICAgICAgRVNFVHJhZlN0cm1SYXRlU2V0OworfSB0RG90MTFmQWRkVFNSZXF1ZXN0OworCisjZGVmaW5lIERPVDExRl9BRERUU1JFUVVFU1QgKDEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfYWRkX3RzX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZBZGRUU1JlcXVlc3QgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX2FkZF90c19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkFkZFRTUmVxdWVzdCAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9hZGRfdHNfcmVxdWVzdF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkFkZFRTUmVxdWVzdCAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZBZGRUU1Jlc3BvbnNleworCXREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICAgQWN0aW9uOworCXREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICAgICBEaWFsb2dUb2tlbjsKKwl0RG90MTFmRmZTdGF0dXMgICAgICAgICAgICAgICAgU3RhdHVzOworCXREb3QxMWZJRVRTRGVsYXkgICAgICAgICAgICAgICBUU0RlbGF5OworCXREb3QxMWZJRVRTUEVDICAgICAgICAgICAgICAgICBUU1BFQzsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgbnVtX1RDTEFTOworCXREb3QxMWZJRVRDTEFTICAgICAgICAgICAgICAgICBUQ0xBU1syXTsKKwl0RG90MTFmSUVUQ0xBU1NQUk9DICAgICAgICAgICAgVENMQVNTUFJPQzsKKwl0RG90MTFmSUVTY2hlZHVsZSAgICAgICAgICAgICAgU2NoZWR1bGU7CisJdERvdDExZklFV01NVFNEZWxheSAgICAgICAgICAgIFdNTVRTRGVsYXk7CisJdERvdDExZklFV01NU2NoZWR1bGUgICAgICAgICAgIFdNTVNjaGVkdWxlOworCXREb3QxMWZJRVdNTVRTUEVDICAgICAgICAgICAgICBXTU1UU1BFQzsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgbnVtX1dNTVRDTEFTOworCXREb3QxMWZJRVdNTVRDTEFTICAgICAgICAgICAgICBXTU1UQ0xBU1syXTsKKwl0RG90MTFmSUVXTU1UQ0xBU1BST0MgICAgICAgICAgV01NVENMQVNQUk9DOworCXREb3QxMWZJRUVTRVRyYWZTdHJtTWV0ICAgICAgICBFU0VUcmFmU3RybU1ldDsKK30gdERvdDExZkFkZFRTUmVzcG9uc2U7CisKKyNkZWZpbmUgRE9UMTFGX0FERFRTUkVTUE9OU0UgKDIpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfYWRkX3RzX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmQWRkVFNSZXNwb25zZSAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfYWRkX3RzX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkFkZFRTUmVzcG9uc2UgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfYWRkX3RzX3Jlc3BvbnNlX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmQWRkVFNSZXNwb25zZSAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZBc3NvY1JlcXVlc3R7CisJdERvdDExZkZmQ2FwYWJpbGl0aWVzICAgICAgICAgIENhcGFiaWxpdGllczsKKwl0RG90MTFmRmZMaXN0ZW5JbnRlcnZhbCAgICAgICAgTGlzdGVuSW50ZXJ2YWw7CisJdERvdDExZklFU1NJRCAgICAgICAgICAgICAgICAgIFNTSUQ7CisJdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgICAgIFN1cHBSYXRlczsKKwl0RG90MTFmSUVFeHRTdXBwUmF0ZXMgICAgICAgICAgRXh0U3VwcFJhdGVzOworCXREb3QxMWZJRVBvd2VyQ2FwcyAgICAgICAgICAgICBQb3dlckNhcHM7CisJdERvdDExZklFU3VwcENoYW5uZWxzICAgICAgICAgIFN1cHBDaGFubmVsczsKKwl0RG90MTFmSUVSU05PcGFxdWUgICAgICAgICAgICAgUlNOT3BhcXVlOworCXREb3QxMWZJRVFPU0NhcHNTdGF0aW9uICAgICAgICBRT1NDYXBzU3RhdGlvbjsKKwl0RG90MTFmSUVSUk1FbmFibGVkQ2FwICAgICAgICAgUlJNRW5hYmxlZENhcDsKKwl0RG90MTFmSUVNb2JpbGl0eURvbWFpbiAgICAgICAgTW9iaWxpdHlEb21haW47CisJdERvdDExZklFV1BBT3BhcXVlICAgICAgICAgICAgIFdQQU9wYXF1ZTsKKwl0RG90MTFmSUVIVENhcHMgICAgICAgICAgICAgICAgSFRDYXBzOworCXREb3QxMWZJRVdNTUNhcHMgICAgICAgICAgICAgICBXTU1DYXBzOworCXREb3QxMWZJRVdNTUluZm9TdGF0aW9uICAgICAgICBXTU1JbmZvU3RhdGlvbjsKKwl0RG90MTFmSUVXc2NJRU9wYXF1ZSAgICAgICAgICAgV3NjSUVPcGFxdWU7CisJdERvdDExZklFV0FQSU9wYXF1ZSAgICAgICAgICAgIFdBUElPcGFxdWU7CisJdERvdDExZklFV0FQSSAgICAgICAgICAgICAgICAgIFdBUEk7CisJdERvdDExZklFRVNFUmFkTWdtdENhcCAgICAgICAgIEVTRVJhZE1nbXRDYXA7CisJdERvdDExZklFRVNFVmVyc2lvbiAgICAgICAgICAgIEVTRVZlcnNpb247CisJdERvdDExZklFUDJQSUVPcGFxdWUgICAgICAgICAgIFAyUElFT3BhcXVlOworCXREb3QxMWZJRVdGRElFT3BhcXVlICAgICAgICAgICBXRkRJRU9wYXF1ZTsKKwl0RG90MTFmSUVWSFRDYXBzICAgICAgICAgICAgICAgVkhUQ2FwczsKKwl0RG90MTFmSUVFeHRDYXAgICAgICAgICAgICAgICAgRXh0Q2FwOworCXREb3QxMWZJRU9wZXJhdGluZ01vZGUgICAgICAgICBPcGVyYXRpbmdNb2RlOworCXREb3QxMWZJRVFvc01hcFNldCAgICAgICAgICAgICBRb3NNYXBTZXQ7CisJdERvdDExZklFdmVuZG9yMl9pZSAgICAgICAgICAgIHZlbmRvcjJfaWU7Cit9IHREb3QxMWZBc3NvY1JlcXVlc3Q7CisKKyNkZWZpbmUgRE9UMTFGX0FTU09DUkVRVUVTVCAoMykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19hc3NvY19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmQXNzb2NSZXF1ZXN0ICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja19hc3NvY19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkFzc29jUmVxdWVzdCAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9hc3NvY19yZXF1ZXN0X3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmQXNzb2NSZXF1ZXN0ICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkFzc29jUmVzcG9uc2V7CisJdERvdDExZkZmQ2FwYWJpbGl0aWVzICAgICAgICAgICAgICBDYXBhYmlsaXRpZXM7CisJdERvdDExZkZmU3RhdHVzICAgICAgICAgICAgICAgICAgICBTdGF0dXM7CisJdERvdDExZkZmQUlEICAgICAgICAgICAgICAgICAgICAgICBBSUQ7CisJdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgICAgICAgICBTdXBwUmF0ZXM7CisJdERvdDExZklFRXh0U3VwcFJhdGVzICAgICAgICAgICAgICBFeHRTdXBwUmF0ZXM7CisJdERvdDExZklFRURDQVBhcmFtU2V0ICAgICAgICAgICAgICBFRENBUGFyYW1TZXQ7CisJdERvdDExZklFUkNQSUlFICAgICAgICAgICAgICAgICAgICBSQ1BJSUU7CisJdERvdDExZklFUlNOSUlFICAgICAgICAgICAgICAgICAgICBSU05JSUU7CisJdERvdDExZklFUlJNRW5hYmxlZENhcCAgICAgICAgICAgICBSUk1FbmFibGVkQ2FwOworCXREb3QxMWZJRU1vYmlsaXR5RG9tYWluICAgICAgICAgICAgTW9iaWxpdHlEb21haW47CisJdERvdDExZklFRlRJbmZvICAgICAgICAgICAgICAgICAgICBGVEluZm87CisJdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fUklDRGF0YURlc2M7CisJdERvdDExZklFUklDRGF0YURlc2MgICAgICAgICAgICAgICBSSUNEYXRhRGVzY1syXTsKKwl0RG90MTFmSUVXUEEgICAgICAgICAgICAgICAgICAgICAgIFdQQTsKKwl0RG90MTFmSUVUaW1lb3V0SW50ZXJ2YWwgICAgICAgICAgIFRpbWVvdXRJbnRlcnZhbDsKKwl0RG90MTFmSUVIVENhcHMgICAgICAgICAgICAgICAgICAgIEhUQ2FwczsKKwl0RG90MTFmSUVIVEluZm8gICAgICAgICAgICAgICAgICAgIEhUSW5mbzsKKwl0RG90MTFmSUVXTU1QYXJhbXMgICAgICAgICAgICAgICAgIFdNTVBhcmFtczsKKwl0RG90MTFmSUVXTU1DYXBzICAgICAgICAgICAgICAgICAgIFdNTUNhcHM7CisJdERvdDExZklFRVNFUmFkTWdtdENhcCAgICAgICAgICAgICBFU0VSYWRNZ210Q2FwOworCXREb3QxMWZJRUVTRVRyYWZTdHJtTWV0ICAgICAgICAgICAgRVNFVHJhZlN0cm1NZXQ7CisJdERvdDExZklFRVNFVHhtaXRQb3dlciAgICAgICAgICAgICBFU0VUeG1pdFBvd2VyOworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX1dNTVRTUEVDOworCXREb3QxMWZJRVdNTVRTUEVDICAgICAgICAgICAgICAgICAgV01NVFNQRUNbNF07CisJdERvdDExZklFV3NjQXNzb2NSZXMgICAgICAgICAgICAgICBXc2NBc3NvY1JlczsKKwl0RG90MTFmSUVQMlBBc3NvY1JlcyAgICAgICAgICAgICAgIFAyUEFzc29jUmVzOworCXREb3QxMWZJRVZIVENhcHMgICAgICAgICAgICAgICAgICAgVkhUQ2FwczsKKwl0RG90MTFmSUVWSFRPcGVyYXRpb24gICAgICAgICAgICAgIFZIVE9wZXJhdGlvbjsKKwl0RG90MTFmSUVFeHRDYXAgICAgICAgICAgICAgICAgICAgIEV4dENhcDsKKwl0RG90MTFmSUVPQlNTU2NhblBhcmFtZXRlcnMgICAgICAgIE9CU1NTY2FuUGFyYW1ldGVyczsKKwl0RG90MTFmSUVRb3NNYXBTZXQgICAgICAgICAgICAgICAgIFFvc01hcFNldDsKKwl0RG90MTFmSUV2ZW5kb3IyX2llICAgICAgICAgICAgICAgIHZlbmRvcjJfaWU7Cit9IHREb3QxMWZBc3NvY1Jlc3BvbnNlOworCisjZGVmaW5lIERPVDExRl9BU1NPQ1JFU1BPTlNFICg0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2Fzc29jX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmQXNzb2NSZXNwb25zZSAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfYXNzb2NfcmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmQXNzb2NSZXNwb25zZSAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9hc3NvY19yZXNwb25zZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkFzc29jUmVzcG9uc2UgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmQXV0aGVudGljYXRpb257CisJdERvdDExZkZmQXV0aEFsZ28gICAgICAgICAgICAgICBBdXRoQWxnbzsKKwl0RG90MTFmRmZBdXRoU2VxTm8gICAgICAgICAgICAgIEF1dGhTZXFObzsKKwl0RG90MTFmRmZTdGF0dXMgICAgICAgICAgICAgICAgIFN0YXR1czsKKwl0RG90MTFmSUVDaGFsbGVuZ2VUZXh0ICAgICAgICAgIENoYWxsZW5nZVRleHQ7CisJdERvdDExZklFUlNOT3BhcXVlICAgICAgICAgICAgICBSU05PcGFxdWU7CisJdERvdDExZklFTW9iaWxpdHlEb21haW4gICAgICAgICBNb2JpbGl0eURvbWFpbjsKKwl0RG90MTFmSUVGVEluZm8gICAgICAgICAgICAgICAgIEZUSW5mbzsKKwl0RG90MTFmSUVUaW1lb3V0SW50ZXJ2YWwgICAgICAgIFRpbWVvdXRJbnRlcnZhbDsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgIG51bV9SSUNEYXRhRGVzYzsKKwl0RG90MTFmSUVSSUNEYXRhRGVzYyAgICAgICAgICAgIFJJQ0RhdGFEZXNjWzJdOworfSB0RG90MTFmQXV0aGVudGljYXRpb247CisKKyNkZWZpbmUgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OICg1KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2F1dGhlbnRpY2F0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmQXV0aGVudGljYXRpb24gKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX2F1dGhlbnRpY2F0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkF1dGhlbnRpY2F0aW9uICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2F1dGhlbnRpY2F0aW9uX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmQXV0aGVudGljYXRpb24gKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmQmVhY29ueworCXREb3QxMWZGZlRpbWVTdGFtcCAgICAgICAgICAgICAgICAgICBUaW1lU3RhbXA7CisJdERvdDExZkZmQmVhY29uSW50ZXJ2YWwgICAgICAgICAgICAgIEJlYWNvbkludGVydmFsOworCXREb3QxMWZGZkNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICBDYXBhYmlsaXRpZXM7CisJdERvdDExZklFU1NJRCAgICAgICAgICAgICAgICAgICAgICAgIFNTSUQ7CisJdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgICAgICAgICAgIFN1cHBSYXRlczsKKwl0RG90MTFmSUVGSFBhcmFtU2V0ICAgICAgICAgICAgICAgICAgRkhQYXJhbVNldDsKKwl0RG90MTFmSUVEU1BhcmFtcyAgICAgICAgICAgICAgICAgICAgRFNQYXJhbXM7CisJdERvdDExZklFQ0ZQYXJhbXMgICAgICAgICAgICAgICAgICAgIENGUGFyYW1zOworCXREb3QxMWZJRUlCU1NQYXJhbXMgICAgICAgICAgICAgICAgICBJQlNTUGFyYW1zOworCXREb3QxMWZJRVRJTSAgICAgICAgICAgICAgICAgICAgICAgICBUSU07CisJdERvdDExZklFQ291bnRyeSAgICAgICAgICAgICAgICAgICAgIENvdW50cnk7CisJdERvdDExZklFRkhQYXJhbXMgICAgICAgICAgICAgICAgICAgIEZIUGFyYW1zOworCXREb3QxMWZJRUZIUGF0dFRhYmxlICAgICAgICAgICAgICAgICBGSFBhdHRUYWJsZTsKKwl0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzICAgICAgICAgICAgUG93ZXJDb25zdHJhaW50czsKKwl0RG90MTFmSUVDaGFuU3dpdGNoQW5uICAgICAgICAgICAgICAgQ2hhblN3aXRjaEFubjsKKwl0RG90MTFmSUVleHRfY2hhbl9zd2l0Y2hfYW5uICAgICAgICAgZXh0X2NoYW5fc3dpdGNoX2FubjsKKwl0RG90MTFmSUVRdWlldCAgICAgICAgICAgICAgICAgICAgICAgUXVpZXQ7CisJdERvdDExZklFVFBDUmVwb3J0ICAgICAgICAgICAgICAgICAgIFRQQ1JlcG9ydDsKKwl0RG90MTFmSUVFUlBJbmZvICAgICAgICAgICAgICAgICAgICAgRVJQSW5mbzsKKwl0RG90MTFmSUVFeHRTdXBwUmF0ZXMgICAgICAgICAgICAgICAgRXh0U3VwcFJhdGVzOworCXREb3QxMWZJRVJTTiAgICAgICAgICAgICAgICAgICAgICAgICBSU047CisJdERvdDExZklFUUJTU0xvYWQgICAgICAgICAgICAgICAgICAgIFFCU1NMb2FkOworCXREb3QxMWZJRUVEQ0FQYXJhbVNldCAgICAgICAgICAgICAgICBFRENBUGFyYW1TZXQ7CisJdERvdDExZklFUU9TQ2Fwc0FwICAgICAgICAgICAgICAgICAgIFFPU0NhcHNBcDsKKwl0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQgICAgICAgICAgICAgQVBDaGFubmVsUmVwb3J0OworCXREb3QxMWZJRVJSTUVuYWJsZWRDYXAgICAgICAgICAgICAgICBSUk1FbmFibGVkQ2FwOworCXREb3QxMWZJRU1vYmlsaXR5RG9tYWluICAgICAgICAgICAgICBNb2JpbGl0eURvbWFpbjsKKwl0RG90MTFmSUVXUEEgICAgICAgICAgICAgICAgICAgICAgICAgV1BBOworCXREb3QxMWZJRUhUQ2FwcyAgICAgICAgICAgICAgICAgICAgICBIVENhcHM7CisJdERvdDExZklFSFRJbmZvICAgICAgICAgICAgICAgICAgICAgIEhUSW5mbzsKKwl0RG90MTFmSUVzZWNfY2hhbl9vZmZzZXRfZWxlICAgICAgICAgc2VjX2NoYW5fb2Zmc2V0X2VsZTsKKwl0RG90MTFmSUVXTU1JbmZvQXAgICAgICAgICAgICAgICAgICAgV01NSW5mb0FwOworCXREb3QxMWZJRVdNTVBhcmFtcyAgICAgICAgICAgICAgICAgICBXTU1QYXJhbXM7CisJdERvdDExZklFV01NQ2FwcyAgICAgICAgICAgICAgICAgICAgIFdNTUNhcHM7CisJdERvdDExZklFV0FQSSAgICAgICAgICAgICAgICAgICAgICAgIFdBUEk7CisJdERvdDExZklFRVNFUmFkTWdtdENhcCAgICAgICAgICAgICAgIEVTRVJhZE1nbXRDYXA7CisJdERvdDExZklFRVNFVHJhZlN0cm1NZXQgICAgICAgICAgICAgIEVTRVRyYWZTdHJtTWV0OworCXREb3QxMWZJRUVTRVR4bWl0UG93ZXIgICAgICAgICAgICAgICBFU0VUeG1pdFBvd2VyOworCXREb3QxMWZJRVdzY0JlYWNvbiAgICAgICAgICAgICAgICAgICBXc2NCZWFjb247CisJdERvdDExZklFUDJQQmVhY29uICAgICAgICAgICAgICAgICAgIFAyUEJlYWNvbjsKKwl0RG90MTFmSUVWSFRDYXBzICAgICAgICAgICAgICAgICAgICAgVkhUQ2FwczsKKwl0RG90MTFmSUVWSFRPcGVyYXRpb24gICAgICAgICAgICAgICAgVkhUT3BlcmF0aW9uOworCXREb3QxMWZJRVZIVEV4dEJzc0xvYWQgICAgICAgICAgICAgICBWSFRFeHRCc3NMb2FkOworCXREb3QxMWZJRUV4dENhcCAgICAgICAgICAgICAgICAgICAgICBFeHRDYXA7CisJdERvdDExZklFT3BlcmF0aW5nTW9kZSAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7CisJdERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4gICAgICAgIFdpZGVyQldDaGFuU3dpdGNoQW5uOworCXREb3QxMWZJRU9CU1NTY2FuUGFyYW1ldGVycyAgICAgICAgICBPQlNTU2NhblBhcmFtZXRlcnM7CisJdERvdDExZklFVmVuZG9yMUlFICAgICAgICAgICAgICAgICAgIFZlbmRvcjFJRTsKKwl0RG90MTFmSUV2ZW5kb3IyX2llICAgICAgICAgICAgICAgICAgdmVuZG9yMl9pZTsKKwl0RG90MTFmSUVWZW5kb3IzSUUgICAgICAgICAgICAgICAgICAgVmVuZG9yM0lFOworCXREb3QxMWZJRUNoYW5uZWxTd2l0Y2hXcmFwcGVyICAgICAgICBDaGFubmVsU3dpdGNoV3JhcHBlcjsKKwl0RG90MTFmSUVRQ29tVmVuZG9ySUUgICAgICAgICAgICAgICAgUUNvbVZlbmRvcklFOworCXREb3QxMWZJRUVTRVZlcnNpb24gICAgICAgICAgICAgICAgICBFU0VWZXJzaW9uOworfSB0RG90MTFmQmVhY29uOworCisjZGVmaW5lIERPVDExRl9CRUFDT04gKDYpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfYmVhY29uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmQmVhY29uICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja19iZWFjb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmQmVhY29uICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2JlYWNvbl9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkJlYWNvbiAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZCZWFjb24xeworCXREb3QxMWZGZlRpbWVTdGFtcCAgICAgICAgICAgICBUaW1lU3RhbXA7CisJdERvdDExZkZmQmVhY29uSW50ZXJ2YWwgICAgICAgIEJlYWNvbkludGVydmFsOworCXREb3QxMWZGZkNhcGFiaWxpdGllcyAgICAgICAgICBDYXBhYmlsaXRpZXM7CisJdERvdDExZklFU1NJRCAgICAgICAgICAgICAgICAgIFNTSUQ7CisJdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgICAgIFN1cHBSYXRlczsKKwl0RG90MTFmSUVEU1BhcmFtcyAgICAgICAgICAgICAgRFNQYXJhbXM7CisJdERvdDExZklFSUJTU1BhcmFtcyAgICAgICAgICAgIElCU1NQYXJhbXM7Cit9IHREb3QxMWZCZWFjb24xOworCisjZGVmaW5lIERPVDExRl9CRUFDT04xICg3KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2JlYWNvbjEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZCZWFjb24xICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja19iZWFjb24xKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkJlYWNvbjEgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfYmVhY29uMV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkJlYWNvbjEgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmQmVhY29uMnsKKwl0RG90MTFmSUVDb3VudHJ5ICAgICAgICAgICAgICAgICAgICAgQ291bnRyeTsKKwl0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzICAgICAgICAgICAgUG93ZXJDb25zdHJhaW50czsKKwl0RG90MTFmSUVDaGFuU3dpdGNoQW5uICAgICAgICAgICAgICAgQ2hhblN3aXRjaEFubjsKKwl0RG90MTFmSUVleHRfY2hhbl9zd2l0Y2hfYW5uICAgICAgICAgZXh0X2NoYW5fc3dpdGNoX2FubjsKKwl0RG90MTFmSUVRdWlldCAgICAgICAgICAgICAgICAgICAgICAgUXVpZXQ7CisJdERvdDExZklFVFBDUmVwb3J0ICAgICAgICAgICAgICAgICAgIFRQQ1JlcG9ydDsKKwl0RG90MTFmSUVFUlBJbmZvICAgICAgICAgICAgICAgICAgICAgRVJQSW5mbzsKKwl0RG90MTFmSUVFeHRTdXBwUmF0ZXMgICAgICAgICAgICAgICAgRXh0U3VwcFJhdGVzOworCXREb3QxMWZJRVJTTk9wYXF1ZSAgICAgICAgICAgICAgICAgICBSU05PcGFxdWU7CisJdERvdDExZklFRURDQVBhcmFtU2V0ICAgICAgICAgICAgICAgIEVEQ0FQYXJhbVNldDsKKwl0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQgICAgICAgICAgICAgQVBDaGFubmVsUmVwb3J0OworCXREb3QxMWZJRVJSTUVuYWJsZWRDYXAgICAgICAgICAgICAgICBSUk1FbmFibGVkQ2FwOworCXREb3QxMWZJRU1vYmlsaXR5RG9tYWluICAgICAgICAgICAgICBNb2JpbGl0eURvbWFpbjsKKwl0RG90MTFmSUVXUEEgICAgICAgICAgICAgICAgICAgICAgICAgV1BBOworCXREb3QxMWZJRUhUQ2FwcyAgICAgICAgICAgICAgICAgICAgICBIVENhcHM7CisJdERvdDExZklFSFRJbmZvICAgICAgICAgICAgICAgICAgICAgIEhUSW5mbzsKKwl0RG90MTFmSUVzZWNfY2hhbl9vZmZzZXRfZWxlICAgICAgICAgc2VjX2NoYW5fb2Zmc2V0X2VsZTsKKwl0RG90MTFmSUVXTU1JbmZvQXAgICAgICAgICAgICAgICAgICAgV01NSW5mb0FwOworCXREb3QxMWZJRVdNTVBhcmFtcyAgICAgICAgICAgICAgICAgICBXTU1QYXJhbXM7CisJdERvdDExZklFV01NQ2FwcyAgICAgICAgICAgICAgICAgICAgIFdNTUNhcHM7CisJdERvdDExZklFV3NjQmVhY29uICAgICAgICAgICAgICAgICAgIFdzY0JlYWNvbjsKKwl0RG90MTFmSUVXQVBJICAgICAgICAgICAgICAgICAgICAgICAgV0FQSTsKKwl0RG90MTFmSUVFU0VSYWRNZ210Q2FwICAgICAgICAgICAgICAgRVNFUmFkTWdtdENhcDsKKwl0RG90MTFmSUVFU0VUcmFmU3RybU1ldCAgICAgICAgICAgICAgRVNFVHJhZlN0cm1NZXQ7CisJdERvdDExZklFRVNFVHhtaXRQb3dlciAgICAgICAgICAgICAgIEVTRVR4bWl0UG93ZXI7CisJdERvdDExZklFUDJQQmVhY29uICAgICAgICAgICAgICAgICAgIFAyUEJlYWNvbjsKKwl0RG90MTFmSUVWSFRDYXBzICAgICAgICAgICAgICAgICAgICAgVkhUQ2FwczsKKwl0RG90MTFmSUVWSFRPcGVyYXRpb24gICAgICAgICAgICAgICAgVkhUT3BlcmF0aW9uOworCXREb3QxMWZJRVZIVEV4dEJzc0xvYWQgICAgICAgICAgICAgICBWSFRFeHRCc3NMb2FkOworCXREb3QxMWZJRUV4dENhcCAgICAgICAgICAgICAgICAgICAgICBFeHRDYXA7CisJdERvdDExZklFT3BlcmF0aW5nTW9kZSAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7CisJdERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4gICAgICAgIFdpZGVyQldDaGFuU3dpdGNoQW5uOworCXREb3QxMWZJRU9CU1NTY2FuUGFyYW1ldGVycyAgICAgICAgICBPQlNTU2NhblBhcmFtZXRlcnM7CisJdERvdDExZklFVmVuZG9yMUlFICAgICAgICAgICAgICAgICAgIFZlbmRvcjFJRTsKKwl0RG90MTFmSUV2ZW5kb3IyX2llICAgICAgICAgICAgICAgICAgdmVuZG9yMl9pZTsKKwl0RG90MTFmSUVWZW5kb3IzSUUgICAgICAgICAgICAgICAgICAgVmVuZG9yM0lFOworCXREb3QxMWZJRUNoYW5uZWxTd2l0Y2hXcmFwcGVyICAgICAgICBDaGFubmVsU3dpdGNoV3JhcHBlcjsKKwl0RG90MTFmSUVRQ29tVmVuZG9ySUUgICAgICAgICAgICAgICAgUUNvbVZlbmRvcklFOworCXREb3QxMWZJRUVTRVZlcnNpb24gICAgICAgICAgICAgICAgICBFU0VWZXJzaW9uOworfSB0RG90MTFmQmVhY29uMjsKKworI2RlZmluZSBET1QxMUZfQkVBQ09OMiAoOCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19iZWFjb24yKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmQmVhY29uMiAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfYmVhY29uMih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZCZWFjb24yICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2JlYWNvbjJfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZCZWFjb24yICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkJlYWNvbklFc3sKKwl0RG90MTFmSUVTU0lEICAgICAgICAgICAgICAgICAgICAgICAgU1NJRDsKKwl0RG90MTFmSUVTdXBwUmF0ZXMgICAgICAgICAgICAgICAgICAgU3VwcFJhdGVzOworCXREb3QxMWZJRUZIUGFyYW1TZXQgICAgICAgICAgICAgICAgICBGSFBhcmFtU2V0OworCXREb3QxMWZJRURTUGFyYW1zICAgICAgICAgICAgICAgICAgICBEU1BhcmFtczsKKwl0RG90MTFmSUVDRlBhcmFtcyAgICAgICAgICAgICAgICAgICAgQ0ZQYXJhbXM7CisJdERvdDExZklFSUJTU1BhcmFtcyAgICAgICAgICAgICAgICAgIElCU1NQYXJhbXM7CisJdERvdDExZklFVElNICAgICAgICAgICAgICAgICAgICAgICAgIFRJTTsKKwl0RG90MTFmSUVDb3VudHJ5ICAgICAgICAgICAgICAgICAgICAgQ291bnRyeTsKKwl0RG90MTFmSUVGSFBhcmFtcyAgICAgICAgICAgICAgICAgICAgRkhQYXJhbXM7CisJdERvdDExZklFRkhQYXR0VGFibGUgICAgICAgICAgICAgICAgIEZIUGF0dFRhYmxlOworCXREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgICAgICAgICAgICBQb3dlckNvbnN0cmFpbnRzOworCXREb3QxMWZJRUNoYW5Td2l0Y2hBbm4gICAgICAgICAgICAgICBDaGFuU3dpdGNoQW5uOworCXREb3QxMWZJRWV4dF9jaGFuX3N3aXRjaF9hbm4gICAgICAgICBleHRfY2hhbl9zd2l0Y2hfYW5uOworCXREb3QxMWZJRVF1aWV0ICAgICAgICAgICAgICAgICAgICAgICBRdWlldDsKKwl0RG90MTFmSUVUUENSZXBvcnQgICAgICAgICAgICAgICAgICAgVFBDUmVwb3J0OworCXREb3QxMWZJRUVSUEluZm8gICAgICAgICAgICAgICAgICAgICBFUlBJbmZvOworCXREb3QxMWZJRUV4dFN1cHBSYXRlcyAgICAgICAgICAgICAgICBFeHRTdXBwUmF0ZXM7CisJdERvdDExZklFUlNOICAgICAgICAgICAgICAgICAgICAgICAgIFJTTjsKKwl0RG90MTFmSUVRQlNTTG9hZCAgICAgICAgICAgICAgICAgICAgUUJTU0xvYWQ7CisJdERvdDExZklFRURDQVBhcmFtU2V0ICAgICAgICAgICAgICAgIEVEQ0FQYXJhbVNldDsKKwl0RG90MTFmSUVRT1NDYXBzQXAgICAgICAgICAgICAgICAgICAgUU9TQ2Fwc0FwOworCXREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCAgICAgICAgICAgICBBUENoYW5uZWxSZXBvcnQ7CisJdERvdDExZklFUlJNRW5hYmxlZENhcCAgICAgICAgICAgICAgIFJSTUVuYWJsZWRDYXA7CisJdERvdDExZklFTW9iaWxpdHlEb21haW4gICAgICAgICAgICAgIE1vYmlsaXR5RG9tYWluOworCXREb3QxMWZJRVdQQSAgICAgICAgICAgICAgICAgICAgICAgICBXUEE7CisJdERvdDExZklFSFRDYXBzICAgICAgICAgICAgICAgICAgICAgIEhUQ2FwczsKKwl0RG90MTFmSUVIVEluZm8gICAgICAgICAgICAgICAgICAgICAgSFRJbmZvOworCXREb3QxMWZJRXNlY19jaGFuX29mZnNldF9lbGUgICAgICAgICBzZWNfY2hhbl9vZmZzZXRfZWxlOworCXREb3QxMWZJRVdNTUluZm9BcCAgICAgICAgICAgICAgICAgICBXTU1JbmZvQXA7CisJdERvdDExZklFV01NUGFyYW1zICAgICAgICAgICAgICAgICAgIFdNTVBhcmFtczsKKwl0RG90MTFmSUVXTU1DYXBzICAgICAgICAgICAgICAgICAgICAgV01NQ2FwczsKKwl0RG90MTFmSUVXQVBJICAgICAgICAgICAgICAgICAgICAgICAgV0FQSTsKKwl0RG90MTFmSUVFU0VWZXJzaW9uICAgICAgICAgICAgICAgICAgRVNFVmVyc2lvbjsKKwl0RG90MTFmSUVFU0VSYWRNZ210Q2FwICAgICAgICAgICAgICAgRVNFUmFkTWdtdENhcDsKKwl0RG90MTFmSUVFU0VUcmFmU3RybU1ldCAgICAgICAgICAgICAgRVNFVHJhZlN0cm1NZXQ7CisJdERvdDExZklFRVNFVHhtaXRQb3dlciAgICAgICAgICAgICAgIEVTRVR4bWl0UG93ZXI7CisJdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMgICAgICAgICAgIFdzY0JlYWNvblByb2JlUmVzOworCXREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzICAgICAgICAgICBQMlBCZWFjb25Qcm9iZVJlczsKKwl0RG90MTFmSUVWSFRDYXBzICAgICAgICAgICAgICAgICAgICAgVkhUQ2FwczsKKwl0RG90MTFmSUVWSFRPcGVyYXRpb24gICAgICAgICAgICAgICAgVkhUT3BlcmF0aW9uOworCXREb3QxMWZJRVZIVEV4dEJzc0xvYWQgICAgICAgICAgICAgICBWSFRFeHRCc3NMb2FkOworCXREb3QxMWZJRUV4dENhcCAgICAgICAgICAgICAgICAgICAgICBFeHRDYXA7CisJdERvdDExZklFT3BlcmF0aW5nTW9kZSAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7CisJdERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4gICAgICAgIFdpZGVyQldDaGFuU3dpdGNoQW5uOworCXREb3QxMWZJRU9CU1NTY2FuUGFyYW1ldGVycyAgICAgICAgICBPQlNTU2NhblBhcmFtZXRlcnM7CisJdERvdDExZklFVmVuZG9yMUlFICAgICAgICAgICAgICAgICAgIFZlbmRvcjFJRTsKKwl0RG90MTFmSUV2ZW5kb3IyX2llICAgICAgICAgICAgICAgICAgdmVuZG9yMl9pZTsKKwl0RG90MTFmSUVWZW5kb3IzSUUgICAgICAgICAgICAgICAgICAgVmVuZG9yM0lFOworCXREb3QxMWZJRUNoYW5uZWxTd2l0Y2hXcmFwcGVyICAgICAgICBDaGFubmVsU3dpdGNoV3JhcHBlcjsKKwl0RG90MTFmSUVRQ29tVmVuZG9ySUUgICAgICAgICAgICAgICAgUUNvbVZlbmRvcklFOworfSB0RG90MTFmQmVhY29uSUVzOworCisjZGVmaW5lIERPVDExRl9CRUFDT05JRVMgKDkpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfYmVhY29uX2lfZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZCZWFjb25JRXMgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX2JlYWNvbl9pX2VzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkJlYWNvbklFcyAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9iZWFjb25faV9lc19zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkJlYWNvbklFcyAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZDaGFubmVsU3dpdGNoeworCXREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOworCXREb3QxMWZJRUNoYW5Td2l0Y2hBbm4gICAgICAgICAgICAgICBDaGFuU3dpdGNoQW5uOworCXREb3QxMWZJRXNlY19jaGFuX29mZnNldF9lbGUgICAgICAgICBzZWNfY2hhbl9vZmZzZXRfZWxlOworCXREb3QxMWZJRVdpZGVyQldDaGFuU3dpdGNoQW5uICAgICAgICBXaWRlckJXQ2hhblN3aXRjaEFubjsKK30gdERvdDExZkNoYW5uZWxTd2l0Y2g7CisKKyNkZWZpbmUgRE9UMTFGX0NIQU5ORUxTV0lUQ0ggKDEwKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2NoYW5uZWxfc3dpdGNoKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmQ2hhbm5lbFN3aXRjaCAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfY2hhbm5lbF9zd2l0Y2godHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmQ2hhbm5lbFN3aXRjaCAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9jaGFubmVsX3N3aXRjaF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkNoYW5uZWxTd2l0Y2ggKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRGVBdXRoeworCXREb3QxMWZGZlJlYXNvbiAgICAgICAgICAgUmVhc29uOworCXREb3QxMWZJRVAyUERlQXV0aCAgICAgICAgUDJQRGVBdXRoOworfSB0RG90MTFmRGVBdXRoOworCisjZGVmaW5lIERPVDExRl9ERUFVVEggKDExKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2RlX2F1dGgodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZEZUF1dGggKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX2RlX2F1dGgodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmRGVBdXRoICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2RlX2F1dGhfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZEZUF1dGggKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRGVsVFN7CisJdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmVFNJbmZvICAgICAgICAgIFRTSW5mbzsKKwl0RG90MTFmRmZSZWFzb24gICAgICAgICAgUmVhc29uOworfSB0RG90MTFmRGVsVFM7CisKKyNkZWZpbmUgRE9UMTFGX0RFTFRTICgxMikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19kZWxfdHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZEZWxUUyAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfZGVsX3RzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkRlbFRTICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2RlbF90c19zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkRlbFRTICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkRpc2Fzc29jaWF0aW9ueworCXREb3QxMWZGZlJlYXNvbiAgICAgICAgICAgICBSZWFzb247CisJdERvdDExZklFUDJQRGlzQXNzb2MgICAgICAgIFAyUERpc0Fzc29jOworfSB0RG90MTFmRGlzYXNzb2NpYXRpb247CisKKyNkZWZpbmUgRE9UMTFGX0RJU0FTU09DSUFUSU9OICgxMykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19kaXNhc3NvY2lhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZkRpc2Fzc29jaWF0aW9uICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja19kaXNhc3NvY2lhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZEaXNhc3NvY2lhdGlvbiAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9kaXNhc3NvY2lhdGlvbl9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkRpc2Fzc29jaWF0aW9uICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydHsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgQ2F0ZWdvcnk7CisJdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgRGlhbG9nVG9rZW47CisJdERvdDExZkZmVFBDRWxlSUQgICAgICAgICAgIFRQQ0VsZUlEOworCXREb3QxMWZGZlRQQ0VsZUxlbiAgICAgICAgICBUUENFbGVMZW47CisJdERvdDExZkZmVHhQb3dlciAgICAgICAgICAgIFR4UG93ZXI7CisJdERvdDExZkZmTGlua01hcmdpbiAgICAgICAgIExpbmtNYXJnaW47CisJdERvdDExZkZmUnhBbnRlbm5hSWQgICAgICAgIFJ4QW50ZW5uYUlkOworCXREb3QxMWZGZlR4QW50ZW5uYUlkICAgICAgICBUeEFudGVubmFJZDsKKwl0RG90MTFmRmZSQ1BJICAgICAgICAgICAgICAgUkNQSTsKKwl0RG90MTFmRmZSU05JICAgICAgICAgICAgICAgUlNOSTsKK30gdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydDsKKworI2RlZmluZSBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUICgxNCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19saW5rX21lYXN1cmVtZW50X3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfbGlua19tZWFzdXJlbWVudF9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0ICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2xpbmtfbWVhc3VyZW1lbnRfcmVwb3J0X3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0ICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkxpbmtNZWFzdXJlbWVudFJlcXVlc3R7CisJdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmRGlhbG9nVG9rZW4gICAgICAgIERpYWxvZ1Rva2VuOworCXREb3QxMWZGZlR4UG93ZXIgICAgICAgICAgICBUeFBvd2VyOworCXREb3QxMWZGZk1heFR4UG93ZXIgICAgICAgICBNYXhUeFBvd2VyOworfSB0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdDsKKworI2RlZmluZSBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCAoMTUpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfbGlua19tZWFzdXJlbWVudF9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfbGlua19tZWFzdXJlbWVudF9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcXVlc3QgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfbGlua19tZWFzdXJlbWVudF9yZXF1ZXN0X3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZNZWFzdXJlbWVudFJlcG9ydHsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICAgICAgQ2F0ZWdvcnk7CisJdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgICAgRGlhbG9nVG9rZW47CisJdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgICAgICAgIE1lYXN1cmVtZW50UmVwb3J0OworfSB0RG90MTFmTWVhc3VyZW1lbnRSZXBvcnQ7CisKKyNkZWZpbmUgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUICgxNikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19tZWFzdXJlbWVudF9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZNZWFzdXJlbWVudFJlcG9ydCAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfbWVhc3VyZW1lbnRfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZk1lYXN1cmVtZW50UmVwb3J0ICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX21lYXN1cmVtZW50X3JlcG9ydF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZk1lYXN1cmVtZW50UmVwb3J0ICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZk1lYXN1cmVtZW50UmVxdWVzdHsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOworCXREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICAgICAgICAgRGlhbG9nVG9rZW47CisJdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fTWVhc3VyZW1lbnRSZXF1ZXN0OworCXREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCAgICAgICAgTWVhc3VyZW1lbnRSZXF1ZXN0WzRdOworfSB0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0OworCisjZGVmaW5lIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QgKDE3KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX21lYXN1cmVtZW50X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZNZWFzdXJlbWVudFJlcXVlc3QgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX21lYXN1cmVtZW50X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX21lYXN1cmVtZW50X3JlcXVlc3Rfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZNZWFzdXJlbWVudFJlcXVlc3QgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0eworCXREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgQWN0aW9uOworCXREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICBEaWFsb2dUb2tlbjsKKwl0RG90MTFmSUVTU0lEICAgICAgICAgICAgICAgU1NJRDsKK30gdERvdDExZk5laWdoYm9yUmVwb3J0UmVxdWVzdDsKKworI2RlZmluZSBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVFVRVNUICgxOCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19uZWlnaGJvcl9yZXBvcnRfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZk5laWdoYm9yUmVwb3J0UmVxdWVzdCAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfbmVpZ2hib3JfcmVwb3J0X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0ICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX25laWdoYm9yX3JlcG9ydF9yZXF1ZXN0X3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0ICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2V7CisJdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmRGlhbG9nVG9rZW4gICAgICAgICAgIERpYWxvZ1Rva2VuOworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICBudW1fTmVpZ2hib3JSZXBvcnQ7CisJdERvdDExZklFTmVpZ2hib3JSZXBvcnQgICAgICAgIE5laWdoYm9yUmVwb3J0WzE1XTsKK30gdERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2U7CisKKyNkZWZpbmUgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UgKDE5KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX25laWdoYm9yX3JlcG9ydF9yZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2UgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX25laWdoYm9yX3JlcG9ydF9yZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX25laWdoYm9yX3JlcG9ydF9yZXNwb25zZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2UgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmT3BlcmF0aW5nTW9kZXsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmT3BlcmF0aW5nTW9kZSAgICAgICAgT3BlcmF0aW5nTW9kZTsKK30gdERvdDExZk9wZXJhdGluZ01vZGU7CisKKyNkZWZpbmUgRE9UMTFGX09QRVJBVElOR01PREUgKDIwKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX29wZXJhdGluZ19tb2RlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmT3BlcmF0aW5nTW9kZSAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfb3BlcmF0aW5nX21vZGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmT3BlcmF0aW5nTW9kZSAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9vcGVyYXRpbmdfbW9kZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZk9wZXJhdGluZ01vZGUgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmUHJvYmVSZXF1ZXN0eworCXREb3QxMWZJRVNTSUQgICAgICAgICAgICAgICAgIFNTSUQ7CisJdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgICAgU3VwcFJhdGVzOworCXREb3QxMWZJRVJlcXVlc3RlZEluZm8gICAgICAgIFJlcXVlc3RlZEluZm87CisJdERvdDExZklFRXh0U3VwcFJhdGVzICAgICAgICAgRXh0U3VwcFJhdGVzOworCXREb3QxMWZJRURTUGFyYW1zICAgICAgICAgICAgIERTUGFyYW1zOworCXREb3QxMWZJRUhUQ2FwcyAgICAgICAgICAgICAgIEhUQ2FwczsKKwl0RG90MTFmSUVXc2NQcm9iZVJlcSAgICAgICAgICBXc2NQcm9iZVJlcTsKKwl0RG90MTFmSUVXRkFUUEMgICAgICAgICAgICAgICBXRkFUUEM7CisJdERvdDExZklFUDJQUHJvYmVSZXEgICAgICAgICAgUDJQUHJvYmVSZXE7CisJdERvdDExZklFVkhUQ2FwcyAgICAgICAgICAgICAgVkhUQ2FwczsKKwl0RG90MTFmSUVFeHRDYXAgICAgICAgICAgICAgICBFeHRDYXA7Cit9IHREb3QxMWZQcm9iZVJlcXVlc3Q7CisKKyNkZWZpbmUgRE9UMTFGX1BST0JFUkVRVUVTVCAoMjEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfcHJvYmVfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZlByb2JlUmVxdWVzdCAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfcHJvYmVfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZQcm9iZVJlcXVlc3QgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfcHJvYmVfcmVxdWVzdF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlByb2JlUmVxdWVzdCAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZQcm9iZVJlc3BvbnNleworCXREb3QxMWZGZlRpbWVTdGFtcCAgICAgICAgICAgICAgICAgICBUaW1lU3RhbXA7CisJdERvdDExZkZmQmVhY29uSW50ZXJ2YWwgICAgICAgICAgICAgIEJlYWNvbkludGVydmFsOworCXREb3QxMWZGZkNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICBDYXBhYmlsaXRpZXM7CisJdERvdDExZklFU1NJRCAgICAgICAgICAgICAgICAgICAgICAgIFNTSUQ7CisJdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgICAgICAgICAgIFN1cHBSYXRlczsKKwl0RG90MTFmSUVGSFBhcmFtU2V0ICAgICAgICAgICAgICAgICAgRkhQYXJhbVNldDsKKwl0RG90MTFmSUVEU1BhcmFtcyAgICAgICAgICAgICAgICAgICAgRFNQYXJhbXM7CisJdERvdDExZklFQ0ZQYXJhbXMgICAgICAgICAgICAgICAgICAgIENGUGFyYW1zOworCXREb3QxMWZJRUlCU1NQYXJhbXMgICAgICAgICAgICAgICAgICBJQlNTUGFyYW1zOworCXREb3QxMWZJRUNvdW50cnkgICAgICAgICAgICAgICAgICAgICBDb3VudHJ5OworCXREb3QxMWZJRUZIUGFyYW1zICAgICAgICAgICAgICAgICAgICBGSFBhcmFtczsKKwl0RG90MTFmSUVGSFBhdHRUYWJsZSAgICAgICAgICAgICAgICAgRkhQYXR0VGFibGU7CisJdERvdDExZklFUG93ZXJDb25zdHJhaW50cyAgICAgICAgICAgIFBvd2VyQ29uc3RyYWludHM7CisJdERvdDExZklFQ2hhblN3aXRjaEFubiAgICAgICAgICAgICAgIENoYW5Td2l0Y2hBbm47CisJdERvdDExZklFZXh0X2NoYW5fc3dpdGNoX2FubiAgICAgICAgIGV4dF9jaGFuX3N3aXRjaF9hbm47CisJdERvdDExZklFUXVpZXQgICAgICAgICAgICAgICAgICAgICAgIFF1aWV0OworCXREb3QxMWZJRVRQQ1JlcG9ydCAgICAgICAgICAgICAgICAgICBUUENSZXBvcnQ7CisJdERvdDExZklFRVJQSW5mbyAgICAgICAgICAgICAgICAgICAgIEVSUEluZm87CisJdERvdDExZklFRXh0U3VwcFJhdGVzICAgICAgICAgICAgICAgIEV4dFN1cHBSYXRlczsKKwl0RG90MTFmSUVSU05PcGFxdWUgICAgICAgICAgICAgICAgICAgUlNOT3BhcXVlOworCXREb3QxMWZJRVFCU1NMb2FkICAgICAgICAgICAgICAgICAgICBRQlNTTG9hZDsKKwl0RG90MTFmSUVFRENBUGFyYW1TZXQgICAgICAgICAgICAgICAgRURDQVBhcmFtU2V0OworCXREb3QxMWZJRVJSTUVuYWJsZWRDYXAgICAgICAgICAgICAgICBSUk1FbmFibGVkQ2FwOworCXREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCAgICAgICAgICAgICBBUENoYW5uZWxSZXBvcnQ7CisJdERvdDExZklFTW9iaWxpdHlEb21haW4gICAgICAgICAgICAgIE1vYmlsaXR5RG9tYWluOworCXREb3QxMWZJRVdQQSAgICAgICAgICAgICAgICAgICAgICAgICBXUEE7CisJdERvdDExZklFSFRDYXBzICAgICAgICAgICAgICAgICAgICAgIEhUQ2FwczsKKwl0RG90MTFmSUVIVEluZm8gICAgICAgICAgICAgICAgICAgICAgSFRJbmZvOworCXREb3QxMWZJRXNlY19jaGFuX29mZnNldF9lbGUgICAgICAgICBzZWNfY2hhbl9vZmZzZXRfZWxlOworCXREb3QxMWZJRVdNTUluZm9BcCAgICAgICAgICAgICAgICAgICBXTU1JbmZvQXA7CisJdERvdDExZklFV01NUGFyYW1zICAgICAgICAgICAgICAgICAgIFdNTVBhcmFtczsKKwl0RG90MTFmSUVXTU1DYXBzICAgICAgICAgICAgICAgICAgICAgV01NQ2FwczsKKwl0RG90MTFmSUVXQVBJICAgICAgICAgICAgICAgICAgICAgICAgV0FQSTsKKwl0RG90MTFmSUVFU0VSYWRNZ210Q2FwICAgICAgICAgICAgICAgRVNFUmFkTWdtdENhcDsKKwl0RG90MTFmSUVFU0VUcmFmU3RybU1ldCAgICAgICAgICAgICAgRVNFVHJhZlN0cm1NZXQ7CisJdERvdDExZklFRVNFVHhtaXRQb3dlciAgICAgICAgICAgICAgIEVTRVR4bWl0UG93ZXI7CisJdERvdDExZklFV3NjUHJvYmVSZXMgICAgICAgICAgICAgICAgIFdzY1Byb2JlUmVzOworCXREb3QxMWZJRVAyUFByb2JlUmVzICAgICAgICAgICAgICAgICBQMlBQcm9iZVJlczsKKwl0RG90MTFmSUVWSFRDYXBzICAgICAgICAgICAgICAgICAgICAgVkhUQ2FwczsKKwl0RG90MTFmSUVWSFRPcGVyYXRpb24gICAgICAgICAgICAgICAgVkhUT3BlcmF0aW9uOworCXREb3QxMWZJRVZIVEV4dEJzc0xvYWQgICAgICAgICAgICAgICBWSFRFeHRCc3NMb2FkOworCXREb3QxMWZJRUV4dENhcCAgICAgICAgICAgICAgICAgICAgICBFeHRDYXA7CisJdERvdDExZklFT0JTU1NjYW5QYXJhbWV0ZXJzICAgICAgICAgIE9CU1NTY2FuUGFyYW1ldGVyczsKKwl0RG90MTFmSUVWZW5kb3IxSUUgICAgICAgICAgICAgICAgICAgVmVuZG9yMUlFOworCXREb3QxMWZJRXZlbmRvcjJfaWUgICAgICAgICAgICAgICAgICB2ZW5kb3IyX2llOworCXREb3QxMWZJRVZlbmRvcjNJRSAgICAgICAgICAgICAgICAgICBWZW5kb3IzSUU7CisJdERvdDExZklFQ2hhbm5lbFN3aXRjaFdyYXBwZXIgICAgICAgIENoYW5uZWxTd2l0Y2hXcmFwcGVyOworCXREb3QxMWZJRVFDb21WZW5kb3JJRSAgICAgICAgICAgICAgICBRQ29tVmVuZG9ySUU7CisJdERvdDExZklFRVNFVmVyc2lvbiAgICAgICAgICAgICAgICAgIEVTRVZlcnNpb247Cit9IHREb3QxMWZQcm9iZVJlc3BvbnNlOworCisjZGVmaW5lIERPVDExRl9QUk9CRVJFU1BPTlNFICgyMikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19wcm9iZV9yZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZlByb2JlUmVzcG9uc2UgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Byb2JlX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlByb2JlUmVzcG9uc2UgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfcHJvYmVfcmVzcG9uc2Vfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZQcm9iZVJlc3BvbnNlICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlFvc01hcENvbmZpZ3VyZXsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgQWN0aW9uOworCXREb3QxMWZJRVFvc01hcFNldCAgICAgICAgUW9zTWFwU2V0OworfSB0RG90MTFmUW9zTWFwQ29uZmlndXJlOworCisjZGVmaW5lIERPVDExRl9RT1NNQVBDT05GSUdVUkUgKDIzKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Fvc19tYXBfY29uZmlndXJlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmUW9zTWFwQ29uZmlndXJlICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja19xb3NfbWFwX2NvbmZpZ3VyZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZRb3NNYXBDb25maWd1cmUgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfcW9zX21hcF9jb25maWd1cmVfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZRb3NNYXBDb25maWd1cmUgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydHsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICAgICAgQ2F0ZWdvcnk7CisJdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgICAgRGlhbG9nVG9rZW47CisJdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9NZWFzdXJlbWVudFJlcG9ydDsKKwl0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCAgICAgICAgTWVhc3VyZW1lbnRSZXBvcnRbNF07Cit9IHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVwb3J0OworCisjZGVmaW5lIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUICgyNCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19yYWRpb19tZWFzdXJlbWVudF9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVwb3J0ICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja19yYWRpb19tZWFzdXJlbWVudF9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydCAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9yYWRpb19tZWFzdXJlbWVudF9yZXBvcnRfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVwb3J0ICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0eworCXREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnk7CisJdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmRGlhbG9nVG9rZW4gICAgICAgICAgICAgICBEaWFsb2dUb2tlbjsKKwl0RG90MTFmRmZOdW1PZlJlcGV0aXRpb25zICAgICAgICAgIE51bU9mUmVwZXRpdGlvbnM7CisJdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fTWVhc3VyZW1lbnRSZXF1ZXN0OworCXREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCAgICAgICAgTWVhc3VyZW1lbnRSZXF1ZXN0WzJdOworfSB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3Q7CisKKyNkZWZpbmUgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUICgyNSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19yYWRpb19tZWFzdXJlbWVudF9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX3JhZGlvX21lYXN1cmVtZW50X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfcmFkaW9fbWVhc3VyZW1lbnRfcmVxdWVzdF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlJlQXNzb2NSZXF1ZXN0eworCXREb3QxMWZGZkNhcGFiaWxpdGllcyAgICAgICAgICAgICAgQ2FwYWJpbGl0aWVzOworCXREb3QxMWZGZkxpc3RlbkludGVydmFsICAgICAgICAgICAgTGlzdGVuSW50ZXJ2YWw7CisJdERvdDExZkZmQ3VycmVudEFQQWRkcmVzcyAgICAgICAgICBDdXJyZW50QVBBZGRyZXNzOworCXREb3QxMWZJRVNTSUQgICAgICAgICAgICAgICAgICAgICAgU1NJRDsKKwl0RG90MTFmSUVTdXBwUmF0ZXMgICAgICAgICAgICAgICAgIFN1cHBSYXRlczsKKwl0RG90MTFmSUVFeHRTdXBwUmF0ZXMgICAgICAgICAgICAgIEV4dFN1cHBSYXRlczsKKwl0RG90MTFmSUVQb3dlckNhcHMgICAgICAgICAgICAgICAgIFBvd2VyQ2FwczsKKwl0RG90MTFmSUVTdXBwQ2hhbm5lbHMgICAgICAgICAgICAgIFN1cHBDaGFubmVsczsKKwl0RG90MTFmSUVSU05PcGFxdWUgICAgICAgICAgICAgICAgIFJTTk9wYXF1ZTsKKwl0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiAgICAgICAgICAgIFFPU0NhcHNTdGF0aW9uOworCXREb3QxMWZJRVJSTUVuYWJsZWRDYXAgICAgICAgICAgICAgUlJNRW5hYmxlZENhcDsKKwl0RG90MTFmSUVNb2JpbGl0eURvbWFpbiAgICAgICAgICAgIE1vYmlsaXR5RG9tYWluOworCXREb3QxMWZJRUZUSW5mbyAgICAgICAgICAgICAgICAgICAgRlRJbmZvOworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX1JJQ0RhdGFEZXNjOworCXREb3QxMWZJRVJJQ0RhdGFEZXNjICAgICAgICAgICAgICAgUklDRGF0YURlc2NbMl07CisJdERvdDExZklFV1BBT3BhcXVlICAgICAgICAgICAgICAgICBXUEFPcGFxdWU7CisJdERvdDExZklFSFRDYXBzICAgICAgICAgICAgICAgICAgICBIVENhcHM7CisJdERvdDExZklFV01NQ2FwcyAgICAgICAgICAgICAgICAgICBXTU1DYXBzOworCXREb3QxMWZJRVdNTUluZm9TdGF0aW9uICAgICAgICAgICAgV01NSW5mb1N0YXRpb247CisJdERvdDExZklFV3NjSUVPcGFxdWUgICAgICAgICAgICAgICBXc2NJRU9wYXF1ZTsKKwl0RG90MTFmSUVXQVBJT3BhcXVlICAgICAgICAgICAgICAgIFdBUElPcGFxdWU7CisJdERvdDExZklFV0FQSSAgICAgICAgICAgICAgICAgICAgICBXQVBJOworCXREb3QxMWZJRUVTRVJhZE1nbXRDYXAgICAgICAgICAgICAgRVNFUmFkTWdtdENhcDsKKwl0RG90MTFmSUVFU0VWZXJzaW9uICAgICAgICAgICAgICAgIEVTRVZlcnNpb247CisJdERvdDExZklFRVNFQ2NrbU9wYXF1ZSAgICAgICAgICAgICBFU0VDY2ttT3BhcXVlOworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX1dNTVRTUEVDOworCXREb3QxMWZJRVdNTVRTUEVDICAgICAgICAgICAgICAgICAgV01NVFNQRUNbNF07CisJdERvdDExZklFRVNFVHJhZlN0cm1SYXRlU2V0ICAgICAgICBFU0VUcmFmU3RybVJhdGVTZXQ7CisJdERvdDExZklFUDJQSUVPcGFxdWUgICAgICAgICAgICAgICBQMlBJRU9wYXF1ZTsKKwl0RG90MTFmSUVXRkRJRU9wYXF1ZSAgICAgICAgICAgICAgIFdGRElFT3BhcXVlOworCXREb3QxMWZJRVZIVENhcHMgICAgICAgICAgICAgICAgICAgVkhUQ2FwczsKKwl0RG90MTFmSUVFeHRDYXAgICAgICAgICAgICAgICAgICAgIEV4dENhcDsKKwl0RG90MTFmSUVPcGVyYXRpbmdNb2RlICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7CisJdERvdDExZklFUW9zTWFwU2V0ICAgICAgICAgICAgICAgICBRb3NNYXBTZXQ7CisJdERvdDExZklFdmVuZG9yMl9pZSAgICAgICAgICAgICAgICB2ZW5kb3IyX2llOworfSB0RG90MTFmUmVBc3NvY1JlcXVlc3Q7CisKKyNkZWZpbmUgRE9UMTFGX1JFQVNTT0NSRVFVRVNUICgyNikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19yZV9hc3NvY19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmUmVBc3NvY1JlcXVlc3QgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX3JlX2Fzc29jX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmUmVBc3NvY1JlcXVlc3QgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfcmVfYXNzb2NfcmVxdWVzdF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlJlQXNzb2NSZXF1ZXN0ICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlJlQXNzb2NSZXNwb25zZXsKKwl0RG90MTFmRmZDYXBhYmlsaXRpZXMgICAgICAgICAgICAgIENhcGFiaWxpdGllczsKKwl0RG90MTFmRmZTdGF0dXMgICAgICAgICAgICAgICAgICAgIFN0YXR1czsKKwl0RG90MTFmRmZBSUQgICAgICAgICAgICAgICAgICAgICAgIEFJRDsKKwl0RG90MTFmSUVTdXBwUmF0ZXMgICAgICAgICAgICAgICAgIFN1cHBSYXRlczsKKwl0RG90MTFmSUVFeHRTdXBwUmF0ZXMgICAgICAgICAgICAgIEV4dFN1cHBSYXRlczsKKwl0RG90MTFmSUVFRENBUGFyYW1TZXQgICAgICAgICAgICAgIEVEQ0FQYXJhbVNldDsKKwl0RG90MTFmSUVSQ1BJSUUgICAgICAgICAgICAgICAgICAgIFJDUElJRTsKKwl0RG90MTFmSUVSU05JSUUgICAgICAgICAgICAgICAgICAgIFJTTklJRTsKKwl0RG90MTFmSUVSUk1FbmFibGVkQ2FwICAgICAgICAgICAgIFJSTUVuYWJsZWRDYXA7CisJdERvdDExZklFUlNOT3BhcXVlICAgICAgICAgICAgICAgICBSU05PcGFxdWU7CisJdERvdDExZklFTW9iaWxpdHlEb21haW4gICAgICAgICAgICBNb2JpbGl0eURvbWFpbjsKKwl0RG90MTFmSUVGVEluZm8gICAgICAgICAgICAgICAgICAgIEZUSW5mbzsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9SSUNEYXRhRGVzYzsKKwl0RG90MTFmSUVSSUNEYXRhRGVzYyAgICAgICAgICAgICAgIFJJQ0RhdGFEZXNjWzJdOworCXREb3QxMWZJRVdQQSAgICAgICAgICAgICAgICAgICAgICAgV1BBOworCXREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCAgICAgICAgICAgVGltZW91dEludGVydmFsOworCXREb3QxMWZJRUhUQ2FwcyAgICAgICAgICAgICAgICAgICAgSFRDYXBzOworCXREb3QxMWZJRUhUSW5mbyAgICAgICAgICAgICAgICAgICAgSFRJbmZvOworCXREb3QxMWZJRVdNTVBhcmFtcyAgICAgICAgICAgICAgICAgV01NUGFyYW1zOworCXREb3QxMWZJRUVTRVJhZE1nbXRDYXAgICAgICAgICAgICAgRVNFUmFkTWdtdENhcDsKKwl0RG90MTFmSUVFU0VUcmFmU3RybU1ldCAgICAgICAgICAgIEVTRVRyYWZTdHJtTWV0OworCXREb3QxMWZJRUVTRVR4bWl0UG93ZXIgICAgICAgICAgICAgRVNFVHhtaXRQb3dlcjsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9XTU1UU1BFQzsKKwl0RG90MTFmSUVXTU1UU1BFQyAgICAgICAgICAgICAgICAgIFdNTVRTUEVDWzRdOworCXREb3QxMWZJRUVTRVRyYWZTdHJtUmF0ZVNldCAgICAgICAgRVNFVHJhZlN0cm1SYXRlU2V0OworCXREb3QxMWZJRVdzY1JlYXNzb2NSZXMgICAgICAgICAgICAgV3NjUmVhc3NvY1JlczsKKwl0RG90MTFmSUVQMlBBc3NvY1JlcyAgICAgICAgICAgICAgIFAyUEFzc29jUmVzOworCXREb3QxMWZJRVZIVENhcHMgICAgICAgICAgICAgICAgICAgVkhUQ2FwczsKKwl0RG90MTFmSUVWSFRPcGVyYXRpb24gICAgICAgICAgICAgIFZIVE9wZXJhdGlvbjsKKwl0RG90MTFmSUVFeHRDYXAgICAgICAgICAgICAgICAgICAgIEV4dENhcDsKKwl0RG90MTFmSUVPQlNTU2NhblBhcmFtZXRlcnMgICAgICAgIE9CU1NTY2FuUGFyYW1ldGVyczsKKwl0RG90MTFmSUVRb3NNYXBTZXQgICAgICAgICAgICAgICAgIFFvc01hcFNldDsKKwl0RG90MTFmSUV2ZW5kb3IyX2llICAgICAgICAgICAgICAgIHZlbmRvcjJfaWU7Cit9IHREb3QxMWZSZUFzc29jUmVzcG9uc2U7CisKKyNkZWZpbmUgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSAoMjcpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfcmVfYXNzb2NfcmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZSZUFzc29jUmVzcG9uc2UgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX3JlX2Fzc29jX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlJlQXNzb2NSZXNwb25zZSAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9yZV9hc3NvY19yZXNwb25zZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlJlQXNzb2NSZXNwb25zZSAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZTTVBvd2VyU2F2ZXsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICAgQ2F0ZWdvcnk7CisJdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZTTVBvd2VyTW9kZVNldCAgICAgICAgU01Qb3dlck1vZGVTZXQ7Cit9IHREb3QxMWZTTVBvd2VyU2F2ZTsKKworI2RlZmluZSBET1QxMUZfU01QT1dFUlNBVkUgKDI4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3NtX3Bvd2VyX3NhdmUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZTTVBvd2VyU2F2ZSAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfc21fcG93ZXJfc2F2ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZTTVBvd2VyU2F2ZSAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9zbV9wb3dlcl9zYXZlX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmU01Qb3dlclNhdmUgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmU2FRdWVyeVJlcXsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmVHJhbnNhY3Rpb25JZCAgICAgICAgVHJhbnNhY3Rpb25JZDsKK30gdERvdDExZlNhUXVlcnlSZXE7CisKKyNkZWZpbmUgRE9UMTFGX1NBUVVFUllSRVEgKDI5KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3NhX3F1ZXJ5X3JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZlNhUXVlcnlSZXEgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX3NhX3F1ZXJ5X3JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZTYVF1ZXJ5UmVxICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3NhX3F1ZXJ5X3JlcV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlNhUXVlcnlSZXEgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmU2FRdWVyeVJzcHsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmVHJhbnNhY3Rpb25JZCAgICAgICAgVHJhbnNhY3Rpb25JZDsKK30gdERvdDExZlNhUXVlcnlSc3A7CisKKyNkZWZpbmUgRE9UMTFGX1NBUVVFUllSU1AgKDMwKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3NhX3F1ZXJ5X3JzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZlNhUXVlcnlSc3AgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX3NhX3F1ZXJ5X3JzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZTYVF1ZXJ5UnNwICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3NhX3F1ZXJ5X3JzcF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlNhUXVlcnlSc3AgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVERMU0Rpc1JlcXsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICAgQ2F0ZWdvcnk7CisJdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgRGlhbG9nVG9rZW47CisJdERvdDExZklFTGlua0lkZW50aWZpZXIgICAgICAgIExpbmtJZGVudGlmaWVyOworfSB0RG90MTFmVERMU0Rpc1JlcTsKKworI2RlZmluZSBET1QxMUZfVERMU0RJU1JFUSAoMzEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGRsc19kaXNfcmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmVERMU0Rpc1JlcSAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfdGRsc19kaXNfcmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNEaXNSZXEgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGRsc19kaXNfcmVxX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVERMU0Rpc1JlcSAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZURExTRGlzUnNweworCXREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgICAgICAgICBEaWFsb2dUb2tlbjsKKwl0RG90MTFmRmZDYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICBDYXBhYmlsaXRpZXM7CisJdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgICAgICAgICAgICAgU3VwcFJhdGVzOworCXREb3QxMWZJRUV4dFN1cHBSYXRlcyAgICAgICAgICAgICAgICAgIEV4dFN1cHBSYXRlczsKKwl0RG90MTFmSUVTdXBwQ2hhbm5lbHMgICAgICAgICAgICAgICAgICBTdXBwQ2hhbm5lbHM7CisJdERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMgICAgICAgICAgU3VwcE9wZXJhdGluZ0NsYXNzZXM7CisJdERvdDExZklFUlNOICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOOworCXREb3QxMWZJRUV4dENhcCAgICAgICAgICAgICAgICAgICAgICAgIEV4dENhcDsKKwl0RG90MTFmSUVGVEluZm8gICAgICAgICAgICAgICAgICAgICAgICBGVEluZm87CisJdERvdDExZklFVGltZW91dEludGVydmFsICAgICAgICAgICAgICAgVGltZW91dEludGVydmFsOworCXREb3QxMWZJRVJJQ0RhdGEgICAgICAgICAgICAgICAgICAgICAgIFJJQ0RhdGE7CisJdERvdDExZklFSFRDYXBzICAgICAgICAgICAgICAgICAgICAgICAgSFRDYXBzOworCXREb3QxMWZJRWh0MjA0MF9ic3NfY29leGlzdGVuY2UgICAgICAgIGh0MjA0MF9ic3NfY29leGlzdGVuY2U7CisJdERvdDExZklFTGlua0lkZW50aWZpZXIgICAgICAgICAgICAgICAgTGlua0lkZW50aWZpZXI7CisJdERvdDExZklFVkhUQ2FwcyAgICAgICAgICAgICAgICAgICAgICAgVkhUQ2FwczsKK30gdERvdDExZlRETFNEaXNSc3A7CisKKyNkZWZpbmUgRE9UMTFGX1RETFNESVNSU1AgKDMyKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3RkbHNfZGlzX3JzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZlRETFNEaXNSc3AgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX3RkbHNfZGlzX3JzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTRGlzUnNwICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3RkbHNfZGlzX3JzcF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNEaXNSc3AgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVERMU1BlZXJUcmFmZmljSW5keworCXREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICAgQWN0aW9uOworCXREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICAgICBEaWFsb2dUb2tlbjsKKwl0RG90MTFmSUVMaW5rSWRlbnRpZmllciAgICAgICAgTGlua0lkZW50aWZpZXI7CisJdERvdDExZklFUFRJQ29udHJvbCAgICAgICAgICAgIFBUSUNvbnRyb2w7CisJdERvdDExZklFUFVCdWZmZXJTdGF0dXMgICAgICAgIFBVQnVmZmVyU3RhdHVzOworfSB0RG90MTFmVERMU1BlZXJUcmFmZmljSW5kOworCisjZGVmaW5lIERPVDExRl9URExTUEVFUlRSQUZGSUNJTkQgKDMzKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3RkbHNfcGVlcl90cmFmZmljX2luZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZlRETFNQZWVyVHJhZmZpY0luZCAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfdGRsc19wZWVyX3RyYWZmaWNfaW5kKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNQZWVyVHJhZmZpY0luZCAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90ZGxzX3BlZXJfdHJhZmZpY19pbmRfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTUGVlclRyYWZmaWNJbmQgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVERMU1BlZXJUcmFmZmljUnNweworCXREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICAgQWN0aW9uOworCXREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICAgICBEaWFsb2dUb2tlbjsKKwl0RG90MTFmSUVMaW5rSWRlbnRpZmllciAgICAgICAgTGlua0lkZW50aWZpZXI7Cit9IHREb3QxMWZURExTUGVlclRyYWZmaWNSc3A7CisKKyNkZWZpbmUgRE9UMTFGX1RETFNQRUVSVFJBRkZJQ1JTUCAoMzQpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGRsc19wZWVyX3RyYWZmaWNfcnNwKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmVERMU1BlZXJUcmFmZmljUnNwICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja190ZGxzX3BlZXJfdHJhZmZpY19yc3AodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVERMU1BlZXJUcmFmZmljUnNwICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3RkbHNfcGVlcl90cmFmZmljX3JzcF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNQZWVyVHJhZmZpY1JzcCAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZURExTU2V0dXBDbmZ7CisJdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZTdGF0dXMgICAgICAgICAgICAgICAgIFN0YXR1czsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgIERpYWxvZ1Rva2VuOworCXREb3QxMWZJRVJTTiAgICAgICAgICAgICAgICAgICAgUlNOOworCXREb3QxMWZJRUVEQ0FQYXJhbVNldCAgICAgICAgICAgRURDQVBhcmFtU2V0OworCXREb3QxMWZJRUZUSW5mbyAgICAgICAgICAgICAgICAgRlRJbmZvOworCXREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCAgICAgICAgVGltZW91dEludGVydmFsOworCXREb3QxMWZJRUhUSW5mbyAgICAgICAgICAgICAgICAgSFRJbmZvOworCXREb3QxMWZJRUxpbmtJZGVudGlmaWVyICAgICAgICAgTGlua0lkZW50aWZpZXI7CisJdERvdDExZklFV01NUGFyYW1zICAgICAgICAgICAgICBXTU1QYXJhbXM7CisJdERvdDExZklFVkhUT3BlcmF0aW9uICAgICAgICAgICBWSFRPcGVyYXRpb247CisJdERvdDExZklFT3BlcmF0aW5nTW9kZSAgICAgICAgICBPcGVyYXRpbmdNb2RlOworfSB0RG90MTFmVERMU1NldHVwQ25mOworCisjZGVmaW5lIERPVDExRl9URExTU0VUVVBDTkYgKDM1KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3RkbHNfc2V0dXBfY25mKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmVERMU1NldHVwQ25mICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja190ZGxzX3NldHVwX2NuZih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTU2V0dXBDbmYgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGRsc19zZXR1cF9jbmZfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTU2V0dXBDbmYgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVERMU1NldHVwUmVxeworCXREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgICAgICAgICBEaWFsb2dUb2tlbjsKKwl0RG90MTFmRmZDYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICBDYXBhYmlsaXRpZXM7CisJdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgICAgICAgICAgICAgU3VwcFJhdGVzOworCXREb3QxMWZJRUNvdW50cnkgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnk7CisJdERvdDExZklFRXh0U3VwcFJhdGVzICAgICAgICAgICAgICAgICAgRXh0U3VwcFJhdGVzOworCXREb3QxMWZJRVN1cHBDaGFubmVscyAgICAgICAgICAgICAgICAgIFN1cHBDaGFubmVsczsKKwl0RG90MTFmSUVSU04gICAgICAgICAgICAgICAgICAgICAgICAgICBSU047CisJdERvdDExZklFRXh0Q2FwICAgICAgICAgICAgICAgICAgICAgICAgRXh0Q2FwOworCXREb3QxMWZJRVN1cHBPcGVyYXRpbmdDbGFzc2VzICAgICAgICAgIFN1cHBPcGVyYXRpbmdDbGFzc2VzOworCXREb3QxMWZJRVFPU0NhcHNTdGF0aW9uICAgICAgICAgICAgICAgIFFPU0NhcHNTdGF0aW9uOworCXREb3QxMWZJRUZUSW5mbyAgICAgICAgICAgICAgICAgICAgICAgIEZUSW5mbzsKKwl0RG90MTFmSUVUaW1lb3V0SW50ZXJ2YWwgICAgICAgICAgICAgICBUaW1lb3V0SW50ZXJ2YWw7CisJdERvdDExZklFUklDRGF0YSAgICAgICAgICAgICAgICAgICAgICAgUklDRGF0YTsKKwl0RG90MTFmSUVIVENhcHMgICAgICAgICAgICAgICAgICAgICAgICBIVENhcHM7CisJdERvdDExZklFaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSAgICAgICAgaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZTsKKwl0RG90MTFmSUVMaW5rSWRlbnRpZmllciAgICAgICAgICAgICAgICBMaW5rSWRlbnRpZmllcjsKKwl0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiAgICAgICAgICAgICAgICBXTU1JbmZvU3RhdGlvbjsKKwl0RG90MTFmSUVBSUQgICAgICAgICAgICAgICAgICAgICAgICAgICBBSUQ7CisJdERvdDExZklFVkhUQ2FwcyAgICAgICAgICAgICAgICAgICAgICAgVkhUQ2FwczsKK30gdERvdDExZlRETFNTZXR1cFJlcTsKKworI2RlZmluZSBET1QxMUZfVERMU1NFVFVQUkVRICgzNikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja190ZGxzX3NldHVwX3JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZlRETFNTZXR1cFJlcSAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfdGRsc19zZXR1cF9yZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVERMU1NldHVwUmVxICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3RkbHNfc2V0dXBfcmVxX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVERMU1NldHVwUmVxICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRETFNTZXR1cFJzcHsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzOworCXREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICAgICAgICAgICAgIERpYWxvZ1Rva2VuOworCXREb3QxMWZGZkNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgIENhcGFiaWxpdGllczsKKwl0RG90MTFmSUVTdXBwUmF0ZXMgICAgICAgICAgICAgICAgICAgICBTdXBwUmF0ZXM7CisJdERvdDExZklFQ291bnRyeSAgICAgICAgICAgICAgICAgICAgICAgQ291bnRyeTsKKwl0RG90MTFmSUVFeHRTdXBwUmF0ZXMgICAgICAgICAgICAgICAgICBFeHRTdXBwUmF0ZXM7CisJdERvdDExZklFU3VwcENoYW5uZWxzICAgICAgICAgICAgICAgICAgU3VwcENoYW5uZWxzOworCXREb3QxMWZJRVJTTiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTjsKKwl0RG90MTFmSUVFeHRDYXAgICAgICAgICAgICAgICAgICAgICAgICBFeHRDYXA7CisJdERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMgICAgICAgICAgU3VwcE9wZXJhdGluZ0NsYXNzZXM7CisJdERvdDExZklFUU9TQ2Fwc1N0YXRpb24gICAgICAgICAgICAgICAgUU9TQ2Fwc1N0YXRpb247CisJdERvdDExZklFRlRJbmZvICAgICAgICAgICAgICAgICAgICAgICAgRlRJbmZvOworCXREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCAgICAgICAgICAgICAgIFRpbWVvdXRJbnRlcnZhbDsKKwl0RG90MTFmSUVSSUNEYXRhICAgICAgICAgICAgICAgICAgICAgICBSSUNEYXRhOworCXREb3QxMWZJRUhUQ2FwcyAgICAgICAgICAgICAgICAgICAgICAgIEhUQ2FwczsKKwl0RG90MTFmSUVodDIwNDBfYnNzX2NvZXhpc3RlbmNlICAgICAgICBodDIwNDBfYnNzX2NvZXhpc3RlbmNlOworCXREb3QxMWZJRUxpbmtJZGVudGlmaWVyICAgICAgICAgICAgICAgIExpbmtJZGVudGlmaWVyOworCXREb3QxMWZJRVdNTUluZm9TdGF0aW9uICAgICAgICAgICAgICAgIFdNTUluZm9TdGF0aW9uOworCXREb3QxMWZJRUFJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFJRDsKKwl0RG90MTFmSUVWSFRDYXBzICAgICAgICAgICAgICAgICAgICAgICBWSFRDYXBzOworCXREb3QxMWZJRU9wZXJhdGluZ01vZGUgICAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7Cit9IHREb3QxMWZURExTU2V0dXBSc3A7CisKKyNkZWZpbmUgRE9UMTFGX1RETFNTRVRVUFJTUCAoMzcpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGRsc19zZXR1cF9yc3AodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZURExTU2V0dXBSc3AgKiBwRnJtKTsKK3VpbnQzMl90IGRvdDExZl9wYWNrX3RkbHNfc2V0dXBfcnNwKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNTZXR1cFJzcCAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90ZGxzX3NldHVwX3JzcF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNTZXR1cFJzcCAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZURExTVGVhcmRvd257CisJdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmUmVhc29uICAgICAgICAgICAgICAgIFJlYXNvbjsKKwl0RG90MTFmSUVGVEluZm8gICAgICAgICAgICAgICAgRlRJbmZvOworCXREb3QxMWZJRUxpbmtJZGVudGlmaWVyICAgICAgICBMaW5rSWRlbnRpZmllcjsKK30gdERvdDExZlRETFNUZWFyZG93bjsKKworI2RlZmluZSBET1QxMUZfVERMU1RFQVJET1dOICgzOCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja190ZGxzX3RlYXJkb3duKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmVERMU1RlYXJkb3duICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja190ZGxzX3RlYXJkb3duKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNUZWFyZG93biAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90ZGxzX3RlYXJkb3duX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVERMU1RlYXJkb3duICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRQQ1JlcG9ydHsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgQ2F0ZWdvcnk7CisJdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgRGlhbG9nVG9rZW47CisJdERvdDExZklFVFBDUmVwb3J0ICAgICAgICAgIFRQQ1JlcG9ydDsKK30gdERvdDExZlRQQ1JlcG9ydDsKKworI2RlZmluZSBET1QxMUZfVFBDUkVQT1JUICgzOSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja190cGNfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmVFBDUmVwb3J0ICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja190cGNfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRQQ1JlcG9ydCAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90cGNfcmVwb3J0X3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVFBDUmVwb3J0ICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRQQ1JlcXVlc3R7CisJdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmRGlhbG9nVG9rZW4gICAgICAgIERpYWxvZ1Rva2VuOworCXREb3QxMWZJRVRQQ1JlcXVlc3QgICAgICAgICBUUENSZXF1ZXN0OworfSB0RG90MTFmVFBDUmVxdWVzdDsKKworI2RlZmluZSBET1QxMUZfVFBDUkVRVUVTVCAoNDApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdHBjX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZUUENSZXF1ZXN0ICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja190cGNfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZUUENSZXF1ZXN0ICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3RwY19yZXF1ZXN0X3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVFBDUmVxdWVzdCAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUaW1pbmdBZHZlcnRpc2VtZW50RnJhbWV7CisJdERvdDExZkZmVGltZVN0YW1wICAgICAgICAgICAgICAgIFRpbWVTdGFtcDsKKwl0RG90MTFmRmZDYXBhYmlsaXRpZXMgICAgICAgICAgICAgQ2FwYWJpbGl0aWVzOworCXREb3QxMWZJRUNvdW50cnkgICAgICAgICAgICAgICAgICBDb3VudHJ5OworCXREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgICAgICAgICBQb3dlckNvbnN0cmFpbnRzOworCXREb3QxMWZJRVRpbWVBZHZlcnRpc2VtZW50ICAgICAgICBUaW1lQWR2ZXJ0aXNlbWVudDsKKwl0RG90MTFmSUVFeHRDYXAgICAgICAgICAgICAgICAgICAgRXh0Q2FwOworCXREb3QxMWZJRVZlbmRvcjFJRSAgICAgICAgICAgICAgICBWZW5kb3IxSUU7CisJdERvdDExZklFVmVuZG9yM0lFICAgICAgICAgICAgICAgIFZlbmRvcjNJRTsKK30gdERvdDExZlRpbWluZ0FkdmVydGlzZW1lbnRGcmFtZTsKKworI2RlZmluZSBET1QxMUZfVElNSU5HQURWRVJUSVNFTUVOVEZSQU1FICg0MSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja190aW1pbmdfYWR2ZXJ0aXNlbWVudF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZlRpbWluZ0FkdmVydGlzZW1lbnRGcmFtZSAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfdGltaW5nX2FkdmVydGlzZW1lbnRfZnJhbWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3RpbWluZ19hZHZlcnRpc2VtZW50X2ZyYW1lX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lICpwRnJtLAorCXVpbnQzMl90ICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlZIVEdpZE1hbmFnZW1lbnRBY3Rpb25GcmFtZXsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOworCXREb3QxMWZGZlZodE1lbWJlcnNoaXBTdGF0dXNBcnJheSAgICAgICAgVmh0TWVtYmVyc2hpcFN0YXR1c0FycmF5OworCXREb3QxMWZGZlZodFVzZXJQb3NpdGlvbkFycmF5ICAgICAgICAgICAgVmh0VXNlclBvc2l0aW9uQXJyYXk7Cit9IHREb3QxMWZWSFRHaWRNYW5hZ2VtZW50QWN0aW9uRnJhbWU7CisKKyNkZWZpbmUgRE9UMTFGX1ZIVEdJRE1BTkFHRU1FTlRBQ1RJT05GUkFNRSAoNDIpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdmh0X2dpZF9tYW5hZ2VtZW50X2FjdGlvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZlZIVEdpZE1hbmFnZW1lbnRBY3Rpb25GcmFtZSAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfdmh0X2dpZF9tYW5hZ2VtZW50X2FjdGlvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZWSFRHaWRNYW5hZ2VtZW50QWN0aW9uRnJhbWUgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdmh0X2dpZF9tYW5hZ2VtZW50X2FjdGlvbl9mcmFtZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlZIVEdpZE1hbmFnZW1lbnRBY3Rpb25GcmFtZSAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZXTU1BZGRUU1JlcXVlc3R7CisJdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgICAgICAgICBDYXRlZ29yeTsKKwl0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgICAgIERpYWxvZ1Rva2VuOworCXREb3QxMWZGZlN0YXR1c0NvZGUgICAgICAgICAgICAgICAgU3RhdHVzQ29kZTsKKwl0RG90MTFmSUVXTU1UU1BFQyAgICAgICAgICAgICAgICAgIFdNTVRTUEVDOworCXREb3QxMWZJRUVTRVRyYWZTdHJtUmF0ZVNldCAgICAgICAgRVNFVHJhZlN0cm1SYXRlU2V0OworfSB0RG90MTFmV01NQWRkVFNSZXF1ZXN0OworCisjZGVmaW5lIERPVDExRl9XTU1BRERUU1JFUVVFU1QgKDQzKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3dtbV9hZGRfdHNfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZldNTUFkZFRTUmVxdWVzdCAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfd21tX2FkZF90c19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZldNTUFkZFRTUmVxdWVzdCAqcEZybSwgdWludDhfdCAqcEJ1ZiwKKwl1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCk7Cit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF93bW1fYWRkX3RzX3JlcXVlc3Rfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZXTU1BZGRUU1JlcXVlc3QgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmV01NQWRkVFNSZXNwb25zZXsKKwl0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICAgQ2F0ZWdvcnk7CisJdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgRGlhbG9nVG9rZW47CisJdERvdDExZkZmU3RhdHVzQ29kZSAgICAgICAgICAgIFN0YXR1c0NvZGU7CisJdERvdDExZklFV01NVFNQRUMgICAgICAgICAgICAgIFdNTVRTUEVDOworCXREb3QxMWZJRUVTRVRyYWZTdHJtTWV0ICAgICAgICBFU0VUcmFmU3RybU1ldDsKK30gdERvdDExZldNTUFkZFRTUmVzcG9uc2U7CisKKyNkZWZpbmUgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UgKDQ0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3dtbV9hZGRfdHNfcmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCXREb3QxMWZXTU1BZGRUU1Jlc3BvbnNlICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja193bW1fYWRkX3RzX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZldNTUFkZFRTUmVzcG9uc2UgKnBGcm0sIHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpOwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfd21tX2FkZF90c19yZXNwb25zZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZldNTUFkZFRTUmVzcG9uc2UgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmV01NRGVsVFN7CisJdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICBBY3Rpb247CisJdERvdDExZkZmRGlhbG9nVG9rZW4gICAgICAgIERpYWxvZ1Rva2VuOworCXREb3QxMWZGZlN0YXR1c0NvZGUgICAgICAgICBTdGF0dXNDb2RlOworCXREb3QxMWZJRVdNTVRTUEVDICAgICAgICAgICBXTU1UU1BFQzsKK30gdERvdDExZldNTURlbFRTOworCisjZGVmaW5lIERPVDExRl9XTU1ERUxUUyAoNDUpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfd21tX2RlbF90cyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJdERvdDExZldNTURlbFRTICogcEZybSk7Cit1aW50MzJfdCBkb3QxMWZfcGFja193bW1fZGVsX3RzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZldNTURlbFRTICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3dtbV9kZWxfdHNfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZXTU1EZWxUUyAqcEZybSwKKwl1aW50MzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZodDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1leworCXREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5OworCXREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjsKKwl0RG90MTFmSUVodDIwNDBfYnNzX2NvZXhpc3RlbmNlICAgICAgICAgICAgICBodDIwNDBfYnNzX2NvZXhpc3RlbmNlOworCXREb3QxMWZJRWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQgICAgICAgIGh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQ7Cit9IHREb3QxMWZodDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lOworCisjZGVmaW5lIERPVDExRl9IVDIwNDBfQlNTX0NPRVhJU1RFTkNFX01HTVRfQUNUSU9OX0ZSQU1FICg0NikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19odDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwl0RG90MTFmaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZV9tZ210X2FjdGlvbl9mcmFtZSAqIHBGcm0pOwordWludDMyX3QgZG90MTFmX3BhY2tfaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZV9tZ210X2FjdGlvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZodDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lICpwRnJtLCB1aW50OF90ICpwQnVmLAorCXVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKTsKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2h0MjA0MF9ic3NfY29leGlzdGVuY2VfbWdtdF9hY3Rpb25fZnJhbWVTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZmh0MjA0MF9ic3NfY29leGlzdGVuY2VfbWdtdF9hY3Rpb25fZnJhbWUgKnBGcm0sCisJdWludDMyX3QgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisjZW5kaWYgLyogRE9UMTFGX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9pbmNsdWRlL2RwaF9nbG9iYWwuaCBiL2NvcmUvbWFjL3NyYy9pbmNsdWRlL2RwaF9nbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU5MGRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL2luY2x1ZGUvZHBoX2dsb2JhbC5oCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorCisgKgorCisgKiBBdXRob3I6ICAgICAgU2FuZGVzaCBHb2VsCisKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorCisgKiBIaXN0b3J5Oi0KKworICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKgorCisgKi8KKworI2lmbmRlZiBfX0RQSF9HTE9CQUxfSF9fCisjZGVmaW5lIF9fRFBIX0dMT0JBTF9IX18KKworI2luY2x1ZGUgImxpbV9nbG9iYWwuaCIKKyNpbmNsdWRlICJzaXJfbWFjX3Byb3RfZGVmLmgiCisjaW5jbHVkZSAic2lyX21hY19wcm9wX2V4dHMuaCIKKyNpbmNsdWRlICJzaXJfYXBpLmgiCisKKy8qIEZvbGxvd2luZyBkZXRlcm1pbmVzIHdoZXRoZXIgc3RhdGlzdGljcyBhcmUgbWFpbnRhaW5lZCBvciBub3QgKi8KKyNkZWZpbmUgRFBIX1NUQVRTCisKKy8qIFNUQUlEIGZvciBNYW5hZ2VtZW50IGZyYW1lcyAqLworI2RlZmluZSBEUEhfVVNFX01HTVRfU1RBSUQgIC0xCisKKy8qIEtlZXAgQWxpdmUgZnJhbWVzICovCisjZGVmaW5lIERQSF9OT05fS0VFUEFMSVZFX0ZSQU1FICAwCisjZGVmaW5lIERQSF9LRUVQQUxJVkVfRlJBTUUgICAgICAxCisKKy8qIERQSCBIYXNoIEluZGV4IGZvciBCU1MoU1RBJ3MgUGVlcikgb24gc3RhdGlvbi4gKi8KKyNkZWZpbmUgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIgICAxCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisvKiBEUEggUE1GIFNBIFF1ZXJ5IHN0YXRlIGZvciBzdGF0aW9uICovCisjZGVmaW5lIERQSF9TQV9RVUVSWV9OT1RfSU5fUFJPR1JFU1MgICAgICAxCisjZGVmaW5lIERQSF9TQV9RVUVSWV9JTl9QUk9HUkVTUyAgICAgICAgICAyCisjZGVmaW5lIERQSF9TQV9RVUVSWV9USU1FRF9PVVQgICAgICAgICAgICAzCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc0RwaFJhdGVCYXNlZEN0ciB7CisJdWludDMyX3QgaGk7CisJdWludDMyX3QgbG87Cit9IHREcGhSYXRlQmFzZWRDdHI7CisKK3R5cGVkZWYgc3RydWN0IHNEcGhQaHlSYXRlcyB7CisJdWludDhfdCBkYXRhUmF0ZVgyOworCXVpbnQ4X3QgYWNrUmF0ZVgyOworCXVpbnQ4X3QgcnRzUmF0ZVgyOworfSB0RHBoUGh5UmF0ZXM7CisKK3R5cGVkZWYgc3RydWN0IHNEcGhJRlNWYWx1ZXMgeworCXVpbnQ4X3Qgc2lmczsKKwl1aW50OF90IHBpZnM7CisJdWludDhfdCBkaWZzOworCXVpbnQ4X3QgcHJlYW1ibGU7Cit9IHREcGhJRlNWYWx1ZXM7CisKK3R5cGVkZWYgc3RydWN0IHNEcGhRb3NQYXJhbXMgeworCXVpbnQ4X3QgYWRkdHNQcmVzZW50OworCXRTaXJBZGR0c1JlcUluZm8gYWRkdHM7CisJdFNpck1hY1Fvc0NhcGFiaWxpdHlTdGFJRSBjYXBhYmlsaXR5OworfSB0RHBoUW9zUGFyYW1zOworCisvKiBRdWV1ZSBhdHRyaWJ1dGUgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBzRHBoUXVldWVBdHRyIHsKKwl1aW50MTZfdCB2YWxpZDoxOworCXVpbnQxNl90IHNlcU51bToxMjsKKwl1aW50MTZfdCBhY2tQb2xpY3k6MjsKKwl1aW50MTZfdCByc3ZkOjE7Cit9IHREcGhRdWV1ZUF0dHIsICp0cERwaFF1ZXVlQXR0cjsKKworLyogU1RBIHN0YXRlIG5vZGUgKi8KK3R5cGVkZWYgc3RydWN0IHNEcGhIYXNoTm9kZSB7CisJLyoKKwkgKiBCWVRFIDAKKwkgKiBIQVNIIEVOVFJZIEZJRUxEUyBOT1QgTkVFREVEIElOIEhBTC4KKwkgKiBUaGlzIFNUQSB2YWxpZCBvciBub3QKKwkgKi8KKwl1aW50OF90IHZhbGlkOjE7CisJdWludDhfdCBlbmNQb2xpY3k6MzsKKwl1aW50OF90IGRlZmF1bHRLZXk6MTsKKwl1aW50OF90IGRlZmF1bHRLZXlJZDoyOworCXVpbnQ4X3QgcW9zTW9kZToxOworCS8qIEJZVEUgMSAqLworCXVpbnQ4X3QgZXJwRW5hYmxlZDoxOworCS8qIFRoaXMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGRwaCBoYXNoIHRhYmxlICovCisJdWludDhfdCBhZGRlZDoxOworCXVpbnQ4X3QgbGlua1Rlc3RPbjoxOworCXVpbnQ4X3Qgc2hvcnRQcmVhbWJsZUVuYWJsZWQ6MTsKKwl1aW50OF90IHNob3J0U2xvdFRpbWVFbmFibGVkOjE7CisJdWludDhfdCBzdG9wVHg6MTsKKwkvKiBzZXQgaWYgYm90aCBhcCBhbmQgc3RhIGFyZSB3bWUgY2FwYWJsZSAqLworCXVpbnQ4X3Qgd21lRW5hYmxlZDoxOworCS8qIHNldCBpZiBib3RoIGFwIGFuZCBzdGEgYXJlIDExZSBjYXBhYmxlICovCisJdWludDhfdCBsbGVFbmFibGVkOjE7CisJLyogQllURSAyICovCisJLyogc2V0IGlmIGJvdGggYXAgYW5kIHN0YSBhcmUgd3NtIGNhcGFibGUgKi8KKwl1aW50OF90IHdzbUVuYWJsZWQ6MTsKKwkvKiBzdGF0aW9uIGdhdmUgdmVyc2lvbiBpbmZvICovCisJdWludDhfdCB2ZXJzaW9uUHJlc2VudDoxOworCS8qIGFsbG93IGJ1cnN0aW5nIHJlZ2FyZGxlc3Mgb2YgcW9zTW9kZSAqLworCXVpbnQ4X3QgYnVyc3RFbmFibGVGb3JjZToxOworCXVpbnQ4X3Qgc3RhQXV0aGVudGljYXRlZDoxOworCXVpbnQ4X3QgZkFuaUNvdW50OjE7CisJdWludDhfdCBybWZFbmFibGVkOjE7CisJLyogRnJhZ21lbnRhdGlvbiBzaXplICovCisJdWludDE2X3QgZnJhZ1NpemU7CisJLyogTElNIHN0YXRlICovCisJdExpbU1sbVN0YUNvbnRleHQgbWxtU3RhQ29udGV4dDsKKwkvKiBOdW1iZXIgb2YgVGltIHRvIHdhaXQgaWYgdGhlIFNUQSBkb2Vzbid0IHJlc3BvbmQgLyBmZXRjaCBkYXRhICovCisJdWludDhfdCB0aW1XYWl0Q291bnQ7CisJLyogTnVtYmVyIG9mIFN1Y2Nlc3NmdWwgTVBEVSdzIGJlaW5nIHNlbnQgKi8KKwl1aW50MzJfdCBjdXJUeE1wZHVDbnQ7CisJLyogbnVtYmVyIG9mIGNvbnNlY3V0aXZlIFRJTXMgc2VudCB3aXRob3V0IHJlc3BvbnNlICovCisJdWludDhfdCBudW1UaW1TZW50OworCS8qIHFvcyBwYXJhbWV0ZXIgaW5mbyAqLworCXREcGhRb3NQYXJhbXMgcW9zOworCS8qIHN0YXRpb24gdmVyc2lvbiBpbmZvIC0gdmFsaWQgb25seSBpZiB2ZXJzaW9uUHJlc2VudCBpcyBzZXQgKi8KKwl0U2lyTWFjUHJvcFZlcnNpb24gdmVyc2lvbjsKKyNpZmRlZiBQTE1fV0RTCisJdWludDhfdCB3ZHNJbmRleDsKKwl1aW50OF90IHdkc1BlZXJCZWFjb25TZWVuOworI2VuZGlmCisJLyogVGF1cnVzIGNhcGFiaWxpdGllcyAqLworCXVpbnQxNl90IGJhUG9saWN5RmxhZzsgIC8qIEJBIFBvbGljeSBmb3IgZWFjaCBUSUQuICovCisJLyoKKwkgKiBBbGwgdGhlIGxlZ2FjeSBhbmQgYWlyZ28gc3VwcG9ydGVkIHJhdGVzLgorCSAqLworCXRTaXJTdXBwb3J0ZWRSYXRlcyBzdXBwb3J0ZWRSYXRlczsKKwl1aW50OF90IGh0R3JlZW5maWVsZDoxOworCXVpbnQ4X3QgaHRTaG9ydEdJNDBNaHo6MTsKKwl1aW50OF90IGh0U2hvcnRHSTIwTWh6OjE7CisJLyogRFNTUy9DQ0sgYXQgNDAgTUh6OiBFbmFibGVkIDEgb3IgRGlzYWJsZWQgKi8KKwl1aW50OF90IGh0RHNzc0Nja1JhdGU0ME1IelN1cHBvcnQ6MTsKKwkvKiBMLVNJRyBUWE9QIFByb3RlY3Rpb24gdXNlZCBvbmx5IGlmIHBlZXIgc3VwcG9ydCBhdmFpbGFibGUgKi8KKwl1aW50OF90IGh0THNpZ1RYT1BQcm90ZWN0aW9uOjE7CisJLyoKKwkgKiBBLU1QRFUgRGVuc2l0eQorCSAqIDAwMCAtIE5vIHJlc3RyaWN0aW9uCisJICogMDAxIC0gMS84IHVzZWMKKwkgKiAwMTAgLSAxLzQgdXNlYworCSAqIDAxMSAtIDEvMiB1c2VjCisJICogMTAwIC0gMSB1c2VjCisJICogMTAxIC0gMiB1c2VjCisJICogMTEwIC0gNCB1c2VjCisJICogMTExIC0gOCB1c2VjCisJICovCisJdWludDhfdCBodEFNcGR1RGVuc2l0eTozOworCS8qIFNldCB0byAwIGZvciAzODM5IG9jdGV0cyAqLworCS8qIFNldCB0byAxIGZvciA3OTM1IG9jdGV0cyAqLworCXVpbnQ4X3QgaHRNYXhBbXNkdUxlbmd0aDsKKwkvKiBNSU1PIFBvd2VyIFNhdmUgKi8KKwl0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUgaHRNSU1PUFNTdGF0ZTsKKwkvKiAqLworCS8qIE1heGltdW0gUnggQS1NUERVIGZhY3RvciAqLworCXVpbnQ4X3QgaHRNYXhSeEFNcGR1RmFjdG9yOjM7CisJLyoKKwkgKiBSZWNvbW1lbmRlZCBUeCBXaWR0aCBTZXQKKwkgKiAwIC0gdXNlIDIwIE1IeiBjaGFubmVsIChjb250cm9sIGNoYW5uZWwpCisJICogMSAtIHVzZSA0MCBNaHogY2hhbm5lbAorCSAqLworCXVpbnQ4X3QgaHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ6MTsKKwl1aW50OF90IGh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDoyOworCXVpbnQ4X3QgcnN2ZDE6MjsKKwkvKiBEUEggSEFTSCBFTlRSWSBGSUVMRFMgTkVFREVEIElOIEhBTCBPTkxZICovCisJdWludDhfdCBkcHVTaWc6NDsgICAgICAgLyogRFBVIHNpZ25pdHVyZSAqLworCXVpbnQ4X3Qgc3RhU2lnOjQ7ICAgICAgIC8qIFNUQSBzaWduYXR1cmUgKi8KKwl1aW50OF90IHN0YVR5cGU7CisJdWludDE2X3QgYnNzSWQ7ICAgICAgICAgLyogQlNTSUQgKi8KKwl1aW50MTZfdCBhc3NvY0lkOyAgICAgICAvKiBBc3NvY2lhdGlvbiBJRCAqLworCS8qIFRoaXMgaXMgdGhlIHJlYWwgc3RhIGluZGV4IGdlbmVyYXRlZCBieSBIQUwgKi8KKwl1aW50MTZfdCBzdGFJbmRleDsKKwl1aW50OF90IHN0YUFkZHJbNl07CisJLyoKKwkgKiBUaGUgRFBVIHNpZ25hdHVyZXMgd2lsbCBiZSBzZW50IGV2ZW50dWFsbHkgdG8gVEwgdG8gaGVscAorCSAqIGl0IGRldGVybWluZSB0aGUgYXNzb2NpYXRpb24gdG8gd2hpY2ggYSBwYWNrZXQgYmVsb25ncyB0bworCSAqLworCS8qVW5pY2FzdCBEUFUgc2lnbmF0dXJlICovCisJdWludDhfdCB1Y1VjYXN0U2lnOworCS8qQnJvYWRjYXN0IERQVSBzaWduYXR1cmUgKi8KKwl1aW50OF90IHVjQmNhc3RTaWc7CisKKwl1aW50OF90IHZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKwl1aW50OF90IHZodFN1cHBvcnRlZFJ4TnNzOworCXVpbnQ4X3Qgdmh0QmVhbUZvcm1lckNhcGFibGU7CisJdWludDhfdCB2aHRfc3VfYmZlZV9jYXBhYmxlOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwl1aW50OF90IHBtZlNhUXVlcnlTdGF0ZTsKKwl1aW50OF90IHBtZlNhUXVlcnlSZXRyeUNvdW50OworCXVpbnQxNl90IHBtZlNhUXVlcnlDdXJyZW50VHJhbnNJZDsKKwl1aW50MTZfdCBwbWZTYVF1ZXJ5U3RhcnRUcmFuc0lkOworCVRYX1RJTUVSIHBtZlNhUXVlcnlUaW1lcjsKKwl2X1RJTUVfdCBsYXN0X3VucHJvdF9kZWF1dGhfZGlzYXNzb2M7CisJdWludDhfdCBwcm9jdF9kZWF1aF9kaXNhc3NvY19jbnQ7CisJdl9USU1FX3QgbGFzdF9hc3NvY19yZWNlaXZlZF90aW1lOworI2VuZGlmCisJdWludDhfdCBodExkcGNDYXBhYmxlOworCXVpbnQ4X3Qgdmh0TGRwY0NhcGFibGU7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwl1aW50MTZfdCBodF9jYXBzOworCXVpbnQzMl90IHZodF9jYXBzOworI2VuZGlmCisJdWludDhfdCB0aW1pbmdNZWFzQ2FwOworCS8qIGtleSBpbnN0YWxsZWQgZm9yIHRoaXMgU1RBIG9yIG5vdCBpbiB0aGUgZmlybXdhcmUgKi8KKwl1aW50OF90IGlzX2tleV9pbnN0YWxsZWQ7CisJdWludDhfdCBpc19kaXNhc3NvY19kZWF1dGhfaW5fcHJvZ3Jlc3M7CisJLyoKKwkgKiBXaGVuIGEgc3RhdGlvbiB3aXRoIGFscmVhZHkgYW4gZXhpc3RpbmcgZHBoIGVudHJ5IHRyaWVzIHRvCisJICogYXNzb2NpYXRlIGFnYWluLCB0aGUgb2xkIGRwaCBlbnRyeSB3aWxsIGJlIHplcm9lZCBvdXQgZXhjZXB0CisJICogZm9yIHRoZSBuZXh0IHBvaW50ZXIuIFRoZSBuZXh0IHBvaW50ZXIgbXVzdCBiZSBkZWZpbmVkIGF0IHRoZQorCSAqIGVuZCBvZiB0aGUgc3RydWN0dXJlLgorCSAqLworCXN0cnVjdCBzRHBoSGFzaE5vZGUgKm5leHQ7Cit9IHREcGhIYXNoTm9kZSwgKnRwRHBoSGFzaE5vZGU7CisKKyNpbmNsdWRlICJkcGhfaGFzaF90YWJsZS5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit0eXBlZGVmIHN0cnVjdCBzQW5pU2lyRHBoIHsKKwkvKiBUaGUgaGFzaCB0YWJsZSBvYmplY3QgKi8KKwlkcGhIYXNoVGFibGVDbGFzcyBkcGhIYXNoVGFibGU7Cit9IHRBbmlTaXJEcGgsICp0cEFuaVNpckRwaDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvaW5jbHVkZS9wYXJzZXJfYXBpLmggYi9jb3JlL21hYy9zcmMvaW5jbHVkZS9wYXJzZXJfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiZmQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9pbmNsdWRlL3BhcnNlcl9hcGkuaApAQCAtMCwwICsxLDk2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBwYXJzZXJfYXBpLmggY29udGFpbnMgdGhlIGRlZmluaXRpb25zIHVzZWQKKyAqIGZvciBwYXJzaW5nIHJlY2VpdmVkIDgwMi4xMSBmcmFtZXMKKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzExLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpZm5kZWYgX19QQVJTRV9IX18KKyNkZWZpbmUgX19QQVJTRV9IX18KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgInNpcl9tYWNfcHJvcF9leHRzLmgiCisjaW5jbHVkZSAiZG90MTFmLmgiCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlICJsaW1fZnRfZGVmcy5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltX3Nlc3Npb24uaCIKKworI2RlZmluZSBDT1VOVFJZX1NUUklOR19MRU5HVEggICAgKDMpCisjZGVmaW5lIENPVU5UUllfSU5GT19NQVhfQ0hBTk5FTCAoODQpCisjZGVmaW5lIE1BWF9TSVpFX09GX1RSSVBMRVRTX0lOX0NPVU5UUllfSUUgKENPVU5UUllfU1RSSU5HX0xFTkdUSCAqIFwKKwkJCQkJCUNPVU5UUllfSU5GT19NQVhfQ0hBTk5FTCkKKyNkZWZpbmUgSElHSEVTVF8yNEdIWl9DSEFOTkVMX05VTSAgKDE0KQorCisjZGVmaW5lIElTXzI0R19DSChfX2NoTnVtKSAoKF9fY2hOdW0gPiAwKSAmJiAoX19jaE51bSA8IDE1KSkKKyNkZWZpbmUgSVNfNUdfQ0goX19jaE51bSkgKChfX2NoTnVtID49IDM2KSAmJiAoX19jaE51bSA8PSAxNjUpKQorI2RlZmluZSBJU18yWDJfQ0hBSU4oX19jaGFpbikgKChfX2NoYWluICYgMHgzKSA9PSAweDMpCisjZGVmaW5lIERJU0FCTEVfTlNTMl9NQ1MgMHhDCisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKyNkZWZpbmUgUUNPTV9WRU5ET1JfSUVfTUNDX0FWT0lEX0NIIDB4MDEKKworc3RydWN0IHNBdm9pZENoYW5uZWxJRSB7CisJLyogZm9sbG93aW5nIG11c3QgYmUgMHhERCAoMjIxKSAqLworCXVpbnQ4X3QgdGFnX251bWJlcjsKKwl1aW50OF90IGxlbmd0aDsKKwkvKiBmb2xsb3dpbmcgbXVzdCBiZSAwMC1BMC1DNiAqLworCXVpbnQ4X3Qgb3VpWzNdOworCS8qIGZvbGxvd2luZyBtdXN0IGJlIDB4MDEgKi8KKwl1aW50OF90IHR5cGU7CisJdWludDhfdCBjaGFubmVsOworfTsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckNvdW50cnlJbmZvcm1hdGlvbiB7CisJdWludDhfdCBjb3VudHJ5U3RyaW5nW0NPVU5UUllfU1RSSU5HX0xFTkdUSF07CisJdWludDhfdCBudW1JbnRlcnZhbHM7ICAgLyogbnVtYmVyIG9mIGNoYW5uZWwgaW50ZXJ2YWxzICovCisJc3RydWN0IGNoYW5uZWxQb3dlckxpbSB7CisJCXVpbnQ4X3QgY2hhbm5lbE51bWJlcjsKKwkJdWludDhfdCBudW1DaGFubmVsOworCQl1aW50OF90IG1heFRyYW5zbWl0UG93ZXI7CisJfSBjaGFubmVsVHJhbnNtaXRQb3dlcltDT1VOVFJZX0lORk9fTUFYX0NIQU5ORUxdOworfSB0U2lyQ291bnRyeUluZm9ybWF0aW9uLCAqdHBTaXJDb3VudHJ5SW5mb3JtYXRpb247CisKKy8qIFN0cnVjdHVyZSBjb21tb24gdG8gQmVhY29ucyAmIFByb2JlIFJlc3BvbnNlcyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclByb2JlUmVzcEJlYWNvbiB7CisJdFNpck1hY1RpbWVTdGFtcCB0aW1lU3RhbXA7CisJdWludDE2X3QgYmVhY29uSW50ZXJ2YWw7CisJdFNpck1hY0NhcGFiaWxpdHlJbmZvIGNhcGFiaWxpdHlJbmZvOworCisJdFNpck1hY1NTaWQgc3NJZDsKKwl0U2lyTWFjUmF0ZVNldCBzdXBwb3J0ZWRSYXRlczsKKwl0U2lyTWFjUmF0ZVNldCBleHRlbmRlZFJhdGVzOworCXRTaXJNYWNDaGFuTnVtIGNoYW5uZWxOdW1iZXI7CisJdFNpck1hY0NmUGFyYW1TZXQgY2ZQYXJhbVNldDsKKwl0U2lyTWFjVGltIHRpbTsKKwl0U2lyTWFjRWRjYVBhcmFtU2V0SUUgZWRjYVBhcmFtczsKKwl0U2lyTWFjUW9zQ2FwYWJpbGl0eUlFIHFvc0NhcGFiaWxpdHk7CisKKwl0U2lyQ291bnRyeUluZm9ybWF0aW9uIGNvdW50cnlJbmZvUGFyYW07CisJdFNpck1hY1dwYUluZm8gd3BhOworCXRTaXJNYWNSc25JbmZvIHJzbjsKKworCXRTaXJNYWNFcnBJbmZvIGVycElFSW5mbzsKKworCXRTaXJQcm9wSUVTdHJ1Y3QgcHJvcElFaW5mbzsKKwl0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzIGxvY2FsUG93ZXJDb25zdHJhaW50OworCXREb3QxMWZJRVRQQ1JlcG9ydCB0cGNSZXBvcnQ7CisJdERvdDExZklFQ2hhblN3aXRjaEFubiBjaGFubmVsU3dpdGNoSUU7CisJdERvdDExZklFc2VjX2NoYW5fb2Zmc2V0X2VsZSBzZWNfY2hhbl9vZmZzZXQ7CisJdERvdDExZklFZXh0X2NoYW5fc3dpdGNoX2FubiBleHRfY2hhbl9zd2l0Y2g7CisJdFNpck1hY0FkZHIgYnNzaWQ7CisJdERvdDExZklFUXVpZXQgcXVpZXRJRTsKKwl0RG90MTFmSUVIVENhcHMgSFRDYXBzOworCXREb3QxMWZJRUhUSW5mbyBIVEluZm87CisJdERvdDExZklFUDJQUHJvYmVSZXMgUDJQUHJvYmVSZXM7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwl1aW50OF90IG1kaWVbU0lSX01ESUVfU0laRV07CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJdERvdDExZklFRVNFVHhtaXRQb3dlciBlc2VUeFB3cjsKKwl0RG90MTFmSUVRQlNTTG9hZCBRQlNTTG9hZDsKKyNlbmRpZgorCXVpbnQ4X3Qgc3NpZFByZXNlbnQ7CisJdWludDhfdCBzdXBwUmF0ZXNQcmVzZW50OworCXVpbnQ4X3QgZXh0ZW5kZWRSYXRlc1ByZXNlbnQ7CisJdWludDhfdCBjZlByZXNlbnQ7CisJdWludDhfdCBkc1BhcmFtc1ByZXNlbnQ7CisJdWludDhfdCB0aW1QcmVzZW50OworCisJdWludDhfdCBlZGNhUHJlc2VudDsKKwl1aW50OF90IHFvc0NhcGFiaWxpdHlQcmVzZW50OworCXVpbnQ4X3Qgd21lRWRjYVByZXNlbnQ7CisJdWludDhfdCB3bWVJbmZvUHJlc2VudDsKKwl1aW50OF90IHdzbUNhcGFibGVQcmVzZW50OworCisJdWludDhfdCBjb3VudHJ5SW5mb1ByZXNlbnQ7CisJdWludDhfdCB3cGFQcmVzZW50OworCXVpbnQ4X3QgcnNuUHJlc2VudDsKKwl1aW50OF90IGVycFByZXNlbnQ7CisJdWludDhfdCBjaGFubmVsU3dpdGNoUHJlc2VudDsKKwl1aW50OF90IHNlY19jaGFuX29mZnNldF9wcmVzZW50OworCXVpbnQ4X3QgZXh0X2NoYW5fc3dpdGNoX3ByZXNlbnQ7CisJdWludDhfdCBxdWlldElFUHJlc2VudDsKKwl1aW50OF90IHRwY1JlcG9ydFByZXNlbnQ7CisJdWludDhfdCBwb3dlckNvbnN0cmFpbnRQcmVzZW50OworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwl1aW50OF90IG1kaWVQcmVzZW50OworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCXREb3QxMWZJRVZIVENhcHMgVkhUQ2FwczsKKwl0RG90MTFmSUVWSFRPcGVyYXRpb24gVkhUT3BlcmF0aW9uOworCXREb3QxMWZJRVZIVEV4dEJzc0xvYWQgVkhURXh0QnNzTG9hZDsKKwl0RG90MTFmSUVPcGVyYXRpbmdNb2RlIE9wZXJhdGluZ01vZGU7CisJdWludDhfdCBXaWRlckJXQ2hhblN3aXRjaEFublByZXNlbnQ7CisJdERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4gV2lkZXJCV0NoYW5Td2l0Y2hBbm47CisjZW5kaWYKKwl1aW50OF90IFZlbmRvcjFJRVByZXNlbnQ7CisJdERvdDExZklFdmVuZG9yMl9pZSB2ZW5kb3IyX2llOworCXVpbnQ4X3QgVmVuZG9yM0lFUHJlc2VudDsKKwl0RG90MTFmSUVJQlNTUGFyYW1zIElCU1NQYXJhbXM7CisjaWZkZWYgRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFCisJdERvdDExZklFUUNvbVZlbmRvcklFICAgQXZvaWRDaGFubmVsSUU7CisjZW5kaWYgLyogRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXVpbnQ4X3QgICAgaXNfZXNlX3Zlcl9pZV9wcmVzZW50OworI2VuZGlmCit9IHRTaXJQcm9iZVJlc3BCZWFjb24sICp0cFNpclByb2JlUmVzcEJlYWNvbjsKKworLyogcHJvYmUgUmVxdWVzdCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJQcm9iZVJlcSB7CisJdFNpck1hY1NTaWQgc3NJZDsKKwl0U2lyTWFjUmF0ZVNldCBzdXBwb3J0ZWRSYXRlczsKKwl0U2lyTWFjUmF0ZVNldCBleHRlbmRlZFJhdGVzOworCXREb3QxMWZJRVdzY1Byb2JlUmVxIHByb2JlUmVxV3NjSWVJbmZvOworCXREb3QxMWZJRUhUQ2FwcyBIVENhcHM7CisJdWludDhfdCBzc2lkUHJlc2VudDsKKwl1aW50OF90IHN1cHBSYXRlc1ByZXNlbnQ7CisJdWludDhfdCBleHRlbmRlZFJhdGVzUHJlc2VudDsKKwl1aW50OF90IHdzY0llUHJlc2VudDsKKwl1aW50OF90IHAycEllUHJlc2VudDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCXREb3QxMWZJRVZIVENhcHMgVkhUQ2FwczsKKyNlbmRpZgorCit9IHRTaXJQcm9iZVJlcSwgKnRwU2lyUHJvYmVSZXE7CisKKy8qIC8gQXNzb2NpYXRpb24gUmVxdWVzdCBzdHJ1Y3R1cmUgKG9uZSBkYXkgdG8gYmUgcmVwbGFjZWQgYnkgKi8KKy8qIC8gdERvdDExZkFzc29jUmVxdWVzdCkgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJBc3NvY1JlcSB7CisKKwl0U2lyTWFjQ2FwYWJpbGl0eUluZm8gY2FwYWJpbGl0eUluZm87CisJdWludDE2X3QgbGlzdGVuSW50ZXJ2YWw7CisJdFNpck1hY0FkZHIgY3VycmVudEFwQWRkcjsgICAgICAvKiBvbmx5IGluIHJlYXNzb2MgZnJhbWVzICovCisJdFNpck1hY1NTaWQgc3NJZDsKKwl0U2lyTWFjUmF0ZVNldCBzdXBwb3J0ZWRSYXRlczsKKwl0U2lyTWFjUmF0ZVNldCBleHRlbmRlZFJhdGVzOworCisJdFNpckFkZHRzUmVxSW5mbyBhZGR0c1JlcTsKKwl0U2lyTWFjUW9zQ2FwYWJpbGl0eVN0YUlFIHFvc0NhcGFiaWxpdHk7CisKKwl0U2lyTWFjV2FwaUluZm8gd2FwaTsKKwl0U2lyTWFjV3BhSW5mbyB3cGE7CisJdFNpck1hY1JzbkluZm8gcnNuOworCXRTaXJBZGRpZSBhZGRJRTsKKworCXRTaXJQcm9wSUVTdHJ1Y3QgcHJvcElFaW5mbzsKKwl0U2lyTWFjUG93ZXJDYXBhYmlsaXR5SUUgcG93ZXJDYXBhYmlsaXR5OworCXRTaXJNYWNTdXBwb3J0ZWRDaGFubmVsSUUgc3VwcG9ydGVkQ2hhbm5lbHM7CisJdERvdDExZklFSFRDYXBzIEhUQ2FwczsKKwl0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiBXTU1JbmZvU3RhdGlvbjsKKwkvKiAvIFRoaXMgaXMgc2V0IGlmIHRoZSBmcmFtZSBpcyBhIHJlYXNzb2MgcmVxdWVzdDogKi8KKwl1aW50OF90IHJlYXNzb2NSZXF1ZXN0OworCXVpbnQ4X3Qgc3NpZFByZXNlbnQ7CisJdWludDhfdCBzdXBwUmF0ZXNQcmVzZW50OworCXVpbnQ4X3QgZXh0ZW5kZWRSYXRlc1ByZXNlbnQ7CisKKwl1aW50OF90IHdtZUluZm9QcmVzZW50OworCXVpbnQ4X3QgcW9zQ2FwYWJpbGl0eVByZXNlbnQ7CisJdWludDhfdCBhZGR0c1ByZXNlbnQ7CisJdWludDhfdCB3c21DYXBhYmxlUHJlc2VudDsKKworCXVpbnQ4X3Qgd2FwaVByZXNlbnQ7CisJdWludDhfdCB3cGFQcmVzZW50OworCXVpbnQ4X3QgcnNuUHJlc2VudDsKKwl1aW50OF90IGFkZElFUHJlc2VudDsKKworCXVpbnQ4X3QgcG93ZXJDYXBhYmlsaXR5UHJlc2VudDsKKwl1aW50OF90IHN1cHBvcnRlZENoYW5uZWxzUHJlc2VudDsKKwkvKiBrZWVwaW5nIGNvcHkgb2YgYXNzb2NpYXRpb24gcmVxdWVzdCByZWNlaXZlZCwgdGhpcyBpcworCSAgIHJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZSB0byB1cHBlciBsYXllcnMgKi8KKwl1aW50MzJfdCBhc3NvY1JlcUZyYW1lTGVuZ3RoOworCXVpbnQ4X3QgKmFzc29jUmVxRnJhbWU7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwl0RG90MTFmSUVWSFRDYXBzIFZIVENhcHM7CisJdERvdDExZklFT3BlcmF0aW5nTW9kZSBvcGVyTW9kZTsKKyNlbmRpZgorCXREb3QxMWZJRUV4dENhcCBFeHRDYXA7Cit9IHRTaXJBc3NvY1JlcSwgKnRwU2lyQXNzb2NSZXE7CisKKy8qIC8gQXNzb2NpYXRpb24gUmVzcG9uc2Ugc3RydWN0dXJlIChvbmUgZGF5IHRvIGJlIHJlcGxhY2VkIGJ5ICovCisvKiAvIHREb3QxMWZBc3NvY1JlcXVlc3QpICovCit0eXBlZGVmIHN0cnVjdCBzU2lyQXNzb2NSc3AgeworCisJdFNpck1hY0NhcGFiaWxpdHlJbmZvIGNhcGFiaWxpdHlJbmZvOworCXVpbnQxNl90IGFpZDsKKwl1aW50MTZfdCBzdGF0dXNDb2RlOworCXRTaXJNYWNSYXRlU2V0IHN1cHBvcnRlZFJhdGVzOworCXRTaXJNYWNSYXRlU2V0IGV4dGVuZGVkUmF0ZXM7CisJdFNpclByb3BJRVN0cnVjdCBwcm9wSUVpbmZvOworCXRTaXJNYWNFZGNhUGFyYW1TZXRJRSBlZGNhOworCXRTaXJBZGR0c1JzcEluZm8gYWRkdHNSc3A7CisJdERvdDExZklFSFRDYXBzIEhUQ2FwczsKKwl0RG90MTFmSUVIVEluZm8gSFRJbmZvOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwl0RG90MTFmSUVGVEluZm8gRlRJbmZvOworCXVpbnQ4X3QgbWRpZVtTSVJfTURJRV9TSVpFXTsKKwl1aW50OF90IG51bV9SSUNEYXRhOworCXREb3QxMWZJRVJJQ0RhdGFEZXNjIFJJQ0RhdGFbMl07CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwl1aW50OF90IG51bV90c3BlY3M7CisJdERvdDExZklFV01NVFNQRUMgVFNQRUNJbmZvW1NJUl9FU0VfTUFYX1RTUEVDX0lFU107CisJdFNpck1hY0VTRVRTTUlFIHRzbUlFOworI2VuZGlmCisKKwl1aW50OF90IHN1cHBSYXRlc1ByZXNlbnQ7CisJdWludDhfdCBleHRlbmRlZFJhdGVzUHJlc2VudDsKKworCXVpbnQ4X3QgZWRjYVByZXNlbnQ7CisJdWludDhfdCB3bWVFZGNhUHJlc2VudDsKKwl1aW50OF90IGFkZHRzUHJlc2VudDsKKwl1aW50OF90IHdzbUNhcGFibGVQcmVzZW50OworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwl1aW50OF90IGZ0aW5mb1ByZXNlbnQ7CisJdWludDhfdCBtZGllUHJlc2VudDsKKwl1aW50OF90IHJpY1ByZXNlbnQ7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJdWludDhfdCB0c3BlY1ByZXNlbnQ7CisJdWludDhfdCB0c21QcmVzZW50OworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwl0RG90MTFmSUVWSFRDYXBzIFZIVENhcHM7CisJdERvdDExZklFVkhUT3BlcmF0aW9uIFZIVE9wZXJhdGlvbjsKKyNlbmRpZgorCXREb3QxMWZJRUV4dENhcCBFeHRDYXA7CisJdFNpclFvc01hcFNldCBRb3NNYXBTZXQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCBUaW1lb3V0SW50ZXJ2YWw7CisjZW5kaWYKKwl0RG90MTFmSUV2ZW5kb3IyX2llIHZlbmRvcjJfaWU7Cit9IHRTaXJBc3NvY1JzcCwgKnRwU2lyQXNzb2NSc3A7CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorLyogU3RydWN0dXJlIHRvIGhvbGQgRVNFIEJlYWNvbiByZXBvcnQgbWFuZGF0b3J5IElFcyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NpckVzZUJjblJlcG9ydE1hbmRhdG9yeUllIHsKKwl0U2lyTWFjU1NpZCBzc0lkOworCXRTaXJNYWNSYXRlU2V0IHN1cHBvcnRlZFJhdGVzOworCXRTaXJNYWNGSFBhcmFtU2V0IGZoUGFyYW1TZXQ7CisJdFNpck1hY0RzUGFyYW1TZXRJRSBkc1BhcmFtU2V0OworCXRTaXJNYWNDZlBhcmFtU2V0IGNmUGFyYW1TZXQ7CisJdFNpck1hY0lCU1NQYXJhbXMgaWJzc1BhcmFtU2V0OworCXRTaXJNYWNUaW0gdGltOworCXRTaXJNYWNSUk1FbmFibGVkQ2FwIHJtRW5hYmxlZENhcGFiaWxpdGllczsKKworCXVpbnQ4X3Qgc3NpZFByZXNlbnQ7CisJdWludDhfdCBzdXBwUmF0ZXNQcmVzZW50OworCXVpbnQ4X3QgZmhQYXJhbVByZXNlbnQ7CisJdWludDhfdCBkc1BhcmFtc1ByZXNlbnQ7CisJdWludDhfdCBjZlByZXNlbnQ7CisJdWludDhfdCBpYnNzUGFyYW1QcmVzZW50OworCXVpbnQ4X3QgdGltUHJlc2VudDsKKwl1aW50OF90IHJybVByZXNlbnQ7Cit9IHRTaXJFc2VCY25SZXBvcnRNYW5kYXRvcnlJZSwgKnRwU2lyRXNlQmNuUmVwb3J0TWFuZGF0b3J5SWU7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKworLyoqCisgKiBzdHJ1Y3Qgc19leHRfY2FwIC0gaG9sZHMgYml0ZmllbGRzIG9mIGV4dGVuZGVkIGNhcGFiaWxpdHkgSUUKKyAqCisgKiBzX2V4dF9jYXAgaG9sZHMgYml0ZmllbGRzIG9mIGV4dGVuZGVkIGNhcGFiaWxpdHkgSUUuIEluIGRvdDExZiBmaWxlcworICogZXh0ZW5kZWQgY2FwYWJpbGl0eSBJRSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgYnl0ZXMuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVuY29kZS9kZWNvZGUgdGhlIGJ5dGUgYXJyYXkgcHJlc2VudCBpbgorICogZG90MTFmIElFIHN0cnVjdHVyZS4KKyAqLworCitzdHJ1Y3Qgc19leHRfY2FwIHsKKwl1aW50OF90IGJzc19jb2V4aXN0X21nbXRfc3VwcG9ydDoxOworCXVpbnQ4X3QgcmVzZXJ2ZWQxOjE7CisJdWludDhfdCBleHRfY2hhbl9zd2l0Y2g6MTsKKwl1aW50OF90IHJlc2VydmVkMjoxOworCXVpbnQ4X3QgcHNtcF9jYXA6MTsKKwl1aW50OF90IHJlc2VydmVkMzoxOworCXVpbnQ4X3Qgc3BzbXBfY2FwOjE7CisJdWludDhfdCBldmVudDoxOworCXVpbnQ4X3QgZGlhZ25vc3RpY3M6MTsKKwl1aW50OF90IG11bHRpX2RpYWdub3N0aWNzOjE7CisJdWludDhfdCBsb2NfdHJhY2tpbmc6MTsKKwl1aW50OF90IGZtczoxOworCXVpbnQ4X3QgcHJveHlfYXJwX3NlcnZpY2U6MTsKKwl1aW50OF90IGNvX2xvY19pbnRmX3JlcG9ydGluZzoxOworCXVpbnQ4X3QgY2l2aWNfbG9jOjE7CisJdWludDhfdCBnZW9zcGF0aWFsX2xvYzoxOworCXVpbnQ4X3QgdGZzOjE7CisJdWludDhfdCB3bm1fc2xlZXBfbW9kZToxOworCXVpbnQ4X3QgdGltX2Jyb2FkY2FzdDoxOworCXVpbnQ4X3QgYnNzX3RyYW5zaXRpb246MTsKKwl1aW50OF90IHFvc190cmFmZmljX2NhcDoxOworCXVpbnQ4X3QgYWNfc3RhX2NudDoxOworCXVpbnQ4X3QgbXVsdGlfYnNzaWQ6MTsKKwl1aW50OF90IHRpbWluZ19tZWFzOjE7CisJdWludDhfdCBjaGFuX3VzYWdlOjE7CisJdWludDhfdCBzc2lkX2xpc3Q6MTsKKwl1aW50OF90IGRtczoxOworCXVpbnQ4X3QgdXRjdHNmX29mZnNldDoxOworCXVpbnQ4X3QgdGRsc19wZWVyX3VhcHNkX2J1ZmZlcl9zdGE6MTsKKwl1aW50OF90IHRkbHNfcGVlcl9wc21fc3VwcDoxOworCXVpbnQ4X3QgdGRsc19jaGFubmVsX3N3aXRjaGluZzoxOworCXVpbnQ4X3QgaW50ZXJ3b3JraW5nX3NlcnZpY2U6MTsKKwl1aW50OF90IHFvc19tYXA6MTsKKwl1aW50OF90IGVicjoxOworCXVpbnQ4X3Qgc3Nwbl9pbnRlcmZhY2U6MTsKKwl1aW50OF90IHJlc2VydmVkNDoxOworCXVpbnQ4X3QgbXNnX2NmX2NhcDoxOworCXVpbnQ4X3QgdGRsc19zdXBwb3J0OjE7CisJdWludDhfdCB0ZGxzX3Byb2hpYml0ZWQ6MTsKKwl1aW50OF90IHRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQ6MTsKKwl1aW50OF90IHJlamVjdF91bmFkbWl0dGVkX3RyYWZmaWM6MTsKKwl1aW50OF90IHNlcnZpY2VfaW50ZXJ2YWxfZ3JhbnVsYXJpdHk6MzsKKwl1aW50OF90IGlkZW50aWZpZXJfbG9jOjE7CisJdWludDhfdCB1YXBzZF9jb2V4aXN0ZW5jZToxOworCXVpbnQ4X3Qgd25tX25vdGlmaWNhdGlvbjoxOworCXVpbnQ4X3QgcWFfYmNhcGJpbGl0eToxOworCXVpbnQ4X3QgdXRmOF9zc2lkOjE7CisJdWludDhfdCBxbWZfYWN0aXZhdGVkOjE7CisJdWludDhfdCBxbV9mcmVjb25fYWN0OjE7CisJdWludDhfdCByb2J1c3RfYXZfc3RyZWFtaW5nOjE7CisJdWludDhfdCBhZHZhbmNlZF9nY3I6MTsKKwl1aW50OF90IG1lc2hfZ2NyOjE7CisJdWludDhfdCBzY3M6MTsKKwl1aW50OF90IHFfbG9hZF9yZXBvcnQ6MTsKKwl1aW50OF90IGFsdGVybmF0ZV9lZGNhOjE7CisJdWludDhfdCB1bnByb3RfdHhvX3BuZWc6MTsKKwl1aW50OF90IHByb3RfdHhvX3BuZWc6MTsKKwl1aW50OF90IHJlc2VydmVkNjoxOworCXVpbnQ4X3QgcHJvdF9xX2xvYWRfcmVwb3J0OjE7CisJdWludDhfdCB0ZGxzX3dpZGVyX2J3OjE7CisJdWludDhfdCBvcGVyX21vZGVfbm90aWZpY2F0aW9uOjE7CisJdWludDhfdCBtYXhfbnVtX29mX21zZHVfYml0MToxOworCXVpbnQ4X3QgbWF4X251bV9vZl9tc2R1X2JpdDI6MTsKKwl1aW50OF90IGNoYW5fc2NoX21nbXQ6MTsKKwl1aW50OF90IGdlb19kYl9pbmJhbmRfZW5fc2lnbmFsOjE7CisJdWludDhfdCBud19jaGFuX2NvbnRyb2w6MTsKKwl1aW50OF90IHdoaXRlX3NwYWNlX21hcDoxOworCXVpbnQ4X3QgY2hhbl9hdmFpbF9xdWVyeToxOworCXVpbnQ4X3QgZmluZV90aW1lX21lYXNfcmVzcG9uZGVyOjE7CisJdWludDhfdCBmaW5lX3RpbWVfbWVhc19pbml0aWF0b3I6MTsKK307CisKK3VpbnQ4X3Qgc2lySXNQcm9wQ2FwYWJpbGl0eUVuYWJsZWQoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsIHVpbnQzMl90IGJpdG51bSk7CisKK3ZvaWQgZG90MTFmX2xvZyh0cEFuaVNpckdsb2JhbCBwTWFjLCBpbnQgblNldiwgY29uc3QgY2hhciAqbHBzekZvcm1hdCwgLi4uKTsKKworI2RlZmluZSBDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBuSXRlbSwgY2ZnKSAgZG8geyBcCisJCShuU3RhdHVzKSA9IHdsYW5fY2ZnX2dldF9pbnQoKHBNYWMpLCAobkl0ZW0pLCAmKGNmZykpOyBcCisJCWlmIChlU0lSX1NVQ0NFU1MgIT0gKG5TdGF0dXMpKSB7IFwKKwkJCWRvdDExZl9sb2coKHBNYWMpLCBMT0dQLCBGTCgiRmFpbGVkIHRvIHJldHJpZXZlIG5JdGVtIGZyb20gQ0ZHICglZCkuIiksIChuU3RhdHVzKSk7IFwKKwkJCXJldHVybiBuU3RhdHVzOyBcCisJCX0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDRkdfR0VUX0lOVF9OT19TVEFUVVMoblN0YXR1cywgcE1hYywgbkl0ZW0sIGNmZykgZG8geyBcCisJCShuU3RhdHVzKSA9IHdsYW5fY2ZnX2dldF9pbnQoKHBNYWMpLCAobkl0ZW0pLCAmKGNmZykpOyBcCisJCWlmIChlU0lSX1NVQ0NFU1MgIT0gKG5TdGF0dXMpKSB7IFwKKwkJCWRvdDExZl9sb2coKHBNYWMpLCBMT0dQLCBGTCgiRmFpbGVkIHRvIHJldHJpZXZlIG5JdGVtICBmcm9tIENGRyAoJWQpLiIpLCAoblN0YXR1cykpOyBcCisJCQlyZXR1cm47IFwKKwkJfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENGR19HRVRfU1RSKG5TdGF0dXMsIHBNYWMsIG5JdGVtLCBjZmcsIG5DZmcsIG5NYXhDZmcpIGRvIHsgXAorCQkobkNmZykgPSAobk1heENmZyk7IFwKKwkJKG5TdGF0dXMpID0gd2xhbl9jZmdfZ2V0X3N0cigocE1hYyksIChuSXRlbSksIChjZmcpLCAmKG5DZmcpKTsgXAorCQlpZiAoZVNJUl9TVUNDRVNTICE9IChuU3RhdHVzKSkgeyBcCisJCQlkb3QxMWZfbG9nKChwTWFjKSwgTE9HUCwgRkwoIkZhaWxlZCB0byByZXRyaWV2ZSBuSXRlbSAgZnJvbSBDRkcgKCVkKS4iKSwgKG5TdGF0dXMpKTsgXAorCQkJcmV0dXJuIG5TdGF0dXM7IFwKKwkJfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENGR19HRVRfU1RSX05PX1NUQVRVUyhuU3RhdHVzLCBwTWFjLCBuSXRlbSwgY2ZnLCBuQ2ZnLCBuTWF4Q2ZnKSBkbyB7IFwKKwkJKG5DZmcpID0gKG5NYXhDZmcpOyBcCisJCShuU3RhdHVzKSA9IHdsYW5fY2ZnX2dldF9zdHIoKHBNYWMpLCAobkl0ZW0pLCAoY2ZnKSwgJihuQ2ZnKSk7IFwKKwkJaWYgKGVTSVJfU1VDQ0VTUyAhPSAoblN0YXR1cykpIHsgXAorCQkJZG90MTFmX2xvZygocE1hYyksIExPR1AsIEZMKCJGYWlsZWQgdG8gcmV0cmlldmUgbkl0ZW0gIGZyb20gQ0ZHICglZCkuIiksIChuU3RhdHVzKSk7IFwKKwkJCXJldHVybjsgXAorCQl9IFwKK30gd2hpbGUgKDApCisKK3ZvaWQgc3dhcF9iaXRfZmllbGQxNih1aW50MTZfdCBpbiwgdWludDE2X3QgKm91dCk7CisKKy8qIEN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyAic2hpbXMiIGJldHdlZW4gY2FsbGVycyAmIHRoZSBuZXcgZnJhbWVzYy0gKi8KKy8qIGdlbmVyYXRlZCBjb2RlOiAqLworCit0U2lyUmV0U3RhdHVzCitzaXJfY29udmVydF9wcm9iZV9yZXFfZnJhbWUyX3N0cnVjdChzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywKKwkJCQl1aW50OF90ICpmcmFtZSwgdWludDMyX3QgbGVuLAorCQkJCXRwU2lyUHJvYmVSZXEgcHJvYmUpOworCit0U2lyUmV0U3RhdHVzCitzaXJfY29udmVydF9wcm9iZV9mcmFtZTJfc3RydWN0KHN0cnVjdCBzQW5pU2lyR2xvYmFsICpwTWFjLCB1aW50OF90ICpmcmFtZSwKKwkJCQl1aW50MzJfdCBsZW4sIHRwU2lyUHJvYmVSZXNwQmVhY29uIHByb2JlKTsKKwordFNpclJldFN0YXR1cworc2lyX2NvbnZlcnRfYXNzb2NfcmVxX2ZyYW1lMl9zdHJ1Y3Qoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsCisJCQkJdWludDhfdCAqZnJhbWUsIHVpbnQzMl90IGxlbiwKKwkJCQl0cFNpckFzc29jUmVxIGFzc29jKTsKKwordFNpclJldFN0YXR1cworc2lyX2NvbnZlcnRfYXNzb2NfcmVzcF9mcmFtZTJfc3RydWN0KHN0cnVjdCBzQW5pU2lyR2xvYmFsICpwTWFjLAorCQkJCXVpbnQ4X3QgKmZyYW1lLCB1aW50MzJfdCBsZW4sCisJCQkJdHBTaXJBc3NvY1JzcCBhc3NvYyk7CisKK3RTaXJSZXRTdGF0dXMKK3Npcl9jb252ZXJ0X3JlYXNzb2NfcmVxX2ZyYW1lMl9zdHJ1Y3Qoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsCisJCQkJdWludDhfdCAqZnJhbWUsIHVpbnQzMl90IGxlbiwKKwkJCQl0cFNpckFzc29jUmVxIGFzc29jKTsKKwordFNpclJldFN0YXR1cworc2lyX3BhcnNlX2JlYWNvbl9pZShzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywKKwkJdHBTaXJQcm9iZVJlc3BCZWFjb24gcEJlYWNvblN0cnVjdCwKKwkJdWludDhfdCAqcFBheWxvYWQsIHVpbnQzMl90IHBheWxvYWRMZW5ndGgpOworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKK3RTaXJSZXRTdGF0dXMKK3Npcl9iZWFjb25faWVfZXNlX2Jjbl9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCAqcFBheWxvYWQsIGNvbnN0IHVpbnQzMl90IHBheWxvYWRMZW5ndGgsCisJCXVpbnQ4X3QgKipvdXRJZUJ1ZiwgdWludDMyX3QgKnBPdXRJZUxlbik7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKwordFNpclJldFN0YXR1cworc2lyX2NvbnZlcnRfYmVhY29uX2ZyYW1lMl9zdHJ1Y3Qoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsCisJCQkJdWludDhfdCAqcEJlYWNvbkZyYW1lLAorCQkJCXRwU2lyUHJvYmVSZXNwQmVhY29uIHBCZWFjb25TdHJ1Y3QpOworCit0U2lyUmV0U3RhdHVzCitzaXJfY29udmVydF9hdXRoX2ZyYW1lMl9zdHJ1Y3Qoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsCisJCQl1aW50OF90ICpmcmFtZSwgdWludDMyX3QgbGVuLAorCQkJdHBTaXJNYWNBdXRoRnJhbWVCb2R5IGF1dGgpOworCit0U2lyUmV0U3RhdHVzCitzaXJfY29udmVydF9hZGR0c19yZXEyX3N0cnVjdChzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywKKwkJCXVpbnQ4X3QgKmZyYW1lLCB1aW50MzJfdCBsZW4sCisJCQl0U2lyQWRkdHNSZXFJbmZvICphZGRUcyk7CisKK3RTaXJSZXRTdGF0dXMKK3Npcl9jb252ZXJ0X2FkZHRzX3JzcDJfc3RydWN0KHN0cnVjdCBzQW5pU2lyR2xvYmFsICpwTWFjLAorCQkJdWludDhfdCAqZnJhbWUsIHVpbnQzMl90IGxlbiwKKwkJCXRTaXJBZGR0c1JzcEluZm8gKmFkZHRzKTsKKwordFNpclJldFN0YXR1cworc2lyX2NvbnZlcnRfZGVsdHNfcmVxMl9zdHJ1Y3Qoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsCisJCQl1aW50OF90ICpmcmFtZSwgdWludDMyX3QgbGVuLAorCQkJdFNpckRlbHRzUmVxSW5mbyAqZGVsVHMpOwordFNpclJldFN0YXR1cworc2lyX2NvbnZlcnRfcW9zX21hcF9jb25maWd1cmVfZnJhbWUyX3N0cnVjdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl1aW50OF90ICpwRnJhbWUsIHVpbnQzMl90IG5GcmFtZSwKKwkJCQkJdFNpclFvc01hcFNldCAqcFFvc01hcFNldCk7CisKKyNpZmRlZiBBTklfU1VQUE9SVF8xMUgKK3RTaXJSZXRTdGF0dXMKK3Npcl9jb252ZXJ0X3RwY19yZXFfZnJhbWUyX3N0cnVjdChzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqLCB1aW50OF90ICosCisJCQkJdHBTaXJNYWNUcGNSZXFBY3Rpb25GcmFtZSwgdWludDMyX3QpOworCit0U2lyUmV0U3RhdHVzCitzaXJfY29udmVydF9tZWFzX3JlcV9mcmFtZTJfc3RydWN0KHN0cnVjdCBzQW5pU2lyR2xvYmFsICosIHVpbnQ4X3QgKiwKKwkJCQl0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSwgdWludDMyX3QpOworI2VuZGlmCisKKy8qKgorICogXGJyaWVmIFBvcHVsYXRlZCBhIHREb3QxMWZGZkNhcGFiaWxpdGllcworICoKKyAqIFxzYSBQb3B1bGF0ZWREb3QxMWZDYXBhYmlsaXRpZXMyCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcERvdDExZiBBZGRyZXNzIG9mIGEgdERvdDExZkZmQ2FwYWJpbGl0aWVzIHRvIGJlIGZpbGxlZCBpbgorICoKKyAqCisgKiBcbm90ZSBJZiBTSVJfTUFDX1BST1BfQ0FQQUJJTElUWV8xMUVRT1MgaXMgZW5hYmxlZCwgd2UnbGwgY2xlYXIgdGhlIFFPUworICogYml0IGluIHBEb3QxMWYKKyAqCisgKgorICovCisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9jYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXREb3QxMWZGZkNhcGFiaWxpdGllcyAqcERvdDExZiwKKwkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvKioKKyAqIFxicmllZiBQb3B1bGF0ZWQgYSB0RG90MTFmRmZDYXBhYmlsaXRpZXMKKyAqCisgKiBcc2EgUG9wdWxhdGVkRG90MTFmQ2FwYWJpbGl0aWVzMgorICoKKyAqCisgKiBccGFyYW0gcE1hYyBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIGRhdGEgc3RydWN0dXJlCisgKgorICogXHBhcmFtIHBEb3QxMWYgQWRkcmVzcyBvZiBhIHREb3QxMWZGZkNhcGFiaWxpdGllcyB0byBiZSBmaWxsZWQgaW4KKyAqCisgKiBccGFyYW0gcFN0YSBQb2ludGVyIHRvIGEgdERwaEhhc2hOb2RlIHJlcHJlc2VudGluZyBhIHBlZXIKKyAqCisgKgorICogXG5vdGUgSWYgU0lSX01BQ19QUk9QX0NBUEFCSUxJVFlfMTFFUU9TIGlzIGVuYWJsZWQgb24gb3VyIHBlZXIsIHdlJ2xsCisgKiBjbGVhciB0aGUgUU9TIGJpdCBpbiBwRG90MTFmCisgKgorICoKKyAqLworCitzdHJ1Y3Qgc0RwaEhhc2hOb2RlOworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfY2FwYWJpbGl0aWVzMih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdERvdDExZkZmQ2FwYWJpbGl0aWVzICpwRG90MTFmLAorCQkJc3RydWN0IHNEcGhIYXNoTm9kZSAqcFN0YSwKKwkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvKiAvIFBvcHVsYXRlIGEgdERvdDExZklFQ2hhblN3aXRjaEFubiAqLwordm9pZAorcG9wdWxhdGVfZG90MTFmX2NoYW5fc3dpdGNoX2Fubih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXREb3QxMWZJRUNoYW5Td2l0Y2hBbm4gKnBEb3QxMWYsCisJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3ZvaWQKK3BvcHVsYXRlX2RvdF8xMV9mX2V4dF9jaGFubl9zd2l0Y2hfYW5uKHRwQW5pU2lyR2xvYmFsIG1hY19wdHIsCisJCQkJdERvdDExZklFZXh0X2NoYW5fc3dpdGNoX2FubiAqZG90XzExX3B0ciwKKwkJCQl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KTsKKworLyogLyBQb3B1bGF0ZSBhIHREb3QxMWZJRUNoYW5uZWxTd2l0Y2hXcmFwcGVyICovCit2b2lkCitwb3B1bGF0ZV9kb3QxMWZfY2hhbl9zd2l0Y2hfd3JhcHBlcih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXREb3QxMWZJRUNoYW5uZWxTd2l0Y2hXcmFwcGVyICpwRG90MTFmLAorCQkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvKiAvIFBvcHVsYXRlIGEgdERvdDExZklFQ291bnRyeSAqLwordFNpclJldFN0YXR1cworcG9wdWxhdGVfZG90MTFmX2NvdW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXREb3QxMWZJRUNvdW50cnkgKnBEb3QxMWYsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvKiBQb3B1bGF0ZWQgYSBwb3B1bGF0ZV9kb3QxMWZfZHNfcGFyYW1zICovCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfZHNfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQl0RG90MTFmSUVEU1BhcmFtcyAqcERvdDExZiwgdWludDhfdCBjaGFubmVsKTsKKworLyogLyBQb3B1bGF0ZWQgYSB0RG90MTFmSUVFRENBUGFyYW1TZXQgKi8KK3ZvaWQKK3BvcHVsYXRlX2RvdDExZl9lZGNhX3BhcmFtX3NldCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdERvdDExZklFRURDQVBhcmFtU2V0ICpwRG90MTFmLAorCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9lcnBfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdERvdDExZklFRVJQSW5mbyAqcERvdDExZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9leHRfc3VwcF9yYXRlcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdWludDhfdCBuQ2hhbm5lbE51bSwgdERvdDExZklFRXh0U3VwcFJhdGVzICpwRG90MTFmLAorCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9iZWFjb25fcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQl0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCAqcERvdDExZiwKKwkJCXRTaXJNYWNCZWFjb25SZXBvcnQgKnBCZWFjb25SZXBvcnQpOworI2VuZGlmCisKKy8qKgorICogXGJyaWVmIFBvcHVsYXRlIGEgdERvdDExZklFRXh0U3VwcFJhdGVzCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gbkNoYW5uZWxOdW0gQ2hhbm5lbCBvbiB3aGljaCB0aGUgZW5jbG9zaW5nIGZyYW1lIHdpbGwgYmUgZ29pbmcgb3V0CisgKgorICogXHBhcmFtIHBEb3QxMWYgQWRkcmVzcyBvZiBhIHREb3QxMWZJRUV4dFN1cHBSYXRlcyBzdHJ1Y3QgdG8gYmUgZmlsbGVkIGluLgorICoKKyAqCisgKiBUaGlzIG1ldGhvZCBpcyBhIE5PUCBpZiB0aGUgY2hhbm5lbCBpcyBncmVhdGVyIHRoYW4gMTQuCisgKgorICoKKyAqLworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfZXh0X3N1cHBfcmF0ZXMxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdWludDhfdCBuQ2hhbm5lbE51bSwKKwkJCQl0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfaHRfY2Fwcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwgdERvdDExZklFSFRDYXBzICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cworcG9wdWxhdGVfZG90MTFmX2h0X2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXREb3QxMWZJRUhUSW5mbyAqcERvdDExZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3ZvaWQgcG9wdWxhdGVfZG90MTFmX2lic3NfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdERvdDExZklFSUJTU1BhcmFtcyAqcERvdDExZiwKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworI2lmZGVmIEFOSV9TVVBQT1JUXzExSAordFNpclJldFN0YXR1cworcG9wdWxhdGVfZG90MTFmX21lYXN1cmVtZW50X3JlcG9ydDAodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSBwUmVxLAorCQkJCXREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICpwRG90MTFmKTsKKworLyogLyBQb3B1bGF0ZSBhIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0IHdoZW4gdGhlIHJlcG9ydCB0eXBlIGlzIENDQSAqLwordFNpclJldFN0YXR1cworcG9wdWxhdGVfZG90MTFmX21lYXN1cmVtZW50X3JlcG9ydDEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSBwUmVxLAorCQkJCXREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICpwRG90MTFmKTsKKworLyogLyBQb3B1bGF0ZSBhIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0IHdoZW4gdGhlIHJlcG9ydCB0eXBlIGlzIFJQSSBIaXN0ICovCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfbWVhc3VyZW1lbnRfcmVwb3J0Mih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lIHBSZXEsCisJCQkJdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgKnBEb3QxMWYpOworI2VuZGlmIC8qIEFOSV9TVVBQT1JUXzExSCAqLworCisvKiAvIFBvcHVsYXRlIGEgdERvdDExZklFUG93ZXJDYXBzICovCit2b2lkCitwb3B1bGF0ZV9kb3QxMWZfcG93ZXJfY2Fwcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdERvdDExZklFUG93ZXJDYXBzICpwQ2FwcywKKwkJCXVpbnQ4X3QgbkFzc29jVHlwZSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8qIC8gUG9wdWxhdGUgYSB0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzICovCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfcG93ZXJfY29uc3RyYWludHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzICpwRG90MTFmKTsKKwordm9pZAorcG9wdWxhdGVfZG90MTFmX3Fvc19jYXBzX2FwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQl0RG90MTFmSUVRT1NDYXBzQXAgKnBEb3QxMWYsCisJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordm9pZAorcG9wdWxhdGVfZG90MTFmX3Fvc19jYXBzX3N0YXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiAqcERvdDExZik7CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9yc24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdHBTaXJSU05pZSBwUnNuSWUsIHREb3QxMWZJRVJTTiAqcERvdDExZik7CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9yc25fb3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRwU2lyUlNOaWUgcFJzbkllLCB0RG90MTFmSUVSU05PcGFxdWUgKnBEb3QxMWYpOworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKwordFNpclJldFN0YXR1cworcG9wdWxhdGVfZG90MTFmX3dhcGkodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdHBTaXJSU05pZSBwUnNuSWUsIHREb3QxMWZJRVdBUEkgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl93YXBpX29wYXF1ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl0cFNpclJTTmllIHBSc25JZSwKKwkJCQkJdERvdDExZklFV0FQSU9wYXF1ZSAqcERvdDExZik7CisKKyNlbmRpZiAvKiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKSAqLworCisvKiAvIFBvcHVsYXRlIGEgdERvdDExZklFU1NJRCBnaXZlbiBhIHRTaXJNYWNTU2lkICovCit2b2lkCitwb3B1bGF0ZV9kb3QxMWZfc3NpZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0U2lyTWFjU1NpZCAqcEludGVybmFsLCB0RG90MTFmSUVTU0lEICpwRG90MTFmKTsKKworLyogLyBQb3B1bGF0ZSBhIHREb3QxMWZJRVNTSUQgZnJvbSBDRkcgKi8KK3RTaXJSZXRTdGF0dXMgcG9wdWxhdGVfZG90MTFmX3NzaWQyKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdERvdDExZklFU1NJRCAqcERvdDExZik7CisKKy8qKgorICogXGJyaWVmIFBvcHVsYXRlIGEgdERvdDExZklFU2NoZWR1bGUKKyAqCisgKiBcc2EgcG9wdWxhdGVfZG90MTFmX3dtbV9zY2hlZHVsZQorICoKKyAqCisgKiBccGFyYW0gcFNjaGVkdWxlIEFkZHJlc3Mgb2YgYSB0U2lyTWFjU2NoZWR1bGVJRSBzdHJ1Y3QKKyAqCisgKiBccGFyYW0gcERvdDExZiBBZGRyZXNzIG9mIGEgdERvdDExZklFU2NoZWR1bGUgdG8gYmUgZmlsbGVkIGluCisgKgorICoKKyAqLworCit2b2lkCitwb3B1bGF0ZV9kb3QxMWZfc2NoZWR1bGUodFNpck1hY1NjaGVkdWxlSUUgKnBTY2hlZHVsZSwKKwkJCXREb3QxMWZJRVNjaGVkdWxlICpwRG90MTFmKTsKKwordm9pZAorcG9wdWxhdGVfZG90MTFmX3N1cHBfY2hhbm5lbHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXREb3QxMWZJRVN1cHBDaGFubmVscyAqcERvdDExZiwKKwkJCXVpbnQ4X3QgbkFzc29jVHlwZSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8qKgorICogXGJyaWVmIFBvcHVsYXRlZCBhIHREb3QxMWZJRVN1cHBSYXRlcworICoKKyAqCisgKiBccGFyYW0gcE1hYyBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIGRhdGEgc3RydWN0dXJlCisgKgorICogXHBhcmFtIG5DaGFubmVsTnVtIENoYW5uZWwgdGhlIGVuY2xvc2luZyBmcmFtZSB3aWxsIGJlIGdvaW5nIG91dCBvbjsgc2VlCisgKiBiZWxvdworICoKKyAqIFxwYXJhbSBwRG90MTFmIEFkZHJlc3Mgb2YgYSB0RG90MTFmSUVTdXBwUmF0ZXMgc3RydWN0IHRvIGJlIGZpbGxlZCBpbi4KKyAqCisgKgorICogSWYgbkNoYW5uZWxOdW0gaXMgZ3JlYXRlciB0aGFuIDEzLCB0aGUgc3VwcG9ydGVkIHJhdGVzIHdpbGwgYmUKKyAqIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQi4gIElmIGl0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMywgdGhlCisgKiBzdXBwb3J0ZWQgcmF0ZXMgd2lsbCBiZSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUEuICBJZiBuQ2hhbm5lbE51bSBpcworICogc2V0IHRvIHRoZSBzZW50aW5lbCB2YWx1ZSBQT1BVTEFURV9ET1QxMUZfUkFURVNfT1BFUkFUSU9OQUwsIHRoZSBzdHJ1Y3QKKyAqIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVC4KKyAqCisgKgorICovCisKKyNkZWZpbmUgUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMICgweGZmKQorCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfc3VwcF9yYXRlcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdWludDhfdCBuQ2hhbm5lbE51bSwKKwkJCXREb3QxMWZJRVN1cHBSYXRlcyAqcERvdDExZiwgdHBQRVNlc3Npb24pOworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfcmF0ZXNfdGRscyh0cEFuaVNpckdsb2JhbCBwX21hYywKKwkJCXREb3QxMWZJRVN1cHBSYXRlcyAqcF9zdXBwX3JhdGVzLAorCQkJdERvdDExZklFRXh0U3VwcFJhdGVzICpwX2V4dF9zdXBwX3JhdGVzKTsKKwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfdHBjX3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl0RG90MTFmSUVUUENSZXBvcnQgKnBEb3QxMWYsCisJCQkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvKiAvIFBvcHVsYXRlIGEgdERvdDExRmZUU0luZm8gKi8KK3ZvaWQgcG9wdWxhdGVfZG90MTFmX3RzX2luZm8odFNpck1hY1RTSW5mbyAqcEluZm8sIHREb3QxMWZGZlRTSW5mbyAqcERvdDExZik7CisKK3ZvaWQgcG9wdWxhdGVfZG90MTFmX3dtbSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdERvdDExZklFV01NSW5mb0FwICpwSW5mbywKKwkJCXREb3QxMWZJRVdNTVBhcmFtcyAqcFBhcmFtcywKKwkJCXREb3QxMWZJRVdNTUNhcHMgKnBDYXBzLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfd21tX2NhcHModERvdDExZklFV01NQ2FwcyAqcENhcHMpOworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKQorLyogRmlsbCB0aGUgRVNFIHZlcnNpb24gSUUgKi8KK3ZvaWQgcG9wdWxhdGVfZG90MTFmX2VzZV92ZXJzaW9uKHREb3QxMWZJRUVTRVZlcnNpb24gKnBFU0VWZXJzaW9uKTsKKy8qIEZpbGwgdGhlIFJhZGlvIE1hbmFnZW1lbnQgQ2FwYWJpbGl0eSAqLwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfZXNlX3JhZF9tZ210X2NhcCh0RG90MTFmSUVFU0VSYWRNZ210Q2FwICpwRVNFUmFkTWdtdENhcCk7CisvKiBGaWxsIHRoZSBDQ0tNIElFICovCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl9lc2VfY2NrbV9vcGFxdWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJdHBTaXJDQ0tNaWUgcENDS01pZSwKKwkJCQkJdERvdDExZklFRVNFQ2NrbU9wYXF1ZSAqcERvdDExZik7CisKK3ZvaWQgcG9wdWxhdGVfZG90MTFfdHNyc2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQl0U2lyTWFjRVNFVFNSU0lFICpwT2xkLAorCQkJdERvdDExZklFRVNFVHJhZlN0cm1SYXRlU2V0ICpwRG90MTFmLAorCQkJdWludDhfdCByYXRlX2xlbmd0aCk7Cit2b2lkIHBvcHVsYXRlX2RvdDExZl9yZV9hc3NvY190c3BlYyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXREb3QxMWZSZUFzc29jUmVxdWVzdCAqcFJlYXNzb2MsCisJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfd21tX2luZm9fYXAodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl0RG90MTFmSUVXTU1JbmZvQXAgKnBJbmZvLAorCQkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2b2lkIHBvcHVsYXRlX2RvdDExZl93bW1faW5mb19zdGF0aW9uX3Blcl9zZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkJCXREb3QxMWZJRVdNTUluZm9TdGF0aW9uICpwSW5mbyk7CisKK3ZvaWQgcG9wdWxhdGVfZG90MTFmX3dtbV9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl0RG90MTFmSUVXTU1QYXJhbXMgKnBQYXJhbXMsCisJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8qKgorICogXGJyaWVmIFBvcHVsYXRlIGEgdERvdDExZklFV01NU2NoZWR1bGUKKyAqCisgKiBcc2EgUG9wdWxhdGVkRG90MTFmU2NoZWR1bGUKKyAqCisgKgorICogXHBhcmFtIHBTY2hlZHVsZSBBZGRyZXNzIG9mIGEgdFNpck1hY1NjaGVkdWxlSUUgc3RydWN0CisgKgorICogXHBhcmFtIHBEb3QxMWYgQWRkcmVzcyBvZiBhIHREb3QxMWZJRVdNTVNjaGVkdWxlIHRvIGJlIGZpbGxlZCBpbgorICoKKyAqCisgKi8KKwordm9pZAorcG9wdWxhdGVfZG90MTFmX3dtbV9zY2hlZHVsZSh0U2lyTWFjU2NoZWR1bGVJRSAqcFNjaGVkdWxlLAorCQkJdERvdDExZklFV01NU2NoZWR1bGUgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfd3BhKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRwU2lyUlNOaWUgcFJzbkllLCB0RG90MTFmSUVXUEEgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfd3BhX29wYXF1ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdHBTaXJSU05pZSBwUnNuSWUsIHREb3QxMWZJRVdQQU9wYXF1ZSAqcERvdDExZik7CisKK3ZvaWQgcG9wdWxhdGVfZG90MTFmX3RzcGVjKHRTaXJNYWNUc3BlY0lFICpwT2xkLCB0RG90MTFmSUVUU1BFQyAqcERvdDExZik7CisKK3ZvaWQgcG9wdWxhdGVfZG90MTFmX3dtbXRzcGVjKHRTaXJNYWNUc3BlY0lFICpwT2xkLCB0RG90MTFmSUVXTU1UU1BFQyAqcERvdDExZik7CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl90Y2xhcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0U2lyVGNsYXNJbmZvICpwT2xkLCB0RG90MTFmSUVUQ0xBUyAqcERvdDExZik7CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl93bW10Y2xhcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdFNpclRjbGFzSW5mbyAqcE9sZCwgdERvdDExZklFV01NVENMQVMgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl93c2ModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXREb3QxMWZJRVdzY0JlYWNvbiAqcERvdDExZik7CisKK3RTaXJSZXRTdGF0dXMgcG9wdWxhdGVfZG90MTFmX3dzY19yZWdpc3RyYXJfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdERvdDExZklFV3NjQmVhY29uICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cyBkZV9wb3B1bGF0ZV9kb3QxMWZfd3NjX3JlZ2lzdHJhcl9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQl0RG90MTFmSUVXc2NCZWFjb24gKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl9wcm9iZV9yZXNfd3BzaV9lcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdERvdDExZklFV3NjUHJvYmVSZXMgKnBEb3QxMWYsCisJCQkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3RTaXJSZXRTdGF0dXMgcG9wdWxhdGVfZG90MTFmX2Fzc29jX3Jlc193cHNpX2VzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQl0RG90MTFmSUVXc2NBc3NvY1JlcyAqcERvdDExZiwKKwkJCQkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfYmVhY29uX3dwc2lfZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJdERvdDExZklFV3NjQmVhY29uICpwRG90MTFmLAorCQkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfd3NjX2luX3Byb2JlX3Jlcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl0RG90MTFmSUVXc2NQcm9iZVJlcyAqcERvdDExZik7CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl93c2NfcmVnaXN0cmFyX2luZm9faW5fcHJvYmVfcmVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXREb3QxMWZJRVdzY1Byb2JlUmVzICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cworZGVfcG9wdWxhdGVfZG90MTFmX3dzY19yZWdpc3RyYXJfaW5mb19pbl9wcm9iZV9yZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCXREb3QxMWZJRVdzY1Byb2JlUmVzICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfYXNzb2NfcmVzX3dzY19pZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl0RG90MTFmSUVXc2NBc3NvY1JlcyAqcERvdDExZiwKKwkJCQkJdHBTaXJBc3NvY1JlcSBwUmN2ZEFzc29jUmVxKTsKKwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMV9hc3NvY19yZXNfcDJwX2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXREb3QxMWZJRVAyUEFzc29jUmVzICpwRG90MTFmLAorCQkJCQl0cFNpckFzc29jUmVxIHBSY3ZkQXNzb2NSZXEpOworCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl93c2NJbkFzc29jUmVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXREb3QxMWZJRVdzY0Fzc29jUmVzICpwRG90MTFmKTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfd2ZhdHBjKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdERvdDExZklFV0ZBVFBDICpwRG90MTFmLCB1aW50OF90IHR4UG93ZXIsCisJCQkJdWludDhfdCBsaW5rTWFyZ2luKTsKKwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfcnJtX2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdERvdDExZklFUlJNRW5hYmxlZENhcCAqcERvdDExZiwKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgordm9pZCBwb3B1bGF0ZV9tZGllKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXREb3QxMWZJRU1vYmlsaXR5RG9tYWluICogcERvdDExZiwgdWludDhfdCBtZGllW10pOwordm9pZCBwb3B1bGF0ZV9mdF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRUZUSW5mbyAqcERvdDExZik7CisjZW5kaWYKKwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfYXNzb2NfcnNwX3JhdGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdERvdDExZklFU3VwcFJhdGVzICpwU3VwcCwKKwkJCQl0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKnBFeHQsCisJCQkJdWludDE2X3QgKl8xMWJSYXRlcywgdWludDE2X3QgKl8xMWFSYXRlcyk7CisKK2ludCBmaW5kX2llX2xvY2F0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyUlNOaWUgcFJzbkllLCB1aW50OF90IEVJRCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQwordFNpclJldFN0YXR1cworcG9wdWxhdGVfZG90MTFmX3ZodF9jYXBzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQl0RG90MTFmSUVWSFRDYXBzICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cworcG9wdWxhdGVfZG90MTFmX3ZodF9vcGVyYXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQl0RG90MTFmSUVWSFRPcGVyYXRpb24gKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfdmh0X2V4dF9ic3NfbG9hZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXREb3QxMWZJRVZIVEV4dEJzc0xvYWQgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfZXh0X2NhcCh0cEFuaVNpckdsb2JhbCBwTWFjLCBib29sIGlzVkhURW5hYmxlZCwKKwkJCXREb3QxMWZJRUV4dENhcCAqcERvdDExZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9vcGVyYXRpbmdfbW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdERvdDExZklFT3BlcmF0aW5nTW9kZSAqcERvdDExZiwKKwkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2b2lkCitwb3B1bGF0ZV9kb3QxMWZfd2lkZXJfYndfY2hhbl9zd2l0Y2hfYW5uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXREb3QxMWZJRVdpZGVyQldDaGFuU3dpdGNoQW5uICpwRG90MTFmLAorCQkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZgorCit2b2lkIHBvcHVsYXRlX2RvdDExZl90aW1lb3V0X2ludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdERvdDExZklFVGltZW91dEludGVydmFsICpwRG90MTFmLAorCQkJCXVpbnQ4X3QgdHlwZSwgdWludDMyX3QgdmFsdWUpOworCisjaWZkZWYgRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFCisvKiBQb3B1bGF0ZSBhIHREb3QxMWZJRVFDb21WZW5kb3JJRSAqLwordm9pZAorcG9wdWxhdGVfZG90MTFmX2F2b2lkX2NoYW5uZWxfaWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQl0RG90MTFmSUVRQ29tVmVuZG9ySUUgKmRvdDExZiwKKwkJCQl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KTsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfdGltaW5nX2FkdmVydF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCXREb3QxMWZUaW1pbmdBZHZlcnRpc2VtZW50RnJhbWUgKmZyYW1lKTsKKworI2VuZGlmIC8qIF9fUEFSU0VfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvaW5jbHVkZS9zaXJfY29tbW9uLmggYi9jb3JlL21hYy9zcmMvaW5jbHVkZS9zaXJfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5OTc3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9pbmNsdWRlL3Npcl9jb21tb24uaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBzaXJfY29tbW9uLmggY29udGFpbnMgdGhlIGNvbW1vbiBkZWZpbml0aW9ucyB1c2VkIGJ5IGFsbAorICogRmlybXdhcmUgbW9kdWxlcy4KKyAqCisgKiBBdXRob3I6ICAgICAgVi4gSy4gS2FuZGFycGEKKyAqIERhdGU6ICAgICAgICAwNC8xMi8yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfX1NJUkNPTU1PTl9ICisjZGVmaW5lIF9fU0lSQ09NTU9OX0gKKworI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJzaXJfcGFyYW1zLmgiCisjaW5jbHVkZSAic3lzX3dyYXBwZXIuaCIKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgU0lSSVVTIFNZU1RFTSBFWFRFUk5BTCBHTE9CQUxTICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIEFsbCB0aGUgZm9sbG93aW5nIGFyZSByZXNvdXJjZSBkZWZpbml0aW9ucyAqLworCisjZW5kaWYgLyogX19TSVJDT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL2luY2x1ZGUvc2lyX2RlYnVnLmggYi9jb3JlL21hYy9zcmMvaW5jbHVkZS9zaXJfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQ4NTVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL2luY2x1ZGUvc2lyX2RlYnVnLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICovCisKKyNpZm5kZWYgX19QT0xfREVCVUdfSF9fCisjZGVmaW5lIF9fUE9MX0RFQlVHX0hfXworCisjZGVmaW5lIExPR09GRiAgMAorI2RlZmluZSBMT0dQICAgIDEKKyNkZWZpbmUgTE9HRSAgICAyCisjZGVmaW5lIExPR1cgICAgMworI2RlZmluZSBMT0cxICAgIDQKKyNkZWZpbmUgTE9HMiAgICA1CisjZGVmaW5lIExPRzMgICAgNgorI2RlZmluZSBMT0c0ICAgIDcKKworI2lmZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorI2lmZGVmIFBFX0RFQlVHX0xPR0UKKyNkZWZpbmUgUEVMT0dFKHApIHsgcCB9CisjZWxzZQorI2RlZmluZSBQRUxPR0UocCkgeyB9CisjZW5kaWYKKworI2lmZGVmIFBFX0RFQlVHX0xPR1cKKyNkZWZpbmUgUEVMT0dXKHApIHsgcCB9CisjZWxzZQorI2RlZmluZSBQRUxPR1cocCkgeyB9CisjZW5kaWYKKworI2RlZmluZSBQRUxPRzEocCkgeyB9CisjZGVmaW5lIFBFTE9HMihwKSB7IH0KKyNkZWZpbmUgUEVMT0czKHApIHsgfQorI2RlZmluZSBQRUxPRzQocCkgeyB9CisKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUICovCisKKyNpZmRlZiBQRV9ERUJVR19MT0dFCisjZGVmaW5lIFBFTE9HRShwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0dFKHApIHsgfQorI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0dXCisjZGVmaW5lIFBFTE9HVyhwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0dXKHApIHsgfQorI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0cxCisjZGVmaW5lIFBFTE9HMShwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0cxKHApIHsgfQorI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0cyCisjZGVmaW5lIFBFTE9HMihwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0cyKHApIHsgfQorI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0czCisjZGVmaW5lIFBFTE9HMyhwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0czKHApIHsgfQorI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0c0CisjZGVmaW5lIFBFTE9HNChwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0c0KHApIHsgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQgKi8KKworI2RlZmluZSBGTCh4KSAgICAiJXM6ICVkOiAiIFwKKwl4LCBfX2Z1bmNfXywgX19MSU5FX18KKworI2RlZmluZSBNQUNfQUREUl9BUlJBWShhKSAoYSlbMF0sIChhKVsxXSwgKGEpWzJdLCAoYSlbM10sIChhKVs0XSwgKGEpWzVdCisjZGVmaW5lIE1BQ19BRERSRVNTX1NUUiAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL2luY2x1ZGUvc2lyX3BhcmFtcy5oIGIvY29yZS9tYWMvc3JjL2luY2x1ZGUvc2lyX3BhcmFtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NTEzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvaW5jbHVkZS9zaXJfcGFyYW1zLmgKQEAgLTAsMCArMSw3NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgc2lyX3BhcmFtcy5oIGNvbnRhaW5zIHRoZSBjb21tb24gcGFyYW1ldGVyIGRlZmluaXRpb25zLCB3aGljaAorICogYXJlIG5vdCBkZXBlbmRlbnQgb24gdGhyZWFkWCBBUEkuIFRoZXNlIGNhbiBiZSB1c2VkIGJ5IGFsbCBGaXJtd2FyZQorICogbW9kdWxlcy4KKyAqCisgKiBBdXRob3I6ICAgICAgU2FuZGVzaCBHb2VsCisgKiBEYXRlOiAgICAgICAgMDQvMTMvMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX19TSVJQQVJBTVNfSAorI2RlZmluZSBfX1NJUlBBUkFNU19ICisKKyNpbmNsdWRlICJzaXJfdHlwZXMuaCIKKworLyogZGVmaW5lcyBmb3IgV1BTIGNvbmZpZyBzdGF0ZXMgKi8KKyNkZWZpbmUgICAgICAgU0FQX1dQU19ESVNBQkxFRCAgICAgICAgICAgICAwCisjZGVmaW5lICAgICAgIFNBUF9XUFNfRU5BQkxFRF9VTkNPTkZJR1VSRUQgMQorI2RlZmluZSAgICAgICBTQVBfV1BTX0VOQUJMRURfQ09ORklHVVJFRCAgIDIKKworCisvKiBGaXJtd2FyZSB3aWRlIGNvbnN0YW50cyAqLworCisjZGVmaW5lIFNJUl9NQVhfUEFDS0VUX1NJWkUgICAgIDUxMgorI2RlZmluZSBTSVJfTUFYX05VTV9DSEFOTkVMUyAgICA2NAorI2RlZmluZSBTSVJfTUFYX05VTV9TVEFfSU5fSUJTUyAxNgorI2RlZmluZSBTSVJfRVNFX01BWF9NRUFTX0lFX1JFUVMgICA4CisKK3R5cGVkZWYgZW51bSB7CisJUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEID0gMCwgICAgICAgIC8qIDIwTUh6IElGIGJhbmR3aWR0aCBjZW50ZXJlZCBvbiBJRiBjYXJyaWVyICovCisJUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZID0gMSwgICAgIC8qIDQwTUh6IElGIGJhbmR3aWR0aCB3aXRoIGxvd2VyIDIwTUh6IHN1cHBvcnRpbmcgdGhlIHByaW1hcnkgY2hhbm5lbCAqLworCVBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlkgPSAzLCAgICAvKiA0ME1IeiBJRiBiYW5kd2lkdGggd2l0aCBoaWdoZXIgMjBNSHogc3VwcG9ydGluZyB0aGUgcHJpbWFyeSBjaGFubmVsICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0NFTlRFUkVEID0gNCwgICAgIC8qIDIwLzQwTUhaIG9mZnNldCBMT1cgNDAvODBNSFogb2Zmc2V0IENFTlRFUkVEICovCisJUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0NFTlRFUkVEXzQwTUhaX0NFTlRFUkVEID0gNSwgICAgICAgIC8qIDIwLzQwTUhaIG9mZnNldCBDRU5URVJFRCA0MC84ME1IWiBvZmZzZXQgQ0VOVEVSRUQgKi8KKwlQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9DRU5URVJFRCA9IDYsICAgIC8qIDIwLzQwTUhaIG9mZnNldCBISUdIIDQwLzgwTUhaIG9mZnNldCBDRU5URVJFRCAqLworCVBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfTE9XID0gNywgIC8qIDIwLzQwTUhaIG9mZnNldCBMT1cgNDAvODBNSFogb2Zmc2V0IExPVyAqLworCVBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0xPVyA9IDgsIC8qIDIwLzQwTUhaIG9mZnNldCBISUdIIDQwLzgwTUhaIG9mZnNldCBMT1cgKi8KKwlQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0hJR0ggPSA5LCAvKiAyMC80ME1IWiBvZmZzZXQgTE9XIDQwLzgwTUhaIG9mZnNldCBISUdIICovCisJUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfSElHSCA9IDEwLCAgICAgICAvKiAyMC80ME1IWiBvZmZzZXQtSElHSCA0MC84ME1IWiBvZmZzZXQgSElHSCAqLworI2VuZGlmCisJUEhZX0NIQU5ORUxfQk9ORElOR19TVEFURV9NQVggPSAxMQorfSBlUGh5Q2hhbkJvbmRTdGF0ZTsKKworI2RlZmluZSBNQVhfQk9OREVEX0NIQU5ORUxTIDQKKwordHlwZWRlZiBlbnVtIHsKKwlNQ0MgPSAwLAorCVAyUCA9IDEsCisJRE9UMTFBQyA9IDIsCisJU0xNX1NFU1NJT05JWkFUSU9OID0gMywKKwlET1QxMUFDX09QTU9ERSA9IDQsCisJU0FQMzJTVEEgPSA1LAorCVRETFMgPSA2LAorCVAyUF9HT19OT0FfREVDT1VQTEVfSU5JVF9TQ0FOID0gNywKKwlXTEFOQUNUSVZFX09GRkxPQUQgPSA4LAorI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisJRVhURU5ERURfU0NBTiA9IDksCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwlQTk8gPSAxMCwKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9OQU4KKwlOQU4gPSAxMSwKKyNlbmRpZgorCVJUVCA9IDEyLAorCVdPVyA9IDIyLAorCVdMQU5fUk9BTV9TQ0FOX09GRkxPQUQgPSAyMywKKwlJQlNTX0hFQVJUQkVBVF9PRkZMT0FEID0gMjYsCisJV0xBTl9QRVJJT0RJQ19UWF9QVFJOID0gMjgsCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwlBRFZBTkNFX1RETFMgPSAyOSwKKwlURExTX09GRl9DSEFOTkVMID0gMzAsCisjZW5kaWYKKworCS8qIE1BWF9GRUFUVVJFX1NVUFBPUlRFRCA9IDEyOCAqLworfSBwbGFjZUhvbGRlckluQ2FwQml0bWFwOworCit0eXBlZGVmIGVudW0gZVNyaUxpbmtTdGF0ZSB7CisJZVNJUl9MSU5LX0lETEVfU1RBVEUgPSAwLAorCWVTSVJfTElOS19QUkVBU1NPQ19TVEFURSA9IDEsCisJZVNJUl9MSU5LX1BPU1RBU1NPQ19TVEFURSA9IDIsCisJZVNJUl9MSU5LX0FQX1NUQVRFID0gMywKKwllU0lSX0xJTktfSUJTU19TVEFURSA9IDQsCisJLyogQlQtQU1QIENhc2UgKi8KKwllU0lSX0xJTktfQlRBTVBfUFJFQVNTT0NfU1RBVEUgPSA1LAorCWVTSVJfTElOS19CVEFNUF9QT1NUQVNTT0NfU1RBVEUgPSA2LAorCWVTSVJfTElOS19CVEFNUF9BUF9TVEFURSA9IDcsCisJZVNJUl9MSU5LX0JUQU1QX1NUQV9TVEFURSA9IDgsCisKKwkvKiBSZXNlcnZlZCBmb3IgSEFMIGludGVybmFsIHVzZSAqLworCWVTSVJfTElOS19MRUFSTl9TVEFURSA9IDksCisJZVNJUl9MSU5LX1NDQU5fU1RBVEUgPSAxMCwKKwllU0lSX0xJTktfRklOSVNIX1NDQU5fU1RBVEUgPSAxMSwKKwllU0lSX0xJTktfSU5JVF9DQUxfU1RBVEUgPSAxMiwKKwllU0lSX0xJTktfRklOSVNIX0NBTF9TVEFURSA9IDEzLAorCWVTSVJfTElOS19MSVNURU5fU1RBVEUgPSAxNCwKKwllU0lSX0xJTktfU0VORF9BQ1RJT05fU1RBVEUgPSAxNSwKKwllU0lSX0xJTktfRE9XTl9TVEFURSA9IDE2LAorfSB0U2lyTGlua1N0YXRlOworCisvKiAvIE1lc3NhZ2UgcXVldWUgc3RydWN0dXJlIHVzZWQgYWNyb3NzIFNpcml1cyBwcm9qZWN0LiAqLworLyogLyBOT1RFOiB0aGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgbXVsdGlwbGVzIG9mIGEgd29yZCBzaXplICg0Ynl0ZXMpICovCisvKiAvIGFzIHRoaXMgaXMgdXNlZCBpbiB0eF9xdWV1ZSB3aGVyZSBpdCBleHBlY3RzIHRvIGJlIG11bHRpcGxlcyBvZiA0IGJ5dGVzLiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1zZ1EgeworCXVpbnQxNl90IHR5cGU7CisJLyoKKwkgKiBUaGlzIGZpZWxkIGNhbiBiZSB1c2VkIGFzIHNlcXVlbmNlIG51bWJlci9kaWFsb2cgdG9rZW4gZm9yIG1hdGNoaW5nCisJICogcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4KKwkgKi8KKwl1aW50MTZfdCByZXNlcnZlZDsKKwkvKioKKwkgKiBCYXNlZCBvbiB0aGUgdHlwZSBlaXRoZXIgYSBib2R5cHRyIHBvaW50ZXIgaW50bworCSAqIG1lbW9yeSBvciBib2R5dmFsIGFzIGEgMzIgYml0IGRhdGEgaXMgdXNlZC4KKwkgKiBib2R5cHRyOiBpcyBhbHdheXMgYSBmcmVlYWJsZSBwb2ludGVyLCBvbmUgc2hvdWxkIGFsd2F5cworCSAqIG1ha2Ugc3VyZSB0aGF0IGJvZHlwdHIgaXMgYWx3YXlzIGZyZWVhYmxlLgorCSAqCisJICogTWVzc2FnZXMgc2hvdWxkIHVzZSBlaXRoZXIgYm9keXB0ciBvciBib2R5dmFsOyBub3QgYm90aCAhISEuCisJICovCisJdm9pZCAqYm9keXB0cjsKKwl1aW50MzJfdCBib2R5dmFsOworCisJLyoKKwkgKiBTb21lIG1lc3NhZ2VzIHByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbi4gIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUKKwkgKiBtdXN0IGJlIGFncmVlZCB1cG9uIGJldHdlZW4gdGhlIHR3byBlbnRpdGllcyBleGNoYW5naW5nIHRoZSBtZXNzYWdlCisJICovCisJdm9pZCAqY2FsbGJhY2s7CisKK30gdFNpck1zZ1EsICp0cFNpck1zZ1E7CisKKy8qIC8gTWFpbGJveCBNZXNzYWdlIFN0cnVjdHVyZSBEZWZpbmUgKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJNYk1zZyB7CisJdWludDE2X3QgdHlwZTsKKworCS8qKgorCSAqIFRoaXMgbGVuZ3RoIGluY2x1ZGVzIDQgYnl0ZXMgb2YgaGVhZGVyLCB0aGF0IGlzLAorCSAqIDIgYnl0ZXMgdHlwZSArIDIgYnl0ZXMgbXNnTGVuICsgbio0IGJ5dGVzIG9mIGRhdGEuCisJICogVGhpcyBmaWVsZCBpcyBieXRlIGxlbmd0aC4KKwkgKi8KKwl1aW50MTZfdCBtc2dMZW47CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBmaXJzdCBkYXRhIHdvcmQgaW4gdGhlIG1haWxib3ggbWVzc2FnZS4KKwkgKiBJdCBpcyBmb2xsb3dlZCBieSBuIHdvcmRzIG9mIGRhdGEuCisJICogTk9URTogZGF0YVsxXSBpcyBub3QgYSBwbGFjZSBob2xkZXIgdG8gc3RvcmUgZGF0YQorCSAqIGluc3RlYWQgdG8gZGVyZWZlcmVuY2UgdGhlIG1lc3NhZ2UgYm9keS4KKwkgKi8KKwl1aW50MzJfdCBkYXRhWzFdOworfSB0U2lyTWJNc2csICp0cFNpck1iTXNnOworCisvKiAvIE1haWxib3ggTWVzc2FnZSBTdHJ1Y3R1cmUgZm9yIFAyUCAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1iTXNnUDJwIHsKKwl1aW50MTZfdCB0eXBlOworCisJLyoqCisJICogVGhpcyBsZW5ndGggaW5jbHVkZXMgNCBieXRlcyBvZiBoZWFkZXIsIHRoYXQgaXMsCisJICogMiBieXRlcyB0eXBlICsgMiBieXRlcyBtc2dMZW4gKyBuKjQgYnl0ZXMgb2YgZGF0YS4KKwkgKiBUaGlzIGZpZWxkIGlzIGJ5dGUgbGVuZ3RoLgorCSAqLworCXVpbnQxNl90IG1zZ0xlbjsKKworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXVpbnQ4X3Qgbm9hY2s7CisJdWludDE2X3Qgd2FpdDsKKwl1aW50MTZfdCBjaGFubmVsX2ZyZXE7CisJdWludDMyX3Qgc2Nhbl9pZDsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGZpcnN0IGRhdGEgd29yZCBpbiB0aGUgbWFpbGJveCBtZXNzYWdlLgorCSAqIEl0IGlzIGZvbGxvd2VkIGJ5IG4gd29yZHMgb2YgZGF0YS4KKwkgKiBOT1RFOiBkYXRhWzFdIGlzIG5vdCBhIHBsYWNlIGhvbGRlciB0byBzdG9yZSBkYXRhCisJICogaW5zdGVhZCB0byBkZXJlZmVyZW5jZSB0aGUgbWVzc2FnZSBib2R5LgorCSAqLworCXVpbnQzMl90IGRhdGFbMV07Cit9IHRTaXJNYk1zZ1AycCwgKnRwU2lyTWJNc2dQMnA7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICBTSVJJVVMgTUVTU0FHRSBUWVBFUyAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1lc3NhZ2UgdHlwZXMgaGF2ZSBib3VuZHMgZGVmaW5lZCBmb3IgZWFjaCBtb2R1bGUgZm9yCisgKiBpbnRlciB0aHJlYWQvbW9kdWxlIGNvbW11bmljYXRpb25zLgorICogRWFjaCBtb2R1bGUgd2lsbCBnZXQgMjU2IG1lc3NhZ2UgdHlwZXMgaW4gdG90YWwuCisgKiBOb3RlIHRoYXQgbWVzc2FnZSB0eXBlIGRlZmluaXRpb25zIGZvciBtYWlsYm94IG1lc3NhZ2VzIGZvcgorICogY29tbXVuaWNhdGlvbiB3aXRoIEhvc3QgYXJlIGluIHduaV9hcGkuaCBmaWxlLgorICoKKyAqIEFueSBhZGRpdGlvbi9kZWxldGlvbiB0byB0aGlzIG1lc3NhZ2UgbGlzdCBzaG91bGQgYWxzbyBiZQorICogcmVmbGVjdGVkIGluIHRoZSBoYWxVdGlsX2dldE1zZ1N0cmluZygpIHJvdXRpbmUuCisgKi8KKworLyogSEFMIG1lc3NhZ2UgdHlwZXMgKi8KKyNkZWZpbmUgU0lSX0hBTF9NU0dfVFlQRVNfQkVHSU4gICAgICAgICAgICAoU0lSX0hBTF9NT0RVTEVfSUQgPDwgOCkKKyNkZWZpbmUgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICAgICAgICAoU0lSX0hBTF9NU0dfVFlQRVNfQkVHSU4rMHgyMCkKKyNkZWZpbmUgU0lSX0hBTF9SQURBUl9ERVRFQ1RFRF9JTkQgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4KKworLyoKKyAqIE5ldyBUYXVydXMgcmVsYXRlZCBtZXNzYWdlcworICovCisjZGVmaW5lIFNJUl9IQUxfQUREX1NUQV9SRVEgICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEpCisjZGVmaW5lIFNJUl9IQUxfQUREX1NUQV9SU1AgICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIpCisjZGVmaW5lIFNJUl9IQUxfREVMRVRFX1NUQV9SRVEgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDMpCisjZGVmaW5lIFNJUl9IQUxfREVMRVRFX1NUQV9SU1AgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDQpCisjZGVmaW5lIFNJUl9IQUxfQUREX0JTU19SRVEgICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDUpCisjZGVmaW5lIFNJUl9IQUxfQUREX0JTU19SU1AgICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDYpCisjZGVmaW5lIFNJUl9IQUxfREVMRVRFX0JTU19SRVEgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDcpCisjZGVmaW5lIFNJUl9IQUxfREVMRVRFX0JTU19SU1AgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDgpCisjZGVmaW5lIFNJUl9IQUxfSU5JVF9TQ0FOX1JFUSAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDkpCisjZGVmaW5lIFNJUl9IQUxfSU5JVF9TQ0FOX1JTUCAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEwKQorI2RlZmluZSBTSVJfSEFMX1NUQVJUX1NDQU5fUkVRICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMSkKKyNkZWZpbmUgU0lSX0hBTF9TVEFSVF9TQ0FOX1JTUCAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTIpCisjZGVmaW5lIFNJUl9IQUxfRU5EX1NDQU5fUkVRICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEzKQorI2RlZmluZSBTSVJfSEFMX0VORF9TQ0FOX1JTUCAgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNCkKKyNkZWZpbmUgU0lSX0hBTF9GSU5JU0hfU0NBTl9SRVEgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTUpCisjZGVmaW5lIFNJUl9IQUxfRklOSVNIX1NDQU5fUlNQICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE2KQorI2RlZmluZSBTSVJfSEFMX1NFTkRfQkVBQ09OX1JFUSAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNykKKworI2RlZmluZSBTSVJfSEFMX1NFVF9CU1NLRVlfUkVRICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxOCkKKyNkZWZpbmUgU0lSX0hBTF9TRVRfQlNTS0VZX1JTUCAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTkpCisjZGVmaW5lIFNJUl9IQUxfU0VUX1NUQUtFWV9SRVEgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIwKQorI2RlZmluZSBTSVJfSEFMX1NFVF9TVEFLRVlfUlNQICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMSkKKyNkZWZpbmUgU0lSX0hBTF9VUERBVEVfRURDQV9QUk9GSUxFX0lORCAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjIpCisKKyNkZWZpbmUgU0lSX0hBTF9VUERBVEVfQkVBQ09OX0lORCAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjMpCisjZGVmaW5lIFNJUl9IQUxfVVBEQVRFX0NGX0lORCAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDI0KQorI2RlZmluZSBTSVJfSEFMX0NITkxfU1dJVENIX1JFUSAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyNSkKKyNkZWZpbmUgU0lSX0hBTF9BRERfVFNfUkVRICAgICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjYpCisjZGVmaW5lIFNJUl9IQUxfREVMX1RTX1JFUSAgICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDI3KQorCisjZGVmaW5lIFNJUl9IQUxfTUlTU0VEX0JFQUNPTl9JTkQgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDM0KQorCisjZGVmaW5lIFNJUl9IQUxfU1dJVENIX0NIQU5ORUxfUlNQICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDM1KQorI2RlZmluZSBTSVJfSEFMX1BXUl9TQVZFX0NGRyAgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzNikKKworI2RlZmluZSBTSVJfSEFMX1JFR0lTVEVSX1BFX0NBTExCQUNLICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzNykKKworI2RlZmluZSBTSVJfSEFMX0lCU1NfU1RBX0FERCAgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA0MykKKyNkZWZpbmUgU0lSX0hBTF9USU1FUl9BREpVU1RfQURBUFRJVkVfVEhSRVNIT0xEX0lORCBcCisJCQkJCSAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA0NCkKKyNkZWZpbmUgU0lSX0hBTF9TRVRfTElOS19TVEFURSAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNDUpCisKKy8qCisgKiAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNDYpIHRvCisgKiAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNTcpIGFyZSB1bnVzZWQKKyAqLworCisjZGVmaW5lIFNJUl9IQUxfU0VUX1NUQV9CQ0FTVEtFWV9SRVEgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDU4KQorI2RlZmluZSBTSVJfSEFMX1NFVF9TVEFfQkNBU1RLRVlfUlNQICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA1OSkKKyNkZWZpbmUgU0lSX0hBTF9BRERfVFNfUlNQICAgICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNjApCisjZGVmaW5lIFNJUl9IQUxfRFBVX01JQ19FUlJPUiAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDYxKQorI2RlZmluZSBTSVJfSEFMX1RJTUVSX0NISVBfTU9OSVRPUl9USU1FT1VUIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA2MykKKyNkZWZpbmUgU0lSX0hBTF9USU1FUl9UUkFGRklDX0FDVElWSVRZX1JFUSAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNjQpCisjZGVmaW5lIFNJUl9IQUxfVElNRVJfQURDX1JTU0lfU1RBVFMgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDY1KQorLyogKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDY2KSBpcyB1bnVzZWQgKi8KKyNkZWZpbmUgU0lSX0hBTF9TRVRfTUlNT1BTX1JFUSAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNjcpCisjZGVmaW5lIFNJUl9IQUxfU0VUX01JTU9QU19SU1AgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDY4KQorI2RlZmluZSBTSVJfSEFMX1NZU19SRUFEWV9JTkQgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA2OSkKKyNkZWZpbmUgU0lSX0hBTF9TRVRfVFhfUE9XRVJfUkVRICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNzApCisjZGVmaW5lIFNJUl9IQUxfU0VUX1RYX1BPV0VSX1JTUCAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDcxKQorI2RlZmluZSBTSVJfSEFMX0dFVF9UWF9QT1dFUl9SRVEgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA3MikKKyNkZWZpbmUgU0lSX0hBTF9HRVRfVFhfUE9XRVJfUlNQICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNzMpCisjZGVmaW5lIFNJUl9IQUxfR0VUX05PSVNFX1JTUCAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDc0KQorCisvKiBNZXNzYWdlcyB0byBzdXBwb3J0IHRyYW5zbWl0X2hhbHQgYW5kIHRyYW5zbWl0X3Jlc3VtZSAqLworI2RlZmluZSBTSVJfSEFMX1RSQU5TTUlTU0lPTl9DT05UUk9MX0lORCAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA3NSkKKworI2RlZmluZSBTSVJfSEFMX0xPV19SU1NJX0lORCAgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA4MCkKKyNkZWZpbmUgU0lSX0hBTF9CRUFDT05fRklMVEVSX0lORCAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgODEpCisvKiAvIFBFIDwtPiBIQUwgV09XTCBtZXNzYWdlcyAqLworI2RlZmluZSBTSVJfSEFMX1dPV19BRERfUFRSTiAgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA4MikKKyNkZWZpbmUgU0lSX0hBTF9XT1dfREVMX1BUUk4gICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgODMpCisjZGVmaW5lIFNJUl9IQUxfV09XTF9FTlRFUl9SRVEgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDg0KQorI2RlZmluZSBTSVJfSEFMX1dPV0xfRU5URVJfUlNQICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA4NSkKKyNkZWZpbmUgU0lSX0hBTF9XT1dMX0VYSVRfUkVRICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgODYpCisjZGVmaW5lIFNJUl9IQUxfV09XTF9FWElUX1JTUCAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDg3KQorLyogLyBQRSA8LT4gSEFMIHN0YXRpc3RpY3MgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU0lSX0hBTF9HRVRfU1RBVElTVElDU19SRVEgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgODgpCisjZGVmaW5lIFNJUl9IQUxfR0VUX1NUQVRJU1RJQ1NfUlNQICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDg5KQorI2RlZmluZSBTSVJfSEFMX1NFVF9LRVlfRE9ORSAgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA5MCkKKworLyogLyBQRSA8LT4gSEFMIEJUQyBtZXNzYWdlcyAqLworI2RlZmluZSBTSVJfSEFMX0JUQ19TRVRfQ0ZHICAgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA5MSkKKy8qIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA5MikgaXMgdW51c2VkICovCisjZGVmaW5lIFNJUl9IQUxfSEFORExFX0ZXX01CT1hfUlNQICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDkzKQorI2RlZmluZSBTSVJfSEFMX1NFTkRfUFJPQkVfUlNQX1RNUEwgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA5NCkKKworLyogUEUgPC0+IEhBTCBhZGRyMiBtaXNtYXRjaCBtZXNzYWdlICovCisjZGVmaW5lIFNJUl9MSU1fQUREUjJfTUlTU19JTkQgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDk1KQorI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorLyogUEUgPC0+IEhBTCBPRU1fREFUQSBSRUxBVEVEIE1FU1NBR0VTICovCisjZGVmaW5lIFNJUl9IQUxfU1RBUlRfT0VNX0RBVEFfUkVRICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDk2KQorI2RlZmluZSBTSVJfSEFMX1NUQVJUX09FTV9EQVRBX1JTUCAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA5NykKKyNlbmRpZgorCisjZGVmaW5lIFNJUl9IQUxfU0VUX01BWF9UWF9QT1dFUl9SRVEgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDk4KQorI2RlZmluZSBTSVJfSEFMX1NFVF9NQVhfVFhfUE9XRVJfUlNQICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA5OSkKKworLyogLyBQRSA8LT4gSEFMIEhvc3QgT2ZmbG9hZCBtZXNzYWdlICovCisjZGVmaW5lIFNJUl9IQUxfU0VUX0hPU1RfT0ZGTE9BRCAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEwMCkKKworI2RlZmluZSBTSVJfSEFMX0FERF9TVEFfU0VMRl9SRVEgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMDEpCisjZGVmaW5lIFNJUl9IQUxfQUREX1NUQV9TRUxGX1JTUCAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEwMikKKyNkZWZpbmUgU0lSX0hBTF9ERUxfU1RBX1NFTEZfUkVRICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTAzKQorI2RlZmluZSBTSVJfSEFMX0RFTF9TVEFfU0VMRl9SU1AgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMDQpCisKKyNkZWZpbmUgU0lSX0hBTF9DRkdfUlhQX0ZJTFRFUl9SRVEgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTA2KQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNkZWZpbmUgU0lSX0hBTF9BR0dSX0FERF9UU19SRVEgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTA3KQorI2RlZmluZSBTSVJfSEFMX0FHR1JfQUREX1RTX1JTUCAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMDgpCisjZGVmaW5lIFNJUl9IQUxfQUdHUl9RT1NfUkVRICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEwOSkKKyNkZWZpbmUgU0lSX0hBTF9BR0dSX1FPU19SU1AgICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTEwKQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKy8qIFAyUCA8LT4gSEFMIFAyUCBtc2cgKi8KKyNkZWZpbmUgU0lSX0hBTF9TRVRfUDJQX0dPX05PQV9SRVEgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTExKQorI2RlZmluZSBTSVJfSEFMX1AyUF9OT0FfQVRUUl9JTkQgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTIpCisjZGVmaW5lIFNJUl9IQUxfUDJQX05PQV9TVEFSVF9JTkQgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDExMykKKworI2RlZmluZSBTSVJfSEFMX1NFVF9MSU5LX1NUQVRFX1JTUCAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTQpCisKKyNkZWZpbmUgU0lSX0hBTF9XTEFOX1NVU1BFTkRfSU5EICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTE1KQorI2RlZmluZSBTSVJfSEFMX1dMQU5fUkVTVU1FX1JFUSAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTYpCisKKy8qIC8gUEUgPC0+IEhBTCBLZWVwIEFsaXZlIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU0lSX0hBTF9TRVRfS0VFUF9BTElWRSAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTE3KQorCisjaWZkZWYgV0xBTl9OU19PRkZMT0FECisjZGVmaW5lIFNJUl9IQUxfU0VUX05TX09GRkxPQUQgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDExOCkKKyNlbmRpZiAvKiBXTEFOX05TX09GRkxPQUQgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworI2RlZmluZSBTSVJfSEFMX1NFVF9QTk9fUkVRICAgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTkpCisvKiAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTIwKSBpcyB1bnVzZWQgKi8KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKworLyogKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEyMikgaXMgdW51c2VkICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworI2RlZmluZSBTSVJfSEFMXzgwMjNfTVVMVElDQVNUX0xJU1RfUkVRIFwKKwkJCQkJICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEyMykKKyNkZWZpbmUgU0lSX0hBTF9SRUNFSVZFX0ZJTFRFUl9TRVRfRklMVEVSX1JFUSBcCisJCQkJCSAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjQpCisjZGVmaW5lIFNJUl9IQUxfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JFUSBcCisJCQkJCSAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjUpCisjZGVmaW5lIFNJUl9IQUxfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JTUCBcCisJCQkJCSAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjYpCisjZGVmaW5lIFNJUl9IQUxfUkVDRUlWRV9GSUxURVJfQ0xFQVJfRklMVEVSX1JFUSBcCisJCQkJCSAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjcpCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcgKi8KKworLyogKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEyOCkgaXMgdW51c2VkICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKyNkZWZpbmUgU0lSX0hBTF9HVEtfT0ZGTE9BRF9SRVEgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTI5KQorI2RlZmluZSBTSVJfSEFMX0dUS19PRkZMT0FEX0dFVElORk9fUkVRICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzApCisjZGVmaW5lIFNJUl9IQUxfR1RLX09GRkxPQURfR0VUSU5GT19SU1AgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEzMSkKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKyNkZWZpbmUgU0lSX0hBTF9UU01fU1RBVFNfUkVRICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTMyKQorI2RlZmluZSBTSVJfSEFMX1RTTV9TVEFUU19SU1AgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzMpCisjZW5kaWYKKworI2RlZmluZSBTSVJfSEFMX1NFVF9UTV9MRVZFTF9SRVEgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzQpCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworI2RlZmluZSBTSVJfSEFMX1VQREFURV9PUF9NT0RFICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzUpCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisvKiAvIFBFIDwtPiBIQUwgVERMUyBtZXNzYWdlcyAqLworI2RlZmluZSBTSVJfSEFMX1RETFNfTElOS19FU1RBQkxJU0ggICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzYpCisjZGVmaW5lIFNJUl9IQUxfVERMU19MSU5LX1RFQVJET1dOICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEzNykKKyNlbmRpZgorI2RlZmluZSBTSVJfSEFMX1JPQU1fU0NBTl9PRkZMT0FEX1JFUSAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzgpCisKKyNkZWZpbmUgU0lSX0hBTF9UUkFGRklDX1NUQVRTX0lORCAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTQxKQorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworI2RlZmluZSBTSVJfSEFMX0VYQ0xVREVfVU5FTkNSWVBURURfSU5EICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNDIpCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworLyogLyBQRSA8LT4gSEFMIFRETFMgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU0lSX0hBTF9URExTX0xJTktfRVNUQUJMSVNIX1JFUSAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE0MykKKyNkZWZpbmUgU0lSX0hBTF9URExTX0xJTktfRVNUQUJMSVNIX1JFUV9SU1AgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE0NCkKKyNkZWZpbmUgU0lSX0hBTF9URExTX0lORCAgICAgICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE0NSkKKyNlbmRpZgorCisjZGVmaW5lIFNJUl9IQUxfU1RPUF9TQ0FOX09GRkxPQURfUkVRICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE0NikKKyNkZWZpbmUgU0lSX0hBTF9SWF9TQ0FOX0VWRU5UICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTQ3KQorI2RlZmluZSBTSVJfSEFMX0RIQ1BfU1RBUlRfSU5EICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNDgpCisjZGVmaW5lIFNJUl9IQUxfREhDUF9TVE9QX0lORCAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE0OSkKKyNkZWZpbmUgU0lSX0hBTF9JQlNTX1BFRVJfSU5BQ1RJVklUWV9JTkQgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTUwKQorCisjZGVmaW5lIFNJUl9IQUxfTFBIQl9DT05GX0lORCAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1MSkKKworI2RlZmluZSBTSVJfSEFMX0FERF9QRVJJT0RJQ19UWF9QVFJOX0lORCAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNTIpCisjZGVmaW5lIFNJUl9IQUxfREVMX1BFUklPRElDX1RYX1BUUk5fSU5EICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1MykKKworLyogTWVzc2FnZXMgYmV0d2VlbiAxNTYgdG8gMTU3IGFyZSBub3QgdXNlZCAqLworI2RlZmluZSBTSVJfSEFMX1NPQ19EVUFMX01BQ19DRkdfUkVRICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNTQpCisjZGVmaW5lIFNJUl9IQUxfU09DX0RVQUxfTUFDX0NGR19SRVNQICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1NSkKKworI2RlZmluZSBTSVJfSEFMX1JBVEVfVVBEQVRFX0lORCAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNTkpCisKKyNkZWZpbmUgU0lSX0hBTF9GTFVTSF9MT0dfVE9fRlcgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTYwKQorCisjZGVmaW5lIFNJUl9IQUxfU09DX1NFVF9QQ0xfVE9fRlcgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE2MSkKKworLyogMTYyIHVudXNlZCAqLworCisjZGVmaW5lIFNJUl9IQUxfQ0xJX1NFVF9DTUQgICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE2MykKKyNpZm5kZWYgUkVNT1ZFX1BLVF9MT0cKKyNkZWZpbmUgU0lSX0hBTF9QS1RMT0dfRU5BQkxFX1JFUSAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTY0KQorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisjZGVmaW5lIFNJUl9IQUxfU01FX1NDQU5fQ0FDSEVfVVBEQVRFRCAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE2NSkKKyNlbmRpZgorI2RlZmluZSBTSVJfSEFMX1NUQVJUX1NDQU5fT0ZGTE9BRF9SRVEgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNjYpCisjZGVmaW5lIFNJUl9IQUxfVVBEQVRFX0NIQU5fTElTVF9SRVEgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE2NykKKyNkZWZpbmUgU0lSX0NTQV9PRkZMT0FEX0VWRU5UICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE2OSkKKworI2RlZmluZSBTSVJfSEFMX1NFVF9NQVhfVFhfUE9XRVJfUEVSX0JBTkRfUkVRIFwKKwkJCQkJICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNzApCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworI2RlZmluZSBTSVJfSEFMX1VQREFURV9NRU1CRVJTSElQICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTcyKQorI2RlZmluZSBTSVJfSEFMX1VQREFURV9VU0VSUE9TICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTczKQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworI2RlZmluZSBTSVJfSEFMX1VQREFURV9GV19URExTX1NUQVRFICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTc0KQorI2RlZmluZSBTSVJfSEFMX1VQREFURV9URExTX1BFRVJfU1RBVEUgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTc1KQorI2RlZmluZSBTSVJfSEFMX1RETFNfU0hPVUxEX0RJU0NPVkVSICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTc2KQorI2RlZmluZSBTSVJfSEFMX1RETFNfU0hPVUxEX1RFQVJET1dOICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTc3KQorI2RlZmluZSBTSVJfSEFMX1RETFNfUEVFUl9ESVNDT05ORUNURUQgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTc4KQorI2VuZGlmCisKKy8qIEhhbmRsaW5nIG9mIGJlYWNvbiB0eCBpbmRpY2F0aW9uIGZyb20gRlcgKi8KKyNkZWZpbmUgU0lSX0hBTF9CRUFDT05fVFhfU1VDQ0VTU19JTkQgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE3OSkKKyNkZWZpbmUgU0lSX0hBTF9ERlNfUkFEQVJfSU5EICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE4MCkKKworI2RlZmluZSBTSVJfSEFMX0lOSVRfVEhFUk1BTF9JTkZPX0NNRCAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTg1KQorI2RlZmluZSBTSVJfSEFMX1NFVF9USEVSTUFMX0xFVkVMICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTg2KQorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorI2RlZmluZSBTSVJfSEFMX1NFVF9QTE1fUkVRICAgICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTg3KQorI2VuZGlmCisKKyNkZWZpbmUgU0lSX0hBTF9TRVRfVFhfUE9XRVJfTElNSVQgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE4OCkKKyNkZWZpbmUgU0lSX0hBTF9TRVRfU0FQX0lOVFJBQlNTX0RJUyAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE4OSkKKworI2RlZmluZSBTSVJfSEFMX01PREVNX1BPV0VSX1NUQVRFX0lORCAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTkwKQorCisjZGVmaW5lIFNJUl9IQUxfRElTQVNTT0NfVFhfQ09NUCAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxOTEpCisjZGVmaW5lIFNJUl9IQUxfREVBVVRIX1RYX0NPTVAgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxOTIpCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworI2RlZmluZSBTSVJfSEFMX1VQREFURV9SWF9OU1MgICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTkzKQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUCisjZGVmaW5lIFNJUl9IQUxfU1RBVFNfRVhUX1JFUVVFU1QgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxOTQpCisjZGVmaW5lIFNJUl9IQUxfU1RBVFNfRVhUX0VWRU5UICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxOTUpCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1NUQVRTX0VYVCAqLworCisjZGVmaW5lIFNJUl9IQUxfSElERV9TU0lEX1ZERVZfUkVTVEFSVCAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxOTYpCisKKyNkZWZpbmUgU0lSX0hBTF9HRVRfTElOS19TUEVFRCAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE5NykKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisjZGVmaW5lIFNJUl9IQUxfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX1JFUSAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTk4KQorI2RlZmluZSBTSVJfSEFMX0VYVFNDQU5fU1RBUlRfUkVRICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE5OSkKKyNkZWZpbmUgU0lSX0hBTF9FWFRTQ0FOX1NUT1BfUkVRICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMDApCisjZGVmaW5lIFNJUl9IQUxfRVhUU0NBTl9TRVRfQlNTX0hPVExJU1RfUkVRICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjAxKQorI2RlZmluZSBTSVJfSEFMX0VYVFNDQU5fUkVTRVRfQlNTX0hPVExJU1RfUkVRIFwKKwkJCQkJICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjAyKQorI2RlZmluZSBTSVJfSEFMX0VYVFNDQU5fU0VUX1NJR05GX0NIQU5HRV9SRVEgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIwMykKKyNkZWZpbmUgU0lSX0hBTF9FWFRTQ0FOX1JFU0VUX1NJR05GX0NIQU5HRV9SRVEgXAorCQkJCQkgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMDQpCisjZGVmaW5lIFNJUl9IQUxfRVhUU0NBTl9HRVRfQ0FDSEVEX1JFU1VMVFNfUkVRIFwKKwkJCQkJICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjA1KQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FWFRTQ0FOICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQKKyNkZWZpbmUgU0lSX0hBTF9DSF9BVk9JRF9VUERBVEVfUkVRICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMDYpCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCisjZGVmaW5lIFNJUl9IQUxfTExfU1RBVFNfQ0xFQVJfUkVRICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjA3KQorI2RlZmluZSBTSVJfSEFMX0xMX1NUQVRTX1NFVF9SRVEgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIwOCkKKyNkZWZpbmUgU0lSX0hBTF9MTF9TVEFUU19HRVRfUkVRICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMDkpCisjZGVmaW5lIFNJUl9IQUxfTExfU1RBVFNfUkVTVUxUU19SU1AgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjEwKQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisjZGVmaW5lIFNJUl9IQUxfUk9BTV9PRkZMT0FEX1NZTkNIX0NORiAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjExKQorI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorI2RlZmluZSBTSVJfSEFMX05BTl9SRVFVRVNUICAgICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIxMikKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTkFOICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgorI2RlZmluZSBTSVJfSEFMX1NFVF9BVVRPX1NIVVRET1dOX1RJTUVSX1JFUSAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIxMykKKyNlbmRpZgorCisjZGVmaW5lIFNJUl9IQUxfU0VUX0JBU0VfTUFDQUREUl9JTkQgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjE0KQorCisjZGVmaW5lIFNJUl9IQUxfVU5JVF9URVNUX0NNRCAgICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjE1KQorCisjZGVmaW5lIFNJUl9IQUxfTElOS19TVEFUVVNfR0VUX1JFUSAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjE2KQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCisjZGVmaW5lIFNJUl9IQUxfQ09ORklHX0VYVF9XT1cgICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjE3KQorI2RlZmluZSBTSVJfSEFMX0NPTkZJR19BUFBfVFlQRTFfUEFSQU1TICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIxOCkKKyNkZWZpbmUgU0lSX0hBTF9DT05GSUdfQVBQX1RZUEUyX1BBUkFNUyAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMTkpCisjZW5kaWYKKworI2RlZmluZSBTSVJfSEFMX0dFVF9URU1QRVJBVFVSRV9SRVEgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIyMCkKKyNkZWZpbmUgU0lSX0hBTF9TRVRfU0NBTl9NQUNfT1VJX1JFUSAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMjEpCisjaWZkZWYgREhDUF9TRVJWRVJfT0ZGTE9BRAorI2RlZmluZSBTSVJfSEFMX1NFVF9ESENQX1NFUlZFUl9PRkZMT0FEICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIyMikKKyNlbmRpZiAvKiBESENQX1NFUlZFUl9PRkZMT0FEICovCisjZGVmaW5lIFNJUl9IQUxfTEVEX0ZMQVNISU5HX1JFUSAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjIzKQorI2RlZmluZSBTSVJfSEFMX1BST0NFU1NfRldfRVZFTlQgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIyNCkKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKyNkZWZpbmUgU0lSX0hBTF9ST0FNX09GRkxPQURfU1lOQ0hfSU5EICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMjUpCisjZGVmaW5lIFNJUl9IQUxfUk9BTV9PRkZMT0FEX1NZTkNIX0ZBSUwgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjI2KQorI2RlZmluZSBTSVJfSEFMX1JPQU1fSU5WT0tFICAgICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIyNykKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKyNkZWZpbmUgU0lSX0hBTF9URExTX1NFVF9PRkZDSEFOX01PREUgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMjgpCisjZW5kaWYKKworI2RlZmluZSBTSVJfSEFMX1NFVF9NQVMgICAgICAgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMjkpCisjZGVmaW5lIFNJUl9IQUxfU0VUX01JUkFDQVNUICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIzMCkKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKyNkZWZpbmUgU0lSX0hBTF9VUERBVEVfUTJRX0lFX0lORCAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjMxKQorI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworI2RlZmluZSBTSVJfSEFMX0NPTkZJR19TVEFUU19GQUNUT1IgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMzIpCisjZGVmaW5lIFNJUl9IQUxfQ09ORklHX0dVQVJEX1RJTUUgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIzMykKKyNkZWZpbmUgU0lSX0hBTF9JUEFfT0ZGTE9BRF9FTkFCTEVfRElTQUJMRSAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjM0KQorCisjZGVmaW5lIFNJUl9IQUxfRU5URVJfUFNfUkVRICAgICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjM1KQorI2RlZmluZSBTSVJfSEFMX0VYSVRfUFNfUkVRICAgICAgICAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIzNikKKyNkZWZpbmUgU0lSX0hBTF9FTkFCTEVfVUFQU0RfUkVRICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMzcpCisjZGVmaW5lIFNJUl9IQUxfRElTQUJMRV9VQVBTRF9SRVEgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjM4KQorCisjZGVmaW5lIFNJUl9IQUxfU0VUX0VQTk9fTElTVF9SRVEgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDMxMykKKyNkZWZpbmUgU0lSX0hBTF9TRVRfUEFTU1BPSU5UX0xJU1RfUkVRICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzE2KQorI2RlZmluZSBTSVJfSEFMX1JFU0VUX1BBU1NQT0lOVF9MSVNUX1JFUSAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMTcpCisjZGVmaW5lIFNJUl9IQUxfRVhUU0NBTl9TRVRfU1NJRF9IT1RMSVNUX1JFUSAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzE4KQorCisjZGVmaW5lIFNJUl9IQUxfT0NCX1NFVF9DT05GSUdfQ01EICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMTkpCisjZGVmaW5lIFNJUl9IQUxfT0NCX1NFVF9VVENfVElNRV9DTUQgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMjApCisjZGVmaW5lIFNJUl9IQUxfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfQ01EIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMjEpCisjZGVmaW5lIFNJUl9IQUxfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9DTUQgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMjIpCisjZGVmaW5lIFNJUl9IQUxfT0NCX0dFVF9UU0ZfVElNRVJfQ01EICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMjMpCisjZGVmaW5lIFNJUl9IQUxfRENDX0dFVF9TVEFUU19DTUQgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMjQpCisjZGVmaW5lIFNJUl9IQUxfRENDX0NMRUFSX1NUQVRTX0NNRCAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMjUpCisjZGVmaW5lIFNJUl9IQUxfRENDX1VQREFURV9ORExfQ01EICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMjYpCisKKyNkZWZpbmUgU0lSX0hBTF9GV19NRU1fRFVNUF9SRVEgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzI3KQorI2RlZmluZSBTSVJfSEFMX1NUQVJUX1NUT1BfTE9HR0lORyAgICAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDMyOCkKKyNkZWZpbmUgU0lSX0hBTF9TT0NfU0VUX0hXX01PREUgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMjkpCisjZGVmaW5lIFNJUl9IQUxfU09DX1NFVF9IV19NT0RFX1JFU1AgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzMwKQorI2RlZmluZSBTSVJfSEFMX1NPQ19IV19NT0RFX1RSQU5TX0lORCAgICAgICAgKFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDMzMSkKKworI2RlZmluZSBTSVJfSEFMX1NFVF9SU1NJX01PTklUT1JfUkVRICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzMzKQorI2RlZmluZSBTSVJfSEFMX1NFVF9JRV9JTkZPICAgICAgICAgICAgICAgICAoU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzM0KQorCisjZGVmaW5lIFNJUl9IQUxfTFJPX0NPTkZJR19DTUQgICAgICAgICAgICAgIChTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzMzUpCisKKyNkZWZpbmUgU0lSX0hBTF9NU0dfVFlQRVNfRU5EICAgICAgICAgICAgICAgIChTSVJfSEFMX01TR19UWVBFU19CRUdJTiArIDB4MUZGKQorCisvKiBDRkcgbWVzc2FnZSB0eXBlcyAqLworI2RlZmluZSBTSVJfQ0ZHX01TR19UWVBFU19CRUdJTiAgICAgICAgKFNJUl9DRkdfTU9EVUxFX0lEIDw8IDgpCisjZGVmaW5lIFNJUl9DRkdfSVRDX01TR19UWVBFU19CRUdJTiAgICAoU0lSX0NGR19NU0dfVFlQRVNfQkVHSU4rMHhCMCkKKyNkZWZpbmUgU0lSX0NGR19QQVJBTV9VUERBVEVfSU5EICAgICAgIChTSVJfQ0ZHX0lUQ19NU0dfVFlQRVNfQkVHSU4pCisjZGVmaW5lIFNJUl9DRkdfRE9XTkxPQURfQ09NUExFVEVfSU5EICAoU0lSX0NGR19JVENfTVNHX1RZUEVTX0JFR0lOICsgMSkKKyNkZWZpbmUgU0lSX0NGR19NU0dfVFlQRVNfRU5EICAgICAgICAgIChTSVJfQ0ZHX01TR19UWVBFU19CRUdJTisweEZGKQorCisvKiBMSU0gbWVzc2FnZSB0eXBlcyAqLworI2RlZmluZSBTSVJfTElNX01TR19UWVBFU19CRUdJTiAgICAgICAgKFNJUl9MSU1fTU9EVUxFX0lEIDw8IDgpCisjZGVmaW5lIFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTiAgICAoU0lSX0xJTV9NU0dfVFlQRVNfQkVHSU4rMHhCMCkKKworLyogTWVzc2FnZXMgdG8vZnJvbSBIQUwgKi8KKy8qIFJlbW92ZWQgYXMgcGFydCBvZiBtb3ZpbmcgSEFMIGRvd24gdG8gRlcgKi8KKworLyogTWVzc2FnZSBmcm9tIElTUiB1cG9uIFRGUCByZXRyeSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0lSX0xJTV9SRVRSWV9JTlRFUlJVUFRfTVNHICAgICAgICAoU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOICsgMykKKy8qIE1lc3NhZ2UgZnJvbSBCQiBUcmFuc3BvcnQgKi8KKyNkZWZpbmUgU0lSX0JCX1hQT1JUX01HTVRfTVNHICAgICAgICAgICAgICAoU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOICsgNCkKKy8qIFVOVVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA2ICovCisvKiBNZXNzYWdlIGZyb20gSVNSIHVwb24gU1AncyBJbnZhbGlkIHNlc3Npb24ga2V5IGludGVycnVwdCAqLworI2RlZmluZSBTSVJfTElNX0lOVl9LRVlfSU5URVJSVVBUX01TRyAgICAgIChTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA3KQorLyogTWVzc2FnZSBmcm9tIElTUiB1cG9uIFNQJ3MgSW52YWxpZCBrZXkgSUQgaW50ZXJydXB0ICovCisjZGVmaW5lIFNJUl9MSU1fS0VZX0lEX0lOVEVSUlVQVF9NU0cgICAgICAgKFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTiArIDgpCisvKiBNZXNzYWdlIGZyb20gSVNSIHVwb24gU1AncyBSZXBsYXkgdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0ICovCisjZGVmaW5lIFNJUl9MSU1fUkVQTEFZX1RIUkVTX0lOVEVSUlVQVF9NU0cgKFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTiArIDkpCisvKiBNZXNzYWdlIGZyb20gSEREIGFmdGVyIHRoZSBURCBkdW1teSBwYWNrZXQgaXMgY2xlYW5lZCB1cCAqLworI2RlZmluZSBTSVJfTElNX1REX0RVTU1ZX0NBTExCQUNLX01TRyAgICAgIChTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAweEEpCisvKiBNZXNzYWdlIGZyb20gU0NIIHdoZW4gdGhlIFNUQSBpcyByZWFkeSB0byBiZSBkZWxldGVkICovCisjZGVmaW5lIFNJUl9MSU1fU0NIX0NMRUFOX01TRyAgICAgICAgICAgICAgKFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTiArIDB4QikKKy8qIE1lc3NhZ2UgZnJvbSBJU1IgdXBvbiBSYWRhciBEZXRlY3Rpb24gKi8KKyNkZWZpbmUgU0lSX0xJTV9SQURBUl9ERVRFQ1RfSU5EICAgICAgICAgICAoU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOICsgMHhDKQorCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogbWVzc2FnZSBpZCBBdmFpbGFibGUgKi8KKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworLyogTWVzc2FnZSBmcm9tIEhhbCB0byBzZW5kIG91dCBhIERFTC1UUyBpbmRpY2F0aW9uICovCisjZGVmaW5lIFNJUl9MSU1fREVMX1RTX0lORCAgICAgICAgICAgICAgICAgIChTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAweEUpCisvKiBJbmRpY2F0aW9uIGZyb20gSEFMIHRvIGRlbGV0ZSBTdGF0aW9uIGNvbnRleHQgKi8KKyNkZWZpbmUgU0lSX0xJTV9ERUxFVEVfU1RBX0NPTlRFWFRfSU5EICAgICAgKFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTiArIDB4MTEpCisvKiBJbmRpY2F0aW9uIGZyb20gSEFMIHRvIGRlbGV0ZSBCQSAqLworI2RlZmluZSBTSVJfTElNX1VQREFURV9CRUFDT04gICAgICAgICAgICAgICAoU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOICsgMHgxMykKKworLyogTElNIFRpbWVvdXQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCAgICAgICgoU0lSX0xJTV9NT0RVTEVfSUQgPDwgOCkgKyAweEQwKQorI2RlZmluZSBTSVJfTElNX0pPSU5fRkFJTF9USU1FT1VUICAgICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAyKQorI2RlZmluZSBTSVJfTElNX0FVVEhfRkFJTF9USU1FT1VUICAgICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAzKQorI2RlZmluZSBTSVJfTElNX0FVVEhfUlNQX1RJTUVPVVQgICAgICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyA0KQorI2RlZmluZSBTSVJfTElNX0FTU09DX0ZBSUxfVElNRU9VVCAgICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyA1KQorI2RlZmluZSBTSVJfTElNX1JFQVNTT0NfRkFJTF9USU1FT1VUICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyA2KQorI2RlZmluZSBTSVJfTElNX0hFQVJUX0JFQVRfVElNRU9VVCAgICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyA3KQorLyogY3VycmVudGx5IHVudXNlZCAgICAgICAgICAgICAgICAgICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4OCAqLworLyogTGluayBNb25pdG9yaW5nIE1lc3NhZ2VzICovCisjZGVmaW5lIFNJUl9MSU1fUFJPQkVfSEJfRkFJTFVSRV9USU1FT1VUIChTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHhCKQorI2RlZmluZSBTSVJfTElNX0FERFRTX1JTUF9USU1FT1VUICAgICAgICAoU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4QykKKyNkZWZpbmUgU0lSX0xJTV9MSU5LX1RFU1RfRFVSQVRJT05fVElNRU9VVCAoU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MTMpCisjZGVmaW5lIFNJUl9MSU1fSEFTSF9NSVNTX1RIUkVTX1RJTUVPVVQgIChTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHgxNikKKyNkZWZpbmUgU0lSX0xJTV9DTkZfV0FJVF9USU1FT1VUICAgICAgICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDE3KQorLyogY3VycmVudGx5IHVudXNlZAkJCShTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHgxOCkgKi8KKyNkZWZpbmUgU0lSX0xJTV9VUERBVEVfT0xCQ19DQUNIRUxfVElNRU9VVCAoU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MTkpCisjZGVmaW5lIFNJUl9MSU1fQ0hBTk5FTF9TV0lUQ0hfVElNRU9VVCAgIChTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHgxQSkKKyNkZWZpbmUgU0lSX0xJTV9RVUlFVF9USU1FT1VUICAgICAgICAgICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDFCKQorI2RlZmluZSBTSVJfTElNX1FVSUVUX0JTU19USU1FT1VUICAgICAgICAoU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MUMpCisKKyNkZWZpbmUgU0lSX0xJTV9XUFNfT1ZFUkxBUF9USU1FT1VUICAgICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDFEKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjZGVmaW5lIFNJUl9MSU1fRlRfUFJFQVVUSF9SU1BfVElNRU9VVCAgIChTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHgxRSkKKyNlbmRpZgorI2RlZmluZSBTSVJfTElNX1JFTUFJTl9DSE5fVElNRU9VVCAgICAgICAoU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MUYpCisjZGVmaW5lIFNJUl9MSU1fSU5TRVJUX1NJTkdMRVNIT1RfTk9BX1RJTUVPVVQgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDIwKQorCisjZGVmaW5lIFNJUl9MSU1fQkVBQ09OX0dFTl9JTkQgICAgICAgICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDIzKQorI2RlZmluZSBTSVJfTElNX1BFUklPRElDX1BST0JFX1JFUV9USU1FT1VUICAgIChTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHgyNCkKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisjZGVmaW5lIFNJUl9MSU1fRVNFX1RTTV9USU1FT1VUICAgICAgICAoU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MjUpCisjZW5kaWYKKworI2RlZmluZSBTSVJfTElNX0RJU0FTU09DX0FDS19USU1FT1VUICAgICAgIChTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHgyNikKKyNkZWZpbmUgU0lSX0xJTV9ERUFVVEhfQUNLX1RJTUVPVVQgICAgICAgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDI3KQorI2RlZmluZSBTSVJfTElNX1BFUklPRElDX0pPSU5fUFJPQkVfUkVRX1RJTUVPVVQgXAorCQkJCQkgKFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDI4KQorCisjZGVmaW5lIFNJUl9MSU1fQ09OVkVSVF9BQ1RJVkVfQ0hBTk5FTF9UT19QQVNTSVZFIFwKKwkJCQkJIChTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHgyQykKKworI2RlZmluZSBTSVJfTElNX01TR19UWVBFU19FTkQgICAgICAgICAgICAoU0lSX0xJTV9NU0dfVFlQRVNfQkVHSU4rMHhGRikKKworLyogU0NIIG1lc3NhZ2UgdHlwZXMgKi8KKyNkZWZpbmUgU0lSX1NDSF9NU0dfVFlQRVNfQkVHSU4gICAgICAgIChTSVJfU0NIX01PRFVMRV9JRCA8PCA4KQorI2RlZmluZSBTSVJfU0NIX0NIQU5ORUxfU1dJVENIX1JFUVVFU1QgKFNJUl9TQ0hfTVNHX1RZUEVTX0JFR0lOKQorI2RlZmluZSBTSVJfU0NIX1NUQVJUX1NDQU5fUkVRICAgICAgICAgKFNJUl9TQ0hfTVNHX1RZUEVTX0JFR0lOICsgMSkKKyNkZWZpbmUgU0lSX1NDSF9TVEFSVF9TQ0FOX1JTUCAgICAgICAgIChTSVJfU0NIX01TR19UWVBFU19CRUdJTiArIDIpCisjZGVmaW5lIFNJUl9TQ0hfRU5EX1NDQU5fTlRGICAgICAgICAgICAoU0lSX1NDSF9NU0dfVFlQRVNfQkVHSU4gKyAzKQorI2RlZmluZSBTSVJfU0NIX01TR19UWVBFU19FTkQgICAgICAgICAgKFNJUl9TQ0hfTVNHX1RZUEVTX0JFR0lOKzB4RkYpCisKKy8qIFBNTSBtZXNzYWdlIHR5cGVzICovCisjZGVmaW5lIFNJUl9QTU1fTVNHX1RZUEVTX0JFR0lOICAgICAgICAoU0lSX1BNTV9NT0RVTEVfSUQgPDwgOCkKKyNkZWZpbmUgU0lSX1BNTV9DSEFOR0VfUE1fTU9ERSAgICAgICAgIChTSVJfUE1NX01TR19UWVBFU19CRUdJTikKKyNkZWZpbmUgU0lSX1BNTV9NU0dfVFlQRVNfRU5EICAgICAgICAgIChTSVJfUE1NX01TR19UWVBFU19CRUdJTisweEZGKQorCisvKiBNTlQgbWVzc2FnZSB0eXBlcyAqLworI2RlZmluZSBTSVJfTU5UX01TR19UWVBFU19CRUdJTiAgICAgICAgKFNJUl9NTlRfTU9EVUxFX0lEIDw8IDgpCisjZGVmaW5lIFNJUl9NTlRfUkVMRUFTRV9CRCAgICAgICAgICAgICAoU0lSX01OVF9NU0dfVFlQRVNfQkVHSU4gKyAwKQorI2RlZmluZSBTSVJfTU5UX01TR19UWVBFU19FTkQgICAgICAgICAgKFNJUl9NTlRfTVNHX1RZUEVTX0JFR0lOICsgMHhGRikKKworLyogUFRUIG1lc3NhZ2UgdHlwZXMgKi8KKyNkZWZpbmUgU0lSX1BUVF9NU0dfVFlQRVNfQkVHSU4gICAgICAgICAgICAweDMwMDAKKyNkZWZpbmUgU0lSX1BUVF9NU0dfVFlQRVNfRU5EICAgICAgICAgICAgICAweDMzMDAKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICBFVkVOVCBUWVBFIERlZmludGlvbnMgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIE1NSCBFdmVudHMgdGhhdCBhcmUgdXNlZCBpbiBvdGhlciBtb2R1bGVzIHRvIHBvc3QgZXZlbnRzIHRvIE1NSCAqLworI2RlZmluZSBTSVJfSFNURU1VTF9UWE1CX0RPTkVfRVZUICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTSVJfSFNURU1VTF9SWE1CX1JFQURZX0VWVCAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBTSVJfSFNURU1VTF9NU0dRX05FX0VWVCAgICAgICAgICAgMHgwMDAwMDQwMAorCisjZGVmaW5lIFNJUl9UU1RfWE1JVF9NU0dfUVNfRU1QVFlfRVZUICAgICAweDAwMDAwMDgwCisKKy8qIGFkZGVkIGZvciBPQlNTICovCisKKy8qIFBhcmFtIENoYW5nZSBCaXRtYXAgc2VudCB0byBIQUwgKi8KKyNkZWZpbmUgUEFSQU1fQkNOX0lOVEVSVkFMX0NIQU5HRUQgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUEFSQU1fU0hPUlRfUFJFQU1CTEVfQ0hBTkdFRCAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgUEFSQU1fU0hPUlRfU0xPVF9USU1FX0NIQU5HRUQgICAgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFBBUkFNX2xsQUNPRVhJU1RfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBQQVJBTV9sbEJDT0VYSVNUX0NIQU5HRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgUEFSQU1fbGxHQ09FWElTVF9DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIFBBUkFNX0hUMjBNSFpDT0VYSVNUX0NIQU5HRUQgICAgICAgICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgUEFSQU1fTk9OX0dGX0RFVklDRVNfUFJFU0VOVF9DSEFOR0VEICgxPDw3KQorI2RlZmluZSBQQVJBTV9SSUZTX01PREVfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgUEFSQU1fTFNJR19UWE9QX0ZVTExfU1VQUE9SVF9DSEFOR0VEICAgKDE8PDkpCisjZGVmaW5lIFBBUkFNX09CU1NfTU9ERV9DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwxMCkKKyNkZWZpbmUgUEFSQU1fQkVBQ09OX1VQREFURV9NQVNLICAgIChQQVJBTV9CQ05fSU5URVJWQUxfQ0hBTkdFRCB8IFwKKwkJCQkgICAgIFBBUkFNX1NIT1JUX1BSRUFNQkxFX0NIQU5HRUQgfCBcCisJCQkJICAgICBQQVJBTV9TSE9SVF9TTE9UX1RJTUVfQ0hBTkdFRCB8IFwKKwkJCQkgICAgIFBBUkFNX2xsQUNPRVhJU1RfQ0hBTkdFRCB8IFwKKwkJCQkgICAgIFBBUkFNX2xsQkNPRVhJU1RfQ0hBTkdFRCB8IFwKKwkJCQkgICAgIFBBUkFNX2xsR0NPRVhJU1RfQ0hBTkdFRCB8IFwKKwkJCQkgICAgIFBBUkFNX0hUMjBNSFpDT0VYSVNUX0NIQU5HRUQgfCBcCisJCQkJICAgICBQQVJBTV9OT05fR0ZfREVWSUNFU19QUkVTRU5UX0NIQU5HRUQgfCBcCisJCQkJICAgICBQQVJBTV9SSUZTX01PREVfQ0hBTkdFRCB8IFwKKwkJCQkgICAgIFBBUkFNX0xTSUdfVFhPUF9GVUxMX1NVUFBPUlRfQ0hBTkdFRCB8IFwKKwkJCQkgICAgIFBBUkFNX09CU1NfTU9ERV9DSEFOR0VEKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9pbmNsdWRlL3N5c19nbG9iYWwuaCBiL2NvcmUvbWFjL3NyYy9pbmNsdWRlL3N5c19nbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjc2ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL2luY2x1ZGUvc3lzX2dsb2JhbC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19TWVNfR0xPQkFMX0hfXworI2RlZmluZSBfX1NZU19HTE9CQUxfSF9fCisKK3R5cGVkZWYgc3RydWN0IHNBbmlTaXJTeXMgeworCisJdWludDMyX3QgZ1N5c0ZyYW1lQ291bnRbNF1bMTZdOworCXVpbnQzMl90IGdTeXNCYnRSZWNlaXZlZDsKKwl1aW50MzJfdCBnU3lzQmJ0UG9zdGVkVG9MaW07CisJdWludDMyX3QgZ1N5c0JidFBvc3RlZFRvU2NoOworCXVpbnQzMl90IGdTeXNCYnRQb3N0ZWRUb1BtbTsKKwl1aW50MzJfdCBnU3lzQmJ0UG9zdGVkVG9IYWw7CisJdWludDMyX3QgZ1N5c0JidERyb3BwZWQ7CisJdWludDMyX3QgZ1N5c0JidE5vbkxlYXJuRnJhbWVJbnY7CisJdWludDMyX3QgZ1N5c0JidExlYXJuRnJhbWVJbnY7CisJdWludDMyX3QgZ1N5c0JidENyY0ZhaWw7CisJdWludDMyX3QgZ1N5c0JidER1cGxpY2F0ZXM7CisJdWludDMyX3QgZ1N5c1JlbGVhc2VDb3VudDsKKwl1aW50MzJfdCBwcm9iZUVycm9yLCBwcm9iZUJhZFNzaWQsIHByb2JlSWdub3JlLCBwcm9iZVJlc3BvbmQ7CisKKwl1aW50MzJfdCBnU3lzRW5hYmxlTGVhcm5Nb2RlOworCXVpbnQzMl90IGdTeXNFbmFibGVTY2FuTW9kZTsKKwl1aW50MzJfdCBnU3lzRW5hYmxlTGlua01vbml0b3JNb2RlOworfSB0QW5pU2lyU3lzLCAqdHBBbmlTaXJTeXM7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL2luY2x1ZGUvdXRpbHNfYXBpLmggYi9jb3JlL21hYy9zcmMvaW5jbHVkZS91dGlsc19hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTM0NGJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL2luY2x1ZGUvdXRpbHNfYXBpLmgKQEAgLTAsMCArMSw2NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19VVElMU0FQSV9ICisjZGVmaW5lIF9fVVRJTFNBUElfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c2lyX2NvbW1vbi5oPgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJ1dGlsc19nbG9iYWwuaCIKKyNpbmNsdWRlICJzeXNfd3JhcHBlci5oIgorCisvKiAvIFN5c3RlbSByb2xlIGRlZmluaXRpb24gb24gYSBwZXIgQlNTICovCit0eXBlZGVmIGVudW0gZUJzc1N5c3RlbVJvbGUgeworCWVTWVNURU1fVU5LTk9XTl9ST0xFLAorCWVTWVNURU1fQVBfUk9MRSwKKwllU1lTVEVNX1NUQV9JTl9JQlNTX1JPTEUsCisJZVNZU1RFTV9TVEFfUk9MRSwKKwllU1lTVEVNX0JUQU1QX1NUQV9ST0xFLAorCWVTWVNURU1fQlRBTVBfQVBfUk9MRSwKKworCWVTWVNURU1fTEFTVF9ST0xFLAorCWVTWVNURU1fTVVMVElfQlNTX1JPTEUgPSBlU1lTVEVNX0xBU1RfUk9MRQorfSB0QnNzU3lzdGVtUm9sZTsKKworI2RlZmluZSBMT0dfSU5ERVhfRk9SX01PRFVMRShtb2RJZCkgKChtb2RJZCkgLSBMT0dfRklSU1RfTU9EVUxFX0lEKQorI2RlZmluZSBHRVRfTUlOX1ZBTFVFKF9fdmFsMSwgX192YWwyKSAoKF9fdmFsMSA8IF9fdmFsMikgPyBfX3ZhbDEgOiBfX3ZhbDIpCisKKy8qIFRoZSBjYWxsZXIgbXVzdCBjaGVjayBsb2dsZXZlbC4gVGhpcyBBUEkgYXNzdW1lcyBsb2dsZXZlbCBpcyBnb29kICovCitleHRlcm4gdm9pZCBsb2dfZGVidWcodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBtb2RJZCwgdWludDMyX3QgZGVidWdMZXZlbCwKKwkJICAgICAgY29uc3QgY2hhciAqcFN0ciwgdmFfbGlzdCBtYXJrZXIpOworCitleHRlcm4gdm9pZCBsb2dfZGJnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgbW9kSWQsIHVpbnQzMl90IGRlYnVnTGV2ZWwsCisJCSAgICBjb25zdCBjaGFyICpwU3RyLCAuLi4pOworCitleHRlcm4gdWludDMyX3QgZ1BrdEFsbG9jQ250LCBnUGt0RnJlZUNudDsKKworZXh0ZXJuIENERl9UUkFDRV9MRVZFTCBnZXRfdm9zX2RlYnVnX2xldmVsKHVpbnQzMl90IGRlYnVnTGV2ZWwpOworCisvKiAvIExvZyBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbG9nX2luaXQodHBBbmlTaXJHbG9iYWwpOworCitleHRlcm4gdm9pZCBsb2dfZGVpbml0KHRwQW5pU2lyR2xvYmFsKTsKKworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgY2ZnX2luaXQodHBBbmlTaXJHbG9iYWwpOworZXh0ZXJuIHZvaWQgY2ZnX2RlX2luaXQodHBBbmlTaXJHbG9iYWwpOworCit2b2lkIHNpcl9kdW1wX2J1Zih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IG1vZElkLCB1aW50MzJfdCBsZXZlbCwKKwkJICB1aW50OF90ICpidWYsIHVpbnQzMl90IHNpemUpOworCisvKioKKyAqIHNpcl9zd2FwX3UxNigpCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzd2FwIHR3byBVOHMgb2YgYW4gdWludDE2X3QgdmFsdWUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHZhbCAgICB1aW50MTZfdCB2YWx1ZSB0byBiZSB1aW50OF90IHN3YXBwZWQKKyAqIEByZXR1cm4gICAgICAgIFN3YXBwZWQgdWludDE2X3QgdmFsdWUKKyAqLworCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IHNpcl9zd2FwX3UxNih1aW50MTZfdCB2YWwpCit7CisJcmV0dXJuICgodmFsICYgMHgwMEZGKSA8PCA4KSB8ICgodmFsICYgMHhGRjAwKSA+PiA4KTsKK30gLyoqKiBlbmQgc2lyX3N3YXBfdTE2KCkgKioqLworCisvKioKKyAqIHNpcl9zd2FwX3UxNmlmX25lZWRlZCgpCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzd2FwIHR3byBVOHMgb2YgYW4gdWludDE2X3QgdmFsdWUgZGVwZW5kaW5nCisgKiBvbiBlbmRpYW5uZXMgb2YgdGhlIHRhcmdldCBwcm9jZXNzb3IvY29tcGlsZXIgdGhlIHNvZnR3YXJlIGlzCisgKiBydW5uaW5nIG9uCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICB2YWwgICAgdWludDE2X3QgdmFsdWUgdG8gYmUgdWludDhfdCBzd2FwcGVkCisgKiBAcmV0dXJuICAgICAgICBTd2FwcGVkIHVpbnQxNl90IHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBzaXJfc3dhcF91MTZpZl9uZWVkZWQodWludDE2X3QgdmFsKQoreworI2lmbmRlZiBBTklfTElUVExFX0JZVEVfRU5ESUFOCisJcmV0dXJuIHNpcl9zd2FwX3UxNih2YWwpOworI2Vsc2UKKwlyZXR1cm4gdmFsOworI2VuZGlmCit9IC8qKiogZW5kIHNpcl9zd2FwX3UxNmlmX25lZWRlZCgpICoqKi8KKworLyoqCisgKiBzaXJfc3dhcF91MzIoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3dhcCBmb3VyIFU4cyBvZiBhbiB1aW50MzJfdCB2YWx1ZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgdmFsICAgIHVpbnQzMl90IHZhbHVlIHRvIGJlIHVpbnQ4X3Qgc3dhcHBlZAorICogQHJldHVybiAgICAgICAgU3dhcHBlZCB1aW50MzJfdCB2YWx1ZQorICovCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgc2lyX3N3YXBfdTMyKHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gKHZhbCA8PCAyNCkgfAorCQkodmFsID4+IDI0KSB8CisJCSgodmFsICYgMHgwMDAwRkYwMCkgPDwgOCkgfCAoKHZhbCAmIDB4MDBGRjAwMDApID4+IDgpOworfSAvKioqIGVuZCBzaXJfc3dhcF91MzIoKSAqKiovCisKKy8qKgorICogc2lyX3N3YXBfdTMyaWZfbmVlZGVkKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN3YXAgVThzIG9mIGFuIHVpbnQzMl90IHZhbHVlIGRlcGVuZGluZworICogb24gZW5kaWFubmVzIG9mIHRoZSB0YXJnZXQgcHJvY2Vzc29yL2NvbXBpbGVyIHRoZSBzb2Z0d2FyZSBpcworICogcnVubmluZyBvbgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgdmFsICAgIHVpbnQzMl90IHZhbHVlIHRvIGJlIHVpbnQ4X3Qgc3dhcHBlZAorICogQHJldHVybiAgICAgICAgU3dhcHBlZCB1aW50MzJfdCB2YWx1ZQorICovCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgc2lyX3N3YXBfdTMyaWZfbmVlZGVkKHVpbnQzMl90IHZhbCkKK3sKKyNpZm5kZWYgQU5JX0xJVFRMRV9CWVRFX0VORElBTgorCXJldHVybiBzaXJfc3dhcF91MzIodmFsKTsKKyNlbHNlCisJcmV0dXJuIHZhbDsKKyNlbmRpZgorfSAvKioqIGVuZCBzaXJfc3dhcF91MzJpZl9uZWVkZWQoKSAqKiovCisKKy8qKgorICogc2lyX3N3YXBfdTMyX2J1ZgorICoKKyAqIEZVTkNUSU9OOgorICogSXQgc3dhcHMgTiBkd29yZHMgaW50byB0aGUgc2FtZSBidWZmZXIKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHB0ciBhZGRyZXNzIG9mIHVpbnQzMl90IGFycmF5CisgKiBAcmV0dXJuIHZvaWQKKyAqCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNpcl9zd2FwX3UzMl9idWYodWludDMyX3QgKnB0ciwgdWludDMyX3QgbldvcmRzKQoreworCXVpbnQzMl90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbldvcmRzOyBpKyspCisJCXB0cltpXSA9IHNpcl9zd2FwX3UzMihwdHJbaV0pOworfQorCisvKioKKyAqIHNpcl9zd2FwX3UzMl9idWZfaWZfbmVlZGVkKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN3YXAgVThzIG9mIFUzMnMgaW4gdGhlIGJ1ZmZlciBkZXBlbmRpbmcKKyAqIG9uIGVuZGlhbm5lcyBvZiB0aGUgdGFyZ2V0IHByb2Nlc3Nvci9jb21waWxlciB0aGUgc29mdHdhcmUgaXMKKyAqIHJ1bm5pbmcgb24KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHBCdWYgICBCdWZmZXIgdGhhdCB3aWxsIGdldCBzd2FwcGVkCisgKiBAcGFyYW0gIG5Xb3JkcyBOdW1iZXIgRFdPUkRTIHdpbGwgYmUgc3dhcHBlZAorICogQHJldHVybiAgICAgICAgdm9pZAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaXJfc3dhcF91MzJfYnVmX2lmX25lZWRlZCh1aW50MzJfdCAqcEJ1ZiwgdWludDMyX3QgbldvcmRzKQoreworI2lmZGVmIEFOSV9MSVRUTEVfQllURV9FTkRJQU4KKwlzaXJfc3dhcF91MzJfYnVmKHBCdWYsIG5Xb3Jkcyk7CisjZW5kaWYKK30gLyoqKiBlbmQgc2lyX3N3YXBfdTMyaWZfbmVlZGVkKCkgKioqLworCisvKioKKyAqIHNpcl9zd2FwX2JkX2lmX25lZWRlZAorICoKKyAqIEZVTkNUSU9OOgorICogQnl0ZSBzd2FwIGFsbCB0aGUgZHdvcmRzIGluIHRoZSBCRCwgZXhjZXB0IHRoZSBQSFkvTUFDIGhlYWRlcnMKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHBCZCAgICBCRCB0aGF0IHdpbGwgZ2V0IHN3YXBwZWQKKyAqIEByZXR1cm4gICAgICAgIHZvaWQKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2lyX3N3YXBfYmRfaWZfbmVlZGVkKHVpbnQzMl90ICpwQmQpCit7CisJc2lyX3N3YXBfdTMyX2J1Zl9pZl9uZWVkZWQocEJkLCA2KTsKKwlzaXJfc3dhcF91MzJfYnVmX2lmX25lZWRlZChwQmQgKyAxOCwgMTQpOworfQorCisvKioKKyAqIHNpcl9zdG9yZV91MTZfbgorICoKKyAqIEZVTkNUSU9OOgorICogSXQgc3RvcmVzIGEgMTYgYml0IG51bWJlciBpbnRvIHRoZSBieXRlIGFycmF5IGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICogaS5lLiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgcHRyIGFkZHJlc3Mgb2YgZGVzdGluYXRpb24gYnl0ZSBhcnJheQorICogQHBhcmFtICB2YWwgdmFsdWUgdG8gc3RvcmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaXJfc3RvcmVfdTE2X24odWludDhfdCAqcHRyLCB1aW50MTZfdCB2YWwpCit7CisJKnB0cisrID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJKnB0ciA9IHZhbCAmIDB4ZmY7Cit9CisKKy8qKgorICogc2lyX3N0b3JlX3UzMl9uCisgKgorICogRlVOQ1RJT046CisgKiBJdCBzdG9yZXMgYSAzMiBiaXQgbnVtYmVyIGludG8gdGhlIGJ5dGUgYXJyYXkgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKiBpLmUuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICBwdHIgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBieXRlIGFycmF5CisgKiBAcGFyYW0gIHZhbCB2YWx1ZSB0byBzdG9yZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNpcl9zdG9yZV91MzJfbih1aW50OF90ICpwdHIsIHVpbnQzMl90IHZhbCkKK3sKKwkqcHRyKysgPSAodWludDhfdCkgKHZhbCA+PiAyNCkgJiAweGZmOworCSpwdHIrKyA9ICh1aW50OF90KSAodmFsID4+IDE2KSAmIDB4ZmY7CisJKnB0cisrID0gKHVpbnQ4X3QpICh2YWwgPj4gOCkgJiAweGZmOworCSpwdHIgPSAodWludDhfdCkgKHZhbCkgJiAweGZmOworfQorCisvKioKKyAqIHNpcl9zdG9yZV91MTYKKyAqCisgKiBGVU5DVElPTjoKKyAqIEl0IHN0b3JlcyBhIDE2IGJpdCBudW1iZXIgaW50byB0aGUgYnl0ZSBhcnJheSBpbiBOT04tbmV0d29yayBieXRlIG9yZGVyCisgKiBpLmUuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICBwdHIgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBieXRlIGFycmF5CisgKiBAcGFyYW0gIHZhbCB2YWx1ZSB0byBzdG9yZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNpcl9zdG9yZV91MTYodWludDhfdCAqcHRyLCB1aW50MTZfdCB2YWwpCit7CisJKnB0cisrID0gdmFsICYgMHhmZjsKKwkqcHRyID0gKHZhbCA+PiA4KSAmIDB4ZmY7Cit9CisKKy8qKgorICogc2lyX3N0b3JlX3UzMgorICoKKyAqIEZVTkNUSU9OOgorICogSXQgc3RvcmVzIGEgMzIgYml0IG51bWJlciBpbnRvIHRoZSBieXRlIGFycmF5IGluIE5PTi1uZXR3b3JrIGJ5dGUgb3JkZXIKKyAqIGkuZS4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHB0ciBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkKKyAqIEBwYXJhbSAgdmFsIHZhbHVlIHRvIHN0b3JlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2lyX3N0b3JlX3UzMih1aW50OF90ICpwdHIsIHVpbnQzMl90IHZhbCkKK3sKKwkqcHRyKysgPSAodWludDhfdCkgdmFsICYgMHhmZjsKKwkqcHRyKysgPSAodWludDhfdCkgKHZhbCA+PiA4KSAmIDB4ZmY7CisJKnB0cisrID0gKHVpbnQ4X3QpICh2YWwgPj4gMTYpICYgMHhmZjsKKwkqcHRyID0gKHVpbnQ4X3QpICh2YWwgPj4gMjQpICYgMHhmZjsKK30KKworLyoqCisgKiBzaXJfc3RvcmVfdTMyQnVmTgorICoKKyAqIEZVTkNUSU9OOgorICogSXQgc3RvcmVzIGEgMzIgYml0IG51bWJlciBpbnRvIHRoZSBieXRlIGFycmF5IGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICogaS5lLiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC4gSXQgcGVyZm9ybXMgdGhlIGFib3ZlIG9wZXJhdGlvbgorICogb24gZW50aXJlIGJ1ZmZlciBhbmQgd3JpdGVzIHRvIHRoZSBkc3QgYnVmZmVyCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBBc3N1bWVzIHRoYXQgdGhlIHBTcmMgYnVmZmVyIGlzIG9mIGFsbCB1aW50MzJfdCBkYXRhIHR5cGUgZmllbGRzLgorICoKKyAqIE5PVEU6CisgKiBNdXN0IGJlIHVzZWQgaWYgYWxsIHRoZSBmaWVsZHMgaW4gdGhlIGJ1ZmZlciBtdXN0IGJlIG9mIHVpbnQzMl90IHR5cGVzLgorICoKKyAqIEBwYXJhbSAgcERzdCAgIGFkZHJlc3Mgb2YgZGVzdGluYXRpb24gYnl0ZSBhcnJheQorICogQHBhcmFtICBwU3JjICAgYWRkcmVzcyBvZiB0aGUgc291cmNlIERXT1JEIGFycmF5CisgKiBAcGFyYW0gIGxlbmd0aCBudW1iZXIgb2YgRFdPUkRzCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK3Npcl9zdG9yZV9idWZfbih1aW50OF90ICpwRHN0LCB1aW50MzJfdCAqcFNyYywgdWludDMyX3QgbGVuZ3RoKQoreworCXdoaWxlIChsZW5ndGgpIHsKKwkJc2lyX3N0b3JlX3UzMl9uKHBEc3QsICpwU3JjKTsKKwkJcERzdCArPSA0OworCQlwU3JjKys7CisJCWxlbmd0aC0tOworCX0KK30KKworLyoqCisgKiBzaXJfcmVhZF91MTZfbgorICoKKyAqIEZVTkNUSU9OOgorICogSXQgcmVhZHMgYSAxNiBiaXQgbnVtYmVyIGZyb20gdGhlIGJ5dGUgYXJyYXkgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKiBpLmUuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICBwdHIgYWRkcmVzcyBvZiAgYnl0ZSBhcnJheQorICogQHJldHVybiAxNiBiaXQgdmFsdWUKKyAqLworCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IHNpcl9yZWFkX3UxNl9uKHVpbnQ4X3QgKnB0cikKK3sKKwlyZXR1cm4gKCgqcHRyKSA8PCA4KSB8ICgqKHB0ciArIDEpKTsKK30KKworLyoqCisgKiBzaXJfc3dhcF91MzJfYnVmCisgKgorICogRlVOQ1RJT046CisgKiBJdCBzd2FwcyBOIGR3b3JkcyBpbnRvIHRoZSBzYW1lIGJ1ZmZlcgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgcHRyIGFkZHJlc3Mgb2YgdWludDMyX3QgYXJyYXkKKyAqIEByZXR1cm4gdm9pZAorICoKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK3Npcl9zd2FwX25fc3RvcmUodWludDMyX3QgKnNyYywgdWludDMyX3QgKmRzdCwgdWludDMyX3QgbldvcmRzKQoreworCXVpbnQzMl90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbldvcmRzOyBpKyspCisJCWRzdFtpXSA9IHNpcl9zd2FwX3UzMihzcmNbaV0pOworfQorCisvKioKKyAqIHNpcl9yZWFkX3UzMl9uCisgKgorICogRlVOQ1RJT046CisgKiBJdCByZWFkcyBhIDMyIGJpdCBudW1iZXIgZnJvbSB0aGUgYnl0ZSBhcnJheSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAqIGkuZS4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHB0ciBhZGRyZXNzIG9mICBieXRlIGFycmF5CisgKiBAcmV0dXJuIDMyIGJpdCB2YWx1ZQorICovCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgc2lyX3JlYWRfdTMyX24odWludDhfdCAqcHRyKQoreworCXJldHVybiAoKihwdHIpIDw8IDI0KSB8CisJCSgqKHB0ciArIDEpIDw8IDE2KSB8ICgqKHB0ciArIDIpIDw8IDgpIHwgKCoocHRyICsgMykpOworfQorCisvKioKKyAqIHNpcl9yZWFkX3UxNgorICoKKyAqIEZVTkNUSU9OOgorICogSXQgcmVhZHMgYSAxNiBiaXQgbnVtYmVyIGZyb20gdGhlIGJ5dGUgYXJyYXkgaW4gTk9OLW5ldHdvcmsgYnl0ZSBvcmRlcgorICogaS5lLiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgcHRyIGFkZHJlc3Mgb2YgIGJ5dGUgYXJyYXkKKyAqIEByZXR1cm4gMTYgYml0IHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBzaXJfcmVhZF91MTYodWludDhfdCAqcHRyKQoreworCXJldHVybiAoKnB0cikgfCAoKihwdHIgKyAxKSA8PCA4KTsKK30KKworLyoqCisgKiBzaXJfcmVhZF91MzIKKyAqCisgKiBGVU5DVElPTjoKKyAqIEl0IHJlYWRzIGEgMzIgYml0IG51bWJlciBmcm9tIHRoZSBieXRlIGFycmF5IGluIE5PTi1uZXR3b3JrIGJ5dGUgb3JkZXIKKyAqIGkuZS4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHB0ciBhZGRyZXNzIG9mICBieXRlIGFycmF5CisgKiBAcmV0dXJuIDMyIGJpdCB2YWx1ZQorICovCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgc2lyX3JlYWRfdTMyKHVpbnQ4X3QgKnB0cikKK3sKKwlyZXR1cm4gKCoocHRyKSkgfAorCQkoKihwdHIgKyAxKSA8PCA4KSB8ICgqKHB0ciArIDIpIDw8IDE2KSB8ICgqKHB0ciArIDMpIDw8IDI0KTsKK30KKworLyogLyBDb3B5IGEgTUFDIGFkZHJlc3MgZnJvbSAnZnJvbScgdG8gJ3RvJyAqLworc3RhdGljIGlubGluZSB2b2lkIHNpcl9jb3B5X21hY19hZGRyKHVpbnQ4X3QgdG9bXSwgdWludDhfdCBmcm9tW10pCit7CisjaWYgZGVmaW5lZChfWDg2XykKKwl1aW50MzJfdCBhbGlnbiA9ICgweDMgJiAoKHVpbnQzMl90KSB0byB8ICh1aW50MzJfdCkgZnJvbSkpOworCWlmIChhbGlnbiA9PSAwKSB7CisJCSooKHVpbnQxNl90ICopICYodG9bNF0pKSA9ICooKHVpbnQxNl90ICopICYoZnJvbVs0XSkpOworCQkqKCh1aW50MzJfdCAqKSB0bykgPSAqKCh1aW50MzJfdCAqKSBmcm9tKTsKKwl9IGVsc2UgaWYgKGFsaWduID09IDIpIHsKKwkJKigodWludDE2X3QgKikgJnRvWzRdKSA9ICooKHVpbnQxNl90ICopICZmcm9tWzRdKTsKKwkJKigodWludDE2X3QgKikgJnRvWzJdKSA9ICooKHVpbnQxNl90ICopICZmcm9tWzJdKTsKKwkJKigodWludDE2X3QgKikgJnRvWzBdKSA9ICooKHVpbnQxNl90ICopICZmcm9tWzBdKTsKKwl9IGVsc2UgeworCQl0b1s1XSA9IGZyb21bNV07CisJCXRvWzRdID0gZnJvbVs0XTsKKwkJdG9bM10gPSBmcm9tWzNdOworCQl0b1syXSA9IGZyb21bMl07CisJCXRvWzFdID0gZnJvbVsxXTsKKwkJdG9bMF0gPSBmcm9tWzBdOworCX0KKyNlbHNlCisJdG9bMF0gPSBmcm9tWzBdOworCXRvWzFdID0gZnJvbVsxXTsKKwl0b1syXSA9IGZyb21bMl07CisJdG9bM10gPSBmcm9tWzNdOworCXRvWzRdID0gZnJvbVs0XTsKKwl0b1s1XSA9IGZyb21bNV07CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IHNpcl9jb21wYXJlX21hY19hZGRyKHVpbnQ4X3QgYWRkcjFbXSwgdWludDhfdCBhZGRyMltdKQoreworI2lmIGRlZmluZWQoX1g4Nl8pCisJdWludDMyX3QgYWxpZ24gPSAoMHgzICYgKCh1aW50MzJfdCkgYWRkcjEgfCAodWludDMyX3QpIGFkZHIyKSk7CisKKwlpZiAoYWxpZ24gPT0gMCkgeworCQlyZXR1cm4gKCooKHVpbnQxNl90ICopICYoYWRkcjFbNF0pKSA9PQorCQkJICooKHVpbnQxNl90ICopICYoYWRkcjJbNF0pKSkKKwkJCSYmICgqKCh1aW50MzJfdCAqKSBhZGRyMSkgPT0gKigodWludDMyX3QgKikgYWRkcjIpKTsKKwl9IGVsc2UgaWYgKGFsaWduID09IDIpIHsKKwkJcmV0dXJuICgqKCh1aW50MTZfdCAqKSAmYWRkcjFbNF0pID09CisJCQkgKigodWludDE2X3QgKikgJmFkZHIyWzRdKSkKKwkJCSYmICgqKCh1aW50MTZfdCAqKSAmYWRkcjFbMl0pID09CisJCQkgICAgKigodWludDE2X3QgKikgJmFkZHIyWzJdKSkKKwkJCSYmICgqKCh1aW50MTZfdCAqKSAmYWRkcjFbMF0pID09CisJCQkgICAgKigodWludDE2X3QgKikgJmFkZHIyWzBdKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChhZGRyMVs1XSA9PSBhZGRyMls1XSkgJiYKKwkJCShhZGRyMVs0XSA9PSBhZGRyMls0XSkgJiYKKwkJCShhZGRyMVszXSA9PSBhZGRyMlszXSkgJiYKKwkJCShhZGRyMVsyXSA9PSBhZGRyMlsyXSkgJiYKKwkJCShhZGRyMVsxXSA9PSBhZGRyMlsxXSkgJiYgKGFkZHIxWzBdID09IGFkZHIyWzBdKTsKKwl9CisjZWxzZQorCXJldHVybiAoYWRkcjFbMF0gPT0gYWRkcjJbMF0pICYmCisJCShhZGRyMVsxXSA9PSBhZGRyMlsxXSkgJiYKKwkJKGFkZHIxWzJdID09IGFkZHIyWzJdKSAmJgorCQkoYWRkcjFbM10gPT0gYWRkcjJbM10pICYmCisJCShhZGRyMVs0XSA9PSBhZGRyMls0XSkgJiYgKGFkZHIxWzVdID09IGFkZHIyWzVdKTsKKyNlbmRpZgorfQorCisvKgorICogY29udmVydHMgdWludDE2X3QgQ1cgdmFsdWUgdG8gNCBiaXQgdmFsdWUgdG8gYmUgaW5zZXJ0ZWQgaW4gSUUKKyAqLworc3RhdGljIGlubGluZSB1aW50OF90IGNvbnZlcnRfY3codWludDE2X3QgY3cpCit7CisJdWludDhfdCB2YWwgPSAwOworCXdoaWxlIChjdyA+IDApIHsKKwkJdmFsKys7CisJCWN3ID4+PSAxOworCX0KKwlpZiAodmFsID4gMTUpCisJCXJldHVybiAweEY7CisJcmV0dXJuIHZhbDsKK30KKworLyogVGhlIHVzZXIgcHJpb3JpdHkgdG8gQUMgbWFwcGluZyBpcyBzdWNoOgorICogICBVUCgxLCAyKSAtLS0+IEFDX0JLKDEpCisgKiAgIFVQKDAsIDMpIC0tLT4gQUNfQkUoMCkKKyAqICAgVVAoNCwgNSkgLS0tPiBBQ19WSSgyKQorICogICBVUCg2LCA3KSAtLS0+IEFDX1ZPKDMpCisgKi8KKyNkZWZpbmUgV0xBTl9VUF9UT19BQ19NQVAgICAgICAgICAgICAweDMzMjIwMTEwCisjZGVmaW5lIHVwVG9BYyh1cCkgICAgICAgICAgICAgICAgKChXTEFOX1VQX1RPX0FDX01BUCA+PiAoKHVwKSA8PCAyKSkgJiAweDAzKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC8gUGFyc2UgdGhlIG5leHQgSUUgaW4gYSBtZXNzYWdlICovCitleHRlcm4gdFNpclJldFN0YXR1cyBzaXJQYXJzZU5leHRJRSh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqcFBheWxvYWQsCisJCQkJICAgIHVpbnQxNl90IHBheWxvYWRMZW5ndGgsIGludDE2X3QgbGFzdFR5cGUsCisJCQkJICAgIHVpbnQ4X3QgKnBUeXBlLCB1aW50OF90ICpwTGVuZ3RoKTsKKworLyogLyBDaGVjayBpZiB0aGUgZ2l2ZW4gY2hhbm5lbCBpcyAxMWIgY2hhbm5lbCAqLworI2RlZmluZSBTSVJfSVNfQ0hBTk5FTF8xMUIoY2hJZCkgIChjaElkIDw9IDE0KQorCisvKioKKyAqIGhhbF9yb3VuZF9zMzIKKyAqCisgKiBGVU5DVElPTjoKKyAqIFBlcmZvcm1zIGludGVnZXIgcm91bmRpbmcgbGlrZSByZXR1cm5zIDEyMzQ2IGZvciAxMjM0NTYgb3IgLTEyMzQ2IGZvciAtMTIzNDU2CisgKiBOb3RlIHRoYXQgYSBkZWNpbWFsIHBsYWNlIGlzIGxvc3QuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICBpbnQzMl90IGlucHV0CisgKiBAcmV0dXJuIHJvdW5kZWQgbnVtYmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBoYWxfcm91bmRfczMyKGludDMyX3QgcCkKK3sKKwlpbnQzMl90IGssIGksIGo7CisKKwlpID0gcCAvIDEwOworCWogPSBwICUgMTA7CisJaWYgKHAgPiAwKQorCQlrID0gaSArIChqID4gNCA/IDEgOiAwKTsKKwllbHNlIGlmIChwIDwgMCkKKwkJayA9IGkgKyAoaiA8IC01ID8gLTEgOiAwKTsKKwllbHNlCisJCWsgPSBwOworCisJcmV0dXJuIGs7Cit9CisKKy8qIE5ldyBmdW5jdGlvbnMgZm9yIGVuZGlhbmVzcyBjb252ZXJzaW9uICovCisjaWZkZWYgQU5JX0xJVFRMRV9CWVRFX0VORElBTgorI2RlZmluZSBhbmlfY3B1X3RvX2JlMTYoeCkgc2lyX3N3YXBfdTE2KCh4KSkKKyNkZWZpbmUgYW5pX2NwdV90b19sZTE2KHgpICh4KQorI2RlZmluZSBhbmlfY3B1X3RvX2JlMzIoeCkgc2lyX3N3YXBfdTMyKCh4KSkKKyNkZWZpbmUgYW5pX2NwdV90b19sZTMyKHgpICh4KQorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBTklfTElUVExFX0JZVEVfRU5ESUFOICovCisjZGVmaW5lIGFuaV9jcHVfdG9fYmUxNih4KSAoeCkKKyNkZWZpbmUgYW5pX2NwdV90b19sZTE2KHgpIHNpcl9zd2FwX3UxNigoeCkpCisjZGVmaW5lIGFuaV9jcHVfdG9fYmUzMih4KSAoeCkKKyNkZWZpbmUgYW5pX2NwdV90b19sZTMyKHgpIHNpcl9zd2FwX3UzMigoeCkpCisjZW5kaWYgLyogQU5JX0xJVFRMRV9CWVRFX0VORElBTiAqLworCisjZGVmaW5lIGFuaV9sZTE2X3RvX2NwdSh4KSAgYW5pX2NwdV90b19sZTE2KHgpCisjZGVmaW5lIGFuaV9sZTMyX3RvX2NwdSh4KSAgYW5pX2NwdV90b19sZTMyKHgpCisjZGVmaW5lIGFuaV9iZTE2X3RvX2NwdSh4KSAgYW5pX2NwdV90b19iZTE2KHgpCisjZGVmaW5lIGFuaV9iZTMyX3RvX2NwdSh4KSAgYW5pX2NwdV90b19iZTMyKHgpCisKK3ZvaWQgY29udmVydHRvX2JpZ19lbmRpYW4odm9pZCAqcHRyLCB1aW50MTZfdCBzaXplKTsKK3ZvaWQgY3JlYXRlX3NjYW5fY3RzX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNNZ210SGRyICptYWNNZ210SGRyLAorCQkJICAgdFNpck1hY0FkZHIgc2VsZk1hYyk7Cit2b2lkIGNyZWF0ZV9zY2FuX2RhdGFfbnVsbF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0U2lyTWFjTWdtdEhkciAqbWFjTWdtdEhkciwgdWludDhfdCBwd3JNZ210LCB0U2lyTWFjQWRkciBic3NpZCwKKwkJdFNpck1hY0FkZHIgc2VsZk1hY0FkZHIpOwordm9pZCBjcmVhdGVfaW5pdF9zY2FuX3Jhd19mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjTWdtdEhkciAqbWFjTWdtdEhkciwKKwkJCQl0QnNzU3lzdGVtUm9sZSByb2xlKTsKK3ZvaWQgY3JlYXRlX2ZpbmlzaF9zY2FuX3Jhd19mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgdFNpck1hY01nbXRIZHIgKm1hY01nbXRIZHIsIHRCc3NTeXN0ZW1Sb2xlIHJvbGUpOworCisjZW5kaWYgLyogX19VVElMU0FQSV9IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvaW5jbHVkZS91dGlsc19nbG9iYWwuaCBiL2NvcmUvbWFjL3NyYy9pbmNsdWRlL3V0aWxzX2dsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMmY4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvaW5jbHVkZS91dGlsc19nbG9iYWwuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaWZuZGVmIF9fVVRJTFNfR0xPQkFMX0hfXworI2RlZmluZSBfX1VUSUxTX0dMT0JBTF9IX18KKworI2luY2x1ZGUgInNpcl9wYXJhbXMuaCIKKworLyoKKyAqIEN1cnJlbnQgZGVidWcgYW5kIGV2ZW50IGxvZyBsZXZlbAorICovCisjZGVmaW5lIExPR19GSVJTVF9NT0RVTEVfSUQgICAgU0lSX0ZJUlNUX01PRFVMRV9JRAorI2RlZmluZSBMT0dfTEFTVF9NT0RVTEVfSUQgICAgIFNJUl9MQVNUX01PRFVMRV9JRAorI2RlZmluZSBMT0dfRU5UUllfTlVNICAgICAgICAgIChMT0dfTEFTVF9NT0RVTEVfSUQgLSBMT0dfRklSU1RfTU9EVUxFX0lEICsgMSkKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVNpclV0aWxzIHsKKwl1aW50MzJfdCBnTG9nRXZ0TGV2ZWxbTE9HX0VOVFJZX05VTV07CisJdWludDMyX3QgZ0xvZ0RiZ0xldmVsW0xPR19FTlRSWV9OVU1dOworCit9IHRBbmlTaXJVdGlscywgKnRwQW5pU2lyVXRpbHM7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvbGltX2FkbWl0X2NvbnRyb2wuaCBiL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL2xpbV9hZG1pdF9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlYWU4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL2xpbV9hZG1pdF9jb250cm9sLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBBdXRob3I6ICAgICAgRGluZXNoIFVwYWRoeWF5CisgKiBEYXRlOiAgICAgICAgMTAvMjQvMDYKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTV9BRE1JVF9DT05UUk9MX0hfXworI2RlZmluZSBfX0xJTV9BRE1JVF9DT05UUk9MX0hfXworCisjaW5jbHVkZSAic2lyX2NvbW1vbi5oIgorI2luY2x1ZGUgInNpcl9tYWNfcHJvdF9kZWYuaCIKKworI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKwordFNpclJldFN0YXR1cworbGltX3RzcGVjX2ZpbmRfYnlfYXNzb2NfaWQodHBBbmlTaXJHbG9iYWwsIHVpbnQxNl90LCB0U2lyTWFjVHNwZWNJRSAqLAorCQkJICAgdHBMaW1Uc3BlY0luZm8sIHRwTGltVHNwZWNJbmZvICopOworCisvKiBBZGQgVFNQRUMgaW4gbGltIGxvY2FsIHRhYmxlICovCit0U2lyUmV0U3RhdHVzIGxpbV90c3BlY19hZGQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICB1aW50OF90ICpwQWRkciwKKwkJCSAgICB1aW50MTZfdCBhc3NvY0lkLAorCQkJICAgIHRTaXJNYWNUc3BlY0lFICpwVHNwZWMsCisJCQkgICAgdWludDMyX3QgaW50ZXJ2YWwsIHRwTGltVHNwZWNJbmZvICpwcEluZm8pOworCisvKiBhZG1pdCBjb250cm9sIGludGVyZmFjZSAqLworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbGltX2FkbWl0X2NvbnRyb2xfYWRkX3RzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdWludDhfdCAqcEFkZHIsIHRTaXJBZGR0c1JlcUluZm8gKmFkZHRzLAorCQkJCXRTaXJNYWNRb3NDYXBhYmlsaXR5U3RhSUUgKnFvcywKKwkJCQl1aW50MTZfdCBhc3NvY0lkLCB1aW50OF90IGFsbG9jLAorCQkJCXRTaXJNYWNTY2hlZHVsZUlFICpwU2NoLAorCQkJCS8qIGluZGV4IHRvIHRoZSBsaW0gdHNwZWMgdGFibGUuICovCisJCQkJdWludDhfdCAqcFRzcGVjSWR4LAorCQkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCitzdGF0aWMgaW5saW5lIHRTaXJSZXRTdGF0dXMKK2xpbV9hZG1pdF9jb250cm9sX2FkZF9zdGEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqc3RhQWRkciwgdWludDhfdCBhbGxvYykKK3sKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCitleHRlcm4gdFNpclJldFN0YXR1cworbGltX2FkbWl0X2NvbnRyb2xfZGVsZXRlX3N0YSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBhc3NvY0lkKTsKKworZXh0ZXJuIHRTaXJSZXRTdGF0dXMKK2xpbV9hZG1pdF9jb250cm9sX2RlbGV0ZV90cyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgIHVpbnQxNl90IGFzc29jSWQsCisJCQkgICAgdFNpck1hY1RTSW5mbyAqdHNpbmZvLAorCQkJICAgIHVpbnQ4X3QgKnRzU3RhdHVzLCB1aW50OF90ICp0c3BlY0lkeCk7CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbV91cGRhdGVfYWRtaXRfcG9saWN5KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCit0U2lyUmV0U3RhdHVzIGxpbV9hZG1pdF9jb250cm9sX2luaXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQordFNpclJldFN0YXR1cyBsaW1fc2VuZF9oYWxfbXNnX2FkZF90cyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgIHVpbnQxNl90IHN0YUlkeCwKKwkJCQkgICAgICB1aW50OF90IHRzcGVjSWR4LAorCQkJCSAgICAgIHRTaXJNYWNUc3BlY0lFIHRzcGVjSUUsCisJCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQsIHVpbnQxNl90IHRzbV9pbnRlcnZhbCk7CisjZWxzZQordFNpclJldFN0YXR1cyBsaW1fc2VuZF9oYWxfbXNnX2FkZF90cyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgIHVpbnQxNl90IHN0YUlkeCwKKwkJCQkgICAgICB1aW50OF90IHRzcGVjSWR4LAorCQkJCSAgICAgIHRTaXJNYWNUc3BlY0lFIHRzcGVjSUUsCisJCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQpOworI2VuZGlmCisKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfaGFsX21zZ19kZWxfdHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICB1aW50MTZfdCBzdGFJZHgsCisJCQkJICAgICAgdWludDhfdCB0c3BlY0lkeCwKKwkJCQkgICAgICB0U2lyRGVsdHNSZXFJbmZvIGRlbHRzLAorCQkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLCB1aW50OF90ICpic3NJZCk7Cit2b2lkIGxpbV9wcm9jZXNzX2hhbF9hZGRfdHNfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL2xpbV9hcGkuaCBiL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL2xpbV9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWUyZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvbGltX2FwaS5oCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBsaW1fYXBpLmggY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGV4cG9ydGVkIGJ5CisgKiBMSU0gbW9kdWxlLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2lmbmRlZiBfX0xJTV9BUElfSAorI2RlZmluZSBfX0xJTV9BUElfSAorI2luY2x1ZGUgInduaV9hcGkuaCIKKyNpbmNsdWRlICJzaXJfYXBpLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgInNpcl9tYWNfcHJvdF9kZWYuaCIKKyNpbmNsdWRlICJzaXJfY29tbW9uLmgiCisjaW5jbHVkZSAic2lyX2RlYnVnLmgiCisjaW5jbHVkZSAic2NoX2dsb2JhbC5oIgorI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgImxpbV9nbG9iYWwuaCIKKyNpbmNsdWRlICJ3bWFfaWYuaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKworLyogTWFjcm8gdG8gY291bnQgaGVhcnRiZWF0ICovCisjZGVmaW5lIGxpbVJlc2V0SEJQa3RDb3VudChwc2Vzc2lvbkVudHJ5KSAgIChwc2Vzc2lvbkVudHJ5LT5MaW1SeGVkQmVhY29uQ250RHVyaW5nSEIgPSAwKQorCisvKiBVc2VmdWwgbWFjcm9zIGZvciBmZXRjaGluZyB2YXJpb3VzIHN0YXRlcyBpbiBwTWFjLT5saW0gKi8KKy8qIGdMaW1TeXN0ZW1Sb2xlICovCisjZGVmaW5lIEdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSkgICAgICAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKKyNkZWZpbmUgTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgICAgICAgICAgIChHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpID09IGVMSU1fQVBfUk9MRSkKKyNkZWZpbmUgTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpICAgICAgICAgIChHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpID09IGVMSU1fU1RBX1JPTEUpCisjZGVmaW5lIExJTV9JU19JQlNTX1JPTEUocHNlc3Npb25FbnRyeSkgICAgICAgICAoR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSA9PSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpCisjZGVmaW5lIExJTV9JU19VTktOT1dOX1JPTEUocHNlc3Npb25FbnRyeSkgICAgICAoR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSA9PSBlTElNX1VOS05PV05fUk9MRSkKKyNkZWZpbmUgTElNX0lTX0JUX0FNUF9BUF9ST0xFKHBzZXNzaW9uRW50cnkpICAgIChHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpCisjZGVmaW5lIExJTV9JU19CVF9BTVBfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkgICAoR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSkKKyNkZWZpbmUgTElNX0lTX1AyUF9ERVZJQ0VfUk9MRShwc2Vzc2lvbkVudHJ5KSAgIChHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpID09IGVMSU1fUDJQX0RFVklDRV9ST0xFKQorI2RlZmluZSBMSU1fSVNfUDJQX0RFVklDRV9HTyhwc2Vzc2lvbkVudHJ5KSAgICAgKEdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSkgPT0gZUxJTV9QMlBfREVWSUNFX0dPKQorLyogZ0xpbVNtZVN0YXRlICovCisjZGVmaW5lIEdFVF9MSU1fU01FX1NUQVRFKHBNYWMpICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkKKyNkZWZpbmUgU0VUX0xJTV9TTUVfU1RBVEUocE1hYywgc3RhdGUpICAgICAgICAgIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID0gc3RhdGUpCisvKiBnTGltTWxtU3RhdGUgKi8KKyNkZWZpbmUgR0VUX0xJTV9NTE1fU1RBVEUocE1hYykgICAgICAgICAgICAgICAgIChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKQorI2RlZmluZSBTRVRfTElNX01MTV9TVEFURShwTWFjLCBzdGF0ZSkgICAgICAgICAgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPSBzdGF0ZSkKKy8qdHBkcGhIYXNoTm9kZSBtbG1TdGFDb250ZXh0Ki8KKyNkZWZpbmUgR0VUX0xJTV9TVEFfQ09OVEVYVF9NTE1fU1RBVEUocFN0YURzKSAgIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpCisjZGVmaW5lIFNFVF9MSU1fU1RBX0NPTlRFWFRfTUxNX1NUQVRFKHBTdGFEcywgc3RhdGUpICAocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0gc3RhdGUpCisvKiBnTGltUXVpZXRTdGF0ZSAqLworI2RlZmluZSBHRVRfTElNX1FVSUVUX1NUQVRFKHBNYWMpICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSkKKyNkZWZpbmUgU0VUX0xJTV9RVUlFVF9TVEFURShwTWFjLCBzdGF0ZSkgICAgICAgIChwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPSBzdGF0ZSkKKyNkZWZpbmUgTElNX0lTX0NPTk5FQ1RJT05fQUNUSVZFKHBzZXNzaW9uRW50cnkpICAocHNlc3Npb25FbnRyeS0+TGltUnhlZEJlYWNvbkNudER1cmluZ0hCKQorLypwTWFjLT5saW0uZ0xpbVByb2Nlc3NEZWZkTXNncyovCisjZGVmaW5lIEdFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMpIChwTWFjLT5saW0uZ0xpbVByb2Nlc3NEZWZkTXNncykKKyNkZWZpbmUgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdmFsKSAocE1hYy0+bGltLmdMaW1Qcm9jZXNzRGVmZE1zZ3MgPSB2YWwpCisvKiBMSU0gZXhwb3J0ZWQgZnVuY3Rpb24gdGVtcGxhdGVzICovCisjZGVmaW5lIExJTV9JU19SQURBUl9ERVRFQ1RFRChwTWFjKSAgICAgICAgIChwTWFjLT5saW0uZ0xpbVNwZWNNZ210LmZSYWRhckRldEN1ck9wZXJDaGFuKQorI2RlZmluZSBMSU1fU0VUX1JBREFSX0RFVEVDVEVEKHBNYWMsIHZhbCkgICAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5mUmFkYXJEZXRDdXJPcGVyQ2hhbiA9IHZhbCkKKyNkZWZpbmUgTElNX01JTl9CQ05fUFJfTEVOR1RIICAxMgorI2RlZmluZSBMSU1fQkNOX1BSX0NBUEFCSUxJVFlfT0ZGU0VUIDEwCit0eXBlZGVmIGVudW0gZU1nbXRGcm1Ecm9wUmVhc29uIHsKKwllTUdNVF9EUk9QX05PX0RST1AsCisJZU1HTVRfRFJPUF9OT1RfTEFTVF9JQlNTX0JDTiwKKwllTUdNVF9EUk9QX0lORlJBX0JDTl9JTl9JQlNTLAorCWVNR01UX0RST1BfU0NBTl9NT0RFX0ZSQU1FLAorCWVNR01UX0RST1BfTk9OX1NDQU5fTU9ERV9GUkFNRSwKKwllTUdNVF9EUk9QX0lOVkFMSURfU0laRSwKKwllTUdNVF9EUk9QX1NQVVJJT1VTX0ZSQU1FLAorfSB0TWdtdEZybURyb3BSZWFzb247CisKKy8qKgorICogRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBMSU0gc3RhdGUgbWFjaGluZXMuCisgKiBUaGlzIGNhbGxlZCB1cG9uIExJTSB0aHJlYWQgY3JlYXRpb24uCisgKi8KK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbV9pbml0aWFsaXplKHRwQW5pU2lyR2xvYmFsKTsKK3RTaXJSZXRTdGF0dXMgcGVfb3Blbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0TWFjT3BlblBhcmFtZXRlcnMgKnBNYWNPcGVuUGFyYW0pOwordFNpclJldFN0YXR1cyBwZV9jbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgcGVfcmVnaXN0ZXJfdGxfaGFuZGxlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordFNpclJldFN0YXR1cyBsaW1fc3RhcnQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit0U2lyUmV0U3RhdHVzIHBlX3N0YXJ0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBwZV9zdG9wKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordFNpclJldFN0YXR1cyBwZV9wb3N0X21zZ19hcGkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKnBNc2cpOwordFNpclJldFN0YXR1cyBwZVByb2Nlc3NNc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKmxpbU1zZyk7CisvKioKKyAqIEZ1bmN0aW9uIHRvIGNsZWFudXAgTElNIHN0YXRlLgorICogVGhpcyBjYWxsZWQgdXBvbiByZXNldC9wZXJzb25hIGNoYW5nZSBldGMKKyAqLworZXh0ZXJuIHZvaWQgbGltX2NsZWFudXAodHBBbmlTaXJHbG9iYWwpOworLyogLyBGdW5jdGlvbiB0byBwb3N0IG1lc3NhZ2VzIHRvIExJTSB0aHJlYWQgKi8KK2V4dGVybiB1aW50MzJfdCBsaW1fcG9zdF9tc2dfYXBpKHRwQW5pU2lyR2xvYmFsLCB0U2lyTXNnUSAqKTsKKy8qKgorICogRnVuY3Rpb24gdG8gcHJvY2VzcyBtZXNzYWdlcyBwb3N0ZWQgdG8gTElNIHRocmVhZAorICogYW5kIGRpc3BhdGNoIHRvIHZhcmlvdXMgc3ViIG1vZHVsZXMgd2l0aGluIExJTSBtb2R1bGUuCisgKi8KK2V4dGVybiB2b2lkIGxpbV9tZXNzYWdlX3Byb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCwgdHBTaXJNc2dRKTsKK2V4dGVybiB2b2lkIGxpbV9wcm9jZXNzX21lc3NhZ2VzKHRwQW5pU2lyR2xvYmFsLCB0cFNpck1zZ1EpOyAgICAgIC8qIERUIHRlc3QgYWx0IGRlZmVycmVkIDIgKi8KKy8qKgorICogRnVuY3Rpb24gdG8gY2hlY2sgdGhlIExJTSBzdGF0ZSBpZiBzeXN0ZW0gaXMgaW4gU2Nhbi9MZWFybiBzdGF0ZS4KKyAqLworZXh0ZXJuIHVpbnQ4X3QgbGltX2lzX3N5c3RlbV9pbl9zY2FuX3N0YXRlKHRwQW5pU2lyR2xvYmFsKTsKKy8qKgorICogRnVuY3Rpb24gdG8gaGFuZGxlIElCU1MgY29hbGVzY2luZy4KKyAqIEJlYWNvbiBQcm9jZXNzaW5nIG1vZHVsZSB0byBjYWxsIHRoaXMuCisgKi8KK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbV9oYW5kbGVfaWJzc19jb2FsZXNjaW5nKHRwQW5pU2lyR2xvYmFsLAorCQkJCQkJdHBTY2hCZWFjb25TdHJ1Y3QsCisJCQkJCQl1aW50OF90ICosIHRwUEVTZXNzaW9uKTsKKy8qIC8gRnVuY3Rpb24gdXNlZCBieSBvdGhlciBTaXJpdXMgbW9kdWxlcyB0byByZWFkIGdsb2JhbCBTTUUgc3RhdGUgKi8KK3N0YXRpYyBpbmxpbmUgdExpbVNtZVN0YXRlcyBsaW1fZ2V0X3NtZV9zdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXJldHVybiBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlOworfQorCitleHRlcm4gdm9pZCBsaW1fcmVjZWl2ZWRfaGJfaGFuZGxlcih0cEFuaVNpckdsb2JhbCwgdWludDhfdCwgdHBQRVNlc3Npb24pOworZXh0ZXJuIHZvaWQgbGltQ2hlY2tBbmRRdWlldEJTUyh0cEFuaVNpckdsb2JhbCk7CisvKiAvIEZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgU1RBIGNvbnRleHQgZGVsZXRpb24gKi8KK2V4dGVybiB2b2lkIGxpbV90cmlnZ2VyX3N0YV9kZWxldGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywKKwkJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKy8qIEZ1bmN0aW9uIHRoYXQgc2VuZHMgVERMUyBEZWwgU3RhIGluZGljYXRpb24gdG8gU01FICovCitleHRlcm4gdm9pZCBsaW1fc2VuZF9zbWVfdGRsc19kZWxfc3RhX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywKKwkJCQkJICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJCQkgIHVpbnQxNl90IHJlYXNvbkNvZGUpOworI2VuZGlmCisKKy8qIC8gRnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGNoYW5nZSBpbiBBUCdzIGNhcGFiaWx0aWVzIG9uIFNUQSAqLworZXh0ZXJuIHZvaWQgbGltX2RldGVjdF9jaGFuZ2VfaW5fYXBfY2FwYWJpbGl0aWVzKHRwQW5pU2lyR2xvYmFsLAorCQkJCQkJIHRwU2lyUHJvYmVSZXNwQmVhY29uLCB0cFBFU2Vzc2lvbik7Cit0U2lyUmV0U3RhdHVzIGxpbV91cGRhdGVfc2hvcnRfc2xvdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICB0cFNpclByb2JlUmVzcEJlYWNvbiBwQmVhY29uLAorCQkJCSAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLAorCQkJCSAgICB0cFBFU2Vzc2lvbik7CisKK3ZvaWQgbGltX3BzX29mZmxvYWRfaGFuZGxlX21pc3NlZF9iZWFjb25faW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKTsKK3ZvaWQgbGltX3NlbmRfaGVhcnRfYmVhdF90aW1lb3V0X2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3RNZ210RnJtRHJvcFJlYXNvbiBsaW1faXNfcGt0X2NhbmRpZGF0ZV9mb3JfZHJvcCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sCisJCQkJCQkgdWludDMyX3Qgc3ViVHlwZSk7Citib29sIGxpbV9pc19kZWF1dGhfZGlhc3NvY19mb3JfZHJvcCh0cEFuaVNpckdsb2JhbCBtYWMsIHVpbnQ4X3QgKnJ4X3BrdF9pbmZvKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCitib29sIGxpbV9pc19hc3NvY19yZXFfZm9yX2Ryb3AodHBBbmlTaXJHbG9iYWwgbWFjLCB1aW50OF90ICpyeF9wa3RfaW5mbyk7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECit2b2lkIGxpbV9yb2FtX29mZmxvYWRfc3luY2hfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKTsKKyNlbmRpZgorI2RlZmluZSBsaW1HZXRRb3NNb2RlKHBzZXNzaW9uRW50cnksIHBWYWwpICgqKHBWYWwpID0gKHBzZXNzaW9uRW50cnkpLT5saW1Rb3NFbmFibGVkKQorI2RlZmluZSBsaW1HZXRXbWVNb2RlKHBzZXNzaW9uRW50cnksIHBWYWwpICgqKHBWYWwpID0gKHBzZXNzaW9uRW50cnkpLT5saW1XbWVFbmFibGVkKQorI2RlZmluZSBsaW1HZXRXc21Nb2RlKHBzZXNzaW9uRW50cnksIHBWYWwpICgqKHBWYWwpID0gKHBzZXNzaW9uRW50cnkpLT5saW1Xc21FbmFibGVkKQorI2RlZmluZSBsaW1HZXQxMWRNb2RlKHBzZXNzaW9uRW50cnksIHBWYWwpICgqKHBWYWwpID0gKHBzZXNzaW9uRW50cnkpLT5saW0xMWRFbmFibGVkKQorI2RlZmluZSBsaW1HZXRBY2tQb2xpY3kocE1hYywgcFZhbCkgICAgICAgICAoKihwVmFsKSA9IHBNYWMtPmxpbS5hY2tQb2xpY3kpCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSB2b2lkIGxpbV9nZXRfcGh5X21vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBoeU1vZGUsCisJCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJKnBoeU1vZGUgPQorCQlwc2Vzc2lvbkVudHJ5ID8gcHNlc3Npb25FbnRyeS0+Z0xpbVBoeU1vZGUgOiBwTWFjLT5saW0uZ0xpbVBoeU1vZGU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGltX2dldF9yZl9iYW5kX25ldyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyUkZCYW5kICpiYW5kLAorCQkJCQkgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwkqYmFuZCA9IHBzZXNzaW9uRW50cnkgPyBwc2Vzc2lvbkVudHJ5LT5saW1SRkJhbmQgOiBTSVJfQkFORF9VTktOT1dOOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBwZV9wcm9jZXNzX21lc3NhZ2VzKCkgLSBNZXNzYWdlIFByb2Nlc3NvciBmb3IgUEUKKworICAgVm9zcyBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIGRpc3BhdGNoIHRoZSBtZXNzYWdlIHRvIFBFCisKKyAgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICAgXHBhcmFtIHBNc2cgLSBQb2ludGVyIHRvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZQorCisgICBccmV0dXJuICB1aW50MzJfdCAtIFRYX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMgcGVfcHJvY2Vzc19tZXNzYWdlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSAqcE1zZyk7CisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIHBlX2ZyZWVfbXNnCisgICBcYnJpZWYgQ2FsbGVkIGJ5IENEUyBzY2hlZHVsZXIgKGZ1bmN0aW9uIGNkc19zY2hlZF9mbHVzaF9tY19tcXMpCisgXCAgICAgIHRvIGZyZWUgYSBnaXZlbiBQRSBtZXNzYWdlIG9uIHRoZSBUWCBhbmQgTUMgdGhyZWFkLgorIFwgICAgICBUaGlzIGhhcHBlbnMgd2hlbiB0aGVyZSBhcmUgbWVzc2FnZXMgcGVuZGluZyBpbiB0aGUgUEUKKyBcICAgICAgcXVldWUgd2hlbiBzeXN0ZW0gaXMgYmVpbmcgc3RvcHBlZCBhbmQgcmVzZXQuCisgICBccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCisgICBccGFyYW0gICB0U2lyTXNnUSAgICAgICBwTXNnCisgICBccmV0dXJuIG5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgcGVfZnJlZV9tc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKnBNc2cpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBsaW1fcmVtYWluX29uX2Nobl9yc3AoKSAtIEFQSSBmb3Igc2VuZGluZyByZW1haW4gb24gY2hhbm5lbCByZXNwb25zZS4KKworICAgTElNIGNhbGxzIHRoaXMgYXBpIHRvIHNlbmQgdGhlIHJlbWFpbiBvbiBjaGFubmVsIHJlc3BvbnNlIHRvIFNNRS4KKworICAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgICBccGFyYW0gc3RhdHVzIC0gc3RhdHVzIG9mIHRoZSByZXNwb25zZQorICAgXHBhcmFtIGRhdGEgLSBwb2ludGVyIHRvIG1zZworCisgICBccmV0dXJuICB2b2lkCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltX3JlbWFpbl9vbl9jaG5fcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIENERl9TVEFUVVMgc3RhdHVzLCB1aW50MzJfdCAqZGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIGxpbV9wcm9jZXNzX2Fib3J0X3NjYW5faW5kKCkgLSBmdW5jdGlvbiBmb3Igc2VuZGluZyBhYm9ydCBzY2FuIGluZGljYXRpb24uCisKKyAgIExJTSBjYWxscyB0aGlzIGZ1bmN0aW9uIGZvciBzZW5kaW5nIGFib3J0IHNjYW4gaW5kaWNhdGlvbi4KKworICAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisKKyAgIFxyZXR1cm4gIHZvaWQKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1fcHJvY2Vzc19hYm9ydF9zY2FuX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwl1aW50MzJfdCBzY2FuX2lkKTsKKwordm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9hc3NvY19jbmZfbmV3KHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCwgdWludDMyX3QgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogX19MSU1fQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL2xpbV9mdC5oIGIvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvbGltX2Z0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiZTg0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL2xpbV9mdC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIE1hY3JvcyBhbmQgRnVuY3Rpb24gcHJvdG90eXBlcyBGVCBhbmQgODAyLjExUiBwdXJwb3NlcworCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZuZGVmIF9fTElNRlRfSF9fCisjZGVmaW5lIF9fTElNRlRfSF9fCisKKyNpbmNsdWRlIDxjZHNfYXBpLmg+CisjaW5jbHVkZSA8bGltX2dsb2JhbC5oPgorI2luY2x1ZGUgPGFuaV9nbG9iYWwuaD4KKyNpbmNsdWRlIDxsaW1fZGVidWcuaD4KKyNpbmNsdWRlIDxsaW1fc2VyX2Rlc191dGlscy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1fZnRfb3Blbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltX2Z0X2NsZWFudXAodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbV9mdF9jbGVhbnVwX3ByZV9hdXRoX2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CitpbnQgbGltX3Byb2Nlc3NfZnRfcHJlX2F1dGhfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKTsKK3ZvaWQgbGltX3BlcmZvcm1fZnRfcHJlX2F1dGgodHBBbmlTaXJHbG9iYWwgcE1hYywgQ0RGX1NUQVRVUyBzdGF0dXMsCisJCQkgICAgIHVpbnQzMl90ICpkYXRhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltUGVyZm9ybVBvc3RGVFByZUF1dGgodHBBbmlTaXJHbG9iYWwgcE1hYywgQ0RGX1NUQVRVUyBzdGF0dXMsCisJCQkgICAgIHVpbnQzMl90ICpkYXRhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltRlRSZXN1bWVMaW5rQ2IodHBBbmlTaXJHbG9iYWwgcE1hYywgQ0RGX1NUQVRVUyBzdGF0dXMsIHVpbnQzMl90ICpkYXRhKTsKK3ZvaWQgbGltX3Bvc3RfZnRfcHJlX2F1dGhfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJSZXRTdGF0dXMgc3RhdHVzLAorCQkJICAgICAgdWludDhfdCAqYXV0aF9yc3AsIHVpbnQxNl90IGF1dGhfcnNwX2xlbmd0aCwKKwkJCSAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1faGFuZGxlX2Z0X3ByZV9hdXRoX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyUmV0U3RhdHVzIHN0YXR1cywKKwkJCQl1aW50OF90ICphdXRoX3JzcCwgdWludDE2X3QgYXV0aF9yc3BfbGVuLAorCQkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fcHJvY2Vzc19tbG1fZnRfcmVhc3NvY19yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYsCisJCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fcHJvY2Vzc19mdF9wcmVhdXRoX3JzcF90aW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCitib29sIGxpbV9wcm9jZXNzX2Z0X3VwZGF0ZV9rZXkodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYpOwordFNpclJldFN0YXR1cyBsaW1fcHJvY2Vzc19mdF9hZ2dyX3Fvc19yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYpOwordm9pZCBsaW1fcHJvY2Vzc19mdF9hZ2dyX3FvX3NfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpOwordm9pZCBsaW1fZnRfY2xlYW51cF9hbGxfZnRfc2Vzc2lvbnModHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGxpbV9maWxsX2Z0X3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdHBTaXJCc3NEZXNjcmlwdGlvbiBwYnNzRGVzY3JpcHRpb24sCisJCXRwUEVTZXNzaW9uIHBmdFNlc3Npb25FbnRyeSwKKwkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit0U2lyUmV0U3RhdHVzIGxpbV9mdF9wcmVwYXJlX2FkZF9ic3NfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3QgdXBkYXRlRW50cnksCisJCXRwUEVTZXNzaW9uIHBmdFNlc3Npb25FbnRyeSwKKwkJdHBTaXJCc3NEZXNjcmlwdGlvbiBic3NEZXNjcmlwdGlvbik7CisjZW5kaWYgLyogX19MSU1GVF9IX18gKi8KKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvaW5jbHVkZS9saW1fZnRfZGVmcy5oIGIvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvbGltX2Z0X2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTRmMTFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvbGltX2Z0X2RlZnMuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgTWFjcm9zIGFuZCBGdW5jdGlvbiBwcm90b3R5cGVzIEZUIGFuZCA4MDIuMTFSIHB1cnBvc2VzCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZm5kZWYgX19MSU1GVERFRlNfSF9fCisjZGVmaW5lIF9fTElNRlRERUZTX0hfXworCisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgIndtYV9pZi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU0lSX01ESUVfU0laRSAgICAgICAgICAgICAgIDMgICAvKiBNRCBJRCgyIGJ5dGVzKSwgQ2FwYWJpbGl0eSgxIGJ5dGUpICovCisjZGVmaW5lIE1BWF9GVElFX1NJWkUgICAgICAgICAgICAgMzg0ICAgLyogTWF4IHNpemUgbGltaXRlZCB0byAzODQsIG9uIGFjY3QuIG9mIElXIGN1c3RvbSBldmVudHMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBGVCBQcmUgQXV0aCBSZXEgU01FPC0+UEUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCBzU2lyRlRQcmVBdXRoUmVxIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9GVF9QUkVfQVVUSF9SRVEgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJLyoKKwkgKiBUcmFjayBpZiByZXNwb25zZSBpcyBwcm9jZXNzZWQgZm9yIHRoaXMgcmVxdWVzdAorCSAqIFdlIGV4cGVjdCBvbmx5IG9uZSByZXNwb25zZSBwZXIgcmVxdWVzdC4KKwkgKi8KKwlib29sIGJQcmVBdXRoUnNwUHJvY2Vzc2VkOworCXVpbnQ4X3QgcHJlQXV0aGNoYW5uZWxOdW07CisJLyogQlNTSUQgY3VycmVudGx5IGFzc29jaWF0ZWQgdG8gc3VzcGVuZCB0aGUgbGluayAqLworCXRTaXJNYWNBZGRyIGN1cnJic3NJZDsKKwl0U2lyTWFjQWRkciBwcmVBdXRoYnNzSWQ7ICAgICAgIC8qIEJTU0lEIHRvIHByZWF1dGggdG8gKi8KKwl1aW50MTZfdCBmdF9pZXNfbGVuZ3RoOworCXVpbnQ4X3QgZnRfaWVzW01BWF9GVElFX1NJWkVdOworCXRwU2lyQnNzRGVzY3JpcHRpb24gcGJzc0Rlc2NyaXB0aW9uOworfSB0U2lyRlRQcmVBdXRoUmVxLCAqdHBTaXJGVFByZUF1dGhSZXE7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRlQgUHJlIEF1dGggUnNwIFBFPC0+U01FCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc1NpckZUUHJlQXV0aFJzcCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfRlRfUFJFX0FVVEhfUlNQICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc21lU2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIHByZUF1dGhic3NJZDsgICAgICAgLyogQlNTSUQgdG8gcHJlYXV0aCB0byAqLworCXRTaXJSZXRTdGF0dXMgc3RhdHVzOworCXVpbnQxNl90IGZ0X2llc19sZW5ndGg7CisJdWludDhfdCBmdF9pZXNbTUFYX0ZUSUVfU0laRV07CisJdWludDE2X3QgcmljX2llc19sZW5ndGg7CisJdWludDhfdCByaWNfaWVzW01BWF9GVElFX1NJWkVdOworfSB0U2lyRlRQcmVBdXRoUnNwLCAqdHBTaXJGVFByZUF1dGhSc3A7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEZUIFByZSBBdXRoIFJzcCBLZXkgU01FPC0+UEUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCBzU2lyRlRVcGRhdGVLZXlJbmZvIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDMyX3Qgc21lU2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIGJzc0lkOworCXRTaXJLZXlNYXRlcmlhbCBrZXlNYXRlcmlhbDsKK30gdFNpckZUVXBkYXRlS2V5SW5mbywgKnRwU2lyRlRVcGRhdGVLZXlJbmZvOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBGVCBQcmUgQXV0aCBSc3AgS2V5IFNNRTwtPlBFCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc1NpckZUUHJlQXV0aEtleUluZm8geworCXVpbnQ4X3QgZXh0U2V0U3RhS2V5UGFyYW1WYWxpZDsgLyogRXh0IEJzcyBDb25maWcgTXNnIGlmIHNldCAqLworCS8qIFNldFN0YUtleVBhcmFtcyBmb3IgZXh0IGJzcyBtc2cgKi8KKwl0TGltTWxtU2V0S2V5c1JlcSBleHRTZXRTdGFLZXlQYXJhbTsKK30gdFNpckZUUHJlQXV0aEtleUluZm8sICp0cFNpckZUUHJlQXV0aEtleUluZm87CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgR2xvYmFsIEZUIEluZm9ybWF0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc0ZUUEVDb250ZXh0IHsKKwl0cFNpckZUUHJlQXV0aFJlcSBwRlRQcmVBdXRoUmVxOyAgICAgICAgLyogU2F2ZWQgRlQgUHJlIEF1dGggUmVxICovCisJdFNpclJldFN0YXR1cyBmdFByZUF1dGhTdGF0dXM7CisJdWludDE2X3Qgc2F2ZWRfYXV0aF9yc3BfbGVuZ3RoOworCXVpbnQ4X3Qgc2F2ZWRfYXV0aF9yc3BbTUFYX0ZUSUVfU0laRV07CisJdFNpckZUUHJlQXV0aEtleUluZm8gUHJlQXV0aEtleUluZm87CisJLyogSXRlbXMgY3JlYXRlZCBmb3IgdGhlIG5ldyBGVCwgc2Vzc2lvbiAqLworCXZvaWQgKnBBZGRCc3NSZXE7ICAgICAgIC8qIFNhdmUgYWRkIGJzcyByZXEgKi8KKwl2b2lkICpwQWRkU3RhUmVxOyAgICAgICAvKlNhdmUgYWRkIHN0YSByZXEgICovCisJdWludDMyX3QgcGVTZXNzaW9uSWQ7CisJdWludDMyX3Qgc21lU2Vzc2lvbklkOworCisJLyogVGhpcyBmbGFnIGlzIHJlcXVpcmVkIHRvIGluZGljYXRlIG9uIHdoaWNoIHNlc3Npb24gdGhlIHByZWF1dGgKKwkgKiBoYXMgdGFrZW4gcGxhY2UsIHNpbmNlIHRoZSBhdXRoIHJlcG9uc2UgZm9yIHByZWF1dGggd2lsbCBjb21lCisJICogZm9yIGEgbmV3IEJTU0lEIGZvciB3aGljaCB0aGVyZSBpcyBubyBzZXNzaW9uIHlldC4gVGhpcyBmbGFnCisJICogd2lsbCBiZSB1c2VkIHRvIGV4dHJhY3QgdGhlIHNlc3Npb24gZnJvbSB0aGUgc2Vzc2lvbiBwcmVhdXRoCisJICogaGFzIGJlZW4gaW5pdGlhdGVkCisJICovCisJYm9vbCBmdFByZUF1dGhTZXNzaW9uOworfSB0ZnRQRUNvbnRleHQsICp0cGZ0UEVDb250ZXh0OworCisjZW5kaWYgLyogX19MSU1GVERFRlNfSF9fICovCisKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvbGltX2dsb2JhbC5oIGIvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvbGltX2dsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZGIwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvaW5jbHVkZS9saW1fZ2xvYmFsLmgKQEAgLTAsMCArMSw2NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV9nbG9iYWwuaCBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZXhwb3J0ZWQgYnkKKyAqIExJTSBtb2R1bGUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaWZuZGVmIF9fTElNX0dMT0JBTF9ICisjZGVmaW5lIF9fTElNX0dMT0JBTF9ICisKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorI2luY2x1ZGUgInNpcl9tYWNfcHJvdF9kZWYuaCIKKyNpbmNsdWRlICJzaXJfbWFjX3Byb3BfZXh0cy5oIgorI2luY2x1ZGUgInNpcl9jb21tb24uaCIKKyNpbmNsdWRlICJzaXJfZGVidWcuaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAiY3NyX2FwaS5oIgorI2luY2x1ZGUgInNhcF9hcGkuaCIKKyNpbmNsdWRlICJkb3QxMWYuaCIKKyNpbmNsdWRlICJ3bWFfaWYuaCIKKworLyogLyBNYXhpbXVtIG51bWJlciBvZiBzY2FuIGhhc2ggdGFibGUgZW50cmllcyAqLworI2RlZmluZSBMSU1fTUFYX05VTV9PRl9TQ0FOX1JFU1VMVFMgMjU2CisKKy8qIFNlbmRpbmcgRGlzYXNzb2NpYXRlIGZyYW1lcyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgTElNX1NFTkRfRElTQVNTT0NfRlJBTUVfVEhSRVNIT0xEICAgICAgIDIKKyNkZWZpbmUgTElNX0hBU0hfTUlTU19USU1FUl9NUyAgICAgICAgICAgICAgICAgIDEwMDAwCisKKy8qIERlZmVycmVkIE1lc3NhZ2UgUXVldWUgTGVuZ3RoICovCisjZGVmaW5lIE1BWF9ERUZFUlJFRF9RVUVVRV9MRU4gICAgICAgICAgICAgICAgICA4MAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBQUyAtIFRJTSdzIHRvIGJlIHNlbnQgd2l0aCBvdXQgd2FrZXVwIGZyb20gU1RBICovCisjZGVmaW5lIExJTV9USU1fV0FJVF9DT1VOVF9GQUNUT1IgICAgICAgICAgNQorCisvKgorICogVXNlIHRoaXMgY291bnQgaWYgKExJTV9USU1fV0FJVF9GQUNUT1IgKiBMaXN0ZW5JbnRlcnZhbCkKKyAqIGlzIGxlc3MgdGhhbiBMSU1fTUlOX1RJTV9XQUlUX0NOVAorICovCisjZGVmaW5lIExJTV9NSU5fVElNX1dBSVRfQ09VTlQgICAgICAgICAgNTAKKworI2RlZmluZSBHRVRfVElNX1dBSVRfQ09VTlQoTEludHJ2bCkgXAorCSgoTEludHJ2bCAqIExJTV9USU1fV0FJVF9DT1VOVF9GQUNUT1IpID4gTElNX01JTl9USU1fV0FJVF9DT1VOVCA/IFwKKwkoTEludHJ2bCAqIExJTV9USU1fV0FJVF9DT1VOVF9GQUNUT1IpIDogTElNX01JTl9USU1fV0FJVF9DT1VOVCkKKworI2RlZmluZSBJU181R19CQU5EKF9fcmZCYW5kKSAgICAgKChfX3JmQmFuZCAmIDB4MykgPT0gMHgyKQorI2RlZmluZSBJU18yNEdfQkFORChfX3JmQmFuZCkgICAgKChfX3JmQmFuZCAmIDB4MykgPT0gMHgxKQorCisjZGVmaW5lIExJTV9NQVhfQ1NBX0lFX1VQREFURVMgICAgKDUpCisKKy8qIGVudW1zIGV4cG9ydGVkIGJ5IExJTSBhcmUgYXMgZm9sbG93cyAqLworCisvKlN5c3RlbSByb2xlIGRlZmluaXRpb24gKi8KK3R5cGVkZWYgZW51bSBlTGltU3lzdGVtUm9sZSB7CisJZUxJTV9VTktOT1dOX1JPTEUsCisJZUxJTV9BUF9ST0xFLAorCWVMSU1fU1RBX0lOX0lCU1NfUk9MRSwKKwllTElNX1NUQV9ST0xFLAorCWVMSU1fQlRfQU1QX1NUQV9ST0xFLAorCWVMSU1fQlRfQU1QX0FQX1JPTEUsCisJZUxJTV9QMlBfREVWSUNFX1JPTEUsCisJZUxJTV9QMlBfREVWSUNFX0dPLAorCWVMSU1fUDJQX0RFVklDRV9DTElFTlQKK30gdExpbVN5c3RlbVJvbGU7CisKKy8qCisgKiBTTUUgc3RhdGUgZGVmaW5pdGlvbiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgU2lyaXVzIG1vZHVsZXMuCisgKiBBUCBvbmx5IHN0YXRlcyBhcmUgTElNX1NNRV9DSEFOTkVMX1NDQU5fU1RBVEUgJgorICogTElNX1NNRV9OT1JNQUxfQ0hBTk5FTF9TQ0FOX1NUQVRFLgorICogTm90ZSB0aGF0IHRoZXNlIHN0YXRlcyBtYXkgYWxzbyBiZSBwcmVzZW50IGluIFNUQQorICogc2lkZSB0b28gd2hlbiBERlMgc3VwcG9ydCBpcyBwcmVzZW50IGZvciBhIFNUQSBpbiBJQlNTIG1vZGUuCisgKi8KK3R5cGVkZWYgZW51bSBlTGltU21lU3RhdGVzIHsKKwllTElNX1NNRV9PRkZMSU5FX1NUQVRFLAorCWVMSU1fU01FX0lETEVfU1RBVEUsCisJZUxJTV9TTUVfU1VTUEVORF9TVEFURSwKKwllTElNX1NNRV9XVF9TQ0FOX1NUQVRFLAorCWVMSU1fU01FX1dUX0pPSU5fU1RBVEUsCisJZUxJTV9TTUVfV1RfQVVUSF9TVEFURSwKKwllTElNX1NNRV9XVF9BU1NPQ19TVEFURSwKKwllTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFLAorCWVMSU1fU01FX1dUX1JFQVNTT0NfTElOS19GQUlMX1NUQVRFLAorCWVMSU1fU01FX0pPSU5fRkFJTFVSRV9TVEFURSwKKwllTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFLAorCWVMSU1fU01FX1JFQVNTT0NJQVRFRF9TVEFURSwKKwllTElNX1NNRV9MSU5LX0VTVF9TVEFURSwKKwllTElNX1NNRV9MSU5LX0VTVF9XVF9TQ0FOX1NUQVRFLAorCWVMSU1fU01FX1dUX1BSRV9BVVRIX1NUQVRFLAorCWVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFLAorCWVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSwKKwllTElNX1NNRV9XVF9TVEFSVF9CU1NfU1RBVEUsCisJZUxJTV9TTUVfV1RfU1RPUF9CU1NfU1RBVEUsCisJZUxJTV9TTUVfTk9STUFMX1NUQVRFLAorCWVMSU1fU01FX0NIQU5ORUxfU0NBTl9TVEFURSwKKwllTElNX1NNRV9OT1JNQUxfQ0hBTk5FTF9TQ0FOX1NUQVRFCit9IHRMaW1TbWVTdGF0ZXM7CisKKy8qCisgKiBNTE0gc3RhdGUgZGVmaW5pdGlvbi4KKyAqIFdoaWxlIHRoZXNlIHN0YXRlcyBhcmUgcHJlc2VudCBvbiBBUCB0b28gd2hlbiBpdCBpcworICogU1RBIG1vZGUsIHBlci1TVEEgTUxNIHN0YXRlIGV4Y2x1c2l2ZSB0byBBUCBpczoKKyAqIGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUzLgorICovCit0eXBlZGVmIGVudW0gZUxpbU1sbVN0YXRlcyB7CisJZUxJTV9NTE1fT0ZGTElORV9TVEFURSwKKwllTElNX01MTV9JRExFX1NUQVRFLAorCWVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUsCisJZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFLAorCWVMSU1fTUxNX1dUX0pPSU5fQkVBQ09OX1NUQVRFLAorCWVMSU1fTUxNX0pPSU5FRF9TVEFURSwKKwllTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURSwKKwllTElNX01MTV9XVF9BVVRIX0ZSQU1FMl9TVEFURSwKKwllTElNX01MTV9XVF9BVVRIX0ZSQU1FM19TVEFURSwKKwllTElNX01MTV9XVF9BVVRIX0ZSQU1FNF9TVEFURSwKKwllTElNX01MTV9BVVRIX1JTUF9USU1FT1VUX1NUQVRFLAorCWVMSU1fTUxNX0FVVEhFTlRJQ0FURURfU1RBVEUsCisJZUxJTV9NTE1fV1RfQVNTT0NfUlNQX1NUQVRFLAorCWVMSU1fTUxNX1dUX1JFQVNTT0NfUlNQX1NUQVRFLAorCWVMSU1fTUxNX0FTU09DSUFURURfU1RBVEUsCisJZUxJTV9NTE1fUkVBU1NPQ0lBVEVEX1NUQVRFLAorCWVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUsCisJZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFLAorCWVMSU1fTUxNX0xFQVJOX1NUQVRFLAorCWVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1NUQVRFLAorCWVMSU1fTUxNX1dUX0RFTF9CU1NfUlNQX1NUQVRFLAorCWVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0FTU09DX1NUQVRFLAorCWVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1JFQVNTT0NfU1RBVEUsCisJZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUFJFQVNTT0NfU1RBVEUsCisJZUxJTV9NTE1fV1RfQUREX1NUQV9SU1BfU1RBVEUsCisJZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEUsCisJLyoKKwkgKiBNTE0gZ29lcyB0byB0aGlzIHN0YXRlIHdoZW4gTElNIGluaXRpYXRlcyBERUxFVEVfU1RBCisJICogYXMgcHJvY2Vzc2luZyBvZiBBc3NvYyByZXEgYmVjYXVzZSB0aGUgZW50cnkgYWxyZWFkeSBleGlzdHMuCisJICogTElNIGNvbWVzIG91dCBvZiB0aGlzIHN0YXRlIHdoZW4gREVMRVRFX1NUQSByZXNwb25zZSBmcm9tCisJICogSEFMIGlzIHJlY2VpdmVkLiBMSU0gbmVlZHMgdG8gbWFpbnRhaW4gdGhpcyBzdGF0ZSBzbyB0aGF0IEFERF9TVEEKKwkgKiBjYW4gYmUgaXNzdWVkIHdoaWxlIHByb2Nlc3NpbmcgREVMRVRFX1NUQSByZXNwb25zZSBmcm9tIEhBTC4KKwkgKi8KKwllTElNX01MTV9XVF9BU1NPQ19ERUxfU1RBX1JTUF9TVEFURSwKKwllTElNX01MTV9XVF9TRVRfQlNTX0tFWV9TVEFURSwKKwllTElNX01MTV9XVF9TRVRfU1RBX0tFWV9TVEFURSwKKwllTElNX01MTV9XVF9TRVRfU1RBX0JDQVNUS0VZX1NUQVRFLAorCWVMSU1fTUxNX1dUX1NFVF9NSU1PUFNfU1RBVEUsCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0ZUX1JFQVNTT0NfU1RBVEUsCisJZUxJTV9NTE1fV1RfRlRfUkVBU1NPQ19SU1BfU1RBVEUsCisjZW5kaWYKKwllTElNX01MTV9QMlBfTElTVEVOX1NUQVRFLAorfSB0TGltTWxtU3RhdGVzOworCisvKiAxMWggY2hhbm5lbCBxdWlldCBzdGF0ZXMgKi8KKworLyoKKyAqIFRoaXMgZW51bSBpbmRpY2F0ZXMgaW4gd2hpY2ggc3RhdGUgdGhlIGRldmljZSBpcyBpbgorICogd2hlbiBpdCByZWNlaXZlcyBxdWlldCBlbGVtZW50IGluIGJlYWNvbiBvciBwcm9iZS1yZXNwb25zZS4KKyAqIFRoZSBkZWZhdWx0IHF1aWV0IHN0YXRlIG9mIHRoZSBkZXZpY2UgaXMgYWx3YXlzIElOSVQKKyAqIGVMSU1fUVVJRVRfQkVHSU4gLSBXaGVuIFF1aWV0IHBlcmlvZCBpcyBzdGFydGVkCisgKiBlTElNX1FVSUVUX0NIQU5HRUQgLSBXaGVuIFF1aWV0IHBlcmlvZCBpcyB1cGRhdGVkCisgKiBlTElNX1FVSUVUX1JVTk5JTkcgLSBCZXR3ZWVuIHR3byBzdWNjZXNzaXZlIFF1aWV0IHVwZGF0ZXMKKyAqIGVMSU1fUVVJRVRfRU5EIC0gV2hlbiBxdWlldCBwZXJpb2QgZW5kcworICovCit0eXBlZGVmIGVudW0gZUxpbVF1aWV0U3RhdGVzIHsKKwllTElNX1FVSUVUX0lOSVQsCisJZUxJTV9RVUlFVF9CRUdJTiwKKwllTElNX1FVSUVUX0NIQU5HRUQsCisJZUxJTV9RVUlFVF9SVU5OSU5HLAorCWVMSU1fUVVJRVRfRU5ECit9IHRMaW1RdWlldFN0YXRlczsKKworLyogMTFoIGNoYW5uZWwgc3dpdGNoIHN0YXRlcyAqLworCisvKgorICogVGhpcyBlbnVtIGluZGljYXRlcyBpbiB3aGljaCBzdGF0ZSB0aGUgY2hhbm5lbC1zd2l0aAorICogaXMgcHJlc2VudGx5IG9wZXJhdGluZy4KKyAqIGVMSU1fMTFIX0NIQU5TV19JTklUIC0gRGVmYXVsdCBzdGF0ZQorICogZUxJTV8xMUhfQ0hBTlNXX1JVTk5JTkcgLSBXaGVuIGNoYW5uZWwgc3dpdGNoIGlzIHJ1bm5pbmcKKyAqIGVMSU1fMTFIX0NIQU5TV19FTkQgLSBBZnRlciBjaGFubmVsIHN3aXRjaCBpcyBjb21wbGV0ZQorICovCit0eXBlZGVmIGVudW0gZUxpbURvdDExaENoYW5Td1N0YXRlcyB7CisJZUxJTV8xMUhfQ0hBTlNXX0lOSVQsCisJZUxJTV8xMUhfQ0hBTlNXX1JVTk5JTkcsCisJZUxJTV8xMUhfQ0hBTlNXX0VORAorfSB0TGltRG90MTFoQ2hhblN3U3RhdGVzOworCisKKy8qIFdMQU5fU1VTUEVORF9MSU5LIFJlbGF0ZWQgKi8KK3R5cGVkZWYgdm9pZCAoKlNVU1BFTkRfUkVTVU1FX0xJTktfQ0FMTEJBQ0spKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgQ0RGX1NUQVRVUyBzdGF0dXMsCisJCQkJCSAgICAgdWludDMyX3QgKmRhdGEpOworCisvKiBMSU0gdG8gSEFMIFNDQU4gTWFuYWdlbWVudCBNZXNzYWdlIEludGVyZmFjZSBzdGF0ZXMgKi8KK3R5cGVkZWYgZW51bSBlTGltSGFsU2NhblN0YXRlIHsKKwllTElNX0hBTF9JRExFX1NDQU5fU1RBVEUsCisJZUxJTV9IQUxfSU5JVF9TQ0FOX1dBSVRfU1RBVEUsCisJZUxJTV9IQUxfU1RBUlRfU0NBTl9XQUlUX1NUQVRFLAorCWVMSU1fSEFMX0VORF9TQ0FOX1dBSVRfU1RBVEUsCisJZUxJTV9IQUxfRklOSVNIX1NDQU5fV0FJVF9TVEFURSwKKwllTElNX0hBTF9JTklUX0xFQVJOX1dBSVRfU1RBVEUsCisJZUxJTV9IQUxfU1RBUlRfTEVBUk5fV0FJVF9TVEFURSwKKwllTElNX0hBTF9FTkRfTEVBUk5fV0FJVF9TVEFURSwKKwllTElNX0hBTF9GSU5JU0hfTEVBUk5fV0FJVF9TVEFURSwKKwllTElNX0hBTF9TQ0FOTklOR19TVEFURSwKKy8qIFdMQU5fU1VTUEVORF9MSU5LIFJlbGF0ZWQgKi8KKwllTElNX0hBTF9TVVNQRU5EX0xJTktfV0FJVF9TVEFURSwKKwllTElNX0hBTF9TVVNQRU5EX0xJTktfU1RBVEUsCisJZUxJTV9IQUxfUkVTVU1FX0xJTktfV0FJVF9TVEFURSwKKy8qIGVuZCBXTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkICovCit9IHRMaW1MaW1IYWxTY2FuU3RhdGU7CisKKy8qIE1MTSBSZXEvQ25mIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbUF1dGhSZXEgeworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXRBbmlBdXRoVHlwZSBhdXRoVHlwZTsKKwl1aW50MzJfdCBhdXRoRmFpbHVyZVRpbWVvdXQ7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRMaW1NbG1BdXRoUmVxLCAqdHBMaW1NbG1BdXRoUmVxOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtSm9pblJlcSB7CisJdWludDMyX3Qgam9pbkZhaWx1cmVUaW1lb3V0OworCXRTaXJNYWNSYXRlU2V0IG9wZXJhdGlvbmFsUmF0ZVNldDsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl0U2lyQnNzRGVzY3JpcHRpb24gYnNzRGVzY3JpcHRpb247Cit9IHRMaW1NbG1Kb2luUmVxLCAqdHBMaW1NbG1Kb2luUmVxOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtU2NhblJlcSB7CisJdFNpckJzc1R5cGUgYnNzVHlwZTsKKwl0U2lyTWFjQWRkciBic3NJZDsKKwl0U2lyTWFjU1NpZCBzc0lkW1NJUl9TQ0FOX01BWF9OVU1fU1NJRF07CisJdFNpclNjYW5UeXBlIHNjYW5UeXBlOworCXVpbnQzMl90IG1pbkNoYW5uZWxUaW1lOworCXVpbnQzMl90IG1heENoYW5uZWxUaW1lOworCXVpbnQzMl90IGRvdDExbW9kZTsKKwkvKiBOdW1iZXIgb2YgU1NJRHMgdG8gc2NhbihzZW5kIFByb2JlIHJlcXVlc3QpICovCisJdWludDhfdCBudW1Tc2lkOworCisJYm9vbCBwMnBTZWFyY2g7CisJdWludDE2X3QgdUlFRmllbGRMZW47CisJdWludDE2X3QgdUlFRmllbGRPZmZzZXQ7CisKKwl1aW50OF90IHNlc3Npb25JZDsKKwkvKiBjaGFubmVsTGlzdCBNVVNUIGJlIHRoZSBsYXN0IGZpZWxkIG9mIHRoaXMgc3RydWN0dXJlICovCisJdFNpckNoYW5uZWxMaXN0IGNoYW5uZWxMaXN0OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICB0TGltTWxtU2NhblJlcS4uLi4KKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIHVJRUZpbGVkTGVuCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICB1SUVGaWxlZE9mZnNldCAgICAgICAgICAgICAgIC0tLS0rCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgfAorCSAgIGNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzICAgICAgICAgIHwKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICB8CisJICAgLi4uIHZhcmlhYmxlIHNpemUgdXAgdG8gICAgICAgICAgfAorCSAgIGNoYW5uZWxOdW1iZXJbbnVtQ2hhbm5lbHMtMV0gICAgIHwKKwkgICBUaGlzIGNhbiBiZSB6ZXJvLCBpZiAgICAgICAgICAgICB8CisJICAgbnVtQ2hhbm5lbCBpcyB6ZXJvLiAgICAgICAgICAgICAgfAorCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwtLSsKKwkgICAuLi4gdmFyaWFibGUgc2l6ZSB1SUVGaWxlZAorCSAgIHVwIHRvIHVJRUZpZWxkTGVuIChjYW4gYmUgMCkKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9IHRMaW1NbG1TY2FuUmVxLCAqdHBMaW1NbG1TY2FuUmVxOworCit0eXBlZGVmIHN0cnVjdCB0TGltU2NhblJlc3VsdE5vZGUgdExpbVNjYW5SZXN1bHROb2RlOworc3RydWN0IHRMaW1TY2FuUmVzdWx0Tm9kZSB7CisJdExpbVNjYW5SZXN1bHROb2RlICpuZXh0OworCXRTaXJCc3NEZXNjcmlwdGlvbiBic3NEZXNjcmlwdGlvbjsKK307CisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKworI2lmbmRlZiBPRU1fREFUQV9SRVFfU0laRQorI2RlZmluZSBPRU1fREFUQV9SRVFfU0laRSAyODAKKyNlbmRpZgorI2lmbmRlZiBPRU1fREFUQV9SU1BfU0laRQorI2RlZmluZSBPRU1fREFUQV9SU1BfU0laRSAxNzI0CisjZW5kaWYKKworLyogT0VNIERhdGEgcmVsYXRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1PZW1EYXRhUmVxIHsKKwl0U2lyTWFjQWRkciBzZWxmTWFjQWRkcjsKKwl1aW50OF90IG9lbURhdGFSZXFbT0VNX0RBVEFfUkVRX1NJWkVdOworfSB0TGltTWxtT2VtRGF0YVJlcSwgKnRwTGltTWxtT2VtRGF0YVJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbU9lbURhdGFSc3AgeworCXVpbnQ4X3Qgb2VtRGF0YVJzcFtPRU1fREFUQV9SU1BfU0laRV07Cit9IHRMaW1NbG1PZW1EYXRhUnNwLCAqdHBMaW1NbG1PZW1EYXRhUnNwOworI2VuZGlmCisKKy8qIFByZS1hdXRoZW50aWNhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgdExpbVByZUF1dGhOb2RlIHsKKwlzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICpuZXh0OworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXRBbmlBdXRoVHlwZSBhdXRoVHlwZTsKKwl0TGltTWxtU3RhdGVzIG1sbVN0YXRlOworCXVpbnQ4X3QgYXV0aE5vZGVJZHg7CisJdWludDhfdCBjaGFsbGVuZ2VUZXh0W1NJUl9NQUNfQVVUSF9DSEFMTEVOR0VfTEVOR1RIXTsKKwl1aW50OF90IGZUaW1lclN0YXJ0ZWQ6MTsKKwl1aW50OF90IGZTZWVuOjE7CisJdWludDhfdCBmRnJlZToxOworCXVpbnQ4X3QgcnN2ZDo1OworCVRYX1RJTUVSIHRpbWVyOworCXVpbnQxNl90IHNlcV9udW07CisJdl9USU1FX3QgdGltZXN0YW1wOworfSB0TGltUHJlQXV0aE5vZGUsICp0cExpbVByZUF1dGhOb2RlOworCisvKiBQcmUtYXV0aGVudGljYXRpb24gdGFibGUgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgdExpbVByZUF1dGhUYWJsZSB7CisJdWludDMyX3QgbnVtRW50cnk7CisJdHBMaW1QcmVBdXRoTm9kZSBwVGFibGU7Cit9IHRMaW1QcmVBdXRoVGFibGUsICp0cExpbVByZUF1dGhUYWJsZTsKKworLyogLyBQZXIgU1RBIGNvbnRleHQgc3RydWN0dXJlIGRlZmluaXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1TdGFDb250ZXh0IHsKKwl0TGltTWxtU3RhdGVzIG1sbVN0YXRlOworCXRBbmlBdXRoVHlwZSBhdXRoVHlwZTsKKwl1aW50MTZfdCBsaXN0ZW5JbnRlcnZhbDsKKwl0U2lyTWFjQ2FwYWJpbGl0eUluZm8gY2FwYWJpbGl0eUluZm87CisJdFNpck1hY1Byb3BSYXRlU2V0IHByb3BSYXRlU2V0OworCXRTaXJNYWNSZWFzb25Db2RlcyBkaXNhc3NvY1JlYXNvbjsKKwl1aW50MTZfdCBjbGVhbnVwVHJpZ2dlcjsKKworCXRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlOworCXVpbnQxNl90IHByb3RTdGF0dXNDb2RlOworCisJdWludDhfdCBzdWJUeXBlOjE7ICAgICAgLyogSW5kaWNhdGVzIEFTU09DICgwKSBvciBSRUFTU09DICgxKSAqLworCXVpbnQ4X3QgdXBkYXRlQ29udGV4dDoxOworCXVpbnQ4X3Qgc2NoQ2xlYW46MTsKKwkvKiA4MDIuMTFuIEhUIENhcGFiaWxpdHkgaW4gU3RhdGlvbjogRW5hYmxlZCAxIG9yIERJc2FibGVkIDAgKi8KKwl1aW50OF90IGh0Q2FwYWJpbGl0eToxOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJdWludDhfdCB2aHRDYXBhYmlsaXR5OjE7CisjZW5kaWYKK30gdExpbU1sbVN0YUNvbnRleHQsICp0cExpbU1sbVN0YUNvbnRleHQ7CisKKy8qIFN0cnVjdHVyZSBkZWZpbml0aW9uIHRvIGhvbGQgZGVmZXJyZWQgbWVzc2FnZXMgcXVldWUgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0xpbURlZmVycmVkTXNnUVBhcmFtcyB7CisJdFNpck1zZ1EgZGVmZXJyZWRRdWV1ZVtNQVhfREVGRVJSRURfUVVFVUVfTEVOXTsKKwl1aW50MTZfdCBzaXplOworCXVpbnQxNl90IHJlYWQ7CisJdWludDE2X3Qgd3JpdGU7Cit9IHRMaW1EZWZlcnJlZE1zZ1FQYXJhbXMsICp0cExpbURlZmVycmVkTXNnUVBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0NmZ1Byb3RlY3Rpb24geworCXVpbnQzMl90IG92ZXJsYXBGcm9tbGxhOjE7CisJdWludDMyX3Qgb3ZlcmxhcEZyb21sbGI6MTsKKwl1aW50MzJfdCBvdmVybGFwRnJvbWxsZzoxOworCXVpbnQzMl90IG92ZXJsYXBIdDIwOjE7CisJdWludDMyX3Qgb3ZlcmxhcE5vbkdmOjE7CisJdWludDMyX3Qgb3ZlcmxhcExzaWdUeG9wOjE7CisJdWludDMyX3Qgb3ZlcmxhcFJpZnM6MTsKKwl1aW50MzJfdCBvdmVybGFwT0JTUzoxOyAvKiBhZGRlZCBmb3Igb2JzcyAqLworCXVpbnQzMl90IGZyb21sbGE6MTsKKwl1aW50MzJfdCBmcm9tbGxiOjE7CisJdWludDMyX3QgZnJvbWxsZzoxOworCXVpbnQzMl90IGh0MjA6MTsKKwl1aW50MzJfdCBub25HZjoxOworCXVpbnQzMl90IGxzaWdUeG9wOjE7CisJdWludDMyX3QgcmlmczoxOworCXVpbnQzMl90IG9ic3M6MTsgICAgICAgIC8qIGFkZGVkIGZvciBPYnNzICovCit9IHRDZmdQcm90ZWN0aW9uLCAqdHBDZmdQcm90ZWN0aW9uOworCit0eXBlZGVmIGVudW0gZUxpbVByb3RTdGFDYWNoZVR5cGUgeworCWVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9JTlZBTElELAorCWVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9sbEIsCisJZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX2xsRywKKwllTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfSFQyMAorfSB0TGltUHJvdFN0YUNhY2hlVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0NhY2hlUGFyYW1zIHsKKwl1aW50OF90IGFjdGl2ZTsKKwl0U2lyTWFjQWRkciBhZGRyOworCXRMaW1Qcm90U3RhQ2FjaGVUeXBlIHByb3RTdGFDYWNoZVR5cGU7CisKK30gdENhY2hlUGFyYW1zLCAqdHBDYWNoZVBhcmFtczsKKworI2RlZmluZSBMSU1fUFJPVF9TVEFfT1ZFUkxBUF9DQUNIRV9TSVpFICAgIEhBTF9OVU1fQVNTT0NfU1RBCisjZGVmaW5lIExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFICAgICAgICAgICAgSEFMX05VTV9BU1NPQ19TVEEKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbVByb3RTdGFQYXJhbXMgeworCXVpbnQ4X3QgbnVtU3RhOworCXVpbnQ4X3QgcHJvdGVjdGlvbkVuYWJsZWQ7Cit9IHRMaW1Qcm90U3RhUGFyYW1zLCAqdHBMaW1Qcm90U3RhUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCBzTGltTm9TaG9ydFBhcmFtcyB7CisJdWludDhfdCBudW1Ob25TaG9ydFByZWFtYmxlU3RhOworCXRDYWNoZVBhcmFtcyBzdGFOb1Nob3J0Q2FjaGVbTElNX1BST1RfU1RBX0NBQ0hFX1NJWkVdOworfSB0TGltTm9TaG9ydFBhcmFtcywgKnRwTGltTm9TaG9ydFBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU5vU2hvcnRTbG90UGFyYW1zIHsKKwl1aW50OF90IG51bU5vblNob3J0U2xvdFN0YTsKKwl0Q2FjaGVQYXJhbXMgc3RhTm9TaG9ydFNsb3RDYWNoZVtMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRV07Cit9IHRMaW1Ob1Nob3J0U2xvdFBhcmFtcywgKnRwTGltTm9TaG9ydFNsb3RQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHRMaW1JYnNzUGVlck5vZGUgdExpbUlic3NQZWVyTm9kZTsKK3N0cnVjdCB0TGltSWJzc1BlZXJOb2RlIHsKKwl0TGltSWJzc1BlZXJOb2RlICpuZXh0OworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXVpbnQ4X3QgZXh0ZW5kZWRSYXRlc1ByZXNlbnQ6MTsKKwl1aW50OF90IGVkY2FQcmVzZW50OjE7CisJdWludDhfdCB3bWVFZGNhUHJlc2VudDoxOworCXVpbnQ4X3Qgd21lSW5mb1ByZXNlbnQ6MTsKKwl1aW50OF90IGh0Q2FwYWJsZToxOworCXVpbnQ4X3Qgdmh0Q2FwYWJsZToxOworCXVpbnQ4X3QgcnN2ZDoyOworCXVpbnQ4X3QgaHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworCXRTaXJNYWNDYXBhYmlsaXR5SW5mbyBjYXBhYmlsaXR5SW5mbzsKKwl0U2lyTWFjUmF0ZVNldCBzdXBwb3J0ZWRSYXRlczsKKwl0U2lyTWFjUmF0ZVNldCBleHRlbmRlZFJhdGVzOworCXVpbnQ4X3Qgc3VwcG9ydGVkTUNTU2V0W1NJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVRdOworCXRTaXJNYWNFZGNhUGFyYW1TZXRJRSBlZGNhUGFyYW1zOworCXVpbnQ4X3QgZXJwSWVQcmVzZW50OworCisJLyogSFQgQ2FwYWJpbGl0aWVzIG9mIElCU1MgUGVlciAqLworCXVpbnQ4X3QgaHRHcmVlbmZpZWxkOworCXVpbnQ4X3QgaHRTaG9ydEdJNDBNaHo7CisJdWludDhfdCBodFNob3J0R0kyME1oejsKKworCS8qIERTU1MvQ0NLIGF0IDQwIE1IejogRW5hYmxlZCAxIG9yIERpc2FibGVkICovCisJdWludDhfdCBodERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0OworCisJLyogTUlNTyBQb3dlciBTYXZlICovCisJdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIGh0TUlNT1BTU3RhdGU7CisKKwkvKiAqLworCS8qIEEtTVBEVSBEZW5zaXR5ICovCisJLyogMDAwIC0gTm8gcmVzdHJpY3Rpb24gKi8KKwkvKiAwMDEgLSAxLzggdXNlYyAqLworCS8qIDAxMCAtIDEvNCB1c2VjICovCisJLyogMDExIC0gMS8yIHVzZWMgKi8KKwkvKiAxMDAgLSAxIHVzZWMgKi8KKwkvKiAxMDEgLSAyIHVzZWMgKi8KKwkvKiAxMTAgLSA0IHVzZWMgKi8KKwkvKiAxMTEgLSA4IHVzZWMgKi8KKwkvKiAqLworCXVpbnQ4X3QgaHRBTXBkdURlbnNpdHk7CisKKwkvKiBNYXhpbXVtIFJ4IEEtTVBEVSBmYWN0b3IgKi8KKwl1aW50OF90IGh0TWF4UnhBTXBkdUZhY3RvcjsKKworCS8qIFNldCB0byAwIGZvciAzODM5IG9jdGV0cyAqLworCS8qIFNldCB0byAxIGZvciA3OTM1IG9jdGV0cyAqLworCXVpbnQ4X3QgaHRNYXhBbXNkdUxlbmd0aDsKKworCS8qICovCisJLyogUmVjb21tZW5kZWQgVHggV2lkdGggU2V0ICovCisJLyogMCAtIHVzZSAyMCBNSHogY2hhbm5lbCAoY29udHJvbCBjaGFubmVsKSAqLworCS8qIDEgLSB1c2UgNDAgTWh6IGNoYW5uZWwgKi8KKwkvKiAqLworCXVpbnQ4X3QgaHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisKKwl1aW50OF90IGh0TGRwY0NhcGFibGU7CisKKwl1aW50OF90IGJlYWNvbkhCQ291bnQ7CisJdWludDhfdCBoZWFydGJlYXRGYWlsdXJlOworCisJdWludDhfdCAqYmVhY29uOyAgICAgICAgLyogSG9sZCBiZWFjb24gdG8gYmUgc2VudCB0byBIREQvQ1NSICovCisJdWludDE2X3QgYmVhY29uTGVuOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwl0RG90MTFmSUVWSFRDYXBzIFZIVENhcHM7CisJdWludDhfdCB2aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJdWludDhfdCB2aHRCZWFtRm9ybWVyQ2FwYWJsZTsKKyNlbmRpZgorCS8qCisJICogUGVlciBBdGltIEluZm8KKwkgKi8KKwl1aW50OF90IGF0aW1JZVByZXNlbnQ7CisJdWludDMyX3QgcGVlckF0aW1XaW5kb3dMZW5ndGg7Cit9OworCisvKiBFbnVtcyB1c2VkIGZvciBjaGFubmVsIHN3aXRjaGluZy4gKi8KK3R5cGVkZWYgZW51bSBlTGltQ2hhbm5lbFN3aXRjaFN0YXRlIHsKKwllTElNX0NIQU5ORUxfU1dJVENIX0lETEUsCisJZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX09OTFksCisJZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX0FORF9TRUNPTkRBUlkKK30gdExpbUNoYW5uZWxTd2l0Y2hTdGF0ZTsKKworLyogQ2hhbm5lbCBTd2l0Y2ggSW5mbyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0xpbUNoYW5uZWxTd2l0Y2hJbmZvIHsKKwl0TGltQ2hhbm5lbFN3aXRjaFN0YXRlIHN0YXRlOworCXVpbnQ4X3QgcHJpbWFyeUNoYW5uZWw7CisJdWludDhfdCBjaF9jZW50ZXJfZnJlcV9zZWcwOworCXVpbnQ4X3QgY2hfY2VudGVyX2ZyZXFfc2VnMTsKKwlwaHlfY2hfd2lkdGggY2hfd2lkdGg7CisJaW50OF90IHN3aXRjaENvdW50OworCXVpbnQzMl90IHN3aXRjaFRpbWVvdXRWYWx1ZTsKKwl1aW50OF90IHN3aXRjaE1vZGU7Cit9IHRMaW1DaGFubmVsU3dpdGNoSW5mbywgKnRwTGltQ2hhbm5lbFN3aXRjaEluZm87CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU9wZXJhdGluZ01vZGVJbmZvIHsKKwl1aW50OF90IHByZXNlbnQ7CisJdWludDhfdCBjaGFuV2lkdGg6MjsKKwl1aW50OF90IHJlc2VydmVkOjI7CisJdWludDhfdCByeE5TUzozOworCXVpbnQ4X3QgcnhOU1NUeXBlOjE7Cit9IHRMaW1PcGVyYXRpbmdNb2RlSW5mbywgKnRwTGltT3BlcmF0aW5nTW9kZUluZm87CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbVdpZGVyQldDaGFubmVsU3dpdGNoIHsKKwl1aW50OF90IG5ld0NoYW5XaWR0aDsKKwl1aW50OF90IG5ld0NlbnRlckNoYW5GcmVxMDsKKwl1aW50OF90IG5ld0NlbnRlckNoYW5GcmVxMTsKK30gdExpbVdpZGVyQldDaGFubmVsU3dpdGNoSW5mbywgKnRwTGltV2lkZXJCV0NoYW5uZWxTd2l0Y2hJbmZvOworCisvKiBFbnVtcyB1c2VkIHdoZW4gc3RvcHBpbmcgdGhlIFR4LiAqLwordHlwZWRlZiBlbnVtIGVMaW1RdWlldFR4TW9kZSB7CisJLyogU3RvcC9yZXN1bWUgdHJhbnNtaXNzaW9uIG9mIGFsbCBzdGF0aW9ucyxVc2VzIHRoZSBnbG9iYWwgZmxhZyAqLworCWVMSU1fVFhfQUxMID0gMCwKKwkvKgorCSAqIFN0b3BzL3Jlc3VtZXMgdGhlIHRyYW5zbWlzc2lvbiBvZiBzcGVjaWZpYyBzdGF0aW9ucyBpZGVudGlmaWVkCisJICogYnkgc3RhSWQuCisJICovCisJZUxJTV9UWF9TVEEsCisJLyogU3RvcHMvcmVzdW1lcyB0aGUgdHJhbnNtaXNzaW9uIG9mIGFsbCB0aGUgcGFja2V0cyBpbiBCU1MgKi8KKwllTElNX1RYX0JTUywKKwkvKgorCSAqIFN0b3BzL3Jlc3VtZXMgdGhlIHRyYW5zbWlzc2lvbiBvZiBhbGwgcGFja2V0cyBleGNlcHQgYmVhY29ucyBpbiBCU1MKKwkgKiBUaGlzIGlzIHVzZWQgd2hlbiByYWRhciBpcyBkZXRlY3RlZCBpbiB0aGUgY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbC4KKwkgKiBCZWFjb24gaGFzIHRvIGJlIHNlbnQgdG8gbm90aWZ5IHRoZSBzdGF0aW9ucyBhc3NvY2lhdGVkIGFib3V0IHRoZQorCSAqIHNjaGVkdWxlZCBjaGFubmVsIHN3aXRjaAorCSAqLworCWVMSU1fVFhfQlNTX0JVVF9CRUFDT04KK30gdExpbVF1aWV0VHhNb2RlOworCit0eXBlZGVmIGVudW0gZUxpbUNvbnRyb2xUeCB7CisJZUxJTV9SRVNVTUVfVFggPSAwLAorCWVMSU1fU1RPUF9UWAorfSB0TGltQ29udHJvbFR4OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIHN0cnVjdCBzTGltVHNwZWNJbmZvIHsKKwkvKiAwPT1mcmVlLCBlbHNlIHVzZWQgKi8KKwl1aW50OF90IGludXNlOworCS8qIGluZGV4IGluIGxpc3QgKi8KKwl1aW50OF90IGlkeDsKKwl0U2lyTWFjQWRkciBzdGFBZGRyOworCXVpbnQxNl90IGFzc29jSWQ7CisJdFNpck1hY1RzcGVjSUUgdHNwZWM7CisJLyogbnVtYmVyIG9mIFRjbGFzIGVsZW1lbnRzICovCisJdWludDhfdCBudW1UY2xhczsKKwl0U2lyVGNsYXNJbmZvIHRjbGFzSW5mb1tTSVJfTUFDX1RDTEFTSUVfTUFYTlVNXTsKKwl1aW50OF90IHRjbGFzUHJvYzsKKwkvKiB0Y2xhc3NQcm9jIGlzIHZhbGlkIG9ubHkgaWYgdGhpcyBpcyBzZXQgdG8gMS4gKi8KKwl1aW50OF90IHRjbGFzUHJvY1ByZXNlbnQ6MTsKK30gY2RmX3BhY2tlZCB0TGltVHNwZWNJbmZvLCAqdHBMaW1Uc3BlY0luZm87CisKK3R5cGVkZWYgc3RydWN0IHNMaW1BZG1pdFBvbGljeUluZm8geworCS8qIGFkbWl0IGNvbnRyb2wgcG9saWN5IHR5cGUgKi8KKwl1aW50OF90IHR5cGU7CisJLyogb3ZlcnN1YnNjcmlwdGlvbiBmYWN0b3IgOiAwIG1lYW5zIG5vdGhpbmcgaXMgYWxsb3dlZCAqLworCXVpbnQ4X3QgYndfZmFjdG9yOworCS8qIHZhbGlkIG9ubHkgd2hlbiAndHlwZScgaXMgc2V0IEJXX0ZBQ1RPUiAqLworfSB0TGltQWRtaXRQb2xpY3lJbmZvLCAqdHBMaW1BZG1pdFBvbGljeUluZm87CisKK3R5cGVkZWYgZW51bSBlTGltV3NjRW5yb2xsU3RhdGUgeworCWVMSU1fV1NDX0VOUk9MTF9OT09QLAorCWVMSU1fV1NDX0VOUk9MTF9CRUdJTiwKKwllTElNX1dTQ19FTlJPTExfSU5fUFJPR1JFU1MsCisJZUxJTV9XU0NfRU5ST0xMX0VORAorfSB0TGltV3NjRW5yb2xsU3RhdGU7CisKKyNkZWZpbmUgV1NDX1BBU1NXRF9JRF9QVVNIX0JVVFRPTiAgICAgICAgICgweDAwMDQpCisKK3R5cGVkZWYgc3RydWN0IHNMaW1Xc2NJZUluZm8geworCWJvb2wgYXBTZXR1cExvY2tlZDsKKwlib29sIHNlbGVjdGVkUmVnaXN0cmFyOworCXVpbnQxNl90IHNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczsKKwl0TGltV3NjRW5yb2xsU3RhdGUgd3NjRW5yb2xsbWVudFN0YXRlOworCXRMaW1Xc2NFbnJvbGxTdGF0ZSBwcm9iZVJlc3BXc2NFbnJvbGxtZW50U3RhdGU7CisJdWludDhfdCByZXFUeXBlOworCXVpbnQ4X3QgcmVzcFR5cGU7Cit9IHRMaW1Xc2NJZUluZm8sICp0cExpbVdzY0llSW5mbzsKKworLyogbWF4aW11bSBudW1iZXIgb2YgdHNwZWMncyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgTElNX05VTV9UU1BFQ19NQVggICAgICAxNQorCisvKiBzdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgMTFoIHNwZWNpZmljIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IHNMaW1TcGVjTWdtdEluZm8geworCXRMaW1RdWlldFN0YXRlcyBxdWlldFN0YXRlOworCXVpbnQzMl90IHF1aWV0Q291bnQ7CisJLyogVGhpcyBpcyBpbiB1bml0cyBvZiBzeXN0ZW0gVElDS1MgKi8KKwl1aW50MzJfdCBxdWlldER1cmF0aW9uOworCS8qIFRoaXMgaXMgaW4gdW5pdHMgb2YgVFUsIGZvciBvdmVyIHRoZSBhaXIgdHJhbnNtaXNzaW9uICovCisJdWludDMyX3QgcXVpZXREdXJhdGlvbl9UVTsKKwkvKiBBZnRlciB0aGlzIHRpbWVvdXQsIGFjdHVhbCBxdWlldCBzdGFydHMgKi8KKwl1aW50MzJfdCBxdWlldFRpbWVvdXRWYWx1ZTsKKwkvKiBVc2VkIG9uIEFQLCBpZiBxdWlldCBpcyBlbmFibGVkIGR1cmluZyBsZWFybmluZyAqLworCWJvb2wgZlF1aWV0RW5hYmxlZDsKKwl0TGltRG90MTFoQ2hhblN3U3RhdGVzIGRvdDExaENoYW5Td1N0YXRlOworCS8qIFJhZGFyIGRldGVjdGVkIGluIGN1ciBvcGVyIGNoYW4gb24gQVAgKi8KKwlib29sIGZSYWRhckRldEN1ck9wZXJDaGFuOworCS8qIFdoZXRoZXIgcmFkYXIgaW50ZXJydXB0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgKi8KKwlib29sIGZSYWRhckludHJDb25maWd1cmVkOworfSB0TGltU3BlY01nbXRJbmZvLCAqdHBMaW1TcGVjTWdtdEluZm87CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworLyoKKyAqIFBlZXIgaW5mbyBuZWVkZWQgZm9yIFRETFMgc2V0dXAuLgorICovCit0eXBlZGVmIHN0cnVjdCB0TGltVERMU1BlZXJTdGEgeworCXN0cnVjdCB0TGltVERMU1BlZXJTdGEgKm5leHQ7CisJdWludDhfdCBkaWFsb2c7CisJdFNpck1hY0FkZHIgcGVlck1hYzsKKwl0U2lyTWFjQ2FwYWJpbGl0eUluZm8gY2FwYWJpbGl0eUluZm87CisJdFNpck1hY1JhdGVTZXQgc3VwcG9ydGVkUmF0ZXM7CisJdFNpck1hY1JhdGVTZXQgZXh0ZW5kZWRSYXRlczsKKwl0U2lyTWFjUW9zQ2FwYWJpbGl0eVN0YUlFIHFvc0NhcHM7CisJdFNpck1hY0VkY2FQYXJhbVNldElFIGVkY2FQYXJhbXM7CisJdWludDhfdCBtY3NTZXRbU0laRV9PRl9TVVBQT1JURURfTUNTX1NFVF07CisJdWludDhfdCB0ZGxzX2JJc1Jlc3BvbmRlcjsKKwkvKiBIVCBDYXBhYmlsdGllcyAqLworCXREb3QxMWZJRUhUQ2FwcyB0ZGxzUGVlckhUQ2FwczsKKwl0RG90MTFmSUVFeHRDYXAgdGRsc1BlZXJFeHRDYXBzOworCXVpbnQ4X3QgdGRsc19mbGFnczsKKwl1aW50OF90IHRkbHNfbGlua19zdGF0ZTsKKwl1aW50OF90IHRkbHNfcHJldl9saW5rX3N0YXRlOworCXVpbnQ4X3QgdGRsc19zZXNzaW9uSWQ7CisJdWludDhfdCBFeHRSYXRlc1ByZXNlbnQ7CisJVFhfVElNRVIgZ0xpbVRkbHNMaW5rU2V0dXBSc3BUaW1lb3V0VGltZXI7CisJVFhfVElNRVIgZ0xpbVRkbHNMaW5rU2V0dXBDbmZUaW1lb3V0VGltZXI7Cit9IHRMaW1UZGxzTGlua1NldHVwUGVlciwgKnRwTGltVGRsc0xpbmtTZXR1cFBlZXI7CisKK3R5cGVkZWYgc3RydWN0IHRMaW1UZGxzTGlua1NldHVwSW5mbyB7CisJdExpbVRkbHNMaW5rU2V0dXBQZWVyICp0ZGxzTGlua1NldHVwTGlzdDsKKwl1aW50OF90IG51bV90ZGxzX3BlZXJzOworCXVpbnQ4X3QgdGRsc19mbGFnczsKKwl1aW50OF90IHRkbHNfc3RhdGU7CisJdWludDhfdCB0ZGxzX3ByZXZfc3RhdGU7Cit9IHRMaW1UZGxzTGlua1NldHVwSW5mbywgKnRwTGltVGRsc0xpbmtTZXR1cEluZm87CisKK3R5cGVkZWYgZW51bSB0ZGxzTGlua01vZGUgeworCVRETFNfTElOS19NT0RFX0JHLAorCVRETFNfTElOS19NT0RFX04sCisJVERMU19MSU5LX01PREVfQUMsCisJVERMU19MSU5LX01PREVfTk9ORQorfSBlTGltVGRsc0xpbmtNb2RlOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9URExTICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvbGltX3Nlc3Npb24uaCBiL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL2xpbV9zZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyN2ZhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL2xpbV9zZXNzaW9uLmgKQEAgLTAsMCArMSw2MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChfX0xJTV9TRVNTSU9OX0gpCisjZGVmaW5lIF9fTElNX1NFU1NJT05fSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICBsaW1fc2Vzc2lvbi5oCisKKyAgIFxicmllZiBwcm90b3R5cGUgZm9yIGxpbSBTZXNzaW9uIHJlbGF0ZWQgQVBJcworCisgICBcYXV0aG9yIFN1bml0IEJoYXRpYQorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBQb3dlcnNhdmUgT2ZmbG9hZCBJbXBsZW1lbnRhdGlvbiAqLwordHlwZWRlZiBlbnVtIGVQb3dlcnNhdmVTdGF0ZSB7CisJUE1NX0ZVTExfUE9XRVIsCisJUE1NX1BPV0VSX1NBVkUKK30gdFBvd2Vyc2F2ZVN0YXRlOworCisvKiBNYXN0ZXIgU3RydWN0dXJlOiBUaGlzIHdpbGwgYmUgcGFydCBvZiBQRSBTZXNzaW9uIEVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBzUG93ZXJzYXZlb2ZmbG9hZEluZm8geworCXRQb3dlcnNhdmVTdGF0ZSBwc3N0YXRlOworCXVpbnQ4X3QgYmNubWlzczsKK30gdFBvd2Vyc2F2ZW9mZmxvYWRJbmZvLCB0cFBvd2Vyc2F2ZW9mZmxvYWRJbmZvOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVwordHlwZWRlZiBzdHJ1Y3QgdGFnQ29tZWJhY2tUaW1lckluZm8geworCXRwQW5pU2lyR2xvYmFsIHBNYWM7CisJdWludDhfdCBzZXNzaW9uSUQ7CisJdExpbU1sbVN0YXRlcyBsaW1QcmV2TWxtU3RhdGU7ICAvKiBQcmV2aW91cyBNTE0gU3RhdGUgKi8KKwl0TGltU21lU3RhdGVzIGxpbU1sbVN0YXRlOyAgICAgIC8qIE1MTSBTdGF0ZSAqLworfSB0Q29tZWJhY2tUaW1lckluZm87CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExVyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBGaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIE5VTV9XRVBfS0VZUyA0CisKKy8qIE1heGltdW0gYWxsb3dhYmxlIHNpemUgb2YgYSBiZWFjb24gZnJhbWUgKi8KKyNkZWZpbmUgU0NIX01BWF9CRUFDT05fU0laRSAgICA1MTIKKworI2RlZmluZSBTQ0hfTUFYX1BST0JFX1JFU1BfU0laRSA1MTIKKyNkZWZpbmUgU0NIX1BST1RFQ1RJT05fUkVTRVRfVElNRSA0MDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFR5cGUgZGVjbGFyYXRpb25zCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgeworCXRTaXJNYWNCZWFjb25JbnRlcnZhbCBiZWFjb25JbnRlcnZhbDsKKwl1aW50OF90IGZTaG9ydFByZWFtYmxlOworCXVpbnQ4X3QgbGxhQ29leGlzdDsKKwl1aW50OF90IGxsYkNvZXhpc3Q7CisJdWludDhfdCBsbGdDb2V4aXN0OworCXVpbnQ4X3QgaHQyMENvZXhpc3Q7CisJdWludDhfdCBsbG5Ob25HRkNvZXhpc3Q7CisJdWludDhfdCBmUklGU01vZGU7CisJdWludDhfdCBmTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisJdWludDhfdCBnSFRPYnNzTW9kZTsKK30gdEJlYWNvblBhcmFtcywgKnRwQmVhY29uUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCBzUEVTZXNzaW9uICAgICAgIC8qIEFkZGVkIHRvIFN1cHBvcnQgQlQtQU1QICovCit7CisJLyogVG8gY2hlY2sgc2Vzc2lvbiB0YWJsZSBpcyBpbiB1c2Ugb3IgZnJlZSAqLworCXVpbnQ4X3QgYXZhaWxhYmxlOworCXVpbnQxNl90IHBlU2Vzc2lvbklkOworCXVpbnQ4X3Qgc21lU2Vzc2lvbklkOworCXVpbnQxNl90IHRyYW5zYWN0aW9uSWQ7CisKKwkvKiBJbiBBUCByb2xlOiBCU1NJRCBhbmQgc2VsZk1hY0FkZHIgd2lsbCBiZSB0aGUgc2FtZS4gKi8KKwkvKiBJbiBTVEEgcm9sZTogdGhleSB3aWxsIGJlIGRpZmZlcmVudCAqLworCXRTaXJNYWNBZGRyIGJzc0lkOworCXRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyOworCXRTaXJNYWNTU2lkIHNzSWQ7CisJdWludDhfdCBic3NJZHg7CisJdWludDhfdCB2YWxpZDsKKwl0TGltTWxtU3RhdGVzIGxpbU1sbVN0YXRlOyAgICAgIC8qIE1MTSBTdGF0ZSAqLworCXRMaW1NbG1TdGF0ZXMgbGltUHJldk1sbVN0YXRlOyAgLyogUHJldmlvdXMgTUxNIFN0YXRlICovCisJdExpbVNtZVN0YXRlcyBsaW1TbWVTdGF0ZTsgICAgICAvKiBTTUUgU3RhdGUgKi8KKwl0TGltU21lU3RhdGVzIGxpbVByZXZTbWVTdGF0ZTsgIC8qIFByZXZpb3VzIFNNRSBTdGF0ZSAqLworCXRMaW1TeXN0ZW1Sb2xlIGxpbVN5c3RlbVJvbGU7CisJdFNpckJzc1R5cGUgYnNzVHlwZTsKKwl1aW50OF90IG9wZXJNb2RlOyAgICAgICAvKiBBUCAtIDA7IFNUQSAtIDEgOyAqLworCXRTaXJOd1R5cGUgbndUeXBlOworCXRwU2lyU21lU3RhcnRCc3NSZXEgcExpbVN0YXJ0QnNzUmVxOyAgICAvKiBoYW5kbGUgdG8gc21lc3RhcnQgYnNzIHJlcSAqLworCXRwU2lyU21lSm9pblJlcSBwTGltSm9pblJlcTsgICAgLyogaGFuZGxlIHRvIHNtZSBqb2luIHJlcSAqLworCXRwU2lyU21lSm9pblJlcSBwTGltUmVBc3NvY1JlcTsgLyogaGFuZGxlIHRvIHNtZSByZWFzc29jIHJlcSAqLworCXRwTGltTWxtSm9pblJlcSBwTGltTWxtSm9pblJlcTsgLyogaGFuZGxlIHRvIE1MTSBqb2luIFJlcSAqLworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCXZvaWQgKnBMaW1NbG1SZWFzc29jUmV0cnlSZXE7ICAgLyoga2VlcCByZWFzb2MgcmVxIGZvciByZXRyeSAqLworI2VuZGlmCisJdm9pZCAqcExpbU1sbVJlYXNzb2NSZXE7ICAgICAgICAvKiBoYW5kbGUgdG8gTUxNIHJlYXNzb2MgUmVxICovCisJdWludDE2X3QgY2hhbm5lbENoYW5nZVJlYXNvbkNvZGU7CisJdWludDhfdCBkb3QxMW1vZGU7CisJdWludDhfdCBodENhcGFiaWxpdHk7CisJLyogU3VwcG9ydGVkIENoYW5uZWwgV2lkdGggU2V0OiAwLTIwTUh6IDEgLSA0ME1IeiAqLworCXVpbnQ4X3QgaHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJLyogUmVjb21tZW5kZWQgVHggV2lkdGggU2V0CisJICogMCAtIHVzZSAyMCBNSHogY2hhbm5lbCAoY29udHJvbCBjaGFubmVsKQorCSAqIDEgLSB1c2UgY2hhbm5lbCB3aWR0aCBlbmFibGVkIHVuZGVyIFN1cHBvcnRlZCBDaGFubmVsIFdpZHRoIFNldAorCSAqLworCXVpbnQ4X3QgaHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisJLyogSWRlbnRpZmllcyB0aGUgNDAgTUh6IGV4dGVuc2lvbiBjaGFubmVsICovCisJZVBoeUNoYW5Cb25kU3RhdGUgaHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworCXRTaXJSRkJhbmQgbGltUkZCYW5kOworCXVpbnQ4X3QgbGltSWJzc0FjdGl2ZTsgIC8qIFRPIFNVUFBPUlQgQ09OQ1VSUkVOQ1kgKi8KKworCS8qIFRoZXNlIGdsb2JhbCB2YXJpYmFsZXMgbW92ZWQgdG8gc2Vzc2lvbiBUYWJsZSB0byBzdXBwb3J0IEJULUFNUCA6IE9jdCA5dGggcmV2aWV3ICovCisJdEFuaUF1dGhUeXBlIGxpbUN1cnJlbnRBdXRoVHlwZTsKKwl1aW50MTZfdCBsaW1DdXJyZW50QnNzQ2FwczsKKwl1aW50OF90IGxpbUN1cnJlbnRCc3NRb3NDYXBzOworCXVpbnQxNl90IGxpbUN1cnJlbnRCc3NQcm9wQ2FwOworCXVpbnQ4X3QgbGltU2VudENhcHNDaGFuZ2VOdGY7CisJdWludDE2X3QgbGltQUlEOworCisJLyogUGFyYW1ldGVycyAgRm9yIFJlYXNzb2NpYXRpb24gKi8KKwl0U2lyTWFjQWRkciBsaW1SZUFzc29jYnNzSWQ7CisJdFNpck1hY0NoYW5OdW0gbGltUmVhc3NvY0NoYW5uZWxJZDsKKwkvKiBDQiBwYXJhbWF0ZXJzIHJlcXVpcmVkL2R1cGxpY2F0ZWQgZm9yIFJlYXNzb2Mgc2luY2UgcmUtYXNzb2MgbWFudGFpbnMgaXRzIG93biBwYXJhbXMgaW4gbGltICovCisJdWludDhfdCByZUFzc29jSHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJdWludDhfdCByZUFzc29jSHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisJZVBoeUNoYW5Cb25kU3RhdGUgcmVBc3NvY0h0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwl0U2lyTWFjU1NpZCBsaW1SZWFzc29jU1NJRDsKKwl1aW50MTZfdCBsaW1SZWFzc29jQnNzQ2FwczsKKwl1aW50OF90IGxpbVJlYXNzb2NCc3NRb3NDYXBzOworCXVpbnQxNl90IGxpbVJlYXNzb2NCc3NQcm9wQ2FwOworCisJLyogQXNzb2Mgb3IgUmVBc3NvYyBSZXNwb25zZSBEYXRhL0ZyYW1lICovCisJdm9pZCAqbGltQXNzb2NSZXNwb25zZURhdGE7CisKKwkvKiogQlNTIFRhYmxlIHBhcmFtZXRlcnMgKiovCisKKwkvKgorCSAqIHN0YUlkOiAgU3RhcnQgQlNTOiB0aGlzIGlzIHRoZSAgU3RhIElkIGZvciB0aGUgQlNTLgorCSAqIEpvaW46IHRoaXMgaXMgdGhlIHNlbGZTdGFJZAorCSAqIEluIGJvdGggY2FzZXMgYWJvdmUsIHRoZSBwZWVyIFNUQSBJRCB3bGwgYmUgc3RvcmVkIGluIGRwaCBoYXNoIHRhYmxlLgorCSAqLworCXVpbnQxNl90IHN0YUlkOworCXVpbnQxNl90IHN0YXR5cGVGb3JCc3M7IC8qIHRvIGtub3cgc2Vzc2lvbiBpcyBmb3IgUEVFUiBvciBTRUxGICovCisJdWludDhfdCBzaG9ydFNsb3RUaW1lU3VwcG9ydGVkOworCXVpbnQ4X3QgZHRpbVBlcmlvZDsKKwl0U2lyTWFjUmF0ZVNldCByYXRlU2V0OworCXRTaXJNYWNSYXRlU2V0IGV4dFJhdGVTZXQ7CisJdFNpck1hY0hUT3BlcmF0aW5nTW9kZSBodE9wZXJNb2RlOworCXVpbnQ4X3QgY3VycmVudE9wZXJDaGFubmVsOworCXVpbnQ4X3QgY3VycmVudFJlcUNoYW5uZWw7CisJdWludDhfdCBMaW1SeGVkQmVhY29uQ250RHVyaW5nSEI7CisKKwkvKiBUaW1lIHN0YW1wIG9mIHRoZSBsYXN0IGJlYWNvbiByZWNlaXZlZCBmcm9tIHRoZSBCU1MgdG8gd2hpY2ggU1RBIGlzIGNvbm5lY3RlZC4gKi8KKwl1aW50NjRfdCBsYXN0QmVhY29uVGltZVN0YW1wOworCS8qIFJYIEJlYWNvbiBjb3VudCBmb3IgdGhlIGN1cnJlbnQgQlNTIHRvIHdoaWNoIFNUQSBpcyBjb25uZWN0ZWQuICovCisJdWludDMyX3QgY3VycmVudEJzc0JlYWNvbkNudDsKKwl1aW50OF90IGxhc3RCZWFjb25EdGltQ291bnQ7CisJdWludDhfdCBsYXN0QmVhY29uRHRpbVBlcmlvZDsKKworCXVpbnQzMl90IGJjbkxlbjsKKwl1aW50OF90ICpiZWFjb247ICAgICAgICAvKiBVc2VkIHRvIHN0b3JlIGxhc3QgYmVhY29uIC8gcHJvYmUgcmVzcG9uc2UgYmVmb3JlIGFzc29jLiAqLworCisJdWludDMyX3QgYXNzb2NSZXFMZW47CisJdWludDhfdCAqYXNzb2NSZXE7ICAgICAgLyogVXNlZCB0byBzdG9yZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lIHNlbnQgb3V0IHdoaWxlIGFzc29jaWF0aW5nLiAqLworCisJdWludDMyX3QgYXNzb2NSc3BMZW47CisJdWludDhfdCAqYXNzb2NSc3A7ICAgICAgLyogVXNlZCB0byBzdG9yZSBhc3NvY2lhdGlvbiByZXNwb25zZSByZWNlaXZlZCB3aGlsZSBhc3NvY2lhdGluZyAqLworCXRBbmlTaXJEcGggZHBoOworCXZvaWQgKipwYXJzZWRBc3NvY1JlcTsgIC8qIFVzZWQgdG8gc3RvcmUgcGFyc2VkIGFzc29jIHJlcSBmcm9tIHZhcmlvdXMgcmVxdWVzdGluZyBzdGF0aW9uICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwl1aW50MzJfdCBSSUNEYXRhTGVuOyAgICAvKiBVc2VkIHRvIHN0b3JlIHRoZSBSaWMgZGF0YSByZWNlaXZlZCBpbiB0aGUgYXNzb2MgcmVzcG9uc2UgKi8KKwl1aW50OF90ICpyaWNEYXRhOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXVpbnQzMl90IHRzcGVjTGVuOyAgICAgIC8qIFVzZWQgdG8gc3RvcmUgdGhlIFRTUEVDIElFcyByZWNlaXZlZCBpbiB0aGUgYXNzb2MgcmVzcG9uc2UgKi8KKwl1aW50OF90ICp0c3BlY0llczsKKyNlbmRpZgorCXVpbnQzMl90IGVuY3J5cHRUeXBlOworCisJYm9vbCBiVGtpcENudHJNZWFzQWN0aXZlOyAgICAgICAvKiBVc2VkIHRvIGtlZXAgcmVjb3JkIG9mIFRLSVAgY291bnRlciBtZWFzdXJlcyBzdGFydC9zdG9wICovCisKKwl1aW50OF90IGdMaW1Qcm90ZWN0aW9uQ29udHJvbDsgIC8qIHVzZWQgZm9yIDExbiBwcm90ZWN0aW9uICovCisKKwl1aW50OF90IGdIVE5vbkdGRGV2aWNlc1ByZXNlbnQ7CisKKwkvKiBwcm90ZWN0aW9uIHJlbGF0ZWQgY29uZmlnIGNhY2hlICovCisJdENmZ1Byb3RlY3Rpb24gY2ZnUHJvdGVjdGlvbjsKKworCS8qIE51bWJlciBvZiBsZWdhY3kgU1RBcyBhc3NvY2lhdGVkICovCisJdExpbVByb3RTdGFQYXJhbXMgZ0xpbTExYlBhcmFtczsKKworCS8qIE51bWJlciBvZiAxMUEgU1RBcyBhc3NvY2lhdGVkICovCisJdExpbVByb3RTdGFQYXJhbXMgZ0xpbTExYVBhcmFtczsKKworCS8qIE51bWJlciBvZiBub24taHQgbm9uLWxlZ2FjeSBTVEFzIGFzc29jaWF0ZWQgKi8KKwl0TGltUHJvdFN0YVBhcmFtcyBnTGltMTFnUGFyYW1zOworCisJLyogTnVtYmVyIG9mIG5vbkdmIFNUQSBhc3NvY2lhdGVkICovCisJdExpbVByb3RTdGFQYXJhbXMgZ0xpbU5vbkdmUGFyYW1zOworCisJLyogTnVtYmVyIG9mIEhUIDIwIFNUQXMgYXNzb2NpYXRlZCAqLworCXRMaW1Qcm90U3RhUGFyYW1zIGdMaW1IdDIwUGFyYW1zOworCisJLyogTnVtYmVyIG9mIExzaWcgVHhvcCBub3Qgc3VwcG9ydGVkIFNUQXMgYXNzb2NpYXRlZCAqLworCXRMaW1Qcm90U3RhUGFyYW1zIGdMaW1Mc2lnVHhvcFBhcmFtczsKKworCS8qIE51bWJlciBvZiBTVEFzIHRoYXQgZG8gbm90IHN1cHBvcnQgc2hvcnQgcHJlYW1ibGUgKi8KKwl0TGltTm9TaG9ydFBhcmFtcyBnTGltTm9TaG9ydFBhcmFtczsKKworCS8qIE51bWJlciBvZiBTVEFzIHRoYXQgZG8gbm90IHN1cHBvcnQgc2hvcnQgc2xvdCB0aW1lICovCisJdExpbU5vU2hvcnRTbG90UGFyYW1zIGdMaW1Ob1Nob3J0U2xvdFBhcmFtczsKKworCS8qIE9MQkMgcGFyYW1ldGVycyAqLworCXRMaW1Qcm90U3RhUGFyYW1zIGdMaW1PbGJjUGFyYW1zOworCisJLyogT0xCQyBwYXJhbWV0ZXJzICovCisJdExpbVByb3RTdGFQYXJhbXMgZ0xpbU92ZXJsYXAxMWdQYXJhbXM7CisKKwl0TGltUHJvdFN0YVBhcmFtcyBnTGltT3ZlcmxhcDExYVBhcmFtczsKKwl0TGltUHJvdFN0YVBhcmFtcyBnTGltT3ZlcmxhcEh0MjBQYXJhbXM7CisJdExpbVByb3RTdGFQYXJhbXMgZ0xpbU92ZXJsYXBOb25HZlBhcmFtczsKKworCS8qIGNhY2hlIGZvciBlYWNoIG92ZXJsYXAgKi8KKwl0Q2FjaGVQYXJhbXMgcHJvdFN0YUNhY2hlW0xJTV9QUk9UX1NUQV9DQUNIRV9TSVpFXTsKKworCXVpbnQ4X3QgcHJpdmFjeTsKKwl0QW5pQXV0aFR5cGUgYXV0aFR5cGU7CisJdFNpcktleU1hdGVyaWFsIFdFUEtleU1hdGVyaWFsW05VTV9XRVBfS0VZU107CisKKwl0RG90MTFmSUVSU04gZ1N0YXJ0QnNzUlNOSWU7CisJdERvdDExZklFV1BBIGdTdGFydEJzc1dQQUllOworCXRTaXJBUFdQU0lFcyBBUFdQU0lFczsKKwl1aW50OF90IGFwVWFwc2RFbmFibGU7CisJdFNpcldQU1BCQ1Nlc3Npb24gKnBBUFdQU1BCQ1Nlc3Npb247CisJdWludDMyX3QgRGVmUHJvYmVSc3BJZUJpdG1hcFs4XTsKKwl1aW50MzJfdCBwcm94eVByb2JlUnNwRW47CisJdERvdDExZlByb2JlUmVzcG9uc2UgcHJvYmVSZXNwRnJhbWU7CisJdWludDhfdCBzc2lkSGlkZGVuOworCWJvb2wgZndkV1BTUEJDUHJvYmVSZXE7CisJdWludDhfdCB3cHNfc3RhdGU7CisKKwl1aW50OF90IGxpbVFvc0VuYWJsZWQ6MTsgICAgICAgIC8qIDExRSAqLworCXVpbnQ4X3QgbGltV21lRW5hYmxlZDoxOyAgICAgICAgLyogV01FICovCisJdWludDhfdCBsaW1Xc21FbmFibGVkOjE7ICAgICAgICAvKiBXU00gKi8KKwl1aW50OF90IGxpbUhjZkVuYWJsZWQ6MTsKKwl1aW50OF90IGxpbTExZEVuYWJsZWQ6MTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJdWludDhfdCBsaW1SbWZFbmFibGVkOjE7ICAgICAgICAvKiAxMVcgKi8KKyNlbmRpZgorCXVpbnQzMl90IGxpbTExaEVuYWJsZTsKKworCXRQb3dlcmRCbSBtYXhUeFBvd2VyOyAgIC8qIE1JTiAoUmVndWxhdG9yeSBhbmQgbG9jYWwgcG93ZXIgY29uc3RyYWludCkgKi8KKwl0Q0RGX0NPTl9NT0RFIHBlUGVyc29uYTsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwl0UG93ZXJkQm0gdHhNZ210UG93ZXI7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJdEFuaUJvb2wgaXMxMVJjb25uZWN0aW9uOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJdEFuaUJvb2wgaXNFU0Vjb25uZWN0aW9uOworCXRFc2VQRUNvbnRleHQgZXNlQ29udGV4dDsKKyNlbmRpZgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgfHwgZGVmaW5lZCBGRUFUVVJFX1dMQU5fRVNFIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwl0QW5pQm9vbCBpc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwl0QW5pQm9vbCBpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKKwl0U2lyTm9BUGFyYW0gcDJwTm9BOworCXRTaXJQMlBOb2FBdHRyIHAycEdvUHNVcGRhdGU7CisJdWludDMyX3QgZGVmYXVsdEF1dGhGYWlsdXJlVGltZW91dDsKKwl0U2lyUDJQTm9hU3RhcnQgcDJwR29Qc05vYVN0YXJ0SW5kOworCisJLyogRURDQSBRb1MgcGFyYW1ldGVycworCSAqIGdMaW1FZGNhUGFyYW1zIC0gVGhlc2UgRURDQSBwYXJhbWV0ZXJzIGFyZSB1c2VkIGxvY2FsbHkgb24gQVAgb3IgU1RBLgorCSAqIElmIFNUQSwgdGhlbiB0aGVzZSBhcmUgdmFsdWVzIHRha2VuIGZyb20gdGhlIEFzc29jIFJzcCB3aGVuIGFzc29jaWF0aW5nLAorCSAqIG9yIEJlYWNvbnMvUHJvYmUgUmVzcG9uc2UgYWZ0ZXIgYXNzb2NpYXRpb24uICBJZiBBUCwgdGhlbiB0aGVzZSBhcmUKKwkgKiB2YWx1ZXMgb3JpZ2luYWxseSBzZXQgbG9jYWxseSBvbiBBUC4KKwkgKgorCSAqIGdMaW1FZGNhUGFyYW1zQkMgLSBUaGVzZSBFRENBIHBhcmFtZXRlcnMgYXJlIHVzZSBieSBBUCB0byBicm9hZGNhc3QKKwkgKiB0byBvdGhlciBTVEFUSU9OcyBpbiB0aGUgQlNTLgorCSAqCisJICogZ0xpbUVkY2FQYXJhbXNBY3RpdmU6IFRoZXNlIEVEQ0EgcGFyYW1ldGVycyBhcmUgd2hhdCdzIGFjdGl2ZWx5IGJlaW5nCisJICogdXNlZCBvbiBzdGF0aW9uLiBTcGVjaWZpYyBBQyB2YWx1ZXMgbWF5IGJlIGRvd25ncmFkZWQgZGVwZW5kaW5nIG9uCisJICogYWRtaXNzaW9uIGNvbnRyb2wgZm9yIHRoYXQgcGFydGljdWxhciBBQy4KKwkgKi8KKwl0U2lyTWFjRWRjYVBhcmFtUmVjb3JkIGdMaW1FZGNhUGFyYW1zW01BWF9OVU1fQUNdOyAgICAgIC8qIHVzZWQgbG9jYWxseSAqLworCXRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgZ0xpbUVkY2FQYXJhbXNCQ1tNQVhfTlVNX0FDXTsgICAgLyogdXNlZCBmb3IgYnJvYWRjYXN0ICovCisJdFNpck1hY0VkY2FQYXJhbVJlY29yZCBnTGltRWRjYVBhcmFtc0FjdGl2ZVtNQVhfTlVNX0FDXTsKKworCXVpbnQ4X3QgZ0xpbUVkY2FQYXJhbVNldENvdW50OworCisJdEJlYWNvblBhcmFtcyBiZWFjb25QYXJhbXM7CisJdWludDhfdCB2aHRDYXBhYmlsaXR5OworCXVpbnQ4X3Qgdmh0VHhDaGFubmVsV2lkdGhTZXQ7CisJdExpbU9wZXJhdGluZ01vZGVJbmZvIGdMaW1PcGVyYXRpbmdNb2RlOworCXVpbnQ4X3Qgdmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbjsKKwl1aW50OF90IGNoX2NlbnRlcl9mcmVxX3NlZzA7CisJcGh5X2NoX3dpZHRoIGNoX3dpZHRoOworCXVpbnQ4X3QgY2hfY2VudGVyX2ZyZXFfc2VnMTsKKwl1aW50OF90IHR4QkZJbmlGZWF0dXJlRW5hYmxlZDsKKwl1aW50OF90IHR4TXVCZm9ybWVlOworCXVpbnQ4X3QgZW5hYmxlVmh0cEFpZDsKKwl1aW50OF90IGVuYWJsZVZodEdpZDsKKwl1aW50OF90IGVuYWJsZV9zdV90eF9iZm9ybWVyOworCXRMaW1XaWRlckJXQ2hhbm5lbFN3aXRjaEluZm8gZ0xpbVdpZGVyQldDaGFubmVsU3dpdGNoOworCXVpbnQ4X3QgZW5hYmxlQW1wZHVQczsKKwl1aW50OF90IGVuYWJsZUh0U21wczsKKwl1aW50OF90IGh0U21wc3ZhbHVlOworCXVpbnQ4X3Qgc3BlY3RydW1NZ3RFbmFibGVkOworCS8qICoqKioqKioqKioqKioqKioqKioqKjExSCByZWxhdGVkKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCXRMaW1TcGVjTWdtdEluZm8gZ0xpbVNwZWNNZ210OworCS8qIENCIFByaW1hcnkvU2Vjb25kYXJ5IENoYW5uZWwgU3dpdGNoIEluZm8gKi8KKwl0TGltQ2hhbm5lbFN3aXRjaEluZm8gZ0xpbUNoYW5uZWxTd2l0Y2g7CisJLyogKioqKioqKioqKioqKioqKioqKioqRW5kIDExSCByZWxhdGVkKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisJLypGbGFnIHRvIFRyYWNrIFN0YXR1cy9JbmRpY2F0ZSBIQkZhaWx1cmUgb24gdGhpcyBzZXNzaW9uICovCisJYm9vbCBMaW1IQkZhaWx1cmVTdGF0dXM7CisJdWludDMyX3QgZ0xpbVBoeU1vZGU7CisJdWludDhfdCBhbXNkdVN1cHBvcnRlZEluQkE7CisJdWludDhfdCB0eExkcGNJbmlGZWF0dXJlRW5hYmxlZDsKKwkvKioKKwkgKiBGb2xsb3dpbmcgaXMgdGhlIHBsYWNlIGhvbGRlciBmb3IgZnJlZSBwZWVyIGluZGV4IHBvb2wuCisJICogQSBub24temVybyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBwZWVyIGluZGV4IGlzIGF2YWlsYWJsZQorCSAqIGZvciBhc3NpZ25tZW50LgorCSAqLworCXVpbnQ4X3QgKmdwTGltUGVlcklkeHBvb2w7CisJdWludDhfdCBmcmVlUGVlcklkeEhlYWQ7CisJdWludDhfdCBmcmVlUGVlcklkeFRhaWw7CisJdWludDE2X3QgZ0xpbU51bU9mQ3VycmVudFNUQXM7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwl1aW50MzJfdCBwZWVyQUlEQml0bWFwWzJdOworCWJvb2wgdGRsc19wcm9oaWJpdGVkOworCWJvb2wgdGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZDsKKyNlbmRpZgorCWJvb2wgZldhaXRGb3JQcm9iZVJzcDsKKwlib29sIGZJZ25vcmVDYXBzQ2hhbmdlOworCWJvb2wgZkRlYXV0aFJlY2VpdmVkOworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNCisJaW50OF90IHJzc2k7CisjZW5kaWYKKwl1aW50OF90IGlzQW1zZHVTdXBwb3J0SW5BTVBEVTsKKwl1aW50OF90IGlzQ29hbGVzaW5nSW5JQlNTQWxsb3dlZDsKKworCXRTaXJIVENvbmZpZyBodENvbmZpZzsKKworCS8qCisJICogUGxhY2UgaG9sZGVyIGZvciBTdGFydEJzc1JlcSBtZXNzYWdlCisJICogcmVjZWl2ZWQgYnkgU01FIHN0YXRlIG1hY2hpbmUKKwkgKi8KKwl1aW50OF90IGdMaW1DdXJyZW50QnNzVWFwc2Q7CisKKwkvKiBVc2VkIG9uIFNUQSwgdGhpcyBpcyBhIHN0YXRpYyBVQVBTRCBtYXNrIHNldHRpbmcKKwkgKiBkZXJpdmVkIGZyb20gU01FX0pPSU5fUkVRIGFuZCBTTUVfUkVBU1NPQ19SRVEuIElmIGEKKwkgKiBwYXJ0aWN1bGFyIEFDIGJpdCBpcyBzZXQsIGl0IG1lYW5zIHRoZSBBQyBpcyBib3RoCisJICogdHJpZ2dlciBlbmFibGVkIGFuZCBkZWxpdmVyeSBlbmFibGVkLgorCSAqLworCXVpbnQ4X3QgZ1VhcHNkUGVyQWNCaXRtYXNrOworCisJLyogVXNlZCBvbiBTVEEsIHRoaXMgaXMgYSBkeW5hbWljIFVQQVNEIG1hc2sgc2V0dGluZworCSAqIGRlcml2ZWQgZnJvbSBBZGRUUyBSc3AgYW5kIERlbFRTIGZyYW1lLiBJZiBhCisJICogcGFydGljdWxhciBBQyBiaXQgaXMgc2V0LCBpdCBtZWFucyBBQyBpcyB0cmlnZ2VyCisJICogZW5hYmxlZC4KKwkgKi8KKwl1aW50OF90IGdVYXBzZFBlckFjVHJpZ2dlckVuYWJsZU1hc2s7CisKKwkvKiBVc2VkIG9uIFNUQSwgZHluYW1pYyBVUEFTRCBtYXNrIHNldHRpbmcKKwkgKiBkZXJpdmVkIGZyb20gQWRkVFMgUnNwIGFuZCBEZWxUcyBmcmFtZS4gSWYKKwkgKiBhIHBhcnRpY3VsYXIgQUMgYml0IGlzIHNldCwgaXQgbWVhbnMgQUMgaXMKKwkgKiBkZWxpdmVyeSBlbmFibGVkLgorCSAqLworCXVpbnQ4X3QgZ1VhcHNkUGVyQWNEZWxpdmVyeUVuYWJsZU1hc2s7CisKKwkvKiBGbGFnIHRvIHNraXAgQ1NBIElFIHByb2Nlc3Npbmcgd2hlbiBDU0EKKwkgKiBvZmZsb2FkIGlzIGVuYWJsZWQuCisJICovCisJdWludDhfdCBjc2FPZmZsb2FkRW5hYmxlOworCisJLyogVXNlZCBvbiBTVEEgZm9yIEFDIGRvd25ncmFkZS4gVGhpcyBpcyBhIGR5bmFtaWMgbWFzaworCSAqIHNldHRpbmcgd2hpY2gga2VlcCB0cmFja3Mgb2YgQUNzIGJlaW5nIGFkbWl0dGVkLgorCSAqIElmIGJpdCBpcyBzZXQgdG8gMDogVGhhdCBwYXJ0aXVsYXIgQUMgaXMgbm90IGFkbWl0dGVkCisJICogSWYgYml0IGlzIHNldCB0byAxOiBUaGF0IHBhcnRpY3VsYXIgQUMgaXMgYWRtaXR0ZWQKKwkgKi8KKwl1aW50OF90IGdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9ESVJFQ1RdOworCisJLyogUG93ZXIgU2F2ZSBPZmYgbG9hZCBQYXJhbWV0ZXJzICovCisJdFBvd2Vyc2F2ZW9mZmxvYWRJbmZvIHBtbU9mZmxvYWRJbmZvOworCS8qIFNNUFMgbW9kZSAqLworCXVpbnQ4X3Qgc21wc01vZGU7CisKKwl1aW50OF90IGNoYWluTWFzazsKKworCS8qIEZsYWcgdG8gaW5kaWNhdGUgQ2hhbiBTdyBhbm5vdW5jZW1lbnQgaXMgcmVxdWlyZWQgKi8KKwl1aW50OF90IGRmc0luY2x1ZGVDaGFuU3dJZTsKKworCS8qIEZsYWcgdG8gaW5kaWNhdGUgQ2hhbiBXcmFwcGVyIEVsZW1lbnQgaXMgcmVxdWlyZWQgKi8KKwl1aW50OF90IGRmc0luY2x1ZGVDaGFuV3JhcHBlckllOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisJdWludDhfdCBjY19zd2l0Y2hfbW9kZTsKKyNlbmRpZgorCisJYm9vbCBpc0Npc2NvVmVuZG9yQVA7CisKKwl0U2lyQWRkSWVQYXJhbXMgYWRkSWVQYXJhbXM7CisKKwl1aW50OF90ICpwU2NoUHJvYmVSc3BUZW1wbGF0ZTsKKwkvKiBCZWdpbm5pbmcgcG9ydGlvbiBvZiB0aGUgYmVhY29uIGZyYW1lIHRvIGJlIHdyaXR0ZW4gdG8gVEZQICovCisJdWludDhfdCAqcFNjaEJlYWNvbkZyYW1lQmVnaW47CisJLyogVHJhaWxpbmcgcG9ydGlvbiBvZiB0aGUgYmVhY29uIGZyYW1lIHRvIGJlIHdyaXR0ZW4gdG8gVEZQICovCisJdWludDhfdCAqcFNjaEJlYWNvbkZyYW1lRW5kOworCS8qIFNpemUgb2YgdGhlIGJlZ2lubmluZyBwb3J0aW9uICovCisJdWludDE2X3Qgc2NoQmVhY29uT2Zmc2V0QmVnaW47CisJLyogU2l6ZSBvZiB0aGUgdHJhaWxpbmcgcG9ydGlvbiAqLworCXVpbnQxNl90IHNjaEJlYWNvbk9mZnNldEVuZDsKKwlib29sIGlzT1NFTkNvbm5lY3Rpb247CisJLyogIERTQ1AgdG8gVVAgbWFwcGluZyBmb3IgSFMgMi4wICovCisJdFNpclFvc01hcFNldCBRb3NNYXBTZXQ7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJYm9vbCBiUm9hbVN5bmNoSW5Qcm9ncmVzczsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCS8qIEZhc3QgVHJhbnNpdGlvbiAoRlQpICovCisJdGZ0UEVDb250ZXh0IGZ0UEVDb250ZXh0OworI2VuZGlmCisJYm9vbCBpc05vblJvYW1SZWFzc29jOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwljZGZfbWNfdGltZXJfdCBwbWZDb21lYmFja1RpbWVyOworCXRDb21lYmFja1RpbWVySW5mbyBwbWZDb21lYmFja1RpbWVySW5mbzsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFXICovCisJdWludDhfdCAgaXNfa2V5X2luc3RhbGxlZDsKKwkvKiB0aW1lciBmb3IgcmVzZXRpbmcgcHJvdGVjdGlvbiBmaWxlZHMgYXQgcmVndWxhciBpbnRlcnZhbHMgKi8KKwljZGZfbWNfdGltZXJfdCBwcm90ZWN0aW9uX2ZpZWxkc19yZXNldF90aW1lcjsKKwl2b2lkICptYWNfY3R4OworCS8qCisJICogdmFyaWFibGUgdG8gc3RvcmUgc3RhdGUgb2YgdmFyaW91cyBwcm90ZWN0aW9uIHN0cnVjdCBsaWtlCisJICogZ0xpbU9sYmNQYXJhbXMsIGdMaW1PdmVybGFwMTFnUGFyYW1zLCBnTGltT3ZlcmxhcEh0MjBQYXJhbXMgZXRjCisJICovCisJdWludDE2X3Qgb2xkX3Byb3RlY3Rpb25fc3RhdGU7CisJdFNpck1hY0FkZHIgcHJldl9hcF9ic3NpZDsKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKwkvKiB0ZWxscyBpZiBRMlEgSUUsIGZyb20gYW5vdGhlciBNRE0gZGV2aWNlIGluIEFQIE1DQyBtb2RlIHdhcyByZWN2ZCAqLworCWJvb2wgc2FwX2FkdmVydGlzZV9hdm9pZF9jaF9pZTsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJdWludDhfdCBpc19lc2VfdmVyc2lvbl9pZV9wcmVzZW50OworI2VuZGlmCisJdWludDhfdCBzYXBfZG90MTFtYzsKKwlib29sIGlzX3ZlbmRvcl9zcGVjaWZpY192aHRjYXBzOworCXVpbnQ4X3QgdmVuZG9yX3NwZWNpZmljX3ZodF9pZV90eXBlOworCXVpbnQ4X3QgdmVuZG9yX3NwZWNpZmljX3ZodF9pZV9zdWJfdHlwZTsKKwkvKiBmbGFnIHRvIGluZGljYXRlIGNvdW50cnkgY29kZSBpbiBiZWFjb24gKi8KKwl1aW50OF90IGNvdW50cnlfaW5mb19wcmVzZW50OworCXVpbnQ4X3QgbnNzOworfSB0UEVTZXNzaW9uLCAqdHBQRVNlc3Npb247CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogcGVfY3JlYXRlX3Nlc3Npb24oKSAtIGNyZWF0ZXMgYSBuZXcgUEUgc2Vzc2lvbiBnaXZlbiB0aGUgQlNTSUQKKyAqCisgKiBAcE1hYzogICAgICAgICAgcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgKiBAYnNzaWQ6ICAgICAgICAgQlNTSUQgb2YgdGhlIG5ldyBzZXNzaW9uCisgKiBAc2Vzc2lvbklkOiAgICAgc2Vzc2lvbiBJRCBpcyByZXR1cm5lZCBoZXJlLCBpZiBzZXNzaW9uIGlzIGNyZWF0ZWQuCisgKiBAbnVtU3RhOiAgICAgICAgbnVtYmVyIG9mIHN0YXRpb25zCisgKiBAYnNzVHlwZTogICAgICAgYnNzIHR5cGUgb2YgbmV3IHNlc3Npb24gdG8gZG8gY29uZGl0aW9uYWwgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgYW5kIHRoZSBzZXNzaW9uIElEIGlmIHRoZSBzZXNzaW9uCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXNzZWQgQlNTSUQgaXMgZm91bmQgaW4gdGhlIFBFIHNlc3Npb24gdGFibGUuCisgKgorICogUmV0dXJuOiBwdHIgdG8gdGhlIHNlc3Npb24gY29udGV4dCBvciBOVUxMIGlmIHNlc3Npb24gY2FuIG5vdCBiZSBjcmVhdGVkLgorICovCit0cFBFU2Vzc2lvbiBwZV9jcmVhdGVfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgdWludDhfdCAqYnNzaWQsCisJCQkgICAgICB1aW50OF90ICpzZXNzaW9uSWQsCisJCQkgICAgICB1aW50MTZfdCBudW1TdGEsIHRTaXJCc3NUeXBlIGJzc1R5cGUpOworCisvKioKKyAqIHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZCgpIC0gbG9va3MgdXAgdGhlIFBFIHNlc3Npb24gZ2l2ZW4gdGhlIEJTU0lELgorICoKKyAqIEBwTWFjOiAgICAgICAgICBwb2ludGVyIHRvIGdsb2JhbCBhZGFwdGVyIGNvbnRleHQKKyAqIEBic3NpZDogICAgICAgICBCU1NJRCBvZiB0aGUgbmV3IHNlc3Npb24KKyAqIEBzZXNzaW9uSWQ6ICAgICBzZXNzaW9uIElEIGlzIHJldHVybmVkIGhlcmUsIGlmIHNlc3Npb24gaXMgY3JlYXRlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNlc3Npb24gY29udGV4dCBhbmQgdGhlIHNlc3Npb24gSUQgaWYgdGhlIHNlc3Npb24KKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEJTU0lEIGlzIGZvdW5kIGluIHRoZSBQRSBzZXNzaW9uIHRhYmxlLgorICoKKyAqIFJldHVybjogcG9pbnRlciB0byB0aGUgc2Vzc2lvbiBjb250ZXh0IG9yIE5VTEwgaWYgc2Vzc2lvbiBpcyBub3QgZm91bmQuCisgKi8KK3RwUEVTZXNzaW9uIHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpic3NpZCwKKwkJCQkgICAgIHVpbnQ4X3QgKnNlc3Npb25JZCk7CisKKy8qKgorICogcGVfZmluZF9zZXNzaW9uX2J5X2Jzc19pZHgoKSAtIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGdpdmVuIHRoZSBic3NJZHguCisgKgorICogQHBNYWM6ICAgICAgICAgIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICogQGJzc0lkeDogICAgICAgIGJzcyBpbmRleCBvZiB0aGUgc2Vzc2lvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2Vzc2lvbiBjb250ZXh0ICBpZiB0aGUgc2Vzc2lvbgorICogY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYnNzSWR4IGlzIGZvdW5kIGluIHRoZSBQRSBzZXNzaW9uIHRhYmxlLgorICoKKyAqIFJldHVybjogcG9pbnRlciB0byB0aGUgc2Vzc2lvbiBjb250ZXh0IG9yIE5VTEwgaWYgc2Vzc2lvbiBpcyBub3QgZm91bmQuCisgKi8KK3RwUEVTZXNzaW9uIHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NfaWR4KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgYnNzSWR4KTsKKworLyoqCisgKiBwZV9maW5kX3Nlc3Npb25fYnlfcGVlcl9zdGEoKSAtIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGdpdmVuIHRoZSBQZWVyCisgKiBTdGF0aW9uIEFkZHJlc3MuCisgKgorICogQHBNYWM6ICAgICAgICAgIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICogQHNhOiAgICAgICAgICAgIFBlZXIgU1RBIEFkZHJlc3Mgb2YgdGhlIHNlc3Npb24KKyAqIEBzZXNzaW9uSWQ6ICAgICBzZXNzaW9uIElEIGlzIHJldHVybmVkIGhlcmUsIGlmIHNlc3Npb24gaXMgZm91bmQuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgYW5kIHRoZSBzZXNzaW9uIElEIGlmIHRoZSBzZXNzaW9uCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIGZvdW5kIGluIHRoZSBQRSBzZXNzaW9uCisgKiB0YWJsZS4KKyAqCisgKiBSZXR1cm46IHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gY29udGV4dCBvciBOVUxMIGlmIHNlc3Npb24gaXMgbm90IGZvdW5kLgorICovCit0cFBFU2Vzc2lvbiBwZV9maW5kX3Nlc3Npb25fYnlfcGVlcl9zdGEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqc2EsCisJCQkJCXVpbnQ4X3QgKnNlc3Npb25JZCk7CisKKy8qKgorICogcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQoKSAtIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGdpdmVuIHRoZSBzZXNzaW9uCisgKiBJRC4KKyAqCisgKiBAcE1hYzogICAgICAgICAgcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgKiBAc2Vzc2lvbklkOiAgICAgc2Vzc2lvbiBJRCBmb3Igd2hpY2ggc2Vzc2lvbiBjb250ZXh0IG5lZWRzIHRvIGJlIGxvb2tlZCB1cC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNlc3Npb24gY29udGV4dCAgaWYgdGhlIHNlc3Npb24gY29ycmVzcG9uZGluZyB0bworICogdGhlIGdpdmVuIHNlc3Npb24gSUQgaXMgZm91bmQgaW4gdGhlIFBFIHNlc3Npb24gdGFibGUuCisgKgorICogUmV0dXJuOiBwb2ludGVyIHRvIHRoZSBzZXNzaW9uIGNvbnRleHQgb3IgTlVMTCBpZiBzZXNzaW9uIGlzIG5vdCBmb3VuZC4KKyAqLwordHBQRVNlc3Npb24gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICB1aW50OF90IHNlc3Npb25JZCk7CisKKy8qKgorICogcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKCkgLSBsb29rcyB1cCB0aGUgUEUgc2Vzc2lvbiBnaXZlbiBzdGFpZC4KKyAqCisgKiBAcE1hYzogICAgICAgICAgcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgKiBAc3RhaWQ6ICAgICAgICAgU3RhSWQgb2YgdGhlIHNlc3Npb24KKyAqIEBzZXNzaW9uSWQ6ICAgICBzZXNzaW9uIElEIGlzIHJldHVybmVkIGhlcmUsIGlmIHNlc3Npb24gaXMgZm91bmQuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgYW5kIHRoZSBzZXNzaW9uIElEIGlmIHRoZSBzZXNzaW9uCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBTdGFJZCBpcyBmb3VuZCBpbiB0aGUgUEUgc2Vzc2lvbiB0YWJsZS4KKyAqCisgKiBSZXR1cm46IHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gY29udGV4dCBvciBOVUxMIGlmIHNlc3Npb24gaXMgbm90IGZvdW5kLgorICovCit0cFBFU2Vzc2lvbiBwZV9maW5kX3Nlc3Npb25fYnlfc3RhX2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc3RhaWQsCisJCQkJICAgICAgdWludDhfdCAqc2Vzc2lvbklkKTsKKworLyoqCisgKiBwZV9kZWxldGVfc2Vzc2lvbigpIC0gZGVsZXRlcyB0aGUgUEUgc2Vzc2lvbiBnaXZlbiB0aGUgc2Vzc2lvbiBJRC4KKyAqCisgKiBAcE1hYzogICAgICAgICAgcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgKiBAc2Vzc2lvbklkOiAgICAgc2Vzc2lvbiBJRCB0byBkZWxldGUuCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgcGVfZGVsZXRlX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorLyoqCisgKiBwZV9maW5kX3Nlc3Npb25fYnlfc21lX3Nlc3Npb25faWQoKSAtIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGZvciBnaXZlbiBzbWUKKyAqIHNlc3Npb24gaWQKKyAqIEBtYWNfY3R4OiAgICAgICAgICBwb2ludGVyIHRvIGdsb2JhbCBhZGFwdGVyIGNvbnRleHQKKyAqIEBzbWVfc2Vzc2lvbl9pZDogICBzbWUgc2Vzc2lvbiBpZAorICoKKyAqIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGZvciBnaXZlbiBzbWUgc2Vzc2lvbiBpZAorICoKKyAqIFJldHVybjogcGUgc2Vzc2lvbiBlbnRyeSBmb3IgZ2l2ZW4gc21lIHNlc3Npb24gaWYgZm91bmQgZWxzZSBOVUxMCisgKi8KK3RwUEVTZXNzaW9uIHBlX2ZpbmRfc2Vzc2lvbl9ieV9zbWVfc2Vzc2lvbl9pZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQkgICAgICB1aW50OF90IHNtZV9zZXNzaW9uX2lkKTsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KK3VpbnQ4X3QgcGVfZ2V0X2FjdGl2ZV9zZXNzaW9uX2NvdW50KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpOworI2VuZGlmIC8qICNpZiAhZGVmaW5lZCggX19MSU1fU0VTU0lPTl9IICkgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL2xpbV90cmFjZS5oIGIvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvbGltX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0ZWRjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL2xpbV90cmFjZS5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICogIFxmaWxlICBsaW1fdHJhY2UuaAorCisgKiAgXGJyaWVmIGRlZmluaXRpb24gZm9yIHRyYWNlIHJlbGF0ZWQgQVBJcworCisgKiAgXGF1dGhvciBTdW5pdCBCaGF0aWEKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBfX0xJTV9UUkFDRV9ICisjZGVmaW5lIF9fTElNX1RSQUNFX0gKKworI2luY2x1ZGUgImxpbV9nbG9iYWwuaCIKKyNpbmNsdWRlICJtYWNfdHJhY2UuaCIKKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKyNpZmRlZiBMSU1fVFJBQ0VfUkVDT1JECisKKyNkZWZpbmUgTElNX1RSQUNFX0dFVF9TU04oZGF0YSkgICAgKCgoZGF0YSkgPj4gMTYpICYgMHhmZikKKyNkZWZpbmUgTElNX1RSQUNFX0dFVF9TVUJUWVBFKGRhdGEpICAgIChkYXRhICYgMHhmZikKKyNkZWZpbmUgTElNX1RSQUNFX0dFVF9ERUZFUlJFRChkYXRhKSAoZGF0YSAmIDB4ODAwMDAwMDApCisjZGVmaW5lIExJTV9UUkFDRV9HRVRfREVGUkRfT1JfRFJPUFBFRChkYXRhKSAoZGF0YSAmIDB4YzAwMDAwMDApCisKKyNkZWZpbmUgTElNX01TR19QUk9DRVNTRUQgMAorI2RlZmluZSBMSU1fTVNHX0RFRkVSUkVEICAgMQorI2RlZmluZSBMSU1fTVNHX0RST1BQRUQgICAgIDIKKworI2RlZmluZSBMSU1fVFJBQ0VfTUFLRV9SWE1HTVQodHlwZSwgc3NuKSBcCisJKChzc24gPDwgMTYpIHwgKHR5cGUpKQorI2RlZmluZSBMSU1fVFJBQ0VfTUFLRV9SWE1TRyhtc2csIGFjdGlvbikgXAorCSgobXNnKSB8IChhY3Rpb24gPDwgMzApKQorCitlbnVtIHsKKwlUUkFDRV9DT0RFX01MTV9TVEFURSwKKwlUUkFDRV9DT0RFX1NNRV9TVEFURSwKKwlUUkFDRV9DT0RFX1RYX01HTVQsCisJVFJBQ0VfQ09ERV9SWF9NR01ULAorCVRSQUNFX0NPREVfUlhfTUdNVF9UU0YsCisJVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwKKwlUUkFDRV9DT0RFX1RYX1NNRV9NU0csCisJVFJBQ0VfQ09ERV9SWF9TTUVfTVNHLAorCVRSQUNFX0NPREVfVFhfV01BX01TRywKKwlUUkFDRV9DT0RFX1JYX1dNQV9NU0csCisJVFJBQ0VfQ09ERV9UWF9MSU1fTVNHLAorCVRSQUNFX0NPREVfUlhfTElNX01TRywKKwlUUkFDRV9DT0RFX1RYX0NGR19NU0csCisJVFJBQ0VfQ09ERV9SWF9DRkdfTVNHLAorCVRSQUNFX0NPREVfUlhfTUdNVF9EUk9QLAorCisJVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwKKwlUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEUsCisJVFJBQ0VfQ09ERV9JTkZPX0xPRworfTsKKwordm9pZCBsaW1fdHJhY2VfaW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltVHJhY2VSZXNldCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltVHJhY2VVcGRhdGVNZ210U3RhdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHN1YnR5cGUpOwordm9pZCBsaW1fdHJhY2VfZHVtcE1nbXRTdGF0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc3VidHlwZSk7Cit1aW50OF90ICpsaW1fdHJhY2VfZ2V0X21sbV9zdGF0ZV9zdHJpbmcodWludDMyX3QgbWxtU3RhdGUpOwordWludDhfdCAqbGltX3RyYWNlX2dldF9zbWVfc3RhdGVfc3RyaW5nKHVpbnQzMl90IHNtZVN0YXRlKTsKK3ZvaWQgbGltX3RyYWNlX2R1bXAodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBfY2RmX3RyYWNlX3JlY29yZCBwUmVjb3JkLAorCQkgICAgdWludDE2X3QgcmVjSW5kZXgpOwordm9pZCBtYWNfdHJhY2VfbXNnX3R4KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbiwgdWludDMyX3QgZGF0YSk7Cit2b2lkIG1hY190cmFjZV9tc2dfcngodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uLCB1aW50MzJfdCBkYXRhKTsKKwordm9pZCBtYWNfdHJhY2VfbXNnX3J4X25ldyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IG1vZHVsZSwgdWludDhfdCBzZXNzaW9uLAorCQkJICB1aW50MzJfdCBkYXRhKTsKK3ZvaWQgbWFjX3RyYWNlX21zZ190eF9uZXcodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBtb2R1bGUsIHVpbnQ4X3Qgc2Vzc2lvbiwKKwkJCSAgdWludDMyX3QgZGF0YSk7CisjZW5kaWYgLyogZW5kb2YgTElNX1RSQUNFX1JFQ09SRCBNQUNSTyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL3JybV9hcGkuaCBiL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL3JybV9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ2NmMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvcnJtX2FwaS5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICBycm1fYXBpLmgKKworICAgXGJyaWVmIFJSTSBBUElzCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKyNpZm5kZWYgX19SUk1fQVBJX0hfXworI2RlZmluZSBfX1JSTV9BUElfSF9fCisKKyNkZWZpbmUgUlJNX01JTl9UWF9QV1JfQ0FQICAgIDEzCisjZGVmaW5lIFJSTV9NQVhfVFhfUFdSX0NBUCAgICAxOQorCisjZGVmaW5lIFJSTV9CQ05fUlBUX05PX0JTU19JTkZPICAgIDAKKyNkZWZpbmUgUlJNX0JDTl9SUFRfTUlOX1JQVCAgICAgICAgMQorCit1aW50OF90IHJybV9nZXRfbWluX29mX21heF90eF9wb3dlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0UG93ZXJkQm0gcmVnTWF4LAorCQkJCSAgICB0UG93ZXJkQm0gYXBUeFBvd2VyKTsKKworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgcnJtX2luaXRpYWxpemUodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIHJybV9jbGVhbnVwKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCitleHRlcm4gdFNpclJldFN0YXR1cyBycm1fcHJvY2Vzc19saW5rX21lYXN1cmVtZW50X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCQkgIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sCisJCQkJCQkJICB0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdAorCQkJCQkJCSAgKnBMaW5rUmVxLAorCQkJCQkJCSAgdHBQRVNlc3Npb24KKwkJCQkJCQkgIHBTZXNzaW9uRW50cnkpOworCitleHRlcm4gdFNpclJldFN0YXR1cyBycm1fcHJvY2Vzc19yYWRpb19tZWFzdXJlbWVudF9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJICAgdFNpck1hY0FkZHIgcGVlciwKKwkJCQkJCQkgICB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QKKwkJCQkJCQkgICAqcFJSTVJlcSwKKwkJCQkJCQkgICB0cFBFU2Vzc2lvbgorCQkJCQkJCSAgIHBTZXNzaW9uRW50cnkpOworCitleHRlcm4gdFNpclJldFN0YXR1cyBycm1fcHJvY2Vzc19uZWlnaGJvcl9yZXBvcnRfcmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCQkgIHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlCisJCQkJCQkJICAqcE5laWdoYm9yUmVwLAorCQkJCQkJCSAgdHBQRVNlc3Npb24KKwkJCQkJCQkgIHBTZXNzaW9uRW50cnkpOworCitleHRlcm4gdm9pZCBycm1fcHJvY2Vzc19tZXNzYWdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKTsKKworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgcnJtX3NlbmRfc2V0X21heF90eF9wb3dlcl9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgIHRQb3dlcmRCbSB0eFBvd2VyLAorCQkJCQkJICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSk7CisKK2V4dGVybiB0UG93ZXJkQm0gcnJtX2dldF9tZ210X3R4X3Bvd2VyKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICAgIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkpOworCitleHRlcm4gdm9pZCBycm1fY2FjaGVfbWdtdF90eF9wb3dlcih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICB0UG93ZXJkQm0gdHhQb3dlciwgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSk7CisKK2V4dGVybiB0cFJSTUNhcHMgcnJtX2dldF9jYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5KTsKKworZXh0ZXJuIHZvaWQgcnJtX3VwZGF0ZV9jb25maWcodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSk7CisKK2V4dGVybiB2b2lkIHJybV9nZXRfc3RhcnRfdHNmKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwU3RhcnRUU0YpOworCitleHRlcm4gdm9pZCBycm1fdXBkYXRlX3N0YXJ0X3RzZih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzdGFydFRTRlsyXSk7CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIHJybV9zZXRfbWF4X3R4X3Bvd2VyX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICB0cFNpck1zZ1EgbGltTXNnUSk7CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzCitycm1fcHJvY2Vzc19uZWlnaGJvcl9yZXBvcnRfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdHBTaXJOZWlnaGJvclJlcG9ydFJlcUluZCBwTmVpZ2hib3JSZXEpOworZXh0ZXJuIHRTaXJSZXRTdGF0dXMKK3JybV9wcm9jZXNzX2JlYWNvbl9yZXBvcnRfeG1pdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgIHRwU2lyQmVhY29uUmVwb3J0WG1pdEluZCBwQmNuUmVwb3J0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvcnJtX2dsb2JhbC5oIGIvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvcnJtX2dsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Mzg0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvaW5jbHVkZS9ycm1fZ2xvYmFsLmgKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKF9fUlJNR0xPQkFMX0gpCisjZGVmaW5lIF9fUlJNR0xPQkFMX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgcnJtX2dsb2JhbC5oCisKKyAgIFxicmllZiBEZWZpbml0aW9ucyBmb3IgU01FIEFQSXMKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBlbnVtIGVScm1SZXRTdGF0dXMgeworCWVSUk1fU1VDQ0VTUywKKwllUlJNX0lOQ0FQQUJMRSwKKwllUlJNX1JFRlVTRUQsCisJZVJSTV9GQUlMVVJFCit9IHRScm1SZXRTdGF0dXM7CisKK3R5cGVkZWYgZW51bSBlUnJtTXNnUmVxU291cmNlIHsKKwllUlJNX01TR19TT1VSQ0VfTEVHQUNZX0VTRSA9IDEsIC8qIGxlZ2FjeSBlc2UgKi8KKwllUlJNX01TR19TT1VSQ0VfMTFLID0gMiwgICAgICAgIC8qIDExayAqLworCWVSUk1fTVNHX1NPVVJDRV9FU0VfVVBMT0FEID0gMywgLyogZXNlIHVwbG9hZCBhcHByb2FjaCAqLworfSB0UnJtTXNnUmVxU291cmNlOworCit0eXBlZGVmIHN0cnVjdCBzU2lyQ2hhbm5lbEluZm8geworCXVpbnQ4X3QgcmVndWxhdG9yeUNsYXNzOworCXVpbnQ4X3QgY2hhbm5lbE51bTsKK30gdFNpckNoYW5uZWxJbmZvLCAqdHBTaXJDaGFubmVsSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckJlYWNvblJlcG9ydFJlcUluZCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfQkVBQ09OX1JFUE9SVF9SRVFfSU5EICovCisJdWludDE2X3QgbGVuZ3RoOworCXRTaXJNYWNBZGRyIGJzc0lkOworCXVpbnQxNl90IG1lYXN1cmVtZW50RHVyYXRpb25bU0lSX0VTRV9NQVhfTUVBU19JRV9SRVFTXTsgLyogbXMgKi8KKwl1aW50MTZfdCByYW5kb21pemF0aW9uSW50ZXJ2YWw7IC8qIG1zICovCisJdFNpckNoYW5uZWxJbmZvIGNoYW5uZWxJbmZvOworCS8qIDA6IHdpbGRjYXJkICovCisJdFNpck1hY0FkZHIgbWFjYWRkckJzc2lkOworCS8qIDA6UGFzc2l2ZSwgMTogQWN0aXZlLCAyOiB0YWJsZSBtb2RlICovCisJdWludDhfdCBmTWVhc3VyZW1lbnR0eXBlW1NJUl9FU0VfTUFYX01FQVNfSUVfUkVRU107CisJdEFuaVNTSUQgc3NJZDsgICAgICAgICAgLyogTWF5IGJlIHdpbGNhcmQuICovCisJdWludDE2X3QgdURpYWxvZ1Rva2VuOworCXRTaXJDaGFubmVsTGlzdCBjaGFubmVsTGlzdDsgICAgLyogRnJvbSBBUCBjaGFubmVsIHJlcG9ydC4gKi8KKwl0UnJtTXNnUmVxU291cmNlIG1zZ1NvdXJjZTsKK30gdFNpckJlYWNvblJlcG9ydFJlcUluZCwgKnRwU2lyQmVhY29uUmVwb3J0UmVxSW5kOworCit0eXBlZGVmIHN0cnVjdCBzU2lyQmVhY29uUmVwb3J0WG1pdEluZCB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfQkVBQ09OX1JFUE9SVF9SRVNQX1hNSVRfSU5EICovCisJdWludDE2X3QgbGVuZ3RoOworCXRTaXJNYWNBZGRyIGJzc0lkOworCXVpbnQxNl90IHVEaWFsb2dUb2tlbjsKKwl1aW50OF90IGZNZWFzdXJlRG9uZTsKKwl1aW50MTZfdCBkdXJhdGlvbjsKKwl1aW50OF90IHJlZ0NsYXNzOworCXVpbnQ4X3QgbnVtQnNzRGVzYzsKKwl0cFNpckJzc0Rlc2NyaXB0aW9uIHBCc3NEZXNjcmlwdGlvbltTSVJfQkNOX1JFUE9SVF9NQVhfQlNTX0RFU0NdOworfSB0U2lyQmVhY29uUmVwb3J0WG1pdEluZCwgKnRwU2lyQmVhY29uUmVwb3J0WG1pdEluZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck5laWdoYm9yUmVwb3J0UmVxSW5kIHsKKwkvKiBlV05JX1NNRV9ORUlHSEJPUl9SRVBPUlRfUkVRX0lORCAqLworCXVpbnQxNl90IG1lc3NhZ2VUeXBlOworCXVpbnQxNl90IGxlbmd0aDsKKwkvKiBGb3IgdGhlIHNlc3Npb24uICovCisJdFNpck1hY0FkZHIgYnNzSWQ7CisJLyogdHJ1ZSAtIGRvbnQgaW5jbHVkZSBTU0lEIGluIHRoZSByZXF1ZXN0LiAqLworCXVpbnQxNl90IG5vU1NJRDsKKwkvKiBmYWxzZSAgaW5jbHVkZSB0aGUgU1NJRC4gSXQgbWF5IGJlIG51bGwgKHdpbGRjYXJkKSAqLworCXRTaXJNYWNTU2lkIHVjU1NJRDsKK30gdFNpck5laWdoYm9yUmVwb3J0UmVxSW5kLCAqdHBTaXJOZWlnaGJvclJlcG9ydFJlcUluZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck5laWdoYm9yQnNzRGVzY3JpcHRpb24geworCXVpbnQxNl90IGxlbmd0aDsKKwl0U2lyTWFjQWRkciBic3NJZDsKKwl1aW50OF90IHJlZ0NsYXNzOworCXVpbnQ4X3QgY2hhbm5lbDsKKwl1aW50OF90IHBoeVR5cGU7CisJdW5pb24gc1Npck5laWdoYm9yQnNzaWRJbmZvIHsKKwkJc3RydWN0IF9ycm1JbmZvIHsKKwkJCSAvKiBzZWUgSUVFRSA4MDIuMTFrIFRhYmxlIDctNDNhICovCisJCQl1aW50MzJfdCBmQXBQcmVhdXRoUmVhY2hhYmxlOjI7CisJCQl1aW50MzJfdCBmU2FtZVNlY3VyaXR5TW9kZToxOworCQkJdWludDMyX3QgZlNhbWVBdXRoZW50aWNhdG9yOjE7CisJCQkvKiBzZWUgSUVFRSA4MDIuMTFrIFRhYmxlIDctOTVkICovCisJCQl1aW50MzJfdCBmQ2FwU3BlY3RydW1NZWFzdXJlbWVudDoxOworCQkJdWludDMyX3QgZkNhcFFvczoxOworCQkJdWludDMyX3QgZkNhcEFwc2Q6MTsKKwkJCXVpbnQzMl90IGZDYXBSYWRpb01lYXN1cmVtZW50OjE7CisJCQl1aW50MzJfdCBmQ2FwRGVsYXllZEJsb2NrQWNrOjE7CisJCQl1aW50MzJfdCBmQ2FwSW1tZWRpYXRlQmxvY2tBY2s6MTsKKwkJCXVpbnQzMl90IGZNb2JpbGl0eURvbWFpbjoxOworCQkJdWludDMyX3QgcmVzZXJ2ZWQ6MjE7CisJCX0gcnJtSW5mbzsKKwkJc3RydWN0IF9lc2VJbmZvIHsKKwkJCXVpbnQzMl90IGNoYW5uZWxCYW5kOjg7CisJCQl1aW50MzJfdCBtaW5SZWN2U2lnUG93ZXI6ODsKKwkJCXVpbnQzMl90IGFwVHhQb3dlcjo4OworCQkJdWludDMyX3Qgcm9hbUh5c3RlcmVzaXM6ODsKKwkJCXVpbnQzMl90IGFkYXB0U2NhblRocmVzOjg7CisKKwkJCXVpbnQzMl90IHRyYW5zaXRpb25UaW1lOjg7CisJCQl1aW50MzJfdCB0c2ZPZmZzZXQ6MTY7CisKKwkJCXVpbnQzMl90IGJlYWNvbkludGVydmFsOjE2OworCQkJdWludDMyX3QgcmVzZXJ2ZWQ6MTY7CisJCX0gZXNlSW5mbzsKKwl9IGJzc2lkSW5mbzsKKworCS8qIE9wdGlvbmFsIHN1YiBJRXMuLi4uaWdub3JpbmcgZm9yIG5vdy4gKi8KK30gdFNpck5laWdoYm9yQnNzRGVzY3JpcHRpb24sICp0cFNpck5laWdoYm9yQnNzRGVzY3JpcHRvbjsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck5laWdoYm9yUmVwb3J0SW5kIHsKKwl1aW50MTZfdCBtZXNzYWdlVHlwZTsgICAvKiBlV05JX1NNRV9ORUlHSEJPUl9SRVBPUlRfSU5EICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXVpbnQxNl90IG51bU5laWdoYm9yUmVwb3J0czsKKwl0U2lyTWFjQWRkciBic3NJZDsgICAgICAvKiBGb3IgdGhlIHNlc3Npb24uICovCisJdFNpck5laWdoYm9yQnNzRGVzY3JpcHRpb24gc05laWdoYm9yQnNzRGVzY3JpcHRpb25bMV07Cit9IHRTaXJOZWlnaGJvclJlcG9ydEluZCwgKnRwU2lyTmVpZ2hib3JSZXBvcnRJbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNSUk1CZWFjb25SZXBvcnRSZXF1ZXN0ZWRJZXMgeworCXVpbnQ4X3QgbnVtOworCXVpbnQ4X3QgKnBFbGVtZW50SWRzOworfSB0UlJNQmVhY29uUmVwb3J0UmVxdWVzdGVkSWVzLCAqdHBSUk1CZWFjb25SZXBvcnRSZXF1ZXN0ZWRJZXM7CisKKy8qIFJlcG9ydGluZyBkZXRhaWwgZGVmaW5lcy4gKi8KKy8qIFJlZmVyZW5jZSAtIElFRUUgU3RkIDgwMi4xMWstMjAwOCBzZWN0aW9uIDcuMy4yLjIxLjYgVGFibGUgNy0yOWggKi8KKyNkZWZpbmUgQkVBQ09OX1JFUE9SVElOR19ERVRBSUxfTk9fRkZfSUUgMAorI2RlZmluZSBCRUFDT05fUkVQT1JUSU5HX0RFVEFJTF9BTExfRkZfUkVRX0lFIDEKKyNkZWZpbmUgQkVBQ09OX1JFUE9SVElOR19ERVRBSUxfQUxMX0ZGX0lFIDIKKwordHlwZWRlZiBzdHJ1Y3Qgc1JSTVJlcSB7CisJdWludDhfdCBkaWFsb2dfdG9rZW47ICAgLyogSW4gYWN0aW9uIGZyYW1lOyAqLworCXVpbnQ4X3QgdG9rZW47ICAgICAgICAgIC8qIFdpdGhpbiBpbmRpdmlkdWFsIHJlcXVlc3Q7ICovCisJdWludDhfdCB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcmVwb3J0aW5nRGV0YWlsOworCQkJdFJSTUJlYWNvblJlcG9ydFJlcXVlc3RlZEllcyByZXFJZXM7CisJCX0gQmVhY29uOworCX0gcmVxdWVzdDsKKwl1aW50OF90IHNlbmRFbXB0eUJjblJwdDsKK30gdFJSTVJlcSwgKnRwUlJNUmVxOworCit0eXBlZGVmIHN0cnVjdCBzUlJNQ2FwcyB7CisJdWludDhfdCBMaW5rTWVhc3VyZW1lbnQ6MTsKKwl1aW50OF90IE5laWdoYm9yUnB0OjE7CisJdWludDhfdCBwYXJhbGxlbDoxOworCXVpbnQ4X3QgcmVwZWF0ZWQ6MTsKKwl1aW50OF90IEJlYWNvblBhc3NpdmU6MTsKKwl1aW50OF90IEJlYWNvbkFjdGl2ZToxOworCXVpbnQ4X3QgQmVhY29uVGFibGU6MTsKKwl1aW50OF90IEJlYWNvblJlcENvbmQ6MTsKKwl1aW50OF90IEZyYW1lTWVhc3VyZW1lbnQ6MTsKKwl1aW50OF90IENoYW5uZWxMb2FkOjE7CisJdWludDhfdCBOb2lzZUhpc3RvZ3JhbToxOworCXVpbnQ4X3Qgc3RhdGlzdGljczoxOworCXVpbnQ4X3QgTENJTWVhc3VyZW1lbnQ6MTsKKwl1aW50OF90IExDSUF6aW11dGg6MTsKKwl1aW50OF90IFRDTUNhcGFiaWxpdHk6MTsKKwl1aW50OF90IHRyaWdnZXJlZFRDTToxOworCXVpbnQ4X3QgQVBDaGFuUmVwb3J0OjE7CisJdWludDhfdCBSUk1NSUJFbmFibGVkOjE7CisJdWludDhfdCBvcGVyYXRpbmdDaGFuTWF4OjM7CisJdWludDhfdCBub25PcGVyYXRpbmdDaGFuTWF4OjM7CisJdWludDhfdCBNZWFzdXJlbWVudFBpbG90OjM7CisJdWludDhfdCBNZWFzdXJlbWVudFBpbG90RW5hYmxlZDoxOworCXVpbnQ4X3QgTmVpZ2hib3JUU0ZPZmZzZXQ6MTsKKwl1aW50OF90IFJDUElNZWFzdXJlbWVudDoxOworCXVpbnQ4X3QgUlNOSU1lYXN1cmVtZW50OjE7CisJdWludDhfdCBCc3NBdmdBY2Nlc3NEZWxheToxOworCXVpbnQ4X3QgQlNTQXZhaWxBZG1pc3Npb246MTsKKwl1aW50OF90IEFudGVubmFJbmZvcm1hdGlvbjoxOworCXVpbnQ4X3QgZmluZV90aW1lX21lYXNfcnB0OjE7CisJdWludDhfdCBsY2lfY2FwYWJpbGl0eToxOworCXVpbnQ4X3QgcmVzZXJ2ZWQ6NDsKK30gdFJSTUNhcHMsICp0cFJSTUNhcHM7CisKK3R5cGVkZWYgc3RydWN0IHNScm1QRUNvbnRleHQgeworCXVpbnQ4X3QgcnJtRW5hYmxlOworCS8qCisJICogVXNlZCBkdXJpbmcgc2Nhbi9tZWFzdXJlbWVudCB0byBzdG9yZSB0aGUgc3RhcnQgVFNGLgorCSAqIHRoaXMgaXMgbm90IHVzZWQgZGlyZWN0bHkgaW4gYmVhY29uIHJlcG9ydHMuCisJICovCisJdWludDMyX3Qgc3RhcnRUU0ZbMl07CisJLyoKKwkgKiBUaGlzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIGJzc2Rlc2NyaXB0aW9uIGFuZCBiZWFjb24gcmVwb3J0CisJICogZ2V0cyBpdCBmcm9tIGJzcyBkZWNzcmlwdGlvbi4KKwkgKi8KKwl0UlJNQ2FwcyBycm1FbmFibGVkQ2FwczsKKwl0UG93ZXJkQm0gdHhNZ210UG93ZXI7CisJLyogRGlhbG9nIHRva2VuIGZvciB0aGUgcmVxdWVzdCBpbml0aWF0ZWQgZnJvbSBzdGF0aW9uLiAqLworCXVpbnQ4X3QgRGlhbG9nVG9rZW47CisJdHBSUk1SZXEgcEN1cnJlbnRSZXE7Cit9IHRScm1QRUNvbnRleHQsICp0cFJybVBFQ29udGV4dDsKKworLyogMjAwOCAxMWsgc3BlYyByZWZlcmVuY2U6IDE4LjQuOC41IFJDUEkgTWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgUkNQSV9MT1dfUlNTSV9WQUxVRSAgICgtMTEwKQorI2RlZmluZSBSQ1BJX01BWF9WQUxVRSAgICAgICAgKDIyMCkKKyNkZWZpbmUgQ0FMQ1VMQVRFX1JDUEkocnNzaSkgICgoKHJzc2kpICsgMTEwKSAqIDIpCisKKyNlbmRpZiAvKiAjaWYgZGVmaW5lZCBfX1JSTUdMT0JBTF9IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvaW5jbHVkZS9zY2hfYXBpLmggYi9jb3JlL21hYy9zcmMvcGUvaW5jbHVkZS9zY2hfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYjgwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL3NjaF9hcGkuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBBdXRob3I6ICAgICAgU2FuZGVzaCBHb2VsCisgKiBEYXRlOiAgICAgICAgMDIvMjUvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmbmRlZiBfX1NDSF9BUElfSF9fCisjZGVmaW5lIF9fU0NIX0FQSV9IX18KKworI2luY2x1ZGUgInNpcl9jb21tb24uaCIKKyNpbmNsdWRlICJzaXJfbWFjX3Byb3RfZGVmLmgiCisKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisKKy8qIC8gU2VuZCBzdGFydCBzY2FuIHJlc3BvbnNlIG1lc3NhZ2UgKi8KK2V4dGVybiB2b2lkIHNjaF9zZW5kX3N0YXJ0X3NjYW5fcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvKiB1cGRhdGUgb25seSB0aGUgYnJvYWRjYXN0IHFvcyBwYXJhbXMgKi8KK2V4dGVybiB2b2lkIHNjaF9xb3NfdXBkYXRlX2Jyb2FkY2FzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8qIGZpbGwgaW4gdGhlIGRlZmF1bHQgbG9jYWwgZWRjYSBwYXJhbWV0ZXIgaW50byBnTGltRWRjYVBhcmFtc1tdICovCitleHRlcm4gdm9pZCBzY2hfc2V0X2RlZmF1bHRfZWRjYV9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FKTsKKworLyogdXBkYXRlIG9ubHkgbG9jYWwgcW9zIHBhcmFtcyAqLworZXh0ZXJuIHZvaWQgc2NoX3Fvc191cGRhdGVfbG9jYWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8qIHVwZGF0ZSB0aGUgZWRjYSBwcm9maWxlIHBhcmFtZXRlcnMgKi8KK2V4dGVybiB2b2lkIHNjaF9lZGNhX3Byb2ZpbGVfdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvKiAvIFNldCB0aGUgZml4ZWQgZmllbGRzIGluIGEgYmVhY29uIGZyYW1lICovCitleHRlcm4gdFNpclJldFN0YXR1cyBzY2hfc2V0X2ZpeGVkX2JlYWNvbl9maWVsZHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLyogLyBJbml0aWFsaXplIGdsb2JhbHMgKi8KK2V4dGVybiB2b2lkIHNjaF9pbml0X2dsb2JhbHModHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8qIC8gSW5pdGlhbGl6ZSBDRiBQb2xsIHRlbXBsYXRlICovCitleHRlcm4gdm9pZCBzY2hfaW5pdGlhbGl6ZUNmUG9sbFRlbXBsYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvKiAvIEluaXRpYWxpemUgQ0YgRW5kIHRlbXBsYXRlICovCitleHRlcm4gdm9pZCBzY2hfaW5pdGlhbGl6ZUNmRW5kVGVtcGxhdGUodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8qIC8gUHJvY2VzcyB0aGUgc2NoZWR1bGVyIG1lc3NhZ2VzICovCitleHRlcm4gdm9pZCBzY2hfcHJvY2Vzc19tZXNzYWdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwU2NoTXNnKTsKKworLyogLyBUaGUgYmVhY29uIEluZGljYXRpb24gaGFuZGxlciBmdW5jdGlvbiAqLworZXh0ZXJuIHZvaWQgc2NoX3Byb2Nlc3NfcHJlX2JlYWNvbl9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZyk7CisKKy8qIC8gUG9zdCBhIG1lc3NhZ2UgdG8gdGhlIHNjaGVkdWxlciBtZXNzYWdlIHF1ZXVlICovCitleHRlcm4gdFNpclJldFN0YXR1cyBzY2hfcG9zdF9tZXNzYWdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKTsKKworZXh0ZXJuIHZvaWQgc2NoX2JlYWNvbl9wcm9jZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sCisJCQkgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CitleHRlcm4gdFNpclJldFN0YXR1cyBzY2hfYmVhY29uX2VkY2FfcHJvY2Vzcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgIHRTaXJNYWNFZGNhUGFyYW1TZXRJRSAqZWRjYSwKKwkJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordm9pZCBzY2hfZ2VuZXJhdGVfdGltKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICoqLCB1aW50MTZfdCAqLCB1aW50OF90KTsKKyNkZWZpbmUgU0NIX1JSX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgKFNDSF9SUl9USU1FT1VUX01TIC8gU1lTX1RJQ0tfRFVSX01TKQorCit2b2lkIHNjaF9zZXRfYmVhY29uX2ludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit0U2lyUmV0U3RhdHVzIHNjaF9zZW5kX2JlYWNvbl9yZXEodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwgdWludDE2X3QsCisJCQkJICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordFNpclJldFN0YXR1cyBsaW1fdXBkYXRlX3Byb2JlX3JzcF90ZW1wbGF0ZV9pZV9iaXRtYXBfYmVhY29uMSh0cEFuaVNpckdsb2JhbCwKKwkJCQkJCQkgICAgICB0RG90MTFmQmVhY29uMSAqLAorCQkJCQkJCSAgICAgIHRwUEVTZXNzaW9uCisJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbV91cGRhdGVfcHJvYmVfcnNwX3RlbXBsYXRlX2llX2JpdG1hcF9iZWFjb24yKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmQmVhY29uMiAqLAorCQkJCQkJICAgICB1aW50MzJfdCAqLAorCQkJCQkJICAgICB0RG90MTFmUHJvYmVSZXNwb25zZSAqKTsKK3ZvaWQgc2V0X3Byb2JlX3JzcF9pZV9iaXRtYXAodWludDMyX3QgKiwgdWludDMyX3QpOwordWludDMyX3QgbGltX3NlbmRfcHJvYmVfcnNwX3RlbXBsYXRlX3RvX2hhbCh0cEFuaVNpckdsb2JhbCwgdHBQRVNlc3Npb24sIHVpbnQzMl90ICopOworCitpbnQgc2NoX2dlbl90aW1pbmdfYWR2ZXJ0X2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHNlbGZfYWRkciwKKwl1aW50OF90ICoqYnVmLCB1aW50MzJfdCAqdGltZXN0YW1wX29mZnNldCwgdWludDMyX3QgKnRpbWVfdmFsdWVfb2Zmc2V0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvaW5jbHVkZS9zY2hfZ2xvYmFsLmggYi9jb3JlL21hYy9zcmMvcGUvaW5jbHVkZS9zY2hfZ2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlYmU5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9pbmNsdWRlL3NjaF9nbG9iYWwuaApAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19TQ0hfR0xPQkFMX0hfXworI2RlZmluZSBfX1NDSF9HTE9CQUxfSF9fCisKKyNpbmNsdWRlICJzaXJfbWFjX3Byb3BfZXh0cy5oIgorI2luY2x1ZGUgImxpbV9nbG9iYWwuaCIKKworI2luY2x1ZGUgInBhcnNlcl9hcGkuaCIKKworI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQorI2RlZmluZSBUSU1fSUVfU0laRSAweEIKKyNlbHNlCisjZGVmaW5lIFRJTV9JRV9TSVpFIDB4NworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlYWNvbiBwcm9jZXNzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAvIEJlYWNvbiBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgdFNjaEJlYWNvblN0cnVjdCB0U2lyUHJvYmVSZXNwQmVhY29uCisjZGVmaW5lIHRwU2NoQmVhY29uU3RydWN0IHN0cnVjdCBzU2lyUHJvYmVSZXNwQmVhY29uICoKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAqKioqKioqKioqKioqKioqKiogTUlTQyBkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdHJ1Y3Qgc2NoTWlzYyB7CisJdWludDE2X3QgZ1NjaEJlYWNvbkludGVydmFsOworCisJLyogLyBDdXJyZW50IENGUCBjb3VudCAqLworCXVpbnQ4X3QgZ1NjaENGUENvdW50OworCisJLyogLyBDRlAgRHVyYXRpb24gcmVtYWluaW5nICovCisJdWludDhfdCBnU2NoQ0ZQRHVyUmVtYWluaW5nOworCisJLyogLyBDRlAgTWF4aW11bSBEdXJhdGlvbiAqLworCXVpbnQ4X3QgZ1NjaENGUE1heER1cmF0aW9uOworCisJLyogLyBDdXJyZW50IERUSU0gY291bnQgKi8KKwl1aW50OF90IGdTY2hEVElNQ291bnQ7CisKKwkvKiAvIFdoZXRoZXIgd2UgaGF2ZSBpbml0aWF0ZWQgYSBDRlAgb3Igbm90ICovCisJdWludDhfdCBnU2NoQ0ZQSW5pdGlhdGVkOworCisJLyogLyBXaGV0aGVyIHdlIGhhdmUgaW5pdGlhdGVkIGEgQ0ZCIG9yIG5vdCAqLworCXVpbnQ4X3QgZ1NjaENGQkluaXRpYXRlZDsKKworCS8qIC8gQ0ZQIGlzIGVuYWJsZWQgYW5kIEFQIGlzIGNvbmZpZ3VyZWQgYXMgSENGICovCisJdWludDhfdCBnU2NoQ0ZQRW5hYmxlZDsKKworCS8qIC8gQ0ZCIGlzIGVuYWJsZWQgYW5kIEFQIGlzIGNvbmZpZ3VyZWQgYXMgSENGICovCisJdWludDhfdCBnU2NoQ0ZCRW5hYmxlZDsKKworCS8qIC0tLS0tLS0tLSBTVEEgT05MWSBzdGF0ZSAtLS0tLS0tLS0tLSAqLworCisJLyogLyBJbmRpY2F0ZXMgd2hldGhlciBSUiB0aW1lciBpcyBydW5uaW5nIG9yIG5vdCAqLworCXVpbnQ4X3QgcnJUaW1lcls4XTsKKworCS8qIC8gSW5kaWNhdGVzIHRoZSByZW1haW5pbmcgUlIgdGltZW91dCB2YWx1ZSBpZiB0aGUgUlIgdGltZXIgaXMgcnVubmluZyAqLworCXVpbnQxNl90IHJyVGltZW91dFs4XTsKKworCS8qIC8gTnVtYmVyIG9mIFJScyB0cmFuc21pdHRlZCAqLworCXVpbnQxNl90IG51bVJSWzhdOworCXVpbnQxNl90IG51bVJSdGltZW91dHNbOF07CisKKwkvKiAvIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBiZWFjb24gdGVtcGxhdGUgaGFzIGJlZW4gdXBkYXRlZCAqLworCXVpbnQ4X3QgZkJlYWNvbkNoYW5nZWQ7CisKKwl1aW50MTZfdCBwMnBJZU9mZnNldDsKKworfTsKKworLyogKioqKioqKioqKioqKioqKioqIE1JU0MgZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2NoU3RhV2FpdExpc3QgeworCXVpbnQxNl90IHN0YUlkOworCXVpbnQxNl90IGNvdW50OworfSB0U3RhV2FpdExpc3QsICp0cFN0YVdhaXRMaXN0OworCisvKiAvIEdsb2JhbCBTQ0ggc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBzQW5pU2lyU2NoIHsKKwkvKiAvIFRoZSBzY2hlZHVsZXIgb2JqZWN0ICovCisJc3RydWN0IHNjaE1pc2Mgc2NoT2JqZWN0OworCisJLyogc2NoUW9TQ2xhc3MgdW5zb2xpY2l0ZWQ7ICovCisKKwkvKiAvIFdoZXRoZXIgSENGIGlzIGVuYWJsZWQgb3Igbm90ICovCisJdWludDhfdCBnU2NoSGNmRW5hYmxlZDsKKworCS8qIC8gV2hldGhlciBzY2FuIGlzIHJlcXVlc3RlZCBieSBMSU0gb3Igbm90ICovCisJdWludDhfdCBnU2NoU2NhblJlcXVlc3RlZDsKKworCS8qIC8gV2hldGhlciBzY2FuIHJlcXVlc3QgaXMgcmVjZWl2ZWQgYnkgU0NIIG9yIG5vdCAqLworCXVpbnQ4X3QgZ1NjaFNjYW5SZXFSY3ZkOworCisJLyogLyBEZWJ1ZyBmbGFnIHRvIGRpc2FibGUgYmVhY29uIGdlbmVyYXRpb24gKi8KKwl1aW50MzJfdCBnU2NoR2VuQmVhY29uOworCisjZGVmaW5lIFNDSF9NQVhfQVJSIDEwMAorCXVpbnQzMl90IGdTY2hCZWFjb25zV3JpdHRlbjsKKwl1aW50MzJfdCBnU2NoQmVhY29uc1NlbnQ7CisJdWludDMyX3QgZ1NjaEJCWHBvcnRSY3ZDbnQ7CisJdWludDMyX3QgZ1NjaFJSUmN2Q250LCBxb3NOdWxsQ250OworCXVpbnQzMl90IGdTY2hCY25SY3ZDbnQ7CisJdWludDMyX3QgZ1NjaFVua25vd25SY3ZDbnQ7CisKKwl1aW50MzJfdCBnU2NoQmNuUGFyc2VFcnJvckNudDsKKwl1aW50MzJfdCBnU2NoQmNuSWdub3JlZDsKKworCXVpbnQzMl90IG51bVBvbGwsIG51bURhdGEsIG51bUNvcnJ1cHQ7CisJdWludDMyX3QgbnVtQm9ndXNJbnQsIG51bVR4QWN0MDsKKworI2RlZmluZSBTQ0hfTUFYX05VTV9TQ0ggMjEKKwl1aW50MzJfdCBsYXN0QmVhY29uTGVuZ3RoOworCXVpbnQxNl90IHJyVGltZW91dDsKKwl1aW50MzJfdCBwb2xsUGVyaW9kOworCXVpbnQzMl90IG11bHRpcGxlU2NoZWQ7CisJdWludDMyX3QgcG9sbEZlZWRiYWNrSGlzdFs4XTsKKwl1aW50MzJfdCBkYXRhRmVlZGJhY2tIaXN0WzhdOworCXVpbnQzMl90IG1heFBvbGxUaW1lb3V0czsKKwl1aW50MzJfdCBjaGVja0NmYkZsYWdTdHVjazsKKworCS8qIC8gU3RhIFdhaXQgbGlzdCAqLworCXRwU3RhV2FpdExpc3QgcFN0YVdhaXRMaXN0OworCisJLyogLyBQb2ludGVyIHRvIG5leHQgYXZhaWxhYmxlIGVudHJ5IGluIHN0YSB3YWl0IGxpc3QgKi8KKwl1aW50MTZfdCBzdGFXYWl0TGlzdEluOworCS8qIC8gUG9pbnRlciB0byBmaXJzdCB3YWl0aW5nIHN0YSBpbiBzdGEgd2FpdCBsaXN0ICovCisJdWludDE2X3Qgc3RhV2FpdExpc3RPdXQ7CisJLyogLyBUb3RhbCBudW1iZXIgb2Ygd2FpdGluZyBTVEFzIGluIHN0YSB3YWl0IGxpc3QgKi8KKwl1aW50MTZfdCBzdGFXYWl0TGlzdENvdW50OworCS8qIC8gVG90YWwgbnVtYmVyIG9mIHNjaGVkdWxlcyB0byBiZSB3YWl0ZWQgKi8KKwl1aW50MTZfdCBzdGFXYWl0TGlzdFRvdGFsV2FpdDsKKworCS8qIC8gTnVtYmVyIG9mIGVudHJpZXMgaW4gRFBIIGFjdGl2aXR5IHF1ZXVlIHRoYXQgd2VyZSBpZ25vcmVkICovCisJdWludDMyX3QgaWdub3JlRHBoOworCit9IHRBbmlTaXJTY2gsICp0cEFuaVNpclNjaDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvaW5jbHVkZS93bW1fYXBzZC5oIGIvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvd21tX2Fwc2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjVkNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2luY2x1ZGUvd21tX2Fwc2QuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fV01NQVBTRF9IX18KKyNkZWZpbmUgX19XTU1BUFNEX0hfXworCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorCisvKiBVQVBTRCBGbGFnIGZvciBlYWNoIEFDIChXTU0gc3BlYyAyLjIuMSkgKi8KKyNkZWZpbmUgTElNX1VBUFNEX0JJVE9GRlNFVF9BQ1ZPICAgICAwCisjZGVmaW5lIExJTV9VQVBTRF9CSVRPRkZTRVRfQUNWSSAgICAgMQorI2RlZmluZSBMSU1fVUFQU0RfQklUT0ZGU0VUX0FDQksgICAgIDIKKyNkZWZpbmUgTElNX1VBUFNEX0JJVE9GRlNFVF9BQ0JFICAgICAzCisKKyNkZWZpbmUgTElNX1VBUFNEX0ZMQUdfQUNWTyAgICAgKDEgPDwgTElNX1VBUFNEX0JJVE9GRlNFVF9BQ1ZPKQorI2RlZmluZSBMSU1fVUFQU0RfRkxBR19BQ1ZJICAgICAoMSA8PCBMSU1fVUFQU0RfQklUT0ZGU0VUX0FDVkkpCisjZGVmaW5lIExJTV9VQVBTRF9GTEFHX0FDQksgICAgICgxIDw8IExJTV9VQVBTRF9CSVRPRkZTRVRfQUNCSykKKyNkZWZpbmUgTElNX1VBUFNEX0ZMQUdfQUNCRSAgICAgKDEgPDwgTElNX1VBUFNEX0JJVE9GRlNFVF9BQ0JFKQorCisjZGVmaW5lIExJTV9VQVBTRF9HRVQoYWMsIG1hc2spICAgICAgKCgobWFzaykgJiAoTElNX1VBUFNEX0ZMQUdfICMjIGFjKSkgPj4gTElNX1VBUFNEX0JJVE9GRlNFVF8gIyMgYWMpCisKKy8qIERlZmluaXRpb24gZm9yIHNldHRpbmcvY2xlYXJpbmcgVWFwc2QgTWFzayAqLworI2RlZmluZSBTRVRfVUFQU0RfTUFTSyAgICAxCisjZGVmaW5lIENMRUFSX1VBUFNEX01BU0sgIDAKKworI2VuZGlmIC8qIF9fV01NQVBTRF9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX2FkbWl0X2NvbnRyb2wuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX2FkbWl0X2NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjE3YzQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fYWRtaXRfY29udHJvbC5jCkBAIC0wLDAgKzEsMTE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBUU1BFQyBhbmQgU1RBIGFkbWl0IGNvbnRyb2wgcmVsYXRlZCBmdW5jdGlvbnMKKyAqIE5PVEU6IGFwcGxpZXMgb25seSB0byBBUCBidWlsZHMKKyAqCisgKiBBdXRob3I6ICAgICAgU2FuZGVzaCBHb2VsCisgKiBEYXRlOiAgICAgICAgMDIvMjUvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJsaW1fZGVidWcuaCIKKyNpbmNsdWRlICJzeXNfZGVmLmgiCisjaW5jbHVkZSAibGltX2FwaS5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIgICAgICAgICAgICAgLyogd2xhbl9jZmdfZ2V0X2ludCgpICovCisjaW5jbHVkZSAibGltX3RyYWNlLmgiCisjaW5jbHVkZSAibGltX3NlbmRfc21lX3JzcF9tZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbV90eXBlcy5oIgorCisjZGVmaW5lIEFETUlUX0NPTlRST0xfTE9HTEVWRUwgICAgICAgIExPRzEKKyNkZWZpbmUgQURNSVRfQ09OVFJPTF9QT0xJQ1lfTE9HTEVWRUwgTE9HMQorCisvKiB0b3RhbCBhdmFpbGFibGUgYmFuZHdpZHRoIGluIGJwcyBpbiBlYWNoIHBoeSBtb2RlCisgKiB0aGVzZSBzaG91bGQgYmUgZGVmaW5lZCBpbiBoYWwgb3IgZHBoIC0gcmVwbGFjZSB0aGVzZSBsYXRlcgorICovCisjZGVmaW5lIExJTV9UT1RBTF9CV18xMUEgICA1NDAwMDAwMAorI2RlZmluZSBMSU1fTUlOX0JXXzExQSAgICAgNjAwMDAwMAorI2RlZmluZSBMSU1fVE9UQUxfQldfMTFCICAgMTEwMDAwMDAKKyNkZWZpbmUgTElNX01JTl9CV18xMUIgICAgIDEwMDAwMDAKKyNkZWZpbmUgTElNX1RPVEFMX0JXXzExRyAgIExJTV9UT1RBTF9CV18xMUEKKyNkZWZpbmUgTElNX01JTl9CV18xMUcgICAgIExJTV9NSU5fQldfMTFCCisKKy8qIGNvbnZlcnNpb24gZmFjdG9ycyAqLworI2RlZmluZSBMSU1fQ09OVkVSVF9TSVpFX0JJVFMobnVtQnl0ZXMpICgobnVtQnl0ZXMpICogOCkKKyNkZWZpbmUgTElNX0NPTlZFUlRfUkFURV9NQlBTKHJhdGUpICAgICAoKHJhdGUpLzEwMDAwMDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogbG9jYWwgcHJvdG9zICovCisKK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitsaW1fY2FsY3VsYXRlX3N2Y19pbnQodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNUc3BlY0lFICosIHVpbnQzMl90ICopOworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2xpbV92YWxpZGF0ZV90c3BlY19lZGNhKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjVHNwZWNJRSAqLCB0cFBFU2Vzc2lvbik7CitzdGF0aWMgdFNpclJldFN0YXR1cworbGltX3ZhbGlkYXRlX3RzcGVjKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjVHNwZWNJRSAqLCB0cFBFU2Vzc2lvbik7CitzdGF0aWMgdm9pZAorbGltX2NvbXB1dGVfbWVhbl9id191c2VkKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCAqLCB1aW50MzJfdCwgdHBMaW1Uc3BlY0luZm8sCisJCQkgdHBQRVNlc3Npb24pOworc3RhdGljIHZvaWQgbGltX2dldF9hdmFpbGFibGVfYncodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90ICosIHVpbnQzMl90ICosIHVpbnQzMl90LAorCQkJCSB1aW50MzJfdCk7CitzdGF0aWMgdFNpclJldFN0YXR1cyBsaW1fYWRtaXRfcG9saWN5X292ZXJzdWJzY3JpcHRpb24odHBBbmlTaXJHbG9iYWwsCisJCQkJCQkgICAgICAgdFNpck1hY1RzcGVjSUUgKiwKKwkJCQkJCSAgICAgICB0cExpbUFkbWl0UG9saWN5SW5mbywKKwkJCQkJCSAgICAgICB0cExpbVRzcGVjSW5mbywKKwkJCQkJCSAgICAgICB0cFBFU2Vzc2lvbik7CitzdGF0aWMgdFNpclJldFN0YXR1cyBsaW1fdHNwZWNfZmluZF9ieV9zdGFfYWRkcih0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJCQkJdFNpck1hY1RzcGVjSUUgKiwgdHBMaW1Uc3BlY0luZm8sCisJCQkJCQl0cExpbVRzcGVjSW5mbyAqKTsKK3N0YXRpYyB0U2lyUmV0U3RhdHVzIGxpbV92YWxpZGF0ZV9hY2Nlc3NfcG9saWN5KHRwQW5pU2lyR2xvYmFsLCB1aW50OF90LCB1aW50MTZfdCwKKwkJCQkJCXRwUEVTZXNzaW9uKTsKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fY2FsY3VsYXRlX3N2Y19pbnQKKyAgIFxicmllZiBUU1BFQyB2YWxpZGF0aW9uIGFuZCBzZXJ2Y2llIGludGVydmFsIGRldGVybWluYXRpb24KKyAgIFxwYXJhbSAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworICAgXHBhcmFtICAgICAgICAgdFNpck1hY1RzcGVjSUUgKnBUc3BlYworICAgXHBhcmFtICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAqcFN2Y0ludAorICAgXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzIG9mIHRoZSBjb21wYXJpc29uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2xpbV9jYWxjdWxhdGVfc3ZjX2ludCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgICAgICB0U2lyTWFjVHNwZWNJRSAqcFRzcGVjLCB1aW50MzJfdCAqcFN2Y0ludCkKK3sKKwl1aW50MzJfdCBtc2R1U3osIGRhdGFSYXRlOworCSpwU3ZjSW50ID0gMDsKKworCS8qIGlmIGEgc2VydmljZSBpbnRlcnZhbCBpcyBhbHJlYWR5IHNwZWNpZmllZCwgd2UgYXJlIGRvbmUgKi8KKwlpZiAoKHBUc3BlYy0+bWluU3ZjSW50ZXJ2YWwgIT0gMCkgfHwgKHBUc3BlYy0+bWF4U3ZjSW50ZXJ2YWwgIT0gMCkpIHsKKwkJKnBTdmNJbnQgPSAocFRzcGVjLT5tYXhTdmNJbnRlcnZhbCAhPSAwKQorCQkJICAgPyBwVHNwZWMtPm1heFN2Y0ludGVydmFsIDogcFRzcGVjLT5taW5TdmNJbnRlcnZhbDsKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwl9CisKKwkvKiBNYXNraW5nIG9mZiB0aGUgZml4ZWQgYml0cyBhY2NvcmRpbmcgdG8gZGVmaW5pdGlvbiBvZiBNU0RVIHNpemUKKwkgKiBpbiBJRUVFIDgwMi4xMS0yMDA3IHNwZWMgKHNlY3Rpb24gNy4zLjIuMzApLiBOb21pbmFsIE1TRFUgc2l6ZQorCSAqIGlzIGRlZmluZWQgYXM6ICBCaXRbMDoxNF09U2l6ZSwgQml0WzE1XT1GaXhlZAorCSAqLworCWlmIChwVHNwZWMtPm5vbU1zZHVTeiAhPSAwKQorCQltc2R1U3ogPSAocFRzcGVjLT5ub21Nc2R1U3ogJiAweDdmZmYpOworCWVsc2UgaWYgKHBUc3BlYy0+bWF4TXNkdVN6ICE9IDApCisJCW1zZHVTeiA9IHBUc3BlYy0+bWF4TXNkdVN6OworCWVsc2UgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiTXNkdVNpemUgbm90IHNwZWNpZmllZCIpKTspCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJLyogbmVlZCB0byBjYWxjdWxhdGUgYSByZWFzb25hYmxlIHNlcnZpY2UgaW50ZXJ2YWwKKwkgKiB0aGlzIGlzIHNpbXBseSB0aGUgbXNkdVN6L21lYW5EYXRhUmF0ZQorCSAqLworCWlmIChwVHNwZWMtPm1lYW5EYXRhUmF0ZSAhPSAwKQorCQlkYXRhUmF0ZSA9IHBUc3BlYy0+bWVhbkRhdGFSYXRlOworCWVsc2UgaWYgKHBUc3BlYy0+cGVha0RhdGFSYXRlICE9IDApCisJCWRhdGFSYXRlID0gcFRzcGVjLT5wZWFrRGF0YVJhdGU7CisJZWxzZSBpZiAocFRzcGVjLT5taW5EYXRhUmF0ZSAhPSAwKQorCQlkYXRhUmF0ZSA9IHBUc3BlYy0+bWluRGF0YVJhdGU7CisJZWxzZSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJEYXRhUmF0ZSBub3Qgc3BlY2lmaWVkIikpOykKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwkqcFN2Y0ludCA9CisJCUxJTV9DT05WRVJUX1NJWkVfQklUUyhtc2R1U3opIC8gTElNX0NPTlZFUlRfUkFURV9NQlBTKGRhdGFSYXRlKTsKKwlyZXR1cm4gZVNJUl9GQUlMVVJFOworfQorCisvKioKKyAqIGxpbV92YWxpZGF0ZV90c3BlY19lZGNhKCkgLSBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVycworICogQG1hY19jdHg6IEdsb2JhbCBNQUMgY29udGV4dAorICogQHRzcGVjOiAgIFBvaW50ZXIgdG8gdGhlIFRTUEVDCisgKiBAc2Vzc2lvbl9lbnRyeTogU2Vzc2lvbiBFbnRyeQorICoKKyAqIHZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzIGluIHRoZSBlZGNhIHRzcGVjCisgKiBtYW5kYXRvcnkgZmllbGRzIGFyZSBkZXJpdmVkIGZyb20gMTFlIEFubmV4IEkgKFRhYmxlIEkuMSkKKyAqCisgKiBSZXR1cm46IFN0YXR1cworICoqLworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2xpbV92YWxpZGF0ZV90c3BlY19lZGNhKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQl0U2lyTWFjVHNwZWNJRSAqdHNwZWMsIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJdWludDMyX3QgbWF4X3BoeV9yYXRlLCBtaW5fcGh5X3JhdGU7CisJdWludDMyX3QgcGh5X21vZGU7CisJdFNpclJldFN0YXR1cyByZXR2YWwgPSBlU0lSX1NVQ0NFU1M7CisKKwlsaW1fZ2V0X3BoeV9tb2RlKG1hY19jdHgsICZwaHlfbW9kZSwgc2Vzc2lvbl9lbnRyeSk7CisKKwlsaW1fZ2V0X2F2YWlsYWJsZV9idyhtYWNfY3R4LCAmbWF4X3BoeV9yYXRlLCAmbWluX3BoeV9yYXRlLCBwaHlfbW9kZSwKKwkJCSAgICAgMSAvKiBiYW5kd2lkdGggbXVsdCBmYWN0b3IgKi8pOworCS8qIG1hbmRhdG9yeSBmaWVsZHMgYXJlIGRlcml2ZWQgZnJvbSAxMWUgQW5uZXggSSAoVGFibGUgSS4xKSAqLworCWlmICgodHNwZWMtPm5vbU1zZHVTeiA9PSAwKSB8fAorCSAgICAodHNwZWMtPm1lYW5EYXRhUmF0ZSA9PSAwKSB8fAorCSAgICAodHNwZWMtPnN1cnBsdXNCdyA9PSAwKSB8fAorCSAgICAodHNwZWMtPm1pblBoeVJhdGUgPT0gMCkgfHwKKwkgICAgKHRzcGVjLT5taW5QaHlSYXRlID4gbWF4X3BoeV9yYXRlKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTAorCQkJKCJJbnZhbGlkIEVEQ0EgVHNwZWM6IE5vbU1zZHUgJWQsIG1lYW5EYXRhUmF0ZSAlZCwgc3VycGx1c0J3ICVkLCBtaW5fcGh5X3JhdGUgJWQiKSwKKwkJCXRzcGVjLT5ub21Nc2R1U3osIHRzcGVjLT5tZWFuRGF0YVJhdGUsCisJCQl0c3BlYy0+c3VycGx1c0J3LCB0c3BlYy0+bWluUGh5UmF0ZSk7CisJCXJldHZhbCA9IGVTSVJfRkFJTFVSRTsKKwl9CisKKwlsaW1fbG9nKG1hY19jdHgsIEFETUlUX0NPTlRST0xfTE9HTEVWRUwsCisJCUZMKCJyZXR1cm4gc3RhdHVzICVkIiksIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fdmFsaWRhdGVfdHNwZWMKKyAgIFxicmllZiB2YWxpZGF0ZSB0aGUgb2ZmZXJlZCB0c3BlYworICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworICAgXHBhcmFtICAgICAgICAgdFNpck1hY1RzcGVjSUUgKnBUc3BlYworICAgXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2xpbV92YWxpZGF0ZV90c3BlYyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgICB0U2lyTWFjVHNwZWNJRSAqcFRzcGVjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJSZXRTdGF0dXMgcmV0dmFsID0gZVNJUl9TVUNDRVNTOworCXN3aXRjaCAocFRzcGVjLT50c2luZm8udHJhZmZpYy5hY2Nlc3NQb2xpY3kpIHsKKwljYXNlIFNJUl9NQUNfQUNDRVNTUE9MSUNZX0VEQ0E6CisJCXJldHZhbCA9IGxpbV92YWxpZGF0ZV90c3BlY19lZGNhKHBNYWMsIHBUc3BlYywgcHNlc3Npb25FbnRyeSk7CisJCWlmIChyZXR2YWwgIT0gZVNJUl9TVUNDRVNTKQorCQkJUEVMT0dXKGxpbV9sb2cocE1hYywgTE9HVywgRkwoIkVEQ0EgdHNwZWMgaW52YWxpZCIpKTspCisJCQlicmVhazsKKworCWNhc2UgU0lSX01BQ19BQ0NFU1NQT0xJQ1lfSENDQToKKwljYXNlIFNJUl9NQUNfQUNDRVNTUE9MSUNZX0JPVEg6CisJLyogVEJEOiBzaG91bGQgd2Ugc3VwcG9ydCBoeWJyaWQgdHNwZWMgYXMgd2VsbD8/IGZvciBub3csIGp1c3QgZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiQWNjZXNzVHlwZSAlZCBub3Qgc3VwcG9ydGVkIiksCisJCQlwVHNwZWMtPnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSk7CisJCXJldHZhbCA9IGVTSVJfRkFJTFVSRTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBBZG1pdCBDb250cm9sIFBvbGljeSAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIGxpbV9jb21wdXRlX21lYW5fYndfdXNlZAorICAgXGJyaWVmIGRldGVybWltZSB0aGUgdXNlZC9hbGxvY2F0ZWQgYmFuZHdpZHRoCisgICBccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCisgICBccGFyYW0gICAgICAgdWludDMyX3QgICAgICAgICAgICAgICpwQncKKyAgIFxwYXJhbSAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIHBoeU1vZGUKKyAgIFxwYXJhbSAgICAgICB0cExpbVRzcGVjSW5mbyAgICBwVHNwZWNJbmZvCisgICBccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZAorbGltX2NvbXB1dGVfbWVhbl9id191c2VkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgdWludDMyX3QgKnBCdywKKwkJCSB1aW50MzJfdCBwaHlNb2RlLAorCQkJIHRwTGltVHNwZWNJbmZvIHBUc3BlY0luZm8sIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDMyX3QgY3RzcGVjOworCSpwQncgPSAwOworCWZvciAoY3RzcGVjID0gMDsgY3RzcGVjIDwgTElNX05VTV9UU1BFQ19NQVg7IGN0c3BlYysrLCBwVHNwZWNJbmZvKyspIHsKKwkJaWYgKHBUc3BlY0luZm8tPmludXNlKSB7CisJCQl0cERwaEhhc2hOb2RlIHBTdGEgPQorCQkJCWRwaF9nZXRfaGFzaF9lbnRyeShwTWFjLCBwVHNwZWNJbmZvLT5hc3NvY0lkLAorCQkJCQkJICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQkJaWYgKHBTdGEgPT0gTlVMTCkgeworCQkJCS8qIG1heWJlIHdlIHNob3VsZCBkZWxldGUgdGhlIHRzcGVjPz8gKi8KKwkJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMCisJCQkJCQkoIlRzcGVjICVkIChhc3NvY0lkICVkKTogZHBoTm9kZSBub3QgZm91bmQiKSwKKwkJCQkJY3RzcGVjLCBwVHNwZWNJbmZvLT5hc3NvY0lkKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSpwQncgKz0gcFRzcGVjSW5mby0+dHNwZWMubWVhbkRhdGFSYXRlOworCQl9CisJfQorfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIGxpbV9nZXRfYXZhaWxhYmxlX2J3CisgICBcYnJpZWYgYmFzZWQgb24gdGhlIHBoeSBtb2RlIGFuZCB0aGUgYndfZmFjdG9yLCBkZXRlcm1pbmUgdGhlIHRvdGFsIGJhbmR3aWR0aCB0aGF0CisgICAgICAgY2FuIGJlIHN1cHBvcnRlZAorICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworICAgXHBhcmFtICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAqcE1heEJ3CisgICBccGFyYW0gICAgICAgdWludDMyX3QgICAgICAgICAgICAgICpwTWluQncKKyAgIFxwYXJhbSAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIHBoeU1vZGUKKyAgIFxwYXJhbSAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIGJ3X2ZhY3RvcgorICAgXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQKK2xpbV9nZXRfYXZhaWxhYmxlX2J3KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgdWludDMyX3QgKnBNYXhCdywKKwkJICAgICB1aW50MzJfdCAqcE1pbkJ3LCB1aW50MzJfdCBwaHlNb2RlLCB1aW50MzJfdCBid19mYWN0b3IpCit7CisJc3dpdGNoIChwaHlNb2RlKSB7CisJY2FzZSBXTklfQ0ZHX1BIWV9NT0RFXzExQjoKKwkJKnBNYXhCdyA9IExJTV9UT1RBTF9CV18xMUI7CisJCSpwTWluQncgPSBMSU1fTUlOX0JXXzExQjsKKwkJYnJlYWs7CisKKwljYXNlIFdOSV9DRkdfUEhZX01PREVfMTFBOgorCQkqcE1heEJ3ID0gTElNX1RPVEFMX0JXXzExQTsKKwkJKnBNaW5CdyA9IExJTV9NSU5fQldfMTFBOworCQlicmVhazsKKworCWNhc2UgV05JX0NGR19QSFlfTU9ERV8xMUc6CisJY2FzZSBXTklfQ0ZHX1BIWV9NT0RFX05PTkU6CisJZGVmYXVsdDoKKwkJKnBNYXhCdyA9IExJTV9UT1RBTF9CV18xMUc7CisJCSpwTWluQncgPSBMSU1fTUlOX0JXXzExRzsKKwkJYnJlYWs7CisJfQorCSpwTWF4QncgKj0gYndfZmFjdG9yOworfQorCisvKioKKyAqIGxpbV9hZG1pdF9wb2xpY3lfb3ZlcnN1YnNjcmlwdGlvbigpIC0gQWRtaXNzaW9uIGNvbnRyb2wgcG9saWN5CisgKiBAbWFjX2N0eDogICAgICAgIEdsb2JhbCBNQUMgQ29udGV4dAorICogQHRzcGVjOiAgICAgICAgICBQb2ludGVyIHRvIHRoZSB0c3BlYworICogQGFkbWl0X3BvbGljeTogICBBZG1pc3Npb24gcG9saWN5CisgKiBAdHNwZWNfaW5mbzogICAgIFRTUEVDIGluZm9ybWF0aW9uCisgKiBAc2Vzc2lvbl9lbnRyeTogIFNlc3Npb24gRW50cnkKKyAqCisgKiBzaW1wbGUgYWRtaXNzaW9uIGNvbnRyb2wgcG9saWN5IGJhc2VkIG9uIG92ZXJzdWJzY3JpcHRpb24KKyAqIGlmIHRoZSB0b3RhbCBiYW5kd2lkdGggb2YgYWxsIGFkbWl0dGVkIHRzcGVjJ3MgZXhjZWVkcyAoZmFjdG9yICogcGh5LWJ3KSB0aGVuCisgKiByZWplY3QgdGhlIHRzcGVjLCBlbHNlIGFkbWl0IGl0LiBUaGUgcGh5LWJ3IGlzIHRoZSBwZWFrIGF2YWlsYWJsZSBidyBpbiB0aGUKKyAqIGN1cnJlbnQgcGh5IG1vZGUuIFRoZSAnZmFjdG9yJyBpcyB0aGUgY29uZmlndXJlZCBvdmVyc3Vic2NyaXB0aW9uIGZhY3Rvci4KKyAqCisgKiBSZXR1cm46IFN0YXR1cworICoqLworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2xpbV9hZG1pdF9wb2xpY3lfb3ZlcnN1YnNjcmlwdGlvbih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCSAgdFNpck1hY1RzcGVjSUUgKnRzcGVjLAorCQkJCSAgdHBMaW1BZG1pdFBvbGljeUluZm8gYWRtaXRfcG9saWN5LAorCQkJCSAgdHBMaW1Uc3BlY0luZm8gdHNwZWNfaW5mbywKKwkJCQkgIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJdWludDMyX3QgdG90YWxidywgbWluYncsIHVzZWRidzsKKwl1aW50MzJfdCBwaHlfbW9kZTsKKworCS8qIGRldGVybWluZSB0b3RhbCBiYW5kd2lkdGggdXNlZCBzbyBmYXIgKi8KKwlsaW1fZ2V0X3BoeV9tb2RlKG1hY19jdHgsICZwaHlfbW9kZSwgc2Vzc2lvbl9lbnRyeSk7CisKKwlsaW1fY29tcHV0ZV9tZWFuX2J3X3VzZWQobWFjX2N0eCwgJnVzZWRidywgcGh5X21vZGUsCisJCQl0c3BlY19pbmZvLCBzZXNzaW9uX2VudHJ5KTsKKworCS8qIGRldGVybWluZSBob3cgbXVjaCBidyBpcyBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgcGh5IG1vZGUgKi8KKwlsaW1fZ2V0X2F2YWlsYWJsZV9idyhtYWNfY3R4LCAmdG90YWxidywgJm1pbmJ3LCBwaHlfbW9kZSwKKwkJCSAgICAgYWRtaXRfcG9saWN5LT5id19mYWN0b3IpOworCisJaWYgKHVzZWRidyA+IHRvdGFsYncpICAgLyogdGhpcyBjYW4ndCBwb3NzaWJseSBoYXBwZW4gKi8KKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworCWlmICgodG90YWxidyAtIHVzZWRidykgPCB0c3BlYy0+bWVhbkRhdGFSYXRlKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgQURNSVRfQ09OVFJPTF9QT0xJQ1lfTE9HTEVWRUwsCisJCQlGTAorCQkJKCJUb3RhbCBCVyAlZCwgVXNlZCAlZCwgVHNwZWMgcmVxdWVzdCAlZCBub3QgcG9zc2libGUiKSwKKwkJCXRvdGFsYncsIHVzZWRidywgdHNwZWMtPm1lYW5EYXRhUmF0ZSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX2FkbWl0X3BvbGljeQorICAgXGJyaWVmIGRldGVybWluZSB0aGUgY3VycmVudCBhZG1pdCBjb250cm9sIHBvbGljeSBhbmQgYXBwbHkgaXQgZm9yIHRoZSBvZmZlcmVkIHRzcGVjCisgICBccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCisgICBccGFyYW0gICAgICAgICB0U2lyTWFjVHNwZWNJRSAgICpwVHNwZWMKKyAgIFxyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgbGltX2FkbWl0X3BvbGljeSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgIHRTaXJNYWNUc3BlY0lFICpwVHNwZWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpclJldFN0YXR1cyByZXR2YWwgPSBlU0lSX0ZBSUxVUkU7CisJdHBMaW1BZG1pdFBvbGljeUluZm8gcEFkbWl0UG9saWN5ID0gJnBNYWMtPmxpbS5hZG1pdFBvbGljeUluZm87CisKKwlzd2l0Y2ggKHBBZG1pdFBvbGljeS0+dHlwZSkgeworCWNhc2UgV05JX0NGR19BRE1JVF9QT0xJQ1lfQURNSVRfQUxMOgorCQlyZXR2YWwgPSBlU0lSX1NVQ0NFU1M7CisJCWJyZWFrOworCisJY2FzZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9CV19GQUNUT1I6CisJCXJldHZhbCA9IGxpbV9hZG1pdF9wb2xpY3lfb3ZlcnN1YnNjcmlwdGlvbihwTWFjLCBwVHNwZWMsCisJCQkJCQkJICAgJnBNYWMtPmxpbS4KKwkJCQkJCQkgICBhZG1pdFBvbGljeUluZm8sCisJCQkJCQkJICAgJnBNYWMtPmxpbS50c3BlY0luZm9bMF0sCisJCQkJCQkJICAgcHNlc3Npb25FbnRyeSk7CisJCWlmIChyZXR2YWwgIT0gZVNJUl9TVUNDRVNTKQorCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJyZWplY3RlZCBieSBCV0ZhY3RvciBwb2xpY3kiKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisKKwljYXNlIFdOSV9DRkdfQURNSVRfUE9MSUNZX1JFSkVDVF9BTEw6CisJCXJldHZhbCA9IGVTSVJfRkFJTFVSRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSBlU0lSX1NVQ0NFU1M7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJBZG1pdCBQb2xpY3kgJWQgdW5rbm93biwgYWRtaXR0aW5nIGFsbCB0cmFmZmljIiksCisJCQlwQWRtaXRQb2xpY3ktPnR5cGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fdHNwZWNfZGVsZXRlCisgICBcYnJpZWYgZGVsZXRlIHRoZSBzcGVjaWZpZWQgdHNwZWMKKyAgIFxwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKKyAgIFxwYXJhbSAgICAgdHBMaW1Uc3BlY0luZm8gcEluZm8KKyAgIFxyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBkZWxldGUgdGhlIHNwZWNpZmllZCB0c3BlYyAqLwordm9pZCBsaW1fdHNwZWNfZGVsZXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwTGltVHNwZWNJbmZvIHBJbmZvKQoreworCWlmIChwSW5mbyA9PSBOVUxMKQorCQlyZXR1cm47CisJLyogcGllcnJlICovCisJbGltX2xvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgidHNwZWMgZW50cnkgPSAlZCIpLAorCQlwSW5mby0+aWR4KTsKKwlsaW1fbG9nKHBNYWMsIEFETUlUX0NPTlRST0xfTE9HTEVWRUwsIEZMKCJkZWxldGUgdHNwZWMgJXAiKSwgcEluZm8pOworCXBJbmZvLT5pbnVzZSA9IDA7CisKKwlyZXR1cm47Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX3RzcGVjX2ZpbmRfYnlfc3RhX2FkZHIKKyAgIFxicmllZiBTZW5kIGhhbE1zZ19BZGRUcyB0byBIQUwKKyAgIFxwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKKyAgIFxwYXJhbSAgIFxwYXJhbSAgICAgICB1aW50OF90ICAgICAgICAgICAgICAgKnBBZGRyCisgICBccGFyYW0gICAgICAgdFNpck1hY1RzcGVjSUUgICAgKnBUc3BlY0lFCisgICBccGFyYW0gICAgICAgdHBMaW1Uc3BlY0luZm8gICAgcFRzcGVjTGlzdAorICAgXHBhcmFtICAgICAgIHRwTGltVHNwZWNJbmZvICAgKnBwSW5mbworICAgXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZmluZCB0aGUgc3BlY2lmaWVkIHRzcGVjIGluIHRoZSBsaXN0ICovCitzdGF0aWMgdFNpclJldFN0YXR1cworbGltX3RzcGVjX2ZpbmRfYnlfc3RhX2FkZHIodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgIHVpbnQ4X3QgKnBBZGRyLAorCQkJICAgdFNpck1hY1RzcGVjSUUgKnBUc3BlY0lFLAorCQkJICAgdHBMaW1Uc3BlY0luZm8gcFRzcGVjTGlzdCwgdHBMaW1Uc3BlY0luZm8gKnBwSW5mbykKK3sKKwlpbnQgY3RzcGVjOworCisJKnBwSW5mbyA9IE5VTEw7CisKKwlmb3IgKGN0c3BlYyA9IDA7IGN0c3BlYyA8IExJTV9OVU1fVFNQRUNfTUFYOyBjdHNwZWMrKywgcFRzcGVjTGlzdCsrKSB7CisJCWlmICgocFRzcGVjTGlzdC0+aW51c2UpCisJCSAgICAmJgorCQkgICAgKGNkZl9tZW1fY29tcGFyZQorCQkJICAgICAocEFkZHIsIHBUc3BlY0xpc3QtPnN0YUFkZHIsIHNpemVvZihwVHNwZWNMaXN0LT5zdGFBZGRyKSkpCisJCSAgICAmJgorCQkgICAgKGNkZl9tZW1fY29tcGFyZQorCQkJICAgICAoKHVpbnQ4X3QgKikgcFRzcGVjSUUsICh1aW50OF90ICopICZwVHNwZWNMaXN0LT50c3BlYywKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNUc3BlY0lFKSkpKSB7CisJCQkqcHBJbmZvID0gcFRzcGVjTGlzdDsKKwkJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisJCX0KKwl9CisJcmV0dXJuIGVTSVJfRkFJTFVSRTsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fdHNwZWNfZmluZF9ieV9hc3NvY19pZAorICAgXGJyaWVmIGZpbmQgdHNwZWMgd2l0aCBtYXRjaGluIHN0YWlkIGFuZCBUc3BlYworICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworICAgXHBhcmFtICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgc3RhaWQKKyAgIFxwYXJhbSAgICAgICB0U2lyTWFjVHNwZWNJRSAgICAqcFRzcGVjSUUKKyAgIFxwYXJhbSAgICAgICB0cExpbVRzcGVjSW5mbyAgICBwVHNwZWNMaXN0CisgICBccGFyYW0gICAgICAgdHBMaW1Uc3BlY0luZm8gICAqcHBJbmZvCisgICBccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzCitsaW1fdHNwZWNfZmluZF9ieV9hc3NvY19pZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgdWludDE2X3QgYXNzb2NJZCwKKwkJCSAgIHRTaXJNYWNUc3BlY0lFICpwVHNwZWNJRSwKKwkJCSAgIHRwTGltVHNwZWNJbmZvIHBUc3BlY0xpc3QsIHRwTGltVHNwZWNJbmZvICpwcEluZm8pCit7CisJaW50IGN0c3BlYzsKKworCSpwcEluZm8gPSBOVUxMOworCisJbGltX2xvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLAorCQlGTCgiVHJ5aW5nIHRvIGZpbmQgdHNwZWMgZW50cnkgZm9yIGFzc29jSWQgPSAlZCIpLCBhc3NvY0lkKTsKKwlsaW1fbG9nKHBNYWMsIEFETUlUX0NPTlRST0xfTE9HTEVWRUwsCisJCUZMCisJCQkoInBUc0luZm8tPnRyYWZmaWMuZGlyZWN0aW9uID0gJWQsIHBUc0luZm8tPnRyYWZmaWMudHNpZCA9ICVkIiksCisJCXBUc3BlY0lFLT50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24sCisJCXBUc3BlY0lFLT50c2luZm8udHJhZmZpYy50c2lkKTsKKworCWZvciAoY3RzcGVjID0gMDsgY3RzcGVjIDwgTElNX05VTV9UU1BFQ19NQVg7IGN0c3BlYysrLCBwVHNwZWNMaXN0KyspIHsKKwkJaWYgKChwVHNwZWNMaXN0LT5pbnVzZSkKKwkJICAgICYmIChhc3NvY0lkID09IHBUc3BlY0xpc3QtPmFzc29jSWQpCisJCSAgICAmJgorCQkgICAgKGNkZl9tZW1fY29tcGFyZQorCQkJICAgICAoKHVpbnQ4X3QgKikgcFRzcGVjSUUsICh1aW50OF90ICopICZwVHNwZWNMaXN0LT50c3BlYywKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNUc3BlY0lFKSkpKSB7CisJCQkqcHBJbmZvID0gcFRzcGVjTGlzdDsKKwkJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisJCX0KKwl9CisJcmV0dXJuIGVTSVJfRkFJTFVSRTsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fZmluZF90c3BlYworICAgXGJyaWVmIGZpbmRpbmcgYSBUU1BFQyBlbnRyeSB3aXRoIGFzc29jSWQsIHRzaW5mby5kaXJlY3Rpb24gYW5kIHRzaW5mby50c2lkCisgICBccGFyYW0gICAgdWludDE2X3QgICAgICAgICAgICAgICBhc3NvY0lkCisgICBccGFyYW0gICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKKyAgIFxwYXJhbSAgICAgdFNpck1hY1RTSW5mbyAgICpwVHNJbmZvCisgICBccGFyYW0gICAgICAgICB0cExpbVRzcGVjSW5mbyAgICBwVHNwZWNMaXN0CisgICBccGFyYW0gICAgICAgICB0cExpbVRzcGVjSW5mbyAgICpwcEluZm8KKyAgIFxyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cyBvZiB0aGUgY29tcGFyaXNvbgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMKK2xpbV9maW5kX3RzcGVjKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJICAgICAgIHVpbnQxNl90IGFzc29jSWQsCisJICAgICAgIHRTaXJNYWNUU0luZm8gKnBUc0luZm8sCisJICAgICAgIHRwTGltVHNwZWNJbmZvIHBUc3BlY0xpc3QsIHRwTGltVHNwZWNJbmZvICpwcEluZm8pCit7CisJaW50IGN0c3BlYzsKKworCSpwcEluZm8gPSBOVUxMOworCisJbGltX2xvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLAorCQlGTCgiVHJ5aW5nIHRvIGZpbmQgdHNwZWMgZW50cnkgZm9yIGFzc29jSWQgPSAlZCIpLCBhc3NvY0lkKTsKKwlsaW1fbG9nKHBNYWMsIEFETUlUX0NPTlRST0xfTE9HTEVWRUwsCisJCUZMCisJCQkoInBUc0luZm8tPnRyYWZmaWMuZGlyZWN0aW9uID0gJWQsIHBUc0luZm8tPnRyYWZmaWMudHNpZCA9ICVkIiksCisJCXBUc0luZm8tPnRyYWZmaWMuZGlyZWN0aW9uLCBwVHNJbmZvLT50cmFmZmljLnRzaWQpOworCisJZm9yIChjdHNwZWMgPSAwOyBjdHNwZWMgPCBMSU1fTlVNX1RTUEVDX01BWDsgY3RzcGVjKyssIHBUc3BlY0xpc3QrKykgeworCQlpZiAoKHBUc3BlY0xpc3QtPmludXNlKQorCQkgICAgJiYgKGFzc29jSWQgPT0gcFRzcGVjTGlzdC0+YXNzb2NJZCkKKwkJICAgICYmIChwVHNJbmZvLT50cmFmZmljLmRpcmVjdGlvbiA9PQorCQkJcFRzcGVjTGlzdC0+dHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uKQorCQkgICAgJiYgKHBUc0luZm8tPnRyYWZmaWMudHNpZCA9PQorCQkJcFRzcGVjTGlzdC0+dHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZCkpIHsKKwkJCSpwcEluZm8gPSBwVHNwZWNMaXN0OworCQkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwkJfQorCX0KKwlyZXR1cm4gZVNJUl9GQUlMVVJFOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIGxpbV90c3BlY19hZGQKKyAgIFxicmllZiBhZGQgb3IgdXBkYXRlIHRoZSBzcGVjaWZpZWQgdHNwZWMgdG8gdGhlIHRzcGVjIGxpc3QKKyAgIFxwYXJhbSB0cEFuaVNpckdsb2JhbCAgICBwTWFjCisgICBccGFyYW0gdWludDhfdCAgICAgICAgICAgICAgICpwQWRkcgorICAgXHBhcmFtIHVpbnQxNl90ICAgICAgICAgICAgICAgYXNzb2NJZAorICAgXHBhcmFtIHRTaXJNYWNUc3BlY0lFICAgKnBUc3BlYworICAgXHBhcmFtIHVpbnQzMl90ICAgICAgICAgICAgICAgaW50ZXJ2YWwKKyAgIFxwYXJhbSB0cExpbVRzcGVjSW5mbyAgICpwcEluZm8KKworICAgXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzIG9mIHRoZSBjb21wYXJpc29uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBsaW1fdHNwZWNfYWRkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgdWludDhfdCAqcEFkZHIsCisJCQkgICAgdWludDE2X3QgYXNzb2NJZCwKKwkJCSAgICB0U2lyTWFjVHNwZWNJRSAqcFRzcGVjLAorCQkJICAgIHVpbnQzMl90IGludGVydmFsLCB0cExpbVRzcGVjSW5mbyAqcHBJbmZvKQoreworCXRwTGltVHNwZWNJbmZvIHBUc3BlY0xpc3QgPSAmcE1hYy0+bGltLnRzcGVjSW5mb1swXTsKKwkqcHBJbmZvID0gTlVMTDsKKworCS8qIHZhbGlkYXRlIHRoZSBhc3NvY0lkICovCisJaWYgKGFzc29jSWQgPj0gcE1hYy0+bGltLm1heFN0YXRpb24pIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgYXNzb2NJZCAweCV4IiksIGFzc29jSWQpOykKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJLyogZGVjaWRlIHdoZXRoZXIgdG8gYWRkL3VwZGF0ZSAqLworCXsKKwkJKnBwSW5mbyA9IE5VTEw7CisKKwkJaWYgKGVTSVJfU1VDQ0VTUyA9PQorCQkgICAgbGltX2ZpbmRfdHNwZWMocE1hYywgYXNzb2NJZCwgJnBUc3BlYy0+dHNpbmZvLCBwVHNwZWNMaXN0LAorCQkJCSAgIHBwSW5mbykpIHsKKwkJCS8qIHVwZGF0ZSB0aGlzIGVudHJ5LiAqLworCQkJbGltX2xvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLAorCQkJCUZMKCJ1cGRhdGluZyBUU1BFQyB0YWJsZSBlbnRyeSA9ICVkIiksCisJCQkJKCpwcEluZm8pLT5pZHgpOworCQl9IGVsc2UgeworCQkJLyogV2UgZGlkbid0IGZpbmQgb25lIHRvIHVwZGF0ZS4gU28gZmluZCBhIGZyZWUgc2xvdCBpbiB0aGUKKwkJCSAqIExJTSBUU1BFQyBsaXN0IGFuZCBhZGQgdGhpcyBuZXcgZW50cnkKKwkJCSAqLworCQkJdWludDhfdCBjdHNwZWMgPSAwOworCQkJZm9yIChjdHNwZWMgPSAwLCBwVHNwZWNMaXN0ID0gJnBNYWMtPmxpbS50c3BlY0luZm9bMF07CisJCQkgICAgIGN0c3BlYyA8IExJTV9OVU1fVFNQRUNfTUFYOworCQkJICAgICBjdHNwZWMrKywgcFRzcGVjTGlzdCsrKSB7CisJCQkJaWYgKCFwVHNwZWNMaXN0LT5pbnVzZSkgeworCQkJCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJCQlGTAorCQkJCQkJCSgiRm91bmQgZnJlZSBzbG90IGluIFRTUEVDIGxpc3QuIEFkZCB0byBUU1BFQyB0YWJsZSBlbnRyeSAlZCIpLAorCQkJCQkJY3RzcGVjKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY3RzcGVjID49IExJTV9OVU1fVFNQRUNfTUFYKQorCQkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisKKwkJCS8qIFJlY29yZCB0aGUgbmV3IGluZGV4IGVudHJ5ICovCisJCQlwVHNwZWNMaXN0LT5pZHggPSBjdHNwZWM7CisJCX0KKwl9CisKKwkvKiB1cGRhdGUgdGhlIHRzcGVjIGluZm8gKi8KKwlwVHNwZWNMaXN0LT50c3BlYyA9ICpwVHNwZWM7CisJcFRzcGVjTGlzdC0+YXNzb2NJZCA9IGFzc29jSWQ7CisJY2RmX21lbV9jb3B5KHBUc3BlY0xpc3QtPnN0YUFkZHIsIHBBZGRyLCBzaXplb2YocFRzcGVjTGlzdC0+c3RhQWRkcikpOworCisJLyogZm9yIGVkY2EgdHNwZWMncywgd2UgYXJlIGFsbCBkb25lICovCisJaWYgKHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID09IFNJUl9NQUNfQUNDRVNTUE9MSUNZX0VEQ0EpIHsKKwkJcFRzcGVjTGlzdC0+aW51c2UgPSAxOworCQkqcHBJbmZvID0gcFRzcGVjTGlzdDsKKwkJbGltX2xvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLAorCQkJRkwoImFkZGVkIGVudHJ5IGZvciBFRENBIEFjY2Vzc1BvbGljeSIpKTsKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwl9CisKKwkvKgorCSAqIGZvciBoY2NhIHRzcGVjJ3MsIG11c3Qgc2V0IHRoZSBwYXJhbWV0ZXJpemVkIGJpdCBpbiB0aGUgcXVldWVzCisJICogdGhlICd0cycgYml0IGluIHRoZSBxdWV1ZSBkYXRhIHN0cnVjdHVyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcXVldWUgaXMKKwkgKiBwYXJhbWV0ZXJpemVkIChoY2NhKS4gV2hlbiB0aGUgc2NoZWR1bGUgaXMgd3JpdHRlbiB0aGlzIGJpdCBpcyB1c2VkCisJICogaW4gdGhlIHRzaWQgZmllbGQgKGJpdCAzKSBhbmQgdGhlIG90aGVyIHRocmVlIGJpdHMgKDAtMikgYXJlIHNpbXBseQorCSAqIGZpbGxlZCBpbiBhcyB0aGUgdXNlciBwcmlvcml0eSAob3IgcWlkKS4gVGhpcyBhcHBsaWVzIG9ubHkgdG8gdXBsaW5rCisJICogcG9sbHMgd2hlcmUgdGhlIHFvcyBjb250cm9sIGZpZWxkIG11c3QgY29udGFpbiB0aGUgdHNpZCBzcGVjaWZpZWQgaW4gdGhlCisJICogdHNwZWMuCisJICovCisJcFRzcGVjTGlzdC0+aW51c2UgPSAxOworCSpwcEluZm8gPSBwVHNwZWNMaXN0OworCWxpbV9sb2cocE1hYywgQURNSVRfQ09OVFJPTF9MT0dMRVZFTCwKKwkJRkwoImFkZGVkIGVudHJ5IGZvciBIQ0NBIEFjY2Vzc1BvbGljeSIpKTsKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIGxpbV92YWxpZGF0ZV9hY2Nlc3NfcG9saWN5CisgICBcYnJpZWYgVmFsaWRhdGVzIEFjY2VzcyBwb2xpY3kKKyAgIFxwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKKyAgIFxwYXJhbSAgICAgICB1aW50OF90ICAgICAgICAgICAgICBhY2Nlc3NQb2xpY3kKKyAgIFxwYXJhbSAgICAgICB1aW50MTZfdCAgICAgICAgICAgICBhc3NvY0lkCisgICBccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdFNpclJldFN0YXR1cworbGltX3ZhbGlkYXRlX2FjY2Vzc19wb2xpY3kodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgIHVpbnQ4X3QgYWNjZXNzUG9saWN5LAorCQkJICAgdWludDE2X3QgYXNzb2NJZCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUmV0U3RhdHVzIHJldHZhbCA9IGVTSVJfRkFJTFVSRTsKKwl0cERwaEhhc2hOb2RlIHBTdGEgPQorCQlkcGhfZ2V0X2hhc2hfZW50cnkocE1hYywgYXNzb2NJZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisJaWYgKChwU3RhID09IE5VTEwpIHx8ICghcFN0YS0+dmFsaWQpKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJpbnZhbGlkIHN0YXRpb24gYWRkcmVzcyBwYXNzZWQiKSk7KQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXN3aXRjaCAoYWNjZXNzUG9saWN5KSB7CisJY2FzZSBTSVJfTUFDX0FDQ0VTU1BPTElDWV9FRENBOgorCQlpZiAocFN0YS0+d21lRW5hYmxlZCB8fCBwU3RhLT5sbGVFbmFibGVkKQorCQkJcmV0dmFsID0gZVNJUl9TVUNDRVNTOworCQlicmVhazsKKworCWNhc2UgU0lSX01BQ19BQ0NFU1NQT0xJQ1lfSENDQToKKwljYXNlIFNJUl9NQUNfQUNDRVNTUE9MSUNZX0JPVEg6CisJZGVmYXVsdDoKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoIkludmFsaWQgYWNjZXNzUG9saWN5ICVkIiksCisJCQkgICAgICAgYWNjZXNzUG9saWN5KTsKKwkJICAgICAgICkKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldHZhbCAhPSBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMCisJCQkJKCJmYWlsZWQgKGFjY1BvbCAlZCwgc3RhSWQgJWQsIGxsZSAlZCwgd21lICVkLCB3c20gJWQpIiksCisJCQlhY2Nlc3NQb2xpY3ksIHBTdGEtPnN0YUluZGV4LCBwU3RhLT5sbGVFbmFibGVkLAorCQkJcFN0YS0+d21lRW5hYmxlZCwgcFN0YS0+d3NtRW5hYmxlZCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGxpbV9hZG1pdF9jb250cm9sX2FkZF90cygpIC0gICAgICAgIENoZWNrIGlmIFNUQSBjYW4gYmUgYWRtaXR0ZWQKKyAqIEBwTWFjOiAgICAgICAgICAgICAgIEdsb2JhbCBNQUMgY29udGV4dAorICogQHBBZGRyOiAgICAgICAgICAgICAgQWRkcmVzcworICogQHBBZGR0czogICAgICAgICAgICAgQUREIFRTCisgKiBAcFFvczogICAgICAgICAgICAgICBRT1MgZmllbGRzCisgKiBAYXNzb2NJZDogICAgICAgICAgICBBc3NvY2lhdGlvbiBJRAorICogQGFsbG9jOiAgICAgICAgICAgICAgQWxsb2NhdGUgYmFuZHdpZHRoIGZvciB0aGlzIHRzcGVjCisgKiBAcFNjaDogICAgICAgICAgICAgICBTY2hlZHVsZSBJRQorICogQHBUc3BlY0lkeDogICAgICAgICAgVFNQRUMgaW5kZXgKKyAqIEBwc2Vzc2lvbkVudHJ5OiAgICAgIFBFIFNlc3Npb24gRW50cnkKKyAqCisgKiBEZXRlcm1pbmUgaWYgU1RBIHdpdGggdGhlIHNwZWNpZmllZCBUU1BFQyBjYW4gYmUgYWRtaXR0ZWQuIElmIGl0IGNhbiwKKyAqIGEgc2NoZWR1bGUgZWxlbWVudCBpcyBwcm92aWRlZAorICoKKyAqIFJldHVybjogc3RhdHVzCisgKiovCit0U2lyUmV0U3RhdHVzIGxpbV9hZG1pdF9jb250cm9sX2FkZF90cyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwQWRkciwKKwkJdFNpckFkZHRzUmVxSW5mbyAqcEFkZHRzLCB0U2lyTWFjUW9zQ2FwYWJpbGl0eVN0YUlFICpwUW9zLAorCQl1aW50MTZfdCBhc3NvY0lkLCB1aW50OF90IGFsbG9jLCB0U2lyTWFjU2NoZWR1bGVJRSAqcFNjaCwKKwkJdWludDhfdCAqcFRzcGVjSWR4LCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwTGltVHNwZWNJbmZvIHBUc3BlY0luZm87CisJdFNpclJldFN0YXR1cyByZXR2YWw7CisJdWludDMyX3Qgc3ZjSW50ZXJ2YWw7CisJKHZvaWQpcFFvczsKKworCS8qIFRCRDogbW9kaWZ5IHRzcGVjIGFzIG5lZWRlZCAqLworCS8qIEVEQ0E6IG5lZWQgdG8gZmlsbCBpbiB0aGUgbWVkaXVtIHRpbWUgYW5kIHRoZSBtaW5pbXVtIHBoeSByYXRlICovCisJLyogdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBkZXNpcmVkIHRyYWZmaWMgcGFyYW1ldGVycy4gKi8KKworCWxpbV9sb2cocE1hYywgQURNSVRfQ09OVFJPTF9MT0dMRVZFTCwKKwkJRkwKKwkJCSgidHNpZCAlZCwgZGlyZWN0biAlZCwgc3RhcnQgJWQsIGludHZsICVkLCBhY2NQb2xpY3kgJWQsIHVwICVkIiksCisJCXBBZGR0cy0+dHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZCwKKwkJcEFkZHRzLT50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24sCisJCXBBZGR0cy0+dHNwZWMuc3ZjU3RhcnRUaW1lLCBwQWRkdHMtPnRzcGVjLm1pblN2Y0ludGVydmFsLAorCQlwQWRkdHMtPnRzcGVjLnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSwKKwkJcEFkZHRzLT50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbyk7CisKKwkvKiBjaGVjayBmb3IgZHVwbGljYXRlIHRzcGVjICovCisJcmV0dmFsID0gKGFsbG9jKQorCQkgPyBsaW1fdHNwZWNfZmluZF9ieV9hc3NvY19pZChwTWFjLCBhc3NvY0lkLCAmcEFkZHRzLT50c3BlYywKKwkJCQkJICAgICAgJnBNYWMtPmxpbS50c3BlY0luZm9bMF0sICZwVHNwZWNJbmZvKQorCQkgOiBsaW1fdHNwZWNfZmluZF9ieV9zdGFfYWRkcihwTWFjLCBwQWRkciwgJnBBZGR0cy0+dHNwZWMsCisJCQkJCSAgICAgICZwTWFjLT5saW0udHNwZWNJbmZvWzBdLCAmcFRzcGVjSW5mbyk7CisKKwlpZiAocmV0dmFsID09IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIEFETUlUX0NPTlRST0xfTE9HTEVWRUwsCisJCQlGTCgiZHVwbGljYXRlIHRzcGVjIChpbmRleCAlZCkhIiksIHBUc3BlY0luZm8tPmlkeCk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIGNoZWNrIHRoYXQgdGhlIHRzcGVjJ3MgYXJlIHdlbGwgZm9ybWVkIGFuZCBhY2NlcHRhYmxlICovCisJaWYgKGxpbV92YWxpZGF0ZV90c3BlYyhwTWFjLCAmcEFkZHRzLT50c3BlYywgcHNlc3Npb25FbnRyeSkgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HVyhsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJ0c3BlYyB2YWxpZGF0aW9uIGZhaWxlZCIpKTspCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIGRldGVybWluZSBhIHNlcnZpY2UgaW50ZXJ2YWwgZm9yIHRoZSB0c3BlYyAqLworCWlmIChsaW1fY2FsY3VsYXRlX3N2Y19pbnQocE1hYywgJnBBZGR0cy0+dHNwZWMsICZzdmNJbnRlcnZhbCkgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HVyhsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJTdmNJbnQgY2FsY3VsYXRlIGZhaWxlZCIpKTspCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIGRldGVybWluZSBpZiB0aGUgdHNwZWMgY2FuIGJlIGFkbWl0dGVkIG9yIG5vdCBiYXNlZCBvbiBjdXJyZW50IHBvbGljeSAqLworCWlmIChsaW1fYWRtaXRfcG9saWN5KHBNYWMsICZwQWRkdHMtPnRzcGVjLCBwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywKKwkJCSAgICAgICBGTCgidHNwZWMgcmVqZWN0ZWQgYnkgYWRtaXQgY29udHJvbCBwb2xpY3kiKSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIGZpbGwgaW4gYSBzY2hlZHVsZSBpZiByZXF1ZXN0ZWQgKi8KKwlpZiAocFNjaCAhPSBOVUxMKSB7CisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBTY2gsIHNpemVvZigqcFNjaCksIDApOworCQlwU2NoLT5zdmNTdGFydFRpbWUgPSBwQWRkdHMtPnRzcGVjLnN2Y1N0YXJ0VGltZTsKKwkJcFNjaC0+c3ZjSW50ZXJ2YWwgPSBzdmNJbnRlcnZhbDsKKwkJcFNjaC0+bWF4U3ZjRHVyYXRpb24gPSAodWludDE2X3QpIHBTY2gtPnN2Y0ludGVydmFsOyAgICAvKiB1c2UgU1AgPSBTSSAqLworCQlwU2NoLT5zcGVjSW50ZXJ2YWwgPSAweDEwMDA7ICAgIC8qIGZpeGVkIGZvciBub3c6IFRCRCAqLworCisJCXBTY2gtPmluZm8uZGlyZWN0aW9uID0gcEFkZHRzLT50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb247CisJCXBTY2gtPmluZm8udHNpZCA9IHBBZGR0cy0+dHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZDsKKwkJcFNjaC0+aW5mby5hZ2dyZWdhdGlvbiA9IDA7ICAgICAvKiBubyBzdXBwb3J0IGZvciBhZ2dyZWdhdGlvbiBmb3Igbm93OiBUQkQgKi8KKwl9CisJLyogaWYgbm8gYWxsb2NhdGlvbiBpcyByZXF1ZXN0ZWQsIGRvbmUgKi8KKwlpZiAoIWFsbG9jKQorCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCisJLyogY2hlY2sgdGhhdCB3ZSBhcmUgaW4gdGhlIHByb3BlciBtb2RlIHRvIGRlYWwgd2l0aCB0aGUgdHNwZWMgdHlwZSAqLworCWlmIChsaW1fdmFsaWRhdGVfYWNjZXNzX3BvbGljeQorCQkgICAgKHBNYWMsICh1aW50OF90KSBwQWRkdHMtPnRzcGVjLnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSwgYXNzb2NJZCwKKwkJICAgIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgiQWNjZXNzUG9saWN5ICVkIGlzIG5vdCB2YWxpZCBpbiBjdXJyZW50IG1vZGUiKSwKKwkJCXBBZGR0cy0+dHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5KTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJLyogYWRkIHRzcGVjIHRvIGxpc3QgKi8KKwlpZiAobGltX3RzcGVjX2FkZAorCQkgICAgKHBNYWMsIHBBZGRyLCBhc3NvY0lkLCAmcEFkZHRzLT50c3BlYywgc3ZjSW50ZXJ2YWwsICZwVHNwZWNJbmZvKQorCSAgICAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIm5vIHNwYWNlIGluIHRzcGVjIGxpc3QiKSk7KQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwkvKiBwYXNzaW5nIGxpbSB0c3BlYyB0YWJsZSBpbmRleCB0byB0aGUgY2FsbGVyICovCisJKnBUc3BlY0lkeCA9IHBUc3BlY0luZm8tPmlkeDsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX2FkbWl0X2NvbnRyb2xfZGVsZXRlX3RzCisgICBcYnJpZWYgRGVsZXRlIHRoZSBzcGVjaWZpZWQgVHNwZWMgZm9yIHRoZSBzcGVjaWZpZWQgU1RBCisgICBccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCisgICBccGFyYW0gICAgICAgdWludDE2X3QgICAgICAgICAgICAgICBhc3NvY0lkCisgICBccGFyYW0gICAgICAgdFNpck1hY1RTSW5mbyAgICAqcFRzSW5mbworICAgXHBhcmFtICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAqcFRzU3RhdHVzCisgICBccGFyYW0gICAgICAgdWludDhfdCAgICAgICAgICAgICAqcHRzcGVjSWR4CisgICBccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzCitsaW1fYWRtaXRfY29udHJvbF9kZWxldGVfdHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICB1aW50MTZfdCBhc3NvY0lkLAorCQkJICAgIHRTaXJNYWNUU0luZm8gKnBUc0luZm8sCisJCQkgICAgdWludDhfdCAqcFRzU3RhdHVzLCB1aW50OF90ICpwdHNwZWNJZHgpCit7CisJdHBMaW1Uc3BlY0luZm8gcFRzcGVjSW5mbyA9IE5VTEw7CisKKwlpZiAocFRzU3RhdHVzICE9IE5VTEwpCisJCSpwVHNTdGF0dXMgPSAwOworCisJaWYgKGxpbV9maW5kX3RzcGVjCisJCSAgICAocE1hYywgYXNzb2NJZCwgcFRzSW5mbywgJnBNYWMtPmxpbS50c3BlY0luZm9bMF0sCisJCSAgICAmcFRzcGVjSW5mbykgPT0gZVNJUl9TVUNDRVNTKSB7CisJCWlmIChwVHNwZWNJbmZvICE9IE5VTEwpIHsKKwkJCWxpbV9sb2cocE1hYywgQURNSVRfQ09OVFJPTF9MT0dMRVZFTCwKKwkJCQlGTCgiVHNwZWMgZW50cnkgJWQgZm91bmQiKSwgcFRzcGVjSW5mby0+aWR4KTsKKworCQkJKnB0c3BlY0lkeCA9IHBUc3BlY0luZm8tPmlkeDsKKwkJCWxpbV90c3BlY19kZWxldGUocE1hYywgcFRzcGVjSW5mbyk7CisJCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCQl9CisJfQorCXJldHVybiBlU0lSX0ZBSUxVUkU7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX2FkbWl0X2NvbnRyb2xfZGVsZXRlX3N0YQorICAgXGJyaWVmIERlbGV0ZSBhbGwgVFNQRUMgZm9yIHRoZSBzcGVjaWZpZWQgU1RBCisgICBccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCisgICBccGFyYW0gICAgIHVpbnQxNl90IGFzc29jSWQKKyAgIFxyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgbGltX2FkbWl0X2NvbnRyb2xfZGVsZXRlX3N0YSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBhc3NvY0lkKQoreworCXRwTGltVHNwZWNJbmZvIHBUc3BlY0luZm8gPSAmcE1hYy0+bGltLnRzcGVjSW5mb1swXTsKKwlpbnQgY3RzcGVjOworCisJZm9yIChjdHNwZWMgPSAwOyBjdHNwZWMgPCBMSU1fTlVNX1RTUEVDX01BWDsgY3RzcGVjKyssIHBUc3BlY0luZm8rKykgeworCQlpZiAoYXNzb2NJZCA9PSBwVHNwZWNJbmZvLT5hc3NvY0lkKSB7CisJCQlsaW1fdHNwZWNfZGVsZXRlKHBNYWMsIHBUc3BlY0luZm8pOworCQkJbGltX2xvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLAorCQkJCUZMKCJEZWxldGluZyBUU1BFQyAlZCBmb3IgYXNzb2NJZCAlZCIpLCBjdHNwZWMsCisJCQkJYXNzb2NJZCk7CisJCX0KKwl9CisJbGltX2xvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgiYXNzb2NJZCAlZCBkb25lIiksIGFzc29jSWQpOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fYWRtaXRfY29udHJvbF9pbml0CisgICBcYnJpZWYgaW5pdCB0c3BlYyB0YWJsZQorICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworICAgXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMgbGltX2FkbWl0X2NvbnRyb2xfaW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCWNkZl9tZW1fc2V0KHBNYWMtPmxpbS50c3BlY0luZm8sCisJCSAgICBMSU1fTlVNX1RTUEVDX01BWCAqIHNpemVvZih0TGltVHNwZWNJbmZvKSwgMCk7CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fdXBkYXRlX2FkbWl0X3BvbGljeQorICAgXGJyaWVmIFNldCB0aGUgYWRtaXQgY29udHJvbCBwb2xpY3kgYmFzZWQgb24gQ0ZHIHBhcmFtZXRlcnMKKyAgIFxwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKKyAgIFxyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgbGltX3VwZGF0ZV9hZG1pdF9wb2xpY3kodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl1aW50MzJfdCB2YWw7CisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19BRE1JVF9QT0xJQ1ksICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJVbmFibGUgdG8gZ2V0IENGR19BRE1JVF9QT0xJQ1kiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCXBNYWMtPmxpbS5hZG1pdFBvbGljeUluZm8udHlwZSA9ICh1aW50OF90KSB2YWw7CisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19BRE1JVF9CV0ZBQ1RPUiwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBnZXQgQ0ZHX0FETUlUX0JXRkFDVE9SIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlwTWFjLT5saW0uYWRtaXRQb2xpY3lJbmZvLmJ3X2ZhY3RvciA9ICh1aW50OF90KSB2YWw7CisKKwlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiTElNOiBBZG1pdFBvbGljeSAlZCwgYndfZmFjdG9yICVkIiksCisJCSAgICAgICBwTWFjLT5saW0uYWRtaXRQb2xpY3lJbmZvLnR5cGUsCisJCSAgICAgICBwTWFjLT5saW0uYWRtaXRQb2xpY3lJbmZvLmJ3X2ZhY3Rvcik7CisJICAgICAgICkKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX3NlbmRfaGFsX21zZ19hZGRfdHMKKyAgIFxicmllZiBTZW5kIGhhbE1zZ19BZGRUcyB0byBIQUwKKyAgIFxwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKKyAgIFxwYXJhbSAgICAgdWludDE2X3QgICAgICAgIHN0YUlkeAorICAgXHBhcmFtICAgICB1aW50OF90ICAgICAgICAgdHNwZWNJZHgKKyAgIFxwYXJhbSAgICAgICB0U2lyTWFjVHNwZWNJRSB0c3BlY0lFCisgICBccGFyYW0gICAgICAgdFNpclRjbGFzSW5mbyAgICp0Y2xhc0luZm8KKyAgIFxwYXJhbSAgICAgICB1aW50OF90ICAgICAgICAgICB0Y2xhc1Byb2MKKyAgIFxwYXJhbSAgICAgICB1aW50MTZfdCAgICAgICAgICB0c21faW50ZXJ2YWwKKyAgIFxyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQordFNpclJldFN0YXR1cworbGltX3NlbmRfaGFsX21zZ19hZGRfdHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXVpbnQxNl90IHN0YUlkeCwKKwkJCXVpbnQ4X3QgdHNwZWNJZHgsCisJCQl0U2lyTWFjVHNwZWNJRSB0c3BlY0lFLAorCQkJdWludDhfdCBzZXNzaW9uSWQsIHVpbnQxNl90IHRzbV9pbnRlcnZhbCkKKyNlbHNlCit0U2lyUmV0U3RhdHVzCitsaW1fc2VuZF9oYWxfbXNnX2FkZF90cyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdWludDE2X3Qgc3RhSWR4LAorCQkJdWludDhfdCB0c3BlY0lkeCwgdFNpck1hY1RzcGVjSUUgdHNwZWNJRSwgdWludDhfdCBzZXNzaW9uSWQpCisjZW5kaWYKK3sKKwl0U2lyTXNnUSBtc2c7CisJdHBBZGRUc1BhcmFtcyBwQWRkVHNQYXJhbTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQocE1hYywgc2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gZ2V0IFNlc3Npb24gZm9yIHNlc3Npb24gSWQgJWQiKSwKKwkJCXNlc3Npb25JZCk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorI2VuZGlmCisJcEFkZFRzUGFyYW0gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodEFkZFRzUGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gcEFkZFRzUGFyYW0pIHsKKwkJUEVMT0dXKGxpbV9sb2cocE1hYywgTE9HVywgRkwoIkFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkIikpOykKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBwQWRkVHNQYXJhbSwgc2l6ZW9mKHRBZGRUc1BhcmFtcyksIDApOworCXBBZGRUc1BhcmFtLT5zdGFJZHggPSBzdGFJZHg7CisJcEFkZFRzUGFyYW0tPnRzcGVjSWR4ID0gdHNwZWNJZHg7CisJY2RmX21lbV9jb3B5KCZwQWRkVHNQYXJhbS0+dHNwZWMsICZ0c3BlY0lFLCBzaXplb2YodFNpck1hY1RzcGVjSUUpKTsKKwlwQWRkVHNQYXJhbS0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCXBBZGRUc1BhcmFtLT5zbWVfc2Vzc2lvbl9pZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwlwQWRkVHNQYXJhbS0+dHNtX2ludGVydmFsID0gdHNtX2ludGVydmFsOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRFbmFibGVkICYmCisJICAgIHBzZXNzaW9uRW50cnktPmlzMTFSY29ubmVjdGlvbikKKwkJcEFkZFRzUGFyYW0tPnNldFJJQ3BhcmFtcyA9IDE7CisjZW5kaWYKKworCW1zZy50eXBlID0gV01BX0FERF9UU19SRVE7CisJbXNnLmJvZHlwdHIgPSBwQWRkVHNQYXJhbTsKKwltc2cuYm9keXZhbCA9IDA7CisKKwkvKiBXZSBuZWVkIHRvIGRlZmVyIGFueSBpbmNvbWluZyBtZXNzYWdlcyB1bnRpbCB3ZSBnZXQgYQorCSAqIFdNQV9BRERfVFNfUlNQIGZyb20gSEFMLgorCSAqLworCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBzZXNzaW9uSWQsIG1zZy50eXBlKSk7CisKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2cpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIndtYV9wb3N0X2N0cmxfbXNnKCkgZmFpbGVkIikpOworCQlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKwkJY2RmX21lbV9mcmVlKHBBZGRUc1BhcmFtKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fc2VuZF9oYWxfbXNnX2RlbF90cworICAgXGJyaWVmIFNlbmQgaGFsTXNnX0FkZFRzIHRvIEhBTAorICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworICAgXHBhcmFtICAgICB1aW50MTZfdCAgICAgICAgc3RhSWR4CisgICBccGFyYW0gICAgIHVpbnQ4X3QgICAgICAgICB0c3BlY0lkeAorICAgXHBhcmFtICAgICB0U2lyQWRkdHNSZXFJbmZvIGFkZHRzCisgICBccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzCitsaW1fc2VuZF9oYWxfbXNnX2RlbF90cyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdWludDE2X3Qgc3RhSWR4LAorCQkJdWludDhfdCB0c3BlY0lkeCwKKwkJCXRTaXJEZWx0c1JlcUluZm8gZGVsdHMsIHVpbnQ4X3Qgc2Vzc2lvbklkLCB1aW50OF90ICpic3NJZCkKK3sKKwl0U2lyTXNnUSBtc2c7CisJdHBEZWxUc1BhcmFtcyBwRGVsVHNQYXJhbTsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKworCXBEZWxUc1BhcmFtID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHREZWxUc1BhcmFtcykpOworCWlmIChOVUxMID09IHBEZWxUc1BhcmFtKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCW1zZy50eXBlID0gV01BX0RFTF9UU19SRVE7CisJbXNnLmJvZHlwdHIgPSBwRGVsVHNQYXJhbTsKKwltc2cuYm9keXZhbCA9IDA7CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcERlbFRzUGFyYW0sIHNpemVvZih0RGVsVHNQYXJhbXMpLCAwKTsKKworCS8qIGZpbGxpbmcgbWVzc2FnZSBwYXJhbWV0ZXJzLiAqLworCXBEZWxUc1BhcmFtLT5zdGFJZHggPSBzdGFJZHg7CisJcERlbFRzUGFyYW0tPnRzcGVjSWR4ID0gdHNwZWNJZHg7CisJY2RmX21lbV9jb3B5KCZwRGVsVHNQYXJhbS0+YnNzSWQsIGJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChwTWFjLCBzZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTAorCQkJCSAgICAgICAoIlNlc3Npb24gZG9lcyBOb3QgZXhpc3Qgd2l0aCBnaXZlbiBzZXNzaW9uSWQgOiVkICIpLAorCQkJICAgICAgIHNlc3Npb25JZCk7CisJCSAgICAgICApCisJCWdvdG8gZXJyOworCX0KKwlwRGVsVHNQYXJhbS0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCXBEZWxUc1BhcmFtLT51c2VyUHJpbyA9IGRlbHRzLndtZVRzcGVjUHJlc2VudCA/CisJCQlkZWx0cy50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbyA6CisJCQlkZWx0cy50c2luZm8udHJhZmZpYy51c2VyUHJpbzsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlpZiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc1JvYW1PZmZsb2FkRW5hYmxlZCAmJgorCSAgICBwc2Vzc2lvbkVudHJ5LT5pczExUmNvbm5lY3Rpb24pIHsKKwkJY2RmX21lbV9jb3B5KCZwRGVsVHNQYXJhbS0+ZGVsVHNJbmZvLCAmZGVsdHMsCisJCQkgICAgIHNpemVvZih0U2lyRGVsdHNSZXFJbmZvKSk7CisJCXBEZWxUc1BhcmFtLT5zZXRSSUNwYXJhbXMgPSAxOworCX0KKyNlbmRpZgorCisJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiY2FsbGluZyB3bWFfcG9zdF9jdHJsX21zZygpIikpOworCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIHNlc3Npb25JZCwgbXNnLnR5cGUpKTsKKworCWlmIChlU0lSX1NVQ0NFU1MgIT0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgid21hX3Bvc3RfY3RybF9tc2coKSBmYWlsZWQiKSk7CisJCWdvdG8gZXJyOworCX0KKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCitlcnI6CisJY2RmX21lbV9mcmVlKHBEZWxUc1BhcmFtKTsKKwlyZXR1cm4gZVNJUl9GQUlMVVJFOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuICAgICBsaW1fcHJvY2Vzc19oYWxfYWRkX3RzX3JzcAorICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIFdNQV9BRERfVFNfUlNQIGZyb20gSEFMLgorIFwgICAgICAgSWYgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bCwgdGhlbiBzZW5kIGJhY2sgU01FX0FERFRTX1JTUC4KKyBcICAgICAgIE90aGVyd2lzZSwgc2VuZCBERUxUUyBhY3Rpb24gZnJhbWUgdG8gcGVlciBhbmQgdGhlbgorIFwgICAgICAgdGhlbiBzZW5kIGJhY2sgU01FX0FERFRTX1JTUC4KKyBcCisgICBccGFyYW0gIHRwQW5pU2lyR2xvYmFsICBwTWFjCisgICBccGFyYW0gIHRwU2lyTXNnUSAgIGxpbU1zZworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbV9wcm9jZXNzX2hhbF9hZGRfdHNfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpCit7CisJdHBBZGRUc1BhcmFtcyBwQWRkVHNSc3BNc2cgPSBOVUxMOworCXRwRHBoSGFzaE5vZGUgcFN0YSA9IE5VTEw7CisJdWludDE2X3QgYXNzb2NJZCA9IDA7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisJdWludDhfdCByc3BSZXFkID0gMTsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKworCS8qIE5lZWQgdG8gcHJvY2VzcyBhbGwgdGhlIGRlZmVycmVkIG1lc3NhZ2VzIGVucXVldWVkCisJICogc2luY2Ugc2VuZGluZyB0aGUgV01BX0FERF9UU19SRVEuCisJICovCisJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisKKwlpZiAoTlVMTCA9PSBsaW1Nc2ctPmJvZHlwdHIpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiUmVjZWl2ZWQgV01BX0FERF9UU19SU1Agd2l0aCBOVUxMICIpKTsKKwkJZ290byBlbmQ7CisJfQorCisJcEFkZFRzUnNwTXNnID0gKHRwQWRkVHNQYXJhbXMpIChsaW1Nc2ctPmJvZHlwdHIpOworCisJLyogMDkwODAzOiBVc2UgcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQoKSB0byBvYnRhaW4gdGhlIFBFIHNlc3Npb24gY29udGV4dCAqLworCS8qIGZyb20gdGhlIHNlc3Npb25JZCBpbiB0aGUgUnNwIE1zZyBmcm9tIEhBTCAqLworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChwTWFjLCBwQWRkVHNSc3BNc2ctPnNlc3Npb25JZCk7CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwoIlNlc3Npb24gZG9lcyBOb3QgZXhpc3Qgd2l0aCBnaXZlbiBzZXNzaW9uSWQgOiVkICIpLAorCQkJICAgICAgIHBBZGRUc1JzcE1zZy0+c2Vzc2lvbklkKTsKKwkJICAgICAgICkKKwkJbGltX3NlbmRfc21lX2FkZHRzX3JzcChwTWFjLCByc3BSZXFkLCBlU0lSX1NNRV9BRERUU19SU1BfRkFJTEVELAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LCBwQWRkVHNSc3BNc2ctPnRzcGVjLAorCQkJCSAgICAgICBwTWFjLT5saW0uZ0xpbUFkZHRzUmVxLnNlc3Npb25JZCwKKwkJCQkgICAgICAgcE1hYy0+bGltLmdMaW1BZGR0c1JlcS50cmFuc2FjdGlvbklkKTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKHBBZGRUc1JzcE1zZy0+c3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlQRUxPRzEobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJICAgICAgIEZMKCJSZWNlaXZlZCBzdWNjZXNzZnVsIEFERFRTIHJlc3BvbnNlIGZyb20gSEFMICIpKTsKKwkJICAgICAgICkKKwkJLyogVXNlIHRoZSBzbWVzZXNzaW9uSWQgYW5kIHNtZXRyYW5zYWN0aW9uSWQgZnJvbSB0aGUgUEUgc2Vzc2lvbiBjb250ZXh0ICovCisJCWxpbV9zZW5kX3NtZV9hZGR0c19yc3AocE1hYywgcnNwUmVxZCwgZVNJUl9TTUVfU1VDQ0VTUywKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeSwgcEFkZFRzUnNwTXNnLT50c3BlYywKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKKwkJZ290byBlbmQ7CisJfSBlbHNlIHsKKwkJUEVMT0cxKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCSAgICAgICBGTCgiUmVjZWl2ZWQgZmFpbHVyZSBBRERUUyByZXNwb25zZSBmcm9tIEhBTCAiKSk7CisJCSAgICAgICApCisJCS8qIFNlbmQgREVMVFMgYWN0aW9uIGZyYW1lIHRvIEFQICovCisJCS8qIDA5MDgwMzogR2V0IHBlZXIgTUFDIGFkZHIgZnJvbSBzZXNzaW9uICovCisJCXNpcl9jb3B5X21hY19hZGRyKHBlZXJNYWNBZGRyLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKwkJLyogMDkwODAzOiBBZGQgdGhlIFNNRSBTZXNzaW9uIElEICovCisJCWxpbV9zZW5kX2RlbHRzX3JlcV9hY3Rpb25fZnJhbWUocE1hYywgcGVlck1hY0FkZHIsIHJzcFJlcWQsCisJCQkJCQkmcEFkZFRzUnNwTXNnLT50c3BlYy50c2luZm8sCisJCQkJCQkmcEFkZFRzUnNwTXNnLT50c3BlYywgcHNlc3Npb25FbnRyeSk7CisKKwkJLyogRGVsZXRlIFRTUEVDICovCisJCS8qIDA5MDgwMzogUHVsbCB0aGUgaGFzaCB0YWJsZSBmcm9tIHRoZSBzZXNzaW9uICovCisJCXBTdGEgPSBkcGhfbG9va3VwX2Fzc29jX2lkKHBNYWMsIHBBZGRUc1JzcE1zZy0+c3RhSWR4LCAmYXNzb2NJZCwKKwkJCQkJICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQlpZiAocFN0YSAhPSBOVUxMKQorCQkJbGltX2FkbWl0X2NvbnRyb2xfZGVsZXRlX3RzKHBNYWMsIGFzc29jSWQsCisJCQkJCQkgICAgJnBBZGRUc1JzcE1zZy0+dHNwZWMudHNpbmZvLAorCQkJCQkJICAgIE5VTEwsCisJCQkJCQkgICAgKHVpbnQ4X3QgKikgJnBBZGRUc1JzcE1zZy0+CisJCQkJCQkgICAgdHNwZWNJZHgpOworCisJCS8qIFNlbmQgU01FX0FERFRTX1JTUCAqLworCQkvKiAwOTA4MDM6IFVzZSB0aGUgc21lc2Vzc2lvbklkIGFuZCBzbWV0cmFuc2FjdGlvbklkIGZyb20gdGhlIFBFIHNlc3Npb24gY29udGV4dCAqLworCQlsaW1fc2VuZF9zbWVfYWRkdHNfcnNwKHBNYWMsIHJzcFJlcWQsIGVTSVJfU01FX0FERFRTX1JTUF9GQUlMRUQsCisJCQkJICAgICAgIHBzZXNzaW9uRW50cnksIHBBZGRUc1JzcE1zZy0+dHNwZWMsCisJCQkJICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7CisJCWdvdG8gZW5kOworCX0KKworZW5kOgorCWlmIChwQWRkVHNSc3BNc2cgIT0gTlVMTCkKKwkJY2RmX21lbV9mcmVlKHBBZGRUc1JzcE1zZyk7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fYWlkX21nbXQuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX2FpZF9tZ210LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzNTQzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX2FpZF9tZ210LmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV9haWRfbWdtdC5jIGNvbnRhaW5zIHRoZSBmdW5jdGlvbnMgcmVsYXRlZCB0bworICogQUlEIHBvb2wgbWFuYWdlbWVudCBsaWtlIGluaXRpYWxpemF0aW9uLCBhc3NpZ25tZW50IGV0Yy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAzLzIwLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgInduaV9jZmcuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgInNpcl9wYXJhbXMuaCIKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fdGltZXJfdXRpbHMuaCIKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2luY2x1ZGUgImxpbV9mdF9kZWZzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbi5oIgorI2luY2x1ZGUgImxpbV9zZXNzaW9uX3V0aWxzLmgiCisKKyNkZWZpbmUgTElNX1NUQVJUX1BFRVJfSURYICAgMQorCisvKioKKyAqIGxpbV9pbml0X3BlZXJfaWR4cG9vbCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgc3RhcnRpbmcgYSBCU1MgYXQgQVAKKyAqIHRvIGluaXRpYWxpemUgQUlEIHBvb2wuIFRoaXMgbWF5IGFsc28gYmUgY2FsbGVkIHdoaWxlCisgKiBzdGFydGluZy9qb2luaW5nIGFuIElCU1MgaWYgJ0Fzc29jaWF0aW9uJyBpcyBhbGxvd2VkCisgKiBpbiBJQlNTLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbV9pbml0X3BlZXJfaWR4cG9vbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5KQoreworCXVpbnQ4X3QgaTsKKwl1aW50OF90IG1heEFzc29jU3RhID0gcE1hYy0+bGltLmdMaW1Bc3NvY1N0YUxpbWl0OworCisJcFNlc3Npb25FbnRyeS0+Z3BMaW1QZWVySWR4cG9vbFswXSA9IDA7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCS8qIEluIHN0YXRpb24gcm9sZSwgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIgKGluZGV4IDEpIGlzIHJlc2VydmVkIGZvciBwZWVyICovCisJLyogc3RhdGlvbiBpbmRleCBjb3JyZXNwb25kaW5nIHRvIEFQLiBBdm9pZCBjaG9vc2luZyB0aGF0IGluZGV4IGFuZCBnZXQgaW5kZXggKi8KKwkvKiBzdGFydGluZyBmcm9tIChEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiArIDEpIChpbmRleCAyKSBmb3IgVERMUyBzdGF0aW9uczsgKi8KKwlpZiAoTElNX0lTX1NUQV9ST0xFKHBTZXNzaW9uRW50cnkpKSB7CisJCXBTZXNzaW9uRW50cnktPmZyZWVQZWVySWR4SGVhZCA9IERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSICsgMTsKKwl9IGVsc2UKKyNlbmRpZgorI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwlpZiAoTElNX0lTX0lCU1NfUk9MRShwU2Vzc2lvbkVudHJ5KSkgeworCQlwU2Vzc2lvbkVudHJ5LT5mcmVlUGVlcklkeEhlYWQgPSBMSU1fU1RBUlRfUEVFUl9JRFg7CisJCW1heEFzc29jU3RhID0gcE1hYy0+bGltLmdMaW1JYnNzU3RhTGltaXQ7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXBTZXNzaW9uRW50cnktPmZyZWVQZWVySWR4SGVhZCA9IExJTV9TVEFSVF9QRUVSX0lEWDsKKwl9CisKKwlmb3IgKGkgPSBwU2Vzc2lvbkVudHJ5LT5mcmVlUGVlcklkeEhlYWQ7IGkgPCBtYXhBc3NvY1N0YTsgaSsrKSB7CisJCXBTZXNzaW9uRW50cnktPmdwTGltUGVlcklkeHBvb2xbaV0gPSBpICsgMTsKKwl9CisJcFNlc3Npb25FbnRyeS0+Z3BMaW1QZWVySWR4cG9vbFtpXSA9IDA7CisKKwlwU2Vzc2lvbkVudHJ5LT5mcmVlUGVlcklkeFRhaWwgPSBpOworCit9CisKKy8qKgorICogbGltX2Fzc2lnbl9wZWVyX2lkeCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IGEgcGVlciBzdGF0aW9uIGluZGV4LiBUaGlzIGluZGV4IGlzCisgKiB1c2VkIGR1cmluZyBBc3NvY2lhdGlvbi9SZWFzc29jaWF0aW9uCisgKiBmcmFtZSBoYW5kbGluZyB0byBhc3NpZ24gYXNzb2NpYXRpb24gSUQgKGFpZCkgdG8gYSBTVEEuCisgKiBJbiBjYXNlIG9mIFRETFMsIHRoaXMgaXMgdXNlZCB0byBhc3NpZ24gYSBpbmRleCBpbnRvIHRoZSBEcGggaGFzaCBlbnRyeS4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIHBlZXJJZHggIC0gYXNzaWduZWQgcGVlciBTdGF0aW9uIElEeCBmb3IgU1RBCisgKi8KKwordWludDE2X3QgbGltX2Fzc2lnbl9wZWVyX2lkeCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5KQoreworCXVpbnQxNl90IHBlZXJJZDsKKworCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IGV4Y2VlZGVkIHRoZSBjb25maWd1cmFibGUgbGltaXQgb24gYXNzb2NpYXRpb25zICovCisJLyogVGhpcyBjb3VudCBpcyBnbG9iYWwgdG8gZW5zdXJlIHRoYXQgaXQgZG9lc250IGV4Y2VlZCB0aGUgaGFyZHdhcmUgbGltaXRzLiAqLworCWlmIChwZV9nZXRfY3VycmVudF9zdGFzX2NvdW50KHBNYWMpID49IHBNYWMtPmxpbS5nTGltQXNzb2NTdGFMaW1pdCkgeworCQkvKiB0b28gbWFueSBhc3NvY2lhdGlvbnMgYWxyZWFkeSBhY3RpdmUgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogcmV0dXJuIGhlYWQgb2YgZnJlZSBsaXN0ICovCisKKwlpZiAocFNlc3Npb25FbnRyeS0+ZnJlZVBlZXJJZHhIZWFkKSB7CisJCXBlZXJJZCA9IHBTZXNzaW9uRW50cnktPmZyZWVQZWVySWR4SGVhZDsKKwkJcFNlc3Npb25FbnRyeS0+ZnJlZVBlZXJJZHhIZWFkID0KKwkJCXBTZXNzaW9uRW50cnktPmdwTGltUGVlcklkeHBvb2xbcFNlc3Npb25FbnRyeS0+CisJCQkJCQkJZnJlZVBlZXJJZHhIZWFkXTsKKwkJaWYgKHBTZXNzaW9uRW50cnktPmZyZWVQZWVySWR4SGVhZCA9PSAwKQorCQkJcFNlc3Npb25FbnRyeS0+ZnJlZVBlZXJJZHhUYWlsID0gMDsKKwkJcFNlc3Npb25FbnRyeS0+Z0xpbU51bU9mQ3VycmVudFNUQXMrKzsKKwkJcmV0dXJuIHBlZXJJZDsKKwl9CisKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBubyBtb3JlIGZyZWUgcGVlciBpbmRleCAqLworfQorCisvKioKKyAqIGxpbV9yZWxlYXNlX3BlZXJfaWR4KCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgU1RBIGNvbnRleHQgaXMgcmVtb3ZlZAorICogYXQgQVAgKG9yIGF0IGEgU1RBIGluIElCU1MgbW9kZSBvciBURExTKSB0byByZXR1cm4gcGVlciBJbmRleAorICogdG8gZnJlZSBwb29sLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcGVlcklkeCAtIHBlZXIgc3RhdGlvbiBpbmRleCB0aGF0IG5lZWQgdG8gcmV0dXJuIHRvIGZyZWUgcG9vbAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbV9yZWxlYXNlX3BlZXJfaWR4KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IHBlZXJJZHgsCisJCSAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSkKK3sKKwlwU2Vzc2lvbkVudHJ5LT5nTGltTnVtT2ZDdXJyZW50U1RBcy0tOworCisJLyogaW5zZXJ0IGF0IHRhaWwgb2YgZnJlZSBsaXN0ICovCisJaWYgKHBTZXNzaW9uRW50cnktPmZyZWVQZWVySWR4VGFpbCkgeworCQlwU2Vzc2lvbkVudHJ5LT5ncExpbVBlZXJJZHhwb29sW3BTZXNzaW9uRW50cnktPgorCQkJCQkJZnJlZVBlZXJJZHhUYWlsXSA9CisJCQkodWludDhfdCkgcGVlcklkeDsKKwkJcFNlc3Npb25FbnRyeS0+ZnJlZVBlZXJJZHhUYWlsID0gKHVpbnQ4X3QpIHBlZXJJZHg7CisJfSBlbHNlIHsKKwkJcFNlc3Npb25FbnRyeS0+ZnJlZVBlZXJJZHhUYWlsID0KKwkJCXBTZXNzaW9uRW50cnktPmZyZWVQZWVySWR4SGVhZCA9ICh1aW50OF90KSBwZWVySWR4OworCX0KKwlwU2Vzc2lvbkVudHJ5LT5ncExpbVBlZXJJZHhwb29sWyh1aW50OF90KSBwZWVySWR4XSA9IDA7Cit9CmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9hcGkuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMGRjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9hcGkuYwpAQCAtMCwwICsxLDIyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgbGltX2FwaS5jYyBjb250YWlucyB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlCisgKiBleHBvcnRlZCBieSBMSU0gdG8gb3RoZXIgbW9kdWxlcy4KKyAqCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgInduaV9jZmcuaCIKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAic2lyX2NvbW1vbi5oIgorI2luY2x1ZGUgInNpcl9kZWJ1Zy5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKworI2luY2x1ZGUgInNjaF9hcGkuaCIKKyNpbmNsdWRlICJ1dGlsc19hcGkuaCIKKyNpbmNsdWRlICJsaW1fYXBpLmgiCisjaW5jbHVkZSAibGltX2dsb2JhbC5oIgorI2luY2x1ZGUgImxpbV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9hc3NvY191dGlscy5oIgorI2luY2x1ZGUgImxpbV9wcm9wX2V4dHNfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VyX2Rlc191dGlscy5oIgorI2luY2x1ZGUgImxpbV9pYnNzX3BlZXJfbWdtdC5oIgorI2luY2x1ZGUgImxpbV9hZG1pdF9jb250cm9sLmgiCisjaW5jbHVkZSAibGltX3NlbmRfc21lX3JzcF9tZXNzYWdlcy5oIgorI2luY2x1ZGUgIndtbV9hcHNkLmgiCisjaW5jbHVkZSAibGltX3RyYWNlLmgiCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlICJsaW1fZnRfZGVmcy5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltX3Nlc3Npb24uaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybV9hcGkuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bGltX2Z0Lmg+CisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RzX3BhY2tldC5oIgorI2luY2x1ZGUgImNkc191dGlscy5oIgorI2luY2x1ZGUgInN5c19zdGFydHVwLmgiCisKK3N0YXRpYyB2b2lkIF9fbGltX2luaXRfc2Nhbl92YXJzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJcE1hYy0+bGltLmdMaW1Vc2VTY2FuTW9kZUZvckxlYXJuTW9kZSA9IDE7CisKKwlwTWFjLT5saW0uZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSA9IDA7CisKKwkvKiBTY2FuIHJlbGF0ZWQgZ2xvYmFscyBvbiBTVEEgKi8KKwlwTWFjLT5saW0uZ0xpbVJldHVybkFmdGVyRmlyc3RNYXRjaCA9IDA7CisJcE1hYy0+bGltLmdMaW0yNEJhbmQxMWRTY2FuRG9uZSA9IDA7CisJcE1hYy0+bGltLmdMaW01MEJhbmQxMWRTY2FuRG9uZSA9IDA7CisJcE1hYy0+bGltLmdMaW1SZXR1cm5VbmlxdWVSZXN1bHRzID0gMDsKKworCXBNYWMtPmxpbS5nTGltQ3VycmVudFNjYW5DaGFubmVsSWQgPSAwOworCXBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEgPSBOVUxMOworCXBNYWMtPmxpbS5nRGVmZXJNc2dUeXBlRm9yTk9BID0gMDsKKwlwTWFjLT5saW0uZ3BEZWZkU21lTXNnRm9yTk9BID0gTlVMTDsKKworCXBNYWMtPmxpbS5nTGltUmVzdG9yZUNCTnVtU2NhbkludGVydmFsID0KKwkJTElNX1JFU1RPUkVfQ0JfTlVNX1NDQU5fSU5URVJWQUxfREVGQVVMVDsKKwlwTWFjLT5saW0uZ0xpbVJlc3RvcmVDQkNvdW50ID0gMDsKKwljZGZfbWVtX3NldChwTWFjLT5saW0uZ0xpbUxlZ2FjeUJzc2lkTGlzdCwKKwkJICAgIHNpemVvZihwTWFjLT5saW0uZ0xpbUxlZ2FjeUJzc2lkTGlzdCksIDApOworCisJLyogRmlsbCBpbiBkZWZhdWx0IHZhbHVlcyAqLworCisJLyogYWJvcnQgc2NhbiBpcyB1c2VkIHRvIGFib3J0IGFuIG9uLWdvaW5nIHNjYW4gKi8KKwlwTWFjLT5saW0uYWJvcnRTY2FuID0gMDsKKwljZGZfbWVtX3NldCgmcE1hYy0+bGltLnNjYW5DaG5JbmZvLCBzaXplb2YodExpbVNjYW5DaG5JbmZvKSwgMCk7CisJY2RmX21lbV9zZXQoJnBNYWMtPmxpbS5kZnNjaGFubmVsTGlzdCwgc2l6ZW9mKHRTaXJERlNDaGFubmVsTGlzdCksIDApOworCisvKiBXTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkICovCisJcE1hYy0+bGltLmdwTGltU3VzcGVuZENhbGxiYWNrID0gTlVMTDsKKwlwTWFjLT5saW0uZ3BMaW1SZXN1bWVDYWxsYmFjayA9IE5VTEw7CisvKiBlbmQgV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZCAqLworfQorCitzdGF0aWMgdm9pZCBfX2xpbV9pbml0X2Jzc192YXJzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJY2RmX21lbV9zZXQoKHZvaWQgKilwTWFjLT5saW0uZ3BTZXNzaW9uLAorCQkgICAgc2l6ZW9mKCpwTWFjLT5saW0uZ3BTZXNzaW9uKSAqIHBNYWMtPmxpbS5tYXhCc3NJZCwgMCk7CisKKwkvKiBUaGlzIGlzIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHksIGJlIGRlZmF1bHQgc2hvdWxkIGFsd2F5cyBiZSBvZmYgKi8KKwlwTWFjLT5saW0uZ0xpbUZvcmNlTm9Qcm9wSUUgPSAwOworCXBNYWMtPmxpbS5ncExpbU1sbVNldEtleXNSZXEgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2xpbV9pbml0X3N0YXRzX3ZhcnModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlwTWFjLT5saW0uZ0xpbU51bUJlYWNvbnNSY3ZkID0gMDsKKwlwTWFjLT5saW0uZ0xpbU51bUJlYWNvbnNJZ25vcmVkID0gMDsKKworCXBNYWMtPmxpbS5nTGltTnVtRGVmZXJyZWRNc2dzID0gMDsKKworCS8qIC8gVmFyaWFibGUgdG8ga2VlcCB0cmFjayBvZiBudW1iZXIgb2YgY3VycmVudGx5IGFzc29jaWF0ZWQgU1RBcyAqLworCXBNYWMtPmxpbS5nTGltTnVtT2ZBbmlTVEFzID0gMDsgLyogY291bnQgb2YgQU5JIHBlZXJzICovCisKKwkvKiBIZWFydC1CZWF0IGludGVydmFsIHZhbHVlICovCisJcE1hYy0+bGltLmdMaW1IZWFydEJlYXRDb3VudCA9IDA7CisKKwljZGZfbWVtX3plcm8ocE1hYy0+bGltLmdMaW1IZWFydEJlYXRBcE1hY1swXSwKKwkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCWNkZl9tZW1femVybyhwTWFjLT5saW0uZ0xpbUhlYXJ0QmVhdEFwTWFjWzFdLAorCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJcE1hYy0+bGltLmdMaW1IZWFydEJlYXRBcE1hY0luZGV4ID0gMDsKKworCS8qIFN0YXRpc3RpY3MgdG8ga2VlcCB0cmFjayBvZiBuby4gYmVhY29ucyByY3ZkIGluIGhlYXJ0IGJlYXQgaW50ZXJ2YWwgKi8KKwljZGZfbWVtX3NldChwTWFjLT5saW0uZ0xpbUhlYXJ0QmVhdEJlYWNvblN0YXRzLAorCQkgICAgc2l6ZW9mKHBNYWMtPmxpbS5nTGltSGVhcnRCZWF0QmVhY29uU3RhdHMpLCAwKTsKKworI2lmZGVmIFdMQU5fREVCVUcKKwkvKiBEZWJ1ZyBjb3VudGVycyAqLworCXBNYWMtPmxpbS5udW1Ub3QgPSAwOworCXBNYWMtPmxpbS5udW1CYnQgPSAwOworCXBNYWMtPmxpbS5udW1Qcm90RXJyID0gMDsKKwlwTWFjLT5saW0ubnVtTGVhcm4gPSAwOworCXBNYWMtPmxpbS5udW1MZWFybklnbm9yZSA9IDA7CisJcE1hYy0+bGltLm51bVNtZSA9IDA7CisJY2RmX21lbV9zZXQocE1hYy0+bGltLm51bU1BQywgc2l6ZW9mKHBNYWMtPmxpbS5udW1NQUMpLCAwKTsKKwlwTWFjLT5saW0uZ0xpbU51bUFzc29jUmVxRHJvcEludmxkU3RhdGUgPSAwOworCXBNYWMtPmxpbS5nTGltTnVtQXNzb2NSZXFEcm9wQUNSZWplY3RUUyA9IDA7CisJcE1hYy0+bGltLmdMaW1OdW1Bc3NvY1JlcURyb3BBQ1JlamVjdFN0YSA9IDA7CisJcE1hYy0+bGltLmdMaW1OdW1SZWFzc29jUmVxRHJvcEludmxkU3RhdGUgPSAwOworCXBNYWMtPmxpbS5nTGltTnVtSGFzaE1pc3NJZ25vcmVkID0gMDsKKwlwTWFjLT5saW0uZ0xpbVVuZXhwQmNuQ250ID0gMDsKKwlwTWFjLT5saW0uZ0xpbUJjblNTSURNaXNtYXRjaENudCA9IDA7CisJcE1hYy0+bGltLmdMaW1OdW1MaW5rRXN0cyA9IDA7CisJcE1hYy0+bGltLmdMaW1OdW1SeENsZWFudXAgPSAwOworCXBNYWMtPmxpbS5nTGltMTFiU3RhQXNzb2NSZWplY3RDb3VudCA9IDA7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19saW1faW5pdF9zdGF0ZXModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwkvKiBDb3VudHMgSGVhcnRiZWF0IGZhaWx1cmVzICovCisJcE1hYy0+bGltLmdMaW1IQmZhaWx1cmVDbnRJbkxpbmtFc3RTdGF0ZSA9IDA7CisJcE1hYy0+bGltLmdMaW1Qcm9iZUZhaWx1cmVBZnRlckhCZmFpbGVkQ250ID0gMDsKKwlwTWFjLT5saW0uZ0xpbUhCZmFpbHVyZUNudEluT3RoZXJTdGF0ZXMgPSAwOworCXBNYWMtPmxpbS5nTGltUnNwUmVxZCA9IDA7CisJcE1hYy0+bGltLmdMaW1QcmV2U21lU3RhdGUgPSBlTElNX1NNRV9PRkZMSU5FX1NUQVRFOworCisJLyogLyBNTE0gU3RhdGUgdmlzaWJsZSBhY3Jvc3MgYWxsIFNpcml1cyBtb2R1bGVzICovCisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBOT19TRVNTSU9OLCBlTElNX01MTV9JRExFX1NUQVRFKSk7CisJcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0lETEVfU1RBVEU7CisKKwkvKiAvIFByZXZpb3VzIE1MTSBTdGF0ZSAqLworCXBNYWMtPmxpbS5nTGltUHJldk1sbVN0YXRlID0gZUxJTV9NTE1fT0ZGTElORV9TVEFURTsKKworCS8qIExJTSB0byBIQUwgU0NBTiBNYW5hZ2VtZW50IE1lc3NhZ2UgSW50ZXJmYWNlIHN0YXRlcyAqLworCXBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID0gZUxJTV9IQUxfSURMRV9TQ0FOX1NUQVRFOworCisJLyoqCisJICogSW5pdGlhbGl6ZSBzdGF0ZSB0byBlTElNX1NNRV9PRkZMSU5FX1NUQVRFCisJICovCisJcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9IGVMSU1fU01FX09GRkxJTkVfU1RBVEU7CisKKwkvKioKKwkgKiBCeSBkZWZhdWx0IGFzc3VtZSAndW5rbm93bicgcm9sZS4gVGhpcyB3aWxsIGJlIHVwZGF0ZWQKKwkgKiB3aGVuIFNNRV9TVEFSVF9CU1NfUkVRIGlzIHJlY2VpdmVkLgorCSAqLworCisJY2RmX21lbV9zZXQoJnBNYWMtPmxpbS5nTGltT3ZlcmxhcDExZ1BhcmFtcywgc2l6ZW9mKHRMaW1Qcm90U3RhUGFyYW1zKSwKKwkJICAgIDApOworCWNkZl9tZW1fc2V0KCZwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWFQYXJhbXMsIHNpemVvZih0TGltUHJvdFN0YVBhcmFtcyksCisJCSAgICAwKTsKKwljZGZfbWVtX3NldCgmcE1hYy0+bGltLmdMaW1PdmVybGFwSHQyMFBhcmFtcywgc2l6ZW9mKHRMaW1Qcm90U3RhUGFyYW1zKSwKKwkJICAgIDApOworCWNkZl9tZW1fc2V0KCZwTWFjLT5saW0uZ0xpbU92ZXJsYXBOb25HZlBhcmFtcywKKwkJICAgIHNpemVvZih0TGltUHJvdFN0YVBhcmFtcyksIDApOworCWNkZl9tZW1fc2V0KCZwTWFjLT5saW0uZ0xpbU5vU2hvcnRQYXJhbXMsIHNpemVvZih0TGltTm9TaG9ydFBhcmFtcyksIDApOworCWNkZl9tZW1fc2V0KCZwTWFjLT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLAorCQkgICAgc2l6ZW9mKHRMaW1Ob1Nob3J0U2xvdFBhcmFtcyksIDApOworCisJcE1hYy0+bGltLmdMaW1QaHlNb2RlID0gMDsKKwlwTWFjLT5saW0uc2NhblN0YXJ0VGltZSA9IDA7ICAgIC8qIHVzZWQgdG8gbWVhc3VyZSBzY2FuIHRpbWUgKi8KKworCWNkZl9tZW1fc2V0KHBNYWMtPmxpbS5nTGltTXlNYWNBZGRyLCBzaXplb2YocE1hYy0+bGltLmdMaW1NeU1hY0FkZHIpLAorCQkgICAgMCk7CisJcE1hYy0+bGltLmFja1BvbGljeSA9IDA7CisKKwlwTWFjLT5saW0uZ0xpbVByb2JlUmVzcERpc2FibGVGbGFnID0gMDsgLyogY29udHJvbCBvdmVyIHByb2JlIHJlc3AgKi8KK30KKworc3RhdGljIHZvaWQgX19saW1faW5pdF92YXJzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJLyogUGxhY2UgaG9sZGVyIGZvciBNZWFzdXJlbWVudCBSZXEvUnNwL0luZCByZWxhdGVkIGluZm8gKi8KKworCisJLyogRGVmZXJyZWQgUXVldWUgUGFyYW10ZXJzICovCisJY2RmX21lbV9zZXQoJnBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLCBzaXplb2YodFNpckFkZHRzUmVxKSwgMCk7CisKKwkvKiBhZGR0cyByZXF1ZXN0IGlmIGFueSAtIG9ubHkgb25lIGNhbiBiZSBvdXRzdGFuZGluZyBhdCBhbnkgdGltZSAqLworCWNkZl9tZW1fc2V0KCZwTWFjLT5saW0uZ0xpbUFkZHRzUmVxLCBzaXplb2YodFNpckFkZHRzUmVxKSwgMCk7CisJcE1hYy0+bGltLmdMaW1BZGR0c1NlbnQgPSAwOworCXBNYWMtPmxpbS5nTGltQWRkdHNSc3BUaW1lckNvdW50ID0gMDsKKworCS8qIHByb3RlY3Rpb24gcmVsYXRlZCBjb25maWcgY2FjaGUgKi8KKwljZGZfbWVtX3NldCgmcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24sIHNpemVvZih0Q2ZnUHJvdGVjdGlvbiksIDApOworCXBNYWMtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgPSAwOworCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCisJLyogV01NIFJlbGF0ZWQgRmxhZyAqLworCXBNYWMtPmxpbS5nVWFwc2RFbmFibGUgPSAwOworCXBNYWMtPmxpbS5nVWFwc2RQZXJBY0JpdG1hc2sgPSAwOworCisJLyogUW9TLUFDIERvd25ncmFkZTogSW5pdGlhbGx5LCBubyBBQyBpcyBhZG1pdHRlZCAqLworCXBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LXSA9IDA7CisJcE1hYy0+bGltLmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9ETkxJTktdID0gMDsKKworCS8qIGRpYWxvZ3VlIHRva2VuIExpc3QgaGVhZC90YWlsIGZvciBBY3Rpb24gZnJhbWVzIHJlcXVlc3Qgc2VudC4gKi8KKwlwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5IZWFkID0gTlVMTDsKKwlwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5UYWlsID0gTlVMTDsKKworCWNkZl9tZW1fc2V0KCZwTWFjLT5saW0udHNwZWNJbmZvLAorCQkgICAgc2l6ZW9mKHRMaW1Uc3BlY0luZm8pICogTElNX05VTV9UU1BFQ19NQVgsIDApOworCisJLyogYWRtaXNzaW9uIGNvbnRyb2wgcG9saWN5IGluZm9ybWF0aW9uICovCisJY2RmX21lbV9zZXQoJnBNYWMtPmxpbS5hZG1pdFBvbGljeUluZm8sIHNpemVvZih0TGltQWRtaXRQb2xpY3lJbmZvKSwgMCk7CisKKwlwTWFjLT5saW0uZ0xhc3RCZWFjb25EdGltQ291bnQgPSAwOworCXBNYWMtPmxpbS5nTGFzdEJlYWNvbkR0aW1QZXJpb2QgPSAwOworCisJLyogU2NhbiBpbiBQb3dlciBTYXZlIEZsYWcgKi8KKwlwTWFjLT5saW0uZ1NjYW5JblBvd2Vyc2F2ZSA9IDA7CisJcE1hYy0+bGltLnByb2JlQ291bnRlciA9IDA7CisJcE1hYy0+bGltLm1heFByb2JlID0gMDsKK30KKworc3RhdGljIHZvaWQgX19saW1faW5pdF9hc3NvY192YXJzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDMyX3QgdmFsOworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlULCAmdmFsKQorCQkhPSBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgYXNzb2Mgc3RhIGxpbWl0IGZhaWxlZCIpKTsKKwlwTWFjLT5saW0uZ0xpbUFzc29jU3RhTGltaXQgPSB2YWw7CisJcE1hYy0+bGltLmdMaW1JYnNzU3RhTGltaXQgPSB2YWw7CisJLyogUGxhY2UgaG9sZGVyIGZvciBjdXJyZW50IGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgKi8KKwkvKiBiZWluZyBoYW5kbGVkICovCisJcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcSA9IE5VTEw7CisKKwkvKiAvIE1BQyBsZXZlbCBQcmUtYXV0aGVudGljYXRpb24gcmVsYXRlZCBnbG9iYWxzICovCisJcE1hYy0+bGltLmdMaW1QcmVBdXRoQ2hhbm5lbE51bWJlciA9IDA7CisJcE1hYy0+bGltLmdMaW1QcmVBdXRoVHlwZSA9IGVTSVJfT1BFTl9TWVNURU07CisJY2RmX21lbV9zZXQoJnBNYWMtPmxpbS5nTGltUHJlQXV0aFBlZXJBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpLCAwKTsKKwlwTWFjLT5saW0uZ0xpbU51bVByZUF1dGhDb250ZXh0cyA9IDA7CisJY2RmX21lbV9zZXQoJnBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUsIHNpemVvZih0TGltUHJlQXV0aFRhYmxlKSwKKwkJICAgIDApOworCisJLyogUGxhY2VkIGhvbGRlciB0byBkZWF1dGggcmVhc29uICovCisJcE1hYy0+bGltLmdMaW1EZWF1dGhSZWFzb25Db2RlID0gMDsKKworCS8qIFBsYWNlIGhvbGRlciBmb3IgUHJlLWF1dGhlbnRpY2F0aW9uIG5vZGUgbGlzdCAqLworCXBNYWMtPmxpbS5wTGltUHJlQXV0aExpc3QgPSBOVUxMOworCisJLyogU2VuZCBEaXNhc3NvY2lhdGUgZnJhbWUgdGhyZXNob2xkIHBhcmFtZXRlcnMgKi8KKwlwTWFjLT5saW0uZ0xpbURpc2Fzc29jRnJhbWVUaHJlc2hvbGQgPQorCQlMSU1fU0VORF9ESVNBU1NPQ19GUkFNRV9USFJFU0hPTEQ7CisJcE1hYy0+bGltLmdMaW1EaXNhc3NvY0ZyYW1lQ3JlZGl0ID0gMDsKKworCS8qIE9uZSBjYWNoZSBmb3IgZWFjaCBvdmVybGFwIGFuZCBhc3NvY2lhdGVkIGNhc2UuICovCisJY2RmX21lbV9zZXQocE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGUsCisJCSAgICBzaXplb2YodENhY2hlUGFyYW1zKSAqIExJTV9QUk9UX1NUQV9PVkVSTEFQX0NBQ0hFX1NJWkUsIDApOworCWNkZl9tZW1fc2V0KHBNYWMtPmxpbS5wcm90U3RhQ2FjaGUsCisJCSAgICBzaXplb2YodENhY2hlUGFyYW1zKSAqIExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFLCAwKTsKKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCXBNYWMtPmxpbS5wU2Vzc2lvbkVudHJ5ID0gTlVMTDsKKwlwTWFjLT5saW0ucmVBc3NvY1JldHJ5QXR0ZW1wdCA9IDA7CisjZW5kaWYKKworfQorCitzdGF0aWMgdm9pZCBfX2xpbV9pbml0X2h0X3ZhcnModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlwTWFjLT5saW0uaHRDYXBhYmlsaXR5UHJlc2VudEluQmVhY29uID0gMDsKKwlwTWFjLT5saW0uZ0hUR3JlZW5maWVsZCA9IDA7CisJcE1hYy0+bGltLmdIVFNob3J0R0k0ME1oeiA9IDA7CisJcE1hYy0+bGltLmdIVFNob3J0R0kyME1oeiA9IDA7CisJcE1hYy0+bGltLmdIVE1heEFtc2R1TGVuZ3RoID0gMDsKKwlwTWFjLT5saW0uZ0hURHNzc0Nja1JhdGU0ME1IelN1cHBvcnQgPSAwOworCXBNYWMtPmxpbS5nSFRQU01QU3VwcG9ydCA9IDA7CisJcE1hYy0+bGltLmdIVExzaWdUWE9QUHJvdGVjdGlvbiA9IDA7CisJcE1hYy0+bGltLmdIVE1JTU9QU1N0YXRlID0gZVNJUl9IVF9NSU1PX1BTX1NUQVRJQzsKKwlwTWFjLT5saW0uZ0hUQU1wZHVEZW5zaXR5ID0gMDsKKworCXBNYWMtPmxpbS5nTWF4QW1zZHVTaXplRW5hYmxlZCA9IGZhbHNlOworCXBNYWMtPmxpbS5nSFRNYXhSeEFNcGR1RmFjdG9yID0gMDsKKwlwTWFjLT5saW0uZ0hUU2VydmljZUludGVydmFsR3JhbnVsYXJpdHkgPSAwOworCXBNYWMtPmxpbS5nSFRDb250cm9sbGVkQWNjZXNzT25seSA9IDA7CisJcE1hYy0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisJcE1hYy0+bGltLmdIVFBDT0FjdGl2ZSA9IDA7CisKKwlwTWFjLT5saW0uZ0hUUENPUGhhc2UgPSAwOworCXBNYWMtPmxpbS5nSFRTZWNvbmRhcnlCZWFjb24gPSAwOworCXBNYWMtPmxpbS5nSFREdWFsQ1RTUHJvdGVjdGlvbiA9IDA7CisJcE1hYy0+bGltLmdIVFNUQkNCYXNpY01DUyA9IDA7Cit9CisKK3N0YXRpYyB0U2lyUmV0U3RhdHVzIF9fbGltX2luaXRfY29uZmlnKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDMyX3QgdmFsMSwgdmFsMiwgdmFsMzsKKwl1aW50MTZfdCB2YWwxNjsKKwl1aW50OF90IHZhbDg7CisJdFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gKnBIVENhcGFiaWxpdHlJbmZvOworCXRTaXJNYWNIVEluZm9GaWVsZDEgKnBIVEluZm9GaWVsZDE7CisJdFNpck1hY0hUUGFyYW1ldGVyc0luZm8gKnBBbXBkdVBhcmFtSW5mbzsKKworCS8qIFJlYWQgYWxsIHRoZSBDRkdzIGhlcmUgdGhhdCB3ZXJlIHVwZGF0ZWQgYmVmb3JlIHBlX3N0YXJ0IGlzIGNhbGxlZCAqLworCS8qIEFsbCB0aGVzZSBDRkcgUkVBRFMvV1JJVEVTIGFyZSBvbmx5IGFsbG93ZWQgaW4gaW5pdCwgYXQgc3RhcnQgd2hlbiB0aGVyZSBpcyBubyBzZXNzaW9uCisJICogYW5kIHRoZXkgd2lsbCBiZSB1c2VkIHRocm91Z2hvdXQgd2hlbiB0aGVyZSBpcyBubyBzZXNzaW9uCisJICovCisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0hUX0NBUF9JTkZPLCAmdmFsMSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgSFQgQ2FwIENGRyIpKTspCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSwgJnZhbDIpICE9CisJICAgIGVTSVJfU1VDQ0VTUykgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQ2hhbm5lbCBCb25kaW5nIENGRyIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJdmFsMTYgPSAodWludDE2X3QpIHZhbDE7CisJcEhUQ2FwYWJpbGl0eUluZm8gPSAodFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gKikgJnZhbDE2OworCisJLyogY2hhbm5lbCBib25kaW5nIG1vZGUgY291bGQgYmUgc2V0IHRvIGFueXRoaW5nIGZyb20gMCB0byA0KFRpdGFuIGhhZCB0aGVzZSAqLworCS8qIG1vZGVzIEJ1dCBmb3IgVGF1cnVzIHdlIGhhdmUgb25seSB0d28gbW9kZXM6IGVuYWJsZSg+MCkgb3IgZGlzYWJsZSg9MCkgKi8KKwlwSFRDYXBhYmlsaXR5SW5mby0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0gdmFsMiA/CisJCQkJCQkgICAgICBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0VOQUJMRSA6CisJCQkJCQkgICAgICBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisJaWYgKGNmZ19zZXRfaW50CisJCSAgICAocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgKih1aW50MTZfdCAqKSBwSFRDYXBhYmlsaXR5SW5mbykKKwkgICAgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgdXBkYXRlIEhUIENhcCBJbmZvIENGRyIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0hUX0lORk9fRklFTEQxLCAmdmFsMSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBIVCBJTkZPIEZpZWxkMSBDRkciKSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJdmFsOCA9ICh1aW50OF90KSB2YWwxOworCXBIVEluZm9GaWVsZDEgPSAodFNpck1hY0hUSW5mb0ZpZWxkMSAqKSAmdmFsODsKKwlwSFRJbmZvRmllbGQxLT5yZWNvbW1lbmRlZFR4V2lkdGhTZXQgPQorCQkodWludDhfdCkgcEhUQ2FwYWJpbGl0eUluZm8tPnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKwlpZiAoY2ZnX3NldF9pbnQocE1hYywgV05JX0NGR19IVF9JTkZPX0ZJRUxEMSwgKih1aW50OF90ICopIHBIVEluZm9GaWVsZDEpCisJICAgICE9IGVTSVJfU1VDQ0VTUykgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHVwZGF0ZSBIVCBJbmZvIEZpZWxkIikpOykKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwkvKiBXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xEICovCisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xELCAmdmFsMSkgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJjb3VsZCBub3QgcmV0cmlldmUgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCBDRkciKSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCWlmICghdmFsMSkgeworCQlwTWFjLT5zeXMuZ1N5c0VuYWJsZUxpbmtNb25pdG9yTW9kZSA9IDA7CisJfSBlbHNlIHsKKwkJLyogTm8gbmVlZCB0byBhY3RpdmF0ZSB0aGUgdGltZXIgZHVyaW5nIGluaXQgdGltZS4gKi8KKwkJcE1hYy0+c3lzLmdTeXNFbmFibGVMaW5rTW9uaXRvck1vZGUgPSAxOworCX0KKworCS8qIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFogKi8KKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBIVCBDYXAgQ0ZHIikpOykKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19TSE9SVF9HSV8yME1IWiwgJnZhbDIpICE9IGVTSVJfU1VDQ0VTUykgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIHNob3J0R0kgMjBNaHogQ0ZHIikpOworCQkgICAgICAgKQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaLCAmdmFsMykgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgc2hvcnRHSSA0ME1oeiBDRkciKSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJdmFsMTYgPSAodWludDE2X3QpIHZhbDE7CisJcEhUQ2FwYWJpbGl0eUluZm8gPSAodFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gKikgJnZhbDE2OworCXBIVENhcGFiaWxpdHlJbmZvLT5zaG9ydEdJMjBNSHogPSAodWludDE2X3QpIHZhbDI7CisJcEhUQ2FwYWJpbGl0eUluZm8tPnNob3J0R0k0ME1IeiA9ICh1aW50MTZfdCkgdmFsMzsKKworCWlmIChjZmdfc2V0X2ludAorCQkgICAgKHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sCisJCSAgICAqKHVpbnQxNl90ICopIHBIVENhcGFiaWxpdHlJbmZvKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgQ2FwIEluZm8gQ0ZHIikpOworCQkgICAgICAgKQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCS8qIFdOSV9DRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUiAqLworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19IVF9BTVBEVV9QQVJBTVMsICZ2YWwxKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEhUIEFNUERVIFBhcmFtIENGRyIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SLCAmdmFsMikgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQU1QRFUgRmFjdG9yIENGRyIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJdmFsMTYgPSAodWludDE2X3QpIHZhbDE7CisJcEFtcGR1UGFyYW1JbmZvID0gKHRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvICopICZ2YWwxNjsKKwlwQW1wZHVQYXJhbUluZm8tPm1heFJ4QU1QRFVGYWN0b3IgPSAodWludDhfdCkgdmFsMjsKKwlpZiAoY2ZnX3NldF9pbnQKKwkJICAgIChwTWFjLCBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNUywKKwkJICAgICoodWludDhfdCAqKSBwQW1wZHVQYXJhbUluZm8pICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJjZmcgZ2V0IHNob3J0IHByZWFtYmxlIGZhaWxlZCIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwkvKiBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFIC0gdGhpcyBvbmUgaXMgbm90IHVwZGF0ZWQgaW4KKwkgICBsaW1faGFuZGxlX2NmX2dwYXJhbV91cGRhdGUgZG8gd2Ugd2FudCB0byB1cGRhdGUgdGhpcz8gKi8KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFLCAmdmFsMSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgc2hvcnQgcHJlYW1ibGUgZmFpbGVkIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCS8qIFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfREFUQSAtIG5vdCBuZWVkZWQgKi8KKworCS8qIFRoaXMgd2FzIGluaXRpYWxseSBkb25lIGFmdGVyIHJlc3VtZSBub3RpZmljYXRpb24gZnJvbSBIQUwuIE5vdywgREFMIGlzCisJICAgc3RhcnRlZCBiZWZvcmUgUEUgc28gdGhpcyBjYW4gYmUgZG9uZSBoZXJlICovCisJaGFuZGxlX2h0X2NhcGFiaWxpdHlhbmRfaHRfaW5mbyhwTWFjLCBOVUxMKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9CisJICAgIHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19ESVNBQkxFX0xEUENfV0lUSF9UWEJGX0FQLAorCQkJICAgICAodWludDMyX3QgKikgJnBNYWMtPmxpbS5kaXNhYmxlTERQQ1dpdGhUeGJmQVApKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgZGlzYWJsZUxEUENXaXRoVHhiZkFQIGZhaWxlZCIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19URExTX0JVRl9TVEFfRU5BQkxFRCwKKwkJCQkJICAgICAodWludDMyX3QgKikgJnBNYWMtPmxpbS4KKwkJCQkJICAgICBnTGltVERMU0J1ZlN0YUVuYWJsZWQpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgTGltVERMU0J1ZlN0YUVuYWJsZWQgZmFpbGVkIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlpZiAoZVNJUl9TVUNDRVNTICE9CisJICAgIHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19URExTX1FPU19XTU1fVUFQU0RfTUFTSywKKwkJCSAgICAgKHVpbnQzMl90ICopICZwTWFjLT5saW0uZ0xpbVRETFNVYXBzZE1hc2spKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgTGltVERMU1VhcHNkTWFzayBmYWlsZWQiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkgICAgd2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1RETFNfT0ZGX0NIQU5ORUxfRU5BQkxFRCwKKwkJCSAgICAgKHVpbnQzMl90ICopICZwTWFjLT5saW0uCisJCQkgICAgIGdMaW1URExTT2ZmQ2hhbm5lbEVuYWJsZWQpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgTGltVERMU1VhcHNkTWFzayBmYWlsZWQiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSB3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfVERMU19XTU1fTU9ERV9FTkFCTEVELAorCQkJCQkgICAgICh1aW50MzJfdCAqKSAmcE1hYy0+bGltLgorCQkJCQkgICAgIGdMaW1URExTV21tTW9kZSkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBMaW1URExTV21tTW9kZSBmYWlsZWQiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorI2VuZGlmCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoKKyAgIGxpbV9zdGFydAorICAgVGhpcyBmdW5jdGlvbiBpcyB0byByZXBsYWNlIHRoZSBfX2xpbV9wcm9jZXNzX3NtZV9zdGFydF9yZXEgc2luY2UgdGhlcmUgaXMgbm8KKyAgIGVXTklfU01FX1NUQVJUX1JFUSBwb3N0IHRvIFBFLgorICovCit0U2lyUmV0U3RhdHVzIGxpbV9zdGFydCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRTaXJSZXN1bHRDb2RlcyByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoIiBlbnRlciIpKTspCisKKwlpZiAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9PRkZMSU5FX1NUQVRFKSB7CisJCXBNYWMtPmxpbS5nTGltU21lU3RhdGUgPSBlTElNX1NNRV9JRExFX1NUQVRFOworCisJCU1UUkFDRShtYWNfdHJhY2UKKwkJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIE5PX1NFU1NJT04sCisJCQkgICAgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworCisJCS8qIEJ5IGRlZmF1bHQgZG8gbm90IHJldHVybiBhZnRlciBmaXJzdCBzY2FuIG1hdGNoICovCisJCXBNYWMtPmxpbS5nTGltUmV0dXJuQWZ0ZXJGaXJzdE1hdGNoID0gMDsKKworCQkvKiBJbml0aWFsaXplIE1MTSBzdGF0ZSBtYWNoaW5lICovCisJCWxpbV9pbml0X21sbShwTWFjKTsKKworCQkvKiBCeSBkZWZhdWx0IHJldHVybiB1bmlxdWUgc2NhbiByZXN1bHRzICovCisJCXBNYWMtPmxpbS5nTGltUmV0dXJuVW5pcXVlUmVzdWx0cyA9IHRydWU7CisJfSBlbHNlIHsKKwkJLyoqCisJCSAqIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBlV05JX1NNRV9TVEFSVF9SRVEgaW4gc3RhdGVzCisJCSAqIG90aGVyIHRoYW4gT0ZGTElORS4gUmV0dXJuIHJlc3BvbnNlIHRvIGhvc3QgYW5kCisJCSAqIGxvZyBlcnJvcgorCQkgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBTTUUgc3RhdGUgJVgiKSwKKwkJCXBNYWMtPmxpbS5nTGltU21lU3RhdGUpOworCQlyZXRDb2RlID0gZVNJUl9GQUlMVVJFOworCX0KKworCXJldHVybiByZXRDb2RlOworfQorCisvKioKKyAqIGxpbV9pbml0aWFsaXplKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIExJTSB0aHJlYWQgZW50cnkgZnVuY3Rpb24uCisgKiBMSU0gcmVsYXRlZCBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqIE5BCisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBnbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cyBsaW1faW5pdGlhbGl6ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCisJX19saW1faW5pdF9hc3NvY192YXJzKHBNYWMpOworCV9fbGltX2luaXRfdmFycyhwTWFjKTsKKwlfX2xpbV9pbml0X3N0YXRlcyhwTWFjKTsKKwlfX2xpbV9pbml0X3N0YXRzX3ZhcnMocE1hYyk7CisJX19saW1faW5pdF9ic3NfdmFycyhwTWFjKTsKKwlfX2xpbV9pbml0X3NjYW5fdmFycyhwTWFjKTsKKwlfX2xpbV9pbml0X2h0X3ZhcnMocE1hYyk7CisKKwlzdGF0dXMgPSBsaW1fc3RhcnQocE1hYyk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJLyogSW5pdGlhbGl6YXRpb25zIGZvciBtYWludGFpbmluZyBwZWVycyBpbiBJQlNTICovCisJbGltX2lic3NfaW5pdChwTWFjKTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXJybV9pbml0aWFsaXplKHBNYWMpOworI2VuZGlmCisKKwljZGZfbXV0ZXhfaW5pdCgmcE1hYy0+bGltLmxpbV9mcmFtZV9yZWdpc3Rlcl9sb2NrKTsKKwljZGZfbGlzdF9pbml0KCZwTWFjLT5saW0uZ0xpbU1nbXRGcmFtZVJlZ2lzdHJhdGluUXVldWUsIDApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbnMgbmVlZGVkIGJ5IFBFICovCisJaWYgKGVTSVJfRkFJTFVSRSA9PSBfX2xpbV9pbml0X2NvbmZpZyhwTWFjKSkgeworCQkvKiBXZSBuZWVkIHRvIHVuZG8gZXZlcnl0aGluZyBpbiBsaW1fc3RhcnQgKi8KKwkJbGltX2NsZWFudXBfbWxtKHBNYWMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwkvKiBpbml0aWFsaXplIHRoZSBUU1BFQyBhZG1pc3Npb24gY29udHJvbCB0YWJsZS4gKi8KKwkvKiBOb3RlIHRoYXQgdGhpcyB3YXMgaW5pdGlhbGx5IGRvbmUgYWZ0ZXIgcmVzdW1lIG5vdGlmaWNhdGlvbiBmcm9tIEhBTC4gKi8KKwkvKiBOb3csIERBTCBpcyBzdGFydGVkIGJlZm9yZSBQRSBzbyB0aGlzIGNhbiBiZSBkb25lIGhlcmUgKi8KKwlsaW1fYWRtaXRfY29udHJvbF9pbml0KHBNYWMpOworCWxpbV9yZWdpc3Rlcl9oYWxfaW5kX2NhbGxfYmFjayhwTWFjKTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyoqKiBlbmQgbGltX2luaXRpYWxpemUoKSAqKiovCisKKy8qKgorICogbGltX2NsZWFudXAoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24gcmVzZXQgb3IgcGVyc29uYSBjaGFuZ2UKKyAqIHRvIGNsZWFudXAgTElNIHN0YXRlCisgKgorICoqKkxPR0lDOgorICogTkEKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbV9jbGVhbnVwKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdm9pZCAqcF9jZHNfZ2N0eDsKKwlDREZfU1RBVFVTIHJldFN0YXR1czsKKworCS8qQmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGxpc3QgbWFraW5nIHN1cmUgYWxsIHRoZSBub2RlcyBoYXZlIGJlZW4gZGVsZXRlZAorCSAqV2hpY2ggc2hvdWxkIGJlIHRoZSBub3JtYWwgY2FzZSwgYnV0IGEgbWVtb3J5IGxlYWsgaGFzIGJlZW4gcmVwb3J0ZWQKKwkgKi8KKworCXN0cnVjdCBtZ210X2ZybV9yZWdfaW5mbyAqcExpbU1nbXRSZWdpc3RyYXRpb24gPSBOVUxMOworCisJaWYgKENERl9GVE1fTU9ERSAhPSBjZHNfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJY2RmX211dGV4X2FjcXVpcmUoJnBNYWMtPmxpbS5saW1fZnJhbWVfcmVnaXN0ZXJfbG9jayk7CisJCXdoaWxlIChjZGZfbGlzdF9yZW1vdmVfZnJvbnQoCisJCQkmcE1hYy0+bGltLmdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlLAorCQkJKGNkZl9saXN0X25vZGVfdCAqKikgJnBMaW1NZ210UmVnaXN0cmF0aW9uKSA9PQorCQkJQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQlGTCgiRml4aW5nIGxlYWshIERlYWxsb2NhdGluZyBwTGltTWdtdFJlZ2lzdHJhdGlvbiBub2RlIikpOworCQkJY2RmX21lbV9mcmVlKHBMaW1NZ210UmVnaXN0cmF0aW9uKTsKKwkJfQorCQljZGZfbXV0ZXhfcmVsZWFzZSgmcE1hYy0+bGltLmxpbV9mcmFtZV9yZWdpc3Rlcl9sb2NrKTsKKwkJY2RmX2xpc3RfZGVzdHJveSgmcE1hYy0+bGltLmdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlKTsKKwl9CisKKwlsaW1fY2xlYW51cF9tbG0ocE1hYyk7CisJbGltX2NsZWFudXBfbG1tKHBNYWMpOworCisJLyogZnJlZSB1cCBwcmVBdXRoIHRhYmxlICovCisJaWYgKHBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUucFRhYmxlICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUucFRhYmxlKTsKKwkJcE1hYy0+bGltLmdMaW1QcmVBdXRoVGltZXJUYWJsZS5wVGFibGUgPSBOVUxMOworCQlwTWFjLT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlLm51bUVudHJ5ID0gMDsKKwl9CisKKwlpZiAoTlVMTCAhPSBwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5IZWFkKSB7CisJCWxpbV9kZWxldGVfZGlhbG9ndWVfdG9rZW5fbGlzdChwTWFjKTsKKwl9CisKKwlpZiAoTlVMTCAhPSBwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5UYWlsKSB7CisJCWNkZl9tZW1fZnJlZShwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5UYWlsKTsKKwkJcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuVGFpbCA9IE5VTEw7CisJfQorCisJaWYgKHBNYWMtPmxpbS5ncExpbU1sbVNldEtleXNSZXEgIT0gTlVMTCkgeworCQljZGZfbWVtX2ZyZWUocE1hYy0+bGltLmdwTGltTWxtU2V0S2V5c1JlcSk7CisJCXBNYWMtPmxpbS5ncExpbU1sbVNldEtleXNSZXEgPSBOVUxMOworCX0KKworCWlmIChwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEpOworCQlwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxID0gTlVMTDsKKwl9CisKKwlpZiAocE1hYy0+bGltLmdwRGVmZFNtZU1zZ0Zvck5PQSAhPSBOVUxMKSB7CisJCWNkZl9tZW1fZnJlZShwTWFjLT5saW0uZ3BEZWZkU21lTXNnRm9yTk9BKTsKKwkJcE1hYy0+bGltLmdwRGVmZFNtZU1zZ0Zvck5PQSA9IE5VTEw7CisJfQorCisJaWYgKHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEgIT0gTlVMTCkgeworCQljZGZfbWVtX2ZyZWUocE1hYy0+bGltLmdwTGltTWxtU2NhblJlcSk7CisJCXBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEgPSBOVUxMOworCX0KKwkvKiBOb3csIGZpbmFsbHkgcmVzZXQgdGhlIGRlZmVycmVkIG1lc3NhZ2UgcXVldWUgcG9pbnRlcnMgKi8KKwlsaW1fcmVzZXRfZGVmZXJyZWRfbXNnX3EocE1hYyk7CisKKwlwX2Nkc19nY3R4ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworCXJldFN0YXR1cyA9IHdtYV9kZV9yZWdpc3Rlcl9tZ210X2ZybV9jbGllbnQocF9jZHNfZ2N0eCk7CisKKwlpZiAocmV0U3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCShwTWFjLCBMT0dFLAorCQkJRkwKKwkJCSgiRGVSZWdpc3RlcmluZyB0aGUgUEUgSGFuZGxlIHdpdGggd21hIGhhcyBmYWlsZWQgYmFpbGluZyBvdXQuLi4iKSk7CisJCSkKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlycm1fY2xlYW51cChwTWFjKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWxpbV9mdF9jbGVhbnVwX2FsbF9mdF9zZXNzaW9ucyhwTWFjKTsKKyNlbmRpZgorCit9IC8qKiogZW5kIGxpbV9jbGVhbnVwKCkgKioqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIHBlX29wZW4KKyAgIFxicmllZiB3aWxsIGJlIGNhbGxlZCBpbiBPcGVuIHNlcXVlbmNlIGZyb20gbWFjX29wZW4KKyAgIFxwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKKyAgIFxwYXJhbSAgIHRIYWxPcGVuUGFyYW1ldGVycyAqcEhhbE9wZW5QYXJhbQorICAgXHJldHVybiAgdFNpclJldFN0YXR1cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgcGVfb3Blbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0TWFjT3BlblBhcmFtZXRlcnMgKnBNYWNPcGVuUGFyYW0pCit7CisJdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisKKwlpZiAoZURSSVZFUl9UWVBFX01GRyA9PSBwTWFjT3BlblBhcmFtLT5kcml2ZXJUeXBlKQorCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCisJcE1hYy0+bGltLm1heEJzc0lkID0gcE1hY09wZW5QYXJhbS0+bWF4QnNzSWQ7CisJcE1hYy0+bGltLm1heFN0YXRpb24gPSBwTWFjT3BlblBhcmFtLT5tYXhTdGF0aW9uOworCisJaWYgKChwTWFjLT5saW0ubWF4QnNzSWQgPT0gMCkgfHwgKHBNYWMtPmxpbS5tYXhTdGF0aW9uID09IDApKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgibWF4IG51bWJlciBvZiBCc3NpZCBvciBTdGF0aW9ucyBjYW5ub3QgYmUgemVybyEiKSk7KQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXBNYWMtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXIgPQorCQljZGZfbWVtX21hbGxvYyhzaXplb2YoVFhfVElNRVIpICogKHBNYWMtPmxpbS5tYXhTdGF0aW9uICsgMSkpOworCWlmIChOVUxMID09IHBNYWMtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXIpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJncExpbUNuZldhaXRUaW1lciBtZW1vcnkgYWxsb2NhdGUgZmFpbGVkISIpKTspCisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJfQorCisJcE1hYy0+bGltLmdwU2Vzc2lvbiA9CisJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0UEVTZXNzaW9uKSAqIHBNYWMtPmxpbS5tYXhCc3NJZCk7CisJaWYgKE5VTEwgPT0gcE1hYy0+bGltLmdwU2Vzc2lvbikgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiZ3BTZXNzaW9uIG1lbW9yeSBhbGxvY2F0ZSBmYWlsZWQhIikpOworCQlzdGF0dXMgPSBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJCWdvdG8gcGVfb3Blbl9wc2Vzc2lvbl9mYWlsOworCX0KKworCWNkZl9tZW1fc2V0KHBNYWMtPmxpbS5ncFNlc3Npb24sCisJCSAgICBzaXplb2YodFBFU2Vzc2lvbikgKiBwTWFjLT5saW0ubWF4QnNzSWQsIDApOworCisJcE1hYy0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCA9IDB4ZmY7CisJcE1hYy0+bGltLmRlZmVycmVkTXNnQ250ID0gMDsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9tdXRleF9pbml0KCZwTWFjLT5saW0ubGtQZUdsb2JhbExvY2spKSkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgicGUgbG9jayBpbml0IGZhaWxlZCEiKSk7KQorCQlzdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisJCWdvdG8gcGVfb3Blbl9sb2NrX2ZhaWw7CisJfQorCXBNYWMtPmxpbS5kZWF1dGhNc2dDbnQgPSAwOworCXBNYWMtPmxpbS5yZXRyeV9wYWNrZXRfY250ID0gMDsKKwlwTWFjLT5saW0uaWJzc19yZXRyeV9jbnQgPSAwOworCisJLyoKKwkgKiBwZV9vcGVuIGlzIHN1Y2Nlc3NmdWwgYnkgbm93LCBzbyBpdCBpcyByaWdodCB0aW1lIHRvIGluaXRpYWxpemUKKwkgKiBNVFJBQ0UgZm9yIFBFIG1vZHVsZS4gaWYgTElNX1RSQUNFX1JFQ09SRCBpcyBub3QgZGVmaW5lZCBpbiBidWlsZAorCSAqIGZpbGUgdGhlbiBub3RoaW5nIHdpbGwgYmUgbG9nZ2VkIGZvciBQRSBtb2R1bGUuCisJICovCisjaWZkZWYgTElNX1RSQUNFX1JFQ09SRAorCU1UUkFDRShsaW1fdHJhY2VfaW5pdChwTWFjKSk7CisjZW5kaWYKKwlyZXR1cm4gc3RhdHVzOyAvKiBzdGF0dXMgaGVyZSB3aWxsIGJlIGVTSVJfU1VDQ0VTUyAqLworCitwZV9vcGVuX2xvY2tfZmFpbDoKKwljZGZfbWVtX2ZyZWUocE1hYy0+bGltLmdwU2Vzc2lvbik7CisJcE1hYy0+bGltLmdwU2Vzc2lvbiA9IE5VTEw7CitwZV9vcGVuX3BzZXNzaW9uX2ZhaWw6CisJY2RmX21lbV9mcmVlKHBNYWMtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXIpOworCXBNYWMtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXIgPSBOVUxMOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBwZV9jbG9zZQorICAgXGJyaWVmIHdpbGwgYmUgY2FsbGVkIGluIGNsb3NlIHNlcXVlbmNlIGZyb20gbWFjX2Nsb3NlCisgICBccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCisgICBccmV0dXJuICB0U2lyUmV0U3RhdHVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBwZV9jbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQ4X3QgaTsKKworCWlmIChBTklfRFJJVkVSX1RZUEUocE1hYykgPT0gZURSSVZFUl9UWVBFX01GRykKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQlpZiAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCA9PSB0cnVlKSB7CisJCQlwZV9kZWxldGVfc2Vzc2lvbihwTWFjLCAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXSk7CisJCX0KKwl9CisJY2RmX21lbV9mcmVlKHBNYWMtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXIpOworCXBNYWMtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXIgPSBOVUxMOworCisJaWYgKHBNYWMtPmxpbS5ncExpbU1sbU9lbURhdGFSZXEpIHsKKwkJY2RmX21lbV9mcmVlKHBNYWMtPmxpbS5ncExpbU1sbU9lbURhdGFSZXEpOworCQlwTWFjLT5saW0uZ3BMaW1NbG1PZW1EYXRhUmVxID0gTlVMTDsKKwl9CisKKwljZGZfbWVtX2ZyZWUocE1hYy0+bGltLmdwU2Vzc2lvbik7CisJcE1hYy0+bGltLmdwU2Vzc2lvbiA9IE5VTEw7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJICAgIChjZGZfbXV0ZXhfZGVzdHJveSgmcE1hYy0+bGltLmxrUGVHbG9iYWxMb2NrKSkpIHsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBwZV9zdGFydAorICAgXGJyaWVmIHdpbGwgYmUgY2FsbGVkIGluIHN0YXJ0IHNlcXVlbmNlIGZyb20gbWFjX3N0YXJ0CisgICBccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCisgICBccmV0dXJuIG5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzIHBlX3N0YXJ0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisKKwlzdGF0dXMgPSBsaW1faW5pdGlhbGl6ZShwTWFjKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIHBlX3N0b3AKKyAgIFxicmllZiB3aWxsIGJlIGNhbGxlZCBpbiBzdG9wIHNlcXVlbmNlIGZyb20gbWFjX3N0b3AKKyAgIFxwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKKyAgIFxyZXR1cm4gbm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgcGVfc3RvcCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCWxpbV9jbGVhbnVwKHBNYWMpOworCVNFVF9MSU1fTUxNX1NUQVRFKHBNYWMsIGVMSU1fTUxNX09GRkxJTkVfU1RBVEUpOworCXJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBwZV9mcmVlX21zZworICAgXGJyaWVmIENhbGxlZCBieSBDRFMgc2NoZWR1bGVyIChmdW5jdGlvbiBjZHNfc2NoZWRfZmx1c2hfbWNfbXFzKQorIFwgICAgICB0byBmcmVlIGEgZ2l2ZW4gUEUgbWVzc2FnZSBvbiB0aGUgVFggYW5kIE1DIHRocmVhZC4KKyBcICAgICAgVGhpcyBoYXBwZW5zIHdoZW4gdGhlcmUgYXJlIG1lc3NhZ2VzIHBlbmRpbmcgaW4gdGhlIFBFCisgXCAgICAgIHF1ZXVlIHdoZW4gc3lzdGVtIGlzIGJlaW5nIHN0b3BwZWQgYW5kIHJlc2V0LgorICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworICAgXHBhcmFtICAgdFNpck1zZ1EgICAgICAgcE1zZworICAgXHJldHVybiBub25lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHBlX2ZyZWVfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKQoreworCWlmIChwTXNnICE9IE5VTEwpIHsKKwkJaWYgKE5VTEwgIT0gcE1zZy0+Ym9keXB0cikgeworCQkJaWYgKFNJUl9CQl9YUE9SVF9NR01UX01TRyA9PSBwTXNnLT50eXBlKSB7CisJCQkJY2RzX3BrdF9yZXR1cm5fcGFja2V0KChjZHNfcGt0X3QgKikgcE1zZy0+CisJCQkJCQkgICAgICBib2R5cHRyKTsKKwkJCX0gZWxzZSB7CisJCQkJY2RmX21lbV9mcmVlKCh2b2lkICopcE1zZy0+Ym9keXB0cik7CisJCQl9CisJCX0KKwkJcE1zZy0+Ym9keXB0ciA9IDA7CisJCXBNc2ctPmJvZHl2YWwgPSAwOworCQlwTXNnLT50eXBlID0gMDsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIGxpbV9wb3N0X21zZ19hcGkoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gb3RoZXIgdGhyZWFkIHdoaWxlIHBvc3RpbmcgYQorICogbWVzc2FnZSB0byBMSU0gbWVzc2FnZSBRdWV1ZSBnU2lyTGltTXNnUS4KKyAqCisgKioqTE9HSUM6CisgKiBOQQorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcE1zZyAtIFBvaW50ZXIgdG8gdGhlIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit1aW50MzJfdCBsaW1fcG9zdF9tc2dfYXBpKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKQoreworCXJldHVybiBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9QRSwgKGNkc19tc2dfdCAqKSBwTXNnKTsKKworfSAvKioqIGVuZCBsaW1fcG9zdF9tc2dfYXBpKCkgKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBwZV9wb3N0X21zZ19hcGkoKSAtIEEgd3JhcHBlciBmdW5jdGlvbiB0byBwb3N0IG1lc3NhZ2UgdG8gVm9zcyBtc2cgcXVldWVzCisKKyAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBieSBsZWdhY3kgY29kZSB0byBwb3N0IG1lc3NhZ2UgdG8gY2RzIHF1ZXVlcyBPUgorICAgbGVnYWN5IGNvZGUgbWF5IGtlZXAgb24gaW52b2tpbmcgJ2xpbV9wb3N0X21zZ19hcGknIHRvIHBvc3QgdGhlIG1lc3NhZ2UgdG8gY2RzIHF1ZXVlCisgICBmb3IgZGlzcGF0Y2hpbmcgaXQgbGF0ZXIuCisKKyAgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICAgXHBhcmFtIHBNc2cgLSBQb2ludGVyIHRvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZQorCisgICBccmV0dXJuICB1aW50MzJfdCAtIFRYX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBwZV9wb3N0X21zZ19hcGkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKnBNc2cpCit7CisJcmV0dXJuICh0U2lyUmV0U3RhdHVzKSBsaW1fcG9zdF9tc2dfYXBpKHBNYWMsIHBNc2cpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBwZV9wcm9jZXNzX21lc3NhZ2VzKCkgLSBNZXNzYWdlIFByb2Nlc3NvciBmb3IgUEUKKworICAgVm9zcyBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIGRpc3BhdGNoIHRoZSBtZXNzYWdlIHRvIFBFCisKKyAgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICAgXHBhcmFtIHBNc2cgLSBQb2ludGVyIHRvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZQorCisgICBccmV0dXJuICB1aW50MzJfdCAtIFRYX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBwZV9wcm9jZXNzX21lc3NhZ2VzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKQoreworCWlmIChBTklfRFJJVkVSX1RZUEUocE1hYykgPT0gZURSSVZFUl9UWVBFX01GRykgeworCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCX0KKwkvKioKKwkgKiBJZiB0aGUgTWVzc2FnZSB0byBiZSBoYW5kbGVkIGlzIGZvciBDRkcgTW9kdWxlIGNhbGwgdGhlIENGRyBNc2cKKwkgKiBIYW5kbGVyIGFuZCBmb3IgYWxsIHRoZSBvdGhlciBjYXNlcyBwb3N0IGl0IHRvIExJTQorCSAqLworCWlmIChTSVJfQ0ZHX1BBUkFNX1VQREFURV9JTkQgIT0gcE1zZy0+dHlwZSAmJiBJU19DRkdfTVNHKHBNc2ctPnR5cGUpKQorCQljZmdfcHJvY2Vzc19tYl9tc2cocE1hYywgKHRTaXJNYk1zZyAqKSBwTXNnLT5ib2R5cHRyKTsKKwllbHNlCisJCWxpbV9tZXNzYWdlX3Byb2Nlc3NvcihwTWFjLCBwTXNnKTsKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogcGVfaGFuZGxlX21nbXRfZnJhbWUKKyAqCisgKiBGVU5DVElPTjoKKyAqICAgIFByb2Nlc3MgdGhlIE1hbmFnZW1lbnQgZnJhbWVzIGZyb20gVEwKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzogVEwgc2VuZHMgdGhlIHBhY2tldCBhbG9uZyB3aXRoIHRoZSBDRFMgR2xvYmFsQ29udGV4dAorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBfY2RzX2djdHggIEdsb2JhbCBWb3MgQ29udGV4dAorICogQHBhcmFtIGNkc19idWZmICBQYWNrZXQKKyAqIEByZXR1cm4gTm9uZQorICovCisKK0NERl9TVEFUVVMgcGVfaGFuZGxlX21nbXRfZnJhbWUodm9pZCAqcF9jZHNfZ2N0eCwgdm9pZCAqY2RzX2J1ZmYpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYzsKKwl0cFNpck1hY01nbXRIZHIgbUhkcjsKKwl0U2lyTXNnUSBtc2c7CisJY2RzX3BrdF90ICpwVm9zUGt0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl1aW50OF90ICpwUnhQYWNrZXRJbmZvOworCisJcFZvc1BrdCA9IChjZHNfcGt0X3QgKikgY2RzX2J1ZmY7CisJaWYgKE5VTEwgPT0gcFZvc1BrdCkgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcE1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCS8qIGNhbm5vdCBsb2cgYSBmYWlsdXJlIHdpdGhvdXQgYSB2YWxpZCBwTWFjICovCisJCWNkc19wa3RfcmV0dXJuX3BhY2tldChwVm9zUGt0KTsKKwkJcFZvc1BrdCA9IE5VTEw7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZGZfc3RhdHVzID0KKwkJd21hX2RzX3BlZWtfcnhfcGFja2V0X2luZm8ocFZvc1BrdCwgKHZvaWQgKikmcFJ4UGFja2V0SW5mbywgZmFsc2UpOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJY2RzX3BrdF9yZXR1cm5fcGFja2V0KHBWb3NQa3QpOworCQlwVm9zUGt0ID0gTlVMTDsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qCisJICogVGhlIE1QRFUgaGVhZGVyIGlzIG5vdyBwcmVzZW50IGF0IGEgY2VydGFpbiAib2Zmc2V0IiBpbgorCSAqIHRoZSBCRCBhbmQgaXMgc3BlY2lmaWVkIGluIHRoZSBCRCBpdHNlbGYKKwkgKi8KKworCW1IZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisJaWYgKG1IZHItPmZjLnR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwKKwkJICAoIlJ4QmQ9JXAgbUhkcj0lcCBUeXBlOiAlZCBTdWJ0eXBlOiAlZCAgU2l6ZXM6RkMlenUgTWdtdCV6dSIpLAorCQkgIHBSeFBhY2tldEluZm8sIG1IZHIsIG1IZHItPmZjLnR5cGUsIG1IZHItPmZjLnN1YlR5cGUsCisJCSAgc2l6ZW9mKHRTaXJNYWNGcmFtZUN0bCksIHNpemVvZih0U2lyTWFjTWdtdEhkcikpOworCisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIm1wZHVfbGVuOiVkIGhkcl9sZW46JWQgZGF0YV9sZW46JWQiKSwKKwkJICAgICAgIFdNQV9HRVRfUlhfTVBEVV9MRU4ocFJ4UGFja2V0SW5mbyksCisJCSAgICAgICBXTUFfR0VUX1JYX01QRFVfSEVBREVSX0xFTihwUnhQYWNrZXRJbmZvKSwKKwkJICAgICAgIFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbykpOworCisJCU1UUkFDRShtYWNfdHJhY2UocE1hYywgVFJBQ0VfQ09ERV9SWF9NR01ULAorCQkJCSBXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pLAorCQkJCSBMSU1fVFJBQ0VfTUFLRV9SWE1HTVQobUhkci0+ZmMuc3ViVHlwZSwKKwkJCQkgKHVpbnQxNl90KSAoKCh1aW50MTZfdCkKKwkJCQkgICAgICAobUhkci0+c2VxQ29udHJvbC5zZXFOdW1IaSA8PCA0KSkgfAorCQkJCSAgICAgIG1IZHItPnNlcUNvbnRyb2wuc2VxTnVtTG8pKSk7KQorCisJCWlmIChXTUFfR0VUX1JPQU1DQU5ESURBVEVJTkQocFJ4UGFja2V0SW5mbykpCisJCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJyb2FtQ2FuZGlkYXRlSW5kICVkIiksCisJCQkJV01BX0dFVF9ST0FNQ0FORElEQVRFSU5EKHBSeFBhY2tldEluZm8pKTsKKworCQlpZiAoV01BX0dFVF9PRkZMT0FEU0NBTkxFQVJOKHBSeFBhY2tldEluZm8pKQorCQkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgib2ZmbG9hZFNjYW5MZWFybiAlZCIpLAorCQkJCSBXTUFfR0VUX09GRkxPQURTQ0FOTEVBUk4ocFJ4UGFja2V0SW5mbykpOworCX0KKworCS8qIEZvcndhcmQgdG8gTUFDIHZpYSBtZXNnID0gU0lSX0JCX1hQT1JUX01HTVRfTVNHICovCisJbXNnLnR5cGUgPSBTSVJfQkJfWFBPUlRfTUdNVF9NU0c7CisJbXNnLmJvZHlwdHIgPSBjZHNfYnVmZjsKKwltc2cuYm9keXZhbCA9IDA7CisKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHN5c19iYnRfcHJvY2Vzc19tZXNzYWdlX2NvcmUocE1hYywKKwkJCQkJCQkgJm1zZywKKwkJCQkJCQkgbUhkci0+ZmMudHlwZSwKKwkJCQkJCQkgbUhkci0+ZmMuc3ViVHlwZSkpIHsKKwkJY2RzX3BrdF9yZXR1cm5fcGFja2V0KHBWb3NQa3QpOworCQlwVm9zUGt0ID0gTlVMTDsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoInN5c19iYnRfcHJvY2Vzc19tZXNzYWdlX2NvcmUgZmFpbGVkIHRvIHByb2Nlc3MgU0lSX0JCX1hQT1JUX01HTVRfTVNHIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBwZV9yZWdpc3Rlcl93bWFfaGFuZGxlKCkgLSByZWdpc3RlciBtYW5hZ2VtZW50IGZyYW1lIGhhbmRsZXIgdG8gV01BCisgKiBAcE1hYzogbWFjIGdsb2JhbCBjdHgKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBwZV9yZWdpc3Rlcl93bWFfaGFuZGxlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdm9pZCAqcF9jZHNfZ2N0eDsKKwlDREZfU1RBVFVTIHJldFN0YXR1czsKKworCXBfY2RzX2djdHggPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisKKwlyZXRTdGF0dXMgPSB3bWFfcmVnaXN0ZXJfbWdtdF9mcm1fY2xpZW50KHBfY2RzX2djdHgsCisJCQkJIHBlX2hhbmRsZV9tZ210X2ZyYW1lKTsKKwlpZiAocmV0U3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlJlZ2lzdGVyaW5nIHRoZSBQRSBIYW5kbGUgd2l0aCBXTUEgaGFzIGZhaWxlZCIpKTsKKworfQorCisvKioKKyAqIGxpbV9pc19zeXN0ZW1faW5fc2Nhbl9zdGF0ZSgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdmFyaW91cyBNQUMgc29mdHdhcmUgbW9kdWxlcyB0bworICogZGV0ZXJtaW5lIGlmIFN5c3RlbSBpcyBpbiBTY2FuL0xlYXJuIHN0YXRlCisgKgorICoqKkxPR0lDOgorICogTkEKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIHRydWUgIC0gU3lzdGVtIGlzIGluIFNjYW4vTGVhcm4gc3RhdGUKKyAqICAgICAgICAgZmFsc2UgLSBTeXN0ZW0gaXMgTk9UIGluIFNjYW4vTGVhcm4gc3RhdGUKKyAqLworCit1aW50OF90IGxpbV9pc19zeXN0ZW1faW5fc2Nhbl9zdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXN3aXRjaCAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkgeworCWNhc2UgZUxJTV9TTUVfQ0hBTk5FTF9TQ0FOX1NUQVRFOgorCWNhc2UgZUxJTV9TTUVfTk9STUFMX0NIQU5ORUxfU0NBTl9TVEFURToKKwljYXNlIGVMSU1fU01FX0xJTktfRVNUX1dUX1NDQU5fU1RBVEU6CisJY2FzZSBlTElNX1NNRV9XVF9TQ0FOX1NUQVRFOgorCQkvKiBTeXN0ZW0gaXMgaW4gTGVhcm4gbW9kZSAqLworCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCS8qIFN5c3RlbSBpcyBOT1QgaW4gTGVhcm4gbW9kZSAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorfSAvKioqIGVuZCBsaW1faXNfc3lzdGVtX2luX3NjYW5fc3RhdGUoKSAqKiovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisvKioKKyAqIGxpbV9pc19hc3NvY19yZXFfZm9yX2Ryb3AoKS0gZnVuY3Rpb24gdG8gZGVjaWRlcyB0byBkcm9wIGFzc29jXHJlYXNzb2MKKyAqICBmcmFtZXMuCisgKiBAbWFjOiBwb2ludGVyIHRvIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgKiBAcnhfcGt0X2luZm86IHJ4IHBhY2tldCBtZXRhIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGVucXVldWluZyB0aGUgZnJhbWUgdG8gUEUgcXVldWUgdG8KKyAqIGRyb3AgZmxvb2RlZCBhc3NvYy9yZWFzc29jIGZyYW1lcyBnZXR0aW5nIGludG8gUEUgUXVldWUuCisgKgorICogUmV0dXJuOiB0cnVlIGZvciBkcm9wcGluZyB0aGUgZnJhbWUgb3RoZXJ3aXNlIGZhbHNlCisgKi8KKworYm9vbCBsaW1faXNfYXNzb2NfcmVxX2Zvcl9kcm9wKHRwQW5pU2lyR2xvYmFsIG1hYywgdWludDhfdCAqcnhfcGt0X2luZm8pCit7CisJdWludDhfdCBzZXNzaW9uX2lkOworCXVpbnQxNl90IGFpZDsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5OworCXRwU2lyTWFjTWdtdEhkciBtYWNfaGRyOworCXRwRHBoSGFzaE5vZGUgc3RhX2RzOworCisJbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChtYWMsIG1hY19oZHItPmJzc0lkLAorCQkJCSAmc2Vzc2lvbl9pZCk7CisJaWYgKCFzZXNzaW9uX2VudHJ5KSB7CisJCVBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKwkJCUZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBTVEEgWyVwTV0iKSwKKwkJCW1hY19oZHItPnNhKTspOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJc3RhX2RzID0gZHBoX2xvb2t1cF9oYXNoX2VudHJ5KG1hYywgbWFjX2hkci0+c2EsICZhaWQsCisJCQkJJnNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWlmICghc3RhX2RzKSB7CisJCVBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoInBTdGFEcyBpcyBOVUxMIikpOyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIXN0YV9kcy0+cm1mRW5hYmxlZCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHN0YV9kcy0+cG1mU2FRdWVyeVN0YXRlID09IERQSF9TQV9RVUVSWV9JTl9QUk9HUkVTUykKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoc3RhX2RzLT5sYXN0X2Fzc29jX3JlY2VpdmVkX3RpbWUgJiYKKwkJKChjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpIC0KKwkJCSBzdGFfZHMtPmxhc3RfYXNzb2NfcmVjZWl2ZWRfdGltZSkgPCAxMDAwKSkKKwkJcmV0dXJuIHRydWU7CisKKwlzdGFfZHMtPmxhc3RfYXNzb2NfcmVjZWl2ZWRfdGltZSA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKKy8qKgorICogbGltX2lzX2RlYXV0aF9kaWFzc29jX2Zvcl9kcm9wKCktIGZ1bmN0aW9uIHRvIGRlY2lkZXMgdG8gZHJvcCBkZWF1dGhcZGlhc3NvYworICogIGZyYW1lcy4KKyAqIEBtYWM6IHBvaW50ZXIgdG8gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAqIEByeF9wa3RfaW5mbzogcnggcGFja2V0IG1ldGEgaW5mb3JtYXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgZW5xdWV1aW5nIHRoZSBmcmFtZSB0byBQRSBxdWV1ZSB0bworICogZHJvcCBmbG9vZGVkIGRlYXV0aC9kaWFzc29jIGZyYW1lcyBnZXR0aW5nIGludG8gUEUgUXVldWUuCisgKgorICogUmV0dXJuOiB0cnVlIGZvciBkcm9wcGluZyB0aGUgZnJhbWUgb3RoZXJ3aXNlIGZhbHNlCisgKi8KKworYm9vbCBsaW1faXNfZGVhdXRoX2RpYXNzb2NfZm9yX2Ryb3AodHBBbmlTaXJHbG9iYWwgbWFjLCB1aW50OF90ICpyeF9wa3RfaW5mbykKK3sKKwl1aW50OF90IHNlc3Npb25faWQ7CisJdWludDE2X3QgYWlkOworCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnk7CisJdHBTaXJNYWNNZ210SGRyIG1hY19oZHI7CisJdHBEcGhIYXNoTm9kZSAgIHN0YV9kczsKKworCW1hY19oZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocnhfcGt0X2luZm8pOworCXNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQobWFjLCBtYWNfaGRyLT5ic3NJZCwKKwkJCSAmc2Vzc2lvbl9pZCk7CisJaWYgKCFzZXNzaW9uX2VudHJ5KSB7CisJCVBFTE9HMShsaW1Mb2cobWFjLCBMT0cxLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIFNUQSBbJXBNXSIpLAorCQkJbWFjX2hkci0+c2EpOyk7CisJCXJldHVybiB0cnVlOworCX0KKworCXN0YV9kcyA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShtYWMsIG1hY19oZHItPnNhLCAmYWlkLAorCQkJCQkmc2Vzc2lvbl9lbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKCFzdGFfZHMpIHsKKwkJUEVMT0cxKGxpbUxvZyhtYWMsIExPRzEsIEZMKCJwU3RhRHMgaXMgTlVMTCIpKTspOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJaWYgKHNlc3Npb25fZW50cnktPmxpbVJtZkVuYWJsZWQpIHsKKwkJaWYgKChXTUFfR0VUX1JYX0RQVV9GRUVEQkFDSyhyeF9wa3RfaW5mbykgJgorCQkJRFBVX0ZFRURCQUNLX1VOUFJPVEVDVEVEX0VSUk9SKSkgeworCQkJLyogSXQgbWF5IGJlIHBvc3NpYmxlIHRoYXQgZGVhdXRoL2RpYXNzb2MgZnJhbWVzIGZyb20gYQorCQkJICogc3Bvb2Z5IEFQIGlzIHJlY2VpdmVkLiBTbyBpZiBhbGwgZnVydGhlcgorCQkJICogZGVhdXRoL2RpYXNzb2MgZnJtYWVzIGFyZSBkcm9wcGVkLCB0aGVuIGl0IG1heQorCQkJICogcmVzdWx0IGluIGxvc3NpbmcgZGVhdXRoL2RpYXNzb2MgZnJhbWVzIGZyb20gZ2VudWluZQorCQkJICogQVAuIFNvIHByb2Nlc3MgYWxsIGRlYXV0aC9kaWFzc29jIGZyYW1lcyB3aXRoCisJCQkgKiBhIHRpbWUgZGlmZmVyZW5jZSBvZiAxIHNlYy4KKwkJCSAqLworCQkJaWYgKChjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpIC0KKwkJCQkgc3RhX2RzLT5sYXN0X3VucHJvdF9kZWF1dGhfZGlzYXNzb2MpIDwgMTAwMCkKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJc3RhX2RzLT5sYXN0X3VucHJvdF9kZWF1dGhfZGlzYXNzb2MgPQorCQkJCQljZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpOworCQl9IGVsc2UgeworCQkJLyogUE1GIGVuYWJlZCwgTWFuYWdlbWVudCBmcmFtZXMgYXJlIHByb3RlY3RlZCAqLworCQkJaWYgKHN0YV9kcy0+cHJvY3RfZGVhdWhfZGlzYXNzb2NfY250KQorCQkJCXJldHVybiB0cnVlOworCQkJZWxzZQorCQkJCXN0YV9kcy0+cHJvY3RfZGVhdWhfZGlzYXNzb2NfY250Kys7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCS8qIFBNRiBkaXNhYmxlZCAqLworCXsKKwkJaWYgKHN0YV9kcy0+aXNfZGlzYXNzb2NfZGVhdXRoX2luX3Byb2dyZXNzKQorCQkJcmV0dXJuIHRydWU7CisJCWVsc2UKKwkJCXN0YV9kcy0+aXNfZGlzYXNzb2NfZGVhdXRoX2luX3Byb2dyZXNzKys7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqXGJyaWVmIGxpbV9yZWNlaXZlZF9oYl9oYW5kbGVyKCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBzY2hfYmVhY29uX3Byb2Nlc3MoKSB1cG9uCisgKiByZWNlaXZpbmcgYSBCZWFjb24gb24gU1RBLiBUaGlzIGFsc28gZ2V0cyBjYWxsZWQgdXBvbgorICogcmVjZWl2aW5nIFByb2JlIFJlc3BvbnNlIGFmdGVyIGhlYXQgYmVhdCBmYWlsdXJlIGlzCisgKiBkZXRlY3RlZC4KKyAqCisgKiBwYXJhbSBwTWFjIC0gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAqIHBhcmFtIGNoYW5uZWwgLSBjaGFubmVsIG51bWJlciBpbmRpY2F0ZWQgaW4gQmVhY29uLCBQcm9iZSBSZXNwb25zZQorICogcmV0dXJuIC0gbm9uZQorICovCisKK3ZvaWQKK2xpbV9yZWNlaXZlZF9oYl9oYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgY2hhbm5lbElkLAorCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlpZiAoKGNoYW5uZWxJZCA9PSAwKQorCSAgICB8fCAoY2hhbm5lbElkID09IHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCkpCisJCXBzZXNzaW9uRW50cnktPkxpbVJ4ZWRCZWFjb25DbnREdXJpbmdIQisrOworCisJcHNlc3Npb25FbnRyeS0+cG1tT2ZmbG9hZEluZm8uYmNubWlzcyA9IGZhbHNlOworfSAvKioqIGxpbV9pbml0X3dkc19pbmZvX3BhcmFtcygpICoqKi8KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fdXBkYXRlX292ZXJsYXBfc3RhX3BhcmFtCisgICBcYnJpZWYgVXBkYXRlcyBvdmVybGFwIGNhY2hlIGFuZCBwYXJhbSBkYXRhIHN0cnVjdHVyZQorICAgXHBhcmFtICAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworICAgXHBhcmFtICAgICAgdFNpck1hY0FkZHIgYnNzSWQKKyAgIFxwYXJhbSAgICAgIHRwTGltUHJvdFN0YVBhcmFtcyBwU3RhUGFyYW1zCisgICBccmV0dXJuICAgICAgTm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1fdXBkYXRlX292ZXJsYXBfc3RhX3BhcmFtKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIGJzc0lkLAorCQkJICAgICB0cExpbVByb3RTdGFQYXJhbXMgcFN0YVBhcmFtcykKK3sKKwlpbnQgaTsKKwlpZiAoIXBTdGFQYXJhbXMtPm51bVN0YSkgeworCQljZGZfbWVtX2NvcHkocE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbMF0uYWRkciwKKwkJCSAgICAgYnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwTWFjLT5saW0ucHJvdFN0YU92ZXJsYXBDYWNoZVswXS5hY3RpdmUgPSB0cnVlOworCisJCXBTdGFQYXJhbXMtPm51bVN0YSA9IDE7CisKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfT1ZFUkxBUF9DQUNIRV9TSVpFOyBpKyspIHsKKwkJaWYgKHBNYWMtPmxpbS5wcm90U3RhT3ZlcmxhcENhY2hlW2ldLmFjdGl2ZSkgeworCQkJaWYgKGNkZl9tZW1fY29tcGFyZQorCQkJCSAgICAocE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbaV0uYWRkciwgYnNzSWQsCisJCQkJICAgIHNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IExJTV9QUk9UX1NUQV9PVkVSTEFQX0NBQ0hFX1NJWkUpIHsKKwkJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HVywgRkwoIk92ZXJsYXAgY2FjaGUgaXMgZnVsbCIpKTspCisJfSBlbHNlIHsKKwkJY2RmX21lbV9jb3B5KHBNYWMtPmxpbS5wcm90U3RhT3ZlcmxhcENhY2hlW2ldLmFkZHIsCisJCQkgICAgIGJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbaV0uYWN0aXZlID0gdHJ1ZTsKKworCQlwU3RhUGFyYW1zLT5udW1TdGErKzsKKwl9Cit9CisKKy8qKgorICogbGltX2lic3NfZW5jX3R5cGVfbWF0Y2hlZAorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gY29tcGFyZXMgdGhlIGVuY3J5cHRpb24gdHlwZSBvZiB0aGUgcGVlciB3aXRoIHNlbGYKKyAqIHdoaWxlIG9wZXJhdGluZyBpbiBJQlNTIG1vZGUgYW5kIGRldGVjdHMgbWlzbWF0Y2guCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBCZWFjb24gIC0gUGFyc2VkIEJlYWNvbiBGcmFtZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFNlc3Npb24gLSBQb2ludGVyIHRvIHRoZSBQRSBzZXNzaW9uCisgKgorICogQHJldHVybiBlU0lSX1RSVUUgaWYgZW5jcnlwdGlvbiB0eXBlIGlzIG1hdGNoZWQ7IGVTSVJfRkFMU0Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyB0QW5pQm9vbCBsaW1faWJzc19lbmNfdHlwZV9tYXRjaGVkKHRwU2NoQmVhY29uU3RydWN0IHBCZWFjb24sCisJCQkJCSAgdHBQRVNlc3Npb24gcFNlc3Npb24pCit7CisJaWYgKCFwQmVhY29uIHx8ICFwU2Vzc2lvbikKKwkJcmV0dXJuIGVTSVJfRkFMU0U7CisKKwkvKiBPcGVuIGNhc2UgKi8KKwlpZiAocEJlYWNvbi0+Y2FwYWJpbGl0eUluZm8ucHJpdmFjeSA9PSAwCisJICAgICYmIHBTZXNzaW9uLT5lbmNyeXB0VHlwZSA9PSBlU0lSX0VEX05PTkUpCisJCXJldHVybiBlU0lSX1RSVUU7CisKKwkvKiBXRVAgY2FzZSAqLworCWlmIChwQmVhY29uLT5jYXBhYmlsaXR5SW5mby5wcml2YWN5ID09IDEgJiYgcEJlYWNvbi0+d3BhUHJlc2VudCA9PSAwCisJICAgICYmIHBCZWFjb24tPnJzblByZXNlbnQgPT0gMAorCSAgICAmJiAocFNlc3Npb24tPmVuY3J5cHRUeXBlID09IGVTSVJfRURfV0VQNDAKKwkJfHwgcFNlc3Npb24tPmVuY3J5cHRUeXBlID09IGVTSVJfRURfV0VQMTA0KSkKKwkJcmV0dXJuIGVTSVJfVFJVRTsKKworCS8qIFdQQS1Ob25lIGNhc2UgKi8KKwlpZiAocEJlYWNvbi0+Y2FwYWJpbGl0eUluZm8ucHJpdmFjeSA9PSAxICYmIHBCZWFjb24tPndwYVByZXNlbnQgPT0gMQorCSAgICAmJiBwQmVhY29uLT5yc25QcmVzZW50ID09IDAKKwkgICAgJiYgKChwU2Vzc2lvbi0+ZW5jcnlwdFR5cGUgPT0gZVNJUl9FRF9DQ01QKSB8fAorCQkocFNlc3Npb24tPmVuY3J5cHRUeXBlID09IGVTSVJfRURfVEtJUCkpKQorCQlyZXR1cm4gZVNJUl9UUlVFOworCisJcmV0dXJuIGVTSVJfRkFMU0U7Cit9CisKKy8qKgorICogbGltX2hhbmRsZV9pYnNfc2NvYWxlc2NpbmcoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24gcmVjZWl2aW5nIEJlYWNvbi9Qcm9iZSBSZXNwb25zZQorICogd2hpbGUgb3BlcmF0aW5nIGluIElCU1MgbW9kZS4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEJlYWNvbiAtIFBhcnNlZCBCZWFjb24gRnJhbWUgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBSeFBhY2tldEluZm8gLSBQb2ludGVyIHRvIFJYIHBhY2tldCBpbmZvIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gU3RhdHVzIHdoZXRoZXIgdG8gcHJvY2VzcyBvciBpZ25vcmUgcmVjZWl2ZWQgQmVhY29uIEZyYW1lCisgKi8KKwordFNpclJldFN0YXR1cworbGltX2hhbmRsZV9pYnNzX2NvYWxlc2NpbmcodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgIHRwU2NoQmVhY29uU3RydWN0IHBCZWFjb24sCisJCQkgICB1aW50OF90ICpwUnhQYWNrZXRJbmZvLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXRTaXJSZXRTdGF0dXMgcmV0Q29kZTsKKworCXBIZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisKKwkvKiBJZ25vcmUgdGhlIGJlYWNvbiB3aGVuIGFueSBvZiB0aGUgY29uZGl0aW9ucyBiZWxvdyBpcyBtZXQ6CisJICAgMS4gVGhlIGJlYWNvbiBjbGFpbXMgbm8gSUJTUyBuZXR3b3JrCisJICAgMi4gU1NJRCBpbiB0aGUgYmVhY29uIGRvZXMgbm90IG1hdGNoIFNTSUQgb2Ygc2VsZiBzdGF0aW9uCisJICAgMy4gT3BlcmF0aW9uYWwgY2hhbm5lbCBpbiB0aGUgYmVhY29uIGRvZXMgbm90IG1hdGNoIHNlbGYgc3RhdGlvbgorCSAgIDQuIEVuY3lwdGlvbiB0eXBlIGluIHRoZSBiZWFjb24gZG9lcyBub3QgbWF0Y2ggd2l0aCBzZWxmIHN0YXRpb24KKwkgKi8KKwlpZiAoKCFwQmVhY29uLT5jYXBhYmlsaXR5SW5mby5pYnNzKSB8fAorCSAgICAobGltX2NtcF9zX3NpZChwTWFjLCAmcEJlYWNvbi0+c3NJZCwgcHNlc3Npb25FbnRyeSkgIT0gdHJ1ZSkgfHwKKwkgICAgKHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCAhPSBwQmVhY29uLT5jaGFubmVsTnVtYmVyKSkKKwkJcmV0Q29kZSA9IGVTSVJfTElNX0lHTk9SRV9CRUFDT047CisJZWxzZSBpZiAobGltX2lic3NfZW5jX3R5cGVfbWF0Y2hlZChwQmVhY29uLCBwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1RSVUUpIHsKKwkJUEVMT0czKGxpbV9sb2cocE1hYywgTE9HMywKKwkJCSAgICAgICBGTAorCQkJCSAgICAgICAoInBlZXIgcHJpdmFjeSAlZCBwZWVyIHdwYSAlZCBwZWVyIHJzbiAlZCBzZWxmIGVuY1R5cGUgJWQiKSwKKwkJCSAgICAgICBwQmVhY29uLT5jYXBhYmlsaXR5SW5mby5wcml2YWN5LAorCQkJICAgICAgIHBCZWFjb24tPndwYVByZXNlbnQsIHBCZWFjb24tPnJzblByZXNlbnQsCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+ZW5jcnlwdFR5cGUpOworCQkgICAgICAgKQorCQlyZXRDb2RlID0gZVNJUl9MSU1fSUdOT1JFX0JFQUNPTjsKKwl9IGVsc2UgeworCQl1aW50MzJfdCBpZUxlbjsKKwkJdWludDE2X3QgdHNmTGF0ZXI7CisJCXVpbnQ4X3QgKnBJRXM7CisJCWllTGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKTsKKwkJdHNmTGF0ZXIgPSBXTUFfR0VUX1JYX1RTRl9MQVRFUihwUnhQYWNrZXRJbmZvKTsKKwkJcElFcyA9IFdNQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pOworCQlQRUxPRzMobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0czLCBGTCgiQkVGT1JFIENvYWxlc2NpbmcgdHNmTGF0ZXIgdmFsIDolZCIpLAorCQkJICAgICAgIHRzZkxhdGVyKTsKKwkJICAgICAgICkKKwkJcmV0Q29kZSA9CisJCQlsaW1faWJzc19jb2FsZXNjZShwTWFjLCBwSGRyLCBwQmVhY29uLCBwSUVzLCBpZUxlbiwgdHNmTGF0ZXIsCisJCQkJCSAgcHNlc3Npb25FbnRyeSk7CisJfQorCXJldHVybiByZXRDb2RlOworfSAvKioqIGVuZCBsaW1faGFuZGxlX2lic19zY29hbGVzY2luZygpICoqKi8KKworLyoqCisgKiBsaW1fZW5jX3R5cGVfbWF0Y2hlZCgpIC0gbWF0Y2hlcyBzZWN1cml0eSB0eXBlIG9mIGluY29taW5nIGJlcmFjb24gd2l0aAorICogY3VycmVudAorICogQG1hY19jdHggICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAYmNuICAgICAgICAgIFBvaW50ZXIgdG8gcGFyc2VkIEJlYWNvbiBzdHJ1Y3R1cmUKKyAqIEBzZXNzaW9uICAgICAgUEUgc2Vzc2lvbiBlbnRyeQorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF0Y2hlcyBzZWN1cml0eSB0eXBlIG9mIGluY29taW5nIGJlcmFjb24gd2l0aCBjdXJyZW50CisgKgorICogQHJldHVybiB0cnVlIGlmIG1hdGNoZWQsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgYm9vbAorbGltX2VuY190eXBlX21hdGNoZWQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJICAgICB0cFNjaEJlYWNvblN0cnVjdCBiY24sCisJCSAgICAgdHBQRVNlc3Npb24gc2Vzc2lvbikKK3sKKwlpZiAoIWJjbiB8fCAhc2Vzc2lvbikKKwkJcmV0dXJuIGZhbHNlOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgiQmVhY29uL1Byb2JlOjogUHJpdmFjeSA6JWQgV1BBIFByZXNlbnQ6JWQgUlNOIFByZXNlbnQ6ICVkIiksCisJCWJjbi0+Y2FwYWJpbGl0eUluZm8ucHJpdmFjeSwgYmNuLT53cGFQcmVzZW50LCBiY24tPnJzblByZXNlbnQpOworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoInNlc3Npb246OiBQcml2YWN5IDolZCBFbmN5cHRpb25UeXBlOiAlZCIpLAorCQlTSVJfTUFDX0dFVF9QUklWQUNZKHNlc3Npb24tPmxpbUN1cnJlbnRCc3NDYXBzKSwKKwkJc2Vzc2lvbi0+ZW5jcnlwdFR5cGUpOworCisJLyoKKwkgKiBUaGlzIGlzIGhhbmRsZWQgYnkgc2VuZGluZyBwcm9iZSByZXEgZHVlIHRvIElPVCBpc3N1ZXMgc28KKwkgKiByZXR1cm4gVFJVRQorCSAqLworCWlmICgoYmNuLT5jYXBhYmlsaXR5SW5mby5wcml2YWN5KSAhPQorCQlTSVJfTUFDX0dFVF9QUklWQUNZKHNlc3Npb24tPmxpbUN1cnJlbnRCc3NDYXBzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csIEZMKCJQcml2YWN5IGJpdCBtaXNzIG1hdGNoXG4iKSk7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qIE9wZW4gKi8KKwlpZiAoKGJjbi0+Y2FwYWJpbGl0eUluZm8ucHJpdmFjeSA9PSAwKSAmJgorCSAgICAoc2Vzc2lvbi0+ZW5jcnlwdFR5cGUgPT0gZVNJUl9FRF9OT05FKSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBXRVAgKi8KKwlpZiAoKGJjbi0+Y2FwYWJpbGl0eUluZm8ucHJpdmFjeSA9PSAxKSAmJgorCSAgICAoYmNuLT53cGFQcmVzZW50ID09IDApICYmIChiY24tPnJzblByZXNlbnQgPT0gMCkgJiYKKwkgICAgKChzZXNzaW9uLT5lbmNyeXB0VHlwZSA9PSBlU0lSX0VEX1dFUDQwKSB8fAorCQkoc2Vzc2lvbi0+ZW5jcnlwdFR5cGUgPT0gZVNJUl9FRF9XRVAxMDQpCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwkJfHwgKHNlc3Npb24tPmVuY3J5cHRUeXBlID09IGVTSVJfRURfV1BJKQorI2VuZGlmCisJICAgICkpCisJCXJldHVybiB0cnVlOworCisJLyogV1BBIE9SIFJTTiovCisJaWYgKChiY24tPmNhcGFiaWxpdHlJbmZvLnByaXZhY3kgPT0gMSkgJiYKKwkgICAgKChiY24tPndwYVByZXNlbnQgPT0gMSkgfHwgKGJjbi0+cnNuUHJlc2VudCA9PSAxKSkgJiYKKwkgICAgKChzZXNzaW9uLT5lbmNyeXB0VHlwZSA9PSBlU0lSX0VEX1RLSVApIHx8CisJCShzZXNzaW9uLT5lbmNyeXB0VHlwZSA9PSBlU0lSX0VEX0NDTVApIHx8CisJCShzZXNzaW9uLT5lbmNyeXB0VHlwZSA9PSBlU0lSX0VEX0FFU18xMjhfQ01BQykpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBsaW1fZGV0ZWN0X2NoYW5nZV9pbl9hcF9jYXBhYmlsaXRpZXMoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoaWxlIFNDSCBpcyBwcm9jZXNzaW5nCisgKiByZWNlaXZlZCBCZWFjb24gZnJvbSBBUCBvbiBTVEEgdG8gZGV0ZWN0IGFueQorICogY2hhbmdlIGluIEFQJ3MgY2FwYWJpbGl0aWVzLiBJZiB0aGVyZSBhbnkgY2hhbmdlCisgKiBpcyBkZXRlY3RlZCwgUm9hbWluZyBpcyBpbmZvcm1lZCBvZiBzdWNoIGNoYW5nZQorICogc28gdGhhdCBpdCBjYW4gdHJpZ2dlciByZWFzc29jaWF0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKiBOb3RpZmljYXRpb24gaXMgZW5hYmxlZCBmb3IgU1RBIHByb2R1Y3Qgb25seSBzaW5jZQorICogaXQgaXMgbm90IGEgcmVxdWlyZW1lbnQgb24gQlAgc2lkZS4KKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBCZWFjb24gICBQb2ludGVyIHRvIHBhcnNlZCBCZWFjb24gc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1fZGV0ZWN0X2NoYW5nZV9pbl9hcF9jYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uIHBCZWFjb24sCisJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQ4X3QgbGVuOworCXRTaXJTbWVBcE5ld0NhcHMgYXBOZXdDYXBzOworCXVpbnQ4X3QgbmV3Q2hhbm5lbDsKKwl0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKwlib29sIHNlY3VyaXR5X2NhcHNfbWF0Y2hlZCA9IHRydWU7CisKKwlhcE5ld0NhcHMuY2FwYWJpbGl0eUluZm8gPQorCQlsaW1fZ2V0X3UxNigodWludDhfdCAqKSAmcEJlYWNvbi0+Y2FwYWJpbGl0eUluZm8pOworCW5ld0NoYW5uZWwgPSAodWludDhfdCkgcEJlYWNvbi0+Y2hhbm5lbE51bWJlcjsKKworCXNlY3VyaXR5X2NhcHNfbWF0Y2hlZCA9IGxpbV9lbmNfdHlwZV9tYXRjaGVkKHBNYWMsIHBCZWFjb24sCisJCQkJCQkgICAgIHBzZXNzaW9uRW50cnkpOworCWlmICgoZmFsc2UgPT0gcHNlc3Npb25FbnRyeS0+bGltU2VudENhcHNDaGFuZ2VOdGYpICYmCisJICAgICgoKCFsaW1faXNfbnVsbF9zc2lkKCZwQmVhY29uLT5zc0lkKSkgJiYKKwkgICAgICAgKGZhbHNlID09IGxpbV9jbXBfc19zaWQocE1hYywgJnBCZWFjb24tPnNzSWQsIHBzZXNzaW9uRW50cnkpKSkgfHwKKwkgICAgICgoU0lSX01BQ19HRVRfRVNTKGFwTmV3Q2Fwcy5jYXBhYmlsaXR5SW5mbykgIT0KKwkgICAgICAgU0lSX01BQ19HRVRfRVNTKHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzKSkgfHwKKwkgICAgICAoU0lSX01BQ19HRVRfUFJJVkFDWShhcE5ld0NhcHMuY2FwYWJpbGl0eUluZm8pICE9CisJICAgICAgIFNJUl9NQUNfR0VUX1BSSVZBQ1kocHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc0NhcHMpKSB8fAorCSAgICAgIChTSVJfTUFDX0dFVF9TSE9SVF9QUkVBTUJMRShhcE5ld0NhcHMuY2FwYWJpbGl0eUluZm8pICE9CisJICAgICAgIFNJUl9NQUNfR0VUX1NIT1JUX1BSRUFNQkxFKHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzKSkgfHwKKwkgICAgICAoU0lSX01BQ19HRVRfUU9TKGFwTmV3Q2Fwcy5jYXBhYmlsaXR5SW5mbykgIT0KKwkgICAgICAgU0lSX01BQ19HRVRfUU9TKHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzKSkgfHwKKwkgICAgICAoKG5ld0NoYW5uZWwgIT0gcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSAmJgorCQkobmV3Q2hhbm5lbCAhPSAwKSkgfHwKKwkgICAgICAoZmFsc2UgPT0gc2VjdXJpdHlfY2Fwc19tYXRjaGVkKQorCSAgICAgKSkpIHsKKwkJaWYgKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmZXYWl0Rm9yUHJvYmVSc3ApIHsKKwkJCS8qIElmIEJlYWNvbiBjYXBhYmlsaXRpZXMgaXMgbm90IG1hdGNoaW5nIHdpdGggdGhlIGN1cnJlbnQgY2FwYWJpbGl0eSwKKwkJCSAqIHRoZW4gc2VuZCB1bmljYXN0IHByb2JlIHJlcXVlc3QgdG8gQVAgYW5kIHRha2UgZGVjaXNpb24gYWZ0ZXIKKwkJCSAqIHJlY2VpdmluZyBwcm9iZSByZXNwb25zZSAqLworCQkJaWYgKHRydWUgPT0gcHNlc3Npb25FbnRyeS0+Zklnbm9yZUNhcHNDaGFuZ2UpIHsKKwkJCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJCUZMCisJCQkJCQkoIklnbm9yaW5nIHRoZSBDYXBhYmlsaXR5IGNoYW5nZSBhcyBpdCBpcyBmYWxzZSBhbGFybSIpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlwc2Vzc2lvbkVudHJ5LT5mV2FpdEZvclByb2JlUnNwID0gdHJ1ZTsKKwkJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCQlGTCgiQVAgY2FwYWJpbGl0aWVzIGFyZSBub3QgbWF0Y2hpbmcsIgorCQkJCSAgICJzZW5kaW5nIGRpcmVjdGVkIHByb2JlIHJlcXVlc3QuLiAiKSk7CisJCQlzdGF0dXMgPQorCQkJCWxpbV9zZW5kX3Byb2JlX3JlcV9tZ210X2ZyYW1lKHBNYWMsICZwc2Vzc2lvbkVudHJ5LT5zc0lkLAorCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkLAorCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnktPgorCQkJCQkJCSAgICAgIGN1cnJlbnRPcGVyQ2hhbm5lbCwKKwkJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwKKwkJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUsCisJCQkJCQkJICAgICAgMCwgTlVMTCk7CisKKwkJCWlmIChlU0lSX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgic2VuZCBQcm9iZVJlcSBmYWlsZWQiKSk7CisJCQkJcHNlc3Npb25FbnRyeS0+ZldhaXRGb3JQcm9iZVJzcCA9IGZhbHNlOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCS8qKgorCQkgKiBCU1MgY2FwYWJpbGl0aWVzIGhhdmUgY2hhbmdlZC4KKwkJICogSW5mb3JtIFJvYW1pbmcuCisJCSAqLworCQlsZW4gPSBzaXplb2YodFNpck1hY0NhcGFiaWxpdHlJbmZvKSArIHNpemVvZih0U2lyTWFjQWRkcikgKyBzaXplb2YodWludDhfdCkgKyAzICogc2l6ZW9mKHVpbnQ4X3QpICsgLyogcmVzZXJ2ZWQgZmllbGRzICovCisJCSAgICAgIHBCZWFjb24tPnNzSWQubGVuZ3RoICsgMTsKKworCQljZGZfbWVtX2NvcHkoYXBOZXdDYXBzLmJzc0lkLAorCQkJICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCWlmIChuZXdDaGFubmVsICE9IHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCkgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJDaGFubmVsIENoYW5nZSBmcm9tICVkIC0tPiAlZCAgLSAiCisJCQkJCSAgIklnbm9yaW5nIGJlYWNvbiEiKSwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsLCBuZXdDaGFubmVsKTsKKwkJCSAgICAgICApCisJCQlyZXR1cm47CisJCX0KKworCQkvKioKKwkJICogV2hlbiBDaXNjbyAxMjYyIEVudGVycHJpc2UgQVBzIGFyZSBjb25maWd1cmVkIHdpdGggV1BBMi1QU0sgd2l0aAorCQkgKiBBRVMrVEtJUCBQYWlyd2lzZSBjaXBoZXJzIGFuZCBXRVAtNDAgR3JvdXAgY2lwaGVyLCB0aGV5IGRvIG5vdCBzZXQKKwkJICogdGhlIHByaXZhY3kgYml0IGluIEJlYWNvbnMgKHdwYS9yc25pZSBpcyBzdGlsbCBwcmVzZW50IGluIGJlYWNvbnMpLAorCQkgKiB0aGUgcHJpdmFjeSBiaXQgaXMgc2V0IGluIFByb2JlIGFuZCBhc3NvY2lhdGlvbiByZXNwb25zZXMuCisJCSAqIER1ZSB0byB0aGlzIGFub21hbHksIHdlIGRldGVjdCBhIGNoYW5nZSBpbgorCQkgKiBBUCBjYXBhYmlsaXRpZXMgd2hlbiB3ZSByZWNlaXZlIGEgYmVhY29uIGFmdGVyIGFzc29jaWF0aW9uIGFuZAorCQkgKiBkaXNjb25uZWN0IGZyb20gdGhlIEFQLiBUaGUgZm9sbG93aW5nIGNoZWNrIG1ha2VzIHN1cmUgdGhhdCB3ZSBjYW4KKwkJICogY29ubmVjdCB0byBzdWNoIEFQcworCQkgKi8KKwkJZWxzZSBpZiAoKFNJUl9NQUNfR0VUX1BSSVZBQ1koYXBOZXdDYXBzLmNhcGFiaWxpdHlJbmZvKSA9PSAwKSAmJgorCQkJIChwQmVhY29uLT5yc25QcmVzZW50IHx8IHBCZWFjb24tPndwYVByZXNlbnQpKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoIkJTUyBDYXBzIChQcml2YWN5KSBiaXQgMCBpbiBiZWFjb24sIgorCQkJCQkgICIgYnV0IFdQQSBvciBSU04gSUUgcHJlc2VudCwgSWdub3JlIEJlYWNvbiEiKSk7CisJCQkgICAgICAgKQorCQkJcmV0dXJuOworCQl9IGVsc2UKKwkJCWFwTmV3Q2Fwcy5jaGFubmVsSWQgPSBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWw7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmYXBOZXdDYXBzLnNzSWQsCisJCQkgICAgICh1aW50OF90ICopICZwQmVhY29uLT5zc0lkLAorCQkJICAgICBwQmVhY29uLT5zc0lkLmxlbmd0aCArIDEpOworCisJCXBzZXNzaW9uRW50cnktPmZJZ25vcmVDYXBzQ2hhbmdlID0gZmFsc2U7CisJCXBzZXNzaW9uRW50cnktPmZXYWl0Rm9yUHJvYmVSc3AgPSBmYWxzZTsKKwkJcHNlc3Npb25FbnRyeS0+bGltU2VudENhcHNDaGFuZ2VOdGYgPSB0cnVlOworCQlsaW1fc2VuZF9zbWVfd21fc3RhdHVzX2NoYW5nZV9udGYocE1hYywgZVNJUl9TTUVfQVBfQ0FQU19DSEFOR0VELAorCQkJCQkJICAodWludDMyX3QgKikgJmFwTmV3Q2FwcywKKwkJCQkJCSAgbGVuLCBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQpOworCX0gZWxzZSBpZiAodHJ1ZSA9PSBwc2Vzc2lvbkVudHJ5LT5mV2FpdEZvclByb2JlUnNwKSB7CisJCS8qIE9ubHkgZm9yIHByb2JlIHJlc3BvbnNlIGZyYW1lcyBhbmQgbWF0Y2hpbmcgY2FwYWJpbGl0aWVzIHRoZSBjb250cm9sCisJCSAqIHdpbGwgY29tZSBoZXJlLiBJZiBiZWFjb24gaXMgd2l0aCBicm9hZGNhc3Qgc3NpZCB0aGVuIGZXYWl0Rm9yUHJvYmVSc3AKKwkJICogd2lsbCBiZSBmYWxzZSwgdGhlIGNvbnRyb2wgd2lsbCBub3QgY29tZSBoZXJlKi8KKworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJjYXBhYmlsaXRpZXMgaW4gcHJvYmUgcmVzcG9uc2UgYXJlIgorCQkJCSAgICAgICAibWF0Y2hpbmcgd2l0aCB0aGUgY3VycmVudCBzZXR0aW5nLCIKKwkJCQkgICAgICAgIklnbm9yaW5nIHN1YnNlcXVlbnQgY2FwYWJpbGl0eSIKKwkJCQkgICAgICAgIm1pc21hdGNoIikpOworCQlwc2Vzc2lvbkVudHJ5LT5mSWdub3JlQ2Fwc0NoYW5nZSA9IHRydWU7CisJCXBzZXNzaW9uRW50cnktPmZXYWl0Rm9yUHJvYmVSc3AgPSBmYWxzZTsKKwl9CisKK30gLyoqKiBsaW1fZGV0ZWN0X2NoYW5nZV9pbl9hcF9jYXBhYmlsaXRpZXMoKSAqKiovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBsaW1fdXBkYXRlX3Nob3J0X3Nsb3QKKyAqCisgKiBGVU5DVElPTjoKKyAqIEVuYWJsZS9EaXNhYmxlIHNob3J0IHNsb3QKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBlbmFibGUgICAgICAgIEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgc2hvcnQgc2xvdAorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cyBsaW1fdXBkYXRlX3Nob3J0X3Nsb3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgdHBTaXJQcm9iZVJlc3BCZWFjb24gcEJlYWNvbiwKKwkJCQkgICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywKKwkJCQkgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworCXRTaXJTbWVBcE5ld0NhcHMgYXBOZXdDYXBzOworCXVpbnQzMl90IG5TaG9ydFNsb3Q7CisJdWludDMyX3QgdmFsID0gMDsKKwl1aW50MzJfdCBwaHlNb2RlOworCisJLyogQ2hlY2sgQWRtaW4gbW9kZSBmaXJzdC4gSWYgaXQgaXMgZGlzYWJsZWQganVzdCByZXR1cm4gKi8KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRCwgJnZhbCkKKwkgICAgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJjZmcgZ2V0IFdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRSBmYWlsZWQiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCWlmICh2YWwgPT0gZmFsc2UpCisJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKKwkvKiBDaGVjayBmb3IgMTFhIG1vZGUgb3IgMTFiIG1vZGUuIEluIGJvdGggY2FzZXMgcmV0dXJuIHNpbmNlIHNsb3QgdGltZSBpcyBjb25zdGFudCBhbmQgY2Fubm90L3Nob3VsZCBub3QgY2hhbmdlIGluIGJlYWNvbiAqLworCWxpbV9nZXRfcGh5X21vZGUocE1hYywgJnBoeU1vZGUsIHBzZXNzaW9uRW50cnkpOworCWlmICgocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExQSkKKwkgICAgfHwgKHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUIpKQorCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCisJYXBOZXdDYXBzLmNhcGFiaWxpdHlJbmZvID0KKwkJbGltX2dldF91MTYoKHVpbnQ4X3QgKikgJnBCZWFjb24tPmNhcGFiaWxpdHlJbmZvKTsKKworCS8qICBFYXJsaWVyIGltcGxlbWVudGF0aW9uOiBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIHNob3J0IHNsb3QgbW9kZSBiYXNlZCBvbiBBUCBhZHZlcnRpc2VkIG1vZGVzICovCisJLyogd2hlbiBlcnAgaXMgcHJlc2VudCwgYXBwbHkgc2hvcnQgc2xvdCBhbHdheXMgdW5sZXNzLCBwcm90PW9uICAmJiBzaG9ydFNsb3Q9b2ZmICovCisJLyogaWYgbm8gZXJwIHByZXNlbnQsIHVzZSBzaG9ydCBzbG90IGJhc2VkIG9uIGN1cnJlbnQgYXAgY2FwcyAqLworCisJLyogSXNzdWUgd2l0aCBlYXJsaWVyIGltcGxlbWVudGF0aW9uIDogQ2lzY28gMTIzMSBCRyBoYXMgc2hvcnRTbG90ID0gMCwgZXJwSUVQcmVzZW50IGFuZCB1c2VQcm90ZWN0aW9uID0gMCAoQ2FzZTQpOyAqLworCisJLyogUmVzb2x1dGlvbiA6IGFsd2F5cyB1c2UgdGhlIHNob3J0U2xvdCBzZXR0aW5nIHRoZSBjYXBhYmlsaXR5IGluZm8gdG8gZGVjaWRlIHNsb3QgdGltZS4gKi8KKwkvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBlYXJsaWVyIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgbmV3IG9uZSBpcyBvbmx5IENhc2U0LiAqLworCS8qCisJICAgRVJQIElFIFByZXNlbnQgIHwgICB1c2VQcm90ZWN0aW9uICAgfCAgIHNob3J0U2xvdCAgID0gICBRQyBTVEEgU2hvcnQgU2xvdAorCSAgIENhc2UxICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAvL0FQIHNob3VsZCBub3QgYWR2ZXJ0aXNlIHRoaXMgY29tYmluYXRpb24uCisJICAgQ2FzZTIgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIDAKKwkgICBDYXNlMyAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgMQorCSAgIENhc2U0ICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAwCisJICAgQ2FzZTUgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgIDEKKwkgICBDYXNlNiAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgMAorCSAgIENhc2U3ICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAxCisJICAgQ2FzZTggICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIDAKKwkgKi8KKwluU2hvcnRTbG90ID0gU0lSX01BQ19HRVRfU0hPUlRfU0xPVF9USU1FKGFwTmV3Q2Fwcy5jYXBhYmlsaXR5SW5mbyk7CisKKwlpZiAoblNob3J0U2xvdCAhPSBwc2Vzc2lvbkVudHJ5LT5zaG9ydFNsb3RUaW1lU3VwcG9ydGVkKSB7CisJCS8qIFNob3J0IHNsb3QgdGltZSBjYXBhYmlsaXR5IG9mIEFQIGhhcyBjaGFuZ2VkLiBBZG9wdCB0byBpdC4gKi8KKwkJUEVMT0cxKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCSAgICAgICBGTCgiU2hvcnRzbG90IGNhcGFiaWxpdHkgb2YgQVAgY2hhbmdlZDogJWQiKSwKKwkJCSAgICAgICBuU2hvcnRTbG90KTsKKwkJICAgICAgICkKKwkJCSgodHBTaXJNYWNDYXBhYmlsaXR5SW5mbykgJiBwc2Vzc2lvbkVudHJ5LT4KKwkJCWxpbUN1cnJlbnRCc3NDYXBzKS0+c2hvcnRTbG90VGltZSA9ICh1aW50MTZfdCkgblNob3J0U2xvdDsKKwkJcHNlc3Npb25FbnRyeS0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCA9IG5TaG9ydFNsb3Q7CisJCXBCZWFjb25QYXJhbXMtPmZTaG9ydFNsb3RUaW1lID0gKHVpbnQ4X3QpIG5TaG9ydFNsb3Q7CisJCXBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQlQQVJBTV9TSE9SVF9TTE9UX1RJTUVfQ0hBTkdFRDsKKwl9CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworCit2b2lkIGxpbV9zZW5kX2hlYXJ0X2JlYXRfdGltZW91dF9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MzJfdCBzdGF0dXNDb2RlOworCXRTaXJNc2dRIG1zZzsKKworCS8qIFByZXBhcmUgYW5kIHBvc3QgbWVzc2FnZSB0byBMSU0gTWVzc2FnZSBRdWV1ZSAqLworCW1zZy50eXBlID0gKHVpbnQxNl90KSBTSVJfTElNX0hFQVJUX0JFQVRfVElNRU9VVDsKKwltc2cuYm9keXB0ciA9IHBzZXNzaW9uRW50cnk7CisJbXNnLmJvZHl2YWwgPSAwOworCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkhlYXJ0YmVhdCBmYWlsdXJlIGZyb20gRnciKSk7CisKKwlzdGF0dXNDb2RlID0gbGltX3Bvc3RfbXNnX2FwaShwTWFjLCAmbXNnKTsKKworCWlmIChzdGF0dXNDb2RlICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgicG9zdGluZyBtZXNzYWdlICVYIHRvIExJTSBmYWlsZWQsIHJlYXNvbj0lZCIpLAorCQkJbXNnLnR5cGUsIHN0YXR1c0NvZGUpOworCX0KK30KKworLyoqCisgKiBsaW1fcHNfb2ZmbG9hZF9oYW5kbGVfbWlzc2VkX2JlYWNvbl9pbmQoKTogaGFuZGxlcyBtaXNzZWQgYmVhY29uIGluZGljYXRpb24KKyAqIEBwTWFjIDogZ2xvYmFsIG1hYyBjb250ZXh0CisgKiBAcE1zZzogbWVzc2FnZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgU0lSX0hBTF9NSVNTRURfQkVBQ09OX0lORAorICogbWVzc2FnZSBmcm9tIEhBTCwgdG8gZG8gYWN0aXZlIEFQIHByb2JpbmcuCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgbGltX3BzX29mZmxvYWRfaGFuZGxlX21pc3NlZF9iZWFjb25faW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKQoreworCXRwU2lyU21lTWlzc2VkQmVhY29uSW5kIHBTaXJNaXNzZWRCZWFjb25JbmQgPQorCQkodHBTaXJTbWVNaXNzZWRCZWFjb25JbmQpIHBNc2ctPmJvZHlwdHI7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9CisJCXBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NfaWR4KHBNYWMsIHBTaXJNaXNzZWRCZWFjb25JbmQtPmJzc0lkeCk7CisKKwlpZiAoIXBzZXNzaW9uRW50cnkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIEJTU0lkIikpOworCQlyZXR1cm47CisJfQorCisJLyogU2V0IEJlYWNvbiBNaXNzIGluIFBvd2Vyc2F2ZSBPZmZsb2FkICovCisJcHNlc3Npb25FbnRyeS0+cG1tT2ZmbG9hZEluZm8uYmNubWlzcyA9IHRydWU7CisJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJICAgICAgIEZMKCJSZWNlaXZlZCBIZWFydCBCZWF0IEZhaWx1cmUiKSk7KQorCisJLyogIERvIEFQIHByb2JpbmcgaW1tZWRpYXRlbHkgKi8KKwlsaW1fc2VuZF9oZWFydF9iZWF0X3RpbWVvdXRfaW5kKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCXJldHVybjsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKK0NERl9TVEFUVVMgbGltX3JvYW1fZmlsbF9ic3NfZGVzY3IodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJcm9hbV9vZmZsb2FkX3N5bmNoX2luZCAqcm9hbV9vZmZsb2FkX3N5bmNoX2luZF9wdHIpCit7CisJdWludDMyX3QgaWVfbGVuID0gMDsKKwl0cFNpclByb2JlUmVzcEJlYWNvbiBwYXJzZWRfZnJtX3B0cjsKKwl0cFNpck1hY01nbXRIZHIgbWFjX2hkcjsKKwl1aW50OF90ICpiY25fcHJvYmVyZXNwX3B0cjsKKwl0U2lyQnNzRGVzY3JpcHRpb24gKmJzc19kZXNjX3B0ciA9IE5VTEw7CisKKwliY25fcHJvYmVyZXNwX3B0ciA9ICh1aW50OF90ICopcm9hbV9vZmZsb2FkX3N5bmNoX2luZF9wdHIgKworCQlyb2FtX29mZmxvYWRfc3luY2hfaW5kX3B0ci0+YmVhY29uUHJvYmVSZXNwT2Zmc2V0OworCW1hY19oZHIgPSAodHBTaXJNYWNNZ210SGRyKWJjbl9wcm9iZXJlc3BfcHRyOworCXBhcnNlZF9mcm1fcHRyID0KKwkodHBTaXJQcm9iZVJlc3BCZWFjb24pIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyUHJvYmVSZXNwQmVhY29uKSk7CisJaWYgKE5VTEwgPT0gcGFyc2VkX2ZybV9wdHIpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCAiZmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZyYW1lIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJaWYgKHJvYW1fb2ZmbG9hZF9zeW5jaF9pbmRfcHRyLT5iZWFjb25Qcm9iZVJlc3BMZW5ndGggPD0KKwkJCVNJUl9NQUNfSERSX0xFTl8zQSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHZlcnkiCisJCSJmZXcgYnl0ZXMgaW4gc3luY2hJbmQgYmVhY29uIC8gcHJvYmUgcmVzcCBmcmFtZSEgbGVuZ3RoPSVkIiwKKwkJX19mdW5jX18sIHJvYW1fb2ZmbG9hZF9zeW5jaF9pbmRfcHRyLT5iZWFjb25Qcm9iZVJlc3BMZW5ndGgpOworCQljZGZfbWVtX2ZyZWUocGFyc2VkX2ZybV9wdHIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkiTEZSMzogQmVhY29uL1ByYiBSc3A6Iik7CisJQ0RGX1RSQUNFX0hFWF9EVU1QKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCWJjbl9wcm9iZXJlc3BfcHRyLCByb2FtX29mZmxvYWRfc3luY2hfaW5kX3B0ci0+YmVhY29uUHJvYmVSZXNwTGVuZ3RoKTsKKwlpZiAocm9hbV9vZmZsb2FkX3N5bmNoX2luZF9wdHItPmlzQmVhY29uKSB7CisJCWlmIChzaXJfcGFyc2VfYmVhY29uX2llKHBNYWMsIHBhcnNlZF9mcm1fcHRyLAorCQkJJmJjbl9wcm9iZXJlc3BfcHRyW1NJUl9NQUNfSERSX0xFTl8zQSArCisJCQlTSVJfTUFDX0JfUFJfU1NJRF9PRkZTRVRdLAorCQkJcm9hbV9vZmZsb2FkX3N5bmNoX2luZF9wdHItPmJlYWNvblByb2JlUmVzcExlbmd0aCAtCisJCQlTSVJfTUFDX0hEUl9MRU5fM0EpICE9IGVTSVJfU1VDQ0VTUyB8fAorCQkJIXBhcnNlZF9mcm1fcHRyLT5zc2lkUHJlc2VudCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJQYXJzZSBlcnJvciBCZWFjb24sIGxlbmd0aD0lZCIsCisJCQlyb2FtX29mZmxvYWRfc3luY2hfaW5kX3B0ci0+YmVhY29uUHJvYmVSZXNwTGVuZ3RoKTsKKwkJCWNkZl9tZW1fZnJlZShwYXJzZWRfZnJtX3B0cik7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoc2lyX2NvbnZlcnRfcHJvYmVfZnJhbWUyX3N0cnVjdChwTWFjLAorCQkJJmJjbl9wcm9iZXJlc3BfcHRyW1NJUl9NQUNfSERSX0xFTl8zQV0sCisJCQlyb2FtX29mZmxvYWRfc3luY2hfaW5kX3B0ci0+YmVhY29uUHJvYmVSZXNwTGVuZ3RoIC0KKwkJCVNJUl9NQUNfSERSX0xFTl8zQSwgcGFyc2VkX2ZybV9wdHIpICE9IGVTSVJfU1VDQ0VTUyB8fAorCQkJIXBhcnNlZF9mcm1fcHRyLT5zc2lkUHJlc2VudCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJQYXJzZSBlcnJvciBQcm9iZVJlc3BvbnNlLCBsZW5ndGg9JWQiLAorCQkJcm9hbV9vZmZsb2FkX3N5bmNoX2luZF9wdHItPmJlYWNvblByb2JlUmVzcExlbmd0aCk7CisJCQljZGZfbWVtX2ZyZWUocGFyc2VkX2ZybV9wdHIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfQorCS8qIDI0IGJ5dGUgTUFDIGhlYWRlciBhbmQgMTIgYnl0ZSB0byBzc2lkIElFICovCisJaWYgKHJvYW1fb2ZmbG9hZF9zeW5jaF9pbmRfcHRyLT5iZWFjb25Qcm9iZVJlc3BMZW5ndGggPgorCQkoU0lSX01BQ19IRFJfTEVOXzNBICsgU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VUKSkgeworCQlpZV9sZW4gPSByb2FtX29mZmxvYWRfc3luY2hfaW5kX3B0ci0+YmVhY29uUHJvYmVSZXNwTGVuZ3RoIC0KKwkJCShTSVJfTUFDX0hEUl9MRU5fM0EgKyBTSVJfTUFDX0JfUFJfU1NJRF9PRkZTRVQpOworCX0KKwkvKgorCSAqIE1lbW9yeSBhbGxvY2F0ZWQgYmVsb3cgaXMgZnJlZWQgdXAgaW4gY3NyUHJvY2Vzc1JvYW1PZmZsb2FkU3luY2hJbmQKKwkgKi8KKwlyb2FtX29mZmxvYWRfc3luY2hfaW5kX3B0ci0+YnNzX2Rlc2NfcHRyID0KKwkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mICh0U2lyQnNzRGVzY3JpcHRpb24pICsgaWVfbGVuKTsKKwlic3NfZGVzY19wdHIgPSByb2FtX29mZmxvYWRfc3luY2hfaW5kX3B0ci0+YnNzX2Rlc2NfcHRyOworCWlmIChOVUxMID09IGJzc19kZXNjX3B0cikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSJMRlIzOkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKKwkJQ0RGX0FTU0VSVChic3NfZGVzY19wdHIgIT0gTlVMTCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCWNkZl9tZW1femVybyhic3NfZGVzY19wdHIsIHNpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pKTsKKworCS8qCisJICogTGVuZ3RoIG9mIEJTUyBkZXNyaXB0aW9uIGlzIHdpdGhvdXQgbGVuZ3RoIG9mCisJICogbGVuZ3RoIGl0c2VsZiBhbmQgbGVuZ3RoIG9mIHBvaW50ZXIKKwkgKiB0aGF0IGhvbGRzIGllRmllbGRzCisJICoKKwkgKiB0U2lyQnNzRGVzY3JpcHRpb24KKwkgKiArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKwkgKiB8IGxlbmd0aCB8IG90aGVyIGZpZWxkcyAgICAgICAgICAgICAgICAgICAgfCBwb2ludGVyIHRvIElFc3wKKwkgKiArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZUZpZWxkcworCSAqLworCWJzc19kZXNjX3B0ci0+bGVuZ3RoID0gKHVpbnQxNl90KSAob2Zmc2V0b2YodFNpckJzc0Rlc2NyaXB0aW9uLAorCQkJCQkgICBpZUZpZWxkc1swXSkgLQorCQkJCXNpemVvZihic3NfZGVzY19wdHItPmxlbmd0aCkgKyBpZV9sZW4pOworCisJaWYgKHBhcnNlZF9mcm1fcHRyLT5kc1BhcmFtc1ByZXNlbnQpIHsKKwkJYnNzX2Rlc2NfcHRyLT5jaGFubmVsSWQgPSBwYXJzZWRfZnJtX3B0ci0+Y2hhbm5lbE51bWJlcjsKKwl9IGVsc2UgaWYgKHBhcnNlZF9mcm1fcHRyLT5IVEluZm8ucHJlc2VudCkgeworCQlic3NfZGVzY19wdHItPmNoYW5uZWxJZCA9IHBhcnNlZF9mcm1fcHRyLT5IVEluZm8ucHJpbWFyeUNoYW5uZWw7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgRFMgUGFyYW1zIG9yIEhUSUUgaXMgbm90IHByZXNlbnQgaW4gdGhlIHByb2JlIHJlc3Agb3IKKwkJICogYmVhY29uLCB0aGVuIHVzZSB0aGUgY2hhbm5lbCBmcmVxdWVuY3kgcHJvdmlkZWQgYnkgZmlybXdhcmUKKwkJICogdG8gZmlsbCB0aGUgY2hhbm5lbCBpbiB0aGUgQlNTIGRlc2NyaXB0b3IuKi8KKwkJYnNzX2Rlc2NfcHRyLT5jaGFubmVsSWQgPQorCQkJY2RzX2ZyZXFfdG9fY2hhbihyb2FtX29mZmxvYWRfc3luY2hfaW5kX3B0ci0+Y2hhbl9mcmVxKTsKKwl9CisJYnNzX2Rlc2NfcHRyLT5jaGFubmVsSWRTZWxmID0gYnNzX2Rlc2NfcHRyLT5jaGFubmVsSWQ7CisKKwlpZiAoKGJzc19kZXNjX3B0ci0+Y2hhbm5lbElkID4gMCkgJiYgKGJzc19kZXNjX3B0ci0+Y2hhbm5lbElkIDwgMTUpKSB7CisJCWludCBpOworCQkvKiAqCisJCSAqIDExYiBvciAxMWcgcGFja2V0CisJCSAqIDExZyBpZiBleHRlbmRlZCBSYXRlIElFIGlzIHByZXNlbnQgb3IKKwkJICogaWYgdGhlcmUgaXMgYW4gQSByYXRlIGluIHN1cHBSYXRlIElFCisJCSAqICovCisJCWZvciAoaSA9IDA7IGkgPCBwYXJzZWRfZnJtX3B0ci0+c3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXM7IGkrKykgeworCQkJaWYgKHNpcklzQXJhdGUocGFyc2VkX2ZybV9wdHItPnN1cHBvcnRlZFJhdGVzLnJhdGVbaV0gJgorCQkJCQkJMHg3ZikpIHsKKwkJCQlic3NfZGVzY19wdHItPm53VHlwZSA9IGVTSVJfMTFHX05XX1RZUEU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHBhcnNlZF9mcm1fcHRyLT5leHRlbmRlZFJhdGVzUHJlc2VudCkgeworCQkJYnNzX2Rlc2NfcHRyLT5ud1R5cGUgPSBlU0lSXzExR19OV19UWVBFOworCQl9CisJfSBlbHNlIHsKKwkJLyogMTFhIHBhY2tldCAqLworCQlic3NfZGVzY19wdHItPm53VHlwZSA9IGVTSVJfMTFBX05XX1RZUEU7CisJfQorCisJYnNzX2Rlc2NfcHRyLT5zaW5yID0gMDsKKwlic3NfZGVzY19wdHItPmJlYWNvbkludGVydmFsID0gcGFyc2VkX2ZybV9wdHItPmJlYWNvbkludGVydmFsOworCWJzc19kZXNjX3B0ci0+dGltZVN0YW1wWzBdICAgPSBwYXJzZWRfZnJtX3B0ci0+dGltZVN0YW1wWzBdOworCWJzc19kZXNjX3B0ci0+dGltZVN0YW1wWzFdICAgPSBwYXJzZWRfZnJtX3B0ci0+dGltZVN0YW1wWzFdOworCWNkZl9tZW1fY29weSgmYnNzX2Rlc2NfcHRyLT5jYXBhYmlsaXR5SW5mbywKKwkmYmNuX3Byb2JlcmVzcF9wdHJbU0lSX01BQ19IRFJfTEVOXzNBICsgU0lSX01BQ19CX1BSX0NBUEFCX09GRlNFVF0sIDIpOworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmYnNzX2Rlc2NfcHRyLT5ic3NJZCwKKwkJCSh1aW50OF90ICopIG1hY19oZHItPmJzc0lkLAorCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJYnNzX2Rlc2NfcHRyLT5uUmVjZWl2ZWRUaW1lID0KKwkJKHVpbnQzMl90KWNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisJaWYgKHBhcnNlZF9mcm1fcHRyLT5tZGllUHJlc2VudCkgeworCQlic3NfZGVzY19wdHItPm1kaWVQcmVzZW50ID0gcGFyc2VkX2ZybV9wdHItPm1kaWVQcmVzZW50OworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKilic3NfZGVzY19wdHItPm1kaWUsCisJCQkJKHVpbnQ4X3QgKilwYXJzZWRfZnJtX3B0ci0+bWRpZSwKKwkJCQlTSVJfTURJRV9TSVpFKTsKKwl9CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSJMRlIzOiVzOkJzc0Rlc2NyIEluZm86IiwgX19mdW5jX18pOworCUNERl9UUkFDRV9IRVhfRFVNUChDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQlic3NfZGVzY19wdHItPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJImNoYW49JWQsIHJzc2k9JWQiLCBic3NfZGVzY19wdHItPmNoYW5uZWxJZCwKKwkJCWJzc19kZXNjX3B0ci0+cnNzaSk7CisJaWYgKGllX2xlbikgeworCQljZGZfbWVtX2NvcHkoJmJzc19kZXNjX3B0ci0+aWVGaWVsZHMsCisJCQliY25fcHJvYmVyZXNwX3B0ciArCisJCQkoU0lSX01BQ19IRFJfTEVOXzNBICsgU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VUKSwKKwkJCWllX2xlbik7CisJfQorCWNkZl9tZW1fZnJlZShwYXJzZWRfZnJtX3B0cik7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiBicmllZiBsaW1fcm9hbV9vZmZsb2FkX3N5bmNoX2luZCgpIC0gSGFuZGxlcyBSb2FtIFN5bmNoIEluZGljYXRpb24KKyAgKiBwYXJhbSBwTWFjIC0gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAgKiByZXR1cm4gLSBub25lCisgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAqKi8KK3ZvaWQgbGltX3JvYW1fb2ZmbG9hZF9zeW5jaF9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisJdHBQRVNlc3Npb24gc2Vzc2lvbl9wdHI7CisJdHBQRVNlc3Npb24gZnRfc2Vzc2lvbl9wdHI7CisJdWludDhfdCBzZXNzaW9uX2lkOworCXRTaXJNc2dRIG1taF9tc2c7CisJdFNpckJzc0Rlc2NyaXB0aW9uICpic3NfZGVzY19wdHIgPSBOVUxMOworCXJvYW1fb2ZmbG9hZF9zeW5jaF9pbmQgKnJvYW1fc3luY19pbmRfcHRyID0KKwkJKHJvYW1fb2ZmbG9hZF9zeW5jaF9pbmQgKilwTXNnLT5ib2R5cHRyOworCisJaWYgKCFyb2FtX3N5bmNfaW5kX3B0cikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSJMRlIzOiVzOnJvYW1fc3luY19pbmRfcHRyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJMRlIzOiBSZWNlaXZlZCBXTUFfUk9BTV9PRkZMT0FEX1NZTkNIX0lORCIpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkiTEZSMzolczphdXRoU3RhdHVzPSVkLCB2ZGV2SWQ9JWQiLCBfX2Z1bmNfXywKKwkJCXJvYW1fc3luY19pbmRfcHRyLT5hdXRoU3RhdHVzLAorCQkJcm9hbV9zeW5jX2luZF9wdHItPnJvYW1lZFZkZXZJZCk7CisJQ0RGX1RSQUNFX0hFWF9EVU1QKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCXJvYW1fc3luY19pbmRfcHRyLT5ic3NJZCwgNik7CisJc2Vzc2lvbl9wdHIgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzX2lkeChwTWFjLAorCQkJcm9hbV9zeW5jX2luZF9wdHItPnJvYW1lZFZkZXZJZCk7CisJaWYgKHNlc3Npb25fcHRyID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSIlczogTEZSMzpVbmFibGUgdG8gZmluZCBzZXNzaW9uIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCS8qIE5vdGhpbmcgdG8gYmUgZG9uZSBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgaW4gU1RBIG1vZGUgKi8KKwlpZiAoIUxJTV9JU19TVEFfUk9MRShzZXNzaW9uX3B0cikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkic2Vzc2lvbiBpcyBub3QgaW4gU1RBIG1vZGUiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhsaW1fcm9hbV9maWxsX2Jzc19kZXNjcihwTWFjLAorCQkJCQlyb2FtX3N5bmNfaW5kX3B0cikpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIkxGUjM6JXM6RmFpbGVkIHRvIGZpbGwgQnNzIERlc2NyIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWJzc19kZXNjX3B0ciA9IHJvYW1fc3luY19pbmRfcHRyLT5ic3NfZGVzY19wdHI7CisJZnRfc2Vzc2lvbl9wdHIgPSBwZV9jcmVhdGVfc2Vzc2lvbihwTWFjLCBic3NfZGVzY19wdHItPmJzc0lkLAorCQkJCSZzZXNzaW9uX2lkLCBwTWFjLT5saW0ubWF4U3RhdGlvbiwKKwkJCQllU0lSX0lORlJBU1RSVUNUVVJFX01PREUpOworCWlmIChmdF9zZXNzaW9uX3B0ciA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSJMRlIzOiBTZXNzaW9uIENhbid0IGJlIGNyZWF0ZWQgZm9yIG5ldyBBUCBkdXJpbmcgUm9hbSBTeW5jaCIpOworCQlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgYnNzX2Rlc2NfcHRyLT5ic3NJZCwgTE9HRSk7CisJCXJldHVybjsKKwl9CisJZnRfc2Vzc2lvbl9wdHItPnBlU2Vzc2lvbklkID0gc2Vzc2lvbl9pZDsKKwlzaXJfY29weV9tYWNfYWRkcihmdF9zZXNzaW9uX3B0ci0+c2VsZk1hY0FkZHIsIHNlc3Npb25fcHRyLT5zZWxmTWFjQWRkcik7CisJc2lyX2NvcHlfbWFjX2FkZHIoZnRfc2Vzc2lvbl9wdHItPmxpbVJlQXNzb2Nic3NJZCwgYnNzX2Rlc2NfcHRyLT5ic3NJZCk7CisJZnRfc2Vzc2lvbl9wdHItPmJzc1R5cGUgPSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREU7CisJLyoqCisJICogU2V0IGJSb2FtU3luY2hJblByb2dyZXNzIGhlcmUgc2luY2UgdGhpcyBzZXNzaW9uIGlzCisJICpzcGVjaWZpYyB0byByb2FtIHN5bmNoIGluZGljYXRpb24uIFRoaXMgZmxhZyB3aWxsCisJICpsYXRlciBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgTEZSMyB3aXRoIExGUjIgaW4gTElNCisJICoqLworCWZ0X3Nlc3Npb25fcHRyLT5iUm9hbVN5bmNoSW5Qcm9ncmVzcyA9IHRydWU7CisKKwlpZiAoZnRfc2Vzc2lvbl9wdHItPmJzc1R5cGUgPT0gZVNJUl9JTkZSQVNUUlVDVFVSRV9NT0RFKSB7CisJCWZ0X3Nlc3Npb25fcHRyLT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9TVEFfUk9MRTsKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkiTEZSMzpJbnZhbGlkIGJzcyB0eXBlIik7CisJCXJldHVybjsKKwl9CisJZnRfc2Vzc2lvbl9wdHItPmxpbVByZXZTbWVTdGF0ZSA9IGZ0X3Nlc3Npb25fcHRyLT5saW1TbWVTdGF0ZTsKKwlmdF9zZXNzaW9uX3B0ci0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkiTEZSMzolczpjcmVhdGVkIHNlc3Npb24gKCVwKSB3aXRoIGlkID0gJWQiLAorCQkJX19mdW5jX18sIGZ0X3Nlc3Npb25fcHRyLCBmdF9zZXNzaW9uX3B0ci0+cGVTZXNzaW9uSWQpOworCS8qIFVwZGF0ZSB0aGUgUmVBc3NvYyBCU1NJRCBvZiB0aGUgY3VycmVudCBzZXNzaW9uICovCisJc2lyX2NvcHlfbWFjX2FkZHIoc2Vzc2lvbl9wdHItPmxpbVJlQXNzb2Nic3NJZCwgYnNzX2Rlc2NfcHRyLT5ic3NJZCk7CisJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHNlc3Npb25fcHRyLT5saW1SZUFzc29jYnNzSWQsIExPRzIpOworCisJLyogUHJlcGFyZSB0aGUgc2Vzc2lvbiByaWdodCBub3cgd2l0aCBhcyBtdWNoIGFzIHBvc3NpYmxlICovCisJbGltX2ZpbGxfZnRfc2Vzc2lvbihwTWFjLCBic3NfZGVzY19wdHIsIGZ0X3Nlc3Npb25fcHRyLCBzZXNzaW9uX3B0cik7CisJbGltX2Z0X3ByZXBhcmVfYWRkX2Jzc19yZXEocE1hYywgZmFsc2UsIGZ0X3Nlc3Npb25fcHRyLCBic3NfZGVzY19wdHIpOworCW1taF9tc2cudHlwZSA9CisJCXJvYW1fc3luY19pbmRfcHRyLT5tZXNzYWdlVHlwZTsKKwkvKiBlV05JX1NNRV9ST0FNX09GRkxPQURfU1lOQ0hfSU5EICovCisJbW1oX21zZy5ib2R5cHRyID0gcm9hbV9zeW5jX2luZF9wdHI7CisJbW1oX21zZy5ib2R5dmFsID0gMDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCSJMRlIzOiVzOnNlbmRpbmcgZVdOSV9TTUVfUk9BTV9PRkZMT0FEX1NZTkNIX0lORCIsIF9fZnVuY19fKTsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taF9tc2csICBlUFJPVCk7Cit9CisjZW5kaWYKKwordWludDhfdCBsaW1faXNfYmVhY29uX21pc3Nfc2NlbmFyaW8odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcFJ4UGFja2V0SW5mbykKK3sKKwl0cFNpck1hY01nbXRIZHIgcEhkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0KKwkJcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsIHBIZHItPmJzc0lkLCAmc2Vzc2lvbklkKTsKKworCWlmIChwc2Vzc2lvbkVudHJ5ICYmIHBzZXNzaW9uRW50cnktPnBtbU9mZmxvYWRJbmZvLmJjbm1pc3MpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgbGltX2lzX3BrdF9jYW5kaWRhdGVfZm9yX2Ryb3AoKSAtIGRlY2lkZXMgd2hldGhlciB0byBkcm9wIHRoZSBmcmFtZSBvciBub3QKKworICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGVucXVldWluZyB0aGUgZnJhbWUgdG8gUEUgcXVldWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgIFRoaXMgcHJldmVudHMgdW5uZWNlc3NhcnkgZnJhbWVzIGdldHRpbmcgaW50byBQRSBRdWV1ZSBhbmQgZHJvcHMgdGhlbSByaWdodCBhd2F5LgorICAgRnJhbWVzIHdpbGwgYmUgZHJvcGVkIGluIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW9zOgorCisgICAtIEluIFNjYW4gU3RhdGUsIGRyb3AgdGhlIGZyYW1lcyB3aGljaCBhcmUgbm90IG1hcmtlZCBhcyBzY2FuIGZyYW1lcworICAgLSBJbiBub24tU2NhbiBzdGF0ZSwgZHJvcCB0aGUgZnJhbWVzIHdoaWNoIGFyZSBtYXJrZWQgYXMgc2NhbiBmcmFtZXMuCisgICAtIERyb3AgSU5GUkEgQmVhY29ucyBhbmQgUHJvYmUgUmVzcG9uc2VzIGluIElCU1MgTW9kZQorICAgLSBEcm9wIHRoZSBQcm9iZSBSZXF1ZXN0IGluIElCU1MgbW9kZSwgaWYgU1RBIGRpZCBub3Qgc2VuZCBvdXQgdGhlIGxhc3QgYmVhY29uCisKKyAgIFxwYXJhbSBwTWFjIC0gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAgIFxyZXR1cm4gLSBub25lCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3RNZ210RnJtRHJvcFJlYXNvbiBsaW1faXNfcGt0X2NhbmRpZGF0ZV9mb3JfZHJvcCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sCisJCQkJCQkgdWludDMyX3Qgc3ViVHlwZSkKK3sKKwl1aW50MzJfdCBmcmFtZWxlbjsKKwl1aW50OF90ICpwQm9keTsKKwl0U2lyTWFjQ2FwYWJpbGl0eUluZm8gY2FwYWJpbGl0eUluZm87CisJdHBTaXJNYWNNZ210SGRyIHBIZHIgPSBOVUxMOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSBOVUxMOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCisJLyoKKwkgKgorCSAqIEluIHNjYW4gbW9kZSwgZHJvcCBvbmx5IEJlYWNvbi9Qcm9iZSBSZXNwb25zZSB3aGljaCBhcmUgTk9UIG1hcmtlZCBhcyBzY2FuLWZyYW1lcy4KKwkgKiBJbiBub24tc2NhbiBtb2RlLCBkcm9wIG9ubHkgQmVhY29uL1Byb2JlIFJlc3BvbnNlIHdoaWNoIGFyZSBtYXJrZWQgYXMgc2NhbiBmcmFtZXMuCisJICogQWxsb3cgb3RoZXIgbWdtdCBmcmFtZXMsIHRoZXkgbXVzdCBiZSBmcm9tIG91ciBvd24gQVAsIGFzIHdlIGRvbid0IGFsbG93CisJICogb3RoZXIgdGhhbiBiZWFjb25zIG9yIHByb2JlIHJlc3BvbnNlcyBpbiBzY2FuIHN0YXRlLgorCSAqLworCWlmICgoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQkVBQ09OKSB8fAorCSAgICAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfUFJPQkVfUlNQKSkgeworCQlpZiAobGltX2lzX2JlYWNvbl9taXNzX3NjZW5hcmlvKHBNYWMsIHBSeFBhY2tldEluZm8pKSB7CisJCQlNVFJBQ0UobWFjX3RyYWNlCisJCQkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX0lORk9fTE9HLCAwLAorCQkJCSAgICAgICBlTE9HX05PRFJPUF9NSVNTRURfQkVBQ09OX1NDRU5BUklPKSk7CisJCQlyZXR1cm4gZU1HTVRfRFJPUF9OT19EUk9QOworCQl9CisJCWlmIChsaW1faXNfc3lzdGVtX2luX3NjYW5fc3RhdGUocE1hYykpIHsKKwkJCXJldHVybiBlTUdNVF9EUk9QX05PX0RST1A7CisJCX0gZWxzZSBpZiAoV01BX0lTX1JYX0lOX1NDQU4ocFJ4UGFja2V0SW5mbykpIHsKKwkJCXJldHVybiBlTUdNVF9EUk9QX1NDQU5fTU9ERV9GUkFNRTsKKwkJfSBlbHNlIHsKKwkJCS8qIEJlYWNvbnMgYW5kIHByb2JlIHJlc3BvbnNlcyBjYW4gY29tZSBpbiBhbnkgdGltZQorCQkJICogYmVjYXVzZSBvZiBwYXJhbGxlbCBzY2Fucy4gRG9uJ3QgZHJvcCB0aGVtLgorCQkJICovCisJCQlyZXR1cm4gZU1HTVRfRFJPUF9OT19EUk9QOworCQl9CisJfQorCisJaWYgKChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9ERUFVVEggfHwKKwkJc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfRElTQVNTT0MpICYmCisJCWxpbV9pc19kZWF1dGhfZGlhc3NvY19mb3JfZHJvcChwTWFjLCBwUnhQYWNrZXRJbmZvKSkKKwkJcmV0dXJuIGVNR01UX0RST1BfU1BVUklPVVNfRlJBTUU7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJaWYgKChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9BU1NPQ19SRVEgfHwKKwkJc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfUkVBU1NPQ19SRVEpICYmCisJCWxpbV9pc19hc3NvY19yZXFfZm9yX2Ryb3AocE1hYywgcFJ4UGFja2V0SW5mbykpCisJCXJldHVybiBlTUdNVF9EUk9QX1NQVVJJT1VTX0ZSQU1FOworI2VuZGlmCisKKwlmcmFtZWxlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbyk7CisJcEJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKworCS8qIERyb3AgSU5GUkEgQmVhY29ucyBhbmQgUHJvYmUgUmVzcG9uc2VzIGluIElCU1MgTW9kZSAqLworCWlmICgoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQkVBQ09OKSB8fAorCSAgICAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfUFJPQkVfUlNQKSkgeworCQkvKiBkcm9wIHRoZSBmcmFtZSBpZiBsZW5ndGggaXMgbGVzcyB0aGFuIDEyICovCisJCWlmIChmcmFtZWxlbiA8IExJTV9NSU5fQkNOX1BSX0xFTkdUSCkKKwkJCXJldHVybiBlTUdNVF9EUk9QX0lOVkFMSURfU0laRTsKKworCQkqKCh1aW50MTZfdCAqKSAmY2FwYWJpbGl0eUluZm8pID0KKwkJCXNpcl9yZWFkX3UxNihwQm9keSArIExJTV9CQ05fUFJfQ0FQQUJJTElUWV9PRkZTRVQpOworCisJCS8qIE5vdGUgc3VyZSBpZiB0aGlzIGlzIHN1ZmZpY2llbnQsIGJhc2ljYWxseSB0aGlzIGNvbmRpdGlvbiBhbGxvd3MgYWxsIHByb2JlIHJlc3BvbnNlcyBhbmQKKwkJICogICBiZWFjb25zIGZyb20gYW4gaW5mcmFzdHJ1Y3R1cmUgbmV0d29yaworCQkgKi8KKwkJaWYgKCFjYXBhYmlsaXR5SW5mby5pYnNzKQorCQkJcmV0dXJuIGVNR01UX0RST1BfTk9fRFJPUDsKKworCQkvKiBUaGlzIGNhbiBiZSBlbmhhbmNlZCB0byBldmVuIGNoZWNrIHRoZSBTU0lEIGJlZm9yZSBkZWNpZGluZyB0byBlbnF1ZSB0aGUgZnJhbWUuICovCisJCWlmIChjYXBhYmlsaXR5SW5mby5lc3MpCisJCQlyZXR1cm4gZU1HTVRfRFJPUF9JTkZSQV9CQ05fSU5fSUJTUzsKKwl9IGVsc2UgaWYgKChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpICYmCisJCSAgICghV01BX0dFVF9SWF9CRUFDT05fU0VOVChwUnhQYWNrZXRJbmZvKSkpIHsKKwkJcEhkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKwkJcHNlc3Npb25FbnRyeSA9CisJCQlwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywgcEhkci0+YnNzSWQsICZzZXNzaW9uSWQpOworCQlpZiAoKHBzZXNzaW9uRW50cnkgJiYgIUxJTV9JU19JQlNTX1JPTEUocHNlc3Npb25FbnRyeSkpIHx8CisJCSAgICAoIXBzZXNzaW9uRW50cnkpKQorCQkJcmV0dXJuIGVNR01UX0RST1BfTk9fRFJPUDsKKworCQkvKiBEcm9wIHRoZSBQcm9iZSBSZXF1ZXN0IGluIElCU1MgbW9kZSwgaWYgU1RBIGRpZCBub3Qgc2VuZCBvdXQgdGhlIGxhc3QgYmVhY29uICovCisJCS8qIEluIElCU1MsIHRoZSBub2RlIHdoaWNoIHNlbmRzIG91dCB0aGUgYmVhY29uLCBpcyBzdXBwb3NlZCB0byByZXNwb25kIHRvIFByb2JlUmVxICovCisJCXJldHVybiBlTUdNVF9EUk9QX05PVF9MQVNUX0lCU1NfQkNOOworCX0KKworCXJldHVybiBlTUdNVF9EUk9QX05PX0RST1A7Cit9CisKK0NERl9TVEFUVVMgcGVfYWNxdWlyZV9nbG9iYWxfbG9jayh0QW5pU2lyTGltICpwc1BlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCisJaWYgKHBzUGUpIHsKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgIChjZGZfbXV0ZXhfYWNxdWlyZSgmcHNQZS0+bGtQZUdsb2JhbExvY2spKSkgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgcGVfcmVsZWFzZV9nbG9iYWxfbG9jayh0QW5pU2lyTGltICpwc1BlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCWlmIChwc1BlKSB7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJCSAgICAoY2RmX211dGV4X3JlbGVhc2UoJnBzUGUtPmxrUGVHbG9iYWxMb2NrKSkpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9hc3NvY191dGlscy5jIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fYXNzb2NfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTY4MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fYXNzb2NfdXRpbHMuYwpAQCAtMCwwICsxLDUxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgbGltX2Fzc29jX3V0aWxzLmNjIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucworICogTElNIHVzZXMgd2hpbGUgcHJvY2Vzc2luZyAoUmUpIEFzc29jaWF0aW9uIG1lc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMDUvMjYvMTAgICAgICAganMgICAgICAgICAgICAgV1BBIGhhbmRsaW5nIGluIChSZSlBc3NvYyBmcmFtZXMKKyAqCisgKi8KKworI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAid25pX2FwaS5oIgorI2luY2x1ZGUgInNpcl9jb21tb24uaCIKKworI2luY2x1ZGUgInduaV9jZmcuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlY3VyaXR5X3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Nlcl9kZXNfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc3RhX2hhc2hfYXBpLmgiCisjaW5jbHVkZSAibGltX2FkbWl0X2NvbnRyb2wuaCIKKyNpbmNsdWRlICJsaW1fc2VuZF9tZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbV9pYnNzX3BlZXJfbWdtdC5oIgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSAibGltX2Z0X2RlZnMuaCIKKyNlbmRpZgorI2luY2x1ZGUgImxpbV9zZXNzaW9uLmgiCisKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKworLyoKKyAqIGZpbGwgdXAgdGhlIHJhdGUgaW5mbyBwcm9wZXJseSBiYXNlZCBvbiB3aGF0IGlzIGFjdHVhbGx5IHN1cHBvcnRlZCBieSB0aGUgcGVlcgorICogVEJEIFRCRCBUQkQKKyAqLwordm9pZAorbGltX2ZpbGxfc3VwcG9ydGVkX3JhdGVzX2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgIHRwRHBoSGFzaE5vZGUgcFN0YSwKKwkJCSAgICAgIHRwU2lyU3VwcG9ydGVkUmF0ZXMgcFJhdGVzLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCS8qIHBTdGEgd2lsbCBiZSBOVUxMIGZvciBzZWxmIGVudHJ5LCBzbyBnZXQgdGhlIG9wUmF0ZU1vZGUgYmFzZWQgb24gdGhlIHNlbGYgbW9kZS4gKi8KKwkvKiBGb3IgdGhlIHBlZXIgZW50cnkgZ2V0IGl0IGZyb20gdGhlIHBlZXIgQ2FwYWJpbGl0aWVzIHByZXNlbnQgaW4gaGFzaCB0YWJsZSAqLworCWlmIChwU3RhID09IE5VTEwpCisJCXBSYXRlcy0+b3BSYXRlTW9kZSA9CisJCQlsaW1fZ2V0X3N0YV9yYXRlX21vZGUoKHVpbnQ4X3QpIHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSk7CisJZWxzZQorCQlwUmF0ZXMtPm9wUmF0ZU1vZGUgPQorCQkJbGltX2dldF9zdGFfcGVlcl90eXBlKHBNYWMsIHBTdGEsIHBzZXNzaW9uRW50cnkpOworCit9CisKKy8qKgorICogbGltX2NtcF9zX3NpZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdmFyaW91cyBwbGFjZXMgd2l0aGluIExJTSBjb2RlCisgKiB0byBkZXRlcm1pbmUgd2hldGhlciByZWNlaXZlZCBTU2lkIGlzIHNhbWUgYXMgU1NJRCBpbiB1c2UuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgKnByeFNTaWQgLSBwb2ludGVyIHRvIFNTSUQgc3RydWN0dXJlCisgKgorICogQHJldHVybiBzdGF0dXMgLSB0cnVlIGZvciBTU0lEIG1hdGNoIGVsc2UgZmFsc2UuCisgKi8KKwordWludDhfdAorbGltX2NtcF9zX3NpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjU1NpZCAqcHJ4U1NpZCwKKwkgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCisJaWYgKGNkZl9tZW1fY29tcGFyZQorCQkgICAgKCh1aW50OF90ICopIHByeFNTaWQsICh1aW50OF90ICopICZwc2Vzc2lvbkVudHJ5LT5zc0lkLAorCQkgICAgKHVpbnQ4X3QpIChwc2Vzc2lvbkVudHJ5LT5zc0lkLmxlbmd0aCArIDEpKSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7CisKK30gLyoqKioqKiBlbmQgbGltX2NtcF9zX3NpZCgpICoqKioqKi8KKworLyoqCisgKiBsaW1fY29tcGFyZV9jYXBhYmlsaXRpZXMoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBBc3NvY2lhdGlvbi9SZWFzc29jaWF0aW9uCisgKiBmcmFtZSBoYW5kbGluZyB0byBkZXRlcm1pbmUgd2hldGhlciByZWNlaXZlZCBjYXBhYmlsaXRpZXMKKyAqIG1hdGNoIHdpdGggbG9jYWwgY2FwYWJpbGl0aWVzIG9yIG5vdC4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgICAgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBBc3NvY1JlcSAgICAtIFBvaW50ZXIgdG8gcmVjZWl2ZWQgQXNzb2MgUmVxIGZyYW1lCisgKiBAcGFyYW0gIHBMb2NhbENhcGFicyAtIFBvaW50ZXIgdG8gbG9jYWwgY2FwYWJpbGl0aWVzCisgKgorICogQHJldHVybiBzdGF0dXMgLSB0cnVlIGZvciBDYXBhYmlsaXRpdHkgbWF0Y2ggZWxzZSBmYWxzZS4KKyAqLworCit1aW50OF90CitsaW1fY29tcGFyZV9jYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSB0U2lyQXNzb2NSZXEgKnBBc3NvY1JlcSwKKwkJCSB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gKnBMb2NhbENhcGFicywKKwkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQzMl90IHZhbDsKKworCWlmICgoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkgICAgIExJTV9JU19CVF9BTVBfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgJiYKKwkgICAgKHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uaWJzcykpIHsKKwkJLyogUmVxdWVzdGluZyBTVEEgYXNzZXJ0aW5nIElCU1MgY2FwYWJpbGl0eS4gKi8KKwkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIlJlcXVlc3RpbmcgU1RBIGFzc2VydGluZyBJQlNTIGNhcGFiaWxpdHkiKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJLyogQ29tcGFyZSBDRiBjYXBhYmlsaXRpZXMgKi8KKwlpZiAocEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5jZlBvbGxhYmxlIHx8CisJICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uY2ZQb2xsUmVxKSB7CisJCS8qIEFQIGRvZXMgbm90IHN1cHBvcnQgUENGIGZ1bmN0aW9uYWxpdHkgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIiBBUCBkb2VzIG5vdCBzdXBwb3J0IFBDRiBmdW5jdGlvbmFsaXR5IikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qIENvbXBhcmUgc2hvcnQgcHJlYW1ibGUgY2FwYWJpbGl0eSAqLworCWlmIChwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnNob3J0UHJlYW1ibGUgJiYKKwkgICAgKHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZSAhPQorCSAgICAgcExvY2FsQ2FwYWJzLT5zaG9ydFByZWFtYmxlKSkgeworCQkvKiBBbGxvd2luZyBhIFNUQSByZXF1ZXN0aW5nIHNob3J0IHByZWFtYmxlIHdoaWxlICovCisJCS8qIEFQIGRvZXMgbm90IHN1cHBvcnQgaXQgKi8KKwl9CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsICJRb1MgaW4gQXNzb2NSZXE6ICVkLCBsb2NhbCBjYXBhYnMgcW9zOiAlZCIsCisJCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8ucW9zLCBwTG9jYWxDYXBhYnMtPnFvcyk7CisKKwkvKiBDb21wYXJlIFFvUyBjYXBhYmlsaXR5ICovCisJaWYgKHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8ucW9zICYmCisJICAgIChwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnFvcyAhPSBwTG9jYWxDYXBhYnMtPnFvcykpIHsKKwkJLypUZW1wb3JhcnkgaGFjayBmb3IgVVBGIHRvIHNraXAgMTFlIGNhcGFiaWxpdHkgY2hlY2sgaW4gb3JkZXIgdG8gaW50ZXJvcCB3aXRoCisJCSAgIENTUiAtIHByb3BlciBmaXggbmVlZHMgdG8gYmUgcHV0IGluIHBsYWNlICovCisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCUZMCisJCQkJKCJSZWNlaXZlZCB1bm1hdGNoZWQgUU9TIGJ1dCBjZmcgdG8gc3VwcHJlc3MgLSBjb250aW51aW5nIikpOworCX0KKworCS8qCisJICogSWYgQVAgc3VwcG9ydHMgc2hvcnRTbG90IGFuZCBpZiBhcHBsZSB1c2VyIGhhcworCSAqIGVuZm9yY2VkIGFzc29jaWF0aW9uIG9ubHkgZnJvbSBzaG9ydFNsb3Qgc3RhdGlvbiwKKwkgKiB0aGVuIEFQIG11c3QgcmVqZWN0IGFueSBzdGF0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydAorCSAqIHNob3J0U2xvdAorCSAqLworCWlmICgoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkgICAgIExJTV9JU19CVF9BTVBfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgJiYKKwkgICAgKHBMb2NhbENhcGFicy0+c2hvcnRTbG90VGltZSA9PSAxKSkgeworCQlpZiAod2xhbl9jZmdfZ2V0X2ludAorCQkJICAgIChwTWFjLCBXTklfQ0ZHX0FDQ0VQVF9TSE9SVF9TTE9UX0FTU09DX09OTFksCisJCQkgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwKKwkJCQkJKCJlcnJvciBnZXR0aW5nIFdOSV9DRkdfRk9SQ0VfU0hPUlRfU0xPVF9BU1NPQ19PTkxZICIpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAodmFsKSB7CisJCQlpZiAocEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5zaG9ydFNsb3RUaW1lICE9CisJCQkgICAgcExvY2FsQ2FwYWJzLT5zaG9ydFNsb3RUaW1lKSB7CisJCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTAorCQkJCQkJKCJBUCByZWplY3RzIGFzc29jaWF0aW9uIGFzIHN0YXRpb24gZG9lc250IHN1cHBvcnQgc2hvcnRzbG90IHRpbWUiKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9IC8qKioqKiogZW5kIGxpbV9jb21wYXJlX2NhcGFiaWxpdGllcygpICoqKioqKi8KKworLyoqCisgKiBsaW1fY2hlY2tfcnhfYmFzaWNfcmF0ZXMoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBBc3NvY2lhdGlvbi9SZWFzc29jaWF0aW9uCisgKiBmcmFtZSBoYW5kbGluZyB0byBkZXRlcm1pbmUgd2hldGhlciByZWNlaXZlZCByYXRlcyBpbgorICogQXNzb2MvUmVhc3NvYyByZXF1ZXN0IGZyYW1lcyBpbmNsdWRlIGFsbCBCU1MgYmFzaWMgcmF0ZXMKKyAqIG9yIG5vdC4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICByeFJhdGVTZXQgLSBwb2ludGVyIHRvIFNTSUQgc3RydWN0dXJlCisgKgorICogQHJldHVybiBzdGF0dXMgLSB0cnVlIGlmIEFMTCBCU1MgYmFzaWMgcmF0ZXMgYXJlIHByZXNlbnQgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIHJhdGVzZXQgZWxzZSBmYWxzZS4KKyAqLworCit1aW50OF90CitsaW1fY2hlY2tfcnhfYmFzaWNfcmF0ZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY1JhdGVTZXQgcnhSYXRlU2V0LAorCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpck1hY1JhdGVTZXQgKnBSYXRlU2V0LCBiYXNpY1JhdGU7CisJdWludDhfdCBpLCBqLCBrLCBtYXRjaDsKKworCXBSYXRlU2V0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJNYWNSYXRlU2V0KSk7CisJaWYgKE5VTEwgPT0gcFJhdGVTZXQpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNhbGwgdG8gQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBSQVRFU0VUIikpOworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBDb3B5IG9wZXJhdGlvbmFsIHJhdGUgc2V0IGZyb20gc2Vzc2lvbiBFbnRyeSAqLworCWNkZl9tZW1fY29weShwUmF0ZVNldC0+cmF0ZSwgKHBzZXNzaW9uRW50cnktPnJhdGVTZXQucmF0ZSksCisJCSAgICAgcHNlc3Npb25FbnRyeS0+cmF0ZVNldC5udW1SYXRlcyk7CisKKwlwUmF0ZVNldC0+bnVtUmF0ZXMgPSBwc2Vzc2lvbkVudHJ5LT5yYXRlU2V0Lm51bVJhdGVzOworCisJLyogRXh0cmFjdCBCU1MgYmFzaWMgcmF0ZXNldCBmcm9tIG9wZXJhdGlvbmFsIHJhdGVzZXQgKi8KKwlmb3IgKGkgPSAwLCBqID0gMDsKKwkgICAgICgoaSA8IHBSYXRlU2V0LT5udW1SYXRlcykgJiYgKGkgPCBTSVJfTUFDX1JBVEVTRVRfRUlEX01BWCkpOyBpKyspIHsKKwkJaWYgKChwUmF0ZVNldC0+cmF0ZVtpXSAmIDB4ODApID09IDB4ODApIHsKKwkJCS8qIG1zYiBpcyBzZXQsIHNvIHRoaXMgaXMgYSBiYXNpYyByYXRlICovCisJCQliYXNpY1JhdGUucmF0ZVtqKytdID0gcFJhdGVTZXQtPnJhdGVbaV07CisJCX0KKwl9CisKKwkvKgorCSAqIEZvciBlYWNoIEJTUyBiYXNpYyByYXRlLCBmaW5kIGlmIGl0IGlzIHByZXNlbnQgaW4gdGhlCisJICogcmVjZWl2ZWQgcmF0ZXNldC4KKwkgKi8KKwlmb3IgKGsgPSAwOyBrIDwgajsgaysrKSB7CisJCW1hdGNoID0gMDsKKwkJZm9yIChpID0gMDsKKwkJICAgICAoKGkgPCByeFJhdGVTZXQubnVtUmF0ZXMpCisJCSAgICAgICYmIChpIDwgU0lSX01BQ19SQVRFU0VUX0VJRF9NQVgpKTsgaSsrKSB7CisJCQlpZiAoKHJ4UmF0ZVNldC5yYXRlW2ldIHwgMHg4MCkgPT0gYmFzaWNSYXRlLnJhdGVba10pCisJCQkJbWF0Y2ggPSAxOworCQl9CisKKwkJaWYgKCFtYXRjaCkgeworCQkJLyogRnJlZSB1cCBtZW1vcnkgYWxsb2NhdGVkIGZvciByYXRlc2V0ICovCisJCQljZGZfbWVtX2ZyZWUoKHVpbnQ4X3QgKikgcFJhdGVTZXQpOworCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKiBGcmVlIHVwIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHJhdGVzZXQgKi8KKwljZGZfbWVtX2ZyZWUoKHVpbnQ4X3QgKikgcFJhdGVTZXQpOworCisJcmV0dXJuIHRydWU7Cit9IC8qKioqKiogZW5kIGxpbV9jaGVja19yeF9iYXNpY19yYXRlcygpICoqKioqKi8KKworLyoqCisgKiBsaW1fY2hlY2tfbWNzX3NldCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIEFzc29jaWF0aW9uL1JlYXNzb2NpYXRpb24KKyAqIGZyYW1lIGhhbmRsaW5nIHRvIGRldGVybWluZSB3aGV0aGVyIHJlY2VpdmVkIE1DUyByYXRlcyBpbgorICogQXNzb2MvUmVhc3NvYyByZXF1ZXN0IGZyYW1lcyBpbmNsdWRlcyBhbGwgQmFzaWMgTUNTIFJhdGUgU2V0IG9yIG5vdC4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBzdXBwb3J0ZWRNQ1NTZXQgLSBwb2ludGVyIHRvIFN1cHBvcnRlZCBNQ1MgUmF0ZSBTZXQKKyAqCisgKiBAcmV0dXJuIHN0YXR1cyAtIHRydWUgaWYgQUxMIE1DUyBCYXNpYyBSYXRlIFNldCByYXRlcyBhcmUgcHJlc2VudCBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgcmF0ZXNldCBlbHNlIGZhbHNlLgorICovCisKK3VpbnQ4X3QgbGltX2NoZWNrX21jc19zZXQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqc3VwcG9ydGVkTUNTU2V0KQoreworCXVpbnQ4X3QgYmFzaWNNQ1NTZXRbU0laRV9PRl9CQVNJQ19NQ1NfU0VUXSA9IHsgMCB9OworCXVpbnQzMl90IGNmZ0xlbiA9IDA7CisJdWludDhfdCBpOworCXVpbnQ4X3QgdmFsaWRCeXRlczsKKwl1aW50OF90IGxhc3RCeXRlTUNTTWFzayA9IDB4MWY7CisKKwljZmdMZW4gPSBXTklfQ0ZHX0JBU0lDX01DU19TRVRfTEVOOworCWlmICh3bGFuX2NmZ19nZXRfc3RyKHBNYWMsIFdOSV9DRkdfQkFTSUNfTUNTX1NFVCwKKwkJCSAgICAgKHVpbnQ4X3QgKikgYmFzaWNNQ1NTZXQsCisJCQkgICAgICh1aW50MzJfdCAqKSAmY2ZnTGVuKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJLyogLyBDb3VsZCBub3QgZ2V0IEJhc2ljIE1DUyByYXRlc2V0IGZyb20gQ0ZHLiBMb2cgZXJyb3IuICovCisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBCYXNpYyBNQ1MgcmF0ZXNldCIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXZhbGlkQnl0ZXMgPSBWQUxJRF9NQ1NfU0laRSAvIDg7CisKKwkvKiBjaGVjayBpZiBhbGwgdGhlIEJhc2ljIE1DUyBCaXRzIGFyZSBzZXQgaW4gc3VwcG9ydGVkIE1DUyBiaXRtYXAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmFsaWRCeXRlczsgaSsrKSB7CisJCWlmICgoYmFzaWNNQ1NTZXRbaV0gJiBzdXBwb3J0ZWRNQ1NTZXRbaV0pICE9IGJhc2ljTUNTU2V0W2ldKSB7CisJCQkvKiBMb2cgaXMgYXZhaWFibGUgaW4gY2FsbGluZyBmdW5jdGlvbiBpbiBmaWxlIGxpbV9wcm9jZXNzX2Fzc29jX3JlcV9mcmFtZS5jICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJRkwKKwkJCQkJKCJPbmUgb2YgQmFzaWMgTUNTIFNldCBSYXRlcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBTdGF0aW9uLiIpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8qIGNoZWNrIHRoZSBsYXN0IDUgYml0cyBvZiB0aGUgdmFsaWQgTUNTIGJpdG1hcCAqLworCWlmICgoKGJhc2ljTUNTU2V0W2ldICYgbGFzdEJ5dGVNQ1NNYXNrKSAmCisJICAgICAoc3VwcG9ydGVkTUNTU2V0W2ldICYgbGFzdEJ5dGVNQ1NNYXNrKSkgIT0KKwkgICAgKGJhc2ljTUNTU2V0W2ldICYgbGFzdEJ5dGVNQ1NNYXNrKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTAorCQkJCSgiT25lIG9mIEJhc2ljIE1DUyBTZXQgUmF0ZXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgU3RhdGlvbi4iKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBTRUNVUklUWV9TVUlURV9UWVBFX01BU0sgMHhGRgorI2RlZmluZSBTRUNVUklUWV9TVUlURV9UWVBFX1dFUDQwIDB4MQorI2RlZmluZSBTRUNVUklUWV9TVUlURV9UWVBFX1RLSVAgMHgyCisjZGVmaW5lIFNFQ1VSSVRZX1NVSVRFX1RZUEVfQ0NNUCAweDQKKyNkZWZpbmUgU0VDVVJJVFlfU1VJVEVfVFlQRV9XRVAxMDQgMHg0CisKKy8qKgorICogbGltX2NoZWNrX3J4X3Jzbl9pZV9tYXRjaCgpLSB2YWxpZGF0ZSByZWNlaXZlZCByc24gaWUgd2l0aCBzdXBwb3J0ZWQgY2lwaGVyCisgKiAgICAgIHN1aXRlcy4KKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgKiBAcnhfcnNuX2llOiByZWNlaXZlZCByc24gSUUKKyAqIEBzZXNzaW9uX2VudHJ5OiBwZSBzZXNzaW9uIGVudHJ5CisgKiBAc3RhX2lzX2h0OiBwZWVyIHN0YXRpb24gSFQgY2FwYWJpbGl0eQorICogQHBtZl9jb25uZWN0aW9uOiBzZXQgdG8gdHJ1ZSBpZiB0aGlzIGlzIHBtZiBjb25uZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIEFzc29jaWF0aW9uL1JlYXNzb2NpYXRpb24KKyAqIGZyYW1lIGhhbmRsaW5nIHRvIGRldGVybWluZSB3aGV0aGVyIHJlY2VpdmVkIFJTTiBpbgorICogQXNzb2MvUmVhc3NvYyByZXF1ZXN0IGZyYW1lcyBpbmNsdWRlIHN1cHBvcnRlZCBjaXBoZXIgc3VpdGVzIG9yIG5vdC4KKyAqCisgKiBSZXR1cm46IGVTSVJfU1VDQ0VTUyBpZiBBTEwgQlNTIGJhc2ljIHJhdGVzIGFyZSBwcmVzZW50IGluIHRoZQorICogICAgICAgICAgICAgICAgICByZWNlaXZlZCByYXRlc2V0IGVsc2UgZmFpbHVyZSBzdGF0dXMuCisgKi8KKwordWludDhfdAorbGltX2NoZWNrX3J4X3Jzbl9pZV9tYXRjaCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0RG90MTFmSUVSU04gcnhfcnNuX2llLAorCQkJICB0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5LCB1aW50OF90IHN0YV9pc19odCwKKwkJCSAgYm9vbCAqcG1mX2Nvbm5lY3Rpb24pCit7CisJdERvdDExZklFUlNOICpyc25faWU7CisJdWludDhfdCBpLCBqLCBtYXRjaCwgb25seV9ub25faHRfY2lwaGVyID0gMTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJYm9vbCB3ZV9hcmVfcG1mX2NhcGFibGU7CisJYm9vbCB3ZV9yZXF1aXJlX3BtZjsKKwlib29sIHRoZXlfYXJlX3BtZl9jYXBhYmxlOworCWJvb2wgdGhleV9yZXF1aXJlX3BtZjsKKyNlbmRpZgorCisJLyogUlNOIElFIHNob3VsZCBiZSByZWNlaXZlZCBmcm9tIFBFICovCisJcnNuX2llID0gJnNlc3Npb25fZW50cnktPmdTdGFydEJzc1JTTkllOworCisJLyogQ2hlY2sgZ3JvdXB3aXNlIGNpcGhlciBzdWl0ZSAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocnhfcnNuX2llLmdwX2NpcGhlcl9zdWl0ZSk7IGkrKykKKwkJaWYgKHJzbl9pZS0+Z3BfY2lwaGVyX3N1aXRlW2ldICE9CisJCQkJIHJ4X3Jzbl9pZS5ncF9jaXBoZXJfc3VpdGVbaV0pIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMywKKwkJCQkgRkwoIkludmFsaWQgZ3JvdXB3aXNlIGNpcGhlciBzdWl0ZSIpKTsKKwkJCXJldHVybiBlU0lSX01BQ19JTlZBTElEX0dST1VQX0NJUEhFUl9TVEFUVVM7CisJCX0KKworCS8qCisJICogRm9yIGVhY2ggUGFpcndpc2UgY2lwaGVyIHN1aXRlIGNoZWNrIHdoZXRoZXIgd2Ugc3VwcG9ydAorCSAqIHJlY2VpdmVkIHBhaXJ3aXNlCisJICovCisJbWF0Y2ggPSAwOworCWZvciAoaSA9IDA7IGkgPCByeF9yc25faWUucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IHJzbl9pZS0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50OyBqKyspIHsKKwkJCWlmIChjZGZfbWVtX2NvbXBhcmUoJnJ4X3Jzbl9pZS5wd2lzZV9jaXBoZXJfc3VpdGVzW2ldLAorCQkJCSZyc25faWUtPnB3aXNlX2NpcGhlcl9zdWl0ZXNbal0sCisJCQkJc2l6ZW9mKHJzbl9pZS0+cHdpc2VfY2lwaGVyX3N1aXRlc1tqXSkpKSB7CisJCQkJbWF0Y2ggPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKChzdGFfaXNfaHQpCisjaWZkZWYgQU5JX0xJVFRMRV9CWVRFX0VORElBTgorCQkJJiYKKwkJCSgocnhfcnNuX2llLnB3aXNlX2NpcGhlcl9zdWl0ZXNbaV1bM10gJgorCQkJCSBTRUNVUklUWV9TVUlURV9UWVBFX01BU0spID09CisJCQkJCVNFQ1VSSVRZX1NVSVRFX1RZUEVfQ0NNUCkpCisjZWxzZQorCQkJJiYKKwkJCSgocnhfcnNuX2llLnB3aXNlX2NpcGhlcl9zdWl0ZXNbaV1bMF0gJgorCQkJCSBTRUNVUklUWV9TVUlURV9UWVBFX01BU0spID09CisJCQkJCVNFQ1VSSVRZX1NVSVRFX1RZUEVfQ0NNUCkpCisjZW5kaWYKKwkJCW9ubHlfbm9uX2h0X2NpcGhlciA9IDA7CisKKwl9CisKKwlpZiAoKCFtYXRjaCkgfHwgKChzdGFfaXNfaHQpICYmIG9ubHlfbm9uX2h0X2NpcGhlcikpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiSW52YWxpZCBwYWlyd2lzZSBjaXBoZXIgc3VpdGUiKSk7CisJCXJldHVybiBlU0lSX01BQ19JTlZBTElEX1BBSVJXSVNFX0NJUEhFUl9TVEFUVVM7CisJfQorCS8qCisJICogQ2hlY2sgUlNOIGNhcGFiaWxpdGllcworCSAqIEJpdCAwIG9mIEZpcnN0IEJ5dGUgLSBQcmVBdXRoZW50aWNhdGlvbiBDYXBhYmlsaXR5CisJICovCisJaWYgKCgocnhfcnNuX2llLlJTTl9DYXBbMF0gPj4gMCkgJiAweDEpID09IHRydWUpIHsKKwkJLyogdGhpcyBpcyBzdXBwb3J0ZWQgYnkgQVAgb25seSAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiSW52YWxpZCBSU04gaW5mb3JtYXRpb24gZWxlbWVudCBjYXBhYmlsaXRpZXMiKSk7CisJCXJldHVybiBlU0lSX01BQ19JTlZBTElEX1JTTl9JRV9DQVBBQklMSVRJRVNfU1RBVFVTOworCX0KKworCSpwbWZfY29ubmVjdGlvbiA9IGZhbHNlOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXdlX2FyZV9wbWZfY2FwYWJsZSA9IHNlc3Npb25fZW50cnktPnBMaW1TdGFydEJzc1JlcS0+cG1mQ2FwYWJsZTsKKwl3ZV9yZXF1aXJlX3BtZiA9IHNlc3Npb25fZW50cnktPnBMaW1TdGFydEJzc1JlcS0+cG1mUmVxdWlyZWQ7CisJdGhleV9hcmVfcG1mX2NhcGFibGUgPSAocnhfcnNuX2llLlJTTl9DYXBbMF0gPj4gNykgJiAweDE7CisJdGhleV9yZXF1aXJlX3BtZiA9IChyeF9yc25faWUuUlNOX0NhcFswXSA+PiA2KSAmIDB4MTsKKworCWlmICgodGhleV9yZXF1aXJlX3BtZiAmJiB0aGV5X2FyZV9wbWZfY2FwYWJsZSAmJiAhd2VfYXJlX3BtZl9jYXBhYmxlKSB8fAorCSAgICAod2VfcmVxdWlyZV9wbWYgJiYgIXRoZXlfYXJlX3BtZl9jYXBhYmxlKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiQXNzb2NpYXRpb24gZmFpbCwgcm9idXN0IG1hbmFnZW1lbnQgZnJhbWVzIHBvbGljeSIKKwkJCQkiIHZpb2xhdGlvbiB0aGV5X3JlcXVpcmVfcG1mID0lZCIKKwkJCQkiIHRoZXlBcmVQTUZDYXBhYmxlICVkIHdlQXJlUE1GQ2FwYWJsZSAlZCIKKwkJCQkiIHdlUmVxdWlyZVBNRiAlZCB0aGV5QXJlUE1GQ2FwYWJsZSAlZCIpLAorCQkJdGhleV9yZXF1aXJlX3BtZiwgdGhleV9hcmVfcG1mX2NhcGFibGUsCisJCQl3ZV9hcmVfcG1mX2NhcGFibGUsIHdlX3JlcXVpcmVfcG1mLAorCQkJdGhleV9hcmVfcG1mX2NhcGFibGUpOworCQlyZXR1cm4gZVNJUl9NQUNfUk9CVVNUX01HTVRfRlJBTUVTX1BPTElDWV9WSU9MQVRJT047CisJfQorCisJaWYgKHRoZXlfYXJlX3BtZl9jYXBhYmxlICYmIHdlX2FyZV9wbWZfY2FwYWJsZSkKKwkJKnBtZl9jb25uZWN0aW9uID0gdHJ1ZTsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIndlQXJlQ2FwYWJsZSAlZCwgd2VSZXF1aXJlICVkLCB0aGV5QXJlQ2FwYWJsZSAlZCwiCisJCQkiIHRoZXlSZXF1aXJlICVkLCBQTUZjb25uZWN0aW9uICVkIiksCisJCXdlX2FyZV9wbWZfY2FwYWJsZSwgd2VfcmVxdWlyZV9wbWYsIHRoZXlfYXJlX3BtZl9jYXBhYmxlLAorCQl0aGV5X3JlcXVpcmVfcG1mLCAqcG1mX2Nvbm5lY3Rpb24pOworI2VuZGlmCisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKioKKyAqIGxpbV9jaGVja19yeF93cGFfaWVfbWF0Y2goKSAtIHRvIGNoZWNrIHN1cHBvcnRlZCBjaXBoZXIgc3VpdGVzCisgKgorICogQG1hYzogcG9pbnRlciB0byBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICogQHJ4X3dwYWllOiBSZWNlaXZlZCBXUEEgSUUgaW4gKFJlKUFzc2NvIHJlcQorICogQHNlc3Npb25fZW50cnk6IHBvaW50ZXIgdG8gUEUgc2Vzc2lvbgorICogQHN0YV9pc19odDogcGVlciBzdGF0aW9uIGlzIEhUCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIEFzc29jaWF0aW9uL1JlYXNzb2NpYXRpb24KKyAqIGZyYW1lIGhhbmRsaW5nIHRvIGRldGVybWluZSB3aGV0aGVyIHJlY2VpdmVkIFJTTiBpbgorICogQXNzb2MvUmVhc3NvYyByZXF1ZXN0IGZyYW1lcyBpbmNsdWRlIHN1cHBvcnRlZCBjaXBoZXIgc3VpdGVzIG9yIG5vdC4KKyAqCisgKiBSZXR1cm46IFN1Y2Nlc3MgaWYgQUxMIEJTUyBiYXNpYyByYXRlcyBhcmUgcHJlc2VudCBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgcmF0ZXNldCBlbHNlIGZhaWx1cmUgc3RhdHVzLgorICovCisKK3VpbnQ4X3QKK2xpbV9jaGVja19yeF93cGFfaWVfbWF0Y2godHBBbmlTaXJHbG9iYWwgbWFjLCB0RG90MTFmSUVXUEEgcnhfd3BhaWUsCisJCQkgIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnksIHVpbnQ4X3Qgc3RhX2lzX2h0KQoreworCXREb3QxMWZJRVdQQSAqd3BhX2llOworCXVpbnQ4X3QgaSwgaiwgbWF0Y2gsIG9ubHlfbm9uX2h0X2NpcGhlciA9IDE7CisKKwkvKiBXUEEgSUUgc2hvdWxkIGJlIHJlY2VpdmVkIGZyb20gUEUgKi8KKwl3cGFfaWUgPSAmc2Vzc2lvbl9lbnRyeS0+Z1N0YXJ0QnNzV1BBSWU7CisKKwkvKiBDaGVjayBncm91cHdpc2UgY2lwaGVyIHN1aXRlICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAod3BhX2llLT5tdWx0aWNhc3RfY2lwaGVyW2ldICE9IHJ4X3dwYWllLm11bHRpY2FzdF9jaXBoZXJbaV0pIHsKKwkJCWxpbV9sb2cobWFjLCBMT0cxLAorCQkJCUZMKCJJbnZhbGlkIGdyb3Vwd2lzZSBjaXBoZXIgc3VpdGUiKSk7CisJCQlyZXR1cm4gZVNJUl9NQUNfSU5WQUxJRF9HUk9VUF9DSVBIRVJfU1RBVFVTOworCQl9CisJfQorCisJLyoKKwkgKiBGb3IgZWFjaCBQYWlyd2lzZSBjaXBoZXIgc3VpdGUgY2hlY2sgd2hldGhlciB3ZSBzdXBwb3J0CisJICogcmVjZWl2ZWQgcGFpcndpc2UKKwkgKi8KKwltYXRjaCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHJ4X3dwYWllLnVuaWNhc3RfY2lwaGVyX2NvdW50OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IHdwYV9pZS0+dW5pY2FzdF9jaXBoZXJfY291bnQ7IGorKykgeworCQkJaWYgKGNkZl9tZW1fY29tcGFyZShyeF93cGFpZS51bmljYXN0X2NpcGhlcnNbaV0sCisJCQkJCSAgICB3cGFfaWUtPnVuaWNhc3RfY2lwaGVyc1tqXSwgNCkpIHsKKwkJCQltYXRjaCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoKHN0YV9pc19odCkKKyNpZmRlZiBBTklfTElUVExFX0JZVEVfRU5ESUFOCisJCSAgICAmJgorCQkgICAgKChyeF93cGFpZS4KKwkJICAgICAgdW5pY2FzdF9jaXBoZXJzW2ldWzNdICYgU0VDVVJJVFlfU1VJVEVfVFlQRV9NQVNLKSA9PQorCQkgICAgIFNFQ1VSSVRZX1NVSVRFX1RZUEVfQ0NNUCkpCisjZWxzZQorCQkgICAgJiYKKwkJICAgICgocnhfd3BhaWUuCisJCSAgICAgIHVuaWNhc3RfY2lwaGVyc1tpXVswXSAmIFNFQ1VSSVRZX1NVSVRFX1RZUEVfTUFTSykgPT0KKwkJICAgICBTRUNVUklUWV9TVUlURV9UWVBFX0NDTVApKQorI2VuZGlmCisJCXsKKwkJCW9ubHlfbm9uX2h0X2NpcGhlciA9IDA7CisJCX0KKworCX0KKworCWlmICgoIW1hdGNoKSB8fCAoKHN0YV9pc19odCkgJiYgb25seV9ub25faHRfY2lwaGVyKSkgeworCQlsaW1fbG9nKG1hYywgTE9HMSwgRkwoIkludmFsaWQgcGFpcndpc2UgY2lwaGVyIHN1aXRlIikpOworCQlyZXR1cm4gZVNJUl9NQUNfQ0lQSEVSX1NVSVRFX1JFSkVDVEVEX1NUQVRVUzsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKioKKyAqIGxpbV9jbGVhbnVwX3J4X3BhdGgoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsZWFudXAgU1RBIHN0YXRlIGF0IFNQICYgUkZQLgorICoKKyAqKipMT0dJQzoKKyAqIFRvIGNpcmN1bXZlbnQgUkZQJ3MgaGFuZGxpbmcgb2YgZHVtbXkgcGFja2V0IHdoZW4gaXQgZG9lcyBub3QKKyAqIGhhdmUgYW4gaW5jb21wbGV0ZSBwYWNrZXQgZm9yIHRoZSBTVEEgdG8gYmUgZGVsZXRlZCwgYSBwYWNrZXQKKyAqIHdpdGggJ21vcmUgZnJhbWdlbnRzJyBiaXQgc2V0IHdpbGwgYmUgcXVldWVkIHRvIFJGUCdzIFdRIGJlZm9yZQorICogcXVldWluZyAnZHVtbXkgcGFja2V0Jy4KKyAqIEEgJ2R1bW15JyBCRCBpcyBwdXNoZWQgaW50byBSRlAncyBXUSB3aXRoIHR5cGU9MDAsIHN1YnR5cGU9MTAxMAorICogKERpc2Fzc29jaWF0aW9uIGZyYW1lKSBhbmQgcm91dGluZyBmbGFncyBpbiBCRCBzZXQgdG8gZUNQVSdzCisgKiBMb3cgUHJpb3JpdHkgV1EuCisgKiBSRlAgY2xlYW5zIHVwIGl0cyBsb2NhbCBjb250ZXh0IGZvciB0aGUgU1RBIGlkIG1lbnRpb25lZCBpbiB0aGUKKyAqIEJEIGFuZCB0aGVuIHB1c2hlcyBCRCB0byBlQ1BVJ3MgbG93IHByaW9yaXR5IFdRLgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwU3RhRHMgIFBvaW50ZXIgdG8gdGhlIHBlciBTVEEgZGF0YSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGJ5IExJTSBhbmQgbWFpbnRhaW5lZCBhdCBEUEgKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1fY2xlYW51cF9yeF9wYXRoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YURzLAorCQkgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJDbGVhbnVwIFJ4IFBhdGggZm9yIEFJRCA6ICVkIgorCQkicHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgOiAlZCwgbWxtU3RhdGUgOiAlZCIpLAorCQlwU3RhRHMtPmFzc29jSWQsIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlLAorCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpOworCisJcHNlc3Npb25FbnRyeS0+aXNDaXNjb1ZlbmRvckFQID0gZmFsc2U7CisKKwlpZiAocE1hYy0+bGltLmdMaW1BZGR0c1NlbnQpIHsKKwkJTVRSQUNFKG1hY190cmFjZQorCQkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEUsCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGVMSU1fQUREVFNfUlNQX1RJTUVSKSk7CisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFkZHRzUnNwVGltZXIpOworCX0KKworCWlmIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFKSB7CisJCWxpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfcGVyX3N0YV9pZF90aW1lcihwTWFjLCBlTElNX0NORl9XQUlUX1RJTUVSLAorCQkJCQkJCSAgIHBTdGFEcy0+YXNzb2NJZCk7CisKKwkJaWYgKCFwU3RhRHMtPm1sbVN0YUNvbnRleHQudXBkYXRlQ29udGV4dCkgeworCQkJLyoqCisJCQkgKiBUaGVyZSBpcyBubyBjb250ZXh0IGF0IFBvbGFyaXMgdG8gZGVsZXRlLgorCQkJICogUmVsZWFzZSBvdXIgYXNzaWduZWQgQUlEIGJhY2sgdG8gdGhlIGZyZWUgcG9vbAorCQkJICovCisJCQlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkJCSAgICBMSU1fSVNfQlRfQU1QX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJCQlsaW1fcmVsZWFzZV9wZWVyX2lkeChwTWFjLCBwU3RhRHMtPmFzc29jSWQsCisJCQkJCQkgICAgIHBzZXNzaW9uRW50cnkpOworCQkJfQorCQkJbGltX2RlbGV0ZV9kcGhfaGFzaF9lbnRyeShwTWFjLCBwU3RhRHMtPnN0YUFkZHIsCisJCQkJCQkgIHBTdGFEcy0+YXNzb2NJZCwgcHNlc3Npb25FbnRyeSk7CisKKwkJCXJldHVybiByZXRDb2RlOworCQl9CisJfQorCS8qIGRlbGV0ZSBhbGwgdHNwZWNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0YS4gKi8KKwlsaW1fYWRtaXRfY29udHJvbF9kZWxldGVfc3RhKHBNYWMsIHBTdGFEcy0+YXNzb2NJZCk7CisKKwkvKioKKwkgKiBNYWtlIFNUQSBoYXNoIGVudHJ5IGludmFsaWQgYXQgZUNQVSBzbyB0aGF0IERQSAorCSAqIGRvZXMgbm90IHByb2Nlc3MgYW55IG1vcmUgZGF0YSBwYWNrZXRzIGFuZAorCSAqIHJlbGVhc2VzIHRob3NlIEJEcworCSAqLworCXBTdGFEcy0+dmFsaWQgPSAwOworCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFOworCisJaWYgKExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCU1UUkFDRShtYWNfdHJhY2UKKwkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCSAgICAgICBlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURSkpOworCQlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFOworCQkvKiBEZWFjdGl2YXRpbmcgcHJvYmUgYWZ0ZXIgaGVhcnQgYmVhdCB0aW1lciAqLworCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKHBNYWMsIGVMSU1fUFJPQkVfQUZURVJfSEJfVElNRVIpOworCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKHBNYWMsIGVMSU1fSk9JTl9GQUlMX1RJTUVSKTsKKwkJcE1hYy0+bGltLmdMYXN0QmVhY29uRHRpbUNvdW50ID0gMDsKKwkJcE1hYy0+bGltLmdMYXN0QmVhY29uRHRpbVBlcmlvZCA9IDA7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKKwkJbGltX3NlbmRfc21lX3RzbV9pZV9pbmQocE1hYywgcHNlc3Npb25FbnRyeSwgMCwgMCwgMCk7CisjZWxzZQorCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKHBNYWMsIGVMSU1fVFNNX1RJTUVSKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworI2VuZGlmCisKKwl9CisjaWZkZWYgV0xBTl9ERUJVRworCS8qIGluY3JlbWVudCBhIGRlYnVnIGNvdW50ICovCisJcE1hYy0+bGltLmdMaW1OdW1SeENsZWFudXArKzsKKyNlbmRpZgorCisJaWYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX0pPSU5fRkFJTFVSRV9TVEFURSkgeworCQlyZXRDb2RlID0KKwkJCWxpbV9kZWxfYnNzKHBNYWMsIHBTdGFEcywgcHNlc3Npb25FbnRyeS0+YnNzSWR4LAorCQkJCSAgICBwc2Vzc2lvbkVudHJ5KTsKKwl9IGVsc2UKKwkJcmV0Q29kZSA9IGxpbV9kZWxfc3RhKHBNYWMsIHBTdGFEcywgdHJ1ZSwgcHNlc3Npb25FbnRyeSk7CisKKwlyZXR1cm4gcmV0Q29kZTsKKworfSAvKioqIGVuZCBsaW1fY2xlYW51cF9yeF9wYXRoKCkgKioqLworCisvKioKKyAqIGxpbV9zZW5kX2RlbF9zdGFfY25mKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byAgc2VuZCBhcHByb3ByaWF0ZSBDTkYgbWVzc2FnZSB0byBTTUUKKyAqCisgKioqTE9HSUM6CisgKgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSB0cEFuaVNpckdsb2JhbCBwTWFjLAorICogQHBhcmFtIHRTaXJNYWNBZGRyIHN0YURzQWRkciwKKyAqIEBwYXJhbSB1aW50MTZfdCBzdGFEc0Fzc29jSWQsCisgKiBAcGFyYW0gdExpbU1sbVN0YUNvbnRleHQgbWxtU3RhQ29udGV4dCwKKyAqIEBwYXJhbSB0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbV9zZW5kX2RlbF9zdGFfY25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHN0YURzQWRkciwKKwkJICAgICB1aW50MTZfdCBzdGFEc0Fzc29jSWQsIHRMaW1NbG1TdGFDb250ZXh0IG1sbVN0YUNvbnRleHQsCisJCSAgICAgdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGUsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwl0TGltTWxtRGlzYXNzb2NDbmYgbWxtRGlzYXNzb2NDbmY7CisJdExpbU1sbURlYXV0aENuZiBtbG1EZWF1dGhDbmY7CisJdExpbU1sbVB1cmdlU3RhSW5kIG1sbVB1cmdlU3RhSW5kOworCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiU2Vzc2lvbmlkOiAlZCBzdGFEc0Fzc29jSWQ6ICVkIFRyaWdnZXI6ICVkIgorCQkJICAgICAgICJzdGF0dXNDb2RlOiAlZCBzdGFEc0FkZHI6ICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIHN0YURzQXNzb2NJZCwKKwkJbWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciwgc3RhdHVzQ29kZSwKKwkJTUFDX0FERFJfQVJSQVkoc3RhRHNBZGRyKSk7CisKKwlpZiAoTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpIHx8CisJICAgIExJTV9JU19CVF9BTVBfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJLyogU2V0IEJTU0lEIGF0IENGRyB0byBudWxsICovCisJCXRTaXJNYWNBZGRyIG51bGxBZGRyID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKKwkJc2lyX2NvcHlfbWFjX2FkZHIobnVsbEFkZHIsIHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworCQkvKiBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIEpvaW5SZXEgaGVsZCBieSAqLworCQkvKiBNTE0gc3RhdGUgbWFjaGluZSAqLworCQlpZiAocHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEpIHsKKwkJCWNkZl9tZW1fZnJlZShwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSk7CisJCQlwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSA9IE5VTEw7CisJCX0KKworCQlwc2Vzc2lvbkVudHJ5LT5saW1BSUQgPSAwOworCisJfQorCisJaWYgKChtbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID09CisJICAgICBlTElNX0hPU1RfRElTQVNTT0MpIHx8CisJICAgIChtbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID09CisJICAgICBlTElNX0xJTktfTU9OSVRPUklOR19ESVNBU1NPQykgfHwKKwkgICAgKG1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIgPT0gZUxJTV9QUk9NSVNDVU9VU19NT0RFX0RJU0FTU09DKSkgeworCQkvKioKKwkJICogSG9zdCBvciBMTU0gZHJpdmVuIERpc2Fzc29jaWF0aW9uLgorCQkgKiBJc3N1ZSBEaXNhc3NvYyBDb25maXJtIHRvIFNNRS4KKwkJICovCisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMKCJMaW0gUG9zdGluZyBESVNBU1NPQ19DTkYgdG8gU21lLiBUcmlnZ2VyOiAlZCIpLAorCQkJbWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcik7CisKKwkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZtbG1EaXNhc3NvY0NuZi5wZWVyTWFjQWRkciwKKwkJCSAgICAgKHVpbnQ4X3QgKikgc3RhRHNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJbWxtRGlzYXNzb2NDbmYucmVzdWx0Q29kZSA9IHN0YXR1c0NvZGU7CisJCW1sbURpc2Fzc29jQ25mLmRpc2Fzc29jVHJpZ2dlciA9IG1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXI7CisJCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICovCisJCW1sbURpc2Fzc29jQ25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisJCWxpbV9wb3N0X3NtZV9tZXNzYWdlKHBNYWMsCisJCQkJICAgICBMSU1fTUxNX0RJU0FTU09DX0NORiwKKwkJCQkgICAgICh1aW50MzJfdCAqKSAmbWxtRGlzYXNzb2NDbmYpOworCX0gZWxzZSBpZiAoKG1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIgPT0KKwkJICAgIGVMSU1fSE9TVF9ERUFVVEgpIHx8CisJCSAgIChtbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID09CisJCSAgICBlTElNX0xJTktfTU9OSVRPUklOR19ERUFVVEgpKSB7CisJCS8qKgorCQkgKiBIb3N0IG9yIExNTSBkcml2ZW4gRGVhdXRoZW50aWNhdGlvbi4KKwkJICogSXNzdWUgRGVhdXRoIENvbmZpcm0gdG8gU01FLgorCQkgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIkxpbSBQb3N0aW5nIERFQVVUSF9DTkYgdG8gU21lLiBUcmlnZ2VyOiAlZCIpLAorCQkJbWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcik7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWxtRGVhdXRoQ25mLnBlZXJNYWNBZGRyLAorCQkJICAgICAodWludDhfdCAqKSBzdGFEc0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQltbG1EZWF1dGhDbmYucmVzdWx0Q29kZSA9IHN0YXR1c0NvZGU7CisJCW1sbURlYXV0aENuZi5kZWF1dGhUcmlnZ2VyID0gbWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcjsKKwkJLyogUEUgc2Vzc2lvbiBJZCAqLworCQltbG1EZWF1dGhDbmYuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKwkJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywKKwkJCQkgICAgIExJTV9NTE1fREVBVVRIX0NORiwKKwkJCQkgICAgICh1aW50MzJfdCAqKSAmbWxtRGVhdXRoQ25mKTsKKwl9IGVsc2UgaWYgKChtbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID09CisJCSAgICBlTElNX1BFRVJfRU5USVRZX0RJU0FTU09DKSB8fAorCQkgICAobWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9PSBlTElNX1BFRVJfRU5USVRZX0RFQVVUSCkpIHsKKwkJLyoqCisJCSAqIFJlY2VpdmVkIERpc2Fzc29jaWF0aW9uL0RlYXV0aGVudGljYXRpb24gZnJvbSBwZWVyLgorCQkgKiBJc3N1ZSBQdXJnZSBJbmQgdG8gU01FLgorCQkgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIkxpbSBQb3N0aW5nIFBVUkdFX1NUQV9JTkQgdG8gU21lLiBUcmlnZ2VyOiAlZCIpLAorCQkJbWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcik7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWxtUHVyZ2VTdGFJbmQucGVlck1hY0FkZHIsCisJCQkgICAgICh1aW50OF90ICopIHN0YURzQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCW1sbVB1cmdlU3RhSW5kLnJlYXNvbkNvZGUgPQorCQkJKHVpbnQ4X3QpIG1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb247CisJCW1sbVB1cmdlU3RhSW5kLmFpZCA9IHN0YURzQXNzb2NJZDsKKwkJbWxtUHVyZ2VTdGFJbmQucHVyZ2VUcmlnZ2VyID0gbWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcjsKKwkJbWxtUHVyZ2VTdGFJbmQuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKwkJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywKKwkJCQkgICAgIExJTV9NTE1fUFVSR0VfU1RBX0lORCwKKwkJCQkgICAgICh1aW50MzJfdCAqKSAmbWxtUHVyZ2VTdGFJbmQpOworCX0gZWxzZSBpZiAobWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9PSBlTElNX0pPSU5fRkFJTFVSRSkgeworCQkvKiBQRSBzZXR1cCB0aGUgcGVlciBlbnRyeSBpbiBIVyB1cGZyb250LCByaWdodCBhZnRlciBqb2luIGlzIGNvbXBsZXRlZC4gKi8KKwkJLyogSWYgdGhlcmUgaXMgYSBmYWlsdXJlIGR1cmluZyByZXN0IG9mIHRoZSBhc3NvYyBzZXF1ZW5jZSwgdGhpcyBjb250ZXh0IG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAuICovCisJCXVpbnQ4X3Qgc21lc2Vzc2lvbklkOworCQl1aW50MTZfdCBzbWV0cmFuc2FjdGlvbklkOworCisJCXNtZXNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKwkJc21ldHJhbnNhY3Rpb25JZCA9IHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQ7CisKKwkJcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEU7CisJCU1UUkFDRShtYWNfdHJhY2UKKwkJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSk7CisKKwkJLyogaWYgaXQgaXMgYSByZWFzc29jIGZhaWx1cmUgdG8gam9pbiBuZXcgQVAgKi8KKwkJaWYgKChtbG1TdGFDb250ZXh0LnJlc3VsdENvZGUgPT0KKwkJICAgICBlU0lSX1NNRV9GVF9SRUFTU09DX1RJTUVPVVRfRkFJTFVSRSkKKwkJICAgIHx8IChtbG1TdGFDb250ZXh0LnJlc3VsdENvZGUgPT0gZVNJUl9TTUVfRlRfUkVBU1NPQ19GQUlMVVJFKQorCQkgICAgfHwgKG1sbVN0YUNvbnRleHQucmVzdWx0Q29kZSA9PQorCQkJZVNJUl9TTUVfUkVBU1NPQ19USU1FT1VUX1JFU1VMVF9DT0RFKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMKCJMaW0gUG9zdGluZyBlV05JX1NNRV9SRUFTU09DX1JTUCB0byBTTUUiCisJCQkJInJlc3VsdENvZGU6ICVkLCBzdGF0dXNDb2RlOiAlZCwiCisJCQkJInNlc3Npb25JZDogJWQiKSwKKwkJCQltbG1TdGFDb250ZXh0LnJlc3VsdENvZGUsCisJCQkJbWxtU3RhQ29udGV4dC5wcm90U3RhdHVzQ29kZSwKKwkJCQlwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCk7CisKKwkJCWlmIChtbG1TdGFDb250ZXh0LnJlc3VsdENvZGUgIT0gZVNJUl9TTUVfU1VDQ0VTUykgeworCQkJCXBlX2RlbGV0ZV9zZXNzaW9uKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCQkJCXBzZXNzaW9uRW50cnkgPSBOVUxMOworCQkJfQorCisJCQlsaW1fc2VuZF9zbWVfam9pbl9yZWFzc29jX3JzcChwTWFjLCBlV05JX1NNRV9SRUFTU09DX1JTUCwKKwkJCQkJCSAgICAgIG1sbVN0YUNvbnRleHQucmVzdWx0Q29kZSwKKwkJCQkJCSAgICAgIG1sbVN0YUNvbnRleHQucHJvdFN0YXR1c0NvZGUsCisJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5LCBzbWVzZXNzaW9uSWQsCisJCQkJCQkgICAgICBzbWV0cmFuc2FjdGlvbklkKTsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fZnJlZShwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcSk7CisJCQlwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcSA9IE5VTEw7CisKKwkJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCQlGTCgiTGltIFBvc3RpbmcgZVdOSV9TTUVfSk9JTl9SU1AgdG8gU01FLiIKKwkJCQkicmVzdWx0Q29kZTogJWQsc3RhdHVzQ29kZTogJWQsIgorCQkJCSJzZXNzaW9uSWQ6ICVkIiksCisJCQkJbWxtU3RhQ29udGV4dC5yZXN1bHRDb2RlLAorCQkJCW1sbVN0YUNvbnRleHQucHJvdFN0YXR1c0NvZGUsCisJCQkJcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworCisJCQlpZiAobWxtU3RhQ29udGV4dC5yZXN1bHRDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpIHsKKwkJCQlwZV9kZWxldGVfc2Vzc2lvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJCQlwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKwkJCX0KKworCQkJbGltX3NlbmRfc21lX2pvaW5fcmVhc3NvY19yc3AocE1hYywgZVdOSV9TTUVfSk9JTl9SU1AsCisJCQkJCQkgICAgICBtbG1TdGFDb250ZXh0LnJlc3VsdENvZGUsCisJCQkJCQkgICAgICBtbG1TdGFDb250ZXh0LnByb3RTdGF0dXNDb2RlLAorCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSwgc21lc2Vzc2lvbklkLAorCQkJCQkJICAgICAgc21ldHJhbnNhY3Rpb25JZCk7CisJCX0KKworCX0KKworCWlmIChOVUxMICE9IHBzZXNzaW9uRW50cnkgJiYgIUxJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCXBlX2RlbGV0ZV9zZXNzaW9uKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCQlwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogbGltX3JlamVjdF9hc3NvY2lhdGlvbigpIC0gZnVuY3Rpb24gdG8gcmVqZWN0IFJlL0Fzc29jaWF0aW9uIFJlcXVlc3QKKyAqCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICogQHBlZXJfYWRkcjogbWFjIGFkZHJlc3Mgb2YgdGhlIHBlZXIKKyAqIEBzdWJfdHlwZTogSW5kaWNhdGVzIHdoZXRoZXIgaXQgaXMgQXNzb2NpYXRpb24gUmVxdWVzdCAoPTApIG9yCisgKiAgICAgICAgICAgIFJlYXNzb2NpYXRpb24gUmVxdWVzdCAoPTEpIGZyYW1lCisgKiBAYWRkX3ByZV9hdXRoX2NvbnRleHQ6SW5kaWNhdGVzIHdoZXRoZXIgcHJlLWF1dGggY29udGV4dAorICogICAgICAgICAgICAgICAgICAgICB0byBiZSBhZGRlZCBmb3IgdGhpcyBTVEEKKyAqIEBhdXRoX3R5cGU6IEluZGljYXRlcyBhdXRoIHR5cGUgdG8gYmUgYWRkZWQKKyAqIEBzdGFfaWQ6IEluZGljYXRlcyBzdGFJZCBvZiB0aGUgU1RBIGJlaW5nIHJlamVjdGVkCisgKiAgICAgICAgICBhc3NvY2lhdGlvbgorICogQGRlbGV0ZV9zdGE6IEluZGljYXRlcyB3aGV0aGVyIHRvIGRlbGV0ZSBTVEEgY29udGV4dAorICogICAgICAgICAgICAgIGF0IFBvbGFyaXMKKyAqIEByZXN1bHRfY29kZTogSW5kaWNhdGVzIHdoYXQgcmVhc29uQ29kZSB0byBiZSBzZW50IGluCisgKiAgICAgICAgICBSZS9Bc3NvYyByZXNwb25zZSB0byBTVEEKKyAqIEBzZXNzaW9uX2VudHJ5OiBwb2ludGVyIHRvIFBFIHNlc3Npb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBSZS9Bc3NvY2lhdGlvbiBSZXF1ZXN0IG5lZWQKKyAqIHRvIGJlIHJlamVjdGVkIGR1ZSB0byBmYWlsdXJlIGluIGFzc2lnbmluZyBhbiBBSUQgb3IgZmFpbHVyZQorICogaW4gYWRkaW5nIFNUQSBjb250ZXh0IGF0IFBvbGFyaXMgb3IgcmVqZWN0IGJ5IGFwcGxpY2F0aW9ucy4KKyAqIFJlc291cmNlcyBhbGxvY2F0ZWQgaWYgYW55IGFyZSBmcmVlZHVwIGFuZCAoUmUpIEFzc29jaWF0aW9uCisgKiBSZXNwb25zZSBmcmFtZSBpcyBzZW50IHRvIHJlcXVlc3RpbmcgU1RBLiBQcmUtQXV0aCBjb250ZXh0CisgKiB3aWxsIGJlIGFkZGVkIGZvciB0aGlzIFNUQSBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5CisgKgorICogUmV0dXJuOiBub25lCisgKi8KKwordm9pZAorbGltX3JlamVjdF9hc3NvY2lhdGlvbih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U2lyTWFjQWRkciBwZWVyX2FkZHIsCisJCQl1aW50OF90IHN1Yl90eXBlLCB1aW50OF90IGFkZF9wcmVfYXV0aF9jb250ZXh0LAorCQkJdEFuaUF1dGhUeXBlIGF1dGhfdHlwZSwgdWludDE2X3Qgc3RhX2lkLAorCQkJdWludDhfdCBkZWxldGVfc3RhLCB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0X2NvZGUsCisJCQl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXRwRHBoSGFzaE5vZGUgc3RhX2RzOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgiU2Vzc2lvbmlkOiAlZCBhdXRoX3R5cGU6ICVkIHN1Yl90eXBlOiAlZCBhZGRfcHJlX2F1dGhfY29udGV4dDogJWQgc3RhX2lkOiAlZCBkZWxldGVfc3RhOiAlZCByZXN1bHRfY29kZSA6ICVkIHBlZXJfYWRkcjogIiBNQUNfQUREUkVTU19TVFIpLAorCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwgYXV0aF90eXBlLCBzdWJfdHlwZSwKKwkJYWRkX3ByZV9hdXRoX2NvbnRleHQsIHN0YV9pZCwgZGVsZXRlX3N0YSwgcmVzdWx0X2NvZGUsCisJCU1BQ19BRERSX0FSUkFZKHBlZXJfYWRkcikpOworCisJaWYgKGFkZF9wcmVfYXV0aF9jb250ZXh0KSB7CisJCS8qIENyZWF0ZSBlbnRyeSBmb3IgdGhpcyBTVEEgaW4gcHJlLWF1dGggbGlzdCAqLworCQlzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICphdXRoX25vZGU7CisKKwkJYXV0aF9ub2RlID0gbGltX2FjcXVpcmVfZnJlZV9wcmVfYXV0aF9ub2RlKG1hY19jdHgsCisJCQkgICAgICAgJm1hY19jdHgtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUpOworCisJCWlmIChhdXRoX25vZGUpIHsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBhdXRoX25vZGUtPnBlZXJNYWNBZGRyLAorCQkJCSAgICAgcGVlcl9hZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJCWF1dGhfbm9kZS0+ZlRpbWVyU3RhcnRlZCA9IDA7CisJCQlhdXRoX25vZGUtPm1sbVN0YXRlID0gZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURTsKKwkJCWF1dGhfbm9kZS0+YXV0aFR5cGUgPSAodEFuaUF1dGhUeXBlKSBhdXRoX3R5cGU7CisJCQlhdXRoX25vZGUtPnRpbWVzdGFtcCA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisJCQlsaW1fYWRkX3ByZV9hdXRoX25vZGUobWFjX2N0eCwgYXV0aF9ub2RlKTsKKwkJfQorCX0KKworCWlmIChkZWxldGVfc3RhID09IGZhbHNlKSB7CisJCWxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKG1hY19jdHgsCisJCQkJZVNJUl9NQUNfTUFYX0FTU09DX1NUQV9SRUFDSEVEX1NUQVRVUywKKwkJCQkxLCBwZWVyX2FkZHIsIHN1Yl90eXBlLCAwLCBzZXNzaW9uX2VudHJ5KTsKKwkJLyogTG9nIGVycm9yICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJyZWNlaXZlZCBSZS9Bc3NvYyByZXEgd2hlbiBtYXggYXNzb2NpYXRlZCBTVEFzIHJlYWNoZWQgZnJvbSAiKSk7CisJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCBwZWVyX2FkZHIsIExPR1cpOworCQlsaW1fc2VuZF9zbWVfbWF4X2Fzc29jX2V4Y2VlZGVkX250ZihtYWNfY3R4LCBwZWVyX2FkZHIsCisJCQkJCXNlc3Npb25fZW50cnktPnNtZVNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisKKwlzdGFfZHMgPSBkcGhfZ2V0X2hhc2hfZW50cnkobWFjX2N0eCwgc3RhX2lkLAorCQkgICAmc2Vzc2lvbl9lbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisKKwlpZiAoc3RhX2RzID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIk5vIFNUQSBjb250ZXh0LCB5ZXQgcmVqZWN0aW5nIEFzc29jaWF0aW9uIikpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBQb2xhcmlzIGhhcyBzdGF0ZSBmb3IgdGhpcyBTVEEuCisJICogVHJpZ2dlciBjbGVhbnVwLgorCSAqLworCXN0YV9kcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9IGVMSU1fUkVBU1NPQ19SRUpFQ1Q7CisKKwkvKiBSZWNlaXZlIHBhdGggY2xlYW51cCAqLworCWxpbV9jbGVhbnVwX3J4X3BhdGgobWFjX2N0eCwgc3RhX2RzLCBzZXNzaW9uX2VudHJ5KTsKKworCS8qCisJICogU2VuZCBSZS9Bc3NvY2lhdGlvbiBSZXNwb25zZSB3aXRoCisJICogc3RhdHVzIGNvZGUgdG8gcmVxdWVzdGluZyBTVEEuCisJICovCisJbGltX3NlbmRfYXNzb2NfcnNwX21nbXRfZnJhbWUobWFjX2N0eCwgcmVzdWx0X2NvZGUsIDAsIHBlZXJfYWRkciwKKwkJCQkJIHN1Yl90eXBlLCAwLCBzZXNzaW9uX2VudHJ5KTsKKworCWlmIChzZXNzaW9uX2VudHJ5LT5wYXJzZWRBc3NvY1JlcVtzdGFfZHMtPmFzc29jSWRdICE9IE5VTEwpIHsKKwkJdWludDhfdCAqYXNzb2NfcmVxX2ZyYW1lOworCisJCWFzc29jX3JlcV9mcmFtZSA9ICh1aW50OF90ICopKCh0cFNpckFzc29jUmVxKSAoc2Vzc2lvbl9lbnRyeS0+CisJCQlwYXJzZWRBc3NvY1JlcVtzdGFfZHMtPmFzc29jSWRdKSktPmFzc29jUmVxRnJhbWU7CisJCS8qCisJCSAqQXNzb2N0aW9uIGNvbmZpcm1hdGlvbiBpcyBjb21wbGV0ZSwKKwkJICpmcmVlIHRoZSBjb3B5IG9mIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUuCisJCSAqLworCQlpZiAoYXNzb2NfcmVxX2ZyYW1lKSB7CisJCQljZGZfbWVtX2ZyZWUoYXNzb2NfcmVxX2ZyYW1lKTsKKwkJCWFzc29jX3JlcV9mcmFtZSA9IE5VTEw7CisJCX0KKworCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9lbnRyeS0+cGFyc2VkQXNzb2NSZXFbc3RhX2RzLT5hc3NvY0lkXSk7CisJCXNlc3Npb25fZW50cnktPnBhcnNlZEFzc29jUmVxW3N0YV9kcy0+YXNzb2NJZF0gPSBOVUxMOworCX0KK30KKworLyoqCisgKiBsaW1fZGVjaWRlX2FwX3Byb3RlY3Rpb25fb25faHQyMF9kZWxldGUoKSAtIGZ1bmN0aW9uIHRvIHVwZGF0ZSBwcm90ZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLgorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAqIEBzdGFfZHM6IHN0YXRpb24gbm9kZQorICogQGJlYWNvbl9wYXJhbXM6IGFwIGJlYWNvbiBwYXJhbWV0ZXJzCisgKiBAc2Vzc2lvbl9lbnRyeTogcGUgc2Vzc2lvbiBlbnRyeQorICoKKyAqIHByb3RlY3Rpb24gcmVsYXRlZCBmdW5jdGlvbiB3aGlsZSBIVDIwIHN0YXRpb24gaXMgZ2V0dGluZyBkZWxldGVkLgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAorbGltX2RlY2lkZV9hcF9wcm90ZWN0aW9uX29uX2h0MjBfZGVsZXRlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJCXRwRHBoSGFzaE5vZGUgc3RhX2RzLAorCQkJCQl0cFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25fcGFyYW1zLAorCQkJCQl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXVpbnQzMl90IGkgPSAwOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIiglZCkgQSBIVCAyMCBTVEEgaXMgZGlzYXNzb2NpYXRlZC4gQWRkciBpcyAlcE0iKSwKKwkJCXNlc3Npb25fZW50cnktPmdMaW1IdDIwUGFyYW1zLm51bVN0YSwgc3RhX2RzLT5zdGFBZGRyKTsKKworCWlmIChzZXNzaW9uX2VudHJ5LT5nTGltSHQyMFBhcmFtcy5udW1TdGEgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCQlpZiAoIXNlc3Npb25fZW50cnktPnByb3RTdGFDYWNoZVtpXS5hY3RpdmUpCisJCQkJY29udGludWU7CisKKwkJCWlmIChjZGZfbWVtX2NvbXBhcmUoc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFkZHIsCisJCQkJc3RhX2RzLT5zdGFBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSkgeworCQkJCXNlc3Npb25fZW50cnktPmdMaW1IdDIwUGFyYW1zLm51bVN0YS0tOworCQkJCXNlc3Npb25fZW50cnktPnByb3RTdGFDYWNoZVtpXS5hY3RpdmUgPQorCQkJCQkJZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoc2Vzc2lvbl9lbnRyeS0+Z0xpbUh0MjBQYXJhbXMubnVtU3RhID09IDApIHsKKwkJLyogZGlzYWJsZSBwcm90ZWN0aW9uICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIk5vIDExQiBTVEEgZXhpc3RzLCBQRVNlc3Npb25JRCAlZCIpLAorCQkJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCk7CisJCWxpbV9lbmFibGVfaHQyMF9wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLCBmYWxzZSwgYmVhY29uX3BhcmFtcywKKwkJCQkJc2Vzc2lvbl9lbnRyeSk7CisJfQorfQorCisvKioKKyAqIGxpbV9kZWNpZGVfYXBfcHJvdGVjdGlvbl9vbl9kZWxldGUoKSAtIHVwZGF0ZSBTQVAgcHJvdGVjdGlvbiBvbiBzdGF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uLgorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAqIEBzdGFfZHM6IHN0YXRpb24gbm9kZQorICogQGJlYWNvbl9wYXJhbXM6IGFwIGJlYWNvbiBwYXJhbWV0ZXJzCisgKiBAc2Vzc2lvbl9lbnRyeTogcGUgc2Vzc2lvbiBlbnRyeQorICoKKyAqIERlY2lkZXMgYWJvdXQgcHJvdGVjdGlvbiByZWxhdGVkIHNldHRpbmdzIHdoZW4gYSBzdGF0aW9uIGlzIGdldHRpbmcgZGVsZXRlZC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZAorbGltX2RlY2lkZV9hcF9wcm90ZWN0aW9uX29uX2RlbGV0ZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCSAgIHRwRHBoSGFzaE5vZGUgc3RhX2RzLAorCQkJCSAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIGJlYWNvbl9wYXJhbXMsCisJCQkJICAgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSkKK3sKKwl1aW50MzJfdCBwaHlfbW9kZTsKKwl0SGFsQml0VmFsIGVycF9lbmFibGVkID0gZUhBTF9DTEVBUjsKKwl0U2lyUkZCYW5kIHJmX2JhbmQgPSBTSVJfQkFORF9VTktOT1dOOworCXVpbnQzMl90IGk7CisKKwlpZiAoTlVMTCA9PSBzdGFfZHMpCisJCXJldHVybjsKKworCWxpbV9nZXRfcmZfYmFuZF9uZXcobWFjX2N0eCwgJnJmX2JhbmQsIHNlc3Npb25fZW50cnkpOworCWxpbV9nZXRfcGh5X21vZGUobWFjX2N0eCwgJnBoeV9tb2RlLCBzZXNzaW9uX2VudHJ5KTsKKwllcnBfZW5hYmxlZCA9IHN0YV9kcy0+ZXJwRW5hYmxlZDsKKworCWlmICgoU0lSX0JBTkRfNV9HSFogPT0gcmZfYmFuZCkgJiYKKwkJKHRydWUgPT0gc2Vzc2lvbl9lbnRyeS0+aHRDYXBhYmlsaXR5KSAmJgorCQkoc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3QpICYmCisJCShmYWxzZSA9PSBzdGFfZHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5KSkgeworCQkvKgorCQkgKiB3ZSBhcmUgSFQuIGlmIHdlIGFyZSAxMUEsIHRoZW4gcHJvdGVjdGlvbiBpcyBub3QgcmVxdWlyZWQgb3IKKwkJICogd2UgYXJlIEhUIGFuZCAxMUEgc3RhdGlvbiBpcyBsZWF2aW5nLgorCQkgKiBwcm90ZWN0aW9uIGNvbnNpZGVyYXRpb24gcmVxdWlyZWQuCisJCSAqIEhUIHN0YXRpb24gbGVhdmluZyA9PT4gdGhpcyBjYXNlIGlzIGNvbW1vbmx5IGhhbmRsZWQKKwkJICogYmV0d2VlbiBib3RoIHRoZSBiYW5kcyBiZWxvdy4KKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCIoJWQpIEEgMTFBIFNUQSBpcyBkaXNhc3NvY2lhdGVkLiBBZGRyIGlzICVwTSIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbTExYVBhcmFtcy5udW1TdGEsIHN0YV9kcy0+c3RhQWRkcik7CisJCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCQlpZiAoc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSAmJgorCQkJCWNkZl9tZW1fY29tcGFyZSgKKwkJCQkJc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFkZHIsCisJCQkJCSBzdGFfZHMtPnN0YUFkZHIsCisJCQkJCXNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQkJc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHNlc3Npb25fZW50cnktPmdMaW0xMWFQYXJhbXMubnVtU3RhID09IDApIHsKKwkJCS8qIGRpc2FibGUgcHJvdGVjdGlvbiAqLworCQkJbGltX3VwZGF0ZV8xMWFfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwgZmFsc2UsCisJCQkJYmVhY29uX3BhcmFtcywgc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwl9CisKKwkvKiB3ZSBhcmUgSFQgb3IgMTFHIGFuZCAxMUIgc3RhdGlvbiBpcyBnZXR0aW5nIGRlbGV0ZWQgKi8KKwlpZiAoKFNJUl9CQU5EXzJfNF9HSFogPT0gcmZfYmFuZCkgJiYKKwkJKHBoeV9tb2RlID09IFdOSV9DRkdfUEhZX01PREVfMTFHIHx8CisJCXNlc3Npb25fZW50cnktPmh0Q2FwYWJpbGl0eSkgJiYKKwkJKGVycF9lbmFibGVkID09IGVIQUxfQ0xFQVIpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCIoJWQpIEEgbGVnYWN5IFNUQSBpcyBkaXNhc3NvY2lhdGVkLiBBZGRyIGlzICVwTSIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbTExYlBhcmFtcy5udW1TdGEsIHN0YV9kcy0+c3RhQWRkcik7CisJCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCQlpZiAoc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSAmJgorCQkJCWNkZl9tZW1fY29tcGFyZSgKKwkJCQkJc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFkZHIsCisJCQkJCXN0YV9kcy0+c3RhQWRkciwKKwkJCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbTExYlBhcmFtcy5udW1TdGEtLTsKKwkJCQkJc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSA9CisJCQkJCQkgZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+Z0xpbTExYlBhcmFtcy5udW1TdGEgPT0gMCkgeworCQkJLyogZGlzYWJsZSBwcm90ZWN0aW9uICovCisJCQlsaW1fZW5hYmxlMTFnX3Byb3RlY3Rpb24obWFjX2N0eCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJIGJlYWNvbl9wYXJhbXMsIHNlc3Npb25fZW50cnkpOworCQl9CisJfQorCisJLyoKKwkgKiB3ZSBhcmUgSFQgQVAgYW5kIG5vbi0xMUIgc3RhdGlvbiBpcyBsZWF2aW5nLgorCSAqIDExZyBzdGF0aW9uIGlzIGxlYXZpbmcKKwkgKi8KKwlpZiAoKFNJUl9CQU5EXzJfNF9HSFogPT0gcmZfYmFuZCkgJiYKKwkJc2Vzc2lvbl9lbnRyeS0+aHRDYXBhYmlsaXR5ICYmCisJCSFzdGFfZHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5KSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCIoJWQpIEEgMTFnIFNUQSBpcyBkaXNhc3NvY2lhdGVkLiBBZGRyIGlzICVwTSIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbTExYlBhcmFtcy5udW1TdGEsIHN0YV9kcy0+c3RhQWRkcik7CisJCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCQlpZiAoc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSAmJgorCQkJCWNkZl9tZW1fY29tcGFyZSgKKwkJCQkJc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFkZHIsCisJCQkJCXN0YV9kcy0+c3RhQWRkciwKKwkJCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCQkgc2Vzc2lvbl9lbnRyeS0+Z0xpbTExZ1BhcmFtcy5udW1TdGEtLTsKKwkJCQkgc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSA9IGZhbHNlOworCQkJCSBicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChzZXNzaW9uX2VudHJ5LT5nTGltMTFnUGFyYW1zLm51bVN0YSA9PSAwKSB7CisJCSAgICAvKiBkaXNhYmxlIHByb3RlY3Rpb24gKi8KKwkJICAgIGxpbV9lbmFibGVfaHRfcHJvdGVjdGlvbl9mcm9tMTFnKG1hY19jdHgsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCQkgYmVhY29uX3BhcmFtcywKKwkJCQkJCQkgc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwl9CisKKwlpZiAoISgodHJ1ZSA9PSBzZXNzaW9uX2VudHJ5LT5odENhcGFiaWxpdHkpICYmCisJCSh0cnVlID09IHN0YV9kcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBBcHBsaWVzIHRvIDIuNCBhcyB3ZWxsIGFzIDUgR0haLgorCSAqIEhUIG5vbi1HRiBsZWF2aW5nCisJICovCisJaWYgKCFzdGFfZHMtPmh0R3JlZW5maWVsZCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiKCVkKSBBIG5vbi1HRiBTVEEgaXMgZGlzYXNzb2NpYXRlZC4gQWRkciBpcyAlcE0iKSwKKwkJCXNlc3Npb25fZW50cnktPmdMaW1Ob25HZlBhcmFtcy5udW1TdGEsIHN0YV9kcy0+c3RhQWRkcik7CisJCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCQlpZiAoc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSAmJgorCQkJCWNkZl9tZW1fY29tcGFyZSgKKwkJCQkJc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFkZHIsCisJCQkJCXN0YV9kcy0+c3RhQWRkciwKKwkJCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCQlzZXNzaW9uX2VudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+Z0xpbU5vbkdmUGFyYW1zLm51bVN0YSA9PSAwKSB7CisJCQkvKiBkaXNhYmxlIHByb3RlY3Rpb24gKi8KKwkJCWxpbV9lbmFibGVfaHRfbm9uX2dmX3Byb3RlY3Rpb24obWFjX2N0eCwgZmFsc2UsIGZhbHNlLAorCQkJCQliZWFjb25fcGFyYW1zLCBzZXNzaW9uX2VudHJ5KTsKKwkJfQorCX0KKworCS8qCisJICogQXBwbGllcyB0byAyLjQgYXMgd2VsbCBhcyA1IEdIWi4KKwkgKiBIVCAyME1oeiBzdGF0aW9uIGxlYXZpbmcKKwkgKi8KKwlpZiAoc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmh0MjBDb2V4aXN0ICYmCisJCShlSFRfQ0hBTk5FTF9XSURUSF8yME1IWiA9PQorCQkJIHN0YV9kcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpKSB7CisJCWxpbV9kZWNpZGVfYXBfcHJvdGVjdGlvbl9vbl9odDIwX2RlbGV0ZShtYWNfY3R4LCBzdGFfZHMsCisJCQkJCWJlYWNvbl9wYXJhbXMsIHNlc3Npb25fZW50cnkpOworCX0KKworCS8qCisJICogQXBwbGllcyB0byAyLjQgYXMgd2VsbCBhcyA1IEdIWi4KKwkgKiBMU0lHIFRYT1Agbm90IHN1cHBvcnRpbmcgc3RhaXRvbiBsZWF2aW5nCisJICovCisJaWYgKChmYWxzZSA9PSBzZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMuCisJCQkJZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0KSAmJgorCQkoZmFsc2UgPT0gc3RhX2RzLT5odExzaWdUWE9QUHJvdGVjdGlvbikpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIiglZCkgQSBIVCBMU0lHIG5vdCBzdXBwb3J0aW5nIFNUQSBpcyBkaXNhc3NvY2lhdGVkLiBBZGRyIGlzICVwTSIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbUxzaWdUeG9wUGFyYW1zLm51bVN0YSwKKwkJCXN0YV9kcy0+c3RhQWRkcik7CisJCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCQlpZiAoc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSAmJgorCQkJCWNkZl9tZW1fY29tcGFyZSgKKwkJCQkJc2Vzc2lvbl9lbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFkZHIsCisJCQkJCXN0YV9kcy0+c3RhQWRkciwKKwkJCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCQlzZXNzaW9uX2VudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+Z0xpbUxzaWdUeG9wUGFyYW1zLm51bVN0YSA9PSAwKSB7CisJCQkvKiBkaXNhYmxlIHByb3RlY3Rpb24gKi8KKwkJCWxpbV9lbmFibGVfaHRfbHNpZ190eG9wX3Byb3RlY3Rpb24obWFjX2N0eCwgdHJ1ZSwKKwkJCQlmYWxzZSwgYmVhY29uX3BhcmFtcywgc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogbGltX2RlY2lkZV9zaG9ydF9wcmVhbWJsZSgpIC0gdXBkYXRlIHNob3J0IHByZWFtYmxlIHBhcmFtZXRlcnMKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgKiBAc3RhX2RzOiBzdGF0aW9uIG5vZGUKKyAqIEBiZWFjb25fcGFyYW1zOiBhcCBiZWFjb24gcGFyYW1ldGVycworICogQHNlc3Npb25fZW50cnk6IHBlIHNlc3Npb24gZW50cnkKKyAqCisgKiBEZWNpZGVzIGFib3V0IGFueSBzaG9ydCBwcmVhbWJsZSByZWxhdGVkIGNoYW5nZSBiZWNhdXNlIG9mIG5ldyBzdGF0aW9uCisgKiBqb2luaW5nLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGxpbV9kZWNpZGVfc2hvcnRfcHJlYW1ibGUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCSAgICAgICB0cERwaEhhc2hOb2RlIHN0YV9kcywKKwkJCSAgICAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25fcGFyYW1zLAorCQkJICAgICAgIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJdWludDMyX3QgaTsKKworCWlmIChzdGFfZHMtPnNob3J0UHJlYW1ibGVFbmFibGVkID09IGVIQUxfQ0xFQVIpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkgICAgICAgRkwoIiglZCkgQSBub24tc2hvcnQgcHJlYW1ibGUgU1RBIGlzIGRpc2Fzc29jaWF0ZWQuIEFkZHIgaXMgJXBNIiksCisJCSAgICAgICBzZXNzaW9uX2VudHJ5LT5nTGltTm9TaG9ydFBhcmFtcy5udW1Ob25TaG9ydFByZWFtYmxlU3RhLAorCQkJIHN0YV9kcy0+c3RhQWRkcik7CisJCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCQlpZiAoc2Vzc2lvbl9lbnRyeS0+Z0xpbU5vU2hvcnRQYXJhbXMuCisJCQkJc3RhTm9TaG9ydENhY2hlW2ldLmFjdGl2ZSAmJgorCQkJCWNkZl9tZW1fY29tcGFyZShzZXNzaW9uX2VudHJ5LT4KKwkJCQkJZ0xpbU5vU2hvcnRQYXJhbXMuCisJCQkJCXN0YU5vU2hvcnRDYWNoZVtpXS5hZGRyLAorCQkJCQlzdGFfZHMtPnN0YUFkZHIsCisJCQkJCXNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbU5vU2hvcnRQYXJhbXMuCisJCQkJCW51bU5vblNob3J0UHJlYW1ibGVTdGEtLTsKKwkJCQlzZXNzaW9uX2VudHJ5LT5nTGltTm9TaG9ydFBhcmFtcy4KKwkJCQkJc3RhTm9TaG9ydENhY2hlW2ldLmFjdGl2ZSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHNlc3Npb25fZW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLm51bU5vblNob3J0UHJlYW1ibGVTdGEpCisJCQlyZXR1cm47CisKKwkJLyoKKwkJICogZW5hYmxlIHNob3J0IHByZWFtYmxlCisJCSAqIHJlc2V0IHRoZSBjYWNoZQorCQkgKi8KKwkJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJnNlc3Npb25fZW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLAorCQkJCXNpemVvZih0TGltTm9TaG9ydFBhcmFtcyksIDApOworCQlpZiAobGltX2VuYWJsZV9zaG9ydF9wcmVhbWJsZShtYWNfY3R4LCB0cnVlLAorCQkJYmVhY29uX3BhcmFtcywgc2Vzc2lvbl9lbnRyeSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIkNhbm5vdCBlbmFibGUgc2hvcnQgcHJlYW1ibGUiKSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogbGltX2RlY2lkZV9zaG9ydF9zbG90KCkgLSB1cGRhdGUgc2hvcnQgc2xvdCB0aW1lIHJlbGF0ZWQgIHBhcmFtZXRlcnMKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgKiBAc3RhX2RzOiBzdGF0aW9uIG5vZGUKKyAqIEBiZWFjb25fcGFyYW1zOiBhcCBiZWFjb24gcGFyYW1ldGVycworICogQHNlc3Npb25fZW50cnk6IHBlIHNlc3Npb24gZW50cnkKKyAqCisgKiBEZWNpZGVzIGFib3V0IGFueSBzaG9ydCBzbG90IHRpbWUgcmVsYXRlZCBjaGFuZ2UgYmVjYXVzZSBvZiBzdGF0aW9uIGxlYXZpbmcKKyAqICAgICAgICB0aGUgQlNTLgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQKK2xpbV9kZWNpZGVfc2hvcnRfc2xvdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0cERwaEhhc2hOb2RlIHN0YV9kcywKKwkJICAgICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgYmVhY29uX3BhcmFtcywKKwkJICAgICAgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSkKK3sKKwl1aW50MzJfdCBpLCB2YWwsIG5vbl9zaG9ydF9zbG90X3N0YV9jb3VudDsKKworCWlmIChzdGFfZHMtPnNob3J0U2xvdFRpbWVFbmFibGVkICE9IGVIQUxfQ0xFQVIpCisJCXJldHVybjsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIiglZCkgQSBub24tc2hvcnQgc2xvdHRpbWUgU1RBIGlzIGRpc2Fzc29jaWF0ZWQuIEFkZHIgaXMgJXBNIiksCisJCW1hY19jdHgtPmxpbS5nTGltTm9TaG9ydFNsb3RQYXJhbXMubnVtTm9uU2hvcnRTbG90U3RhLAorCQlzdGFfZHMtPnN0YUFkZHIpOworCisJd2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRCwKKwkJCSAmdmFsKTsKKworCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSkgeworCQlub25fc2hvcnRfc2xvdF9zdGFfY291bnQgPQorCQkgICAgICBzZXNzaW9uX2VudHJ5LT5nTGltTm9TaG9ydFNsb3RQYXJhbXMubnVtTm9uU2hvcnRTbG90U3RhOworCQlmb3IgKGkgPSAwOyBpIDwgTElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykgeworCQkJaWYgKHNlc3Npb25fZW50cnktPmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy4KKwkJCQlzdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFjdGl2ZSAmJgorCQkJCWNkZl9tZW1fY29tcGFyZShzZXNzaW9uX2VudHJ5LT4KKwkJCQkJZ0xpbU5vU2hvcnRTbG90UGFyYW1zLgorCQkJCQkJc3RhTm9TaG9ydFNsb3RDYWNoZVtpXS5hZGRyLAorCQkJCQlzdGFfZHMtPnN0YUFkZHIsCisJCQkJCXNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQkJbm9uX3Nob3J0X3Nsb3Rfc3RhX2NvdW50LS07CisJCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbU5vU2hvcnRTbG90UGFyYW1zLgorCQkJCQlzdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFjdGl2ZSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKG5vbl9zaG9ydF9zbG90X3N0YV9jb3VudCA9PSAwICYmIHZhbCkgeworCQkJLyoKKwkJCSAqIGVuYWJsZSBzaG9ydCBzbG90IHRpbWUKKwkJCSAqIHJlc2V0IHRoZSBjYWNoZQorCQkJICovCisJCQljZGZfbWVtX3NldCgodWludDhfdCAqKSAmc2Vzc2lvbl9lbnRyeS0+CisJCQkJZ0xpbU5vU2hvcnRTbG90UGFyYW1zLAorCQkJCXNpemVvZih0TGltTm9TaG9ydFNsb3RQYXJhbXMpLCAwKTsKKwkJCWJlYWNvbl9wYXJhbXMtPmZTaG9ydFNsb3RUaW1lID0gdHJ1ZTsKKwkJCWJlYWNvbl9wYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQkJUEFSQU1fU0hPUlRfU0xPVF9USU1FX0NIQU5HRUQ7CisJCQlzZXNzaW9uX2VudHJ5LT5zaG9ydFNsb3RUaW1lU3VwcG9ydGVkID0gdHJ1ZTsKKwkJfQorCQlzZXNzaW9uX2VudHJ5LT5nTGltTm9TaG9ydFNsb3RQYXJhbXMubnVtTm9uU2hvcnRTbG90U3RhID0KKwkJCW5vbl9zaG9ydF9zbG90X3N0YV9jb3VudDsKKwl9IGVsc2UgeworCQlub25fc2hvcnRfc2xvdF9zdGFfY291bnQgPQorCQkJbWFjX2N0eC0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5udW1Ob25TaG9ydFNsb3RTdGE7CisJCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCQlpZiAobWFjX2N0eC0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy4KKwkJCQlzdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFjdGl2ZSAmJgorCQkJCWNkZl9tZW1fY29tcGFyZSgKKwkJCQkJbWFjX2N0eC0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy4KKwkJCQkJCXN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWRkciwKKwkJCQkJc3RhX2RzLT5zdGFBZGRyLAorCQkJCQlzaXplb2YodFNpck1hY0FkZHIpKSkgeworCQkJCW5vbl9zaG9ydF9zbG90X3N0YV9jb3VudC0tOworCQkJCW1hY19jdHgtPmxpbS5nTGltTm9TaG9ydFNsb3RQYXJhbXMuCisJCQkJCXN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWN0aXZlID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAodmFsICYmICFub25fc2hvcnRfc2xvdF9zdGFfY291bnQpIHsKKwkJCS8qCisJCQkgKiBlbmFibGUgc2hvcnQgc2xvdCB0aW1lCisJCQkgKiByZXNldCB0aGUgY2FjaGUKKwkJCSAqLworCQkJY2RmX21lbV9zZXQoCisJCQkJKHVpbnQ4X3QgKikgJm1hY19jdHgtPmxpbS5nTGltTm9TaG9ydFNsb3RQYXJhbXMsCisJCQkJc2l6ZW9mKHRMaW1Ob1Nob3J0U2xvdFBhcmFtcyksIDApOworCQkJLyppbiBjYXNlIG9mIEFQIHNldCBTSE9SVF9TTE9UX1RJTUUgdG8gZW5hYmxlKi8KKwkJCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSkgeworCQkJCWJlYWNvbl9wYXJhbXMtPmZTaG9ydFNsb3RUaW1lID0gdHJ1ZTsKKwkJCQliZWFjb25fcGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PQorCQkJCQlQQVJBTV9TSE9SVF9TTE9UX1RJTUVfQ0hBTkdFRDsKKwkJCQlzZXNzaW9uX2VudHJ5LT5zaG9ydFNsb3RUaW1lU3VwcG9ydGVkID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQltYWNfY3R4LT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLm51bU5vblNob3J0U2xvdFN0YSA9CisJCQlub25fc2hvcnRfc2xvdF9zdGFfY291bnQ7CisJfQorfQorCit2b2lkCitsaW1fcG9zdF9yZWFzc29jX2ZhaWx1cmUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZSwKKwkJCSB1aW50MTZfdCBwcm90U3RhdHVzQ29kZSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0TGltTWxtUmVhc3NvY0NuZiBtbG1SZWFzc29jQ25mOworCisJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFOworCU1UUkFDRShtYWNfdHJhY2UKKwkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCSAgICAgICBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKSk7CisKKwkvKiAnQ2hhbmdlJyB0aW1lciBmb3IgZnV0dXJlIGFjdGl2YXRpb25zICovCisJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihwTWFjLCBlTElNX1JFQVNTT0NfRkFJTF9USU1FUik7CisKKwltbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPSByZXN1bHRDb2RlOworCW1sbVJlYXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPSBwcm90U3RhdHVzQ29kZTsKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJZCAqLworCW1sbVJlYXNzb2NDbmYuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywKKwkJCSAgICAgTElNX01MTV9SRUFTU09DX0NORiwgKHVpbnQzMl90ICopICZtbG1SZWFzc29jQ25mKTsKK30gLyoqKiBlbmQgbGltX3Bvc3RfcmVhc3NvY19mYWlsdXJlKCkgKioqLworCisvKioKKyAqIGxpbV9yZXN0b3JlX3ByZV9yZWFzc29jX3N0YXRlKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBTVEEgcm9sZSB3aGVuZXZlciBSZWFzb2NpYXRpb24KKyAqIFJlc3BvbnNlIHdpdGggYSByZWplY3QgY29kZSBpcyByZWNlaXZlZCBmcm9tIEFQLgorICoKKyAqKipMT0dJQzoKKyAqIFJlYXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lciBpcyBzdG9wcGVkLCBPbGQgKG9yIGN1cnJlbnQpIEFQJ3MKKyAqIGNvbnRleHQgaXMgcmVzdG9yZWQgYm90aCBhdCBQb2xhcmlzICYgc29mdHdhcmUKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICByZXN1bHRDb2RlIC0gUmVzdWx0IGNvZGUgdGhhdCBzcGVjaWZpZXMgd2h5IFJlYXNzb2NpYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcCBmYWlsZWQKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1fcmVzdG9yZV9wcmVfcmVhc3NvY19zdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUsCisJCQkgICAgICB1aW50MTZfdCBwcm90U3RhdHVzQ29kZSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0TGltTWxtUmVhc3NvY0NuZiBtbG1SZWFzc29jQ25mOworCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgic2Vzc2lvbmlkOiAlZCBwcm90U3RhdHVzQ29kZTogJWQgcmVzdWx0Q29kZTogJWQiKSwKKwkJcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLCBwcm90U3RhdHVzQ29kZSwgcmVzdWx0Q29kZSk7CisKKwlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEU7CisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJICAgICAgIGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKTsKKworCS8qICdDaGFuZ2UnIHRpbWVyIGZvciBmdXR1cmUgYWN0aXZhdGlvbnMgKi8KKwlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKHBNYWMsIGVMSU1fUkVBU1NPQ19GQUlMX1RJTUVSKTsKKworCWxpbV9zZXRfY2hhbm5lbChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwsCisJCQlwc2Vzc2lvbkVudHJ5LT5jaF9jZW50ZXJfZnJlcV9zZWcwLAorCQkJcHNlc3Npb25FbnRyeS0+Y2hfY2VudGVyX2ZyZXFfc2VnMSwKKwkJCXBzZXNzaW9uRW50cnktPmNoX3dpZHRoLAorCQkJcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciwKKwkJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKworCS8qKiBAVG9EbyA6IE5lZWQgdG8gSW50ZWdyYXRlIHRoZSBTVE9QIHRoZSBEYXRhVHJhbnNmZXIgdG8gdGhlIEFQIGZyb20gMTFIIGNvZGUgKi8KKworCW1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9IHJlc3VsdENvZGU7CisJbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IHByb3RTdGF0dXNDb2RlOworCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICovCisJbWxtUmVhc3NvY0NuZi5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShwTWFjLAorCQkJICAgICBMSU1fTUxNX1JFQVNTT0NfQ05GLCAodWludDMyX3QgKikgJm1sbVJlYXNzb2NDbmYpOworfSAvKioqIGVuZCBsaW1fcmVzdG9yZV9wcmVfcmVhc3NvY19zdGF0ZSgpICoqKi8KKworLyoqCisgKiBsaW1faXNfcmVhc3NvY19pbl9wcm9ncmVzcygpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VlIGlmIFNUQSBpcyBpbiB3dC1yZWFzc29jLXJzcCBzdGF0ZS4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJuIHRydWUgIFdoZW4gU1RBIGlzIHdhaXRpbmcgZm9yIFJlYXNzb2MgcmVzcG9uc2UgZnJvbSBBUCBcbgorICogICAgICAgICBlbHNlIGZhbHNlCisgKi8KKworYm9vbCBsaW1faXNfcmVhc3NvY19pbl9wcm9ncmVzcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoKExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSAmJgorCSAgICAoKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEUpIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9PQorCQkgICAgICBlTElNX1NNRV9XVF9SRUFTU09DX0xJTktfRkFJTF9TVEFURSkpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30gLyoqKiBlbmQgbGltX2lzX3JlYXNzb2NfaW5fcHJvZ3Jlc3MoKSAqKiovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworLyoqCisgKiBsaW1fcG9wdWxhdGVfdmh0X21jc19zZXQgLSBmdW5jdGlvbiB0byBwb3B1bGF0ZSB2aHQgbWNzIHJhdGUgc2V0CisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICogQHJhdGVzOiBwb2ludGVyIHRvIHN1cHBvcnRlZCByYXRlIHNldAorICogQHBlZXJfdmh0X2NhcHM6IHBvaW50ZXIgdG8gcGVlciB2aHQgY2FwYWJpbGl0aWVzCisgKiBAc2Vzc2lvbl9lbnRyeTogcGUgc2Vzc2lvbiBlbnRyeQorICoKKyAqIFBvcHVsYXRlcyB2aHQgbWNzIHJhdGUgc2V0IGJhc2VkIG9uIHBlZXIgYW5kIHNlbGYgY2FwYWJpbGl0aWVzCisgKgorICogUmV0dXJuOiBlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcyBlbHNlIGVTSVJfRkFJTFVSRQorICovCit0U2lyUmV0U3RhdHVzIGxpbV9wb3B1bGF0ZV92aHRfbWNzX3NldCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCSAgICAgICB0cFNpclN1cHBvcnRlZFJhdGVzIHJhdGVzLAorCQkJCSAgICAgICB0RG90MTFmSUVWSFRDYXBzICpwZWVyX3ZodF9jYXBzLAorCQkJCSAgICAgICB0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXVpbnQzMl90IHZhbDsKKwl1aW50MzJfdCBzZWxmX3N0YV9kb3QxMW1vZGUgPSAwOworCXVpbnQxNl90IG1jc19tYXBfbWFzayA9IE1DU01BUE1BU0sxeDE7CisJdWludDE2X3QgbWNzX21hcF9tYXNrMngyID0gMDsKKworCXdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19ET1QxMV9NT0RFLCAmc2VsZl9zdGFfZG90MTFtb2RlKTsKKworCWlmICghSVNfRE9UMTFfTU9ERV9WSFQoc2VsZl9zdGFfZG90MTFtb2RlKSkKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfVkhUX1JYX01DU19NQVAsICZ2YWwpICE9CisJICAgIGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgVkhUIFJYIE1DUyBNQVAiKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCXJhdGVzLT52aHRSeE1DU01hcCA9ICh1aW50MTZfdCkgdmFsOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19WSFRfVFhfTUNTX01BUCwgJnZhbCkgIT0KKwkJZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBWSFQgVFggTUNTIE1BUCIpKTsKKwkJZ290byBlcnJvcjsKKwl9CisJcmF0ZXMtPnZodFR4TUNTTWFwID0gKHVpbnQxNl90KSB2YWw7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LAorCQkJV05JX0NGR19WSFRfUlhfSElHSEVTVF9TVVBQT1JURURfREFUQV9SQVRFLAorCQkJJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJjb3VsZG4ndCByZXRyaWV2ZSBWSFQgUlggU3VwcG9ydGVkIGRhdGEgcmF0ZSBNQVAiKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCXJhdGVzLT52aHRSeEhpZ2hlc3REYXRhUmF0ZSA9ICh1aW50MTZfdCkgdmFsOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwKKwkJCVdOSV9DRkdfVkhUX1RYX0hJR0hFU1RfU1VQUE9SVEVEX0RBVEFfUkFURSwKKwkJCSZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiY291bGRuJ3QgcmV0cmlldmUgVkhUIFJYIFN1cHBvcnRlZCBkYXRhIHJhdGUgTUFQIikpOworCQlnb3RvIGVycm9yOworCX0KKwlyYXRlcy0+dmh0VHhIaWdoZXN0RGF0YVJhdGUgPSAodWludDE2X3QpIHZhbDsKKworCWlmIChwZWVyX3ZodF9jYXBzID09IE5VTEwpCisJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKKwlyYXRlcy0+dmh0VHhIaWdoZXN0RGF0YVJhdGUgPQorCQlDREZfTUlOKHJhdGVzLT52aHRUeEhpZ2hlc3REYXRhUmF0ZSwKKwkJCXBlZXJfdmh0X2NhcHMtPnR4U3VwRGF0YVJhdGUpOworCXJhdGVzLT52aHRSeEhpZ2hlc3REYXRhUmF0ZSA9CisJCUNERl9NSU4ocmF0ZXMtPnZodFJ4SGlnaGVzdERhdGFSYXRlLAorCQkJcGVlcl92aHRfY2Fwcy0+cnhIaWdoU3VwRGF0YVJhdGUpOworCisJaWYgKG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uZW5hYmxlMngyKSB7CisJCWlmIChzZXNzaW9uX2VudHJ5ICYmIG1hY19jdHgtPmx0ZUNvZXhBbnRTaGFyZSAmJgorCQkJSVNfMjRHX0NIKHNlc3Npb25fZW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCkpIHsKKwkJCWlmIChJU18yWDJfQ0hBSU4oc2Vzc2lvbl9lbnRyeS0+Y2hhaW5NYXNrKSkKKwkJCQltY3NfbWFwX21hc2syeDIgPSBNQ1NNQVBNQVNLMngyOworCQkJZWxzZQorCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIjJ4MiBub3QgZW5hYmxlZCAlZCIpLAorCQkJCQlzZXNzaW9uX2VudHJ5LT5jaGFpbk1hc2spOworCQl9IGVsc2UgeworCQkJbWNzX21hcF9tYXNrMngyID0gTUNTTUFQTUFTSzJ4MjsKKwkJfQorCX0KKworCWlmICgocGVlcl92aHRfY2Fwcy0+dHhNQ1NNYXAgJiBtY3NfbWFwX21hc2spIDwKKwkgICAgKHJhdGVzLT52aHRSeE1DU01hcCAmIG1jc19tYXBfbWFzaykpIHsKKwkJcmF0ZXMtPnZodFJ4TUNTTWFwICY9IH4obWNzX21hcF9tYXNrKTsKKwkJcmF0ZXMtPnZodFJ4TUNTTWFwIHw9CisJCQkocGVlcl92aHRfY2Fwcy0+dHhNQ1NNYXAgJiBtY3NfbWFwX21hc2spOworCX0KKwlpZiAoKHBlZXJfdmh0X2NhcHMtPnJ4TUNTTWFwICYgbWNzX21hcF9tYXNrKSA8CisJICAgIChyYXRlcy0+dmh0VHhNQ1NNYXAgJiBtY3NfbWFwX21hc2spKSB7CisJCXJhdGVzLT52aHRUeE1DU01hcCAmPSB+KG1jc19tYXBfbWFzayk7CisJCXJhdGVzLT52aHRUeE1DU01hcCB8PQorCQkJKHBlZXJfdmh0X2NhcHMtPnJ4TUNTTWFwICYgbWNzX21hcF9tYXNrKTsKKwl9CisKKwlpZiAobWNzX21hcF9tYXNrMngyKSB7CisKKwkJdWludDE2X3QgcGVlcl9tY3NfbWFwLCBzZWxmX21jc19tYXA7CisKKwkJcGVlcl9tY3NfbWFwID0KKwkJCXBlZXJfdmh0X2NhcHMtPnR4TUNTTWFwICYgbWNzX21hcF9tYXNrMngyOworCQlzZWxmX21jc19tYXAgPQorCQkJcmF0ZXMtPnZodFJ4TUNTTWFwICYgbWNzX21hcF9tYXNrMngyOworCisJCWlmICgoc2VsZl9tY3NfbWFwICE9IG1jc19tYXBfbWFzazJ4MikgJiYKKwkJICAgICgocGVlcl9tY3NfbWFwID09IG1jc19tYXBfbWFzazJ4MikgfHwKKwkJICAgICAocGVlcl9tY3NfbWFwIDwgc2VsZl9tY3NfbWFwKSkpIHsKKwkJCXJhdGVzLT52aHRSeE1DU01hcCAmPSB+bWNzX21hcF9tYXNrMngyOworCQkJcmF0ZXMtPnZodFJ4TUNTTWFwIHw9IHBlZXJfbWNzX21hcDsKKwkJfQorCisJCXBlZXJfbWNzX21hcCA9CisJCSAocGVlcl92aHRfY2Fwcy0+cnhNQ1NNYXAgJiBtY3NfbWFwX21hc2syeDIpOworCQlzZWxmX21jc19tYXAgPQorCQkJKHJhdGVzLT52aHRUeE1DU01hcCAmIG1jc19tYXBfbWFzazJ4Mik7CisKKwkJaWYgKChzZWxmX21jc19tYXAgIT0gbWNzX21hcF9tYXNrMngyKSAmJgorCQkgICAgKChwZWVyX21jc19tYXAgPT0gbWNzX21hcF9tYXNrMngyKSB8fAorCQkgICAgIChwZWVyX21jc19tYXAgPCBzZWxmX21jc19tYXApKSkgeworCQkJcmF0ZXMtPnZodFR4TUNTTWFwICY9IH5tY3NfbWFwX21hc2syeDI7CisJCQlyYXRlcy0+dmh0VHhNQ1NNYXAgfD0gcGVlcl9tY3NfbWFwOworCQl9CisJfQorCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgiZW5hYmxlMngyIC0gJWQgdmh0UnhNQ1NNYXAgLSAleCB2aHRUeE1DU01hcCAtICV4XG4iKSwKKwkJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5lbmFibGUyeDIsCisJCXJhdGVzLT52aHRSeE1DU01hcCwgcmF0ZXMtPnZodFR4TUNTTWFwKTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CitlcnJvcjoKKworCXJldHVybiBlU0lSX0ZBSUxVUkU7Cit9CisjZW5kaWYKKworLyoqCisgKiBsaW1fcG9wdWxhdGVfb3duX3JhdGVfc2V0KCkgLSBjb21wcmlzZXMgdGhlIGJhc2ljIGFuZCBleHRlbmRlZCByYXRlcyByZWFkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBDRkcKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgKiBAcmF0ZXM6IHBvaW50ZXIgdG8gc3VwcG9ydGVkIHJhdGVzCisgKiBAc3VwcG9ydGVkX21jc19zZXQ6IHBvaW50ZXIgdG8gc3VwcG9ydGVkIG1jcyByYXRlcworICogQGJhc2ljX29ubHk6IHVwZGF0ZSBvbmx5IGJhc2ljIHJhdGVzIGlmIHNldCB0cnVlCisgKiBAc2Vzc2lvbl9lbnRyeTogcGUgc2Vzc2lvbiBlbnRyeQorICogQHZodF9jYXBzOiBwb2ludGVyIHRvIHZodCBjYXBhYmlsaXR5CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc0Fzc29jUnNwKCkgb3IKKyAqIGxpbV9hZGRfc3RhSW5JQlNTKCkKKyAqIC0gSXQgY3JlYXRlcyBhIGNvbWJpbmVkIHJhdGUgc2V0IG9mIDEyIHJhdGVzIG1heCB3aGljaAorICogICBjb21wcmlzZXMgdGhlIGJhc2ljIGFuZCBleHRlbmRlZCByYXRlcyByZWFkIGZyb20gQ0ZHCisgKiAtIEl0IHNvcnRzIHRoZSBjb21iaW5lZCByYXRlIFNldCBhbmQgY29weSBpdCBpbiB0aGUKKyAqICAgcmF0ZSBhcnJheSBvZiB0aGUgcFNUQSBkZXNjcmlwdG9yCisgKiAtIEl0IHNldHMgdGhlIGVycEVuYWJsZWQgYml0IG9mIHRoZSBTVEEgZGVzY3JpcHRvcgorICogRVJQIGJpdCBpcyBzZXQgaWZmIHRoZSBkcGggUEhZIG1vZGUgaXMgMTFHIGFuZCB0aGVyZSBpcyBhdCBsZWFzdAorICogYW4gQSByYXRlIGluIHRoZSBzdXBwb3J0ZWQgb3IgZXh0ZW5kZWQgcmF0ZSBzZXRzCisgKgorICogUmV0dXJuOiBlU0lSX1NVQ0NFU1Mgb3IgZVNJUl9GQUlMVVJFLgorICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKK3RTaXJSZXRTdGF0dXMKK2xpbV9wb3B1bGF0ZV9vd25fcmF0ZV9zZXQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdHBTaXJTdXBwb3J0ZWRSYXRlcyByYXRlcywgdWludDhfdCAqc3VwcG9ydGVkX21jc19zZXQsCisJCXVpbnQ4X3QgYmFzaWNfb25seSwgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSwKKwkJdERvdDExZklFVkhUQ2FwcyAqdmh0X2NhcHMpCisjZWxzZQordFNpclJldFN0YXR1cworbGltX3BvcHVsYXRlX293bl9yYXRlX3NldCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJICB0cFNpclN1cHBvcnRlZFJhdGVzIHJhdGVzLAorCQkJICB1aW50OF90ICpzdXBwb3J0ZWRfbWNzX3NldCwKKwkJCSAgdWludDhfdCBiYXNpY19vbmx5LCB0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQorI2VuZGlmCit7CisJdFNpck1hY1JhdGVTZXQgdGVtcF9yYXRlX3NldDsKKwl0U2lyTWFjUmF0ZVNldCB0ZW1wX3JhdGVfc2V0MjsKKwl1aW50MzJfdCBpLCBqLCB2YWwsIG1pbiwgaXNfYXJhdGU7CisJdWludDMyX3QgcGh5X21vZGUgPSAwOworCXVpbnQzMl90IHNlbGZfc3RhX2RvdDExbW9kZSA9IDA7CisJdWludDhfdCBhX3JhdGVfaW5kZXggPSAwOworCXVpbnQ4X3QgYl9yYXRlX2luZGV4ID0gMDsKKworCisJaXNfYXJhdGUgPSAwOworCisJd2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHX0RPVDExX01PREUsICZzZWxmX3N0YV9kb3QxMW1vZGUpOworCWxpbV9nZXRfcGh5X21vZGUobWFjX2N0eCwgJnBoeV9tb2RlLCBzZXNzaW9uX2VudHJ5KTsKKworCS8qCisJICogSW5jbHVkZSAxMWIgcmF0ZXMgb25seSB3aGVuIHRoZSBkZXZpY2UgY29uZmlndXJlZCBpbgorCSAqICBhdXRvLCAxMWEvYi9nIG9yIDExYl9vbmx5CisJICovCisJaWYgKChzZWxmX3N0YV9kb3QxMW1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFX0FMTCkgfHwKKwkgICAgKHNlbGZfc3RhX2RvdDExbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFBKSB8fAorCSAgICAoc2VsZl9zdGFfZG90MTFtb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUFDKSB8fAorCSAgICAoc2VsZl9zdGFfZG90MTFtb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU4pIHx8CisJICAgIChzZWxmX3N0YV9kb3QxMW1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExRykgfHwKKwkgICAgKHNlbGZfc3RhX2RvdDExbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFCKSkgeworCQl2YWwgPSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUJfTEVOOworCQl3bGFuX2NmZ19nZXRfc3RyKG1hY19jdHgsIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQiwKKwkJCQkgKHVpbnQ4X3QgKikgJnRlbXBfcmF0ZV9zZXQucmF0ZSwgJnZhbCk7CisJCXRlbXBfcmF0ZV9zZXQubnVtUmF0ZXMgPSAodWludDhfdCkgdmFsOworCX0gZWxzZSB7CisJCXRlbXBfcmF0ZV9zZXQubnVtUmF0ZXMgPSAwOworCX0KKworCS8qIEluY2x1ZGUgMTFhIHJhdGVzIHdoZW4gdGhlIGRldmljZSBjb25maWd1cmVkIGluIG5vbi0xMWIgbW9kZSAqLworCWlmICghSVNfRE9UMTFfTU9ERV8xMUIoc2VsZl9zdGFfZG90MTFtb2RlKSkgeworCQl2YWwgPSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUFfTEVOOworCQl3bGFuX2NmZ19nZXRfc3RyKG1hY19jdHgsIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQSwKKwkJCQkgKHVpbnQ4X3QgKikgJnRlbXBfcmF0ZV9zZXQyLnJhdGUsICZ2YWwpOworCQl0ZW1wX3JhdGVfc2V0Mi5udW1SYXRlcyA9ICh1aW50OF90KSB2YWw7CisJfSBlbHNlIHsKKwkJdGVtcF9yYXRlX3NldDIubnVtUmF0ZXMgPSAwOworCX0KKworCWlmICgodGVtcF9yYXRlX3NldC5udW1SYXRlcyArIHRlbXBfcmF0ZV9zZXQyLm51bVJhdGVzKSA+IDEyKSB7CisJCS8qIHdlIGFyZSBpbiBiaWcgdHJvdWJsZSAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsIEZMKCJtb3JlIHRoYW4gMTIgcmF0ZXMgaW4gQ0ZHIikpOworCQkvKiBwYW5pYyAqLworCQlnb3RvIGVycm9yOworCX0KKwkvKiBjb3B5IGFsbCByYXRlcyBpbiB0ZW1wX3JhdGVfc2V0LCB0aGVyZSBhcmUgMTIgcmF0ZXMgbWF4ICovCisJZm9yIChpID0gMDsgaSA8IHRlbXBfcmF0ZV9zZXQyLm51bVJhdGVzOyBpKyspCisJCXRlbXBfcmF0ZV9zZXQucmF0ZVtpICsgdGVtcF9yYXRlX3NldC5udW1SYXRlc10gPQorCQkJdGVtcF9yYXRlX3NldDIucmF0ZVtpXTsKKworCXRlbXBfcmF0ZV9zZXQubnVtUmF0ZXMgKz0gdGVtcF9yYXRlX3NldDIubnVtUmF0ZXM7CisKKwkvKioKKwkgKiBTb3J0IHJhdGVzIGluIHRlbXBfcmF0ZV9zZXQgKHRoZXkgYXJlIGxpa2VseSB0byBiZSBhbHJlYWR5IHNvcnRlZCkKKwkgKiBwdXQgdGhlIHJlc3VsdCBpbiBwU3VwcG9ydGVkUmF0ZXMKKwkgKi8KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHJhdGVzLCBzaXplb2YodFNpclN1cHBvcnRlZFJhdGVzKSwgMCk7CisJZm9yIChpID0gMDsgaSA8IHRlbXBfcmF0ZV9zZXQubnVtUmF0ZXM7IGkrKykgeworCQltaW4gPSAwOworCQl2YWwgPSAweGZmOworCQlpc19hcmF0ZSA9IDA7CisKKwkJZm9yIChqID0gMDsgKGogPCB0ZW1wX3JhdGVfc2V0Lm51bVJhdGVzKSAmJgorCQkJIChqIDwgU0lSX01BQ19SQVRFU0VUX0VJRF9NQVgpOyBqKyspIHsKKwkJCWlmICgodWludDMyX3QpICh0ZW1wX3JhdGVfc2V0LnJhdGVbal0gJiAweDdmKSA8CisJCQkJCXZhbCkgeworCQkJCXZhbCA9IHRlbXBfcmF0ZV9zZXQucmF0ZVtqXSAmIDB4N2Y7CisJCQkJbWluID0gajsKKwkJCX0KKwkJfQorCisJCWlmIChzaXJJc0FyYXRlKHRlbXBfcmF0ZV9zZXQucmF0ZVttaW5dICYgMHg3ZikpCisJCQlpc19hcmF0ZSA9IDE7CisKKwkJLyoKKwkJICogSEFMIG5lZWRzIHRvIGtub3cgd2hldGhlciB0aGUgcmF0ZSBpcyBiYXNpYyByYXRlIG9yCisJCSAqIG5vdCwgYXMgaXQgbmVlZHMgdG8gdXBkYXRlIHRoZSByZXNwb25zZSByYXRlIHRhYmxlCisJCSAqIGFjY29yZGluZ2x5LiBlLmcuIGlmIG9uZSBvZiB0aGUgMTFhIHJhdGVzIGlzCisJCSAqIGJhc2ljIHJhdGUsIHRoZW4gdGhhdCByYXRlIGNhbiBiZSB1c2VkIGZvciBzZW5kaW5nCisJCSAqIGNvbnRyb2wgZnJhbWVzLgorCQkgKiBIQUwgdXBkYXRlcyB0aGUgcmVzcG9uc2UgcmF0ZSB0YWJsZSB3aGVuZXZlciBiYXNpYworCQkgKiByYXRlIHNldCBpcyBjaGFuZ2VkLgorCQkgKi8KKwkJaWYgKGJhc2ljX29ubHkgJiYgdGVtcF9yYXRlX3NldC5yYXRlW21pbl0gJiAweDgwKSB7CisJCQlpZiAoaXNfYXJhdGUpCisJCQkJcmF0ZXMtPmxsYVJhdGVzW2FfcmF0ZV9pbmRleCsrXSA9CisJCQkJCXRlbXBfcmF0ZV9zZXQucmF0ZVttaW5dOworCQkJZWxzZQorCQkJCXJhdGVzLT5sbGJSYXRlc1tiX3JhdGVfaW5kZXgrK10gPQorCQkJCQl0ZW1wX3JhdGVfc2V0LnJhdGVbbWluXTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpc19hcmF0ZSkKKwkJCQlyYXRlcy0+bGxhUmF0ZXNbYV9yYXRlX2luZGV4KytdID0KKwkJCQkJdGVtcF9yYXRlX3NldC5yYXRlW21pbl07CisJCQllbHNlCisJCQkJcmF0ZXMtPmxsYlJhdGVzW2JfcmF0ZV9pbmRleCsrXSA9CisJCQkJCXRlbXBfcmF0ZV9zZXQucmF0ZVttaW5dOworCQl9CisJCXRlbXBfcmF0ZV9zZXQucmF0ZVttaW5dID0gMHhmZjsKKwl9CisKKwlpZiAoSVNfRE9UMTFfTU9ERV9IVChzZWxmX3N0YV9kb3QxMW1vZGUpKSB7CisJCXZhbCA9IFNJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVQ7CisJCWlmICh3bGFuX2NmZ19nZXRfc3RyKG1hY19jdHgsIFdOSV9DRkdfU1VQUE9SVEVEX01DU19TRVQsCisJCQkJICAgICByYXRlcy0+c3VwcG9ydGVkTUNTU2V0LAorCQkJCSAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkvKiBDb3VsZCBub3QgZ2V0IHJhdGVzZXQgZnJvbSBDRkcuIExvZyBlcnJvci4gKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIHN1cHBvcnRlZE1DU1NldCIpKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKgorCQkgKiBpZiBzdXBwb3J0ZWQgTUNTIFNldCBvZiB0aGUgcGVlciBpcyBwYXNzZWQgaW4sCisJCSAqIHRoZW4gZG8gdGhlIGludGVyc2VjdGlvbgorCQkgKiBlbHNlIHVzZSB0aGUgTUNTIHNldCBmcm9tIGxvY2FsIENGRy4KKwkJICovCisKKwkJaWYgKHN1cHBvcnRlZF9tY3Nfc2V0ICE9IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBTSVJfTUFDX01BWF9TVVBQT1JURURfTUNTX1NFVDsgaSsrKQorCQkJCXJhdGVzLT5zdXBwb3J0ZWRNQ1NTZXRbaV0gJj0KKwkJCQkJIHN1cHBvcnRlZF9tY3Nfc2V0W2ldOworCQl9CisKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cyLCBGTCgiTUNTIFJhdGUgU2V0IEJpdG1hcDogIikpOworCQlmb3IgKGkgPSAwOyBpIDwgU0lSX01BQ19NQVhfU1VQUE9SVEVEX01DU19TRVQ7IGkrKykKKwkJCVBFTE9HMihsaW1fbG9nKG1hY19jdHgsIExPRzIsIEZMKCIleCAiKSwKKwkJCQkgICAgICAgcmF0ZXMtPnN1cHBvcnRlZE1DU1NldFtpXSk7KQorCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWxpbV9wb3B1bGF0ZV92aHRfbWNzX3NldChtYWNfY3R4LCByYXRlcywgdmh0X2NhcHMsIHNlc3Npb25fZW50cnkpOworI2VuZGlmCisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworZXJyb3I6CisJcmV0dXJuIGVTSVJfRkFJTFVSRTsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCit0U2lyUmV0U3RhdHVzCitsaW1fcG9wdWxhdGVfcGVlcl9yYXRlX3NldCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgdHBTaXJTdXBwb3J0ZWRSYXRlcyBwUmF0ZXMsCisJCQkgICB1aW50OF90ICpwU3VwcG9ydGVkTUNTU2V0LAorCQkJICAgdWludDhfdCBiYXNpY09ubHksCisJCQkgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LCB0RG90MTFmSUVWSFRDYXBzICpwVkhUQ2FwcykKKyNlbHNlCit0U2lyUmV0U3RhdHVzCitsaW1fcG9wdWxhdGVfcGVlcl9yYXRlX3NldCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgdHBTaXJTdXBwb3J0ZWRSYXRlcyBwUmF0ZXMsCisJCQkgICB1aW50OF90ICpwU3VwcG9ydGVkTUNTU2V0LAorCQkJICAgdWludDhfdCBiYXNpY09ubHksIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCisjZW5kaWYKK3sKKwl0U2lyTWFjUmF0ZVNldCB0ZW1wUmF0ZVNldDsKKwl0U2lyTWFjUmF0ZVNldCB0ZW1wUmF0ZVNldDI7CisJdWludDMyX3QgaSwgaiwgdmFsLCBtaW4sIGlzQXJhdGU7CisJaXNBcmF0ZSA9IDA7CisKKwkvKiBjb3B5IG9wZXJhdGlvbmFsIHJhdGUgc2V0IGZyb20gcHNlc3Npb25FbnRyeSAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5yYXRlU2V0Lm51bVJhdGVzIDw9IFNJUl9NQUNfUkFURVNFVF9FSURfTUFYKSB7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSB0ZW1wUmF0ZVNldC5yYXRlLAorCQkJICAgICAodWludDhfdCAqKSAocHNlc3Npb25FbnRyeS0+cmF0ZVNldC5yYXRlKSwKKwkJCSAgICAgcHNlc3Npb25FbnRyeS0+cmF0ZVNldC5udW1SYXRlcyk7CisJCXRlbXBSYXRlU2V0Lm51bVJhdGVzID0gcHNlc3Npb25FbnRyeS0+cmF0ZVNldC5udW1SYXRlczsKKwl9IGVsc2UgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgibW9yZSB0aGFuIFNJUl9NQUNfUkFURVNFVF9FSURfTUFYIHJhdGVzXG4iKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmICgocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUcpIHx8CisJCShwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExQSkgfHwKKwkJKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFBQykgfHwKKwkJKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFOKSkgeworCQlpZiAocHNlc3Npb25FbnRyeS0+ZXh0UmF0ZVNldC5udW1SYXRlcyA8PQorCQkgICAgU0lSX01BQ19SQVRFU0VUX0VJRF9NQVgpIHsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSB0ZW1wUmF0ZVNldDIucmF0ZSwKKwkJCQkgICAgICh1aW50OF90ICopIChwc2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0LgorCQkJCQkJICByYXRlKSwKKwkJCQkgICAgIHBzZXNzaW9uRW50cnktPmV4dFJhdGVTZXQubnVtUmF0ZXMpOworCQkJdGVtcFJhdGVTZXQyLm51bVJhdGVzID0KKwkJCQlwc2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0Lm51bVJhdGVzOworCQl9IGVsc2UgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgicHNlc3Npb25FbnRyeS0+ZXh0UmF0ZVNldC5udW1SYXRlcyBtb3JlIHRoYW4gU0lSX01BQ19SQVRFU0VUX0VJRF9NQVggcmF0ZXNcbiIpKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9IGVsc2UKKwkJdGVtcFJhdGVTZXQyLm51bVJhdGVzID0gMDsKKwlpZiAoKHRlbXBSYXRlU2V0Lm51bVJhdGVzICsgdGVtcFJhdGVTZXQyLm51bVJhdGVzKSA+CisJICAgIFNJUl9NQUNfUkFURVNFVF9FSURfTUFYKSB7CisJCS8qIHdlIGFyZSBpbiBiaWcgdHJvdWJsZSAqLworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJtb3JlIHRoYW4gMTIgcmF0ZXMgaW4gQ0ZHIikpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGNvcHkgYWxsIHJhdGVzIGluIHRlbXBSYXRlU2V0LCB0aGVyZSBhcmUgMTIgcmF0ZXMgbWF4ICovCisJZm9yIChpID0gMDsgaSA8IHRlbXBSYXRlU2V0Mi5udW1SYXRlczsgaSsrKQorCQl0ZW1wUmF0ZVNldC5yYXRlW2kgKyB0ZW1wUmF0ZVNldC5udW1SYXRlc10gPQorCQkJdGVtcFJhdGVTZXQyLnJhdGVbaV07CisJdGVtcFJhdGVTZXQubnVtUmF0ZXMgKz0gdGVtcFJhdGVTZXQyLm51bVJhdGVzOworCS8qKgorCSAqIFNvcnQgcmF0ZXMgaW4gdGVtcFJhdGVTZXQgKHRoZXkgYXJlIGxpa2VseSB0byBiZSBhbHJlYWR5IHNvcnRlZCkKKwkgKiBwdXQgdGhlIHJlc3VsdCBpbiBwU3VwcG9ydGVkUmF0ZXMKKwkgKi8KKwl7CisJCXVpbnQ4X3QgYVJhdGVJbmRleCA9IDA7CisJCXVpbnQ4X3QgYlJhdGVJbmRleCA9IDA7CisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBSYXRlcywgc2l6ZW9mKHRTaXJTdXBwb3J0ZWRSYXRlcyksIDApOworCQlmb3IgKGkgPSAwOyBpIDwgdGVtcFJhdGVTZXQubnVtUmF0ZXM7IGkrKykgeworCQkJbWluID0gMDsKKwkJCXZhbCA9IDB4ZmY7CisJCQlpc0FyYXRlID0gMDsKKwkJCWZvciAoaiA9IDA7CisJCQkgICAgIChqIDwgdGVtcFJhdGVTZXQubnVtUmF0ZXMpCisJCQkgICAgICYmIChqIDwgU0lSX01BQ19SQVRFU0VUX0VJRF9NQVgpOyBqKyspIHsKKwkJCQlpZiAoKHVpbnQzMl90KSAodGVtcFJhdGVTZXQucmF0ZVtqXSAmIDB4N2YpIDwKKwkJCQkgICAgdmFsKSB7CisJCQkJCXZhbCA9IHRlbXBSYXRlU2V0LnJhdGVbal0gJiAweDdmOworCQkJCQltaW4gPSBqOworCQkJCX0KKwkJCX0KKwkJCWlmIChzaXJJc0FyYXRlKHRlbXBSYXRlU2V0LnJhdGVbbWluXSAmIDB4N2YpKQorCQkJCWlzQXJhdGUgPSAxOworCQkJLyoKKwkJCSAqIEhBTCBuZWVkcyB0byBrbm93IHdoZXRoZXIgdGhlIHJhdGUgaXMgYmFzaWMgcmF0ZSBvciBub3QsIGFzIGl0IG5lZWRzIHRvCisJCQkgKiB1cGRhdGUgdGhlIHJlc3BvbnNlIHJhdGUgdGFibGUgYWNjb3JkaW5nbHkuIGUuZy4gaWYgb25lIG9mIHRoZSAxMWEgcmF0ZXMgaXMKKwkJCSAqIGJhc2ljIHJhdGUsIHRoZW4gdGhhdCByYXRlIGNhbiBiZSB1c2VkIGZvciBzZW5kaW5nIGNvbnRyb2wgZnJhbWVzLgorCQkJICogSEFMIHVwZGF0ZXMgdGhlIHJlc3BvbnNlIHJhdGUgdGFibGUgd2hlbmV2ZXIgYmFzaWMgcmF0ZSBzZXQgaXMgY2hhbmdlZC4KKwkJCSAqLworCQkJaWYgKGJhc2ljT25seSkgeworCQkJCWlmICh0ZW1wUmF0ZVNldC5yYXRlW21pbl0gJiAweDgwKSB7CisJCQkJCWlmIChpc0FyYXRlKQorCQkJCQkJcFJhdGVzLT5sbGFSYXRlc1thUmF0ZUluZGV4KytdID0KKwkJCQkJCQl0ZW1wUmF0ZVNldC5yYXRlW21pbl07CisJCQkJCWVsc2UKKwkJCQkJCXBSYXRlcy0+bGxiUmF0ZXNbYlJhdGVJbmRleCsrXSA9CisJCQkJCQkJdGVtcFJhdGVTZXQucmF0ZVttaW5dOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlzQXJhdGUpCisJCQkJCXBSYXRlcy0+bGxhUmF0ZXNbYVJhdGVJbmRleCsrXSA9CisJCQkJCQl0ZW1wUmF0ZVNldC5yYXRlW21pbl07CisJCQkJZWxzZQorCQkJCQlwUmF0ZXMtPmxsYlJhdGVzW2JSYXRlSW5kZXgrK10gPQorCQkJCQkJdGVtcFJhdGVTZXQucmF0ZVttaW5dOworCQkJfQorCQkJdGVtcFJhdGVTZXQucmF0ZVttaW5dID0gMHhmZjsKKwkJfQorCX0KKworCWlmIChJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSkpIHsKKwkJdmFsID0gU0laRV9PRl9TVVBQT1JURURfTUNTX1NFVDsKKwkJaWYgKHdsYW5fY2ZnX2dldF9zdHIocE1hYywgV05JX0NGR19TVVBQT1JURURfTUNTX1NFVCwKKwkJCQkgICAgIHBSYXRlcy0+c3VwcG9ydGVkTUNTU2V0LAorCQkJCSAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkvKiAvIENvdWxkIG5vdCBnZXQgcmF0ZXNldCBmcm9tIENGRy4gTG9nIGVycm9yLiAqLworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgc3VwcG9ydGVkTUNTU2V0IikpOworCQkJICAgICAgICkKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJLyogaWYgc3VwcG9ydGVkIE1DUyBTZXQgb2YgdGhlIHBlZXIgaXMgcGFzc2VkIGluLCB0aGVuIGRvIHRoZSBpbnRlcnNlY3Rpb24gKi8KKwkJLyogZWxzZSB1c2UgdGhlIE1DUyBzZXQgZnJvbSBsb2NhbCBDRkcuICovCisJCWlmIChwU3VwcG9ydGVkTUNTU2V0ICE9IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBTSVJfTUFDX01BWF9TVVBQT1JURURfTUNTX1NFVDsgaSsrKQorCQkJCXBSYXRlcy0+c3VwcG9ydGVkTUNTU2V0W2ldICY9CisJCQkJCXBTdXBwb3J0ZWRNQ1NTZXRbaV07CisJCX0KKwkJUEVMT0cyKGxpbV9sb2cocE1hYywgTE9HMiwgRkwoIk1DUyBSYXRlIFNldCBCaXRtYXA6ICIpKTspCisJCWZvciAoaSA9IDA7IGkgPCBTSVJfTUFDX01BWF9TVVBQT1JURURfTUNTX1NFVDsgaSsrKQorCQkJUEVMT0cyKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzIsIEZMKCIleCAiKSwKKwkJCQkgICAgICAgcFJhdGVzLT5zdXBwb3J0ZWRNQ1NTZXRbaV0pOworCQkJICAgICAgICkKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlsaW1fcG9wdWxhdGVfdmh0X21jc19zZXQocE1hYywgcFJhdGVzLCBwVkhUQ2FwcywgcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworZXJyb3I6CisJcmV0dXJuIGVTSVJfRkFJTFVSRTsKK30gLyoqKiBsaW1fcG9wdWxhdGVfcGVlcl9yYXRlX3NldCgpICoqKi8KKworLyoqCisgKiBsaW1fcG9wdWxhdGVfbWF0Y2hpbmdfcmF0ZV9zZXQoKSAtcHJvY2VzcyB0aGUgQ0ZHIHJhdGUgc2V0cyBhbmQKKyAqICAgICAgICAgIHRoZSByYXRlIHNldHMgcmVjZWl2ZWQgaW4gdGhlIEFzc29jIHJlcXVlc3Qgb24gQVAuCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICogQHN0YV9kczogc3RhdGlvbiBub2RlCisgKiBAb3Blcl9yYXRlX3NldDogcG9pbnRlciB0byBvcGVyYXRpbmcgcmF0ZSBzZXQKKyAqIEBleHRfcmF0ZV9zZXQ6IHBvaW50ZXIgdG8gZXh0ZW5kZWQgcmF0ZSBzZXQKKyAqIEBzdXBwb3J0ZWRfbWNzX3NldDogcG9pbnRlciB0byBzdXBwb3J0ZWQgcmF0ZSBzZXQKKyAqIEBzZXNzaW9uX2VudHJ5OiBwb2ludGVyIHRvIHBlIHNlc3Npb24gZW50cnkKKyAqIEB2aHRfY2FwczogcG9pbnRlciB0byB2aHQgY2FwYWJpbGl0aWVzCisgKgorICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIHRpbWUgb2YgQXNzb2NpYXRpb24gUmVxdWVzdAorICogcHJvY2Vzc2luZyBvbiBBUCBhbmQgd2hpbGUgYWRkaW5nIHBlZXIncyBjb250ZXh0CisgKiBpbiBJQlNTIHJvbGUgdG8gcHJvY2VzcyB0aGUgQ0ZHIHJhdGUgc2V0cyBhbmQKKyAqIHRoZSByYXRlIHNldHMgcmVjZWl2ZWQgaW4gdGhlIEFzc29jIHJlcXVlc3Qgb24gQVAKKyAqIG9yIEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBmcm9tIHBlZXIgaW4gSUJTUy4KKyAqCisgKiAxLiBJdCBtYWtlcyB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gb3VyIG93biByYXRlIFNhdAorICogICAgYW5kIGV4dGVtY2RlZCByYXRlIHNldCBhbmQgdGhlIG9uZXMgcmVjZWl2ZWQgaW4gdGhlCisgKiAgICBhc3NvY2lhdGlvbiByZXF1ZXN0LgorICogMi4gSXQgY3JlYXRlcyBhIGNvbWJpbmVkIHJhdGUgc2V0IG9mIDEyIHJhdGVzIG1heCB3aGljaAorICogICAgY29tcHJpc2VkIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgcmF0ZXMKKyAqIDMuIEl0IHNvcnRzIHRoZSBjb21iaW5lZCByYXRlIFNldCBhbmQgY29weSBpdCBpbiB0aGUKKyAqICAgIHJhdGUgYXJyYXkgb2YgdGhlIHBTVEEgZGVzY3JpcHRvcgorICoKKyAqIFRoZSBwYXJzZXIgaGFzIGFscmVhZHkgZW5zdXJlZCB1bmljaXR5IG9mIHRoZSByYXRlcyBpbiB0aGUKKyAqIGFzc29jaWF0aW9uIHJlcXVlc3Qgc3RydWN0dXJlCisgKgorICogUmV0dXJuOiBlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcyBlbHNlIGVTSVJfRkFJTFVSRQorICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKK3RTaXJSZXRTdGF0dXMKK2xpbV9wb3B1bGF0ZV9tYXRjaGluZ19yYXRlX3NldCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0cERwaEhhc2hOb2RlIHN0YV9kcywKKwl0U2lyTWFjUmF0ZVNldCAqb3Blcl9yYXRlX3NldCwgdFNpck1hY1JhdGVTZXQgKmV4dF9yYXRlX3NldCwKKwl1aW50OF90ICpzdXBwb3J0ZWRfbWNzX3NldCwgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSwKKwl0RG90MTFmSUVWSFRDYXBzICogdmh0X2NhcHMpCisjZWxzZQordFNpclJldFN0YXR1cworbGltX3BvcHVsYXRlX21hdGNoaW5nX3JhdGVfc2V0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwRHBoSGFzaE5vZGUgc3RhX2RzLAorCXRTaXJNYWNSYXRlU2V0ICpvcGVyX3JhdGVfc2V0LCB0U2lyTWFjUmF0ZVNldCAqZXh0X3JhdGVfc2V0LAorCXVpbnQ4X3QgKnN1cHBvcnRlZF9tY3Nfc2V0LCB0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQorI2VuZGlmCit7CisJdFNpck1hY1JhdGVTZXQgdGVtcF9yYXRlX3NldDsKKwl0U2lyTWFjUmF0ZVNldCB0ZW1wX3JhdGVfc2V0MjsKKwl1aW50MzJfdCBpLCBqLCB2YWwsIG1pbiwgaXNfYXJhdGU7CisJdWludDMyX3QgcGh5X21vZGU7CisJdWludDhfdCBtY3Nfc2V0W1NJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVRdOworCXRwU2lyU3VwcG9ydGVkUmF0ZXMgcmF0ZXM7CisJdWludDhfdCBhX3JhdGVfaW5kZXggPSAwOworCXVpbnQ4X3QgYl9yYXRlX2luZGV4ID0gMDsKKworCWlzX2FyYXRlID0gMDsKKworCWxpbV9nZXRfcGh5X21vZGUobWFjX2N0eCwgJnBoeV9tb2RlLCBzZXNzaW9uX2VudHJ5KTsKKworCS8qIGNvcHkgb3BlcmF0aW9uYWwgcmF0ZSBzZXQgZnJvbSBzZXNzaW9uX2VudHJ5ICovCisJY2RmX21lbV9jb3B5KCh0ZW1wX3JhdGVfc2V0LnJhdGUpLCAoc2Vzc2lvbl9lbnRyeS0+cmF0ZVNldC5yYXRlKSwKKwkJICAgICBzZXNzaW9uX2VudHJ5LT5yYXRlU2V0Lm51bVJhdGVzKTsKKwl0ZW1wX3JhdGVfc2V0Lm51bVJhdGVzID0gKHVpbnQ4X3QpIHNlc3Npb25fZW50cnktPnJhdGVTZXQubnVtUmF0ZXM7CisKKwlpZiAocGh5X21vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpIHsKKwkJY2RmX21lbV9jb3B5KCh0ZW1wX3JhdGVfc2V0Mi5yYXRlKSwKKwkJCSAgICAgKHNlc3Npb25fZW50cnktPmV4dFJhdGVTZXQucmF0ZSksCisJCQkgICAgIHNlc3Npb25fZW50cnktPmV4dFJhdGVTZXQubnVtUmF0ZXMpOworCQl0ZW1wX3JhdGVfc2V0Mi5udW1SYXRlcyA9CisJCQkodWludDhfdCkgc2Vzc2lvbl9lbnRyeS0+ZXh0UmF0ZVNldC5udW1SYXRlczsKKwl9IGVsc2UgeworCQl0ZW1wX3JhdGVfc2V0Mi5udW1SYXRlcyA9IDA7CisJfQorCisJaWYgKCh0ZW1wX3JhdGVfc2V0Lm51bVJhdGVzICsgdGVtcF9yYXRlX3NldDIubnVtUmF0ZXMpID4gMTIpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgibW9yZSB0aGFuIDEyIHJhdGVzIGluIENGRyIpKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKgorCSAqIEhhbmRsaW5nIG9mIHRoZSByYXRlIHNldCBJRXMgaXMgdGhlIGZvbGxvd2luZzoKKwkgKiAtIGtlZXAgb25seSByYXRlcyB0aGF0IHdlIHN1cHBvcnQgYW5kIHRoYXQgdGhlIHN0YXRpb24gc3VwcG9ydHMKKwkgKiAtIHNvcnQgYW5kIHRoZSByYXRlcyBpbnRvIHRoZSBwU3RhLT5yYXRlIGFycmF5CisJICovCisKKwkvKiBDb3B5IGFsbCByYXRlcyBpbiB0ZW1wX3JhdGVfc2V0LCB0aGVyZSBhcmUgMTIgcmF0ZXMgbWF4ICovCisJZm9yIChpID0gMDsgaSA8IHRlbXBfcmF0ZV9zZXQyLm51bVJhdGVzOyBpKyspCisJCXRlbXBfcmF0ZV9zZXQucmF0ZVtpICsgdGVtcF9yYXRlX3NldC5udW1SYXRlc10gPQorCQkJdGVtcF9yYXRlX3NldDIucmF0ZVtpXTsKKworCXRlbXBfcmF0ZV9zZXQubnVtUmF0ZXMgKz0gdGVtcF9yYXRlX3NldDIubnVtUmF0ZXM7CisKKwkvKgorCSAqIFNvcnQgcmF0ZXMgaW4gdGVtcF9yYXRlX3NldCAodGhleSBhcmUgbGlrZWx5IHRvIGJlIGFscmVhZHkgc29ydGVkKQorCSAqIHB1dCB0aGUgcmVzdWx0IGluIHRlbXBfcmF0ZV9zZXQyCisJICovCisJdGVtcF9yYXRlX3NldDIubnVtUmF0ZXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHRlbXBfcmF0ZV9zZXQubnVtUmF0ZXM7IGkrKykgeworCQltaW4gPSAwOworCQl2YWwgPSAweGZmOworCisJCWZvciAoaiA9IDA7IGogPCB0ZW1wX3JhdGVfc2V0Lm51bVJhdGVzOyBqKyspCisJCQlpZiAoKHVpbnQzMl90KSAodGVtcF9yYXRlX3NldC5yYXRlW2pdICYgMHg3ZikgPCB2YWwpIHsKKwkJCQl2YWwgPSB0ZW1wX3JhdGVfc2V0LnJhdGVbal0gJiAweDdmOworCQkJCW1pbiA9IGo7CisJCQl9CisKKwkJdGVtcF9yYXRlX3NldDIucmF0ZVt0ZW1wX3JhdGVfc2V0Mi5udW1SYXRlcysrXSA9CisJCQl0ZW1wX3JhdGVfc2V0LnJhdGVbbWluXTsKKwkJdGVtcF9yYXRlX3NldC5yYXRlW21pbl0gPSAweGZmOworCX0KKworCS8qCisJICogQ29weSByZWNlaXZlZCByYXRlcyBpbiB0ZW1wX3JhdGVfc2V0LCB0aGUgcGFyc2VyIGhhcyBlbnN1cmVkCisJICogdW5pY2l0eSBvZiB0aGUgcmF0ZXMgc28gdGhlcmUgY2Fubm90IGJlIG1vcmUgdGhhbiAxMgorCSAqLworCWZvciAoaSA9IDA7IChpIDwgb3Blcl9yYXRlX3NldC0+bnVtUmF0ZXMgJiYKKwkJCSBpIDwgU0lSX01BQ19SQVRFU0VUX0VJRF9NQVgpOyBpKyspCisJCXRlbXBfcmF0ZV9zZXQucmF0ZVtpXSA9IG9wZXJfcmF0ZV9zZXQtPnJhdGVbaV07CisKKwl0ZW1wX3JhdGVfc2V0Lm51bVJhdGVzID0gb3Blcl9yYXRlX3NldC0+bnVtUmF0ZXM7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzIsCisJCSJTdW0gb2YgU1VQUE9SVEVEIGFuZCBFWFRFTkRFRCBSYXRlIFNldCAoJTFkKSIsCisJCXRlbXBfcmF0ZV9zZXQubnVtUmF0ZXMgKyBleHRfcmF0ZV9zZXQtPm51bVJhdGVzKTsKKworCWlmIChleHRfcmF0ZV9zZXQtPm51bVJhdGVzICYmCisJCSgodGVtcF9yYXRlX3NldC5udW1SYXRlcyArIGV4dF9yYXRlX3NldC0+bnVtUmF0ZXMpID4gMTIpICYmCisJCXRlbXBfcmF0ZV9zZXQubnVtUmF0ZXMgPCAxMikgeworCQlpbnQgZm91bmQgPSAwOworCQlpbnQgdGFpbCA9IHRlbXBfcmF0ZV9zZXQubnVtUmF0ZXM7CisKKwkJZm9yIChpID0gMDsgKGkgPCBleHRfcmF0ZV9zZXQtPm51bVJhdGVzICYmCisJCQkJaSA8IFNJUl9NQUNfUkFURVNFVF9FSURfTUFYKTsgaSsrKSB7CisJCQlmb3VuZCA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgKHVpbnQzMl90KSB0YWlsOyBqKyspIHsKKwkJCQlpZiAoKHRlbXBfcmF0ZV9zZXQucmF0ZVtqXSAmIDB4N0YpID09CisJCQkJCShleHRfcmF0ZV9zZXQtPnJhdGVbaV0gJiAweDdGKSkgeworCQkJCQlmb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCFmb3VuZCkgeworCQkJCXRlbXBfcmF0ZV9zZXQucmF0ZVt0ZW1wX3JhdGVfc2V0Lm51bVJhdGVzKytdID0KKwkJCQkJCWV4dF9yYXRlX3NldC0+cmF0ZVtpXTsKKwkJCQlpZiAodGVtcF9yYXRlX3NldC5udW1SYXRlcyA+PSAxMikKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGV4dF9yYXRlX3NldC0+bnVtUmF0ZXMgJiYKKwkJICgodGVtcF9yYXRlX3NldC5udW1SYXRlcyArIGV4dF9yYXRlX3NldC0+bnVtUmF0ZXMpIDw9IDEyKSkgeworCQlmb3IgKGogPSAwOyAoKGogPCBleHRfcmF0ZV9zZXQtPm51bVJhdGVzKSAmJgorCQkJCSAoaiA8IFNJUl9NQUNfUkFURVNFVF9FSURfTUFYKSAmJgorCQkJCSAoKGkgKyBqKSA8IFNJUl9NQUNfUkFURVNFVF9FSURfTUFYKSk7IGorKykKKwkJCXRlbXBfcmF0ZV9zZXQucmF0ZVtpICsgal0gPSBleHRfcmF0ZV9zZXQtPnJhdGVbal07CisKKwkJdGVtcF9yYXRlX3NldC5udW1SYXRlcyArPSBleHRfcmF0ZV9zZXQtPm51bVJhdGVzOworCX0gZWxzZSBpZiAoZXh0X3JhdGVfc2V0LT5udW1SYXRlcykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzIsCisJCQkgIlJlbHlpbmcgb25seSBvbiB0aGUgU1VQUE9SVEVEIFJhdGUgU2V0IElFLi4uIik7CisJfQorCisKKwlyYXRlcyA9ICZzdGFfZHMtPnN1cHBvcnRlZFJhdGVzOworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHJhdGVzLCBzaXplb2YodFNpclN1cHBvcnRlZFJhdGVzKSwgMCk7CisJZm9yIChpID0gMDsgKGkgPCB0ZW1wX3JhdGVfc2V0Mi5udW1SYXRlcyAmJgorCQkJIGkgPCBTSVJfTUFDX1JBVEVTRVRfRUlEX01BWCk7IGkrKykgeworCQlmb3IgKGogPSAwOyAoaiA8IHRlbXBfcmF0ZV9zZXQubnVtUmF0ZXMgJiYKKwkJCQkgaiA8IFNJUl9NQUNfUkFURVNFVF9FSURfTUFYKTsgaisrKSB7CisJCQlpZiAoKHRlbXBfcmF0ZV9zZXQyLnJhdGVbaV0gJiAweDdGKSAhPQorCQkJCSh0ZW1wX3JhdGVfc2V0LnJhdGVbal0gJiAweDdGKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNpcklzQXJhdGUodGVtcF9yYXRlX3NldDIucmF0ZVtpXSAmIDB4N2YpICYmCisJCQkJYV9yYXRlX2luZGV4IDwgU0lSX05VTV8xMUFfUkFURVMpIHsKKwkJCQlpc19hcmF0ZSA9IDE7CisJCQkJcmF0ZXMtPmxsYVJhdGVzW2FfcmF0ZV9pbmRleCsrXSA9CisJCQkJCQkJdGVtcF9yYXRlX3NldDIucmF0ZVtpXTsKKwkJCX0gZWxzZSBpZiAoKGJfcmF0ZV9pbmRleCA8IFNJUl9OVU1fMTFCX1JBVEVTKSAmJgorCQkJCSEoc2lySXNBcmF0ZSh0ZW1wX3JhdGVfc2V0Mi5yYXRlW2ldICYgMHg3ZikpKSB7CisJCQkJcmF0ZXMtPmxsYlJhdGVzW2JfcmF0ZV9pbmRleCsrXSA9CisJCQkJCXRlbXBfcmF0ZV9zZXQyLnJhdGVbaV07CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogTm93IGFkZCB0aGUgUG9sYXJpcyByYXRlcyBvbmx5IHdoZW4gUHJvcHJpZXRhcnkgcmF0ZXMgYXJlIGVuYWJsZWQuCisJICogY29tcHV0ZSB0aGUgbWF0Y2hpbmcgTUNTIHJhdGUgc2V0LCBpZiBwZWVyIGlzIDExbiBjYXBhYmxlIGFuZCBzZWxmCisJICogbW9kZSBpcyAxMW4KKwkgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWlmIChzdGFfZHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5KQorI2Vsc2UKKwlpZiAoSVNfRE9UMTFfTU9ERV9IVChzZXNzaW9uX2VudHJ5LT5kb3QxMW1vZGUpICYmCisJCShzdGFfZHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5KSkKKyNlbmRpZgorCXsKKwkJdmFsID0gU0laRV9PRl9TVVBQT1JURURfTUNTX1NFVDsKKwkJaWYgKHdsYW5fY2ZnX2dldF9zdHIobWFjX2N0eCwgV05JX0NGR19TVVBQT1JURURfTUNTX1NFVCwKKwkJCQkgICAgIG1jc19zZXQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJLyogQ291bGQgbm90IGdldCByYXRlc2V0IGZyb20gQ0ZHLiBMb2cgZXJyb3IuICovCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBzdXBwb3J0ZWRNQ1NldCIpKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspCisJCQlzdGFfZHMtPnN1cHBvcnRlZFJhdGVzLnN1cHBvcnRlZE1DU1NldFtpXSA9CisJCQkJbWNzX3NldFtpXSAmIHN1cHBvcnRlZF9tY3Nfc2V0W2ldOworCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJCUZMKCJsaW1fcG9wdWxhdGVfbWF0Y2hpbmdfcmF0ZV9zZXQ6IE1DUyBSYXRlIFNldCBCaXRtYXAiCisJCQkJIiBmcm9tICBDRkcgYW5kIERQSCA6ICIpKTsKKwkJZm9yIChpID0gMDsgaSA8IFNJUl9NQUNfTUFYX1NVUFBPUlRFRF9NQ1NfU0VUOyBpKyspIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwgRkwoIiV4ICV4ICIpLCBtY3Nfc2V0W2ldLAorCQkJICAgIHN0YV9kcy0+c3VwcG9ydGVkUmF0ZXMuc3VwcG9ydGVkTUNTU2V0W2ldKTsKKwkJfQorCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWxpbV9wb3B1bGF0ZV92aHRfbWNzX3NldChtYWNfY3R4LCAmc3RhX2RzLT5zdXBwb3J0ZWRSYXRlcywgdmh0X2NhcHMsCisJCQkJIHNlc3Npb25fZW50cnkpOworI2VuZGlmCisJLyoKKwkgKiBTZXQgdGhlIGVycEVuYWJsZWQgYml0IGlmIHRoZSBwaHkgaXMgaW4gRyBtb2RlIGFuZCBhdCBsZWFzdAorCSAqIG9uZSBBIHJhdGUgaXMgc3VwcG9ydGVkCisJICovCisJaWYgKChwaHlfbW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykgJiYgaXNfYXJhdGUpCisJCXN0YV9kcy0+ZXJwRW5hYmxlZCA9IGVIQUxfU0VUOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworZXJyb3I6CisKKwlyZXR1cm4gZVNJUl9GQUlMVVJFOworfQorCisvKioKKyAqIGxpbV9wb3B1bGF0ZV92aHRfY2FwcygpIC0gcG9wdWxhdGVzIHZodCBjYXBhYmlsaXRpZXMgYmFzZWQgb24gaW5wdXQKKyAqICAgICAgICBjYXBhYmlsaXRpZXMKKyAqIEBpbnB1dF9jYXBzOiBpbnB1dCBjYXBhYmlsaXRpZXMgYmFzZWQgb24gd2hpY2ggd2UgZm9ybWF0IHRoZSB2aHQKKyAqICAgICAgY2FwYWJpbGl0aWVzCisgKgorICogZnVuY3Rpb24gdG8gcG9wdWxhdGUgdGhlIHN1cHBvcnRlZCB2aHQgY2FwYWJpbGl0aWVzLgorICoKKyAqIFJldHVybjogdmh0IGNhcGFiaWxpdGllcyBkZXJpdmVkIGJhc2VkIG9uIGlucHV0IHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBsaW1fcG9wdWxhdGVfdmh0X2NhcHModERvdDExZklFVkhUQ2FwcyBpbnB1dF9jYXBzKQoreworCXVpbnQzMl90IHZodF9jYXBzOworCisJdmh0X2NhcHMgPSAoKGlucHV0X2NhcHMubWF4TVBEVUxlbiA8PCBTSVJfTUFDX1ZIVF9DQVBfTUFYX01QRFVfTEVOKSB8CisJCQkoaW5wdXRfY2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPDwKKwkJCQkgU0lSX01BQ19WSFRfQ0FQX1NVUFBfQ0hfV0lEVEhfU0VUKSB8CisJCQkoaW5wdXRfY2Fwcy5sZHBjQ29kaW5nQ2FwIDw8CisJCQkJU0lSX01BQ19WSFRfQ0FQX0xEUENfQ09ESU5HX0NBUCkgfAorCQkJKGlucHV0X2NhcHMuc2hvcnRHSTgwTUh6IDw8CisJCQkJIFNJUl9NQUNfVkhUX0NBUF9TSE9SVEdJXzgwTUhaKSB8CisJCQkoaW5wdXRfY2Fwcy5zaG9ydEdJMTYwYW5kODBwbHVzODBNSHogPDwKKwkJCQlTSVJfTUFDX1ZIVF9DQVBfU0hPUlRHSV8xNjBfODBfODBNSFopIHwKKwkJCShpbnB1dF9jYXBzLnR4U1RCQyA8PCBTSVJfTUFDX1ZIVF9DQVBfVFhTVEJDKSB8CisJCQkoaW5wdXRfY2Fwcy5yeFNUQkMgPDwgU0lSX01BQ19WSFRfQ0FQX1JYU1RCQykgfAorCQkJKGlucHV0X2NhcHMuc3VCZWFtRm9ybWVyQ2FwIDw8CisJCQkJU0lSX01BQ19WSFRfQ0FQX1NVX0JFQU1GT1JNRVJfQ0FQKSB8CisJCQkoaW5wdXRfY2Fwcy5zdUJlYW1mb3JtZWVDYXAgPDwKKwkJCQlTSVJfTUFDX1ZIVF9DQVBfU1VfQkVBTUZPUk1FRV9DQVApIHwKKwkJCShpbnB1dF9jYXBzLmNzbm9mQmVhbWZvcm1lckFudFN1cCA8PAorCQkJCVNJUl9NQUNfVkhUX0NBUF9DU05fQkVBTU9STUVSX0FOVF9TVVApIHwKKwkJCShpbnB1dF9jYXBzLm51bVNvdW5kaW5nRGltIDw8CisJCQkJU0lSX01BQ19WSFRfQ0FQX05VTV9TT1VORElOR19ESU0pIHwKKwkJCShpbnB1dF9jYXBzLm11QmVhbWZvcm1lckNhcCA8PAorCQkJCVNJUl9NQUNfVkhUX0NBUF9OVU1fQkVBTV9GT1JNRVJfQ0FQKSB8CisJCQkoaW5wdXRfY2Fwcy5tdUJlYW1mb3JtZWVDYXAgPDwKKwkJCQlTSVJfTUFDX1ZIVF9DQVBfTlVNX0JFQU1fRk9STUVFX0NBUCkgfAorCQkJKGlucHV0X2NhcHMudmh0VFhPUFBTIDw8CisJCQkJU0lSX01BQ19WSFRfQ0FQX1RYT1BQUykgfAorCQkJKGlucHV0X2NhcHMuaHRjVkhUQ2FwIDw8CisJCQkJIFNJUl9NQUNfVkhUX0NBUF9IVENfQ0FQKSB8CisJCQkoaW5wdXRfY2Fwcy5tYXhBTVBEVUxlbkV4cCA8PAorCQkJCVNJUl9NQUNfVkhUX0NBUF9NQVhfQU1EVV9MRU5fRVhQTykgfAorCQkJKGlucHV0X2NhcHMudmh0TGlua0FkYXB0Q2FwIDw8CisJCQkJU0lSX01BQ19WSFRfQ0FQX0xJTktfQURBUFRfQ0FQKSB8CisJCQkoaW5wdXRfY2Fwcy5yeEFudFBhdHRlcm4gPDwKKwkJCQlTSVJfTUFDX1ZIVF9DQVBfUlhfQU5URU5OQV9QQVRURVJOKSB8CisJCQkoaW5wdXRfY2Fwcy50eEFudFBhdHRlcm4gPDwKKwkJCQlTSVJfTUFDX1ZIVF9DQVBfVFhfQU5URU5OQV9QQVRURVJOKSB8CisJCQkoaW5wdXRfY2Fwcy5yZXNlcnZlZDEgPDwKKwkJCQlTSVJfTUFDX1ZIVF9DQVBfUkVTRVJWRUQyKSk7CisKKwlyZXR1cm4gdmh0X2NhcHM7Cit9CisvKioKKyAqIGxpbV9hZGRfc3RhKCktIGNhbGxlZCB0byBhZGQgYW4gU1RBIGNvbnRleHQgYXQgaGFyZHdhcmUKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgKiBAc3RhX2RzOiBzdGF0aW9uIG5vZGUKKyAqIEB1cGRhdGVfZW50cnk6IHNldCB0byB0cnVlIGZvciB1cGRhdGluZyB0aGUgZW50cnkKKyAqIEBzZXNzaW9uX2VudHJ5OiBwZSBzZXNzaW9uIGVudHJ5CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGFuIFNUQSBjb250ZXh0IGF0IGhhcmR3YXJlCisgKiB3aGVuZXZlciBhIFNUQSBpcyAoUmUpIEFzc29jaWF0ZWQuCisgKgorICogUmV0dXJuOiBlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcyBlbHNlIGVTaXJSZXRTdGF0dXMgZmFpbHVyZSBjb2RlcworICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbV9hZGRfc3RhKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdHBEcGhIYXNoTm9kZSBzdGFfZHMsIHVpbnQ4X3QgdXBkYXRlX2VudHJ5LCB0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXRwQWRkU3RhUGFyYW1zIGFkZF9zdGFfcGFyYW1zID0gTlVMTDsKKwl0U2lyTXNnUSBtc2dfcTsKKwl0U2lyUmV0U3RhdHVzIHJldF9jb2RlID0gZVNJUl9TVUNDRVNTOworCXRTaXJNYWNBZGRyIHN0YV9tYWMsICpzdGFfQWRkcjsKKwl1aW50OF90IGksIG53X3R5cGVfMTFiID0gMDsKKwl0cFNpckFzc29jUmVxIGFzc29jX3JlcTsKKwl0TGltSWJzc1BlZXJOb2RlICpwZWVyX25vZGU7IC8qIGZvciBJQlNTIG1vZGUgKi8KKwl1aW50OF90ICpwMnBfaWUgPSBOVUxMOworCisJc2lyX2NvcHlfbWFjX2FkZHIoc3RhX21hYywgc2Vzc2lvbl9lbnRyeS0+c2VsZk1hY0FkZHIpOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgic2Vzc2lvbmlkOiAlZCB1cGRhdGVfZW50cnkgPSAlZCBsaW1zeXN0ZW1yb2xlID0gJWQgIiksCisJCXNlc3Npb25fZW50cnktPnNtZVNlc3Npb25JZCwgdXBkYXRlX2VudHJ5LAorCQlHRVRfTElNX1NZU1RFTV9ST0xFKHNlc3Npb25fZW50cnkpKTsKKworCWFkZF9zdGFfcGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBZGRTdGFQYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBhZGRfc3RhX3BhcmFtcykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgQUREX1NUQSIpKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgYWRkX3N0YV9wYXJhbXMsIHNpemVvZih0QWRkU3RhUGFyYW1zKSwgMCk7CisKKwlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgfHwgTElNX0lTX0lCU1NfUk9MRShzZXNzaW9uX2VudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpCisJCXN0YV9BZGRyID0gJnN0YV9kcy0+c3RhQWRkcjsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCS8qIFN5c3RlbVJvbGUgc2hvdWxkbid0IGJlIG1hdHRlciBpZiBzdGFUeXBlIGlzIFRETFMgcGVlciAqLworCWVsc2UgaWYgKFNUQV9FTlRSWV9URExTX1BFRVIgPT0gc3RhX2RzLT5zdGFUeXBlKQorCQlzdGFfQWRkciA9ICZzdGFfZHMtPnN0YUFkZHI7CisjZW5kaWYKKwllbHNlCisJCXN0YV9BZGRyID0gJnN0YV9tYWM7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKE1BQ19BRERSRVNTX1NUUiAiOiBTdWJ0eXBlKEFzc29jL1JlYXNzb2MpOiAlZCIpLAorCQlNQUNfQUREUl9BUlJBWSgqc3RhX0FkZHIpLCBzdGFfZHMtPm1sbVN0YUNvbnRleHQuc3ViVHlwZSk7CisKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgYWRkX3N0YV9wYXJhbXMtPnN0YU1hYywKKwkJICAgICAodWludDhfdCAqKSAqc3RhX0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBhZGRfc3RhX3BhcmFtcy0+YnNzSWQsCisJCSAgICAgc2Vzc2lvbl9lbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCWNkZl9tZW1fY29weSgmYWRkX3N0YV9wYXJhbXMtPmNhcGFiX2luZm8sCisJCSAgICAgJnN0YV9kcy0+bWxtU3RhQ29udGV4dC5jYXBhYmlsaXR5SW5mbywKKwkJICAgICBzaXplb2YoYWRkX3N0YV9wYXJhbXMtPmNhcGFiX2luZm8pKTsKKworCWxpbV9maWxsX3N1cHBvcnRlZF9yYXRlc19pbmZvKG1hY19jdHgsIHN0YV9kcywgJnN0YV9kcy0+c3VwcG9ydGVkUmF0ZXMsCisJCQkJICAgICAgc2Vzc2lvbl9lbnRyeSk7CisKKwkvKiBDb3B5IGxlZ2FjeSByYXRlcyAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmYWRkX3N0YV9wYXJhbXMtPnN1cHBvcnRlZFJhdGVzLAorCQkgICAgICh1aW50OF90ICopICZzdGFfZHMtPnN1cHBvcnRlZFJhdGVzLAorCQkgICAgIHNpemVvZih0U2lyU3VwcG9ydGVkUmF0ZXMpKTsKKworCWFkZF9zdGFfcGFyYW1zLT5hc3NvY0lkID0gc3RhX2RzLT5hc3NvY0lkOworCisJYWRkX3N0YV9wYXJhbXMtPndtbUVuYWJsZWQgPSBzdGFfZHMtPnFvc01vZGU7CisJYWRkX3N0YV9wYXJhbXMtPmxpc3RlbkludGVydmFsID0gc3RhX2RzLT5tbG1TdGFDb250ZXh0Lmxpc3RlbkludGVydmFsOworCWFkZF9zdGFfcGFyYW1zLT5zaG9ydFByZWFtYmxlU3VwcG9ydGVkID0gc3RhX2RzLT5zaG9ydFByZWFtYmxlRW5hYmxlZDsKKwlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgJiYKKwkgICAoc3RhX2RzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUgPT0gTElNX1JFQVNTT0MpKSB7CisJCS8qCisJCSAqIFRCRCAtIG5lZWQgdG8gcmVtb3ZlIHRoaXMgUkVBU1NPQyBjaGVjaworCQkgKiBhZnRlciBmaXhpbmYgcm1tb2QgaXNzdWUKKwkJICovCisJCWFkZF9zdGFfcGFyYW1zLT51cGRhdGVTdGEgPSBzdGFfZHMtPm1sbVN0YUNvbnRleHQudXBkYXRlQ29udGV4dDsKKwl9CisJc3RhX2RzLT52YWxpZCA9IDA7CisJc3RhX2RzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0gZUxJTV9NTE1fV1RfQUREX1NUQV9SU1BfU1RBVEU7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzIsCisJCUZMKCIgQXNzb2MgSUQ6ICVkIHdtbUVuYWJsZWQgPSAlZCBsaXN0ZW5JbnRlcnZhbCA9ICVkIgorCQkgICAiIHNob3J0UHJlYW1ibGVTdXBwb3J0ZWQ6ICVkICIpLCBhZGRfc3RhX3BhcmFtcy0+YXNzb2NJZCwKKwkJYWRkX3N0YV9wYXJhbXMtPndtbUVuYWJsZWQsIGFkZF9zdGFfcGFyYW1zLT5saXN0ZW5JbnRlcnZhbCwKKwkJYWRkX3N0YV9wYXJhbXMtPnNob3J0UHJlYW1ibGVTdXBwb3J0ZWQpOworCS8qIFRoaXMgd2lsbCBpbmRpY2F0ZSBIQUwgdG8gImFsbG9jYXRlIiBhIG5ldyBTVEEgaW5kZXggKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCS8qCisJICogQXMgdGhlcmUgaXMgY29ybmVyIGNhc2UgaW4tYmV0d2VlbiBhZGRfc3RhIGFuZCBjaGFuZ2Vfc3RhLGlmIGRlbF9zdGEKKwkgKiBmb3Igb3RoZXIgc3RhSWR4IGhhcHBlbmVkLCBmaXJtd2FyZSByZXR1cm4gd3Jvbmcgc3RhSWR4CisJICogKHJlY2VudGx5IHJlbW92ZWQgc3RhSWR4KS4gVW50aWwgd2UgZ2V0IGEgY29uZmlybWF0aW9uIGZyb20gdGhlCisJICogZmlybXdhcmUgdGVhbSBpdCBpcyBub3cgcmV0dXJuIGNvcnJlY3Qgc3RhSWR4IGZvciBzYW1lIHN0YV9tYWNfYWRkcgorCSAqIGZvciB1cGRhdGUgY2FzZSwgd2Ugd2FudCB0byBnZXQgYXJvdW5kIGl0IGJ5IHBhc3NpbmcgdmFsaWQgc3RhSWR4CisJICogZ2l2ZW4gYnkgYWRkX3N0YSB0aW1lLgorCSAqLworCWlmICgoU1RBX0VOVFJZX1RETFNfUEVFUiA9PSBzdGFfZHMtPnN0YVR5cGUpICYmICh0cnVlID09IHVwZGF0ZV9lbnRyeSkpCisJCWFkZF9zdGFfcGFyYW1zLT5zdGFJZHggPSBzdGFfZHMtPnN0YUluZGV4OworCWVsc2UKKyNlbmRpZgorCWFkZF9zdGFfcGFyYW1zLT5zdGFJZHggPSBTVEFfSU5WQUxJRF9JRFg7CisJYWRkX3N0YV9wYXJhbXMtPnN0YVR5cGUgPSBzdGFfZHMtPnN0YVR5cGU7CisKKwlhZGRfc3RhX3BhcmFtcy0+dXBkYXRlU3RhID0gdXBkYXRlX2VudHJ5OworCisJYWRkX3N0YV9wYXJhbXMtPnN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlhZGRfc3RhX3BhcmFtcy0+cmVzcFJlcWQgPSAxOworCS8qIFVwZGF0ZSBIVCBDYXBhYmlsaXR5ICovCisKKwlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgfHwKKwkgICAgTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb25fZW50cnkpIHx8CisJICAgIExJTV9JU19JQlNTX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJYWRkX3N0YV9wYXJhbXMtPmh0Q2FwYWJsZSA9IHN0YV9kcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHk7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJYWRkX3N0YV9wYXJhbXMtPnZodENhcGFibGUgPQorCQkJIHN0YV9kcy0+bWxtU3RhQ29udGV4dC52aHRDYXBhYmlsaXR5OworI2VuZGlmCisJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJLyogU3lzdGVtUm9sZSBzaG91bGRuJ3QgYmUgbWF0dGVyIGlmIHN0YVR5cGUgaXMgVERMUyBwZWVyICovCisJZWxzZSBpZiAoU1RBX0VOVFJZX1RETFNfUEVFUiA9PSBzdGFfZHMtPnN0YVR5cGUpIHsKKwkJYWRkX3N0YV9wYXJhbXMtPmh0Q2FwYWJsZSA9IHN0YV9kcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHk7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJYWRkX3N0YV9wYXJhbXMtPnZodENhcGFibGUgPQorCQkJIHN0YV9kcy0+bWxtU3RhQ29udGV4dC52aHRDYXBhYmlsaXR5OworI2VuZGlmCisJfQorI2VuZGlmCisJZWxzZSB7CisJCWFkZF9zdGFfcGFyYW1zLT5odENhcGFibGUgPSBzZXNzaW9uX2VudHJ5LT5odENhcGFiaWxpdHk7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJYWRkX3N0YV9wYXJhbXMtPnZodENhcGFibGUgPSBzZXNzaW9uX2VudHJ5LT52aHRDYXBhYmlsaXR5OworI2VuZGlmCisKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlsaW1fbG9nKG1hY19jdHgsIExPRzIsIEZMKCJ2aHRDYXBhYmxlOiAlZCAiKSwKKwkJIGFkZF9zdGFfcGFyYW1zLT52aHRDYXBhYmxlKTsKKyNlbmRpZgorCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwgRkwoIiBTdGFJZHg6ICVkIHVwZGF0ZVN0YSA9ICVkIGh0Y2FwYWJsZSA9ICVkICIpLAorCQlhZGRfc3RhX3BhcmFtcy0+c3RhSWR4LCBhZGRfc3RhX3BhcmFtcy0+dXBkYXRlU3RhLAorCQlhZGRfc3RhX3BhcmFtcy0+aHRDYXBhYmxlKTsKKworCWFkZF9zdGFfcGFyYW1zLT5ncmVlbkZpZWxkQ2FwYWJsZSA9IHN0YV9kcy0+aHRHcmVlbmZpZWxkOworCWFkZF9zdGFfcGFyYW1zLT5tYXhBbXBkdURlbnNpdHkgPSBzdGFfZHMtPmh0QU1wZHVEZW5zaXR5OworCWFkZF9zdGFfcGFyYW1zLT5tYXhBbXBkdVNpemUgPSBzdGFfZHMtPmh0TWF4UnhBTXBkdUZhY3RvcjsKKwlhZGRfc3RhX3BhcmFtcy0+ZkRzc3NDY2tNb2RlNDBNaHogPSBzdGFfZHMtPmh0RHNzc0Nja1JhdGU0ME1IelN1cHBvcnQ7CisJYWRkX3N0YV9wYXJhbXMtPmZTaG9ydEdJMjBNaHogPSBzdGFfZHMtPmh0U2hvcnRHSTIwTWh6OworCWFkZF9zdGFfcGFyYW1zLT5mU2hvcnRHSTQwTWh6ID0gc3RhX2RzLT5odFNob3J0R0k0ME1oejsKKwlhZGRfc3RhX3BhcmFtcy0+bHNpZ1R4b3BQcm90ZWN0aW9uID0gc3RhX2RzLT5odExzaWdUWE9QUHJvdGVjdGlvbjsKKwlhZGRfc3RhX3BhcmFtcy0+bWF4QW1zZHVTaXplID0gc3RhX2RzLT5odE1heEFtc2R1TGVuZ3RoOworCWFkZF9zdGFfcGFyYW1zLT5jaF93aWR0aCA9IHN0YV9kcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJYWRkX3N0YV9wYXJhbXMtPm1pbW9QUyA9IHN0YV9kcy0+aHRNSU1PUFNTdGF0ZTsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJRkwoImdyZWVuRmllbGRDYXBhYmxlOiAlZCBtYXhBbXBkdURlbnNpdHkgPSAlZCBtYXhBbXBkdURlbnNpdHkgPSAlZCIpLAorCQlhZGRfc3RhX3BhcmFtcy0+Z3JlZW5GaWVsZENhcGFibGUsCisJCSBhZGRfc3RhX3BhcmFtcy0+bWF4QW1wZHVEZW5zaXR5LCBhZGRfc3RhX3BhcmFtcy0+bWF4QW1wZHVTaXplKTsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJRkwoImZEc3NzQ2NrTW9kZTQwTWh6OiAlZCBmU2hvcnRHSTIwTWh6OiAlZCBmU2hvcnRHSTQwTWh6OiAlZCIpLAorCQlhZGRfc3RhX3BhcmFtcy0+ZkRzc3NDY2tNb2RlNDBNaHosCisJCSBhZGRfc3RhX3BhcmFtcy0+ZlNob3J0R0kyME1oeiwJYWRkX3N0YV9wYXJhbXMtPmZTaG9ydEdJNDBNaHopOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cyLAorCQlGTCgibHNpZ1R4b3BQcm90ZWN0aW9uOiAlZCBtYXhBbXNkdVNpemU6ICVkIHR4Q2hhbm5lbFdpZHRoOiAlZCBtaW1vUFM6ICVkICIpLAorCQlhZGRfc3RhX3BhcmFtcy0+bHNpZ1R4b3BQcm90ZWN0aW9uLAorCQlhZGRfc3RhX3BhcmFtcy0+bWF4QW1zZHVTaXplLCBhZGRfc3RhX3BhcmFtcy0+Y2hfd2lkdGgsCisJCWFkZF9zdGFfcGFyYW1zLT5taW1vUFMpOworCisJaWYgKGFkZF9zdGFfcGFyYW1zLT52aHRDYXBhYmxlKSB7CisJCWlmIChzdGFfZHMtPnZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkKKwkJCWFkZF9zdGFfcGFyYW1zLT5jaF93aWR0aCA9CisJCQkJc3RhX2RzLT52aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKyAxOworCisJCWFkZF9zdGFfcGFyYW1zLT52aHRTdXBwb3J0ZWRSeE5zcyA9IHN0YV9kcy0+dmh0U3VwcG9ydGVkUnhOc3M7CisJCWFkZF9zdGFfcGFyYW1zLT52aHRUeEJGQ2FwYWJsZSA9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwkJCSgoU1RBX0VOVFJZX1BFRVIgPT0gc3RhX2RzLT5zdGFUeXBlKQorCQkJIHx8IChTVEFfRU5UUllfVERMU19QRUVSID09IHN0YV9kcy0+c3RhVHlwZSkpID8KKwkJCQkJIHN0YV9kcy0+dmh0QmVhbUZvcm1lckNhcGFibGUgOgorCQkJCQkgc2Vzc2lvbl9lbnRyeS0+dHhCRkluaUZlYXR1cmVFbmFibGVkOworI2Vsc2UKKwkJCShTVEFfRU5UUllfUEVFUiA9PSBzdGFfZHMtPnN0YVR5cGUpID8KKwkJCQkJIHN0YV9kcy0+dmh0QmVhbUZvcm1lckNhcGFibGUgOgorCQkJCQkgc2Vzc2lvbl9lbnRyeS0+dHhCRkluaUZlYXR1cmVFbmFibGVkOworI2VuZGlmCisJCWFkZF9zdGFfcGFyYW1zLT5lbmFibGVfc3VfdHhfYmZvcm1lciA9CisJCQlzdGFfZHMtPnZodF9zdV9iZmVlX2NhcGFibGU7CisJfQorCisJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiVHhDaFdpZHRoICVkIHZodFR4QkZDYXAgJWQsIHN1X2JmZXIgJWQiKSwKKwkJYWRkX3N0YV9wYXJhbXMtPmNoX3dpZHRoLCBhZGRfc3RhX3BhcmFtcy0+dmh0VHhCRkNhcGFibGUsCisJCWFkZF9zdGFfcGFyYW1zLT5lbmFibGVfc3VfdHhfYmZvcm1lcik7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwlpZiAoKFNUQV9FTlRSWV9QRUVSID09IHN0YV9kcy0+c3RhVHlwZSkgfHwKKwkJKFNUQV9FTlRSWV9URExTX1BFRVIgPT0gc3RhX2RzLT5zdGFUeXBlKSkKKyNlbHNlCisJaWYgKFNUQV9FTlRSWV9QRUVSID09IHN0YV9kcy0+c3RhVHlwZSkKKyNlbmRpZgorCXsKKwkJLyoKKwkJICogcGVlciBTVEEgZ2V0IHRoZSBMRFBDIGNhcGFiaWxpdHkgZnJvbSBzdGFfZHMsCisJCSAqIHdoaWNoIHBvcHVsYXRlZCBmcm9tCisJCSAqIEhUL1ZIVCBjYXBhYmlsaXR5CisJCSAqLworCQlpZiAoYWRkX3N0YV9wYXJhbXMtPnZodFR4QkZDYXBhYmxlCisJCSAgICAmJiBtYWNfY3R4LT5saW0uZGlzYWJsZUxEUENXaXRoVHhiZkFQKSB7CisJCQlhZGRfc3RhX3BhcmFtcy0+aHRMZHBjQ2FwYWJsZSA9IDA7CisJCQlhZGRfc3RhX3BhcmFtcy0+dmh0TGRwY0NhcGFibGUgPSAwOworCQl9IGVsc2UgeworCQkJYWRkX3N0YV9wYXJhbXMtPmh0TGRwY0NhcGFibGUgPSBzdGFfZHMtPmh0TGRwY0NhcGFibGU7CisJCQlhZGRfc3RhX3BhcmFtcy0+dmh0TGRwY0NhcGFibGUgPSBzdGFfZHMtPnZodExkcGNDYXBhYmxlOworCQl9CisJfSBlbHNlIGlmIChTVEFfRU5UUllfU0VMRiA9PSBzdGFfZHMtPnN0YVR5cGUpIHsKKwkJLyogRm9yIFNlbGYgU1RBIGdldCB0aGUgTERQQyBjYXBhYmlsaXR5IGZyb20gY29uZmlnLmluaSAqLworCQlhZGRfc3RhX3BhcmFtcy0+aHRMZHBjQ2FwYWJsZSA9CisJCQkoc2Vzc2lvbl9lbnRyeS0+dHhMZHBjSW5pRmVhdHVyZUVuYWJsZWQgJiAweDAxKTsKKwkJYWRkX3N0YV9wYXJhbXMtPnZodExkcGNDYXBhYmxlID0KKwkJCSgoc2Vzc2lvbl9lbnRyeS0+dHhMZHBjSW5pRmVhdHVyZUVuYWJsZWQgPj4gMSkgJiAweDAxKTsKKwl9CisKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJRCAqLworCWFkZF9zdGFfcGFyYW1zLT5zZXNzaW9uSWQgPSBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZDsKKworCS8qIFVwZGF0ZSBTTUUgc2Vzc2lvbiBJRCAqLworCWFkZF9zdGFfcGFyYW1zLT5zbWVzZXNzaW9uSWQgPSBzZXNzaW9uX2VudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKwlhZGRfc3RhX3BhcmFtcy0+bWF4VHhQb3dlciA9IHNlc3Npb25fZW50cnktPm1heFR4UG93ZXI7CisKKwlpZiAoc2Vzc2lvbl9lbnRyeS0+cGFyc2VkQXNzb2NSZXEgIT0gTlVMTCkgeworCQl1aW50MTZfdCBhaWQgPSBzdGFfZHMtPmFzc29jSWQ7CisJCS8qIEdldCBhIGNvcHkgb2YgdGhlIGFscmVhZHkgcGFyc2VkIEFzc29jIFJlcXVlc3QgKi8KKwkJYXNzb2NfcmVxID0KKwkJCSh0cFNpckFzc29jUmVxKSBzZXNzaW9uX2VudHJ5LT5wYXJzZWRBc3NvY1JlcVthaWRdOworCQlpZiAoYXNzb2NfcmVxICYmIGFzc29jX3JlcS0+YWRkSUVQcmVzZW50CisJCSAgICAmJiBhc3NvY19yZXEtPmFkZElFLmxlbmd0aCkgeworCQkJcDJwX2llID0gbGltR2V0UDJwSUVQdHIobWFjX2N0eCwKKwkJCQkJYXNzb2NfcmVxLT5hZGRJRS5hZGRJRWRhdGEsCisJCQkJCWFzc29jX3JlcS0+YWRkSUUubGVuZ3RoKTsKKwkJfQorCisJCWFkZF9zdGFfcGFyYW1zLT5wMnBDYXBhYmxlU3RhID0gKHAycF9pZSAhPSBOVUxMKTsKKwkJaWYgKGFzc29jX3JlcSAmJiBhZGRfc3RhX3BhcmFtcy0+aHRDYXBhYmxlKSB7CisJCQljZGZfbWVtX2NvcHkoJmFkZF9zdGFfcGFyYW1zLT5odF9jYXBzLAorCQkJCSAgICAgKCh1aW50OF90ICopICZhc3NvY19yZXEtPkhUQ2FwcykgKyAxLAorCQkJCSAgICAgc2l6ZW9mKGFkZF9zdGFfcGFyYW1zLT5odF9jYXBzKSk7CisJCX0KKworCQlpZiAoYXNzb2NfcmVxICYmIGFkZF9zdGFfcGFyYW1zLT52aHRDYXBhYmxlKQorCQkJYWRkX3N0YV9wYXJhbXMtPnZodF9jYXBzID0KKwkJCQkgbGltX3BvcHVsYXRlX3ZodF9jYXBzKGFzc29jX3JlcS0+VkhUQ2Fwcyk7CisJfSBlbHNlIGlmIChMSU1fSVNfSUJTU19ST0xFKHNlc3Npb25fZW50cnkpKSB7CisKKwkJLyoKKwkJICogaW4gSUJTUyBtb2RlLCB1c2UgcGVlciBub2RlIGFzIHRoZSBzb3VyY2Ugb2YgaHRfY2FwcworCQkgKiBhbmQgdmh0X2NhcHMKKwkJICovCisJCXBlZXJfbm9kZSA9IGxpbV9pYnNzX3BlZXJfZmluZChtYWNfY3R4LCAqc3RhX0FkZHIpOworCQlpZiAoIXBlZXJfbm9kZSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJDYW4ndCBmaW5kIElCU1MgcGVlciBub2RlIGZvciBBRERfU1RBIikpOworCQkJcmV0dXJuIGVTSVJfSEFMX1NUQV9ET0VTX05PVF9FWElTVDsKKwkJfQorCisJCWlmIChwZWVyX25vZGUtPmF0aW1JZVByZXNlbnQpIHsKKwkJCWFkZF9zdGFfcGFyYW1zLT5hdGltSWVQcmVzZW50ID0KKwkJCQkgcGVlcl9ub2RlLT5hdGltSWVQcmVzZW50OworCQkJYWRkX3N0YV9wYXJhbXMtPnBlZXJBdGltV2luZG93TGVuZ3RoID0KKwkJCQlwZWVyX25vZGUtPnBlZXJBdGltV2luZG93TGVuZ3RoOworCQl9CisKKwkJYWRkX3N0YV9wYXJhbXMtPmh0X2NhcHMgPQorCQkJKHBlZXJfbm9kZS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPDwKKwkJCSBTSVJfTUFDX0hUX0NBUF9DSFdJRFRINDBfUykgfAorCQkJKHBlZXJfbm9kZS0+aHRHcmVlbmZpZWxkIDw8CisJCQkgU0lSX01BQ19IVF9DQVBfR1JFRU5GSUVMRF9TKSB8CisJCQkocGVlcl9ub2RlLT5odFNob3J0R0kyME1oeiA8PAorCQkJIFNJUl9NQUNfSFRfQ0FQX1NIT1JUR0kyME1IWl9TKSB8CisJCQkocGVlcl9ub2RlLT5odFNob3J0R0k0ME1oeiA8PAorCQkJIFNJUl9NQUNfSFRfQ0FQX1NIT1JUR0k0ME1IWl9TKSB8CisJCQkoU0lSX01BQ19UWFNUQkMgPDwKKwkJCSBTSVJfTUFDX0hUX0NBUF9UWFNUQkNfUykgfAorCQkJKFNJUl9NQUNfUlhTVEJDIDw8CisJCQkgU0lSX01BQ19IVF9DQVBfUlhTVEJDX1MpIHwKKwkJCShwZWVyX25vZGUtPmh0TWF4QW1zZHVMZW5ndGggPDwKKwkJCSBTSVJfTUFDX0hUX0NBUF9NQVhBTVNEVVNJWkVfUykgfAorCQkJKHBlZXJfbm9kZS0+aHREc3NzQ2NrUmF0ZTQwTUh6U3VwcG9ydCA8PAorCQkJIFNJUl9NQUNfSFRfQ0FQX0RTU1NDQ0s0MF9TKTsKKworCQlhZGRfc3RhX3BhcmFtcy0+dmh0X2NhcHMgPQorCQkJIGxpbV9wb3B1bGF0ZV92aHRfY2FwcyhwZWVyX25vZGUtPlZIVENhcHMpOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWlmIChTVEFfRU5UUllfVERMU19QRUVSID09IHN0YV9kcy0+c3RhVHlwZSkgeworCQlhZGRfc3RhX3BhcmFtcy0+aHRfY2FwcyA9IHN0YV9kcy0+aHRfY2FwczsKKwkJYWRkX3N0YV9wYXJhbXMtPnZodF9jYXBzID0gc3RhX2RzLT52aHRfY2FwczsKKworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkgIEZMKCJTdGEgdHlwZSBpcyBURExTX1BFRVIsIGh0X2NhcHM6IDB4JXgsIHZodF9jYXBzOiAweCV4IiksCisJCQkgIGFkZF9zdGFfcGFyYW1zLT5odF9jYXBzLAorCQkJICBhZGRfc3RhX3BhcmFtcy0+dmh0X2NhcHMpOworCX0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwlpZiAoc3RhX2RzLT53bWVFbmFibGVkICYmCisJICAgKExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpIHx8CisJICAgKFNUQV9FTlRSWV9URExTX1BFRVIgPT0gc3RhX2RzLT5zdGFUeXBlKSkpCisjZWxzZQorCWlmIChzdGFfZHMtPndtZUVuYWJsZWQgJiYgTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpCisjZW5kaWYKKwl7CisJCWFkZF9zdGFfcGFyYW1zLT51QVBTRCA9IDA7CisJCS8qCisJCSAqIHVwZGF0ZSBVQVBTRCBhbmQgc2VuZCBpdCB0byBMSU0gdG8gYWRkIFNUQQorCQkgKiBiaXRtYXAgTVNCIDwtIExTQiBNU0IgNCBiaXRzIGFyZSBmb3IKKwkJICogdHJpZ2dlciBlbmFibGVkIEFDIHNldHRpbmcgYW5kIExTQiA0IGJpdHMKKwkJICogYXJlIGZvciBkZWxpdmVyeSBlbmFibGVkIEFDIHNldHRpbmcKKwkJICogNyAgIDYgICAgNSAgICA0ICAgIDMgICAgMiAgICAxICAgIDAKKwkJICogQkUgIEJLICAgVkkgICBWTyAgIEJFICAgQksgICBWSSAgIFZPCisJCSAqLworCQlhZGRfc3RhX3BhcmFtcy0+dUFQU0QgfD0KKwkJCXN0YV9kcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mby5hY3ZvX3VhcHNkOworCQlhZGRfc3RhX3BhcmFtcy0+dUFQU0QgfD0KKwkJCShzdGFfZHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8uYWN2aV91YXBzZCA8PCAxKTsKKwkJYWRkX3N0YV9wYXJhbXMtPnVBUFNEIHw9CisJCQkoc3RhX2RzLT5xb3MuY2FwYWJpbGl0eS5xb3NJbmZvLmFjYmtfdWFwc2QgPDwgMik7CisJCWFkZF9zdGFfcGFyYW1zLT51QVBTRCB8PQorCQkJKHN0YV9kcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mby5hY2JlX3VhcHNkIDw8IDMpOworCQkvKgorCQkgKiBtYWtpbmcgZGVsaXZlcnkgZW5hYmxlZCBhbmQKKwkJICogdHJpZ2dlciBlbmFibGVkIHNldHRpbmcgdGhlIHNhbWUuCisJCSAqLworCQlhZGRfc3RhX3BhcmFtcy0+dUFQU0QgfD0gYWRkX3N0YV9wYXJhbXMtPnVBUFNEIDw8IDQ7CisKKwkJYWRkX3N0YV9wYXJhbXMtPm1heFNQTGVuID0KKwkJCXN0YV9kcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mby5tYXhTcExlbjsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgidUFQU0QgPSAweCV4LCBtYXhTcExlbiA9ICVkIiksCisJCQlhZGRfc3RhX3BhcmFtcy0+dUFQU0QsIGFkZF9zdGFfcGFyYW1zLT5tYXhTUExlbik7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwlhZGRfc3RhX3BhcmFtcy0+cm1mRW5hYmxlZCA9IHN0YV9kcy0+cm1mRW5hYmxlZDsKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJQTUYgZW5hYmxlZCAlZCIpLAorCQkJIGFkZF9zdGFfcGFyYW1zLT5ybWZFbmFibGVkKTsKKyNlbmRpZgorCisJbGltX2xvZyhtYWNfY3R4LCBMT0cyLCBGTCgiaHRMZHBjQ2FwYWJsZTogJWQgdmh0TGRwY0NhcGFibGU6ICVkICIKKwkJCSAgICAgICAicDJwQ2FwYWJsZVN0YTogJWQiKSwKKwkJYWRkX3N0YV9wYXJhbXMtPmh0TGRwY0NhcGFibGUsIGFkZF9zdGFfcGFyYW1zLT52aHRMZHBjQ2FwYWJsZSwKKwkJYWRkX3N0YV9wYXJhbXMtPnAycENhcGFibGVTdGEpOworCisJLyoKKwkgKiB3ZSBuZWVkIHRvIGRlZmVyIHRoZSBtZXNzYWdlIHVudGlsIHdlIGdldCB0aGUKKwkgKiByZXNwb25zZSBiYWNrIGZyb20gSEFMLgorCSAqLworCWlmIChhZGRfc3RhX3BhcmFtcy0+cmVzcFJlcWQpCisJCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKG1hY19jdHgsIGZhbHNlKTsKKworCWZvciAoaSA9IDA7IGkgPCBTSVJfTlVNXzExQV9SQVRFUzsgaSsrKSB7CisJCWlmIChzaXJJc0FyYXRlKHN0YV9kcy0+c3VwcG9ydGVkUmF0ZXMubGxhUmF0ZXNbaV0gJiAweDdGKSkgeworCQkJbndfdHlwZV8xMWIgPSAwOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlud190eXBlXzExYiA9IDE7CisJCX0KKwl9CisJaWYgKG53X3R5cGVfMTFiKQorCQlhZGRfc3RhX3BhcmFtcy0+bndUeXBlID0gZVNJUl8xMUJfTldfVFlQRTsKKwllbHNlCisJCWFkZF9zdGFfcGFyYW1zLT5ud1R5cGUgPSBzZXNzaW9uX2VudHJ5LT5ud1R5cGU7CisKKwltc2dfcS50eXBlID0gV01BX0FERF9TVEFfUkVROworCisJbXNnX3EucmVzZXJ2ZWQgPSAwOworCW1zZ19xLmJvZHlwdHIgPSBhZGRfc3RhX3BhcmFtczsKKwltc2dfcS5ib2R5dmFsID0gMDsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlNlbmRpbmcgV01BX0FERF9TVEFfUkVRIGZvciBhc3NvY0lkICVkIiksCisJCXN0YV9kcy0+YXNzb2NJZCk7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgobWFjX2N0eCwgc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkgbXNnX3EudHlwZSkpOworCisJcmV0X2NvZGUgPSB3bWFfcG9zdF9jdHJsX21zZyhtYWNfY3R4LCAmbXNnX3EpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gcmV0X2NvZGUpIHsKKwkJaWYgKGFkZF9zdGFfcGFyYW1zLT5yZXNwUmVxZCkKKwkJCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKG1hY19jdHgsIHRydWUpOworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiQUREX1NUQV9SRVEgZm9yIGFJZCAlZCBmYWlsZWQgKHJlYXNvbiAlWCkiKSwKKwkJCXN0YV9kcy0+YXNzb2NJZCwgcmV0X2NvZGUpOworCQljZGZfbWVtX2ZyZWUoYWRkX3N0YV9wYXJhbXMpOworCX0KKworCXJldHVybiByZXRfY29kZTsKK30KKworLyoqCisgKiBsaW1fZGVsX3N0YSgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVsZXRlIGFuIFNUQSBjb250ZXh0IGF0IGhhcmR3YXJlCisgKiB3aGVuZXZlciBhIFNUQSBpcyBkaXNhc3NvY2lhdGVkCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzICAtIFBvaW50ZXIgdG8gdGhlIFNUQSBkYXRhc3RydWN0dXJlIGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgIExJTSBhbmQgbWFpbnRhaW5lZCBieSBEUEgKKyAqIEBwYXJhbSAgZlJlc3BSZXFkIC0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBkZWxldGUgaXMgc3luY2hyb25vdXMgKHRydWUpCisgKiAgICAgICAgICAgICAgICAgICBvciBub3QgKGZhbHNlKQorICogQHJldHVybiByZXRDb2RlIC0gSW5kaWNhdGVzIHN1Y2Nlc3Mgb3IgZmFpbHVyZSByZXR1cm4gY29kZQorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbV9kZWxfc3RhKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzLCBib29sIGZSZXNwUmVxZCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0cERlbGV0ZVN0YVBhcmFtcyBwRGVsU3RhUGFyYW1zID0gTlVMTDsKKwl0U2lyTXNnUSBtc2dROworCXRTaXJSZXRTdGF0dXMgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKworCXBEZWxTdGFQYXJhbXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodERlbGV0ZVN0YVBhcmFtcykpOworCWlmIChOVUxMID09IHBEZWxTdGFQYXJhbXMpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIEFERF9TVEEiKSk7CisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJfQorCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcERlbFN0YVBhcmFtcywgc2l6ZW9mKHREZWxldGVTdGFQYXJhbXMpLCAwKTsKKworCS8qICovCisJLyogRFBIIGNvbnRhaW5zIHRoZSBTVEEgaW5kZXggb25seSBmb3IgInBlZXIiIFNUQSBlbnRyaWVzLiAqLworCS8qIExJTSBnbG9iYWwgY29udGFpbnMgInNlbGYiIFNUQSBpbmRleCAqLworCS8qIFRodXMsICovCisJLyogICAgaWYoIFNUQSByb2xlICkgKi8KKwkvKiAgICAgIGdldCBTVEEgaW5kZXggZnJvbSBMSU0gZ2xvYmFsICovCisJLyogICAgZWxzZSAqLworCS8qICAgICAgZ2V0IFNUQSBpbmRleCBmcm9tIERQSCAqLworCS8qICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWlmICgoTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpICYmCisJICAgIChwU3RhRHMtPnN0YVR5cGUgIT0gU1RBX0VOVFJZX1RETFNfUEVFUikpIHx8CisJICAgIExJTV9JU19CVF9BTVBfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpCisjZWxzZQorCWlmIChMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkgICAgTElNX0lTX0JUX0FNUF9TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkKKyNlbmRpZgorCQlwRGVsU3RhUGFyYW1zLT5zdGFJZHggPSBwc2Vzc2lvbkVudHJ5LT5zdGFJZDsKKworCWVsc2UKKwkJcERlbFN0YVBhcmFtcy0+c3RhSWR4ID0gcFN0YURzLT5zdGFJbmRleDsKKworCXBEZWxTdGFQYXJhbXMtPmFzc29jSWQgPSBwU3RhRHMtPmFzc29jSWQ7CisJcFN0YURzLT52YWxpZCA9IDA7CisKKwlpZiAoIWZSZXNwUmVxZCkKKwkJcERlbFN0YVBhcmFtcy0+cmVzcFJlcWQgPSAwOworCWVsc2UgeworCQkvKiB3aGVuIGxpbV9kZWxfc3RhIGlzIGNhbGxlZCBmcm9tIHByb2Nlc3NTbWVBc3NvY0NuZiB0aGVuIG1sbVN0YXRlIGlzIGFscmVhZHkgc2V0IHByb3Blcmx5LiAqLworCQlpZiAoZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEUgIT0KKwkJICAgIEdFVF9MSU1fU1RBX0NPTlRFWFRfTUxNX1NUQVRFKHBTdGFEcykpIHsKKwkJCU1UUkFDRShtYWNfdHJhY2UKKwkJCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQkgICAgICAgZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEUpKTsKKwkJCVNFVF9MSU1fU1RBX0NPTlRFWFRfTUxNX1NUQVRFKHBTdGFEcywKKwkJCQkJCSAgICAgIGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFKTsKKwkJfQorCQlpZiAoTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpIHx8CisJCSAgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQlNVFJBQ0UobWFjX3RyYWNlCisJCQkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJICAgICAgIGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFKSk7CisKKwkJCXBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0KKwkJCQllTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURTsKKworCQl9CisJCXBEZWxTdGFQYXJhbXMtPnJlc3BSZXFkID0gMTsKKwkJLyogd2UgbmVlZCB0byBkZWZlciB0aGUgbWVzc2FnZSB1bnRpbCB3ZSBnZXQgdGhlIHJlc3BvbnNlIGJhY2sgZnJvbSBIQUwuICovCisJCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKwl9CisKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJRCAqLworCXBEZWxTdGFQYXJhbXMtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCXBEZWxTdGFQYXJhbXMtPnNtZXNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCXBEZWxTdGFQYXJhbXMtPnN0YVR5cGUgPSBwU3RhRHMtPnN0YVR5cGU7CisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBEZWxTdGFQYXJhbXMtPnN0YU1hYywKKwkJICAgICAodWludDhfdCAqKSBwU3RhRHMtPnN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJcERlbFN0YVBhcmFtcy0+c3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCW1zZ1EudHlwZSA9IFdNQV9ERUxFVEVfU1RBX1JFUTsKKwltc2dRLnJlc2VydmVkID0gMDsKKwltc2dRLmJvZHlwdHIgPSBwRGVsU3RhUGFyYW1zOworCW1zZ1EuYm9keXZhbCA9IDA7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJTZXNzaW9uaWQgJWQgOlNlbmRpbmcgU0lSX0hBTF9ERUxFVEVfU1RBX1JFUSAiCisJCQkgICAgICAgImZvciBTVEFJRDogJVggYW5kIEFzc29jSUQ6ICVkIE1BQyA6ICIKKwkJCSAgICAgICBNQUNfQUREUkVTU19TVFIpLCBwRGVsU3RhUGFyYW1zLT5zZXNzaW9uSWQsCisJCXBEZWxTdGFQYXJhbXMtPnN0YUlkeCwgcERlbFN0YVBhcmFtcy0+YXNzb2NJZCwKKwkJTUFDX0FERFJfQVJSQVkocFN0YURzLT5zdGFBZGRyKSk7CisKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbXNnUS50eXBlKSk7CisJcmV0Q29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2dRKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHJldENvZGUpIHsKKwkJaWYgKGZSZXNwUmVxZCkKKwkJCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiUG9zdGluZyBERUxFVEVfU1RBX1JFUSB0byBIQUwgZmFpbGVkLCByZWFzb249JVgiKSwKKwkJCXJldENvZGUpOworCQljZGZfbWVtX2ZyZWUocERlbFN0YVBhcmFtcyk7CisJfQorCisJcmV0dXJuIHJldENvZGU7Cit9CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKioKKyAqIGxpbV9hZGRfZnRfc3RhX3NlbGYoKS0gZnVuY3Rpb24gdG8gYWRkIFNUQSBvbmNlIHdlIGhhdmUgY29ubmVjdGVkIHdpdGggYQorICogICAgICAgICAgbmV3IEFQCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICogQGFzc29jX2lkOiBhc3NvY2lhdGlvbiBpZCBmb3IgdGhlIHN0YXRpb24gY29ubmVjdGlvbgorICogQHNlc3Npb25fZW50cnk6IHBlIHNlc3Npb24gZW50cgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFkZCBhIFNUQSBvbmNlIHdlIGhhdmUgY29ubmVjdGVkIHdpdGggYSBuZXcKKyAqIEFQLCB0aGF0IHdlIGhhdmUgcGVyZm9ybWVkIGFuIEZUIHRvLgorICoKKyAqIFRoZSBBZGQgU1RBIFJlc3BvbnNlIGlzIGNyZWF0ZWQgYW5kIG5vdyBhZnRlciB0aGUgQUREIEJzcyBJcyBTdWNjZXNzZnVsCisgKiB3ZSBhZGQgdGhlIHNlbGYgc3RhLiBXZSB1cGRhdGUgd2l0aCB0aGUgYXNzb2NpYXRpb24gaWQgZnJvbSB0aGUgcmVhc3NvYworICogcmVzcG9uc2UgZnJvbSB0aGUgQVAuCisgKgorICogUmV0dXJuOiBlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcyBlbHNlIGVTaXJSZXRTdGF0dXMgZmFpbHVyZSBjb2RlcworICovCit0U2lyUmV0U3RhdHVzIGxpbV9hZGRfZnRfc3RhX3NlbGYodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDE2X3QgYXNzb2NfaWQsCisJCQkJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSkKK3sKKwl0cEFkZFN0YVBhcmFtcyBhZGRfc3RhX3BhcmFtcyA9IE5VTEw7CisJdFNpclJldFN0YXR1cyByZXRfY29kZSA9IGVTSVJfU1VDQ0VTUzsKKwl0U2lyTXNnUSBtc2dfcTsKKworCWFkZF9zdGFfcGFyYW1zID0gc2Vzc2lvbl9lbnRyeS0+ZnRQRUNvbnRleHQucEFkZFN0YVJlcTsKKwlhZGRfc3RhX3BhcmFtcy0+YXNzb2NJZCA9IGFzc29jX2lkOworCWFkZF9zdGFfcGFyYW1zLT5zbWVzZXNzaW9uSWQgPSBzZXNzaW9uX2VudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKwltc2dfcS50eXBlID0gV01BX0FERF9TVEFfUkVROworCW1zZ19xLnJlc2VydmVkID0gMDsKKwltc2dfcS5ib2R5cHRyID0gYWRkX3N0YV9wYXJhbXM7CisJbXNnX3EuYm9keXZhbCA9IDA7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSJTZW5kaW5nIFdNQV9BRERfU1RBX1JFUSAoYWlkICVkKSIsCisJCQkgYWRkX3N0YV9wYXJhbXMtPmFzc29jSWQpOworI2VuZGlmCisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgobWFjX2N0eCwgc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkgbXNnX3EudHlwZSkpOworCisJc2Vzc2lvbl9lbnRyeS0+bGltUHJldk1sbVN0YXRlID0gc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGU7CisJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX01MTV9TVEFURSwKKwkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsIGVMSU1fTUxNX1dUX0FERF9TVEFfUlNQX1NUQVRFKSk7CisJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9BRERfU1RBX1JTUF9TVEFURTsKKwlyZXRfY29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKG1hY19jdHgsICZtc2dfcSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSByZXRfY29kZSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiUG9zdGluZyBXTUFfQUREX1NUQV9SRVEgdG8gSEFMIGZhaWxlZCwgcmVhc29uPSVYIiksCisJCQlyZXRfY29kZSk7CisJCWNkZl9tZW1fZnJlZShhZGRfc3RhX3BhcmFtcyk7CisJfQorCisJc2Vzc2lvbl9lbnRyeS0+ZnRQRUNvbnRleHQucEFkZFN0YVJlcSA9IE5VTEw7CisJcmV0dXJuIHJldF9jb2RlOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKy8qKgorICogbGltX2FkZF9zdGFfc2VsZigpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGFuIFNUQSBjb250ZXh0IGF0IGhhcmR3YXJlCisgKiB3aGVuZXZlciBhIFNUQSBpcyAoUmUpIEFzc29jaWF0ZWQuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzICAtIFBvaW50ZXIgdG8gdGhlIFNUQSBkYXRhc3RydWN0dXJlIGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgIExJTSBhbmQgbWFpbnRhaW5lZCBieSBEUEgKKyAqIEByZXR1cm4gcmV0Q29kZSAtIEluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUgcmV0dXJuIGNvZGUKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1fYWRkX3N0YV9zZWxmKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IHN0YUlkeCwgdWludDhfdCB1cGRhdGVTdGEsCisJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwQWRkU3RhUGFyYW1zIHBBZGRTdGFQYXJhbXMgPSBOVUxMOworCXRTaXJNc2dRIG1zZ1E7CisJdFNpclJldFN0YXR1cyByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworCXRTaXJNYWNBZGRyIHN0YU1hYzsKKwl1aW50MzJfdCBsaXN0ZW5JbnRlcnZhbCA9IFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMX1NUQURFRjsKKwl1aW50MzJfdCBzaG9ydEdpMjBNaHpTdXBwb3J0OworCXVpbnQzMl90IHNob3J0R2k0ME1oelN1cHBvcnQ7CisJdWludDMyX3QgYW1wZHVMZW5FeHBvbmVudCA9IDA7CisJLypUaGlzIHNlbGYgU3RhIGRvdCAxMSBtb2RlIGNvbWVzIGZyb20gdGhlIGNmZyBhbmQgdGhlIGV4cGVjdGF0aW9uIGhlcmUgaXMKKwkgKiB0aGF0IGNmZyBjYXJyaWVzIHRoZSBzeXN0ZW13aWRlIGNhcGFiaWxpdHkgdGhhdCBkZXZpY2UgdW5kZXIKKwkgKiBjb25zaWRlcmF0aW9uIGNhbiBzdXBwb3J0LiBUaGlzIGNhcGFiaWxpdHkgZ2V0cyBwbHVtYmVkIGludG8gdGhlIGNmZworCSAqIGNhY2hlIGF0IHN5c3RlbSBpbml0aWFsaXphdGlvbiB0aW1lIHZpYSB0aGUgLmRhdCBhbmQgLmluaSBmaWxlIG92ZXJyaWRlCisJICogbWVjaGFuaXNtcyBhbmQgd2lsbCBub3QgY2hhbmdlLiBJZiBpdCBkb2VzIGNoYW5nZSwgaXQgaXMgdGhlCisJICogcmVzcG9uc2liaWxpdHkgb2YgU01FIHRvIGV2aWN0IHRoZSBzZWxmU3RhIGFuZCByZWlzc3VlIGEgbmV3IEFkZFN0YVNlbGYKKwkgKiBjb21tYW5kLiovCisJdWludDMyX3Qgc2VsZlN0YURvdDExTW9kZSA9IDAsIHNlbGZUeFdpZHRoID0gMDsKKwl1aW50MzJfdCB2YWw7CisJd2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0RPVDExX01PREUsICZzZWxmU3RhRG90MTFNb2RlKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJjZmdEb3QxMU1vZGUgJWQiKSwgKGludClzZWxmU3RhRG90MTFNb2RlKTsKKwl3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk9fU1VQUE9SVEVEX0NIQU5fV0lEVEhfU0VULAorCQkJICZzZWxmVHhXaWR0aCk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiU0dJIDIwICVkIiksIChpbnQpc2VsZlR4V2lkdGgpOworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlJvYW0gQ2hhbm5lbCBCb25kaW5nIE1vZGUgJWQiKSwKKwkJKGludClwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnVDZmdEb3QxMU1vZGUpOworCisJc2lyX2NvcHlfbWFjX2FkZHIoc3RhTWFjLCBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTChNQUNfQUREUkVTU19TVFIgIjogIiksIE1BQ19BRERSX0FSUkFZKHN0YU1hYykpOworCXBBZGRTdGFQYXJhbXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodEFkZFN0YVBhcmFtcykpOworCWlmIChOVUxMID09IHBBZGRTdGFQYXJhbXMpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIEFERF9TVEEiKSk7CisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJfQorCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBBZGRTdGFQYXJhbXMsIHNpemVvZih0QWRkU3RhUGFyYW1zKSwgMCk7CisKKwkvKiAvIEFkZCBTVEEgY29udGV4dCBhdCBNQUMgSFcgKEJNVSwgUkhQICYgVEZQKSAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwQWRkU3RhUGFyYW1zLT5zdGFNYWMsCisJCSAgICAgKHVpbnQ4X3QgKikgc3RhTWFjLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwQWRkU3RhUGFyYW1zLT5ic3NJZCwKKwkJICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlwQWRkU3RhUGFyYW1zLT5hc3NvY0lkID0gcHNlc3Npb25FbnRyeS0+bGltQUlEOworCXBBZGRTdGFQYXJhbXMtPnN0YVR5cGUgPSBTVEFfRU5UUllfU0VMRjsKKwlwQWRkU3RhUGFyYW1zLT5zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJcEFkZFN0YVBhcmFtcy0+cmVzcFJlcWQgPSAxOworCisJLyogVXBkYXRlICBQRSBzZXNzaW9uIElEICovCisJcEFkZFN0YVBhcmFtcy0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKwkvKiBVcGRhdGUgU01FIHNlc3Npb24gSUQgKi8KKwlwQWRkU3RhUGFyYW1zLT5zbWVzZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKwlwQWRkU3RhUGFyYW1zLT5tYXhUeFBvd2VyID0gcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlcjsKKworCS8qIFRoaXMgd2lsbCBpbmRpY2F0ZSBIQUwgdG8gImFsbG9jYXRlIiBhIG5ldyBTVEEgaW5kZXggKi8KKwlwQWRkU3RhUGFyYW1zLT5zdGFJZHggPSBzdGFJZHg7CisJcEFkZFN0YVBhcmFtcy0+dXBkYXRlU3RhID0gdXBkYXRlU3RhOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19TSE9SVF9QUkVBTUJMRSwgJnZhbCkgIT0KKwkJCWVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKAorCQkJCSJDb3VsZG4ndCBnZXQgU0hPUlRfUFJFQU1CTEUsIHNldCBkZWZhdWx0IikpOworCQlwQWRkU3RhUGFyYW1zLT5zaG9ydFByZWFtYmxlU3VwcG9ydGVkID0gMTsKKwl9IGVsc2UgeworCQlwQWRkU3RhUGFyYW1zLT5zaG9ydFByZWFtYmxlU3VwcG9ydGVkID0gdmFsOworCX0KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJbGltX3BvcHVsYXRlX293bl9yYXRlX3NldChwTWFjLCAmcEFkZFN0YVBhcmFtcy0+c3VwcG9ydGVkUmF0ZXMsIE5VTEwsIGZhbHNlLAorCQkJCSAgcHNlc3Npb25FbnRyeSwgTlVMTCk7CisjZWxzZQorCWxpbV9wb3B1bGF0ZV9vd25fcmF0ZV9zZXQocE1hYywgJnBBZGRTdGFQYXJhbXMtPnN1cHBvcnRlZFJhdGVzLCBOVUxMLCBmYWxzZSwKKwkJCQkgIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisJaWYgKElTX0RPVDExX01PREVfSFQoc2VsZlN0YURvdDExTW9kZSkpIHsKKwkJcEFkZFN0YVBhcmFtcy0+aHRDYXBhYmxlID0gdHJ1ZTsKKyNpZmRlZiBESVNBQkxFX0dGX0ZPUl9JTlRFUk9QCisJCWlmICgocHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEgIT0gTlVMTCkKKwkJICAgICYmICghcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLgorCQkJYW5pSW5kaWNhdG9yKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiIFR1cm5pbmcgb2ZmIEdyZWVuZmllbGQsIHdoZW4gYWRkaW5nIHNlbGYgZW50cnkiKSk7CisJCQlwQWRkU3RhUGFyYW1zLT5ncmVlbkZpZWxkQ2FwYWJsZSA9CisJCQkJV05JX0NGR19HUkVFTkZJRUxEX0NBUEFCSUxJVFlfRElTQUJMRTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJcEFkZFN0YVBhcmFtcy0+Z3JlZW5GaWVsZENhcGFibGUgPQorCQkJCWxpbV9nZXRfaHRfY2FwYWJpbGl0eShwTWFjLCBlSFRfR1JFRU5GSUVMRCwKKwkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQkJcEFkZFN0YVBhcmFtcy0+Y2hfd2lkdGggPQorCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKKwkJCXBBZGRTdGFQYXJhbXMtPm1pbW9QUyA9CisJCQkJbGltX2dldF9odF9jYXBhYmlsaXR5KHBNYWMsIGVIVF9NSU1PX1BPV0VSX1NBVkUsCisJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCXBBZGRTdGFQYXJhbXMtPnJpZnNNb2RlID0KKwkJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkocE1hYywgZUhUX1JJRlNfTU9ERSwKKwkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQkJcEFkZFN0YVBhcmFtcy0+bHNpZ1R4b3BQcm90ZWN0aW9uID0KKwkJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkocE1hYywgZUhUX0xTSUdfVFhPUF9QUk9URUNUSU9OLAorCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisJCQlwQWRkU3RhUGFyYW1zLT5tYXhBbXBkdURlbnNpdHkgPQorCQkJCWxpbV9nZXRfaHRfY2FwYWJpbGl0eShwTWFjLCBlSFRfTVBEVV9ERU5TSVRZLAorCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisJCQlwQWRkU3RhUGFyYW1zLT5tYXhBbXBkdVNpemUgPQorCQkJCWxpbV9nZXRfaHRfY2FwYWJpbGl0eShwTWFjLCBlSFRfTUFYX1JYX0FNUERVX0ZBQ1RPUiwKKwkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQkJcEFkZFN0YVBhcmFtcy0+bWF4QW1zZHVTaXplID0KKwkJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkocE1hYywgZUhUX01BWF9BTVNEVV9MRU5HVEgsCisJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCXBBZGRTdGFQYXJhbXMtPmZEc3NzQ2NrTW9kZTQwTWh6ID0KKwkJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkocE1hYywgZUhUX0RTU1NfQ0NLX01PREVfNDBNSFosCisJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCS8qCisJCQkgKiBXZSB3aWxsIHJlYWQgdGhlIGdTaG9ydEdJMjBNaHogZnJvbSBpbmkgZmlsZSwgYW5kIGlmIGl0IGlzIHNldAorCQkJICogdG8gMSB0aGVuIHdlIHdpbGwgdGVsbCBQZWVyIHRoYXQgd2Ugc3VwcG9ydCA0ME1oeiBzaG9ydCBHSQorCQkJICovCisJCQlpZiAoSVNfU0lSX1NUQVRVU19TVUNDRVNTKHdsYW5fY2ZnX2dldF9pbnQKKwkJCQkJCQkgIChwTWFjLCBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaLAorCQkJCQkJCSAgJnNob3J0R2kyME1oelN1cHBvcnQpKSkgeworCQkJCWlmICh0cnVlID09IHNob3J0R2kyME1oelN1cHBvcnQpIHsKKwkJCQkJcEFkZFN0YVBhcmFtcy0+ZlNob3J0R0kyME1oeiA9CisJCQkJCQlXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaX1NUQU1BWDsKKwkJCQl9IGVsc2UgeworCQkJCQlwQWRkU3RhUGFyYW1zLT5mU2hvcnRHSTIwTWh6ID0gZmFsc2U7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlQRUxPR0UobGltX2xvZworCQkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJCSAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIHNob3J0R0kgMjBNaHoiCisJCQkJCQkgICJDRkcsc2V0dGluZyB2YWx1ZSB0byBkZWZhdWx0IikpOworCQkJCSAgICAgICApCisJCQkJcEFkZFN0YVBhcmFtcy0+ZlNob3J0R0kyME1oeiA9CisJCQkJCVdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfU1RBREVGOworCQkJfQorCisJCQkvKgorCQkJICogV2Ugd2lsbCByZWFkIHRoZSBnU2hvcnRHSTQwTWh6IGZyb20gaW5pIGZpbGUsIGFuZCBpZiBpdCBpcyBzZXQKKwkJCSAqIHRvIDEgdGhlbiB3ZSB3aWxsIHRlbGwgUGVlciB0aGF0IHdlIHN1cHBvcnQgNDBNaHogc2hvcnQgR0kKKwkJCSAqLworCQkJaWYgKElTX1NJUl9TVEFUVVNfU1VDQ0VTUyh3bGFuX2NmZ19nZXRfaW50CisJCQkJCQkJICAocE1hYywgV05JX0NGR19TSE9SVF9HSV80ME1IWiwKKwkJCQkJCQkgICZzaG9ydEdpNDBNaHpTdXBwb3J0KSkpIHsKKwkJCQlpZiAodHJ1ZSA9PSBzaG9ydEdpNDBNaHpTdXBwb3J0KSB7CisJCQkJCXBBZGRTdGFQYXJhbXMtPmZTaG9ydEdJNDBNaHogPQorCQkJCQkJV05JX0NGR19TSE9SVF9HSV80ME1IWl9TVEFNQVg7CisJCQkJfSBlbHNlIHsKKwkJCQkJcEFkZFN0YVBhcmFtcy0+ZlNob3J0R0k0ME1oeiA9IGZhbHNlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCQkgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBzaG9ydEdJIDQwTWh6IgorCQkJCQkJICAiQ0ZHLHNldHRpbmcgdmFsdWUgdG8gZGVmYXVsdCIpKTsKKwkJCQkgICAgICAgKQorCQkJCXBBZGRTdGFQYXJhbXMtPmZTaG9ydEdJNDBNaHogPQorCQkJCQlXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaX1NUQURFRjsKKwkJCX0KKwkJCWxpbV9sb2cocE1hYywgTE9HMiwKKwkJCQlGTCgiIGdyZWVuRmllbGRDYXBhYmxlOiAlZCBtYXhBbXBkdURlbnNpdHkgPSAlZCAiCisJCQkJICAgIm1heEFtcGR1U2l6ZSA9ICVkIiksCisJCQkJcEFkZFN0YVBhcmFtcy0+Z3JlZW5GaWVsZENhcGFibGUsCisJCQkJcEFkZFN0YVBhcmFtcy0+bWF4QW1wZHVEZW5zaXR5LAorCQkJCXBBZGRTdGFQYXJhbXMtPm1heEFtcGR1U2l6ZSk7CisKKwkJCWxpbV9sb2cocE1hYywgTE9HMiwKKwkJCQlGTCgiZkRzc3NDY2tNb2RlNDBNaHo6ICVkIGZTaG9ydEdJMjBNaHo6ICVkICIKKwkJCQkgICAiZlNob3J0R0k0ME1oejogJWQgbHNpZ1R4b3BQcm90ZWN0aW9uOiAlZCIpLAorCQkJCXBBZGRTdGFQYXJhbXMtPmZEc3NzQ2NrTW9kZTQwTWh6LAorCQkJCXBBZGRTdGFQYXJhbXMtPmZTaG9ydEdJMjBNaHosCisJCQkJcEFkZFN0YVBhcmFtcy0+ZlNob3J0R0k0ME1oeiwKKwkJCQlwQWRkU3RhUGFyYW1zLT5sc2lnVHhvcFByb3RlY3Rpb24pOworCisJCQlsaW1fbG9nKHBNYWMsIExPRzIsCisJCQkJRkwoIm1heEFtc2R1U2l6ZTogJWQgdHhDaGFubmVsV2lkdGg6ICVkIG1pbW9QUzogJWQgcmlmc01vZGUgJWQiKSwKKwkJCQlwQWRkU3RhUGFyYW1zLT5tYXhBbXNkdVNpemUsCisJCQkJcEFkZFN0YVBhcmFtcy0+Y2hfd2lkdGgsCisJCQkJcEFkZFN0YVBhcmFtcy0+bWltb1BTLCBwQWRkU3RhUGFyYW1zLT5yaWZzTW9kZSk7CisJCX0KKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlwQWRkU3RhUGFyYW1zLT52aHRDYXBhYmxlID0gSVNfRE9UMTFfTU9ERV9WSFQoc2VsZlN0YURvdDExTW9kZSk7CisJaWYgKHBBZGRTdGFQYXJhbXMtPnZodENhcGFibGUpIHsKKwkJcEFkZFN0YVBhcmFtcy0+Y2hfd2lkdGggPQorCQkJcHNlc3Npb25FbnRyeS0+Y2hfd2lkdGg7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlZIVCBXSURUSCBTRVQgJWQiKSwKKwkJCXBBZGRTdGFQYXJhbXMtPmNoX3dpZHRoKTsKKwl9CisJcEFkZFN0YVBhcmFtcy0+dmh0VHhCRkNhcGFibGUgPSBwc2Vzc2lvbkVudHJ5LT50eEJGSW5pRmVhdHVyZUVuYWJsZWQ7CisJcEFkZFN0YVBhcmFtcy0+ZW5hYmxlX3N1X3R4X2Jmb3JtZXIgPQorCQlwc2Vzc2lvbkVudHJ5LT5lbmFibGVfc3VfdHhfYmZvcm1lcjsKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJ2aHRDYXBhYmxlOiAlZCB2aHRUeEJGQ2FwYWJsZSAlZCwgc3VfYmZlciAlZCIpLAorCQlwQWRkU3RhUGFyYW1zLT52aHRDYXBhYmxlLCBwQWRkU3RhUGFyYW1zLT52aHRUeEJGQ2FwYWJsZSwKKwkJcEFkZFN0YVBhcmFtcy0+ZW5hYmxlX3N1X3R4X2Jmb3JtZXIpOworCisJLyogSW4gMTFhYyBtb2RlLCB0aGUgaGFyZHdhcmUgaXMgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIDEyOEsgQU1QRFUgc2l6ZSAqLworCWlmIChJU19ET1QxMV9NT0RFX1ZIVChzZWxmU3RhRG90MTFNb2RlKSkgeworCQlpZiAod2xhbl9jZmdfZ2V0X2ludAorCQkJICAgIChwTWFjLCBXTklfQ0ZHX1ZIVF9BTVBEVV9MRU5fRVhQT05FTlQsICZhbXBkdUxlbkV4cG9uZW50KQorCQkgICAgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwKKwkJCQkJKCJDb3VsZG4ndCBnZXQgV05JX0NGR19WSFRfQU1QRFVfTEVOX0VYUE9ORU5UIikpOworCQl9CisJCXBBZGRTdGFQYXJhbXMtPm1heEFtcGR1U2l6ZSA9ICh1aW50OF90KSBhbXBkdUxlbkV4cG9uZW50OworCX0KKwlwQWRkU3RhUGFyYW1zLT52aHRUeE1VQmZvcm1lZUNhcGFibGUgPSBwc2Vzc2lvbkVudHJ5LT50eE11QmZvcm1lZTsKKwlwQWRkU3RhUGFyYW1zLT5lbmFibGVWaHRwQWlkID0gcHNlc3Npb25FbnRyeS0+ZW5hYmxlVmh0cEFpZDsKKyNlbmRpZgorCXBBZGRTdGFQYXJhbXMtPmVuYWJsZUFtcGR1UHMgPSBwc2Vzc2lvbkVudHJ5LT5lbmFibGVBbXBkdVBzOworCXBBZGRTdGFQYXJhbXMtPmVuYWJsZUh0U21wcyA9IHBzZXNzaW9uRW50cnktPmVuYWJsZUh0U21wczsKKwlwQWRkU3RhUGFyYW1zLT5odFNtcHNjb25maWcgPSBwc2Vzc2lvbkVudHJ5LT5odFNtcHN2YWx1ZTsKKworCS8qIEZvciBTZWxmIFNUQSBnZXQgdGhlIExEUEMgY2FwYWJpbGl0eSBmcm9tIHNlc3Npb24gaS5lIGNvbmZpZy5pbmkgKi8KKwlwQWRkU3RhUGFyYW1zLT5odExkcGNDYXBhYmxlID0KKwkJKHBzZXNzaW9uRW50cnktPnR4TGRwY0luaUZlYXR1cmVFbmFibGVkICYgMHgwMSk7CisJcEFkZFN0YVBhcmFtcy0+dmh0TGRwY0NhcGFibGUgPQorCQkoKHBzZXNzaW9uRW50cnktPnR4TGRwY0luaUZlYXR1cmVFbmFibGVkID4+IDEpICYgMHgwMSk7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTCwgJmxpc3RlbkludGVydmFsKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkNvdWxkbid0IGdldCBMSVNURU5fSU5URVJWQUwiKSk7CisJcEFkZFN0YVBhcmFtcy0+bGlzdGVuSW50ZXJ2YWwgPSAodWludDE2X3QpIGxpc3RlbkludGVydmFsOworCisJaWYgKENERl9QMlBfQ0xJRU5UX01PREUgPT0gcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hKSB7CisJCXBBZGRTdGFQYXJhbXMtPnAycENhcGFibGVTdGEgPSAxOworCX0KKworCXBBZGRTdGFQYXJhbXMtPnN1cHBvcnRlZFJhdGVzLm9wUmF0ZU1vZGUgPQorCQlsaW1fZ2V0X3N0YV9yYXRlX21vZGUoKHVpbnQ4X3QpIHNlbGZTdGFEb3QxMU1vZGUpOworCisJbGltX2xvZyhwTWFjLCBMT0cyLCBGTCgiIFN0YUlkeDogJWQgdXBkYXRlU3RhID0gJWQgaHRjYXBhYmxlID0gJWQgIiksCisJCXBBZGRTdGFQYXJhbXMtPnN0YUlkeCwgcEFkZFN0YVBhcmFtcy0+dXBkYXRlU3RhLAorCQlwQWRkU3RhUGFyYW1zLT5odENhcGFibGUpOworCisJbGltX2xvZyhwTWFjLCBMT0cyLCBGTCgiaHRMZHBjQ2FwYWJsZTogJWQgdmh0TGRwY0NhcGFibGU6ICVkICIKKwkJCSAgICAgICAicDJwQ2FwYWJsZVN0YTogJWQiKSwKKwkJcEFkZFN0YVBhcmFtcy0+aHRMZHBjQ2FwYWJsZSwgcEFkZFN0YVBhcmFtcy0+dmh0TGRwY0NhcGFibGUsCisJCXBBZGRTdGFQYXJhbXMtPnAycENhcGFibGVTdGEpOworCisJaWYgKHBzZXNzaW9uRW50cnktPmlzTm9uUm9hbVJlYXNzb2MpIHsKKwkJcEFkZFN0YVBhcmFtcy0+bm9uUm9hbVJlYXNzb2MgPSAxOworCQlwc2Vzc2lvbkVudHJ5LT5pc05vblJvYW1SZWFzc29jID0gMDsKKwl9CisJbGltX2xvZyhwTWFjLCBMT0cyLCBGTCgic2Vzc2lvbmlkOiAlZCAgQXNzb2MgSUQ6ICVkIGxpc3RlbkludGVydmFsID0gJWQgIgorCQkJICAgICAgICJzaG9ydFByZWFtYmxlU3VwcG9ydGVkOiAlZCIpLAorCQlwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQsIHBBZGRTdGFQYXJhbXMtPmFzc29jSWQsCisJCXBBZGRTdGFQYXJhbXMtPmxpc3RlbkludGVydmFsLAorCQlwQWRkU3RhUGFyYW1zLT5zaG9ydFByZWFtYmxlU3VwcG9ydGVkKTsKKworCW1zZ1EudHlwZSA9IFdNQV9BRERfU1RBX1JFUTsKKwltc2dRLnJlc2VydmVkID0gMDsKKwltc2dRLmJvZHlwdHIgPSBwQWRkU3RhUGFyYW1zOworCW1zZ1EuYm9keXZhbCA9IDA7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKE1BQ19BRERSRVNTX1NUUiAiOlNlc3Npb25pZCAlZCA6ICIKKwkJCSAgICAgICAiU2VuZGluZyBXTUFfQUREX1NUQV9SRVEuIChhaWQgJWQpIiksCisJCU1BQ19BRERSX0FSUkFZKHBBZGRTdGFQYXJhbXMtPnN0YU1hYyksCisJCXBBZGRTdGFQYXJhbXMtPnNlc3Npb25JZCwgcEFkZFN0YVBhcmFtcy0+YXNzb2NJZCk7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIG1zZ1EudHlwZSkpOworCisJcmV0Q29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2dRKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHJldENvZGUpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlBvc3RpbmcgV01BX0FERF9TVEFfUkVRIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWCIpLAorCQkJcmV0Q29kZSk7CisJCWNkZl9tZW1fZnJlZShwQWRkU3RhUGFyYW1zKTsKKwl9CisJcmV0dXJuIHJldENvZGU7Cit9CisKKy8qKgorICogbGltVGVhcmRvd25JbmZyYUJTUygpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdmFyaW91cyBMSU0gZnVuY3Rpb25zIHRvIHRlYXJkb3duCisgKiBhbiBlc3RhYmxpc2hlZCBJbmZyYXN0cnVjdHVyZSBCU1MKKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX3RlYXJkb3duX2luZnJhX2Jzcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJNYWNBZGRyIGJjQWRkciA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworCisJLyoqCisJICogU2VuZCBCcm9hZGNhc3QgRGlzYXNzb2NpYXRlIGZyYW1lIHdpdGgKKwkgKiAnbGVhdmluZyBCU1MnIHJlYXNvbi4KKwkgKi8KKwlsaW1fc2VuZF9kaXNhc3NvY19tZ210X2ZyYW1lKHBNYWMsCisJCQkJICAgICBlU0lSX01BQ19ESVNBU1NPQ19MRUFWSU5HX0JTU19SRUFTT04sCisJCQkJICAgICBiY0FkZHIsIHBzZXNzaW9uRW50cnksIGZhbHNlKTsKK30gLyoqKiBlbmQgbGltX3RlYXJkb3duX2luZnJhX2JzcygpICoqKi8KKworLyoqCisgKiBsaW1faGFuZGxlX2NuZl93YWl0X3RpbWVvdXQoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NNZXNzYWdlUXVldWUgdG8gaGFuZGxlCisgKiB2YXJpb3VzIGNvbmZpcm1hdGlvbiBmYWlsdXJlIGNhc2VzLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwU3RhRHMgLSBQb2ludGVyIHRvIGEgc3RhIGRlc2NyaXB0b3IKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX2hhbmRsZV9jbmZfd2FpdF90aW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IHN0YUlkKQoreworCXRwRHBoSGFzaE5vZGUgcFN0YURzOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSBOVUxMOworCisJcHNlc3Npb25FbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKHBNYWMsCisJCQlwTWFjLT5saW0ubGltVGltZXJzLmdwTGltQ25mV2FpdFRpbWVyW3N0YUlkXS5zZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlNlc3Npb24gRG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JRCIpKTsKKwkJcmV0dXJuOworCX0KKwlwU3RhRHMgPSBkcGhfZ2V0X2hhc2hfZW50cnkocE1hYywgc3RhSWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworCWlmIChwU3RhRHMgPT0gTlVMTCkgeworCQlQRUxPR1cobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJICAgICAgIEZMKCJObyBTVEEgY29udGV4dCBpbiBTSVJfTElNX0NORl9XQUlUX1RJTUVPVVQuIikpOworCQkgICAgICAgKQorCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpIHsKKwljYXNlIGVMSU1fTUxNX1dUX0FTU09DX0NORl9TVEFURToKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywKKwkJCSAgICAgICBGTAorCQkJCSAgICAgICAoIkRpZCBub3QgcmVjZWl2ZSBBc3NvYyBDbmYgaW4gZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFIHN0YSBBc3NvYyBpZCAlZCIpLAorCQkJICAgICAgIHBTdGFEcy0+YXNzb2NJZCk7CisJCSAgICAgICApCisJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIExPR1cpOworCisJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCQkgICAgTElNX0lTX0JUX0FNUF9BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQlsaW1fcmVqZWN0X2Fzc29jaWF0aW9uKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwKKwkJCQkJICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlLAorCQkJCQkgICAgICAgdHJ1ZSwKKwkJCQkJICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKwkJCQkJICAgICAgIHBTdGFEcy0+YXNzb2NJZCwgdHJ1ZSwKKwkJCQkJICAgICAgICh0U2lyUmVzdWx0Q29kZXMpCisJCQkJCSAgICAgICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsCisJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlJlY2VpdmVkIENORl9XQUlUX1RJTUVPVVQgaW4gc3RhdGUgJWQiKSwKKwkJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSk7CisJfQorfQorCisvKioKKyAqIGxpbV9kZWxldGVfZHBoX2hhc2hfZW50cnkoKS0gZnVuY3Rpb24gdG8gZGVsZXRlIGRwaCBoYXNoIGVudHJ5CisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICogQHN0YV9hZGRyOiBwZWVyIHN0YXRpb24gYWRkcmVzcworICogQHN0YV9pZDogaWQgYXNzaWduZWQgdG8gcGVlciBzdGF0aW9uCisgKiBAc2Vzc2lvbl9lbnRyeTogcGUgc2Vzc2lvbiBlbnRyeQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIHdlIG5lZWQgdG8gZGVsZXRlCisgKiB0aGUgZHBoIGhhc2ggZW50cnkKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworCit2b2lkCitsaW1fZGVsZXRlX2RwaF9oYXNoX2VudHJ5KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRTaXJNYWNBZGRyIHN0YV9hZGRyLAorCQkJCSB1aW50MTZfdCBzdGFfaWQsIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJdWludDE2X3QgYWlkOworCXRwRHBoSGFzaE5vZGUgc3RhX2RzOworCXRVcGRhdGVCZWFjb25QYXJhbXMgYmVhY29uX3BhcmFtczsKKworCWNkZl9tZW1femVybygmYmVhY29uX3BhcmFtcywgc2l6ZW9mKHRVcGRhdGVCZWFjb25QYXJhbXMpKTsKKwliZWFjb25fcGFyYW1zLnBhcmFtQ2hhbmdlQml0bWFwID0gMDsKKwlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3Blcl9zdGFfaWRfdGltZXIobWFjX2N0eCwgZUxJTV9DTkZfV0FJVF9USU1FUiwKKwkJIHN0YV9pZCk7CisJaWYgKE5VTEwgPT0gc2Vzc2lvbl9lbnRyeSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJOVUxMIHNlc3Npb25fZW50cnkiKSk7CisJCXJldHVybjsKKwl9CisKKwliZWFjb25fcGFyYW1zLmJzc0lkeCA9IHNlc3Npb25fZW50cnktPmJzc0lkeDsKKwlzdGFfZHMgPSBkcGhfbG9va3VwX2hhc2hfZW50cnkobWFjX2N0eCwgc3RhX2FkZHIsICZhaWQsCisJCQkgJnNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisJaWYgKHN0YV9kcyA9PSBOVUxMKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoInN0YV9kcyBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJbGltX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiRGVsZXRpbmcgRFBIIEhhc2ggZW50cnkgZm9yIFNUQUlEOiAlWCIpLAorCQkgc3RhX2lkKTsKKwkvKgorCSAqIHVwZGF0ZSB0aGUgc3RhdGlvbiBjb3VudCBhbmQgcGVyZm9ybSBhc3NvY2lhdGVkIGFjdGlvbnMKKwkgKiBkbyB0aGlzIGJlZm9yZSBkZWxldGluZyB0aGUgZHBoIGhhc2ggZW50cnkKKwkgKi8KKwlsaW1fdXRpbF9jb3VudF9zdGFfZGVsKG1hY19jdHgsIHN0YV9kcywgc2Vzc2lvbl9lbnRyeSk7CisKKwlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgfHwgTElNX0lTX0lCU1NfUk9MRShzZXNzaW9uX2VudHJ5KSkgeworCQlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJCWlmIChzZXNzaW9uX2VudHJ5LT5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0KKwkJCQlXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0RJU0FCTEUpCisJCQkJbGltX2RlY2lkZV9hcF9wcm90ZWN0aW9uX29uX2RlbGV0ZShtYWNfY3R4LAorCQkJCQlzdGFfZHMsICZiZWFjb25fcGFyYW1zLCBzZXNzaW9uX2VudHJ5KTsKKwkJfQorCisJCWlmIChMSU1fSVNfSUJTU19ST0xFKHNlc3Npb25fZW50cnkpKQorCQkJbGltX2lic3NfZGVjaWRlX3Byb3RlY3Rpb25fb25fZGVsZXRlKG1hY19jdHgsIHN0YV9kcywKKwkJCQkgICAgICZiZWFjb25fcGFyYW1zLCBzZXNzaW9uX2VudHJ5KTsKKworCQlsaW1fZGVjaWRlX3Nob3J0X3ByZWFtYmxlKG1hY19jdHgsIHN0YV9kcywgJmJlYWNvbl9wYXJhbXMsCisJCQkJCSAgc2Vzc2lvbl9lbnRyeSk7CisJCWxpbV9kZWNpZGVfc2hvcnRfc2xvdChtYWNfY3R4LCBzdGFfZHMsICZiZWFjb25fcGFyYW1zLAorCQkJCSAgICAgIHNlc3Npb25fZW50cnkpOworCisJCS8qIFNlbmQgbWVzc2FnZSB0byBIQUwgYWJvdXQgYmVhY29uIHBhcmFtZXRlciBjaGFuZ2UuICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywgRkwoInBhcmFtIGJpdG1hcCA9ICVkICIpLAorCQkJCSBiZWFjb25fcGFyYW1zLnBhcmFtQ2hhbmdlQml0bWFwKTsKKwkJaWYgKGJlYWNvbl9wYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXAgJiYKKwkJCShmYWxzZSA9PQorCQkJIG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLmlzX2Rmc19jYWNfdGltZXJfcnVubmluZykpIHsKKwkJCXNjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyhtYWNfY3R4LCBzZXNzaW9uX2VudHJ5KTsKKwkJCWxpbV9zZW5kX2JlYWNvbl9wYXJhbXMobWFjX2N0eCwgJmJlYWNvbl9wYXJhbXMsCisJCQkJCSAgICAgICBzZXNzaW9uX2VudHJ5KTsKKwkJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJdHhfdGltZXJfZGVsZXRlKCZzdGFfZHMtPnBtZlNhUXVlcnlUaW1lcik7CisjZW5kaWYKKwl9CisKKwlpZiAoZHBoX2RlbGV0ZV9oYXNoX2VudHJ5KG1hY19jdHgsIHN0YV9hZGRyLCBzdGFfaWQsCisJCSAmc2Vzc2lvbl9lbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSkgIT0gZVNJUl9TVUNDRVNTKQorCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsIEZMKCJlcnJvciBkZWxldGluZyBoYXNoIGVudHJ5IikpOworfQorCisvKioKKyAqIGxpbV9jaGVja19hbmRfYW5ub3VuY2Vfam9pbl9zdWNjZXNzKCktIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSByZWNlaXZlZAorICogQmVhY29uL1Byb2JlIFJlc3BvbnNlIGlzIGZyb20gdGhlIEJTUyB0aGF0IHdlJ3JlIGF0dGVtcHRpbmcgdG8gam9pbi4KKyAqIEBtYWM6IHBvaW50ZXIgdG8gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAqIEBiZWFjb25fcHJvYmVfcnNwOiBwb2ludGVyIHRvIHJldmVpdmVkIGJlYWNvbi9wcm9iZSByZXNwb25zZSBmcmFtZQorICogQGhlYWRlcjogcG9pbnRlciB0byByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lIGhlYWRlcgorICogQHNlc3Npb25fZW50cnk6IHBlIHNlc3Npb24gZW50cnkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIHJlY2VpdmluZyBCZWFjb24vUHJvYmUgUmVzcG9uc2UKKyAqIGZyYW1lIGluIFdUX0pPSU5fQkVBQ09OX1NUQVRFIHRvIGNoZWNrIGlmIHRoZSByZWNlaXZlZAorICogQmVhY29uL1Byb2JlIFJlc3BvbnNlIGlzIGZyb20gdGhlIEJTUyB0aGF0IHdlJ3JlIGF0dGVtcHRpbmcKKyAqIHRvIGpvaW4uCisgKiBJZiB0aGUgQmVhY29uL1Byb2JlIFJlc3BvbnNlIGlzIGluZGVlZCBmcm9tIHRoZSBCU1Mgd2UncmUKKyAqIGF0dGVtcHRpbmcgdG8gam9pbiwgam9pbiBzdWNjZXNzIGlzIHNlbnQgdG8gU01FLgorICoKKyAqIFJldHVybjogbm9uZQorICovCisKK3ZvaWQKK2xpbV9jaGVja19hbmRfYW5ub3VuY2Vfam9pbl9zdWNjZXNzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXRTaXJQcm9iZVJlc3BCZWFjb24gKmJlYWNvbl9wcm9iZV9yc3AsIHRwU2lyTWFjTWdtdEhkciBoZWFkZXIsCisJCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJdFNpck1hY1NTaWQgY3VycmVudF9zc2lkOworCXRMaW1NbG1Kb2luQ25mIG1sbV9qb2luX2NuZjsKKwl1aW50MzJfdCB2YWwgPSAwOworCXVpbnQzMl90ICpub2FfZHVyYXRpb25fZnJvbV9iZWFjb24gPSBOVUxMOworCXVpbnQzMl90ICpub2EyX2R1cmF0aW9uX2Zyb21fYmVhY29uID0gTlVMTDsKKwl1aW50MzJfdCBub2E7CisJdWludDMyX3QgdG90YWxfbnVtX25vYV9kZXNjID0gMDsKKworCWNkZl9tZW1fY29weShjdXJyZW50X3NzaWQuc3NJZCwKKwkJICAgICBzZXNzaW9uX2VudHJ5LT5zc0lkLnNzSWQsIHNlc3Npb25fZW50cnktPnNzSWQubGVuZ3RoKTsKKworCWN1cnJlbnRfc3NpZC5sZW5ndGggPSAodWludDhfdCkgc2Vzc2lvbl9lbnRyeS0+c3NJZC5sZW5ndGg7CisKKwkvKgorCSAqIENoZWNrIGZvciBTU0lEIG9ubHkgaW4gcHJvYmUgcmVzcG9uc2UuIEJlYWNvbnMgbWF5IG5vdCBjYXJyeQorCSAqIFNTSUQgaW5mb3JtYXRpb24gaW4gaGlkZGVuIFNTSUQgY2FzZQorCSAqLworCWlmICgoKFNJUl9NQUNfTUdNVF9GUkFNRSA9PSBoZWFkZXItPmZjLnR5cGUpICYmCisJCShTSVJfTUFDX01HTVRfUFJPQkVfUlNQID09IGhlYWRlci0+ZmMuc3ViVHlwZSkpICYmCisJCWN1cnJlbnRfc3NpZC5sZW5ndGggJiYKKwkJKCFjZGZfbWVtX2NvbXBhcmUoKHVpbnQ4X3QgKikgJmJlYWNvbl9wcm9iZV9yc3AtPnNzSWQsCisJCQkJICAodWludDhfdCAqKSAmY3VycmVudF9zc2lkLAorCQkJCSAgKHVpbnQ4X3QpICgxICsgY3VycmVudF9zc2lkLmxlbmd0aCkpKSkgeworCQkvKgorCQkgKiBSZWNlaXZlZCBTU0lEIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIG9uZSB3ZSd2ZS4KKwkJICogSWdub3JlIHJlY2VpdmVkIEJlYWNvbiBmcmFtZQorCQkgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJIEZMKCJTU0lEIHJlY2VpdmVkIGluIEJlYWNvbiBkb2VzIG5vdCBtYXRjaCIpKTsKKyNpZmRlZiBXTEFOX0RFQlVHCisJCW1hY19jdHgtPmxpbS5nTGltQmNuU1NJRE1pc21hdGNoQ250Kys7CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworCWlmICghKExJTV9JU19CVF9BTVBfU1RBX1JPTEUoc2Vzc2lvbl9lbnRyeSkgfHwKKwkJTElNX0lTX1NUQV9ST0xFKHNlc3Npb25fZW50cnkpKSkKKwkJcmV0dXJuOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkgRkwoIlJlY2VpdmVkIEJlYWNvbi9QUiB3aXRoIG1hdGNoaW5nIEJTU0lEOiVwTSBQRVNlc3Npb25JRCAlZCIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+YnNzSWQsIHNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkKTsKKworCS8qIERlYWN0aXZhdGUgSm9pbiBGYWlsdXJlIHRpbWVyICovCisJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihtYWNfY3R4LCBlTElNX0pPSU5fRkFJTF9USU1FUik7CisJLyogRGVhY3RpdmF0ZSBQZXJpb2RpYyBKb2luIHRpbWVyICovCisJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihtYWNfY3R4LAorCQllTElNX1BFUklPRElDX0pPSU5fUFJPQkVfUkVRX1RJTUVSKTsKKworCWlmIChDREZfUDJQX0NMSUVOVF9NT0RFID09IHNlc3Npb25fZW50cnktPnBlUGVyc29uYSAmJgorCQliZWFjb25fcHJvYmVfcnNwLT5QMlBQcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UucHJlc2VudCkgeworCisJCW5vYV9kdXJhdGlvbl9mcm9tX2JlYWNvbiA9ICh1aW50MzJfdCAqKQorCQkoYmVhY29uX3Byb2JlX3JzcC0+UDJQUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLk5vQURlc2MgKyAxKTsKKworCQlpZiAoYmVhY29uX3Byb2JlX3JzcC0+UDJQUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKQorCQkJdG90YWxfbnVtX25vYV9kZXNjID0KKwkJCQliZWFjb25fcHJvYmVfcnNwLT5QMlBQcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UuCisJCQkJbnVtX05vQURlc2MgLyBTSVpFX09GX05PQV9ERVNDUklQVE9SOworCisJCW5vYSA9ICpub2FfZHVyYXRpb25fZnJvbV9iZWFjb247CisKKwkJaWYgKHRvdGFsX251bV9ub2FfZGVzYyA+IDEpIHsKKwkJCW5vYTJfZHVyYXRpb25fZnJvbV9iZWFjb24gPSAodWludDMyX3QgKikKKwkJCShiZWFjb25fcHJvYmVfcnNwLT5QMlBQcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UuTm9BRGVzYyArCisJCQkJU0laRV9PRl9OT0FfREVTQ1JJUFRPUiArIDEpOworCQkJbm9hICs9ICpub2EyX2R1cmF0aW9uX2Zyb21fYmVhY29uOworCQl9CisKKwkJLyoKKwkJICogSWYgTUFYIE5vYSBleGNlZWRzIDMgc2VjcyB3ZSB3aWxsIGNvbnNpZGVyIG9ubHkgMyBzZWNzIHRvCisJCSAqIGF2b2lkIGFyYml0YXJ5IHZhbHVlcyBpbiBub2EgZHVyYXRpb24gZmllbGQKKwkJICovCisJCW5vYSA9IG5vYSA+IE1BWF9OT0FfUEVSSU9EX0lOX01JQ1JPU0VDUyA/CisJCQkJTUFYX05PQV9QRVJJT0RfSU5fTUlDUk9TRUNTIDogbm9hOworCQlub2EgPSBub2EgLyAxMDAwOyAvKiBDb252ZXJ0IHRvIG1zICovCisKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwKKwkJCVdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVCwgJnZhbCkgPT0KKwkJCSBlU0lSX1NVQ0NFU1MpIHsKKwkJCXNlc3Npb25fZW50cnktPmRlZmF1bHRBdXRoRmFpbHVyZVRpbWVvdXQgPSB2YWw7CisJCQljZmdfc2V0X2ludChtYWNfY3R4LAorCQkJCVdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVCwKKwkJCQl2YWwgKyBub2EpOworCQl9CisJfSBlbHNlIHsKKwkJc2Vzc2lvbl9lbnRyeS0+ZGVmYXVsdEF1dGhGYWlsdXJlVGltZW91dCA9IDA7CisJfQorCisJLyogVXBkYXRlIEJlYWNvbiBJbnRlcnZhbCBhdCBDRkcgZGF0YWJhc2UgKi8KKworCWlmIChiZWFjb25fcHJvYmVfcnNwLT5IVENhcHMucHJlc2VudCkKKwkJbGltX3VwZGF0ZV9zdGFfcnVuX3RpbWVfaHRfY2FwYWJpbGl0eShtYWNfY3R4LAorCQkJICZiZWFjb25fcHJvYmVfcnNwLT5IVENhcHMpOworCWlmIChiZWFjb25fcHJvYmVfcnNwLT5IVEluZm8ucHJlc2VudCkKKwkJbGltX3VwZGF0ZV9zdGFfcnVuX3RpbWVfaHRfaW5mbyhtYWNfY3R4LAorCQkJICZiZWFjb25fcHJvYmVfcnNwLT5IVEluZm8sIHNlc3Npb25fZW50cnkpOworCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSk9JTkVEX1NUQVRFOworCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisJCQkgc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsIGVMSU1fTUxNX0pPSU5FRF9TVEFURSkpOworCisJLyoKKwkgKiB1cGRhdGUgdGhlIGNhcGFiaWxpdHkgaW5mbyBiYXNlZCBvbiByZWNlbnRseSByZWNlaXZlZCBiZWFjb24vcHJvYmUKKwkgKiByZXNwb25zZSBmcmFtZQorCSAqLworCXNlc3Npb25fZW50cnktPmxpbUN1cnJlbnRCc3NDYXBzID0KKwkJbGltX2dldF91MTYoKHVpbnQ4X3QgKikmYmVhY29uX3Byb2JlX3JzcC0+Y2FwYWJpbGl0eUluZm8pOworCisJLyoKKwkgKiBBbm5vdW5jZSBqb2luIHN1Y2Nlc3MgYnkgc2VuZGluZworCSAqIEpvaW4gY29uZmlybSB0byBTTUUuCisJICovCisJbWxtX2pvaW5fY25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCW1sbV9qb2luX2NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTOworCS8qIFVwZGF0ZSBQRSBzZXNzaW9uSWQgKi8KKwltbG1fam9pbl9jbmYuc2Vzc2lvbklkID0gc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQ7CisJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9KT0lOX0NORiwKKwkJCSAgICAgKHVpbnQzMl90ICopICZtbG1fam9pbl9jbmYpOworCisJaWYgKGJlYWNvbl9wcm9iZV9yc3AtPnZlbmRvcjJfaWUuVkhUQ2Fwcy5wcmVzZW50KSB7CisJCXNlc3Npb25fZW50cnktPmlzX3ZlbmRvcl9zcGVjaWZpY192aHRjYXBzID0gdHJ1ZTsKKwkJc2Vzc2lvbl9lbnRyeS0+dmVuZG9yX3NwZWNpZmljX3ZodF9pZV90eXBlID0KKwkJCWJlYWNvbl9wcm9iZV9yc3AtPnZlbmRvcjJfaWUudHlwZTsKKwkJc2Vzc2lvbl9lbnRyeS0+dmVuZG9yX3NwZWNpZmljX3ZodF9pZV9zdWJfdHlwZSA9CisJCQliZWFjb25fcHJvYmVfcnNwLT52ZW5kb3IyX2llLnN1Yl90eXBlOworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKAorCQkJIlZIVCBjYXBzIGFyZSBwcmVzZW50IGluIHZlbmRvciBzcGVjaWZpYyBJRSIpKTsKKwl9Cit9CisKKy8qKgorICogbGltX2V4dHJhY3RfYXBfY2FwYWJpbGl0aWVzKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBleHRyYWN0IGFsbCBvZiB0aGUgQVAncyBjYXBhYmlsaXRpZXMKKyAqIGZyb20gdGhlIElFcyByZWNlaXZlZCBmcm9tIGl0IGluIEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBmcmFtZXMKKyAqCisgKioqTE9HSUM6CisgKiBUaGlzIHJvdXRpbmUgbWltaWNzIHRoZSBsaW1fZXh0cmFjdF9hcF9jYXBhYmlsaXR5KCkgQVBJLiBUaGUgZGlmZmVyZW5jZSBoZXJlCisgKiBpcyB0aGF0IHRoaXMgQVBJIHJldHVybnMgdGhlIGVudGlyZSB0U2lyUHJvYmVSZXNwQmVhY29uIGluZm8gYXMgaXMuIEl0IGlzCisgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgb2YgdGhpcyBBUEkgdG8gdXNlIHRoaXMgaW5mbyBhcyByZXF1aXJlZAorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICAgcE1hYyAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgIHBJRSAgICAgICAgICBQb2ludGVyIHRvIHN0YXJ0aW5nIElFIGluIEJlYWNvbi9Qcm9iZSBSZXNwb25zZQorICogQHBhcmFtICAgaWVMZW4gICAgICAgIExlbmd0aCBvZiBhbGwgSUVzIGNvbWJpbmVkCisgKiBAcGFyYW0gICBiZWFjb25TdHJ1Y3QgQSBwb2ludGVyIHRvIHRTaXJQcm9iZVJlc3BCZWFjb24gdGhhdCBuZWVkcyB0byBiZQorICogICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlZAorICogQHJldHVybiAgc3RhdHVzICAgICAgIEEgc3RhdHVzIHJlcG9ydGluZyBlU0lSX1NVQ0NFU1Mgb3IgZVNJUl9GQUlMVVJFCisgKi8KK3RTaXJSZXRTdGF0dXMgbGltX2V4dHJhY3RfYXBfY2FwYWJpbGl0aWVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgdWludDhfdCAqcElFLAorCQkJCQkgIHVpbnQxNl90IGllTGVuLAorCQkJCQkgIHRwU2lyUHJvYmVSZXNwQmVhY29uIGJlYWNvblN0cnVjdCkKK3sKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBiZWFjb25TdHJ1Y3QsIHNpemVvZih0U2lyUHJvYmVSZXNwQmVhY29uKSwgMCk7CisKKwlQRUxPRzMobGltX2xvZyhwTWFjLCBMT0czLAorCQkgICAgICAgRkwKKwkJCSAgICAgICAoIkluIGxpbV9leHRyYWN0X2FwX2NhcGFiaWxpdGllczogVGhlIElFJ3MgYmVpbmcgcmVjZWl2ZWQgYXJlOiIpKTsKKwkgICAgICAgc2lyX2R1bXBfYnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0czLCBwSUUsIGllTGVuKTsKKwkgICAgICAgKQorCS8qIFBhcnNlIHRoZSBCZWFjb24gSUUncywgRG9uJ3QgdHJ5IHRvIHBhcnNlIGlmIHdlIGRvbnQgaGF2ZSBhbnl0aGluZyBpbiBJRSAqLworCWlmIChpZUxlbiA+IDApIHsKKwkJaWYgKGVTSVJfU1VDQ0VTUyAhPQorCQkgICAgc2lyX3BhcnNlX2JlYWNvbl9pZShwTWFjLCBiZWFjb25TdHJ1Y3QsIHBJRSwKKwkJCQkJKHVpbnQzMl90KSBpZUxlbikpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiQVBDYXBFeHRyYWN0OiBCZWFjb24gcGFyc2luZyBlcnJvciEiKSk7CisJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQl9CisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqCisgKiBsaW1fZGVsX2JzcygpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVsZXRlIEJTUyBjb250ZXh0IGF0IGhhcmR3YXJlCisgKiB3aGVuZXZlciBhIFNUQSBpcyBkaXNhc3NvY2lhdGVkCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzICAtIFBvaW50ZXIgdG8gdGhlIFNUQSBkYXRhc3RydWN0dXJlIGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgIExJTSBhbmQgbWFpbnRhaW5lZCBieSBEUEgKKyAqIEByZXR1cm4gcmV0Q29kZSAtIEluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUgcmV0dXJuIGNvZGUKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1fZGVsX2Jzcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywgdWludDE2X3QgYnNzSWR4LAorCSAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwRGVsZXRlQnNzUGFyYW1zIHBEZWxCc3NQYXJhbXMgPSBOVUxMOworCXRTaXJNc2dRIG1zZ1E7CisJdFNpclJldFN0YXR1cyByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworCisJcERlbEJzc1BhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0RGVsZXRlQnNzUGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gcERlbEJzc1BhcmFtcykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgQUREX0JTUyIpKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcERlbEJzc1BhcmFtcywgc2l6ZW9mKHREZWxldGVCc3NQYXJhbXMpLCAwKTsKKworCXBEZWxCc3NQYXJhbXMtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOyAvKiB1cGRhdGUgUEUgc2Vzc2lvbiBJZCAqLworCisJLyogRFBIIHdhcyBzdG9yaW5nIHRoZSBBc3NvY0lEIGluIHN0YUlEIGZpZWxkLCAqLworCS8qIHN0YUlEIGlzIGFjdHVhbGx5IGFzc2lnbmVkIGJ5IEhBTCB3aGVuIEFkZFNUQSBtZXNzYWdlIGlzIHNlbnQuICovCisJaWYgKHBTdGFEcyAhPSBOVUxMKSB7CisJCXBEZWxCc3NQYXJhbXMtPmJzc0lkeCA9IHBTdGFEcy0+YnNzSWQ7CisJCXBTdGFEcy0+dmFsaWQgPSAwOworCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPSBlTElNX01MTV9XVF9ERUxfQlNTX1JTUF9TVEFURTsKKwl9IGVsc2UKKwkJcERlbEJzc1BhcmFtcy0+YnNzSWR4ID0gYnNzSWR4OworCXBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfREVMX0JTU19SU1BfU1RBVEU7CisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJICAgICAgIGVMSU1fTUxNX1dUX0RFTF9CU1NfUlNQX1NUQVRFKSk7CisKKwlpZiAoKHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkID09CisJICAgICBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Kb2luRmFpbHVyZVRpbWVyLnNlc3Npb25JZCkKKwkgICAgJiYgKHRydWUgPT0KKwkJdHhfdGltZXJfcnVubmluZygmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltSm9pbkZhaWx1cmVUaW1lcikpKSB7CisJCWxpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfdGltZXIocE1hYywgZUxJTV9KT0lOX0ZBSUxfVElNRVIpOworCX0KKworCXBEZWxCc3NQYXJhbXMtPnN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlwRGVsQnNzUGFyYW1zLT5yZXNwUmVxZCA9IDE7CisJY2RmX21lbV9jb3B5KHBEZWxCc3NQYXJhbXMtPmJzc2lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlwRGVsQnNzUGFyYW1zLT5zbWVzZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisJUEVMT0dXKGxpbV9sb2cKKwkJICAgICAgIChwTWFjLCBMT0dXLAorCQkgICAgICAgRkwoIlNlc3Npb25pZCAlZCA6IFNlbmRpbmcgSEFMX0RFTEVURV9CU1NfUkVRICIKKwkJCSAgImZvciBic3MgaWR4OiAlWCBCU1NJRDoiIE1BQ19BRERSRVNTX1NUUiksCisJCSAgICAgICBwRGVsQnNzUGFyYW1zLT5zZXNzaW9uSWQsIHBEZWxCc3NQYXJhbXMtPmJzc0lkeCwKKwkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBzZXNzaW9uRW50cnktPmJzc0lkKSk7CisJICAgICAgICkKKwkvKiB3ZSBuZWVkIHRvIGRlZmVyIHRoZSBtZXNzYWdlIHVudGlsIHdlIGdldCB0aGUgcmVzcG9uc2UgYmFjayBmcm9tIEhBTC4gKi8KKwlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCBmYWxzZSk7CisKKwltc2dRLnR5cGUgPSBXTUFfREVMRVRFX0JTU19SRVE7CisJbXNnUS5yZXNlcnZlZCA9IDA7CisJbXNnUS5ib2R5cHRyID0gcERlbEJzc1BhcmFtczsKKwltc2dRLmJvZHl2YWwgPSAwOworCisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIG1zZ1EudHlwZSkpOworCisJcmV0Q29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2dRKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHJldENvZGUpIHsKKwkJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJQb3N0aW5nIERFTEVURV9CU1NfUkVRIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWCIpLAorCQkJcmV0Q29kZSk7CisJCWNkZl9tZW1fZnJlZShwRGVsQnNzUGFyYW1zKTsKKwl9CisKKwlyZXR1cm4gcmV0Q29kZTsKK30KKworLyoqCisgKiBsaW1fdXBkYXRlX3ZodGNhcHNfYXNzb2NfcmVzcCA6IFVwZGF0ZSBWSFQgY2FwcyBpbiBhc3NvYyByZXNwb25zZS4KKyAqIEBtYWNfY3R4IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwQWRkQnNzUGFyYW1zOiBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBhZGQgYnNzIHBhcmFtcy4KKyAqIEB2aHRfY2FwczogVkhUIGNhcGFiaWxpdGllcy4KKyAqIEBwc2Vzc2lvbkVudHJ5IDogc2Vzc2lvbiBlbnRyeS4KKyAqCisgKiBSZXR1cm4gOiB2b2lkCisgKi8KK3ZvaWQgbGltX3VwZGF0ZV92aHRjYXBzX2Fzc29jX3Jlc3AodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdHBBZGRCc3NQYXJhbXMgcEFkZEJzc1BhcmFtcywKKwkJdERvdDExZklFVkhUQ2FwcyAqdmh0X2NhcHMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC52aHRfY2FwcyA9CisJCSgodmh0X2NhcHMtPm1heE1QRFVMZW4gPDwKKwkJICBTSVJfTUFDX1ZIVF9DQVBfTUFYX01QRFVfTEVOKSB8CisJCSAodmh0X2NhcHMtPnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA8PAorCQkgIFNJUl9NQUNfVkhUX0NBUF9TVVBQX0NIX1dJRFRIX1NFVCkgfAorCQkgKHZodF9jYXBzLT5sZHBjQ29kaW5nQ2FwIDw8CisJCSAgU0lSX01BQ19WSFRfQ0FQX0xEUENfQ09ESU5HX0NBUCkgfAorCQkgKHZodF9jYXBzLT5zaG9ydEdJODBNSHogPDwKKwkJICBTSVJfTUFDX1ZIVF9DQVBfU0hPUlRHSV84ME1IWikgfAorCQkgKHZodF9jYXBzLT5zaG9ydEdJMTYwYW5kODBwbHVzODBNSHogPDwKKwkJICBTSVJfTUFDX1ZIVF9DQVBfU0hPUlRHSV8xNjBfODBfODBNSFopIHwKKwkJICh2aHRfY2Fwcy0+dHhTVEJDIDw8CisJCSAgU0lSX01BQ19WSFRfQ0FQX1RYU1RCQykgfAorCQkgKHZodF9jYXBzLT5yeFNUQkMgPDwKKwkJICBTSVJfTUFDX1ZIVF9DQVBfUlhTVEJDKSB8CisJCSAodmh0X2NhcHMtPnN1QmVhbUZvcm1lckNhcCA8PAorCQkgIFNJUl9NQUNfVkhUX0NBUF9TVV9CRUFNRk9STUVSX0NBUCkgfAorCQkgKHZodF9jYXBzLT5zdUJlYW1mb3JtZWVDYXAgPDwKKwkJICBTSVJfTUFDX1ZIVF9DQVBfU1VfQkVBTUZPUk1FRV9DQVApIHwKKwkJICh2aHRfY2Fwcy0+Y3Nub2ZCZWFtZm9ybWVyQW50U3VwIDw8CisJCSAgU0lSX01BQ19WSFRfQ0FQX0NTTl9CRUFNT1JNRVJfQU5UX1NVUCkgfAorCQkgKHZodF9jYXBzLT5udW1Tb3VuZGluZ0RpbSA8PAorCQkgIFNJUl9NQUNfVkhUX0NBUF9OVU1fU09VTkRJTkdfRElNKSB8CisJCSAodmh0X2NhcHMtPm11QmVhbWZvcm1lckNhcCA8PAorCQkgIFNJUl9NQUNfVkhUX0NBUF9OVU1fQkVBTV9GT1JNRVJfQ0FQKSB8CisJCSAodmh0X2NhcHMtPm11QmVhbWZvcm1lZUNhcCA8PAorCQkgIFNJUl9NQUNfVkhUX0NBUF9OVU1fQkVBTV9GT1JNRUVfQ0FQKSB8CisJCSAodmh0X2NhcHMtPnZodFRYT1BQUyA8PAorCQkgIFNJUl9NQUNfVkhUX0NBUF9UWE9QUFMpIHwKKwkJICh2aHRfY2Fwcy0+aHRjVkhUQ2FwIDw8CisJCSAgU0lSX01BQ19WSFRfQ0FQX0hUQ19DQVApIHwKKwkJICh2aHRfY2Fwcy0+bWF4QU1QRFVMZW5FeHAgPDwKKwkJICBTSVJfTUFDX1ZIVF9DQVBfTUFYX0FNRFVfTEVOX0VYUE8pIHwKKwkJICh2aHRfY2Fwcy0+dmh0TGlua0FkYXB0Q2FwIDw8CisJCSAgU0lSX01BQ19WSFRfQ0FQX0xJTktfQURBUFRfQ0FQKSB8CisJCSAodmh0X2NhcHMtPnJ4QW50UGF0dGVybiA8PAorCQkgIFNJUl9NQUNfVkhUX0NBUF9SWF9BTlRFTk5BX1BBVFRFUk4pIHwKKwkJICh2aHRfY2Fwcy0+dHhBbnRQYXR0ZXJuIDw8CisJCSAgU0lSX01BQ19WSFRfQ0FQX1RYX0FOVEVOTkFfUEFUVEVSTikgfAorCQkgKHZodF9jYXBzLT5yZXNlcnZlZDEgPDwKKwkJICBTSVJfTUFDX1ZIVF9DQVBfUkVTRVJWRUQyKSk7CisKKwlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtcGR1U2l6ZSA9CisJCVNJUl9NQUNfR0VUX1ZIVF9NQVhfQU1QRFVfRVhQTygKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnZodF9jYXBzKTsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlVwZGF0aW5nIFZIVCBjYXBzIGluIGFzc29jIFJlc3BvbnNlIikpOworfQorCisvKioKKyAqIGxpbV91cGRhdGVfdmh0X29wZXJfYXNzb2NfcmVzcCA6IFVwZGF0ZSBWSFQgT3BlcmF0aW9ucyBpbiBhc3NvYyByZXNwb25zZS4KKyAqIEBtYWNfY3R4IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwQWRkQnNzUGFyYW1zOiBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBhZGQgYnNzIHBhcmFtcy4KKyAqIEB2aHRfb3BlcjogVkhUIE9wZXJhdGlvbnMgdG8gdXBkYXRlLgorICogQHBzZXNzaW9uRW50cnkgOiBzZXNzaW9uIGVudHJ5LgorICoKKyAqIFJldHVybiA6IHZvaWQKKyAqLwordm9pZCBsaW1fdXBkYXRlX3ZodF9vcGVyX2Fzc29jX3Jlc3AodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdHBBZGRCc3NQYXJhbXMgcEFkZEJzc1BhcmFtcywKKwkJdERvdDExZklFVkhUT3BlcmF0aW9uICp2aHRfb3BlciwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlpZiAodmh0X29wZXItPmNoYW5XaWR0aCAmJgorCQkJcHNlc3Npb25FbnRyeS0+Y2hfd2lkdGgpIHsKKwkJcEFkZEJzc1BhcmFtcy0+Y2hfd2lkdGggPSB2aHRfb3Blci0+Y2hhbldpZHRoICsgMTsKKworCQlwQWRkQnNzUGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCXZodF9vcGVyLT5jaGFuQ2VudGVyRnJlcVNlZzE7CisKKwkJcEFkZEJzc1BhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMSA9CisJCQl2aHRfb3Blci0+Y2hhbkNlbnRlckZyZXFTZWcyOworCX0KKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJVcGRhdGluZyBWSFQgT3BlcmF0aW9uIGluIGFzc29jIFJlc3BvbnNlIikpOworfQorCisKKy8qKgorICogbGltU2VuZEFkZEJzcygpCisgKgorICoqKkZVTkNUSU9OOgorICoKKyAqKipMT0dJQzoKKyAqIDEpIExJTSByZWNlaXZlcyBlV05JX1NNRV9KT0lOX1JFUQorICogMikgRm9yIGEgdmFsaWQgZVdOSV9TTUVfSk9JTl9SRVEsIExJTSBzZW5kcworICogU0lSX0hBTF9BRERfQlNTX1JFUSB0byBIQUwKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBKT0lOIFJFUSBwYXJhbWV0ZXJzIGFyZSBzYXZlZCBpbiBwTWFjLT5saW0uZ0xpbU1sbUpvaW5SZXEKKyAqIEFERCBCU1MgcGFyYW1ldGVycyBjYW4gYmUgb2J0YWluZWQgZnJvbSB0d28gc291cmNlczoKKyAqIDEpIHBNYWMtPmxpbS5nTGltTWxtSm9pblJlcQorICogMikgYmVhY29uU3RydWN0LCBwYXNzZWQgYXMgcGFyYW10ZXIKKyAqIFNvLCBpZiBhIHJlcWQgcGFyYW1ldGVyIGlzIGZvdW5kIGluIGJzc0Rlc2NyaXB0aW9ucworICogdGhlbiBpdCBpcyBnaXZlbiBwcmVmZXJlbmNlIG92ZXIgYmVhY29uU3RydWN0CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICBwQXNzb2NSc3AgICAgY29udGFpbnMgdGhlIHN0cnVjdHVyZWQgYXNzb2MvcmVhc3NvYyBSZXNwb25zZSBnb3QgZnJvbSBBUAorICogICAgICAgICAgICAgIGJlYWNvbnN0cnVjdCAgICAgICAgSGFzIHRoZSBQcm9iZVJzcC9CZWFjb24gc3RydWN0dXJlZCBkZXRhaWxzCisgKiAgICAgICAgICAgICAgYnNzRGVzY3JpcHRpb24gICAgICBic3NEZXNjcmlwdGlvbiBwYXNzZWQgdG8gUEUgZnJvbSB0aGUgU01FCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzIGxpbV9zdGFfc2VuZF9hZGRfYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyQXNzb2NSc3AgcEFzc29jUnNwLAorCQkJCSAgIHRwU2NoQmVhY29uU3RydWN0IHBCZWFjb25TdHJ1Y3QsCisJCQkJICAgdHBTaXJCc3NEZXNjcmlwdGlvbiBic3NEZXNjcmlwdGlvbiwKKwkJCQkgICB1aW50OF90IHVwZGF0ZUVudHJ5LCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJNc2dRIG1zZ1E7CisJdHBBZGRCc3NQYXJhbXMgcEFkZEJzc1BhcmFtcyA9IE5VTEw7CisJdWludDMyX3QgcmV0Q29kZTsKKwl0cERwaEhhc2hOb2RlIHBTdGFEcyA9IE5VTEw7CisJdWludDhfdCBjaGFuV2lkdGhTdXBwID0gMDsKKwl1aW50MzJfdCBzaG9ydEdpMjBNaHpTdXBwb3J0OworCXVpbnQzMl90IHNob3J0R2k0ME1oelN1cHBvcnQ7CisJdWludDMyX3QgZW5hYmxlVHhCRjIwTUh6OworCXREb3QxMWZJRVZIVENhcHMgKnZodF9jYXBzID0gTlVMTDsKKwl0RG90MTFmSUVWSFRPcGVyYXRpb24gKnZodF9vcGVyID0gTlVMTDsKKwl0QWRkU3RhUGFyYW1zICpzdGFfY29udGV4dDsKKworCS8qIFBhY2thZ2UgU0lSX0hBTF9BRERfQlNTX1JFUSBtZXNzYWdlIHBhcmFtZXRlcnMgKi8KKwlwQWRkQnNzUGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBZGRCc3NQYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBwQWRkQnNzUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBBRERfQlNTIikpOworCQlyZXRDb2RlID0gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQlnb3RvIHJldHVybkZhaWx1cmU7CisJfSBlbHNlCisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBBZGRCc3NQYXJhbXMsIHNpemVvZih0QWRkQnNzUGFyYW1zKSwKKwkJCSAgICAwKTsKKworCWNkZl9tZW1fY29weShwQWRkQnNzUGFyYW1zLT5ic3NJZCwgYnNzRGVzY3JpcHRpb24tPmJzc0lkLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCS8qIEZpbGwgaW4gdEFkZEJzc1BhcmFtcyBzZWxmTWFjQWRkciAqLworCWNkZl9tZW1fY29weShwQWRkQnNzUGFyYW1zLT5zZWxmTWFjQWRkciwKKwkJICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsCisJCUZMKCJzZXNzaW9uaWQ6ICVkIHVwZGF0ZUVudHJ5ID0gJWQgbGltc3lzdGVtcm9sZSA9ICVkICIpLAorCQlwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQsIHVwZGF0ZUVudHJ5LAorCQlHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpKTsKKworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIkJTU0lEOiAiIE1BQ19BRERSRVNTX1NUUiksCisJCU1BQ19BRERSX0FSUkFZKHBBZGRCc3NQYXJhbXMtPmJzc0lkKSk7CisKKwlpZiAocHNlc3Npb25FbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX0FQX01PREUpIHsKKwkJcEFkZEJzc1BhcmFtcy0+YnNzVHlwZSA9IGVTSVJfQlRBTVBfQVBfTU9ERTsKKwl9IGVsc2UgeworCQlwQWRkQnNzUGFyYW1zLT5ic3NUeXBlID0gZVNJUl9JTkZSQVNUUlVDVFVSRV9NT0RFOworCX0KKworCXBBZGRCc3NQYXJhbXMtPm9wZXJNb2RlID0gQlNTX09QRVJBVElPTkFMX01PREVfU1RBOworCisJLyogVXBkYXRlIFBFIHNlc3Npb24gSUQgKi8KKwlwQWRkQnNzUGFyYW1zLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworCXBBZGRCc3NQYXJhbXMtPmJlYWNvbkludGVydmFsID0gYnNzRGVzY3JpcHRpb24tPmJlYWNvbkludGVydmFsOworCisJcEFkZEJzc1BhcmFtcy0+ZHRpbVBlcmlvZCA9IHBCZWFjb25TdHJ1Y3QtPnRpbS5kdGltUGVyaW9kOworCXBBZGRCc3NQYXJhbXMtPnVwZGF0ZUJzcyA9IHVwZGF0ZUVudHJ5OworCisJcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBDb3VudCA9IHBCZWFjb25TdHJ1Y3QtPmNmUGFyYW1TZXQuY2ZwQ291bnQ7CisJcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBQZXJpb2QgPQorCQlwQmVhY29uU3RydWN0LT5jZlBhcmFtU2V0LmNmcFBlcmlvZDsKKwlwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcE1heER1cmF0aW9uID0KKwkJcEJlYWNvblN0cnVjdC0+Y2ZQYXJhbVNldC5jZnBNYXhEdXJhdGlvbjsKKwlwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcER1clJlbWFpbmluZyA9CisJCXBCZWFjb25TdHJ1Y3QtPmNmUGFyYW1TZXQuY2ZwRHVyUmVtYWluaW5nOworCisJcEFkZEJzc1BhcmFtcy0+cmF0ZVNldC5udW1SYXRlcyA9IHBBc3NvY1JzcC0+c3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXM7CisJY2RmX21lbV9jb3B5KHBBZGRCc3NQYXJhbXMtPnJhdGVTZXQucmF0ZSwKKwkJICAgICBwQXNzb2NSc3AtPnN1cHBvcnRlZFJhdGVzLnJhdGUsCisJCSAgICAgcEFzc29jUnNwLT5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlcyk7CisKKwlpZiAoSVNfRE9UMTFfTU9ERV8xMUIocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSAmJgorCSAgICBic3NEZXNjcmlwdGlvbi0+bndUeXBlICE9IGVTSVJfMTFCX05XX1RZUEUpIHsKKwkJcEFkZEJzc1BhcmFtcy0+bndUeXBlID0gZVNJUl8xMUJfTldfVFlQRTsKKwl9IGVsc2UgeworCQlwQWRkQnNzUGFyYW1zLT5ud1R5cGUgPSBic3NEZXNjcmlwdGlvbi0+bndUeXBlOworCX0KKworCXBBZGRCc3NQYXJhbXMtPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQgPQorCQkodWludDhfdCkgcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5zaG9ydFNsb3RUaW1lOworCXBBZGRCc3NQYXJhbXMtPmxsYUNvZXhpc3QgPQorCQkodWludDhfdCkgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3Q7CisJcEFkZEJzc1BhcmFtcy0+bGxiQ29leGlzdCA9CisJCSh1aW50OF90KSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxiQ29leGlzdDsKKwlwQWRkQnNzUGFyYW1zLT5sbGdDb2V4aXN0ID0KKwkJKHVpbnQ4X3QpIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0OworCXBBZGRCc3NQYXJhbXMtPmh0MjBDb2V4aXN0ID0KKwkJKHVpbnQ4X3QpIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdDsKKworCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoIiBCU1MgVHlwZSAlZCBCZWFjb24gSW50ZXJ2YWw6ICVkIGR0aW1QZXJpb2Q6ICVkICIKKwkJCSAgICAgICAiY2ZwQ291bnQ6ICVkIiksIHBBZGRCc3NQYXJhbXMtPmJzc1R5cGUsCisJCXBBZGRCc3NQYXJhbXMtPmJlYWNvbkludGVydmFsLCBwQWRkQnNzUGFyYW1zLT5kdGltUGVyaW9kLAorCQlwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcENvdW50KTsKKworCWxpbV9sb2cocE1hYywgTE9HMiwKKwkJRkwoIiBjZnBQZXJpb2Q6ICVkIGNmcE1heER1cmF0aW9uOiAlZCBjZnBEdXJSZW1haW5pbmc6IgorCQkgICAiICVkIG51bVJhdGVzOiAlZCAiKSwgcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBQZXJpb2QsCisJCXBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwTWF4RHVyYXRpb24sCisJCXBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwRHVyUmVtYWluaW5nLAorCQlwQWRkQnNzUGFyYW1zLT5yYXRlU2V0Lm51bVJhdGVzKTsKKworCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoIm53VHlwZTolZCBzaG9ydFNsb3RUaW1lU3VwcG9ydGVkOiAlZCIKKwkJCSAgICAgICAibGxhQ29leGlzdDogJWQgbGxiQ29leGlzdDogJWQgbGxnQ29leGlzdDogJWQgaHQyMENvZXhpc3Q6ICVkIiksCisJCXBBZGRCc3NQYXJhbXMtPm53VHlwZSwgcEFkZEJzc1BhcmFtcy0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCwKKwkJcEFkZEJzc1BhcmFtcy0+bGxhQ29leGlzdCwgcEFkZEJzc1BhcmFtcy0+bGxiQ29leGlzdCwKKwkJcEFkZEJzc1BhcmFtcy0+bGxnQ29leGlzdCwgcEFkZEJzc1BhcmFtcy0+aHQyMENvZXhpc3QpOworCisJcEFkZEJzc1BhcmFtcy0+ZG90MTFfbW9kZSA9IHBzZXNzaW9uRW50cnktPmRvdDExbW9kZTsKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJkb3QxMV9tb2RlOiVkIiksIHBBZGRCc3NQYXJhbXMtPmRvdDExX21vZGUpOworCisJLyogVXNlIHRoZSBhZHZlcnRpc2VkIGNhcGFiaWxpdGllcyBmcm9tIHRoZSByZWNlaXZlZCBiZWFjb24vUFIgKi8KKworCWlmIChJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSkKKwkgICAgJiYgKHBBc3NvY1JzcC0+SFRDYXBzLnByZXNlbnQpKSB7CisJCXBBZGRCc3NQYXJhbXMtPmh0Q2FwYWJsZSA9IHBBc3NvY1JzcC0+SFRDYXBzLnByZXNlbnQ7CisJCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoImh0Q2FwYWJsZTogJWQiKSwKKwkJCXBBZGRCc3NQYXJhbXMtPmh0Q2FwYWJsZSk7CisJCWlmIChwQmVhY29uU3RydWN0LT5IVEluZm8ucHJlc2VudCkgeworCQkJcEFkZEJzc1BhcmFtcy0+aHRPcGVyTW9kZSA9CisJCQkJKHRTaXJNYWNIVE9wZXJhdGluZ01vZGUpIHBBc3NvY1JzcC0+SFRJbmZvLm9wTW9kZTsKKwkJCXBBZGRCc3NQYXJhbXMtPmR1YWxDVFNQcm90ZWN0aW9uID0KKwkJCQkodWludDhfdCkgcEFzc29jUnNwLT5IVEluZm8uZHVhbENUU1Byb3RlY3Rpb247CisJCQljaGFuV2lkdGhTdXBwID0KKwkJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkocE1hYywKKwkJCQkJCSAgICAgIGVIVF9TVVBQT1JURURfQ0hBTk5FTF9XSURUSF9TRVQsCisJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCWlmICgocEFzc29jUnNwLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KQorCQkJICAgICYmIChjaGFuV2lkdGhTdXBwKSkgeworCQkJCXBBZGRCc3NQYXJhbXMtPmNoX3dpZHRoID0gKHVpbnQ4X3QpCisJCQkJCXBBc3NvY1JzcC0+SFRJbmZvLnJlY29tbWVuZGVkVHhXaWR0aFNldDsKKwkJCQlpZiAocEFzc29jUnNwLT5IVEluZm8uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9PQorCQkJCQkJUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZKQorCQkJCQlwQWRkQnNzUGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQkJCWJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQgKyAyOworCQkJCWVsc2UgaWYgKHBBc3NvY1JzcC0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPT0KKwkJCQkJCVBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlkpCisJCQkJCXBBZGRCc3NQYXJhbXMtPmNoX2NlbnRlcl9mcmVxX3NlZzAgPQorCQkJCQkJYnNzRGVzY3JpcHRpb24tPmNoYW5uZWxJZCAtIDI7CisJCQl9IGVsc2UgeworCQkJCXBBZGRCc3NQYXJhbXMtPmNoX3dpZHRoID0gQ0hfV0lEVEhfMjBNSFo7CisJCQkJcEFkZEJzc1BhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMCA9IDA7CisJCQl9CisJCQlwQWRkQnNzUGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgPQorCQkJCSh1aW50OF90KSBwQXNzb2NSc3AtPkhUSW5mby5ub25HRkRldmljZXNQcmVzZW50OworCQkJcEFkZEJzc1BhcmFtcy0+ZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0KKwkJCQkodWludDhfdCkgcEFzc29jUnNwLT5IVEluZm8uCisJCQkJbHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisJCQlwQWRkQnNzUGFyYW1zLT5mUklGU01vZGUgPSBwQXNzb2NSc3AtPkhUSW5mby5yaWZzTW9kZTsKKworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJodE9wZXJNb2RlOiAlZCBkdWFsQ1RTUHJvdGVjdGlvbjogJWQgdHhDaGFubmVsV2lkdGg6ICVkIGNlbnRlcl9mcmVxXzA6ICVkICIpLAorCQkJCXBBZGRCc3NQYXJhbXMtPmh0T3Blck1vZGUsCisJCQkJcEFkZEJzc1BhcmFtcy0+ZHVhbENUU1Byb3RlY3Rpb24sCisJCQkJcEFkZEJzc1BhcmFtcy0+Y2hfd2lkdGgsCisJCQkJcEFkZEJzc1BhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMCk7CisKKwkJCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoImxsbk5vbkdGQ29leGlzdDogJWQgIgorCQkJCQkgICAgICAgImZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDogJWQgZlJJRlNNb2RlICVkIiksCisJCQkJcEFkZEJzc1BhcmFtcy0+bGxuTm9uR0ZDb2V4aXN0LAorCQkJCXBBZGRCc3NQYXJhbXMtPmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCwKKwkJCQlwQWRkQnNzUGFyYW1zLT5mUklGU01vZGUpOworCQl9CisJfQorCisJcEFkZEJzc1BhcmFtcy0+Y3VycmVudE9wZXJDaGFubmVsID0gYnNzRGVzY3JpcHRpb24tPmNoYW5uZWxJZDsKKwlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJjdXJyZW50T3BlckNoYW5uZWwgJWQiKSwKKwkJcEFkZEJzc1BhcmFtcy0+Y3VycmVudE9wZXJDaGFubmVsKTsKKwlpZiAocHNlc3Npb25FbnRyeS0+dmh0Q2FwYWJpbGl0eSAmJiAocEFzc29jUnNwLT5WSFRDYXBzLnByZXNlbnQpKSB7CisJCXBBZGRCc3NQYXJhbXMtPnZodENhcGFibGUgPSBwQXNzb2NSc3AtPlZIVENhcHMucHJlc2VudDsKKwkJdmh0X2NhcHMgPSAgJnBBc3NvY1JzcC0+VkhUQ2FwczsKKwkJdmh0X29wZXIgPSAmcEFzc29jUnNwLT5WSFRPcGVyYXRpb247CisJfSBlbHNlIGlmIChwc2Vzc2lvbkVudHJ5LT52aHRDYXBhYmlsaXR5ICYmCisJCQlwQXNzb2NSc3AtPnZlbmRvcjJfaWUuVkhUQ2Fwcy5wcmVzZW50KXsKKwkJcEFkZEJzc1BhcmFtcy0+dmh0Q2FwYWJsZSA9CisJCQlwQXNzb2NSc3AtPnZlbmRvcjJfaWUuVkhUQ2Fwcy5wcmVzZW50OworCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQlGTCgiVkhUIENhcHMgYW5kIE9wZXJhdGlvbiBhcmUgcHJlc2VudCBpbiB2ZW5kb3IgU3BlY2ZpYyBJRSIpKTsKKwkJdmh0X2NhcHMgPSAmcEFzc29jUnNwLT52ZW5kb3IyX2llLlZIVENhcHM7CisJCXZodF9vcGVyID0gJnBBc3NvY1JzcC0+dmVuZG9yMl9pZS5WSFRPcGVyYXRpb247CisJfSBlbHNlIHsKKwkJcEFkZEJzc1BhcmFtcy0+dmh0Q2FwYWJsZSA9IDA7CisJfQorCWlmIChwQWRkQnNzUGFyYW1zLT52aHRDYXBhYmxlKSB7CisJCWlmICh2aHRfb3BlciAhPSBOVUxMKQorCQkJbGltX3VwZGF0ZV92aHRfb3Blcl9hc3NvY19yZXNwKHBNYWMsIHBBZGRCc3NQYXJhbXMsCisJCQkJCXZodF9vcGVyLCBwc2Vzc2lvbkVudHJ5KTsKKwkJaWYgKHZodF9jYXBzICE9IE5VTEwpCisJCQlsaW1fdXBkYXRlX3ZodGNhcHNfYXNzb2NfcmVzcChwTWFjLCBwQWRkQnNzUGFyYW1zLAorCQkJCQl2aHRfY2FwcywgcHNlc3Npb25FbnRyeSk7CisJfQorCisJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgidmh0Q2FwYWJsZSAlZCBUeENoYW5uZWxXaWR0aCAlZCBjZW50ZXJfZnJlcV8wICVkIGNlbnRlcl9mcmVxXzEgJWQiKSwKKwkJCXBBZGRCc3NQYXJhbXMtPnZodENhcGFibGUsIHBBZGRCc3NQYXJhbXMtPmNoX3dpZHRoLAorCQkJcEFkZEJzc1BhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMCwKKwkJCXBBZGRCc3NQYXJhbXMtPmNoX2NlbnRlcl9mcmVxX3NlZzEpOworCisJLyoKKwkgKiBQb3B1bGF0ZSB0aGUgU1RBLXJlbGF0ZWQgcGFyYW1ldGVycyBoZXJlCisJICogTm90ZSB0aGF0IHRoZSBTVEEgaGVyZSByZWZlcnMgdG8gdGhlIEFQCisJICogc3RhVHlwZSA9IFBFRVIKKwkgKi8KKwlzdGFfY29udGV4dCA9ICZwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0OworCS8qIElkZW50aWZ5aW5nIEFQIGFzIGFuIFNUQSAqLworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhVHlwZSA9IFNUQV9FTlRSWV9PVEhFUjsKKworCWNkZl9tZW1fY29weShwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmJzc0lkLAorCQkJYnNzRGVzY3JpcHRpb24tPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmxpc3RlbkludGVydmFsID0KKwkJYnNzRGVzY3JpcHRpb24tPmJlYWNvbkludGVydmFsOworCisJLyogRmlsbCBBc3NvYyBpZCBmcm9tIHRoZSBkcGggdGFibGUgKi8KKwlwU3RhRHMgPSBkcGhfbG9va3VwX2hhc2hfZW50cnkocE1hYywgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5ic3NJZCwKKwkJCQkmcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5hc3NvY0lkLAorCQkJCSZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAocFN0YURzID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkiQ291bGRuJ3QgZ2V0IGFzc29jIGlkIGZvciAiICJNQUMgQUREUjogIgorCQkJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJCQlNQUNfQUREUl9BUlJBWSgKKwkJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFNYWMpKTsKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51QVBTRCA9CisJCXBzZXNzaW9uRW50cnktPmdVYXBzZFBlckFjQml0bWFzazsKKworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4U1BMZW4gPSAwOworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc2hvcnRQcmVhbWJsZVN1cHBvcnRlZCA9CisJCSh1aW50OF90KSBwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLnNob3J0UHJlYW1ibGU7CisJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51cGRhdGVTdGEgPSB1cGRhdGVFbnRyeTsKKworCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoIlN0YUNvbnRleHQ6ICIgTUFDX0FERFJFU1NfU1RSCisJCQkJIiBzaG9ydFByZWFtYmxlU3VwcG9ydGVkOiAlZCIpLAorCQkJTUFDX0FERFJfQVJSQVkocEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFNYWMpLAorCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zaG9ydFByZWFtYmxlU3VwcG9ydGVkKTsKKworCWlmIChJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSkKKwkJCSYmIHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5wcmVzZW50KSB7CisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudXMzMk1heEFtcGR1RHVyYXRpb24gPSAwOworCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmh0Q2FwYWJsZSA9IDE7CisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZ3JlZW5GaWVsZENhcGFibGUgPQorCQkJKHVpbnQ4X3QpIHBBc3NvY1JzcC0+SFRDYXBzLmdyZWVuRmllbGQ7CisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubHNpZ1R4b3BQcm90ZWN0aW9uID0KKwkJCSh1aW50OF90KSBwQXNzb2NSc3AtPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb247CisJCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoCisJCQkJIlN0YUN0eDogaHRDYXAgJWQgR0ZjYXAgJWQgbHNpZ1R4b3BQcm90biAlZCIpLAorCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuaHRDYXBhYmxlLAorCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZ3JlZW5GaWVsZENhcGFibGUsCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5sc2lnVHhvcFByb3RlY3Rpb24pOworCQlpZiAocHNlc3Npb25FbnRyeS0+dmh0Q2FwYWJpbGl0eSAmJgorCQkJCShJU19CU1NfVkhUX0NBUEFCTEUocEJlYWNvblN0cnVjdC0+VkhUQ2FwcykgfHwKKwkJCQkgSVNfQlNTX1ZIVF9DQVBBQkxFKAorCQkJCQkgcEJlYWNvblN0cnVjdC0+dmVuZG9yMl9pZS5WSFRDYXBzKSkpIHsKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudmh0Q2FwYWJsZSA9IDE7CisJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnZodFN1cHBvcnRlZFJ4TnNzID0KKwkJCQlwU3RhRHMtPnZodFN1cHBvcnRlZFJ4TnNzOworCQkJaWYgKHBBc3NvY1JzcC0+VkhUQ2Fwcy5wcmVzZW50KQorCQkJCXZodF9jYXBzID0gJnBBc3NvY1JzcC0+VkhUQ2FwczsKKwkJCWVsc2UgaWYgKHBBc3NvY1JzcC0+dmVuZG9yMl9pZS5WSFRDYXBzLnByZXNlbnQpIHsKKwkJCQl2aHRfY2FwcyA9ICZwQXNzb2NSc3AtPnZlbmRvcjJfaWUuVkhUQ2FwczsKKwkJCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKAorCQkJCQkiVkhUIENhcHMgYXJlIGluIHZlbmRvciBTcGVjZmljIElFIikpOworCQkJfQorCisJCQlpZiAoKHZodF9jYXBzICE9IE5VTEwpICYmICh2aHRfY2Fwcy0+c3VCZWFtRm9ybWVyQ2FwIHx8CisJCQkJCQl2aHRfY2Fwcy0+bXVCZWFtZm9ybWVyQ2FwKSAmJgorCQkJCQlwc2Vzc2lvbkVudHJ5LT50eEJGSW5pRmVhdHVyZUVuYWJsZWQpCisJCQkJc3RhX2NvbnRleHQtPnZodFR4QkZDYXBhYmxlID0gMTsKKworCQkJaWYgKCh2aHRfY2FwcyAhPSBOVUxMKSAmJiB2aHRfY2Fwcy0+bXVCZWFtZm9ybWVyQ2FwICYmCisJCQkJCXBzZXNzaW9uRW50cnktPnR4TXVCZm9ybWVlKQorCQkJCXN0YV9jb250ZXh0LT52aHRUeE1VQmZvcm1lZUNhcGFibGUgPSAxOworCQkJaWYgKCh2aHRfY2FwcyAhPSBOVUxMKSAmJiB2aHRfY2Fwcy0+c3VCZWFtZm9ybWVlQ2FwICYmCisJCQkJCXBzZXNzaW9uRW50cnktPmVuYWJsZV9zdV90eF9iZm9ybWVyKQorCQkJCXN0YV9jb250ZXh0LT5lbmFibGVfc3VfdHhfYmZvcm1lciA9IDE7CisJCX0KKworCQlpZiAoKHBBc3NvY1JzcC0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgJiYKKwkJCQkoY2hhbldpZHRoU3VwcCkpIHsKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuY2hfd2lkdGggPSAodWludDhfdCkKKwkJCQlwQXNzb2NSc3AtPkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisJCQlpZiAocEFzc29jUnNwLT5WSFRDYXBzLnByZXNlbnQpCisJCQkJdmh0X29wZXIgPSAmcEFzc29jUnNwLT5WSFRPcGVyYXRpb247CisJCQllbHNlIGlmIChwQXNzb2NSc3AtPnZlbmRvcjJfaWUuVkhUQ2Fwcy5wcmVzZW50KSB7CisJCQkJdmh0X29wZXIgPSAmcEFzc29jUnNwLT52ZW5kb3IyX2llLlZIVE9wZXJhdGlvbjsKKwkJCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKAorCQkJCQkiVkhUIE9wIElFIGlzIGluIHZlbmRvciBTcGVjZmljIElFIikpOworCQkJfQorCQkJaWYgKCh2aHRfb3BlciAhPSBOVUxMKSAmJgorCQkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnZodENhcGFibGUgJiYKKwkJCQkJdmh0X29wZXItPmNoYW5XaWR0aCkKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmNoX3dpZHRoID0KKwkJCQkJdmh0X29wZXItPmNoYW5XaWR0aCArIDE7CisKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoCisJCQkJCSJTdGFDdHg6IHZodENhcCAlZCBDaEJXICVkIFR4QkYgJWQiKSwKKwkJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC52aHRDYXBhYmxlLAorCQkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmNoX3dpZHRoLAorCQkJCQlzdGFfY29udGV4dC0+dmh0VHhCRkNhcGFibGUpOworCQkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiU3RhQ29udGV4dCBzdV90eF9iZmVyICVkIiksCisJCQkJCXN0YV9jb250ZXh0LT5lbmFibGVfc3VfdHhfYmZvcm1lcik7CisJCX0gZWxzZSB7CisJCQlzdGFfY29udGV4dC0+Y2hfd2lkdGggPQlDSF9XSURUSF8yME1IWjsKKwkJCWlmICgoSVNfU0lSX1NUQVRVU19TVUNDRVNTKAorCQkJCXdsYW5fY2ZnX2dldF9pbnQocE1hYywKKwkJCQkJV05JX0NGR19WSFRfRU5BQkxFX1RYQkZfMjBNSFosCisJCQkJCSZlbmFibGVUeEJGMjBNSHopKSkgJiYKKwkJCQkJKGZhbHNlID09IGVuYWJsZVR4QkYyME1IeikpCisJCQkJc3RhX2NvbnRleHQtPnZodFR4QkZDYXBhYmxlID0gMDsKKwkJfQorCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1pbW9QUyA9CisJCQkodFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlKQorCQkJcEFzc29jUnNwLT5IVENhcHMubWltb1Bvd2VyU2F2ZTsKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhBbXNkdVNpemUgPQorCQkJKHVpbnQ4X3QpIHBBc3NvY1JzcC0+SFRDYXBzLm1heGltYWxBTVNEVXNpemU7CisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4QW1wZHVEZW5zaXR5ID0KKwkJCXBBc3NvY1JzcC0+SFRDYXBzLm1wZHVEZW5zaXR5OworCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmZEc3NzQ2NrTW9kZTQwTWh6ID0KKwkJCSh1aW50OF90KSBwQXNzb2NSc3AtPkhUQ2Fwcy5kc3NzQ2NrTW9kZTQwTUh6OworCQkvKgorCQkgKiBXZSB3aWxsIGNoZWNrIGdTaG9ydEdJMjBNaHogYW5kIGdTaG9ydEdJNDBNaHogZnJvbQorCQkgKiBpbmkgZmlsZS4gaWYgdGhleSBhcmUgc2V0IHRoZW4gd2Ugd2lsbCB1c2Ugd2hhdCBldmVyCisJCSAqIEFzc29jIHJlc3BvbnNlIGNvbWluZyBmcm9tIEFQIHN1cHBvcnRzLiBJZiB0aGVzZQorCQkgKiB2YWx1ZXMgYXJlIHNldCBhcyAwIGluIGluaSBmaWxlIHRoZW4gd2Ugd2lsbAorCQkgKiBoYXJkY29kZSB0aGlzIHZhbHVlcyB0byAwLgorCQkgKi8KKwkJaWYgKElTX1NJUl9TVEFUVVNfU1VDQ0VTUyh3bGFuX2NmZ19nZXRfaW50CisJCQkJCShwTWFjLCBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaLAorCQkJCQkgJnNob3J0R2kyME1oelN1cHBvcnQpKSkgeworCQkJaWYgKHRydWUgPT0gc2hvcnRHaTIwTWh6U3VwcG9ydCkgeworCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuCisJCQkJCWZTaG9ydEdJMjBNaHogPQorCQkJCQkodWludDhfdCkgcEFzc29jUnNwLT5IVENhcHMuCisJCQkJCXNob3J0R0kyME1IejsKKwkJCX0gZWxzZSB7CisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC4KKwkJCQkJZlNob3J0R0kyME1oeiA9IGZhbHNlOworCQkJfQorCQl9IGVsc2UgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkiZmFpbGVkIHRvIGdldCBzaG9ydEdJIDIwTWh6LCBzZXQgZGVmYXVsdCIpKTsKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmZTaG9ydEdJMjBNaHogPQorCQkJCVdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfU1RBREVGOworCQl9CisKKwkJaWYgKElTX1NJUl9TVEFUVVNfU1VDQ0VTUyh3bGFuX2NmZ19nZXRfaW50CisJCQkJCShwTWFjLCBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaLAorCQkJCQkgJnNob3J0R2k0ME1oelN1cHBvcnQpKSkgeworCQkJaWYgKHRydWUgPT0gc2hvcnRHaTQwTWh6U3VwcG9ydCkgeworCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuCisJCQkJCWZTaG9ydEdJNDBNaHogPQorCQkJCQkodWludDhfdCkgcEFzc29jUnNwLT5IVENhcHMuCisJCQkJCXNob3J0R0k0ME1IejsKKwkJCX0gZWxzZSB7CisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC4KKwkJCQkJZlNob3J0R0k0ME1oeiA9IGZhbHNlOworCQkJfQorCQl9IGVsc2UgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkiZmFpbGVkIHRvIGdldCBzaG9ydEdJIDQwTWh6LCBzZXQgZGVmYXVsdCIpKTsKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmZTaG9ydEdJNDBNaHogPQorCQkJCVdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfU1RBREVGOworCQl9CisKKwkJaWYgKCFwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnZodENhcGFibGUpCisJCQkvKiBVc2UgbWF4IGFtcGQgZmFjdG9yIGFkdmVydGlzZWQgaW4KKwkJCSAqIEhUQ0FQIGZvciBub24tdmh0IGNvbm5lY3Rpb24gKi8KKwkJeworCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhBbXBkdVNpemUgPQorCQkJCXBBc3NvY1JzcC0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3I7CisJCX0gZWxzZSBpZiAocEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhBbXBkdVNpemUgPAorCQkJCXBBc3NvY1JzcC0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3IpIHsKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4QW1wZHVTaXplID0KKwkJCQlwQXNzb2NSc3AtPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yOworCQl9CisJCWlmIChwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnZodFR4QkZDYXBhYmxlCisJCQkJJiYgcE1hYy0+bGltLmRpc2FibGVMRFBDV2l0aFR4YmZBUCkgeworCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5odExkcGNDYXBhYmxlID0gMDsKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudmh0TGRwY0NhcGFibGUgPSAwOworCQl9IGVsc2UgeworCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5odExkcGNDYXBhYmxlID0KKwkJCQkodWludDhfdCkgcEFzc29jUnNwLT5IVENhcHMuYWR2Q29kaW5nQ2FwOworCQkJaWYgKHBBc3NvY1JzcC0+VkhUQ2Fwcy5wcmVzZW50KQorCQkJCXZodF9jYXBzID0gJnBBc3NvY1JzcC0+VkhUQ2FwczsKKwkJCWVsc2UgaWYgKHBBc3NvY1JzcC0+dmVuZG9yMl9pZS5WSFRDYXBzLnByZXNlbnQpIHsKKwkJCQl2aHRfY2FwcyA9ICZwQXNzb2NSc3AtPnZlbmRvcjJfaWUuVkhUQ2FwczsKKwkJCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKAorCQkJCQkiVkhUIENhcHMgaXMgaW4gdmVuZG9yIFNwZWNmaWMgSUUiKSk7CisJCQl9CisJCQlpZiAodmh0X2NhcHMgIT0gTlVMTCkKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnZodExkcGNDYXBhYmxlID0KKwkJCQkJKHVpbnQ4X3QpIHZodF9jYXBzLT5sZHBjQ29kaW5nQ2FwOworCQl9CisKKwkJaWYgKHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5wcmVzZW50KQorCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5yaWZzTW9kZSA9CisJCQkJcEFzc29jUnNwLT5IVEluZm8ucmlmc01vZGU7CisKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkiU3RhQ3R4OiBDaEJXICVkIG1pbW9QUyAlZCBtYXhBbXNkdVNpemUgJWQiKSwKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmNoX3dpZHRoLAorCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWltb1BTLAorCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4QW1zZHVTaXplKTsKKworCQlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKAorCQkJCSJtYXhBbXBkdURlbnMgJWQgQ2NrTW9kZTQwTWh6ICVkIFNHSTIwTWh6ICVkIiksCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhBbXBkdURlbnNpdHksCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mRHNzc0Nja01vZGU0ME1oeiwKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmZTaG9ydEdJMjBNaHopOworCisJCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoCisJCQkJIlNHSTQwTSAlZCBtYXhBbXBkdSAlZCBodExkcGMgJWQgdmh0TGRwYyAlZCIpLAorCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZlNob3J0R0k0ME1oeiwKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtcGR1U2l6ZSwKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmh0TGRwY0NhcGFibGUsCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC52aHRMZHBjQ2FwYWJsZSk7CisJfQorCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc21lc2Vzc2lvbklkID0KKwkJcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQud3BhX3JzbiA9IHBCZWFjb25TdHJ1Y3QtPnJzblByZXNlbnQ7CisJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC53cGFfcnNuIHw9CisJCShwQmVhY29uU3RydWN0LT53cGFQcmVzZW50IDw8IDEpOworCS8qIEZvciBPU0VOIENvbm5lY3Rpb24gQVAgZG9lcyBub3QgYWR2ZXJ0aXNlIFJTTiBvciBXUEEgSUUKKwkgKiBzbyBmcm9tIHRoZSBJRXMgd2UgZ2V0IGZyb20gc3VwcGxpY2FudCB3ZSBnZXQgdGhpcyBpbmZvCisJICogc28gZm9yIEZXIHRvIHRyYW5zbWl0IEVBUE9MIG1lc3NhZ2UgNCB3ZSBzaGFsbCBzZXQKKwkgKiB3cGFfcnNuCisJICovCisJaWYgKCghcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC53cGFfcnNuKQorCQkJJiYgKHBzZXNzaW9uRW50cnktPmlzT1NFTkNvbm5lY3Rpb24pKQorCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LndwYV9yc24gPSAxOworCWNkZl9tZW1fY29weSgmcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5jYXBhYl9pbmZvLAorCQkJJnBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8sCisJCQlzaXplb2YocEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5jYXBhYl9pbmZvKSk7CisJY2RmX21lbV9jb3B5KCZwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmh0X2NhcHMsCisJCQkodWludDhfdCAqKSAmcEFzc29jUnNwLT5IVENhcHMgKyBzaXplb2YodWludDhfdCksCisJCQlzaXplb2YocEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5odF9jYXBzKSk7CisKKwkvKiBJZiBXTU0gSUUgb3IgODAyLjExRSBJRSBpcyBwcmVzZW50IHRoZW4gZW5hYmxlIFdNTSAqLworCWlmICgocHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCAmJiBwQXNzb2NSc3AtPndtZUVkY2FQcmVzZW50KSB8fAorCQkocHNlc3Npb25FbnRyeS0+bGltUW9zRW5hYmxlZCAmJiBwQXNzb2NSc3AtPmVkY2FQcmVzZW50KSkKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC53bW1FbmFibGVkID0gMTsKKwllbHNlCisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQud21tRW5hYmxlZCA9IDA7CisKKwkvKiBVcGRhdGUgdGhlIHJhdGVzICovCisJcFN0YURzID0gZHBoX2dldF9oYXNoX2VudHJ5KHBNYWMsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLAorCQkJCSZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAocFN0YURzICE9IE5VTEwpIHsKKwkJbGltX2ZpbGxfc3VwcG9ydGVkX3JhdGVzX2luZm8ocE1hYywgcFN0YURzLAorCQkJCSZwU3RhRHMtPnN1cHBvcnRlZFJhdGVzLAorCQkJCXBzZXNzaW9uRW50cnkpOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuCisJCQkJc3VwcG9ydGVkUmF0ZXMsCisJCQkJKHVpbnQ4X3QgKikgJnBTdGFEcy0+c3VwcG9ydGVkUmF0ZXMsCisJCQkJc2l6ZW9mKHRTaXJTdXBwb3J0ZWRSYXRlcykpOworCX0gZWxzZQorCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKAorCQkJImNvdWxkIG5vdCBVcGRhdGUgdGhlIHN1cHBvcnRlZCByYXRlcyIpKTsKKwlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmVuY3J5cHRUeXBlID0gcHNlc3Npb25FbnRyeS0+ZW5jcnlwdFR5cGU7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlwQWRkQnNzUGFyYW1zLT5tYXhUeFBvd2VyID0gcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlcjsKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJtYXhUeFBvd2VyOiAlZCIpLCBwQWRkQnNzUGFyYW1zLT5tYXhUeFBvd2VyKTsKKyNlbmRpZgorCS8qIEZJWE1FX0dFTjQgLSBBbnkgb3RoZXIgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgaW5pdGlhbGl6YXRpb24/ICovCisJcEFkZEJzc1BhcmFtcy0+c3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXBBZGRCc3NQYXJhbXMtPnJlc3BSZXFkID0gdHJ1ZTsKKwkvKiB1cGRhdGUgcGVyc29uYSAqLworCXBBZGRCc3NQYXJhbXMtPmhhbFBlcnNvbmEgPSAodWludDhfdCkgcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hOworCisJaWYgKENERl9QMlBfQ0xJRU5UX01PREUgPT0gcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hKQorCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnAycENhcGFibGVTdGEgPSAxOworCisJcEFkZEJzc1BhcmFtcy0+YlNwZWN0cnVtTWd0RW5hYmxlZCA9IHBzZXNzaW9uRW50cnktPnNwZWN0cnVtTWd0RW5hYmxlZDsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbVZhbGlkID0gMDsKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJleHRTZXRTdGFLZXlQYXJhbVZhbGlkOiAlZCIpLAorCQlwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbVZhbGlkKTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWlmIChwc2Vzc2lvbkVudHJ5LT5saW1SbWZFbmFibGVkKSB7CisJCXBBZGRCc3NQYXJhbXMtPnJtZkVuYWJsZWQgPSAxOworCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnJtZkVuYWJsZWQgPSAxOworCX0KKyNlbmRpZgorCisJLyogU2V0IGEgbmV3IHN0YXRlIGZvciBNTE1FICovCisJaWYgKGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkKKwkJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPQorCQkJZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfQVNTT0NfU1RBVEU7CisJZWxzZQorCQlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9CisJCQllTElNX01MTV9XVF9BRERfQlNTX1JTUF9SRUFTU09DX1NUQVRFOworCU1UUkFDRShtYWNfdHJhY2UKKwkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkpOworCisJbGltX2xvZyhwTWFjLCBMT0cyLCBGTCgic3RhQ29udGV4dCB3bW1FbmFibGVkOiAlZCBlbmNyeXB0VHlwZTogJWQgIgorCQkJICAgICAgICJwMnBDYXBhYmxlU3RhOiAlZCIpLAorCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LndtbUVuYWJsZWQsCisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZW5jcnlwdFR5cGUsCisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQucDJwQ2FwYWJsZVN0YSk7CisKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJiU3BlY3RydW1NZ3RFbmFibGVkOiAlZCBoYWxQZXJzb25hOiAlZCBzZXR0aW5nICIKKwkJCSAgICAgICAiTGltTWxtIHN0YXRlIHRvICVkIiksCisJCXBBZGRCc3NQYXJhbXMtPmJTcGVjdHJ1bU1ndEVuYWJsZWQsIHBBZGRCc3NQYXJhbXMtPmhhbFBlcnNvbmEsCisJCXBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKTsKKwlpZiAocHNlc3Npb25FbnRyeS0+aXNOb25Sb2FtUmVhc3NvYykKKwkJcEFkZEJzc1BhcmFtcy0+bm9uUm9hbVJlYXNzb2MgPSAxOworCXBBZGRCc3NQYXJhbXMtPm5zcyA9IHBzZXNzaW9uRW50cnktPm5zczsKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJuc3MgdmFsdWU6ICVkIiksIHBBZGRCc3NQYXJhbXMtPm5zcyk7CisKKwkvKiB3ZSBuZWVkIHRvIGRlZmVyIHRoZSBtZXNzYWdlIHVudGlsIHdlIGdldCB0aGUgcmVzcG9uc2UgYmFjayBmcm9tIEhBTC4gKi8KKwlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCBmYWxzZSk7CisKKwltc2dRLnR5cGUgPSBXTUFfQUREX0JTU19SRVE7CisJLyoqIEBUb0RvIDogVXBkYXRlIHRoZSBHbG9iYWwgY291bnRlciB0byBrZWVwdHJhY2sgb2YgdGhlIFBFIDwtLT4gSEFMIG1lc3NhZ2VzKi8KKwltc2dRLnJlc2VydmVkID0gMDsKKwltc2dRLmJvZHlwdHIgPSBwQWRkQnNzUGFyYW1zOworCW1zZ1EuYm9keXZhbCA9IDA7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJTZXNzaW9uSWQ6JWQgU2VuZGluZyBXTUFfQUREX0JTU19SRVEiKSwKKwkJcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBtc2dRLnR5cGUpKTsKKworCXJldENvZGUgPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnUSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSByZXRDb2RlKSB7CisJCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCQljZGZfbWVtX2ZyZWUocEFkZEJzc1BhcmFtcyk7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJQb3N0aW5nIEFERF9CU1NfUkVRIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWCIpLAorCQkJcmV0Q29kZSk7CisJCWdvdG8gcmV0dXJuRmFpbHVyZTsKKworCX0gZWxzZQorCQlyZXR1cm4gcmV0Q29kZTsKKworcmV0dXJuRmFpbHVyZToKKwkvKiBDbGVhbi11cCB3aWxsIGJlIGRvbmUgYnkgdGhlIGNhbGxlci4uLiAqLworCXJldHVybiByZXRDb2RlOworfQorCit0U2lyUmV0U3RhdHVzIGxpbV9zdGFfc2VuZF9hZGRfYnNzX3ByZV9hc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHVwZGF0ZUVudHJ5LAorCQkJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpck1zZ1EgbXNnUTsKKwl0cEFkZEJzc1BhcmFtcyBwQWRkQnNzUGFyYW1zID0gTlVMTDsKKwl1aW50MzJfdCByZXRDb2RlOworCXRTY2hCZWFjb25TdHJ1Y3QgKnBCZWFjb25TdHJ1Y3Q7CisJdWludDhfdCBjaGFuV2lkdGhTdXBwID0gMDsKKwl1aW50MzJfdCBzaG9ydEdpMjBNaHpTdXBwb3J0OworCXVpbnQzMl90IHNob3J0R2k0ME1oelN1cHBvcnQ7CisJdERvdDExZklFVkhUT3BlcmF0aW9uICp2aHRfb3BlciA9IE5VTEw7CisJdERvdDExZklFVkhUQ2FwcyAqdmh0X2NhcHMgPSBOVUxMOworCisJdHBTaXJCc3NEZXNjcmlwdGlvbiBic3NEZXNjcmlwdGlvbiA9CisJCSZwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+YnNzRGVzY3JpcHRpb247CisKKwlwQmVhY29uU3RydWN0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTY2hCZWFjb25TdHJ1Y3QpKTsKKwlpZiAoTlVMTCA9PSBwQmVhY29uU3RydWN0KSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBBRERfQlNTIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCS8qIFBhY2thZ2UgU0lSX0hBTF9BRERfQlNTX1JFUSBtZXNzYWdlIHBhcmFtZXRlcnMgKi8KKwlwQWRkQnNzUGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBZGRCc3NQYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBwQWRkQnNzUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBBRERfQlNTIikpOworCQlyZXRDb2RlID0gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQlnb3RvIHJldHVybkZhaWx1cmU7CisJfQorCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcEFkZEJzc1BhcmFtcywgc2l6ZW9mKHRBZGRCc3NQYXJhbXMpLCAwKTsKKworCWxpbV9leHRyYWN0X2FwX2NhcGFiaWxpdGllcyhwTWFjLCAodWludDhfdCAqKSBic3NEZXNjcmlwdGlvbi0+aWVGaWVsZHMsCisJCQlsaW1fZ2V0X2llbGVuX2Zyb21fYnNzX2Rlc2NyaXB0aW9uKGJzc0Rlc2NyaXB0aW9uKSwKKwkJCXBCZWFjb25TdHJ1Y3QpOworCisJaWYgKHBNYWMtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0KKwkgICAgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorCQlsaW1fZGVjaWRlX3N0YV9wcm90ZWN0aW9uX29uX2Fzc29jKHBNYWMsIHBCZWFjb25TdHJ1Y3QsCisJCQkJCQkgICBwc2Vzc2lvbkVudHJ5KTsKKwljZGZfbWVtX2NvcHkocEFkZEJzc1BhcmFtcy0+YnNzSWQsIGJzc0Rlc2NyaXB0aW9uLT5ic3NJZCwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCS8qIEZpbGwgaW4gdEFkZEJzc1BhcmFtcyBzZWxmTWFjQWRkciAqLworCWNkZl9tZW1fY29weShwQWRkQnNzUGFyYW1zLT5zZWxmTWFjQWRkciwKKwkJICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgic2Vzc2lvbmlkOiAlZCB1cGRhdGVFbnRyeSA9ICVkIGxpbXN5c3RlbXJvbGUgPSAlZCAiKSwKKwkJcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLCB1cGRhdGVFbnRyeSwKKwkJR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSk7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJCU1NJRDogIiBNQUNfQUREUkVTU19TVFIpLAorCQlNQUNfQUREUl9BUlJBWShwQWRkQnNzUGFyYW1zLT5ic3NJZCkpOworCS8qIEluY29ycmVjdCBCU1MgVHlwZSB3aGljaCBjYXVzZWQgVU1BIERlc2NyaXB0b3IgdG8gYmUgb3ZlcndyaXR0ZW4gb24KKwkgKiB0b3Agb2YgYW4gYWxyZWFkeSBlc3RhYmxpc2hlZCBJbmZyYSBsaW5rLiBUaGlzIGxlYWQgdG8gaXNzdWVzIGluCisJICogY29uY3VycmVudCBkYXRhIHRyYW5zZmVyLgorCSAqLworCisJcEFkZEJzc1BhcmFtcy0+YnNzVHlwZSA9IHBzZXNzaW9uRW50cnktPmJzc1R5cGU7IC8qIGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERTsgKi8KKwlwQWRkQnNzUGFyYW1zLT5vcGVyTW9kZSA9IEJTU19PUEVSQVRJT05BTF9NT0RFX1NUQTsKKworCXBBZGRCc3NQYXJhbXMtPmJlYWNvbkludGVydmFsID0gYnNzRGVzY3JpcHRpb24tPmJlYWNvbkludGVydmFsOworCisJcEFkZEJzc1BhcmFtcy0+ZHRpbVBlcmlvZCA9IHBCZWFjb25TdHJ1Y3QtPnRpbS5kdGltUGVyaW9kOworCXBBZGRCc3NQYXJhbXMtPnVwZGF0ZUJzcyA9IHVwZGF0ZUVudHJ5OworCisJcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBDb3VudCA9IHBCZWFjb25TdHJ1Y3QtPmNmUGFyYW1TZXQuY2ZwQ291bnQ7CisJcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBQZXJpb2QgPQorCQlwQmVhY29uU3RydWN0LT5jZlBhcmFtU2V0LmNmcFBlcmlvZDsKKwlwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcE1heER1cmF0aW9uID0KKwkJcEJlYWNvblN0cnVjdC0+Y2ZQYXJhbVNldC5jZnBNYXhEdXJhdGlvbjsKKwlwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcER1clJlbWFpbmluZyA9CisJCXBCZWFjb25TdHJ1Y3QtPmNmUGFyYW1TZXQuY2ZwRHVyUmVtYWluaW5nOworCisJcEFkZEJzc1BhcmFtcy0+cmF0ZVNldC5udW1SYXRlcyA9CisJCXBCZWFjb25TdHJ1Y3QtPnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzOworCWNkZl9tZW1fY29weShwQWRkQnNzUGFyYW1zLT5yYXRlU2V0LnJhdGUsCisJCSAgICAgcEJlYWNvblN0cnVjdC0+c3VwcG9ydGVkUmF0ZXMucmF0ZSwKKwkJICAgICBwQmVhY29uU3RydWN0LT5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlcyk7CisKKwlwQWRkQnNzUGFyYW1zLT5ud1R5cGUgPSBic3NEZXNjcmlwdGlvbi0+bndUeXBlOworCisJcEFkZEJzc1BhcmFtcy0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCA9CisJCSh1aW50OF90KSBwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5zaG9ydFNsb3RUaW1lOworCXBBZGRCc3NQYXJhbXMtPmxsYUNvZXhpc3QgPQorCQkodWludDhfdCkgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3Q7CisJcEFkZEJzc1BhcmFtcy0+bGxiQ29leGlzdCA9CisJCSh1aW50OF90KSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxiQ29leGlzdDsKKwlwQWRkQnNzUGFyYW1zLT5sbGdDb2V4aXN0ID0KKwkJKHVpbnQ4X3QpIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0OworCXBBZGRCc3NQYXJhbXMtPmh0MjBDb2V4aXN0ID0KKwkJKHVpbnQ4X3QpIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdDsKKworCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoIiBCU1MgVHlwZSAlZCBCZWFjb24gSW50ZXJ2YWw6ICVkIGR0aW1QZXJpb2Q6ICVkICIKKwkJCSAgICAgICAiY2ZwQ291bnQ6ICVkIiksIHBBZGRCc3NQYXJhbXMtPmJzc1R5cGUsCisJCXBBZGRCc3NQYXJhbXMtPmJlYWNvbkludGVydmFsLCBwQWRkQnNzUGFyYW1zLT5kdGltUGVyaW9kLAorCQlwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcENvdW50KTsKKworCWxpbV9sb2cocE1hYywgTE9HMiwKKwkJRkwoIiBjZnBQZXJpb2Q6ICVkIGNmcE1heER1cmF0aW9uOiAlZCBjZnBEdXJSZW1haW5pbmc6IgorCQkgICAiICVkIG51bVJhdGVzOiAlZCAiKSwgcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBQZXJpb2QsCisJCXBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwTWF4RHVyYXRpb24sCisJCXBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwRHVyUmVtYWluaW5nLAorCQlwQWRkQnNzUGFyYW1zLT5yYXRlU2V0Lm51bVJhdGVzKTsKKworCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoIm53VHlwZTolZCBzaG9ydFNsb3RUaW1lU3VwcG9ydGVkOiAlZCIKKwkJCSAgICAgICAibGxhQ29leGlzdDogJWQgbGxiQ29leGlzdDogJWQgbGxnQ29leGlzdDogJWQgaHQyMENvZXhpc3Q6ICVkIiksCisJCXBBZGRCc3NQYXJhbXMtPm53VHlwZSwgcEFkZEJzc1BhcmFtcy0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCwKKwkJcEFkZEJzc1BhcmFtcy0+bGxhQ29leGlzdCwgcEFkZEJzc1BhcmFtcy0+bGxiQ29leGlzdCwKKwkJcEFkZEJzc1BhcmFtcy0+bGxnQ29leGlzdCwgcEFkZEJzc1BhcmFtcy0+aHQyMENvZXhpc3QpOworCS8qIFVzZSB0aGUgYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgcmVjZWl2ZWQgYmVhY29uL1BSICovCisJaWYgKElTX0RPVDExX01PREVfSFQocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKQorCSAgICAmJiAocEJlYWNvblN0cnVjdC0+SFRDYXBzLnByZXNlbnQpKSB7CisJCXBBZGRCc3NQYXJhbXMtPmh0Q2FwYWJsZSA9IHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5wcmVzZW50OworCQlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJodENhcGFibGU6ICVkIiksCisJCQlwQWRkQnNzUGFyYW1zLT5odENhcGFibGUpOworCQlpZiAocEJlYWNvblN0cnVjdC0+SFRJbmZvLnByZXNlbnQpIHsKKwkJCXBBZGRCc3NQYXJhbXMtPmh0T3Blck1vZGUgPQorCQkJCSh0U2lyTWFjSFRPcGVyYXRpbmdNb2RlKSBwQmVhY29uU3RydWN0LT5IVEluZm8uCisJCQkJb3BNb2RlOworCQkJcEFkZEJzc1BhcmFtcy0+ZHVhbENUU1Byb3RlY3Rpb24gPQorCQkJCSh1aW50OF90KSBwQmVhY29uU3RydWN0LT5IVEluZm8uZHVhbENUU1Byb3RlY3Rpb247CisKKwkJCWNoYW5XaWR0aFN1cHAgPQorCQkJCWxpbV9nZXRfaHRfY2FwYWJpbGl0eShwTWFjLAorCQkJCQkJICAgICAgZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVCwKKwkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQkJaWYgKChwQmVhY29uU3RydWN0LT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KQorCQkJICAgICYmIChjaGFuV2lkdGhTdXBwKSkgeworCQkJCXBBZGRCc3NQYXJhbXMtPmNoX3dpZHRoID0KKwkJCQkJKHVpbnQ4X3QpIHBCZWFjb25TdHJ1Y3QtPkhUSW5mby4KKwkJCQkJcmVjb21tZW5kZWRUeFdpZHRoU2V0OworCQkJCWlmIChwQmVhY29uU3RydWN0LT5IVEluZm8uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9PQorCQkJCQkJUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZKQorCQkJCQlwQWRkQnNzUGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQkJCWJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQgKyAyOworCisJCQkJaWYgKHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID09CisJCQkJCQlQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZKQorCQkJCQlwQWRkQnNzUGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQkJCWJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQgLSAyOworCQkJfSBlbHNlIHsKKwkJCQlwQWRkQnNzUGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzIwTUhaOworCQkJCXBBZGRCc3NQYXJhbXMtPmNoX2NlbnRlcl9mcmVxX3NlZzAgPSAwOworCQkJfQorCQkJcEFkZEJzc1BhcmFtcy0+bGxuTm9uR0ZDb2V4aXN0ID0KKwkJCQkodWludDhfdCkgcEJlYWNvblN0cnVjdC0+SFRJbmZvLm5vbkdGRGV2aWNlc1ByZXNlbnQ7CisJCQlwQWRkQnNzUGFyYW1zLT5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPQorCQkJCSh1aW50OF90KSBwQmVhY29uU3RydWN0LT5IVEluZm8uCisJCQkJbHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisJCQlwQWRkQnNzUGFyYW1zLT5mUklGU01vZGUgPQorCQkJCXBCZWFjb25TdHJ1Y3QtPkhUSW5mby5yaWZzTW9kZTsKKworCQkJbGltX2xvZyhwTWFjLCBMT0cyLAorCQkJCUZMKCJodE9wZXJNb2RlOiAlZCBkdWFsQ1RTUHJvdGVjdGlvbjogJWQgdHhDaGFubmVsV2lkdGhTZXQ6ICVkIGNlbnRlcl9mcmVxX3NlZzA6ICVkICIpLAorCQkJCXBBZGRCc3NQYXJhbXMtPmh0T3Blck1vZGUsCisJCQkJcEFkZEJzc1BhcmFtcy0+ZHVhbENUU1Byb3RlY3Rpb24sCisJCQkJcEFkZEJzc1BhcmFtcy0+dHhDaGFubmVsV2lkdGhTZXQsCisJCQkJcEFkZEJzc1BhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMCk7CisKKwkJCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoImxsbk5vbkdGQ29leGlzdDogJWQgIgorCQkJCQkgICAgICAgImZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDogJWQgZlJJRlNNb2RlICVkIiksCisJCQkJcEFkZEJzc1BhcmFtcy0+bGxuTm9uR0ZDb2V4aXN0LAorCQkJCXBBZGRCc3NQYXJhbXMtPmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCwKKwkJCQlwQWRkQnNzUGFyYW1zLT5mUklGU01vZGUpOworCQl9CisJfQorCisJcEFkZEJzc1BhcmFtcy0+Y3VycmVudE9wZXJDaGFubmVsID0gYnNzRGVzY3JpcHRpb24tPmNoYW5uZWxJZDsKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJjdXJyZW50T3BlckNoYW5uZWwgJWQiKSwKKwkJcEFkZEJzc1BhcmFtcy0+Y3VycmVudE9wZXJDaGFubmVsKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmIChwc2Vzc2lvbkVudHJ5LT52aHRDYXBhYmlsaXR5ICYmCisJCShJU19CU1NfVkhUX0NBUEFCTEUocEJlYWNvblN0cnVjdC0+VkhUQ2FwcykgfHwKKwkJIElTX0JTU19WSFRfQ0FQQUJMRShwQmVhY29uU3RydWN0LT52ZW5kb3IyX2llLlZIVENhcHMpKSkgeworCisJCXBBZGRCc3NQYXJhbXMtPnZodENhcGFibGUgPSAxOworCQlpZiAocEJlYWNvblN0cnVjdC0+VkhUT3BlcmF0aW9uLnByZXNlbnQpCisJCQl2aHRfb3BlciA9ICZwQmVhY29uU3RydWN0LT5WSFRPcGVyYXRpb247CisJCWVsc2UgaWYgKHBCZWFjb25TdHJ1Y3QtPnZlbmRvcjJfaWUuVkhUT3BlcmF0aW9uLnByZXNlbnQpIHsKKwkJCXZodF9vcGVyID0gJnBCZWFjb25TdHJ1Y3QtPnZlbmRvcjJfaWUuVkhUT3BlcmF0aW9uOworCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCQlGTCgiVkhUIE9wZXJhdGlvbiBpcyBwcmVzZW50IGluIHZlbmRvciBTcGVjZmljIElFIikpOworCQl9CisKKworCQlpZiAoKHZodF9vcGVyICE9IE5VTEwpICYmCisJCQl2aHRfb3Blci0+Y2hhbldpZHRoICYmCisJCQljaGFuV2lkdGhTdXBwKSB7CisJCQlwQWRkQnNzUGFyYW1zLT5jaF93aWR0aCA9CisJCQkJdmh0X29wZXItPmNoYW5XaWR0aCArIDE7CisJCQlwQWRkQnNzUGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQl2aHRfb3Blci0+Y2hhbkNlbnRlckZyZXFTZWcxOworCQkJcEFkZEJzc1BhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMSA9CisJCQkJdmh0X29wZXItPmNoYW5DZW50ZXJGcmVxU2VnMjsKKwkJfQorCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtcGR1U2l6ZSA9CisJCQlTSVJfTUFDX0dFVF9WSFRfTUFYX0FNUERVX0VYUE8oCisJCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudmh0X2NhcHMpOworCX0gZWxzZSB7CisJCXBBZGRCc3NQYXJhbXMtPnZodENhcGFibGUgPSAwOworCX0KKwlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJ2aHRDYXBhYmxlICVkIHZodFR4Q2hhbm5lbFdpZHRoU2V0ICVkIGNlbnRlcl9mcmVxX3NlZzAgLSAlZCwgY2VudGVyX2ZyZXFfc2VnMSAtICVkIiksCisJCXBBZGRCc3NQYXJhbXMtPnZodENhcGFibGUsIHBBZGRCc3NQYXJhbXMtPmNoX3dpZHRoLAorCQlwQWRkQnNzUGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwLAorCQlwQWRkQnNzUGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcxKTsKKyNlbmRpZgorCisJLyoKKwkgKiBQb3B1bGF0ZSB0aGUgU1RBLXJlbGF0ZWQgcGFyYW1ldGVycyBoZXJlCisJICogTm90ZSB0aGF0IHRoZSBTVEEgaGVyZSByZWZlcnMgdG8gdGhlIEFQCisJICovCisJLyogSWRlbnRpZnlpbmcgQVAgYXMgYW4gU1RBICovCisJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFUeXBlID0gU1RBX0VOVFJZX09USEVSOworCisJY2RmX21lbV9jb3B5KHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuYnNzSWQsCisJCQlic3NEZXNjcmlwdGlvbi0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubGlzdGVuSW50ZXJ2YWwgPQorCQlic3NEZXNjcmlwdGlvbi0+YmVhY29uSW50ZXJ2YWw7CisKKwlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmFzc29jSWQgPSAwOworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudUFQU0QgPSAwOworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4U1BMZW4gPSAwOworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc2hvcnRQcmVhbWJsZVN1cHBvcnRlZCA9CisJCSh1aW50OF90KSBwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5zaG9ydFByZWFtYmxlOworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudXBkYXRlU3RhID0gdXBkYXRlRW50cnk7CisKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKAorCQkJIlN0YUN0eDogIiBNQUNfQUREUkVTU19TVFIgIiBzaG9ydFByZWFtYmxlOiAlZCIpLAorCQkJTUFDX0FERFJfQVJSQVkocEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFNYWMpLAorCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zaG9ydFByZWFtYmxlU3VwcG9ydGVkKTsKKworCXBBZGRCc3NQYXJhbXMtPmRvdDExX21vZGUgPSBwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGU7CisJbGltX2xvZyhwTWFjLCBMT0cyLCBGTCgiZG90MTFfbW9kZTolZCIpLAorCQkJcEFkZEJzc1BhcmFtcy0+ZG90MTFfbW9kZSk7CisKKwlpZiAoSVNfRE9UMTFfTU9ERV9IVChwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUpCisJCQkmJiAocEJlYWNvblN0cnVjdC0+SFRDYXBzLnByZXNlbnQpKSB7CisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudXMzMk1heEFtcGR1RHVyYXRpb24gPSAwOworCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmh0Q2FwYWJsZSA9IDE7CisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZ3JlZW5GaWVsZENhcGFibGUgPQorCQkJKHVpbnQ4X3QpIHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5ncmVlbkZpZWxkOworCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmxzaWdUeG9wUHJvdGVjdGlvbiA9CisJCQkodWludDhfdCkgcEJlYWNvblN0cnVjdC0+SFRDYXBzLmxzaWdUWE9QUHJvdGVjdGlvbjsKKwkJbGltX2xvZyhwTWFjLCBMT0cyLCBGTCgKKwkJCQkiU3RhQ3R4OiBodENhcCAlZCBHRkNhcCAlZCBsc2lnVHhvcFByb3RuICVkIiksCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5odENhcGFibGUsCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5ncmVlbkZpZWxkQ2FwYWJsZSwKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmxzaWdUeG9wUHJvdGVjdGlvbik7CisJCWlmIChwc2Vzc2lvbkVudHJ5LT52aHRDYXBhYmlsaXR5ICYmCisJCQkoSVNfQlNTX1ZIVF9DQVBBQkxFKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMpIHx8CisJCQkgSVNfQlNTX1ZIVF9DQVBBQkxFKAorCQkJCSBwQmVhY29uU3RydWN0LT52ZW5kb3IyX2llLlZIVENhcHMpKSkgeworCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC52aHRDYXBhYmxlID0gMTsKKwkJCWlmIChwQmVhY29uU3RydWN0LT5WSFRDYXBzLnByZXNlbnQpCisJCQkJdmh0X2NhcHMgPSAmcEJlYWNvblN0cnVjdC0+VkhUQ2FwczsKKwkJCWVsc2UgaWYgKHBCZWFjb25TdHJ1Y3QtPnZlbmRvcjJfaWUuVkhUQ2Fwcy5wcmVzZW50KQorCQkJCXZodF9jYXBzID0gJnBCZWFjb25TdHJ1Y3QtPnZlbmRvcjJfaWUuVkhUQ2FwczsKKworCQkJaWYgKCh2aHRfY2FwcyAhPSBOVUxMKSAmJiAodmh0X2NhcHMtPnN1QmVhbUZvcm1lckNhcCB8fAorCQkJCQkJdmh0X2NhcHMtPm11QmVhbWZvcm1lckNhcCkgJiYKKwkJCQkJcHNlc3Npb25FbnRyeS0+dHhCRkluaUZlYXR1cmVFbmFibGVkKQorCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudmh0VHhCRkNhcGFibGUgPSAxOworCisJCQlpZiAoKHZodF9jYXBzICE9IE5VTEwpICYmIHZodF9jYXBzLT5tdUJlYW1mb3JtZXJDYXAgJiYKKwkJCQkJcHNlc3Npb25FbnRyeS0+dHhNdUJmb3JtZWUpCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC52aHRUeE1VQmZvcm1lZUNhcGFibGUKKwkJCQkJCT0gMTsKKwkJCWlmICgodmh0X2NhcHMgIT0gTlVMTCkgJiYgdmh0X2NhcHMtPnN1QmVhbWZvcm1lZUNhcCAmJgorCQkJCQlwc2Vzc2lvbkVudHJ5LT5lbmFibGVfc3VfdHhfYmZvcm1lcikKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmVuYWJsZV9zdV90eF9iZm9ybWVyCisJCQkJCQk9IDE7CisJCQlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJTdGFDb250ZXh0OiBzdV90eF9iZmVyICVkIiksCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5lbmFibGVfc3VfdHhfYmZvcm1lcik7CisJCX0KKwkJaWYgKChwQmVhY29uU3RydWN0LT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KSAmJgorCQkJCShjaGFuV2lkdGhTdXBwKSkgeworCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5jaF93aWR0aCA9CisJCQkJKHVpbnQ4X3QpIHBCZWFjb25TdHJ1Y3QtPkhUSW5mby4KKwkJCQlyZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisJCQlpZiAoKHZodF9vcGVyICE9IE5VTEwpICYmCisJCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudmh0Q2FwYWJsZSAmJgorCQkJCQl2aHRfb3Blci0+Y2hhbldpZHRoKQorCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuY2hfd2lkdGggPQorCQkJCQl2aHRfb3Blci0+Y2hhbldpZHRoICsgMTsKKwkJCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoCisJCQkJCSJTdGFDdHg6IHZodENhcCAlZCBjaF9idyAlZCBUeEJGICVkIiksCisJCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudmh0Q2FwYWJsZSwKKwkJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5jaF93aWR0aCwKKwkJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC4KKwkJCQkJdmh0VHhCRkNhcGFibGUpOworCQl9IGVsc2UgeworCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5jaF93aWR0aCA9CisJCQkJQ0hfV0lEVEhfMjBNSFo7CisJCX0KKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5taW1vUFMgPQorCQkJKHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSkgcEJlYWNvblN0cnVjdC0+SFRDYXBzLgorCQkJbWltb1Bvd2VyU2F2ZTsKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhBbXNkdVNpemUgPQorCQkJKHVpbnQ4X3QpIHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplOworCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtcGR1RGVuc2l0eSA9CisJCQlwQmVhY29uU3RydWN0LT5IVENhcHMubXBkdURlbnNpdHk7CisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZkRzc3NDY2tNb2RlNDBNaHogPQorCQkJKHVpbnQ4X3QpIHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5kc3NzQ2NrTW9kZTQwTUh6OworCQkvKgorCQkgKiBXZSB3aWxsIGNoZWNrIGdTaG9ydEdJMjBNaHogYW5kIGdTaG9ydEdJNDBNaHogZnJvbSBpbmkgZmlsZS4KKwkJICogaWYgdGhleSBhcmUgc2V0IHRoZW4gd2Ugd2lsbCB1c2Ugd2hhdCBldmVyIEJlYWNvbiBjb21pbmcKKwkJICogZnJvbSBBUCBzdXBwb3J0cy4gSWYgdGhlc2UgdmFsdWVzIGFyZSBzZXQgYXMgMCBpbiBpbmkgZmlsZQorCQkgKiB0aGVuIHdlIHdpbGwgaGFyZGNvZGUgdGhpcyB2YWx1ZXMgdG8gMC4KKwkJICovCisJCWlmIChJU19TSVJfU1RBVFVTX1NVQ0NFU1Mod2xhbl9jZmdfZ2V0X2ludAorCQkJCQkocE1hYywgV05JX0NGR19TSE9SVF9HSV8yME1IWiwKKwkJCQkJICZzaG9ydEdpMjBNaHpTdXBwb3J0KSkpIHsKKwkJCWlmICh0cnVlID09IHNob3J0R2kyME1oelN1cHBvcnQpCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mU2hvcnRHSTIwTWh6ID0KKwkJCQkodWludDhfdClwQmVhY29uU3RydWN0LT5IVENhcHMuc2hvcnRHSTIwTUh6OworCQkJZWxzZQorCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZlNob3J0R0kyME1oeiA9CisJCQkJCWZhbHNlOworCQl9IGVsc2UgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkiZ2V0IHNob3J0R0kgMjBNaHogZmFpbGVkLCBzZXQgZGVmYXVsdCIpKTsKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmZTaG9ydEdJMjBNaHogPQorCQkJCVdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfU1RBREVGOworCQl9CisKKwkJaWYgKElTX1NJUl9TVEFUVVNfU1VDQ0VTUyh3bGFuX2NmZ19nZXRfaW50CisJCQkJCShwTWFjLCBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaLAorCQkJCQkgJnNob3J0R2k0ME1oelN1cHBvcnQpKSkgeworCQkJaWYgKHRydWUgPT0gc2hvcnRHaTQwTWh6U3VwcG9ydCkgeworCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuCisJCQkJCWZTaG9ydEdJNDBNaHogPQorCQkJCQkodWludDhfdCkgcEJlYWNvblN0cnVjdC0+SFRDYXBzLgorCQkJCQlzaG9ydEdJNDBNSHo7CisJCQl9IGVsc2UgeworCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuCisJCQkJCWZTaG9ydEdJNDBNaHogPSBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoCisJCQkJImdldCBzaG9ydEdJIDQwTWh6IGZhaWxlZCwgc2V0IGRlZmF1bHQiKSk7CisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mU2hvcnRHSTQwTWh6ID0KKwkJCQlXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaX1NUQURFRjsKKwkJfQorCisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4QW1wZHVTaXplID0KKwkJCXBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yOworCQlpZiAocEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC52aHRUeEJGQ2FwYWJsZQorCQkJCSYmIHBNYWMtPmxpbS5kaXNhYmxlTERQQ1dpdGhUeGJmQVApIHsKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuaHRMZHBjQ2FwYWJsZSA9IDA7CisJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnZodExkcGNDYXBhYmxlID0gMDsKKwkJfSBlbHNlIHsKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuaHRMZHBjQ2FwYWJsZSA9CisJCQkJKHVpbnQ4X3QpIHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy4KKwkJCQlhZHZDb2RpbmdDYXA7CisJCQlpZiAocEJlYWNvblN0cnVjdC0+VkhUQ2Fwcy5wcmVzZW50KQorCQkJCXZodF9jYXBzID0gJnBCZWFjb25TdHJ1Y3QtPlZIVENhcHM7CisJCQllbHNlIGlmIChwQmVhY29uU3RydWN0LT52ZW5kb3IyX2llLlZIVENhcHMucHJlc2VudCkgeworCQkJCXZodF9jYXBzID0KKwkJCQkJJnBCZWFjb25TdHJ1Y3QtPnZlbmRvcjJfaWUuVkhUQ2FwczsKKwkJCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKAorCQkJCQkiVkhUIENhcHMgYXJlIGluIHZlbmRvciBTcGVjZmljIElFIikpOworCQkJfQorCQkJaWYgKHZodF9jYXBzICE9IE5VTEwpCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC52aHRMZHBjQ2FwYWJsZSA9CisJCQkJCSh1aW50OF90KSB2aHRfY2Fwcy0+bGRwY0NvZGluZ0NhcDsKKwkJfQorCisJCWlmIChwQmVhY29uU3RydWN0LT5IVEluZm8ucHJlc2VudCkKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQucmlmc01vZGUgPQorCQkJCXBCZWFjb25TdHJ1Y3QtPkhUSW5mby5yaWZzTW9kZTsKKwkJbGltX2xvZyhwTWFjLCBMT0cyLAorCQkJCUZMKCJTdGFDb250ZXh0IENoYW5uZWxXaWR0aDogJWQgbWltb1BTOiAlZCBtYXhBbXNkdVNpemU6ICVkIiksCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5jaF93aWR0aCwKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1pbW9QUywKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtc2R1U2l6ZSk7CisKKwkJbGltX2xvZyhwTWFjLCBMT0cyLCBGTCgKKwkJCQkibWF4QW1wZHVEZW5zaXR5ICVkIENjazQwTWh6ICVkIFNHSTIwTWh6ICVkIiksCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhBbXBkdURlbnNpdHksCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mRHNzc0Nja01vZGU0ME1oeiwKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmZTaG9ydEdJMjBNaHopOworCisJCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoCisJCQkJIlNHSTQwTSAlZCBtYXhBbXBkdSAlZCBodExkcGMgJWQgdmh0TGRwYyAlZCIpLAorCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZlNob3J0R0k0ME1oeiwKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtcGR1U2l6ZSwKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmh0TGRwY0NhcGFibGUsCisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC52aHRMZHBjQ2FwYWJsZSk7CisJfQorCS8qCisJICogSWYgV01NIElFIG9yIDgwMi4xMUUgSUUgaXMgbm90IHByZXNlbnQKKwkgKiBhbmQgQVAgaXMgSFQgQVAgdGhlbiBlbmFibGUgV01NCisJICovCisJaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkICYmIChwQmVhY29uU3RydWN0LT53bWVFZGNhUHJlc2VudCB8fAorCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5odENhcGFibGUpKSB8fAorCQkJKHBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQgJiYKKwkJCSAocEJlYWNvblN0cnVjdC0+ZWRjYVByZXNlbnQgfHwKKwkJCSAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5odENhcGFibGUpKSkKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC53bW1FbmFibGVkID0gMTsKKwllbHNlCisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQud21tRW5hYmxlZCA9IDA7CisKKwkvKiBVcGRhdGUgdGhlIHJhdGVzICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlsaW1fcG9wdWxhdGVfcGVlcl9yYXRlX3NldChwTWFjLAorCQkJJnBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuCisJCQlzdXBwb3J0ZWRSYXRlcywKKwkJCXBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsCisJCQlmYWxzZSwgcHNlc3Npb25FbnRyeSwKKwkJCSZwQmVhY29uU3RydWN0LT5WSFRDYXBzKTsKKyNlbHNlCisJbGltX3BvcHVsYXRlX3BlZXJfcmF0ZV9zZXQocE1hYywKKwkJCSZwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LgorCQkJc3VwcG9ydGVkUmF0ZXMsCisJCQlwQmVhY29uU3RydWN0LT5IVENhcHMuc3VwcG9ydGVkTUNTU2V0LAorCQkJZmFsc2UsIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisJbGltX2ZpbGxfc3VwcG9ydGVkX3JhdGVzX2luZm8ocE1hYywgTlVMTCwKKwkJCSZwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LgorCQkJc3VwcG9ydGVkUmF0ZXMsIHBzZXNzaW9uRW50cnkpOworCisKKwlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmVuY3J5cHRUeXBlID0gcHNlc3Npb25FbnRyeS0+ZW5jcnlwdFR5cGU7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlwQWRkQnNzUGFyYW1zLT5tYXhUeFBvd2VyID0gcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlcjsKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJtYXhUeFBvd2VyOiAlZCIpLCBwQWRkQnNzUGFyYW1zLT5tYXhUeFBvd2VyKTsKKyNlbmRpZgorCisJcEFkZEJzc1BhcmFtcy0+c3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXBBZGRCc3NQYXJhbXMtPnJlc3BSZXFkID0gdHJ1ZTsKKworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc21lc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisJcEFkZEJzc1BhcmFtcy0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKwlwQWRkQnNzUGFyYW1zLT5oYWxQZXJzb25hID0gKHVpbnQ4X3QpIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYTsgLyogdXBkYXRlIHBlcnNvbmEgKi8KKworCXBBZGRCc3NQYXJhbXMtPmJTcGVjdHJ1bU1ndEVuYWJsZWQgPSBwc2Vzc2lvbkVudHJ5LT5zcGVjdHJ1bU1ndEVuYWJsZWQ7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW1WYWxpZCA9IDA7CisJbGltX2xvZyhwTWFjLCBMT0cyLCBGTCgiZXh0U2V0U3RhS2V5UGFyYW1WYWxpZDogJWQiKSwKKwkJcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW1WYWxpZCk7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwlpZiAocHNlc3Npb25FbnRyeS0+bGltUm1mRW5hYmxlZCkgeworCQlwQWRkQnNzUGFyYW1zLT5ybWZFbmFibGVkID0gMTsKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5ybWZFbmFibGVkID0gMTsKKwl9CisjZW5kaWYKKworCXBBZGRCc3NQYXJhbXMtPm5zcyA9IHBzZXNzaW9uRW50cnktPm5zczsKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJuc3MgdmFsdWU6ICVkIiksIHBBZGRCc3NQYXJhbXMtPm5zcyk7CisKKwkvKiBTZXQgYSBuZXcgc3RhdGUgZm9yIE1MTUUgKi8KKwlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1BSRUFTU09DX1NUQVRFOworCisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKSk7CisKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJzdGFDb250ZXh0IHdtbUVuYWJsZWQ6ICVkIGVuY3J5cHRUeXBlOiAlZCAiCisJCQkgICAgICAgInAycENhcGFibGVTdGE6ICVkIiksCisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQud21tRW5hYmxlZCwKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5lbmNyeXB0VHlwZSwKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5wMnBDYXBhYmxlU3RhKTsKKworCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoImJTcGVjdHJ1bU1ndEVuYWJsZWQ6ICVkIGhhbFBlcnNvbmE6ICVkIHNldHRpbmcgIgorCQkJICAgICAgICJMaW1NbG0gc3RhdGUgdG8gJWQiKSwKKwkJcEFkZEJzc1BhcmFtcy0+YlNwZWN0cnVtTWd0RW5hYmxlZCwgcEFkZEJzc1BhcmFtcy0+aGFsUGVyc29uYSwKKwkJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpOworCisJLyogd2UgbmVlZCB0byBkZWZlciB0aGUgbWVzc2FnZSB1bnRpbCB3ZSBnZXQgdGhlIHJlc3BvbnNlIGJhY2sgZnJvbSBIQUwuICovCisJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgZmFsc2UpOworCisJbXNnUS50eXBlID0gV01BX0FERF9CU1NfUkVROworCS8qKiBAVG9EbyA6IFVwZGF0ZSB0aGUgR2xvYmFsIGNvdW50ZXIgdG8ga2VlcHRyYWNrIG9mIHRoZSBQRSA8LS0+IEhBTCBtZXNzYWdlcyovCisJbXNnUS5yZXNlcnZlZCA9IDA7CisJbXNnUS5ib2R5cHRyID0gcEFkZEJzc1BhcmFtczsKKwltc2dRLmJvZHl2YWwgPSAwOworCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiU2Vzc2lvbklkOiVkIFNlbmRpbmcgV01BX0FERF9CU1NfUkVRIiksCisJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbXNnUS50eXBlKSk7CisKKwlyZXRDb2RlID0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ1EpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkgeworCQlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKwkJY2RmX21lbV9mcmVlKHBBZGRCc3NQYXJhbXMpOworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiUG9zdGluZyBBRERfQlNTX1JFUSB0byBIQUwgZmFpbGVkLCByZWFzb249JVgiKSwKKwkJCXJldENvZGUpOworCQlnb3RvIHJldHVybkZhaWx1cmU7CisKKwl9IGVsc2UgeworCQljZGZfbWVtX2ZyZWUocEJlYWNvblN0cnVjdCk7CisJCXJldHVybiByZXRDb2RlOworCX0KKworcmV0dXJuRmFpbHVyZToKKwkvKiBDbGVhbi11cCB3aWxsIGJlIGRvbmUgYnkgdGhlIGNhbGxlci4uLiAqLworCWNkZl9tZW1fZnJlZShwQmVhY29uU3RydWN0KTsKKwlyZXR1cm4gcmV0Q29kZTsKK30KKworLyoqCisgKiBsaW1fcHJlcGFyZV9hbmRfc2VuZF9kZWxfc3RhX2NuZigpIC0gcHJlcGFyZXMgYW5kIHNlbmQgZGVsIHN0YSBjbmYKKyAqCisgKiBAcE1hYzogICAgICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAcFN0YURzOiAgICAgICAgc3RhIGRwaCBub2RlCisgKiBAc3RhdHVzQ29kZTogICAgc3RhdHVzIGNvZGUKKyAqIEBwc2Vzc2lvbkVudHJ5OiBzZXNzaW9uIGNvbnRleHQKKyAqCisgKiBkZWxldGVzIERQSCBlbnRyeSwgY2hhbmdlcyB0aGUgTUxNIG1vZGUgZm9yIHN0YXRpb24sIGNhbGxzCisgKiBsaW1fc2VuZF9kZWxfc3RhX2NuZgorICoKKyAqIFJldHVybjogdm9pZAorICovCit2b2lkCitsaW1fcHJlcGFyZV9hbmRfc2VuZF9kZWxfc3RhX2NuZih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywKKwkJCQkgdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGUsCisJCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDE2X3Qgc3RhRHNBc3NvY0lkID0gMDsKKwl0U2lyTWFjQWRkciBzdGFEc0FkZHI7CisJdExpbU1sbVN0YUNvbnRleHQgbWxtU3RhQ29udGV4dDsKKworCWlmIChwU3RhRHMgPT0gTlVMTCkgeworCQlQRUxPR1cobGltX2xvZyhwTWFjLCBMT0dXLCBGTCgicFN0YURzIGlzIE5VTEwiKSk7KQorCQlyZXR1cm47CisJfQorCXN0YURzQXNzb2NJZCA9IHBTdGFEcy0+YXNzb2NJZDsKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgc3RhRHNBZGRyLAorCQkgICAgIHBTdGFEcy0+c3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwltbG1TdGFDb250ZXh0ID0gcFN0YURzLT5tbG1TdGFDb250ZXh0OworCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJbGltX3JlbGVhc2VfcGVlcl9pZHgocE1hYywgcFN0YURzLT5hc3NvY0lkLCBwc2Vzc2lvbkVudHJ5KTsKKwl9CisJbGltX2RlbGV0ZV9kcGhfaGFzaF9lbnRyeShwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIHBTdGFEcy0+YXNzb2NJZCwKKwkJCQkgIHBzZXNzaW9uRW50cnkpOworCisJaWYgKExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCXBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKwkJTVRSQUNFKG1hY190cmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwKKwkJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKSk7CisJfQorCWxpbV9zZW5kX2RlbF9zdGFfY25mKHBNYWMsIHN0YURzQWRkciwgc3RhRHNBc3NvY0lkLCBtbG1TdGFDb250ZXh0LAorCQkJICAgICBzdGF0dXNDb2RlLCBwc2Vzc2lvbkVudHJ5KTsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fZ2V0X3N0YV9yYXRlX21vZGUKKyAgIFxicmllZiBHZXRzIHRoZSBTdGF0aW9uIFJhdGUgTW9kZS4KKyAgIFxwYXJhbSAgICAgdWludDhfdCBkb3QxMU1vZGUKKyAgIFxyZXR1cm4gbm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U3RhUmF0ZU1vZGUgbGltX2dldF9zdGFfcmF0ZV9tb2RlKHVpbnQ4X3QgZG90MTFNb2RlKQoreworCXN3aXRjaCAoZG90MTFNb2RlKSB7CisJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFBOgorCQlyZXR1cm4gZVNUQV8xMWE7CisJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFCOgorCQlyZXR1cm4gZVNUQV8xMWI7CisJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFHOgorCQlyZXR1cm4gZVNUQV8xMWJnOworCWNhc2UgV05JX0NGR19ET1QxMV9NT0RFXzExTjoKKwkJcmV0dXJuIGVTVEFfMTFuOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFBQzoKKwkJcmV0dXJuIGVTVEFfMTFhYzsKKyNlbmRpZgorCWNhc2UgV05JX0NGR19ET1QxMV9NT0RFX0FMTDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gZVNUQV8xMW47CisKKwl9Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX2luaXRfcHJlX2F1dGhfdGltZXJfdGFibGUKKyAgIFxicmllZiBJbml0aWFsaXplIHRoZSBQcmUgQXV0aCBUYW5sZSBhbmQgY3JlYXRlcyB0aGUgdGltZXIgZm9yCisgICAgICAgZWFjaCBub2RlIGZvciB0aGUgdGltZW91dCB2YWx1ZSBnb3QgZnJvbSBjZmcuCisgICBccGFyYW0gICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKKyAgIFxwYXJhbSAgICAgdHBMaW1QcmVBdXRoVGFibGUgcFByZUF1dGhUaW1lclRhYmxlCisgICBccmV0dXJuIG5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1faW5pdF9wcmVfYXV0aF90aW1lcl90YWJsZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgIHRwTGltUHJlQXV0aFRhYmxlIHBQcmVBdXRoVGltZXJUYWJsZSkKK3sKKwl1aW50MzJfdCBjZmdWYWx1ZTsKKwl1aW50MzJfdCBhdXRoTm9kZUlkeDsKKwl0cExpbVByZUF1dGhOb2RlIHBBdXRoTm9kZSA9IHBQcmVBdXRoVGltZXJUYWJsZS0+cFRhYmxlOworCisJLyogR2V0IEFVVEhfUlNQIFRpbWVycyB2YWx1ZSAqLworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19BVVRIRU5USUNBVEVfUlNQX1RJTUVPVVQsCisJCQkgICAgICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCS8qCisJCSoqIENvdWxkIG5vdCBnZXQgQVVUSF9SU1AgdGltZW91dCB2YWx1ZQorCQkqKiBmcm9tIENGRy4gTG9nIGVycm9yLgorCQkqKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBBVVRIX1JTUCB0aW1lb3V0IHZhbHVlIikpOworCQlyZXR1cm47CisJfQorCisJY2ZnVmFsdWUgPSBTWVNfTVNfVE9fVElDS1MoY2ZnVmFsdWUpOworCWZvciAoYXV0aE5vZGVJZHggPSAwOyBhdXRoTm9kZUlkeCA8IHBQcmVBdXRoVGltZXJUYWJsZS0+bnVtRW50cnk7CisJICAgICBhdXRoTm9kZUlkeCsrLCBwQXV0aE5vZGUrKykgeworCQlpZiAodHhfdGltZXJfY3JlYXRlCisJCQkgICAgKCZwQXV0aE5vZGUtPnRpbWVyLCAiQVVUSCBSRVNQT05TRSBUSU1FT1VUIiwKKwkJCSAgICBsaW1fYXV0aF9yZXNwb25zZV90aW1lcl9oYW5kbGVyLCBhdXRoTm9kZUlkeCwgY2ZnVmFsdWUsIDAsCisJCQkgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpIHsKKwkJCS8qIENhbm5vdCBjcmVhdGUgdGltZXIuICBMb2cgZXJyb3IuICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIkNhbm5vdCBjcmVhdGUgQXV0aCBSc3AgdGltZXIgb2YgSW5kZXggOiVkLiIpLAorCQkJCWF1dGhOb2RlSWR4KTsKKwkJCXJldHVybjsKKwkJfQorCQlwQXV0aE5vZGUtPmF1dGhOb2RlSWR4ID0gKHVpbnQ4X3QpIGF1dGhOb2RlSWR4OworCQlwQXV0aE5vZGUtPmZGcmVlID0gMTsKKwl9CisKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fYWNxdWlyZV9mcmVlX3ByZV9hdXRoX25vZGUKKyAgIFxicmllZiBSZXRyaXZlcyBhIGZyZWUgUHJlIEF1dGggbm9kZSBmcm9tIFByZSBBdXRoIFRhYmxlLgorICAgXHBhcmFtICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCisgICBccGFyYW0gICAgIHRwTGltUHJlQXV0aFRhYmxlIHBQcmVBdXRoVGltZXJUYWJsZQorICAgXHJldHVybiBub25lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RMaW1QcmVBdXRoTm9kZSAqbGltX2FjcXVpcmVfZnJlZV9wcmVfYXV0aF9ub2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQl0cExpbVByZUF1dGhUYWJsZSBwUHJlQXV0aFRpbWVyVGFibGUpCit7CisJdWludDMyX3QgaTsKKwl0TGltUHJlQXV0aE5vZGUgKnBUZW1wTm9kZSA9IHBQcmVBdXRoVGltZXJUYWJsZS0+cFRhYmxlOworCWZvciAoaSA9IDA7IGkgPCBwUHJlQXV0aFRpbWVyVGFibGUtPm51bUVudHJ5OyBpKyssIHBUZW1wTm9kZSsrKSB7CisJCWlmIChwVGVtcE5vZGUtPmZGcmVlID09IDEpIHsKKwkJCXBUZW1wTm9kZS0+ZkZyZWUgPSAwOworCQkJcmV0dXJuIHBUZW1wTm9kZTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIGxpbV9nZXRfcHJlX2F1dGhfbm9kZV9mcm9tX2luZGV4CisgICBcYnJpZWYgRGVwZW5kaW5nIG9uIHRoZSBJbmRleCB0aGlzIHJldHJpdmVzIHRoZSBwcmUgYXV0aCBub2RlLgorICAgXHBhcmFtICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCisgICBccGFyYW0gICAgIHRwTGltUHJlQXV0aFRhYmxlIHBBdXRoVGFibGUKKyAgIFxwYXJhbSAgICAgdWludDMyX3QgYXV0aE5vZGVJZHgKKyAgIFxyZXR1cm4gbm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0TGltUHJlQXV0aE5vZGUgKmxpbV9nZXRfcHJlX2F1dGhfbm9kZV9mcm9tX2luZGV4KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgIHRwTGltUHJlQXV0aFRhYmxlIHBBdXRoVGFibGUsCisJCQkJCQkgIHVpbnQzMl90IGF1dGhOb2RlSWR4KQoreworCWlmICgoYXV0aE5vZGVJZHggPj0gcEF1dGhUYWJsZS0+bnVtRW50cnkpCisJICAgIHx8IChwQXV0aFRhYmxlLT5wVGFibGUgPT0gTlVMTCkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkludmFsaWQgQXV0aCBUaW1lciBJbmRleCA6ICVkIE51bUVudHJ5IDogJWQiKSwKKwkJCWF1dGhOb2RlSWR4LCBwQXV0aFRhYmxlLT5udW1FbnRyeSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBwQXV0aFRhYmxlLT5wVGFibGUgKyBhdXRoTm9kZUlkeDsKK30KKworLyogVXRpbCBBUEkgdG8gY2hlY2sgaWYgdGhlIGNoYW5uZWxzIHN1cHBvcnRlZCBieSBTVEEgaXMgd2l0aGluIHJhbmdlICovCit0U2lyUmV0U3RhdHVzIGxpbV9pc19kb3QxMWhfc3VwcG9ydGVkX2NoYW5uZWxzX3ZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgIHRTaXJBc3NvY1JlcSAqYXNzb2MpCit7CisJLyoKKwkgKiBBbGxvdyBhbGwgdGhlIHN0YXRpb25zIHRvIGpvaW4gd2l0aCB1cy4KKwkgKiA4MDIuMTFoLTIwMDMgMTEuNi4xID0+IEFuIEFQIG1heSB1c2UgdGhlIHN1cHBvcnRlZCBjaGFubmVscyBsaXN0IGZvciBhc3NvY2lhdGVkIFNUQXMKKwkgKiBhcyBhbiBpbnB1dCBpbnRvIGFuIGFsZ29yaXRobSB1c2VkIHRvIHNlbGVjdCBhIG5ldyBjaGFubmVsIGZvciB0aGUgQlNTLgorCSAqIFRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGFtZW5kbWVudC4KKwkgKi8KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qIFV0aWwgQVBJIHRvIGNoZWNrIGlmIHRoZSB0eHBvd2VyIHN1cHBvcnRlZCBieSBTVEEgaXMgd2l0aGluIHJhbmdlICovCit0U2lyUmV0U3RhdHVzIGxpbV9pc19kb3QxMWhfcG93ZXJfY2FwYWJpbGl0aWVzX2luX3JhbmdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJdFNpckFzc29jUmVxICphc3NvYywKKwkJCQkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRQb3dlcmRCbSBsb2NhbE1heFR4UG93ZXI7CisJdWludDMyX3QgbG9jYWxQd3JDb25zdHJhaW50OworCisJbG9jYWxNYXhUeFBvd2VyID0KKwkJY2ZnX2dldF9yZWd1bGF0b3J5X21heF90cmFuc21pdF9wb3dlcihwTWFjLAorCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKTsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50CisJCSAgICAocE1hYywgV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5ULAorCQkgICAgJmxvY2FsUHdyQ29uc3RyYWludCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gZ2V0IExvY2FsIFBvd2VyIENvbnN0cmFpbnQgZnJvbSBjZmciKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCWxvY2FsTWF4VHhQb3dlciAtPSAodFBvd2VyZEJtKSBsb2NhbFB3ckNvbnN0cmFpbnQ7CisKKwkvKioKKwkgKiAgVGhlIG1pbiBUeCBQb3dlciBvZiB0aGUgYXNzb2NpYXRpbmcgc3RhdGlvbiBzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbiAocmVndWxhdG9yeQorCSAqICBtYXggdHggcG93ZXIgLSBsb2NhbCBwb3dlciBjb25zdHJhaW50IGNvbmZpZ3VyZWQgb24gQVApLgorCSAqLworCWlmIChhc3NvYy0+cG93ZXJDYXBhYmlsaXR5Lm1pblR4UG93ZXIgPiBsb2NhbE1heFR4UG93ZXIpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIm1pblR4UG93ZXIgKFNUQSkgPSAlZCwgbG9jYWxNYXhUeFBvd2VyIChBUCkgPSAlZCIpLAorCQkJYXNzb2MtPnBvd2VyQ2FwYWJpbGl0eS5taW5UeFBvd2VyLCBsb2NhbE1heFR4UG93ZXIpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgIGxpbV9maWxsX3J4X2hpZ2hlc3Rfc3VwcG9ydGVkX3JhdGUKKyAgIFxicmllZiAgRmlsbHMgaW4gdGhlIFJ4IEhpZ2hlc3QgU3VwcG9ydGVkIERhdGEgUmF0ZSBmaWVsZCBmcm9tCisgXCAgICAgICB0aGUgJ3N1cHBvcnRlZCBNQ1Mgc2V0JyBmaWVsZCBpbiBIVCBjYXBhYmlsaXR5IGVsZW1lbnQuCisgICBccGFyYW0gIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKKyAgIFxwYXJhbSAgdHBTaXJTdXBwb3J0ZWRSYXRlcyAgcFJhdGVzCisgICBccGFyYW0gIHVpbnQ4X3QqICBwU3VwcG9ydGVkTUNTU2V0CisgICBccmV0dXJuIG5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1fZmlsbF9yeF9oaWdoZXN0X3N1cHBvcnRlZF9yYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXVpbnQxNl90ICpyeEhpZ2hlc3RSYXRlLAorCQkJCQl1aW50OF90ICpwU3VwcG9ydGVkTUNTU2V0KQoreworCXRTaXJNYWNSeEhpZ2hlc3RTdXBwb3J0UmF0ZSAqcFJ4SGlnaGVzdFJhdGU7CisJdWludDhfdCAqcEJ1ZjsKKwl1aW50MTZfdCByYXRlID0gMDsKKworCXBCdWYgPSBwU3VwcG9ydGVkTUNTU2V0ICsgTUNTX1JYX0hJR0hFU1RfU1VQUE9SVEVEX1JBVEVfQllURV9PRkZTRVQ7CisJcmF0ZSA9IGxpbV9nZXRfdTE2KHBCdWYpOworCisJcFJ4SGlnaGVzdFJhdGUgPSAodFNpck1hY1J4SGlnaGVzdFN1cHBvcnRSYXRlICopICZyYXRlOworCSpyeEhpZ2hlc3RSYXRlID0gcFJ4SGlnaGVzdFJhdGUtPnJhdGU7CisKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuICAgICBsaW1fc2VuZF9zbWVfdW5wcm90ZWN0ZWRfbWdtdF9mcmFtZV9pbmQKKyAgIFxicmllZiAgRm9yd2FyZHMgdGhlIHVucHJvdGVjdGVkIG1hbmFnZW1lbnQgZnJhbWUgdG8gU01FLgorICAgXHBhcmFtICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCisgICBccGFyYW0gIGZyYW1lVHlwZSAtIDgwMi4xMSBmcmFtZSB0eXBlCisgICBccGFyYW0gIGZyYW1lIC0gZnJhbWUgYnVmZmVyCisgICBccGFyYW0gIHNlc3Npb25JZCAtIGlkIGZvciB0aGUgY3VycmVudCBzZXNzaW9uCisgICBccGFyYW0gIHBzZXNzaW9uRW50cnkgLSBQRSBzZXNzaW9uIGNvbnRleHQKKyAgIFxyZXR1cm4gbm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbV9zZW5kX3NtZV91bnByb3RlY3RlZF9tZ210X2ZyYW1lX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGZyYW1lVHlwZSwKKwkJCQkJICAgICB1aW50OF90ICpmcmFtZSwgdWludDMyX3QgZnJhbWVMZW4sCisJCQkJCSAgICAgdWludDE2X3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpck1zZ1EgbW1oTXNnOworCXRTaXJTbWVVbnByb3RNZ210RnJhbWVJbmQgKnBTaXJTbWVNZ210RnJhbWUgPSBOVUxMOworCXVpbnQxNl90IGxlbmd0aDsKKworCWxlbmd0aCA9IHNpemVvZih0U2lyU21lVW5wcm90TWdtdEZyYW1lSW5kKSArIGZyYW1lTGVuOworCisJcFNpclNtZU1nbXRGcmFtZSA9IGNkZl9tZW1fbWFsbG9jKGxlbmd0aCk7CisJaWYgKE5VTEwgPT0gcFNpclNtZU1nbXRGcmFtZSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgiQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciB0U2lyU21lVW5wcm90ZWN0ZWRNZ210RnJhbWVJbmQiKSk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV9zZXQoKHZvaWQgKilwU2lyU21lTWdtdEZyYW1lLCBsZW5ndGgsIDApOworCisJcFNpclNtZU1nbXRGcmFtZS0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCXBTaXJTbWVNZ210RnJhbWUtPmZyYW1lVHlwZSA9IGZyYW1lVHlwZTsKKworCWNkZl9tZW1fY29weShwU2lyU21lTWdtdEZyYW1lLT5mcmFtZUJ1ZiwgZnJhbWUsIGZyYW1lTGVuKTsKKwlwU2lyU21lTWdtdEZyYW1lLT5mcmFtZUxlbiA9IGZyYW1lTGVuOworCisJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9VTlBST1RfTUdNVF9GUk1fSU5EOworCW1taE1zZy5ib2R5cHRyID0gcFNpclNtZU1nbXRGcmFtZTsKKwltbWhNc2cuYm9keXZhbCA9IDA7CisKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCXJldHVybjsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiAgICAgbGltX3NlbmRfc21lX3RzbV9pZV9pbmQKKyAgIFxicmllZiAgRm9yd2FyZHMgdGhlIFRTTSBJRSBpbmZvcm1hdGlvbiB0byBTTUUuCisgICBccGFyYW0gIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKKyAgIFxwYXJhbSAgcHNlc3Npb25FbnRyeSAtIFBFIHNlc3Npb24gY29udGV4dAorICAgXHBhcmFtICB0aWQgLSB0cmFmZmljIGlkCisgICBccGFyYW0gIHN0YXRlIC0gdHNtIHN0YXRlIChlbmFibGVkL2Rpc2FibGVkKQorICAgXHBhcmFtICBtZWFzdXJlbWVudEludGVydmFsIC0gbWVhc3VyZW1lbnQgaW50ZXJ2YWwKKyAgIFxyZXR1cm4gbm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbV9zZW5kX3NtZV90c21faWVfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkgICAgIHVpbnQ4X3QgdGlkLCB1aW50OF90IHN0YXRlLCB1aW50MTZfdCBtZWFzSW50ZXJ2YWwpCit7CisJdFNpck1zZ1EgbW1oTXNnOworCXRwU2lyU21lVHNtSUVJbmQgcFNpclNtZVRzbUllSW5kID0gTlVMTDsKKworCWlmICghcE1hYyB8fCAhcHNlc3Npb25FbnRyeSkKKwkJcmV0dXJuOworCisJcFNpclNtZVRzbUllSW5kID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVUc21JRUluZCkpOworCWlmIChOVUxMID09IHBTaXJTbWVUc21JZUluZCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciB0U2lyU21lVHNtSUVJbmQiKSk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV9zZXQoKHZvaWQgKilwU2lyU21lVHNtSWVJbmQsIHNpemVvZih0U2lyU21lVHNtSUVJbmQpLCAwKTsKKworCXBTaXJTbWVUc21JZUluZC0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCXBTaXJTbWVUc21JZUluZC0+dHNtSWUudHNpZCA9IHRpZDsKKwlwU2lyU21lVHNtSWVJbmQtPnRzbUllLnN0YXRlID0gc3RhdGU7CisJcFNpclNtZVRzbUllSW5kLT50c21JZS5tc210X2ludGVydmFsID0gbWVhc0ludGVydmFsOworCisJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9UU01fSUVfSU5EOworCW1taE1zZy5ib2R5cHRyID0gcFNpclNtZVRzbUllSW5kOworCW1taE1zZy5ib2R5dmFsID0gMDsKKworCWxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX2Fzc29jX3V0aWxzLmggYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9hc3NvY191dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZWZiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9hc3NvY191dGlscy5oCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGxpbV9hc3NvY191dGlscy5oIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGRlZmluaXRpb25zCisgKiBMSU0gdXNlcyB3aGlsZSBwcm9jZXNzaW5nIFJlL0Fzc29jaWF0aW9uIG1lc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMDUvMjYvMTAgICAgICAganMgICAgICAgICAgICAgV1BBIGhhbmRsaW5nIGluIChSZSlBc3NvYyBmcmFtZXMKKyAqCisgKi8KKyNpZm5kZWYgX19MSU1fQVNTT0NfVVRJTFNfSAorI2RlZmluZSBfX0xJTV9BU1NPQ19VVElMU19ICisKKyNpbmNsdWRlICJzaXJfYXBpLmgiCisjaW5jbHVkZSAic2lyX2RlYnVnLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisKK3VpbnQ4X3QgbGltX2NtcF9zX3NpZCh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1NTaWQgKiwgdHBQRVNlc3Npb24pOwordWludDhfdCBsaW1fY29tcGFyZV9jYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwsCisJCQkJIHRTaXJBc3NvY1JlcSAqLAorCQkJCSB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gKiwgdHBQRVNlc3Npb24pOwordWludDhfdCBsaW1fY2hlY2tfcnhfYmFzaWNfcmF0ZXModHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNSYXRlU2V0LCB0cFBFU2Vzc2lvbik7Cit1aW50OF90IGxpbV9jaGVja19yeF9yc25faWVfbWF0Y2godHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVJTTiwgdHBQRVNlc3Npb24sIHVpbnQ4X3QsCisJCQkJICBib29sICopOwordWludDhfdCBsaW1fY2hlY2tfcnhfd3BhX2llX21hdGNoKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXUEEsIHRwUEVTZXNzaW9uLAorCQkJCSAgdWludDhfdCk7Cit1aW50OF90IGxpbV9jaGVja19tY3Nfc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnN1cHBvcnRlZE1DU1NldCk7Cit2b2lkIGxpbVBvc3REdW1teVRvVG1SaW5nKHRwQW5pU2lyR2xvYmFsLCB0cERwaEhhc2hOb2RlKTsKK3ZvaWQgbGltUG9zdFBhY2tldFRvVGRSaW5nKHRwQW5pU2lyR2xvYmFsLCB0cERwaEhhc2hOb2RlLCB1aW50OF90KTsKK3RTaXJSZXRTdGF0dXMgbGltX2NsZWFudXBfcnhfcGF0aCh0cEFuaVNpckdsb2JhbCwgdHBEcGhIYXNoTm9kZSwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fcmVqZWN0X2Fzc29jaWF0aW9uKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjQWRkciwgdWludDhfdCwKKwkJCSAgICB1aW50OF90LCB0QW5pQXV0aFR5cGUsCisJCQkgICAgdWludDE2X3QsIHVpbnQ4X3QsIHRTaXJSZXN1bHRDb2RlcywgdHBQRVNlc3Npb24pOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKK3RTaXJSZXRTdGF0dXMgbGltX3BvcHVsYXRlX3BlZXJfcmF0ZV9zZXQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJIHRwU2lyU3VwcG9ydGVkUmF0ZXMgcFJhdGVzLAorCQkJCQkgdWludDhfdCAqcFN1cHBvcnRlZE1DU1NldCwKKwkJCQkJIHVpbnQ4X3QgYmFzaWNPbmx5LAorCQkJCQkgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkJIHREb3QxMWZJRVZIVENhcHMgKnBWSFRDYXBzKTsKKyNlbHNlCit0U2lyUmV0U3RhdHVzIGxpbV9wb3B1bGF0ZV9wZWVyX3JhdGVfc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSB0cFNpclN1cHBvcnRlZFJhdGVzIHBSYXRlcywKKwkJCQkJIHVpbnQ4X3QgKnBTdXBwb3J0ZWRNQ1NTZXQsCisJCQkJCSB1aW50OF90IGJhc2ljT25seSwKKwkJCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQwordFNpclJldFN0YXR1cyBsaW1fcG9wdWxhdGVfb3duX3JhdGVfc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXRwU2lyU3VwcG9ydGVkUmF0ZXMgcFJhdGVzLAorCQkJCQl1aW50OF90ICpwU3VwcG9ydGVkTUNTU2V0LAorCQkJCQl1aW50OF90IGJhc2ljT25seSwKKwkJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkJdERvdDExZklFVkhUQ2FwcyAqcFZIVENhcHMpOworCisjZWxzZQordFNpclJldFN0YXR1cyBsaW1fcG9wdWxhdGVfb3duX3JhdGVfc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXRwU2lyU3VwcG9ydGVkUmF0ZXMgcFJhdGVzLAorCQkJCQl1aW50OF90ICpwU3VwcG9ydGVkTUNTU2V0LAorCQkJCQl1aW50OF90IGJhc2ljT25seSwKKwkJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCit0U2lyUmV0U3RhdHVzCitsaW1fcG9wdWxhdGVfbWF0Y2hpbmdfcmF0ZV9zZXQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgICB0cERwaEhhc2hOb2RlIHBTdGFEcywKKwkJCSAgICAgICB0U2lyTWFjUmF0ZVNldCAqcE9wZXJSYXRlU2V0LAorCQkJICAgICAgIHRTaXJNYWNSYXRlU2V0ICpwRXh0UmF0ZVNldCwKKwkJCSAgICAgICB1aW50OF90ICpwU3VwcG9ydGVkTUNTU2V0LAorCQkJICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkgICAgICAgdERvdDExZklFVkhUQ2FwcyAqcFZIVENhcHMpOworI2Vsc2UKK3RTaXJSZXRTdGF0dXMgbGltX3BvcHVsYXRlX21hdGNoaW5nX3JhdGVfc2V0KHRwQW5pU2lyR2xvYmFsLAorCQkJCQkgICAgIHRwRHBoSGFzaE5vZGUsCisJCQkJCSAgICAgdFNpck1hY1JhdGVTZXQgKiwKKwkJCQkJICAgICB0U2lyTWFjUmF0ZVNldCAqLAorCQkJCQkgICAgIHVpbnQ4X3QgKnBTdXBwb3J0ZWRNQ1NTZXQsCisJCQkJCSAgICAgdHBQRVNlc3Npb24pOworCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisjZGVmaW5lIE1DU01BUE1BU0sxeDEgMHgzCisjZGVmaW5lIE1DU01BUE1BU0syeDIgMHhDCisjZW5kaWYKKwordFNpclJldFN0YXR1cyBsaW1fYWRkX3N0YSh0cEFuaVNpckdsb2JhbCwgdHBEcGhIYXNoTm9kZSwgdWludDhfdCwgdHBQRVNlc3Npb24pOwordFNpclJldFN0YXR1cyBsaW1fZGVsX2Jzcyh0cEFuaVNpckdsb2JhbCwgdHBEcGhIYXNoTm9kZSwgdWludDE2X3QsIHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgbGltX2RlbF9zdGEodHBBbmlTaXJHbG9iYWwsIHRwRHBoSGFzaE5vZGUsIGJvb2wsIHRwUEVTZXNzaW9uKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgordFNpclJldFN0YXR1cyBsaW1fYWRkX2Z0X3N0YV9zZWxmKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGFzc29jSWQsCisJCQkJICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLwordFNpclJldFN0YXR1cyBsaW1fYWRkX3N0YV9zZWxmKHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdWludDhfdCwgdHBQRVNlc3Npb24pOwordFN0YVJhdGVNb2RlIGxpbV9nZXRfc3RhX3JhdGVfbW9kZSh1aW50OF90IGRvdDExTW9kZSk7CisKK3ZvaWQgbGltX3RlYXJkb3duX2luZnJhX2Jzcyh0cEFuaVNpckdsb2JhbCwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fcmVzdG9yZV9wcmVfcmVhc3NvY19zdGF0ZSh0cEFuaVNpckdsb2JhbCwKKwkJCQkgICB0U2lyUmVzdWx0Q29kZXMsIHVpbnQxNl90LCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbV9wb3N0X3JlYXNzb2NfZmFpbHVyZSh0cEFuaVNpckdsb2JhbCwKKwkJCSAgICAgIHRTaXJSZXN1bHRDb2RlcywgdWludDE2X3QsIHRwUEVTZXNzaW9uKTsKK2Jvb2wgbGltX2lzX3JlYXNzb2NfaW5fcHJvZ3Jlc3ModHBBbmlTaXJHbG9iYWwsIHRwUEVTZXNzaW9uKTsKK3ZvaWQKK2xpbV9zZW5kX2RlbF9zdGFfY25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHN0YURzQWRkciwKKwkJICAgICB1aW50MTZfdCBzdGFEc0Fzc29jSWQsIHRMaW1NbG1TdGFDb250ZXh0IG1sbVN0YUNvbnRleHQsCisJCSAgICAgdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGUsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2b2lkIGxpbV9oYW5kbGVfY25mX3dhaXRfdGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBzdGFJZCk7Cit2b2lkIGxpbV9kZWxldGVfZHBoX2hhc2hfZW50cnkodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNBZGRyLCB1aW50MTZfdCwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fY2hlY2tfYW5kX2Fubm91bmNlX2pvaW5fc3VjY2Vzcyh0cEFuaVNpckdsb2JhbCwKKwkJCQkJIHRTaXJQcm9iZVJlc3BCZWFjb24gKiwKKwkJCQkJIHRwU2lyTWFjTWdtdEhkciwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fdXBkYXRlX3JlX2Fzc29jX2dsb2JhbHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgdHBTaXJBc3NvY1JzcCBwQXNzb2NSc3AsCisJCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2b2lkIGxpbV91cGRhdGVfYXNzb2Nfc3RhX2RhdGFzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdHBEcGhIYXNoTm9kZSBwU3RhRHMsIHRwU2lyQXNzb2NSc3AgcEFzc29jUnNwLAorCQkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fZmlsbF9zdXBwb3J0ZWRfcmF0ZXNfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGEsCisJCQkJICAgdHBTaXJTdXBwb3J0ZWRSYXRlcyBwUmF0ZXMsCisJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3RTaXJSZXRTdGF0dXMgbGltX3N0YV9zZW5kX2FkZF9ic3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJBc3NvY1JzcCBwQXNzb2NSc3AsCisJCQkJICAgdHBTY2hCZWFjb25TdHJ1Y3QgcEJlYWNvblN0cnVjdCwKKwkJCQkgICB0cFNpckJzc0Rlc2NyaXB0aW9uIGJzc0Rlc2NyaXB0aW9uLAorCQkJCSAgIHVpbnQ4X3QgdXBkYXRlRW50cnksIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordFNpclJldFN0YXR1cyBsaW1fc3RhX3NlbmRfYWRkX2Jzc19wcmVfYXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCB1cGRhdGVFbnRyeSwKKwkJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordm9pZCBsaW1fcHJlcGFyZV9hbmRfc2VuZF9kZWxfc3RhX2NuZih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywKKwkJCQkgICAgICB0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZSwgdHBQRVNlc3Npb24pOwordFNpclJldFN0YXR1cyBsaW1fZXh0cmFjdF9hcF9jYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcElFLAorCQkJCQkgIHVpbnQxNl90IGllTGVuLAorCQkJCQkgIHRwU2lyUHJvYmVSZXNwQmVhY29uIGJlYWNvblN0cnVjdCk7Cit2b2lkIGxpbV9pbml0X3ByZV9hdXRoX3RpbWVyX3RhYmxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgdHBMaW1QcmVBdXRoVGFibGUgcFByZUF1dGhUaW1lclRhYmxlKTsKK3RwTGltUHJlQXV0aE5vZGUgbGltX2FjcXVpcmVfZnJlZV9wcmVfYXV0aF9ub2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQl0cExpbVByZUF1dGhUYWJsZQorCQkJCQkJcFByZUF1dGhUaW1lclRhYmxlKTsKK3RwTGltUHJlQXV0aE5vZGUgbGltX2dldF9wcmVfYXV0aF9ub2RlX2Zyb21faW5kZXgodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgdHBMaW1QcmVBdXRoVGFibGUgcEF1dGhUYWJsZSwKKwkJCQkJCSAgdWludDMyX3QgYXV0aE5vZGVJZHgpOworCisvKiBVdGlsIEFQSSB0byBjaGVjayBpZiB0aGUgY2hhbm5lbHMgc3VwcG9ydGVkIGJ5IFNUQSBpcyB3aXRoaW4gcmFuZ2UgKi8KK3RTaXJSZXRTdGF0dXMgbGltX2lzX2RvdDExaF9zdXBwb3J0ZWRfY2hhbm5lbHNfdmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgICAgdFNpckFzc29jUmVxICphc3NvYyk7CisKKy8qIFV0aWwgQVBJIHRvIGNoZWNrIGlmIHRoZSB0eHBvd2VyIHN1cHBvcnRlZCBieSBTVEEgaXMgd2l0aGluIHJhbmdlICovCit0U2lyUmV0U3RhdHVzIGxpbV9pc19kb3QxMWhfcG93ZXJfY2FwYWJpbGl0aWVzX2luX3JhbmdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJdFNpckFzc29jUmVxICphc3NvYywKKwkJCQkJCQl0cFBFU2Vzc2lvbik7CisKKy8qIEFQSSB0byByZS1hZGQgdGhlIHNhbWUgQlNTIGR1cmluZyByZS1hc3NvY2lhdGlvbiAqLwordm9pZCBsaW1faGFuZGxlX2FkZF9ic3NfaW5fcmVfYXNzb2NfY29udGV4dCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywKKwkJCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvKiBBUEkgdG8gZmlsbCBpbiBSWCBIaWdoZXN0IFN1cHBvcnRlZCBkYXRhIFJhdGUgKi8KK3ZvaWQgbGltX2ZpbGxfcnhfaGlnaGVzdF9zdXBwb3J0ZWRfcmF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl1aW50MTZfdCAqcnhIaWdoZXN0UmF0ZSwKKwkJCQkJdWludDhfdCAqcFN1cHBvcnRlZE1DU1NldCk7CisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCit2b2lkIGxpbV9zZW5kX3JldHJ5X3JlYXNzb2NfcmVxX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICAgdExpbU1sbVJlYXNzb2NSZXEgKnBNbG1SZWFzc29jUmVxLAorCQkJCSAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVwordm9pZCBsaW1fc2VuZF9zbWVfdW5wcm90ZWN0ZWRfbWdtdF9mcmFtZV9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBmcmFtZVR5cGUsCisJCQkJCSAgICAgdWludDhfdCAqZnJhbWUsIHVpbnQzMl90IGZyYW1lTGVuLAorCQkJCQkgICAgIHVpbnQxNl90IHNlc3Npb25JZCwKKwkJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQordm9pZCBsaW1fc2VuZF9zbWVfdHNtX2llX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJICAgICB1aW50OF90IHRpZCwgdWludDhfdCBzdGF0ZSwgdWludDE2X3QgbWVhc0ludGVydmFsKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisKKyNlbmRpZiAvKiBfX0xJTV9BU1NPQ19VVElMU19IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9kZWJ1Zy5jIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTYyMGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fZGVidWcuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgbGltX2RlYnVnLmMKKworICAgXGJyaWVmIGltcGxlbWVudGF0aW9uIGZvciBsb2cgRGVidWcgcmVsYXRlZCBBUElzCisKKyAgIFxhdXRob3IgU3VuaXQgQmhhdGlhCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJsaW1fZGVidWcuaCIKKwordm9pZCBsaW1fbG9nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IGxvZ2xldmVsLCBjb25zdCBjaGFyICpwU3RyaW5nLCAuLi4pCit7CisjaWZkZWYgV0xBTl9ERUJVRworCS8qIFZlcmlmeSBhZ2FpbnN0IGN1cnJlbnQgbG9nIGxldmVsICovCisJaWYgKGxvZ2xldmVsID4KKwkgICAgcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW0xPR19JTkRFWF9GT1JfTU9EVUxFKFNJUl9MSU1fTU9EVUxFX0lEKV0pCisJCXJldHVybjsKKwllbHNlIHsKKwkJdmFfbGlzdCBtYXJrZXI7CisKKwkJdmFfc3RhcnQobWFya2VyLCBwU3RyaW5nKTsgICAgICAvKiBJbml0aWFsaXplIHZhcmlhYmxlIGFyZ3VtZW50cy4gKi8KKworCQlsb2dfZGVidWcocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIGxvZ2xldmVsLCBwU3RyaW5nLCBtYXJrZXIpOworCisJCXZhX2VuZChtYXJrZXIpOyAvKiBSZXNldCB2YXJpYWJsZSBhcmd1bWVudHMuICAgICAgKi8KKwl9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX2RlYnVnLmggYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYWI3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9kZWJ1Zy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBsaW1fZGVidWcuaCBjb250YWlucyBsb2cgZnVuY3Rpb24gY2FsbGVkIGJ5IExJTSBtb2R1bGUuCisgKgorICogQXV0aG9yOiAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAwMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaWZuZGVmIF9fTElNX0RFQlVHX0hfXworI2RlZmluZSBfX0xJTV9ERUJVR19IX18KKworI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgInNpcl9kZWJ1Zy5oIgorCisjaWYgIWRlZmluZWQoX19wcmludGYpCisjZGVmaW5lIF9fcHJpbnRmKGEsIGIpCisjZW5kaWYKKwordm9pZCBfX3ByaW50ZigzLCA0KSBsaW1fbG9nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IGxvZ2xldmVsLAorCQkJICAgIGNvbnN0IGNoYXIgKnBTdHJpbmcsIC4uLik7CisKKy8qIGRlZmluZSB0aGlzIHRvIHNob3cgbW9yZSBtZXNzYWdlIGluIHRoZSBMSU0gZHVyaW5nIFRETFMgZGV2ZWxvcG1lbnQgKi8KKyNkZWZpbmUgTElNX0RFQlVHX1RETFMKKworI2lmZGVmIExJTV9ERUJVR19URExTCisjZGVmaW5lIExJTV9MT0dfVERMUyh4MCkgeDAKKyNlbHNlCisjZGVmaW5lIExJTV9MT0dfVERMUyh4MCkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX2Z0LmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9mdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjMyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9mdC5jCkBAIC0wLDAgKzEsMjAyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxicmllZiBpbXBsZW1lbnRhdGlvbiBmb3IgUEUgMTFyIFZvV2lGaSBGVCBQcm90b2NvbAorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBJbmNsdWRlIEZpbGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPGxpbV9zZW5kX21lc3NhZ2VzLmg+CisjaW5jbHVkZSA8bGltX3R5cGVzLmg+CisjaW5jbHVkZSA8bGltX2Z0Lmg+CisjaW5jbHVkZSA8bGltX2Z0X2RlZnMuaD4KKyNpbmNsdWRlIDxsaW1fdXRpbHMuaD4KKyNpbmNsdWRlIDxsaW1fcHJvcF9leHRzX3V0aWxzLmg+CisjaW5jbHVkZSA8bGltX2Fzc29jX3V0aWxzLmg+CisjaW5jbHVkZSA8bGltX3Nlc3Npb24uaD4KKyNpbmNsdWRlIDxsaW1fYWRtaXRfY29udHJvbC5oPgorI2luY2x1ZGUgIndtbV9hcHNkLmgiCisKK2V4dGVybiB2b2lkIGxpbV9zZW5kX3NldF9zdGFfa2V5X3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgdExpbU1sbVNldEtleXNSZXEgKnBNbG1TZXRLZXlzUmVxLAorCQkJCSAgICAgdWludDE2X3Qgc3RhSWR4LAorCQkJCSAgICAgdWludDhfdCBkZWZXRVBJZHgsCisJCQkJICAgICB0cFBFU2Vzc2lvbiBzZXNzaW9uRW50cnksIGJvb2wgc2VuZFJzcCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluaXRpYWxpemUgdGhlIEZUIHZhcmlhYmxlcy4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbV9mdF9vcGVuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJaWYgKHBzZXNzaW9uRW50cnkpCisJCWNkZl9tZW1fc2V0KCZwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dCwgc2l6ZW9mKHRmdFBFQ29udGV4dCksCisJCQkgICAgMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIENsZWFudXAgRlQgdmFyaWFibGVzLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltX2Z0X2NsZWFudXBfcHJlX2F1dGhfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwUEVTZXNzaW9uIHBSZUFzc29jU2Vzc2lvbkVudHJ5ID0gTlVMTDsKKwl1aW50OF90IHNlc3Npb25JZCA9IDA7CisKKwlpZiAoIXBzZXNzaW9uRW50cnkpIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsICIlczogcHNlc3Npb25FbnRyeSBpcyBOVUxMIiwgX19mdW5jX18pOworCQkgICAgICAgKQorI2VuZGlmCisJCXJldHVybjsKKwl9CisKKwkvKiBOb3RoaW5nIHRvIGJlIGRvbmUgaWYgdGhlIHNlc3Npb24gaXMgbm90IGluIFNUQSBtb2RlICovCisJaWYgKCFMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJwc2Vzc2lvbkVudHJ5IGlzIG5vdCBpbiBTVEEgbW9kZSIpKTsKKwkJICAgICAgICkKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJaWYgKHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEpIHsKKwkJcFJlQXNzb2NTZXNzaW9uRW50cnkgPQorCQkJcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsCisJCQkJCQkgcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQuCisJCQkJCQkgcEZUUHJlQXV0aFJlcS0+cHJlQXV0aGJzc0lkLAorCQkJCQkJICZzZXNzaW9uSWQpOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiRnJlZWluZyBwRlRQcmVBdXRoUmVxPSAlcCIpLAorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEpOworCQkgICAgICAgKQorI2VuZGlmCisJCWlmIChwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT4KKwkJICAgIHBic3NEZXNjcmlwdGlvbikgeworCQkJY2RmX21lbV9mcmVlKHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPgorCQkJCSAgICAgcGJzc0Rlc2NyaXB0aW9uKTsKKwkJCXBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPgorCQkJcGJzc0Rlc2NyaXB0aW9uID0gTlVMTDsKKwkJfQorCQljZGZfbWVtX2ZyZWUocHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSk7CisJCXBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgPSBOVUxMOworCX0KKworCWlmIChwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wQWRkQnNzUmVxKSB7CisJCWNkZl9tZW1fZnJlZShwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wQWRkQnNzUmVxKTsKKwkJcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEFkZEJzc1JlcSA9IE5VTEw7CisJfQorCisJaWYgKHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBBZGRTdGFSZXEpIHsKKwkJY2RmX21lbV9mcmVlKHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBBZGRTdGFSZXEpOworCQlwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wQWRkU3RhUmVxID0gTlVMTDsKKwl9CisKKwkvKiBUaGUgc2Vzc2lvbiBpcyBiZWluZyBkZWxldGVkLCBjbGVhbnVwIHRoZSBjb250ZW50cyAqLworCWNkZl9tZW1fc2V0KCZwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dCwgc2l6ZW9mKHRmdFBFQ29udGV4dCksIDApOworCisJLyogRGVsZXRlIHRoZSBzZXNzaW9uIGNyZWF0ZWQgd2hpbGUgaGFuZGxpbmcgcHJlLWF1dGggcmVzcG9uc2UgKi8KKwlpZiAocFJlQXNzb2NTZXNzaW9uRW50cnkpIHsKKwkJLyogSWYgd2UgaGF2ZSBzdWNjZXNzZnVsIHByZS1hdXRoIHJlc3BvbnNlLCB0aGVuIHdlIHdvdWxkIGhhdmUKKwkJICogY3JlYXRlZCBhIHNlc3Npb24gb24gd2hpY2ggcmVhc3NvYyByZXF1ZXN0IHdpbGwgYmUgc2VudAorCQkgKi8KKwkJaWYgKHBSZUFzc29jU2Vzc2lvbkVudHJ5LT52YWxpZCAmJgorCQkgICAgcFJlQXNzb2NTZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09CisJCSAgICBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkgIEZMKCJEZWxldGluZyBQcmVhdXRoIHNlc3Npb24oJWQpIiksCisJCQkJICBwUmVBc3NvY1Nlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworCQkJcGVfZGVsZXRlX3Nlc3Npb24ocE1hYywgcFJlQXNzb2NTZXNzaW9uRW50cnkpOworCQl9CisJfQorfQorCit2b2lkIGxpbV9mdF9jbGVhbnVwX2FsbF9mdF9zZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCS8qIFdyYXBwZXIgZnVuY3Rpb24gdG8gY2xlYW51cCBhbGwgRlQgc2Vzc2lvbnMgKi8KKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQlpZiAodHJ1ZSA9PSBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkKSB7CisJCQkvKiBUaGUgc2Vzc2lvbiBpcyB2YWxpZCwgbWF5IGhhdmUgRlQgZGF0YSAqLworCQkJbGltX2Z0X2NsZWFudXAocE1hYywgJnBNYWMtPmxpbS5ncFNlc3Npb25baV0pOworCQl9CisJfQorfQorCit2b2lkIGxpbV9mdF9jbGVhbnVwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoInBzZXNzaW9uRW50cnkgaXMgTlVMTCIpKTspCisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworCS8qIE5vdGhpbmcgdG8gYmUgZG9uZSBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgaW4gU1RBIG1vZGUgKi8KKwlpZiAoIUxJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoInBzZXNzaW9uRW50cnkgaXMgbm90IGluIFNUQSBtb2RlIikpOworCQkgICAgICAgKQorI2VuZGlmCisJCXJldHVybjsKKwl9CisKKwlpZiAoTlVMTCAhPSBwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiRnJlZWluZyBwRlRQcmVBdXRoUmVxPSAlcCIpLAorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEpOworCQkgICAgICAgKQorI2VuZGlmCisJCWlmIChOVUxMICE9CisJCSAgICBwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT4KKwkJICAgIHBic3NEZXNjcmlwdGlvbikgeworCQkJY2RmX21lbV9mcmVlKHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPgorCQkJCSAgICAgcGJzc0Rlc2NyaXB0aW9uKTsKKwkJCXBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPgorCQkJcGJzc0Rlc2NyaXB0aW9uID0gTlVMTDsKKwkJfQorCQljZGZfbWVtX2ZyZWUocHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSk7CisJCXBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgPSBOVUxMOworCX0KKworCWlmIChwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wQWRkQnNzUmVxKSB7CisJCWNkZl9tZW1fZnJlZShwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wQWRkQnNzUmVxKTsKKwkJcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEFkZEJzc1JlcSA9IE5VTEw7CisJfQorCisJaWYgKHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBBZGRTdGFSZXEpIHsKKwkJY2RmX21lbV9mcmVlKHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBBZGRTdGFSZXEpOworCQlwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wQWRkU3RhUmVxID0gTlVMTDsKKwl9CisKKwkvKiBUaGUgc2Vzc2lvbiBpcyBiZWluZyBkZWxldGVkLCBjbGVhbnVwIHRoZSBjb250ZW50cyAqLworCWNkZl9tZW1fc2V0KCZwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dCwgc2l6ZW9mKHRmdFBFQ29udGV4dCksIDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgaXMgdGhlIGhhbmRsZXIgYWZ0ZXIgc3VzcGVuZGluZyB0aGUgbGluay4KKyAqIFdlIHN1c3BlbmQgdGhlIGxpbmsgYW5kIHRoZW4gbm93IHByb2NlZWQgdG8gc3dpdGNoIGNoYW5uZWwuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzdGF0aWMKK2xpbV9mdF9wcmVfYXV0aF9zdXNwZW5kX2xpbmtfaGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjLCBDREZfU1RBVFVTIHN0YXR1cywKKwkJCQkgICAgIHVpbnQzMl90ICpkYXRhKQoreworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSAodHBQRVNlc3Npb24pIGRhdGE7CisKKwkvKiBUaGUgbGluayBpcyBzdXNwZW5kZWQgb2Ygbm90ICovCisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSB8fAorCSAgICBOVUxMID09IHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgfHwKKwkgICAgc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJwcmVBdXRoIGVycm9yLCBzdGF0dXMgPSAlZCIpLCBzdGF0dXMpOworCQkgICAgICAgKQorCQlsaW1fcG9zdF9mdF9wcmVfYXV0aF9yc3AocE1hYywgZVNJUl9GQUlMVVJFLCBOVUxMLCAwLAorCQkJCQkgcHNlc3Npb25FbnRyeSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBTdXNwZW5kZWQsIG5vdyBtb3ZlIHRvIGEgZGlmZmVyZW50IGNoYW5uZWwuCisJICogUGVyZm9ybSBzb21lIHNhbml0eSBjaGVjayBiZWZvcmUgcHJvY2VlZGluZworCSAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxKSB7CisJCWxpbV9jaGFuZ2VfY2hhbm5lbF93aXRoX2NhbGxiYWNrKHBNYWMsCisJCQkJCQkgcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQuCisJCQkJCQkgcEZUUHJlQXV0aFJlcS0+cHJlQXV0aGNoYW5uZWxOdW0sCisJCQkJCQkgbGltX3BlcmZvcm1fZnRfcHJlX2F1dGgsIE5VTEwsCisJCQkJCQkgcHNlc3Npb25FbnRyeSk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qCisgKiBsaW1fcHJvY2Vzc19mdF9wcmVfYXV0aF9yZXEoKSAtIHByb2Nlc3MgZnQgcHJlIGF1dGggcmVxCisgKgorICogQG1hY19jdHg6ICAgIGdsb2JhbCBtYWMgY3R4CisgKiBAbXNnOiAgICAgICAgcG9pbnRlciB0byBtZXNzYWdlCisgKgorICogSW4gdGhpcyBmdW5jdGlvbiwgd2UgcHJvY2VzcyB0aGUgRlQgUHJlIEF1dGggUmVxOgorICogICBXZSByZWNlaXZlIFByZS1BdXRoLCBzdXNwZW5kIGxpbmssIHJlZ2lzdGVyIGEgY2FsbCBiYWNrLiBJbiB0aGUgY2FsbCBiYWNrLAorICogICB3ZSB3aWxsIG5lZWQgdG8gYWNjZXB0IGZyYW1lcyBmcm9tIHRoZSBuZXcgYnNzaWQuIFNlbmQgb3V0IHRoZSBhdXRoIHJlcSB0bworICogICBuZXcgQVAuIFN0YXJ0IHRpbWVyIGFuZCB3aGVuIHRoZSB0aW1lciBpcyBkb25lIG9yIGlmIHdlIHJlY2VpdmUgdGhlIEF1dGgKKyAqICAgcmVzcG9uc2UuIFdlIGNoYW5nZSBjaGFubmVsLiBSZXN1bWUgbGluaworICoKKyAqIFJldHVybjogdmFsdWUgdG8gaW5kaWNhdGUgaWYgYnVmZmVyIHdhcyBjb25zdW1lZAorICovCitpbnQgbGltX3Byb2Nlc3NfZnRfcHJlX2F1dGhfcmVxKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwU2lyTXNnUSBtc2cpCit7CisJaW50IGJ1Zl9jb25zdW1lZCA9IGZhbHNlOworCXRwUEVTZXNzaW9uIHNlc3Npb247CisJdWludDhfdCBzZXNzaW9uX2lkOworCXRwU2lyRlRQcmVBdXRoUmVxIGZ0X3ByZV9hdXRoX3JlcSA9ICh0U2lyRlRQcmVBdXRoUmVxICopIG1zZy0+Ym9keXB0cjsKKworCWlmIChOVUxMID09IGZ0X3ByZV9hdXRoX3JlcSkgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJUEVMT0dFKGxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoInRTaXJGVFByZUF1dGhSZXEgaXMgTlVMTCIpKTspCisjZW5kaWYKKwkJcmV0dXJuIGJ1Zl9jb25zdW1lZDsKKwl9CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiBlbnRyeSAqLworCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQobWFjX2N0eCwKKwkJCQkJICAgZnRfcHJlX2F1dGhfcmVxLT5jdXJyYnNzSWQsCisJCQkJCSAgICZzZXNzaW9uX2lkKTsKKwlpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJVbmFibGUgdG8gZmluZCBzZXNzaW9uIGZvciB0aGUgYnNzaWQiCisJCQkgICBNQUNfQUREUkVTU19TVFIpLAorCQkJICAgTUFDX0FERFJfQVJSQVkoZnRfcHJlX2F1dGhfcmVxLT5jdXJyYnNzSWQpKTsKKwkJLyogUG9zdCB0aGUgRlQgUHJlIEF1dGggUmVzcG9uc2UgdG8gU01FICovCisJCWxpbV9wb3N0X2Z0X3ByZV9hdXRoX3JzcChtYWNfY3R4LCBlU0lSX0ZBSUxVUkUsIE5VTEwsIDAsCisJCQkJCSBzZXNzaW9uKTsKKwkJLyoKKwkJICogcmV0dXJuIEZBTFNFLCBzaW5jZSB0aGUgUHJlLUF1dGggUmVxIHdpbGwgYmUgZnJlZWQgaW4KKwkJICogbGltUG9zdEZUUHJlQXV0aFJzcCBvbiBmYWlsdXJlCisJCSAqLworCQlyZXR1cm4gYnVmX2NvbnN1bWVkOworCX0KKworCS8qIE5vdGhpbmcgdG8gYmUgZG9uZSBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgaW4gU1RBIG1vZGUgKi8KKwlpZiAoIUxJTV9JU19TVEFfUk9MRShzZXNzaW9uKSkgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgic2Vzc2lvbiBpcyBub3QgaW4gU1RBIG1vZGUiKSk7CisjZW5kaWYKKwkJYnVmX2NvbnN1bWVkID0gdHJ1ZTsKKwkJcmV0dXJuIGJ1Zl9jb25zdW1lZDsKKwl9CisKKwkvKiBDYW4gc2V0IGl0IG9ubHkgYWZ0ZXIgc2VuZGluZyBhdXRoICovCisJc2Vzc2lvbi0+ZnRQRUNvbnRleHQuZnRQcmVBdXRoU3RhdHVzID0gZVNJUl9GQUlMVVJFOworCXNlc3Npb24tPmZ0UEVDb250ZXh0LmZ0UHJlQXV0aFNlc3Npb24gPSB0cnVlOworCisJLyogSW5kaWNhdGUgdGhhdCB0aGlzIGlzIHRoZSBzZXNzaW9uIG9uIHdoaWNoIHByZWF1dGggaXMgYmVpbmcgZG9uZSAqLworCWlmIChzZXNzaW9uLT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxKSB7CisJCWlmIChzZXNzaW9uLT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5wYnNzRGVzY3JpcHRpb24pIHsKKwkJCWNkZl9tZW1fZnJlZSgKKwkJCSAgc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+cGJzc0Rlc2NyaXB0aW9uKTsKKwkJCXNlc3Npb24tPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnBic3NEZXNjcmlwdGlvbiA9CisJCQkJCQkJCQlOVUxMOworCQl9CisJCWNkZl9tZW1fZnJlZShzZXNzaW9uLT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxKTsKKwkJc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSA9IE5VTEw7CisJfQorCisJLyogV2UgbmVlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBQcmUtQXV0aCBSZXEuIExldHMgc2F2ZSB0aGF0ICovCisJc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSA9IGZ0X3ByZV9hdXRoX3JlcTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJQUkUgQXV0aCBmdF9pZXNfbGVuZ3RoPSUwMnglMDJ4JTAyeCIpLAorCQlzZXNzaW9uLT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5mdF9pZXNbMF0sCisJCXNlc3Npb24tPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPmZ0X2llc1sxXSwKKwkJc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+ZnRfaWVzWzJdKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNICAgIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwlsaW1fZGlhZ19ldmVudF9yZXBvcnQobWFjX2N0eCwgV0xBTl9QRV9ESUFHX1BSRV9BVVRIX1JFUV9FVkVOVCwKKwkJCSAgICAgIHNlc3Npb24sIDAsIDApOworI2VuZGlmCisKKwkvKiBEb250IG5lZWQgdG8gc3VzcGVuZCBpZiBBUHMgYXJlIGluIHNhbWUgY2hhbm5lbCAqLworCWlmIChzZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwgIT0KKwkgICAgc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+cHJlQXV0aGNoYW5uZWxOdW0pIHsKKwkJLyogTmVlZCB0byBzdXNwZW5kIGxpbmsgb25seSBpZiB0aGUgY2hhbm5lbHMgYXJlIGRpZmZlcmVudCAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPRzIsCisJCQlGTCgiUGVyZm9ybWluZyBwcmUtYXV0aCBvbiBkaWZmIGNoYW5uZWwoc2Vzc2lvbiAlcCkiKSwKKwkJCXNlc3Npb24pOworCWxpbV9mdF9wcmVfYXV0aF9zdXNwZW5kX2xpbmtfaGFuZGxlcihtYWNfY3R4LCBDREZfU1RBVFVTX1NVQ0NFU1MsCisJCQkodWludDMyX3QgKilzZXNzaW9uKTsKKwl9IGVsc2UgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzIsCisJCQlGTCgiUGVyZm9ybWluZyBwcmUtYXV0aCBvbiBzYW1lIGNoYW5uZWwgKHNlc3Npb24gJXApIiksCisJCQlzZXNzaW9uKTsKKwkJLyogV2UgYXJlIGluIHRoZSBzYW1lIGNoYW5uZWwuIFBlcmZvcm0gcHJlLWF1dGggKi8KKwkJbGltX3BlcmZvcm1fZnRfcHJlX2F1dGgobWFjX2N0eCwgQ0RGX1NUQVRVU19TVUNDRVNTLCBOVUxMLAorCQkJCQlzZXNzaW9uKTsKKwl9CisKKwlyZXR1cm4gYnVmX2NvbnN1bWVkOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VuZCB0aGUgQXV0aDEKKyAqIFJlY2VpdmUgYmFjayBBdXRoMgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1fcGVyZm9ybV9mdF9wcmVfYXV0aCh0cEFuaVNpckdsb2JhbCBwTWFjLCBDREZfU1RBVFVTIHN0YXR1cywKKwkJCSAgICAgdWludDMyX3QgKmRhdGEsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpck1hY0F1dGhGcmFtZUJvZHkgYXV0aEZyYW1lOworCisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgicHNlc3Npb25FbnRyeSBpcyBOVUxMIikpOykKKwkJcmV0dXJuOworCX0KKworCWlmIChwc2Vzc2lvbkVudHJ5LT5pczExUmNvbm5lY3Rpb24gJiYKKwkgICAgcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSkgeworCQkvKiBPbmx5IDExciBhc3NvYyBoYXMgRlQgSUVzICovCisJCWlmIChwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5mdF9pZXMgPT0gTlVMTCkgeworCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkgICAgICAgIiVzOiBGVElFcyBmb3IgQXV0aCBSZXEgU2VxIDEgaXMgYWJzZW50IiwKKwkJCQkgICAgICAgX19mdW5jX18pOworCQkJICAgICAgICkKKwkJCWdvdG8gcHJlYXV0aF9mYWlsOworCQl9CisJfQorCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSAgICAgICAiJXM6IENoYW5nZSBjaGFubmVsIG5vdCBzdWNjZXNzZnVsIGZvciBGVCBwcmUtYXV0aCIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkgICAgICAgKQorCQlnb3RvIHByZWF1dGhfZmFpbDsKKwl9CisKKwkvKiBOb3RoaW5nIHRvIGJlIGRvbmUgaWYgdGhlIHNlc3Npb24gaXMgbm90IGluIFNUQSBtb2RlICovCisJaWYgKCFMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJwc2Vzc2lvbkVudHJ5IGlzIG5vdCBpbiBTVEEgbW9kZSIpKTsKKwkJICAgICAgICkKKyNlbmRpZgorCQlyZXR1cm47CisJfQorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwlQRUxPRzIobGltX2xvZyhwTWFjLCBMT0cyLCAiRW50ZXJlZCB3YWl0IGF1dGgyIHN0YXRlIGZvciBGVCIKKwkJICAgICAgICIgKG9sZCBzZXNzaW9uICVwKSIsIHBzZXNzaW9uRW50cnkpOworCSAgICAgICApCisjZW5kaWYKKwlpZiAocHNlc3Npb25FbnRyeS0+aXMxMVJjb25uZWN0aW9uKSB7CisJCS8qIE5vdyB3ZSBhcmUgb24gdGhlIHJpZ2h0IGNoYW5uZWwgYW5kIG5lZWQgdG8gc2VuZCBvdXQgQXV0aDEgYW5kCisJCSAqIHJlY2VpdmUgQXV0aDIKKwkJICovCisJCWF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfRlRfQVVUSDsKKwl9CisjaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fRVNFIHx8IGRlZmluZWQgRkVBVFVSRV9XTEFOX0xGUgorCWVsc2UgeworCQkvKiBXaWxsIG5lZWQgdG8gbWFrZSBpc0VTRWNvbm5lY3Rpb24gYSBlbnVtIG1heSBiZSBmb3IgZnVydGhlcgorCQkgKiBpbXByb3ZlbWVudHMgdG8gdGhpcyB0byBtYXRjaCB0aGlzIGFsZ29yaXRobSBudW1iZXIKKwkJICovCisJCWF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfT1BFTl9TWVNURU07CisJfQorI2VuZGlmCisJYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9IFNJUl9NQUNfQVVUSF9GUkFNRV8xOworCWF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9IDA7CisKKwkvKiBTdGFydCB0aW1lciBoZXJlIHRvIGNvbWUgYmFjayB0byBvcGVyYXRpbmcgY2hhbm5lbCAqLworCXBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUZUUHJlQXV0aFJzcFRpbWVyLnNlc3Npb25JZCA9CisJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCWlmIChUWF9TVUNDRVNTICE9CisJICAgIHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1GVFByZUF1dGhSc3BUaW1lcikpIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJGVCBBdXRoIFJzcCBUaW1lciBTdGFydCBGYWlsZWQiKSk7KQorI2VuZGlmCisJfQorCU1UUkFDRShtYWNfdHJhY2UKKwkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJICAgICAgIGVMSU1fRlRfUFJFQVVUSF9SU1BfVElNRVIpKTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiRlQgQXV0aCBSc3AgVGltZXIgU3RhcnRlZCIpKTspCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19ST0FNX0FVVEhfU1RBUlRfRVZFTlQsCisJCQlwTWFjLT5saW0ucFNlc3Npb25FbnRyeSwgZVNJUl9TVUNDRVNTLCBlU0lSX1NVQ0NFU1MpOworI2VuZGlmCisKKwlsaW1fc2VuZF9hdXRoX21nbXRfZnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKwkJCQkgcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+CisJCQkJIHByZUF1dGhic3NJZCwgTElNX05PX1dFUF9JTl9GQywgcHNlc3Npb25FbnRyeSk7CisKKwlyZXR1cm47CisKK3ByZWF1dGhfZmFpbDoKKwlsaW1faGFuZGxlX2Z0X3ByZV9hdXRoX3JzcChwTWFjLCBlU0lSX0ZBSUxVUkUsIE5VTEwsIDAsIHBzZXNzaW9uRW50cnkpOworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDcmVhdGUgdGhlIG5ldyBBZGQgQnNzIFJlcSB0byB0aGUgbmV3IEFQLgorICogVGhpcyB3aWxsIGJlIHVzZWQgd2hlbiB3ZSBhcmUgcmVhZHkgdG8gRlQgdG8gdGhlIG5ldyBBUC4KKyAqIFRoZSBuZXdseSBjcmVhdGVkIGZ0IFNlc3Npb24gZW50cnkgaXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U2lyUmV0U3RhdHVzIGxpbV9mdF9wcmVwYXJlX2FkZF9ic3NfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSB1aW50OF90IHVwZGF0ZUVudHJ5LAorCQkJCQkgdHBQRVNlc3Npb24gcGZ0U2Vzc2lvbkVudHJ5LAorCQkJCQkgdHBTaXJCc3NEZXNjcmlwdGlvbiBic3NEZXNjcmlwdGlvbikKK3sKKwl0cEFkZEJzc1BhcmFtcyBwQWRkQnNzUGFyYW1zID0gTlVMTDsKKwl0QWRkU3RhUGFyYW1zICpzdGFfY3R4OworCXVpbnQ4X3QgY2hhbldpZHRoU3VwcCA9IDA7CisJdFNjaEJlYWNvblN0cnVjdCAqcEJlYWNvblN0cnVjdDsKKworCS8qIE5vdGhpbmcgdG8gYmUgZG9uZSBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgaW4gU1RBIG1vZGUgKi8KKwlpZiAoIUxJTV9JU19TVEFfUk9MRShwZnRTZXNzaW9uRW50cnkpKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgicHNlc3Npb25FbnRyeSBpcyBub3QgaW4gU1RBIG1vZGUiKSk7CisJCSAgICAgICApCisjZW5kaWYKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlwQmVhY29uU3RydWN0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTY2hCZWFjb25TdHJ1Y3QpKTsKKwlpZiAoTlVMTCA9PSBwQmVhY29uU3RydWN0KSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjcmVhdGluZyBBRERfQlNTIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKwkvKiBQYWNrYWdlIFNJUl9IQUxfQUREX0JTU19SRVEgbWVzc2FnZSBwYXJhbWV0ZXJzICovCisJcEFkZEJzc1BhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0QWRkQnNzUGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gcEFkZEJzc1BhcmFtcykgeworCQljZGZfbWVtX2ZyZWUocEJlYWNvblN0cnVjdCk7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjcmVhdGluZyBBRERfQlNTIikpOworCQlyZXR1cm4gKGVTSVJfTUVNX0FMTE9DX0ZBSUxFRCk7CisJfQorCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcEFkZEJzc1BhcmFtcywgc2l6ZW9mKHRBZGRCc3NQYXJhbXMpLCAwKTsKKworCWxpbV9leHRyYWN0X2FwX2NhcGFiaWxpdGllcyhwTWFjLCAodWludDhfdCAqKSBic3NEZXNjcmlwdGlvbi0+aWVGaWVsZHMsCisJCQlsaW1fZ2V0X2llbGVuX2Zyb21fYnNzX2Rlc2NyaXB0aW9uKGJzc0Rlc2NyaXB0aW9uKSwKKwkJCXBCZWFjb25TdHJ1Y3QpOworCisJaWYgKHBNYWMtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0KKwkgICAgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorCQlsaW1fZGVjaWRlX3N0YV9wcm90ZWN0aW9uX29uX2Fzc29jKHBNYWMsIHBCZWFjb25TdHJ1Y3QsCisJCQkJCQkgICBwZnRTZXNzaW9uRW50cnkpOworCisJY2RmX21lbV9jb3B5KHBBZGRCc3NQYXJhbXMtPmJzc0lkLCBic3NEZXNjcmlwdGlvbi0+YnNzSWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkvKiBGaWxsIGluIHRBZGRCc3NQYXJhbXMgc2VsZk1hY0FkZHIgKi8KKwljZGZfbWVtX2NvcHkocEFkZEJzc1BhcmFtcy0+c2VsZk1hY0FkZHIsIHBmdFNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlwQWRkQnNzUGFyYW1zLT5ic3NUeXBlID0gcGZ0U2Vzc2lvbkVudHJ5LT5ic3NUeXBlOworCXBBZGRCc3NQYXJhbXMtPm9wZXJNb2RlID0gQlNTX09QRVJBVElPTkFMX01PREVfU1RBOworCisJcEFkZEJzc1BhcmFtcy0+YmVhY29uSW50ZXJ2YWwgPSBic3NEZXNjcmlwdGlvbi0+YmVhY29uSW50ZXJ2YWw7CisKKwlwQWRkQnNzUGFyYW1zLT5kdGltUGVyaW9kID0gcEJlYWNvblN0cnVjdC0+dGltLmR0aW1QZXJpb2Q7CisJcEFkZEJzc1BhcmFtcy0+dXBkYXRlQnNzID0gdXBkYXRlRW50cnk7CisKKwlwQWRkQnNzUGFyYW1zLT5yZWFzc29jUmVxID0gdHJ1ZTsKKworCXBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwQ291bnQgPSBwQmVhY29uU3RydWN0LT5jZlBhcmFtU2V0LmNmcENvdW50OworCXBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwUGVyaW9kID0KKwkJcEJlYWNvblN0cnVjdC0+Y2ZQYXJhbVNldC5jZnBQZXJpb2Q7CisJcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBNYXhEdXJhdGlvbiA9CisJCXBCZWFjb25TdHJ1Y3QtPmNmUGFyYW1TZXQuY2ZwTWF4RHVyYXRpb247CisJcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBEdXJSZW1haW5pbmcgPQorCQlwQmVhY29uU3RydWN0LT5jZlBhcmFtU2V0LmNmcER1clJlbWFpbmluZzsKKworCXBBZGRCc3NQYXJhbXMtPnJhdGVTZXQubnVtUmF0ZXMgPQorCQlwQmVhY29uU3RydWN0LT5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlczsKKwljZGZfbWVtX2NvcHkocEFkZEJzc1BhcmFtcy0+cmF0ZVNldC5yYXRlLAorCQkgICAgIHBCZWFjb25TdHJ1Y3QtPnN1cHBvcnRlZFJhdGVzLnJhdGUsCisJCSAgICAgcEJlYWNvblN0cnVjdC0+c3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXMpOworCisJcEFkZEJzc1BhcmFtcy0+bndUeXBlID0gYnNzRGVzY3JpcHRpb24tPm53VHlwZTsKKworCXBBZGRCc3NQYXJhbXMtPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQgPQorCQkodWludDhfdCkgcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8uc2hvcnRTbG90VGltZTsKKwlwQWRkQnNzUGFyYW1zLT5sbGFDb2V4aXN0ID0KKwkJKHVpbnQ4X3QpIHBmdFNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3Q7CisJcEFkZEJzc1BhcmFtcy0+bGxiQ29leGlzdCA9CisJCSh1aW50OF90KSBwZnRTZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0OworCXBBZGRCc3NQYXJhbXMtPmxsZ0NvZXhpc3QgPQorCQkodWludDhfdCkgcGZ0U2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxnQ29leGlzdDsKKwlwQWRkQnNzUGFyYW1zLT5odDIwQ29leGlzdCA9CisJCSh1aW50OF90KSBwZnRTZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJcEFkZEJzc1BhcmFtcy0+cm1mRW5hYmxlZCA9IHBmdFNlc3Npb25FbnRyeS0+bGltUm1mRW5hYmxlZDsKKyNlbmRpZgorCisJLyogVXNlIHRoZSBhZHZlcnRpc2VkIGNhcGFiaWxpdGllcyBmcm9tIHRoZSByZWNlaXZlZCBiZWFjb24vUFIgKi8KKwlpZiAoSVNfRE9UMTFfTU9ERV9IVChwZnRTZXNzaW9uRW50cnktPmRvdDExbW9kZSkgJiYKKwkgICAgKHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5wcmVzZW50KSkgeworCQlwQWRkQnNzUGFyYW1zLT5odENhcGFibGUgPSBwQmVhY29uU3RydWN0LT5IVENhcHMucHJlc2VudDsKKwkJY2RmX21lbV9jb3B5KCZwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmNhcGFiX2luZm8sCisJCQkgICAgICZwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mbywKKwkJCSAgICAgc2l6ZW9mKHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuY2FwYWJfaW5mbykpOworCQljZGZfbWVtX2NvcHkoJnBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuaHRfY2FwcywKKwkJCSAgICAgKHVpbnQ4X3QgKikgJnBCZWFjb25TdHJ1Y3QtPkhUQ2FwcyArCisJCQkgICAgIHNpemVvZih1aW50OF90KSwKKwkJCSAgICAgc2l6ZW9mKHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuaHRfY2FwcykpOworCisJCWlmIChwQmVhY29uU3RydWN0LT5IVEluZm8ucHJlc2VudCkgeworCQkJcEFkZEJzc1BhcmFtcy0+aHRPcGVyTW9kZSA9CisJCQkJKHRTaXJNYWNIVE9wZXJhdGluZ01vZGUpIHBCZWFjb25TdHJ1Y3QtPkhUSW5mby4KKwkJCQlvcE1vZGU7CisJCQlwQWRkQnNzUGFyYW1zLT5kdWFsQ1RTUHJvdGVjdGlvbiA9CisJCQkJKHVpbnQ4X3QpIHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5kdWFsQ1RTUHJvdGVjdGlvbjsKKworCQkJY2hhbldpZHRoU3VwcCA9IGxpbV9nZXRfaHRfY2FwYWJpbGl0eShwTWFjLAorCQkJCQkJCSAgICAgIGVIVF9TVVBQT1JURURfQ0hBTk5FTF9XSURUSF9TRVQsCisJCQkJCQkJICAgICAgcGZ0U2Vzc2lvbkVudHJ5KTsKKwkJCWlmICgocEJlYWNvblN0cnVjdC0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgJiYKKwkJCSAgICAoY2hhbldpZHRoU3VwcCkpIHsKKwkJCQlwQWRkQnNzUGFyYW1zLT5jaF93aWR0aCA9ICh1aW50OF90KQorCQkJCQlwQmVhY29uU3RydWN0LT5IVEluZm8ucmVjb21tZW5kZWRUeFdpZHRoU2V0OworCQkJCWlmIChwQmVhY29uU3RydWN0LT5IVEluZm8uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9PQorCQkJCQkJUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZKQorCQkJCQlwQWRkQnNzUGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQkJCWJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQgKyAyOworCQkJCWVsc2UgaWYgKHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID09CisJCQkJCQlQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZKQorCQkJCQlwQWRkQnNzUGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQkJCWJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQgLSAyOworCQkJfSBlbHNlIHsKKwkJCQlwQWRkQnNzUGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzIwTUhaOworCQkJCXBBZGRCc3NQYXJhbXMtPmNoX2NlbnRlcl9mcmVxX3NlZzAgPSAwOworCQkJfQorCQkJcEFkZEJzc1BhcmFtcy0+bGxuTm9uR0ZDb2V4aXN0ID0KKwkJCQkodWludDhfdCkgcEJlYWNvblN0cnVjdC0+SFRJbmZvLm5vbkdGRGV2aWNlc1ByZXNlbnQ7CisJCQlwQWRkQnNzUGFyYW1zLT5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPQorCQkJCSh1aW50OF90KSBwQmVhY29uU3RydWN0LT5IVEluZm8uCisJCQkJbHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisJCQlwQWRkQnNzUGFyYW1zLT5mUklGU01vZGUgPQorCQkJCXBCZWFjb25TdHJ1Y3QtPkhUSW5mby5yaWZzTW9kZTsKKwkJfQorCX0KKworCXBBZGRCc3NQYXJhbXMtPmN1cnJlbnRPcGVyQ2hhbm5lbCA9IGJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQ7CisJcGZ0U2Vzc2lvbkVudHJ5LT5odFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPQorCQlwQmVhY29uU3RydWN0LT5IVEluZm8uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwlzdGFfY3R4ID0gJnBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQ7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmIChwZnRTZXNzaW9uRW50cnktPnZodENhcGFiaWxpdHkgJiYKKwkgICAgcGZ0U2Vzc2lvbkVudHJ5LT52aHRDYXBhYmlsaXR5UHJlc2VudEluQmVhY29uKSB7CisJCXBBZGRCc3NQYXJhbXMtPnZodENhcGFibGUgPSBwQmVhY29uU3RydWN0LT5WSFRDYXBzLnByZXNlbnQ7CisJCWlmIChwQmVhY29uU3RydWN0LT5WSFRPcGVyYXRpb24uY2hhbldpZHRoICYmIGNoYW5XaWR0aFN1cHApIHsKKwkJCXBBZGRCc3NQYXJhbXMtPmNoX3dpZHRoID0KKwkJCQlwQmVhY29uU3RydWN0LT5WSFRPcGVyYXRpb24uY2hhbldpZHRoICsgMTsKKwkJCXBBZGRCc3NQYXJhbXMtPmNoX2NlbnRlcl9mcmVxX3NlZzAgPQorCQkJCXBCZWFjb25TdHJ1Y3QtPlZIVE9wZXJhdGlvbi5jaGFuQ2VudGVyRnJlcVNlZzE7CisJCQlwQWRkQnNzUGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcxID0KKwkJCQlwQmVhY29uU3RydWN0LT5WSFRPcGVyYXRpb24uY2hhbkNlbnRlckZyZXFTZWcyOworCQl9CisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudmh0X2NhcHMgPQorCQkJKChwQmVhY29uU3RydWN0LT5WSFRDYXBzLm1heE1QRFVMZW4gPDwKKwkJCSAgU0lSX01BQ19WSFRfQ0FQX01BWF9NUERVX0xFTikgfAorCQkJIChwQmVhY29uU3RydWN0LT5WSFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA8PAorCQkJICBTSVJfTUFDX1ZIVF9DQVBfU1VQUF9DSF9XSURUSF9TRVQpIHwKKwkJCSAocEJlYWNvblN0cnVjdC0+VkhUQ2Fwcy5sZHBjQ29kaW5nQ2FwIDw8CisJCQkgIFNJUl9NQUNfVkhUX0NBUF9MRFBDX0NPRElOR19DQVApIHwKKwkJCSAocEJlYWNvblN0cnVjdC0+VkhUQ2Fwcy5zaG9ydEdJODBNSHogPDwKKwkJCSAgU0lSX01BQ19WSFRfQ0FQX1NIT1JUR0lfODBNSFopIHwKKwkJCSAocEJlYWNvblN0cnVjdC0+VkhUQ2Fwcy5zaG9ydEdJMTYwYW5kODBwbHVzODBNSHogPDwKKwkJCSAgU0lSX01BQ19WSFRfQ0FQX1NIT1JUR0lfMTYwXzgwXzgwTUhaKSB8CisJCQkgKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMudHhTVEJDIDw8CisJCQkgIFNJUl9NQUNfVkhUX0NBUF9UWFNUQkMpIHwKKwkJCSAocEJlYWNvblN0cnVjdC0+VkhUQ2Fwcy5yeFNUQkMgPDwKKwkJCSAgU0lSX01BQ19WSFRfQ0FQX1JYU1RCQykgfAorCQkJIChwQmVhY29uU3RydWN0LT5WSFRDYXBzLnN1QmVhbUZvcm1lckNhcCA8PAorCQkJICBTSVJfTUFDX1ZIVF9DQVBfU1VfQkVBTUZPUk1FUl9DQVApIHwKKwkJCSAocEJlYWNvblN0cnVjdC0+VkhUQ2Fwcy5zdUJlYW1mb3JtZWVDYXAgPDwKKwkJCSAgU0lSX01BQ19WSFRfQ0FQX1NVX0JFQU1GT1JNRUVfQ0FQKSB8CisJCQkgKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMuY3Nub2ZCZWFtZm9ybWVyQW50U3VwIDw8CisJCQkgIFNJUl9NQUNfVkhUX0NBUF9DU05fQkVBTU9STUVSX0FOVF9TVVApIHwKKwkJCSAocEJlYWNvblN0cnVjdC0+VkhUQ2Fwcy5udW1Tb3VuZGluZ0RpbSA8PAorCQkJICBTSVJfTUFDX1ZIVF9DQVBfTlVNX1NPVU5ESU5HX0RJTSkgfAorCQkJIChwQmVhY29uU3RydWN0LT5WSFRDYXBzLm11QmVhbWZvcm1lckNhcCA8PAorCQkJICBTSVJfTUFDX1ZIVF9DQVBfTlVNX0JFQU1fRk9STUVSX0NBUCkgfAorCQkJIChwQmVhY29uU3RydWN0LT5WSFRDYXBzLm11QmVhbWZvcm1lZUNhcCA8PAorCQkJICBTSVJfTUFDX1ZIVF9DQVBfTlVNX0JFQU1fRk9STUVFX0NBUCkgfAorCQkJIChwQmVhY29uU3RydWN0LT5WSFRDYXBzLnZodFRYT1BQUyA8PAorCQkJICBTSVJfTUFDX1ZIVF9DQVBfVFhPUFBTKSB8CisJCQkgKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMuaHRjVkhUQ2FwIDw8CisJCQkgIFNJUl9NQUNfVkhUX0NBUF9IVENfQ0FQKSB8CisJCQkgKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMubWF4QU1QRFVMZW5FeHAgPDwKKwkJCSAgU0lSX01BQ19WSFRfQ0FQX01BWF9BTURVX0xFTl9FWFBPKSB8CisJCQkgKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMudmh0TGlua0FkYXB0Q2FwIDw8CisJCQkgIFNJUl9NQUNfVkhUX0NBUF9MSU5LX0FEQVBUX0NBUCkgfAorCQkJIChwQmVhY29uU3RydWN0LT5WSFRDYXBzLnJ4QW50UGF0dGVybiA8PAorCQkJICBTSVJfTUFDX1ZIVF9DQVBfUlhfQU5URU5OQV9QQVRURVJOKSB8CisJCQkgKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMudHhBbnRQYXR0ZXJuIDw8CisJCQkgIFNJUl9NQUNfVkhUX0NBUF9UWF9BTlRFTk5BX1BBVFRFUk4pIHwKKwkJCSAocEJlYWNvblN0cnVjdC0+VkhUQ2Fwcy5yZXNlcnZlZDEgPDwKKwkJCSAgU0lSX01BQ19WSFRfQ0FQX1JFU0VSVkVEMikpOworCX0gZWxzZSB7CisJCXBBZGRCc3NQYXJhbXMtPnZodENhcGFibGUgPSAwOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlNJUl9IQUxfQUREX0JTU19SRVEgd2l0aCBjaGFubmVsID0gJWQuLi4iKSwKKwkJcEFkZEJzc1BhcmFtcy0+Y3VycmVudE9wZXJDaGFubmVsKTsKKyNlbmRpZgorCisJLyogUG9wdWxhdGUgdGhlIFNUQS1yZWxhdGVkIHBhcmFtZXRlcnMgaGVyZSAqLworCS8qIE5vdGUgdGhhdCB0aGUgU1RBIGhlcmUgcmVmZXJzIHRvIHRoZSBBUCAqLworCXsKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFUeXBlID0gU1RBX0VOVFJZX09USEVSOworCisJCWNkZl9tZW1fY29weShwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmJzc0lkLAorCQkJICAgICBic3NEZXNjcmlwdGlvbi0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmxpc3RlbkludGVydmFsID0KKwkJCWJzc0Rlc2NyaXB0aW9uLT5iZWFjb25JbnRlcnZhbDsKKworCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmFzc29jSWQgPSAwOworCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnVBUFNEID0gMDsKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhTUExlbiA9IDA7CisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc2hvcnRQcmVhbWJsZVN1cHBvcnRlZCA9CisJCQkodWludDhfdCkgcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZTsKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51cGRhdGVTdGEgPSB1cGRhdGVFbnRyeTsKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5lbmNyeXB0VHlwZSA9CisJCQlwZnRTZXNzaW9uRW50cnktPmVuY3J5cHRUeXBlOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5ybWZFbmFibGVkID0KKwkJCXBmdFNlc3Npb25FbnRyeS0+bGltUm1mRW5hYmxlZDsKKyNlbmRpZgorCisJCWlmIChJU19ET1QxMV9NT0RFX0hUKHBmdFNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSAmJgorCQkgICAgKHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5wcmVzZW50KSkgeworCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51czMyTWF4QW1wZHVEdXJhdGlvbiA9IDA7CisJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmh0Q2FwYWJsZSA9IDE7CisJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmdyZWVuRmllbGRDYXBhYmxlID0KKwkJCQkodWludDhfdCkgcEJlYWNvblN0cnVjdC0+SFRDYXBzLmdyZWVuRmllbGQ7CisJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmxzaWdUeG9wUHJvdGVjdGlvbiA9CisJCQkJKHVpbnQ4X3QpIHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb247CisJCQlpZiAoKHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpICYmCisJCQkgICAgKGNoYW5XaWR0aFN1cHApKSB7CisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5jaF93aWR0aCA9ICh1aW50OF90KQorCQkJCQlwQmVhY29uU3RydWN0LT5IVEluZm8ucmVjb21tZW5kZWRUeFdpZHRoU2V0OworCQkJfSBlbHNlIHsKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmNoX3dpZHRoID0KKwkJCQkJQ0hfV0lEVEhfMjBNSFo7CisJCQl9CisJCQlpZiAocGZ0U2Vzc2lvbkVudHJ5LT52aHRDYXBhYmlsaXR5ICYmCisJCQkgICAgSVNfQlNTX1ZIVF9DQVBBQkxFKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMpKSB7CisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC52aHRDYXBhYmxlID0gMTsKKwkJCQlpZiAoKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMuc3VCZWFtRm9ybWVyQ2FwIHx8CisJCQkJICAgICBwQmVhY29uU3RydWN0LT5WSFRDYXBzLm11QmVhbWZvcm1lckNhcCkgJiYKKwkJCQkgICAgcGZ0U2Vzc2lvbkVudHJ5LT50eEJGSW5pRmVhdHVyZUVuYWJsZWQpCisJCQkJCXN0YV9jdHgtPnZodFR4QkZDYXBhYmxlCisJCQkJCQk9IDE7CisJCQkJaWYgKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMuc3VCZWFtZm9ybWVlQ2FwICYmCisJCQkJICAgIHBmdFNlc3Npb25FbnRyeS0+ZW5hYmxlX3N1X3R4X2Jmb3JtZXIpCisJCQkJCXN0YV9jdHgtPmVuYWJsZV9zdV90eF9iZm9ybWVyID0gMTsKKwkJCX0KKwkJCWlmICgocEJlYWNvblN0cnVjdC0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgJiYKKwkJCSAgICAoY2hhbldpZHRoU3VwcCkpIHsKKwkJCQlzdGFfY3R4LT5jaF93aWR0aCA9ICh1aW50OF90KQorCQkJCQlwQmVhY29uU3RydWN0LT5IVEluZm8ucmVjb21tZW5kZWRUeFdpZHRoU2V0OworCQkJCWlmIChwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnZodENhcGFibGUgJiYKKwkJCQkJcEJlYWNvblN0cnVjdC0+VkhUT3BlcmF0aW9uLmNoYW5XaWR0aCkKKwkJCQkJc3RhX2N0eC0+Y2hfd2lkdGggPQorCQkJCQlwQmVhY29uU3RydWN0LT5WSFRPcGVyYXRpb24uY2hhbldpZHRoCisJCQkJCQkrIDE7CisJCQl9IGVsc2UgeworCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuY2hfd2lkdGggPQorCQkJCQlDSF9XSURUSF8yME1IWjsKKwkJCX0KKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWltb1BTID0KKwkJCQkodFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlKSBwQmVhY29uU3RydWN0LT5IVENhcHMuCisJCQkJbWltb1Bvd2VyU2F2ZTsKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4QW1zZHVTaXplID0KKwkJCQkodWludDhfdCkgcEJlYWNvblN0cnVjdC0+SFRDYXBzLm1heGltYWxBTVNEVXNpemU7CisJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtcGR1RGVuc2l0eSA9CisJCQkJcEJlYWNvblN0cnVjdC0+SFRDYXBzLm1wZHVEZW5zaXR5OworCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mRHNzc0Nja01vZGU0ME1oeiA9CisJCQkJKHVpbnQ4X3QpIHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5kc3NzQ2NrTW9kZTQwTUh6OworCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mU2hvcnRHSTIwTWh6ID0KKwkJCQkodWludDhfdCkgcEJlYWNvblN0cnVjdC0+SFRDYXBzLnNob3J0R0kyME1IejsKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZlNob3J0R0k0ME1oeiA9CisJCQkJKHVpbnQ4X3QpIHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5zaG9ydEdJNDBNSHo7CisJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtcGR1U2l6ZSA9CisJCQkJcEJlYWNvblN0cnVjdC0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3I7CisKKwkJCWlmIChwQmVhY29uU3RydWN0LT5IVEluZm8ucHJlc2VudCkKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnJpZnNNb2RlID0KKwkJCQkJcEJlYWNvblN0cnVjdC0+SFRJbmZvLnJpZnNNb2RlOworCQl9CisKKwkJaWYgKChwZnRTZXNzaW9uRW50cnktPmxpbVdtZUVuYWJsZWQKKwkJICAgICAmJiBwQmVhY29uU3RydWN0LT53bWVFZGNhUHJlc2VudCkKKwkJICAgIHx8IChwZnRTZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQKKwkJCSYmIHBCZWFjb25TdHJ1Y3QtPmVkY2FQcmVzZW50KSkKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQud21tRW5hYmxlZCA9IDE7CisJCWVsc2UKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQud21tRW5hYmxlZCA9IDA7CisKKwkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC53cGFfcnNuID0gcEJlYWNvblN0cnVjdC0+cnNuUHJlc2VudDsKKwkJLyogRm9yIE9TRU4gQ29ubmVjdGlvbiBBUCBkb2VzIG5vdCBhZHZlcnRpc2UgUlNOIG9yIFdQQSBJRQorCQkgKiBzbyBmcm9tIHRoZSBJRXMgd2UgZ2V0IGZyb20gc3VwcGxpY2FudCB3ZSBnZXQgdGhpcyBpbmZvCisJCSAqIHNvIGZvciBGVyB0byB0cmFuc21pdCBFQVBPTCBtZXNzYWdlIDQgd2Ugc2hhbGwgc2V0CisJCSAqIHdwYV9yc24KKwkJICovCisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQud3BhX3JzbiB8PQorCQkJKHBCZWFjb25TdHJ1Y3QtPndwYVByZXNlbnQgPDwgMSk7CisJCWlmICgoIXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQud3BhX3JzbikKKwkJICAgICYmIChwZnRTZXNzaW9uRW50cnktPmlzT1NFTkNvbm5lY3Rpb24pKQorCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC53cGFfcnNuID0gMTsKKwkJLyogVXBkYXRlIHRoZSByYXRlcyAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJCWxpbV9wb3B1bGF0ZV9wZWVyX3JhdGVfc2V0KHBNYWMsCisJCQkJCSAgICZwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LgorCQkJCQkgICBzdXBwb3J0ZWRSYXRlcywKKwkJCQkJICAgcEJlYWNvblN0cnVjdC0+SFRDYXBzLnN1cHBvcnRlZE1DU1NldCwKKwkJCQkJICAgZmFsc2UsIHBmdFNlc3Npb25FbnRyeSwKKwkJCQkJICAgJnBCZWFjb25TdHJ1Y3QtPlZIVENhcHMpOworI2Vsc2UKKwkJbGltX3BvcHVsYXRlX3BlZXJfcmF0ZV9zZXQocE1hYywKKwkJCQkJICAgJnBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuCisJCQkJCSAgIHN1cHBvcnRlZFJhdGVzLAorCQkJCQkgICBiZWFjb25TdHJ1Y3QuSFRDYXBzLnN1cHBvcnRlZE1DU1NldCwKKwkJCQkJICAgZmFsc2UsIHBmdFNlc3Npb25FbnRyeSk7CisjZW5kaWYKKwkJaWYgKHBmdFNlc3Npb25FbnRyeS0+aHRDYXBhYmlsaXR5KSB7CisJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN1cHBvcnRlZFJhdGVzLm9wUmF0ZU1vZGUgPQorCQkJCWVTVEFfMTFuOworCQkJaWYgKHBmdFNlc3Npb25FbnRyeS0+dmh0Q2FwYWJpbGl0eSkKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN1cHBvcnRlZFJhdGVzLgorCQkJCW9wUmF0ZU1vZGUgPSBlU1RBXzExYWM7CisJCX0gZWxzZSB7CisJCQlpZiAocGZ0U2Vzc2lvbkVudHJ5LT5saW1SRkJhbmQgPT0gU0lSX0JBTkRfNV9HSFopIHsKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN1cHBvcnRlZFJhdGVzLgorCQkJCW9wUmF0ZU1vZGUgPSBlU1RBXzExYTsKKwkJCX0gZWxzZSB7CisJCQkJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdXBwb3J0ZWRSYXRlcy4KKwkJCQlvcFJhdGVNb2RlID0gZVNUQV8xMWJnOworCQkJfQorCQl9CisJfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJcEFkZEJzc1BhcmFtcy0+bWF4VHhQb3dlciA9IHBmdFNlc3Npb25FbnRyeS0+bWF4VHhQb3dlcjsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWlmIChwZnRTZXNzaW9uRW50cnktPmxpbVJtZkVuYWJsZWQpIHsKKwkJcEFkZEJzc1BhcmFtcy0+cm1mRW5hYmxlZCA9IDE7CisJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQucm1mRW5hYmxlZCA9IDE7CisJfQorI2VuZGlmCisKKwlwQWRkQnNzUGFyYW1zLT5zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJcEFkZEJzc1BhcmFtcy0+cmVzcFJlcWQgPSB0cnVlOworCisJcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zZXNzaW9uSWQgPSBwZnRTZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc21lc2Vzc2lvbklkID0gcGZ0U2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisJcEFkZEJzc1BhcmFtcy0+c2Vzc2lvbklkID0gcGZ0U2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworCS8qIFNldCBhIG5ldyBzdGF0ZSBmb3IgTUxNRSAqLworCisJcGZ0U2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0ZUX1JFQVNTT0NfU1RBVEU7CisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBwZnRTZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkgICAgICAgZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfRlRfUkVBU1NPQ19TVEFURSkpOworCXBBZGRCc3NQYXJhbXMtPmhhbFBlcnNvbmEgPSAodWludDhfdCkgcGZ0U2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmE7CisKKwlwZnRTZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBBZGRCc3NSZXEgPSBwQWRkQnNzUGFyYW1zOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlNhdmluZyBTSVJfSEFMX0FERF9CU1NfUkVRIGZvciBwcmUtYXV0aCBhcC4uLiIpKTsKKyNlbmRpZgorCisJY2RmX21lbV9mcmVlKHBCZWFjb25TdHJ1Y3QpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNldHVwIHRoZSBuZXcgc2Vzc2lvbiBmb3IgdGhlIHByZS1hdXRoIEFQLgorICogUmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHNlc3Npb24gZW50cnkuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1fZmlsbF9mdF9zZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgdHBTaXJCc3NEZXNjcmlwdGlvbiBwYnNzRGVzY3JpcHRpb24sCisJCQkgdHBQRVNlc3Npb24gcGZ0U2Vzc2lvbkVudHJ5LCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQ4X3QgY3VycmVudEJzc1VhcHNkOworCXRQb3dlcmRCbSBsb2NhbFBvd2VyQ29uc3RyYWludDsKKwl0UG93ZXJkQm0gcmVnTWF4OworCXRTY2hCZWFjb25TdHJ1Y3QgKnBCZWFjb25TdHJ1Y3Q7CisJdWludDMyX3Qgc2VsZkRvdDExTW9kZTsKKwllUGh5Q2hhbkJvbmRTdGF0ZSBjYkVuYWJsZWRNb2RlOworCisJcEJlYWNvblN0cnVjdCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2NoQmVhY29uU3RydWN0KSk7CisJaWYgKE5VTEwgPT0gcEJlYWNvblN0cnVjdCkgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNyZWF0aW5nIGxpbV9maWxsX2Z0X3Nlc3Npb24iKSk7CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworCS8qIFJldHJpZXZlIHRoZSBzZXNzaW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFuZCB1cGRhdGUgdGhlIGVudHJ5ICovCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRyB8fCBkZWZpbmVkIEZFQVRVUkVfV0xBTl9FU0UgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwYnNzRGVzY3JpcHRpb24tPmJzc0lkLCBMT0cxKTsKKyNlbmRpZgorCXBmdFNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCA9IHBzZXNzaW9uRW50cnktPmxpbVdtZUVuYWJsZWQ7CisJcGZ0U2Vzc2lvbkVudHJ5LT5saW1Rb3NFbmFibGVkID0gcHNlc3Npb25FbnRyeS0+bGltUW9zRW5hYmxlZDsKKwlwZnRTZXNzaW9uRW50cnktPmxpbVdzbUVuYWJsZWQgPSBwc2Vzc2lvbkVudHJ5LT5saW1Xc21FbmFibGVkOworCXBmdFNlc3Npb25FbnRyeS0+bGltMTFoRW5hYmxlID0gcHNlc3Npb25FbnRyeS0+bGltMTFoRW5hYmxlOworCXBmdFNlc3Npb25FbnRyeS0+aXNPU0VOQ29ubmVjdGlvbiA9IHBzZXNzaW9uRW50cnktPmlzT1NFTkNvbm5lY3Rpb247CisKKwkvKiBGaWVsZHMgdG8gYmUgZmlsbGVkIGxhdGVyICovCisJcGZ0U2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcSA9IE5VTEw7CisJcGZ0U2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisJcGZ0U2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkID0gMDsKKworCWxpbV9leHRyYWN0X2FwX2NhcGFiaWxpdGllcyhwTWFjLCAodWludDhfdCAqKSBwYnNzRGVzY3JpcHRpb24tPmllRmllbGRzLAorCQkJbGltX2dldF9pZWxlbl9mcm9tX2Jzc19kZXNjcmlwdGlvbihwYnNzRGVzY3JpcHRpb24pLAorCQkJcEJlYWNvblN0cnVjdCk7CisKKwlwZnRTZXNzaW9uRW50cnktPnJhdGVTZXQubnVtUmF0ZXMgPQorCQlwQmVhY29uU3RydWN0LT5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlczsKKwljZGZfbWVtX2NvcHkocGZ0U2Vzc2lvbkVudHJ5LT5yYXRlU2V0LnJhdGUsCisJCSAgICAgcEJlYWNvblN0cnVjdC0+c3VwcG9ydGVkUmF0ZXMucmF0ZSwKKwkJICAgICBwQmVhY29uU3RydWN0LT5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlcyk7CisKKwlwZnRTZXNzaW9uRW50cnktPmV4dFJhdGVTZXQubnVtUmF0ZXMgPQorCQlwQmVhY29uU3RydWN0LT5leHRlbmRlZFJhdGVzLm51bVJhdGVzOworCWNkZl9tZW1fY29weShwZnRTZXNzaW9uRW50cnktPmV4dFJhdGVTZXQucmF0ZSwKKwkJICAgICBwQmVhY29uU3RydWN0LT5leHRlbmRlZFJhdGVzLnJhdGUsCisJCSAgICAgcGZ0U2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0Lm51bVJhdGVzKTsKKworCXBmdFNlc3Npb25FbnRyeS0+c3NJZC5sZW5ndGggPSBwQmVhY29uU3RydWN0LT5zc0lkLmxlbmd0aDsKKwljZGZfbWVtX2NvcHkocGZ0U2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWQsIHBCZWFjb25TdHJ1Y3QtPnNzSWQuc3NJZCwKKwkJICAgICBwZnRTZXNzaW9uRW50cnktPnNzSWQubGVuZ3RoKTsKKworCXdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19ET1QxMV9NT0RFLCAmc2VsZkRvdDExTW9kZSk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgic2VsZkRvdDExTW9kZSAlZCIpLCBzZWxmRG90MTFNb2RlKTsKKwlwZnRTZXNzaW9uRW50cnktPmRvdDExbW9kZSA9IHNlbGZEb3QxMU1vZGU7CisJcGZ0U2Vzc2lvbkVudHJ5LT52aHRDYXBhYmlsaXR5ID0KKwkJKElTX0RPVDExX01PREVfVkhUKHBmdFNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKQorCQkgJiYgSVNfQlNTX1ZIVF9DQVBBQkxFKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMpKTsKKwlwZnRTZXNzaW9uRW50cnktPmh0Q2FwYWJpbGl0eSA9CisJCShJU19ET1QxMV9NT0RFX0hUKHBmdFNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKQorCQkgJiYgcEJlYWNvblN0cnVjdC0+SFRDYXBzLnByZXNlbnQpOworCisJLyogQ29weSBUaGUgY2hhbm5lbCBJZCB0byB0aGUgc2Vzc2lvbiBUYWJsZSAqLworCXBmdFNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0NoYW5uZWxJZCA9IHBic3NEZXNjcmlwdGlvbi0+Y2hhbm5lbElkOworCXBmdFNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsID0gcGJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQ7CisKKwlwZnRTZXNzaW9uRW50cnktPmxpbVJGQmFuZCA9IGxpbV9nZXRfcmZfYmFuZCgKKwkJCQlwZnRTZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCk7CisKKwlpZiAocGZ0U2Vzc2lvbkVudHJ5LT5saW1SRkJhbmQgPT0gU0lSX0JBTkRfMl80X0dIWikgeworCQljYkVuYWJsZWRNb2RlID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGUyNEdIejsKKwl9IGVsc2UgeworCQljYkVuYWJsZWRNb2RlID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGU1R0h6OworCX0KKwlwZnRTZXNzaW9uRW50cnktPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkgICAgKHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5wcmVzZW50KSA/CisJICAgIChjYkVuYWJsZWRNb2RlICYmIHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQpIDogMDsKKwlwZnRTZXNzaW9uRW50cnktPmh0UmVjb21tZW5kZWRUeFdpZHRoU2V0ID0KKwkJcGZ0U2Vzc2lvbkVudHJ5LT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlpZiAoSVNfQlNTX1ZIVF9DQVBBQkxFKHBCZWFjb25TdHJ1Y3QtPlZIVENhcHMpICYmCisJCXBCZWFjb25TdHJ1Y3QtPlZIVE9wZXJhdGlvbi5wcmVzZW50ICYmCisJCXBmdFNlc3Npb25FbnRyeS0+dmh0Q2FwYWJpbGl0eSkgeworCQlwZnRTZXNzaW9uRW50cnktPnZodENhcGFiaWxpdHlQcmVzZW50SW5CZWFjb24gPSAxOworCX0gZWxzZSB7CisJCXBmdFNlc3Npb25FbnRyeS0+dmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbiA9IDA7CisJfQorI2VuZGlmCisJaWYgKHBmdFNlc3Npb25FbnRyeS0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQpIHsKKwkJcGZ0U2Vzc2lvbkVudHJ5LT5jaF93aWR0aCA9IENIX1dJRFRIXzQwTUhaOworCQlpZiAocGZ0U2Vzc2lvbkVudHJ5LT52aHRDYXBhYmlsaXR5UHJlc2VudEluQmVhY29uICYmCisJCQkJcEJlYWNvblN0cnVjdC0+VkhUT3BlcmF0aW9uLmNoYW5XaWR0aCkgeworCQkJcGZ0U2Vzc2lvbkVudHJ5LT5jaF93aWR0aCA9CisJCQkJcEJlYWNvblN0cnVjdC0+VkhUT3BlcmF0aW9uLmNoYW5XaWR0aCArIDE7CisJCQlwZnRTZXNzaW9uRW50cnktPmNoX2NlbnRlcl9mcmVxX3NlZzAgPQorCQkJCXBCZWFjb25TdHJ1Y3QtPlZIVE9wZXJhdGlvbi5jaGFuQ2VudGVyRnJlcVNlZzE7CisJCQlwZnRTZXNzaW9uRW50cnktPmNoX2NlbnRlcl9mcmVxX3NlZzEgPQorCQkJCXBCZWFjb25TdHJ1Y3QtPlZIVE9wZXJhdGlvbi5jaGFuQ2VudGVyRnJlcVNlZzI7CisJCX0gZWxzZSB7CisJCQlpZiAocEJlYWNvblN0cnVjdC0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPT0KKwkJCQkJUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZKQorCQkJCXBmdFNlc3Npb25FbnRyeS0+Y2hfY2VudGVyX2ZyZXFfc2VnMCA9CisJCQkJCXBic3NEZXNjcmlwdGlvbi0+Y2hhbm5lbElkICsgMjsKKwkJCWVsc2UgaWYgKHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID09CisJCQkJCVBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlkpCisJCQkJcGZ0U2Vzc2lvbkVudHJ5LT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQkJcGJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQgLSAyOworCQkJZWxzZQorCQkJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgc2VjIGNoIG9mZnNldCIpKTsKKwkJfQorCX0gZWxzZSB7CisJCXBmdFNlc3Npb25FbnRyeS0+Y2hfd2lkdGggPSBDSF9XSURUSF8yME1IWjsKKwkJcGZ0U2Vzc2lvbkVudHJ5LT5jaF9jZW50ZXJfZnJlcV9zZWcwID0gMDsKKwkJcGZ0U2Vzc2lvbkVudHJ5LT5jaF9jZW50ZXJfZnJlcV9zZWcxID0gMDsKKwl9CisKKwlzaXJfY29weV9tYWNfYWRkcihwZnRTZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLAorCQkJICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisJc2lyX2NvcHlfbWFjX2FkZHIocGZ0U2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWQsCisJCQkgIHBic3NEZXNjcmlwdGlvbi0+YnNzSWQpOworCXNpcl9jb3B5X21hY19hZGRyKHBmdFNlc3Npb25FbnRyeS0+cHJldl9hcF9ic3NpZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQpOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcgfHwgZGVmaW5lZCBGRUFUVVJFX1dMQU5fRVNFIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcGZ0U2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWQsIExPRzEpOworI2VuZGlmCisKKwkvKiBTdG9yZSBiZWFjb25JbnRlcnZhbCAqLworCXBmdFNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmJlYWNvbkludGVydmFsID0KKwkJcGJzc0Rlc2NyaXB0aW9uLT5iZWFjb25JbnRlcnZhbDsKKwlwZnRTZXNzaW9uRW50cnktPmJzc1R5cGUgPSBwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlOworCisJcGZ0U2Vzc2lvbkVudHJ5LT5zdGF0eXBlRm9yQnNzID0gU1RBX0VOVFJZX1BFRVI7CisJcGZ0U2Vzc2lvbkVudHJ5LT5ud1R5cGUgPSBwYnNzRGVzY3JpcHRpb24tPm53VHlwZTsKKworCisJaWYgKHBmdFNlc3Npb25FbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREUpIHsKKwkJcGZ0U2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9TVEFfUk9MRTsKKwl9IGVsc2UgaWYgKHBmdFNlc3Npb25FbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX0FQX01PREUpIHsKKwkJcGZ0U2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9CVF9BTVBfU1RBX1JPTEU7CisJfSBlbHNlIHsKKwkJLyogVGhyb3cgYW4gZXJyb3IgYW5kIHJldHVybiBhbmQgbWFrZSBzdXJlIHRvIGRlbGV0ZSB0aGUgc2Vzc2lvbi4gKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBic3MgdHlwZSIpKTsKKwl9CisKKwlwZnRTZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzID0gcGJzc0Rlc2NyaXB0aW9uLT5jYXBhYmlsaXR5SW5mbzsKKwlwZnRTZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NDYXBzID0gcGJzc0Rlc2NyaXB0aW9uLT5jYXBhYmlsaXR5SW5mbzsKKwlpZiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5zaG9ydFNsb3RUaW1lICYmCisJICAgIFNJUl9NQUNfR0VUX1NIT1JUX1NMT1RfVElNRShwZnRTZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NDYXBzKSkgeworCQlwZnRTZXNzaW9uRW50cnktPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQgPSB0cnVlOworCX0KKworCXJlZ01heCA9IGNmZ19nZXRfcmVndWxhdG9yeV9tYXhfdHJhbnNtaXRfcG93ZXIocE1hYywKKwkJCQkJCSAgICAgICBwZnRTZXNzaW9uRW50cnktPgorCQkJCQkJICAgICAgIGN1cnJlbnRPcGVyQ2hhbm5lbCk7CisJbG9jYWxQb3dlckNvbnN0cmFpbnQgPSByZWdNYXg7CisJbGltX2V4dHJhY3RfYXBfY2FwYWJpbGl0eShwTWFjLCAodWludDhfdCAqKSBwYnNzRGVzY3JpcHRpb24tPmllRmllbGRzLAorCQlsaW1fZ2V0X2llbGVuX2Zyb21fYnNzX2Rlc2NyaXB0aW9uKHBic3NEZXNjcmlwdGlvbiksCisJCSZwZnRTZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NRb3NDYXBzLAorCQkmcGZ0U2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QnNzUHJvcENhcCwgJmN1cnJlbnRCc3NVYXBzZCwKKwkJJmxvY2FsUG93ZXJDb25zdHJhaW50LCBwZnRTZXNzaW9uRW50cnkpOworCisJcGZ0U2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUW9zQ2FwcyA9CisJCXBmdFNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc1Fvc0NhcHM7CisJcGZ0U2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUHJvcENhcCA9CisJCXBmdFNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc1Byb3BDYXA7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCXBmdFNlc3Npb25FbnRyeS0+aXMxMVJjb25uZWN0aW9uID0gcHNlc3Npb25FbnRyeS0+aXMxMVJjb25uZWN0aW9uOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXBmdFNlc3Npb25FbnRyeS0+aXNFU0Vjb25uZWN0aW9uID0gcHNlc3Npb25FbnRyeS0+aXNFU0Vjb25uZWN0aW9uOworCXBmdFNlc3Npb25FbnRyeS0+aXNfZXNlX3ZlcnNpb25faWVfcHJlc2VudCA9CisJCXBCZWFjb25TdHJ1Y3QtPmlzX2VzZV92ZXJfaWVfcHJlc2VudDsKKyNlbmRpZgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgfHwgZGVmaW5lZCBGRUFUVVJFX1dMQU5fRVNFIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwlwZnRTZXNzaW9uRW50cnktPmlzRmFzdFRyYW5zaXRpb25FbmFibGVkID0KKwkJcHNlc3Npb25FbnRyeS0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQ7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwlwZnRTZXNzaW9uRW50cnktPmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCA9CisJCXBzZXNzaW9uRW50cnktPmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZDsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXBmdFNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciA9CisJCWxpbV9nZXRfbWF4X3R4X3Bvd2VyKHJlZ01heCwgbG9jYWxQb3dlckNvbnN0cmFpbnQsCisJCQkJICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwKTsKKyNlbHNlCisJcGZ0U2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyID0gQ0RGX01JTihyZWdNYXgsIChsb2NhbFBvd2VyQ29uc3RyYWludCkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTAorCQkJKCJSZWcgbWF4ID0gJWQsIGxvY2FsIHBvd2VyID0gJWQsIGluaSB0eCBwb3dlciA9ICVkLCBtYXggdHggPSAlZCIpLAorCQlyZWdNYXgsIGxvY2FsUG93ZXJDb25zdHJhaW50LCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwLAorCQlwZnRTZXNzaW9uRW50cnktPm1heFR4UG93ZXIpOworI2VuZGlmCisKKwlwZnRTZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZSA9IHBmdFNlc3Npb25FbnRyeS0+bGltU21lU3RhdGU7CisJcGZ0U2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEU7CisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCBwZnRTZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkgICAgICAgcGZ0U2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSkpOworCisJcGZ0U2Vzc2lvbkVudHJ5LT5lbmNyeXB0VHlwZSA9IHBzZXNzaW9uRW50cnktPmVuY3J5cHRUeXBlOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwlwZnRTZXNzaW9uRW50cnktPmxpbVJtZkVuYWJsZWQgPSBwc2Vzc2lvbkVudHJ5LT5saW1SbWZFbmFibGVkOworI2VuZGlmCisKKwljZGZfbWVtX2ZyZWUocEJlYWNvblN0cnVjdCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU2V0dXAgdGhlIHNlc3Npb24gYW5kIHRoZSBhZGQgYnNzIHJlcSBmb3IgdGhlIHByZS1hdXRoIEFQLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMgbGltX2Z0X3NldHVwX2F1dGhfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwUEVTZXNzaW9uIHBmdFNlc3Npb25FbnRyeSA9IE5VTEw7CisJdWludDhfdCBzZXNzaW9uSWQgPSAwOworCisJcGZ0U2Vzc2lvbkVudHJ5ID0KKwkJcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCwKKwkJCQkJICZzZXNzaW9uSWQpOworCWlmIChwZnRTZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiVW5hYmxlIHRvIGZpbmQgc2Vzc2lvbiBmb3IgdGhlIGZvbGxvd2luZyBic3NpZCIpKTsKKwkJICAgICAgICkKKwkJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCwgTE9HRSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJLyogTm90aGluZyB0byBiZSBkb25lIGlmIHRoZSBzZXNzaW9uIGlzIG5vdCBpbiBTVEEgbW9kZSAqLworCWlmICghTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgicHNlc3Npb25FbnRyeSBpcyBub3QgaW4gU1RBIG1vZGUiKSk7CisJCSAgICAgICApCisjZW5kaWYKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlpZiAocHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSAmJgorCSAgICBwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5wYnNzRGVzY3JpcHRpb24pIHsKKwkJbGltX2ZpbGxfZnRfc2Vzc2lvbihwTWFjLAorCQkJCSAgICBwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT4KKwkJCQkgICAgcGJzc0Rlc2NyaXB0aW9uLCBwZnRTZXNzaW9uRW50cnksCisJCQkJICAgIHBzZXNzaW9uRW50cnkpOworCisJCWxpbV9mdF9wcmVwYXJlX2FkZF9ic3NfcmVxKHBNYWMsIGZhbHNlLCBwZnRTZXNzaW9uRW50cnksCisJCQkJCSAgIHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPgorCQkJCQkgICBwYnNzRGVzY3JpcHRpb24pOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXN1bWUgTGluayBDYWxsIEJhY2sKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltX2Z0X3Byb2Nlc3NfcHJlX2F1dGhfcmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIENERl9TVEFUVVMgc3RhdHVzLAorCQkJCSAgICB1aW50MzJfdCAqZGF0YSkKK3sKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gKHRwUEVTZXNzaW9uKSBkYXRhOworCisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSB8fAorCSAgICBOVUxMID09IHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEpCisJCXJldHVybjsKKworCS8qIE5vdGhpbmcgdG8gYmUgZG9uZSBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgaW4gU1RBIG1vZGUgKi8KKwlpZiAoIUxJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoInBzZXNzaW9uRW50cnkgaXMgbm90IGluIFNUQSBtb2RlIikpOworCQkgICAgICAgKQorI2VuZGlmCisJCXJldHVybjsKKwl9CisKKwlpZiAocHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQuZnRQcmVBdXRoU3RhdHVzID09IGVTSVJfU1VDQ0VTUykgeworCQlwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5mdFByZUF1dGhTdGF0dXMgPQorCQkJbGltX2Z0X3NldHVwX2F1dGhfc2Vzc2lvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwl9CisJLyogUG9zdCB0aGUgRlQgUHJlIEF1dGggUmVzcG9uc2UgdG8gU01FICovCisJbGltX3Bvc3RfZnRfcHJlX2F1dGhfcnNwKHBNYWMsIHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LmZ0UHJlQXV0aFN0YXR1cywKKwkJCQkgcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQuc2F2ZWRfYXV0aF9yc3AsCisJCQkJIHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnNhdmVkX2F1dGhfcnNwX2xlbmd0aCwKKwkJCQkgcHNlc3Npb25FbnRyeSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXN1bWUgTGluayBDYWxsIEJhY2sKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltX3BlcmZvcm1fcG9zdF9mdF9wcmVfYXV0aF9hbmRfY2hhbm5lbF9jaGFuZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgICAgQ0RGX1NUQVRVUyBzdGF0dXMsCisJCQkJCQkgICAgIHVpbnQzMl90ICpkYXRhLAorCQkJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCS8qIFNldCB0aGUgcmVzdW1lIGNoYW5uZWwgdG8gQW55IHZhbGlkIGNoYW5uZWwgKGludmFsaWQpCisJICogVGhpcyB3aWxsIGluc3RydWN0IEhBTCB0byBzZXQgaXQgdG8gYW55IHByZXZpb3VzIHZhbGlkIGNoYW5uZWwuCisJICovCisJcGVfc2V0X3Jlc3VtZV9jaGFubmVsKHBNYWMsIDAsIDApOworCWxpbV9mdF9wcm9jZXNzX3ByZV9hdXRoX3Jlc3VsdChwTWFjLCBDREZfU1RBVFVTX1NVQ0NFU1MsCisJCQkodWludDMyX3QgKikgcHNlc3Npb25FbnRyeSk7Cit9CisKKy8qCisgKiBsaW1fcG9zdF9mdF9wcmVfYXV0aF9yc3AoKSAtIHBvc3QgZnQgcHJlIGF1dGggcmVzcG9uc2UgdG8gU01FLgorICoKKyAqIEBtYWNfY3R4OgkJZ2xvYmFsIG1hYyBjdHgKKyAqIEBzdGF0dXM6CQlzdGF0dXMgY29kZSB0byBwb3N0IGluIGF1dGggcnNwCisgKiBAYXV0aF9yc3A6CQlwb2ludGVyIHRvIGF1dGggcnNwIEZUIGllCisgKiBAYXV0aF9yc3BfbGVuZ3RoOglsZW4gb2YgdGhlIElFIGZpZWxkCisgKiBAc2Vzc2lvbjoJICAgICAgICBwZSBzZXNzaW9uCisgKgorICogcG9zdCBwcmUgYXV0aCByZXNwb25zZSB0byBTTUUuCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgbGltX3Bvc3RfZnRfcHJlX2F1dGhfcnNwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkgICAgICB0U2lyUmV0U3RhdHVzIHN0YXR1cywKKwkJCSAgICAgIHVpbnQ4X3QgKmF1dGhfcnNwLAorCQkJICAgICAgdWludDE2X3QgYXV0aF9yc3BfbGVuZ3RoLAorCQkJICAgICAgdHBQRVNlc3Npb24gc2Vzc2lvbikKK3sKKwl0cFNpckZUUHJlQXV0aFJzcCBmdF9wcmVfYXV0aF9yc3A7CisJdFNpck1zZ1EgbW1oX21zZzsKKwl1aW50MTZfdCByc3BfbGVuID0gc2l6ZW9mKHRTaXJGVFByZUF1dGhSc3ApOworCisJZnRfcHJlX2F1dGhfcnNwID0gKHRwU2lyRlRQcmVBdXRoUnNwKSBjZGZfbWVtX21hbGxvYyhyc3BfbGVuKTsKKwlpZiAoTlVMTCA9PSBmdF9wcmVfYXV0aF9yc3ApIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpOworCQlDREZfQVNTRVJUKGZ0X3ByZV9hdXRoX3JzcCAhPSBOVUxMKTsKKwkJcmV0dXJuOworCX0KKwljZGZfbWVtX3plcm8oZnRfcHJlX2F1dGhfcnNwLCByc3BfbGVuKTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJBdXRoIFJzcCA9ICVwIiksIGZ0X3ByZV9hdXRoX3JzcCk7CisjZW5kaWYKKwlpZiAoc2Vzc2lvbikgeworCQkvKiBOb3RoaW5nIHRvIGJlIGRvbmUgaWYgdGhlIHNlc3Npb24gaXMgbm90IGluIFNUQSBtb2RlICovCisJCWlmICghTElNX0lTX1NUQV9ST0xFKHNlc3Npb24pKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJzZXNzaW9uIGlzIG5vdCBpbiBTVEEgbW9kZSIpKTsKKyNlbmRpZgorCQkJY2RmX21lbV9mcmVlKGZ0X3ByZV9hdXRoX3JzcCk7CisJCQlyZXR1cm47CisJCX0KKwkJZnRfcHJlX2F1dGhfcnNwLT5zbWVTZXNzaW9uSWQgPSBzZXNzaW9uLT5zbWVTZXNzaW9uSWQ7CisJCS8qIFRoZSBic3NpZCBvZiB0aGUgQVAgd2UgYXJlIHNlbmRpbmcgQXV0aDEgdG8uICovCisJCWlmIChzZXNzaW9uLT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxKQorCQkJc2lyX2NvcHlfbWFjX2FkZHIoZnRfcHJlX2F1dGhfcnNwLT5wcmVBdXRoYnNzSWQsCisJCQkgICAgc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+cHJlQXV0aGJzc0lkKTsKKwl9CisKKwlmdF9wcmVfYXV0aF9yc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfRlRfUFJFX0FVVEhfUlNQOworCWZ0X3ByZV9hdXRoX3JzcC0+bGVuZ3RoID0gKHVpbnQxNl90KSByc3BfbGVuOworCWZ0X3ByZV9hdXRoX3JzcC0+c3RhdHVzID0gc3RhdHVzOworCisJLyogQXR0YWNoIHRoZSBhdXRoIHJlc3BvbnNlIG5vdyBiYWNrIHRvIFNNRSAqLworCWZ0X3ByZV9hdXRoX3JzcC0+ZnRfaWVzX2xlbmd0aCA9IDA7CisJaWYgKChhdXRoX3JzcCAhPSBOVUxMKSAmJiAoYXV0aF9yc3BfbGVuZ3RoIDwgTUFYX0ZUSUVfU0laRSkpIHsKKwkJLyogT25seSAxMXIgYXNzb2MgaGFzIEZUIElFcyAqLworCQljZGZfbWVtX2NvcHkoZnRfcHJlX2F1dGhfcnNwLT5mdF9pZXMsCisJCQkgICAgIGF1dGhfcnNwLCBhdXRoX3JzcF9sZW5ndGgpOworCQlmdF9wcmVfYXV0aF9yc3AtPmZ0X2llc19sZW5ndGggPSBhdXRoX3JzcF9sZW5ndGg7CisJfQorCisJaWYgKHN0YXR1cyAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJLyoKKwkJICogRW5zdXJlIHRoYXQgb24gUHJlLUF1dGggZmFpbHVyZSB0aGUgY2FjaGVkIFByZS1BdXRoIFJlcSBhbmQKKwkJICogb3RoZXIgYWxsb2NhdGVkIG1lbW9yeSBpcyBmcmVlZCB1cCBiZWZvcmUgcmV0dXJuaW5nLgorCQkgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCAiUHJlLUF1dGggRmFpbGVkLCBDbGVhbnVwISIpOworCQlsaW1fZnRfY2xlYW51cChtYWNfY3R4LCBzZXNzaW9uKTsKKwl9CisKKwltbWhfbXNnLnR5cGUgPSBmdF9wcmVfYXV0aF9yc3AtPm1lc3NhZ2VUeXBlOworCW1taF9tc2cuYm9keXB0ciA9IGZ0X3ByZV9hdXRoX3JzcDsKKwltbWhfbXNnLmJvZHl2YWwgPSAwOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlBvc3RlZCBBdXRoIFJzcCB0byBTTUUgd2l0aCBzdGF0dXMgb2YgMHgleCIpLAorCQlzdGF0dXMpOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWlmIChzdGF0dXMgPT0gZVNJUl9TVUNDRVNTKQorCQlsaW1fZGlhZ19ldmVudF9yZXBvcnQobWFjX2N0eCwgV0xBTl9QRV9ESUFHX1BSRUFVVEhfRE9ORSwKKwkJCQkgICAgICBzZXNzaW9uLCBzdGF0dXMsIDApOworI2VuZGlmCisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKG1hY19jdHgsICZtbWhfbXNnLCBlUFJPVCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU2VuZCB0aGUgRlQgUHJlIEF1dGggUmVzcG9uc2UgdG8gU01FIHdoZW5ldmVyIHdlIGhhdmUgYSBzdGF0dXMKKyAqIHJlYWR5IHRvIGJlIHNlbnQgdG8gU01FCisgKgorICogU01FIHdpbGwgYmUgdGhlIG9uZSB0byBzZW5kIGl0IHVwIHRvIHRoZSBzdXBwbGljYW50IHRvIHJlY2VpdmUKKyAqIEZUSUVzIHdoaWNoIHdpbGwgYmUgcmVxdWlyZWQgZm9yIFJlYXNzb2MgUmVxLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltX2hhbmRsZV9mdF9wcmVfYXV0aF9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclJldFN0YXR1cyBzdGF0dXMsCisJCQkJdWludDhfdCAqYXV0aF9yc3AsIHVpbnQxNl90IGF1dGhfcnNwX2xlbmd0aCwKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwUEVTZXNzaW9uIHBmdFNlc3Npb25FbnRyeSA9IE5VTEw7CisJdWludDhfdCBzZXNzaW9uSWQgPSAwOworCXRwU2lyQnNzRGVzY3JpcHRpb24gcGJzc0Rlc2NyaXB0aW9uID0gTlVMTDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19QUkVfQVVUSF9SU1BfRVZFTlQsCisJCQkgICAgICBwc2Vzc2lvbkVudHJ5LCAodWludDE2X3QpIHN0YXR1cywgMCk7CisjZW5kaWYKKworCS8qIE5vdGhpbmcgdG8gYmUgZG9uZSBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgaW4gU1RBIG1vZGUgKi8KKwlpZiAoIUxJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoInBzZXNzaW9uRW50cnkgaXMgbm90IGluIFNUQSBtb2RlIikpOworCQkgICAgICAgKQorI2VuZGlmCisJCXJldHVybjsKKwl9CisKKwkvKiBTYXZlIHRoZSBzdGF0dXMgb2YgcHJlLWF1dGggKi8KKwlwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5mdFByZUF1dGhTdGF0dXMgPSBzdGF0dXM7CisKKwkvKiBTYXZlIHRoZSBhdXRoIHJzcCwgc28gd2UgY2FuIHNlbmQgaXQgdG8KKwkgKiBTTUUgb25jZSB3ZSByZXN1bWUgbGluaworCSAqLworCXBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnNhdmVkX2F1dGhfcnNwX2xlbmd0aCA9IDA7CisJaWYgKChhdXRoX3JzcCAhPSBOVUxMKSAmJiAoYXV0aF9yc3BfbGVuZ3RoIDwgTUFYX0ZUSUVfU0laRSkpIHsKKwkJY2RmX21lbV9jb3B5KHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnNhdmVkX2F1dGhfcnNwLAorCQkJICAgICBhdXRoX3JzcCwgYXV0aF9yc3BfbGVuZ3RoKTsKKwkJcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQuc2F2ZWRfYXV0aF9yc3BfbGVuZ3RoID0KKwkJCWF1dGhfcnNwX2xlbmd0aDsKKwl9CisKKwlpZiAoIXBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgfHwKKwkgICAgIXBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnBic3NEZXNjcmlwdGlvbikgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgicEZUUHJlQXV0aFJlcSBvciBwYnNzRGVzY3JpcHRpb24gaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENyZWF0ZSBGVCBzZXNzaW9uIGZvciB0aGUgcmUtYXNzb2NpYXRpb24gYXQgdGhpcyBwb2ludCAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5mdFByZUF1dGhTdGF0dXMgPT0gZVNJUl9TVUNDRVNTKSB7CisJCXBic3NEZXNjcmlwdGlvbiA9CisJCQlwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5wYnNzRGVzY3JpcHRpb247CisJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwYnNzRGVzY3JpcHRpb24tPmJzc0lkLCBMT0cxKTsKKwkJaWYgKChwZnRTZXNzaW9uRW50cnkgPQorCQkJICAgICBwZV9jcmVhdGVfc2Vzc2lvbihwTWFjLCBwYnNzRGVzY3JpcHRpb24tPmJzc0lkLAorCQkJCQkgICAgICAgJnNlc3Npb25JZCwgcE1hYy0+bGltLm1heFN0YXRpb24sCisJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlKSkgPT0gTlVMTCkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkiU2Vzc2lvbiBub3QgY3JlYXRlZCBmb3IgcHJlLWF1dGggMTFSIEFQIikpOworCQkJc3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQkJcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQuZnRQcmVBdXRoU3RhdHVzID0gc3RhdHVzOworCQkJZ290byBzZW5kX3JzcDsKKwkJfQorCQlwZnRTZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkID0gc2Vzc2lvbklkOworCQlwZnRTZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKwkJc2lyX2NvcHlfbWFjX2FkZHIocGZ0U2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwKKwkJCQkgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKTsKKwkJc2lyX2NvcHlfbWFjX2FkZHIocGZ0U2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWQsCisJCQkJICBwYnNzRGVzY3JpcHRpb24tPmJzc0lkKTsKKwkJcGZ0U2Vzc2lvbkVudHJ5LT5ic3NUeXBlID0gcHNlc3Npb25FbnRyeS0+YnNzVHlwZTsKKworCQlpZiAocGZ0U2Vzc2lvbkVudHJ5LT5ic3NUeXBlID09IGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERSkgeworCQkJcGZ0U2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9TVEFfUk9MRTsKKwkJfSBlbHNlIGlmIChwZnRTZXNzaW9uRW50cnktPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9BUF9NT0RFKSB7CisJCQlwZnRTZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPSBlTElNX0JUX0FNUF9TVEFfUk9MRTsKKwkJfSBlbHNlIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgYnNzIHR5cGUiKSk7CisJCX0KKwkJcGZ0U2Vzc2lvbkVudHJ5LT5saW1QcmV2U21lU3RhdGUgPSBwZnRTZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlOworCQljZGZfbWVtX2NvcHkoJihwZnRTZXNzaW9uRW50cnktPmh0Q29uZmlnKSwKKwkJCSAgICAgJihwc2Vzc2lvbkVudHJ5LT5odENvbmZpZyksCisJCQkgICAgIHNpemVvZihwc2Vzc2lvbkVudHJ5LT5odENvbmZpZykpOworCQlwZnRTZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURTsKKworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cxLCAiJXM6Y3JlYXRlZCBzZXNzaW9uICglcCkgd2l0aCBpZCA9ICVkIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcGZ0U2Vzc2lvbkVudHJ5LAorCQkJICAgICAgIHBmdFNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworCQkgICAgICAgKQorCisJCS8qIFVwZGF0ZSB0aGUgUmVBc3NvYyBCU1NJRCBvZiB0aGUgY3VycmVudCBzZXNzaW9uICovCisJCXNpcl9jb3B5X21hY19hZGRyKHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCwKKwkJCQkgIHBic3NEZXNjcmlwdGlvbi0+YnNzSWQpOworCQlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkLCBMT0cxKTsKKwl9CitzZW5kX3JzcDoKKwlpZiAocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsICE9CisJICAgIHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnByZUF1dGhjaGFubmVsTnVtKSB7CisJCS8qIE5lZWQgdG8gbW92ZSB0byB0aGUgb3JpZ2luYWwgQVAgY2hhbm5lbCAqLworCQlsaW1fY2hhbmdlX2NoYW5uZWxfd2l0aF9jYWxsYmFjayhwTWFjLAorCQkJCQkJIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwKKwkJCQkJCSBsaW1fcGVyZm9ybV9wb3N0X2Z0X3ByZV9hdXRoX2FuZF9jaGFubmVsX2NoYW5nZSwKKwkJCQkJCSBOVUxMLCBwc2Vzc2lvbkVudHJ5KTsKKwl9IGVsc2UgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkgICAgICAgIlByZSBhdXRoIG9uIHNhbWUgY2hhbm5lbCBhcyBjb25uZWN0ZWQgQVAgY2hhbm5lbCAlZCIsCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+CisJCQkgICAgICAgcHJlQXV0aGNoYW5uZWxOdW0pOworCQkgICAgICAgKQorI2VuZGlmCisJCWxpbV9mdF9wcm9jZXNzX3ByZV9hdXRoX3Jlc3VsdChwTWFjLCBzdGF0dXMsCisJCQkJCSAgICAgICAodWludDMyX3QgKikgcHNlc3Npb25FbnRyeSk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIDExUiBSZWFzc29jIFJlcSBmcm9tIFNNRQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2Z0X3JlYXNzb2NfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmLAorCQkJCSAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQ4X3Qgc21lU2Vzc2lvbklkID0gMDsKKwl1aW50MTZfdCB0cmFuc2FjdGlvbklkID0gMDsKKwl1aW50OF90IGNoYW5OdW0gPSAwOworCXRMaW1NbG1SZWFzc29jUmVxICpwTWxtUmVhc3NvY1JlcTsKKwl1aW50MTZfdCBjYXBzOworCXVpbnQzMl90IHZhbDsKKwl0U2lyTXNnUSBtc2dROworCXRTaXJSZXRTdGF0dXMgcmV0Q29kZTsKKwl1aW50MzJfdCB0ZWxlQmNuRW4gPSAwOworCisJY2hhbk51bSA9IHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbDsKKwlsaW1fZ2V0X3Nlc3Npb25faW5mbyhwTWFjLCAodWludDhfdCAqKSBwTXNnQnVmLCAmc21lU2Vzc2lvbklkLAorCQkJICAgICAmdHJhbnNhY3Rpb25JZCk7CisJcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkID0gc21lU2Vzc2lvbklkOworCXBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfUkVBU1NPQ0lBVElORywgcHNlc3Npb25FbnRyeSwgMCwKKwkJCSAgICAgIDApOworI2VuZGlmCisKKwkvKiBOb3RoaW5nIHRvIGJlIGRvbmUgaWYgdGhlIHNlc3Npb24gaXMgbm90IGluIFNUQSBtb2RlICovCisJaWYgKCFMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJwc2Vzc2lvbkVudHJ5IGlzIG5vdCBpbiBTVEEgbW9kZSIpKTsKKwkJICAgICAgICkKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEFkZEJzc1JlcSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJwQWRkQnNzUmVxIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisJcE1sbVJlYXNzb2NSZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodExpbU1sbVJlYXNzb2NSZXEpKTsKKwlpZiAoTlVMTCA9PSBwTWxtUmVhc3NvY1JlcSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiY2FsbCB0byBBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIG1sbVJlYXNzb2NSZXEiKSk7CisJCXJldHVybjsKKwl9CisKKwljZGZfbWVtX2NvcHkocE1sbVJlYXNzb2NSZXEtPnBlZXJNYWNBZGRyLAorCQkgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQsCisJCQkgICAgICh1aW50MzJfdCAqKSAmcE1sbVJlYXNzb2NSZXEtPnJlYXNzb2NGYWlsdXJlVGltZW91dCkKKwkgICAgIT0gZVNJUl9TVUNDRVNTKSB7CisJCS8qKgorCQkgKiBDb3VsZCBub3QgZ2V0IFJlYXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZQorCQkgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorCQkgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBSZWFzc29jRmFpbHVyZVRpbWVvdXQgdmFsdWUiKSk7CisJCWNkZl9tZW1fZnJlZShwTWxtUmVhc3NvY1JlcSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2ZnX2dldF9jYXBhYmlsaXR5X2luZm8ocE1hYywgJmNhcHMsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykgeworCQkvKioKKwkJICogQ291bGQgbm90IGdldCBDYXBhYmlsaXRpZXMgdmFsdWUKKwkJICogZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJICovCisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBDYXBhYmlsaXRpZXMgdmFsdWUiKSk7CisJCWNkZl9tZW1fZnJlZShwTWxtUmVhc3NvY1JlcSk7CisJCXJldHVybjsKKwl9CisJcE1sbVJlYXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvID0gY2FwczsKKworCS8qIFVwZGF0ZSBQRSBzZXNzaW9uSWQgKi8KKwlwTWxtUmVhc3NvY1JlcS0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKwkvKiBJZiB0ZWxlc2NvcGljIGJlYWNvbmluZyBpcyBlbmFibGVkLCBzZXQgbGlzdGVuIGludGVydmFsCisJICAgdG8gV05JX0NGR19URUxFX0JDTl9NQVhfTEkKKwkgKi8KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTiwgJnRlbGVCY25FbikgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJDb3VsZG4ndCBnZXQgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU4iKSk7CisJCWNkZl9tZW1fZnJlZShwTWxtUmVhc3NvY1JlcSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodGVsZUJjbkVuKSB7CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJLCAmdmFsKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQkvKioKKwkJCSAqIENvdWxkIG5vdCBnZXQgTGlzdGVuSW50ZXJ2YWwgdmFsdWUKKwkJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIExpc3RlbkludGVydmFsIikpOworCQkJY2RmX21lbV9mcmVlKHBNbG1SZWFzc29jUmVxKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMLCAmdmFsKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQkvKioKKwkJCSAqIENvdWxkIG5vdCBnZXQgTGlzdGVuSW50ZXJ2YWwgdmFsdWUKKwkJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIExpc3RlbkludGVydmFsIikpOworCQkJY2RmX21lbV9mcmVlKHBNbG1SZWFzc29jUmVxKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAobGltX3NldF9saW5rX3N0YXRlCisJCSAgICAocE1hYywgZVNJUl9MSU5LX1BSRUFTU09DX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKwkJICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJY2RmX21lbV9mcmVlKHBNbG1SZWFzc29jUmVxKTsKKwkJcmV0dXJuOworCX0KKworCXBNbG1SZWFzc29jUmVxLT5saXN0ZW5JbnRlcnZhbCA9ICh1aW50MTZfdCkgdmFsOworCXBzZXNzaW9uRW50cnktPnBMaW1NbG1SZWFzc29jUmVxID0gcE1sbVJlYXNzb2NSZXE7CisKKwkvKiB3ZSBuZWVkIHRvIGRlZmVyIHRoZSBtZXNzYWdlIHVudGlsIHdlIGdldCB0aGUgcmVzcG9uc2UgYmFjayBmcm9tIEhBTCAqLworCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKworCW1zZ1EudHlwZSA9IFNJUl9IQUxfQUREX0JTU19SRVE7CisJbXNnUS5yZXNlcnZlZCA9IDA7CisJbXNnUS5ib2R5cHRyID0gcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEFkZEJzc1JlcTsKKwltc2dRLmJvZHl2YWwgPSAwOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgU0lSX0hBTF9BRERfQlNTX1JFUS4uLiIpKTsKKyNlbmRpZgorCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBtc2dRLnR5cGUpKTsKKwlyZXRDb2RlID0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ1EpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkgeworCQljZGZfbWVtX2ZyZWUocHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEFkZEJzc1JlcSk7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJQb3N0aW5nIEFERF9CU1NfUkVRIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWCIpLAorCQkJcmV0Q29kZSk7CisJfQorCisJcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEFkZEJzc1JlcSA9IE5VTEw7CisJcmV0dXJuOworfQorCisvKgorICogbGltX3Byb2Nlc3NfZnRfcHJlYXV0aF9yc3BfdGltZW91dCgpIC0gcHJvY2VzcyBmdCBwcmVhdXRoIHJzcCB0aW1lb3V0CisgKgorICogQG1hY19jdHg6CQlnbG9iYWwgbWFjIGN0eAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHByZWF1dGggcmVzcG9uc2UgaXMgbm90IHJlY2VpdmVkIGZyb20gdGhlIEFQCisgKiB3aXRoaW4gdGhpcyB0aW1lb3V0IHdoaWxlIEZUIGluIHByb2dyZXNzCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfZnRfcHJlYXV0aF9yc3BfdGltZW91dCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4KQoreworCXRwUEVTZXNzaW9uIHNlc3Npb247CisKKwkvKgorCSAqIFdlIGhhdmUgZmFpbGVkIHByZSBhdXRoLiBXZSBuZWVkIHRvIHJlc3VtZSBsaW5rIGFuZCBnZXQgYmFjayBvbgorCSAqIGhvbWUgY2hhbm5lbAorCSAqLworCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkZUIFByZS1BdXRoIFRpbWUgT3V0ISEhISIpKTsKKwlzZXNzaW9uID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQobWFjX2N0eCwKKwkJCW1hY19jdHgtPmxpbS5saW1UaW1lcnMuZ0xpbUZUUHJlQXV0aFJzcFRpbWVyLnNlc3Npb25JZCk7CisJaWYgKE5VTEwgPT0gc2Vzc2lvbikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEIikpOworCQlyZXR1cm47CisJfQorCisJLyogTm90aGluZyB0byBiZSBkb25lIGlmIHRoZSBzZXNzaW9uIGlzIG5vdCBpbiBTVEEgbW9kZSAqLworCWlmICghTElNX0lTX1NUQV9ST0xFKHNlc3Npb24pKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJzZXNzaW9uIGlzIG5vdCBpbiBTVEEgbW9kZSIpKTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJLyogUmVzZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgcHJlYXV0aCByZXF1ZXN0IHNlc3Npb24gKi8KKwlzZXNzaW9uLT5mdFBFQ29udGV4dC5mdFByZUF1dGhTZXNzaW9uID0gZmFsc2U7CisKKwlpZiAoTlVMTCA9PSBzZXNzaW9uLT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJwRlRQcmVBdXRoUmVxIGlzIE5VTEwuIEF1dGggUnNwIG1pZ2h0IGFscmVhZHkgYmUgcG9zdGVkIHRvIFNNRSBhbmQgZnRjbGVhbnVwIGRvbmUhIHNlc3Npb25JZDolZCIpLAorCQkJbWFjX2N0eC0+bGltLmxpbVRpbWVycy5nTGltRlRQcmVBdXRoUnNwVGltZXIuc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVG8gaGFuZGxlIHRoZSByYWNlIGNvbmRpdGlvbiB3aGVyZSB3ZSByZWNpZXZlIHByZWF1dGggcnNwIGFmdGVyCisJICogdGltZXIgaGFzIGV4cGlyZWQuCisJICovCisJaWYgKHRydWUgPT0KKwkgICAgc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+YlByZUF1dGhSc3BQcm9jZXNzZWQpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkF1dGggcnNwIGFscmVhZHkgcG9zdGVkIHRvIFNNRSAoc2Vzc2lvbiAlcCkiKSwKKwkJCXNlc3Npb24pOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGVyZSB3ZSBhcmUgc2VuZGluZyBwcmVhdXRoIHJzcCB3aXRoIGZhaWx1cmUgc3RhdGUKKwkJICogYW5kIHdoaWNoIGlzIGZvcndhcmRlZCB0byBTTUUuIE5vdywgaWYgd2UgcmVjZWl2ZSBhbiBwcmVhdXRoCisJCSAqIHJlc3AgZnJvbSBBUCB3aXRoIHN1Y2Nlc3MgaXQgd291bGQgY3JlYXRlIGEgRlQgcGVzZXNzaW9uLCBidXQKKwkJICogd2lsbCBiZSBkcm9wcGVkIGluIFNNRSBsZWF2aW5nIGJlaGluZCB0aGUgcGVzZXNzaW9uLiBNYXJrCisJCSAqIFByZWF1dGggcnNwIHByb2Nlc3NlZCBzbyB0aGF0IGFueSByc3AgZnJvbSBBUCBpcyBkcm9wcGVkIGluCisJCSAqIGxpbV9wcm9jZXNzX2F1dGhfZnJhbWVfbm9fc2Vzc2lvbi4KKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJBdXRoIHJzcCBub3QgeWV0IHBvc3RlZCB0byBTTUUgKHNlc3Npb24gJXApIiksCisJCQlzZXNzaW9uKTsKKwkJc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+YlByZUF1dGhSc3BQcm9jZXNzZWQgPSB0cnVlOworCX0KKworCS8qCisJICogQXR0ZW1wdGVkIGF0IFByZS1BdXRoIGFuZCBmYWlsZWQuIElmIHdlIGFyZSBvZmYgY2hhbm5lbC4gV2UgbmVlZAorCSAqIHRvIGdldCBiYWNrIHRvIGhvbWUgY2hhbm5lbAorCSAqLworCWxpbV9oYW5kbGVfZnRfcHJlX2F1dGhfcnNwKG1hY19jdHgsIGVTSVJfRkFJTFVSRSwgTlVMTCwgMCwgc2Vzc2lvbik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyB0aGUgdXBkYXRlIGtleSByZXF1ZXN0IGZyb20gU01FCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworYm9vbCBsaW1fcHJvY2Vzc19mdF91cGRhdGVfa2V5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmKQoreworCXRBZGRCc3NQYXJhbXMgKnBBZGRCc3NQYXJhbXM7CisJdFNpckZUVXBkYXRlS2V5SW5mbyAqcEtleUluZm87CisJdWludDMyX3QgdmFsID0gMDsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCisJLyogU2FuaXR5IENoZWNrICovCisJaWYgKHBNYWMgPT0gTlVMTCB8fCBwTXNnQnVmID09IE5VTEwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXBLZXlJbmZvID0gKHRTaXJGVFVwZGF0ZUtleUluZm8gKikgcE1zZ0J1ZjsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywgcEtleUluZm8tPmJzc0lkLCAmc2Vzc2lvbklkKTsKKwlpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkgICAgICAgIiVzOiBVbmFibGUgdG8gZmluZCBzZXNzaW9uIGZvciB0aGUgZm9sbG93aW5nIGJzc2lkIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCSAgICAgICApCisJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwS2V5SW5mby0+YnNzSWQsIExPR0UpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogTm90aGluZyB0byBiZSBkb25lIGlmIHRoZSBzZXNzaW9uIGlzIG5vdCBpbiBTVEEgbW9kZSAqLworCWlmICghTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgicHNlc3Npb25FbnRyeSBpcyBub3QgaW4gU1RBIG1vZGUiKSk7CisJCSAgICAgICApCisjZW5kaWYKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChOVUxMID09IHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBBZGRCc3NSZXEpIHsKKwkJLyogQWRkQnNzIFJlcSBpcyBOVUxMLCBzYXZlIHRoZSBrZXlzIHRvIGNvbmZpZ3VyZSB0aGVtIGxhdGVyLiAqLworCQl0cExpbU1sbVNldEtleXNSZXEgcE1sbVNldEtleXNSZXEgPQorCQkJJnBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LlByZUF1dGhLZXlJbmZvLgorCQkJZXh0U2V0U3RhS2V5UGFyYW07CisKKwkJY2RmX21lbV96ZXJvKHBNbG1TZXRLZXlzUmVxLCBzaXplb2YodExpbU1sbVNldEtleXNSZXEpKTsKKwkJY2RmX21lbV9jb3B5KHBNbG1TZXRLZXlzUmVxLT5wZWVyTWFjQWRkciwgcEtleUluZm8tPmJzc0lkLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcE1sbVNldEtleXNSZXEtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCQlwTWxtU2V0S2V5c1JlcS0+c21lc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCQlwTWxtU2V0S2V5c1JlcS0+ZWRUeXBlID0gcEtleUluZm8tPmtleU1hdGVyaWFsLmVkVHlwZTsKKwkJcE1sbVNldEtleXNSZXEtPm51bUtleXMgPSBwS2V5SW5mby0+a2V5TWF0ZXJpYWwubnVtS2V5czsKKwkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwTWxtU2V0S2V5c1JlcS0+a2V5LAorCQkJICAgICAodWludDhfdCAqKSAmcEtleUluZm8tPmtleU1hdGVyaWFsLmtleSwKKwkJCSAgICAgc2l6ZW9mKHRTaXJLZXlzKSk7CisKKwkJcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQuUHJlQXV0aEtleUluZm8uCisJCWV4dFNldFN0YUtleVBhcmFtVmFsaWQgPSB0cnVlOworCisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoInBBZGRCc3NSZXEgaXMgTlVMTCIpKTsKKworCQlpZiAocHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEFkZFN0YVJlcSA9PSBOVUxMKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJwQWRkU3RhUmVxIGlzIE5VTEwiKSk7CisJCQlsaW1fc2VuZF9zZXRfc3RhX2tleV9yZXEocE1hYywgcE1sbVNldEtleXNSZXEsIDAsIDAsCisJCQkJCQkgcHNlc3Npb25FbnRyeSwgZmFsc2UpOworCQkJcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQuUHJlQXV0aEtleUluZm8uCisJCQlleHRTZXRTdGFLZXlQYXJhbVZhbGlkID0gZmFsc2U7CisJCX0KKwl9IGVsc2UgeworCQlwQWRkQnNzUGFyYW1zID0gcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEFkZEJzc1JlcTsKKworCQkvKiBTdG9yZSB0aGUga2V5IGluZm9ybWF0aW9uIGluIHRoZSBBREQgQlNTIHBhcmFtZXRlcnMgKi8KKwkJcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW1WYWxpZCA9IDE7CisJCXBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmVuY1R5cGUgPQorCQkJcEtleUluZm8tPmtleU1hdGVyaWFsLmVkVHlwZTsKKwkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXksCisJCQkgICAgICh1aW50OF90ICopICZwS2V5SW5mby0+a2V5TWF0ZXJpYWwua2V5LAorCQkJICAgICBzaXplb2YodFNpcktleXMpKTsKKwkJaWYgKGVTSVJfU1VDQ0VTUyAhPQorCQkgICAgd2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1NJTkdMRV9USURfUkMsICZ2YWwpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIlVuYWJsZSB0byByZWFkIFdOSV9DRkdfU0lOR0xFX1RJRF9SQyIpKTsKKwkJfQorCisJCXBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLnNpbmdsZVRpZFJjID0gdmFsOworCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiS2V5IHZhbGlkICVkIiksCisJCQkgICAgICAgcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW1WYWxpZCwKKwkJCSAgICAgICBwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlbMF0uCisJCQkgICAgICAga2V5TGVuZ3RoKTsKKwkJICAgICAgICkKKworCQlwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5zdGFJZHggPSAwOworCisJCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkgICAgICAgRkwoIkJTU0lEID0gIiBNQUNfQUREUkVTU19TVFIpLAorCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBLZXlJbmZvLT5ic3NJZCkpOworCQkgICAgICAgKQorCisJCXNpcl9jb3B5X21hY19hZGRyKHBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLnBlZXJNYWNBZGRyLAorCQkJCSAgcEtleUluZm8tPmJzc0lkKTsKKworCQlwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5zZW5kUnNwID0gZmFsc2U7CisKKwkJaWYgKHBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleVswXS5rZXlMZW5ndGggPT0gMTYpIHsKKwkJCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoIkJTUyBrZXkgPSAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSAiCisJCQkJCSAgICAgICAiJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgiKSwKKwkJCQkgICAgICAgcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5WzBdLgorCQkJCSAgICAgICBrZXlbMF0sCisJCQkJICAgICAgIHBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleVswXS4KKwkJCQkgICAgICAga2V5WzFdLAorCQkJCSAgICAgICBwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlbMF0uCisJCQkJICAgICAgIGtleVsyXSwKKwkJCQkgICAgICAgcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5WzBdLgorCQkJCSAgICAgICBrZXlbM10sCisJCQkJICAgICAgIHBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleVswXS4KKwkJCQkgICAgICAga2V5WzRdLAorCQkJCSAgICAgICBwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlbMF0uCisJCQkJICAgICAgIGtleVs1XSwKKwkJCQkgICAgICAgcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5WzBdLgorCQkJCSAgICAgICBrZXlbNl0sCisJCQkJICAgICAgIHBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleVswXS4KKwkJCQkgICAgICAga2V5WzddLAorCQkJCSAgICAgICBwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlbMF0uCisJCQkJICAgICAgIGtleVs4XSwKKwkJCQkgICAgICAgcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5WzBdLgorCQkJCSAgICAgICBrZXlbOV0sCisJCQkJICAgICAgIHBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleVswXS4KKwkJCQkgICAgICAga2V5WzEwXSwKKwkJCQkgICAgICAgcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5WzBdLgorCQkJCSAgICAgICBrZXlbMTFdLAorCQkJCSAgICAgICBwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlbMF0uCisJCQkJICAgICAgIGtleVsxMl0sCisJCQkJICAgICAgIHBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleVswXS4KKwkJCQkgICAgICAga2V5WzEzXSwKKwkJCQkgICAgICAgcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5WzBdLgorCQkJCSAgICAgICBrZXlbMTRdLAorCQkJCSAgICAgICBwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlbMF0uCisJCQkJICAgICAgIGtleVsxNV0pOworCQkJICAgICAgICkKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZAorbGltX2Z0X3NlbmRfYWdncl9xb3NfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgcnNwUmVxZCwKKwkJCSB0cEFnZ3JBZGRUc1BhcmFtcyBhZ2dyUW9zUnNwLCB1aW50OF90IHNtZXNlc3Npb25JZCkKK3sKKwl0cFNpckFnZ3JRb3NSc3AgcnNwOworCWludCBpID0gMDsKKwlpZiAoIXJzcFJlcWQpIHsKKwkJcmV0dXJuOworCX0KKwlyc3AgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpckFnZ3JRb3NSc3ApKTsKKwlpZiAoTlVMTCA9PSByc3ApIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIkFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgdFNpckFnZ3JRb3NSc3AiKSk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcnNwLCBzaXplb2YoKnJzcCksIDApOworCXJzcC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9GVF9BR0dSX1FPU19SU1A7CisJcnNwLT5zZXNzaW9uSWQgPSBzbWVzZXNzaW9uSWQ7CisJcnNwLT5sZW5ndGggPSBzaXplb2YoKnJzcCk7CisJcnNwLT5hZ2dySW5mby50c3BlY0lkeCA9IGFnZ3JRb3NSc3AtPnRzcGVjSWR4OworCWZvciAoaSA9IDA7IGkgPCBTSVJfUU9TX05VTV9BQ19NQVg7IGkrKykgeworCQlpZiAoKDEgPDwgaSkgJiBhZ2dyUW9zUnNwLT50c3BlY0lkeCkgeworCQkJcnNwLT5hZ2dySW5mby5hZ2dyUnNwW2ldLnN0YXR1cyA9IGFnZ3JRb3NSc3AtPnN0YXR1c1tpXTsKKwkJCXJzcC0+YWdnckluZm8uYWdnclJzcFtpXS50c3BlYyA9IGFnZ3JRb3NSc3AtPnRzcGVjW2ldOworCQl9CisJfQorCWxpbV9zZW5kX3NtZV9hZ2dyX3Fvc19yc3AocE1hYywgcnNwLCBzbWVzZXNzaW9uSWQpOworCXJldHVybjsKK30KK3ZvaWQgbGltX3Byb2Nlc3NfZnRfYWdncl9xb19zX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKQoreworCXRwQWdnckFkZFRzUGFyYW1zIHBBZ2dyUW9zUnNwTXNnID0gTlVMTDsKKwl0QWRkVHNQYXJhbXMgYWRkVHNQYXJhbSA9IHsgMCB9OworCXRwRHBoSGFzaE5vZGUgcFN0YSA9IE5VTEw7CisJdWludDE2X3QgYXNzb2NJZCA9IDA7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisJdWludDhfdCByc3BSZXFkID0gMTsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKwlpbnQgaSA9IDA7CisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoIiBSZWNlaXZlZCBBR0dSX1FPU19SU1AgZnJvbSBIQUwiKSk7KQorCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCXBBZ2dyUW9zUnNwTXNnID0gKHRwQWdnckFkZFRzUGFyYW1zKSAobGltTXNnLT5ib2R5cHRyKTsKKwlpZiAoTlVMTCA9PSBwQWdnclFvc1JzcE1zZykgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiTlVMTCBwQWdnclFvc1JzcE1zZyIpKTspCisJCXJldHVybjsKKwl9CisJcHNlc3Npb25FbnRyeSA9CisJCXBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKHBNYWMsIHBBZ2dyUW9zUnNwTXNnLT5zZXNzaW9uSWQpOworCWlmIChOVUxMID09IHBzZXNzaW9uRW50cnkpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTCgiQ2FudCBmaW5kIHNlc3Npb24gZW50cnkgZm9yICVzIiksIF9fZnVuY19fKTsKKwkJICAgICAgICkKKwkJaWYgKHBBZ2dyUW9zUnNwTXNnICE9IE5VTEwpIHsKKwkJCWNkZl9tZW1fZnJlZShwQWdnclFvc1JzcE1zZyk7CisJCX0KKwkJcmV0dXJuOworCX0KKwlpZiAoIUxJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoInBzZXNzaW9uRW50cnkgaXMgbm90IGluIFNUQSBtb2RlIikpOworCQkgICAgICAgKQorI2VuZGlmCisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IEhBTF9RT1NfTlVNX0FDX01BWDsgaSsrKSB7CisJCWlmICgoKCgxIDw8IGkpICYgcEFnZ3JRb3NSc3BNc2ctPnRzcGVjSWR4KSkgJiYKKwkJICAgIChwQWdnclFvc1JzcE1zZy0+c3RhdHVzW2ldICE9IENERl9TVEFUVVNfU1VDQ0VTUykpIHsKKwkJCXNpcl9jb3B5X21hY19hZGRyKHBlZXJNYWNBZGRyLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisJCQlhZGRUc1BhcmFtLnN0YUlkeCA9IHBBZ2dyUW9zUnNwTXNnLT5zdGFJZHg7CisJCQlhZGRUc1BhcmFtLnNlc3Npb25JZCA9IHBBZ2dyUW9zUnNwTXNnLT5zZXNzaW9uSWQ7CisJCQlhZGRUc1BhcmFtLnRzcGVjID0gcEFnZ3JRb3NSc3BNc2ctPnRzcGVjW2ldOworCQkJYWRkVHNQYXJhbS50c3BlY0lkeCA9IHBBZ2dyUW9zUnNwTXNnLT50c3BlY0lkeDsKKwkJCWxpbV9zZW5kX2RlbHRzX3JlcV9hY3Rpb25fZnJhbWUocE1hYywgcGVlck1hY0FkZHIsIHJzcFJlcWQsCisJCQkJCQkJJmFkZFRzUGFyYW0udHNwZWMudHNpbmZvLAorCQkJCQkJCSZhZGRUc1BhcmFtLnRzcGVjLAorCQkJCQkJCXBzZXNzaW9uRW50cnkpOworCQkJcFN0YSA9CisJCQkJZHBoX2xvb2t1cF9hc3NvY19pZChwTWFjLCBhZGRUc1BhcmFtLnN0YUlkeCwgJmFzc29jSWQsCisJCQkJCQkgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQkJaWYgKHBTdGEgIT0gTlVMTCkgeworCQkJCWxpbV9hZG1pdF9jb250cm9sX2RlbGV0ZV90cyhwTWFjLCBhc3NvY0lkLAorCQkJCQkJCSAgICAmYWRkVHNQYXJhbS50c3BlYy4KKwkJCQkJCQkgICAgdHNpbmZvLCBOVUxMLAorCQkJCQkJCSAgICAodWludDhfdCAqKSAmCisJCQkJCQkJICAgIGFkZFRzUGFyYW0udHNwZWNJZHgpOworCQkJfQorCQl9CisJfQorCWxpbV9mdF9zZW5kX2FnZ3JfcW9zX3JzcChwTWFjLCByc3BSZXFkLCBwQWdnclFvc1JzcE1zZywKKwkJCQkgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkKTsKKwlpZiAocEFnZ3JRb3NSc3BNc2cgIT0gTlVMTCkgeworCQljZGZfbWVtX2ZyZWUocEFnZ3JRb3NSc3BNc2cpOworCX0KKwlyZXR1cm47Cit9Cit0U2lyUmV0U3RhdHVzIGxpbV9wcm9jZXNzX2Z0X2FnZ3JfcW9zX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwl0U2lyTXNnUSBtc2c7CisJdFNpckFnZ3JRb3NSZXEgKmFnZ3JRb3NSZXEgPSAodFNpckFnZ3JRb3NSZXEgKikgcE1zZ0J1ZjsKKwl0cEFnZ3JBZGRUc1BhcmFtcyBwQWdnckFkZFRzUGFyYW07CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9IE5VTEw7CisJdHBMaW1Uc3BlY0luZm8gdHNwZWNJbmZvOworCXVpbnQ4X3QgYWM7CisJdHBEcGhIYXNoTm9kZSBwU3RhOworCXVpbnQxNl90IGFpZDsKKwl1aW50OF90IHNlc3Npb25JZDsKKwlpbnQgaTsKKworCXBBZ2dyQWRkVHNQYXJhbSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0QWdnckFkZFRzUGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gcEFnZ3JBZGRUc1BhcmFtKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZCIpKTspCisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJfQorCisJcHNlc3Npb25FbnRyeSA9CisJCXBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChwTWFjLCBhZ2dyUW9zUmVxLT5ic3NJZCwgJnNlc3Npb25JZCk7CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwoInBzZXNzaW9uIEVudHJ5IE51bGwgZm9yIHNlc3Npb25JZCA9ICVkIiksCisJCQkgICAgICAgYWdnclFvc1JlcS0+c2Vzc2lvbklkKTsKKwkJICAgICAgICkKKwkJY2RmX21lbV9mcmVlKHBBZ2dyQWRkVHNQYXJhbSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJLyogTm90aGluZyB0byBiZSBkb25lIGlmIHRoZSBzZXNzaW9uIGlzIG5vdCBpbiBTVEEgbW9kZSAqLworCWlmICghTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgicHNlc3Npb25FbnRyeSBpcyBub3QgaW4gU1RBIG1vZGUiKSk7CisJCSAgICAgICApCisjZW5kaWYKKwkJY2RmX21lbV9mcmVlKHBBZ2dyQWRkVHNQYXJhbSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJcFN0YSA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLCBhZ2dyUW9zUmVxLT5ic3NJZCwgJmFpZCwKKwkJCQkgICAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAocFN0YSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJTdGF0aW9uIGNvbnRleHQgbm90IGZvdW5kIC0gaWdub3JpbmcgQWRkVHNSc3AiKSk7CisJCSAgICAgICApCisJCWNkZl9tZW1fZnJlZShwQWdnckFkZFRzUGFyYW0pOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBBZ2dyQWRkVHNQYXJhbSwgc2l6ZW9mKHRBZ2dyQWRkVHNQYXJhbXMpLCAwKTsKKwlwQWdnckFkZFRzUGFyYW0tPnN0YUlkeCA9IHBzZXNzaW9uRW50cnktPnN0YUlkOworCS8qIEZpbGwgaW4gdGhlIHNlc3Npb25JZCBzcGVjaWZpYyB0byBQRSAqLworCXBBZ2dyQWRkVHNQYXJhbS0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCXBBZ2dyQWRkVHNQYXJhbS0+dHNwZWNJZHggPSBhZ2dyUW9zUmVxLT5hZ2dySW5mby50c3BlY0lkeDsKKworCWZvciAoaSA9IDA7IGkgPCBIQUxfUU9TX05VTV9BQ19NQVg7IGkrKykgeworCQlpZiAoYWdnclFvc1JlcS0+YWdnckluZm8udHNwZWNJZHggJiAoMSA8PCBpKSkgeworCQkJdFNpck1hY1RzcGVjSUUgKnBUc3BlYyA9CisJCQkJJmFnZ3JRb3NSZXEtPmFnZ3JJbmZvLmFnZ3JBZGRUc0luZm9baV0udHNwZWM7CisJCQkvKiBTaW5jZSBBZGRUUyByZXNwb25zZSB3YXMgc3VjY2Vzc2Z1bCwgY2hlY2sgZm9yIHRoZSBQU0IgZmxhZworCQkJICogYW5kIGRpcmVjdGlvbmFsIGZsYWcgaW5zaWRlIHRoZSBUUyBJbmZvIGZpZWxkLgorCQkJICogQW4gQUMgaXMgdHJpZ2dlciBlbmFibGVkIEFDIGlmIHRoZSBQU0Igc3ViZmllbGQgaXMgc2V0IHRvIDEKKwkJCSAqIGluIHRoZSB1cGxpbmsgZGlyZWN0aW9uLgorCQkJICogQW4gQUMgaXMgZGVsaXZlcnkgZW5hYmxlZCBBQyBpZiB0aGUgUFNCIHN1YmZpZWxkIGlzIHNldCB0byAxCisJCQkgKiBpbiB0aGUgZG93bmxpbmsgZGlyZWN0aW9uLgorCQkJICogQW4gQUMgaXMgdHJpZ2dlciBhbmQgZGVsaXZlcnkgZW5hYmxlZCBBQyBpZiB0aGUgUFNCIHN1YmZpZWxkCisJCQkgKiBpcyBzZXQgdG8gMSBpbiB0aGUgYmktZGlyZWN0aW9uIGZpZWxkLgorCQkJICovCisJCQlpZiAocFRzcGVjLT50c2luZm8udHJhZmZpYy5wc2IgPT0gMSkgeworCQkJCWxpbV9zZXRfdHNwZWNfdWFwc2RfbWFza19wZXJfc2Vzc2lvbihwTWFjLAorCQkJCQkJCQkgICAgIHBzZXNzaW9uRW50cnksCisJCQkJCQkJCSAgICAgJnBUc3BlYy0+CisJCQkJCQkJCSAgICAgdHNpbmZvLAorCQkJCQkJCQkgICAgIFNFVF9VQVBTRF9NQVNLKTsKKwkJCX0gZWxzZSB7CisJCQkJbGltX3NldF90c3BlY191YXBzZF9tYXNrX3Blcl9zZXNzaW9uKHBNYWMsCisJCQkJCQkJCSAgICAgcHNlc3Npb25FbnRyeSwKKwkJCQkJCQkJICAgICAmcFRzcGVjLT4KKwkJCQkJCQkJICAgICB0c2luZm8sCisJCQkJCQkJCSAgICAgQ0xFQVJfVUFQU0RfTUFTSyk7CisJCQl9CisJCQkvKgorCQkJICogQUREVFMgc3VjY2Vzcywgc28gQUMgaXMgbm93IGFkbWl0dGVkLgorCQkJICogV2Ugc2hhbGwgbm93IHVzZSB0aGUgZGVmYXVsdAorCQkJICogRURDQSBwYXJhbWV0ZXJzIGFzIGFkdmVydGlzZWQgYnkgQVAgYW5kCisJCQkgKiBzZW5kIHRoZSB1cGRhdGVkIEVEQ0EgcGFyYW1zCisJCQkgKiB0byBIQUwuCisJCQkgKi8KKwkJCWFjID0gdXBUb0FjKHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMudXNlclByaW8pOworCQkJaWYgKHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID09CisJCQkgICAgU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LKSB7CisJCQkJcHNlc3Npb25FbnRyeS0+CisJCQkJZ0FjQWRtaXRNYXNrCisJCQkJW1NJUl9NQUNfRElSRUNUSU9OX1VQTElOS10gfD0KKwkJCQkJKDEgPDwgYWMpOworCQkJfSBlbHNlIGlmIChwVHNwZWMtPnRzaW5mby50cmFmZmljLmRpcmVjdGlvbiA9PQorCQkJCSAgIFNJUl9NQUNfRElSRUNUSU9OX0ROTElOSykgeworCQkJCXBzZXNzaW9uRW50cnktPgorCQkJCWdBY0FkbWl0TWFzaworCQkJCVtTSVJfTUFDX0RJUkVDVElPTl9ETkxJTktdIHw9CisJCQkJCSgxIDw8IGFjKTsKKwkJCX0gZWxzZSBpZiAocFRzcGVjLT50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24gPT0KKwkJCQkgICBTSVJfTUFDX0RJUkVDVElPTl9CSURJUikgeworCQkJCXBzZXNzaW9uRW50cnktPgorCQkJCWdBY0FkbWl0TWFzaworCQkJCVtTSVJfTUFDX0RJUkVDVElPTl9VUExJTktdIHw9CisJCQkJCSgxIDw8IGFjKTsKKwkJCQlwc2Vzc2lvbkVudHJ5LT4KKwkJCQkJZ0FjQWRtaXRNYXNrCisJCQkJCVtTSVJfTUFDX0RJUkVDVElPTl9ETkxJTktdIHw9CisJCQkJCSgxIDw8IGFjKTsKKwkJCX0KKwkJCWxpbV9zZXRfYWN0aXZlX2VkY2FfcGFyYW1zKHBNYWMsCisJCQkJCQkgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtcywKKwkJCQkJCSAgIHBzZXNzaW9uRW50cnkpOworCisJCQkJbGltX3NlbmRfZWRjYV9wYXJhbXMocE1hYywKKwkJCQkJICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwKKwkJCQkJICAgICBwU3RhLT5ic3NJZCk7CisKKwkJCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkJCSAgICBsaW1fdHNwZWNfYWRkKHBNYWMsIHBTdGEtPnN0YUFkZHIsIHBTdGEtPmFzc29jSWQsCisJCQkJCSAgcFRzcGVjLCAwLCAmdHNwZWNJbmZvKSkgeworCQkJCVBFTE9HRShsaW1fbG9nCisJCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkJICAgICAgIEZMCisJCQkJCQkgICAgICAgKCJBZGRpbmcgZW50cnkgaW4gbGltIFRzcGVjIFRhYmxlIGZhaWxlZCAiKSk7CisJCQkJICAgICAgICkKKwkJCQlwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCA9IGZhbHNlOworCQkJCWNkZl9tZW1fZnJlZShwQWdnckFkZFRzUGFyYW0pOworCQkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCQl9CisKKwkJCXBBZ2dyQWRkVHNQYXJhbS0+dHNwZWNbaV0gPQorCQkJCWFnZ3JRb3NSZXEtPmFnZ3JJbmZvLmFnZ3JBZGRUc0luZm9baV0udHNwZWM7CisJCX0KKwl9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJaWYgKCFwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRFbmFibGVkIHx8CisJICAgIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRFbmFibGVkICYmCisJICAgICAhcHNlc3Npb25FbnRyeS0+aXMxMVJjb25uZWN0aW9uKSkKKyNlbmRpZgorCXsKKwltc2cudHlwZSA9IFdNQV9BR0dSX1FPU19SRVE7CisJbXNnLmJvZHlwdHIgPSBwQWdnckFkZFRzUGFyYW07CisJbXNnLmJvZHl2YWwgPSAwOworCisJLyogV2UgbmVlZCB0byBkZWZlciBhbnkgaW5jb21pbmcgbWVzc2FnZXMgdW50aWwgd2UgZ2V0IGEKKwkgKiBXTUFfQUdHUl9RT1NfUlNQIGZyb20gSEFMLgorCSAqLworCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbXNnLnR5cGUpKTsKKworCWlmIChlU0lSX1NVQ0NFU1MgIT0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZykpIHsKKwkJCVBFTE9HVyhsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dXLCBGTCgid21hX3Bvc3RfY3RybF9tc2coKSBmYWlsZWQiKSk7CisJCQkgICAgICAgKQorCQkJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisJCQljZGZfbWVtX2ZyZWUocEFnZ3JBZGRUc1BhcmFtKTsKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCX0KKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWVsc2UgeworCQkvKiBJbXBsaWVzIGl0IGlzIGEgTEZSMy4wIGJhc2VkIDExciBjb25uZWN0aW9uCisJCSAqIHNvIGRvbm90IHNlbmQgYWRkIHRzIHJlcXVlc3QgdG8gZmltd2FyZSBzaW5jZSBpdAorCQkgKiBhbHJlYWR5IGhhcyB0aGUgUklDIElFcyAqLworCisJCS8qIFNlbmQgdGhlIEFnZ3IgUW9TIHJlc3BvbnNlIHRvIFNNRSAqLworCQlsaW1fZnRfc2VuZF9hZ2dyX3Fvc19yc3AocE1hYywgdHJ1ZSwgcEFnZ3JBZGRUc1BhcmFtLAorCQkJCQkgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkKTsKKwkJaWYgKHBBZ2dyQWRkVHNQYXJhbSAhPSBOVUxMKSB7CisJCQljZGZfbWVtX2ZyZWUocEFnZ3JBZGRUc1BhcmFtKTsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9pYnNzX3BlZXJfbWdtdC5jIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1faWJzc19wZWVyX21nbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmMzZGJhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1faWJzc19wZWVyX21nbXQuYwpAQCAtMCwwICsxLDE4MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgInNpcl9jb21tb24uaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3N0YV9oYXNoX2FwaS5oIgorI2luY2x1ZGUgInNjaF9hcGkuaCIgICAgICAgICAgICAgLyogc2NoX3NldF9maXhlZF9iZWFjb25fZmllbGRzIGZvciBJQlNTIGNvYWxlc2NlICovCisjaW5jbHVkZSAibGltX3NlY3VyaXR5X3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlbmRfbWVzc2FnZXMuaCIKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2luY2x1ZGUgImxpbV9mdF9kZWZzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbi5oIgorI2luY2x1ZGUgImxpbV9pYnNzX3BlZXJfbWdtdC5oIgorI2luY2x1ZGUgImxpbV90eXBlcy5oIgorCisvKioKKyAqIGlic3NfcGVlcl9maW5kCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgYWRkaW5nIGEgY29udGV4dCBhdAorICogRFBIICYgUG9sYXJpcyBmb3IgYSBwZWVyIGluIElCU1MuCisgKiBJZiBwZWVyIGlzIGZvdW5kIGluIHRoZSBsaXN0LCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUKKyAqIHJldHVybmVkIEJTUyBkZXNjcmlwdGlvbiBhcmUgdXNlZCBhdCBEUEggbm9kZSAmIFBvbGFyaXMuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIG1hY0FkZHIgLSBNQUMgYWRkcmVzcyBvZiB0aGUgcGVlcgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBwZWVyIG5vZGUgaWYgZm91bmQsIGVsc2UgTlVMTAorICovCisKK3N0YXRpYyB0TGltSWJzc1BlZXJOb2RlICppYnNzX3BlZXJfZmluZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl0U2lyTWFjQWRkciBtYWNBZGRyKQoreworCXRMaW1JYnNzUGVlck5vZGUgKnBUZW1wTm9kZSA9IHBNYWMtPmxpbS5nTGltSWJzc1BlZXJMaXN0OworCisJd2hpbGUgKHBUZW1wTm9kZSAhPSBOVUxMKSB7CisJCWlmIChjZGZfbWVtX2NvbXBhcmUoKHVpbnQ4X3QgKikgbWFjQWRkciwKKwkJCQkgICAgKHVpbnQ4X3QgKikgJnBUZW1wTm9kZS0+cGVlck1hY0FkZHIsCisJCQkJICAgIHNpemVvZih0U2lyTWFjQWRkcikpKQorCQkJYnJlYWs7CisJCXBUZW1wTm9kZSA9IHBUZW1wTm9kZS0+bmV4dDsKKwl9CisJcmV0dXJuIHBUZW1wTm9kZTsKK30gLyoqKiBlbmQgaWJzc19wZWVyX2ZpbmQoKSAqKiovCisKKy8qKgorICogaWJzc19wZWVyX2FkZAorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgaXMgY2FsbGVkIG9uIGEgU1RBIGluIElCU1MgdXBvbiByZWNlaXZpbmcgQmVhY29uLworICogUHJvYmUgUmVzcG9uc2UgZnJvbSBhIHBlZXIuCisgKgorICoqKkxPR0lDOgorICogTm9kZSBpcyBhbHdheXMgYWRkZWQgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwUGVlck5vZGUgLSBQb2ludGVyIHRvIHBlZXIgbm9kZSB0byBiZSBhZGRlZCB0byB0aGUgbGlzdC4KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdFNpclJldFN0YXR1cworaWJzc19wZWVyX2FkZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0TGltSWJzc1BlZXJOb2RlICpwUGVlck5vZGUpCit7CisjaWZkZWYgQU5JX1NJUl9JQlNTX1BFRVJfQ0FDSElORworCXVpbnQzMl90IG51bUlic3NQZWVycyA9ICgyICogcE1hYy0+bGltLm1heFN0YXRpb24pOworCisJaWYgKHBNYWMtPmxpbS5nTGltTnVtSWJzc1BlZXJzID49IG51bUlic3NQZWVycykgeworCQkvKioKKwkJICogUmVhY2hlZCBtYXggbnVtYmVyIG9mIHBlZXJzIHRvIGJlIG1haW50YWluZWQuCisJCSAqIERlbGV0ZSBsYXN0IGVudHJ5ICYgYWRkIG5ldyBlbnRyeSBhdCB0aGUgYmVnaW5uaW5nLgorCQkgKi8KKwkJdExpbUlic3NQZWVyTm9kZSAqcFRlbXAsICpwUHJldjsKKwkJcFRlbXAgPSBwUHJldiA9IHBNYWMtPmxpbS5nTGltSWJzc1BlZXJMaXN0OworCQl3aGlsZSAocFRlbXAtPm5leHQgIT0gTlVMTCkgeworCQkJcFByZXYgPSBwVGVtcDsKKwkJCXBUZW1wID0gcFRlbXAtPm5leHQ7CisJCX0KKwkJaWYgKHBUZW1wLT5iZWFjb24pIHsKKwkJCWNkZl9tZW1fZnJlZShwVGVtcC0+YmVhY29uKTsKKwkJfQorCisJCWNkZl9tZW1fZnJlZShwVGVtcCk7CisJCXBQcmV2LT5uZXh0ID0gTlVMTDsKKwl9IGVsc2UKKyNlbmRpZgorCXBNYWMtPmxpbS5nTGltTnVtSWJzc1BlZXJzKys7CisKKwlwUGVlck5vZGUtPm5leHQgPSBwTWFjLT5saW0uZ0xpbUlic3NQZWVyTGlzdDsKKwlwTWFjLT5saW0uZ0xpbUlic3NQZWVyTGlzdCA9IHBQZWVyTm9kZTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyoqKiBlbmQgbGltQWRkSWJzc1BlZXJUb0xpc3QoKSAqKiovCisKKy8qKgorICogaWJzc19wZWVyX2NvbGxlY3QKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGlzIGNhbGxlZCB0byBjb2xsZWN0IElCU1MgcGVlciBpbmZvcm1hdGlvbgorICogZnJvbSByZWNlaXZlZCBCZWFjb24vUHJvYmUgUmVzcG9uc2UgZnJhbWUgZnJvbSBpdC4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEJlYWNvbiAtIFBhcnNlZCBCZWFjb24gRnJhbWUgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBCRCAgICAgLSBQb2ludGVyIHRvIHJlY2VpdmVkIEJECisgKiBAcGFyYW0gIHBQZWVyICAgLSBQb2ludGVyIHRvIElCU1MgcGVlciBub2RlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2lic3NfcGVlcl9jb2xsZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgdHBTY2hCZWFjb25TdHJ1Y3QgcEJlYWNvbiwKKwkJICB0cFNpck1hY01nbXRIZHIgcEhkciwKKwkJICB0TGltSWJzc1BlZXJOb2RlICpwUGVlciwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwljZGZfbWVtX2NvcHkocFBlZXItPnBlZXJNYWNBZGRyLCBwSGRyLT5zYSwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlwUGVlci0+Y2FwYWJpbGl0eUluZm8gPSBwQmVhY29uLT5jYXBhYmlsaXR5SW5mbzsKKwlwUGVlci0+ZXh0ZW5kZWRSYXRlc1ByZXNlbnQgPSBwQmVhY29uLT5leHRlbmRlZFJhdGVzUHJlc2VudDsKKwlwUGVlci0+ZWRjYVByZXNlbnQgPSBwQmVhY29uLT5lZGNhUHJlc2VudDsKKwlwUGVlci0+d21lRWRjYVByZXNlbnQgPSBwQmVhY29uLT53bWVFZGNhUHJlc2VudDsKKwlwUGVlci0+d21lSW5mb1ByZXNlbnQgPSBwQmVhY29uLT53bWVJbmZvUHJlc2VudDsKKworCWlmIChwQmVhY29uLT5JQlNTUGFyYW1zLnByZXNlbnQpIHsKKwkJcFBlZXItPmF0aW1JZVByZXNlbnQgPSBwQmVhY29uLT5JQlNTUGFyYW1zLnByZXNlbnQ7CisJCXBQZWVyLT5wZWVyQXRpbVdpbmRvd0xlbmd0aCA9IHBCZWFjb24tPklCU1NQYXJhbXMuYXRpbTsKKwl9CisKKwlpZiAoSVNfRE9UMTFfTU9ERV9IVChwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUpICYmCisJICAgIChwQmVhY29uLT5IVENhcHMucHJlc2VudCkpIHsKKwkJcFBlZXItPmh0Q2FwYWJsZSA9IHBCZWFjb24tPkhUQ2Fwcy5wcmVzZW50OworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcFBlZXItPnN1cHBvcnRlZE1DU1NldCwKKwkJCSAgICAgKHVpbnQ4X3QgKikgcEJlYWNvbi0+SFRDYXBzLnN1cHBvcnRlZE1DU1NldCwKKwkJCSAgICAgc2l6ZW9mKHBQZWVyLT5zdXBwb3J0ZWRNQ1NTZXQpKTsKKwkJcFBlZXItPmh0R3JlZW5maWVsZCA9ICh1aW50OF90KSBwQmVhY29uLT5IVENhcHMuZ3JlZW5GaWVsZDsKKwkJcFBlZXItPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCSh1aW50OF90KSBwQmVhY29uLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworCQlwUGVlci0+aHRNSU1PUFNTdGF0ZSA9CisJCQkodFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlKSBwQmVhY29uLT5IVENhcHMubWltb1Bvd2VyU2F2ZTsKKwkJcFBlZXItPmh0TWF4QW1zZHVMZW5ndGggPQorCQkJKHVpbnQ4X3QpIHBCZWFjb24tPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplOworCQlwUGVlci0+aHRBTXBkdURlbnNpdHkgPSBwQmVhY29uLT5IVENhcHMubXBkdURlbnNpdHk7CisJCXBQZWVyLT5odERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0ID0KKwkJCSh1aW50OF90KSBwQmVhY29uLT5IVENhcHMuZHNzc0Nja01vZGU0ME1IejsKKwkJcFBlZXItPmh0U2hvcnRHSTIwTWh6ID0gKHVpbnQ4X3QpIHBCZWFjb24tPkhUQ2Fwcy5zaG9ydEdJMjBNSHo7CisJCXBQZWVyLT5odFNob3J0R0k0ME1oeiA9ICh1aW50OF90KSBwQmVhY29uLT5IVENhcHMuc2hvcnRHSTQwTUh6OworCQlwUGVlci0+aHRNYXhSeEFNcGR1RmFjdG9yID0gcEJlYWNvbi0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3I7CisJCXBQZWVyLT5odFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPQorCQkJcEJlYWNvbi0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisJCXBQZWVyLT5odExkcGNDYXBhYmxlID0gKHVpbnQ4X3QpIHBCZWFjb24tPkhUQ2Fwcy5hZHZDb2RpbmdDYXA7CisJfQorCisJLyogQ29sbGVjdCBwZWVyIFZIVCBjYXBhYmlsaXRpZXMgYmFzZWQgb24gdGhlIHJlY2VpdmVkIGJlYWNvbiBmcm9tIHRoZSBwZWVyICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlpZiAocEJlYWNvbi0+VkhUQ2Fwcy5wcmVzZW50KSB7CisJCXBQZWVyLT52aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJcEJlYWNvbi0+VkhUT3BlcmF0aW9uLmNoYW5XaWR0aDsKKwkJcFBlZXItPnZodENhcGFibGUgPSBwQmVhY29uLT5WSFRDYXBzLnByZXNlbnQ7CisKKwkJLyogQ29sbGVjdCBWSFQgY2FwYWJpbGl0aWVzIGZyb20gYmVhY29uICovCisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcFBlZXItPlZIVENhcHMsCisJCQkgICAgICh1aW50OF90ICopICZwQmVhY29uLT5WSFRDYXBzLAorCQkJICAgICBzaXplb2YodERvdDExZklFVkhUQ2FwcykpOworCX0KKyNlbmRpZgorCXBQZWVyLT5lcnBJZVByZXNlbnQgPSBwQmVhY29uLT5lcnBQcmVzZW50OworCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwUGVlci0+c3VwcG9ydGVkUmF0ZXMsCisJCSAgICAgKHVpbnQ4X3QgKikgJnBCZWFjb24tPnN1cHBvcnRlZFJhdGVzLAorCQkgICAgIHBCZWFjb24tPnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzICsgMSk7CisJaWYgKHBQZWVyLT5leHRlbmRlZFJhdGVzUHJlc2VudCkKKwkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwUGVlci0+ZXh0ZW5kZWRSYXRlcywKKwkJCSAgICAgKHVpbnQ4X3QgKikgJnBCZWFjb24tPmV4dGVuZGVkUmF0ZXMsCisJCQkgICAgIHBCZWFjb24tPmV4dGVuZGVkUmF0ZXMubnVtUmF0ZXMgKyAxKTsKKwllbHNlCisJCXBQZWVyLT5leHRlbmRlZFJhdGVzLm51bVJhdGVzID0gMDsKKworCXBQZWVyLT5uZXh0ID0gTlVMTDsKK30gLyoqKiBlbmQgaWJzc19wZWVyX2NvbGxlY3QoKSAqKiovCisKKy8qIGhhbmRsZSBjaGFuZ2UgaW4gcGVlciBxb3Mvd21lIGNhcGFiaWxpdGllcyAqLworc3RhdGljIHZvaWQKK2lic3Nfc3RhX2NhcHNfdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgdExpbUlic3NQZWVyTm9kZSAqcFBlZXJOb2RlLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQxNl90IHBlZXJJZHg7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisKKwlwUGVlck5vZGUtPmJlYWNvbkhCQ291bnQrKzsgICAgIC8qIFVwZGF0ZSBiZWFjb24gY291bnQuICovCisKKwkvKiBpZiB0aGUgcGVlciBub2RlIGV4aXN0cywgdXBkYXRlIGl0cyBxb3MgY2FwYWJpbGl0aWVzICovCisJcFN0YURzID0gZHBoX2xvb2t1cF9oYXNoX2VudHJ5KHBNYWMsIHBQZWVyTm9kZS0+cGVlck1hY0FkZHIsICZwZWVySWR4LAorCQkJCSAgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKHBTdGFEcyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBVcGRhdGUgSFQgQ2FwYWJpbGl0aWVzICovCisJaWYgKElTX0RPVDExX01PREVfSFQocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSkgeworCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5ID0gcFBlZXJOb2RlLT5odENhcGFibGU7CisJCWlmIChwUGVlck5vZGUtPmh0Q2FwYWJsZSkgeworCQkJcFN0YURzLT5odEdyZWVuZmllbGQgPSBwUGVlck5vZGUtPmh0R3JlZW5maWVsZDsKKwkJCXBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCXBQZWVyTm9kZS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJCQlwU3RhRHMtPmh0TUlNT1BTU3RhdGUgPSBwUGVlck5vZGUtPmh0TUlNT1BTU3RhdGU7CisJCQlwU3RhRHMtPmh0TWF4QW1zZHVMZW5ndGggPSBwUGVlck5vZGUtPmh0TWF4QW1zZHVMZW5ndGg7CisJCQlwU3RhRHMtPmh0QU1wZHVEZW5zaXR5ID0gcFBlZXJOb2RlLT5odEFNcGR1RGVuc2l0eTsKKwkJCXBTdGFEcy0+aHREc3NzQ2NrUmF0ZTQwTUh6U3VwcG9ydCA9CisJCQkJcFBlZXJOb2RlLT5odERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0OworCQkJcFN0YURzLT5odFNob3J0R0kyME1oeiA9IHBQZWVyTm9kZS0+aHRTaG9ydEdJMjBNaHo7CisJCQlwU3RhRHMtPmh0U2hvcnRHSTQwTWh6ID0gcFBlZXJOb2RlLT5odFNob3J0R0k0ME1oejsKKwkJCXBTdGFEcy0+aHRNYXhSeEFNcGR1RmFjdG9yID0KKwkJCQlwUGVlck5vZGUtPmh0TWF4UnhBTXBkdUZhY3RvcjsKKwkJCS8qIEluIHRoZSBmdXR1cmUsIG1heSBuZWVkIHRvIGNoZWNrIGZvciAiZGVsYXllZEJBIiAqLworCQkJLyogRm9yIG5vdywgaXQgaXMgSU1NRURJQVRFIEJBIG9ubHkgb24gQUxMIFRJRCdzICovCisJCQlwU3RhRHMtPmJhUG9saWN5RmxhZyA9IDB4RkY7CisJCQlwU3RhRHMtPmh0TGRwY0NhcGFibGUgPSBwUGVlck5vZGUtPmh0TGRwY0NhcGFibGU7CisJCX0KKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlpZiAoSVNfRE9UMTFfTU9ERV9WSFQocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSkgeworCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQudmh0Q2FwYWJpbGl0eSA9IHBQZWVyTm9kZS0+dmh0Q2FwYWJsZTsKKwkJaWYgKHBQZWVyTm9kZS0+dmh0Q2FwYWJsZSkgeworCQkJcFN0YURzLT52aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCXBQZWVyTm9kZS0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworCisJCQkvKiBJZiBpbiAxMUFDIG1vZGUgYW5kIGlmIHNlc3Npb24gcmVxdWlyZXMgMTFBQyBtb2RlLCBjb25zaWRlciBwZWVyJ3MgKi8KKwkJCS8qIG1heCBBTVBEVSBsZW5ndGggZmFjdG9yICovCisJCQlwU3RhRHMtPmh0TWF4UnhBTXBkdUZhY3RvciA9CisJCQkJcFBlZXJOb2RlLT5WSFRDYXBzLm1heEFNUERVTGVuRXhwOworCQkJcFN0YURzLT52aHRMZHBjQ2FwYWJsZSA9CisJCQkJKHVpbnQ4X3QpIHBQZWVyTm9kZS0+VkhUQ2Fwcy5sZHBjQ29kaW5nQ2FwOworCQl9CisJfQorI2VuZGlmCisJLyogcGVlciBpcyAxMWUgY2FwYWJsZSBidXQgaXMgbm90IDExZSBlbmFibGVkIHlldCAqLworCS8qIHNvbWUgU1RBJ3Mgd2hlbiBqb2luaW5nIEFpcmdvIElCU1MsIGFzc2VydCBxb3MgY2FwYWJpbGl0eSBldmVuIHdoZW4gKi8KKwkvKiB0aGV5IGRvbid0IHN1cG9ydCBxb3MuIGhvd2V2ZXIsIHRoZXkgZG8gbm90IGluY2x1ZGUgdGhlIGVkY2EgcGFyYW1ldGVyICovCisJLyogc2V0LiBzbyBsZXQncyBjaGVjayBmb3IgZWRjYVBhcmFtIGluIGFkZGl0aW9uIHRvIHRoZSBxb3MgY2FwYWJpbGl0eSAqLworCWlmIChwUGVlck5vZGUtPmNhcGFiaWxpdHlJbmZvLnFvcyAmJiAocHNlc3Npb25FbnRyeS0+bGltUW9zRW5hYmxlZCkKKwkgICAgJiYgcFBlZXJOb2RlLT5lZGNhUHJlc2VudCkgeworCQlwU3RhRHMtPnFvc01vZGUgPSAxOworCQlwU3RhRHMtPndtZUVuYWJsZWQgPSAwOworCQlpZiAoIXBTdGFEcy0+bGxlRW5hYmxlZCkgeworCQkJcFN0YURzLT5sbGVFbmFibGVkID0gMTsKKwkJCS8qIGRwaFNldEFDTShwTWFjLCBwU3RhRHMpOyAqLworCQl9CisJCXJldHVybjsKKwl9CisJLyogcGVlciBpcyBub3QgMTFlIGNhcGFibGUgbm93IGJ1dCB3YXMgMTFlIGVuYWJsZWQgZWFybGllciAqLworCWVsc2UgaWYgKHBTdGFEcy0+bGxlRW5hYmxlZCkgeworCQlwU3RhRHMtPnFvc01vZGUgPSAwOworCQlwU3RhRHMtPmxsZUVuYWJsZWQgPSAwOworCX0KKwkvKiBwZWVyIGlzIHdtZSBjYXBhYmxlIGJ1dCBpcyBub3Qgd21lIGVuYWJsZWQgeWV0ICovCisJaWYgKHBQZWVyTm9kZS0+d21lSW5mb1ByZXNlbnQgJiYgcHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCkgeworCQlwU3RhRHMtPnFvc01vZGUgPSAxOworCQlwU3RhRHMtPmxsZUVuYWJsZWQgPSAwOworCQlpZiAoIXBTdGFEcy0+d21lRW5hYmxlZCkgeworCQkJcFN0YURzLT53bWVFbmFibGVkID0gMTsKKwkJfQorCQlyZXR1cm47CisJfQorCS8qIFdoZW4gdGhlIHBlZXIgZGV2aWNlIHN1cHBvcnRzIEVEQ0EgcGFyYW1ldGVycywgdGhlbiB3ZSB3ZXJlIG5vdAorCSAgIGNvbnNpZGVyaW5nLiBBZGRlZCB0aGlzIGNvZGUgd2hlbiB3ZSBzYXcgdGhhdCBvbmUgb2YgdGhlIFBlZXIgRGV2aWNlCisJICAgd2FzIGFkdmVydGlzaW5nIFdNTSBwYXJhbSB3aGVyZSB3ZSB3ZXJlIG5vdCBob25vdXJpbmcgdGhhdC4gQ1IjIDIxMDc1NgorCSAqLworCWlmIChwUGVlck5vZGUtPndtZUVkY2FQcmVzZW50ICYmIHBzZXNzaW9uRW50cnktPmxpbVdtZUVuYWJsZWQpIHsKKwkJcFN0YURzLT5xb3NNb2RlID0gMTsKKwkJcFN0YURzLT5sbGVFbmFibGVkID0gMDsKKwkJaWYgKCFwU3RhRHMtPndtZUVuYWJsZWQpIHsKKwkJCXBTdGFEcy0+d21lRW5hYmxlZCA9IDE7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvKiBwZWVyIGlzIG5vdCB3bWUgY2FwYWJsZSBub3cgYnV0IHdhcyB3bWUgZW5hYmxlZCBlYXJsaWVyICovCisJZWxzZSBpZiAocFN0YURzLT53bWVFbmFibGVkKSB7CisJCXBTdGFEcy0+cW9zTW9kZSA9IDA7CisJCXBTdGFEcy0+d21lRW5hYmxlZCA9IDA7CisJfQorCit9CisKK3N0YXRpYyB2b2lkCitpYnNzX3N0YV9yYXRlc191cGRhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMsCisJCSAgICAgIHRMaW1JYnNzUGVlck5vZGUgKnBQZWVyLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJbGltX3BvcHVsYXRlX21hdGNoaW5nX3JhdGVfc2V0KHBNYWMsIHBTdGFEcywgJnBQZWVyLT5zdXBwb3J0ZWRSYXRlcywKKwkJCQkgICAgICAgJnBQZWVyLT5leHRlbmRlZFJhdGVzLAorCQkJCSAgICAgICBwUGVlci0+c3VwcG9ydGVkTUNTU2V0LCBwc2Vzc2lvbkVudHJ5LAorCQkJCSAgICAgICAmcFBlZXItPlZIVENhcHMpOworI2Vsc2UKKwkvKiBQb3B1bGF0ZSBzdXBwb3J0ZWQgcmF0ZXNldCAqLworCWxpbV9wb3B1bGF0ZV9tYXRjaGluZ19yYXRlX3NldChwTWFjLCBwU3RhRHMsICZwUGVlci0+c3VwcG9ydGVkUmF0ZXMsCisJCQkJICAgICAgICZwUGVlci0+ZXh0ZW5kZWRSYXRlcywKKwkJCQkgICAgICAgcFBlZXItPnN1cHBvcnRlZE1DU1NldCwgcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKworCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5jYXBhYmlsaXR5SW5mbyA9IHBQZWVyLT5jYXBhYmlsaXR5SW5mbzsKK30gLyoqKiBlbmQgaWJzc19zdGFfaW5mb191cGRhdGUoKSAqKiovCisKKy8qKgorICogaWJzc19zdGFfaW5mb191cGRhdGUKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGlzIGNhbGxlZCB0byBwcm9ncmFtIGJvdGggU1cgJiBQb2xhcmlzIGNvbnRleHQKKyAqIGZvciBwZWVyIGluIElCU1MuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzIC0gUG9pbnRlciB0byBEUEggbm9kZQorICogQHBhcmFtICBwUGVlciAgLSBQb2ludGVyIHRvIElCU1MgcGVlciBub2RlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2lic3Nfc3RhX2luZm9fdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMsCisJCSAgICAgdExpbUlic3NQZWVyTm9kZSAqcFBlZXIsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJcFN0YURzLT5zdGFUeXBlID0gU1RBX0VOVFJZX1BFRVI7CisJaWJzc19zdGFfY2Fwc191cGRhdGUocE1hYywgcFBlZXIsIHBzZXNzaW9uRW50cnkpOworCWlic3Nfc3RhX3JhdGVzX3VwZGF0ZShwTWFjLCBwU3RhRHMsIHBQZWVyLCBwc2Vzc2lvbkVudHJ5KTsKK30gLyoqKiBlbmQgaWJzc19zdGFfaW5mb191cGRhdGUoKSAqKiovCisKK3N0YXRpYyB2b2lkIGlic3NfY29hbGVzY2VfZnJlZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCWlmIChwTWFjLT5saW0uaWJzc0luZm8ucEhkciAhPSBOVUxMKQorCQljZGZfbWVtX2ZyZWUocE1hYy0+bGltLmlic3NJbmZvLnBIZHIpOworCWlmIChwTWFjLT5saW0uaWJzc0luZm8ucEJlYWNvbiAhPSBOVUxMKQorCQljZGZfbWVtX2ZyZWUocE1hYy0+bGltLmlic3NJbmZvLnBCZWFjb24pOworCisJcE1hYy0+bGltLmlic3NJbmZvLnBIZHIgPSBOVUxMOworCXBNYWMtPmxpbS5pYnNzSW5mby5wQmVhY29uID0gTlVMTDsKK30KKworLyoKKyAqIHNhdmUgdGhlIGJlYWNvbiBwYXJhbXMgZm9yIHVzZSB3aGVuIGFkZGluZyB0aGUgYnNzCisgKi8KK3N0YXRpYyB2b2lkCitpYnNzX2NvYWxlc2NlX3NhdmUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgdHBTaXJNYWNNZ210SGRyIHBIZHIsIHRwU2NoQmVhY29uU3RydWN0IHBCZWFjb24pCit7CisJLyogZ2V0IHJpZCBvZiBhbnkgc2F2ZWQgaW5mbyAqLworCWlic3NfY29hbGVzY2VfZnJlZShwTWFjKTsKKworCXBNYWMtPmxpbS5pYnNzSW5mby5wSGRyID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwSGRyKSk7CisJaWYgKE5VTEwgPT0gcE1hYy0+bGltLmlic3NJbmZvLnBIZHIpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoImliYnMtc2F2ZTogRmFpbGVkIG1hbGxvYyBwSGRyIikpOykKKwkJcmV0dXJuOworCX0KKwlwTWFjLT5saW0uaWJzc0luZm8ucEJlYWNvbiA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcEJlYWNvbikpOworCWlmIChOVUxMID09IHBNYWMtPmxpbS5pYnNzSW5mby5wQmVhY29uKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJpYmJzLXNhdmU6IEZhaWxlZCBtYWxsb2MgcEJlYWNvbiIpKTsKKwkJICAgICAgICkKKwkJaWJzc19jb2FsZXNjZV9mcmVlKHBNYWMpOworCQlyZXR1cm47CisJfQorCisJY2RmX21lbV9jb3B5KHBNYWMtPmxpbS5pYnNzSW5mby5wSGRyLCBwSGRyLCBzaXplb2YoKnBIZHIpKTsKKwljZGZfbWVtX2NvcHkocE1hYy0+bGltLmlic3NJbmZvLnBCZWFjb24sIHBCZWFjb24sIHNpemVvZigqcEJlYWNvbikpOworfQorCisvKgorICogdHJpZXMgdG8gYWRkIGEgbmV3IGVudHJ5IHRvIGRwaCBoYXNoIG5vZGUKKyAqIGlmIG5lY2Vzc2FyeSwgYW4gZXhpc3RpbmcgZW50cnkgaXMgZWxpbWluYXRlZAorICovCitzdGF0aWMgdFNpclJldFN0YXR1cworaWJzc19kcGhfZW50cnlfYWRkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgIHRTaXJNYWNBZGRyIHBlZXJBZGRyLAorCQkgICB0cERwaEhhc2hOb2RlICpwcFN0YSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MTZfdCBwZWVySWR4OworCXRwRHBoSGFzaE5vZGUgcFN0YURzOworCisJKnBwU3RhID0gTlVMTDsKKworCXBTdGFEcyA9CisJCWRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLCBwZWVyQWRkciwgJnBlZXJJZHgsCisJCQkJICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWlmIChwU3RhRHMgIT0gTlVMTCkgeworCQkvKiBUcnlpbmcgdG8gYWRkIGNvbnRleHQgZm9yIGFscmVhZHkgZXhpc3RpbmcgU1RBIGluIElCU1MgKi8KKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIlNUQSBleGlzdHMgYWxyZWFkeSAiKSk7KQorCQlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcGVlckFkZHIsIExPR0UpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCS8qKgorCSAqIEFzc2lnbiBhbiBBSUQsIGRlbGV0ZSBjb250ZXh0IGV4aXN0aW5nIHdpdGggdGhhdAorCSAqIEFJRCBhbmQgdGhlbiBhZGQgYW4gZW50cnkgdG8gaGFzaCB0YWJsZSBtYWludGFpbmVkCisJICogYnkgRFBIIG1vZHVsZS4KKwkgKi8KKwlwZWVySWR4ID0gbGltX2Fzc2lnbl9wZWVyX2lkeChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworCXBTdGFEcyA9CisJCWRwaF9nZXRfaGFzaF9lbnRyeShwTWFjLCBwZWVySWR4LCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKHBTdGFEcykgeworCQkodm9pZClsaW1fZGVsX3N0YShwTWFjLCBwU3RhRHMsIGZhbHNlIC8qYXN5bmNocm9ub3VzICovLAorCQkJCSAgcHNlc3Npb25FbnRyeSk7CisJCWxpbV9kZWxldGVfZHBoX2hhc2hfZW50cnkocE1hYywgcFN0YURzLT5zdGFBZGRyLCBwZWVySWR4LAorCQkJCQkgIHBzZXNzaW9uRW50cnkpOworCX0KKworCXBTdGFEcyA9CisJCWRwaF9hZGRfaGFzaF9lbnRyeShwTWFjLCBwZWVyQWRkciwgcGVlcklkeCwKKwkJCQkgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKHBTdGFEcyA9PSBOVUxMKSB7CisJCS8qIENvdWxkIG5vdCBhZGQgaGFzaCB0YWJsZSBlbnRyeSAqLworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiY291bGQgbm90IGFkZCBoYXNoIGVudHJ5IGF0IERQSCBmb3IgcGVlcklkeC9haWQ9JWQgTUFDYWRkcjoiKSwKKwkJCSAgICAgICBwZWVySWR4KTsKKwkJICAgICAgICkKKwkJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHBlZXJBZGRyLCBMT0dFKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwkqcHBTdGEgPSBwU3RhRHM7CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyogc2VuZCBhIHN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uICovCitzdGF0aWMgdm9pZAoraWJzc19zdGF0dXNfY2hnX25vdGlmeSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgICAgICAgdFNpck1hY0FkZHIgcGVlckFkZHIsCisJCSAgICAgICB1aW50MTZfdCBzdGFJbmRleCwKKwkJICAgICAgIHVpbnQ4X3QgdWNhc3RTaWcsCisJCSAgICAgICB1aW50OF90IGJjYXN0U2lnLCB1aW50MTZfdCBzdGF0dXMsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCisJdExpbUlic3NQZWVyTm9kZSAqcGVlck5vZGU7CisJdWludDhfdCAqYmVhY29uID0gTlVMTDsKKwl1aW50MTZfdCBiY25MZW4gPSAwOworCisJcGVlck5vZGUgPSBpYnNzX3BlZXJfZmluZChwTWFjLCBwZWVyQWRkcik7CisJaWYgKHBlZXJOb2RlICE9IE5VTEwpIHsKKwkJaWYgKHBlZXJOb2RlLT5iZWFjb24gPT0gTlVMTCkKKwkJCXBlZXJOb2RlLT5iZWFjb25MZW4gPSAwOworCQliZWFjb24gPSBwZWVyTm9kZS0+YmVhY29uOworCQliY25MZW4gPSBwZWVyTm9kZS0+YmVhY29uTGVuOworCQlwZWVyTm9kZS0+YmVhY29uID0gTlVMTDsKKwkJcGVlck5vZGUtPmJlYWNvbkxlbiA9IDA7CisJfQorCisJbGltX3NlbmRfc21lX2lic3NfcGVlcl9pbmQocE1hYywgcGVlckFkZHIsIHN0YUluZGV4LCB1Y2FzdFNpZywgYmNhc3RTaWcsCisJCQkJICAgYmVhY29uLCBiY25MZW4sIHN0YXR1cywgc2Vzc2lvbklkKTsKKworCWlmIChiZWFjb24gIT0gTlVMTCkgeworCQljZGZfbWVtX2ZyZWUoYmVhY29uKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlic3NfYnNzX2FkZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRMaW1NbG1TdGFydFJlcSBtbG1TdGFydFJlcTsKKwl1aW50MzJfdCBjZmc7CisJdHBTaXJNYWNNZ210SGRyIHBIZHIgPSAodHBTaXJNYWNNZ210SGRyKSBwTWFjLT5saW0uaWJzc0luZm8ucEhkcjsKKwl0cFNjaEJlYWNvblN0cnVjdCBwQmVhY29uID0KKwkJKHRwU2NoQmVhY29uU3RydWN0KSBwTWFjLT5saW0uaWJzc0luZm8ucEJlYWNvbjsKKwl1aW50OF90IG51bUV4dFJhdGVzID0gMDsKKworCWlmICgocEhkciA9PSBOVUxMKSB8fCAocEJlYWNvbiA9PSBOVUxMKSkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJVbmFibGUgdG8gYWRkIEJTUyAobm8gY2FjaGVkIEJTUyBpbmZvKSIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KKworCWNkZl9tZW1fY29weShwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgcEhkci0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJc2lyX2NvcHlfbWFjX2FkZHIocEhkci0+YnNzSWQsIHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworCS8qIENvcHkgYmVhY29uIGludGVydmFsIGZyb20gc2Vzc2lvblRhYmxlICovCisJY2ZnID0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmJlYWNvbkludGVydmFsOworCWlmIChjZmcgIT0gcEJlYWNvbi0+YmVhY29uSW50ZXJ2YWwpCisJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbCA9CisJCQlwQmVhY29uLT5iZWFjb25JbnRlcnZhbDsKKworCS8qIFRoaXMgZnVuY3Rpb24gaWJzc19ic3NfYWRkIChhbmQgaGVuY2UgdGhlIGJlbG93IGNvZGUpIGlzIG9ubHkgY2FsbGVkIGR1cmluZyBpYnNzIGNvYWxlc2NpbmcuIFdlIG5lZWQgdG8KKwkgKiBhZGFwdCB0byBwZWVyJ3MgY2FwYWJpbGl0eSB3aXRoIHJlc3BlY3QgdG8gc2hvcnQgc2xvdCB0aW1lLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIGxpbV9hcHBseV9jb25maWd1cmF0aW9uKCkKKwkgKiBzbyB0aGF0IHRoZSBJQlNTIGRvZXNudCBibGluZGx5IHN0YXJ0IHdpdGggc2hvcnQgc2xvdCA9IDEuIElmIElCU1Mgc3RhcnQgaXMgcGFydCBvZiBjb2FsZXNjaW5nIHRoZW4gaXQgd2lsbCBhZGFwdAorCSAqIHRvIHBlZXIncyBzaG9ydCBzbG90IHVzaW5nIGNvZGUgYmVsb3cuCisJICovCisJLyogSWYgY2ZnIGlzIGFscmVhZHkgc2V0IHRvIGN1cnJlbnQgcGVlcidzIGNhcGFiaWxpdHkgdGhlbiBubyBuZWVkIHRvIHNldCBpdCBhZ2FpbiAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5zaG9ydFNsb3RUaW1lU3VwcG9ydGVkICE9CisJICAgIHBCZWFjb24tPmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWUpIHsKKwkJcHNlc3Npb25FbnRyeS0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCA9CisJCQlwQmVhY29uLT5jYXBhYmlsaXR5SW5mby5zaG9ydFNsb3RUaW1lOworCX0KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+CisJCSAgICAgb3BlcmF0aW9uYWxSYXRlU2V0LCAodWludDhfdCAqKSAmcEJlYWNvbi0+c3VwcG9ydGVkUmF0ZXMsCisJCSAgICAgcEJlYWNvbi0+c3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXMpOworCisJLyoqCisJICogV05JX0NGR19FWFRFTkRFRF9PUEVSQVRJT05BTF9SQVRFX1NFVCBDRkcgbmVlZHMgdG8gYmUgcmVzZXQsIHdoZW4KKwkgKiB0aGVyZSBpcyBubyBleHRlbmRlZCByYXRlIElFIHByZXNlbnQgaW4gYmVhY29uLiBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHdoZW4KKwkgKiBzdXBwb3J0ZWRSYXRlU2V0IElFIGNvbnRhaW5zIGFsbCB0aGUgZXh0ZW5kZWQgcmF0ZXMgYXMgd2VsbCBhbmQgU1RBIGRlY2lkZXMgdG8gY29hbGVzY2UuCisJICogSW4gdGhpcyBJQlNTIGNvYWxlc2Npbmcgc2NlbmFyaW8gTElNIHdpbGwgdGVhciBkb3duIHRoZSBCU1MgYW5kIEFkZCBhIG5ldyBvbmUuIFNvIExJTSBuZWVkcyB0bworCSAqIHJlc2V0IHRoaXMgQ0ZHLCBqdXN0IGluIGNhc2UgQ1NSIG9yaWdpbmFsbHkgaGFkIHNldCB0aGlzIENGRyB3aGVuIElCU1Mgd2FzIHN0YXJ0ZWQgZnJvbSB0aGUgbG9jYWwgcHJvZmlsZS4KKwkgKiBJZiBJQlNTIHdhcyBzdGFydGVkIGJ5IENTUiBmcm9tIHRoZSBCc3NEZXNjcmlwdGlvbiwgdGhlbiBpdCB3b3VsZCByZXNldCB0aGlzIENGRyBiZWZvcmUgU3RhcnRCc3MgaXMgaXNzdWVkLgorCSAqIFRoZSBpZGVhIGlzIHRoYXQgdGhlIGNvdW50IG9mIE9wUmF0ZVNldCBhbmQgRXh0ZW5kZWRPcFJhdGVTZXQgcmF0ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gMTIuCisJICovCisKKwlpZiAocEJlYWNvbi0+ZXh0ZW5kZWRSYXRlc1ByZXNlbnQpCisJCW51bUV4dFJhdGVzID0gcEJlYWNvbi0+ZXh0ZW5kZWRSYXRlcy5udW1SYXRlczsKKwlpZiAoY2ZnX3NldF9zdHIocE1hYywgV05JX0NGR19FWFRFTkRFRF9PUEVSQVRJT05BTF9SQVRFX1NFVCwKKwkJCSh1aW50OF90ICopICZwQmVhY29uLT5leHRlbmRlZFJhdGVzLnJhdGUsCisJCQludW1FeHRSYXRlcykgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJjb3VsZCBub3QgdXBkYXRlIEV4dGVuZGVkT3BlclJhdGVzZXQgYXQgQ0ZHIikpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBFYWNoIElCU1Mgbm9kZSB3aWxsIGFkdmVydGlzZSBpdHMgb3duIEhUIENhcGFiaWxpdGllcyBpbnN0ZWFkIG9mIGFkYXB0aW5nIHRvIHRoZSBQZWVyJ3MgY2FwYWJpbGl0aWVzCisJICogSWYgd2UgZG9uJ3QgZG8gdGhpcyB0aGVuIElCU1MgbWF5IG5vdCBnbyBiYWNrIHRvIGZ1bGwgY2FwYWJpbGl0aWVzIHdoZW4gdGhlIFNUQSB3aXRoIGxvd2VyIGNhcGFiaWxpdGllcworCSAqIGxlYXZlcyB0aGUgSUJTUy4gIGUuZy4gd2hlbiBub24tQ0IgU1RBIGpvaW5zIGFuIElCU1MgYW5kIHRoZW4gbGVhdmVzLCB0aGUgSUJTUyB3aWxsIGJlIHN0dWNrIGF0IG5vbi1DQiBtb2RlCisJICogZXZlbiB0aG91Z2ggYWxsIHRoZSBub2RlcyBhcmUgY2FwYWJsZSBvZiBkb2luZyBDQi4KKwkgKiBzbyBpdCBpcyBkZWNpZGVkIHRvIGxlYXZlIHRoZSBzZWxmIEhUIGNhcGFiaWx0aWVzIGludGFjdC4gVGhpcyBtYXkgY2hhbmdlIGlmIHNvbWUgaXNzdWVzIGFyZSBmb3VuZCBpbiBpbnRlcm9wLgorCSAqLworCWNkZl9tZW1fc2V0KCh2b2lkICopJm1sbVN0YXJ0UmVxLCBzaXplb2YobWxtU3RhcnRSZXEpLCAwKTsKKworCWNkZl9tZW1fY29weShtbG1TdGFydFJlcS5ic3NJZCwgcEhkci0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCW1sbVN0YXJ0UmVxLnJhdGVTZXQubnVtUmF0ZXMgPQorCQlwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlczsKKwljZGZfbWVtX2NvcHkoJm1sbVN0YXJ0UmVxLnJhdGVTZXQucmF0ZVswXSwKKwkJICAgICAmcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQuCisJCSAgICAgcmF0ZVswXSwgbWxtU3RhcnRSZXEucmF0ZVNldC5udW1SYXRlcyk7CisJbWxtU3RhcnRSZXEuYnNzVHlwZSA9IGVTSVJfSUJTU19NT0RFOworCW1sbVN0YXJ0UmVxLmJlYWNvblBlcmlvZCA9IHBCZWFjb24tPmJlYWNvbkludGVydmFsOworCW1sbVN0YXJ0UmVxLm53VHlwZSA9IHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+bndUeXBlOyAgICAvKiBwc2Vzc2lvbkVudHJ5LT5ud1R5cGUgaXMgYWxzbyBPSz8/Pz8gKi8KKwltbG1TdGFydFJlcS5odENhcGFibGUgPSBwc2Vzc2lvbkVudHJ5LT5odENhcGFiaWxpdHk7CisJbWxtU3RhcnRSZXEuaHRPcGVyTW9kZSA9IHBNYWMtPmxpbS5nSFRPcGVyTW9kZTsKKwltbG1TdGFydFJlcS5kdWFsQ1RTUHJvdGVjdGlvbiA9IHBNYWMtPmxpbS5nSFREdWFsQ1RTUHJvdGVjdGlvbjsKKwltbG1TdGFydFJlcS50eENoYW5uZWxXaWR0aFNldCA9IHBzZXNzaW9uRW50cnktPmh0UmVjb21tZW5kZWRUeFdpZHRoU2V0OworCisJLyogcmVhZGluZyB0aGUgY2hhbm5lbCBudW0gZnJvbSBzZXNzaW9uIFRhYmxlICovCisJbWxtU3RhcnRSZXEuY2hhbm5lbE51bWJlciA9IHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbDsKKworCW1sbVN0YXJ0UmVxLmNiTW9kZSA9IHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+Y2JNb2RlOworCisJLyogQ29weSB0aGUgU1NJRCBmb3IgUnhQIGZpbHRlcmluZyBiYXNlZCBvbiBTU0lELiAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWxtU3RhcnRSZXEuc3NJZCwKKwkJICAgICAodWludDhfdCAqKSAmcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5zc0lkLAorCQkgICAgIHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+c3NJZC5sZW5ndGggKyAxKTsKKworCVBFTE9HMShsaW1fbG9nCisJCSAgICAgICAocE1hYywgTE9HMSwgRkwoImludm9raW5nIEFERF9CU1MgYXMgcGFydCBvZiBjb2FsZXNjaW5nISIpKTsKKwkgICAgICAgKQorCWlmIChsaW1fbWxtX2FkZF9ic3MocE1hYywgJm1sbVN0YXJ0UmVxLCBwc2Vzc2lvbkVudHJ5KSAhPQorCSAgICBlU0lSX1NNRV9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJBZGRCc3MgZmFpbHVyZSIpKTspCisJCXJldHVybjsKKwl9CisJLyogVXBkYXRlIGZpZWxkcyBpbiBCZWFjb24gKi8KKwlpZiAoc2NoX3NldF9maXhlZF9iZWFjb25fZmllbGRzKHBNYWMsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCIqKiogVW5hYmxlIHRvIHNldCBmaXhlZCBCZWFjb24gZmllbGRzICoqKiIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KKworfQorCisvKiBkZWxldGUgdGhlIGN1cnJlbnQgQlNTICovCitzdGF0aWMgdm9pZCBpYnNzX2Jzc19kZWxldGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUmV0U3RhdHVzIHN0YXR1czsKKwlQRUxPR1cobGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiSW5pdGlhdGluZyBJQlNTIERlbGV0ZSBCU1MiKSk7KQorCWlmIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSAhPSBlTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgiSW5jb3JyZWN0IExJTSBNTE0gc3RhdGUgZm9yIGRlbEJzcyAoJWQpIiksCisJCQlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisJCXJldHVybjsKKwl9CisJc3RhdHVzID0gbGltX2RlbF9ic3MocE1hYywgTlVMTCwgcHNlc3Npb25FbnRyeS0+YnNzSWR4LCBwc2Vzc2lvbkVudHJ5KTsKKwlpZiAoc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoImRlbEJzcyBmYWlsZWQgZm9yIGJzcyAlZCIpLAorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkeCk7CisJCSAgICAgICApCit9CisKKy8qKgorICogbGltX2lic3NfaW5pdAorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoaWxlIHN0YXJ0aW5nIGFuIElCU1MKKyAqIHRvIGluaXRpYWxpemUgbGlzdCB1c2VkIHRvIG1haW50YWluIElCU1MgcGVlcnMuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbV9pYnNzX2luaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlwTWFjLT5saW0uZ0xpbUlic3NDb2FsZXNjaW5nSGFwcGVuZWQgPSAwOworCXBNYWMtPmxpbS5nTGltSWJzc1BlZXJMaXN0ID0gTlVMTDsKKwlwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycyA9IDA7CisKKwkvKiBpYnNzIGluZm8gLSBwYXJhbXMgZm9yIHdoaWNoIGlic3MgdG8gam9pbiB3aGlsZSBjb2FsZXNjaW5nICovCisJY2RmX21lbV9zZXQoJnBNYWMtPmxpbS5pYnNzSW5mbywgc2l6ZW9mKHRBbmlTaXJMaW1JYnNzKSwgMCk7Cit9IC8qKiogZW5kIGxpbV9pYnNzX2luaXQoKSAqKiovCisKKy8qKgorICogbGltX2lic3NfZGVsZXRlX2FsbF9wZWVycworICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBhbGwgcGVlcnMuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbV9pYnNzX2RlbGV0ZV9hbGxfcGVlcnModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0TGltSWJzc1BlZXJOb2RlICpwQ3Vyck5vZGUsICpwVGVtcE5vZGU7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisJdWludDE2X3QgcGVlcklkeDsKKworCXBDdXJyTm9kZSA9IHBUZW1wTm9kZSA9IHBNYWMtPmxpbS5nTGltSWJzc1BlZXJMaXN0OworCisJd2hpbGUgKHBDdXJyTm9kZSAhPSBOVUxMKSB7CisJCWlmICghcE1hYy0+bGltLmdMaW1OdW1JYnNzUGVlcnMpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTAorCQkJCQkoIk51bWJlciBvZiBwZWVycyBpbiB0aGUgbGlzdCBpcyB6ZXJvIGFuZCBub2RlIHByZXNlbnQiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogRGVsZXRlIHRoZSBkcGggZW50cnkgZm9yIHRoZSBzdGF0aW9uCisJCSAqIFNpbmNlIGl0IGlzIGNhbGxlZCB0byByZW1vdmUgYWxsIHBlZXJzLCBqdXN0IGRlbGV0ZSBmcm9tIGRwaCwKKwkJICogbm8gbmVlZCB0byBkbyBhbnkgYmVhY29uIHJlbGF0ZWQgcGFyYW1zIGkuZS4sIGRvbnQgY2FsbCBsaW1fZGVsZXRlX2RwaF9oYXNoX2VudHJ5CisJCSAqLworCQlwU3RhRHMgPQorCQkJZHBoX2xvb2t1cF9oYXNoX2VudHJ5KHBNYWMsIHBDdXJyTm9kZS0+cGVlck1hY0FkZHIsICZwZWVySWR4LAorCQkJCQkgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCWlmIChwU3RhRHMpIHsKKworCQkJaWJzc19zdGF0dXNfY2hnX25vdGlmeShwTWFjLCBwQ3Vyck5vZGUtPnBlZXJNYWNBZGRyLAorCQkJCQkgICAgICAgcFN0YURzLT5zdGFJbmRleCwKKwkJCQkJICAgICAgIHBTdGFEcy0+dWNVY2FzdFNpZywKKwkJCQkJICAgICAgIHBTdGFEcy0+dWNCY2FzdFNpZywKKwkJCQkJICAgICAgIGVXTklfU01FX0lCU1NfUEVFUl9ERVBBUlRFRF9JTkQsCisJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQpOworCQkJbGltX3JlbGVhc2VfcGVlcl9pZHgocE1hYywgcGVlcklkeCwgcHNlc3Npb25FbnRyeSk7CisJCQlkcGhfZGVsZXRlX2hhc2hfZW50cnkocE1hYywgcFN0YURzLT5zdGFBZGRyLCBwZWVySWR4LAorCQkJCQkgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCX0KKworCQlwVGVtcE5vZGUgPSBwQ3Vyck5vZGUtPm5leHQ7CisKKwkJLyogVE9ETyA6U2Vzc2lvbml6ZSB0aGlzIGNvZGUgKi8KKwkJLyogRml4IENSIDIyNzY0MjogUGVlckxpc3Qgc2hvdWxkIHBvaW50IHRvIHRoZSBuZXh0IG5vZGUgc2luY2UgdGhlIGN1cnJlbnQgbm9kZSBpcyBiZWluZworCQkgKiBmcmVlZCBpbiB0aGUgbmV4dCBsaW5lLiBJbiBpYnNzX3BlZXJmaW5kIGluIGlic3Nfc3RhdHVzX2NoZ19ub3RpZnkgYWJvdmUsIHdlIHVzZSB0aGlzCisJCSAqIHBlZXIgbGlzdCB0byBmaW5kIHRoZSBuZXh0IHBlZXIuIFNvIHRoaXMgbGlzdCBuZWVkcyB0byBiZSB1cGRhdGVkIHdpdGggdGhlIG5vIG9mIHBlZXJzIGxlZnQKKwkJICogYWZ0ZXIgZWFjaCBpdGVyYXRpb24gaW4gdGhpcyB3aGlsZSBsb29wIHNpbmNlIG9uZSBieSBvbmUgcGVlcnMgYXJlIGRlbGV0ZWQgKGZyZWVkKSBpbiB0aGlzCisJCSAqIGxvb3AgY2F1c2luZyB0aGUgbGltLmdMaW1JYnNzUGVlckxpc3QgdG8gcG9pbnQgdG8gc29tZSBmcmVlZCBtZW1vcnkuCisJCSAqLworCQlwTWFjLT5saW0uZ0xpbUlic3NQZWVyTGlzdCA9IHBUZW1wTm9kZTsKKworCQlpZiAocEN1cnJOb2RlLT5iZWFjb24pIHsKKwkJCWNkZl9tZW1fZnJlZShwQ3Vyck5vZGUtPmJlYWNvbik7CisJCX0KKwkJY2RmX21lbV9mcmVlKHBDdXJyTm9kZSk7CisJCWlmIChwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycyA+IDApIC8qIGJlIHBhcmFub2lkICovCisJCQlwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycy0tOworCQlwQ3Vyck5vZGUgPSBwVGVtcE5vZGU7CisJfQorCisJaWYgKHBNYWMtPmxpbS5nTGltTnVtSWJzc1BlZXJzKQorCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiTnVtYmVyIG9mIHBlZXJzWyVkXSBpbiB0aGUgbGlzdCBpcyBub24temVybyIpLAorCQkJcE1hYy0+bGltLmdMaW1OdW1JYnNzUGVlcnMpOworCisJcE1hYy0+bGltLmdMaW1OdW1JYnNzUGVlcnMgPSAwOworCXBNYWMtPmxpbS5nTGltSWJzc1BlZXJMaXN0ID0gTlVMTDsKKworfQorCisvKioKKyAqIGxpbV9pYnNzX2RlbGV0ZSgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgdGVhcmluZyBkb3duIGFuIElCU1MKKyAqCisgKiBAcE1hYzogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBzZXNzaW9uRW50cnk6IFBvaW50ZXIgdG8gc2Vzc2lvbiBlbnRyeQorICoKKyAqIFJldHVybjogbm9uZQorICovCisKK3ZvaWQgbGltX2lic3NfZGVsZXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJbGltX2lic3NfZGVsZXRlX2FsbF9wZWVycyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwlpYnNzX2NvYWxlc2NlX2ZyZWUocE1hYyk7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX2lic3Nfc2V0X3Byb3RlY3Rpb24KKyAgIFxicmllZiBEZWNpZGVzIGFsbCB0aGUgcHJvdGVjdGlvbiByZWxhdGVkIGluZm9ybWF0aW9uLgorIFwKKyAgIFxwYXJhbSAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworICAgXHBhcmFtICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkcgorICAgXHBhcmFtICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zCisgICBccmV0dXJuIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQKK2xpbV9pYnNzX3NldF9wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgZW5hYmxlLAorCQkJdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywKKwkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwlpZiAoIXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmZyb21sbGIpIHsKKwkJUEVMT0cxKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMSwgRkwoInByb3RlY3Rpb24gZnJvbSAxMWIgaXMgZGlzYWJsZWQiKSk7CisJCSAgICAgICApCisJCXJldHVybjsKKwl9CisKKwlpZiAoZW5hYmxlKSB7CisJCXBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworCQlpZiAoZmFsc2UgPT0KKwkJICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy4KKwkJICAgIGxsYkNvZXhpc3QgLypwTWFjLT5saW0ubGxiQ29leGlzdCAqLykgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCI9PiBJQlNTOiBFbmFibGUgUHJvdGVjdGlvbiAiKSk7CisJCQkgICAgICAgKQorCQkJcEJlYWNvblBhcmFtcy0+bGxiQ29leGlzdCA9CisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYkNvZXhpc3QgPSB0cnVlOworCQkJcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9sbEJDT0VYSVNUX0NIQU5HRUQ7CisJCX0KKwl9IGVsc2UgaWYgKHRydWUgPT0KKwkJICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLgorCQkgICBsbGJDb2V4aXN0IC8qcE1hYy0+bGltLmxsYkNvZXhpc3QgKi8pIHsKKwkJcHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IGZhbHNlOworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiPT09PiBJQlNTOiBEaXNhYmxlIHByb3RlY3Rpb24gIikpOykKKwkJcEJlYWNvblBhcmFtcy0+bGxiQ29leGlzdCA9CisJCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxiQ29leGlzdCA9IGZhbHNlOworCQlwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9sbEJDT0VYSVNUX0NIQU5HRUQ7CisJfQorCXJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1faWJzc191cGRhdGVfcHJvdGVjdGlvbl9wYXJhbXMKKyAgIFxicmllZiBEZWNpZGVzIGFsbCB0aGUgcHJvdGVjdGlvbiByZWxhdGVkIGluZm9ybWF0aW9uLgorIFwKKyAgIFxwYXJhbSAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworICAgXHBhcmFtICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkcgorICAgXHBhcmFtICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zCisgICBccmV0dXJuIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQKK2xpbV9pYnNzX3VwZGF0ZV9wcm90ZWN0aW9uX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisJCQkJICB0TGltUHJvdFN0YUNhY2hlVHlwZSBwcm90U3RhQ2FjaGVUeXBlLAorCQkJCSAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MzJfdCBpOworCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoIkEgU1RBIGlzIGFzc29jaWF0ZWQ6IikpOworCSAgICAgICBsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJBZGRyIDogIikpOworCSAgICAgICBsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcGVlck1hY0FkZHIsIExPRzEpOworCSAgICAgICApCisKKwlmb3IgKGkgPSAwOyBpIDwgTElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykgeworCQlpZiAocE1hYy0+bGltLnByb3RTdGFDYWNoZVtpXS5hY3RpdmUpIHsKKwkJCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJBZGRyOiAiKSk7KQorCQkJUEVMT0cxKGxpbV9wcmludF9tYWNfYWRkcgorCQkJCSAgICAgICAocE1hYywgcE1hYy0+bGltLnByb3RTdGFDYWNoZVtpXS5hZGRyLCBMT0cxKTsKKwkJCSAgICAgICApCisKKwkJCWlmIChjZGZfbWVtX2NvbXBhcmUocE1hYy0+bGltLnByb3RTdGFDYWNoZVtpXS5hZGRyLAorCQkJCQkgICAgcGVlck1hY0FkZHIsCisJCQkJCSAgICBzaXplb2YodFNpck1hY0FkZHIpKSkgeworCQkJCVBFTE9HMShsaW1fbG9nCisJCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkJICAgICAgIEZMCisJCQkJCQkgICAgICAgKCJtYXRjaGluZyBjYWNoZSBlbnRyeSBhdCAlZCBhbHJlYWR5IGFjdGl2ZS4iKSwKKwkJCQkJICAgICAgIGkpOworCQkJCSAgICAgICApCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFOyBpKyspIHsKKwkJaWYgKCFwTWFjLT5saW0ucHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID49IExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJObyBzcGFjZSBpbiBQcm90U3RhQ2FjaGUiKSk7KQorCQlyZXR1cm47CisJfQorCisJY2RmX21lbV9jb3B5KHBNYWMtPmxpbS5wcm90U3RhQ2FjaGVbaV0uYWRkciwKKwkJICAgICBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlwTWFjLT5saW0ucHJvdFN0YUNhY2hlW2ldLnByb3RTdGFDYWNoZVR5cGUgPSBwcm90U3RhQ2FjaGVUeXBlOworCXBNYWMtPmxpbS5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlID0gdHJ1ZTsKKwlpZiAoZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX2xsQiA9PSBwcm90U3RhQ2FjaGVUeXBlKSB7CisJCXBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMubnVtU3RhKys7CisJfSBlbHNlIGlmIChlTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfbGxHID09IHByb3RTdGFDYWNoZVR5cGUpIHsKKwkJcHNlc3Npb25FbnRyeS0+Z0xpbTExZ1BhcmFtcy5udW1TdGErKzsKKwl9Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX2lic3NfZGVjaWRlX3Byb3RlY3Rpb24KKyAgIFxicmllZiBEZWNpZGVzIGFsbCB0aGUgcHJvdGVjdGlvbiByZWxhdGVkIGluZm9ybWF0aW9uLgorIFwKKyAgIFxwYXJhbSAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworICAgXHBhcmFtICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkcgorICAgXHBhcmFtICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zCisgICBccmV0dXJuIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQKK2xpbV9pYnNzX2RlY2lkZV9wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YURzLAorCQkJICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywKKwkJCSAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpclJGQmFuZCByZkJhbmQgPSBTSVJfQkFORF9VTktOT1dOOworCXVpbnQzMl90IHBoeU1vZGU7CisJdExpbVByb3RTdGFDYWNoZVR5cGUgcHJvdFN0YUNhY2hlVHlwZSA9CisJCWVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9JTlZBTElEOworCisJcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgPSAwOworCisJaWYgKE5VTEwgPT0gcFN0YURzKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJwU3RhRHMgaXMgTlVMTCIpKTspCisJCXJldHVybjsKKwl9CisKKwlsaW1fZ2V0X3JmX2JhbmRfbmV3KHBNYWMsICZyZkJhbmQsIHBzZXNzaW9uRW50cnkpOworCWlmIChTSVJfQkFORF8yXzRfR0haID09IHJmQmFuZCkgeworCQlsaW1fZ2V0X3BoeV9tb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKworCQkvKiBXZSBhcmUgMTFHIG9yIDExbi4gQ2hlY2sgaWYgd2UgbmVlZCBwcm90ZWN0aW9uIGZyb20gMTFiIFN0YXRpb25zLiAqLworCQlpZiAoKHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpCisJCSAgICB8fCAocHNlc3Npb25FbnRyeS0+aHRDYXBhYmlsaXR5KSkgeworCQkJLyogQXMgd2UgZm91bmQgaW4gdGhlIHBhc3QsIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSAxMW4gU1RBIHNlbmRzCisJCQkgKiBCZWFjb24gd2l0aCBIVCBJRSBidXQgbm90IEVSUCBJRS4gIFNvIHRoZSBhYnNlbnNlIG9mIEVSUCBJRQorCQkJICogaW4gdGhlIEJlYWNvbiBpcyBub3QgZW5vdWdoIHRvIGNvbmNsdWRlIHRoYXQgU1RBIGlzIDExYi4KKwkJCSAqLworCQkJaWYgKChwU3RhRHMtPmVycEVuYWJsZWQgPT0gZUhBTF9DTEVBUikgJiYKKwkJCSAgICAoIXBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpKSB7CisJCQkJcHJvdFN0YUNhY2hlVHlwZSA9IGVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9sbEI7CisJCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCQkgICAgICAgRkwoIkVuYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFCIikpOworCQkJCSAgICAgICApCisJCQkJbGltX2lic3Nfc2V0X3Byb3RlY3Rpb24ocE1hYywgdHJ1ZSwKKwkJCQkJCQlwQmVhY29uUGFyYW1zLAorCQkJCQkJCXBzZXNzaW9uRW50cnkpOworCQkJfQorCQl9CisJfQorCWxpbV9pYnNzX3VwZGF0ZV9wcm90ZWN0aW9uX3BhcmFtcyhwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIHByb3RTdGFDYWNoZVR5cGUsCisJCQkJCSAgcHNlc3Npb25FbnRyeSk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGxpbV9pYnNzX3BlZXJfZmluZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgYWRkaW5nIGEgY29udGV4dCBhdAorICogRFBIICYgUG9sYXJpcyBmb3IgYSBwZWVyIGluIElCU1MuCisgKiBJZiBwZWVyIGlzIGZvdW5kIGluIHRoZSBsaXN0LCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUKKyAqIHJldHVybmVkIEJTUyBkZXNjcmlwdGlvbiBhcmUgdXNlZCBhdCBEUEggbm9kZSAmIFBvbGFyaXMuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIG1hY0FkZHIgLSBNQUMgYWRkcmVzcyBvZiB0aGUgcGVlcgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBwZWVyIG5vZGUgaWYgZm91bmQsIGVsc2UgTlVMTAorICovCit0TGltSWJzc1BlZXJOb2RlICpsaW1faWJzc19wZWVyX2ZpbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgbWFjQWRkcikKK3sKKwlyZXR1cm4gaWJzc19wZWVyX2ZpbmQocE1hYywgbWFjQWRkcik7Cit9CisKKy8qKgorICogbGltX2lic3Nfc3RhX2FkZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGFuIFNUQSBjb250ZXh0IGluIElCU1Mgcm9sZQorICogd2hlbmV2ZXIgYSBkYXRhIGZyYW1lIGlzIHJlY2VpdmVkIGZyb20vZm9yIGEgU1RBIHRoYXQgZmFpbGVkCisgKiBoYXNoIGxvb2t1cCBhdCBEUEguCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBlZXJBZGRkciAgTUFDIGFkZHJlc3Mgb2YgdGhlIHBlZXIgYmVpbmcgYWRkZWQKKyAqIEByZXR1cm4gcmV0Q29kZSAgICBJbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlIHJldHVybiBjb2RlCisgKiBAcmV0dXJuCisgKi8KKwordFNpclJldFN0YXR1cworbGltX2lic3Nfc3RhX2FkZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwQm9keSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisJdExpbUlic3NQZWVyTm9kZSAqcFBlZXJOb2RlOworCXRMaW1NbG1TdGF0ZXMgcHJldlN0YXRlOworCXRTaXJNYWNBZGRyICpwUGVlckFkZHIgPSAodFNpck1hY0FkZHIgKikgcEJvZHk7CisJdFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25QYXJhbXM7CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmYmVhY29uUGFyYW1zLCBzaXplb2YodFVwZGF0ZUJlYWNvblBhcmFtcyksIDApOworCisJaWYgKHBCb2R5ID09IDApIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgSUJTUyBBZGRTdGEiKSk7KQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJSeCBBZGQtSWJzcy1TdGEgZm9yIE1BQzoiKSk7KQorCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCAqcFBlZXJBZGRyLCBMT0dFKTsKKworCXBQZWVyTm9kZSA9IGlic3NfcGVlcl9maW5kKHBNYWMsICpwUGVlckFkZHIpOworCWlmIChOVUxMICE9IHBQZWVyTm9kZSkgeworCQlyZXRDb2RlID0KKwkJCWlic3NfZHBoX2VudHJ5X2FkZChwTWFjLCAqcFBlZXJBZGRyLCAmcFN0YURzLAorCQkJCQkgICBwc2Vzc2lvbkVudHJ5KTsKKwkJaWYgKGVTSVJfU1VDQ0VTUyA9PSByZXRDb2RlKSB7CisJCQlwcmV2U3RhdGUgPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGU7CisJCQlwU3RhRHMtPmVycEVuYWJsZWQgPSBwUGVlck5vZGUtPmVycEllUHJlc2VudDsKKworCQkJaWJzc19zdGFfaW5mb191cGRhdGUocE1hYywgcFN0YURzLCBwUGVlck5vZGUsCisJCQkJCSAgICAgcHNlc3Npb25FbnRyeSk7CisJCQlQRUxPR1cobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HVywKKwkJCQkgICAgICAgRkwoImluaXRpYXRpbmcgQUREIFNUQSBmb3IgdGhlIElCU1MgcGVlci4iKSk7CisJCQkgICAgICAgKQorCQkJcmV0Q29kZSA9CisJCQkJbGltX2FkZF9zdGEocE1hYywgcFN0YURzLCBmYWxzZSwgcHNlc3Npb25FbnRyeSk7CisJCQlpZiAocmV0Q29kZSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCQlQRUxPR0UobGltX2xvZworCQkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJCSAgICAgICBGTCgiaWJzcy1zdGEtYWRkIGZhaWxlZCAocmVhc29uICV4KSIpLAorCQkJCQkgICAgICAgcmV0Q29kZSk7CisJCQkJICAgICAgICkKKwkJCQlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgKnBQZWVyQWRkciwgTE9HRSk7CisJCQkJcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0gcHJldlN0YXRlOworCQkJCWRwaF9kZWxldGVfaGFzaF9lbnRyeShwTWFjLCBwU3RhRHMtPnN0YUFkZHIsCisJCQkJCQkgICAgICBwU3RhRHMtPmFzc29jSWQsCisJCQkJCQkgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLgorCQkJCQkJICAgICAgZHBoSGFzaFRhYmxlKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBNYWMtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0KKwkJCQkgICAgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorCQkJCQlsaW1faWJzc19kZWNpZGVfcHJvdGVjdGlvbihwTWFjLCBwU3RhRHMsCisJCQkJCQkJCSAgICZiZWFjb25QYXJhbXMsCisJCQkJCQkJCSAgIHBzZXNzaW9uRW50cnkpOworCisJCQkJaWYgKGJlYWNvblBhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcCkgeworCQkJCQlQRUxPR0UobGltX2xvZworCQkJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCQkJICAgICAgIEZMCisJCQkJCQkJICAgICAgICgiLS0tPiBVcGRhdGUgQmVhY29uIFBhcmFtcyAiKSk7CisJCQkJCSAgICAgICApCisJCQkJCXNjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyhwTWFjLAorCQkJCQkJCQkgICAgcHNlc3Npb25FbnRyeSk7CisJCQkJCWJlYWNvblBhcmFtcy5ic3NJZHggPQorCQkJCQkJcHNlc3Npb25FbnRyeS0+YnNzSWR4OworCQkJCQlsaW1fc2VuZF9iZWFjb25fcGFyYW1zKHBNYWMsICZiZWFjb25QYXJhbXMsCisJCQkJCQkJICAgICAgIHBzZXNzaW9uRW50cnkpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgiaGFzaFRibEFkZCBmYWlsZWQgKHJlYXNvbiAleCkiKSwKKwkJCQkgICAgICAgcmV0Q29kZSk7CisJCQkgICAgICAgKQorCQkJbGltX3ByaW50X21hY19hZGRyKHBNYWMsICpwUGVlckFkZHIsIExPR0UpOworCQl9CisJfSBlbHNlIHsKKwkJcmV0Q29kZSA9IGVTSVJfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gcmV0Q29kZTsKK30KKworLyogaGFuZGxlIHRoZSByZXNwb25zZSBmcm9tIEhBTCBmb3IgYW4gQUREIFNUQSByZXF1ZXN0ICovCit0U2lyUmV0U3RhdHVzCitsaW1faWJzc19hZGRfc3RhX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICptc2csIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisJdWludDE2X3QgcGVlcklkeDsKKwl0cEFkZFN0YVBhcmFtcyBwQWRkU3RhUGFyYW1zID0gKHRwQWRkU3RhUGFyYW1zKSBtc2c7CisKKwlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKwlpZiAocEFkZFN0YVBhcmFtcyA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJJQlNTOiBBRERfU1RBX1JTUCB3aXRoIG5vIGJvZHkhIikpOworCQkgICAgICAgKQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXBTdGFEcyA9CisJCWRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLCBwQWRkU3RhUGFyYW1zLT5zdGFNYWMsICZwZWVySWR4LAorCQkJCSAgICAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAocFN0YURzID09IE5VTEwpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTCgiSUJTUzogQUREX1NUQV9SU1AgZm9yIHVua25vd24gTUFDIGFkZHIgIikpOworCQkgICAgICAgKQorCQlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcEFkZFN0YVBhcmFtcy0+c3RhTWFjLCBMT0dFKTsKKwkJY2RmX21lbV9mcmVlKHBBZGRTdGFQYXJhbXMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWlmIChwQWRkU3RhUGFyYW1zLT5zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJJQlNTOiBBRERfU1RBX1JTUCBlcnJvciAoJXgpICIpLAorCQkJICAgICAgIHBBZGRTdGFQYXJhbXMtPnN0YXR1cyk7CisJCSAgICAgICApCisJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwQWRkU3RhUGFyYW1zLT5zdGFNYWMsIExPR0UpOworCQljZGZfbWVtX2ZyZWUocEFkZFN0YVBhcmFtcyk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJcFN0YURzLT5ic3NJZCA9IHBBZGRTdGFQYXJhbXMtPmJzc0lkeDsKKwlwU3RhRHMtPnN0YUluZGV4ID0gcEFkZFN0YVBhcmFtcy0+c3RhSWR4OworCXBTdGFEcy0+dWNVY2FzdFNpZyA9IHBBZGRTdGFQYXJhbXMtPnVjVWNhc3RTaWc7CisJcFN0YURzLT51Y0JjYXN0U2lnID0gcEFkZFN0YVBhcmFtcy0+dWNCY2FzdFNpZzsKKwlwU3RhRHMtPnZhbGlkID0gMTsKKwlwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFOworCisJUEVMT0dXKGxpbV9sb2cKKwkJICAgICAgIChwTWFjLCBMT0dXLCBGTCgiSUJTUzogc2VuZGluZyBJQlNTX05FV19QRUVSIG1zZyB0byBTTUUhIikpOworCSAgICAgICApCisKKwlpYnNzX3N0YXR1c19jaGdfbm90aWZ5KHBNYWMsIHBBZGRTdGFQYXJhbXMtPnN0YU1hYywKKwkJCSAgICAgICBwU3RhRHMtPnN0YUluZGV4LCBwU3RhRHMtPnVjVWNhc3RTaWcsCisJCQkgICAgICAgcFN0YURzLT51Y0JjYXN0U2lnLAorCQkJICAgICAgIGVXTklfU01FX0lCU1NfTkVXX1BFRVJfSU5ELAorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCk7CisKKwljZGZfbWVtX2ZyZWUocEFkZFN0YVBhcmFtcyk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit2b2lkIGxpbV9pYnNzX2RlbF9ic3NfcnNwX3doZW5fY29hbGVzY2luZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICptc2csCisJCQkJCSAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0cERlbGV0ZUJzc1BhcmFtcyBwRGVsQnNzID0gKHRwRGVsZXRlQnNzUGFyYW1zKSBtc2c7CisKKwlQRUxPR1cobGltX2xvZworCQkgICAgICAgKHBNYWMsIExPR1csIEZMKCJJQlNTOiBERUxfQlNTX1JTUCBSY3ZkIGR1cmluZyBjb2FsZXNjaW5nISIpKTsKKwkgICAgICAgKQorCisJaWYgKHBEZWxCc3MgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJJQlNTOiBERUxfQlNTX1JTUChjb2FsZXNjZSkgd2l0aCBubyBib2R5ISIpKTsKKwkJICAgICAgICkKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKHBEZWxCc3MtPnN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIklCU1M6IERFTF9CU1NfUlNQKGNvYWxlc2NlKSBlcnJvciAoJXgpIEJzcyAlZCAiKSwKKwkJCXBEZWxCc3MtPnN0YXR1cywgcERlbEJzcy0+YnNzSWR4KTsKKwkJZ290byBlbmQ7CisJfQorCS8qIERlbGV0ZSBwZWVyIGVudHJpZXMuICovCisJbGltX2lic3NfZGVsZXRlX2FsbF9wZWVycyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworCS8qIGFkZCB0aGUgbmV3IGJzcyAqLworCWlic3NfYnNzX2FkZChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworZW5kOgorCWlmIChwRGVsQnNzICE9IE5VTEwpCisJCWNkZl9tZW1fZnJlZShwRGVsQnNzKTsKK30KKwordm9pZCBsaW1faWJzc19hZGRfYnNzX3JzcF93aGVuX2NvYWxlc2NpbmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqbXNnLAorCQkJCQkgIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkpCit7CisJdWludDhfdCBpbmZvTGVuOworCXRTaXJTbWVOZXdCc3NJbmZvIG5ld0Jzc0luZm87CisKKwl0cEFkZEJzc1BhcmFtcyBwQWRkQnNzID0gKHRwQWRkQnNzUGFyYW1zKSBtc2c7CisKKwl0cFNpck1hY01nbXRIZHIgcEhkciA9ICh0cFNpck1hY01nbXRIZHIpIHBNYWMtPmxpbS5pYnNzSW5mby5wSGRyOworCXRwU2NoQmVhY29uU3RydWN0IHBCZWFjb24gPQorCQkodHBTY2hCZWFjb25TdHJ1Y3QpIHBNYWMtPmxpbS5pYnNzSW5mby5wQmVhY29uOworCisJaWYgKChwSGRyID09IE5VTEwpIHx8IChwQmVhY29uID09IE5VTEwpKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJVbmFibGUgdG8gaGFuZGxlIEFkZEJzc1JzcFdoZW5Db2FsZXNjaW5nIChubyBjYWNoZWQgQlNTIGluZm8pIikpOworCQkgICAgICAgKQorCQlnb3RvIGVuZDsKKwl9CisJLyogSW5mb3JtIEhvc3Qgb2YgSUJTUyBjb2FsZXNjaW5nICovCisJaW5mb0xlbiA9IHNpemVvZih0U2lyTWFjQWRkcikgKyBzaXplb2YodFNpck1hY0NoYW5OdW0pICsKKwkJICBzaXplb2YodWludDhfdCkgKyBwQmVhY29uLT5zc0lkLmxlbmd0aCArIDE7CisKKwljZGZfbWVtX3NldCgodm9pZCAqKSZuZXdCc3NJbmZvLCBzaXplb2YobmV3QnNzSW5mbyksIDApOworCWNkZl9tZW1fY29weShuZXdCc3NJbmZvLmJzc0lkLCBwSGRyLT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJbmV3QnNzSW5mby5jaGFubmVsTnVtYmVyID0gKHRTaXJNYWNDaGFuTnVtKSBwQWRkQnNzLT5jdXJyZW50T3BlckNoYW5uZWw7CisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZuZXdCc3NJbmZvLnNzSWQsCisJCSAgICAgKHVpbnQ4X3QgKikgJnBCZWFjb24tPnNzSWQsIHBCZWFjb24tPnNzSWQubGVuZ3RoICsgMSk7CisKKwlQRUxPR1cobGltX2xvZworCQkgICAgICAgKHBNYWMsIExPR1csIEZMKCJTZW5kaW5nIEpPSU5FRF9ORVdfQlNTIG5vdGlmaWNhdGlvbiB0byBTTUUuIikpOworCSAgICAgICApCisKKwlsaW1fc2VuZF9zbWVfd21fc3RhdHVzX2NoYW5nZV9udGYocE1hYywgZVNJUl9TTUVfSk9JTkVEX05FV19CU1MsCisJCQkJCSAgKHVpbnQzMl90ICopICZuZXdCc3NJbmZvLAorCQkJCQkgIGluZm9MZW4sIHBTZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCk7CisJeworCQkvKiBDb25maWd1cmUgYmVhY29uIGFuZCBzZW5kIGJlYWNvbnMgdG8gSEFMICovCisJCWxpbV9zZW5kX2JlYWNvbl9pbmQocE1hYywgcFNlc3Npb25FbnRyeSk7CisJfQorCitlbmQ6CisJaWJzc19jb2FsZXNjZV9mcmVlKHBNYWMpOworfQorCit2b2lkIGxpbV9pYnNzX2RlbF9ic3NfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKm1zZywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUmVzdWx0Q29kZXMgcmMgPSBlU0lSX1NNRV9TVUNDRVNTOworCXRwRGVsZXRlQnNzUGFyYW1zIHBEZWxCc3MgPSAodHBEZWxldGVCc3NQYXJhbXMpIG1zZzsKKwl0U2lyTWFjQWRkciBudWxsQnNzaWQgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCWlmIChwRGVsQnNzID09IE5VTEwpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoIklCU1M6IERFTF9CU1NfUlNQIHdpdGggbm8gYm9keSEiKSk7CisJCSAgICAgICApCisJCXJjID0gZVNJUl9TTUVfUkVGVVNFRDsKKwkJZ290byBlbmQ7CisJfQorCisJcHNlc3Npb25FbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKHBNYWMsIHBEZWxCc3MtPnNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEIikpOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKgorCSAqIElmIGRlbEJzcyB3YXMgaXNzdWVkIGFzIHBhcnQgb2YgSUJTUyBDb2FsZXNjaW5nLCBnTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZCBmbGFnIHdpbGwgYmUgdHJ1ZS4KKwkgKiBCU1MgaGFzIHRvIGJlIGFkZGVkIGFnYWluIGluIHRoaXMgc2NlbmFyaW8sIHNvIHRoaXMgY2FzZSBuZWVkcyB0byBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCisJICogSWYgZGVsQnNzIHdhcyBpc3N1ZWQgYXMgYSByZXN1bHQgb2YgdHJpZ2dlciBmcm9tIFNNRV9TVE9QX0JTUyBSZXF1ZXN0LCB0aGVuIGxpbVNtZSBzdGF0ZSBjaGFuZ2VzIHRvCisJICogJ0lETEUnIGFuZCBnTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZCBmbGFnIHdpbGwgYmUgZmFsc2UuIEluIHRoaXMgY2FzZSBTVE9QIEJTUyBSU1AgaGFzIHRvIGJlIHNlbnQgdG8gU01FLgorCSAqLworCWlmICh0cnVlID09IHBNYWMtPmxpbS5nTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZCkgeworCisJCWxpbV9pYnNzX2RlbF9ic3NfcnNwX3doZW5fY29hbGVzY2luZyhwTWFjLCBtc2csIHBzZXNzaW9uRW50cnkpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBEZWxCc3MtPnN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoIklCU1M6IERFTF9CU1NfUlNQIGVycm9yICgleCkgQnNzICVkICIpLAorCQkJICAgICAgIHBEZWxCc3MtPnN0YXR1cywgcERlbEJzcy0+YnNzSWR4KTsKKwkJICAgICAgICkKKwkJcmMgPSBlU0lSX1NNRV9TVE9QX0JTU19GQUlMVVJFOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAobGltX3NldF9saW5rX3N0YXRlKHBNYWMsIGVTSVJfTElOS19JRExFX1NUQVRFLCBudWxsQnNzaWQsCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsIE5VTEwsCisJCQkgICAgICAgTlVMTCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwoIklCU1M6IERFTF9CU1NfUlNQIHNldExpbmtTdGF0ZSBmYWlsZWQiKSk7CisJCSAgICAgICApCisJCXJjID0gZVNJUl9TTUVfUkVGVVNFRDsKKwkJZ290byBlbmQ7CisJfQorCisJbGltX2lic3NfZGVsZXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCisJZHBoX2hhc2hfdGFibGVfY2xhc3NfaW5pdChwTWFjLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJbGltX2RlbGV0ZV9wcmVfYXV0aF9saXN0KHBNYWMpOworCisJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9JRExFX1NUQVRFOworCisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKSk7CisKKwlwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9TVEFfUk9MRTsKKworCS8qIENoYW5nZSB0aGUgc2hvcnQgc2xvdCBvcGVyYXRpbmcgbW9kZSB0byBEZWZhdWx0ICh3aGljaCBpcyAxIGZvciBub3cpIHNvIHRoYXQgd2hlbiBJQlNTIHN0YXJ0cyBuZXh0IHRpbWUgd2l0aCBMaWJyYQorCSAqIGFzIG9yaWdpbmF0b3IsIGl0IHBpY2tzIHVwIHRoZSBkZWZhdWx0LiBUaGlzIGVuYWJsZXMgdXMgdG8gcmVtb3ZlIGhhcmQgY29kaW5nIG9mIHNob3J0IHNsb3QgPSAxIGZyb20gbGltX2FwcGx5X2NvbmZpZ3VyYXRpb24KKwkgKi8KKwlwc2Vzc2lvbkVudHJ5LT5zaG9ydFNsb3RUaW1lU3VwcG9ydGVkID0gV05JX0NGR19TSE9SVF9TTE9UX1RJTUVfU1RBREVGOworCitlbmQ6CisJaWYgKHBEZWxCc3MgIT0gTlVMTCkKKwkJY2RmX21lbV9mcmVlKHBEZWxCc3MpOworCS8qIERlbGV0ZSBQRSBzZXNzaW9uIG9uY2UgQlNTIGlzIGRlbGV0ZWQgKi8KKwlpZiAoTlVMTCAhPSBwc2Vzc2lvbkVudHJ5KSB7CisJCWxpbV9zZW5kX3NtZV9yc3AocE1hYywgZVdOSV9TTUVfU1RPUF9CU1NfUlNQLCByYywKKwkJCQkgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLAorCQkJCSBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKKwkJcGVfZGVsZXRlX3Nlc3Npb24ocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCXBzZXNzaW9uRW50cnkgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQKK19fbGltX2lic3Nfc2VhcmNoX2FuZF9kZWxldGVfcGVlcih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwgdFNpck1hY0FkZHIgbWFjQWRkcikKK3sKKwl0TGltSWJzc1BlZXJOb2RlICpwVGVtcE5vZGUsICpwUHJldk5vZGU7CisJdExpbUlic3NQZWVyTm9kZSAqcFRlbXBOZXh0Tm9kZSA9IE5VTEw7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworCXVpbnQxNl90IHBlZXJJZHggPSAwOworCXVpbnQxNl90IHN0YUluZGV4ID0gMDsKKwl1aW50OF90IHVjVWNhc3RTaWc7CisJdWludDhfdCB1Y0JjYXN0U2lnOworCisJcFByZXZOb2RlID0gcFRlbXBOb2RlID0gcE1hYy0+bGltLmdMaW1JYnNzUGVlckxpc3Q7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCIgUEVFUiBBRERSIDoiIE1BQ19BRERSRVNTX1NUUiksCisJCU1BQ19BRERSX0FSUkFZKG1hY0FkZHIpKTsKKworCS8qKiBDb21wYXJlIFBlZXIgKi8KKwl3aGlsZSAoTlVMTCAhPSBwVGVtcE5vZGUpIHsKKwkJcFRlbXBOZXh0Tm9kZSA9IHBUZW1wTm9kZS0+bmV4dDsKKworCQkvKiBEZWxldGUgdGhlIFNUQSB3aXRoIE1BQyBhZGRyZXNzICovCisJCWlmIChjZGZfbWVtX2NvbXBhcmUoKHVpbnQ4X3QgKikgbWFjQWRkciwKKwkJCQkgICAgKHVpbnQ4X3QgKikgJnBUZW1wTm9kZS0+cGVlck1hY0FkZHIsCisJCQkJICAgIHNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQlwU3RhRHMgPSBkcGhfbG9va3VwX2hhc2hfZW50cnkocE1hYywgbWFjQWRkciwKKwkJCQkJCSAgICAgICAmcGVlcklkeCwKKwkJCQkJCSAgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLgorCQkJCQkJICAgICAgIGRwaEhhc2hUYWJsZSk7CisJCQlpZiAocFN0YURzKSB7CisJCQkJc3RhSW5kZXggPSBwU3RhRHMtPnN0YUluZGV4OworCQkJCXVjVWNhc3RTaWcgPSBwU3RhRHMtPnVjVWNhc3RTaWc7CisJCQkJdWNCY2FzdFNpZyA9IHBTdGFEcy0+dWNCY2FzdFNpZzsKKworCQkJCSh2b2lkKWxpbV9kZWxfc3RhKHBNYWMsIHBTdGFEcywKKwkJCQkJCSAgZmFsc2UgLyphc3luY2hyb25vdXMgKi8sCisJCQkJCQkgIHBzZXNzaW9uRW50cnkpOworCQkJCWxpbV9kZWxldGVfZHBoX2hhc2hfZW50cnkocE1hYywgcFN0YURzLT5zdGFBZGRyLAorCQkJCQkJCSAgcGVlcklkeCwgcHNlc3Npb25FbnRyeSk7CisJCQkJbGltX3JlbGVhc2VfcGVlcl9pZHgocE1hYywgcGVlcklkeCwgcHNlc3Npb25FbnRyeSk7CisKKwkJCQkvKiBTZW5kIGluZGljYXRpb24gdG8gdXBwZXIgbGF5ZXJzICovCisJCQkJaWJzc19zdGF0dXNfY2hnX25vdGlmeShwTWFjLCBtYWNBZGRyLCBzdGFJbmRleCwKKwkJCQkJCSAgICAgICB1Y1VjYXN0U2lnLCB1Y0JjYXN0U2lnLAorCQkJCQkJICAgICAgIGVXTklfU01FX0lCU1NfUEVFUl9ERVBBUlRFRF9JTkQsCisJCQkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+CisJCQkJCQkgICAgICAgc21lU2Vzc2lvbklkKTsKKwkJCQlpZiAocFRlbXBOb2RlID09IHBNYWMtPmxpbS5nTGltSWJzc1BlZXJMaXN0KSB7CisJCQkJCXBNYWMtPmxpbS5nTGltSWJzc1BlZXJMaXN0ID0KKwkJCQkJCXBUZW1wTm9kZS0+bmV4dDsKKwkJCQkJcFByZXZOb2RlID0gcE1hYy0+bGltLmdMaW1JYnNzUGVlckxpc3Q7CisJCQkJfSBlbHNlCisJCQkJCXBQcmV2Tm9kZS0+bmV4dCA9IHBUZW1wTm9kZS0+bmV4dDsKKworCQkJCWNkZl9tZW1fZnJlZShwVGVtcE5vZGUpOworCQkJCXBNYWMtPmxpbS5nTGltTnVtSWJzc1BlZXJzLS07CisKKwkJCQlwVGVtcE5vZGUgPSBwVGVtcE5leHROb2RlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXBQcmV2Tm9kZSA9IHBUZW1wTm9kZTsKKwkJcFRlbXBOb2RlID0gcFRlbXBOZXh0Tm9kZTsKKwl9CisJLyoKKwkgKiBpZiBpdCBpcyB0aGUgbGFzdCBwZWVyIHdhbGtpbmcgb3V0LCB3ZSBiZXR0ZXIKKwkgKiB3ZSBzZXQgSUJTUyBzdGF0ZSB0byBpbmFjdGl2ZS4KKwkgKi8KKwlpZiAoMCA9PSBwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICJMYXN0IFNUQSBmcm9tIElCU1Mgd2Fsa2VkIG91dCIpOworCQlwc2Vzc2lvbkVudHJ5LT5saW1JYnNzQWN0aXZlID0gZmFsc2U7CisJfQorfQorCisvKioKKyAqIGxpbV9pYnNzX2NvYWxlc2NlKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIHJlY2VpdmluZyBCZWFjb24vUHJvYmUgUmVzcG9uc2UKKyAqIHdoaWxlIG9wZXJhdGluZyBpbiBJQlNTIG1vZGUuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBCZWFjb24gLSBQYXJzZWQgQmVhY29uIEZyYW1lIHN0cnVjdHVyZQorICogQHBhcmFtICBwQkQgICAgIC0gUG9pbnRlciB0byByZWNlaXZlZCBCRAorICoKKyAqIEByZXR1cm4gU3RhdHVzIHdoZXRoZXIgdG8gcHJvY2VzcyBvciBpZ25vcmUgcmVjZWl2ZWQgQmVhY29uIEZyYW1lCisgKi8KKwordFNpclJldFN0YXR1cworbGltX2lic3NfY29hbGVzY2UodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICB0cFNpck1hY01nbXRIZHIgcEhkciwKKwkJICB0cFNjaEJlYWNvblN0cnVjdCBwQmVhY29uLAorCQkgIHVpbnQ4X3QgKnBJRXMsCisJCSAgdWludDMyX3QgaWVMZW4sIHVpbnQxNl90IGZUc2ZMYXRlciwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MTZfdCBwZWVySWR4OworCXRTaXJNYWNBZGRyIGN1cnJlbnRCc3NJZDsKKwl0TGltSWJzc1BlZXJOb2RlICpwUGVlck5vZGU7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisJdFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25QYXJhbXM7CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmYmVhY29uUGFyYW1zLCBzaXplb2YodFVwZGF0ZUJlYWNvblBhcmFtcyksIDApOworCisJc2lyX2NvcHlfbWFjX2FkZHIoY3VycmVudEJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsCisJCUZMKCJDdXJyZW50IEJTU0lEIDoiIE1BQ19BRERSRVNTX1NUUiAiIFJlY2VpdmVkIEJTU0lEIDoiCisJCSAgIE1BQ19BRERSRVNTX1NUUiksIE1BQ19BRERSX0FSUkFZKGN1cnJlbnRCc3NJZCksCisJCU1BQ19BRERSX0FSUkFZKHBIZHItPmJzc0lkKSk7CisKKwkvKiBDaGVjayBmb3IgSUJTUyBDb2FsZXNjaW5nIG9ubHkgaWYgQmVhY29uIGlzIGZyb20gZGlmZmVyZW50IEJTUyAqLworCWlmICghY2RmX21lbV9jb21wYXJlKGN1cnJlbnRCc3NJZCwgcEhkci0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpCisJICAgICYmIHBzZXNzaW9uRW50cnktPmlzQ29hbGVzaW5nSW5JQlNTQWxsb3dlZCkgeworCQkvKgorCQkgKiBJZiBTVEEgZW50cnkgaXMgYWxyZWFkeSBhdmFpbGFibGUgaW4gdGhlIExJTSBoYXNoIHRhYmxlLCB0aGVuIGl0IGlzCisJCSAqIHBvc3NpYmxlIHRoYXQgdGhlIHBlZXIgbWF5IGhhdmUgbGVmdCBhbmQgcmVqb2luZWQgd2l0aGluIHRoZSBoZWFydGJlYXQKKwkJICogdGltZW91dC4gSW4gdGhlIG9mZmxvYWRlZCBjYXNlIHdpdGggMzIgcGVlcnMsIHRoZSBIQiB0aW1lb3V0IGlzIHdob3BwaW5nCisJCSAqIDEyOCBzZWNvbmRzLiBJbiB0aGF0IGNhc2UsIHRoZSBGVyB3aWxsIG5vdCBsZXQgYW55IGZyYW1lcyBjb21lIGluIHVudGlsCisJCSAqIGF0bGVhc3QgdGhlIGxhc3Qgc2VxdWVuY2UgbnVtYmVyIGlzIHJlY2VpdmVkIGJlZm9yZSB0aGUgcGVlciBpcyBsZWZ0CisJCSAqIEhlbmNlLCBpZiB0aGUgY29hbGVzY2luZyBwZWVyIGlzIGFscmVhZHkgdGhlcmUgaW4gdGhlIHBlZXIgbGlzdCBhbmQgaWYKKwkJICogdGhlIEJTU0lEIG1hdGNoZXMgdGhlbiwgaW52b2tlIGRlbFN0YSgpIHRvIGNsZWFudXAgdGhlIGVudHJpZXMuIFdlIHdpbGwKKwkJICogbGV0IHRoZSBwZWVyIGNvYWxlc2NlIHdoZW4gd2UgcmVjZWl2ZSBuZXh0IGJlYWNvbiBmcm9tIHRoZSBwZWVyCisJCSAqLworCQlwUGVlck5vZGUgPSBpYnNzX3BlZXJfZmluZChwTWFjLCBwSGRyLT5zYSk7CisJCWlmIChOVUxMICE9IHBQZWVyTm9kZSkgeworCQkJX19saW1faWJzc19zZWFyY2hfYW5kX2RlbGV0ZV9wZWVyKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQkJCQkJICBwSGRyLT5zYSk7CisJCQlQRUxPR1cobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HVywKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgiKiogUGVlciBhdHRlbXB0aW5nIHRvIHJlY29ubmVjdCBiZWZvcmUgSEIgdGltZW91dCwgZGVsZXRlZCAqKiIpKTsKKwkJCSAgICAgICApCisJCQlyZXR1cm4gZVNJUl9MSU1fSUdOT1JFX0JFQUNPTjsKKwkJfQorCisJCWlmICghZlRzZkxhdGVyKSB7IC8qIE5vIENvYWxlc2NpbmcgaGFwcGVuZWQuICovCisJCQlQRUxPR1cobGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiTm8gQ29hbGVzY2luZyBoYXBwZW5lZCIpKTspCisJCQlyZXR1cm4gZVNJUl9MSU1fSUdOT1JFX0JFQUNPTjsKKwkJfQorCQkvKgorCQkgKiBJQlNTIENvYWxlc2NpbmcgaGFwcGVuZWQuCisJCSAqIHNhdmUgdGhlIHJlY2VpdmVkIGJlYWNvbiwgYW5kIGRlbGV0ZSB0aGUgY3VycmVudCBCU1MuIFRoZSByZXN0IG9mIHRoZQorCQkgKiBwcm9jZXNzaW5nIHdpbGwgYmUgZG9uZSBpbiB0aGUgZGVsQnNzIHJlc3BvbnNlIHByb2Nlc3NpbmcKKwkJICovCisJCXBNYWMtPmxpbS5nTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZCA9IHRydWU7CisJCVBFTE9HVyhsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJJQlNTIENvYWxlc2NpbmcgaGFwcGVuZWQiKSk7KQorCQlpYnNzX2NvYWxlc2NlX3NhdmUocE1hYywgcEhkciwgcEJlYWNvbik7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIkRlbGV0ZSBCU1NJRCA6IiBNQUNfQUREUkVTU19TVFIpLAorCQkJTUFDX0FERFJfQVJSQVkoY3VycmVudEJzc0lkKSk7CisJCWlic3NfYnNzX2RlbGV0ZShwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlpZiAoIWNkZl9tZW1fY29tcGFyZQorCQkJICAgIChjdXJyZW50QnNzSWQsIHBIZHItPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKSkKKwkJCXJldHVybiBlU0lSX0xJTV9JR05PUkVfQkVBQ09OOworCX0KKworCS8qIFNUQSBpbiBJQlNTIG1vZGUgYW5kIFNTSUQgbWF0Y2hlcyB3aXRoIG91cnMgKi8KKwlwUGVlck5vZGUgPSBpYnNzX3BlZXJfZmluZChwTWFjLCBwSGRyLT5zYSk7CisJaWYgKHBQZWVyTm9kZSA9PSBOVUxMKSB7CisJCS8qIFBlZXIgbm90IGluIHRoZSBsaXN0IC0gQ29sbGVjdCBCU1MgZGVzY3JpcHRpb24gJiBhZGQgdG8gdGhlIGxpc3QgKi8KKwkJdWludDMyX3QgZnJhbWVMZW47CisJCXRTaXJSZXRTdGF0dXMgcmV0Q29kZTsKKworCQkvKgorCQkgKiBMaW1pdCB0aGUgTWF4IG51bWJlciBvZiBJQlNTIFBlZXJzIGFsbG93ZWQgYXMgdGhlIG1heAorCQkgKiBudW1iZXIgb2YgU1RBJ3MgYWxsb3dlZAorCQkgKiBwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycyB3aWxsIGJlIGluY3JlYW1lbnRlZCBhZnRlciBleGl0aW5nCisJCSAqIHRoaXMgZnVuY3Rpb24uIHNvIHdlIHdpbGwgYWRkIGFkZGl0aW9uYWwgMSB0byBjb21wYXJlIGFnYWluc3QKKwkJICogcE1hYy0+bGltLmdMaW1JYnNzU3RhTGltaXQKKwkJICovCisJCWlmICgocE1hYy0+bGltLmdMaW1OdW1JYnNzUGVlcnMgKyAxKSA+PQorCQkgICAgcE1hYy0+bGltLmdMaW1JYnNzU3RhTGltaXQpIHsKKwkJCS8qUHJpbnQgZXZlcnkgMTAwdGggdGltZSAqLworCQkJaWYgKHBNYWMtPmxpbS5pYnNzX3JldHJ5X2NudCAlIDEwMCA9PSAwKSB7CisJCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HMSwKKwkJCQkgICAgRkwoIioqKiogTUFYIFNUQSBMSU1JVCBIQVMgUkVBQ0hFRCAqKioqIikpOykKKwkJCX0KKwkJCXBNYWMtPmxpbS5pYnNzX3JldHJ5X2NudCsrOworCQkJcmV0dXJuIGVTSVJfTElNX01BWF9TVEFfUkVBQ0hFRF9FUlJPUjsKKwkJfQorCQlQRUxPR1cobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJICAgICAgIEZMKCJJQlNTIFBlZXIgbm9kZSBkb2VzIG5vdCBleGlzdCwgYWRkaW5nIGl0KioqIikpOworCQkgICAgICAgKQorCQlmcmFtZUxlbiA9CisJCQlzaXplb2YodExpbUlic3NQZWVyTm9kZSkgKyBpZUxlbiAtIHNpemVvZih1aW50MzJfdCk7CisKKwkJcFBlZXJOb2RlID0gY2RmX21lbV9tYWxsb2MoKHVpbnQxNl90KSBmcmFtZUxlbik7CisJCWlmIChOVUxMID09IHBQZWVyTm9kZSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiYWxsb2MgZmFpbCAoJWQgYnl0ZXMpIHN0b3JpbmcgSUJTUyBwZWVyIGluZm8iKSwKKwkJCQlmcmFtZUxlbik7CisJCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQl9CisKKwkJcFBlZXJOb2RlLT5iZWFjb24gPSBOVUxMOworCQlwUGVlck5vZGUtPmJlYWNvbkxlbiA9IDA7CisKKwkJaWJzc19wZWVyX2NvbGxlY3QocE1hYywgcEJlYWNvbiwgcEhkciwgcFBlZXJOb2RlLAorCQkJCSAgcHNlc3Npb25FbnRyeSk7CisJCXBQZWVyTm9kZS0+YmVhY29uID0gY2RmX21lbV9tYWxsb2MoaWVMZW4pOworCQlpZiAoTlVMTCA9PSBwUGVlck5vZGUtPmJlYWNvbikgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgYmVhY29uIikpOworCQkJICAgICAgICkKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fY29weShwUGVlck5vZGUtPmJlYWNvbiwgcElFcywgaWVMZW4pOworCQkJcFBlZXJOb2RlLT5iZWFjb25MZW4gPSAodWludDE2X3QpIGllTGVuOworCQl9CisJCWlic3NfcGVlcl9hZGQocE1hYywgcFBlZXJOb2RlKTsKKworCQlwU3RhRHMgPQorCQkJZHBoX2xvb2t1cF9oYXNoX2VudHJ5KHBNYWMsIHBQZWVyTm9kZS0+cGVlck1hY0FkZHIsICZwZWVySWR4LAorCQkJCQkgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCWlmIChwU3RhRHMgIT0gTlVMTCkgeworCQkJLyogLyBEUEggbm9kZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHBlZXIgKi8KKwkJCVBFTE9HVyhsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJCSAgICAgICBGTCgiRFBIIE5vZGUgcHJlc2VudCBmb3IganVzdCBsZWFybmVkIHBlZXIiKSk7CisJCQkgICAgICAgKQorCQkJUEVMT0cxKGxpbV9wcmludF9tYWNfYWRkcgorCQkJCSAgICAgICAocE1hYywgcFBlZXJOb2RlLT5wZWVyTWFjQWRkciwgTE9HMSk7CisJCQkgICAgICAgKQorCQkJaWJzc19zdGFfaW5mb191cGRhdGUocE1hYywgcFN0YURzLCBwUGVlck5vZGUsCisJCQkJCSAgICAgcHNlc3Npb25FbnRyeSk7CisJCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCQl9CisJCXJldENvZGUgPQorCQkJbGltX2lic3Nfc3RhX2FkZChwTWFjLCBwUGVlck5vZGUtPnBlZXJNYWNBZGRyLCBwc2Vzc2lvbkVudHJ5KTsKKwkJaWYgKHJldENvZGUgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoImxpbS1pYnNzLXN0YS1hZGQgZmFpbGVkIChyZWFzb24gJXgpIiksCisJCQkJICAgICAgIHJldENvZGUpOworCQkJICAgICAgICkKKwkJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwUGVlck5vZGUtPnBlZXJNYWNBZGRyLCBMT0dFKTsKKwkJCXJldHVybiByZXRDb2RlOworCQl9CisJCS8qIERlY2lkZSBwcm90ZWN0aW9uIG1vZGUgKi8KKwkJcFN0YURzID0KKwkJCWRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLCBwUGVlck5vZGUtPnBlZXJNYWNBZGRyLCAmcGVlcklkeCwKKwkJCQkJICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQlpZiAocE1hYy0+bGltLmdMaW1Qcm90ZWN0aW9uQ29udHJvbCAhPQorCQkgICAgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorCQkJbGltX2lic3NfZGVjaWRlX3Byb3RlY3Rpb24ocE1hYywgcFN0YURzLCAmYmVhY29uUGFyYW1zLAorCQkJCQkJICAgcHNlc3Npb25FbnRyeSk7CisKKwkJaWYgKGJlYWNvblBhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcCkgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoImJlYWNvblBhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcD0xIC0tLT4gVXBkYXRlIEJlYWNvbiBQYXJhbXMgIikpOworCQkJICAgICAgICkKKwkJCXNjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJCWJlYWNvblBhcmFtcy5ic3NJZHggPSBwc2Vzc2lvbkVudHJ5LT5ic3NJZHg7CisJCQlsaW1fc2VuZF9iZWFjb25fcGFyYW1zKHBNYWMsICZiZWFjb25QYXJhbXMsIHBzZXNzaW9uRW50cnkpOworCQl9CisJfSBlbHNlCisJCWlic3Nfc3RhX2NhcHNfdXBkYXRlKHBNYWMsIHBQZWVyTm9kZSwgcHNlc3Npb25FbnRyeSk7CisKKwlpZiAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKQorCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCisJLyogUmVjZWl2ZWQgQmVhY29uIGZyb20gc2FtZSBJQlNTIHdlJ3JlICovCisJLyogY3VycmVudGx5IHBhcnQgb2YuIEluZm9ybSBSb2FtaW5nIGFsZ29yaXRobSAqLworCS8qIGlmIG5vdCBhbHJlYWR5IHRoYXQgSUJTUyBpcyBhY3RpdmUuICovCisJaWYgKHBzZXNzaW9uRW50cnktPmxpbUlic3NBY3RpdmUgPT0gZmFsc2UpIHsKKwkJbGltUmVzZXRIQlBrdENvdW50KHBzZXNzaW9uRW50cnkpOworCQlQRUxPR1cobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiUGFydG5lciBqb2luZWQgb3VyIElCU1MsIFNlbmRpbmcgSUJTU19BQ1RJVkUgTm90aWZpY2F0aW9uIHRvIFNNRSIpKTsKKwkJICAgICAgICkKKwkJcHNlc3Npb25FbnRyeS0+bGltSWJzc0FjdGl2ZSA9IHRydWU7CisJCWxpbV9zZW5kX3NtZV93bV9zdGF0dXNfY2hhbmdlX250ZihwTWFjLCBlU0lSX1NNRV9JQlNTX0FDVElWRSwgTlVMTCwgMCwKKwkJCQkJCSAgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkKTsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqIGVuZCBsaW1faGFuZGxlX2lic19zY29hbGVzY2luZygpICoqKi8KKworLyoqCisgKiBsaW1faWJzc19oZWFydF9iZWF0X2hhbmRsZSgpIC0gaGFuZGxlIElCU1MgaGVhcmJlYXQgZmFpbHVyZQorICoKKyAqIEBtYWNfY3R4OiBnbG9iYWwgbWFjIGNvbnRleHQKKyAqIEBzZXNzaW9uOiBQRSBzZXNzaW9uIGVudHJ5CisgKgorICogSGFubGRlIElCU1MgaGVhcmJlYXQgZmFpbHVyZS4KKyAqCisgKiBSZXR1cm46IE5vbmUuCisgKi8KK3ZvaWQgbGltX2lic3NfaGVhcnRfYmVhdF9oYW5kbGUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdHBQRVNlc3Npb24gc2Vzc2lvbikKK3sKKwl0TGltSWJzc1BlZXJOb2RlICp0ZW1wbm9kZSwgKnByZXZub2RlOworCXRMaW1JYnNzUGVlck5vZGUgKnRlbXBfbmV4dCA9IE5VTEw7CisJdWludDE2X3QgcGVlcl9pZHggPSAwOworCXRwRHBoSGFzaE5vZGUgc3RhZHMgPSAwOworCXVpbnQzMl90IHRocmVzaG9sZCA9IDA7CisJdWludDE2X3Qgc3RhX2lkeCA9IDA7CisJdWludDhfdCB1Y2FzdF9zaWcgPSAwOworCXVpbnQ4X3QgYmNhc3Rfc2lnID0gMDsKKworCS8qCisJICogTUxNIEJTUyBpcyBzdGFydGVkIGFuZCBpZiBQRSBpbiBzY2FubW9kZSB0aGVuIE1MTSBzdGF0ZSB3aWxsIGJlCisJICogd2FpdGluZyBmb3IgcHJvYmUgcmVzcC4gSWYgSGVhcnQgYmVhdCB0aW1lb3V0IHRyaWdnZXJzIGR1cmluZyB0aGlzCisJICogY29ybmVyIGNhc2UgdGhlbiB3ZSBuZWVkIHRvIHJlYWN0aXZhdGUgSGVhcnRCZWF0IHRpbWVyLgorCSAqLworCWlmIChzZXNzaW9uLT5saW1NbG1TdGF0ZSAhPSBlTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURSkKKwkJcmV0dXJuOworCisJLyogSWYgTGlua01vbml0b3IgaXMgRGlzYWJsZWQgKi8KKwlpZiAoIW1hY19jdHgtPnN5cy5nU3lzRW5hYmxlTGlua01vbml0b3JNb2RlKQorCQlyZXR1cm47CisKKwlwcmV2bm9kZSA9IHRlbXBub2RlID0gbWFjX2N0eC0+bGltLmdMaW1JYnNzUGVlckxpc3Q7CisJdGhyZXNob2xkID0gKG1hY19jdHgtPmxpbS5nTGltTnVtSWJzc1BlZXJzIC8gNCkgKyAxOworCisJLyogTW9uaXRvciB0aGUgSGVhcnRCZWF0IHdpdGggdGhlIEluZGl2aWR1YWwgUEVFUlMgaW4gdGhlIElCU1MgKi8KKwl3aGlsZSAodGVtcG5vZGUgIT0gTlVMTCkgeworCQl0ZW1wX25leHQgPSB0ZW1wbm9kZS0+bmV4dDsKKwkJaWYgKHRlbXBub2RlLT5iZWFjb25IQkNvdW50KSB7CisJCQkvKiBUaGVyZSB3YXMgYSBiZWFjb24gZm9yIHRoaXMgcGVlciBkdXJpbmcgaGVhcnQgYmVhdCAqLworCQkJdGVtcG5vZGUtPmJlYWNvbkhCQ291bnQgPSAwOworCQkJdGVtcG5vZGUtPmhlYXJ0YmVhdEZhaWx1cmUgPSAwOworCQkJcHJldm5vZGUgPSB0ZW1wbm9kZTsKKwkJCXRlbXBub2RlID0gdGVtcF9uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUaGVyZSB3YXNudCBhbnkgYmVhY29uIHJlY2VpdmVkIGR1cmluZyBoZWFydGJlYXQgdGltZXIuICovCisJCXRlbXBub2RlLT5oZWFydGJlYXRGYWlsdXJlKys7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkhlYXJ0YmVhdCBmYWlsID0gJWQgIHRocmVzID0gJWQiKSwKKwkJICAgIHRlbXBub2RlLT5oZWFydGJlYXRGYWlsdXJlLCBtYWNfY3R4LT5saW0uZ0xpbU51bUlic3NQZWVycyk7CisJCWlmICh0ZW1wbm9kZS0+aGVhcnRiZWF0RmFpbHVyZSA+PSB0aHJlc2hvbGQpIHsKKwkJCS8qIFJlbW92ZSB0aGlzIGVudHJ5IGZyb20gdGhlIGxpc3QuICovCisJCQlzdGFkcyA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShtYWNfY3R4LAorCQkJCQl0ZW1wbm9kZS0+cGVlck1hY0FkZHIsICZwZWVyX2lkeCwKKwkJCQkJJnNlc3Npb24tPmRwaC5kcGhIYXNoVGFibGUpOworCQkJaWYgKHN0YWRzKSB7CisJCQkJc3RhX2lkeCA9IHN0YWRzLT5zdGFJbmRleDsKKwkJCQl1Y2FzdF9zaWcgPSBzdGFkcy0+dWNVY2FzdFNpZzsKKwkJCQliY2FzdF9zaWcgPSBzdGFkcy0+dWNCY2FzdFNpZzsKKworCQkJCSh2b2lkKWxpbV9kZWxfc3RhKG1hY19jdHgsIHN0YWRzLCBmYWxzZSwKKwkJCQkJCSAgc2Vzc2lvbik7CisJCQkJbGltX2RlbGV0ZV9kcGhfaGFzaF9lbnRyeShtYWNfY3R4LAorCQkJCQlzdGFkcy0+c3RhQWRkciwgcGVlcl9pZHgsIHNlc3Npb24pOworCQkJCWxpbV9yZWxlYXNlX3BlZXJfaWR4KG1hY19jdHgsIHBlZXJfaWR4LAorCQkJCQkJICAgICBzZXNzaW9uKTsKKwkJCQkvKiBTZW5kIGluZGljYXRpb24uICovCisJCQkJaWJzc19zdGF0dXNfY2hnX25vdGlmeShtYWNfY3R4LAorCQkJCQl0ZW1wbm9kZS0+cGVlck1hY0FkZHIsIHN0YV9pZHgsCisJCQkJCXVjYXN0X3NpZywgYmNhc3Rfc2lnLAorCQkJCQllV05JX1NNRV9JQlNTX1BFRVJfREVQQVJURURfSU5ELAorCQkJCQlzZXNzaW9uLT5zbWVTZXNzaW9uSWQpOworCQkJfQorCQkJaWYgKHRlbXBub2RlID09IG1hY19jdHgtPmxpbS5nTGltSWJzc1BlZXJMaXN0KSB7CisJCQkJbWFjX2N0eC0+bGltLmdMaW1JYnNzUGVlckxpc3QgPSB0ZW1wbm9kZS0+bmV4dDsKKwkJCQlwcmV2bm9kZSA9IG1hY19jdHgtPmxpbS5nTGltSWJzc1BlZXJMaXN0OworCQkJfSBlbHNlIHsKKwkJCQlwcmV2bm9kZS0+bmV4dCA9IHRlbXBub2RlLT5uZXh0OworCQkJfQorCisJCQljZGZfbWVtX2ZyZWUodGVtcG5vZGUpOworCQkJbWFjX2N0eC0+bGltLmdMaW1OdW1JYnNzUGVlcnMtLTsKKworCQkJLyogd2UgZGVsZXRlZCBjdXJyZW50IG5vZGUsIHNvIHByZXZOb2RlIHJlbWFpbnMgc2FtZS4gKi8KKwkJCXRlbXBub2RlID0gdGVtcF9uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJcHJldm5vZGUgPSB0ZW1wbm9kZTsKKwkJdGVtcG5vZGUgPSB0ZW1wX25leHQ7CisJfQorCisJLyoKKwkgKiBHZW5lcmFsIElCU1MgQWN0aXZpdHkgTW9uaXRvciwKKwkgKiBjaGVjayBpZiBpbiBJQlNTIE1vZGUgd2UgYXJlIHJlY2VpdmVkIGFueSBCZWFjb25zCisJICovCisJaWYgKG1hY19jdHgtPmxpbS5nTGltTnVtSWJzc1BlZXJzKSB7CisJCWlmIChzZXNzaW9uLT5MaW1SeGVkQmVhY29uQ250RHVyaW5nSEIgPAorCQkgICAgTUFYX05PX0JFQUNPTlNfUEVSX0hFQVJUX0JFQVRfSU5URVJWQUwpCisJCQltYWNfY3R4LT5saW0uZ0xpbUhlYXJ0QmVhdEJlYWNvblN0YXRzWworCQkJCXNlc3Npb24tPkxpbVJ4ZWRCZWFjb25DbnREdXJpbmdIQl0rKzsKKwkJZWxzZQorCQkJbWFjX2N0eC0+bGltLmdMaW1IZWFydEJlYXRCZWFjb25TdGF0c1swXSsrOworCisJCS8qIFJlc2V0IG51bWJlciBvZiBiZWFjb25zIHJlY2VpdmVkICovCisJCWxpbVJlc2V0SEJQa3RDb3VudChzZXNzaW9uKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywgRkwoIkhlYXJ0YmVhdCBGYWlsdXJlIikpOworCQltYWNfY3R4LT5saW0uZ0xpbUhCZmFpbHVyZUNudEluTGlua0VzdFN0YXRlKys7CisKKwkJaWYgKHNlc3Npb24tPmxpbUlic3NBY3RpdmUgPT0gdHJ1ZSkgeworCQkJLyoKKwkJCSAqIFdlIGRvbid0IHJlY2VpdmUgQmVhY29uIGZyYW1lcyBmcm9tIGFueQorCQkJICogb3RoZXIgU1RBIGluIElCU1MuIEFubm91bmNlIElCU1MgaW5hY3RpdmUKKwkJCSAqIHRvIFJvYW1pbmcgYWxnb3JpdGhtCisJCQkgKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywgRkwoIkFsb25lIGluIElCU1MiKSk7CisJCQlzZXNzaW9uLT5saW1JYnNzQWN0aXZlID0gZmFsc2U7CisKKwkJCWxpbV9zZW5kX3NtZV93bV9zdGF0dXNfY2hhbmdlX250ZihtYWNfY3R4LAorCQkJCWVTSVJfU01FX0lCU1NfSU5BQ1RJVkUsIE5VTEwsIDAsCisJCQkJc2Vzc2lvbi0+c21lU2Vzc2lvbklkKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBsaW1faWJzc19kZWNpZGVfcHJvdGVjdGlvbl9vbl9kZWxldGUoKSAtIGRlY2lkZXMgcHJvdGVjdGlvbiByZWxhdGVkIGluZm8uCisgKgorICogQG1hY19jdHg6IGdsb2JhbCBtYWMgY29udGV4dAorICogQHN0YWRzOiBzdGF0aW9uIGhhc2ggbm9kZQorICogQGJjbl9wYXJhbTogYmVhY29uIHBhcmFtZXRlcnMKKyAqIEBzZXNzaW9uOiBQRSBzZXNzaW9uIGVudHJ5CisgKgorICogRGVjaWRlcyBhbGwgdGhlIHByb3RlY3Rpb24gcmVsYXRlZCBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBsaW1faWJzc19kZWNpZGVfcHJvdGVjdGlvbl9vbl9kZWxldGUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkJICB0cERwaEhhc2hOb2RlIHN0YWRzLAorCQkJCQkgIHRwVXBkYXRlQmVhY29uUGFyYW1zIGJjbl9wYXJhbSwKKwkJCQkJICB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXVpbnQzMl90IHBoeW1vZGU7CisJdEhhbEJpdFZhbCBlcnBlbmFibGVkID0gZUhBTF9DTEVBUjsKKwl0U2lyUkZCYW5kIHJmYmFuZCA9IFNJUl9CQU5EX1VOS05PV047CisJdWludDMyX3QgaTsKKworCWlmIChOVUxMID09IHN0YWRzKQorCQlyZXR1cm47CisKKwlsaW1fZ2V0X3JmX2JhbmRfbmV3KG1hY19jdHgsICZyZmJhbmQsIHNlc3Npb24pOworCWlmIChTSVJfQkFORF8yXzRfR0haICE9IHJmYmFuZCkKKwkJcmV0dXJuOworCisJbGltX2dldF9waHlfbW9kZShtYWNfY3R4LCAmcGh5bW9kZSwgc2Vzc2lvbik7CisJZXJwZW5hYmxlZCA9IHN0YWRzLT5lcnBFbmFibGVkOworCS8qIHdlIGFyZSBIVCBvciAxMUcgYW5kIDExQiBzdGF0aW9uIGlzIGdldHRpbmcgZGVsZXRlZC4gKi8KKwlpZiAoKChwaHltb2RlID09IFdOSV9DRkdfUEhZX01PREVfMTFHKSB8fAorCSAgICAgc2Vzc2lvbi0+aHRDYXBhYmlsaXR5KSAmJiAoZXJwZW5hYmxlZCA9PSBlSEFMX0NMRUFSKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiKCVkKSBBIGxlZ2FjeSBTVEEgaXMgZGlzYXNzb2NpYXRlZC4gQWRkciBpcyAiKSwKKwkJCXNlc3Npb24tPmdMaW0xMWJQYXJhbXMubnVtU3RhKTsKKwkJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCBzdGFkcy0+c3RhQWRkciwgTE9HRSk7CisJCWlmIChzZXNzaW9uLT5nTGltMTFiUGFyYW1zLm51bVN0YSA9PSAwKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIk5vIDExQiBTVEEgZXhpc3RzLiBEaXNhYmxlIHByb3RlY3Rpb24uIikpOworCQkJbGltX2lic3Nfc2V0X3Byb3RlY3Rpb24obWFjX2N0eCwgZmFsc2UsCisJCQkJYmNuX3BhcmFtLCBzZXNzaW9uKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCQlpZiAoIW1hY19jdHgtPmxpbS5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNkZl9tZW1fY29tcGFyZShtYWNfY3R4LT5saW0ucHJvdFN0YUNhY2hlW2ldLmFkZHIsCisJCQkJc3RhZHMtPnN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQkJc2Vzc2lvbi0+Z0xpbTExYlBhcmFtcy5udW1TdGEtLTsKKwkJCQltYWNfY3R4LT5saW0ucHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwl9Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIF9fbGltX2lic3NfcGVlcl9pbmFjdGl2aXR5X2hhbmRsZXIKKyAgIFxicmllZiBJbnRlcm5hbCBmdW5jdGlvbi4gRGVsZXRlcyBGVyBpbmRpY2F0ZWQgcGVlciB3aGljaCBpcyBpbmFjdGl2ZQorIFwKKyAgIFxwYXJhbSAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworICAgXHBhcmFtICB0cFBFU2Vzc2lvbiAgICAgICBwc2Vzc2lvbkVudHJ5CisgICBccGFyYW0gIHRwU2lySWJzc1BlZXJJbmFjdGl2aXR5SW5kIHBlZXJJbmFjdGl2aXR5SW5kCisgICBccmV0dXJuIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkCitfX2xpbV9pYnNzX3BlZXJfaW5hY3Rpdml0eV9oYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkgICB0cFNpcklic3NQZWVySW5hY3Rpdml0eUluZCBwZWVySW5hY3Rpdml0eUluZCkKK3sKKwlpZiAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgIT0gZUxJTV9NTE1fQlNTX1NUQVJURURfU1RBVEUpIHsKKwkJcmV0dXJuOworCX0KKworCS8qIGRlbGV0ZSB0aGUgcGVlciBmb3Igd2hpY2ggaGVhcnRiZWF0IGlzIG9ic2VydmVkICovCisJX19saW1faWJzc19zZWFyY2hfYW5kX2RlbGV0ZV9wZWVyKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQkJCSAgcGVlckluYWN0aXZpdHlJbmQtPnBlZXJBZGRyKTsKKworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIGxpbV9wcm9jZXNzX2lic3NfcGVlcl9pbmFjdGl2aXR5CisgICBcYnJpZWYgUGVlciBpbmFjdGl2aXR5IG1lc3NhZ2UgaGFuZGxlcgorIFwKKyAgIFxwYXJhbSAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworICAgXHBhcmFtICB2b2lkKiAgICAgICAgICAgICBidWYKKyAgIFxyZXR1cm4gTm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbV9wcm9jZXNzX2lic3NfcGVlcl9pbmFjdGl2aXR5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKmJ1ZikKK3sKKwkvKgorCSAqIC0tLS0tLS0tLS0tLS0tLSBIRUFSVEJFQVQgT0ZGTE9BRCBDQVNFIC0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFRoaXMgbWVzc2FnZSBoYW5kbGVyIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIGZpcm13YXJlIGlkZW50aWZpZXMKKwkgKiBpbmFjdGl2aXR5IGZyb20gb25lIG9yIG1vcmUgcGVlciBkZXZpY2VzLiBXZSB3aWxsIGNvbWUgaGVyZQorCSAqIGZvciBldmVyeSBpbmFjdGl2ZSBwZWVyIGRldmljZQorCSAqLworCXVpbnQ4X3QgaTsKKworCXRTaXJJYnNzUGVlckluYWN0aXZpdHlJbmQgKnBlZXJJbmFjdGl2aXR5SW5kID0KKwkJKHRTaXJJYnNzUGVlckluYWN0aXZpdHlJbmQgKikgYnVmOworCisJLyoKKwkgKiBJZiBJQlNTIGlzIG5vdCBzdGFydGVkIG9yIGhlYXJ0YmVhdCBvZmZsb2FkIGlzIG5vdCBlbmFibGVkCisJICogd2Ugc2hvdWxkIG5vdCBoYW5kbGUgdGhpcyByZXF1ZXN0CisJICovCisJaWYgKGVMSU1fU1RBX0lOX0lCU1NfUk9MRSAhPSBwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgJiYKKwkgICAgIUlTX0lCU1NfSEVBUlRCRUFUX09GRkxPQURfRkVBVFVSRV9FTkFCTEUpIHsKKwkJcmV0dXJuOworCX0KKworCS8qKiBJZiBMaW5rTW9uaXRvciBpcyBEaXNhYmxlZCAqLworCWlmICghcE1hYy0+c3lzLmdTeXNFbmFibGVMaW5rTW9uaXRvck1vZGUpIHsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQlpZiAodHJ1ZSA9PSBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkICYmCisJCSAgICBlU0lSX0lCU1NfTU9ERSA9PSBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmJzc1R5cGUpIHsKKwkJCV9fbGltX2lic3NfcGVlcl9pbmFjdGl2aXR5X2hhbmRsZXIocE1hYywKKwkJCQkJCQkgICAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXSwKKwkJCQkJCQkgICBwZWVySW5hY3Rpdml0eUluZCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX2lic3NfcGVlcl9tZ210LmggYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9pYnNzX3BlZXJfbWdtdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTc5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9pYnNzX3BlZXJfbWdtdC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV9pYnNzX3BlZXJfbWdtdC5oIGNvbnRhaW5zIHByb3RvdHlwZXMgZm9yCisgKiB0aGUgdXRpbGl0eSBmdW5jdGlvbnMgTElNIHVzZXMgdG8gbWFpbnRhaW4gcGVlcnMgaW4gSUJTUy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAzLzEyLzA0CisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAic2lyX2NvbW1vbi5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorCisjZGVmaW5lIElCU1NfU1RBVElPTlNfVVNFRF9EVVJJTkdfSU5JVCA0ICAgICAgICAvKiAoYnJvYWRjYXN0ICsgc2VsZiArIHAycCArIHNvZnRhcCkgKi8KKwordm9pZCBsaW1faWJzc19pbml0KHRwQW5pU2lyR2xvYmFsKTsKK3ZvaWQgbGltX2lic3NfZGVsZXRlKHRwQW5pU2lyR2xvYmFsLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3RTaXJSZXRTdGF0dXMgbGltX2lic3NfY29hbGVzY2UodHBBbmlTaXJHbG9iYWwsIHRwU2lyTWFjTWdtdEhkciwKKwkJCQl0cFNjaEJlYWNvblN0cnVjdCwgdWludDhfdCAqLCB1aW50MzJfdCwgdWludDE2X3QsCisJCQkJdHBQRVNlc3Npb24pOwordFNpclJldFN0YXR1cyBsaW1faWJzc19zdGFfYWRkKHRwQW5pU2lyR2xvYmFsLCB2b2lkICosIHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgbGltX2lic3NfYWRkX3N0YV9yc3AodHBBbmlTaXJHbG9iYWwsIHZvaWQgKiwgdHBQRVNlc3Npb24pOwordExpbUlic3NQZWVyTm9kZSAqbGltX2lic3NfcGVlcl9maW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIG1hY0FkZHIpOwordm9pZCBsaW1faWJzc19kZWxfYnNzX3JzcCh0cEFuaVNpckdsb2JhbCwgdm9pZCAqLCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbV9pYnNzX2RlbF9ic3NfcnNwX3doZW5fY29hbGVzY2luZyh0cEFuaVNpckdsb2JhbCwgdm9pZCAqLCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbV9pYnNzX2FkZF9ic3NfcnNwX3doZW5fY29hbGVzY2luZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICptc2csCisJCQkJCSAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbV9pYnNzX2RlY2lkZV9wcm90ZWN0aW9uX29uX2RlbGV0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywKKwkJCQkJICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLAorCQkJCQkgIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkpOwordm9pZCBsaW1faWJzc19oZWFydF9iZWF0X2hhbmRsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltX3Byb2Nlc3NfaWJzc19wZWVyX2luYWN0aXZpdHkodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqYnVmKTsKZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX2xpbmtfbW9uaXRvcmluZ19hbGdvLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9saW5rX21vbml0b3JpbmdfYWxnby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTU1YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9saW5rX21vbml0b3JpbmdfYWxnby5jCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGxpbV9saW5rX21vbml0b3JpbmdfYWxnby5jYyBjb250YWlucyB0aGUgY29kZSBmb3IKKyAqIExpbmsgbW9uaXRvcmluZyBhbGdvcml0aG0gb24gQVAgYW5kIGhlYXJ0IGJlYXQgZmFpbHVyZQorICogaGFuZGxpbmcgb24gU1RBLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDMvMDEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgInduaV9jZmcuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Byb3BfZXh0c191dGlscy5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2luY2x1ZGUgImxpbV9mdF9kZWZzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbi5oIgorI2luY2x1ZGUgImxpbV9zZXJfZGVzX3V0aWxzLmgiCisKKy8qKgorICogbGltX2RlbGV0ZV9zdGFfdXRpbCAtIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGRlbGV0aW5nIHN0YXRpb24gY29udGV4dAorICoKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBtc2c6IHBvaW50ZXIgdG8gZGVsdGUgc3RhdGlvbiBjb250ZXh0CisgKiBAc2Vzc2lvbl9lbnRyeTogUEUgc2Vzc2lvbiBlbnRyeQorICoKKyAqIHV0aWxpdHkgZnVuY3Rpb24gY2FsbGVkIHRvIGNsZWFyIHVwIHN0YXRpb24gY29udGV4dC4KKyAqCisgKiBSZXR1cm46IE5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9kZWxldGVfc3RhX3V0aWwodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdHBEZWxldGVTdGFDb250ZXh0IG1zZywKKwkJCQl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXRwRHBoSGFzaE5vZGUgc3RhZHM7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCUZMKCJEZWxldGluZyBzdGF0aW9uOiBzdGFJZCA9ICVkLCByZWFzb25Db2RlID0gJWQiKSwKKwkJbXNnLT5zdGFJZCwgbXNnLT5yZWFzb25Db2RlKTsKKworCWlmIChMSU1fSVNfSUJTU19ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCWNkZl9tZW1fZnJlZShtc2cpOworCQlyZXR1cm47CisJfQorCisJc3RhZHMgPSBkcGhfbG9va3VwX2Fzc29jX2lkKG1hY19jdHgsIG1zZy0+c3RhSWQsICZtc2ctPmFzc29jSWQsCisJCQkJICAgICZzZXNzaW9uX2VudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworCWlmICghc3RhZHMpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkludmFsaWQgU1RBIGxpbVN5c3RlbVJvbGU9JWQiKSwKKwkJCUdFVF9MSU1fU1lTVEVNX1JPTEUoc2Vzc2lvbl9lbnRyeSkpOworCQljZGZfbWVtX2ZyZWUobXNnKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNoZWNrIGFuZCBzZWUgaWYgc2FtZSBzdGFJZC4gVGhpcyBpcyB0byBhdm9pZCB0aGUgc2NlbmFyaW8KKwkgKiB3aGVyZSB3ZSdyZSB0cnlpbmcgdG8gZGVsZXRlIGEgc3RhSWQgd2UganVzdCBhZGRlZC4KKwkgKi8KKwlpZiAoc3RhZHMtPnN0YUluZGV4ICE9IG1zZy0+c3RhSWQpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgic3RhaWQgbWlzbWF0Y2g6ICVkIHZzICVkICIpLAorCQkJc3RhZHMtPnN0YUluZGV4LCBtc2ctPnN0YUlkKTsKKwkJY2RmX21lbV9mcmVlKG1zZyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb25fZW50cnkpIHx8CisJICAgIExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJEZWxldGUgU3RhdGlvbiBzdGFJZDogJWQsIGFzc29jSWQ6ICVkIiksCisJCQltc2ctPnN0YUlkLCBtc2ctPmFzc29jSWQpOworCQkvKgorCQkgKiBDaGVjayBpZiBEZWF1dGgvRGlzYXNzb2MgaXMgdHJpZ2dlcmVkIGZyb20gSG9zdC4KKwkJICogSWYgbWxtU3RhdGUgaXMgaW4gc29tZSB0cmFuc2llbnQgc3RhdGUgdGhlbgorCQkgKiBkb24ndCB0cmlnZ2VyIFNUQSBkZWxldGlvbiB0byBhdm9pZCB0aGUgcmFjZQorCQkgKiBjb25kaXRpb24uCisJCSAqLworCQkgaWYgKChzdGFkcyAmJgorCQkgICAgICgoc3RhZHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0KKwkJCWVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpICYmCisJCSAgICAgIChzdGFkcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPQorCQkJZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFKSAmJgorCQkgICAgICAoc3RhZHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0KKwkJCWVMSU1fTUxNX0FTU09DSUFURURfU1RBVEUpKSkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiSW52IERlbCBTVEEgc3RhSWQ6JWQsIGFzc29jSWQ6JWQiKSwKKwkJCQltc2ctPnN0YUlkLCBtc2ctPmFzc29jSWQpOworCQkJY2RmX21lbV9mcmVlKG1zZyk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlsaW1fdHJpZ2dlcl9zdGFfZGVsZXRpb24obWFjX2N0eCwgc3RhZHMsIHNlc3Npb25fZW50cnkpOworCQl9CisJfSBlbHNlIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCQlpZiAoTElNX0lTX1NUQV9ST0xFKHNlc3Npb25fZW50cnkpICYmCisJCSAgICBTVEFfRU5UUllfVERMU19QRUVSID09IHN0YWRzLT5zdGFUeXBlKSB7CisJCQkvKgorCQkJICogVGVhcmRvd25MaW5rIHdpdGggUEVFUiByZWFzb24gY29kZQorCQkJICogSEFMX0RFTF9TVEFfUkVBU09OX0NPREVfS0VFUF9BTElWRSBtZWFucworCQkJICogZVNJUl9NQUNfVERMU19URUFSRE9XTl9QRUVSX1VOUkVBQ0hBQkxFCisJCQkgKi8KKwkJCWxpbV9zZW5kX3NtZV90ZGxzX2RlbF9zdGFfaW5kKG1hY19jdHgsIHN0YWRzLAorCQkJICAgIHNlc3Npb25fZW50cnksCisJCQkgICAgZVNJUl9NQUNfVERMU19URUFSRE9XTl9QRUVSX1VOUkVBQ0hBQkxFKTsKKwkJfSBlbHNlIHsKKyNlbmRpZgorCQkvKiBUZWFyRG93bkxpbmsgd2l0aCBBUCAqLworCQl0TGltTWxtRGVhdXRoSW5kIG1sbV9kZWF1dGhfaW5kOworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiRGVsZXRlIFN0YXRpb24gKHN0YUlkOiAlZCwgYXNzb2NJZDogJWQpICIpLAorCQkJbXNnLT5zdGFJZCwgbXNnLT5hc3NvY0lkKTsKKworCQlpZiAoKHN0YWRzICYmCisJCQkoKHN0YWRzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9CisJCQkJCWVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpICYmCisJCQkoc3RhZHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0KKwkJCQkJZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFKSAmJgorCQkJKHN0YWRzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9CisJCQkJCWVMSU1fTUxNX0FTU09DSUFURURfU1RBVEUpKSkpIHsKKworCQkJLyoKKwkJCSAqIFJlY2VpdmVkIFNJUl9MSU1fREVMRVRFX1NUQV9DT05URVhUX0lORCBmb3IgU1RBIHRoYXQKKwkJCSAqIGRvZXMgbm90IGhhdmUgY29udGV4dCBvciBpbiBzb21lIHRyYW5zaXQgc3RhdGUuCisJCQkgKiBMb2cgZXJyb3IKKwkJCSAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJSZWNlaXZlZCBTSVJfTElNX0RFTEVURV9TVEFfQ09OVEVYVF9JTkQgZm9yICIKKwkJCQkJIlNUQSB0aGF0IGVpdGhlciBoYXMgbm8gY29udGV4dCBvciAiCisJCQkJCSJpbiBzb21lIHRyYW5zaXQgc3RhdGUsIEFkZHIgPSAiCisJCQkJCU1BQ19BRERSRVNTX1NUUiksCisJCQkJCU1BQ19BRERSX0FSUkFZKG1zZy0+YnNzSWQpKTsKKwkJCWNkZl9tZW1fZnJlZShtc2cpOworCQkJcmV0dXJuOworCQl9CisKKwkJc3RhZHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb24gPQorCQkJZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFlfUkVBU09OOworCQlzdGFkcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9CisJCQllTElNX0xJTktfTU9OSVRPUklOR19ERUFVVEg7CisKKwkJLyogSXNzdWUgRGVhdXRoIEluZGljYXRpb24gdG8gU01FLiAqLworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJm1sbV9kZWF1dGhfaW5kLnBlZXJNYWNBZGRyLAorCQkJICAgICBzdGFkcy0+c3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCW1sbV9kZWF1dGhfaW5kLnJlYXNvbkNvZGUgPQorCQkJKHVpbnQ4X3QpIHN0YWRzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uOworCQltbG1fZGVhdXRoX2luZC5kZWF1dGhUcmlnZ2VyID0KKwkJCXN0YWRzLT5tbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwkJLyogRGVsZXRlIGFsbCBURExTIHBlZXJzIGNvbm5lY3RlZCBiZWZvcmUgbGVhdmluZyBCU1MgKi8KKwkJbGltX2RlbGV0ZV90ZGxzX3BlZXJzKG1hY19jdHgsIHNlc3Npb25fZW50cnkpOworI2VuZGlmCisJCWxpbV9wb3N0X3NtZV9tZXNzYWdlKG1hY19jdHgsIExJTV9NTE1fREVBVVRIX0lORCwKKwkJCQkgICAgICh1aW50MzJfdCAqKSAmbWxtX2RlYXV0aF9pbmQpOworCisJCWxpbV9zZW5kX3NtZV9kZWF1dGhfaW5kKG1hY19jdHgsIHN0YWRzLAlzZXNzaW9uX2VudHJ5KTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCX0KKyNlbmRpZgorCX0KK30KKworLyoqCisgKiBsaW1fZGVsZXRlX3N0YV9jb250ZXh0KCkgLSBkZWxldGUgc3RhIGNvbnRleHQuCisgKgorICogQG1hY19jdHg6IGdsb2JhbCBtYWNfY3R4IGNvbnRleHQKKyAqIEBsaW1fbXNnOiBsaW0gbWVzc2FnZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIG1lc3NhZ2UgZnJvbSBIQUw6IFdNQV9ERUxFVEVfU1RBX0NPTlRFWFRfSU5ELgorICogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgdGhhdCB0aGUgZ2l2ZW4gc3RhdGlvbiBpZCBleGlzdCwgYW5kIGlmIHNvLAorICogZGVsZXRlcyB0aGUgc3RhdGlvbiBieSBjYWxsaW5nIGxpbV90cmlnZ2VyX3N0YV9kZWxldGlvbi4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBsaW1fZGVsZXRlX3N0YV9jb250ZXh0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwU2lyTXNnUSBsaW1fbXNnKQoreworCXRwRGVsZXRlU3RhQ29udGV4dCBtc2cgPSAodHBEZWxldGVTdGFDb250ZXh0KSBsaW1fbXNnLT5ib2R5cHRyOworCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnk7CisJdWludDhfdCBzZXNzaW9uX2lkOworCisJaWYgKE5VTEwgPT0gbXNnKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkludmFsaWQgYm9keSBwb2ludGVyIGluIG1lc3NhZ2UiKSk7CisJCXJldHVybjsKKwl9CisJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChtYWNfY3R4LCBtc2ctPmJzc0lkLAorCQkJCQkJICZzZXNzaW9uX2lkKTsKKwlpZiAoTlVMTCA9PSBzZXNzaW9uX2VudHJ5KSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QiKSk7CisJCWNkZl9tZW1fZnJlZShtc2cpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChtc2ctPnJlYXNvbkNvZGUpIHsKKwljYXNlIEhBTF9ERUxfU1RBX1JFQVNPTl9DT0RFX0tFRVBfQUxJVkU6CisJY2FzZSBIQUxfREVMX1NUQV9SRUFTT05fQ09ERV9USU1fQkFTRUQ6CisJCWxpbV9kZWxldGVfc3RhX3V0aWwobWFjX2N0eCwgbXNnLCBzZXNzaW9uX2VudHJ5KTsKKwkJYnJlYWs7CisKKwljYXNlIEhBTF9ERUxfU1RBX1JFQVNPTl9DT0RFX1VOS05PV05fQTI6CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkRlbGV0aW5nIFVua25vd24gc3RhdGlvbiAiKSk7CisJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCBtc2ctPmFkZHIyLCBMT0dFKTsKKwkJbGltX3NlbmRfZGVhdXRoX21nbXRfZnJhbWUobWFjX2N0eCwKKwkJCWVTSVJfTUFDX0NMQVNTM19GUkFNRV9GUk9NX05PTl9BU1NPQ19TVEFfUkVBU09OLAorCQkJbXNnLT5hZGRyMiwgc2Vzc2lvbl9lbnRyeSwgZmFsc2UpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIiBVbmtub3duIHJlYXNvbiBjb2RlICIpKTsKKwkJYnJlYWs7CisJfQorCWNkZl9tZW1fZnJlZShtc2cpOworCXJldHVybjsKK30KKworLyoqCisgKiBsaW1fdHJpZ2dlcl9zdGFfZGVsZXRpb24oKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHRyaWdnZXIgU1RBIGNvbnRleHQgZGVsZXRpb24KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAtIFBvaW50ZXIgdG8gZ2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzIC0gUG9pbnRlciB0byBpbnRlcm5hbCBTVEEgRGF0YXN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbV90cmlnZ2VyX3N0YV9kZWxldGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywKKwkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJTbWVEZWF1dGhSZXEgKnBTbWVEZWF1dGhSZXE7CisJdWludDhfdCAqcEJ1ZjsKKwl1aW50OF90ICpwTGVuOworCXVpbnQxNl90IG1zZ0xlbmd0aCA9IDA7CisKKwlpZiAoIXBTdGFEcykgeworCQlQRUxPR1cobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dXLCBGTCgiU2tpcCBTVEEgZGVsZXRpb24gKGludmFsaWQgU1RBKSIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KKwkvKioKKwkgKiBNQUMgYmFzZWQgQXV0aGVudGljYXRpb24gd2FzIHVzZWQuIFRyaWdnZXIKKwkgKiBEZWF1dGhlbnRpY2F0aW9uIGZyYW1lIHRvIHBlZXIgc2luY2UgaXQgd2lsbAorCSAqIHRha2UgY2FyZSBvZiBkaXNhc3NvY2lhdGlvbiBhcyB3ZWxsLgorCSAqLworCisJcFNtZURlYXV0aFJlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU21lRGVhdXRoUmVxKSk7CisJaWYgKE5VTEwgPT0gcFNtZURlYXV0aFJlcSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9ERUFVVEhfUkVRICIpKTsKKwkJcmV0dXJuOworCX0KKworCXBCdWYgPSAodWludDhfdCAqKSAmcFNtZURlYXV0aFJlcS0+bWVzc2FnZVR5cGU7CisKKwkvKiBtZXNzYWdlVHlwZSAqLworCWxpbV9jb3B5X3UxNigodWludDhfdCAqKSBwQnVmLCBlV05JX1NNRV9ESVNBU1NPQ19SRVEpOworCXBCdWYgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwltc2dMZW5ndGggKz0gc2l6ZW9mKHVpbnQxNl90KTsKKworCS8qIGxlbmd0aCAqLworCXBMZW4gPSBwQnVmOworCXBCdWYgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwltc2dMZW5ndGggKz0gc2l6ZW9mKHVpbnQxNl90KTsKKworCS8qIHNlc3Npb25JZCAqLworCSpwQnVmID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCXBCdWYrKzsKKwltc2dMZW5ndGgrKzsKKworCS8qIHRyYW5zYWN0aW9uSWQgKi8KKwlsaW1fY29weV91MTYoKHVpbnQ4X3QgKikgcEJ1ZiwgcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7CisJcEJ1ZiArPSBzaXplb2YodWludDE2X3QpOworCW1zZ0xlbmd0aCArPSBzaXplb2YodWludDE2X3QpOworCisJLyogYnNzSWQgKi8KKwljZGZfbWVtX2NvcHkocEJ1ZiwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCXBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKwltc2dMZW5ndGggKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKworCS8qIHBlZXJNYWNBZGRyICovCisJY2RmX21lbV9jb3B5KHBCdWYsIHBTdGFEcy0+c3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCW1zZ0xlbmd0aCArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisJLyogcmVhc29uQ29kZSAqLworCWxpbV9jb3B5X3UxNigodWludDhfdCAqKSBwQnVmLCAodWludDE2X3QpIGVMSU1fTElOS19NT05JVE9SSU5HX0RJU0FTU09DKTsKKwlwQnVmICs9IHNpemVvZih1aW50MTZfdCk7CisJbXNnTGVuZ3RoICs9IHNpemVvZih1aW50MTZfdCk7CisKKwkvKiBEbyBub3Qgc2VuZCBkaXNhc3NvYyBPVEEgKi8KKwkvKiBwQnVmWzBdID0gMSBtZWFucyBkbyBub3Qgc2VuZCB0aGUgZGlzYXNzb2MgZnJhbWUgb3ZlciB0aGUgYWlyICovCisJLyogcEJ1ZlswXSA9IDAgbWVhbnMgc2VuZCB0aGUgZGlzYXNzb2MgZnJhbWUgb3ZlciB0aGUgYWlyICovCisJcEJ1ZlswXSA9IDA7CisJcEJ1ZiArPSBzaXplb2YodWludDhfdCk7CisJbXNnTGVuZ3RoICs9IHNpemVvZih1aW50OF90KTsKKworCS8qIEZpbGwgaW4gbGVuZ3RoICovCisJbGltX2NvcHlfdTE2KCh1aW50OF90ICopIHBMZW4sIG1zZ0xlbmd0aCk7CisKKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShwTWFjLCBlV05JX1NNRV9ESVNBU1NPQ19SRVEsCisJCQkgICAgICh1aW50MzJfdCAqKSBwU21lRGVhdXRoUmVxKTsKKwljZGZfbWVtX2ZyZWUocFNtZURlYXV0aFJlcSk7CisKK30gLyoqKiBlbmQgbGltX3RyaWdnZXJfc3RfYWRlbGV0aW9uKCkgKioqLworCisvKioKKyAqIGxpbV90ZWFyX2Rvd25fbGlua193aXRoX2FwKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGhlYXJ0YmVhdCAoYmVhY29uIHJlY2VwdGlvbikKKyAqIGZhaWxzIG9uIFNUQQorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltX3RlYXJfZG93bl9saW5rX3dpdGhfYXAodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQsCisJCQkgICB0U2lyTWFjUmVhc29uQ29kZXMgcmVhc29uQ29kZSkKK3sKKwl0cERwaEhhc2hOb2RlIHBTdGFEcyA9IE5VTEw7CisKKwkvKiB0ZWFyIGRvd24gdGhlIGZvbGxvd2luZyBzZXNzaW9uRW50cnkgKi8KKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCisJaWYgKChwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQocE1hYywgc2Vzc2lvbklkKSkgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEIikpOworCQlyZXR1cm47CisJfQorCS8qKgorCSAqIEhlYXJ0IGJlYXQgZmFpbGVkIGZvciB1cHRvIHRocmVzaG9sZCB2YWx1ZQorCSAqIGFuZCBBUCBkaWQgbm90IHJlc3BvbmQgZm9yIFByb2JlIHJlcXVlc3QuCisJICogVHJpZ2dlciBsaW5rIHRlYXIgZG93bi4KKwkgKi8KKwlwc2Vzc2lvbkVudHJ5LT5wbW1PZmZsb2FkSW5mby5iY25taXNzID0gZmFsc2U7CisKKwlsaW1fbG9nKHBNYWMsIExPR1csCisJCUZMKCJObyBQcm9iZVJzcCBmcm9tIEFQIGFmdGVyIEhCIGZhaWx1cmUuIFRlYXJpbmcgZG93biBsaW5rIikpOworCisJLyogQW5ub3VuY2UgbG9zcyBvZiBsaW5rIHRvIFJvYW1pbmcgYWxnb3JpdGhtICovCisJLyogYW5kIGNsZWFudXAgYnkgc2VuZGluZyBTTUVfRElTQVNTT0NfUkVRIHRvIFNNRSAqLworCisJcFN0YURzID0KKwkJZHBoX2dldF9oYXNoX2VudHJ5KHBNYWMsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLAorCQkJCSAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworCWlmIChwU3RhRHMgIT0gTlVMTCkgeworCQl0TGltTWxtRGVhdXRoSW5kIG1sbURlYXV0aEluZDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJCS8qIERlbGV0ZSBhbGwgVERMUyBwZWVycyBjb25uZWN0ZWQgYmVmb3JlIGxlYXZpbmcgQlNTICovCisJCWxpbV9kZWxldGVfdGRsc19wZWVycyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZgorCisJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5kaXNhc3NvY1JlYXNvbiA9IHJlYXNvbkNvZGU7CisJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9CisJCQllTElNX0xJTktfTU9OSVRPUklOR19ERUFVVEg7CisKKwkJLyoKKwkJICogU2V0IHN0YXRlIHRvIG1sbSBTdGF0ZSB0byBlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURQorCQkgKiBUaGlzIGlzIHRvIGFkZHJlc3MgdGhlIGlzc3VlIG9mIHJhY2UgY29uZGl0aW9uIGJldHdlZW4KKwkJICogZGlzY29ubmVjdCByZXF1ZXN0IGZyb20gdGhlIEhERCBhbmQgZGVhdXRoIGZyb20KKwkJICogVHggaW5hY3Rpdml0eSB0aW1lciBieSBGV1IuIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCB3ZQorCQkgKiB3aWxsIG5vdCBwcm9jZXNzIGRpc2Fzc29jIGlmIGRlYXV0aCBpcyBpbiBwcm9ncmVzcyBmb3IKKwkJICogdGhlIHN0YXRpb24gYW5kIHRodXMgbWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciB3aWxsCisJCSAqIG5vdCBiZSBvdmVyd3JpdHRlbi4KKwkJICovCisKKwkJcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0KKwkJCQkJZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEU7CisKKwkJLyogLyBJc3N1ZSBEZWF1dGggSW5kaWNhdGlvbiB0byBTTUUuICovCisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWxtRGVhdXRoSW5kLnBlZXJNYWNBZGRyLAorCQkJICAgICBwU3RhRHMtPnN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJLyoKKwkqIGlmIHNlbmREZWF1dGhCZWZvcmVDb24gaXMgZW5hYmxlZCBhbmQgcmVhc29uY29kZSBpcworCSogQmVhY29uIE1pc3NlZCBTdG9yZSB0aGUgTUFDIG9mIEFQIGluIHRoZSBmbGlwIGZsb3AKKwkqIGJ1ZmZlci4gVGhpcyBNQUMgd2lsbCBiZSB1c2VkIHRvIHNlbmQgRGVhdXRoIGJlZm9yZQorCSogY29ubmVjdGlvbiwgaWYgd2UgY29ubmVjdCB0byBzYW1lIEFQIGFmdGVyIEhCIGZhaWx1cmUuCisJKi8KKwlpZiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5zZW5kRGVhdXRoQmVmb3JlQ29uICYmCisJCWVTSVJfQkVBQ09OX01JU1NFRCA9PSByZWFzb25Db2RlKSB7CisJCWludCBhcENvdW50ID0gcE1hYy0+bGltLmdMaW1IZWFydEJlYXRBcE1hY0luZGV4OworCisJCWlmIChwTWFjLT5saW0uZ0xpbUhlYXJ0QmVhdEFwTWFjSW5kZXgpCisJCQlwTWFjLT5saW0uZ0xpbUhlYXJ0QmVhdEFwTWFjSW5kZXggPSAwOworCQllbHNlCisJCQlwTWFjLT5saW0uZ0xpbUhlYXJ0QmVhdEFwTWFjSW5kZXggPSAxOworCisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkhCIEZhaWx1cmUgb24gTUFDICIKKwkJCU1BQ19BRERSRVNTX1NUUiIgU3RvcmUgaXQgb24gSW5kZXggJWQiKSwKKwkJCU1BQ19BRERSX0FSUkFZKHBTdGFEcy0+c3RhQWRkciksYXBDb3VudCk7CisKKwkJc2lyX2NvcHlfbWFjX2FkZHIocE1hYy0+bGltLmdMaW1IZWFydEJlYXRBcE1hY1thcENvdW50XSwKKwkJCQkJCQlwU3RhRHMtPnN0YUFkZHIpOworCX0KKworCQltbG1EZWF1dGhJbmQucmVhc29uQ29kZSA9CisJCQkodWludDhfdCkgcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uOworCQltbG1EZWF1dGhJbmQuZGVhdXRoVHJpZ2dlciA9CisJCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXI7CisKKwkJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywgTElNX01MTV9ERUFVVEhfSU5ELAorCQkJCSAgICAgKHVpbnQzMl90ICopICZtbG1EZWF1dGhJbmQpOworCisJCWxpbV9zZW5kX3NtZV9kZWF1dGhfaW5kKHBNYWMsIHBTdGFEcywgcHNlc3Npb25FbnRyeSk7CisJfQorfSAvKioqIGxpbV90ZWFyX2Rvd25fbGlua193aXRoX2FwKCkgKioqLworCisvKioKKyAqIGxpbV9oYW5kbGVfaGVhcnRfYmVhdF9mYWlsdXJlKCkgLSBoYW5kbGUgaGVhciBiZWF0IGZhaWx1cmUgaW4gU1RBCisgKgorICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dAorICogQHNlc3Npb246IFBFIHNlc3Npb24gZW50cnkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGhlYXJ0YmVhdCAoYmVhY29uIHJlY2VwdGlvbikKKyAqIGZhaWxzIG9uIFNUQQorICoKKyAqIFJldHVybjogTm9uZQorICovCisKK3ZvaWQgbGltX2hhbmRsZV9oZWFydF9iZWF0X2ZhaWx1cmUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgICB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXVpbnQ4X3QgY3Vycl9jaGFuOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWhvc3RfbG9nX2JlYWNvbl91cGRhdGVfcGt0X3R5cGUgKmxvZ19wdHIgPSBOVUxMOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNICAgIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwlXTEFOX0hPU1RfRElBR19MT0dfQUxMT0MobG9nX3B0ciwgaG9zdF9sb2dfYmVhY29uX3VwZGF0ZV9wa3RfdHlwZSwKKwkJCQkgTE9HX1dMQU5fQkVBQ09OX1VQREFURV9DKTsKKwlpZiAobG9nX3B0cikKKwkJbG9nX3B0ci0+YmNuX3J4X2NudCA9IHNlc3Npb24tPkxpbVJ4ZWRCZWFjb25DbnREdXJpbmdIQjsKKwlXTEFOX0hPU1RfRElBR19MT0dfUkVQT1JUKGxvZ19wdHIpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworCS8qIEVuc3VyZSBIQiBTdGF0dXMgZm9yIHRoZSBzZXNzaW9uIGhhcyBiZWVuIHJlc2V0ZWQgKi8KKwlzZXNzaW9uLT5MaW1IQkZhaWx1cmVTdGF0dXMgPSBmYWxzZTsKKworCWlmICgoTElNX0lTX1NUQV9ST0xFKHNlc3Npb24pIHx8CisJICAgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHNlc3Npb24pKSAmJgorCSAgICAoc2Vzc2lvbi0+bGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkgJiYKKwkgICAgKHNlc3Npb24tPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFKSAmJgorCSAgICAoc2Vzc2lvbi0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFKSkgeworCQlpZiAoIW1hY19jdHgtPnN5cy5nU3lzRW5hYmxlTGlua01vbml0b3JNb2RlKQorCQkJcmV0dXJuOworCisJCSAvKiBCZWFjb24gZnJhbWUgbm90IHJlY2VpdmVkIHdpdGhpbiBoZWFydGJlYXQgdGltZW91dC4gKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiSGVhcnRiZWF0IEZhaWx1cmUiKSk7CisJCW1hY19jdHgtPmxpbS5nTGltSEJmYWlsdXJlQ250SW5MaW5rRXN0U3RhdGUrKzsKKworCQkvKgorCQkgKiBDaGVjayBpZiBjb25uZWN0ZWQgb24gdGhlIERGUyBjaGFubmVsLCBpZiBub3QgY29ubmVjdGVkIG9uCisJCSAqIERGUyBjaGFubmVsIHRoZW4gb25seSBzZW5kIHRoZSBwcm9iZSByZXF1ZXN0IG90aGVyd2lzZSB0ZWFyCisJCSAqIGRvd24gdGhlIGxpbmsKKwkJICovCisJCWN1cnJfY2hhbiA9IHNlc3Npb24tPmN1cnJlbnRPcGVyQ2hhbm5lbDsKKwkJaWYgKCFsaW1faXNjb25uZWN0ZWRfb25fZGZzX2NoYW5uZWwoY3Vycl9jaGFuKSkgeworCQkJLyogRGV0ZWN0ZWQgY29udGludW91cyBCZWFjb24gTWlzc2VzICovCisJCQlzZXNzaW9uLT5MaW1IQkZhaWx1cmVTdGF0dXMgPSB0cnVlOworCisJCQkvKlJlc2V0IHRoZSBIQiBwYWNrZXQgY291bnQgYmVmb3JlIHNlbmRpbmcgcHJvYmUqLworCQkJbGltUmVzZXRIQlBrdENvdW50KHNlc3Npb24pOworCQkJLyoqCisJCQkgKiBTZW5kIFByb2JlIFJlcXVlc3QgZnJhbWUgdG8gQVAgdG8gc2VlIGlmCisJCQkgKiBpdCBpcyBzdGlsbCBhcm91bmQuIFdhaXQgdW50aWwgY2VydGFpbgorCQkJICogdGltZW91dCBmb3IgUHJvYmUgUmVzcG9uc2UgZnJvbSBBUC4KKwkJCSAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJIQiBtaXNzZWQgZnJvbSBBUC4gU2VuZGluZyBQcm9iZSBSZXEiKSk7CisJCQkvKiBmb3Igc2VhcmNoaW5nIEFQLCB3ZSBkb24ndCBpbmNsdWRlIGFueSBtb3JlIElFICovCisJCQlsaW1fc2VuZF9wcm9iZV9yZXFfbWdtdF9mcmFtZShtYWNfY3R4LCAmc2Vzc2lvbi0+c3NJZCwKKwkJCQlzZXNzaW9uLT5ic3NJZCwgY3Vycl9jaGFuLCBzZXNzaW9uLT5zZWxmTWFjQWRkciwKKwkJCQlzZXNzaW9uLT5kb3QxMW1vZGUsIDAsIE5VTEwpOworCQl9IGVsc2UgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJICAgIEZMKCJIQiBtaXNzZWQgZnJvbSBBUCBvbiBERlMgY2hhbmVsIG1vdmluZyB0byBwYXNzaXZlIikpOworCQkJaWYgKGN1cnJfY2hhbiA8IFNJUl9NQVhfMjRHXzVHX0NIQU5ORUxfUkFOR0UpIHsKKwkJCQlsaW1fY292ZXJ0X2NoYW5uZWxfc2Nhbl90eXBlKG1hY19jdHgsIGN1cnJfY2hhbiwKKwkJCQkJZmFsc2UpOworCQkJCW1hY19jdHgtPmxpbS5kZnNjaGFubmVsTGlzdC50aW1lU3RhbXBbY3Vycl9jaGFuXQorCQkJCQkgPSAwOworCQkJfQorCQkJLyoKKwkJCSAqIENvbm5lY3RlZCBvbiBERlMgY2hhbm5lbCBzbyBzaG91bGQgbm90IHNlbmQgdGhlCisJCQkgKiBwcm9iZSByZXF1ZXN0IHRlYXIgZG93biB0aGUgbGluayBkaXJlY3RseQorCQkJICovCisJCQlsaW1fdGVhcl9kb3duX2xpbmtfd2l0aF9hcChtYWNfY3R4LAorCQkJCXNlc3Npb24tPnBlU2Vzc2lvbklkLAorCQkJCWVTSVJfQkVBQ09OX01JU1NFRCk7CisJCX0KKwl9IGVsc2UgeworCQkvKioKKwkJICogSGVhcnRiZWF0IHRpbWVyIG1heSBoYXZlIHRpbWVkIG91dAorCQkgKiB3aGlsZSB3ZSdyZSBkb2luZyBiYWNrZ3JvdW5kIHNjYW5uaW5nL2xlYXJuaW5nCisJCSAqIG9yIGluIHN0YXRlcyBvdGhlciB0aGFuIGxpbmstZXN0YWJsaXNoZWQgc3RhdGUuCisJCSAqIExvZyBlcnJvci4KKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJyZWNlaXZlZCBoZWFydGJlYXQgdGltZW91dCBpbiBzdGF0ZSAlWCIpLAorCQkJc2Vzc2lvbi0+bGltTWxtU3RhdGUpOworCQlsaW1fcHJpbnRfbWxtX3N0YXRlKG1hY19jdHgsIExPRzEsIHNlc3Npb24tPmxpbU1sbVN0YXRlKTsKKwkJbWFjX2N0eC0+bGltLmdMaW1IQmZhaWx1cmVDbnRJbk90aGVyU3RhdGVzKys7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcDJwLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wMnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI5MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcDJwLmMKQEAgLTAsMCArMSw3OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICBMIEkgTSBfIFAgMiBQIC4gQworCisgICBPVkVSVklFVzoKKworICAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBQcm90b2NvbCBFbmdpbmUgZm9yCisgICBQMlAuCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKyAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworICAgJEhlYWRlciQkRGF0ZVRpbWUkJEF1dGhvciQKKworICAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CisgICAtLS0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgMjAxMS0wNS0wMiAgICBkamluZGFsIENvcnJlY3RlZCBmaWxlIGluZGVudGF0aW9uIGFuZCBjaGFuZ2VkIHJlbWFpbiBvbiBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgaGFuZGxpbmcgZm9yIGNvbmN1cnJlbmN5LgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZXNzaW9uX3V0aWxzLmgiCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisKKyNkZWZpbmUgICBQUk9CRV9SU1BfSUVfT0ZGU0VUICAgIDM2CisjZGVmaW5lICAgQlNTSURfT0ZGU0VUICAgICAgICAgICAxNgorI2RlZmluZSAgIEFERFIyX09GRlNFVCAgICAgICAgICAgMTAKKyNkZWZpbmUgICBBQ1RJT05fT0ZGU0VUICAgICAgICAgIDI0CisKKy8qIEEgREZTIGNoYW5uZWwgY2FuIGJlIEFDVElWRSBmb3IgbWF4IDkwMDAgbXNlYywgZnJvbSB0aGUgbGFzdAorICAgcmVjZWl2ZWQgQmVhY29uL1BycGJlIFJlc3AuICovCisjZGVmaW5lICAgTUFYX1RJTUVfVE9fQkVfQUNUSVZFX0NIQU5ORUwgOTAwMAorCit2b2lkIGxpbV9leGl0X3JlbWFpbl9vbl9jaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIENERl9TVEFUVVMgc3RhdHVzLAorCQkJCXVpbnQzMl90ICpkYXRhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbV9zZXRfbGlua19zdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTGlua1N0YXRlIHN0YXRlLAorCQkJCQl0U2lyTWFjQWRkciBic3NJZCwgdFNpck1hY0FkZHIgc2VsZk1hY0FkZHIsCisJCQkJCXRwU2V0TGlua1N0YXRlQ2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJCXZvaWQgKmNhbGxiYWNrQXJnKTsKKworQ0RGX1NUQVRVUyBsaW1fcDJwX2FjdGlvbl9jbmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgdHhDb21wbGV0ZVN1Y2Nlc3MpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEJlbG93IGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiBoZGQgcmVxdWVzdHMgYSByZW1haW4gb24gY2hhbm5lbC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgQ0RGX1NUQVRVUyBsaW1fc2VuZF9oYWxfcmVxX3JlbWFpbl9vbl9jaGFuX29mZmxvYWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCQkgIHRTaXJSZW1haW5PbkNoblJlcSAqCisJCQkJCQkJICBwUmVtT25DaG5SZXEpCit7CisJdFNpclNjYW5PZmZsb2FkUmVxICpwU2Nhbk9mZmxvYWRSZXE7CisJdFNpck1zZ1EgbXNnOworCXRTaXJSZXRTdGF0dXMgcmMgPSBlU0lSX1NVQ0NFU1M7CisJdWludDhfdCBic3NpZFtDREZfTUFDX0FERFJfU0laRV0gPQorCXsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OworCisJcFNjYW5PZmZsb2FkUmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTY2FuT2ZmbG9hZFJlcSkpOworCWlmIChOVUxMID09IHBTY2FuT2ZmbG9hZFJlcSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBwU2Nhbk9mZmxvYWRSZXEiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV96ZXJvKHBTY2FuT2ZmbG9hZFJlcSwgc2l6ZW9mKHRTaXJTY2FuT2ZmbG9hZFJlcSkpOworCisJbXNnLnR5cGUgPSBXTUFfU1RBUlRfU0NBTl9PRkZMT0FEX1JFUTsKKwltc2cuYm9keXB0ciA9IHBTY2FuT2ZmbG9hZFJlcTsKKwltc2cuYm9keXZhbCA9IDA7CisKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcFNjYW5PZmZsb2FkUmVxLT5zZWxmTWFjQWRkciwKKwkJICAgICAodWludDhfdCAqKSBwUmVtT25DaG5SZXEtPnNlbGZNYWNBZGRyLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBTY2FuT2ZmbG9hZFJlcS0+YnNzSWQsCisJCSAgICAgKHVpbnQ4X3QgKikgYnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCXBTY2FuT2ZmbG9hZFJlcS0+c2NhblR5cGUgPSBlU0lSX1BBU1NJVkVfU0NBTjsKKwlwU2Nhbk9mZmxvYWRSZXEtPnAycFNjYW5UeXBlID0gUDJQX1NDQU5fVFlQRV9MSVNURU47CisJcFNjYW5PZmZsb2FkUmVxLT5taW5DaGFubmVsVGltZSA9IHBSZW1PbkNoblJlcS0+ZHVyYXRpb247CisJcFNjYW5PZmZsb2FkUmVxLT5tYXhDaGFubmVsVGltZSA9IHBSZW1PbkNoblJlcS0+ZHVyYXRpb247CisJcFNjYW5PZmZsb2FkUmVxLT5zZXNzaW9uSWQgPSBwUmVtT25DaG5SZXEtPnNlc3Npb25JZDsKKwlwU2Nhbk9mZmxvYWRSZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzID0gMTsKKwlwU2Nhbk9mZmxvYWRSZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXJbMF0gPSBwUmVtT25DaG5SZXEtPmNobk51bTsKKwlwU2Nhbk9mZmxvYWRSZXEtPnNjYW5faWQgPSBwUmVtT25DaG5SZXEtPnNjYW5faWQ7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsCisJCUZMKCJSZXEtcmVtLW9uLWNoYW5uZWw6IGR1cmF0aW9uICV1LCBzZXNzaW9uICVodSwgY2hhbiAlaHUiKSwKKwkJcFJlbU9uQ2huUmVxLT5kdXJhdGlvbiwgcFJlbU9uQ2huUmVxLT5zZXNzaW9uSWQsCisJCXBSZW1PbkNoblJlcS0+Y2huTnVtKTsKKworCXJjID0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZyk7CisJaWYgKHJjICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJ3bWFfcG9zdF9jdHJsX21zZygpIHJldHVybiBmYWlsdXJlICV1IiksCisJCQlyYyk7CisJCWNkZl9tZW1fZnJlZShwU2Nhbk9mZmxvYWRSZXEpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBSZW1haW4gb24gY2hhbm5lbCByZXEgaGFuZGxlci4gSW5pdGlhdGUgdGhlIElOSVRfU0NBTiwgQ0hOX0NIQU5HRQorICogYW5kIFNFVF9MSU5LIFJlcXVlc3QgZnJvbSBTTUUsIGNobk51bSBhbmQgZHVyYXRpb24gdG8gcmVtYWluIG9uIGNoYW5uZWwuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGxpbV9wcm9jZXNzX3JlbWFpbl9vbl9jaG5sX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZykKK3sKKwl0U2lyUmVtYWluT25DaG5SZXEgKm1zZ2J1ZmYgPSAodFNpclJlbWFpbk9uQ2huUmVxICopIHBNc2c7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlwTWFjLT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEgPSBtc2didWZmOworCXN0YXR1cyA9IGxpbV9zZW5kX2hhbF9yZXFfcmVtYWluX29uX2NoYW5fb2ZmbG9hZChwTWFjLCBtc2didWZmKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkvKiBQb3N0IHRoZSBtZWVzc2FnZSB0byBTbWUgKi8KKwkJbGltX3NlbmRfc21lX3JzcChwTWFjLCBlV05JX1NNRV9SRU1BSU5fT05fQ0hOX1JTUCwKKwkJCQkgc3RhdHVzLCBtc2didWZmLT5zZXNzaW9uSWQsIG1zZ2J1ZmYtPnNjYW5faWQpOworCQljZGZfbWVtX2ZyZWUocE1hYy0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxKTsKKwkJcE1hYy0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxID0gTlVMTDsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGxpbSBJbnNlcnQgTk9BIHRpbWVyIHRpbWVvdXQgY2FsbGJhY2sgLSB3aGVuIHRpbWVyIGZpcmVzLCBkZWFjdGl2YXRlIGl0IGFuZCBzZW5kCisgKiBzY2FuIHJzcCB0byBjc3IvaGRkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1fcHJvY2Vzc19pbnNlcnRfc2luZ2xlX3Nob3Rfbm9hX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwkvKiB0aW1lb3V0IG1lYW5zIHN0YXJ0IE5PQSBkaWQgbm90IGFycml2ZTsgd2UgbmVlZCB0byBkZWFjdGl2YXRlIGFuZCBjaGFuZ2UgdGhlIHRpbWVyIGZvcgorCSAqIGZ1dHVyZSBhY3RpdmF0aW9ucworCSAqLworCWxpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfdGltZXIocE1hYywgZUxJTV9JTlNFUlRfU0lOR0xFU0hPVF9OT0FfVElNRVIpOworCisJLyogRXZlbiBpZiBpbnNlcnQgTk9BIHRpbWVkb3V0LCBnbyBhaGVhZCBhbmQgcHJvY2Vzcy9zZW5kIHN0b3JlZCBTTUUgcmVxdWVzdCAqLworCWxpbV9wcm9jZXNzX3JlZ2RfZGVmZF9zbWVfcmVxX2FmdGVyX25vYV9zdGFydChwTWFjKTsKKworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbGltIEluc2VydCBUaW1lciBjYWxsYmFjayBmdW5jdGlvbiB0byBjaGVjayBhY3RpdmUgREZTIGNoYW5uZWxzCisgKiBhbmQgY29udmVydCB0aGVtIHRvIHBhc3NpdmUgY2hhbm5lbHMgaWYgdGhlcmUgd2FzIG5vCisgKiBiZWFjb24vcHJvYmVyZXNwIGZvciBNQVhfVElNRV9UT19CRV9BQ1RJVkVfQ0hBTk5FTCB0aW1lCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbV9jb252ZXJ0X2FjdGl2ZV9jaGFubmVsX3RvX3Bhc3NpdmVfY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQzMl90IGN1cnJlbnRUaW1lOworCXVpbnQzMl90IGxhc3RUaW1lID0gMDsKKwl1aW50MzJfdCB0aW1lRGlmZjsKKwl1aW50OF90IGk7CisJY3VycmVudFRpbWUgPSBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCk7CisJZm9yIChpID0gMTsgaSA8IFNJUl9NQVhfMjRHXzVHX0NIQU5ORUxfUkFOR0U7IGkrKykgeworCQlpZiAoKHBNYWMtPmxpbS5kZnNjaGFubmVsTGlzdC50aW1lU3RhbXBbaV0pICE9IDApIHsKKwkJCWxhc3RUaW1lID0gcE1hYy0+bGltLmRmc2NoYW5uZWxMaXN0LnRpbWVTdGFtcFtpXTsKKwkJCWlmIChjdXJyZW50VGltZSA+PSBsYXN0VGltZSkgeworCQkJCXRpbWVEaWZmID0gKGN1cnJlbnRUaW1lIC0gbGFzdFRpbWUpOworCQkJfSBlbHNlIHsKKwkJCQl0aW1lRGlmZiA9CisJCQkJCSgweEZGRkZGRkZGIC0gbGFzdFRpbWUpICsgY3VycmVudFRpbWU7CisJCQl9CisKKwkJCWlmICh0aW1lRGlmZiA+PSBNQVhfVElNRV9UT19CRV9BQ1RJVkVfQ0hBTk5FTCkgeworCQkJCWxpbV9jb3ZlcnRfY2hhbm5lbF9zY2FuX3R5cGUocE1hYywgaSwgZmFsc2UpOworCQkJCXBNYWMtPmxpbS5kZnNjaGFubmVsTGlzdC50aW1lU3RhbXBbaV0gPSAwOworCQkJfQorCQl9CisJfQorCS8qIGxhc3RUaW1lIGlzIHplcm8gaWYgdGhlcmUgaXMgbm8gREZTIGFjdGl2ZSBjaGFubmVscyBpbiB0aGUgbGlzdC4KKwkgKiBJZiB0aGlzIGlzIG5vbiB6ZXJvIHRoZW4gd2UgaGF2ZSBhY3RpdmUgREZTIGNoYW5uZWxzIHNvIHJlc3RhcnQgdGhlIHRpbWVyLgorCSAqLworCWlmIChsYXN0VGltZSAhPSAwKSB7CisJCWlmICh0eF90aW1lcl9hY3RpdmF0ZQorCQkJICAgICgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQWN0aXZlVG9QYXNzaXZlQ2hhbm5lbFRpbWVyKQorCQkgICAgIT0gVFhfU1VDQ0VTUykgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiQ291bGQgbm90IGFjdGl2YXRlIEFjdGl2ZSB0byBQYXNzaXZlIENoYW5uZWwgIHRpbWVyIikpOworCQl9CisJfQorCisJcmV0dXJuOworCit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfcmVtYWluX29uX2Nobl90aW1lb3V0KCkgLSBST0MgdGltZW91dCBoYW5kbGVyCisgKgorICogQG1hY19jdHg6IE1BQyBjb250ZXh0CisgKgorICogbGltY2hhbm5lbGNoYW5nZSBjYWxsYmFjaywgb24gc3VjY2VzcyBjaGFubmVsIGNoYW5nZSwgc2V0IHRoZQorICogbGlua19zdGF0ZSB0byBMSVNURU4KKyAqCisgKiBSZXR1cm46IE5VTEwKKyAqLwordm9pZCBsaW1fcHJvY2Vzc19yZW1haW5fb25fY2huX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCkKK3sKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uOworCXRTaXJNYWNBZGRyIG51bGxfYnNzaWQgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwlUWF9USU1FUiAqcm9jX3RpbWVyOworCisJcm9jX3RpbWVyID0gJm1hY19jdHgtPmxpbS5saW1UaW1lcnMuZ0xpbVJlbWFpbk9uQ2hhbm5lbFRpbWVyOworCS8qCisJICogVGltZXIgbWlnaHQgZ2V0IGV4dGVuZGVkIHdoaWxlIFNlbmRpbmcgQWN0aW9uIEZyYW1lCisJICogSW4gdGhhdCBjYXNlIGRvbid0IHByb2Nlc3MgQ2hhbm5lbCBUaW1lb3V0CisJICovCisJaWYgKHR4X3RpbWVyX3J1bm5pbmcocm9jX3RpbWVyKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiYWxyZWFkeSB0aW1lciBpcyBydW5uaW5nIGFuZCBub3QgcHJvY2Vzc2luZyAiKSk7CisJCXJldHVybjsKKwl9CisKKwlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKG1hY19jdHgsIGVMSU1fUkVNQUlOX0NITl9USU1FUik7CisJaWYgKE5VTEwgPT0gbWFjX2N0eC0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIk5vIFJlbWFpbiBvbiBjaGFubmVsIHBlbmRpbmciKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgdGhlIHByZXZpb3VzIHZhbGlkIExJTksgc3RhdGUgKi8KKwlpZiAobGltX3NldF9saW5rX3N0YXRlKG1hY19jdHgsIGVTSVJfTElOS19JRExFX1NUQVRFLCBudWxsX2Jzc2lkLAorCQltYWNfY3R4LT5saW0uZ1NlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MpCisJeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJVbmFibGUgdG8gY2hhbmdlIGxpbmsgc3RhdGUiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobWFjX2N0eC0+bGltLmdMaW1NbG1TdGF0ZSAhPSBlTElNX01MTV9QMlBfTElTVEVOX1NUQVRFKSB7CisJCWxpbV9yZW1haW5fb25fY2huX3JzcChtYWNfY3R4LCBDREZfU1RBVFVTX1NVQ0NFU1MsIE5VTEwpOworCX0gZWxzZSB7CisJCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LAorCQkJcm9jX3RpbWVyLT5zZXNzaW9uSWQpOworCQkvKiBnZXQgdGhlIHNlc3Npb24gKi8KKwkJaWYgKHNlc3Npb24gPT0gTlVMTCkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IHNlc3Npb25JRCAlZCIpLAorCQkJCXJvY190aW1lci0+c2Vzc2lvbklkKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlsaW1fZXhpdF9yZW1haW5fb25fY2hhbm5lbChtYWNfY3R4LCBDREZfU1RBVFVTX1NVQ0NFU1MsIE5VTEwsCisJCQlzZXNzaW9uKTsKKwkJcmV0dXJuOworZXJyb3I6CisJCWxpbV9yZW1haW5fb25fY2huX3JzcChtYWNfY3R4LCBDREZfU1RBVFVTX0VfRkFJTFVSRSwgTlVMTCk7CisJfQorCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBsaW1jaGFubmVsY2hhbmdlIGNhbGxiYWNrLCBvbiBzdWNjZXNzIGNoYW5uZWwgY2hhbmdlLCBzZXQgdGhlIGxpbmtfc3RhdGUKKyAqIHRvIExJU1RFTgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBsaW1fZXhpdF9yZW1haW5fb25fY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCBDREZfU1RBVFVTIHN0YXR1cywKKwkJCQl1aW50MzJfdCAqZGF0YSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsICJSZW1haW4gb24gQ2hhbm5lbCBGYWlsZWQiKTspCisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFNldCB0aGUgcmVzdW1lIGNoYW5uZWwgdG8gQW55IHZhbGlkIGNoYW5uZWwgKGludmFsaWQpLiAqLworCS8qIFRoaXMgd2lsbCBpbnN0cnVjdCBIQUwgdG8gc2V0IGl0IHRvIGFueSBwcmV2aW91cyB2YWxpZCBjaGFubmVsLiAqLworCXBlX3NldF9yZXN1bWVfY2hhbm5lbChwTWFjLCAwLCAwKTsKKwlsaW1fcmVtYWluX29uX2Nobl9yc3AocE1hYywgQ0RGX1NUQVRVU19TVUNDRVNTLCBOVUxMKTsKKwlyZXR1cm47CitlcnJvcjoKKwlsaW1fcmVtYWluX29uX2Nobl9yc3AocE1hYywgQ0RGX1NUQVRVU19FX0ZBSUxVUkUsIE5VTEwpOworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZW5kIHJlbWFpbiBvbiBjaGFubmVsIHJlc3BvbmU6IFN1Y2Nlc3MvIEZhaWx1cmUKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbV9yZW1haW5fb25fY2huX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCBDREZfU1RBVFVTIHN0YXR1cywgdWludDMyX3QgKmRhdGEpCit7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl0U2lyUmVtYWluT25DaG5SZXEgKk1zZ1JlbWFpbm9uQ2hhbm5lbCA9IHBNYWMtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcTsKKwl0U2lyTWFjQWRkciBudWxsQnNzaWQgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworCWlmIChOVUxMID09IE1zZ1JlbWFpbm9uQ2hhbm5lbCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dQLAorCQkJICAgICAgICIlczogTm8gUG9pbnRlciBmb3IgUmVtYWluIG9uIENoYW5uZWwgUmVxIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCSAgICAgICApCisJCXJldHVybjsKKwl9CisJLyogSW5jYXNlIG9mIHRoZSBSZW1haW4gb24gQ2hhbm5lbCBGYWlsdXJlIENhc2UgKi8KKwkvKiBDbGVhbnVwIEV2ZXJ5dGhpbmcgKi8KKwlpZiAoQ0RGX1NUQVRVU19FX0ZBSUxVUkUgPT0gc3RhdHVzKSB7CisJCS8qIERlYWN0aXZhdGUgUmVtYWluIG9uIENoYW5uZWwgVGltZXIgKi8KKwkJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihwTWFjLCBlTElNX1JFTUFJTl9DSE5fVElNRVIpOworCisJCS8qIFNldCB0aGUgTGluayBTdGF0ZSB0byBJZGxlICovCisJCS8qIGdldCB0aGUgcHJldmlvdXMgdmFsaWQgTElOSyBzdGF0ZSAqLworCQlpZiAobGltX3NldF9saW5rX3N0YXRlKHBNYWMsIGVTSVJfTElOS19JRExFX1NUQVRFLCBudWxsQnNzaWQsCisJCQkJICAgICAgIHBNYWMtPmxpbS5nU2VsZk1hY0FkZHIsIE5VTEwsCisJCQkJICAgICAgIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLCAiVW5hYmxlIHRvIGNoYW5nZSBsaW5rIHN0YXRlIik7CisJCX0KKworCQlwTWFjLT5saW0uZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSA9IDA7CisJCXBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID0gZUxJTV9IQUxfSURMRV9TQ0FOX1NUQVRFOworCQlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKwl9CisKKwkvKiBkZWxldGUgdGhlIHNlc3Npb24gKi8KKwlpZiAoKHBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywKKwkJCQkJCSAgICAgIE1zZ1JlbWFpbm9uQ2hhbm5lbC0+CisJCQkJCQkgICAgICBzZWxmTWFjQWRkciwKKwkJCQkJCSAgICAgICZzZXNzaW9uSWQpKSAhPSBOVUxMKSB7CisJCWlmIChMSU1fSVNfUDJQX0RFVklDRV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQlwZV9kZWxldGVfc2Vzc2lvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJfQorCX0KKworCS8qIFBvc3QgdGhlIG1lZXNzYWdlIHRvIFNtZSAqLworCWxpbV9zZW5kX3NtZV9yc3AocE1hYywgZVdOSV9TTUVfUkVNQUlOX09OX0NITl9SU1AsCisJCQlzdGF0dXMsCisJCQlNc2dSZW1haW5vbkNoYW5uZWwtPnNlc3Npb25JZCwgMCk7CisKKwljZGZfbWVtX2ZyZWUocE1hYy0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxKTsKKwlwTWFjLT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEgPSBOVUxMOworCisJcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IHBNYWMtPmxpbS5nTGltUHJldk1sbVN0YXRlOworCisJLyogSWYgcmVtYWluIG9uIGNoYW5uZWwgdGltZXIgZXhwaXJlZCBhbmQgYWN0aW9uIGZyYW1lIGlzIHBlbmRpbmcgdGhlbgorCSAqIGluZGljYWl0b24gY29uZmlybWF0aW9uIHdpdGggc3RhdHVzIGZhaWx1cmUgKi8KKwlpZiAocE1hYy0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCAhPSAweGZmKSB7CisJCWxpbV9wMnBfYWN0aW9uX2NuZihwTWFjLCAwKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSW5kaWNhdGUgdGhlIE1nbXQgRnJhbWUgcmVjZWl2ZWQgdG8gU01FIHRvIEhERCBjYWxsYmFjaworICogaGFuZGxlIFByb2JlX3JlcS9BY3Rpb24gZnJhbWUgY3VycmVudGx5CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1fc2VuZF9zbWVfbWdtdF9mcmFtZV9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBmcmFtZVR5cGUsCisJCQkJIHVpbnQ4X3QgKmZyYW1lLCB1aW50MzJfdCBmcmFtZUxlbiwKKwkJCQkgdWludDE2X3Qgc2Vzc2lvbklkLCB1aW50MzJfdCByeENoYW5uZWwsCisJCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksIGludDhfdCByeFJzc2kpCit7CisJdFNpck1zZ1EgbW1oTXNnOworCXRwU2lyU21lTWdtdEZyYW1lSW5kIHBTaXJTbWVNZ210RnJhbWUgPSBOVUxMOworCXVpbnQxNl90IGxlbmd0aDsKKworCWxlbmd0aCA9IHNpemVvZih0U2lyU21lTWdtdEZyYW1lSW5kKSArIGZyYW1lTGVuOworCisJcFNpclNtZU1nbXRGcmFtZSA9IGNkZl9tZW1fbWFsbG9jKGxlbmd0aCk7CisJaWYgKE5VTEwgPT0gcFNpclNtZU1nbXRGcmFtZSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9MSVNURU5fUlNQIikpOworCQlyZXR1cm47CisJfQorCWNkZl9tZW1fc2V0KCh2b2lkICopcFNpclNtZU1nbXRGcmFtZSwgbGVuZ3RoLCAwKTsKKworCXBTaXJTbWVNZ210RnJhbWUtPm1lc2dUeXBlID0gZVdOSV9TTUVfTUdNVF9GUk1fSU5EOworCXBTaXJTbWVNZ210RnJhbWUtPm1lc2dMZW4gPSBsZW5ndGg7CisJcFNpclNtZU1nbXRGcmFtZS0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCXBTaXJTbWVNZ210RnJhbWUtPmZyYW1lVHlwZSA9IGZyYW1lVHlwZTsKKwlwU2lyU21lTWdtdEZyYW1lLT5yeFJzc2kgPSByeFJzc2k7CisJcFNpclNtZU1nbXRGcmFtZS0+cnhDaGFuID0gcnhDaGFubmVsOworCisJY2RmX21lbV96ZXJvKHBTaXJTbWVNZ210RnJhbWUtPmZyYW1lQnVmLCBmcmFtZUxlbik7CisJY2RmX21lbV9jb3B5KHBTaXJTbWVNZ210RnJhbWUtPmZyYW1lQnVmLCBmcmFtZSwgZnJhbWVMZW4pOworCisJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9NR01UX0ZSTV9JTkQ7CisJbW1oTXNnLmJvZHlwdHIgPSBwU2lyU21lTWdtdEZyYW1lOworCW1taE1zZy5ib2R5dmFsID0gMDsKKworCWxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisJcmV0dXJuOworfQorCitDREZfU1RBVFVTIGxpbV9wMnBfYWN0aW9uX2NuZih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCB0eENvbXBsZXRlU3VjY2VzcykKK3sKKwlpZiAocE1hYy0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCAhPSAweGZmKSB7CisJCS8qIFRoZSBzZXNzaW9uIGVudHJ5IG1pZ2h0IGJlIGludmFsaWQoMHhmZikgYWN0aW9uIGNvbmZpcm1hdGlvbiByZWNlaXZlZCBhZnRlcgorCQkgKiByZW1haW4gb24gY2hhbm5lbCB0aW1lciBleHBpcmVkICovCisJCWxpbV9zZW5kX3NtZV9yc3AocE1hYywgZVdOSV9TTUVfQUNUSU9OX0ZSQU1FX1NFTkRfQ05GLAorCQkJCSAodHhDb21wbGV0ZVN1Y2Nlc3MgPyBlU0lSX1NNRV9TVUNDRVNTIDoKKwkJCQkgIGVTSVJfU01FX1NFTkRfQUNUSU9OX0ZBSUwpLAorCQkJCSBwTWFjLT5saW0ubWdtdEZyYW1lU2Vzc2lvbklkLCAwKTsKKwkJcE1hYy0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCA9IDB4ZmY7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBsaW1fdHhfYWN0aW9uX2ZyYW1lKCkgLSBIYW5kbGVzIGFjdGlvbiBmcmFtZSB0cmFuc21pc3Npb24gcmVxdWVzdAorICogQG1hY19jdHg6ICBQb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKiBAbWJfbXNnOiAgbWVzc2FnZSBzZW50IGZyb20gU01FCisgKiBAbXNnX2xlbjogTWVzc2FnZSBsZW5ndGgKKyAqIEBwYWNrZXQ6IG5ldHdvcmsgYnVmZmVyIGZvciBUWAorICogQGZyYW1lOiBmcmFtZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgYWN0aW9uIGZyYW1lIHRyYW5zbWlzc2lvbiByZXF1ZXN0IGFuZAorICogcG9zdHMgbWVzc2FnZSB0byBXTUEuCisgKgorICogUmV0dXJuOiBOVUxMCisgKi8KK3N0YXRpYyB2b2lkIGxpbV90eF9hY3Rpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwl0U2lyTWJNc2dQMnAgKm1iX21zZywgdWludDMyX3QgbXNnX2xlbiwgdm9pZCAqcGFja2V0LCB1aW50OF90ICpmcmFtZSkKK3sKKwl1aW50OF90IHR4X2ZsYWcgPSAwOworCXRwU2lyTWFjRnJhbWVDdGwgZmMgPSAodHBTaXJNYWNGcmFtZUN0bCkgbWJfbXNnLT5kYXRhOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl1aW50OF90IHNtZV9zZXNzaW9uX2lkID0gMDsKKwl1aW50MTZfdCBjaGFubmVsX2ZyZXE7CisKKwlzbWVfc2Vzc2lvbl9pZCA9IG1iX21zZy0+c2Vzc2lvbklkOworCWNoYW5uZWxfZnJlcSA9IG1iX21zZy0+Y2hhbm5lbF9mcmVxOworCS8qCisJICogVXNlIEJEIHJhdGUgMiBmb3IgYWxsIFAyUCByZWxhdGVkIGZyYW1lcy4gQXMgdGhlc2UgZnJhbWVzCisJICogbmVlZCB0byBnbyBhdCBPRkRNIHJhdGVzLiBBbmQgQkQgcmF0ZTIgd2UgY29uZmlndXJlZCBhdCA2TWJwcy4KKwkgKi8KKwl0eF9mbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisKKwlpZiAoKFNJUl9NQUNfTUdNVF9QUk9CRV9SU1AgPT0gZmMtPnN1YlR5cGUpIHx8CisJCShtYl9tc2ctPm5vYWNrKSkgeworCQljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lKG1hY19jdHgsIHBhY2tldCwgKHVpbnQxNl90KSBtc2dfbGVuLAorCQkJVFhSWF9GUk1fODAyXzExX01HTVQsCisJCQlBTklfVFhESVJfVE9EUywgNywgbGltX3R4X2NvbXBsZXRlLAorCQkJZnJhbWUsIHR4X2ZsYWcsIHNtZV9zZXNzaW9uX2lkLAorCQkJY2hhbm5lbF9mcmVxKTsKKworCQlpZiAoIW1iX21zZy0+bm9hY2spCisJCQlsaW1fc2VuZF9zbWVfcnNwKG1hY19jdHgsCisJCQkJZVdOSV9TTUVfQUNUSU9OX0ZSQU1FX1NFTkRfQ05GLAorCQkJCWNkZl9zdGF0dXMsIG1iX21zZy0+c2Vzc2lvbklkLCAwKTsKKwkJbWFjX2N0eC0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCA9IDB4ZmY7CisJfSBlbHNlIHsKKwkJbWFjX2N0eC0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCA9IG1iX21zZy0+c2Vzc2lvbklkOworCQljZGZfc3RhdHVzID0KKwkJCXdtYV90eF9mcmFtZVdpdGhUeENvbXBsZXRlKG1hY19jdHgsIHBhY2tldCwKKwkJCQkodWludDE2X3QpIG1zZ19sZW4sCisJCQkJVFhSWF9GUk1fODAyXzExX01HTVQsCisJCQkJQU5JX1RYRElSX1RPRFMsIDcsIGxpbV90eF9jb21wbGV0ZSwKKwkJCQlmcmFtZSwgbGltX3AycF9hY3Rpb25fY25mLCB0eF9mbGFnLAorCQkJCXNtZV9zZXNzaW9uX2lkLCBmYWxzZSwKKwkJCQljaGFubmVsX2ZyZXEpOworCisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoImNvdWxkbid0IHNlbmQgYWN0aW9uIGZyYW1lIikpOworCQkJbGltX3NlbmRfc21lX3JzcChtYWNfY3R4LAorCQkJCWVXTklfU01FX0FDVElPTl9GUkFNRV9TRU5EX0NORiwKKwkJCQljZGZfc3RhdHVzLCBtYl9tc2ctPnNlc3Npb25JZCwgMCk7CisJCQltYWNfY3R4LT5saW0ubWdtdEZyYW1lU2Vzc2lvbklkID0gMHhmZjsKKwkJfSBlbHNlIHsKKwkJCW1hY19jdHgtPmxpbS5tZ210RnJhbWVTZXNzaW9uSWQgPSBtYl9tc2ctPnNlc3Npb25JZDsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJCQlGTCgibGltLmFjdGlvbkZyYW1lU2Vzc2lvbklkID0gJXUiKSwKKwkJCQltYWNfY3R4LT5saW0ubWdtdEZyYW1lU2Vzc2lvbklkKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyoqCisgKiBsaW1fc2VuZF9wMnBfYWN0aW9uX2ZyYW1lKCkgLSBQcm9jZXNzIGFjdGlvbiBmcmFtZSByZXF1ZXN0CisgKiBAbWFjX2N0eDogIFBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqIEBtc2c6ICBtZXNzYWdlIHNlbnQgZnJvbSBTTUUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgYWN0aW9uIGZyYW1lIHJlcXVlc3Qgc2VudCBmcm9tIHRoZQorICogU01FIGFuZCBnZW5lcmF0ZXMgdGhlIEFDVElPTiBmcmFtZS4KKyAqCisgKiBSZXR1cm46IE5VTEwKKyAqLwordm9pZCBsaW1fc2VuZF9wMnBfYWN0aW9uX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXRwU2lyTXNnUSBtc2cpCit7CisJdFNpck1iTXNnUDJwICptYl9tc2cgPSAodFNpck1iTXNnUDJwICopIG1zZy0+Ym9keXB0cjsKKwl1aW50MzJfdCBtc2dfbGVuOworCXVpbnQ4X3QgKmZyYW1lOworCXZvaWQgKnBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdHBTaXJNYWNGcmFtZUN0bCBmYyA9ICh0cFNpck1hY0ZyYW1lQ3RsKSBtYl9tc2ctPmRhdGE7CisJdWludDhfdCBub2FfbGVuID0gMDsKKwl1aW50OF90IG5vYV9zdHJlYW1bU0lSX01BWF9OT0FfQVRUUl9MRU4gKyAoMiAqIFNJUl9QMlBfSUVfSEVBREVSX0xFTildOworCXVpbnQ4X3Qgb3JpZ19sZW4gPSAwOworCXVpbnQ4X3Qgc2Vzc2lvbl9pZCA9IDA7CisJdWludDhfdCAqcDJwX2llID0gTlVMTDsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5ID0gTlVMTDsKKwl1aW50OF90ICpwcmVzZW5jZV9ub2FfYXR0ciA9IE5VTEw7CisJdWludDhfdCAqdG1wX3AycF9pZSA9IE5VTEw7CisJdWludDE2X3QgcmVtYWluX2xlbiA9IDA7CisJdWludDhfdCBzbWVfc2Vzc2lvbl9pZCA9IDA7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXRwU2lyTWFjTWdtdEhkciBtYWNfaGRyOworCXRwU2lyTWFjQWN0aW9uRnJhbWVIZHIgYWN0aW9uX2hkcjsKKyNlbmRpZgorCisJbXNnX2xlbiA9IG1iX21zZy0+bXNnTGVuIC0gc2l6ZW9mKHRTaXJNYk1zZ1AycCk7CisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgic2VuZGluZyBmYy0+dHlwZT0lZCBmYy0+c3ViVHlwZT0lZCIpLAorCQlmYy0+dHlwZSwgZmMtPnN1YlR5cGUpOworCisJaWYgKCghbWFjX2N0eC0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxKSAmJiAoMCAhPSBtYl9tc2ctPndhaXQpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJSZW1haW5PbkNoYW5uZWwgaXMgbm90IHJ1bm5pbmdcbiIpKTsKKwkJbGltX3NlbmRfc21lX3JzcChtYWNfY3R4LCBlV05JX1NNRV9BQ1RJT05fRlJBTUVfU0VORF9DTkYsCisJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSwgbWJfbXNnLT5zZXNzaW9uSWQsIDApOworCQlyZXR1cm47CisJfQorCXNtZV9zZXNzaW9uX2lkID0gbWJfbXNnLT5zZXNzaW9uSWQ7CisKKwlpZiAoKFNJUl9NQUNfTUdNVF9GUkFNRSA9PSBmYy0+dHlwZSkgJiYKKwkJKFNJUl9NQUNfTUdNVF9QUk9CRV9SU1AgPT0gZmMtPnN1YlR5cGUpKSB7CisJCS8qIGdldCBwcm9wZXIgb2Zmc2V0IGZvciBQcm9iZSBSU1AgKi8KKwkJcDJwX2llID0gbGltR2V0UDJwSUVQdHIobWFjX2N0eCwKKwkJCQkodWludDhfdCAqKSBtYl9tc2ctPmRhdGEgKworCQkJCVBST0JFX1JTUF9JRV9PRkZTRVQsCisJCQkJbXNnX2xlbiAtIFBST0JFX1JTUF9JRV9PRkZTRVQpOworCQl3aGlsZSAoKE5VTEwgIT0gcDJwX2llKQorCQkJJiYgKFNJUl9NQUNfTUFYX0lFX0xFTkdUSCA9PSBwMnBfaWVbMV0pKSB7CisJCQlyZW1haW5fbGVuID0KKwkJCQltc2dfbGVuIC0gKHAycF9pZSAtCisJCQkJKHVpbnQ4X3QgKikgbWJfbXNnLT5kYXRhKTsKKwkJCWlmIChyZW1haW5fbGVuID4gMikgeworCQkJCXRtcF9wMnBfaWUgPSBsaW1HZXRQMnBJRVB0cihtYWNfY3R4LAorCQkJCQlwMnBfaWUgKyBTSVJfTUFDX01BWF9JRV9MRU5HVEggKyAyLAorCQkJCQlyZW1haW5fbGVuKTsKKwkJCX0KKwkJCWlmICh0bXBfcDJwX2llKSB7CisJCQkJcDJwX2llID0gdG1wX3AycF9pZTsKKwkJCQl0bXBfcDJwX2llID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gLyogZW5kIG9mIHdoaWxlICovCisJfSBlbHNlIGlmICgoU0lSX01BQ19NR01UX0ZSQU1FID09IGZjLT50eXBlKSAmJgorCQkoU0lSX01BQ19NR01UX0FDVElPTiA9PSBmYy0+c3ViVHlwZSkgJiYKKwkJKFNJUl9NQUNfQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQ19DQVRFR09SWSA9PQorCQkqKCh1aW50OF90ICopIG1iX21zZy0+ZGF0YSArIEFDVElPTl9PRkZTRVQpKSkgeworCQl0cFNpck1hY1AyUEFjdGlvbkZyYW1lSGRyIGFjdGlvbl9oZHIgPQorCQkJKHRwU2lyTWFjUDJQQWN0aW9uRnJhbWVIZHIpICgodWludDhfdCAqKQorCQkJbWJfbXNnLT5kYXRhICsgQUNUSU9OX09GRlNFVCk7CisJCWlmIChjZGZfbWVtX2NvbXBhcmUoYWN0aW9uX2hkci0+T3VpLCBTSVJfTUFDX1AyUF9PVUksCisJCQlTSVJfTUFDX1AyUF9PVUlfU0laRSkgJiYKKwkJCShTSVJfTUFDX0FDVElPTl9QMlBfU1VCVFlQRV9QUkVTRU5DRV9SU1AgPT0KKwkJCWFjdGlvbl9oZHItPk91aVN1YlR5cGUpKSB7CisKKwkJCS8qIEluIGNhc2Ugb2YgUHJlc2VuY2UgUlNQIHJlc3BvbnNlICovCisJCQlwMnBfaWUgPSBsaW1HZXRQMnBJRVB0cihtYWNfY3R4LAorCQkJCSh1aW50OF90ICopbWJfbXNnLT5kYXRhICsKKwkJCQlBQ1RJT05fT0ZGU0VUICsKKwkJCQlzaXplb2YodFNpck1hY1AyUEFjdGlvbkZyYW1lSGRyKSwKKwkJCQkobXNnX2xlbiAtIEFDVElPTl9PRkZTRVQKKwkJCQktIHNpemVvZih0U2lyTWFjUDJQQWN0aW9uRnJhbWVIZHIpKSk7CisJCQlpZiAoTlVMTCAhPSBwMnBfaWUpIHsKKwkJCQkvKiBleHRyYWN0IHRoZSBwcmVzZW5jZSBvZiBOb0EgYXR0cmlidXRlIGluc2lkZQorCQkJCSAqIFAyUCBJRSAqLworCQkJCXByZXNlbmNlX25vYV9hdHRyID0gIGxpbV9nZXRfaWVfcHRyX25ldyhtYWNfY3R4LAorCQkJCQlwMnBfaWUgKyBTSVJfUDJQX0lFX0hFQURFUl9MRU4sCisJCQkJCXAycF9pZVsxXSwgU0lSX1AyUF9OT0FfQVRUUiwgVFdPX0JZVEUpOworCQkJfQorCQl9CisJfQorCisJaWYgKChTSVJfTUFDX01HTVRfRlJBTUUgPT0gZmMtPnR5cGUpICYmCisJCShTSVJfTUFDX01HTVRfUFJPQkVfUlNQID09IGZjLT5zdWJUeXBlIHx8CisJCVNJUl9NQUNfTUdNVF9BQ1RJT04gPT0gZmMtPnN1YlR5cGUpICYmIHAycF9pZSAhPSBOVUxMKSB7CisJCS8qIGdldCBOb0EgYXR0cmlidXRlIHN0cmVhbSBQMlAgSUUgKi8KKwkJbm9hX2xlbiA9CisJCQlsaW1fZ2V0X25vYV9hdHRyX3N0cmVhbShtYWNfY3R4LCBub2Ffc3RyZWFtLAorCQkJCXNlc3Npb25fZW50cnkpOworCQkvKiBuZWVkIHRvIGFwcGVuZCBOb0EgYXR0cmlidXRlIGluIFAyUCBJRSAqLworCQlpZiAobm9hX2xlbiA+IDApIHsKKwkJCW9yaWdfbGVuID0gcDJwX2llWzFdOworCQkJLyogaWYgUHJlc2VuY2UgUnNwIGhhcyBOb0F0dHIgKi8KKwkJCWlmIChwcmVzZW5jZV9ub2FfYXR0cikgeworCQkJCXVpbnQxNl90IG5vYV9sZW4gPQorCQkJCQlwcmVzZW5jZV9ub2FfYXR0clsxXSB8CisJCQkJCShwcmVzZW5jZV9ub2FfYXR0clsyXSA8PCA4KTsKKwkJCQkvKk9uZSBieXRlIGZvciBhdHRyaWJ1dGUsIDJieXRlcyBmb3IgbGVuZ3RoICovCisJCQkJb3JpZ19sZW4gLT0gKG5vYV9sZW4gKyAxICsgMik7CisJCQkJLyogcmVtb3ZlIHRob3NlIGJ5dGVzIHRvIGNvcHkgKi8KKwkJCQltc2dfbGVuIC09IChub2FfbGVuICsgMSArIDIpOworCQkJCS8qIHJlbW92ZSBOb0EgZnJvbSBvcmlnaW5hbCBMZW4gKi8KKwkJCQlwMnBfaWVbMV0gPSBvcmlnX2xlbjsKKwkJCX0KKwkJCWlmICgocDJwX2llWzFdICsgKHVpbnQxNl90KSBub2FfbGVuKSA+CisJCQkJU0lSX01BQ19NQVhfSUVfTEVOR1RIKSB7CisJCQkJLyoKKwkJCQkgKiBGb3JtIHRoZSBuZXcgTm9BIEJ5dGUgYXJyYXkgaW4gbXVsdGlwbGUKKwkJCQkgKiBQMlAgSUVzCisJCQkJICovCisJCQkJbm9hX2xlbiA9CisJCQkJCWxpbV9nZXRfbm9hX2F0dHJfc3RyZWFtX2luX211bHRfcDJwX2llcworCQkJCQkobWFjX2N0eCwgbm9hX3N0cmVhbSwgbm9hX2xlbiwKKwkJCQkJKChwMnBfaWVbMV0gKyAodWludDE2X3Qpbm9hX2xlbikKKwkJCQkJLSBTSVJfTUFDX01BWF9JRV9MRU5HVEgpKTsKKwkJCQlwMnBfaWVbMV0gPSBTSVJfTUFDX01BWF9JRV9MRU5HVEg7CisJCQl9IGVsc2UgeworCQkJCS8qIGluY3JlbWVudCB0aGUgbGVuZ3RoIG9mIFAyUCBJRSAqLworCQkJCXAycF9pZVsxXSArPSBub2FfbGVuOworCQkJfQorCQkJbXNnX2xlbiArPSBub2FfbGVuOworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJub2FfbGVuPSVkIG9yaWdfbGVuPSVkIHAycF9pZT0lcCIKKwkJCQkiIG1zZ19sZW49JWQgbkJ5dGVzVG9Db3B5PSV6dSAiKSwKKwkJCQlub2FfbGVuLCBvcmlnX2xlbiwgcDJwX2llLCBtc2dfbGVuLAorCQkJCSgocDJwX2llICsgb3JpZ19sZW4gKyAyKSAtCisJCQkJICh1aW50OF90ICopIG1iX21zZy0+ZGF0YSkpOworCQl9CisJfQorCisJaWYgKChTSVJfTUFDX01HTVRfUFJPQkVfUlNQID09IGZjLT5zdWJUeXBlIHx8CisJCVNJUl9NQUNfTUdNVF9BQ1RJT04gPT0gZmMtPnN1YlR5cGUpKQorCQlsaW1fc2V0X2h0X2NhcHMobWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSwKKwkJCSh1aW50OF90ICopIG1iX21zZy0+ZGF0YSArIFBST0JFX1JTUF9JRV9PRkZTRVQsCisJCQltc2dfbGVuIC0gUFJPQkVfUlNQX0lFX09GRlNFVCk7CisKKwkvKiBPay0tIHRyeSB0byBhbGxvY2F0ZSBzb21lIG1lbW9yeTogKi8KKwljZGZfc3RhdHVzID0gY2RzX3BhY2tldF9hbGxvYygodWludDE2X3QpIG1zZ19sZW4sICh2b2lkICoqKSZmcmFtZSwKKwkJKHZvaWQgKiopJnBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBQcm9iZSBSZXF1ZXN0LiIpLAorCQkJbXNnX2xlbik7CisJCXJldHVybjsKKwl9CisJLyogUGFyYW5vaWE6ICovCisJY2RmX21lbV9zZXQoZnJhbWUsIG1zZ19sZW4sIDApOworCisJLyoKKwkgKiBBZGQgc2VxdWVuY2UgbnVtYmVyIHRvIGFjdGlvbiBmcmFtZXMKKwkgKiBGcmFtZXMgYXJlIGhhbmRlZCBvdmVyIGluIC4xMSBmb3JtYXQgYnkgc3VwcGxpY2FudCBhbHJlYWR5CisJICovCisJbGltX3BvcHVsYXRlX3AycF9tYWNfaGVhZGVyKG1hY19jdHgsICh1aW50OF90ICopIG1iX21zZy0+ZGF0YSk7CisKKwlpZiAoKG5vYV9sZW4gPiAwKQorCQkmJiAobm9hX2xlbiA8IChTSVJfTUFYX05PQV9BVFRSX0xFTiArIFNJUl9QMlBfSUVfSEVBREVSX0xFTikpKSB7CisJCS8qIEFkZCAyIGJ5dGVzIGZvciBsZW5ndGggYW5kIEFycmlidXRlIGZpZWxkICovCisJCXVpbnQzMl90IG5CeXRlc1RvQ29weSA9ICgocDJwX2llICsgb3JpZ19sZW4gKyAyKSAtCisJCQkgKHVpbnQ4X3QgKikgbWJfbXNnLT5kYXRhKTsKKwkJY2RmX21lbV9jb3B5KGZyYW1lLCBtYl9tc2ctPmRhdGEsIG5CeXRlc1RvQ29weSk7CisJCWNkZl9tZW1fY29weSgoZnJhbWUgKyBuQnl0ZXNUb0NvcHkpLCBub2Ffc3RyZWFtLCBub2FfbGVuKTsKKwkJY2RmX21lbV9jb3B5KChmcmFtZSArIG5CeXRlc1RvQ29weSArIG5vYV9sZW4pLAorCQkJbWJfbXNnLT5kYXRhICsgbkJ5dGVzVG9Db3B5LAorCQkJbXNnX2xlbiAtIG5CeXRlc1RvQ29weSAtIG5vYV9sZW4pOworCisJfSBlbHNlIHsKKwkJY2RmX21lbV9jb3B5KGZyYW1lLCBtYl9tc2ctPmRhdGEsIG1zZ19sZW4pOworCX0KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwlhY3Rpb25faGRyID0gKHRwU2lyTWFjQWN0aW9uRnJhbWVIZHIpIChmcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkcikpOworCisJLyoKKwkgKiBTZXR0aW5nIFByb3RlY3RlZCBiaXQgZm9yIFNBX1FVRVJZIEFjdGlvbiBGcmFtZQorCSAqIFRoaXMgaGFzIHRvIGJlIGJhc2VkIG9uIHRoZSBjdXJyZW50IENvbm5lY3Rpb24gd2l0aCB0aGUKKwkgKiBzdGF0aW9uIGxpbV9zZXRfcHJvdGVjdGVkX2JpdCBBUEkgd2lsbCBzZXQgdGhlIHByb3RlY3RlZCBiaXQKKwkgKiBpZiBQTUYKKwkgKi8KKwlpZiAoKFNJUl9NQUNfTUdNVF9BQ1RJT04gPT0gZmMtPnN1YlR5cGUpICYmCisJCShTSVJfTUFDX0FDVElPTl9TQV9RVUVSWSA9PSBhY3Rpb25faGRyLT5jYXRlZ29yeSkpIHsKKwkJbWFjX2hkciA9ICh0cFNpck1hY01nbXRIZHIpIGZyYW1lOworCQlzZXNzaW9uX2VudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKG1hY19jdHgsCisJCQkodWludDhfdCAqKSBtYl9tc2ctPmRhdGEgKyBCU1NJRF9PRkZTRVQsCisJCQkmc2Vzc2lvbl9pZCk7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIHNlc3Npb24gY29ycmVzcG9uZGluZyB0byBBRERSMiBzcyBzdXBwbGljYW50CisJCSAqIGlzIGZpbGxpbmcgQUREUjIgIHdpdGggQlNTSUQKKwkJICovCisJCWlmIChOVUxMID09IHNlc3Npb25fZW50cnkpIHsKKwkJCXNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQobWFjX2N0eCwKKwkJCQkodWludDhfdCAqKSBtYl9tc2ctPmRhdGEgKyBBRERSMl9PRkZTRVQsCisJCQkJICZzZXNzaW9uX2lkKTsKKwkJfQorCisJCWlmIChOVUxMICE9IHNlc3Npb25fZW50cnkpIHsKKwkJCWxpbV9zZXRfcHJvdGVjdGVkX2JpdChtYWNfY3R4LCBzZXNzaW9uX2VudHJ5LAorCQkJbWFjX2hkci0+ZGEsIG1hY19oZHIpOworCQl9IGVsc2UgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJEcm9wcGluZyBTQSBRdWVyeSAtIFBFIFNlc3Npb24gbm90IGZvdW5kIikpOworCQkJbGltX3NlbmRfc21lX3JzcChtYWNfY3R4LAorCQkJCWVXTklfU01FX0FDVElPTl9GUkFNRV9TRU5EX0NORiwKKwkJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSwgbWJfbXNnLT5zZXNzaW9uSWQsIDApOworCQkJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopcGFja2V0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlcCBiaXQgaXMgbm90IHNldCBpbiBNQUMgaGVhZGVyIHRoZW4gd2UgYXJlIHRyeWluZyB0bworCQkgKiBzZW5kIFNBIFF1ZXJ5IHZpYSBub24gUE1GIGNvbm5lY3Rpb24uIERyb3AgdGhlIHBhY2tldC4KKwkJICovCisJCWlmICgwID09IG1hY19oZHItPmZjLndlcCkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJEcm9wcGluZyBTQSBRdWVyeSBkdWUgdG8gbm9uIFBNRiBjb25uZS4iKSk7CisJCQlsaW1fc2VuZF9zbWVfcnNwKG1hY19jdHgsCisJCQkJZVdOSV9TTUVfQUNUSU9OX0ZSQU1FX1NFTkRfQ05GLAorCQkJCUNERl9TVEFUVVNfRV9GQUlMVVJFLCBtYl9tc2ctPnNlc3Npb25JZCwgMCk7CisJCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKilwYWNrZXQpOworCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmCisJbGltX3R4X2FjdGlvbl9mcmFtZShtYWNfY3R4LCBtYl9tc2csIG1zZ19sZW4sIHBhY2tldCwgZnJhbWUpOworCXJldHVybjsKK30KKwordm9pZCBsaW1fYWJvcnRfcmVtYWluX29uX2NoYW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQsCisJdWludDMyX3Qgc2Nhbl9pZCkKK3sKKwlsaW1fcHJvY2Vzc19hYm9ydF9zY2FuX2luZChwTWFjLCBzZXNzaW9uSWQsIHNjYW5faWQpOworfQorCisvKiBQb3dlciBTYXZlIFJlbGF0ZWQgRnVuY3Rpb25zICovCit0U2lyUmV0U3RhdHVzIF9fbGltX3Byb2Nlc3Nfc21lX25vX2FfdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmKQoreworCXRwUDJwUHNDb25maWcgcE5vQTsKKwl0cFAycFBzUGFyYW1zIHBNc2dOb0E7CisJdFNpck1zZ1EgbXNnOworCisJcE5vQSA9ICh0cFAycFBzQ29uZmlnKSBwTXNnQnVmOworCisJcE1zZ05vQSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0UDJwUHNDb25maWcpKTsKKwlpZiAoTlVMTCA9PSBwTXNnTm9BKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBOb0EgVXBkYXRlIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBNc2dOb0EsIHNpemVvZih0UDJwUHNDb25maWcpLCAwKTsKKwlwTXNnTm9BLT5vcHBfcHMgPSBwTm9BLT5vcHBfcHM7CisJcE1zZ05vQS0+Y3RXaW5kb3cgPSBwTm9BLT5jdFdpbmRvdzsKKwlwTXNnTm9BLT5kdXJhdGlvbiA9IHBOb0EtPmR1cmF0aW9uOworCXBNc2dOb0EtPmludGVydmFsID0gcE5vQS0+aW50ZXJ2YWw7CisJcE1zZ05vQS0+Y291bnQgPSBwTm9BLT5jb3VudDsKKwlwTXNnTm9BLT5zaW5nbGVfbm9hX2R1cmF0aW9uID0gcE5vQS0+c2luZ2xlX25vYV9kdXJhdGlvbjsKKwlwTXNnTm9BLT5wc1NlbGVjdGlvbiA9IHBOb0EtPnBzU2VsZWN0aW9uOworCXBNc2dOb0EtPnNlc3Npb25JZCA9IHBOb0EtPnNlc3Npb25pZDsKKworCW1zZy50eXBlID0gV01BX1NFVF9QMlBfR09fTk9BX1JFUTsKKwltc2cucmVzZXJ2ZWQgPSAwOworCW1zZy5ib2R5cHRyID0gcE1zZ05vQTsKKwltc2cuYm9keXZhbCA9IDA7CisKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2cpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoImhhbFBvc3RNc2dBcGkgZmFpbGVkIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZUdvTmVnUmVxKCkgKioqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19hY3Rpb25fZnJhbWUuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfYWN0aW9uX2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3YWU1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfYWN0aW9uX2ZyYW1lLmMKQEAgLTAsMCArMSwyMDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGxpbV9wcm9jZXNzX2FjdGlvbl9mcmFtZS5jYyBjb250YWlucyB0aGUgY29kZQorICogZm9yIHByb2Nlc3NpbmcgQWN0aW9uIEZyYW1lLgorICogQXV0aG9yOiAgICAgIE1pY2hhZWwgTHVpCisgKiBEYXRlOiAgICAgICAgMDUvMjMvMDMKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAic2NoX2FwaS5oIgorI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgImxpbV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9hc3NvY191dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZWN1cml0eV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZXJfZGVzX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlbmRfc21lX3JzcF9tZXNzYWdlcy5oIgorI2luY2x1ZGUgInBhcnNlcl9hcGkuaCIKKyNpbmNsdWRlICJsaW1fYWRtaXRfY29udHJvbC5oIgorI2luY2x1ZGUgIndtbV9hcHNkLmgiCisjaW5jbHVkZSAibGltX3NlbmRfbWVzc2FnZXMuaCIKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNpbmNsdWRlICJycm1fYXBpLmgiCisjZW5kaWYKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbl91dGlscy5oIgorCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisKKworI2RlZmluZSBCQV9ERUZBVUxUX1RYX0JVRkZFUl9TSVpFIDY0CisKKy8qIE5vdGU6IFRoZSB0ZXN0IHBhc3NlcyBpZiB0aGUgU1RBVVQgc3RvcHMgc2VuZGluZyBhbnkgZnJhbWVzLCBhbmQgbm8gZnVydGhlcgorICAgZnJhbWVzIGFyZSB0cmFuc21pdHRlZCBvbiB0aGlzIGNoYW5uZWwgYnkgdGhlIHN0YXRpb24gd2hlbiB0aGUgQVAgaGFzIHNlbnQKKyAgIHRoZSBsYXN0IDYgYmVhY29ucywgd2l0aCB0aGUgY2hhbm5lbCBzd2l0Y2ggaW5mb3JtYXRpb24gZWxlbWVudHMgYXMgc2VlbgorICAgd2l0aCB0aGUgc25pZmZlci4qLworI2RlZmluZSBTSVJfQ0hBTlNXX1RYX1NUT1BfTUFYX0NPVU5UIDYKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgIGxpbV9zdG9wX3R4X2FuZF9zd2l0Y2hfY2hhbm5lbAorICAgXGJyaWVmICBTdG9wcyB0aGUgdHJhbnNtaXNzaW9uIGlmIGNoYW5uZWwgc3dpdGNoIG1vZGUgaXMgc2lsZW50IGFuZAorICAgICAgICBzdGFydHMgdGhlIGNoYW5uZWwgc3dpdGNoIHRpbWVyLgorCisgICBccGFyYW0gIHBNYWMKKyAgIFxyZXR1cm4gTk9ORQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1fc3RvcF90eF9hbmRfc3dpdGNoX2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJTZXNzaW9uICVkIG5vdCBhY3RpdmUiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJDaGFubmVsIHN3aXRjaCBNb2RlID09ICVkIiksCisJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hNb2RlKTsKKwkgICAgICAgKQorCisJaWYgKHBzZXNzaW9uRW50cnktPmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaE1vZGUgPT0KKwkgICAgZVNJUl9DSEFOU1dfTU9ERV9TSUxFTlQKKwkgICAgfHwgcHNlc3Npb25FbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQgPD0KKwkgICAgU0lSX0NIQU5TV19UWF9TVE9QX01BWF9DT1VOVCkgeworCQkvKiBGcmVlemUgdGhlIHRyYW5zbWlzc2lvbiAqLworCQlsaW1fZnJhbWVfdHJhbnNtaXNzaW9uX2NvbnRyb2wocE1hYywgZUxJTV9UWF9BTEwsIGVMSU1fU1RPUF9UWCk7CisKKwl9IGVsc2UgeworCQkvKiBSZXN1bWUgdGhlIHRyYW5zbWlzc2lvbiAqLworCQlsaW1fZnJhbWVfdHJhbnNtaXNzaW9uX2NvbnRyb2wocE1hYywgZUxJTV9UWF9BTEwsIGVMSU1fUkVTVU1FX1RYKTsKKwl9CisKKwlwTWFjLT5saW0ubGltVGltZXJzLmdMaW1DaGFubmVsU3dpdGNoVGltZXIuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworCS8qIGNoYW5nZSB0aGUgY2hhbm5lbCBpbW1lZGlhdGx5IG9ubHkgaWYKKwkgKiB0aGUgY2hhbm5lbCBzd2l0Y2ggY291bnQgaXMgMAorCSAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hDb3VudCA9PSAwKSB7CisJCWxpbV9wcm9jZXNzX2NoYW5uZWxfc3dpdGNoX3RpbWVvdXQocE1hYyk7CisJCXJldHVybjsKKwl9CisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsIHNlc3Npb25JZCwKKwkJICAgICAgIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfVElNRVIpKTsKKworCWlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQ2hhbm5lbFN3aXRjaFRpbWVyKSAhPQorCSAgICBUWF9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoInR4X3RpbWVyX2FjdGl2YXRlIGZhaWxlZCIpKTsKKwl9CisJcmV0dXJuOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiAgICAgbGltX3N0YXJ0X2NoYW5uZWxfc3dpdGNoCisgICBcYnJpZWYgIFN3aXRjaGVzIHRoZSBjaGFubmVsIGlmIHN3aXRjaCBjb3VudCA9PSAwLCBvdGhlcndpc2UKKyAgICAgICAgc3RhcnRzIHRoZSB0aW1lciBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5kIHN0b3BzIEJHIHNjYW4KKyAgICAgICAgYW5kIGhlYXJ0YmVhdCB0aW1lciB0ZW1wb3JvcmlseS4KKworICAgXHBhcmFtICBwTWFjCisgICBccGFyYW0gIHBzZXNzaW9uRW50cnkKKyAgIFxyZXR1cm4gTk9ORQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMgbGltX3N0YXJ0X2NoYW5uZWxfc3dpdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlN0YXJ0aW5nIHRoZSBjaGFubmVsIHN3aXRjaCIpKTspCisKKwkvKklmIGNoYW5uZWwgc3dpdGNoIGlzIGFscmVhZHkgcnVubmluZyBhbmQgaXQgaXMgb24gYSBkaWZmZXJlbnQgc2Vzc2lvbiwganVzdCByZXR1cm4gKi8KKwkvKlRoaXMgbmVlZCB0byBiZSByZW1vdmVkIGZvciBNQ0MgKi8KKwlpZiAoKGxpbV9pc19jaGFuX3N3aXRjaF9ydW5uaW5nKHBNYWMpICYmCisJICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltU3BlY01nbXQuZG90MTFoQ2hhblN3U3RhdGUgIT0KKwkgICAgIGVMSU1fMTFIX0NIQU5TV19SVU5OSU5HKSB8fCBwc2Vzc2lvbkVudHJ5LT5jc2FPZmZsb2FkRW5hYmxlKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIklnbm9yaW5nIGNoYW5uZWwgc3dpdGNoIG9uIHNlc3Npb24gJWQiKSwKKwkJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwl9CisKKwkvKiBEZWFjdGl2YXRlIGFuZCBjaGFuZ2UgcmVjb25maWd1cmUgdGhlIHRpbWVvdXQgdmFsdWUgKi8KKwkvKiBsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKHBNYWMsIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfVElNRVIpOyAqLworCU1UUkFDRShtYWNfdHJhY2UKKwkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEUsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkgICAgICAgZUxJTV9DSEFOTkVMX1NXSVRDSF9USU1FUikpOworCWlmICh0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1DaGFubmVsU3dpdGNoVGltZXIpICE9CisJICAgIGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJ0eF90aW1lcl9kZWFjdGl2YXRlIGZhaWxlZCEiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJaWYgKHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQ2hhbm5lbFN3aXRjaFRpbWVyLAorCQkJICAgIHBzZXNzaW9uRW50cnktPmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaFRpbWVvdXRWYWx1ZSwKKwkJCSAgICAwKSAhPSBUWF9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoInR4X3RpbWVyX2NoYW5nZSBmYWlsZWQgIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCS8qIEZvbGxvdyB0aGUgY2hhbm5lbCBzd2l0Y2gsIGZvcmdldCBhYm91dCB0aGUgcHJldmlvdXMgcXVpZXQuICovCisJLyogSWYgcXVpZXQgaXMgcnVubmluZywgY2hhbmNlIGlzIHRoZXJlIHRvIHJlc3VtZSB0eCBvbiBpdHMgdGltZW91dC4gKi8KKwkvKiBzbyBzdG9wIHRpbWVyIGZvciBhIHNhZmVyIHNpZGUuICovCisJaWYgKHBzZXNzaW9uRW50cnktPmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID09IGVMSU1fUVVJRVRfQkVHSU4pIHsKKwkJTVRSQUNFKG1hY190cmFjZQorCQkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEUsCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGVMSU1fUVVJRVRfVElNRVIpKTsKKwkJaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0VGltZXIpICE9CisJCSAgICBUWF9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJ0eF90aW1lcl9kZWFjdGl2YXRlIGZhaWxlZCIpKTsKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCX0KKwl9IGVsc2UgaWYgKHBzZXNzaW9uRW50cnktPmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID09IGVMSU1fUVVJRVRfUlVOTklORykgeworCQlNVFJBQ0UobWFjX3RyYWNlCisJCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfREVBQ1RJVkFURSwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgZUxJTV9RVUlFVF9CU1NfVElNRVIpKTsKKwkJaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0QnNzVGltZXIpCisJCSAgICAhPSBUWF9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJ0eF90aW1lcl9kZWFjdGl2YXRlIGZhaWxlZCIpKTsKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCX0KKwl9CisJcHNlc3Npb25FbnRyeS0+Z0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPSBlTElNX1FVSUVUX0lOSVQ7CisKKwkvKiBQcmVwYXJlIGZvciAxMWggY2hhbm5lbCBzd2l0Y2ggKi8KKwlsaW1fcHJlcGFyZV9mb3IxMWhfY2hhbm5lbF9zd2l0Y2gocE1hYywgcHNlc3Npb25FbnRyeSk7CisKKwkvKiogRG9udCBhZGQgYW55IG1vcmUgc3RhdGVtZW50cyBoZXJlIGFzIHdlIHBvc3RlZCBmaW5pc2ggc2NhbiByZXF1ZXN0CisJICogdG8gSEFMLCB3YWl0IHRpbGwgd2UgZ2V0IHRoZSByZXNwb25zZQorCSAqLworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKgorICogIF9fbGltX3Byb2Nlc3NfY2hhbm5lbF9zd2l0Y2hfYWN0aW9uX2ZyYW1lKCkgLSB0byBwcm9jZXNzIGNoYW5uZWwgc3dpdGNoCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJ4X3BrdF9pbmZvOiBBIHBvaW50ZXIgdG8gcGFja2V0IGluZm8gc3RydWN0dXJlCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHRvIHByb2Nlc3MgY2hhbm5lbCBzd2l0Y2ggYWN0aW9uIGZyYW1lCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KKworc3RhdGljIHZvaWQgX19saW1fcHJvY2Vzc19jaGFubmVsX3N3aXRjaF9hY3Rpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCSAgdWludDhfdCAqcnhfcGt0X2luZm8sIHRwUEVTZXNzaW9uIHNlc3Npb24pCit7CisJdHBTaXJNYWNNZ210SGRyIG1hY19oZHI7CisJdWludDhfdCAqYm9keV9wdHI7CisJdERvdDExZkNoYW5uZWxTd2l0Y2ggKmNobmxfc3dpdGNoX2ZyYW1lOworCXVpbnQxNl90IGJjbl9wZXJpb2Q7CisJdWludDMyX3QgdmFsLCBmcmFtZV9sZW4sIHN0YXR1czsKKwl0TGltQ2hhbm5lbFN3aXRjaEluZm8gKmNoX3N3aXRjaF9wYXJhbXM7CisJc3RydWN0IHNEb3QxMWZJRVdpZGVyQldDaGFuU3dpdGNoQW5uICp3YndfY2hubHN3aXRjaF9pZSA9IE5VTEw7CisJc3RydWN0IHNMaW1XaWRlckJXQ2hhbm5lbFN3aXRjaCAqbGltX3did19jaG5sc3dpdGNoX2luZm8gPSBOVUxMOworCXN0cnVjdCBzRG90MTFmSUVzZWNfY2hhbl9vZmZzZXRfZWxlICpzZWNfY2hubF9vZmZzZXQgPSBOVUxMOworCisJbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisJYm9keV9wdHIgPSBXTUFfR0VUX1JYX01QRFVfREFUQShyeF9wa3RfaW5mbyk7CisJZnJhbWVfbGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihyeF9wa3RfaW5mbyk7CisKKwlQRUxPRzMobGltX2xvZyhtYWNfY3R4LCBMT0czLAorCQlGTCgiUmVjZWl2ZWQgQ2hhbm5lbCBzd2l0Y2ggYWN0aW9uIGZyYW1lIikpOykKKwlpZiAoIXNlc3Npb24tPmxpbTExaEVuYWJsZSkKKwkJcmV0dXJuOworCisJY2hubF9zd2l0Y2hfZnJhbWUgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKmNobmxfc3dpdGNoX2ZyYW1lKSk7CisJaWYgKE5VTEwgPT0gY2hubF9zd2l0Y2hfZnJhbWUpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiQWxsb2NhdGVNZW1vcnkgZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCisJLyogVW5wYWNrIGNoYW5uZWwgc3dpdGNoIGZyYW1lICovCisJc3RhdHVzID0gZG90MTFmX3VucGFja19jaGFubmVsX3N3aXRjaChtYWNfY3R4LCBib2R5X3B0ciwgZnJhbWVfbGVuLAorCQkJY2hubF9zd2l0Y2hfZnJhbWUpOworCisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHVucGFjayBhbmQgcGFyc2UgKDB4JTA4eCwgJWQgYnl0ZXMpIiksCisJCQlzdGF0dXMsIGZyYW1lX2xlbik7CisJCWNkZl9tZW1fZnJlZShjaG5sX3N3aXRjaF9mcmFtZSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgid2FybmluZzogdW5wYWNrIDExaC1DSEFOU1cgUmVxKDB4JTA4eCwgJWQgYnl0ZXMpIiksCisJCQlzdGF0dXMsIGZyYW1lX2xlbik7CisJfQorCisJaWYgKCEoY2RmX21lbV9jb21wYXJlKCh1aW50OF90ICopICZzZXNzaW9uLT5ic3NJZCwKKwkJCSh1aW50OF90ICopICZtYWNfaGRyLT5zYSwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJSY3ZkIGFjdGlvbiBmcmFtZSBub3QgZnJvbSBvdXIgQlNTLCBkcm9wcGluZy4uLiIpKTsKKwkJY2RmX21lbV9mcmVlKGNobmxfc3dpdGNoX2ZyYW1lKTsKKwkJcmV0dXJuOworCX0KKwkvKiBjb3B5IHRoZSBiZWFjb24gaW50ZXJ2YWwgZnJvbSBzZXNzaW9uICovCisJdmFsID0gc2Vzc2lvbi0+YmVhY29uUGFyYW1zLmJlYWNvbkludGVydmFsOworCWNoX3N3aXRjaF9wYXJhbXMgPSAmc2Vzc2lvbi0+Z0xpbUNoYW5uZWxTd2l0Y2g7CisJYmNuX3BlcmlvZCA9ICh1aW50MTZfdCl2YWw7CisJY2hfc3dpdGNoX3BhcmFtcy0+cHJpbWFyeUNoYW5uZWwgPQorCQljaG5sX3N3aXRjaF9mcmFtZS0+Q2hhblN3aXRjaEFubi5uZXdDaGFubmVsOworCWNoX3N3aXRjaF9wYXJhbXMtPnN3aXRjaENvdW50ID0KKwkJY2hubF9zd2l0Y2hfZnJhbWUtPkNoYW5Td2l0Y2hBbm4uc3dpdGNoQ291bnQ7CisJY2hfc3dpdGNoX3BhcmFtcy0+c3dpdGNoVGltZW91dFZhbHVlID0KKwkJU1lTX01TX1RPX1RJQ0tTKGJjbl9wZXJpb2QpICoKKwkJc2Vzc2lvbi0+Z0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQ7CisJY2hfc3dpdGNoX3BhcmFtcy0+c3dpdGNoTW9kZSA9CisJCWNobmxfc3dpdGNoX2ZyYW1lLT5DaGFuU3dpdGNoQW5uLnN3aXRjaE1vZGU7CisKKwkvKiBPbmx5IHByaW1hcnkgY2hhbm5lbCBzd2l0Y2ggZWxlbWVudCBpcyBwcmVzZW50ICovCisJY2hfc3dpdGNoX3BhcmFtcy0+c3RhdGUgPSBlTElNX0NIQU5ORUxfU1dJVENIX1BSSU1BUllfT05MWTsKKwljaF9zd2l0Y2hfcGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzIwTUhaOworCisJaWYgKGNobmxfc3dpdGNoX2ZyYW1lLT5XaWRlckJXQ2hhblN3aXRjaEFubi5wcmVzZW50CisJCQkmJiBzZXNzaW9uLT52aHRDYXBhYmlsaXR5KSB7CisJCXdid19jaG5sc3dpdGNoX2llID0gJmNobmxfc3dpdGNoX2ZyYW1lLT5XaWRlckJXQ2hhblN3aXRjaEFubjsKKwkJc2Vzc2lvbi0+Z0xpbVdpZGVyQldDaGFubmVsU3dpdGNoLm5ld0NoYW5XaWR0aCA9CisJCQl3YndfY2hubHN3aXRjaF9pZS0+bmV3Q2hhbldpZHRoOworCQlzZXNzaW9uLT5nTGltV2lkZXJCV0NoYW5uZWxTd2l0Y2gubmV3Q2VudGVyQ2hhbkZyZXEwID0KKwkJCXdid19jaG5sc3dpdGNoX2llLT5uZXdDZW50ZXJDaGFuRnJlcTA7CisJCXNlc3Npb24tPmdMaW1XaWRlckJXQ2hhbm5lbFN3aXRjaC5uZXdDZW50ZXJDaGFuRnJlcTEgPQorCQkJd2J3X2Nobmxzd2l0Y2hfaWUtPm5ld0NlbnRlckNoYW5GcmVxMTsKKwl9CisJbGltX2xvZyhtYWNfY3R4LCBMT0czLAorCQlGTCgiUmN2IENobmwgU3d0Y2ggRnJhbWU6IFRpbWVvdXQgaW4gJWQgdGlja3MiKSwKKwkJc2Vzc2lvbi0+Z0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoVGltZW91dFZhbHVlKTsKKwlpZiAoc2Vzc2lvbi0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpIHsKKwkJc2VjX2Nobmxfb2Zmc2V0ID0gJmNobmxfc3dpdGNoX2ZyYW1lLT5zZWNfY2hhbl9vZmZzZXRfZWxlOworCQlpZiAoc2VjX2Nobmxfb2Zmc2V0LT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID09CisJCQkJUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZKSB7CisJCQljaF9zd2l0Y2hfcGFyYW1zLT5zdGF0ZSA9CisJCQkJZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX0FORF9TRUNPTkRBUlk7CisJCQljaF9zd2l0Y2hfcGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzQwTUhaOworCQkJY2hfc3dpdGNoX3BhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMCA9CisJCQkJY2hfc3dpdGNoX3BhcmFtcy0+cHJpbWFyeUNoYW5uZWwgKyAyOworCQl9IGVsc2UgaWYgKHNlY19jaG5sX29mZnNldC0+c2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9PQorCQkJCVBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlkpIHsKKwkJCWNoX3N3aXRjaF9wYXJhbXMtPnN0YXRlID0KKwkJCQllTElNX0NIQU5ORUxfU1dJVENIX1BSSU1BUllfQU5EX1NFQ09OREFSWTsKKwkJCWNoX3N3aXRjaF9wYXJhbXMtPmNoX3dpZHRoID0gQ0hfV0lEVEhfNDBNSFo7CisJCQljaF9zd2l0Y2hfcGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQljaF9zd2l0Y2hfcGFyYW1zLT5wcmltYXJ5Q2hhbm5lbCAtIDI7CisKKwkJfQorCQlpZiAoc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eSAmJgorCQkJY2hubF9zd2l0Y2hfZnJhbWUtPldpZGVyQldDaGFuU3dpdGNoQW5uLnByZXNlbnQpIHsKKwkJCXdid19jaG5sc3dpdGNoX2llID0KKwkJCQkmY2hubF9zd2l0Y2hfZnJhbWUtPldpZGVyQldDaGFuU3dpdGNoQW5uOworCQkJY2hfc3dpdGNoX3BhcmFtcy0+Y2hfd2lkdGggPQorCQkJCXdid19jaG5sc3dpdGNoX2llLT5uZXdDaGFuV2lkdGggKyAxOworCQkJbGltX3did19jaG5sc3dpdGNoX2luZm8gPQorCQkJCSZzZXNzaW9uLT5nTGltV2lkZXJCV0NoYW5uZWxTd2l0Y2g7CisJCQljaF9zd2l0Y2hfcGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQlsaW1fd2J3X2Nobmxzd2l0Y2hfaW5mby0+bmV3Q2VudGVyQ2hhbkZyZXEwOworCQkJY2hfc3dpdGNoX3BhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMSA9CisJCQkJbGltX3did19jaG5sc3dpdGNoX2luZm8tPm5ld0NlbnRlckNoYW5GcmVxMTsKKworCQl9CisJfQorCisJaWYgKENIX1dJRFRIXzIwTUhaID09IGNoX3N3aXRjaF9wYXJhbXMtPmNoX3dpZHRoKSB7CisJCXNlc3Npb24tPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCVdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRTsKKwkJc2Vzc2lvbi0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPQorCQkJc2Vzc2lvbi0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJfQorCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBsaW1fc3RhcnRfY2hhbm5lbF9zd2l0Y2gobWFjX2N0eCwgc2Vzc2lvbikpCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJDb3VsZCBub3Qgc3RhcnQgY2hhbm5lbCBzd2l0Y2giKSk7CisKKwljZGZfbWVtX2ZyZWUoY2hubF9zd2l0Y2hfZnJhbWUpOworCXJldHVybjsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisvKioKKyAqIF9fbGltX3Byb2Nlc3Nfb3BlcmF0aW5nX21vZGVfYWN0aW9uX2ZyYW1lKCkgLSBUbyBwcm9jZXNzIG9wIG1vZGUgZnJhbWVzCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBtYWMgY29udGV4dAorICogQHJ4X3BrdF9pbmZvOiBwb2ludGVyIHRvIHJlY2VpdmVkIHBhY2tldCBpbmZvCisgKiBAc2Vzc2lvbjogcG9pbnRlciB0byBzZXNzaW9uCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBwcm9jZXNzIG9wZXJhdGluZyBtb2RlIGFjdGlvbiBmcmFtZXMKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgX19saW1fcHJvY2Vzc19vcGVyYXRpbmdfbW9kZV9hY3Rpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCXVpbnQ4X3QgKnJ4X3BrdF9pbmZvLCB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCisJdHBTaXJNYWNNZ210SGRyIG1hY19oZHI7CisJdWludDhfdCAqYm9keV9wdHI7CisJdERvdDExZk9wZXJhdGluZ01vZGUgKm9wZXJhdGluZ19tb2RlX2ZybTsKKwl1aW50MzJfdCBmcmFtZV9sZW47CisJdWludDMyX3Qgc3RhdHVzOworCXRwRHBoSGFzaE5vZGUgc3RhX3B0cjsKKwl1aW50MTZfdCBhaWQ7CisJdWludDhfdCBvcGVyX21vZGU7CisJdWludDhfdCBjYl9tb2RlOworCisJbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisJYm9keV9wdHIgPSBXTUFfR0VUX1JYX01QRFVfREFUQShyeF9wa3RfaW5mbyk7CisJZnJhbWVfbGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihyeF9wa3RfaW5mbyk7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJSZWNlaXZlZCBPcGVyYXRpbmcgTW9kZSBhY3Rpb24gZnJhbWUiKSk7CisJaWYgKFJGX0NIQU5fMTQgPj0gc2Vzc2lvbi0+Y3VycmVudE9wZXJDaGFubmVsKQorCQljYl9tb2RlID0gbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGUyNEdIejsKKwllbHNlCisJCWNiX21vZGUgPSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmNoYW5uZWxCb25kaW5nTW9kZTVHSHo7CisJLyogRG8gbm90IHVwZGF0ZSB0aGUgY2hhbm5lbCBib25kaW5nIG1vZGUgaWYgY2hhbm5lbCBib25kaW5nCisJICogbW9kZSBpcyBkaXNhYmxlZCBpbiBJTkkuCisJICovCisJaWYgKFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRSA9PSBjYl9tb2RlKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywgRkwoImNoYW5uZWwgYm9uZGluZyBkaXNhYmxlZCIpKTsKKwkJcmV0dXJuOworCX0KKwlvcGVyYXRpbmdfbW9kZV9mcm0gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKm9wZXJhdGluZ19tb2RlX2ZybSkpOworCWlmIChOVUxMID09IG9wZXJhdGluZ19tb2RlX2ZybSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQiKSk7CisJCXJldHVybjsKKwl9CisJLyogVW5wYWNrIGNoYW5uZWwgc3dpdGNoIGZyYW1lICovCisJc3RhdHVzID0gZG90MTFmX3VucGFja19vcGVyYXRpbmdfbW9kZShtYWNfY3R4LCBib2R5X3B0ciwgZnJhbWVfbGVuLAorCQkJb3BlcmF0aW5nX21vZGVfZnJtKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gdW5wYWNrIGFuZCBwYXJzZSAoMHglMDh4LCAlZCBieXRlcykiKSwKKwkJCXN0YXR1cywgZnJhbWVfbGVuKTsKKwkJY2RmX21lbV9mcmVlKG9wZXJhdGluZ19tb2RlX2ZybSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgid2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nICgweCUwOHgsICVkIGJ5dGVzKToiKSwKKwkJCXN0YXR1cywgZnJhbWVfbGVuKTsKKwl9CisJc3RhX3B0ciA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShtYWNfY3R4LCBtYWNfaGRyLT5zYSwgJmFpZCwKKwkJCSZzZXNzaW9uLT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAoc3RhX3B0ci0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpIHsKKwkJaWYgKFdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfODBNSFogPAorCQkJCXN0YV9wdHItPnZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkKKwkJCW9wZXJfbW9kZSA9IGVIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWjsKKwkJZWxzZQorCQkJb3Blcl9tb2RlID0gc3RhX3B0ci0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ICsgMTsKKwl9IGVsc2UgeworCQlvcGVyX21vZGUgPSBlSFRfQ0hBTk5FTF9XSURUSF8yME1IWjsKKwl9CisJaWYgKG9wZXJfbW9kZSAhPSBvcGVyYXRpbmdfbW9kZV9mcm0tPk9wZXJhdGluZ01vZGUuY2hhbldpZHRoKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCIgcmVjZWl2ZWQgQ2hhbndpZHRoICVkLCBzdGFJZHggPSAlZCIpLAorCQkJKG9wZXJhdGluZ19tb2RlX2ZybS0+T3BlcmF0aW5nTW9kZS5jaGFuV2lkdGgpLAorCQkJc3RhX3B0ci0+c3RhSW5kZXgpOworCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCIgTUFDIC0gJTB4OiUweDolMHg6JTB4OiUweDolMHgiKSwKKwkJCW1hY19oZHItPnNhWzBdLCBtYWNfaGRyLT5zYVsxXSwgbWFjX2hkci0+c2FbMl0sCisJCQltYWNfaGRyLT5zYVszXSwgbWFjX2hkci0+c2FbNF0sIG1hY19oZHItPnNhWzVdKTsKKworCQlpZiAob3BlcmF0aW5nX21vZGVfZnJtLT5PcGVyYXRpbmdNb2RlLmNoYW5XaWR0aCA9PQorCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWikgeworCQkJc3RhX3B0ci0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWjsKKwkJCXN0YV9wdHItPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQllSFRfQ0hBTk5FTF9XSURUSF80ME1IWjsKKwkJfSBlbHNlIGlmIChvcGVyYXRpbmdfbW9kZV9mcm0tPk9wZXJhdGluZ01vZGUuY2hhbldpZHRoID09CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfODBNSFopIHsKKwkJCXN0YV9wdHItPnZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkJV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF84ME1IWjsKKwkJCXN0YV9wdHItPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQllSFRfQ0hBTk5FTF9XSURUSF80ME1IWjsKKwkJfSBlbHNlIGlmIChvcGVyYXRpbmdfbW9kZV9mcm0tPk9wZXJhdGluZ01vZGUuY2hhbldpZHRoID09CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFopIHsKKwkJCXN0YV9wdHItPnZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkJV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF8yMF80ME1IWjsKKwkJCXN0YV9wdHItPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQllSFRfQ0hBTk5FTF9XSURUSF80ME1IWjsKKwkJfSBlbHNlIGlmIChvcGVyYXRpbmdfbW9kZV9mcm0tPk9wZXJhdGluZ01vZGUuY2hhbldpZHRoID09CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFopIHsKKwkJCXN0YV9wdHItPnZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkJV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF8yMF80ME1IWjsKKwkJCXN0YV9wdHItPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQllSFRfQ0hBTk5FTF9XSURUSF8yME1IWjsKKwkJfQorCQlsaW1fY2hlY2tfdmh0X29wX21vZGVfY2hhbmdlKG1hY19jdHgsIHNlc3Npb24sCisJCQlvcGVyYXRpbmdfbW9kZV9mcm0tPk9wZXJhdGluZ01vZGUuY2hhbldpZHRoLAorCQkJc3RhX3B0ci0+c3RhSW5kZXgsIG1hY19oZHItPnNhKTsKKwl9CisKKwlpZiAoc3RhX3B0ci0+dmh0U3VwcG9ydGVkUnhOc3MgIT0KKwkJCShvcGVyYXRpbmdfbW9kZV9mcm0tPk9wZXJhdGluZ01vZGUucnhOU1MgKyAxKSkgeworCQlzdGFfcHRyLT52aHRTdXBwb3J0ZWRSeE5zcyA9CisJCQlvcGVyYXRpbmdfbW9kZV9mcm0tPk9wZXJhdGluZ01vZGUucnhOU1MgKyAxOworCQlsaW1fc2V0X25zc19jaGFuZ2UobWFjX2N0eCwgc2Vzc2lvbiwgc3RhX3B0ci0+dmh0U3VwcG9ydGVkUnhOc3MsCisJCQlzdGFfcHRyLT5zdGFJbmRleCwgbWFjX2hkci0+c2EpOworCX0KKwljZGZfbWVtX2ZyZWUob3BlcmF0aW5nX21vZGVfZnJtKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogX19saW1fcHJvY2Vzc19naWRfbWFuYWdlbWVudF9hY3Rpb25fZnJhbWUoKSAtIFRvIHByb2Nlc3MgZ3JvdXAtaWQgbWdtdCBmcmFtZXMKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKiBAcnhfcGt0X2luZm86IFJ4IHBhY2tldCBpbmZvCisgKiBAc2Vzc2lvbjogcG9pbnRlciB0byBzZXNzaW9uCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHRvIHByb2Nlc3MgZ3JvdXAgaWQgbWFuYWdlbWVudCBmcmFtZXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgX19saW1fcHJvY2Vzc19naWRfbWFuYWdlbWVudF9hY3Rpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCXVpbnQ4X3QgKnJ4X3BrdF9pbmZvLCB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCisJdWludDhfdCAqYm9keV9wdHI7CisJdWludDE2X3QgYWlkOworCXVpbnQzMl90IGZyYW1lX2xlbiwgc3RhdHVzLCBtZW1iZXJzaGlwID0gMCwgdXNyX3Bvc2l0aW9uID0gMDsKKwl1aW50MzJfdCAqbWVtX2xvd2VyLCAqbWVtX3VwcGVyLCAqbWVtX2N1cjsKKwl0cFNpck1hY01nbXRIZHIgbWFjX2hkcjsKKwl0RG90MTFmVkhUR2lkTWFuYWdlbWVudEFjdGlvbkZyYW1lICpnaWRfbWdtdF9mcmFtZTsKKwl0cERwaEhhc2hOb2RlIHN0YV9wdHI7CisJc3RydWN0IHNEb3QxMWZGZlZodE1lbWJlcnNoaXBTdGF0dXNBcnJheSAqdmh0X21lbWJlcl9zdGF0dXMgPSBOVUxMOworCXN0cnVjdCBzRG90MTFmRmZWaHRVc2VyUG9zaXRpb25BcnJheSAqdmh0X3VzZXJfcG9zaXRpb24gPSBOVUxMOworCisJbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisJYm9keV9wdHIgPSBXTUFfR0VUX1JYX01QRFVfREFUQShyeF9wa3RfaW5mbyk7CisJZnJhbWVfbGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihyeF9wa3RfaW5mbyk7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzMsIEZMKCJSZWNlaXZlZCBHSUQgTWFuYWdlbWVudCBhY3Rpb24gZnJhbWUiKSk7CisJZ2lkX21nbXRfZnJhbWUgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKmdpZF9tZ210X2ZyYW1lKSk7CisJaWYgKE5VTEwgPT0gZ2lkX21nbXRfZnJhbWUpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiQWxsb2NhdGVNZW1vcnkgZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCisJLyogVW5wYWNrIEdpZCBNYW5nZW1lbnQgQWN0aW9uIGZyYW1lICovCisJc3RhdHVzID0gZG90MTFmX3VucGFja192aHRfZ2lkX21hbmFnZW1lbnRfYWN0aW9uX2ZyYW1lKG1hY19jdHgsCisJCQlib2R5X3B0ciwgZnJhbWVfbGVuLCBnaWRfbWdtdF9mcmFtZSk7CisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiRmFpbCB0byBwYXJzZSBhbiBHcnAgaWQgZnJhbWUgKDB4JTA4eCwgJWQgYnl0ZXMpOiIpLAorCQkJc3RhdHVzLCBmcmFtZV9sZW4pOworCQljZGZfbWVtX2ZyZWUoZ2lkX21nbXRfZnJhbWUpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkgRkwoIndhcm5pbmdzIHdoaWxlIHVucGFja2luZyBHcnAgaWQgZnJtICgweCUwOHgsICVkIGJ5dGVzKToiKSwKKwkJIHN0YXR1cywgZnJhbWVfbGVuKTsKKwl9CisJc3RhX3B0ciA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShtYWNfY3R4LCBtYWNfaGRyLT5zYSwgJmFpZCwKKwkJCSZzZXNzaW9uLT5kcGguZHBoSGFzaFRhYmxlKTsKKwlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCUZMKCJyZWNlaXZlZCBHaWQgTWFuYWdlbWVudCBBY3Rpb24gRnJhbWUgLCBzdGFJZHggPSAlZCIpLAorCQlzdGFfcHRyLT5zdGFJbmRleCk7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCUZMKCIgTUFDIC0gJTB4OiUweDolMHg6JTB4OiUweDolMHgiKSwKKwkJbWFjX2hkci0+c2FbMF0sIG1hY19oZHItPnNhWzFdLCBtYWNfaGRyLT5zYVsyXSwKKwkJbWFjX2hkci0+c2FbM10sIG1hY19oZHItPnNhWzRdLCBtYWNfaGRyLT5zYVs1XSk7CisJdmh0X21lbWJlcl9zdGF0dXMgPSAmZ2lkX21nbXRfZnJhbWUtPlZodE1lbWJlcnNoaXBTdGF0dXNBcnJheTsKKwltZW1fbG93ZXIgPSAgKHVpbnQzMl90ICopIHZodF9tZW1iZXJfc3RhdHVzLT5tZW1iZXJzaGlwU3RhdHVzQXJyYXk7CisJbWVtX3VwcGVyID0gKHVpbnQzMl90ICopICZ2aHRfbWVtYmVyX3N0YXR1cy0+bWVtYmVyc2hpcFN0YXR1c0FycmF5WzRdOworCisJaWYgKCptZW1fbG93ZXIgJiYgKm1lbV91cHBlcikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgicmN2ZWQgZnJhbWUgd2l0aCBtdWx0IGdyb3VwIElEIHNldCwgc3RhSWR4ID0gJWQiKSwKKwkJCXN0YV9wdHItPnN0YUluZGV4KTsKKwkJZ290byBvdXQ7CisJfQorCWlmICgqbWVtX2xvd2VyKSB7CisJCW1lbV9jdXIgPSBtZW1fbG93ZXI7CisJfSBlbHNlIGlmICgqbWVtX3VwcGVyKSB7CisJCW1lbV9jdXIgPSBtZW1fdXBwZXI7CisJCW1lbWJlcnNoaXAgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwl9IGVsc2UgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgicmN2ZWQgR2lkIGZyYW1lIHdpdGggbm8gZ3JvdXAgSUQgc2V0LCBzdGFJZHggPSAlZCIpLAorCQkJc3RhX3B0ci0+c3RhSW5kZXgpOworCQlnb3RvIG91dDsKKwl9CisJd2hpbGUgKCEoKm1lbV9jdXIgJiAxKSkgeworCQkqbWVtX2N1ciA+Pj0gMTsKKwkJKyttZW1iZXJzaGlwOworCX0KKwlpZiAoKm1lbV9jdXIpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInJjdmVkIGZyYW1lIHdpdGggbXVsdCBncm91cCBJRCBzZXQsIHN0YUlkeCA9ICVkIiksCisJCQlzdGFfcHRyLT5zdGFJbmRleCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qSnVzdCByZWFkIHRoZSBsYXN0IHR3byBiaXRzICovCisJdmh0X3VzZXJfcG9zaXRpb24gPSAmZ2lkX21nbXRfZnJhbWUtPlZodFVzZXJQb3NpdGlvbkFycmF5OworCXVzcl9wb3NpdGlvbiA9IHZodF91c2VyX3Bvc2l0aW9uLT51c2VyUG9zaXRpb25BcnJheVttZW1iZXJzaGlwXSAmIDB4MzsKKwlsaW1fY2hlY2tfbWVtYmVyc2hpcF91c2VyX3Bvc2l0aW9uKG1hY19jdHgsIHNlc3Npb24sIG1lbWJlcnNoaXAsCisJCQl1c3JfcG9zaXRpb24sIHN0YV9wdHItPnN0YUluZGV4KTsKK291dDoKKwljZGZfbWVtX2ZyZWUoZ2lkX21nbXRfZnJhbWUpOworCXJldHVybjsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitfX2xpbV9wcm9jZXNzX2FkZF90c19yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcFJ4UGFja2V0SW5mbywKKwkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworfQorCisvKioKKyAqIF9fbGltX3Byb2Nlc3NfYWRkX3RzX3JzcCgpIC0gVG8gcHJvY2VzcyBhZGQgdHMgcmVzcG9uc2UgZnJhbWUKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKiBAcnhfcGt0X2luZm86IFJlY2VpdmVkIHBhY2tldCBpbmZvCisgKiBAc2Vzc2lvbjogcG9pbnRlciB0byBzZXNzaW9uCisgKgorICogVGhpcyByb3V0aW5lIGlzIHRvIGhhbmRsZSBhZGQgdHMgcmVzcG9uc2UgZnJhbWUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgX19saW1fcHJvY2Vzc19hZGRfdHNfcnNwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQ4X3QgKnJ4X3BrdF9pbmZvLCB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXRTaXJBZGR0c1JzcEluZm8gYWRkdHM7CisJdFNpclJldFN0YXR1cyByZXR2YWw7CisJdHBTaXJNYWNNZ210SGRyIG1hY19oZHI7CisJdHBEcGhIYXNoTm9kZSBzdGFfcHRyOworCXVpbnQxNl90IGFpZDsKKwl1aW50MzJfdCBmcmFtZUxlbjsKKwl1aW50OF90ICpib2R5X3B0cjsKKwl0cExpbVRzcGVjSW5mbyB0c3BlY19pbmZvOworCXVpbnQ4X3QgYWM7CisJdHBEcGhIYXNoTm9kZSBzdGFfZHNfcHRyID0gTlVMTDsKKwl1aW50OF90IHJzcF9yZXFkID0gMTsKKwl1aW50MzJfdCBjZmdfbGVuOworCXRTaXJNYWNBZGRyIHBlZXJfbWFjYWRkcjsKKworCW1hY19oZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocnhfcGt0X2luZm8pOworCWJvZHlfcHRyID0gV01BX0dFVF9SWF9NUERVX0RBVEEocnhfcGt0X2luZm8pOworCWZyYW1lTGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihyeF9wa3RfaW5mbyk7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPR1csICJSZWN2IEFkZFRzIFJlc3BvbnNlIik7CisJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb24pIHx8CisJICAgIExJTV9JU19CVF9BTVBfQVBfUk9MRShzZXNzaW9uKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiQWRkVHNSc3AgcmVjdmQgYXQgQVA6IGlnbm9yaW5nIikpOworCQlyZXR1cm47CisJfQorCisJc3RhX3B0ciA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShtYWNfY3R4LCBtYWNfaGRyLT5zYSwgJmFpZCwKKwkJCQkmc2Vzc2lvbi0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKHN0YV9wdHIgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiU3RhdGlvbiBjb250ZXh0IG5vdCBmb3VuZCAtIGlnbm9yaW5nIEFkZFRzUnNwIikpOworCQlyZXR1cm47CisJfQorCisJcmV0dmFsID0gc2lyX2NvbnZlcnRfYWRkdHNfcnNwMl9zdHJ1Y3QobWFjX2N0eCwgYm9keV9wdHIsCisJCQlmcmFtZUxlbiwgJmFkZHRzKTsKKwlpZiAocmV0dmFsICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiQWRkVHNSc3AgcGFyc2luZyBmYWlsZWQgKGVycm9yICVkKSIpLCByZXR2YWwpOworCQlyZXR1cm47CisJfQorCS8qCisJICogZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3IgcW9zL3dtZSBjYXBhYmlsaXRpZXMgc2luY2Ugd2Ugd291bGRuJ3QgaGF2ZQorCSAqIHRoaXMgZmxhZyBzZXQgb3RoZXJ3aXNlCisJICovCisJaWYgKCFtYWNfY3R4LT5saW0uZ0xpbUFkZHRzU2VudCkgeworCQkvKiB3ZSBuZXZlciBzZW50IGFuIGFkZHRzIHJlcXVlc3QhICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJyeCBBZGRUc1JzcCBidXQgbm8gcmVxIHdhcyBldmVyIHNlbnQtaWdub3JpbmciKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobWFjX2N0eC0+bGltLmdMaW1BZGR0c1JlcS5yZXEuZGlhbG9nVG9rZW4gIT0gYWRkdHMuZGlhbG9nVG9rZW4pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoInRva2VuIG1pc21hdGNoIChnb3QgJWQsIGV4cCAlZCkgLSBpZ25vcmluZyIpLAorCQkJYWRkdHMuZGlhbG9nVG9rZW4sCisJCQltYWNfY3R4LT5saW0uZ0xpbUFkZHRzUmVxLnJlcS5kaWFsb2dUb2tlbik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIGZvciBzdWNjZXNzZnVsIGFkZHRzIHJlcG9uc2UsIHRyeSB0byBhZGQgdGhlIGNsYXNzaWZpZXIuCisJICogaWYgdGhpcyBmYWlscyBmb3IgYW55IHJlYXNvbiwgd2Ugc2hvdWxkIHNlbmQgYSBkZWx0cyByZXF1ZXN0IHRvIHRoZQorCSAqIGFwIGZvciBub3csIGl0cyBvayBub3QgdG8gc2VuZCBhIGRlbHRzIHNpbmNlIHdlIGFyZSBnb2luZyB0byBhZGQKKwkgKiBzdXBwb3J0IGZvciBtdWx0aXBsZSB0Y2xhcyBzb29uIGFuZCB1bnRpbCB0aGVuIHdlIHdvbid0IHNlbmQgYW55CisJICogYWRkdHMgcmVxdWVzdHMgd2l0aCBtdWx0aXBsZSB0Y2xhcyBlbGVtZW50cyBhbnl3YXkuCisJICogSW4gY2FzZSBvZiBhZGRDbGFzc2lmaWVyIGZhaWx1cmUsIHdlIGp1c3QgbGV0IHRoZSBhZGR0cyB0aW1lciBydW4gb3V0CisJICovCisJaWYgKCgoYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID09CisJCVNJUl9NQUNfQUNDRVNTUE9MSUNZX0hDQ0EpIHx8CisJCShhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy5hY2Nlc3NQb2xpY3kgPT0KKwkJCVNJUl9NQUNfQUNDRVNTUE9MSUNZX0JPVEgpKSAmJgorCQkoYWRkdHMuc3RhdHVzID09IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTKSkgeworCQkvKiBhZGQgdGhlIGNsYXNzaWZpZXIgLSB0aGlzIHNob3VsZCBhbHdheXMgc3VjY2VlZCAqLworCQlpZiAoYWRkdHMubnVtVGNsYXMgPiAxKSB7CisJCQkvKiBjdXJyZW50bHkgbm8gc3VwcG9ydCBmb3IgbXVsdGlwbGUgdGNsYXMgZWxlbWVudHMgKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiU3RhICVkOiBUb28gbWFueSBUY2xhcyAoJWQpLCAxIHN1cHBvcnRlZCIpLAorCQkJCWFpZCwgYWRkdHMubnVtVGNsYXMpOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKGFkZHRzLm51bVRjbGFzID09IDEpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiUmVzcG9uc2UgZnJvbSBTVEEgJWQ6IHRzaWQgJWQsIFVQICVkLCBPSyEiKSwKKwkJCQlhaWQsIGFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnRzaWQsCisJCQkJYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW8pOworCQl9CisJfQorCWxpbV9sb2cobWFjX2N0eCwgTE9HVywgRkwoIlJlY3YgQWRkVHNSc3A6IHRzaWQgJWQsIFVQICVkLCBzdGF0dXMgJWQgIiksCisJCWFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnRzaWQsCisJCWFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvLCBhZGR0cy5zdGF0dXMpOworCisJLyogZGVhY3RpdmF0ZSB0aGUgcmVzcG9uc2UgdGltZXIgKi8KKwlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKG1hY19jdHgsIGVMSU1fQUREVFNfUlNQX1RJTUVSKTsKKworCWlmIChhZGR0cy5zdGF0dXMgIT0gZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIlJlY3YgQWRkVHNSc3A6IHRzaWQgJWQsIFVQICVkLCBzdGF0dXMgJWQgIiksCisJCQlhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy50c2lkLAorCQkJYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW8sIGFkZHRzLnN0YXR1cyk7CisJCWxpbV9zZW5kX3NtZV9hZGR0c19yc3AobWFjX2N0eCwgdHJ1ZSwgYWRkdHMuc3RhdHVzLCBzZXNzaW9uLAorCQkJCSAgICAgICBhZGR0cy50c3BlYywgc2Vzc2lvbi0+c21lU2Vzc2lvbklkLAorCQkJCSAgICAgICBzZXNzaW9uLT50cmFuc2FjdGlvbklkKTsKKworCQkvKiBjbGVhciB0aGUgYWRkdHMgZmxhZyAqLworCQltYWNfY3R4LT5saW0uZ0xpbUFkZHRzU2VudCA9IGZhbHNlOworCisJCXJldHVybjsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCWlmIChhZGR0cy50c21QcmVzZW50KSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywgIlRTTSBJRSBQcmVzZW50Iik7CisJCXNlc3Npb24tPmVzZUNvbnRleHQudHNtLnRpZCA9CisJCQlhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbzsKKwkJY2RmX21lbV9jb3B5KCZzZXNzaW9uLT5lc2VDb250ZXh0LnRzbS50c21JbmZvLAorCQkJICAgICAmYWRkdHMudHNtSUUsIHNpemVvZih0U2lyTWFjRVNFVFNNSUUpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAorCQlsaW1fc2VuZF9zbWVfdHNtX2llX2luZChtYWNfY3R4LCBzZXNzaW9uLCBhZGR0cy50c21JRS50c2lkLAorCQkJCQlhZGR0cy50c21JRS5zdGF0ZSwKKwkJCQkJYWRkdHMudHNtSUUubXNtdF9pbnRlcnZhbCk7CisjZWxzZQorCQlsaW1BY3RpdmF0ZVRTTVN0YXRzVGltZXIobWFjX2N0eCwgc2Vzc2lvbik7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKwl9CisjZW5kaWYKKwkvKgorCSAqIFNpbmNlIEFkZFRTIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsLCBjaGVjayBmb3IgdGhlIFBTQiBmbGFnCisJICogYW5kIGRpcmVjdGlvbmFsIGZsYWcgaW5zaWRlIHRoZSBUUyBJbmZvIGZpZWxkLgorCSAqIEFuIEFDIGlzIHRyaWdnZXIgZW5hYmxlZCBBQyBpZiB0aGUgUFNCIHN1YmZpZWxkIGlzIHNldCB0byAxCisJICogaW4gdGhlIHVwbGluayBkaXJlY3Rpb24uCisJICogQW4gQUMgaXMgZGVsaXZlcnkgZW5hYmxlZCBBQyBpZiB0aGUgUFNCIHN1YmZpZWxkIGlzIHNldCB0byAxCisJICogaW4gdGhlIGRvd25saW5rIGRpcmVjdGlvbi4KKwkgKiBBbiBBQyBpcyB0cmlnZ2VyIGFuZCBkZWxpdmVyeSBlbmFibGVkIEFDIGlmIHRoZSBQU0Igc3ViZmllbGQKKwkgKiBpcyBzZXQgdG8gMSBpbiB0aGUgYmktZGlyZWN0aW9uIGZpZWxkLgorCSAqLworCWlmIChhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy5wc2IgPT0gMSkKKwkJbGltX3NldF90c3BlY191YXBzZF9tYXNrX3Blcl9zZXNzaW9uKG1hY19jdHgsIHNlc3Npb24sCisJCQkJCQkgICAgICZhZGR0cy50c3BlYy50c2luZm8sCisJCQkJCQkgICAgIFNFVF9VQVBTRF9NQVNLKTsKKwllbHNlCisJCWxpbV9zZXRfdHNwZWNfdWFwc2RfbWFza19wZXJfc2Vzc2lvbihtYWNfY3R4LCBzZXNzaW9uLAorCQkJCQkJICAgICAmYWRkdHMudHNwZWMudHNpbmZvLAorCQkJCQkJICAgICBDTEVBUl9VQVBTRF9NQVNLKTsKKworCS8qCisJICogQUREVFMgc3VjY2Vzcywgc28gQUMgaXMgbm93IGFkbWl0dGVkLiBXZSBzaGFsbCBub3cgdXNlIHRoZSBkZWZhdWx0CisJICogRURDQSBwYXJhbWV0ZXJzIGFzIGFkdmVydGlzZWQgYnkgQVAgYW5kIHNlbmQgdGhlIHVwZGF0ZWQgRURDQSBwYXJhbXMKKwkgKiB0byBIQUwuCisJICovCisJYWMgPSB1cFRvQWMoYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW8pOworCWlmIChhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24gPT0KKwkgICAgU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LKSB7CisJCXNlc3Npb24tPmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9VUExJTktdIHw9CisJCQkoMSA8PCBhYyk7CisJfSBlbHNlIGlmIChhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24gPT0KKwkJICAgU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LKSB7CisJCXNlc3Npb24tPmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9ETkxJTktdIHw9CisJCQkoMSA8PCBhYyk7CisJfSBlbHNlIGlmIChhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24gPT0KKwkJICAgU0lSX01BQ19ESVJFQ1RJT05fQklESVIpIHsKKwkJc2Vzc2lvbi0+Z0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX1VQTElOS10gfD0KKwkJCSgxIDw8IGFjKTsKKwkJc2Vzc2lvbi0+Z0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX0ROTElOS10gfD0KKwkJCSgxIDw8IGFjKTsKKwl9CisJbGltX3NldF9hY3RpdmVfZWRjYV9wYXJhbXMobWFjX2N0eCwgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXMsCisJCQkJICAgc2Vzc2lvbik7CisJc3RhX2RzX3B0ciA9IGRwaF9nZXRfaGFzaF9lbnRyeShtYWNfY3R4LCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCQkgICAmc2Vzc2lvbi0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKHN0YV9kc19wdHIgIT0gTlVMTCkKKwkJbGltX3NlbmRfZWRjYV9wYXJhbXMobWFjX2N0eCwgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNBY3RpdmUsCisJCQkJICAgICBzdGFfZHNfcHRyLT5ic3NJZCk7CisJZWxzZQorCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJTZWxmIGVudHJ5IG1pc3NpbmcgaW4gSGFzaCBUYWJsZSAiKSk7CisJc2lyX2NvcHlfbWFjX2FkZHIocGVlcl9tYWNhZGRyLCBzZXNzaW9uLT5ic3NJZCk7CisJLyogaWYgc2NoZWR1bGUgaXMgbm90IHByZXNlbnQgdGhlbiBhZGQgVFNQRUMgd2l0aCBzdmNJbnRlcnZhbCBhcyAwLiAqLworCWlmICghYWRkdHMuc2NoZWR1bGVQcmVzZW50KQorCQlhZGR0cy5zY2hlZHVsZS5zdmNJbnRlcnZhbCA9IDA7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPQorCSAgICBsaW1fdHNwZWNfYWRkKG1hY19jdHgsIHN0YV9wdHItPnN0YUFkZHIsIHN0YV9wdHItPmFzc29jSWQsCisJCSZhZGR0cy50c3BlYywgYWRkdHMuc2NoZWR1bGUuc3ZjSW50ZXJ2YWwsICZ0c3BlY19pbmZvKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiQWRkaW5nIGVudHJ5IGluIGxpbSBUc3BlYyBUYWJsZSBmYWlsZWQgIikpOworCQlsaW1fc2VuZF9kZWx0c19yZXFfYWN0aW9uX2ZyYW1lKG1hY19jdHgsIHBlZXJfbWFjYWRkciwgcnNwX3JlcWQsCisJCQkJCQkmYWRkdHMudHNwZWMudHNpbmZvLAorCQkJCQkJJmFkZHRzLnRzcGVjLCBzZXNzaW9uKTsKKwkJbWFjX2N0eC0+bGltLmdMaW1BZGR0c1NlbnQgPSBmYWxzZTsKKwkJcmV0dXJuOworCQkvKgorCQkgKiBFcnJvciBoYW5kbGluZy4gc2VuZCB0aGUgcmVzcG9uc2Ugd2l0aCBlcnJvciBzdGF0dXMuCisJCSAqIG5lZWQgdG8gc2VuZCBEZWxUUyB0byB0ZWFyIGRvd24gdGhlIFRTUEVDIHN0YXR1cy4KKwkJICovCisJfQorCWlmICgoYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ICE9CisJCQlTSVJfTUFDX0FDQ0VTU1BPTElDWV9FRENBKSB8fAorCQkoKHVwVG9BYyhhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbykgPCBNQVhfTlVNX0FDKSkpIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCXJldHZhbCA9IGxpbV9zZW5kX2hhbF9tc2dfYWRkX3RzKG1hY19jdHgsCisJCQkJc3RhX3B0ci0+c3RhSW5kZXgsIHRzcGVjX2luZm8tPmlkeCwKKwkJCQlhZGR0cy50c3BlYywgc2Vzc2lvbi0+cGVTZXNzaW9uSWQsCisJCQkJYWRkdHMudHNtSUUubXNtdF9pbnRlcnZhbCk7CisjZWxzZQorCQlyZXR2YWwgPSBsaW1fc2VuZF9oYWxfbXNnX2FkZF90cyhtYWNfY3R4LAorCQkJCXN0YV9wdHItPnN0YUluZGV4LCB0c3BlY19pbmZvLT5pZHgsCisJCQkJYWRkdHMudHNwZWMsIHNlc3Npb24tPnBlU2Vzc2lvbklkKTsKKyNlbmRpZgorCQlpZiAoZVNJUl9TVUNDRVNTICE9IHJldHZhbCkgeworCQkJbGltX2FkbWl0X2NvbnRyb2xfZGVsZXRlX3RzKG1hY19jdHgsIHN0YV9wdHItPmFzc29jSWQsCisJCQkJJmFkZHRzLnRzcGVjLnRzaW5mbywgTlVMTCwgJnRzcGVjX2luZm8tPmlkeCk7CisKKwkJCS8qIFNlbmQgREVMVFMgYWN0aW9uIGZyYW1lIHRvIEFQICovCisJCQljZmdfbGVuID0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKwkJCWxpbV9zZW5kX2RlbHRzX3JlcV9hY3Rpb25fZnJhbWUobWFjX2N0eCwgcGVlcl9tYWNhZGRyLAorCQkJCQlyc3BfcmVxZCwgJmFkZHRzLnRzcGVjLnRzaW5mbywKKwkJCQkJJmFkZHRzLnRzcGVjLCBzZXNzaW9uKTsKKwkJCWxpbV9zZW5kX3NtZV9hZGR0c19yc3AobWFjX2N0eCwgdHJ1ZSwgcmV0dmFsLAorCQkJCQlzZXNzaW9uLCBhZGR0cy50c3BlYywKKwkJCQkJc2Vzc2lvbi0+c21lU2Vzc2lvbklkLAorCQkJCQlzZXNzaW9uLT50cmFuc2FjdGlvbklkKTsKKwkJCW1hY19jdHgtPmxpbS5nTGltQWRkdHNTZW50ID0gZmFsc2U7CisJCQlyZXR1cm47CisJCX0KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIkFkZFRzUnNwIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseShVUCAlZCwgVFNJRCAlZCkiKSwKKwkJCWFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvLAorCQkJYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZCk7CisJfSBlbHNlIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIkFkZFRzUnNwIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseShVUCAlZCwgVFNJRCAlZCkiKSwKKwkJCWFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvLAorCQkJYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZCk7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJubyBBQ006IEJ5cGFzcyBzZW5kaW5nIFdNQV9BRERfVFNfUkVRIHRvIEhBTCAiKSk7CisJCS8qCisJCSAqIFVzZSB0aGUgc21lc2Vzc2lvbklkIGFuZCBzbWV0cmFuc2FjdGlvbklkIGZyb20gdGhlIFBFCisJCSAqIHNlc3Npb24gY29udGV4dAorCQkgKi8KKwkJbGltX3NlbmRfc21lX2FkZHRzX3JzcChtYWNfY3R4LCB0cnVlLCBlU0lSX1NNRV9TVUNDRVNTLAorCQkJc2Vzc2lvbiwgYWRkdHMudHNwZWMsIHNlc3Npb24tPnNtZVNlc3Npb25JZCwKKwkJCXNlc3Npb24tPnRyYW5zYWN0aW9uSWQpOworCX0KKwkvKiBjbGVhciB0aGUgYWRkdHMgZmxhZyAqLworCW1hY19jdHgtPmxpbS5nTGltQWRkdHNTZW50ID0gZmFsc2U7CisJcmV0dXJuOworfQorCisvKioKKyAqIF9fbGltX3Byb2Nlc3NfZGVsX3RzX3JlcSgpIC0gVG8gcHJvY2VzcyBkZWwgdHMgcmVzcG9uc2UgZnJhbWUKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKiBAcnhfcGt0X2luZm86IFJlY2VpdmVkIHBhY2tldCBpbmZvCisgKiBAc2Vzc2lvbjogcG9pbnRlciB0byBzZXNzaW9uCisgKgorICogVGhpcyByb3V0aW5lIGlzIHRvIGhhbmRsZSBkZWwgdHMgcmVxdWVzdCBmcmFtZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX2RlbF90c19yZXEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDhfdCAqcnhfcGt0X2luZm8sIHRwUEVTZXNzaW9uIHNlc3Npb24pCit7CisJdFNpclJldFN0YXR1cyByZXR2YWw7CisJdFNpckRlbHRzUmVxSW5mbyBkZWx0czsKKwl0cFNpck1hY01nbXRIZHIgbWFjX2hkcjsKKwl0cERwaEhhc2hOb2RlIHN0YV9wdHI7CisJdWludDMyX3QgZnJhbWVfbGVuOworCXVpbnQxNl90IGFpZDsKKwl1aW50OF90ICpib2R5X3B0cjsKKwl1aW50OF90IHRzX3N0YXR1czsKKwl0U2lyTWFjVFNJbmZvICp0c2luZm87CisJdWludDhfdCB0c3BlY19pZHg7CisJdWludDhfdCBhYzsKKwl0cERwaEhhc2hOb2RlIHN0YV9kc19wdHIgPSBOVUxMOworCisJbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisJYm9keV9wdHIgPSBXTUFfR0VUX1JYX01QRFVfREFUQShyeF9wa3RfaW5mbyk7CisJZnJhbWVfbGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihyeF9wa3RfaW5mbyk7CisKKwlzdGFfcHRyID0gZHBoX2xvb2t1cF9oYXNoX2VudHJ5KG1hY19jdHgsIG1hY19oZHItPnNhLCAmYWlkLAorCQkJCSAgICAgICZzZXNzaW9uLT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAoc3RhX3B0ciA9PSBOVUxMKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJTdGF0aW9uIGNvbnRleHQgbm90IGZvdW5kIC0gaWdub3JpbmcgRGVsVHMiKSk7CisJCXJldHVybjsKKwl9CisJLyogcGFyc2UgdGhlIGRlbHRzIHJlcXVlc3QgKi8KKwlyZXR2YWwgPSBzaXJfY29udmVydF9kZWx0c19yZXEyX3N0cnVjdChtYWNfY3R4LCBib2R5X3B0ciwKKwkJCWZyYW1lX2xlbiwgJmRlbHRzKTsKKwlpZiAocmV0dmFsICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiRGVsVHMgcGFyc2luZyBmYWlsZWQgKGVycm9yICVkKSIpLCByZXR2YWwpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRlbHRzLndtZVRzcGVjUHJlc2VudCkgeworCQlpZiAoKCFzZXNzaW9uLT5saW1XbWVFbmFibGVkKSB8fCAoIXN0YV9wdHItPndtZUVuYWJsZWQpKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoIklnbm9yZSBkZWx0cyByZXE6IHdtZSBub3QgZW5hYmxlZCIpKTsKKwkJCXJldHVybjsKKwkJfQorCQlsaW1fbG9nKG1hY19jdHgsIExPRzIsIEZMKCJXTUUgRGVsdHMgcmVjZWl2ZWQiKSk7CisJfSBlbHNlIGlmICgoc2Vzc2lvbi0+bGltUW9zRW5hYmxlZCkgJiYgc3RhX3B0ci0+bGxlRW5hYmxlZCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzIsIEZMKCIxMWUgUW9TIERlbHRzIHJlY2VpdmVkIikpOworCX0gZWxzZSBpZiAoKHNlc3Npb24tPmxpbVdzbUVuYWJsZWQpICYmIHN0YV9wdHItPndzbUVuYWJsZWQpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cyLCBGTCgiV1NNIERlbHRzIHJlY2VpdmVkIikpOworCX0gZWxzZSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJJZ25vcmluZyBkZWx0cyByZXF1ZXN0OiBxb3Mgbm90IGVuYWJsZWQvY2FwYWJsZSIpKTsKKwkJcmV0dXJuOworCX0KKworCXRzaW5mbyA9IGRlbHRzLndtZVRzcGVjUHJlc2VudCA/ICZkZWx0cy50c3BlYy50c2luZm8gOiAmZGVsdHMudHNpbmZvOworCisJLyogaWYgbm8gQWRtaXQgQ29udHJvbCwgaWdub3JlIHRoZSByZXF1ZXN0ICovCisJaWYgKCh0c2luZm8tPnRyYWZmaWMuYWNjZXNzUG9saWN5ID09IFNJUl9NQUNfQUNDRVNTUE9MSUNZX0VEQ0EpKSB7CisKKwkJaWYgKHVwVG9BYyh0c2luZm8tPnRyYWZmaWMudXNlclByaW8pID49IE1BWF9OVU1fQUMpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiRGVsVHMgd2l0aCBVUCAlZCBoYXMgbm8gQUMgLSBpZ25vcmluZyByZXEiKSwKKwkJCQl0c2luZm8tPnRyYWZmaWMudXNlclByaW8pOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKCFMSU1fSVNfQVBfUk9MRShzZXNzaW9uKSAmJgorCSAgICAhTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb24pKQorCQlsaW1fc2VuZF9zbWVfZGVsdHNfaW5kKG1hY19jdHgsICZkZWx0cywgYWlkLCBzZXNzaW9uKTsKKworCS8qIHRyeSB0byBkZWxldGUgdGhlIFRTICovCisJaWYgKGVTSVJfU1VDQ0VTUyAhPQorCSAgICBsaW1fYWRtaXRfY29udHJvbF9kZWxldGVfdHMobWFjX2N0eCwgc3RhX3B0ci0+YXNzb2NJZCwgdHNpbmZvLAorCQkJCSZ0c19zdGF0dXMsICZ0c3BlY19pZHgpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywgRkwoIlVuYWJsZSB0byBEZWxldGUgVFMiKSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKCEoKHRzaW5mby0+dHJhZmZpYy5hY2Nlc3NQb2xpY3kgPT0gU0lSX01BQ19BQ0NFU1NQT0xJQ1lfSENDQSkKKwkJCXx8ICh0c2luZm8tPnRyYWZmaWMuYWNjZXNzUG9saWN5ID09CisJCQkJCVNJUl9NQUNfQUNDRVNTUE9MSUNZX0JPVEgpKSl7CisJCS8qIHNlbmQgbWVzc2FnZSB0byBIQUwgdG8gZGVsZXRlIFRTICovCisJCWlmIChlU0lSX1NVQ0NFU1MgIT0gbGltX3NlbmRfaGFsX21zZ19kZWxfdHMobWFjX2N0eCwKKwkJCQkJCXN0YV9wdHItPnN0YUluZGV4LCB0c3BlY19pZHgsCisJCQkJCQlkZWx0cywgc2Vzc2lvbi0+cGVTZXNzaW9uSWQsCisJCQkJCQlzZXNzaW9uLT5ic3NJZCkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiRGVsVHMgd2l0aCBVUCAlZCBmYWlsZWQgaWdub3JpbmcgcmVxdWVzdCIpLAorCQkJCXRzaW5mby0+dHJhZmZpYy51c2VyUHJpbyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJLyoKKwkgKiBXZSBzdWNjZXNzZnVsbHkgZGVsZXRlZCB0aGUgVFNQRUMuIFVwZGF0ZSB0aGUgZHluYW1pYyBVQVBTRCBNYXNrLgorCSAqIFRoZSBBQyBmb3IgdGhpcyBUU1BFQyBpcyBubyBsb25nZXIgdHJpZ2dlciBlbmFibGVkIGlmIHRoaXMgVHNwZWMKKwkgKiB3YXMgc2V0LXVwIGluIHVwbGluayBkaXJlY3Rpb24gb25seS4KKwkgKiBUaGUgQUMgZm9yIHRoaXMgVFNQRUMgaXMgbm8gbG9uZ2VyIGRlbGl2ZXJ5IGVuYWJsZWQgaWYgdGhpcyBUc3BlYworCSAqIHdhcyBzZXQtdXAgaW4gZG93bmxpbmsgZGlyZWN0aW9uIG9ubHkuCisJICogVGhlIEFDIGZvciB0aGlzIFRTUEVDIGlzIG5vIGxvbmdlciB0cmlpZ2VyIGVuYWJsZWQgYW5kIGRlbGl2ZXJ5CisJICogZW5hYmxlZCBpZiB0aGlzIFRzcGVjIHdhcyBhIGJpZGlyZWN0aW9uYWwgVFNQRUMuCisJICovCisJbGltX3NldF90c3BlY191YXBzZF9tYXNrX3Blcl9zZXNzaW9uKG1hY19jdHgsIHNlc3Npb24sCisJCQkJCSAgICAgdHNpbmZvLCBDTEVBUl9VQVBTRF9NQVNLKTsKKwkvKgorCSAqIFdlJ3JlIGRlbGV0aW5nIHRoZSBUU1BFQy4KKwkgKiBUaGUgQUMgZm9yIHRoaXMgVFNQRUMgaXMgbm8gbG9uZ2VyIGFkbWl0dGVkIGluIHVwbGluay9kb3dubGluaworCSAqIGRpcmVjdGlvbiBpZiB0aGlzIFRTUEVDIHdhcyBzZXQtdXAgaW4gdXBsaW5rL2Rvd25saW5rIGRpcmVjdGlvbiBvbmx5LgorCSAqIFRoZSBBQyBmb3IgdGhpcyBUU1BFQyBpcyBubyBsb25nZXIgYWRtaXR0ZWQgaW4gYm90aCB1cGxpbmsgYW5kCisJICogZG93bmxpbmsgZGlyZWN0aW9ucyBpZiB0aGlzIFRTUEVDIHdhcyBhIGJpLWRpcmVjdGlvbmFsIFRTUEVDLgorCSAqIElmIEFDTSBpcyBzZXQgZm9yIHRoaXMgQUMgYW5kIHRoaXMgQUMgaXMgYWRtaXR0ZWQgb25seSBpbiBkb3dubGluaworCSAqIGRpcmVjdGlvbiwgUEUgbmVlZHMgdG8gZG93bmdyYWRlIHRoZSBFRENBIHBhcmFtZXRlcgorCSAqIChmb3IgdGhlIEFDIGZvciB3aGljaCBUUyBpcyBiZWluZyBkZWxldGVkKSB0byB0aGUKKwkgKiBuZXh0IGJlc3QgQUMgZm9yIHdoaWNoIEFDTSBpcyBub3QgZW5hYmxlZCwgYW5kIHNlbmQgdGhlCisJICogdXBkYXRlZCB2YWx1ZXMgdG8gSEFMLgorCSAqLworCWFjID0gdXBUb0FjKHRzaW5mby0+dHJhZmZpYy51c2VyUHJpbyk7CisJaWYgKHRzaW5mby0+dHJhZmZpYy5kaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LKSB7CisJCXNlc3Npb24tPmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9VUExJTktdICY9CisJCQl+KDEgPDwgYWMpOworCX0gZWxzZSBpZiAodHNpbmZvLT50cmFmZmljLmRpcmVjdGlvbiA9PQorCQkgICBTSVJfTUFDX0RJUkVDVElPTl9ETkxJTkspIHsKKwkJc2Vzc2lvbi0+Z0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX0ROTElOS10gJj0KKwkJCX4oMSA8PCBhYyk7CisJfSBlbHNlIGlmICh0c2luZm8tPnRyYWZmaWMuZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX0JJRElSKSB7CisJCXNlc3Npb24tPmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9VUExJTktdICY9CisJCQl+KDEgPDwgYWMpOworCQlzZXNzaW9uLT5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LXSAmPQorCQkJfigxIDw8IGFjKTsKKwl9CisJbGltX3NldF9hY3RpdmVfZWRjYV9wYXJhbXMobWFjX2N0eCwgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXMsCisJCQkJICAgc2Vzc2lvbik7CisJc3RhX2RzX3B0ciA9IGRwaF9nZXRfaGFzaF9lbnRyeShtYWNfY3R4LCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCQkgICAmc2Vzc2lvbi0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKHN0YV9kc19wdHIgIT0gTlVMTCkKKwkJbGltX3NlbmRfZWRjYV9wYXJhbXMobWFjX2N0eCwgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNBY3RpdmUsCisJCQkJICAgICBzdGFfZHNfcHRyLT5ic3NJZCk7CisJZWxzZQorCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJTZWxmIGVudHJ5IG1pc3NpbmcgaW4gSGFzaCBUYWJsZSAiKSk7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJEZWxldGVUUyBzdWNjZWVkZWQiKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECisJbGltX3NlbmRfc21lX3RzbV9pZV9pbmQobWFjX2N0eCwgc2Vzc2lvbiwgMCwgMCwgMCk7CisjZWxzZQorCWxpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfdGltZXIobWFjX2N0eCwgZUxJTV9UU01fVElNRVIpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisjZW5kaWYKK30KKworLyoqCisgKiBfX2xpbV9wcm9jZXNzX3Fvc19tYXBfY29uZmlndXJlX2ZyYW1lKCkgLSB0byBwcm9jZXNzIFFvUyBtYXAgY29uZmlndXJlIGZyYW1lCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBtYWMgY29udGV4dAorICogQHJ4X3BrdF9pbmZvOiBwb2ludGVyIHRvIHJlY2VpdmVkIHBhY2tldCBpbmZvCisgKiBAc2Vzc2lvbjogcG9pbnRlciB0byBzZXNzaW9uCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgY2FsbGVkIHRvIHByb2Nlc3MgcW9zIG1hcCBjb25maWd1cmUgZnJhbWUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgX19saW1fcHJvY2Vzc19xb3NfbWFwX2NvbmZpZ3VyZV9mcmFtZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJdWludDhfdCAqcnhfcGt0X2luZm8sIHRwUEVTZXNzaW9uIHNlc3Npb24pCit7CisJdHBTaXJNYWNNZ210SGRyIG1hY19oZHI7CisJdWludDMyX3QgZnJhbWVfbGVuOworCXVpbnQ4X3QgKmJvZHlfcHRyOworCXRTaXJSZXRTdGF0dXMgcmV0dmFsOworCW1hY19oZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocnhfcGt0X2luZm8pOworCWJvZHlfcHRyID0gV01BX0dFVF9SWF9NUERVX0RBVEEocnhfcGt0X2luZm8pOworCWZyYW1lX2xlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocnhfcGt0X2luZm8pOworCXJldHZhbCA9IHNpcl9jb252ZXJ0X3Fvc19tYXBfY29uZmlndXJlX2ZyYW1lMl9zdHJ1Y3QobWFjX2N0eCwKKwkJCQlib2R5X3B0ciwgZnJhbWVfbGVuLCAmc2Vzc2lvbi0+UW9zTWFwU2V0KTsKKwlpZiAocmV0dmFsICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiUW9zTWFwQ29uZmlndXJlIGZyYW1lIHBhcnNpbmcgZmFpbChlcnJvciAlZCkiKSwKKwkJCXJldHZhbCk7CisJCXJldHVybjsKKwl9CisJbGltX3NlbmRfc21lX21nbXRfZnJhbWVfaW5kKG1hY19jdHgsIG1hY19oZHItPmZjLnN1YlR5cGUsCisJCQkodWludDhfdCAqKSBtYWNfaGRyLAorCQkJZnJhbWVfbGVuICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwgMCwKKwkJCVdNQV9HRVRfUlhfQ0gocnhfcGt0X2luZm8pLCBzZXNzaW9uLCAwKTsKK30KKworI2lmZGVmIEFOSV9TVVBQT1JUXzExSAorc3RhdGljIHZvaWQKK19fbGltX3Byb2Nlc3NfYmFzaWNfbWVhc19yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgdHBTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUgcE1lYXNSZXFGcmFtZSwKKwkJCSAgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJaWYgKGxpbV9zZW5kX21lYXNfcmVwb3J0X2ZyYW1lKHBNYWMsCisJCQkJICAgICAgIHBNZWFzUmVxRnJhbWUsCisJCQkJICAgICAgIHBlZXJNYWNBZGRyLCBwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisJeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgiZmFpbCB0byBzZW5kIEJhc2ljIE1lYXMgcmVwb3J0ICIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KK30KK3N0YXRpYyB2b2lkCitfX2xpbV9wcm9jZXNzX2NjYV9tZWFzX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgdHBTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUgcE1lYXNSZXFGcmFtZSwKKwkJCSAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCWlmIChsaW1fc2VuZF9tZWFzX3JlcG9ydF9mcmFtZShwTWFjLAorCQkJCSAgICAgICBwTWVhc1JlcUZyYW1lLAorCQkJCSAgICAgICBwZWVyTWFjQWRkciwgcHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKQorCXsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoImZhaWwgdG8gc2VuZCBDQ0EgTWVhcyByZXBvcnQgIikpOykKKwkJcmV0dXJuOworCX0KK30KK3N0YXRpYyB2b2lkCitfX2xpbV9wcm9jZXNzX3JwaV9tZWFzX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgdHBTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUgcE1lYXNSZXFGcmFtZSwKKwkJCSAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCWlmIChsaW1fc2VuZF9tZWFzX3JlcG9ydF9mcmFtZShwTWFjLAorCQkJCSAgICAgICBwTWVhc1JlcUZyYW1lLAorCQkJCSAgICAgICBwZWVyTWFjQWRkciwgcHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKQorCXsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoImZhaWwgdG8gc2VuZCBSUEkgTWVhcyByZXBvcnQgIikpOykKKwkJcmV0dXJuOworCX0KK30KK3N0YXRpYyB2b2lkCitfX2xpbV9wcm9jZXNzX21lYXN1cmVtZW50X3JlcXVlc3RfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJdWludDhfdCAqcFJ4UGFja2V0SW5mbywKKwkJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0cFNpck1hY01nbXRIZHIgcEhkcjsKKwl1aW50OF90ICpwQm9keTsKKwl0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSBwTWVhc1JlcUZyYW1lOworCXVpbnQzMl90IGZyYW1lTGVuOworCisJcEhkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKwlwQm9keSA9IFdNQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pOworCWZyYW1lTGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKTsKKworCXBNZWFzUmVxRnJhbWUgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSkpOworCWlmIChOVUxMID09IHBNZWFzUmVxRnJhbWUpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoImxpbVByb2Nlc3NNZWFzdXJlbWVudFJlcXVlc3RGcmFtZTogQWxsb2NhdGVNZW1vcnkgZmFpbGVkICIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzaXJfY29udmVydF9tZWFzX3JlcV9mcmFtZTJfc3RydWN0KHBNYWMsIHBCb2R5LCBwTWVhc1JlcUZyYW1lLCBmcmFtZUxlbikKKwkgICAgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HVyhsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR1csCisJCQkgICAgICAgRkwoIlJjdiBpbnZhbGlkIE1lYXN1cmVtZW50IFJlcXVlc3QgQWN0aW9uIEZyYW1lICIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKHBNZWFzUmVxRnJhbWUtPm1lYXNSZXFJRS5tZWFzVHlwZSkgeworCWNhc2UgU0lSX01BQ19CQVNJQ19NRUFTVVJFTUVOVF9UWVBFOgorCQlfX2xpbV9wcm9jZXNzX2Jhc2ljX21lYXNfcmVxKHBNYWMsIHBNZWFzUmVxRnJhbWUsIHBIZHItPnNhLAorCQkJCQkgICAgIHBzZXNzaW9uRW50cnkpOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfQ0NBX01FQVNVUkVNRU5UX1RZUEU6CisJCV9fbGltX3Byb2Nlc3NfY2NhX21lYXNfcmVxKHBNYWMsIHBNZWFzUmVxRnJhbWUsIHBIZHItPnNhLAorCQkJCQkgICBwc2Vzc2lvbkVudHJ5KTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JQSV9NRUFTVVJFTUVOVF9UWVBFOgorCQlfX2xpbV9wcm9jZXNzX3JwaV9tZWFzX3JlcShwTWFjLCBwTWVhc1JlcUZyYW1lLCBwSGRyLT5zYSwKKwkJCQkJICAgcHNlc3Npb25FbnRyeSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJVbmtub3duIE1lYXN1cmVtZW50IFR5cGUgJWQgIiksCisJCQkgICAgICAgcE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLm1lYXNUeXBlKTsKKwkJICAgICAgICkKKwkJYnJlYWs7CisJfQorfSAvKioqIGVuZCBsaW1Qcm9jZXNzTWVhc3VyZW1lbnRSZXF1ZXN0RnJhbWUgKioqLworc3RhdGljIHZvaWQKK19fbGltX3Byb2Nlc3NfdHBjX3JlcXVlc3RfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcFJ4UGFja2V0SW5mbywKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXVpbnQ4X3QgKnBCb2R5OworCXRwU2lyTWFjVHBjUmVxQWN0aW9uRnJhbWUgcFRwY1JlcUZyYW1lOworCXVpbnQzMl90IGZyYW1lTGVuOworCXBIZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisJcEJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKwlmcmFtZUxlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbyk7CisJUEVMT0cxKGxpbV9sb2cKKwkJICAgICAgIChwTWFjLCBMT0cxLAorCQkgICAgICAgRkwoIioqKipMSU06IFByb2Nlc3NpbmcgVFBDIFJlcXVlc3QgZnJvbSBwZWVyICoqKioiKSk7CisJICAgICAgICkKKwlwVHBjUmVxRnJhbWUgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpck1hY1RwY1JlcUFjdGlvbkZyYW1lKSk7CisJaWYgKE5VTEwgPT0gcFRwY1JlcUZyYW1lKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgIikpOykKKwkJcmV0dXJuOworCX0KKwlpZiAoc2lyX2NvbnZlcnRfdHBjX3JlcV9mcmFtZTJfc3RydWN0KHBNYWMsIHBCb2R5LCBwVHBjUmVxRnJhbWUsIGZyYW1lTGVuKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywgRkwoIlJjdiBpbnZhbGlkIFRQQyBSZXEgQWN0aW9uIEZyYW1lICIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KKwlpZiAobGltX3NlbmRfdHBjX3JlcG9ydF9mcmFtZShwTWFjLAorCQkJCSAgICAgIHBUcGNSZXFGcmFtZSwKKwkJCQkgICAgICBwSGRyLT5zYSwgcHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJmYWlsIHRvIHNlbmQgVFBDIFJlcG9ydCBGcmFtZS4gIikpOworCQkgICAgICAgKQorCQlyZXR1cm47CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitfX2xpbV9wcm9jZXNzX3NtX3Bvd2VyX3NhdmVfdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sCisJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXREb3QxMWZTTVBvd2VyU2F2ZSBmcm1TTVBvd2VyOworCXRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSBzdGF0ZTsKKwl0cERwaEhhc2hOb2RlIHBTdGE7CisJdWludDE2X3QgYWlkOworCXVpbnQzMl90IGZyYW1lTGVuLCBuU3RhdHVzOworCXVpbnQ4X3QgKnBCb2R5OworCisJcEhkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKwlwQm9keSA9IFdNQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pOworCWZyYW1lTGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKTsKKworCXBTdGEgPQorCQlkcGhfbG9va3VwX2hhc2hfZW50cnkocE1hYywgcEhkci0+c2EsICZhaWQsCisJCQkJICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWlmIChwU3RhID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIlNUQSBjb250ZXh0IG5vdCBmb3VuZCAtIGlnbm9yaW5nIFVwZGF0ZVNNIFBTYXZlIE1vZGUgZnJvbSAiKSk7CisJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisJCXJldHVybjsKKwl9CisKKwkvKipVbnBhY2sgdGhlIHJlY2VpdmVkIGZyYW1lICovCisJblN0YXR1cyA9IGRvdDExZl91bnBhY2tfc21fcG93ZXJfc2F2ZShwTWFjLCBwQm9keSwgZnJhbWVMZW4sICZmcm1TTVBvd2VyKTsKKworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJGYWlsZWQgdG8gdW5wYWNrIGFuZCBwYXJzZSBhIFVwZGF0ZSBTTSBQb3dlciAoMHglMDh4LCAlZCBieXRlcyk6IiksCisJCQluU3RhdHVzLCBmcmFtZUxlbik7CisJCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBCb2R5LCBmcmFtZUxlbik7CisJCSAgICAgICApCisJCXJldHVybjsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGEgU01Qb3dlciBTYXZlIHVwZGF0ZSAoMHglMDh4LCAlZCBieXRlcyk6IiksCisJCQluU3RhdHVzLCBmcmFtZUxlbik7CisJCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBCb2R5LCBmcmFtZUxlbik7CisJCSAgICAgICApCisJfQorCisJbGltX2xvZyhwTWFjLCBMT0dXLAorCQlGTCgiUmVjZWl2ZWQgU00gUG93ZXIgc2F2ZSBNb2RlIHVwZGF0ZSBGcmFtZSB3aXRoIFBTX0VuYWJsZTolZCIKKwkJICAgIlBTIE1vZGU6ICVkIiksIGZybVNNUG93ZXIuU01Qb3dlck1vZGVTZXQuUG93ZXJTYXZlX0VuLAorCQlmcm1TTVBvd2VyLlNNUG93ZXJNb2RlU2V0Lk1vZGUpOworCisJLyoqIFVwZGF0ZSBpbiB0aGUgRFBIIFRhYmxlIGFib3V0IHRoZSBVcGRhdGUgaW4gdGhlIFNNIFBvd2VyIFNhdmUgbW9kZSovCisJaWYgKGZybVNNUG93ZXIuU01Qb3dlck1vZGVTZXQuUG93ZXJTYXZlX0VuCisJICAgICYmIGZybVNNUG93ZXIuU01Qb3dlck1vZGVTZXQuTW9kZSkKKwkJc3RhdGUgPSBlU0lSX0hUX01JTU9fUFNfRFlOQU1JQzsKKwllbHNlIGlmICgoZnJtU01Qb3dlci5TTVBvd2VyTW9kZVNldC5Qb3dlclNhdmVfRW4pCisJCSAmJiAoZnJtU01Qb3dlci5TTVBvd2VyTW9kZVNldC5Nb2RlID09IDApKQorCQlzdGF0ZSA9IGVTSVJfSFRfTUlNT19QU19TVEFUSUM7CisJZWxzZSBpZiAoKGZybVNNUG93ZXIuU01Qb3dlck1vZGVTZXQuUG93ZXJTYXZlX0VuID09IDApCisJCSAmJiAoZnJtU01Qb3dlci5TTVBvd2VyTW9kZVNldC5Nb2RlID09IDApKQorCQlzdGF0ZSA9IGVTSVJfSFRfTUlNT19QU19OT19MSU1JVDsKKwllbHNlIHsKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywKKwkJCSAgICAgICBGTAorCQkJCSAgICAgICAoIlJlY2VpdmVkIFNNIFBvd2VyIHNhdmUgTW9kZSB1cGRhdGUgRnJhbWUgd2l0aCBpbnZhbGlkIG1vZGUiKSk7CisJCSAgICAgICApCisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RhdGUgPT0gcFN0YS0+aHRNSU1PUFNTdGF0ZSkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJUaGUgUEVFUiBpcyBhbHJlYWR5IHNldCBpbiB0aGUgc2FtZSBtb2RlIikpOworCQkgICAgICAgKQorCQlyZXR1cm47CisJfQorCisJLyoqIFVwZGF0ZSBpbiB0aGUgSEFMIFN0YXRpb24gVGFibGUgZm9yIHRoZSBVcGRhdGUgb2YgdGhlIFByb3RlY3Rpb24gTW9kZSAqLworCXBTdGEtPmh0TUlNT1BTU3RhdGUgPSBzdGF0ZTsKKwlsaW1fcG9zdF9zbV9zdGF0ZV91cGRhdGUocE1hYywgcFN0YS0+c3RhSW5kZXgsIHBTdGEtPmh0TUlNT1BTU3RhdGUsCisJCQkJIHBTdGEtPnN0YUFkZHIsIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCk7Cit9CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKworc3RhdGljIHZvaWQKK19fbGltX3Byb2Nlc3NfcmFkaW9fbWVhc3VyZV9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sCisJCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdHBTaXJNYWNNZ210SGRyIHBIZHI7CisJdERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0IGZybTsKKwl1aW50MzJfdCBmcmFtZUxlbiwgblN0YXR1czsKKwl1aW50OF90ICpwQm9keTsKKworCXBIZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisJcEJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKwlmcmFtZUxlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbyk7CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisKKwlsaW1fc2VuZF9zbWVfbWdtdF9mcmFtZV9pbmQocE1hYywgcEhkci0+ZmMuc3ViVHlwZSwgKHVpbnQ4X3QgKilwSGRyLAorCQlmcmFtZUxlbiArIHNpemVvZih0U2lyTWFjTWdtdEhkciksIDAsCisJCVdNQV9HRVRfUlhfQ0gocFJ4UGFja2V0SW5mbyksIHBzZXNzaW9uRW50cnksIDApOworCisJLyoqVW5wYWNrIHRoZSByZWNlaXZlZCBmcmFtZSAqLworCW5TdGF0dXMgPQorCQlkb3QxMWZfdW5wYWNrX3JhZGlvX21lYXN1cmVtZW50X3JlcXVlc3QocE1hYywgcEJvZHksIGZyYW1lTGVuLCAmZnJtKTsKKworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJGYWlsZWQgdG8gdW5wYWNrIGFuZCBwYXJzZSBhIFJhZGlvIE1lYXN1cmUgcmVxdWVzdCAoMHglMDh4LCAlZCBieXRlcyk6IiksCisJCQluU3RhdHVzLCBmcmFtZUxlbik7CisJCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBCb2R5LCBmcmFtZUxlbik7CisJCSAgICAgICApCisJCXJldHVybjsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGEgUmFkaW8gTWVhc3VyZSByZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKToiKSwKKwkJCW5TdGF0dXMsIGZyYW1lTGVuKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEJvZHksIGZyYW1lTGVuKTsKKwkJICAgICAgICkKKwl9CisJLyogQ2FsbCBycm0gZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiAqLworCisJcnJtX3Byb2Nlc3NfcmFkaW9fbWVhc3VyZW1lbnRfcmVxdWVzdChwTWFjLCBwSGRyLT5zYSwgJmZybSwgcHNlc3Npb25FbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2xpbV9wcm9jZXNzX2xpbmtfbWVhc3VyZW1lbnRfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sCisJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0cFNpck1hY01nbXRIZHIgcEhkcjsKKwl0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCBmcm07CisJdWludDMyX3QgZnJhbWVMZW4sIG5TdGF0dXM7CisJdWludDhfdCAqcEJvZHk7CisKKwlwSGRyID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworCXBCb2R5ID0gV01BX0dFVF9SWF9NUERVX0RBVEEocFJ4UGFja2V0SW5mbyk7CisJZnJhbWVMZW4gPSBXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pOworCisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlyZXR1cm47CisJfQorCisJLyoqVW5wYWNrIHRoZSByZWNlaXZlZCBmcmFtZSAqLworCW5TdGF0dXMgPQorCQlkb3QxMWZfdW5wYWNrX2xpbmtfbWVhc3VyZW1lbnRfcmVxdWVzdChwTWFjLCBwQm9keSwgZnJhbWVMZW4sICZmcm0pOworCisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIkZhaWxlZCB0byB1bnBhY2sgYW5kIHBhcnNlIGEgTGluayBNZWFzdXJlIHJlcXVlc3QgKDB4JTA4eCwgJWQgYnl0ZXMpOiIpLAorCQkJblN0YXR1cywgZnJhbWVMZW4pOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwQm9keSwgZnJhbWVMZW4pOworCQkgICAgICAgKQorCQlyZXR1cm47CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMCisJCQkJKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHVucGFja2luZyBhIExpbmsgTWVhc3VyZSByZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKToiKSwKKwkJCW5TdGF0dXMsIGZyYW1lTGVuKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEJvZHksIGZyYW1lTGVuKTsKKwkJICAgICAgICkKKwl9CisJLyogQ2FsbCBycm0gZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiAqLworCisJcnJtX3Byb2Nlc3NfbGlua19tZWFzdXJlbWVudF9yZXF1ZXN0KHBNYWMsIHBSeFBhY2tldEluZm8sICZmcm0sCisJCQkJCSAgICAgcHNlc3Npb25FbnRyeSk7CisKK30KKworc3RhdGljIHZvaWQKK19fbGltX3Byb2Nlc3NfbmVpZ2hib3JfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sCisJCQkgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlICpwRnJtOworCXVpbnQzMl90IGZyYW1lTGVuLCBuU3RhdHVzOworCXVpbnQ4X3QgKnBCb2R5OworCisJcEhkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKwlwQm9keSA9IFdNQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pOworCWZyYW1lTGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKTsKKworCXBGcm0gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2UpKTsKKwlpZiAoTlVMTCA9PSBwRnJtKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGluIF9fbGltX3Byb2Nlc3NfbmVpZ2hib3JfcmVwb3J0IikpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQljZGZfbWVtX2ZyZWUocEZybSk7CisJCXJldHVybjsKKwl9CisKKwkvKipVbnBhY2sgdGhlIHJlY2VpdmVkIGZyYW1lICovCisJblN0YXR1cyA9CisJCWRvdDExZl91bnBhY2tfbmVpZ2hib3JfcmVwb3J0X3Jlc3BvbnNlKHBNYWMsIHBCb2R5LCBmcmFtZUxlbiwgcEZybSk7CisKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkJCSgiRmFpbGVkIHRvIHVucGFjayBhbmQgcGFyc2UgYSBOZWlnaGJvciByZXBvcnQgcmVzcG9uc2UgKDB4JTA4eCwgJWQgYnl0ZXMpOiIpLAorCQkJblN0YXR1cywgZnJhbWVMZW4pOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwQm9keSwgZnJhbWVMZW4pOworCQkgICAgICAgKQorCQljZGZfbWVtX2ZyZWUocEZybSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGEgTmVpZ2hib3IgcmVwb3J0IHJlc3BvbnNlICgweCUwOHgsICVkIGJ5dGVzKToiKSwKKwkJCW5TdGF0dXMsIGZyYW1lTGVuKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEJvZHksIGZyYW1lTGVuKTsKKwkJICAgICAgICkKKwl9CisJLyogQ2FsbCBycm0gZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiAqLworCXJybV9wcm9jZXNzX25laWdoYm9yX3JlcG9ydF9yZXNwb25zZShwTWFjLCBwRnJtLCBwc2Vzc2lvbkVudHJ5KTsKKworCWNkZl9tZW1fZnJlZShwRnJtKTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisvKioKKyAqIGxpbVByb2Nlc3NTQVF1ZXJ5UmVxdWVzdEFjdGlvbkZyYW1lCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX3Byb2Nlc3NfYWN0aW9uX2ZyYW1lKCkgdXBvbgorICogU0EgcXVlcnkgcmVxdWVzdCBBY3Rpb24gZnJhbWUgcmVjZXB0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcFJ4UGFja2V0SW5mbyAtIEhhbmRsZSB0byB0aGUgUnggcGFja2V0IGluZm8KKyAqIEBwYXJhbSAgcHNlc3Npb25FbnRyeSAtIFBFIHNlc3Npb24gZW50cnkKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworc3RhdGljIHZvaWQgX19saW1fcHJvY2Vzc19zYV9xdWVyeV9yZXF1ZXN0X2FjdGlvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJCXVpbnQ4X3QgKnBSeFBhY2tldEluZm8sCisJCQkJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0cFNpck1hY01nbXRIZHIgcEhkcjsKKwl1aW50OF90ICpwQm9keTsKKwl1aW50OF90IHRyYW5zSWRbMl07CisKKwkvKiBQcmltYSAgLS0tIEJlbG93IE1hY3JvIG5vdCBhdmFpbGFibGUgaW4gcHJpbWEKKwkgICBwSGRyID0gU0lSX01BQ19CRF9UT19NUERVSEVBREVSKHBCZCk7CisJICAgcEJvZHkgPSBTSVJfTUFDX0JEX1RPX01QRFVEQVRBKHBCZCk7ICovCisKKwlwSGRyID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworCXBCb2R5ID0gV01BX0dFVF9SWF9NUERVX0RBVEEocFJ4UGFja2V0SW5mbyk7CisKKwkvKiBJZiB0aGlzIGlzIGFuIHVucHJvdGVjdGVkIFNBIFF1ZXJ5IFJlcXVlc3QsIHRoZW4gaWdub3JlIGl0LiAqLworCWlmIChwSGRyLT5mYy53ZXAgPT0gMCkKKwkJcmV0dXJuOworCisJLypFeHRyYWN0IDExdyB0cnNhbnNJZCBmcm9tIFNBIHF1ZXJ5IHJlcXVlc3QgYWN0aW9uIGZyYW1lCisJICAgSW4gU0EgcXVlcnkgcmVzcG9uc2UgYWN0aW9uIGZyYW1lIHdlIHdpbGwgc2VuZCBzYW1lIHRyYW5zSWQKKwkgICBJbiBTQSBxdWVyeSByZXF1ZXN0IGFjdGlvbiBmcmFtZToKKwkgICBDYXRlZ29yeSAgICAgICA6IDEgYnl0ZQorCSAgIEFjdGlvbiAgICAgICAgIDogMSBieXRlCisJICAgVHJhbnNhY3Rpb24gSUQgOiAyIGJ5dGVzICovCisJY2RmX21lbV9jb3B5KCZ0cmFuc0lkWzBdLCAmcEJvZHlbMl0sIDIpOworCisJLyogU2VuZCAxMXcgU0EgcXVlcnkgcmVzcG9uc2UgYWN0aW9uIGZyYW1lICovCisJaWYgKGxpbV9zZW5kX3NhX3F1ZXJ5X3Jlc3BvbnNlX2ZyYW1lKHBNYWMsCisJCQkJCSAgICAgdHJhbnNJZCwKKwkJCQkJICAgICBwSGRyLT5zYSwKKwkJCQkJICAgICBwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTCgiZmFpbCB0byBzZW5kIFNBIHF1ZXJ5IHJlc3BvbnNlIGFjdGlvbiBmcmFtZS4iKSk7CisJCSAgICAgICApCisJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogX19saW1fcHJvY2Vzc19zYV9xdWVyeV9yZXNwb25zZV9hY3Rpb25fZnJhbWUKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19hY3Rpb25fZnJhbWUoKSB1cG9uCisgKiBTQSBxdWVyeSByZXNwb25zZSBBY3Rpb24gZnJhbWUgcmVjZXB0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcFJ4UGFja2V0SW5mbyAtIEhhbmRsZSB0byB0aGUgUnggcGFja2V0IGluZm8KKyAqIEBwYXJhbSAgcHNlc3Npb25FbnRyeSAtIFBFIHNlc3Npb24gZW50cnkKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NhX3F1ZXJ5X3Jlc3BvbnNlX2FjdGlvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJCSB1aW50OF90ICpwUnhQYWNrZXRJbmZvLAorCQkJCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXVpbnQzMl90IGZyYW1lTGVuOworCXVpbnQ4X3QgKnBCb2R5OworCXRwRHBoSGFzaE5vZGUgcFN0YTsKKwl1aW50MTZfdCBhaWQ7CisJdWludDE2X3QgdHJhbnNJZDsKKwl1aW50OF90IHJldHJ5TnVtOworCisJcEhkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKwlmcmFtZUxlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbyk7CisJcEJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgKCJTQSBRdWVyeSBSZXNwb25zZSByZWNlaXZlZC4uLiIpKTsKKworCS8qIFdoZW4gYSBzdGF0aW9uLCBzdXBwbGljYW50IGhhbmRsZXMgU0EgUXVlcnkgUmVzcG9uc2UuCisJICogRm9yd2FyZCB0byBTTUUgdG8gSEREIHRvIHdwYV9zdXBwbGljYW50LgorCSAqLworCWlmIChMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJbGltX3NlbmRfc21lX21nbXRfZnJhbWVfaW5kKHBNYWMsIHBIZHItPmZjLnN1YlR5cGUsICh1aW50OF90ICopIHBIZHIsCisJCQkJCSAgICBmcmFtZUxlbiArIHNpemVvZih0U2lyTWFjTWdtdEhkciksIDAsCisJCQkJCSAgICBXTUFfR0VUX1JYX0NIKHBSeFBhY2tldEluZm8pLAorCQkJCQkgICAgcHNlc3Npb25FbnRyeSwgMCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiB0aGlzIGlzIGFuIHVucHJvdGVjdGVkIFNBIFF1ZXJ5IFJlc3BvbnNlLCB0aGVuIGlnbm9yZSBpdC4gKi8KKwlpZiAocEhkci0+ZmMud2VwID09IDApCisJCXJldHVybjsKKworCXBTdGEgPQorCQlkcGhfbG9va3VwX2hhc2hfZW50cnkocE1hYywgcEhkci0+c2EsICZhaWQsCisJCQkJICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWlmIChOVUxMID09IHBTdGEpCisJCXJldHVybjsKKworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIlNBIFF1ZXJ5IFJlc3BvbnNlIHNvdXJjZSBhZGRyIC0gJTB4OiUweDolMHg6JTB4OiUweDolMHgiKSwKKwkJcEhkci0+c2FbMF0sIHBIZHItPnNhWzFdLCBwSGRyLT5zYVsyXSwgcEhkci0+c2FbM10sCisJCXBIZHItPnNhWzRdLCBwSGRyLT5zYVs1XSk7CisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgiU0EgUXVlcnkgc3RhdGUgZm9yIHN0YXRpb24gLSAlZCIpLCBwU3RhLT5wbWZTYVF1ZXJ5U3RhdGUpOworCisJaWYgKERQSF9TQV9RVUVSWV9JTl9QUk9HUkVTUyAhPSBwU3RhLT5wbWZTYVF1ZXJ5U3RhdGUpCisJCXJldHVybjsKKworCS8qIEV4dHJhY3QgMTF3IHRyc2Fuc0lkIGZyb20gU0EgcXVlcnkgcmVwb25zZSBhY3Rpb24gZnJhbWUKKwkgICBJbiBTQSBxdWVyeSByZXNwb25zZSBhY3Rpb24gZnJhbWU6CisJICAgQ2F0ZWdvcnkgICAgICAgOiAxIGJ5dGUKKwkgICBBY3Rpb24gICAgICAgICA6IDEgYnl0ZQorCSAgIFRyYW5zYWN0aW9uIElEIDogMiBieXRlcyAqLworCWNkZl9tZW1fY29weSgmdHJhbnNJZCwgJnBCb2R5WzJdLCAyKTsKKworCS8qIElmIFNBIFF1ZXJ5IGlzIGluIHByb2dyZXNzIHdpdGggdGhlIHN0YXRpb24gYW5kIHRoZSBzdGF0aW9uCisJICAgcmVzcG9uZHMgdGhlbiB0aGUgYXNzb2NpYXRpb24gcmVxdWVzdCB0aGF0IHRyaWdnZXJlZCB0aGUgU0EKKwkgICBxdWVyeSBpcyBmcm9tIGEgcm9ndWUgc3RhdGlvbiwganVzdCBnbyBiYWNrIHRvIGluaXRpYWwgc3RhdGUuICovCisJZm9yIChyZXRyeU51bSA9IDA7IHJldHJ5TnVtIDw9IHBTdGEtPnBtZlNhUXVlcnlSZXRyeUNvdW50OyByZXRyeU51bSsrKQorCQlpZiAodHJhbnNJZCA9PSBwU3RhLT5wbWZTYVF1ZXJ5U3RhcnRUcmFuc0lkICsgcmV0cnlOdW0pIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCQlGTAorCQkJCQkoIkZvdW5kIG1hdGNoaW5nIFNBIFF1ZXJ5IFJlcXVlc3QgLSB0cmFuc2FjdGlvbiBJRCAlZCIpLAorCQkJCXRyYW5zSWQpOworCQkJdHhfdGltZXJfZGVhY3RpdmF0ZSgmcFN0YS0+cG1mU2FRdWVyeVRpbWVyKTsKKwkJCXBTdGEtPnBtZlNhUXVlcnlTdGF0ZSA9IERQSF9TQV9RVUVSWV9OT1RfSU5fUFJPR1JFU1M7CisJCQlicmVhazsKKwkJfQorfQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisvKioKKyAqIGxpbV9kcm9wX3VucHJvdGVjdGVkX2FjdGlvbl9mcmFtZQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGFuIEFjdGlvbiBmcmFtZSBzaG91bGQgYmUgZHJvcHBlZCBzaW5jZSBpdCBpcworICogYSBSb2J1c3QgTWFuYWdtZW50IEZyYW1lLCBpdCBpcyB1bnByb3RlY3RlZCwgYW5kIGl0IGlzIHJlY2VpdmVkIG9uIGEKKyAqIGNvbm5lY3Rpb24gd2hlcmUgUE1GIGlzIGVuYWJsZWQuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwc2Vzc2lvbkVudHJ5IC0gUEUgc2Vzc2lvbiBlbnRyeQorICogQHBhcmFtICBwSGRyIC0gRnJhbWUgaGVhZGVyCisgKiBAcGFyYW0gIGNhdGVnb3J5IC0gQWN0aW9uIGZyYW1lIGNhdGVnb3J5CisgKiBAcmV0dXJuIHRydWUgaWYgZnJhbWUgc2hvdWxkIGJlIGRyb3BwZWQKKyAqLworCitzdGF0aWMgYm9vbAorbGltX2Ryb3BfdW5wcm90ZWN0ZWRfYWN0aW9uX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkJICB0cFNpck1hY01nbXRIZHIgcEhkciwgdWludDhfdCBjYXRlZ29yeSkKK3sKKwl1aW50MTZfdCBhaWQ7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisJYm9vbCBybWZDb25uZWN0aW9uID0gZmFsc2U7CisKKwlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkgICAgTElNX0lTX0JUX0FNUF9BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCXBTdGFEcyA9CisJCQlkcGhfbG9va3VwX2hhc2hfZW50cnkocE1hYywgcEhkci0+c2EsICZhaWQsCisJCQkJCSAgICAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJaWYgKHBTdGFEcyAhPSBOVUxMKQorCQkJaWYgKHBTdGFEcy0+cm1mRW5hYmxlZCkKKwkJCQlybWZDb25uZWN0aW9uID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKHBzZXNzaW9uRW50cnktPmxpbVJtZkVuYWJsZWQpCisJCXJtZkNvbm5lY3Rpb24gPSB0cnVlOworCisJaWYgKHJtZkNvbm5lY3Rpb24gJiYgKHBIZHItPmZjLndlcCA9PSAwKSkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJEcm9wcGluZyB1bnByb3RlY3RlZCBBY3Rpb24gY2F0ZWdvcnkgJWQgZnJhbWUgIgorCQkJCSAgInNpbmNlIFJNRiBpcyBlbmFibGVkLiIpLCBjYXRlZ29yeSk7CisJCSAgICAgICApCisJCXJldHVybiB0cnVlOworCX0gZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworLyoqCisgKiBsaW1fcHJvY2Vzc19hY3Rpb25fZnJhbWUoKSAtIHRvIHByb2Nlc3MgYWN0aW9uIGZyYW1lcworICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByeF9wa3RfaW5mbzogQSBwb2ludGVyIHRvIHBhY2tldCBpbmZvIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NNZXNzYWdlUXVldWUoKSB1cG9uCisgKiBBY3Rpb24gZnJhbWUgcmVjZXB0aW9uLgorICoKKyAqIFJldHVybjogbm9uZQorICovCisKK3ZvaWQgbGltX3Byb2Nlc3NfYWN0aW9uX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQ4X3QgKnJ4X3BrdF9pbmZvLCB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXVpbnQ4X3QgKmJvZHlfcHRyID0gV01BX0dFVF9SWF9NUERVX0RBVEEocnhfcGt0X2luZm8pOworCXRwU2lyTWFjQWN0aW9uRnJhbWVIZHIgYWN0aW9uX2hkciA9ICh0cFNpck1hY0FjdGlvbkZyYW1lSGRyKSBib2R5X3B0cjsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJdHBTaXJNYWNNZ210SGRyIG1hY19oZHJfMTF3ID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKHJ4X3BrdF9pbmZvKTsKKyNlbmRpZgorCXRwU2lyTWFjTWdtdEhkciBtYWNfaGRyID0gTlVMTDsKKwlpbnQ4X3QgcnNzaTsKKwl1aW50MzJfdCBmcmFtZV9sZW47CisJdHBTaXJNYWNWZW5kb3JTcGVjaWZpY0ZyYW1lSGRyIHZlbmRvcl9zcGVjaWZpYzsKKwl1aW50OF90IG91aVtdID0geyAweDAwLCAweDAwLCAweGYwIH07CisJdHBTaXJNYWNWZW5kb3JTcGVjaWZpY1B1YmxpY0FjdGlvbkZyYW1lSGRyIHB1Yl9hY3Rpb247CisJdWludDhfdCBwMnBfb3VpW10gPSB7IDB4NTAsIDB4NkYsIDB4OUEsIDB4MDkgfTsKKworCWZyYW1lX2xlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocnhfcGt0X2luZm8pOworCisJc3dpdGNoIChhY3Rpb25faGRyLT5jYXRlZ29yeSkgeworCWNhc2UgU0lSX01BQ19BQ1RJT05fUU9TX01HTVQ6CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQlpZiAobGltX2Ryb3BfdW5wcm90ZWN0ZWRfYWN0aW9uX2ZyYW1lKG1hY19jdHgsIHNlc3Npb24sCisJCQkJCW1hY19oZHJfMTF3LCBhY3Rpb25faGRyLT5jYXRlZ29yeSkpCisJCQlicmVhazsKKyNlbmRpZgorCQlpZiAoKHNlc3Npb24tPmxpbVFvc0VuYWJsZWQpIHx8CisJCSAgICAoYWN0aW9uX2hkci0+YWN0aW9uSUQgPT0gU0lSX01BQ19RT1NfTUFQX0NPTkZJR1VSRSkpIHsKKwkJCXN3aXRjaCAoYWN0aW9uX2hkci0+YWN0aW9uSUQpIHsKKwkJCWNhc2UgU0lSX01BQ19RT1NfQUREX1RTX1JFUToKKwkJCQlfX2xpbV9wcm9jZXNzX2FkZF90c19yZXEobWFjX2N0eCwKKwkJCQkJCSh1aW50OF90ICopIHJ4X3BrdF9pbmZvLAorCQkJCQkJc2Vzc2lvbik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0lSX01BQ19RT1NfQUREX1RTX1JTUDoKKwkJCQlfX2xpbV9wcm9jZXNzX2FkZF90c19yc3AobWFjX2N0eCwKKwkJCQkJCSAodWludDhfdCAqKSByeF9wa3RfaW5mbywKKwkJCQkJCSBzZXNzaW9uKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTSVJfTUFDX1FPU19ERUxfVFNfUkVROgorCQkJCV9fbGltX3Byb2Nlc3NfZGVsX3RzX3JlcShtYWNfY3R4LAorCQkJCQkJKHVpbnQ4X3QgKikgcnhfcGt0X2luZm8sCisJCQkJCQlzZXNzaW9uKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTSVJfTUFDX1FPU19NQVBfQ09ORklHVVJFOgorCQkJCV9fbGltX3Byb2Nlc3NfcW9zX21hcF9jb25maWd1cmVfZnJhbWUobWFjX2N0eCwKKwkJCQkJCSh1aW50OF90ICopcnhfcGt0X2luZm8sCisJCQkJCQlzZXNzaW9uKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiUW9zIGFjdGlvbiAlZCBub3QgaGFuZGxlZCIpLAorCQkJCQlhY3Rpb25faGRyLT5hY3Rpb25JRCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lSX01BQ19BQ1RJT05fU1BFQ1RSVU1fTUdNVDoKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJCWlmIChsaW1fZHJvcF91bnByb3RlY3RlZF9hY3Rpb25fZnJhbWUobWFjX2N0eCwgc2Vzc2lvbiwKKwkJCQltYWNfaGRyXzExdywgYWN0aW9uX2hkci0+Y2F0ZWdvcnkpKQorCQkJYnJlYWs7CisjZW5kaWYKKwkJc3dpdGNoIChhY3Rpb25faGRyLT5hY3Rpb25JRCkgeworI2lmZGVmIEFOSV9TVVBQT1JUXzExSAorCQljYXNlIFNJUl9NQUNfQUNUSU9OX01FQVNVUkVfUkVRVUVTVF9JRDoKKwkJCWlmIChzZXNzaW9uLT5saW0xMWhFbmFibGUpCisJCQkJX19saW1fcHJvY2Vzc19tZWFzdXJlbWVudF9yZXF1ZXN0X2ZyYW1lKG1hY19jdHgsCisJCQkJCQkJcnhfcGt0X2luZm8sCisJCQkJCQkJc2Vzc2lvbik7CisJCQlicmVhazsKKwkJY2FzZSBTSVJfTUFDX0FDVElPTl9UUENfUkVRVUVTVF9JRDoKKwkJCWlmICgoTElNX0lTX1NUQV9ST0xFKHNlc3Npb24pIHx8CisJCQkJTElNX0lTX0FQX1JPTEUoc2Vzc2lvbikpICYmCisJCQkJc2Vzc2lvbi0+bGltMTFoRW5hYmxlKQorCQkJCQlfX2xpbV9wcm9jZXNzX3RwY19yZXF1ZXN0X2ZyYW1lKG1hY19jdHgsCisJCQkJCQlyeF9wa3RfaW5mbywgc2Vzc2lvbik7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIFNJUl9NQUNfQUNUSU9OX0NIQU5ORUxfU1dJVENIX0lEOgorCQkJaWYgKExJTV9JU19TVEFfUk9MRShzZXNzaW9uKSkKKwkJCQlfX2xpbV9wcm9jZXNzX2NoYW5uZWxfc3dpdGNoX2FjdGlvbl9mcmFtZSgKKwkJCQkJbWFjX2N0eCwgcnhfcGt0X2luZm8sIHNlc3Npb24pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIlNwZWN0cnVtIG1nbXQgYWN0aW9uIGlkICVkIG5vdCBoYW5kbGVkIiksCisJCQkJYWN0aW9uX2hkci0+YWN0aW9uSUQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNJUl9NQUNfQUNUSU9OX1dNRToKKwkJaWYgKCFzZXNzaW9uLT5saW1XbWVFbmFibGVkKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoIldNRSBtb2RlIGRpc2FibGVkIC0gZHJvcHBpbmcgZnJhbWUgJWQiKSwKKwkJCQlhY3Rpb25faGRyLT5hY3Rpb25JRCk7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKGFjdGlvbl9oZHItPmFjdGlvbklEKSB7CisJCWNhc2UgU0lSX01BQ19RT1NfQUREX1RTX1JFUToKKwkJCV9fbGltX3Byb2Nlc3NfYWRkX3RzX3JlcShtYWNfY3R4LAorCQkJCSh1aW50OF90ICopIHJ4X3BrdF9pbmZvLCBzZXNzaW9uKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSX01BQ19RT1NfQUREX1RTX1JTUDoKKwkJCV9fbGltX3Byb2Nlc3NfYWRkX3RzX3JzcChtYWNfY3R4LAorCQkJCSh1aW50OF90ICopIHJ4X3BrdF9pbmZvLCBzZXNzaW9uKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSX01BQ19RT1NfREVMX1RTX1JFUToKKwkJCV9fbGltX3Byb2Nlc3NfZGVsX3RzX3JlcShtYWNfY3R4LAorCQkJCSh1aW50OF90ICopIHJ4X3BrdF9pbmZvLCBzZXNzaW9uKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSX01BQ19RT1NfTUFQX0NPTkZJR1VSRToKKwkJCV9fbGltX3Byb2Nlc3NfcW9zX21hcF9jb25maWd1cmVfZnJhbWUobWFjX2N0eCwKKwkJCQkodWludDhfdCAqKXJ4X3BrdF9pbmZvLCBzZXNzaW9uKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIldNRSBhY3Rpb24gJWQgbm90IGhhbmRsZWQiKSwKKwkJCQlhY3Rpb25faGRyLT5hY3Rpb25JRCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lSX01BQ19BQ1RJT05fSFQ6CisJCS8qKiBUeXBlIG9mIEhUIEFjdGlvbiB0byBiZSBwZXJmb3JtZWQqLworCQlzd2l0Y2ggKGFjdGlvbl9oZHItPmFjdGlvbklEKSB7CisJCWNhc2UgU0lSX01BQ19TTV9QT1dFUl9TQVZFOgorCQkJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb24pKQorCQkJCV9fbGltX3Byb2Nlc3Nfc21fcG93ZXJfc2F2ZV91cGRhdGUobWFjX2N0eCwKKwkJCQkJCSh1aW50OF90ICopcnhfcGt0X2luZm8sCisJCQkJCQlzZXNzaW9uKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJBY3Rpb24gSUQgJWQgbm90IGhhbmRsZWQgaW4gSFQgY2F0ZWdvcnkiKSwKKwkJCQlhY3Rpb25faGRyLT5hY3Rpb25JRCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lSX01BQ19BQ1RJT05fV05NOgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJaWYgKChzZXNzaW9uLT5saW1SbWZFbmFibGVkKSAmJiAobWFjX2hkcl8xMXctPmZjLndlcCA9PSAwKSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJEcm9wcGluZyB1bnByb3QgYWN0aW9uICVkIGZybSAoUE1GIG9uKSIpLAorCQkJCWFjdGlvbl9oZHItPmNhdGVnb3J5KTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIldOTSBBY3Rpb24gY2F0ZWdvcnkgJWQgYWN0aW9uICVkLiIpLAorCQkJYWN0aW9uX2hkci0+Y2F0ZWdvcnksIGFjdGlvbl9oZHItPmFjdGlvbklEKTsKKwkJc3dpdGNoIChhY3Rpb25faGRyLT5hY3Rpb25JRCkgeworCQljYXNlIFNJUl9NQUNfV05NX0JTU19UTV9RVUVSWToKKwkJY2FzZSBTSVJfTUFDX1dOTV9CU1NfVE1fUkVRVUVTVDoKKwkJY2FzZSBTSVJfTUFDX1dOTV9CU1NfVE1fUkVTUE9OU0U6CisJCWNhc2UgU0lSX01BQ19XTk1fTk9USUZfUkVRVUVTVDoKKwkJY2FzZSBTSVJfTUFDX1dOTV9OT1RJRl9SRVNQT05TRToKKwkJCXJzc2kgPSBXTUFfR0VUX1JYX1JTU0lfREIocnhfcGt0X2luZm8pOworCQkJbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisJCQkvKiBGb3J3YXJkIHRvIHRoZSBTTUUgdG8gSEREIHRvIHdwYV9zdXBwbGljYW50ICovCisJCQlsaW1fc2VuZF9zbWVfbWdtdF9mcmFtZV9pbmQobWFjX2N0eCwKKwkJCQkJbWFjX2hkci0+ZmMuc3ViVHlwZSwKKwkJCQkJKHVpbnQ4X3QgKikgbWFjX2hkciwKKwkJCQkJZnJhbWVfbGVuICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKwkJCQkJc2Vzc2lvbi0+c21lU2Vzc2lvbklkLAorCQkJCQlXTUFfR0VUX1JYX0NIKHJ4X3BrdF9pbmZvKSwKKwkJCQkJc2Vzc2lvbiwgcnNzaSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiQWN0aW9uIElEICVkIG5vdCBoYW5kbGVkIGluIFdOTSBjYXRlZ29yeSIpLAorCQkJCWFjdGlvbl9oZHItPmFjdGlvbklEKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJY2FzZSBTSVJfTUFDX0FDVElPTl9SUk06CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQlpZiAobGltX2Ryb3BfdW5wcm90ZWN0ZWRfYWN0aW9uX2ZyYW1lKG1hY19jdHgsIHNlc3Npb24sCisJCQkJCW1hY19oZHJfMTF3LCBhY3Rpb25faGRyLT5jYXRlZ29yeSkpCisJCQlicmVhazsKKyNlbmRpZgorCQlpZiAobWFjX2N0eC0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGUpIHsKKwkJCXN3aXRjaCAoYWN0aW9uX2hkci0+YWN0aW9uSUQpIHsKKwkJCWNhc2UgU0lSX01BQ19SUk1fUkFESU9fTUVBU1VSRV9SRVE6CisJCQkJX19saW1fcHJvY2Vzc19yYWRpb19tZWFzdXJlX3JlcXVlc3QobWFjX2N0eCwKKwkJCQkJCSh1aW50OF90ICopcnhfcGt0X2luZm8sCisJCQkJCQlzZXNzaW9uKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0lSX01BQ19SUk1fTElOS19NRUFTVVJFTUVOVF9SRVE6CisJCQkJX19saW1fcHJvY2Vzc19saW5rX21lYXN1cmVtZW50X3JlcShtYWNfY3R4LAorCQkJCQkJKHVpbnQ4X3QgKilyeF9wa3RfaW5mbywKKwkJCQkJCXNlc3Npb24pOworCQkJCWJyZWFrOworCQkJY2FzZSBTSVJfTUFDX1JSTV9ORUlHSEJPUl9SUFQ6CisJCQkJX19saW1fcHJvY2Vzc19uZWlnaGJvcl9yZXBvcnQobWFjX2N0eCwKKwkJCQkJCSh1aW50OF90ICopcnhfcGt0X2luZm8sCisJCQkJCQlzZXNzaW9uKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiQWN0aW9uIElEICVkIG5vdCBoYW5kbGVkIGluIFJSTSIpLAorCQkJCQlhY3Rpb25faGRyLT5hY3Rpb25JRCk7CisJCQkJYnJlYWs7CisKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEVsc2Ugd2Ugd2lsbCBqdXN0IGlnbm9yZSB0aGUgUlJNIG1lc3NhZ2VzLiAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJSUk0gZnJtIGlnbm9yZWQsIGl0IGlzIGRpc2FibGVkIGluIGNmZyIpKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IFwKKwkJZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCWNhc2UgU0lSX01BQ19BQ1RJT05fVkVORE9SX1NQRUNJRklDX0NBVEVHT1JZOgorCQl2ZW5kb3Jfc3BlY2lmaWMgPSAodHBTaXJNYWNWZW5kb3JTcGVjaWZpY0ZyYW1lSGRyKSBhY3Rpb25faGRyOworCQltYWNfaGRyID0gTlVMTDsKKwkJZnJhbWVfbGVuID0gMDsKKworCQltYWNfaGRyID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKHJ4X3BrdF9pbmZvKTsKKwkJZnJhbWVfbGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihyeF9wa3RfaW5mbyk7CisKKwkJLyogQ2hlY2sgaWYgaXQgaXMgYSB2ZW5kb3Igc3BlY2lmaWMgYWN0aW9uIGZyYW1lLiAqLworCQlpZiAoTElNX0lTX1NUQV9ST0xFKHNlc3Npb24pICYmCisJCSAgICAodHJ1ZSA9PSBjZGZfbWVtX2NvbXBhcmUoc2Vzc2lvbi0+c2VsZk1hY0FkZHIsCisJCQkJCSZtYWNfaGRyLT5kYVswXSwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpCisJCSAgICAmJiBJU19XRVNfTU9ERV9FTkFCTEVEKG1hY19jdHgpCisJCSAgICAmJiBjZGZfbWVtX2NvbXBhcmUodmVuZG9yX3NwZWNpZmljLT5PdWksIG91aSwgMykpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiUmN2ZCBWZW5kb3Igc3BlY2lmaWMgZnJhbWUsIE9VSSAleCAleCAleCIpLAorCQkJCXZlbmRvcl9zcGVjaWZpYy0+T3VpWzBdLAorCQkJCXZlbmRvcl9zcGVjaWZpYy0+T3VpWzFdLAorCQkJCXZlbmRvcl9zcGVjaWZpYy0+T3VpWzJdKTsKKwkJCS8qCisJCQkgKiBGb3J3YXJkIHRvIHRoZSBTTUUgdG8gSEREIHRvIHdwYV9zdXBwbGljYW50CisJCQkgKiB0eXBlIGlzIEFDVElPTgorCQkJICovCisJCQlsaW1fc2VuZF9zbWVfbWdtdF9mcmFtZV9pbmQobWFjX2N0eCwKKwkJCQkJbWFjX2hkci0+ZmMuc3ViVHlwZSwKKwkJCQkJKHVpbnQ4X3QgKikgbWFjX2hkciwKKwkJCQkJZnJhbWVfbGVuICsKKwkJCQkJc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKwkJCQkJc2Vzc2lvbi0+c21lU2Vzc2lvbklkLAorCQkJCQlXTUFfR0VUX1JYX0NIKHJ4X3BrdF9pbmZvKSwKKwkJCQkJc2Vzc2lvbiwgMCk7CisJCX0gZWxzZSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIkRyb3BwaW5nIHRoZSB2ZW5kb3Igc3BlY2lmaWMgYWN0aW9uIGZyYW1lIgorCQkJCQkiYmVhY2F1c2Ugb2YgKFdFUyBNb2RlIG5vdCBlbmFibGVkICIKKwkJCQkJIihXRVNNT0RFID0gJWQpIG9yIE9VSSBtaXNtYXRjaCAiCisJCQkJCSIoJTAyeCAlMDJ4ICUwMngpIG9yIG5vdCByZWNlaXZlZCB3aXRoIgorCQkJCQkiU2VsZlN0YSBhZGRyZXNzKSBzeXN0ZW0gcm9sZSA9ICVkIiksCisJCQkJSVNfV0VTX01PREVfRU5BQkxFRChtYWNfY3R4KSwKKwkJCQl2ZW5kb3Jfc3BlY2lmaWMtPk91aVswXSwKKwkJCQl2ZW5kb3Jfc3BlY2lmaWMtPk91aVsxXSwKKwkJCQl2ZW5kb3Jfc3BlY2lmaWMtPk91aVsyXSwKKwkJCQlHRVRfTElNX1NZU1RFTV9ST0xFKHNlc3Npb24pKTsKKwkJfQorCWJyZWFrOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSIHx8IEZFQVRVUkVfV0xBTl9FU0UgfHwKKwkJICAgICAgICAgICAgICAgICAgIEZFQVRVUkVfV0xBTl9MRlIgKi8KKwljYXNlIFNJUl9NQUNfQUNUSU9OX1BVQkxJQ19VU0FHRToKKwkJc3dpdGNoIChhY3Rpb25faGRyLT5hY3Rpb25JRCkgeworCQljYXNlIFNJUl9NQUNfQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQzoKKwkJCXB1Yl9hY3Rpb24gPQorCQkJCSh0cFNpck1hY1ZlbmRvclNwZWNpZmljUHVibGljQWN0aW9uRnJhbWVIZHIpCisJCQkJYWN0aW9uX2hkcjsKKwkJCW1hY19oZHIgPSBOVUxMOworCQkJZnJhbWVfbGVuID0gMDsKKworCQkJbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisJCQlmcmFtZV9sZW4gPSBXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHJ4X3BrdF9pbmZvKTsKKwkJCS8qIENoZWNrIGlmIGl0IGlzIGEgUDJQIHB1YmxpYyBhY3Rpb24gZnJhbWUuICovCisJCQlpZiAoY2RmX21lbV9jb21wYXJlKHB1Yl9hY3Rpb24tPk91aSwgcDJwX291aSwgNCkpIHsKKwkJCQkvKgorCQkJCSAqIEZvcndhcmQgdG8gdGhlIFNNRSB0byBIREQgdG8gd3BhX3N1cHBsaWNhbnQKKwkJCQkgKiB0eXBlIGlzIEFDVElPTgorCQkJCSAqLworCQkJCWxpbV9zZW5kX3NtZV9tZ210X2ZyYW1lX2luZChtYWNfY3R4LAorCQkJCQkJbWFjX2hkci0+ZmMuc3ViVHlwZSwKKwkJCQkJCSh1aW50OF90ICopIG1hY19oZHIsCisJCQkJCQlmcmFtZV9sZW4gKworCQkJCQkJc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKwkJCQkJCXNlc3Npb24tPnNtZVNlc3Npb25JZCwKKwkJCQkJCVdNQV9HRVRfUlhfQ0gocnhfcGt0X2luZm8pLAorCQkJCQkJc2Vzc2lvbiwgMCk7CisJCQl9IGVsc2UgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJRkwoIlVuaGFuZGxlZCBwdWJsaWMgYWN0aW9uIGZyYW1lIChWZW5kb3Igc3BlY2lmaWMpLiBPVUkgJXggJXggJXggJXgiKSwKKwkJCQkJcHViX2FjdGlvbi0+T3VpWzBdLCBwdWJfYWN0aW9uLT5PdWlbMV0sCisJCQkJCXB1Yl9hY3Rpb24tPk91aVsyXSwgcHViX2FjdGlvbi0+T3VpWzNdKTsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBTSVJfTUFDX0FDVElPTl8yMDQwX0JTU19DT0VYSVNURU5DRToKKwkJCW1hY19oZHIgPSBOVUxMOworCQkJZnJhbWVfbGVuID0gMDsKKworCQkJbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisJCQlmcmFtZV9sZW4gPSBXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHJ4X3BrdF9pbmZvKTsKKworCQkJbGltX3NlbmRfc21lX21nbXRfZnJhbWVfaW5kKG1hY19jdHgsCisJCQkJCW1hY19oZHItPmZjLnN1YlR5cGUsCisJCQkJCSh1aW50OF90ICopIG1hY19oZHIsCisJCQkJCWZyYW1lX2xlbiArIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCXNlc3Npb24tPnNtZVNlc3Npb25JZCwKKwkJCQkJV01BX0dFVF9SWF9DSChyeF9wa3RfaW5mbyksIHNlc3Npb24sIDApOworCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCQljYXNlIFNJUl9NQUNfVERMU19ESVNfUlNQOgorCQkJbWFjX2hkciA9IE5VTEw7CisJCQlmcmFtZV9sZW4gPSAwOworCQkJcnNzaSA9IDA7CisKKwkJCW1hY19oZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocnhfcGt0X2luZm8pOworCQkJZnJhbWVfbGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihyeF9wa3RfaW5mbyk7CisJCQlyc3NpID0gV01BX0dFVF9SWF9SU1NJX0RCKHJ4X3BrdF9pbmZvKTsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICgiUHVibGljIEFjdGlvbiBURExTIERpc2NvdmVyeSBSU1AgLi4iKSk7CisJCQlsaW1fc2VuZF9zbWVfbWdtdF9mcmFtZV9pbmQobWFjX2N0eCwKKwkJCQltYWNfaGRyLT5mYy5zdWJUeXBlLCAodWludDhfdCAqKSBtYWNfaGRyLAorCQkJCWZyYW1lX2xlbiArIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJc2Vzc2lvbi0+c21lU2Vzc2lvbklkLAorCQkJCVdNQV9HRVRfUlhfQ0gocnhfcGt0X2luZm8pLCBzZXNzaW9uLCByc3NpKTsKKwkJYnJlYWs7CisjZW5kaWYKKworCQlkZWZhdWx0OgorCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJVbmhhbmRsZWQgcHVibGljIGFjdGlvbiBmcmFtZSAtLSAleCAiKSwKKwkJCQlhY3Rpb25faGRyLT5hY3Rpb25JRCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwljYXNlIFNJUl9NQUNfQUNUSU9OX1NBX1FVRVJZOgorCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiU0EgUXVlcnkgQWN0aW9uIGNhdGVnb3J5ICVkIGFjdGlvbiAlZC4iKSwKKwkJCWFjdGlvbl9oZHItPmNhdGVnb3J5LCBhY3Rpb25faGRyLT5hY3Rpb25JRCk7CisJCWlmIChsaW1fZHJvcF91bnByb3RlY3RlZF9hY3Rpb25fZnJhbWUobWFjX2N0eCwgc2Vzc2lvbiwKKwkJCW1hY19oZHJfMTF3LCBhY3Rpb25faGRyLT5jYXRlZ29yeSkpCisJCQlicmVhazsKKwkJc3dpdGNoIChhY3Rpb25faGRyLT5hY3Rpb25JRCkgeworCQljYXNlIFNJUl9NQUNfU0FfUVVFUllfUkVROgorCQkJLyoqMTF3IFNBIHF1ZXJ5IHJlcXVlc3QgYWN0aW9uIGZyYW1lIHJlY2VpdmVkKiovCisJCQkvKiBSZXNwb25kIGRpcmVjdGx5IHRvIHRoZSBpbmNvbWluZyByZXF1ZXN0IGluIExJTSAqLworCQkJX19saW1fcHJvY2Vzc19zYV9xdWVyeV9yZXF1ZXN0X2FjdGlvbl9mcmFtZShtYWNfY3R4LAorCQkJCQkJKHVpbnQ4X3QgKilyeF9wa3RfaW5mbywKKwkJCQkJCXNlc3Npb24pOworCQkJYnJlYWs7CisJCWNhc2UgU0lSX01BQ19TQV9RVUVSWV9SU1A6CisJCQkvKioxMXcgU0EgcXVlcnkgcmVzcG9uc2UgYWN0aW9uIGZyYW1lIHJlY2VpdmVkKiovCisJCQkvKiBIYW5kbGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgU0EgUXVlcnkgc3RhdGUgKi8KKwkJCV9fbGltX3Byb2Nlc3Nfc2FfcXVlcnlfcmVzcG9uc2VfYWN0aW9uX2ZyYW1lKG1hY19jdHgsCisJCQkJCQkodWludDhfdCAqKXJ4X3BrdF9pbmZvLAorCQkJCQkJc2Vzc2lvbik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwljYXNlIFNJUl9NQUNfQUNUSU9OX1ZIVDoKKwkJaWYgKCFzZXNzaW9uLT52aHRDYXBhYmlsaXR5KQorCQkJYnJlYWs7CisJCXN3aXRjaCAoYWN0aW9uX2hkci0+YWN0aW9uSUQpIHsKKwkJY2FzZSBTSVJfTUFDX1ZIVF9PUE1PREVfTk9USUZJQ0FUSU9OOgorCQkJX19saW1fcHJvY2Vzc19vcGVyYXRpbmdfbW9kZV9hY3Rpb25fZnJhbWUobWFjX2N0eCwKKwkJCQkJcnhfcGt0X2luZm8sIHNlc3Npb24pOworCQkJYnJlYWs7CisJCWNhc2UgU0lSX01BQ19WSFRfR0lEX05PVElGSUNBVElPTjoKKwkJCS8qIE9ubHkgaWYgaW5pIHN1cHBvcnRzIGl0ICovCisJCQlpZiAoc2Vzc2lvbi0+ZW5hYmxlVmh0R2lkKQorCQkJCV9fbGltX3Byb2Nlc3NfZ2lkX21hbmFnZW1lbnRfYWN0aW9uX2ZyYW1lKAorCQkJCQltYWNfY3R4LCByeF9wa3RfaW5mbywgc2Vzc2lvbik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkFjdGlvbiBjYXRlZ29yeSAlZCBub3QgaGFuZGxlZCIpLAorCQkJYWN0aW9uX2hkci0+Y2F0ZWdvcnkpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfYWN0aW9uX2ZyYW1lX25vX3Nlc3Npb24KKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbgorICogQWN0aW9uIGZyYW1lIHJlY2VwdGlvbiBhbmQgbm8gc2Vzc2lvbi4KKyAqIEN1cnJlbnRseSBvbmx5IHB1YmxpYyBhY3Rpb24gZnJhbWVzIGNhbiBiZSByZWNlaXZlZCBmcm9tCisgKiBhIG5vbi1hc3NvY2lhdGVkIHN0YXRpb24uCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwQmQgLSBBIHBvaW50ZXIgdG8gQnVmZmVyIGRlc2NyaXB0b3IgKyBhc3NvY2lhdGVkIFBEVXMKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX3Byb2Nlc3NfYWN0aW9uX2ZyYW1lX25vX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcEJkKQoreworCXVpbnQ4X3QgKnBCb2R5ID0gV01BX0dFVF9SWF9NUERVX0RBVEEocEJkKTsKKwl0cFNpck1hY1ZlbmRvclNwZWNpZmljUHVibGljQWN0aW9uRnJhbWVIZHIgcEFjdGlvbkhkciA9CisJCSh0cFNpck1hY1ZlbmRvclNwZWNpZmljUHVibGljQWN0aW9uRnJhbWVIZHIpIHBCb2R5OworCisJbGltX2xvZyhwTWFjLCBMT0cxLCAiUmVjZWl2ZWQgYSBBY3Rpb24gZnJhbWUgLS0gbm8gc2Vzc2lvbiIpOworCisJc3dpdGNoIChwQWN0aW9uSGRyLT5jYXRlZ29yeSkgeworCWNhc2UgU0lSX01BQ19BQ1RJT05fUFVCTElDX1VTQUdFOgorCQlzd2l0Y2ggKHBBY3Rpb25IZHItPmFjdGlvbklEKSB7CisJCWNhc2UgU0lSX01BQ19BQ1RJT05fVkVORE9SX1NQRUNJRklDOgorCQl7CisJCQl0cFNpck1hY01nbXRIZHIgcEhkcjsKKwkJCXVpbnQzMl90IGZyYW1lTGVuOworCQkJdWludDhfdCBQMlBPdWlbXSA9IHsgMHg1MCwgMHg2RiwgMHg5QSwgMHgwOSB9OworCisJCQlwSGRyID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKHBCZCk7CisJCQlmcmFtZUxlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocEJkKTsKKworCQkJLyogQ2hlY2sgaWYgaXQgaXMgYSBQMlAgcHVibGljIGFjdGlvbiBmcmFtZS4gKi8KKwkJCWlmIChjZGZfbWVtX2NvbXBhcmUocEFjdGlvbkhkci0+T3VpLCBQMlBPdWksIDQpKSB7CisJCQkJLyogRm9yd2FyZCB0byB0aGUgU01FIHRvIEhERCB0byB3cGFfc3VwcGxpY2FudCAqLworCQkJCS8qIHR5cGUgaXMgQUNUSU9OICovCisJCQkJbGltX3NlbmRfc21lX21nbXRfZnJhbWVfaW5kKHBNYWMsCisJCQkJCQkJICAgIHBIZHItPmZjLnN1YlR5cGUsCisJCQkJCQkJICAgICh1aW50OF90ICopIHBIZHIsCisJCQkJCQkJICAgIGZyYW1lTGVuICsKKwkJCQkJCQkgICAgc2l6ZW9mCisJCQkJCQkJICAgICh0U2lyTWFjTWdtdEhkciksCisJCQkJCQkJICAgIDAsCisJCQkJCQkJICAgIFdNQV9HRVRfUlhfQ0gKKwkJCQkJCQkJICAgIChwQmQpLCBOVUxMLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTAorCQkJCQkJKCJVbmhhbmRsZWQgcHVibGljIGFjdGlvbiBmcmFtZSAoVmVuZG9yIHNwZWNpZmljKS4gT1VJICV4ICV4ICV4ICV4IiksCisJCQkJCXBBY3Rpb25IZHItPk91aVswXSwKKwkJCQkJcEFjdGlvbkhkci0+T3VpWzFdLAorCQkJCQlwQWN0aW9uSGRyLT5PdWlbMl0sCisJCQkJCXBBY3Rpb25IZHItPk91aVszXSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoIlVuaGFuZGxlZCBwdWJsaWMgYWN0aW9uIGZyYW1lIC0tICV4ICIpLAorCQkJCSAgICAgICBwQWN0aW9uSGRyLT5hY3Rpb25JRCk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCSAgICAgICBGTCgiVW5oYW5kbGVkIGFjdGlvbiBmcmFtZSB3aXRob3V0IHNlc3Npb24gLS0gJXggIiksCisJCQkgICAgICAgcEFjdGlvbkhkci0+Y2F0ZWdvcnkpOworCQkgICAgICAgKQorCQlicmVhazsKKworCX0KK30KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfYXNzb2NfcmVxX2ZyYW1lLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX2Fzc29jX3JlcV9mcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NzI0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX2Fzc29jX3JlcV9mcmFtZS5jCkBAIC0wLDAgKzEsMTkyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBsaW1fcHJvY2Vzc19hc3NvY19yZXFfZnJhbWUuY2MgY29udGFpbnMgdGhlIGNvZGUKKyAqIGZvciBwcm9jZXNzaW5nIFJlL0Fzc29jaWF0aW9uIFJlcXVlc3QgRnJhbWUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMy8xOC8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAwNS8yNi8xMCAgICAgICBqcyAgICAgICAgICAgICBXUEEgaGFuZGxpbmcgaW4gKFJlKUFzc29jIGZyYW1lcworICoKKyAqLworI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlY3VyaXR5X3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Nlcl9kZXNfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc3RhX2hhc2hfYXBpLmgiCisjaW5jbHVkZSAibGltX2FkbWl0X2NvbnRyb2wuaCIKKyNpbmNsdWRlICJjZHNfcGFja2V0LmgiCisjaW5jbHVkZSAibGltX3Nlc3Npb25fdXRpbHMuaCIKKworI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgImNkc191dGlscy5oIgorCisvKioKKyAqIGxpbV9jb252ZXJ0X3N1cHBvcnRlZF9jaGFubmVscyAtIFBhcnNlcyBjaGFubmVsIHN1cHBvcnQgSUUKKyAqCisgKiBAbWFjX2N0eCAtIEEgcG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQGFzc29jX2luZCAtIEEgcG9pbnRlciB0byBTTUUgQVNTT0MvUkVBU1NPQyBJTkQKKyAqIEBhc3NvY19yZXEgLSBBIHBvaW50ZXIgdG8gQVNTT0MvUkVBU1NPQyBSZXF1ZXN0IGZyYW1lCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX3Byb2Nlc3NfYXNzb2NfcmVxX2ZyYW1lKCkgdG8KKyAqIHBhcnNlIHRoZSBjaGFubmVsIHN1cHBvcnQgSUUgaW4gdGhlIEFzc29jL1JlYXNzb2MgUmVxdWVzdAorICogZnJhbWUsIGFuZCBzZW5kIHJlbGV2YW50IGluZm9ybWF0aW9uIGluIHRoZSBTTUVfQVNTT0NfSU5ECisgKgorICogcmV0dXJuIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2xpbV9jb252ZXJ0X3N1cHBvcnRlZF9jaGFubmVscyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl0cExpbU1sbUFzc29jSW5kIGFzc29jX2luZCwgdFNpckFzc29jUmVxICphc3NvY19yZXEpCit7CisJdWludDE2X3QgaSwgaiwgaW5kZXggPSAwOworCXVpbnQ4X3QgZmlyc3RfY2huX25vOworCXVpbnQ4X3QgY2huX2NvdW50OworCXVpbnQ4X3QgbmV4dF9jaG5fbm87CisJdWludDhfdCBjaGFubmVsX29mZnNldCA9IDA7CisKKwlpZiAoYXNzb2NfcmVxLT5zdXBwb3J0ZWRDaGFubmVscy5sZW5ndGggPj0KKwkJU0lSX01BWF9TVVBQT1JURURfQ0hBTk5FTF9MSVNUKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJOdW1iZXIgb2Ygc3VwcG9ydGVkIGNoYW5uZWxzOiVkIGlzIG1vcmUgdGhhbiBNQVgiKSwKKwkJCWFzc29jX3JlcS0+c3VwcG9ydGVkQ2hhbm5lbHMubGVuZ3RoKTsKKwkJYXNzb2NfaW5kLT5zdXBwb3J0ZWRDaGFubmVscy5udW1DaG5sID0gMDsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAoYXNzb2NfcmVxLT5zdXBwb3J0ZWRDaGFubmVscy5sZW5ndGgpOyBpKyspIHsKKwkJLyogR2V0IEZpcnN0IENoYW5uZWwgTnVtYmVyICovCisJCWZpcnN0X2Nobl9ubyA9CisJCQlhc3NvY19yZXEtPnN1cHBvcnRlZENoYW5uZWxzLnN1cHBvcnRlZENoYW5uZWxzW2ldOworCQlhc3NvY19pbmQtPnN1cHBvcnRlZENoYW5uZWxzLmNoYW5uZWxMaXN0W2luZGV4XSA9CisJCQlmaXJzdF9jaG5fbm87CisJCWkrKzsKKwkJaW5kZXgrKzsKKworCQkvKiBHZXQgTnVtYmVyIG9mIENoYW5uZWxzIGluIGEgU3ViYmFuZCAqLworCQljaG5fY291bnQgPQorCQkJYXNzb2NfcmVxLT5zdXBwb3J0ZWRDaGFubmVscy5zdXBwb3J0ZWRDaGFubmVsc1tpXTsKKwkJUEVMT0cyKGxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJCUZMKCJSY3YgYXNzb2NfcmVxOiBjaG5sPSVkLCBudW1PZkNobmw9JWQgIiksCisJCQlmaXJzdF9jaG5fbm8sIGNobl9jb3VudCk7KQorCQlpZiAoaW5kZXggPj0gU0lSX01BWF9TVVBQT1JURURfQ0hBTk5FTF9MSVNUKSB7CisJCQlQRUxPRzIobGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIkNoYW5uZWwgY291bnQgaXMgbW9yZSB0aGFuIG1heCBzdXBwb3J0ZWQgPSVkICIpLAorCQkJY2huX2NvdW50KTspCisJCQlhc3NvY19pbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmwgPSAwOworCQkJcmV0dXJuOworCQl9CisJCWlmIChjaG5fY291bnQgPD0gMSkKKwkJCWNvbnRpbnVlOworCQluZXh0X2Nobl9ubyA9IGZpcnN0X2Nobl9ubzsKKwkJaWYgKFNJUl9CQU5EXzVfR0haID09IGxpbV9nZXRfcmZfYmFuZChmaXJzdF9jaG5fbm8pKQorCQkJY2hhbm5lbF9vZmZzZXQgPSAgU0lSXzExQV9GUkVRVUVOQ1lfT0ZGU0VUOworCQllbHNlIGlmIChTSVJfQkFORF8yXzRfR0haID09IGxpbV9nZXRfcmZfYmFuZChmaXJzdF9jaG5fbm8pKQorCQkJY2hhbm5lbF9vZmZzZXQgPSBTSVJfMTFCX0ZSRVFVRU5DWV9PRkZTRVQ7CisJCWVsc2UKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaiA9IDE7IGogPCBjaG5fY291bnQ7IGorKykgeworCQkJbmV4dF9jaG5fbm8gKz0gY2hhbm5lbF9vZmZzZXQ7CisJCQlhc3NvY19pbmQtPnN1cHBvcnRlZENoYW5uZWxzLmNoYW5uZWxMaXN0W2luZGV4XQorCQkJCT0gbmV4dF9jaG5fbm87CisJCQlpbmRleCsrOworCQkJaWYgKGluZGV4ID49IFNJUl9NQVhfU1VQUE9SVEVEX0NIQU5ORUxfTElTVCkgeworCQkJCVBFTE9HMihsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoIkNoYW5uZWwgY291bnQgaXMgbW9yZSB0aGFuIHN1cHBvcnRlZCA9JWQgIiksCisJCQkJY2huX2NvdW50KTspCisJCQkJYXNzb2NfaW5kLT5zdXBwb3J0ZWRDaGFubmVscy5udW1DaG5sID0gMDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwlhc3NvY19pbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmwgPSAodWludDhfdCkgaW5kZXg7CisJUEVMT0cyKGxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJRkwoIlNlbmQgQXNzb2NJbmQgdG8gV1NNOiAgbWluUHdyICVkLCBtYXhQd3IgJWQsIG51bUNobmwgJWQiKSwKKwkJYXNzb2NfaW5kLT5wb3dlckNhcC5taW5UeFBvd2VyLAorCQlhc3NvY19pbmQtPnBvd2VyQ2FwLm1heFR4UG93ZXIsCisJCWFzc29jX2luZC0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubCk7KQorfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiAgICAgbGltX2NoZWNrX3N0YV9pbl9wZV9lbnRyaWVzCisgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbV9wcm9jZXNzX2Fzc29jX3JlcV9mcmFtZSgpCisgXCAgICAgICB0byBjaGVjayBpZiBTVEEgZW50cnkgYWxyZWFkeSBleGlzdHMgaW4gYW55IG9mIHRoZQorIFwgICAgICAgUEUgZW50cmllcyBvZiB0aGUgQVAuIElmIGl0IGV4aXN0cywgZGVhdXRoIHdpbGwgYmUKKyBcICAgICAgIHNlbnQgb24gdGhhdCBzZXNzaW9uIGFuZCB0aGUgU1RBIGRlbGV0aW9uIHdpbGwKKyBcICAgICAgIGhhcHBlbi4gQWZ0ZXIgdGhpcywgdGhlIEFTU09DIHJlcXVlc3Qgd2lsbCBiZQorIFwgICAgICAgcHJvY2Vzc2VkCisgXAorICAgXHBhcmFtIHBNYWMgLSBBIHBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAgIFxwYXJhbSBwSGRyIC0gQSBwb2ludGVyIHRvIHRoZSBNQUMgaGVhZGVyCisgICBccmV0dXJuIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbV9jaGVja19zdGFfaW5fcGVfZW50cmllcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1hY01nbXRIZHIgcEhkcikKK3sKKwl1aW50OF90IGk7CisJdWludDE2X3QgYXNzb2NJZCA9IDA7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHBNYWMtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCWlmICgoJnBNYWMtPmxpbS5ncFNlc3Npb25baV0gIT0gTlVMTCkgJiYKKwkJICAgIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkKSAmJgorCQkgICAgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ucGVQZXJzb25hID09IENERl9TQVBfTU9ERSkpIHsKKworCQkJcHNlc3Npb25FbnRyeSA9ICZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldOworCQkJcFN0YURzID0gZHBoX2xvb2t1cF9oYXNoX2VudHJ5KHBNYWMsIHBIZHItPnNhLCAmYXNzb2NJZCwKKwkJCQkJCSAgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLgorCQkJCQkJICAgICAgIGRwaEhhc2hUYWJsZSk7CisJCQlpZiAocFN0YURzCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQkJICAgICYmICFwU3RhRHMtPnJtZkVuYWJsZWQKKyNlbmRpZgorCQkJICAgICkgeworCQkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwKKwkJCQkJCSgiU2VuZGluZyBEZWF1dGggYW5kIERlbGV0aW5nIGV4aXN0aW5nIFNUQSBlbnRyeTogIgorCQkJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJTUFDX0FERFJfQVJSQVkocHNlc3Npb25FbnRyeS0+CisJCQkJCQkgICAgICAgc2VsZk1hY0FkZHIpKTsKKwkJCQlsaW1fc2VuZF9kZWF1dGhfbWdtdF9mcmFtZShwTWFjLAorCQkJCQkJCSAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTiwKKwkJCQkJCQkgICAodWludDhfdCAqKSBwSGRyLT5zYSwKKwkJCQkJCQkgICBwc2Vzc2lvbkVudHJ5LCBmYWxzZSk7CisJCQkJbGltX3RyaWdnZXJfc3RhX2RlbGV0aW9uKHBNYWMsIHBTdGFEcywKKwkJCQkJCQkgcHNlc3Npb25FbnRyeSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuICAgICBsaW1fcHJvY2Vzc19hc3NvY19yZXFfZnJhbWUKKyAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpCisgXCAgICAgICB1cG9uIFJlL0Fzc29jaWF0aW9uIFJlcXVlc3QgZnJhbWUgcmVjZXB0aW9uIGluCisgXCAgICAgICBCVEFNUCBBUCBvciBTb2Z0IEFQIHJvbGUuCisgXAorICAgXHBhcmFtIHBNYWMKKyAgIFxwYXJhbSAqcFJ4UGFja2V0SW5mbyAgICAtIEEgcG9pbnRlciB0byBCdWZmZXIgZGVzY3JpcHRvciArIGFzc29jaWF0ZWQgUERVcworICAgXHBhcmFtIHN1YlR5cGUgLSBJbmRpY2F0ZXMgd2hldGhlciBpdCBpcyBBc3NvY2lhdGlvbiBSZXF1ZXN0KD0wKQorIFwgICAgICAgICAgICAgICAgb3IgUmVhc3NvY2lhdGlvbiBSZXF1ZXN0KD0xKSBmcmFtZQorICAgXHJldHVybiBOb25lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltX3Byb2Nlc3NfYXNzb2NfcmVxX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sCisJCQkgICAgdWludDhfdCBzdWJUeXBlLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQ4X3QgdXBkYXRlQ29udGV4dDsKKwl1aW50OF90ICpwQm9keTsKKwl1aW50MTZfdCBwZWVySWR4LCB0ZW1wOworCXVpbnQzMl90IHZhbDsKKwlpbnQzMl90IGZyYW1lbGVuOworCXRTaXJSZXRTdGF0dXMgc3RhdHVzOworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXN0cnVjdCB0TGltUHJlQXV0aE5vZGUgKnBTdGFQcmVBdXRoQ29udGV4dDsKKwl0QW5pQXV0aFR5cGUgYXV0aFR5cGU7CisJdFNpck1hY0NhcGFiaWxpdHlJbmZvIGxvY2FsQ2FwYWJpbGl0aWVzOworCXRwRHBoSGFzaE5vZGUgcFN0YURzID0gTlVMTDsKKwl0cFNpckFzc29jUmVxIHBBc3NvY1JlcSwgcFRlbXBBc3NvY1JlcTsKKwl0TGltTWxtU3RhdGVzIG1sbVByZXZTdGF0ZTsKKwl0RG90MTFmSUVSU04gRG90MTFmSUVSU047CisJdERvdDExZklFV1BBIERvdDExZklFV1BBOworCXVpbnQzMl90IHBoeU1vZGU7CisJdEhhbEJpdFZhbCBxb3NNb2RlOworCXRIYWxCaXRWYWwgd3NtTW9kZSwgd21lTW9kZTsKKwl1aW50OF90ICp3cHNJZSA9IE5VTEw7CisJdWludDhfdCAqaHRfY2FwX2llID0gTlVMTDsKKwl0U2lyTWFjUmF0ZVNldCBiYXNpY1JhdGVzOworCXVpbnQ4X3QgaSA9IDAsIGogPSAwOworCWJvb2wgcG1mQ29ubmVjdGlvbiA9IGZhbHNlOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwl0UG1mU2FRdWVyeVRpbWVySWQgdGltZXJJZDsKKwl1aW50MzJfdCByZXRyeUludGVydmFsOworI2VuZGlmCisJdWludDE2X3QgYXNzb2NfaWQgPSAwOworCWJvb2wgYXNzb2NfcmVxX2NvcGllZCA9IGZhbHNlOworCisJbGltX2dldF9waHlfbW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKwlsaW1HZXRRb3NNb2RlKHBzZXNzaW9uRW50cnksICZxb3NNb2RlKTsKKworCXBIZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisJZnJhbWVsZW4gPSBXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pOworCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgiUmVjZWl2ZWQgJXMgUmVxIEZyYW1lIG9uIHNlc3Npb25pZDogJWQgc3lzdGVtcm9sZSAlZCIKKwkJICAgIiBsaW1NbG1TdGF0ZSAlZCBmcm9tOiAiIE1BQ19BRERSRVNTX1NUUiksCisJCShMSU1fQVNTT0MgPT0gc3ViVHlwZSkgPyAiQXNzb2MiIDogIlJlQXNzb2MiLAorCQlwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSwKKwkJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisKKwlpZiAoTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpIHx8CisJICAgIExJTV9JU19CVF9BTVBfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgQVNTT0MgUkVRIG9uIHNlc3Npb25pZDogJWQgIgorCQkJICAgInN5cyBzdWJUeXBlPSVkIGZvciByb2xlPSVkIGZyb206ICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBzdWJUeXBlLAorCQkJR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSwKKwkJCU1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCXNpcl9kdW1wX2J1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMywKKwkJCSAgICAgV01BX0dFVF9SWF9NUERVX0RBVEEocFJ4UGFja2V0SW5mbyksIGZyYW1lbGVuKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgYSBTVEEgaXMgYWxyZWFkeSBwcmVzZW50IGluIERQSCBhbmQgaXQKKwkgKiBpcyBpbml0aWF0aW5nIGEgQXNzb2MgcmUtdHJhbnNtaXQsIGRvIG5vdAorCSAqIHByb2Nlc3MgaXQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGZpcnN0IEFzc29jIFJlcSBmcmFtZQorCSAqIGlzIHJlY2VpdmVkIGJ1dCBBQ0sgbG9zdCBhdCBTVEEgc2lkZS4gVGhlIEFDSyBmb3IgdGhpcworCSAqIGRyb3BwZWQgQXNzb2MgUmVxIGZyYW1lIHNob3VsZCBiZSBzZW50IGJ5IEhXLiBIb3N0IHNpbXBseQorCSAqIGRvZXMgbm90IHByb2Nlc3MgaXQgb25jZSB0aGUgZW50cnkgZm9yIHRoZSBTVEEgaXMgYWxyZWFkeQorCSAqIHByZXNlbnQgaW4gRFBILgorCSAqLworCXBTdGFEcyA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLCBwSGRyLT5zYSwgJmFzc29jX2lkLAorCQkJCQkmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKChOVUxMICE9IHBTdGFEcykgJiYgKHBIZHItPmZjLnJldHJ5ID4gMCkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQlGTCgiU1RBIGlzIGluaXRpYXRpbmcgQXNzb2MgUmVxIGFmdGVyIEFDSyBsb3N0LiBEbyBub3QgcHJvY2VzcyIKKwkJIiBzZXNzaW9uaWQ6ICVkIHN5cyBzdWJUeXBlPSVkIGZvciByb2xlPSVkIGZyb206ICIKKwkJTUFDX0FERFJFU1NfU1RSKSwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCXN1YlR5cGUsIEdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSksCisJCU1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCXJldHVybjsKKwl9CisKKwlsaW1fY2hlY2tfc3RhX2luX3BlX2VudHJpZXMocE1hYywgcEhkcik7CisKKwkvKiBHZXQgcG9pbnRlciB0byBSZS9Bc3NvY2lhdGlvbiBSZXF1ZXN0IGZyYW1lIGJvZHkgKi8KKwlwQm9keSA9IFdNQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pOworCisJaWYgKGxpbV9pc19ncm91cF9hZGRyKHBIZHItPnNhKSkgeworCQkvKiBSZWNlaXZlZCBSZS9Bc3NvYyBSZXEgZnJhbWUgZnJvbSBhIEJDL01DIGFkZHJlc3MgKi8KKwkJLyogTG9nIGVycm9yIGFuZCBpZ25vcmUgaXQgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlJlY2VpdmVkICVzIFJlcSBvbiBzZXNzaW9uaWQ6ICVkIGZyYW1lIGZyb20gYSAiCisJCQkgICAiQkMvTUMgYWRkcmVzcyIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCShMSU1fQVNTT0MgPT0gc3ViVHlwZSkgPyAiQXNzb2MiIDogIlJlQXNzb2MiLAorCQkJcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCXJldHVybjsKKwl9CisKKwlzaXJfZHVtcF9idWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzIsICh1aW50OF90ICopIHBCb2R5LCBmcmFtZWxlbik7CisKKwlpZiAoY2RmX21lbV9jb21wYXJlKCh1aW50OF90ICopIHBIZHItPnNhLCAodWludDhfdCAqKSBwSGRyLT5kYSwKKwkJCSAgICAodWludDhfdCkgKHNpemVvZih0U2lyTWFjQWRkcikpKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiUmVqZWN0ZWQgQXNzb2MgUmVxIGZyYW1lIFNpbmNlIHNhbWUgbWFjIGFzIgorCQkJICAgIiBTQVAvR08iKSk7CisJCWxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKHBNYWMsIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywKKwkJCQkJICAgICAgMSwgcEhkci0+c2EsIHN1YlR5cGUsIDAsCisJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQlyZXR1cm47CisJfQorCS8qIElmIFRLSVAgY291bnRlciBtZWFzdXJlcyBhY3RpdmUgc2VuZCBBc3NvYyBSc3AgZnJhbWUgdG8gc3RhdGlvbiB3aXRoIGVTSVJfTUFDX01JQ19GQUlMVVJFX1JFQVNPTiAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5iVGtpcENudHJNZWFzQWN0aXZlICYmCisJICAgIExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIlRLSVAgY291bnRlciBtZWFzdXJlIGlzIGFjdGl2ZSIpKTsKKwkJbGltX3NlbmRfYXNzb2NfcnNwX21nbXRfZnJhbWUocE1hYywKKwkJCQkJICAgICAgZVNJUl9NQUNfTUlDX0ZBSUxVUkVfUkVBU09OLAorCQkJCQkgICAgICAxLCBwSGRyLT5zYSwgc3ViVHlwZSwKKwkJCQkJICAgICAgMCwgcHNlc3Npb25FbnRyeSk7CisJCXJldHVybjsKKwl9CisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgQXNzb2MgUmVxdWVzdCBmcmFtZSAqLworCXBBc3NvY1JlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcEFzc29jUmVxKSk7CisJaWYgKE5VTEwgPT0gcEFzc29jUmVxKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkFsbG9jYXRlIE1lbW9yeSBmYWlsZWQgaW4gYXNzb2NfcmVxIikpOworCQlyZXR1cm47CisJfQorCWNkZl9tZW1fc2V0KCh2b2lkICopcEFzc29jUmVxLCBzaXplb2YoKnBBc3NvY1JlcSksIDApOworCisJLyogUGFyc2UgQXNzb2MgUmVxdWVzdCBmcmFtZSAqLworCWlmIChzdWJUeXBlID09IExJTV9BU1NPQykKKwkJc3RhdHVzID0KKwkJCXNpcl9jb252ZXJ0X2Fzc29jX3JlcV9mcmFtZTJfc3RydWN0KHBNYWMsIHBCb2R5LCBmcmFtZWxlbiwKKwkJCQkJCQkgICAgcEFzc29jUmVxKTsKKwllbHNlCisJCXN0YXR1cyA9CisJCQlzaXJfY29udmVydF9yZWFzc29jX3JlcV9mcmFtZTJfc3RydWN0KHBNYWMsIHBCb2R5LCBmcmFtZWxlbiwKKwkJCQkJCQkgICAgICBwQXNzb2NSZXEpOworCisJaWYgKHN0YXR1cyAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlBhcnNlIGVycm9yIEFzc29jUmVxdWVzdCwgbGVuZ3RoPSVkIGZyb20gIgorCQkJICAgTUFDX0FERFJFU1NfU1RSKSwgZnJhbWVsZW4sIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCWxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKHBNYWMsIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywKKwkJCQkJICAgICAgMSwgcEhkci0+c2EsIHN1YlR5cGUsIDAsCisJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQlnb3RvIGVycm9yOworCX0KKworCXBBc3NvY1JlcS0+YXNzb2NSZXFGcmFtZSA9IGNkZl9tZW1fbWFsbG9jKGZyYW1lbGVuKTsKKwlpZiAoTlVMTCA9PSBwQXNzb2NSZXEtPmFzc29jUmVxRnJhbWUpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhc3NvYyByZXEsICIKKwkJCSAgICJsZW5ndGg9JWQgZnJvbSAiKSwgZnJhbWVsZW4pOworCQlnb3RvIGVycm9yOworCX0KKworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwQXNzb2NSZXEtPmFzc29jUmVxRnJhbWUsCisJCSAgICAgKHVpbnQ4X3QgKikgcEJvZHksIGZyYW1lbGVuKTsKKwlwQXNzb2NSZXEtPmFzc29jUmVxRnJhbWVMZW5ndGggPSBmcmFtZWxlbjsKKworCWlmIChjZmdfZ2V0X2NhcGFiaWxpdHlfaW5mbyhwTWFjLCAmdGVtcCwgcHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBDYXBhYmlsaXRpZXMiKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCWxpbV9jb3B5X3UxNigodWludDhfdCAqKSAmbG9jYWxDYXBhYmlsaXRpZXMsIHRlbXApOworCisJaWYgKGxpbV9jb21wYXJlX2NhcGFiaWxpdGllcyhwTWFjLAorCQkJCSAgICAgcEFzc29jUmVxLAorCQkJCSAgICAgJmxvY2FsQ2FwYWJpbGl0aWVzLCBwc2Vzc2lvbkVudHJ5KSA9PSBmYWxzZSkKKwl7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoImxvY2FsIGNhcHMgbWlzbWF0Y2ggcmVjZWl2ZWQgY2FwcyIpKTsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiUmVjZWl2ZWQgJXMgUmVxIHdpdGggdW5zdXBwb3J0ZWQgIgorCQkJCSAgICAgICAiY2FwYWJpbGl0aWVzIGZyb20iIE1BQ19BRERSRVNTX1NUUiksCisJCQkoTElNX0FTU09DID09IHN1YlR5cGUpID8gIkFzc29jIiA6ICJSZUFzc29jIiwKKwkJCU1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCS8qKgorCQkgKiBDYXBhYmlsaXRpZXMgb2YgcmVxdWVzdGluZyBTVEEgZG9lcyBub3QgbWF0Y2ggd2l0aAorCQkgKiBsb2NhbCBjYXBhYmlsaXRpZXMuIFJlc3BvbmQgd2l0aCAndW5zdXBwb3J0ZWQgY2FwYWJpbGl0aWVzJworCQkgKiBzdGF0dXMgY29kZS4KKwkJICovCisJCWxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKHBNYWMsCisJCQkJCSAgICAgIGVTSVJfTUFDX0NBUEFCSUxJVElFU19OT1RfU1VQUE9SVEVEX1NUQVRVUywKKwkJCQkJICAgICAgMSwKKwkJCQkJICAgICAgcEhkci0+c2EsIHN1YlR5cGUsIDAsIHBzZXNzaW9uRW50cnkpOworCisJCWdvdG8gZXJyb3I7CisJfQorCisJdXBkYXRlQ29udGV4dCA9IGZhbHNlOworCisJaWYgKGxpbV9jbXBfc19zaWQocE1hYywgJnBBc3NvY1JlcS0+c3NJZCwgcHNlc3Npb25FbnRyeSkgPT0gZmFsc2UpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlJlY2VpdmVkICVzIFJlcSB3aXRoIHVubWF0Y2hlZCBzc2lkICggUmVjZWl2ZWQiCisJCQkgICAiIFNTSUQ6ICUuKnMgY3VycmVudCBTU0lEOiAlLipzICkgZnJvbSAiCisJCQkgICBNQUNfQUREUkVTU19TVFIpLAorCQkJKExJTV9BU1NPQyA9PSBzdWJUeXBlKSA/ICJBc3NvYyIgOiAiUmVBc3NvYyIsCisJCQlwQXNzb2NSZXEtPnNzSWQubGVuZ3RoLCBwQXNzb2NSZXEtPnNzSWQuc3NJZCwKKwkJCXBzZXNzaW9uRW50cnktPnNzSWQubGVuZ3RoLCBwc2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWQsCisJCQlNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCisJCS8qKgorCQkgKiBSZWNlaXZlZCBSZS9Bc3NvY2lhdGlvbiBSZXF1ZXN0IHdpdGggZWl0aGVyCisJCSAqIEJyb2FkY2FzdCBTU0lEIE9SIHdpdGggU1NJRCB0aGF0IGRvZXMgbm90CisJCSAqIG1hdGNoIHdpdGggbG9jYWwgb25lLgorCQkgKiBSZXNwb25kIHdpdGggdW5zcGVjaWZpZWQgc3RhdHVzIGNvZGUuCisJCSAqLworCQlsaW1fc2VuZF9hc3NvY19yc3BfbWdtdF9mcmFtZShwTWFjLAorCQkJCQkgICAgICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsCisJCQkJCSAgICAgIDEsCisJCQkJCSAgICAgIHBIZHItPnNhLCBzdWJUeXBlLCAwLCBwc2Vzc2lvbkVudHJ5KTsKKworCQlnb3RvIGVycm9yOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKiBWZXJpZnkgaWYgdGhlIHJlcXVlc3RlZCByYXRlcyBhcmUgYXZhaWxhYmxlIGluIHN1cHBvcnRlZCByYXRlCisJKiogc2V0IG9yIEV4dGVuZGVkIHJhdGUgc2V0LiBTb21lIEFQcyBhcmUgYWRkaW5nIGJhc2ljIHJhdGVzIGluCisJKiogRXh0ZW5kZWQgcmF0ZXNldCBJRQorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwliYXNpY1JhdGVzLm51bVJhdGVzID0gMDsKKworCWZvciAoaSA9IDA7CisJICAgICBpIDwgcEFzc29jUmVxLT5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlcworCSAgICAgJiYgKGkgPCBTSVJfTUFDX1JBVEVTRVRfRUlEX01BWCk7IGkrKykgeworCQliYXNpY1JhdGVzLnJhdGVbaV0gPSBwQXNzb2NSZXEtPnN1cHBvcnRlZFJhdGVzLnJhdGVbaV07CisJCWJhc2ljUmF0ZXMubnVtUmF0ZXMrKzsKKwl9CisKKwlmb3IgKGogPSAwOworCSAgICAgKGogPCBwQXNzb2NSZXEtPmV4dGVuZGVkUmF0ZXMubnVtUmF0ZXMpCisJICAgICAmJiAoaSA8IFNJUl9NQUNfUkFURVNFVF9FSURfTUFYKTsgaSsrLCBqKyspIHsKKwkJYmFzaWNSYXRlcy5yYXRlW2ldID0gcEFzc29jUmVxLT5leHRlbmRlZFJhdGVzLnJhdGVbal07CisJCWJhc2ljUmF0ZXMubnVtUmF0ZXMrKzsKKwl9CisJaWYgKGxpbV9jaGVja19yeF9iYXNpY19yYXRlcyhwTWFjLCBiYXNpY1JhdGVzLCBwc2Vzc2lvbkVudHJ5KSA9PSBmYWxzZSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJSZWNlaXZlZCAlcyBSZXEgd2l0aCB1bnN1cHBvcnRlZCAiCisJCQkJICAgICAgICJyYXRlcyBmcm9tIiBNQUNfQUREUkVTU19TVFIpLAorCQkJKExJTV9BU1NPQyA9PSBzdWJUeXBlKSA/ICJBc3NvYyIgOiAiUmVBc3NvYyIsCisJCQlNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkvKioKKwkJICogUmVxdWVzdGluZyBTVEEgZG9lcyBub3Qgc3VwcG9ydCBBTEwgQlNTIGJhc2ljCisJCSAqIHJhdGVzLiBSZXNwb25kIHdpdGggJ2Jhc2ljIHJhdGVzIG5vdCBzdXBwb3J0ZWQnCisJCSAqIHN0YXR1cyBjb2RlLgorCQkgKi8KKwkJbGltX3NlbmRfYXNzb2NfcnNwX21nbXRfZnJhbWUocE1hYywKKwkJCQkJICAgICAgZVNJUl9NQUNfQkFTSUNfUkFURVNfTk9UX1NVUFBPUlRFRF9TVEFUVVMsCisJCQkJCSAgICAgIDEsCisJCQkJCSAgICAgIHBIZHItPnNhLCBzdWJUeXBlLCAwLCBwc2Vzc2lvbkVudHJ5KTsKKworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSAmJgorCSAgICAocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUdfT05MWSkgJiYKKwkgICAgKHBBc3NvY1JlcS0+SFRDYXBzLnByZXNlbnQpKQorCXsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlNPRlRBUCB3YXMgaW4gMTFHIG9ubHkgbW9kZSwgcmVqZWN0aW5nIGxlZ2FjeSAiCisJCQkgICAiU1RBIDogIiBNQUNfQUREUkVTU19TVFIpLCBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQlsaW1fc2VuZF9hc3NvY19yc3BfbWdtdF9mcmFtZShwTWFjLAorCQkJCQkgICAgICBlU0lSX01BQ19DQVBBQklMSVRJRVNfTk9UX1NVUFBPUlRFRF9TVEFUVVMsCisJCQkJCSAgICAgIDEsIHBIZHItPnNhLCBzdWJUeXBlLCAwLAorCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJZ290byBlcnJvcjsKKworCX0gLyogZW5kIGlmIHBoeU1vZGUgPT0gMTFHX29ubHkgKi8KKworCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSAmJgorCSAgICAocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU5fT05MWSkgJiYKKwkgICAgKCFwQXNzb2NSZXEtPkhUQ2Fwcy5wcmVzZW50KSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiU09GVEFQIHdhcyBpbiAxMU4gb25seSBtb2RlLCByZWplY3RpbmcgbGVnYWN5ICIKKwkJCSAgICJTVEEgOiAiIE1BQ19BRERSRVNTX1NUUiksIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCWxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKHBNYWMsCisJCQkJCSAgICAgIGVTSVJfTUFDX0NBUEFCSUxJVElFU19OT1RfU1VQUE9SVEVEX1NUQVRVUywKKwkJCQkJICAgICAgMSwgcEhkci0+c2EsIHN1YlR5cGUsIDAsCisJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQlnb3RvIGVycm9yOworCX0gLyogZW5kIGlmIFBoeU1vZGUgPT0gMTFOX29ubHkgKi8KKworCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSAmJgorCSAgICAocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUFDX09OTFkpICYmCisJICAgICghcEFzc29jUmVxLT5WSFRDYXBzLnByZXNlbnQpKSB7CisJCWxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKHBNYWMsCisJCQkJCSAgICAgIGVTSVJfTUFDX0NBUEFCSUxJVElFU19OT1RfU1VQUE9SVEVEX1NUQVRVUywKKwkJCQkJICAgICAgMSwgcEhkci0+c2EsIHN1YlR5cGUsIDAsCisJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJTT0ZUQVAgd2FzIGluIDExQUMgb25seSBtb2RlLCByZWplY3QiKSk7CisJCWdvdG8gZXJyb3I7CisJfSAvKiBlbmQgaWYgUGh5TW9kZSA9PSAxMUFDX29ubHkgKi8KKworCS8qIFNwZWN0cnVtIE1hbmFnZW1lbnQgKDExaCkgc3BlY2lmaWMgY2hlY2tzICovCisJaWYgKGxvY2FsQ2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0KSB7CisJCXRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCisJCS8qIElmIHN0YXRpb24gaXMgMTFoIGNhcGFibGUsIHRoZW4gaXQgU0hPVUxEIHNlbmQgYWxsIG1hbmRhdG9yeQorCQkgKiBJRXMgaW4gYXNzb2MgcmVxdWVzdCBmcmFtZS4gTGV0IHVzIHZlcmlmeSB0aGF0CisJCSAqLworCQlpZiAocEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5zcGVjdHJ1bU1ndCkgeworCQkJaWYgKCEKKwkJCSAgICAoKHBBc3NvY1JlcS0+cG93ZXJDYXBhYmlsaXR5UHJlc2VudCkKKwkJCSAgICAgJiYgKHBBc3NvY1JlcS0+c3VwcG9ydGVkQ2hhbm5lbHNQcmVzZW50KSkpIHsKKwkJCQkvKiBPbmUgb3IgbW9yZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcmUgbWlzc2luZywgbG9nIHRoZSBwZWVycyBlcnJvciAqLworCQkJCWlmICghcEFzc29jUmVxLT5wb3dlckNhcGFiaWxpdHlQcmVzZW50KSB7CisJCQkJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCQkJCUZMCisJCQkJCQkJKCJMSU0gSW5mbzogTWlzc2luZyBQb3dlciBjYXBhYmlsaXR5ICIKKwkJCQkJCQkiSUUgaW4gJXMgUmVxIGZyb20gIgorCQkJCQkJCU1BQ19BRERSRVNTX1NUUiksCisJCQkJCQkoTElNX0FTU09DID09CisJCQkJCQkgc3ViVHlwZSkgPyAiQXNzb2MiIDogIlJlQXNzb2MiLAorCQkJCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCQl9CisJCQkJaWYgKCFwQXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzUHJlc2VudCkgeworCQkJCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJCQlGTAorCQkJCQkJCSgiTElNIEluZm86IE1pc3NpbmcgU3VwcG9ydGVkIGNoYW5uZWwgIgorCQkJCQkJCSJJRSBpbiAlcyBSZXEgZnJvbSAiCisJCQkJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJCShMSU1fQVNTT0MgPT0KKwkJCQkJCSBzdWJUeXBlKSA/ICJBc3NvYyIgOiAiUmVBc3NvYyIsCisJCQkJCQlNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBBc3NvYyByZXF1ZXN0IGhhcyBtYW5kYXRvcnkgZmllbGRzICovCisJCQkJc3RhdHVzID0KKwkJCQkJbGltX2lzX2RvdDExaF9wb3dlcl9jYXBhYmlsaXRpZXNfaW5fcmFuZ2UocE1hYywKKwkJCQkJCQkJCQkgIHBBc3NvY1JlcSwKKwkJCQkJCQkJCQkgIHBzZXNzaW9uRW50cnkpOworCQkJCWlmIChlU0lSX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQkJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCQkJCUZMKCJMSU0gSW5mbzogTWluVHhQb3dlcihTVEEpID4gIgorCQkJCQkJICAgIk1heFR4UG93ZXIoQVApIGluICVzIFJlcSBmcm9tICIKKwkJCQkJCSAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJCQkoTElNX0FTU09DID09CisJCQkJCQkgc3ViVHlwZSkgPyAiQXNzb2MiIDogIlJlQXNzb2MiLAorCQkJCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKworCQkJCX0KKwkJCQlzdGF0dXMgPQorCQkJCQlsaW1faXNfZG90MTFoX3N1cHBvcnRlZF9jaGFubmVsc192YWxpZChwTWFjLAorCQkJCQkJCQkJICAgICAgIHBBc3NvY1JlcSk7CisJCQkJaWYgKGVTSVJfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJCQkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCQkJRkwoIkxJTSBJbmZvOiB3cm9uZyBzdXBwb3J0ZWQgIgorCQkJCQkJICAgImNoYW5uZWxzIChTVEEpIGluICVzIFJlcSBmcm9tICIKKwkJCQkJCSAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJCQkoTElNX0FTU09DID09CisJCQkJCQkgc3ViVHlwZSkgPyAiQXNzb2MiIDogIlJlQXNzb2MiLAorCQkJCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKworCQkJCX0KKwkJCQkvKiBJRXMgYXJlIHZhbGlkLCB1c2UgdGhlbSBpZiBuZWVkZWQgKi8KKwkJCX0KKwkJfSAvKiBpZihhc3NvYy5jYXBhYmlsaXR5SW5mby5zcGVjdHJ1bU1ndCkgKi8KKwkJZWxzZSB7CisJCQkvKiBBcyBwZXIgdGhlIGNhcGFiaWl0aWVzLCB0aGUgc3BlY3RydW0gbWFuYWdlbWVudCBpcyBub3QgZW5hYmxlZCBvbiB0aGUgc3RhdGlvbgorCQkJICogVGhlIEFQIG1heSBhbGxvdyB0aGUgYXNzb2NpYXRpb25zIHRvIGhhcHBlbiBldmVuIGlmIHNwZWN0cnVtIG1hbmFnZW1lbnQgaXMgbm90CisJCQkgKiBhbGxvd2VkLCBpZiB0aGUgdHJhbnNtaXQgcG93ZXIgb2Ygc3RhdGlvbiBpcyBiZWxvdyB0aGUgcmVndWxhdG9yeSBtYXhpbXVtCisJCQkgKi8KKworCQkJLyogVE9ETzogcHJlc2VudGx5LCB0aGlzIGlzIG5vdCBoYW5kbGVkLiBJbiB0aGUgY3VycmVudCBpbXBsZW1ldGF0aW9uLCB0aGUgQVAgd291bGQKKwkJCSAqIGFsbG93IHRoZSBzdGF0aW9uIHRvIGFzc29jaWF0ZSBldmVuIGlmIGl0IGRvZXNuJ3Qgc3VwcG9ydCBzcGVjdHJ1bSBtYW5hZ2VtZW50LgorCQkJICovCisJCX0KKwl9IC8qIGVuZCBvZiBzcGVjdHJ1bSBtYW5hZ2VtZW50IHJlbGF0ZWQgcHJvY2Vzc2luZyAqLworCisJaWYgKChwQXNzb2NSZXEtPkhUQ2Fwcy5wcmVzZW50KQorCSAgICAmJiAobGltX2NoZWNrX21jc19zZXQocE1hYywgcEFzc29jUmVxLT5IVENhcHMuc3VwcG9ydGVkTUNTU2V0KSA9PQorCQlmYWxzZSkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInJlY2VpdmVkICVzIHJlcSB3aXRoIHVuc3VwcG9ydGVkIgorCQkJICAgIk1DUyBSYXRlIFNldCBmcm9tICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCShMSU1fQVNTT0MgPT0gc3ViVHlwZSkgPyAiQXNzb2MiIDogIlJlQXNzb2MiLAorCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKworCQkvKioKKwkJICogUmVxdWVzdGluZyBTVEEgZG9lcyBub3Qgc3VwcG9ydCBBTEwgQlNTIE1DUyBiYXNpYyBSYXRlIHNldCByYXRlcy4KKwkJICogU3BlYyBkb2VzIG5vdCBkZWZpbmUgYW55IHN0YXR1cyBjb2RlIGZvciB0aGlzIHNjZW5hcmlvLgorCQkgKi8KKwkJbGltX3NlbmRfYXNzb2NfcnNwX21nbXRfZnJhbWUocE1hYywKKwkJCQkJICAgICAgZVNJUl9NQUNfT1VUU0lERV9TQ09QRV9PRl9TUEVDX1NUQVRVUywKKwkJCQkJICAgICAgMSwKKwkJCQkJICAgICAgcEhkci0+c2EsIHN1YlR5cGUsIDAsIHBzZXNzaW9uRW50cnkpOworCisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpIHsKKworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHXzExR19PTkxZX1BPTElDWSwgJnZhbCkgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgMTFnLW9ubHkgZmxhZyIpKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAoIXBBc3NvY1JlcS0+ZXh0ZW5kZWRSYXRlc1ByZXNlbnQgJiYgdmFsKSB7CisJCQkvKioKKwkJCSAqIFJlY2VpdmVkIFJlL0Fzc29jaWF0aW9uIFJlcXVlc3QgZnJvbQorCQkJICogMTFiIFNUQSB3aGVuIDExZyBvbmx5IHBvbGljeSBvcHRpb24KKwkJCSAqIGlzIHNldC4KKwkJCSAqIFJlamVjdCB3aXRoIHVuc3BlY2lmaWVkIHN0YXR1cyBjb2RlLgorCQkJICovCisJCQlsaW1fc2VuZF9hc3NvY19yc3BfbWdtdF9mcmFtZShwTWFjLAorCQkJCQkJICAgICAgZVNJUl9NQUNfQkFTSUNfUkFURVNfTk9UX1NVUFBPUlRFRF9TVEFUVVMsCisJCQkJCQkgICAgICAxLAorCQkJCQkJICAgICAgcEhkci0+c2EsCisJCQkJCQkgICAgICBzdWJUeXBlLCAwLCBwc2Vzc2lvbkVudHJ5KTsKKworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJSZWplY3RpbmcgUmUvQXNzb2MgcmVxIGZyb20gMTFiIFNUQTogIikpOworCQkJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHBIZHItPnNhLCBMT0dXKTsKKworI2lmZGVmIFdMQU5fREVCVUcKKwkJCXBNYWMtPmxpbS5nTGltMTFiU3RhQXNzb2NSZWplY3RDb3VudCsrOworI2VuZGlmCisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJLyogQ2hlY2sgZm9yIDgwMi4xMW4gSFQgY2FwcyBjb21wYXRpYmlsaXR5OyBhcmUgSFQgQ2FwYWJpbGl0aWVzICovCisJLyogdHVybmVkIG9uIGluIGxpbT8gKi8KKwlpZiAocHNlc3Npb25FbnRyeS0+aHRDYXBhYmlsaXR5KSB7CisJCS8qIFRoZXJlIGFyZTsgYXJlIHRoZXkgdHVybmVkIG9uIGluIHRoZSBTVEE/ICovCisJCWlmIChwQXNzb2NSZXEtPkhUQ2Fwcy5wcmVzZW50KSB7CisJCQkvKiBUaGUgc3RhdGlvbiAqZG9lcyogc3VwcG9ydCA4MDIuMTFuIEhUIGNhcGFiaWxpdHkuLi4gKi8KKworCQkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiQWR2Q29kaW5nQ2FwOiVkIENoYVdpZHRoU2V0OiVkICIKKwkJCQkJICAgICAgICJQb3dlclNhdmU6JWQgZ3JlZW5GaWVsZDolZCAiCisJCQkJCSAgICAgICAic2hvcnRHSTIwOiVkIHNob3J0R0k0MDolZCIKKwkJCQkJICAgICAgICJ0eFNUQkM6JWQgcnhTVEJDOiVkIGRlbGF5QkE6JWQiCisJCQkJCSAgICAgICAibWF4QU1TRFVzaXplOiVkIERTU1MvQ0NLOiVkICIKKwkJCQkJICAgICAgICJQU01QOiVkIHN0YmNDbnRsOiVkIGxzaWdUWFByb3Q6JWQiKSwKKwkJCQlwQXNzb2NSZXEtPkhUQ2Fwcy5hZHZDb2RpbmdDYXAsCisJCQkJcEFzc29jUmVxLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0LAorCQkJCXBBc3NvY1JlcS0+SFRDYXBzLm1pbW9Qb3dlclNhdmUsCisJCQkJcEFzc29jUmVxLT5IVENhcHMuZ3JlZW5GaWVsZCwKKwkJCQlwQXNzb2NSZXEtPkhUQ2Fwcy5zaG9ydEdJMjBNSHosCisJCQkJcEFzc29jUmVxLT5IVENhcHMuc2hvcnRHSTQwTUh6LAorCQkJCXBBc3NvY1JlcS0+SFRDYXBzLnR4U1RCQywKKwkJCQlwQXNzb2NSZXEtPkhUQ2Fwcy5yeFNUQkMsCisJCQkJcEFzc29jUmVxLT5IVENhcHMuZGVsYXllZEJBLAorCQkJCXBBc3NvY1JlcS0+SFRDYXBzLm1heGltYWxBTVNEVXNpemUsCisJCQkJcEFzc29jUmVxLT5IVENhcHMuZHNzc0Nja01vZGU0ME1IeiwKKwkJCQlwQXNzb2NSZXEtPkhUQ2Fwcy5wc21wLAorCQkJCXBBc3NvY1JlcS0+SFRDYXBzLnN0YmNDb250cm9sRnJhbWUsCisJCQkJcEFzc29jUmVxLT5IVENhcHMubHNpZ1RYT1BQcm90ZWN0aW9uKTsKKworCQkJLyogTWFrZSBzdXJlIHRoZSBTVEEncyBjYXBzIGFyZSBjb21wYXRpYmxlIHdpdGggb3VyIG93bjogKi8KKwkJCS8qIDExLjE1LjIgU3VwcG9ydCBvZiBEU1NTL0NDSyBpbiA0MCBNSHogKi8KKwkJCS8qIHRoZSBBUCBzaGFsbCByZWZ1c2UgYXNzb2NpYXRpb24gcmVxdWVzdHMgZnJvbSBhbiBIVCBTVEEgdGhhdCBoYXMgdGhlIERTU1MvQ0NLICovCisJCQkvKiBNb2RlIGluIDQwIE1IeiBzdWJmaWVsZCBzZXQgdG8gMTsgKi8KKwkJfQorCX0gLyogRW5kIGlmIG9uIEhUIGNhcHMgdHVybmVkIG9uIGluIGxpbS4gKi8KKworCS8qIENsZWFyIHRoZSBidWZmZXJzIHNvIHRoYXQgZnJhbWUgcGFyc2VyIGtub3dzIHRoYXQgdGhlcmUgaXNuJ3QgYSBwcmV2aW91c2x5IGRlY29kZWQgSUUgaW4gdGhlc2UgYnVmZmVycyAqLworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZEb3QxMWZJRVJTTiwgc2l6ZW9mKERvdDExZklFUlNOKSwgMCk7CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJkRvdDExZklFV1BBLCBzaXplb2YoRG90MTFmSUVXUEEpLCAwKTsKKworCS8qIGlmIGFkZGl0aW9uYWwgSUUgaXMgcHJlc2VudCwgY2hlY2sgaWYgaXQgaGFzIFdzY0lFICovCisJaWYgKHBBc3NvY1JlcS0+YWRkSUVQcmVzZW50ICYmIHBBc3NvY1JlcS0+YWRkSUUubGVuZ3RoKQorCQl3cHNJZSA9CisJCQlsaW1HZXRXc2NJRVB0cihwTWFjLCBwQXNzb2NSZXEtPmFkZElFLmFkZElFZGF0YSwKKwkJCQkgICAgICAgcEFzc29jUmVxLT5hZGRJRS5sZW5ndGgpOworCWVsc2UgeworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJBc3NvYyByZXEgYWRkSUVQcmVzZW50ID0gJWQgIgorCQkJCSAgICAgICAiYWRkSUUgbGVuZ3RoID0gJWQiKSwKKwkJCXBBc3NvY1JlcS0+YWRkSUVQcmVzZW50LCBwQXNzb2NSZXEtPmFkZElFLmxlbmd0aCk7CisJfQorCS8qIHdoZW4gd3BzSWUgaXMgcHJlc2VudCwgUlNOL1dQQSBJRSBpcyBpZ25vcmVkICovCisJaWYgKHdwc0llID09IE5VTEwpIHsKKwkJLyoqIGNoZWNrIHdoZXRoZXIgYXMgUlNOIElFIGlzIHByZXNlbnQgKi8KKwkJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpICYmCisJCSAgICBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPnByaXZhY3kgJiYKKwkJICAgIHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+cnNuSUUubGVuZ3RoKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJRkwoIlJTTiBlbmFibGVkIGF1dGgsIFJlL0Fzc29jIHJlcSBmcm9tIFNUQTogIgorCQkJCSAgIE1BQ19BRERSRVNTX1NUUiksIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQlpZiAocEFzc29jUmVxLT5yc25QcmVzZW50KSB7CisJCQkJaWYgKHBBc3NvY1JlcS0+cnNuLmxlbmd0aCkgeworCQkJCQkvKiBVbnBhY2sgdGhlIFJTTiBJRSAqLworCQkJCQlkb3QxMWZfdW5wYWNrX2llX3JzbihwTWFjLAorCQkJCQkJCSAgICAgJnBBc3NvY1JlcS0+cnNuLgorCQkJCQkJCSAgICAgaW5mb1swXSwKKwkJCQkJCQkgICAgIHBBc3NvY1JlcS0+cnNuLmxlbmd0aCwKKwkJCQkJCQkgICAgICZEb3QxMWZJRVJTTik7CisKKwkJCQkJLyogQ2hlY2sgUlNOIHZlcnNpb24gaXMgc3VwcG9ydGVkIG9yIG5vdCAqLworCQkJCQlpZiAoU0lSX01BQ19PVUlfVkVSU0lPTl8xID09CisJCQkJCSAgICBEb3QxMWZJRVJTTi52ZXJzaW9uKSB7CisJCQkJCQkvKiBjaGVjayB0aGUgZ3JvdXB3aXNlIGFuZCBwYWlyd2lzZSBjaXBoZXIgc3VpdGVzICovCisJCQkJCQlpZiAoZVNJUl9TVUNDRVNTICE9CisJCQkJCQkgICAgKHN0YXR1cyA9CisJCQkJCQkJICAgICBsaW1fY2hlY2tfcnhfcnNuX2llX21hdGNoKHBNYWMsCisJCQkJCQkJCQkJICAgICAgIERvdDExZklFUlNOLAorCQkJCQkJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LAorCQkJCQkJCQkJCSAgICAgICBwQXNzb2NSZXEtPgorCQkJCQkJCQkJCSAgICAgICBIVENhcHMuCisJCQkJCQkJCQkJICAgICAgIHByZXNlbnQsCisJCQkJCQkJCQkJICAgICAgICZwbWZDb25uZWN0aW9uKSkpCisJCQkJCQl7CisJCQkJCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkJCQlGTCgiUlNOIE1pc21hdGNoLiIKKwkJCQkJCQkJCSJSZWplY3RpbmcgUmUvQXNzb2MgcmVxIGZyb20gIgorCQkJCQkJCQkJIlNUQTogIgorCQkJCQkJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJCQkJTUFDX0FERFJfQVJSQVkKKwkJCQkJCQkJCShwSGRyLT5zYSkpOworCisJCQkJCQkJLyogc29tZSBJRSBpcyBub3QgcHJvcGVybHkgc2VudCAqLworCQkJCQkJCS8qIHJlY2VpdmVkIEFzc29jaWF0aW9uIHJlcSBmcmFtZSB3aXRoIFJTTiBJRSBidXQgbGVuZ3RoIGlzIDAgKi8KKwkJCQkJCQlsaW1fc2VuZF9hc3NvY19yc3BfbWdtdF9mcmFtZQorCQkJCQkJCQkocE1hYywgc3RhdHVzLCAxLAorCQkJCQkJCQlwSGRyLT5zYSwgc3ViVHlwZSwKKwkJCQkJCQkJMCwgcHNlc3Npb25FbnRyeSk7CisKKwkJCQkJCQlnb3RvIGVycm9yOworCisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCQkJRkwoIlJTTiBsZW5ndGggbm90IGNvcnJlY3QuIgorCQkJCQkJCQkiUmVqZWN0aW5nIFJlL0Fzc29jIHJlcSBmcm9tICIKKwkJCQkJCQkJIlNUQTogIgorCQkJCQkJCQlNQUNfQUREUkVTU19TVFIpLAorCQkJCQkJCU1BQ19BRERSX0FSUkFZKHBIZHItPgorCQkJCQkJCQkgICAgICAgc2EpKTsKKworCQkJCQkJLyogcmVjZWl2ZWQgQXNzb2NpYXRpb24gcmVxIGZyYW1lIHdpdGggUlNOIElFIHZlcnNpb24gd3JvbmcgKi8KKwkJCQkJCWxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKHBNYWMsCisJCQkJCQkJCQkgICAgICBlU0lSX01BQ19VTlNVUFBPUlRFRF9SU05fSUVfVkVSU0lPTl9TVEFUVVMsCisJCQkJCQkJCQkgICAgICAxLAorCQkJCQkJCQkJICAgICAgcEhkci0+CisJCQkJCQkJCQkgICAgICBzYSwKKwkJCQkJCQkJCSAgICAgIHN1YlR5cGUsCisJCQkJCQkJCQkgICAgICAwLAorCQkJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisJCQkJCQlnb3RvIGVycm9yOworCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJCQlGTAorCQkJCQkJCSgiUmVqZWN0aW5nIFJlL0Fzc29jIHJlcSBmcm9tIFNUQToiCisJCQkJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJCU1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkJCS8qIHJlY2VpdmVkIEFzc29jaWF0aW9uIHJlcSBmcmFtZSB3aXRoIFJTTiBJRSBidXQgbGVuZ3RoIGlzIDAgKi8KKwkJCQkJbGltX3NlbmRfYXNzb2NfcnNwX21nbXRfZnJhbWUocE1hYywKKwkJCQkJCQkJICAgICAgZVNJUl9NQUNfSU5WQUxJRF9JTkZPUk1BVElPTl9FTEVNRU5UX1NUQVRVUywKKwkJCQkJCQkJICAgICAgMSwKKwkJCQkJCQkJICAgICAgcEhkci0+c2EsCisJCQkJCQkJCSAgICAgIHN1YlR5cGUsIDAsCisJCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCisJCQkJCWdvdG8gZXJyb3I7CisKKwkJCQl9CisJCQl9IC8qIGVuZCAtIGlmKHBBc3NvY1JlcS0+cnNuUHJlc2VudCkgKi8KKwkJCWlmICgoIXBBc3NvY1JlcS0+cnNuUHJlc2VudCkgJiYgcEFzc29jUmVxLT53cGFQcmVzZW50KSB7CisJCQkJLyogVW5wYWNrIHRoZSBXUEEgSUUgKi8KKwkJCQlpZiAocEFzc29jUmVxLT53cGEubGVuZ3RoKSB7CisJCQkJCWRvdDExZl91bnBhY2tfaWVfd3BhKHBNYWMsICZwQXNzb2NSZXEtPndwYS5pbmZvWzRdLCAgICAgICAgLyogT1VJIGlzIG5vdCB0YWtlbiBjYXJlICovCisJCQkJCQkJICAgICBwQXNzb2NSZXEtPndwYS5sZW5ndGgsCisJCQkJCQkJICAgICAmRG90MTFmSUVXUEEpOworCQkJCQkvKiBjaGVjayB0aGUgZ3JvdXB3aXNlIGFuZCBwYWlyd2lzZSBjaXBoZXIgc3VpdGVzICovCisJCQkJCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkJCQkJICAgIChzdGF0dXMgPQorCQkJCQkJICAgICBsaW1fY2hlY2tfcnhfd3BhX2llX21hdGNoKHBNYWMsCisJCQkJCQkJCQkgICAgICAgRG90MTFmSUVXUEEsCisJCQkJCQkJCQkgICAgICAgcHNlc3Npb25FbnRyeSwKKwkJCQkJCQkJCSAgICAgICBwQXNzb2NSZXEtPgorCQkJCQkJCQkJICAgICAgIEhUQ2Fwcy4KKwkJCQkJCQkJCSAgICAgICBwcmVzZW50KSkpIHsKKwkJCQkJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCQkJCQlGTCgiV1BBIElFIG1pc21hdGNoIgorCQkJCQkJCQkiUmVqZWN0aW5nIFJlL0Fzc29jIHJlcSBmcm9tICIKKwkJCQkJCQkJIlNUQTogIgorCQkJCQkJCQlNQUNfQUREUkVTU19TVFIpLAorCQkJCQkJCU1BQ19BRERSX0FSUkFZKHBIZHItPgorCQkJCQkJCQkgICAgICAgc2EpKTsKKwkJCQkJCS8qIHJlY2VpdmVkIEFzc29jaWF0aW9uIHJlcSBmcmFtZSB3aXRoIFdQQSBJRSBidXQgbWlzbWF0Y2ggKi8KKwkJCQkJCWxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKHBNYWMsCisJCQkJCQkJCQkgICAgICBzdGF0dXMsCisJCQkJCQkJCQkgICAgICAxLAorCQkJCQkJCQkJICAgICAgcEhkci0+CisJCQkJCQkJCQkgICAgICBzYSwKKwkJCQkJCQkJCSAgICAgIHN1YlR5cGUsCisJCQkJCQkJCQkgICAgICAwLAorCQkJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisJCQkJCQlnb3RvIGVycm9yOworCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJCQlGTCgiV1BBIGxlbiBpbmNvcnJlY3QuIgorCQkJCQkJIlJlamVjdGluZyBSZS9Bc3NvYyByZXEgZnJvbSIKKwkJCQkJCSJTVEE6ICJNQUNfQUREUkVTU19TVFIpLAorCQkJCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCQkJLyogcmVjZWl2ZWQgQXNzb2NpYXRpb24gcmVxIGZyYW1lIHdpdGggaW52YWxpZCBXUEEgSUUgKi8KKwkJCQkJbGltX3NlbmRfYXNzb2NfcnNwX21nbXRfZnJhbWUocE1hYywKKwkJCQkJCQkJICAgICAgZVNJUl9NQUNfSU5WQUxJRF9JTkZPUk1BVElPTl9FTEVNRU5UX1NUQVRVUywKKwkJCQkJCQkJICAgICAgMSwKKwkJCQkJCQkJICAgICAgcEhkci0+c2EsCisJCQkJCQkJCSAgICAgIHN1YlR5cGUsIDAsCisJCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfSAvKiBlbmQgLSBpZihwQXNzb2NSZXEtPndwYS5sZW5ndGgpICovCisJCQl9IC8qIGVuZCAtIGlmKHBBc3NvY1JlcS0+d3BhUHJlc2VudCkgKi8KKwkJfQorCQkvKiBlbmQgb2YgaWYocHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5wcml2YWN5CisJCSAgICYmIHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+cnNuSUUtPmxlbmd0aCkgKi8KKwl9IC8qIGVuZCBvZiAgICAgaWYoICEgcEFzc29jUmVxLT53c2NJbmZvLnByZXNlbnQgKSAqLworCWVsc2UgeworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJBc3NvYyByZXEgV1NFIElFIGlzIHByZXNlbnQiKSk7CisJfQorCisJLyoqCisJICogRXh0cmFjdCAnYXNzb2NpYXRlZCcgY29udGV4dCBmb3IgU1RBLCBpZiBhbnkuCisJICogVGhpcyBpcyBtYWludGFpbmVkIGJ5IERQSCBhbmQgY3JlYXRlZCBieSBMSU0uCisJICovCisJcFN0YURzID0KKwkJZHBoX2xvb2t1cF9oYXNoX2VudHJ5KHBNYWMsIHBIZHItPnNhLCAmcGVlcklkeCwKKwkJCQkgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisKKwkvKiAvIEV4dHJhY3QgcHJlLWF1dGggY29udGV4dCBmb3IgdGhlIFNUQSwgaWYgYW55LiAqLworCXBTdGFQcmVBdXRoQ29udGV4dCA9IGxpbV9zZWFyY2hfcHJlX2F1dGhfbGlzdChwTWFjLCBwSGRyLT5zYSk7CisKKwlpZiAocFN0YURzID09IE5VTEwpIHsKKwkJLyogLyBSZXF1ZXN0aW5nIFNUQSBpcyBub3QgY3VycmVudGx5IGFzc29jaWF0ZWQgKi8KKwkJaWYgKHBlX2dldF9jdXJyZW50X3N0YXNfY291bnQocE1hYykgPT0KKwkJCQlwTWFjLT5saW0uZ0xpbUFzc29jU3RhTGltaXQpIHsKKwkJCS8qKgorCQkJICogTWF4aW11bSBudW1iZXIgb2YgU1RBcyB0aGF0IEFQIGNhbiBoYW5kbGUgcmVhY2hlZC4KKwkJCSAqIFNlbmQgQXNzb2NpYXRpb24gcmVzcG9uc2UgdG8gcGVlciBNQUMgZW50aXR5CisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIk1heCBTdGEgY291bnQgcmVhY2hlZCA6ICVkIiksCisJCQkJCXBNYWMtPmxpbS5tYXhTdGF0aW9uKTsKKwkJCWxpbV9yZWplY3RfYXNzb2NpYXRpb24ocE1hYywgcEhkci0+c2EsCisJCQkJCSAgICAgICBzdWJUeXBlLCBmYWxzZSwKKwkJCQkJICAgICAgICh0QW5pQXV0aFR5cGUpIDAsIDAsCisJCQkJCSAgICAgICBmYWxzZSwKKwkJCQkJICAgICAgICh0U2lyUmVzdWx0Q29kZXMpCisJCQkJCSAgICAgICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsCisJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKworCQkJZ290byBlcnJvcjsKKwkJfQorCQkvKiAvIENoZWNrIGlmIFNUQSBpcyBwcmUtYXV0aGVudGljYXRlZC4gKi8KKwkJaWYgKChwU3RhUHJlQXV0aENvbnRleHQgPT0gTlVMTCkgfHwKKwkJICAgIChwU3RhUHJlQXV0aENvbnRleHQgJiYKKwkJICAgICAocFN0YVByZUF1dGhDb250ZXh0LT5tbG1TdGF0ZSAhPQorCQkgICAgICBlTElNX01MTV9BVVRIRU5USUNBVEVEX1NUQVRFKSkpIHsKKwkJCS8qKgorCQkJICogU1RBIGlzIG5vdCBwcmUtYXV0aGVudGljYXRlZCB5ZXQgcmVxdWVzdGluZworCQkJICogUmUvQXNzb2NpYXRpb24gYmVmb3JlIEF1dGhlbnRpY2F0aW9uLgorCQkJICogT1IgU1RBIGlzIGluIHRoZSBwcm9jZXNzIG9mIGdldHRpbmcgYXV0aGVudGljYXRlZAorCQkJICogYW5kIHNlbnQgUmUvQXNzb2NpYXRpb24gcmVxdWVzdC4KKwkJCSAqIFNlbmQgRGVhdXRoZW50aWNhdGlvbiBmcmFtZSB3aXRoICdwcmlvcgorCQkJICogYXV0aGVudGljYXRpb24gcmVxdWlyZWQnIHJlYXNvbiBjb2RlLgorCQkJICovCisJCQlsaW1fc2VuZF9kZWF1dGhfbWdtdF9mcmFtZShwTWFjLCBlU0lSX01BQ19TVEFfTk9UX1BSRV9BVVRIRU5USUNBVEVEX1JFQVNPTiwgLyogPTkgKi8KKwkJCQkJCSAgIHBIZHItPnNhLCBwc2Vzc2lvbkVudHJ5LCBmYWxzZSk7CisKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgicmVjZWl2ZWQgJXMgcmVxIG9uIHNlc3Npb25pZDogJWQgZnJvbSBTVEEgIgorCQkJCSAgICJ0aGF0IGRvZXMgbm90IGhhdmUgcHJlLWF1dGggY29udGV4dCIKKwkJCQkgICBNQUNfQUREUkVTU19TVFIpLAorCQkJCShMSU1fQVNTT0MgPT0gc3ViVHlwZSkgPyAiQXNzb2MiIDogIlJlQXNzb2MiLAorCQkJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkJCU1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCS8qIC8gRGVsZXRlICdwcmUtYXV0aCcgY29udGV4dCBvZiBTVEEgKi8KKwkJYXV0aFR5cGUgPSBwU3RhUHJlQXV0aENvbnRleHQtPmF1dGhUeXBlOworCQlsaW1fZGVsZXRlX3ByZV9hdXRoX25vZGUocE1hYywgcEhkci0+c2EpOworCisJCS8qIEFsbCBpcyB3ZWxsLiBBc3NpZ24gQUlEIChhZnRlciBlbHNlIHBhcnQpICovCisKKwl9IC8qIGlmIChwU3RhRHMgPT0gTlVMTCkgKi8KKwllbHNlIHsKKwkJLyogU1RBIGNvbnRleHQgZG9lcyBleGlzdCBmb3IgdGhpcyBTVEEgKi8KKworCQlpZiAocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9CisJCSAgICBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKSB7CisJCQkvKioKKwkJCSAqIFJlcXVlc3RpbmcgU1RBIGlzIGluIHNvbWUgJ3RyYW5zaWVudCcgc3RhdGU/CisJCQkgKiBJZ25vcmUgdGhlIFJlL0Fzc29jIFJlcSBmcmFtZSBieSBpbmNyZW1lbnRpbmcKKwkJCSAqIGRlYnVnIGNvdW50ZXIgJiBsb2dnaW5nIGVycm9yLgorCQkJICovCisJCQlpZiAoc3ViVHlwZSA9PSBMSU1fQVNTT0MpIHsKKworI2lmZGVmIFdMQU5fREVCVUcKKwkJCQlwTWFjLT5saW0uZ0xpbU51bUFzc29jUmVxRHJvcEludmxkU3RhdGUrKzsKKyNlbmRpZgorCQkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwoInJlY2VpdmVkIEFzc29jIHJlcSBpbiBzdGF0ZSAiCisJCQkJCSAgICIlWCBmcm9tICIpLAorCQkJCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpOworCQkJfSBlbHNlIHsKKyNpZmRlZiBXTEFOX0RFQlVHCisJCQkJcE1hYy0+bGltLmdMaW1OdW1SZWFzc29jUmVxRHJvcEludmxkU3RhdGUrKzsKKyNlbmRpZgorCQkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwoInJlY2VpdmVkIFJlQXNzb2MgcmVxIGluIHN0YXRlICVYIgorCQkJCQkgICAiIGZyb20gIiksCisJCQkJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSk7CisJCQl9CisJCQlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOworCQkJbGltX3ByaW50X21sbV9zdGF0ZShwTWFjLCBMT0cxLAorCQkJCQkgICAgKHRMaW1NbG1TdGF0ZXMpIHBTdGFEcy0+bWxtU3RhQ29udGV4dC4KKwkJCQkJICAgIG1sbVN0YXRlKTsKKworCQkJZ290byBlcnJvcjsKKwkJfSAvKiBpZiAocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpICovCisKKwkJLyogU1RBIHNlbnQgYXNzb2NpYXRpb24gUmVxdWVzdCBmcmFtZSB3aGlsZSBhbHJlYWR5IGluCisJCSAqICdhc3NvY2lhdGVkJyBzdGF0ZSAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQlGTAorCQkJCSgiUmUvQXNzb2MgcmVxdWVzdCBmcm9tIHN0YXRpb24gdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQiKSk7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlBNRiBlbmFibGVkICVkLCBTQSBRdWVyeSBzdGF0ZSAlZCIpLAorCQkJcFN0YURzLT5ybWZFbmFibGVkLCBwU3RhRHMtPnBtZlNhUXVlcnlTdGF0ZSk7CisJCWlmIChwU3RhRHMtPnJtZkVuYWJsZWQpIHsKKwkJCXN3aXRjaCAocFN0YURzLT5wbWZTYVF1ZXJ5U3RhdGUpIHsKKworCQkJLyogc3RhcnQgU0EgUXVlcnkgcHJvY2VkdXJlLCByZXNwb25kIHRvIEFzc29jaWF0aW9uIFJlcXVlc3QgKi8KKwkJCS8qIHdpdGggdHJ5IGFnYWluIGxhdGVyICovCisJCQljYXNlIERQSF9TQV9RVUVSWV9OT1RfSU5fUFJPR1JFU1M6CisJCQkJLyoKKwkJCQkgKiBXZSBzaG91bGQgcmVzZXQgdGhlIHJldHJ5IGNvdW50ZXIgYmVmb3JlIHdlIHN0YXJ0CisJCQkJICogdGhlIFNBIHF1ZXJ5IHByb2NlZHVyZSwgb3RoZXJ3aXNlIGluIG5leHQgc2V0IG9mIFNBIHF1ZXJ5CisJCQkJICogcHJvY2VkdXJlIHdlIHdpbGwgZW5kIHVwIHVzaW5nIHRoZSBzdGFsZSB2YWx1ZS4KKwkJCQkgKi8KKwkJCQlwU3RhRHMtPnBtZlNhUXVlcnlSZXRyeUNvdW50ID0gMDsKKwkJCQlsaW1fc2VuZF9hc3NvY19yc3BfbWdtdF9mcmFtZShwTWFjLAorCQkJCQkJCSAgICAgIGVTSVJfTUFDX1RSWV9BR0FJTl9MQVRFUiwKKwkJCQkJCQkgICAgICAxLCBwSGRyLT5zYSwgc3ViVHlwZSwKKwkJCQkJCQkgICAgICBwU3RhRHMsIHBzZXNzaW9uRW50cnkpOworCQkJCWxpbV9zZW5kX3NhX3F1ZXJ5X3JlcXVlc3RfZnJhbWUocE1hYywKKwkJCQkJCQkJKHVpbnQ4X3QgKikgJgorCQkJCQkJCQkocFN0YURzLT4KKwkJCQkJCQkJIHBtZlNhUXVlcnlDdXJyZW50VHJhbnNJZCksCisJCQkJCQkJCXBIZHItPnNhLAorCQkJCQkJCQlwc2Vzc2lvbkVudHJ5KTsKKwkJCQlwU3RhRHMtPnBtZlNhUXVlcnlTdGFydFRyYW5zSWQgPQorCQkJCQlwU3RhRHMtPnBtZlNhUXVlcnlDdXJyZW50VHJhbnNJZDsKKwkJCQlwU3RhRHMtPnBtZlNhUXVlcnlDdXJyZW50VHJhbnNJZCsrOworCisJCQkJLyogc3RhcnQgdGltZXIgZm9yIFNBIFF1ZXJ5IHJldHJ5ICovCisJCQkJaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwU3RhRHMtPnBtZlNhUXVlcnlUaW1lcikKKwkJCQkgICAgIT0gVFhfU1VDQ0VTUykgeworCQkJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCQlGTAorCQkJCQkJCSgiUE1GIFNBIFF1ZXJ5IHRpbWVyIGFjdGl2YXRpb24gZmFpbGVkISIpKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisKKwkJCQlwU3RhRHMtPnBtZlNhUXVlcnlTdGF0ZSA9CisJCQkJCURQSF9TQV9RVUVSWV9JTl9QUk9HUkVTUzsKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiBTQSBRdWVyeSBwcm9jZWR1cmUgc3RpbGwgZ29pbmcsIHJlc3BvbmQgdG8gQXNzb2NpYXRpb24gKi8KKwkJCS8qIFJlcXVlc3Qgd2l0aCB0cnkgYWdhaW4gbGF0ZXIgKi8KKwkJCWNhc2UgRFBIX1NBX1FVRVJZX0lOX1BST0dSRVNTOgorCQkJCWxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKHBNYWMsCisJCQkJCQkJICAgICAgZVNJUl9NQUNfVFJZX0FHQUlOX0xBVEVSLAorCQkJCQkJCSAgICAgIDEsIHBIZHItPnNhLCBzdWJUeXBlLAorCQkJCQkJCSAgICAgIDAsIHBzZXNzaW9uRW50cnkpOworCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIFNBIFF1ZXJ5IHByb2NlZHVyZSB0aW1lZCBvdXQsIGFjY2VwdCBBc3NvY2lhdGlvbiBSZXF1ZXN0ICovCisJCQkvKiBub3JtYWxseSAqLworCQkJY2FzZSBEUEhfU0FfUVVFUllfVElNRURfT1VUOgorCQkJCXBTdGFEcy0+cG1mU2FRdWVyeVN0YXRlID0KKwkJCQkJRFBIX1NBX1FVRVJZX05PVF9JTl9QUk9HUkVTUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJLyogbm8gY2hhbmdlIGluIHRoZSBjYXBhYmlsaXR5IHNvIGRyb3AgdGhlIGZyYW1lICovCisJCWlmICgodHJ1ZSA9PQorCQkgICAgIGNkZl9tZW1fY29tcGFyZSgmcFN0YURzLT5tbG1TdGFDb250ZXh0LmNhcGFiaWxpdHlJbmZvLAorCQkJCSAgICAgJnBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8sCisJCQkJICAgICBzaXplb2YodFNpck1hY0NhcGFiaWxpdHlJbmZvKSkpCisJCSAgICAmJiAoc3ViVHlwZSA9PSBMSU1fQVNTT0MpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIiBSZWNlaXZlZCBBc3NvYyByZXEgaW4gc3RhdGUgJVggU1RBaWQ9JWQiKSwKKwkJCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUsIHBlZXJJZHgpOworCQkJZ290byBlcnJvcjsKKwkJfSBlbHNlIHsKKwkJCS8qKgorCQkJICogU1RBIHNlbnQgUmUvYXNzb2NpYXRpb24gUmVxdWVzdCBmcmFtZSB3aGlsZSBhbHJlYWR5IGluCisJCQkgKiAnYXNzb2NpYXRlZCcgc3RhdGUuIFVwZGF0ZSBTVEEgY2FwYWJpbGl0aWVzIGFuZAorCQkJICogc2VuZCBBc3NvY2lhdGlvbiByZXNwb25zZSBmcmFtZSB3aXRoIHNhbWUgQUlECisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCQlGTCgiUmVjdmVkIEFzc29jIHJlcSBmcm9tIFNUQSBhbHJlYWR5IGNvbm5lY3RlZCIKKwkJCQkiIFVwZGF0ZUNvbmV4dCIpKTsKKwkJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5jYXBhYmlsaXR5SW5mbyA9CisJCQkJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mbzsKKwkJCWlmIChwU3RhUHJlQXV0aENvbnRleHQKKwkJCSAgICAmJiAocFN0YVByZUF1dGhDb250ZXh0LT5tbG1TdGF0ZSA9PQorCQkJCWVMSU1fTUxNX0FVVEhFTlRJQ0FURURfU1RBVEUpKSB7CisJCQkJLyogLyBTVEEgaGFzIHRyaWdnZXJlZCBwcmUtYXV0aCBhZ2FpbiAqLworCQkJCWF1dGhUeXBlID0gcFN0YVByZUF1dGhDb250ZXh0LT5hdXRoVHlwZTsKKwkJCQlsaW1fZGVsZXRlX3ByZV9hdXRoX25vZGUocE1hYywgcEhkci0+c2EpOworCQkJfSBlbHNlCisJCQkJYXV0aFR5cGUgPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQuYXV0aFR5cGU7CisKKwkJCXVwZGF0ZUNvbnRleHQgPSB0cnVlOworCQkJaWYgKGRwaF9pbml0X3N0YV9zdGF0ZQorCQkJCSAgICAocE1hYywgcEhkci0+c2EsIHBlZXJJZHgsIHRydWUsCisJCQkJICAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKQorCQkJICAgID09IE5VTEwpIHsKKwkJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMKCJjb3VsZCBub3QgSW5pdCBTVEFpZD0lZCIpLCBwZWVySWR4KTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJCWdvdG8gc2VuZEluZFRvU21lOworCX0gLyogZW5kIGlmIChsb29rdXAgZm9yIFNUQSBpbiBwZXJTdGFEcyBmYWlscykgKi8KKworCS8qIGNoZWNrIGlmIHN0YSBpcyBhbGxvd2VkIHBlciBRb1MgQUMgcnVsZXMgKi8KKwlsaW1HZXRXbWVNb2RlKHBzZXNzaW9uRW50cnksICZ3bWVNb2RlKTsKKwlpZiAoKHFvc01vZGUgPT0gZUhBTF9TRVQpIHx8ICh3bWVNb2RlID09IGVIQUxfU0VUKSkgeworCQkvKiBmb3IgYSBxc3RhLCBjaGVjayBpZiB0aGUgcmVxdWVzdGVkIFRyYWZmaWMgc3BlYyAqLworCQkvKiBpcyBhZG1pc3NpYmxlICovCisJCS8qIGZvciBhIG5vbi1xc3RhIGNoZWNrIGlmIHRoZSBzdGEgY2FuIGJlIGFkbWl0dGVkICovCisJCWlmIChwQXNzb2NSZXEtPmFkZHRzUHJlc2VudCkgeworCQkJdWludDhfdCB0c3BlY0lkeCA9IDA7ICAgLyogaW5kZXggaW4gdGhlIHNjaCB0c3BlYyB0YWJsZS4gKi8KKwkJCWlmIChsaW1fYWRtaXRfY29udHJvbF9hZGRfdHMKKwkJCQkgICAgKHBNYWMsIHBIZHItPnNhLCAmKHBBc3NvY1JlcS0+YWRkdHNSZXEpLAorCQkJCSAgICAmKHBBc3NvY1JlcS0+cW9zQ2FwYWJpbGl0eSksIDAsIGZhbHNlLCBOVUxMLAorCQkJCSAgICAmdHNwZWNJZHgsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwoIkFkbWl0Q29udHJvbDogVFNQRUMgcmVqZWN0ZWQiKSk7CisJCQkJbGltX3NlbmRfYXNzb2NfcnNwX21nbXRfZnJhbWUocE1hYywKKwkJCQkJCQkgICAgICBlU0lSX01BQ19RQVBfTk9fQkFORFdJRFRIX1JFQVNPTiwKKwkJCQkJCQkgICAgICAxLCBwSGRyLT5zYSwgc3ViVHlwZSwKKwkJCQkJCQkgICAgICAwLCBwc2Vzc2lvbkVudHJ5KTsKKyNpZmRlZiBXTEFOX0RFQlVHCisJCQkJcE1hYy0+bGltLmdMaW1OdW1Bc3NvY1JlcURyb3BBQ1JlamVjdFRTKys7CisjZW5kaWYKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9IGVsc2UgaWYgKGxpbV9hZG1pdF9jb250cm9sX2FkZF9zdGEocE1hYywgcEhkci0+c2EsIGZhbHNlKQorCQkJICAgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJBZG1pdENvbnRyb2w6IFN0YSByZWplY3RlZCIpKTsKKwkJCWxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKHBNYWMsCisJCQkJCQkgICAgICBlU0lSX01BQ19RQVBfTk9fQkFORFdJRFRIX1JFQVNPTiwKKwkJCQkJCSAgICAgIDEsCisJCQkJCQkgICAgICBwSGRyLT5zYSwKKwkJCQkJCSAgICAgIHN1YlR5cGUsIDAsIHBzZXNzaW9uRW50cnkpOworI2lmZGVmIFdMQU5fREVCVUcKKwkJCXBNYWMtPmxpbS5nTGltTnVtQXNzb2NSZXFEcm9wQUNSZWplY3RTdGErKzsKKyNlbmRpZgorCQkJZ290byBlcnJvcjsKKwkJfQorCQkvKiBlbHNlIGFsbCBvayAqLworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJBZG1pdENvbnRyb2w6IFN0YSBPSyEiKSk7CisJfQorCisJLyoqCisJICogU1RBIGlzIEFzc29jaWF0ZWQgIQorCSAqLworCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJRkwoIlJlY2VpdmVkICVzIFJlcSAgc3VjY2Vzc2Z1bCBmcm9tICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJKExJTV9BU1NPQyA9PSBzdWJUeXBlKSA/ICJBc3NvYyIgOiAiUmVBc3NvYyIsCisJCU1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisKKwkvKioKKwkgKiBBSUQgZm9yIHRoaXMgYXNzb2NpYXRpb24gd2lsbCBiZSBzYW1lIGFzIHRoZSBwZWVyIEluZGV4IHVzZWQgaW4gRFBIIHRhYmxlLgorCSAqIEFzc2lnbiB1bnVzZWQvbGVhc3QgcmVjZW50bHkgdXNlZCBwZWVyIEluZGV4IGZyb20gcGVyU3RhRHMuCisJICogTk9URTogbGltX2Fzc2lnbl9wZWVyX2lkeCgpIGFzc2lnbnMgQUlEIHZhbHVlcyByYW5naW5nCisJICogYmV0d2VlbiAxIC0gY2ZnX2l0ZW0oV05JX0NGR19BU1NPQ19TVEFfTElNSVQpCisJICovCisKKwlwZWVySWR4ID0gbGltX2Fzc2lnbl9wZWVyX2lkeChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworCWlmICghcGVlcklkeCkgeworCQkvKiBDb3VsZCBub3QgYXNzaWduIEFJRCAqLworCQkvKiBSZWplY3QgYXNzb2NpYXRpb24gKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlBlZXJJZHggbm90IGF2YWlhbGJsZS4gUmVqZWN0IGFzc29jaWF0b24iKSk7CisJCWxpbV9yZWplY3RfYXNzb2NpYXRpb24ocE1hYywgcEhkci0+c2EsCisJCQkJICAgICAgIHN1YlR5cGUsIHRydWUsIGF1dGhUeXBlLAorCQkJCSAgICAgICBwZWVySWR4LCBmYWxzZSwKKwkJCQkgICAgICAgKHRTaXJSZXN1bHRDb2RlcykKKwkJCQkgICAgICAgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKworCQlnb3RvIGVycm9yOworCX0KKworCS8qKgorCSAqIEFkZCBhbiBlbnRyeSB0byBoYXNoIHRhYmxlIG1haW50YWluZWQgYnkgRFBIIG1vZHVsZQorCSAqLworCisJcFN0YURzID0KKwkJZHBoX2FkZF9oYXNoX2VudHJ5KHBNYWMsIHBIZHItPnNhLCBwZWVySWR4LAorCQkJCSAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworCWlmIChwU3RhRHMgPT0gTlVMTCkgeworCQkvKiBDb3VsZCBub3QgYWRkIGhhc2ggdGFibGUgZW50cnkgYXQgRFBIICovCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJjb3VsZCBub3QgYWRkIGhhc2ggZW50cnkgYXQgRFBIIGZvciBhaWQ9JWQsIE1hY0FkZHI6IgorCQkJICAgTUFDX0FERFJFU1NfU1RSKSwgcGVlcklkeCwgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKworCQkvKiBSZWxlYXNlIEFJRCAqLworCQlsaW1fcmVsZWFzZV9wZWVyX2lkeChwTWFjLCBwZWVySWR4LCBwc2Vzc2lvbkVudHJ5KTsKKworCQlsaW1fcmVqZWN0X2Fzc29jaWF0aW9uKHBNYWMsIHBIZHItPnNhLAorCQkJCSAgICAgICBzdWJUeXBlLCB0cnVlLCBhdXRoVHlwZSwgcGVlcklkeCwgZmFsc2UsCisJCQkJICAgICAgICh0U2lyUmVzdWx0Q29kZXMpCisJCQkJICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeSk7CisKKwkJZ290byBlcnJvcjsKKwl9CisKK3NlbmRJbmRUb1NtZToKKwkvKgorCSAqIGNoZWNrIGhlcmUgaWYgdGhlIHBhcnNlZEFzc29jUmVxIGFscmVhZHkKKwkgKiBwb2ludGluZyB0byB0aGUgYXNzb2NfcmVxIGFuZCBmcmVlIGl0IGJlZm9yZQorCSAqIGFzc2lnbmluZyB0aGlzIG5ldyBwQXNzb2NSZXEKKwkgKi8KKwlpZiAocHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXEgIT0gTlVMTCkgeworCQlwVGVtcEFzc29jUmVxID0gcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXTsKKwkJaWYgKHBUZW1wQXNzb2NSZXEgIT0gTlVMTCkgeworCQkJaWYgKHBUZW1wQXNzb2NSZXEtPmFzc29jUmVxRnJhbWUpIHsKKwkJCQljZGZfbWVtX2ZyZWUocFRlbXBBc3NvY1JlcS0+YXNzb2NSZXFGcmFtZSk7CisJCQkJcFRlbXBBc3NvY1JlcS0+YXNzb2NSZXFGcmFtZSA9IE5VTEw7CisJCQkJcFRlbXBBc3NvY1JlcS0+YXNzb2NSZXFGcmFtZUxlbmd0aCA9IDA7CisJCQl9CisJCQljZGZfbWVtX2ZyZWUocFRlbXBBc3NvY1JlcSk7CisJCQlwVGVtcEFzc29jUmVxID0gTlVMTDsKKwkJfQorCisJCXBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGFEcy0+YXNzb2NJZF0gPSBwQXNzb2NSZXE7CisJCWFzc29jX3JlcV9jb3BpZWQgPSB0cnVlOworCX0KKworCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkgPSBwQXNzb2NSZXEtPkhUQ2Fwcy5wcmVzZW50OworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJcFN0YURzLT5tbG1TdGFDb250ZXh0LnZodENhcGFiaWxpdHkgPSBwQXNzb2NSZXEtPlZIVENhcHMucHJlc2VudDsKKyNlbmRpZgorCXBTdGFEcy0+cW9zLmFkZHRzUHJlc2VudCA9CisJCShwQXNzb2NSZXEtPmFkZHRzUHJlc2VudCA9PSAwKSA/IGZhbHNlIDogdHJ1ZTsKKwlwU3RhRHMtPnFvcy5hZGR0cyA9IHBBc3NvY1JlcS0+YWRkdHNSZXE7CisJcFN0YURzLT5xb3MuY2FwYWJpbGl0eSA9IHBBc3NvY1JlcS0+cW9zQ2FwYWJpbGl0eTsKKwlwU3RhRHMtPnZlcnNpb25QcmVzZW50ID0gMDsKKwkvKiBzaG9ydCBzbG90IGFuZCBzaG9ydCBwcmVhbWJsZSBzaG91bGQgYmUgdXBkYXRlZCBiZWZvcmUgZG9pbmcgbGltYWRkc3RhICovCisJcFN0YURzLT5zaG9ydFByZWFtYmxlRW5hYmxlZCA9CisJCSh1aW50OF90KSBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnNob3J0UHJlYW1ibGU7CisJcFN0YURzLT5zaG9ydFNsb3RUaW1lRW5hYmxlZCA9CisJCSh1aW50OF90KSBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWU7CisKKwlwU3RhRHMtPnZhbGlkID0gMDsKKwlwU3RhRHMtPm1sbVN0YUNvbnRleHQuYXV0aFR5cGUgPSBhdXRoVHlwZTsKKwlwU3RhRHMtPnN0YVR5cGUgPSBTVEFfRU5UUllfUEVFUjsKKworCS8qIFRPRE86IElmIGxpc3RlbiBpbnRlcnZhbCBpcyBtb3JlIHRoYW4gY2VydGFpbiBsaW1pdCwgcmVqZWN0IHRoZSBhc3NvY2lhdGlvbi4gKi8KKwkvKiBOZWVkIHRvIGNoZWNrIGN1c3RvbWVyIHJlcXVpcmVtZW50cyBhbmQgdGhlbiBpbXBsZW1lbnQuICovCisJcFN0YURzLT5tbG1TdGFDb250ZXh0Lmxpc3RlbkludGVydmFsID0gcEFzc29jUmVxLT5saXN0ZW5JbnRlcnZhbDsKKwlwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2FwYWJpbGl0eUluZm8gPSBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvOworCisJLyogVGhlIGZvbGxvd2luZyBjb3VudCB3aWxsIGJlIHVzZWQgdG8ga25vY2stb2ZmIHRoZSBzdGF0aW9uIGlmIGl0IGRvZXNuJ3QKKwkgKiBjb21lIGJhY2sgdG8gcmVjZWl2ZSB0aGUgYnVmZmVyZWQgZGF0YS4gVGhlIEFQIHdpbGwgd2FpdCBmb3IgbnVtVGltU2VudCBudW1iZXIKKwkgKiBvZiBiZWFjb25zIGFmdGVyIHNlbmRpbmcgVElNIGluZm9ybWF0aW9uIGZvciB0aGUgc3RhdGlvbiwgYmVmb3JlIGFzc3VtaW5nIHRoYXQKKwkgKiB0aGUgc3RhdGlvbiBpcyBubyBtb3JlIGFzc29jaWF0ZWQgYW5kIGRpc2Fzc29jaWF0ZXMgaXQKKwkgKi8KKworCS8qKiB0aW1XYWl0Q291bnQgaXMgdXNlZCBieSBQTU0gZm9yIG1vbml0b3JpbmcgdGhlIFNUQSdzIGluIFBTIGZvciBMSU5LKi8KKwlwU3RhRHMtPnRpbVdhaXRDb3VudCA9CisJCSh1aW50OF90KSBHRVRfVElNX1dBSVRfQ09VTlQocEFzc29jUmVxLT5saXN0ZW5JbnRlcnZhbCk7CisKKwkvKiogSW5pdGlhbGlzZSB0aGUgQ3VycmVudCBzdWNjZXNzZnVsIE1QRFUncyB0cmFuZmVyZWQgdG8gdGhpcyBTVEEgY291bnQgYXMgMCAqLworCXBTdGFEcy0+Y3VyVHhNcGR1Q250ID0gMDsKKworCWlmIChJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSkgJiYKKwkgICAgcEFzc29jUmVxLT5IVENhcHMucHJlc2VudCAmJiBwQXNzb2NSZXEtPndtZUluZm9QcmVzZW50KSB7CisJCXBTdGFEcy0+aHRHcmVlbmZpZWxkID0gKHVpbnQ4X3QpIHBBc3NvY1JlcS0+SFRDYXBzLmdyZWVuRmllbGQ7CisJCXBTdGFEcy0+aHRBTXBkdURlbnNpdHkgPSBwQXNzb2NSZXEtPkhUQ2Fwcy5tcGR1RGVuc2l0eTsKKwkJcFN0YURzLT5odERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0ID0KKwkJCSh1aW50OF90KSBwQXNzb2NSZXEtPkhUQ2Fwcy5kc3NzQ2NrTW9kZTQwTUh6OworCQlwU3RhRHMtPmh0THNpZ1RYT1BQcm90ZWN0aW9uID0KKwkJCSh1aW50OF90KSBwQXNzb2NSZXEtPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb247CisJCXBTdGFEcy0+aHRNYXhBbXNkdUxlbmd0aCA9CisJCQkodWludDhfdCkgcEFzc29jUmVxLT5IVENhcHMubWF4aW1hbEFNU0RVc2l6ZTsKKwkJcFN0YURzLT5odE1heFJ4QU1wZHVGYWN0b3IgPSBwQXNzb2NSZXEtPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yOworCQlwU3RhRHMtPmh0TUlNT1BTU3RhdGUgPSBwQXNzb2NSZXEtPkhUQ2Fwcy5taW1vUG93ZXJTYXZlOworCisJCS8qIHBBc3NvY1JlcSB3aWxsIGJlIGNvcGllZCB0byBwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcQorCQkgKiBsYXRlcgorCQkgKi8KKwkJaHRfY2FwX2llID0gKCh1aW50OF90ICopICZwQXNzb2NSZXEtPkhUQ2FwcykgKyAxOworCisJCS8qIGNoZWNrIHdoZXRoZXIgQVAgaXMgZW5hYmxlZCB3aXRoIHNob3J0R0kgKi8KKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19TSE9SVF9HSV8yME1IWiwgJnZhbCkgIT0KKwkJCQkJCWVTSVJfU1VDQ0VTUykgeworCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIHNob3J0R0kgMjBNaHogQ0ZHIikpOykKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJaWYgKHZhbCkgeworCQkJcFN0YURzLT5odFNob3J0R0kyME1oeiA9CisJCQkJCSh1aW50OF90KXBBc3NvY1JlcS0+SFRDYXBzLnNob3J0R0kyME1IejsKKwkJfSBlbHNlIHsKKwkJCS8qIFVuc2V0IGh0U2hvcnRHSTIwTWh6IGluIGh0X2NhcHMqLworCQkJKmh0X2NhcF9pZSAmPSB+KDEgPDwgU0lSX01BQ19IVF9DQVBfU0hPUlRHSTIwTUhaX1MpOworCQkJcFN0YURzLT5odFNob3J0R0kyME1oeiA9IDA7CisJCX0KKworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaLCAmdmFsKSAhPQorCQkJCQkJZVNJUl9TVUNDRVNTKSB7CisJCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgc2hvcnRHSSA0ME1oeiBDRkciKSk7KQorCQkJZ290byBlcnJvcjsKKwkJfQorCQlpZiAodmFsKSB7CisJCQlwU3RhRHMtPmh0U2hvcnRHSTQwTWh6ID0KKwkJCQkodWludDhfdClwQXNzb2NSZXEtPkhUQ2Fwcy5zaG9ydEdJNDBNSHo7CisJCX0gZWxzZSB7CisJCQkvKiBVbnNldCBodFNob3J0R0k0ME1oeiBpbiBodF9jYXBzICovCisJCQkqaHRfY2FwX2llICY9IH4oMSA8PCBTSVJfTUFDX0hUX0NBUF9TSE9SVEdJNDBNSFpfUyk7CisJCQlwU3RhRHMtPmh0U2hvcnRHSTQwTWh6ID0gMDsKKwkJfQorCisJCXBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJKHVpbnQ4X3QpIHBBc3NvY1JlcS0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKwkJLyoKKwkJICogcGVlciBqdXN0IGZvbGxvd3MgQVA7IHNvIHdoZW4gd2UgYXJlIHNvZnRBUC9HTywKKwkJICogd2UganVzdCBzdG9yZSBvdXIgc2Vzc2lvbiBlbnRyeSdzIHNlY29uZGFyeSBjaGFubmVsIG9mZnNldAorCQkgKiBoZXJlIGluIHBlZXIgSU5GUkEgU1RBLiBIb3dldmVyLCBpZiBwZWVyJ3MgNDBNSHogY2hhbm5lbAorCQkgKiB3aWR0aCBzdXBwb3J0IGlzIGRpc2FibGVkIHRoZW4gc2Vjb25kYXJ5IGNoYW5uZWwgd2lsbCBiZSB6ZXJvCisJCSAqLworCQlwU3RhRHMtPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9CisJCQkocFN0YURzLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgPyBwc2Vzc2lvbkVudHJ5LT4KKwkJCWh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA6IDA7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJaWYgKHBBc3NvY1JlcS0+b3Blck1vZGUucHJlc2VudCkgeworCQkJcFN0YURzLT52aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCSh1aW50OF90KSAoKHBBc3NvY1JlcS0+b3Blck1vZGUuY2hhbldpZHRoID09CisJCQkJCSAgICBlSFRfQ0hBTk5FTF9XSURUSF84ME1IWikgPworCQkJCQkgICBXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzgwTUhaIDoKKwkJCQkJICAgV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF8yMF80ME1IWik7CisJCQlwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQkodWludDhfdCkgKHBBc3NvY1JlcS0+b3Blck1vZGUuCisJCQkJCSAgIGNoYW5XaWR0aCA/IGVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaIDoKKwkJCQkJICAgZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFopOworCQl9IGVsc2UgaWYgKHBBc3NvY1JlcS0+VkhUQ2Fwcy5wcmVzZW50KSB7CisJCQkvKiBDaGVjayBpZiBTVEEgaGFzIGVuYWJsZWQgaXQncyBjaGFubmVsIGJvbmRpbmcgbW9kZS4gKi8KKwkJCS8qIElmIGNoYW5uZWwgYm9uZGluZyBtb2RlIGlzIGVuYWJsZWQsIHdlIGRlY2lkZSBiYXNlZCBvbiBTQVAncyBjdXJyZW50IGNvbmZpZ3VyYXRpb24uICovCisJCQkvKiBlbHNlLCB3ZSBzZXQgaXQgdG8gVkhUMjAuICovCisJCQlwU3RhRHMtPnZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkJKHVpbnQ4X3QpICgocFN0YURzLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9PQorCQkJCQkgICAgZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFopID8KKwkJCQkJICAgV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF8yMF80ME1IWiA6CisJCQkJCSAgIHBzZXNzaW9uRW50cnktPmNoX3dpZHRoIC0gMSk7CisJCQlwU3RhRHMtPmh0TWF4UnhBTXBkdUZhY3RvciA9CisJCQkJcEFzc29jUmVxLT5WSFRDYXBzLm1heEFNUERVTGVuRXhwOworCQl9CisJCS8qIExlc3NlciBhbW9uZyB0aGUgQVAgYW5kIFNUQSBiYW5kd2lkdGggb2Ygb3BlcmF0aW9uLiAqLworCQlwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCShwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0IDwKKwkJCSBwc2Vzc2lvbkVudHJ5LT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgPworCQkJCXBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgOgorCQkJCXBzZXNzaW9uRW50cnktPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworCisjZW5kaWYKKwkJcFN0YURzLT5iYVBvbGljeUZsYWcgPSAweEZGOworCQlwU3RhRHMtPmh0TGRwY0NhcGFibGUgPQorCQkJKHVpbnQ4X3QpIHBBc3NvY1JlcS0+SFRDYXBzLmFkdkNvZGluZ0NhcDsKKwl9CisKKwlpZiAocEFzc29jUmVxLT5WSFRDYXBzLnByZXNlbnQgJiYgcEFzc29jUmVxLT53bWVJbmZvUHJlc2VudCkgeworCQlwU3RhRHMtPnZodExkcGNDYXBhYmxlID0KKwkJCSh1aW50OF90KSBwQXNzb2NSZXEtPlZIVENhcHMubGRwY0NvZGluZ0NhcDsKKwl9CisKKwlpZiAoIXBBc3NvY1JlcS0+d21lSW5mb1ByZXNlbnQpIHsKKwkJcFN0YURzLT5tbG1TdGFDb250ZXh0Lmh0Q2FwYWJpbGl0eSA9IDA7CisJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC52aHRDYXBhYmlsaXR5ID0gMDsKKwl9CisJaWYgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC52aHRDYXBhYmlsaXR5KSB7CisJCWlmIChwc2Vzc2lvbkVudHJ5LT50eEJGSW5pRmVhdHVyZUVuYWJsZWQgJiYKKwkJCQlwQXNzb2NSZXEtPlZIVENhcHMuc3VCZWFtRm9ybWVyQ2FwKQorCQkJcFN0YURzLT52aHRCZWFtRm9ybWVyQ2FwYWJsZSA9IDE7CisJCWVsc2UKKwkJCXBTdGFEcy0+dmh0QmVhbUZvcm1lckNhcGFibGUgPSAwOworCQlpZiAocHNlc3Npb25FbnRyeS0+ZW5hYmxlX3N1X3R4X2Jmb3JtZXIgJiYKKwkJCQlwQXNzb2NSZXEtPlZIVENhcHMuc3VCZWFtZm9ybWVlQ2FwKQorCQkJcFN0YURzLT52aHRfc3VfYmZlZV9jYXBhYmxlID0gMTsKKwkJZWxzZQorCQkJcFN0YURzLT52aHRfc3VfYmZlZV9jYXBhYmxlID0gMDsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlpZiAobGltX3BvcHVsYXRlX21hdGNoaW5nX3JhdGVfc2V0KHBNYWMsCisJCQkJCSAgIHBTdGFEcywKKwkJCQkJICAgJihwQXNzb2NSZXEtPnN1cHBvcnRlZFJhdGVzKSwKKwkJCQkJICAgJihwQXNzb2NSZXEtPmV4dGVuZGVkUmF0ZXMpLAorCQkJCQkgICBwQXNzb2NSZXEtPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsCisJCQkJCSAgIHBzZXNzaW9uRW50cnksICZwQXNzb2NSZXEtPlZIVENhcHMpCisJICAgICE9IGVTSVJfU1VDQ0VTUykKKyNlbHNlCisKKwlpZiAobGltX3BvcHVsYXRlX21hdGNoaW5nX3JhdGVfc2V0KHBNYWMsCisJCQkJCSAgIHBTdGFEcywKKwkJCQkJICAgJihwQXNzb2NSZXEtPnN1cHBvcnRlZFJhdGVzKSwKKwkJCQkJICAgJihwQXNzb2NSZXEtPmV4dGVuZGVkUmF0ZXMpLAorCQkJCQkgICBwQXNzb2NSZXEtPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsCisJCQkJCSAgIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyNlbmRpZgorCXsKKwkJLyogQ291bGQgbm90IHVwZGF0ZSBoYXNoIHRhYmxlIGVudHJ5IGF0IERQSCB3aXRoIHJhdGVzZXQgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoImNvdWxkIG5vdCB1cGRhdGUgaGFzaCBlbnRyeSBhdCBEUEggZm9yIGFpZD0lZCwgTWFjQWRkcjogIgorCQkJCU1BQ19BRERSRVNTX1NUUiksIHBlZXJJZHgsIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisKKwkJLyogUmVsZWFzZSBBSUQgKi8KKwkJbGltX3JlbGVhc2VfcGVlcl9pZHgocE1hYywgcGVlcklkeCwgcHNlc3Npb25FbnRyeSk7CisKKwkJbGltX3JlamVjdF9hc3NvY2lhdGlvbihwTWFjLCBwSGRyLT5zYSwKKwkJCQkgICAgICAgc3ViVHlwZSwgdHJ1ZSwgYXV0aFR5cGUsIHBlZXJJZHgsIHRydWUsCisJCQkJICAgICAgICh0U2lyUmVzdWx0Q29kZXMpCisJCQkJICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeSk7CisKKwkJaWYgKHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxKQorCQkJcEFzc29jUmVxID0KKwkJCQlwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcVtwU3RhRHMtPmFzc29jSWRdOworCQlnb3RvIGVycm9yOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmIChwQXNzb2NSZXEtPm9wZXJNb2RlLnByZXNlbnQpIHsKKwkJcFN0YURzLT52aHRTdXBwb3J0ZWRSeE5zcyA9IHBBc3NvY1JlcS0+b3Blck1vZGUucnhOU1MgKyAxOworCX0gZWxzZSB7CisJCXBTdGFEcy0+dmh0U3VwcG9ydGVkUnhOc3MgPQorCQkJKChwU3RhRHMtPnN1cHBvcnRlZFJhdGVzLnZodFJ4TUNTTWFwICYgTUNTTUFQTUFTSzJ4MikKKwkJCSA9PSBNQ1NNQVBNQVNLMngyKSA/IDEgOiAyOworCX0KKyNlbmRpZgorCisJLyogLyBBZGQgU1RBIGNvbnRleHQgYXQgTUFDIEhXIChCTVUsIFJIUCAmIFRGUCkgKi8KKworCXBTdGFEcy0+cW9zTW9kZSA9IGZhbHNlOworCXBTdGFEcy0+bGxlRW5hYmxlZCA9IGZhbHNlOworCWlmIChwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnFvcyAmJiAocW9zTW9kZSA9PSBlSEFMX1NFVCkpIHsKKwkJcFN0YURzLT5sbGVFbmFibGVkID0gdHJ1ZTsKKwkJcFN0YURzLT5xb3NNb2RlID0gdHJ1ZTsKKwl9CisKKwlwU3RhRHMtPndtZUVuYWJsZWQgPSBmYWxzZTsKKwlwU3RhRHMtPndzbUVuYWJsZWQgPSBmYWxzZTsKKwlsaW1HZXRXbWVNb2RlKHBzZXNzaW9uRW50cnksICZ3bWVNb2RlKTsKKwlpZiAoKCFwU3RhRHMtPmxsZUVuYWJsZWQpICYmIHBBc3NvY1JlcS0+d21lSW5mb1ByZXNlbnQKKwkgICAgJiYgKHdtZU1vZGUgPT0gZUhBTF9TRVQpKSB7CisJCXBTdGFEcy0+d21lRW5hYmxlZCA9IHRydWU7CisJCXBTdGFEcy0+cW9zTW9kZSA9IHRydWU7CisJCWxpbUdldFdzbU1vZGUocHNlc3Npb25FbnRyeSwgJndzbU1vZGUpOworCQkvKiBXTU1fQVBTRCAtIFdNTV9TQSByZWxhdGVkIHByb2Nlc3Npbmcgc2hvdWxkIGJlIHNlcGFyYXRlOyBXTU1fU0EgYW5kIFdNTV9BUFNECisJCSAgIGNhbiBjb2V4aXN0ICovCisJCWlmIChwQXNzb2NSZXEtPldNTUluZm9TdGF0aW9uLnByZXNlbnQpIHsKKwkJCS8qIGNoZWNrIHdoZXRoZXIgQVAgc3VwcG9ydHMgb3Igbm90ICovCisJCQlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgJiYKKwkJCSAgICAocHNlc3Npb25FbnRyeS0+YXBVYXBzZEVuYWJsZSA9PSAwKSAmJgorCQkJICAgIChwQXNzb2NSZXEtPldNTUluZm9TdGF0aW9uLmFjYmVfdWFwc2QgfHwKKwkJCSAgICBwQXNzb2NSZXEtPldNTUluZm9TdGF0aW9uLmFjYmtfdWFwc2QgfHwKKwkJCSAgICBwQXNzb2NSZXEtPldNTUluZm9TdGF0aW9uLmFjdm9fdWFwc2QgfHwKKwkJCSAgICBwQXNzb2NSZXEtPldNTUluZm9TdGF0aW9uLmFjdmlfdWFwc2QpKSB7CisKKwkJCQkvKioKKwkJCQkgKiBSZWNlaXZlZCBSZS9Bc3NvY2lhdGlvbiBSZXF1ZXN0IGZyb20KKwkJCQkgKiBTVEEgd2hlbiBVUEFTRCBpcyBub3Qgc3VwcG9ydGVkLgorCQkJCSAqLworCQkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwoIkFQIGRvIG5vdCBzdXBwb3J0IFVBUFNEIHNvIHJlcGx5ICIKKwkJCQkJICAgInRvIFNUQSBhY2NvcmRpbmdseSIpKTsKKwkJCQkvKiB1cGRhdGUgVUFQU0QgYW5kIHNlbmQgaXQgdG8gTElNIHRvIGFkZCBTVEEgKi8KKwkJCQlwU3RhRHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8uYWNiZV91YXBzZCA9IDA7CisJCQkJcFN0YURzLT5xb3MuY2FwYWJpbGl0eS5xb3NJbmZvLmFjYmtfdWFwc2QgPSAwOworCQkJCXBTdGFEcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mby5hY3ZvX3VhcHNkID0gMDsKKwkJCQlwU3RhRHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8uYWN2aV91YXBzZCA9IDA7CisJCQkJcFN0YURzLT5xb3MuY2FwYWJpbGl0eS5xb3NJbmZvLm1heFNwTGVuID0gMDsKKworCQkJfSBlbHNlIHsKKwkJCQkvKiB1cGRhdGUgVUFQU0QgYW5kIHNlbmQgaXQgdG8gTElNIHRvIGFkZCBTVEEgKi8KKwkJCQlwU3RhRHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8uYWNiZV91YXBzZCA9CisJCQkJCXBBc3NvY1JlcS0+V01NSW5mb1N0YXRpb24uYWNiZV91YXBzZDsKKwkJCQlwU3RhRHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8uYWNia191YXBzZCA9CisJCQkJCXBBc3NvY1JlcS0+V01NSW5mb1N0YXRpb24uYWNia191YXBzZDsKKwkJCQlwU3RhRHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8uYWN2b191YXBzZCA9CisJCQkJCXBBc3NvY1JlcS0+V01NSW5mb1N0YXRpb24uYWN2b191YXBzZDsKKwkJCQlwU3RhRHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8uYWN2aV91YXBzZCA9CisJCQkJCXBBc3NvY1JlcS0+V01NSW5mb1N0YXRpb24uYWN2aV91YXBzZDsKKwkJCQlwU3RhRHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8ubWF4U3BMZW4gPQorCQkJCQlwQXNzb2NSZXEtPldNTUluZm9TdGF0aW9uLm1heF9zcF9sZW5ndGg7CisJCQl9CisJCX0KKwkJaWYgKHBBc3NvY1JlcS0+d3NtQ2FwYWJsZVByZXNlbnQgJiYgKHdzbU1vZGUgPT0gZUhBTF9TRVQpKQorCQkJcFN0YURzLT53c21FbmFibGVkID0gdHJ1ZTsKKworCX0KKwkvKiBSZS9Bc3NvYyBSZXNwb25zZSBmcmFtZSB0byByZXF1ZXN0aW5nIFNUQSAqLworCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlID0gc3ViVHlwZTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwlwU3RhRHMtPnJtZkVuYWJsZWQgPSAocG1mQ29ubmVjdGlvbikgPyAxIDogMDsKKwlwU3RhRHMtPnBtZlNhUXVlcnlTdGF0ZSA9IERQSF9TQV9RVUVSWV9OT1RfSU5fUFJPR1JFU1M7CisJdGltZXJJZC5maWVsZHMuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisJdGltZXJJZC5maWVsZHMucGVlcklkeCA9IHBlZXJJZHg7CisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19QTUZfU0FfUVVFUllfUkVUUllfSU5URVJWQUwsCisJCQkgICAgICZyZXRyeUludGVydmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIkNvdWxkIG5vdCByZXRyaWV2ZSBQTUYgU0EgUXVlcnkgcmV0cnkgaW50ZXJ2YWwgdmFsdWUiKSk7CisJCWxpbV9yZWplY3RfYXNzb2NpYXRpb24ocE1hYywgcEhkci0+c2EsIHN1YlR5cGUsIHRydWUsIGF1dGhUeXBlLAorCQkJCSAgICAgICBwZWVySWR4LCBmYWxzZSwKKwkJCQkgICAgICAgKHRTaXJSZXN1bHRDb2RlcykKKwkJCQkgICAgICAgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKFdOSV9DRkdfUE1GX1NBX1FVRVJZX1JFVFJZX0lOVEVSVkFMX1NUQU1JTiA+IHJldHJ5SW50ZXJ2YWwpIHsKKwkJcmV0cnlJbnRlcnZhbCA9IFdOSV9DRkdfUE1GX1NBX1FVRVJZX1JFVFJZX0lOVEVSVkFMX1NUQURFRjsKKwl9CisJaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcFN0YURzLT5wbWZTYVF1ZXJ5VGltZXIsICJQTUYgU0EgUXVlcnkgdGltZXIiLAorCQkJICAgIGxpbV9wbWZfc2FfcXVlcnlfdGltZXJfaGFuZGxlciwgdGltZXJJZC52YWx1ZSwKKwkJCSAgICBTWVNfTVNfVE9fVElDS1MoKHJldHJ5SW50ZXJ2YWwgKiAxMDI0KSAvIDEwMDApLAorCQkJICAgIDAsIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCBjcmVhdGUgUE1GIFNBIFF1ZXJ5IHRpbWVyIikpOworCQlsaW1fcmVqZWN0X2Fzc29jaWF0aW9uKHBNYWMsIHBIZHItPnNhLAorCQkJCSAgICAgICBzdWJUeXBlLCB0cnVlLCBhdXRoVHlwZSwKKwkJCQkgICAgICAgcGVlcklkeCwgZmFsc2UsCisJCQkJICAgICAgICh0U2lyUmVzdWx0Q29kZXMpCisJCQkJICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeSk7CisJCWdvdG8gZXJyb3I7CisJfQorI2VuZGlmCisKKwlpZiAocEFzc29jUmVxLT5FeHRDYXAucHJlc2VudCkgeworCQlsaW1fc2V0X3N0YWRzX3J0dF9jYXAocFN0YURzLAorCQkJKHN0cnVjdCBzX2V4dF9jYXAgKikgcEFzc29jUmVxLT5FeHRDYXAuYnl0ZXMsIHBNYWMpOworCX0gZWxzZSB7CisJCXBTdGFEcy0+dGltaW5nTWVhc0NhcCA9IDA7CisJCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJFeHRDYXAgbm90IHByZXNlbnQiKSk7KQorCX0KKworCS8qIEJUQU1QOiBTdG9yaW5nIHRoZSBwYXJzZWQgYXNzb2MgcmVxdWVzdCBpbiB0aGUgcHNlc3Npb25FbnRyeSBhcnJheSAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcSkKKwkJcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSA9IHBBc3NvY1JlcTsKKwlhc3NvY19yZXFfY29waWVkID0gdHJ1ZTsKKworCS8qIEJUQU1QOiBJZiBTVEEgY29udGV4dCBhbHJlYWR5IGV4aXN0IChpZS4gdXBkYXRlQ29udGV4dCA9IDEpCisJICogZm9yIHRoaXMgU1RBLCB0aGVuIHdlIHNob3VsZCBkZWxldGUgdGhlIG9sZCBvbmUsIGFuZCBhZGQKKwkgKiB0aGUgbmV3IFNUQS4gVGhpcyBpcyB0YWtlbiBjYXJlIG9mIGluIHRoZSBsaW1fZGVsX3N0YSgpIHJvdXRpbmUuCisJICoKKwkgKiBQcmlvciB0byBCVEFNUCwgd2Ugd2VyZSBzZXR0aW5nIHRoaXMgZmxhZyBzbyB0aGF0IHdoZW4KKwkgKiBQRSByZWNlaXZlcyBTTUVfQVNTT0NfQ05GLCBhbmQgaWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlbgorCSAqIFBFIHNoYWxsIGRlbGV0ZSB0aGUgb2xkIHN0YXRpb24gYW5kIHRoZW4gYWRkLiBCdXQgbm93IGluCisJICogQlRBTVAsIHdlJ3JlIGRpcmVjdGx5IGFkZGluZyBzdGF0aW9uIGJlZm9yZSB3YWl0aW5nIGZvcgorCSAqIFNNRV9BU1NPQ19DTkYsIHNvIHdlIGNhbiBkbyB0aGlzIG5vdy4KKwkgKi8KKwlpZiAoIXVwZGF0ZUNvbnRleHQpIHsKKwkJcFN0YURzLT5tbG1TdGFDb250ZXh0LnVwZGF0ZUNvbnRleHQgPSAwOworCisJCS8qIEJUQU1QOiBBZGQgU1RBIGNvbnRleHQgYXQgSFcgLSBpc3N1ZSBXTUFfQUREX1NUQV9SRVEgdG8gSEFMICovCisJCWlmIChsaW1fYWRkX3N0YShwTWFjLCBwU3RhRHMsIGZhbHNlLCBwc2Vzc2lvbkVudHJ5KSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoImNvdWxkIG5vdCBBZGQgU1RBIHdpdGggYXNzb2NJZD0lZCIpLAorCQkJCXBTdGFEcy0+YXNzb2NJZCk7CisJCQlsaW1fcmVqZWN0X2Fzc29jaWF0aW9uKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwKKwkJCQkJICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlLAorCQkJCQkgICAgICAgdHJ1ZSwKKwkJCQkJICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKwkJCQkJICAgICAgIHBTdGFEcy0+YXNzb2NJZCwgdHJ1ZSwKKwkJCQkJICAgICAgICh0U2lyUmVzdWx0Q29kZXMpCisJCQkJCSAgICAgICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsCisJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKworCQkJaWYgKHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxKQorCQkJCXBBc3NvY1JlcSA9IHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxWworCQkJCQkJCXBTdGFEcy0+YXNzb2NJZF07CisJCQlnb3RvIGVycm9yOworCQl9CisJfSBlbHNlIHsKKwkJcFN0YURzLT5tbG1TdGFDb250ZXh0LnVwZGF0ZUNvbnRleHQgPSAxOworCisJCW1sbVByZXZTdGF0ZSA9IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZTsKKworCQkvKiBBcyBwZXIgdGhlIEhBTC9GVyBuZWVkcyB0aGUgcmVhc3NvYyByZXEgbmVlZCBub3QgYmUgY2FsbGluZyBsaW1fZGVsX3N0YSAqLworCQlpZiAoc3ViVHlwZSAhPSBMSU1fUkVBU1NPQykgeworCQkJLyogd2UgbmVlZCB0byBzZXQgdGhlIG1sbVN0YXRlIGhlcmUgaW4gb3JkZXIgZGlmZmVyZW50aWF0ZSBpbiBsaW1fZGVsX3N0YS4gKi8KKwkJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9CisJCQkJZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEU7CisJCQlpZiAobGltX2RlbF9zdGEocE1hYywgcFN0YURzLCB0cnVlLCBwc2Vzc2lvbkVudHJ5KSAhPQorCQkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwKKwkJCQkJCSgiY291bGQgbm90IERFTCBTVEEgd2l0aCBhc3NvY0lkPSVkIHN0YUlkICVkIiksCisJCQkJCXBTdGFEcy0+YXNzb2NJZCwgcFN0YURzLT5zdGFJbmRleCk7CisJCQkJbGltX3JlamVjdF9hc3NvY2lhdGlvbihwTWFjLCBwU3RhRHMtPnN0YUFkZHIsCisJCQkJCQkgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LgorCQkJCQkJICAgICAgIHN1YlR5cGUsIHRydWUsCisJCQkJCQkgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LgorCQkJCQkJICAgICAgIGF1dGhUeXBlLCBwU3RhRHMtPmFzc29jSWQsCisJCQkJCQkgICAgICAgdHJ1ZSwKKwkJCQkJCSAgICAgICAodFNpclJlc3VsdENvZGVzKQorCQkJCQkJICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywKKwkJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKworCQkJCS8qIFJlc3RvcmluZyB0aGUgc3RhdGUgYmFjay4gKi8KKwkJCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPSBtbG1QcmV2U3RhdGU7CisJCQkJaWYgKHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxKQorCQkJCQlwQXNzb2NSZXEgPQorCQkJCQkJcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbCisJCQkJCQkJcFN0YURzLT5hc3NvY0lkXTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogbWxtU3RhdGUgaXMgY2hhbmdlZCBpbiBsaW1fYWRkX3N0YSBjb250ZXh0ICovCisJCQkvKiB1c2UgdGhlIHNhbWUgQUlELCBhbHJlYWR5IGFsbG9jYXRlZCAqLworCQkJaWYgKGxpbV9hZGRfc3RhKHBNYWMsIHBTdGFEcywgZmFsc2UsIHBzZXNzaW9uRW50cnkpICE9CisJCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTCgiQ291bGQgbm90IEFkZFN0YSB3aXRoIGFzc29jSWQ9ICVkIgorCQkJCQkgICAic3RhSWQgJWQiKSwKKwkJCQkJcFN0YURzLT5hc3NvY0lkLCBwU3RhRHMtPnN0YUluZGV4KTsKKwkJCQlsaW1fcmVqZWN0X2Fzc29jaWF0aW9uKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwKKwkJCQkJCSAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuCisJCQkJCQkgICAgICAgc3ViVHlwZSwgdHJ1ZSwKKwkJCQkJCSAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuCisJCQkJCQkgICAgICAgYXV0aFR5cGUsIHBTdGFEcy0+YXNzb2NJZCwKKwkJCQkJCSAgICAgICB0cnVlLAorCQkJCQkJICAgICAgICh0U2lyUmVzdWx0Q29kZXMpCisJCQkJCQkgICAgICAgZVNJUl9NQUNfV01FX1JFRlVTRURfU1RBVFVTLAorCQkJCQkJICAgICAgIHBzZXNzaW9uRW50cnkpOworCisJCQkJLyogUmVzdG9yaW5nIHRoZSBzdGF0ZSBiYWNrLiAqLworCQkJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9IG1sbVByZXZTdGF0ZTsKKwkJCQlpZiAocHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXEpCisJCQkJCXBBc3NvY1JlcSA9CisJCQkJCSAgICBwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcVsKKwkJCQkJCQlwU3RhRHMtPmFzc29jSWRdOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJfQorCisJfQorCisJLyogQWRkU3RhIGlzIHN1Y2VzcyBoZXJlICovCisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpICYmCisJICAgIElTX0RPVDExX01PREVfSFQocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSAmJgorCSAgICBwQXNzb2NSZXEtPkhUQ2Fwcy5wcmVzZW50ICYmIHBBc3NvY1JlcS0+d21lSW5mb1ByZXNlbnQpIHsKKwkJLyoqIFVwZGF0ZSBpbiB0aGUgSEFMIFN0YXRpb24gVGFibGUgZm9yIHRoZSBVcGRhdGUgb2YgdGhlIFByb3RlY3Rpb24gTW9kZSAqLworCQlsaW1fcG9zdF9zbV9zdGF0ZV91cGRhdGUocE1hYywgcFN0YURzLT5zdGFJbmRleCwKKwkJCQkJIHBTdGFEcy0+aHRNSU1PUFNTdGF0ZSwKKwkJCQkJIHBTdGFEcy0+c3RhQWRkciwKKwkJCQkJIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCk7CisJfQorCisJcmV0dXJuOworCitlcnJvcjoKKwlpZiAocEFzc29jUmVxICE9IE5VTEwpIHsKKwkJaWYgKHBBc3NvY1JlcS0+YXNzb2NSZXFGcmFtZSkgeworCQkJY2RmX21lbV9mcmVlKHBBc3NvY1JlcS0+YXNzb2NSZXFGcmFtZSk7CisJCQlwQXNzb2NSZXEtPmFzc29jUmVxRnJhbWUgPSBOVUxMOworCQkJcEFzc29jUmVxLT5hc3NvY1JlcUZyYW1lTGVuZ3RoID0gMDsKKwkJfQorCisJCWNkZl9tZW1fZnJlZShwQXNzb2NSZXEpOworCQkvKiB0byBhdm9pZCBkb3VibGUgZnJlZSAqLworCQlpZiAoYXNzb2NfcmVxX2NvcGllZCAmJiBwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcSkKKwkJCXBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGFEcy0+YXNzb2NJZF0gPSBOVUxMOworCX0KKworCS8qIElmIGl0IGlzIG5vdCBkdXBsaWNhdGUgQXNzb2MgcmVxdWVzdCB0aGVuIG9ubHkgbWFrZSB0byBOdWxsICovCisJaWYgKChwU3RhRHMgIT0gTlVMTCkgJiYKKwkgICAgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPSBlTElNX01MTV9XVF9BRERfU1RBX1JTUF9TVEFURSkpIHsKKwkJaWYgKHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxICE9IE5VTEwpIHsKKwkJCXBUZW1wQXNzb2NSZXEgPQorCQkJCXBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGFEcy0+YXNzb2NJZF07CisJCQlpZiAocFRlbXBBc3NvY1JlcSAhPSBOVUxMKSB7CisJCQkJaWYgKHBUZW1wQXNzb2NSZXEtPmFzc29jUmVxRnJhbWUpIHsKKwkJCQkJY2RmX21lbV9mcmVlKHBUZW1wQXNzb2NSZXEtPgorCQkJCQkJCWFzc29jUmVxRnJhbWUpOworCQkJCQlwVGVtcEFzc29jUmVxLT5hc3NvY1JlcUZyYW1lID0gTlVMTDsKKwkJCQkJcFRlbXBBc3NvY1JlcS0+YXNzb2NSZXFGcmFtZUxlbmd0aCA9IDA7CisJCQkJfQorCQkJCWNkZl9tZW1fZnJlZShwVGVtcEFzc29jUmVxKTsKKwkJCQlwc2Vzc2lvbkVudHJ5LT4KKwkJCQkJcGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm47CisKK30gLyoqKiBlbmQgbGltX3Byb2Nlc3NfYXNzb2NfcmVxX2ZyYW1lKCkgKioqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKy8qKgorICogbGltX2ZpbGxfYXNzb2NfaW5kX3dhcGlfaW5mbygpLSBVcGRhdGVzIFdBUEkgZGF0YSBpbiBhc3NvYyBpbmRpY2F0aW9uCisgKiBAbWFjX2N0eDogR2xvYmFsIE1hYyBjb250ZXh0CisgKiBAYXNzb2NfcmVxOiBwb2ludGVyIHRvIGFzc29jaWF0aW9uIHJlcXVlc3QKKyAqIEBhc3NvY19pbmQ6IFBvaW50ZXIgdG8gYXNzb2NpYXRpb24gaW5kaWNhdGlvbgorICogQHdwc2llOiBXUFMgSUUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgV0FQSSBtZXRhIGRhdGEgaW4gYXNzb2NpYXRpb24gaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBzZW50IHRvIFNNRS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX2ZpbGxfYXNzb2NfaW5kX3dhcGlfaW5mbyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXRwU2lyQXNzb2NSZXEgYXNzb2NfcmVxLCB0cExpbU1sbUFzc29jSW5kIGFzc29jX2luZCwKKwl1aW50OF90ICp3cHNpZSkKK3sKKwlpZiAoYXNzb2NfcmVxLT53YXBpUHJlc2VudCAmJiAoTlVMTCA9PSB3cHNpZSkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cyLAorCQkJRkwoIlJlY2VpdmVkIFdBUEkgSUUgbGVuZ3RoIGluIEFzc29jIFJlcSBpcyAlZCIpLAorCQkJYXNzb2NfcmVxLT53YXBpLmxlbmd0aCk7CisJCWFzc29jX2luZC0+d2FwaUlFLndhcGlJRWRhdGFbMF0gPSBTSVJfTUFDX1dBUElfRUlEOworCQlhc3NvY19pbmQtPndhcGlJRS53YXBpSUVkYXRhWzFdID0gYXNzb2NfcmVxLT53YXBpLmxlbmd0aDsKKwkJY2RmX21lbV9jb3B5KCZhc3NvY19pbmQtPndhcGlJRS53YXBpSUVkYXRhWzJdLAorCQkJYXNzb2NfcmVxLT53YXBpLmluZm8sIGFzc29jX3JlcS0+d2FwaS5sZW5ndGgpOworCQlhc3NvY19pbmQtPndhcGlJRS5sZW5ndGggPQorCQkJMiArIGFzc29jX3JlcS0+d2FwaS5sZW5ndGg7CisJfQorCXJldHVybjsKK30KKyNlbmRpZgorCisvKioKKyAqIGxpbV9maWxsX2Fzc29jX2luZF92aHRfaW5mbygpIC0gVXBkYXRlcyBWSFQgaW5mb3JtYXRpb24gaW4gYXNzb2MgaW5kaWNhdGlvbgorICogQG1hY19jdHg6IEdsb2JhbCBNYWMgY29udGV4dAorICogQGFzc29jX3JlcTogcG9pbnRlciB0byBhc3NvY2lhdGlvbiByZXF1ZXN0CisgKiBAc2Vzc2lvbl9lbnRyeTogUEUgc2Vzc2lvbiBlbnRyeQorICogQGFzc29jX2luZDogUG9pbnRlciB0byBhc3NvY2lhdGlvbiBpbmRpY2F0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIFZIVCBpbmZvcm1hdGlvbiBpbiBhc3NvY2lhdGlvbiBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqIHNlbnQgdG8gU01FLgorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBsaW1fZmlsbF9hc3NvY19pbmRfdmh0X2luZm8odHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5LCB0cFNpckFzc29jUmVxIGFzc29jX3JlcSwKKwl0cExpbU1sbUFzc29jSW5kIGFzc29jX2luZCkKK3sKKwl1aW50OF90IGNoYW47CisKKwlpZiAoc2Vzc2lvbl9lbnRyeS0+bGltUkZCYW5kID09IFNJUl9CQU5EXzJfNF9HSFopIHsKKwkJaWYgKHNlc3Npb25fZW50cnktPnZodENhcGFiaWxpdHkKKwkJCSYmIGFzc29jX3JlcS0+VkhUQ2Fwcy5wcmVzZW50KQorCQkJYXNzb2NfaW5kLT5jaGFuX2luZm8uaW5mbyA9IE1PREVfMTFBQ19WSFQyMDsKKwkJZWxzZSBpZiAoc2Vzc2lvbl9lbnRyeS0+aHRDYXBhYmlsaXR5CisJCQkJJiYgYXNzb2NfcmVxLT5IVENhcHMucHJlc2VudCkKKwkJCWFzc29jX2luZC0+Y2hhbl9pbmZvLmluZm8gPSBNT0RFXzExTkdfSFQyMDsKKwkJZWxzZQorCQkJYXNzb2NfaW5kLT5jaGFuX2luZm8uaW5mbyA9IE1PREVfMTFHOworCX0gZWxzZSB7CisJCWlmIChzZXNzaW9uX2VudHJ5LT52aHRDYXBhYmlsaXR5CisJCQkmJiBhc3NvY19yZXEtPlZIVENhcHMucHJlc2VudCkgeworCQkJaWYgKChzZXNzaW9uX2VudHJ5LT5jaF93aWR0aCA+IENIX1dJRFRIXzQwTUhaKQorCQkJCSYmIGFzc29jX3JlcS0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgeworCQkJCWNoYW4gPSBzZXNzaW9uX2VudHJ5LT5jaF9jZW50ZXJfZnJlcV9zZWcwOworCQkJCWFzc29jX2luZC0+Y2hhbl9pbmZvLmJhbmRfY2VudGVyX2ZyZXExID0KKwkJCQkJY2RzX2NoYW5fdG9fZnJlcShjaGFuKTsKKwkJCQlhc3NvY19pbmQtPmNoYW5faW5mby5pbmZvID0gTU9ERV8xMUFDX1ZIVDgwOworCQkJfSBlbHNlIGlmICgoc2Vzc2lvbl9lbnRyeS0+Y2hfd2lkdGggPT0gQ0hfV0lEVEhfNDBNSFopCisJCQkJJiYgYXNzb2NfcmVxLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KSB7CisJCQkJYXNzb2NfaW5kLT5jaGFuX2luZm8uaW5mbyA9IE1PREVfMTFBQ19WSFQ0MDsKKwkJCQlpZiAoc2Vzc2lvbl9lbnRyeS0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID09CisJCQkJCVBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWSkKKwkJCQkJYXNzb2NfaW5kLT5jaGFuX2luZm8uYmFuZF9jZW50ZXJfZnJlcTEKKwkJCQkJCSs9IDEwOworCQkJCWVsc2UKKwkJCQkJYXNzb2NfaW5kLT5jaGFuX2luZm8uYmFuZF9jZW50ZXJfZnJlcTEKKwkJCQkJCS09IDEwOworCQkJfSBlbHNlIHsKKwkJCQlhc3NvY19pbmQtPmNoYW5faW5mby5pbmZvID0gTU9ERV8xMUFDX1ZIVDIwOworCQkJfQorCQl9IGVsc2UgaWYgKHNlc3Npb25fZW50cnktPmh0Q2FwYWJpbGl0eQorCQkJCSYmIGFzc29jX3JlcS0+SFRDYXBzLnByZXNlbnQpIHsKKwkJCWlmICgoc2Vzc2lvbl9lbnRyeS0+Y2hfd2lkdGggPT0gQ0hfV0lEVEhfNDBNSFopCisJCQkmJiBhc3NvY19yZXEtPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpIHsKKwkJCQlhc3NvY19pbmQtPmNoYW5faW5mby5pbmZvID0gTU9ERV8xMU5BX0hUNDA7CisJCQkJaWYgKHNlc3Npb25fZW50cnktPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9PQorCQkJCQlQSFlfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlkpCisJCQkJCWFzc29jX2luZC0+Y2hhbl9pbmZvLmJhbmRfY2VudGVyX2ZyZXExCisJCQkJCQkrPSAxMDsKKwkJCQllbHNlCisJCQkJCWFzc29jX2luZC0+Y2hhbl9pbmZvLmJhbmRfY2VudGVyX2ZyZXExCisJCQkJCQktPSAxMDsKKwkJCX0gZWxzZSB7CisJCQkJYXNzb2NfaW5kLT5jaGFuX2luZm8uaW5mbyA9IE1PREVfMTFOQV9IVDIwOworCQkJfQorCQl9IGVsc2UgeworCQkJYXNzb2NfaW5kLT5jaGFuX2luZm8uaW5mbyA9IE1PREVfMTFBOworCQl9CisJfQorCXJldHVybjsKK30KKworLyoqCisgKiBsaW1fc2VuZF9tbG1fYXNzb2NfaW5kKCkgLSBTZW5kcyBhc3NvYyBpbmRpY2F0aW9uIHRvIFNNRQorICogQG1hY19jdHg6IEdsb2JhbCBNYWMgY29udGV4dAorICogQHN0YV9kczogU3RhdGlvbiBEUEggaGFzaCBlbnRyeQorICogQHNlc3Npb25fZW50cnk6IFBFIHNlc3Npb24gZW50cnkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGVpdGhlciBMSU1fTUxNX0FTU09DX0lORAorICogb3IgTElNX01MTV9SRUFTU09DX0lORCB0byBTTUUuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgbGltX3NlbmRfbWxtX2Fzc29jX2luZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXRwRHBoSGFzaE5vZGUgc3RhX2RzLCB0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXRwTGltTWxtQXNzb2NJbmQgYXNzb2NfaW5kID0gTlVMTDsKKwl0cFNpckFzc29jUmVxIGFzc29jX3JlcTsKKwl1aW50MTZfdCB0ZW1wLCByc25fbGVuOworCXVpbnQzMl90IHBoeV9tb2RlOworCXVpbnQ4X3Qgc3ViX3R5cGU7CisJdWludDhfdCAqd3BzaWUgPSBOVUxMOworCXVpbnQzMl90IHRtcDsKKworCS8qIEdldCBhIGNvcHkgb2YgdGhlIGFscmVhZHkgcGFyc2VkIEFzc29jIFJlcXVlc3QgKi8KKwlhc3NvY19yZXEgPQorCQkodHBTaXJBc3NvY1JlcSkgc2Vzc2lvbl9lbnRyeS0+cGFyc2VkQXNzb2NSZXFbc3RhX2RzLT5hc3NvY0lkXTsKKworCS8qIEdldCB0aGUgcGh5X21vZGUgKi8KKwlsaW1fZ2V0X3BoeV9tb2RlKG1hY19jdHgsICZwaHlfbW9kZSwgc2Vzc2lvbl9lbnRyeSk7CisKKwkvKiBEZXRlcm1pbmUgaWYgaXRzIEFzc29jIG9yIFJlQXNzb2MgUmVxdWVzdCAqLworCWlmIChhc3NvY19yZXEtPnJlYXNzb2NSZXF1ZXN0ID09IDEpCisJCXN1Yl90eXBlID0gTElNX1JFQVNTT0M7CisJZWxzZQorCQlzdWJfdHlwZSA9IExJTV9BU1NPQzsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlNlc3Npb25pZCAlZCBzc2lkICVzIHN1Yl90eXBlICVkIEFzc29jaWQgJWQgc3RhQWRkciAiCisJCSBNQUNfQUREUkVTU19TVFIpLCBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJYXNzb2NfcmVxLT5zc0lkLnNzSWQsIHN1Yl90eXBlLCBzdGFfZHMtPmFzc29jSWQsCisJCU1BQ19BRERSX0FSUkFZKHN0YV9kcy0+c3RhQWRkcikpOworCisJaWYgKHN1Yl90eXBlID09IExJTV9BU1NPQyB8fCBzdWJfdHlwZSA9PSBMSU1fUkVBU1NPQykgeworCQl0ZW1wID0gc2l6ZW9mKHRMaW1NbG1Bc3NvY0luZCk7CisKKwkJYXNzb2NfaW5kID0gY2RmX21lbV9tYWxsb2ModGVtcCk7CisJCWlmIChOVUxMID09IGFzc29jX2luZCkgeworCQkJbGltX3JlbGVhc2VfcGVlcl9pZHgobWFjX2N0eCwgc3RhX2RzLT5hc3NvY0lkLAorCQkJCXNlc3Npb25fZW50cnkpOworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGFzc29jX2luZCIpKTsKKwkJCXJldHVybjsKKwkJfQorCQljZGZfbWVtX3NldChhc3NvY19pbmQsIHRlbXAsIDApOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgYXNzb2NfaW5kLT5wZWVyTWFjQWRkciwKKwkJCSh1aW50OF90ICopIHN0YV9kcy0+c3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCWFzc29jX2luZC0+YWlkID0gc3RhX2RzLT5hc3NvY0lkOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJmFzc29jX2luZC0+c3NJZCwKKwkJCSh1aW50OF90ICopICYoYXNzb2NfcmVxLT5zc0lkKSwKKwkJCWFzc29jX3JlcS0+c3NJZC5sZW5ndGggKyAxKTsKKwkJYXNzb2NfaW5kLT5zZXNzaW9uSWQgPSBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZDsKKwkJYXNzb2NfaW5kLT5hdXRoVHlwZSA9IHN0YV9kcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZTsKKwkJYXNzb2NfaW5kLT5jYXBhYmlsaXR5SW5mbyA9IGFzc29jX3JlcS0+Y2FwYWJpbGl0eUluZm87CisKKwkJLyogRmlsbCBpbiBSU04gSUUgaW5mb3JtYXRpb24gKi8KKwkJYXNzb2NfaW5kLT5yc25JRS5sZW5ndGggPSAwOworCQkvKiBpZiBXUFMgSUUgaXMgcHJlc2VudCwgaWdub3JlIFJTTiBJRSAqLworCQlpZiAoYXNzb2NfcmVxLT5hZGRJRVByZXNlbnQgJiYgYXNzb2NfcmVxLT5hZGRJRS5sZW5ndGgpIHsKKwkJCXdwc2llID0gbGltR2V0V3NjSUVQdHIobWFjX2N0eCwKKwkJCQlhc3NvY19yZXEtPmFkZElFLmFkZElFZGF0YSwKKwkJCQlhc3NvY19yZXEtPmFkZElFLmxlbmd0aCk7CisJCX0KKwkJaWYgKGFzc29jX3JlcS0+cnNuUHJlc2VudCAmJiAoTlVMTCA9PSB3cHNpZSkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwgRkwoIkFzc29jIFJlcSBSU04gSUUgbGVuID0gJWQiKSwKKwkJCQlhc3NvY19yZXEtPnJzbi5sZW5ndGgpOworCQkJYXNzb2NfaW5kLT5yc25JRS5sZW5ndGggPSAyICsgYXNzb2NfcmVxLT5yc24ubGVuZ3RoOworCQkJYXNzb2NfaW5kLT5yc25JRS5yc25JRWRhdGFbMF0gPSBTSVJfTUFDX1JTTl9FSUQ7CisJCQlhc3NvY19pbmQtPnJzbklFLnJzbklFZGF0YVsxXSA9CisJCQkJYXNzb2NfcmVxLT5yc24ubGVuZ3RoOworCQkJY2RmX21lbV9jb3B5KCZhc3NvY19pbmQtPnJzbklFLnJzbklFZGF0YVsyXSwKKwkJCQlhc3NvY19yZXEtPnJzbi5pbmZvLAorCQkJCWFzc29jX3JlcS0+cnNuLmxlbmd0aCk7CisJCX0KKwkJLyogRmlsbCBpbiA4MDIuMTFoIHJlbGF0ZWQgaW5mbyAqLworCQlpZiAoYXNzb2NfcmVxLT5wb3dlckNhcGFiaWxpdHlQcmVzZW50CisJCQkmJiBhc3NvY19yZXEtPnN1cHBvcnRlZENoYW5uZWxzUHJlc2VudCkgeworCQkJYXNzb2NfaW5kLT5zcGVjdHJ1bU1ndEluZGljYXRvciA9IGVTSVJfVFJVRTsKKwkJCWFzc29jX2luZC0+cG93ZXJDYXAubWluVHhQb3dlciA9CisJCQkJYXNzb2NfcmVxLT5wb3dlckNhcGFiaWxpdHkubWluVHhQb3dlcjsKKwkJCWFzc29jX2luZC0+cG93ZXJDYXAubWF4VHhQb3dlciA9CisJCQkJYXNzb2NfcmVxLT5wb3dlckNhcGFiaWxpdHkubWF4VHhQb3dlcjsKKwkJCWxpbV9jb252ZXJ0X3N1cHBvcnRlZF9jaGFubmVscyhtYWNfY3R4LCBhc3NvY19pbmQsCisJCQkJIGFzc29jX3JlcSk7CisJCX0gZWxzZSB7CisJCQlhc3NvY19pbmQtPnNwZWN0cnVtTWd0SW5kaWNhdG9yID0gZVNJUl9GQUxTRTsKKwkJfQorCisJCS8qIFRoaXMgY2hlY2sgaXMgdG8gYXZvaWQgZXh0cmEgU2VjIElFcyBwcmVzZW50IGluY2FzZSBvZiBXUFMgKi8KKwkJaWYgKGFzc29jX3JlcS0+d3BhUHJlc2VudCAmJiAoTlVMTCA9PSB3cHNpZSkpIHsKKwkJCXJzbl9sZW4gPSBhc3NvY19pbmQtPnJzbklFLmxlbmd0aDsKKwkJCWlmICgocnNuX2xlbiArIGFzc29jX3JlcS0+d3BhLmxlbmd0aCkKKwkJCQk+PSBTSVJfTUFDX01BWF9JRV9MRU5HVEgpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJyc25JRWRhdGEgaW5kZXggb3V0IG9mIGJvdW5kcyAlZCIpLAorCQkJCQlyc25fbGVuKTsKKwkJCQljZGZfbWVtX2ZyZWUoYXNzb2NfaW5kKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlhc3NvY19pbmQtPnJzbklFLnJzbklFZGF0YVtyc25fbGVuXSA9CisJCQkJU0lSX01BQ19XUEFfRUlEOworCQkJYXNzb2NfaW5kLT5yc25JRS5yc25JRWRhdGFbcnNuX2xlbiArIDFdCisJCQkJPSBhc3NvY19yZXEtPndwYS5sZW5ndGg7CisJCQljZGZfbWVtX2NvcHkoCisJCQkJJmFzc29jX2luZC0+cnNuSUUucnNuSUVkYXRhW3Jzbl9sZW4gKyAyXSwKKwkJCQlhc3NvY19yZXEtPndwYS5pbmZvLCBhc3NvY19yZXEtPndwYS5sZW5ndGgpOworCQkJYXNzb2NfaW5kLT5yc25JRS5sZW5ndGggKz0gMiArIGFzc29jX3JlcS0+d3BhLmxlbmd0aDsKKwkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJCWxpbV9maWxsX2Fzc29jX2luZF93YXBpX2luZm8obWFjX2N0eCwgYXNzb2NfcmVxLCBhc3NvY19pbmQsCisJCQl3cHNpZSk7CisjZW5kaWYKKworCQlhc3NvY19pbmQtPmFkZElFLmxlbmd0aCA9IDA7CisJCWlmIChhc3NvY19yZXEtPmFkZElFUHJlc2VudCkgeworCQkJY2RmX21lbV9jb3B5KCZhc3NvY19pbmQtPmFkZElFLmFkZElFZGF0YSwKKwkJCQlhc3NvY19yZXEtPmFkZElFLmFkZElFZGF0YSwKKwkJCQlhc3NvY19yZXEtPmFkZElFLmxlbmd0aCk7CisJCQlhc3NvY19pbmQtPmFkZElFLmxlbmd0aCA9IGFzc29jX3JlcS0+YWRkSUUubGVuZ3RoOworCQl9CisJCS8qCisJCSAqIEFkZCBIVCBDYXBhYmlsaXRpZXMgaW50byBhZGRJRSBmb3IgT0JTUworCQkgKiBwcm9jZXNzaW5nIGluIGhvc3RhcGQKKwkJICovCisJCWlmIChhc3NvY19yZXEtPkhUQ2Fwcy5wcmVzZW50KSB7CisJCQlyc25fbGVuID0gYXNzb2NfaW5kLT5hZGRJRS5sZW5ndGg7CisJCQlpZiAoYXNzb2NfaW5kLT5hZGRJRS5sZW5ndGggKyBET1QxMUZfSUVfSFRDQVBTX01JTl9MRU4KKwkJCQkrIDIgPCBTSVJfTUFDX01BWF9JRV9MRU5HVEgpIHsKKwkJCQlhc3NvY19pbmQtPmFkZElFLmFkZElFZGF0YVtyc25fbGVuXSA9CisJCQkJCVNJUl9NQUNfSFRfQ0FQQUJJTElUSUVTX0VJRDsKKwkJCQlhc3NvY19pbmQtPmFkZElFLmFkZElFZGF0YVtyc25fbGVuICsgMV0gPQorCQkJCQlET1QxMUZfSUVfSFRDQVBTX01JTl9MRU47CisJCQkJY2RmX21lbV9jb3B5KAorCQkJCQkmYXNzb2NfaW5kLT5hZGRJRS5hZGRJRWRhdGFbcnNuX2xlbisyXSwKKwkJCQkJKCh1aW50OF90ICopJmFzc29jX3JlcS0+SFRDYXBzKSArIDEsCisJCQkJCURPVDExRl9JRV9IVENBUFNfTUlOX0xFTik7CisJCQkJYXNzb2NfaW5kLT5hZGRJRS5sZW5ndGggKz0KKwkJCQkJMiArIERPVDExRl9JRV9IVENBUFNfTUlOX0xFTjsKKwkJCX0gZWxzZSB7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCQlGTCgiRmFpbDpIVCBjYXBhYmlsaXRpZXMgSUUgdG8gYWRkSUUiKSk7CisJCQl9CisJCX0KKworCQlpZiAoYXNzb2NfcmVxLT53bWVJbmZvUHJlc2VudCkgeworCQkJaWYgKHdsYW5fY2ZnX2dldF9pbnQgKG1hY19jdHgsCisJCQkJKHVpbnQxNl90KSBXTklfQ0ZHX1dNRV9FTkFCTEVELCAmdG1wKQorCQkJCSE9IGVTSVJfU1VDQ0VTUykKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJCUZMKCJ3bGFuX2NmZ19nZXRfaW50IGZhaWxlZCBmb3IgaWQgJWQiKSwKKwkJCQkJV05JX0NGR19XTUVfRU5BQkxFRCk7CisKKwkJCS8qIGNoZWNrIHdoZXRoZXIgQVAgaXMgZW5hYmxlZCB3aXRoIFdNTSAqLworCQkJaWYgKHRtcCkKKwkJCQlhc3NvY19pbmQtPldtbVN0YUluZm9QcmVzZW50ID0gMTsKKwkJCWVsc2UKKwkJCQlhc3NvY19pbmQtPldtbVN0YUluZm9QcmVzZW50ID0gMDsKKwkJCS8qCisJCQkgKiBOb3RlOiB3ZSBhcmUgbm90IHJlamVjdGluZyBhc3NvY2lhdGlvbiBoZXJlCisJCQkgKiBiZWNhdXNlIElPVCB3aWxsIGZhaWwKKwkJCSAqLworCQl9CisJCS8qIFJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZXMgdG8gdXBwZXIgbGF5ZXIgKi8KKwkJYXNzb2NfaW5kLT5hc3NvY1JlcUxlbmd0aCA9IGFzc29jX3JlcS0+YXNzb2NSZXFGcmFtZUxlbmd0aDsKKwkJYXNzb2NfaW5kLT5hc3NvY1JlcVB0ciA9IGFzc29jX3JlcS0+YXNzb2NSZXFGcmFtZTsKKworCQlhc3NvY19pbmQtPmJlYWNvblB0ciA9IHNlc3Npb25fZW50cnktPmJlYWNvbjsKKwkJYXNzb2NfaW5kLT5iZWFjb25MZW5ndGggPSBzZXNzaW9uX2VudHJ5LT5iY25MZW47CisKKwkJYXNzb2NfaW5kLT5jaGFuX2luZm8uY2hhbl9pZCA9CisJCQlzZXNzaW9uX2VudHJ5LT5jdXJyZW50T3BlckNoYW5uZWw7CisJCWFzc29jX2luZC0+Y2hhbl9pbmZvLm1oeiA9CisJCQljZHNfY2hhbl90b19mcmVxKHNlc3Npb25fZW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCk7CisJCWFzc29jX2luZC0+Y2hhbl9pbmZvLmJhbmRfY2VudGVyX2ZyZXExID0KKwkJCWNkc19jaGFuX3RvX2ZyZXEoc2Vzc2lvbl9lbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKTsKKwkJYXNzb2NfaW5kLT5jaGFuX2luZm8uYmFuZF9jZW50ZXJfZnJlcTIgPSAwOworCQlhc3NvY19pbmQtPmNoYW5faW5mby5yZWdfaW5mb18xID0KKwkJCShzZXNzaW9uX2VudHJ5LT5tYXhUeFBvd2VyIDw8IDE2KTsKKwkJYXNzb2NfaW5kLT5jaGFuX2luZm8ucmVnX2luZm9fMiA9CisJCQkoc2Vzc2lvbl9lbnRyeS0+bWF4VHhQb3dlciA8PCA4KTsKKwkJLyogdXBkYXRlcyBWSFQgaW5mb3JtYXRpb24gaW4gYXNzb2MgaW5kaWNhdGlvbiAqLworCQlsaW1fZmlsbF9hc3NvY19pbmRfdmh0X2luZm8obWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSwgYXNzb2NfcmVxLAorCQkJYXNzb2NfaW5kKTsKKwkJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9BU1NPQ19JTkQsCisJCQkgKHVpbnQzMl90ICopIGFzc29jX2luZCk7CisJCWNkZl9tZW1fZnJlZShhc3NvY19pbmQpOworCX0KKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX2Fzc29jX3JzcF9mcmFtZS5jIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19hc3NvY19yc3BfZnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGM2NzJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19hc3NvY19yc3BfZnJhbWUuYwpAQCAtMCwwICsxLDExMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV9wcm9jZXNzX2Fzc29jX3JzcF9mcmFtZS5jYyBjb250YWlucyB0aGUgY29kZQorICogZm9yIHByb2Nlc3NpbmcgUmUvQXNzb2NpYXRpb24gUmVzcG9uc2UgRnJhbWUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMy8xOC8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAic2NoX2FwaS5oIgorCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlY3VyaXR5X3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Nlcl9kZXNfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc3RhX2hhc2hfYXBpLmgiCisjaW5jbHVkZSAibGltX3NlbmRfbWVzc2FnZXMuaCIKKworCitleHRlcm4gdFNpclJldFN0YXR1cyBzY2hfYmVhY29uX2VkY2FfcHJvY2Vzcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCXRTaXJNYWNFZGNhUGFyYW1TZXRJRSAqZWRjYSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8qKgorICogbGltX3VwZGF0ZV9zdGFkc19odGNhcCgpIC0gVXBkYXRlcyBzdGF0aW9uIERlc2NyaXB0b3IgSFQgY2FwYWJpbGl0eQorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBzdGFfZHM6IFN0YXRpb24gRGVzY3JpcHRvciBpbiBEUEgKKyAqIEBhc3NvY19yc3A6IFBvaW50ZXIgdG8gQXNzb2NpYXRpb24gUmVzcG9uc2UgU3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gVXBkYXRlIHRoZSBIVCBjYXBhYmlsaXRpZXMgaW4KKyAqIFN0YXRpb24gRGVzY3JpcHRvciAoZHBoKSBEZXRhaWxzIGZyb20KKyAqIEFzc29jaWF0aW9uIC8gUmVBc3NvY2lhdGlvbiBSZXNwb25zZSBGcmFtZQorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBsaW1fdXBkYXRlX3N0YWRzX2h0Y2FwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdHBEcGhIYXNoTm9kZSBzdGFfZHMsIHRwU2lyQXNzb2NSc3AgYXNzb2NfcnNwKQoreworCXVpbnQxNl90IGhpZ2hlc3RfcnhyYXRlID0gMDsKKwl0RG90MTFmSUVIVENhcHMgKmh0X2NhcHM7CisKKwlodF9jYXBzID0gJmFzc29jX3JzcC0+SFRDYXBzOworCXN0YV9kcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkgPSBhc3NvY19yc3AtPkhUQ2Fwcy5wcmVzZW50OworCWlmIChhc3NvY19yc3AtPkhUQ2Fwcy5wcmVzZW50KSB7CisJCXN0YV9kcy0+aHRHcmVlbmZpZWxkID0KKwkJCSh1aW50OF90KSBodF9jYXBzLT5ncmVlbkZpZWxkOworCQlzdGFfZHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCSh1aW50OF90KSAoaHRfY2Fwcy0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID8KKwkJYXNzb2NfcnNwLT5IVEluZm8ucmVjb21tZW5kZWRUeFdpZHRoU2V0IDoKKwkJaHRfY2Fwcy0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KTsKKwkJc3RhX2RzLT5odExzaWdUWE9QUHJvdGVjdGlvbiA9CisJCQkodWludDhfdCkgaHRfY2Fwcy0+bHNpZ1RYT1BQcm90ZWN0aW9uOworCQlzdGFfZHMtPmh0TUlNT1BTU3RhdGUgPQorCQkJKHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSlodF9jYXBzLT5taW1vUG93ZXJTYXZlOworCQlzdGFfZHMtPmh0TWF4QW1zZHVMZW5ndGggPQorCQkJKHVpbnQ4X3QpIGh0X2NhcHMtPm1heGltYWxBTVNEVXNpemU7CisJCXN0YV9kcy0+aHRBTXBkdURlbnNpdHkgPSBodF9jYXBzLT5tcGR1RGVuc2l0eTsKKwkJc3RhX2RzLT5odERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0ID0KKwkJCSh1aW50OF90KSBodF9jYXBzLT5kc3NzQ2NrTW9kZTQwTUh6OworCQlzdGFfZHMtPmh0U2hvcnRHSTIwTWh6ID0KKwkJCSh1aW50OF90KSBodF9jYXBzLT5zaG9ydEdJMjBNSHo7CisJCXN0YV9kcy0+aHRTaG9ydEdJNDBNaHogPQorCQkJKHVpbnQ4X3QpIGh0X2NhcHMtPnNob3J0R0k0ME1IejsKKwkJc3RhX2RzLT5odE1heFJ4QU1wZHVGYWN0b3IgPQorCQkJaHRfY2Fwcy0+bWF4UnhBTVBEVUZhY3RvcjsKKwkJbGltX2ZpbGxfcnhfaGlnaGVzdF9zdXBwb3J0ZWRfcmF0ZShtYWNfY3R4LCAmaGlnaGVzdF9yeHJhdGUsCisJCQlodF9jYXBzLT5zdXBwb3J0ZWRNQ1NTZXQpOworCQlzdGFfZHMtPnN1cHBvcnRlZFJhdGVzLnJ4SGlnaGVzdERhdGFSYXRlID0KKwkJCWhpZ2hlc3RfcnhyYXRlOworCQkvKgorCQkgKiBUaGlzIGlzIGZvciBBUCBhcyBwZWVyIFNUQSBhbmQgd2UgYXJlIElORlJBIFNUQQorCQkgKi5XZSB3aWxsIHB1dCBBUHMgb2Zmc2V0IGluIGRwaCBub2RlIHdoaWNoIGlzIHBlZXIgU1RBCisJCSAqLworCQlzdGFfZHMtPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9CisJCQkodWludDhfdCkgYXNzb2NfcnNwLT5IVEluZm8uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwkJLyoKKwkJICogRklYTUVfQU1QRFUKKwkJICogSW4gdGhlIGZ1dHVyZSwgbWF5IG5lZWQgdG8gY2hlY2sgZm9yCisJCSAqICJhc3NvYy5IVENhcHMuZGVsYXllZEJBIgorCQkgKiBGb3Igbm93LCBpdCBpcyBJTU1FRElBVEUgQkEgb25seSBvbiBBTEwgVElEJ3MKKwkJICovCisJCXN0YV9kcy0+YmFQb2xpY3lGbGFnID0gMHhGRjsKKwl9Cit9CisKKy8qKgorICogbGltX3VwZGF0ZV9hc3NvY19zdGFfZGF0YXMoKSAtIFVwZGF0ZXMgc3RhdGlvbiBEZXNjcmlwdG9yCisgKiBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBzdGFfZHM6IFN0YXRpb24gRGVzY3JpcHRvciBpbiBEUEgKKyAqIGFzc29jX3JzcDogUG9pbnRlciB0byBBc3NvY2lhdGlvbiBSZXNwb25zZSBTdHJ1Y3R1cmUKKyAqIHNlc3Npb25fZW50cnkgOiBQRSBzZXNzaW9uIEVudHJ5CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gVXBkYXRlIHRoZSBTdGF0aW9uIERlc2NyaXB0b3IgKGRwaCkgRGV0YWlscyBmcm9tCisgKiBBc3NvY2lhdGlvbiAvIFJlQXNzb2NpYXRpb24gUmVzcG9uc2UgRnJhbWUKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBsaW1fdXBkYXRlX2Fzc29jX3N0YV9kYXRhcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXRwRHBoSGFzaE5vZGUgc3RhX2RzLCB0cFNpckFzc29jUnNwIGFzc29jX3JzcCwKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXVpbnQzMl90IHBoeV9tb2RlOworCWJvb2wgcW9zX21vZGU7CisJdERvdDExZklFVkhUQ2FwcyAqdmh0X2NhcHMgPSBOVUxMOworCisJbGltX2dldF9waHlfbW9kZShtYWNfY3R4LCAmcGh5X21vZGUsIHNlc3Npb25fZW50cnkpOworCXN0YV9kcy0+c3RhVHlwZSA9IFNUQV9FTlRSWV9TRUxGOworCWxpbUdldFFvc01vZGUoc2Vzc2lvbl9lbnRyeSwgJnFvc19tb2RlKTsKKwlzdGFfZHMtPm1sbVN0YUNvbnRleHQuYXV0aFR5cGUgPSBzZXNzaW9uX2VudHJ5LT5saW1DdXJyZW50QXV0aFR5cGU7CisKKwkvKiBBZGQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uLCByYXRlcyBhbmQgQUlEICovCisJc3RhX2RzLT5tbG1TdGFDb250ZXh0LmNhcGFiaWxpdHlJbmZvID0gYXNzb2NfcnNwLT5jYXBhYmlsaXR5SW5mbzsKKwlzdGFfZHMtPnNob3J0UHJlYW1ibGVFbmFibGVkID0KKwkJKHVpbnQ4X3QpIGFzc29jX3JzcC0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZTsKKworCS8qIFVwZGF0ZSBIVCBDYXBhYmlsaXRlcyBvbmx5IHdoZW4gdGhlIHNlbGYgbW9kZSBzdXBwb3J0cyBIVCAqLworCWlmIChJU19ET1QxMV9NT0RFX0hUKHNlc3Npb25fZW50cnktPmRvdDExbW9kZSkpCisJCWxpbV91cGRhdGVfc3RhZHNfaHRjYXAobWFjX2N0eCwgc3RhX2RzLCBhc3NvY19yc3ApOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlpZiAoYXNzb2NfcnNwLT5WSFRDYXBzLnByZXNlbnQpCisJCXZodF9jYXBzID0gJmFzc29jX3JzcC0+VkhUQ2FwczsKKwllbHNlIGlmIChhc3NvY19yc3AtPnZlbmRvcjJfaWUuVkhUQ2Fwcy5wcmVzZW50KQorCQl2aHRfY2FwcyA9ICZhc3NvY19yc3AtPnZlbmRvcjJfaWUuVkhUQ2FwczsKKworCWlmIChJU19ET1QxMV9NT0RFX1ZIVChzZXNzaW9uX2VudHJ5LT5kb3QxMW1vZGUpKSB7CisJCWlmICgodmh0X2NhcHMgIT0gTlVMTCkgJiYgdmh0X2NhcHMtPnByZXNlbnQpIHsKKwkJCXN0YV9kcy0+bWxtU3RhQ29udGV4dC52aHRDYXBhYmlsaXR5ID0KKwkJCQl2aHRfY2Fwcy0+cHJlc2VudDsKKwkJCS8qCisJCQkgKiBJZiAxMWFjIGlzIHN1cHBvcnRlZCBhbmQgaWYgdGhlIHBlZXIgaXMKKwkJCSAqIHNlbmRpbmcgVkhUIGNhcGFiaWxpdGllcywKKwkJCSAqIHRoZW4gaHRNYXhSeEFNcGR1RmFjdG9yIHNob3VsZCBiZQorCQkJICogb3ZlcmxvYWRlZCB3aXRoIFZIVCBtYXhBTVBEVUxlbkV4cAorCQkJICovCisJCQlzdGFfZHMtPmh0TWF4UnhBTXBkdUZhY3RvciA9IHZodF9jYXBzLT5tYXhBTVBEVUxlbkV4cDsKKwkJCWlmIChzZXNzaW9uX2VudHJ5LT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgeworCQkJCWlmIChhc3NvY19yc3AtPlZIVE9wZXJhdGlvbi5wcmVzZW50KQorCQkJCQlzdGFfZHMtPnZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkJCWFzc29jX3JzcC0+VkhUT3BlcmF0aW9uLmNoYW5XaWR0aDsKKwkJCQllbHNlCisJCQkJCXN0YV9kcy0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaOworCQkJfQorCQl9CisJfQorCWlmIChsaW1fcG9wdWxhdGVfcGVlcl9yYXRlX3NldChtYWNfY3R4LCAmc3RhX2RzLT5zdXBwb3J0ZWRSYXRlcywKKwkJCQlhc3NvY19yc3AtPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsCisJCQkJZmFsc2UsIHNlc3Npb25fZW50cnksCisJCQkJdmh0X2NhcHMpICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiY291bGQgbm90IGdldCByYXRlc2V0IGFuZCBleHRlbmRlZCByYXRlIHNldCIpKTsKKwkJcmV0dXJuOworCX0KKyNlbHNlCisJaWYgKGxpbV9wb3B1bGF0ZV9wZWVyX3JhdGVfc2V0KG1hY19jdHgsICZzdGFfZHMtPnN1cHBvcnRlZFJhdGVzLAorCQlhc3NvY19yc3AtPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsCisJCWZhbHNlLCBzZXNzaW9uX2VudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCBnZXQgcmF0ZXNldCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXQiKSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCXN0YV9kcy0+dmh0U3VwcG9ydGVkUnhOc3MgPQorCQkoKHN0YV9kcy0+c3VwcG9ydGVkUmF0ZXMudmh0UnhNQ1NNYXAgJiBNQ1NNQVBNQVNLMngyKQorCQkgPT0gTUNTTUFQTUFTSzJ4MikgPyAxIDogMjsKKyNlbmRpZgorCS8qIElmIG9uZSBvZiB0aGUgcmF0ZXMgaXMgMTFnIHJhdGVzLCBzZXQgdGhlIEVSUCBtb2RlLiAqLworCWlmICgocGh5X21vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpICYmCisJCXNpcklzQXJhdGUoc3RhX2RzLT5zdXBwb3J0ZWRSYXRlcy5sbGFSYXRlc1swXSAmIDB4N2YpKQorCQlzdGFfZHMtPmVycEVuYWJsZWQgPSBlSEFMX1NFVDsKKworCS8qIENvdWxkIG5vdCBnZXQgcHJvcCByYXRlc2V0IGZyb20gQ0ZHLiBMb2cgZXJyb3IuICovCisJc3RhX2RzLT5xb3NNb2RlID0gMDsKKwlzdGFfZHMtPmxsZUVuYWJsZWQgPSAwOworCisJLyogdXBkYXRlIFRTSUQgdG8gVVAgbWFwcGluZyAqLworCWlmIChxb3NfbW9kZSkgeworCQlpZiAoYXNzb2NfcnNwLT5lZGNhUHJlc2VudCkgeworCQkJdFNpclJldFN0YXR1cyBzdGF0dXM7CisJCQlzdGF0dXMgPQorCQkJCXNjaF9iZWFjb25fZWRjYV9wcm9jZXNzKG1hY19jdHgsCisJCQkJCSZhc3NvY19yc3AtPmVkY2EsIHNlc3Npb25fZW50cnkpOworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cyLAorCQkJCSJFZGNhIHNldCB1cGRhdGUgYmFzZWQgb24gQXNzb2NSc3A6IHN0YXR1cyAlZCIsCisJCQkJc3RhdHVzKTsKKwkJCWlmIChzdGF0dXMgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiRWRjYSBlcnJvciBpbiBBc3NvY1Jlc3AgIikpOworCQkJfSBlbHNlIHsKKwkJCQkvKiB1cGRhdGUgZGVmYXVsdCB0aWRtYXAgYmFzZWQgb24gQUNNICovCisJCQkJc3RhX2RzLT5xb3NNb2RlID0gMTsKKwkJCQlzdGFfZHMtPmxsZUVuYWJsZWQgPSAxOworCQkJfQorCQl9CisJfQorCisJc3RhX2RzLT53bWVFbmFibGVkID0gMDsKKwlzdGFfZHMtPndzbUVuYWJsZWQgPSAwOworCWlmIChzZXNzaW9uX2VudHJ5LT5saW1XbWVFbmFibGVkICYmIGFzc29jX3JzcC0+d21lRWRjYVByZXNlbnQpIHsKKwkJdFNpclJldFN0YXR1cyBzdGF0dXM7CisJCXN0YXR1cyA9IHNjaF9iZWFjb25fZWRjYV9wcm9jZXNzKG1hY19jdHgsICZhc3NvY19yc3AtPmVkY2EsCisJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCSJXTUUgRWRjYSBzZXQgdXBkYXRlIGJhc2VkIG9uIEFzc29jUnNwOiBzdGF0dXMgJWQiLAorCQkJc3RhdHVzKTsKKworCQlpZiAoc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiV01FIEVkY2EgZXJyb3IgaW4gQXNzb2NSZXNwIC0gaWdub3JpbmciKSk7CisKKwkJCWVsc2UgeworCQkJCS8qIHVwZGF0ZSBkZWZhdWx0IHRpZG1hcCBiYXNlZCBvbiBIYXNoQUNNICovCisJCQkJc3RhX2RzLT5xb3NNb2RlID0gMTsKKwkJCQlzdGFfZHMtPndtZUVuYWJsZWQgPSAxOworCQkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIHJlY2VpdmVkIGFzc29jIHJzcCBmcm9tIGEgbGVnYWN5IEFQLgorCQkgKiBTbyBmaWxsIGluIHRoZSBkZWZhdWx0ICBsb2NhbCBFRENBIHBhcmFtcy4KKwkJICogVGhpcyBpcyBuZWVkZWQgKHJlZmVyIHRvIGJ1ZyAjMTQ5ODkpIGFzIHdlJ2xsCisJCSAqIGJlIHBhc3NpbmcgdGhlIGdMaW1FZGNhUGFyYW1zIHRvIEhBTCBpbgorCQkgKiBsaW1fcHJvY2Vzc19zdGFfbWxtX2FkZF9ic3NfcnNwKCkuCisJCSAqLworCQlzY2hfc2V0X2RlZmF1bHRfZWRjYV9wYXJhbXMobWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSk7CisJfQorCisJaWYgKHFvc19tb2RlICYmICghc3RhX2RzLT5xb3NNb2RlKSAmJgorCQkgc3RhX2RzLT5tbG1TdGFDb250ZXh0Lmh0Q2FwYWJpbGl0eSkgeworCQkvKgorCQkgKiBFbmFibGUgUU9TIGZvciBhbGwgSFQgQVAncyBldmVuIHRob3VnaCBXTU0KKwkJICogb3IgODAyLjExRSBJRSBpcyBub3QgcHJlc2VudAorCQkgKi8KKwkJc3RhX2RzLT5xb3NNb2RlID0gMTsKKwkJc3RhX2RzLT53bWVFbmFibGVkID0gMTsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWlmIChzZXNzaW9uX2VudHJ5LT5saW1SbWZFbmFibGVkKQorCQlzdGFfZHMtPnJtZkVuYWJsZWQgPSAxOworI2VuZGlmCit9CisKKy8qKgorICogQGZ1bmN0aW9uIDogbGltX3VwZGF0ZV9yZV9hc3NvY19nbG9iYWxzCisgKgorICogQGJyaWVmIDogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIFVwZGF0ZSB0aGUgR2xvYmFscyAoTElNKSBkdXJpbmcgUmVBc3NvYy4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEFzc29jUnNwICAgIC0gUG9pbnRlciB0byBBc3NvY2lhdGlvbiBSZXNwb25zZSBTdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbV91cGRhdGVfcmVfYXNzb2NfZ2xvYmFscyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpckFzc29jUnNwIHBBc3NvY1JzcCwKKwkJCQkgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwkvKiBVcGRhdGUgdGhlIGN1cnJlbnQgQnNzIEluZm9ybWF0aW9uICovCisJY2RmX21lbV9jb3B5KHBzZXNzaW9uRW50cnktPmJzc0lkLAorCQkgICAgIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsID0gcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0NoYW5uZWxJZDsKKwlwc2Vzc2lvbkVudHJ5LT5odFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPQorCQlwc2Vzc2lvbkVudHJ5LT5yZUFzc29jSHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJcHNlc3Npb25FbnRyeS0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPQorCQlwc2Vzc2lvbkVudHJ5LT5yZUFzc29jSHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisJcHNlc3Npb25FbnRyeS0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0KKwkJcHNlc3Npb25FbnRyeS0+cmVBc3NvY0h0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwlwc2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QnNzQ2FwcyA9IHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NDYXBzOworCXBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NRb3NDYXBzID0KKwkJcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0Jzc1Fvc0NhcHM7CisJcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc1Byb3BDYXAgPQorCQlwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUHJvcENhcDsKKworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcHNlc3Npb25FbnRyeS0+c3NJZCwKKwkJICAgICAodWludDhfdCAqKSAmcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY1NTSUQsCisJCSAgICAgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY1NTSUQubGVuZ3RoICsgMSk7CisKKwkvKiBTdG9yZSBhc3NpZ25lZCBBSUQgZm9yIFRJTSBwcm9jZXNzaW5nICovCisJcHNlc3Npb25FbnRyeS0+bGltQUlEID0gcEFzc29jUnNwLT5haWQgJiAweDNGRkY7CisJLyoqIFNldCB0aGUgU3RhdGUgQmFjayB0byBSZUFzc29jIFJzcCovCisJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9SRUFTU09DX1JTUF9TVEFURTsKKwlNVFJBQ0UobWFjX3RyYWNlCisJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpKTsKKworfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKioKKyAqIGxpbV91cGRhdGVfcmljX2RhdGEoKSAtIHVwZGF0ZSBzZXNzaW9uIHdpdGggcmljIGRhdGEKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAc2Vzc2lvbl9lbnRyeTogUEUgc2Vzc2lvbiBoYW5kbGUKKyAqIEBhc3NvY19yc3A6ICBwb2ludGVyIHRvIGFzc29jIHJlc3BvbnNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX3Byb2Nlc3NfYXNzb2NfcnNwX2ZyYW1lKCkgdG8KKyAqIHVwZGF0ZSBQRSBzZXNzaW9uIGNvbnRleHQgd2l0aCBSSUMgZGF0YS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX3VwZGF0ZV9yaWNfZGF0YSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCSB0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5LCB0cFNpckFzc29jUnNwIGFzc29jX3JzcCkKK3sKKwlpZiAoc2Vzc2lvbl9lbnRyeS0+cmljRGF0YSAhPSBOVUxMKSB7CisJCWNkZl9tZW1fZnJlZShzZXNzaW9uX2VudHJ5LT5yaWNEYXRhKTsKKwkJc2Vzc2lvbl9lbnRyeS0+cmljRGF0YSA9IE5VTEw7CisJfQorCWlmIChhc3NvY19yc3AtPnJpY1ByZXNlbnQpIHsKKwkJc2Vzc2lvbl9lbnRyeS0+UklDRGF0YUxlbiA9CisJCQlhc3NvY19yc3AtPm51bV9SSUNEYXRhICogc2l6ZW9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjKTsKKwkJc2Vzc2lvbl9lbnRyeS0+cmljRGF0YSA9CisJCQljZGZfbWVtX21hbGxvYyhzZXNzaW9uX2VudHJ5LT5SSUNEYXRhTGVuKTsKKwkJaWYgKE5VTEwgPT0gc2Vzc2lvbl9lbnRyeS0+cmljRGF0YSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJBc3NvYyByZXMvUklDOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworCQkJc2Vzc2lvbl9lbnRyeS0+UklDRGF0YUxlbiA9IDA7CisJCX0gZWxzZSB7CisJCQljZGZfbWVtX2NvcHkoc2Vzc2lvbl9lbnRyeS0+cmljRGF0YSwKKwkJCQkmYXNzb2NfcnNwLT5SSUNEYXRhWzBdLAorCQkJCXNlc3Npb25fZW50cnktPlJJQ0RhdGFMZW4pOworCQl9CisJfSBlbHNlIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIlJpYyBpcyBub3QgcHJlc2VudCxTZXQgUklDRGF0YUxlbiAmIFJpY0RhdGEgdG8gMCIpKTsKKwkJc2Vzc2lvbl9lbnRyeS0+UklDRGF0YUxlbiA9IDA7CisJCXNlc3Npb25fZW50cnktPnJpY0RhdGEgPSBOVUxMOworCX0KKwlyZXR1cm47Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKworLyoqCisgKiBsaW1fdXBkYXRlX2VzZV90c3BlYygpIC0gdXBkYXRlIHNlc3Npb24gd2l0aCBUc3BlYyBpbmZvLgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBzZXNzaW9uX2VudHJ5OiBQRSBzZXNzaW9uIGhhbmRsZQorICogQGFzc29jX3JzcDogIHBvaW50ZXIgdG8gYXNzb2MgcmVzcG9uc2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19hc3NvY19yc3BfZnJhbWUoKSB0bworICogdXBkYXRlIFBFIHNlc3Npb24gY29udGV4dCB3aXRoIFRzcGVjIGRhdGEuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV91cGRhdGVfZXNlX3RzcGVjKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnksIHRwU2lyQXNzb2NSc3AgYXNzb2NfcnNwKQoreworCWlmIChzZXNzaW9uX2VudHJ5LT50c3BlY0llcyAhPSBOVUxMKSB7CisJCWNkZl9tZW1fZnJlZShzZXNzaW9uX2VudHJ5LT50c3BlY0llcyk7CisJCXNlc3Npb25fZW50cnktPnRzcGVjSWVzID0gTlVMTDsKKwl9CisJaWYgKGFzc29jX3JzcC0+dHNwZWNQcmVzZW50KSB7CisJCXNlc3Npb25fZW50cnktPnRzcGVjTGVuID0KKwkJCWFzc29jX3JzcC0+bnVtX3RzcGVjcyAqIHNpemVvZih0RG90MTFmSUVXTU1UU1BFQyk7CisJCXNlc3Npb25fZW50cnktPnRzcGVjSWVzID0KKwkJCWNkZl9tZW1fbWFsbG9jKHNlc3Npb25fZW50cnktPnRzcGVjTGVuKTsKKwkJaWYgKE5VTEwgPT0gc2Vzc2lvbl9lbnRyeS0+dHNwZWNJZXMpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiQXNzb2MgUnNwL1RzcGVjOkZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworCQkJc2Vzc2lvbl9lbnRyeS0+dHNwZWNMZW4gPSAwOworCQl9IGVsc2UgeworCQkJY2RmX21lbV9jb3B5KHNlc3Npb25fZW50cnktPnRzcGVjSWVzLAorCQkJCSZhc3NvY19yc3AtPlRTUEVDSW5mb1swXSwKKwkJCQlzZXNzaW9uX2VudHJ5LT50c3BlY0xlbik7CisJCX0KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiIFRzcGVjIEVJRCBwcmVzZW50IGluIGFzc29jIHJzcCAiKSk7CisJfSBlbHNlIHsKKwkJc2Vzc2lvbl9lbnRyeS0+dHNwZWNMZW4gPSAwOworCQlzZXNzaW9uX2VudHJ5LT50c3BlY0llcyA9IE5VTEw7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCIgVHNwZWMgRUlEICpOT1QqIHByZXNlbnQgaW4gYXNzb2MgcnNwICIpKTsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIGxpbV91cGRhdGVfZXNlX3RzbSgpIC0gdXBkYXRlIHNlc3Npb24gd2l0aCBUU00gaW5mby4KKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAc2Vzc2lvbl9lbnRyeTogUEUgc2Vzc2lvbiBoYW5kbGUKKyAqIEBhc3NvY19yc3A6ICBwb2ludGVyIHRvIGFzc29jIHJlc3BvbnNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX3Byb2Nlc3NfYXNzb2NfcnNwX2ZyYW1lKCkgdG8KKyAqIHVwZGF0ZSBQRSBzZXNzaW9uIGNvbnRleHQgd2l0aCBUU00gSUUgZGF0YSBhbmQgc2VuZAorICogZVdOSV9UU01fSUVfSU5EIHRvIFNNRS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX3VwZGF0ZV9lc2VfdHNtKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnksIHRwU2lyQXNzb2NSc3AgYXNzb2NfcnNwKQoreworCXVpbnQ4X3QgY250ID0gMDsKKwl0cEVzZVRTTUNvbnRleHQgdHNtX2N0eDsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlRTTSBJRSBQcmVzZW50IGluIFJlYXNzb2MgUnNwIikpOworCS8qCisJICogU3RhcnQgdGhlIFRTTSAgdGltZXIgb25seSBpZiB0aGUgVFNQRUMKKwkgKiBJZSBpcyBwcmVzZW50IGluIHRoZSByZWFzc29jIHJzcAorCSAqLworCWlmICghYXNzb2NfcnNwLT50c3BlY1ByZXNlbnQpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlRTTSBwcmVzZW50IGJ1dCBUU1BFQyBJRSBub3QgcHJlc2VudCIpKTsKKwkJcmV0dXJuOworCX0KKwl0c21fY3R4ID0gJnNlc3Npb25fZW50cnktPmVzZUNvbnRleHQudHNtOworCS8qIEZpbmQgdGhlIFRTUEVDIElFIHdpdGggVk8gdXNlciBwcmlvcml0eSAqLworCWZvciAoY250ID0gMDsgY250IDwgYXNzb2NfcnNwLT5udW1fdHNwZWNzOyBjbnQrKykgeworCQlpZiAodXBUb0FjKGFzc29jX3JzcC0+VFNQRUNJbmZvW2NudF0udXNlcl9wcmlvcml0eSkgPT0KKwkJCUVEQ0FfQUNfVk8pIHsKKwkJCXRzbV9jdHgtPnRpZCA9CisJCQkJYXNzb2NfcnNwLT5UU1BFQ0luZm9bY250XS51c2VyX3ByaW9yaXR5OworCQkJY2RmX21lbV9jb3B5KCZ0c21fY3R4LT50c21JbmZvLAorCQkJCSZhc3NvY19yc3AtPnRzbUlFLCBzaXplb2YodFNpck1hY0VTRVRTTUlFKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKKwkJCWxpbV9zZW5kX3NtZV90c21faWVfaW5kKG1hY19jdHgsCisJCQkJc2Vzc2lvbl9lbnRyeSwgYXNzb2NfcnNwLT50c21JRS50c2lkLAorCQkJCWFzc29jX3JzcC0+dHNtSUUuc3RhdGUsCisJCQkJYXNzb2NfcnNwLT50c21JRS5tc210X2ludGVydmFsKTsKKyNlbHNlCisJCQlsaW1BY3RpdmF0ZVRTTVN0YXRzVGltZXIobWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSk7CisjZW5kaWYKKwkJCWlmICh0c21fY3R4LT50c21JbmZvLnN0YXRlKQorCQkJCXRzbV9jdHgtPnRzbU1ldHJpY3MuUm9hbWluZ0NvdW50Kys7CisJCQlicmVhazsKKwkJfQorCX0KK30KKyNlbmRpZgorCisvKioKKyAqIGxpbV91cGRhdGVfc3RhZHNfZXh0X2NhcCgpIC0gdXBkYXRlIHN0YSBkcyB3aXRoIGV4dCBjYXAKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAc2Vzc2lvbl9lbnRyeTogUEUgc2Vzc2lvbiBoYW5kbGUKKyAqIEBhc3NvY19yc3A6ICBwb2ludGVyIHRvIGFzc29jIHJlc3BvbnNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX3Byb2Nlc3NfYXNzb2NfcnNwX2ZyYW1lKCkgdG8KKyAqIHVwZGF0ZSBTVEEgRFMgd2l0aCBleHQgY2FwYWJsaXRpZXMuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV91cGRhdGVfc3RhZHNfZXh0X2NhcCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnksIHRwU2lyQXNzb2NSc3AgYXNzb2NfcnNwLAorCXRwRHBoSGFzaE5vZGUgc3RhX2RzKQoreworCXN0cnVjdCBzX2V4dF9jYXAgKmV4dF9jYXA7CisJaWYgKCFhc3NvY19yc3AtPkV4dENhcC5wcmVzZW50KSB7CisJCXN0YV9kcy0+dGltaW5nTWVhc0NhcCA9IDA7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwkJc2Vzc2lvbl9lbnRyeS0+dGRsc19wcm9oaWJpdGVkID0gZmFsc2U7CisJCXNlc3Npb25fZW50cnktPnRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQgPSBmYWxzZTsKKyNlbmRpZgorCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJFeHRDYXAgbm90IHByZXNlbnQiKSk7CisJCXJldHVybjsKKwl9CisKKwlleHRfY2FwID0gKHN0cnVjdCBzX2V4dF9jYXAgKilhc3NvY19yc3AtPkV4dENhcC5ieXRlczsKKwlsaW1fc2V0X3N0YWRzX3J0dF9jYXAoc3RhX2RzLCBleHRfY2FwLCBtYWNfY3R4KTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXNlc3Npb25fZW50cnktPnRkbHNfcHJvaGliaXRlZCA9IGV4dF9jYXAtPnRkbHNfcHJvaGliaXRlZDsKKwlzZXNzaW9uX2VudHJ5LT50ZGxzX2NoYW5fc3dpdF9wcm9oaWJpdGVkID0KKwkJZXh0X2NhcC0+dGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZDsKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJFeHRDYXA6IHRkbHNfcHJvaGliaXRlZDolZCwgdGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZDogJWQiKSwKKwkJZXh0X2NhcC0+dGRsc19wcm9oaWJpdGVkLAorCQlleHRfY2FwLT50ZGxzX2NoYW5fc3dpdF9wcm9oaWJpdGVkKTsKKyNlbmRpZgorfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX2Fzc29jX3JzcF9mcmFtZSgpIC0gUHJvY2Vzc2VzIGFzc29jIHJlc3BvbnNlCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJ4X3BhY2tldF9pbmZvICAgIC0gQSBwb2ludGVyIHRvIFJ4IHBhY2tldCBpbmZvIHN0cnVjdHVyZQorICogQHN1Yl90eXBlIC0gSW5kaWNhdGVzIHdoZXRoZXIgaXQgaXMgQXNzb2NpYXRpb24gUmVzcG9uc2UgKD0wKSBvcgorICogICAgICAgICAgICAgICAgICAgUmVhc3NvY2lhdGlvbiBSZXNwb25zZSAoPTEpIGZyYW1lCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpIHVwb24KKyAqIFJlL0Fzc29jaWF0aW9uIFJlc3BvbnNlIGZyYW1lIHJlY2VwdGlvbi4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworCit2b2lkCitsaW1fcHJvY2Vzc19hc3NvY19yc3BfZnJhbWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwl1aW50OF90ICpyeF9wa3RfaW5mbywgdWludDhfdCBzdWJ0eXBlLCB0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXVpbnQ4X3QgKmJvZHk7CisJdWludDE2X3QgY2FwcywgaWVfbGVuOworCXVpbnQzMl90IGZyYW1lX2xlbjsKKwl0U2lyTWFjQWRkciBjdXJyZW50X2Jzc2lkOworCXRwU2lyTWFjTWdtdEhkciBoZHIgPSBOVUxMOworCXRTaXJNYWNDYXBhYmlsaXR5SW5mbyBtYWNfY2FwYWI7CisJdHBEcGhIYXNoTm9kZSBzdGFfZHM7CisJdHBTaXJBc3NvY1JzcCBhc3NvY19yc3A7CisJdExpbU1sbUFzc29jQ25mIGFzc29jX2NuZjsKKwl0U2NoQmVhY29uU3RydWN0ICpiZWFjb247CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCXVpbnQ4X3Qgc21lX3Nlc3Npb25pZCA9IDA7CisjZW5kaWYKKwl0Q3NyUm9hbVNlc3Npb24gKnJvYW1fc2Vzc2lvbjsKKworCS8qIEluaXRpYWxpemUgc3RhdHVzIGNvZGUgdG8gc3VjY2Vzcy4gKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJaWYgKHNlc3Npb25fZW50cnktPmJSb2FtU3luY2hJblByb2dyZXNzKQorCQloZHIgPSAodHBTaXJNYWNNZ210SGRyKSBtYWNfY3R4LT5yb2FtLnBSZWFzc29jUmVzcDsKKwllbHNlCisjZW5kaWYKKwloZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocnhfcGt0X2luZm8pOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlzbWVfc2Vzc2lvbmlkID0gc2Vzc2lvbl9lbnRyeS0+c21lU2Vzc2lvbklkOworI2VuZGlmCisJYXNzb2NfY25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICovCisJYXNzb2NfY25mLnNlc3Npb25JZCA9IHNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkOworCWlmIChoZHIgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiTEZSMzogUmVhc3NvYyByZXNwb25zZSBwYWNrZXQgaGVhZGVyIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGhkci0+c2EgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiTEZSMzogUmVhc3NvYyByZXNwIHBhY2tldCBzb3VyY2UgYWRkcmVzcyBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgicmVjZWl2ZWQgUmUvQXNzb2MoJWQpIHJlc3Agb24gc2Vzc2lvbmlkOiAlZCBzeXN0ZW1yb2xlOiAlZCIKKwkJImFuZCBtbG1zdGF0ZTogJWQgUlNTSSAlZCBmcm9tICIgTUFDX0FERFJFU1NfU1RSKSwgc3VidHlwZSwKKwkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsIEdFVF9MSU1fU1lTVEVNX1JPTEUoc2Vzc2lvbl9lbnRyeSksCisJCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlLAorCQkodWludCkgYWJzKChpbnQ4X3QpIFdNQV9HRVRfUlhfUlNTSV9EQihyeF9wa3RfaW5mbykpLAorCQlNQUNfQUREUl9BUlJBWShoZHItPnNhKSk7CisKKwliZWFjb24gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNjaEJlYWNvblN0cnVjdCkpOworCWlmIChOVUxMID09IGJlYWNvbikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworCQlyZXR1cm47CisJfQorCisJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpIHx8CisJCUxJTV9JU19CVF9BTVBfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSkgeworCQkvKgorCQkgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgUmUvQXNzb2NpYXRpb24KKwkJICogUmVzcG9uc2UgZnJhbWUgb24gQVAuIExvZyBlcnJvcgorCQkgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlNob3VsZCBub3QgcmVjaWV2ZWQgUmUvQXNzb2MgUmVzcG9uc2UgaW4gcm9sZSAlZCAiKSwKKwkJCUdFVF9MSU1fU1lTVEVNX1JPTEUoc2Vzc2lvbl9lbnRyeSkpOworCQljZGZfbWVtX2ZyZWUoYmVhY29uKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJaWYgKHNlc3Npb25fZW50cnktPmJSb2FtU3luY2hJblByb2dyZXNzKSB7CisJCWhkciA9ICh0cFNpck1hY01nbXRIZHIpIG1hY19jdHgtPnJvYW0ucFJlYXNzb2NSZXNwOworCQlmcmFtZV9sZW4gPSBtYWNfY3R4LT5yb2FtLnJlYXNzb2NSZXNwTGVuIC0gU0lSX01BQ19IRFJfTEVOXzNBOworCX0gZWxzZSB7CisjZW5kaWYKKwloZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocnhfcGt0X2luZm8pOworCWZyYW1lX2xlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocnhfcGt0X2luZm8pOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKK30KKyNlbmRpZgorCWlmICgoKHN1YnR5cGUgPT0gTElNX0FTU09DKSAmJgorCQkoc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUgIT0gZUxJTV9NTE1fV1RfQVNTT0NfUlNQX1NUQVRFKSkgfHwKKwkJKChzdWJ0eXBlID09IExJTV9SRUFTU09DKSAmJgorCQkoKHNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlICE9IGVMSU1fTUxNX1dUX1JFQVNTT0NfUlNQX1NUQVRFKQorI2lmIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJCSYmIChzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSAhPQorCQllTElNX01MTV9XVF9GVF9SRUFTU09DX1JTUF9TVEFURSkKKyNlbmRpZgorCQkpKSkgeworCQkvKiBSZWNlaXZlZCB1bmV4cGVjdGVkIFJlL0Fzc29jaWF0aW9uIFJlc3BvbnNlIGZyYW1lICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiUmVjaWV2ZWQgUmUvQXNzb2MgcnNwIGluIHVuZXhwZWN0ZWQgIgorCQkJInN0YXRlICVkIG9uIHNlc3Npb249JWQiKSwKKwkJCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlLCBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCk7CisjZW5kaWYKKwkJaWYgKCFoZHItPmZjLnJldHJ5KSB7CisJCQlpZiAoIShtYWNfY3R4LT5saW0ucmV0cnlfcGFja2V0X2NudCAmIDB4ZikpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJICAgIEZMKCJyZWN2ZCBSZS9Bc3NvYyByc3A6bm90IGEgcmV0cnkgZnJhbWUiKSk7CisJCQkJbGltX3ByaW50X21sbV9zdGF0ZShtYWNfY3R4LCBMT0dFLAorCQkJCQkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQltYWNfY3R4LT5saW0ucmV0cnlfcGFja2V0X2NudCsrOworCQkJfQorCQl9CisJCWNkZl9tZW1fZnJlZShiZWFjb24pOworCQlyZXR1cm47CisJfQorCXNpcl9jb3B5X21hY19hZGRyKGN1cnJlbnRfYnNzaWQsIHNlc3Npb25fZW50cnktPmJzc0lkKTsKKwlpZiAoc3VidHlwZSA9PSBMSU1fQVNTT0MpIHsKKwkJaWYgKCFjZGZfbWVtX2NvbXBhcmUKKwkJCShoZHItPnNhLCBjdXJyZW50X2Jzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpKSkgeworCQkJLyoKKwkJCSAqIFJlY2VpdmVkIEFzc29jaWF0aW9uIFJlc3BvbnNlIGZyYW1lIGZyb20gYW4gZW50aXR5CisJCQkgKiBvdGhlciB0aGFuIG9uZSB0byB3aGljaCByZXF1ZXN0IHdhcyBpbml0aWF0ZWQuCisJCQkgKiBJZ25vcmUgdGhpcyBhbmQgd2FpdCB1bnRpbCBBc3NvYyBGYWlsdXJlIFRpbWVvdXQKKwkJCSAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCSBGTCgicmVjZWl2ZWQgQXNzb2NSc3AgZnJvbSB1bmV4cGVjdGVkIHBlZXIgIgorCQkJCU1BQ19BRERSRVNTX1NUUiksCisJCQkJTUFDX0FERFJfQVJSQVkoaGRyLT5zYSkpOworCQkJY2RmX21lbV9mcmVlKGJlYWNvbik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWNkZl9tZW1fY29tcGFyZQorCQkJKGhkci0+c2EsIHNlc3Npb25fZW50cnktPmxpbVJlQXNzb2Nic3NJZCwKKwkJCXNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQkvKgorCQkJICogUmVjZWl2ZWQgUmVhc3NvY2lhdGlvbiBSZXNwb25zZSBmcmFtZSBmcm9tIGFuIGVudGl0eQorCQkJICogb3RoZXIgdGhhbiBvbmUgdG8gd2hpY2ggcmVxdWVzdCB3YXMgaW5pdGlhdGVkLgorCQkJICogSWdub3JlIHRoaXMgYW5kIHdhaXQgdW50aWwgUmVhc3NvYyBGYWlsdXJlIFRpbWVvdXQuCisJCQkgKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgicmVjZWl2ZWQgUmVhc3NvY1JzcCBmcm9tIHVuZXhwZWN0ZWQgcGVlciAiCisJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJCQlNQUNfQUREUl9BUlJBWShoZHItPnNhKSk7CisJCQljZGZfbWVtX2ZyZWUoYmVhY29uKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWFzc29jX3JzcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqYXNzb2NfcnNwKSk7CisJaWYgKE5VTEwgPT0gYXNzb2NfcnNwKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJBbGxvY2F0ZSBNZW1vcnkgZmFpbGVkIGluIEFzc29jUnNwIikpOworCQljZGZfbWVtX2ZyZWUoYmVhY29uKTsKKwkJcmV0dXJuOworCX0KKwkvKiBHZXQgcG9pbnRlciB0byBSZS9Bc3NvY2lhdGlvbiBSZXNwb25zZSBmcmFtZSBib2R5ICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmIChzZXNzaW9uX2VudHJ5LT5iUm9hbVN5bmNoSW5Qcm9ncmVzcykKKwkJYm9keSA9IG1hY19jdHgtPnJvYW0ucFJlYXNzb2NSZXNwICsgU0lSX01BQ19IRFJfTEVOXzNBOworCWVsc2UKKyNlbmRpZgorCWJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShyeF9wa3RfaW5mbyk7CisJLyogcGFyc2UgUmUvQXNzb2NpYXRpb24gUmVzcG9uc2UgZnJhbWUuICovCisJaWYgKHNpcl9jb252ZXJ0X2Fzc29jX3Jlc3BfZnJhbWUyX3N0cnVjdChtYWNfY3R4LCBib2R5LAorCQlmcmFtZV9sZW4sIGFzc29jX3JzcCkgPT0gZVNJUl9GQUlMVVJFKSB7CisJCWNkZl9tZW1fZnJlZShhc3NvY19yc3ApOworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiUGFyc2UgZXJyb3IgQXNzb2MgcmVzcCBzdWJ0eXBlICVkLCIgImxlbmd0aD0lZCIpLAorCQkJZnJhbWVfbGVuLCBzdWJ0eXBlKTsKKwkJY2RmX21lbV9mcmVlKGJlYWNvbik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWFzc29jX3JzcC0+c3VwcFJhdGVzUHJlc2VudCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCUZMKCJhc3NvYyByZXNwb25zZSBkb2VzIG5vdCBoYXZlIHN1cHBvcnRlZCByYXRlIHNldCIpKTsKKwkJY2RmX21lbV9jb3B5KCZhc3NvY19yc3AtPnN1cHBvcnRlZFJhdGVzLAorCQkJJnNlc3Npb25fZW50cnktPnJhdGVTZXQsCisJCQlzaXplb2YodFNpck1hY1JhdGVTZXQpKTsKKwl9CisKKwlhc3NvY19jbmYucHJvdFN0YXR1c0NvZGUgPSBhc3NvY19yc3AtPnN0YXR1c0NvZGU7CisJaWYgKHNlc3Npb25fZW50cnktPmFzc29jUnNwICE9IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoInNlc3Npb25fZW50cnktPmFzc29jUnNwIGlzIG5vdCBOVUxMIGZyZWVpbmcgaXQgIgorCQkJICJhbmQgc2V0dGluZyBOVUxMIikpOworCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9lbnRyeS0+YXNzb2NSc3ApOworCQlzZXNzaW9uX2VudHJ5LT5hc3NvY1JzcCA9IE5VTEw7CisJfQorCisJc2Vzc2lvbl9lbnRyeS0+YXNzb2NSc3AgPSBjZGZfbWVtX21hbGxvYyhmcmFtZV9sZW4pOworCWlmIChOVUxMID09IHNlc3Npb25fZW50cnktPmFzc29jUnNwKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhc3NvYyByZXMsbGVuPSVkIiksCisJCQkgZnJhbWVfbGVuKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdG9yZSB0aGUgQXNzb2MgcmVzcG9uc2UuIFRoaXMgaXMgc2VudAorCQkgKiB0byBjc3IvaGRkIGluIGpvaW4gY25mIHJlc3BvbnNlLgorCQkgKi8KKwkJY2RmX21lbV9jb3B5KHNlc3Npb25fZW50cnktPmFzc29jUnNwLCBib2R5LCBmcmFtZV9sZW4pOworCQlzZXNzaW9uX2VudHJ5LT5hc3NvY1JzcExlbiA9IGZyYW1lX2xlbjsKKwl9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWxpbV91cGRhdGVfcmljX2RhdGEobWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSwgYXNzb2NfcnNwKTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCXJvYW1fc2Vzc2lvbiA9CisJCSZtYWNfY3R4LT5yb2FtLnJvYW1TZXNzaW9uW3NtZV9zZXNzaW9uaWRdOworCWlmIChhc3NvY19yc3AtPkZUSW5mby5SMEtIX0lELnByZXNlbnQpIHsKKwkJcm9hbV9zZXNzaW9uLT5mdFNtZUNvbnRleHQucjBraF9pZF9sZW4gPQorCQkJYXNzb2NfcnNwLT5GVEluZm8uUjBLSF9JRC5udW1fUE1LX1IwX0lEOworCQljZGZfbWVtX2NvcHkocm9hbV9zZXNzaW9uLT5mdFNtZUNvbnRleHQucjBraF9pZCwKKwkJCWFzc29jX3JzcC0+RlRJbmZvLlIwS0hfSUQuUE1LX1IwX0lELAorCQkJcm9hbV9zZXNzaW9uLT5mdFNtZUNvbnRleHQucjBraF9pZF9sZW4pOworCX0gZWxzZSB7CisJCXJvYW1fc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnIwa2hfaWRfbGVuID0gMDsKKwkJY2RmX21lbV96ZXJvKHJvYW1fc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnIwa2hfaWQsCisJCQlTSVJfUk9BTV9SMEtIX0lEX01BWF9MRU4pOworCX0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCWxpbV91cGRhdGVfZXNlX3RzcGVjKG1hY19jdHgsIHNlc3Npb25fZW50cnksIGFzc29jX3JzcCk7CisjZW5kaWYKKworCWlmIChhc3NvY19yc3AtPmNhcGFiaWxpdHlJbmZvLmlic3MpIHsKKwkJLyoKKwkJICogUmVjZWl2ZWQgUmUvQXNzb2NpYXRpb24gUmVzcG9uc2UgZnJvbSBwZWVyCisJCSAqIHdpdGggSUJTUyBjYXBhYmlsaXR5IHNldC4KKwkJICogSWdub3JlIHRoZSBmcmFtZSBhbmQgd2FpdCB1bnRpbCBSZS9hc3NvYworCQkgKiBmYWlsdXJlIHRpbWVvdXQuCisJCSAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgicmVjZWl2ZWQgUmUvQXNzb2NSc3AgZnJhbWUgd2l0aCBJQlNTIGNhcGFiaWxpdHkiKSk7CisJCWNkZl9tZW1fZnJlZShhc3NvY19yc3ApOworCQljZGZfbWVtX2ZyZWUoYmVhY29uKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjZmdfZ2V0X2NhcGFiaWxpdHlfaW5mbyhtYWNfY3R4LCAmY2Fwcywgc2Vzc2lvbl9lbnRyeSkKKwkJIT0gZVNJUl9TVUNDRVNTKSB7CisJCWNkZl9tZW1fZnJlZShhc3NvY19yc3ApOworCQljZGZfbWVtX2ZyZWUoYmVhY29uKTsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIENhcGFiaWxpdGllcyAiKSk7CisJCXJldHVybjsKKwl9CisJbGltX2NvcHlfdTE2KCh1aW50OF90ICopICZtYWNfY2FwYWIsIGNhcHMpOworCisJLyogU3RvcCBBc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyICovCisJaWYgKHN1YnR5cGUgPT0gTElNX0FTU09DKQorCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKG1hY19jdHgsIGVMSU1fQVNTT0NfRkFJTF9USU1FUik7CisJZWxzZQorCXsKKwkJLyogU3RvcCBSZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIgKi8KKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwkJbWFjX2N0eC0+bGltLnJlQXNzb2NSZXRyeUF0dGVtcHQgPSAwOworCQlpZiAoKE5VTEwgIT0gbWFjX2N0eC0+bGltLnBTZXNzaW9uRW50cnkpCisJCSAgICAmJiAoTlVMTCAhPQorCQkJbWFjX2N0eC0+bGltLnBTZXNzaW9uRW50cnktPnBMaW1NbG1SZWFzc29jUmV0cnlSZXEpKSB7CisJCQljZGZfbWVtX2ZyZWUoCisJCQltYWNfY3R4LT5saW0ucFNlc3Npb25FbnRyeS0+cExpbU1sbVJlYXNzb2NSZXRyeVJlcSk7CisJCQltYWNfY3R4LT5saW0ucFNlc3Npb25FbnRyeS0+cExpbU1sbVJlYXNzb2NSZXRyeVJlcSA9CisJCQkJTlVMTDsKKwkJfQorI2VuZGlmCisJCWxpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfdGltZXIobWFjX2N0eCwKKwkJCWVMSU1fUkVBU1NPQ19GQUlMX1RJTUVSKTsKKwl9CisKKwlpZiAoYXNzb2NfcnNwLT5zdGF0dXNDb2RlICE9IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQkmJiBhc3NvY19yc3AtPnN0YXR1c0NvZGUgIT0gZVNJUl9NQUNfVFJZX0FHQUlOX0xBVEVSCisjZW5kaWYKKwkgICAgKSB7CisJCS8qCisJCSAqUmUvQXNzb2NpYXRpb24gcmVzcG9uc2Ugd2FzIHJlY2VpdmVkCisJCSAqIGVpdGhlciB3aXRoIGZhaWx1cmUgY29kZS4KKwkJKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInJlY2VpdmVkIFJlL0Fzc29jUnNwIGZyYW1lIGZhaWx1cmUgY29kZSAlZCIpLAorCQkJIGFzc29jX3JzcC0+c3RhdHVzQ29kZSk7CisJCS8qCisJCSAqIE5lZWQgdG8gdXBkYXRlICdhc3NvY2lhdGlvbiBmYWlsdXJlJyBlcnJvciBjb3VudGVyCisJCSAqIGFsb25nIHdpdGggU1RBVFVTIENPREUKKwkJICogUmV0dXJuIEFzc29jIGNvbmZpcm0gdG8gU01FIHdpdGggcmVjZWl2ZWQgZmFpbHVyZSBjb2RlCisJCSovCisJCWFzc29jX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfQVNTT0NfUkVGVVNFRDsKKwkJLyogRGVsZXRlIFByZS1hdXRoIGNvbnRleHQgZm9yIHRoZSBhc3NvY2lhdGVkIEJTUyAqLworCQlpZiAobGltX3NlYXJjaF9wcmVfYXV0aF9saXN0KG1hY19jdHgsIGhkci0+c2EpKQorCQkJbGltX2RlbGV0ZV9wcmVfYXV0aF9ub2RlKG1hY19jdHgsIGhkci0+c2EpOworCQlnb3RvIGFzc29jUmVqZWN0OworCX0gZWxzZSBpZiAoKGFzc29jX3JzcC0+YWlkICYgMHgzRkZGKSA+IDIwMDcpIHsKKwkJLyoKKwkJICogUmUvQXNzb2NpYXRpb24gcmVzcG9uc2Ugd2FzIHJlY2VpdmVkCisJCSAqIHdpdGggaW52YWxpZCBBSUQgdmFsdWUKKwkJKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgicmVjZWl2ZWQgUmUvQXNzb2NSc3AgZnJhbWUgd2l0aCIKKwkJCSJpbnZhbGlkIGFpZCAlWCIpLCBhc3NvY19yc3AtPmFpZCk7CisJCWFzc29jX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9BU1NPQ19SU1BfUlhFRDsKKwkJYXNzb2NfY25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCQkvKiBTZW5kIGFkdmlzb3J5IERpc2Fzc29jaWF0aW9uIGZyYW1lIHRvIEFQICovCisJCWxpbV9zZW5kX2Rpc2Fzc29jX21nbXRfZnJhbWUobWFjX2N0eCwKKwkJCWVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTiwKKwkJCWhkci0+c2EsIHNlc3Npb25fZW50cnksIGZhbHNlKTsKKwkJZ290byBhc3NvY1JlamVjdDsKKwl9CisJLyoKKwkgKiBBc3NvY2lhdGlvbiBSZXNwb25zZSByZWNlaXZlZCB3aXRoIHN1Y2Nlc3MgY29kZQorCSAqIFNldCB0aGUgbGluayBzdGF0ZSB0byBQT1NUQVNTT0Mgbm93IHRoYXQgd2UgaGF2ZSByZWNlaXZlZAorCSAqIGFzc29jL3JlYXNzb2MgcmVzcG9uc2UKKwkgKiBOT1RFOiBmb3IgQlRBTVAgY2FzZSwgaXQgaXMgYmVpbmcgaGFuZGxlZCBpbgorCSAqIGxpbV9wcm9jZXNzX21sbV9hc3NvY19yZXEKKwkgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJaWYgKGFzc29jX3JzcC0+c3RhdHVzQ29kZSA9PSBlU0lSX01BQ19UUllfQUdBSU5fTEFURVIpIHsKKwkJaWYgKGFzc29jX3JzcC0+VGltZW91dEludGVydmFsLnByZXNlbnQgJiYKKwkJKGFzc29jX3JzcC0+VGltZW91dEludGVydmFsLnRpbWVvdXRUeXBlID09CisJCQlTSVJfTUFDX1RJX1RZUEVfQVNTT0NfQ09NRUJBQ0spKSB7CisJCQl1aW50MTZfdCB0aW1lb3V0X3ZhbHVlID0KKwkJCQlhc3NvY19yc3AtPlRpbWVvdXRJbnRlcnZhbC50aW1lb3V0VmFsdWU7CisJCQlpZiAodGltZW91dF92YWx1ZSA8IDEwKSB7CisJCQkJLyoKKwkJCQkgKiBpZiB0aGlzIHZhbHVlIGlzIGxlc3MgdGhhbiAxMCB0aGVuIG91ciB0aW1lcgorCQkJCSAqIHdpbGwgZmFpbCB0byBzdGFydCBhbmQgZHVlIHRvIHRoaXMgd2Ugd2lsbAorCQkJCSAqIG5ldmVyIHJlLWF0dGVtcHQuIEJldHRlciBtb2RpZnkgdGhlIHRpbWVyCisJCQkJICogdmFsdWUgaGVyZS4KKwkJCQkgKi8KKwkJCQl0aW1lb3V0X3ZhbHVlID0gMTA7CisJCQl9CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkJRkwoIkFTU09DIHJlcyB3aXRoIGVTSVJfTUFDX1RSWV9BR0FJTl9MQVRFUiAiCisJCQkJIiByZWN2ZC5TdGFydGluZyB0aW1lciB0byB3YWl0IHRpbWVvdXQ9JWQuIiksCisJCQkJdGltZW91dF92YWx1ZSk7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCQkJY2RmX21jX3RpbWVyX3N0YXJ0KAorCQkJCQkmc2Vzc2lvbl9lbnRyeS0+cG1mQ29tZWJhY2tUaW1lciwKKwkJCQkJdGltZW91dF92YWx1ZSkpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJGYWlsZWQgdG8gc3RhcnQgY29tZWJhY2sgdGltZXIuIikpOworCQkJfQorCQl9IGVsc2UgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJBU1NPQyByZXNwIHdpdGggdHJ5IGFnYWluIGV2ZW50IHJlY3ZkLiAiCisJCQkJIkJ1dCB0cnkgYWdhaW4gdGltZSBpbnRlcnZhbCBJRSBpcyB3cm9uZy4iKSk7CisJCX0KKwkJY2RmX21lbV9mcmVlKGJlYWNvbik7CisJCWNkZl9tZW1fZnJlZShhc3NvY19yc3ApOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJaWYgKCEoKHNlc3Npb25fZW50cnktPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9TVEFfTU9ERSkgfHwKKwkJKChzZXNzaW9uX2VudHJ5LT5ic3NUeXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSkgJiYKKwkJTElNX0lTX0JUX0FNUF9TVEFfUk9MRShzZXNzaW9uX2VudHJ5KSkpKSB7CisJCWlmIChsaW1fc2V0X2xpbmtfc3RhdGUKKwkJCShtYWNfY3R4LCBlU0lSX0xJTktfUE9TVEFTU09DX1NUQVRFLAorCQkJc2Vzc2lvbl9lbnRyeS0+YnNzSWQsCisJCQlzZXNzaW9uX2VudHJ5LT5zZWxmTWFjQWRkciwgTlVMTCwKKwkJCU5VTEwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJTZXQgbGluayBzdGF0ZSB0byBQT1NUQVNTT0MgZmFpbGVkIikpOworCQkJY2RmX21lbV9mcmVlKGJlYWNvbik7CisJCQljZGZfbWVtX2ZyZWUoYXNzb2NfcnNwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoc3VidHlwZSA9PSBMSU1fUkVBU1NPQykgeworCQlsaW1fbG9nCisJCShtYWNfY3R4LCBMT0cxLCBGTCgiU3VjY2Vzc2Z1bGx5IFJlYXNzb2NpYXRlZCB3aXRoIEJTUyIpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KG1hY19jdHgsIFdMQU5fUEVfRElBR19ST0FNX0FTU09DX0NPTVBfRVZFTlQsCisJCQkgICAgICBzZXNzaW9uX2VudHJ5LCBlU0lSX1NVQ0NFU1MsIGVTSVJfU1VDQ0VTUyk7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJaWYgKGFzc29jX3JzcC0+dHNtUHJlc2VudCkKKwkJbGltX3VwZGF0ZV9lc2VfdHNtKG1hY19jdHgsIHNlc3Npb25fZW50cnksIGFzc29jX3JzcCk7CisjZW5kaWYKKwkJaWYgKHNlc3Npb25fZW50cnktPnBMaW1NbG1Kb2luUmVxKSB7CisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9lbnRyeS0+cExpbU1sbUpvaW5SZXEpOworCQkJc2Vzc2lvbl9lbnRyeS0+cExpbU1sbUpvaW5SZXEgPSBOVUxMOworCQl9CisKKwkJc2Vzc2lvbl9lbnRyeS0+bGltQXNzb2NSZXNwb25zZURhdGEgPSAodm9pZCAqKWFzc29jX3JzcDsKKwkJLyoKKwkJICogU3RvcmUgdGhlIFJlQXNzb2NSc3AgRnJhbWUgaW4gRHBoVGFibGUKKwkJICogdG8gYmUgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZyBEZWxTdGEgYW5kCisJCSAqIERlbEJzcyB0byBzZW5kIEFkZEJzcyBhZ2FpbgorCQkgKi8KKwkJc3RhX2RzID0KKwkJCWRwaF9nZXRfaGFzaF9lbnRyeShtYWNfY3R4LCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCQkmc2Vzc2lvbl9lbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisKKwkJaWYgKCFzdGFfZHMpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiY291bGQgbm90IGdldCBoYXNoIGVudHJ5IGF0IERQSCBmb3IiKSk7CisJCQlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwgaGRyLT5zYSwgTE9HRSk7CisJCQlhc3NvY19jbmYucmVzdWx0Q29kZSA9CisJCQkJZVNJUl9TTUVfSU5WQUxJRF9BU1NPQ19SU1BfUlhFRDsKKwkJCWFzc29jX2NuZi5wcm90U3RhdHVzQ29kZSA9CisJCQkJZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCisJCQkvKiBTZW5kIGFkdmlzb3J5IERpc2Fzc29jaWF0aW9uIGZyYW1lIHRvIEFQICovCisJCQlsaW1fc2VuZF9kaXNhc3NvY19tZ210X2ZyYW1lKG1hY19jdHgsCisJCQkJZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OLCBoZHItPnNhLAorCQkJCXNlc3Npb25fZW50cnksIGZhbHNlKTsKKwkJCWdvdG8gYXNzb2NSZWplY3Q7CisJCX0KKyNpZiBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJCWlmIChzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSA9PQorCQkgICAgZUxJTV9NTE1fV1RfRlRfUkVBU1NPQ19SU1BfU1RBVEUpIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiU2VuZGluZyBzZWxmIHN0YSIpKTsKKyNlbmRpZgorCQkJbGltX3VwZGF0ZV9hc3NvY19zdGFfZGF0YXMobWFjX2N0eCwgc3RhX2RzLCBhc3NvY19yc3AsCisJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCQkvKiBTdG9yZSBhc3NpZ25lZCBBSUQgZm9yIFRJTSBwcm9jZXNzaW5nICovCisJCQlzZXNzaW9uX2VudHJ5LT5saW1BSUQgPSBhc3NvY19yc3AtPmFpZCAmIDB4M0ZGRjsKKwkJCS8qIERvd25ncmFkZSB0aGUgRURDQSBwYXJhbWV0ZXJzIGlmIG5lZWRlZCAqLworCQkJbGltX3NldF9hY3RpdmVfZWRjYV9wYXJhbXMobWFjX2N0eCwKKwkJCQlzZXNzaW9uX2VudHJ5LT5nTGltRWRjYVBhcmFtcywKKwkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJCS8qIFNlbmQgdGhlIGFjdGl2ZSBFRENBIHBhcmFtZXRlcnMgdG8gSEFMICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQkJaWYgKCFzZXNzaW9uX2VudHJ5LT5iUm9hbVN5bmNoSW5Qcm9ncmVzcykgeworI2VuZGlmCisJCQlsaW1fc2VuZF9lZGNhX3BhcmFtcyhtYWNfY3R4LAorCQkJCXNlc3Npb25fZW50cnktPmdMaW1FZGNhUGFyYW1zQWN0aXZlLAorCQkJCXN0YV9kcy0+YnNzSWQpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJfQorI2VuZGlmCisJCQlsaW1fYWRkX2Z0X3N0YV9zZWxmKG1hY19jdHgsIChhc3NvY19yc3AtPmFpZCAmIDB4M0ZGRiksCisJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCQljZGZfbWVtX2ZyZWUoYmVhY29uKTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKwkJLyoKKwkJICogSWYgd2UncmUgcmUtYXNzb2NpYXRpbmcgdG8gdGhlIHNhbWUgQlNTLAorCQkgKiB3ZSBkb24ndCB3YW50IHRvIGludm9rZSBkZWxldGUgU1RBLCBkZWxldGUKKwkJICogQlNTLCBhcyB0aGF0IHdvdWxkIHJlbW92ZSB0aGUgYWxyZWFkeQorCQkgKiBlc3RhYmxpc2hlZCBUU1BFQy4gSnVzdCBnbyBhaGVhZCBhbmQgcmUtYWRkCisJCSAqIHRoZSBCU1MsIFNUQSB3aXRoIG5ldyBjYXBhYmlsaXR5IGluZm9ybWF0aW9uLgorCQkgKiBIb3dldmVyLCBpZiB3ZSdyZSByZS1hc3NvY2lhdGluZyB0byBhIGRpZmZlcmVudAorCQkgKiBCU1MsIHRoZW4gZm9sbG93IHRocnUgd2l0aCBkZWwgU1RBLCBkZWwgQlNTLAorCQkgKiBhZGQgQlNTLCBhZGQgU1RBLgorCQkgKi8KKwkJaWYgKHNpcl9jb21wYXJlX21hY19hZGRyKHNlc3Npb25fZW50cnktPmJzc0lkLAorCQkJc2Vzc2lvbl9lbnRyeS0+bGltUmVBc3NvY2Jzc0lkKSkKKwkJCWxpbV9oYW5kbGVfYWRkX2Jzc19pbl9yZV9hc3NvY19jb250ZXh0KG1hY19jdHgsIHN0YV9kcywKKwkJCQkgc2Vzc2lvbl9lbnRyeSk7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIHJlc2V0IHRoZSB1YXBzZCBtYXNrIHNldHRpbmdzIHNpbmNlCisJCQkgKiB3ZSdyZSByZS1hc3NvY2lhdGluZyB0byBuZXcgQVAKKwkJCSAqLworCQkJc2Vzc2lvbl9lbnRyeS0+Z1VhcHNkUGVyQWNEZWxpdmVyeUVuYWJsZU1hc2sgPSAwOworCQkJc2Vzc2lvbl9lbnRyeS0+Z1VhcHNkUGVyQWNUcmlnZ2VyRW5hYmxlTWFzayA9IDA7CisKKwkJCWlmIChsaW1fY2xlYW51cF9yeF9wYXRoKG1hY19jdHgsIHN0YV9kcywgc2Vzc2lvbl9lbnRyeSkKKwkJCQkhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJDb3VsZCBub3QgY2xlYW51cCB0aGUgcnggcGF0aCIpKTsKKwkJCQlnb3RvIGFzc29jUmVqZWN0OworCQkJfQorCQl9CisJCWNkZl9tZW1fZnJlZShiZWFjb24pOworCQlyZXR1cm47CisJfQorCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlN1Y2Nlc3NmdWxseSBBc3NvY2lhdGVkIHdpdGggQlNTICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJIE1BQ19BRERSX0FSUkFZKGhkci0+c2EpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJaWYgKHNlc3Npb25fZW50cnktPmVzZUNvbnRleHQudHNtLnRzbUluZm8uc3RhdGUpCisJCXNlc3Npb25fZW50cnktPmVzZUNvbnRleHQudHNtLnRzbU1ldHJpY3MuUm9hbWluZ0NvdW50ID0gMDsKKyNlbmRpZgorCS8qIFN0b3JlIGFzc2lnbmVkIEFJRCBmb3IgVElNIHByb2Nlc3NpbmcgKi8KKwlzZXNzaW9uX2VudHJ5LT5saW1BSUQgPSBhc3NvY19yc3AtPmFpZCAmIDB4M0ZGRjsKKworCS8qIFNUQSBlbnRyeSB3YXMgY3JlYXRlZCBkdXJpbmcgcHJlLWFzc29jIHN0YXRlLiAqLworCXN0YV9kcyA9IGRwaF9nZXRfaGFzaF9lbnRyeShtYWNfY3R4LCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCSZzZXNzaW9uX2VudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAoc3RhX2RzID09IE5VTEwpIHsKKwkJLyogQ291bGQgbm90IGFkZCBoYXNoIHRhYmxlIGVudHJ5ICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoImNvdWxkIG5vdCBnZXQgaGFzaCBlbnRyeSBhdCBEUEggIikpOworCQlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwgaGRyLT5zYSwgTE9HRSk7CisJCWFzc29jX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQlhc3NvY19jbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCQlsaW1fcG9zdF9zbWVfbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX0FTU09DX0NORiwKKwkJCSh1aW50MzJfdCAqKSAmYXNzb2NfY25mKTsKKwkJY2RmX21lbV9mcmVlKGFzc29jX3JzcCk7CisJCWNkZl9tZW1fZnJlZShiZWFjb24pOworCQlyZXR1cm47CisJfQorCS8qIERlbGV0ZSBQcmUtYXV0aCBjb250ZXh0IGZvciB0aGUgYXNzb2NpYXRlZCBCU1MgKi8KKwlpZiAobGltX3NlYXJjaF9wcmVfYXV0aF9saXN0KG1hY19jdHgsIGhkci0+c2EpKQorCQlsaW1fZGVsZXRlX3ByZV9hdXRoX25vZGUobWFjX2N0eCwgaGRyLT5zYSk7CisKKwlsaW1fdXBkYXRlX2Fzc29jX3N0YV9kYXRhcyhtYWNfY3R4LCBzdGFfZHMsIGFzc29jX3JzcCwgc2Vzc2lvbl9lbnRyeSk7CisJLyoKKwkgKiBFeHRyYWN0IHRoZSBBUCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgYmVhY29uIHRoYXQKKwkgKiB3YXMgcmVjZWl2ZWQgZWFybGllcgorCSovCisJaWVfbGVuID0gbGltX2dldF9pZWxlbl9mcm9tX2Jzc19kZXNjcmlwdGlvbigKKwkJJnNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbik7CisJbGltX2V4dHJhY3RfYXBfY2FwYWJpbGl0aWVzKG1hY19jdHgsCisJCSh1aW50OF90ICopIHNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5pZUZpZWxkcywKKwkJaWVfbGVuLAorCQliZWFjb24pOworCisJaWYgKG1hY19jdHgtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0KKwkJV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorCQlsaW1fZGVjaWRlX3N0YV9wcm90ZWN0aW9uX29uX2Fzc29jKG1hY19jdHgsIGJlYWNvbiwKKwkJCXNlc3Npb25fZW50cnkpOworCisJaWYgKGJlYWNvbi0+ZXJwUHJlc2VudCkgeworCQlpZiAoYmVhY29uLT5lcnBJRUluZm8uYmFya2VyUHJlYW1ibGVNb2RlKQorCQkJc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmZTaG9ydFByZWFtYmxlID0gZmFsc2U7CisJCWVsc2UKKwkJCXNlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZSA9IHRydWU7CisJfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChtYWNfY3R4LCBXTEFOX1BFX0RJQUdfQ09OTkVDVEVELCBzZXNzaW9uX2VudHJ5LAorCQkJICAgICAgZVNJUl9TVUNDRVNTLCBlU0lSX1NVQ0NFU1MpOworI2VuZGlmCisJaWYgKGFzc29jX3JzcC0+UW9zTWFwU2V0LnByZXNlbnQpCisJCWNkZl9tZW1fY29weSgmc2Vzc2lvbl9lbnRyeS0+UW9zTWFwU2V0LAorCQkJJmFzc29jX3JzcC0+UW9zTWFwU2V0LCBzaXplb2YodFNpclFvc01hcFNldCkpOworCSBlbHNlCisJCWNkZl9tZW1femVybygmc2Vzc2lvbl9lbnRyeS0+UW9zTWFwU2V0LCBzaXplb2YodFNpclFvc01hcFNldCkpOworCisJbGltX3VwZGF0ZV9zdGFkc19leHRfY2FwKG1hY19jdHgsIHNlc3Npb25fZW50cnksIGFzc29jX3JzcCwgc3RhX2RzKTsKKwkvKiBVcGRhdGUgdGhlIEJTUyBFbnRyeSwgdGhpcyBlbnRyeSB3YXMgYWRkZWQgZHVyaW5nIHByZWFzc29jLiAqLworCWlmIChlU0lSX1NVQ0NFU1MgPT0gbGltX3N0YV9zZW5kX2FkZF9ic3MobWFjX2N0eCwgYXNzb2NfcnNwLAorCQkJYmVhY29uLAorCQkJJnNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbiwgdHJ1ZSwKKwkJCSBzZXNzaW9uX2VudHJ5KSkgeworCQljZGZfbWVtX2ZyZWUoYXNzb2NfcnNwKTsKKwkJY2RmX21lbV9mcmVlKGJlYWNvbik7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJjb3VsZCBub3QgdXBkYXRlIHRoZSBic3MgZW50cnkiKSk7CisJCWFzc29jX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQlhc3NvY19jbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisJfQorCithc3NvY1JlamVjdDoKKwlpZiAoKHN1YnR5cGUgPT0gTElNX0FTU09DKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCXx8ICgoc3VidHlwZSA9PSBMSU1fUkVBU1NPQykKKwkJJiYgKHNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlID09CisJCSAgICBlTElNX01MTV9XVF9GVF9SRUFTU09DX1JTUF9TVEFURSkpCisjZW5kaWYKKwkgICAgKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkFzc29jIFJlamVjdGVkIGJ5IHRoZSBwZWVyLiAiCisJCQkibWxtZXN0YXRlOiAlZCBzZXNzaW9uaWQgJWQgUmVhc29uOiAlZCBNQUNBRERSOiIKKwkJCU1BQ19BRERSRVNTX1NUUiksCisJCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSwKKwkJCXNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkLAorCQkJYXNzb2NfY25mLnJlc3VsdENvZGUsIE1BQ19BRERSX0FSUkFZKGhkci0+c2EpKTsKKwkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9JRExFX1NUQVRFOworCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfTUxNX1NUQVRFLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSkpOworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+cExpbU1sbUpvaW5SZXEpIHsKKwkJCWNkZl9tZW1fZnJlZShzZXNzaW9uX2VudHJ5LT5wTGltTWxtSm9pblJlcSk7CisJCQlzZXNzaW9uX2VudHJ5LT5wTGltTWxtSm9pblJlcSA9IE5VTEw7CisJCX0KKwkJaWYgKHN1YnR5cGUgPT0gTElNX0FTU09DKSB7CisJCQlsaW1fcG9zdF9zbWVfbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX0FTU09DX0NORiwKKwkJCQkodWludDMyX3QgKikgJmFzc29jX2NuZik7CisJCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQllbHNlIHsKKwkJCWFzc29jX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfRlRfUkVBU1NPQ19GQUlMVVJFOworCQkJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9SRUFTU09DX0NORiwKKwkJCQkJKHVpbnQzMl90ICopJmFzc29jX2NuZik7CisJCX0KKyNlbmRpZgorCX0gZWxzZSB7CisJCWxpbV9yZXN0b3JlX3ByZV9yZWFzc29jX3N0YXRlKG1hY19jdHgsCisJCQllU0lSX1NNRV9SRUFTU09DX1JFRlVTRUQsCisJCQlhc3NvY19jbmYucHJvdFN0YXR1c0NvZGUsCisJCQlzZXNzaW9uX2VudHJ5KTsKKwl9CisKKwljZGZfbWVtX2ZyZWUoYmVhY29uKTsKKwljZGZfbWVtX2ZyZWUoYXNzb2NfcnNwKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX2F1dGhfZnJhbWUuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfYXV0aF9mcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NzFjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX2F1dGhfZnJhbWUuYwpAQCAtMCwwICsxLDE5MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV9wcm9jZXNzX2F1dGhfZnJhbWUuY2MgY29udGFpbnMgdGhlIGNvZGUKKyAqIGZvciBwcm9jZXNzaW5nIHJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIEZyYW1lLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDMvMTEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMDUvMTIvMjAxMCAgICAganMgICAgICAgICAgICAgVG8gc3VwcG9ydCBTaGFyZWQga2V5IGF1dGhlbnRpY2F0aW9uIGF0IEFQIHNpZGUKKyAqCisgKi8KKworI2luY2x1ZGUgInduaV9hcGkuaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKworI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9hc3NvY191dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZWN1cml0eV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZXJfZGVzX3V0aWxzLmgiCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlICJsaW1fZnQuaCIKKyNlbmRpZgorI2luY2x1ZGUgImNkc191dGlscy5oIgorCisvKioKKyAqIGlzX2F1dGhfdmFsaWQKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19hdXRoX2ZyYW1lKCkgdXBvbiBBdXRoZW50aWNhdGlvbgorICogZnJhbWUgcmVjZXB0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB0ZXN0IHZhbGlkaXR5IG9mIGF1dGggZnJhbWU6CisgKiAtIEFVVEgxIGFuZCBBVVRIMyBtdXN0IGJlIHJlY2VpdmVkIGluIEFQIG1vZGUKKyAqIC0gQVVUSDIgYW5kIEFVVEg0IG11c3QgYmUgcmVjZWl2ZWQgaW4gU1RBIG1vZGUKKyAqIC0gQVVUSDMgYW5kIEFVVEg0IG11c3QgaGF2ZSBjaGFsbGVuZ2UgdGV4dCBJRSwgdGhhdCBpcywndHlwZScgZmllbGQgaGFzIGJlZW4gc2V0IHRvCisgKiAgICAgICAgICAgICAgICAgU0lSX01BQ19DSEFMTEVOR0VfVEVYVF9FSUQgYnkgcGFyc2VyCisgKiAtCisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgKmF1dGggLSBQb2ludGVyIHRvIGV4dHJhY3RlZCBhdXRoIGZyYW1lIGJvZHkKKyAqCisgKiBAcmV0dXJuIDAgb3IgMSAoVmFsaWQpCisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaXNfYXV0aF92YWxpZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgdHBTaXJNYWNBdXRoRnJhbWVCb2R5IGF1dGgsCisJCQkJCSB0cFBFU2Vzc2lvbiBzZXNzaW9uRW50cnkpCit7CisJdW5zaWduZWQgaW50IHZhbGlkID0gMTsKKworCWlmICgoKGF1dGgtPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9PSBTSVJfTUFDX0FVVEhfRlJBTUVfMSkgfHwKKwkgICAgKGF1dGgtPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9PSBTSVJfTUFDX0FVVEhfRlJBTUVfMykpICYmCisJICAgIChMSU1fSVNfU1RBX1JPTEUoc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHNlc3Npb25FbnRyeSkpKQorCQl2YWxpZCA9IDA7CisKKwlpZiAoKChhdXRoLT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPT0gU0lSX01BQ19BVVRIX0ZSQU1FXzIpIHx8CisJICAgIChhdXRoLT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPT0gU0lSX01BQ19BVVRIX0ZSQU1FXzQpKSAmJgorCSAgICAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbkVudHJ5KSkpCisJCXZhbGlkID0gMDsKKworCWlmICgoKGF1dGgtPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9PSBTSVJfTUFDX0FVVEhfRlJBTUVfMykgfHwKKwkgICAgKGF1dGgtPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9PSBTSVJfTUFDX0FVVEhfRlJBTUVfNCkpICYmCisJICAgIChhdXRoLT50eXBlICE9IFNJUl9NQUNfQ0hBTExFTkdFX1RFWFRfRUlEKSAmJgorCSAgICAoYXV0aC0+YXV0aEFsZ29OdW1iZXIgIT0gZVNJUl9TSEFSRURfS0VZKSkKKwkJdmFsaWQgPSAwOworCisJcmV0dXJuIHZhbGlkOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX2F1dGhfZnJhbWUKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbiBBdXRoZW50aWNhdGlvbgorICogZnJhbWUgcmVjZXB0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lIGFuZCByZXNwb25kcworICogd2l0aCBlaXRoZXIgbmV4dCBBdXRoZW50aWNhdGlvbiBmcmFtZSBpbiBzZXF1ZW5jZSB0byBwZWVyIE1BQyBlbnRpdHkKKyAqIG9yIExJTV9NTE1fQVVUSF9JTkQgb24gQVAgb3IgTElNX01MTV9BVVRIX0NORiBvbiBTVEEuCisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICogMS4gQXV0aGVudGljYXRpb24gZmFpbHVyZXMgYXJlIHJlcG9ydGVkIHRvIFNNRSB3aXRoIHNhbWUgc3RhdHVzIGNvZGUKKyAqICAgIHJlY2VpdmVkIGZyb20gdGhlIHBlZXIgTUFDIGVudGl0eS4KKyAqIDIuIEF1dGhlbnRpY2F0aW9uIGZyYW1lMi80IHJlY2VpdmVkIHdpdGggYWxvZ2lydGhtIG51bWJlciBvdGhlciB0aGFuCisgKiAgICBvbmUgcmVxdWVzdGVkIGluIGZyYW1lMS8zIGFyZSBsb2dnZWQgd2l0aCBhbiBlcnJvciBhbmQgYXV0aCBjb25maXJtCisgKiAgICB3aWxsIGJlIHNlbnQgdG8gU01FIG9ubHkgYWZ0ZXIgYXV0aCBmYWlsdXJlIHRpbWVvdXQuCisgKiAzLiBJbmNvbnNpc3RlbmN5IGluIHRoZSBzcGVjOgorICogICAgT24gcmVjZWl2aW5nIEF1dGggZnJhbWUyLCBzcGVjcyBzYXlzIHRoYXQgaWYgV0VQIGtleSBtYXBwaW5nIGtleQorICogICAgb3IgZGVmYXVsdCBrZXkgaXMgTlVMTCwgQXV0aCBmcmFtZTMgd2l0aCBhIHN0YXR1cyBjb2RlIDE1IChjaGFsbGVuZ2UKKyAqICAgIGZhaWx1cmUgdG8gYmUgcmV0dXJuZWQgdG8gcGVlciBlbnRpdHkuIEhvd2V2ZXIsIHNlY3Rpb24gNy4yLjMuMTAsCisgKiAgICB0YWJsZSAxNCBzYXlzIHRoYXQgc3RhdHVzIGNvZGUgZmllbGQgaXMgJ3Jlc2VydmVkJyBmb3IgZnJhbWUzICEKKyAqICAgIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBBdXRoIGZyYW1lMyBpcyByZXR1cm5lZCB3aXRoIHN0YXR1cworICogICAgY29kZSAxNSBvdmVycmlkaW5nIHNlY3Rpb24gNy4yLjMuMTAuCisgKiA0LiBJZiBudW1iZXIgcHJlLWF1dGhlbnRpY2F0aW9ucyByZWFjaCBjb25maWdyYWJsZSBtYXggbGltaXQsCisgKiAgICBBdXRoZW50aWNhdGlvbiBmcmFtZSB3aXRoICd1bnNwZWNpZmllZCBmYWlsdXJlJyBzdGF0dXMgY29kZSBpcworICogICAgcmV0dXJuZWQgdG8gcmVxdWVzdGluZyBlbnRpdHkuCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcFJ4UGFja2V0SW5mbyAtIEEgcG9pbnRlciB0byBSeCBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbV9wcm9jZXNzX2F1dGhfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcFJ4UGFja2V0SW5mbywKKwkJICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDhfdCAqcEJvZHksIGtleUlkLCBjZmdQcml2YWN5T3B0SW1wLAorCQkgZGVmYXVsdEtleVtTSVJfTUFDX0tFWV9MRU5HVEhdLAorCQkgZW5jckF1dGhGcmFtZVtMSU1fRU5DUl9BVVRIX0JPRFlfTEVOXSwgcGxhaW5Cb2R5WzI1Nl07CisJdWludDE2X3QgZnJhbWVMZW47CisJdWludDMyX3QgbWF4TnVtUHJlQXV0aCwgdmFsOworCXRTaXJNYWNBdXRoRnJhbWVCb2R5ICpwUnhBdXRoRnJhbWVCb2R5LCByeEF1dGhGcmFtZSwgYXV0aEZyYW1lOworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXN0cnVjdCB0TGltUHJlQXV0aE5vZGUgKnBBdXRoTm9kZTsKKwl1aW50OF90IGRlY3J5cHRSZXN1bHQ7CisJdWludDhfdCAqcENoYWxsZW5nZTsKKwl1aW50MzJfdCBrZXlfbGVuZ3RoID0gODsKKwl1aW50OF90IGNoYWxsZW5nZVRleHRBcnJheVtTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX0xFTkdUSF07CisJdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworCXVpbnQxNl90IGFzc29jSWQgPSAwOworCXVpbnQxNl90IGN1cnJfc2VxX251bSA9IDA7CisKKwkvKiBHZXQgcG9pbnRlciB0byBBdXRoZW50aWNhdGlvbiBmcmFtZSBoZWFkZXIgYW5kIGJvZHkgKi8KKwlwSGRyID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworCWZyYW1lTGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKTsKKworCWlmICghZnJhbWVMZW4pIHsKKwkJLyogTG9nIGVycm9yICovCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJyZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZSB3aXRoIG5vIGJvZHkgZnJvbSAiKSk7CisJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HRSk7CisKKwkJcmV0dXJuOworCX0KKworCWlmIChsaW1faXNfZ3JvdXBfYWRkcihwSGRyLT5zYSkpIHsKKwkJLyogUmVjZWl2ZWQgQXV0aCBmcmFtZSBmcm9tIGEgQkMvTUMgYWRkcmVzcyAqLworCQkvKiBMb2cgZXJyb3IgYW5kIGlnbm9yZSBpdCAqLworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMICgKKwkJCQkicmVjZWl2ZWQgQXV0aCBmcmFtZSBmcm9tIGEgQkMvTUMgYWRkciAtICIpKTsKKwkJUEVMT0dFKGxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HRSk7KQorCisJCXJldHVybjsKKwl9CisJY3Vycl9zZXFfbnVtID0gKHBIZHItPnNlcUNvbnRyb2wuc2VxTnVtSGkgPDwgNCkgfAorCQkJKHBIZHItPnNlcUNvbnRyb2wuc2VxTnVtTG8pOworCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgiU2Vzc2lvbmlkOiAlZCBTeXN0ZW0gcm9sZSA6ICVkIGxpbU1sbVN0YXRlOiAlZCA6QXV0aCAiCisJCSAgICJGcmFtZSBSZWNlaXZlZDogQlNTSUQ6ICIgTUFDX0FERFJFU1NfU1RSICIgKFJTU0kgJWQpIiksCisJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpLAorCQlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSwgTUFDX0FERFJfQVJSQVkocEhkci0+YnNzSWQpLAorCQkodWludCkgYWJzKChpbnQ4X3QpIFdNQV9HRVRfUlhfUlNTSV9EQihwUnhQYWNrZXRJbmZvKSkpOworCisJcEJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKworCS8qIFJlc3RvcmUgZGVmYXVsdCBmYWlsdXJlIHRpbWVvdXQgKi8KKwlpZiAoQ0RGX1AyUF9DTElFTlRfTU9ERSA9PSBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEKKwkgICAgJiYgcHNlc3Npb25FbnRyeS0+ZGVmYXVsdEF1dGhGYWlsdXJlVGltZW91dCkgeworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJSZXN0b3JlIGRlZmF1bHQgZmFpbHVyZSB0aW1lb3V0IikpOworCQljZmdfc2V0X2ludChwTWFjLCBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVQsCisJCQkJcHNlc3Npb25FbnRyeS0+ZGVmYXVsdEF1dGhGYWlsdXJlVGltZW91dCk7CisJfQorCS8qIC8gRGV0ZXJtaW5lIGlmIFdFUCBiaXQgaXMgc2V0IGluIHRoZSBGQyBvciByZWNlaXZlZCBNQUMgaGVhZGVyICovCisJaWYgKHBIZHItPmZjLndlcCkgeworCQkvKioKKwkJICogV0VQIGJpdCBpcyBzZXQgaW4gRkMgb2YgTUFDIGhlYWRlci4KKwkJICovCisKKwkJLyogSWYgVEtJUCBjb3VudGVyIG1lYXN1cmVzIGVuYWJsZWQgaXNzdWUgRGVhdXRoIGZyYW1lIHRvIHN0YXRpb24gKi8KKwkJaWYgKHBzZXNzaW9uRW50cnktPmJUa2lwQ250ck1lYXNBY3RpdmUgJiYKKwkJICAgIExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgiVGtpcCBjb3VudGVyIG1lYXN1cmVzIEVuYWJsZWQsIHNlbmRpbmcgRGVhdXRoIGZyYW1lIHRvIikpOworCQkJICAgICAgICkKKwkJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HRSk7CisKKwkJCWxpbV9zZW5kX2RlYXV0aF9tZ210X2ZyYW1lKHBNYWMsCisJCQkJCQkgICBlU0lSX01BQ19NSUNfRkFJTFVSRV9SRUFTT04sCisJCQkJCQkgICBwSGRyLT5zYSwgcHNlc3Npb25FbnRyeSwgZmFsc2UpOworCQkJcmV0dXJuOworCQl9CisJCS8qIEV4dHJhY3Qga2V5IElEIGZyb20gSVYgKG1vc3QgMiBiaXRzIG9mIDR0aCBieXRlIG9mIElWKSAqLworCisJCWtleUlkID0gKCoocEJvZHkgKyAzKSkgPj4gNjsKKworCQkvKioKKwkJICogT24gU1RBIGluIGluZnJhc3RydWN0dXJlIEJTUywgQXV0aGVudGljYXRpb24gZnJhbWVzIHJlY2VpdmVkCisJCSAqIHdpdGggV0VQIGJpdCBzZXQgaW4gdGhlIEZDIG11c3QgYmUgcmVqZWN0ZWQgd2l0aCBjaGFsbGVuZ2UKKwkJICogZmFpbHVyZSBzdGF0dXMgY29kZSAod2llcmQgdGhpbmcgaW4gdGhlIHNwZWMgLSB0aGlzIHNob3VsZCBoYXZlCisJCSAqIGJlZW4gcmVqZWN0ZWQgd2l0aCB1bnNwZWNpZmllZCBmYWlsdXJlIG9yIHVuZXhwZWN0ZWQgYXNzZXJ0aW9uCisJCSAqIG9mIHdlcCBiaXQgKHRoaXMgc3RhdHVzIGNvZGUgZG9lcyBub3QgZXhpc3QgdGhvdWdoKSBvcgorCQkgKiBPdXQtb2Ytc2VxdWVuY2UtQXV0aGVudGljYXRpb24tRnJhbWUgc3RhdHVzIGNvZGUuCisJCSAqLworCisJCWlmIChMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkJICAgIExJTV9JU19CVF9BTVBfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJCWF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfU0hBUkVEX0tFWTsKKwkJCWF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorCQkJCVNJUl9NQUNfQVVUSF9GUkFNRV80OworCQkJYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKwkJCQllU0lSX01BQ19DSEFMTEVOR0VfRkFJTFVSRV9TVEFUVVM7CisJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoInJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lIHdpdGggd2VwIGJpdCBzZXQgb24gcm9sZT0lZCAiCisJCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIpLAorCQkJCSAgICAgICBHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpLAorCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJICAgICAgICkKKworCQkJbGltX3NlbmRfYXV0aF9tZ210X2ZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisJCQkJCQkgcEhkci0+c2EsCisJCQkJCQkgTElNX05PX1dFUF9JTl9GQywKKwkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChmcmFtZUxlbiA8IExJTV9FTkNSX0FVVEhfQk9EWV9MRU4pIHsKKwkJCS8qIExvZyBlcnJvciAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiTm90IGVub3VnaCBzaXplIFslZF0gdG8gZGVjcnlwdCByZWNlaXZlZCBBdXRoIGZyYW1lIiksCisJCQkJZnJhbWVMZW4pOworCQkJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHBIZHItPnNhLCBMT0dFKTsKKworCQkJcmV0dXJuOworCQl9CisJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJdmFsID0gcHNlc3Npb25FbnRyeS0+cHJpdmFjeTsKKwkJfSBlbHNlCisJCS8qIEFjY2VwdCBBdXRoZW50aWNhdGlvbiBmcmFtZSBvbmx5IGlmIFByaXZhY3kgaXMgaW1wbGVtZW50ZWQgKi8KKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19QUklWQUNZX0VOQUJMRUQsCisJCQkJICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCS8qKgorCQkJICogQ291bGQgbm90IGdldCBQcml2YWN5IG9wdGlvbgorCQkJICogZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJCSAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgUHJpdmFjeSBvcHRpb24iKSk7CisJCX0KKworCQljZmdQcml2YWN5T3B0SW1wID0gKHVpbnQ4X3QpIHZhbDsKKwkJaWYgKGNmZ1ByaXZhY3lPcHRJbXApIHsKKwkJCS8qKgorCQkJICogUHJpdmFjeSBvcHRpb24gaXMgaW1wbGVtZW50ZWQuCisJCQkgKiBDaGVjayBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgQXV0aGVudGljYXRpb24KKwkJCSAqIGZyYW1lMyBhbmQgdGhlcmUgaXMgYSBjb250ZXh0IGZvciByZXF1ZXN0aW5nIFNUQS4KKwkJCSAqIElmIG5vdCwgcmVqZWN0IHdpdGggdW5zcGVjaWZpZWQgZmFpbHVyZSBzdGF0dXMgY29kZQorCQkJICovCisJCQlwQXV0aE5vZGUgPSBsaW1fc2VhcmNoX3ByZV9hdXRoX2xpc3QocE1hYywgcEhkci0+c2EpOworCisJCQlpZiAocEF1dGhOb2RlID09IE5VTEwpIHsKKwkJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkgICAgICAgRkwKKwkJCQkJCSAgICAgICAoInJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lIGZyb20gcGVlciB0aGF0IGhhcyBubyBwcmVhdXRoIGNvbnRleHQgd2l0aCBXRVAgYml0IHNldCAiCisJCQkJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkJICAgICAgICkKKworCQkJCS8qKgorCQkJCSAqIE5vICdwcmUtYXV0aCcgY29udGV4dCBleGlzdHMgZm9yIHRoaXMgU1RBIHRoYXQgc2VudAorCQkJCSAqIGFuIEF1dGhlbnRpY2F0aW9uIGZyYW1lIHdpdGggRkMgYml0IHNldC4KKwkJCQkgKiBTZW5kIEF1dGggZnJhbWU0IHdpdGggJ291dCBvZiBzZXF1ZW5jZScgc3RhdHVzIGNvZGUuCisJCQkJICovCisJCQkJYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0gZVNJUl9TSEFSRURfS0VZOworCQkJCWF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorCQkJCQlTSVJfTUFDX0FVVEhfRlJBTUVfNDsKKwkJCQlhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorCQkJCQllU0lSX01BQ19BVVRIX0ZSQU1FX09VVF9PRl9TRVFfU1RBVFVTOworCisJCQkJbGltX3NlbmRfYXV0aF9tZ210X2ZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisJCQkJCQkJIHBIZHItPnNhLAorCQkJCQkJCSBMSU1fTk9fV0VQX0lOX0ZDLAorCQkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCS8qIC8gQ2hhbmdlIHRoZSBhdXRoLXJlc3BvbnNlIHRpbWVvdXQgKi8KKwkJCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3Blcl9zdGFfaWRfdGltZXIocE1hYywKKwkJCQkJCQkJCSAgIGVMSU1fQVVUSF9SU1BfVElNRVIsCisJCQkJCQkJCQkgICBwQXV0aE5vZGUtPgorCQkJCQkJCQkJICAgYXV0aE5vZGVJZHgpOworCisJCQkJLyogLyAnUHJlLWF1dGgnIHN0YXR1cyBleGlzdHMgZm9yIFNUQSAqLworCQkJCWlmICgocEF1dGhOb2RlLT5tbG1TdGF0ZSAhPQorCQkJCSAgICAgZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTNfU1RBVEUpICYmCisJCQkJICAgIChwQXV0aE5vZGUtPm1sbVN0YXRlICE9CisJCQkJICAgICBlTElNX01MTV9BVVRIX1JTUF9USU1FT1VUX1NUQVRFKSkgeworCQkJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoInJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lIGZyb20gcGVlciB0aGF0IGlzIGluIHN0YXRlICVkICIKKwkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJCSAgICAgICBwQXV0aE5vZGUtPm1sbVN0YXRlLAorCQkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTspCisJCQkJCS8qKgorCQkJCQkgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgQXV0aGVudGljYXRpb24gZnJhbWUKKwkJCQkJICogd2l0aCBXRVAgYml0IHNldCBpbiBGQyBpbiBvdGhlciBzdGF0ZXMuCisJCQkJCSAqIFJlamVjdCBieSBzZW5kaW5nIEF1dGhlbnRpY2F0b24gZnJhbWUgd2l0aAorCQkJCQkgKiBvdXQgb2Ygc2VxdWVuY2UgQXV0aCBmcmFtZSBzdGF0dXMgY29kZS4KKwkJCQkJICovCisJCQkJCWF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9CisJCQkJCQllU0lSX1NIQVJFRF9LRVk7CisJCQkJCWF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorCQkJCQkJU0lSX01BQ19BVVRIX0ZSQU1FXzQ7CisJCQkJCWF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisJCQkJCQllU0lSX01BQ19BVVRIX0ZSQU1FX09VVF9PRl9TRVFfU1RBVFVTOworCisJCQkJCWxpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZShwTWFjLCAmYXV0aEZyYW1lLAorCQkJCQkJCQkgcEhkci0+c2EsCisJCQkJCQkJCSBMSU1fTk9fV0VQX0lOX0ZDLAorCQkJCQkJCQkgcHNlc3Npb25FbnRyeSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisKKwkJCXZhbCA9IFNJUl9NQUNfS0VZX0xFTkdUSDsKKworCQkJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQkJdHBTaXJLZXlzIHBLZXk7CisJCQkJcEtleSA9CisJCQkJCSZwc2Vzc2lvbkVudHJ5LT4KKwkJCQkJV0VQS2V5TWF0ZXJpYWxba2V5SWRdLmtleVswXTsKKwkJCQljZGZfbWVtX2NvcHkoZGVmYXVsdEtleSwgcEtleS0+a2V5LAorCQkJCQkgICAgIHBLZXktPmtleUxlbmd0aCk7CisJCQkJdmFsID0gcEtleS0+a2V5TGVuZ3RoOworCQkJfSBlbHNlIGlmICh3bGFuX2NmZ19nZXRfc3RyKHBNYWMsCisJCQkJCSh1aW50MTZfdCkgKFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzEgKworCQkJCQlrZXlJZCksIGRlZmF1bHRLZXksCisJCQkJICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJCS8qIC8gQ291bGQgbm90IGdldCBEZWZhdWx0IGtleSBmcm9tIENGRy4gKi8KKwkJCQkvKiBMb2cgZXJyb3IuICovCisJCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCQlGTAorCQkJCQkoImNvdWxkIG5vdCByZXRyaWV2ZSBEZWZhdWx0IGtleSIpKTsKKworCQkJCS8qKgorCQkJCSAqIFNlbmQgQXV0aGVudGljYXRpb24gZnJhbWUKKwkJCQkgKiB3aXRoIGNoYWxsZW5nZSBmYWlsdXJlIHN0YXR1cyBjb2RlCisJCQkJICovCisKKwkJCQlhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPQorCQkJCQllU0lSX1NIQVJFRF9LRVk7CisJCQkJYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisJCQkJCVNJUl9NQUNfQVVUSF9GUkFNRV80OworCQkJCWF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisJCQkJCWVTSVJfTUFDX0NIQUxMRU5HRV9GQUlMVVJFX1NUQVRVUzsKKworCQkJCWxpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZShwTWFjLCAmYXV0aEZyYW1lLAorCQkJCQkJCSBwSGRyLT5zYSwKKwkJCQkJCQkgTElNX05PX1dFUF9JTl9GQywKKwkJCQkJCQkgcHNlc3Npb25FbnRyeSk7CisKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWtleV9sZW5ndGggPSB2YWw7CisKKwkJCWRlY3J5cHRSZXN1bHQgPSBsaW1fZGVjcnlwdF9hdXRoX2ZyYW1lKHBNYWMsIGRlZmF1bHRLZXksCisJCQkJCQlwQm9keSwgcGxhaW5Cb2R5LCBrZXlfbGVuZ3RoLAorCQkJCQkJKHVpbnQxNl90KSAoZnJhbWVMZW4gLQorCQkJCQkJU0lSX01BQ19XRVBfSVZfTEVOR1RIKSk7CisJCQlpZiAoZGVjcnlwdFJlc3VsdCA9PSBMSU1fREVDUllQVF9JQ1ZfRkFJTCkgeworCQkJCS8qIExvZyBlcnJvciAqLworCQkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJyZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZSBmcm9tIHBlZXIgdGhhdCBmYWlsZWQgZGVjcnlwdGlvbjogIgorCQkJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkJICAgICAgICkKKwkJCQkvKiAvIElDViBmYWlsdXJlICovCisJCQkJbGltX2RlbGV0ZV9wcmVfYXV0aF9ub2RlKHBNYWMsCisJCQkJCQkJIHBIZHItPnNhKTsKKwkJCQlhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPQorCQkJCQllU0lSX1NIQVJFRF9LRVk7CisJCQkJYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisJCQkJCVNJUl9NQUNfQVVUSF9GUkFNRV80OworCQkJCWF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisJCQkJCWVTSVJfTUFDX0NIQUxMRU5HRV9GQUlMVVJFX1NUQVRVUzsKKworCQkJCWxpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZShwTWFjLCAmYXV0aEZyYW1lLAorCQkJCQkJCSBwSGRyLT5zYSwKKwkJCQkJCQkgTElNX05PX1dFUF9JTl9GQywKKwkJCQkJCQkgcHNlc3Npb25FbnRyeSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKChzaXJfY29udmVydF9hdXRoX2ZyYW1lMl9zdHJ1Y3QKKwkJCQkocE1hYywgcGxhaW5Cb2R5LCBmcmFtZUxlbiAtIDgsCisJCQkJICAgICAmcnhBdXRoRnJhbWUpICE9IGVTSVJfU1VDQ0VTUykgfHwKKwkJCSAgICAoIWlzX2F1dGhfdmFsaWQKKwkJCQkgICAgIChwTWFjLCAmcnhBdXRoRnJhbWUsIHBzZXNzaW9uRW50cnkpKSkgeworCQkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwKKwkJCQkJKCJmYWlsZWQgdG8gY29udmVydCBBdXRoIEZyYW1lIHRvIHN0cnVjdHVyZSBvciBBdXRoIGlzIG5vdCB2YWxpZCAiKSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogTG9nIGVycm9yICovCisJCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJyZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZTMgZnJvbSBwZWVyIHRoYXQgd2hpbGUgcHJpdmFjeSBvcHRpb24gaXMgdHVybmVkIE9GRiAiCisJCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIpLAorCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJICAgICAgICkKKwkJCS8qKgorCQkJICogUHJpdmFjeSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkLgorCQkJICogU28gcmVqZWN0IEF1dGhlbnRpY2F0aW9uIGZyYW1lIHJlY2VpdmVkIHdpdGgKKwkJCSAqIFdFUCBiaXQgc2V0IGJ5IHNlbmRpbmcgQXV0aGVudGljYXRpb24gZnJhbWUKKwkJCSAqIHdpdGggJ2NoYWxsZW5nZSBmYWlsdXJlJyBzdGF0dXMgY29kZS4gVGhpcyBpcworCQkJICogYW5vdGhlciBzdHJhbmdlIHRoaW5nIGluIHRoZSBzcGVjLiBTdGF0dXMgY29kZQorCQkJICogc2hvdWxkIGhhdmUgYmVlbiAndW5zdXBwb3J0ZWQgYWxnb3JpdGhtJyBzdGF0dXMgY29kZS4KKwkJCSAqLworCQkJYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0gZVNJUl9TSEFSRURfS0VZOworCQkJYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisJCQkJU0lSX01BQ19BVVRIX0ZSQU1FXzQ7CisJCQlhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorCQkJCWVTSVJfTUFDX0NIQUxMRU5HRV9GQUlMVVJFX1NUQVRVUzsKKworCQkJbGltX3NlbmRfYXV0aF9tZ210X2ZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisJCQkJCQkgcEhkci0+c2EsCisJCQkJCQkgTElNX05PX1dFUF9JTl9GQywgcHNlc3Npb25FbnRyeSk7CisJCQlyZXR1cm47CisJCX0gLyogZWxzZSBpZiAod2xhbl9jZmdfZ2V0X2ludChDRkdfUFJJVkFDWV9PUFRJT05fSU1QTEVNRU5URUQpKSAqLworCX0gLyogaWYgKGZjLndlcCkgKi8KKwllbHNlIHsKKwkJaWYgKChzaXJfY29udmVydF9hdXRoX2ZyYW1lMl9zdHJ1Y3QocE1hYywgcEJvZHksCisJCQkJCQkgICAgZnJhbWVMZW4sCisJCQkJCQkgICAgJnJ4QXV0aEZyYW1lKSAhPSBlU0lSX1NVQ0NFU1MpCisJCSAgICB8fCAoIWlzX2F1dGhfdmFsaWQocE1hYywgJnJ4QXV0aEZyYW1lLCBwc2Vzc2lvbkVudHJ5KSkpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJmYWlsZWQgdG8gY29udmVydCBBdXRoIEZyYW1lIHRvIHN0cnVjdHVyZSBvciBBdXRoIGlzIG5vdCB2YWxpZCAiKSk7CisJCQkgICAgICAgKQorCQkJcmV0dXJuOworCQl9CisJfQorCisJcFJ4QXV0aEZyYW1lQm9keSA9ICZyeEF1dGhGcmFtZTsKKworCVBFTE9HVyhsaW1fbG9nKHBNYWMsIExPR1csCisJCSAgICAgICBGTAorCQkJICAgICAgICgiUmVjZWl2ZWQgQXV0aCBmcmFtZSB3aXRoIHR5cGU9JWQgc2VxbnVtPSVkLCBzdGF0dXM9JWQgKCVkKSIpLAorCQkgICAgICAgKHVpbnQzMl90KSBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciwKKwkJICAgICAgICh1aW50MzJfdCkgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyLAorCQkgICAgICAgKHVpbnQzMl90KSBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSwKKwkJICAgICAgICh1aW50MzJfdCkgcE1hYy0+bGltLmdMaW1OdW1QcmVBdXRoQ29udGV4dHMpOworCSAgICAgICApCisKKwlzd2l0Y2ggKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlcikgeworCWNhc2UgU0lSX01BQ19BVVRIX0ZSQU1FXzE6CisJCS8qIEF1dGhGcmFtZSAxICovCisKKwkJcFN0YURzID0gZHBoX2xvb2t1cF9oYXNoX2VudHJ5KHBNYWMsIHBIZHItPnNhLAorCQkJCQkgICAgICAgJmFzc29jSWQsCisJCQkJCSAgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCWlmIChwU3RhRHMpIHsKKwkJCXRMaW1NbG1EaXNhc3NvY1JlcSAqcE1sbURpc2Fzc29jUmVxID0gTlVMTDsKKwkJCXRMaW1NbG1EZWF1dGhSZXEgKnBNbG1EZWF1dGhSZXEgPSBOVUxMOworCQkJdEFuaUJvb2wgaXNDb25uZWN0ZWQgPSBlU0lSX1RSVUU7CisKKwkJCXBNbG1EaXNhc3NvY1JlcSA9CisJCQkJcE1hYy0+bGltLmxpbURpc2Fzc29jRGVhdXRoQ25mUmVxLnBNbG1EaXNhc3NvY1JlcTsKKwkJCWlmIChwTWxtRGlzYXNzb2NSZXEKKwkJCSAgICAmJgorCQkJICAgIChjZGZfbWVtX2NvbXBhcmUKKwkJCQkgICAgICgodWludDhfdCAqKSBwSGRyLT5zYSwKKwkJCQkgICAgICh1aW50OF90ICopICZwTWxtRGlzYXNzb2NSZXEtPnBlZXJNYWNBZGRyLAorCQkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpKSB7CisJCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCQkgICAgICAgRkwoIlRPRE86QWNrIGZvciBkaXNhc3NvYyAiCisJCQkJCQkgICJmcmFtZSBpcyBwZW5kaW5nIElzc3VlIGRlbHN0YSBmb3IgIgorCQkJCQkJICBNQUNfQUREUkVTU19TVFIpLAorCQkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocE1sbURpc2Fzc29jUmVxLT4KKwkJCQkJCQkgICAgICBwZWVyTWFjQWRkcikpOworCQkJCSAgICAgICApCisJCQkJbGltX3Byb2Nlc3NfZGlzYXNzb2NfYWNrX3RpbWVvdXQocE1hYyk7CisJCQkJaXNDb25uZWN0ZWQgPSBlU0lSX0ZBTFNFOworCQkJfQorCQkJcE1sbURlYXV0aFJlcSA9CisJCQkJcE1hYy0+bGltLmxpbURpc2Fzc29jRGVhdXRoQ25mUmVxLnBNbG1EZWF1dGhSZXE7CisJCQlpZiAocE1sbURlYXV0aFJlcQorCQkJICAgICYmCisJCQkgICAgKGNkZl9tZW1fY29tcGFyZQorCQkJCSAgICAgKCh1aW50OF90ICopIHBIZHItPnNhLAorCQkJCSAgICAgKHVpbnQ4X3QgKikgJnBNbG1EZWF1dGhSZXEtPnBlZXJNYWNBZGRyLAorCQkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpKSB7CisJCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCQkgICAgICAgRkwoIlRPRE86QWNrIGZvciBkZWF1dGggZnJhbWUgIgorCQkJCQkJICAiaXMgcGVuZGluZyBJc3N1ZSBkZWxzdGEgZm9yICIKKwkJCQkJCSAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBNbG1EZWF1dGhSZXEtPgorCQkJCQkJCSAgICAgIHBlZXJNYWNBZGRyKSk7CisJCQkJICAgICAgICkKKwkJCQlsaW1fcHJvY2Vzc19kZWF1dGhfYWNrX3RpbWVvdXQocE1hYyk7CisJCQkJaXNDb25uZWN0ZWQgPSBlU0lSX0ZBTFNFOworCQkJfQorCisJCQkvKiBwU3RhRFMgIT0gTlVMTCBhbmQgaXNDb25uZWN0ZWQgPSAxIG1lYW5zIHRoZSBTVEEgaXMgYWxyZWFkeQorCQkJICogY29ubmVjdGVkLCBCdXQgU0FQIHJlY2VpdmVkIHRoZSBBdXRoIGZyb20gdGhhdCBzdGF0aW9uLgorCQkJICogRm9yIG5vbiBQTUYgY29ubmVjdGlvbiBzZW5kIERlYXV0aCBmcmFtZSBhcyBTVEEgd2lsbCByZXRyeQorCQkJICogdG8gY29ubmVjdCBiYWNrLgorCQkJICoKKwkJCSAqIEZvciBQTUYgY29ubmVjdGlvbiB0aGUgQVAgc2hvdWxkIG5vdCB0ZWFyIGRvd24gb3Igb3RoZXJ3aXNlCisJCQkgKiBtb2RpZnkgdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBhc3NvY2lhdGlvbiB1bnRpbCB0aGUKKwkJCSAqIFNBLVF1ZXJ5IHByb2NlZHVyZSBkZXRlcm1pbmVzIHRoYXQgdGhlIG9yaWdpbmFsIFNBIGlzCisJCQkgKiBpbnZhbGlkLgorCQkJICovCisJCQlpZiAoaXNDb25uZWN0ZWQKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJCQkgICAgJiYgIXBTdGFEcy0+cm1mRW5hYmxlZAorI2VuZGlmCisJCQkgICAgKSB7CisJCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTAorCQkJCQkJKCJTVEEgaXMgYWxyZWFkeSBjb25uZWN0ZWQgYnV0IHJlY2VpdmVkIGF1dGggZnJhbWUiCisJCQkJCQkiU2VuZCB0aGUgRGVhdXRoIGFuZCBsaW0gRGVsZXRlIFN0YXRpb24gQ29udGV4dCIKKwkJCQkJCSIoc3RhSWQ6ICVkLCBhc3NvY0lkOiAlZCkgIiksCisJCQkJCXBTdGFEcy0+c3RhSW5kZXgsIGFzc29jSWQpOworCQkJCWxpbV9zZW5kX2RlYXV0aF9tZ210X2ZyYW1lKHBNYWMsCisJCQkJCQkJICAgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OLAorCQkJCQkJCSAgICh1aW50OF90ICopIHBIZHItPnNhLAorCQkJCQkJCSAgIHBzZXNzaW9uRW50cnksIGZhbHNlKTsKKwkJCQlsaW1fdHJpZ2dlcl9zdGFfZGVsZXRpb24ocE1hYywgcFN0YURzLAorCQkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJLyogLyBDaGVjayBpZiB0aGVyZSBleGlzdHMgcHJlLWF1dGggY29udGV4dCBmb3IgdGhpcyBTVEEgKi8KKwkJcEF1dGhOb2RlID0gbGltX3NlYXJjaF9wcmVfYXV0aF9saXN0KHBNYWMsIHBIZHItPnNhKTsKKwkJaWYgKHBBdXRoTm9kZSkgeworCQkJLyogLyBQcmUtYXV0aCBjb250ZXh0IGV4aXN0cyBmb3IgdGhlIFNUQSAqLworCQkJaWYgKHBIZHItPmZjLnJldHJ5ID09IDAgfHwKKwkJCQkJcEF1dGhOb2RlLT5zZXFfbnVtICE9IGN1cnJfc2VxX251bSkgeworCQkJCS8qKgorCQkJCSAqIFNUQSBpcyBpbml0aWF0aW5nIGJyYW5kLW5ldyBBdXRoZW50aWNhdGlvbgorCQkJCSAqIHNlcXVlbmNlIGFmdGVyIGxvY2FsIEF1dGggUmVzcG9uc2UgdGltZW91dC4KKwkJCQkgKiBPciBTVEEgcmV0cnlpbmcgdG8gdHJhbnNtaXQgRmlyc3QgQXV0aCBmcmFtZSBkdWUgdG8gcGFja2V0IGRyb3AgT1RBCisJCQkJICogRGVsZXRlIFByZS1hdXRoIG5vZGUgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCQkgKi8KKwkJCQlpZiAocEF1dGhOb2RlLT5mVGltZXJTdGFydGVkKSB7CisJCQkJCWxpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfcGVyX3N0YV9pZF90aW1lcgorCQkJCQkJKHBNYWMsIGVMSU1fQVVUSF9SU1BfVElNRVIsCisJCQkJCQlwQXV0aE5vZGUtPmF1dGhOb2RlSWR4KTsKKwkJCQl9CisJCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCQkgICAgICAgRkwKKwkJCQkJCSAgICAgICAoIlNUQSBpcyBpbml0aWF0aW5nIGJyYW5kLW5ldyBBdXRoZW50aWNhdGlvbiAuLi4iKSk7CisJCQkJICAgICAgICkKKwkJCQlsaW1fZGVsZXRlX3ByZV9hdXRoX25vZGUocE1hYywgcEhkci0+c2EpOworCQkJCS8qKgorCQkJCSAqICBTQVAgTW9kZTpEaXNhc3NvY2lhdGUgdGhlIHN0YXRpb24gYW5kCisJCQkJICogIGRlbGV0ZSBpdHMgZW50cnkgaWYgd2UgaGF2ZSBpdHMgZW50cnkKKwkJCQkgKiAgYWxyZWFkeSBhbmQgcmVjZWl2ZWQgImF1dGgiIGZyb20gdGhlCisJCQkJICogIHNhbWUgc3RhdGlvbi4KKwkJCQkgKi8KKworCQkJCWZvciAoYXNzb2NJZCA9IDA7IGFzc29jSWQgPCBwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlLnNpemU7IGFzc29jSWQrKykgICAgLyogU29mdGFwIGRwaEhhc2hUYWJsZS5zaXplID0gOCAqLworCQkJCXsKKwkJCQkJcFN0YURzID0KKwkJCQkJCWRwaF9nZXRfaGFzaF9lbnRyeShwTWFjLCBhc3NvY0lkLAorCQkJCQkJCQkgICAmcHNlc3Npb25FbnRyeS0+ZHBoLgorCQkJCQkJCQkgICBkcGhIYXNoVGFibGUpOworCisJCQkJCWlmIChOVUxMID09IHBTdGFEcykKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCWlmIChwU3RhRHMtPnZhbGlkKSB7CisJCQkJCQlpZiAoY2RmX21lbV9jb21wYXJlCisJCQkJCQkJICAgICgodWludDhfdCAqKSAmcFN0YURzLT4KKwkJCQkJCQkgICAgc3RhQWRkciwKKwkJCQkJCQkgICAgKHVpbnQ4X3QgKikgJihwSGRyLT5zYSksCisJCQkJCQkJICAgICh1aW50OF90KSAoc2l6ZW9mCisJCQkJCQkJCSAgICAgICAodFNpck1hY0FkZHIpKSkpCisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlwU3RhRHMgPSBOVUxMOworCQkJCX0KKworCQkJCWlmIChOVUxMICE9IHBTdGFEcworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJCQkgICAgJiYgIXBTdGFEcy0+cm1mRW5hYmxlZAorI2VuZGlmCisJCQkJICAgICkgeworCQkJCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkJICAgICAgIEZMCisJCQkJCQkJICAgICAgICgibGltIERlbGV0ZSBTdGF0aW9uIENvbnRleHQgKHN0YUlkOiAlZCwgYXNzb2NJZDogJWQpICIpLAorCQkJCQkJICAgICAgIHBTdGFEcy0+c3RhSW5kZXgsCisJCQkJCQkgICAgICAgYXNzb2NJZCk7CisJCQkJCSAgICAgICApCisJCQkJCWxpbV9zZW5kX2RlYXV0aF9tZ210X2ZyYW1lKHBNYWMsCisJCQkJCQkJCSAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTiwKKwkJCQkJCQkJICAgKHVpbnQ4X3QgKikKKwkJCQkJCQkJICAgcEF1dGhOb2RlLT4KKwkJCQkJCQkJICAgcGVlck1hY0FkZHIsCisJCQkJCQkJCSAgIHBzZXNzaW9uRW50cnksCisJCQkJCQkJCSAgIGZhbHNlKTsKKwkJCQkJbGltX3RyaWdnZXJfc3RhX2RlbGV0aW9uKHBNYWMsIHBTdGFEcywKKwkJCQkJCQkJIHBzZXNzaW9uRW50cnkpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGZpcnN0IGF1dGhlbnRpY2F0aW9uIGZyYW1lIGlzIHJlY2VpdmVkCisJCQkJICogYnV0IEFDSyBsb3N0IGF0IFNUQSBzaWRlLCBpbiB0aGlzIGNhc2UgMm5kIGF1dGggZnJhbWUgaXMgYWxyZWFkeQorCQkJCSAqIGluIHRyYW5zbWlzc2lvbiBxdWV1ZQorCQkJCSAqICovCisJCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCQkgICAgICAgRkwKKwkJCQkJCSAgICAgICAoIlNUQSBpcyBpbml0aWF0aW5nIEF1dGhlbnRpY2F0aW9uIGFmdGVyIEFDSyBsb3N0Li4uIikpOworCQkJCSAgICAgICApCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfTUFYX05VTV9QUkVfQVVUSCwKKwkJCQkgICAgICh1aW50MzJfdCAqKSAmbWF4TnVtUHJlQXV0aCkgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJLyoqCisJCQkgKiBDb3VsZCBub3QgZ2V0IE1heE51bVByZUF1dGgKKwkJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIE1heE51bVByZUF1dGgiKSk7CisJCX0KKwkJaWYgKHBNYWMtPmxpbS5nTGltTnVtUHJlQXV0aENvbnRleHRzID09IG1heE51bVByZUF1dGggJiYKKwkJCSFsaW1fZGVsZXRlX29wZW5fYXV0aF9wcmVfYXV0aF9ub2RlKHBNYWMpKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoIk1heCBudW1iZXIgb2YgcHJlYXV0aCBjb250ZXh0IHJlYWNoZWQiKSk7CisJCQkgICAgICAgKQorCQkJLyoqCisJCQkgKiBNYXhpbXVtIG51bWJlciBvZiBwcmUtYXV0aCBjb250ZXh0cworCQkJICogcmVhY2hlZC4gU2VuZCBBdXRoZW50aWNhdGlvbiBmcmFtZQorCQkJICogd2l0aCB1bnNwZWNpZmllZCBmYWlsdXJlCisJCQkgKi8KKwkJCWF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9CisJCQkJcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXI7CisJCQlhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKwkJCQlwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgKyAxOworCQkJYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKwkJCQllU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisKKwkJCWxpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZShwTWFjLCAmYXV0aEZyYW1lLAorCQkJCQkJIHBIZHItPnNhLAorCQkJCQkJIExJTV9OT19XRVBfSU5fRkMsIHBzZXNzaW9uRW50cnkpOworCisJCQlyZXR1cm47CisJCX0KKwkJLyogLyBObyBQcmUtYXV0aCBjb250ZXh0IGV4aXN0cyBmb3IgdGhlIFNUQS4gKi8KKwkJaWYgKGxpbV9pc19hdXRoX2FsZ29fc3VwcG9ydGVkKHBNYWMsICh0QW5pQXV0aFR5cGUpCisJCQkJCSAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciwKKwkJCQkJICAgICAgIHBzZXNzaW9uRW50cnkpKSB7CisJCQlzd2l0Y2ggKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyKSB7CisJCQljYXNlIGVTSVJfT1BFTl9TWVNURU06CisJCQkJUEVMT0dXKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJCQkgICAgICAgRkwoIj09PT09PT0+IGVTSVJfT1BFTl9TWVNURU0gIC4uLiIpKTsKKwkJCQkgICAgICAgKQorCQkJCS8qIC8gQ3JlYXRlIGVudHJ5IGZvciB0aGlzIFNUQSBpbiBwcmUtYXV0aCBsaXN0ICovCisJCQkJcEF1dGhOb2RlID0KKwkJCQkJbGltX2FjcXVpcmVfZnJlZV9wcmVfYXV0aF9ub2RlKHBNYWMsCisJCQkJCQkJCSAgICAgICAmcE1hYy0+bGltLgorCQkJCQkJCQkgICAgICAgZ0xpbVByZUF1dGhUaW1lclRhYmxlKTsKKwkJCQlpZiAocEF1dGhOb2RlID09IE5VTEwpIHsKKwkJCQkJLyogTG9nIGVycm9yICovCisJCQkJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCQkJCUZMCisJCQkJCQkJKCJNYXggcHJlLWF1dGggbm9kZXMgcmVhY2hlZCAiKSk7CisJCQkJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCVBFTE9HMShsaW1fbG9nCisJCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkJICAgICAgIEZMKCJBbGxvYyBuZXcgZGF0YTogJXggcGVlciAiKSwKKwkJCQkJICAgICAgIHBBdXRoTm9kZSk7CisJCQkJICAgICAgIGxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7CisJCQkJICAgICAgICkKKworCQkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwQXV0aE5vZGUtPgorCQkJCQkgICAgIHBlZXJNYWNBZGRyLCBwSGRyLT5zYSwKKwkJCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCQkJCXBBdXRoTm9kZS0+bWxtU3RhdGUgPQorCQkJCQllTElNX01MTV9BVVRIRU5USUNBVEVEX1NUQVRFOworCQkJCXBBdXRoTm9kZS0+YXV0aFR5cGUgPSAodEFuaUF1dGhUeXBlKQorCQkJCQkJICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXI7CisJCQkJcEF1dGhOb2RlLT5mU2VlbiA9IDA7CisJCQkJcEF1dGhOb2RlLT5mVGltZXJTdGFydGVkID0gMDsKKwkJCQlwQXV0aE5vZGUtPnNlcV9udW0gPQorCQkJCQkoKHBIZHItPnNlcUNvbnRyb2wuc2VxTnVtSGkgPDwgNCkgfAorCQkJCQkgKHBIZHItPnNlcUNvbnRyb2wuc2VxTnVtTG8pKTsKKwkJCQlwQXV0aE5vZGUtPnRpbWVzdGFtcCA9CisJCQkJCWNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisJCQkJbGltX2FkZF9wcmVfYXV0aF9ub2RlKHBNYWMsIHBBdXRoTm9kZSk7CisKKwkJCQkvKioKKwkJCQkgKiBTZW5kIEF1dGhlbnRpY2F0b24gZnJhbWUgd2l0aCBTdWNjZXNzCisJCQkJICogc3RhdHVzIGNvZGUuCisJCQkJICovCisKKwkJCQlhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPQorCQkJCQlwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcjsKKwkJCQlhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKwkJCQkJcFJ4QXV0aEZyYW1lQm9keS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyICsKKwkJCQkJMTsKKwkJCQlhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorCQkJCQllU0lSX01BQ19TVUNDRVNTX1NUQVRVUzsKKwkJCQlsaW1fc2VuZF9hdXRoX21nbXRfZnJhbWUocE1hYywgJmF1dGhGcmFtZSwgcEhkci0+c2EsCisJCQkJCQkJIExJTV9OT19XRVBfSU5fRkMsCisJCQkJCQkJIHBzZXNzaW9uRW50cnkpOworCQkJCWJyZWFrOworCisJCQljYXNlIGVTSVJfU0hBUkVEX0tFWToKKwkJCQlQRUxPR1cobGltX2xvZworCQkJCQkgICAgICAgKHBNYWMsIExPR1csCisJCQkJCSAgICAgICBGTCgiPT09PT09PT4gZVNJUl9TSEFSRURfS0VZICAuLi4iKSk7CisJCQkJICAgICAgICkKKwkJCQlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJCQkJdmFsID0gcHNlc3Npb25FbnRyeS0+cHJpdmFjeTsKKwkJCQl9IGVsc2UKKwkJCQlpZiAod2xhbl9jZmdfZ2V0X2ludAorCQkJCQkgICAgKHBNYWMsIFdOSV9DRkdfUFJJVkFDWV9FTkFCTEVELAorCQkJCQkgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkJCS8qKgorCQkJCQkgKiBDb3VsZCBub3QgZ2V0IFByaXZhY3kgb3B0aW9uCisJCQkJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCQkJCSAqLworCQkJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJCQlGTAorCQkJCQkJCSgiY291bGQgbm90IHJldHJpZXZlIFByaXZhY3kgb3B0aW9uIikpOworCQkJCX0KKwkJCQljZmdQcml2YWN5T3B0SW1wID0gKHVpbnQ4X3QpIHZhbDsKKwkJCQlpZiAoIWNmZ1ByaXZhY3lPcHRJbXApIHsKKwkJCQkJLyogTG9nIGVycm9yICovCisJCQkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCQkgICAgICAgRkwKKwkJCQkJCQkgICAgICAgKCJyZWNlaXZlZCBBdXRoIGZyYW1lIGZvciB1bnN1cHBvcnRlZCBhdXRoIGFsZ29yaXRobSAlZCAiCisJCQkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJCQkgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+CisJCQkJCQkgICAgICAgYXV0aEFsZ29OdW1iZXIsCisJCQkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCQkJICAgICAgICkKKworCQkJCQkvKioKKwkJCQkJICogQXV0aGVudGljYXRvciBkb2VzIG5vdCBoYXZlIFdFUAorCQkJCQkgKiBpbXBsZW1lbnRlZC4KKwkJCQkJICogUmVqZWN0IGJ5IHNlbmRpbmcgQXV0aGVudGljYXRpb24gZnJhbWUKKwkJCQkJICogd2l0aCBBdXRoIGFsZ29yaXRobSBub3Qgc3VwcG9ydGVkIHN0YXR1cworCQkJCQkgKiBjb2RlLgorCQkJCQkgKi8KKwkJCQkJYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0KKwkJCQkJCXBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyOworCQkJCQlhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKwkJCQkJCXBSeEF1dGhGcmFtZUJvZHktPgorCQkJCQkJYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyICsgMTsKKwkJCQkJYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKwkJCQkJCWVTSVJfTUFDX0FVVEhfQUxHT19OT1RfU1VQUE9SVEVEX1NUQVRVUzsKKworCQkJCQlsaW1fc2VuZF9hdXRoX21nbXRfZnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKwkJCQkJCQkJIHBIZHItPnNhLAorCQkJCQkJCQkgTElNX05PX1dFUF9JTl9GQywKKwkJCQkJCQkJIHBzZXNzaW9uRW50cnkpOworCQkJCQlyZXR1cm47CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogQ3JlYXRlIGVudHJ5IGZvciB0aGlzIFNUQSAqLworCQkJCQkvKiBpbiBwcmUtYXV0aCBsaXN0ICovCisJCQkJCXBBdXRoTm9kZSA9CisJCQkJCQlsaW1fYWNxdWlyZV9mcmVlX3ByZV9hdXRoX25vZGUocE1hYywKKwkJCQkJCQkJCSAgICAgICAmcE1hYy0+CisJCQkJCQkJCQkgICAgICAgbGltLgorCQkJCQkJCQkJICAgICAgIGdMaW1QcmVBdXRoVGltZXJUYWJsZSk7CisJCQkJCWlmIChwQXV0aE5vZGUgPT0gTlVMTCkgeworCQkJCQkJLyogTG9nIGVycm9yICovCisJCQkJCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJCQkJRkwKKwkJCQkJCQkJKCJNYXggcHJlLWF1dGggbm9kZXMgcmVhY2hlZCAiKSk7CisJCQkJCQlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcEhkci0+c2EsCisJCQkJCQkJCSAgIExPR1cpOworCisJCQkJCQlyZXR1cm47CisJCQkJCX0KKworCQkJCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcEF1dGhOb2RlLT4KKwkJCQkJCSAgICAgcGVlck1hY0FkZHIsIHBIZHItPnNhLAorCQkJCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCQkJCQlwQXV0aE5vZGUtPm1sbVN0YXRlID0KKwkJCQkJCWVMSU1fTUxNX1dUX0FVVEhfRlJBTUUzX1NUQVRFOworCQkJCQlwQXV0aE5vZGUtPmF1dGhUeXBlID0gKHRBbmlBdXRoVHlwZSkKKwkJCQkJCQkgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcjsKKwkJCQkJcEF1dGhOb2RlLT5mU2VlbiA9IDA7CisJCQkJCXBBdXRoTm9kZS0+ZlRpbWVyU3RhcnRlZCA9IDA7CisJCQkJCXBBdXRoTm9kZS0+c2VxX251bSA9CisJCQkJCQkoKHBIZHItPnNlcUNvbnRyb2wuc2VxTnVtSGkgPDwKKwkJCQkJCSAgNCkgfAorCQkJCQkJIChwSGRyLT5zZXFDb250cm9sLnNlcU51bUxvKSk7CisJCQkJCXBBdXRoTm9kZS0+dGltZXN0YW1wID0KKwkJCQkJCWNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisJCQkJCWxpbV9hZGRfcHJlX2F1dGhfbm9kZShwTWFjLCBwQXV0aE5vZGUpOworCisJCQkJCVBFTE9HMShsaW1fbG9nCisJCQkJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkJCQkgICAgICAgRkwKKwkJCQkJCQkgICAgICAgKCJBbGxvYyBuZXcgZGF0YTogJXggaWQgJWQgcGVlciAiKSwKKwkJCQkJCSAgICAgICBwQXV0aE5vZGUsCisJCQkJCQkgICAgICAgcEF1dGhOb2RlLT5hdXRoTm9kZUlkeCk7CisJCQkJCSAgICAgICApCisJCQkJCVBFTE9HMShsaW1fcHJpbnRfbWFjX2FkZHIKKwkJCQkJCSAgICAgICAocE1hYywgcEhkci0+c2EsIExPRzEpOworCQkJCQkgICAgICAgKQorCQkJCQkvKiAvIENyZWF0ZSBhbmQgYWN0aXZhdGUgQXV0aCBSZXNwb25zZSB0aW1lciAqLworCQkJCQlpZiAodHhfdGltZXJfY2hhbmdlX2NvbnRleHQKKwkJCQkJCSAgICAoJnBBdXRoTm9kZS0+dGltZXIsCisJCQkJCQkgICAgcEF1dGhOb2RlLT5hdXRoTm9kZUlkeCkgIT0KKwkJCQkJICAgIFRYX1NVQ0NFU1MpIHsKKwkJCQkJCS8qIC8gQ291bGQgbm90IHN0YXJ0IEF1dGggcmVzcG9uc2UgdGltZXIuICovCisJCQkJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCQkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQkJCQlGTAorCQkJCQkJCQkoIlVuYWJsZSB0byBjaGcgY29udGV4dCBhdXRoIHJlc3BvbnNlIHRpbWVyIGZvciBwZWVyICIpKTsKKwkJCQkJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5zYSwKKwkJCQkJCQkJICAgTE9HUCk7CisKKwkJCQkJCS8qKgorCQkJCQkJICogU2VuZCBBdXRoZW50aWNhdG9uIGZyYW1lIHdpdGgKKwkJCQkJCSAqIHVuc3BlY2lmaWVkIGZhaWx1cmUgc3RhdHVzIGNvZGUuCisJCQkJCQkgKi8KKworCQkJCQkJYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0KKwkJCQkJCQlwUnhBdXRoRnJhbWVCb2R5LT4KKwkJCQkJCQlhdXRoQWxnb051bWJlcjsKKwkJCQkJCWF1dGhGcmFtZS4KKwkJCQkJCWF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisJCQkJCQkJcFJ4QXV0aEZyYW1lQm9keS0+CisJCQkJCQkJYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyICsKKwkJCQkJCQkxOworCQkJCQkJYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKwkJCQkJCQllU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisKKwkJCQkJCWxpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZShwTWFjLAorCQkJCQkJCQkJICZhdXRoRnJhbWUsCisJCQkJCQkJCQkgcEhkci0+c2EsCisJCQkJCQkJCQkgTElNX05PX1dFUF9JTl9GQywKKwkJCQkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKworCQkJCQkJbGltX2RlbGV0ZV9wcmVfYXV0aF9ub2RlKHBNYWMsCisJCQkJCQkJCQkgcEhkci0+c2EpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisKKwkJCQkJbGltX2FjdGl2YXRlX2F1dGhfcnNwX3RpbWVyKHBNYWMsCisJCQkJCQkJCSAgICBwQXV0aE5vZGUpOworCisJCQkJCXBBdXRoTm9kZS0+ZlRpbWVyU3RhcnRlZCA9IDE7CisKKwkJCQkJLyogZ2V0IHJhbmRvbSBieXRlcyBhbmQgdXNlIGFzICovCisJCQkJCS8qIGNoYWxsZW5nZSB0ZXh0LiBJZiBpdCBmYWlscyB3ZSBhbHJlYWR5IGhhdmUgcmFuZG9tIHN0YWNrIGJ5dGVzLiAqLworCQkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJCQkJICAgIChjZHNfcmFuZF9nZXRfYnl0ZXMKKwkJCQkJCQkgICAgKDAsICh1aW50OF90ICopIGNoYWxsZW5nZVRleHRBcnJheSwKKwkJCQkJCQkgICAgU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9MRU5HVEgpKSkgeworCQkJCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkJCUZMCisJCQkJCQkJCSgiQ2hhbGxlbmdlIHRleHQgcHJlcGFyYXRpb24gZmFpbGVkIGluIGxpbV9wcm9jZXNzX2F1dGhfZnJhbWUiKSk7CisJCQkJCX0KKworCQkJCQlwQ2hhbGxlbmdlID0gcEF1dGhOb2RlLT5jaGFsbGVuZ2VUZXh0OworCisJCQkJCWNkZl9tZW1fY29weShwQ2hhbGxlbmdlLAorCQkJCQkJICAgICAodWludDhfdCAqKQorCQkJCQkJICAgICBjaGFsbGVuZ2VUZXh0QXJyYXksCisJCQkJCQkgICAgIHNpemVvZgorCQkJCQkJICAgICAoY2hhbGxlbmdlVGV4dEFycmF5KSk7CisKKwkJCQkJLyoqCisJCQkJCSAqIFNlbmRpbmcgQXV0aGVudGljYXRvbiBmcmFtZSB3aXRoIGNoYWxsZW5nZS4KKwkJCQkJICovCisKKwkJCQkJYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0KKwkJCQkJCXBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyOworCQkJCQlhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKwkJCQkJCXBSeEF1dGhGcmFtZUJvZHktPgorCQkJCQkJYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyICsgMTsKKwkJCQkJYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKwkJCQkJCWVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTOworCQkJCQlhdXRoRnJhbWUudHlwZSA9CisJCQkJCQlTSVJfTUFDX0NIQUxMRU5HRV9URVhUX0VJRDsKKwkJCQkJYXV0aEZyYW1lLmxlbmd0aCA9CisJCQkJCQlTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX0xFTkdUSDsKKwkJCQkJY2RmX21lbV9jb3B5KGF1dGhGcmFtZS5jaGFsbGVuZ2VUZXh0LAorCQkJCQkJICAgICBwQXV0aE5vZGUtPmNoYWxsZW5nZVRleHQsCisJCQkJCQkgICAgIFNJUl9NQUNfQVVUSF9DSEFMTEVOR0VfTEVOR1RIKTsKKworCQkJCQlsaW1fc2VuZF9hdXRoX21nbXRfZnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKwkJCQkJCQkJIHBIZHItPnNhLAorCQkJCQkJCQkgTElNX05PX1dFUF9JTl9GQywKKwkJCQkJCQkJIHBzZXNzaW9uRW50cnkpOworCQkJCX0gLyogaWYgKHdsYW5fY2ZnX2dldF9pbnQoQ0ZHX1BSSVZBQ1lfT1BUSU9OX0lNUExFTUVOVEVEKSkgKi8KKworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCS8qIExvZyBlcnJvciAqLworCQkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCSAgICAgICBGTAorCQkJCQkJICAgICAgICgicmVjZWl2ZWQgQXV0aCBmcmFtZSBmb3IgdW5zdXBwb3J0ZWQgYXV0aCBhbGdvcml0aG0gJWQgIgorCQkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJCSAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciwKKwkJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkJICAgICAgICkKKworCQkJCS8qKgorCQkJCSAqIFJlc3BvbmRpbmcgcGFydHkgZG9lcyBub3Qgc3VwcG9ydCB0aGUKKwkJCQkgKiBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gcmVxdWVzdGVkIGJ5CisJCQkJICogc2VuZGluZyBwYXJ0eS4KKwkJCQkgKiBSZWplY3QgYnkgc2VuZGluZyBBdXRoZW50aWNhdGlvbiBmcmFtZQorCQkJCSAqIHdpdGggYXV0aCBhbGdvcml0aG0gbm90IHN1cHBvcnRlZCBzdGF0dXMgY29kZQorCQkJCSAqLworCQkJCWF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9CisJCQkJCXBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyOworCQkJCWF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorCQkJCQlwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgKworCQkJCQkxOworCQkJCWF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisJCQkJCWVTSVJfTUFDX0FVVEhfQUxHT19OT1RfU1VQUE9SVEVEX1NUQVRVUzsKKworCQkJCWxpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZShwTWFjLCAmYXV0aEZyYW1lLAorCQkJCQkJCSBwSGRyLT5zYSwKKwkJCQkJCQkgTElNX05PX1dFUF9JTl9GQywKKwkJCQkJCQkgcHNlc3Npb25FbnRyeSk7CisJCQkJcmV0dXJuOworCQkJfSAvKiBlbmQgc3dpdGNoKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyKSAqLworCQl9IC8qIGlmIChsaW1faXNfYXV0aF9hbGdvX3N1cHBvcnRlZChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcikpICovCisJCWVsc2UgeworCQkJLyogTG9nIGVycm9yICovCisJCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJyZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZSBmb3IgdW5zdXBwb3J0ZWQgYXV0aCBhbGdvcml0aG0gJWQgIgorCQkJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIsCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkgICAgICAgKQorCisJCQkvKioKKwkJCSAqIFJlc3BvbmRpbmcgcGFydHkgZG9lcyBub3Qgc3VwcG9ydCB0aGUKKwkJCSAqIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSByZXF1ZXN0ZWQgYnkgc2VuZGluZyBwYXJ0eS4KKwkJCSAqIFJlamVjdCBBdXRoZW50aWNhdGlvbiB3aXRoIFN0YXR1c0NvZGU9MTMuCisJCQkgKi8KKwkJCWF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9CisJCQkJcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXI7CisJCQlhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKwkJCQlwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgKyAxOworCQkJYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKwkJCQllU0lSX01BQ19BVVRIX0FMR09fTk9UX1NVUFBPUlRFRF9TVEFUVVM7CisKKwkJCWxpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZShwTWFjLCAmYXV0aEZyYW1lLAorCQkJCQkJIHBIZHItPnNhLAorCQkJCQkJIExJTV9OT19XRVBfSU5fRkMsIHBzZXNzaW9uRW50cnkpOworCQkJcmV0dXJuOworCQl9IC8qIGVuZCBpZiAobGltX2lzX2F1dGhfYWxnb19zdXBwb3J0ZWQocFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIpKSAqLworCQlicmVhazsKKworCWNhc2UgU0lSX01BQ19BVVRIX0ZSQU1FXzI6CisJCS8qIEF1dGhGcmFtZSAyICovCisKKwkJaWYgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlICE9IGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUyX1NUQVRFKSB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJCS8qKgorCQkJICogQ2hlY2sgaWYgYSBSZWFzc29jaWF0aW9uIGlzIGluIHByb2dyZXNzIGFuZCB0aGlzIGlzIGEKKwkJCSAqIFByZS1BdXRoIGZyYW1lCisJCQkgKi8KKwkJCWlmICgoTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpIHx8CisJCQkgICAgIExJTV9JU19CVF9BTVBfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpCisJCQkgICAgJiYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09CisJCQkJZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURSkKKwkJCSAgICAmJiAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aFN0YXR1c0NvZGUgPT0KKwkJCQllU0lSX01BQ19TVUNDRVNTX1NUQVRVUykKKwkJCSAgICAmJiAocHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSAhPQorCQkJCU5VTEwpCisJCQkgICAgJiYKKwkJCSAgICAoY2RmX21lbV9jb21wYXJlCisJCQkJICAgICAocHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+CisJCQkJICAgICBwcmVBdXRoYnNzSWQsIHBIZHItPnNhLCBzaXplb2YodFNpck1hY0FkZHIpKSkpIHsKKwkJCQkvKiBVcGRhdGUgdGhlIEZUSUVzIGluIHRoZSBzYXZlZCBhdXRoIHJlc3BvbnNlICovCisJCQkJUEVMT0dXKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJCQkgICAgICAgRkwoInJlY2VpdmVkIGFub3RoZXIgUHJlQXV0aCBmcmFtZTIiCisJCQkJCQkgICIgZnJvbSBwZWVyICIgTUFDX0FERFJFU1NfU1RSCisJCQkJCQkgICIgaW4gU21lc3RhdGUgJWQiKSwKKwkJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSwKKwkJCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTsKKwkJCQkgICAgICAgKQorCisJCQkJcHNlc3Npb25FbnRyeS0+ZnRQRUNvbnRleHQuCisJCQkJc2F2ZWRfYXV0aF9yc3BfbGVuZ3RoID0gMDsKKwkJCQlpZiAoKHBCb2R5ICE9IE5VTEwpCisJCQkJICAgICYmIChmcmFtZUxlbiA8IE1BWF9GVElFX1NJWkUpKSB7CisJCQkJCWNkZl9tZW1fY29weShwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC4KKwkJCQkJCSAgICAgc2F2ZWRfYXV0aF9yc3AsIHBCb2R5LAorCQkJCQkJICAgICBmcmFtZUxlbik7CisJCQkJCXBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LgorCQkJCQlzYXZlZF9hdXRoX3JzcF9sZW5ndGggPSBmcmFtZUxlbjsKKwkJCQl9CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJeworCQkJCS8qKgorCQkJCSAqIFJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lMiBpbiBhbiB1bmV4cGVjdGVkIHN0YXRlLgorCQkJCSAqIExvZyBlcnJvciBhbmQgaWdub3JlIHRoZSBmcmFtZS4KKwkJCQkgKi8KKworCQkJCS8qIExvZyBlcnJvciAqLworCQkJCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJCSAgICAgICBGTAorCQkJCQkJICAgICAgICgicmVjZWl2ZWQgQXV0aCBmcmFtZTIgZnJvbSBwZWVyIGluIHN0YXRlICVkLCBhZGRyICIpLAorCQkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpOworCQkJCSAgICAgICApCisJCQkJUEVMT0cxKGxpbV9wcmludF9tYWNfYWRkcgorCQkJCQkgICAgICAgKHBNYWMsIHBIZHItPnNhLCBMT0cxKTsKKwkJCQkgICAgICAgKQorCQkJfQorCisJCQlyZXR1cm47CisKKwkJfQorCisJCWlmICghY2RmX21lbV9jb21wYXJlKCh1aW50OF90ICopIHBIZHItPnNhLAorCQkJCSAgICAgKHVpbnQ4X3QgKikgJnBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPgorCQkJCSAgICAgcGVlck1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQkvKioKKwkJCSAqIFJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lIGZyb20gYW4gZW50aXR5CisJCQkgKiBvdGhlciB0aGFuIG9uZSByZXF1ZXN0IHdhcyBpbml0aWF0ZWQuCisJCQkgKiBXYWl0IHVudGlsIEF1dGhlbnRpY2F0aW9uIEZhaWx1cmUgVGltZW91dC4KKwkJCSAqLworCisJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCVBFTE9HVyhsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoInJlY2VpdmVkIEF1dGggZnJhbWUyIGZyb20gdW5leHBlY3RlZCBwZWVyICIKKwkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkgICAgICAgKQorCisJCQlicmVhazsKKwkJfQorCisJCWlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSA9PQorCQkgICAgZVNJUl9NQUNfQVVUSF9BTEdPX05PVF9TVVBQT1JURURfU1RBVFVTKSB7CisJCQkvKioKKwkJCSAqIEludGVyb3BlcmFiaWxpdHkgd29ya2Fyb3VuZDogTGlua3N5cyBXQVA0NDAwTiBpcyByZXR1cm5pbmcKKwkJCSAqIHdyb25nIGF1dGhUeXBlIGluIE9wZW5BdXRoIHJlc3BvbnNlIGluIGNhc2Ugb2YKKwkJCSAqIFNoYXJlZEtleSBBUCBjb25maWd1cmF0aW9uLiBQcmV0ZW5kIHdlIGRvbid0IHNlZSB0aGF0LAorCQkJICogc28gdXBwZXIgbGF5ZXIgY2FuIGZhbGxiYWNrIHRvIFNoYXJlZEtleSBhdXRoVHlwZSwKKwkJCSAqIGFuZCBzdWNjZXNzZnVsbHkgY29ubmVjdCB0byB0aGUgQVAuCisJCQkgKi8KKwkJCWlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciAhPQorCQkJICAgIHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPmF1dGhUeXBlKSB7CisJCQkJcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIgPQorCQkJCQlwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5hdXRoVHlwZTsKKwkJCX0KKwkJfQorCisJCWlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciAhPQorCQkgICAgcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGUpIHsKKwkJCS8qKgorCQkJICogUmVjZWl2ZWQgQXV0aGVudGljYXRpb24gZnJhbWUgd2l0aCBhbiBhdXRoCisJCQkgKiBhbGdvcml0aG0gb3RoZXIgdGhhbiBvbmUgcmVxdWVzdGVkLgorCQkJICogV2FpdCB1bnRpbCBBdXRoZW50aWNhdGlvbiBGYWlsdXJlIFRpbWVvdXQuCisJCQkgKi8KKworCQkJLyogTG9nIGVycm9yICovCisJCQlQRUxPR1cobGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJyZWNlaXZlZCBBdXRoIGZyYW1lMiBmb3IgdW5leHBlY3RlZCBhdXRoIGFsZ28gbnVtYmVyICVkICIKKwkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyLAorCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJICAgICAgICkKKworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aFN0YXR1c0NvZGUgPT0gZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMpIHsKKwkJCWlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciA9PQorCQkJICAgIGVTSVJfT1BFTl9TWVNURU0pIHsKKwkJCQlwc2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QXV0aFR5cGUgPQorCQkJCQllU0lSX09QRU5fU1lTVEVNOworCisJCQkJcEF1dGhOb2RlID0KKwkJCQkJbGltX2FjcXVpcmVfZnJlZV9wcmVfYXV0aF9ub2RlKHBNYWMsCisJCQkJCQkJCSAgICAgICAmcE1hYy0+bGltLgorCQkJCQkJCQkgICAgICAgZ0xpbVByZUF1dGhUaW1lclRhYmxlKTsKKworCQkJCWlmIChwQXV0aE5vZGUgPT0gTlVMTCkgeworCQkJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCQkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCQkJRkwKKwkJCQkJCQkoIk1heCBwcmUtYXV0aCBub2RlcyByZWFjaGVkICIpKTsKKwkJCQkJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHBIZHItPnNhLCBMT0dXKTsKKworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJUEVMT0cxKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJCQkgICAgICAgRkwoIkFsbG9jIG5ldyBkYXRhOiAleCBwZWVyICIpLAorCQkJCQkgICAgICAgcEF1dGhOb2RlKTsKKwkJCQkgICAgICAgKQorCQkJCVBFTE9HMShsaW1fcHJpbnRfbWFjX2FkZHIKKwkJCQkJICAgICAgIChwTWFjLCBwSGRyLT5zYSwgTE9HMSk7CisJCQkJICAgICAgICkKKworCQkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwQXV0aE5vZGUtPgorCQkJCQkgICAgIHBlZXJNYWNBZGRyLAorCQkJCQkgICAgIHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPgorCQkJCQkgICAgIHBlZXJNYWNBZGRyLAorCQkJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkJCXBBdXRoTm9kZS0+ZlRpbWVyU3RhcnRlZCA9IDA7CisJCQkJcEF1dGhOb2RlLT5hdXRoVHlwZSA9CisJCQkJCXBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPmF1dGhUeXBlOworCQkJCXBBdXRoTm9kZS0+c2VxX251bSA9CisJCQkJCSgocEhkci0+c2VxQ29udHJvbC5zZXFOdW1IaSA8PCA0KSB8CisJCQkJCSAocEhkci0+c2VxQ29udHJvbC5zZXFOdW1MbykpOworCQkJCXBBdXRoTm9kZS0+dGltZXN0YW1wID0KKwkJCQkJY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKTsKKwkJCQlsaW1fYWRkX3ByZV9hdXRoX25vZGUocE1hYywgcEF1dGhOb2RlKTsKKworCQkJCWxpbV9yZXN0b3JlX2Zyb21fYXV0aF9zdGF0ZShwTWFjLCBlU0lSX1NNRV9TVUNDRVNTLAorCQkJCQkJCSAgICBwUnhBdXRoRnJhbWVCb2R5LT4KKwkJCQkJCQkgICAgYXV0aFN0YXR1c0NvZGUsCisJCQkJCQkJICAgIHBzZXNzaW9uRW50cnkpOworCQkJfSAvKiBpZiAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIgPT0gZVNJUl9PUEVOX1NZU1RFTSkgKi8KKwkJCWVsc2UgeworCQkJCS8qIFNoYXJlZCBrZXkgYXV0aGVudGljYXRpb24gKi8KKworCQkJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJCQl2YWwgPSBwc2Vzc2lvbkVudHJ5LT5wcml2YWN5OworCQkJCX0gZWxzZQorCQkJCWlmICh3bGFuX2NmZ19nZXRfaW50CisJCQkJCSAgICAocE1hYywgV05JX0NGR19QUklWQUNZX0VOQUJMRUQsCisJCQkJCSAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCQkJLyoqCisJCQkJCSAqIENvdWxkIG5vdCBnZXQgUHJpdmFjeSBvcHRpb24KKwkJCQkJICogZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJCQkJICovCisJCQkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQkJCUZMCisJCQkJCQkJKCJjb3VsZCBub3QgcmV0cmlldmUgUHJpdmFjeSBvcHRpb24iKSk7CisJCQkJfQorCQkJCWNmZ1ByaXZhY3lPcHRJbXAgPSAodWludDhfdCkgdmFsOworCQkJCWlmICghY2ZnUHJpdmFjeU9wdEltcCkgeworCQkJCQkvKioKKwkJCQkJICogUmVxdWVzdGluZyBTVEEgZG9lcyBub3QgaGF2ZSBXRVAgaW1wbGVtZW50ZWQuCisJCQkJCSAqIFJlamVjdCB3aXRoIHVuc3VwcG9ydGVkIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobQorCQkJCQkgKiBTdGF0dXMgY29kZSBhbmQgd2FpdCB1bnRpbCBhdXRoIGZhaWx1cmUgdGltZW91dAorCQkJCQkgKi8KKworCQkJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJCSAgICAgICBGTAorCQkJCQkJCSAgICAgICAoInJlY2VpdmVkIEF1dGggZnJhbWUgZnJvbSBwZWVyIGZvciB1bnN1cHBvcnRlZCBhdXRoIGFsZ28gJWQgIgorCQkJCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIpLAorCQkJCQkJICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPgorCQkJCQkJICAgICAgIGF1dGhBbGdvTnVtYmVyLAorCQkJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkJCSAgICAgICApCisKKwkJCQkJYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0KKwkJCQkJCXBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyOworCQkJCQlhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKwkJCQkJCXBSeEF1dGhGcmFtZUJvZHktPgorCQkJCQkJYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyICsgMTsKKwkJCQkJYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKwkJCQkJCWVTSVJfTUFDX0FVVEhfQUxHT19OT1RfU1VQUE9SVEVEX1NUQVRVUzsKKworCQkJCQlsaW1fc2VuZF9hdXRoX21nbXRfZnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKwkJCQkJCQkJIHBIZHItPnNhLAorCQkJCQkJCQkgTElNX05PX1dFUF9JTl9GQywKKwkJCQkJCQkJIHBzZXNzaW9uRW50cnkpOworCQkJCQlyZXR1cm47CisJCQkJfSBlbHNlIHsKKworCQkJCQlpZiAocFJ4QXV0aEZyYW1lQm9keS0+dHlwZSAhPQorCQkJCQkgICAgU0lSX01BQ19DSEFMTEVOR0VfVEVYVF9FSUQpIHsKKwkJCQkJCS8qIExvZyBlcnJvciAqLworCQkJCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJCQkgICAgICAgRkwKKwkJCQkJCQkJICAgICAgICgicmVjZWl2ZWQgQXV0aCBmcmFtZSB3aXRoIGludmFsaWQgY2hhbGxlbmdlIHRleHQgSUUiKSk7CisJCQkJCQkgICAgICAgKQorCisJCQkJCQlyZXR1cm47CisJCQkJCX0KKworCQkJCQlpZiAod2xhbl9jZmdfZ2V0X2ludAorCQkJCQkJICAgIChwTWFjLAorCQkJCQkJICAgIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSUQsCisJCQkJCQkgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkJCQkvKioKKwkJCQkJCSAqIENvdWxkIG5vdCBnZXQgRGVmYXVsdCBrZXlJZAorCQkJCQkJICogZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJCQkJCSAqLworCQkJCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCQkJCUZMCisJCQkJCQkJKCJjb3VsZCBub3QgcmV0cmlldmUgRGVmYXVsdCBrZXlJZCIpKTsKKwkJCQkJfQorCQkJCQlrZXlJZCA9ICh1aW50OF90KSB2YWw7CisKKwkJCQkJdmFsID0gU0lSX01BQ19LRVlfTEVOR1RIOworCisJCQkJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJCQkJdHBTaXJLZXlzIHBLZXk7CisJCQkJCQlwS2V5ID0KKwkJCQkJCQkmcHNlc3Npb25FbnRyeS0+CisJCQkJCQkJV0VQS2V5TWF0ZXJpYWwKKwkJCQkJCQlba2V5SWRdLmtleVswXTsKKwkJCQkJCWNkZl9tZW1fY29weShkZWZhdWx0S2V5LAorCQkJCQkJCSAgICAgcEtleS0+a2V5LAorCQkJCQkJCSAgICAgcEtleS0+CisJCQkJCQkJICAgICBrZXlMZW5ndGgpOworCQkJCQl9IGVsc2UKKwkJCQkJaWYgKHdsYW5fY2ZnX2dldF9zdHIKKwkJCQkJCSAgICAocE1hYywKKwkJCQkJCSAgICAodWludDE2X3QpCisJCQkJCQkgICAgKFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzEKKwkJCQkJCSAgICAgKyBrZXlJZCksIGRlZmF1bHRLZXksCisJCQkJCQkgICAgJnZhbCkKKwkJCQkJICAgICE9IGVTSVJfU1VDQ0VTUykgeworCQkJCQkJLyogLyBDb3VsZCBub3QgZ2V0IERlZmF1bHQga2V5IGZyb20gQ0ZHLiAqLworCQkJCQkJLyogTG9nIGVycm9yLiAqLworCQkJCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCQkJCUZMCisJCQkJCQkJKCJjb3VsZCBub3QgcmV0cmlldmUgRGVmYXVsdCBrZXkiKSk7CisKKwkJCQkJCWF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9CisJCQkJCQkJcFJ4QXV0aEZyYW1lQm9keS0+CisJCQkJCQkJYXV0aEFsZ29OdW1iZXI7CisJCQkJCQlhdXRoRnJhbWUuCisJCQkJCQlhdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorCQkJCQkJCQlwUnhBdXRoRnJhbWVCb2R5LT4KKwkJCQkJCQkJYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyCisJCQkJCQkJCSsgMTsKKwkJCQkJCWF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisJCQkJCQkJZVNJUl9NQUNfQ0hBTExFTkdFX0ZBSUxVUkVfU1RBVFVTOworCisJCQkJCQlsaW1fc2VuZF9hdXRoX21nbXRfZnJhbWUKKwkJCQkJCQkocE1hYywgJmF1dGhGcmFtZSwKKwkJCQkJCQlwSGRyLT5zYSwKKwkJCQkJCQlMSU1fTk9fV0VQX0lOX0ZDLAorCQkJCQkJCXBzZXNzaW9uRW50cnkpOworCisJCQkJCQlsaW1fcmVzdG9yZV9mcm9tX2F1dGhfc3RhdGUKKwkJCQkJCQkocE1hYywKKwkJCQkJCQllU0lSX1NNRV9JTlZBTElEX1dFUF9ERUZBVUxUX0tFWSwKKwkJCQkJCQllU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT04sCisJCQkJCQkJcHNlc3Npb25FbnRyeSk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWtleV9sZW5ndGggPSB2YWw7CisJCQkJCSgodHBTaXJNYWNBdXRoRnJhbWVCb2R5KQorCQkJCQkgcGxhaW5Cb2R5KS0+YXV0aEFsZ29OdW1iZXIgPQorCQkJCQkJc2lyX3N3YXBfdTE2aWZfbmVlZGVkKHBSeEF1dGhGcmFtZUJvZHktPgorCQkJCQkJCQkgICAgICBhdXRoQWxnb051bWJlcik7CisJCQkJCSgodHBTaXJNYWNBdXRoRnJhbWVCb2R5KQorCQkJCQkgcGxhaW5Cb2R5KS0+CisJCQkJCWF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisJCQkJCQlzaXJfc3dhcF91MTZpZl9uZWVkZWQoKHVpbnQxNl90KQorCQkJCQkJCQkgICAgICAocFJ4QXV0aEZyYW1lQm9keS0+CisJCQkJCQkJCSAgICAgICBhdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgKyAxKSk7CisJCQkJCSgodHBTaXJNYWNBdXRoRnJhbWVCb2R5KQorCQkJCQkgcGxhaW5Cb2R5KS0+YXV0aFN0YXR1c0NvZGUgPQorCQkJCQkJZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVM7CisJCQkJCSgodHBTaXJNYWNBdXRoRnJhbWVCb2R5KQorCQkJCQkgcGxhaW5Cb2R5KS0+dHlwZSA9CisJCQkJCQlTSVJfTUFDX0NIQUxMRU5HRV9URVhUX0VJRDsKKwkJCQkJKCh0cFNpck1hY0F1dGhGcmFtZUJvZHkpCisJCQkJCSBwbGFpbkJvZHkpLT5sZW5ndGggPQorCQkJCQkJU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9MRU5HVEg7CisJCQkJCWNkZl9tZW1fY29weSgodWludDhfdCopICgodHBTaXJNYWNBdXRoRnJhbWVCb2R5KSBwbGFpbkJvZHkpLT5jaGFsbGVuZ2VUZXh0LAorCQkJCQkJCXBSeEF1dGhGcmFtZUJvZHktPmNoYWxsZW5nZVRleHQsCisJCQkJCQkJU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9MRU5HVEgpOworCisJCQkJCWxpbV9lbmNyeXB0X2F1dGhfZnJhbWUocE1hYywga2V5SWQsCisJCQkJCQkJICAgICAgIGRlZmF1bHRLZXksCisJCQkJCQkJICAgICAgIHBsYWluQm9keSwKKwkJCQkJCQkgICAgICAgZW5jckF1dGhGcmFtZSwKKwkJCQkJCQkgICAgICAga2V5X2xlbmd0aCk7CisKKwkJCQkJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPQorCQkJCQkJZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTRfU1RBVEU7CisJCQkJCU1UUkFDRShtYWNfdHJhY2UKKwkJCQkJCSAgICAgICAocE1hYywKKwkJCQkJCSAgICAgICBUUkFDRV9DT0RFX01MTV9TVEFURSwKKwkJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT4KKwkJCQkJCSAgICAgICBwZVNlc3Npb25JZCwKKwkJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT4KKwkJCQkJCSAgICAgICBsaW1NbG1TdGF0ZSkpOworCisJCQkJCWxpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZShwTWFjLAorCQkJCQkJCQkgKHRwU2lyTWFjQXV0aEZyYW1lQm9keSkKKwkJCQkJCQkJIGVuY3JBdXRoRnJhbWUsCisJCQkJCQkJCSBwSGRyLT5zYSwKKwkJCQkJCQkJIExJTV9XRVBfSU5fRkMsCisJCQkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKworCQkJCQlicmVhazsKKwkJCQl9IC8qIGVuZCBpZiAoIXdsYW5fY2ZnX2dldF9pbnQoQ0ZHX1BSSVZBQ1lfT1BUSU9OX0lNUExFTUVOVEVEKSkgKi8KKwkJCX0gLyogZW5kIGlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciA9PSBlU0lSX09QRU5fU1lTVEVNKSAqLworCQl9IC8qIGlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSA9PSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUykgKi8KKwkJZWxzZSB7CisJCQkvKioKKwkJCSAqIEF1dGhlbnRpY2F0aW9uIGZhaWx1cmUuCisJCQkgKiBSZXR1cm4gQXV0aCBjb25maXJtIHdpdGggcmVjZWl2ZWQgZmFpbHVyZSBjb2RlIHRvIFNNRQorCQkJICovCisKKwkJCS8qIExvZyBlcnJvciAqLworCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgicmVjZWl2ZWQgQXV0aCBmcmFtZSBmcm9tIHBlZXIgd2l0aCBmYWlsdXJlIGNvZGUgJWQgIgorCQkJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aFN0YXR1c0NvZGUsCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkgICAgICAgKQorCisJCQlsaW1fcmVzdG9yZV9mcm9tX2F1dGhfc3RhdGUocE1hYywgZVNJUl9TTUVfQVVUSF9SRUZVU0VELAorCQkJCQkJICAgIHBSeEF1dGhGcmFtZUJvZHktPgorCQkJCQkJICAgIGF1dGhTdGF0dXNDb2RlLAorCQkJCQkJICAgIHBzZXNzaW9uRW50cnkpOworCQl9IC8qIGVuZCBpZiAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aFN0YXR1c0NvZGUgPT0gZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMpICovCisKKwkJYnJlYWs7CisKKwljYXNlIFNJUl9NQUNfQVVUSF9GUkFNRV8zOgorCQkvKiBBdXRoRnJhbWUgMyAqLworCisJCWlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciAhPSBlU0lSX1NIQVJFRF9LRVkpIHsKKwkJCS8qIExvZyBlcnJvciAqLworCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgicmVjZWl2ZWQgQXV0aCBmcmFtZTMgZnJvbSBwZWVyIHdpdGggYXV0aCBhbGdvIG51bWJlciAlZCAiCisJCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIpLAorCQkJCSAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCSAgICAgICApCisKKwkJCS8qKgorCQkJICogUmVjZWl2ZWQgQXV0aGVudGljYXRpb24gZnJhbWUzIHdpdGggYWxnb3JpdGhtIG90aGVyIHRoYW4KKwkJCSAqIFNoYXJlZCBLZXkgYXV0aGVudGljYXRpb24gdHlwZS4gUmVqZWN0IHdpdGggQXV0aCBmcmFtZTQKKwkJCSAqIHdpdGggJ291dCBvZiBzZXF1ZW5jZScgc3RhdHVzIGNvZGUuCisJCQkgKi8KKwkJCWF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfU0hBUkVEX0tFWTsKKwkJCWF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorCQkJCVNJUl9NQUNfQVVUSF9GUkFNRV80OworCQkJYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKwkJCQllU0lSX01BQ19BVVRIX0ZSQU1FX09VVF9PRl9TRVFfU1RBVFVTOworCisJCQlsaW1fc2VuZF9hdXRoX21nbXRfZnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKwkJCQkJCSBwSGRyLT5zYSwKKwkJCQkJCSBMSU1fTk9fV0VQX0lOX0ZDLCBwc2Vzc2lvbkVudHJ5KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCQkgICAgTElNX0lTX0JUX0FNUF9BUF9ST0xFKHBzZXNzaW9uRW50cnkpIHx8CisJCSAgICBMSU1fSVNfSUJTU19ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQkvKioKKwkJCSAqIENoZWNrIGlmIHdlcCBiaXQgd2FzIHNldCBpbiBGQy4gSWYgbm90IHNldCwKKwkJCSAqIHJlamVjdCB3aXRoIEF1dGhlbnRpY2F0aW9uIGZyYW1lNCB3aXRoCisJCQkgKiAnY2hhbGxlbmdlIGZhaWx1cmUnIHN0YXR1cyBjb2RlLgorCQkJICovCisJCQlpZiAoIXBIZHItPmZjLndlcCkgeworCQkJCS8qIExvZyBlcnJvciAqLworCQkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCSAgICAgICBGTAorCQkJCQkJICAgICAgICgicmVjZWl2ZWQgQXV0aCBmcmFtZTMgZnJvbSBwZWVyIHdpdGggbm8gV0VQIGJpdCBzZXQgIgorCQkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJCSAgICAgICApCisJCQkJLyogLyBXRVAgYml0IGlzIG5vdCBzZXQgaW4gRkMgb2YgQXV0aCBGcmFtZTMgKi8KKwkJCQlhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPSBlU0lSX1NIQVJFRF9LRVk7CisJCQkJYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisJCQkJCVNJUl9NQUNfQVVUSF9GUkFNRV80OworCQkJCWF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisJCQkJCWVTSVJfTUFDX0NIQUxMRU5HRV9GQUlMVVJFX1NUQVRVUzsKKworCQkJCWxpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZShwTWFjLCAmYXV0aEZyYW1lLAorCQkJCQkJCSBwSGRyLT5zYSwKKwkJCQkJCQkgTElNX05PX1dFUF9JTl9GQywKKwkJCQkJCQkgcHNlc3Npb25FbnRyeSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlwQXV0aE5vZGUgPSBsaW1fc2VhcmNoX3ByZV9hdXRoX2xpc3QocE1hYywgcEhkci0+c2EpOworCQkJaWYgKHBBdXRoTm9kZSA9PSBOVUxMKSB7CisJCQkJLyogTG9nIGVycm9yICovCisJCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HVywKKwkJCQkJICAgICAgIEZMCisJCQkJCQkgICAgICAgKCJyZWNlaXZlZCBBdXRoRnJhbWUzIGZyb20gcGVlciB0aGF0IGhhcyBubyBwcmVhdXRoIGNvbnRleHQgIgorCQkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJCSAgICAgICApCisJCQkJLyoqCisJCQkJICogTm8gJ3ByZS1hdXRoJyBjb250ZXh0IGV4aXN0cyBmb3IKKwkJCQkgKiB0aGlzIFNUQSB0aGF0IHNlbnQgYW4gQXV0aGVudGljYXRpb24KKwkJCQkgKiBmcmFtZTMuCisJCQkJICogU2VuZCBBdXRoIGZyYW1lNCB3aXRoICdvdXQgb2Ygc2VxdWVuY2UnCisJCQkJICogc3RhdHVzIGNvZGUuCisJCQkJICovCisJCQkJYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0gZVNJUl9TSEFSRURfS0VZOworCQkJCWF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorCQkJCQlTSVJfTUFDX0FVVEhfRlJBTUVfNDsKKwkJCQlhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorCQkJCQllU0lSX01BQ19BVVRIX0ZSQU1FX09VVF9PRl9TRVFfU1RBVFVTOworCisJCQkJbGltX3NlbmRfYXV0aF9tZ210X2ZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisJCQkJCQkJIHBIZHItPnNhLAorCQkJCQkJCSBMSU1fTk9fV0VQX0lOX0ZDLAorCQkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmIChwQXV0aE5vZGUtPm1sbVN0YXRlID09CisJCQkgICAgZUxJTV9NTE1fQVVUSF9SU1BfVElNRU9VVF9TVEFURSkgeworCQkJCS8qIExvZyBlcnJvciAqLworCQkJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCQkJRkwKKwkJCQkJCSgiYXV0aCByZXNwb25zZSB0aW1lciB0aW1lZG91dCBmb3IgcGVlciAiCisJCQkJCQlNQUNfQUREUkVTU19TVFIpLAorCQkJCQlNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCisJCQkJLyoqCisJCQkJICogUmVjZWl2ZWQgQXV0aCBGcmFtZTMgYWZ0ZXIgQXV0aCBSZXNwb25zZSB0aW1lb3V0LgorCQkJCSAqIFJlamVjdCBieSBzZW5kaW5nIEF1dGggRnJhbWU0IHdpdGgKKwkJCQkgKiBBdXRoIHJlc3BvbmUgdGltZW91dCBTdGF0dXMgQ29kZS4KKwkJCQkgKi8KKwkJCQlhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPSBlU0lSX1NIQVJFRF9LRVk7CisJCQkJYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisJCQkJCVNJUl9NQUNfQVVUSF9GUkFNRV80OworCQkJCWF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisJCQkJCWVTSVJfTUFDX0FVVEhfUlNQX1RJTUVPVVRfU1RBVFVTOworCisJCQkJbGltX3NlbmRfYXV0aF9tZ210X2ZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisJCQkJCQkJIHBIZHItPnNhLAorCQkJCQkJCSBMSU1fTk9fV0VQX0lOX0ZDLAorCQkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKworCQkJCS8qIC8gRGVsZXRlIHByZS1hdXRoIGNvbnRleHQgb2YgU1RBICovCisJCQkJbGltX2RlbGV0ZV9wcmVfYXV0aF9ub2RlKHBNYWMsIHBIZHItPnNhKTsKKworCQkJCXJldHVybjsKKwkJCX0gLyogZW5kIHN3aXRjaCAocEF1dGhOb2RlLT5tbG1TdGF0ZSkgKi8KKworCQkJaWYgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhTdGF0dXNDb2RlICE9CisJCQkgICAgZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMpIHsKKwkJCQkvKioKKwkJCQkgKiBSZWNlaXZlZCBBdXRoZW5ldGljYXRpb24gRnJhbWUgMyB3aXRoIHN0YXR1cyBjb2RlCisJCQkJICogb3RoZXIgdGhhbiBzdWNjZXNzLiBXYWl0IHVudGlsIEF1dGggcmVzcG9uc2UgdGltZW91dAorCQkJCSAqIHRvIGRlbGV0ZSBTVEEgY29udGV4dC4KKwkJCQkgKi8KKworCQkJCS8qIExvZyBlcnJvciAqLworCQkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCSAgICAgICBGTAorCQkJCQkJICAgICAgICgicmVjZWl2ZWQgQXV0aCBmcmFtZTMgZnJvbSBwZWVyIHdpdGggc3RhdHVzIGNvZGUgJWQgIgorCQkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJCSAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSwKKwkJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkJICAgICAgICkKKworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLyoqCisJCQkgKiBDaGVjayBpZiByZWNlaXZlZCBjaGFsbGVuZ2UgdGV4dCBpcyBzYW1lIGFzIG9uZSBzZW50IGluCisJCQkgKiBBdXRoZW50aWNhdGlvbiBmcmFtZTMKKwkJCSAqLworCisJCQlpZiAoY2RmX21lbV9jb21wYXJlKHBSeEF1dGhGcmFtZUJvZHktPmNoYWxsZW5nZVRleHQsCisJCQkJCSAgICBwQXV0aE5vZGUtPmNoYWxsZW5nZVRleHQsCisJCQkJCSAgICBTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX0xFTkdUSCkpIHsKKwkJCQkvKiAvIENoYWxsZW5nZSBtYXRjaC4gU1RBIGlzIGF1dGhldGljYXRlZCAhICovCisKKwkJCQkvKiAvIERlbGV0ZSBBdXRoZW50aWNhdGlvbiByZXNwb25zZSB0aW1lciBpZiBydW5uaW5nICovCisJCQkJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV9wZXJfc3RhX2lkX3RpbWVyKHBNYWMsCisJCQkJCQkJCQkgICBlTElNX0FVVEhfUlNQX1RJTUVSLAorCQkJCQkJCQkJICAgcEF1dGhOb2RlLT4KKwkJCQkJCQkJCSAgIGF1dGhOb2RlSWR4KTsKKworCQkJCXBBdXRoTm9kZS0+ZlRpbWVyU3RhcnRlZCA9IDA7CisJCQkJcEF1dGhOb2RlLT5tbG1TdGF0ZSA9CisJCQkJCWVMSU1fTUxNX0FVVEhFTlRJQ0FURURfU1RBVEU7CisKKwkJCQkvKioKKwkJCQkgKiBTZW5kIEF1dGhlbnRpY2F0aW9uIEZyYW1lNCB3aXRoICdzdWNjZXNzJyBTdGF0dXMgQ29kZS4KKwkJCQkgKi8KKwkJCQlhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPSBlU0lSX1NIQVJFRF9LRVk7CisJCQkJYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisJCQkJCVNJUl9NQUNfQVVUSF9GUkFNRV80OworCQkJCWF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisJCQkJCWVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTOworCisJCQkJbGltX3NlbmRfYXV0aF9tZ210X2ZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisJCQkJCQkJIHBIZHItPnNhLAorCQkJCQkJCSBMSU1fTk9fV0VQX0lOX0ZDLAorCQkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJLyogTG9nIGVycm9yICovCisJCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HVywKKwkJCQkJICAgICAgIEZMKCJDaGFsbGVuZ2UgZmFpbHVyZSBmb3IgcGVlciAiCisJCQkJCQkgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJCSAgICAgICApCisJCQkJLyoqCisJCQkJICogQ2hhbGxlbmdlIEZhaWx1cmUuCisJCQkJICogU2VuZCBBdXRoZW50aWNhdGlvbiBmcmFtZTQgd2l0aCAnY2hhbGxlbmdlIGZhaWx1cmUnCisJCQkJICogc3RhdHVzIGNvZGUgYW5kIHdhaXQgdW50aWwgQXV0aCByZXNwb25zZSB0aW1lb3V0IHRvCisJCQkJICogZGVsZXRlIFNUQSBjb250ZXh0LgorCQkJCSAqLworCQkJCWF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9CisJCQkJCXBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyOworCQkJCWF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorCQkJCQlTSVJfTUFDX0FVVEhfRlJBTUVfNDsKKwkJCQlhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorCQkJCQllU0lSX01BQ19DSEFMTEVOR0VfRkFJTFVSRV9TVEFUVVM7CisKKwkJCQlsaW1fc2VuZF9hdXRoX21nbXRfZnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKwkJCQkJCQkgcEhkci0+c2EsCisJCQkJCQkJIExJTV9OT19XRVBfSU5fRkMsCisJCQkJCQkJIHBzZXNzaW9uRW50cnkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSAvKiBpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSB8fCAuLi4gKi8KKworCQlicmVhazsKKworCWNhc2UgU0lSX01BQ19BVVRIX0ZSQU1FXzQ6CisJCS8qIEF1dGhGcmFtZSA0ICovCisJCWlmIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSAhPSBlTElNX01MTV9XVF9BVVRIX0ZSQU1FNF9TVEFURSkgeworCQkJLyoqCisJCQkgKiBSZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZTQgaW4gYW4gdW5leHBlY3RlZCBzdGF0ZS4KKwkJCSAqIExvZyBlcnJvciBhbmQgaWdub3JlIHRoZSBmcmFtZS4KKwkJCSAqLworCisJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoInJlY2VpdmVkIHVuZXhwZWN0ZWQgQXV0aCBmcmFtZTQgZnJvbSBwZWVyIGluIHN0YXRlICVkLCBhZGRyICIKKwkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlLAorCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJICAgICAgICkKKworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyICE9IGVTSVJfU0hBUkVEX0tFWSkgeworCQkJLyoqCisJCQkgKiBSZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZTQgd2l0aCBhbGdvcml0aG0gb3RoZXIgdGhhbgorCQkJICogU2hhcmVkIEtleSBhdXRoZW50aWNhdGlvbiB0eXBlLgorCQkJICogV2FpdCB1bnRpbCBBdXRoIGZhaWx1cmUgdGltZW91dCB0byByZXBvcnQgYXV0aGVudGljYXRpb24KKwkJCSAqIGZhaWx1cmUgdG8gU01FLgorCQkJICovCisKKwkJCS8qIExvZyBlcnJvciAqLworCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgicmVjZWl2ZWQgQXV0aCBmcmFtZTQgZnJvbSBwZWVyIHdpdGggaW52YWxpZCBhdXRoIGFsZ28gJWQgIgorCQkJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIsCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkgICAgICAgKQorCisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoIWNkZl9tZW1fY29tcGFyZSgodWludDhfdCAqKSBwSGRyLT5zYSwKKwkJCQkgICAgICh1aW50OF90ICopICZwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT4KKwkJCQkgICAgIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSkgeworCQkJLyoqCisJCQkgKiBSZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZSBmcm9tIGFuIGVudGl0eQorCQkJICogb3RoZXIgdGhhbiBvbmUgdG8gd2hpY2ggcmVxdWVzdCB3YXMgaW5pdGlhdGVkLgorCQkJICogV2FpdCB1bnRpbCBBdXRoZW50aWNhdGlvbiBGYWlsdXJlIFRpbWVvdXQuCisJCQkgKi8KKworCQkJLyogTG9nIGVycm9yICovCisJCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJyZWNlaXZlZCBBdXRoIGZyYW1lNCBmcm9tIHVuZXhwZWN0ZWQgcGVlciAiCisJCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIpLAorCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJICAgICAgICkKKworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIgIT0KKwkJICAgIHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPmF1dGhUeXBlKSB7CisJCQkvKioKKwkJCSAqIFJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lIHdpdGggYW4gYXV0aCBhbGdvcml0aG0KKwkJCSAqIG90aGVyIHRoYW4gb25lIHJlcXVlc3RlZC4KKwkJCSAqIFdhaXQgdW50aWwgQXV0aGVudGljYXRpb24gRmFpbHVyZSBUaW1lb3V0LgorCQkJICovCisKKwkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoInJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lIGZyb20gcGVlciB3aXRoIGludmFsaWQgYXV0aCBzZXEgbnVtYmVyICVkICIKKwkJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPgorCQkJCSAgICAgICBhdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIsCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkgICAgICAgKQorCisJCQlicmVhazsKKwkJfQorCisJCWlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSA9PSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUykgeworCQkJLyoqCisJCQkgKiBBdXRoZW50aWNhdGlvbiBTdWNjZXNzICEKKwkJCSAqIEluZm9ybSBTTUUgb2Ygc2FtZS4KKwkJCSAqLworCQkJcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEF1dGhUeXBlID0gZVNJUl9TSEFSRURfS0VZOworCisJCQlwQXV0aE5vZGUgPQorCQkJCWxpbV9hY3F1aXJlX2ZyZWVfcHJlX2F1dGhfbm9kZShwTWFjLAorCQkJCQkJCSAgICAgICAmcE1hYy0+bGltLgorCQkJCQkJCSAgICAgICBnTGltUHJlQXV0aFRpbWVyVGFibGUpOworCQkJaWYgKHBBdXRoTm9kZSA9PSBOVUxMKSB7CisJCQkJLyogTG9nIGVycm9yICovCisJCQkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCQlGTCgiTWF4IHByZS1hdXRoIG5vZGVzIHJlYWNoZWQgIikpOworCQkJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisKKwkJCQlyZXR1cm47CisJCQl9CisJCQlQRUxPRzEobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HMSwgRkwoIkFsbG9jIG5ldyBkYXRhOiAleCBwZWVyICIpLAorCQkJCSAgICAgICBwQXV0aE5vZGUpOworCQkJICAgICAgIGxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7CisJCQkgICAgICAgKQorCisJCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcEF1dGhOb2RlLT5wZWVyTWFjQWRkciwKKwkJCQkgICAgIHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPnBlZXJNYWNBZGRyLAorCQkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCQlwQXV0aE5vZGUtPmZUaW1lclN0YXJ0ZWQgPSAwOworCQkJcEF1dGhOb2RlLT5hdXRoVHlwZSA9CisJCQkJcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGU7CisJCQlwQXV0aE5vZGUtPnNlcV9udW0gPQorCQkJCSgocEhkci0+c2VxQ29udHJvbC5zZXFOdW1IaSA8PCA0KSB8CisJCQkJIChwSGRyLT5zZXFDb250cm9sLnNlcU51bUxvKSk7CisJCQlwQXV0aE5vZGUtPnRpbWVzdGFtcCA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisJCQlsaW1fYWRkX3ByZV9hdXRoX25vZGUocE1hYywgcEF1dGhOb2RlKTsKKworCQkJbGltX3Jlc3RvcmVfZnJvbV9hdXRoX3N0YXRlKHBNYWMsIGVTSVJfU01FX1NVQ0NFU1MsCisJCQkJCQkgICAgcFJ4QXV0aEZyYW1lQm9keS0+CisJCQkJCQkgICAgYXV0aFN0YXR1c0NvZGUsIHBzZXNzaW9uRW50cnkpOworCisJCX0gLyogaWYgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhTdGF0dXNDb2RlID09IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTKSAqLworCQllbHNlIHsKKwkJCS8qKgorCQkJICogQXV0aGVudGljYXRpb24gZmFpbHVyZS4KKwkJCSAqIFJldHVybiBBdXRoIGNvbmZpcm0gd2l0aCByZWNlaXZlZCBmYWlsdXJlIGNvZGUgdG8gU01FCisJCQkgKi8KKworCQkJLyogTG9nIGVycm9yICovCisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoIkF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgZnJvbSBwZWVyICIKKwkJCQkJICBNQUNfQUREUkVTU19TVFIpLCBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJICAgICAgICkKKworCQkJbGltX3Jlc3RvcmVfZnJvbV9hdXRoX3N0YXRlKHBNYWMsIGVTSVJfU01FX0FVVEhfUkVGVVNFRCwKKwkJCQkJCSAgICBwUnhBdXRoRnJhbWVCb2R5LT4KKwkJCQkJCSAgICBhdXRoU3RhdHVzQ29kZSwKKwkJCQkJCSAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJfSAvKiBlbmQgaWYgKHBSeEF1dGhGcmFtZUJvZHktPlN0YXR1cyA9PSAwKSAqLworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogLyBJbnZhbGlkIEF1dGhlbnRpY2F0aW9uIEZyYW1lIHJlY2VpdmVkLiBJZ25vcmUgaXQuICovCisKKwkJLyogTG9nIGVycm9yICovCisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJyZWNlaXZlZCBBdXRoIGZyYW1lIGZyb20gcGVlciB3aXRoIGludmFsaWQgYXV0aCBzZXEgIgorCQkJCSAgICAgICAibnVtYmVyICVkICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCSAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIsCisJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJICAgICAgICkKKworCQlicmVhazsKKwl9IC8qIGVuZCBzd2l0Y2ggKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlcikgKi8KK30gLyoqKiBlbmQgbGltX3Byb2Nlc3NfYXV0aF9mcmFtZSgpICoqKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFBhc3MgdGhlIHJlY2VpdmVkIEF1dGggZnJhbWUuIFRoaXMgaXMgcG9zc2libHkgdGhlIHByZS1hdXRoIGZyb20gdGhlCisgKiBuZWlnaGJvciBBUCwgaW4gdGhlIHNhbWUgbW9iaWxpdHkgZG9tYWluLgorICogVGhpcyB3aWxsIGJlIHVzZWQgaW4gY2FzZSBvZiAxMXIgRlQuCisgKgorICogISEhISBUaGlzIGlzIGdvaW5nIHRvIGJlIHJlbm92ZWQgZm9yIHRoZSBuZXh0IGNoZWNraW4uIFdlIHdpbGwgYmUgY3JlYXRpbmcKKyAqIHRoZSBzZXNzaW9uIGJlZm9yZSBzZW5kaW5nIG91dCB0aGUgQXV0aC4gVGh1cyB3aGVuIGF1dGggcmVzcG9uc2UKKyAqIGlzIHJlY2VpdmVkIHdlIHdpbGwgaGF2ZSBhIHNlc3Npb24gaW4gcHJvZ3Jlc3MuICEhISEhCisgKioqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit0U2lyUmV0U3RhdHVzIGxpbV9wcm9jZXNzX2F1dGhfZnJhbWVfbm9fc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwQmQsCisJCQkJCQl2b2lkICpib2R5KQoreworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSBOVUxMOworCXVpbnQ4X3QgKnBCb2R5OworCXVpbnQxNl90IGZyYW1lTGVuOworCXRTaXJNYWNBdXRoRnJhbWVCb2R5IHJ4QXV0aEZyYW1lOworCXRTaXJNYWNBdXRoRnJhbWVCb2R5ICpwUnhBdXRoRnJhbWVCb2R5ID0gTlVMTDsKKwl0U2lyUmV0U3RhdHVzIHJldF9zdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisJaW50IGk7CisKKwlwSGRyID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKHBCZCk7CisJcEJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShwQmQpOworCWZyYW1lTGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihwQmQpOworCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgiQXV0aCBGcmFtZSBSZWNlaXZlZDogQlNTSUQgIiBNQUNfQUREUkVTU19TVFIgIiAoUlNTSSAlZCkiKSwKKwkJTUFDX0FERFJfQVJSQVkocEhkci0+YnNzSWQpLAorCQkodWludCkgYWJzKChpbnQ4X3QpIFdNQV9HRVRfUlhfUlNTSV9EQihwQmQpKSk7CisKKwkvKiBBdXRoIGZyYW1lIGhhcyBjb21lIG9uIGEgbmV3IEJTUywgaG93ZXZlciwgd2UgbmVlZCB0byBmaW5kIHRoZSBzZXNzaW9uCisJICogZnJvbSB3aGVyZSB0aGUgYXV0aC1yZXEgd2FzIHNlbnQgdG8gdGhlIG5ldyBBUAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQkvKiBGaW5kIGZpcnN0IGZyZWUgcm9vbSBpbiBzZXNzaW9uIHRhYmxlICovCisJCWlmIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkID09IHRydWUgJiYKKwkJICAgIHBNYWMtPmxpbS5ncFNlc3Npb25baV0uZnRQRUNvbnRleHQuZnRQcmVBdXRoU2Vzc2lvbiA9PQorCQkgICAgdHJ1ZSkgeworCQkJLyogRm91bmQgdGhlIHNlc3Npb24gKi8KKwkJCXBzZXNzaW9uRW50cnkgPSAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXTsKKwkJCXBNYWMtPmxpbS5ncFNlc3Npb25baV0uZnRQRUNvbnRleHQuZnRQcmVBdXRoU2Vzc2lvbiA9CisJCQkJZmFsc2U7CisJCX0KKwl9CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJFcnJvcjogVW5hYmxlIHRvIGZpbmQgc2Vzc2lvbiBpZCB3aGlsZSBpbiBwcmUtYXV0aCBwaGFzZSBmb3IgRlQiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJaWYgKHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJFcnJvcjogTm8gRlQiKSk7CisJCS8qIE5vIEZUIGluIHByb2dyZXNzLiAqLworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWlmIChmcmFtZUxlbiA9PSAwKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkVycm9yOiBGcmFtZSBsZW4gPSAwIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5ic3NJZCwgTE9HMik7CisJbGltX3ByaW50X21hY19hZGRyKHBNYWMsCisJCQkgICBwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5wcmVBdXRoYnNzSWQsCisJCQkgICBMT0cyKTsKKwlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJzZXFDb250cm9sIDB4JVgiKSwKKwkJKChwSGRyLT5zZXFDb250cm9sLnNlcU51bUhpIDw8IDgpIHwgKHBIZHItPnNlcUNvbnRyb2wuCisJCQkJCQkgICAgIHNlcU51bUxvIDw8IDQpIHwgKHBIZHItPgorCQkJCQkJCQkgICAgICAgc2VxQ29udHJvbC4KKwkJCQkJCQkJICAgICAgIGZyYWdOdW0pKSk7CisjZW5kaWYKKworCS8qIENoZWNrIHRoYXQgaXRzIHRoZSBzYW1lIGJzc0lkIHdlIGhhdmUgZm9yIHByZUF1dGggKi8KKwlpZiAoIWNkZl9tZW1fY29tcGFyZQorCQkgICAgKHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnByZUF1dGhic3NJZCwKKwkJICAgIHBIZHItPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJFcnJvcjogU2FtZSBic3NpZCBhcyBwcmVhdXRoIEJTU0lEIikpOworCQkvKiBJbiB0aGlzIGNhc2UgU01FIGlmIGluZGVlZCBoYXMgdHJpZ2dlcmVkIGEgKi8KKwkJLyogcHJlIGF1dGggaXQgd2lsbCB0aW1lIG91dC4gKi8KKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlpZiAodHJ1ZSA9PQorCSAgICBwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5iUHJlQXV0aFJzcFByb2Nlc3NlZCkgeworCQkvKgorCQkgKiBUaGlzIGlzIGxpa2VseSBhIGR1cGxpY2F0ZSBmb3IgdGhlIHNhbWUgcHJlLWF1dGggcmVxdWVzdC4KKwkJICogUEUvTElNIGFscmVhZHkgcG9zdGVkIGEgcmVzcG9uc2UgdG8gU01FLiBIZW5jZSwgZHJvcCBpdC4KKwkJICogVEJEOgorCQkgKiAxKSBIb3cgZGlkIHdlIGV2ZW4gcmVjZWl2ZSBtdWx0aXBsZSBhdXRoIHJlc3BvbnNlcz8KKwkJICogMikgRG8gd2UgbmVlZCB0byBkZWxldGUgcHJlLWF1dGggc2Vzc2lvbj8gU3VwcG9zZSB3ZQorCQkgKiBwcmV2aW91c2x5IHJlY2VpdmVkIGFuIGF1dGggcmVzcCB3aXRoIGZhaWx1cmUgd2hpY2gKKwkJICogd291bGQgbm90IGhhdmUgY3JlYXRlZCB0aGUgc2Vzc2lvbiBhbmQgZm9yd2FyZGVkIHRvIFNNRS4KKwkJICogQW5kLCB3ZSBzdWJzZXF1ZW50bHkgcmVjZWl2ZWQgYW4gYXV0aCByZXNwIHdpdGggc3VjY2VzcworCQkgKiB3aGljaCB3b3VsZCBoYXZlIGNyZWF0ZWQgdGhlIHNlc3Npb24uIFRoaXMgd2lsbCBub3cgYmUKKwkJICogZHJvcHBlZCB3aXRob3V0IGJlaW5nIGZvcndhcmRlZCB0byBTTUUhIEhvd2V2ZXIsIGl0IGlzCisJCSAqIHZlcnkgdW5saWtlbHkgdG8gcmVjZWl2ZSBhdXRoIHJlc3BvbnNlcyBmcm9tIHRoZSBzYW1lCisJCSAqIEFQIHdpdGggZGlmZmVyZW50IHJlYXNvbiBjb2Rlcy4KKwkJICogTk9URTogcmV0dXJuIGVTSVJfU1VDQ0VTUyBzbyB0aGF0IHRoZSBwYWNrZXQgaXMgZHJvcHBlZAorCQkgKiBhcyB0aGlzIHdhcyBpbmRlZWQgYSByZXNwb25zZSBmcm9tIHRoZSBCU1NJRCB3ZSB0cmllZCB0bworCQkgKiBwcmUtYXV0aC4KKwkJICovCisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPRzEsICJBdXRoIHJzcCBhbHJlYWR5IHBvc3RlZCB0byBTTUUiCisJCQkgICAgICAgIiAoc2Vzc2lvbiAlcCwgRlQgc2Vzc2lvbiAlcCkiLCBwc2Vzc2lvbkVudHJ5LAorCQkJICAgICAgIHBzZXNzaW9uRW50cnkpOworCQkgICAgICAgKTsKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dXLCAiQXV0aCByc3Agbm90IHlldCBwb3N0ZWQgdG8gU01FIgorCQkJICAgICAgICIgKHNlc3Npb24gJXAsIEZUIHNlc3Npb24gJXApIiwgcHNlc3Npb25FbnRyeSwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJICAgICAgICk7CisJCXBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPmJQcmVBdXRoUnNwUHJvY2Vzc2VkID0KKwkJCXRydWU7CisJfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJQcmUtQXV0aCByZXNwb25zZSByZWNlaXZlZCBmcm9tIG5laWdoYm9yIikpOworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlByZS1BdXRoIGRvbmUgc3RhdGUiKSk7CisjZW5kaWYKKwkvKiBTdG9wcGluZyB0aW1lciBub3csIHRoYXQgd2UgaGF2ZSBvdXIgdW5pY2FzdCBmcm9tIHRoZSBBUCAqLworCS8qIG9mIG91ciBjaG9pY2UuICovCisJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihwTWFjLCBlTElNX0ZUX1BSRUFVVEhfUlNQX1RJTUVSKTsKKworCS8qIFNhdmUgb2ZmIHRoZSBhdXRoIHJlc3AuICovCisJaWYgKChzaXJfY29udmVydF9hdXRoX2ZyYW1lMl9zdHJ1Y3QocE1hYywgcEJvZHksIGZyYW1lTGVuLCAmcnhBdXRoRnJhbWUpICE9CisJICAgICBlU0lSX1NVQ0NFU1MpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJmYWlsZWQgdG8gY29udmVydCBBdXRoIGZyYW1lIHRvIHN0cnVjdCIpKTsKKwkJbGltX2hhbmRsZV9mdF9wcmVfYXV0aF9yc3AocE1hYywgZVNJUl9GQUlMVVJFLCBOVUxMLCAwLAorCQkJCQkgICBwc2Vzc2lvbkVudHJ5KTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJcFJ4QXV0aEZyYW1lQm9keSA9ICZyeEF1dGhGcmFtZTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HMSwKKwkJICAgICAgIEZMCisJCQkgICAgICAgKCJSZWNlaXZlZCBBdXRoIGZyYW1lIHdpdGggdHlwZT0lZCBzZXFudW09JWQsIHN0YXR1cz0lZCAoJWQpIiksCisJCSAgICAgICAodWludDMyX3QpIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyLAorCQkgICAgICAgKHVpbnQzMl90KSBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIsCisJCSAgICAgICAodWludDMyX3QpIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhTdGF0dXNDb2RlLAorCQkgICAgICAgKHVpbnQzMl90KSBwTWFjLT5saW0uZ0xpbU51bVByZUF1dGhDb250ZXh0cyk7CisJICAgICAgICkKKyNlbmRpZgorCXN3aXRjaCAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyKSB7CisJY2FzZSBTSVJfTUFDX0FVVEhfRlJBTUVfMjoKKwkJaWYgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhTdGF0dXNDb2RlICE9IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTKSB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLCAiQXV0aCBzdGF0dXMgY29kZSByZWNlaXZlZCBpcyAlZCIsCisJCQkJICAgICAgICh1aW50MzJfdCkgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aFN0YXR1c0NvZGUpOworCQkJICAgICAgICk7CisjZW5kaWYKKwkJCWlmIChlU0lSX01BQ19NQVhfQVNTT0NfU1RBX1JFQUNIRURfU1RBVFVTID09CisJCQkgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aFN0YXR1c0NvZGUpCisJCQkJcmV0X3N0YXR1cyA9IGVTSVJfTElNX01BWF9TVEFfUkVBQ0hFRF9FUlJPUjsKKwkJfSBlbHNlIHsKKwkJCXJldF9zdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsICJTZXEuIG5vIGluY29ycmVjdCBleHBlY3RlZCAyIHJlY2VpdmVkICVkIiwKKwkJCSAgICAgICAodWludDMyX3QpIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlcik7CisJCSAgICAgICApCisjZW5kaWYKKwkJYnJlYWs7CisJfQorCisJLyogU2VuZCB0aGUgQXV0aCByZXNwb25zZSB0byBTTUUgKi8KKwlsaW1faGFuZGxlX2Z0X3ByZV9hdXRoX3JzcChwTWFjLCByZXRfc3RhdHVzLCBwQm9keSwgZnJhbWVMZW4sIHBzZXNzaW9uRW50cnkpOworCisJcmV0dXJuIHJldF9zdGF0dXM7Cit9CisKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19iZWFjb25fZnJhbWUuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfYmVhY29uX2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3MmE2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfYmVhY29uX2ZyYW1lLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV9wcm9jZXNzX2JlYWNvbl9mcmFtZS5jYyBjb250YWlucyB0aGUgY29kZQorICogZm9yIHByb2Nlc3NpbmcgUmVjZWl2ZWQgQmVhY29uIEZyYW1lLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDMvMDEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAic2NoX2FwaS5oIgorI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgImxpbV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9hc3NvY191dGlscy5oIgorI2luY2x1ZGUgImxpbV9wcm9wX2V4dHNfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VyX2Rlc191dGlscy5oIgorCisvKioKKyAqIGxpbV9wcm9jZXNzX2JlYWNvbl9mcmFtZSgpIC0gdG8gcHJvY2VzcyBiZWFjb24gZnJhbWVzCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJ4X3BrdF9pbmZvOiBBIHBvaW50ZXIgdG8gUlggcGFja2V0IGluZm8gc3RydWN0dXJlCisgKiBAc2Vzc2lvbjogQSBwb2ludGVyIHRvIHNlc3Npb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbiBCZWFjb24KKyAqIGZyYW1lIHJlY2VwdGlvbi4KKyAqIE5vdGU6CisgKiAxLiBCZWFjb25zIHJlY2VpdmVkIGluICdub3JtYWwnIHN0YXRlIGluIElCU1MgYXJlIGhhbmRsZWQgYnkKKyAqICAgIEJlYWNvbiBQcm9jZXNzaW5nIG1vZHVsZS4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworCit2b2lkCitsaW1fcHJvY2Vzc19iZWFjb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCAqcnhfcGt0X2luZm8sCisJCQkgdHBQRVNlc3Npb24gc2Vzc2lvbikKK3sKKwl0cFNpck1hY01nbXRIZHIgbWFjX2hkcjsKKwl0U2NoQmVhY29uU3RydWN0ICpiY25fcHRyOworCisJbWFjX2N0eC0+bGltLmdMaW1OdW1CZWFjb25zUmN2ZCsrOworCisJLyoKKwkgKiBoZXJlIGlzIGl0IHJlcXVpcmVkIHRvIGluY3JlbWVudCBzZXNzaW9uIHNwZWNpZmljIGhlYXJ0QmVhdAorCSAqIGJlYWNvbiBjb3VudGVyCisJICovCisJbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisJbGltX2xvZyhtYWNfY3R4LCBMT0cyLAorCQlGTCgiUmVjZWl2ZWQgQmVhY29uIGZyYW1lIHdpdGggbGVuZ3RoPSVkIGZyb20gIiksCisJCVdNQV9HRVRfUlhfTVBEVV9MRU4ocnhfcGt0X2luZm8pKTsKKwkJbGltX3ByaW50X21hY19hZGRyKG1hY19jdHgsIG1hY19oZHItPnNhLCBMT0cyKTsKKworCS8qIEV4cGVjdCBCZWFjb24gaW4gYW55IHN0YXRlIGFzIFNjYW4gaXMgaW5kZXBlbmRlbnQgb2YgTElNIHN0YXRlICovCisJYmNuX3B0ciA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqYmNuX3B0cikpOworCWlmIChOVUxMID09IGJjbl9wdHIpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKSk7CisJCXJldHVybjsKKwl9CisJLyogUGFyc2UgcmVjZWl2ZWQgQmVhY29uICovCisJaWYgKHNpcl9jb252ZXJ0X2JlYWNvbl9mcmFtZTJfc3RydWN0KG1hY19jdHgsCisJCQlyeF9wa3RfaW5mbywgYmNuX3B0cikgIT0KKwkJCWVTSVJfU1VDQ0VTUykgeworCQkvKgorCQkgKiBSZWNlaXZlZCB3cm9uZ2x5IGZvcm1hdHRlZC9pbnZhbGlkIEJlYWNvbi4KKwkJICogSWdub3JlIGl0IGFuZCBtb3ZlIG9uLgorCQkgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIlJlY2VpdmVkIGludmFsaWQgQmVhY29uIGluIHN0YXRlICVYIiksCisJCQlzZXNzaW9uLT5saW1NbG1TdGF0ZSk7CisJCWxpbV9wcmludF9tbG1fc3RhdGUobWFjX2N0eCwgTE9HVywKKwkJCXNlc3Npb24tPmxpbU1sbVN0YXRlKTsKKwkJY2RmX21lbV9mcmVlKGJjbl9wdHIpOworCQlyZXR1cm47CisJfQorCS8qCisJICogZHVyaW5nIHNjYW5uaW5nLCB3aGVuIGFueSBzZXNzaW9uIGlzIGFjdGl2ZSwgYW5kCisJICogYmVhY29uL1ByIGJlbG9uZ3MgdG8gb25lIG9mIHRoZSBzZXNzaW9uLCBmaWxsIHVwIHRoZQorCSAqIGZvbGxvd2luZywgVEJEIC0gSEIgY291dGVyCisJICovCisJaWYgKCghc2Vzc2lvbi0+bGFzdEJlYWNvbkR0aW1QZXJpb2QpICYmCisJICAgIChzaXJfY29tcGFyZV9tYWNfYWRkcihzZXNzaW9uLT5ic3NJZCwKKwkJCQliY25fcHRyLT5ic3NpZCkpKSB7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSZzZXNzaW9uLT5sYXN0QmVhY29uVGltZVN0YW1wLAorCQkJKHVpbnQ4X3QgKikgYmNuX3B0ci0+dGltZVN0YW1wLAorCQkJc2l6ZW9mKHVpbnQ2NF90KSk7CisJCXNlc3Npb24tPmxhc3RCZWFjb25EdGltQ291bnQgPQorCQkJCWJjbl9wdHItPnRpbS5kdGltQ291bnQ7CisJCXNlc3Npb24tPmxhc3RCZWFjb25EdGltUGVyaW9kID0KKwkJCQliY25fcHRyLT50aW0uZHRpbVBlcmlvZDsKKwkJc2Vzc2lvbi0+Y3VycmVudEJzc0JlYWNvbkNudCsrOworCX0KKwlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsCisJCVRSQUNFX0NPREVfUlhfTUdNVF9UU0YsIDAsIGJjbl9wdHItPnRpbWVTdGFtcFswXSk7KQorCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9SWF9NR01UX1RTRiwgMCwKKwkJYmNuX3B0ci0+dGltZVN0YW1wWzFdKTspCisJbGltX2NoZWNrX2FuZF9hZGRfYnNzX2Rlc2NyaXB0aW9uKG1hY19jdHgsIGJjbl9wdHIsCisJCQkJcnhfcGt0X2luZm8sIGZhbHNlLCB0cnVlKTsKKworCWlmICgobWFjX2N0eC0+bGltLmdMaW1NbG1TdGF0ZSA9PQorCQkJCWVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUpIHx8CisJCShtYWNfY3R4LT5saW0uZ0xpbU1sbVN0YXRlID09CisJCQkJZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFKSkgeworCQlsaW1fY2hlY2tfYW5kX2FkZF9ic3NfZGVzY3JpcHRpb24obWFjX2N0eCwgYmNuX3B0ciwKKwkJCXJ4X3BrdF9pbmZvLAorCQkJKChtYWNfY3R4LT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSA9PQorCQkJICAgICAgZUxJTV9IQUxfU0NBTk5JTkdfU1RBVEUpID8gdHJ1ZSA6IGZhbHNlKSwKKwkJCSAgICAgIGZhbHNlKTsKKwkJLyoKKwkJICogQ2FsbGluZyBkZnNDaGFubmVsTGlzdCB3aGljaCB3aWxsIGNvbnZlcnQgREZTIGNoYW5uZWwKKwkJICogdG8gYWN0aXZlIGNoYW5uZWwgZm9yIHggc2VjcyBpZiB0aGlzIGNoYW5uZWwgaXMgREZTCisJCSAqLworCQlsaW1fc2V0X2Rmc19jaGFubmVsX2xpc3QobWFjX2N0eCwKKwkJCWJjbl9wdHItPmNoYW5uZWxOdW1iZXIsCisJCQkmbWFjX2N0eC0+bGltLmRmc2NoYW5uZWxMaXN0KTsKKwl9IGVsc2UgaWYgKHNlc3Npb24tPmxpbU1sbVN0YXRlID09CisJCQllTElNX01MTV9XVF9KT0lOX0JFQUNPTl9TVEFURSkgeworCQlpZiAoc2Vzc2lvbi0+YmVhY29uICE9IE5VTEwpIHsKKwkJCWNkZl9tZW1fZnJlZShzZXNzaW9uLT5iZWFjb24pOworCQkJc2Vzc2lvbi0+YmVhY29uID0gTlVMTDsKKwkJfQorCQlzZXNzaW9uLT5iY25MZW4gPSBXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHJ4X3BrdF9pbmZvKTsKKwkJc2Vzc2lvbi0+YmVhY29uID0gY2RmX21lbV9tYWxsb2Moc2Vzc2lvbi0+YmNuTGVuKTsKKwkJaWYgKE5VTEwgPT0gc2Vzc2lvbi0+YmVhY29uKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoImZhaWwgdG8gYWxsb2MgbWVtIHRvIHN0b3JlIGJjbiIpKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBTdG9yZSB0aGUgQmVhY29uL1Byb2JlUnNwLiBUaGlzIGlzIHNlbnQgdG8KKwkJCSAqIGNzci9oZGQgaW4gam9pbiBjbmYgcmVzcG9uc2UuCisJCQkgKi8KKwkJCWNkZl9tZW1fY29weShzZXNzaW9uLT5iZWFjb24sCisJCQkJV01BX0dFVF9SWF9NUERVX0RBVEEocnhfcGt0X2luZm8pLAorCQkJCXNlc3Npb24tPmJjbkxlbik7CisJCX0KKwkJbGltX2NoZWNrX2FuZF9hbm5vdW5jZV9qb2luX3N1Y2Nlc3MobWFjX2N0eCwgYmNuX3B0ciwKKwkJCQltYWNfaGRyLCBzZXNzaW9uKTsKKwl9CisJY2RmX21lbV9mcmVlKGJjbl9wdHIpOworCXJldHVybjsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgIGxpbV9wcm9jZXNzX2JlYWNvbl9mcmFtZV9ub19zZXNzaW9uCisgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NNZXNzYWdlUXVldWUoKQorIFwgICAgICAgdXBvbiBCZWFjb24gcmVjZXB0aW9uLgorIFwKKyAgIFxwYXJhbSBwTWFjCisgICBccGFyYW0gKnBSeFBhY2tldEluZm8gICAgLSBBIHBvaW50ZXIgdG8gUnggcGFja2V0IGluZm8gc3RydWN0dXJlCisgICBccmV0dXJuIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1fcHJvY2Vzc19iZWFjb25fZnJhbWVfbm9fc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwUnhQYWNrZXRJbmZvKQoreworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXRTY2hCZWFjb25TdHJ1Y3QgKnBCZWFjb247CisKKwlwTWFjLT5saW0uZ0xpbU51bUJlYWNvbnNSY3ZkKys7CisJcEhkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKworCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoIlJlY2VpdmVkIEJlYWNvbiBmcmFtZSB3aXRoIGxlbmd0aD0lZCBmcm9tICIpLAorCQlXTUFfR0VUX1JYX01QRFVfTEVOKHBSeFBhY2tldEluZm8pKTsKKwlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcEhkci0+c2EsIExPRzIpOworCisKKwkvKioKKwkgKiBObyBzZXNzaW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLiBFeHBlY3QgQmVhY29uIG9ubHkgd2hlbgorCSAqIDEuIFNUQSBpcyBpbiBTY2FuIG1vZGUgd2FpdGluZyBmb3IgQmVhY29uL1Byb2JlIHJlc3BvbnNlIG9yCisJICogMi4gU1RBL0FQIGlzIGluIExlYXJuIG1vZGUKKwkgKi8KKwlpZiAoKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURSkgfHwKKwkgICAgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFKSB8fAorCSAgICAocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9MRUFSTl9TVEFURSkpIHsKKwkJcEJlYWNvbiA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2NoQmVhY29uU3RydWN0KSk7CisJCWlmIChOVUxMID09IHBCZWFjb24pIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTAorCQkJCQkoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgaW4gbGltX3Byb2Nlc3NfYmVhY29uX2ZyYW1lX25vX3Nlc3Npb24iKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoc2lyX2NvbnZlcnRfYmVhY29uX2ZyYW1lMl9zdHJ1Y3QKKwkJCSAgICAocE1hYywgKHVpbnQ4X3QgKikgcFJ4UGFja2V0SW5mbywKKwkJCSAgICBwQmVhY29uKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCS8qIFJlY2VpdmVkIHdyb25nbHkgZm9ybWF0dGVkL2ludmFsaWQgQmVhY29uLiBJZ25vcmUgYW5kIG1vdmUgb24uICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJRkwKKwkJCQkJKCJSZWNlaXZlZCBpbnZhbGlkIEJlYWNvbiBpbiBnbG9iYWwgTUxNIHN0YXRlICVYIiksCisJCQkJcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSk7CisJCQlsaW1fcHJpbnRfbWxtX3N0YXRlKHBNYWMsIExPR1csIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpOworCQkJY2RmX21lbV9mcmVlKHBCZWFjb24pOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUpIHx8CisJCSAgICAocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9QQVNTSVZFX1NDQU5fU1RBVEUpKSB7CisJCQlsaW1fY2hlY2tfYW5kX2FkZF9ic3NfZGVzY3JpcHRpb24ocE1hYywgcEJlYWNvbiwKKwkJCQkJCQkgIHBSeFBhY2tldEluZm8sIHRydWUsCisJCQkJCQkJICBmYWxzZSk7CisJCQkvKiBDYWxsaW5nIGRmc0NoYW5uZWxMaXN0IHdoaWNoIHdpbGwgY29udmVydCBERlMgY2hhbm5lbAorCQkJICogdG8gQWN0aXZlIGNoYW5uZWwgZm9yIHggc2VjcyBpZiB0aGlzIGNoYW5uZWwgaXMgREZTIGNoYW5uZWwgKi8KKwkJCWxpbV9zZXRfZGZzX2NoYW5uZWxfbGlzdChwTWFjLCBwQmVhY29uLT5jaGFubmVsTnVtYmVyLAorCQkJCQkJICZwTWFjLT5saW0uZGZzY2hhbm5lbExpc3QpOworCQl9IGVsc2UgaWYgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fTEVBUk5fU1RBVEUpIHsKKwkJfSAvKiBlbmQgb2YgZUxJTV9NTE1fTEVBUk5fU1RBVEUpICovCisJCWNkZl9tZW1fZnJlZShwQmVhY29uKTsKKwl9IC8qIGVuZCBvZiAoZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURSkgfHwgKGVMSU1fTUxNX1BBU1NJVkVfU0NBTl9TVEFURSkgKi8KKwllbHNlIHsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiUmN2ZCBCZWFjb24gaW4gdW5leHBlY3RlZCBNTE0gc3RhdGUgJWQiKSwKKwkJCXBNYWMtPmxpbS5nTGltTWxtU3RhdGUpOworCQlsaW1fcHJpbnRfbWxtX3N0YXRlKHBNYWMsIExPRzEsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpOworI2lmZGVmIFdMQU5fREVCVUcKKwkJcE1hYy0+bGltLmdMaW1VbmV4cEJjbkNudCsrOworI2VuZGlmCisJfQorCisJcmV0dXJuOworfSAvKioqIGVuZCBsaW1fcHJvY2Vzc19iZWFjb25fZnJhbWVfbm9fc2Vzc2lvbigpICoqKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfY2ZnX3VwZGF0ZXMuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfY2ZnX3VwZGF0ZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWE2NDVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19jZmdfdXBkYXRlcy5jCkBAIC0wLDAgKzEsNjQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGxpbV9wcm9jZXNzX2NmZ191cGRhdGVzLmNjIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucworICogdG8gaGFuZGxlIHZhcmlvdXMgQ0ZHIHBhcmFtZXRlciB1cGRhdGUgZXZlbnRzCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMS8yMC8wMworICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKworI2luY2x1ZGUgInduaV9jZmcuaCIKKyNpbmNsdWRlICJzaXJfbWFjX3Byb3RfZGVmLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgImxpbV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9wcm9wX2V4dHNfdXRpbHMuaCIKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisjaW5jbHVkZSAicnJtX2FwaS5oIgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGxpbV91cGRhdGVfY29uZmlnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCitzdGF0aWMgdm9pZCBsaW1fc2V0X2RlZmF1bHRfa2V5X2lkX2FuZF9rZXlzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisjaWZkZWYgRklYTUVfR0VONgorCXVpbnQzMl90IHZhbDsKKwl1aW50MzJfdCBka0NmZ0lkOworCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJTZXR0aW5nIGRlZmF1bHQga2V5cyBhdCBTUCIpKTspCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRCwKKwkJCSAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gcmV0cmlldmUgZGVmYXVsdEtleUlkIGZyb20gQ0ZHIikpOworCX0KKwlka0NmZ0lkID0gbGltR2V0Q2ZnSWRPZkRlZmF1bHRLZXlpZCh2YWwpOworI2VuZGlmCisKK30gLyoqKiBlbmQgbGltX3NldF9kZWZhdWx0X2tleV9pZF9hbmRfa2V5cygpICoqKi8KKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX3NldF9jZmdfcHJvdGVjdGlvbgorICAgXGJyaWVmIHNldHMgbGltIGdsb2JhbCBjZmcgY2FjaGUgZnJvbSB0aGUgY29uZmlnLgorICAgXHBhcmFtICAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworICAgXHJldHVybiAgICAgIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1fc2V0X2NmZ19wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBlc2Vzc2lvbkVudHJ5KQoreworCXVpbnQzMl90IHZhbCA9IDA7CisKKwlpZiAocGVzZXNzaW9uRW50cnkgIT0gTlVMTCAmJiBMSU1fSVNfQVBfUk9MRShwZXNlc3Npb25FbnRyeSkpIHsKKwkJaWYgKHBlc2Vzc2lvbkVudHJ5LT5nTGltUHJvdGVjdGlvbkNvbnRyb2wgPT0KKwkJICAgIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fRElTQUJMRSkKKwkJCWNkZl9tZW1fc2V0KCh2b2lkICopJnBlc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLAorCQkJCSAgICBzaXplb2YodENmZ1Byb3RlY3Rpb24pLCAwKTsKKwkJZWxzZSB7CisJCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJRkwoIiBmcm0xMWEgPSAlZCwgZnJvbTExYiA9ICVkLCBmcm0xMWcgPSAlZCwgIgorCQkJCSAgICJodDIwID0gJWQsIG5vbmdmID0gJWQsIGxzaWdUeG9wID0gJWQsICIKKwkJCQkgICAicmlmcyA9ICVkLCBvYnNzID0gJWQiKSwKKwkJCQlwZXNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5mcm9tbGxhLAorCQkJCXBlc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLmZyb21sbGIsCisJCQkJcGVzZXNzaW9uRW50cnktPmNmZ1Byb3RlY3Rpb24uZnJvbWxsZywKKwkJCQlwZXNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5odDIwLAorCQkJCXBlc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLm5vbkdmLAorCQkJCXBlc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLmxzaWdUeG9wLAorCQkJCXBlc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLnJpZnMsCisJCQkJcGVzZXNzaW9uRW50cnktPmNmZ1Byb3RlY3Rpb24ub2Jzcyk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OLCAmdmFsKQorCQkgICAgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwKKwkJCQkJKCJyZWFkaW5nIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04gY2ZnIGZhaWxlZCIpKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlCisJCQlwTWFjLT5saW0uZ0xpbVByb3RlY3Rpb25Db250cm9sID0gKHVpbnQ4X3QpIHZhbDsKKworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRCwgJnZhbCkgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgicmVhZGluZyBwcm90ZWN0aW9uIGNmZyBmYWlsZWQiKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAocE1hYy0+bGltLmdMaW1Qcm90ZWN0aW9uQ29udHJvbCA9PQorCQkgICAgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorCQkJY2RmX21lbV9zZXQoKHZvaWQgKikmcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24sCisJCQkJICAgIHNpemVvZih0Q2ZnUHJvdGVjdGlvbiksIDApOworCQllbHNlIHsKKwkJCXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmZyb21sbGEgPQorCQkJCSh2YWwgPj4gV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfRlJPTV9sbEEpICYgMTsKKwkJCXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmZyb21sbGIgPQorCQkJCSh2YWwgPj4gV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfRlJPTV9sbEIpICYgMTsKKwkJCXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmZyb21sbGcgPQorCQkJCSh2YWwgPj4gV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfRlJPTV9sbEcpICYgMTsKKwkJCXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmh0MjAgPQorCQkJCSh2YWwgPj4gV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfSFRfMjApICYgMTsKKwkJCXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm5vbkdmID0KKwkJCQkodmFsID4+IFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX05PTl9HRikgJiAxOworCQkJcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24ubHNpZ1R4b3AgPQorCQkJCSh2YWwgPj4gV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfTFNJR19UWE9QKSAmIDE7CisJCQlwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5yaWZzID0KKwkJCQkodmFsID4+IFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX1JJRlMpICYgMTsKKwkJCXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm9ic3MgPQorCQkJCSh2YWwgPj4gV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0JTUykgJiAxOworCisJCX0KKwl9Cit9CisKKy8qKgorICogbGltX2hhbmRsZV9wYXJhbV91cGRhdGUoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlIHRvIHBvc3QgYSBtZXNzYWdlIHdoZW5ldmVyIG5lZWQgaW5kaWNhdGUKKyAqIHRoZXJlIGlzIHVwZGF0ZSBvZiBjb25maWcgcGFyYW1ldGVyLgorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgY2ZnSWQgLSBJRCBvZiBDRkcgcGFyYW1ldGVyIHRoYXQgZ290IHVwZGF0ZWQKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbV9oYW5kbGVfcGFyYW1fdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVVcGRhdGVJRXNUeXBlIGNmZ0lkKQoreworCXRTaXJNc2dRIG1zZyA9IHsgMCB9OworCXVpbnQzMl90IHN0YXR1czsKKworCVBFTE9HMyhsaW1fbG9nCisJCSAgICAgICAocE1hYywgTE9HMywgRkwoIkhhbmRsaW5nIENGRyBwYXJhbWV0ZXIgaWQgJVggdXBkYXRlIiksIGNmZ0lkKTsKKwkgICAgICAgKQorCXN3aXRjaCAoY2ZnSWQpIHsKKwljYXNlIGVVUERBVEVfSUVfUFJPQkVfQkNOOgorCXsKKwkJbXNnLnR5cGUgPSBTSVJfTElNX1VQREFURV9CRUFDT047CisJCXN0YXR1cyA9IGxpbV9wb3N0X21zZ19hcGkocE1hYywgJm1zZyk7CisKKwkJaWYgKHN0YXR1cyAhPSBUWF9TVUNDRVNTKQorCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJGYWlsZWQgbGltX3Bvc3RfbXNnX2FwaSAldSIpLCBzdGF0dXMpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogbGltX2hhbmRsZV9jZl9ncGFyYW1fdXBkYXRlKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19tZXNzYWdlcygpIHRvCisgKiB3aGVuZXZlciBTSVJfQ0ZHX1BBUkFNX1VQREFURV9JTkQgbWVzc2FnZSBpcyBwb3N0ZWQKKyAqIHRvIExJTSAoZHVlIHRvIGEgc2V0IG9wZXJhdGlvbiBvbiBhIENGRyBwYXJhbWV0ZXIpLgorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgY2ZnSWQgLSBJRCBvZiBDRkcgcGFyYW1ldGVyIHRoYXQgZ290IHVwZGF0ZWQKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX2hhbmRsZV9jZl9ncGFyYW1fdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IGNmZ0lkKQoreworCXVpbnQzMl90IHZhbDEsIHZhbDI7CisJdWludDE2X3QgdmFsMTY7CisJdFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gKnBIVENhcGFiaWxpdHlJbmZvOworCXRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvICpwQW1wZHVQYXJhbUluZm87CisKKwlQRUxPRzMobGltX2xvZworCQkgICAgICAgKHBNYWMsIExPRzMsIEZMKCJIYW5kbGluZyBDRkcgcGFyYW1ldGVyIGlkICVYIHVwZGF0ZSIpLCBjZmdJZCk7CisJICAgICAgICkKKwlzd2l0Y2ggKGNmZ0lkKSB7CisJY2FzZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEOgorCisJCS8qICEhTEFDIC0gd2hlbiB0aGUgZGVmYXVsdCBLZXlJRCBpcyBjaGFuZ2VkLCBmb3JjZSBhbGwgb2YgdGhlICovCisJCS8qIGtleXMgYW5kIHRoZSBrZXlJRCB0byBiZSByZXByb2dyYW1tZWQuICB0aGlzIGFsbG93cyB0aGUgKi8KKwkJLyoga2V5cyB0byBjaGFuZ2UgYWZ0ZXIgdGhlIGluaXRpYWwgc2V0dGluZyBvZiB0aGUga2V5cyB3aGVuIHRoZSBDRkcgd2FzICovCisJCS8qIGFwcGxpZWQgYXQgYXNzb2NpYXRpb24gdGltZSB0aHJvdWdoIENGRyBjaGFuZ2VzIG9mIHRoZSBrZXlzLiAqLworCQlsaW1fc2V0X2RlZmF1bHRfa2V5X2lkX2FuZF9rZXlzKHBNYWMpOworCisJCWJyZWFrOworCisJY2FzZSBXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURUQ6CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfRVhDTFVERV9VTkVOQ1JZUFRFRCwKKwkJCQkgICAgICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiVW5hYmxlIHRvIHJldHJpZXZlIGV4Y2x1ZGVVbmVuY3IgZnJvbSBDRkciKSk7CisJCX0KKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlVuc3VwcG9ydGVkIENGRzogV05JX0NGR19FWENMVURFX1VORU5DUllQVEVEIikpOworCisJCWJyZWFrOworCisJY2FzZSBXTklfQ0ZHX0FTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVDoKKwkJaWYgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgIT0gZUxJTV9NTE1fV1RfQVNTT0NfUlNQX1NUQVRFKSB7CisJCQkvKiAnQ2hhbmdlJyB0aW1lciBmb3IgZnV0dXJlIGFjdGl2YXRpb25zICovCisJCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKHBNYWMsCisJCQkJCQkJZUxJTV9BU1NPQ19GQUlMX1RJTUVSKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRDoKKwkJbGltX3NldF9jZmdfcHJvdGVjdGlvbihwTWFjLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0ZMQUc6CisJeworCQl0U2lyTXNnUSBtc2cgPSB7IDAgfTsKKwkJdWludDMyX3Qgc3RhdHVzOworCisJCW1zZy50eXBlID0gU0lSX0xJTV9VUERBVEVfQkVBQ09OOworCisJCXN0YXR1cyA9IGxpbV9wb3N0X21zZ19hcGkocE1hYywgJm1zZyk7CisKKwkJaWYgKHN0YXR1cyAhPSBUWF9TVUNDRVNTKQorCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJGYWlsZWQgbGltX3Bvc3RfbXNnX2FwaSAldSIpLCBzdGF0dXMpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCX0KKwljYXNlIFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZOgorCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0hUX0NBUF9JTkZPLCAmdmFsMSkgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgSFQgQ2FwIEluZm8gQ0ZHIikpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCQl9CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZLCAmdmFsMikKKwkJICAgICE9IGVTSVJfU1VDQ0VTUykgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgR3JlZW5GaWVsZCBDRkciKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJCX0KKwkJdmFsMTYgPSAodWludDE2X3QpIHZhbDE7CisJCXBIVENhcGFiaWxpdHlJbmZvID0gKHRTaXJNYWNIVENhcGFiaWxpdHlJbmZvICopICZ2YWwxNjsKKwkJcEhUQ2FwYWJpbGl0eUluZm8tPmdyZWVuRmllbGQgPSAodWludDE2X3QpIHZhbDI7CisJCWlmIChjZmdfc2V0X2ludAorCQkJICAgIChwTWFjLCBXTklfQ0ZHX0hUX0NBUF9JTkZPLAorCQkJICAgICoodWludDE2X3QgKikgcEhUQ2FwYWJpbGl0eUluZm8pICE9IGVTSVJfU1VDQ0VTUykKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiY291bGQgbm90IHVwZGF0ZSBIVCBDYXAgSW5mbyBDRkciKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisKKwljYXNlIFdOSV9DRkdfSFRfUlhfU1RCQzoKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgJnZhbDEpICE9CisJCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIFdOSV9DRkdfSFRfQ0FQX0lORk8gIikpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCQl9CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfSFRfUlhfU1RCQywgJnZhbDIpICE9CisJCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIFdOSV9DRkdfSFRfUlhfU1RCQyIpKTsKKwkJCSAgICAgICApCisJCQlicmVhazsKKwkJfQorCQl2YWwxNiA9ICh1aW50MTZfdCkgdmFsMTsKKwkJcEhUQ2FwYWJpbGl0eUluZm8gPSAodFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gKikgJnZhbDE2OworCQlwSFRDYXBhYmlsaXR5SW5mby0+cnhTVEJDID0gKHVpbnQxNl90KSB2YWwyOworCQlpZiAoY2ZnX3NldF9pbnQKKwkJCSAgICAocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywKKwkJCSAgICAqKHVpbnQxNl90ICopIHBIVENhcGFiaWxpdHlJbmZvKSAhPSBlU0lSX1NVQ0NFU1MpCisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgQ2FwIEluZm8gQ0ZHIikpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCisJY2FzZSBXTklfQ0ZHX01BWF9BTVNEVV9MRU5HVEg6CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWwxKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBIVCBDYXAgSW5mbyBDRkciKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19NQVhfQU1TRFVfTEVOR1RILCAmdmFsMikgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgTWF4IEFNU0RVIExlbmd0aCBDRkciKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJCX0KKwkJdmFsMTYgPSAodWludDE2X3QpIHZhbDE7CisJCXBIVENhcGFiaWxpdHlJbmZvID0gKHRTaXJNYWNIVENhcGFiaWxpdHlJbmZvICopICZ2YWwxNjsKKwkJcEhUQ2FwYWJpbGl0eUluZm8tPm1heGltYWxBTVNEVXNpemUgPSAodWludDE2X3QpIHZhbDI7CisJCWlmIChjZmdfc2V0X2ludAorCQkJICAgIChwTWFjLCBXTklfQ0ZHX0hUX0NBUF9JTkZPLAorCQkJICAgICoodWludDE2X3QgKikgcEhUQ2FwYWJpbGl0eUluZm8pICE9IGVTSVJfU1VDQ0VTUykKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiY291bGQgbm90IHVwZGF0ZSBIVCBDYXAgSW5mbyBDRkciKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisKKwljYXNlIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFo6CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWwxKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBIVCBDYXAgQ0ZHIikpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCQl9CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFosICZ2YWwyKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBzaG9ydEdJIDIwTWh6IENGRyIpKTsKKwkJCSAgICAgICApCisJCQlicmVhazsKKwkJfQorCQl2YWwxNiA9ICh1aW50MTZfdCkgdmFsMTsKKwkJcEhUQ2FwYWJpbGl0eUluZm8gPSAodFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gKikgJnZhbDE2OworCQlwSFRDYXBhYmlsaXR5SW5mby0+c2hvcnRHSTIwTUh6ID0gKHVpbnQxNl90KSB2YWwyOworCQlpZiAoY2ZnX3NldF9pbnQKKwkJCSAgICAocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywKKwkJCSAgICAqKHVpbnQxNl90ICopIHBIVENhcGFiaWxpdHlJbmZvKSAhPSBlU0lSX1NVQ0NFU1MpCisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgQ2FwIEluZm8gQ0ZHIikpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCWNhc2UgV05JX0NGR19TSE9SVF9HSV80ME1IWjoKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgJnZhbDEpICE9CisJCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEhUIENhcCBDRkciKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19TSE9SVF9HSV80ME1IWiwgJnZhbDIpICE9CisJCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIHNob3J0R0kgNDBNaHogQ0ZHIikpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCQl9CisJCXZhbDE2ID0gKHVpbnQxNl90KSB2YWwxOworCQlwSFRDYXBhYmlsaXR5SW5mbyA9ICh0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyAqKSAmdmFsMTY7CisJCXBIVENhcGFiaWxpdHlJbmZvLT5zaG9ydEdJNDBNSHogPSAodWludDE2X3QpIHZhbDI7CisJCWlmIChjZmdfc2V0X2ludAorCQkJICAgIChwTWFjLCBXTklfQ0ZHX0hUX0NBUF9JTkZPLAorCQkJICAgICoodWludDE2X3QgKikgcEhUQ2FwYWJpbGl0eUluZm8pICE9IGVTSVJfU1VDQ0VTUykKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiY291bGQgbm90IHVwZGF0ZSBIVCBDYXAgSW5mbyBDRkciKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX01QRFVfREVOU0lUWToKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19IVF9BTVBEVV9QQVJBTVMsICZ2YWwxKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBIVCBBTVBEVSBQYXJhbSBDRkciKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19NUERVX0RFTlNJVFksICZ2YWwyKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBNUERVIERlbnNpdHkgQ0ZHIikpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCQl9CisJCXZhbDE2ID0gKHVpbnQxNl90KSB2YWwxOworCQlwQW1wZHVQYXJhbUluZm8gPSAodFNpck1hY0hUUGFyYW1ldGVyc0luZm8gKikgJnZhbDE2OworCQlwQW1wZHVQYXJhbUluZm8tPm1wZHVEZW5zaXR5ID0gKHVpbnQ4X3QpIHZhbDI7CisJCWlmIChjZmdfc2V0X2ludAorCQkJICAgIChwTWFjLCBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNUywKKwkJCSAgICAqKHVpbnQ4X3QgKikgcEFtcGR1UGFyYW1JbmZvKSAhPSBlU0lSX1NVQ0NFU1MpCisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgQU1QRFUgUGFyYW0gQ0ZHIikpOworCQkJICAgICAgICkKKworCQkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1I6CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TLCAmdmFsMSkgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgSFQgQU1QRFUgUGFyYW0gQ0ZHIikpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCQl9CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUiwgJnZhbDIpICE9CisJCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEFNUERVIEZhY3RvciBDRkciKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJCX0KKwkJdmFsMTYgPSAodWludDE2X3QpIHZhbDE7CisJCXBBbXBkdVBhcmFtSW5mbyA9ICh0U2lyTWFjSFRQYXJhbWV0ZXJzSW5mbyAqKSAmdmFsMTY7CisJCXBBbXBkdVBhcmFtSW5mby0+bWF4UnhBTVBEVUZhY3RvciA9ICh1aW50OF90KSB2YWwyOworCQlpZiAoY2ZnX3NldF9pbnQKKwkJCSAgICAocE1hYywgV05JX0NGR19IVF9BTVBEVV9QQVJBTVMsCisJCQkgICAgKih1aW50OF90ICopIHBBbXBkdVBhcmFtSW5mbykgIT0gZVNJUl9TVUNDRVNTKQorCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJjb3VsZCBub3QgdXBkYXRlIEhUIEFNUERVIFBhcmFtIENGRyIpKTsKKwkJCSAgICAgICApCisJCQlicmVhazsKKworCWNhc2UgV05JX0NGR19ET1QxMV9NT0RFOgorCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0RPVDExX01PREUsICZ2YWwxKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBEb3QxMSBNb2RlICBDRkciKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkU6CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkUsICZ2YWwxKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIlVuYWJsZSB0byBnZXQgV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRSAiKSk7CisJCQlicmVhazsKKwkJfQorCQlwTWFjLT5saW0uZ1NjYW5JblBvd2Vyc2F2ZSA9ICh1aW50OF90KSB2YWwxOworCQlicmVhazsKKworCWNhc2UgV05JX0NGR19BU1NPQ19TVEFfTElNSVQ6CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlULCAmdmFsMSkgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJVbmFibGUgdG8gZ2V0IFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUIikpOworCQkJYnJlYWs7CisJCX0KKwkJcE1hYy0+bGltLmdMaW1Bc3NvY1N0YUxpbWl0ID0gKHVpbnQxNl90KSB2YWwxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9IC8qKiogZW5kIGxpbV9oYW5kbGVfY2ZfZ3BhcmFtX3VwZGF0ZSgpICoqKi8KKworLyoqCisgKiBsaW1fYXBwbHlfY29uZmlndXJhdGlvbigpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYXBwbHkgdGhlIGNvbmZpZ3VyZWQgcGFyYW1ldGVycworICogYmVmb3JlIGpvaW5pbmcgb3IgcmVhc3NvY2lhdGluZyB3aXRoIGEgQlNTIG9yIHN0YXJ0aW5nIGEgQlNTLgorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX2FwcGx5X2NvbmZpZ3VyYXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MzJfdCB2YWwgPSAwLCBwaHlNb2RlOworCisJUEVMT0cyKGxpbV9sb2cocE1hYywgTE9HMiwgRkwoIkFwcGx5aW5nIGNvbmZpZyIpKTspCisKKwlwc2Vzc2lvbkVudHJ5LT5saW1TZW50Q2Fwc0NoYW5nZU50ZiA9IGZhbHNlOworCisJbGltX2dldF9waHlfbW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKwkvKiBTZXQgZGVmYXVsdCBrZXlJZCBhbmQga2V5cyAqLworCWxpbV9zZXRfZGVmYXVsdF9rZXlfaWRfYW5kX2tleXMocE1hYyk7CisKKwlsaW1fdXBkYXRlX2NvbmZpZyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworCWxpbV9nZXRfc2hvcnRfc2xvdF9mcm9tX3BoeV9tb2RlKHBNYWMsIHBzZXNzaW9uRW50cnksIHBoeU1vZGUsCisJCQkJCSAmcHNlc3Npb25FbnRyeS0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCk7CisKKwlsaW1fc2V0X2NmZ19wcm90ZWN0aW9uKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCisJLyogQWRkZWQgZm9yIEJUIC0gQU1QIFN1cHBvcnQgKi8KKwlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkgICAgTElNX0lTX0JUX0FNUF9BUF9ST0xFKHBzZXNzaW9uRW50cnkpIHx8CisJICAgIExJTV9JU19JQlNTX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkgICAgTElNX0lTX0JUX0FNUF9TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkvKiBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGUgYmVhY29uIGdlbmVyYXRpb24gaXMgbm90IGRvbmUKKwkJICAgYXMgYSBwYXJ0IG9mIGpvaW4gcmVxdWVzdCBmb3IgYSBCVC1BTVAgc3RhdGlvbiAqLworCisJCWlmIChwc2Vzc2lvbkVudHJ5LT5zdGF0eXBlRm9yQnNzID09IFNUQV9FTlRSWV9TRUxGKSB7CisJCQlQRUxPRzEobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkgICAgICAgRkwoIkluaXRpYWxpemluZyBCVC1BTVAgYmVhY29uIGdlbmVyYXRpb24iKSk7CisJCQkgICAgICAgKQorCQkJc2NoX3NldF9iZWFjb25faW50ZXJ2YWwocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCQlzY2hfc2V0X2ZpeGVkX2JlYWNvbl9maWVsZHMocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCX0KKwl9CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFLCAmdmFsKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFIikpOworCQlyZXR1cm47CisJfQorCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoInBNYWMtPmxpbS5nU2NhbkluUG93ZXJzYXZlID0gJWh1IiksCisJCSAgICAgICBwTWFjLT5saW0uZ1NjYW5JblBvd2Vyc2F2ZSk7CisJICAgICAgICkKKwlwTWFjLT5saW0uZ1NjYW5JblBvd2Vyc2F2ZSA9ICh1aW50OF90KSB2YWw7CisKK30gLyoqKiBlbmQgbGltX2FwcGx5X2NvbmZpZ3VyYXRpb24oKSAqKiovCisKKy8qKgorICogbGltX3VwZGF0ZV9jb25maWcKKyAqCisgKiBGVU5DVElPTjoKKyAqIFVwZGF0ZSB0aGUgbG9jYWwgc3RhdGUgZnJvbSBDRkcgZGF0YWJhc2UKKyAqIChUaGlzIHVzZWQgdG8gYmUgZHBoVXBkYXRlQ29uZmlnKQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIE5vbmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkIGxpbV91cGRhdGVfY29uZmlnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDMyX3QgdmFsOworCisJc2lyX2NvcHlfbWFjX2FkZHIocE1hYy0+bGltLmdMaW1NeU1hY0FkZHIsIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKTsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEUsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBzaG9ydCBwcmVhbWJsZSBmYWlsZWQiKSk7CisJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZTaG9ydFByZWFtYmxlID0gKHZhbCkgPyAxIDogMDsKKworCS8qIEluIFNUQSBjYXNlIHRoaXMgcGFyYW1ldGVyIGlzIGZpbGxlZCBkdXJpbmcgdGhlIGpvaW4gcmVxdWVzdCAqLworCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfSUJTU19ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfV01FX0VOQUJMRUQsICZ2YWwpICE9CisJCSAgICBlU0lSX1NVQ0NFU1MpCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IHdtZSBlbmFibGVkIGZhaWxlZCIpKTsKKwkJcHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCA9ICh2YWwpID8gMSA6IDA7CisJfQorCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19XU01fRU5BQkxFRCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IHdzbSBlbmFibGVkIGZhaWxlZCIpKTsKKwlwc2Vzc2lvbkVudHJ5LT5saW1Xc21FbmFibGVkID0gKHZhbCkgPyAxIDogMDsKKworCWlmICgoIXBzZXNzaW9uRW50cnktPmxpbVdtZUVuYWJsZWQpICYmIChwc2Vzc2lvbkVudHJ5LT5saW1Xc21FbmFibGVkKSkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiQ2FuJ3QgZW5hYmxlIFdTTSB3aXRob3V0IFdNRSIpKTspCisJCXBzZXNzaW9uRW50cnktPmxpbVdzbUVuYWJsZWQgPSAwOworCX0KKwkvKiBJbiBTVEEgLCB0aGlzIHBhcmFtZXRlciBpcyBmaWxsZWQgZHVyaW5nIHRoZSBqb2luIHJlcXVlc3QgKi8KKwlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgfHwgTElNX0lTX0lCU1NfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1FPU19FTkFCTEVELCAmdmFsKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKQorCQkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBxb3MgZW5hYmxlZCBmYWlsZWQiKSk7CisJCXBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQgPSAodmFsKSA/IDEgOiAwOworCX0KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0hDRl9FTkFCTEVELCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgaGNmIGVuYWJsZWQgZmFpbGVkIikpOworCXBzZXNzaW9uRW50cnktPmxpbUhjZkVuYWJsZWQgPSAodmFsKSA/IDEgOiAwOworCisJLyogQVA6IFdTTSBzaG91bGQgZW5hYmxlIEhDRiBhcyB3ZWxsLCBmb3IgU1RBIGVuYWJsZSBXU00gb25seSBhZnRlciAqLworCS8qIGFzc29jaWF0aW9uIHJlc3BvbnNlIGlzIHJlY2VpdmVkICovCisJaWYgKHBzZXNzaW9uRW50cnktPmxpbVdzbUVuYWJsZWQgJiYgTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpCisJCXBzZXNzaW9uRW50cnktPmxpbUhjZkVuYWJsZWQgPSAxOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR18xMURfRU5BQkxFRCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IDExZCBlbmFibGVkIGZhaWxlZCIpKTsKKwlwc2Vzc2lvbkVudHJ5LT5saW0xMWRFbmFibGVkID0gKHZhbCkgPyAxIDogMDsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlULCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBhc3NvYyBzdGEgbGltaXQgZmFpbGVkIikpOworCX0KKwlwTWFjLT5saW0uZ0xpbUFzc29jU3RhTGltaXQgPSAodWludDE2X3QpIHZhbDsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXJybV91cGRhdGVfY29uZmlnKHBNYWMsIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlVwZGF0ZWQgTGltIHNoYWRvdyBzdGF0ZSBiYXNlZCBvbiBDRkciKSk7KQorfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19kZWF1dGhfZnJhbWUuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfZGVhdXRoX2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0MDU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfZGVhdXRoX2ZyYW1lLmMKQEAgLTAsMCArMSw1OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV9wcm9jZXNzX2RlYXV0aF9mcmFtZS5jYyBjb250YWlucyB0aGUgY29kZQorICogZm9yIHByb2Nlc3NpbmcgRGVhdXRoZW50aWNhdGlvbiBGcmFtZS4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAzLzI0LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlY3VyaXR5X3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Nlcl9kZXNfdXRpbHMuaCIKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisjaW5jbHVkZSAibGltX3NlbmRfbWVzc2FnZXMuaCIKKworLyoqCisgKiBsaW1fcHJvY2Vzc19kZWF1dGhfZnJhbWUKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbgorICogRGVhdXRoZW50aWNhdGlvbiBmcmFtZSByZWNlcHRpb24uCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwUnhQYWNrZXRJbmZvIC0gQSBwb2ludGVyIHRvIEJ1ZmZlciBkZXNjcmlwdG9yICsgYXNzb2NpYXRlZCBQRFVzCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1fcHJvY2Vzc19kZWF1dGhfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcFJ4UGFja2V0SW5mbywKKwkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQ4X3QgKnBCb2R5OworCXVpbnQxNl90IGFpZCwgcmVhc29uQ29kZTsKKwl0cFNpck1hY01nbXRIZHIgcEhkcjsKKwl0TGltTWxtQXNzb2NDbmYgbWxtQXNzb2NDbmY7CisJdExpbU1sbURlYXV0aEluZCBtbG1EZWF1dGhJbmQ7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisJdHBQRVNlc3Npb24gcFJvYW1TZXNzaW9uRW50cnkgPSBOVUxMOworCXVpbnQ4X3Qgcm9hbVNlc3Npb25JZDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJdWludDMyX3QgZnJhbWVMZW47CisjZW5kaWYKKworCXBIZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisKKwlwQm9keSA9IFdNQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pOworCisJaWYgKExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSAmJgorCSAgICAoKGVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFID09IHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSB8fAorCSAgICAgKGVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSkpKSB7CisJCS8qRXZlcnkgMTV0aCBkZWF1dGggZnJhbWUgd2lsbCBiZSBsb2dnZWQgaW4ga21zZyAqLworCQlpZiAoIShwTWFjLT5saW0uZGVhdXRoTXNnQ250ICYgMHhGKSkgeworCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGluIERFQVVUSF9XVF9TVEFURSIKKwkJCQkJICAgICAgICIoYWxyZWFkeSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgcmVjZWl2ZWQgREVBVVRIIGZyYW1lKS4uIgorCQkJCQkgICAgICAgIkRyb3BwaW5nIHRoaXMuLiBEZWF1dGggRmFpbGVkICVkIiksCisJCQkJICAgICAgICsrcE1hYy0+bGltLmRlYXV0aE1zZ0NudCk7CisJCQkgICAgICAgKQorCQl9IGVsc2UgeworCQkJcE1hYy0+bGltLmRlYXV0aE1zZ0NudCsrOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAobGltX2lzX2dyb3VwX2FkZHIocEhkci0+c2EpKSB7CisJCS8qIFJlY2VpdmVkIERlYXV0aCBmcmFtZSBmcm9tIGEgQkMvTUMgYWRkcmVzcyAqLworCQkvKiBMb2cgZXJyb3IgYW5kIGlnbm9yZSBpdCAqLworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJyZWNlaXZlZCBEZWF1dGggZnJhbWUgZnJvbSBhIEJDL01DIGFkZHJlc3MiKSk7CisJCSAgICAgICApCisKKwkJcmV0dXJuOworCX0KKworCWlmIChsaW1faXNfZ3JvdXBfYWRkcihwSGRyLT5kYSkgJiYgIWxpbV9pc19hZGRyX2JjKHBIZHItPmRhKSkgeworCQkvKiBSZWNlaXZlZCBEZWF1dGggZnJhbWUgZm9yIGEgTUMgYWRkcmVzcyAqLworCQkvKiBMb2cgZXJyb3IgYW5kIGlnbm9yZSBpdCAqLworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJyZWNlaXZlZCBEZWF1dGggZnJhbWUgZm9yIGEgTUMgYWRkcmVzcyIpKTsKKwkJICAgICAgICkKKworCQlyZXR1cm47CisJfQorCWlmICghbGltX3ZhbGlkYXRlX3JlY2VpdmVkX2ZyYW1lX2ExX2FkZHIocE1hYywKKwkJCXBIZHItPmRhLCBwc2Vzc2lvbkVudHJ5KSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgicnggZnJhbWUgZG9lc24ndCBoYXZlIHZhbGlkIGExIGFkZHJlc3MsIGRyb3AgaXQiKSk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCS8qIFBNRjogSWYgdGhpcyBzZXNzaW9uIGlzIGEgUE1GIHNlc3Npb24sIHRoZW4gZW5zdXJlIHRoYXQgdGhpcyBmcmFtZSB3YXMgcHJvdGVjdGVkICovCisJaWYgKHBzZXNzaW9uRW50cnktPmxpbVJtZkVuYWJsZWQKKwkgICAgJiYgKFdNQV9HRVRfUlhfRFBVX0ZFRURCQUNLKHBSeFBhY2tldEluZm8pICYKKwkJRFBVX0ZFRURCQUNLX1VOUFJPVEVDVEVEX0VSUk9SKSkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJyZWNlaXZlZCBhbiB1bnByb3RlY3RlZCBkZWF1dGggZnJvbSBBUCIpKTsKKwkJICAgICAgICkKKwkJLyogSWYgdGhlIGZyYW1lIHJlY2VpdmVkIGlzIHVucHJvdGVjdGVkLCBmb3J3YXJkIGl0IHRvIHRoZSBzdXBwbGljYW50IHRvIGluaXRpYXRlICovCisJCS8qIGFuIFNBIHF1ZXJ5ICovCisJCWZyYW1lTGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKTsKKworCQkvKiBzZW5kIHRoZSB1bnByb3RlY3RlZCBmcmFtZSBpbmRpY2F0aW9uIHRvIFNNRSAqLworCQlsaW1fc2VuZF9zbWVfdW5wcm90ZWN0ZWRfbWdtdF9mcmFtZV9pbmQocE1hYywgcEhkci0+ZmMuc3ViVHlwZSwKKwkJCQkJCQkodWludDhfdCAqKSBwSGRyLAorCQkJCQkJCShmcmFtZUxlbiArCisJCQkJCQkJIHNpemVvZih0U2lyTWFjTWdtdEhkcikpLAorCQkJCQkJCXBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwKKwkJCQkJCQlwc2Vzc2lvbkVudHJ5KTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJLyogR2V0IHJlYXNvbkNvZGUgZnJvbSBEZWF1dGhlbnRpY2F0aW9uIGZyYW1lIGJvZHkgKi8KKwlyZWFzb25Db2RlID0gc2lyX3JlYWRfdTE2KHBCb2R5KTsKKworCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCSAgICAgICBGTCgiUmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGZvciBBZGRyOiAiIE1BQ19BRERSRVNTX1NUUgorCQkJIiAobWxtIHN0YXRlID0gJXMsIgorCQkJIiBzbWUgc3RhdGUgPSAlZCBzeXN0ZW1yb2xlICA9ICVkKSB3aXRoIHJlYXNvbiBjb2RlICVkIFslc10gZnJvbSAiCisJCQlNQUNfQUREUkVTU19TVFIpLCBNQUNfQUREUl9BUlJBWShwSGRyLT5kYSksCisJCQlsaW1fbWxtX3N0YXRlX3N0cihwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSksCisJCQlwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSwKKwkJCUdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSksCisJCQlyZWFzb25Db2RlLCBsaW1fZG90MTFfcmVhc29uX3N0cihyZWFzb25Db2RlKSwKKwkJCU1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJICAgICAgICkKKworCWlmIChsaW1fY2hlY2tfZGlzYXNzb2NfZGVhdXRoX2Fja19wZW5kaW5nKHBNYWMsICh1aW50OF90ICopIHBIZHItPnNhKSkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiSWdub3JlIHRoZSBEZWF1dGggcmVjZWl2ZWQsIHdoaWxlIHdhaXRpbmcgZm9yIGFjayBvZiAiCisJCQkJICAgICAgICJkaXNhc3NvYy9kZWF1dGgiKSk7CisJCSAgICAgICApCisJCWxpbV9jbGVhbl91cF9kaXNhc3NvY19kZWF1dGhfcmVxKHBNYWMsICh1aW50OF90ICopIHBIZHItPnNhLCAxKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJc3dpdGNoIChyZWFzb25Db2RlKSB7CisJCWNhc2UgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OOgorCQljYXNlIGVTSVJfTUFDX0RFQVVUSF9MRUFWSU5HX0JTU19SRUFTT046CisJCQkvKiBWYWxpZCByZWFzb25Db2RlIGluIHJlY2VpdmVkIERlYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBJbnZhbGlkIHJlYXNvbkNvZGUgaW4gcmVjZWl2ZWQgRGVhdXRoZW50aWNhdGlvbiBmcmFtZSAqLworCQkJLyogTG9nIGVycm9yIGFuZCBpZ25vcmUgdGhlIGZyYW1lICovCisJCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJyZWNlaXZlZCBEZWF1dGggZnJhbWUgd2l0aCBpbnZhbGlkIHJlYXNvbkNvZGUgJWQgZnJvbSAiCisJCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIpLCByZWFzb25Db2RlLAorCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJICAgICAgICkKKworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCQkgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCXN3aXRjaCAocmVhc29uQ29kZSkgeworCQljYXNlIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTjoKKwkJY2FzZSBlU0lSX01BQ19QUkVWX0FVVEhfTk9UX1ZBTElEX1JFQVNPTjoKKwkJY2FzZSBlU0lSX01BQ19ERUFVVEhfTEVBVklOR19CU1NfUkVBU09OOgorCQljYXNlIGVTSVJfTUFDX0NMQVNTMl9GUkFNRV9GUk9NX05PTl9BVVRIX1NUQV9SRUFTT046CisJCWNhc2UgZVNJUl9NQUNfQ0xBU1MzX0ZSQU1FX0ZST01fTk9OX0FTU09DX1NUQV9SRUFTT046CisJCWNhc2UgZVNJUl9NQUNfU1RBX05PVF9QUkVfQVVUSEVOVElDQVRFRF9SRUFTT046CisJCQkvKiBWYWxpZCByZWFzb25Db2RlIGluIHJlY2VpdmVkIERlYXV0aCBmcmFtZSAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIEludmFsaWQgcmVhc29uQ29kZSBpbiByZWNlaXZlZCBEZWF1dGggZnJhbWUgKi8KKwkJCS8qIExvZyBlcnJvciBhbmQgaWdub3JlIHRoZSBmcmFtZSAqLworCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIHdpdGggaW52YWxpZCByZWFzb25Db2RlICVkIGZyb20gIgorCQkJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSKSwgcmVhc29uQ29kZSwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCSAgICAgICApCisKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogUmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGluIGVpdGhlciBJQlNTICovCisJCS8qIG9yIHVuLWtub3duIHJvbGUuIExvZyBhbmQgaWdub3JlIGl0ICovCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkoInJlY2VpdmVkIERlYXV0aCBmcmFtZSB3aXRoIHJlYXNvbkNvZGUgJWQgaW4gcm9sZSAlZCBmcm9tICIKKwkJCU1BQ19BRERSRVNTX1NUUiksIHJlYXNvbkNvZGUsCisJCQlHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpLAorCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKworCQlyZXR1cm47CisJfQorCisJLyoqIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIFJlQXNzb2MsIGEgZmV3IHRoaW5ncyBjb3VsZCBoYXBwZW46CisJICogIC0gU1RBIGlzIHJlYXNzb2NpYXRpbmcgdG8gY3VycmVudCBBUCwgYW5kIHJlY2VpdmVzIGRlYXV0aCBmcm9tOgorCSAqICAgICAgICAgYSkgY3VycmVudCBBUAorCSAqICAgICAgICAgYikgb3RoZXIgQVAKKwkgKiAgLSBTVEEgaXMgcmVhc3NvY2lhdGluZyB0byBhIG5ldyBBUCwgYW5kIHJlY2VpdmVzIGRlYXV0aCBmcm9tOgorCSAqICAgICAgICAgYykgY3VycmVudCBBUAorCSAqICAgICAgICAgZCkgcmVhc3NvYyBBUAorCSAqICAgICAgICAgZSkgb3RoZXIgQVAKKwkgKgorCSAqICBUaGUgbG9naWMgaXM6CisJICogIDEpIElmIHJjdiBkZWF1dGggZnJvbSBhbiBBUCBvdGhlciB0aGFuIHRoZSBvbmUgd2UncmUgdHJ5aW5nIHRvCisJICogICAgIHJlYXNzb2NpYXRlIHdpdGgsIHRoZW4gZHJvcCB0aGUgZGVhdXRoIGZyYW1lIChjYXNlIGIsIGMsIGUpCisJICogIDIpIElmIHJjdiBkZWF1dGggZnJvbSB0aGUgIm5ldyIgcmVhc3NvYyBBUCAoY2FzZSBkKSwgdGhlbiByZXN0b3JlCisJICogICAgIGNvbnRleHQgd2l0aCBwcmV2aW91cyBBUCBhbmQgc2VuZCBTTUVfUkVBU1NPQ19SU1AgZmFpbHVyZS4KKwkgKiAgMykgSWYgcmN2IGRlYXV0aCBmcm9tIHRoZSByZWFzc29jIEFQLCB3aGljaCBpcyBhbHNvIHRoZSBzYW1lCisJICogICAgIEFQIHdlJ3JlIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggKGNhc2UgYSksIHRoZW4gcHJvY2VlZAorCSAqICAgICB3aXRoIG5vcm1hbCBkZWF1dGggcHJvY2Vzc2luZy4KKwkgKi8KKwlpZiAocHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkICE9IE5VTEwpIHsKKwkJcFJvYW1TZXNzaW9uRW50cnkgPQorCQkJcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCwKKwkJCQkJCSAmcm9hbVNlc3Npb25JZCk7CisJfQorCWlmIChsaW1faXNfcmVhc3NvY19pbl9wcm9ncmVzcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KQorCSAgICB8fCBsaW1faXNfcmVhc3NvY19pbl9wcm9ncmVzcyhwTWFjLCBwUm9hbVNlc3Npb25FbnRyeSkpIHsKKwkJaWYgKCFJU19SRUFTU09DX0JTU0lEKHBNYWMsIHBIZHItPnNhLCBwc2Vzc2lvbkVudHJ5KSkgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJSY3YgRGVhdXRoIGZyb20gdW5rbm93bi9kaWZmZXJlbnQgIgorCQkJCQkgICJBUCB3aGlsZSBSZUFzc29jLiBJZ25vcmUgIiBNQUNfQUREUkVTU19TVFIpLAorCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJICAgICAgICkKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiIGxpbVJlQXNzb2Nic3NJZCA6ICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocHNlc3Npb25FbnRyeS0+CisJCQkJCQkgICAgICBsaW1SZUFzc29jYnNzSWQpKTsKKwkJCSAgICAgICApCisJCQlyZXR1cm47CisJCX0KKworCQkvKiogUmVjZWl2ZWQgZGVhdXRoIGZyb20gdGhlIG5ldyBBUCB0byB3aGljaCB3ZSB0cmllZCB0byBSZUFzc29jaWF0ZS4KKwkJICogIERyb3AgUmVBc3NvYyBhbmQgUmVzdG9yZSB0aGUgUHJldmlvdXMgY29udGV4dCggY3VycmVudCBjb25uZWN0ZWQgQVApLgorCQkgKi8KKwkJaWYgKCFJU19DVVJSRU5UX0JTU0lEKHBNYWMsIHBIZHItPnNhLCBwc2Vzc2lvbkVudHJ5KSkgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJyZWNlaXZlZCBEZUF1dGggZnJvbSB0aGUgTmV3IEFQIHRvICIKKwkJCQkJICAid2hpY2ggUmVBc3NvYyBpcyBzZW50ICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCSAgICAgICApCisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoIiBwc2Vzc2lvbkVudHJ5LT5ic3NJZDogIgorCQkJCQkgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBzZXNzaW9uRW50cnktPmJzc0lkKSk7CisJCQkgICAgICAgKQorCQkJbGltX3Jlc3RvcmVfcHJlX3JlYXNzb2Nfc3RhdGUocE1hYywKKwkJCQkJCSAgICAgIGVTSVJfU01FX1JFQVNTT0NfUkVGVVNFRCwKKwkJCQkJCSAgICAgIHJlYXNvbkNvZGUsCisJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIElmIHJlY2VpdmVkIERlQXV0aCBmcm9tIEFQIG90aGVyIHRoYW4gdGhlIG9uZSB3ZSdyZSB0cnlpbmcgdG8gam9pbiB3aXRoCisJICogbm9yIGFzc29jaWF0ZWQgd2l0aCwgdGhlbiBpZ25vcmUgZGVhdXRoIGFuZCBkZWxldGUgUHJlLWF1dGggZW50cnkuCisJICovCisJaWYgKCFMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQlpZiAoIUlTX0NVUlJFTlRfQlNTSUQocE1hYywgcEhkci0+YnNzSWQsIHBzZXNzaW9uRW50cnkpKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoInJlY2VpdmVkIERlQXV0aCBmcm9tIGFuIEFQIG90aGVyICIKKwkJCQkJICAidGhhbiB3ZSdyZSB0cnlpbmcgdG8gam9pbi4gSWdub3JlLiAiCisJCQkJCSAgTUFDX0FERFJFU1NfU1RSKSwgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCSAgICAgICApCisJCQlpZiAobGltX3NlYXJjaF9wcmVfYXV0aF9saXN0KHBNYWMsIHBIZHItPnNhKSkgeworCQkJCVBFTE9HMShsaW1fbG9nCisJCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkJICAgICAgIEZMKCJQcmVhdXRoIGVudHJ5IGV4aXN0LiAiCisJCQkJCQkgICJEZWxldGluZy4uLiAiKSk7CisJCQkJICAgICAgICkKKwkJCQlsaW1fZGVsZXRlX3ByZV9hdXRoX25vZGUocE1hYywgcEhkci0+c2EpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJfQorCisJcFN0YURzID0KKwkJZHBoX2xvb2t1cF9oYXNoX2VudHJ5KHBNYWMsIHBIZHItPnNhLCAmYWlkLAorCQkJCSAgICAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworCS8qIENoZWNrIGZvciBwcmUtYXNzb2Mgc3RhdGVzICovCisJc3dpdGNoIChHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJY2FzZSBlTElNX1NUQV9ST0xFOgorCWNhc2UgZUxJTV9CVF9BTVBfU1RBX1JPTEU6CisJCXN3aXRjaCAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpIHsKKwkJY2FzZSBlTElNX01MTV9XVF9BVVRIX0ZSQU1FMl9TVEFURToKKwkJCS8qKgorCQkJICogQVAgc2VudCBEZWF1dGggZnJhbWUgd2hpbGUgd2FpdGluZworCQkJICogZm9yIEF1dGggZnJhbWUyLiBSZXBvcnQgQXV0aCBmYWlsdXJlCisJCQkgKiB0byBTTUUuCisJCQkgKi8KKworCQkJLyogTG9nIGVycm9yICovCisJCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJyZWNlaXZlZCBEZWF1dGggZnJhbWUgc3RhdGUgJVggd2l0aCBmYWlsdXJlICIKKwkJCQkJICAgICAgICJjb2RlICVkIGZyb20gIiBNQUNfQUREUkVTU19TVFIpLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSwgcmVhc29uQ29kZSwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCSAgICAgICApCisKKwkJCWxpbV9yZXN0b3JlX2Zyb21fYXV0aF9zdGF0ZShwTWFjLAorCQkJCQkJICAgIGVTSVJfU01FX0RFQVVUSF9XSElMRV9KT0lOLAorCQkJCQkJICAgIHJlYXNvbkNvZGUsIHBzZXNzaW9uRW50cnkpOworCisJCQlyZXR1cm47CisKKwkJY2FzZSBlTElNX01MTV9BVVRIRU5USUNBVEVEX1NUQVRFOgorCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMKCJyZWNlaXZlZCBEZWF1dGggZnJhbWUgc3RhdGUgJVggd2l0aCAiCisJCQkJICAgInJlYXNvbkNvZGU9JWQgZnJvbSAiIE1BQ19BRERSRVNTX1NUUiksCisJCQkJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIHJlYXNvbkNvZGUsCisJCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCS8qIC8gSXNzdWUgRGVhdXRoIEluZGljYXRpb24gdG8gU01FLiAqLworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZtbG1EZWF1dGhJbmQucGVlck1hY0FkZHIsCisJCQkJICAgICBwSGRyLT5zYSwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCQltbG1EZWF1dGhJbmQucmVhc29uQ29kZSA9IHJlYXNvbkNvZGU7CisKKwkJCXBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKwkJCU1UUkFDRShtYWNfdHJhY2UKKwkJCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpKTsKKworCQkJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywKKwkJCQkJICAgICBMSU1fTUxNX0RFQVVUSF9JTkQsCisJCQkJCSAgICAgKHVpbnQzMl90ICopICZtbG1EZWF1dGhJbmQpOworCQkJcmV0dXJuOworCisJCWNhc2UgZUxJTV9NTE1fV1RfQVNTT0NfUlNQX1NUQVRFOgorCQkJLyoqCisJCQkgKiBBUCBtYXkgaGF2ZSAnYWdlZC1vdXQnIG91ciBQcmUtYXV0aAorCQkJICogY29udGV4dC4gRGVsZXRlIGxvY2FsIHByZS1hdXRoIGNvbnRleHQKKwkJCSAqIGlmIGFueSBhbmQgaXNzdWUgQVNTT0NfQ05GIHRvIFNNRS4KKwkJCSAqLworCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMKCJyZWNlaXZlZCBEZWF1dGggZnJhbWUgc3RhdGUgJVggd2l0aCAiCisJCQkJICAgInJlYXNvbkNvZGU9JWQgZnJvbSAiIE1BQ19BRERSRVNTX1NUUiksCisJCQkJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIHJlYXNvbkNvZGUsCisJCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCWlmIChsaW1fc2VhcmNoX3ByZV9hdXRoX2xpc3QocE1hYywgcEhkci0+c2EpKQorCQkJCWxpbV9kZWxldGVfcHJlX2F1dGhfbm9kZShwTWFjLCBwSGRyLT5zYSk7CisKKwkJCWlmIChwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSkgeworCQkJCWNkZl9tZW1fZnJlZShwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSk7CisJCQkJcHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEgPSBOVUxMOworCQkJfQorCisJCQltbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfREVBVVRIX1dISUxFX0pPSU47CisJCQltbG1Bc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IHJlYXNvbkNvZGU7CisKKwkJCS8qIFBFIHNlc3Npb24gSWQgKi8KKwkJCW1sbUFzc29jQ25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisJCQlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9CisJCQkJcHNlc3Npb25FbnRyeS0+bGltUHJldk1sbVN0YXRlOworCQkJTVRSQUNFKG1hY190cmFjZQorCQkJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisJCQkJICAgICAgIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkpOworCisJCQkvKiBEZWFjdGl2ZSBBc3NvY2lhdGlvbiByZXNwb25zZSB0aW1lb3V0ICovCisJCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKHBNYWMsCisJCQkJCQkJZUxJTV9BU1NPQ19GQUlMX1RJTUVSKTsKKworCQkJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywKKwkJCQkJICAgICBMSU1fTUxNX0FTU09DX0NORiwKKwkJCQkJICAgICAodWludDMyX3QgKikgJm1sbUFzc29jQ25mKTsKKworCQkJcmV0dXJuOworCisJCWNhc2UgZUxJTV9NTE1fV1RfQUREX1NUQV9SU1BfU1RBVEU6CisJCQlwc2Vzc2lvbkVudHJ5LT5mRGVhdXRoUmVjZWl2ZWQgPSB0cnVlOworCQkJUEVMT0dXKGxpbV9sb2cocE1hYywgTE9HVywKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgiUmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGluIHN0YXRlICVYIHdpdGggUmVhc29uICIKKwkJCQkJICAgICAgICJDb2RlICVkIGZyb20gUGVlciIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIHJlYXNvbkNvZGUsCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkgICAgICAgKQorCQkJcmV0dXJuOworCisJCWNhc2UgZUxJTV9NTE1fSURMRV9TVEFURToKKwkJY2FzZSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFOgorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJCQlpZiAoKE5VTEwgIT0gcFN0YURzKQorCQkJICAgICYmIChTVEFfRU5UUllfVERMU19QRUVSID09IHBTdGFEcy0+c3RhVHlwZSkpIHsKKwkJCQlQRUxPR0UobGltX2xvZworCQkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJCSAgICAgICBGTAorCQkJCQkJICAgICAgICgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGluIHN0YXRlICVYIHdpdGggIgorCQkJCQkJICAgICAgICJyZWFzb24gY29kZSAlZCBmcm9tIFRkbHMgcGVlciIKKwkJCQkJCSAgICAgICBNQUNfQUREUkVTU19TVFIpLAorCQkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIHJlYXNvbkNvZGUsCisJCQkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkJCSAgICAgICApCisJCQkJbGltX3NlbmRfc21lX3RkbHNfZGVsX3N0YV9pbmQocE1hYywgcFN0YURzLAorCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnksCisJCQkJCQkJICAgICAgcmVhc29uQ29kZSk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKworCQkJCS8qCisJCQkJICogRGVsZXRlIGFsbCB0aGUgVERMUyBwZWVycyBvbmx5IGlmIERlYXV0aAorCQkJCSAqIGlzIHJlY2VpdmVkIGZyb20gdGhlIEFQCisJCQkJICovCisJCQkJaWYgKElTX0NVUlJFTlRfQlNTSUQocE1hYywgcEhkci0+c2EsIHBzZXNzaW9uRW50cnkpKQorCQkJCQlsaW1fZGVsZXRlX3RkbHNfcGVlcnMocE1hYywgcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKwkJCS8qKgorCQkJICogVGhpcyBjb3VsZCBiZSBEZWF1dGhlbnRpY2F0aW9uIGZyYW1lIGZyb20KKwkJCSAqIGEgQlNTIHdpdGggd2hpY2ggcHJlLWF1dGhlbnRpY2F0aW9uIHdhcworCQkJICogcGVyZm9ybWVkLiBEZWxldGUgUHJlLWF1dGggZW50cnkgaWYgZm91bmQuCisJCQkgKi8KKwkJCWlmIChsaW1fc2VhcmNoX3ByZV9hdXRoX2xpc3QocE1hYywgcEhkci0+c2EpKQorCQkJCWxpbV9kZWxldGVfcHJlX2F1dGhfbm9kZShwTWFjLCBwSGRyLT5zYSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwkJfQorI2VuZGlmCisJCQlicmVhazsKKworCQljYXNlIGVMSU1fTUxNX1dUX1JFQVNTT0NfUlNQX1NUQVRFOgorCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJyZWNlaXZlZCBEZWF1dGggZnJhbWUgc3RhdGUgJVggd2l0aCAiCisJCQkJICAgInJlYXNvbkNvZGU9JWQgZnJvbSAiIE1BQ19BRERSRVNTX1NUUiksCisJCQkJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIHJlYXNvbkNvZGUsCisJCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgZUxJTV9NTE1fV1RfRlRfUkVBU1NPQ19SU1BfU1RBVEU6CisJCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJyZWNlaXZlZCBEZWF1dGggZnJhbWUgaW4gRlQgc3RhdGUgJVggd2l0aCAiCisJCQkJCSAgICAgICAicmVhc29uQ29kZT0lZCBmcm9tICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIHJlYXNvbkNvZGUsCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoInJlY2VpdmVkIERlYXV0aCBmcmFtZSBpbiBzdGF0ZSAlWCB3aXRoICIKKwkJCQkJICAgICAgICJyZWFzb25Db2RlPSVkIGZyb20gIiBNQUNfQUREUkVTU19TVFIpLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSwgcmVhc29uQ29kZSwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCSAgICAgICApCisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGVMSU1fU1RBX0lOX0lCU1NfUk9MRToKKwkJYnJlYWs7CisKKwljYXNlIGVMSU1fQVBfUk9MRToKKwkJYnJlYWs7CisKKwlkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiBlTElNX0FQX1JPTEUgb3IgZUxJTV9CVF9BTVBfQVBfUk9MRSAqLworCisJCXJldHVybjsKKwl9IC8qIGVuZCBzd2l0Y2ggKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSkgKi8KKworCS8qKgorCSAqIEV4dHJhY3QgJ2Fzc29jaWF0ZWQnIGNvbnRleHQgZm9yIFNUQSwgaWYgYW55LgorCSAqIFRoaXMgaXMgbWFpbnRhaW5lZCBieSBEUEggYW5kIGNyZWF0ZWQgYnkgTElNLgorCSAqLworCWlmIChOVUxMID09IHBTdGFEcykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJwU3RhRHMgaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID09IGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFKSB8fAorCSAgICAocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID09IGVMSU1fTUxNX1dUX0RFTF9CU1NfUlNQX1NUQVRFKSkgeworCQkvKioKKwkJICogQWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiBkZWxldGluZyBjb250ZXh0IGZvciB0aGUgcGVlcgorCQkgKiBhbmQgcmVjZWl2ZWQgRGVhdXRoZW50aWNhdGlvbiBmcmFtZS4gTG9nIGFuZCBJZ25vcmUuCisJCSAqLworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGZyb20gcGVlciB0aGF0IGlzIGluIHN0YXRlICVYLCBhZGRyICIKKwkJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSKSwgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlLAorCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCSAgICAgICApCisJCXJldHVybjsKKwl9CisJcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uID0gKHRTaXJNYWNSZWFzb25Db2RlcykgcmVhc29uQ29kZTsKKwlwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIgPSBlTElNX1BFRVJfRU5USVRZX0RFQVVUSDsKKworCS8qIC8gSXNzdWUgRGVhdXRoIEluZGljYXRpb24gdG8gU01FLiAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWxtRGVhdXRoSW5kLnBlZXJNYWNBZGRyLAorCQkgICAgIHBTdGFEcy0+c3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJbWxtRGVhdXRoSW5kLnJlYXNvbkNvZGUgPQorCQkodWludDhfdCkgcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uOworCW1sbURlYXV0aEluZC5kZWF1dGhUcmlnZ2VyID0gZUxJTV9QRUVSX0VOVElUWV9ERUFVVEg7CisKKwkvKgorCSAqIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgUmVBc3NvYyBhbmQgcmVjZWl2ZWQgZGVhdXRoIGZyb20KKwkgKiB0aGUgUmVBc3NvYyBBUCwgdGhlbiBub3RpZnkgU01FIGJ5IHNlbmRpbmcgUkVBU1NPQ19SU1Agd2l0aAorCSAqIGZhaWx1cmUgcmVzdWx0IGNvZGUuIFNNRSB3aWxsIHBvc3QgdGhlIGRpc2Nvbm5lY3QgdG8gdGhlCisJICogc3VwcGxpY2FudCBhbmQgdGhlIGxhdHRlciB3b3VsZCBzdGFydCBhIGZyZXNoIGFzc29jLgorCSAqLworCWlmIChsaW1faXNfcmVhc3NvY19pbl9wcm9ncmVzcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KSkgeworCQkvKioKKwkJICogQVAgbWF5IGhhdmUgJ2FnZWQtb3V0JyBvdXIgUHJlLWF1dGgKKwkJICogY29udGV4dC4gRGVsZXRlIGxvY2FsIHByZS1hdXRoIGNvbnRleHQKKwkJICogaWYgYW55IGFuZCBpc3N1ZSBSRUFTU09DX0NORiB0byBTTUUuCisJCSAqLworCQlpZiAobGltX3NlYXJjaF9wcmVfYXV0aF9saXN0KHBNYWMsIHBIZHItPnNhKSkKKwkJCWxpbV9kZWxldGVfcHJlX2F1dGhfbm9kZShwTWFjLCBwSGRyLT5zYSk7CisKKwkJaWYgKHBzZXNzaW9uRW50cnktPmxpbUFzc29jUmVzcG9uc2VEYXRhKSB7CisJCQljZGZfbWVtX2ZyZWUocHNlc3Npb25FbnRyeS0+bGltQXNzb2NSZXNwb25zZURhdGEpOworCQkJcHNlc3Npb25FbnRyeS0+bGltQXNzb2NSZXNwb25zZURhdGEgPSBOVUxMOworCQl9CisKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIlJjdiBEZWF1dGggZnJvbSBSZUFzc29jIEFQLiAiCisJCQkJCSAgICAgICJJc3N1ZSBSRUFTU09DX0NORi4gIikpOworCQkgICAgICAgKQorCQkvKgorCQkgKiBUT0RPOiBJbnN0ZWFkIG9mIG92ZXJsb2FkaW5nIGVTSVJfU01FX0ZUX1JFQVNTT0NfVElNRU9VVF9GQUlMVVJFCisJCSAqIGl0IHdvdWxkIGhhdmUgYmVlbiBnb29kIHRvIGRlZmluZS91c2UgYSBkaWZmZXJlbnQgZmFpbHVyZSB0eXBlLgorCQkgKiBVc2luZyBlU0lSX1NNRV9GVF9SRUFTU09DX0ZBSUxVUkUgZG9lcyBub3Qgc2VlbSB0byBjbGVhbi11cAorCQkgKiBwcm9wZXJseSBhbmQgd2UgZW5kIHVwIHNlZWluZyAidHJhbnNtaXQgcXVldWUgdGltZW91dCIuCisJCSAqLworCQlsaW1fcG9zdF9yZWFzc29jX2ZhaWx1cmUocE1hYywKKwkJCQkJIGVTSVJfU01FX0ZUX1JFQVNTT0NfVElNRU9VVF9GQUlMVVJFLAorCQkJCQkgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLAorCQkJCQkgcHNlc3Npb25FbnRyeSk7CisJCXJldHVybjsKKwl9CisJLyogcmVzZXQgdGhlIGRlYXV0aE1zZ0NudCBoZXJlIHNpbmNlIHdlIGFyZSBhYmxlIHRvIFByb2Nlc3MKKwkqIHRoZSBkZWF1dGggZnJhbWUgYW5kIHNlbmRpbmcgdXAgdGhlIGluZGljYXRpb24gYXMgd2VsbCAqLworCWlmIChwTWFjLT5saW0uZGVhdXRoTXNnQ250ICE9IDApIHsKKwkJcE1hYy0+bGltLmRlYXV0aE1zZ0NudCA9IDA7CisJfQorCWlmIChMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpCisJCXdtYV90eF9hYm9ydChwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQpOworCisJLyogLyBEZWF1dGhlbnRpY2F0aW9uIGZyb20gcGVlciBNQUMgZW50aXR5ICovCisJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywgTElNX01MTV9ERUFVVEhfSU5ELAorCQkJICAgICAodWludDMyX3QgKikgJm1sbURlYXV0aEluZCk7CisKKwkvKiBzZW5kIGVXTklfU01FX0RFQVVUSF9JTkQgdG8gU01FICovCisJbGltX3NlbmRfc21lX2RlYXV0aF9pbmQocE1hYywgcFN0YURzLCBwc2Vzc2lvbkVudHJ5KTsKKwlyZXR1cm47CisKK30gLyoqKiBlbmQgbGltX3Byb2Nlc3NfZGVhdXRoX2ZyYW1lKCkgKioqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19kaXNhc3NvY19mcmFtZS5jIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19kaXNhc3NvY19mcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTFjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX2Rpc2Fzc29jX2ZyYW1lLmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV9wcm9jZXNzX2Rpc2Fzc29jX2ZyYW1lLmNjIGNvbnRhaW5zIHRoZSBjb2RlCisgKiBmb3IgcHJvY2Vzc2luZyBEaXNhc3NvY2F0aW9uIEZyYW1lLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDMvMjQvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisKKyNpbmNsdWRlICJ1dGlsc19hcGkuaCIKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fYXNzb2NfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VjdXJpdHlfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VyX2Rlc191dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZW5kX21lc3NhZ2VzLmgiCisjaW5jbHVkZSAic2NoX2FwaS5oIgorCisvKioKKyAqIGxpbV9wcm9jZXNzX2Rpc2Fzc29jX2ZyYW1lCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpIHVwb24KKyAqIERpc2Fzc29jaWF0aW9uIGZyYW1lIHJlY2VwdGlvbi4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogRFBIIGRyb3BzIHBhY2tldHMgZm9yIFNUQSB3aXRoICd2YWxpZCcgYml0IGluIHBTdGFEcyBzZXQgdG8gJzAnLgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBSeFBhY2tldEluZm8gLSBBIHBvaW50ZXIgdG8gUnggcGFja2V0IGluZm8gc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltX3Byb2Nlc3NfZGlzYXNzb2NfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcFJ4UGFja2V0SW5mbywKKwkJCSAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDhfdCAqcEJvZHk7CisJdWludDE2X3QgYWlkLCByZWFzb25Db2RlOworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXRwRHBoSGFzaE5vZGUgcFN0YURzOworCXRMaW1NbG1EaXNhc3NvY0luZCBtbG1EaXNhc3NvY0luZDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJdWludDMyX3QgZnJhbWVMZW47CisjZW5kaWYKKworCXBIZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisJcEJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKworCWlmIChsaW1faXNfZ3JvdXBfYWRkcihwSGRyLT5zYSkpIHsKKwkJLyogUmVjZWl2ZWQgRGlzYXNzb2MgZnJhbWUgZnJvbSBhIEJDL01DIGFkZHJlc3MgKi8KKwkJLyogTG9nIGVycm9yIGFuZCBpZ25vcmUgaXQgKi8KKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTAorCQkJCSAgICAgICAoInJlY2VpdmVkIERpc2Fzc29jIGZyYW1lIGZyb20gYSBCQy9NQyBhZGRyZXNzIikpOworCQkgICAgICAgKQorCisJCXJldHVybjsKKwl9CisKKwlpZiAobGltX2lzX2dyb3VwX2FkZHIocEhkci0+ZGEpICYmICFsaW1faXNfYWRkcl9iYyhwSGRyLT5kYSkpIHsKKwkJLyogUmVjZWl2ZWQgRGlzYXNzb2MgZnJhbWUgZm9yIGEgTUMgYWRkcmVzcyAqLworCQkvKiBMb2cgZXJyb3IgYW5kIGlnbm9yZSBpdCAqLworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJyZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSBmb3IgYSBNQyBhZGRyZXNzIikpOworCQkgICAgICAgKQorCisJCXJldHVybjsKKwl9CisJaWYgKCFsaW1fdmFsaWRhdGVfcmVjZWl2ZWRfZnJhbWVfYTFfYWRkcihwTWFjLAorCQkJcEhkci0+ZGEsIHBzZXNzaW9uRW50cnkpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJyeCBmcmFtZSBkb2Vzbid0IGhhdmUgdmFsaWQgYTEgYWRkcmVzcywgZHJvcCBpdCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkgJiYKKwkJKGVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFID09IHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSkgeworCQlpZiAocEhkci0+ZmMucmV0cnkgPiAwKSB7CisJCQkvKgorCQkJICogVGhpcyBjYW4gaGFwcGVuIHdoZW4gZmlyc3QgZGlzYXNzb2MgZnJhbWUgaXMgcmVjZWl2ZWQKKwkJCSAqIGJ1dCBBQ0sgZnJvbSB0aGlzIFNUQSBpcyBsb3N0LCBpbiB0aGlzIGNhc2UgMm5kCisJCQkgKiBkaXNhc3NvYyBmcmFtZSBpcyBhbHJlYWR5IGluIHRyYW5zbWlzc2lvbiBxdWV1ZQorCQkJICovCisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIkFQIGlzIHNlbmRpbmcgZGlzYXNzb2MgYWZ0ZXIgQUNLIGxvc3QuLi4iKSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCS8qIFBNRjogSWYgdGhpcyBzZXNzaW9uIGlzIGEgUE1GIHNlc3Npb24sIHRoZW4gZW5zdXJlIHRoYXQgdGhpcyBmcmFtZSB3YXMgcHJvdGVjdGVkICovCisJaWYgKHBzZXNzaW9uRW50cnktPmxpbVJtZkVuYWJsZWQKKwkgICAgJiYgKFdNQV9HRVRfUlhfRFBVX0ZFRURCQUNLKHBSeFBhY2tldEluZm8pICYKKwkJRFBVX0ZFRURCQUNLX1VOUFJPVEVDVEVEX0VSUk9SKSkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJyZWNlaXZlZCBhbiB1bnByb3RlY3RlZCBkaXNhc3NvYyBmcm9tIEFQIikpOworCQkgICAgICAgKQorCQkvKiBJZiB0aGUgZnJhbWUgcmVjZWl2ZWQgaXMgdW5wcm90ZWN0ZWQsIGZvcndhcmQgaXQgdG8gdGhlIHN1cHBsaWNhbnQgdG8gaW5pdGlhdGUgKi8KKwkJLyogYW4gU0EgcXVlcnkgKi8KKwkJZnJhbWVMZW4gPSBXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pOworCQkvKiBzZW5kIHRoZSB1bnByb3RlY3RlZCBmcmFtZSBpbmRpY2F0aW9uIHRvIFNNRSAqLworCQlsaW1fc2VuZF9zbWVfdW5wcm90ZWN0ZWRfbWdtdF9mcmFtZV9pbmQocE1hYywgcEhkci0+ZmMuc3ViVHlwZSwKKwkJCQkJCQkodWludDhfdCAqKSBwSGRyLAorCQkJCQkJCShmcmFtZUxlbiArCisJCQkJCQkJIHNpemVvZih0U2lyTWFjTWdtdEhkcikpLAorCQkJCQkJCXBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwKKwkJCQkJCQlwc2Vzc2lvbkVudHJ5KTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJLyogR2V0IHJlYXNvbkNvZGUgZnJvbSBEaXNhc3NvY2lhdGlvbiBmcmFtZSBib2R5ICovCisJcmVhc29uQ29kZSA9IHNpcl9yZWFkX3UxNihwQm9keSk7CisKKwlQRUxPRzIobGltX2xvZyhwTWFjLCBMT0dFLAorCQkgICAgICAgRkwoIlJlY2VpdmVkIERpc2Fzc29jIGZyYW1lIGZvciBBZGRyOiAiIE1BQ19BRERSRVNTX1NUUgorCQkJICAiKG1sbSBzdGF0ZT0lcywgc21lIHN0YXRlPSVkKSwiCisJCQkgICJ3aXRoIHJlYXNvbiBjb2RlICVkIFslc10gZnJvbSAiIE1BQ19BRERSRVNTX1NUUiksCisJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5kYSksCisJCSAgICAgICBsaW1fbWxtX3N0YXRlX3N0cihwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSksCisJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSwgcmVhc29uQ29kZSwKKwkJICAgICAgIGxpbV9kb3QxMV9yZWFzb25fc3RyKHJlYXNvbkNvZGUpLCBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCSAgICAgICApCisKKwkvKioKKwkgKiBFeHRyYWN0ICdhc3NvY2lhdGVkJyBjb250ZXh0IGZvciBTVEEsIGlmIGFueS4KKwkgKiBUaGlzIGlzIG1haW50YWluZWQgYnkgRFBIIGFuZCBjcmVhdGVkIGJ5IExJTS4KKwkgKi8KKwlwU3RhRHMgPQorCQlkcGhfbG9va3VwX2hhc2hfZW50cnkocE1hYywgcEhkci0+c2EsICZhaWQsCisJCQkJICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisJaWYgKHBTdGFEcyA9PSBOVUxMKSB7CisJCS8qKgorCQkgKiBEaXNhc3NvY2lhdGluZyBTVEEgaXMgbm90IGFzc29jaWF0ZWQuCisJCSAqIExvZyBlcnJvci4KKwkJICovCisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJyZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSBmcm9tIFNUQSB0aGF0IGRvZXMgbm90IGhhdmUgY29udGV4dCAiCisJCQkJICAgICAgICJyZWFzb25Db2RlPSVkLCBhZGRyICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCSAgICAgICByZWFzb25Db2RlLCBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkgICAgICAgKQorCisJCXJldHVybjsKKwl9CisKKwlpZiAobGltX2NoZWNrX2Rpc2Fzc29jX2RlYXV0aF9hY2tfcGVuZGluZyhwTWFjLCAodWludDhfdCAqKSBwSGRyLT5zYSkpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTCgiSWdub3JlIHRoZSBEaXNBc3NvYyByZWNlaXZlZCwgd2hpbGUgd2FpdGluZyAiCisJCQkJICAiZm9yIGFjayBvZiBkaXNhc3NvYy9kZWF1dGgiKSk7CisJCSAgICAgICApCisJCWxpbV9jbGVhbl91cF9kaXNhc3NvY19kZWF1dGhfcmVxKHBNYWMsICh1aW50OF90ICopIHBIZHItPnNhLCAxKTsKKwkJcmV0dXJuOworCX0KKworCS8qKiBJZiB3ZSBhcmUgaW4gdGhlIFdhaXQgZm9yIFJlQXNzb2MgUnNwIHN0YXRlICovCisJaWYgKGxpbV9pc19yZWFzc29jX2luX3Byb2dyZXNzKHBNYWMsIHBzZXNzaW9uRW50cnkpKSB7CisJCS8qKiBJZiB3ZSBoYWQgcmVjZWl2ZWQgdGhlIERpc0Fzc29jIGZyb20sCisJCSAqICAgICBhLiB0aGUgQ3VycmVudCBBUCBkdXJpbmcgUmVBc3NvY2lhdGUgdG8gZGlmZmVyZW50IEFQIGluIHNhbWUgRVNTCisJCSAqICAgICBiLiBVbmtub3duIEFQCisJCSAqICAgZHJvcC9pZ25vcmUgdGhlIERpc0Fzc29jIHJlY2VpdmVkCisJCSAqLworCQlpZiAoIUlTX1JFQVNTT0NfQlNTSUQocE1hYywgcEhkci0+c2EsIHBzZXNzaW9uRW50cnkpKSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoIklnbm9yZSB0aGUgRGlzQXNzb2MgcmVjZWl2ZWQsIHdoaWxlICIKKwkJCQkJICAiUHJvY2Vzc2luZyBSZUFzc29jIHdpdGggZGlmZmVyZW50L3Vua25vd24gQVAiKSk7CisJCQkgICAgICAgKQorCQkJcmV0dXJuOworCQl9CisJCS8qKiBJZiB0aGUgRGlzYXNzb2MgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgbmV3IEFQIHRvIHdoaWNoIHdlIHRyaWVkIHRvIFJlQXNzb2NpYXRlCisJCSAqICBEcm9wIFJlQXNzb2MgYW5kIFJlc3RvcmUgdGhlIFByZXZpb3VzIGNvbnRleHQoIGN1cnJlbnQgY29ubmVjdGVkIEFQKS4KKwkJICovCisJCWlmICghSVNfQ1VSUkVOVF9CU1NJRChwTWFjLCBwSGRyLT5zYSwgcHNlc3Npb25FbnRyeSkpIHsKKwkJCVBFTE9HVyhsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJyZWNlaXZlZCBEaXNhc3NvYyBmcm9tIHRoZSBOZXcgQVAgdG8gd2hpY2ggUmVBc3NvYyBpcyBzZW50ICIpKTsKKwkJCSAgICAgICApCisJCQlsaW1fcmVzdG9yZV9wcmVfcmVhc3NvY19zdGF0ZShwTWFjLAorCQkJCQkJICAgICAgZVNJUl9TTUVfUkVBU1NPQ19SRUZVU0VELAorCQkJCQkJICAgICAgcmVhc29uQ29kZSwKKwkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpIHx8CisJICAgIExJTV9JU19CVF9BTVBfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQlzd2l0Y2ggKHJlYXNvbkNvZGUpIHsKKwkJY2FzZSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT046CisJCWNhc2UgZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFlfUkVBU09OOgorCQljYXNlIGVTSVJfTUFDX0RJU0FTU09DX0xFQVZJTkdfQlNTX1JFQVNPTjoKKwkJY2FzZSBlU0lSX01BQ19NSUNfRkFJTFVSRV9SRUFTT046CisJCWNhc2UgZVNJUl9NQUNfNFdBWV9IQU5EU0hBS0VfVElNRU9VVF9SRUFTT046CisJCWNhc2UgZVNJUl9NQUNfR1JfS0VZX1VQREFURV9USU1FT1VUX1JFQVNPTjoKKwkJY2FzZSBlU0lSX01BQ19SU05fSUVfTUlTTUFUQ0hfUkVBU09OOgorCQljYXNlIGVTSVJfTUFDXzFYX0FVVEhfRkFJTFVSRV9SRUFTT046CisJCQkvKiBWYWxpZCByZWFzb25Db2RlIGluIHJlY2VpdmVkIERpc2Fzc29jaWF0aW9uIGZyYW1lICovCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogSW52YWxpZCByZWFzb25Db2RlIGluIHJlY2VpdmVkIERpc2Fzc29jaWF0aW9uIGZyYW1lICovCisJCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJyZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSB3aXRoIGludmFsaWQgcmVhc29uQ29kZSAiCisJCQkJCSAgICAgICAiJWQgZnJvbSAiIE1BQ19BRERSRVNTX1NUUiksIHJlYXNvbkNvZGUsCisJCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKChMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkJICAgTElNX0lTX0JUX0FNUF9TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgJiYKKwkJICAgKChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9XVF9KT0lOX1NUQVRFKSAmJgorCQkgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfQVVUSF9TVEFURSkgJiYKKwkJICAgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX1dUX0FTU09DX1NUQVRFKSAmJgorCQkgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURSkpKSB7CisJCXN3aXRjaCAocmVhc29uQ29kZSkgeworCQljYXNlIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTjoKKwkJY2FzZSBlU0lSX01BQ19ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWV9SRUFTT046CisJCWNhc2UgZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0RJU0FCSUxJVFlfUkVBU09OOgorCQljYXNlIGVTSVJfTUFDX0NMQVNTMl9GUkFNRV9GUk9NX05PTl9BVVRIX1NUQV9SRUFTT046CisJCWNhc2UgZVNJUl9NQUNfQ0xBU1MzX0ZSQU1FX0ZST01fTk9OX0FTU09DX1NUQV9SRUFTT046CisJCWNhc2UgZVNJUl9NQUNfTUlDX0ZBSUxVUkVfUkVBU09OOgorCQljYXNlIGVTSVJfTUFDXzRXQVlfSEFORFNIQUtFX1RJTUVPVVRfUkVBU09OOgorCQljYXNlIGVTSVJfTUFDX0dSX0tFWV9VUERBVEVfVElNRU9VVF9SRUFTT046CisJCWNhc2UgZVNJUl9NQUNfUlNOX0lFX01JU01BVENIX1JFQVNPTjoKKwkJY2FzZSBlU0lSX01BQ18xWF9BVVRIX0ZBSUxVUkVfUkVBU09OOgorCQljYXNlIGVTSVJfTUFDX1BSRVZfQVVUSF9OT1RfVkFMSURfUkVBU09OOgorCQkJLyogVmFsaWQgcmVhc29uQ29kZSBpbiByZWNlaXZlZCBEaXNhc3NvY2lhdGlvbiBmcmFtZSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBlU0lSX01BQ19ERUFVVEhfTEVBVklOR19CU1NfUkVBU09OOgorCQljYXNlIGVTSVJfTUFDX0RJU0FTU09DX0xFQVZJTkdfQlNTX1JFQVNPTjoKKwkJCS8qIFZhbGlkIHJlYXNvbkNvZGUgaW4gcmVjZWl2ZWQgRGlzYXNzb2NpYXRpb24gZnJhbWUgKi8KKwkJCS8qIGFzIGxvbmcgYXMgd2UncmUgbm90IGFib3V0IHRvIGNoYW5uZWwgc3dpdGNoICovCisJCQlpZiAocHNlc3Npb25FbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUgIT0KKwkJCSAgICBlTElNX0NIQU5ORUxfU1dJVENIX0lETEUpIHsKKwkJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMCisJCQkJCQkoIklnbm9yaW5nIGRpc2Fzc29jIGZyYW1lIGR1ZSB0byB1cGNvbWluZyAiCisJCQkJCQkiY2hhbm5lbCBzd2l0Y2gsIGZyb20gIgorCQkJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogSW52YWxpZCByZWFzb25Db2RlIGluIHJlY2VpdmVkIERpc2Fzc29jaWF0aW9uIGZyYW1lICovCisJCQkvKiBMb2cgZXJyb3IgYW5kIGlnbm9yZSB0aGUgZnJhbWUgKi8KKwkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoInJlY2VpdmVkIERpc2Fzc29jIGZyYW1lIHdpdGggaW52YWxpZCByZWFzb25Db2RlICIKKwkJCQkJICAgICAgICIlZCBmcm9tICIgTUFDX0FERFJFU1NfU1RSKSwgcmVhc29uQ29kZSwKKwkJCQkgICAgICAgTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKwkJCSAgICAgICApCisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQkvKiBSZWNlaXZlZCBEaXNhc3NvY2lhdGlvbiBmcmFtZSBpbiBlaXRoZXIgSUJTUyAqLworCQkvKiBvciB1bi1rbm93biByb2xlLiBMb2cgYW5kIGlnbm9yZSBpdCAqLworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkJCSgicmVjZWl2ZWQgRGlzYXNzb2MgZnJhbWUgd2l0aCBpbnZhbGlkIHJlYXNvbkNvZGUgJWQgaW4gcm9sZSAiCisJCQkJIiVkIGluIHNtZSBzdGF0ZSAlZCBmcm9tICIgTUFDX0FERFJFU1NfU1RSKSwgcmVhc29uQ29kZSwKKwkJCUdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSksIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlLAorCQkJTUFDX0FERFJfQVJSQVkocEhkci0+c2EpKTsKKworCQlyZXR1cm47CisJfQorCisJaWYgKChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEUpIHx8CisJICAgIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfREVMX0JTU19SU1BfU1RBVEUpKSB7CisJCS8qKgorCQkgKiBBbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGRlbGV0aW5nIGNvbnRleHQgZm9yIHRoZSBwZWVyCisJCSAqIGFuZCByZWNlaXZlZCBEaXNhc3NvY2lhdGlvbiBmcmFtZS4gTG9nIGFuZCBJZ25vcmUuCisJCSAqLworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJyZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSBpbiBzdGF0ZSAlZCBmcm9tICIKKwkJCQkgIE1BQ19BRERSRVNTX1NUUiksCisJCQkgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlLAorCQkJICAgICAgIE1BQ19BRERSX0FSUkFZKHBIZHItPnNhKSk7CisJCSAgICAgICApCisKKwkJcmV0dXJuOworCX0KKworCWlmIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkgeworCQkvKioKKwkJICogUmVxdWVzdGluZyBTVEEgaXMgaW4gc29tZSAndHJhbnNpZW50JyBzdGF0ZT8KKwkJICogTG9nIGVycm9yLgorCQkgKi8KKwkJaWYgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9PQorCQkgICAgZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFKQorCQkJcFN0YURzLT5tbG1TdGFDb250ZXh0LnVwZGF0ZUNvbnRleHQgPSAxOworCisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJyZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSBmcm9tIHBlZXIgdGhhdCBpcyBpbiBzdGF0ZSAlWCwgYWRkciAiCisJCQkJICAgICAgIE1BQ19BRERSRVNTX1NUUiksIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSwKKwkJCSAgICAgICBNQUNfQUREUl9BUlJBWShwSGRyLT5zYSkpOworCQkgICAgICAgKQorCisJfSAvKiBpZiAocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpICovCisKKwlwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIgPSBlTElNX1BFRVJfRU5USVRZX0RJU0FTU09DOworCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5kaXNhc3NvY1JlYXNvbiA9ICh0U2lyTWFjUmVhc29uQ29kZXMpIHJlYXNvbkNvZGU7CisKKwkvKiBJc3N1ZSBEaXNhc3NvYyBJbmRpY2F0aW9uIHRvIFNNRS4gKi8KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJm1sbURpc2Fzc29jSW5kLnBlZXJNYWNBZGRyLAorCQkgICAgICh1aW50OF90ICopIHBTdGFEcy0+c3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJbWxtRGlzYXNzb2NJbmQucmVhc29uQ29kZSA9CisJCSh1aW50OF90KSBwU3RhRHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb247CisJbWxtRGlzYXNzb2NJbmQuZGlzYXNzb2NUcmlnZ2VyID0gZUxJTV9QRUVSX0VOVElUWV9ESVNBU1NPQzsKKworCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICAqLworCW1sbURpc2Fzc29jSW5kLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisJaWYgKGxpbV9pc19yZWFzc29jX2luX3Byb2dyZXNzKHBNYWMsIHBzZXNzaW9uRW50cnkpKSB7CisKKwkJLyogSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBSZUFzc29jIGFuZCByZWNlaXZlZCBkaXNhc3NvYyBmcm9tCisJCSAqIHRoZSBSZUFzc29jIEFQLCB0aGVuIG5vdGlmeSBTTUUgYnkgc2VuZGluZyBSRUFTU09DX1JTUCB3aXRoCisJCSAqIGZhaWx1cmUgcmVzdWx0IGNvZGUuIEJ5IGRlc2lnbiwgU01FIHdpbGwgdGhlbiBpc3N1ZSAiRGlzYXNzb2MiCisJCSAqIGFuZCBjbGVhbnVwIHdpbGwgaGFwcGVuIGF0IHRoYXQgdGltZS4KKwkJICovCisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwoInJlY2VpdmVkIERpc2Fzc29jIGZyb20gQVAgd2hpbGUgd2FpdGluZyAiCisJCQkJICAiZm9yIFJlYXNzb2MgUnNwIikpOworCQkgICAgICAgKQorCisJCWlmIChwc2Vzc2lvbkVudHJ5LT5saW1Bc3NvY1Jlc3BvbnNlRGF0YSkgeworCQkJY2RmX21lbV9mcmVlKHBzZXNzaW9uRW50cnktPmxpbUFzc29jUmVzcG9uc2VEYXRhKTsKKwkJCXBzZXNzaW9uRW50cnktPmxpbUFzc29jUmVzcG9uc2VEYXRhID0gTlVMTDsKKwkJfQorCisJCWxpbV9yZXN0b3JlX3ByZV9yZWFzc29jX3N0YXRlKHBNYWMsIGVTSVJfU01FX1JFQVNTT0NfUkVGVVNFRCwKKwkJCQkJICAgICAgcmVhc29uQ29kZSwgcHNlc3Npb25FbnRyeSk7CisJCXJldHVybjsKKwl9CisKKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShwTWFjLCBMSU1fTUxNX0RJU0FTU09DX0lORCwKKwkJCSAgICAgKHVpbnQzMl90ICopICZtbG1EaXNhc3NvY0luZCk7CisKKwkvKiBzZW5kIGVXTklfU01FX0RJU0FTU09DX0lORCB0byBTTUUgKi8KKwlsaW1fc2VuZF9zbWVfZGlzYXNzb2NfaW5kKHBNYWMsIHBTdGFEcywgcHNlc3Npb25FbnRyeSk7CisKKwlyZXR1cm47Cit9IC8qKiogZW5kIGxpbV9wcm9jZXNzX2Rpc2Fzc29jX2ZyYW1lKCkgKioqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19tZXNzYWdlX3F1ZXVlLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX21lc3NhZ2VfcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWU3ZWQxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19tZXNzYWdlX3F1ZXVlLmMKQEAgLTAsMCArMSwyMDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGxpbSBQcm9jZXNzTWVzc2FnZVF1ZXVlLmNjIGNvbnRhaW5zIHRoZSBjb2RlCisgKiBmb3IgcHJvY2Vzc2luZyBMSU0gbWVzc2FnZSBRdWV1ZS4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzExLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAid25pX2FwaS5oIgorI2luY2x1ZGUgIndtYV90eXBlcy5oIgorCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJzaXJfY29tbW9uLmgiCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Byb3BfZXh0c191dGlscy5oIgorCisjaW5jbHVkZSAibGltX2FkbWl0X2NvbnRyb2wuaCIKKyNpbmNsdWRlICJsaW1faWJzc19wZWVyX21nbXQuaCIKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlICJsaW1fZnRfZGVmcy5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltX3Nlc3Npb24uaCIKKyNpbmNsdWRlICJsaW1fc2VuZF9tZXNzYWdlcy5oIgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisjaW5jbHVkZSAicnJtX2FwaS5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSAibGltX2Z0LmgiCisjZW5kaWYKKworI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgImNkc19wYWNrZXQuaCIKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisKK3ZvaWQgbGltX2xvZ19zZXNzaW9uX3N0YXRlcyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX25vcm1hbF9oZGRfbXNnKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJc3RydWN0IHNTaXJNc2dRICptc2csIHVpbnQ4X3QgcnNwX3JlcWQpOworCisvKioKKyAqIGxpbV9wcm9jZXNzX2R1YWxfbWFjX2NmZ19yZXNwKCkgLSBQcm9jZXNzIHNldCBkdWFsIG1hYyBjb25maWcgcmVzcG9uc2UKKyAqIEBtYWM6IEdsb2JhbCBNQUMgcG9pbnRlcgorICogQGJvZHk6IFNldCBkdWFsIG1hYyBjb25maWcgcmVzcG9uc2UgaW4gc2lyX2R1YWxfbWFjX2NvbmZpZ19yZXNwIGZvcm1hdAorICoKKyAqIFByb2Nlc3MgdGhlIHNldCBkdWFsIG1hYyBjb25maWcgcmVzcG9uc2UgYW5kIHBvc3QgdGhlIG1lc3NhZ2UKKyAqIHRvIFNNRSB0byBwcm9jZXNzIHRoaXMgZnVydGhlciBhbmQgcmVsZWFzZSB0aGUgYWN0aXZlCisgKiBjb21tYW5kIGxpc3QKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3NfZHVhbF9tYWNfY2ZnX3Jlc3AodHBBbmlTaXJHbG9iYWwgbWFjLCB2b2lkICpib2R5KQoreworCXN0cnVjdCBzaXJfZHVhbF9tYWNfY29uZmlnX3Jlc3AgKnJlc3AsICpwYXJhbTsKKwl1aW50MzJfdCBsZW4sIGZhaWxfcmVzcCA9IDA7CisJdFNpck1zZ1EgbXNnOworCisJcmVzcCA9IChzdHJ1Y3Qgc2lyX2R1YWxfbWFjX2NvbmZpZ19yZXNwICopYm9keTsKKwlpZiAoIXJlc3ApIHsKKwkJbGltX2xvZyhtYWMsIExPR0UsIEZMKCJTZXQgZHVhbCBtYWMgY2ZnIHBhcmFtIGlzIE5VTEwiKSk7CisJCWZhaWxfcmVzcCA9IDE7CisJCS8qIE5vdCByZXR1cm5pbmcgaGVyZS4gSWYgcG9zc2libGUsIGxldCB1cyBwcm9jZWVkCisJCSAqIGFuZCBzZW5kIGZhaWwgcmVzcG9uc2UgdG8gU01FCisJCSAqLworCX0KKworCWxlbiA9IHNpemVvZigqcGFyYW0pOworCisJcGFyYW0gPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCWlmICghcGFyYW0pIHsKKwkJbGltX2xvZyhtYWMsIExPR0UsIEZMKCJGYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTsKKwkJLyogTWVtb3J5IGFsbG9jYXRpb24gZm9yIHBhcmFtIGZhaWxlZC4KKwkJICogQ2Fubm90IHNlbmQgZmFpbCBzdGF0dXMgYmFjayB0byBTTUUKKwkJICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoZmFpbF9yZXNwKSB7CisJCWxpbV9sb2cobWFjLCBMT0dFLCBGTCgiU2VuZCBmYWlsIHN0YXR1cyB0byBTTUUiKSk7CisJCXBhcmFtLT5zdGF0dXMgPSBTRVRfSFdfTU9ERV9TVEFUVVNfRUNBTkNFTEVEOworCX0gZWxzZSB7CisJCXBhcmFtLT5zdGF0dXMgPSByZXNwLT5zdGF0dXM7CisJCS8qCisJCSAqIFRPRE86IFVwZGF0ZSB0aGlzIEhXIG1vZGUgaW5mbyBpbiBhbnkgVU1BQyBwYXJhbXMsIGlmIG5lZWRlZAorCQkgKi8KKwl9CisKKwltc2cudHlwZSA9IGVXTklfU01FX1NFVF9EVUFMX01BQ19DRkdfUkVTUDsKKwltc2cuYm9keXB0ciA9IHBhcmFtOworCW1zZy5ib2R5dmFsID0gMDsKKwlsaW1fbG9nKG1hYywgTE9HMSwgRkwoIlNlbmQgZVdOSV9TTUVfU0VUX0RVQUxfTUFDX0NGR19SRVNQIHRvIFNNRSIpKTsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkobWFjLCAmbXNnLCBlUFJPVCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX3NldF9od19tb2RlX3Jlc3AoKSAtIFByb2Nlc3Mgc2V0IEhXIG1vZGUgcmVzcG9uc2UKKyAqIEBtYWM6IEdsb2JhbCBNQUMgcG9pbnRlcgorICogQGJvZHk6IFNldCBIVyBtb2RlIHJlc3BvbnNlIGluIHNpcl9zZXRfaHdfbW9kZV9yZXNwIGZvcm1hdAorICoKKyAqIFByb2Nlc3MgdGhlIHNldCBIVyBtb2RlIHJlc3BvbnNlIGFuZCBwb3N0IHRoZSBtZXNzYWdlCisgKiB0byBTTUUgdG8gcHJvY2VzcyB0aGlzIGZ1cnRoZXIgYW5kIHJlbGVhc2UgdGhlIGFjdGl2ZQorICogY29tbWFuZCBsaXN0CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX3NldF9od19tb2RlX3Jlc3AodHBBbmlTaXJHbG9iYWwgbWFjLCB2b2lkICpib2R5KQoreworCXN0cnVjdCBzaXJfc2V0X2h3X21vZGVfcmVzcCAqcmVzcCwgKnBhcmFtOworCXVpbnQzMl90IGxlbiwgaSwgZmFpbF9yZXNwID0gMDsKKwl0U2lyTXNnUSBtc2c7CisKKwlyZXNwID0gKHN0cnVjdCBzaXJfc2V0X2h3X21vZGVfcmVzcCAqKWJvZHk7CisJaWYgKCFyZXNwKSB7CisJCWxpbV9sb2cobWFjLCBMT0dFLCBGTCgiU2V0IEhXIG1vZGUgcGFyYW0gaXMgTlVMTCIpKTsKKwkJZmFpbF9yZXNwID0gMTsKKwkJLyogTm90IHJldHVybmluZyBoZXJlLiBJZiBwb3NzaWJsZSwgbGV0IHVzIHByb2NlZWQKKwkJICogYW5kIHNlbmQgZmFpbCByZXNwb25zZSB0byBTTUUgKi8KKwl9CisKKwlsZW4gPSBzaXplb2YoKnBhcmFtKTsKKworCXBhcmFtID0gY2RmX21lbV9tYWxsb2MobGVuKTsKKwlpZiAoIXBhcmFtKSB7CisJCWxpbV9sb2cobWFjLCBMT0dFLCBGTCgiRmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkiKSk7CisJCS8qIE1lbW9yeSBhbGxvY2F0aW9uIGZvciBwYXJhbSBmYWlsZWQuCisJCSAqIENhbm5vdCBzZW5kIGZhaWwgc3RhdHVzIGJhY2sgdG8gU01FCisJCSAqLworCQlyZXR1cm47CisJfQorCisJaWYgKGZhaWxfcmVzcCkgeworCQlsaW1fbG9nKG1hYywgTE9HRSwgRkwoIlNlbmQgZmFpbCBzdGF0dXMgdG8gU01FIikpOworCQlwYXJhbS0+c3RhdHVzID0gU0VUX0hXX01PREVfU1RBVFVTX0VDQU5DRUxFRDsKKwkJcGFyYW0tPmNmZ2RfaHdfbW9kZV9pbmRleCA9IDA7CisJCXBhcmFtLT5udW1fdmRldl9tYWNfZW50cmllcyA9IDA7CisJfSBlbHNlIHsKKwkJcGFyYW0tPnN0YXR1cyA9IHJlc3AtPnN0YXR1czsKKwkJcGFyYW0tPmNmZ2RfaHdfbW9kZV9pbmRleCA9IHJlc3AtPmNmZ2RfaHdfbW9kZV9pbmRleDsKKwkJcGFyYW0tPm51bV92ZGV2X21hY19lbnRyaWVzID0gcmVzcC0+bnVtX3ZkZXZfbWFjX2VudHJpZXM7CisKKwkJZm9yIChpID0gMDsgaSA8IHJlc3AtPm51bV92ZGV2X21hY19lbnRyaWVzOyBpKyspIHsKKwkJCXBhcmFtLT52ZGV2X21hY19tYXBbaV0udmRldl9pZCA9CisJCQkJcmVzcC0+dmRldl9tYWNfbWFwW2ldLnZkZXZfaWQ7CisJCQlwYXJhbS0+dmRldl9tYWNfbWFwW2ldLm1hY19pZCA9CisJCQkJcmVzcC0+dmRldl9tYWNfbWFwW2ldLm1hY19pZDsKKwkJfQorCQkvKgorCQkgKiBUT0RPOiBVcGRhdGUgdGhpcyBIVyBtb2RlIGluZm8gaW4gYW55IFVNQUMgcGFyYW1zLCBpZiBuZWVkZWQKKwkJICovCisJfQorCisJbXNnLnR5cGUgPSBlV05JX1NNRV9TRVRfSFdfTU9ERV9SRVNQOworCW1zZy5ib2R5cHRyID0gcGFyYW07CisJbXNnLmJvZHl2YWwgPSAwOworCWxpbV9sb2cobWFjLCBMT0dFLCBGTCgiU2VuZCBlV05JX1NNRV9TRVRfSFdfTU9ERV9SRVNQIHRvIFNNRSIpKTsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkobWFjLCAmbXNnLCBlUFJPVCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX2h3X21vZGVfdHJhbnNfaW5kKCkgLSBQcm9jZXNzIHNldCBIVyBtb2RlIHRyYW5zaXRpb24gaW5kaWNhdGlvbgorICogQG1hYzogR2xvYmFsIE1BQyBwb2ludGVyCisgKiBAYm9keTogU2V0IEhXIG1vZGUgcmVzcG9uc2UgaW4gc2lyX2h3X21vZGVfdHJhbnNfaW5kIGZvcm1hdAorICoKKyAqIFByb2Nlc3MgdGhlIHNldCBIVyBtb2RlIHRyYW5zaXRpb24gaW5kaWNhdGlvbiBhbmQgcG9zdCB0aGUgbWVzc2FnZQorICogdG8gU01FIHRvIGludm9rZSB0aGUgSEREIGNhbGxiYWNrCisgKiBjb21tYW5kIGxpc3QKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3NfaHdfbW9kZV90cmFuc19pbmQodHBBbmlTaXJHbG9iYWwgbWFjLCB2b2lkICpib2R5KQoreworCXN0cnVjdCBzaXJfaHdfbW9kZV90cmFuc19pbmQgKmluZCwgKnBhcmFtOworCXVpbnQzMl90IGxlbiwgaTsKKwl0U2lyTXNnUSBtc2c7CisKKwlpbmQgPSAoc3RydWN0IHNpcl9od19tb2RlX3RyYW5zX2luZCAqKWJvZHk7CisJaWYgKCFpbmQpIHsKKwkJbGltX2xvZyhtYWMsIExPR0UsIEZMKCJTZXQgSFcgbW9kZSB0cmFucyBpbmQgcGFyYW0gaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWxlbiA9IHNpemVvZigqcGFyYW0pOworCisJcGFyYW0gPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCWlmICghcGFyYW0pIHsKKwkJbGltX2xvZyhtYWMsIExPR0UsIEZMKCJGYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTsKKwkJcmV0dXJuOworCX0KKworCXBhcmFtLT5vbGRfaHdfbW9kZV9pbmRleCA9IGluZC0+b2xkX2h3X21vZGVfaW5kZXg7CisJcGFyYW0tPm5ld19od19tb2RlX2luZGV4ID0gaW5kLT5uZXdfaHdfbW9kZV9pbmRleDsKKwlwYXJhbS0+bnVtX3ZkZXZfbWFjX2VudHJpZXMgPSBpbmQtPm51bV92ZGV2X21hY19lbnRyaWVzOworCisJZm9yIChpID0gMDsgaSA8IGluZC0+bnVtX3ZkZXZfbWFjX2VudHJpZXM7IGkrKykgeworCQlwYXJhbS0+dmRldl9tYWNfbWFwW2ldLnZkZXZfaWQgPQorCQkJaW5kLT52ZGV2X21hY19tYXBbaV0udmRldl9pZDsKKwkJcGFyYW0tPnZkZXZfbWFjX21hcFtpXS5tYWNfaWQgPQorCQkJaW5kLT52ZGV2X21hY19tYXBbaV0ubWFjX2lkOworCX0KKworCS8qIFRPRE86IFVwZGF0ZSB0aGlzIEhXIG1vZGUgaW5mbyBpbiBhbnkgVU1BQyBwYXJhbXMsIGlmIG5lZWRlZCAqLworCisJbXNnLnR5cGUgPSBlV05JX1NNRV9IV19NT0RFX1RSQU5TX0lORDsKKwltc2cuYm9keXB0ciA9IHBhcmFtOworCW1zZy5ib2R5dmFsID0gMDsKKwlsaW1fbG9nKG1hYywgTE9HRSwgRkwoIlNlbmQgZVdOSV9TTUVfSFdfTU9ERV9UUkFOU19JTkQgdG8gU01FIikpOworCWxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShtYWMsICZtc2csIGVQUk9UKTsKKwlyZXR1cm47Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gZGVmX21zZ19kZWNpc2lvbgorICAgXGJyaWVmIFRoZSBmdW5jdGlvbiBkZWNpZGVzIHdoZXRoZXIgdG8gZGVmZXIgYSBtZXNzYWdlIG9yIG5vdCBpbiBsaW1Qcm9jZXNzTWVzc2FnZSBmdW5jdGlvbgorICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworICAgXHBhcmFtICAgICAgIHRTaXJNc2dRICBsaW1Nc2cKKyAgIFxwYXJhbSAgICAgICB0U2lyTWFjVHNwZWNJRSAgICpwcEluZm8KKyAgIFxyZXR1cm4gbm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3VpbnQ4X3Qgc3RhdGljIGRlZl9tc2dfZGVjaXNpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZykKK3sKKworLyogdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGNoYW5nZWQgKi8KKwlpZiAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9PRkZMSU5FX1NUQVRFKSB7CisJCS8qIERlZmVyIHByb2Nlc3NzaW5nIHRoaXMgbWVzc2FnZSAqLworCQlpZiAobGltX2RlZmVyX21zZyhwTWFjLCBsaW1Nc2cpICE9IFRYX1NVQ0NFU1MpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBMT0dFLAorCQkJCQlGTCgiVW5hYmxlIHRvIERlZmVyIE1zZyIpKTsKKwkJCWxpbV9sb2dfc2Vzc2lvbl9zdGF0ZXMocE1hYyk7CisJCQlsaW1faGFuZGxlX2RlZmVyX21zZ19lcnJvcihwTWFjLCBsaW1Nc2cpOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkvKiBXaGVuIGRlZmVyIGlzIHJlcXVlc3RlZCB0aGVuIGRlZmVyIGFsbCB0aGUgbWVzc2FnZXMgZXhjZXB0IEhBTCByZXNwb25zZXMuICovCisJaWYgKCghbGltX2lzX3N5c3RlbV9pbl9zY2FuX3N0YXRlKHBNYWMpKQorCSAgICAmJiAodHJ1ZSAhPSBHRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjKSkKKwkgICAgJiYgIXBNYWMtPmxpbS5nTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlKSB7CisJCWlmICgobGltTXNnLT50eXBlICE9IFdNQV9BRERfQlNTX1JTUCkKKwkJICAgICYmIChsaW1Nc2ctPnR5cGUgIT0gV01BX0RFTEVURV9CU1NfUlNQKQorCQkgICAgJiYgKGxpbU1zZy0+dHlwZSAhPSBXTUFfQUREX1NUQV9SU1ApCisJCSAgICAmJiAobGltTXNnLT50eXBlICE9IFdNQV9ERUxFVEVfU1RBX1JTUCkKKwkJICAgICYmIChsaW1Nc2ctPnR5cGUgIT0gV01BX1NFVF9CU1NLRVlfUlNQKQorCQkgICAgJiYgKGxpbU1zZy0+dHlwZSAhPSBXTUFfU0VUX1NUQUtFWV9SU1ApCisJCSAgICAmJiAobGltTXNnLT50eXBlICE9IFdNQV9TRVRfU1RBX0JDQVNUS0VZX1JTUCkKKwkJICAgICYmIChsaW1Nc2ctPnR5cGUgIT0gV01BX0FHR1JfUU9TX1JTUCkKKwkJICAgICYmIChsaW1Nc2ctPnR5cGUgIT0gV01BX1NFVF9NSU1PUFNfUlNQKQorCQkgICAgJiYgKGxpbU1zZy0+dHlwZSAhPSBXTUFfU1dJVENIX0NIQU5ORUxfUlNQKQorCQkgICAgJiYgKGxpbU1zZy0+dHlwZSAhPSBXTUFfUDJQX05PQV9BVFRSX0lORCkKKwkJICAgICYmIChsaW1Nc2ctPnR5cGUgIT0gV01BX1AyUF9OT0FfU1RBUlRfSU5EKSAmJgorI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCQkgICAgKGxpbU1zZy0+dHlwZSAhPSBXTUFfU1RBUlRfT0VNX0RBVEFfUlNQKSAmJgorI2VuZGlmCisJCSAgICAobGltTXNnLT50eXBlICE9IFdNQV9BRERfVFNfUlNQKSkgeworCQkJUEVMT0cxKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJEZWZlciB0aGUgY3VycmVudCBtZXNzYWdlICVzICwgZ0xpbVByb2Nlc3NEZWZkTXNncyBpcyBmYWxzZSBhbmQgc3lzdGVtIGlzIG5vdCBpbiBzY2FuL2xlYXJuIG1vZGUiKSwKKwkJCQkgICAgICAgbGltX21zZ19zdHIobGltTXNnLT50eXBlKSk7CisJCQkgICAgICAgKQorCQkJLyogRGVmZXIgcHJvY2Vzc3NpbmcgdGhpcyBtZXNzYWdlICovCisJCQlpZiAobGltX2RlZmVyX21zZyhwTWFjLCBsaW1Nc2cpICE9IFRYX1NVQ0NFU1MpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgTE9HRSwKKwkJCQkJRkwoIlVuYWJsZSB0byBEZWZlciBNc2ciKSk7CisJCQkJbGltX2xvZ19zZXNzaW9uX3N0YXRlcyhwTWFjKTsKKwkJCQlsaW1faGFuZGxlX2RlZmVyX21zZ19lcnJvcihwTWFjLCBsaW1Nc2cpOworCisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorc3RhdGljIHZvaWQKK19fbGltX3Bub19tYXRjaF9md2RfYmNuX3Byb2JlcHNwKHRwQW5pU2lyR2xvYmFsIHBtYWMsIHVpbnQ4X3QgKnJ4X3BrdF9pbmZvLAorCQkJCXRTaXJQcm9iZVJlc3BCZWFjb24gKmZyYW1lLCB1aW50MzJfdCBpZV9sZW4sCisJCQkJdWludDMyX3QgbXNnX3R5cGUpCit7CisJc3RydWN0IHBub19tYXRjaF9mb3VuZCAgKnJlc3VsdDsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAqYm9keTsKKwl0U2lyTXNnUSAgICAgICAgICAgICAgICBtbWhfbXNnOworCXRwU2lyTWFjTWdtdEhkciAgICAgICAgIGhkcjsKKwl1aW50MzJfdCBudW1fcmVzdWx0cyA9IDEsIGxlbiwgaTsKKworCS8qIFVwb24gcmVjZWl2aW5nIGV2ZXJ5IG1hdGNoZWQgYmVhY29uLCBic3MgaW5mbyBpcyBmb3J3YXJkZWQgdG8gdGhlCisJICogdGhlIHVwcGVyIGxheWVyLCBoZW5jZSBudW1fcmVzdWx0cyBpcyBzZXQgdG8gMSAqLworCWxlbiA9IHNpemVvZigqcmVzdWx0KSArIChudW1fcmVzdWx0cyAqIHNpemVvZih0U2lyV2lmaVNjYW5SZXN1bHQpKSArCisJCWllX2xlbjsKKworCXJlc3VsdCA9IGNkZl9tZW1fbWFsbG9jKGxlbik7CisJaWYgKE5VTEwgPT0gcmVzdWx0KSB7CisJCWxpbV9sb2cocG1hYywgTE9HRSwgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKwloZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocnhfcGt0X2luZm8pOworCWJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShyeF9wa3RfaW5mbyk7CisJY2RmX21lbV96ZXJvKHJlc3VsdCwgc2l6ZW9mKCpyZXN1bHQpICsgaWVfbGVuKTsKKworCS8qIFJlY2VpdmVkIGZyYW1lIGRvZXMgbm90IGhhdmUgcmVxdWVzdCBpZCwgaGVuY2Ugc2V0IDAgKi8KKwlyZXN1bHQtPnJlcXVlc3RfaWQgPSAwOworCXJlc3VsdC0+bW9yZV9kYXRhID0gMDsKKwlyZXN1bHQtPm51bV9yZXN1bHRzID0gbnVtX3Jlc3VsdHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzdWx0LT5udW1fcmVzdWx0czsgaSsrKSB7CisJCXJlc3VsdC0+YXBbaV0udHMgPSBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCk7CisJCXJlc3VsdC0+YXBbaV0uYmVhY29uUGVyaW9kID0gZnJhbWUtPmJlYWNvbkludGVydmFsOworCQlyZXN1bHQtPmFwW2ldLmNhcGFiaWxpdHkgPQorCQkJbGltX2dldF91MTYoKHVpbnQ4X3QgKikgJmZyYW1lLT5jYXBhYmlsaXR5SW5mbyk7CisJCXJlc3VsdC0+YXBbaV0uY2hhbm5lbCA9IFdNQV9HRVRfUlhfQ0gocnhfcGt0X2luZm8pOworCQlyZXN1bHQtPmFwW2ldLnJzc2kgPSBXTUFfR0VUX1JYX1JTU0lfREIocnhfcGt0X2luZm8pOworCQlyZXN1bHQtPmFwW2ldLnJ0dCA9IDA7CisJCXJlc3VsdC0+YXBbaV0ucnR0X3NkID0gMDsKKwkJcmVzdWx0LT5hcFtpXS5pZUxlbmd0aCA9IGllX2xlbjsKKwkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZyZXN1bHQtPmFwW2ldLnNzaWRbMF0sCisJCQkodWludDhfdCAqKSBmcmFtZS0+c3NJZC5zc0lkLCBmcmFtZS0+c3NJZC5sZW5ndGgpOworCQlyZXN1bHQtPmFwW2ldLnNzaWRbZnJhbWUtPnNzSWQubGVuZ3RoXSA9ICdcMCc7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcmVzdWx0LT5hcFtpXS5ic3NpZCwKKwkJCQkodWludDhfdCAqKSBoZHItPmJzc0lkLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQkvKiBDb3B5IElFIGZpZWxkcyAqLworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnJlc3VsdC0+YXBbaV0uaWVEYXRhLAorCQkJCWJvZHkgKyBTSVJfTUFDX0JfUFJfU1NJRF9PRkZTRVQsIGllX2xlbik7CisJfQorCisJbW1oX21zZy50eXBlID0gbXNnX3R5cGU7CisJbW1oX21zZy5ib2R5cHRyID0gcmVzdWx0OworCW1taF9tc2cuYm9keXZhbCA9IDA7CisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBtYWMsICZtbWhfbXNnLCBlUFJPVCk7Cit9CisKKworc3RhdGljIHZvaWQKK19fbGltX2V4dF9zY2FuX2ZvcndhcmRfYmNuX3Byb2JlX3JzcCh0cEFuaVNpckdsb2JhbCBwbWFjLCB1aW50OF90ICpyeF9wa3RfaW5mbywKKwkJCQkJdFNpclByb2JlUmVzcEJlYWNvbiAqZnJhbWUsCisJCQkJCXVpbnQzMl90IGllX2xlbiwKKwkJCQkJdWludDMyX3QgbXNnX3R5cGUpCit7CisJdHBTaXJXaWZpRnVsbFNjYW5SZXN1bHRFdmVudCByZXN1bHQ7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICpib2R5OworCXRTaXJNc2dRICAgICAgICAgICAgICAgICAgICAgbW1oX21zZzsKKwl0cFNpck1hY01nbXRIZHIgICAgICAgICAgICAgIGhkcjsKKworCXJlc3VsdCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcmVzdWx0KSArIGllX2xlbik7CisJaWYgKE5VTEwgPT0gcmVzdWx0KSB7CisJCWxpbV9sb2cocG1hYywgTE9HRSwgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKwloZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocnhfcGt0X2luZm8pOworCWJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShyeF9wa3RfaW5mbyk7CisJY2RmX21lbV96ZXJvKHJlc3VsdCwgc2l6ZW9mKCpyZXN1bHQpICsgaWVfbGVuKTsKKworCS8qIFJlY2VpdmVkIGZyYW1lIGRvZXMgbm90IGhhdmUgcmVxdWVzdCBpZCwgaGVuY2Ugc2V0IDAgKi8KKwlyZXN1bHQtPnJlcXVlc3RJZCA9IDA7CisKKwlyZXN1bHQtPm1vcmVEYXRhID0gMDsKKwlyZXN1bHQtPmFwLnRzID0gY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOworCXJlc3VsdC0+YXAuYmVhY29uUGVyaW9kID0gZnJhbWUtPmJlYWNvbkludGVydmFsOworCXJlc3VsdC0+YXAuY2FwYWJpbGl0eSA9CisJCQlsaW1fZ2V0X3UxNigodWludDhfdCAqKSAmZnJhbWUtPmNhcGFiaWxpdHlJbmZvKTsKKwlyZXN1bHQtPmFwLmNoYW5uZWwgPSBXTUFfR0VUX1JYX0NIKHJ4X3BrdF9pbmZvKTsKKwlyZXN1bHQtPmFwLnJzc2kgPSBXTUFfR0VUX1JYX1JTU0lfREIocnhfcGt0X2luZm8pOworCXJlc3VsdC0+YXAucnR0ID0gMDsKKwlyZXN1bHQtPmFwLnJ0dF9zZCA9IDA7CisJcmVzdWx0LT5hcC5pZUxlbmd0aCA9IGllX2xlbjsKKworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcmVzdWx0LT5hcC5zc2lkWzBdLAorCQkJKHVpbnQ4X3QgKikgZnJhbWUtPnNzSWQuc3NJZCwgZnJhbWUtPnNzSWQubGVuZ3RoKTsKKwlyZXN1bHQtPmFwLnNzaWRbZnJhbWUtPnNzSWQubGVuZ3RoXSA9ICdcMCc7CisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZyZXN1bHQtPmFwLmJzc2lkLmJ5dGVzLAorCQkJKHVpbnQ4X3QgKikgaGRyLT5ic3NJZCwKKwkJCUNERl9NQUNfQUREUl9TSVpFKTsKKwkvKiBDb3B5IElFIGZpZWxkcyAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcmVzdWx0LT5hcC5pZURhdGEsCisJCQlib2R5ICsgU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VULCBpZV9sZW4pOworCisJbW1oX21zZy50eXBlID0gbXNnX3R5cGU7CisJbW1oX21zZy5ib2R5cHRyID0gcmVzdWx0OworCW1taF9tc2cuYm9keXZhbCA9IDA7CisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBtYWMsICZtbWhfbXNnLCBlUFJPVCk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2xpbV9wcm9jZXNzX2V4dF9zY2FuX2JlYWNvbl9wcm9iZV9yc3AodHBBbmlTaXJHbG9iYWwgcG1hYywKKwkJCQkJdWludDhfdCAqcnhfcGt0X2luZm8sCisJCQkJCXVpbnQ4X3Qgc3ViX3R5cGUpCit7CisJdFNpclByb2JlUmVzcEJlYWNvbiAgKmZyYW1lOworCXVpbnQ4X3QgICAgICAgICAgICAgICpib2R5OworCXVpbnQzMl90ICAgICAgICAgICAgIGZybV9sZW47CisJdFNpclJldFN0YXR1cyAgICAgICAgc3RhdHVzOworCisJZnJtX2xlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocnhfcGt0X2luZm8pOworCWlmIChmcm1fbGVuIDw9IFNJUl9NQUNfQl9QUl9TU0lEX09GRlNFVCkgeworCQlsaW1fbG9nKHBtYWMsIExPR1AsCisJCQlGTCgiUlggcGFja2V0IGhhcyBpbnZhbGlkIGxlbmd0aCAlZCIpLCBmcm1fbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWZyYW1lID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpmcmFtZSkpOworCWlmIChOVUxMID09IGZyYW1lKSB7CisJCWxpbV9sb2cocG1hYywgTE9HRSwgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdWJfdHlwZSA9PSBTSVJfTUFDX01HTVRfQkVBQ09OKSB7CisJCWxpbV9sb2cocG1hYywgTE9HMiwgRkwoIkJlYWNvbiBkdWUgdG8gRXh0U2Nhbi9lcG5vIikpOworCQlzdGF0dXMgPSBzaXJfY29udmVydF9iZWFjb25fZnJhbWUyX3N0cnVjdChwbWFjLAorCQkJCQkJKHVpbnQ4X3QgKilyeF9wa3RfaW5mbywKKwkJCQkJCWZyYW1lKTsKKwl9IGVsc2UgaWYgKHN1Yl90eXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApIHsKKwkJbGltX2xvZyhwbWFjLCBMT0cyLCBGTCgiUHJvYmUgUnNwIGR1ZSB0byBFeHRTY2FuL2Vwbm8iKSk7CisJCWJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShyeF9wa3RfaW5mbyk7CisJCXN0YXR1cyA9IHNpcl9jb252ZXJ0X3Byb2JlX2ZyYW1lMl9zdHJ1Y3QocG1hYywgYm9keSwKKwkJCQkJCQlmcm1fbGVuLCBmcmFtZSk7CisJfSBlbHNlIHsKKwkJY2RmX21lbV9mcmVlKGZyYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdGF0dXMgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocG1hYywgTE9HRSwgRkwoIkZyYW1lIHBhcnNpbmcgZmFpbGVkIikpOworCQljZGZfbWVtX2ZyZWUoZnJhbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKFdNQV9JU19FWFRTQ0FOX1NDQU5fU1JDKHJ4X3BrdF9pbmZvKSkKKwkJX19saW1fZXh0X3NjYW5fZm9yd2FyZF9iY25fcHJvYmVfcnNwKHBtYWMsIHJ4X3BrdF9pbmZvLCBmcmFtZSwKKwkJCQkJKGZybV9sZW4gLSBTSVJfTUFDX0JfUFJfU1NJRF9PRkZTRVQpLAorCQkJCQllV05JX1NNRV9FWFRTQ0FOX0ZVTExfU0NBTl9SRVNVTFRfSU5EKTsKKworCWlmIChXTUFfSVNfRVBOT19TQ0FOX1NSQyhyeF9wa3RfaW5mbykpCisJCV9fbGltX3Bub19tYXRjaF9md2RfYmNuX3Byb2JlcHNwKHBtYWMsIHJ4X3BrdF9pbmZvLCBmcmFtZSwKKwkJCQkJKGZybV9sZW4gLSBTSVJfTUFDX0JfUFJfU1NJRF9PRkZTRVQpLAorCQkJCQllV05JX1NNRV9FUE5PX05FVFdPUktfRk9VTkRfSU5EKTsKKworCWNkZl9tZW1fZnJlZShmcmFtZSk7Cit9CisjZW5kaWYKKworLyoKKyAqIEJlYWNvbiBIYW5kbGluZyBDYXNlczoKKyAqIGR1cmluZyBzY2FubmluZywgd2hlbiBubyBzZXNzaW9uIGlzIGFjdGl2ZToKKyAqICAgIGhhbmRsZWQgYnkgbGltX2hhbmRsZV9mcmFtZXNfaW5fc2Nhbl9zdGF0ZSBiZWZvcmUgX19saW1faGFuZGxlX2JlYWNvbiBjYWxsIGlzIGludm9rZWQuCisgKiBkdXJpbmcgc2Nhbm5pbmcsIHdoZW4gYW55IHNlc3Npb24gaXMgYWN0aXZlLCBidXQgYmVhY29uL1ByIGRvZXMgbm90IGJlbG9uZyB0byB0aGF0IHNlc3Npb24sIHBzZXNzaW9uRW50cnkgd2lsbCBiZSBudWxsLgorICogICAgaGFuZGxlZCBieSBsaW1faGFuZGxlX2ZyYW1lc19pbl9zY2FuX3N0YXRlIGJlZm9yZSBfX2xpbV9oYW5kbGVfYmVhY29uIGNhbGwgaXMgaW52b2tlZC4KKyAqIGR1cmluZyBzY2FubmluZywgd2hlbiBhbnkgc2Vzc2lvbiBpcyBhY3RpdmUsIGFuZCBiZWFjb24vUHIgYmVsb25ncyB0byBvbmUgb2YgdGhlIHNlc3Npb24sIHBzZXNzaW9uRW50cnkgd2lsbCBub3QgYmUgbnVsbC4KKyAqICAgIGhhbmRsZWQgYnkgbGltX2hhbmRsZV9mcmFtZXNfaW5fc2Nhbl9zdGF0ZSBiZWZvcmUgX19saW1faGFuZGxlX2JlYWNvbiBjYWxsIGlzIGludm9rZWQuCisgKiBOb3Qgc2Nhbm5pbmcsIG5vIHNlc3Npb246CisgKiAgICB0aGVyZSBzaG91bGQgbm90IGJlIGFueSBiZWFjb24gY29taW5nLCBpZiBjb21pbmcsIHNob3VsZCBiZSBkcm9wcGVkLgorICogTm90IFNjYW5uaW5nLAorICovCitzdGF0aWMgdm9pZAorX19saW1faGFuZGxlX2JlYWNvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZywKKwkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJLyogY2hlY2tpbmcgZm9yIGdsb2JhbCBTTUUgc3RhdGUuLi4gKi8KKwl1aW50OF90ICpwUnhQYWNrZXRJbmZvOworCWxpbV9nZXRfYl9kZnJvbV9yeF9wYWNrZXQocE1hYywgcE1zZy0+Ym9keXB0ciwKKwkJCQkgICh1aW50MzJfdCAqICopICZwUnhQYWNrZXRJbmZvKTsKKworCS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgYmVhY29uIGlzIHJlY2VpdmVkIGluIHNjYW4gc3RhdGUuICovCisJLyogU28gbm90IGRvaW5nIGFueSBjaGVja3MgZm9yIHRoZSBnbG9iYWwgc3RhdGUuICovCisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCXNjaF9iZWFjb25fcHJvY2VzcyhwTWFjLCBwUnhQYWNrZXRJbmZvLCBOVUxMKTsKKwl9IGVsc2UgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURSkgfHwKKwkJICAgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX05PUk1BTF9TVEFURSkpIHsKKwkJc2NoX2JlYWNvbl9wcm9jZXNzKHBNYWMsIHBSeFBhY2tldEluZm8sIHBzZXNzaW9uRW50cnkpOworCX0gZWxzZQorCQlsaW1fcHJvY2Vzc19iZWFjb25fZnJhbWUocE1hYywgcFJ4UGFja2V0SW5mbywgcHNlc3Npb25FbnRyeSk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogbGltX2RlZmVyX21zZygpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVmZXIgdGhlIG1lc3NhZ2VzIHJlY2VpdmVkCisgKiBkdXJpbmcgTGVhcm4gbW9kZQorICoKKyAqKipMT0dJQzoKKyAqIE5BCisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwTXNnIG9mIHR5cGUgdFNpck1zZ1EgLSBQb2ludGVyIHRvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordWludDMyX3QgbGltX2RlZmVyX21zZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSAqcE1zZykKK3sKKwl1aW50MzJfdCByZXRDb2RlID0gVFhfU1VDQ0VTUzsKKworCXJldENvZGUgPSBsaW1fd3JpdGVfZGVmZXJyZWRfbXNnX3EocE1hYywgcE1zZyk7CisKKwlpZiAocmV0Q29kZSA9PSBUWF9TVUNDRVNTKSB7CisJCU1UUkFDRShtYWNfdHJhY2VfbXNnX3J4CisJCQkgICAgICAgKHBNYWMsIE5PX1NFU1NJT04sCisJCQkgICAgICAgTElNX1RSQUNFX01BS0VfUlhNU0cocE1zZy0+dHlwZSwgTElNX01TR19ERUZFUlJFRCkpOworCQkgICAgICAgKQorCX0gZWxzZSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkRyb3BwZWQgbGltIG1lc3NhZ2UgKDB4JVgpIiksCisJCQlwTXNnLT50eXBlKTsKKwkJTVRSQUNFKG1hY190cmFjZV9tc2dfcngKKwkJCSAgICAgICAocE1hYywgTk9fU0VTU0lPTiwKKwkJCSAgICAgICBMSU1fVFJBQ0VfTUFLRV9SWE1TRyhwTXNnLT50eXBlLCBMSU1fTVNHX0RST1BQRUQpKTsKKwkJICAgICAgICkKKwl9CisKKwlyZXR1cm4gcmV0Q29kZTsKK30gLyoqKiBlbmQgbGltX2RlZmVyX21zZygpICoqKi8KKworLyoqCisgKiBsaW1faGFuZGxlX3Vua25vd25fYTJfaW5kZXhfZnJhbWVzKCkgLSBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgVW5rbm93biBVbmljYXN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQTIgSW5kZXgpIHBhY2tldHMKKyAqIEBtYWNfY3R4OiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBHbG9iYWwgTWFjIENvbnRleHQuCisgKiBAcnhfcGt0X2J1ZmZlcjogICAgUG9pbnRlciB0byB0aGUgcGFja2V0IEJ1ZmZlciBkZXNjcmlwdG9yLgorICogQHNlc3Npb25fZW50cnk6ICAgIFBvaW50ZXIgdG8gdGhlIFBFIFNlc3Npb24gRW50cnkuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgaGFuZGxlIHB1YmxpYyBhY3Rpb24gZnJhbWVzLgorICoKKyAqIFJldHVybjogICAgICBOb25lLgorICovCitzdGF0aWMgdm9pZCBsaW1faGFuZGxlX3Vua25vd25fYTJfaW5kZXhfZnJhbWVzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdm9pZCAqcnhfcGt0X2J1ZmZlciwgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSkKK3sKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXRwU2lyTWFjRGF0YUhkcjNhIG1hY19oZHI7CisjZW5kaWYKKwlpZiAoTElNX0lTX1AyUF9ERVZJQ0VfUk9MRShzZXNzaW9uX2VudHJ5KSkKKwkJbGltX3Byb2Nlc3NfYWN0aW9uX2ZyYW1lX25vX3Nlc3Npb24obWFjX2N0eCwKKwkJCSh1aW50OF90ICopIHJ4X3BrdF9idWZmZXIpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJbWFjX2hkciA9IFdNQV9HRVRfUlhfTVBEVUhFQURFUjNBKHJ4X3BrdF9idWZmZXIpOworCisJaWYgKGxpbV9pc19ncm91cF9hZGRyKG1hY19oZHItPmFkZHIyKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCUZMKCJJZ25vcmluZyBBMiBJbnZhbGlkIFBhY2tldCByZWNlaXZlZCBmb3IgTUMvQkM6IikpOworCQlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwgbWFjX2hkci0+YWRkcjIsIExPRzIpOworCQlyZXR1cm47CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCUZMKCJ0eXBlPTB4JXgsIHN1YnR5cGU9MHgleCIpLAorCQltYWNfaGRyLT5mYy50eXBlLCBtYWNfaGRyLT5mYy5zdWJUeXBlKTsKKwkvKiBDdXJyZW50bHkgb25seSBmb2xsb3dpbmcgdHlwZSBhbmQgc3VidHlwZSBhcmUgaGFuZGxlZC4KKwkgKiBJZiB0aGVyZSBhcmUgbW9yZSBjb21iaW5hdGlvbnMsIHRoZW4gYWRkIHN3aXRjaC1jYXNlCisJICogc3RhdGVtZW50cy4KKwkgKi8KKwlpZiAoTElNX0lTX1NUQV9ST0xFKHNlc3Npb25fZW50cnkpICYmCisJCShtYWNfaGRyLT5mYy50eXBlID09IFNJUl9NQUNfTUdNVF9GUkFNRSkgJiYKKwkJKG1hY19oZHItPmZjLnN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0FDVElPTikpCisJCWxpbV9wcm9jZXNzX2FjdGlvbl9mcmFtZShtYWNfY3R4LCByeF9wa3RfYnVmZmVyLCBzZXNzaW9uX2VudHJ5KTsKKyNlbmRpZgorCXJldHVybjsKK30KKworLyoqCisgKiBsaW1fY2hlY2tfbWdtdF9yZWdpc3RlcmVkX2ZyYW1lcygpIC0gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlZ2lzdGVyZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50IGZyYW1lcy4KKyAqCisgKiBAbWFjX2N0eDogICAgICAgICAgUG9pbnRlciB0byB0aGUgR2xvYmFsIE1hYyBDb250ZXh0LgorICogQGJ1ZmZfZGVzYzogICAgICAgIFBvaW50ZXIgdG8gdGhlIHBhY2tldCBCdWZmZXIgZGVzY3JpcHRvci4KKyAqIEBzZXNzaW9uX2VudHJ5OiAgICBQb2ludGVyIHRvIHRoZSBQRSBTZXNzaW9uIEVudHJ5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgdG8gY2hlY2sgaWYgcmVjZWl2ZWQgZnJhbWUgbWF0Y2ggd2l0aAorICogYW55IG9mIHRoZSByZWdpc3RlcmVkIGZyYW1lIGZyb20gSERELiBJZiB5ZXMgcGFzcyB0aGlzIGZyYW1lIHRvIFNNRS4KKyAqCisgKiBSZXR1cm46ICAgICAgVHJ1ZSBvciBGYWxzZSBmb3IgTWF0Y2ggb3IgTWlzbWF0Y2ggcmVzcGVjdGl2ZWx5LgorICovCitzdGF0aWMgYm9vbAorbGltX2NoZWNrX21nbXRfcmVnaXN0ZXJlZF9mcmFtZXModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCAqYnVmZl9kZXNjLAorCQkJCSB0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXRTaXJNYWNGcmFtZUN0bCBmYzsKKwl0cFNpck1hY01nbXRIZHIgaGRyOworCXVpbnQ4X3QgKmJvZHk7CisJc3RydWN0IG1nbXRfZnJtX3JlZ19pbmZvICptZ210X2ZyYW1lID0gTlVMTDsKKwlzdHJ1Y3QgbWdtdF9mcm1fcmVnX2luZm8gKm5leHRfZnJtID0gTlVMTDsKKwl1aW50MTZfdCBmcm1fdHlwZTsKKwl1aW50MTZfdCBmcm1fbGVuOworCXVpbnQ4X3QgdHlwZSwgc3ViX3R5cGU7CisJYm9vbCBtYXRjaCA9IGZhbHNlOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKworCWhkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihidWZmX2Rlc2MpOworCWZjID0gaGRyLT5mYzsKKwlmcm1fdHlwZSA9IChmYy50eXBlIDw8IDIpIHwgKGZjLnN1YlR5cGUgPDwgNCk7CisJYm9keSA9IFdNQV9HRVRfUlhfTVBEVV9EQVRBKGJ1ZmZfZGVzYyk7CisJZnJtX2xlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4oYnVmZl9kZXNjKTsKKworCWNkZl9tdXRleF9hY3F1aXJlKCZtYWNfY3R4LT5saW0ubGltX2ZyYW1lX3JlZ2lzdGVyX2xvY2spOworCWNkZl9saXN0X3BlZWtfZnJvbnQoJm1hY19jdHgtPmxpbS5nTGltTWdtdEZyYW1lUmVnaXN0cmF0aW5RdWV1ZSwKKwkJCSAgICAoY2RmX2xpc3Rfbm9kZV90ICoqKSAmbWdtdF9mcmFtZSk7CisJY2RmX211dGV4X3JlbGVhc2UoJm1hY19jdHgtPmxpbS5saW1fZnJhbWVfcmVnaXN0ZXJfbG9jayk7CisKKwl3aGlsZSAobWdtdF9mcmFtZSAhPSBOVUxMKSB7CisJCXR5cGUgPSAobWdtdF9mcmFtZS0+ZnJhbWVUeXBlID4+IDIpICYgMHgwMzsKKwkJc3ViX3R5cGUgPSAobWdtdF9mcmFtZS0+ZnJhbWVUeXBlID4+IDQpICYgMHgwZjsKKwkJaWYgKCh0eXBlID09IFNJUl9NQUNfTUdNVF9GUkFNRSkKKwkJICAgICYmIChmYy50eXBlID09IFNJUl9NQUNfTUdNVF9GUkFNRSkKKwkJICAgICYmIChzdWJfdHlwZSA9PSBTSVJfTUFDX01HTVRfUkVTRVJWRUQxNSkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCUZMCisJCQkJKCJyY3ZkIGZybSBtYXRjaCBmb3IgU0lSX01BQ19NR01UX1JFU0VSVkVEMTUiKSk7CisJCQltYXRjaCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQlpZiAobWdtdF9mcmFtZS0+ZnJhbWVUeXBlID09IGZybV90eXBlKSB7CisJCQlpZiAobWdtdF9mcmFtZS0+bWF0Y2hMZW4gPD0gMCkgeworCQkJCW1hdGNoID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChtZ210X2ZyYW1lLT5tYXRjaExlbiA8PSBmcm1fbGVuICYmCisJCQkJY2RmX21lbV9jb21wYXJlKG1nbXRfZnJhbWUtPm1hdGNoRGF0YSwgYm9keSwKKwkJCQltZ210X2ZyYW1lLT5tYXRjaExlbikpIHsKKwkJCQkvKiBmb3VuZCBtYXRjaCEgKi8KKwkJCQltYXRjaCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQljZGZfbXV0ZXhfYWNxdWlyZSgmbWFjX2N0eC0+bGltLmxpbV9mcmFtZV9yZWdpc3Rlcl9sb2NrKTsKKwkJY2RmX3N0YXR1cyA9CisJCQljZGZfbGlzdF9wZWVrX25leHQoCisJCQkmbWFjX2N0eC0+bGltLmdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlLAorCQkJKGNkZl9saXN0X25vZGVfdCAqKSBtZ210X2ZyYW1lLAorCQkJKGNkZl9saXN0X25vZGVfdCAqKikgJm5leHRfZnJtKTsKKwkJY2RmX211dGV4X3JlbGVhc2UoJm1hY19jdHgtPmxpbS5saW1fZnJhbWVfcmVnaXN0ZXJfbG9jayk7CisJCW1nbXRfZnJhbWUgPSBuZXh0X2ZybTsKKwkJbmV4dF9mcm0gPSBOVUxMOworCX0KKworCWlmIChtYXRjaCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQlGTCgicmN2ZCBmcmFtZSBtYXRjaCB3aXRoIHJlZ2lzdGVyZWQgZnJhbWUgcGFyYW1zIikpOworCQkvKiBJbmRpY2F0ZSB0aGlzIHRvIFNNRSAqLworCQlsaW1fc2VuZF9zbWVfbWdtdF9mcmFtZV9pbmQobWFjX2N0eCwgaGRyLT5mYy5zdWJUeXBlLAorCQkJKHVpbnQ4X3QgKikgaGRyLAorCQkJV01BX0dFVF9SWF9QQVlMT0FEX0xFTihidWZmX2Rlc2MpICsKKwkJCXNpemVvZih0U2lyTWFjTWdtdEhkciksIG1nbXRfZnJhbWUtPnNlc3Npb25JZCwKKwkJCVdNQV9HRVRfUlhfQ0goYnVmZl9kZXNjKSwgc2Vzc2lvbl9lbnRyeSwgMCk7CisKKwkJaWYgKCh0eXBlID09IFNJUl9NQUNfTUdNVF9GUkFNRSkKKwkJICAgICYmIChmYy50eXBlID09IFNJUl9NQUNfTUdNVF9GUkFNRSkKKwkJICAgICYmIChzdWJfdHlwZSA9PSBTSVJfTUFDX01HTVRfUkVTRVJWRUQxNSkpCisJCQkvKiBUaGVzZSBwYWNrZXRzIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBQRS9TTUUKKwkJCSAqIGFzIHdlbGwgYXMgSERELklmIGl0IHJldHVybnMgdHJ1ZSBoZXJlLAorCQkJICogdGhlIHBhY2tldCBpcyBmb3J3YXJkZWQgdG8gSEREIG9ubHkuCisJCQkgKi8KKwkJCW1hdGNoID0gZmFsc2U7CisJfQorCisJcmV0dXJuIG1hdGNoOworfQorCisvKioKKyAqIGxpbV9oYW5kbGU4MDIxMV9mcmFtZXMoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgODAyLjExIGZyYW1lcworICogcmVjZWl2ZWQgYnkgTElNLgorICoKKyAqKipMT0dJQzoKKyAqIE5BCisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwTXNnIG9mIHR5cGUgdFNpck1zZ1EgLSBQb2ludGVyIHRvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2xpbV9oYW5kbGU4MDIxMV9mcmFtZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZywgdWludDhfdCAqcERlZmVyTXNnKQoreworCXVpbnQ4X3QgKnBSeFBhY2tldEluZm8gPSBOVUxMOworCXRTaXJNYWNGcmFtZUN0bCBmYzsKKwl0cFNpck1hY01nbXRIZHIgcEhkciA9IE5VTEw7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9IE5VTEw7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdEFuaUJvb2wgaXNGcm1GdCA9IGZhbHNlOworCisJKnBEZWZlck1zZyA9IGZhbHNlOworCWxpbV9nZXRfYl9kZnJvbV9yeF9wYWNrZXQocE1hYywgbGltTXNnLT5ib2R5cHRyLAorCQkJCSAgKHVpbnQzMl90ICogKikgJnBSeFBhY2tldEluZm8pOworCisJcEhkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKwlpc0ZybUZ0ID0gV01BX0dFVF9SWF9GVF9ET05FKHBSeFBhY2tldEluZm8pOworCWZjID0gcEhkci0+ZmM7CisKKyNpZmRlZiBXTEFOX0RVTVBfTUdNVEZSQU1FUworCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJRkwoIlByb3RWZXJzaW9uICVkLCBUeXBlICVkLCBTdWJ0eXBlICVkIHJhdGVJbmRleD0lZCIpLAorCQlmYy5wcm90VmVyLCBmYy50eXBlLCBmYy5zdWJUeXBlLAorCQlXTUFfR0VUX1JYX01BQ19SQVRFX0lEWChwUnhQYWNrZXRJbmZvKSk7CisJQ0RGX1RSQUNFX0hFWF9EVU1QKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwgcEhkciwKKwkJCSAgIFdNQV9HRVRfUlhfTVBEVV9IRUFERVJfTEVOKHBSeFBhY2tldEluZm8pKTsKKyNlbmRpZgorCWlmIChwTWFjLT5mRW5hYmxlRGVidWdMb2cgJiAweDEpIHsKKwkJaWYgKChmYy50eXBlID09IFNJUl9NQUNfTUdNVF9GUkFNRSkgJiYKKwkJICAgIChmYy5zdWJUeXBlICE9IFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpICYmCisJCSAgICAoZmMuc3ViVHlwZSAhPSBTSVJfTUFDX01HTVRfUFJPQkVfUlNQKSAmJgorCQkgICAgKGZjLnN1YlR5cGUgIT0gU0lSX01BQ19NR01UX0JFQUNPTikpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiUlggTUdNVCAtIFR5cGUgJWh1LCBTdWJUeXBlICVodSwgc2VxIG51bVslZF0iKSwKKwkJCQkgICBmYy50eXBlLAorCQkJCSAgIGZjLnN1YlR5cGUsCisJCQkJICAgKChwSGRyLT5zZXFDb250cm9sLnNlcU51bUhpIDw8CisJCQkJICAgSElHSF9TRVFfTlVNX09GRlNFVCkgfAorCQkJCSAgIHBIZHItPnNlcUNvbnRyb2wuc2VxTnVtTG8pKTsKKwkJfQorCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCWlmIChXTUFfSVNfRVhUU0NBTl9TQ0FOX1NSQyhwUnhQYWNrZXRJbmZvKSB8fAorCQlXTUFfSVNfRVBOT19TQ0FOX1NSQyhwUnhQYWNrZXRJbmZvKSkgeworCQlpZiAoZmMuc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQkVBQ09OIHx8CisJCSAgICBmYy5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApIHsKKwkJCV9fbGltX3Byb2Nlc3NfZXh0X3NjYW5fYmVhY29uX3Byb2JlX3JzcChwTWFjLAorCQkJCQkJCQlwUnhQYWNrZXRJbmZvLAorCQkJCQkJCQlmYy5zdWJUeXBlKTsKKwkJfSBlbHNlIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiV3JvbmcgZnJhbWVUeXBlICVkLCBTdWJ0eXBlICVkIGZvciAlZCIpLAorCQkJCWZjLnR5cGUsIGZjLnN1YlR5cGUsCisJCQkJV01BX0dFVF9TQ0FOX1NSQyhwUnhQYWNrZXRJbmZvKSk7CisJCX0KKwkJZ290byBlbmQ7CisJfQorI2VuZGlmCisJaWYgKFdNQV9HRVRfT0ZGTE9BRFNDQU5MRUFSTihwUnhQYWNrZXRJbmZvKSkgeworCQlpZiAoZmMuc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQkVBQ09OKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPRzIsIEZMKCJMZWFybmluZyBzY2FuIGJlYWNvbiIpKTsKKwkJCV9fbGltX2hhbmRsZV9iZWFjb24ocE1hYywgbGltTXNnLCBOVUxMKTsKKwkJfSBlbHNlIGlmIChmYy5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoIkxlYXJuaW5nIHNjYW4gcHJvYmUgcnNwIikpOworCQkJbGltX3Byb2Nlc3NfcHJvYmVfcnNwX2ZyYW1lX25vX3Nlc3Npb24ocE1hYywgcFJ4UGFja2V0SW5mbyk7CisJCX0gZWxzZSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIldyb25nIGZyYW1lIFR5cGUgJWQsIFN1YnR5cGUgJWQgZm9yIExGUiIpLAorCQkJCWZjLnR5cGUsIGZjLnN1YlR5cGUpOworCQl9CisJCWdvdG8gZW5kOworCX0KKwkvKiBBZGRlZCBGb3IgQlQtQU1QIFN1cHBvcnQgKi8KKwlpZiAoKHBzZXNzaW9uRW50cnkgPQorCQkgICAgIHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChwTWFjLCBwSGRyLT5ic3NJZCwKKwkJCQkJICAgICAgJnNlc3Npb25JZCkpID09IE5VTEwpIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQlpZiAoZmMuc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQVVUSCkgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJRkwKKwkJCQkJKCJQcm90VmVyc2lvbiAlZCwgVHlwZSAlZCwgU3VidHlwZSAlZCByYXRlSW5kZXg9JWQiKSwKKwkJCQlmYy5wcm90VmVyLCBmYy50eXBlLCBmYy5zdWJUeXBlLAorCQkJCVdNQV9HRVRfUlhfTUFDX1JBVEVfSURYKHBSeFBhY2tldEluZm8pKTsKKwkJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwSGRyLT5ic3NJZCwgTE9HMSk7CisjZW5kaWYKKwkJCWlmIChsaW1fcHJvY2Vzc19hdXRoX2ZyYW1lX25vX3Nlc3Npb24KKwkJCQkgICAgKHBNYWMsIHBSeFBhY2tldEluZm8sCisJCQkJICAgIGxpbU1zZy0+Ym9keXB0cikgPT0gZVNJUl9TVUNDRVNTKSB7CisJCQkJbGltX3BrdF9mcmVlKHBNYWMsIFRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCQkgICAgIHBSeFBhY2tldEluZm8sIGxpbU1zZy0+Ym9keXB0cik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKChmYy5zdWJUeXBlICE9IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApICYmCisJCSAgICAoZmMuc3ViVHlwZSAhPSBTSVJfTUFDX01HTVRfQkVBQ09OKSAmJgorCQkgICAgKGZjLnN1YlR5cGUgIT0gU0lSX01BQ19NR01UX1BST0JFX1JFUSkKKwkJICAgICYmIChmYy5zdWJUeXBlICE9IFNJUl9NQUNfTUdNVF9BQ1RJT04pICAgICAgLyogUHVibGljIGFjdGlvbiBmcmFtZSBjYW4gYmUgcmVjZWl2ZWQgZnJvbSBub24tYXNzb2NpYXRlZCBzdGF0aW9ucy4gKi8KKwkJICAgICkgeworCisJCQlpZiAoKHBzZXNzaW9uRW50cnkgPQorCQkJCSAgICAgcGVfZmluZF9zZXNzaW9uX2J5X3BlZXJfc3RhKHBNYWMsIHBIZHItPnNhLAorCQkJCQkJCQkgJnNlc3Npb25JZCkpID09IE5VTEwpIHsKKwkJCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJCUZMCisJCQkJCQkoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIGJzc0lkIikpOworCQkJCWxpbV9wa3RfZnJlZShwTWFjLCBUWFJYX0ZSTV84MDJfMTFfTUdNVCwKKwkJCQkJICAgICBwUnhQYWNrZXRJbmZvLCBsaW1Nc2ctPmJvZHlwdHIpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZQorCQkJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCQkJIlNlc3Npb25JZDolZCBTZXNzaW9uIEV4aXN0IGZvciBnaXZlbiBCc3NpZCIsCisJCQkJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKwkJfQorCQkvKiAgRm9yIHAycCByZXNwIGZyYW1lcyBzZWFyY2ggZm9yIHZhbGlkIHNlc3Npb24gd2l0aCBEQSBhcyAqLworCQkvKiAgQlNTSUQgd2lsbCBiZSBTQSBhbmQgc2Vzc2lvbiB3aWxsIGJlIHByZXNlbnQgd2l0aCBEQSBvbmx5ICovCisJCWlmIChmYy5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9BQ1RJT04pIHsKKwkJCXBzZXNzaW9uRW50cnkgPQorCQkJCXBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChwTWFjLCBwSGRyLT5kYSwgJnNlc3Npb25JZCk7CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiBmcmFtZSBpcyByZWdpc3RlcmVkIGJ5IEhERCAqLworCWlmIChsaW1fY2hlY2tfbWdtdF9yZWdpc3RlcmVkX2ZyYW1lcyhwTWFjLCBwUnhQYWNrZXRJbmZvLCBwc2Vzc2lvbkVudHJ5KSkgeworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBmcmFtZSBpcyBwYXNzZWQgdG8gU01FIikpOworCQlsaW1fcGt0X2ZyZWUocE1hYywgVFhSWF9GUk1fODAyXzExX01HTVQsIHBSeFBhY2tldEluZm8sCisJCQkgICAgIGxpbU1zZy0+Ym9keXB0cik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZmMucHJvdFZlciAhPSBTSVJfTUFDX1BST1RPQ09MX1ZFUlNJT04pIHsgICAvKiBSZWNlaXZlZCBGcmFtZSB3aXRoIG5vbi16ZXJvIFByb3RvY29sIFZlcnNpb24gKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlVuZXhwZWN0ZWQgZnJhbWUgd2l0aCBwcm90VmVyc2lvbiAlZCByZWNlaXZlZCIpLAorCQkJZmMucHJvdFZlcik7CisJCWxpbV9wa3RfZnJlZShwTWFjLCBUWFJYX0ZSTV84MDJfMTFfTUdNVCwgcFJ4UGFja2V0SW5mbywKKwkJCSAgICAgKHZvaWQgKilsaW1Nc2ctPmJvZHlwdHIpOworI2lmZGVmIFdMQU5fREVCVUcKKwkJcE1hYy0+bGltLm51bVByb3RFcnIrKzsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisvKiBDaGFuY2Ugb2YgY3Jhc2hpbmcgOiB0byBiZSBkb25lIEJULUFNUCAuLi4uLi4uLmhhcHBlbnMgd2hlbiBicm9hZGNhc3QgcHJvYmUgcmVxIGlzIHJlY2VpdmVkICovCisKKyNpZmRlZiBXTEFOX0RFQlVHCisJcE1hYy0+bGltLm51bU1BQ1tmYy50eXBlXVtmYy5zdWJUeXBlXSsrOworI2VuZGlmCisKKwlzd2l0Y2ggKGZjLnR5cGUpIHsKKwljYXNlIFNJUl9NQUNfTUdNVF9GUkFNRToKKwl7CisJCS8qIFJlY2VpdmVkIE1hbmFnZW1lbnQgZnJhbWUgKi8KKwkJc3dpdGNoIChmYy5zdWJUeXBlKSB7CisJCWNhc2UgU0lSX01BQ19NR01UX0FTU09DX1JFUToKKwkJCS8qIE1ha2Ugc3VyZSB0aGUgcm9sZSBzdXBwb3J0cyBBc3NvY2lhdGlvbiAqLworCQkJaWYgKExJTV9JU19CVF9BTVBfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCQkJICAgIExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKQorCQkJCWxpbV9wcm9jZXNzX2Fzc29jX3JlcV9mcmFtZShwTWFjLAorCQkJCQkJCSAgICBwUnhQYWNrZXRJbmZvLAorCQkJCQkJCSAgICBMSU1fQVNTT0MsCisJCQkJCQkJICAgIHBzZXNzaW9uRW50cnkpOworCQkJZWxzZSB7CisJCQkJLyogVW53YW50ZWQgbWVzc2FnZXMgLSBMb2cgZXJyb3IgKi8KKwkJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMCisJCQkJCQkoInVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCAlWCIpLAorCQkJCQlsaW1Nc2ctPnR5cGUpOworCQkJCWxpbV9wcmludF9tc2dfbmFtZShwTWFjLCBMT0dFLAorCQkJCQkJICAgbGltTXNnLT50eXBlKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0lSX01BQ19NR01UX0FTU09DX1JTUDoKKwkJCWxpbV9wcm9jZXNzX2Fzc29jX3JzcF9mcmFtZShwTWFjLCBwUnhQYWNrZXRJbmZvLAorCQkJCQkJICAgIExJTV9BU1NPQywKKwkJCQkJCSAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSX01BQ19NR01UX1JFQVNTT0NfUkVROgorCQkJLyogTWFrZSBzdXJlIHRoZSByb2xlIHN1cHBvcnRzIFJlYXNzb2NpYXRpb24gKi8KKwkJCWlmIChMSU1fSVNfQlRfQU1QX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkJCSAgICBMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJCWxpbV9wcm9jZXNzX2Fzc29jX3JlcV9mcmFtZShwTWFjLAorCQkJCQkJCSAgICBwUnhQYWNrZXRJbmZvLAorCQkJCQkJCSAgICBMSU1fUkVBU1NPQywKKwkJCQkJCQkgICAgcHNlc3Npb25FbnRyeSk7CisJCQl9IGVsc2UgeworCQkJCS8qIFVud2FudGVkIG1lc3NhZ2VzIC0gTG9nIGVycm9yICovCisJCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTAorCQkJCQkJKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWQgJVgiKSwKKwkJCQkJbGltTXNnLT50eXBlKTsKKwkJCQlsaW1fcHJpbnRfbXNnX25hbWUocE1hYywgTE9HRSwKKwkJCQkJbGltTXNnLT50eXBlKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0lSX01BQ19NR01UX1JFQVNTT0NfUlNQOgorCQkJbGltX3Byb2Nlc3NfYXNzb2NfcnNwX2ZyYW1lKHBNYWMsIHBSeFBhY2tldEluZm8sCisJCQkJCQkgICAgTElNX1JFQVNTT0MsCisJCQkJCQkgICAgcHNlc3Npb25FbnRyeSk7CisJCQlicmVhazsKKworCQljYXNlIFNJUl9NQUNfTUdNVF9QUk9CRV9SRVE6CisJCQlsaW1fcHJvY2Vzc19wcm9iZV9yZXFfZnJhbWVfbXVsdGlwbGVfYnNzKHBNYWMsCisJCQkJCQkJCSBwUnhQYWNrZXRJbmZvLAorCQkJCQkJCQkgcHNlc3Npb25FbnRyeSk7CisJCQlicmVhazsKKworCQljYXNlIFNJUl9NQUNfTUdNVF9QUk9CRV9SU1A6CisJCQlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKQorCQkJCWxpbV9wcm9jZXNzX3Byb2JlX3JzcF9mcmFtZV9ub19zZXNzaW9uKHBNYWMsCisJCQkJCQkJCSAgICAgICBwUnhQYWNrZXRJbmZvKTsKKwkJCWVsc2UKKwkJCQlsaW1fcHJvY2Vzc19wcm9iZV9yc3BfZnJhbWUocE1hYywKKwkJCQkJCQkgICAgcFJ4UGFja2V0SW5mbywKKwkJCQkJCQkgICAgcHNlc3Npb25FbnRyeSk7CisJCQlicmVhazsKKworCQljYXNlIFNJUl9NQUNfTUdNVF9CRUFDT046CisJCQlfX2xpbV9oYW5kbGVfYmVhY29uKHBNYWMsIGxpbU1zZywgcHNlc3Npb25FbnRyeSk7CisJCQlicmVhazsKKworCQljYXNlIFNJUl9NQUNfTUdNVF9ESVNBU1NPQzoKKwkJCWxpbV9wcm9jZXNzX2Rpc2Fzc29jX2ZyYW1lKHBNYWMsIHBSeFBhY2tldEluZm8sCisJCQkJCQkgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSX01BQ19NR01UX0FVVEg6CisJCQlsaW1fcHJvY2Vzc19hdXRoX2ZyYW1lKHBNYWMsIHBSeFBhY2tldEluZm8sCisJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSX01BQ19NR01UX0RFQVVUSDoKKwkJCWxpbV9wcm9jZXNzX2RlYXV0aF9mcmFtZShwTWFjLCBwUnhQYWNrZXRJbmZvLAorCQkJCQkJIHBzZXNzaW9uRW50cnkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJfTUFDX01HTVRfQUNUSU9OOgorCQkJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkKKwkJCQlsaW1fcHJvY2Vzc19hY3Rpb25fZnJhbWVfbm9fc2Vzc2lvbihwTWFjLAorCQkJCQkJCQkgICAgcFJ4UGFja2V0SW5mbyk7CisJCQllbHNlIHsKKwkJCQlpZiAoV01BX0dFVF9SWF9VTktOT1dOX1VDQVNUCisJCQkJCSAgICAocFJ4UGFja2V0SW5mbykpCisJCQkJCWxpbV9oYW5kbGVfdW5rbm93bl9hMl9pbmRleF9mcmFtZXMKKwkJCQkJCShwTWFjLCBwUnhQYWNrZXRJbmZvLAorCQkJCQkJcHNlc3Npb25FbnRyeSk7CisJCQkJZWxzZQorCQkJCQlsaW1fcHJvY2Vzc19hY3Rpb25fZnJhbWUocE1hYywKKwkJCQkJCQkJIHBSeFBhY2tldEluZm8sCisJCQkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogUmVjZWl2ZWQgTWFuYWdlbWVudCBmcmFtZSBvZiAncmVzZXJ2ZWQnIHN1YnR5cGUgKi8KKwkJCWJyZWFrOworCQl9IC8qIHN3aXRjaCAoZmMuc3ViVHlwZSkgKi8KKworCX0KKwlicmVhazsKKwljYXNlIFNJUl9NQUNfREFUQV9GUkFNRToKKwl7CisJfQorCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFJlY2VpdmVkIGZyYW1lIG9mIHR5cGUgJ3Jlc2VydmVkJyAqLworCQlicmVhazsKKworCX0gLyogc3dpdGNoIChmYy50eXBlKSAqLworCitlbmQ6CisJbGltX3BrdF9mcmVlKHBNYWMsIFRYUlhfRlJNXzgwMl8xMV9NR01ULCBwUnhQYWNrZXRJbmZvLAorCQkgICAgICh2b2lkICopbGltTXNnLT5ib2R5cHRyKTsKKwlyZXR1cm47Cit9IC8qKiogZW5kIGxpbV9oYW5kbGU4MDIxMV9mcmFtZXMoKSAqKiovCisKKy8qKgorICogbGltX3NlbmRfc3RvcF9zY2FuX29mZmxvYWRfcmVxKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRvIGFib3J0IHRoZSBvbmdvaW5nIG9mZmxvYWRlZCBzY2FuCisgKiByZXF1ZXN0LgorICoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyBvciBDREZfU1RBVFVTX0VfRkFJTFVSRQorICovCitDREZfU1RBVFVTIGxpbV9zZW5kX3N0b3Bfc2Nhbl9vZmZsb2FkX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCXVpbnQ4X3QgU2Vzc2lvbklkLCB1aW50MzJfdCBzY2FuX2lkKQoreworCXRTaXJNc2dRIG1zZzsKKwl0U2lyUmV0U3RhdHVzIHJjID0gZVNJUl9TVUNDRVNTOworCXRBYm9ydFNjYW5QYXJhbXMgKnBBYm9ydFNjYW5QYXJhbXM7CisKKwlwQWJvcnRTY2FuUGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBYm9ydFNjYW5QYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBwQWJvcnRTY2FuUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIEFib3J0U2NhblBhcmFtcyIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlwQWJvcnRTY2FuUGFyYW1zLT5TZXNzaW9uSWQgPSBTZXNzaW9uSWQ7CisJcEFib3J0U2NhblBhcmFtcy0+c2Nhbl9pZCA9IHNjYW5faWQ7CisJbXNnLnR5cGUgPSBXTUFfU1RPUF9TQ0FOX09GRkxPQURfUkVROworCW1zZy5ib2R5cHRyID0gcEFib3J0U2NhblBhcmFtczsKKwltc2cuYm9keXZhbCA9IDA7CisKKwlyYyA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2cpOworCWlmIChyYyAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgid21hX3Bvc3RfY3RybF9tc2coKSByZXR1cm4gZmFpbHVyZSIpKTsKKwkJY2RmX21lbV9mcmVlKHBBYm9ydFNjYW5QYXJhbXMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiQWJvcnQgb25nb2luZyBvZmZsb2FkIHNjYW4uIikpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19hYm9ydF9zY2FuX2luZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBIREQgdG8gYWJvcnQgdGhlIHNjYW4gd2hpY2ggaXMgcHJlc2VudGx5IGJlaW5nIHJ1bgorICoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfYWJvcnRfc2Nhbl9pbmQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwl1aW50OF90IHNlc3Npb25faWQsIHVpbnQzMl90IHNjYW5faWQpCit7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0KKwlsaW1fZGlhZ19ldmVudF9yZXBvcnQobWFjX2N0eCwgV0xBTl9QRV9ESUFHX1NDQU5fQUJPUlRfSU5EX0VWRU5ULCBOVUxMLCAwLCAwKTsKKyNlbmRpZgorCisJbGltX2xvZyhtYWNfY3R4LCBMT0cyLCBGTCgiUHJvY2Vzc2luZyBBYm9ydFNjYW4gSW5kIHNjYW5faWQgJWQiKSwKKwkJCQkgc2Nhbl9pZCk7CisKKwkvKiBzZW5kIHN0b3Agc2NhbiBjbWQgdG8gZncgaWYgc2NhbiBvZmZsb2FkIGlzIGVuYWJsZWQuICovCisJbGltX3NlbmRfc3RvcF9zY2FuX29mZmxvYWRfcmVxKG1hY19jdHgsIHNlc3Npb25faWQsIHNjYW5faWQpOworCXJldHVybjsKK30KKworLyoqCisgKiBsaW1fbWVzc2FnZV9wcm9jZXNzb3IoKSAtIFByb2Nlc3MgbWVzc2FnZXMgZnJvbSBMSU0uCisgKgorICogQG1hY19jdHg6ICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEdsb2JhbCBNYWMgQ29udGV4dC4KKyAqIEBtc2c6ICAgICAgICAgICAgICBSZWNlaXZlZCBMSU0gbWVzc2FnZS4KKyAqCisgKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBsaW1fcHJvY2Vzc19tZXNzYWdlcyB3aGVuIGhhbmRsaW5nIG1lc3NhZ2VzIHJlY2VpdmVkIGJ5CisgKiBMSU0uQ291bGQgZWl0aGVyIGRlZmVyIG1lc3NhZ2VzIG9yIHByb2Nlc3MgdGhlbS4KKyAqCisgKiBSZXR1cm46ICBOb25lLgorICovCit2b2lkIGxpbV9tZXNzYWdlX3Byb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0cFNpck1zZ1EgbXNnKQoreworCWlmIChlTElNX01MTV9PRkZMSU5FX1NUQVRFID09IG1hY19jdHgtPmxpbS5nTGltTWxtU3RhdGUpIHsKKwkJcGVfZnJlZV9tc2cobWFjX2N0eCwgbXNnKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghZGVmX21zZ19kZWNpc2lvbihtYWNfY3R4LCBtc2cpKSB7CisJCWxpbV9wcm9jZXNzX21lc3NhZ2VzKG1hY19jdHgsIG1zZyk7CisJCS8qIHByb2Nlc3MgZGVmZXJyZWQgbWVzc2FnZSBxdWV1ZSBpZiBhbGxvd2VkICovCisJCWlmICgoIShtYWNfY3R4LT5saW0uZ0xpbUFkZHRzU2VudCkpICYmCisJCQkoIShsaW1faXNfc3lzdGVtX2luX3NjYW5fc3RhdGUobWFjX2N0eCkpKSAmJgorCQkJKHRydWUgPT0gR0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MobWFjX2N0eCkpKQorCQkJbGltX3Byb2Nlc3NfZGVmZXJyZWRfbWVzc2FnZV9xdWV1ZShtYWNfY3R4KTsKKwl9Cit9CisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKwordm9pZCBsaW1fb2VtX2RhdGFfcnNwX2hhbmRsZV9yZXN1bWVfbGlua19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgQ0RGX1NUQVRVUyBzdGF0dXMsCisJCQkJCSAgICAgdWludDMyX3QgKm1sbU9lbURhdGFSc3ApCit7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIk9FTSBEYXRhIFJzcCBmYWlsZWQgdG8gZ2V0IHRoZSByZXNwb25zZSBmb3IgcmVzdW1lIGxpbmsiKSk7CisJfQorCisJaWYgKE5VTEwgIT0gcE1hYy0+bGltLmdwTGltTWxtT2VtRGF0YVJlcSkgeworCQljZGZfbWVtX2ZyZWUocE1hYy0+bGltLmdwTGltTWxtT2VtRGF0YVJlcSk7CisJCXBNYWMtPmxpbS5ncExpbU1sbU9lbURhdGFSZXEgPSBOVUxMOworCX0KKwkvKiAiRmFpbHVyZSIgc3RhdHVzIGRvZXNuJ3QgbWVhbiB0aGF0IE9lbSBEYXRhIFJzcCBkaWQgbm90IGhhcHBlbiAqLworCS8qIGFuZCBoZW5jZSB3ZSBuZWVkIHRvIHJlc3BvbmQgdG8gdXBwZXIgbGF5ZXJzLiBPbmx5IFJlc3VtZSBsaW5rIGlzIGZhaWxlZCwgYnV0ICovCisJLyogd2UgZ290IHRoZSBvZW0gZGF0YSByZXNwb25zZSBhbHJlYWR5LiAqLworCS8qIFBvc3QgdGhlIG1lZXNzYWdlIHRvIE1MTSAqLworCWxpbV9wb3N0X3NtZV9tZXNzYWdlKHBNYWMsIExJTV9NTE1fT0VNX0RBVEFfQ05GLAorCQkJICAgICAodWludDMyX3QgKikgKG1sbU9lbURhdGFSc3ApKTsKKworCXJldHVybjsKK30KKwordm9pZCBsaW1fcHJvY2Vzc19vZW1fZGF0YV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKmJvZHkpCit7CisJdHBMaW1NbG1PZW1EYXRhUnNwIG1sbU9lbURhdGFSc3AgPSBOVUxMOworCisJLyogUHJvY2VzcyBhbGwgdGhlIG1lc3NhZ2VzIGZvciB0aGUgbGltIHF1ZXVlICovCisJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisKKwltbG1PZW1EYXRhUnNwID0gKHRwTGltTWxtT2VtRGF0YVJzcCkgYm9keTsKKworCVBFTE9HMShsaW1fbG9nCisJCSAgICAgICAocE1hYywgTE9HMSwgRkwoIiVzOiBzZW5kaW5nIG9lbSBkYXRhIHJlc3BvbnNlIG1zZyB0byBzbWUiKSwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkgICAgICAgKQorCWxpbV9wb3N0X3NtZV9tZXNzYWdlKHBNYWMsIExJTV9NTE1fT0VNX0RBVEFfQ05GLAorCQkJICAgICAodWludDMyX3QgKikgKG1sbU9lbURhdGFSc3ApKTsKKworCXJldHVybjsKK30KKworI2VuZGlmCisKKy8qKgorICogbGltX3Byb2Nlc3NfbWVzc2FnZXMoKSAtIFByb2Nlc3MgbWVzc2FnZXMgZnJvbSB1cHBlciBsYXllcnMuCisgKgorICogQG1hY19jdHg6ICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEdsb2JhbCBNYWMgQ29udGV4dC4KKyAqIEBtc2c6ICAgICAgICAgICAgICBSZWNlaXZlZCBtZXNzYWdlLgorICoKKyAqIFJldHVybjogIE5vbmUuCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWVzc2FnZXModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdHBTaXJNc2dRIG1zZykKK3sKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKwl1aW50OF90IHZkZXZfaWQgPSAwOworCXRVcGRhdGVCZWFjb25QYXJhbXMgYmVhY29uX3BhcmFtczsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKwl1aW50OF90IGk7CisJdWludDhfdCBwMnBfZ29fZXhpc3RzID0gMDsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5ID0gTlVMTDsKKwl1aW50OF90IGRlZmVyX21zZyA9IGZhbHNlOworCXRMaW5rU3RhdGVQYXJhbXMgKmxpbmtfc3RhdGVfcGFyYW07CisJdWludDE2X3QgcGt0X2xlbiA9IDA7CisJY2RzX3BrdF90ICpib2R5X3B0ciA9IE5VTEw7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXRTaXJNc2dRIG5ld19tc2c7CisJdFNpclNtZVNjYW5BYm9ydFJlcSAqcmVxX21zZyA9IE5VTEw7CisJdWludDhfdCBzZXNzaW9uX2lkOworCXVpbnQzMl90IHNjYW5faWQ7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXRTaXJUZGxzSW5kICp0ZGxzX2luZCA9IE5VTEw7CisJdHBEcGhIYXNoTm9kZSBzdGFfZHMgPSBOVUxMOworCXRUZGxzTGlua0VzdGFibGlzaFBhcmFtcyAqdGRsc19saW5rX3BhcmFtcyA9IE5VTEw7CisjZW5kaWYKKwl0U2lyTWJNc2dQMnAgKnAycF9tc2cgPSBOVUxMOworCWlmIChBTklfRFJJVkVSX1RZUEUobWFjX2N0eCkgPT0gZURSSVZFUl9UWVBFX01GRykgeworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKwlpZiAobXNnID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiTWVzc2FnZSBwb2ludGVyIGlzIE51bGwiKSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgV0xBTl9ERUJVRworCW1hY19jdHgtPmxpbS5udW1Ub3QrKzsKKyNlbmRpZgorCU1UUkFDRShtYWNfdHJhY2VfbXNnX3J4KG1hY19jdHgsIE5PX1NFU1NJT04sCisJCUxJTV9UUkFDRV9NQUtFX1JYTVNHKG1zZy0+dHlwZSwgTElNX01TR19QUk9DRVNTRUQpKTspCisKKwlzd2l0Y2ggKG1zZy0+dHlwZSkgeworCisJY2FzZSBTSVJfTElNX1VQREFURV9CRUFDT046CisJCWxpbV91cGRhdGVfYmVhY29uKG1hY19jdHgpOworCQlicmVhazsKKwljYXNlIFNJUl9DRkdfUEFSQU1fVVBEQVRFX0lORDoKKwkJaWYgKCFsaW1faXNfc3lzdGVtX2luX3NjYW5fc3RhdGUobWFjX2N0eCkpIHsKKwkJCWxpbV9oYW5kbGVfY2ZfZ3BhcmFtX3VwZGF0ZShtYWNfY3R4LCBtc2ctPmJvZHl2YWwpOworCQkJYnJlYWs7CisJCX0KKwkJLyogU3lzdGVtIGlzIGluIERGUyAoTGVhcm4pIG1vZGUuCisJCSAqIERlZmVyIHByb2Nlc3NzaW5nIHRoaXMgbWVzc2FnZQorCQkgKi8KKwkJaWYgKGxpbV9kZWZlcl9tc2cobWFjX2N0eCwgbXNnKSAhPSBUWF9TVUNDRVNTKSB7CisJCQlpZiAoIShtYWNfY3R4LT5saW0uZGVmZXJyZWRNc2dDbnQgJiAweEYpKQorCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBMT0dFLAorCQkJCQlGTCgiVW5hYmxlIHRvIERlZmVyIE1zZyIpKTsKKwkJCWxpbV9sb2dfc2Vzc2lvbl9zdGF0ZXMobWFjX2N0eCk7CisJCQlsaW1fcHJpbnRfbXNnX25hbWUobWFjX2N0eCwgTE9HRSwgbXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKwljYXNlIFdNQV9TVEFSVF9PRU1fREFUQV9SU1A6CisJCWxpbV9wcm9jZXNzX29lbV9kYXRhX3JzcChtYWNfY3R4LCBtc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgV01BX1NXSVRDSF9DSEFOTkVMX1JTUDoKKwkJbGltX3Byb2Nlc3Nfc3dpdGNoX2NoYW5uZWxfcnNwKG1hY19jdHgsIG1zZy0+Ym9keXB0cik7CisJCW1zZy0+Ym9keXB0ciA9IE5VTEw7CisJCWJyZWFrOworI2lmZGVmIEFOSV9TSVJfSUJTU19QRUVSX0NBQ0hJTkcKKwljYXNlIFdNQV9JQlNTX1NUQV9BREQ6CisJCWxpbV9pYnNzX3N0YV9hZGQobWFjX2N0eCwgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFNJUl9CQl9YUE9SVF9NR01UX01TRzoKKwkJLyogVGhlc2UgbWVzc2FnZXMgYXJlIGZyb20gUGVlciBNQUMgZW50aXR5LiAqLworI2lmZGVmIFdMQU5fREVCVUcKKwkJbWFjX2N0eC0+bGltLm51bUJidCsrOworI2VuZGlmCisJCS8qIFRoZSBvcmlnaW5hbCBtc2cgd2hpY2ggd2Ugd2VyZSBkZWZlcnJpbmcgaGF2ZSB0aGUKKwkJICogYm9keVBvaW50ZXIgcG9pbnQgdG8gJ0JEJyBpbnN0ZWFkIG9mICdjZHMgcGt0Jy4gSWYgd2UKKwkJICogZG9uJ3QgbWFrZSBhIGNvcHkgb2YgbXNnLCB0aGVuIG92ZXJ3cml0ZSB0aGUKKwkJICogbXNnLT5ib2R5UG9pbnRlciBhbmQgbmV4dCB0aW1lIHdoZW4gd2UgdHJ5IHRvCisJCSAqIHByb2Nlc3MgdGhlIG1zZywgd2Ugd2lsbCB0cnkgdG8gdXNlICdCRCcgYXMKKwkJICogJ2NkcyBQa3QnIHdoaWNoIHdpbGwgY2F1c2UgYSBjcmFzaAorCQkgKi8KKwkJaWYgKG1zZy0+Ym9keXB0ciA9PSBOVUxMKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJNZXNzYWdlIGJvZHlwdHIgaXMgTnVsbCIpKTsKKwkJCUNERl9BU1NFUlQoMCk7CisJCQlicmVhazsKKwkJfQorCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJm5ld19tc2csCisJCQkodWludDhfdCAqKSBtc2csIHNpemVvZih0U2lyTXNnUSkpOworCQlib2R5X3B0ciA9IChjZHNfcGt0X3QgKikgbmV3X21zZy5ib2R5cHRyOworCQljZHNfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKGJvZHlfcHRyLCAmcGt0X2xlbik7CisKKwkJY2RmX3N0YXR1cyA9IHdtYV9kc19wZWVrX3J4X3BhY2tldF9pbmZvKGJvZHlfcHRyLAorCQkJKHZvaWQgKiopICZuZXdfbXNnLmJvZHlwdHIsIGZhbHNlKTsKKworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJY2RzX3BrdF9yZXR1cm5fcGFja2V0KGJvZHlfcHRyKTsKKwkJCWJyZWFrOworCQl9CisKKyAgICAgICAgICAgICAgICBpZiAoV01BX0dFVF9ST0FNQ0FORElEQVRFSU5EKG5ld19tc2cuYm9keXB0cikpCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJyb2FtQ2FuZGlkYXRlSW5kICVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNQV9HRVRfUk9BTUNBTkRJREFURUlORChuZXdfbXNnLmJvZHlwdHIpKTsKKworICAgICAgICAgICAgICAgIGlmIChXTUFfR0VUX09GRkxPQURTQ0FOTEVBUk4obmV3X21zZy5ib2R5cHRyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIm9mZmxvYWRTY2FuTGVhcm4gJWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNQV9HRVRfT0ZGTE9BRFNDQU5MRUFSTihuZXdfbXNnLmJvZHlwdHIpKTsKKworCQlsaW1faGFuZGxlODAyMTFfZnJhbWVzKG1hY19jdHgsICZuZXdfbXNnLCAmZGVmZXJfbXNnKTsKKworCQlpZiAoZGVmZXJfbXNnID09IHRydWUpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBMT0cxLAorCQkJCQlGTCgiRGVmZXIgTXNnIHR5cGU9JXgiKSwgbXNnLT50eXBlKTsKKwkJCWlmIChsaW1fZGVmZXJfbXNnKG1hY19jdHgsIG1zZykgIT0gVFhfU1VDQ0VTUykgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBMT0dFLAorCQkJCQkJRkwoIlVuYWJsZSB0byBEZWZlciBNc2ciKSk7CisJCQkJbGltX2xvZ19zZXNzaW9uX3N0YXRlcyhtYWNfY3R4KTsKKwkJCQljZHNfcGt0X3JldHVybl9wYWNrZXQoYm9keV9wdHIpOworCQkJfQorCQl9IGVsc2UKKwkJCS8qIFBFIGlzIG5vdCBkZWZlcnJpbmcgdGhpcyA4MDIuMTEgZnJhbWUgc28gd2UgbmVlZCB0bworCQkJICogY2FsbCBjZHNfcGt0X3JldHVybi4gQXN1bXB0aW9uIGhlcmUgaXMgd2hlbiBSeCBtZ210CisJCQkgKiBmcmFtZSBwcm9jZXNzaW5nIGlzIGRvbmUsIGNkcyBwYWNrZXQgY291bGQgYmUKKwkJCSAqIGZyZWVkIGhlcmUuCisJCQkgKi8KKwkJCWNkc19wa3RfcmV0dXJuX3BhY2tldChib2R5X3B0cik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfU0NBTl9SRVE6CisJY2FzZSBlV05JX1NNRV9SRU1BSU5fT05fQ0hBTk5FTF9SRVE6CisJY2FzZSBlV05JX1NNRV9ESVNBU1NPQ19SRVE6CisJY2FzZSBlV05JX1NNRV9ERUFVVEhfUkVROgorI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCWNhc2UgZVdOSV9TTUVfT0VNX0RBVEFfUkVROgorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwljYXNlIGVXTklfU01FX1RETFNfU0VORF9NR01UX1JFUToKKwljYXNlIGVXTklfU01FX1RETFNfQUREX1NUQV9SRVE6CisJY2FzZSBlV05JX1NNRV9URExTX0RFTF9TVEFfUkVROgorCWNhc2UgZVdOSV9TTUVfVERMU19MSU5LX0VTVEFCTElTSF9SRVE6CisjZW5kaWYKKwljYXNlIGVXTklfU01FX1JFU0VUX0FQX0NBUFNfQ0hBTkdFRDoKKwljYXNlIGVXTklfU01FX1NFVF9IV19NT0RFX1JFUToKKwljYXNlIGVXTklfU01FX1NFVF9EVUFMX01BQ19DRkdfUkVROgorCQkvKiBUaGVzZSBtZXNzYWdlcyBhcmUgZnJvbSBIREQuIE5lZWQgdG8gcmVzcG9uZCB0byBIREQgKi8KKwkJbGltX3Byb2Nlc3Nfbm9ybWFsX2hkZF9tc2cobWFjX2N0eCwgbXNnLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIGVXTklfU01FX1NDQU5fQUJPUlRfSU5EOgorCQlyZXFfbXNnID0gbXNnLT5ib2R5cHRyOworCQlpZiAocmVxX21zZykgeworCQkJc2Vzc2lvbl9pZCA9IHJlcV9tc2ctPnNlc3Npb25JZDsKKwkJCXNjYW5faWQgPSByZXFfbXNnLT5zY2FuX2lkOworCQkJbGltX3Byb2Nlc3NfYWJvcnRfc2Nhbl9pbmQobWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCQlzY2FuX2lkKTsKKwkJCWNkZl9tZW1fZnJlZSgodm9pZCAqKW1zZy0+Ym9keXB0cik7CisJCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQl9CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfU1lTX1JFQURZX0lORDoKKwljYXNlIGVXTklfU01FX0pPSU5fUkVROgorCWNhc2UgZVdOSV9TTUVfUkVBU1NPQ19SRVE6CisJY2FzZSBlV05JX1NNRV9TVEFSVF9CU1NfUkVROgorCWNhc2UgZVdOSV9TTUVfU1RPUF9CU1NfUkVROgorCWNhc2UgZVdOSV9TTUVfU1dJVENIX0NITF9JTkQ6CisJY2FzZSBlV05JX1NNRV9TRVRDT05URVhUX1JFUToKKwljYXNlIGVXTklfU01FX0RJU0FTU09DX0NORjoKKwljYXNlIGVXTklfU01FX0RFQVVUSF9DTkY6CisJY2FzZSBlV05JX1NNRV9BU1NPQ19DTkY6CisJY2FzZSBlV05JX1NNRV9BRERUU19SRVE6CisJY2FzZSBlV05JX1NNRV9ERUxUU19SRVE6CisJY2FzZSBlV05JX1NNRV9HRVRfQVNTT0NfU1RBU19SRVE6CisJY2FzZSBlV05JX1NNRV9US0lQX0NOVFJfTUVBU19SRVE6CisJY2FzZSBlV05JX1NNRV9VUERBVEVfQVBXUFNJRV9SRVE6CisJY2FzZSBlV05JX1NNRV9ISURFX1NTSURfUkVROgorCWNhc2UgZVdOSV9TTUVfR0VUX1dQU1BCQ19TRVNTSU9OX1JFUToKKwljYXNlIGVXTklfU01FX1NFVF9BUFdQQVJTTklFc19SRVE6CisJY2FzZSBlV05JX1NNRV9DSE5HX01DQ19CRUFDT05fSU5URVJWQUw6CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJY2FzZSBlV05JX1NNRV9ORUlHSEJPUl9SRVBPUlRfUkVRX0lORDoKKwljYXNlIGVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVTUF9YTUlUX0lORDoKKyNlbmRpZgorI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0VTRQorCWNhc2UgZVdOSV9TTUVfRVNFX0FESkFDRU5UX0FQX1JFUE9SVDoKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJY2FzZSBlV05JX1NNRV9GVF9VUERBVEVfS0VZOgorCWNhc2UgZVdOSV9TTUVfRlRfUFJFX0FVVEhfUkVROgorCWNhc2UgZVdOSV9TTUVfRlRfQUdHUl9RT1NfUkVROgorI2VuZGlmCisJY2FzZSBlV05JX1NNRV9SRUdJU1RFUl9NR01UX0ZSQU1FX1JFUToKKwljYXNlIGVXTklfU01FX1VQREFURV9OT0E6CisJY2FzZSBlV05JX1NNRV9DTEVBUl9ERlNfQ0hBTk5FTF9MSVNUOgorCWNhc2UgZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUkVROgorI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKwljYXNlIGVXTklfU01FX0dFVF9UU01fU1RBVFNfUkVROgorI2VuZGlmICAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisJLyogVGhlc2UgbWVzc2FnZXMgYXJlIGZyb20gSERELk5vIG5lZWQgdG8gcmVzcG9uZCB0byBIREQgKi8KKwkJbGltX3Byb2Nlc3Nfbm9ybWFsX2hkZF9tc2cobWFjX2N0eCwgbXNnLCBmYWxzZSk7CisJCWJyZWFrOworCisJY2FzZSBlV05JX1BNQ19TTVBTX1NUQVRFX0lORDoKKwkJaWYgKG1zZy0+Ym9keXB0cikgeworCQkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQl9CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfU0VORF9BQ1RJT05fRlJBTUVfSU5EOgorCQlsaW1fc2VuZF9wMnBfYWN0aW9uX2ZyYW1lKG1hY19jdHgsIG1zZyk7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0FCT1JUX1JFTUFJTl9PTl9DSEFOX0lORDoKKwkJcDJwX21zZyA9ICh0U2lyTWJNc2dQMnAgKikgbXNnLT5ib2R5cHRyOworCQlsaW1fYWJvcnRfcmVtYWluX29uX2NoYW4obWFjX2N0eCwgcDJwX21zZy0+c2Vzc2lvbklkLAorCQkJcDJwX21zZy0+c2Nhbl9pZCk7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFNJUl9IQUxfUDJQX05PQV9TVEFSVF9JTkQ6CisJCXNlc3Npb25fZW50cnkgPSAmbWFjX2N0eC0+bGltLmdwU2Vzc2lvblswXTsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCAiTElNIHJlY2VpdmVkIE5PQSBzdGFydCAleCIsIG1zZy0+dHlwZSk7CisKKwkJLyogU2luY2UgaW5zZXJ0IE5PQSBpcyBkb25lIGFuZCBOT0Egc3RhcnQgbXNnIHJlY2VpdmVkLAorCQkgKiB3ZSBzaG91bGQgZGVhY3RpdmF0ZSB0aGUgSW5zZXJ0IE5PQSB0aW1lcgorCQkgKi8KKwkJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihtYWNfY3R4LAorCQkJZUxJTV9JTlNFUlRfU0lOR0xFU0hPVF9OT0FfVElNRVIpOworCisJCWZvciAoaSA9IDA7IGkgPCBtYWNfY3R4LT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQkJc2Vzc2lvbl9lbnRyeSA9ICZtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldOworCQkJaWYgKChzZXNzaW9uX2VudHJ5ICE9IE5VTEwpICYmIChzZXNzaW9uX2VudHJ5LT52YWxpZCkgJiYKKwkJCQkoc2Vzc2lvbl9lbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkpIHsKKwkJCQkvKiBTYXZlIFAyUCBOT0Egc3RhcnQgYXR0cmlidXRlIGZvciBHbyBwZXJzb25hKi8KKwkJCQlwMnBfZ29fZXhpc3RzID0gMTsKKwkJCQljZGZfbWVtX2NvcHkoJnNlc3Npb25fZW50cnktPnAycEdvUHNOb2FTdGFydEluZCwKKwkJCQkJbXNnLT5ib2R5cHRyLCBzaXplb2YodFNpclAyUE5vYVN0YXJ0KSk7CisJCQkJY2RmX3N0YXR1cyA9CisJCQkJCXNlc3Npb25fZW50cnktPnAycEdvUHNOb2FTdGFydEluZC5zdGF0dXM7CisJCQkJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgTE9HVywKKwkJCQkJCUZMKAorCQkJCQkJIkdPIE5PQSBzdGFydCBzdGF0dXMgJWQgYnkgRlciKSwKKwkJCQkJCWNkZl9zdGF0dXMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHAycF9nb19leGlzdHMgPT0gMCkKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBMT0dXLAorCQkJCUZMKAorCQkJCSJHTyBpcyByZW1vdmVkIGJ5IHRoZSB0aW1lIE5PQSBzdGFydCByZWN2ZCIpKTsKKworCQkvKiBXZSByZWNlaXZlZCB0aGUgTk9BIHN0YXJ0IGluZGljYXRpb24uIE5vdyB3ZSBjYW4gc2VuZCBkb3duCisJCSAqIHRoZSBTTUUgcmVxdWVzdCB3aGljaCByZXF1aXJlcyBvZmYtY2hhbm5lbCBvcGVyYXRpb24gKi8KKwkJbGltX3Byb2Nlc3NfcmVnZF9kZWZkX3NtZV9yZXFfYWZ0ZXJfbm9hX3N0YXJ0KG1hY19jdHgpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwljYXNlIFNJUl9IQUxfVERMU19JTkQ6CisJCXRkbHNfaW5kID0gKHRwU2lyVGRsc0luZCkgbXNnLT5ib2R5cHRyOworCQlzZXNzaW9uX2VudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3N0YV9pZChtYWNfY3R4LAorCQkJdGRsc19pbmQtPnN0YUlkeCwgJnNlc3Npb25faWQpOworCQlpZiAoc2Vzc2lvbl9lbnRyeSA9PSBOVUxMKSB7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJCQlGTCgiTm8gc2Vzc2lvbiBleGlzdCBmb3IgZ2l2ZW4gYnNzSWQiKSk7CisJCQkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCQkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJCQlyZXR1cm47CisJCQl9CisJCXN0YV9kcyA9IGRwaF9nZXRfaGFzaF9lbnRyeShtYWNfY3R4LCB0ZGxzX2luZC0+YXNzb2NJZCwKKwkJCSZzZXNzaW9uX2VudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJCWlmIChzdGFfZHMgPT0gTlVMTCkgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQkJRkwoIk5vIHN0YV9kcyBleGlzdCBmb3IgZ2l2ZW4gc3RhSWQiKSk7CisJCQkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCQkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmIChTVEFfRU5UUllfVERMU19QRUVSID09IHN0YV9kcy0+c3RhVHlwZSkgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJRkwoInJjdmQgVERMUyBJTkQgZnJvbSBGVyB3aXRoIFJDICVkICIpLAorCQkJCQl0ZGxzX2luZC0+cmVhc29uQ29kZSk7CisJCQkJbGltX3NlbmRfc21lX3RkbHNfZGVsX3N0YV9pbmQobWFjX2N0eCwgc3RhX2RzLAorCQkJCQlzZXNzaW9uX2VudHJ5LCB0ZGxzX2luZC0+cmVhc29uQ29kZSk7CisJCQl9CisJCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJCW1zZy0+Ym9keXB0ciA9IE5VTEw7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBTSVJfSEFMX1AyUF9OT0FfQVRUUl9JTkQ6CisJCXNlc3Npb25fZW50cnkgPSAmbWFjX2N0eC0+bGltLmdwU2Vzc2lvblswXTsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiUmVjZWl2ZWQgbWVzc2FnZSBOb2FfQVRUUiAleCIpLAorCQkJbXNnLT50eXBlKTsKKwkJZm9yIChpID0gMDsgaSA8IG1hY19jdHgtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCQlzZXNzaW9uX2VudHJ5ID0gJm1hY19jdHgtPmxpbS5ncFNlc3Npb25baV07CisJCQlpZiAoKHNlc3Npb25fZW50cnkgIT0gTlVMTCkgJiYgKHNlc3Npb25fZW50cnktPnZhbGlkKQorCQkJCSYmIChzZXNzaW9uX2VudHJ5LT5wZVBlcnNvbmEgPT0KKwkJCQlDREZfUDJQX0dPX01PREUpKSB7IC8qIFNhdmUgUDJQIGF0dHIgZm9yIEdvICovCisJCQkJCWNkZl9tZW1fY29weSgKKwkJCQkJCSZzZXNzaW9uX2VudHJ5LT5wMnBHb1BzVXBkYXRlLAorCQkJCQkJbXNnLT5ib2R5cHRyLAorCQkJCQkJc2l6ZW9mKHRTaXJQMlBOb2FBdHRyKSk7CisJCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJCQkJCUZMKCJic3NJZCIKKwkJCQkJCU1BQ19BRERSRVNTX1NUUgorCQkJCQkJIiBjdFdpbj0lZCBvcHBQc0ZsYWc9JWQiKSwKKwkJCQkJCU1BQ19BRERSX0FSUkFZKAorCQkJCQkJCXNlc3Npb25fZW50cnktPmJzc0lkKSwKKwkJCQkJCXNlc3Npb25fZW50cnktPnAycEdvUHNVcGRhdGUuY3RXaW4sCisJCQkJCQlzZXNzaW9uX2VudHJ5LT5wMnBHb1BzVXBkYXRlLm9wcFBzRmxhZyk7CisJCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJCQkJCUZMCisJCQkJCQkoIiB1Tm9hMUludGVydmFsQ250PSVkIHVOb2ExRHVyYXRpb249JWQgdU5vYTFJbnRlcnZhbD0lZCB1Tm9hMVN0YXJ0VGltZT0lZCIpLAorCQkJCQkJc2Vzc2lvbl9lbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMUludGVydmFsQ250LAorCQkJCQkJc2Vzc2lvbl9lbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMUR1cmF0aW9uLAorCQkJCQkJc2Vzc2lvbl9lbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMUludGVydmFsLAorCQkJCQkJc2Vzc2lvbl9lbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMVN0YXJ0VGltZSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFdNQV9NSVNTRURfQkVBQ09OX0lORDoKKwkJbGltX3BzX29mZmxvYWRfaGFuZGxlX21pc3NlZF9iZWFjb25faW5kKG1hY19jdHgsIG1zZyk7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJY2FzZSBXTUFfUk9BTV9PRkZMT0FEX1NZTkNIX0lORDoKKwkJbGltX3JvYW1fb2ZmbG9hZF9zeW5jaF9pbmQobWFjX2N0eCwgbXNnKTsKKwkJLyogYm9keVB0ciBpcyBmcmVlZCBhZnRlciBoYW5kbGluZworCQkgKiBlV05JX1NNRV9ST0FNX09GRkxPQURfU1lOQ0hfSU5EIGluIHNtZV9Qcm9jZXNzTXNnICovCisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBTSVJfTElNX0FERFRTX1JTUF9USU1FT1VUOgorCQlsaW1fcHJvY2Vzc19zbWVfcmVxX21lc3NhZ2VzKG1hY19jdHgsIG1zZyk7CisJCWJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwljYXNlIFNJUl9MSU1fRVNFX1RTTV9USU1FT1VUOgorI2lmbmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAorCQlsaW1Qcm9jZXNzVHNtVGltZW91dEhhbmRsZXIobWFjX2N0eCwgbXNnKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworCQlicmVhazsKKwljYXNlIFdNQV9UU01fU1RBVFNfUlNQOgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECisJCWxpbV9zZW5kX3NtZV9wZV9lc2VfdHNtX3JzcChtYWNfY3R4LAorCQkJKHRBbmlHZXRUc21TdGF0c1JzcCAqKSBtc2ctPmJvZHlwdHIpOworI2Vsc2UKKwkJbGltUHJvY2Vzc0hhbEVzZVRzbVJzcChtYWNfY3R4LCBtc2cpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBXTUFfQUREX1RTX1JTUDoKKwkJbGltX3Byb2Nlc3NfaGFsX2FkZF90c19yc3AobWFjX2N0eCwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX0RFTF9UU19JTkQ6CisJCWxpbV9wcm9jZXNzX2RlbF90c19pbmQobWFjX2N0eCwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX0JFQUNPTl9HRU5fSU5EOgorCQlpZiAobWFjX2N0eC0+bGltLmdMaW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkKKwkJCXNjaF9wcm9jZXNzX3ByZV9iZWFjb25faW5kKG1hY19jdHgsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgU0lSX0xJTV9ERUxFVEVfU1RBX0NPTlRFWFRfSU5EOgorCQlsaW1fZGVsZXRlX3N0YV9jb250ZXh0KG1hY19jdHgsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgU0lSX0xJTV9QRVJJT0RJQ19QUk9CRV9SRVFfVElNRU9VVDoKKwljYXNlIFNJUl9MSU1fSk9JTl9GQUlMX1RJTUVPVVQ6CisJY2FzZSBTSVJfTElNX1BFUklPRElDX0pPSU5fUFJPQkVfUkVRX1RJTUVPVVQ6CisJY2FzZSBTSVJfTElNX0FVVEhfRkFJTF9USU1FT1VUOgorCWNhc2UgU0lSX0xJTV9BVVRIX1JTUF9USU1FT1VUOgorCWNhc2UgU0lSX0xJTV9BU1NPQ19GQUlMX1RJTUVPVVQ6CisJY2FzZSBTSVJfTElNX1JFQVNTT0NfRkFJTF9USU1FT1VUOgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJY2FzZSBTSVJfTElNX0ZUX1BSRUFVVEhfUlNQX1RJTUVPVVQ6CisjZW5kaWYKKwljYXNlIFNJUl9MSU1fUkVNQUlOX0NITl9USU1FT1VUOgorCWNhc2UgU0lSX0xJTV9JTlNFUlRfU0lOR0xFU0hPVF9OT0FfVElNRU9VVDoKKwljYXNlIFNJUl9MSU1fRElTQVNTT0NfQUNLX1RJTUVPVVQ6CisJY2FzZSBTSVJfTElNX0RFQVVUSF9BQ0tfVElNRU9VVDoKKwljYXNlIFNJUl9MSU1fQ09OVkVSVF9BQ1RJVkVfQ0hBTk5FTF9UT19QQVNTSVZFOgorCQkvKiBUaGVzZSB0aW1lb3V0IG1lc3NhZ2VzIGFyZSBoYW5kbGVkIGJ5IE1MTSBzdWIgbW9kdWxlICovCisJCWxpbV9wcm9jZXNzX21sbV9yZXFfbWVzc2FnZXMobWFjX2N0eCwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX0hFQVJUX0JFQVRfVElNRU9VVDoKKwkJLyoqIGNoZWNrIGlmIGhlYXJ0IGJlYXQgZmFpbGVkLCBldmVuIGlmIG9uZSBCZWFjb24KKwkJICogaXMgcmN2ZCB3aXRoaW4gdGhlIEhlYXJ0IEJlYXQgaW50ZXJ2YWwgY29udGludWUKKwkJICogbm9ybWFsIHByb2Nlc3NpbmcKKwkJICovCisJCWlmIChOVUxMID09IG1zZy0+Ym9keXB0cikKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiQ2FuJ3QgUHJvY2VzcyBIQiBUTyAtIGJvZHlwdHIgaXMgTnVsbCIpKTsKKwkJZWxzZSB7CisJCQlzZXNzaW9uX2VudHJ5ID0gKHRwUEVTZXNzaW9uKSBtc2ctPmJvZHlwdHI7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwKKwkJCQkoIlNJUl9MSU1fSEVBUlRfQkVBVF9USU1FT1VULCBTZXNzaW9uICVkIiksCisJCQkJKCh0cFBFU2Vzc2lvbikgbXNnLT5ib2R5cHRyKS0+cGVTZXNzaW9uSWQpOworCQkJbGltUmVzZXRIQlBrdENvdW50KHNlc3Npb25fZW50cnkpOworCQkJbGltX2hhbmRsZV9oZWFydF9iZWF0X3RpbWVvdXRfZm9yX3Nlc3Npb24obWFjX2N0eCwKKwkJCQkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNJUl9MSU1fUFJPQkVfSEJfRkFJTFVSRV9USU1FT1VUOgorCQlsaW1faGFuZGxlX2hlYXJ0X2JlYXRfZmFpbHVyZV90aW1lb3V0KG1hY19jdHgpOworCQlicmVhazsKKwljYXNlIFNJUl9MSU1fSEFTSF9NSVNTX1RIUkVTX1RJTUVPVVQ6CisJCW1hY19jdHgtPmxpbS5nTGltRGlzYXNzb2NGcmFtZUNyZWRpdCA9IDA7CisJCWJyZWFrOworCWNhc2UgU0lSX0xJTV9DTkZfV0FJVF9USU1FT1VUOgorCQkvKiBEb2VzIG5vdCByZWNlaXZlIENORiBvciBkdW1teSBwYWNrZXQgKi8KKwkJbGltX2hhbmRsZV9jbmZfd2FpdF90aW1lb3V0KG1hY19jdHgsICh1aW50MTZfdCkgbXNnLT5ib2R5dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX1JFVFJZX0lOVEVSUlVQVF9NU0c6CisJCS8qIE1lc3NhZ2UgZnJvbSBJU1IgdXBvbiBURlAncyBtYXggcmV0cnkgbGltaXQgaW50ZXJydXB0ICovCisJCWJyZWFrOworCWNhc2UgU0lSX0xJTV9JTlZfS0VZX0lOVEVSUlVQVF9NU0c6CisJCS8qIE1lc3NhZ2UgZnJvbSBJU1IgdXBvbiBTUCdzIEludmFsaWQgc2Vzc2lvbiBrZXkgaW50ZXJydXB0ICovCisJCWJyZWFrOworCWNhc2UgU0lSX0xJTV9LRVlfSURfSU5URVJSVVBUX01TRzoKKwkJLyogTWVzc2FnZSBmcm9tIElTUiB1cG9uIFNQJ3MgSW52YWxpZCBrZXkgSUQgaW50ZXJydXB0ICovCisJCWJyZWFrOworCWNhc2UgU0lSX0xJTV9SRVBMQVlfVEhSRVNfSU5URVJSVVBUX01TRzoKKwkJLyogTWVzc2FnZSBmcm9tIElTUiB1cG9uIFNQJ3MgUmVwbGF5IHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX0NIQU5ORUxfU1dJVENIX1RJTUVPVVQ6CisJCWxpbV9wcm9jZXNzX2NoYW5uZWxfc3dpdGNoX3RpbWVvdXQobWFjX2N0eCk7CisJCWJyZWFrOworCWNhc2UgU0lSX0xJTV9RVUlFVF9USU1FT1VUOgorCQlsaW1fcHJvY2Vzc19xdWlldF90aW1lb3V0KG1hY19jdHgpOworCQlicmVhazsKKwljYXNlIFNJUl9MSU1fUVVJRVRfQlNTX1RJTUVPVVQ6CisJCWxpbV9wcm9jZXNzX3F1aWV0X2Jzc190aW1lb3V0KG1hY19jdHgpOworCQlicmVhazsKKwljYXNlIFNJUl9MSU1fVVBEQVRFX09MQkNfQ0FDSEVMX1RJTUVPVVQ6CisJCWxpbV9oYW5kbGVfdXBkYXRlX29sYmNfY2FjaGUobWFjX2N0eCk7CisJCWJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJY2FzZSBTSVJfSEFMX1RETFNfU0hPVUxEX0RJU0NPVkVSOgorCWNhc2UgU0lSX0hBTF9URExTX1NIT1VMRF9URUFSRE9XTjoKKwljYXNlIFNJUl9IQUxfVERMU19QRUVSX0RJU0NPTk5FQ1RFRDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJKCIlcyByZWNlaXZlZCB0ZGxzIGV2ZW50OiAweCV4IiksIF9fZnVuY19fLCBtc2ctPnR5cGUpOworCQlsaW1fc2VuZF9zbWVfdGRsc19ldmVudF9ub3RpZnkobWFjX2N0eCwgbXNnLT50eXBlLAorCQkJCQkodm9pZCAqKW1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBXTUFfQUREX0JTU19SU1A6CisJCWxpbV9wcm9jZXNzX21sbV9hZGRfYnNzX3JzcChtYWNfY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIFdNQV9BRERfU1RBX1JTUDoKKwkJbGltX3Byb2Nlc3NfYWRkX3N0YV9yc3AobWFjX2N0eCwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfREVMRVRFX1NUQV9SU1A6CisJCWxpbV9wcm9jZXNzX21sbV9kZWxfc3RhX3JzcChtYWNfY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIFdNQV9ERUxFVEVfQlNTX1JTUDoKKwkJbGltX2hhbmRsZV9kZWxldGVfYnNzX3JzcChtYWNfY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIFdNQV9DU0FfT0ZGTE9BRF9FVkVOVDoKKwkJbGltX2hhbmRsZV9jc2Ffb2ZmbG9hZF9tc2cobWFjX2N0eCwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfU0VUX0JTU0tFWV9SU1A6CisJY2FzZSBXTUFfU0VUX1NUQV9CQ0FTVEtFWV9SU1A6CisJCWxpbV9wcm9jZXNzX21sbV9zZXRfYnNzX2tleV9yc3AobWFjX2N0eCwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfU0VUX1NUQUtFWV9SU1A6CisJCWxpbV9wcm9jZXNzX21sbV9zZXRfc3RhX2tleV9yc3AobWFjX2N0eCwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfR0VUX1NUQVRJU1RJQ1NfUlNQOgorCQlsaW1fc2VuZF9zbWVfcGVfc3RhdGlzdGljc19yc3AobWFjX2N0eCwgbXNnLT50eXBlLAorCQkJCQkgICAgICh2b2lkICopbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfU0VUX01JTU9QU19SU1A6CisJY2FzZSBXTUFfU0VUX1RYX1BPV0VSX1JTUDoKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopbXNnLT5ib2R5cHRyKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBXTUFfU0VUX01BWF9UWF9QT1dFUl9SU1A6CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJCXJybV9zZXRfbWF4X3R4X3Bvd2VyX3JzcChtYWNfY3R4LCBtc2cpOworI2VuZGlmCisJCWlmIChtc2ctPmJvZHlwdHIgIT0gTlVMTCkgeworCQkJY2RmX21lbV9mcmVlKCh2b2lkICopbXNnLT5ib2R5cHRyKTsKKwkJCW1zZy0+Ym9keXB0ciA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX0FERFIyX01JU1NfSU5EOgorCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiQWRkcjIgbWlzbWF0Y2ggaW50ZXJydXB0IHJlY2VpdmVkICVYIiksIG1zZy0+dHlwZSk7CisJCS8qIG1lc3NhZ2UgZnJvbSBIQUwgaW5kaWNhdGluZyBhZGRyMiBtaXNtYXRjaCBpbnRlcnJ1cHQgb2NjdXJyZWQKKwkJICogbXNnLT5ib2R5cHRyIGNvbnRhaW5zIG9ubHkgcG9pbnRlciB0byA0OC1iaXQgYWRkcjIgZmllbGQKKwkJICovCisJCWNkZl9tZW1fZnJlZSgodm9pZCAqKShtc2ctPmJvZHlwdHIpKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwljYXNlIFdNQV9BR0dSX1FPU19SU1A6CisJCWxpbV9wcm9jZXNzX2Z0X2FnZ3JfcW9fc19yc3AobWFjX2N0eCwgbXNnKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFdNQV9TRVRfTElOS19TVEFURV9SU1A6CisJCWxpbmtfc3RhdGVfcGFyYW0gPSAodExpbmtTdGF0ZVBhcmFtcyAqKSBtc2ctPmJvZHlwdHI7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQlzZXNzaW9uX2VudHJ5ID0gbGlua19zdGF0ZV9wYXJhbS0+c2Vzc2lvbjsKKwkJaWYgKGxpbmtfc3RhdGVfcGFyYW0tPmZ0CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJCQkmJiAhc2Vzc2lvbl9lbnRyeS0+YlJvYW1TeW5jaEluUHJvZ3Jlc3MKKyNlbmRpZgorCQkpCisJCQlsaW1fc2VuZF9yZWFzc29jX3JlcV93aXRoX2Z0X2llc19tZ210X2ZyYW1lKG1hY19jdHgsCisJCQkJc2Vzc2lvbl9lbnRyeS0+cExpbU1sbVJlYXNzb2NSZXEsCisJCQkJc2Vzc2lvbl9lbnRyeSk7CisjZW5kaWYKKwkJaWYgKGxpbmtfc3RhdGVfcGFyYW0tPmNhbGxiYWNrKQorCQkJbGlua19zdGF0ZV9wYXJhbS0+Y2FsbGJhY2sobWFjX2N0eCwKKwkJCQlsaW5rX3N0YXRlX3BhcmFtLT5jYWxsYmFja0FyZywKKwkJCQlsaW5rX3N0YXRlX3BhcmFtLT5zdGF0dXMpOworCQljZGZfbWVtX2ZyZWUoKHZvaWQgKikobXNnLT5ib2R5cHRyKSk7CisJCW1zZy0+Ym9keXB0ciA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfU0VUX0JDTl9GSUxURVJfUkVROgorCQlzZXNzaW9uX2lkID0gKHVpbnQ4X3QpIG1zZy0+Ym9keXZhbDsKKwkJc2Vzc2lvbl9lbnRyeSA9ICZtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW3Nlc3Npb25faWRdOworCQlpZiAoKHNlc3Npb25fZW50cnkgIT0gTlVMTCkgJiYKKwkJCShsaW1fc2VuZF9iZWFjb25fZmlsdGVyX2luZm8obWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSkgIT0KKwkJCSBlU0lSX1NVQ0NFU1MpKQorCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJGYWlsaWVkIHRvIHNlbmQgQmVhY29uIEZpbHRlciBJbmZvICIpKTsKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopKG1zZy0+Ym9keXB0cikpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWNhc2UgV01BX1NFVF9URExTX0xJTktfRVNUQUJMSVNIX1JFUV9SU1A6CisJCXRkbHNfbGlua19wYXJhbXMgPSAodFRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zICopIG1zZy0+Ym9keXB0cjsKKwkJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zdGFfaWQobWFjX2N0eCwKKwkJCXRkbHNfbGlua19wYXJhbXMtPnN0YUlkeCwgJnNlc3Npb25faWQpOworCQlpZiAoc2Vzc2lvbl9lbnRyeSA9PSBOVUxMKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoInNlc3Npb24gJXUgZG9lcyBub3QgZXhpc3QiKSwgc2Vzc2lvbl9pZCk7CisJCQkvKiBTdGlsbCBzZW5kIHRoZSBlV05JX1NNRV9URExTX0xJTktfRVNUQUJMSVNIX1JTUAorCQkJICogbWVzc2FnZSB0byBTTUUgd2l0aCBzZXNzaW9uIGlkIGFzIHplcm8gYW5kIHN0YXR1cworCQkJICogYXMgRkFJTFVSRSBzbywgdGhhdCBtZXNzYWdlIHF1ZXVlZCBpbiBTTUUgcXVldWUKKwkJCSAqIGNhbiBiZSBmcmVlZCB0byBwcmV2ZW50IHRoZSBTTUUgY21kIGJ1ZmZlciBsZWFrCisJCQkgKi8KKwkJCWxpbV9zZW5kX3NtZV90ZGxzX2xpbmtfZXN0YWJsaXNoX3JlcV9yc3AobWFjX2N0eCwgMCwKKwkJCQlOVUxMLCBOVUxMLCBlU0lSX0ZBSUxVUkUpOworCQl9IGVsc2UgeworCQkJbGltX3NlbmRfc21lX3RkbHNfbGlua19lc3RhYmxpc2hfcmVxX3JzcChtYWNfY3R4LAorCQkJCXNlc3Npb25fZW50cnktPnNtZVNlc3Npb25JZCwgTlVMTCwgTlVMTCwKKwkJCQl0ZGxzX2xpbmtfcGFyYW1zLT5zdGF0dXMpOworCQl9CisJCWNkZl9tZW1fZnJlZSgodm9pZCAqKShtc2ctPmJvZHlwdHIpKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFdNQV9SWF9TQ0FOX0VWRU5UOgorCQlsaW1fcHJvY2Vzc19yeF9zY2FuX2V2ZW50KG1hY19jdHgsIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0lCU1NfUEVFUl9JTkFDVElWSVRZX0lORDoKKwkJbGltX3Byb2Nlc3NfaWJzc19wZWVyX2luYWN0aXZpdHkobWFjX2N0eCwgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopKG1zZy0+Ym9keXB0cikpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFdNQV9ERlNfUkFEQVJfSU5EOgorCQlsaW1fc2VuZF9zbWVfZGZzX2V2ZW50X25vdGlmeShtYWNfY3R4LCBtc2ctPnR5cGUsCisJCQkJKHZvaWQgKiltc2ctPmJvZHlwdHIpOworCQkvKiBtc2ctPmJvZHlwdHIgd2lsbCBiZSBmcmVlZCB1cCBieSBTTUUvQ1NSICovCisJCWJyZWFrOworCWNhc2UgV01BX0RGU19CRUFDT05fVFhfU1VDQ0VTU19JTkQ6CisJCWxpbV9wcm9jZXNzX2JlYWNvbl90eF9zdWNjZXNzX2luZChtYWNfY3R4LCBtc2ctPnR5cGUsCisJCQkJKHZvaWQgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUoKHZvaWQgKiltc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFdNQV9ESVNBU1NPQ19UWF9DT01QOgorCQlsaW1fZGlzYXNzb2NfdHhfY29tcGxldGVfY25mKG1hY19jdHgsIG1zZy0+Ym9keXZhbCk7CisJCWJyZWFrOworCWNhc2UgV01BX0RFQVVUSF9UWF9DT01QOgorCQlsaW1fZGVhdXRoX3R4X2NvbXBsZXRlX2NuZihtYWNfY3R4LCBtc2ctPmJvZHl2YWwpOworCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKwljYXNlIFdNQV9VUERBVEVfUTJRX0lFX0lORDoKKwkJY2RmX21lbV96ZXJvKCZiZWFjb25fcGFyYW1zLCBzaXplb2YodFVwZGF0ZUJlYWNvblBhcmFtcykpOworCQliZWFjb25fcGFyYW1zLnBhcmFtQ2hhbmdlQml0bWFwID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG1hY19jdHgtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCQl2ZGV2X2lkID0gKCh1aW50OF90ICopbXNnLT5ib2R5cHRyKVtpXTsKKwkJCXNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc21lX3Nlc3Npb25faWQoCisJCQkJbWFjX2N0eCwgdmRldl9pZCk7CisJCQlpZiAoc2Vzc2lvbl9lbnRyeSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJc2Vzc2lvbl9lbnRyeS0+c2FwX2FkdmVydGlzZV9hdm9pZF9jaF9pZSA9CisJCQkJKHVpbnQ4X3QpbXNnLT5ib2R5dmFsOworCQkJLyoKKwkJCSAqIGlmIG1lc3NhZ2UgY29tZXMgZm9yIERGUyBjaGFubmVsLCBubyBuZWVkIHRvIHVwZGF0ZToKKwkJCSAqIDEpIFdlIHdvbnQgaGF2ZSBNQ0Mgd2l0aCBERlMgY2hhbm5lbHMuIHNvIG5vIG5lZWQgdG8KKwkJCSAqICAgIGFkZCBRMlEgSUUKKwkJCSAqIDIpIFdlIGNhbm5vdCBlbmQgdXAgaW4gREZTIGNoYW5uZWwgU0NDIGJ5IGNoYW5uZWwKKwkJCSAqICAgIHN3aXRjaCBmcm9tIG5vbiBERlMgTUNDIHNjZW5hcmlvLCBzbyBubyBuZWVkIHRvCisJCQkgKiAgICByZW1vdmUgUTJRIElFCisJCQkgKiAzKSBUaGVyZSBpcyBob3dldmVyIGEgY2FzZSB3aGVyZSBkZXZpY2Ugc3RhcnQgTUNDIGFuZAorCQkJICogICAgdGhlbiB1c2VyIG1vZGlmaWVzIGhvc3RhcGQuY29uZiBhbmQgZG9lcyBTQVAKKwkJCSAqICAgIHJlc3RhcnQsIGluIHN1Y2ggYSBjYXNlLCBiZWFjb24gcGFyYW1zIHdpbGwgYmUKKwkJCSAqICAgIHJlc2V0IGFuZCB0aHVzIHdpbGwgbm90IGNvbnRhaW4gUTJRIElFLCBieSBkZWZhdWx0CisJCQkgKi8KKwkJCWlmIChjZHNfZ2V0X2NoYW5uZWxfc3RhdGUoCisJCQkJCXNlc3Npb25fZW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCkKKwkJCQkJIT0gQ0hBTk5FTF9TVEFURV9ERlMpIHsKKwkJCQliZWFjb25fcGFyYW1zLmJzc0lkeCA9IHNlc3Npb25fZW50cnktPmJzc0lkeDsKKwkJCQliZWFjb25fcGFyYW1zLmJlYWNvbkludGVydmFsID0KKwkJCQkJc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmJlYWNvbkludGVydmFsOworCQkJCWJlYWNvbl9wYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQkJUEFSQU1fQkNOX0lOVEVSVkFMX0NIQU5HRUQ7CisJCQkJc2NoX3NldF9maXhlZF9iZWFjb25fZmllbGRzKG1hY19jdHgsCisJCQkJCXNlc3Npb25fZW50cnkpOworCQkJCWxpbV9zZW5kX2JlYWNvbl9wYXJhbXMobWFjX2N0eCwgJmJlYWNvbl9wYXJhbXMsCisJCQkJCXNlc3Npb25fZW50cnkpOworCQkJfQorCQl9CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKwljYXNlIGVXTklfU01FX05TU19VUERBVEVfUkVROgorCWNhc2UgZVdOSV9TTUVfREZTX0JFQUNPTl9DSEFOX1NXX0lFX1JFUToKKwkJbGltX3Byb2Nlc3Nfc21lX3JlcV9tZXNzYWdlcyhtYWNfY3R4LCBtc2cpOworCQljZGZfbWVtX2ZyZWUoKHZvaWQgKiltc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0NIQU5ORUxfQ0hBTkdFX1JFUToKKwkJbGltX3Byb2Nlc3Nfc21lX3JlcV9tZXNzYWdlcyhtYWNfY3R4LCBtc2cpOworCQljZGZfbWVtX2ZyZWUoKHZvaWQgKiltc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX1NUQVJUX0JFQUNPTl9SRVE6CisJCWxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMobWFjX2N0eCwgbXNnKTsKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopbXNnLT5ib2R5cHRyKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9VUERBVEVfQURESVRJT05BTF9JRVM6CisJCWxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMobWFjX2N0eCwgbXNnKTsKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopbXNnLT5ib2R5cHRyKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9NT0RJRllfQURESVRJT05BTF9JRVM6CisJCWxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMobWFjX2N0eCwgbXNnKTsKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopbXNnLT5ib2R5cHRyKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJYnJlYWs7CisjaWZkZWYgUUNBX0hUXzIwNDBfQ09FWAorCWNhc2UgZVdOSV9TTUVfU0VUX0hUXzIwNDBfTU9ERToKKwkJbGltX3Byb2Nlc3Nfc21lX3JlcV9tZXNzYWdlcyhtYWNfY3R4LCBtc2cpOworCQljZGZfbWVtX2ZyZWUoKHZvaWQgKiltc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgU0lSX0hBTF9TT0NfU0VUX0hXX01PREVfUkVTUDoKKwkJbGltX3Byb2Nlc3Nfc2V0X2h3X21vZGVfcmVzcChtYWNfY3R4LCBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUoKHZvaWQgKiltc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFNJUl9IQUxfU09DX0hXX01PREVfVFJBTlNfSU5EOgorCQlsaW1fcHJvY2Vzc19od19tb2RlX3RyYW5zX2luZChtYWNfY3R4LCBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUoKHZvaWQgKiltc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFNJUl9IQUxfU09DX0RVQUxfTUFDX0NGR19SRVNQOgorCQlsaW1fcHJvY2Vzc19kdWFsX21hY19jZmdfcmVzcChtYWNfY3R4LCBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUoKHZvaWQgKiltc2ctPmJvZHlwdHIpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX1NFVF9JRV9SRVE6CisJCWxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMobWFjX2N0eCwgbXNnKTsKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopbXNnLT5ib2R5cHRyKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopbXNnLT5ib2R5cHRyKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJLyogVW53YW50ZWQgbWVzc2FnZXMgKi8KKwkJLyogTG9nIGVycm9yICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJEaXNjYXJkaW5nIHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCAlWCIpLAorCQkJbXNnLT50eXBlKTsKKwkJbGltX3ByaW50X21zZ19uYW1lKG1hY19jdHgsIExPR0UsIG1zZy0+dHlwZSk7CisJCWJyZWFrOworCisJfSAvKiBzd2l0Y2ggKG1zZy0+dHlwZSkgKi8KK30gLyoqKiBlbmQgbGltX3Byb2Nlc3NfbWVzc2FnZXMoKSAqKiovCisKKy8qKgorICogbGltX3Byb2Nlc3NfZGVmZXJyZWRfbWVzc2FnZV9xdWV1ZQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IExJTSB3aGlsZSBleGl0aW5nIGZyb20gTGVhcm4KKyAqIG1vZGUuIFRoaXMgZnVuY3Rpb24gZmV0Y2hlcyBtZXNzYWdlcyBwb3N0ZWQgdG8gdGhlIExJTQorICogZGVmZXJyZWQgbWVzc2FnZSBxdWV1ZSBsaW1EZWZlcnJlZE1zZ1EuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX3Byb2Nlc3NfZGVmZXJyZWRfbWVzc2FnZV9xdWV1ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRTaXJNc2dRIGxpbU1zZyA9IHsgMCwgMCwgMCB9OworCisJdFNpck1zZ1EgKnJlYWRNc2c7CisJdWludDE2X3Qgc2l6ZTsKKworCS8qCisJKiogY2hlY2sgYW55IGRlZmVycmVkIG1lc3NhZ2VzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCisJKiovCisJc2l6ZSA9IHBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemU7CisJaWYgKHNpemUgPiAwKSB7CisJCXdoaWxlICgocmVhZE1zZyA9IGxpbV9yZWFkX2RlZmVycmVkX21zZ19xKHBNYWMpKSAhPSBOVUxMKSB7CisJCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJmxpbU1zZywKKwkJCQkgICAgICh1aW50OF90ICopIHJlYWRNc2csIHNpemVvZih0U2lyTXNnUSkpOworCQkJc2l6ZS0tOworCQkJbGltX3Byb2Nlc3NfbWVzc2FnZXMocE1hYywgJmxpbU1zZyk7CisKKwkJCWlmICgobGltX2lzX3N5c3RlbV9pbl9zY2FuX3N0YXRlKHBNYWMpKQorCQkJICAgIHx8ICh0cnVlICE9IEdFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMpKQorCQkJICAgIHx8IChwTWFjLT5saW0uZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSkpCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9IC8qKiogZW5kIGxpbV9wcm9jZXNzX2RlZmVycmVkX21lc3NhZ2VfcXVldWUoKSAqKiovCisKKy8qKgorICogbGltX3Byb2Nlc3Nfbm9ybWFsX2hkZF9tc2coKSAtIFByb2Nlc3MgdGhlIG1lc3NhZ2UgYW5kIGRlZmVyIGlmIG5lZWRlZAorICogQG1hY19jdHggOiAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1zZyAgICAgOiAgICAgVGhlIG1lc3NhZ2UgbmVlZCB0byBiZSBwcm9jZXNzZWQKKyAqIEByc3BfcmVxZDogICAgIHdoZXRoZXIgcmV0dXJuIHJlc3VsdCB0byBoZGQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgY3VycmVudCBsaW0gc3RhdGUgYW5kIGRlY2lkZSB3aGV0aGVyIHRoZSBtZXNzYWdlCisgKiBwYXNzZWQgd2lsbCBiZSBkZWZlcnJlZCBvciBub3QuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX25vcm1hbF9oZGRfbXNnKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRTaXJNc2dRICptc2csCisJdWludDhfdCByc3BfcmVxZCkKK3sKKwlib29sIGRlZmVyX21zZyA9IHRydWU7CisKKwkvKiBBZGRlZCBGb3IgQlQtQU1QIFN1cHBvcnQgKi8KKwlpZiAoKG1hY19jdHgtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisJCXx8IChtYWNfY3R4LT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkKKwkJfHwgKG1hY19jdHgtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSkKKwkJfHwgKG1hY19jdHgtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX1VOS05PV05fUk9MRSkpIHsKKwkJLyoKKwkJICogVGhpcyBjaGVjayBpcyByZXF1aXJlZCBvbmx5IGZvciB0aGUgQVAgYW5kIGluIDIgY2FzZXMuCisJCSAqIDEuIElmIHdlIGFyZSBpbiBsZWFybiBtb2RlIGFuZCB3ZSByZWNlaXZlIGFueSBvZiB0aGVzZQorCQkgKiBtZXNzYWdlcywgeW91IGhhdmUgdG8gY29tZSBvdXQgb2Ygc2NhbiBhbmQgcHJvY2VzcyB0aGUKKwkJICogbWVzc2FnZSwgaGVuY2UgZG9udCBkZWZlciB0aGUgbWVzc2FnZSBoZXJlLiBJbiBoYW5kbGVyLAorCQkgKiB0aGVzZSBtZXNzYWdlIGNvdWxkIGJlIGRlZmVyZWQgdGlsbCB3ZSBhY3R1YWxseSBjb21lIG91dCBvZgorCQkgKiBzY2FuIG1vZGUuCisJCSAqIDIuIElmIHJhZGFyIGlzIGRldGVjdGVkLCB5b3UgbWlnaHQgaGF2ZSB0byBkZWZlciBhbGwgb2YKKwkJICogdGhlc2UgbWVzc2FnZXMgZXhjZXB0IFN0b3AgQlNTIHJlcXVlc3QvIFN3aXRjaCBjaGFubmVsCisJCSAqIHJlcXVlc3QuIFRoaXMgZGVjaXNpb24gaXMgYWxzbyBtYWRlIGluc2lkZSBpdHMgaGFuZGxlci4KKwkJICoKKwkJICogUGxlYXNlIGJlIGNhcmVmdWwgd2hpbGUgdXNpbmcgdGhlIGZsYWcgZGVmZXJfbXNnLiBQb3NzaWJseQorCQkgKiB5b3UgbWlnaHQgZW5kIHVwIGluIGFuIGluZmluaXRlIGxvb3AuCisJCSAqLworCQlpZiAoKG1zZy0+dHlwZSA9PSBlV05JX1NNRV9TVEFSVF9CU1NfUkVRKSB8fAorCQkJKG1zZy0+dHlwZSA9PSBlV05JX1NNRV9TVE9QX0JTU19SRVEpIHx8CisJCQkobXNnLT50eXBlID09IGVXTklfU01FX1NXSVRDSF9DSExfSU5EKSkKKwkJCWRlZmVyX21zZyA9IGZhbHNlOworCX0KKworCWlmICgoKG1hY19jdHgtPmxpbS5nTGltQWRkdHNTZW50KSB8fAorCQkobGltX2lzX3N5c3RlbV9pbl9zY2FuX3N0YXRlKG1hY19jdHgpKSkgJiYgZGVmZXJfbXNnKSB7CisJCS8qCisJCSAqIFN5c3RlbSBpcyBpbiBERlMgKExlYXJuKSBtb2RlIG9yIGF3YWl0aW5nIGFkZHRzIHJlc3BvbnNlIG9yCisJCSAqIGlmIHJhZGFyIGlzIGRldGVjdGVkLCBEZWZlciBwcm9jZXNzc2luZyB0aGlzIG1lc3NhZ2UKKwkJICovCisJCWlmIChsaW1fZGVmZXJfbXNnKG1hY19jdHgsIG1zZykgIT0gVFhfU1VDQ0VTUykgeworI2lmZGVmIFdMQU5fREVCVUcKKwkJCW1hY19jdHgtPmxpbS5udW1TbWUrKzsKKyNlbmRpZgorCQkJbGltX2xvZ19zZXNzaW9uX3N0YXRlcyhtYWNfY3R4KTsKKwkJCS8qIFJlbGVhc2UgYm9keSAqLworCQkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlc2UgbWVzc2FnZXMgYXJlIGZyb20gSERELlNpbmNlIHRoZXNlIHJlcXVlc3RzIG1heSBhbHNvIGJlCisJCSAqIGdlbmVyYXRlZCBpbnRlcm5hbGx5IHdpdGhpbiBMSU0gbW9kdWxlLCBuZWVkIHRvIGRpc3RpbnF1aXNoCisJCSAqIGFuZCBzZW5kIHJlc3BvbnNlIHRvIGhvc3QKKwkJICovCisJCWlmIChyc3BfcmVxZCkKKwkJCW1hY19jdHgtPmxpbS5nTGltUnNwUmVxZCA9IHRydWU7CisjaWZkZWYgV0xBTl9ERUJVRworCQltYWNfY3R4LT5saW0ubnVtU21lKys7CisjZW5kaWYKKwkJaWYgKGxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMobWFjX2N0eCwgbXNnKSkgeworCQkJLyoKKwkJCSAqIFJlbGVhc2UgYm9keS4gbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2UgY29uc3VtZWQgdGhlCisJCQkgKiBidWZmZXIuIFdlIGNhbiBmcmVlIGl0LgorCQkJICovCisJCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJCW1zZy0+Ym9keXB0ciA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3ZvaWQKK2hhbmRsZV9odF9jYXBhYmlsaXR5YW5kX2h0X2luZm8oc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsCisJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyBtYWNIVENhcGFiaWxpdHlJbmZvOworCXRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvIG1hY0hUUGFyYW1ldGVyc0luZm87CisJdFNpck1hY0hUSW5mb0ZpZWxkMSBtYWNIVEluZm9GaWVsZDE7CisJdFNpck1hY0hUSW5mb0ZpZWxkMiBtYWNIVEluZm9GaWVsZDI7CisJdFNpck1hY0hUSW5mb0ZpZWxkMyBtYWNIVEluZm9GaWVsZDM7CisJdWludDMyX3QgY2ZnVmFsdWU7CisJdWludDhfdCAqcHRyOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgJmNmZ1ZhbHVlKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIkZhaWwgdG8gcmV0cmlldmUgV05JX0NGR19IVF9DQVBfSU5GTyB2YWx1ZSIpKTsKKwkJcmV0dXJuOworCX0KKwlwdHIgPSAodWludDhfdCAqKSAmbWFjSFRDYXBhYmlsaXR5SW5mbzsKKwkqKCh1aW50MTZfdCAqKSBwdHIpID0gKHVpbnQxNl90KSAoY2ZnVmFsdWUgJiAweGZmZmYpOworCXBNYWMtPmxpbS5nSFRMc2lnVFhPUFByb3RlY3Rpb24gPQorCQkodWludDhfdCkgbWFjSFRDYXBhYmlsaXR5SW5mby5sc2lnVFhPUFByb3RlY3Rpb247CisJcE1hYy0+bGltLmdIVE1JTU9QU1N0YXRlID0KKwkJKHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSkgbWFjSFRDYXBhYmlsaXR5SW5mby5taW1vUG93ZXJTYXZlOworCXBNYWMtPmxpbS5nSFRHcmVlbmZpZWxkID0gKHVpbnQ4X3QpIG1hY0hUQ2FwYWJpbGl0eUluZm8uZ3JlZW5GaWVsZDsKKwlwTWFjLT5saW0uZ0hUTWF4QW1zZHVMZW5ndGggPQorCQkodWludDhfdCkgbWFjSFRDYXBhYmlsaXR5SW5mby5tYXhpbWFsQU1TRFVzaXplOworCXBNYWMtPmxpbS5nSFRTaG9ydEdJMjBNaHogPSAodWludDhfdCkgbWFjSFRDYXBhYmlsaXR5SW5mby5zaG9ydEdJMjBNSHo7CisJcE1hYy0+bGltLmdIVFNob3J0R0k0ME1oeiA9ICh1aW50OF90KSBtYWNIVENhcGFiaWxpdHlJbmZvLnNob3J0R0k0ME1IejsKKwlwTWFjLT5saW0uZ0hUUFNNUFN1cHBvcnQgPSAodWludDhfdCkgbWFjSFRDYXBhYmlsaXR5SW5mby5wc21wOworCXBNYWMtPmxpbS5nSFREc3NzQ2NrUmF0ZTQwTUh6U3VwcG9ydCA9CisJCSh1aW50OF90KSBtYWNIVENhcGFiaWxpdHlJbmZvLmRzc3NDY2tNb2RlNDBNSHo7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNUywgJmNmZ1ZhbHVlKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIkZhaWwgdG8gcmV0cmlldmUgV05JX0NGR19IVF9QQVJBTV9JTkZPIHZhbHVlIikpOworCQlyZXR1cm47CisJfQorCXB0ciA9ICh1aW50OF90ICopICZtYWNIVFBhcmFtZXRlcnNJbmZvOworCSpwdHIgPSAodWludDhfdCkgKGNmZ1ZhbHVlICYgMHhmZik7CisJcE1hYy0+bGltLmdIVEFNcGR1RGVuc2l0eSA9ICh1aW50OF90KSBtYWNIVFBhcmFtZXRlcnNJbmZvLm1wZHVEZW5zaXR5OworCXBNYWMtPmxpbS5nSFRNYXhSeEFNcGR1RmFjdG9yID0KKwkJKHVpbnQ4X3QpIG1hY0hUUGFyYW1ldGVyc0luZm8ubWF4UnhBTVBEVUZhY3RvcjsKKworCS8qIEdldCBIVCBJRSBJbmZvICovCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19IVF9JTkZPX0ZJRUxEMSwgJmNmZ1ZhbHVlKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIkZhaWwgdG8gcmV0cmlldmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMSB2YWx1ZSIpKTsKKwkJcmV0dXJuOworCX0KKwlwdHIgPSAodWludDhfdCAqKSAmbWFjSFRJbmZvRmllbGQxOworCSooKHVpbnQ4X3QgKikgcHRyKSA9ICh1aW50OF90KSAoY2ZnVmFsdWUgJiAweGZmKTsKKwlwTWFjLT5saW0uZ0hUU2VydmljZUludGVydmFsR3JhbnVsYXJpdHkgPQorCQkodWludDhfdCkgbWFjSFRJbmZvRmllbGQxLnNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5OworCXBNYWMtPmxpbS5nSFRDb250cm9sbGVkQWNjZXNzT25seSA9CisJCSh1aW50OF90KSBtYWNIVEluZm9GaWVsZDEuY29udHJvbGxlZEFjY2Vzc09ubHk7CisJcE1hYy0+bGltLmdIVFJpZnNNb2RlID0gKHVpbnQ4X3QpIG1hY0hUSW5mb0ZpZWxkMS5yaWZzTW9kZTsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfSFRfSU5GT19GSUVMRDIsICZjZmdWYWx1ZSkgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJGYWlsIHRvIHJldHJpZXZlIFdOSV9DRkdfSFRfSU5GT19GSUVMRDIgdmFsdWUiKSk7CisJCXJldHVybjsKKwl9CisJcHRyID0gKHVpbnQ4X3QgKikgJm1hY0hUSW5mb0ZpZWxkMjsKKwkqKCh1aW50MTZfdCAqKSBwdHIpID0gKHVpbnQxNl90KSAoY2ZnVmFsdWUgJiAweGZmZmYpOworCXBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9ICh0U2lyTWFjSFRPcGVyYXRpbmdNb2RlKSBtYWNIVEluZm9GaWVsZDIub3BNb2RlOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19IVF9JTkZPX0ZJRUxEMywgJmNmZ1ZhbHVlKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIkZhaWwgdG8gcmV0cmlldmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMyB2YWx1ZSIpKTsKKwkJcmV0dXJuOworCX0KKwlwdHIgPSAodWludDhfdCAqKSAmbWFjSFRJbmZvRmllbGQzOworCSooKHVpbnQxNl90ICopIHB0cikgPSAodWludDE2X3QpIChjZmdWYWx1ZSAmIDB4ZmZmZik7CisJcE1hYy0+bGltLmdIVFBDT0FjdGl2ZSA9ICh1aW50OF90KSBtYWNIVEluZm9GaWVsZDMucGNvQWN0aXZlOworCXBNYWMtPmxpbS5nSFRQQ09QaGFzZSA9ICh1aW50OF90KSBtYWNIVEluZm9GaWVsZDMucGNvUGhhc2U7CisJcE1hYy0+bGltLmdIVFNlY29uZGFyeUJlYWNvbiA9CisJCSh1aW50OF90KSBtYWNIVEluZm9GaWVsZDMuc2Vjb25kYXJ5QmVhY29uOworCXBNYWMtPmxpbS5nSFREdWFsQ1RTUHJvdGVjdGlvbiA9CisJCSh1aW50OF90KSBtYWNIVEluZm9GaWVsZDMuZHVhbENUU1Byb3RlY3Rpb247CisJcE1hYy0+bGltLmdIVFNUQkNCYXNpY01DUyA9ICh1aW50OF90KSBtYWNIVEluZm9GaWVsZDMuYmFzaWNTVEJDTUNTOworCisJLyogVGhlIGxpbSBnbG9iYWxzIGZvciBjaGFubmVsd2lkdGggYW5kIHNlY29uZGFyeSBjaG5sIGhhdmUgYmVlbiByZW1vdmVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nIG5vIHNlc3Npb247CisJICogaW5zdGVhZCBkaXJlY3QgY2ZnIGlzIHJlYWQgYW5kIHVzZWQgd2hlbiBubyBzZXNzaW9uIGZvciB0cmFuc21pc3Npb24gb2YgbWdtdCBmcmFtZXMgKHNhbWUgYXMgb2xkKTsKKwkgKiBGb3Igbm93LCB3ZSBtaWdodCBjb21lIGhlcmUgZHVyaW5nIGluaXQgYW5kIGpvaW4gd2l0aCBzZXNzaW9uRW50cnkgPSBOVUxMOyBpbiB0aGF0IGNhc2UganVzdCBmaWxsIHRoZSBnbG9iYWxzIHdoaWNoIGV4aXN0CisJICogU2Vzc2lvbml6ZWQgZW50cmllcyB2YWx1ZXMgd2lsbCBiZSBmaWxsZWQgaW4gam9pbiBvciBhZGQgYnNzIHJlcS4gVGhlIG9uZXMgd2hpY2ggYXJlIG1pc3NlZCBpbiBqb2luIGFyZSBmaWxsZWQgYmVsb3cKKwkgKi8KKwlpZiAocHNlc3Npb25FbnRyeSAhPSBOVUxMKSB7CisJCXBzZXNzaW9uRW50cnktPmh0Q2FwYWJpbGl0eSA9CisJCQlJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSk7CisJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPQorCQkJKHVpbnQ4X3QpIG1hY0hUSW5mb0ZpZWxkMy5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDsKKwl9Cit9CisKK3ZvaWQgbGltX2xvZ19zZXNzaW9uX3N0YXRlcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4KQoreworI2lmZGVmIFdMQU5fREVCVUcKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtYWNfY3R4LT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQlpZiAobWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIExPRzEsCisJCQkJRkwoInN5c1JvbGUoJWQpIFNlc3Npb24gKCVkKSIpLAorCQkJCW1hY19jdHgtPmxpbS5nTGltU3lzdGVtUm9sZSwgaSk7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgTE9HMSwKKwkJCQlGTCgiU01FOiBDdXJyICVzLFByZXYgJXMsTUxNOiBDdXJyICVzLFByZXYgJXMiKSwKKwkJCQlsaW1fc21lX3N0YXRlX3N0cigKKwkJCQltYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmxpbVNtZVN0YXRlKSwKKwkJCQlsaW1fc21lX3N0YXRlX3N0cigKKwkJCQltYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmxpbVByZXZTbWVTdGF0ZSksCisJCQkJbGltX21sbV9zdGF0ZV9zdHIoCisJCQkJbWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS5saW1NbG1TdGF0ZSksCisJCQkJbGltX21sbV9zdGF0ZV9zdHIoCisJCQkJbWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS5saW1QcmV2TWxtU3RhdGUpKTsKKwkJfQorCX0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19tbG1fcmVxX21lc3NhZ2VzLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX21sbV9yZXFfbWVzc2FnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2Y0YmYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19tbG1fcmVxX21lc3NhZ2VzLmMKQEAgLTAsMCArMSwyODY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgInduaV9jZmcuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorI2luY2x1ZGUgInNpcl9wYXJhbXMuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Byb3BfZXh0c191dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZWN1cml0eV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZW5kX21lc3NhZ2VzLmgiCisjaW5jbHVkZSAibGltX3NlbmRfbWVzc2FnZXMuaCIKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbl91dGlscy5oIgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSA8bGltX2Z0Lmg+CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTQorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2VuZGlmCisjaW5jbHVkZSAid21hX2lmLmgiCisKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX21sbV9zdGFydF9yZXEodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90ICopOworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorc3RhdGljIHZvaWQgbGltX3Byb2Nlc3NfbWxtX29lbV9kYXRhX3JlcSh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX21sbV9qb2luX3JlcSh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7CitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19tbG1fYXV0aF9yZXEodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90ICopOworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3NfbWxtX2Fzc29jX3JlcSh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7CitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19tbG1fcmVhc3NvY19yZXEodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90ICopOworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3NfbWxtX2Rpc2Fzc29jX3JlcSh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7CitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19tbG1fZGVhdXRoX3JlcSh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7CitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19tbG1fc2V0X2tleXNfcmVxKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCAqKTsKKworLyogTUxNIFRpbWVvdXQgZXZlbnQgaGFuZGxlciB0ZW1wbGF0ZXMgKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX3BlcmlvZGljX3Byb2JlX3JlcV90aW1lcih0cEFuaVNpckdsb2JhbCBtYWNfY3R4KTsKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX2pvaW5fZmFpbHVyZV90aW1lb3V0KHRwQW5pU2lyR2xvYmFsKTsKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX2F1dGhfZmFpbHVyZV90aW1lb3V0KHRwQW5pU2lyR2xvYmFsKTsKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX2F1dGhfcnNwX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90KTsKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX2Fzc29jX2ZhaWx1cmVfdGltZW91dCh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QpOworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3NfcGVyaW9kaWNfam9pbl9wcm9iZV9yZXFfdGltZXIodHBBbmlTaXJHbG9iYWwpOworCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9yZXFfbWVzc2FnZXMoKSAtIHByb2Nlc3MgbWxtIHJlcXVlc3QgbWVzc2FnZXMKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBtc2c6IG1sbSByZXF1ZXN0IG1lc3NhZ2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcG9zdF9tbG1fbWVzc2FnZSgpLiBUaGlzCisgKiBmdW5jdGlvbiBoYW5kbGVzIE1MTSBwcmltaXRpdmVzIGludm9rZWQgYnkgU01FLgorICogRGVwZW5kaW5nIG9uIHRoZSBtZXNzYWdlIHR5cGUsIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gd2lsbCBiZQorICogY2FsbGVkLgorICogQVNTVU1QVElPTlM6CisgKiAxLiBVcG9uIHJlY2VpdmluZyBCZWFjb24gaW4gV1RfSk9JTl9TVEFURSwgTUxNIG1vZHVsZSBpbnZva2VzCisgKiAgICBBUElzIGV4cG9zZWQgYnkgQmVhY29uIFByb2Nlc3NpbmcgbW9kdWxlIGZvciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqICAgIGF0IE1BQyBoYXJkd2FyZS4KKyAqIDIuIElmIGF0dGVtcHQgdG8gUmVhc3NvY2lhdGUgd2l0aCBhbiBBUCBmYWlscywgbGluayB3aXRoIGN1cnJlbnQKKyAqICAgIEFQIGlzIHJlc3RvcmVkIGJhY2suCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX3JlcV9tZXNzYWdlcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0cFNpck1zZ1EgbXNnKQoreworCU1UUkFDRShtYWNfdHJhY2VfbXNnX3J4KG1hY19jdHgsIE5PX1NFU1NJT04sIG1zZy0+dHlwZSkpOworCXN3aXRjaCAobXNnLT50eXBlKSB7CisJY2FzZSBMSU1fTUxNX1NUQVJUX1JFUToKKwkJbGltX3Byb2Nlc3NfbWxtX3N0YXJ0X3JlcShtYWNfY3R4LCBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKwljYXNlIExJTV9NTE1fT0VNX0RBVEFfUkVROgorCQlsaW1fcHJvY2Vzc19tbG1fb2VtX2RhdGFfcmVxKG1hY19jdHgsIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBMSU1fTUxNX0pPSU5fUkVROgorCQlsaW1fcHJvY2Vzc19tbG1fam9pbl9yZXEobWFjX2N0eCwgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBMSU1fTUxNX0FVVEhfUkVROgorCQlsaW1fcHJvY2Vzc19tbG1fYXV0aF9yZXEobWFjX2N0eCwgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBMSU1fTUxNX0FTU09DX1JFUToKKwkJbGltX3Byb2Nlc3NfbWxtX2Fzc29jX3JlcShtYWNfY3R4LCBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIExJTV9NTE1fUkVBU1NPQ19SRVE6CisJCWxpbV9wcm9jZXNzX21sbV9yZWFzc29jX3JlcShtYWNfY3R4LCBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIExJTV9NTE1fRElTQVNTT0NfUkVROgorCQlsaW1fcHJvY2Vzc19tbG1fZGlzYXNzb2NfcmVxKG1hY19jdHgsIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgTElNX01MTV9ERUFVVEhfUkVROgorCQlsaW1fcHJvY2Vzc19tbG1fZGVhdXRoX3JlcShtYWNfY3R4LCBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIExJTV9NTE1fU0VUS0VZU19SRVE6CisJCWxpbV9wcm9jZXNzX21sbV9zZXRfa2V5c19yZXEobWFjX2N0eCwgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX1BFUklPRElDX1BST0JFX1JFUV9USU1FT1VUOgorCQlsaW1fcHJvY2Vzc19wZXJpb2RpY19wcm9iZV9yZXFfdGltZXIobWFjX2N0eCk7CisJCWJyZWFrOworCWNhc2UgU0lSX0xJTV9KT0lOX0ZBSUxfVElNRU9VVDoKKwkJbGltX3Byb2Nlc3Nfam9pbl9mYWlsdXJlX3RpbWVvdXQobWFjX2N0eCk7CisJCWJyZWFrOworCWNhc2UgU0lSX0xJTV9QRVJJT0RJQ19KT0lOX1BST0JFX1JFUV9USU1FT1VUOgorCQlsaW1fcHJvY2Vzc19wZXJpb2RpY19qb2luX3Byb2JlX3JlcV90aW1lcihtYWNfY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX0FVVEhfRkFJTF9USU1FT1VUOgorCQlsaW1fcHJvY2Vzc19hdXRoX2ZhaWx1cmVfdGltZW91dChtYWNfY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX0FVVEhfUlNQX1RJTUVPVVQ6CisJCWxpbV9wcm9jZXNzX2F1dGhfcnNwX3RpbWVvdXQobWFjX2N0eCwgbXNnLT5ib2R5dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX0FTU09DX0ZBSUxfVElNRU9VVDoKKwkJbGltX3Byb2Nlc3NfYXNzb2NfZmFpbHVyZV90aW1lb3V0KG1hY19jdHgsIG1zZy0+Ym9keXZhbCk7CisJCWJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJY2FzZSBTSVJfTElNX0ZUX1BSRUFVVEhfUlNQX1RJTUVPVVQ6CisJCWxpbV9wcm9jZXNzX2Z0X3ByZWF1dGhfcnNwX3RpbWVvdXQobWFjX2N0eCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBTSVJfTElNX1JFTUFJTl9DSE5fVElNRU9VVDoKKwkJbGltX3Byb2Nlc3NfcmVtYWluX29uX2Nobl90aW1lb3V0KG1hY19jdHgpOworCQlicmVhazsKKwljYXNlIFNJUl9MSU1fSU5TRVJUX1NJTkdMRVNIT1RfTk9BX1RJTUVPVVQ6CisJCWxpbV9wcm9jZXNzX2luc2VydF9zaW5nbGVfc2hvdF9ub2FfdGltZW91dChtYWNfY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTElNX0NPTlZFUlRfQUNUSVZFX0NIQU5ORUxfVE9fUEFTU0lWRToKKwkJbGltX2NvbnZlcnRfYWN0aXZlX2NoYW5uZWxfdG9fcGFzc2l2ZV9jaGFubmVsKG1hY19jdHgpOworCQlicmVhazsKKwljYXNlIFNJUl9MSU1fRElTQVNTT0NfQUNLX1RJTUVPVVQ6CisJCWxpbV9wcm9jZXNzX2Rpc2Fzc29jX2Fja190aW1lb3V0KG1hY19jdHgpOworCQlicmVhazsKKwljYXNlIFNJUl9MSU1fREVBVVRIX0FDS19USU1FT1VUOgorCQlsaW1fcHJvY2Vzc19kZWF1dGhfYWNrX3RpbWVvdXQobWFjX2N0eCk7CisJCWJyZWFrOworCWNhc2UgTElNX01MTV9UU1BFQ19SRVE6CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfSAvKiBzd2l0Y2ggKG1zZy0+dHlwZSkgKi8KK30KKworLyogV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZCAqLworCisvKioKKyAqIGxpbV9pc19saW5rX3N1c3BlbmRlZCgpLSBjaGVjayBpZiBsaW5rIGlzIHN1c3BlbmRlZAorICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpcyBsaW5rIGlzIHN1c3BlbmRlZCBvciBub3QuCisgKiBTaW5jZSBTdXNwZW5kIGxpbmsgdXNlcyBpbml0IHNjYW4sIGl0IGp1c3QgcmV0dXJucworICogZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSBmbGFnLgorICoKKyAqIFJldHVybjogdWludDhfdChnTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlIGZsYWcpCisgKi8KK3VpbnQ4X3QgbGltX2lzX2xpbmtfc3VzcGVuZGVkKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJcmV0dXJuIG1hY19jdHgtPmxpbS5nTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlOworfQorCisvKioKKyAqIGxpbV9jaGFuZ2VfY2hhbm5lbF93aXRoX2NhbGxiYWNrKCkgLSBjaGFuZ2UgY2hhbm5lbCBhbmQgcmVnaXN0ZXIgY2FsbGJhY2sKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBuZXdfY2hhbjogbmV3IGNoYW5uZWwgdG8gc3dpdGNoCisgKiBAY2FsbGJhY2s6IENhbGxiYWNrIGZ1bmN0aW9uCisgKiBAY2JkYXRhOiBjYWxsYmFjayBkYXRhCisgKiBAc2Vzc2lvbl9lbnRyeTogUEUgc2Vzc2lvbiBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hhbmdlIGNoYW5uZWwgYW5kIHBlcmZvcm0gb2ZmIGNoYW5uZWwgb3BlcmF0aW9uCisgKiBpZiByZXF1aXJlZC4gVGhlIGNhbGxlciByZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIGNoYW5uZWwgY2hhbmdlLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkCitsaW1fY2hhbmdlX2NoYW5uZWxfd2l0aF9jYWxsYmFjayh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50OF90IG5ld19jaGFuLAorCQkJCSBDSEFOR0VfQ0hBTk5FTF9DQUxMQkFDSyBjYWxsYmFjaywKKwkJCQkgdWludDMyX3QgKmNiZGF0YSwgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSkKK3sKKwkvKiBTYW5pdHkgY2hlY2tzIGZvciB0aGUgY3VycmVudCBhbmQgbmV3IGNoYW5uZWwgKi8KKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiU3dpdGNoaW5nIGNoYW5uZWwgdG8gJWQiKSwgbmV3X2NoYW4pOworI2VuZGlmCisJc2Vzc2lvbl9lbnRyeS0+Y2hhbm5lbENoYW5nZVJlYXNvbkNvZGUgPQorCQlMSU1fU1dJVENIX0NIQU5ORUxfT1BFUkFUSU9OOworCisJbWFjX2N0eC0+bGltLmdwY2hhbmdlQ2hhbm5lbENhbGxiYWNrID0gY2FsbGJhY2s7CisJbWFjX2N0eC0+bGltLmdwY2hhbmdlQ2hhbm5lbERhdGEgPSBjYmRhdGE7CisKKwlsaW1fc2VuZF9zd2l0Y2hfY2hubF9wYXJhbXMobWFjX2N0eCwgbmV3X2NoYW4sIDAsIDAsCisJCUNIX1dJRFRIXzIwTUhaLCBzZXNzaW9uX2VudHJ5LT5tYXhUeFBvd2VyLAorCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwgZmFsc2UpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIGxpbV9jb3ZlcnRfY2hhbm5lbF9zY2FuX3R5cGUoKSAtIHN3aXRjaCBiZXR3ZWVuIEFDVElWRSBhbmQgUEFTU0lWRSBzY2FuIHR5cGUKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBjaGFuX251bTogY2hhbm5lbCBudW1iZXIgdG8gY2hhbmdlIHRoZSBzY2FuIHR5cGUKKyAqIEBwYXNzaXZlX3RvX2FjdGl2ZTogZmxhZyB0byBpbmRpY2F0ZSBpZiBzd2l0Y2ggYWxsb3dlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgbGlzdCwKKyAqIGNoYW5nZSB0aGUgY2hhbm5lbCB0eXBlIGFuZCBzZXQgYWdhaW4uCisgKiBOT1RFOiBJZiBhIGNoYW5uZWwgaXMgQUNUSVZFLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbWFrZSBpdCBhcyBQQVNTSVZFCisgKiAgICAgICBJZiBhIGNoYW5uZWwgaXMgUEFTU0lWRSwgdGhpcyBmdWNudGlvbiB3aWxsIG1ha2UgaXQgYXMgQUNUSVZFCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KKwordm9pZCBsaW1fY292ZXJ0X2NoYW5uZWxfc2Nhbl90eXBlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgY2hhbl9udW0sCisJCQkJICBib29sIHBhc3NpdmVfdG9fYWN0aXZlKQoreworCisJdWludDMyX3QgaTsKKwl1aW50OF90IGNoYW5fcGFpcltXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNUX0xFTl07CisJdWludDMyX3QgbGVuID0gV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVF9MRU47CisJdFNpclJldFN0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgID0gd2xhbl9jZmdfZ2V0X3N0cihtYWNfY3R4LCBXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNULAorCQkJCSAgIGNoYW5fcGFpciwgJmxlbik7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiVW5hYmxlIHRvIGdldCBzY2FuIGNvbnRyb2wgbGlzdCIpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobGVuID4gV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVF9MRU4pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkludmFsaWQgc2NhbiBjb250cm9sIGxpc3QgbGVuZ3RoOiVkIiksIGxlbik7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgKGkgKyAxKSA8IGxlbjsgaSArPSAyKSB7CisJCWlmIChjaGFuX3BhaXJbaV0gIT0gY2hhbl9udW0pIC8qIHNraXAgdGhpcyBjaGFubmVsICovCisJCQljb250aW51ZTsKKwkJaWYgKChlU0lSX1BBU1NJVkVfU0NBTiA9PSBjaGFuX3BhaXJbaSArIDFdKSAmJgorCQkgICAgIHRydWUgPT0gcGFzc2l2ZV90b19hY3RpdmUpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwKKwkJCQkoIkNoYW5uZWwgJWQgY2hhbmdlZCBmcm9tIFBhc3NpdmUgdG8gQWN0aXZlIiksCisJCQkJY2hhbl9udW0pOworCQkJY2hhbl9wYWlyW2kgKyAxXSA9IGVTSVJfQUNUSVZFX1NDQU47CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGVTSVJfQUNUSVZFX1NDQU4gPT0gY2hhbl9wYWlyW2kgKyAxXSkgJiYKKwkJICAgICBmYWxzZSA9PSBwYXNzaXZlX3RvX2FjdGl2ZSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTAorCQkJCSgiQ2hhbm5lbCAlZCBjaGFuZ2VkIGZyb20gQWN0aXZlIHRvIFBhc3NpdmUiKSwKKwkJCQljaGFuX251bSk7CisJCQljaGFuX3BhaXJbaSArIDFdID0gZVNJUl9QQVNTSVZFX1NDQU47CisJCQlicmVhazsKKwkJfQorCX0KKworCWNmZ19zZXRfc3RyX25vdGlmeShtYWNfY3R4LCBXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNULAorCQkJICAgKHVpbnQ4X3QgKikgY2hhbl9wYWlyLCBsZW4sIGZhbHNlKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogbGltX3NldF9kZnNfY2hhbm5lbF9saXN0KCkgLSBjb252ZXJ0IGRmcyBjaGFubmVsIGxpc3QgdG8gYWN0aXZlIGNoYW5uZWwgbGlzdAorICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dC4KKyAqIEBjaGFuX251bTogY2hhbm5lbCBudW1iZXIKKyAqIEBkZnNfY2hfbGlzdDogbGlzdCBvZiBERlMgY2hhbm5lbHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjb252ZXJ0IERGUyBjaGFubmVsIGxpc3QgdG8gYWN0aXZlIGNoYW5uZWwgbGlzdAorICogd2hlbiBhbnkgYmVhY29uIGlzIHByZXNlbnQgb24gdGhhdCBjaGFubmVsLiBUaGlzIGZ1bmN0aW9uIHN0b3JlIHRpbWUgZm9yCisgKiBwYXNzaXZlIGNoYW5uZWxzIHdoaWNoIGhlbHAgdG8ga25vdyB0aGF0IGZvciBob3cgbXVjaCB0aW1lIGNoYW5uZWwgaGFzIGJlZW4KKyAqIHBhc3NpdmUuCisgKgorICogTk9URTogSWYgYSBjaGFubmVsIGlzIEFDVElWRSwgaXQgd29uJ3Qgc3RvcmUgYW55IHRpbWUKKyAqICAgICAgIElmIGEgY2hhbm5lbCBpcyBQQXNzaXZlLCBpdCB3aWxsIHN0b3JlIHRpbWUgYXMgdGltZXN0YW1wCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgbGltX3NldF9kZnNfY2hhbm5lbF9saXN0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgY2hhbl9udW0sCisJCQkgICAgICB0U2lyREZTQ2hhbm5lbExpc3QgKmRmc19jaF9saXN0KQoreworCWJvb2wgcGFzc190b19hY3RpdmUgPSB0cnVlOworCisJaWYgKCEoKDEgPD0gY2hhbl9udW0pICYmICgxNjUgPj0gY2hhbl9udW0pKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJJbnZhbGlkIENoYW5uZWw6ICVkIiksIGNoYW5fbnVtKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0cnVlID09IGxpbV9pc2Nvbm5lY3RlZF9vbl9kZnNfY2hhbm5lbChjaGFuX251bSkpIHsKKwkJaWYgKGRmc19jaF9saXN0LT50aW1lU3RhbXBbY2hhbl9udW1dID09IDApIHsKKwkJCS8qCisJCQkgKiBSZWNlaXZlZCBmaXJzdCBiZWFjb247CisJCQkgKiBDb252ZXJ0IERGUyBjaGFubmVsIHRvIEFjdGl2ZSBjaGFubmVsLgorCQkJICovCisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkJRkwoIlJlY2VpdmVkIGZpcnN0IGJlYWNvbiBvbiBERlMgY2hhbm5lbDogJWQiKSwKKwkJCQljaGFuX251bSk7CisJCQlsaW1fY292ZXJ0X2NoYW5uZWxfc2Nhbl90eXBlKG1hY19jdHgsIGNoYW5fbnVtLAorCQkJCQkJICAgICBwYXNzX3RvX2FjdGl2ZSk7CisJCX0KKwkJZGZzX2NoX2xpc3QtPnRpbWVTdGFtcFtjaGFuX251bV0gPQorCQkJCQljZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCk7CisJfSBlbHNlIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiQ2hhbm5lbCAlZCBpcyBBY3RpdmUiKSwgY2hhbl9udW0pOworCQlyZXR1cm47CisJfQorCisJaWYgKCF0eF90aW1lcl9ydW5uaW5nCisJCSAgICAoJm1hY19jdHgtPmxpbS5saW1UaW1lcnMuZ0xpbUFjdGl2ZVRvUGFzc2l2ZUNoYW5uZWxUaW1lcikpIHsKKwkJdHhfdGltZXJfYWN0aXZhdGUoCisJCSAgICAmbWFjX2N0eC0+bGltLmxpbVRpbWVycy5nTGltQWN0aXZlVG9QYXNzaXZlQ2hhbm5lbFRpbWVyKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogbGltX3Jlc3RvcmVfcHJlX3NjYW5fc3RhdGUoKSAtIHJlc3RvcmUgSFcgc3RhdGUgcHJpb3IgdG8gc2NhbgorICoKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fY29udGludWVfY2hhbm5lbF9zY2FuKCkKKyAqIHRvIHJlc3RvcmUgSFcgc3RhdGUgcHJpb3IgdG8gZW50ZXJpbmcgJ3NjYW4gc3RhdGUnCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgbGltX3Jlc3RvcmVfcHJlX3NjYW5fc3RhdGUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCkKK3sKKwkvKiBEZWFjdGl2YXRlIE1JTi9NQVggY2hhbm5lbCB0aW1lcnMgaWYgcnVubmluZyAqLworCWxpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfdGltZXIobWFjX2N0eCwgZUxJTV9NSU5fQ0hBTk5FTF9USU1FUik7CisJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihtYWNfY3R4LCBlTElNX01BWF9DSEFOTkVMX1RJTUVSKTsKKworCW1hY19jdHgtPmxpbS5nTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlID0gMDsKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJTY2FuIGVuZGVkLCB0b29rICVsbHUgdHUiKSwKKwkJKHR4X3RpbWVfZ2V0KCkgLSBtYWNfY3R4LT5saW0uc2NhblN0YXJ0VGltZSkpOworfQorCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisvKioKKyAqIGxpbV9zZW5kX2hhbF9vZW1fZGF0YV9yZXEoKSAtIHNlbmQgb2VtIGRhdGEgcmVxdWVzdAorICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIE9FTSBkYXRhIHJlcXVlc3QgdG8gSEFMLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGxpbV9zZW5kX2hhbF9vZW1fZGF0YV9yZXEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCkKK3sKKwl0U2lyTXNnUSBtc2c7CisJdHBTdGFydE9lbURhdGFSZXEgc3RhcnRfb2VtX2RhdGFfcmVxID0gTlVMTDsKKwl0U2lyUmV0U3RhdHVzIHJjID0gZVNJUl9TVUNDRVNTOworCXRwTGltTWxtT2VtRGF0YVJzcCBtbG1fb2VtX2RhdGFfcnNwOworCXVpbnQzMl90IHJlcWxlbiA9IDA7CisKKwlpZiAoTlVMTCA9PSBtYWNfY3R4LT5saW0uZ3BMaW1NbG1PZW1EYXRhUmVxKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIk51bGwgcG9pbnRlciIpKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXFsZW4gPSBzaXplb2YodFN0YXJ0T2VtRGF0YVJlcSk7CisKKwlzdGFydF9vZW1fZGF0YV9yZXEgPSBjZGZfbWVtX21hbGxvYyhyZXFsZW4pOworCWlmIChOVUxMID09IHN0YXJ0X29lbV9kYXRhX3JlcSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMCisJCQkoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0YXJ0X29lbV9kYXRhX3JlcSIpKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAoc3RhcnRfb2VtX2RhdGFfcmVxKSwgcmVxbGVuLCAwKTsKKworCS8qIE5vdyBjb3B5IG92ZXIgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBPRU0gREFUQSBSRVEgdG8gSEFMICovCisJY2RmX21lbV9jb3B5KHN0YXJ0X29lbV9kYXRhX3JlcS0+c2VsZk1hY0FkZHIsCisJCSAgICAgbWFjX2N0eC0+bGltLmdwTGltTWxtT2VtRGF0YVJlcS0+c2VsZk1hY0FkZHIsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwljZGZfbWVtX2NvcHkoc3RhcnRfb2VtX2RhdGFfcmVxLT5vZW1EYXRhUmVxLAorCQkgICAgIG1hY19jdHgtPmxpbS5ncExpbU1sbU9lbURhdGFSZXEtPm9lbURhdGFSZXEsCisJCSAgICAgT0VNX0RBVEFfUkVRX1NJWkUpOworCisJLyogQ3JlYXRlIHRoZSBtZXNzYWdlIHRvIGJlIHBhc3NlZCB0byBIQUwgKi8KKwltc2cudHlwZSA9IFdNQV9TVEFSVF9PRU1fREFUQV9SRVE7CisJbXNnLmJvZHlwdHIgPSBzdGFydF9vZW1fZGF0YV9yZXE7CisJbXNnLmJvZHl2YWwgPSAwOworCisJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MobWFjX2N0eCwgZmFsc2UpOworCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KG1hY19jdHgsIE5PX1NFU1NJT04sIG1zZy50eXBlKSk7CisKKwlyYyA9IHdtYV9wb3N0X2N0cmxfbXNnKG1hY19jdHgsICZtc2cpOworCWlmIChyYyA9PSBlU0lSX1NVQ0NFU1MpCisJCXJldHVybjsKKworCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKG1hY19jdHgsIHRydWUpOworCWNkZl9tZW1fZnJlZShzdGFydF9vZW1fZGF0YV9yZXEpOworCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJRkwoIk9FTV9EQVRBOiBwb3N0aW5nIFdNQV9TVEFSVF9PRU1fREFUQV9SRVEgdG8gSEFMIGZhaWxlZCIpKTsKKworZXJyb3I6CisJbWFjX2N0eC0+bGltLmdMaW1NbG1TdGF0ZSA9IG1hY19jdHgtPmxpbS5nTGltUHJldk1sbVN0YXRlOworCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIE5PX1NFU1NJT04sCisJCSAgICAgICBtYWNfY3R4LT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKwltbG1fb2VtX2RhdGFfcnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRMaW1NbG1PZW1EYXRhUnNwKSk7CisJaWYgKE5VTEwgPT0gbWxtX29lbV9kYXRhX3JzcCkgeworCQlsaW1fbG9nKG1hY19jdHgtPmhIZGQsIExPR1AsIEZMCisJCQkoIm1lbW9yeSBhbGxvY2F0aW9uIGZvciBtbG1fb2VtX2RhdGFfcnNwIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKE5VTEwgIT0gbWFjX2N0eC0+bGltLmdwTGltTWxtT2VtRGF0YVJlcSkgeworCQljZGZfbWVtX2ZyZWUobWFjX2N0eC0+bGltLmdwTGltTWxtT2VtRGF0YVJlcSk7CisJCW1hY19jdHgtPmxpbS5ncExpbU1sbU9lbURhdGFSZXEgPSBOVUxMOworCX0KKworCWxpbV9wb3N0X3NtZV9tZXNzYWdlKG1hY19jdHgsIExJTV9NTE1fT0VNX0RBVEFfQ05GLAorCQkJICAgICAodWludDMyX3QgKikgbWxtX29lbV9kYXRhX3JzcCk7CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUICovCisKKy8qKgorICogbWxtX2FkZF9zdGEoKSAtIE1MTSBhZGQgc3RhCisgKiBAbWFjX2N0eDogZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAc3RhX3BhcmFtOiBBZGQgc3RhIHBhcmFtcworICogQGJzc2lkOiBCU1NJRAorICogQGh0X2NhcGFibGU6IEhUIGNhcGFiaWxpdHkKKyAqIEBzZXNzaW9uX2VudHJ5OiBQRSBzZXNzaW9uIGVudHJ5CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdXBkYXRlIHN0YXRpb24gcGFyYW1ldGVycworICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBtbG1fYWRkX3N0YSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0cEFkZFN0YVBhcmFtcyBzdGFfcGFyYW0sCisJCXVpbnQ4X3QgKmJzc2lkLCB1aW50OF90IGh0X2NhcGFibGUsIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJdWludDMyX3QgdmFsOworCXVpbnQzMl90IHNlbGZfZG90MTFtb2RlID0gMDsKKworCXdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19ET1QxMV9NT0RFLCAmc2VsZl9kb3QxMW1vZGUpOworCXN0YV9wYXJhbS0+c3RhVHlwZSA9IFNUQV9FTlRSWV9TRUxGOyAvKiBJZGVudGlmeWluZyBzZWxmICovCisKKwljZGZfbWVtX2NvcHkoc3RhX3BhcmFtLT5ic3NJZCwgYnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCWNkZl9tZW1fY29weShzdGFfcGFyYW0tPnN0YU1hYywgc2Vzc2lvbl9lbnRyeS0+c2VsZk1hY0FkZHIsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkvKiBDb25maWd1cmF0aW9uIHJlbGF0ZWQgcGFyYW1ldGVycyB0byBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQgQlQtQU1QICovCisKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19MSVNURU5fSU5URVJWQUwsCisJCQkJCSAgICAgJnZhbCkpCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoIkNvdWxkbid0IGdldCBMSVNURU5fSU5URVJWQUwiKSk7CisJc3RhX3BhcmFtLT5saXN0ZW5JbnRlcnZhbCA9ICh1aW50MTZfdCkgdmFsOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSB3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEUsCisJCQkJCSAgICAgJnZhbCkpCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoIkNvdWxkbid0IGdldCBTSE9SVF9QUkVBTUJMRSIpKTsKKwlzdGFfcGFyYW0tPnNob3J0UHJlYW1ibGVTdXBwb3J0ZWQgPSAodWludDhfdCkgdmFsOworCisJc3RhX3BhcmFtLT5hc3NvY0lkID0gMDsgICAgICAvKiBJcyBTTUFDIE9LIHdpdGggdGhpcz8gKi8KKwlzdGFfcGFyYW0tPndtbUVuYWJsZWQgPSAwOworCXN0YV9wYXJhbS0+dUFQU0QgPSAwOworCXN0YV9wYXJhbS0+bWF4U1BMZW4gPSAwOworCXN0YV9wYXJhbS0+dXMzMk1heEFtcGR1RHVyYXRpb24gPSAwOworCXN0YV9wYXJhbS0+bWF4QW1wZHVTaXplID0gMDsgLyogMDogOGssIDE6IDE2aywyOiAzMmssMzogNjRrLCA0OjEyOGsgKi8KKworCS8qIEZvciBTZWxmIFNUQSBnZXQgdGhlIExEUEMgY2FwYWJpbGl0eSBmcm9tIGNvbmZpZy5pbmkgKi8KKwlzdGFfcGFyYW0tPmh0TGRwY0NhcGFibGUgPQorCQkoc2Vzc2lvbl9lbnRyeS0+dHhMZHBjSW5pRmVhdHVyZUVuYWJsZWQgJiAweDAxKTsKKwlzdGFfcGFyYW0tPnZodExkcGNDYXBhYmxlID0KKwkJKChzZXNzaW9uX2VudHJ5LT50eExkcGNJbmlGZWF0dXJlRW5hYmxlZCA+PiAxKSAmIDB4MDEpOworCisJaWYgKElTX0RPVDExX01PREVfSFQoc2Vzc2lvbl9lbnRyeS0+ZG90MTFtb2RlKSkgeworCQlzdGFfcGFyYW0tPmh0Q2FwYWJsZSA9IGh0X2NhcGFibGU7CisJCXN0YV9wYXJhbS0+Z3JlZW5GaWVsZENhcGFibGUgPQorCQkJbGltX2dldF9odF9jYXBhYmlsaXR5KG1hY19jdHgsIGVIVF9HUkVFTkZJRUxELAorCQkJCQkgICAgICBzZXNzaW9uX2VudHJ5KTsKKwkJc3RhX3BhcmFtLT5jaF93aWR0aCA9CisJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkobWFjX2N0eCwKKwkJCQllSFRfU1VQUE9SVEVEX0NIQU5ORUxfV0lEVEhfU0VULCBzZXNzaW9uX2VudHJ5KTsKKwkJc3RhX3BhcmFtLT5taW1vUFMgPQorCQkJKHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkoCisJCQkJbWFjX2N0eCwgZUhUX01JTU9fUE9XRVJfU0FWRSwgc2Vzc2lvbl9lbnRyeSk7CisJCXN0YV9wYXJhbS0+cmlmc01vZGUgPQorCQkJbGltX2dldF9odF9jYXBhYmlsaXR5KG1hY19jdHgsIGVIVF9SSUZTX01PREUsCisJCQkJCSAgICAgIHNlc3Npb25fZW50cnkpOworCQlzdGFfcGFyYW0tPmxzaWdUeG9wUHJvdGVjdGlvbiA9CisJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkobWFjX2N0eCwgZUhUX0xTSUdfVFhPUF9QUk9URUNUSU9OLAorCQkJCQkgICAgICBzZXNzaW9uX2VudHJ5KTsKKwkJc3RhX3BhcmFtLT5tYXhBbXBkdURlbnNpdHkgPQorCQkJbGltX2dldF9odF9jYXBhYmlsaXR5KG1hY19jdHgsIGVIVF9NUERVX0RFTlNJVFksCisJCQkJCSAgICAgIHNlc3Npb25fZW50cnkpOworCQlzdGFfcGFyYW0tPm1heEFtc2R1U2l6ZSA9CisJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkobWFjX2N0eCwgZUhUX01BWF9BTVNEVV9MRU5HVEgsCisJCQkJCSAgICAgIHNlc3Npb25fZW50cnkpOworCQlzdGFfcGFyYW0tPmZEc3NzQ2NrTW9kZTQwTWh6ID0KKwkJCWxpbV9nZXRfaHRfY2FwYWJpbGl0eShtYWNfY3R4LCBlSFRfRFNTU19DQ0tfTU9ERV80ME1IWiwKKwkJCQkJICAgICAgc2Vzc2lvbl9lbnRyeSk7CisJCXN0YV9wYXJhbS0+ZlNob3J0R0kyME1oeiA9CisJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkobWFjX2N0eCwgZUhUX1NIT1JUX0dJXzIwTUhaLAorCQkJCQkgICAgICBzZXNzaW9uX2VudHJ5KTsKKwkJc3RhX3BhcmFtLT5mU2hvcnRHSTQwTWh6ID0KKwkJCWxpbV9nZXRfaHRfY2FwYWJpbGl0eShtYWNfY3R4LCBlSFRfU0hPUlRfR0lfNDBNSFosCisJCQkJCSAgICAgIHNlc3Npb25fZW50cnkpOworCX0KKwlpZiAoc2Vzc2lvbl9lbnRyeS0+dmh0Q2FwYWJpbGl0eSkgeworCQlzdGFfcGFyYW0tPnZodENhcGFibGUgPSB0cnVlOworCQlzdGFfcGFyYW0tPnZodFR4QkZDYXBhYmxlID0KKwkJCQlzZXNzaW9uX2VudHJ5LT50eEJGSW5pRmVhdHVyZUVuYWJsZWQ7CisJCXN0YV9wYXJhbS0+dmh0VHhNVUJmb3JtZWVDYXBhYmxlID0gc2Vzc2lvbl9lbnRyeS0+dHhNdUJmb3JtZWU7CisJCXN0YV9wYXJhbS0+ZW5hYmxlX3N1X3R4X2Jmb3JtZXIgPQorCQkJCXNlc3Npb25fZW50cnktPmVuYWJsZV9zdV90eF9iZm9ybWVyOworCX0KKwkvKgorCSAqIFNpbmNlIHRoaXMgaXMgU2VsZi1TVEEsIG5lZWQgdG8gcG9wdWxhdGUgU2VsZiBNQVhfQU1QRFVfU0laRQorCSAqIGNhcGFiaWxpdGllcworCSAqLworCWlmIChJU19ET1QxMV9NT0RFX1ZIVChzZWxmX2RvdDExbW9kZSkpIHsKKwkJdmFsID0gMDsgICAgICAgIC8qIERlZmF1bHQgOEsgQU1QRFUgc2l6ZSAqLworCQlpZiAoZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwKKwkJCQkJV05JX0NGR19WSFRfQU1QRFVfTEVOX0VYUE9ORU5ULCAmdmFsKSkKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwKKwkJCSAgICAoIkNvdWxkbid0IGdldCBXTklfQ0ZHX1ZIVF9BTVBEVV9MRU5fRVhQT05FTlQiKSk7CisJCXN0YV9wYXJhbS0+bWF4QW1wZHVTaXplID0gKHVpbnQ4X3QpIHZhbDsKKwl9CisJc3RhX3BhcmFtLT5lbmFibGVWaHRwQWlkID0gc2Vzc2lvbl9lbnRyeS0+ZW5hYmxlVmh0cEFpZDsKKwlzdGFfcGFyYW0tPmVuYWJsZUFtcGR1UHMgPSBzZXNzaW9uX2VudHJ5LT5lbmFibGVBbXBkdVBzOworCXN0YV9wYXJhbS0+ZW5hYmxlSHRTbXBzID0gc2Vzc2lvbl9lbnRyeS0+ZW5hYmxlSHRTbXBzOworCXN0YV9wYXJhbS0+aHRTbXBzY29uZmlnID0gc2Vzc2lvbl9lbnRyeS0+aHRTbXBzdmFsdWU7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWxpbV9wb3B1bGF0ZV9vd25fcmF0ZV9zZXQobWFjX2N0eCwgJnN0YV9wYXJhbS0+c3VwcG9ydGVkUmF0ZXMsIE5VTEwsCisJCQkJICBmYWxzZSwgc2Vzc2lvbl9lbnRyeSwgTlVMTCk7CisjZWxzZQorCWxpbV9wb3B1bGF0ZV9vd25fcmF0ZV9zZXQobWFjX2N0eCwgJnN0YV9wYXJhbS0+c3VwcG9ydGVkUmF0ZXMsIE5VTEwsCisJCQkJICBmYWxzZSwgc2Vzc2lvbl9lbnRyeSk7CisjZW5kaWYKKwlsaW1fZmlsbF9zdXBwb3J0ZWRfcmF0ZXNfaW5mbyhtYWNfY3R4LCBOVUxMLCAmc3RhX3BhcmFtLT5zdXBwb3J0ZWRSYXRlcywKKwkJCQkgICAgICBzZXNzaW9uX2VudHJ5KTsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoCisJCSJHRjogJWQsIENobmxXaWR0aDogJWQsIE1pbW9QUzogJWQsIGxzaWdUWE9QOiAlZCwgZHNzc0NDSzogJWQsIgorCQkiIFNHSTIwOiAlZCwgU0dJNDAlZCIpLCBzdGFfcGFyYW0tPmdyZWVuRmllbGRDYXBhYmxlLAorCQlzdGFfcGFyYW0tPmNoX3dpZHRoLCBzdGFfcGFyYW0tPm1pbW9QUywKKwkJc3RhX3BhcmFtLT5sc2lnVHhvcFByb3RlY3Rpb24sIHN0YV9wYXJhbS0+ZkRzc3NDY2tNb2RlNDBNaHosCisJCXN0YV9wYXJhbS0+ZlNob3J0R0kyME1oeiwgc3RhX3BhcmFtLT5mU2hvcnRHSTQwTWh6KTsKKworCWlmIChDREZfUDJQX0dPX01PREUgPT0gc2Vzc2lvbl9lbnRyeS0+cGVQZXJzb25hKQorCQlzdGFfcGFyYW0tPnAycENhcGFibGVTdGEgPSAxOworfQorCisvKioKKyAqIGxpbV9tbG1fYWRkX2JzcygpIC0gSEFMIGludGVyZmFjZSBmb3IgV01BX0FERF9CU1NfUkVRCisgKiBAbWFjX2N0eDogZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAbWxtX3N0YXJ0X3JlcTogTUxNIHN0YXJ0IHJlcXVlc3QKKyAqIEBzZXNzaW9uOiBQRSBzZXNzaW9uIGVudHJ5CisgKgorICogUGFja2FnZSBXTUFfQUREX0JTU19SRVEgdG8gSEFMLCBpbiBvcmRlciB0byBzdGFydCBhIEJTUworICoKKyAqIFJldHVybjogZVNJUl9TTUVfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlcyBvdGhlcndpc2UKKyAqLwordFNpclJlc3VsdENvZGVzCitsaW1fbWxtX2FkZF9ic3ModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdExpbU1sbVN0YXJ0UmVxICptbG1fc3RhcnRfcmVxLCB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXRTaXJNc2dRIG1zZ19idWY7CisJdHBBZGRCc3NQYXJhbXMgYWRkYnNzX3BhcmFtID0gTlVMTDsKKwl1aW50MzJfdCByZXRjb2RlOworCisJLyogUGFja2FnZSBXTUFfQUREX0JTU19SRVEgbWVzc2FnZSBwYXJhbWV0ZXJzICovCisJYWRkYnNzX3BhcmFtID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBZGRCc3NQYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBhZGRic3NfcGFyYW0pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIEFERF9CU1MiKSk7CisJCS8qIFJlc3BvbmQgdG8gU01FIHdpdGggTElNX01MTV9TVEFSVF9DTkYgKi8KKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisKKwljZGZfbWVtX3NldChhZGRic3NfcGFyYW0sIHNpemVvZih0QWRkQnNzUGFyYW1zKSwgMCk7CisJLyogRmlsbCBpbiB0QWRkQnNzUGFyYW1zIG1lbWJlcnMgKi8KKwljZGZfbWVtX2NvcHkoYWRkYnNzX3BhcmFtLT5ic3NJZCwgbWxtX3N0YXJ0X3JlcS0+YnNzSWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkvKiBGaWxsIGluIHRBZGRCc3NQYXJhbXMgc2VsZk1hY0FkZHIgKi8KKwljZGZfbWVtX2NvcHkoYWRkYnNzX3BhcmFtLT5zZWxmTWFjQWRkciwKKwkJICAgICBzZXNzaW9uLT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlhZGRic3NfcGFyYW0tPmJzc1R5cGUgPSBtbG1fc3RhcnRfcmVxLT5ic3NUeXBlOworCWlmICgobWxtX3N0YXJ0X3JlcS0+YnNzVHlwZSA9PSBlU0lSX0lCU1NfTU9ERSkgfHwKKwkgICAgKG1sbV9zdGFydF9yZXEtPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9BUF9NT0RFKSB8fAorCSAgICAobWxtX3N0YXJ0X3JlcS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX1NUQV9NT0RFKSkgeworCQlhZGRic3NfcGFyYW0tPm9wZXJNb2RlID0gQlNTX09QRVJBVElPTkFMX01PREVfU1RBOworCX0gZWxzZSBpZiAobWxtX3N0YXJ0X3JlcS0+YnNzVHlwZSA9PSBlU0lSX0lORlJBX0FQX01PREUpIHsKKwkJYWRkYnNzX3BhcmFtLT5vcGVyTW9kZSA9IEJTU19PUEVSQVRJT05BTF9NT0RFX0FQOworCX0KKworCWFkZGJzc19wYXJhbS0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCA9IHNlc3Npb24tPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQ7CisJYWRkYnNzX3BhcmFtLT5iZWFjb25JbnRlcnZhbCA9IG1sbV9zdGFydF9yZXEtPmJlYWNvblBlcmlvZDsKKwlhZGRic3NfcGFyYW0tPmR0aW1QZXJpb2QgPSBtbG1fc3RhcnRfcmVxLT5kdGltUGVyaW9kOworCWFkZGJzc19wYXJhbS0+d3BzX3N0YXRlID0gbWxtX3N0YXJ0X3JlcS0+d3BzX3N0YXRlOworCWFkZGJzc19wYXJhbS0+Y2ZQYXJhbVNldC5jZnBDb3VudCA9IG1sbV9zdGFydF9yZXEtPmNmUGFyYW1TZXQuY2ZwQ291bnQ7CisJYWRkYnNzX3BhcmFtLT5jZlBhcmFtU2V0LmNmcFBlcmlvZCA9CisJCW1sbV9zdGFydF9yZXEtPmNmUGFyYW1TZXQuY2ZwUGVyaW9kOworCWFkZGJzc19wYXJhbS0+Y2ZQYXJhbVNldC5jZnBNYXhEdXJhdGlvbiA9CisJCW1sbV9zdGFydF9yZXEtPmNmUGFyYW1TZXQuY2ZwTWF4RHVyYXRpb247CisJYWRkYnNzX3BhcmFtLT5jZlBhcmFtU2V0LmNmcER1clJlbWFpbmluZyA9CisJCW1sbV9zdGFydF9yZXEtPmNmUGFyYW1TZXQuY2ZwRHVyUmVtYWluaW5nOworCisJYWRkYnNzX3BhcmFtLT5yYXRlU2V0Lm51bVJhdGVzID0gbWxtX3N0YXJ0X3JlcS0+cmF0ZVNldC5udW1SYXRlczsKKwljZGZfbWVtX2NvcHkoYWRkYnNzX3BhcmFtLT5yYXRlU2V0LnJhdGUsIG1sbV9zdGFydF9yZXEtPnJhdGVTZXQucmF0ZSwKKwkJICAgICBtbG1fc3RhcnRfcmVxLT5yYXRlU2V0Lm51bVJhdGVzKTsKKworCWFkZGJzc19wYXJhbS0+bndUeXBlID0gbWxtX3N0YXJ0X3JlcS0+bndUeXBlOworCWFkZGJzc19wYXJhbS0+aHRDYXBhYmxlID0gbWxtX3N0YXJ0X3JlcS0+aHRDYXBhYmxlOworCWFkZGJzc19wYXJhbS0+dmh0Q2FwYWJsZSA9IHNlc3Npb24tPnZodENhcGFiaWxpdHk7CisJYWRkYnNzX3BhcmFtLT5jaF93aWR0aCA9IHNlc3Npb24tPmNoX3dpZHRoOworCWFkZGJzc19wYXJhbS0+Y2hfY2VudGVyX2ZyZXFfc2VnMCA9CisJCXNlc3Npb24tPmNoX2NlbnRlcl9mcmVxX3NlZzA7CisJYWRkYnNzX3BhcmFtLT5jaF9jZW50ZXJfZnJlcV9zZWcxID0KKwkJc2Vzc2lvbi0+Y2hfY2VudGVyX2ZyZXFfc2VnMTsKKwlhZGRic3NfcGFyYW0tPmh0T3Blck1vZGUgPSBtbG1fc3RhcnRfcmVxLT5odE9wZXJNb2RlOworCWFkZGJzc19wYXJhbS0+ZHVhbENUU1Byb3RlY3Rpb24gPSBtbG1fc3RhcnRfcmVxLT5kdWFsQ1RTUHJvdGVjdGlvbjsKKwlhZGRic3NfcGFyYW0tPnR4Q2hhbm5lbFdpZHRoU2V0ID0gbWxtX3N0YXJ0X3JlcS0+dHhDaGFubmVsV2lkdGhTZXQ7CisKKwlhZGRic3NfcGFyYW0tPmN1cnJlbnRPcGVyQ2hhbm5lbCA9IG1sbV9zdGFydF9yZXEtPmNoYW5uZWxOdW1iZXI7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWFkZGJzc19wYXJhbS0+cm1mRW5hYmxlZCA9IHNlc3Npb24tPmxpbVJtZkVuYWJsZWQ7CisjZW5kaWYKKworCS8qIFVwZGF0ZSBQRSBzZXNzaW9uSWQgKi8KKwlhZGRic3NfcGFyYW0tPnNlc3Npb25JZCA9IG1sbV9zdGFydF9yZXEtPnNlc3Npb25JZDsKKworCS8qIFNlbmQgdGhlIFNTSUQgdG8gSEFMIHRvIGVuYWJsZSBTU0lEIG1hdGNoaW5nIGZvciBJQlNTICovCisJY2RmX21lbV9jb3B5KCYoYWRkYnNzX3BhcmFtLT5zc0lkLnNzSWQpLAorCQkgICAgIG1sbV9zdGFydF9yZXEtPnNzSWQuc3NJZCwgbWxtX3N0YXJ0X3JlcS0+c3NJZC5sZW5ndGgpOworCWFkZGJzc19wYXJhbS0+c3NJZC5sZW5ndGggPSBtbG1fc3RhcnRfcmVxLT5zc0lkLmxlbmd0aDsKKwlhZGRic3NfcGFyYW0tPmJIaWRkZW5TU0lERW4gPSBtbG1fc3RhcnRfcmVxLT5zc2lkSGlkZGVuOworCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIlRSWUlORyBUTyBISURFIFNTSUQgJWQiKSwKKwkJYWRkYnNzX3BhcmFtLT5iSGlkZGVuU1NJREVuKTsKKwkvKiBDUjMwOTE4My4gRGlzYWJsZSBQcm94eSBQcm9iZSBSc3AuICBIb3N0IGhhbmRsZXMgUHJvYmUgUmVxdWVzdHMuICBVbnRpbCBGVyBmaXhlZC4gKi8KKwlhZGRic3NfcGFyYW0tPmJQcm94eVByb2JlUmVzcEVuID0gMDsKKwlhZGRic3NfcGFyYW0tPm9ic3NQcm90RW5hYmxlZCA9IG1sbV9zdGFydF9yZXEtPm9ic3NQcm90RW5hYmxlZDsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCWFkZGJzc19wYXJhbS0+bWF4VHhQb3dlciA9IHNlc3Npb24tPm1heFR4UG93ZXI7CisjZW5kaWYKKwltbG1fYWRkX3N0YShtYWNfY3R4LCAmYWRkYnNzX3BhcmFtLT5zdGFDb250ZXh0LAorCQkgICAgYWRkYnNzX3BhcmFtLT5ic3NJZCwgYWRkYnNzX3BhcmFtLT5odENhcGFibGUsCisJCSAgICBzZXNzaW9uKTsKKworCWFkZGJzc19wYXJhbS0+c3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWFkZGJzc19wYXJhbS0+cmVzcFJlcWQgPSAxOworCisJLyogU2V0IGEgbmV3IHN0YXRlIGZvciBNTE1FICovCisJc2Vzc2lvbi0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9BRERfQlNTX1JTUF9TVEFURTsKKwlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBzZXNzaW9uLT5wZVNlc3Npb25JZCwKKwkJCSBzZXNzaW9uLT5saW1NbG1TdGF0ZSkpOworCisJLyogcGFzcyBvbiB0aGUgc2Vzc2lvbiBwZXJzb25hIHRvIGhhbCAqLworCWFkZGJzc19wYXJhbS0+aGFsUGVyc29uYSA9IHNlc3Npb24tPnBlUGVyc29uYTsKKworCWFkZGJzc19wYXJhbS0+YlNwZWN0cnVtTWd0RW5hYmxlZCA9IHNlc3Npb24tPnNwZWN0cnVtTWd0RW5hYmxlZCB8fAorCQlsaW1faXNjb25uZWN0ZWRfb25fZGZzX2NoYW5uZWwobWxtX3N0YXJ0X3JlcS0+Y2hhbm5lbE51bWJlcik7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWFkZGJzc19wYXJhbS0+ZXh0U2V0U3RhS2V5UGFyYW1WYWxpZCA9IDA7CisjZW5kaWYKKworCWFkZGJzc19wYXJhbS0+ZG90MTFfbW9kZSA9IHNlc3Npb24tPmRvdDExbW9kZTsKKwlhZGRic3NfcGFyYW0tPm5zcyA9IHNlc3Npb24tPm5zczsKKwlsaW1fbG9nKG1hY19jdHgsIExPRzIsIEZMKCJkb3QxMV9tb2RlOiVkIG5zcyB2YWx1ZTolZCIpLAorCQkJYWRkYnNzX3BhcmFtLT5kb3QxMV9tb2RlLCBhZGRic3NfcGFyYW0tPm5zcyk7CisKKwltc2dfYnVmLnR5cGUgPSBXTUFfQUREX0JTU19SRVE7CisJbXNnX2J1Zi5yZXNlcnZlZCA9IDA7CisJbXNnX2J1Zi5ib2R5cHRyID0gYWRkYnNzX3BhcmFtOworCW1zZ19idWYuYm9keXZhbCA9IDA7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgobWFjX2N0eCwgc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIG1zZ19idWYudHlwZSkpOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiU2VuZGluZyBXTUFfQUREX0JTU19SRVEuLi4iKSk7CisJcmV0Y29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKG1hY19jdHgsICZtc2dfYnVmKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHJldGNvZGUpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlBvc3RpbmcgQUREX0JTU19SRVEgdG8gSEFMIGZhaWxlZCwgcmVhc29uPSVYIiksCisJCQlyZXRjb2RlKTsKKwkJY2RmX21lbV9mcmVlKGFkZGJzc19wYXJhbSk7CisJCXJldHVybiBlU0lSX1NNRV9IQUxfU0VORF9NRVNTQUdFX0ZBSUw7CisJfQorCisJcmV0dXJuIGVTSVJfU01FX1NVQ0NFU1M7Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX3N0YXJ0X3JlcSgpIC0gcHJvY2VzcyBNTE1fU1RBUlRfUkVRIG1lc3NhZ2UKKyAqCisgKiBAbWFjX2N0eDogZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAbXNnX2J1ZjogUG9pbnRlciB0byBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1MTV9TVEFSVF9SRVEgbWVzc2FnZQorICogZnJvbSBTTUUKKyAqIDEpIE1MTUUgcmVjZWl2ZXMgTElNX01MTV9TVEFSVF9SRVEgZnJvbSBMSU0KKyAqIDIpIE1MTUUgc2VuZHMgV01BX0FERF9CU1NfUkVRIHRvIEhBTAorICogMykgTUxNRSBjaGFuZ2VzIHN0YXRlIHRvIGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1NUQVRFCisgKiBNTE1FIG5vdyB3YWl0cyBmb3IgSEFMIHRvIHNlbmQgV01BX0FERF9CU1NfUlNQCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX21sbV9zdGFydF9yZXEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3QgKm1zZ19idWYpCit7CisJdExpbU1sbVN0YXJ0UmVxICptbG1fc3RhcnRfcmVxOworCXRMaW1NbG1TdGFydENuZiBtbG1fc3RhcnRfY25mOworCXRwUEVTZXNzaW9uIHNlc3Npb24gPSBOVUxMOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCW1sbV9zdGFydF9yZXEgPSAodExpbU1sbVN0YXJ0UmVxICopIG1zZ19idWY7CisJc2Vzc2lvbiA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKG1hY19jdHgsCisJCQkJbWxtX3N0YXJ0X3JlcS0+c2Vzc2lvbklkKTsKKwlpZiAoTlVMTCA9PSBzZXNzaW9uKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSUQiKSk7CisJCW1sbV9zdGFydF9jbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChzZXNzaW9uLT5saW1NbG1TdGF0ZSAhPSBlTElNX01MTV9JRExFX1NUQVRFKSB7CisJCS8qCisJCSAqIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBTdGFydCByZXEgaW4gc3RhdGVzIG90aGVyIHRoYW4gaWRsZS4KKwkJICogUmV0dXJuIFN0YXJ0IGNvbmZpcm0gd2l0aCBmYWlsdXJlIGNvZGUuCisJCSAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBNTE1fU1RBUlRfUkVRIGluIHN0YXRlICVYIiksCisJCQlzZXNzaW9uLT5saW1NbG1TdGF0ZSk7CisJCWxpbV9wcmludF9tbG1fc3RhdGUobWFjX2N0eCwgTE9HRSwgc2Vzc2lvbi0+bGltTWxtU3RhdGUpOworCQltbG1fc3RhcnRfY25mLnJlc3VsdENvZGUgPQorCQkJCWVTSVJfU01FX0JTU19BTFJFQURZX1NUQVJURURfT1JfSk9JTkVEOworCQlnb3RvIGVuZDsKKwl9CisKKwltbG1fc3RhcnRfY25mLnJlc3VsdENvZGUgPQorCQlsaW1fbWxtX2FkZF9ic3MobWFjX2N0eCwgbWxtX3N0YXJ0X3JlcSwgc2Vzc2lvbik7CisKK2VuZDoKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJZCAqLworCW1sbV9zdGFydF9jbmYuc2Vzc2lvbklkID0gbWxtX3N0YXJ0X3JlcS0+c2Vzc2lvbklkOworCisJLyogRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkIGZvciBMaW1NbG1TY2FuUmVxICovCisJY2RmX21lbV9mcmVlKG1zZ19idWYpOworCisJLyoKKwkgKiBSZXNwb25kIGltbWVkaWF0ZWx5IHRvIExJTSwgb25seSBpZiBNTE1FIGhhcyBub3QgYmVlbgorCSAqIHN1Y2Nlc3NmdWxseSBhYmxlIHRvIHNlbmQgV01BX0FERF9CU1NfUkVRIHRvIEhBTC4KKwkgKiBFbHNlLCBMSU1fTUxNX1NUQVJUX0NORiB3aWxsIGJlIHNlbnQgYWZ0ZXIgcmVjZWl2aW5nCisJICogV01BX0FERF9CU1NfUlNQIGZyb20gSEFMCisJICovCisJaWYgKGVTSVJfU01FX1NVQ0NFU1MgIT0gbWxtX3N0YXJ0X2NuZi5yZXN1bHRDb2RlKQorCQlsaW1fcG9zdF9zbWVfbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX1NUQVJUX0NORiwKKwkJCQkgICAgICh1aW50MzJfdCAqKSAmbWxtX3N0YXJ0X2NuZik7Cit9CisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX29lbV9kYXRhX3JlcSgpIC0gcHJvY2VzcyBNTE0gT0VNX0RBVEFfUkVRIG1lc3NhZ2UKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBtc2dfYnVmOiBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgTUxNIE9FTV9EQVRBX1JFUSBtZXNzYWdlLgorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19tbG1fb2VtX2RhdGFfcmVxKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJCSB1aW50MzJfdCAqbXNnX2J1ZikKK3sKKwl0TGltTWxtT2VtRGF0YVJzcCAqbWxtX29lbV9kYXRhX3JzcDsKKworCWlmICgoKG1hY19jdHgtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fSURMRV9TVEFURSkgfHwKKwkgICAgIChtYWNfY3R4LT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX0pPSU5FRF9TVEFURSkgfHwKKwkgICAgIChtYWNfY3R4LT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX0FVVEhFTlRJQ0FURURfU1RBVEUpIHx8CisJICAgICAobWFjX2N0eC0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURSkgfHwKKwkgICAgIChtYWNfY3R4LT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKSkgeworCQkvKgorCQkgKiBIb2xkIG9udG8gdGhlIG9lbSBkYXRhIHJlcXVlc3QgY3JpdGVyaWEKKwkJICogRnJlZSBncExpbU1sbU9lbURhdGFSZXEgdG8gYXZvaWQgbWVtb3J5IGxlYWsgZHVlIHRvCisJCSAqIHNlY29uZCBPRU0gZGF0YSByZXF1ZXN0CisJCSAqLworCQlpZiAobWFjX2N0eC0+bGltLmdwTGltTWxtT2VtRGF0YVJlcSkgeworCQkJY2RmX21lbV9mcmVlKG1hY19jdHgtPmxpbS5ncExpbU1sbU9lbURhdGFSZXEpOworCQkJbWFjX2N0eC0+bGltLmdwTGltTWxtT2VtRGF0YVJlcSA9IE5VTEw7CisJCX0KKworCQltYWNfY3R4LT5saW0uZ3BMaW1NbG1PZW1EYXRhUmVxID0gKHRMaW1NbG1PZW1EYXRhUmVxICopIG1zZ19idWY7CisJCW1hY19jdHgtPmxpbS5nTGltUHJldk1sbVN0YXRlID0gbWFjX2N0eC0+bGltLmdMaW1NbG1TdGF0ZTsKKworCQlsaW1fbG9nKG1hY19jdHgsIExPRzIsIEZMKCJDYWxsaW5nIGxpbV9zZW5kX2hhbF9vZW1fZGF0YV9yZXEiKSk7CisJCWxpbV9zZW5kX2hhbF9vZW1fZGF0YV9yZXEobWFjX2N0eCk7CisJfSBlbHNlIHsKKwkJLyogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIG9lbSBkYXRhIHJlcSBpbiBvdGhlciBzdGF0ZXMgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLCBGTAorCQkJKCJ1bmV4cGVjdGVkIExJTV9NTE1fT0VNX0RBVEFfUkVRIGluIGludmFsaWQgc3RhdGUgJVgiKSwKKwkJCW1hY19jdHgtPmxpbS5nTGltTWxtU3RhdGUpOworCQlsaW1fcHJpbnRfbWxtX3N0YXRlKG1hY19jdHgsIExPR1csIG1hY19jdHgtPmxpbS5nTGltTWxtU3RhdGUpOworCisJCS8qIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZCAqLworCQljZGZfbWVtX2ZyZWUobXNnX2J1Zik7CisKKwkJLyogUmV0dXJuIE1lYXMgY29uZmlybSB3aXRoIElOVkFMSURfUEFSQU1FVEVSUyAqLworCQltbG1fb2VtX2RhdGFfcnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRMaW1NbG1PZW1EYXRhUnNwKSk7CisJCWlmIChtbG1fb2VtX2RhdGFfcnNwICE9IE5VTEwpIHsKKwkJCWxpbV9wb3N0X3NtZV9tZXNzYWdlKG1hY19jdHgsIExJTV9NTE1fT0VNX0RBVEFfQ05GLAorCQkJCQkgICAgICh1aW50MzJfdCAqKSBtbG1fb2VtX2RhdGFfcnNwKTsKKwkJCWNkZl9tZW1fZnJlZShtbG1fb2VtX2RhdGFfcnNwKTsKKwkJfSBlbHNlIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwKKwkJCSAgICAoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1sbV9vZW1fZGF0YV9yc3AiKSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUICovCisvKioKKyAqIGxpbV9wb3N0X2pvaW5fc2V0X2xpbmtfc3RhdGVfY2FsbGJhY2soKS0gcmVnaXN0ZXJlZCBjYWxsYmFjayB0byBwZXJmb3JtIHBvc3QKKyAqIHBlZXIgY3JlYXRpb24gb3BlcmF0aW9ucworICoKKyAqIEBtYWM6IHBvaW50ZXIgdG8gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAqIEBjYWxsYmFja19hcmc6IHJlZ2lzdGVyZWQgY2FsbGJhY2sgYXJndW1lbnQKKyAqIEBzdGF0dXM6IHBlZXIgY3JlYXRpb24gc3RhdHVzCisgKgorICogdGhpcyBpcyByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGR1cmluZyBhc3NvY2lhdGlvbiB0byBwZXJmb3JtCisgKiBwb3N0IHBlZXIgY3JlYXRpb24gb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBwZWVyIGNyZWF0aW9uIHN0YXR1cworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGxpbV9wb3N0X2pvaW5fc2V0X2xpbmtfc3RhdGVfY2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgbWFjLAorCQl2b2lkICpjYWxsYmFja19hcmcsIGJvb2wgc3RhdHVzKQoreworCXVpbnQ4X3QgY2hhbl9udW0sIHNlY19jaGFuX29mZnNldDsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5ID0gKHRwUEVTZXNzaW9uKSBjYWxsYmFja19hcmc7CisJdExpbU1sbUpvaW5DbmYgbWxtX2pvaW5fY25mOworCisJbGltX2xvZyhtYWMsIExPRzEsIEZMKCJTZXNzaW9uaWQgJWQgc2V0IGxpbmsgc3RhdGUoJWQpIGNiIHN0YXR1czolZCIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsIHNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlLAorCQkJc3RhdHVzKTsKKworCWlmICghc3RhdHVzKSB7CisJCWxpbV9sb2cobWFjLCBMT0dFLAorCQkJRkwoImZhaWxlZCB0byBmaW5kIHBlIHNlc3Npb24gZm9yIHNlc3Npb24gaWQ6JWQiKSwKKwkJCXNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkKTsKKwkJZ290byBmYWlsdXJlOworCX0KKworCWNoYW5fbnVtID0gc2Vzc2lvbl9lbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsOworCXNlY19jaGFuX29mZnNldCA9IHNlc3Npb25fZW50cnktPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwkvKgorCSAqIHN0b3JlIHRoZSBjaGFubmVsIHN3aXRjaCBzZXNzaW9uX2VudHJ5IGluIHRoZSBsaW0KKwkgKiBnbG9iYWwgdmFyaWFibGUKKwkgKi8KKwlzZXNzaW9uX2VudHJ5LT5jaGFubmVsQ2hhbmdlUmVhc29uQ29kZSA9CisJCQkgTElNX1NXSVRDSF9DSEFOTkVMX0pPSU47CisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBcCisJIGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwlzZXNzaW9uX2VudHJ5LT5wTGltTWxtUmVhc3NvY1JldHJ5UmVxID0gTlVMTDsKKyNlbmRpZgorCWxpbV9sb2cobWFjLCBMT0dFLAorCQlGTCgiW2xpbV9wcm9jZXNzX21sbV9qb2luX3JlcV06IHN1c3BlbmQgbGluayBzdWNjZXNzKCVkKSAiCisJCSJvbiBzZXNzaW9uaWQ6ICVkIHNldHRpbmcgY2hhbm5lbCB0bzogJWQgd2l0aCBjaF93aWR0aCA6JWQgIgorCQkiYW5kIG1heHR4UG93ZXI6ICVkIiksIHN0YXR1cywgc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCXNlc3Npb25fZW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwKKwkJc2Vzc2lvbl9lbnRyeS0+Y2hfd2lkdGgsCisJCXNlc3Npb25fZW50cnktPm1heFR4UG93ZXIpOworCWxpbV9zZXRfY2hhbm5lbChtYWMsIHNlc3Npb25fZW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwKKwkJc2Vzc2lvbl9lbnRyeS0+Y2hfY2VudGVyX2ZyZXFfc2VnMCwKKwkJc2Vzc2lvbl9lbnRyeS0+Y2hfY2VudGVyX2ZyZXFfc2VnMSwKKwkJc2Vzc2lvbl9lbnRyeS0+Y2hfd2lkdGgsCisJCXNlc3Npb25fZW50cnktPm1heFR4UG93ZXIsCisJCXNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkKTsKKwlyZXR1cm47CisKK2ZhaWx1cmU6CisJTVRSQUNFKG1hY190cmFjZShtYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJCSBzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSkpOworCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKwltbG1fam9pbl9jbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKwltbG1fam9pbl9jbmYuc2Vzc2lvbklkID0gc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQ7CisJbWxtX2pvaW5fY25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCWxpbV9wb3N0X3NtZV9tZXNzYWdlKG1hYywgTElNX01MTV9KT0lOX0NORiwgKHVpbnQzMl90ICopICZtbG1fam9pbl9jbmYpOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9wb3N0X2pvaW5fc3VzcGVuZF9saW5rKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUKKyAqIHN1c3BlbmQgbGluayB3aGlsZSBqb2luaW5nIG9mZiBjaGFubmVsLgorICoKKyAqIEBtYWNfY3R4OiAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAc3RhdHVzOiAgc3RhdHVzIG9mIHN1c3BlbmQgbGluay4KKyAqIEBjdHg6ICAgICBwYXNzZWQgd2hpbGUgY2FsbGluZyBzdXNwZW5kIGxpbmsoc2Vzc2lvbikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgZm9sbG93aW5nOgorICogICBDaGVjayBmb3Igc3VzcGVuZCBzdGF0ZS4KKyAqICAgSWYgc3VjY2VzcywgcHJvY2VlZCB3aXRoIHNldHRpbmcgbGluayBzdGF0ZSB0byByZWNpZXZlIHRoZQorICogICBwcm9iZSByZXNwb25zZS9iZWFjb24gZnJvbSBpbnRlbmRlZCBBUC4KKyAqICAgU3dpdGNoIHRvIHRoZSBBUHMgY2hhbm5lbC4KKyAqICAgT24gYW4gZXJyb3IgY2FzZSwgc2VuZCB0aGUgTUxNX0pPSU5fQ05GIHdpdGggZXJyb3Igc3RhdHVzLgorICoKKyAqIEBSZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorbGltX3Byb2Nlc3NfbWxtX3Bvc3Rfam9pbl9zdXNwZW5kX2xpbmsodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgICAgICAgQ0RGX1NUQVRVUyBzdGF0dXMsCisJCQkJICAgICAgIHVpbnQzMl90ICpjdHgpCit7CisJdExpbU1sbUpvaW5DbmYgbWxtX2pvaW5fY25mOworCXRwUEVTZXNzaW9uIHNlc3Npb24gPSAodHBQRVNlc3Npb24pIGN0eDsKKwl0U2lyTGlua1N0YXRlIGxua19zdGF0ZTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJTZXNzaW9uaWQgJWQgU3VzcGVuZCBsaW5rKE5PVElGWV9CU1MpIGZhaWxlZC4gU3RpbGwgcHJvY2VlZGluZyB3aXRoIGpvaW4iKSwKKwkJCXNlc3Npb24tPnBlU2Vzc2lvbklkKTsKKwl9CisJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihtYWNfY3R4LCBlTElNX0pPSU5fRkFJTF9USU1FUik7CisKKwkvKiBhc3NpZ24gYXBwcm9wcmlhdGUgc2Vzc2lvbklkIHRvIHRoZSB0aW1lciBvYmplY3QgKi8KKwltYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1Kb2luRmFpbHVyZVRpbWVyLnNlc3Npb25JZCA9CisJCXNlc3Npb24tPnBlU2Vzc2lvbklkOworCisJbG5rX3N0YXRlID0gKExJTV9JU19CVF9BTVBfU1RBX1JPTEUoc2Vzc2lvbikgPworCQllU0lSX0xJTktfQlRBTVBfUFJFQVNTT0NfU1RBVEUgOiBlU0lSX0xJTktfUFJFQVNTT0NfU1RBVEUpOworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIltsaW1fcHJvY2Vzc19tbG1fam9pbl9yZXFdOiBsbmtfc3RhdGU6JWQiKSwKKwkJbG5rX3N0YXRlKTsKKworCWlmIChsaW1fc2V0X2xpbmtfc3RhdGUobWFjX2N0eCwgbG5rX3N0YXRlLAorCQkJc2Vzc2lvbi0+cExpbU1sbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmJzc0lkLAorCQkJc2Vzc2lvbi0+c2VsZk1hY0FkZHIsCisJCQlsaW1fcG9zdF9qb2luX3NldF9saW5rX3N0YXRlX2NhbGxiYWNrLAorCQkJc2Vzc2lvbikgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJTZXNzaW9uSWQ6JWQgbGltX3NldF9saW5rX3N0YXRlIHRvIGVTSVJfTElOS19QUkVBU1NPQ19TVEFURSBGYWlsZWQhISIpLAorCQkJc2Vzc2lvbi0+cGVTZXNzaW9uSWQpOworCQlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwKKwkJCXNlc3Npb24tPnBMaW1NbG1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwgTE9HRSk7CisJCW1sbV9qb2luX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQlzZXNzaW9uLT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0lETEVfU1RBVEU7CisJCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisJCQkJIHNlc3Npb24tPnBlU2Vzc2lvbklkLCBzZXNzaW9uLT5saW1NbG1TdGF0ZSkpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybjsKK2Vycm9yOgorCW1sbV9qb2luX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCW1sbV9qb2luX2NuZi5zZXNzaW9uSWQgPSBzZXNzaW9uLT5wZVNlc3Npb25JZDsKKwltbG1fam9pbl9jbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9KT0lOX0NORiwKKwkJCSAgICAgKHVpbnQzMl90ICopICZtbG1fam9pbl9jbmYpOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9qb2luX3JlcSgpIC0gcHJvY2VzcyBtbG0gam9pbiByZXF1ZXN0LgorICoKKyAqIEBtYWNfY3R4OiAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAbXNnOiAgICAgICAgUG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNTE1fSk9JTl9SRVEgbWVzc2FnZQorICogZnJvbSBTTUUuIEl0IGRvZXMgZm9sbG93aW5nOgorICogMSkgSW5pdGlhbGl6ZSBMSU0sIEhBTCwgRFBICisgKiAyKSBDb25maWd1cmUgdGhlIEJTUyBmb3Igd2hpY2ggdGhlIEpPSU4gUkVRIHdhcyByZWNlaXZlZAorICogICBhKSBTZW5kIFdNQV9BRERfQlNTX1JFUSB0byBIQUwgLQorICogICBUaGlzIHdpbGwgaWRlbnRpZnkgdGhlIEJTUyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluCisgKiAgIC0tQU5ELS0KKyAqICAgQWRkIGEgU1RBIGVudHJ5IGZvciB0aGUgQVAgKGluIGEgU1RBIGNvbnRleHQpCisgKiAgIGIpIFdhaXQgZm9yIFdNQV9BRERfQlNTX1JTUAorICogICBjKSBTZW5kIFdNQV9BRERfU1RBX1JFUSB0byBIQUwKKyAqICAgVGhpcyB3aWxsIGFkZCB0aGUgImxvY2FsIFNUQSIgZW50cnkgdG8gdGhlIFNUQSB0YWJsZQorICogMykgQ29udGludWUgYXMgYmVmb3JlLCBpLmUsCisgKiAgIGEpIFNlbmQgYSBQUk9CRSBSRVEKKyAqICAgYikgV2FpdCBmb3IgUFJPQkUgUlNQL0JFQUNPTiBjb250YWluaW5nIHRoZSBTU0lEIHRoYXQKKyAqICAgd2UgYXJlIGludGVyZXN0ZWQgaW4KKyAqICAgYykgVGhlbiBzdGFydCBhbiBBVVRIIHNlcQorICogICBkKSBGb2xsb3dlZCBieSB0aGUgQVNTT0Mgc2VxCisgKgorICogQFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19tbG1fam9pbl9yZXEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3QgKm1zZykKK3sKKwl0TGltTWxtSm9pbkNuZiBtbG1qb2luX2NuZjsKKwl1aW50OF90IHNlc3Npb25pZDsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uOworCisJc2Vzc2lvbmlkID0gKCh0cExpbU1sbUpvaW5SZXEpIG1zZyktPnNlc3Npb25JZDsKKworCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LCBzZXNzaW9uaWQpOworCWlmIChOVUxMID09IHNlc3Npb24pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiU2Vzc2lvbklkOiVkIGRvZXMgbm90IGV4aXN0IiksCisJCQlzZXNzaW9uaWQpOworCQlnb3RvIGVycm9yOworCX0KKworCWlmICgoIUxJTV9JU19BUF9ST0xFKHNlc3Npb24pICYmCisJICAgICAhTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb24pKSAmJgorCSAgICAgKChzZXNzaW9uLT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9JRExFX1NUQVRFKSB8fAorCSAgICAgKHNlc3Npb24tPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0pPSU5FRF9TVEFURSkpICYmCisJICAgICAoU0lSX01BQ19HRVRfRVNTCisJCSgoKHRwTGltTWxtSm9pblJlcSkgbXNnKS0+YnNzRGVzY3JpcHRpb24uY2FwYWJpbGl0eUluZm8pICE9CisJCVNJUl9NQUNfR0VUX0lCU1MoKCh0cExpbU1sbUpvaW5SZXEpIG1zZyktPmJzc0Rlc2NyaXB0aW9uLgorCQkJY2FwYWJpbGl0eUluZm8pKSkgeworCQkvKiBIb2xkIG9udG8gSm9pbiByZXF1ZXN0IHBhcmFtZXRlcnMgKi8KKworCQlzZXNzaW9uLT5wTGltTWxtSm9pblJlcSA9ICh0cExpbU1sbUpvaW5SZXEpIG1zZzsKKwkJaWYgKGlzX2xpbV9zZXNzaW9uX29mZl9jaGFubmVsKG1hY19jdHgsIHNlc3Npb25pZCkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQkiU2Vzc2lvbklkOiVkIExpbVNlc3Npb24gaXMgb24gT2ZmQ2hhbm5lbCIsCisJCQkJc2Vzc2lvbmlkKTsKKwkJCS8qIHN1c3BlbmQgbGluayAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJCUZMKCJTdXNwZW5kIGxpbmssIHNlc3Npb25pZCAlZCBpcyBvZmYgY2hhbm5lbCIpLAorCQkJCXNlc3Npb25pZCk7CisJCQlpZiAobGltX2lzX2xpbmtfc3VzcGVuZGVkKG1hY19jdHgpKSB7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgKKwkJCQkJImxpbmsgaXMgYWxyZWFkeSBzdXNwZW5kZWQsIHNlc3Npb24gJWQiCisJCQkJCSksIHNlc3Npb25pZCk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWxpbV9wcm9jZXNzX21sbV9wb3N0X2pvaW5fc3VzcGVuZF9saW5rKG1hY19jdHgsCisJCQkJQ0RGX1NUQVRVU19TVUNDRVNTLCAodWludDMyX3QgKilzZXNzaW9uKTsKKwkJfSBlbHNlIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIk5vIG5lZWQgdG8gU3VzcGVuZCBsaW5rIikpOworCQkJIC8qCisJCQkgICogTm8gbmVlZCB0byBTdXNwZW5kIGxpbmsgYXMgTGltU2Vzc2lvbiBpcyBub3QKKwkJCSAgKiBvZmYgY2hhbm5lbCwgY2FsbGluZworCQkJICAqIGxpbV9wcm9jZXNzX21sbV9wb3N0X2pvaW5fc3VzcGVuZF9saW5rIHdpdGgKKwkJCSAgKiBzdGF0dXMgYXMgU1VDQ0VTUy4KKwkJCSAgKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgiU2Vzc2lvbklkOiVkIEpvaW4gcmVxIG9uIGN1cnJlbnQgY2hhbiIpLAorCQkJCXNlc3Npb25pZCk7CisJCQlsaW1fcHJvY2Vzc19tbG1fcG9zdF9qb2luX3N1c3BlbmRfbGluayhtYWNfY3R4LAorCQkJCUNERl9TVEFUVVNfU1VDQ0VTUywgKHVpbnQzMl90ICopc2Vzc2lvbik7CisJCX0KKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCS8qKgorCQkgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgSk9JTiByZXEgaW4gc3RhdGVzIG90aGVyIHRoYW4KKwkJICogSWRsZSBzdGF0ZSBvciBvbiBBUC4KKwkJICogUmV0dXJuIGpvaW4gY29uZmlybSB3aXRoIGludmFsaWQgcGFyYW1ldGVycyBjb2RlLgorCQkgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlNlc3Npb246JWQgVW5leHBlY3RlZCBKb2luIHJlcSwgcm9sZSAlZCBzdGF0ZSAlWCIpLAorCQkJc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIEdFVF9MSU1fU1lTVEVNX1JPTEUoc2Vzc2lvbiksCisJCQlzZXNzaW9uLT5saW1NbG1TdGF0ZSk7CisJCWxpbV9wcmludF9tbG1fc3RhdGUobWFjX2N0eCwgTE9HRSwgc2Vzc2lvbi0+bGltTWxtU3RhdGUpOworCX0KKworZXJyb3I6CisJY2RmX21lbV9mcmVlKG1zZyk7CisJaWYgKHNlc3Npb24gIT0gTlVMTCkKKwkJc2Vzc2lvbi0+cExpbU1sbUpvaW5SZXEgPSBOVUxMOworCW1sbWpvaW5fY25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJbWxtam9pbl9jbmYuc2Vzc2lvbklkID0gc2Vzc2lvbmlkOworCW1sbWpvaW5fY25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCWxpbV9wb3N0X3NtZV9tZXNzYWdlKG1hY19jdHgsIExJTV9NTE1fSk9JTl9DTkYsCisJCSh1aW50MzJfdCAqKSZtbG1qb2luX2NuZik7CisKK30KKworLyoqCisgKiBsaW1faXNfYXV0aF9yZXFfZXhwZWN0ZWQoKSAtIGNoZWNrIGlmIGF1dGggcmVxdWVzdCBpcyBleHBlY3RlZAorICoKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBzZXNzaW9uOiBQRSBzZXNzaW9uIGVudHJ5CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX3Byb2Nlc3NfbWxtX2F1dGhfcmVxIHRvIGNoZWNrCisgKiBpZiBhdXRoIHJlcXVlc3QgaXMgZXhwZWN0ZWQuCisgKgorICogUmV0dXJuOiB0cnVlIGlmIGV4cGVjdGVkIGFuZCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wgbGltX2lzX2F1dGhfcmVxX2V4cGVjdGVkKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJICAgICB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCWJvb2wgZmxhZyA9IGZhbHNlOworCisJLyoKKwkgKiBFeHBlY3QgQXV0aCByZXF1ZXN0IG9ubHkgd2hlbjoKKwkgKiAxLiBTVEEgam9pbmVkL2Fzc29jaWF0ZWQgd2l0aCBhIEJTUyBvcgorCSAqIDIuIFNUQSBpcyBpbiBJQlNTIG1vZGUKKwkgKiBhbmQgU1RBIGlzIGdvaW5nIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIGEgdW5pY2FzdAorCSAqIGFkZHJlc3MgYW5kIHJlcXVlc3RlZCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gaXMKKwkgKiBzdXBwb3J0ZWQuCisJICovCisKKwlmbGFnID0gKCgoKExJTV9JU19TVEFfUk9MRShzZXNzaW9uKSB8fAorCQkgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHNlc3Npb24pKSAmJgorCQkgKChzZXNzaW9uLT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9KT0lORURfU1RBVEUpIHx8CisJCSAgKHNlc3Npb24tPmxpbU1sbVN0YXRlID09CisJCQkJCWVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKSkgfHwKKwkJICAoTElNX0lTX0lCU1NfUk9MRShzZXNzaW9uKSAmJgorCQkgIChzZXNzaW9uLT5saW1NbG1TdGF0ZSA9PQorCQkJCQllTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURSkpKSAmJgorCQkoIWxpbV9pc19ncm91cF9hZGRyKG1hY19jdHgtPmxpbS5ncExpbU1sbUF1dGhSZXEtPnBlZXJNYWNBZGRyKSkKKwkJICYmIGxpbV9pc19hdXRoX2FsZ29fc3VwcG9ydGVkKG1hY19jdHgsCisJCQltYWNfY3R4LT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5hdXRoVHlwZSwgc2Vzc2lvbikpOworCisJcmV0dXJuIGZsYWc7Cit9CisKKy8qKgorICogbGltX2lzX3ByZWF1dGhfY3R4X2V4aXNpdHMoKSAtIGNoZWNrIGlmIHByZWF1dGggY29udGV4dCBleGlzdHMKKyAqCisgKiBAbWFjX2N0eDogICAgICAgICAgZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAc2Vzc2lvbjogICAgICAgICAgUEUgc2Vzc2lvbiBlbnRyeQorICogQHByZWF1dGhfbm9kZV9wdHI6IHBvaW50ZXIgdG8gcHJlYXV0aCBub2RlIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19tbG1fYXV0aF9yZXEgdG8gY2hlY2sKKyAqIGlmIHByZWF1dGggY29udGV4dCBhbHJlYWR5IGV4aXN0cworICoKKyAqIFJldHVybjogdHJ1ZSBpZiBleGlzdHMgYW5kIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgYm9vbCBsaW1faXNfcHJlYXV0aF9jdHhfZXhpc3RzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJICAgICAgdHBQRVNlc3Npb24gc2Vzc2lvbiwKKwkJCQkgICAgICBzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICoqcHJlYXV0aF9ub2RlX3B0cikKK3sKKwlib29sIGZsID0gZmFsc2U7CisJc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqcHJlYXV0aF9ub2RlOworCXRwRHBoSGFzaE5vZGUgc3RhZHM7CisJdFNpck1hY0FkZHIgY3Vycl9ic3NpZDsKKworCXByZWF1dGhfbm9kZSA9ICpwcmVhdXRoX25vZGVfcHRyOworCXNpcl9jb3B5X21hY19hZGRyKGN1cnJfYnNzaWQsIHNlc3Npb24tPmJzc0lkKTsKKwlzdGFkcyA9IGRwaF9nZXRfaGFzaF9lbnRyeShtYWNfY3R4LCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCQkgICAmc2Vzc2lvbi0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJcHJlYXV0aF9ub2RlID0gbGltX3NlYXJjaF9wcmVfYXV0aF9saXN0KG1hY19jdHgsCisJCQkJbWFjX2N0eC0+bGltLmdwTGltTWxtQXV0aFJlcS0+cGVlck1hY0FkZHIpOworCisJZmwgPSAoKChMSU1fSVNfU1RBX1JPTEUoc2Vzc2lvbikgfHwgTElNX0lTX0JUX0FNUF9TVEFfUk9MRShzZXNzaW9uKSkgJiYKKwkgICAgICAgKHNlc3Npb24tPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpICYmCisJICAgICAgKChzdGFkcyAhPSBOVUxMKSAmJgorCSAgICAgICAobWFjX2N0eC0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGUgPT0KKwkJCXN0YWRzLT5tbG1TdGFDb250ZXh0LmF1dGhUeXBlKSkgJiYKKwkgICAgICAgKGNkZl9tZW1fY29tcGFyZShtYWNfY3R4LT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5wZWVyTWFjQWRkciwKKwkJCWN1cnJfYnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpKSkgfHwKKwkgICAgICAoKHByZWF1dGhfbm9kZSAhPSBOVUxMKSAmJgorCSAgICAgICAocHJlYXV0aF9ub2RlLT5hdXRoVHlwZSA9PQorCQkJbWFjX2N0eC0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGUpKSk7CisKKwlyZXR1cm4gZmw7Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX2F1dGhfcmVxKCkgLSBwcm9jZXNzIGxpbSBhdXRoIHJlcXVlc3QKKyAqCisgKiBAbWFjX2N0eDogICBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBtc2c6ICAgICAgIE1MTSBhdXRoIHJlcXVlc3QgbWVzc2FnZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgTUxNX0FVVEhfUkVRIG1lc3NhZ2UgZnJvbSBTTUUKKyAqCisgKiBAUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX21sbV9hdXRoX3JlcSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCAqbXNnKQoreworCXVpbnQzMl90IG51bV9wcmVhdXRoX2N0eDsKKwl0U2lyTWFjQWRkciBjdXJyX2Jzc2lkOworCXRTaXJNYWNBdXRoRnJhbWVCb2R5IGF1dGhfZnJhbWVfYm9keTsKKwl0TGltTWxtQXV0aENuZiBtbG1fYXV0aF9jbmY7CisJc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqcHJlYXV0aF9ub2RlID0gTlVMTDsKKwl1aW50OF90IHNlc3Npb25faWQ7CisJdHBQRVNlc3Npb24gc2Vzc2lvbjsKKworCWlmIChtc2cgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCW1hY19jdHgtPmxpbS5ncExpbU1sbUF1dGhSZXEgPSAodExpbU1sbUF1dGhSZXEgKikgbXNnOworCXNlc3Npb25faWQgPSBtYWNfY3R4LT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5zZXNzaW9uSWQ7CisJc2Vzc2lvbiA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKG1hY19jdHgsIHNlc3Npb25faWQpOworCWlmIChOVUxMID09IHNlc3Npb24pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLCBGTCgiU2Vzc2lvbklkOiVkIGRvZXMgbm90IGV4aXN0IiksCisJCQlzZXNzaW9uX2lkKTsKKwkJcmV0dXJuOworCX0KKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlByb2Nlc3MgQXV0aCBSZXEgc2Vzc2lvbklEICVkIFN5c3RlbXJvbGUgJWQiCisJCQkgICAgICAgIm1sbXN0YXRlICVkIGZyb206ICIgTUFDX0FERFJFU1NfU1RSCisJCQkgICAgICAgIiB3aXRoIGF1dGh0eXBlICVkIiksIHNlc3Npb25faWQsCisJCUdFVF9MSU1fU1lTVEVNX1JPTEUoc2Vzc2lvbiksIHNlc3Npb24tPmxpbU1sbVN0YXRlLAorCQlNQUNfQUREUl9BUlJBWShtYWNfY3R4LT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5wZWVyTWFjQWRkciksCisJCW1hY19jdHgtPmxpbS5ncExpbU1sbUF1dGhSZXEtPmF1dGhUeXBlKTsKKworCXNpcl9jb3B5X21hY19hZGRyKGN1cnJfYnNzaWQsIHNlc3Npb24tPmJzc0lkKTsKKworCWlmICghbGltX2lzX2F1dGhfcmVxX2V4cGVjdGVkKG1hY19jdHgsIHNlc3Npb24pKSB7CisJCS8qCisJCSAqIFVuZXhwZWN0ZWQgYXV0aCByZXF1ZXN0LgorCQkgKiBSZXR1cm4gQXV0aCBjb25maXJtIHdpdGggSW52YWxpZCBwYXJhbWV0ZXJzIGNvZGUuCisJCSAqLworCQltbG1fYXV0aF9jbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKwkJZ290byBlbmQ7CisJfQorCisJLyoKKwkgKiBUaGlzIGlzIGEgcmVxdWVzdCBmb3IgcHJlLWF1dGhlbnRpY2F0aW9uLiBDaGVjayBpZiB0aGVyZSBleGlzdHMKKwkgKiBjb250ZXh0IGFscmVhZHkgZm9yIHRoZSByZXF1ZXN0ZWQgcGVlciBPUgorCSAqIGlmIHRoaXMgcmVxdWVzdCBpcyBmb3IgdGhlIEFQIHdlJ3JlIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGguCisJICogSWYgeWVzLCByZXR1cm4gYXV0aCBjb25maXJtIGltbWVkaWF0ZWx5IHdoZW4KKwkgKiByZXF1ZXN0ZWQgYXV0aCB0eXBlIGlzIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGJlZm9yZS4KKwkgKi8KKwlpZiAobGltX2lzX3ByZWF1dGhfY3R4X2V4aXN0cyhtYWNfY3R4LCBzZXNzaW9uLCAmcHJlYXV0aF9ub2RlKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzIsCisJCSAgICBGTCgiQWxyZWFkeSBoYXZlIHByZS1hdXRoIGNvbnRleHQgd2l0aCBwZWVyOiAiCisJCSAgICBNQUNfQUREUkVTU19TVFIpLAorCQkgICAgTUFDX0FERFJfQVJSQVkobWFjX2N0eC0+bGltLmdwTGltTWxtQXV0aFJlcS0+cGVlck1hY0FkZHIpKTsKKwkJbWxtX2F1dGhfY25mLnJlc3VsdENvZGUgPSAodFNpclJlc3VsdENvZGVzKQorCQkJCQkJZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVM7CisJCWdvdG8gZW5kOworCX0gZWxzZSB7CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfTUFYX05VTV9QUkVfQVVUSCwKKwkJCSh1aW50MzJfdCAqKSAmbnVtX3ByZWF1dGhfY3R4KSAhPSBlU0lSX1NVQ0NFU1MpCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkgICAgRkwoIkNvdWxkIG5vdCByZXRyaWV2ZSBOdW1QcmVBdXRoTGltaXQgZnJvbSBDRkciKSk7CisKKwkJaWYgKG1hY19jdHgtPmxpbS5nTGltTnVtUHJlQXV0aENvbnRleHRzID09IG51bV9wcmVhdXRoX2N0eCkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJOdW1iZXIgb2YgcHJlLWF1dGggcmVhY2hlZCBtYXggbGltaXQiKSk7CisJCQkvKiBSZXR1cm4gQXV0aCBjb25maXJtIHdpdGggcmVqZWN0IGNvZGUgKi8KKwkJCW1sbV9hdXRoX2NuZi5yZXN1bHRDb2RlID0KKwkJCQllU0lSX1NNRV9NQVhfTlVNX09GX1BSRV9BVVRIX1JFQUNIRUQ7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKworCS8qIERlbGV0ZSBwcmUtYXV0aCBub2RlIGlmIGV4aXN0cyAqLworCWlmIChwcmVhdXRoX25vZGUpCisJCWxpbV9kZWxldGVfcHJlX2F1dGhfbm9kZShtYWNfY3R4LAorCQkJIG1hY19jdHgtPmxpbS5ncExpbU1sbUF1dGhSZXEtPnBlZXJNYWNBZGRyKTsKKworCXNlc3Npb24tPmxpbVByZXZNbG1TdGF0ZSA9IHNlc3Npb24tPmxpbU1sbVN0YXRlOworCXNlc3Npb24tPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTJfU1RBVEU7CisJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX01MTV9TVEFURSwgc2Vzc2lvbi0+cGVTZXNzaW9uSWQsCisJCSAgICAgICBzZXNzaW9uLT5saW1NbG1TdGF0ZSkpOworCisJLyogUHJlcGFyZSAmIHNlbmQgQXV0aGVudGljYXRpb24gZnJhbWUgKi8KKwlhdXRoX2ZyYW1lX2JvZHkuYXV0aEFsZ29OdW1iZXIgPQorCQkodWludDhfdCkgbWFjX2N0eC0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGU7CisJYXV0aF9mcmFtZV9ib2R5LmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9IFNJUl9NQUNfQVVUSF9GUkFNRV8xOworCWF1dGhfZnJhbWVfYm9keS5hdXRoU3RhdHVzQ29kZSA9IDA7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChtYWNfY3R4LCBXTEFOX1BFX0RJQUdfQVVUSF9TVEFSVF9FVkVOVCwgc2Vzc2lvbiwKKwkJCSAgICAgIGVTSVJfU1VDQ0VTUywgYXV0aF9mcmFtZV9ib2R5LmF1dGhTdGF0dXNDb2RlKTsKKyNlbmRpZgorCisJbGltX3NlbmRfYXV0aF9tZ210X2ZyYW1lKG1hY19jdHgsCisJCSZhdXRoX2ZyYW1lX2JvZHksIG1hY19jdHgtPmxpbS5ncExpbU1sbUF1dGhSZXEtPnBlZXJNYWNBZGRyLAorCQlMSU1fTk9fV0VQX0lOX0ZDLCBzZXNzaW9uKTsKKworCS8qIGFzc2lnbiBhcHByb3ByaWF0ZSBzZXNzaW9uX2lkIHRvIHRoZSB0aW1lciBvYmplY3QgKi8KKwltYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1BdXRoRmFpbHVyZVRpbWVyLnNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisKKwkvKiBBY3RpdmF0ZSBBdXRoIGZhaWx1cmUgdGltZXIgKi8KKwlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsCisJCQkgc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIGVMSU1fQVVUSF9GQUlMX1RJTUVSKSk7CisJaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZtYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1BdXRoRmFpbHVyZVRpbWVyKQorCSAgICAhPSBUWF9TVUNDRVNTKSB7CisJCS8qIENvdWxkIG5vdCBzdGFydCBBdXRoIGZhaWx1cmUgdGltZXIuICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJjb3VsZCBub3Qgc3RhcnQgQXV0aCBmYWlsdXJlIHRpbWVyIikpOworCQkvKiBDbGVhbnVwIGFzIGlmIGF1dGggdGltZXIgZXhwaXJlZCAqLworCQlsaW1fcHJvY2Vzc19hdXRoX2ZhaWx1cmVfdGltZW91dChtYWNfY3R4KTsKKwl9CisJcmV0dXJuOworZW5kOgorCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWxtX2F1dGhfY25mLnBlZXJNYWNBZGRyLAorCQkgICAgICh1aW50OF90ICopICZtYWNfY3R4LT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5wZWVyTWFjQWRkciwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCW1sbV9hdXRoX2NuZi5hdXRoVHlwZSA9IG1hY19jdHgtPmxpbS5ncExpbU1sbUF1dGhSZXEtPmF1dGhUeXBlOworCW1sbV9hdXRoX2NuZi5zZXNzaW9uSWQgPSBzZXNzaW9uX2lkOworCisJY2RmX21lbV9mcmVlKG1hY19jdHgtPmxpbS5ncExpbU1sbUF1dGhSZXEpOworCW1hY19jdHgtPmxpbS5ncExpbU1sbUF1dGhSZXEgPSBOVUxMOworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgIlNlc3Npb25JZDolZCBMaW1Qb3N0U21lIExJTV9NTE1fQVVUSF9DTkYgIiwKKwkJc2Vzc2lvbl9pZCk7CisJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9BVVRIX0NORiwKKwkJCSAgICAgKHVpbnQzMl90ICopICZtbG1fYXV0aF9jbmYpOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9hc3NvY19yZXEoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MKKyAqIE1MTV9BU1NPQ19SRVEgbWVzc2FnZSBmcm9tIFNNRQorICoKKyAqIEBtYWNfY3R4OiAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAbXNnX2J1ZjogICAgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1MTV9BU1NPQ19SRVEgbWVzc2FnZSBmcm9tIFNNRQorICoKKyAqIEBSZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX21sbV9hc3NvY19yZXEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3QgKm1zZ19idWYpCit7CisJdFNpck1hY0FkZHIgY3Vycl9ic3NJZDsKKwl0TGltTWxtQXNzb2NSZXEgKm1sbV9hc3NvY19yZXE7CisJdExpbU1sbUFzc29jQ25mIG1sbV9hc3NvY19jbmY7CisJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeTsKKworCWlmIChtc2dfYnVmID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwltbG1fYXNzb2NfcmVxID0gKHRMaW1NbG1Bc3NvY1JlcSAqKSBtc2dfYnVmOworCXNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LAorCQkJCQkJICAgICAgbWxtX2Fzc29jX3JlcS0+c2Vzc2lvbklkKTsKKwlpZiAoc2Vzc2lvbl9lbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJTZXNzaW9uSWQ6JWQgU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCIpLAorCQkJbWxtX2Fzc29jX3JlcS0+c2Vzc2lvbklkKTsKKwkJY2RmX21lbV9mcmVlKG1sbV9hc3NvY19yZXEpOworCQlyZXR1cm47CisJfQorCisJc2lyX2NvcHlfbWFjX2FkZHIoY3Vycl9ic3NJZCwgc2Vzc2lvbl9lbnRyeS0+YnNzSWQpOworCisJaWYgKCEoKCFMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSAmJgorCSAgICAhTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb25fZW50cnkpKSAmJgorCQkoc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURSB8fAorCQkgc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fSk9JTkVEX1NUQVRFKSAmJgorCQkoY2RmX21lbV9jb21wYXJlKG1sbV9hc3NvY19yZXEtPnBlZXJNYWNBZGRyLAorCQkgY3Vycl9ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpKSkgeworCQkvKgorCQkgKiBSZWNlaXZlZCBBc3NvY2lhdGlvbiByZXF1ZXN0IGVpdGhlciBpbiBpbnZhbGlkIHN0YXRlCisJCSAqIG9yIHRvIGEgcGVlciBNQUMgZW50aXR5IHdob3NlIGFkZHJlc3MgaXMgZGlmZmVyZW50CisJCSAqIGZyb20gb25lIHRoYXQgU1RBIGlzIGN1cnJlbnRseSBqb2luZWQgd2l0aCBvciBvbiBBUC4KKwkJICogUmV0dXJuIEFzc29jIGNvbmZpcm0gd2l0aCBJbnZhbGlkIHBhcmFtZXRlcnMgY29kZS4KKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIE1MTV9BU1NPQ19DTkYgaW4gc3RhdGUgJVggZm9yIHJvbGU9JWQsIE1BQyBhZGRyPSAiCisJCQkgICBNQUNfQUREUkVTU19TVFIpLCBzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSwKKwkJCUdFVF9MSU1fU1lTVEVNX1JPTEUoc2Vzc2lvbl9lbnRyeSksCisJCQlNQUNfQUREUl9BUlJBWShtbG1fYXNzb2NfcmVxLT5wZWVyTWFjQWRkcikpOworCQlsaW1fcHJpbnRfbWxtX3N0YXRlKG1hY19jdHgsIExPR1csIHNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlKTsKKwkJbWxtX2Fzc29jX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCQltbG1fYXNzb2NfY25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBtYXAgdGhlIHNlc3Npb24gZW50cnkgcG9pbnRlciB0byB0aGUgQXNzb2NGYWlsdXJlVGltZXIgKi8KKwltYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1Bc3NvY0ZhaWx1cmVUaW1lci5zZXNzaW9uSWQgPQorCQltbG1fYXNzb2NfcmVxLT5zZXNzaW9uSWQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCS8qCisJICogU3RvcmUgY3VycmVudCBNTE0gc3RhdGUgaW4gY2FzZSBBU1NPQyByZXNwb25zZSByZXR1cm5zIHdpdGgKKwkgKiBUUllfQUdBSU5fTEFURVIgcmV0dXJuIGNvZGUuCisJICovCisJaWYgKHNlc3Npb25fZW50cnktPmxpbVJtZkVuYWJsZWQpIHsKKwkJc2Vzc2lvbl9lbnRyeS0+cG1mQ29tZWJhY2tUaW1lckluZm8ubGltUHJldk1sbVN0YXRlID0KKwkJCXNlc3Npb25fZW50cnktPmxpbVByZXZNbG1TdGF0ZTsKKwkJc2Vzc2lvbl9lbnRyeS0+cG1mQ29tZWJhY2tUaW1lckluZm8ubGltTWxtU3RhdGUgPQorCQkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGU7CisJfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMVcgKi8KKworCXNlc3Npb25fZW50cnktPmxpbVByZXZNbG1TdGF0ZSA9IHNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlOworCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfQVNTT0NfUlNQX1NUQVRFOworCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisJCQkgc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkgc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUpKTsKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJTZXNzaW9uSWQ6JWQgU2VuZGluZyBBc3NvY19SZXEgRnJhbWUiKSwKKwkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQpOworCisJLyogUHJlcGFyZSBhbmQgc2VuZCBBc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lICovCisJbGltX3NlbmRfYXNzb2NfcmVxX21nbXRfZnJhbWUobWFjX2N0eCwgbWxtX2Fzc29jX3JlcSwgc2Vzc2lvbl9lbnRyeSk7CisKKwkvKgorCSAqIFNldCB0aGUgbGluayBzdGF0ZSB0byBwb3N0QXNzb2MsIHNvIEhXIGNhbiBzdGFydCByZWNlaXZpbmcgZnJhbWVzCisJICogZnJvbSBBUC4KKwkgKi8KKwlpZiAoKHNlc3Npb25fZW50cnktPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9TVEFfTU9ERSkgfHwKKwkgICAgKChzZXNzaW9uX2VudHJ5LT5ic3NUeXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSkKKwkgICAgICYmIExJTV9JU19CVF9BTVBfU1RBX1JPTEUoc2Vzc2lvbl9lbnRyeSkpKSB7CisJCWlmIChsaW1fc2V0X2xpbmtfc3RhdGUobWFjX2N0eCwgZVNJUl9MSU5LX0JUQU1QX1BPU1RBU1NPQ19TVEFURSwKKwkJCQkJY3Vycl9ic3NJZCwgc2Vzc2lvbl9lbnRyeS0+c2VsZk1hY0FkZHIsCisJCQkJCU5VTEwsIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiRmFpbGVkIHRvIHNldCB0aGUgTGlua1N0YXRlIikpOworCX0KKwkvKiBTdGFydCBhc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyICovCisJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLAorCQkJIHNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkLCBlTElNX0FTU09DX0ZBSUxfVElNRVIpKTsKKwlpZiAodHhfdGltZXJfYWN0aXZhdGUoJm1hY19jdHgtPmxpbS5saW1UaW1lcnMuZ0xpbUFzc29jRmFpbHVyZVRpbWVyKQorCSAgICAhPSBUWF9TVUNDRVNTKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJTZXNzaW9uSWQ6JWQgY291bGRuJ3Qgc3RhcnQgQXNzb2MgZmFpbHVyZSB0aW1lciIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQpOworCQkvKiBDbGVhbnVwIGFzIGlmIGFzc29jIHRpbWVyIGV4cGlyZWQgKi8KKwkJbGltX3Byb2Nlc3NfYXNzb2NfZmFpbHVyZV90aW1lb3V0KG1hY19jdHgsIExJTV9BU1NPQyk7CisJfQorCisJcmV0dXJuOworZW5kOgorCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICovCisJbWxtX2Fzc29jX2NuZi5zZXNzaW9uSWQgPSBtbG1fYXNzb2NfcmVxLT5zZXNzaW9uSWQ7CisJLyogRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkIGZvciBhc3NvY1JlcSAqLworCWNkZl9tZW1fZnJlZShtbG1fYXNzb2NfcmVxKTsKKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX0FTU09DX0NORiwKKwkJCSAgICAgKHVpbnQzMl90ICopICZtbG1fYXNzb2NfY25mKTsKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19tbG1fcmVhc3NvY19yZXEoKSAtIHByb2Nlc3MgbWxtIHJlYXNzb2MgcmVxdWVzdC4KKyAqCisgKiBAbWFjX2N0eDogICAgIHBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2c6ICBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1MTV9SRUFTU09DX1JFUSBtZXNzYWdlCisgKiBmcm9tIFNNRQorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19tbG1fcmVhc3NvY19yZXEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3QgKm1zZykKK3sKKwl1aW50OF90IGNoYW5uZWwsIHNlY19jaF9vZmZzZXQ7CisJc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqYXV0aF9ub2RlOworCXRMaW1NbG1SZWFzc29jUmVxICpyZWFzc29jX3JlcTsKKwl0TGltTWxtUmVhc3NvY0NuZiByZWFzc29jX2NuZjsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uOworCisJaWYgKG1zZyA9PSBOVUxMKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJcmVhc3NvY19yZXEgPSAodExpbU1sbVJlYXNzb2NSZXEgKikgbXNnOworCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LAorCQkJcmVhc3NvY19yZXEtPnNlc3Npb25JZCk7CisJaWYgKE5VTEwgPT0gc2Vzc2lvbikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkICVkIiksCisJCQlyZWFzc29jX3JlcS0+c2Vzc2lvbklkKTsKKwkJY2RmX21lbV9mcmVlKHJlYXNzb2NfcmVxKTsKKwkJcmV0dXJuOworCX0KKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlByb2Nlc3MgUmVBc3NvYyBSZXEgb24gc2Vzc2lvbklEICVkIFN5c3RlbXJvbGUgJWQgbWxtc3RhdGUgJWQgZnJvbTogIiBNQUNfQUREUkVTU19TVFIpLAorCQlyZWFzc29jX3JlcS0+c2Vzc2lvbklkLCBHRVRfTElNX1NZU1RFTV9ST0xFKHNlc3Npb24pLAorCQlzZXNzaW9uLT5saW1NbG1TdGF0ZSwgTUFDX0FERFJfQVJSQVkocmVhc3NvY19yZXEtPnBlZXJNYWNBZGRyKSk7CisKKwlpZiAoKExJTV9JU19BUF9ST0xFKHNlc3Npb24pIHx8CisJCUxJTV9JU19CVF9BTVBfQVBfUk9MRShzZXNzaW9uKSkgfHwKKwkJKHNlc3Npb24tPmxpbU1sbVN0YXRlICE9CisJCWVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKSB7CisJCS8qCisJCSAqIFJlY2VpdmVkIFJlYXNzb2MgcmVxdWVzdCBpbiBpbnZhbGlkIHN0YXRlIG9yCisJCSAqIGluIEFQIHJvbGUuUmV0dXJuIFJlYXNzb2MgY29uZmlybSB3aXRoIEludmFsaWQKKwkJICogcGFyYW1ldGVycyBjb2RlLgorCQkgKi8KKworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBNTE1fUkVBU1NPQ19DTkYgaW4gc3RhdGUgJVggZm9yIHJvbGU9JWQsIE1BQyBhZGRyPSAiIE1BQ19BRERSRVNTX1NUUiksCisJCQlzZXNzaW9uLT5saW1NbG1TdGF0ZSwgR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uKSwKKwkJCU1BQ19BRERSX0FSUkFZKHJlYXNzb2NfcmVxLT5wZWVyTWFjQWRkcikpOworCQlsaW1fcHJpbnRfbWxtX3N0YXRlKG1hY19jdHgsIExPR1csIHNlc3Npb24tPmxpbU1sbVN0YXRlKTsKKwkJcmVhc3NvY19jbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKwkJcmVhc3NvY19jbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChzZXNzaW9uLT5wTGltTWxtUmVhc3NvY1JlcSkKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPnBMaW1NbG1SZWFzc29jUmVxKTsKKworCS8qCisJICogSG9sZCBSZS1Bc3NvYyByZXF1ZXN0IGFzIHBhcnQgb2YgU2Vzc2lvbiwga25vY2stb3V0IG1hY19jdHgKKwkgKiBIb2xkIG9udG8gUmVhc3NvYyByZXF1ZXN0IHBhcmFtZXRlcnMKKwkgKi8KKwlzZXNzaW9uLT5wTGltTWxtUmVhc3NvY1JlcSA9IHJlYXNzb2NfcmVxOworCisJLyogU2VlIGlmIHdlIGhhdmUgcHJlLWF1dGggY29udGV4dCB3aXRoIG5ldyBBUCAqLworCWF1dGhfbm9kZSA9IGxpbV9zZWFyY2hfcHJlX2F1dGhfbGlzdChtYWNfY3R4LCBzZXNzaW9uLT5saW1SZUFzc29jYnNzSWQpOworCisJaWYgKCFhdXRoX25vZGUgJiYgKCFjZGZfbWVtX2NvbXBhcmUocmVhc3NvY19yZXEtPnBlZXJNYWNBZGRyLAorCQkJCQkgICAgc2Vzc2lvbi0+YnNzSWQsCisJCQkJCSAgICBzaXplb2YodFNpck1hY0FkZHIpKSkpIHsKKwkJLyoKKwkJICogRWl0aGVyIHByZS1hdXRoIGNvbnRleHQgZG9lcyBub3QgZXhpc3QgQU5ECisJCSAqIHdlIGFyZSBub3QgcmVhc3NvY2lhdGluZyB3aXRoIGN1cnJlbnRseQorCQkgKiBhc3NvY2lhdGVkIEFQLgorCQkgKiBSZXR1cm4gUmVhc3NvYyBjb25maXJtIHdpdGggbm90IGF1dGhlbnRpY2F0ZWQKKwkJICovCisJCXJlYXNzb2NfY25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9TVEFfTk9UX0FVVEhFTlRJQ0FURUQ7CisJCXJlYXNzb2NfY25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCisJCWdvdG8gZW5kOworCX0KKwkvKiBhc3NpZ24gdGhlIHNlc3Npb25JZCB0byB0aGUgdGltZXIgb2JqZWN0ICovCisJbWFjX2N0eC0+bGltLmxpbVRpbWVycy5nTGltUmVhc3NvY0ZhaWx1cmVUaW1lci5zZXNzaW9uSWQgPQorCQlyZWFzc29jX3JlcS0+c2Vzc2lvbklkOworCXNlc3Npb24tPmxpbVByZXZNbG1TdGF0ZSA9IHNlc3Npb24tPmxpbU1sbVN0YXRlOworCXNlc3Npb24tPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfUkVBU1NPQ19SU1BfU1RBVEU7CisJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX01MTV9TVEFURSwgc2Vzc2lvbi0+cGVTZXNzaW9uSWQsCisJCQkgc2Vzc2lvbi0+bGltTWxtU3RhdGUpKTsKKworCS8qIERlcml2ZSBjaGFubmVsIGZyb20gQlNTIGRlc2NyaXB0aW9uIGFuZCBzdG9yZSBpdCBhdCBDRkcuICovCisJY2hhbm5lbCA9IHNlc3Npb24tPmxpbVJlYXNzb2NDaGFubmVsSWQ7CisJc2VjX2NoX29mZnNldCA9IHNlc3Npb24tPnJlQXNzb2NIdFNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisKKwkvKiBBcHBseSBwcmV2aW91c2x5IHNldCBjb25maWd1cmF0aW9uIGF0IEhXICovCisJbGltX2FwcGx5X2NvbmZpZ3VyYXRpb24obWFjX2N0eCwgc2Vzc2lvbik7CisKKwkvKiBzdG9yZSB0aGUgY2hhbm5lbCBzd2l0Y2ggc2Vzc2lvbkVudHJ5IGluIHRoZSBsaW0gZ2xvYmFsIHZhciAqLworCXNlc3Npb24tPmNoYW5uZWxDaGFuZ2VSZWFzb25Db2RlID0KKwkJTElNX1NXSVRDSF9DSEFOTkVMX1JFQVNTT0M7CisKKwkvKiBTd2l0Y2ggY2hhbm5lbCB0byB0aGUgbmV3IE9wZXJhdGluZyBjaGFubmVsIGZvciBSZWFzc29jICovCisJbGltX3NldF9jaGFubmVsKG1hY19jdHgsIGNoYW5uZWwsCisJCQlzZXNzaW9uLT5jaF9jZW50ZXJfZnJlcV9zZWcwLAorCQkJc2Vzc2lvbi0+Y2hfY2VudGVyX2ZyZXFfc2VnMSwKKwkJCXNlc3Npb24tPmNoX3dpZHRoLAorCQkJc2Vzc2lvbi0+bWF4VHhQb3dlciwKKwkJCXNlc3Npb24tPnBlU2Vzc2lvbklkKTsKKworCXJldHVybjsKK2VuZDoKKwlyZWFzc29jX2NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvIElkICovCisJcmVhc3NvY19jbmYuc2Vzc2lvbklkID0gcmVhc3NvY19yZXEtPnNlc3Npb25JZDsKKwkvKiBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIHJlYXNzb2NSZXEgKi8KKwljZGZfbWVtX2ZyZWUocmVhc3NvY19yZXEpOworCXNlc3Npb24tPnBMaW1SZUFzc29jUmVxID0gTlVMTDsKKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX1JFQVNTT0NfQ05GLAorCQkJICAgICAodWludDMyX3QgKikgJnJlYXNzb2NfY25mKTsKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19tbG1fZGlzYXNzb2NfcmVxX250ZigpIC0gcHJvY2VzcyBkaXNhc3NvYyByZXF1ZXN0IG5vdGlmaWNhdGlvbgorICoKKyAqIEBtYWNfY3R4OiAgICAgICAgZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAc3VzcGVuZF9zdGF0dXM6IHN1c3BlbmQgc3RhdHVzCisgKiBAbXNnOiAgICAgICAgICAgIG1sbSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwcm9jZXNzIE1MTSBkaXNhc3NvYyBub3RpZmljYXRpb24KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2xpbV9wcm9jZXNzX21sbV9kaXNhc3NvY19yZXFfbnRmKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJIENERl9TVEFUVVMgc3VzcGVuZF9zdGF0dXMsIHVpbnQzMl90ICptc2cpCit7CisJdWludDE2X3QgYWlkOworCXRTaXJNYWNBZGRyIGN1cnJfYnNzaWQ7CisJdHBEcGhIYXNoTm9kZSBzdGFkczsKKwl0TGltTWxtRGlzYXNzb2NSZXEgKm1sbV9kaXNhc3NvY3JlcTsKKwl0TGltTWxtRGlzYXNzb2NDbmYgbWxtX2Rpc2Fzc29jY25mOworCXRwUEVTZXNzaW9uIHNlc3Npb247CisJZXh0ZXJuIGJvb2wgc2VuZF9kaXNhc3NvY19mcmFtZTsKKwl0TGltTWxtU3RhdGVzIG1sbV9zdGF0ZTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3VzcGVuZF9zdGF0dXMpCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIlN1c3BlbmQgU3RhdHVzIGlzIG5vdCBzdWNjZXNzICVYIiksCisJCQlzdXNwZW5kX3N0YXR1cyk7CisKKwltbG1fZGlzYXNzb2NyZXEgPSAodExpbU1sbURpc2Fzc29jUmVxICopIG1zZzsKKworCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LAorCQkJCW1sbV9kaXNhc3NvY3JlcS0+c2Vzc2lvbklkKTsKKwlpZiAoTlVMTCA9PSBzZXNzaW9uKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWQgJWQiKSwKKwkJCW1sbV9kaXNhc3NvY3JlcS0+c2Vzc2lvbklkKTsKKwkJbWxtX2Rpc2Fzc29jY25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCWdvdG8gZW5kOworCX0KKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlByb2Nlc3MgRGlzQXNzb2MgUmVxIG9uIHNlc3Npb25JRCAlZCBTeXN0ZW1yb2xlICVkIgorCQkgICAibWxtc3RhdGUgJWQgZnJvbTogIiBNQUNfQUREUkVTU19TVFIpLAorCQltbG1fZGlzYXNzb2NyZXEtPnNlc3Npb25JZCwgR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uKSwKKwkJc2Vzc2lvbi0+bGltTWxtU3RhdGUsCisJCU1BQ19BRERSX0FSUkFZKG1sbV9kaXNhc3NvY3JlcS0+cGVlck1hY0FkZHIpKTsKKworCXNpcl9jb3B5X21hY19hZGRyKGN1cnJfYnNzaWQsIHNlc3Npb24tPmJzc0lkKTsKKworCXN3aXRjaCAoR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uKSkgeworCWNhc2UgZUxJTV9TVEFfUk9MRToKKwljYXNlIGVMSU1fQlRfQU1QX1NUQV9ST0xFOgorCQlpZiAoIWNkZl9tZW1fY29tcGFyZShtbG1fZGlzYXNzb2NyZXEtPnBlZXJNYWNBZGRyLAorCQkJCSAgICAgY3Vycl9ic3NpZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCSAgRkwoInJlY2VpdmVkIE1MTV9ESVNBU1NPQ19SRVEgd2l0aCBpbnZhbGlkIEJTUyBpZCIpKTsKKwkJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LAorCQkJCW1sbV9kaXNhc3NvY3JlcS0+cGVlck1hY0FkZHIsIExPR1cpOworCisJCQkvKiBQcmVwYXJlIGFuZCBTZW5kIExJTV9NTE1fRElTQVNTT0NfQ05GICovCisJCQltbG1fZGlzYXNzb2NjbmYucmVzdWx0Q29kZSA9CisJCQkJZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCQkJZ290byBlbmQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlTElNX1NUQV9JTl9JQlNTX1JPTEU6CisJCWJyZWFrOworCWNhc2UgZUxJTV9BUF9ST0xFOgorCWNhc2UgZUxJTV9QMlBfREVWSUNFX0dPOgorCQlpZiAodHJ1ZSA9PQorCQkJIG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLmlzX2Rmc19jYWNfdGltZXJfcnVubmluZykgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJDQUMgdGltZXIgaXMgcnVubmluZywgZHJvcCBkaXNhc3NvYyBmcm9tIGdvaW5nIG91dCIpKTsKKwkJCW1sbV9kaXNhc3NvY2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKwkJCWdvdG8gZW5kOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0gLyogZW5kIHN3aXRjaCAoR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uKSkgKi8KKworCS8qCisJICogQ2hlY2sgaWYgdGhlcmUgZXhpc3RzIGEgY29udGV4dCBmb3IgdGhlIHBlZXIgZW50aXR5CisJICogdG8gYmUgZGlzYXNzb2NpYXRlZCB3aXRoLgorCSAqLworCXN0YWRzID0gZHBoX2xvb2t1cF9oYXNoX2VudHJ5KG1hY19jdHgsIG1sbV9kaXNhc3NvY3JlcS0+cGVlck1hY0FkZHIsCisJCQkJICAgICAgJmFpZCwgJnNlc3Npb24tPmRwaC5kcGhIYXNoVGFibGUpOworCWlmIChzdGFkcykKKwkJbWxtX3N0YXRlID0gc3RhZHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGU7CisKKwlpZiAoKHN0YWRzID09IE5VTEwpIHx8CisJICAgIChzdGFkcyAmJgorCSAgICAgKChtbG1fc3RhdGUgIT0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkgJiYKKwkgICAgICAobWxtX3N0YXRlICE9IGVMSU1fTUxNX1dUX0FTU09DX0NORl9TVEFURSkgJiYKKwkgICAgICAobWxtX3N0YXRlICE9IGVMSU1fTUxNX0FTU09DSUFURURfU1RBVEUpKSkpIHsKKwkJLyoKKwkJICogUmVjZWl2ZWQgTElNX01MTV9ESVNBU1NPQ19SRVEgZm9yIFNUQSB0aGF0IGRvZXMgbm90CisJCSAqIGhhdmUgY29udGV4dCBvciBpbiBzb21lIHRyYW5zaXQgc3RhdGUuCisJCSAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiSW52YWxpZCBNTE1fRElTQVNTT0NfUkVRLCBBZGRyPSAiIE1BQ19BRERSRVNTX1NUUiksCisJCQlNQUNfQUREUl9BUlJBWShtbG1fZGlzYXNzb2NyZXEtPnBlZXJNYWNBZGRyKSk7CisJCWlmIChzdGFkcyAhPSBOVUxMKQorCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiU3RhIE1sbVN0YXRlIDogJWQiKSwKKwkJCQlzdGFkcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSk7CisKKwkJLyogUHJlcGFyZSBhbmQgU2VuZCBMSU1fTUxNX0RJU0FTU09DX0NORiAqLworCQltbG1fZGlzYXNzb2NjbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKwkJZ290byBlbmQ7CisJfQorCisJc3RhZHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb24gPSAodFNpck1hY1JlYXNvbkNvZGVzKQorCQkJCQkgICAgICAgbWxtX2Rpc2Fzc29jcmVxLT5yZWFzb25Db2RlOworCXN0YWRzLT5tbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID0gbWxtX2Rpc2Fzc29jcmVxLT5kaXNhc3NvY1RyaWdnZXI7CisKKwkvKgorCSAqIFNldCBzdGF0ZSB0byBtbG0gU3RhdGUgdG8gZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEUKKwkgKiBUaGlzIGlzIHRvIGFkZHJlc3MgdGhlIGlzc3VlIG9mIHJhY2UgY29uZGl0aW9uIGJldHdlZW4KKwkgKiBkaXNjb25uZWN0IHJlcXVlc3QgZnJvbSB0aGUgSEREIGFuZCBkZWF1dGggZnJvbSBBUAorCSAqLworCisJc3RhZHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPSBlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURTsKKworCS8qIFNlbmQgRGlzYXNzb2NpYXRlIGZyYW1lIHRvIHBlZXIgZW50aXR5ICovCisJaWYgKHNlbmRfZGlzYXNzb2NfZnJhbWUgJiYgKG1sbV9kaXNhc3NvY3JlcS0+cmVhc29uQ29kZSAhPQorCQllU0lSX01BQ19ESVNBU1NPQ19EVUVfVE9fRlRIQU5ET0ZGX1JFQVNPTikpIHsKKwkJbWFjX2N0eC0+bGltLmxpbURpc2Fzc29jRGVhdXRoQ25mUmVxLnBNbG1EaXNhc3NvY1JlcSA9CisJCQltbG1fZGlzYXNzb2NyZXE7CisJCS8qCisJCSAqIFNldCBzdGF0ZSB0byBtbG0gU3RhdGUgdG8gZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEUKKwkJICogVGhpcyBpcyB0byBhZGRyZXNzIHRoZSBpc3N1ZSBvZiByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuCisJCSAqIGRpc2Nvbm5lY3QgcmVxdWVzdCBmcm9tIHRoZSBIREQgYW5kIGRlYXV0aCBmcm9tIEFQCisJCSAqLworCQlzdGFkcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFOworCisJCS8qCisJCSAqIElmIHRoZSByZWFzb24gZm9yIGRpc2Fzc29jaWF0aW9uIGlzIGluYWN0aXZpdHkgb2YgU1RBLCB0aGVuCisJCSAqIGRvbnQgd2FpdCBmb3IgYWNrbm93bGVkZ2VtZW50CisJCSAqLworCQlpZiAoKG1sbV9kaXNhc3NvY3JlcS0+cmVhc29uQ29kZSA9PQorCQkgICAgZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFlfUkVBU09OKSAmJgorCQkgICAgTElNX0lTX0FQX1JPTEUoc2Vzc2lvbikpIHsKKwkJCWxpbV9zZW5kX2Rpc2Fzc29jX21nbXRfZnJhbWUobWFjX2N0eCwKKwkJCQltbG1fZGlzYXNzb2NyZXEtPnJlYXNvbkNvZGUsCisJCQkJbWxtX2Rpc2Fzc29jcmVxLT5wZWVyTWFjQWRkciwgc2Vzc2lvbiwgZmFsc2UpOworCisJCQkvKiBTZW5kIERpc2Fzc29jIENORiBhbmQgcmVjZWl2ZSBwYXRoIGNsZWFudXAgKi8KKwkJCWxpbV9zZW5kX2Rpc2Fzc29jX2NuZihtYWNfY3R4KTsKKwkJfSBlbHNlIHsKKwkJCWxpbV9zZW5kX2Rpc2Fzc29jX21nbXRfZnJhbWUobWFjX2N0eCwKKwkJCQltbG1fZGlzYXNzb2NyZXEtPnJlYXNvbkNvZGUsCisJCQkJbWxtX2Rpc2Fzc29jcmVxLT5wZWVyTWFjQWRkciwgc2Vzc2lvbiwgdHJ1ZSk7CisJCQkvKgorCQkJICogQWJvcnQgVHggc28gdGhhdCBkYXRhIGZyYW1lcyB3b24ndCBiZSBzZW50IHRvIHRoZSBBUAorCQkJICogYWZ0ZXIgc2VuZGluZyBEaXNhc3NvYy4KKwkJCSAqLworCQkJaWYgKExJTV9JU19TVEFfUk9MRShzZXNzaW9uKSkKKwkJCQl3bWFfdHhfYWJvcnQoc2Vzc2lvbi0+c21lU2Vzc2lvbklkKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIERpc2Fzc29jIGZyYW1lIGlzIG5vdCBzZW50IE9UQSAqLworCQlzZW5kX2Rpc2Fzc29jX2ZyYW1lID0gMTsKKwkJLyogUmVjZWl2ZSBwYXRoIGNsZWFudXAgd2l0aCBkdW1teSBwYWNrZXQgKi8KKwkJaWYgKGVTSVJfU1VDQ0VTUyAhPQorCQkgICAgbGltX2NsZWFudXBfcnhfcGF0aChtYWNfY3R4LCBzdGFkcywgc2Vzc2lvbikpIHsKKwkJCW1sbV9kaXNhc3NvY2NuZi5yZXN1bHRDb2RlID0KKwkJCQllU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJCQlnb3RvIGVuZDsKKwkJfQorCQkvKiBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIG1sbURpc2Fzc29jUmVxICovCisJCWNkZl9tZW1fZnJlZShtbG1fZGlzYXNzb2NyZXEpOworCX0KKworCXJldHVybjsKKworZW5kOgorCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWxtX2Rpc2Fzc29jY25mLnBlZXJNYWNBZGRyLAorCQkgICAgICh1aW50OF90ICopIG1sbV9kaXNhc3NvY3JlcS0+cGVlck1hY0FkZHIsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJbWxtX2Rpc2Fzc29jY25mLmFpZCA9IG1sbV9kaXNhc3NvY3JlcS0+YWlkOworCW1sbV9kaXNhc3NvY2NuZi5kaXNhc3NvY1RyaWdnZXIgPSBtbG1fZGlzYXNzb2NyZXEtPmRpc2Fzc29jVHJpZ2dlcjsKKworCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElEICovCisJbWxtX2Rpc2Fzc29jY25mLnNlc3Npb25JZCA9IG1sbV9kaXNhc3NvY3JlcS0+c2Vzc2lvbklkOworCisJLyogRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkIGZvciBtbG1EaXNhc3NvY1JlcSAqLworCWNkZl9tZW1fZnJlZShtbG1fZGlzYXNzb2NyZXEpOworCisJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9ESVNBU1NPQ19DTkYsCisJCQkgICAgICh1aW50MzJfdCAqKSAmbWxtX2Rpc2Fzc29jY25mKTsKK30KKworLyoqCisgKiBsaW1fY2hlY2tfZGlzYXNzb2NfZGVhdXRoX2Fja19wZW5kaW5nKCkgLSBjaGVjayBpZiBkZWF1dGggaXMgcGVuZGluZworICoKKyAqIEBtYWNfY3R4IC0gZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAc3RhX21hYyAtIHN0YXRpb24gTUFDCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgZGlhc3NvY2lhdGlvbiBvciBkZWF1dGhlbnRpY2F0aW9uIGlzIHBlbmRpbmcgZm9yCisgKiBnaXZlbiBzdGF0aW9uIE1BQyBhZGRyZXNzLgorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBwZW5kaW5nIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgbGltX2NoZWNrX2Rpc2Fzc29jX2RlYXV0aF9hY2tfcGVuZGluZyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQkgICB1aW50OF90ICpzdGFfbWFjKQoreworCXRMaW1NbG1EaXNhc3NvY1JlcSAqZGlzYXNzb2NfcmVxOworCXRMaW1NbG1EZWF1dGhSZXEgKmRlYXV0aF9yZXE7CisKKwlkaXNhc3NvY19yZXEgPSBtYWNfY3R4LT5saW0ubGltRGlzYXNzb2NEZWF1dGhDbmZSZXEucE1sbURpc2Fzc29jUmVxOworCWRlYXV0aF9yZXEgPSBtYWNfY3R4LT5saW0ubGltRGlzYXNzb2NEZWF1dGhDbmZSZXEucE1sbURlYXV0aFJlcTsKKwlpZiAoKGRpc2Fzc29jX3JlcSAmJiAoY2RmX21lbV9jb21wYXJlKCh1aW50OF90ICopIHN0YV9tYWMsCisJCQkgICAgICAodWludDhfdCAqKSAmZGlzYXNzb2NfcmVxLT5wZWVyTWFjQWRkciwKKwkJCSAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSkpIHx8CisJICAgIChkZWF1dGhfcmVxICYmIChjZGZfbWVtX2NvbXBhcmUoKHVpbnQ4X3QgKikgc3RhX21hYywKKwkJCSAgICAgICh1aW50OF90ICopICZkZWF1dGhfcmVxLT5wZWVyTWFjQWRkciwKKwkJCSAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSkpKSB7CisJCVBFTE9HMShsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkgICAgICAgRkwoIkRpc2Fzc29jL0RlYXV0aCBhY2sgcGVuZGluZyIpKTspCisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCVBFTE9HMShsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkgICAgICAgRkwoIkRpc2Fzc29jL0RlYXV0aCBBY2sgbm90IHBlbmRpbmciKSk7KQorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCisvKgorICogbGltX2NsZWFuX3VwX2Rpc2Fzc29jX2RlYXV0aF9yZXEoKSAtIGNsZWFucyB1cCBwZW5kaW5nIGRpc2Fzc29jIG9yIGRlYXV0aCByZXEKKyAqCisgKiBAbWFjX2N0eDogICAgICAgIG1hY19jdHgKKyAqIEBzdGFfbWFjOiAgICAgICAgc3RhIG1hYyBhZGRyZXNzCisgKiBAY2xlYW5fcnhfcGF0aDogIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0byBjbGVhbnVwIHJ4IHBhdGggb3Igbm90CisgKgorICogVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgcGVuZGluZyBkaXNhc3NvYyBvciBkZWF1dGggcmVxCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgbGltX2NsZWFuX3VwX2Rpc2Fzc29jX2RlYXV0aF9yZXEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgICAgICB1aW50OF90ICpzdGFfbWFjLCBib29sIGNsZWFuX3J4X3BhdGgpCit7CisJdExpbU1sbURpc2Fzc29jUmVxICptbG1fZGlzYXNzb2NfcmVxOworCXRMaW1NbG1EZWF1dGhSZXEgKm1sbV9kZWF1dGhfcmVxOworCW1sbV9kaXNhc3NvY19yZXEgPSBtYWNfY3R4LT5saW0ubGltRGlzYXNzb2NEZWF1dGhDbmZSZXEucE1sbURpc2Fzc29jUmVxOworCWlmIChtbG1fZGlzYXNzb2NfcmVxICYmCisJICAgIChjZGZfbWVtX2NvbXBhcmUoKHVpbnQ4X3QgKikgc3RhX21hYywKKwkJCSAgICAgKHVpbnQ4X3QgKikgJm1sbV9kaXNhc3NvY19yZXEtPnBlZXJNYWNBZGRyLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKSkpIHsKKwkJaWYgKGNsZWFuX3J4X3BhdGgpIHsKKwkJCWxpbV9wcm9jZXNzX2Rpc2Fzc29jX2Fja190aW1lb3V0KG1hY19jdHgpOworCQl9IGVsc2UgeworCQkJaWYgKHR4X3RpbWVyX3J1bm5pbmcoCisJCQkJJm1hY19jdHgtPmxpbS5saW1UaW1lcnMuZ0xpbURpc2Fzc29jQWNrVGltZXIpKSB7CisJCQkJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihtYWNfY3R4LAorCQkJCQkJZUxJTV9ESVNBU1NPQ19BQ0tfVElNRVIpOworCQkJfQorCQkJY2RmX21lbV9mcmVlKG1sbV9kaXNhc3NvY19yZXEpOworCQkJbWFjX2N0eC0+bGltLmxpbURpc2Fzc29jRGVhdXRoQ25mUmVxLnBNbG1EaXNhc3NvY1JlcSA9CisJCQkJTlVMTDsKKwkJfQorCX0KKworCW1sbV9kZWF1dGhfcmVxID0gbWFjX2N0eC0+bGltLmxpbURpc2Fzc29jRGVhdXRoQ25mUmVxLnBNbG1EZWF1dGhSZXE7CisJaWYgKG1sbV9kZWF1dGhfcmVxICYmCisJICAgIChjZGZfbWVtX2NvbXBhcmUoKHVpbnQ4X3QgKikgc3RhX21hYywKKwkJCSAgICAgKHVpbnQ4X3QgKikgJm1sbV9kZWF1dGhfcmVxLT5wZWVyTWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpKSB7CisJCWlmIChjbGVhbl9yeF9wYXRoKSB7CisJCQlsaW1fcHJvY2Vzc19kZWF1dGhfYWNrX3RpbWVvdXQobWFjX2N0eCk7CisJCX0gZWxzZSB7CisJCQlpZiAodHhfdGltZXJfcnVubmluZygKKwkJCQkmbWFjX2N0eC0+bGltLmxpbVRpbWVycy5nTGltRGVhdXRoQWNrVGltZXIpKSB7CisJCQkJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihtYWNfY3R4LAorCQkJCQkJZUxJTV9ERUFVVEhfQUNLX1RJTUVSKTsKKwkJCX0KKwkJCWNkZl9tZW1fZnJlZShtbG1fZGVhdXRoX3JlcSk7CisJCQltYWNfY3R4LT5saW0ubGltRGlzYXNzb2NEZWF1dGhDbmZSZXEucE1sbURlYXV0aFJlcSA9CisJCQkJTlVMTDsKKwkJfQorCX0KK30KKworLyoKKyAqIGxpbV9wcm9jZXNzX2Rpc2Fzc29jX2Fja190aW1lb3V0KCkgLSB3cmFwcGVyIGZ1bmN0aW9uIGFyb3VuZAorICogbGltX3NlbmRfZGlzYXNzb2NfY25mCisgKgorICogQG1hY19jdHg6ICAgICAgICBtYWNfY3R4CisgKgorICogd3JhcHBlciBmdW5jdGlvbiBhcm91bmQgbGltX3NlbmRfZGlzYXNzb2NfY25mCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfZGlzYXNzb2NfYWNrX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCkKK3sKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCIiKSk7CisJbGltX3NlbmRfZGlzYXNzb2NfY25mKG1hY19jdHgpOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9kaXNhc3NvY19yZXEoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MKKyAqIE1MTV9ESVNBU1NPQ19SRVEgbWVzc2FnZSBmcm9tIFNNRQorICoKKyAqIEBtYWNfY3R4OiAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2dfYnVmOiAgICAgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNTE1fRElTQVNTT0NfUkVRIG1lc3NhZ2UgZnJvbSBTTUUKKyAqCisgKiBAUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitsaW1fcHJvY2Vzc19tbG1fZGlzYXNzb2NfcmVxKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQzMl90ICptc2dfYnVmKQoreworCXRMaW1NbG1EaXNhc3NvY1JlcSAqbWxtX2Rpc2Fzc29jX3JlcTsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwltbG1fZGlzYXNzb2NfcmVxID0gKHRMaW1NbG1EaXNhc3NvY1JlcSAqKSBtc2dfYnVmOworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlByb2Nlc3MgZGlzYXNzb2MgcmVxLCBzZXNzaW9uSUQgJWQgZnJvbTogIk1BQ19BRERSRVNTX1NUUiksCisJCW1sbV9kaXNhc3NvY19yZXEtPnNlc3Npb25JZCwKKwkJTUFDX0FERFJfQVJSQVkobWxtX2Rpc2Fzc29jX3JlcS0+cGVlck1hY0FkZHIpKTsKKworCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LAorCQkJCW1sbV9kaXNhc3NvY19yZXEtPnNlc3Npb25JZCk7CisJaWYgKE5VTEwgPT0gc2Vzc2lvbikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkICVkIiksCisJCQltbG1fZGlzYXNzb2NfcmVxLT5zZXNzaW9uSWQpOworCQlyZXR1cm47CisJfQorCisJbGltX3Byb2Nlc3NfbWxtX2Rpc2Fzc29jX3JlcV9udGYobWFjX2N0eCwgQ0RGX1NUQVRVU19TVUNDRVNTLAorCQkJCQkgKHVpbnQzMl90ICopIG1zZ19idWYpOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9kZWF1dGhfcmVxX250ZigpIC0gVGhpcyBmdW5jdGlvbiBpcyBwcm9jZXNzIG1sbSBkZWF1dGggcmVxCisgKiBub3RpZmljYXRpb24KKyAqCisgKiBAbWFjX2N0eDogICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAc3VzcGVuZF9zdGF0dXM6ICBzdXNwZW5kIHN0YXR1cworICogQG1zZ19idWY6ICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHByb2Nlc3MgbWxtIGRlYXV0aCByZXEgbm90aWZpY2F0aW9uCisgKgorICogQFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZAorbGltX3Byb2Nlc3NfbWxtX2RlYXV0aF9yZXFfbnRmKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkgICAgICAgQ0RGX1NUQVRVUyBzdXNwZW5kX3N0YXR1cywgdWludDMyX3QgKm1zZ19idWYpCit7CisJdWludDE2X3QgYWlkOworCXRTaXJNYWNBZGRyIGN1cnJfYnNzSWQ7CisJdHBEcGhIYXNoTm9kZSBzdGFfZHM7CisJc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqYXV0aF9ub2RlOworCXRMaW1NbG1EZWF1dGhSZXEgKm1sbV9kZWF1dGhfcmVxOworCXRMaW1NbG1EZWF1dGhDbmYgbWxtX2RlYXV0aF9jbmY7CisJdHBQRVNlc3Npb24gc2Vzc2lvbjsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3VzcGVuZF9zdGF0dXMpCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIlN1c3BlbmQgU3RhdHVzIGlzIG5vdCBzdWNjZXNzICVYIiksCisJCQlzdXNwZW5kX3N0YXR1cyk7CisKKwltbG1fZGVhdXRoX3JlcSA9ICh0TGltTWxtRGVhdXRoUmVxICopIG1zZ19idWY7CisJc2Vzc2lvbiA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKG1hY19jdHgsCisJCQkJbWxtX2RlYXV0aF9yZXEtPnNlc3Npb25JZCk7CisJaWYgKE5VTEwgPT0gc2Vzc2lvbikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkICVkIiksCisJCQltbG1fZGVhdXRoX3JlcS0+c2Vzc2lvbklkKTsKKwkJY2RmX21lbV9mcmVlKG1sbV9kZWF1dGhfcmVxKTsKKwkJcmV0dXJuOworCX0KKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJQcm9jZXNzIERlYXV0aCBSZXEgb24gc2Vzc2lvbklEICVkIFN5c3RlbXJvbGUgJWQiCisJCQkgICAgICAgIm1sbXN0YXRlICVkIGZyb206ICIgTUFDX0FERFJFU1NfU1RSKSwKKwkJbWxtX2RlYXV0aF9yZXEtPnNlc3Npb25JZCwKKwkJR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uKSwKKwkJc2Vzc2lvbi0+bGltTWxtU3RhdGUsCisJCU1BQ19BRERSX0FSUkFZKG1sbV9kZWF1dGhfcmVxLT5wZWVyTWFjQWRkcikpOworCXNpcl9jb3B5X21hY19hZGRyKGN1cnJfYnNzSWQsIHNlc3Npb24tPmJzc0lkKTsKKworCXN3aXRjaCAoR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uKSkgeworCWNhc2UgZUxJTV9TVEFfUk9MRToKKwljYXNlIGVMSU1fQlRfQU1QX1NUQV9ST0xFOgorCQlzd2l0Y2ggKHNlc3Npb24tPmxpbU1sbVN0YXRlKSB7CisJCWNhc2UgZUxJTV9NTE1fSURMRV9TVEFURToKKwkJCS8qCisJCQkgKiBBdHRlbXB0aW5nIHRvIERlYXV0aGVudGljYXRlIHdpdGggYSBwcmUtYXV0aGVudGljYXRlZAorCQkJICogcGVlci4gRGVhdXRoZXRpYXRlIHdpdGggcGVlciBpZiB0aGVyZSBleGlzdHMgYQorCQkJICogcHJlLWF1dGggY29udGV4dCBiZWxvdy4KKwkJCSAqLworCQkJYnJlYWs7CisJCWNhc2UgZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURToKKwkJY2FzZSBlTElNX01MTV9XVF9BU1NPQ19SU1BfU1RBVEU6CisJCWNhc2UgZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURToKKwkJCWlmICghY2RmX21lbV9jb21wYXJlKG1sbV9kZWF1dGhfcmVxLT5wZWVyTWFjQWRkciwKKwkJCQkJY3Vycl9ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJyZWNlaXZlZCBNTE1fREVBVVRIX1JFUSB3aXRoIGludmFsaWQgQlNTIGlkICIKKwkJCQkJICAgIlBlZXIgTUFDOiAiTUFDX0FERFJFU1NfU1RSCisJCQkJCSAgICIgQ0ZHIEJTU0lEIEFkZHIgOiAiTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJTUFDX0FERFJfQVJSQVkoCisJCQkJCQltbG1fZGVhdXRoX3JlcS0+cGVlck1hY0FkZHIpLAorCQkJCQlNQUNfQUREUl9BUlJBWShjdXJyX2Jzc0lkKSk7CisJCQkJLyogUHJlcGFyZSBhbmQgU2VuZCBMSU1fTUxNX0RFQVVUSF9DTkYgKi8KKwkJCQltbG1fZGVhdXRoX2NuZi5yZXN1bHRDb2RlID0KKwkJCQkJZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCQkJCWdvdG8gZW5kOworCQkJfQorCisJCQlpZiAoKHNlc3Npb24tPmxpbU1sbVN0YXRlID09CisJCQkgICAgIGVMSU1fTUxNX0FVVEhFTlRJQ0FURURfU1RBVEUpIHx8CisJCQkgICAgKHNlc3Npb24tPmxpbU1sbVN0YXRlID09CisJCQkgICAgIGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURSkpIHsKKwkJCQkvKiBTZW5kIGRlYXV0aCBmcmFtZSB0byBwZWVyIGVudGl0eSAqLworCQkJCWxpbV9zZW5kX2RlYXV0aF9tZ210X2ZyYW1lKG1hY19jdHgsCisJCQkJCQltbG1fZGVhdXRoX3JlcS0+cmVhc29uQ29kZSwKKwkJCQkJCW1sbV9kZWF1dGhfcmVxLT5wZWVyTWFjQWRkciwKKwkJCQkJCXNlc3Npb24sIGZhbHNlKTsKKwkJCQkvKiBQcmVwYXJlIGFuZCBTZW5kIExJTV9NTE1fREVBVVRIX0NORiAqLworCQkJCW1sbV9kZWF1dGhfY25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCQkJCXNlc3Npb24tPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKwkJCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfTUxNX1NUQVRFLAorCQkJCQkJIHNlc3Npb24tPnBlU2Vzc2lvbklkLAorCQkJCQkJIHNlc3Npb24tPmxpbU1sbVN0YXRlKSk7CisJCQkJZ290byBlbmQ7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgicmVjZWl2ZWQgTUxNX0RFQVVUSF9SRVEgd2l0aCBpbiBzdGF0ZSAlZCBmb3IgcGVlciAiCisJCQkJICAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQlzZXNzaW9uLT5saW1NbG1TdGF0ZSwKKwkJCQlNQUNfQUREUl9BUlJBWShtbG1fZGVhdXRoX3JlcS0+cGVlck1hY0FkZHIpKTsKKwkJCWxpbV9wcmludF9tbG1fc3RhdGUobWFjX2N0eCwgTE9HVywKKwkJCQkJICAgIHNlc3Npb24tPmxpbU1sbVN0YXRlKTsKKwkJCS8qIFByZXBhcmUgYW5kIFNlbmQgTElNX01MTV9ERUFVVEhfQ05GICovCisJCQltbG1fZGVhdXRoX2NuZi5yZXN1bHRDb2RlID0KKwkJCQllU0lSX1NNRV9TVEFfTk9UX0FVVEhFTlRJQ0FURUQ7CisKKwkJCWdvdG8gZW5kOworCQl9CisJCWJyZWFrOworCWNhc2UgZUxJTV9TVEFfSU5fSUJTU19ST0xFOgorCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJyZWNlaXZlZCBNTE1fREVBVVRIX1JFUSBJQlNTIE1vZGUiKSk7CisJCW1sbV9kZWF1dGhfY25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCWdvdG8gZW5kOworCWNhc2UgZUxJTV9BUF9ST0xFOgorCWNhc2UgZUxJTV9QMlBfREVWSUNFX0dPOgorCQlpZiAodHJ1ZSA9PQorCQkJbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uaXNfZGZzX2NhY190aW1lcl9ydW5uaW5nKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIkNBQyB0aW1lciBpcyBydW5uaW5nLCBkcm9wIGRpc2Fzc29jIGZyb20gZ29pbmcgb3V0IikpOworCQkJbWxtX2RlYXV0aF9jbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0gLyogZW5kIHN3aXRjaCAoR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uKSkgKi8KKworCS8qCisJICogQ2hlY2sgaWYgdGhlcmUgZXhpc3RzIGEgY29udGV4dCBmb3IgdGhlIHBlZXIgZW50aXR5CisJICogdG8gYmUgZGVhdXRoZW50aWNhdGVkIHdpdGguCisJICovCisJc3RhX2RzID0gZHBoX2xvb2t1cF9oYXNoX2VudHJ5KG1hY19jdHgsIG1sbV9kZWF1dGhfcmVxLT5wZWVyTWFjQWRkciwKKwkJCQkgICAgICAgJmFpZCwgJnNlc3Npb24tPmRwaC5kcGhIYXNoVGFibGUpOworCisJaWYgKHN0YV9kcyA9PSBOVUxMKSB7CisJCS8qIENoZWNrIGlmIHRoZXJlIGV4aXN0cyBwcmUtYXV0aCBjb250ZXh0IGZvciB0aGlzIFNUQSAqLworCQlhdXRoX25vZGUgPSBsaW1fc2VhcmNoX3ByZV9hdXRoX2xpc3QobWFjX2N0eCwKKwkJCQkJCW1sbV9kZWF1dGhfcmVxLT5wZWVyTWFjQWRkcik7CisJCWlmIChhdXRoX25vZGUgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIFJlY2VpdmVkIERFQVVUSCBSRVEgZm9yIGEgU1RBIHRoYXQgaXMgbmVpdGhlcgorCQkJICogQXNzb2NpYXRlZCBub3IgUHJlLWF1dGhlbnRpY2F0ZWQuIExvZyBlcnJvciwKKwkJCSAqIFByZXBhcmUgYW5kIFNlbmQgTElNX01MTV9ERUFVVEhfQ05GCisJCQkgKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgicmVjZWl2ZWQgTUxNX0RFQVVUSF9SRVEgaW4gbWxtZSBzdGF0ZSAlZCBmb3IgU1RBIHRoYXQgIgorCQkJCSAgICJkb2VzIG5vdCBoYXZlIGNvbnRleHQsIEFkZHI9IgorCQkJCSAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJc2Vzc2lvbi0+bGltTWxtU3RhdGUsCisJCQkJTUFDX0FERFJfQVJSQVkobWxtX2RlYXV0aF9yZXEtPnBlZXJNYWNBZGRyKSk7CisJCQltbG1fZGVhdXRoX2NuZi5yZXN1bHRDb2RlID0KKwkJCQllU0lSX1NNRV9TVEFfTk9UX0FVVEhFTlRJQ0FURUQ7CisJCX0gZWxzZSB7CisJCQltbG1fZGVhdXRoX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKwkJCS8qIERlbGV0ZSBTVEEgZnJvbSBwcmUtYXV0aCBTVEEgbGlzdCAqLworCQkJbGltX2RlbGV0ZV9wcmVfYXV0aF9ub2RlKG1hY19jdHgsCisJCQkJCQkgbWxtX2RlYXV0aF9yZXEtPnBlZXJNYWNBZGRyKTsKKwkJCS8qIFNlbmQgRGVhdXRoZW50aWNhdGlvbiBmcmFtZSB0byBwZWVyIGVudGl0eSAqLworCQkJbGltX3NlbmRfZGVhdXRoX21nbXRfZnJhbWUobWFjX2N0eCwKKwkJCQkJCSAgIG1sbV9kZWF1dGhfcmVxLT5yZWFzb25Db2RlLAorCQkJCQkJICAgbWxtX2RlYXV0aF9yZXEtPnBlZXJNYWNBZGRyLAorCQkJCQkJICAgc2Vzc2lvbiwgZmFsc2UpOworCQl9CisJCWdvdG8gZW5kOworCX0gZWxzZSBpZiAoKHN0YV9kcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPQorCQkgICAgZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkgJiYKKwkJICAgKHN0YV9kcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPQorCQkgICAgZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFKSkgeworCQkvKgorCQkgKiByZWNlaXZlZCBNTE1fREVBVVRIX1JFUSBmb3IgU1RBIHRoYXQgZWl0aGVyIGhhcyBubyBjb250ZXh0IG9yCisJCSAqIGluIHNvbWUgdHJhbnNpdCBzdGF0ZQorCQkgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIkludmFsaWQgTUxNX0RFQVVUSF9SRVEsIEFkZHI9Ik1BQ19BRERSRVNTX1NUUiksCisJCQlNQUNfQUREUl9BUlJBWShtbG1fZGVhdXRoX3JlcS0+cGVlck1hY0FkZHIpKTsKKwkJLyogUHJlcGFyZSBhbmQgU2VuZCBMSU1fTUxNX0RFQVVUSF9DTkYgKi8KKwkJbWxtX2RlYXV0aF9jbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKwkJZ290byBlbmQ7CisJfQorCS8qIHN0YV9kcy0+bWxtU3RhQ29udGV4dC5yeFB1cmdlUmVxICAgICA9IDE7ICovCisJc3RhX2RzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uID0gKHRTaXJNYWNSZWFzb25Db2RlcykKKwkJCQkJICAgICAgIG1sbV9kZWF1dGhfcmVxLT5yZWFzb25Db2RlOworCXN0YV9kcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9IG1sbV9kZWF1dGhfcmVxLT5kZWF1dGhUcmlnZ2VyOworCW1hY19jdHgtPmxpbS5saW1EaXNhc3NvY0RlYXV0aENuZlJlcS5wTWxtRGVhdXRoUmVxID0gbWxtX2RlYXV0aF9yZXE7CisJLyoKKwkgKiBTZXQgc3RhdGUgdG8gbWxtIFN0YXRlIHRvIGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFCisJICogVGhpcyBpcyB0byBhZGRyZXNzIHRoZSBpc3N1ZSBvZiByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuCisJICogZGlzY29ubmVjdCByZXF1ZXN0IGZyb20gdGhlIEhERCBhbmQgZGlzYXNzb2MgZnJvbQorCSAqIGluYWN0aXZpdHkgdGltZXIuIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCB3ZSB3aWxsIG5vdAorCSAqIHByb2Nlc3MgZGlzYXNzb2MgaWYgZGVhdXRoIGlzIGluIHByb2dyZXNzIGZvciB0aGUgc3RhdGlvbgorCSAqIGFuZCB0aHVzIG1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4uCisJICovCisJc3RhX2RzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0gZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEU7CisJLyogU2VuZCBEZWF1dGhlbnRpY2F0aW9uIGZyYW1lIHRvIHBlZXIgZW50aXR5ICovCisJbGltX3NlbmRfZGVhdXRoX21nbXRfZnJhbWUobWFjX2N0eCwgbWxtX2RlYXV0aF9yZXEtPnJlYXNvbkNvZGUsCisJCQkJICAgbWxtX2RlYXV0aF9yZXEtPnBlZXJNYWNBZGRyLCBzZXNzaW9uLCB0cnVlKTsKKwlyZXR1cm47CitlbmQ6CisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZtbG1fZGVhdXRoX2NuZi5wZWVyTWFjQWRkciwKKwkJICAgICAodWludDhfdCAqKSBtbG1fZGVhdXRoX3JlcS0+cGVlck1hY0FkZHIsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJbWxtX2RlYXV0aF9jbmYuZGVhdXRoVHJpZ2dlciA9IG1sbV9kZWF1dGhfcmVxLT5kZWF1dGhUcmlnZ2VyOworCW1sbV9kZWF1dGhfY25mLmFpZCA9IG1sbV9kZWF1dGhfcmVxLT5haWQ7CisJbWxtX2RlYXV0aF9jbmYuc2Vzc2lvbklkID0gbWxtX2RlYXV0aF9yZXEtPnNlc3Npb25JZDsKKworCS8qIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZCBmb3IgbWxtRGVhdXRoUmVxICovCisJY2RmX21lbV9mcmVlKG1sbV9kZWF1dGhfcmVxKTsKKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShtYWNfY3R4LAorCQkJICAgICBMSU1fTUxNX0RFQVVUSF9DTkYsICh1aW50MzJfdCAqKSAmbWxtX2RlYXV0aF9jbmYpOworfQorCisvKgorICogbGltX3Byb2Nlc3NfZGVhdXRoX2Fja190aW1lb3V0KCkgLSB3cmFwcGVyIGZ1bmN0aW9uIGFyb3VuZAorICogbGltX3NlbmRfZGVhdXRoX2NuZgorICoKKyAqIEBtYWNfY3R4OiAgICAgICAgbWFjX2N0eAorICoKKyAqIHdyYXBwZXIgZnVuY3Rpb24gYXJvdW5kIGxpbV9zZW5kX2RlYXV0aF9jbmYKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCBsaW1fcHJvY2Vzc19kZWF1dGhfYWNrX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCkKK3sKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCIiKSk7CisJbGltX3NlbmRfZGVhdXRoX2NuZihtYWNfY3R4KTsKK30KKworLyoKKyAqIGxpbV9wcm9jZXNzX21sbV9kZWF1dGhfcmVxKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzCisgKiBNTE1fREVBVVRIX1JFUSBtZXNzYWdlIGZyb20gU01FCisgKgorICogQG1hY19jdHg6ICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1zZ19idWY6ICAgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1MTV9ERUFVVEhfUkVRIG1lc3NhZ2UgZnJvbSBTTUUKKyAqCisgKiBAUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitsaW1fcHJvY2Vzc19tbG1fZGVhdXRoX3JlcSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCAqbXNnX2J1ZikKK3sKKwl0TGltTWxtRGVhdXRoUmVxICptbG1fZGVhdXRoX3JlcTsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7KQorCQlyZXR1cm47CisJfQorCisJbWxtX2RlYXV0aF9yZXEgPSAodExpbU1sbURlYXV0aFJlcSAqKSBtc2dfYnVmOworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlByb2Nlc3MgRGVhdXRoIFJlcSBvbiBzZXNzaW9uSUQgJWQgZnJvbTogIgorCQkgICBNQUNfQUREUkVTU19TVFIpLAorCQltbG1fZGVhdXRoX3JlcS0+c2Vzc2lvbklkLAorCQlNQUNfQUREUl9BUlJBWShtbG1fZGVhdXRoX3JlcS0+cGVlck1hY0FkZHIpKTsKKworCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LAorCQkJCW1sbV9kZWF1dGhfcmVxLT5zZXNzaW9uSWQpOworCWlmIChOVUxMID09IHNlc3Npb24pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JZCAlZCIpLAorCQkJbWxtX2RlYXV0aF9yZXEtPnNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisJbGltX3Byb2Nlc3NfbWxtX2RlYXV0aF9yZXFfbnRmKG1hY19jdHgsIENERl9TVEFUVVNfU1VDQ0VTUywKKwkJCQkgICAgICAgKHVpbnQzMl90ICopIG1zZ19idWYpOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9zZXRfa2V5c19yZXEoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MKKyAqIE1MTV9TRVRLRVlTX1JFUSBtZXNzYWdlIGZyb20gU01FCisgKgorICogQG1hY19jdHg6ICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1zZ19idWY6ICAgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1MTV9TRVRLRVlTX1JFUSBtZXNzYWdlIGZyb20gU01FCisgKgorICogQFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZAorbGltX3Byb2Nlc3NfbWxtX3NldF9rZXlzX3JlcSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCAqbXNnX2J1ZikKK3sKKwl1aW50MTZfdCBhaWQ7CisJdWludDE2X3Qgc3RhX2lkeCA9IDA7CisJdWludDMyX3QgZGVmYXVsdF9rZXlfaWQgPSAwOworCXRTaXJNYWNBZGRyIGN1cnJfYnNzaWQ7CisJdHBEcGhIYXNoTm9kZSBzdGFfZHM7CisJdExpbU1sbVNldEtleXNSZXEgKm1sbV9zZXRfa2V5c19yZXE7CisJdExpbU1sbVNldEtleXNDbmYgbWxtX3NldF9rZXlzX2NuZjsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCW1sbV9zZXRfa2V5c19yZXEgPSAodExpbU1sbVNldEtleXNSZXEgKikgbXNnX2J1ZjsKKwkvKiBIb2xkIG9udG8gdGhlIFNldEtleXMgcmVxdWVzdCBwYXJhbWV0ZXJzICovCisJbWFjX2N0eC0+bGltLmdwTGltTWxtU2V0S2V5c1JlcSA9ICh2b2lkICopbWxtX3NldF9rZXlzX3JlcTsKKwlzZXNzaW9uID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQobWFjX2N0eCwKKwkJCQltbG1fc2V0X2tleXNfcmVxLT5zZXNzaW9uSWQpOworCWlmIChOVUxMID09IHNlc3Npb24pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJRkwoIlJlY2VpdmVkIE1MTV9TRVRLRVlTX1JFUSB3aXRoIHBhcmFtZXRlcnM6IgorCQkgICAiQUlEIFslZF0sIEVEIFR5cGUgWyVkXSwgIyBLZXlzIFslZF0gJiBQZWVyIE1BQyBBZGRyIC0gIiksCisJCW1sbV9zZXRfa2V5c19yZXEtPmFpZCwgbWxtX3NldF9rZXlzX3JlcS0+ZWRUeXBlLAorCQltbG1fc2V0X2tleXNfcmVxLT5udW1LZXlzKTsKKwlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwgbWxtX3NldF9rZXlzX3JlcS0+cGVlck1hY0FkZHIsIExPR1cpOworCXNpcl9jb3B5X21hY19hZGRyKGN1cnJfYnNzaWQsIHNlc3Npb24tPmJzc0lkKTsKKworCXN3aXRjaCAoR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uKSkgeworCWNhc2UgZUxJTV9TVEFfUk9MRToKKwljYXNlIGVMSU1fQlRfQU1QX1NUQV9ST0xFOgorCQkvKgorCQkgKiBJbiBjYXNlIG9mIFRETFMsIHBlZXJNYWMgYWRkcmVzcyBuZWVkIG5vdCBiZSBCc3NJZC4gU2tpcCB0aGlzCisJCSAqIGNoZWNrIGlmIFRETFMgaXMgZW5hYmxlZC4KKwkJICovCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9URExTCisJCWlmICgoIWxpbV9pc19hZGRyX2JjKG1sbV9zZXRfa2V5c19yZXEtPnBlZXJNYWNBZGRyKSkgJiYKKwkJICAgICghY2RmX21lbV9jb21wYXJlKG1sbV9zZXRfa2V5c19yZXEtPnBlZXJNYWNBZGRyLAorCQkJCSAgICAgIGN1cnJfYnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpKSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJSZWNlaXZlZCBNTE1fU0VUS0VZU19SRVEgd2l0aCBpbnZhbGlkIEJTU0lEIgorCQkJCU1BQ19BRERSRVNTX1NUUiksCisJCQkJTUFDX0FERFJfQVJSQVkobWxtX3NldF9rZXlzX3JlcS0+cGVlck1hY0FkZHIpKTsKKwkJCS8qCisJCQkgKiBQcmVwYXJlIGFuZCBTZW5kIExJTV9NTE1fU0VUS0VZU19DTkYgd2l0aCBlcnJvciBjb2RlCisJCQkgKi8KKwkJCW1sbV9zZXRfa2V5c19jbmYucmVzdWx0Q29kZSA9CisJCQkJZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCQkJZ290byBlbmQ7CisJCX0KKyNlbmRpZgorCQlicmVhazsKKwljYXNlIGVMSU1fU1RBX0lOX0lCU1NfUk9MRToKKwkJLyoKKwkJICogdXBkYXRlIHRoZSBJQlNTIFBFIHNlc3Npb24gZW5jcnB0aW9uIHR5cGUgYmFzZWQgb24gdGhlCisJCSAqIGtleSB0eXBlCisJCSAqLworCQlzZXNzaW9uLT5lbmNyeXB0VHlwZSA9IG1sbV9zZXRfa2V5c19yZXEtPmVkVHlwZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBVc2UgdGhlICJ1bmljYXN0IiBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSAiR3JvdXAgS2V5cyIKKwkgKiBhcmUgYmVpbmcgc2V0LgorCSAqIG1sbV9zZXRfa2V5c19yZXEtPmtleS51bmljYXN0ID0gMCAtPiBNdWx0aWNhc3QvYnJvYWRjYXN0CisJICogbWxtX3NldF9rZXlzX3JlcS0+a2V5LnVuaWNhc3QgLSAxIC0+IFVuaWNhc3Qga2V5cyBhcmUgYmVpbmcgc2V0CisJICovCisJaWYgKGxpbV9pc19hZGRyX2JjKG1sbV9zZXRfa2V5c19yZXEtPnBlZXJNYWNBZGRyKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJUcnlpbmcgdG8gc2V0IEdyb3VwIEtleXMuLi4lZCAiKSwKKwkJCW1sbV9zZXRfa2V5c19yZXEtPnNlc3Npb25JZCk7CisJCS8qCisJCSAqIFdoZW4gdHJ5aW5nIHRvIHNldCBHcm91cCBLZXlzIGZvciBhbnkgc2VjdXJpdHkgbW9kZSBvdGhlcgorCQkgKiB0aGFuIFdFUCwgdXNlIHRoZSBTVEEgSW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgQVAuLi4KKwkJICovCisJCXN3aXRjaCAobWxtX3NldF9rZXlzX3JlcS0+ZWRUeXBlKSB7CisJCWNhc2UgZVNJUl9FRF9DQ01QOgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJY2FzZSBlU0lSX0VEX0FFU18xMjhfQ01BQzoKKyNlbmRpZgorCQkJc3RhX2lkeCA9IHNlc3Npb24tPnN0YUlkOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlRyeWluZyB0byBzZXQgVW5pY2FzdCBLZXlzLi4uIikpOworCQkvKgorCQkgKiBDaGVjayBpZiB0aGVyZSBleGlzdHMgYSBjb250ZXh0IGZvciB0aGUKKwkJICogcGVlciBlbnRpdHkgZm9yIHdoaWNoIGtleXMgbmVlZCB0byBiZSBzZXQuCisJCSAqLworCQlzdGFfZHMgPSBkcGhfbG9va3VwX2hhc2hfZW50cnkobWFjX2N0eCwKKwkJCQltbG1fc2V0X2tleXNfcmVxLT5wZWVyTWFjQWRkciwgJmFpZCwKKwkJCQkmc2Vzc2lvbi0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCWlmICgoc3RhX2RzID09IE5VTEwpIHx8CisJCSAgICAoKHN0YV9kcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPQorCQkgICAgZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkgJiYKKwkJICAgICFMSU1fSVNfQVBfUk9MRShzZXNzaW9uKSkpIHsKKwkJCS8qCisJCQkgKiBSZWNlaXZlZCBMSU1fTUxNX1NFVEtFWVNfUkVRIGZvciBTVEEgdGhhdCBkb2VzIG5vdAorCQkJICogaGF2ZSBjb250ZXh0IG9yIGluIHNvbWUgdHJhbnNpdCBzdGF0ZS4KKwkJCSAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJCUZMKCJJbnZhbGlkIE1MTV9TRVRLRVlTX1JFUSwgQWRkciA9ICIKKwkJCQkgICBNQUNfQUREUkVTU19TVFIpLAorCQkJCU1BQ19BRERSX0FSUkFZKG1sbV9zZXRfa2V5c19yZXEtPnBlZXJNYWNBZGRyKSk7CisJCQkvKiBQcmVwYXJlIGFuZCBTZW5kIExJTV9NTE1fU0VUS0VZU19DTkYgKi8KKwkJCW1sbV9zZXRfa2V5c19jbmYucmVzdWx0Q29kZSA9CisJCQkJZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCQkJZ290byBlbmQ7CisJCX0gZWxzZSB7CisJCQlzdGFfaWR4ID0gc3RhX2RzLT5zdGFJbmRleDsKKwkJfQorCX0KKworCWlmICgobWxtX3NldF9rZXlzX3JlcS0+bnVtS2V5cyA9PSAwKQorCSAgICAmJiAobWxtX3NldF9rZXlzX3JlcS0+ZWRUeXBlICE9IGVTSVJfRURfTk9ORSkpIHsKKwkJLyoKKwkJICogQnJvYWRjYXN0L011bHRpY2FzdCBLZXlzIChmb3IgV0VQISEpIGFyZSBOT1Qgc2VudAorCQkgKiB2aWEgdGhpcyBpbnRlcmZhY2UhISBUaGlzIGluZGljYXRlcyB0byBIQUwgdGhhdCB0aGUgV0VQIEtleXMKKwkJICogbmVlZCB0byBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgQ0ZHIGFuZCBhcHBsaWVkIHRvIGhhcmR3YXJlCisJCSAqLworCQlkZWZhdWx0X2tleV9pZCA9IDB4ZmY7CisJfSBlbHNlIGlmIChtbG1fc2V0X2tleXNfcmVxLT5rZXlbMF0ua2V5SWQgJiYKKwkJICAgKChtbG1fc2V0X2tleXNfcmVxLT5lZFR5cGUgPT0gZVNJUl9FRF9XRVA0MCkgfHwKKwkJICAgIChtbG1fc2V0X2tleXNfcmVxLT5lZFR5cGUgPT0gZVNJUl9FRF9XRVAxMDQpKSkgeworCQkvKgorCQkgKiBJZiB0aGUgS2V5IElkIGlzIG5vbiB6ZXJvIGFuZCBlbmNyeXB0aW9uIG1vZGUgaXMgV0VQLAorCQkgKiB0aGUga2V5IGluZGV4IGlzIGNvbWluZyBmcm9tIHRoZSB1cHBlciBsYXllcnMgc28gdGhhdCBrZXkKKwkJICogb25seSBuZWVkIHRvIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdHgga2V5LCBUaGlzIGlzIGJlaW5nCisJCSAqIHVzZWQgb25seSBpbiBjYXNlIG9mIFdFUCBtb2RlIGluIEhBTAorCQkgKi8KKwkJZGVmYXVsdF9rZXlfaWQgPSBtbG1fc2V0X2tleXNfcmVxLT5rZXlbMF0ua2V5SWQ7CisJfSBlbHNlIHsKKwkJZGVmYXVsdF9rZXlfaWQgPSAwOworCX0KKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJUcnlpbmcgdG8gc2V0IGtleXMgZm9yIFNUQSBJbmRleCBbJWRdLCB1c2luZyBkZWZhdWx0X2tleV9pZCBbJWRdIiksCisJCXN0YV9pZHgsIGRlZmF1bHRfa2V5X2lkKTsKKworCWlmIChsaW1faXNfYWRkcl9iYyhtbG1fc2V0X2tleXNfcmVxLT5wZWVyTWFjQWRkcikpIHsKKwkJc2Vzc2lvbi0+bGltUHJldk1sbVN0YXRlID0gc2Vzc2lvbi0+bGltTWxtU3RhdGU7CisJCXNlc3Npb24tPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfU0VUX0JTU19LRVlfU1RBVEU7CisJCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisJCQkJIHNlc3Npb24tPnBlU2Vzc2lvbklkLCBzZXNzaW9uLT5saW1NbG1TdGF0ZSkpOworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJUcnlpbmcgdG8gc2V0IEdyb3VwIEtleXMuLi4lZCAiKSwKKwkJCXNlc3Npb24tPnBlU2Vzc2lvbklkKTsKKwkJLyogUGFja2FnZSBXTUFfU0VUX0JTU0tFWV9SRVEgbWVzc2FnZSBwYXJhbWV0ZXJzICovCisJCWxpbV9zZW5kX3NldF9ic3Nfa2V5X3JlcShtYWNfY3R4LCBtbG1fc2V0X2tleXNfcmVxLCBzZXNzaW9uKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFBhY2thZ2UgV01BX1NFVF9TVEFLRVlfUkVRIC8gV01BX1NFVF9TVEFfQkNBU1RLRVlfUkVRIG1lc3NhZ2UKKwkJICogcGFyYW1ldGVycworCQkgKi8KKwkJbGltX3NlbmRfc2V0X3N0YV9rZXlfcmVxKG1hY19jdHgsIG1sbV9zZXRfa2V5c19yZXEsIHN0YV9pZHgsCisJCQkJCSAodWludDhfdCkgZGVmYXVsdF9rZXlfaWQsIHNlc3Npb24sCisJCQkJCSB0cnVlKTsKKwkJcmV0dXJuOworCX0KK2VuZDoKKwltbG1fc2V0X2tleXNfY25mLnNlc3Npb25JZCA9IG1sbV9zZXRfa2V5c19yZXEtPnNlc3Npb25JZDsKKwlsaW1fcG9zdF9zbWVfc2V0X2tleXNfY25mKG1hY19jdHgsIG1sbV9zZXRfa2V5c19yZXEsICZtbG1fc2V0X2tleXNfY25mKTsKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19wZXJpb2RpY19wcm9iZV9yZXFfdGltZXIoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MKKyAqIHBlcmlvZGljIHByb2JlIHJlcXVlc3QgdG8gc2VuZCBkdXJpbmcgc2Nhbi4KKyAqCisgKiBAbWFjX2N0eDogICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBwZXJpb2RpYyBwcm9iZSByZXF1ZXN0IHRvIHNlbmQgZHVyaW5nIHNjYW4KKyAqCisgKiBAUmV0dXJuIE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3NfcGVyaW9kaWNfcHJvYmVfcmVxX3RpbWVyKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJdWludDhfdCBjaGFubmVsX251bTsKKwl1aW50OF90IGkgPSAwOworCXRMaW1NbG1TY2FuUmVxICptbG1fc2Nhbl9yZXE7CisJdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisJVFhfVElNRVIgKnByb2JlX3JlcV90aW1lciA9CisJCSZtYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY1Byb2JlUmVxVGltZXI7CisKKwlpZiAoY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKCZwcm9iZV9yZXFfdGltZXItPmNkZl90aW1lcikKKwkJCQkJICAgIT0gQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiSW52YWxpZCBzdGF0ZSBvZiB0aW1lciIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghKChtYWNfY3R4LT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUpCisJICAgICYmIChwcm9iZV9yZXFfdGltZXItPnNlc3Npb25JZCAhPSAweGZmKQorCSAgICAmJiAobWFjX2N0eC0+bGltLnByb2JlQ291bnRlciA8IG1hY19jdHgtPmxpbS5tYXhQcm9iZSkpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFBlcmlvZGljIHNjYW4gdGltZW91dCBpbiBzdGF0ZSAlWCIpLAorCQkJbWFjX2N0eC0+bGltLmdMaW1NbG1TdGF0ZSk7CisJCXJldHVybjsKKwl9CisKKwltbG1fc2Nhbl9yZXEgPSBtYWNfY3R4LT5saW0uZ3BMaW1NbG1TY2FuUmVxOworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlNjYW5uaW5nIDogUGVyaW9kaWMgc2Nhbm5pbmciKSk7CisJbWFjX2N0eC0+bGltLnByb2JlQ291bnRlcisrOworCS8qIFBlcmlvZGljIGNoYW5uZWwgdGltZXIgdGltZWQgb3V0IHRvIHNlbmQgcHJvYmUgcmVxdWVzdC4gKi8KKwljaGFubmVsX251bSA9IGxpbV9nZXRfY3VycmVudF9zY2FuX2NoYW5uZWwobWFjX2N0eCk7CisJZG8geworCQkvKgorCQkgKiBQcmVwYXJlIGFuZCBzZW5kIFByb2JlIFJlcXVlc3QgZnJhbWUgZm9yIGFsbCB0aGUgU1NJRHMKKwkJICogcHJlc2VudCBpbiB0aGUgc2F2ZWQgTUxNCisJCSAqLworCQlzdGF0dXMgPSBsaW1fc2VuZF9wcm9iZV9yZXFfbWdtdF9mcmFtZShtYWNfY3R4LAorCQkJCSZtbG1fc2Nhbl9yZXEtPnNzSWRbaV0sIG1sbV9zY2FuX3JlcS0+YnNzSWQsCisJCQkJY2hhbm5lbF9udW0sIG1hY19jdHgtPmxpbS5nU2VsZk1hY0FkZHIsCisJCQkJbWxtX3NjYW5fcmVxLT5kb3QxMW1vZGUsCisJCQkJbWxtX3NjYW5fcmVxLT51SUVGaWVsZExlbiwKKwkJCQkodWludDhfdCAqKSAobWxtX3NjYW5fcmVxKSArCisJCQkJCW1sbV9zY2FuX3JlcS0+dUlFRmllbGRPZmZzZXQpOworCQlpZiAoc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJzZW5kIFByb2JlUmVxIGZhaWxlZCBmb3IgU1NJRCAlcyBvbiBjaGFubmVsOiAlZCIpLAorCQkJCW1sbV9zY2FuX3JlcS0+c3NJZFtpXS5zc0lkLCBjaGFubmVsX251bSk7CisJCQlyZXR1cm47CisJCX0KKwkJaSsrOworCX0gd2hpbGUgKGkgPCBtbG1fc2Nhbl9yZXEtPm51bVNzaWQpOworCS8qIEFjdGl2YXRlIHRpbWVyIGFnYWluICovCisJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLAorCQkJIHByb2JlX3JlcV90aW1lci0+c2Vzc2lvbklkLAorCQkJIGVMSU1fUEVSSU9ESUNfUFJPQkVfUkVRX1RJTUVSKSk7CisJaWYgKHR4X3RpbWVyX2FjdGl2YXRlKHByb2JlX3JlcV90aW1lcikgIT0gVFhfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiY291bGQgbm90IHN0YXJ0IHBlcmlvZGljIHByb2JlIHJlcSB0aW1lciIpKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19qb2luX2ZhaWx1cmVfdGltZW91dCgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcworICogSm9pbkZhaWx1cmVUaW1lb3V0CisgKgorICogQG1hY19jdHg6ICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgSm9pbkZhaWx1cmVUaW1lb3V0CisgKgorICogQFJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX2pvaW5fZmFpbHVyZV90aW1lb3V0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJdExpbU1sbUpvaW5DbmYgbWxtX2pvaW5fY25mOworCXVpbnQzMl90IGxlbjsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTQorCWhvc3RfbG9nX3Jzc2lfcGt0X3R5cGUgKnJzc2lfbG9nID0gTlVMTDsKKyNlbmRpZgorCXRwUEVTZXNzaW9uIHNlc3Npb247CisKKwlzZXNzaW9uID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQobWFjX2N0eCwKKwkJCW1hY19jdHgtPmxpbS5saW1UaW1lcnMuZ0xpbUpvaW5GYWlsdXJlVGltZXIuc2Vzc2lvbklkKTsKKwlpZiAoTlVMTCA9PSBzZXNzaW9uKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSUQiKSk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0KKwlXTEFOX0hPU1RfRElBR19MT0dfQUxMT0MocnNzaV9sb2csCisJCQkJaG9zdF9sb2dfcnNzaV9wa3RfdHlwZSwgTE9HX1dMQU5fUlNTSV9VUERBVEVfQyk7CisJaWYgKHJzc2lfbG9nKQorCQlyc3NpX2xvZy0+cnNzaSA9IHNlc3Npb24tPnJzc2k7CisJV0xBTl9IT1NUX0RJQUdfTE9HX1JFUE9SVChyc3NpX2xvZyk7CisjZW5kaWYKKworCWlmIChzZXNzaW9uLT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9KT0lOX0JFQUNPTl9TVEFURSkgeworCQlsZW4gPSBzaXplb2YodFNpck1hY0FkZHIpOworCQkvKiBDaGFuZ2UgdGltZXIgZm9yIGZ1dHVyZSBhY3RpdmF0aW9ucyAqLworCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKG1hY19jdHgsIGVMSU1fSk9JTl9GQUlMX1RJTUVSKTsKKwkJLyogQ2hhbmdlIFBlcmlvZGljIHByb2JlIHJlcSB0aW1lciBmb3IgZnV0dXJlIGFjdGl2YXRpb24gKi8KKwkJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihtYWNfY3R4LAorCQkJCQllTElNX1BFUklPRElDX0pPSU5fUFJPQkVfUkVRX1RJTUVSKTsKKwkJLyogSXNzdWUgTUxNIGpvaW4gY29uZmlybSB3aXRoIHRpbWVvdXQgcmVhc29uIGNvZGUgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkluIHN0YXRlIGVMSU1fTUxNX1dUX0pPSU5fQkVBQ09OX1NUQVRFLiIpKTsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkpvaW4gRmFpbHVyZSBUaW1lb3V0IG9jY3VycmVkIGZvciBzZXNzaW9uICVkIHdpdGggQlNTICIKKwkJCSAgIE1BQ19BRERSRVNTX1NUUiksCisJCQlzZXNzaW9uLT5wZVNlc3Npb25JZCwgTUFDX0FERFJfQVJSQVkoc2Vzc2lvbi0+YnNzSWQpKTsKKworCQltbG1fam9pbl9jbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0pPSU5fVElNRU9VVF9SRVNVTFRfQ09ERTsKKwkJbWxtX2pvaW5fY25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCQlzZXNzaW9uLT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0lETEVfU1RBVEU7CisJCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisJCQkJIHNlc3Npb24tPnBlU2Vzc2lvbklkLCBzZXNzaW9uLT5saW1NbG1TdGF0ZSkpOworCQlpZiAobGltX3NldF9saW5rX3N0YXRlKG1hY19jdHgsIGVTSVJfTElOS19JRExFX1NUQVRFLAorCQkJCSAgICAgICBzZXNzaW9uLT5ic3NJZCwgc2Vzc2lvbi0+c2VsZk1hY0FkZHIsCisJCQkJICAgICAgIE5VTEwsIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkoIkZhaWxlZCB0byBzZXQgdGhlIExpbmtTdGF0ZSIpKTsKKwkJLyogVXBkYXRlIFBFIHNlc3Npb24gSWQgKi8KKwkJbWxtX2pvaW5fY25mLnNlc3Npb25JZCA9IHNlc3Npb24tPnBlU2Vzc2lvbklkOworCQkvKiBGcmVldXAgYnVmZmVyIGFsbG9jYXRlZCB0byBqb2luIHJlcXVlc3QgKi8KKwkJaWYgKHNlc3Npb24tPnBMaW1NbG1Kb2luUmVxKSB7CisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+cExpbU1sbUpvaW5SZXEpOworCQkJc2Vzc2lvbi0+cExpbU1sbUpvaW5SZXEgPSBOVUxMOworCQl9CisJCWxpbV9wb3N0X3NtZV9tZXNzYWdlKG1hY19jdHgsIExJTV9NTE1fSk9JTl9DTkYsCisJCQkJICAgICAodWludDMyX3QgKikgJm1sbV9qb2luX2NuZik7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBKT0lOIGZhaWx1cmUgdGltZW91dCBpbiBzdGF0ZSAlWCIpLAorCQkJc2Vzc2lvbi0+bGltTWxtU3RhdGUpOworCQlsaW1fcHJpbnRfbWxtX3N0YXRlKG1hY19jdHgsIExPR1csIHNlc3Npb24tPmxpbU1sbVN0YXRlKTsKKwl9Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfcGVyaW9kaWNfam9pbl9wcm9iZV9yZXFfdGltZXIoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvCisgKiBwcm9jZXNzIHBlcmlvZGljIHByb2JlIHJlcXVlc3Qgc2VuZCBkdXJpbmcgam9pbmluZyBwcm9jZXNzLgorICoKKyAqIEBtYWNfY3R4OiAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIHBlcmlvZGljIHByb2JlIHJlcXVlc3Qgc2VuZCBkdXJpbmcKKyAqIGpvaW5pbmcgcHJvY2Vzcy4KKyAqCisgKiBAUmV0dXJuIE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3NfcGVyaW9kaWNfam9pbl9wcm9iZV9yZXFfdGltZXIodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCkKK3sKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uOworCXRTaXJNYWNTU2lkIHNzaWQ7CisKKwlzZXNzaW9uID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQobWFjX2N0eCwKKwkJbWFjX2N0eC0+bGltLmxpbVRpbWVycy5nTGltUGVyaW9kaWNKb2luUHJvYmVSZXFUaW1lci5zZXNzaW9uSWQpOworCWlmIChOVUxMID09IHNlc3Npb24pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIFNlc3Npb25JZCA6ICVkIiksCisJCQltYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY0pvaW5Qcm9iZVJlcVRpbWVyLgorCQkJc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgodHJ1ZSA9PQorCSAgICB0eF90aW1lcl9ydW5uaW5nKCZtYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1Kb2luRmFpbHVyZVRpbWVyKSkKKwkJJiYgKHNlc3Npb24tPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX0pPSU5fQkVBQ09OX1NUQVRFKSkgeworCQljZGZfbWVtX2NvcHkoc3NpZC5zc0lkLCBzZXNzaW9uLT5zc0lkLnNzSWQsCisJCQkgICAgIHNlc3Npb24tPnNzSWQubGVuZ3RoKTsKKwkJc3NpZC5sZW5ndGggPSBzZXNzaW9uLT5zc0lkLmxlbmd0aDsKKwkJbGltX3NlbmRfcHJvYmVfcmVxX21nbXRfZnJhbWUobWFjX2N0eCwgJnNzaWQsCisJCQlzZXNzaW9uLT5wTGltTWxtSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uYnNzSWQsCisJCQlzZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwgLypjaGFuTnVtICovLAorCQkJc2Vzc2lvbi0+c2VsZk1hY0FkZHIsIHNlc3Npb24tPmRvdDExbW9kZSwKKwkJCXNlc3Npb24tPnBMaW1Kb2luUmVxLT5hZGRJRVNjYW4ubGVuZ3RoLAorCQkJc2Vzc2lvbi0+cExpbUpvaW5SZXEtPmFkZElFU2Nhbi5hZGRJRWRhdGEpOworCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKG1hY19jdHgsCisJCQkJZUxJTV9QRVJJT0RJQ19KT0lOX1BST0JFX1JFUV9USU1FUik7CisJCS8qIEFjdGl2YXRlIEpvaW4gUGVyaW9kaWMgUHJvYmUgUmVxIHRpbWVyICovCisJCWlmICh0eF90aW1lcl9hY3RpdmF0ZSgKKwkJICAgICZtYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY0pvaW5Qcm9iZVJlcVRpbWVyKSAhPQorCQkgICAgVFhfU1VDQ0VTUykgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJjb3VsZCBub3QgYWN0aXZhdGUgUGVyaW9kaWMgSm9pbiByZXEgZmFpbHVyZSB0aW1lciIpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19hdXRoX2ZhaWx1cmVfdGltZW91dCgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNaW4KKyAqIENoYW5uZWwgVGltZW91dCBkdXJpbmcgY2hhbm5lbCBzY2FuLgorICoKKyAqIEBtYWNfY3R4OiAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1pbiBDaGFubmVsIFRpbWVvdXQgZHVyaW5nIGNoYW5uZWwgc2Nhbi4KKyAqCisgKiBAUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX2F1dGhfZmFpbHVyZV90aW1lb3V0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJLyogZmV0Y2ggdGhlIHNlc3Npb25FbnRyeSBiYXNlZCBvbiB0aGUgc2Vzc2lvbklkICovCisJdHBQRVNlc3Npb24gc2Vzc2lvbjsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTQorCWhvc3RfbG9nX3Jzc2lfcGt0X3R5cGUgKnJzc2lfbG9nID0gTlVMTDsKKyNlbmRpZgorCisJc2Vzc2lvbiA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKG1hY19jdHgsCisJCQltYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1BdXRoRmFpbHVyZVRpbWVyLnNlc3Npb25JZCk7CisJaWYgKE5VTEwgPT0gc2Vzc2lvbikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEIikpOworCQlyZXR1cm47CisJfQorCisJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQlGTCgicmVjZWl2ZWQgQVVUSCBmYWlsdXJlIHRpbWVvdXQgaW4gc2Vzc2lvbmlkICVkICIKKwkJICAgImxpbU1sbXN0YXRlICVYIGxpbVNtZVN0YXRlICVYIiksCisJCXNlc3Npb24tPnBlU2Vzc2lvbklkLCBzZXNzaW9uLT5saW1NbG1TdGF0ZSwKKwkJc2Vzc2lvbi0+bGltU21lU3RhdGUpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNCisJV0xBTl9IT1NUX0RJQUdfTE9HX0FMTE9DKHJzc2lfbG9nLCBob3N0X2xvZ19yc3NpX3BrdF90eXBlLAorCQkJCSBMT0dfV0xBTl9SU1NJX1VQREFURV9DKTsKKwlpZiAocnNzaV9sb2cpCisJCXJzc2lfbG9nLT5yc3NpID0gc2Vzc2lvbi0+cnNzaTsKKwlXTEFOX0hPU1RfRElBR19MT0dfUkVQT1JUKHJzc2lfbG9nKTsKKyNlbmRpZgorCisJc3dpdGNoIChzZXNzaW9uLT5saW1NbG1TdGF0ZSkgeworCWNhc2UgZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTJfU1RBVEU6CisJY2FzZSBlTElNX01MTV9XVF9BVVRIX0ZSQU1FNF9TVEFURToKKwkJLyoKKwkJICogUmVxdWVzdGluZyBTVEEgZGlkIG5vdCByZWNlaXZlIG5leHQgYXV0aCBmcmFtZSBiZWZvcmUgQXV0aAorCQkgKiBGYWlsdXJlIHRpbWVvdXQuIElzc3VlIE1MTSBhdXRoIGNvbmZpcm0gd2l0aCB0aW1lb3V0IHJlYXNvbgorCQkgKiBjb2RlLiBSZXN0b3JlIGRlZmF1bHQgZmFpbHVyZSB0aW1lb3V0CisJCSAqLworCQlpZiAoQ0RGX1AyUF9DTElFTlRfTU9ERSA9PSBzZXNzaW9uLT5wZVBlcnNvbmEKKwkJICAgICYmIHNlc3Npb24tPmRlZmF1bHRBdXRoRmFpbHVyZVRpbWVvdXQpCisJCQljZmdfc2V0X2ludChtYWNfY3R4LAorCQkJCSAgICBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVQsCisJCQkJICAgIHNlc3Npb24tPmRlZmF1bHRBdXRoRmFpbHVyZVRpbWVvdXQpOworCQlsaW1fcmVzdG9yZV9mcm9tX2F1dGhfc3RhdGUobWFjX2N0eCwKKwkJCQllU0lSX1NNRV9BVVRIX1RJTUVPVVRfUkVTVUxUX0NPREUsCisJCQkJZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OLCBzZXNzaW9uKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogQXV0aCBmYWlsdXJlIHRpbWVyIHNob3VsZCBub3QgaGF2ZSB0aW1lZCBvdXQKKwkJICogaW4gc3RhdGVzIG90aGVyIHRoYW4gd3RfYXV0aF9mcmFtZTIvNAorCQkgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgQVVUSCBmYWlsdXJlIHRpbWVvdXQgaW4gc3RhdGUgJVgiKSwKKwkJCXNlc3Npb24tPmxpbU1sbVN0YXRlKTsKKwkJbGltX3ByaW50X21sbV9zdGF0ZShtYWNfY3R4LCBMT0dFLCBzZXNzaW9uLT5saW1NbG1TdGF0ZSk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19hdXRoX3JzcF90aW1lb3V0KCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1pbgorICogQ2hhbm5lbCBUaW1lb3V0IGR1cmluZyBjaGFubmVsIHNjYW4uCisgKgorICogQG1hY19jdHg6ICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgTWluIENoYW5uZWwgVGltZW91dCBkdXJpbmcgY2hhbm5lbCBzY2FuLgorICoKKyAqIEBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2xpbV9wcm9jZXNzX2F1dGhfcnNwX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3QgYXV0aF9pZHgpCit7CisJc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqYXV0aF9ub2RlOworCXRwUEVTZXNzaW9uIHNlc3Npb247CisJdWludDhfdCBzZXNzaW9uX2lkOworCisJYXV0aF9ub2RlID0gbGltX2dldF9wcmVfYXV0aF9ub2RlX2Zyb21faW5kZXgobWFjX2N0eCwKKwkJCQkmbWFjX2N0eC0+bGltLmdMaW1QcmVBdXRoVGltZXJUYWJsZSwgYXV0aF9pZHgpOworCWlmIChOVUxMID09IGF1dGhfbm9kZSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csIEZMKCJJbnZhbGlkIGF1dGggbm9kZSIpKTsKKwkJcmV0dXJuOworCX0KKworCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQobWFjX2N0eCwgYXV0aF9ub2RlLT5wZWVyTWFjQWRkciwKKwkJCQkJICAgJnNlc3Npb25faWQpOworCWlmIChOVUxMID09IHNlc3Npb24pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIEJTU0lEICIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uKSB8fCBMSU1fSVNfSUJTU19ST0xFKHNlc3Npb24pKSB7CisJCWlmIChhdXRoX25vZGUtPm1sbVN0YXRlICE9IGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUzX1NUQVRFKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoInJlY2VpdmVkIEFVVEggcnNwIHRpbWVvdXQgaW4gdW5leHBlY3RlZCAiCisJCQkJICAgInN0YXRlIGZvciBNQUMgYWRkcmVzczogIiBNQUNfQUREUkVTU19TVFIpLAorCQkJCU1BQ19BRERSX0FSUkFZKGF1dGhfbm9kZS0+cGVlck1hY0FkZHIpKTsKKwkJfSBlbHNlIHsKKwkJCWF1dGhfbm9kZS0+bWxtU3RhdGUgPSBlTElNX01MTV9BVVRIX1JTUF9USU1FT1VUX1NUQVRFOworCQkJYXV0aF9ub2RlLT5mVGltZXJTdGFydGVkID0gMDsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgiQVVUSCByc3AgdGltZWRvdXQgZm9yIE1BQyBhZGRyZXNzICIKKwkJCQkgICBNQUNfQUREUkVTU19TVFIpLAorCQkJCU1BQ19BRERSX0FSUkFZKGF1dGhfbm9kZS0+cGVlck1hY0FkZHIpKTsKKwkJCS8qIENoYW5nZSB0aW1lciB0byByZWFjdGl2YXRlIGl0IGluIGZ1dHVyZSAqLworCQkJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV9wZXJfc3RhX2lkX3RpbWVyKG1hY19jdHgsCisJCQkJZUxJTV9BVVRIX1JTUF9USU1FUiwgYXV0aF9ub2RlLT5hdXRoTm9kZUlkeCk7CisJCQlsaW1fZGVsZXRlX3ByZV9hdXRoX25vZGUobWFjX2N0eCwKKwkJCQkJCSBhdXRoX25vZGUtPnBlZXJNYWNBZGRyKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19hc3NvY19mYWlsdXJlX3RpbWVvdXQoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgTWluCisgKiBDaGFubmVsIFRpbWVvdXQgZHVyaW5nIGNoYW5uZWwgc2Nhbi4KKyAqCisgKiBAbWFjX2N0eCAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1pbiBDaGFubmVsIFRpbWVvdXQgZHVyaW5nIGNoYW5uZWwgc2Nhbi4KKyAqCisgKiBAUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitsaW1fcHJvY2Vzc19hc3NvY19mYWlsdXJlX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3QgbXNnX3R5cGUpCit7CisKKwl0TGltTWxtQXNzb2NDbmYgbWxtX2Fzc29jX2NuZjsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uOworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNCisJaG9zdF9sb2dfcnNzaV9wa3RfdHlwZSAqcnNzaV9sb2cgPSBOVUxMOworI2VuZGlmCisJLyoKKwkgKiB0byBmZXRjaCB0aGUgbGltL21sbSBzdGF0ZSBiYXNlZCBvbiB0aGUgc2Vzc2lvbl9pZCwgdXNlIHRoZQorCSAqIGJlbG93IHNlc3Npb25FbnRyeQorCSAqLworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsKKworCWlmIChtc2dfdHlwZSA9PSBMSU1fQVNTT0MpCisJCXNlc3Npb25faWQgPQorCQkgICAgbWFjX2N0eC0+bGltLmxpbVRpbWVycy5nTGltQXNzb2NGYWlsdXJlVGltZXIuc2Vzc2lvbklkOworCWVsc2UKKwkJc2Vzc2lvbl9pZCA9CisJCSAgICBtYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1SZWFzc29jRmFpbHVyZVRpbWVyLnNlc3Npb25JZDsKKworCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwlpZiAoTlVMTCA9PSBzZXNzaW9uKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSUQiKSk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0KKwlXTEFOX0hPU1RfRElBR19MT0dfQUxMT0MocnNzaV9sb2csCisJCQkJIGhvc3RfbG9nX3Jzc2lfcGt0X3R5cGUsCisJCQkJIExPR19XTEFOX1JTU0lfVVBEQVRFX0MpOworCWlmIChyc3NpX2xvZykKKwkJcnNzaV9sb2ctPnJzc2kgPSBzZXNzaW9uLT5yc3NpOworCVdMQU5fSE9TVF9ESUFHX0xPR19SRVBPUlQocnNzaV9sb2cpOworI2VuZGlmCisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJSZS9Bc3NvY2lhdGlvbiBSZXNwb25zZSBub3QgcmVjZWl2ZWQgYmVmb3JlIHRpbWVvdXQgIikpOworCisJaWYgKChMSU1fSVNfQVBfUk9MRShzZXNzaW9uKSB8fCBMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbikpIHx8CisJICAgICgoc2Vzc2lvbi0+bGltTWxtU3RhdGUgIT0gZUxJTV9NTE1fV1RfQVNTT0NfUlNQX1NUQVRFKSAmJgorCSAgICAoc2Vzc2lvbi0+bGltTWxtU3RhdGUgIT0gZUxJTV9NTE1fV1RfUkVBU1NPQ19SU1BfU1RBVEUpICYmCisJICAgIChzZXNzaW9uLT5saW1NbG1TdGF0ZSAhPSBlTElNX01MTV9XVF9GVF9SRUFTU09DX1JTUF9TVEFURSkpKSB7CisJCS8qCisJCSAqIFJlL0Fzc29jIGZhaWx1cmUgdGltZXIgc2hvdWxkIG5vdCBoYXZlIHRpbWVkb3V0IG9uIEFQCisJCSAqIG9yIGluIGEgc3RhdGUgb3RoZXIgdGhhbiB3dF9yZS9hc3NvY19yZXNwb25zZS4KKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFJFQVNTT0MgZmFpbHVyZSB0aW1lb3V0IGluIHN0YXRlICVYIGZvciByb2xlICVkIiksCisJCQlzZXNzaW9uLT5saW1NbG1TdGF0ZSwKKwkJCUdFVF9MSU1fU1lTVEVNX1JPTEUoc2Vzc2lvbikpOworCQlsaW1fcHJpbnRfbWxtX3N0YXRlKG1hY19jdHgsIExPR1csIHNlc3Npb24tPmxpbU1sbVN0YXRlKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgobXNnX3R5cGUgPT0gTElNX0FTU09DKSB8fCAoKG1zZ190eXBlID09IExJTV9SRUFTU09DKQorCSAgICAgJiYgKHNlc3Npb24tPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX0ZUX1JFQVNTT0NfUlNQX1NUQVRFKSkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIihSZSlBc3NvYyBGYWlsdXJlIFRpbWVvdXQgb2NjdXJyZWQuIikpOworCQlzZXNzaW9uLT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0lETEVfU1RBVEU7CisJCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisJCQlzZXNzaW9uLT5wZVNlc3Npb25JZCwgc2Vzc2lvbi0+bGltTWxtU3RhdGUpKTsKKwkJLyogQ2hhbmdlIHRpbWVyIGZvciBmdXR1cmUgYWN0aXZhdGlvbnMgKi8KKwkJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihtYWNfY3R4LCBlTElNX0FTU09DX0ZBSUxfVElNRVIpOworCQkvKgorCQkgKiBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIEpvaW5SZXEgaGVsZCBieQorCQkgKiBNTE0gc3RhdGUgbWFjaGluZQorCQkgKi8KKwkJaWYgKHNlc3Npb24tPnBMaW1NbG1Kb2luUmVxKSB7CisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+cExpbU1sbUpvaW5SZXEpOworCQkJc2Vzc2lvbi0+cExpbU1sbUpvaW5SZXEgPSBOVUxMOworCQl9CisJCS8qIFRvIHJlbW92ZSB0aGUgcHJlYXV0aCBub2RlIGluIGNhc2Ugb2YgZmFpbCB0byBhc3NvY2lhdGUgKi8KKwkJaWYgKGxpbV9zZWFyY2hfcHJlX2F1dGhfbGlzdChtYWNfY3R4LCBzZXNzaW9uLT5ic3NJZCkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgiIGRlbGV0ZSBwcmUgYXV0aCBub2RlIGZvciAiTUFDX0FERFJFU1NfU1RSKSwKKwkJCQlNQUNfQUREUl9BUlJBWShzZXNzaW9uLT5ic3NJZCkpOworCQkJbGltX2RlbGV0ZV9wcmVfYXV0aF9ub2RlKG1hY19jdHgsCisJCQkJCQkgc2Vzc2lvbi0+YnNzSWQpOworCQl9CisKKwkJbWxtX2Fzc29jX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfQVNTT0NfVElNRU9VVF9SRVNVTFRfQ09ERTsKKwkJbWxtX2Fzc29jX2NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKwkJLyogVXBkYXRlIFBFIHNlc3Npb24gSWQgKi8KKwkJbWxtX2Fzc29jX2NuZi5zZXNzaW9uSWQgPSBzZXNzaW9uLT5wZVNlc3Npb25JZDsKKwkJaWYgKG1zZ190eXBlID09IExJTV9BU1NPQykgeworCQkJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9BU1NPQ19DTkYsCisJCQkJCSAgICAgKHVpbnQzMl90ICopICZtbG1fYXNzb2NfY25mKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBXaWxsIGNvbWUgaGVyZSBvbmx5IGluIGNhc2Ugb2YgMTFyLCBFc2UgRlQKKwkJCSAqIHdoZW4gcmVhc3NvYyByc3AgaXMgbm90IHJlY2VpdmVkIGFuZCB3ZQorCQkJICogcmVjZWl2ZSBhIHJlYXNzb2MgLSB0aW1lc291dAorCQkJICovCisJCQltbG1fYXNzb2NfY25mLnJlc3VsdENvZGUgPQorCQkJCWVTSVJfU01FX0ZUX1JFQVNTT0NfVElNRU9VVF9GQUlMVVJFOworCQkJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9SRUFTU09DX0NORiwKKwkJCQkJICAgICAodWludDMyX3QgKikgJm1sbV9hc3NvY19jbmYpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUmVzdG9yZSBwcmUtcmVhc3NvYyByZXEgc3RhdGUuCisJCSAqIFNldCBCU1NJRCB0byBjdXJyZW50bHkgYXNzb2NpYXRlZCBBUCBhZGRyZXNzLgorCQkgKi8KKwkJc2Vzc2lvbi0+bGltTWxtU3RhdGUgPSBzZXNzaW9uLT5saW1QcmV2TWxtU3RhdGU7CisJCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisJCQkJIHNlc3Npb24tPnBlU2Vzc2lvbklkLCBzZXNzaW9uLT5saW1NbG1TdGF0ZSkpOworCQlsaW1fcmVzdG9yZV9wcmVfcmVhc3NvY19zdGF0ZShtYWNfY3R4LAorCQkJCWVTSVJfU01FX1JFQVNTT0NfVElNRU9VVF9SRVNVTFRfQ09ERSwKKwkJCQllU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsIHNlc3Npb24pOworCX0KK30KKworLyoqCisgKiBsaW1fY29tcGxldGVfbWxtX3NjYW4oKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgTUxNX1NDQU5fQ05GCisgKiBtZXNzYWdlIHRvIFNNRSBzdGF0ZSBtYWNoaW5lLgorICoKKyAqIEBtYWNfY3R4OiAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXRfY29kZTogICAgIFJlc3VsdCBjb2RlIHRvIGJlIHNlbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIE1MTV9TQ0FOX0NORiBtZXNzYWdlIHRvIFNNRSBzdGF0ZSBtYWNoaW5lLgorICoKKyAqIEBSZXR1cm46IE5vbmUKKyAqLworCit2b2lkIGxpbV9jb21wbGV0ZV9tbG1fc2Nhbih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U2lyUmVzdWx0Q29kZXMgcmV0X2NvZGUpCit7CisJdExpbU1sbVNjYW5DbmYgbWxtX3NjYW5fY25mOworCisJLyogUmVzdG9yZSBwcmV2aW91cyBNTE0gc3RhdGUgKi8KKwltYWNfY3R4LT5saW0uZ0xpbU1sbVN0YXRlID0gbWFjX2N0eC0+bGltLmdMaW1QcmV2TWxtU3RhdGU7CisJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX01MTV9TVEFURSwgTk9fU0VTU0lPTiwKKwkJCSBtYWNfY3R4LT5saW0uZ0xpbU1sbVN0YXRlKSk7CisJbGltX3Jlc3RvcmVfcHJlX3NjYW5fc3RhdGUobWFjX2N0eCk7CisJLyogRnJlZSB1cCBtYWNfY3R4LT5saW0uZ0xpbU1sbVNjYW5SZXEgKi8KKwlpZiAoTlVMTCAhPSBtYWNfY3R4LT5saW0uZ3BMaW1NbG1TY2FuUmVxKSB7CisJCWNkZl9tZW1fZnJlZShtYWNfY3R4LT5saW0uZ3BMaW1NbG1TY2FuUmVxKTsKKwkJbWFjX2N0eC0+bGltLmdwTGltTWxtU2NhblJlcSA9IE5VTEw7CisJfQorCisJbWxtX3NjYW5fY25mLnJlc3VsdENvZGUgPSByZXRfY29kZTsKKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX1NDQU5fQ05GLAorCQkJICAgICAodWludDMyX3QgKikgJm1sbV9zY2FuX2NuZik7Cit9CisKKy8qKgorICogbGltX3NldF9jaGFubmVsKCkgLSBzZXQgY2hhbm5lbCBhcGkgZm9yIGxpbQorICoKKyAqIEBtYWNfY3R4OiAgICAgICAgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAY2hhbm5lbDogICAgICAgICAgICAgICAgcG93ZXIgc2F2ZSBzdGF0ZQorICogQGNoX2NlbnRlcl9mcmVxX3NlZzA6ICAgIGNlbnRlciBmcmVxIHNlcSAwCisgKiBAY2hfY2VudGVyX2ZyZXFfc2VnMTogICAgY2VudGVyIGZyZXEgc2VxIDEKKyAqIEBjaF93aWR0aDogICAgICAgICAgICAgICBjaGFubmVsIHdpZHRoCisgKiBAbWF4X3R4X3Bvd2VyOiAgICAgICAgICAgbWF4IHR4IHBvd2VyCisgKiBAcGVfc2Vzc2lvbl9pZDogICAgICAgICAgcGUgc2Vzc2lvbiBpZAorICoKKyAqIHNldCBjaGFubmVsIGFwaSBmb3IgbGltCisgKgorICogQFJldHVybjogTm9uZQorICovCit2b2lkIGxpbV9zZXRfY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50OF90IGNoYW5uZWwsCisJCSAgICAgdWludDhfdCBjaF9jZW50ZXJfZnJlcV9zZWcwLCB1aW50OF90IGNoX2NlbnRlcl9mcmVxX3NlZzEsCisJCSAgICAgcGh5X2NoX3dpZHRoIGNoX3dpZHRoLCB0UG93ZXJkQm0gbWF4X3R4X3Bvd2VyLAorCQkgICAgIHVpbnQ4X3QgcGVfc2Vzc2lvbl9pZCkKK3sKKyNpZiAhZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJdWludDMyX3QgbG9jYWxQd3JDb25zdHJhaW50OworI2VuZGlmCisJdHBQRVNlc3Npb24gcGVfc2Vzc2lvbjsKKwlwZV9zZXNzaW9uID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQobWFjX2N0eCwgcGVfc2Vzc2lvbl9pZCk7CisKKwlpZiAoTlVMTCA9PSBwZV9zZXNzaW9uKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoIkludmFsaWQgUEUgc2Vzc2lvbiA9ICVkIiksCisJCQlwZV9zZXNzaW9uX2lkKTsKKwkJcmV0dXJuOworCX0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlsaW1fc2VuZF9zd2l0Y2hfY2hubF9wYXJhbXMobWFjX2N0eCwgY2hhbm5lbCwgY2hfY2VudGVyX2ZyZXFfc2VnMCwKKwkJCQkgICAgY2hfY2VudGVyX2ZyZXFfc2VnMSwgY2hfd2lkdGgsCisJCQkJICAgIG1heF90eF9wb3dlciwgcGVfc2Vzc2lvbl9pZCwgZmFsc2UpOworI2Vsc2UKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlQsCisJCQkgICAgJmxvY2FsUHdyQ29uc3RyYWludCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJjb3VsZG4ndCByZWFkIENGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5UIikpOworCQlyZXR1cm47CisJfQorCS8qIFNlbmQgV01BX0NITkxfU1dJVENIX0lORCB0byBIQUwgKi8KKwlsaW1fc2VuZF9zd2l0Y2hfY2hubF9wYXJhbXMobWFjX2N0eCwgY2hhbm5lbCwgY2hfY2VudGVyX2ZyZXFfc2VnMCwKKwkJCQkgICAgY2hfY2VudGVyX2ZyZXFfc2VnMSwgY2hfd2lkdGgsCisJCQkJICAgICh0UG93ZXJkQm0pIGxvY2FsUHdyQ29uc3RyYWludCwKKwkJCQkgICAgcGVfc2Vzc2lvbl9pZCwgZmFsc2UpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX21sbV9yc3BfbWVzc2FnZXMuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfbWxtX3JzcF9tZXNzYWdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NTBhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX21sbV9yc3BfbWVzc2FnZXMuYwpAQCAtMCwwICsxLDQyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJzaXJfYXBpLmgiCisjaW5jbHVkZSAic2NoX2FwaS5oIgorI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9hc3NvY191dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZWN1cml0eV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZXJfZGVzX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3RpbWVyX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlbmRfbWVzc2FnZXMuaCIKKyNpbmNsdWRlICJsaW1fYWRtaXRfY29udHJvbC5oIgorI2luY2x1ZGUgImxpbV9zZW5kX21lc3NhZ2VzLmgiCisjaW5jbHVkZSAibGltX2lic3NfcGVlcl9tZ210LmgiCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlICJsaW1fZnQuaCIKKyNpbmNsdWRlICJsaW1fZnRfZGVmcy5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltX3Nlc3Npb24uaCIKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbl91dGlscy5oIgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybV9hcGkuaCIKKyNlbmRpZgorI2luY2x1ZGUgIndtYV90eXBlcy5oIgorI2luY2x1ZGUgImNkc191dGlscy5oIgorI2luY2x1ZGUgImxpbV90eXBlcy5oIgorCisjZGVmaW5lIE1BWF9TVVBQT1JURURfUEVFUlNfV0VQIDE2CisKK3N0YXRpYyB2b2lkIGxpbV9oYW5kbGVfc21lX2pvaW5fcmVzdWx0KHRwQW5pU2lyR2xvYmFsLCB0U2lyUmVzdWx0Q29kZXMsIHVpbnQxNl90LAorCQkJCSAgICAgICB0cFBFU2Vzc2lvbik7CitzdGF0aWMgdm9pZCBsaW1faGFuZGxlX3NtZV9yZWFhc29jX3Jlc3VsdCh0cEFuaVNpckdsb2JhbCwgdFNpclJlc3VsdENvZGVzLCB1aW50MTZfdCwKKwkJCQkJICB0cFBFU2Vzc2lvbik7CisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX29lbV9kYXRhX3JlcV9jbmYodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90ICopOworI2VuZGlmCit2b2lkIGxpbV9wcm9jZXNzX21sbV9qb2luX2NuZih0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7Cit2b2lkIGxpbV9wcm9jZXNzX21sbV9hdXRoX2NuZih0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7Cit2b2lkIGxpbV9wcm9jZXNzX21sbV9zdGFydF9jbmYodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90ICopOwordm9pZCBsaW1fcHJvY2Vzc19tbG1fYXNzb2NfaW5kKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCAqKTsKK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2Fzc29jX2NuZih0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7Cit2b2lkIGxpbV9wcm9jZXNzX21sbV9yZWFzc29jX2NuZih0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7Cit2b2lkIGxpbV9wcm9jZXNzX21sbV9yZWFzc29jX2luZCh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7Cit2b2lkIGxpbV9wcm9jZXNzX21sbV9zZXRfa2V5c19jbmYodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90ICopOwordm9pZCBsaW1fcHJvY2Vzc19tbG1fZGlzYXNzb2NfaW5kKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCAqKTsKK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2Rpc2Fzc29jX2NuZih0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7Cit2b2lkIGxpbV9wcm9jZXNzX21sbV9kZWF1dGhfaW5kKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCAqKTsKK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2RlYXV0aF9jbmYodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90ICopOwordm9pZCBsaW1fcHJvY2Vzc19tbG1fcHVyZ2Vfc3RhX2luZCh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7CitzdGF0aWMgdm9pZCBsaW1faGFuZGxlX2RlbF9ic3NfaW5fcmVfYXNzb2NfY29udGV4dCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMsCisJCQkJCQkgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltX2dldF9zZXNzaW9uX2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqLCB1aW50OF90ICosIHVpbnQxNl90ICopOworc3RhdGljIHZvaWQKK2xpbV9wcm9jZXNzX2J0YW1wX2FkZF9ic3NfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRLAorCQkJICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9yc3BfbWVzc2FnZXMoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyB2YXJpb3VzIE1MTSByZXNwb25zZSAoQ05GL0lORAorICogbWVzc2FnZXMgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgbXNnVHlwZSAgIEluZGljYXRlcyB0aGUgTUxNIG1lc3NhZ2UgdHlwZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltX3Byb2Nlc3NfbWxtX3JzcF9tZXNzYWdlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBtc2dUeXBlLAorCQkJICAgICB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKworCWlmIChwTXNnQnVmID09IE5VTEwpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMIikpOykKKwkJcmV0dXJuOworCX0KKwlNVFJBQ0UobWFjX3RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVFhfTElNX01TRywgMCwgbXNnVHlwZSkpOworCXN3aXRjaCAobXNnVHlwZSkgeworCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisJY2FzZSBMSU1fTUxNX09FTV9EQVRBX0NORjoKKwkJbGltX3Byb2Nlc3NfbWxtX29lbV9kYXRhX3JlcV9jbmYocE1hYywgcE1zZ0J1Zik7CisJCXBNc2dCdWYgPSBOVUxMOworCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBMSU1fTUxNX0FVVEhfQ05GOgorCQlsaW1fcHJvY2Vzc19tbG1fYXV0aF9jbmYocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCWNhc2UgTElNX01MTV9BU1NPQ19DTkY6CisJCWxpbV9wcm9jZXNzX21sbV9hc3NvY19jbmYocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCWNhc2UgTElNX01MTV9TVEFSVF9DTkY6CisJCWxpbV9wcm9jZXNzX21sbV9zdGFydF9jbmYocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCWNhc2UgTElNX01MTV9KT0lOX0NORjoKKwkJbGltX3Byb2Nlc3NfbWxtX2pvaW5fY25mKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKwljYXNlIExJTV9NTE1fQVNTT0NfSU5EOgorCQlsaW1fcHJvY2Vzc19tbG1fYXNzb2NfaW5kKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKwljYXNlIExJTV9NTE1fUkVBU1NPQ19DTkY6CisJCWxpbV9wcm9jZXNzX21sbV9yZWFzc29jX2NuZihwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMSU1fTUxNX0RJU0FTU09DX0NORjoKKwkJbGltX3Byb2Nlc3NfbWxtX2Rpc2Fzc29jX2NuZihwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMSU1fTUxNX0RJU0FTU09DX0lORDoKKwkJbGltX3Byb2Nlc3NfbWxtX2Rpc2Fzc29jX2luZChwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMSU1fTUxNX1BVUkdFX1NUQV9JTkQ6CisJCWxpbV9wcm9jZXNzX21sbV9wdXJnZV9zdGFfaW5kKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKwljYXNlIExJTV9NTE1fREVBVVRIX0NORjoKKwkJbGltX3Byb2Nlc3NfbWxtX2RlYXV0aF9jbmYocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCWNhc2UgTElNX01MTV9ERUFVVEhfSU5EOgorCQlsaW1fcHJvY2Vzc19tbG1fZGVhdXRoX2luZChwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMSU1fTUxNX1NFVEtFWVNfQ05GOgorCQlsaW1fcHJvY2Vzc19tbG1fc2V0X2tleXNfY25mKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKwljYXNlIExJTV9NTE1fVFNQRUNfQ05GOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9IC8qIHN3aXRjaCAobXNnVHlwZSkgKi8KKwlyZXR1cm47Cit9IC8qKiogZW5kIGxpbV9wcm9jZXNzX21sbV9yc3BfbWVzc2FnZXMoKSAqKiovCisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKworLyoqCisgKiBsaW1fcHJvY2Vzc19tbG1fb2VtX2RhdGFfcmVxX2NuZigpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIExJTV9NTE1fT0VNX0RBVEFfUkVRX0NORgorICogbWVzc2FnZSBmcm9tIE1MTSBTdGF0ZSBtYWNoaW5lLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2dCdWYgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbV9wcm9jZXNzX21sbV9vZW1fZGF0YV9yZXFfY25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmKQoreworCXRMaW1NbG1PZW1EYXRhUnNwICptZWFzUnNwOworCisJdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCisJbWVhc1JzcCA9ICh0TGltTWxtT2VtRGF0YVJzcCAqKSAocE1zZ0J1Zik7CisKKwkvKiBOb3cgc2VuZCB0aGUgbWVhcyBjb25maXJtIG1lc3NhZ2UgdG8gdGhlIHNtZSAqLworCWxpbV9zZW5kX3NtZV9vZW1fZGF0YV9yc3AocE1hYywgKHVpbnQzMl90ICopIG1lYXNSc3AsIHJlc3VsdENvZGUpOworCisJLyogRG9udCBmcmVlIHRoZSBtZW1vcnkgaGVyZS4gSXQgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGVlICovCisKKwlyZXR1cm47Cit9CisjZW5kaWYKKworLyoqCisgKiBsaW1fcHJvY2Vzc19tbG1fc3RhcnRfY25mKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzZXMgTUxNX1NUQVJUX0NORgorICogbWVzc2FnZSBmcm9tIE1MTSBTdGF0ZSBtYWNoaW5lLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2dCdWYgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBsaW1fcHJvY2Vzc19tbG1fc3RhcnRfY25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmKQoreworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSBOVUxMOworCXRMaW1NbG1TdGFydENuZiAqcExpbU1sbVN0YXJ0Q25mOworCXVpbnQ4X3Qgc21lc2Vzc2lvbklkOworCXVpbnQxNl90IHNtZXRyYW5zYWN0aW9uSWQ7CisJdWludDhfdCBjaGFubmVsSWQ7CisKKwlpZiAocE1zZ0J1ZiA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTspCisJCXJldHVybjsKKwl9CisJcExpbU1sbVN0YXJ0Q25mID0gKHRMaW1NbG1TdGFydENuZiAqKSBwTXNnQnVmOworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChwTWFjLAorCQkJCXBMaW1NbG1TdGFydENuZi0+c2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKAorCQkJIlNlc3Npb24gZG9lcyBOb3QgZXhpc3Qgd2l0aCBnaXZlbiBzZXNzaW9uSWQgIikpOykKKwkJcmV0dXJuOworCX0KKwlzbWVzZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisJc21ldHJhbnNhY3Rpb25JZCA9IHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQ7CisKKwlpZiAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfU1RBUlRfQlNTX1NUQVRFKSB7CisJCS8qCisJCSAqIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBTdGFydCBjb25maXJtIGZyb20gTUxNCisJCSAqIGluIG90aGVyIHN0YXRlcy4gTG9nIGVycm9yLgorCQkgKi8KKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwKKwkJCSgicmVjZWl2ZWQgdW5leHBlY3RlZCBNTE1fU1RBUlRfQ05GIGluIHN0YXRlICVYIiksCisJCQkJCXBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTspCisJCXJldHVybjsKKwl9CisJaWYgKCgodExpbU1sbVN0YXJ0Q25mICopIHBNc2dCdWYpLT5yZXN1bHRDb2RlID09IGVTSVJfU01FX1NVQ0NFU1MpIHsKKworCQkvKgorCQkgKiBVcGRhdGUgZ2xvYmFsIFNNRSBzdGF0ZSBzbyB0aGF0IEJlYWNvbiBHZW5lcmF0aW9uCisJCSAqIG1vZHVsZSBzdGFydHMgd3JpdGluZyBCZWFjb24gZnJhbWVzIGludG8gVEZQJ3MKKwkJICogQmVhY29uIGZpbGUgcmVnaXN0ZXIuCisJCSAqLworCQlwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX05PUk1BTF9TVEFURTsKKwkJTVRSQUNFKG1hY190cmFjZQorCQkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpKTsKKwkJaWYgKHBzZXNzaW9uRW50cnktPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9TVEFfTU9ERSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMKCIqKiogU3RhcnRlZCBCU1MgaW4gQlRfQU1QIFNUQSBTSURFKioqIikpOworCQl9IGVsc2UgaWYgKHBzZXNzaW9uRW50cnktPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9BUF9NT0RFKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJRkwoIioqKiBTdGFydGVkIEJTUyBpbiBCVF9BTVAgQVAgU0lERSoqKiIpKTsKKwkJfSBlbHNlIGlmIChwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlID09IGVTSVJfSU5GUkFfQVBfTU9ERSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMKCIqKiogU3RhcnRlZCBCU1MgaW4gSU5GUkEgQVAgU0lERSoqKiIpKTsKKwkJfSBlbHNlCisJCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiKioqIFN0YXJ0ZWQgQlNTICoqKiIpKTspCisJfSBlbHNlIHsKKwkJLyogU3RhcnQgQlNTIGlzIGEgZmFpbHVyZSAqLworCQlwZV9kZWxldGVfc2Vzc2lvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJcHNlc3Npb25FbnRyeSA9IE5VTEw7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJTdGFydCBCU1MgRmFpbGVkICIpKTspCisJfQorCS8qIFNlbmQgcmVzcG9uc2UgdG8gSG9zdCAqLworCWxpbV9zZW5kX3NtZV9zdGFydF9ic3NfcnNwKHBNYWMsIGVXTklfU01FX1NUQVJUX0JTU19SU1AsCisJCQkJKCh0TGltTWxtU3RhcnRDbmYgKilwTXNnQnVmKS0+cmVzdWx0Q29kZSwKKwkJCQlwc2Vzc2lvbkVudHJ5LCBzbWVzZXNzaW9uSWQsIHNtZXRyYW5zYWN0aW9uSWQpOworCWlmICgocHNlc3Npb25FbnRyeSAhPSBOVUxMKSAmJgorCQkoKCh0TGltTWxtU3RhcnRDbmYgKikgcE1zZ0J1ZiktPnJlc3VsdENvZGUgPT0KKwkJCQkJCWVTSVJfU01FX1NVQ0NFU1MpKSB7CisJCWNoYW5uZWxJZCA9IHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+Y2hhbm5lbElkOworCisJCS8qIFdlIHNob3VsZCBzdGFydCBiZWFjb24gdHJhbnNtaXNzaW9uIG9ubHkgaWYgdGhlIGNoYW5uZWwKKwkJICogb24gd2hpY2ggd2UgYXJlIG9wZXJhdGluZyBpcyBub24tREZTIHVudGlsIHRoZSBjaGFubmVsCisJCSAqIGF2YWlsYWJpbGl0eSBjaGVjayBpcyBkb25lLiBUaGUgUEUgd2lsbCByZWNlaXZlIGFuIGV4cGxpY2l0CisJCSAqIHJlcXVlc3QgZnJvbSB1cHBlciBsYXllcnMgdG8gc3RhcnQgdGhlIGJlYWNvbiB0cmFuc21pc3Npb24KKwkJICovCisKKwkJaWYgKExJTV9JU19JQlNTX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkJCShMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSAmJgorCQkJKGNkc19nZXRfY2hhbm5lbF9zdGF0ZShjaGFubmVsSWQpICE9CisJCQkgQ0hBTk5FTF9TVEFURV9ERlMpKSkgeworCQkJLyogQ29uZmlndXJlIGJlYWNvbiBhbmQgc2VuZCBiZWFjb25zIHRvIEhBTCAqLworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQlGTCgiU3RhcnQgQmVhY29uIHdpdGggc3NpZCAlcyBDaCAlZCIpLAorCQkJCQlwc2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWQsCisJCQkJCXBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCk7CisJCQlsaW1fc2VuZF9iZWFjb25faW5kKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCQl9CisJfQorfQorCisvKioqIGVuZCBsaW1fcHJvY2Vzc19tbG1fc3RhcnRfY25mKCkgKioqLworCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9qb2luX2NuZigpIC0gUHJvY2Vzc2VzIGpvaW4gY29uZmlybWF0aW9uCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1zZzogQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIEZ1bmN0aW9uIGhhbmRsZXMgdGhlIGpvaW4gY29uZmlybWF0aW9uIG1lc3NhZ2UKKyAqIExJTV9NTE1fSk9JTl9DTkYuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2pvaW5fY25mKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdWludDMyX3QgKm1zZykKK3sKKwl0U2lyUmVzdWx0Q29kZXMgcmVzdWx0X2NvZGU7CisJdExpbU1sbUpvaW5DbmYgKmpvaW5fY25mOworCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnk7CisKKwlqb2luX2NuZiA9ICh0TGltTWxtSm9pbkNuZiAqKSBtc2c7CisJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKG1hY19jdHgsCisJCWpvaW5fY25mLT5zZXNzaW9uSWQpOworCWlmIChzZXNzaW9uX2VudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiU2Vzc2lvbklkOiVkIGRvZXMgbm90IGV4aXN0IiksCisJCQlqb2luX2NuZi0+c2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9XVF9KT0lOX1NUQVRFKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIE1MTV9KT0lOX0NORiBpbiBzdGF0ZSAlWCIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpOworCQlyZXR1cm47CisJfQorCisJcmVzdWx0X2NvZGUgPSAoKHRMaW1NbG1Kb2luQ25mICopIG1zZyktPnJlc3VsdENvZGU7CisJLyogUHJvY2VzcyBKb2luIGNvbmZpcm0gZnJvbSBNTE0gKi8KKwlpZiAocmVzdWx0X2NvZGUgPT0gZVNJUl9TTUVfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCIqKipTZXNzaW9uSWQ6JWQgSm9pbmVkIEVTUyAqKioiKSwKKwkJCWpvaW5fY25mLT5zZXNzaW9uSWQpOworCQkvKiBTZXR1cCBoYXJkd2FyZSB1cGZyb250ICovCisJCWlmIChsaW1fc3RhX3NlbmRfYWRkX2Jzc19wcmVfYXNzb2MobWFjX2N0eCwgZmFsc2UsCisJCQlzZXNzaW9uX2VudHJ5KSA9PSBlU0lSX1NVQ0NFU1MpCisJCQlyZXR1cm47CisJCWVsc2UKKwkJCXJlc3VsdF9jb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKwl9CisKKwkvKiAgSm9pbiBmYWlsdXJlICovCisJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEU7CisJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX1NNRV9TVEFURSwKKwkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCXNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlKSk7CisJLyogU2VuZCBKb2luIHJlc3BvbnNlIHRvIEhvc3QgKi8KKwlsaW1faGFuZGxlX3NtZV9qb2luX3Jlc3VsdChtYWNfY3R4LCByZXN1bHRfY29kZSwKKwkJKCh0TGltTWxtSm9pbkNuZiAqKSBtc2cpLT5wcm90U3RhdHVzQ29kZSwgc2Vzc2lvbl9lbnRyeSk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGxpbV9zZW5kX21sbV9hc3NvY19yZXEoKSAtIEFzc29jaWF0aW9uIHJlcXVlc3Qgd2lsbCBiZSBwcm9jZXNzZWQKKyAqIG1hY19jdHg6ICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBzZXNzaW9uX2VudHJ5OiAgUG9pbnRlciB0byBzZXNzaW9uIGV0bnJ5CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzZW5kcyBBU1NPQyByZXF1ZXN0IE1MTSBtZXNzYWdlIHRvIE1MTSBTdGF0ZSBtYWNoaW5lLgorICogQVNTT0MgcmVxdWVzdCBwYWNrZXQgd291bGQgYmUgYnkgcGlja2luZyBwYXJhbWV0ZXJzIGZyb20gcHNlc3Npb25FbnRyeQorICogYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiBNTE0gc3RhdGUgbWFjaGluZS4KKyAqIEFTU1VNUFRJT05TOgorICogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gbWlkZGxlIG9mIGNvbm5lY3Rpb24gc3RhdGUgbWFjaGluZSBhbmQgaXMKKyAqIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBhZnRlciBhdXRoIGNuZiBoYXMgYmVlbiByZWNlaXZlZCBvciBhZnRlciBBU1NPQyByc3AKKyAqIHdpdGggVFJZX0FHQUlOX0xBVEVSIHdhcyByZWNlaXZlZCBhbmQgcmVxdWlyZWQgdGltZSBoYXMgZWxhcHNlZCBhZnRlciB0aGF0LgorICoKKyAqIFJldHVybjogTm9uZQorICovCisKK3ZvaWQgbGltX3NlbmRfbWxtX2Fzc29jX3JlcSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJdExpbU1sbUFzc29jUmVxICphc3NvY19yZXE7CisJdWludDMyX3QgdmFsOworCXVpbnQxNl90IGNhcHM7CisJdWludDMyX3QgdGVsZV9iY24gPSAwOworCXRwU2lyTWFjQ2FwYWJpbGl0eUluZm8gY2FwX2luZm87CisKKwkvKiBTdWNjZXNzZnVsIE1BQyBiYXNlZCBhdXRoZW50aWNhdGlvbi4gVHJpZ2dlciBBc3NvY2lhdGlvbiB3aXRoIEJTUyAqLworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlNlc3Npb25JZDolZCBBdXRoZW50aWNhdGVkIHdpdGggQlNTIiksCisJCXNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkKTsKKworCWlmIChOVUxMID09IHNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkpvaW4gUmVxdWVzdCBpcyBOVUxMLiIpKTsKKwkJLyogTm8gbmVlZCB0byBBc3NlcnQuIEpPSU4gdGltZW91dCB3aWxsIGhhbmRsZSB0aGlzIGVycm9yICovCisJCXJldHVybjsKKwl9CisKKwlhc3NvY19yZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodExpbU1sbUFzc29jUmVxKSk7CisJaWYgKE5VTEwgPT0gYXNzb2NfcmVxKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJjYWxsIHRvIEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgbWxtQXNzb2NSZXEiKSk7CisJCXJldHVybjsKKwl9CisJdmFsID0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKwlzaXJfY29weV9tYWNfYWRkcihhc3NvY19yZXEtPnBlZXJNYWNBZGRyLCBzZXNzaW9uX2VudHJ5LT5ic3NJZCk7CisJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VULAorCQkodWludDMyX3QgKikgJmFzc29jX3JlcS0+YXNzb2NGYWlsdXJlVGltZW91dCkKKwkJIT0gZVNJUl9TVUNDRVNTKSB7CisJCS8qIENvdWxkIG5vdCBnZXQgQXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZSBmcm9tIENGRy4qLworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIEFzc29jRmFpbHVyZVRpbWVvdXQgdmFsdWUiKSk7CisJfQorCisJaWYgKGNmZ19nZXRfY2FwYWJpbGl0eV9pbmZvKG1hY19jdHgsICZjYXBzLCBzZXNzaW9uX2VudHJ5KQorCQkJIT0gZVNJUl9TVUNDRVNTKQorCQkvKiBDb3VsZCBub3QgZ2V0IENhcGFiaWxpdGllcyB2YWx1ZSBmcm9tIENGRy4qLworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIENhcGFiaWxpdGllcyB2YWx1ZSIpKTsKKworCS8qIENsZWFyIHNwZWN0cnVtIG1hbmFnZW1lbnQgYml0IGlmIEFQIGRvZXNuJ3Qgc3VwcG9ydCBpdCAqLworCWlmICghKHNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5jYXBhYmlsaXR5SW5mbyAmCisJCUxJTV9TUEVDVFJVTV9NQU5BR0VNRU5UX0JJVF9NQVNLKSkKKwkJLyoKKwkJICogQVAgZG9lc24ndCBzdXBwb3J0IHNwZWN0cnVtIG1hbmFnZW1lbnQKKwkJICogY2xlYXIgc3BlY3RydW0gbWFuYWdlbWVudCBiaXQKKwkJICovCisJCWNhcHMgJj0gKH5MSU1fU1BFQ1RSVU1fTUFOQUdFTUVOVF9CSVRfTUFTSyk7CisKKwkvKiBDbGVhciBycm0gYml0IGlmIEFQIGRvZXNuJ3Qgc3VwcG9ydCBpdCAqLworCWlmICghKHNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5jYXBhYmlsaXR5SW5mbworCQkmIExJTV9SUk1fQklUX01BU0spKQorCQljYXBzICY9ICh+TElNX1JSTV9CSVRfTUFTSyk7CisKKwkvKiBDbGVhciBzaG9ydCBwcmVhbWJsZSBiaXQgaWYgQVAgZG9lcyBub3Qgc3VwcG9ydCBpdCAqLworCWlmICghKHNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5jYXBhYmlsaXR5SW5mbyAmCisJCShMSU1fU0hPUlRfUFJFQU1CTEVfQklUX01BU0spKSkgeworCQljYXBzICY9ICh+TElNX1NIT1JUX1BSRUFNQkxFX0JJVF9NQVNLKTsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIkNsZWFyaW5nIHNob3J0IHByZWFtYmxlOm5vIEFQIHN1cHBvcnQiKSk7CisJfQorCisJLyogQ2xlYXIgaW1tZWRpYXRlIGJsb2NrIGFjayBiaXQgaWYgQVAgZG9lcyBub3Qgc3VwcG9ydCBpdCAqLworCWlmICghKHNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5jYXBhYmlsaXR5SW5mbyAmCisJCShMSU1fSU1NRURJQVRFX0JMT0NLX0FDS19NQVNLKSkpIHsKKwkJY2FwcyAmPSAofkxJTV9JTU1FRElBVEVfQkxPQ0tfQUNLX01BU0spOworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiQ2xlYXJpbmcgSW1tZWQgQmxrIEFjazpubyBBUCBzdXBwb3J0IikpOworCX0KKworCWFzc29jX3JlcS0+Y2FwYWJpbGl0eUluZm8gPSBjYXBzOworCWNhcF9pbmZvID0gKCh0cFNpck1hY0NhcGFiaWxpdHlJbmZvKSAmYXNzb2NfcmVxLT5jYXBhYmlsaXR5SW5mbyk7CisJbGltX2xvZyhtYWNfY3R4LCBMT0czLCBGTCgiQ2FwYWJpbGl0aWVzIHRvIGJlIHVzZWQgaW4gQXNzb2NSZXE9MHglWCwiCisJCSJwcml2YWN5IGJpdD0leCBzaG9ydFNsb3RUaW1lICV4IiksIGNhcHMsCisJCWNhcF9pbmZvLT5wcml2YWN5LAorCQljYXBfaW5mby0+c2hvcnRTbG90VGltZSk7CisKKwkvKgorCSAqIElmIHRlbGVzY29waWMgYmVhY29uaW5nIGlzIGVuYWJsZWQsIHNldCBsaXN0ZW4gaW50ZXJ2YWwgdG8KKwkgKiBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSQorCSAqLworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOLCAmdGVsZV9iY24pCisJCSE9IGVTSVJfU1VDQ0VTUykKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJRkwoIkNvdWxkbid0IGdldCBXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTiIpKTsKKworCXZhbCA9IFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMX1NUQURFRjsKKwlpZiAodGVsZV9iY24pIHsKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19URUxFX0JDTl9NQVhfTEksICZ2YWwpICE9CisJCQllU0lSX1NVQ0NFU1MpCisJCQkvKgorCQkJICogQ291bGQgbm90IGdldCBMaXN0ZW5JbnRlcnZhbCB2YWx1ZQorCQkJICogZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJCSAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgTGlzdGVuSW50ZXJ2YWwiKSk7CisJfSBlbHNlIHsKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19MSVNURU5fSU5URVJWQUwsCisJCQkgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorCQkJLyoKKwkJCSAqIENvdWxkIG5vdCBnZXQgTGlzdGVuSW50ZXJ2YWwgdmFsdWUKKwkJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIExpc3RlbkludGVydmFsIikpOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KG1hY19jdHgsIFdMQU5fUEVfRElBR19BU1NPQ19SRVFfRVZFTlQsCisJCXNlc3Npb25fZW50cnksIGVTSVJfU1VDQ0VTUywgZVNJUl9TVUNDRVNTKTsKKyNlbmRpZgorCWFzc29jX3JlcS0+bGlzdGVuSW50ZXJ2YWwgPSAodWludDE2X3QpIHZhbDsKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJRCAqLworCWFzc29jX3JlcS0+c2Vzc2lvbklkID0gc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQ7CisJc2Vzc2lvbl9lbnRyeS0+bGltUHJldlNtZVN0YXRlID0gc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGU7CisJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9BU1NPQ19TVEFURTsKKwlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfU01FX1NUQVRFLAorCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwgc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpKTsKKwlsaW1fcG9zdF9tbG1fbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX0FTU09DX1JFUSwKKwkJKHVpbnQzMl90ICopIGFzc29jX3JlcSk7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisvKioKKyAqIGxpbV9wbWZfY29tZWJhY2tfdGltZXJfY2FsbGJhY2soKSAtUE1GIGNhbGxiYWNrIGhhbmRsZXIKKyAqIEBjb250ZXh0OiBUaW1lciBjb250ZXh0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIHRoZSBQTUYgY29tZWJhY2sKKyAqIGNhbGxiYWNrCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgbGltX3BtZl9jb21lYmFja190aW1lcl9jYWxsYmFjayh2b2lkICpjb250ZXh0KQoreworCXRDb21lYmFja1RpbWVySW5mbyAqaW5mbyA9ICh0Q29tZWJhY2tUaW1lckluZm8gKikgY29udGV4dDsKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gaW5mby0+cE1hYzsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gJm1hY19jdHgtPmxpbS5ncFNlc3Npb25baW5mby0+c2Vzc2lvbklEXTsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJRkwoImNvbWViYWNrIGxhdGVyIHRpbWVyIGV4cGlyZWQuIHNlbmRpbmcgTUxNIEFTU09DIHJlcSIpKTsKKwkvKiBzZXQgTUxNIHN0YXRlIHN1Y2ggdGhhdCBBU1NPQyBSRVEgcGFja2V0IHdpbGwgYmUgc2VudCBvdXQgKi8KKwlwc2Vzc2lvbkVudHJ5LT5saW1QcmV2TWxtU3RhdGUgPSBpbmZvLT5saW1QcmV2TWxtU3RhdGU7CisJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBpbmZvLT5saW1NbG1TdGF0ZTsKKwlsaW1fc2VuZF9tbG1fYXNzb2NfcmVxKG1hY19jdHgsIHBzZXNzaW9uRW50cnkpOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMVcgKi8KKworLyoqCisgKiBsaW1fcHJvY2Vzc19tbG1fYXV0aF9jbmYoKS1Qcm9jZXNzIEF1dGggY29uZmlybWF0aW9uCisgKiBAbWFjX2N0eDogIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2c6IEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIE1MTV9BVVRIX0NORgorICogbWVzc2FnZSBmcm9tIE1MTSBTdGF0ZSBtYWNoaW5lLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGxpbV9wcm9jZXNzX21sbV9hdXRoX2NuZih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCAqbXNnKQoreworCXRBbmlBdXRoVHlwZSBhdXRoX3R5cGUsIGF1dGhfbW9kZTsKKwl0TGltTWxtQXV0aFJlcSAqYXV0aF9yZXE7CisJdExpbU1sbUF1dGhDbmYgKmF1dGhfY25mOworCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnk7CisKKwlpZiAobXNnID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisJYXV0aF9jbmYgPSAodExpbU1sbUF1dGhDbmYgKikgbXNnOworCXNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LAorCQkJYXV0aF9jbmYtPnNlc3Npb25JZCk7CisJaWYgKHNlc3Npb25fZW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJTZXNzaW9uSWQ6JWQgc2Vzc2lvbiBkb2Vzbid0IGV4aXN0IiksCisJCQlhdXRoX2NuZi0+c2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfQVVUSF9TVEFURSAmJgorCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9XVF9QUkVfQVVUSF9TVEFURSkgfHwKKwkJTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgfHwKKwkJTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCS8qKgorCQkgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgQVVUSCBjb25maXJtCisJCSAqIGZyb20gTUxNIGluIG90aGVyIHN0YXRlcyBvciBvbiBBUC4KKwkJICogTG9nIGVycm9yCisJCSAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiU2Vzc2lvbklkOiVkIHJlY2VpdmVkIE1MTV9BVVRIX0NORiBpbiBzdGF0ZSAlWCIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsIHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoKHRMaW1NbG1BdXRoQ25mICopIG1zZyktPnJlc3VsdENvZGUgPT0gZVNJUl9TTUVfU1VDQ0VTUykgeworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfV1RfQVVUSF9TVEFURSkgeworCQkJbGltX3NlbmRfbWxtX2Fzc29jX3JlcShtYWNfY3R4LCBzZXNzaW9uX2VudHJ5KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBTdWNjZXNzZnVsIFByZS1hdXRoZW50aWNhdGlvbi4gU2VuZAorCQkJICogUHJlLWF1dGggcmVzcG9uc2UgdG8gaG9zdAorCQkJICovCisJCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSA9CisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltUHJldlNtZVN0YXRlOworCQkJTVRSQUNFKG1hY190cmFjZQorCQkJCShtYWNfY3R4LCBUUkFDRV9DT0RFX1NNRV9TVEFURSwKKwkJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSkpOworCQl9CisJCS8qIFJldHVybiBmb3Igc3VjY2VzcyBjYXNlICovCisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBGYWlsdXJlIGNhc2UgaGFuZGxlOgorCSAqIFByb2Nlc3MgQVVUSCBjb25maXJtIGZyb20gTUxNCisJICovCisJaWYgKHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX1dUX0FVVEhfU1RBVEUpIHsKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFLAorCQkJKHVpbnQzMl90ICopICZhdXRoX3R5cGUpICE9ICBlU0lSX1NVQ0NFU1MpIHsKKwkJCS8qCisJCQkgKiBDb3VsZCBub3QgZ2V0IEF1dGhUeXBlIHZhbHVlIGZyb20gQ0ZHLgorCQkJICogTG9nIGVycm9yLgorCQkJICovCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJRkwoIkZhaWwgdG8gcmV0cmlldmUgQXV0aFR5cGUgdmFsdWUiKSk7CisJCX0KKwl9IGVsc2UgeworCQlhdXRoX3R5cGUgPSBtYWNfY3R4LT5saW0uZ0xpbVByZUF1dGhUeXBlOworCX0KKworCWlmICgoYXV0aF90eXBlID09IGVTSVJfQVVUT19TV0lUQ0gpICYmCisJCSgoKHRMaW1NbG1BdXRoQ25mICopIG1zZyktPmF1dGhUeXBlID09IGVTSVJfT1BFTl9TWVNURU0pCisJCSYmIChlU0lSX01BQ19BVVRIX0FMR09fTk9UX1NVUFBPUlRFRF9TVEFUVVMgPT0KKwkJKCh0TGltTWxtQXV0aENuZiAqKSBtc2cpLT5wcm90U3RhdHVzQ29kZSkpIHsKKwkJLyoKKwkJICogV2hlbiBPcGVuIGF1dGhlbnRpY2F0aW9uIGZhaWxzIHdpdGggcmVhc29uCisJCSAqIGNvZGUgIjEzIiBhbmQgYXV0aFR5cGUgc2V0IHRvICdhdXRvIHN3aXRjaCcsCisJCSAqIFRyeSB3aXRoIFNoYXJlZCBBdXRoZW50aWNhdGlvbgorCQkgKi8KKwkJYXV0aF9tb2RlID0gZVNJUl9TSEFSRURfS0VZOworCQkvKiBUcmlnZ2VyIE1BQyBiYXNlZCBBdXRoZW50aWNhdGlvbiAqLworCQlhdXRoX3JlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0TGltTWxtQXV0aFJlcSkpOworCQlpZiAoTlVMTCA9PSBhdXRoX3JlcSkgeworCQkJLyogTG9nIGVycm9yICovCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJRkwoIm1sbUF1dGhSZXEgOk1lbW9yeSBhbGxvYyBmYWlsZWQgIikpOworCQkJcmV0dXJuOworCQl9CisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIGF1dGhfcmVxLAorCQkJc2l6ZW9mKHRMaW1NbG1BdXRoUmVxKSwgMCk7CisJCWlmIChzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSA9PQorCQkJZUxJTV9TTUVfV1RfQVVUSF9TVEFURSkgeworCQkJc2lyX2NvcHlfbWFjX2FkZHIoYXV0aF9yZXEtPnBlZXJNYWNBZGRyLAorCQkJCXNlc3Npb25fZW50cnktPmJzc0lkKTsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSZhdXRoX3JlcS0+cGVlck1hY0FkZHIsCisJCQkodWludDhfdCAqKSZtYWNfY3R4LT5saW0uZ0xpbVByZUF1dGhQZWVyQWRkciwKKwkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQl9CisJCWF1dGhfcmVxLT5hdXRoVHlwZSA9IGF1dGhfbW9kZTsKKwkJLyogVXBkYXRlIFBFIHNlc3Npb24gSWQgKi8KKwkJYXV0aF9yZXEtPnNlc3Npb25JZCA9IGF1dGhfY25mLT5zZXNzaW9uSWQ7CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsCisJCQlXTklfQ0ZHX0FVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVQsCisJCQkodWludDMyX3QgKikgJmF1dGhfcmVxLT5hdXRoRmFpbHVyZVRpbWVvdXQpCisJCQkhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCS8qCisJCQkgKiBDb3VsZCBub3QgZ2V0IEF1dGhGYWlsdXJlVGltZW91dCB2YWx1ZSBmcm9tIENGRy4KKwkJCSAqIExvZyBlcnJvci4KKwkJCSAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJGYWlsOnJldHJpZXZlIEF1dGhGYWlsdXJlVGltZW91dCAiKSk7CisJCX0KKwkJbGltX3Bvc3RfbWxtX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9BVVRIX1JFUSwKKwkJCSh1aW50MzJfdCAqKSBhdXRoX3JlcSk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQkvKiBNQUMgYmFzZWQgYXV0aGVudGljYXRpb24gZmFpbHVyZSAqLworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPT0KKwkJCWVMSU1fU01FX1dUX0FVVEhfU1RBVEUpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiQXV0aCBGYWlsdXJlIG9jY3VycmVkLiIpKTsKKwkJCXNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlID0KKwkJCQllTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEU7CisJCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfU01FX1NUQVRFLAorCQkJCXNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkLAorCQkJCXNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlKSk7CisJCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSA9CisJCQkJZUxJTV9NTE1fSURMRV9TVEFURTsKKwkJCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisJCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUpKTsKKwkJCS8qCisJCQkgKiBOZWVkIHRvIHNlbmQgSm9pbiByZXNwb25zZSB3aXRoCisJCQkgKiBhdXRoIGZhaWx1cmUgdG8gSG9zdC4KKwkJCSAqLworCQkJbGltX2hhbmRsZV9zbWVfam9pbl9yZXN1bHQobWFjX2N0eCwKKwkJCQkoKHRMaW1NbG1BdXRoQ25mICopbXNnKS0+cmVzdWx0Q29kZSwKKwkJCQkoKHRMaW1NbG1BdXRoQ25mICopbXNnKS0+cHJvdFN0YXR1c0NvZGUsCisJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUHJlLWF1dGhlbnRpY2F0aW9uIGZhaWx1cmUuCisJCQkgKiBTZW5kIFByZS1hdXRoIGZhaWx1cmUgcmVzcG9uc2UgdG8gaG9zdAorCQkJICovCisJCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSA9CisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltUHJldlNtZVN0YXRlOworCQkJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX1NNRV9TVEFURSwKKwkJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSkpOworCQl9CisJfQorfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9hc3NvY19jbmYoKSAtIFByb2Nlc3MgYXNzb2NpYXRpb24gY29uZmlybWF0aW9uCisgKiBAbWFjX2N0eDogIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2c6ICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fQVNTT0NfQ05GCisgKiBtZXNzYWdlIGZyb20gTUxNIFN0YXRlIG1hY2hpbmUuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2Fzc29jX2NuZih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXVpbnQzMl90ICptc2cpCit7CisJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeTsKKwl0TGltTWxtQXNzb2NDbmYgKmFzc29jX2NuZjsKKworCWlmIChtc2cgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKwlhc3NvY19jbmYgPSAodExpbU1sbUFzc29jQ25mICopIG1zZzsKKwlzZXNzaW9uX2VudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQobWFjX2N0eCwKKwkJCQlhc3NvY19jbmYtPnNlc3Npb25JZCk7CisJaWYgKHNlc3Npb25fZW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiU2Vzc2lvbklkOiVkIFNlc3Npb24gZG9lcyBub3QgZXhpc3QiKSwKKwkJCWFzc29jX2NuZi0+c2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfQVNTT0NfU1RBVEUgfHwKKwkJIExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpIHx8CisJCSBMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJLyoKKwkJICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIEFzc29jaWNhdGlvbiBjb25maXJtCisJCSAqIGZyb20gTUxNIGluIG90aGVyIHN0YXRlcyBPUiBvbiBBUC4KKwkJICogTG9nIGVycm9yCisJCSAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiU2Vzc2lvbklkOiVkIFJlY2VpdmVkIE1MTV9BU1NPQ19DTkYgaW4gc3RhdGUgJVgiKSwKKwkJCXNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkLCBzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSk7CisJCXJldHVybjsKKwl9CisJaWYgKCgodExpbU1sbUFzc29jQ25mICopIG1zZyktPnJlc3VsdENvZGUgIT0gZVNJUl9TTUVfU1VDQ0VTUykgeworCQkvKiBBc3NvY2lhdGlvbiBmYWlsdXJlICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlNlc3Npb25JZDolZCBBc3NvY2lhdGlvbiBmYWlsdXJlIiksCisJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCk7CisJCXNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOworCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfU01FX1NUQVRFLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsIG1hY19jdHgtPmxpbS5nTGltU21lU3RhdGUpKTsKKwkJLyoKKwkJICogTmVlZCB0byBzZW5kIEpvaW4gcmVzcG9uc2Ugd2l0aAorCQkgKiBBc3NvY2lhdGlvbiBmYWlsdXJlIHRvIEhvc3QuCisJCSAqLworCQlsaW1faGFuZGxlX3NtZV9qb2luX3Jlc3VsdChtYWNfY3R4LAorCQkJKCh0TGltTWxtQXNzb2NDbmYgKikgbXNnKS0+cmVzdWx0Q29kZSwKKwkJCSgodExpbU1sbUFzc29jQ25mICopIG1zZyktPnByb3RTdGF0dXNDb2RlLAorCQkJc2Vzc2lvbl9lbnRyeSk7CisJfSBlbHNlIHsKKwkJLyogU3VjY2Vzc2Z1bCBBc3NvY2lhdGlvbiAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJTZXNzaW9uSWQ6JWQgQXNzb2NpYXRlZCB3aXRoIEJTUyIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQpOworCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX0xJTktfRVNUX1NUQVRFOworCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfU01FX1NUQVRFLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSkpOworCQkvKioKKwkJICogTmVlZCB0byBzZW5kIEpvaW4gcmVzcG9uc2Ugd2l0aAorCQkgKiBBc3NvY2lhdGlvbiBzdWNjZXNzIHRvIEhvc3QuCisJCSAqLworCQlsaW1faGFuZGxlX3NtZV9qb2luX3Jlc3VsdChtYWNfY3R4LAorCQkJKCh0TGltTWxtQXNzb2NDbmYgKikgbXNnKS0+cmVzdWx0Q29kZSwKKwkJCSgodExpbU1sbUFzc29jQ25mICopIG1zZyktPnByb3RTdGF0dXNDb2RlLAorCQkJc2Vzc2lvbl9lbnRyeSk7CisJfQorfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9yZWFzc29jX2NuZigpIC0gcHJvY2VzcyBtbG0gcmVhc3NvYyBjbmYgbXNnCisgKgorICogQG1hY19jdHg6ICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2dfYnVmOiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgTUxNX1JFQVNTT0NfQ05GIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUKKyAqIG1hY2hpbmUuCisgKgorICogQFJldHVybjogdm9pZAorICovCit2b2lkIGxpbV9wcm9jZXNzX21sbV9yZWFzc29jX2NuZih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCAqbXNnX2J1ZikKK3sKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uOworCXRMaW1NbG1SZWFzc29jQ25mICpsaW1fbWxtX3JlYXNzb2NfY25mOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKwlsaW1fbWxtX3JlYXNzb2NfY25mID0gKHRMaW1NbG1SZWFzc29jQ25mICopIG1zZ19idWY7CisJc2Vzc2lvbiA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKG1hY19jdHgsCisJCQkJbGltX21sbV9yZWFzc29jX2NuZi0+c2Vzc2lvbklkKTsKKwlpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJzZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uIElkIikpOworCQlyZXR1cm47CisJfQorCWlmICgoc2Vzc2lvbi0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURSkgfHwKKwkgICAgTElNX0lTX0FQX1JPTEUoc2Vzc2lvbikgfHwgTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb24pKSB7CisJCS8qCisJCSAqIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBSZWFzc29jaWNhdGlvbiBjb25maXJtCisJCSAqIGZyb20gTUxNIGluIG90aGVyIHN0YXRlcyBPUiBvbiBBUC4KKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJSY3YgdW5leHBlY3RlZCBNTE1fUkVBU1NPQ19DTkYgaW4gcm9sZSAlZCwgc21lIHN0YXRlIDB4JVgiKSwKKwkJCUdFVF9MSU1fU1lTVEVNX1JPTEUoc2Vzc2lvbiksIHNlc3Npb24tPmxpbVNtZVN0YXRlKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc2Vzc2lvbi0+cExpbVJlQXNzb2NSZXEpIHsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPnBMaW1SZUFzc29jUmVxKTsKKwkJc2Vzc2lvbi0+cExpbVJlQXNzb2NSZXEgPSBOVUxMOworCX0KKworCS8qCisJICogVXBvbiBSZWFzc29jIHN1Y2Nlc3Mgb3IgZmFpbHVyZSwgZnJlZXVwIHRoZSBjYWNoZWQgcHJlYXV0aCByZXF1ZXN0LAorCSAqIHRvIGVuc3VyZSB0aGF0IGNoYW5uZWwgc3dpdGNoIGlzIG5vdyBhbGxvd2VkIGZvbGxvd2luZyBhbnkgY2hhbmdlIGluCisJICogSFQgcGFyYW1zLgorCSAqLworCWlmIChzZXNzaW9uLT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIkZyZWVpbmcgcEZUUHJlQXV0aFJlcT0gJXAiKSwKKwkJCXNlc3Npb24tPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEpOworCQlpZiAoc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+cGJzc0Rlc2NyaXB0aW9uKSB7CisJCQljZGZfbWVtX2ZyZWUoCisJCQkgIHNlc3Npb24tPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnBic3NEZXNjcmlwdGlvbik7CisJCQlzZXNzaW9uLT5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5wYnNzRGVzY3JpcHRpb24gPQorCQkJCQkJCQkJTlVMTDsKKwkJfQorCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSk7CisJCXNlc3Npb24tPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgPSBOVUxMOworCQlzZXNzaW9uLT5mdFBFQ29udGV4dC5mdFByZUF1dGhTZXNzaW9uID0gZmFsc2U7CisJfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmIChzZXNzaW9uLT5iUm9hbVN5bmNoSW5Qcm9ncmVzcykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJRkwoIkxGUjM6UmUtc2V0IHRoZSBMSU0gQ3R4dCBSb2FtIFN5bmNoIEluIFByb2dyZXNzIikpOworCQlzZXNzaW9uLT5iUm9hbVN5bmNoSW5Qcm9ncmVzcyA9IGZhbHNlOworCX0KKyNlbmRpZgorCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiUmN2IE1MTV9SRUFTU09DX0NORiB3aXRoIHJlc3VsdCBjb2RlICVkIiksCisJCWxpbV9tbG1fcmVhc3NvY19jbmYtPnJlc3VsdENvZGUpOworCWlmIChsaW1fbWxtX3JlYXNzb2NfY25mLT5yZXN1bHRDb2RlID09IGVTSVJfU01FX1NVQ0NFU1MpIHsKKwkJLyogU3VjY2Vzc2Z1bCBSZWFzc29jaWF0aW9uICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkgIEZMKCIqKiogUmVhc3NvY2lhdGVkIHdpdGggbmV3IEJTUyAqKioiKSk7CisKKwkJc2Vzc2lvbi0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURTsKKwkJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX1NNRV9TVEFURSwKKwkJICAgICAgc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIHNlc3Npb24tPmxpbVNtZVN0YXRlKSk7CisKKwkJLyogTmVlZCB0byBzZW5kIFJlYXNzb2MgcnNwIHdpdGggUmVhc3NvYyBzdWNjZXNzIHRvIEhvc3QuICovCisJCWxpbV9zZW5kX3NtZV9qb2luX3JlYXNzb2NfcnNwKG1hY19jdHgsIGVXTklfU01FX1JFQVNTT0NfUlNQLAorCQkJCQlsaW1fbWxtX3JlYXNzb2NfY25mLT5yZXN1bHRDb2RlLAorCQkJCQlsaW1fbWxtX3JlYXNzb2NfY25mLT5wcm90U3RhdHVzQ29kZSwKKwkJCQkJc2Vzc2lvbiwgc2Vzc2lvbi0+c21lU2Vzc2lvbklkLAorCQkJCQlzZXNzaW9uLT50cmFuc2FjdGlvbklkKTsKKwl9IGVsc2UgaWYgKGxpbV9tbG1fcmVhc3NvY19jbmYtPnJlc3VsdENvZGUKKwkJCT09IGVTSVJfU01FX1JFQVNTT0NfUkVGVVNFRCkgeworCQkvKgorCQkgKiBSZWFzc29jaWF0aW9uIGZhaWx1cmUgV2l0aCB0aGUgTmV3IEFQIGJ1dCB3ZSBzdGlsbCBoYXZlIHRoZQorCQkgKiBsaW5rIHdpdGggdGhlIE9sZGVyIEFQCisJCSAqLworCQlzZXNzaW9uLT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX0xJTktfRVNUX1NUQVRFOworCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfU01FX1NUQVRFLAorCQkgICAgICAgc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIHNlc3Npb24tPmxpbVNtZVN0YXRlKSk7CisKKwkJLyogTmVlZCB0byBzZW5kIFJlYXNzb2MgcnNwIHdpdGggQXNzb2MgZmFpbHVyZSB0byBIb3N0LiAqLworCQlsaW1fc2VuZF9zbWVfam9pbl9yZWFzc29jX3JzcChtYWNfY3R4LCBlV05JX1NNRV9SRUFTU09DX1JTUCwKKwkJCQkJbGltX21sbV9yZWFzc29jX2NuZi0+cmVzdWx0Q29kZSwKKwkJCQkJbGltX21sbV9yZWFzc29jX2NuZi0+cHJvdFN0YXR1c0NvZGUsCisJCQkJCXNlc3Npb24sIHNlc3Npb24tPnNtZVNlc3Npb25JZCwKKwkJCQkJc2Vzc2lvbi0+dHJhbnNhY3Rpb25JZCk7CisJfSBlbHNlIHsKKwkJLyogUmVhc3NvY2lhdGlvbiBmYWlsdXJlICovCisJCXNlc3Npb24tPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOworCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfU01FX1NUQVRFLAorCQkgICAgICAgc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIHNlc3Npb24tPmxpbVNtZVN0YXRlKSk7CisJCS8qIE5lZWQgdG8gc2VuZCBSZWFzc29jIHJzcCB3aXRoIEFzc29jIGZhaWx1cmUgdG8gSG9zdC4gKi8KKwkJbGltX2hhbmRsZV9zbWVfcmVhYXNvY19yZXN1bHQobWFjX2N0eCwKKwkJCQkJbGltX21sbV9yZWFzc29jX2NuZi0+cmVzdWx0Q29kZSwKKwkJCQkJbGltX21sbV9yZWFzc29jX2NuZi0+cHJvdFN0YXR1c0NvZGUsCisJCQkJCXNlc3Npb24pOworCX0KK30KKworLyoqCisgKiBsaW1fZmlsbF9hc3NvY19pbmRfcGFyYW1zKCkgLSBJbml0aWFsaXplIGFzc29jaWF0aW9uIGluZGljYXRpb24KKyAqIG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIGFzc29jX2luZDogUEUgYXNzb2NpYXRpb24gaW5kaWNhdGlvbiBzdHJ1Y3R1cmUKKyAqIHNtZV9hc3NvY19pbmQ6IFNNRSBhc3NvY2lhdGlvbiBpbmRpY2F0aW9uCisgKiBzZXNzaW9uX2VudHJ5OiBQRSBzZXNzaW9uIGVudHJ5CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5pdGlhbHppZSB0aGUgYXNzb2NpYXRpb24KKyAqIGluZGljYXRpb24gc3RydWN1dHJlIHRvIHByb2Nlc3MgYXNzb2NpYXRpb24gaW5kaWNhdGlvbi4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworCit2b2lkCitsaW1fZmlsbF9hc3NvY19pbmRfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdHBMaW1NbG1Bc3NvY0luZCBhc3NvY19pbmQsIHRTaXJTbWVBc3NvY0luZCAqc21lX2Fzc29jX2luZCwKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXNtZV9hc3NvY19pbmQtPmxlbmd0aCA9IHNpemVvZih0U2lyU21lQXNzb2NJbmQpOworCXNtZV9hc3NvY19pbmQtPnNlc3Npb25JZCA9IHNlc3Npb25fZW50cnktPnNtZVNlc3Npb25JZDsKKworCS8qIFJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZXMgdG8gdXBwZXIgbGF5ZXIgKi8KKwlzbWVfYXNzb2NfaW5kLT5hc3NvY1JlcUxlbmd0aCA9IGFzc29jX2luZC0+YXNzb2NSZXFMZW5ndGg7CisJc21lX2Fzc29jX2luZC0+YXNzb2NSZXFQdHIgPSBhc3NvY19pbmQtPmFzc29jUmVxUHRyOworCisJc21lX2Fzc29jX2luZC0+YmVhY29uUHRyID0gc2Vzc2lvbl9lbnRyeS0+YmVhY29uOworCXNtZV9hc3NvY19pbmQtPmJlYWNvbkxlbmd0aCA9IHNlc3Npb25fZW50cnktPmJjbkxlbjsKKworCS8qIEZpbGwgaW4gcGVlck1hY0FkZHIgKi8KKwljZGZfbWVtX2NvcHkoc21lX2Fzc29jX2luZC0+cGVlck1hY0FkZHIsIGFzc29jX2luZC0+cGVlck1hY0FkZHIsCisJCXNpemVvZih0U2lyTWFjQWRkcikpOworCisJLyogRmlsbCBpbiBhaWQgKi8KKwlzbWVfYXNzb2NfaW5kLT5haWQgPSBhc3NvY19pbmQtPmFpZDsKKwkvKiBGaWxsIGluIGJzc0lkICovCisJY2RmX21lbV9jb3B5KHNtZV9hc3NvY19pbmQtPmJzc0lkLCBzZXNzaW9uX2VudHJ5LT5ic3NJZCwKKwkJc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJLyogRmlsbCBpbiBhdXRoVHlwZSAqLworCXNtZV9hc3NvY19pbmQtPmF1dGhUeXBlID0gYXNzb2NfaW5kLT5hdXRoVHlwZTsKKwkvKiBGaWxsIGluIHNzSWQgKi8KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnNtZV9hc3NvY19pbmQtPnNzSWQsCisJCSh1aW50OF90ICopICYoYXNzb2NfaW5kLT5zc0lkKSwgYXNzb2NfaW5kLT5zc0lkLmxlbmd0aCArIDEpOworCXNtZV9hc3NvY19pbmQtPnJzbklFLmxlbmd0aCA9IGFzc29jX2luZC0+cnNuSUUubGVuZ3RoOworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmc21lX2Fzc29jX2luZC0+cnNuSUUucnNuSUVkYXRhLAorCQkodWludDhfdCAqKSAmKGFzc29jX2luZC0+cnNuSUUucnNuSUVkYXRhKSwKKwkJYXNzb2NfaW5kLT5yc25JRS5sZW5ndGgpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwlzbWVfYXNzb2NfaW5kLT53YXBpSUUubGVuZ3RoID0gYXNzb2NfaW5kLT53YXBpSUUubGVuZ3RoOworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmc21lX2Fzc29jX2luZC0+d2FwaUlFLndhcGlJRWRhdGEsCisJCSh1aW50OF90ICopICYoYXNzb2NfaW5kLT53YXBpSUUud2FwaUlFZGF0YSksCisJCWFzc29jX2luZC0+d2FwaUlFLmxlbmd0aCk7CisjZW5kaWYKKwlzbWVfYXNzb2NfaW5kLT5hZGRJRS5sZW5ndGggPSBhc3NvY19pbmQtPmFkZElFLmxlbmd0aDsKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnNtZV9hc3NvY19pbmQtPmFkZElFLmFkZElFZGF0YSwKKwkJKHVpbnQ4X3QgKikgJihhc3NvY19pbmQtPmFkZElFLmFkZElFZGF0YSksCisJCWFzc29jX2luZC0+YWRkSUUubGVuZ3RoKTsKKworCS8qIENvcHkgdGhlIG5ldyBUSVRBTiBjYXBhYmlsaXRpZXMgKi8KKwlzbWVfYXNzb2NfaW5kLT5zcGVjdHJ1bU1ndEluZGljYXRvciA9IGFzc29jX2luZC0+c3BlY3RydW1NZ3RJbmRpY2F0b3I7CisJaWYgKGFzc29jX2luZC0+c3BlY3RydW1NZ3RJbmRpY2F0b3IgPT0gZVNJUl9UUlVFKSB7CisJCXNtZV9hc3NvY19pbmQtPnBvd2VyQ2FwLm1pblR4UG93ZXIgPQorCQkJYXNzb2NfaW5kLT5wb3dlckNhcC5taW5UeFBvd2VyOworCQlzbWVfYXNzb2NfaW5kLT5wb3dlckNhcC5tYXhUeFBvd2VyID0KKwkJCWFzc29jX2luZC0+cG93ZXJDYXAubWF4VHhQb3dlcjsKKwkJc21lX2Fzc29jX2luZC0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubCA9CisJCQlhc3NvY19pbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmw7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmc21lX2Fzc29jX2luZC0+c3VwcG9ydGVkQ2hhbm5lbHMuCisJCQljaGFubmVsTGlzdCwKKwkJCSh1aW50OF90ICopICYoYXNzb2NfaW5kLT5zdXBwb3J0ZWRDaGFubmVscy5jaGFubmVsTGlzdCksCisJCQlhc3NvY19pbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmwpOworCX0KKwljZGZfbWVtX2NvcHkoJnNtZV9hc3NvY19pbmQtPmNoYW5faW5mbywgJmFzc29jX2luZC0+Y2hhbl9pbmZvLAorCQlzaXplb2YodFNpclNtZUNoYW5JbmZvKSk7CisJLyogRmlsbCBpbiBXbW1JbmZvICovCisJc21lX2Fzc29jX2luZC0+d21tRW5hYmxlZFN0YSA9IGFzc29jX2luZC0+V21tU3RhSW5mb1ByZXNlbnQ7Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX2Fzc29jX2luZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIE1MTV9BU1NPQ19JTkQKKyAqIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnQnVmICAgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2Fzc29jX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwl1aW50MzJfdCBsZW47CisJdFNpck1zZ1EgbXNnUTsKKwl0U2lyU21lQXNzb2NJbmQgKnBTaXJTbWVBc3NvY0luZDsKKwl0cERwaEhhc2hOb2RlIHBTdGFEcyA9IDA7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwlpZiAocE1zZ0J1ZiA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTspCisJCXJldHVybjsKKwl9CisJcHNlc3Npb25FbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKHBNYWMsCisJCQkJKCh0cExpbU1sbUFzc29jSW5kKSBwTXNnQnVmKS0+CisJCQkJc2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWQiKSk7CisJCXJldHVybjsKKwl9CisJLyogLyBJbmZvcm0gSG9zdCBvZiBTVEEgYXNzb2NpYXRpb24gKi8KKwlsZW4gPSBzaXplb2YodFNpclNtZUFzc29jSW5kKTsKKwlwU2lyU21lQXNzb2NJbmQgPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCWlmIChOVUxMID09IHBTaXJTbWVBc3NvY0luZCkgeworCQkvKiBMb2cgZXJyb3IgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwKKwkJCQkoImNhbGwgdG8gQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9BU1NPQ19JTkQiKSk7CisJCXJldHVybjsKKwl9CisKKwlwU2lyU21lQXNzb2NJbmQtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfQVNTT0NfSU5EOworCWxpbV9maWxsX2Fzc29jX2luZF9wYXJhbXMocE1hYywgKHRwTGltTWxtQXNzb2NJbmQpIHBNc2dCdWYsIHBTaXJTbWVBc3NvY0luZCwKKwkJCQkgIHBzZXNzaW9uRW50cnkpOworCW1zZ1EudHlwZSA9IGVXTklfU01FX0FTU09DX0lORDsKKwltc2dRLmJvZHlwdHIgPSBwU2lyU21lQXNzb2NJbmQ7CisJbXNnUS5ib2R5dmFsID0gMDsKKwlwU3RhRHMgPSBkcGhfZ2V0X2hhc2hfZW50cnkocE1hYywKKwkJCQkgICAgKCh0cExpbU1sbUFzc29jSW5kKSBwTXNnQnVmKS0+YWlkLAorCQkJCSAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKCFwU3RhRHMpIHsgIC8qIGdvb2QgdGltZSB0byBwYW5pYy4uLiAqLworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkJCSgiTUxNIEFzc29jSW5kOiBTdGF0aW9uIGNvbnRleHQgbm8gbG9uZ2VyIHZhbGlkIChhaWQgJWQpIiksCisJCQkoKHRwTGltTWxtQXNzb2NJbmQpIHBNc2dCdWYpLT5haWQpOworCQljZGZfbWVtX2ZyZWUocFNpclNtZUFzc29jSW5kKTsKKworCQlyZXR1cm47CisJfQorCXBTaXJTbWVBc3NvY0luZC0+c3RhSWQgPSBwU3RhRHMtPnN0YUluZGV4OworCXBTaXJTbWVBc3NvY0luZC0+cmVhc3NvY1JlcSA9IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlOworCXBTaXJTbWVBc3NvY0luZC0+dGltaW5nTWVhc0NhcCA9IHBTdGFEcy0+dGltaW5nTWVhc0NhcDsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbXNnUS50eXBlKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfQVNTT0NfSU5EX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAwLAorCQkJICAgICAgMCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbXNnUSwgZVBST1QpOworCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwKKwkJICAgICAgIEZMCisJCQkgICAgICAgKCJDcmVhdGUgQ05GX1dBSVRfVElNRVIgYWZ0ZXIgcmVjZWl2ZWQgTElNX01MTV9BU1NPQ19JTkQiKSk7CisJICAgICAgICkKKwkvKgorCSoqIHR1cm4gb24gYSB0aW1lciB0byBkZXRlY3QgdGhlIGxvc3Mgb2YgQVNTT0MgQ05GCisJKiovCisJbGltX2FjdGl2YXRlX2NuZl90aW1lcihwTWFjLAorCQkJICAgICAgICh1aW50MTZfdCkgKCh0cExpbU1sbUFzc29jSW5kKSBwTXNnQnVmKS0+YWlkLAorCQkJICAgICAgIHBzZXNzaW9uRW50cnkpOworCit9IC8qKiogZW5kIGxpbV9wcm9jZXNzX21sbV9hc3NvY19pbmQoKSAqKiovCisKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX2Rpc2Fzc29jX2luZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIE1MTV9ESVNBU1NPQ19JTkQKKyAqIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnQnVmICAgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2Rpc2Fzc29jX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwl0TGltTWxtRGlzYXNzb2NJbmQgKnBNbG1EaXNhc3NvY0luZDsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCXBNbG1EaXNhc3NvY0luZCA9ICh0TGltTWxtRGlzYXNzb2NJbmQgKikgcE1zZ0J1ZjsKKwlwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQocE1hYywKKwkJCQlwTWxtRGlzYXNzb2NJbmQtPnNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEIikpOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCWNhc2UgZUxJTV9TVEFfSU5fSUJTU19ST0xFOgorCQlicmVhazsKKwljYXNlIGVMSU1fU1RBX1JPTEU6CisJY2FzZSBlTElNX0JUX0FNUF9TVEFfUk9MRToKKwkJcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9ESVNBU1NPQ19TVEFURTsKKwkJTVRSQUNFKG1hY190cmFjZQorCQkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDogICAgICAgIC8qIGVMSU1fQVBfUk9MRSAvL2VMSU1fQlRfQU1QX0FQX1JPTEUgKi8KKwkJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwKKwkJCSAgICAgICBGTCgiKioqIFBlZXIgc3RhSWQ9JWQgRGlzYXNzb2NpYXRlZCAqKioiKSwKKwkJCSAgICAgICBwTWxtRGlzYXNzb2NJbmQtPmFpZCk7CisJCSAgICAgICApCisJCS8qIFNlbmQgU01FX0RJU0FTT0NfSU5EIGFmdGVyIFBvbGFyaXMgY2xlYW51cCAqLworCQkvKiAoYWZ0ZXIgcmVjZWl2aW5nIExJTV9NTE1fUFVSR0VfU1RBX0lORCkgKi8KKwkJYnJlYWs7CisJfSAvKiBlbmQgc3dpdGNoIChHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpKSAqLworfSAvKioqIGVuZCBsaW1fcHJvY2Vzc19tbG1fZGlzYXNzb2NfaW5kKCkgKioqLworCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9kaXNhc3NvY19jbmYoKSAtIFByb2Nlc3NlcyBkaXNhc3NvY2lhdGlvbgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2c6IEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIE1MTV9ESVNBU1NPQ19DTkYKKyAqIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBsaW1fcHJvY2Vzc19tbG1fZGlzYXNzb2NfY25mKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdWludDMyX3QgKm1zZykKK3sKKwl0U2lyUmVzdWx0Q29kZXMgcmVzdWx0X2NvZGU7CisJdExpbU1sbURpc2Fzc29jQ25mICpkaXNhc3NvY19jbmY7CisJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeTsKKwlkaXNhc3NvY19jbmYgPSAodExpbU1sbURpc2Fzc29jQ25mICopIG1zZzsKKworCXNlc3Npb25fZW50cnkgPQorCQlwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LCBkaXNhc3NvY19jbmYtPnNlc3Npb25JZCk7CisJaWYgKHNlc3Npb25fZW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgic2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbiBJZCIpKTsKKwkJcmV0dXJuOworCX0KKwlyZXN1bHRfY29kZSA9ICh0U2lyUmVzdWx0Q29kZXMpKGRpc2Fzc29jX2NuZi0+ZGlzYXNzb2NUcmlnZ2VyID09CisJCWVMSU1fTElOS19NT05JVE9SSU5HX0RJU0FTU09DKSA/CisJCWVTSVJfU01FX0xPU1RfTElOS19XSVRIX1BFRVJfUkVTVUxUX0NPREUgOgorCQlkaXNhc3NvY19jbmYtPnJlc3VsdENvZGU7CisJaWYgKExJTV9JU19TVEFfUk9MRShzZXNzaW9uX2VudHJ5KSB8fAorCQlMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCS8qIERpc2Fzc29jaWF0ZSBDb25maXJtIGZyb20gTUxNICovCisJCWlmICgoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEUpCisJCQkmJiAoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgIT0KKwkJCWVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSkpIHsKKwkJCS8qCisJCQkgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQKKwkJCSAqIERpc2Fzc29jYXRlIGNvbmZpcm0KKwkJCSAqIGZyb20gTUxNIGluIG90aGVyIHN0YXRlcy5Mb2cgZXJyb3IKKwkJCSAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJyZWNlaXZlZCBNTE1fRElTQVNTT0NfQ05GIGluIHN0YXRlICVYIiksCisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChtYWNfY3R4LT5saW0uZ0xpbVJzcFJlcWQpCisJCQltYWNfY3R4LT5saW0uZ0xpbVJzcFJlcWQgPSBmYWxzZTsKKwkJaWYgKGRpc2Fzc29jX2NuZi0+ZGlzYXNzb2NUcmlnZ2VyID09CisJCQllTElNX1BST01JU0NVT1VTX01PREVfRElTQVNTT0MpIHsKKwkJCWlmIChkaXNhc3NvY19jbmYtPnJlc3VsdENvZGUgIT0gZVNJUl9TTUVfU1VDQ0VTUykKKwkJCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSA9CisJCQkJCXNlc3Npb25fZW50cnktPmxpbVByZXZTbWVTdGF0ZTsKKwkJCWVsc2UKKwkJCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSA9CisJCQkJCWVMSU1fU01FX09GRkxJTkVfU1RBVEU7CisJCQlNVFJBQ0UobWFjX3RyYWNlCisJCQkJKG1hY19jdHgsIFRSQUNFX0NPREVfU01FX1NUQVRFLAorCQkJCXNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkLAorCQkJCXNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZGlzYXNzb2NfY25mLT5yZXN1bHRDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpCisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPQorCQkJCQlzZXNzaW9uX2VudHJ5LT5saW1QcmV2U21lU3RhdGU7CisJCQllbHNlCisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPQorCQkJCQllTElNX1NNRV9JRExFX1NUQVRFOworCQkJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX1NNRV9TVEFURSwKKwkJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSkpOworCQkJbGltX3NlbmRfc21lX2Rpc2Fzc29jX250ZihtYWNfY3R4LAorCQkJCWRpc2Fzc29jX2NuZi0+cGVlck1hY0FkZHIsIHJlc3VsdF9jb2RlLAorCQkJCWRpc2Fzc29jX2NuZi0+ZGlzYXNzb2NUcmlnZ2VyLAorCQkJCWRpc2Fzc29jX2NuZi0+YWlkLCBzZXNzaW9uX2VudHJ5LT5zbWVTZXNzaW9uSWQsCisJCQkJc2Vzc2lvbl9lbnRyeS0+dHJhbnNhY3Rpb25JZCwgc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwl9IGVsc2UgaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpIHx8CisJCQlMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJbGltX3NlbmRfc21lX2Rpc2Fzc29jX250ZihtYWNfY3R4LCBkaXNhc3NvY19jbmYtPnBlZXJNYWNBZGRyLAorCQkJcmVzdWx0X2NvZGUsIGRpc2Fzc29jX2NuZi0+ZGlzYXNzb2NUcmlnZ2VyLAorCQkJZGlzYXNzb2NfY25mLT5haWQsIHNlc3Npb25fZW50cnktPnNtZVNlc3Npb25JZCwKKwkJCXNlc3Npb25fZW50cnktPnRyYW5zYWN0aW9uSWQsIHNlc3Npb25fZW50cnkpOworCX0KK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19tbG1fZGVhdXRoX2luZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIE1MTV9ERUFVVEhfSU5ECisgKiBtZXNzYWdlIGZyb20gTUxNIFN0YXRlIG1hY2hpbmUuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcE1zZ0J1ZiAgICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbV9wcm9jZXNzX21sbV9kZWF1dGhfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmKQoreworCXRMaW1NbG1EZWF1dGhJbmQgKnBNbG1EZWF1dGhJbmQ7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZDsKKwlwTWxtRGVhdXRoSW5kID0gKHRMaW1NbG1EZWF1dGhJbmQgKikgcE1zZ0J1ZjsKKwlwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsCisJCQkJcE1sbURlYXV0aEluZC0+cGVlck1hY0FkZHIsICZzZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIEFkZHI6IiBNQUNfQUREUkVTU19TVFIpLAorCQkJTUFDX0FERFJfQVJSQVkocE1sbURlYXV0aEluZC0+cGVlck1hY0FkZHIpKTsKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKEdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwljYXNlIGVMSU1fU1RBX0lOX0lCU1NfUk9MRToKKwkJYnJlYWs7CisJY2FzZSBlTElNX1NUQV9ST0xFOgorCWNhc2UgZUxJTV9CVF9BTVBfU1RBX1JPTEU6CisJCXBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFOworCQlNVFJBQ0UobWFjX3RyYWNlCisJCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSkpOworCisJZGVmYXVsdDogICAgICAgIC8qIGVMSU1fQVBfUk9MRSAqLworCXsKKwkJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwKKwkJCSAgICAgICBGTAorCQkJCSAgICAgICAoIioqKiBSZWNlaXZlZCBEZWF1dGhlbnRpY2F0aW9uIGZyb20gc3RhSWQ9JWQgKioqIiksCisJCQkgICAgICAgcE1sbURlYXV0aEluZC0+YWlkKTsKKwkJICAgICAgICkKKwl9CisJCS8qIFNlbmQgU01FX0RFQVVUSF9JTkQgYWZ0ZXIgUG9sYXJpcyBjbGVhbnVwICovCisJCS8qIChhZnRlciByZWNlaXZpbmcgTElNX01MTV9QVVJHRV9TVEFfSU5EKSAqLworCWJyZWFrOworCX0gLyogZW5kIHN3aXRjaCAoR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSkgKi8KK30gLyoqKiBlbmQgbGltX3Byb2Nlc3NfbWxtX2RlYXV0aF9pbmQoKSAqKiovCisKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX2RlYXV0aF9jbmYoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fREVBVVRIX0NORgorICogbWVzc2FnZSBmcm9tIE1MTSBTdGF0ZSBtYWNoaW5lLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2dCdWYgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBsaW1fcHJvY2Vzc19tbG1fZGVhdXRoX2NuZih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwl1aW50MTZfdCBhaWQ7CisJdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGU7CisJdExpbU1sbURlYXV0aENuZiAqcE1sbURlYXV0aENuZjsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCisJaWYgKHBNc2dCdWYgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7KQorCQlyZXR1cm47CisJfQorCXBNbG1EZWF1dGhDbmYgPSAodExpbU1sbURlYXV0aENuZiAqKSBwTXNnQnVmOworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChwTWFjLAorCQkJCXBNbG1EZWF1dGhDbmYtPnNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uIElkICIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KKworCXJlc3VsdENvZGUgPSAodFNpclJlc3VsdENvZGVzKQorCQkgICAgIChwTWxtRGVhdXRoQ25mLT5kZWF1dGhUcmlnZ2VyID09CisJCSAgICAgIGVMSU1fTElOS19NT05JVE9SSU5HX0RFQVVUSCkgPworCQkgICAgIGVTSVJfU01FX0xPU1RfTElOS19XSVRIX1BFRVJfUkVTVUxUX0NPREUgOgorCQkgICAgIHBNbG1EZWF1dGhDbmYtPnJlc3VsdENvZGU7CisJYWlkID0gTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgPyBwTWxtRGVhdXRoQ25mLT5haWQgOiAxOworCWlmIChMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkgICAgTElNX0lTX0JUX0FNUF9TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkvKiBEZWF1dGggQ29uZmlybSBmcm9tIE1MTSAqLworCQlpZiAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFKSB7CisJCQkvKioKKwkJCSAqIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBEZWF1dGggY29uZmlybQorCQkJICogZnJvbSBNTE0gaW4gb3RoZXIgc3RhdGVzLgorCQkJICogTG9nIGVycm9yCisJCQkgKi8KKwkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJICAgICAgRkwKKwkJCQkJICAoInJlY2VpdmVkIHVuZXhwZWN0ZWQgTUxNX0RFQVVUSF9DTkYgaW4gc3RhdGUgJVgiKSwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOykKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocE1sbURlYXV0aENuZi0+cmVzdWx0Q29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKSB7CisJCQlwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX0lETEVfU1RBVEU7CisJCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCSAgICAgICBGTCgiKioqIERlYXV0aGVudGljYXRlZCB3aXRoIEJTUyAqKioiKSk7KQorCQl9IGVsc2UKKwkJCXBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0KKwkJCQlwc2Vzc2lvbkVudHJ5LT5saW1QcmV2U21lU3RhdGU7CisJCU1UUkFDRShtYWNfdHJhY2UKKwkJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSk7CisKKwkJaWYgKHBNYWMtPmxpbS5nTGltUnNwUmVxZCkKKwkJCXBNYWMtPmxpbS5nTGltUnNwUmVxZCA9IGZhbHNlOworCX0KKwkvKiBPbiBTVEEgb3Igb24gQkFTSUMgQVAsIHNlbmQgU01FX0RFQVVUSF9SU1AgdG8gaG9zdCAqLworCWxpbV9zZW5kX3NtZV9kZWF1dGhfbnRmKHBNYWMsIHBNbG1EZWF1dGhDbmYtPnBlZXJNYWNBZGRyLAorCQkJCXJlc3VsdENvZGUsCisJCQkJcE1sbURlYXV0aENuZi0+ZGVhdXRoVHJpZ2dlciwKKwkJCQlhaWQsIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwKKwkJCQlwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKK30gLyoqKiBlbmQgbGltX3Byb2Nlc3NfbWxtX2RlYXV0aF9jbmYoKSAqKiovCisKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX3B1cmdlX3N0YV9pbmQoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fUFVSR0VfU1RBX0lORAorICogbWVzc2FnZSBmcm9tIE1MTSBTdGF0ZSBtYWNoaW5lLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2dCdWYgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBsaW1fcHJvY2Vzc19tbG1fcHVyZ2Vfc3RhX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwl0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZTsKKwl0cExpbU1sbVB1cmdlU3RhSW5kIHBNbG1QdXJnZVN0YUluZDsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCWlmIChwTXNnQnVmID09IE5VTEwpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMIikpOykKKwkJcmV0dXJuOworCX0KKwlwTWxtUHVyZ2VTdGFJbmQgPSAodHBMaW1NbG1QdXJnZVN0YUluZCkgcE1zZ0J1ZjsKKwlwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQocE1hYywKKwkJCQlwTWxtUHVyZ2VTdGFJbmQtPnNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZCIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KKwkvKiBQdXJnZSBTVEEgaW5kaWNhdGlvbiBmcm9tIE1MTSAqLworCXJlc3VsdENvZGUgPSAodFNpclJlc3VsdENvZGVzKSBwTWxtUHVyZ2VTdGFJbmQtPnJlYXNvbkNvZGU7CisJc3dpdGNoIChHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJY2FzZSBlTElNX1NUQV9JTl9JQlNTX1JPTEU6CisJCWJyZWFrOworCWNhc2UgZUxJTV9TVEFfUk9MRToKKwljYXNlIGVMSU1fQlRfQU1QX1NUQV9ST0xFOgorCWRlZmF1bHQ6ICAgICAgICAvKiBlTElNX0FQX1JPTEUgKi8KKwkJaWYgKExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSAmJgorCQkgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0KKwkJCWVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFKSAmJgorCQkgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFKSkgeworCQkJLyoqCisJCQkgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQKKwkJCSAqIFB1cmdlIFNUQSBpbmRpY2F0aW9uCisJCQkgKiBmcm9tIE1MTSBpbiBvdGhlciBzdGF0ZXMuCisJCQkgKiBMb2cgZXJyb3IKKwkJCSAqLworCQkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgicmVjZWl2ZWQgdW5leHBlY3RlZCBNTE1fUFVSR0VfU1RBX0lORCBpbiBzdGF0ZSAlWCIpLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSk7CisJCQkgICAgICAgKQorCQkJYnJlYWs7CisJCX0KKwkJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwKKwkJCSAgICAgICBGTCgiKioqIENsZWFudXAgY29tcGxldGVkIGZvciBzdGFJZD0lZCAqKioiKSwKKwkJCSAgICAgICBwTWxtUHVyZ2VTdGFJbmQtPmFpZCk7CisJCSAgICAgICApCisJCWlmIChMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkJICAgIExJTV9JU19CVF9BTVBfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJCXBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfSURMRV9TVEFURTsKKwkJCU1UUkFDRShtYWNfdHJhY2UKKwkJCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpKTsKKworCQl9CisJCWlmIChwTWxtUHVyZ2VTdGFJbmQtPnB1cmdlVHJpZ2dlciA9PSBlTElNX1BFRVJfRU5USVRZX0RFQVVUSCkgeworCQkJbGltX3NlbmRfc21lX2RlYXV0aF9udGYocE1hYywKKwkJCQkJCXBNbG1QdXJnZVN0YUluZC0+cGVlck1hY0FkZHIsCisJCQkJCQlyZXN1bHRDb2RlLAorCQkJCQkJcE1sbVB1cmdlU3RhSW5kLT5wdXJnZVRyaWdnZXIsCisJCQkJCQlwTWxtUHVyZ2VTdGFJbmQtPmFpZCwKKwkJCQkJCXBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwKKwkJCQkJCXBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQpOworCQl9IGVsc2UKKwkJCWxpbV9zZW5kX3NtZV9kaXNhc3NvY19udGYocE1hYywKKwkJCQkJCSAgcE1sbVB1cmdlU3RhSW5kLT5wZWVyTWFjQWRkciwKKwkJCQkJCSAgcmVzdWx0Q29kZSwKKwkJCQkJCSAgcE1sbVB1cmdlU3RhSW5kLT5wdXJnZVRyaWdnZXIsCisJCQkJCQkgIHBNbG1QdXJnZVN0YUluZC0+YWlkLAorCQkJCQkJICBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQsCisJCQkJCQkgIHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQsCisJCQkJCQkgIHBzZXNzaW9uRW50cnkpOworCX0gLyogZW5kIHN3aXRjaCAoR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSkgKi8KK30gLyoqKiBlbmQgbGltX3Byb2Nlc3NfbWxtX3B1cmdlX3N0YV9pbmQoKSAqKiovCisKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX3NldF9rZXlzX2NuZigpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIE1MTV9TRVRLRVlTX0NORgorICogbWVzc2FnZSBmcm9tIE1MTSBTdGF0ZSBtYWNoaW5lLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2dCdWYgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBsaW1fcHJvY2Vzc19tbG1fc2V0X2tleXNfY25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmKQoreworCS8qIFByZXBhcmUgYW5kIHNlbmQgU01FX1NFVENPTlRFWFRfUlNQIG1lc3NhZ2UgKi8KKwl0TGltTWxtU2V0S2V5c0NuZiAqcE1sbVNldEtleXNDbmY7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50MTZfdCBhaWQ7CisJdHBEcGhIYXNoTm9kZSBzdGFfZHM7CisKKwlpZiAocE1zZ0J1ZiA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTspCisJCXJldHVybjsKKwl9CisJcE1sbVNldEtleXNDbmYgPSAodExpbU1sbVNldEtleXNDbmYgKikgcE1zZ0J1ZjsKKwlwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQocE1hYywKKwkJCQkJICAgcE1sbVNldEtleXNDbmYtPnNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWQgIikpOworCQkgICAgICAgKQorCQlyZXR1cm47CisJfQorCXBzZXNzaW9uRW50cnktPmlzX2tleV9pbnN0YWxsZWQgPSAwOworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIlJlY2VpdmVkIE1MTV9TRVRLRVlTX0NORiB3aXRoIHJlc3VsdENvZGUgPSAlZCIpLAorCQlwTWxtU2V0S2V5c0NuZi0+cmVzdWx0Q29kZSk7CisJLyogaWYgdGhlIHN0YXR1cyBpcyBzdWNjZXNzIGtleXMgYXJlIGluc3RhbGxlZCBpbiB0aGUKKwkqIEZpcm13YXJlIHNvIHdlIGNhbiBzZXQgdGhlIHByb3RlY3Rpb24gYml0CisJKi8KKwlpZiAoZVNJUl9TTUVfU1VDQ0VTUyA9PSBwTWxtU2V0S2V5c0NuZi0+cmVzdWx0Q29kZSkgeworCQlwc2Vzc2lvbkVudHJ5LT5pc19rZXlfaW5zdGFsbGVkID0gMTsKKwkJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpIHx8CisJCQlMSU1fSVNfQlRfQU1QX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJCXN0YV9kcyA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLAorCQkJCXBNbG1TZXRLZXlzQ25mLT5wZWVyTWFjQWRkciwKKwkJCQkmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCQlpZiAoc3RhX2RzICE9IE5VTEwpCisJCQkJc3RhX2RzLT5pc19rZXlfaW5zdGFsbGVkID0gMTsKKwkJfQorCX0KKwlsaW1fc2VuZF9zbWVfc2V0X2NvbnRleHRfcnNwKHBNYWMsCisJCQkJICAgICBwTWxtU2V0S2V5c0NuZi0+cGVlck1hY0FkZHIsCisJCQkJICAgICAxLAorCQkJCSAgICAgKHRTaXJSZXN1bHRDb2RlcykgcE1sbVNldEtleXNDbmYtPnJlc3VsdENvZGUsCisJCQkJICAgICBwc2Vzc2lvbkVudHJ5LCBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQsCisJCQkJICAgICBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKK30gLyoqKiBlbmQgbGltX3Byb2Nlc3NfbWxtX3NldF9rZXlzX2NuZigpICoqKi8KKworLyoqCisgKiBsaW1faGFuZGxlX3NtZV9qb2luX3Jlc3VsdCgpIC0gSGFuZGxlcyBzbWUgam9pbiByZXN1bHQKKyAqIEBtYWNfY3R4OiAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJlc3VsdF9jb2RlOiBGYWlsdXJlIGNvZGUgdG8gYmUgc2VudAorICogQHByb3Rfc3RhdHVzX2NvZGUgOiBQcm90b2NvbCBzdGF0dXMgY29kZQorICogQHNlc3Npb25fZW50cnk6IFBFIHNlc3Npb24gaGFuZGxlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBqb2luL2F1dGgvYXNzb2MgZmFpbHVyZXMKKyAqIHVwb24gcmVjZWl2aW5nIE1MTV9KT0lOL0FVVEgvQVNTT0NfQ05GIHdpdGggYSBmYWlsdXJlIGNvZGUgb3IKKyAqIE1MTV9BU1NPQ19DTkYgd2l0aCBhIHN1Y2Nlc3MgY29kZSBpbiBjYXNlIG9mIFNUQSByb2xlIGFuZAorICogTUxNX0pPSU5fQ05GIHdpdGggc3VjY2VzcyBpbiBjYXNlIG9mIFNUQSBpbiBJQlNTIHJvbGUuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitsaW1faGFuZGxlX3NtZV9qb2luX3Jlc3VsdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXRTaXJSZXN1bHRDb2RlcyByZXN1bHRfY29kZSwgdWludDE2X3QgcHJvdF9zdGF0dXNfY29kZSwKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXRwRHBoSGFzaE5vZGUgc3RhX2RzID0gTlVMTDsKKwl1aW50OF90IHNtZV9zZXNzaW9uX2lkOworCXVpbnQxNl90IHNtZV90cmFuc19pZDsKKworCWlmIChzZXNzaW9uX2VudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgicHNlc3Npb25FbnRyeSBpcyBOVUxMICIpKTsKKwkJcmV0dXJuOworCX0KKwlzbWVfc2Vzc2lvbl9pZCA9IHNlc3Npb25fZW50cnktPnNtZVNlc3Npb25JZDsKKwlzbWVfdHJhbnNfaWQgPSBzZXNzaW9uX2VudHJ5LT50cmFuc2FjdGlvbklkOworCS8qCisJICogV2hlbiBhc3NvY2lhdGlvbnMgaXMgZmFpbGVkICwgZGVsZXRlIHRoZSBzZXNzaW9uIGNyZWF0ZWQKKwkgKiBhbmQgcGFzcyBOVUxMICB0byAgbGltc2VuZHNtZUpvaW5SZWFzc29jUnNwKCkKKwkgKi8KKwlpZiAocmVzdWx0X2NvZGUgIT0gZVNJUl9TTUVfU1VDQ0VTUykgeworCQlzdGFfZHMgPQorCQkJZHBoX2dldF9oYXNoX2VudHJ5KG1hY19jdHgsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLAorCQkJCSZzZXNzaW9uX2VudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJaWYgKHN0YV9kcyAhPSBOVUxMKSB7CisJCQlzdGFfZHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb24gPQorCQkJCWVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTjsKKwkJCXN0YV9kcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9CisJCQkJZUxJTV9KT0lOX0ZBSUxVUkU7CisJCQlzdGFfZHMtPm1sbVN0YUNvbnRleHQucmVzdWx0Q29kZSA9IHJlc3VsdF9jb2RlOworCQkJc3RhX2RzLT5tbG1TdGFDb250ZXh0LnByb3RTdGF0dXNDb2RlID0gcHJvdF9zdGF0dXNfY29kZTsKKwkJCS8qCisJCQkgKiBGSVhfTUU6IGF0IHRoZSBlbmQgb2YgbGltX2NsZWFudXBfcnhfcGF0aCwKKwkJCSAqIG1ha2Ugc3VyZSBQRSBpcyBzZW5kaW5nIGVXTklfU01FX0pPSU5fUlNQCisJCQkgKiB0byBTTUUKKwkJCSAqLworCQkJbGltX2NsZWFudXBfcnhfcGF0aChtYWNfY3R4LCBzdGFfZHMsIHNlc3Npb25fZW50cnkpOworCQkJY2RmX21lbV9mcmVlKHNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxKTsKKwkJCXNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxID0gTlVMTDsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWNkZl9tZW1fZnJlZShzZXNzaW9uX2VudHJ5LT5wTGltSm9pblJlcSk7CisJc2Vzc2lvbl9lbnRyeS0+cExpbUpvaW5SZXEgPSBOVUxMOworCS8qIERlbGV0ZSB0ZWggc2Vzc2lvbiBpZiBKT0lOIGZhaWx1cmUgb2NjdXJyZWQuICovCisJaWYgKHJlc3VsdF9jb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpIHsKKwkJaWYgKGxpbV9zZXRfbGlua19zdGF0ZShtYWNfY3R4LCBlU0lSX0xJTktfRE9XTl9TVEFURSwKKwkJCXNlc3Npb25fZW50cnktPmJzc0lkLAorCQkJc2Vzc2lvbl9lbnRyeS0+c2VsZk1hY0FkZHIsIE5VTEwsIE5VTEwpCisJCQkgIT0gZVNJUl9TVUNDRVNTKQorCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJGYWlsZWQgdG8gc2V0IHRoZSBEb3duU3RhdGUuIikpOworCQlpZiAobGltX3NldF9saW5rX3N0YXRlCisJCQkobWFjX2N0eCwgZVNJUl9MSU5LX0lETEVfU1RBVEUsCisJCQlzZXNzaW9uX2VudHJ5LT5ic3NJZCwKKwkJCXNlc3Npb25fZW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLAorCQkJTlVMTCkgIT0gZVNJUl9TVUNDRVNTKQorCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJGYWlsZWQgdG8gc2V0IHRoZSBMaW5rU3RhdGUuIikpOworCQlwZV9kZWxldGVfc2Vzc2lvbihtYWNfY3R4LCBzZXNzaW9uX2VudHJ5KTsKKwkJc2Vzc2lvbl9lbnRyeSA9IE5VTEw7CisJfQorCisJbGltX3NlbmRfc21lX2pvaW5fcmVhc3NvY19yc3AobWFjX2N0eCwgZVdOSV9TTUVfSk9JTl9SU1AsIHJlc3VsdF9jb2RlLAorCQlwcm90X3N0YXR1c19jb2RlLCBzZXNzaW9uX2VudHJ5LCBzbWVfc2Vzc2lvbl9pZCwgc21lX3RyYW5zX2lkKTsKK30KKworLyoqCisgKiBsaW1faGFuZGxlX3NtZV9yZWFhc29jX3Jlc3VsdCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyByZWFzc29jIGZhaWx1cmVzCisgKiB1cG9uIHJlY2VpdmluZyBSRUFTU09DX0NORiB3aXRoIGEgZmFpbHVyZSBjb2RlIG9yCisgKiBNTE1fUkVBU1NPQ19DTkYgd2l0aCBhIHN1Y2Nlc3MgY29kZSBpbiBjYXNlIG9mIFNUQSByb2xlCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHJlc3VsdENvZGUgICBGYWlsdXJlIGNvZGUgdG8gYmUgc2VudAorICoKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2xpbV9oYW5kbGVfc21lX3JlYWFzb2NfcmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlLAorCQkJICAgICAgdWludDE2X3QgcHJvdFN0YXR1c0NvZGUsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworCXVpbnQ4X3Qgc21lc2Vzc2lvbklkOworCXVpbnQxNl90IHNtZXRyYW5zYWN0aW9uSWQ7CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJwc2Vzc2lvbkVudHJ5IGlzIE5VTEwgIikpOykKKwkJcmV0dXJuOworCX0KKwlzbWVzZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisJc21ldHJhbnNhY3Rpb25JZCA9IHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQ7CisJLyogV2hlbiBhc3NvY2lhdGlvbnMgaXMgZmFpbGVkICwgZGVsZXRlIHRoZSBzZXNzaW9uIGNyZWF0ZWQgIGFuZCBwYXNzIE5VTEwgIHRvICBsaW1zZW5kc21lSm9pblJlYXNzb2NSc3AoKSAqLworCWlmIChyZXN1bHRDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpIHsKKwkJcFN0YURzID0KKwkJCWRwaF9nZXRfaGFzaF9lbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCQkJICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQlpZiAocFN0YURzICE9IE5VTEwpIHsKKwkJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5kaXNhc3NvY1JlYXNvbiA9CisJCQkJZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OOworCQkJcFN0YURzLT5tbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID0KKwkJCQllTElNX0pPSU5fRkFJTFVSRTsKKwkJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5yZXN1bHRDb2RlID0gcmVzdWx0Q29kZTsKKwkJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5wcm90U3RhdHVzQ29kZSA9IHByb3RTdGF0dXNDb2RlOworCQkJbGltX2NsZWFudXBfcnhfcGF0aChwTWFjLCBwU3RhRHMsIHBzZXNzaW9uRW50cnkpOworCQkJcmV0dXJuOworCQl9CisJfQorCS8qIERlbGV0ZSB0ZWggc2Vzc2lvbiBpZiBSRUFTU09DIGZhaWx1cmUgb2NjdXJyZWQuICovCisJaWYgKHJlc3VsdENvZGUgIT0gZVNJUl9TTUVfU1VDQ0VTUykgeworCQlpZiAoTlVMTCAhPSBwc2Vzc2lvbkVudHJ5KSB7CisJCQlwZV9kZWxldGVfc2Vzc2lvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJCXBzZXNzaW9uRW50cnkgPSBOVUxMOworCQl9CisJfQorCWxpbV9zZW5kX3NtZV9qb2luX3JlYXNzb2NfcnNwKHBNYWMsIGVXTklfU01FX1JFQVNTT0NfUlNQLCByZXN1bHRDb2RlLAorCQkJCSAgICAgIHByb3RTdGF0dXNDb2RlLCBwc2Vzc2lvbkVudHJ5LCBzbWVzZXNzaW9uSWQsCisJCQkJICAgICAgc21ldHJhbnNhY3Rpb25JZCk7Cit9IC8qKiogZW5kIGxpbUhhbmRsZVNtZVJlYXNzb2NSZXN1bHQoKSAqKiovCisKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX2FkZF9zdGFfcnNwKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIGEgV01BX0FERF9TVEFfUlNQIGZyb20gSEFMLgorICogVXBvbiByZWNlaXB0IG9mIHRoaXMgbWVzc2FnZSBmcm9tIEhBTCwgTUxNRSAtCisgKiA+IERldGVybWluZXMgdGhlICJzdGF0ZSIgaW4gd2hpY2ggdGhpcyBtZXNzYWdlIHdhcyByZWNlaXZlZAorICogPiBGb3J3YXJkcyBpdCB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2sKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICB0U2lyTXNnUSAgVGhlIE1zZ1EgaGVhZGVyLCB3aGljaCBjb250YWlucyB0aGUgcmVzcG9uc2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2FkZF9zdGFfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRLAorCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCS8qIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgZGVmZXJyZWQgbWVzc2FnZSBzaW5jZSB0aGUgaW5pdGlhdGluZyByZXEuIHRoZXJlIG1pZ2h0IGJlIG5lc3RlZCByZXF1ZXN0LiAqLworCS8qIGluIHRoZSBjYXNlIG9mIG5lc3RlZCByZXF1ZXN0IHRoZSBuZXcgcmVxdWVzdCBpbml0aWF0ZWQgZnJvbSB0aGUgcmVzcG9uc2Ugd2lsbCB0YWtlIGNhcmUgb2YgcmVzZXR0aW5nICovCisJLyogdGhlIGRlZmZlcmVkIGZsYWcuICovCisJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisJaWYgKExJTV9JU19CVF9BTVBfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQlsaW1fcHJvY2Vzc19hcF9tbG1fYWRkX3N0YV9yc3AocE1hYywgbGltTXNnUSwgcHNlc3Npb25FbnRyeSk7CisJCXJldHVybjsKKwl9CisJbGltX3Byb2Nlc3Nfc3RhX21sbV9hZGRfc3RhX3JzcChwTWFjLCBsaW1Nc2dRLCBwc2Vzc2lvbkVudHJ5KTsKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19zdGFfbWxtX2FkZF9zdGFfcnNwICgpIC0gUHJvY2VzcyBhZGQgc3RhIHJlc3BvbnNlCisgKiBAbWFjX2N0eDogIFBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqIEBtc2c6ICB0cFNpck1zZ1FhbiBNZXNzYWdlIHN0cnVjdHVyZQorICogQHNlc3Npb25fZW50cnk6IFBFIHNlc3Npb24gZW50cnkKKyAqCisgKiBQcm9jZXNzIEFERCBTVEEgcmVzcG9uc2Ugc2VudCBmcm9tIFdNQSBhbmQgcG9zdHMgcmVzdWx0cworICogdG8gU01FLgorICoKKyAqIFJldHVybjogTnVsbAorICovCisKK3ZvaWQgbGltX3Byb2Nlc3Nfc3RhX21sbV9hZGRfc3RhX3JzcCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXRwU2lyTXNnUSBtc2csIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJdExpbU1sbUFzc29jQ25mIG1sbV9hc3NvY19jbmY7CisJdHBEcGhIYXNoTm9kZSBzdGFfZHM7CisJdWludDMyX3QgbXNnX3R5cGUgPSBMSU1fTUxNX0FTU09DX0NORjsKKwl0cEFkZFN0YVBhcmFtcyBhZGRfc3RhX3BhcmFtcyA9ICh0cEFkZFN0YVBhcmFtcykgbXNnLT5ib2R5cHRyOworCXRwUEVTZXNzaW9uIGZ0X3Nlc3Npb24gPSBOVUxMOworCXVpbnQ4X3QgZnRfc2Vzc2lvbl9pZDsKKworCWlmIChOVUxMID09IGFkZF9zdGFfcGFyYW1zKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkVuY291bnRlcmVkIE5VTEwgUG9pbnRlciIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFKQorCQltc2dfdHlwZSA9IExJTV9NTE1fUkVBU1NPQ19DTkY7CisKKwlpZiAodHJ1ZSA9PSBzZXNzaW9uX2VudHJ5LT5mRGVhdXRoUmVjZWl2ZWQpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlJlY2VpdmVkIERlYXV0aCBmcmFtZSBpbiBBRERfU1RBX1JFU1Agc3RhdGUiKSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gYWRkX3N0YV9wYXJhbXMtPnN0YXR1cykgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJBRERfU1RBIHN1Y2Nlc3MsIHNlbmQgdXBkYXRlIHJlc3VsdCBjb2RlIHdpdGggZVNJUl9TTUVfSk9JTl9ERUFVVEhfRlJPTV9BUF9EVVJJTkdfQUREX1NUQSBzdGFJZHg6ICVkIGxpbU1sbVN0YXRlOiAlZCIpLAorCQkJCWFkZF9zdGFfcGFyYW1zLT5zdGFJZHgsCisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUpOworCisJCQlpZiAoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPT0KKwkJCQkJZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURSkKKwkJCQltc2dfdHlwZSA9IExJTV9NTE1fUkVBU1NPQ19DTkY7CisJCQkvKgorCQkJICogV2UgYXJlIHNlbmRpbmcgcmVzdWx0IGNvZGUKKwkJCSAqIGVTSVJfU01FX0pPSU5fREVBVVRIX0ZST01fQVBfRFVSSU5HX0FERF9TVEEgd2hpY2gKKwkJCSAqIHdpbGwgdHJpZ2dlciBwcm9wZXIgY2xlYW51cCAoREVMX1NUQS9ERUxfQlNTIGJvdGgKKwkJCSAqIHJlcXVpcmVkKSBpbiBlaXRoZXIgYXNzb2MgY25mIG9yIHJlYXNzb2MgY25mIGhhbmRsZXIuCisJCQkgKi8KKwkJCW1sbV9hc3NvY19jbmYucmVzdWx0Q29kZSA9CisJCQkJZVNJUl9TTUVfSk9JTl9ERUFVVEhfRlJPTV9BUF9EVVJJTkdfQUREX1NUQTsKKwkJCXNlc3Npb25fZW50cnktPnN0YUlkID0gYWRkX3N0YV9wYXJhbXMtPnN0YUlkeDsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBhZGRfc3RhX3BhcmFtcy0+c3RhdHVzKSB7CisJCWlmIChlTElNX01MTV9XVF9BRERfU1RBX1JTUF9TVEFURSAhPQorCQkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiUmVjZWl2ZWQgV01BX0FERF9TVEFfUlNQIGluIHN0YXRlICVYIiksCisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUpOworCQkJbWxtX2Fzc29jX2NuZi5yZXN1bHRDb2RlID0KKwkJCQkodFNpclJlc3VsdENvZGVzKSBlU0lSX1NNRV9SRUZVU0VEOworCQkJZ290byBlbmQ7CisJCX0KKwkJaWYgKHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEUpIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQkJLyogY2hlY2sgaWYgd2UgaGF2ZSBrZXlzKFBUSyl0byBpbnN0YWxsIGluIGNhc2Ugb2YgMTFyICovCisJCQl0cGZ0UEVDb250ZXh0IGZ0X2N0eCA9ICZzZXNzaW9uX2VudHJ5LT5mdFBFQ29udGV4dDsKKwkJCWZ0X3Nlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQobWFjX2N0eCwKKwkJCQlzZXNzaW9uX2VudHJ5LT5saW1SZUFzc29jYnNzSWQsICZmdF9zZXNzaW9uX2lkKTsKKwkJCWlmIChmdF9zZXNzaW9uICE9IE5VTEwgJiYKKwkJCQlmdF9jdHgtPlByZUF1dGhLZXlJbmZvLmV4dFNldFN0YUtleVBhcmFtVmFsaWQKKwkJCQk9PSB0cnVlKSB7CisJCQkJdHBMaW1NbG1TZXRLZXlzUmVxIHBNbG1TdGFLZXlzID0KKwkJCQkJJmZ0X2N0eC0+UHJlQXV0aEtleUluZm8uZXh0U2V0U3RhS2V5UGFyYW07CisJCQkJbGltX3NlbmRfc2V0X3N0YV9rZXlfcmVxKG1hY19jdHgsIHBNbG1TdGFLZXlzLAorCQkJCQkwLCAwLCBmdF9zZXNzaW9uLCBmYWxzZSk7CisJCQkJZnRfY3R4LT5QcmVBdXRoS2V5SW5mby5leHRTZXRTdGFLZXlQYXJhbVZhbGlkID0KKwkJCQkJZmFsc2U7CisJCQl9CisjZW5kaWYKKwkJfQorCQkvKgorCQkgKiBVcGRhdGUgdGhlIERQSCBIYXNoIEVudHJ5IGZvciB0aGlzIFNUQQorCQkgKiB3aXRoIHByb3BlciBzdGF0ZSBpbmZvCisJCSAqLworCQlzdGFfZHMgPQorCQkJZHBoX2dldF9oYXNoX2VudHJ5KG1hY19jdHgsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLAorCQkJCSZzZXNzaW9uX2VudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJaWYgKE5VTEwgIT0gc3RhX2RzKQorCQkJc3RhX2RzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0KKwkJCQllTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFOworCQllbHNlCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoIkZhaWwgdG8gZ2V0IERQSCBIYXNoIEVudHJ5IGZvciBBSUQgLSAlZCIpLAorCQkJCURQSF9TVEFfSEFTSF9JTkRFWF9QRUVSKTsKKwkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFOworCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfTUxNX1NUQVRFLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSkpOworCQkvKgorCQkgKiBTdG9yaW5nIHRoZSBzZWxmIFN0YUluZGV4KEdlbmVyYXRlZCBieSBIQUwpIGluCisJCSAqIHNlc3Npb24gY29udGV4dCwgaW5zdGVhZCBvZiBzdG9yaW5nIGl0IGluIERQSCBIYXNoCisJCSAqIGVudHJ5IGZvciBTZWxmIFNUQS4KKwkJICogRFBIIGVudHJ5IGZvciB0aGUgc2VsZiBTVEEgc3RvcmVzIHRoZSBzdGEgaW5kZXggZm9yCisJCSAqIHRoZSBCU1MgZW50cnkgdG8gd2hpY2ggdGhlIFNUQSBpcyBhc3NvY2lhdGVkCisJCSAqLworCQlzZXNzaW9uX2VudHJ5LT5zdGFJZCA9IGFkZF9zdGFfcGFyYW1zLT5zdGFJZHg7CisKKyNpZmRlZiBXTEFOX0RFQlVHCisJCW1hY19jdHgtPmxpbS5nTGltTnVtTGlua0VzdHMrKzsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJCS8qIGluaXRpYWxpemUgVERMUyBwZWVyIHJlbGF0ZWQgZGF0YSAqLworCQlsaW1faW5pdF90ZGxzX2RhdGEobWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSk7CisjZW5kaWYKKwkJLyoKKwkJICogUmV0dXJuIEFzc29jIGNvbmZpcm0gdG8gU01FIHdpdGggc3VjY2VzcworCQkgKiBGSVhNRSAtIE5lZWQgdGhlIGNvcnJlY3QgQVNTT0MgUlNQIGNvZGUgdG8KKwkJICogYmUgcGFzc2VkIGluIGhlcmUKKwkJICovCisJCW1sbV9hc3NvY19jbmYucmVzdWx0Q29kZSA9ICh0U2lyUmVzdWx0Q29kZXMpIGVTSVJfU01FX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiQUREX1NUQSBmYWlsZWQhIikpOworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURSkKKwkJCW1sbV9hc3NvY19jbmYucmVzdWx0Q29kZSA9CisJCQkJKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9TTUVfRlRfUkVBU1NPQ19GQUlMVVJFOworCQllbHNlCisJCQltbG1fYXNzb2NfY25mLnJlc3VsdENvZGUgPQorCQkJCSh0U2lyUmVzdWx0Q29kZXMpIGVTSVJfU01FX1JFRlVTRUQ7CisJfQorZW5kOgorCWlmIChOVUxMICE9IG1zZy0+Ym9keXB0cikgeworCQljZGZfbWVtX2ZyZWUoYWRkX3N0YV9wYXJhbXMpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCX0KKwkvKiBVcGRhdGluZyBQRSBzZXNzaW9uIElkICovCisJbWxtX2Fzc29jX2NuZi5zZXNzaW9uSWQgPSBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZDsKKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShtYWNfY3R4LCBtc2dfdHlwZSwgKHVpbnQzMl90ICopICZtbG1fYXNzb2NfY25mKTsKKwlpZiAodHJ1ZSA9PSBzZXNzaW9uX2VudHJ5LT5mRGVhdXRoUmVjZWl2ZWQpCisJCXNlc3Npb25fZW50cnktPmZEZWF1dGhSZWNlaXZlZCA9IGZhbHNlOworCXJldHVybjsKK30KKwordm9pZCBsaW1fcHJvY2Vzc19tbG1fZGVsX2Jzc19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EsCisJCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJLyogd2UgbmVlZCB0byBwcm9jZXNzIHRoZSBkZWZlcnJlZCBtZXNzYWdlIHNpbmNlIHRoZSBpbml0aWF0aW5nIHJlcS4gdGhlcmUgbWlnaHQgYmUgbmVzdGVkIHJlcXVlc3QuICovCisJLyogaW4gdGhlIGNhc2Ugb2YgbmVzdGVkIHJlcXVlc3QgdGhlIG5ldyByZXF1ZXN0IGluaXRpYXRlZCBmcm9tIHRoZSByZXNwb25zZSB3aWxsIHRha2UgY2FyZSBvZiByZXNldHRpbmcgKi8KKwkvKiB0aGUgZGVmZmVyZWQgZmxhZy4gKi8KKwlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKwlwTWFjLT5zeXMuZ1N5c0ZyYW1lQ291bnRbU0lSX01BQ19NR01UX0ZSQU1FXVtTSVJfTUFDX01HTVRfREVBVVRIXSA9IDA7CisKKwlpZiAoKExJTV9JU19CVF9BTVBfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpIHx8CisJICAgIExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSAmJgorCSAgICAocHNlc3Npb25FbnRyeS0+c3RhdHlwZUZvckJzcyA9PSBTVEFfRU5UUllfU0VMRikpIHsKKwkJbGltX3Byb2Nlc3NfYnRfYW1wX2FwX21sbV9kZWxfYnNzX3JzcChwTWFjLCBsaW1Nc2dRLCBwc2Vzc2lvbkVudHJ5KTsKKwkJcmV0dXJuOworCX0KKwlsaW1fcHJvY2Vzc19zdGFfbWxtX2RlbF9ic3NfcnNwKHBNYWMsIGxpbU1zZ1EsIHBzZXNzaW9uRW50cnkpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWlmIChwc2Vzc2lvbkVudHJ5LT5saW1SbWZFbmFibGVkKSB7CisJCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkJICAgIGxpbV9zZW5kX2V4Y2x1ZGVfdW5lbmNyeXB0X2luZChwTWFjLCB0cnVlLCBwc2Vzc2lvbkVudHJ5KSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiQ291bGQgbm90IHNlbmQgZG93biBFeGNsdWRlIFVuZW5jcnlwdGVkIEluZGljYXRpb24hIikpOworCQl9CisJfQorI2VuZGlmCit9CisKK3ZvaWQgbGltX3Byb2Nlc3Nfc3RhX21sbV9kZWxfYnNzX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSwKKwkJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdHBEZWxldGVCc3NQYXJhbXMgcERlbEJzc1BhcmFtcyA9ICh0cERlbGV0ZUJzc1BhcmFtcykgbGltTXNnUS0+Ym9keXB0cjsKKwl0cERwaEhhc2hOb2RlIHBTdGFEcyA9CisJCWRwaF9nZXRfaGFzaF9lbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCQkgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCisJaWYgKE5VTEwgPT0gcERlbEJzc1BhcmFtcykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIGJvZHkgcG9pbnRlciBpbiBtZXNzYWdlIikpOworCQlnb3RvIGVuZDsKKwl9CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBwRGVsQnNzUGFyYW1zLT5zdGF0dXMpIHsKKwkJUEVMT0dXKGxpbV9sb2cocE1hYywgTE9HVywKKwkJCSAgICAgICBGTCgiU1RBIHJlY2VpdmVkIHRoZSBERUxfQlNTX1JTUCBmb3IgQlNTSUQ6ICVYLiIpLAorCQkJICAgICAgIHBEZWxCc3NQYXJhbXMtPmJzc0lkeCk7CisJCSAgICAgICApCisJCWlmIChsaW1fc2V0X2xpbmtfc3RhdGUKKwkJCSAgICAocE1hYywgZVNJUl9MSU5LX0lETEVfU1RBVEUsIHBzZXNzaW9uRW50cnktPmJzc0lkLAorCQkJICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLAorCQkJICAgIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMKCJGYWlsdXJlIGluIHNldHRpbmcgbGluayBzdGF0ZSB0byBJRExFIikpOworCQkJICAgICAgICkKKwkJCXN0YXR1c0NvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworCQkJZ290byBlbmQ7CisJCX0KKwkJaWYgKHBTdGFEcyA9PSBOVUxMKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJEUEggRW50cnkgZm9yIFNUQSAxIG1pc3NpbmcuIikpOworCQkJc3RhdHVzQ29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlpZiAoZUxJTV9NTE1fV1RfREVMX0JTU19SU1BfU1RBVEUgIT0KKwkJICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSkgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgV01BX0RFTF9CU1NfUlNQIGluIHN0YXRlICVYIiksCisJCQkJICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSk7CisJCQkgICAgICAgKQorCQkJc3RhdHVzQ29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlQRUxPRzEobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cxLCBGTCgiU1RBIEFzc29jSUQgJWQgTUFDICIpLCBwU3RhRHMtPmFzc29jSWQpOworCQkgICAgICAgbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgTE9HMSk7CisJCSAgICAgICApCisJfSBlbHNlIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiREVMIEJTUyBmYWlsZWQhIikpOworCQlzdGF0dXNDb2RlID0gZVNJUl9TTUVfU1RPUF9CU1NfRkFJTFVSRTsKKwl9CitlbmQ6CisJaWYgKDAgIT0gbGltTXNnUS0+Ym9keXB0cikgeworCQljZGZfbWVtX2ZyZWUocERlbEJzc1BhcmFtcyk7CisJCWxpbU1zZ1EtPmJvZHlwdHIgPSBOVUxMOworCX0KKwlpZiAocFN0YURzID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoKExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSAmJgorCSAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0KKwkJCWVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFICYmCisJICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9CisJCQllTElNX1NNRV9XVF9ERUFVVEhfU1RBVEUpICYmCisJICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciAhPQorCQkJZUxJTV9KT0lOX0ZBSUxVUkUpIHsKKwkJLyoqIFRoZSBDYXNlIHdoZXJlIHRoZSBEZWxCc3MgaXMgaW52b2tlZCBmcm9tCisJCSAqICBjb250ZXh0IG9mIG90aGVyIHRoYW4gbm9ybWFsIERpc0Fzc29jIC8gRGVhdXRoIE9SCisJCSAqICBhcyBwYXJ0IG9mIEpvaW4gRmFpbHVyZS4KKwkJICovCisJCWxpbV9oYW5kbGVfZGVsX2Jzc19pbl9yZV9hc3NvY19jb250ZXh0KHBNYWMsIHBTdGFEcywgcHNlc3Npb25FbnRyeSk7CisJCXJldHVybjsKKwl9CisJbGltX3ByZXBhcmVfYW5kX3NlbmRfZGVsX3N0YV9jbmYocE1hYywgcFN0YURzLCBzdGF0dXNDb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgbGltX3Byb2Nlc3NfYnRfYW1wX2FwX21sbV9kZWxfYnNzX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSwKKwkJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUmVzdWx0Q29kZXMgcmMgPSBlU0lSX1NNRV9TVUNDRVNTOworCXRTaXJSZXRTdGF0dXMgc3RhdHVzOworCXRwRGVsZXRlQnNzUGFyYW1zIHBEZWxCc3MgPSAodHBEZWxldGVCc3NQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisJdFNpck1hY0FkZHIgbnVsbEJzc2lkID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIlNlc3Npb24gZW50cnkgcGFzc2VkIGlzIE5VTEwiKSk7CisJCWlmIChwRGVsQnNzICE9IE5VTEwpIHsKKwkJCWNkZl9tZW1fZnJlZShwRGVsQnNzKTsKKwkJCWxpbU1zZ1EtPmJvZHlwdHIgPSBOVUxMOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAocERlbEJzcyA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJCU1M6IERFTF9CU1NfUlNQIHdpdGggbm8gYm9keSEiKSk7KQorCQlyYyA9IGVTSVJfU01FX1JFRlVTRUQ7CisJCWdvdG8gZW5kOworCX0KKwlwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKwlNVFJBQ0UobWFjX3RyYWNlCisJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIE5PX1NFU1NJT04sCisJCSAgICAgICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKwlpZiAoZUxJTV9NTE1fV1RfREVMX0JTU19SU1BfU1RBVEUgIT0gcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgV01BX0RFTF9CU1NfUlNQIGluIHN0YXRlICVYIiksCisJCQlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisJCXJjID0gZVNJUl9TTUVfUkVGVVNFRDsKKwkJZ290byBlbmQ7CisJfQorCWlmIChwRGVsQnNzLT5zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkJTUzogREVMX0JTU19SU1AgZXJyb3IgKCV4KSBCc3MgJWQgIiksCisJCQlwRGVsQnNzLT5zdGF0dXMsIHBEZWxCc3MtPmJzc0lkeCk7CisJCXJjID0gZVNJUl9TTUVfU1RPUF9CU1NfRkFJTFVSRTsKKwkJZ290byBlbmQ7CisJfQorCXN0YXR1cyA9IGxpbV9zZXRfbGlua19zdGF0ZShwTWFjLCBlU0lSX0xJTktfSURMRV9TVEFURSwgbnVsbEJzc2lkLAorCQkJCSAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgTlVMTCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJcmMgPSBlU0lSX1NNRV9SRUZVU0VEOworCQlnb3RvIGVuZDsKKwl9CisJLyoqIFNvZnRtYWMgbWF5IHNlbmQgYWxsIHRoZSBidWZmZXJlZCBwYWNrZXRzIHJpZ2h0IGFmdGVyIHJlc3VtaW5nIHRoZSB0cmFuc21pc3Npb24gaGVuY2UKKwkgKiB0byBvY2N1cHkgdGhlIG1lZGl1bSBkdXJpbmcgbm9uIGNoYW5uZWwgb2NjdXBhbmN5IHBlcmlvZC4gU28gcmVzdW1lIHRoZSB0cmFuc21pc3Npb24gYWZ0ZXIKKwkgKiBIQUwgZ2l2ZXMgYmFjayB0aGUgcmVzcG9uc2UuCisJICovCisJZHBoX2hhc2hfdGFibGVfY2xhc3NfaW5pdChwTWFjLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJbGltX2RlbGV0ZV9wcmVfYXV0aF9saXN0KHBNYWMpOworCS8qIEluaXRpYWxpemUgbnVtYmVyIG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgZHVyaW5nIGNsZWFudXAgKi8KKwlwc2Vzc2lvbkVudHJ5LT5nTGltTnVtT2ZDdXJyZW50U1RBcyA9IDA7CitlbmQ6CisJbGltX3NlbmRfc21lX3JzcChwTWFjLCBlV05JX1NNRV9TVE9QX0JTU19SU1AsIHJjLAorCQkJIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwKKwkJCSBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKKwlwZV9kZWxldGVfc2Vzc2lvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworCWlmIChwRGVsQnNzICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHBEZWxCc3MpOworCQlsaW1Nc2dRLT5ib2R5cHRyID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX2RlbF9zdGFfcnNwKCkgLSBQcm9jZXNzIERFTCBTVEEgcmVzcG9uc2UKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAbXNnOiBUaGUgTXNnUSBoZWFkZXIsIHdoaWNoIGNvbnRhaW5zIHRoZSByZXNwb25zZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIGEgV01BX0RFTF9TVEFfUlNQIGZyb20KKyAqIFdNQSBVcG9uIHJlY2VpcHQgb2YgdGhpcyBtZXNzYWdlIGZyb20gRlcuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2RlbF9zdGFfcnNwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdHBTaXJNc2dRIG1zZykKK3sKKwkvKgorCSAqIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgZGVmZXJyZWQgbWVzc2FnZSBzaW5jZSB0aGUKKwkgKiBpbml0aWF0aW5nIHJlcS4gdGhlcmUgbWlnaHQgYmUgbmVzdGVkIHJlcXVlc3QKKwkgKiBpbiB0aGUgY2FzZSBvZiBuZXN0ZWQgcmVxdWVzdCB0aGUgbmV3IHJlcXVlc3QKKwkgKiBpbml0aWF0ZWQgZnJvbSB0aGUgcmVzcG9uc2Ugd2lsbCB0YWtlIGNhcmUgb2YgcmVzZXR0aW5nCisJICogdGhlIGRlZmZlcmVkIGZsYWcuCisJICovCisJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeTsKKwl0cERlbGV0ZVN0YVBhcmFtcyBkZWxfc3RhX3BhcmFtczsKKwlkZWxfc3RhX3BhcmFtcyA9ICh0cERlbGV0ZVN0YVBhcmFtcykgbXNnLT5ib2R5cHRyOworCWlmIChOVUxMID09IGRlbF9zdGFfcGFyYW1zKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJudWxsIHBvaW50ZXIgZGVsX3N0YV9wYXJhbXMgbXNnIikpOworCQlyZXR1cm47CisJfQorCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKG1hY19jdHgsIHRydWUpOworCisJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKG1hY19jdHgsCisJCQkJZGVsX3N0YV9wYXJhbXMtPnNlc3Npb25JZCk7CisJaWYgKE5VTEwgPT0gc2Vzc2lvbl9lbnRyeSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiU2Vzc2lvbiBEb2Vzbid0IGV4aXN0IikpOworCQljZGZfbWVtX2ZyZWUoZGVsX3N0YV9wYXJhbXMpOworCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJaWYgKExJTV9JU19CVF9BTVBfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSB8fAorCQlMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSkgeworCQlsaW1fcHJvY2Vzc19idF9hbXBfYXBfbWxtX2RlbF9zdGFfcnNwKG1hY19jdHgsIG1zZywKKwkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJcmV0dXJuOworCX0KKwlsaW1fcHJvY2Vzc19zdGFfbWxtX2RlbF9zdGFfcnNwKG1hY19jdHgsIG1zZywgc2Vzc2lvbl9lbnRyeSk7Cit9CisKK3ZvaWQgbGltX3Byb2Nlc3NfYnRfYW1wX2FwX21sbV9kZWxfc3RhX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSwKKwkJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0cERlbGV0ZVN0YVBhcmFtcyBwRGVsU3RhUGFyYW1zID0gKHRwRGVsZXRlU3RhUGFyYW1zKSBsaW1Nc2dRLT5ib2R5cHRyOworCXRwRHBoSGFzaE5vZGUgcFN0YURzOworCXRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKwlpZiAobGltTXNnUS0+Ym9keXB0ciA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoImxpbU1zZ1EtPmJvZHlwdHJ5IE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlwU3RhRHMgPQorCQlkcGhfZ2V0X2hhc2hfZW50cnkocE1hYywgcERlbFN0YVBhcmFtcy0+YXNzb2NJZCwKKwkJCQkgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKHBTdGFEcyA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJEUEggRW50cnkgZm9yIFNUQSAlWCBtaXNzaW5nLiIpLAorCQkJcERlbFN0YVBhcmFtcy0+YXNzb2NJZCk7CisJCXN0YXR1c0NvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworCQljZGZfbWVtX2ZyZWUocERlbFN0YVBhcmFtcyk7CisJCWxpbU1zZ1EtPmJvZHlwdHIgPSBOVUxMOworCisJCXJldHVybjsKKwl9CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiUmVjZWl2ZWQgZGVsIFN0YSBSc3AgaW4gU3RhRCBNbG1TdGF0ZSA6ICVkIiksCisJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBwRGVsU3RhUGFyYW1zLT5zdGF0dXMpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIkFQIHJlY2VpdmVkIHRoZSBERUxfU1RBX1JTUCBmb3IgYXNzb2NJRDogJVguIiksCisJCQlwRGVsU3RhUGFyYW1zLT5hc3NvY0lkKTsKKworCQlpZiAoKGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFICE9CisJCSAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKQorCQkgICAgJiYgKGVMSU1fTUxNX1dUX0FTU09DX0RFTF9TVEFfUlNQX1NUQVRFICE9CisJCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwKKwkJCQkJKCJSZWNlaXZlZCB1bmV4cGVjdGVkIFdNQV9ERUxfU1RBX1JTUCBpbiBzdGF0ZSAlcyBmb3Igc3RhSWQgJWQgYXNzb2NJZCAlZCAiKSwKKwkJCQlsaW1fbWxtX3N0YXRlX3N0cihwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpLAorCQkJCXBTdGFEcy0+c3RhSW5kZXgsIHBTdGFEcy0+YXNzb2NJZCk7CisJCQlzdGF0dXNDb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKwkJCWdvdG8gZW5kOworCQl9CisKKwkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIkRlbGV0ZWQgU1RBIEFzc29jSUQgJWQgc3RhSWQgJWQgTUFDICIpLAorCQkJcFN0YURzLT5hc3NvY0lkLCBwU3RhRHMtPnN0YUluZGV4KTsKKwkJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgTE9HMSk7CisJCWlmIChlTElNX01MTV9XVF9BU1NPQ19ERUxfU1RBX1JTUF9TVEFURSA9PQorCQkgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKSB7CisJCQljZGZfbWVtX2ZyZWUocERlbFN0YVBhcmFtcyk7CisJCQlsaW1Nc2dRLT5ib2R5cHRyID0gTlVMTDsKKwkJCWlmIChsaW1fYWRkX3N0YShwTWFjLCBwU3RhRHMsIGZhbHNlLCBwc2Vzc2lvbkVudHJ5KSAhPQorCQkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJCVBFTE9HRShsaW1fbG9nCisJCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkJICAgICAgIEZMKCJjb3VsZCBub3QgQWRkIFNUQSB3aXRoIGFzc29jSWQ9JWQiKSwKKwkJCQkJICAgICAgIHBTdGFEcy0+YXNzb2NJZCk7CisJCQkJICAgICAgICkKKwkJCQkvKiBkZWxldGUgdGhlIFRTIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQuICovCisJCQkJLyogc2VuZCB0aGUgcmVzcG9uc2Ugd2l0aCBlcnJvciBzdGF0dXMuICovCisJCQkJaWYgKHBTdGFEcy0+cW9zLmFkZHRzUHJlc2VudCkgeworCQkJCQl0cExpbVRzcGVjSW5mbyBwVHNwZWNJbmZvOworCQkJCQlpZiAoZVNJUl9TVUNDRVNTID09CisJCQkJCSAgICBsaW1fdHNwZWNfZmluZF9ieV9hc3NvY19pZChwTWFjLAorCQkJCQkJICAgICAgIHBTdGFEcy0+YXNzb2NJZCwKKwkJCQkJCSAgICAgICAmcFN0YURzLT5xb3MuYWRkdHMudHNwZWMsCisJCQkJCQkgICAgICAgJnBNYWMtPmxpbS50c3BlY0luZm9bMF0sCisJCQkJCQkgICAgICAgJnBUc3BlY0luZm8pKSB7CisJCQkJCQlsaW1fYWRtaXRfY29udHJvbF9kZWxldGVfdHMocE1hYywKKwkJCQkJCQkJCSAgICBwU3RhRHMtPgorCQkJCQkJCQkJICAgIGFzc29jSWQsCisJCQkJCQkJCQkgICAgJnBTdGFEcy0+CisJCQkJCQkJCQkgICAgcW9zLgorCQkJCQkJCQkJICAgIGFkZHRzLgorCQkJCQkJCQkJICAgIHRzcGVjLgorCQkJCQkJCQkJICAgIHRzaW5mbywKKwkJCQkJCQkJCSAgICBOVUxMLAorCQkJCQkJCQkJICAgICZwVHNwZWNJbmZvLT4KKwkJCQkJCQkJCSAgICBpZHgpOworCQkJCQl9CisJCQkJfQorCQkJCWxpbV9yZWplY3RfYXNzb2NpYXRpb24ocE1hYywKKwkJCQkJCSAgICAgICBwU3RhRHMtPnN0YUFkZHIsCisJCQkJCQkgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LgorCQkJCQkJICAgICAgIHN1YlR5cGUsIHRydWUsCisJCQkJCQkgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LgorCQkJCQkJICAgICAgIGF1dGhUeXBlLCBwU3RhRHMtPmFzc29jSWQsCisJCQkJCQkgICAgICAgdHJ1ZSwKKwkJCQkJCSAgICAgICAodFNpclJlc3VsdENvZGVzKQorCQkJCQkJICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywKKwkJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIkRFTCBTVEEgZmFpbGVkISIpKTsKKwkJc3RhdHVzQ29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisJfQorZW5kOgorCWNkZl9tZW1fZnJlZShwRGVsU3RhUGFyYW1zKTsKKwlsaW1Nc2dRLT5ib2R5cHRyID0gTlVMTDsKKwlpZiAoZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEUgIT0KKwkgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKSB7CisJCWxpbV9wcmVwYXJlX2FuZF9zZW5kX2RlbF9zdGFfY25mKHBNYWMsIHBTdGFEcywgc3RhdHVzQ29kZSwKKwkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKwl9CisJcmV0dXJuOworfQorCit2b2lkIGxpbV9wcm9jZXNzX3N0YV9tbG1fZGVsX3N0YV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EsCisJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKwl0cERlbGV0ZVN0YVBhcmFtcyBwRGVsU3RhUGFyYW1zID0gKHRwRGVsZXRlU3RhUGFyYW1zKSBsaW1Nc2dRLT5ib2R5cHRyOworCXRwRHBoSGFzaE5vZGUgcFN0YURzID0gTlVMTDsKKwlpZiAoTlVMTCA9PSBwRGVsU3RhUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkVuY291bnRlcmVkIE5VTEwgUG9pbnRlciIpKTsKKwkJZ290byBlbmQ7CisJfQorCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gcERlbFN0YVBhcmFtcy0+c3RhdHVzKSB7CisJCXBTdGFEcyA9CisJCQlkcGhfZ2V0X2hhc2hfZW50cnkocE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsCisJCQkJCSAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJaWYgKHBTdGFEcyA9PSBOVUxMKSB7CisJCQkvKiBUT0RPOiBhbnkgcmVzcG9uc2UgdG8gYmUgc2VudCBvdXQgaGVyZSA/ICovCisJCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJEUEggRW50cnkgZm9yIFNUQSAlWCBtaXNzaW5nLiIpLAorCQkJCXBEZWxTdGFQYXJhbXMtPmFzc29jSWQpOworCQkJc3RhdHVzQ29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlpZiAoZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEUgIT0gcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpIHsKKwkJCS8qIFRPRE86IGFueSByZXNwb25zZSB0byBiZSBzZW50IG91dCBoZXJlID8gKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTAorCQkJCQkoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgV01BX0RFTEVURV9TVEFfUlNQIGluIHN0YXRlICVzIiksCisJCQkJbGltX21sbV9zdGF0ZV9zdHIocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpKTsKKwkJCXN0YXR1c0NvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworCQkJZ290byBlbmQ7CisJCX0KKwkJUEVMT0cxKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMSwgRkwoIlNUQSBBc3NvY0lEICVkIE1BQyAiKSwgcFN0YURzLT5hc3NvY0lkKTsKKwkJICAgICAgIGxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIExPRzEpOworCQkgICAgICAgKQorCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgiREVMX1NUQV9SU1AgcmVjZWl2ZWQgZm9yIGFzc29jSUQ6ICVYIiksCisJCQlwRGVsU3RhUGFyYW1zLT5hc3NvY0lkKTsKKwkJLyogd2UgbXVzdCBjb21wbGV0ZSBhbGwgY2xlYW51cCByZWxhdGVkIHRvIGRlbFN0YSBiZWZvcmUgY2FsbGluZyBsaW1EZWxCU1MuICovCisJCWlmICgwICE9IGxpbU1zZ1EtPmJvZHlwdHIpIHsKKwkJCWNkZl9tZW1fZnJlZShwRGVsU3RhUGFyYW1zKTsKKwkJCWxpbU1zZ1EtPmJvZHlwdHIgPSBOVUxMOworCQl9CisJCXN0YXR1c0NvZGUgPQorCQkJKHRTaXJSZXN1bHRDb2RlcykgbGltX2RlbF9ic3MocE1hYywgcFN0YURzLCAwLCBwc2Vzc2lvbkVudHJ5KTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkRFTF9TVEEgZmFpbGVkIGZvciBzdGEgSWQgJWQiKSwKKwkJCXBEZWxTdGFQYXJhbXMtPnN0YUlkeCk7CisJCXN0YXR1c0NvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworCX0KK2VuZDoKKwlpZiAoMCAhPSBsaW1Nc2dRLT5ib2R5cHRyKSB7CisJCWNkZl9tZW1fZnJlZShwRGVsU3RhUGFyYW1zKTsKKwkJbGltTXNnUS0+Ym9keXB0ciA9IE5VTEw7CisJfQorCXJldHVybjsKK30KKwordm9pZCBsaW1fcHJvY2Vzc19hcF9tbG1fYWRkX3N0YV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EsCisJCQkJCSAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdHBBZGRTdGFQYXJhbXMgcEFkZFN0YVBhcmFtcyA9ICh0cEFkZFN0YVBhcmFtcykgbGltTXNnUS0+Ym9keXB0cjsKKwl0cERwaEhhc2hOb2RlIHBTdGFEcyA9IE5VTEw7CisKKwlpZiAoTlVMTCA9PSBwQWRkU3RhUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgYm9keSBwb2ludGVyIGluIG1lc3NhZ2UiKSk7CisJCWdvdG8gZW5kOworCX0KKworCXBTdGFEcyA9CisJCWRwaF9nZXRfaGFzaF9lbnRyeShwTWFjLCBwQWRkU3RhUGFyYW1zLT5hc3NvY0lkLAorCQkJCSAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAocFN0YURzID09IE5VTEwpIHsKKwkJLyogVE9ETzogYW55IHJlc3BvbnNlIHRvIGJlIHNlbnQgb3V0IGhlcmUgPyAqLworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJEUEggRW50cnkgZm9yIFNUQSAlWCBtaXNzaW5nLiIpLAorCQkJcEFkZFN0YVBhcmFtcy0+YXNzb2NJZCk7CisJCWdvdG8gZW5kOworCX0KKwkvKiAqLworCS8qIFRPRE8gJiBGSVhNRV9HRU40ICovCisJLyogTmVlZCB0byBpbnNwZWN0IHRTaXJNc2dRLnJlc2VydmVkIGZvciBhIHZhbGlkIERpYWxvZyB0b2tlbiEgKi8KKwkvKiAqLworCS8qIFRPRE86IGFueSBjaGVjayBmb3IgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA/ICovCisJaWYgKGVMSU1fTUxNX1dUX0FERF9TVEFfUlNQX1NUQVRFICE9IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSkgeworCQkvKiBUT0RPOiBhbnkgcmVzcG9uc2UgdG8gYmUgc2VudCBvdXQgaGVyZSA/ICovCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJSZWNlaXZlZCB1bmV4cGVjdGVkIFdNQV9BRERfU1RBX1JTUCBpbiBzdGF0ZSAlWCIpLAorCQkJcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKTsKKwkJZ290byBlbmQ7CisJfQorCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gcEFkZFN0YVBhcmFtcy0+c3RhdHVzKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkgICAgICAgRkwoIkVycm9yISByY3ZkIGRlbFN0YSByc3AgZnJvbSBIQUwgd2l0aCBzdGF0dXMgJWQiKSwKKwkJCSAgICAgICBwQWRkU3RhUGFyYW1zLT5zdGF0dXMpOworCQkgICAgICAgKQorCQlsaW1fcmVqZWN0X2Fzc29jaWF0aW9uKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwKKwkJCQkgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisJCQkJICAgICAgIHRydWUsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKwkJCQkgICAgICAgcFN0YURzLT5hc3NvY0lkLCB0cnVlLAorCQkJCSAgICAgICAodFNpclJlc3VsdENvZGVzKQorCQkJCSAgICAgICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsCisJCQkJICAgICAgIHBzZXNzaW9uRW50cnkpOworCQlnb3RvIGVuZDsKKwl9CisJcFN0YURzLT5ic3NJZCA9IHBBZGRTdGFQYXJhbXMtPmJzc0lkeDsKKwlwU3RhRHMtPnN0YUluZGV4ID0gcEFkZFN0YVBhcmFtcy0+c3RhSWR4OworCS8qIGlmIHRoZSBBc3NvY1JzcCBmcmFtZSBpcyBub3QgYWNrbm93bGVkZ2VkLCB0aGVuIGtlZXAgYWxpdmUgdGltZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHN0YXRlICovCisJcFN0YURzLT52YWxpZCA9IDE7CisJcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0gZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFOworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIkFkZFN0YVJzcCBTdWNjZXNzLlNUQSBBc3NvY0lEICVkIHN0YUlkICVkIE1BQyAiKSwKKwkJcFN0YURzLT5hc3NvY0lkLCBwU3RhRHMtPnN0YUluZGV4KTsKKwlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcFN0YURzLT5zdGFBZGRyLCBMT0cxKTsKKworCS8qIEZvciBCVEFNUC1BUCwgdGhlIGZsb3cgc2VxdWVuY2Ugc2hhbGwgYmU6CisJICogMSkgUEUgc2VuZHMgZVdOSV9TTUVfQVNTT0NfSU5EIHRvIFNNRQorCSAqIDIpIFBFIHJlY2VpdmVzIGVXTklfU01FX0FTU09DX0NORiBmcm9tIFNNRQorCSAqIDMpIEJUQU1QLUFQIHNlbmRzIFJlL0Fzc29jaWF0aW9uIFJlc3BvbnNlIHRvIEJUQU1QLVNUQQorCSAqLworCWxpbV9zZW5kX21sbV9hc3NvY19pbmQocE1hYywgcFN0YURzLCBwc2Vzc2lvbkVudHJ5KTsKKwkvKiBmYWxsIHRob3VnaCB0byByZWNsYWltIHRoZSBvcmlnaW5hbCBBZGQgU1RBIFJlc3BvbnNlIG1lc3NhZ2UgKi8KK2VuZDoKKwlpZiAoMCAhPSBsaW1Nc2dRLT5ib2R5cHRyKSB7CisJCWNkZl9tZW1fZnJlZShwQWRkU3RhUGFyYW1zKTsKKwkJbGltTXNnUS0+Ym9keXB0ciA9IE5VTEw7CisJfQorCXJldHVybjsKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19hcF9tbG1fYWRkX2Jzc19yc3AoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgYSBXTUFfQUREX0JTU19SU1AgZnJvbSBIQUwuCisgKiBVcG9uIHJlY2VpcHQgb2YgdGhpcyBtZXNzYWdlIGZyb20gSEFMLCBNTE1FIC0KKyAqID4gVmFsaWRhdGVzIHRoZSByZXN1bHQgb2YgV01BX0FERF9CU1NfUkVRCisgKiA+IEluaXQgb3RoZXIgcmVtYWluaW5nIExJTSB2YXJpYWJsZXMKKyAqID4gSW5pdCB0aGUgQUlEIHBvb2wsIGZvciB0aGF0IEJTU0lECisgKiA+IEluaXQgdGhlIFByZS1BVVRIIGxpc3QsIGZvciB0aGF0IEJTU0lECisgKiA+IENyZWF0ZSBMSU0gdGltZXJzLCBzcGVjaWZpYyB0byB0aGF0IEJTU0lECisgKiA+IEluaXQgRFBIIHJlbGF0ZWQgcGFyYW1ldGVycyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGF0IEJTU0lECisgKiA+IFRPRE8gLSBXaGVuIGRvIHdlIGRvIHRoZSBhY3R1YWwgY2hhbmdlIGNoYW5uZWw/CisgKgorICoqKkxPR0lDOgorICogU01FIHNlbmRzIGVXTklfU01FX1NUQVJUX0JTU19SRVEgdG8gTElNCisgKiBMSU0gc2VuZHMgTElNX01MTV9TVEFSVF9SRVEgdG8gTUxNRQorICogTUxNRSBzZW5kcyBXTUFfQUREX0JTU19SRVEgdG8gSEFMCisgKiBIQUwgcmVzcG9uZHMgd2l0aCBXTUFfQUREX0JTU19SU1AgdG8gTUxNRQorICogTUxNRSByZXNwb25kcyB3aXRoIExJTV9NTE1fU1RBUlRfQ05GIHRvIExJTQorICogTElNIHJlc3BvbmRzIHdpdGggZVdOSV9TTUVfU1RBUlRfQlNTX1JTUCB0byBTTUUKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiB0U2lyTXNnUS5ib2R5IGlzIGFsbG9jYXRlZCBieSBNTE1FIGR1cmluZyBsaW1fcHJvY2Vzc19tbG1fc3RhcnRfcmVxCisgKiB0U2lyTXNnUS5ib2R5IHdpbGwgbm93IGJlIGZyZWVkIGJ5IHRoaXMgcm91dGluZQorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgdFNpck1zZ1EgIFRoZSBNc2dRIGhlYWRlciwgd2hpY2ggY29udGFpbnMgdGhlIHJlc3BvbnNlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19hcF9tbG1fYWRkX2Jzc19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EpCit7CisJdExpbU1sbVN0YXJ0Q25mIG1sbVN0YXJ0Q25mOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisJdWludDhfdCBpc1dlcEVuYWJsZWQgPSBmYWxzZTsKKwl0cEFkZEJzc1BhcmFtcyBwQWRkQnNzUGFyYW1zID0gKHRwQWRkQnNzUGFyYW1zKSBsaW1Nc2dRLT5ib2R5cHRyOworCWlmIChOVUxMID09IHBBZGRCc3NQYXJhbXMpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW5jb3VudGVyZWQgTlVMTCBQb2ludGVyIikpOworCQlnb3RvIGVuZDsKKwl9CisJLyogVEJEOiBmcmVlIHRoZSBtZW1vcnkgYmVmb3JlIHJldHVybmluZywgZG8gaXQgZm9yIGFsbCBwbGFjZXMgd2hlcmUgbG9va3VwIGZhaWxzLiAqLworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChwTWFjLAorCQkJCQkgICBwQWRkQnNzUGFyYW1zLT5zZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkIikpOworCQkgICAgICAgKQorCQlpZiAoTlVMTCAhPSBwQWRkQnNzUGFyYW1zKSB7CisJCQljZGZfbWVtX2ZyZWUocEFkZEJzc1BhcmFtcyk7CisJCQlsaW1Nc2dRLT5ib2R5cHRyID0gTlVMTDsKKwkJfQorCQlyZXR1cm47CisJfQorCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICovCisJbWxtU3RhcnRDbmYuc2Vzc2lvbklkID0gcEFkZEJzc1BhcmFtcy0+c2Vzc2lvbklkOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gcEFkZEJzc1BhcmFtcy0+c3RhdHVzKSB7CisJCVBFTE9HMihsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzIsCisJCQkgICAgICAgRkwoIldNQV9BRERfQlNTX1JTUCByZXR1cm5lZCB3aXRoIENERl9TVEFUVVNfU1VDQ0VTUyIpKTsKKwkJICAgICAgICkKKwkJaWYgKGxpbV9zZXRfbGlua19zdGF0ZQorCQkJICAgIChwTWFjLCBlU0lSX0xJTktfQVBfU1RBVEUsIHBzZXNzaW9uRW50cnktPmJzc0lkLAorCQkJICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLAorCQkJICAgIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykKKwkJCWdvdG8gZW5kOworCQkvKiBTZXQgTUxNRSBzdGF0ZSAqLworCQlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFOworCQlwc2Vzc2lvbkVudHJ5LT5jaGFpbk1hc2sgPSBwQWRkQnNzUGFyYW1zLT5jaGFpbk1hc2s7CisJCXBzZXNzaW9uRW50cnktPnNtcHNNb2RlID0gcEFkZEJzc1BhcmFtcy0+c21wc01vZGU7CisJCU1UUkFDRShtYWNfdHJhY2UKKwkJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKSk7CisJCWlmIChlU0lSX0lCU1NfTU9ERSA9PSBwQWRkQnNzUGFyYW1zLT5ic3NUeXBlKSB7CisJCQkvKiogSUJTUyBpcyAnYWN0aXZlJyB3aGVuIHdlIHJlY2VpdmUKKwkJCSAqIEJlYWNvbiBmcmFtZXMgZnJvbSBvdGhlciBTVEFzIHRoYXQgYXJlIHBhcnQgb2Ygc2FtZSBJQlNTLgorCQkJICogTWFyayBpbnRlcm5hbCBzdGF0ZSBhcyBpbmFjdGl2ZSB1bnRpbCB0aGVuLgorCQkJICovCisJCQlwc2Vzc2lvbkVudHJ5LT5saW1JYnNzQWN0aXZlID0gZmFsc2U7CisJCQlwc2Vzc2lvbkVudHJ5LT5zdGF0eXBlRm9yQnNzID0gU1RBX0VOVFJZX1BFRVI7IC8qIHRvIGtub3cgc2Vzc2lvbiBjcmVhdGVkIGZvciBzZWxmL3BlZXIgKi8KKwkJCWxpbVJlc2V0SEJQa3RDb3VudChwc2Vzc2lvbkVudHJ5KTsKKwkJfQorCQlwc2Vzc2lvbkVudHJ5LT5ic3NJZHggPSAodWludDhfdCkgcEFkZEJzc1BhcmFtcy0+YnNzSWR4OworCisJCXBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPSBlTElNX1NUQV9JTl9JQlNTX1JPTEU7CisKKwkJaWYgKGVTSVJfSU5GUkFfQVBfTU9ERSA9PSBwQWRkQnNzUGFyYW1zLT5ic3NUeXBlKQorCQkJcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9IGVMSU1fQVBfUk9MRTsKKwkJZWxzZQorCQkJcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9IGVMSU1fU1RBX0lOX0lCU1NfUk9MRTsKKwkJc2NoX2VkY2FfcHJvZmlsZV91cGRhdGUocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCWxpbV9pbml0X3ByZV9hdXRoX2xpc3QocE1hYyk7CisJCS8qIENoZWNrIHRoZSBTQVAgc2VjdXJpdHkgY29uZmlndXJhdGlvbi5JZiBjb25maWd1cmVkIHRvCisJCSAqIFdFUCB0aGVuIG1heCBjbGllbnRzIHN1cHBvcnRlZCBpcyAxNgorCQkgKi8KKwkJaWYgKHBzZXNzaW9uRW50cnktPnByaXZhY3kpIHsKKwkJCWlmICgocHNlc3Npb25FbnRyeS0+Z1N0YXJ0QnNzUlNOSWUucHJlc2VudCkKKwkJCSAgICB8fCAocHNlc3Npb25FbnRyeS0+Z1N0YXJ0QnNzV1BBSWUucHJlc2VudCkpCisJCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCQlGTCgiV1BBL1dQQTIgU0FQIGNvbmZpZ3VyYXRpb25cbiIpKTsKKwkJCWVsc2UgeworCQkJCWlmIChwTWFjLT5saW0uZ0xpbUFzc29jU3RhTGltaXQgPgorCQkJCSAgICBNQVhfU1VQUE9SVEVEX1BFRVJTX1dFUCkgeworCQkJCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJCQlGTCgiV0VQIFNBUCBDb25maWd1cmF0aW9uXG4iKSk7CisJCQkJCXBNYWMtPmxpbS5nTGltQXNzb2NTdGFMaW1pdCA9CisJCQkJCQlNQVhfU1VQUE9SVEVEX1BFRVJTX1dFUDsKKwkJCQkJaXNXZXBFbmFibGVkID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJbGltX2luaXRfcGVlcl9pZHhwb29sKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCisJCS8qIFN0YXJ0IE9MQkMgdGltZXIgKi8KKwkJaWYgKHR4X3RpbWVyX2FjdGl2YXRlCisJCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1VcGRhdGVPbGJjQ2FjaGVUaW1lcikgIT0KKwkJICAgIFRYX1NVQ0NFU1MpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoInR4X3RpbWVyX2FjdGl2YXRlIGZhaWxlZCIpKTsKKwkJfQorCisJCS8qIEFwcGx5IHByZXZpb3VzbHkgc2V0IGNvbmZpZ3VyYXRpb24gYXQgSFcgKi8KKwkJbGltX2FwcGx5X2NvbmZpZ3VyYXRpb24ocE1hYywgcHNlc3Npb25FbnRyeSk7CisKKwkJLyogSW4gbGltX2FwcGx5X2NvbmZpZ3VyYXRpb24gZ0xpbUFzc29jU3RhTGltaXQgaXMgYXNzaWduZWQgZnJvbSBjZmcuCisJCSAqIFNvIHVwZGF0ZSB0aGUgdmFsdWUgdG8gMTYgaW4gY2FzZSBTb2Z0QVAgaXMgY29uZmlndXJlZCBpbiBXRVAuCisJCSAqLworCQlpZiAoKHBNYWMtPmxpbS5nTGltQXNzb2NTdGFMaW1pdCA+IE1BWF9TVVBQT1JURURfUEVFUlNfV0VQKQorCQkgICAgJiYgKGlzV2VwRW5hYmxlZCkpCisJCQlwTWFjLT5saW0uZ0xpbUFzc29jU3RhTGltaXQgPSBNQVhfU1VQUE9SVEVEX1BFRVJTX1dFUDsKKwkJcHNlc3Npb25FbnRyeS0+c3RhSWQgPSBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YUlkeDsKKwkJbWxtU3RhcnRDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiV01BX0FERF9CU1NfUkVRIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIpLAorCQkJcEFkZEJzc1BhcmFtcy0+c3RhdHVzKTsKKwkJbWxtU3RhcnRDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0hBTF9TRU5EX01FU1NBR0VfRkFJTDsKKwl9CisJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywgTElNX01MTV9TVEFSVF9DTkYsICh1aW50MzJfdCAqKSAmbWxtU3RhcnRDbmYpOworZW5kOgorCWlmICgwICE9IGxpbU1zZ1EtPmJvZHlwdHIpIHsKKwkJY2RmX21lbV9mcmVlKHBBZGRCc3NQYXJhbXMpOworCQlsaW1Nc2dRLT5ib2R5cHRyID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfaWJzc19tbG1fYWRkX2Jzc19yc3AoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgYSBXTUFfQUREX0JTU19SU1AgZnJvbSBIQUwuCisgKiBVcG9uIHJlY2VpcHQgb2YgdGhpcyBtZXNzYWdlIGZyb20gSEFMLCBNTE1FIC0KKyAqID4gVmFsaWRhdGVzIHRoZSByZXN1bHQgb2YgV01BX0FERF9CU1NfUkVRCisgKiA+IEluaXQgb3RoZXIgcmVtYWluaW5nIExJTSB2YXJpYWJsZXMKKyAqID4gSW5pdCB0aGUgQUlEIHBvb2wsIGZvciB0aGF0IEJTU0lECisgKiA+IEluaXQgdGhlIFByZS1BVVRIIGxpc3QsIGZvciB0aGF0IEJTU0lECisgKiA+IENyZWF0ZSBMSU0gdGltZXJzLCBzcGVjaWZpYyB0byB0aGF0IEJTU0lECisgKiA+IEluaXQgRFBIIHJlbGF0ZWQgcGFyYW1ldGVycyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGF0IEJTU0lECisgKiA+IFRPRE8gLSBXaGVuIGRvIHdlIGRvIHRoZSBhY3R1YWwgY2hhbmdlIGNoYW5uZWw/CisgKgorICoqKkxPR0lDOgorICogU01FIHNlbmRzIGVXTklfU01FX1NUQVJUX0JTU19SRVEgdG8gTElNCisgKiBMSU0gc2VuZHMgTElNX01MTV9TVEFSVF9SRVEgdG8gTUxNRQorICogTUxNRSBzZW5kcyBXTUFfQUREX0JTU19SRVEgdG8gSEFMCisgKiBIQUwgcmVzcG9uZHMgd2l0aCBXTUFfQUREX0JTU19SU1AgdG8gTUxNRQorICogTUxNRSByZXNwb25kcyB3aXRoIExJTV9NTE1fU1RBUlRfQ05GIHRvIExJTQorICogTElNIHJlc3BvbmRzIHdpdGggZVdOSV9TTUVfU1RBUlRfQlNTX1JTUCB0byBTTUUKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiB0U2lyTXNnUS5ib2R5IGlzIGFsbG9jYXRlZCBieSBNTE1FIGR1cmluZyBsaW1fcHJvY2Vzc19tbG1fc3RhcnRfcmVxCisgKiB0U2lyTXNnUS5ib2R5IHdpbGwgbm93IGJlIGZyZWVkIGJ5IHRoaXMgcm91dGluZQorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgdFNpck1zZ1EgIFRoZSBNc2dRIGhlYWRlciwgd2hpY2ggY29udGFpbnMgdGhlIHJlc3BvbnNlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorbGltX3Byb2Nlc3NfaWJzc19tbG1fYWRkX2Jzc19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EsCisJCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdExpbU1sbVN0YXJ0Q25mIG1sbVN0YXJ0Q25mOworCXRwQWRkQnNzUGFyYW1zIHBBZGRCc3NQYXJhbXMgPSAodHBBZGRCc3NQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisKKwlpZiAoTlVMTCA9PSBwQWRkQnNzUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgYm9keSBwb2ludGVyIGluIG1lc3NhZ2UiKSk7CisJCWdvdG8gZW5kOworCX0KKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHBBZGRCc3NQYXJhbXMtPnN0YXR1cykgeworCQlQRUxPRzEobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJICAgICAgIEZMKCJXTUFfQUREX0JTU19SU1AgcmV0dXJuZWQgd2l0aCBDREZfU1RBVFVTX1NVQ0NFU1MiKSk7CisJCSAgICAgICApCisJCWlmIChsaW1fc2V0X2xpbmtfc3RhdGUKKwkJCSAgICAocE1hYywgZVNJUl9MSU5LX0lCU1NfU1RBVEUsIHBzZXNzaW9uRW50cnktPmJzc0lkLAorCQkJICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLAorCQkJICAgIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykKKwkJCWdvdG8gZW5kOworCQkvKiBTZXQgTUxNRSBzdGF0ZSAqLworCQlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFOworCQlNVFJBQ0UobWFjX3RyYWNlCisJCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkpOworCQkvKiogSUJTUyBpcyAnYWN0aXZlJyB3aGVuIHdlIHJlY2VpdmUKKwkJICogQmVhY29uIGZyYW1lcyBmcm9tIG90aGVyIFNUQXMgdGhhdCBhcmUgcGFydCBvZiBzYW1lIElCU1MuCisJCSAqIE1hcmsgaW50ZXJuYWwgc3RhdGUgYXMgaW5hY3RpdmUgdW50aWwgdGhlbi4KKwkJICovCisJCXBzZXNzaW9uRW50cnktPmxpbUlic3NBY3RpdmUgPSBmYWxzZTsKKwkJbGltUmVzZXRIQlBrdENvdW50KHBzZXNzaW9uRW50cnkpOworCQlwc2Vzc2lvbkVudHJ5LT5ic3NJZHggPSAodWludDhfdCkgcEFkZEJzc1BhcmFtcy0+YnNzSWR4OworCQlwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9TVEFfSU5fSUJTU19ST0xFOworCQlwc2Vzc2lvbkVudHJ5LT5zdGF0eXBlRm9yQnNzID0gU1RBX0VOVFJZX1NFTEY7CisJCXNjaF9lZGNhX3Byb2ZpbGVfdXBkYXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCQlpZiAoMCA9PSBwc2Vzc2lvbkVudHJ5LT5mcmVlUGVlcklkeEhlYWQpCisJCQlsaW1faW5pdF9wZWVyX2lkeHBvb2wocE1hYywgcHNlc3Npb25FbnRyeSk7CisKKwkJLyogQXBwbHkgcHJldmlvdXNseSBzZXQgY29uZmlndXJhdGlvbiBhdCBIVyAqLworCQlsaW1fYXBwbHlfY29uZmlndXJhdGlvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJcHNlc3Npb25FbnRyeS0+c3RhSWQgPSBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YUlkeDsKKwkJbWxtU3RhcnRDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJCS8qIElmIEFERCBCU1Mgd2FzIGlzc3VlZCBhcyBwYXJ0IG9mIElCU1MgY29hbGVzY2luZywgZG9uJ3Qgc2VuZCB0aGUgbWVzc2FnZSB0byBTTUUsIGFzIHRoYXQgaXMgaW50ZXJuYWwgdG8gTElNICovCisJCWlmICh0cnVlID09IHBNYWMtPmxpbS5nTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZCkgeworCQkJbGltX2lic3NfYWRkX2Jzc19yc3Bfd2hlbl9jb2FsZXNjaW5nKHBNYWMsIGxpbU1zZ1EtPmJvZHlwdHIsCisJCQkJCQkJICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCWdvdG8gZW5kOworCQl9CisJfSBlbHNlIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiV01BX0FERF9CU1NfUkVRIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIpLAorCQkJcEFkZEJzc1BhcmFtcy0+c3RhdHVzKTsKKwkJbWxtU3RhcnRDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0hBTF9TRU5EX01FU1NBR0VfRkFJTDsKKwl9CisJLyogU2VuZCB0aGlzIG1lc3NhZ2UgdG8gU01FLCB3aGVuIEFERF9CU1MgaXMgaW5pdGlhdGVkIGJ5IFNNRSAqLworCS8qIElmIEFERF9CU1MgaXMgZG9uZSBhcyBwYXJ0IG9mIGNvYWxlc2NpbmcsIHRoaXMgd29uJ3QgaGFwcGVuLiAqLworCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICovCisJbWxtU3RhcnRDbmYuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywgTElNX01MTV9TVEFSVF9DTkYsICh1aW50MzJfdCAqKSAmbWxtU3RhcnRDbmYpOworZW5kOgorCWlmICgwICE9IGxpbU1zZ1EtPmJvZHlwdHIpIHsKKwkJY2RmX21lbV9mcmVlKHBBZGRCc3NQYXJhbXMpOworCQlsaW1Nc2dRLT5ib2R5cHRyID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1faGFuZG9mZl9yZXFfaGRsciAtIFByb2Nlc3NlcyBoYW5kb2ZmIHJlcXVlc3QKKyAqIEBtYWNfY3R4OiAgUG9pbnRlciB0byBtYWMgY29udGV4dAorICogQG1zZzogIG1lc3NhZ2Ugc2VudCB0byBIREQKKyAqIEBzZXNzaW9uX2VudHJ5OiBQRSBzZXNzaW9uIGhhbmRsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgYSBXTUFfQUREX0JTU19SU1AgZnJvbSBIQUwuCisgKiBVcG9uIHJlY2VpcHQgb2YgdGhpcyBtZXNzYWdlIGZyb20gSEFMIGlmIHRoZSBzdGF0ZSBpcyBwcmUgYXNzb2MuCisgKgorICogUmV0dXJuOiBOdWxsCisgKi8KK3N0YXRpYyB2b2lkCitsaW1fcHJvY2Vzc19zdGFfYWRkX2Jzc19yc3BfcHJlX2Fzc29jKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdHBTaXJNc2dRIG1zZywgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSkKK3sKKwl0cEFkZEJzc1BhcmFtcyBwQWRkQnNzUGFyYW1zID0gKHRwQWRkQnNzUGFyYW1zKSBtc2ctPmJvZHlwdHI7CisJdEFuaUF1dGhUeXBlIGNmZ0F1dGhUeXBlLCBhdXRoTW9kZTsKKwl0TGltTWxtQXV0aFJlcSAqcE1sbUF1dGhSZXE7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworCisJaWYgKE5VTEwgPT0gcEFkZEJzc1BhcmFtcykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJJbnZhbGlkIGJvZHkgcG9pbnRlciBpbiBtZXNzYWdlIikpOworCQlnb3RvIGpvaW5GYWlsdXJlOworCX0KKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHBBZGRCc3NQYXJhbXMtPnN0YXR1cykgeworCQlwU3RhRHMgPSBkcGhfYWRkX2hhc2hfZW50cnkobWFjX2N0eCwKKwkJCQlwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YU1hYywKKwkJCQlEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCQkmc2Vzc2lvbl9lbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCWlmIChwU3RhRHMgPT0gTlVMTCkgeworCQkJLyogQ291bGQgbm90IGFkZCBoYXNoIHRhYmxlIGVudHJ5ICovCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoImNvdWxkIG5vdCBhZGQgaGFzaCBlbnRyeSBhdCBEUEggZm9yICIpKTsKKwkJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LAorCQkJCXBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhTWFjLCBMT0dFKTsKKwkJCWdvdG8gam9pbkZhaWx1cmU7CisJCX0KKwkJc2Vzc2lvbl9lbnRyeS0+YnNzSWR4ID0gKHVpbnQ4X3QpIHBBZGRCc3NQYXJhbXMtPmJzc0lkeDsKKwkJLyogU3VjY2VzcywgaGFuZGxlIGJlbG93ICovCisJCXBTdGFEcy0+YnNzSWQgPSBwQWRkQnNzUGFyYW1zLT5ic3NJZHg7CisJCS8qIFNUQSBJbmRleChnZW5yIGJ5IEhBTCkgZm9yIHRoZSBCU1MgZW50cnkgaXMgc3RvcmVkIGhlcmUgKi8KKwkJcFN0YURzLT5zdGFJbmRleCA9IHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhSWR4OworCQkvKiBUcmlnZ2VyIEF1dGhlbnRpY2F0aW9uIHdpdGggQVAgKi8KKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFLAorCQkJKHVpbnQzMl90ICopICZjZmdBdXRoVHlwZSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkvKgorCQkJICogQ291bGQgbm90IGdldCBBdXRoVHlwZSBmcm9tIENGRy4KKwkJCSAqIExvZyBlcnJvci4KKwkJCSAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBBdXRoVHlwZSIpKTsKKwkJfQorCQkvKiBUcnkgT3BlbiBBdXRoZW50aWNhdGlvbiBmaXJzdCAqLworCQlpZiAoY2ZnQXV0aFR5cGUgPT0gZVNJUl9BVVRPX1NXSVRDSCkKKwkJCWF1dGhNb2RlID0gZVNJUl9PUEVOX1NZU1RFTTsKKwkJZWxzZQorCQkJYXV0aE1vZGUgPSBjZmdBdXRoVHlwZTsKKworCQkvKiBUcmlnZ2VyIE1BQyBiYXNlZCBBdXRoZW50aWNhdGlvbiAqLworCQlwTWxtQXV0aFJlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0TGltTWxtQXV0aFJlcSkpOworCQlpZiAoTlVMTCA9PSBwTWxtQXV0aFJlcSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJBbGxvY2F0ZSBNZW1vcnkgZmFpbGVkIGZvciBtbG1BdXRoUmVxIikpOworCQkJcmV0dXJuOworCQl9CisJCXNpcl9jb3B5X21hY19hZGRyKHBNbG1BdXRoUmVxLT5wZWVyTWFjQWRkciwKKwkJCXNlc3Npb25fZW50cnktPmJzc0lkKTsKKworCQlwTWxtQXV0aFJlcS0+YXV0aFR5cGUgPSBhdXRoTW9kZTsKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwKKwkJCVdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVCwKKwkJCSh1aW50MzJfdCAqKSAmcE1sbUF1dGhSZXEtPmF1dGhGYWlsdXJlVGltZW91dCkKKwkJCSE9IGVTSVJfU1VDQ0VTUykgeworCQkJLyoKKwkJCSAqIENvdWxkIG5vdCBnZXQgQXV0aEZhaWx1cmVUaW1lb3V0CisJCQkgKiB2YWx1ZSBmcm9tIENGRy4gTG9nIGVycm9yLgorCQkJICovCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJRkwoIkZhaWw6IHJldHJpZXZlIEF1dGhGYWlsdXJlVGltZW91dCB2YWx1ZSIpKTsKKwkJfQorCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0pPSU5FRF9TVEFURTsKKwkJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX01MTV9TVEFURSwKKwkJCXNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkLCBlTElNX01MTV9KT0lORURfU1RBVEUpKTsKKwkJcE1sbUF1dGhSZXEtPnNlc3Npb25JZCA9IHNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkOworCQlzZXNzaW9uX2VudHJ5LT5saW1QcmV2U21lU3RhdGUgPSBzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZTsKKwkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9BVVRIX1NUQVRFOworCQkvKiByZW1lbWJlciBzdGFJZCBpbiBjYXNlIG9mIGFzc29jIHRpbWVvdXQvZmFpbHVyZSBoYW5kbGluZyAqLworCQlzZXNzaW9uX2VudHJ5LT5zdGFJZCA9IHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhSWR4OworCisJCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsCisJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJCXNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlKSk7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJTZXNzaW9uSWQ6JWQgbGltX3Bvc3RfbWxtX21lc3NhZ2UgIgorCQkJIkxJTV9NTE1fQVVUSF9SRVEgd2l0aCBsaW1TbWVTdGF0ZTolZCIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsIHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlKTsKKwkJbGltX3Bvc3RfbWxtX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9BVVRIX1JFUSwKKwkJCSh1aW50MzJfdCAqKSBwTWxtQXV0aFJlcSk7CisJCXJldHVybjsKKwl9CisKK2pvaW5GYWlsdXJlOgorCXsKKwkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEU7CisJCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsCisJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJCXNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlKSk7CisKKwkJLyogU2VuZCBKb2luIHJlc3BvbnNlIHRvIEhvc3QgKi8KKwkJbGltX2hhbmRsZV9zbWVfam9pbl9yZXN1bHQobWFjX2N0eCwgZVNJUl9TTUVfUkVGVVNFRCwKKwkJCWVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywgc2Vzc2lvbl9lbnRyeSk7CisJfQorCit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbiB0byBoYW5kbGUgV01BX0FERF9CU1NfUlNQLCBpbiBGVCByZWFzc29jIHN0YXRlLgorICogRnVuY3Rpb24gdG8gU2VuZCBSZUFzc29jaWF0aW9uIFJlcXVlc3QuCisgKgorICoKKyAqKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitsaW1fcHJvY2Vzc19zdGFfbWxtX2FkZF9ic3NfcnNwX2Z0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRLAorCQkJCSAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdExpbU1sbVJlYXNzb2NDbmYgbWxtUmVhc3NvY0NuZjsgLyoga2VlcCBzbWUgKi8KKwl0cERwaEhhc2hOb2RlIHBTdGFEcyA9IE5VTEw7CisJdHBBZGRTdGFQYXJhbXMgcEFkZFN0YVBhcmFtcyA9IE5VTEw7CisJdWludDMyX3QgbGlzdGVuSW50ZXJ2YWwgPSBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTF9TVEFERUY7CisJdHBBZGRCc3NQYXJhbXMgcEFkZEJzc1BhcmFtcyA9ICh0cEFkZEJzc1BhcmFtcykgbGltTXNnUS0+Ym9keXB0cjsKKwl1aW50MzJfdCBzZWxmU3RhRG90MTFNb2RlID0gMDsKKworCS8qIFNhbml0eSBDaGVja3MgKi8KKworCWlmIChwQWRkQnNzUGFyYW1zID09IE5VTEwpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgcGFyYW1ldGVycyIpKTspCisJCWdvdG8gZW5kOworCX0KKwlpZiAoZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfRlRfUkVBU1NPQ19TVEFURSAhPQorCSAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkgeworCQlnb3RvIGVuZDsKKwl9CisKKwlwU3RhRHMgPSBkcGhfYWRkX2hhc2hfZW50cnkocE1hYywgcEFkZEJzc1BhcmFtcy0+YnNzSWQsCisJCQkJCURQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLAorCQkJCQkmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKHBTdGFEcyA9PSBOVUxMKSB7CisJCS8qIENvdWxkIG5vdCBhZGQgaGFzaCB0YWJsZSBlbnRyeSAqLworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IGFkZCBoYXNoIGVudHJ5IGF0IERQSCBmb3IgIikpOworCQkgICAgICAgKQorCQlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFNYWMsCisJCQkJICAgTE9HRSk7CisJCWdvdG8gZW5kOworCX0KKwkvKiBQcmVwYXJlIGFuZCBzZW5kIFJlYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZSAqLworCS8qIHN0YXJ0IHJlYXNzb2MgdGltZXIuICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmIChwc2Vzc2lvbkVudHJ5LT5iUm9hbVN5bmNoSW5Qcm9ncmVzcyAhPSB0cnVlKSB7CisjZW5kaWYKKwlwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZWFzc29jRmFpbHVyZVRpbWVyLnNlc3Npb25JZCA9CisJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCS8qIC8gU3RhcnQgcmVhc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyICovCisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsCisJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgZUxJTV9SRUFTU09DX0ZBSUxfVElNRVIpKTsKKwlpZiAodHhfdGltZXJfYWN0aXZhdGUKKwkJICAgICgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVhc3NvY0ZhaWx1cmVUaW1lcikKKwkgICAgIT0gVFhfU1VDQ0VTUykgeworCQkvKiAvIENvdWxkIG5vdCBzdGFydCByZWFzc29jIGZhaWx1cmUgdGltZXIuICovCisJCS8qIExvZyBlcnJvciAqLworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgiY291bGQgbm90IHN0YXJ0IFJlYXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lciIpKTsKKwkJLyogUmV0dXJuIFJlYXNzb2MgY29uZmlybSB3aXRoICovCisJCS8qIFJlc291cmNlcyBVbmF2YWlsYWJsZSAqLworCQltbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPQorCQkJZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQltbG1SZWFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0KKwkJCWVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKwkJZ290byBlbmQ7CisJfQorI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCXBNYWMtPmxpbS5wU2Vzc2lvbkVudHJ5ID0gcHNlc3Npb25FbnRyeTsKKwlpZiAoTlVMTCA9PSBwTWFjLT5saW0ucFNlc3Npb25FbnRyeS0+cExpbU1sbVJlYXNzb2NSZXRyeVJlcSkgeworCQkvKiBUYWtlIGEgY29weSBvZiByZWFzc29jIHJlcXVlc3QgZm9yIHJldHJ5aW5nICovCisJCXBNYWMtPmxpbS5wU2Vzc2lvbkVudHJ5LT5wTGltTWxtUmVhc3NvY1JldHJ5UmVxID0KKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0TGltTWxtUmVhc3NvY1JlcSkpOworCQlpZiAoTlVMTCA9PQorCQkgICAgcE1hYy0+bGltLnBTZXNzaW9uRW50cnktPnBMaW1NbG1SZWFzc29jUmV0cnlSZXEpCisJCQlnb3RvIGVuZDsKKwkJY2RmX21lbV9zZXQocE1hYy0+bGltLnBTZXNzaW9uRW50cnktPgorCQkJICAgIHBMaW1NbG1SZWFzc29jUmV0cnlSZXEsCisJCQkgICAgc2l6ZW9mKHRMaW1NbG1SZWFzc29jUmVxKSwgMCk7CisJCWNkZl9tZW1fY29weShwTWFjLT5saW0ucFNlc3Npb25FbnRyeS0+CisJCQkgICAgIHBMaW1NbG1SZWFzc29jUmV0cnlSZXEsCisJCQkgICAgIHBzZXNzaW9uRW50cnktPnBMaW1NbG1SZWFzc29jUmVxLAorCQkJICAgICBzaXplb2YodExpbU1sbVJlYXNzb2NSZXEpKTsKKwl9CisJcE1hYy0+bGltLnJlQXNzb2NSZXRyeUF0dGVtcHQgPSAwOworI2VuZGlmCisJbGltX3NlbmRfcmVhc3NvY19yZXFfd2l0aF9mdF9pZXNfbWdtdF9mcmFtZShwTWFjLAorCQkJCQkJICAgIHBzZXNzaW9uRW50cnktPgorCQkJCQkJICAgIHBMaW1NbG1SZWFzc29jUmVxLAorCQkJCQkJICAgIHBzZXNzaW9uRW50cnkpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKK30gZWxzZSB7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJICAiTEZSMzpEbyBub3QgYWN0aXZhdGUgdGltZXIgYW5kIGRvbnQgc2VuZCB0aGUgcmVhc3NvYyByZXEiKTsKK30KKyNlbmRpZgorCXBzZXNzaW9uRW50cnktPmxpbVByZXZNbG1TdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlOworCXBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfRlRfUkVBU1NPQ19SU1BfU1RBVEU7CisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJICAgICAgIGVMSU1fTUxNX1dUX0ZUX1JFQVNTT0NfUlNQX1NUQVRFKSk7CisJUEVMT0dFKGxpbV9sb2cKKwkJICAgICAgIChwTWFjLCBMT0cxLCBGTCgiU2V0IHRoZSBtbG0gc3RhdGUgdG8gJWQgc2Vzc2lvbj0lZCIpLAorCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKwkgICAgICAgKQorCisJcHNlc3Npb25FbnRyeS0+YnNzSWR4ID0gKHVpbnQ4X3QpIHBBZGRCc3NQYXJhbXMtPmJzc0lkeDsKKworCS8qIFN1Y2Nlc3MsIGhhbmRsZSBiZWxvdyAqLworCXBTdGFEcy0+YnNzSWQgPSBwQWRkQnNzUGFyYW1zLT5ic3NJZHg7CisJLyogU1RBIEluZGV4KGdlbnIgYnkgSEFMKSBmb3IgdGhlIEJTUyBlbnRyeSBpcyBzdG9yZWQgaGVyZSAqLworCXBTdGFEcy0+c3RhSW5kZXggPSBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YUlkeDsKKwlwU3RhRHMtPnVjVWNhc3RTaWcgPSBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnVjVWNhc3RTaWc7CisJcFN0YURzLT51Y0JjYXN0U2lnID0gcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51Y0JjYXN0U2lnOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJcnJtX2NhY2hlX21nbXRfdHhfcG93ZXIocE1hYywgcEFkZEJzc1BhcmFtcy0+dHhNZ210UG93ZXIsIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisKKwlwQWRkU3RhUGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBZGRTdGFQYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBwQWRkU3RhUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBBRERfU1RBIikpOworCQlnb3RvIGVuZDsKKwl9CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcEFkZFN0YVBhcmFtcywgc2l6ZW9mKHRBZGRTdGFQYXJhbXMpLCAwKTsKKworCS8qIC8gQWRkIFNUQSBjb250ZXh0IGF0IE1BQyBIVyAoQk1VLCBSSFAgJiBURlApICovCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBBZGRTdGFQYXJhbXMtPnN0YU1hYywKKwkJICAgICAodWludDhfdCAqKSBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwQWRkU3RhUGFyYW1zLT5ic3NJZCwKKwkJICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlwQWRkU3RhUGFyYW1zLT5zdGFUeXBlID0gU1RBX0VOVFJZX1NFTEY7CisJcEFkZFN0YVBhcmFtcy0+c3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXBBZGRTdGFQYXJhbXMtPnJlc3BSZXFkID0gMTsKKworCS8qIFVwZGF0ZSAgUEUgc2Vzc2lvbiBJRCAqLworCXBBZGRTdGFQYXJhbXMtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCXBBZGRTdGFQYXJhbXMtPnNtZXNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCS8qIFRoaXMgd2lsbCBpbmRpY2F0ZSBIQUwgdG8gImFsbG9jYXRlIiBhIG5ldyBTVEEgaW5kZXggKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJaWYgKHBzZXNzaW9uRW50cnktPmJSb2FtU3luY2hJblByb2dyZXNzICE9IHRydWUpCisjZW5kaWYKKwlwQWRkU3RhUGFyYW1zLT5zdGFJZHggPSBTVEFfSU5WQUxJRF9JRFg7CisJcEFkZFN0YVBhcmFtcy0+dXBkYXRlU3RhID0gZmFsc2U7CisKKwlwQWRkU3RhUGFyYW1zLT5zaG9ydFByZWFtYmxlU3VwcG9ydGVkID0KKwkJKHVpbnQ4X3QpIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWxpbV9wb3B1bGF0ZV9wZWVyX3JhdGVfc2V0KHBNYWMsICZwQWRkU3RhUGFyYW1zLT5zdXBwb3J0ZWRSYXRlcywgTlVMTCwKKwkJCQkgICBmYWxzZSwgcHNlc3Npb25FbnRyeSwgTlVMTCk7CisjZWxzZQorCWxpbV9wb3B1bGF0ZV9wZWVyX3JhdGVfc2V0KHBNYWMsICZwQWRkU3RhUGFyYW1zLT5zdXBwb3J0ZWRSYXRlcywgTlVMTCwKKwkJCQkgICBmYWxzZSwgcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKworCWlmIChwc2Vzc2lvbkVudHJ5LT5odENhcGFiaWxpdHkpIHsKKwkJcEFkZFN0YVBhcmFtcy0+aHRDYXBhYmxlID0gcHNlc3Npb25FbnRyeS0+aHRDYXBhYmlsaXR5OworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJCXBBZGRTdGFQYXJhbXMtPnZodENhcGFibGUgPSBwc2Vzc2lvbkVudHJ5LT52aHRDYXBhYmlsaXR5OworCQlwQWRkU3RhUGFyYW1zLT5jaF93aWR0aCA9IHBzZXNzaW9uRW50cnktPmNoX3dpZHRoOworI2VuZGlmCisKKwkJcEFkZFN0YVBhcmFtcy0+Z3JlZW5GaWVsZENhcGFibGUgPQorCQkJbGltX2dldF9odF9jYXBhYmlsaXR5KHBNYWMsIGVIVF9HUkVFTkZJRUxELAorCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJcEFkZFN0YVBhcmFtcy0+bWltb1BTID0KKwkJCWxpbV9nZXRfaHRfY2FwYWJpbGl0eShwTWFjLCBlSFRfTUlNT19QT1dFUl9TQVZFLAorCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJcEFkZFN0YVBhcmFtcy0+cmlmc01vZGUgPQorCQkJbGltX2dldF9odF9jYXBhYmlsaXR5KHBNYWMsIGVIVF9SSUZTX01PREUsIHBzZXNzaW9uRW50cnkpOworCQlwQWRkU3RhUGFyYW1zLT5sc2lnVHhvcFByb3RlY3Rpb24gPQorCQkJbGltX2dldF9odF9jYXBhYmlsaXR5KHBNYWMsIGVIVF9MU0lHX1RYT1BfUFJPVEVDVElPTiwKKwkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisJCXBBZGRTdGFQYXJhbXMtPm1heEFtcGR1RGVuc2l0eSA9CisJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkocE1hYywgZUhUX01QRFVfREVOU0lUWSwgcHNlc3Npb25FbnRyeSk7CisJCXBBZGRTdGFQYXJhbXMtPm1heEFtcGR1U2l6ZSA9CisJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkocE1hYywgZUhUX01BWF9SWF9BTVBEVV9GQUNUT1IsCisJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQlwQWRkU3RhUGFyYW1zLT5tYXhBbXNkdVNpemUgPQorCQkJbGltX2dldF9odF9jYXBhYmlsaXR5KHBNYWMsIGVIVF9NQVhfQU1TRFVfTEVOR1RILAorCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJcEFkZFN0YVBhcmFtcy0+ZkRzc3NDY2tNb2RlNDBNaHogPQorCQkJbGltX2dldF9odF9jYXBhYmlsaXR5KHBNYWMsIGVIVF9EU1NTX0NDS19NT0RFXzQwTUhaLAorCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJcEFkZFN0YVBhcmFtcy0+ZlNob3J0R0kyME1oeiA9CisJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkocE1hYywgZUhUX1NIT1JUX0dJXzIwTUhaLCBwc2Vzc2lvbkVudHJ5KTsKKwkJcEFkZFN0YVBhcmFtcy0+ZlNob3J0R0k0ME1oeiA9CisJCQlsaW1fZ2V0X2h0X2NhcGFiaWxpdHkocE1hYywgZUhUX1NIT1JUX0dJXzQwTUhaLCBwc2Vzc2lvbkVudHJ5KTsKKwl9CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTCwgJmxpc3RlbkludGVydmFsKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkNvdWxkbid0IGdldCBMSVNURU5fSU5URVJWQUwiKSk7CisJcEFkZFN0YVBhcmFtcy0+bGlzdGVuSW50ZXJ2YWwgPSAodWludDE2X3QpIGxpc3RlbkludGVydmFsOworCisJd2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0RPVDExX01PREUsICZzZWxmU3RhRG90MTFNb2RlKTsKKwlwQWRkU3RhUGFyYW1zLT5zdXBwb3J0ZWRSYXRlcy5vcFJhdGVNb2RlID0KKwkJbGltX2dldF9zdGFfcmF0ZV9tb2RlKCh1aW50OF90KSBzZWxmU3RhRG90MTFNb2RlKTsKKwlwQWRkU3RhUGFyYW1zLT5lbmNyeXB0VHlwZSA9IHBzZXNzaW9uRW50cnktPmVuY3J5cHRUeXBlOworCXBBZGRTdGFQYXJhbXMtPm1heFR4UG93ZXIgPSBwc2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyOworCisJLyogTGV0cyBzYXZlIHRoaXMgZm9yIHdoZW4gd2UgcmVjZWl2ZSB0aGUgUmVhc3NvYyBSc3AgKi8KKwlwc2Vzc2lvbkVudHJ5LT5mdFBFQ29udGV4dC5wQWRkU3RhUmVxID0gcEFkZFN0YVBhcmFtczsKKworCWlmIChwQWRkQnNzUGFyYW1zICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHBBZGRCc3NQYXJhbXMpOworCQlwQWRkQnNzUGFyYW1zID0gTlVMTDsKKwkJbGltTXNnUS0+Ym9keXB0ciA9IE5VTEw7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlpZiAocHNlc3Npb25FbnRyeS0+YlJvYW1TeW5jaEluUHJvZ3Jlc3MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSAgIkxGUjM6UHJlcGFyZSBhbmQgc2F2ZSBwQWRkU3RhUmVxIGluIHBNYWMgZm9yIHBvc3QtYXNzb2MtcnNwIik7CisJCWxpbV9wcm9jZXNzX2Fzc29jX3JzcF9mcmFtZShwTWFjLCBwTWFjLT5yb2FtLnBSZWFzc29jUmVzcCwKKwkJCQkJICAgIExJTV9SRUFTU09DLCBwc2Vzc2lvbkVudHJ5KTsKKwl9CisjZW5kaWYKKwlyZXR1cm47CisKK2VuZDoKKwkvKiBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIHJlYXNzb2NSZXEgKi8KKwlpZiAocHNlc3Npb25FbnRyeSAhPSBOVUxMKQorCQlpZiAocHNlc3Npb25FbnRyeS0+cExpbU1sbVJlYXNzb2NSZXEgIT0gTlVMTCkgeworCQkJY2RmX21lbV9mcmVlKHBzZXNzaW9uRW50cnktPnBMaW1NbG1SZWFzc29jUmVxKTsKKwkJCXBzZXNzaW9uRW50cnktPnBMaW1NbG1SZWFzc29jUmVxID0gTlVMTDsKKwkJfQorCisJaWYgKHBBZGRCc3NQYXJhbXMgIT0gTlVMTCkgeworCQljZGZfbWVtX2ZyZWUocEFkZEJzc1BhcmFtcyk7CisJCXBBZGRCc3NQYXJhbXMgPSBOVUxMOworCQlsaW1Nc2dRLT5ib2R5cHRyID0gTlVMTDsKKwl9CisKKwltbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9GVF9SRUFTU09DX0ZBSUxVUkU7CisJbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJZCAqLworCWlmIChwc2Vzc2lvbkVudHJ5ICE9IE5VTEwpCisJCW1sbVJlYXNzb2NDbmYuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisJZWxzZQorCQltbG1SZWFzc29jQ25mLnNlc3Npb25JZCA9IDA7CisKKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShwTWFjLCBMSU1fTUxNX1JFQVNTT0NfQ05GLAorCQkJICAgICAodWludDMyX3QgKikgJm1sbVJlYXNzb2NDbmYpOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisvKioKKyAqIGxpbV9wcm9jZXNzX3N0YV9tbG1fYWRkX2Jzc19yc3AoKSAtIFByb2Nlc3MgQUREIEJTUyByZXNwb25zZQorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2c6IFRoZSBNc2dRIGhlYWRlciwgd2hpY2ggY29udGFpbnMgdGhlIHJlc3BvbnNlIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgYSBXTUFfQUREX0JTU19SU1AgZnJvbSBIQUwuCisgKiBVcG9uIHJlY2VpcHQgb2YgdGhpcyBtZXNzYWdlIGZyb20gSEFMLCBNTE1FIC0KKyAqID4gVmFsaWRhdGVzIHRoZSByZXN1bHQgb2YgV01BX0FERF9CU1NfUkVRCisgKiA+IE5vdywgc2VuZCBhbiBBRERfU1RBIHRvIEhBTCBhbmQgQUREIHRoZSAibG9jYWwiIFNUQSBpdHNlbGYKKyAqCisgKiBNTE1FIGhhZCBzZW50IFdNQV9BRERfQlNTX1JFUSB0byBIQUwKKyAqIEhBTCByZXNwb25kZWQgd2l0aCBXTUFfQUREX0JTU19SU1AgdG8gTUxNRQorICogTUxNRSBub3cgc2VuZHMgV01BX0FERF9TVEFfUkVRIHRvIEhBTAorICogQVNTVU1QVElPTlM6CisgKiB0U2lyTXNnUS5ib2R5IGlzIGFsbG9jYXRlZCBieSBNTE1FIGR1cmluZyBsaW1fcHJvY2Vzc19tbG1fam9pbl9yZXEKKyAqIHRTaXJNc2dRLmJvZHkgd2lsbCBub3cgYmUgZnJlZWQgYnkgdGhpcyByb3V0aW5lCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitsaW1fcHJvY2Vzc19zdGFfbWxtX2FkZF9ic3NfcnNwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdHBTaXJNc2dRIG1zZywgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSkKK3sKKwl0cEFkZEJzc1BhcmFtcyBhZGRfYnNzX3BhcmFtcyA9ICh0cEFkZEJzc1BhcmFtcykgbXNnLT5ib2R5cHRyOworCXRMaW1NbG1Bc3NvY0NuZiBtbG1fYXNzb2NfY25mOworCXVpbnQzMl90IG1zZ190eXBlID0gTElNX01MTV9BU1NPQ19DTkY7CisJdWludDMyX3Qgc3ViX3R5cGUgPSBMSU1fQVNTT0M7CisJdHBEcGhIYXNoTm9kZSBzdGFfZHMgPSBOVUxMOworCXVpbnQxNl90IHN0YV9pZHggPSBTVEFfSU5WQUxJRF9JRFg7CisJdWludDhfdCB1cGRhdGVfc3RhID0gZmFsc2U7CisJbWxtX2Fzc29jX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKworCWlmIChlTElNX01MTV9XVF9BRERfQlNTX1JTUF9QUkVBU1NPQ19TVEFURSA9PQorCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkiU2Vzc2lvbklkOiVkIGxpbV9wcm9jZXNzX3N0YV9hZGRfYnNzX3JzcF9wcmVfYXNzb2MiLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQpOworCQlsaW1fcHJvY2Vzc19zdGFfYWRkX2Jzc19yc3BfcHJlX2Fzc29jKG1hY19jdHgsIG1zZywKKwkJCXNlc3Npb25fZW50cnkpOworCQlnb3RvIGVuZDsKKwl9CisJaWYgKGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1JFQVNTT0NfU1RBVEUgPT0gc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUKKyNpZiBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwkJfHwgKGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0ZUX1JFQVNTT0NfU1RBVEUgPT0KKwkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUpCisjZW5kaWYKKwkpIHsKKwkJbXNnX3R5cGUgPSBMSU1fTUxNX1JFQVNTT0NfQ05GOworCQlzdWJfdHlwZSA9IExJTV9SRUFTU09DOworCQkvKgorCQkgKiBJZiBSZWFzc29jIGlzIGhhcHBlbmluZyBmb3IgdGhlIHNhbWUgQlNTLCB0aGVuCisJCSAqIHVzZSB0aGUgZXhpc3RpbmcgU3RhSWQgYW5kIGluZGljYXRlIHRvIEhBTCB0byB1cGRhdGUKKwkJICogdGhlIGV4aXN0aW5nIFNUQSBlbnRyeS4KKwkJICogSWYgUmVhc3NvYyBpcyBoYXBwZW5pbmcgZm9yIHRoZSBuZXcgQlNTLCB0aGVuCisJCSAqIG9sZCBCU1MgYW5kIFNUQSBlbnRyeSB3b3VsZCBoYXZlIGJlZW4gYWxyZWFkeSBkZWxldGVkCisJCSAqIGJlZm9yZSBQRSB0cmllcyB0byBhZGQgQlNTIGZvciB0aGUgbmV3IEJTUywgc28gc2V0IHRoZQorCQkgKiB1cGRhdGVTdGEgdG8gZmFsc2UgYW5kIHBhc3MgSU5WQUxJRCBTVEEgSW5kZXguCisJCSAqLworCQlpZiAoc2lyX2NvbXBhcmVfbWFjX2FkZHIoc2Vzc2lvbl9lbnRyeS0+YnNzSWQsCisJCQlzZXNzaW9uX2VudHJ5LT5saW1SZUFzc29jYnNzSWQpKSB7CisJCQlzdGFfaWR4ID0gc2Vzc2lvbl9lbnRyeS0+c3RhSWQ7CisJCQl1cGRhdGVfc3RhID0gdHJ1ZTsKKwkJfQorCX0KKworCWlmIChhZGRfYnNzX3BhcmFtcyA9PSAwKQorCQlnb3RvIGVuZDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJaWYgKHNlc3Npb25fZW50cnktPmJSb2FtU3luY2hJblByb2dyZXNzKQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJIkxGUjM6bGltX3Byb2Nlc3Nfc3RhX21sbV9hZGRfYnNzX3JzcCIpOworI2VuZGlmCisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IGFkZF9ic3NfcGFyYW1zLT5zdGF0dXMpIHsKKyNpZiBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwkJaWYgKGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0ZUX1JFQVNTT0NfU1RBVEUgPT0KKwkJCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlKSB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIk1sbT0lZCAlZCIpLAorCQkJCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlLAorCQkJCWVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1JFQVNTT0NfU1RBVEUpOworI2VuZGlmCisJCQlsaW1fcHJvY2Vzc19zdGFfbWxtX2FkZF9ic3NfcnNwX2Z0KG1hY19jdHgsIG1zZywKKwkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJCWdvdG8gZW5kOworCQl9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworCQkvKiBTZXQgTUxNRSBzdGF0ZSAqLworCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FERF9TVEFfUlNQX1NUQVRFOworCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfTUxNX1NUQVRFLAorCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSkpOworCQkvKiB0byBrbm93IHRoZSBzZXNzaW9uICBzdGFydGVkIGZvciBzZWxmIG9yIGZvciAgcGVlciAgKi8KKwkJc2Vzc2lvbl9lbnRyeS0+c3RhdHlwZUZvckJzcyA9IFNUQV9FTlRSWV9QRUVSOworCQkvKiBOb3csIHNlbmQgV01BX0FERF9TVEFfUkVRICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJTZXNzaW9uSWQ6JWQgT24gU1RBOiBBRERfQlNTIHdhcyBzdWNjZXNzZnVsIiksCisJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCk7CisJCXN0YV9kcyA9CisJCQlkcGhfZ2V0X2hhc2hfZW50cnkobWFjX2N0eCwgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsCisJCQkJJnNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQlpZiAoc3RhX2RzID09IE5VTEwpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiU2Vzc2lvbjolZCBGYWlsIHRvIGFkZCBTZWxmIEVudHJ5IGZvciBTVEEiKSwKKwkJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCk7CisJCQltbG1fYXNzb2NfY25mLnJlc3VsdENvZGUgPQorCQkJCSh0U2lyUmVzdWx0Q29kZXMpIGVTSVJfU01FX1JFRlVTRUQ7CisJCX0gZWxzZSB7CisJCQlzZXNzaW9uX2VudHJ5LT5ic3NJZHggPQorCQkJCSh1aW50OF90KSBhZGRfYnNzX3BhcmFtcy0+YnNzSWR4OworCQkJLyogU3VjY2VzcywgaGFuZGxlIGJlbG93ICovCisJCQlzdGFfZHMtPmJzc0lkID0gYWRkX2Jzc19wYXJhbXMtPmJzc0lkeDsKKwkJCS8qCisJCQkgKiBTVEEgSW5kZXgoZ2VuciBieSBIQUwpIGZvciB0aGUgQlNTCisJCQkgKiBlbnRyeSBpcyBzdG9yZWQgaGVyZQorCQkJKi8KKwkJCXN0YV9kcy0+c3RhSW5kZXggPSBhZGRfYnNzX3BhcmFtcy0+c3RhQ29udGV4dC5zdGFJZHg7CisJCQlzdGFfZHMtPnVjVWNhc3RTaWcgPQorCQkJCWFkZF9ic3NfcGFyYW1zLT5zdGFDb250ZXh0LnVjVWNhc3RTaWc7CisJCQlzdGFfZHMtPnVjQmNhc3RTaWcgPQorCQkJCWFkZF9ic3NfcGFyYW1zLT5zdGFDb250ZXh0LnVjQmNhc3RTaWc7CisJCQkvKiBEb3duZ3JhZGUgdGhlIEVEQ0EgcGFyYW1ldGVycyBpZiBuZWVkZWQgKi8KKwkJCWxpbV9zZXRfYWN0aXZlX2VkY2FfcGFyYW1zKG1hY19jdHgsCisJCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbUVkY2FQYXJhbXMsIHNlc3Npb25fZW50cnkpOworCQkJbGltX3NlbmRfZWRjYV9wYXJhbXMobWFjX2N0eCwKKwkJCQlzZXNzaW9uX2VudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwKKwkJCQlzdGFfZHMtPmJzc0lkKTsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwkJCXJybV9jYWNoZV9tZ210X3R4X3Bvd2VyKG1hY19jdHgsCisJCQkJYWRkX2Jzc19wYXJhbXMtPnR4TWdtdFBvd2VyLCBzZXNzaW9uX2VudHJ5KTsKKyNlbmRpZgorCQkJaWYgKGxpbV9hZGRfc3RhX3NlbGYobWFjX2N0eCwgc3RhX2lkeCwgdXBkYXRlX3N0YSwKKwkJCQlzZXNzaW9uX2VudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCQkvKiBBZGQgU1RBIGNvbnRleHQgYXQgSFcgKi8KKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJTZXNzaW9uOiVkIGNvdWxkIG5vdCBBZGQgU2VsZiIKKwkJCQkJIkVudHJ5IGZvciB0aGUgc3RhdGlvbiIpLAorCQkJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCk7CisJCQkJbWxtX2Fzc29jX2NuZi5yZXN1bHRDb2RlID0KKwkJCQkJKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9TTUVfUkVGVVNFRDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoIlNlc3Npb25JZDolZCBBRERfQlNTIGZhaWxlZCEiKSwKKwkJCXNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkKTsKKwkJLyogUmV0dXJuIEFzc29jIGNvbmZpcm0gdG8gU01FIHdpdGggZmFpbHVyZSAqLworCQlpZiAoZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfRlRfUkVBU1NPQ19TVEFURSA9PQorCQkJCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlKQorCQkJbWxtX2Fzc29jX2NuZi5yZXN1bHRDb2RlID0KKwkJCQkodFNpclJlc3VsdENvZGVzKSBlU0lSX1NNRV9GVF9SRUFTU09DX0ZBSUxVUkU7CisJCWVsc2UKKwkJCW1sbV9hc3NvY19jbmYucmVzdWx0Q29kZSA9CisJCQkJKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9TTUVfUkVGVVNFRDsKKwl9CisKKwlpZiAobWxtX2Fzc29jX2NuZi5yZXN1bHRDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpIHsKKwkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9JRExFX1NUQVRFOworCQlpZiAobGltX3NldF9saW5rX3N0YXRlKG1hY19jdHgsIGVTSVJfTElOS19JRExFX1NUQVRFLAorCQkJCQlzZXNzaW9uX2VudHJ5LT5ic3NJZCwKKwkJCQkJc2Vzc2lvbl9lbnRyeS0+c2VsZk1hY0FkZHIsCisJCQkJCU5VTEwsIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgIEZMKCJGYWlsZWQgdG8gc2V0IHRoZSBMaW5rU3RhdGUiKSk7CisJCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICovCisJCW1sbV9hc3NvY19jbmYuc2Vzc2lvbklkID0gc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQ7CisJCWxpbV9wb3N0X3NtZV9tZXNzYWdlKG1hY19jdHgsIG1zZ190eXBlLAorCQkJKHVpbnQzMl90ICopICZtbG1fYXNzb2NfY25mKTsKKwl9CitlbmQ6CisJaWYgKDAgIT0gbXNnLT5ib2R5cHRyKSB7CisJCWNkZl9tZW1fZnJlZShhZGRfYnNzX3BhcmFtcyk7CisJCW1zZy0+Ym9keXB0ciA9IE5VTEw7CisJfQorfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX21sbV9hZGRfYnNzX3JzcCgpIC0gUHJvY2Vzc2VzIEFERCBCU1MgUmVzcG9uc2UKKyAqCisgKiBAbWFjX2N0eCAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2cgLSBUaGUgTXNnUSBoZWFkZXIsIHdoaWNoIGNvbnRhaW5zIHRoZSByZXNwb25zZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIGEgV01BX0FERF9CU1NfUlNQIGZyb20gSEFMLgorICogVXBvbiByZWNlaXB0IG9mIHRoaXMgbWVzc2FnZSBmcm9tIEhBTCwgTUxNRSAtCisgKiAgRGV0ZXJtaW5lcyB0aGUgInN0YXRlIiBpbiB3aGljaCB0aGlzIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkCisgKiAgRm9yd2FyZHMgaXQgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrCisgKgorICpMT0dJQzoKKyAqIFdNQV9BRERfQlNTX1JTUCBjYW4gYmUgcmVjZWl2ZWQgYnkgTUxNRSB3aGlsZSB0aGUgTElNIGlzCisgKiBpbiB0aGUgZm9sbG93aW5nIHR3byBzdGF0ZXM6CisgKiAxKSBBcyBBUCwgTElNIHN0YXRlID0gZUxJTV9TTUVfV1RfU1RBUlRfQlNTX1NUQVRFCisgKiAyKSBBcyBTVEEsIExJTSBzdGF0ZSA9IGVMSU1fU01FX1dUX0pPSU5fU1RBVEUKKyAqIEJhc2VkIG9uIHRoZXNlIHR3byBzdGF0ZXMsIHRoaXMgQVBJIHdpbGwgZGV0ZXJtaW5lIHdoZXJlIHRvCisgKiByb3V0ZSB0aGUgbWVzc2FnZSB0bworICoKKyAqIFJldHVybiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2FkZF9ic3NfcnNwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdHBTaXJNc2dRIG1zZykKK3sKKwl0TGltTWxtU3RhcnRDbmYgbWxtX3N0YXJ0X2NuZjsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5OworCXRwQWRkQnNzUGFyYW1zIGFkZF9ic3NfcGFyYW0gPSAodHBBZGRCc3NQYXJhbXMpIChtc2ctPmJvZHlwdHIpOworCXRTaXJCc3NUeXBlIGJzc190eXBlOworCisJaWYgKE5VTEwgPT0gYWRkX2Jzc19wYXJhbSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJFbmNvdW50ZXJlZCBOVUxMIFBvaW50ZXIiKSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgZGVmZXJyZWQgbWVzc2FnZSBzaW5jZSB0aGUKKwkgKiBpbml0aWF0aW5nIHJlcS50aGVyZSBtaWdodCBiZSBuZXN0ZWQgcmVxdWVzdC4KKwkgKiBpbiB0aGUgY2FzZSBvZiBuZXN0ZWQgcmVxdWVzdCB0aGUgbmV3IHJlcXVlc3QgaW5pdGlhdGVkCisJICogZnJvbSB0aGUgcmVzcG9uc2Ugd2lsbCB0YWtlIGNhcmUgb2YgcmVzZXR0aW5nIHRoZSBkZWZmZXJlZAorCSAqIGZsYWcuCisJICovCisJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MobWFjX2N0eCwgdHJ1ZSk7CisJLyogVmFsaWRhdGUgU01FL0xJTS9NTE1FIHN0YXRlICovCisJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKG1hY19jdHgsCisJCQlhZGRfYnNzX3BhcmFtLT5zZXNzaW9uSWQpOworCWlmIChzZXNzaW9uX2VudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiU2Vzc2lvbklkOiVkIFNlc3Npb24gRG9lc24ndCBleGlzdCIpLAorCQkJYWRkX2Jzc19wYXJhbS0+c2Vzc2lvbklkKTsKKwkJaWYgKE5VTEwgIT0gYWRkX2Jzc19wYXJhbSkgeworCQkJY2RmX21lbV9mcmVlKGFkZF9ic3NfcGFyYW0pOworCQkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJfQorCQlyZXR1cm47CisJfQorCisJc2Vzc2lvbl9lbnRyeS0+bnNzID0gYWRkX2Jzc19wYXJhbS0+bnNzOworCWJzc190eXBlID0gc2Vzc2lvbl9lbnRyeS0+YnNzVHlwZTsKKwkvKiB1cGRhdGUgUEUgc2Vzc2lvbiBJZCAqLworCW1sbV9zdGFydF9jbmYuc2Vzc2lvbklkID0gc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQ7CisJaWYgKGVTSVJfSUJTU19NT0RFID09IGJzc190eXBlKSB7CisJCWxpbV9wcm9jZXNzX2lic3NfbWxtX2FkZF9ic3NfcnNwKG1hY19jdHgsIG1zZywgc2Vzc2lvbl9lbnRyeSk7CisJfSBlbHNlIHsKKwkJaWYgKGVMSU1fU01FX1dUX1NUQVJUX0JTU19TVEFURSA9PSBzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSkgeworCQkJaWYgKGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1NUQVRFICE9CisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUpIHsKKwkJCQkvKiBNZXNnIHJlY2VpdmVkIGZyb20gSEFMIGluIEludmFsaWQgc3RhdGUhICovCisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiU2Vzc2lvbklkOiVkIFJlY2VpdmVkICIKKwkJCQkJIiBXTUFfQUREX0JTU19SU1AgaW4gc3RhdGUgJVgiKSwKKwkJCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlKTsKKwkJCQltbG1fc3RhcnRfY25mLnJlc3VsdENvZGUgPQorCQkJCQllU0lSX1NNRV9CU1NfQUxSRUFEWV9TVEFSVEVEX09SX0pPSU5FRDsKKwkJCQlpZiAoMCAhPSBtc2ctPmJvZHlwdHIpIHsKKwkJCQkJY2RmX21lbV9mcmVlKGFkZF9ic3NfcGFyYW0pOworCQkJCQltc2ctPmJvZHlwdHIgPSBOVUxMOworCQkJCX0KKwkJCQlsaW1fcG9zdF9zbWVfbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX1NUQVJUX0NORiwKKwkJCQkJKHVpbnQzMl90ICopICZtbG1fc3RhcnRfY25mKTsKKwkJCX0gZWxzZSBpZiAoKGJzc190eXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSkgfHwKKwkJCQkJKGJzc190eXBlID09IGVTSVJfQlRBTVBfU1RBX01PREUpKSB7CisJCQkJbGltX3Byb2Nlc3NfYnRhbXBfYWRkX2Jzc19yc3AobWFjX2N0eCwgbXNnLAorCQkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJCX0gZWxzZQorCQkJCWxpbV9wcm9jZXNzX2FwX21sbV9hZGRfYnNzX3JzcChtYWNfY3R4LCBtc2cpOworCQl9IGVsc2UgeworCQkJLyogQ2FsbGVkIHdoaWxlIHByb2Nlc3NpbmcgYXNzb2MgcmVzcG9uc2UgKi8KKwkJCWxpbV9wcm9jZXNzX3N0YV9tbG1fYWRkX2Jzc19yc3AobWFjX2N0eCwgbXNnLAorCQkJCXNlc3Npb25fZW50cnkpOworCQl9CisJfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWlmIChzZXNzaW9uX2VudHJ5LT5saW1SbWZFbmFibGVkKSB7CisJCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkJCWxpbV9zZW5kX2V4Y2x1ZGVfdW5lbmNyeXB0X2luZChtYWNfY3R4LCBmYWxzZSwKKwkJCQlzZXNzaW9uX2VudHJ5KSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJGYWlsZWQgdG8gc2VuZCBFeGNsdWRlIFVuZW5jcnlwdGVkIEluZC4iKSk7CisJCX0KKwl9CisjZW5kaWYKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19tbG1fc2V0X3N0YV9rZXlfcnNwKCkgLSBQcm9jZXNzIFNUQSBrZXkgcmVzcG9uc2UKKyAqCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1zZzogVGhlIE1zZ1EgaGVhZGVyLCB3aGljaCBjb250YWlucyB0aGUgcmVzcG9uc2UgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyB0aGUgZm9sbG93aW5nIHR3bworICogbWVzc2FnZXMgZnJvbSBIQUw6CisgKiAxKSBXTUFfU0VUX0JTU0tFWV9SU1AKKyAqIDIpIFdNQV9TRVRfU1RBS0VZX1JTUAorICogMykgV01BX1NFVF9TVEFfQkNBU1RLRVlfUlNQCisgKiBVcG9uIHJlY2VpcHQgb2YgdGhpcyBtZXNzYWdlIGZyb20gSEFMLAorICogTUxNRSAtCisgKiA+IERldGVybWluZXMgdGhlICJzdGF0ZSIgaW4gd2hpY2ggdGhpcyBtZXNzYWdlIHdhcyByZWNlaXZlZAorICogPiBGb3J3YXJkcyBpdCB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2sKKyAqIExPR0lDOgorICogV01BX1NFVF9CU1NLRVlfUlNQL1dNQV9TRVRfU1RBS0VZX1JTUCBjYW4gYmUKKyAqIHJlY2VpdmVkIGJ5IE1MTUUgd2hpbGUgaW4gdGhlIGZvbGxvd2luZyBzdGF0ZToKKyAqIE1MTUUgc3RhdGUgPSBlTElNX01MTV9XVF9TRVRfQlNTX0tFWV9TVEFURSAtLU9SLS0KKyAqIE1MTUUgc3RhdGUgPSBlTElNX01MTV9XVF9TRVRfU1RBX0tFWV9TVEFURSAtLU9SLS0KKyAqIE1MTUUgc3RhdGUgPSBlTElNX01MTV9XVF9TRVRfU1RBX0JDQVNUS0VZX1NUQVRFCisgKiBCYXNlZCBvbiB0aGlzIHN0YXRlLCB0aGlzIEFQSSB3aWxsIGRldGVybWluZSB3aGVyZSB0bworICogcm91dGUgdGhlIG1lc3NhZ2UgdG8KKyAqIEFzc3VtcHRpb246CisgKiBPTkxZIHRoZSBNTE1FIHN0YXRlIGlzIGJlaW5nIHRha2VuIGludG8gYWNjb3VudCBmb3Igbm93LgorICogVGhpcyBpcyBiZWNhdXNlLCBpdCBhcHBlYXJzIHRoYXQgdGhlIGhhbmRsaW5nIG9mIHRoZQorICogU0VUS0VZUyBSRVEgaXMgaGFuZGxlZCBzeW1tZXRyaWNhbGx5IG9uIGJvdGggdGhlIEFQICYgU1RBCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX3NldF9zdGFfa2V5X3JzcCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXRwU2lyTXNnUSBtc2cpCit7CisJdWludDhfdCByZXNwX3JlcWQgPSAxOworCXRMaW1NbG1TZXRLZXlzQ25mIG1sbV9zZXRfa2V5X2NuZjsKKwl1aW50OF90IHNlc3Npb25faWQgPSAwOworCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnk7CisKKwlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhtYWNfY3R4LCB0cnVlKTsKKwljZGZfbWVtX3NldCgodm9pZCAqKSZtbG1fc2V0X2tleV9jbmYsIHNpemVvZih0TGltTWxtU2V0S2V5c0NuZiksIDApOworCWlmIChOVUxMID09IG1zZy0+Ym9keXB0cikgeworCQlQRUxPR0UobGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgibXNnIGJvZHlwdHIgaXMgTlVMTCIpKTspCisJCXJldHVybjsKKwl9CisJc2Vzc2lvbl9pZCA9ICgodHBTZXRTdGFLZXlQYXJhbXMpIG1zZy0+Ym9keXB0ciktPnNlc3Npb25JZDsKKwlzZXNzaW9uX2VudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJaWYgKHNlc3Npb25fZW50cnkgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25faWQiKSk7KQorCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKwlpZiAoZUxJTV9NTE1fV1RfU0VUX1NUQV9LRVlfU1RBVEUgIT0gc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUpIHsKKwkJLyogTWVzZyByZWNlaXZlZCBmcm9tIEhBTCBpbiBJbnZhbGlkIHN0YXRlISAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiUmVjZWl2ZWQgdW5leHBlY3RlZCBbTWVzZyBJZCAtICVkXSBpbiBzdGF0ZSAlWCIpLAorCQkJbXNnLT50eXBlLCBzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSk7CisJCS8qIFRoZXJlJ3Mgbm90IG11Y2ggdGhhdCBNTE1FIGNhbiBkbyBhdCB0aGlzIHN0YWdlLi4uICovCisJCXJlc3BfcmVxZCA9IDA7CisJfSBlbHNlIHsKKwkJbWxtX3NldF9rZXlfY25mLnJlc3VsdENvZGUgPQorCQkJKHVpbnQxNl90KSgoKHRwU2V0U3RhS2V5UGFyYW1zKSBtc2ctPmJvZHlwdHIpLT5zdGF0dXMpOworCX0KKworCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCW1zZy0+Ym9keXB0ciA9IE5VTEw7CisJLyogUmVzdG9yZSBNTE1FIHN0YXRlICovCisJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUgPSBzZXNzaW9uX2VudHJ5LT5saW1QcmV2TWxtU3RhdGU7CisJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX01MTV9TVEFURSwKKwkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsIHNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlKSk7CisJaWYgKHJlc3BfcmVxZCkgeworCQl0cExpbU1sbVNldEtleXNSZXEgbHBMaW1NbG1TZXRLZXlzUmVxID0KKwkJCSh0cExpbU1sbVNldEtleXNSZXEpIG1hY19jdHgtPmxpbS5ncExpbU1sbVNldEtleXNSZXE7CisJCS8qIFByZXBhcmUgYW5kIFNlbmQgTElNX01MTV9TRVRLRVlTX0NORiAqLworCQlpZiAoTlVMTCAhPSBscExpbU1sbVNldEtleXNSZXEpIHsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWxtX3NldF9rZXlfY25mLnBlZXJNYWNBZGRyLAorCQkJCSh1aW50OF90ICopIGxwTGltTWxtU2V0S2V5c1JlcS0+cGVlck1hY0FkZHIsCisJCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCQkvKgorCQkJICogRnJlZSB0aGUgYnVmZmVyIGNhY2hlZCBmb3IgdGhlIGdsb2JhbAorCQkJICogbWFjX2N0eC0+bGltLmdwTGltTWxtU2V0S2V5c1JlcQorCQkJICovCisJCQljZGZfbWVtX2ZyZWUobWFjX2N0eC0+bGltLmdwTGltTWxtU2V0S2V5c1JlcSk7CisJCQltYWNfY3R4LT5saW0uZ3BMaW1NbG1TZXRLZXlzUmVxID0gTlVMTDsKKwkJfQorCQltbG1fc2V0X2tleV9jbmYuc2Vzc2lvbklkID0gc2Vzc2lvbl9pZDsKKwkJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9TRVRLRVlTX0NORiwKKwkJCSh1aW50MzJfdCAqKSAmbWxtX3NldF9rZXlfY25mKTsKKwl9Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfbWxtX3NldF9ic3Nfa2V5X3JzcCgpIC0gaGFuZGxlcyBCU1Mga2V5CisgKgorICogQG1hY19jdHg6IEEgcG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1zZzogTWVzc2FnZSBmcm9tIFNNRQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIEJTUyBrZXkgcmVzcG9uc2UgYW5kIHVwZGF0ZXMKKyAqIFBFIHN0YXR1cyBhY2NvcmRpbmdseS4KKyAqCisgKiBSZXR1cm46IE5VTEwKKyAqLwordm9pZCBsaW1fcHJvY2Vzc19tbG1fc2V0X2Jzc19rZXlfcnNwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdHBTaXJNc2dRIG1zZykKK3sKKwl0TGltTWxtU2V0S2V5c0NuZiBzZXRfa2V5X2NuZjsKKwl1aW50MTZfdCByZXN1bHRfc3RhdHVzOworCXVpbnQ4X3Qgc2Vzc2lvbl9pZCA9IDA7CisJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeTsKKwl0cExpbU1sbVNldEtleXNSZXEgc2V0X2tleV9yZXE7CisKKwlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhtYWNfY3R4LCB0cnVlKTsKKwljZGZfbWVtX3NldCgodm9pZCAqKSZzZXRfa2V5X2NuZiwgc2l6ZW9mKHRMaW1NbG1TZXRLZXlzQ25mKSwgMCk7CisJaWYgKE5VTEwgPT0gbXNnLT5ib2R5cHRyKSB7CisJCVBFTE9HRShsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJtc2cgYm9keXB0ciBpcyBudWxsIikpOykKKwkJcmV0dXJuOworCX0KKwlzZXNzaW9uX2lkID0gKCh0cFNldEJzc0tleVBhcmFtcykgbXNnLT5ib2R5cHRyKS0+c2Vzc2lvbklkOworCXNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwlpZiAoc2Vzc2lvbl9lbnRyeSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkIFslZF0iKSwKKwkJCXNlc3Npb25faWQpOykKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCW1zZy0+Ym9keXB0ciA9IE5VTEw7CisJCXJldHVybjsKKwl9CisJaWYgKGVMSU1fTUxNX1dUX1NFVF9CU1NfS0VZX1NUQVRFID09IHNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlKQorCQlyZXN1bHRfc3RhdHVzID0KKwkJCSh1aW50MTZfdCkoKCh0cFNldEJzc0tleVBhcmFtcyltc2ctPmJvZHlwdHIpLT5zdGF0dXMpOworCWVsc2UKKwkJLyoKKwkJICogQkNBU1Qga2V5IGFsc28gdXNlcyB0cFNldFN0YUtleVBhcmFtcy4KKwkJICogRG9uZSB0aGlzIHdheSBmb3IgcmVhZGFiaWx0eS4KKwkJICovCisJCXJlc3VsdF9zdGF0dXMgPQorCQkJKHVpbnQxNl90KSgoKHRwU2V0U3RhS2V5UGFyYW1zKW1zZy0+Ym9keXB0ciktPnN0YXR1cyk7CisKKwkvKiBWYWxpZGF0ZSBNTE1FIHN0YXRlICovCisJaWYgKGVMSU1fTUxNX1dUX1NFVF9CU1NfS0VZX1NUQVRFICE9IHNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlICYmCisJCWVMSU1fTUxNX1dUX1NFVF9TVEFfQkNBU1RLRVlfU1RBVEUgIT0KKwkJCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlKSB7CisJCS8qIE1zZyByZWNlaXZlZCBmcm9tIEhBTCBpbiBJbnZhbGlkIHN0YXRlISAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiUmVjZWl2ZWQgdW5leHBlY3RlZCBbTWVzZyBJZCAtICVkXSBpbiBzdGF0ZSAlWCIpLAorCQkJbXNnLT50eXBlLCBzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSk7CisJfSBlbHNlIHsKKwkJc2V0X2tleV9jbmYucmVzdWx0Q29kZSA9IHJlc3VsdF9zdGF0dXM7CisJfQorCisJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJbXNnLT5ib2R5cHRyID0gTlVMTDsKKwkvKiBSZXN0b3JlIE1MTUUgc3RhdGUgKi8KKwlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSA9IHNlc3Npb25fZW50cnktPmxpbVByZXZNbG1TdGF0ZTsKKworCU1UUkFDRShtYWNfdHJhY2UKKwkJKG1hY19jdHgsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUpKTsKKwlzZXRfa2V5X3JlcSA9CisJCSh0cExpbU1sbVNldEtleXNSZXEpIG1hY19jdHgtPmxpbS5ncExpbU1sbVNldEtleXNSZXE7CisJc2V0X2tleV9jbmYuc2Vzc2lvbklkID0gc2Vzc2lvbl9pZDsKKworCS8qIFByZXBhcmUgYW5kIFNlbmQgTElNX01MTV9TRVRLRVlTX0NORiAqLworCWlmIChOVUxMICE9IHNldF9rZXlfcmVxKSB7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmc2V0X2tleV9jbmYucGVlck1hY0FkZHIsCisJCQkodWludDhfdCAqKSBzZXRfa2V5X3JlcS0+cGVlck1hY0FkZHIsCisJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJLyoKKwkJICogRnJlZSB0aGUgYnVmZmVyIGNhY2hlZCBmb3IgdGhlCisJCSAqIGdsb2JhbCBtYWNfY3R4LT5saW0uZ3BMaW1NbG1TZXRLZXlzUmVxCisJCSAqLworCQljZGZfbWVtX2ZyZWUobWFjX2N0eC0+bGltLmdwTGltTWxtU2V0S2V5c1JlcSk7CisJCW1hY19jdHgtPmxpbS5ncExpbU1sbVNldEtleXNSZXEgPSBOVUxMOworCX0KKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX1NFVEtFWVNfQ05GLAorCQkodWludDMyX3QgKikgJnNldF9rZXlfY25mKTsKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19zd2l0Y2hfY2hhbm5lbF9yZV9hc3NvY19yZXEoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgdGhlIHJlYXNzb2MgcmVxIG1nbXQgZnJhbWUgYWZ0ZXIgdGhlCisgKiBzd2l0Y2hDaGFubmVsUnNwIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSBIQUwuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gIHBzZXNzaW9uRW50cnkgLSBzZXNzaW9uIHJlbGF0ZWQgaW5mb3JtYXRpb24uCisgKiBAcGFyYW0gIHN0YXR1cyAgICAgICAgLSBjaGFubmVsIHN3aXRjaCBzdWNjZXNzL2ZhaWx1cmUuCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX3N3aXRjaF9jaGFubmVsX3JlX2Fzc29jX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkJCQkgICAgQ0RGX1NUQVRVUyBzdGF0dXMpCit7CisJdExpbU1sbVJlYXNzb2NDbmYgbWxtUmVhc3NvY0NuZjsKKwl0TGltTWxtUmVhc3NvY1JlcSAqcE1sbVJlYXNzb2NSZXE7CisJcE1sbVJlYXNzb2NSZXEgPQorCQkodExpbU1sbVJlYXNzb2NSZXEgKikgKHBzZXNzaW9uRW50cnktPnBMaW1NbG1SZWFzc29jUmVxKTsKKwlpZiAocE1sbVJlYXNzb2NSZXEgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgicExpbU1sbVJlYXNzb2NSZXEgZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHN3aXRjaENoYW5TZXNzaW9uIikpOworCQltbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJDaGFuZ2UgY2hhbm5lbCBmYWlsZWQhISIpKTspCisJCW1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0NIQU5ORUxfU1dJVENIX0ZBSUw7CisJCWdvdG8gZW5kOworCX0KKwkvKiAvIFN0YXJ0IHJlYXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lciAqLworCU1UUkFDRShtYWNfdHJhY2UKKwkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJICAgICAgIGVMSU1fUkVBU1NPQ19GQUlMX1RJTUVSKSk7CisJaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZWFzc29jRmFpbHVyZVRpbWVyKQorCSAgICAhPSBUWF9TVUNDRVNTKSB7CisJCS8qIC8gQ291bGQgbm90IHN0YXJ0IHJlYXNzb2MgZmFpbHVyZSB0aW1lci4gKi8KKwkJLyogTG9nIGVycm9yICovCisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJjb3VsZCBub3Qgc3RhcnQgUmVhc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyIikpOworCQkvKiBSZXR1cm4gUmVhc3NvYyBjb25maXJtIHdpdGggKi8KKwkJLyogUmVzb3VyY2VzIFVuYXZhaWxhYmxlICovCisJCW1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKwkJZ290byBlbmQ7CisJfQorCS8qIC8gUHJlcGFyZSBhbmQgc2VuZCBSZWFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUgKi8KKwlsaW1fc2VuZF9yZWFzc29jX3JlcV9tZ210X2ZyYW1lKHBNYWMsIHBNbG1SZWFzc29jUmVxLCBwc2Vzc2lvbkVudHJ5KTsKKwlyZXR1cm47CitlbmQ6CisJLyogRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkIGZvciByZWFzc29jUmVxICovCisJaWYgKHBNbG1SZWFzc29jUmVxICE9IE5VTEwpIHsKKwkJLyogVXBkYXRlIFBFIHNlc3Npb24gSWQgKi8KKwkJbWxtUmVhc3NvY0NuZi5zZXNzaW9uSWQgPSBwTWxtUmVhc3NvY1JlcS0+c2Vzc2lvbklkOworCQljZGZfbWVtX2ZyZWUocE1sbVJlYXNzb2NSZXEpOworCQlwc2Vzc2lvbkVudHJ5LT5wTGltTWxtUmVhc3NvY1JlcSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJbWxtUmVhc3NvY0NuZi5zZXNzaW9uSWQgPSAwOworCX0KKworCW1sbVJlYXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisJLyogVXBkYXRlIFBFIHNlc3NpbyBJZCAqLworCW1sbVJlYXNzb2NDbmYuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKwlsaW1fcG9zdF9zbWVfbWVzc2FnZShwTWFjLCBMSU1fTUxNX1JFQVNTT0NfQ05GLAorCQkJICAgICAodWludDMyX3QgKikgJm1sbVJlYXNzb2NDbmYpOworfQorCisKKy8qKgorICogbGltX3Byb2Nlc3Nfc3dpdGNoX2NoYW5uZWxfam9pbl9yZXEoKSAtSW5pdGlhdGVzIHByb2JlIHJlcXVlc3QKKyAqCisgKiBAbWFjX2N0eCAtIEEgcG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHNlc3Npb25FbnRyeSAtIHNlc3Npb24gcmVsYXRlZCBpbmZvcm1hdGlvbi4KKyAqIEBzdGF0dXMgICAgICAgIC0gY2hhbm5lbCBzd2l0Y2ggc3VjY2Vzcy9mYWlsdXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCB0aGUgcHJvYmUgcmVxIG1nbXQgZnJhbWUKKyAqIGFmdGVyIHRoZSBzd2l0Y2hDaGFubmVsUnNwIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSBIQUwuCisgKgorICogUmV0dXJuIE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3Nfc3dpdGNoX2NoYW5uZWxfam9pbl9yZXEoCisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSwKKwlDREZfU1RBVFVTIHN0YXR1cykKK3sKKwl0U2lyTWFjU1NpZCBzc0lkOworCXRMaW1NbG1Kb2luQ25mIGpvaW5fY25mOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJDaGFuZ2UgY2hhbm5lbCBmYWlsZWQhISIpKTspCisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKChOVUxMID09IHNlc3Npb25fZW50cnkpIHx8IChOVUxMID09IHNlc3Npb25fZW50cnktPnBMaW1NbG1Kb2luUmVxKQorCQl8fCAoTlVMTCA9PSBzZXNzaW9uX2VudHJ5LT5wTGltSm9pblJlcSkpIHsKKwkJUEVMT0dFKGxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoImludmFsaWQgcG9pbnRlciEhIikpOykKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKgorCSAqIGVTSVJfQlRBTVBfQVBfTU9ERSBzdHJvZWQgYXMgYnNzIHR5cGUgaW4gc2Vzc2lvbgorCSAqIFRhYmxlIHdoZW4gam9pbiByZXEgaXMgcmVjZWl2ZWQsIGlzIHRvIGJlIHZlaWZpZWQKKwkgKi8KKwlpZiAoc2Vzc2lvbl9lbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX0FQX01PREUpIHsKKwkJaWYgKGxpbV9zZXRfbGlua19zdGF0ZQorCQkJKG1hY19jdHgsIGVTSVJfTElOS19CVEFNUF9QUkVBU1NPQ19TVEFURSwKKwkJCXNlc3Npb25fZW50cnktPmJzc0lkLCBzZXNzaW9uX2VudHJ5LT5zZWxmTWFjQWRkciwKKwkJCU5VTEwsIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiU2Vzc2lvbmlkOiAlZCBTZXQgbGluayBzdGF0ZSAiCisJCQkJImZhaWxlZCEhIEJTU0lEOiIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQlNQUNfQUREUl9BUlJBWShzZXNzaW9uX2VudHJ5LT5ic3NJZCkpOykKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlzZXNzaW9uX2VudHJ5LT5saW1QcmV2TWxtU3RhdGUgPSBzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZTsKKwlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0pPSU5fQkVBQ09OX1NUQVRFOworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlNlc3Npb25pZCAlZCBwcmV2IGxpbSBzdGF0ZSAlZCBuZXcgbGltIHN0YXRlICVkICIKKwkJInN5c3RlbXJvbGUgPSAlZCIpLCBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJc2Vzc2lvbl9lbnRyeS0+bGltUHJldk1sbVN0YXRlLAorCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSwgR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uX2VudHJ5KSk7CisKKwkvKiBBcHBseSBwcmV2aW91c2x5IHNldCBjb25maWd1cmF0aW9uIGF0IEhXICovCisJbGltX2FwcGx5X2NvbmZpZ3VyYXRpb24obWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSk7CisKKwkvKgorCSogSWYgc2VuZERlYXV0aEJlZm9yZUNvbiBpcyBlbmFibGVkLCBTZW5kIERlYXV0aCBmaXJzdCB0byBBUCBpZiBsYXN0CisJKiBkaXNjb25uZWN0aW9uIHdhcyBjYXVzZWQgYnkgSEIgZmFpbHVyZS4KKwkqLworCWlmKG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uc2VuZERlYXV0aEJlZm9yZUNvbikgeworCQlpbnQgYXBDb3VudDsKKworCQlmb3IoYXBDb3VudCA9IDA7IGFwQ291bnQgPCAyOyBhcENvdW50KyspIHsKKworCQkJaWYgKGNkZl9tZW1fY29tcGFyZShzZXNzaW9uX2VudHJ5LT5wTGltTWxtSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uYnNzSWQsCisJCQkJbWFjX2N0eC0+bGltLmdMaW1IZWFydEJlYXRBcE1hY1thcENvdW50XSwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkluZGV4ICVkIFNlc3Npb25pZDogJWQgU2VuZCBkZWF1dGggb24gIgorCQkJCSJjaGFubmVsICVkIHRvIEJTU0lEOiAiTUFDX0FERFJFU1NfU1RSICksIGFwQ291bnQsCisJCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsIHNlc3Npb25fZW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwKKwkJCQlNQUNfQUREUl9BUlJBWShzZXNzaW9uX2VudHJ5LT5wTGltTWxtSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uCisJCQkJCQkJCQkJCWJzc0lkKSk7CisKKwkJCQlsaW1fc2VuZF9kZWF1dGhfbWdtdF9mcmFtZShtYWNfY3R4LCBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT04sCisJCQkJCXNlc3Npb25fZW50cnktPnBMaW1NbG1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwKKwkJCQkJc2Vzc2lvbl9lbnRyeSwgZmFsc2UgKTsKKworCQkJCWNkZl9tZW1femVybyhtYWNfY3R4LT5saW0uZ0xpbUhlYXJ0QmVhdEFwTWFjW2FwQ291bnRdLAorCQkJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIFdhaXQgZm9yIEJlYWNvbiB0byBhbm5vdW5jZSBqb2luIHN1Y2Nlc3MgKi8KKwljZGZfbWVtX2NvcHkoc3NJZC5zc0lkLAorCQlzZXNzaW9uX2VudHJ5LT5zc0lkLnNzSWQsIHNlc3Npb25fZW50cnktPnNzSWQubGVuZ3RoKTsKKwlzc0lkLmxlbmd0aCA9IHNlc3Npb25fZW50cnktPnNzSWQubGVuZ3RoOworCisJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihtYWNfY3R4LAorCQllTElNX1BFUklPRElDX0pPSU5fUFJPQkVfUkVRX1RJTUVSKTsKKworCS8qIGFzc2lnbiBhcHByb3ByaWF0ZSBzZXNzaW9uSWQgdG8gdGhlIHRpbWVyIG9iamVjdCAqLworCW1hY19jdHgtPmxpbS5saW1UaW1lcnMuZ0xpbVBlcmlvZGljSm9pblByb2JlUmVxVGltZXIuc2Vzc2lvbklkID0KKwkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQ7CisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgiU2Vzc2lvbmlkOiAlZCBTZW5kIFByb2JlIHJlcSBvbiBjaGFubmVsICVkIHNzaWQ6JS4qcyAiCisJCSJCU1NJRDogIiBNQUNfQUREUkVTU19TVFIpLCBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJc2Vzc2lvbl9lbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsLCBzc0lkLmxlbmd0aCwgc3NJZC5zc0lkLAorCQlNQUNfQUREUl9BUlJBWSgKKwkJc2Vzc2lvbl9lbnRyeS0+cExpbU1sbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmJzc0lkKSk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gd2FpdCBmb3IgcHJvYmUgcmVzcG9uc2UsIHNvIHN0YXJ0IGpvaW4KKwkgKiB0aW1lb3V0IHRpbWVyLlRoaXMgdGltZXIgd2lsbCBiZSBkZWFjdGl2YXRlZCBvbmNlCisJICogd2UgcmVjZWl2ZSBwcm9iZSByZXNwb25zZS4KKwkgKi8KKwlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsCisJCXNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkLCBlTElNX0pPSU5fRkFJTF9USU1FUikpOworCWlmICh0eF90aW1lcl9hY3RpdmF0ZSgmbWFjX2N0eC0+bGltLmxpbVRpbWVycy5nTGltSm9pbkZhaWx1cmVUaW1lcikgIT0KKwkJVFhfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiY291bGRuJ3QgYWN0aXZhdGUgSm9pbiBmYWlsdXJlIHRpbWVyIikpOworCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSA9IHNlc3Npb25fZW50cnktPmxpbVByZXZNbG1TdGF0ZTsKKwkJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX01MTV9TVEFURSwKKwkJCSBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJCSBtYWNfY3R4LT5saW0uZ0xpbU1sbVN0YXRlKSk7CisJCXNlc3Npb25fZW50cnktPnBMaW1NbG1Kb2luUmVxID0gTlVMTDsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogaW5jbHVkZSBhZGRpdGlvbmFsIElFIGlmIHRoZXJlIGlzICovCisJbGltX3NlbmRfcHJvYmVfcmVxX21nbXRfZnJhbWUobWFjX2N0eCwgJnNzSWQsCisJCXNlc3Npb25fZW50cnktPnBMaW1NbG1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwKKwkJc2Vzc2lvbl9lbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsLCBzZXNzaW9uX2VudHJ5LT5zZWxmTWFjQWRkciwKKwkJc2Vzc2lvbl9lbnRyeS0+ZG90MTFtb2RlLAorCQlzZXNzaW9uX2VudHJ5LT5wTGltSm9pblJlcS0+YWRkSUVTY2FuLmxlbmd0aCwKKwkJc2Vzc2lvbl9lbnRyeS0+cExpbUpvaW5SZXEtPmFkZElFU2Nhbi5hZGRJRWRhdGEpOworCisJaWYgKHNlc3Npb25fZW50cnktPnBlUGVyc29uYSA9PSBDREZfUDJQX0NMSUVOVF9NT0RFKSB7CisJCS8qIEFjdGl2YXRlIEpvaW4gUGVyaW9kaWMgUHJvYmUgUmVxIHRpbWVyICovCisJCWlmICh0eF90aW1lcl9hY3RpdmF0ZQorCQkJKCZtYWNfY3R4LT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY0pvaW5Qcm9iZVJlcVRpbWVyKQorCQkJIT0gVFhfU1VDQ0VTUykgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJQZXJpb2RpYyBKb2luUmVxIHRpbWVyIGFjdGl2YXRlIGZhaWxlZCIpKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJcmV0dXJuOworZXJyb3I6CisJaWYgKE5VTEwgIT0gc2Vzc2lvbl9lbnRyeSkgeworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+cExpbU1sbUpvaW5SZXEpIHsKKwkJCWNkZl9tZW1fZnJlZShzZXNzaW9uX2VudHJ5LT5wTGltTWxtSm9pblJlcSk7CisJCQlzZXNzaW9uX2VudHJ5LT5wTGltTWxtSm9pblJlcSA9IE5VTEw7CisJCX0KKwkJaWYgKHNlc3Npb25fZW50cnktPnBMaW1Kb2luUmVxKSB7CisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9lbnRyeS0+cExpbUpvaW5SZXEpOworCQkJc2Vzc2lvbl9lbnRyeS0+cExpbUpvaW5SZXEgPSBOVUxMOworCQl9CisJCWpvaW5fY25mLnNlc3Npb25JZCA9IHNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkOworCX0gZWxzZSB7CisJCWpvaW5fY25mLnNlc3Npb25JZCA9IDA7CisJfQorCWpvaW5fY25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJam9pbl9jbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9KT0lOX0NORiwgKHVpbnQzMl90ICopJmpvaW5fY25mKTsKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19zd2l0Y2hfY2hhbm5lbF9yc3AoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3Mgc3dpdGNoQ2hhbm5lbFJzcCBtZXNzYWdlIGZyb20gSEFMLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGJvZHkgLSBtZXNzYWdlIGJvZHkuCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3Nfc3dpdGNoX2NoYW5uZWxfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKmJvZHkpCit7CisJdHBTd2l0Y2hDaGFubmVsUGFyYW1zIHBDaG5sUGFyYW1zID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl1aW50MTZfdCBjaGFubmVsQ2hhbmdlUmVhc29uQ29kZTsKKwl1aW50OF90IHBlU2Vzc2lvbklkOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisJLyogd2UgbmVlZCB0byBwcm9jZXNzIHRoZSBkZWZlcnJlZCBtZXNzYWdlIHNpbmNlIHRoZSBpbml0aWF0aW5nIHJlcS4gdGhlcmUgbWlnaHQgYmUgbmVzdGVkIHJlcXVlc3QuICovCisJLyogaW4gdGhlIGNhc2Ugb2YgbmVzdGVkIHJlcXVlc3QgdGhlIG5ldyByZXF1ZXN0IGluaXRpYXRlZCBmcm9tIHRoZSByZXNwb25zZSB3aWxsIHRha2UgY2FyZSBvZiByZXNldHRpbmcgKi8KKwkvKiB0aGUgZGVmZmVyZWQgZmxhZy4gKi8KKwlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKwlwQ2hubFBhcmFtcyA9ICh0cFN3aXRjaENoYW5uZWxQYXJhbXMpIGJvZHk7CisJc3RhdHVzID0gcENobmxQYXJhbXMtPnN0YXR1czsKKwlwZVNlc3Npb25JZCA9IHBDaG5sUGFyYW1zLT5wZVNlc3Npb25JZDsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChwTWFjLCBwZVNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkIikpOworCQlyZXR1cm47CisJfQorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCS8qIEhBTCBmaWxscyBpbiB0aGUgdHggcG93ZXIgdXNlZCBmb3IgbWdtdCBmcmFtZXMgaW4gdGhpcyBmaWVsZC4gKi8KKwkvKiBTdG9yZSB0aGlzIHZhbHVlIHRvIHVzZSBpbiBUUEMgcmVwb3J0IElFLiAqLworCXJybV9jYWNoZV9tZ210X3R4X3Bvd2VyKHBNYWMsIHBDaG5sUGFyYW1zLT50eE1nbXRQb3dlciwgcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKwljaGFubmVsQ2hhbmdlUmVhc29uQ29kZSA9IHBzZXNzaW9uRW50cnktPmNoYW5uZWxDaGFuZ2VSZWFzb25Db2RlOworCS8qIGluaXRpYWxpemUgaXQgYmFjayB0byBpbnZhbGlkIGlkICovCisJcHNlc3Npb25FbnRyeS0+Y2hhaW5NYXNrID0gcENobmxQYXJhbXMtPmNoYWluTWFzazsKKwlwc2Vzc2lvbkVudHJ5LT5uc3MgPSBwQ2hubFBhcmFtcy0+bnNzOworCXBzZXNzaW9uRW50cnktPnNtcHNNb2RlID0gcENobmxQYXJhbXMtPnNtcHNNb2RlOworCXBzZXNzaW9uRW50cnktPmNoYW5uZWxDaGFuZ2VSZWFzb25Db2RlID0gMHhCQUQ7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiY2hhbm5lbENoYW5nZVJlYXNvbkNvZGUgJWQiKSwKKwkJY2hhbm5lbENoYW5nZVJlYXNvbkNvZGUpOworCXN3aXRjaCAoY2hhbm5lbENoYW5nZVJlYXNvbkNvZGUpIHsKKwljYXNlIExJTV9TV0lUQ0hfQ0hBTk5FTF9SRUFTU09DOgorCQlsaW1fcHJvY2Vzc19zd2l0Y2hfY2hhbm5lbF9yZV9hc3NvY19yZXEocE1hYywgcHNlc3Npb25FbnRyeSwgc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBMSU1fU1dJVENIX0NIQU5ORUxfSk9JTjoKKwkJbGltX3Byb2Nlc3Nfc3dpdGNoX2NoYW5uZWxfam9pbl9yZXEocE1hYywgcHNlc3Npb25FbnRyeSwgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIExJTV9TV0lUQ0hfQ0hBTk5FTF9PUEVSQVRJT046CisJCS8qCisJCSAqIFRoZSBhYm92ZSBjb2RlIHNob3VsZCBhbHNvIHVzZSB0aGUgY2FsbGJhY2suCisJCSAqIG1lY2hhbmlzbSBiZWxvdywgdGhlcmUgaXMgc2NvcGUgZm9yIGNsZWFudXAgaGVyZS4KKwkJICogVEhhdCB3YXkgYWxsIHRoaXMgcmVzcG9uc2UgaGFuZGxlciBkb2VzIGlzIGNhbGwgdGhlIGNhbGwgYmFjaworCQkgKiBXZSBjYW4gZ2V0IHJpZCBvZiB0aGUgcmVhc29uIGNvZGUgaGVyZS4KKwkJICovCisJCWlmIChwTWFjLT5saW0uZ3BjaGFuZ2VDaGFubmVsQ2FsbGJhY2spIHsKKwkJCVBFTE9HMShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJCSAgICAgICAiQ2hhbm5lbCBjaGFuZ2VkIGhlbmNlIGludm9rZSByZWdpc3RlcmVkIGNhbGwgYmFjayIpOworCQkJICAgICAgICkKKwkJCXBNYWMtPmxpbS5ncGNoYW5nZUNoYW5uZWxDYWxsYmFjayhwTWFjLCBzdGF0dXMsCisJCQkJCQkJICBwTWFjLT5saW0uCisJCQkJCQkJICBncGNoYW5nZUNoYW5uZWxEYXRhLAorCQkJCQkJCSAgcHNlc3Npb25FbnRyeSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMSU1fU1dJVENIX0NIQU5ORUxfU0FQX0RGUzoKKwl7CisJCS8qIE5vdGU6IFRoaXMgZXZlbnQgY29kZSBzcGVjaWZpYyB0byBTQVAgbW9kZQorCQkgKiBXaGVuIFNBUCBzZXNzaW9uIGlzc3VlcyBjaGFubmVsIGNoYW5nZSBhcyBwZXJmb3JtaW5nCisJCSAqIERGUywgd2Ugd2lsbCBjb21lIGhlcmUuIE90aGVyIHNlc3Npb25zLCBmb3IgZS5nLiBQMlAKKwkJICogd2lsbCBoYXZlIHRvIGRlZmluZSB0aGVpciBvd24gZXZlbnQgY29kZSBhbmQgY2hhbm5lbAorCQkgKiBzd2l0Y2ggaGFuZGxlci4gVGhpcyBpcyByZXF1aXJlZCBzaW5jZSB0aGUgU01FIG1heQorCQkgKiByZXF1aXJlIGNvbXBsZXRlbHkgZGlmZmVyZW50IGluZm9ybWF0aW9uIGZvciBQMlAgdW5saWtlCisJCSAqIFNBUC4KKwkJICovCisJCWxpbV9zZW5kX3NtZV9hcF9jaGFubmVsX3N3aXRjaF9yZXNwKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQkJCQkgICAgcENobmxQYXJhbXMpOworCX0KKwlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJY2RmX21lbV9mcmVlKGJvZHkpOworfQorCisvKioKKyAqICAgICBAZnVuY3Rpb24gOiBsaW1faGFuZGxlX2RlbF9ic3NfaW5fcmVfYXNzb2NfY29udGV4dAorICogICAgIEBicmllZiAgICAgIDogV2hpbGUgUHJvY2Vzc2luZyB0aGUgUmVBc3NvY2lhdGlvbiBSZXNwb25zZSBGcmFtZSBpbiBTVEEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhLiBpbW1lZGlhdGVseSBhZnRlciByZWNlaXZpbmcgdGhlIFJlYXNzb2MgUmVzcG9uc2UgdGhlIFJ4Q2xlYW5VcCBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgaXNzdWVkIGFuZCB0aGUgZW5kIG9mIERlbEJTUyB0aGUgbmV3IEJTUyBpcyBiZWluZyBhZGRlZC4KKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBiIC5JZiBhbiBBUCByZWplY3RzIHRoZSBSZUFzc29jaWF0aW9uIChEaXNhc3NvYyAvIERlYXV0aCkgd2l0aCBzb21lIGNvbnRleHQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSwgV2UgbmVlZCB0byB1cGRhdGUgQ1NSIHdpdGggUmVBc3NvY0NORiBSZXNwb25zZSB3aXRoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgUmVBc3NvYyBGYWlsIGFuZCB0aGUgcmVhc29uIENvZGUsIHRoYXQgaXMgYWxzbyBiZWluZyBoYW5kbGVkIGluIHRoZSBERUxCU1MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgb25seQorICoKKyAqICAgICBAcGFyYW0gOiAgIHBNYWMgLSB0cEFuaVNpckdsb2JhbAorICogICAgICAgICAgICAgICAgICAgICBwU3RhRHMgLSBTdGF0aW9uIERlc2NyaXB0b3IKKyAqCisgKiAgICAgQHJldHVybiA6ICBub25lCisgKi8KK3N0YXRpYyB2b2lkCitsaW1faGFuZGxlX2RlbF9ic3NfaW5fcmVfYXNzb2NfY29udGV4dCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywKKwkJCQkgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0TGltTWxtUmVhc3NvY0NuZiBtbG1SZWFzc29jQ25mOworCS8qCisJICogU2tpcHBlZCB0aGUgRGVsZXRlRFBIIEhhc2ggRW50cnkgYXMgd2UgbmVlZCBpdCBmb3IgdGhlIG5ldyBCU1MKKwkgKiBTZXQgdGhlIE1sbVN0YXRlIHRvIElETEUKKwkgKi8KKwlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0lETEVfU1RBVEU7CisJLyogVXBkYXRlIFBFIHNlc3Npb24gSWQgKi8KKwltbG1SZWFzc29jQ25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCXN3aXRjaCAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpIHsKKwljYXNlIGVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEU6CisJeworCQl0cFNpckFzc29jUnNwIGFzc29jUnNwOworCQl0cERwaEhhc2hOb2RlIHBTdGFEczsKKwkJdFNpclJldFN0YXR1cyByZXRTdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisJCXRwU2NoQmVhY29uU3RydWN0IGJlYWNvbl9zdHJ1Y3Q7CisJCWJlYWNvbl9zdHJ1Y3QgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNjaEJlYWNvblN0cnVjdCkpOworCQlpZiAoTlVMTCA9PSBiZWFjb25fc3RydWN0KSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJiZWFjb25TdHJ1Y3QgYWxsb2MgZmFpbGVkIikpOworCQkJbWxtUmVhc3NvY0NuZi5yZXN1bHRDb2RlID0KKwkJCQkJZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQkJbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9CisJCQkJCWVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKwkJCWxpbV9kZWxldGVfZHBoX2hhc2hfZW50cnkocE1hYywgcHNlc3Npb25FbnRyeS0+YnNzSWQsCisJCQkJRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsIHBzZXNzaW9uRW50cnkpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQkvKiBEZWxldGUgdGhlIG9sZGVyIFNUQSBUYWJsZSBlbnRyeSAqLworCQlsaW1fZGVsZXRlX2RwaF9oYXNoX2VudHJ5KHBNYWMsIHBzZXNzaW9uRW50cnktPmJzc0lkLAorCQkJCURQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLCBwc2Vzc2lvbkVudHJ5KTsKKwkJLyoKKwkJICogQWRkIGFuIGVudHJ5IGZvciBBUCB0byBoYXNoIHRhYmxlCisJCSAqIG1haW50YWluZWQgYnkgRFBIIG1vZHVsZQorCQkgKi8KKwkJcFN0YURzID0gZHBoX2FkZF9oYXNoX2VudHJ5KHBNYWMsCisJCQkJcHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkLAorCQkJCURQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLAorCQkJCSZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJaWYgKHBTdGFEcyA9PSBOVUxMKSB7CisJCQkvKiBDb3VsZCBub3QgYWRkIGhhc2ggdGFibGUgZW50cnkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiY291bGQgbm90IGFkZCBoYXNoIGVudHJ5IGF0IERQSCBmb3IgIikpOworCQkJbGltX3ByaW50X21hY19hZGRyKHBNYWMsCisJCQkJcHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkLCBMT0dFKTsKKwkJCW1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9CisJCQkJZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQkJbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJCQlnb3RvIGVycm9yOworCQl9CisJCS8qCisJCSAqIFdoaWxlIFByb2Nlc3NpbmcgdGhlIFJlQXNzb2MgUmVzcG9uc2UgRnJhbWUgdGhlIFJlQXNzb2NSc3AgRnJhbWUKKwkJICogaXMgYmVpbmcgc3RvcmVkIHRvIGJlIHVzZWQgaGVyZSBmb3Igc2VuZGluZyBBRERCU1MKKwkJICovCisJCWFzc29jUnNwID0KKwkJCSh0cFNpckFzc29jUnNwKSBwc2Vzc2lvbkVudHJ5LT5saW1Bc3NvY1Jlc3BvbnNlRGF0YTsKKwkJbGltX3VwZGF0ZV9hc3NvY19zdGFfZGF0YXMocE1hYywgcFN0YURzLCBhc3NvY1JzcCwKKwkJCXBzZXNzaW9uRW50cnkpOworCQlsaW1fdXBkYXRlX3JlX2Fzc29jX2dsb2JhbHMocE1hYywgYXNzb2NSc3AsIHBzZXNzaW9uRW50cnkpOworCQlsaW1fZXh0cmFjdF9hcF9jYXBhYmlsaXRpZXMocE1hYywKKwkJCSh1aW50OF90ICopIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbi5pZUZpZWxkcywKKwkJCWxpbV9nZXRfaWVsZW5fZnJvbV9ic3NfZGVzY3JpcHRpb24oCisJCQkJJnBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbiksCisJCQkJYmVhY29uX3N0cnVjdCk7CisJCWlmIChwTWFjLT5saW0uZ0xpbVByb3RlY3Rpb25Db250cm9sICE9CisJCSAgICBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0RJU0FCTEUpCisJCQlsaW1fZGVjaWRlX3N0YV9wcm90ZWN0aW9uX29uX2Fzc29jKHBNYWMsCisJCQkJYmVhY29uX3N0cnVjdCwKKwkJCQlwc2Vzc2lvbkVudHJ5KTsKKwkJaWYgKGJlYWNvbl9zdHJ1Y3QtPmVycFByZXNlbnQpIHsKKwkJCWlmIChiZWFjb25fc3RydWN0LT5lcnBJRUluZm8uYmFya2VyUHJlYW1ibGVNb2RlKQorCQkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZSA9IDA7CisJCQllbHNlCisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZTaG9ydFByZWFtYmxlID0gMTsKKwkJfQorCQkvKgorCQkgKiB1cGRhdGVCc3MgZmxhZyBpcyBmYWxzZSwgYXMgaW4gdGhpcyBjYXNlLCBQRSBpcyBmaXJzdAorCQkgKiBkZWxldGluZyB0aGUgZXhpc3RpbmcgQlNTIGFuZCB0aGVuIGFkZGluZyBhIG5ldyBvbmUKKwkJICovCisJCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkJICAgIGxpbV9zdGFfc2VuZF9hZGRfYnNzKHBNYWMsIGFzc29jUnNwLCBiZWFjb25fc3RydWN0LAorCQkJCSZwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+YnNzRGVzY3JpcHRpb24sCisJCQkJZmFsc2UsIHBzZXNzaW9uRW50cnkpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIlBvc3RpbmcgQUREQlNTIGluIHRoZSBSZUFzc29jQ3R4IGhhcyBGYWlsZWQgIikpOworCQkJcmV0U3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQl9CisJCWlmIChyZXRTdGF0dXMgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQltbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPQorCQkJCWVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKwkJCW1sbVJlYXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPQorCQkJCWVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKwkJCWNkZl9tZW1fZnJlZShhc3NvY1JzcCk7CisJCQlwTWFjLT5saW0uZ0xpbUFzc29jUmVzcG9uc2VEYXRhID0gTlVMTDsKKwkJCWNkZl9tZW1fZnJlZShiZWFjb25fc3RydWN0KTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJY2RmX21lbV9mcmVlKGFzc29jUnNwKTsKKwkJY2RmX21lbV9mcmVlKGJlYWNvbl9zdHJ1Y3QpOworCQlwc2Vzc2lvbkVudHJ5LT5saW1Bc3NvY1Jlc3BvbnNlRGF0YSA9IE5VTEw7CisJfQorCWJyZWFrOworCWNhc2UgZUxJTV9TTUVfV1RfUkVBU1NPQ19MSU5LX0ZBSUxfU1RBVEU6CisJeworCQkvKiogQ2FzZSB3aGVyZWluIHRoZSBEaXNBc3NvYyAvIERlYXV0aAorCQkgKiAgIGJlaW5nIHNlbnQgYXMgcmVzcG9uc2UgdG8gUmVBc3NvYyBSZXEqLworCQkvKiogU2VuZCB0aGUgUmVhc29uIGNvZGUgYXMgdGhlIHNhbWUgcmVjZWl2ZWQgaW4gRGlzYXNzb2MgLyBEZWF1dGggRnJhbWUqLworCQltbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPQorCQkJcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uOworCQltbG1SZWFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0KKwkJCXBTdGFEcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcjsKKwkJLyoqIFNldCB0aGUgU01FIFN0YXRlIGJhY2sgdG8gV1RfUmVhc3NvYyBTdGF0ZSovCisJCXBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURTsKKwkJbGltX2RlbGV0ZV9kcGhfaGFzaF9lbnRyeShwTWFjLCBwU3RhRHMtPnN0YUFkZHIsCisJCQkJCSAgcFN0YURzLT5hc3NvY0lkLCBwc2Vzc2lvbkVudHJ5KTsKKwkJaWYgKExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCQkgICAgTElNX0lTX0JUX0FNUF9TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPQorCQkJCWVMSU1fTUxNX0lETEVfU1RBVEU7CisJCX0KKwkJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywgTElNX01MTV9SRUFTU09DX0NORiwKKwkJCQkgICAgICh1aW50MzJfdCAqKSAmbWxtUmVhc3NvY0NuZik7CisJfQorCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJEZWxCc3MgaXMgYmVpbmcgaW52b2tlZCBpbiB0aGUgd3Jvbmcgc3lzdGVtIFJvbGUgL3VuaGFuZGxlZCAgU01FIFN0YXRlIikpOworCisJCW1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisJCW1sbVJlYXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPQorCQkJZVNJUl9TTUVfVU5FWFBFQ1RFRF9SRVFfUkVTVUxUX0NPREU7CisJCWdvdG8gZXJyb3I7CisJfQorCXJldHVybjsKK2Vycm9yOgorCWxpbV9wb3N0X3NtZV9tZXNzYWdlKHBNYWMsIExJTV9NTE1fUkVBU1NPQ19DTkYsCisJCQkgICAgICh1aW50MzJfdCAqKSAmbWxtUmVhc3NvY0NuZik7Cit9CisKKy8qIEFkZGVkIEZvciBCVCAtQU1QIFN1cHBvcnQgKi8KK3N0YXRpYyB2b2lkCitsaW1fcHJvY2Vzc19idGFtcF9hZGRfYnNzX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSwKKwkJCSAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdExpbU1sbVN0YXJ0Q25mIG1sbVN0YXJ0Q25mOworCXRwQWRkQnNzUGFyYW1zIHBBZGRCc3NQYXJhbXMgPSAodHBBZGRCc3NQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisKKwlpZiAoTlVMTCA9PSBwQWRkQnNzUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgYm9keSBwb2ludGVyIGluIG1lc3NhZ2UiKSk7CisJCWdvdG8gZW5kOworCX0KKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHBBZGRCc3NQYXJhbXMtPnN0YXR1cykgeworCQlsaW1fbG9nKHBNYWMsIExPRzIsCisJCQlGTCgiV01BX0FERF9CU1NfUlNQIHJldHVybmVkIHdpdGggQ0RGX1NUQVRVU19TVUNDRVNTIikpOworCQlpZiAocHNlc3Npb25FbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX0FQX01PREUpIHsKKwkJCWlmIChsaW1fc2V0X2xpbmtfc3RhdGUKKwkJCQkgICAgKHBNYWMsIGVTSVJfTElOS19CVEFNUF9BUF9TVEFURSwKKwkJCQkgICAgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLAorCQkJCSAgICBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MpCisJCQkJZ290byBlbmQ7CisJCX0gZWxzZSBpZiAocHNlc3Npb25FbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX1NUQV9NT0RFKSB7CisJCQlpZiAobGltX3NldF9saW5rX3N0YXRlCisJCQkJICAgIChwTWFjLCBlU0lSX0xJTktfU0NBTl9TVEFURSwgcHNlc3Npb25FbnRyeS0+YnNzSWQsCisJCQkJICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLAorCQkJCSAgICBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MpCisJCQkJZ290byBlbmQ7CisJCX0KKwkJLyogU2V0IE1MTUUgc3RhdGUgKi8KKwkJcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURTsKKwkJcHNlc3Npb25FbnRyeS0+c3RhdHlwZUZvckJzcyA9IFNUQV9FTlRSWV9TRUxGOyAvKiB0byBrbm93IHNlc3Npb24gc3RhcnRlZCBmb3IgcGVlciBvciBmb3Igc2VsZiAqLworCQlwc2Vzc2lvbkVudHJ5LT5ic3NJZHggPSAodWludDhfdCkgcEFkZEJzc1BhcmFtcy0+YnNzSWR4OworCQlzY2hfZWRjYV9wcm9maWxlX3VwZGF0ZShwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJbGltX2luaXRfcGVlcl9pZHhwb29sKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCisJCS8qIEFwcGx5IHByZXZpb3VzbHkgc2V0IGNvbmZpZ3VyYXRpb24gYXQgSFcgKi8KKwkJbGltX2FwcGx5X2NvbmZpZ3VyYXRpb24ocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCXBzZXNzaW9uRW50cnktPnN0YUlkID0gcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFJZHg7CisJCW1sbVN0YXJ0Q25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCX0gZWxzZSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIldNQV9BRERfQlNTX1JFUSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiKSwKKwkJCXBBZGRCc3NQYXJhbXMtPnN0YXR1cyk7CisJCW1sbVN0YXJ0Q25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9IQUxfU0VORF9NRVNTQUdFX0ZBSUw7CisJfQorCW1sbVN0YXJ0Q25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCWxpbV9wb3N0X3NtZV9tZXNzYWdlKHBNYWMsIExJTV9NTE1fU1RBUlRfQ05GLCAodWludDMyX3QgKikgJm1sbVN0YXJ0Q25mKTsKK2VuZDoKKwlpZiAoMCAhPSBsaW1Nc2dRLT5ib2R5cHRyKSB7CisJCWNkZl9tZW1fZnJlZShwQWRkQnNzUGFyYW1zKTsKKwkJbGltTXNnUS0+Ym9keXB0ciA9IE5VTEw7CisJfQorfQorCisvKioKKyAqICAgICBAZnVuY3Rpb24gOiBsaW1faGFuZGxlX2FkZF9ic3NfaW5fcmVfYXNzb2NfY29udGV4dAorICogICAgIEBicmllZiAgICAgIDogV2hpbGUgUHJvY2Vzc2luZyB0aGUgUmVBc3NvY2lhdGlvbiBSZXNwb25zZSBGcmFtZSBpbiBTVEEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhLiBpbW1lZGlhdGVseSBhZnRlciByZWNlaXZpbmcgdGhlIFJlYXNzb2MgUmVzcG9uc2UgdGhlIFJ4Q2xlYW5VcCBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgaXNzdWVkIGFuZCB0aGUgZW5kIG9mIERlbEJTUyB0aGUgbmV3IEJTUyBpcyBiZWluZyBhZGRlZC4KKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBiIC5JZiBhbiBBUCByZWplY3RzIHRoZSBSZUFzc29jaWF0aW9uIChEaXNhc3NvYyAvIERlYXV0aCkgd2l0aCBzb21lIGNvbnRleHQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSwgV2UgbmVlZCB0byB1cGRhdGUgQ1NSIHdpdGggUmVBc3NvY0NORiBSZXNwb25zZSB3aXRoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgUmVBc3NvYyBGYWlsIGFuZCB0aGUgcmVhc29uIENvZGUsIHRoYXQgaXMgYWxzbyBiZWluZyBoYW5kbGVkIGluIHRoZSBERUxCU1MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgb25seQorICoKKyAqICAgICBAcGFyYW0gOiAgIHBNYWMgLSB0cEFuaVNpckdsb2JhbAorICogICAgICAgICAgICAgICAgICAgICBwU3RhRHMgLSBTdGF0aW9uIERlc2NyaXB0b3IKKyAqCisgKiAgICAgQHJldHVybiA6ICBub25lCisgKi8KK3ZvaWQKK2xpbV9oYW5kbGVfYWRkX2Jzc19pbl9yZV9hc3NvY19jb250ZXh0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YURzLAorCQkJCSAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRMaW1NbG1SZWFzc29jQ25mIG1sbVJlYXNzb2NDbmY7CisJLyoqIFNraXBwZWQgdGhlIERlbGV0ZURQSCBIYXNoIEVudHJ5IGFzIHdlIG5lZWQgaXQgZm9yIHRoZSBuZXcgQlNTKi8KKwkvKiogU2V0IHRoZSBNbG1TdGF0ZSB0byBJRExFKi8KKwlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0lETEVfU1RBVEU7CisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKSk7CisJc3dpdGNoIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSkgeworCWNhc2UgZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURTogeworCQl0cFNpckFzc29jUnNwIGFzc29jUnNwOworCQl0cERwaEhhc2hOb2RlIHBTdGFEczsKKwkJdFNpclJldFN0YXR1cyByZXRTdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisJCXRTY2hCZWFjb25TdHJ1Y3QgKnBCZWFjb25TdHJ1Y3Q7CisJCXBCZWFjb25TdHJ1Y3QgPQorCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTY2hCZWFjb25TdHJ1Y3QpKTsKKwkJaWYgKE5VTEwgPT0gcEJlYWNvblN0cnVjdCkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiBsaW1faGFuZGxlX2FkZF9ic3NfaW5fcmVfYXNzb2NfY29udGV4dCIpKTsKKwkJCW1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9CisJCQkJZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQkJbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9CisJCQkJZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQkJZ290byBFcnJvcjsKKwkJfQorCQkvKiBHZXQgdGhlIEFQIGVudHJ5IGZyb20gRFBIIGhhc2ggdGFibGUgKi8KKwkJcFN0YURzID0KKwkJCWRwaF9nZXRfaGFzaF9lbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCQkJICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQlpZiAocFN0YURzID09IE5VTEwpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJGYWlsIHRvIGdldCBTVEEgUEVFUiBlbnRyeSBmcm9tIGhhc2giKSk7CisJCQkgICAgICAgKQorCQkJbWxtUmVhc3NvY0NuZi5yZXN1bHRDb2RlID0KKwkJCQllU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJCQltbG1SZWFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKwkJCWNkZl9tZW1fZnJlZShwQmVhY29uU3RydWN0KTsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwkJLyoqIFdoaWxlIFByb2Nlc3NpbmcgdGhlIFJlQXNzb2MgUmVzcG9uc2UgRnJhbWUgdGhlIFJlQXNzb2NSc3AgRnJhbWUKKwkJICogICBpcyBiZWluZyBzdG9yZWQgdG8gYmUgdXNlZCBoZXJlIGZvciBzZW5kaW5nIEFEREJTUworCQkgKi8KKwkJYXNzb2NSc3AgPQorCQkJKHRwU2lyQXNzb2NSc3ApIHBzZXNzaW9uRW50cnktPmxpbUFzc29jUmVzcG9uc2VEYXRhOworCQlsaW1fdXBkYXRlX2Fzc29jX3N0YV9kYXRhcyhwTWFjLCBwU3RhRHMsIGFzc29jUnNwLAorCQkJCQkgICBwc2Vzc2lvbkVudHJ5KTsKKwkJbGltX3VwZGF0ZV9yZV9hc3NvY19nbG9iYWxzKHBNYWMsIGFzc29jUnNwLCBwc2Vzc2lvbkVudHJ5KTsKKwkJbGltX2V4dHJhY3RfYXBfY2FwYWJpbGl0aWVzKHBNYWMsCisJCQkJCSAgICAodWludDhfdCAqKSBwc2Vzc2lvbkVudHJ5LT4KKwkJCQkJICAgIHBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbi4KKwkJCQkJICAgIGllRmllbGRzLAorCQkJCQkgICAgbGltX2dldF9pZWxlbl9mcm9tX2Jzc19kZXNjcmlwdGlvbgorCQkJCQkJICAgICgmcHNlc3Npb25FbnRyeS0+CisJCQkJCQkgICAgcExpbVJlQXNzb2NSZXEtPgorCQkJCQkJICAgIGJzc0Rlc2NyaXB0aW9uKSwKKwkJCQkJICAgIHBCZWFjb25TdHJ1Y3QpOworCQlpZiAocE1hYy0+bGltLmdMaW1Qcm90ZWN0aW9uQ29udHJvbCAhPQorCQkgICAgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorCQkJbGltX2RlY2lkZV9zdGFfcHJvdGVjdGlvbl9vbl9hc3NvYyhwTWFjLAorCQkJCQkJCSAgIHBCZWFjb25TdHJ1Y3QsCisJCQkJCQkJICAgcHNlc3Npb25FbnRyeSk7CisKKwkJaWYgKHBCZWFjb25TdHJ1Y3QtPmVycFByZXNlbnQpIHsKKwkJCWlmIChwQmVhY29uU3RydWN0LT5lcnBJRUluZm8uYmFya2VyUHJlYW1ibGVNb2RlKQorCQkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy4KKwkJCQlmU2hvcnRQcmVhbWJsZSA9IDA7CisJCQllbHNlCisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLgorCQkJCWZTaG9ydFByZWFtYmxlID0gMTsKKwkJfQorCisJCXBzZXNzaW9uRW50cnktPmlzTm9uUm9hbVJlYXNzb2MgPSAxOworCQlpZiAoZVNJUl9TVUNDRVNTICE9CisJCSAgICBsaW1fc3RhX3NlbmRfYWRkX2JzcyhwTWFjLCBhc3NvY1JzcCwgcEJlYWNvblN0cnVjdCwKKwkJCQkJICZwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+CisJCQkJCSBic3NEZXNjcmlwdGlvbiwgdHJ1ZSwKKwkJCQkJIHBzZXNzaW9uRW50cnkpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwKKwkJCQkJKCJQb3N0aW5nIEFEREJTUyBpbiB0aGUgUmVBc3NvY0NvbnRleHQgaGFzIEZhaWxlZCAiKSk7CisJCQlyZXRTdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisJCX0KKwkJaWYgKHJldFN0YXR1cyAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCW1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9CisJCQkJZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQkJbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9CisJCQkJZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCQkJY2RmX21lbV9mcmVlKGFzc29jUnNwKTsKKwkJCXBNYWMtPmxpbS5nTGltQXNzb2NSZXNwb25zZURhdGEgPSBOVUxMOworCQkJY2RmX21lbV9mcmVlKHBCZWFjb25TdHJ1Y3QpOworCQkJZ290byBFcnJvcjsKKwkJfQorCQljZGZfbWVtX2ZyZWUoYXNzb2NSc3ApOworCQlwc2Vzc2lvbkVudHJ5LT5saW1Bc3NvY1Jlc3BvbnNlRGF0YSA9IE5VTEw7CisJCWNkZl9tZW1fZnJlZShwQmVhY29uU3RydWN0KTsKKwl9CisJYnJlYWs7CisJY2FzZSBlTElNX1NNRV9XVF9SRUFTU09DX0xJTktfRkFJTF9TVEFURTogeworCQkvKiBDYXNlIHdoZXJlaW4gdGhlIERpc0Fzc29jIC8gRGVhdXRoCisJCSAqIGJlaW5nIHNlbnQgYXMgcmVzcG9uc2UgdG8gUmVBc3NvYyBSZXEKKwkJICogU2VuZCB0aGUgUmVhc29uIGNvZGUgYXMgdGhlIHNhbWUgcmVjZWl2ZWQKKwkJICogaW4gRGlzYXNzb2MgLyBEZWF1dGggRnJhbWUKKwkJICovCisJCW1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9CisJCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb247CisJCW1sbVJlYXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPQorCQkJcFN0YURzLT5tbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyOworCQkvKiogU2V0IHRoZSBTTUUgU3RhdGUgYmFjayB0byBXVF9SZWFzc29jIFN0YXRlKi8KKwkJcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFOworCQlsaW1fZGVsZXRlX2RwaF9oYXNoX2VudHJ5KHBNYWMsIHBTdGFEcy0+c3RhQWRkciwKKwkJCQkJICBwU3RhRHMtPmFzc29jSWQsIHBzZXNzaW9uRW50cnkpOworCQlpZiAoTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9CisJCQkJZUxJTV9NTE1fSURMRV9TVEFURTsKKwkJCU1UUkFDRShtYWNfdHJhY2UKKwkJCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpKTsKKwkJfQorCisJCWxpbV9wb3N0X3NtZV9tZXNzYWdlKHBNYWMsIExJTV9NTE1fUkVBU1NPQ19DTkYsCisJCQkJICAgICAodWludDMyX3QgKikgJm1sbVJlYXNzb2NDbmYpOworCX0KKwlicmVhazsKKwlkZWZhdWx0OgorCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiRGVsQnNzIGlzIGJlaW5nIGludm9rZWQgaW4gdGhlIHdyb25nIHN5c3RlbSBSb2xlIC91bmhhbmRsZWQgIFNNRSBTdGF0ZSIpKTsKKwkJICAgICAgICkKKwkJbWxtUmVhc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKwkJbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9CisJCQllU0lSX1NNRV9VTkVYUEVDVEVEX1JFUV9SRVNVTFRfQ09ERTsKKwkJZ290byBFcnJvcjsKKwl9CisJcmV0dXJuOworRXJyb3I6CisJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywgTElNX01MTV9SRUFTU09DX0NORiwKKwkJCSAgICAgKHVpbnQzMl90ICopICZtbG1SZWFzc29jQ25mKTsKK30KKwordm9pZCBsaW1fc2VuZF9iZWFjb25faW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdEJlYWNvbkdlblBhcmFtcyAqcEJlYWNvbkdlblBhcmFtcyA9IE5VTEw7CisJdFNpck1zZ1EgbGltTXNnOworCS8qKiBBbGxvY2F0ZSB0aGUgTWVtb3J5IGZvciBCZWFjb24gUHJlIE1lc3NhZ2UgYW5kIGZvciBTdGF0aW9ucyBpbiBQb3dlU2F2ZSovCisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJFcnJvcjpVbmFibGUgdG8gZ2V0IHRoZSBQRVNlc3Npb25FbnRyeSIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KKwlwQmVhY29uR2VuUGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwQmVhY29uR2VuUGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gcEJlYWNvbkdlblBhcmFtcykgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dQLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgc2VuZGluZyBiZWFjb25QcmVNZXNzYWdlIikpOworCQkgICAgICAgKQorCQlyZXR1cm47CisJfQorCWNkZl9tZW1fc2V0KHBCZWFjb25HZW5QYXJhbXMsIHNpemVvZigqcEJlYWNvbkdlblBhcmFtcyksIDApOworCWNkZl9tZW1fY29weSgodm9pZCAqKXBCZWFjb25HZW5QYXJhbXMtPmJzc0lkLAorCQkgICAgICh2b2lkICopcHNlc3Npb25FbnRyeS0+YnNzSWQsIENERl9NQUNfQUREUl9TSVpFKTsKKwlsaW1Nc2cuYm9keXB0ciA9IHBCZWFjb25HZW5QYXJhbXM7CisJc2NoX3Byb2Nlc3NfcHJlX2JlYWNvbl9pbmQocE1hYywgJmxpbU1zZyk7CisJcmV0dXJuOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisvKioKKyAqIGxpbV9zZW5kX3NtZV9zY2FuX2NhY2hlX3VwZGF0ZWRfaW5kKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcG9zdCBXTUFfU01FX1NDQU5fQ0FDSEVfVVBEQVRFRCBtZXNzYWdlIHRvIFdNQS4KKyAqIFRoaXMgbWVzc2FnZSBpcyB0aGUgaW5kaWNhdGlvbiB0byBXTUEgdGhhdCBhbGwgc2NhbiBjYWNoZSByZXN1bHRzCisgKiBhcmUgdXBkYXRlZCBmcm9tIExJTSB0byBTTUUuIE1haW5seSB1c2VkIG9ubHkgaW4gUE5PIG9mZmxvYWQgY2FzZS4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHBvc3Rpbmcgc2NhbiBjYWNoZSByZXN1bHRzIHRvIFNNRS4KKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgbGltX3NlbmRfc21lX3NjYW5fY2FjaGVfdXBkYXRlZF9pbmQodWludDhfdCBzZXNzaW9uSWQpCit7CisJY2RzX21zZ190IG1zZzsKKworCW1zZy50eXBlID0gV01BX1NNRV9TQ0FOX0NBQ0hFX1VQREFURUQ7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IE5VTEw7CisJbXNnLmJvZHl2YWwgPSBzZXNzaW9uSWQ7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkgICAgKGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSkKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTm90IGFibGUgdG8gcG9zdCBXTUFfU01FX1NDQU5fQ0FDSEVfVVBEQVRFRCBtZXNzYWdlIHRvIFdNQSIsCisJCQkgIF9fZnVuY19fKTsKK30KKyNlbmRpZgorCit2b2lkIGxpbV9zZW5kX3NjYW5fb2ZmbG9hZF9jb21wbGV0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICB0U2lyU2Nhbk9mZmxvYWRFdmVudCAqcFNjYW5FdmVudCkKK3sKKworCXBNYWMtPmxpbS5nTGltUnNwUmVxZCA9IGZhbHNlOworCWxpbV9zZW5kX3NtZV9zY2FuX3JzcChwTWFjLCBwU2NhbkV2ZW50LT5yZWFzb25Db2RlLAorCQkJcFNjYW5FdmVudC0+c2Vzc2lvbklkLCAwLCBwU2NhbkV2ZW50LT5zY2FuSWQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCWxpbV9zZW5kX3NtZV9zY2FuX2NhY2hlX3VwZGF0ZWRfaW5kKHBTY2FuRXZlbnQtPnNlc3Npb25JZCk7CisjZW5kaWYKK30KKwordm9pZCBsaW1fcHJvY2Vzc19yeF9zY2FuX2V2ZW50KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKmJ1ZikKK3sKKwl0U2lyU2Nhbk9mZmxvYWRFdmVudCAqcFNjYW5FdmVudCA9ICh0U2lyU2Nhbk9mZmxvYWRFdmVudCAqKSBidWY7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgInNjYW5faWQgPSAldSIsIHBTY2FuRXZlbnQtPnNjYW5JZCk7CisJc3dpdGNoIChwU2NhbkV2ZW50LT5ldmVudCkgeworCWNhc2UgU0NBTl9FVkVOVF9TVEFSVEVEOgorCQlicmVhazsKKwljYXNlIFNDQU5fRVZFTlRfU1RBUlRfRkFJTEVEOgorCWNhc2UgU0NBTl9FVkVOVF9DT01QTEVURUQ6CisJCWlmIChQMlBfU0NBTl9UWVBFX0xJU1RFTiA9PSBwU2NhbkV2ZW50LT5wMnBTY2FuVHlwZSkgeworCQkJbGltX3NlbmRfc21lX3JvY19yc3AocE1hYywgZVdOSV9TTUVfUkVNQUlOX09OX0NITl9SU1AsCisJCQkJCSBDREZfU1RBVFVTX1NVQ0NFU1MsCisJCQkJCSBwU2NhbkV2ZW50LT5zZXNzaW9uSWQsCisJCQkJCSBwU2NhbkV2ZW50LT5zY2FuSWQpOworCQkJY2RmX21lbV9mcmVlKHBNYWMtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcSk7CisJCQlwTWFjLT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEgPSBOVUxMOworCQkJLyoKKwkJCSAqIElmIHJlbWFpbiBvbiBjaGFubmVsIHRpbWVyIGV4cGlyZWQgYW5kIGFjdGlvbiBmcmFtZQorCQkJICogaXMgcGVuZGluZyB0aGVuIGluZGljYXRlIGNvbmZpcm1hdGlvbiB3aXRoIHN0YXR1cworCQkJICogZmFpbHVyZS4KKwkJCSAqLworCQkJaWYgKHBNYWMtPmxpbS5tZ210RnJhbWVTZXNzaW9uSWQgIT0gMHhmZikgeworCQkJCWxpbV9zZW5kX3NtZV9yc3AocE1hYywKKwkJCQkJZVdOSV9TTUVfQUNUSU9OX0ZSQU1FX1NFTkRfQ05GLAorCQkJCQllU0lSX1NNRV9TRU5EX0FDVElPTl9GQUlMLAorCQkJCQlwTWFjLT5saW0ubWdtdEZyYW1lU2Vzc2lvbklkLCAwKTsKKwkJCQlwTWFjLT5saW0ubWdtdEZyYW1lU2Vzc2lvbklkID0gMHhmZjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxpbV9zZW5kX3NjYW5fb2ZmbG9hZF9jb21wbGV0ZShwTWFjLCBwU2NhbkV2ZW50KTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNDQU5fRVZFTlRfRk9SRUlHTl9DSEFOTkVMOgorCQlpZiAoUDJQX1NDQU5fVFlQRV9MSVNURU4gPT0gcFNjYW5FdmVudC0+cDJwU2NhblR5cGUpIHsKKwkJCS8qU2VuZCBSZWFkeSBvbiBjaGFubmVsIGluZGljYXRpb24gdG8gU01FICovCisJCQlpZiAocE1hYy0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxKSB7CisJCQkJbGltX3NlbmRfc21lX3JvY19yc3AocE1hYywKKwkJCQkJCSBlV05JX1NNRV9SRU1BSU5fT05fQ0hOX1JEWV9JTkQsCisJCQkJCQkgQ0RGX1NUQVRVU19TVUNDRVNTLAorCQkJCQkJIHBTY2FuRXZlbnQtPnNlc3Npb25JZCwKKwkJCQkJCSBwU2NhbkV2ZW50LT5zY2FuSWQpOworCQkJfSBlbHNlIHsKKwkJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMKCJncExpbVJlbWFpbk9uQ2hhblJlcSBpcyBOVUxMIikpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgU0NBTl9FVkVOVF9CU1NfQ0hBTk5FTDoKKwljYXNlIFNDQU5fRVZFTlRfREVRVUVVRUQ6CisJY2FzZSBTQ0FOX0VWRU5UX1BSRUVNUFRFRDoKKwlkZWZhdWx0OgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJICAiUmVjZWl2ZWQgdW5oYW5kbGVkIHNjYW4gZXZlbnQgJXUiLAorCQkJICBwU2NhbkV2ZW50LT5ldmVudCk7CisJfQorCWNkZl9tZW1fZnJlZShidWYpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19wcm9iZV9yZXFfZnJhbWUuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfcHJvYmVfcmVxX2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NjODcxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfcHJvYmVfcmVxX2ZyYW1lLmMKQEAgLTAsMCArMSw2OTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgbGltX3Byb2Nlc3NfcHJvYmVfcmVxX2ZyYW1lLmNjIGNvbnRhaW5zIHRoZSBjb2RlCisgKiBmb3IgcHJvY2Vzc2luZyBQcm9iZSBSZXF1ZXN0IEZyYW1lLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMjgvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisKKyNpbmNsdWRlICJ1dGlsc19hcGkuaCIKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fYXNzb2NfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VyX2Rlc191dGlscy5oIgorI2luY2x1ZGUgInBhcnNlcl9hcGkuaCIKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2luY2x1ZGUgImxpbV9mdF9kZWZzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbi5oIgorCit2b2lkCisKK2xpbV9zZW5kX3NtZV9wcm9iZV9yZXFfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwKKwkJCSAgIHVpbnQ4X3QgKnBQcm9iZVJlcUlFLAorCQkJICAgdWludDMyX3QgUHJvYmVSZXFJRUxlbiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8qKgorICogbGltX2dldF93cHNwYmNfc2Vzc2lvbnMoKSAtIHRvIGdldCB3cHMgcGJzIHNlc3Npb25zCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQGFkZHI6IEEgcG9pbnRlciB0byBwcm9iZSByZXF1ZXN0IHNvdXJjZSBNQUMgYWRkcmVzc3MKKyAqIEB1dWlkX2U6IEEgcG9pbnRlciB0byBVVUlERSBlbGVtZW50IG9mIFdQUyBJRSBpbiBXUFMgUEJDIHByb2JlIHJlcXVlc3QKKyAqIEBzZXNzaW9uOiBBIHBvaW50ZXIgdG8gc3RhdGlvbiBQRSBzZXNzaW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcXVlcnkgdGhlIFdQUyBQQkMgb3ZlcmxhcC4gVGhpcyBmdW5jdGlvbgorICogY2hlY2sgV1BTIFBCQyBwcm9iZSByZXF1ZXN0IGxpbmsgbGlzdCBmb3IgUEJDIG92ZXJsYXAKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbV9nZXRfd3BzcGJjX3Nlc3Npb25zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgKmFkZHIsCisJCXVpbnQ4X3QgKnV1aWRfZSwgZVdQU1BCQ092ZXJsYXAgKm92ZXJsYXAsCisJCXRwUEVTZXNzaW9uIHNlc3Npb24pCit7CisJaW50IGNvdW50ID0gMDsKKwl0U2lyV1BTUEJDU2Vzc2lvbiAqcGJjOworCXVpbnQzMl90IGN1cl90aW1lOworCisJY3VyX3RpbWUgPSAodWludDMyX3QpIChjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpIC8KKwkJCQkJCUNERl9USUNLU19QRVJfU0VDT05EKTsKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBhZGRyLCBzaXplb2YodFNpck1hY0FkZHIpLCAwKTsKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSB1dWlkX2UsIFNJUl9XUFNfVVVJRF9MRU4sIDApOworCWZvciAocGJjID0gc2Vzc2lvbi0+cEFQV1BTUEJDU2Vzc2lvbjsgcGJjOyBwYmMgPSBwYmMtPm5leHQpIHsKKwkJaWYgKGN1cl90aW1lID4gcGJjLT50aW1lc3RhbXAgKyBTSVJfV1BTX1BCQ19XQUxLX1RJTUUpCisJCQlicmVhazsKKwkJY291bnQrKzsKKwkJaWYgKGNvdW50ID4gMSkKKwkJCWJyZWFrOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgYWRkciwgKHVpbnQ4X3QgKikgcGJjLT5hZGRyLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgdXVpZF9lLCAodWludDhfdCAqKSBwYmMtPnV1aWRfZSwKKwkJCQlTSVJfV1BTX1VVSURfTEVOKTsKKwl9CisJaWYgKGNvdW50ID4gMSkKKwkJLyogT3ZlcmxhcCAqLworCQkqb3ZlcmxhcCA9IGVTQVBfV1BTUEJDX09WRVJMQVBfSU4xMjBTOworCWVsc2UgaWYgKGNvdW50ID09IDApCisJCS8qIG5vIFdQUyBwcm9iZSByZXF1ZXN0IGluIDEyMCBzZWNvbmQgKi8KKwkJKm92ZXJsYXAgPSBlU0FQX1dQU1BCQ19OT19XUFNQQkNfUFJPQkVfUkVRX0lOMTIwUzsKKwllbHNlCisJCS8qIE9uZSBXUFMgcHJvYmUgcmVxdWVzdCBpbiAxMjAgc2Vjb25kICovCisJCSpvdmVybGFwID0gZVNBUF9XUFNQQkNfT05FX1dQU1BCQ19QUk9CRV9SRVFfSU4xMjBTOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgib3ZlcmxhcCA9ICVkIiksICpvdmVybGFwKTsKKwlzaXJfZHVtcF9idWYobWFjX2N0eCwgU0lSX0xJTV9NT0RVTEVfSUQsIExPR0UsIGFkZHIsCisJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwlzaXJfZHVtcF9idWYobWFjX2N0eCwgU0lSX0xJTV9NT0RVTEVfSUQsIExPR0UsIHV1aWRfZSwKKwkJCVNJUl9XUFNfVVVJRF9MRU4pOworCXJldHVybjsKK30KKworLyoqCisgKiBsaW1fcmVtb3ZlX3RpbWVvdXRfcGJfY3Nlc3Npb25zCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBXUFMgUEJDIHByb2JlIHJlcXVlc3QgZW50aXJlcyBmcm9tIHNwZWNpZmljIGVudHJ5IHRvIGVuZC4KKyAqCisgKioqTE9HSUM6CisgKgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwYmMgICAgVGhlIGJlZ2lubmluZyBlbnRyeSBpbiBXUFMgUEJDIHByb2JlIHJlcXVlc3QgbGluayBsaXN0CisgKgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9yZW1vdmVfdGltZW91dF9wYl9jc2Vzc2lvbnModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgIHRTaXJXUFNQQkNTZXNzaW9uICpwYmMpCit7CisJdFNpcldQU1BCQ1Nlc3Npb24gKnByZXY7CisKKwl3aGlsZSAocGJjKSB7CisJCXByZXYgPSBwYmM7CisJCXBiYyA9IHBiYy0+bmV4dDsKKworCQlQRUxPRzQobGltX2xvZyhwTWFjLCBMT0c0LCBGTCgiV1BTIFBCQyBzZXNzaW9ucyByZW1vdmUiKSk7KQorCQlQRUxPRzQoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0c0LCBwcmV2LT5hZGRyLAorCQkJICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkgICAgICAgKQorCQlQRUxPRzQoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0c0LCBwcmV2LT51dWlkX2UsCisJCQkgICAgICAgU0lSX1dQU19VVUlEX0xFTik7CisJCSAgICAgICApCisKKwkJY2RmX21lbV9mcmVlKHByZXYpOworCX0KK30KKwordm9pZCBsaW1fcmVtb3ZlX3BiY19zZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwUmVtb3ZlTWFjLAorCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJXUFNQQkNTZXNzaW9uICpwYmMsICpwcmV2ID0gTlVMTDsKKwlwcmV2ID0gcGJjID0gcHNlc3Npb25FbnRyeS0+cEFQV1BTUEJDU2Vzc2lvbjsKKworCXdoaWxlIChwYmMpIHsKKwkJaWYgKGNkZl9tZW1fY29tcGFyZSgodWludDhfdCAqKSBwYmMtPmFkZHIsCisJCQkJICAgICh1aW50OF90ICopIHBSZW1vdmVNYWMsCisJCQkJICAgIHNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQlwcmV2LT5uZXh0ID0gcGJjLT5uZXh0OworCQkJaWYgKHBiYyA9PSBwc2Vzc2lvbkVudHJ5LT5wQVBXUFNQQkNTZXNzaW9uKQorCQkJCXBzZXNzaW9uRW50cnktPnBBUFdQU1BCQ1Nlc3Npb24gPSBwYmMtPm5leHQ7CisJCQljZGZfbWVtX2ZyZWUocGJjKTsKKwkJCXJldHVybjsKKwkJfQorCQlwcmV2ID0gcGJjOworCQlwYmMgPSBwYmMtPm5leHQ7CisJfQorCit9CisKKy8qKgorICogbGltX3VwZGF0ZV9wYmNfc2Vzc2lvbl9lbnRyeQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcHJvYmUgcmVxdWVzdCB3aXRoIFdQUyBQQkMgSUUgaXMgcmVjZWl2ZWQKKyAqCisgKioqTE9HSUM6CisgKiBUaGlzIGZ1bmN0aW9uIGFkZCB0aGUgV1BTIFBCQyBwcm9iZSByZXF1ZXN0IGluIHRoZSBXUFMgUEJDIHByb2JlIHJlcXVlc3QgbGluayBsaXN0CisgKiBUaGUgbGluayBsaXN0IGlzIGluIGRlY3JlYXNlZCB0aW1lIG9yZGVyIG9mIHByb2JlIHJlcXVlc3QgdGhhdCBpcyByZWNlaXZlZC4KKyAqIFRoZSBlbnRyeSB0aGF0IGlzIG1vcmUgdGhhbiAxMjAgc2Vjb25kIGlzIHJlbW92ZWQuCisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGFkZHIgICBBIHBvaW50ZXIgdG8gcHJvYmUgcmVxdWVzdCBzb3VyY2UgTUFDIGFkZHJlc3NzCisgKiBAcGFyYW0gIHV1aWRfZSBBIHBvaW50ZXIgdG8gVVVJREUgZWxlbWVudCBvZiBXUFMgSUUKKyAqIEBwYXJhbSAgcHNlc3Npb25FbnRyeSAgIEEgcG9pbnRlciB0byBzdGF0aW9uIFBFIHNlc3Npb24KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCBsaW1fdXBkYXRlX3BiY19zZXNzaW9uX2VudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSB1aW50OF90ICphZGRyLCB1aW50OF90ICp1dWlkX2UsCisJCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJXUFNQQkNTZXNzaW9uICpwYmMsICpwcmV2ID0gTlVMTDsKKworCXVpbnQzMl90IGN1clRpbWU7CisKKwljdXJUaW1lID0KKwkJKHVpbnQzMl90KSAoY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKSAvCisJCQkgICAgQ0RGX1RJQ0tTX1BFUl9TRUNPTkQpOworCisJUEVMT0c0KGxpbV9sb2cKKwkJICAgICAgIChwTWFjLCBMT0c0LCBGTCgiUmVjZWl2ZSBXUFMgcHJvYmUgcmVxdWVzIGN1clRpbWU9JWQiKSwgY3VyVGltZSk7CisJICAgICAgICkKKwlQRUxPRzQoc2lyX2R1bXBfYnVmCisJCSAgICAgICAocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzQsIGFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCSAgICAgICApCisJUEVMT0c0KHNpcl9kdW1wX2J1ZgorCQkgICAgICAgKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0c0LCB1dWlkX2UsIFNJUl9XUFNfVVVJRF9MRU4pOworCSAgICAgICApCisKKwlwYmMgPSBwc2Vzc2lvbkVudHJ5LT5wQVBXUFNQQkNTZXNzaW9uOworCisJd2hpbGUgKHBiYykgeworCQlpZiAoY2RmX21lbV9jb21wYXJlCisJCQkgICAgKCh1aW50OF90ICopIHBiYy0+YWRkciwgKHVpbnQ4X3QgKikgYWRkciwKKwkJCSAgICBzaXplb2YodFNpck1hY0FkZHIpKQorCQkgICAgJiYgY2RmX21lbV9jb21wYXJlKCh1aW50OF90ICopIHBiYy0+dXVpZF9lLAorCQkJCSAgICAgICAodWludDhfdCAqKSB1dWlkX2UsIFNJUl9XUFNfVVVJRF9MRU4pKSB7CisJCQlpZiAocHJldikKKwkJCQlwcmV2LT5uZXh0ID0gcGJjLT5uZXh0OworCQkJZWxzZQorCQkJCXBzZXNzaW9uRW50cnktPnBBUFdQU1BCQ1Nlc3Npb24gPSBwYmMtPm5leHQ7CisJCQlicmVhazsKKwkJfQorCQlwcmV2ID0gcGJjOworCQlwYmMgPSBwYmMtPm5leHQ7CisJfQorCisJaWYgKCFwYmMpIHsKKwkJcGJjID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJXUFNQQkNTZXNzaW9uKSk7CisJCWlmIChOVUxMID09IHBiYykgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkISIpKTsKKwkJCSAgICAgICApCisJCQlyZXR1cm47CisJCX0KKwkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBiYy0+YWRkciwgKHVpbnQ4X3QgKikgYWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkJaWYgKHV1aWRfZSkKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwYmMtPnV1aWRfZSwKKwkJCQkgICAgICh1aW50OF90ICopIHV1aWRfZSwgU0lSX1dQU19VVUlEX0xFTik7CisJfQorCisJcGJjLT5uZXh0ID0gcHNlc3Npb25FbnRyeS0+cEFQV1BTUEJDU2Vzc2lvbjsKKwlwc2Vzc2lvbkVudHJ5LT5wQVBXUFNQQkNTZXNzaW9uID0gcGJjOworCXBiYy0+dGltZXN0YW1wID0gY3VyVGltZTsKKworCS8qIHJlbW92ZSBlbnRyaWVzIHRoYXQgaGF2ZSB0aW1lZCBvdXQgKi8KKwlwcmV2ID0gcGJjOworCXBiYyA9IHBiYy0+bmV4dDsKKworCXdoaWxlIChwYmMpIHsKKwkJaWYgKGN1clRpbWUgPiBwYmMtPnRpbWVzdGFtcCArIFNJUl9XUFNfUEJDX1dBTEtfVElNRSkgeworCQkJcHJldi0+bmV4dCA9IE5VTEw7CisJCQlsaW1fcmVtb3ZlX3RpbWVvdXRfcGJfY3Nlc3Npb25zKHBNYWMsIHBiYyk7CisJCQlicmVhazsKKwkJfQorCQlwcmV2ID0gcGJjOworCQlwYmMgPSBwYmMtPm5leHQ7CisJfQorfQorCisvKioKKyAqIGxpbV93cHNwYmNfY2xvc2UKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIEJTUyBpcyBjbG9zZWQKKyAqCisgKioqTE9HSUM6CisgKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZSBhbGwgdGhlIFdQUyBQQkMgZW50cmllcworICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwc2Vzc2lvbkVudHJ5ICAgQSBwb2ludGVyIHRvIHN0YXRpb24gUEUgc2Vzc2lvbgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX3dwc3BiY19jbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCisJbGltX3JlbW92ZV90aW1lb3V0X3BiX2NzZXNzaW9ucyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wQVBXUFNQQkNTZXNzaW9uKTsKKworfQorCisvKioKKyAqIGxpbV9jaGVjazExYl9yYXRlcworICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbV9wcm9jZXNzX3Byb2JlX3JlcV9mcmFtZSgpIHVwb24KKyAqIFByb2JlIFJlcXVlc3QgZnJhbWUgcmVjZXB0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2sgMTFiIHJhdGVzIGluIHN1cHBvcnRlZFJhdGVzIGFuZCBleHRlbmRlZFJhdGVzIHJhdGVzCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICByYXRlCisgKgorICogQHJldHVybiBCT09MRUFOCisgKi8KKworYm9vbCBsaW1fY2hlY2sxMWJfcmF0ZXModWludDhfdCByYXRlKQoreworCWlmICgoMHgwMiA9PSAocmF0ZSkpCisJICAgIHx8ICgweDA0ID09IChyYXRlKSkKKwkgICAgfHwgKDB4MGIgPT0gKHJhdGUpKQorCSAgICB8fCAoMHgxNiA9PSAocmF0ZSkpCisJICAgICkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX3Byb2JlX3JlcV9mcmFtZTogdG8gcHJvY2VzcyBwcm9iZSByZXEgZnJhbWUKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcnhfcGt0X2luZm86IEEgcG9pbnRlciB0byBCdWZmZXIgZGVzY3JpcHRvciArIGFzc29jaWF0ZWQgUERVcworICogQHNlc3Npb246IGEgcG9udGVyIHRvIHNlc3Npb24gZW50cnkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbgorICogUHJvYmUgUmVxdWVzdCBmcmFtZSByZWNlcHRpb24uIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHJlY2VpdmVkCisgKiBQcm9iZSBSZXF1ZXN0IGZyYW1lIGFuZCByZXNwb25kcyB3aXRoIFByb2JlIFJlc3BvbnNlLgorICogT25seSBBUCBvciBTVEEgaW4gSUJTUyBtb2RlIHRoYXQgc2VudCBsYXN0IEJlYWNvbiB3aWxsIHJlc3BvbmQgdG8KKyAqIFByb2JlIFJlcXVlc3QuCisgKiBBU1NVTVBUSU9OUzoKKyAqIDEuIEFQIG9yIFNUQSBpbiBJQlNTIG1vZGUgdGhhdCBzZW50IGxhc3QgQmVhY29uIHdpbGwgYWx3YXlzIHJlc3BvbmQKKyAqICAgIHRvIFByb2JlIFJlcXVlc3QgcmVjZWl2ZWQgd2l0aCBicm9hZGNhc3QgU1NJRC4KKyAqIE5PVEU6CisgKiAxLiBEdW5ubyB3aGF0IHRvIGRvIHdpdGggUmF0ZXMgcmVjZWl2ZWQgaW4gUHJvYmUgUmVxdWVzdCBmcmFtZQorICogMi4gRnJhbWVzIHdpdGggb3V0LW9mLW9yZGVyIGZpZWxkcy9JRXMgYXJlIGRyb3BwZWQuCisgKgorICoKKyAqIFJldHVybjogbm9uZQorICovCisKK3ZvaWQKK2xpbV9wcm9jZXNzX3Byb2JlX3JlcV9mcmFtZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50OF90ICpyeF9wa3RfaW5mbywKKwkJdHBQRVNlc3Npb24gc2Vzc2lvbikKK3sKKwl1aW50OF90ICpib2R5X3B0cjsKKwl0cFNpck1hY01nbXRIZHIgbWFjX2hkcjsKKwl1aW50MzJfdCBmcmFtZV9sZW47CisJdFNpclByb2JlUmVxIHByb2JlX3JlcTsKKwl0QW5pU1NJRCBzc2lkOworCisJLyogRG9uJ3Qgc2VuZCBwcm9iZSByZXNwb25zZXMgaWYgZGlzYWJsZWQgKi8KKwlpZiAobWFjX2N0eC0+bGltLmdMaW1Qcm9iZVJlc3BEaXNhYmxlRmxhZykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBEb24ndCBzZW5kIHByb2JlIHJlc3BvbnNlIGlmIFAyUCBnbyBpcyBzY2FubmluZyB0aWxsIHNjYW4KKwkgKiBjb21lIHRvIGlkbGUgc3RhdGUuCisJICovCisJaWYgKChzZXNzaW9uLT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKSAmJgorCQkoKG1hY19jdHgtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcSkgfHwKKwkJIChtYWNfY3R4LT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSAhPSBlTElNX0hBTF9JRExFX1NDQU5fU1RBVEUpKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzMsCisJCQlGTCgiR08gaXMgc2Nhbm5pbmcsIGRvbid0IHNlbmQgcHJvYmVyc3Agb24gZGlmZiBjaG5sIikpOworCQlyZXR1cm47CisJfQorCW1hY19oZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocnhfcGt0X2luZm8pOworCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uKSB8fAorCQlMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbikgfHwKKwkJTElNX0lTX0JUX0FNUF9TVEFfUk9MRShzZXNzaW9uKSB8fAorCQkoTElNX0lTX0lCU1NfUk9MRShzZXNzaW9uKSAmJgorCQkJIChXTUFfR0VUX1JYX0JFQUNPTl9TRU5UKHJ4X3BrdF9pbmZvKSkpKSB7CisJCWZyYW1lX2xlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocnhfcGt0X2luZm8pOworCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMywKKwkJCUZMKCJSZWNlaXZlZCBQcm9iZSBSZXF1ZXN0ICVkIGJ5dGVzIGZyb20gIiksCisJCQlmcmFtZV9sZW4pOworCQkJbGltX3ByaW50X21hY19hZGRyKG1hY19jdHgsIG1hY19oZHItPnNhLCBMT0czKTsKKwkJLyogR2V0IHBvaW50ZXIgdG8gUHJvYmUgUmVxdWVzdCBmcmFtZSBib2R5ICovCisJCWJvZHlfcHRyID0gV01BX0dFVF9SWF9NUERVX0RBVEEocnhfcGt0X2luZm8pOworCisJCS8qIFBhcnNlIFByb2JlIFJlcXVlc3QgZnJhbWUgKi8KKwkJaWYgKHNpcl9jb252ZXJ0X3Byb2JlX3JlcV9mcmFtZTJfc3RydWN0KG1hY19jdHgsIGJvZHlfcHRyLAorCQkJCWZyYW1lX2xlbiwgJnByb2JlX3JlcSkgPT0gZVNJUl9GQUlMVVJFKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIlBhcnNlIGVycm9yIFByb2JlUmVxLCBsZW5ndGg9JWQsIFNBIGlzOiAiCisJCQkJCU1BQ19BRERSRVNTX1NUUiksIGZyYW1lX2xlbiwKKwkJCQkJTUFDX0FERFJfQVJSQVkobWFjX2hkci0+c2EpKTsKKwkJCW1hY19jdHgtPnN5cy5wcm9iZUVycm9yKys7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHNlc3Npb24tPnBlUGVyc29uYSA9PSBDREZfUDJQX0dPX01PREUpIHsKKwkJCXVpbnQ4X3QgaSA9IDAsIHJhdGVfMTFiID0gMCwgb3RoZXJfcmF0ZXMgPSAwOworCQkJLyogQ2hlY2sgMTFiIHJhdGVzIGluIHN1cHBvcnRlZCByYXRlcyAqLworCQkJZm9yIChpID0gMDsgaSA8IHByb2JlX3JlcS5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlczsKKwkJCQlpKyspIHsKKwkJCQlpZiAobGltX2NoZWNrMTFiX3JhdGVzKAorCQkJCQlwcm9iZV9yZXEuc3VwcG9ydGVkUmF0ZXMucmF0ZVtpXSAmCisJCQkJCQkJCTB4N2YpKQorCQkJCQlyYXRlXzExYisrOworCQkJCWVsc2UKKwkJCQkJb3RoZXJfcmF0ZXMrKzsKKwkJCX0KKworCQkJLyogQ2hlY2sgMTFiIHJhdGVzIGluIGV4dGVuZGVkIHJhdGVzICovCisJCQlmb3IgKGkgPSAwOyBpIDwgcHJvYmVfcmVxLmV4dGVuZGVkUmF0ZXMubnVtUmF0ZXM7IGkrKykgeworCQkJCWlmIChsaW1fY2hlY2sxMWJfcmF0ZXMoCisJCQkJCXByb2JlX3JlcS5leHRlbmRlZFJhdGVzLnJhdGVbaV0gJiAweDdmKSkKKwkJCQkJcmF0ZV8xMWIrKzsKKwkJCQllbHNlCisJCQkJCW90aGVyX3JhdGVzKys7CisJCQl9CisKKwkJCWlmICgocmF0ZV8xMWIgPiAwKSAmJiAob3RoZXJfcmF0ZXMgPT0gMCkpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPRzMsCisJCQkJCUZMKCJSZWNlaXZlZCBhIHByb2JlIHJlcSBmcmFtZSB3aXRoIG9ubHkgMTFiIHJhdGVzLCBTQSBpczogIikpOworCQkJCQlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwKKwkJCQkJCW1hY19oZHItPnNhLCBMT0czKTsKKwkJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uKSAmJgorCQkJKChzZXNzaW9uLT5BUFdQU0lFcy5TaXJXUFNQcm9iZVJzcElFLkZpZWxkUHJlc2VudAorCQkJCSYgU0lSX1dQU19QUk9CUlNQX1ZFUl9QUkVTRU5UKQorCQkJJiYgKHByb2JlX3JlcS53c2NJZVByZXNlbnQgPT0gMSkKKwkJCSYmIChwcm9iZV9yZXEucHJvYmVSZXFXc2NJZUluZm8uRGV2aWNlUGFzc3dvcmRJRC5pZCA9PQorCQkJCVdTQ19QQVNTV0RfSURfUFVTSF9CVVRUT04pCisJCQkmJiAocHJvYmVfcmVxLnByb2JlUmVxV3NjSWVJbmZvLlVVSURfRS5wcmVzZW50ID09IDEpKSkgeworCQkJaWYgKHNlc3Npb24tPmZ3ZFdQU1BCQ1Byb2JlUmVxKSB7CisJCQkJc2lyX2R1bXBfYnVmKG1hY19jdHgsIFNJUl9MSU1fTU9EVUxFX0lELAorCQkJCQlMT0c0LCBtYWNfaGRyLT5zYSwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCQkJc2lyX2R1bXBfYnVmKG1hY19jdHgsIFNJUl9MSU1fTU9EVUxFX0lELAorCQkJCQlMT0c0LCBib2R5X3B0ciwgZnJhbWVfbGVuKTsKKwkJCQlsaW1fc2VuZF9zbWVfcHJvYmVfcmVxX2luZChtYWNfY3R4LCBtYWNfaGRyLT5zYSwKKwkJCQkJYm9keV9wdHIsIGZyYW1lX2xlbiwgc2Vzc2lvbik7CisJCQl9IGVsc2UgeworCQkJCWxpbV91cGRhdGVfcGJjX3Nlc3Npb25fZW50cnkobWFjX2N0eCwKKwkJCQkJbWFjX2hkci0+c2EsCisJCQkJCXByb2JlX3JlcS5wcm9iZVJlcVdzY0llSW5mby5VVUlEX0UudXVpZCwKKwkJCQkJc2Vzc2lvbik7CisJCQl9CisJCX0KKwkJc3NpZC5sZW5ndGggPSBzZXNzaW9uLT5zc0lkLmxlbmd0aDsKKwkJLyogQ29weSB0aGUgU1NJRCBmcm9tIHNlc3NpbyBlbnRyeSB0byBsb2NhbCB2YXJpYWJsZSAqLworCQljZGZfbWVtX2NvcHkoc3NpZC5zc0lkLCBzZXNzaW9uLT5zc0lkLnNzSWQsCisJCQkJc2Vzc2lvbi0+c3NJZC5sZW5ndGgpOworCisJCS8qCisJCSAqIENvbXBhcmUgcmVjZWl2ZWQgU1NJRCB3aXRoIGN1cnJlbnQgU1NJRC4gSWYgdGhleSBtYXRjaCwKKwkJICogcmVwbHkgd2l0aCBQcm9iZSBSZXNwb25zZQorCQkgKi8KKwkJaWYgKHByb2JlX3JlcS5zc0lkLmxlbmd0aCkgeworCQkJaWYgKCFzc2lkLmxlbmd0aCkKKwkJCQlnb3RvIG11bHRpcGxlU1NJRGNoZWNrOworCisJCQlpZiAoY2RmX21lbV9jb21wYXJlKCh1aW50OF90ICopICZzc2lkLAorCQkJCQkJKHVpbnQ4X3QgKikgJihwcm9iZV9yZXEuc3NJZCksCisJCQkJCQkodWludDhfdCkgKHNzaWQubGVuZ3RoICsgMSkpKSB7CisJCQkJbGltX3NlbmRfcHJvYmVfcnNwX21nbXRfZnJhbWUobWFjX2N0eCwKKwkJCQkJCW1hY19oZHItPnNhLCAmc3NpZCwKKwkJCQkJCURQSF9VU0VfTUdNVF9TVEFJRCwKKwkJCQkJCURQSF9OT05fS0VFUEFMSVZFX0ZSQU1FLAorCQkJCQkJc2Vzc2lvbiwKKwkJCQkJCXByb2JlX3JlcS5wMnBJZVByZXNlbnQpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAoc2Vzc2lvbi0+cGVQZXJzb25hID09CisJCQkJCUNERl9QMlBfR09fTU9ERSkgeworCQkJCXVpbnQ4X3QgZGlyZWN0X3NzaWRbN10gPSAiRElSRUNULSI7CisJCQkJdWludDhfdCBkaXJlY3Rfc3NpZF9sZW4gPSA3OworCQkJCWlmIChjZGZfbWVtX2NvbXBhcmUoKHVpbnQ4X3QgKikgJmRpcmVjdF9zc2lkLAorCQkJCQkodWludDhfdCAqKSAmKHByb2JlX3JlcS5zc0lkLnNzSWQpLAorCQkJCQkodWludDhfdCkgKGRpcmVjdF9zc2lkX2xlbikpKSB7CisJCQkJCWxpbV9zZW5kX3Byb2JlX3JzcF9tZ210X2ZyYW1lKG1hY19jdHgsCisJCQkJCQkJbWFjX2hkci0+c2EsCisJCQkJCQkJJnNzaWQsCisJCQkJCQkJRFBIX1VTRV9NR01UX1NUQUlELAorCQkJCQkJCURQSF9OT05fS0VFUEFMSVZFX0ZSQU1FLAorCQkJCQkJCXNlc3Npb24sCisJCQkJCQkJcHJvYmVfcmVxLnAycEllUHJlc2VudCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMywKKwkJCQkJRkwoIklnbm9yZSBQcm9iZVJlcSBmcm0gd2l0aCB1bm1hdGNoIFNTSUQgcmVjZWl2ZWQgZnJvbSAiKSk7CisJCQkJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCBtYWNfaGRyLT5zYSwKKwkJCQkJCUxPRzMpOworCQkJCQltYWNfY3R4LT5zeXMucHJvYmVCYWRTc2lkKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogQnJvYWRjYXN0IFNTSUQgaW4gdGhlIFByb2JlIFJlcXVlc3QuCisJCQkgKiBSZXBseSB3aXRoIFNTSUQgd2UncmUgY29uZmlndXJlZCB3aXRoLgorCQkJICogVHVybiBvZmYgdGhlIFNTSUQgbGVuZ3RoIHRvIDAgaWYgaGlkZGVuIFNTSUQgZmVhdHVyZQorCQkJICogaXMgcHJlc2VudAorCQkJICovCisJCQlpZiAoc2Vzc2lvbi0+c3NpZEhpZGRlbikKKwkJCQkvKgorCQkJCSAqIFdlIGFyZSByZXR1cm5pbmcgZnJvbSBoZXJlIGFzIHByb2JlIHJlcXVlc3QKKwkJCQkgKiBjb250YWlucyB0aGUgYnJvYWRjYXN0IFNTSUQuIFNvIG5vIG5lZWQgdG8KKwkJCQkgKiBzZW5kIHRoZSBwcm9iZSByZXNwCisJCQkJICovCisJCQkJcmV0dXJuOworCQkJbGltX3NlbmRfcHJvYmVfcnNwX21nbXRfZnJhbWUobWFjX2N0eCwgbWFjX2hkci0+c2EsCisJCQkJCSZzc2lkLAorCQkJCQlEUEhfVVNFX01HTVRfU1RBSUQsCisJCQkJCURQSF9OT05fS0VFUEFMSVZFX0ZSQU1FLAorCQkJCQlzZXNzaW9uLAorCQkJCQlwcm9iZV9yZXEucDJwSWVQcmVzZW50KTsKKwkJCXJldHVybjsKKwkJfQorbXVsdGlwbGVTU0lEY2hlY2s6CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMywKKwkJCUZMKCJJZ25vcmUgUHJvYmVSZXEgZnJtIHdpdGggdW5tYXRjaCBTU0lEIHJjdmVkIGZyb20iKSk7CisJCQlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwgbWFjX2hkci0+c2EsIExPRzMpOworCQltYWNfY3R4LT5zeXMucHJvYmVCYWRTc2lkKys7CisJfSBlbHNlIHsKKwkJLyogSWdub3JlIHJlY2VpdmVkIFByb2JlIFJlcXVlc3QgZnJhbWUgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0czLAorCQkJRkwoIklnbm9yaW5nIFByb2JlIFJlcXVlc3QgZnJhbWUgcmVjZWl2ZWQgZnJvbSAiKSk7CisJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCBtYWNfaGRyLT5zYSwgTE9HMyk7CisJCW1hY19jdHgtPnN5cy5wcm9iZUlnbm9yZSsrOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogbGltX2luZGljYXRlX3Byb2JlX3JlcV90b19oZGQKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19wcm9iZV9yZXFfZnJhbWVfbXVsdGlwbGVfYnNzKCkgdXBvbgorICogUHJvYmUgUmVxdWVzdCBmcmFtZSByZWNlcHRpb24uCisgKgorICoqKkxPR0lDOgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgcmVjZWl2ZWQgUHJvYmUgUmVxdWVzdCBmcmFtZSBhbmQgUGFzcworICogUHJvYmUgUmVxdWVzdCBGcmFtZSB0byBIREQuCisgKgorICogQHBhcmFtICBwTWFjICAgICAgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwQmQgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBCdWZmZXIgZGVzY3JpcHRvciArIGFzc29jaWF0ZWQgUERVcworICogQHBhcmFtICBwc2Vzc2lvbkVudHJ5ICAgICBBIHBvaW50ZXIgdG8gUEUgc2Vzc2lvbgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitsaW1faW5kaWNhdGVfcHJvYmVfcmVxX3RvX2hkZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwQmQsCisJCQkgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCXVpbnQzMl90IGZyYW1lTGVuOworCisJbGltX2xvZyhwTWFjLCBMT0cxLCAiUmVjZWl2ZWQgYSBwcm9iZSByZXF1ZXN0IGZyYW1lIik7CisKKwlwSGRyID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKHBCZCk7CisJZnJhbWVMZW4gPSBXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHBCZCk7CisKKwkvKiBzZW5kIHRoZSBwcm9iZSByZXEgdG8gU01FLiAqLworCWxpbV9zZW5kX3NtZV9tZ210X2ZyYW1lX2luZChwTWFjLCBwSGRyLT5mYy5zdWJUeXBlLAorCQkJCSAgICAodWludDhfdCAqKSBwSGRyLAorCQkJCSAgICAoZnJhbWVMZW4gKyBzaXplb2YodFNpck1hY01nbXRIZHIpKSwKKwkJCQkgICAgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLCBXTUFfR0VUX1JYX0NIKHBCZCksCisJCQkJICAgIHBzZXNzaW9uRW50cnksIDApOworfSAvKioqIGVuZCBsaW1faW5kaWNhdGVfcHJvYmVfcmVxX3RvX2hkZCgpICoqKi8KKworLyoqCisgKiBsaW1fcHJvY2Vzc19wcm9iZV9yZXFfZnJhbWVfbXVsdGlwbGVfYnNzKCkgLSB0byBwcm9jZXNzIHByb2JlIHJlcQorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBidWZfZGVzY3I6IEEgcG9pbnRlciB0byBCdWZmZXIgZGVzY3JpcHRvciArIGFzc29jaWF0ZWQgUERVcworICogQHNlc3Npb246IEEgcG9pbnRlciB0byBQRSBzZXNzaW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpIHVwb24KKyAqIFByb2JlIFJlcXVlc3QgZnJhbWUgcmVjZXB0aW9uLiBUaGlzIGZ1bmN0aW9uIGNhbGwKKyAqIGxpbV9pbmRpY2F0ZV9wcm9iZV9yZXFfdG9faGRkIGZ1bmN0aW9uIHRvIGluZGljYXRlCisgKiBQcm9iZSBSZXF1ZXN0IGZyYW1lIHRvIEhERC4gSXQgYWxzbyBjYWxsIGxpbV9wcm9jZXNzX3Byb2JlX3JlcV9mcmFtZQorICogZnVuY3Rpb24gd2hpY2ggcHJvY2VzcyByZWNlaXZlZCBQcm9iZSBSZXF1ZXN0IGZyYW1lIGFuZCByZXNwb25kcworICogd2l0aCBQcm9iZSBSZXNwb25zZS4KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltX3Byb2Nlc3NfcHJvYmVfcmVxX2ZyYW1lX211bHRpcGxlX2Jzcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJdWludDhfdCAqYnVmX2Rlc2NyLCB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXVpbnQ4X3QgaTsKKworCWlmIChzZXNzaW9uICE9IE5VTEwpIHsKKwkJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb24pKSB7CisJCQlsaW1faW5kaWNhdGVfcHJvYmVfcmVxX3RvX2hkZChtYWNfY3R4LAorCQkJCQlidWZfZGVzY3IsIHNlc3Npb24pOworCQl9CisJCWxpbV9wcm9jZXNzX3Byb2JlX3JlcV9mcmFtZShtYWNfY3R4LCBidWZfZGVzY3IsIHNlc3Npb24pOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1hY19jdHgtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LCBpKTsKKwkJaWYgKHNlc3Npb24gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbikpCisJCQlsaW1faW5kaWNhdGVfcHJvYmVfcmVxX3RvX2hkZChtYWNfY3R4LAorCQkJCQlidWZfZGVzY3IsIHNlc3Npb24pOworCQlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbikgfHwKKwkJCUxJTV9JU19JQlNTX1JPTEUoc2Vzc2lvbikgfHwKKwkJCUxJTV9JU19CVF9BTVBfQVBfUk9MRShzZXNzaW9uKSB8fAorCQkJTElNX0lTX0JUX0FNUF9TVEFfUk9MRShzZXNzaW9uKSkKKwkJCWxpbV9wcm9jZXNzX3Byb2JlX3JlcV9mcmFtZShtYWNfY3R4LAorCQkJCQlidWZfZGVzY3IsIHNlc3Npb24pOworCX0KK30KKworLyoqCisgKiBsaW1fc2VuZF9zbWVfcHJvYmVfcmVxX2luZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyB0byBzZW5kCisgKiAgZVdOSV9TTUVfV1BTX1BCQ19QUk9CRV9SRVFfSU5EIG1lc3NhZ2UgdG8gaG9zdAorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNlbmRpbmcgIGVXTklfU01FX1dQU19QQkNfUFJPQkVfUkVRX0lORAorICogdG8gaG9zdC4KKyAqCisgKiBAcGFyYW0gcGVlck1hY0FkZHIgICAgICAgSW5kaWNhdGVzIHRoZSBwZWVyIE1BQyBhZGRyIHRoYXQgdGhlIHByb2JlIHJlcXVlc3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBnZW5lcmF0ZWQuCisgKiBAcGFyYW0gcFByb2JlUmVxSUUgICAgICAgcG9pbnRlciB0byBSQVcgcHJvYmUgcmVxdWVzdCBJRQorICogQHBhcmFtIFByb2JlUmVxSUVMZW4gICAgIFRoZSBsZW5ndGggb2YgcHJvYmUgcmVxdWVzdCBJRS4KKyAqIEBwYXJhbSBwc2Vzc2lvbkVudHJ5ICAgICBBIHBvaW50ZXIgdG8gUEUgc2Vzc2lvbgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1fc2VuZF9zbWVfcHJvYmVfcmVxX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisJCQkgICB1aW50OF90ICpwUHJvYmVSZXFJRSwKKwkJCSAgIHVpbnQzMl90IFByb2JlUmVxSUVMZW4sIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpclNtZVByb2JlUmVxSW5kICpwU2lyU21lUHJvYmVSZXFJbmQ7CisJdFNpck1zZ1EgbXNnUTsKKworCXBTaXJTbWVQcm9iZVJlcUluZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU21lUHJvYmVSZXFJbmQpKTsKKwlpZiAoTlVMTCA9PSBwU2lyU21lUHJvYmVSZXFJbmQpIHsKKwkJLyogTG9nIGVycm9yICovCisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMCisJCQkJKCJjYWxsIHRvIEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfUFJPQkVfUkVRX0lORCIpKTsKKwkJcmV0dXJuOworCX0KKworCW1zZ1EudHlwZSA9IGVXTklfU01FX1dQU19QQkNfUFJPQkVfUkVRX0lORDsKKwltc2dRLmJvZHl2YWwgPSAwOworCW1zZ1EuYm9keXB0ciA9IHBTaXJTbWVQcm9iZVJlcUluZDsKKworCXBTaXJTbWVQcm9iZVJlcUluZC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9XUFNfUEJDX1BST0JFX1JFUV9JTkQ7CisJcFNpclNtZVByb2JlUmVxSW5kLT5sZW5ndGggPSBzaXplb2YodFNpclNtZVByb2JlUmVxKTsKKwlwU2lyU21lUHJvYmVSZXFJbmQtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCWNkZl9tZW1fY29weShwU2lyU21lUHJvYmVSZXFJbmQtPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwljZGZfbWVtX2NvcHkocFNpclNtZVByb2JlUmVxSW5kLT5XUFNQQkNQcm9iZVJlcS5wZWVyTWFjQWRkciwKKwkJICAgICBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbXNnUS50eXBlKSk7CisJcFNpclNtZVByb2JlUmVxSW5kLT5XUFNQQkNQcm9iZVJlcS5wcm9iZVJlcUlFTGVuID0KKwkJKHVpbnQxNl90KSBQcm9iZVJlcUlFTGVuOworCWNkZl9tZW1fY29weShwU2lyU21lUHJvYmVSZXFJbmQtPldQU1BCQ1Byb2JlUmVxLnByb2JlUmVxSUUsIHBQcm9iZVJlcUlFLAorCQkgICAgIFByb2JlUmVxSUVMZW4pOworCisJaWYgKGxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbXNnUSwgZVBST1QpICE9IGVTSVJfU1VDQ0VTUykgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgiY291bGRudCBzZW5kIHRoZSBwcm9iZSByZXEgdG8gaGRkIikpOworCQkgICAgICAgKQorCX0KKworfSAvKioqIGVuZCBsaW1fc2VuZF9zbWVfcHJvYmVfcmVxX2luZCgpICoqKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfcHJvYmVfcnNwX2ZyYW1lLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX3Byb2JlX3JzcF9mcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZGYxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX3Byb2JlX3JzcF9mcmFtZS5jCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBsaW1fcHJvY2Vzc19wcm9iZV9yc3BfZnJhbWUuY2MgY29udGFpbnMgdGhlIGNvZGUKKyAqIGZvciBwcm9jZXNzaW5nIFByb2JlIFJlc3BvbnNlIEZyYW1lLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDMvMDEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAid25pX2FwaS5oIgorI2luY2x1ZGUgInduaV9jZmcuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAic2NoX2FwaS5oIgorI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgImxpbV9hcGkuaCIKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fYXNzb2NfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fcHJvcF9leHRzX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Nlcl9kZXNfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VuZF9tZXNzYWdlcy5oIgorCisjaW5jbHVkZSAicGFyc2VyX2FwaS5oIgorCit0U2lyUmV0U3RhdHVzIGxpbV92YWxpZGF0ZV9pZV9pbmZvcm1hdGlvbl9pbl9wcm9iZV9yc3BfZnJhbWUodWludDhfdCAqcFJ4UGFja2V0SW5mbykKK3sKKwl0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKworCWlmIChXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pIDwKKwkgICAgKFNJUl9NQUNfQl9QUl9TU0lEX09GRlNFVCArIFNJUl9NQUNfTUlOX0lFX0xFTikpIHsKKwkJc3RhdHVzID0gZVNJUl9GQUlMVVJFOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfcHJvYmVfcnNwX2ZyYW1lKCkgLSBwcm9jZXNzZXMgcmVjZWl2ZWQgUHJvYmUgUmVzcG9uc2UgZnJhbWUKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcnhfUGFja2V0X2luZm86IEEgcG9pbnRlciB0byBCdWZmZXIgZGVzY3JpcHRvciArIGFzc29jaWF0ZWQgUERVcworICogQHNlc3Npb25fZW50cnk6IEhhbmRsZSB0byB0aGUgc2Vzc2lvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyByZWNlaXZlZCBQcm9iZSBSZXNwb25zZSBmcmFtZS4KKyAqIEZyYW1lcyB3aXRoIG91dC1vZi1vcmRlciBJRXMgYXJlIGRyb3BwZWQuCisgKiBJbiBjYXNlIG9mIElCU1MsIGpvaW4gJ3N1Y2Nlc3MnIG1ha2VzIE1MTSBzdGF0ZSBtYWNoaW5lCisgKiB0cmFuc2l0aW9uIGludG8gJ0JTUyBzdGFydGVkJyBzdGF0ZS4gVGhpcyBtYXkgaGF2ZSB0byBjaGFuZ2UKKyAqIGRlcGVuZGluZyBvbiBzdXBwb3J0aW5nIHdoYXQga2luZGEgQXV0aGVudGljYXRpb24gaW4gSUJTUy4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZAorbGltX3Byb2Nlc3NfcHJvYmVfcnNwX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgKnJ4X1BhY2tldF9pbmZvLAorCQkJICAgIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJdWludDhfdCAqYm9keTsKKwl1aW50MzJfdCBmcmFtZV9sZW4gPSAwOworCXRTaXJNYWNBZGRyIGN1cnJlbnRfYnNzaWQ7CisJdHBTaXJNYWNNZ210SGRyIGhlYWRlcjsKKwl0U2lyUHJvYmVSZXNwQmVhY29uICpwcm9iZV9yc3A7CisJdWludDhfdCBxb3NfZW5hYmxlZCA9IGZhbHNlOworCXVpbnQ4X3Qgd21lX2VuYWJsZWQgPSBmYWxzZTsKKworCWlmICghc2Vzc2lvbl9lbnRyeSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJzZXNzaW9uX2VudHJ5IGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCAiU2Vzc2lvbklkOiVkIFByb2JlUnNwIEZyYW1lIGlzIHJlY2VpdmVkIiwKKwkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQpOworCisJcHJvYmVfcnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJQcm9iZVJlc3BCZWFjb24pKTsKKwlpZiAoTlVMTCA9PSBwcm9iZV9yc3ApIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwKKwkJCSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSAiKSk7CisJCXJldHVybjsKKwl9CisKKwlwcm9iZV9yc3AtPnNzSWQubGVuZ3RoID0gMDsKKwlwcm9iZV9yc3AtPndwYS5sZW5ndGggPSAwOworCisJaGVhZGVyID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKHJ4X1BhY2tldF9pbmZvKTsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJRkwoIlJ4IFByb2JlIFJlc3BvbnNlIHdpdGggbGVuZ3RoID0gJWQgZnJvbSAiTUFDX0FERFJFU1NfU1RSKSwKKwkJV01BX0dFVF9SWF9NUERVX0xFTihyeF9QYWNrZXRfaW5mbyksCisJCU1BQ19BRERSX0FSUkFZKGhlYWRlci0+c2EpKTsKKworCS8qIFZhbGlkYXRlIElFIGluZm9ybWF0aW9uIGJlZm9yZSBwcm9jZXNzaW5nIFByb2JlIFJlc3BvbnNlIEZyYW1lICovCisJaWYgKGxpbV92YWxpZGF0ZV9pZV9pbmZvcm1hdGlvbl9pbl9wcm9iZV9yc3BfZnJhbWUocnhfUGFja2V0X2luZm8pICE9CisJCWVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiUGFyc2UgZXJyb3IgUHJvYmVSZXNwb25zZSwgbGVuZ3RoPSVkIiksIGZyYW1lX2xlbik7CisJCWNkZl9tZW1fZnJlZShwcm9iZV9yc3ApOworCQlyZXR1cm47CisJfQorCisJZnJhbWVfbGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihyeF9QYWNrZXRfaW5mbyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQlGTCgiUHJvYmUgUmVzcCBGcmFtZSBSZWNlaXZlZDogQlNTSUQgIgorCQlNQUNfQUREUkVTU19TVFIgIiAoUlNTSSAlZCkiKSwKKwkJTUFDX0FERFJfQVJSQVkoaGVhZGVyLT5ic3NJZCksCisJCSh1aW50KSBhYnMoKGludDhfdClXTUFfR0VUX1JYX1JTU0lfREIocnhfUGFja2V0X2luZm8pKSk7CisJLyogR2V0IHBvaW50ZXIgdG8gUHJvYmUgUmVzcG9uc2UgZnJhbWUgYm9keSAqLworCWJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShyeF9QYWNrZXRfaW5mbyk7CisJCS8qIEVuZm9yY2UgTWFuZGF0b3J5IElFcyAqLworCWlmICgoc2lyX2NvbnZlcnRfcHJvYmVfZnJhbWUyX3N0cnVjdChtYWNfY3R4LAorCQlib2R5LCBmcmFtZV9sZW4sIHByb2JlX3JzcCkgPT0gZVNJUl9GQUlMVVJFKSB8fAorCQkhcHJvYmVfcnNwLT5zc2lkUHJlc2VudCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiUGFyc2UgZXJyb3IgUHJvYmVSZXNwb25zZSwgbGVuZ3RoPSVkIiksIGZyYW1lX2xlbik7CisJCWNkZl9tZW1fZnJlZShwcm9iZV9yc3ApOworCQlyZXR1cm47CisJfQorCWxpbV9jaGVja19hbmRfYWRkX2Jzc19kZXNjcmlwdGlvbihtYWNfY3R4LCBwcm9iZV9yc3AsCisJCQkgIHJ4X1BhY2tldF9pbmZvLCBmYWxzZSwgdHJ1ZSk7CisJLyogVG8gU3VwcG9ydCBCVC1BTVAgKi8KKwlpZiAoKG1hY19jdHgtPmxpbS5nTGltTWxtU3RhdGUgPT0KKwkJCWVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUpIHx8CisJICAgIChtYWNfY3R4LT5saW0uZ0xpbU1sbVN0YXRlID09CisJCQllTElNX01MTV9QQVNTSVZFX1NDQU5fU1RBVEUpKSB7CisJCWxpbV9jaGVja19hbmRfYWRkX2Jzc19kZXNjcmlwdGlvbihtYWNfY3R4LCBwcm9iZV9yc3AsCisJCQlyeF9QYWNrZXRfaW5mbywgKChtYWNfY3R4LT5saW0uCisJCQlnTGltSGFsU2NhblN0YXRlID09IGVMSU1fSEFMX1NDQU5OSU5HX1NUQVRFKQorCQkJPyB0cnVlIDogZmFsc2UpLCB0cnVlKTsKKwl9IGVsc2UgaWYgKHNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlID09CisJCQllTElNX01MTV9XVF9KT0lOX0JFQUNPTl9TVEFURSkgeworCQkvKgorCQkgKiBFaXRoZXIgQmVhY29uL3Byb2JlIHJlc3BvbnNlIGlzIHJlcXVpcmVkLgorCQkgKiBIZW5jZSBzdG9yZSBpdCBpbiBzYW1lIGJ1ZmZlci4KKwkJICovCisJCWlmIChzZXNzaW9uX2VudHJ5LT5iZWFjb24gIT0gTlVMTCkgeworCQkJY2RmX21lbV9mcmVlKHNlc3Npb25fZW50cnktPmJlYWNvbik7CisJCQlzZXNzaW9uX2VudHJ5LT5iZWFjb24gPSBOVUxMOworCQl9CisJCXNlc3Npb25fZW50cnktPmJjbkxlbiA9CisJCQlXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHJ4X1BhY2tldF9pbmZvKTsKKwkJCXNlc3Npb25fZW50cnktPmJlYWNvbiA9CisJCQljZGZfbWVtX21hbGxvYyhzZXNzaW9uX2VudHJ5LT5iY25MZW4pOworCQlpZiAoTlVMTCA9PSBzZXNzaW9uX2VudHJ5LT5iZWFjb24pIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiTm8gTWVtb3J5IHRvIHN0b3JlIGJlYWNvbiIpKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBTdG9yZSB0aGUgQmVhY29uL1Byb2JlUnNwLgorCQkJICogVGhpcyBpcyBzZW50IHRvIGNzci9oZGQgaW4gam9pbiBjbmYgcmVzcG9uc2UuCisJCQkgKi8KKwkJCWNkZl9tZW1fY29weShzZXNzaW9uX2VudHJ5LT5iZWFjb24sCisJCQkJICAgICBXTUFfR0VUX1JYX01QRFVfREFUQQorCQkJCQkgICAgIChyeF9QYWNrZXRfaW5mbyksCisJCQkJICAgICBzZXNzaW9uX2VudHJ5LT5iY25MZW4pOworCQl9CisJCQkvKiBTVEEgaW4gV1RfSk9JTl9CRUFDT05fU1RBVEUgKi8KKwkJbGltX2NoZWNrX2FuZF9hbm5vdW5jZV9qb2luX3N1Y2Nlc3MobWFjX2N0eCwgcHJvYmVfcnNwLAorCQkJCQkJaGVhZGVyLAorCQkJCQkJc2Vzc2lvbl9lbnRyeSk7CisJfSBlbHNlIGlmIChzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSA9PQorCQkgICBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKSB7CisJCXRwRHBoSGFzaE5vZGUgc3RhX2RzID0gTlVMTDsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhpcyBQcm9iZSBSZXNwb25zZSBpcyBmb3IKKwkJICogb3VyIFByb2JlIFJlcXVlc3Qgc2VudCB1cG9uIHJlYWNoaW5nCisJCSAqIGhlYXJ0IGJlYXQgdGhyZXNob2xkCisJCSAqLworCQlzaXJfY29weV9tYWNfYWRkcihjdXJyZW50X2Jzc2lkLCBzZXNzaW9uX2VudHJ5LT5ic3NJZCk7CisJCWlmICghY2RmX21lbV9jb21wYXJlKGN1cnJlbnRfYnNzaWQsIGhlYWRlci0+YnNzSWQsCisJCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCWNkZl9tZW1fZnJlZShwcm9iZV9yc3ApOworCQkJcmV0dXJuOworCQl9CisJCWlmICghTElNX0lTX0NPTk5FQ1RJT05fQUNUSVZFKHNlc3Npb25fZW50cnkpKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoIlJlY3ZlZCBQcm9iZSBSZXNwIGZyb20gQVAsQVAtYWxpdmUiKSk7CisJCQlpZiAocHJvYmVfcnNwLT5IVEluZm8ucHJlc2VudCkKKwkJCQlsaW1fcmVjZWl2ZWRfaGJfaGFuZGxlcihtYWNfY3R4LAorCQkJCQlwcm9iZV9yc3AtPkhUSW5mby5wcmltYXJ5Q2hhbm5lbCwKKwkJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCQllbHNlCisJCQkJbGltX3JlY2VpdmVkX2hiX2hhbmRsZXIobWFjX2N0eCwKKwkJCQkJKHVpbnQ4X3QpcHJvYmVfcnNwLT5jaGFubmVsTnVtYmVyLAorCQkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJfQorCQlpZiAoTElNX0lTX1NUQV9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCQlpZiAocHJvYmVfcnNwLT5jaGFubmVsU3dpdGNoUHJlc2VudCkgeworCQkJCWxpbV91cGRhdGVfY2hhbm5lbF9zd2l0Y2gobWFjX2N0eCwKKwkJCQkJcHJvYmVfcnNwLAorCQkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJCX0gZWxzZSBpZiAoc2Vzc2lvbl9lbnRyeS0+Z0xpbVNwZWNNZ210LmRvdDExaENoYW5Td1N0YXRlCisJCQkJPT0gZUxJTV8xMUhfQ0hBTlNXX1JVTk5JTkcpIHsKKwkJCQlsaW1fY2FuY2VsX2RvdDExaF9jaGFubmVsX3N3aXRjaCgKKwkJCQkJbWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSk7CisJCQl9CisJCX0KKwkJLyoKKwkJICogTm93IFByb2Nlc3MgRURDQSBQYXJhbWV0ZXJzLCBpZiBFRENBUGFyYW1TZXQKKwkJICogY291bnQgaXMgZGlmZmVyZW50LgorCQkgKiAtLSBXaGlsZSBwcm9jZXNzaW5nIGJlYWNvbnMgaW4gbGluayBlc3RhYmxpc2hlZAorCQkgKiBzdGF0ZSBpZiBpdCBpcyBkZXRlcm1pbmVkIHRoYXQKKwkJICogUW9TIEluZm8gSUUgaGFzIGEgZGlmZmVyZW50IGNvdW50IGZvciBFRENBIFBhcmFtcywKKwkJICogYW5kIEVEQ0EgSUUgaXMgbm90IHByZXNlbnQgaW4gYmVhY29uLAorCQkgKiB0aGVuIHByb2JlIHJlcSBpcyBzZW50IG91dCB0byBnZXQgdGhlIEVEQ0EgcGFyYW1zLgorCQkgKi8KKwkJc3RhX2RzID0gZHBoX2dldF9oYXNoX2VudHJ5KG1hY19jdHgsCisJCQkJRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsCisJCQkJJnNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQlsaW1HZXRRb3NNb2RlKHNlc3Npb25fZW50cnksICZxb3NfZW5hYmxlZCk7CisJCWxpbUdldFdtZU1vZGUoc2Vzc2lvbl9lbnRyeSwgJndtZV9lbmFibGVkKTsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cyLAorCQkJRkwoIndtZUVkY2FQcmVzZW50OiAlZCB3bWVfZW5hYmxlZDogJWQiKSwKKwkJCXByb2JlX3JzcC0+d21lRWRjYVByZXNlbnQsIHdtZV9lbmFibGVkKTsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cyLAorCQkJRkwoImVkY2FQcmVzZW50OiAlZCwgcW9zX2VuYWJsZWQ6ICVkIiksCisJCQlwcm9iZV9yc3AtPmVkY2FQcmVzZW50LCBxb3NfZW5hYmxlZCk7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJCUZMKCJlZGNhUGFyYW1zLnFvc0luZm8uY291bnQ6ICVkIiksCisJCQlwcm9iZV9yc3AtPmVkY2FQYXJhbXMucW9zSW5mby5jb3VudCk7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwKKwkJCUZMKCJzY2hPYmplY3QuZ0xpbUVkY2FQYXJhbVNldENvdW50OiAlZCIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbUVkY2FQYXJhbVNldENvdW50KTsKKwkJaWYgKCgocHJvYmVfcnNwLT53bWVFZGNhUHJlc2VudCAmJiB3bWVfZW5hYmxlZCkgfHwKKwkJICAgICAocHJvYmVfcnNwLT5lZGNhUHJlc2VudCAmJiBxb3NfZW5hYmxlZCkpICYmCisJCSAgICAocHJvYmVfcnNwLT5lZGNhUGFyYW1zLnFvc0luZm8uY291bnQgIT0KKwkJICAgICBzZXNzaW9uX2VudHJ5LT5nTGltRWRjYVBhcmFtU2V0Q291bnQpKSB7CisJCQlpZiAoc2NoX2JlYWNvbl9lZGNhX3Byb2Nlc3MobWFjX2N0eCwKKwkJCQkmcHJvYmVfcnNwLT5lZGNhUGFyYW1zLAorCQkJCXNlc3Npb25fZW50cnkpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJRkwoIkVEQ0EgcGFyYW0gcHJvY2VzcyBlcnJvciIpKTsKKwkJCX0gZWxzZSBpZiAoc3RhX2RzICE9IE5VTEwpIHsKKwkJCQkvKgorCQkJCSAqIElmIG5lZWRlZCwgZG93bmdyYWRlIHRoZQorCQkJCSAqIEVEQ0EgcGFyYW1ldGVycworCQkJCSAqLworCQkJCWxpbV9zZXRfYWN0aXZlX2VkY2FfcGFyYW1zKG1hY19jdHgsCisJCQkJCQlzZXNzaW9uX2VudHJ5LT4KKwkJCQkJCWdMaW1FZGNhUGFyYW1zLAorCQkJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCQkJCWxpbV9zZW5kX2VkY2FfcGFyYW1zKG1hY19jdHgsCisJCQkJCXNlc3Npb25fZW50cnktPgorCQkJCQlnTGltRWRjYVBhcmFtc0FjdGl2ZSwKKwkJCQkJc3RhX2RzLT5ic3NJZCk7CisJCQl9IGVsc2UgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJRkwoIlNlbGZFbnRyeSBtaXNzaW5nIGluIEhhc2giKSk7CisJCQl9CisJCX0KKwkJaWYgKHNlc3Npb25fZW50cnktPmZXYWl0Rm9yUHJvYmVSc3AgPT0gdHJ1ZSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJDaGVjayBwcm9iZSByZXNwIGZvciBjYXBzIGNoYW5nZSIpKTsKKwkJCWxpbV9kZXRlY3RfY2hhbmdlX2luX2FwX2NhcGFiaWxpdGllcygKKwkJCQltYWNfY3R4LCBwcm9iZV9yc3AsIHNlc3Npb25fZW50cnkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKExJTV9JU19JQlNTX1JPTEUoc2Vzc2lvbl9lbnRyeSkgJiYKKwkJICAgIChzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSA9PQorCQkJCWVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFKSkKKwkJCWxpbV9oYW5kbGVfaWJzc19jb2FsZXNjaW5nKG1hY19jdHgsIHByb2JlX3JzcCwKKwkJCQkJcnhfUGFja2V0X2luZm8sIHNlc3Npb25fZW50cnkpOworCX0KKwljZGZfbWVtX2ZyZWUocHJvYmVfcnNwKTsKKworCS8qIElnbm9yZSBQcm9iZSBSZXNwb25zZSBmcmFtZSBpbiBhbGwgb3RoZXIgc3RhdGVzICovCisJcmV0dXJuOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX3Byb2JlX3JzcF9mcmFtZV9ub19zZXNzaW9uKCkgLSBwcm9jZXNzIFByb2JlIFJlc3BvbnNlIGZyYW1lCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJ4X3BhY2tldF9pbmZvOiBBIHBvaW50ZXIgdG8gQnVmZmVyIGRlc2NyaXB0b3IgKyBhc3NvY2lhdGVkIFBEVXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyByZWNlaXZlZCBQcm9iZSBSZXNwb25zZSBmcmFtZSB3aXRoIG5vIHNlc3Npb24uCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQKK2xpbV9wcm9jZXNzX3Byb2JlX3JzcF9mcmFtZV9ub19zZXNzaW9uKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJCQl1aW50OF90ICpyeF9wYWNrZXRfaW5mbykKK3sKKwl1aW50OF90ICpib2R5OworCXVpbnQzMl90IGZyYW1lX2xlbiA9IDA7CisJdHBTaXJNYWNNZ210SGRyIGhlYWRlcjsKKwl0U2lyUHJvYmVSZXNwQmVhY29uICpwcm9iZV9yc3A7CisKKwlwcm9iZV9yc3AgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclByb2JlUmVzcEJlYWNvbikpOworCWlmIChOVUxMID09IHByb2JlX3JzcCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTsKKwkJcmV0dXJuOworCX0KKworCXByb2JlX3JzcC0+c3NJZC5sZW5ndGggPSAwOworCXByb2JlX3JzcC0+d3BhLmxlbmd0aCA9IDA7CisKKwloZWFkZXIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocnhfcGFja2V0X2luZm8pOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cyLAorCQlGTCgiUmVjZWl2ZWQgUHJvYmUgUmVzcG9uc2UgZnJhbWUgd2l0aCBsZW5ndGg9JWQgZnJvbSAiKSwKKwkJV01BX0dFVF9SWF9NUERVX0xFTihyeF9wYWNrZXRfaW5mbykpOworCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCBoZWFkZXItPnNhLCBMT0cyKTsKKworCS8qIFZhbGlkYXRlIElFIGluZm9ybWF0aW9uIGJlZm9yZSBwcm9jZXNzaW5nIFByb2JlIFJlc3BvbnNlIEZyYW1lICovCisJaWYgKGxpbV92YWxpZGF0ZV9pZV9pbmZvcm1hdGlvbl9pbl9wcm9iZV9yc3BfZnJhbWUocnhfcGFja2V0X2luZm8pICE9CisJCQkJCQkJCWVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiUGFyc2UgZXJyb3IgUHJvYmVSZXNwb25zZSwgbGVuZ3RoPSVkIiksIGZyYW1lX2xlbik7CisJCWNkZl9tZW1fZnJlZShwcm9iZV9yc3ApOworCQlyZXR1cm47CisJfQorCisJZnJhbWVfbGVuID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihyeF9wYWNrZXRfaW5mbyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgIEZMKCJQcm9iZSBSZXNwIEZyYW1lIFJlY2VpdmVkOiBCU1NJRCAiCisJCSAgTUFDX0FERFJFU1NfU1RSICIgKFJTU0kgJWQpIiksCisJCSAgTUFDX0FERFJfQVJSQVkoaGVhZGVyLT5ic3NJZCksCisJCSAgKHVpbnQpIGFicygoaW50OF90KVdNQV9HRVRfUlhfUlNTSV9EQihyeF9wYWNrZXRfaW5mbykpKTsKKwkvKgorCSAqIEdldCBwb2ludGVyIHRvIFByb2JlIFJlc3BvbnNlIGZyYW1lIGJvZHkKKwkgKi8KKwlib2R5ID0gV01BX0dFVF9SWF9NUERVX0RBVEEocnhfcGFja2V0X2luZm8pOworCWlmIChzaXJfY29udmVydF9wcm9iZV9mcmFtZTJfc3RydWN0KG1hY19jdHgsIGJvZHksIGZyYW1lX2xlbiwKKwkJcHJvYmVfcnNwKSA9PSBlU0lSX0ZBSUxVUkUpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIlBhcnNlIGVycm9yIFByb2JlUmVzcG9uc2UsIGxlbmd0aD0lZFxuIiksCisJCQlmcmFtZV9sZW4pOworCQljZGZfbWVtX2ZyZWUocHJvYmVfcnNwKTsKKwkJcmV0dXJuOworCX0KKwlsaW1fbG9nKG1hY19jdHgsIExPRzIsIEZMKCJTYXZlIHRoaXMgcHJvYmUgcnNwIGluIExGUiBjYWNoZSIpKTsKKwlsaW1fY2hlY2tfYW5kX2FkZF9ic3NfZGVzY3JpcHRpb24obWFjX2N0eCwgcHJvYmVfcnNwLAorCQkgIHJ4X3BhY2tldF9pbmZvLCBmYWxzZSwgdHJ1ZSk7CisJY2RmX21lbV9mcmVlKHByb2JlX3JzcCk7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19zbWVfcmVxX21lc3NhZ2VzLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGI2ZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc19zbWVfcmVxX21lc3NhZ2VzLmMKQEAgLTAsMCArMSw1NjkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMuY2MgY29udGFpbnMgdGhlIGNvZGUKKyAqIGZvciBwcm9jZXNzaW5nIFNNRSByZXF1ZXN0IG1lc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgInduaV9hcGkuaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlY3VyaXR5X3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Nlcl9kZXNfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc21lX3JlcV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9pYnNzX3BlZXJfbWdtdC5oIgorI2luY2x1ZGUgImxpbV9hZG1pdF9jb250cm9sLmgiCisjaW5jbHVkZSAiZHBoX2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJsaW1fc2VuZF9tZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbV9hcGkuaCIKKyNpbmNsdWRlICJ3bW1fYXBzZC5oIgorI2luY2x1ZGUgInNpcl9tYWNfcHJvdF9kZWYuaCIKKworI2luY2x1ZGUgInNhcF9hcGkuaCIKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybV9hcGkuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2luY2x1ZGUgPGxpbV9mdC5oPgorI2VuZGlmCisKKy8qCisgKiBUaGlzIG92ZXJoZWFkIGlzIHRpbWUgZm9yIHNlbmRpbmcgTk9BIHN0YXJ0IHRvIGhvc3QgaW4gY2FzZSBvZiBHTy9zZW5kaW5nCisgKiBOVUxMIGRhdGEgJiByZWNlaXZpbmcgQUNLIGluIGNhc2Ugb2YgUDJQIENsaWVudCBhbmQgc3RhcnRpbmcgYWN0dWFsIHNjYW5uaW5nCisgKiB3aXRoIGluaXQgc2NhbiByZXEvcnNwIHBsdXMgaW4gY2FzZSBvZiBjb25jdXJyZW5jeSwgdGFraW5nIGNhcmUgb2Ygc2VuZGluZworICogbnVsbCBkYXRhIGFuZCByZWNlaXZpbmcgQUNLIHRvL2Zyb20gQVAvQWxzbyBTZXRDaGFubmVsIHdpdGggY2FsaWJyYXRpb24KKyAqIGlzIHRha2luZyBhcm91bmQgN21zIC4KKyAqLworI2RlZmluZSBTQ0FOX01FU1NBR0lOR19PVkVSSEVBRCAgICAgICAgICAgICAyMCAgLyogaW4gbXNlY3MgKi8KKyNkZWZpbmUgSk9JTl9OT0FfRFVSQVRJT04gICAgICAgICAgICAgICAgICAgMjAwMCAgICAgICAgLyogaW4gbXNlY3MgKi8KKyNkZWZpbmUgT0VNX0RBVEFfTk9BX0RVUkFUSU9OICAgICAgICAgICAgICAgNjAgIC8qIGluIG1zZWNzICovCisjZGVmaW5lIERFRkFVTFRfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FICAgIDExMCAvKiBpbiBtc2VjcyAqLworCisjZGVmaW5lIENPTlZfTVNfVE9fVVMgMTAyNCAgICAgIC8qIGNvbnZlcnNpb24gZmFjdG9yIGZyb20gbXMgdG8gdXMgKi8KKworLyogU01FIFJFUSBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRlbXBsYXRlcyAqLworc3RhdGljIGJvb2wgX19saW1fcHJvY2Vzc19zbWVfc3lzX3JlYWR5X2luZCh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7CitzdGF0aWMgYm9vbCBfX2xpbV9wcm9jZXNzX3NtZV9zdGFydF9ic3NfcmVxKHRwQW5pU2lyR2xvYmFsLCB0cFNpck1zZ1EgcE1zZyk7CitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9zY2FuX3JlcSh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7CitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9qb2luX3JlcSh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7CitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9yZWFzc29jX3JlcSh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKik7CitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9kaXNhc3NvY19yZXEodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90ICopOworc3RhdGljIHZvaWQgX19saW1fcHJvY2Vzc19zbWVfZGlzYXNzb2NfY25mKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCAqKTsKK3N0YXRpYyB2b2lkIF9fbGltX3Byb2Nlc3Nfc21lX2RlYXV0aF9yZXEodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90ICopOworc3RhdGljIHZvaWQgX19saW1fcHJvY2Vzc19zbWVfc2V0X2NvbnRleHRfcmVxKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCAqKTsKK3N0YXRpYyBib29sIF9fbGltX3Byb2Nlc3Nfc21lX3N0b3BfYnNzX3JlcSh0cEFuaVNpckdsb2JhbCwgdHBTaXJNc2dRIHBNc2cpOworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3Nfc21lX2NoYW5uZWxfY2hhbmdlX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgIHVpbnQzMl90ICpwTXNnKTsKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX3NtZV9zdGFydF9iZWFjb25fcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnKTsKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX3NtZV9kZnNfY3NhX2llX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2cpOworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3NfbnNzX3VwZGF0ZV9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnKTsKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX3NldF9pZV9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2cpOworCitzdGF0aWMgdm9pZCBsaW1fc3RhcnRfYnNzX3VwZGF0ZV9hZGRfaWVfYnVmZmVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB1aW50OF90ICoqcERzdERhdGFfYnVmZiwKKwkJCQkJICAgICAgIHVpbnQxNl90ICpwRHN0RGF0YUxlbiwKKwkJCQkJICAgICAgIHVpbnQ4X3QgKnBTcmNEYXRhX2J1ZmYsCisJCQkJCSAgICAgICB1aW50MTZfdCBzcmNEYXRhTGVuKTsKKworc3RhdGljIHZvaWQgbGltX3VwZGF0ZV9hZGRfaWVfYnVmZmVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICB1aW50OF90ICoqcERzdERhdGFfYnVmZiwKKwkJCQkgICAgIHVpbnQxNl90ICpwRHN0RGF0YUxlbiwKKwkJCQkgICAgIHVpbnQ4X3QgKnBTcmNEYXRhX2J1ZmYsIHVpbnQxNl90IHNyY0RhdGFMZW4pOworCitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19tb2RpZnlfYWRkX2llcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZyk7CisKK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX3VwZGF0ZV9hZGRfaWVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnKTsKKworZXh0ZXJuIHZvaWQgcGVfcmVnaXN0ZXJfd21hX2hhbmRsZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworLyoqCisgKiBsaW1fcHJvY2Vzc19zZXRfaHdfbW9kZSgpIC0gU2VuZCBzZXQgSFcgbW9kZSBjb21tYW5kIHRvIFdNQQorICogQG1hYzogR2xvYmFjbCBNQUMgcG9pbnRlcgorICogQG1zZzogTWVzc2FnZSBjb250YWluaW5nIHRoZSBodyBtb2RlIGluZGV4CisgKgorICogU2VuZCB0aGUgc2V0IEhXIG1vZGUgY29tbWFuZCB0byBXTUEKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBpZiBtZXNzYWdlIHBvc3RpbmcgaXMgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBsaW1fcHJvY2Vzc19zZXRfaHdfbW9kZSh0cEFuaVNpckdsb2JhbCBtYWMsIHVpbnQzMl90ICptc2cpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCXN0cnVjdCBzaXJfaHdfbW9kZSAqcmVxX21zZzsKKwl1aW50MzJfdCBsZW47CisJc3RydWN0IHNfc2lyX3NldF9od19tb2RlICpidWY7CisJdFNpck1zZ1EgcmVzcF9tc2c7CisJc3RydWN0IHNpcl9zZXRfaHdfbW9kZV9yZXNwICpwYXJhbTsKKworCWJ1ZiA9IChzdHJ1Y3Qgc19zaXJfc2V0X2h3X21vZGUgKikgbXNnOworCWlmICghYnVmKSB7CisJCWxpbV9sb2cobWFjLCBMT0dFLCBGTCgiU2V0IEhXIG1vZGUgcGFyYW0gaXMgTlVMTCIpKTsKKwkJLyogVG8gZnJlZSB0aGUgYWN0aXZlIGNvbW1hbmQgbGlzdCAqLworCQlnb3RvIGZhaWw7CisJfQorCisJbGVuID0gc2l6ZW9mKCpyZXFfbXNnKTsKKworCXJlcV9tc2cgPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCWlmICghcmVxX21zZykgeworCQlsaW1fbG9nKG1hYywgTE9HRSwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJLyogRnJlZSB0aGUgYWN0aXZlIGNvbW1hbmQgbGlzdAorCQkgKiBQcm9iYWJseSB0aGUgbWFsbG9jIGlzIGdvaW5nIHRvIGZhaWwgdGhlcmUgYXMgd2VsbD8hCisJCSAqLworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1femVybyhyZXFfbXNnLCBsZW4pOworCisJcmVxX21zZy0+aHdfbW9kZV9pbmRleCA9IGJ1Zi0+c2V0X2h3Lmh3X21vZGVfaW5kZXg7CisJLyogT3RoZXIgcGFyYW1ldGVycyBhcmUgbm90IG5lZWRlZCBmb3IgV01BICovCisKKwljZHNfbWVzc2FnZS5ib2R5cHRyID0gcmVxX21zZzsKKwljZHNfbWVzc2FnZS50eXBlICAgID0gU0lSX0hBTF9TT0NfU0VUX0hXX01PREU7CisKKwlsaW1fbG9nKG1hYywgTE9HMSwgRkwoIlBvc3RpbmcgU0lSX0hBTF9TT0NfU0VUX0hXX01PRCB0byBXTUEiKSk7CisJc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJbGltX2xvZyhtYWMsIExPR0UsCisJCQlGTCgidm9zX21xX3Bvc3RfbWVzc2FnZSBmYWlsZWQhKGVycj0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gc3RhdHVzOworZmFpbDoKKwlwYXJhbSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcGFyYW0pKTsKKwlpZiAoIXBhcmFtKSB7CisJCWxpbV9sb2cobWFjLCBMT0dFLCBGTCgiSFcgbW9kZSByZXNwIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlwYXJhbS0+c3RhdHVzID0gU0VUX0hXX01PREVfU1RBVFVTX0VDQU5DRUxFRDsKKwlwYXJhbS0+Y2ZnZF9od19tb2RlX2luZGV4ID0gMDsKKwlwYXJhbS0+bnVtX3ZkZXZfbWFjX2VudHJpZXMgPSAwOworCXJlc3BfbXNnLnR5cGUgPSBlV05JX1NNRV9TRVRfSFdfTU9ERV9SRVNQOworCXJlc3BfbXNnLmJvZHlwdHIgPSBwYXJhbTsKKwlyZXNwX21zZy5ib2R5dmFsID0gMDsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkobWFjLCAmcmVzcF9tc2csIGVQUk9UKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX3NldF9kdWFsX21hY19jZmdfcmVxKCkgLSBTZXQgZHVhbCBtYWMgY29uZmlnIGNvbW1hbmQgdG8gV01BCisgKiBAbWFjOiBHbG9iYWwgTUFDIHBvaW50ZXIKKyAqIEBtc2c6IE1lc3NhZ2UgY29udGFpbmluZyB0aGUgZHVhbCBtYWMgY29uZmlnIHBhcmFtZXRlcgorICoKKyAqIFNlbmQgdGhlIHNldCBkdWFsIG1hYyBjb25maWcgY29tbWFuZCB0byBXTUEKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBpZiBtZXNzYWdlIHBvc3RpbmcgaXMgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBsaW1fcHJvY2Vzc19zZXRfZHVhbF9tYWNfY2ZnX3JlcSh0cEFuaVNpckdsb2JhbCBtYWMsCisJCXVpbnQzMl90ICptc2cpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCXN0cnVjdCBzaXJfZHVhbF9tYWNfY29uZmlnICpyZXFfbXNnOworCXVpbnQzMl90IGxlbjsKKwlzdHJ1Y3Qgc2lyX3NldF9kdWFsX21hY19jZmcgKmJ1ZjsKKwl0U2lyTXNnUSByZXNwX21zZzsKKwlzdHJ1Y3Qgc2lyX2R1YWxfbWFjX2NvbmZpZ19yZXNwICpwYXJhbTsKKworCWJ1ZiA9IChzdHJ1Y3Qgc2lyX3NldF9kdWFsX21hY19jZmcgKikgbXNnOworCWlmICghYnVmKSB7CisJCWxpbV9sb2cobWFjLCBMT0dFLCBGTCgiU2V0IER1YWwgbWFjIGNvbmZpZyBpcyBOVUxMIikpOworCQkvKiBUbyBmcmVlIHRoZSBhY3RpdmUgY29tbWFuZCBsaXN0ICovCisJCWdvdG8gZmFpbDsKKwl9CisKKwlsZW4gPSBzaXplb2YoKnJlcV9tc2cpOworCisJcmVxX21zZyA9IGNkZl9tZW1fbWFsbG9jKGxlbik7CisJaWYgKCFyZXFfbXNnKSB7CisJCWxpbV9sb2cobWFjLCBMT0dFLCBGTCgidm9zX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQkvKiBGcmVlIHRoZSBhY3RpdmUgY29tbWFuZCBsaXN0CisJCSAqIFByb2JhYmx5IHRoZSBtYWxsb2MgaXMgZ29pbmcgdG8gZmFpbCB0aGVyZSBhcyB3ZWxsPyEKKwkJICovCisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV96ZXJvKHJlcV9tc2csIGxlbik7CisKKwlyZXFfbXNnLT5zY2FuX2NvbmZpZyA9IGJ1Zi0+c2V0X2R1YWxfbWFjLnNjYW5fY29uZmlnOworCXJlcV9tc2ctPmZ3X21vZGVfY29uZmlnID0gYnVmLT5zZXRfZHVhbF9tYWMuZndfbW9kZV9jb25maWc7CisJLyogT3RoZXIgcGFyYW1ldGVycyBhcmUgbm90IG5lZWRlZCBmb3IgV01BICovCisKKwljZHNfbWVzc2FnZS5ib2R5cHRyID0gcmVxX21zZzsKKwljZHNfbWVzc2FnZS50eXBlICAgID0gU0lSX0hBTF9TT0NfRFVBTF9NQUNfQ0ZHX1JFUTsKKworCWxpbV9sb2cobWFjLCBMT0cxLAorCQlGTCgiUG9zdCBTSVJfSEFMX1NPQ19EVUFMX01BQ19DRkdfUkVRIHRvIFdNQTogJXggJXgiKSwKKwkJcmVxX21zZy0+c2Nhbl9jb25maWcsIHJlcV9tc2ctPmZ3X21vZGVfY29uZmlnKTsKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hYywgTE9HRSwKKwkJCQlGTCgidm9zX21xX3Bvc3RfbWVzc2FnZSBmYWlsZWQhKGVycj0lZCkiKSwKKwkJCQlzdGF0dXMpOworCQljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK2ZhaWw6CisJcGFyYW0gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnBhcmFtKSk7CisJaWYgKCFwYXJhbSkgeworCQlsaW1fbG9nKG1hYywgTE9HRSwgRkwoIkR1YWwgbWFjIGNvbmZpZyByZXNwIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlwYXJhbS0+c3RhdHVzID0gU0VUX0hXX01PREVfU1RBVFVTX0VDQU5DRUxFRDsKKwlyZXNwX21zZy50eXBlID0gZVdOSV9TTUVfU0VUX0RVQUxfTUFDX0NGR19SRVNQOworCXJlc3BfbXNnLmJvZHlwdHIgPSBwYXJhbTsKKwlyZXNwX21zZy5ib2R5dmFsID0gMDsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkobWFjLCAmcmVzcF9tc2csIGVQUk9UKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIF9fbGltX2ZyZXNoX3NjYW5fcmVxZCgpIC0gZGV0ZXJtaW5lIGlmIGEgZnJlc2ggc2NhbiByZXF1ZXN0IG11c3QgYmUgaXNzdWVkLgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm5fZnJlc2hfcmVzdWx0czogVHJpZ2dlciBmcmVzaCBzY2FuLgorICoKKyAqIFBFIHdpbGwgZG8gZnJlc2ggc2NhbiwgaWYgYWxsIG9mIHRoZSBhY3RpdmUgc2Vzc2lvbnMgYXJlIGluCisgKiBnb29kIHN0YXRlIChMaW5rIEVzdCBvciBCU1MgU3RhcnRlZCkuIElmIG9uZSBvZiB0aGUgc2Vzc2lvbnMKKyAqIGlzIG5vdCBpbiBvbmUgb2YgdGhlIGFib3ZlIHN0YXRlcywgdGhlbiBQRSBkb2VzIG5vdCBkbyBmcmVzaAorICogc2Nhbi4gSWYgbm8gc2Vzc2lvbiBleGlzdHMgKHNjYW5uaW5nIHZlcnkgZmlyc3QgdGltZSksCisgKiB0aGVuIFBFIHdpbGwgYWx3YXlzIGRvIGZyZXNoIHNjYW4gaWYgU01FIGFza3MgaXQgdG8gZG8gdGhhdC4KKyAqCisgKiBSZXR1cm46IHRydWUgZm9yIGZyZXNoIHNjYW4gcmVzdWx0cywgZmFsc2UgaWYgaW4gaW52YWxpZCBzdGF0ZS4KKyAqLworc3RhdGljIHVpbnQ4X3QKK19fbGltX2ZyZXNoX3NjYW5fcmVxZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50OF90IHJldHVybl9mcmVzaF9yZXN1bHRzKQoreworCXVpbnQ4X3QgdmFsaWRfc3RhdGUgPSB0cnVlOworCWludCBpOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiZ0xpbVNtZVN0YXRlOiAlZCwgcmV0dXJuRnJlc2hSZXN1bHRzIDB4JXgiKSwKKwkJbWFjX2N0eC0+bGltLmdMaW1TbWVTdGF0ZSwgcmV0dXJuX2ZyZXNoX3Jlc3VsdHMpOworCisJaWYgKG1hY19jdHgtPmxpbS5nTGltU21lU3RhdGUgIT0gZUxJTV9TTUVfSURMRV9TVEFURSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJyZXR1cm4gRkFMU0UiKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFjX2N0eC0+bGltLm1heEJzc0lkOyBpKyspIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoInNlc3Npb24gJWQsIGJzc3R5cGUgJWQsIGxpbVN5c3RlbVJvbGUgJWQsIGxpbVNtZVN0YXRlICVkIiksCisJCQlpLCBtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmJzc1R5cGUsCisJCQltYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUsCisJCQltYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmxpbVNtZVN0YXRlKTsKKwkJaWYgKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgPT0gdHJ1ZSkgeworCQkJaWYgKCEoKCgobWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS5ic3NUeXBlID09CisJCQkJCWVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERSkgfHwKKwkJCQkobWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09CisJCQkJCWVMSU1fQlRfQU1QX1NUQV9ST0xFKSkgJiYKKwkJCQkobWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS5saW1TbWVTdGF0ZSA9PQorCQkJCQllTElNX1NNRV9MSU5LX0VTVF9TVEFURSkpIHx8CisJCQkgICAgICAoKChtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmJzc1R5cGUgPT0KKwkJCQkJZVNJUl9JQlNTX01PREUpIHx8CisJCQkJKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0ubGltU3lzdGVtUm9sZSA9PQorCQkJCQllTElNX0JUX0FNUF9BUF9ST0xFKSB8fAorCQkJCShtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUgPT0KKwkJCQkJZUxJTV9CVF9BTVBfU1RBX1JPTEUpKSAmJgorCQkJICAgICAgIChtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmxpbVNtZVN0YXRlID09CisJCQkJCWVMSU1fU01FX05PUk1BTF9TVEFURSkpIHx8CisJCQkgICAgICAoKCgobWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS5ic3NUeXBlID09CisJCQkJCWVTSVJfSU5GUkFfQVBfTU9ERSkgJiYKKwkJCQkobWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS5wZVBlcnNvbmEgPT0KKwkJCQkJQ0RGX1AyUF9HT19NT0RFKSkgfHwKKwkJCSAgICAgIChtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUgPT0KKwkJCQkJZUxJTV9BUF9ST0xFKSkgJiYKKwkJCSAgICAgIChtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmxpbVNtZVN0YXRlID09CisJCQkJCWVMSU1fU01FX05PUk1BTF9TVEFURSkpKSkgeworCQkJCXZhbGlkX3N0YXRlID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJ2YWxpZF9zdGF0ZTogJWQiKSwgdmFsaWRfc3RhdGUpOworCisJaWYgKCh2YWxpZF9zdGF0ZSkgJiYKKwkgICAgKHJldHVybl9mcmVzaF9yZXN1bHRzICYgU0lSX0JHX1NDQU5fUkVUVVJOX0ZSRVNIX1JFU1VMVFMpKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBfX2xpbV9pc19zbWVfYXNzb2NfY25mX3ZhbGlkKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBfX2xpbV9wcm9jZXNzX3NtZV9hc3NvY19jbmZfbmV3KCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9BU1NPQ19DTkYuCisgKgorICoqKkxPR0lDOgorICogTWVzc2FnZSB2YWxpZGl0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uCisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1lYXNSZXEgIFBvaW50ZXIgdG8gUmVjZWl2ZWQgQVNTT0NfQ05GIG1lc3NhZ2UKKyAqIEByZXR1cm4gdHJ1ZSAgICAgIFdoZW4gcmVjZWl2ZWQgU01FX0FTU09DX0NORiBpcyBmb3JtYXR0ZWQKKyAqICAgICAgICAgICAgICAgICAgIGNvcnJlY3RseQorICogICAgICAgICBmYWxzZSAgICAgb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGlubGluZSB1aW50OF90IF9fbGltX2lzX3NtZV9hc3NvY19jbmZfdmFsaWQodHBTaXJTbWVBc3NvY0NuZiBwQXNzb2NDbmYpCit7CisJaWYgKGxpbV9pc19ncm91cF9hZGRyKHBBc3NvY0NuZi0+cGVlck1hY0FkZHIpKQorCQlyZXR1cm4gZmFsc2U7CisJZWxzZQorCQlyZXR1cm4gdHJ1ZTsKK30gLyoqKiBlbmQgX19saW1faXNfc21lX2Fzc29jX2NuZl92YWxpZCgpICoqKi8KKworLyoqCisgKiBfX2xpbV9nZXRfc21lX2pvaW5fcmVxX3NpemVfZm9yX2FsbG9jKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB2YXJpb3VzIHBsYWNlcyB0byBnZXQgSUUgbGVuZ3RoCisgKiBmcm9tIHRTaXJCc3NEZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKyAqIG51bWJlciBiZWluZyBzY2FubmVkLgorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgICAgcEJzc0Rlc2NyCisgKiBAcmV0dXJuICAgIFRvdGFsIElFIGxlbmd0aAorICovCisKK3N0YXRpYyB1aW50MTZfdCBfX2xpbV9nZXRfc21lX2pvaW5fcmVxX3NpemVfZm9yX2FsbG9jKHVpbnQ4X3QgKnBCdWYpCit7CisJdWludDE2X3QgbGVuID0gMDsKKworCWlmICghcEJ1ZikKKwkJcmV0dXJuIGxlbjsKKworCXBCdWYgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwlsZW4gPSBsaW1fZ2V0X3UxNihwQnVmKTsKKwlyZXR1cm4gbGVuICsgc2l6ZW9mKHVpbnQxNl90KTsKK30KKworLyoqCisgKiBfX2xpbV9pc19kZWZlcmVkX21zZ19mb3JfbGVhcm4oKSAtIG1lc3NhZ2UgaGFuZGxpbmcgaW4gU01FIGxlYXJuIHN0YXRlCisgKiBAcE1hYzogR2xvYmFsIE1BQyBjb250ZXh0CisgKiBAcE1zZzogUG9pbnRlciB0byBtZXNzYWdlIHBvc3RlZCBmcm9tIFNNRSB0byBMSU0uCisgKgorICogSGFzIHJvbGUgb25seSBpZiAxMWggaXMgZW5hYmxlZC4gTm90IHVzZWQgb24gU1RBIHNpZGUuCisgKiBEZWZlcnMgdGhlIG1lc3NhZ2UgaWYgU01FIGlzIGluIGxlYXJuIHN0YXRlIGFuZCBicmluZ3MKKyAqIHRoZSBMSU0gYmFjayB0byBub3JtYWwgbW9kZS4KKyAqCisgKiBSZXR1cm46IHRydWUgLSBJZiBkZWZlcmVkIGZhbHNlIC0gT3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGJvb2wgX19saW1faXNfZGVmZXJlZF9tc2dfZm9yX2xlYXJuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKQoreworCWlmIChsaW1faXNfc3lzdGVtX2luX3NjYW5fc3RhdGUocE1hYykpIHsKKwkJaWYgKGxpbV9kZWZlcl9tc2cocE1hYywgcE1zZykgIT0gVFhfU1VDQ0VTUykgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiQ291bGQgbm90IGRlZmVyIE1zZyA9ICVkIiksCisJCQkJICAgICAgIHBNc2ctPnR5cGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCUZMKCJEZWZlciB0aGUgbWVzc2FnZSwgaW4gbGVhcm4gbW9kZSB0eXBlID0gJWQiKSwKKwkJCXBNc2ctPnR5cGUpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIF9fbGltX2lzX2RlZmVyZWRfbXNnX2Zvcl9yYWRhcigpIC0gRGVmZXJzIHRoZSBtZXNzYWdlIGlmIHJhZGFyIGlzIGRldGVjdGVkCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1lc3NhZ2U6IFBvaW50ZXIgdG8gbWVzc2FnZSBwb3N0ZWQgZnJvbSBTTUUgdG8gTElNLgorICoKKyAqIEhhcyByb2xlIG9ubHkgaWYgMTFoIGlzIGVuYWJsZWQuIE5vdCB1c2VkIG9uIFNUQSBzaWRlLgorICogRGVmZXJzIHRoZSBtZXNzYWdlIGlmIHJhZGFyIGlzIGRldGVjdGVkLgorICoKKyAqIFJldHVybjogdHJ1ZSwgaWYgZGVmZXJlZCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICovCitzdGF0aWMgYm9vbAorX19saW1faXNfZGVmZXJlZF9tc2dfZm9yX3JhZGFyKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwU2lyTXNnUSBtZXNzYWdlKQoreworCS8qCisJICogZlJhZGFyRGV0Q3VyT3BlckNoYW4gd2lsbCBiZSBzZXQgb25seSBpZiB3ZQorCSAqIGRldGVjdCByYWRhciBpbiBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsIGFuZAorCSAqIFN5c3RlbSBSb2xlID09IEFQIFJPTEUKKwkgKgorCSAqIFRPRE86IE5lZWQgdG8gdGFrZSBjYXJlIHJhZGFyIGRldGVjdGlvbi4KKwkgKgorCSAqIGlmIChMSU1fSVNfUkFEQVJfREVURUNURUQobWFjX2N0eCkpCisJICovCisJaWYgKDApIHsKKwkJaWYgKGxpbV9kZWZlcl9tc2cobWFjX2N0eCwgbWVzc2FnZSkgIT0gVFhfU1VDQ0VTUykgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiQ291bGQgbm90IGRlZmVyIE1zZyA9ICVkIiksCisJCQkJbWVzc2FnZS0+dHlwZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIkRlZmVyIHRoZSBtZXNzYWdlLCBpbiBsZWFybiBtb2RlIHR5cGUgPSAlZCIpLAorCQkJbWVzc2FnZS0+dHlwZSk7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogX19saW1fcHJvY2Vzc19zbWVfc3lzX3JlYWR5X2luZCAoKSAtIFByb2Nlc3MgcmVhZHkgaW5kaWNhdGlvbiBmcm9tIFdNQQorICogQHBNYWM6IEdsb2JhbCBNQUMgY29udGV4dAorICogQHBNc2dCdWY6IE1lc3NhZ2UgZnJvbSBXTUEKKyAqCisgKiBoYW5kbGVzIHRoZSBub3RpZmljYXRpb24gZnJvbSBIREQuIFBFIGp1c3QgZm9yd2FyZHMgdGhpcyBtZXNzYWdlIHRvIEhBTC4KKyAqCisgKiBSZXR1cm46IHRydWUtUG9zdGluZyB0byBIQUwgZmFpbGVkLCBzbyBQRSB3aWxsIGNvbnN1bWUgdGhlIGJ1ZmZlci4KKyAqICAgICAgICAgZmFsc2UtUG9zdGluZyB0byBIQUwgc3VjY2Vzc2Z1bCwgc28gSEFMIHdpbGwgY29uc3VtZSB0aGUgYnVmZmVyLgorICovCisKK3N0YXRpYyBib29sIF9fbGltX3Byb2Nlc3Nfc21lX3N5c19yZWFkeV9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYpCit7CisJdFNpck1zZ1EgbXNnOworCXRTaXJTbWVSZWFkeVJlcSAqcmVhZHlfcmVxID0gKHRTaXJTbWVSZWFkeVJlcSAqKSBwTXNnQnVmOworCisJbXNnLnR5cGUgPSBXTUFfU1lTX1JFQURZX0lORDsKKwltc2cucmVzZXJ2ZWQgPSAwOworCW1zZy5ib2R5cHRyID0gcE1zZ0J1ZjsKKwltc2cuYm9keXZhbCA9IDA7CisKKwlpZiAoQU5JX0RSSVZFUl9UWVBFKHBNYWMpICE9IGVEUklWRVJfVFlQRV9NRkcpIHsKKwkJcGVfcmVnaXN0ZXJfd21hX2hhbmRsZShwTWFjKTsKKwkJcE1hYy0+bGltLmFkZF9ic3NkZXNjcl9jYWxsYmFjayA9IHJlYWR5X3JlcS0+YWRkX2Jzc2Rlc2NyX2NiOworCX0KKwlQRUxPR1cobGltX2xvZyhwTWFjLCBMT0dXLCBGTCgic2VuZGluZyBXTUFfU1lTX1JFQURZX0lORCBtc2cgdG8gSEFMIikpOykKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBOT19TRVNTSU9OLCBtc2cudHlwZSkpOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJ3bWFfcG9zdF9jdHJsX21zZyBmYWlsZWQiKSk7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCit1aW50MzJfdCBsaW1fZ2V0X2NlbnRlcl9jaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgcHJpbWFyeWNoYW5OdW0sCisJCQkJZVBoeUNoYW5Cb25kU3RhdGUgc2Vjb25kYXJ5Q2hhbk9mZnNldCwKKwkJCQl1aW50OF90IGNoYW5XaWR0aCkKK3sKKwlpZiAoY2hhbldpZHRoID09IFdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfODBNSFopIHsKKwkJc3dpdGNoIChzZWNvbmRhcnlDaGFuT2Zmc2V0KSB7CisJCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0NFTlRFUkVEXzQwTUhaX0NFTlRFUkVEOgorCQkJcmV0dXJuIHByaW1hcnljaGFuTnVtOworCQljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfQ0VOVEVSRUQ6CisJCQlyZXR1cm4gcHJpbWFyeWNoYW5OdW0gKyAyOworCQljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0NFTlRFUkVEOgorCQkJcmV0dXJuIHByaW1hcnljaGFuTnVtIC0gMjsKKwkJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0xPVzoKKwkJCXJldHVybiBwcmltYXJ5Y2hhbk51bSArIDY7CisJCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfTE9XOgorCQkJcmV0dXJuIHByaW1hcnljaGFuTnVtICsgMjsKKwkJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0hJR0g6CisJCQlyZXR1cm4gcHJpbWFyeWNoYW5OdW0gLSAyOworCQljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0hJR0g6CisJCQlyZXR1cm4gcHJpbWFyeWNoYW5OdW0gLSA2OworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfSUQ7CisJCX0KKwl9IGVsc2UgaWYgKGNoYW5XaWR0aCA9PSBXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzIwXzQwTUhaKSB7CisJCXN3aXRjaCAoc2Vjb25kYXJ5Q2hhbk9mZnNldCkgeworCQljYXNlIFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWToKKwkJCXJldHVybiBwcmltYXJ5Y2hhbk51bSArIDI7CisJCWNhc2UgUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWToKKwkJCXJldHVybiBwcmltYXJ5Y2hhbk51bSAtIDI7CisJCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0NFTlRFUkVEXzQwTUhaX0NFTlRFUkVEOgorCQkJcmV0dXJuIHByaW1hcnljaGFuTnVtOworCQljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfQ0VOVEVSRUQ6CisJCQlyZXR1cm4gcHJpbWFyeWNoYW5OdW0gKyAyOworCQljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0NFTlRFUkVEOgorCQkJcmV0dXJuIHByaW1hcnljaGFuTnVtIC0gMjsKKwkJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0xPVzoKKwkJCXJldHVybiBwcmltYXJ5Y2hhbk51bSArIDI7CisJCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfTE9XOgorCQkJcmV0dXJuIHByaW1hcnljaGFuTnVtIC0gMjsKKwkJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0hJR0g6CisJCQlyZXR1cm4gcHJpbWFyeWNoYW5OdW0gKyAyOworCQljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0hJR0g6CisJCQlyZXR1cm4gcHJpbWFyeWNoYW5OdW0gLSAyOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfSUQ7CisJCX0KKwl9CisJcmV0dXJuIHByaW1hcnljaGFuTnVtOworfQorCisjZW5kaWYKKworLyoqCisgKmxpbV9jb25maWd1cmVfYXBfc3RhcnRfYnNzX3Nlc3Npb24oKSAtIENvbmZpZ3VyZSB0aGUgQVAgU3RhcnQgQlNTIGluIHNlc3Npb24uCisgKkBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKkBzZXNzaW9uOiBBIHBvaW50ZXIgdG8gc2Vzc2lvbiBlbnRyeQorICpAc21lX3N0YXJ0X2Jzc19yZXE6IFN0YXJ0IEJTUyBSZXF1ZXN0IGZyb20gdXBwZXIgbGF5ZXJzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIHN0YXJ0IGJzcyBwYXJhbWV0ZXJzCisgKiBpbiB0byB0aGUgc2Vzc2lvbi4KKyAqCisgKiBSZXR1cm46IE5vbmUuCisgKi8KK3N0YXRpYyB2b2lkCitsaW1fY29uZmlndXJlX2FwX3N0YXJ0X2Jzc19zZXNzaW9uKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwUEVTZXNzaW9uIHNlc3Npb24sCisJCQl0cFNpclNtZVN0YXJ0QnNzUmVxIHNtZV9zdGFydF9ic3NfcmVxKQoreworCXNlc3Npb24tPmxpbVN5c3RlbVJvbGUgPSBlTElNX0FQX1JPTEU7CisJc2Vzc2lvbi0+cHJpdmFjeSA9IHNtZV9zdGFydF9ic3NfcmVxLT5wcml2YWN5OworCXNlc3Npb24tPmZ3ZFdQU1BCQ1Byb2JlUmVxID0gc21lX3N0YXJ0X2Jzc19yZXEtPmZ3ZFdQU1BCQ1Byb2JlUmVxOworCXNlc3Npb24tPmF1dGhUeXBlID0gc21lX3N0YXJ0X2Jzc19yZXEtPmF1dGhUeXBlOworCS8qIFN0b3JlIHRoZSBEVElNIHBlcmlvZCAqLworCXNlc3Npb24tPmR0aW1QZXJpb2QgPSAodWludDhfdCkgc21lX3N0YXJ0X2Jzc19yZXEtPmR0aW1QZXJpb2Q7CisJLyogRW5hYmxlL2Rpc2FibGUgVUFQU0QgKi8KKwlzZXNzaW9uLT5hcFVhcHNkRW5hYmxlID0gc21lX3N0YXJ0X2Jzc19yZXEtPmFwVWFwc2RFbmFibGU7CisJaWYgKHNlc3Npb24tPnBlUGVyc29uYSA9PSBDREZfUDJQX0dPX01PREUpIHsKKwkJc2Vzc2lvbi0+cHJveHlQcm9iZVJzcEVuID0gMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUbyBkZXRlY3QgUEJDIG92ZXJsYXAgaW4gU0FQIFdQUyBtb2RlLAorCQkgKiBIb3N0IGhhbmRsZXMgUHJvYmUgUmVxdWVzdHMuCisJCSAqLworCQlpZiAoU0FQX1dQU19ESVNBQkxFRCA9PSBzbWVfc3RhcnRfYnNzX3JlcS0+d3BzX3N0YXRlKQorCQkJc2Vzc2lvbi0+cHJveHlQcm9iZVJzcEVuID0gMTsKKwkJZWxzZQorCQkJc2Vzc2lvbi0+cHJveHlQcm9iZVJzcEVuID0gMDsKKwl9CisJc2Vzc2lvbi0+c3NpZEhpZGRlbiA9IHNtZV9zdGFydF9ic3NfcmVxLT5zc2lkSGlkZGVuOworCXNlc3Npb24tPndwc19zdGF0ZSA9IHNtZV9zdGFydF9ic3NfcmVxLT53cHNfc3RhdGU7CisJc2Vzc2lvbi0+c2FwX2RvdDExbWMgPSBzbWVfc3RhcnRfYnNzX3JlcS0+c2FwX2RvdDExbWM7CisJbGltX2dldF9zaG9ydF9zbG90X2Zyb21fcGh5X21vZGUobWFjX2N0eCwgc2Vzc2lvbiwgc2Vzc2lvbi0+Z0xpbVBoeU1vZGUsCisJCSZzZXNzaW9uLT5zaG9ydFNsb3RUaW1lU3VwcG9ydGVkKTsKKwlzZXNzaW9uLT5pc0NvYWxlc2luZ0luSUJTU0FsbG93ZWQgPQorCQlzbWVfc3RhcnRfYnNzX3JlcS0+aXNDb2FsZXNpbmdJbklCU1NBbGxvd2VkOworCit9CisKKy8qKgorICogX19saW1faGFuZGxlX3NtZV9zdGFydF9ic3NfcmVxdWVzdCgpIC0gcHJvY2VzcyBTTUVfU1RBUlRfQlNTX1JFUSBtZXNzYWdlCisgKkBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKkBtc2dfYnVmOiBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgU01FX1NUQVJUX0JTU19SRVEgbWVzc2FnZQorICogZnJvbSBIREQgb3IgdXBwZXIgbGF5ZXIgYXBwbGljYXRpb24uCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitfX2xpbV9oYW5kbGVfc21lX3N0YXJ0X2Jzc19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQzMl90ICptc2dfYnVmKQoreworCXVpbnQxNl90IHNpemU7CisJdWludDMyX3QgdmFsID0gMDsKKwl0U2lyUmV0U3RhdHVzIHJldF9zdGF0dXM7CisJdFNpck1hY0NoYW5OdW0gY2hhbm5lbF9udW1iZXI7CisJdExpbU1sbVN0YXJ0UmVxICptbG1fc3RhcnRfcmVxID0gTlVMTDsKKwl0cFNpclNtZVN0YXJ0QnNzUmVxIHNtZV9zdGFydF9ic3NfcmVxID0gTlVMTDsKKwl0U2lyUmVzdWx0Q29kZXMgcmV0X2NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCS8qIEZsYWcgVXNlZCBpbiBjYXNlIG9mIElCU1MgdG8gQXV0byBnZW5lcmF0ZSBCU1NJRC4gKi8KKwl1aW50MzJfdCBhdXRvX2dlbl9ic3NpZCA9IGZhbHNlOworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uID0gTlVMTDsKKwl1aW50OF90IHNtZV9zZXNzaW9uX2lkID0gMDsKKwl1aW50MTZfdCBzbWVfdHJhbnNhY3Rpb25faWQgPSAwOworCXVpbnQzMl90IGNoYW53aWR0aDsKKwl0U2lyUmV0U3RhdHVzIGNmZ19nZXRfd21pX2Rmc19tYXN0ZXJfcGFyYW0gPSBlU0lSX1NVQ0NFU1M7CisKKy8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTQorCS8qCisJICogU2luY2UgdGhlIHNlc3Npb24gaXMgbm90IGNyZWF0ZWQgeWV0LCBzZW5kaW5nIE5VTEwuCisJICogVGhlIHJlc3BvbnNlIHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHN0YXRlLgorCSAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChtYWNfY3R4LCBXTEFOX1BFX0RJQUdfU1RBUlRfQlNTX1JFUV9FVkVOVCwKKwkJCSAgICAgIE5VTEwsIDAsIDApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlJlY2VpdmVkIFNUQVJUX0JTU19SRVEiKSk7CisKKwkvKgorCSAqIEdsb2JhbCBTbWUgc3RhdGUgYW5kIG1sbSBzdGF0ZXMgYXJlIG5vdCBkZWZpbmVkIHlldCwKKwkgKiBmb3IgQlQtQU1QIFN1cHBvcHJ0IC4gVE8gQkUgRE9ORQorCSAqLworCWlmICgobWFjX2N0eC0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9PRkZMSU5FX1NUQVRFKSB8fAorCSAgICAobWFjX2N0eC0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9JRExFX1NUQVRFKSkgeworCQlzaXplID0gc2l6ZW9mKHRTaXJTbWVTdGFydEJzc1JlcSk7CisKKwkJc21lX3N0YXJ0X2Jzc19yZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplKTsKKwkJaWYgKE5VTEwgPT0gc21lX3N0YXJ0X2Jzc19yZXEpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiQWxsb2NhdGUgTWVtb3J5IGZhaWwgZm9yIExpbVN0YXJ0QnNzUmVxIikpOworCQkJLyogU2VuZCBmYWlsdXJlIHJlc3BvbnNlIHRvIGhvc3QgKi8KKwkJCXJldF9jb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQkJZ290byBlbmQ7CisJCX0KKworCQljZGZfbWVtX3NldCgodm9pZCAqKXNtZV9zdGFydF9ic3NfcmVxLCBzaXplLCAwKTsKKwkJY2RmX21lbV9jb3B5KHNtZV9zdGFydF9ic3NfcmVxLCBtc2dfYnVmLAorCQkJc2l6ZW9mKHRTaXJTbWVTdGFydEJzc1JlcSkpOworCQlpZiAoIWxpbV9pc19zbWVfc3RhcnRfYnNzX3JlcV92YWxpZChtYWNfY3R4LAorCQkJCQlzbWVfc3RhcnRfYnNzX3JlcSkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiUmVjZWl2ZWQgaW52YWxpZCBlV05JX1NNRV9TVEFSVF9CU1NfUkVRIikpOworCQkJcmV0X2NvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCQlnb3RvIGZyZWU7CisJCX0KKworCQkvKgorCQkgKiBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSBQRSBpcyBnb2luZyB0byBjcmVhdGUgYSBzZXNzaW9uLgorCQkgKiBJZiBzZXNzaW9uIGlzIG5vdCBleGlzdGVkLCB0aGVuIGNyZWF0ZSBhIG5ldyBzZXNzaW9uCisJCSAqLworCQlzZXNzaW9uID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKG1hY19jdHgsCisJCQkJc21lX3N0YXJ0X2Jzc19yZXEtPmJzc0lkLCAmc2Vzc2lvbl9pZCk7CisJCWlmIChzZXNzaW9uICE9IE5VTEwpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiU2Vzc2lvbiBBbHJlYWR5IGV4aXN0cyBmb3IgZ2l2ZW4gQlNTSUQiKSk7CisJCQlyZXRfY29kZSA9IGVTSVJfU01FX0JTU19BTFJFQURZX1NUQVJURURfT1JfSk9JTkVEOworCQkJc2Vzc2lvbiA9IE5VTEw7CisJCQlnb3RvIGZyZWU7CisJCX0gZWxzZSB7CisJCQlzZXNzaW9uID0gcGVfY3JlYXRlX3Nlc3Npb24obWFjX2N0eCwKKwkJCQkJc21lX3N0YXJ0X2Jzc19yZXEtPmJzc0lkLAorCQkJCQkmc2Vzc2lvbl9pZCwgbWFjX2N0eC0+bGltLm1heFN0YXRpb24sCisJCQkJCXNtZV9zdGFydF9ic3NfcmVxLT5ic3NUeXBlKTsKKwkJCWlmIChzZXNzaW9uID09IE5VTEwpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkJCUZMKCJTZXNzaW9uIENhbiBub3QgYmUgY3JlYXRlZCAiKSk7CisJCQkJcmV0X2NvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJCQkJZ290byBmcmVlOworCQkJfQorCQl9CisKKwkJLyogUHJvYmUgcmVzcCBhZGQgaWUgKi8KKwkJbGltX3N0YXJ0X2Jzc191cGRhdGVfYWRkX2llX2J1ZmZlcihtYWNfY3R4LAorCQkJJnNlc3Npb24tPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFfYnVmZiwKKwkJCSZzZXNzaW9uLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BEYXRhTGVuLAorCQkJc21lX3N0YXJ0X2Jzc19yZXEtPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFfYnVmZiwKKwkJCXNtZV9zdGFydF9ic3NfcmVxLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BEYXRhTGVuKTsKKworCQkvKiBQcm9iZSBCZWFjb24gYWRkIGllICovCisJCWxpbV9zdGFydF9ic3NfdXBkYXRlX2FkZF9pZV9idWZmZXIobWFjX2N0eCwKKwkJCSZzZXNzaW9uLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BCQ05EYXRhX2J1ZmYsCisJCQkmc2Vzc2lvbi0+YWRkSWVQYXJhbXMucHJvYmVSZXNwQkNORGF0YUxlbiwKKwkJCXNtZV9zdGFydF9ic3NfcmVxLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BCQ05EYXRhX2J1ZmYsCisJCQlzbWVfc3RhcnRfYnNzX3JlcS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwQkNORGF0YUxlbik7CisKKwkJLyogQXNzb2MgcmVzcCBJRSAqLworCQlsaW1fc3RhcnRfYnNzX3VwZGF0ZV9hZGRfaWVfYnVmZmVyKG1hY19jdHgsCisJCQkmc2Vzc2lvbi0+YWRkSWVQYXJhbXMuYXNzb2NSZXNwRGF0YV9idWZmLAorCQkJJnNlc3Npb24tPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFMZW4sCisJCQlzbWVfc3RhcnRfYnNzX3JlcS0+YWRkSWVQYXJhbXMuYXNzb2NSZXNwRGF0YV9idWZmLAorCQkJc21lX3N0YXJ0X2Jzc19yZXEtPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFMZW4pOworCisJCS8qIFN0b3JlIHRoZSBzZXNzaW9uIHJlbGF0ZWQgcGFyYW1zIGluIG5ld2x5IGNyZWF0ZWQgc2Vzc2lvbiAqLworCQlzZXNzaW9uLT5wTGltU3RhcnRCc3NSZXEgPSBzbWVfc3RhcnRfYnNzX3JlcTsKKworCQkvKiBTdG9yZSBQRSBzZXNzaW9uX2lkIGluIHNlc3Npb24gVGFibGUgICovCisJCXNlc3Npb24tPnBlU2Vzc2lvbklkID0gc2Vzc2lvbl9pZDsKKworCQkvKiBTdG9yZSBTTUUgc2Vzc2lvbiBJZCBpbiBzZXNzaW9uVGFibGUgKi8KKwkJc2Vzc2lvbi0+c21lU2Vzc2lvbklkID0gc21lX3N0YXJ0X2Jzc19yZXEtPnNlc3Npb25JZDsKKworCQlzZXNzaW9uLT50cmFuc2FjdGlvbklkID0gc21lX3N0YXJ0X2Jzc19yZXEtPnRyYW5zYWN0aW9uSWQ7CisKKwkJY2RmX21lbV9jb3B5KCYoc2Vzc2lvbi0+aHRDb25maWcpLAorCQkJICAgICAmKHNtZV9zdGFydF9ic3NfcmVxLT5odENvbmZpZyksCisJCQkgICAgIHNpemVvZihzZXNzaW9uLT5odENvbmZpZykpOworCisJCXNpcl9jb3B5X21hY19hZGRyKHNlc3Npb24tPnNlbGZNYWNBZGRyLAorCQkJCSAgc21lX3N0YXJ0X2Jzc19yZXEtPnNlbGZNYWNBZGRyKTsKKworCQkvKiBDb3B5IFNTSUQgdG8gc2Vzc2lvbiB0YWJsZSAqLworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnNlc3Npb24tPnNzSWQsCisJCQkgICAgICh1aW50OF90ICopICZzbWVfc3RhcnRfYnNzX3JlcS0+c3NJZCwKKwkJCSAgICAgKHNtZV9zdGFydF9ic3NfcmVxLT5zc0lkLmxlbmd0aCArIDEpKTsKKworCQlzZXNzaW9uLT5ic3NUeXBlID0gc21lX3N0YXJ0X2Jzc19yZXEtPmJzc1R5cGU7CisKKwkJc2Vzc2lvbi0+bndUeXBlID0gc21lX3N0YXJ0X2Jzc19yZXEtPm53VHlwZTsKKworCQlzZXNzaW9uLT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWwgPQorCQkJc21lX3N0YXJ0X2Jzc19yZXEtPmJlYWNvbkludGVydmFsOworCisJCS8qIFN0b3JlIHRoZSBjaGFubmVsIG51bWJlciBpbiBzZXNzaW9uIFRhYmxlICovCisJCXNlc3Npb24tPmN1cnJlbnRPcGVyQ2hhbm5lbCA9CisJCQlzbWVfc3RhcnRfYnNzX3JlcS0+Y2hhbm5lbElkOworCisJCS8qIFN0b3JlIFBlcnNvbmEgKi8KKwkJc2Vzc2lvbi0+cGVQZXJzb25hID0gc21lX3N0YXJ0X2Jzc19yZXEtPmJzc1BlcnNvbmE7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoIlBFIFBFUlNPTkE9JWQiKSwgc2Vzc2lvbi0+cGVQZXJzb25hKTsKKworCQkvKiBVcGRhdGUgdGhlIHBoeW1vZGUgKi8KKwkJc2Vzc2lvbi0+Z0xpbVBoeU1vZGUgPSBzbWVfc3RhcnRfYnNzX3JlcS0+bndUeXBlOworCisJCXNlc3Npb24tPm1heFR4UG93ZXIgPQorCQkJY2ZnX2dldF9yZWd1bGF0b3J5X21heF90cmFuc21pdF9wb3dlcihtYWNfY3R4LAorCQkJCXNlc3Npb24tPmN1cnJlbnRPcGVyQ2hhbm5lbCk7CisJCS8qIFN0b3JlIHRoZSBkb3QgMTEgbW9kZSBpbiB0byB0aGUgc2Vzc2lvbiBUYWJsZSAqLworCQlzZXNzaW9uLT5kb3QxMW1vZGUgPSBzbWVfc3RhcnRfYnNzX3JlcS0+ZG90MTFtb2RlOworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCQlzZXNzaW9uLT5jY19zd2l0Y2hfbW9kZSA9CisJCQlzbWVfc3RhcnRfYnNzX3JlcS0+Y2Nfc3dpdGNoX21vZGU7CisjZW5kaWYKKwkJc2Vzc2lvbi0+aHRDYXBhYmlsaXR5ID0KKwkJCUlTX0RPVDExX01PREVfSFQoc2Vzc2lvbi0+ZG90MTFtb2RlKTsKKwkJc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eSA9CisJCQlJU19ET1QxMV9NT0RFX1ZIVChzZXNzaW9uLT5kb3QxMW1vZGUpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgIEZMKCIqKioqKnNlc3Npb24tPnZodENhcGFiaWxpdHkgPSAlZCIpLAorCQkJICBzZXNzaW9uLT52aHRDYXBhYmlsaXR5KTsKKwkJc2Vzc2lvbi0+dHhMZHBjSW5pRmVhdHVyZUVuYWJsZWQgPQorCQkJc21lX3N0YXJ0X2Jzc19yZXEtPnR4TGRwY0luaUZlYXR1cmVFbmFibGVkOworCisJCWlmIChtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmVuYWJsZTJ4MikKKwkJCXNlc3Npb24tPm5zcyA9IDI7CisJCWVsc2UKKwkJCXNlc3Npb24tPm5zcyA9IDE7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQlzZXNzaW9uLT5saW1SbWZFbmFibGVkID0KKwkJCXNtZV9zdGFydF9ic3NfcmVxLT5wbWZDYXBhYmxlID8gMSA6IDA7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlNlc3Npb24gUk1GIGVuYWJsZWQ6ICVkIiksCisJCQlzZXNzaW9uLT5saW1SbWZFbmFibGVkKTsKKyNlbmRpZgorCisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZzZXNzaW9uLT5yYXRlU2V0LAorCQkJICAgICAodm9pZCAqKSZzbWVfc3RhcnRfYnNzX3JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0LAorCQkJICAgICBzaXplb2YodFNpck1hY1JhdGVTZXQpKTsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJnNlc3Npb24tPmV4dFJhdGVTZXQsCisJCQkgICAgICh2b2lkICopJnNtZV9zdGFydF9ic3NfcmVxLT5leHRlbmRlZFJhdGVTZXQsCisJCQkgICAgIHNpemVvZih0U2lyTWFjUmF0ZVNldCkpOworCisJCXN3aXRjaCAoc21lX3N0YXJ0X2Jzc19yZXEtPmJzc1R5cGUpIHsKKwkJY2FzZSBlU0lSX0lORlJBX0FQX01PREU6CisJCQlsaW1fY29uZmlndXJlX2FwX3N0YXJ0X2Jzc19zZXNzaW9uKG1hY19jdHgsIHNlc3Npb24sCisJCQkJc21lX3N0YXJ0X2Jzc19yZXEpOworCQkJYnJlYWs7CisJCWNhc2UgZVNJUl9JQlNTX01PREU6CisJCQlzZXNzaW9uLT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9TVEFfSU5fSUJTU19ST0xFOworCQkJbGltX2dldF9zaG9ydF9zbG90X2Zyb21fcGh5X21vZGUobWFjX2N0eCwgc2Vzc2lvbiwKKwkJCQlzZXNzaW9uLT5nTGltUGh5TW9kZSwKKwkJCQkmc2Vzc2lvbi0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCk7CisKKwkJCS8qCisJCQkgKiBpbml0aWFsaXplIHRvICJPUEVOIi4KKwkJCSAqIHdpbGwgYmUgdXBkYXRlZCB1cG9uIGtleSBpbnN0YWxsYXRpb24KKwkJCSAqLworCQkJc2Vzc2lvbi0+ZW5jcnlwdFR5cGUgPSBlU0lSX0VEX05PTkU7CisKKwkJCWJyZWFrOworCisJCWNhc2UgZVNJUl9CVEFNUF9BUF9NT0RFOgorCQkJc2Vzc2lvbi0+bGltU3lzdGVtUm9sZSA9IGVMSU1fQlRfQU1QX0FQX1JPTEU7CisJCQlicmVhazsKKworCQljYXNlIGVTSVJfQlRBTVBfU1RBX01PREU6CisJCQlzZXNzaW9uLT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9CVF9BTVBfU1RBX1JPTEU7CisJCQlicmVhazsKKworCQkvKgorCQkgKiBUaGVyZSBpcyBvbmUgbW9yZSBtb2RlIGNhbGxlZCBhdXRvIG1vZGUuCisJCSAqIHdoaWNoIGlzIHVzZWQgbm8gd2hlcmUKKwkJICovCisKKwkJLyogRk9SQlVJTEQgLVRFTVBGSVguLiBIT1cgVE8gdXNlIEFVVE8gTU9ERT8/Pz8/ICovCisKKwkJZGVmYXVsdDoKKwkJCS8qIG5vdCB1c2VkIGFueXdoZXJlLi4udXNlZCBpbiBzY2FuIGZ1bmN0aW9uICovCisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEJULUFNUDogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYXJyYXkgb2YKKwkJICogcGFyc2VkIChSZSlBc3NvYyByZXF1ZXN0IHN0cnVjdHVyZQorCQkgKi8KKwkJaWYgKChzbWVfc3RhcnRfYnNzX3JlcS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX0FQX01PREUpIHx8CisJCSAgICAoc21lX3N0YXJ0X2Jzc19yZXEtPmJzc1R5cGUgPT0gZVNJUl9JTkZSQV9BUF9NT0RFKSkgeworCQkJc2Vzc2lvbi0+cGFyc2VkQXNzb2NSZXEgPQorCQkJCWNkZl9tZW1fbWFsbG9jKHNlc3Npb24tPmRwaC5kcGhIYXNoVGFibGUuCisJCQkJCSAgICAgICBzaXplICogc2l6ZW9mKHRwU2lyQXNzb2NSZXEpKTsKKwkJCWlmIChOVUxMID09IHNlc3Npb24tPnBhcnNlZEFzc29jUmVxKSB7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCQlGTCgiQWxsb2NhdGVNZW1vcnkoKSBmYWlsZWQiKSk7CisJCQkJcmV0X2NvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJCQkJZ290byBmcmVlOworCQkJfQorCQkJY2RmX21lbV9zZXQoc2Vzc2lvbi0+cGFyc2VkQXNzb2NSZXEsCisJCQkJKHNlc3Npb24tPmRwaC5kcGhIYXNoVGFibGUuc2l6ZSAqCisJCQkJc2l6ZW9mKHRwU2lyQXNzb2NSZXEpKSwgMCk7CisJCX0KKworCQlpZiAoIXNtZV9zdGFydF9ic3NfcmVxLT5jaGFubmVsSWQpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiUmVjZWl2ZWQgaW52YWxpZCBlV05JX1NNRV9TVEFSVF9CU1NfUkVRIikpOworCQkJcmV0X2NvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCQlnb3RvIGZyZWU7CisJCX0KKwkJY2hhbm5lbF9udW1iZXIgPSBzbWVfc3RhcnRfYnNzX3JlcS0+Y2hhbm5lbElkOworI2lmZGVmIFFDQV9IVF8yMDQwX0NPRVgKKwkJaWYgKHNtZV9zdGFydF9ic3NfcmVxLT5vYnNzRW5hYmxlZCkKKwkJCXNlc3Npb24tPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQlzZXNzaW9uLT5odENhcGFiaWxpdHk7CisJCWVsc2UKKyNlbmRpZgorCQlzZXNzaW9uLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkoc21lX3N0YXJ0X2Jzc19yZXEtPnNlY19jaF9vZmZzZXQpID8gMSA6IDA7CisJCXNlc3Npb24tPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9CisJCQlzbWVfc3RhcnRfYnNzX3JlcS0+c2VjX2NoX29mZnNldDsKKwkJc2Vzc2lvbi0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPQorCQkJKHNlc3Npb24tPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCkgPyAxIDogMDsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICBGTCgiY2JNb2RlICV1IiksIHNtZV9zdGFydF9ic3NfcmVxLT5jYk1vZGUpOworCQlpZiAoc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eSB8fCBzZXNzaW9uLT5odENhcGFiaWxpdHkpIHsKKwkJCWNoYW53aWR0aCA9IHNtZV9zdGFydF9ic3NfcmVxLT52aHRfY2hhbm5lbF93aWR0aDsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoInZodF9jaGFubmVsX3dpZHRoICV1IiksCisJCQkJCXNtZV9zdGFydF9ic3NfcmVxLT52aHRfY2hhbm5lbF93aWR0aCk7CisJCQlpZiAoY2hhbm5lbF9udW1iZXIgPD0gUkZfQ0hBTl8xNCAmJgorCQkJCQljaGFud2lkdGggIT0gZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFopIHsKKwkJCQljaGFud2lkdGggPSBDSF9XSURUSF8yME1IWjsKKwkJCQlzZXNzaW9uLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9IDA7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJCQlGTCgiU2V0IGNoYW53aWR0aCB0byAyME1oeiwgY2hhbiAlZCIpLAorCQkJCQljaGFubmVsX251bWJlcik7CisJCQl9CisJCQlzZXNzaW9uLT5jaF93aWR0aCA9IGNoYW53aWR0aDsKKwkJCWlmIChzZXNzaW9uLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgeworCQkJCXNlc3Npb24tPmNoX2NlbnRlcl9mcmVxX3NlZzAgPQorCQkJCQlzbWVfc3RhcnRfYnNzX3JlcS0+Y2VudGVyX2ZyZXFfc2VnMDsKKwkJCQlzZXNzaW9uLT5jaF9jZW50ZXJfZnJlcV9zZWcxID0KKwkJCQkJc21lX3N0YXJ0X2Jzc19yZXEtPmNlbnRlcl9mcmVxX3NlZzE7CisJCQl9IGVsc2UgeworCQkJCXNlc3Npb24tPmNoX2NlbnRlcl9mcmVxX3NlZzAgPSAwOworCQkJCXNlc3Npb24tPmNoX2NlbnRlcl9mcmVxX3NlZzEgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHNlc3Npb24tPnZodENhcGFiaWxpdHkgJiYKKwkJCQkoQ0hfV0lEVEhfMTYwTUhaID4gc2Vzc2lvbi0+Y2hfd2lkdGgpKSB7CisJCQlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LAorCQkJCQlXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVSX0NBUCwgJnZhbCkgIT0KKwkJCQllU0lSX1NVQ0NFU1MpCisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgKKwkJCQkJImNmZyBnZXQgdmh0IHN1IGJmb3JtZXIgZmFpbGVkIikpOworCisJCQlzZXNzaW9uLT5lbmFibGVfc3VfdHhfYmZvcm1lciA9IHZhbDsKKwkJfSBlbHNlIHsKKwkJCXNlc3Npb24tPm5zcyA9IDE7CisJCX0KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgidmh0IHN1IHR4IGJmb3JtZXIgJWQiKSwgdmFsKTsKKworCQkvKiBEZWxldGUgcHJlLWF1dGggbGlzdCBpZiBhbnkgKi8KKwkJbGltX2RlbGV0ZV9wcmVfYXV0aF9saXN0KG1hY19jdHgpOworCisJCS8qCisJCSAqIGtlZXAgdGhlIFJTTi9XUEEgSUUgaW5mb3JtYXRpb24gaW4gUEUgU2Vzc2lvbiBFbnRyeQorCQkgKiBsYXRlciB3aWxsIGJlIHVzaW5nIHRoaXMgdG8gY2hlY2sgd2hlbiByZWNlaXZlZCAoUmUpQXNzb2MgcmVxCisJCSAqLworCQlsaW1fc2V0X3JzX25pZV93cF9haWVmcm9tX3NtZV9zdGFydF9ic3NfcmVxX21lc3NhZ2UobWFjX2N0eCwKKwkJCQkmc21lX3N0YXJ0X2Jzc19yZXEtPnJzbklFLCBzZXNzaW9uKTsKKworCQlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbikgfHwgTElNX0lTX0lCU1NfUk9MRShzZXNzaW9uKSkgeworCQkJc2Vzc2lvbi0+Z0xpbVByb3RlY3Rpb25Db250cm9sID0KKwkJCQlzbWVfc3RhcnRfYnNzX3JlcS0+cHJvdEVuYWJsZWQ7CisJCQkvKgorCQkJICogZWFjaCBieXRlIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGluZm8KKwkJCSAqIGJpdDcgICAgICAgYml0NiAgICBiaXQ1ICAgYml0NCBiaXQzICAgYml0MiAgYml0MSBiaXQwCisJCQkgKiByZXNlcnZlZCByZXNlcnZlZCAgIFJJRlMgICBMc2lnIG4tR0YgICBodDIwICAxMWcgIDExYgorCQkJICovCisJCQljZGZfbWVtX2NvcHkoKHZvaWQgKikmc2Vzc2lvbi0+Y2ZnUHJvdGVjdGlvbiwKKwkJCQkgICAgICh2b2lkICopJnNtZV9zdGFydF9ic3NfcmVxLT5odF9jYXBhYiwKKwkJCQkgICAgIHNpemVvZih1aW50MTZfdCkpOworCQkJLyogSW5pdGlhbGl6ZSBXUFMgUEJDIHNlc3Npb24gbGluayBsaXN0ICovCisJCQlzZXNzaW9uLT5wQVBXUFNQQkNTZXNzaW9uID0gTlVMTDsKKwkJfQorCQkvKiBQcmVwYXJlIGFuZCBJc3N1ZSBMSU1fTUxNX1NUQVJUX1JFUSB0byBNTE0gKi8KKwkJbWxtX3N0YXJ0X3JlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0TGltTWxtU3RhcnRSZXEpKTsKKwkJaWYgKE5VTEwgPT0gbWxtX3N0YXJ0X3JlcSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJBbGxvY2F0ZSBNZW1vcnkgZmFpbGVkIGZvciBtbG1TdGFydFJlcSIpKTsKKwkJCXJldF9jb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQkJZ290byBmcmVlOworCQl9CisKKwkJY2RmX21lbV9zZXQoKHZvaWQgKiltbG1fc3RhcnRfcmVxLCBzaXplb2YodExpbU1sbVN0YXJ0UmVxKSwgMCk7CisKKwkJLyogQ29weSBTU0lEIHRvIHRoZSBNTE0gc3RhcnQgc3RydWN0dXJlICovCisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWxtX3N0YXJ0X3JlcS0+c3NJZCwKKwkJCSAgICAgKHVpbnQ4X3QgKikgJnNtZV9zdGFydF9ic3NfcmVxLT5zc0lkLAorCQkJICAgICBzbWVfc3RhcnRfYnNzX3JlcS0+c3NJZC5sZW5ndGggKyAxKTsKKwkJbWxtX3N0YXJ0X3JlcS0+c3NpZEhpZGRlbiA9IHNtZV9zdGFydF9ic3NfcmVxLT5zc2lkSGlkZGVuOworCQltbG1fc3RhcnRfcmVxLT5vYnNzUHJvdEVuYWJsZWQgPQorCQkJc21lX3N0YXJ0X2Jzc19yZXEtPm9ic3NQcm90RW5hYmxlZDsKKworCQltbG1fc3RhcnRfcmVxLT5ic3NUeXBlID0gc2Vzc2lvbi0+YnNzVHlwZTsKKworCQkvKiBGaWxsIFBFIHNlc3Npb24gSWQgZnJvbSB0aGUgc2Vzc2lvbiBUYWJsZSAqLworCQltbG1fc3RhcnRfcmVxLT5zZXNzaW9uSWQgPSBzZXNzaW9uLT5wZVNlc3Npb25JZDsKKworCQlpZiAoKG1sbV9zdGFydF9yZXEtPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9TVEFfTU9ERSkgfHwKKwkJICAgIChtbG1fc3RhcnRfcmVxLT5ic3NUeXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSkgfHwKKwkJICAgIChtbG1fc3RhcnRfcmVxLT5ic3NUeXBlID09IGVTSVJfSU5GUkFfQVBfTU9ERSkpIHsKKwkJCS8qCisJCQkgKiBDb3B5IHRoZSBCU1NJZCBmcm9tIHNlc3Npb25UYWJsZSB0bworCQkJICogbWxtU3RhcnRSZXEgc3RydWN0CisJCQkgKi8KKwkJCXNpcl9jb3B5X21hY19hZGRyKG1sbV9zdGFydF9yZXEtPmJzc0lkLCBzZXNzaW9uLT5ic3NJZCk7CisJCX0gZWxzZSB7CisJCQkvKiBpYnNzIG1vZGUgKi8KKwkJCW1hY19jdHgtPmxpbS5nTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZCA9IGZhbHNlOworCisJCQlyZXRfc3RhdHVzID0gd2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LAorCQkJCQlXTklfQ0ZHX0lCU1NfQVVUT19CU1NJRCwKKwkJCQkJJmF1dG9fZ2VuX2Jzc2lkKTsKKwkJCWlmIChyZXRfc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQkJRkwoIkdldCBBdXRvIEdlbiBCU1NJRCBmYWlsLFN0YXR1cz0lZCIpLAorCQkJCQlyZXRfc3RhdHVzKTsKKwkJCQlyZXRfY29kZSA9IGVTSVJfTE9HUF9FWENFUFRJT047CisJCQkJZ290byBmcmVlOworCQkJfQorCisJCQlpZiAoIWF1dG9fZ2VuX2Jzc2lkKSB7CisJCQkJLyoKKwkJCQkgKiBXZSdyZSBub3QgYXV0byBnZW5lcmF0aW5nIEJTU0lELgorCQkJCSAqIEluc3RlYWQsIGdldCBpdCBmcm9tIHNlc3Npb24gZW50cnkKKwkJCQkgKi8KKwkJCQlzaXJfY29weV9tYWNfYWRkcihtbG1fc3RhcnRfcmVxLT5ic3NJZCwKKwkJCQkJCSAgc2Vzc2lvbi0+YnNzSWQpOworCQkJCS8qCisJCQkJICogU3RhcnQgSUJTUyBncm91cCBCU1NJRAorCQkJCSAqIEF1dG8gR2VuZXJhdGluZyBCU1NJRC4KKwkJCQkgKi8KKwkJCQlhdXRvX2dlbl9ic3NpZCA9ICgobWxtX3N0YXJ0X3JlcS0+YnNzSWRbMF0gJgorCQkJCQkJCTB4MDEpID8gdHJ1ZSA6IGZhbHNlKTsKKwkJCX0KKworCQkJaWYgKGF1dG9fZ2VuX2Jzc2lkKSB7CisJCQkJLyoKKwkJCQkgKiBpZiBCU1NJRCBpcyBub3QgYW55IHVjIGlkLgorCQkJCSAqIHRoZW4gdXNlIGxvY2FsbHkgZ2VuZXJhdGVkIEJTU0lELgorCQkJCSAqIEF1dG9nZW5lcmF0ZSB0aGUgQlNTSUQKKwkJCQkgKi8KKwkJCQlsaW1fZ2V0X3JhbmRvbV9ic3NpZChtYWNfY3R4LAorCQkJCQkJbWxtX3N0YXJ0X3JlcS0+YnNzSWQpOworCQkJCW1sbV9zdGFydF9yZXEtPmJzc0lkWzBdID0gMHgwMjsKKworCQkJCS8qCisJCQkJICogQ29weSByYW5kb21seSBnZW5lcmF0ZWQgQlNTSUQKKwkJCQkgKiB0byB0aGUgc2Vzc2lvbiBUYWJsZQorCQkJCSAqLworCQkJCXNpcl9jb3B5X21hY19hZGRyKHNlc3Npb24tPmJzc0lkLAorCQkJCQkJICBtbG1fc3RhcnRfcmVxLT5ic3NJZCk7CisJCQl9CisJCX0KKwkJLyogc3RvcmUgdGhlIGNoYW5uZWwgbnVtIGluIG1sbXN0YXJ0IHJlcSBzdHJ1Y3R1cmUgKi8KKwkJbWxtX3N0YXJ0X3JlcS0+Y2hhbm5lbE51bWJlciA9IHNlc3Npb24tPmN1cnJlbnRPcGVyQ2hhbm5lbDsKKwkJbWxtX3N0YXJ0X3JlcS0+Y2JNb2RlID0gc21lX3N0YXJ0X2Jzc19yZXEtPmNiTW9kZTsKKwkJbWxtX3N0YXJ0X3JlcS0+YmVhY29uUGVyaW9kID0KKwkJCXNlc3Npb24tPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbDsKKworCQlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbikpIHsKKwkJCW1sbV9zdGFydF9yZXEtPmR0aW1QZXJpb2QgPSBzZXNzaW9uLT5kdGltUGVyaW9kOworCQkJbWxtX3N0YXJ0X3JlcS0+d3BzX3N0YXRlID0gc2Vzc2lvbi0+d3BzX3N0YXRlOworCisJCX0gZWxzZSB7CisJCQlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LAorCQkJCVdOSV9DRkdfRFRJTV9QRVJJT0QsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgRFRJTSBQZXJpb2QiKSk7CisJCQltbG1fc3RhcnRfcmVxLT5kdGltUGVyaW9kID0gKHVpbnQ4X3QpIHZhbDsKKwkJfQorCisJCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfQ0ZQX1BFUklPRCwgJnZhbCkgIT0KKwkJCWVTSVJfU1VDQ0VTUykKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIEJlYWNvbiBpbnRlcnZhbCIpKTsKKwkJbWxtX3N0YXJ0X3JlcS0+Y2ZQYXJhbVNldC5jZnBQZXJpb2QgPSAodWludDhfdCkgdmFsOworCisJCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfQ0ZQX01BWF9EVVJBVElPTiwgJnZhbCkgIT0KKwkJCWVTSVJfU1VDQ0VTUykKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIENGUE1heER1cmF0aW9uIikpOworCQltbG1fc3RhcnRfcmVxLT5jZlBhcmFtU2V0LmNmcE1heER1cmF0aW9uID0gKHVpbnQxNl90KSB2YWw7CisKKwkJLyoKKwkJICogdGhpcyBtYXkgbm90IGJlIG5lZWRlZCBhbnltb3JlIG5vdywKKwkJICogYXMgcmF0ZVNldCBpcyBub3cgaW5jbHVkZWQgaW4gdGhlCisJCSAqIHNlc3Npb24gZW50cnkgYW5kIE1MTSBoYXMgc2Vzc2lvbiBjb250ZXh0LgorCQkgKi8KKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJm1sbV9zdGFydF9yZXEtPnJhdGVTZXQsCisJCQkgICAgICh2b2lkICopJnNlc3Npb24tPnJhdGVTZXQsCisJCQkgICAgIHNpemVvZih0U2lyTWFjUmF0ZVNldCkpOworCisJCS8qIE5vdyBwb3B1bGF0ZSB0aGUgMTFuIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworCQltbG1fc3RhcnRfcmVxLT5ud1R5cGUgPSBzZXNzaW9uLT5ud1R5cGU7CisJCW1sbV9zdGFydF9yZXEtPmh0Q2FwYWJsZSA9IHNlc3Npb24tPmh0Q2FwYWJpbGl0eTsKKworCQltbG1fc3RhcnRfcmVxLT5odE9wZXJNb2RlID0gbWFjX2N0eC0+bGltLmdIVE9wZXJNb2RlOworCQkvKiBVbnVzZWQgKi8KKwkJbWxtX3N0YXJ0X3JlcS0+ZHVhbENUU1Byb3RlY3Rpb24gPQorCQkJbWFjX2N0eC0+bGltLmdIVER1YWxDVFNQcm90ZWN0aW9uOworCQltbG1fc3RhcnRfcmVxLT50eENoYW5uZWxXaWR0aFNldCA9CisJCQlzZXNzaW9uLT5odFJlY29tbWVuZGVkVHhXaWR0aFNldDsKKworCQlzZXNzaW9uLT5saW1SRkJhbmQgPSBsaW1fZ2V0X3JmX2JhbmQoY2hhbm5lbF9udW1iZXIpOworCisJCS8qIEluaXRpYWxpemUgMTFoIEVuYWJsZSBGbGFnICovCisJCXNlc3Npb24tPmxpbTExaEVuYWJsZSA9IDA7CisJCWlmICgobWxtX3N0YXJ0X3JlcS0+YnNzVHlwZSAhPSBlU0lSX0lCU1NfTU9ERSkgJiYKKwkJICAgIChTSVJfQkFORF81X0dIWiA9PSBzZXNzaW9uLT5saW1SRkJhbmQpKSB7CisJCQlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LAorCQkJCVdOSV9DRkdfMTFIX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJCUZMKCJGYWlsIHRvIGdldCBXTklfQ0ZHXzExSF9FTkFCTEVEICIpKTsKKwkJCWVsc2UKKwkJCQlzZXNzaW9uLT5saW0xMWhFbmFibGUgPSB2YWw7CisKKwkJCWlmIChzZXNzaW9uLT5saW0xMWhFbmFibGUgJiYKKwkJCQkoZVNJUl9JTkZSQV9BUF9NT0RFID09CisJCQkJCW1sbV9zdGFydF9yZXEtPmJzc1R5cGUpKSB7CisJCQkJY2ZnX2dldF93bWlfZGZzX21hc3Rlcl9wYXJhbSA9CisJCQkJCXdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwKKwkJCQkJCVdOSV9DRkdfREZTX01BU1RFUl9FTkFCTEVELAorCQkJCQkJJnZhbCk7CisJCQkJc2Vzc2lvbi0+bGltMTFoRW5hYmxlID0gdmFsOworCQkJfQorCQkJaWYgKGNmZ19nZXRfd21pX2Rmc19tYXN0ZXJfcGFyYW0gIT0gZVNJUl9TVUNDRVNTKQorCQkJCS8qIEZhaWxlZCBnZXQgQ0ZHIFdOSV9DRkdfREZTX01BU1RFUl9FTkFCTEVEICovCisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiR2V0IEZhaWwsIENGRyBERlMgRU5BQkxFIikpOworCQl9CisKKwkJaWYgKCFzZXNzaW9uLT5saW0xMWhFbmFibGUpIHsKKwkJCWlmIChjZmdfc2V0X2ludChtYWNfY3R4LAorCQkJCVdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCwgMCkgIT0KKwkJCQllU0lSX1NVQ0NFU1MpCisJCQkJLyoKKwkJCQkgKiBGYWlsZWQgdG8gc2V0IHRoZSBDRkcgcGFyYW0KKwkJCQkgKiBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlQKKwkJCQkgKi8KKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJICAgIEZMKCJTZXQgTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCBmYWlsZWQiKSk7CisJCX0KKworCQlzZXNzaW9uLT5saW1QcmV2U21lU3RhdGUgPSBzZXNzaW9uLT5saW1TbWVTdGF0ZTsKKwkJc2Vzc2lvbi0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9TVEFSVF9CU1NfU1RBVEU7CisJCU1UUkFDRShtYWNfdHJhY2UKKwkJCShtYWNfY3R4LCBUUkFDRV9DT0RFX1NNRV9TVEFURSwKKwkJCXNlc3Npb24tPnBlU2Vzc2lvbklkLAorCQkJc2Vzc2lvbi0+bGltU21lU3RhdGUpKTsKKworCQlsaW1fcG9zdF9tbG1fbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX1NUQVJUX1JFUSwKKwkJCSh1aW50MzJfdCAqKSBtbG1fc3RhcnRfcmVxKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgU1RBUlRfQlNTX1JFUSwgaW4gc3RhdGUgJVgiKSwKKwkJCW1hY19jdHgtPmxpbS5nTGltU21lU3RhdGUpOworCQlyZXRfY29kZSA9IGVTSVJfU01FX0JTU19BTFJFQURZX1NUQVJURURfT1JfSk9JTkVEOworCQlnb3RvIGVuZDsKKwl9IC8qIGlmIChtYWNfY3R4LT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX09GRkxJTkVfU1RBVEUpICovCisKK2ZyZWU6CisJaWYgKChzZXNzaW9uICE9IE5VTEwpICYmCisJCShzZXNzaW9uLT5wTGltU3RhcnRCc3NSZXEgPT0gc21lX3N0YXJ0X2Jzc19yZXEpKSB7CisJCXNlc3Npb24tPnBMaW1TdGFydEJzc1JlcSA9IE5VTEw7CisJfQorCWNkZl9tZW1fZnJlZShzbWVfc3RhcnRfYnNzX3JlcSk7CisJY2RmX21lbV9mcmVlKG1sbV9zdGFydF9yZXEpOworCitlbmQ6CisJaWYgKHNtZV9zdGFydF9ic3NfcmVxICE9IE5VTEwpIHsKKwkJc21lX3Nlc3Npb25faWQgPSBzbWVfc3RhcnRfYnNzX3JlcS0+c2Vzc2lvbklkOworCQlzbWVfdHJhbnNhY3Rpb25faWQgPSBzbWVfc3RhcnRfYnNzX3JlcS0+dHJhbnNhY3Rpb25JZDsKKwl9CisJaWYgKE5VTEwgIT0gc2Vzc2lvbikgeworCQlwZV9kZWxldGVfc2Vzc2lvbihtYWNfY3R4LCBzZXNzaW9uKTsKKwkJc2Vzc2lvbiA9IE5VTEw7CisJfQorCWxpbV9zZW5kX3NtZV9zdGFydF9ic3NfcnNwKG1hY19jdHgsIGVXTklfU01FX1NUQVJUX0JTU19SU1AsIHJldF9jb2RlLAorCQlzZXNzaW9uLCBzbWVfc2Vzc2lvbl9pZCwgc21lX3RyYW5zYWN0aW9uX2lkKTsKK30KKworLyoqCisgKiBfX2xpbV9wcm9jZXNzX3NtZV9zdGFydF9ic3NfcmVxKCkgLSBDYWxsIGhhbmRsZXIgdG8gc3RhcnQgQlNTCisgKgorICogQHBNYWM6IEdsb2JhbCBNQUMgY29udGV4dAorICogQHBNc2c6IE1lc3NhZ2UgcG9pbnRlcgorICoKKyAqIFdyYXBwZXIgZm9yIHRoZSBmdW5jdGlvbiBfX2xpbV9oYW5kbGVfc21lX3N0YXJ0X2Jzc19yZXF1ZXN0CisgKiBUaGlzIG1lc3NhZ2Ugd2lsbCBiZSBkZWZlcmVkIHVudGlsIHNvZnRtYWMgY29tZSBvdXQgb2YKKyAqIHNjYW4gbW9kZSBvciBpZiB3ZSBoYXZlIGRldGVjdGVkIHJhZGFyIG9uIHRoZSBjdXJyZW50CisgKiBvcGVyYXRpbmcgY2hhbm5lbC4KKyAqCisgKiByZXR1cm4gdHJ1ZSAtIElmIHdlIGNvbnN1bWVkIHRoZSBidWZmZXIKKyAqICAgICAgICBmYWxzZSAtIElmIGhhdmUgZGVmZXJlZCB0aGUgbWVzc2FnZS4KKyAqLworc3RhdGljIGJvb2wgX19saW1fcHJvY2Vzc19zbWVfc3RhcnRfYnNzX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZykKK3sKKwlpZiAoX19saW1faXNfZGVmZXJlZF9tc2dfZm9yX2xlYXJuKHBNYWMsIHBNc2cpIHx8CisJICAgIF9fbGltX2lzX2RlZmVyZWRfbXNnX2Zvcl9yYWRhcihwTWFjLCBwTXNnKSkgeworCQkvKioKKwkJICogSWYgbWVzc2FnZSBkZWZlcmVkLCBidWZmZXIgaXMgbm90IGNvbnN1bWVkIHlldC4KKwkJICogU28gcmV0dXJuIGZhbHNlCisJCSAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJX19saW1faGFuZGxlX3NtZV9zdGFydF9ic3NfcmVxdWVzdChwTWFjLCAodWludDMyX3QgKikgcE1zZy0+Ym9keXB0cik7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogIGxpbV9nZXRfcmFuZG9tX2Jzc2lkKCkKKyAqCisgKiAgRlVOQ1RJT046VGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBnZW5lcmF0ZSB0aGUgcmFuZG9tIG51bWJlciBmb3IgYnNzaWQKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIFNNRV9TQ0FOX1JFUSBtZXNzYWdlCisgKiAgZnJvbSBIREQgb3IgdXBwZXIgbGF5ZXIgYXBwbGljYXRpb24uCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqIDEuIGdlbmVhcnRlcyB0aGUgdW5pcXVlIHJhbmRvbSBudW1iZXIgZm9yIGJzc2lkIGluIGlic3MKKyAqCisgKiAgQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogIEBwYXJhbSAgKmRhdGEgICAgICBQb2ludGVyIHRvICBic3NpZCAgYnVmZmVyCisgKiAgQHJldHVybiBOb25lCisgKi8KK3ZvaWQgbGltX2dldF9yYW5kb21fYnNzaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqZGF0YSkKK3sKKwl1aW50MzJfdCByYW5kb21bMl07CisJcmFuZG9tWzBdID0gdHhfdGltZV9nZXQoKTsKKwlyYW5kb21bMF0gfD0gKHJhbmRvbVswXSA8PCAxNSk7CisJcmFuZG9tWzFdID0gcmFuZG9tWzBdID4+IDE7CisJY2RmX21lbV9jb3B5KGRhdGEsICh1aW50OF90ICopIHJhbmRvbSwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTIGxpbV9zZW5kX2hhbF9zdGFydF9zY2FuX29mZmxvYWRfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgICB0cFNpclNtZVNjYW5SZXEgcFNjYW5SZXEpCit7CisJdFNpclNjYW5PZmZsb2FkUmVxICpwU2Nhbk9mZmxvYWRSZXE7CisJdWludDhfdCAqcDsKKwl1aW50OF90ICpodF9jYXBfaWU7CisJdFNpck1zZ1EgbXNnOworCXVpbnQxNl90IGksIGxlbjsKKwl1aW50MTZfdCBodF9jYXBfbGVuID0gMCwgYWRkbl9pZV9sZW4gPSAwOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJdWludDhfdCAqdmh0X2NhcF9pZTsKKwl1aW50MTZfdCB2aHRfY2FwX2xlbiA9IDA7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExQUMgKi8KKwl0U2lyUmV0U3RhdHVzIHN0YXR1cywgcmMgPSBlU0lSX1NVQ0NFU1M7CisJdERvdDExZklFRXh0Q2FwIGV4dHJhY3RlZF9leHRjYXAgPSB7MH07CisJYm9vbCBleHRjYXBfcHJlc2VudCA9IHRydWU7CisKKwlpZiAocFNjYW5SZXEtPnVJRUZpZWxkTGVuKSB7CisJCXN0YXR1cyA9IGxpbV9zdHJpcF9leHRjYXBfdXBkYXRlX3N0cnVjdChwTWFjLAorCQkJICAgICAodWludDhfdCAqKSBwU2NhblJlcSArIHBTY2FuUmVxLT51SUVGaWVsZE9mZnNldCwKKwkJCSAgICAgJnBTY2FuUmVxLT51SUVGaWVsZExlbiwgJmV4dHJhY3RlZF9leHRjYXApOworCisJCWlmIChlU0lSX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQlleHRjYXBfcHJlc2VudCA9IGZhbHNlOworCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJICAgRkwoIlVuYWJsZSB0byBTdHJpcCBFeHRDYXAgSUUgZnJvbSBTY2FuIFJlcSIpKTsKKwkJfQorCisJCWlmIChleHRjYXBfcHJlc2VudCkgeworCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJICAgRkwoIkV4dGNhcCB3YXMgcGFydCBvZiBTQ0FOIElFIC0gVXBkYXRpbmcgRlciKSk7CisJCQlsaW1fc2VuZF9leHRfY2FwX2llKHBNYWMsIHBTY2FuUmVxLT5zZXNzaW9uSWQsCisJCQkJCSAgICAmZXh0cmFjdGVkX2V4dGNhcCwgdHJ1ZSk7CisJCX0KKwl9IGVsc2UgeworCSAgICBsaW1fbG9nKHBNYWMsIExPRzEsCisJCSAgICBGTCgiTm8gSUVzIGluIHRoZSBzY2FuIHJlcXVlc3QgZnJvbSBzdXBwbGljYW50IikpOworCX0KKworCS8qKgorCSAqIFRoZSB0U2lyU2Nhbk9mZmxvYWRSZXEgd2lsbCByZXNlcnZlIHRoZSBzcGFjZSBmb3IgZmlyc3QgY2hhbm5lbCwKKwkgKiBzbyBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciAobnVtQ2hhbm5lbHMgLSAxKSBhbmQgdUlFRmllbGRMZW4KKwkgKi8KKwlsZW4gPSBzaXplb2YodFNpclNjYW5PZmZsb2FkUmVxKSArCisJCShwU2NhblJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgLSAxKSArIHBTY2FuUmVxLT51SUVGaWVsZExlbjsKKworCWlmIChJU19ET1QxMV9NT0RFX0hUKHBTY2FuUmVxLT5kb3QxMW1vZGUpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCUZMKCJBZGRpbmcgSFQgQ2FwcyBJRSBzaW5jZSBkb3QxMW1vZGU9JWQiKSwKKwkJCXBTY2FuUmVxLT5kb3QxMW1vZGUpOworCQkvKiAyIGJ5dGVzIGZvciBFSUQgYW5kIExlbmd0aCAqLworCQlodF9jYXBfbGVuID0gMiArIHNpemVvZih0SHRDYXBzKTsKKwkJbGVuICs9IGh0X2NhcF9sZW47CisJCWFkZG5faWVfbGVuICs9IGh0X2NhcF9sZW47CisJfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlpZiAoSVNfRE9UMTFfTU9ERV9WSFQocFNjYW5SZXEtPmRvdDExbW9kZSkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIkFkZGluZyBWSFQgQ2FwcyBJRSBzaW5jZSBkb3QxMW1vZGU9JWQiKSwKKwkJCXBTY2FuUmVxLT5kb3QxMW1vZGUpOworCQkvKiAyIGJ5dGVzIGZvciBFSUQgYW5kIExlbmd0aCAqLworCQl2aHRfY2FwX2xlbiA9IDIgKyBzaXplb2YodFNpck1hY1ZIVENhcGFiaWxpdHlJbmZvKSArCisJCQkJICBzaXplb2YodFNpclZodE1jc0luZm8pOworCQlsZW4gKz0gdmh0X2NhcF9sZW47CisJCWFkZG5faWVfbGVuICs9IHZodF9jYXBfbGVuOworCX0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFBQyAqLworCisJcFNjYW5PZmZsb2FkUmVxID0gY2RmX21lbV9tYWxsb2MobGVuKTsKKwlpZiAoTlVMTCA9PSBwU2Nhbk9mZmxvYWRSZXEpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcFNjYW5PZmZsb2FkUmVxIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBTY2FuT2ZmbG9hZFJlcSwgbGVuLCAwKTsKKworCW1zZy50eXBlID0gV01BX1NUQVJUX1NDQU5fT0ZGTE9BRF9SRVE7CisJbXNnLmJvZHlwdHIgPSBwU2Nhbk9mZmxvYWRSZXE7CisJbXNnLmJvZHl2YWwgPSAwOworCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBTY2FuT2ZmbG9hZFJlcS0+YnNzSWQsCisJCSAgICAgKHVpbnQ4X3QgKikgcFNjYW5SZXEtPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWlmIChwU2NhblJlcS0+bnVtU3NpZCA+IFNJUl9TQ0FOX01BWF9OVU1fU1NJRCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiSW52YWxpZCB2YWx1ZSAoJWQpIGZvciBudW1Tc2lkIiksCisJCQlTSVJfU0NBTl9NQVhfTlVNX1NTSUQpOworCQljZGZfbWVtX2ZyZWUocFNjYW5PZmZsb2FkUmVxKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBTY2FuT2ZmbG9hZFJlcS0+bnVtU3NpZCA9IHBTY2FuUmVxLT5udW1Tc2lkOworCWZvciAoaSA9IDA7IGkgPCBwU2Nhbk9mZmxvYWRSZXEtPm51bVNzaWQ7IGkrKykgeworCQlwU2Nhbk9mZmxvYWRSZXEtPnNzSWRbaV0ubGVuZ3RoID0gcFNjYW5SZXEtPnNzSWRbaV0ubGVuZ3RoOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcFNjYW5PZmZsb2FkUmVxLT5zc0lkW2ldLnNzSWQsCisJCQkgICAgICh1aW50OF90ICopIHBTY2FuUmVxLT5zc0lkW2ldLnNzSWQsCisJCQkgICAgIHBTY2FuT2ZmbG9hZFJlcS0+c3NJZFtpXS5sZW5ndGgpOworCX0KKworCXBTY2FuT2ZmbG9hZFJlcS0+aGlkZGVuU3NpZCA9IHBTY2FuUmVxLT5oaWRkZW5Tc2lkOworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwU2Nhbk9mZmxvYWRSZXEtPnNlbGZNYWNBZGRyLAorCQkgICAgICh1aW50OF90ICopIHBTY2FuUmVxLT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJcFNjYW5PZmZsb2FkUmVxLT5ic3NUeXBlID0gcFNjYW5SZXEtPmJzc1R5cGU7CisJcFNjYW5PZmZsb2FkUmVxLT5kb3QxMW1vZGUgPSBwU2NhblJlcS0+ZG90MTFtb2RlOworCXBTY2FuT2ZmbG9hZFJlcS0+c2NhblR5cGUgPSBwU2NhblJlcS0+c2NhblR5cGU7CisJcFNjYW5PZmZsb2FkUmVxLT5taW5DaGFubmVsVGltZSA9IHBTY2FuUmVxLT5taW5DaGFubmVsVGltZTsKKwlwU2Nhbk9mZmxvYWRSZXEtPm1heENoYW5uZWxUaW1lID0gcFNjYW5SZXEtPm1heENoYW5uZWxUaW1lOworCXBTY2FuT2ZmbG9hZFJlcS0+cmVzdFRpbWUgPSBwU2NhblJlcS0+cmVzdFRpbWU7CisKKwkvKiBmb3Igbm9ybWFsIHNjYW4sIHRoZSB2YWx1ZSBmb3IgcDJwU2NhblR5cGUgc2hvdWxkIGJlIDAKKwkgICBhbHdheXMgKi8KKwlpZiAocFNjYW5SZXEtPnAycFNlYXJjaCkKKwkJcFNjYW5PZmZsb2FkUmVxLT5wMnBTY2FuVHlwZSA9IFAyUF9TQ0FOX1RZUEVfU0VBUkNIOworCisJcFNjYW5PZmZsb2FkUmVxLT5zZXNzaW9uSWQgPSBwU2NhblJlcS0+c2Vzc2lvbklkOworCXBTY2FuT2ZmbG9hZFJlcS0+c2Nhbl9pZCA9IHBTY2FuUmVxLT5zY2FuX2lkOworCisJaWYgKHBTY2FuT2ZmbG9hZFJlcS0+c2Vzc2lvbklkID49IHBNYWMtPmxpbS5tYXhCc3NJZCkKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBwZSBzZXNzaW9uSUQgOiAlZCIpLAorCQkJcFNjYW5PZmZsb2FkUmVxLT5zZXNzaW9uSWQpOworCisJcFNjYW5PZmZsb2FkUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9CisJCXBTY2FuUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVsczsKKwlwID0gJihwU2Nhbk9mZmxvYWRSZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXJbMF0pOworCWZvciAoaSA9IDA7IGkgPCBwU2Nhbk9mZmxvYWRSZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzOyBpKyspCisJCXBbaV0gPSBwU2NhblJlcS0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlcltpXTsKKworCXBTY2FuT2ZmbG9hZFJlcS0+dUlFRmllbGRMZW4gPSBwU2NhblJlcS0+dUlFRmllbGRMZW47CisJcFNjYW5PZmZsb2FkUmVxLT51SUVGaWVsZE9mZnNldCA9IGxlbiAtIGFkZG5faWVfbGVuIC0KKwkJCQkJCXBTY2FuT2ZmbG9hZFJlcS0+dUlFRmllbGRMZW47CisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBTY2FuT2ZmbG9hZFJlcSArCisJCSAgICAgcFNjYW5PZmZsb2FkUmVxLT51SUVGaWVsZE9mZnNldCwKKwkJICAgICAodWludDhfdCAqKSBwU2NhblJlcSArIHBTY2FuUmVxLT51SUVGaWVsZE9mZnNldCwKKwkJICAgICBwU2NhblJlcS0+dUlFRmllbGRMZW4pOworCisJLyogQ29weSBIVCBDYXBhYmlsaXR5IGluZm8gaWYgZG90MTFtb2RlIGlzIEhUICovCisJaWYgKElTX0RPVDExX01PREVfSFQocFNjYW5SZXEtPmRvdDExbW9kZSkpIHsKKwkJLyogUG9wdWxhdGUgRUlEIGFuZCBMZW5ndGggZmllbGQgaGVyZSAqLworCQlodF9jYXBfaWUgPSAodWludDhfdCAqKSBwU2Nhbk9mZmxvYWRSZXEgKworCQkJCQlwU2Nhbk9mZmxvYWRSZXEtPnVJRUZpZWxkT2Zmc2V0ICsKKwkJCQkJcFNjYW5PZmZsb2FkUmVxLT51SUVGaWVsZExlbjsKKwkJY2RmX21lbV9zZXQoaHRfY2FwX2llLCBodF9jYXBfbGVuLCAwKTsKKwkJKmh0X2NhcF9pZSA9IFNJUl9NQUNfSFRfQ0FQQUJJTElUSUVTX0VJRDsKKwkJKihodF9jYXBfaWUgKyAxKSA9ICBodF9jYXBfbGVuIC0gMjsKKwkJbGltX3NldF9odF9jYXBzKHBNYWMsIE5VTEwsIGh0X2NhcF9pZSwgaHRfY2FwX2xlbik7CisJCXBTY2FuT2ZmbG9hZFJlcS0+dUlFRmllbGRMZW4gKz0gaHRfY2FwX2xlbjsKKwl9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCS8qIENvcHkgVkhUIENhcGFiaWxpdHkgaW5mbyBpZiBkb3QxMW1vZGUgaXMgVkhUIENhcGFibGUgKi8KKwlpZiAoSVNfRE9UMTFfTU9ERV9WSFQocFNjYW5SZXEtPmRvdDExbW9kZSkpIHsKKwkJLyogUG9wdWxhdGUgRUlEIGFuZCBMZW5ndGggZmllbGQgaGVyZSAqLworCQl2aHRfY2FwX2llID0gKHVpbnQ4X3QgKikgcFNjYW5PZmZsb2FkUmVxICsKKwkJCQkJIHBTY2FuT2ZmbG9hZFJlcS0+dUlFRmllbGRPZmZzZXQgKworCQkJCQkgcFNjYW5PZmZsb2FkUmVxLT51SUVGaWVsZExlbjsKKwkJY2RmX21lbV9zZXQodmh0X2NhcF9pZSwgdmh0X2NhcF9sZW4sIDApOworCQkqdmh0X2NhcF9pZSA9IFNJUl9NQUNfVkhUX0NBUEFCSUxJVElFU19FSUQ7CisJCSoodmh0X2NhcF9pZSArIDEpID0gIHZodF9jYXBfbGVuIC0gMjsKKwkJbGltX3NldF92aHRfY2FwcyhwTWFjLCBOVUxMLCB2aHRfY2FwX2llLCB2aHRfY2FwX2xlbik7CisJCXBTY2FuT2ZmbG9hZFJlcS0+dUlFRmllbGRMZW4gKz0gdmh0X2NhcF9sZW47CisJfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMUFDICovCisKKwlyYyA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2cpOworCWlmIChyYyAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgid21hX3Bvc3RfY3RybF9tc2coKSByZXR1cm4gZmFpbHVyZSIpKTsKKwkJY2RmX21lbV9mcmVlKHBTY2FuT2ZmbG9hZFJlcSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJQcm9jZXNzZWQgT2ZmbG9hZCBTY2FuIFJlcXVlc3QgU3VjY2Vzc2Z1bGx5IikpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBfX2xpbV9wcm9jZXNzX3NtZV9zY2FuX3JlcSgpIC0gUHJvY2VzcyB0aGUgU01FIFNjYW4gUmVxdWVzdAorICogQG1hY19jdHg6IEdsb2JhbCBNQUMgQ29udGV4dAorICogQG1zZ19idWY6IEJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcmVxdWVzdCBhbmQgcGVydGluZW50IHBhcmFtZXRlcnMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIFNNRV9TQ0FOX1JFUSBtZXNzYWdlCisgKiBmcm9tIEhERCBvciB1cHBlciBsYXllciBhcHBsaWNhdGlvbi4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9zY2FuX3JlcSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50MzJfdCAqbXNnX2J1ZikKK3sKKwl0cFNpclNtZVNjYW5SZXEgc2Nhbl9yZXE7CisJdWludDhfdCB2YWxpZF9yZXEgPSAwOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChtYWNfY3R4LCBXTEFOX1BFX0RJQUdfU0NBTl9SRVFfRVZFTlQsIE5VTEwsCisJCQkgICAgICBlU0lSX1NVQ0NFU1MsIGVTSVJfU1VDQ0VTUyk7CisjZW5kaWYKKworCXNjYW5fcmVxID0gKHRwU2lyU21lU2NhblJlcSkgbXNnX2J1ZjsKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJTTUUgU0NBTiBSRVEgaWQgJWQgbnVtQ2hhbiAlZCBtaW4gJWQgbWF4ICVkIElFTGVuICVkIGZpcnN0ICVkIGZyZXNoICVkIHVuaXF1ZSAlZCB0eXBlICVkIHJzcCAlZCIpLAorCQlzY2FuX3JlcS0+c2Nhbl9pZCwgc2Nhbl9yZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzLAorCQlzY2FuX3JlcS0+bWluQ2hhbm5lbFRpbWUsIHNjYW5fcmVxLT5tYXhDaGFubmVsVGltZSwKKwkJc2Nhbl9yZXEtPnVJRUZpZWxkTGVuLCBzY2FuX3JlcS0+cmV0dXJuQWZ0ZXJGaXJzdE1hdGNoLAorCQlzY2FuX3JlcS0+cmV0dXJuRnJlc2hSZXN1bHRzLCBzY2FuX3JlcS0+cmV0dXJuVW5pcXVlUmVzdWx0cywKKwkJc2Nhbl9yZXEtPnNjYW5UeXBlLCBtYWNfY3R4LT5saW0uZ0xpbVJzcFJlcWQgPyAxIDogMCk7CisJLyoKKwkgKiBTaW5jZSBzY2FuIHJlcSBhbHdheXMgcmVxdWlyZXMgYSByZXNwb25zZSwgd2Ugd2lsbCBvdmVyd3JpdGUgcmVzcG9uc2UKKwkgKiByZXF1aXJlZCBoZXJlLiBUaGlzIGlzIGFkZGVkIGVzcCB0byB0YWtlIGNhcmUgb2YgdGhlIGNvbmRpdGlvbiB3aGVyZQorCSAqIGluIHAycCBnbyBjYXNlLCB3ZSBob2xkIHRoZSBzY2FuIHJlcSBhbmQgaW5zZXJ0IHNpbmdsZSBOT0EuIFdlIHNlbmQKKwkgKiB0aGUgaGVsZCBzY2FuIHJlcXVlc3QgdG8gRlcgbGF0ZXIgb24gZ2V0dGluZyBzdGFydCBOT0EgaW5kIGZyb20gRlcgc28KKwkgKiB3ZSBsb3NlIHN0YXRlIG9mIHRoZSBnTGltUnNwUmVxZCBmbGFnIGZvciB0aGUgc2NhbiByZXEgaWYgYW55IG90aGVyCisJICogcmVxdWVzdCBjb21lcyBieSB0aGVuLiBlLmcuIFdoaWxlIHVuaXQgdGVzdGluZywgd2UgZm91bmQgd2hlbiBpbnNlcnQKKwkgKiBzaW5nbGUgTk9BIGlzIGRvbmUsIHdlIHNlZSBhIGdldCBzdGF0cyByZXF1ZXN0IHdoaWNoIHR1cm5zIHRoZSBmbGFnCisJICogZ0xpbVJzcFJlcWQgdG8gZmFsc2U7IG5vdyB3aGVuIHdlIGFjdHVhbGx5IHN0YXJ0IHRoZSBzYXZlZCBzY2FuIHJlcQorCSAqIGZvciBpbml0IHNjYW4gYWZ0ZXIgZ2V0dGluZyBOT0Egc3RhcnRlZCwgdGhlIGdMaW1Sc3BSZXFkIGJlaW5nIGEKKwkgKiBnbG9iYWwgZmxhZyBpcyBzaG93aW5nIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZSB2YWx1ZSBmb3IgdGhpcyBzYXZlZAorCSAqIHNjYW4gcmVxLiBTaW5jZSBhbGwgc2NhbiByZXFzIGNvbWluZyB0byBsaW0gcmVxdWlyZSBhIHJlc3BvbnNlLAorCSAqIHRoZXJlIGlzIG5vIGhhcm0gaW4gc2V0dGluZyB0aGUgZ2xvYmFsIGZsYWcgZ0xpbVJzcFJlcWQgdG8gdHJ1ZSBoZXJlLgorCSAqLworCW1hY19jdHgtPmxpbS5nTGltUnNwUmVxZCA9IHRydWU7CisKKwkvKgorCSAqIGNvcHkgdGhlIFNlbGYgTUFDIGFkZHJlc3MgZnJvbSBTbWVSZXEgdG8gdGhlIGdsb2JhbHBsYWNlLAorCSAqIHVzZWQgZm9yIHNlbmRpbmcgcHJvYmUgcmVxCisJICovCisJc2lyX2NvcHlfbWFjX2FkZHIobWFjX2N0eC0+bGltLmdTZWxmTWFjQWRkciwgc2Nhbl9yZXEtPnNlbGZNYWNBZGRyKTsKKwl2YWxpZF9yZXEgPSBsaW1faXNfc21lX3NjYW5fcmVxX3ZhbGlkKG1hY19jdHgsIHNjYW5fcmVxKTsKKworCWlmICghdmFsaWRfcmVxIHx8IG1hY19jdHgtPmxpbS5zY2FuX2Rpc2FibGVkKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJTY2FuIGRpc2FibGVkICVkLCBWYWxpZCBTY2FuIFJlcSAlZCIpLAorCQkJbWFjX2N0eC0+bGltLnNjYW5fZGlzYWJsZWQsIHZhbGlkX3JlcSk7CisKKwkJaWYgKG1hY19jdHgtPmxpbS5nTGltUnNwUmVxZCkgeworCQkJbWFjX2N0eC0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisKKwkJCWxpbV9zZW5kX3NtZV9zY2FuX3JzcChtYWNfY3R4LAorCQkJCQllU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlMsCisJCQkJCXNjYW5fcmVxLT5zZXNzaW9uSWQsCisJCQkJCXNjYW5fcmVxLT50cmFuc2FjdGlvbklkLAorCQkJCQlzY2FuX3JlcS0+c2Nhbl9pZCk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgc2NhbiByZXF1ZXN0IGlzIHJlY2VpdmVkIGluIGlkbGUsIGpvaW5GYWlsZWQKKwkgKiBzdGF0ZXMgb3IgaW4gbGluayBlc3RhYmxpc2hlZCBzdGF0ZSAoaW4gU1RBIHJvbGUpCisJICogb3IgaW4gbm9ybWFsIHN0YXRlIChpbiBTVEEtaW4tSUJTUy9BUCByb2xlKSB3aXRoCisJICogJ3JldHVybiBmcmVzaCBzY2FuIHJlc3VsdHMnIHJlcXVlc3QgZnJvbSBIREQgb3IKKwkgKiBpdCBpcyBwZXJpb2RpYyBiYWNrZ3JvdW5kIHNjYW5uaW5nIHJlcXVlc3QsCisJICogdHJpZ2dlciBmcmVzaCBzY2FuIHJlcXVlc3QgdG8gTUxNCisJICovCisJaWYgKF9fbGltX2ZyZXNoX3NjYW5fcmVxZChtYWNfY3R4LCBzY2FuX3JlcS0+cmV0dXJuRnJlc2hSZXN1bHRzKSkgeworCisJCW1hY19jdHgtPmxpbS5nTGltMjRCYW5kMTFkU2NhbkRvbmUgPSAwOworCQltYWNfY3R4LT5saW0uZ0xpbTUwQmFuZDExZFNjYW5Eb25lID0gMDsKKwkJbWFjX2N0eC0+bGltLmdMaW1SZXR1cm5BZnRlckZpcnN0TWF0Y2ggPQorCQkJc2Nhbl9yZXEtPnJldHVybkFmdGVyRmlyc3RNYXRjaDsKKwkJbWFjX2N0eC0+bGltLmdMaW1SZXR1cm5VbmlxdWVSZXN1bHRzID0KKwkJCSgoc2Nhbl9yZXEtPnJldHVyblVuaXF1ZVJlc3VsdHMpID4gMCA/IHRydWUgOiBmYWxzZSk7CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkJbGltX3NlbmRfaGFsX3N0YXJ0X3NjYW5fb2ZmbG9hZF9yZXEobWFjX2N0eCwKKwkJCSAgICBzY2FuX3JlcSkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoCisJCQkJIkNvdWxkbid0IHNlbmQgT2ZmbG9hZCBzY2FuIHJlcXVlc3QiKSk7CisJCQlsaW1fc2VuZF9zbWVfc2Nhbl9yc3AobWFjX2N0eCwKKwkJCQkJZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTLAorCQkJCQlzY2FuX3JlcS0+c2Vzc2lvbklkLAorCQkJCQlzY2FuX3JlcS0+dHJhbnNhY3Rpb25JZCwKKwkJCQkJc2Nhbl9yZXEtPnNjYW5faWQpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UgeworCQkvKiBJbiBhbGwgb3RoZXIgY2FzZXMgcmV0dXJuICdjYWNoZWQnIHNjYW4gcmVzdWx0cyAqLworCQlpZiAobWFjX2N0eC0+bGltLmdMaW1Sc3BSZXFkKSB7CisJCQltYWNfY3R4LT5saW0uZ0xpbVJzcFJlcWQgPSBmYWxzZTsKKwkJCWxpbV9zZW5kX3NtZV9zY2FuX3JzcChtYWNfY3R4LCBlU0lSX1NNRV9TVUNDRVNTLAorCQkJCXNjYW5fcmVxLT5zZXNzaW9uSWQsCisJCQkJc2Nhbl9yZXEtPnRyYW5zYWN0aW9uSWQsIHNjYW5fcmVxLT5zY2FuX2lkKTsKKwkJfQorCX0KK30KKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9vZW1fZGF0YV9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYpCit7CisJdHBTaXJPZW1EYXRhUmVxIHBPZW1EYXRhUmVxOworCXRMaW1NbG1PZW1EYXRhUmVxICpwTWxtT2VtRGF0YVJlcTsKKworCXBPZW1EYXRhUmVxID0gKHRwU2lyT2VtRGF0YVJlcSkgcE1zZ0J1ZjsKKworCS8qIHBvc3QgdGhlIGxpbSBtbG0gbWVzc2FnZSBub3cgKi8KKwlwTWxtT2VtRGF0YVJlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0TGltTWxtT2VtRGF0YVJlcSkpOworCWlmIChOVUxMID09IHBNbG1PZW1EYXRhUmVxKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIG1sbU9lbURhdGFSZXEiKSk7CisJCXJldHVybjsKKwl9CisJLyogSW5pdGlhbGl6ZSB0aGlzIGJ1ZmZlciAqLworCWNkZl9tZW1fc2V0KHBNbG1PZW1EYXRhUmVxLCAoc2l6ZW9mKHRMaW1NbG1PZW1EYXRhUmVxKSksIDApOworCisJY2RmX21lbV9jb3B5KHBNbG1PZW1EYXRhUmVxLT5zZWxmTWFjQWRkciwgcE9lbURhdGFSZXEtPnNlbGZNYWNBZGRyLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCWNkZl9tZW1fY29weShwTWxtT2VtRGF0YVJlcS0+b2VtRGF0YVJlcSwgcE9lbURhdGFSZXEtPm9lbURhdGFSZXEsCisJCSAgICAgT0VNX0RBVEFfUkVRX1NJWkUpOworCisJLyogSXNzdWUgTElNX01MTV9PRU1fREFUQV9SRVEgdG8gTUxNICovCisJbGltX3Bvc3RfbWxtX21lc3NhZ2UocE1hYywgTElNX01MTV9PRU1fREFUQV9SRVEsCisJCQkgICAgICh1aW50MzJfdCAqKSBwTWxtT2VtRGF0YVJlcSk7CisKKwlyZXR1cm47CisKK30gLyoqKiBlbmQgX19saW1fcHJvY2Vzc19zbWVfb2VtX2RhdGFfcmVxKCkgKioqLworCisjZW5kaWYgLyogRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUICovCisKKy8qKgorICogX19saW1fcHJvY2Vzc19jbGVhcl9kZnNfY2hhbm5lbF9saXN0KCkKKyAqCisgKioqRlVOQ1RJT046CisgKioqQ2xlYXIgREZTIGNoYW5uZWwgbGlzdCAgd2hlbiBjb3VudHJ5IGlzIGNoYW5nZWQvYXF1aXJlZC4KKyAgIC4qVGhpcyBtZXNzYWdlIGlzIHNlbnQgZnJvbSBTTUUuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIF9fbGltX3Byb2Nlc3NfY2xlYXJfZGZzX2NoYW5uZWxfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZykKK3sKKwljZGZfbWVtX3NldCgmcE1hYy0+bGltLmRmc2NoYW5uZWxMaXN0LCBzaXplb2YodFNpckRGU0NoYW5uZWxMaXN0KSwgMCk7Cit9CisKKy8qKgorICogX19saW1fcHJvY2Vzc19zbWVfam9pbl9yZXEoKSAtIHByb2Nlc3MgU01FX0pPSU5fUkVRIG1lc3NhZ2UKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAbXNnX2J1ZjogQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIFNNRV9KT0lOX1JFUSBtZXNzYWdlCisgKiBmcm9tIEhERCBvciB1cHBlciBsYXllciBhcHBsaWNhdGlvbi4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQKK19fbGltX3Byb2Nlc3Nfc21lX2pvaW5fcmVxKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQzMl90ICptc2dfYnVmKQoreworCXRwU2lyU21lSm9pblJlcSBzbWVfam9pbl9yZXEgPSBOVUxMOworCXRMaW1NbG1Kb2luUmVxICptbG1fam9pbl9yZXE7CisJdFNpclJlc3VsdENvZGVzIHJldF9jb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKwl1aW50MzJfdCB2YWwgPSAwOworCXVpbnQxNl90IG5fc2l6ZTsKKwl1aW50OF90IHNlc3Npb25faWQ7CisJdHBQRVNlc3Npb24gc2Vzc2lvbiA9IE5VTEw7CisJdWludDhfdCBzbWVfc2Vzc2lvbl9pZDsKKwl1aW50MTZfdCBzbWVfdHJhbnNhY3Rpb25faWQ7CisJdFBvd2VyZEJtIGxvY2FsX3Bvd2VyX2NvbnN0cmFpbnQgPSAwLCByZWdfbWF4ID0gMDsKKwl1aW50MTZfdCBpZV9sZW47CisJdWludDhfdCAqdmVuZG9yX2llOworCXRTaXJCc3NEZXNjcmlwdGlvbiBic3NfZGVzYzsKKworLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNCisJLyoKKwkgKiBOb3Qgc2VuZGluZyBhbnkgc2Vzc2lvbiwgc2luY2UgaXQgaXMgbm90IGNyZWF0ZWQgeWV0LgorCSAqIFRoZSByZXNwb25zZSB3aG91bGQgaGF2ZSBjb3JyZWN0IHN0YXRlLgorCSAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChtYWNfY3R4LCBXTEFOX1BFX0RJQUdfSk9JTl9SRVFfRVZFTlQsIE5VTEwsIDAsIDApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlJlY2VpdmVkIFNNRV9KT0lOX1JFUSIpKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJLyoKKwkgKiBOZWVkIHRvIHJlYWQgdGhlIENGRyBoZXJlIGl0c2VsZiBhcyB0aGlzIGlzCisJICogdXNlZCBpbiBsaW1FeHRyYWN0QVBDYXBhYmlsaXR5KCkgYmVsb3cuCisJICogVGhpcyBDRkcgaXMgYWN0dWFsbHkgcmVhZCBpbiBycm1fdXBkYXRlX2NvbmZpZygpCisJICogd2hpY2ggaXMgY2FsbGVkIGxhdGVyLiBCZWNhdXNlIHRoaXMgaXMgbm90CisJICogcmVhZCwgUlJNIHJlbGF0ZWQgcGF0aCBiZWZvcmUgY2FsbGluZyBycm1fdXBkYXRlX2NvbmZpZygpCisJICogaXMgbm90IGdldHRpbmcgZXhlY3V0ZWQgY2F1c2luZyBpc3N1ZXMKKwkgKiBsaWtlIG5vdCBob25vcmluZyBwb3dlciBjb25zdHJhaW50IG9uIDFzdCBhc3NvY2lhdGlvbgorCSAqIGFmdGVyIGRyaXZlciBsb2FkaW5nLgorCSAqLworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfUlJNX0VOQUJMRUQsICZ2YWwpICE9CisJCQllU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoImNmZyBnZXQgcnJtIGVuYWJsZWQgZmFpbGVkIikpOworCW1hY19jdHgtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlID0gKHZhbCkgPyAxIDogMDsKKwl2YWwgPSAwOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRkkgKi8KKworCS8qCisJICogRXhwZWN0IEpvaW4gcmVxdWVzdCBpbiBpZGxlIHN0YXRlLgorCSAqIFJlYXNzb2NpYXRlIHJlcXVlc3QgaXMgZXhwZWN0ZWQgaW4gbGluayBlc3RhYmxpc2hlZCBzdGF0ZS4KKwkgKi8KKworCS8qIEdsb2JhbCBTTUUgYW5kIExJTSBzdGF0ZXMgYXJlIG5vdCBkZWZpbmVkIHlldCBmb3IgQlQtQU1QIFN1cHBvcnQgKi8KKwlpZiAobWFjX2N0eC0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9JRExFX1NUQVRFKSB7CisJCW5fc2l6ZSA9IF9fbGltX2dldF9zbWVfam9pbl9yZXFfc2l6ZV9mb3JfYWxsb2MoKHVpbnQ4X3QgKikKKwkJCQltc2dfYnVmKTsKKworCQlzbWVfam9pbl9yZXEgPSBjZGZfbWVtX21hbGxvYyhuX3NpemUpOworCQlpZiAoTlVMTCA9PSBzbWVfam9pbl9yZXEpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQlGTCgiQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBzbWVfam9pbl9yZXEiKSk7CisJCQlyZXRfY29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKwkJCXJldHVybjsKKwkJfQorCQkodm9pZCljZGZfbWVtX3NldCgodm9pZCAqKXNtZV9qb2luX3JlcSwgbl9zaXplLCAwKTsKKwkJKHZvaWQpY2RmX21lbV9jb3B5KCh2b2lkICopc21lX2pvaW5fcmVxLCAodm9pZCAqKW1zZ19idWYsCisJCQluX3NpemUpOworCisJCWlmICghbGltX2lzX3NtZV9qb2luX3JlcV92YWxpZChtYWNfY3R4LCBzbWVfam9pbl9yZXEpKSB7CisJCQkvKiBSZWNlaXZlZCBpbnZhbGlkIGVXTklfU01FX0pPSU5fUkVRICovCisJCQkvKiBMb2cgdGhlIGV2ZW50ICovCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoIlNlc3Npb25JZDolZCBKT0lOIFJFUSB3aXRoIGludmFsaWQgZGF0YSIpLAorCQkJCXNtZV9qb2luX3JlcS0+c2Vzc2lvbklkKTsKKwkJCXJldF9jb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCQkJZ290byBlbmQ7CisJCX0KKworCQlic3NfZGVzYyA9IHNtZV9qb2luX3JlcS0+YnNzRGVzY3JpcHRpb247CisJCS8qIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIHN0YXJ0IEJTUyBzZXNzaW9uICAqLworCisJCXNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQobWFjX2N0eCwgYnNzX2Rlc2MuYnNzSWQsCisJCQkJJnNlc3Npb25faWQpOworCisJCWlmIChzZXNzaW9uICE9IE5VTEwpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiU2Vzc2lvbiglZCkgQWxyZWFkeSBleGlzdHMgZm9yIEJTU0lEOiAiCisJCQkJICAgTUFDX0FERFJFU1NfU1RSICIgaW4gbGltU21lU3RhdGUgPSAlWCIpLAorCQkJCXNlc3Npb25faWQsCisJCQkJTUFDX0FERFJfQVJSQVkoYnNzX2Rlc2MuYnNzSWQpLAorCQkJCXNlc3Npb24tPmxpbVNtZVN0YXRlKTsKKworCQkJaWYgKHNlc3Npb24tPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX0xJTktfRVNUX1NUQVRFICYmCisJCQkgICAgc2Vzc2lvbi0+c21lU2Vzc2lvbklkID09IHNtZV9qb2luX3JlcS0+c2Vzc2lvbklkKSB7CisJCQkJLyoKKwkJCQkgKiBSZWNlaXZlZCBlV05JX1NNRV9KT0lOX1JFUSBmb3Igc2FtZQorCQkJCSAqIEJTUyBhcyBjdXJyZW50bHkgYXNzb2NpYXRlZC4KKwkJCQkgKiBMb2cgdGhlIGV2ZW50IGFuZCBzZW5kIHN1Y2Nlc3MKKwkJCQkgKi8KKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkJCUZMKCJTZXNzaW9uSWQ6ICVkIiksIHNlc3Npb25faWQpOworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQkJRkwoIkpPSU5fUkVRIGZvciBjdXJyZW50IGpvaW5lZCBCU1MiKSk7CisJCQkJLyogU2VuZCBKb2luIHN1Y2Nlc3MgcmVzcG9uc2UgdG8gaG9zdCAqLworCQkJCXJldF9jb2RlID0gZVNJUl9TTUVfQUxSRUFEWV9KT0lORURfQV9CU1M7CisJCQkJc2Vzc2lvbiA9IE5VTEw7CisJCQkJZ290byBlbmQ7CisJCQl9IGVsc2UgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkgICAgRkwoIkpPSU5fUkVRIG5vdCBmb3IgY3VycmVudCBqb2luZWQgQlNTIikpOworCQkJCXJldF9jb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKwkJCQlzZXNzaW9uID0gTlVMTDsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBTZXNzaW9uIEVudHJ5IGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJZAorCQkJICogVHJ5IHRvIENyZWF0ZSBhIG5ldyBzZXNzaW9uCisJCQkgKi8KKwkJCXNlc3Npb24gPSBwZV9jcmVhdGVfc2Vzc2lvbihtYWNfY3R4LCBic3NfZGVzYy5ic3NJZCwKKwkJCQkJJnNlc3Npb25faWQsIG1hY19jdHgtPmxpbS5tYXhTdGF0aW9uLAorCQkJCQllU0lSX0lORlJBU1RSVUNUVVJFX01PREUpOworCQkJaWYgKHNlc3Npb24gPT0gTlVMTCkgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJRkwoIlNlc3Npb24gQ2FuIG5vdCBiZSBjcmVhdGVkICIpKTsKKwkJCQlyZXRfY29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKwkJCQlnb3RvIGVuZDsKKwkJCX0gZWxzZQorCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQkJRkwoIlNlc3Npb25JZDolZCBOZXcgc2Vzc2lvbiBjcmVhdGVkIiksCisJCQkJCXNlc3Npb25faWQpOworCQl9CisJCXNlc3Npb24tPmlzQW1zZHVTdXBwb3J0SW5BTVBEVSA9CisJCQlzbWVfam9pbl9yZXEtPmlzQW1zZHVTdXBwb3J0SW5BTVBEVTsKKworCQkvKgorCQkgKiBTdG9yZSBTZXNzaW9uIHJlbGF0ZWQgcGFyYW1ldGVycworCQkgKiBTdG9yZSBQRSBzZXNzaW9uIElkIGluIHNlc3Npb24gVGFibGUKKwkJICovCisJCXNlc3Npb24tPnBlU2Vzc2lvbklkID0gc2Vzc2lvbl9pZDsKKworCQkvKiBzdG9yZSB0aGUgc21lam9pbiByZXEgaGFuZGxlIGluIHNlc3Npb24gdGFibGUgKi8KKwkJc2Vzc2lvbi0+cExpbUpvaW5SZXEgPSBzbWVfam9pbl9yZXE7CisKKwkJLyogU3RvcmUgU01FIHNlc3Npb24gSWQgaW4gc2Vzc2lvblRhYmxlICovCisJCXNlc3Npb24tPnNtZVNlc3Npb25JZCA9IHNtZV9qb2luX3JlcS0+c2Vzc2lvbklkOworCisJCS8qIFN0b3JlIFNNRSB0cmFuc2FjdGlvbiBJZCBpbiBzZXNzaW9uIFRhYmxlICovCisJCXNlc3Npb24tPnRyYW5zYWN0aW9uSWQgPSBzbWVfam9pbl9yZXEtPnRyYW5zYWN0aW9uSWQ7CisKKwkJLyogU3RvcmUgYmVhY29uSW50ZXJ2YWwgKi8KKwkJc2Vzc2lvbi0+YmVhY29uUGFyYW1zLmJlYWNvbkludGVydmFsID0KKwkJCWJzc19kZXNjLmJlYWNvbkludGVydmFsOworCisJCWNkZl9tZW1fY29weSgmKHNlc3Npb24tPmh0Q29uZmlnKSwgJihzbWVfam9pbl9yZXEtPmh0Q29uZmlnKSwKKwkJCXNpemVvZihzZXNzaW9uLT5odENvbmZpZykpOworCisJCS8qIENvcHlpbmcgb2YgYnNzSWQgaXMgYWxyZWFkeSBkb25lLCB3aGlsZSBjcmVhdGluZyBzZXNzaW9uICovCisJCXNpcl9jb3B5X21hY19hZGRyKHNlc3Npb24tPnNlbGZNYWNBZGRyLAorCQkJc21lX2pvaW5fcmVxLT5zZWxmTWFjQWRkcik7CisJCXNlc3Npb24tPmJzc1R5cGUgPSBzbWVfam9pbl9yZXEtPmJzc3R5cGU7CisKKwkJc2Vzc2lvbi0+c3RhdHlwZUZvckJzcyA9IFNUQV9FTlRSWV9QRUVSOworCQlzZXNzaW9uLT5saW1XbWVFbmFibGVkID0gc21lX2pvaW5fcmVxLT5pc1dNRWVuYWJsZWQ7CisJCXNlc3Npb24tPmxpbVFvc0VuYWJsZWQgPSBzbWVfam9pbl9yZXEtPmlzUW9zRW5hYmxlZDsKKworCQkvKiBTdG9yZSB2ZW5kb3Igc3BlY2ZpYyBJRSBmb3IgQ0lTQ08gQVAgKi8KKwkJaWVfbGVuID0gKGJzc19kZXNjLmxlbmd0aCArIHNpemVvZihic3NfZGVzYy5sZW5ndGgpIC0KKwkJCSBHRVRfRklFTERfT0ZGU0VUKHRTaXJCc3NEZXNjcmlwdGlvbiwgaWVGaWVsZHMpKTsKKworCQl2ZW5kb3JfaWUgPSBjZmdfZ2V0X3ZlbmRvcl9pZV9wdHJfZnJvbV9vdWkobWFjX2N0eCwKKwkJCQlTSVJfTUFDX0NJU0NPX09VSSwgU0lSX01BQ19DSVNDT19PVUlfU0laRSwKKwkJCQkoKHVpbnQ4X3QgKikmYnNzX2Rlc2MuaWVGaWVsZHMpLCBpZV9sZW4pOworCisJCWlmIChOVUxMICE9IHZlbmRvcl9pZSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJEVVQgaXMgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gQ2lzY28gQVAiKSk7CisJCQlzZXNzaW9uLT5pc0Npc2NvVmVuZG9yQVAgPSB0cnVlOworCQl9IGVsc2UgeworCQkJc2Vzc2lvbi0+aXNDaXNjb1ZlbmRvckFQID0gZmFsc2U7CisJCX0KKworCQkvKiBDb3B5IHRoZSBkb3QgMTEgbW9kZSBpbiB0byB0aGUgc2Vzc2lvbiB0YWJsZSAqLworCisJCXNlc3Npb24tPmRvdDExbW9kZSA9IHNtZV9qb2luX3JlcS0+ZG90MTFtb2RlOworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCQlzZXNzaW9uLT5jY19zd2l0Y2hfbW9kZSA9IHNtZV9qb2luX3JlcS0+Y2Nfc3dpdGNoX21vZGU7CisjZW5kaWYKKwkJc2Vzc2lvbi0+bndUeXBlID0gYnNzX2Rlc2MubndUeXBlOworCQlzZXNzaW9uLT5lbmFibGVBbXBkdVBzID0gc21lX2pvaW5fcmVxLT5lbmFibGVBbXBkdVBzOworCQlzZXNzaW9uLT5lbmFibGVIdFNtcHMgPSBzbWVfam9pbl9yZXEtPmVuYWJsZUh0U21wczsKKwkJc2Vzc2lvbi0+aHRTbXBzdmFsdWUgPSBzbWVfam9pbl9yZXEtPmh0U21wczsKKworCQkvKlN0b3JlIFBlcnNvbmEgKi8KKwkJc2Vzc2lvbi0+cGVQZXJzb25hID0gc21lX2pvaW5fcmVxLT5zdGFQZXJzb25hOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgIEZMKCJQRSBQRVJTT05BPSVkIGNiTW9kZSAldSIpLAorCQkJICBzZXNzaW9uLT5wZVBlcnNvbmEsIHNtZV9qb2luX3JlcS0+Y2JNb2RlKTsKKwkJaWYgKG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uZW5hYmxlMngyKQorCQkJc2Vzc2lvbi0+bnNzID0gMjsKKwkJZWxzZQorCQkJc2Vzc2lvbi0+bnNzID0gMTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQlzZXNzaW9uLT52aHRDYXBhYmlsaXR5ID0KKwkJCUlTX0RPVDExX01PREVfVkhUKHNlc3Npb24tPmRvdDExbW9kZSk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkgICIqKipfX2xpbV9wcm9jZXNzX3NtZV9qb2luX3JlcTogdmh0Q2FwYWJpbGl0eT0lZCoqKioiLAorCQkJICBzZXNzaW9uLT52aHRDYXBhYmlsaXR5KTsKKwkJaWYgKHNlc3Npb24tPnZodENhcGFiaWxpdHkpIHsKKwkJCWlmIChzZXNzaW9uLT5wZVBlcnNvbmEgPT0gQ0RGX1NUQV9NT0RFKSB7CisJCQkJc2Vzc2lvbi0+dHhCRkluaUZlYXR1cmVFbmFibGVkID0KKwkJCQkJc21lX2pvaW5fcmVxLT50eEJGSW5pRmVhdHVyZUVuYWJsZWQ7CisJCQl9IGVsc2UgeworCQkJCXNlc3Npb24tPnR4QkZJbmlGZWF0dXJlRW5hYmxlZCA9IDA7CisJCQl9CisJCQlzZXNzaW9uLT50eE11QmZvcm1lZSA9IHNtZV9qb2luX3JlcS0+dHhNdUJmb3JtZWU7CisJCQlzZXNzaW9uLT5lbmFibGVWaHRwQWlkID0KKwkJCQlzbWVfam9pbl9yZXEtPmVuYWJsZVZodHBBaWQ7CisJCQlzZXNzaW9uLT5lbmFibGVWaHRHaWQgPQorCQkJCXNtZV9qb2luX3JlcS0+ZW5hYmxlVmh0R2lkOworCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJCSAgRkwoIioqKnR4QkZJbmlGZWF0dXJlRW5hYmxlZD0lZCoqKiIpLAorCQkJCSAgc2Vzc2lvbi0+dHhCRkluaUZlYXR1cmVFbmFibGVkKTsKKwkJCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsCisJCQkJCVdOSV9DRkdfVkhUX1NVX0JFQU1GT1JNRVJfQ0FQLCAmdmFsKSAhPQorCQkJCWVTSVJfU1VDQ0VTUykKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKAorCQkJCQkiY2ZnIGdldCB2aHQgc3UgYmZvcm1lciBmYWlsZWQiKSk7CisKKwkJCXNlc3Npb24tPmVuYWJsZV9zdV90eF9iZm9ybWVyID0gdmFsOworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgidmh0IHN1IHR4IGJmb3JtZXIgJWQiKSwgdmFsKTsKKwkJfQorCQlpZiAoc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eSAmJiBzZXNzaW9uLT50eEJGSW5pRmVhdHVyZUVuYWJsZWQpIHsKKwkJCWlmIChjZmdfc2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVFX0NBUCwKKwkJCQlzZXNzaW9uLT50eEJGSW5pRmVhdHVyZUVuYWJsZWQpICE9CisJCQkJZVNJUl9TVUNDRVNTKSB7CisJCQkJLyoKKwkJCQkgKiBTZXQgZmFpbGVkIGZvcgorCQkJCSAqIENGR19WSFRfU1VfQkVBTUZPUk1FRV9DQVAKKwkJCQkgKi8KKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJCUZMKCJGYWlsZWQgQ0ZHX1ZIVF9TVV9CRUFNRk9STUVFX0NBUCIpKTsKKwkJCQlyZXRfY29kZSA9IGVTSVJfTE9HUF9FWENFUFRJT047CisJCQkJZ290byBlbmQ7CisJCQl9CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJCSAgIiVzOiB0eEJGQ3NuVmFsdWU9JWQiLCBfX2Z1bmNfXywKKwkJCQkgIHNtZV9qb2luX3JlcS0+dHhCRkNzblZhbHVlKTsKKwkJCWlmIChjZmdfc2V0X2ludChtYWNfY3R4LAorCQkJCVdOSV9DRkdfVkhUX0NTTl9CRUFNRk9STUVFX0FOVF9TVVBQT1JURUQsCisJCQkJc21lX2pvaW5fcmVxLT50eEJGQ3NuVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJCS8qCisJCQkJICogU2V0IEZhaWxlZCBmb3IgQ0ZHCisJCQkJICogQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVECisJCQkJICovCisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLCBGTCgiU2V0IEZhaWwgQ0ZHIikpOworCQkJCXJldF9jb2RlID0gZVNJUl9MT0dQX0VYQ0VQVElPTjsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJLypQaHkgbW9kZSAqLworCQlzZXNzaW9uLT5nTGltUGh5TW9kZSA9IGJzc19kZXNjLm53VHlwZTsKKwkJaGFuZGxlX2h0X2NhcGFiaWxpdHlhbmRfaHRfaW5mbyhtYWNfY3R4LCBzZXNzaW9uKTsKKwkJLyogQ29weSBUaGUgY2hhbm5lbCBJZCB0byB0aGUgc2Vzc2lvbiBUYWJsZSAqLworCQlzZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwgPSBic3NfZGVzYy5jaGFubmVsSWQ7CisJCS8qIGNiTW9kZSBpcyBhbHJlYWR5IG1lcmdlZCB2YWx1ZSBvZiBwZWVyIGFuZCBzZWxmIC0KKwkJICogZG9uZSBieSBjc3IgaW4gY3NyX2dldF9jYl9tb2RlX2Zyb21faWVzICovCisJCXNlc3Npb24tPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCShzbWVfam9pbl9yZXEtPmNiTW9kZSkgPyAxIDogMDsKKwkJc2Vzc2lvbi0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPQorCQkJc2Vzc2lvbi0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJCXNlc3Npb24tPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IHNtZV9qb2luX3JlcS0+Y2JNb2RlOworCisJCWlmIChQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZID09IHNtZV9qb2luX3JlcS0+Y2JNb2RlKSB7CisJCQlzZXNzaW9uLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQlzZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwgLSAyOworCQkJc2Vzc2lvbi0+Y2hfd2lkdGggPSBDSF9XSURUSF80ME1IWjsKKwkJfSBlbHNlIGlmIChQSFlfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlkgPT0KKwkJCQlzbWVfam9pbl9yZXEtPmNiTW9kZSkgeworCQkJc2Vzc2lvbi0+Y2hfY2VudGVyX2ZyZXFfc2VnMCA9CisJCQkJc2Vzc2lvbi0+Y3VycmVudE9wZXJDaGFubmVsICsgMjsKKwkJCXNlc3Npb24tPmNoX3dpZHRoID0gQ0hfV0lEVEhfNDBNSFo7CisJCX0gZWxzZSB7CisJCQlzZXNzaW9uLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0gMDsKKwkJCXNlc3Npb24tPmNoX3dpZHRoID0gQ0hfV0lEVEhfMjBNSFo7CisJCX0KKworCQkvKiBSZWNvcmQgaWYgbWFuYWdlbWVudCBmcmFtZXMgbmVlZCB0byBiZSBwcm90ZWN0ZWQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJCWlmIChlU0lSX0VEX0FFU18xMjhfQ01BQyA9PSBzbWVfam9pbl9yZXEtPk1nbXRFbmNyeXB0aW9uVHlwZSkgeworCQkJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCQkJc2Vzc2lvbi0+bGltUm1mRW5hYmxlZCA9IDE7CisJCQlzZXNzaW9uLT5wbWZDb21lYmFja1RpbWVySW5mby5wTWFjID0gbWFjX2N0eDsKKwkJCXNlc3Npb24tPnBtZkNvbWViYWNrVGltZXJJbmZvLnNlc3Npb25JRCA9CisJCQkJc2Vzc2lvbl9pZDsKKwkJCWNkZl9zdGF0dXMgPSBjZGZfbWNfdGltZXJfaW5pdCgKKwkJCQkJJnNlc3Npb24tPnBtZkNvbWViYWNrVGltZXIsCisJCQkJCUNERl9USU1FUl9UWVBFX1NXLAorCQkJCQlsaW1fcG1mX2NvbWViYWNrX3RpbWVyX2NhbGxiYWNrLAorCQkJCQkodm9pZCAqKSZzZXNzaW9uLT5wbWZDb21lYmFja1RpbWVySW5mbyk7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJCUZMKCJjYW5ub3QgaW5pdCBwbWYgY29tZWJhY2sgdGltZXIuIikpOworCQkJCXJldF9jb2RlID0gZVNJUl9MT0dQX0VYQ0VQVElPTjsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNlc3Npb24tPmxpbVJtZkVuYWJsZWQgPSAwOworCQl9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNCisJCXNlc3Npb24tPnJzc2kgPSBic3NfZGVzYy5yc3NpOworI2VuZGlmCisKKwkJLyogQ29weSB0aGUgU1NJRCBmcm9tIHNtZWpvaW5yZXEgdG8gc2Vzc2lvbiBlbnRyeSAgKi8KKwkJc2Vzc2lvbi0+c3NJZC5sZW5ndGggPSBzbWVfam9pbl9yZXEtPnNzSWQubGVuZ3RoOworCQljZGZfbWVtX2NvcHkoc2Vzc2lvbi0+c3NJZC5zc0lkLCBzbWVfam9pbl9yZXEtPnNzSWQuc3NJZCwKKwkJCXNlc3Npb24tPnNzSWQubGVuZ3RoKTsKKworCQkvKgorCQkgKiBEZXRlcm1pbiAxMXIgb3IgRVNFIGNvbm5lY3Rpb24gYmFzZWQgb24gaW5wdXQgZnJvbSBTTUUKKwkJICogd2hpY2ggaW50dXJuIGlzIGRlcGVuZGVudCBvbiB0aGUgcHJvZmlsZSB0aGUgdXNlciB3YW50cworCQkgKiB0byBjb25uZWN0IHRvLCBTbyBpbnB1dCBpcyBjb21pbmcgZnJvbSBzdXBwbGljYW50CisJCSAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCXNlc3Npb24tPmlzMTFSY29ubmVjdGlvbiA9IHNtZV9qb2luX3JlcS0+aXMxMVJjb25uZWN0aW9uOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQlzZXNzaW9uLT5pc0VTRWNvbm5lY3Rpb24gPSBzbWVfam9pbl9yZXEtPmlzRVNFY29ubmVjdGlvbjsKKyNlbmRpZgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgfHwgZGVmaW5lZCBGRUFUVVJFX1dMQU5fRVNFIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwkJc2Vzc2lvbi0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQgPQorCQkJc21lX2pvaW5fcmVxLT5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZDsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCQlzZXNzaW9uLT5pc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQgPQorCQkJc21lX2pvaW5fcmVxLT5pc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKKwkJc2Vzc2lvbi0+dHhMZHBjSW5pRmVhdHVyZUVuYWJsZWQgPQorCQkJc21lX2pvaW5fcmVxLT50eExkcGNJbmlGZWF0dXJlRW5hYmxlZDsKKworCQlpZiAoc2Vzc2lvbi0+YnNzVHlwZSA9PSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREUpIHsKKwkJCXNlc3Npb24tPmxpbVN5c3RlbVJvbGUgPSBlTElNX1NUQV9ST0xFOworCQl9IGVsc2UgaWYgKHNlc3Npb24tPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9BUF9NT0RFKSB7CisJCQlzZXNzaW9uLT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9CVF9BTVBfU1RBX1JPTEU7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhyb3cgYW4gZXJyb3IgYW5kIHJldHVybiBhbmQgbWFrZQorCQkJICogc3VyZSB0byBkZWxldGUgdGhlIHNlc3Npb24uCisJCQkgKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgicmVjdmQgSk9JTl9SRVEgd2l0aCBpbnZhbGlkIGJzcyB0eXBlICVkIiksCisJCQkJc2Vzc2lvbi0+YnNzVHlwZSk7CisJCQlyZXRfY29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKwkJCWdvdG8gZW5kOworCQl9CisKKwkJaWYgKHNtZV9qb2luX3JlcS0+YWRkSUVTY2FuLmxlbmd0aCkKKwkJCWNkZl9tZW1fY29weSgmc2Vzc2lvbi0+cExpbUpvaW5SZXEtPmFkZElFU2NhbiwKKwkJCQkmc21lX2pvaW5fcmVxLT5hZGRJRVNjYW4sIHNpemVvZih0U2lyQWRkaWUpKTsKKworCQlpZiAoc21lX2pvaW5fcmVxLT5hZGRJRUFzc29jLmxlbmd0aCkKKwkJCWNkZl9tZW1fY29weSgmc2Vzc2lvbi0+cExpbUpvaW5SZXEtPmFkZElFQXNzb2MsCisJCQkJJnNtZV9qb2luX3JlcS0+YWRkSUVBc3NvYywgc2l6ZW9mKHRTaXJBZGRpZSkpOworCisJCXZhbCA9IHNpemVvZih0TGltTWxtSm9pblJlcSkgKworCQkJc2Vzc2lvbi0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmxlbmd0aCArIDI7CisJCW1sbV9qb2luX3JlcSA9IGNkZl9tZW1fbWFsbG9jKHZhbCk7CisJCWlmIChOVUxMID09IG1sbV9qb2luX3JlcSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIG1sbUpvaW5SZXEiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJKHZvaWQpY2RmX21lbV9zZXQoKHZvaWQgKiltbG1fam9pbl9yZXEsIHZhbCwgMCk7CisKKwkJLyogUEUgU2Vzc2lvbklkIGlzIHN0b3JlZCBhcyBhIHBhcnQgb2YgSm9pblJlcSAqLworCQltbG1fam9pbl9yZXEtPnNlc3Npb25JZCA9IHNlc3Npb24tPnBlU2Vzc2lvbklkOworCisJCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfSk9JTl9GQUlMVVJFX1RJTUVPVVQsCisJCQkodWludDMyX3QgKikgJm1sbV9qb2luX3JlcS0+am9pbkZhaWx1cmVUaW1lb3V0KSAhPQorCQkJZVNJUl9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJRkwoImNvdWxkbid0IHJldHJpZXZlIEpvaW5GYWlsdXJlVGltZXIgdmFsdWUiCisJCQkJIiBzZXR0aW5nIHRvIGRlZmF1bHQgdmFsdWUiKSk7CisJCQltbG1fam9pbl9yZXEtPmpvaW5GYWlsdXJlVGltZW91dCA9CisJCQkJV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVF9TVEFERUY7CisJCX0KKworCQkvKiBjb3B5IG9wZXJhdGlvbmFsIHJhdGUgZnJvbSBzZXNzaW9uICovCisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZzZXNzaW9uLT5yYXRlU2V0LAorCQkJKHZvaWQgKikmc21lX2pvaW5fcmVxLT5vcGVyYXRpb25hbFJhdGVTZXQsCisJCQlzaXplb2YodFNpck1hY1JhdGVTZXQpKTsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJnNlc3Npb24tPmV4dFJhdGVTZXQsCisJCQkodm9pZCAqKSZzbWVfam9pbl9yZXEtPmV4dGVuZGVkUmF0ZVNldCwKKwkJCXNpemVvZih0U2lyTWFjUmF0ZVNldCkpOworCQkvKgorCQkgKiB0aGlzIG1heSBub3QgYmUgbmVlZGVkIGFueW1vcmUgbm93LCBhcyByYXRlU2V0IGlzIG5vdworCQkgKiBpbmNsdWRlZCBpbiB0aGUgc2Vzc2lvbiBlbnRyeSBhbmQgTUxNIGhhcyBzZXNzaW9uIGNvbnRleHQuCisJCSAqLworCQljZGZfbWVtX2NvcHkoKHZvaWQgKikmbWxtX2pvaW5fcmVxLT5vcGVyYXRpb25hbFJhdGVTZXQsCisJCQkodm9pZCAqKSZzZXNzaW9uLT5yYXRlU2V0LAorCQkJc2l6ZW9mKHRTaXJNYWNSYXRlU2V0KSk7CisKKwkJc2Vzc2lvbi0+ZW5jcnlwdFR5cGUgPSBzbWVfam9pbl9yZXEtPlVDRW5jcnlwdGlvblR5cGU7CisKKwkJbWxtX2pvaW5fcmVxLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGggPQorCQkJc2Vzc2lvbi0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmxlbmd0aDsKKworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJm1sbV9qb2luX3JlcS0+YnNzRGVzY3JpcHRpb24uYnNzSWQsCisJCQkodWludDhfdCAqKQorCQkJJnNlc3Npb24tPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwKKwkJCXNlc3Npb24tPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGggKyAyKTsKKworCQlzZXNzaW9uLT5saW1DdXJyZW50QnNzQ2FwcyA9CisJCQlzZXNzaW9uLT5wTGltSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uY2FwYWJpbGl0eUluZm87CisKKwkJcmVnX21heCA9IGNmZ19nZXRfcmVndWxhdG9yeV9tYXhfdHJhbnNtaXRfcG93ZXIobWFjX2N0eCwKKwkJCQlzZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwpOworCQlsb2NhbF9wb3dlcl9jb25zdHJhaW50ID0gcmVnX21heDsKKworCQlsaW1fZXh0cmFjdF9hcF9jYXBhYmlsaXR5KG1hY19jdHgsCisJCQkodWludDhfdCAqKQorCQkJc2Vzc2lvbi0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmllRmllbGRzLAorCQkJbGltX2dldF9pZWxlbl9mcm9tX2Jzc19kZXNjcmlwdGlvbigKKwkJCSZzZXNzaW9uLT5wTGltSm9pblJlcS0+YnNzRGVzY3JpcHRpb24pLAorCQkJJnNlc3Npb24tPmxpbUN1cnJlbnRCc3NRb3NDYXBzLAorCQkJJnNlc3Npb24tPmxpbUN1cnJlbnRCc3NQcm9wQ2FwLAorCQkJJnNlc3Npb24tPmdMaW1DdXJyZW50QnNzVWFwc2QsCisJCQkmbG9jYWxfcG93ZXJfY29uc3RyYWludCwgc2Vzc2lvbik7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCXNlc3Npb24tPm1heFR4UG93ZXIgPSBsaW1fZ2V0X21heF90eF9wb3dlcihyZWdfbWF4LAorCQkJCQlsb2NhbF9wb3dlcl9jb25zdHJhaW50LAorCQkJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwKTsKKyNlbHNlCisJCXNlc3Npb24tPm1heFR4UG93ZXIgPQorCQkJQ0RGX01JTihyZWdfbWF4LCAobG9jYWxfcG93ZXJfY29uc3RyYWludCkpOworI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkiUmVndWxhdG9yeSBtYXggPSAlZCwgbG9jYWwgcG93ZXIgY29uc3RyYWludCA9ICVkIgorCQkJcmVnX21heCwgbG9jYWxfcG93ZXJfY29uc3RyYWludCk7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIiBtYXggdHggPSAlZCIpLAorCQkJc2Vzc2lvbi0+bWF4VHhQb3dlcik7CisjZW5kaWYKKworCQlpZiAoc2Vzc2lvbi0+Z0xpbUN1cnJlbnRCc3NVYXBzZCkgeworCQkJc2Vzc2lvbi0+Z1VhcHNkUGVyQWNCaXRtYXNrID0KKwkJCQlzZXNzaW9uLT5wTGltSm9pblJlcS0+dWFwc2RQZXJBY0JpdG1hc2s7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkJRkwoIlVBUFNEIGZsYWcgZm9yIGFsbCBBQyAtIDB4JTJ4IiksCisJCQkJc2Vzc2lvbi0+Z1VhcHNkUGVyQWNCaXRtYXNrKTsKKworCQkJLyogcmVzZXR0aW5nIHRoZSBkeW5hbWljIHVhcHNkIG1hc2sgICovCisJCQlzZXNzaW9uLT5nVWFwc2RQZXJBY0RlbGl2ZXJ5RW5hYmxlTWFzayA9IDA7CisJCQlzZXNzaW9uLT5nVWFwc2RQZXJBY1RyaWdnZXJFbmFibGVNYXNrID0gMDsKKwkJfQorCisJCXNlc3Npb24tPmxpbVJGQmFuZCA9CisJCQlsaW1fZ2V0X3JmX2JhbmQoc2Vzc2lvbi0+Y3VycmVudE9wZXJDaGFubmVsKTsKKworCQkvKiBJbml0aWFsaXplIDExaCBFbmFibGUgRmxhZyAqLworCQlpZiAoU0lSX0JBTkRfNV9HSFogPT0gc2Vzc2lvbi0+bGltUkZCYW5kKSB7CisJCQlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHXzExSF9FTkFCTEVELAorCQkJCSZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQkJRkwoIkZhaWwgdG8gZ2V0IFdOSV9DRkdfMTFIX0VOQUJMRUQgIikpOworCQkJCXNlc3Npb24tPmxpbTExaEVuYWJsZSA9CisJCQkJCVdOSV9DRkdfMTFIX0VOQUJMRURfU1RBREVGOworCQkJfSBlbHNlIHsKKwkJCQlzZXNzaW9uLT5saW0xMWhFbmFibGUgPSB2YWw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzZXNzaW9uLT5saW0xMWhFbmFibGUgPSAwOworCQl9CisKKwkJLyoKKwkJICogVG8gY2FyZSBvZiB0aGUgc2NlbmFyaW8gd2hlbiBTVEEgdHJhbnNpdGlvbnMgZnJvbQorCQkgKiBJQlNTIHRvIEluZnJhc3RydWN0dXJlIG1vZGUuCisJCSAqLworCQltYWNfY3R4LT5saW0uZ0xpbUlic3NDb2FsZXNjaW5nSGFwcGVuZWQgPSBmYWxzZTsKKworCQlzZXNzaW9uLT5saW1QcmV2U21lU3RhdGUgPSBzZXNzaW9uLT5saW1TbWVTdGF0ZTsKKwkJc2Vzc2lvbi0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9KT0lOX1NUQVRFOworCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfU01FX1NUQVRFLAorCQkJCXNlc3Npb24tPnBlU2Vzc2lvbklkLAorCQkJCXNlc3Npb24tPmxpbVNtZVN0YXRlKSk7CisKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIlNNRSBKb2luUmVxOlNlc3Npb25pZCAlZCBTU0lEIGxlbiAlZCBTU0lEIDogJXMgQ2hhbm5lbCAlZCwgQlNTSUQgIiBNQUNfQUREUkVTU19TVFIpLAorCQkJbWxtX2pvaW5fcmVxLT5zZXNzaW9uSWQsIHNlc3Npb24tPnNzSWQubGVuZ3RoLAorCQkJc2Vzc2lvbi0+c3NJZC5zc0lkLCBzZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwsCisJCQlNQUNfQUREUl9BUlJBWShzZXNzaW9uLT5ic3NJZCkpOworCisJCS8qIEluZGljYXRlIHdoZXRoZXIgc3BlY3RydW0gbWFuYWdlbWVudCBpcyBlbmFibGVkICovCisJCXNlc3Npb24tPnNwZWN0cnVtTWd0RW5hYmxlZCA9CisJCQlzbWVfam9pbl9yZXEtPnNwZWN0cnVtTWd0SW5kaWNhdG9yOworCisJCS8qIEVuYWJsZSB0aGUgc3BlY3RydW0gbWFuYWdlbWVudCBpZiB0aGlzIGlzIGEgREZTIGNoYW5uZWwgKi8KKwkJaWYgKHNlc3Npb24tPmNvdW50cnlfaW5mb19wcmVzZW50ICYmCisJCQlsaW1faXNjb25uZWN0ZWRfb25fZGZzX2NoYW5uZWwoCisJCQkJCXNlc3Npb24tPmN1cnJlbnRPcGVyQ2hhbm5lbCkpCisJCQlzZXNzaW9uLT5zcGVjdHJ1bU1ndEVuYWJsZWQgPSB0cnVlOworCisJCXNlc3Npb24tPmlzT1NFTkNvbm5lY3Rpb24gPSBzbWVfam9pbl9yZXEtPmlzT1NFTkNvbm5lY3Rpb247CisKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIlNlc3Npb25JZDolZCBNTE1fSk9JTl9SRVEgaXMgcG9zdGVkIHRvIE1MTSBTTSIpLAorCQkJbWxtX2pvaW5fcmVxLT5zZXNzaW9uSWQpOworCQkvKiBJc3N1ZSBMSU1fTUxNX0pPSU5fUkVRIHRvIE1MTSAqLworCQlsaW1fcG9zdF9tbG1fbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX0pPSU5fUkVRLAorCQkJCSAgICAgKHVpbnQzMl90ICopIG1sbV9qb2luX3JlcSk7CisJCXJldHVybjsKKworCX0gZWxzZSB7CisJCS8qIFJlY2VpdmVkIGVXTklfU01FX0pPSU5fUkVRIHVuIGV4cGVjdGVkIHN0YXRlICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFNNRV9KT0lOX1JFUSBpbiBzdGF0ZSAlWCIpLAorCQkJbWFjX2N0eC0+bGltLmdMaW1TbWVTdGF0ZSk7CisJCWxpbV9wcmludF9zbWVfc3RhdGUobWFjX2N0eCwgTE9HRSwgbWFjX2N0eC0+bGltLmdMaW1TbWVTdGF0ZSk7CisJCXJldF9jb2RlID0gZVNJUl9TTUVfVU5FWFBFQ1RFRF9SRVFfUkVTVUxUX0NPREU7CisJCXNlc3Npb24gPSBOVUxMOworCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoKKwlzbWVfc2Vzc2lvbl9pZCA9IHNtZV9qb2luX3JlcS0+c2Vzc2lvbklkOworCXNtZV90cmFuc2FjdGlvbl9pZCA9IHNtZV9qb2luX3JlcS0+dHJhbnNhY3Rpb25JZDsKKworCWlmIChzbWVfam9pbl9yZXEpIHsKKwkJY2RmX21lbV9mcmVlKHNtZV9qb2luX3JlcSk7CisJCXNtZV9qb2luX3JlcSA9IE5VTEw7CisJCWlmIChOVUxMICE9IHNlc3Npb24pCisJCQlzZXNzaW9uLT5wTGltSm9pblJlcSA9IE5VTEw7CisJfQorCWlmIChyZXRfY29kZSAhPSBlU0lSX1NNRV9TVUNDRVNTKSB7CisJCWlmIChOVUxMICE9IHNlc3Npb24pIHsKKwkJCXBlX2RlbGV0ZV9zZXNzaW9uKG1hY19jdHgsIHNlc3Npb24pOworCQkJc2Vzc2lvbiA9IE5VTEw7CisJCX0KKwl9CisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgiU2VuZCBmYWlsdXJlIHN0YXR1cyBvbiBzZXNzaW9uaWQ6ICVkIHdpdGggcmV0X2NvZGUgPSAlZCIpLAorCQlzbWVfc2Vzc2lvbl9pZCwgcmV0X2NvZGUpOworCWxpbV9zZW5kX3NtZV9qb2luX3JlYXNzb2NfcnNwKG1hY19jdHgsIGVXTklfU01FX0pPSU5fUlNQLCByZXRfY29kZSwKKwkJZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLCBzZXNzaW9uLCBzbWVfc2Vzc2lvbl9pZCwKKwkJc21lX3RyYW5zYWN0aW9uX2lkKTsKK30KKworI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0VTRSB8fCBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKK3VpbnQ4X3QgbGltX2dldF9tYXhfdHhfcG93ZXIodFBvd2VyZEJtIHJlZ01heCwgdFBvd2VyZEJtIGFwVHhQb3dlciwKKwkJCSAgICAgdWludDhfdCBpbmlUeFBvd2VyKQoreworCXVpbnQ4X3QgbWF4VHhQb3dlciA9IDA7CisJdWludDhfdCB0eFBvd2VyID0gQ0RGX01JTihyZWdNYXgsIChhcFR4UG93ZXIpKTsKKwl0eFBvd2VyID0gQ0RGX01JTih0eFBvd2VyLCBpbmlUeFBvd2VyKTsKKwlpZiAoKHR4UG93ZXIgPj0gTUlOX1RYX1BXUl9DQVApICYmICh0eFBvd2VyIDw9IE1BWF9UWF9QV1JfQ0FQKSkKKwkJbWF4VHhQb3dlciA9IHR4UG93ZXI7CisJZWxzZSBpZiAodHhQb3dlciA8IE1JTl9UWF9QV1JfQ0FQKQorCQltYXhUeFBvd2VyID0gTUlOX1RYX1BXUl9DQVA7CisJZWxzZQorCQltYXhUeFBvd2VyID0gTUFYX1RYX1BXUl9DQVA7CisKKwlyZXR1cm4gbWF4VHhQb3dlcjsKK30KKyNlbmRpZgorCisvKioKKyAqIF9fbGltX3Byb2Nlc3Nfc21lX3JlYXNzb2NfcmVxKCkgLSBwcm9jZXNzIHJlYXNzb2MgcmVxCisgKgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2dfYnVmOiBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIFNNRV9SRUFTU09DX1JFUSBtZXNzYWdlCisgKiBmcm9tIEhERCBvciB1cHBlciBsYXllciBhcHBsaWNhdGlvbi4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9yZWFzc29jX3JlcSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50MzJfdCAqbXNnX2J1ZikKK3sKKwl1aW50MTZfdCBjYXBzOworCXVpbnQzMl90IHZhbDsKKwl0cFNpclNtZUpvaW5SZXEgcmVhc3NvY19yZXEgPSBOVUxMOworCXRMaW1NbG1SZWFzc29jUmVxICptbG1fcmVhc3NvY19yZXE7CisJdFNpclJlc3VsdENvZGVzIHJldF9jb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5ID0gTlVMTDsKKwl1aW50OF90IHNlc3Npb25faWQ7CisJdWludDhfdCBzbWVfc2Vzc2lvbl9pZDsKKwl1aW50MTZfdCB0cmFuc2FjdGlvbl9pZDsKKwl0UG93ZXJkQm0gbG9jYWxfcHdyX2NvbnN0cmFpbnQgPSAwLCByZWdfbWF4ID0gMDsKKwl1aW50MzJfdCB0ZWxlX2Jjbl9lbiA9IDA7CisJdWludDE2X3Qgc2l6ZTsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMywgRkwoIlJlY2VpdmVkIFJFQVNTT0NfUkVRIikpOworCisJc2l6ZSA9IF9fbGltX2dldF9zbWVfam9pbl9yZXFfc2l6ZV9mb3JfYWxsb2MoKHVpbnQ4X3QgKiltc2dfYnVmKTsKKwlyZWFzc29jX3JlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemUpOworCWlmIChOVUxMID09IHJlYXNzb2NfcmVxKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJjYWxsIHRvIEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcmVhc3NvY19yZXEiKSk7CisKKwkJcmV0X2NvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJCWdvdG8gZW5kOworCX0KKwkodm9pZCljZGZfbWVtX3NldCgodm9pZCAqKXJlYXNzb2NfcmVxLCBzaXplLCAwKTsKKwkodm9pZCljZGZfbWVtX2NvcHkoKHZvaWQgKilyZWFzc29jX3JlcSwgKHZvaWQgKiltc2dfYnVmLCBzaXplKTsKKworCWlmICghbGltX2lzX3NtZV9qb2luX3JlcV92YWxpZChtYWNfY3R4LAorCQkJCSh0cFNpclNtZUpvaW5SZXEpcmVhc3NvY19yZXEpKSB7CisJCS8qCisJCSAqIFJlY2VpdmVkIGludmFsaWQgZVdOSV9TTUVfUkVBU1NPQ19SRVEKKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJyZWNlaXZlZCBTTUVfUkVBU1NPQ19SRVEgd2l0aCBpbnZhbGlkIGRhdGEiKSk7CisKKwkJcmV0X2NvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCWdvdG8gZW5kOworCX0KKworCXNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQobWFjX2N0eCwKKwkJCXJlYXNzb2NfcmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwKKwkJCSZzZXNzaW9uX2lkKTsKKwlpZiAoc2Vzc2lvbl9lbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCByZWFzc29jX3JlcS0+YnNzRGVzY3JpcHRpb24uYnNzSWQsCisJCQkJTE9HRSk7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZCIpKTsKKwkJcmV0X2NvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCWdvdG8gZW5kOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwlsaW1fZGlhZ19ldmVudF9yZXBvcnQobWFjX2N0eCwgV0xBTl9QRV9ESUFHX1JFQVNTT0NfUkVRX0VWRU5ULAorCQkJc2Vzc2lvbl9lbnRyeSwgZVNJUl9TVUNDRVNTLCBlU0lSX1NVQ0NFU1MpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwkvKiBtYWNfY3R4LT5saW0uZ3BMaW1SZWFzc29jUmVxID0gcmVhc3NvY19yZXE7Ly9UTyBTVVBQT1JUIEJULUFNUCAqLworCisJLyogU3RvcmUgdGhlIHJlYXNzb2MgaGFuZGxlIGluIHRoZSBzZXNzaW9uIFRhYmxlICovCisJc2Vzc2lvbl9lbnRyeS0+cExpbVJlQXNzb2NSZXEgPSByZWFzc29jX3JlcTsKKworCXNlc3Npb25fZW50cnktPmRvdDExbW9kZSA9IHJlYXNzb2NfcmVxLT5kb3QxMW1vZGU7CisJc2Vzc2lvbl9lbnRyeS0+dmh0Q2FwYWJpbGl0eSA9CisJCUlTX0RPVDExX01PREVfVkhUKHJlYXNzb2NfcmVxLT5kb3QxMW1vZGUpOworCS8qCisJICogUmVhc3NvY2lhdGUgcmVxdWVzdCBpcyBleHBlY3RlZAorCSAqIGluIGxpbmsgZXN0YWJsaXNoZWQgc3RhdGUgb25seS4KKwkgKi8KKworCWlmIChzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURSkgeworI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgXAorCQlkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJCWlmIChzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFKSB7CisJCQkvKgorCQkJICogTWF5IGJlIGZyb20gMTFyIEZUIHByZS1hdXRoLiBTbyBsZXRzIGNoZWNrIGl0CisJCQkgKiBiZWZvcmUgd2UgYmFpbCBvdXQKKwkJCSAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgKKwkJCQkJIlNlc3Npb24gaW4gcmVhc3NvYyBzdGF0ZSBpcyAlZCIpLAorCQkJCQlzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCk7CisKKwkJCS8qIE1ha2Ugc3VyZSBpdHMgb3VyIHByZWF1dGggYnNzaWQgKi8KKwkJCWlmICghY2RmX21lbV9jb21wYXJlKHJlYXNzb2NfcmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwKKwkJCQkJICAgICBzZXNzaW9uX2VudHJ5LT5saW1SZUFzc29jYnNzSWQsCisJCQkJCSAgICAgNikpIHsKKwkJCQlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwKKwkJCQkJCSAgIHJlYXNzb2NfcmVxLT5ic3NEZXNjcmlwdGlvbi4KKwkJCQkJCSAgIGJzc0lkLCBMT0dFKTsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJCUZMKCJVbmtub3duIGJzc0lkIGluIHJlYXNzb2Mgc3RhdGUiKSk7CisJCQkJcmV0X2NvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCQkJZ290byBlbmQ7CisJCQl9CisKKwkJCWxpbV9wcm9jZXNzX21sbV9mdF9yZWFzc29jX3JlcShtYWNfY3R4LCBtc2dfYnVmLAorCQkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmCisJCS8qCisJCSAqIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBlV05JX1NNRV9SRUFTU09DX1JFUQorCQkgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgU01FX1JFQVNTT0NfUkVRIGluIHN0YXRlICVYIiksCisJCQlzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSk7CisJCWxpbV9wcmludF9zbWVfc3RhdGUobWFjX2N0eCwgTE9HRSwgc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpOworCisJCXJldF9jb2RlID0gZVNJUl9TTUVfVU5FWFBFQ1RFRF9SRVFfUkVTVUxUX0NPREU7CisJCWdvdG8gZW5kOworCX0KKworCWNkZl9tZW1fY29weShzZXNzaW9uX2VudHJ5LT5saW1SZUFzc29jYnNzSWQsCisJCSAgICAgc2Vzc2lvbl9lbnRyeS0+cExpbVJlQXNzb2NSZXEtPmJzc0Rlc2NyaXB0aW9uLmJzc0lkLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJc2Vzc2lvbl9lbnRyeS0+bGltUmVhc3NvY0NoYW5uZWxJZCA9CisJCXNlc3Npb25fZW50cnktPnBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbi5jaGFubmVsSWQ7CisKKwlzZXNzaW9uX2VudHJ5LT5yZUFzc29jSHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkoc2Vzc2lvbl9lbnRyeS0+cExpbVJlQXNzb2NSZXEtPmNiTW9kZSkgPyAxIDogMDsKKwlzZXNzaW9uX2VudHJ5LT5yZUFzc29jSHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPQorCQlzZXNzaW9uX2VudHJ5LT5yZUFzc29jSHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJc2Vzc2lvbl9lbnRyeS0+cmVBc3NvY0h0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9CisJCXNlc3Npb25fZW50cnktPnBMaW1SZUFzc29jUmVxLT5jYk1vZGU7CisKKwlzZXNzaW9uX2VudHJ5LT5saW1SZWFzc29jQnNzQ2FwcyA9CisJCXNlc3Npb25fZW50cnktPnBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbi5jYXBhYmlsaXR5SW5mbzsKKwlyZWdfbWF4ID0gY2ZnX2dldF9yZWd1bGF0b3J5X21heF90cmFuc21pdF9wb3dlcihtYWNfY3R4LAorCQkJc2Vzc2lvbl9lbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKTsKKwlsb2NhbF9wd3JfY29uc3RyYWludCA9IHJlZ19tYXg7CisKKwlsaW1fZXh0cmFjdF9hcF9jYXBhYmlsaXR5KG1hY19jdHgsCisJCSh1aW50OF90ICopc2Vzc2lvbl9lbnRyeS0+cExpbVJlQXNzb2NSZXEtPmJzc0Rlc2NyaXB0aW9uLmllRmllbGRzLAorCQlsaW1fZ2V0X2llbGVuX2Zyb21fYnNzX2Rlc2NyaXB0aW9uKAorCQkJJnNlc3Npb25fZW50cnktPnBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbiksCisJCSZzZXNzaW9uX2VudHJ5LT5saW1SZWFzc29jQnNzUW9zQ2FwcywKKwkJJnNlc3Npb25fZW50cnktPmxpbVJlYXNzb2NCc3NQcm9wQ2FwLAorCQkmc2Vzc2lvbl9lbnRyeS0+Z0xpbUN1cnJlbnRCc3NVYXBzZCwKKwkJJmxvY2FsX3B3cl9jb25zdHJhaW50LCBzZXNzaW9uX2VudHJ5KTsKKwlzZXNzaW9uX2VudHJ5LT5tYXhUeFBvd2VyID0gQ0RGX01JTihyZWdfbWF4LCAobG9jYWxfcHdyX2NvbnN0cmFpbnQpKTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkiUmVndWxhdG9yeSBtYXggPSAlZCwgbG9jYWwgcHdyIGNvbnN0cmFpbnQgPSAlZCwgbWF4IHR4ID0gJWQiLAorCQlyZWdfbWF4LCBsb2NhbF9wd3JfY29uc3RyYWludCwKKwkJc2Vzc2lvbl9lbnRyeS0+bWF4VHhQb3dlcik7CisjZW5kaWYKKwkvKiBDb3B5IHRoZSBTU0lEIGZyb20gc2Vzc2lvbiBlbnRyeSB0byBsb2NhbCB2YXJpYWJsZSAqLworCXNlc3Npb25fZW50cnktPmxpbVJlYXNzb2NTU0lELmxlbmd0aCA9IHJlYXNzb2NfcmVxLT5zc0lkLmxlbmd0aDsKKwljZGZfbWVtX2NvcHkoc2Vzc2lvbl9lbnRyeS0+bGltUmVhc3NvY1NTSUQuc3NJZCwKKwkJICAgICByZWFzc29jX3JlcS0+c3NJZC5zc0lkLAorCQkgICAgIHNlc3Npb25fZW50cnktPmxpbVJlYXNzb2NTU0lELmxlbmd0aCk7CisJaWYgKHNlc3Npb25fZW50cnktPmdMaW1DdXJyZW50QnNzVWFwc2QpIHsKKwkJc2Vzc2lvbl9lbnRyeS0+Z1VhcHNkUGVyQWNCaXRtYXNrID0KKwkJCXNlc3Npb25fZW50cnktPnBMaW1SZUFzc29jUmVxLT51YXBzZFBlckFjQml0bWFzazsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIlVBUFNEIGZsYWcgZm9yIGFsbCBBQyAtIDB4JTJ4IiksCisJCQlzZXNzaW9uX2VudHJ5LT5nVWFwc2RQZXJBY0JpdG1hc2spOworCX0KKworCW1sbV9yZWFzc29jX3JlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0TGltTWxtUmVhc3NvY1JlcSkpOworCWlmIChOVUxMID09IG1sbV9yZWFzc29jX3JlcSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiY2FsbCB0byBBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIG1sbVJlYXNzb2NSZXEiKSk7CisKKwkJcmV0X2NvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJCWdvdG8gZW5kOworCX0KKworCWNkZl9tZW1fY29weShtbG1fcmVhc3NvY19yZXEtPnBlZXJNYWNBZGRyLAorCQkgICAgIHNlc3Npb25fZW50cnktPmxpbVJlQXNzb2Nic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHX1JFQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VULAorCQkJKHVpbnQzMl90ICopJm1sbV9yZWFzc29jX3JlcS0+cmVhc3NvY0ZhaWx1cmVUaW1lb3V0KSAhPQorCQkJZVNJUl9TVUNDRVNTKSB7CisJCS8qCisJCSAqIENvdWxkIG5vdCBnZXQgUmVhc3NvY0ZhaWx1cmVUaW1lb3V0IHZhbHVlCisJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCSAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIFJlYXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZSIpKTsKKwl9CisKKwlpZiAoY2ZnX2dldF9jYXBhYmlsaXR5X2luZm8obWFjX2N0eCwgJmNhcHMsIHNlc3Npb25fZW50cnkpICE9CisJCQllU0lSX1NVQ0NFU1MpIHsKKwkJLyoKKwkJICogQ291bGQgbm90IGdldCBDYXBhYmlsaXRpZXMgdmFsdWUKKwkJICogZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoCisJCQkJImNvdWxkIG5vdCByZXRyaWV2ZSBDYXBhYmlsaXRpZXMgdmFsdWUiKSk7CisJfQorCW1sbV9yZWFzc29jX3JlcS0+Y2FwYWJpbGl0eUluZm8gPSBjYXBzOworCisJLyogVXBkYXRlIFBFIHNlc3Npb25faWQgKi8KKwltbG1fcmVhc3NvY19yZXEtPnNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisKKwkvKgorCSAqIElmIHRlbGVzY29waWMgYmVhY29uaW5nIGlzIGVuYWJsZWQsIHNldCBsaXN0ZW4gaW50ZXJ2YWwgdG8KKwkgKiBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSQorCSAqLworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOLAorCQkJCSZ0ZWxlX2Jjbl9lbikgIT0gZVNJUl9TVUNDRVNTKQorCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiQ291bGRuJ3QgZ2V0IFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOIikpOworCisJdmFsID0gV05JX0NGR19MSVNURU5fSU5URVJWQUxfU1RBREVGOworCisJaWYgKHRlbGVfYmNuX2VuKSB7CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJLCAmdmFsKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKQorCQkJLyoKKwkJCSAqIENvdWxkIG5vdCBnZXQgTGlzdGVuSW50ZXJ2YWwgdmFsdWUKKwkJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIExpc3RlbkludGVydmFsIikpOworCX0gZWxzZSB7CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMLCAmdmFsKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKQorCQkJLyoKKwkJCSAqIENvdWxkIG5vdCBnZXQgTGlzdGVuSW50ZXJ2YWwgdmFsdWUKKwkJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIExpc3RlbkludGVydmFsIikpOworCX0KKworCW1sbV9yZWFzc29jX3JlcS0+bGlzdGVuSW50ZXJ2YWwgPSAodWludDE2X3QpIHZhbDsKKworCS8qIEluZGljYXRlIHdoZXRoZXIgc3BlY3RydW0gbWFuYWdlbWVudCBpcyBlbmFibGVkICovCisJc2Vzc2lvbl9lbnRyeS0+c3BlY3RydW1NZ3RFbmFibGVkID0gcmVhc3NvY19yZXEtPnNwZWN0cnVtTWd0SW5kaWNhdG9yOworCisJLyogRW5hYmxlIHRoZSBzcGVjdHJ1bSBtYW5hZ2VtZW50IGlmIHRoaXMgaXMgYSBERlMgY2hhbm5lbCAqLworCWlmIChzZXNzaW9uX2VudHJ5LT5jb3VudHJ5X2luZm9fcHJlc2VudCAmJgorCQlsaW1faXNjb25uZWN0ZWRfb25fZGZzX2NoYW5uZWwoCisJCQkJc2Vzc2lvbl9lbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKwkJc2Vzc2lvbl9lbnRyeS0+c3BlY3RydW1NZ3RFbmFibGVkID0gdHJ1ZTsKKworCXNlc3Npb25fZW50cnktPmxpbVByZXZTbWVTdGF0ZSA9IHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlOworCXNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURTsKKworCU1UUkFDRShtYWNfdHJhY2UobWFjX2N0eCwgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsCisJCQkJc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpKTsKKworCWxpbV9wb3N0X21sbV9tZXNzYWdlKG1hY19jdHgsCisJCQkgICAgIExJTV9NTE1fUkVBU1NPQ19SRVEsICh1aW50MzJfdCAqKW1sbV9yZWFzc29jX3JlcSk7CisJcmV0dXJuOworZW5kOgorCWlmIChyZWFzc29jX3JlcSkgeworCQljZGZfbWVtX2ZyZWUocmVhc3NvY19yZXEpOworCQlpZiAoc2Vzc2lvbl9lbnRyeSkKKwkJCXNlc3Npb25fZW50cnktPnBMaW1SZUFzc29jUmVxID0gTlVMTDsKKwl9CisKKwlpZiAoc2Vzc2lvbl9lbnRyeSkgeworCQkvKgorCQkgKiBlcnJvciBvY2N1cnJlZCBhZnRlciB3ZSBkZXRlcm1pbmVkIHRoZSBzZXNzaW9uIHNvIGV4dHJhY3QKKwkJICogc2Vzc2lvbiBhbmQgdHJhbnNhY3Rpb24gaW5mbyBmcm9tIHRoZXJlCisJCSAqLworCQlzbWVfc2Vzc2lvbl9pZCA9IHNlc3Npb25fZW50cnktPnNtZVNlc3Npb25JZDsKKwkJdHJhbnNhY3Rpb25faWQgPSBzZXNzaW9uX2VudHJ5LT50cmFuc2FjdGlvbklkOworCX0gZWxzZQorCQkvKgorCQkgKiBlcnJvciBvY2N1cnJlZCBiZWZvcmUgb3IgZHVyaW5nIHRoZSB0aW1lIHdlIGRldGVybWluZWQKKwkJICogdGhlIHNlc3Npb24gc28gZXh0cmFjdCB0aGUgc2Vzc2lvbiBhbmQgdHJhbnNhY3Rpb24gaW5mbworCQkgKiBmcm9tIHRoZSBtZXNzYWdlCisJCSAqLworCQlsaW1fZ2V0X3Nlc3Npb25faW5mbyhtYWNfY3R4LCAodWludDhfdCAqKSBtc2dfYnVmLAorCQkJCSZzbWVfc2Vzc2lvbl9pZCwgJnRyYW5zYWN0aW9uX2lkKTsKKworCS8qCisJICogU2VuZCBSZWFzc29jIGZhaWx1cmUgcmVzcG9uc2UgdG8gaG9zdAorCSAqIChub3RlIHNlc3Npb25fZW50cnkgbWF5IGJlIE5VTEwsIGJ1dCB0aGF0J3MgT0spCisJICovCisJbGltX3NlbmRfc21lX2pvaW5fcmVhc3NvY19yc3AobWFjX2N0eCwgZVdOSV9TTUVfUkVBU1NPQ19SU1AsCisJCQkJICAgICAgcmV0X2NvZGUsIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywKKwkJCQkgICAgICBzZXNzaW9uX2VudHJ5LCBzbWVfc2Vzc2lvbl9pZCwKKwkJCQkgICAgICB0cmFuc2FjdGlvbl9pZCk7Cit9CisKK2Jvb2wgc2VuZF9kaXNhc3NvY19mcmFtZSA9IDE7CisvKioKKyAqIF9fbGltX3Byb2Nlc3Nfc21lX2Rpc2Fzc29jX3JlcSgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBTTUVfRElTQVNTT0NfUkVRIG1lc3NhZ2UKKyAqIGZyb20gSEREIG9yIHVwcGVyIGxheWVyIGFwcGxpY2F0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkIF9fbGltX3Byb2Nlc3Nfc21lX2Rpc2Fzc29jX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwl1aW50MTZfdCBkaXNhc3NvY1RyaWdnZXIsIHJlYXNvbkNvZGU7CisJdExpbU1sbURpc2Fzc29jUmVxICpwTWxtRGlzYXNzb2NSZXE7CisJdFNpclJlc3VsdENvZGVzIHJldENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCXRTaXJTbWVEaXNhc3NvY1JlcSBzbWVEaXNhc3NvY1JlcTsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IHNtZXNlc3Npb25JZDsKKwl1aW50MTZfdCBzbWV0cmFuc2FjdGlvbklkOworCisJaWYgKHBNc2dCdWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWNkZl9tZW1fY29weSgmc21lRGlzYXNzb2NSZXEsIHBNc2dCdWYsIHNpemVvZih0U2lyU21lRGlzYXNzb2NSZXEpKTsKKwlzbWVzZXNzaW9uSWQgPSBzbWVEaXNhc3NvY1JlcS5zZXNzaW9uSWQ7CisJc21ldHJhbnNhY3Rpb25JZCA9IHNtZURpc2Fzc29jUmVxLnRyYW5zYWN0aW9uSWQ7CisJaWYgKCFsaW1faXNfc21lX2Rpc2Fzc29jX3JlcV92YWxpZChwTWFjLAorCQkJCQkgICAmc21lRGlzYXNzb2NSZXEsCisJCQkJCSAgIHBzZXNzaW9uRW50cnkpKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCSAgICAgICBGTCgicmVjZWl2ZWQgaW52YWxpZCBTTUVfRElTQVNTT0NfUkVRIG1lc3NhZ2UiKSk7KQorCQlpZiAocE1hYy0+bGltLmdMaW1Sc3BSZXFkKSB7CisJCQlwTWFjLT5saW0uZ0xpbVJzcFJlcWQgPSBmYWxzZTsKKworCQkJcmV0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKwkJCWRpc2Fzc29jVHJpZ2dlciA9IGVMSU1fSE9TVF9ESVNBU1NPQzsKKwkJCWdvdG8gc2VuZERpc2Fzc29jOworCQl9CisKKwkJcmV0dXJuOworCX0KKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywKKwkJCQlzbWVEaXNhc3NvY1JlcS5ic3NJZCwKKwkJCQkmc2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZCAiCisJCQkgICBNQUNfQUREUkVTU19TVFIpLAorCQkJTUFDX0FERFJfQVJSQVkoc21lRGlzYXNzb2NSZXEuYnNzSWQpKTsKKwkJcmV0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKwkJZGlzYXNzb2NUcmlnZ2VyID0gZUxJTV9IT1NUX0RJU0FTU09DOworCQlnb3RvIHNlbmREaXNhc3NvYzsKKwl9CisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgicmVjZWl2ZWQgRElTQVNTT0NfUkVRIG1lc3NhZ2Ugb24gc2Vzc2lvbmlkICVkIFN5c3RlbXJvbGUgJWQgUmVhc29uOiAldSBTbWVTdGF0ZTogJWQgZnJvbTogIgorCQkJTUFDX0FERFJFU1NfU1RSKSwgc21lc2Vzc2lvbklkLAorCQlHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpLCBzbWVEaXNhc3NvY1JlcS5yZWFzb25Db2RlLAorCQlwTWFjLT5saW0uZ0xpbVNtZVN0YXRlLAorCQlNQUNfQUREUl9BUlJBWShzbWVEaXNhc3NvY1JlcS5wZWVyTWFjQWRkcikpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfRElTQVNTT0NfUkVRX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LAorCQkJICAgICAgMCwgc21lRGlzYXNzb2NSZXEucmVhc29uQ29kZSk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJLyogVXBkYXRlIFNNRSBzZXNzaW9uIElkIGFuZCBTTUUgdHJhbnNhY3Rpb24gSUQgKi8KKworCXBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCA9IHNtZXNlc3Npb25JZDsKKwlwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkID0gc21ldHJhbnNhY3Rpb25JZDsKKworCXN3aXRjaCAoR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCWNhc2UgZUxJTV9TVEFfUk9MRToKKwljYXNlIGVMSU1fQlRfQU1QX1NUQV9ST0xFOgorCQlzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSB7CisJCWNhc2UgZUxJTV9TTUVfQVNTT0NJQVRFRF9TVEFURToKKwkJY2FzZSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURToKKwkJCXBzZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZSA9CisJCQkJcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGU7CisJCQlwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJCQkvKiBEZWxldGUgYWxsIFRETFMgcGVlcnMgY29ubmVjdGVkIGJlZm9yZSBsZWF2aW5nIEJTUyAqLworCQkJbGltX2RlbGV0ZV90ZGxzX3BlZXJzKHBNYWMsIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisJCQlNVFJBQ0UobWFjX3RyYWNlCisJCQkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSk7CisJCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJRkwoIlJjdmQgU01FX0RJU0FTU09DX1JFUSB3aGlsZSBpbiBsaW1TbWVTdGF0ZTogJWQgIiksCisJCQkJcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBlTElNX1NNRV9XVF9ERUFVVEhfU1RBVEU6CisJCQkvKiBQRSBzaGFsbCBzdGlsbCBwcm9jZXNzIHRoZSBESVNBU1NPQ19SRVEgYW5kIHByb2NlZWQgd2l0aAorCQkJICogbGluayB0ZWFyIGRvd24gZXZlbiBpZiBpdCBoYWQgYWxyZWFkeSBzZW50IGEgREVBVVRIX0lORCB0bworCQkJICogdG8gU01FLiBwTWFjLT5saW0uZ0xpbVByZXZTbWVTdGF0ZSBzaGFsbCByZW1haW4gdGhlIHNhbWUgYXMKKwkJCSAqIGl0cyBiZWVuIHNldCB3aGVuIFBFIGVudGVyZWQgV1RfREVBVVRIX1NUQVRFLgorCQkJICovCisJCQlwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFOworCQkJTVRSQUNFKG1hY190cmFjZQorCQkJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsCisJCQkJICAgICAgIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSkpOworCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMKCJSY3ZkIFNNRV9ESVNBU1NPQ19SRVEgd2hpbGUgaW4gU01FX1dUX0RFQVVUSF9TVEFURS4gIikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBlTElNX1NNRV9XVF9ESVNBU1NPQ19TVEFURToKKwkJCS8qIFBFIFJlY2lldmVkIGEgRGlzYXNzb2MgZnJhbWUuIE5vcm1hbGx5IGl0IGdldHMgRElTQVNTT0NfQ05GIGJ1dCBpdAorCQkJICogcmVjZWl2ZWQgRElTQVNTT0NfUkVRLiBXaGljaCBtZWFucyBob3N0IGlzIGFsc28gdHJ5aW5nIHRvIGRpc2Nvbm5lY3QuCisJCQkgKiBQRSBjYW4gY29udGludWUgcHJvY2Vzc2luZyBESVNBU1NPQ19SRVEgYW5kIHNlbmQgdGhlIHJlc3BvbnNlIGluc3RlYWQKKwkJCSAqIG9mIGZhaWxpbmcgdGhlIHJlcXVlc3QuIFNNRSB3aWxsIGFueXdheSBpZ25vcmUgREVBVVRIX0lORCB0aGF0IHdhcyBzZW50CisJCQkgKiBmb3IgZGlzYXNzb2MgZnJhbWUuCisJCQkgKgorCQkJICogSXQgd2lsbCBzZW5kIGEgZGlzYXNzb2MsIHdoaWNoIGlzIG9rLiBIb3dldmVyLCB3ZSBjYW4gdXNlIHRoZSBnbG9iYWwgZmxhZworCQkJICogc2VuZERpc2Fzc29jIHRvIG5vdCBzZW5kIGRpc2Fzc29jIGZyYW1lLgorCQkJICovCisJCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJRkwoIlJjdmQgU01FX0RJU0FTU09DX1JFUSB3aGlsZSBpbiBTTUVfV1RfRElTQVNTT0NfU1RBVEUuICIpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOiB7CisJCQkvKiBBbHJlYWR5IGluIERpc2Nvbm5lY3RlZCBTdGF0ZSwgcmV0dXJuIHN1Y2Nlc3MgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCQlGTCgiUmN2ZCBTTUVfRElTQVNTT0NfUkVRIHdoaWxlIGluIGVMSU1fU01FX0pPSU5fRkFJTFVSRV9TVEFURS4gIikpOworCQkJaWYgKHBNYWMtPmxpbS5nTGltUnNwUmVxZCkgeworCQkJCXJldENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCQkJCWRpc2Fzc29jVHJpZ2dlciA9IGVMSU1fSE9TVF9ESVNBU1NPQzsKKwkJCQlnb3RvIHNlbmREaXNhc3NvYzsKKwkJCX0KKwkJfQorCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qKgorCQkJICogU1RBIGlzIG5vdCBjdXJyZW50bHkgYXNzb2NpYXRlZC4KKwkJCSAqIExvZyBlcnJvciBhbmQgc2VuZCByZXNwb25zZSB0byBob3N0CisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBTTUVfRElTQVNTT0NfUkVRIGluIHN0YXRlICVYIiksCisJCQkJcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworCQkJbGltX3ByaW50X3NtZV9zdGF0ZShwTWFjLCBMT0dFLAorCQkJCXBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTsKKworCQkJaWYgKHBNYWMtPmxpbS5nTGltUnNwUmVxZCkgeworCQkJCWlmIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPQorCQkJCSAgICBlTElNX1NNRV9XVF9BU1NPQ19TVEFURSkKKwkJCQkJcE1hYy0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisKKwkJCQlyZXRDb2RlID0gZVNJUl9TTUVfVU5FWFBFQ1RFRF9SRVFfUkVTVUxUX0NPREU7CisJCQkJZGlzYXNzb2NUcmlnZ2VyID0gZUxJTV9IT1NUX0RJU0FTU09DOworCQkJCWdvdG8gc2VuZERpc2Fzc29jOworCQkJfQorCisJCQlyZXR1cm47CisJCX0KKworCQlicmVhazsKKworCWNhc2UgZUxJTV9BUF9ST0xFOgorCWNhc2UgZUxJTV9CVF9BTVBfQVBfUk9MRToKKwkJLyogRmFsbCB0aHJvdWdoICovCisJCWJyZWFrOworCisJY2FzZSBlTElNX1NUQV9JTl9JQlNTX1JPTEU6CisJZGVmYXVsdDoKKwkJLyogZUxJTV9VTktOT1dOX1JPTEUgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgU01FX0RJU0FTU09DX1JFUSBmb3Igcm9sZSAlZCIpLAorCQkJR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSk7CisKKwkJcmV0Q29kZSA9IGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFOworCQlkaXNhc3NvY1RyaWdnZXIgPSBlTElNX0hPU1RfRElTQVNTT0M7CisJCWdvdG8gc2VuZERpc2Fzc29jOworCX0gLyogZW5kIHN3aXRjaCAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlKSAqLworCisJaWYgKHNtZURpc2Fzc29jUmVxLnJlYXNvbkNvZGUgPT0gZUxJTV9MSU5LX01PTklUT1JJTkdfRElTQVNTT0MpIHsKKwkJLyogLyBEaXNhc3NvY2lhdGlvbiBpcyB0cmlnZ2VyZWQgYnkgTGluayBNb25pdG9yaW5nICovCisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCUZMKCJTZW5kaW5nIERpc2Fzc2NvYyB3aXRoIHJlYXNvbiBMaW5rIE1vbml0b3JpbmciKSk7CisJCWRpc2Fzc29jVHJpZ2dlciA9IGVMSU1fTElOS19NT05JVE9SSU5HX0RJU0FTU09DOworCQlyZWFzb25Db2RlID0gZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFlfUkVBU09OOworCX0gZWxzZSB7CisJCWRpc2Fzc29jVHJpZ2dlciA9IGVMSU1fSE9TVF9ESVNBU1NPQzsKKwkJcmVhc29uQ29kZSA9IHNtZURpc2Fzc29jUmVxLnJlYXNvbkNvZGU7CisJfQorCisJaWYgKHNtZURpc2Fzc29jUmVxLmRvTm90U2VuZE92ZXJUaGVBaXIpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiZG8gbm90IHNlbmQgZGlzc29jIG92ZXIgdGhlIGFpciIpKTsKKwkJc2VuZF9kaXNhc3NvY19mcmFtZSA9IDA7CisJfQorCS8qIFRyaWdnZXIgRGlzYXNzb2NpYXRpb24gZnJhbWUgdG8gcGVlciBNQUMgZW50aXR5ICovCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBEaXNhc3Njb2Mgd2l0aCBkaXNhc3NvYyBUcmlnZ2VyIgorCQkJCSIgOiAlZCwgcmVhc29uQ29kZSA6ICVkIiksCisJCQlkaXNhc3NvY1RyaWdnZXIsIHJlYXNvbkNvZGUpOworCisJcE1sbURpc2Fzc29jUmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRMaW1NbG1EaXNhc3NvY1JlcSkpOworCWlmIChOVUxMID09IHBNbG1EaXNhc3NvY1JlcSkgeworCQkvKiBMb2cgZXJyb3IgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNhbGwgdG8gQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1EaXNhc3NvY1JlcSIpKTsKKworCQlyZXR1cm47CisJfQorCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwTWxtRGlzYXNzb2NSZXEtPnBlZXJNYWNBZGRyLAorCQkgICAgICh1aW50OF90ICopICZzbWVEaXNhc3NvY1JlcS5wZWVyTWFjQWRkciwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCXBNbG1EaXNhc3NvY1JlcS0+cmVhc29uQ29kZSA9IHJlYXNvbkNvZGU7CisJcE1sbURpc2Fzc29jUmVxLT5kaXNhc3NvY1RyaWdnZXIgPSBkaXNhc3NvY1RyaWdnZXI7CisKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJRCAqLworCXBNbG1EaXNhc3NvY1JlcS0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCisJbGltX3Bvc3RfbWxtX21lc3NhZ2UocE1hYywKKwkJCSAgICAgTElNX01MTV9ESVNBU1NPQ19SRVEsICh1aW50MzJfdCAqKSBwTWxtRGlzYXNzb2NSZXEpOworCXJldHVybjsKKworc2VuZERpc2Fzc29jOgorCWlmIChwc2Vzc2lvbkVudHJ5KQorCQlsaW1fc2VuZF9zbWVfZGlzYXNzb2NfbnRmKHBNYWMsIHNtZURpc2Fzc29jUmVxLnBlZXJNYWNBZGRyLAorCQkJCQkgIHJldENvZGUsCisJCQkJCSAgZGlzYXNzb2NUcmlnZ2VyLAorCQkJCQkgIDEsIHNtZXNlc3Npb25JZCwgc21ldHJhbnNhY3Rpb25JZCwKKwkJCQkJICBwc2Vzc2lvbkVudHJ5KTsKKwllbHNlCisJCWxpbV9zZW5kX3NtZV9kaXNhc3NvY19udGYocE1hYywgc21lRGlzYXNzb2NSZXEucGVlck1hY0FkZHIsCisJCQkJCSAgcmV0Q29kZSwKKwkJCQkJICBkaXNhc3NvY1RyaWdnZXIsCisJCQkJCSAgMSwgc21lc2Vzc2lvbklkLCBzbWV0cmFuc2FjdGlvbklkLCBOVUxMKTsKKworfSAvKioqIGVuZCBfX2xpbV9wcm9jZXNzX3NtZV9kaXNhc3NvY19yZXEoKSAqKiovCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIF9fbGltX3Byb2Nlc3Nfc21lX2Rpc2Fzc29jX2NuZigpIC0gUHJvY2VzcyBTTUVfRElTQVNTT0NfQ05GCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgU01FX0RJU0FTU09DX0NORiBtZXNzYWdlCisgICBmcm9tIEhERCBvciB1cHBlciBsYXllciBhcHBsaWNhdGlvbi4KKworICAgXHBhcmFtIHBNYWMgLSBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICAgXHBhcmFtIHBTdGFEcyAtIHN0YXRpb24gZHBoIGhhc2ggbm9kZQorICAgXHJldHVybiBub25lCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9kaXNhc3NvY19jbmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYpCit7CisJdFNpclNtZURpc2Fzc29jQ25mIHNtZURpc2Fzc29jQ25mOworCXVpbnQxNl90IGFpZDsKKwl0cERwaEhhc2hOb2RlIHBTdGFEczsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoInJlY2VpdmVkIERJU0FTU09DX0NORiBtZXNzYWdlIikpOykKKworCWNkZl9tZW1fY29weSgmc21lRGlzYXNzb2NDbmYsIHBNc2dCdWYsCisJCQlzaXplb2Yoc3RydWN0IHNTaXJTbWVEaXNhc3NvY0NuZikpOworCisJcHNlc3Npb25FbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChwTWFjLAorCQkJCXNtZURpc2Fzc29jQ25mLmJzc0lkLAorCQkJCSZzZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIGJzc0lkIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFsaW1faXNfc21lX2Rpc2Fzc29jX2NuZl92YWxpZChwTWFjLCAmc21lRGlzYXNzb2NDbmYsIHBzZXNzaW9uRW50cnkpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJyZWNlaXZlZCBpbnZhbGlkIFNNRV9ESVNBU1NPQ19DTkYgbWVzc2FnZSIpKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAgICAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJaWYgKHNtZURpc2Fzc29jQ25mLm1lc3NhZ2VUeXBlID09IGVXTklfU01FX0RJU0FTU09DX0NORikKKwkJbGltX2RpYWdfZXZlbnRfcmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19ESVNBU1NPQ19DTkZfRVZFTlQsCisJCQkJICAgICAgcHNlc3Npb25FbnRyeSwKKwkJCQkgICAgICAodWludDE2X3QpIHNtZURpc2Fzc29jQ25mLnN0YXR1c0NvZGUsIDApOworCWVsc2UgaWYgKHNtZURpc2Fzc29jQ25mLm1lc3NhZ2VUeXBlID09IGVXTklfU01FX0RFQVVUSF9DTkYpCisJCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfREVBVVRIX0NORl9FVkVOVCwKKwkJCQkgICAgICBwc2Vzc2lvbkVudHJ5LAorCQkJCSAgICAgICh1aW50MTZfdCkgc21lRGlzYXNzb2NDbmYuc3RhdHVzQ29kZSwgMCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJc3dpdGNoIChHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJY2FzZSBlTElNX1NUQV9ST0xFOgorCWNhc2UgZUxJTV9CVF9BTVBfU1RBX1JPTEU6ICAgICAgLyogVG8gdGVzdCByZWNvbm4gKi8KKwkJaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9JRExFX1NUQVRFKSAmJgorCQkgICAgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFKQorCQkgICAgJiYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9CisJCQllTElNX1NNRV9XVF9ERUFVVEhfU1RBVEUpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwKKwkJCQkJKCJyZWNlaXZlZCB1bmV4cCBTTUVfRElTQVNTT0NfQ05GIGluIHN0YXRlICVYIiksCisJCQkJcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworCQkJbGltX3ByaW50X3NtZV9zdGF0ZShwTWFjLCBMT0dFLAorCQkJCQkgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBlTElNX0FQX1JPTEU6CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCQlicmVhazsKKworCWNhc2UgZUxJTV9TVEFfSU5fSUJTU19ST0xFOgorCWRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIGVMSU1fVU5LTk9XTl9ST0xFICovCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFNNRV9ESVNBU1NPQ19DTkYgcm9sZSAlZCIpLAorCQkJR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSk7CisKKwkJcmV0dXJuOworCX0KKworCWlmICgocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEUpIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9XVF9ERUFVVEhfU1RBVEUpIHx8CisJICAgIExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCXBTdGFEcyA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLAorCQkJCXNtZURpc2Fzc29jQ25mLnBlZXJNYWNBZGRyLCAmYWlkLAorCQkJCSZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJaWYgKHBTdGFEcyA9PSBOVUxMKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIkRJU0FTU09DX0NORiBmb3IgYSBTVEEgd2l0aCBubyBjb250ZXh0LCBhZGRyPSAiCisJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJCQlNQUNfQUREUl9BUlJBWShzbWVEaXNhc3NvY0NuZi5wZWVyTWFjQWRkcikpOworCQkJcmV0dXJuOworCQl9CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQkvKiBEZWxldGUgRlQgc2Vzc2lvbiBpZiB0aGVyZSBleGlzdHMgb25lICovCisJCWxpbV9mdF9jbGVhbnVwX3ByZV9hdXRoX2luZm8ocE1hYywgcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKwkJbGltX2NsZWFudXBfcnhfcGF0aChwTWFjLCBwU3RhRHMsIHBzZXNzaW9uRW50cnkpOworCisJCWxpbV9jbGVhbl91cF9kaXNhc3NvY19kZWF1dGhfcmVxKHBNYWMsCisJCQkJCQkgKGNoYXIgKikmc21lRGlzYXNzb2NDbmYucGVlck1hY0FkZHIsCisJCQkJCQkgMCk7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIF9fbGltX3Byb2Nlc3Nfc21lX2RlYXV0aF9yZXEoKSAtIHByb2Nlc3Mgc21lIGRlYXV0aCByZXEKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAbXNnX2J1ZjogcG9pbnRlciB0byB0aGUgU01FIG1lc3NhZ2UgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBTTUVfREVBVVRIX1JFUSBtZXNzYWdlCisgKiBmcm9tIEhERCBvciB1cHBlciBsYXllciBhcHBsaWNhdGlvbi4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9kZWF1dGhfcmVxKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQzMl90ICptc2dfYnVmKQoreworCXVpbnQxNl90IGRlYXV0aF90cmlnZ2VyLCByZWFzb25fY29kZTsKKwl0TGltTWxtRGVhdXRoUmVxICptbG1fZGVhdXRoX3JlcTsKKwl0U2lyU21lRGVhdXRoUmVxIHNtZV9kZWF1dGhfcmVxOworCXRTaXJSZXN1bHRDb2RlcyByZXRfY29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeTsKKwl1aW50OF90IHNlc3Npb25faWQ7ICAgICAgLyogUEUgc2Vzc2lvbklkICovCisJdWludDhfdCBzbWVfc2Vzc2lvbl9pZDsKKwl1aW50MTZfdCBzbWVfdHJhbnNhY3Rpb25faWQ7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJyZWNlaXZlZCBERUFVVEhfUkVRIG1lc3NhZ2UiKSk7CisKKwljZGZfbWVtX2NvcHkoJnNtZV9kZWF1dGhfcmVxLCBtc2dfYnVmLCBzaXplb2YodFNpclNtZURlYXV0aFJlcSkpOworCXNtZV9zZXNzaW9uX2lkID0gc21lX2RlYXV0aF9yZXEuc2Vzc2lvbklkOworCXNtZV90cmFuc2FjdGlvbl9pZCA9IHNtZV9kZWF1dGhfcmVxLnRyYW5zYWN0aW9uSWQ7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gZ2V0IGEgc2Vzc2lvbiBmaXJzdCBidXQgd2UgZG9uJ3QgZXZlbiBrbm93CisJICogaWYgdGhlIG1lc3NhZ2UgaXMgY29ycmVjdC4KKwkgKi8KKwlzZXNzaW9uX2VudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKG1hY19jdHgsIHNtZV9kZWF1dGhfcmVxLmJzc0lkLAorCQkJCSZzZXNzaW9uX2lkKTsKKwlpZiAoc2Vzc2lvbl9lbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZCIpKTsKKwkJcmV0X2NvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCWRlYXV0aF90cmlnZ2VyID0gZUxJTV9IT1NUX0RFQVVUSDsKKwkJZ290byBzZW5kX2RlYXV0aDsKKwl9CisKKwlpZiAoIWxpbV9pc19zbWVfZGVhdXRoX3JlcV92YWxpZChtYWNfY3R4LCAmc21lX2RlYXV0aF9yZXEsCisJCQkJc2Vzc2lvbl9lbnRyeSkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkgICAgICAgRkwoInJlY2VpdmVkIGludmFsaWQgU01FX0RFQVVUSF9SRVEgbWVzc2FnZSIpKTsKKwkJbWFjX2N0eC0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisKKwkJcmV0X2NvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCWRlYXV0aF90cmlnZ2VyID0gZUxJTV9IT1NUX0RFQVVUSDsKKwkJZ290byBzZW5kX2RlYXV0aDsKKwl9CisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgicmVjZWl2ZWQgREVBVVRIX1JFUSBzZXNzaW9uaWQgJWQgU3lzdGVtcm9sZSAlZCByZWFzb25jb2RlICV1IGxpbVNtZXN0YXRlICVkIGZyb20gIgorCQlNQUNfQUREUkVTU19TVFIpLCBzbWVfc2Vzc2lvbl9pZCwKKwkJR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uX2VudHJ5KSwgc21lX2RlYXV0aF9yZXEucmVhc29uQ29kZSwKKwkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUsCisJCU1BQ19BRERSX0FSUkFZKHNtZV9kZWF1dGhfcmVxLnBlZXJNYWNBZGRyKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChtYWNfY3R4LCBXTEFOX1BFX0RJQUdfREVBVVRIX1JFUV9FVkVOVCwKKwkJCXNlc3Npb25fZW50cnksIDAsIHNtZV9kZWF1dGhfcmVxLnJlYXNvbkNvZGUpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworCS8qIFVwZGF0ZSBTTUUgc2Vzc2lvbiBJRCBhbmQgVHJhbnNhY3Rpb24gSUQgKi8KKwlzZXNzaW9uX2VudHJ5LT5zbWVTZXNzaW9uSWQgPSBzbWVfc2Vzc2lvbl9pZDsKKwlzZXNzaW9uX2VudHJ5LT50cmFuc2FjdGlvbklkID0gc21lX3RyYW5zYWN0aW9uX2lkOworCisJc3dpdGNoIChHRVRfTElNX1NZU1RFTV9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJY2FzZSBlTElNX1NUQV9ST0xFOgorCWNhc2UgZUxJTV9CVF9BTVBfU1RBX1JPTEU6CisKKwkJc3dpdGNoIChzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSkgeworCQljYXNlIGVMSU1fU01FX0FTU09DSUFURURfU1RBVEU6CisJCWNhc2UgZUxJTV9TTUVfTElOS19FU1RfU1RBVEU6CisJCWNhc2UgZUxJTV9TTUVfV1RfQVNTT0NfU1RBVEU6CisJCWNhc2UgZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOgorCQljYXNlIGVMSU1fU01FX0lETEVfU1RBVEU6CisJCQlzZXNzaW9uX2VudHJ5LT5saW1QcmV2U21lU3RhdGUgPQorCQkJCXNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlOworCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9ERUFVVEhfU1RBVEU7CisJCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfU01FX1NUQVRFLAorCQkJCSAgICAgICBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQkgICAgICAgc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpKTsKKwkJCS8qIFNlbmQgRGVhdXRoZW50aWNhdGlvbiByZXF1ZXN0IHRvIE1MTSBiZWxvdyAqLworCQkJYnJlYWs7CisJCWNhc2UgZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFOgorCQljYXNlIGVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFOgorCQkJLyoKKwkJCSAqIFBFIFJlY2lldmVkIGEgRGVhdXRoL0Rpc2Fzc29jIGZyYW1lLiBOb3JtYWxseSBpdCBnZXQKKwkJCSAqIERFQVVUSF9DTkYvRElTQVNTT0NfQ05GIGJ1dCBpdCByZWNlaXZlZCBERUFVVEhfUkVRLgorCQkJICogV2hpY2ggbWVhbnMgaG9zdCBpcyBhbHNvIHRyeWluZyB0byBkaXNjb25uZWN0LgorCQkJICogUEUgY2FuIGNvbnRpbnVlIHByb2Nlc3NpbmcgREVBVVRIX1JFUSBhbmQgc2VuZAorCQkJICogdGhlIHJlc3BvbnNlIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcmVxdWVzdC4KKwkJCSAqIFNNRSB3aWxsIGFueXdheSBpZ25vcmUgREVBVVRIX0lORC9ESVNBU1NPQ19JTkQgdGhhdAorCQkJICogd2FzIHNlbnQgZm9yIGRlYXV0aC9kaXNhc3NvYyBmcmFtZS4KKwkJCSAqLworCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9ERUFVVEhfU1RBVEU7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKAorCQkJCSJSY3ZkIFNNRV9ERUFVVEhfUkVRIHdoaWxlIGluIFNNRV9XVF9ERUFVVEhfU1RBVEUiKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBTVEEgaXMgbm90IGluIGEgc3RhdGUgdG8gZGVhdXRoZW50aWNhdGUgd2l0aAorCQkJICogcGVlci4gTG9nIGVycm9yIGFuZCBzZW5kIHJlc3BvbnNlIHRvIGhvc3QuCisJCQkgKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoCisJCQkJInJlY2VpdmVkIHVuZXhwIFNNRV9ERUFVVEhfUkVRIGluIHN0YXRlICVYIiksCisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpOworCQkJbGltX3ByaW50X3NtZV9zdGF0ZShtYWNfY3R4LCBMT0dFLAorCQkJCQkgICAgc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpOworCisJCQlpZiAobWFjX2N0eC0+bGltLmdMaW1Sc3BSZXFkKSB7CisJCQkJbWFjX2N0eC0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisKKwkJCQlyZXRfY29kZSA9IGVTSVJfU01FX1NUQV9OT1RfQVVUSEVOVElDQVRFRDsKKwkJCQlkZWF1dGhfdHJpZ2dlciA9IGVMSU1fSE9TVF9ERUFVVEg7CisKKwkJCS8qCisJCQkgKiBoZXJlIHdlIHJlY2VpdmVkIGRlYXV0aCByZXF1ZXN0IGZyb20gQVAgc28gc21lIHN0YXRlCisJCQkgKiBpcyBlTElNX1NNRV9XVF9ERUFVVEhfU1RBVEUuaWYgd2UgaGF2ZSBJU1NVRUQKKwkJCSAqIGRlbFN0YSB0aGVuIG1sbSBzdGF0ZSBzaG91bGQgYmUKKwkJCSAqIGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFIGFuZCBpZndlIGdvdCBkZWxCU1MKKwkJCSAqIHJzcCB0aGVuIG1sbSBzdGF0ZSBzaG91bGQgYmUgZUxJTV9NTE1fSURMRV9TVEFURQorCQkJICogc28gdGhlIGJlbG93IGNvbmRpdGlvbiBjYXB0dXJlcyB0aGUgc3RhdGUgd2hlcmUKKwkJCSAqIGRlbFN0YSBub3QgZG9uZSBhbmQgZmlybXdhcmUgc3RpbGwgaW4KKwkJCSAqIGNvbm5lY3RlZCBzdGF0ZS4KKwkJCSAqLworCQkJaWYgKHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlID09CisJCQkJCWVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSAmJgorCQkJCQlzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSAhPQorCQkJCQllTElNX01MTV9JRExFX1NUQVRFICYmCisJCQkJCXNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlICE9CisJCQkJCWVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFKQorCQkJCXJldF9jb2RlID0gZVNJUl9TTUVfREVBVVRIX1NUQVRVUzsKKwkJCQlnb3RvIHNlbmRfZGVhdXRoOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBlTElNX1NUQV9JTl9JQlNTX1JPTEU6CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkRlYXV0aCBub3QgYWxsb3dlZCBpbiBJQlNTIikpOworCQlpZiAobWFjX2N0eC0+bGltLmdMaW1Sc3BSZXFkKSB7CisJCQltYWNfY3R4LT5saW0uZ0xpbVJzcFJlcWQgPSBmYWxzZTsKKwkJCXJldF9jb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCQkJZGVhdXRoX3RyaWdnZXIgPSBlTElNX0hPU1RfREVBVVRIOworCQkJZ290byBzZW5kX2RlYXV0aDsKKwkJfQorCQlyZXR1cm47CisJY2FzZSBlTElNX0FQX1JPTEU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFNNRV9ERUFVVEhfUkVRIGZvciByb2xlICVYIiksCisJCQlHRVRfTElNX1NZU1RFTV9ST0xFKHNlc3Npb25fZW50cnkpKTsKKwkJaWYgKG1hY19jdHgtPmxpbS5nTGltUnNwUmVxZCkgeworCQkJbWFjX2N0eC0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisJCQlyZXRfY29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKwkJCWRlYXV0aF90cmlnZ2VyID0gZUxJTV9IT1NUX0RFQVVUSDsKKwkJCWdvdG8gc2VuZF9kZWF1dGg7CisJCX0KKwkJcmV0dXJuOworCX0gLyogZW5kIHN3aXRjaCAobWFjX2N0eC0+bGltLmdMaW1TeXN0ZW1Sb2xlKSAqLworCisJaWYgKHNtZV9kZWF1dGhfcmVxLnJlYXNvbkNvZGUgPT0gZUxJTV9MSU5LX01PTklUT1JJTkdfREVBVVRIKSB7CisJCS8qIERlYXV0aGVudGljYXRpb24gaXMgdHJpZ2dlcmVkIGJ5IExpbmsgTW9uaXRvcmluZyAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCIqKiBMb3N0IGxpbmsgd2l0aCBBUCAqKiIpKTsKKwkJZGVhdXRoX3RyaWdnZXIgPSBlTElNX0xJTktfTU9OSVRPUklOR19ERUFVVEg7CisJCXJlYXNvbl9jb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OOworCX0gZWxzZSB7CisJCWRlYXV0aF90cmlnZ2VyID0gZUxJTV9IT1NUX0RFQVVUSDsKKwkJcmVhc29uX2NvZGUgPSBzbWVfZGVhdXRoX3JlcS5yZWFzb25Db2RlOworCX0KKworCS8qIFRyaWdnZXIgRGVhdXRoZW50aWNhdGlvbiBmcmFtZSB0byBwZWVyIE1BQyBlbnRpdHkgKi8KKwltbG1fZGVhdXRoX3JlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0TGltTWxtRGVhdXRoUmVxKSk7CisJaWYgKE5VTEwgPT0gbWxtX2RlYXV0aF9yZXEpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJRkwoImNhbGwgdG8gQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1EZWF1dGhSZXEiKSk7CisJCWlmIChtYWNfY3R4LT5saW0uZ0xpbVJzcFJlcWQpIHsKKwkJCW1hY19jdHgtPmxpbS5nTGltUnNwUmVxZCA9IGZhbHNlOworCQkJcmV0X2NvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJCQlkZWF1dGhfdHJpZ2dlciA9IGVMSU1fSE9TVF9ERUFVVEg7CisJCQlnb3RvIHNlbmRfZGVhdXRoOworCQl9CisJCXJldHVybjsKKwl9CisKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJm1sbV9kZWF1dGhfcmVxLT5wZWVyTWFjQWRkciwKKwkJICAgICAodWludDhfdCAqKSAmc21lX2RlYXV0aF9yZXEucGVlck1hY0FkZHIsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwltbG1fZGVhdXRoX3JlcS0+cmVhc29uQ29kZSA9IHJlYXNvbl9jb2RlOworCW1sbV9kZWF1dGhfcmVxLT5kZWF1dGhUcmlnZ2VyID0gZGVhdXRoX3RyaWdnZXI7CisKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJZCAqLworCW1sbV9kZWF1dGhfcmVxLT5zZXNzaW9uSWQgPSBzZXNzaW9uX2lkOworCisJbGltX3Bvc3RfbWxtX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9ERUFVVEhfUkVRLAorCQkJKHVpbnQzMl90ICopbWxtX2RlYXV0aF9yZXEpOworCXJldHVybjsKKworc2VuZF9kZWF1dGg6CisJbGltX3NlbmRfc21lX2RlYXV0aF9udGYobWFjX2N0eCwgc21lX2RlYXV0aF9yZXEucGVlck1hY0FkZHIsIHJldF9jb2RlLAorCQkJZGVhdXRoX3RyaWdnZXIsIDEsIHNtZV9zZXNzaW9uX2lkLCBzbWVfdHJhbnNhY3Rpb25faWQpOworfQorCisvKioKKyAqIF9fbGltX3Byb2Nlc3Nfc21lX3NldF9jb250ZXh0X3JlcSgpCisgKgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2dfYnVmOiBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIFNNRV9TRVRDT05URVhUX1JFUSBtZXNzYWdlCisgKiBmcm9tIEhERCBvciB1cHBlciBsYXllciBhcHBsaWNhdGlvbi4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorX19saW1fcHJvY2Vzc19zbWVfc2V0X2NvbnRleHRfcmVxKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQzMl90ICptc2dfYnVmKQoreworCXRwU2lyU21lU2V0Q29udGV4dFJlcSBzZXRfY29udGV4dF9yZXE7CisJdExpbU1sbVNldEtleXNSZXEgKm1sbV9zZXRfa2V5X3JlcTsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5OworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsgICAgICAvKiBQRSBzZXNzaW9uSUQgKi8KKwl1aW50OF90IHNtZV9zZXNzaW9uX2lkOworCXVpbnQxNl90IHNtZV90cmFuc2FjdGlvbl9pZDsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoInJlY2VpdmVkIFNFVENPTlRFWFRfUkVRIG1lc3NhZ2UiKSk7CisKKwlpZiAobXNnX2J1ZiA9PSBOVUxMKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJc2V0X2NvbnRleHRfcmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBzU2lyU21lU2V0Q29udGV4dFJlcSkpOworCWlmIChOVUxMID09IHNldF9jb250ZXh0X3JlcSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsIEZMKAorCQkJImNhbGwgdG8gQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBzZXRfY29udGV4dF9yZXEiKSk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV9jb3B5KHNldF9jb250ZXh0X3JlcSwgbXNnX2J1ZiwKKwkJCXNpemVvZihzdHJ1Y3Qgc1NpclNtZVNldENvbnRleHRSZXEpKTsKKwlzbWVfc2Vzc2lvbl9pZCA9IHNldF9jb250ZXh0X3JlcS0+c2Vzc2lvbklkOworCXNtZV90cmFuc2FjdGlvbl9pZCA9IHNldF9jb250ZXh0X3JlcS0+dHJhbnNhY3Rpb25JZDsKKworCWlmICgoIWxpbV9pc19zbWVfc2V0X2NvbnRleHRfcmVxX3ZhbGlkKG1hY19jdHgsIHNldF9jb250ZXh0X3JlcSkpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJyZWNlaXZlZCBpbnZhbGlkIFNNRV9TRVRDT05URVhUX1JFUSBtZXNzYWdlIikpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoc2V0X2NvbnRleHRfcmVxLT5rZXlNYXRlcmlhbC5udW1LZXlzID4KKwkJCVNJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVMpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgKKwkJCSJudW1LZXlzOiVkIGlzIG1vcmUgdGhhbiBTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTIiksCisJCQkJCXNldF9jb250ZXh0X3JlcS0+a2V5TWF0ZXJpYWwubnVtS2V5cyk7CisJCWxpbV9zZW5kX3NtZV9zZXRfY29udGV4dF9yc3AobWFjX2N0eCwKKwkJCQlzZXRfY29udGV4dF9yZXEtPnBlZXJNYWNBZGRyLCAxLAorCQkJCWVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUywgTlVMTCwKKwkJCQlzbWVfc2Vzc2lvbl9pZCwgc21lX3RyYW5zYWN0aW9uX2lkKTsKKwkJZ290byBlbmQ7CisJfQorCisJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChtYWNfY3R4LAorCQkJc2V0X2NvbnRleHRfcmVxLT5ic3NJZCwgJnNlc3Npb25faWQpOworCWlmIChzZXNzaW9uX2VudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIEJTU0lEIikpOworCQlsaW1fc2VuZF9zbWVfc2V0X2NvbnRleHRfcnNwKG1hY19jdHgsCisJCQkJc2V0X2NvbnRleHRfcmVxLT5wZWVyTWFjQWRkciwgMSwKKwkJCQllU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlMsIE5VTEwsCisJCQkJc21lX3Nlc3Npb25faWQsIHNtZV90cmFuc2FjdGlvbl9pZCk7CisJCWdvdG8gZW5kOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAgICAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KG1hY19jdHgsIFdMQU5fUEVfRElBR19TRVRDT05URVhUX1JFUV9FVkVOVCwKKwkJCSAgICAgIHNlc3Npb25fZW50cnksIDAsIDApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworCWlmICgoKExJTV9JU19TVEFfUk9MRShzZXNzaW9uX2VudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHNlc3Npb25fZW50cnkpKSAmJgorCSAgICAoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpKSB8fAorCSAgICAoKExJTV9JU19JQlNTX1JPTEUoc2Vzc2lvbl9lbnRyeSkgfHwKKwkgICAgTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgfHwKKwkgICAgTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb25fZW50cnkpKSAmJgorCSAgICAoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKSkpIHsKKwkJLyogVHJpZ2dlciBNTE1fU0VUS0VZU19SRVEgKi8KKwkJbWxtX3NldF9rZXlfcmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRMaW1NbG1TZXRLZXlzUmVxKSk7CisJCWlmIChOVUxMID09IG1sbV9zZXRfa2V5X3JlcSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLCBGTCgKKwkJCQkJIm1lbSBhbGxvYyBmYWlsZWQgZm9yIG1sbVNldEtleXNSZXEiKSk7CisJCQlnb3RvIGVuZDsKKwkJfQorCQltbG1fc2V0X2tleV9yZXEtPmVkVHlwZSA9IHNldF9jb250ZXh0X3JlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlOworCQltbG1fc2V0X2tleV9yZXEtPm51bUtleXMgPQorCQkJc2V0X2NvbnRleHRfcmVxLT5rZXlNYXRlcmlhbC5udW1LZXlzOworCQlpZiAobWxtX3NldF9rZXlfcmVxLT5udW1LZXlzID4KKwkJCQlTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsIEZMKAorCQkJCSJuby5vZiBrZXlzIGV4Y2VlZGVkIG1heCBudW0gb2YgZGVmYXVsdCBrZXlzIGxpbWl0IikpOworCQkJZ290byBlbmQ7CisJCX0KKwkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZtbG1fc2V0X2tleV9yZXEtPnBlZXJNYWNBZGRyLAorCQkJICAgICAodWludDhfdCAqKSAmc2V0X2NvbnRleHRfcmVxLT5wZWVyTWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZtbG1fc2V0X2tleV9yZXEtPmtleSwKKwkJCSAgICAgKHVpbnQ4X3QgKikgJnNldF9jb250ZXh0X3JlcS0+a2V5TWF0ZXJpYWwua2V5LAorCQkJICAgICBzaXplb2YodFNpcktleXMpICoKKwkJCSAgICAgKG1sbV9zZXRfa2V5X3JlcS0+bnVtS2V5cyA/IG1sbV9zZXRfa2V5X3JlcS0+CisJCQkgICAgICBudW1LZXlzIDogMSkpOworCisJCW1sbV9zZXRfa2V5X3JlcS0+c2Vzc2lvbklkID0gc2Vzc2lvbl9pZDsKKwkJbWxtX3NldF9rZXlfcmVxLT5zbWVzZXNzaW9uSWQgPSBzbWVfc2Vzc2lvbl9pZDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKAorCQkJInJlY2VpdmVkIFNFVENPTlRFWFRfUkVRIG1lc3NhZ2Ugc2Vzc2lvbklkPSVkIiksCisJCQkJCW1sbV9zZXRfa2V5X3JlcS0+c2Vzc2lvbklkKTsKKyNlbmRpZgorCisJCWlmICgoKHNldF9jb250ZXh0X3JlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlID09IGVTSVJfRURfV0VQNDApIHx8CisJCSAgICAoc2V0X2NvbnRleHRfcmVxLT5rZXlNYXRlcmlhbC5lZFR5cGUgPT0gZVNJUl9FRF9XRVAxMDQpKSAmJgorCQkgICAgTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJCWlmIChzZXRfY29udGV4dF9yZXEtPmtleU1hdGVyaWFsLmtleVswXS5rZXlMZW5ndGgpIHsKKwkJCQl1aW50OF90IGtleV9pZDsKKwkJCQlrZXlfaWQgPQorCQkJCQlzZXRfY29udGV4dF9yZXEtPmtleU1hdGVyaWFsLmtleVswXS5rZXlJZDsKKwkJCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikKKwkJCQkJJnNlc3Npb25fZW50cnktPldFUEtleU1hdGVyaWFsW2tleV9pZF0sCisJCQkJCSh1aW50OF90ICopICZzZXRfY29udGV4dF9yZXEtPmtleU1hdGVyaWFsLAorCQkJCQlzaXplb2YodFNpcktleU1hdGVyaWFsKSk7CisJCQl9IGVsc2UgeworCQkJCXVpbnQzMl90IGk7CisJCQkJZm9yIChpID0gMDsgaSA8IFNJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVM7CisJCQkJICAgICBpKyspIHsKKwkJCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopCisJCQkJCQkmbWxtX3NldF9rZXlfcmVxLT5rZXlbaV0sCisJCQkJCQkodWludDhfdCAqKXNlc3Npb25fZW50cnktPldFUEtleU1hdGVyaWFsW2ldLmtleSwKKwkJCQkJCXNpemVvZih0U2lyS2V5cykpOworCQkJCX0KKwkJCX0KKwkJfQorCQlsaW1fcG9zdF9tbG1fbWVzc2FnZShtYWNfY3R4LCBMSU1fTUxNX1NFVEtFWVNfUkVRLAorCQkJCSAgICAgKHVpbnQzMl90ICopIG1sbV9zZXRfa2V5X3JlcSk7CisJfSBlbHNlIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgKKwkJCSJyY3ZkIHVuZXhwZWN0ZWQgU01FX1NFVENPTlRFWFRfUkVRIGZvciByb2xlICVkLCBzdGF0ZT0lWCIpLAorCQkJCUdFVF9MSU1fU1lTVEVNX1JPTEUoc2Vzc2lvbl9lbnRyeSksCisJCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpOworCQlsaW1fcHJpbnRfc21lX3N0YXRlKG1hY19jdHgsIExPR0UsIHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlKTsKKworCQlsaW1fc2VuZF9zbWVfc2V0X2NvbnRleHRfcnNwKG1hY19jdHgsCisJCQkJc2V0X2NvbnRleHRfcmVxLT5wZWVyTWFjQWRkciwgMSwKKwkJCQllU0lSX1NNRV9VTkVYUEVDVEVEX1JFUV9SRVNVTFRfQ09ERSwKKwkJCQlzZXNzaW9uX2VudHJ5LCBzbWVfc2Vzc2lvbl9pZCwKKwkJCQlzbWVfdHJhbnNhY3Rpb25faWQpOworCX0KK2VuZDoKKwljZGZfbWVtX2ZyZWUoc2V0X2NvbnRleHRfcmVxKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3Nfc21lX2dldF9hc3NvY19zdGFfaW5mbygpIC0gcHJvY2VzcyBzbWUgYXNzb2Mgc3RhIHJlcQorICoKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAbXNnX2J1ZjogcG9pbnRlciB0byB0aGUgU01FIG1lc3NhZ2UgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBTTUVfR0VUX0FTU09DX1NUQVNfUkVRIG1lc3NhZ2UKKyAqIGZyb20gSEREIG9yIHVwcGVyIGxheWVyIGFwcGxpY2F0aW9uLgorICoKKyAqIFJldHVybjogTm9uZQorICovCisKK3ZvaWQgbGltX3Byb2Nlc3Nfc21lX2dldF9hc3NvY19zdGFfaW5mbyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQl1aW50MzJfdCAqbXNnX2J1ZikKK3sKKwl0U2lyU21lR2V0QXNzb2NTVEFzUmVxIGdldF9hc3NvY19zdGFzX3JlcTsKKwl0cERwaEhhc2hOb2RlIHN0YV9kcyA9IE5VTEw7CisJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSA9IE5VTEw7CisJdFNhcF9FdmVudCBzYXBfZXZlbnQ7CisJdHBXTEFOX1NBUEV2ZW50Q0Igc2FwX2V2ZW50X2NiID0gTlVMTDsKKwl0cFNhcF9Bc3NvY01hY0FkZHIgYXNzb2Nfc3RhX3RtcCA9IE5VTEw7CisJdWludDhfdCBzZXNzaW9uX2lkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKwl1aW50OF90IGFzc29jX2lkID0gMDsKKwl1aW50OF90IHN0YV9jbnQgPSAwOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWNkZl9tZW1fY29weSgmZ2V0X2Fzc29jX3N0YXNfcmVxLCBtc2dfYnVmLAorCQkJCXNpemVvZihzdHJ1Y3Qgc1NpclNtZUdldEFzc29jU1RBc1JlcSkpOworCS8qCisJICogR2V0IEFzc29jaWF0ZWQgc3RhdGlvbnMgZnJvbSBQRS4KKwkgKiBGaW5kIFBFIHNlc3Npb24gRW50cnkKKwkgKi8KKwlzZXNzaW9uX2VudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKG1hY19jdHgsCisJCQlnZXRfYXNzb2Nfc3Rhc19yZXEuYnNzSWQsCisJCQkmc2Vzc2lvbl9pZCk7CisJaWYgKHNlc3Npb25fZW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gYnNzSWQiKSk7CisJCWdvdG8gbGltX2Fzc29jX3N0YV9lbmQ7CisJfQorCisJaWYgKCFMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKAorCQkJIlJlY2VpdmVkIHVuZXhwZWN0ZWQgbWVzc2FnZSBpbiBzdGF0ZSAlWCwgaW4gcm9sZSAlWCIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUsCisJCQlHRVRfTElNX1NZU1RFTV9ST0xFKHNlc3Npb25fZW50cnkpKTsKKwkJZ290byBsaW1fYXNzb2Nfc3RhX2VuZDsKKwl9CisJLyogUmV0cmlldmUgdmFsdWVzIG9idGFpbmVkIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UgKi8KKwlzYXBfZXZlbnRfY2IgPSAodHBXTEFOX1NBUEV2ZW50Q0IpZ2V0X2Fzc29jX3N0YXNfcmVxLnBTYXBFdmVudENhbGxiYWNrOworCWFzc29jX3N0YV90bXAgPSAodHBTYXBfQXNzb2NNYWNBZGRyKWdldF9hc3NvY19zdGFzX3JlcS5wQXNzb2NTdGFzQXJyYXk7CisKKwlpZiAoTlVMTCA9PSBhc3NvY19zdGFfdG1wKQorCQlnb3RvIGxpbV9hc3NvY19zdGFfZW5kOworCWZvciAoYXNzb2NfaWQgPSAwOyBhc3NvY19pZCA8IHNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUuc2l6ZTsKKwkJYXNzb2NfaWQrKykgeworCQlzdGFfZHMgPSBkcGhfZ2V0X2hhc2hfZW50cnkobWFjX2N0eCwgYXNzb2NfaWQsCisJCQkJJnNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQlpZiAoTlVMTCA9PSBzdGFfZHMpCisJCQljb250aW51ZTsKKwkJaWYgKHN0YV9kcy0+dmFsaWQpIHsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmYXNzb2Nfc3RhX3RtcC0+c3RhTWFjLAorCQkJCQkodWludDhfdCAqKSAmc3RhX2RzLT5zdGFBZGRyLAorCQkJCQkgQ0RGX01BQ19BRERSX1NJWkUpOworCQkJYXNzb2Nfc3RhX3RtcC0+YXNzb2NJZCA9ICh1aW50OF90KSBzdGFfZHMtPmFzc29jSWQ7CisJCQlhc3NvY19zdGFfdG1wLT5zdGFJZCA9ICh1aW50OF90KSBzdGFfZHMtPnN0YUluZGV4OworCisJCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikmYXNzb2Nfc3RhX3RtcC0+c3VwcG9ydGVkUmF0ZXMsCisJCQkJICAgICAodWludDhfdCAqKSZzdGFfZHMtPnN1cHBvcnRlZFJhdGVzLAorCQkJCSAgICAgc2l6ZW9mKHRTaXJTdXBwb3J0ZWRSYXRlcykpOworCQkJYXNzb2Nfc3RhX3RtcC0+U2hvcnRHSTQwTWh6ID0gc3RhX2RzLT5odFNob3J0R0k0ME1oejsKKwkJCWFzc29jX3N0YV90bXAtPlNob3J0R0kyME1oeiA9IHN0YV9kcy0+aHRTaG9ydEdJMjBNaHo7CisJCQlhc3NvY19zdGFfdG1wLT5TdXBwb3J0NDBNaHogPQorCQkJCXN0YV9kcy0+aHREc3NzQ2NrUmF0ZTQwTUh6U3VwcG9ydDsKKworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiZHBoIFN0YXRpb24gTnVtYmVyID0gJWQiKSwKKwkJCQlzdGFfY250ICsgMSk7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJNQUMgPSAiIE1BQ19BRERSRVNTX1NUUiksCisJCQkJTUFDX0FERFJfQVJSQVkoc3RhX2RzLT5zdGFBZGRyKSk7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJBc3NvY2lhdGlvbiBJZCA9ICVkIiksCisJCQkJc3RhX2RzLT5hc3NvY0lkKTsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlN0YXRpb24gSW5kZXggPSAlZCIpLAorCQkJCXN0YV9kcy0+c3RhSW5kZXgpOworCQkJYXNzb2Nfc3RhX3RtcCsrOworCQkJc3RhX2NudCsrOworCQl9CisJfQorbGltX2Fzc29jX3N0YV9lbmQ6CisJLyoKKwkgKiBDYWxsIGhkZCBjYWxsYmFjayB3aXRoIHNhcCBldmVudCB0byBzZW5kIHRoZSBsaXN0IG9mCisJICogYXNzb2NpYXRlZCBzdGF0aW9ucyBmcm9tIFBFCisJICovCisJaWYgKHNhcF9ldmVudF9jYiAhPSBOVUxMKSB7CisJCXNhcF9ldmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX0FTU09DX1NUQV9DQUxMQkFDS19FVkVOVDsKKwkJc2FwX2V2ZW50LnNhcGV2dC5zYXBBc3NvY1N0YUxpc3RFdmVudC5tb2R1bGUgPQorCQkJQ0RGX01PRFVMRV9JRF9QRTsKKwkJc2FwX2V2ZW50LnNhcGV2dC5zYXBBc3NvY1N0YUxpc3RFdmVudC5ub09mQXNzb2NTdGEgPSBzdGFfY250OworCQlzYXBfZXZlbnQuc2FwZXZ0LnNhcEFzc29jU3RhTGlzdEV2ZW50LnBBc3NvY1N0YXMgPQorCQkJKHRwU2FwX0Fzc29jTWFjQWRkcilnZXRfYXNzb2Nfc3Rhc19yZXEucEFzc29jU3Rhc0FycmF5OworCQlzYXBfZXZlbnRfY2IoJnNhcF9ldmVudCwgZ2V0X2Fzc29jX3N0YXNfcmVxLnBVc3JDb250ZXh0KTsKKwl9Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3Nfc21lX2dldF93cHNwYmNfc2Vzc2lvbnMgLSBwcm9jZXNzIHNtZSBnZXQgd3BzcGJjIHJlcQorICoKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAbXNnX2J1ZjogcG9pbnRlciB0byBXUFMgUEJDIG92ZXJsYXAgcXVlcnkgbWVzc2FnZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGdldCBXUFMgUEJDIG92ZXJsYXAgaW5mb3JtYXRpb24KKyAqIG1lc3NhZ2UgYW5kIGNhbGwgY2FsbGJhY2sgdG8gcGFzcyBXUFMgUEJDIG92ZXJsYXAKKyAqIGluZm9ybWF0aW9uIGJhY2sgdG8gaGRkLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGxpbV9wcm9jZXNzX3NtZV9nZXRfd3BzcGJjX3Nlc3Npb25zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQzMl90ICptc2dfYnVmKQoreworCXRTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcSBnZXRfd3BzX3BiY19zZXNzaW9uc19yZXE7CisJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSA9IE5VTEw7CisJdFNhcF9FdmVudCBzYXBfZXZlbnQ7CisJdHBXTEFOX1NBUEV2ZW50Q0Igc2FwX2V2ZW50X2NiID0gTlVMTDsKKwl1aW50OF90IHNlc3Npb25faWQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworCXRTaXJNYWNBZGRyIHplcm9fbWFjID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisJdFNhcF9HZXRXUFNQQkNTZXNzaW9uRXZlbnQgKnNhcF9nZXRfd3BzcGJjX2V2ZW50OworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCXNhcF9nZXRfd3BzcGJjX2V2ZW50ID0gJnNhcF9ldmVudC5zYXBldnQuc2FwR2V0V1BTUEJDU2Vzc2lvbkV2ZW50OworCXNhcF9nZXRfd3BzcGJjX2V2ZW50LT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFVTFQ7CisKKwljZGZfbWVtX2NvcHkoJmdldF93cHNfcGJjX3Nlc3Npb25zX3JlcSwgbXNnX2J1ZiwKKwkJCXNpemVvZihzdHJ1Y3Qgc1NpclNtZUdldFdQU1BCQ1Nlc3Npb25zUmVxKSk7CisJLyoKKwkgKiBHZXQgQXNzb2NpYXRlZCBzdGF0aW9ucyBmcm9tIFBFCisJICogRmluZCBQRSBzZXNzaW9uIEVudHJ5CisJICovCisJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChtYWNfY3R4LAorCQkJZ2V0X3dwc19wYmNfc2Vzc2lvbnNfcmVxLmJzc0lkLCAmc2Vzc2lvbl9pZCk7CisJaWYgKHNlc3Npb25fZW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gYnNzSWQiKSk7CisJCWdvdG8gbGltX2dldF93cHNwYmNfc2Vzc2lvbnNfZW5kOworCX0KKworCWlmICghTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgbWVzc2FnZSBpbiByb2xlICVYIiksCisJCQlHRVRfTElNX1NZU1RFTV9ST0xFKHNlc3Npb25fZW50cnkpKTsKKwkJZ290byBsaW1fZ2V0X3dwc3BiY19zZXNzaW9uc19lbmQ7CisJfQorCS8qCisJICogQ2FsbCBoZGQgY2FsbGJhY2sgd2l0aCBzYXAgZXZlbnQgdG8gc2VuZCB0aGUKKwkgKiBXUFMgUEJDIG92ZXJsYXAgaW5mb3JtYXRpb24KKwkgKi8KKwlzYXBfZXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9HRVRfV1BTUEJDX1NFU1NJT05fRVZFTlQ7CisJc2FwX2dldF93cHNwYmNfZXZlbnQtPm1vZHVsZSA9IENERl9NT0RVTEVfSURfUEU7CisKKwlpZiAoY2RmX21lbV9jb21wYXJlKHplcm9fbWFjLCBnZXRfd3BzX3BiY19zZXNzaW9uc19yZXEucFJlbW92ZU1hYywKKwkJCQlzaXplb2YodFNpck1hY0FkZHIpKSkgeworCQlsaW1fZ2V0X3dwc3BiY19zZXNzaW9ucyhtYWNfY3R4LAorCQkJCXNhcF9nZXRfd3BzcGJjX2V2ZW50LT5hZGRyLmJ5dGVzLAorCQkJCXNhcF9nZXRfd3BzcGJjX2V2ZW50LT5VVUlEX0UsCisJCQkJJnNhcF9nZXRfd3BzcGJjX2V2ZW50LT53cHNQQkNPdmVybGFwLAorCQkJCXNlc3Npb25fZW50cnkpOworCX0gZWxzZSB7CisJCWxpbV9yZW1vdmVfcGJjX3Nlc3Npb25zKG1hY19jdHgsCisJCQkJZ2V0X3dwc19wYmNfc2Vzc2lvbnNfcmVxLnBSZW1vdmVNYWMsCisJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCS8qIGRvbid0IGhhdmUgdG8gaW5mb3JtIHRoZSBIREQvSG9zdCAqLworCQlyZXR1cm47CisJfQorCisJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgid3BzUEJDT3ZlcmxhcCAlZCIpLAorCQkJCXNhcF9nZXRfd3BzcGJjX2V2ZW50LT53cHNQQkNPdmVybGFwKTsKKwlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwKKwkJCQlzYXBfZ2V0X3dwc3BiY19ldmVudC0+YWRkci5ieXRlcywgTE9HNCk7CisKKwlzYXBfZ2V0X3dwc3BiY19ldmVudC0+c3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCitsaW1fZ2V0X3dwc3BiY19zZXNzaW9uc19lbmQ6CisJc2FwX2V2ZW50X2NiID0KKwkJKHRwV0xBTl9TQVBFdmVudENCKWdldF93cHNfcGJjX3Nlc3Npb25zX3JlcS5wU2FwRXZlbnRDYWxsYmFjazsKKwlpZiAoTlVMTCAhPSBzYXBfZXZlbnRfY2IpCisJCXNhcF9ldmVudF9jYigmc2FwX2V2ZW50LCBnZXRfd3BzX3BiY19zZXNzaW9uc19yZXEucFVzckNvbnRleHQpOworfQorCisvKioKKyAqIF9fbGltX2NvdW50ZXJfbWVhc3VyZXMoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gImltcGxlbWVudCIgTUlDIGNvdW50ZXIgbWVhc3VyZQorICogYW5kIGlzICp0ZW1wb3JhcnkqIG9ubHkKKyAqCisgKiBMT0dJQzogb24gQVAsIGRpc2Fzc29jIGFsbCBTVEEgYXNzb2NpYXRlZCB0aHJ1IFRLSVAsCisgKiB3ZSBkb24ndCBkbyB0aGUgcHJvcGVyIFNUQSBkaXNhc3NvYyBzZXF1ZW5jZSBzaW5jZSB0aGUKKyAqIEJTUyB3aWxsIGJlIHN0b3BlZCBhbnl3YXkKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQgX19saW1fY291bnRlcl9tZWFzdXJlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJNYWNBZGRyIG1hYyA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkgICAgTElNX0lTX0JUX0FNUF9TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkKKwkJbGltX3NlbmRfZGlzYXNzb2NfbWdtdF9mcmFtZShwTWFjLCBlU0lSX01BQ19NSUNfRkFJTFVSRV9SRUFTT04sCisJCQkJCSAgICAgbWFjLCBwc2Vzc2lvbkVudHJ5LCBmYWxzZSk7Cit9OworCit2b2lkIGxpbV9wcm9jZXNzX3RraXBfY291bnRlcl9tZWFzdXJlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwl0U2lyU21lVGtpcENudHJNZWFzUmVxIHRraXBDbnRyTWVhc1JlcTsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFBFIHNlc3Npb25JZCAqLworCisJY2RmX21lbV9jb3B5KCZ0a2lwQ250ck1lYXNSZXEsIHBNc2dCdWYsCisJCQlzaXplb2Yoc3RydWN0IHNTaXJTbWVUa2lwQ250ck1lYXNSZXEpKTsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywKKwkJCQl0a2lwQ250ck1lYXNSZXEuYnNzSWQsCisJCQkJJnNlc3Npb25JZCk7CisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gQlNTSUQgIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKHRraXBDbnRyTWVhc1JlcS5iRW5hYmxlKQorCQlfX2xpbV9jb3VudGVyX21lYXN1cmVzKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCisJcHNlc3Npb25FbnRyeS0+YlRraXBDbnRyTWVhc0FjdGl2ZSA9IHRraXBDbnRyTWVhc1JlcS5iRW5hYmxlOworfQorCitzdGF0aWMgdm9pZAorX19saW1faGFuZGxlX3NtZV9zdG9wX2Jzc19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmKQoreworCXRTaXJTbWVTdG9wQnNzUmVxIHN0b3BCc3NSZXE7CisJdFNpclJldFN0YXR1cyBzdGF0dXM7CisJdExpbVNtZVN0YXRlcyBwcmV2U3RhdGU7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNtZXNlc3Npb25JZDsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50MTZfdCBzbWV0cmFuc2FjdGlvbklkOworCXVpbnQ4X3QgaSA9IDA7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworCisJY2RmX21lbV9jb3B5KCZzdG9wQnNzUmVxLCBwTXNnQnVmLCBzaXplb2YodFNpclNtZVN0b3BCc3NSZXEpKTsKKwlzbWVzZXNzaW9uSWQgPSBzdG9wQnNzUmVxLnNlc3Npb25JZDsKKwlzbWV0cmFuc2FjdGlvbklkID0gc3RvcEJzc1JlcS50cmFuc2FjdGlvbklkOworCisJaWYgKCFsaW1faXNfc21lX3N0b3BfYnNzX3JlcV92YWxpZChwTXNnQnVmKSkgeworCQlQRUxPR1cobGltX2xvZyhwTWFjLCBMT0dXLAorCQkgICAgICAgRkwoInJlY2VpdmVkIGludmFsaWQgU01FX1NUT1BfQlNTX1JFUSBtZXNzYWdlIikpOykKKwkJLyogU2VuZCBTdG9wIEJTUyByZXNwb25zZSB0byBob3N0ICovCisJCWxpbV9zZW5kX3NtZV9yc3AocE1hYywgZVdOSV9TTUVfU1RPUF9CU1NfUlNQLAorCQkJCSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlMsIHNtZXNlc3Npb25JZCwKKwkJCQkgc21ldHJhbnNhY3Rpb25JZCk7CisJCXJldHVybjsKKwl9CisKKwlwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsCisJCQkJc3RvcEJzc1JlcS5ic3NJZCwKKwkJCQkmc2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJRCAiKSk7CisJCWxpbV9zZW5kX3NtZV9yc3AocE1hYywgZVdOSV9TTUVfU1RPUF9CU1NfUlNQLAorCQkJCSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlMsIHNtZXNlc3Npb25JZCwKKwkJCQkgc21ldHJhbnNhY3Rpb25JZCk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfU1RPUF9CU1NfUkVRX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LAorCQkJICAgICAgMCwgMCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJaWYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX05PUk1BTF9TVEFURSB8fCAgICAvKiBBZGRlZCBGb3IgQlQgLUFNUCBTdXBwb3J0ICovCisJICAgIExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkvKioKKwkJICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIFNUT1BfQlNTX1JFUSBpbiBzdGF0ZXMKKwkJICogb3RoZXIgdGhhbiAnbm9ybWFsJyBzdGF0ZSBvciBvbiBTVEEgaW4gSW5mcmFzdHJ1Y3R1cmUKKwkJICogbW9kZS4gTG9nIGVycm9yIGFuZCByZXR1cm4gcmVzcG9uc2UgdG8gaG9zdC4KKwkJICovCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFNNRV9TVE9QX0JTU19SRVEgaW4gc3RhdGUgJVgsIGZvciByb2xlICVkIiksCisJCQlwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSwKKwkJCUdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSkpOworCQlsaW1fcHJpbnRfc21lX3N0YXRlKHBNYWMsIExPR0UsIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTsKKwkJLyogLyBTZW5kIFN0b3AgQlNTIHJlc3BvbnNlIHRvIGhvc3QgKi8KKwkJbGltX3NlbmRfc21lX3JzcChwTWFjLCBlV05JX1NNRV9TVE9QX0JTU19SU1AsCisJCQkJIGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFLCBzbWVzZXNzaW9uSWQsCisJCQkJIHNtZXRyYW5zYWN0aW9uSWQpOworCQlyZXR1cm47CisJfQorCisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKQorCQlsaW1fd3BzcGJjX2Nsb3NlKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCisJbGltX2xvZyhwTWFjLCBMT0dXLAorCQlGTCgiUkVDRUlWRUQgU1RPUF9CU1NfUkVRIHdpdGggcmVhc29uIGNvZGU9JWQiKSwKKwkJc3RvcEJzc1JlcS5yZWFzb25Db2RlKTsKKworCXByZXZTdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlOworCisJcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9JRExFX1NUQVRFOworCU1UUkFDRShtYWNfdHJhY2UKKwkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSkpOworCisJLyogVXBkYXRlIFNNRSBzZXNzaW9uIElkIGFuZCBUcmFuc2FjdGlvbiBJZCAqLworCXBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCA9IHNtZXNlc3Npb25JZDsKKwlwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkID0gc21ldHJhbnNhY3Rpb25JZDsKKworCS8qIEJUQU1QX1NUQSBhbmQgU1RBX0lOX0lCU1Mgc2hvdWxkIE5PVCBzZW5kIERpc2Fzc29jIGZyYW1lICovCisJaWYgKCFMSU1fSVNfSUJTU19ST0xFKHBzZXNzaW9uRW50cnkpICYmCisJICAgICFMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCXRTaXJNYWNBZGRyIGJjQWRkciA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworCQlpZiAoc3RvcEJzc1JlcS5yZWFzb25Db2RlID09IGVTSVJfU01FX01JQ19DT1VOVEVSX01FQVNVUkVTKQorCQkJLyogU2VuZCBkaXNhc3NvYyBhbGwgc3RhdGlvbnMgYXNzb2NpYXRlZCB0aHJ1IFRLSVAgKi8KKwkJCV9fbGltX2NvdW50ZXJfbWVhc3VyZXMocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCWVsc2UKKwkJCWxpbV9zZW5kX2Rpc2Fzc29jX21nbXRfZnJhbWUocE1hYywKKwkJCQkJCSAgICAgZVNJUl9NQUNfREVBVVRIX0xFQVZJTkdfQlNTX1JFQVNPTiwKKwkJCQkJCSAgICAgYmNBZGRyLCBwc2Vzc2lvbkVudHJ5LCBmYWxzZSk7CisJfQorCisJLyogRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpbiBTVEFSVF9CU1NfUkVRICovCisJY2RmX21lbV9mcmVlKHBzZXNzaW9uRW50cnktPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFfYnVmZik7CisJcHNlc3Npb25FbnRyeS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwRGF0YUxlbiA9IDA7CisJcHNlc3Npb25FbnRyeS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwRGF0YV9idWZmID0gTlVMTDsKKworCWNkZl9tZW1fZnJlZShwc2Vzc2lvbkVudHJ5LT5hZGRJZVBhcmFtcy5hc3NvY1Jlc3BEYXRhX2J1ZmYpOworCXBzZXNzaW9uRW50cnktPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFMZW4gPSAwOworCXBzZXNzaW9uRW50cnktPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFfYnVmZiA9IE5VTEw7CisKKwljZGZfbWVtX2ZyZWUocHNlc3Npb25FbnRyeS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwQkNORGF0YV9idWZmKTsKKwlwc2Vzc2lvbkVudHJ5LT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BCQ05EYXRhTGVuID0gMDsKKwlwc2Vzc2lvbkVudHJ5LT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BCQ05EYXRhX2J1ZmYgPSBOVUxMOworCisJLyogbGltX2RlbF9ic3MgaXMgYWxzbyBjYWxsZWQgYXMgcGFydCBvZiBjb2FsZXNjaW5nLCB3aGVuIHdlIHNlbmQgREVMIEJTUyBmb2xsb3dlZCBieSBBZGQgQnNzIG1zZy4gKi8KKwlwTWFjLT5saW0uZ0xpbUlic3NDb2FsZXNjaW5nSGFwcGVuZWQgPSBmYWxzZTsKKworCWZvciAoaSA9IDE7IGkgPCBwTWFjLT5saW0uZ0xpbUFzc29jU3RhTGltaXQ7IGkrKykgeworCQlwU3RhRHMgPQorCQkJZHBoX2dldF9oYXNoX2VudHJ5KHBNYWMsIGksICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJaWYgKE5VTEwgPT0gcFN0YURzKQorCQkJY29udGludWU7CisJCXN0YXR1cyA9IGxpbV9kZWxfc3RhKHBNYWMsIHBTdGFEcywgZmFsc2UsIHBzZXNzaW9uRW50cnkpOworCQlpZiAoZVNJUl9TVUNDRVNTID09IHN0YXR1cykgeworCQkJbGltX2RlbGV0ZV9kcGhfaGFzaF9lbnRyeShwTWFjLCBwU3RhRHMtPnN0YUFkZHIsCisJCQkJCQkgIHBTdGFEcy0+YXNzb2NJZCwgcHNlc3Npb25FbnRyeSk7CisJCQlsaW1fcmVsZWFzZV9wZWVyX2lkeChwTWFjLCBwU3RhRHMtPmFzc29jSWQsIHBzZXNzaW9uRW50cnkpOworCQl9IGVsc2UgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJsaW1fZGVsX3N0YSBmYWlsZWQgd2l0aCBTdGF0dXMgOiAlZCIpLCBzdGF0dXMpOworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJfQorCX0KKwkvKiBzZW5kIGEgZGVsQnNzIHRvIEhBTCBhbmQgd2FpdCBmb3IgYSByZXNwb25zZSAqLworCXN0YXR1cyA9IGxpbV9kZWxfYnNzKHBNYWMsIE5VTEwsIHBzZXNzaW9uRW50cnktPmJzc0lkeCwgcHNlc3Npb25FbnRyeSk7CisKKwlpZiAoc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgiZGVsQnNzIGZhaWxlZCBmb3IgYnNzICVkIiksCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+YnNzSWR4KTsKKwkJICAgICAgICkKKwkJcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBwcmV2U3RhdGU7CisKKwkJTVRSQUNFKG1hY190cmFjZQorCQkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpKTsKKworCQlsaW1fc2VuZF9zbWVfcnNwKHBNYWMsIGVXTklfU01FX1NUT1BfQlNTX1JTUCwKKwkJCQkgZVNJUl9TTUVfU1RPUF9CU1NfRkFJTFVSRSwgc21lc2Vzc2lvbklkLAorCQkJCSBzbWV0cmFuc2FjdGlvbklkKTsKKwl9Cit9CisKKy8qKgorICogX19saW1fcHJvY2Vzc19zbWVfc3RvcF9ic3NfcmVxKCkgLSBQcm9jZXNzIFNUT1BfQlNTIGZyb20gU01FCisgKiBAcE1hYzogR2xvYmFsIE1BQyBjb250ZXh0CisgKiBAcE1zZzogTWVzc2FnZSBmcm9tIFNNRQorICoKKyAqIFdyYXBwZXIgZm9yIHRoZSBmdW5jdGlvbiBfX2xpbV9oYW5kbGVfc21lX3N0b3BfYnNzX3JlcXVlc3QKKyAqIFRoaXMgbWVzc2FnZSB3aWxsIGJlIGRlZmVyZWQgdW50aWwgc29mdG1hYyBjb21lIG91dCBvZgorICogc2NhbiBtb2RlLiBNZXNzYWdlIHNob3VsZCBiZSBoYW5kbGVkIGV2ZW4gaWYgd2UgaGF2ZQorICogZGV0ZWN0ZWQgcmFkYXIgaW4gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwuCisgKgorICogUmV0dXJuOiB0cnVlIC0gSWYgd2UgY29uc3VtZWQgdGhlIGJ1ZmZlcgorICogICAgICAgICBmYWxzZSAtIElmIGhhdmUgZGVmZXJlZCB0aGUgbWVzc2FnZS4KKyAqLworCitzdGF0aWMgYm9vbCBfX2xpbV9wcm9jZXNzX3NtZV9zdG9wX2Jzc19yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisJaWYgKF9fbGltX2lzX2RlZmVyZWRfbXNnX2Zvcl9sZWFybihwTWFjLCBwTXNnKSkgeworCQkvKioKKwkJICogSWYgbWVzc2FnZSBkZWZlcmVkLCBidWZmZXIgaXMgbm90IGNvbnN1bWVkIHlldC4KKwkJICogU28gcmV0dXJuIGZhbHNlCisJCSAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCV9fbGltX2hhbmRsZV9zbWVfc3RvcF9ic3NfcmVxdWVzdChwTWFjLCAodWludDMyX3QgKikgcE1zZy0+Ym9keXB0cik7CisJcmV0dXJuIHRydWU7Cit9IC8qKiogZW5kIF9fbGltX3Byb2Nlc3Nfc21lX3N0b3BfYnNzX3JlcSgpICoqKi8KKwordm9pZCBsaW1fcHJvY2Vzc19zbWVfZGVsX2Jzc19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgdWludDMyX3QgYm9keSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworCSh2b2lkKWJvZHk7CisJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisJbGltX2lic3NfZGVsZXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCWRwaF9oYXNoX3RhYmxlX2NsYXNzX2luaXQocE1hYywgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWxpbV9kZWxldGVfcHJlX2F1dGhfbGlzdChwTWFjKTsKKwlsaW1fc2VuZF9zbWVfcnNwKHBNYWMsIGVXTklfU01FX1NUT1BfQlNTX1JTUCwgZVNJUl9TTUVfU1VDQ0VTUywKKwkJCSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQsCisJCQkgcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIF9fbGltX3Byb2Nlc3Nfc21lX2Fzc29jX2NuZl9uZXcoKSAtIHByb2Nlc3Mgc21lIGFzc29jL3JlYXNzb2MgY25mCisgKgorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqIEBtc2dfdHlwZTogbWVzc2FnZSB0eXBlCisgKiBAbXNnX2J1ZjogcG9pbnRlciB0byB0aGUgU01FIG1lc3NhZ2UgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFNNRV9BU1NPQ19DTkYvU01FX1JFQVNTT0NfQ05GCisgKiBpbiBCVEFNUCBBUC4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworCit2b2lkIF9fbGltX3Byb2Nlc3Nfc21lX2Fzc29jX2NuZl9uZXcodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3QgbXNnX3R5cGUsCisJCQkJdWludDMyX3QgKm1zZ19idWYpCit7CisJdFNpclNtZUFzc29jQ25mIGFzc29jX2NuZjsKKwl0cERwaEhhc2hOb2RlIHN0YV9kcyA9IE5VTEw7CisJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSA9IE5VTEw7CisJdWludDhfdCBzZXNzaW9uX2lkOworCXRwU2lyQXNzb2NSZXEgYXNzb2NfcmVxOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJtc2dfYnVmIGlzIE5VTEwgIikpOworCQlnb3RvIGVuZDsKKwl9CisKKwljZGZfbWVtX2NvcHkoJmFzc29jX2NuZiwgbXNnX2J1Ziwgc2l6ZW9mKHN0cnVjdCBzU2lyU21lQXNzb2NDbmYpKTsKKwlpZiAoIV9fbGltX2lzX3NtZV9hc3NvY19jbmZfdmFsaWQoJmFzc29jX2NuZikpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlJlY2VpdmVkIGludmFsaWQgU01FX1JFKEFTU09DKV9DTkYgbWVzc2FnZSAiKSk7CisJCWdvdG8gZW5kOworCX0KKworCXNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQobWFjX2N0eCwgYXNzb2NfY25mLmJzc0lkLAorCQkJJnNlc3Npb25faWQpOworCWlmIChzZXNzaW9uX2VudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIGJzc0lkIikpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoKCFMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSAmJgorCSAgICAhTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB8fAorCSAgICAoKHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX05PUk1BTF9TVEFURSkgJiYKKwkgICAgKHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlICE9CisJCQllTElNX1NNRV9OT1JNQUxfQ0hBTk5FTF9TQ0FOX1NUQVRFKSkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgKKwkJCSJSY3ZkIHVuZXhwZWN0ZWQgbXNnICVYIGluIHN0YXRlICVYLCBpbiByb2xlICVYIiksCisJCQltc2dfdHlwZSwgc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUsCisJCQlHRVRfTElNX1NZU1RFTV9ST0xFKHNlc3Npb25fZW50cnkpKTsKKwkJZ290byBlbmQ7CisJfQorCXN0YV9kcyA9IGRwaF9nZXRfaGFzaF9lbnRyeShtYWNfY3R4LCBhc3NvY19jbmYuYWlkLAorCQkJJnNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWlmIChzdGFfZHMgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKAorCQkJIlJjdmQgaW52YWxpZCBtc2cgJVggZHVlIHRvIG5vIFNUQSBjdHgsIGFpZCAlZCwgcGVlciAiKSwKKwkJCQltc2dfdHlwZSwgYXNzb2NfY25mLmFpZCk7CisJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCBhc3NvY19jbmYucGVlck1hY0FkZHIsIExPRzEpOworCisJCS8qCisJCSAqIHNlbmQgYSBESVNBU1NPQ19JTkQgbWVzc2FnZSB0byBXU00gdG8gbWFrZSBzdXJlCisJCSAqIHRoZSBzdGF0ZSBpbiBXU00gYW5kIExJTSBpcyB0aGUgc2FtZQorCQkgKi8KKwkJbGltX3NlbmRfc21lX2Rpc2Fzc29jX250ZihtYWNfY3R4LCBhc3NvY19jbmYucGVlck1hY0FkZHIsCisJCQkJZVNJUl9TTUVfU1RBX05PVF9BU1NPQ0lBVEVELAorCQkJCWVMSU1fUEVFUl9FTlRJVFlfRElTQVNTT0MsIGFzc29jX2NuZi5haWQsCisJCQkJc2Vzc2lvbl9lbnRyeS0+c21lU2Vzc2lvbklkLAorCQkJCXNlc3Npb25fZW50cnktPnRyYW5zYWN0aW9uSWQsCisJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCWdvdG8gZW5kOworCX0KKwlpZiAoIWNkZl9tZW1fY29tcGFyZSgodWludDhfdCAqKXN0YV9kcy0+c3RhQWRkciwKKwkJCQkodWludDhfdCAqKSBhc3NvY19jbmYucGVlck1hY0FkZHIsCisJCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgKKwkJCQkicGVlck1hY0FkZHIgbWlzbWF0Y2hlZCBmb3IgYWlkICVkLCBwZWVyICIpLAorCQkJCWFzc29jX2NuZi5haWQpOworCQlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwgYXNzb2NfY25mLnBlZXJNYWNBZGRyLCBMT0cxKTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKChzdGFfZHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0gZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFKSB8fAorCQkoKHN0YV9kcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlID09IExJTV9BU1NPQykgJiYKKwkJIChtc2dfdHlwZSAhPSBlV05JX1NNRV9BU1NPQ19DTkYpKSB8fAorCQkoKHN0YV9kcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlID09IExJTV9SRUFTU09DKSAmJgorCQkgKG1zZ190eXBlICE9IGVXTklfU01FX0FTU09DX0NORikpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoCisJCQkibm90IGluIE1MTV9XVF9BU1NPQ19DTkZfU1RBVEUsIGZvciBhaWQgJWQsIHBlZXIiCisJCQkiU3RhRCBtbG1TdGF0ZSA6ICVkIiksCisJCQlhc3NvY19jbmYuYWlkLCBzdGFfZHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpOworCQlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwgYXNzb2NfY25mLnBlZXJNYWNBZGRyLCBMT0cxKTsKKwkJZ290byBlbmQ7CisJfQorCS8qCisJICogRGVhY3RpdmF0ZS9kZWxldCBDTkZfV0FJVCB0aW1lciBzaW5jZSBBU1NPQ19DTkYKKwkgKiBoYXMgYmVlbiByZWNlaXZlZAorCSAqLworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlJlY2VpdmVkIFNNRV9BU1NPQ19DTkYuIERlbGV0ZSBUaW1lciIpKTsKKwlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3Blcl9zdGFfaWRfdGltZXIobWFjX2N0eCwKKwkJCWVMSU1fQ05GX1dBSVRfVElNRVIsIHN0YV9kcy0+YXNzb2NJZCk7CisKKwlpZiAoYXNzb2NfY25mLnN0YXR1c0NvZGUgPT0gZVNJUl9TTUVfU1VDQ0VTUykgeworCQkvKgorCQkgKiBJbiBCVEFNUC1BUCwgUEUgYWxyZWFkeSBmaW5pc2hlZCB0aGUgV01BX0FERF9TVEEgc2VxdWVuY2UKKwkJICogd2hlbiBpdCBoYWQgcmVjZWl2ZWQgQXNzb2MgUmVxdWVzdCBmcmFtZS4gTm93LCBQRSBqdXN0IG5lZWRzCisJCSAqIHRvIHNlbmQgYXNzb2NpYXRpb24gcnNwIGZyYW1lIHRvIHRoZSByZXF1ZXN0aW5nIEJUQU1QLVNUQS4KKwkJICovCisJCXN0YV9kcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9CisJCQllTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFOworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgic2VuZGluZyBBc3NvYyBSc3AgZnJhbWUgdG8gU1RBIChhc3NvYyBpZD0lZCkgIiksCisJCQlzdGFfZHMtPmFzc29jSWQpOworCQlsaW1fc2VuZF9hc3NvY19yc3BfbWdtdF9mcmFtZShtYWNfY3R4LCBlU0lSX1NVQ0NFU1MsCisJCQkJCXN0YV9kcy0+YXNzb2NJZCwgc3RhX2RzLT5zdGFBZGRyLAorCQkJCQlzdGFfZHMtPm1sbVN0YUNvbnRleHQuc3ViVHlwZSwgc3RhX2RzLAorCQkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJZ290byBlbmQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU01FX0FTU09DX0NORiBzdGF0dXMgaXMgbm9uLXN1Y2Nlc3MsIHNvIFNUQSBpcyBub3QgYWxsb3dlZAorCQkgKiB0byBiZSBhc3NvY2lhdGVkIHNpbmNlIHRoZSBIQUwgc3RhIGVudHJ5IGlzIGNyZWF0ZWQgZm9yCisJCSAqIGRlbmllZCBTVEEgd2UgbmVlZCB0byByZW1vdmUgdGhpcyBIQUwgZW50cnkuCisJCSAqIFNvIHRvIGRvIHRoYXQgc2V0IHVwZGF0ZUNvbnRleHQgdG8gMQorCQkgKi8KKwkJaWYgKCFzdGFfZHMtPm1sbVN0YUNvbnRleHQudXBkYXRlQ29udGV4dCkKKwkJCXN0YV9kcy0+bWxtU3RhQ29udGV4dC51cGRhdGVDb250ZXh0ID0gMTsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIlJlY3YgQXNzb2MgQ25mLCBzdGF0dXMgQ29kZSA6ICVkKGFzc29jIGlkPSVkKSAiKSwKKwkJCWFzc29jX2NuZi5zdGF0dXNDb2RlLCBzdGFfZHMtPmFzc29jSWQpOworCQlsaW1fcmVqZWN0X2Fzc29jaWF0aW9uKG1hY19jdHgsIHN0YV9kcy0+c3RhQWRkciwKKwkJCQkgICAgICAgc3RhX2RzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisJCQkJICAgICAgIHRydWUsIHN0YV9kcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKwkJCQkgICAgICAgc3RhX2RzLT5hc3NvY0lkLCB0cnVlLAorCQkJCSAgICAgICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsCisJCQkJICAgICAgIHNlc3Npb25fZW50cnkpOworCX0KK2VuZDoKKwlpZiAoKChzZXNzaW9uX2VudHJ5ICE9IE5VTEwpICYmIChzdGFfZHMgIT0gTlVMTCkpICYmCisJCShzZXNzaW9uX2VudHJ5LT5wYXJzZWRBc3NvY1JlcVtzdGFfZHMtPmFzc29jSWRdICE9IE5VTEwpKSB7CisJCWFzc29jX3JlcSA9ICh0cFNpckFzc29jUmVxKQorCQkJc2Vzc2lvbl9lbnRyeS0+cGFyc2VkQXNzb2NSZXFbc3RhX2RzLT5hc3NvY0lkXTsKKwkJaWYgKGFzc29jX3JlcS0+YXNzb2NSZXFGcmFtZSkgeworCQkJY2RmX21lbV9mcmVlKGFzc29jX3JlcS0+YXNzb2NSZXFGcmFtZSk7CisJCQlhc3NvY19yZXEtPmFzc29jUmVxRnJhbWUgPSBOVUxMOworCQl9CisJCWNkZl9tZW1fZnJlZShzZXNzaW9uX2VudHJ5LT5wYXJzZWRBc3NvY1JlcVtzdGFfZHMtPmFzc29jSWRdKTsKKwkJc2Vzc2lvbl9lbnRyeS0+cGFyc2VkQXNzb2NSZXFbc3RhX2RzLT5hc3NvY0lkXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9hZGR0c19yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYpCit7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisJdFNpck1hY0FkZHIgcGVlck1hYzsKKwl0cFNpckFkZHRzUmVxIHBTaXJBZGR0czsKKwl1aW50MzJfdCB0aW1lb3V0OworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogUEUgc2Vzc2lvbklkICovCisJdWludDhfdCBzbWVzZXNzaW9uSWQ7CisJdWludDE2X3Qgc21ldHJhbnNhY3Rpb25JZDsKKworCWlmIChwTXNnQnVmID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlsaW1fZ2V0X3Nlc3Npb25faW5mbyhwTWFjLCAodWludDhfdCAqKSBwTXNnQnVmLCAmc21lc2Vzc2lvbklkLAorCQkJICAgICAmc21ldHJhbnNhY3Rpb25JZCk7CisKKwlwU2lyQWRkdHMgPSAodHBTaXJBZGR0c1JlcSkgcE1zZ0J1ZjsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywKKwkJCQlwU2lyQWRkdHMtPmJzc0lkLAorCQkJCSZzZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCAiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gYnNzSWQiKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAgICAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19BRERUU19SRVFfRVZFTlQsIHBzZXNzaW9uRW50cnksIDAsCisJCQkgICAgICAwKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisKKwkvKiBpZiBzdGEKKwkgKiAgLSB2ZXJpZnkgYXNzb2Mgc3RhdGUKKwkgKiAgLSBzZW5kIGFkZHRzIHJlcXVlc3QgdG8gYXAKKwkgKiAgLSB3YWl0IGZvciBhZGR0cyByZXNwb25zZSBmcm9tIGFwCisJICogaWYgYXAsIGp1c3QgaWdub3JlIHdpdGggZXJyb3IgbG9nCisJICovCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwKKwkJICAgICAgIEZMKCJSZWNlaXZlZCBTTUVfQUREVFNfUkVRIChUU2lkICVkLCBVUCAlZCkiKSwKKwkJICAgICAgIHBTaXJBZGR0cy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLnRzaWQsCisJCSAgICAgICBwU2lyQWRkdHMtPnJlcS50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbyk7CisJICAgICAgICkKKworCWlmICghTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpICYmCisJICAgICFMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsICJBZGRUcyByZWNlaXZlZCBvbiBBUCAtIGlnbm9yaW5nIik7KQorCQlsaW1fc2VuZF9zbWVfYWRkdHNfcnNwKHBNYWMsIHBTaXJBZGR0cy0+cnNwUmVxZCwgZVNJUl9GQUlMVVJFLAorCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LCBwU2lyQWRkdHMtPnJlcS50c3BlYywKKwkJCQkgICAgICAgc21lc2Vzc2lvbklkLCBzbWV0cmFuc2FjdGlvbklkKTsKKwkJcmV0dXJuOworCX0KKwkvKiBJZ25vcmUgdGhlIHJlcXVlc3QgaWYgU1RBIGlzIGluIDExQiBtb2RlLiAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExQikgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgICJBZGRUUyByZWNlaXZlZCB3aGlsZSBEb3QxMU1vZGUgaXMgMTFCIC0gaWdub3JpbmciKTsKKwkJICAgICAgICkKKwkJbGltX3NlbmRfc21lX2FkZHRzX3JzcChwTWFjLCBwU2lyQWRkdHMtPnJzcFJlcWQsIGVTSVJfRkFJTFVSRSwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeSwgcFNpckFkZHRzLT5yZXEudHNwZWMsCisJCQkJICAgICAgIHNtZXNlc3Npb25JZCwgc21ldHJhbnNhY3Rpb25JZCk7CisJCXJldHVybjsKKwl9CisKKwlwU3RhRHMgPQorCQlkcGhfZ2V0X2hhc2hfZW50cnkocE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsCisJCQkJICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisJaWYgKHBTdGFEcyA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsICJDYW5ub3QgZmluZCBBUCBjb250ZXh0IGZvciBhZGR0cyByZXEiKTsKKwkJICAgICAgICkKKwkJbGltX3NlbmRfc21lX2FkZHRzX3JzcChwTWFjLCBwU2lyQWRkdHMtPnJzcFJlcWQsIGVTSVJfRkFJTFVSRSwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeSwgcFNpckFkZHRzLT5yZXEudHNwZWMsCisJCQkJICAgICAgIHNtZXNlc3Npb25JZCwgc21ldHJhbnNhY3Rpb25JZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKCFwU3RhRHMtPnZhbGlkKSB8fCAocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9CisJICAgIGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgIkFkZFRzIHJlY2VpdmVkIGluIGludmFsaWQgTUxNIHN0YXRlIik7CisJCWxpbV9zZW5kX3NtZV9hZGR0c19yc3AocE1hYywgcFNpckFkZHRzLT5yc3BSZXFkLCBlU0lSX0ZBSUxVUkUsCisJCQkJICAgICAgIHBzZXNzaW9uRW50cnksIHBTaXJBZGR0cy0+cmVxLnRzcGVjLAorCQkJCSAgICAgICBzbWVzZXNzaW9uSWQsIHNtZXRyYW5zYWN0aW9uSWQpOworCQlyZXR1cm47CisJfQorCisJcFNpckFkZHRzLT5yZXEud3NtVHNwZWNQcmVzZW50ID0gMDsKKwlwU2lyQWRkdHMtPnJlcS53bWVUc3BlY1ByZXNlbnQgPSAwOworCXBTaXJBZGR0cy0+cmVxLmxsZVRzcGVjUHJlc2VudCA9IDA7CisKKwlpZiAoKHBTdGFEcy0+d3NtRW5hYmxlZCkgJiYKKwkgICAgKHBTaXJBZGR0cy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSAhPQorCSAgICAgU0lSX01BQ19BQ0NFU1NQT0xJQ1lfRURDQSkpCisJCXBTaXJBZGR0cy0+cmVxLndzbVRzcGVjUHJlc2VudCA9IDE7CisJZWxzZSBpZiAocFN0YURzLT53bWVFbmFibGVkKQorCQlwU2lyQWRkdHMtPnJlcS53bWVUc3BlY1ByZXNlbnQgPSAxOworCWVsc2UgaWYgKHBTdGFEcy0+bGxlRW5hYmxlZCkKKwkJcFNpckFkZHRzLT5yZXEubGxlVHNwZWNQcmVzZW50ID0gMTsKKwllbHNlIHsKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywgRkwoIkFERFRTX1JFUSBpZ25vcmUgLSBxb3MgaXMgZGlzYWJsZWQiKSk7CisJCSAgICAgICApCisJCWxpbV9zZW5kX3NtZV9hZGR0c19yc3AocE1hYywgcFNpckFkZHRzLT5yc3BSZXFkLCBlU0lSX0ZBSUxVUkUsCisJCQkJICAgICAgIHBzZXNzaW9uRW50cnksIHBTaXJBZGR0cy0+cmVxLnRzcGVjLAorCQkJCSAgICAgICBzbWVzZXNzaW9uSWQsIHNtZXRyYW5zYWN0aW9uSWQpOworCQlyZXR1cm47CisJfQorCisJaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFKSAmJgorCSAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSJBZGRUcyByZWNlaXZlZCBpbiBpbnZhbGlkIExJTXNtZSBzdGF0ZSAoJWQpIiwKKwkJCXBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTsKKwkJbGltX3NlbmRfc21lX2FkZHRzX3JzcChwTWFjLCBwU2lyQWRkdHMtPnJzcFJlcWQsIGVTSVJfRkFJTFVSRSwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeSwgcFNpckFkZHRzLT5yZXEudHNwZWMsCisJCQkJICAgICAgIHNtZXNlc3Npb25JZCwgc21ldHJhbnNhY3Rpb25JZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocE1hYy0+bGltLmdMaW1BZGR0c1NlbnQpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJIkFkZHRzICh0b2tlbiAlZCwgdHNpZCAlZCwgdXAgJWQpIGlzIHN0aWxsIHBlbmRpbmciLAorCQkJcE1hYy0+bGltLmdMaW1BZGR0c1JlcS5yZXEuZGlhbG9nVG9rZW4sCisJCQlwTWFjLT5saW0uZ0xpbUFkZHRzUmVxLnJlcS50c3BlYy50c2luZm8udHJhZmZpYy50c2lkLAorCQkJcE1hYy0+bGltLmdMaW1BZGR0c1JlcS5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMuCisJCQl1c2VyUHJpbyk7CisJCWxpbV9zZW5kX3NtZV9hZGR0c19yc3AocE1hYywgcFNpckFkZHRzLT5yc3BSZXFkLCBlU0lSX0ZBSUxVUkUsCisJCQkJICAgICAgIHBzZXNzaW9uRW50cnksIHBTaXJBZGR0cy0+cmVxLnRzcGVjLAorCQkJCSAgICAgICBzbWVzZXNzaW9uSWQsIHNtZXRyYW5zYWN0aW9uSWQpOworCQlyZXR1cm47CisJfQorCisJc2lyX2NvcHlfbWFjX2FkZHIocGVlck1hYywgcHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisJLyogc2F2ZSB0aGUgYWRkdHMgcmVxdWVzdCAqLworCXBNYWMtPmxpbS5nTGltQWRkdHNTZW50ID0gdHJ1ZTsKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBNYWMtPmxpbS5nTGltQWRkdHNSZXEsCisJCSAgICAgKHVpbnQ4X3QgKikgcFNpckFkZHRzLCBzaXplb2YodFNpckFkZHRzUmVxKSk7CisKKwkvKiBzaGlwIG91dCB0aGUgbWVzc2FnZSBub3cgKi8KKwlsaW1fc2VuZF9hZGR0c19yZXFfYWN0aW9uX2ZyYW1lKHBNYWMsIHBlZXJNYWMsICZwU2lyQWRkdHMtPnJlcSwKKwkJCQkJcHNlc3Npb25FbnRyeSk7CisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgIlNlbnQgQUREVFMgcmVxdWVzdCIpOykKKwkvKiBzdGFydCBhIHRpbWVyIHRvIHdhaXQgZm9yIHRoZSByZXNwb25zZSAqLworCWlmIChwU2lyQWRkdHMtPnRpbWVvdXQpCisJCXRpbWVvdXQgPSBwU2lyQWRkdHMtPnRpbWVvdXQ7CisJZWxzZSBpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0FERFRTX1JTUF9USU1FT1VULCAmdGltZW91dCkgIT0KKwkJIGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiVW5hYmxlIHRvIGdldCBDZmcgcGFyYW0gJWQgKEFkZHRzIFJzcCBUaW1lb3V0KSIpLAorCQkJV05JX0NGR19BRERUU19SU1BfVElNRU9VVCk7CisJCXJldHVybjsKKwl9CisKKwl0aW1lb3V0ID0gU1lTX01TX1RPX1RJQ0tTKHRpbWVvdXQpOworCWlmICh0eF90aW1lcl9jaGFuZ2UoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFkZHRzUnNwVGltZXIsIHRpbWVvdXQsIDApCisJICAgICE9IFRYX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiQWRkdHNSc3AgdGltZXIgY2hhbmdlIGZhaWxlZCEiKSk7CisJCXJldHVybjsKKwl9CisJcE1hYy0+bGltLmdMaW1BZGR0c1JzcFRpbWVyQ291bnQrKzsKKwlpZiAodHhfdGltZXJfY2hhbmdlX2NvbnRleHQoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFkZHRzUnNwVGltZXIsCisJCQkJICAgIHBNYWMtPmxpbS5nTGltQWRkdHNSc3BUaW1lckNvdW50KSAhPQorCSAgICBUWF9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkFkZHRzUnNwIHRpbWVyIGNoYW5nZSBmYWlsZWQhIikpOworCQlyZXR1cm47CisJfQorCU1UUkFDRShtYWNfdHJhY2UKKwkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJICAgICAgIGVMSU1fQUREVFNfUlNQX1RJTUVSKSk7CisKKwkvKiBhZGQgdGhlIHNlc3Npb25JZCB0byB0aGUgdGltZXIgb2JqZWN0ICovCisJcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQWRkdHNSc3BUaW1lci5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1BZGR0c1JzcFRpbWVyKSAhPQorCSAgICBUWF9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkFkZHRzUnNwIHRpbWVyIGFjdGl2YXRpb24gZmFpbGVkISIpKTsKKwkJcmV0dXJuOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIF9fbGltX3Byb2Nlc3Nfc21lX2RlbHRzX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl1aW50OF90IGFjOworCXRTaXJNYWNUU0luZm8gKnBUc2luZm87CisJdHBTaXJEZWx0c1JlcSBwRGVsdHNSZXEgPSAodHBTaXJEZWx0c1JlcSkgcE1zZ0J1ZjsKKwl0cERwaEhhc2hOb2RlIHBTdGFEcyA9IE5VTEw7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50MzJfdCBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisJdWludDhfdCBzbWVzZXNzaW9uSWQ7CisJdWludDE2X3Qgc21ldHJhbnNhY3Rpb25JZDsKKworCWxpbV9nZXRfc2Vzc2lvbl9pbmZvKHBNYWMsICh1aW50OF90ICopIHBNc2dCdWYsICZzbWVzZXNzaW9uSWQsCisJCQkgICAgICZzbWV0cmFuc2FjdGlvbklkKTsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywKKwkJCQlwRGVsdHNSZXEtPmJzc0lkLAorCQkJCSZzZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCAiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gYnNzSWQiKTsKKwkJc3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQlnb3RvIGVuZDsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfREVMVFNfUkVRX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAwLAorCQkJICAgICAgMCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPQorCSAgICBsaW1fdmFsaWRhdGVfZGVsdHNfcmVxKHBNYWMsIHBEZWx0c1JlcSwgcGVlck1hY0FkZHIsIHBzZXNzaW9uRW50cnkpKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJsaW1fdmFsaWRhdGVfZGVsdHNfcmVxIGZhaWxlZCIpKTspCisJCXN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKwkJbGltX3NlbmRfc21lX2RlbHRzX3JzcChwTWFjLCBwRGVsdHNSZXEsIGVTSVJfRkFJTFVSRSwgcHNlc3Npb25FbnRyeSwKKwkJCQkgICAgICAgc21lc2Vzc2lvbklkLCBzbWV0cmFuc2FjdGlvbklkKTsKKwkJcmV0dXJuOworCX0KKworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIlNlbnQgREVMVFMgcmVxdWVzdCB0byBzdGF0aW9uIHdpdGggYXNzb2NJZCA9ICVkIE1hY0FkZHIgPSAiCisJCU1BQ19BRERSRVNTX1NUUiksCisJCXBEZWx0c1JlcS0+YWlkLCBNQUNfQUREUl9BUlJBWShwZWVyTWFjQWRkcikpOworCisJbGltX3NlbmRfZGVsdHNfcmVxX2FjdGlvbl9mcmFtZShwTWFjLCBwZWVyTWFjQWRkciwKKwkJCQkJcERlbHRzUmVxLT5yZXEud21lVHNwZWNQcmVzZW50LAorCQkJCQkmcERlbHRzUmVxLT5yZXEudHNpbmZvLAorCQkJCQkmcERlbHRzUmVxLT5yZXEudHNwZWMsIHBzZXNzaW9uRW50cnkpOworCisJcFRzaW5mbyA9CisJCXBEZWx0c1JlcS0+cmVxLndtZVRzcGVjUHJlc2VudCA/ICZwRGVsdHNSZXEtPnJlcS50c3BlYy4KKwkJdHNpbmZvIDogJnBEZWx0c1JlcS0+cmVxLnRzaW5mbzsKKworCS8qIFdlJ3ZlIHN1Y2Nlc3NmdWxseSBzZW5kIERFTFRTIGZyYW1lIHRvIEFQLiBVcGRhdGUgdGhlCisJICogZHluYW1pYyBVQVBTRCBtYXNrLiBUaGUgQUMgZm9yIHRoaXMgVFNQRUMgdG8gYmUgZGVsZXRlZAorCSAqIGlzIG5vIGxvbmdlciB0cmlnZ2VyIGVuYWJsZWQgb3IgZGVsaXZlcnkgZW5hYmxlZAorCSAqLworCWxpbV9zZXRfdHNwZWNfdWFwc2RfbWFza19wZXJfc2Vzc2lvbihwTWFjLCBwc2Vzc2lvbkVudHJ5LAorCQkJCQkgICAgIHBUc2luZm8sIENMRUFSX1VBUFNEX01BU0spOworCisJLyogV2UncmUgZGVsZXRpbmcgdGhlIFRTUEVDLCBzbyB0aGlzIHBhcnRpY3VsYXIgQUMgaXMgbm8gbG9uZ2VyCisJICogYWRtaXR0ZWQuICBQRSBuZWVkcyB0byBkb3duZ3JhZGUgdGhlIEVEQ0EKKwkgKiBwYXJhbWV0ZXJzKGZvciB0aGUgQUMgZm9yIHdoaWNoIFRTIGlzIGJlaW5nIGRlbGV0ZWQpIHRvIHRoZQorCSAqIG5leHQgYmVzdCBBQyBmb3Igd2hpY2ggQUNNIGlzIG5vdCBlbmFibGVkLCBhbmQgc2VuZCB0aGUKKwkgKiB1cGRhdGVkIHZhbHVlcyB0byBIQUwuCisJICovCisJYWMgPSB1cFRvQWMocFRzaW5mby0+dHJhZmZpYy51c2VyUHJpbyk7CisKKwlpZiAocFRzaW5mby0+dHJhZmZpYy5kaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LKSB7CisJCXBzZXNzaW9uRW50cnktPmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9VUExJTktdICY9CisJCQl+KDEgPDwgYWMpOworCX0gZWxzZSBpZiAocFRzaW5mby0+dHJhZmZpYy5kaXJlY3Rpb24gPT0KKwkJICAgU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LKSB7CisJCXBzZXNzaW9uRW50cnktPmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9ETkxJTktdICY9CisJCQl+KDEgPDwgYWMpOworCX0gZWxzZSBpZiAocFRzaW5mby0+dHJhZmZpYy5kaXJlY3Rpb24gPT0KKwkJICAgU0lSX01BQ19ESVJFQ1RJT05fQklESVIpIHsKKwkJcHNlc3Npb25FbnRyeS0+Z0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX1VQTElOS10gJj0KKwkJCX4oMSA8PCBhYyk7CisJCXBzZXNzaW9uRW50cnktPmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9ETkxJTktdICY9CisJCQl+KDEgPDwgYWMpOworCX0KKworCWxpbV9zZXRfYWN0aXZlX2VkY2FfcGFyYW1zKHBNYWMsIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zLAorCQkJCSAgIHBzZXNzaW9uRW50cnkpOworCisJcFN0YURzID0KKwkJZHBoX2dldF9oYXNoX2VudHJ5KHBNYWMsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLAorCQkJCSAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAocFN0YURzICE9IE5VTEwpIHsKKwkJbGltX3NlbmRfZWRjYV9wYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmUsCisJCQkJICAgICBwU3RhRHMtPmJzc0lkKTsKKwkJc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCX0gZWxzZSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIlNlbGYgZW50cnkgbWlzc2luZyBpbiBIYXNoIFRhYmxlICIpKTsKKwkJc3RhdHVzID0gZVNJUl9GQUlMVVJFOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKKwlsaW1fc2VuZF9zbWVfdHNtX2llX2luZChwTWFjLCBwc2Vzc2lvbkVudHJ5LCAwLCAwLCAwKTsKKyNlbHNlCisJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihwTWFjLCBlTElNX1RTTV9USU1FUik7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKyNlbmRpZgorCisJLyogc2VuZCBhbiBzbWUgcmVzcG9uc2UgYmFjayAqLworZW5kOgorCWxpbV9zZW5kX3NtZV9kZWx0c19yc3AocE1hYywgcERlbHRzUmVxLCBlU0lSX1NVQ0NFU1MsIHBzZXNzaW9uRW50cnksCisJCQkgICAgICAgc21lc2Vzc2lvbklkLCBzbWV0cmFuc2FjdGlvbklkKTsKK30KKwordm9pZCBsaW1fcHJvY2Vzc19zbWVfYWRkdHNfcnNwX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgcGFyYW0pCit7CisJLyogZmV0Y2ggdGhlIHNlc3Npb25FbnRyeSBiYXNlZCBvbiB0aGUgc2Vzc2lvbklkICovCisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwlwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQocE1hYywKKwkJCQlwTWFjLT5saW0ubGltVGltZXJzLmdMaW1BZGR0c1JzcFRpbWVyLgorCQkJCXNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkgJiYKKwkgICAgIUxJTV9JU19CVF9BTVBfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCAiQWRkdHNSc3BUaW1lb3V0IGluIG5vbi1TdGEgcm9sZSAoJWQpIiwKKwkJCUdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSkpOworCQlwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCA9IGZhbHNlOworCQlyZXR1cm47CisJfQorCisJaWYgKCFwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csICJBZGR0c1JzcFRpbWVvdXQgYnV0IG5vIEFkZHRzU2VudCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBhcmFtICE9IHBNYWMtPmxpbS5nTGltQWRkdHNSc3BUaW1lckNvdW50KSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJJbnZhbGlkIEFkZHRzUnNwIFRpbWVyIGNvdW50ICVkIChleHAgJWQpIiksIHBhcmFtLAorCQkJcE1hYy0+bGltLmdMaW1BZGR0c1JzcFRpbWVyQ291bnQpOworCQlyZXR1cm47CisJfQorCS8qIHRoaXMgYSByZWFsIHJlc3BvbnNlIHRpbWVvdXQgKi8KKwlwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCA9IGZhbHNlOworCXBNYWMtPmxpbS5nTGltQWRkdHNSc3BUaW1lckNvdW50Kys7CisKKwlsaW1fc2VuZF9zbWVfYWRkdHNfcnNwKHBNYWMsIHRydWUsIGVTSVJfU01FX0FERFRTX1JTUF9USU1FT1VULAorCQkJICAgICAgIHBzZXNzaW9uRW50cnksIHBNYWMtPmxpbS5nTGltQWRkdHNSZXEucmVxLnRzcGVjLAorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKK30KKworLyoqCisgKiBfX2xpbV9wcm9jZXNzX3NtZV9nZXRfc3RhdGlzdGljc19yZXF1ZXN0KCkKKyAqCisgKioqRlVOQ1RJT046CisgKgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBNc2dCdWYgIEEgcG9pbnRlciB0byB0aGUgU01FIG1lc3NhZ2UgYnVmZmVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK19fbGltX3Byb2Nlc3Nfc21lX2dldF9zdGF0aXN0aWNzX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYpCit7CisJdHBBbmlHZXRQRVN0YXRzUmVxIHBQRVN0YXRzUmVxOworCXRTaXJNc2dRIG1zZ1E7CisKKwlwUEVTdGF0c1JlcSA9ICh0cEFuaUdldFBFU3RhdHNSZXEpIHBNc2dCdWY7CisKKwltc2dRLnR5cGUgPSBXTUFfR0VUX1NUQVRJU1RJQ1NfUkVROworCisJbXNnUS5yZXNlcnZlZCA9IDA7CisJbXNnUS5ib2R5cHRyID0gcE1zZ0J1ZjsKKwltc2dRLmJvZHl2YWwgPSAwOworCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIE5PX1NFU1NJT04sIG1zZ1EudHlwZSkpOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSAod21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ1EpKSkgeworCQljZGZfbWVtX2ZyZWUocE1zZ0J1Zik7CisJCXBNc2dCdWYgPSBOVUxMOworCQlsaW1fbG9nKHBNYWMsIExPR1AsICJVbmFibGUgdG8gZm9yd2FyZCByZXF1ZXN0Iik7CisJCXJldHVybjsKKwl9CisKKwlyZXR1cm47Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisvKioKKyAgICpGVU5DVElPTjogX19saW1fcHJvY2Vzc19zbWVfZ2V0X3RzbV9zdGF0c19yZXF1ZXN0KCkKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitfX2xpbV9wcm9jZXNzX3NtZV9nZXRfdHNtX3N0YXRzX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYpCit7CisJdFNpck1zZ1EgbXNnUTsKKworCW1zZ1EudHlwZSA9IFdNQV9UU01fU1RBVFNfUkVROworCW1zZ1EucmVzZXJ2ZWQgPSAwOworCW1zZ1EuYm9keXB0ciA9IHBNc2dCdWY7CisJbXNnUS5ib2R5dmFsID0gMDsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBOT19TRVNTSU9OLCBtc2dRLnR5cGUpKTsKKworCWlmIChlU0lSX1NVQ0NFU1MgIT0gKHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2dRKSkpIHsKKwkJY2RmX21lbV9mcmVlKHBNc2dCdWYpOworCQlwTXNnQnVmID0gTlVMTDsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCAiVW5hYmxlIHRvIGZvcndhcmQgcmVxdWVzdCIpOworCQlyZXR1cm47CisJfQorfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKworc3RhdGljIHZvaWQKK19fbGltX3Byb2Nlc3Nfc21lX3VwZGF0ZV9hcHdwc2lfZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYpCit7CisJdHBTaXJVcGRhdGVBUFdQU0lFc1JlcSBwVXBkYXRlQVBXUFNJRXNSZXE7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBQRSBzZXNzaW9uSUQgKi8KKworCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJyZWNlaXZlZCBVUERBVEVfQVBXUFNJRXNfUkVRIG1lc3NhZ2UiKSk7KTsKKworCWlmIChwTXNnQnVmID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlwVXBkYXRlQVBXUFNJRXNSZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclVwZGF0ZUFQV1BTSUVzUmVxKSk7CisJaWYgKE5VTEwgPT0gcFVwZGF0ZUFQV1BTSUVzUmVxKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMCisJCQkJKCJjYWxsIHRvIEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcFVwZGF0ZUFQV1BTSUVzUmVxIikpOworCQlyZXR1cm47CisJfQorCWNkZl9tZW1fY29weShwVXBkYXRlQVBXUFNJRXNSZXEsIHBNc2dCdWYsCisJCQlzaXplb2Yoc3RydWN0IHNTaXJVcGRhdGVBUFdQU0lFc1JlcSkpOworCisJcHNlc3Npb25FbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChwTWFjLAorCQkJCXBVcGRhdGVBUFdQU0lFc1JlcS0+YnNzSWQsCisJCQkJJnNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgiU2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gQlNTSUQiKSk7CisJCWdvdG8gZW5kOworCX0KKworCWNkZl9tZW1fY29weSgmcHNlc3Npb25FbnRyeS0+QVBXUFNJRXMsICZwVXBkYXRlQVBXUFNJRXNSZXEtPkFQV1BTSUVzLAorCQkgICAgIHNpemVvZih0U2lyQVBXUFNJRXMpKTsKKworCXNjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwlsaW1fc2VuZF9iZWFjb25faW5kKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCitlbmQ6CisJY2RmX21lbV9mcmVlKHBVcGRhdGVBUFdQU0lFc1JlcSk7CisJcmV0dXJuOworfQorCit2b2lkCitsaW1fc2VuZF92ZGV2X3Jlc3RhcnQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBIYWxIaWRkZW5Tc2lkVmRldlJlc3RhcnQgcEhhbEhpZGRlblNzaWRWZGV2UmVzdGFydCA9IE5VTEw7CisJdFNpck1zZ1EgbXNnUTsKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsICIlczolZDogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19mdW5jX18sCisJCQkgICAgICAgX19MSU5FX18pOworCQkgICAgICAgKQorCQlyZXR1cm47CisJfQorCisJcEhhbEhpZGRlblNzaWRWZGV2UmVzdGFydCA9CisJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0SGFsSGlkZGVuU3NpZFZkZXZSZXN0YXJ0KSk7CisJaWYgKE5VTEwgPT0gcEhhbEhpZGRlblNzaWRWZGV2UmVzdGFydCkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCAiJXM6JWQ6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiLAorCQkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCSAgICAgICApCisJCXJldHVybjsKKwl9CisKKwlwSGFsSGlkZGVuU3NpZFZkZXZSZXN0YXJ0LT5zc2lkSGlkZGVuID0gcHNlc3Npb25FbnRyeS0+c3NpZEhpZGRlbjsKKwlwSGFsSGlkZGVuU3NpZFZkZXZSZXN0YXJ0LT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKwltc2dRLnR5cGUgPSBXTUFfSElEREVOX1NTSURfVkRFVl9SRVNUQVJUOworCW1zZ1EuYm9keXB0ciA9IHBIYWxIaWRkZW5Tc2lkVmRldlJlc3RhcnQ7CisJbXNnUS5ib2R5dmFsID0gMDsKKworCXJldENvZGUgPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnUSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSByZXRDb2RlKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsICIlczolZDogd21hX3Bvc3RfY3RybF9tc2coKSBmYWlsZWQiLCBfX2Z1bmNfXywKKwkJCSAgICAgICBfX0xJTkVfXyk7CisJCSAgICAgICApCisJCWNkZl9tZW1fZnJlZShwSGFsSGlkZGVuU3NpZFZkZXZSZXN0YXJ0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fbGltX3Byb2Nlc3Nfc21lX2hpZGVfc3NpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwl0cFNpclVwZGF0ZVBhcmFtcyBwVXBkYXRlUGFyYW1zOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisKKwlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgicmVjZWl2ZWQgSElERV9TU0lEIG1lc3NhZ2UiKSk7KTsKKworCWlmIChwTXNnQnVmID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlwVXBkYXRlUGFyYW1zID0gKHRwU2lyVXBkYXRlUGFyYW1zKSBwTXNnQnVmOworCisJcHNlc3Npb25FbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKHBNYWMsCisJCQkJcFVwZGF0ZVBhcmFtcy0+c2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCSJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWQgJWQiLAorCQkJcFVwZGF0ZVBhcmFtcy0+c2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFVwZGF0ZSB0aGUgc2Vzc2lvbiBlbnRyeSAqLworCXBzZXNzaW9uRW50cnktPnNzaWRIaWRkZW4gPSBwVXBkYXRlUGFyYW1zLT5zc2lkSGlkZGVuOworCisJLyogU2VuZCB2ZGV2IHJlc3RhcnQgKi8KKwlsaW1fc2VuZF92ZGV2X3Jlc3RhcnQocE1hYywgcHNlc3Npb25FbnRyeSwgcFVwZGF0ZVBhcmFtcy0+c2Vzc2lvbklkKTsKKworCS8qIFVwZGF0ZSBiZWFjb24gKi8KKwlzY2hfc2V0X2ZpeGVkX2JlYWNvbl9maWVsZHMocE1hYywgcHNlc3Npb25FbnRyeSk7CisJbGltX3NlbmRfYmVhY29uX2luZChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworCXJldHVybjsKK30gLyoqKiBlbmQgX19saW1fcHJvY2Vzc19zbWVfaGlkZV9zc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmKSAqKiovCisKK3N0YXRpYyB2b2lkIF9fbGltX3Byb2Nlc3Nfc21lX3NldF93cGFyc25pX2VzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmKQoreworCXRwU2lyVXBkYXRlQVBXUEFSU05JRXNSZXEgcFVwZGF0ZUFQV1BBUlNOSUVzUmVxOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogUEUgc2Vzc2lvbklEICovCisKKwlpZiAocE1zZ0J1ZiA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJcFVwZGF0ZUFQV1BBUlNOSUVzUmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJVcGRhdGVBUFdQU0lFc1JlcSkpOworCWlmIChOVUxMID09IHBVcGRhdGVBUFdQQVJTTklFc1JlcSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgiY2FsbCB0byBBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIHBVcGRhdGVBUFdQQVJTTklFc1JlcSIpKTsKKwkJcmV0dXJuOworCX0KKwljZGZfbWVtX2NvcHkocFVwZGF0ZUFQV1BBUlNOSUVzUmVxLCBwTXNnQnVmLAorCQkJc2l6ZW9mKHN0cnVjdCBzU2lyVXBkYXRlQVBXUEFSU05JRXNSZXEpKTsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywKKwkJCQlwVXBkYXRlQVBXUEFSU05JRXNSZXEtPmJzc0lkLAorCQkJCSZzZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIEJTU0lEIikpOworCQlnb3RvIGVuZDsKKwl9CisKKwljZGZfbWVtX2NvcHkoJnBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+cnNuSUUsCisJCSAgICAgJnBVcGRhdGVBUFdQQVJTTklFc1JlcS0+QVBXUEFSU05JRXMsIHNpemVvZih0U2lyUlNOaWUpKTsKKworCWxpbV9zZXRfcnNfbmllX3dwX2FpZWZyb21fc21lX3N0YXJ0X2Jzc19yZXFfbWVzc2FnZShwTWFjLAorCQkJCQkJCSAgICAmcHNlc3Npb25FbnRyeS0+CisJCQkJCQkJICAgIHBMaW1TdGFydEJzc1JlcS0+cnNuSUUsCisJCQkJCQkJICAgIHBzZXNzaW9uRW50cnkpOworCisJcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5wcml2YWN5ID0gMTsKKwlwc2Vzc2lvbkVudHJ5LT5wcml2YWN5ID0gMTsKKworCXNjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwlsaW1fc2VuZF9iZWFjb25faW5kKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCitlbmQ6CisJY2RmX21lbV9mcmVlKHBVcGRhdGVBUFdQQVJTTklFc1JlcSk7CisJcmV0dXJuOworfSAvKioqIGVuZCBfX2xpbV9wcm9jZXNzX3NtZV9zZXRfd3BhcnNuaV9lcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikgKioqLworCisvKgorICAgVXBkYXRlIHRoZSBiZWFjb24gSW50ZXJ2YWwgZHluYW1pY2FsbHkgaWYgYmVhY29uSW50ZXJ2YWwgaXMgZGlmZmVyZW50IGluIE1DQworICovCitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9jaGFuZ2VfYmkodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYpCit7CisJdHBTaXJDaGFuZ2VCSVBhcmFtcyBwQ2hhbmdlQklQYXJhbXM7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZCA9IDA7CisJdFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25QYXJhbXM7CisKKwlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLAorCQkgICAgICAgRkwoInJlY2VpdmVkIFVwZGF0ZSBCZWFjb24gSW50ZXJ2YWwgbWVzc2FnZSIpKTsKKwkgICAgICAgKTsKKworCWlmIChwTXNnQnVmID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwljZGZfbWVtX3plcm8oJmJlYWNvblBhcmFtcywgc2l6ZW9mKHRVcGRhdGVCZWFjb25QYXJhbXMpKTsKKwlwQ2hhbmdlQklQYXJhbXMgPSAodHBTaXJDaGFuZ2VCSVBhcmFtcykgcE1zZ0J1ZjsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywKKwkJCQlwQ2hhbmdlQklQYXJhbXMtPmJzc0lkLAorCQkJCSZzZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIEJTU0lEIikpOworCQlyZXR1cm47CisJfQorCisJLypVcGRhdGUgc2Vzc2lvbkVudHJ5IEJlYWNvbiBJbnRlcnZhbCAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWwgIT0KKwkgICAgcENoYW5nZUJJUGFyYW1zLT5iZWFjb25JbnRlcnZhbCkgeworCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWwgPQorCQkJcENoYW5nZUJJUGFyYW1zLT5iZWFjb25JbnRlcnZhbDsKKwl9CisKKwkvKlVwZGF0ZSBzY2ggYmVhY29uSW50ZXJ2YWwgKi8KKwlpZiAocE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uSW50ZXJ2YWwgIT0KKwkgICAgcENoYW5nZUJJUGFyYW1zLT5iZWFjb25JbnRlcnZhbCkgeworCQlwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25JbnRlcnZhbCA9CisJCQlwQ2hhbmdlQklQYXJhbXMtPmJlYWNvbkludGVydmFsOworCisJCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJMSU0gc2VuZCB1cGRhdGUgQmVhY29uSW50ZXJ2YWwgSW5kaWNhdGlvbiA6ICVkIiksCisJCQkgICAgICAgcENoYW5nZUJJUGFyYW1zLT5iZWFjb25JbnRlcnZhbCk7CisJCSAgICAgICApOworCisJCWlmIChmYWxzZSA9PSBwTWFjLT5zYXAuU2FwRGZzSW5mby5pc19kZnNfY2FjX3RpbWVyX3J1bm5pbmcpIHsKKwkJCS8qIFVwZGF0ZSBiZWFjb24gKi8KKwkJCXNjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworCQkJYmVhY29uUGFyYW1zLmJzc0lkeCA9IHBzZXNzaW9uRW50cnktPmJzc0lkeDsKKwkJCS8qIFNldCBjaGFuZ2UgaW4gYmVhY29uIEludGVydmFsICovCisJCQliZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWwgPQorCQkJCXBDaGFuZ2VCSVBhcmFtcy0+YmVhY29uSW50ZXJ2YWw7CisJCQliZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXAgPQorCQkJCVBBUkFNX0JDTl9JTlRFUlZBTF9DSEFOR0VEOworCQkJbGltX3NlbmRfYmVhY29uX3BhcmFtcyhwTWFjLCAmYmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKwkJfQorCX0KKworCXJldHVybjsKK30gLyoqKiBlbmQgX19saW1fcHJvY2Vzc19zbWVfY2hhbmdlX2JpKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmKSAqKiovCisKKyNpZmRlZiBRQ0FfSFRfMjA0MF9DT0VYCitzdGF0aWMgdm9pZCBfX2xpbV9wcm9jZXNzX3NtZV9zZXRfaHQyMDQwX21vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdWludDMyX3QgKnBNc2dCdWYpCit7CisJdHBTaXJTZXRIVDIwNDBNb2RlIHBTZXRIVDIwNDBNb2RlOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisJdWludDhfdCBzZXNzaW9uSWQgPSAwOworCWNkc19tc2dfdCBtc2c7CisJdFVwZGF0ZVZIVE9wTW9kZSAqcEh0T3BNb2RlID0gTlVMTDsKKwl1aW50MTZfdCBzdGFJZCA9IDA7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoInJlY2VpdmVkIFNldCBIVCAyMC80MCBtb2RlIG1lc3NhZ2UiKSk7KTsKKwlpZiAocE1zZ0J1ZiA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJcFNldEhUMjA0ME1vZGUgPSAodHBTaXJTZXRIVDIwNDBNb2RlKSBwTXNnQnVmOworCisJcHNlc3Npb25FbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChwTWFjLAorCQkJCXBTZXRIVDIwNDBNb2RlLT5ic3NJZCwKKwkJCQkmc2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCUZMKCJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJRCAiKSk7CisJCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwU2V0SFQyMDQwTW9kZS0+YnNzSWQsIExPRzEpOworCQlyZXR1cm47CisJfQorCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiVXBkYXRlIHNlc3Npb24gZW50cnkgZm9yIGNiTW9kPSVkIiksCisJCXBTZXRIVDIwNDBNb2RlLT5jYk1vZGUpOworCS8qVXBkYXRlIHNlc3Npb25FbnRyeSBIVCByZWxhdGVkIGZpZWxkcyAqLworCXN3aXRjaCAocFNldEhUMjA0ME1vZGUtPmNiTW9kZSkgeworCWNhc2UgUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOgorCQlwc2Vzc2lvbkVudHJ5LT5odFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPQorCQkJUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCQlwc2Vzc2lvbkVudHJ5LT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCA9IDA7CisJCWlmIChwU2V0SFQyMDQwTW9kZS0+b2Jzc0VuYWJsZWQpCisJCQlwc2Vzc2lvbkVudHJ5LT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldAorCQkJCQk9IGVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaOworCQllbHNlCisJCQlwc2Vzc2lvbkVudHJ5LT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldAorCQkJCQk9IGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaOworCQlicmVhazsKKwljYXNlIFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWToKKwkJcHNlc3Npb25FbnRyeS0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0KKwkJCVBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWTsKKwkJcHNlc3Npb25FbnRyeS0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPSAxOworCQlicmVhazsKKwljYXNlIFBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlk6CisJCXBzZXNzaW9uRW50cnktPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9CisJCQlQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOworCQlwc2Vzc2lvbkVudHJ5LT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgY2JNb2RlIikpOworCQlyZXR1cm47CisJfQorCisJLyogVXBkYXRlIGJlYWNvbiAqLworCXNjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwlsaW1fc2VuZF9iZWFjb25faW5kKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCisJLyogdXBkYXRlIE9QIE1vZGUgZm9yIGVhY2ggYXNzb2NpYXRlZCBwZWVyICovCisJZm9yIChzdGFJZCA9IDA7IHN0YUlkIDwgcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZS5zaXplOyBzdGFJZCsrKSB7CisJCXBTdGFEcyA9IGRwaF9nZXRfaGFzaF9lbnRyeShwTWFjLCBzdGFJZCwKKwkJCQkmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCWlmIChOVUxMID09IHBTdGFEcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChwU3RhRHMtPnZhbGlkICYmIHBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpIHsKKwkJCXBIdE9wTW9kZSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0VXBkYXRlVkhUT3BNb2RlKSk7CisJCQlpZiAoTlVMTCA9PSBwSHRPcE1vZGUpIHsKKwkJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMCisJCQkJCQkoIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNldHRpbmcgT1AgbW9kZSIpLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcEh0T3BNb2RlLT5vcE1vZGUgPQorCQkJCShwc2Vzc2lvbkVudHJ5LT5odFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPT0KKwkJCQkgUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEKSA/CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFogOiBlSFRfQ0hBTk5FTF9XSURUSF80ME1IWjsKKwkJCXBIdE9wTW9kZS0+c3RhSWQgPSBzdGFJZDsKKwkJCWNkZl9tZW1fY29weShwSHRPcE1vZGUtPnBlZXJfbWFjLCAmcFN0YURzLT5zdGFBZGRyLAorCQkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCQlwSHRPcE1vZGUtPnNtZXNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworCQkJbXNnLnR5cGUgPSBXTUFfVVBEQVRFX09QX01PREU7CisJCQltc2cucmVzZXJ2ZWQgPSAwOworCQkJbXNnLmJvZHlwdHIgPSBwSHRPcE1vZGU7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJCSAgICAoY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpKSB7CisJCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTAorCQkJCQkJKCIlczogTm90IGFibGUgdG8gcG9zdCBXTUFfVVBEQVRFX09QX01PREUgbWVzc2FnZSB0byBXTUEiKSwKKwkJCQkJX19mdW5jX18pOworCQkJCWNkZl9tZW1fZnJlZShwSHRPcE1vZGUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCQlGTAorCQkJCQkoIiVzOiBOb3RpZmVkIEZXIGFib3V0IE9QIG1vZGU6ICVkIGZvciBzdGFJZD0lZCIpLAorCQkJCV9fZnVuY19fLCBwSHRPcE1vZGUtPm9wTW9kZSwgc3RhSWQpOworCisJCX0gZWxzZQorCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMKCIlczogc3RhdGlvbiAlZCBkb2VzIG5vdCBzdXBwb3J0IEhUNDBcbiIpLAorCQkJCV9fZnVuY19fLCBzdGFJZCk7CisJfQorCisJcmV0dXJuOworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIF9fbGltX3Byb2Nlc3NfcmVwb3J0X21lc3NhZ2UKKyAqCisgKiBGVU5DVElPTjogIFByb2Nlc3NlcyB0aGUgbmV4dCByZWNlaXZlZCBSYWRpbyBSZXNvdXJjZSBNYW5hZ2VtZW50IG1lc3NhZ2UKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIF9fbGltX3Byb2Nlc3NfcmVwb3J0X21lc3NhZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXN3aXRjaCAocE1zZy0+dHlwZSkgeworCWNhc2UgZVdOSV9TTUVfTkVJR0hCT1JfUkVQT1JUX1JFUV9JTkQ6CisJCXJybV9wcm9jZXNzX25laWdoYm9yX3JlcG9ydF9yZXEocE1hYywgcE1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfQkVBQ09OX1JFUE9SVF9SRVNQX1hNSVRfSU5EOgorCXsKKwkJcnJtX3Byb2Nlc3NfYmVhY29uX3JlcG9ydF94bWl0KHBNYWMsIHBNc2ctPmJvZHlwdHIpOworCX0KKwlicmVhazsKKwl9CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChXTEFOX0ZFQVRVUkVfVk9XSUZJKQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogbGltX3NlbmRfc2V0X21heF90eF9wb3dlcl9yZXEKKyAqCisgKiBGVU5DVElPTjogIFNlbmQgU0lSX0hBTF9TRVRfTUFYX1RYX1BPV0VSX1JFUSBtZXNzYWdlIHRvIGNoYW5nZSB0aGUgbWF4IHR4IHBvd2VyLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHR4UG93ZXIgdHhQb3dlciB0byBiZSBzZXQuCisgKiBAcGFyYW0gcFNlc3Npb25FbnRyeSBzZXNzaW9uIGVudHJ5LgorICogQHJldHVybiBOb25lCisgKi8KK3RTaXJSZXRTdGF0dXMKK2xpbV9zZW5kX3NldF9tYXhfdHhfcG93ZXJfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRQb3dlcmRCbSB0eFBvd2VyLAorCQkJICAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSkKK3sKKwl0cE1heFR4UG93ZXJQYXJhbXMgcE1heFR4UGFyYW1zID0gTlVMTDsKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdFNpck1zZ1EgbXNnUTsKKworCWlmIChwU2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgIiVzOiVkOiBJbmF2YWxpZCBwYXJhbWV0ZXJzIiwgX19mdW5jX18sCisJCQkgICAgICAgX19MSU5FX18pOworCQkgICAgICAgKQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXBNYXhUeFBhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0TWF4VHhQb3dlclBhcmFtcykpOworCWlmIChOVUxMID09IHBNYXhUeFBhcmFtcykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcE1heFR4UGFyYW1zICIpKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKworCX0KKyNpZiBkZWZpbmVkKFdMQU5fVk9XSUZJX0RFQlVHKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgicE1heFR4UGFyYW1zIGFsbG9jYXRlZC4uLndpbGwgYmUgZnJlZWQgaW4gb3RoZXIgbW9kdWxlIikpOworI2VuZGlmCisJaWYgKHBNYXhUeFBhcmFtcyA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoInBNYXhUeFBhcmFtcyBpcyBOVUxMIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlwTWF4VHhQYXJhbXMtPnBvd2VyID0gdHhQb3dlcjsKKwljZGZfbWVtX2NvcHkocE1heFR4UGFyYW1zLT5ic3NJZCwgcFNlc3Npb25FbnRyeS0+YnNzSWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJY2RmX21lbV9jb3B5KHBNYXhUeFBhcmFtcy0+c2VsZlN0YU1hY0FkZHIsIHBTZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJbXNnUS50eXBlID0gV01BX1NFVF9NQVhfVFhfUE9XRVJfUkVROworCW1zZ1EuYm9keXB0ciA9IHBNYXhUeFBhcmFtczsKKwltc2dRLmJvZHl2YWwgPSAwOworCVBFTE9HMShsaW1fbG9nCisJCSAgICAgICAocE1hYywgTE9HMSwgRkwoIlBvc3RpbmcgV01BX1NFVF9NQVhfVFhfUE9XRVJfUkVRIHRvIFdNQSIpKTsKKwkgICAgICAgKQorCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIHBTZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBtc2dRLnR5cGUpKTsKKwlyZXRDb2RlID0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ1EpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJ3bWFfcG9zdF9jdHJsX21zZygpIGZhaWxlZCIpKTsKKwkJY2RmX21lbV9mcmVlKHBNYXhUeFBhcmFtcyk7CisJfQorCXJldHVybiByZXRDb2RlOworfQorI2VuZGlmCisKKy8qKgorICogX19saW1fcHJvY2Vzc19zbWVfcmVnaXN0ZXJfbWdtdF9mcmFtZV9yZXEoKSAtIHByb2Nlc3Mgc21lIHJlZyBtZ210IGZyYW1lIHJlcQorICoKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAbXNnX2J1ZjogcG9pbnRlciB0byB0aGUgU01FIG1lc3NhZ2UgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBlV05JX1NNRV9SRUdJU1RFUl9NR01UX0ZSQU1FX1JFUSBtZXNzYWdlCisgKiBmcm9tIFNNRS4gSXQgUmVnaXN0ZXIgdGhpcyBpbmZvcm1hdGlvbiB3aXRoaW4gUEUuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIF9fbGltX3Byb2Nlc3Nfc21lX3JlZ2lzdGVyX21nbXRfZnJhbWVfcmVxKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQzMl90ICptc2dfYnVmKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl0cFNpclJlZ2lzdGVyTWdtdEZyYW1lIHNtZV9yZXEgPSAodHBTaXJSZWdpc3Rlck1nbXRGcmFtZSltc2dfYnVmOworCXN0cnVjdCBtZ210X2ZybV9yZWdfaW5mbyAqbGltX21nbXRfcmVnbiA9IE5VTEw7CisJc3RydWN0IG1nbXRfZnJtX3JlZ19pbmZvICpuZXh0ID0gTlVMTDsKKwlib29sIG1hdGNoID0gZmFsc2U7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKAorCQkJInJlZ2lzdGVyRnJhbWUgJWQsIGZyYW1lVHlwZSAlZCwgbWF0Y2hMZW4gJWQiKSwKKwkJCQlzbWVfcmVxLT5yZWdpc3RlckZyYW1lLCBzbWVfcmVxLT5mcmFtZVR5cGUsCisJCQkJc21lX3JlcS0+bWF0Y2hMZW4pOworCS8qIEZpcnN0IGNoZWNrIHdoZXRoZXIgZW50cnkgZXhpc3RzIGFscmVhZHkgKi8KKwljZGZfbXV0ZXhfYWNxdWlyZSgmbWFjX2N0eC0+bGltLmxpbV9mcmFtZV9yZWdpc3Rlcl9sb2NrKTsKKwljZGZfbGlzdF9wZWVrX2Zyb250KCZtYWNfY3R4LT5saW0uZ0xpbU1nbXRGcmFtZVJlZ2lzdHJhdGluUXVldWUsCisJCQkgICAgKGNkZl9saXN0X25vZGVfdCAqKikgJmxpbV9tZ210X3JlZ24pOworCWNkZl9tdXRleF9yZWxlYXNlKCZtYWNfY3R4LT5saW0ubGltX2ZyYW1lX3JlZ2lzdGVyX2xvY2spOworCisJd2hpbGUgKGxpbV9tZ210X3JlZ24gIT0gTlVMTCkgeworCQlpZiAobGltX21nbXRfcmVnbi0+ZnJhbWVUeXBlICE9IHNtZV9yZXEtPmZyYW1lVHlwZSkKKwkJCWdvdG8gc2tpcF9tYXRjaDsKKwkJaWYgKHNtZV9yZXEtPm1hdGNoTGVuKSB7CisJCQlpZiAoKGxpbV9tZ210X3JlZ24tPm1hdGNoTGVuID09IHNtZV9yZXEtPm1hdGNoTGVuKSAmJgorCQkJCShjZGZfbWVtX2NvbXBhcmUobGltX21nbXRfcmVnbi0+bWF0Y2hEYXRhLAorCQkJCQlzbWVfcmVxLT5tYXRjaERhdGEsCisJCQkJCWxpbV9tZ210X3JlZ24tPm1hdGNoTGVuKSkpIHsKKwkJCQkJLyogZm91bmQgbWF0Y2ghICovCisJCQkJCW1hdGNoID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBmb3VuZCBtYXRjaCEgKi8KKwkJCW1hdGNoID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9Citza2lwX21hdGNoOgorCQljZGZfbXV0ZXhfYWNxdWlyZSgmbWFjX2N0eC0+bGltLmxpbV9mcmFtZV9yZWdpc3Rlcl9sb2NrKTsKKwkJY2RmX3N0YXR1cyA9IGNkZl9saXN0X3BlZWtfbmV4dCgKKwkJCQkmbWFjX2N0eC0+bGltLmdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlLAorCQkJCShjZGZfbGlzdF9ub2RlX3QgKilsaW1fbWdtdF9yZWduLAorCQkJCShjZGZfbGlzdF9ub2RlX3QgKiopJm5leHQpOworCQljZGZfbXV0ZXhfcmVsZWFzZSgmbWFjX2N0eC0+bGltLmxpbV9mcmFtZV9yZWdpc3Rlcl9sb2NrKTsKKwkJbGltX21nbXRfcmVnbiA9IG5leHQ7CisJCW5leHQgPSBOVUxMOworCX0KKwlpZiAobWF0Y2gpIHsKKwkJY2RmX211dGV4X2FjcXVpcmUoJm1hY19jdHgtPmxpbS5saW1fZnJhbWVfcmVnaXN0ZXJfbG9jayk7CisJCWNkZl9saXN0X3JlbW92ZV9ub2RlKAorCQkJCSZtYWNfY3R4LT5saW0uZ0xpbU1nbXRGcmFtZVJlZ2lzdHJhdGluUXVldWUsCisJCQkJKGNkZl9saXN0X25vZGVfdCAqKWxpbV9tZ210X3JlZ24pOworCQljZGZfbXV0ZXhfcmVsZWFzZSgmbWFjX2N0eC0+bGltLmxpbV9mcmFtZV9yZWdpc3Rlcl9sb2NrKTsKKwkJY2RmX21lbV9mcmVlKGxpbV9tZ210X3JlZ24pOworCX0KKworCWlmIChzbWVfcmVxLT5yZWdpc3RlckZyYW1lKSB7CisJCWxpbV9tZ210X3JlZ24gPQorCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZ210X2ZybV9yZWdfaW5mbykgKworCQkJCQlzbWVfcmVxLT5tYXRjaExlbik7CisJCWlmIChsaW1fbWdtdF9yZWduICE9IE5VTEwpIHsKKwkJCWNkZl9tZW1fc2V0KCh2b2lkICopbGltX21nbXRfcmVnbiwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBtZ210X2ZybV9yZWdfaW5mbykgKworCQkJCSAgICBzbWVfcmVxLT5tYXRjaExlbiwgMCk7CisJCQlsaW1fbWdtdF9yZWduLT5mcmFtZVR5cGUgPSBzbWVfcmVxLT5mcmFtZVR5cGU7CisJCQlsaW1fbWdtdF9yZWduLT5tYXRjaExlbiA9IHNtZV9yZXEtPm1hdGNoTGVuOworCQkJbGltX21nbXRfcmVnbi0+c2Vzc2lvbklkID0gc21lX3JlcS0+c2Vzc2lvbklkOworCQkJaWYgKHNtZV9yZXEtPm1hdGNoTGVuKSB7CisJCQkJY2RmX21lbV9jb3B5KGxpbV9tZ210X3JlZ24tPm1hdGNoRGF0YSwKKwkJCQkJICAgICBzbWVfcmVxLT5tYXRjaERhdGEsCisJCQkJCSAgICAgc21lX3JlcS0+bWF0Y2hMZW4pOworCQkJfQorCQkJY2RmX211dGV4X2FjcXVpcmUoCisJCQkJCSZtYWNfY3R4LT5saW0ubGltX2ZyYW1lX3JlZ2lzdGVyX2xvY2spOworCQkJY2RmX2xpc3RfaW5zZXJ0X2Zyb250KCZtYWNfY3R4LT5saW0uCisJCQkJCSAgICAgIGdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlLAorCQkJCQkgICAgICAmbGltX21nbXRfcmVnbi0+bm9kZSk7CisJCQljZGZfbXV0ZXhfcmVsZWFzZSgKKwkJCQkJJm1hY19jdHgtPmxpbS5saW1fZnJhbWVfcmVnaXN0ZXJfbG9jayk7CisJCX0KKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBfX2xpbV9kZXJlZ2lzdGVyX2RlZmVycmVkX3NtZV9yZXFfYWZ0ZXJfbm9hX3N0YXJ0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiRGVyZWcgbXNnVHlwZSAlZCIpLAorCQlwTWFjLT5saW0uZ0RlZmVyTXNnVHlwZUZvck5PQSk7CisJcE1hYy0+bGltLmdEZWZlck1zZ1R5cGVGb3JOT0EgPSAwOworCWlmIChwTWFjLT5saW0uZ3BEZWZkU21lTXNnRm9yTk9BICE9IE5VTEwpIHsKKwkJLyogX19saW1fcHJvY2Vzc19zbWVfc2Nhbl9yZXEgY29uc3VtZWQgdGhlIGJ1ZmZlci4gV2UgY2FuIGZyZWUgaXQuICovCisJCWNkZl9tZW1fZnJlZShwTWFjLT5saW0uZ3BEZWZkU21lTXNnRm9yTk9BKTsKKwkJcE1hYy0+bGltLmdwRGVmZFNtZU1zZ0Zvck5PQSA9IE5VTEw7CisJfQorfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX3JlZ2RfZGVmZF9zbWVfcmVxX2FmdGVyX25vYV9zdGFydCgpCisgKgorICogbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgZGVmZXJyZWQgc21lIHJlcSBtZXNzYWdlCisgKiBhZnRlciBub2Egc3RhcnQuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfcmVnZF9kZWZkX3NtZV9yZXFfYWZ0ZXJfbm9hX3N0YXJ0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJYm9vbCBidWZfY29uc3VtZWQgPSB0cnVlOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiUHJvY2VzcyBkZWZkIHNtZSByZXEgJWQiKSwKKwkJbWFjX2N0eC0+bGltLmdEZWZlck1zZ1R5cGVGb3JOT0EpOworCisJaWYgKChtYWNfY3R4LT5saW0uZ0RlZmVyTXNnVHlwZUZvck5PQSA9PSAwKSB8fAorCQkJKG1hY19jdHgtPmxpbS5ncERlZmRTbWVNc2dGb3JOT0EgPT0gTlVMTCkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoInN0YXJ0IHJjdmQgZnJvbSBGVyB3aGVuIG5vIHNtZSBkZWZlcnJlZCBtc2cgcGVuZGluZy4gRG8gbm90aGluZy4gIikpOworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiSXQgbWF5IGhhcHBlbiB3aGVuIE5PQSBzdGFydCBpbmQgYW5kIHRpbWVvdXQgaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUiKSk7CisJCXJldHVybjsKKwl9CisJc3dpdGNoIChtYWNfY3R4LT5saW0uZ0RlZmVyTXNnVHlwZUZvck5PQSkgeworCWNhc2UgZVdOSV9TTUVfU0NBTl9SRVE6CisJCV9fbGltX3Byb2Nlc3Nfc21lX3NjYW5fcmVxKG1hY19jdHgsCisJCQkJbWFjX2N0eC0+bGltLmdwRGVmZFNtZU1zZ0Zvck5PQSk7CisJCWJyZWFrOworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCWNhc2UgZVdOSV9TTUVfT0VNX0RBVEFfUkVROgorCQlfX2xpbV9wcm9jZXNzX3NtZV9vZW1fZGF0YV9yZXEobWFjX2N0eCwKKwkJCQltYWNfY3R4LT5saW0uZ3BEZWZkU21lTXNnRm9yTk9BKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIGVXTklfU01FX1JFTUFJTl9PTl9DSEFOTkVMX1JFUToKKwkJYnVmX2NvbnN1bWVkID0gbGltX3Byb2Nlc3NfcmVtYWluX29uX2NobmxfcmVxKG1hY19jdHgsCisJCQkJbWFjX2N0eC0+bGltLmdwRGVmZFNtZU1zZ0Zvck5PQSk7CisJCS8qCisJCSAqIGxpbV9wcm9jZXNzX3JlbWFpbl9vbl9jaG5sX3JlcSBkb2VzbnQgd2FudCB1cyB0byBmcmVlCisJCSAqIHRoZSBidWZmZXIgc2luY2UgaXQgaXMgZnJlZWQgaW4gbGltX3JlbWFpbl9vbl9jaG5fcnNwLgorCQkgKiB0aGlzIGNoYW5nZSBpcyB0byBhdm9pZCAiZG91YmxlIGZyZWUiCisJCSAqLworCQlpZiAoZmFsc2UgPT0gYnVmX2NvbnN1bWVkKQorCQkJbWFjX2N0eC0+bGltLmdwRGVmZFNtZU1zZ0Zvck5PQSA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfSk9JTl9SRVE6CisJCV9fbGltX3Byb2Nlc3Nfc21lX2pvaW5fcmVxKG1hY19jdHgsCisJCQkJbWFjX2N0eC0+bGltLmdwRGVmZFNtZU1zZ0Zvck5PQSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIlVua25vd24gZGVmZXJyZWQgbXNnIHR5cGUgJWQiKSwKKwkJCW1hY19jdHgtPmxpbS5nRGVmZXJNc2dUeXBlRm9yTk9BKTsKKwkJYnJlYWs7CisJfQorCV9fbGltX2RlcmVnaXN0ZXJfZGVmZXJyZWRfc21lX3JlcV9hZnRlcl9ub2Ffc3RhcnQobWFjX2N0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2xpbV9wcm9jZXNzX3NtZV9yZXNldF9hcF9jYXBzX2NoYW5nZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwl0cFNpclJlc2V0QVBDYXBzQ2hhbmdlIHBSZXNldENhcHNDaGFuZ2U7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZCA9IDA7CisJaWYgKHBNc2dCdWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCXBSZXNldENhcHNDaGFuZ2UgPSAodHBTaXJSZXNldEFQQ2Fwc0NoYW5nZSkgcE1zZ0J1ZjsKKwlwc2Vzc2lvbkVudHJ5ID0KKwkJcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsIHBSZXNldENhcHNDaGFuZ2UtPmJzc0lkLCAmc2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJRCIpKTsKKwkJcmV0dXJuOworCX0KKworCXBzZXNzaW9uRW50cnktPmxpbVNlbnRDYXBzQ2hhbmdlTnRmID0gZmFsc2U7CisJcmV0dXJuOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NNZXNzYWdlUXVldWUoKS4gVGhpcworICogZnVuY3Rpb24gcHJvY2Vzc2VzIFNNRSByZXF1ZXN0IG1lc3NhZ2VzIGZyb20gSEREIG9yIHVwcGVyIGxheWVyCisgKiBhcHBsaWNhdGlvbi4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgbXNnVHlwZSAgIEluZGljYXRlcyB0aGUgU01FIG1lc3NhZ2UgdHlwZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gQm9vbGVhbiAtIHRydWUgLSBpZiBwTXNnQnVmIGlzIGNvbnN1bWVkIGFuZCBjYW4gYmUgZnJlZWQuCisgKiAgICAgICAgICAgICAgICAgICBmYWxzZSAtIGlmIHBNc2dCdWYgaXMgbm90IHRvIGJlIGZyZWVkLgorICovCisKK2Jvb2wgbGltX3Byb2Nlc3Nfc21lX3JlcV9tZXNzYWdlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZykKK3sKKwlib29sIGJ1ZkNvbnN1bWVkID0gdHJ1ZTsgICAgICAgIC8qIFNldCB0aGlzIGZsYWcgdG8gZmFsc2Ugd2l0aGluIGNhc2UgYmxvY2sgb2YgYW55IGZvbGxvd2luZyBtZXNzYWdlLCB0aGF0IGRvZXNudCB3YW50IHBNc2dCdWYgdG8gYmUgZnJlZWQuICovCisJdWludDMyX3QgKnBNc2dCdWYgPSBwTXNnLT5ib2R5cHRyOworCXRwU2lyU21lU2NhblJlcSBwU2NhblJlcTsKKwlQRUxPRzEobGltX2xvZworCQkgICAgICAgKHBNYWMsIExPRzEsCisJCSAgICAgICBGTAorCQkJICAgICAgICgiTElNIFJlY2VpdmVkIFNNRSBNZXNzYWdlICVzKCVkKSBHbG9iYWwgTGltU21lU3RhdGU6JXMoJWQpIEdsb2JhbCBMaW1NbG1TdGF0ZTogJXMoJWQpIiksCisJCSAgICAgICBsaW1fbXNnX3N0cihwTXNnLT50eXBlKSwgcE1zZy0+dHlwZSwKKwkJICAgICAgIGxpbV9zbWVfc3RhdGVfc3RyKHBNYWMtPmxpbS5nTGltU21lU3RhdGUpLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlLAorCQkgICAgICAgbGltX21sbV9zdGF0ZV9zdHIocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSksIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpOworCSAgICAgICApCisKKwlwU2NhblJlcSA9ICh0cFNpclNtZVNjYW5SZXEpIHBNc2dCdWY7CisJLyogSWYgbm8gaW5zZXJ0IE5PQSByZXF1aXJlZCB0aGVuIGV4ZWN1dGUgdGhlIGNvZGUgYmVsb3cgKi8KKworCXN3aXRjaCAocE1zZy0+dHlwZSkgeworCWNhc2UgZVdOSV9TTUVfU1lTX1JFQURZX0lORDoKKwkJYnVmQ29uc3VtZWQgPSBfX2xpbV9wcm9jZXNzX3NtZV9zeXNfcmVhZHlfaW5kKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfU1RBUlRfQlNTX1JFUToKKwkJYnVmQ29uc3VtZWQgPSBfX2xpbV9wcm9jZXNzX3NtZV9zdGFydF9ic3NfcmVxKHBNYWMsIHBNc2cpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfU0NBTl9SRVE6CisJCV9fbGltX3Byb2Nlc3Nfc21lX3NjYW5fcmVxKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCWNhc2UgZVdOSV9TTUVfT0VNX0RBVEFfUkVROgorCQlfX2xpbV9wcm9jZXNzX3NtZV9vZW1fZGF0YV9yZXEocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBlV05JX1NNRV9SRU1BSU5fT05fQ0hBTk5FTF9SRVE6CisJCWJ1ZkNvbnN1bWVkID0gbGltX3Byb2Nlc3NfcmVtYWluX29uX2NobmxfcmVxKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfVVBEQVRFX05PQToKKwkJX19saW1fcHJvY2Vzc19zbWVfbm9fYV91cGRhdGUocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfQ0xFQVJfREZTX0NIQU5ORUxfTElTVDoKKwkJX19saW1fcHJvY2Vzc19jbGVhcl9kZnNfY2hhbm5lbF9saXN0KHBNYWMsIHBNc2cpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0pPSU5fUkVROgorCQlfX2xpbV9wcm9jZXNzX3NtZV9qb2luX3JlcShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGVXTklfU01FX1JFQVNTT0NfUkVROgorCQlfX2xpbV9wcm9jZXNzX3NtZV9yZWFzc29jX3JlcShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGVXTklfU01FX0RJU0FTU09DX1JFUToKKwkJX19saW1fcHJvY2Vzc19zbWVfZGlzYXNzb2NfcmVxKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfRElTQVNTT0NfQ05GOgorCWNhc2UgZVdOSV9TTUVfREVBVVRIX0NORjoKKwkJX19saW1fcHJvY2Vzc19zbWVfZGlzYXNzb2NfY25mKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfREVBVVRIX1JFUToKKwkJX19saW1fcHJvY2Vzc19zbWVfZGVhdXRoX3JlcShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGVXTklfU01FX1NFVENPTlRFWFRfUkVROgorCQlfX2xpbV9wcm9jZXNzX3NtZV9zZXRfY29udGV4dF9yZXEocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCisJY2FzZSBlV05JX1NNRV9TVE9QX0JTU19SRVE6CisJCWJ1ZkNvbnN1bWVkID0gX19saW1fcHJvY2Vzc19zbWVfc3RvcF9ic3NfcmVxKHBNYWMsIHBNc2cpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfQVNTT0NfQ05GOgorCQlpZiAocE1zZy0+dHlwZSA9PSBlV05JX1NNRV9BU1NPQ19DTkYpCisJCQlQRUxPRzEobGltX2xvZyhwTWFjLAorCQkJCUxPRzEsIEZMKCJSZWNlaXZlZCBBU1NPQ19DTkYgbWVzc2FnZSIpKTspCisJCQlfX2xpbV9wcm9jZXNzX3NtZV9hc3NvY19jbmZfbmV3KHBNYWMsIHBNc2ctPnR5cGUsCisJCQkJCQkJcE1zZ0J1Zik7CisJCWJyZWFrOworCisJY2FzZSBlV05JX1NNRV9BRERUU19SRVE6CisJCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBBRERUU19SRVEgbWVzc2FnZSIpKTspCisJCV9fbGltX3Byb2Nlc3Nfc21lX2FkZHRzX3JlcShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGVXTklfU01FX0RFTFRTX1JFUToKKwkJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIERFTFRTX1JFUSBtZXNzYWdlIikpOykKKwkJX19saW1fcHJvY2Vzc19zbWVfZGVsdHNfcmVxKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworCWNhc2UgU0lSX0xJTV9BRERUU19SU1BfVElNRU9VVDoKKwkJUEVMT0cxKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCSAgICAgICBGTCgiUmVjZWl2ZWQgU0lSX0xJTV9BRERUU19SU1BfVElNRU9VVCBtZXNzYWdlICIpKTsKKwkJICAgICAgICkKKwkJbGltX3Byb2Nlc3Nfc21lX2FkZHRzX3JzcF90aW1lb3V0KHBNYWMsIHBNc2ctPmJvZHl2YWwpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUkVROgorCQlfX2xpbV9wcm9jZXNzX3NtZV9nZXRfc3RhdGlzdGljc19yZXF1ZXN0KHBNYWMsIHBNc2dCdWYpOworCQkvKiBIQUwgY29uc3VtZXMgcE1zZ0J1Zi4gSXQgd2lsbCBiZSBmcmVlZCB0aGVyZS4gU2V0IGJ1ZkNvbnN1bWVkIHRvIGZhbHNlLiAqLworCQlidWZDb25zdW1lZCA9IGZhbHNlOworCQlicmVhazsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisJY2FzZSBlV05JX1NNRV9HRVRfVFNNX1NUQVRTX1JFUToKKwkJX19saW1fcHJvY2Vzc19zbWVfZ2V0X3RzbV9zdGF0c19yZXF1ZXN0KHBNYWMsIHBNc2dCdWYpOworCQlidWZDb25zdW1lZCA9IGZhbHNlOworCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisJY2FzZSBlV05JX1NNRV9HRVRfQVNTT0NfU1RBU19SRVE6CisJCWxpbV9wcm9jZXNzX3NtZV9nZXRfYXNzb2Nfc3RhX2luZm8ocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfVEtJUF9DTlRSX01FQVNfUkVROgorCQlsaW1fcHJvY2Vzc190a2lwX2NvdW50ZXJfbWVhc3VyZXMocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCisJY2FzZSBlV05JX1NNRV9ISURFX1NTSURfUkVROgorCQlfX2xpbV9wcm9jZXNzX3NtZV9oaWRlX3NzaWQocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfVVBEQVRFX0FQV1BTSUVfUkVROgorCQlfX2xpbV9wcm9jZXNzX3NtZV91cGRhdGVfYXB3cHNpX2VzKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0dFVF9XUFNQQkNfU0VTU0lPTl9SRVE6CisJCWxpbV9wcm9jZXNzX3NtZV9nZXRfd3BzcGJjX3Nlc3Npb25zKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfU0VUX0FQV1BBUlNOSUVzX1JFUToKKwkJX19saW1fcHJvY2Vzc19zbWVfc2V0X3dwYXJzbmlfZXMocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCisJY2FzZSBlV05JX1NNRV9DSE5HX01DQ19CRUFDT05fSU5URVJWQUw6CisJCS8qIFVwZGF0ZSB0aGUgYmVhY29uSW50ZXJ2YWwgKi8KKwkJX19saW1fcHJvY2Vzc19zbWVfY2hhbmdlX2JpKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworI2lmZGVmIFFDQV9IVF8yMDQwX0NPRVgKKwljYXNlIGVXTklfU01FX1NFVF9IVF8yMDQwX01PREU6CisJCV9fbGltX3Byb2Nlc3Nfc21lX3NldF9odDIwNDBfbW9kZShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCWNhc2UgZVdOSV9TTUVfTkVJR0hCT1JfUkVQT1JUX1JFUV9JTkQ6CisJY2FzZSBlV05JX1NNRV9CRUFDT05fUkVQT1JUX1JFU1BfWE1JVF9JTkQ6CisJCV9fbGltX3Byb2Nlc3NfcmVwb3J0X21lc3NhZ2UocE1hYywgcE1zZyk7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJY2FzZSBlV05JX1NNRV9GVF9QUkVfQVVUSF9SRVE6CisJCWJ1ZkNvbnN1bWVkID0gKGJvb2wpIGxpbV9wcm9jZXNzX2Z0X3ByZV9hdXRoX3JlcShwTWFjLCBwTXNnKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9GVF9VUERBVEVfS0VZOgorCQlsaW1fcHJvY2Vzc19mdF91cGRhdGVfa2V5KHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfRlRfQUdHUl9RT1NfUkVROgorCQlsaW1fcHJvY2Vzc19mdF9hZ2dyX3Fvc19yZXEocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIGVXTklfU01FX1JFR0lTVEVSX01HTVRfRlJBTUVfUkVROgorCQlfX2xpbV9wcm9jZXNzX3NtZV9yZWdpc3Rlcl9tZ210X2ZyYW1lX3JlcShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwljYXNlIGVXTklfU01FX1RETFNfU0VORF9NR01UX1JFUToKKwkJbGltX3Byb2Nlc3Nfc21lX3RkbHNfbWdtdF9zZW5kX3JlcShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9URExTX0FERF9TVEFfUkVROgorCQlsaW1fcHJvY2Vzc19zbWVfdGRsc19hZGRfc3RhX3JlcShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9URExTX0RFTF9TVEFfUkVROgorCQlsaW1fcHJvY2Vzc19zbWVfdGRsc19kZWxfc3RhX3JlcShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9URExTX0xJTktfRVNUQUJMSVNIX1JFUToKKwkJbGltX3Byb2Nlc3Nfc21lX3RkbHNfbGlua19lc3RhYmxpc2hfcmVxKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgZVdOSV9TTUVfUkVTRVRfQVBfQ0FQU19DSEFOR0VEOgorCQlfX2xpbV9wcm9jZXNzX3NtZV9yZXNldF9hcF9jYXBzX2NoYW5nZShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGVXTklfU01FX0NIQU5ORUxfQ0hBTkdFX1JFUToKKwkJbGltX3Byb2Nlc3Nfc21lX2NoYW5uZWxfY2hhbmdlX3JlcXVlc3QocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCisJY2FzZSBlV05JX1NNRV9TVEFSVF9CRUFDT05fUkVROgorCQlsaW1fcHJvY2Vzc19zbWVfc3RhcnRfYmVhY29uX3JlcShwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGVXTklfU01FX0RGU19CRUFDT05fQ0hBTl9TV19JRV9SRVE6CisJCWxpbV9wcm9jZXNzX3NtZV9kZnNfY3NhX2llX3JlcXVlc3QocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCisJY2FzZSBlV05JX1NNRV9VUERBVEVfQURESVRJT05BTF9JRVM6CisJCWxpbV9wcm9jZXNzX3VwZGF0ZV9hZGRfaWVzKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfTU9ESUZZX0FERElUSU9OQUxfSUVTOgorCQlsaW1fcHJvY2Vzc19tb2RpZnlfYWRkX2llcyhwTWFjLCBwTXNnQnVmKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9TRVRfSFdfTU9ERV9SRVE6CisJCWxpbV9wcm9jZXNzX3NldF9od19tb2RlKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX05TU19VUERBVEVfUkVROgorCQlsaW1fcHJvY2Vzc19uc3NfdXBkYXRlX3JlcXVlc3QocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfU0VUX0RVQUxfTUFDX0NGR19SRVE6CisJCWxpbV9wcm9jZXNzX3NldF9kdWFsX21hY19jZmdfcmVxKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX1NFVF9JRV9SRVE6CisJCWxpbV9wcm9jZXNzX3NldF9pZV9yZXEocE1hYywgcE1zZ0J1Zik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNkZl9tZW1fZnJlZSgodm9pZCAqKXBNc2ctPmJvZHlwdHIpOworCQlwTXNnLT5ib2R5cHRyID0gTlVMTDsKKwkJYnJlYWs7CisJfSAvKiBzd2l0Y2ggKG1zZ1R5cGUpICovCisKKwlyZXR1cm4gYnVmQ29uc3VtZWQ7Cit9IC8qKiogZW5kIGxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMoKSAqKiovCisKKy8qKgorICogbGltX3Byb2Nlc3Nfc21lX3N0YXJ0X2JlYWNvbl9yZXEoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NNZXNzYWdlUXVldWUoKS4gVGhpcworICogZnVuY3Rpb24gcHJvY2Vzc2VzIFNNRSByZXF1ZXN0IG1lc3NhZ2VzIGZyb20gSEREIG9yIHVwcGVyIGxheWVyCisgKiBhcHBsaWNhdGlvbi4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgbXNnVHlwZSAgIEluZGljYXRlcyB0aGUgU01FIG1lc3NhZ2UgdHlwZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gQm9vbGVhbiAtIHRydWUgLSBpZiBwTXNnQnVmIGlzIGNvbnN1bWVkIGFuZCBjYW4gYmUgZnJlZWQuCisgKiAgICAgICAgICAgICAgICAgICBmYWxzZSAtIGlmIHBNc2dCdWYgaXMgbm90IHRvIGJlIGZyZWVkLgorICovCitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19zbWVfc3RhcnRfYmVhY29uX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZykKK3sKKwl0cFNpclN0YXJ0QmVhY29uSW5kaWNhdGlvbiBwQmVhY29uU3RhcnRJbmQ7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBQRSBzZXNzaW9uSUQgKi8KKworCWlmIChwTXNnID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlwQmVhY29uU3RhcnRJbmQgPSAodHBTaXJTdGFydEJlYWNvbkluZGljYXRpb24pIHBNc2c7CisJcHNlc3Npb25FbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChwTWFjLAorCQkJCXBCZWFjb25TdGFydEluZC0+YnNzaWQsCisJCQkJJnNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcEJlYWNvblN0YXJ0SW5kLT5ic3NpZCwgTE9HRSk7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQmVhY29uU3RhcnRJbmQtPmJlYWNvblN0YXJ0U3RhdHVzID09IHRydWUpIHsKKwkJLyoKKwkJICogQ3VycmVudGx5IHRoaXMgSW5kaWNhdGlvbiBjb21lcyBmcm9tIFNBUAorCQkgKiB0byBzdGFydCBCZWFjb24gVHggb24gYSBERlMgY2hhbm5lbAorCQkgKiBzaW5jZSBiZWFjb25pbmcgaGFzIHRvIGJlIGRvbmUgb24gREZTCisJCSAqIGNoYW5uZWwgb25seSBhZnRlciBDQUMgV0FJVCBpcyBjb21wbGV0ZWQuCisJCSAqIE9uIGEgREZTIENoYW5uZWwgTElNIGRvZXMgbm90IHN0YXJ0IGJlYWNvbgorCQkgKiBUeCByaWdodCBhZnRlciB0aGUgV01BX0FERF9CU1NfUlNQLgorCQkgKi8KKwkJbGltX2FwcGx5X2NvbmZpZ3VyYXRpb24ocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoIlN0YXJ0IEJlYWNvbiB3aXRoIHNzaWQgJXMgQ2ggJWQiKSwKKwkJCSAgcHNlc3Npb25FbnRyeS0+c3NJZC5zc0lkLAorCQkJICBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpOworCQlsaW1fc2VuZF9iZWFjb25faW5kKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCX0gZWxzZSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgQmVhY29uIFN0YXJ0IEluZGljYXRpb24iKSk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3Nfc21lX2NoYW5uZWxfY2hhbmdlX3JlcXVlc3QoKSAtIHByb2Nlc3Mgc21lIGNoIGNoYW5nZSByZXEKKyAqCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1zZ19idWY6IHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgU01FX0NIQU5ORUxfQ0hBTkdFX1JFUSBtZXNzYWdlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX3NtZV9jaGFubmVsX2NoYW5nZV9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQzMl90ICptc2dfYnVmKQoreworCXRwU2lyQ2hhbkNoYW5nZVJlcXVlc3QgY2hfY2hhbmdlX3JlcTsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5OworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsgICAgICAvKiBQRSBzZXNzaW9uX2lkICovCisJdFBvd2VyZEJtIG1heF90eF9wd3I7CisJdWludDMyX3QgdmFsID0gMDsKKworCWlmIChtc2dfYnVmID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgibXNnX2J1ZiBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCWNoX2NoYW5nZV9yZXEgPSAodHBTaXJDaGFuQ2hhbmdlUmVxdWVzdCltc2dfYnVmOworCisJbWF4X3R4X3B3ciA9IGNmZ19nZXRfcmVndWxhdG9yeV9tYXhfdHJhbnNtaXRfcG93ZXIobWFjX2N0eCwKKwkJCWNoX2NoYW5nZV9yZXEtPnRhcmdldENoYW5uZWwpOworCisJaWYgKChjaF9jaGFuZ2VfcmVxLT5tZXNzYWdlVHlwZSAhPSBlV05JX1NNRV9DSEFOTkVMX0NIQU5HRV9SRVEpIHx8CisJCQkobWF4X3R4X3B3ciA9PSBXTUFfTUFYX1RYUE9XRVJfSU5WQUxJRCkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiSW52YWxpZCBSZXF1ZXN0L21heF90eF9wd3IiKSk7CisJCXJldHVybjsKKwl9CisKKwlzZXNzaW9uX2VudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKG1hY19jdHgsCisJCQljaF9jaGFuZ2VfcmVxLT5ic3NpZCwgJnNlc3Npb25faWQpOworCWlmIChzZXNzaW9uX2VudHJ5ID09IE5VTEwpIHsKKwkJbGltX3ByaW50X21hY19hZGRyKG1hY19jdHgsIGNoX2NoYW5nZV9yZXEtPmJzc2lkLCBMT0dFKTsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgKKwkJCSJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzZXNzaW9uX2VudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwgPT0KKwkJCWNoX2NoYW5nZV9yZXEtPnRhcmdldENoYW5uZWwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgidGFyZ2V0IENIIGlzIHNhbWUgYXMgY3VycmVudCBDSCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSkKKwkJc2Vzc2lvbl9lbnRyeS0+Y2hhbm5lbENoYW5nZVJlYXNvbkNvZGUgPQorCQkJTElNX1NXSVRDSF9DSEFOTkVMX1NBUF9ERlM7CisJZWxzZQorCQlzZXNzaW9uX2VudHJ5LT5jaGFubmVsQ2hhbmdlUmVhc29uQ29kZSA9CisJCQlMSU1fU1dJVENIX0NIQU5ORUxfT1BFUkFUSU9OOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgKKwkJCSJzd2l0Y2ggb2xkIGNobmwgJWQgdG8gbmV3IGNobmwgJWQsIGNoX2J3ICVkIiksCisJCQlzZXNzaW9uX2VudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwsCisJCQljaF9jaGFuZ2VfcmVxLT50YXJnZXRDaGFubmVsLAorCQkJY2hfY2hhbmdlX3JlcS0+Y2hhbm5lbF93aWR0aCk7CisKKwkvKiBTdG9yZSB0aGUgTmV3IENoYW5uZWwgUGFyYW1zIGluIHNlc3Npb25fZW50cnkgKi8KKwlzZXNzaW9uX2VudHJ5LT5jaF93aWR0aCA9IGNoX2NoYW5nZV9yZXEtPmNoYW5uZWxfd2lkdGg7CisJc2Vzc2lvbl9lbnRyeS0+Y2hfY2VudGVyX2ZyZXFfc2VnMCA9CisJCWNoX2NoYW5nZV9yZXEtPmNlbnRlcl9mcmVxX3NlZ18wOworCXNlc3Npb25fZW50cnktPmNoX2NlbnRlcl9mcmVxX3NlZzEgPQorCQljaF9jaGFuZ2VfcmVxLT5jZW50ZXJfZnJlcV9zZWdfMTsKKwlzZXNzaW9uX2VudHJ5LT5odFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSBjaF9jaGFuZ2VfcmVxLT5jYk1vZGU7CisJc2Vzc2lvbl9lbnRyeS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkoY2hfY2hhbmdlX3JlcS0+Y2hhbm5lbF93aWR0aCA/IDEgOiAwKTsKKwlzZXNzaW9uX2VudHJ5LT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCA9CisJCXNlc3Npb25fZW50cnktPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworCXNlc3Npb25fZW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCA9CisJCWNoX2NoYW5nZV9yZXEtPnRhcmdldENoYW5uZWw7CisJc2Vzc2lvbl9lbnRyeS0+bGltUkZCYW5kID0KKwkJbGltX2dldF9yZl9iYW5kKHNlc3Npb25fZW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCk7CisJLyogSW5pdGlhbGl6ZSAxMWggRW5hYmxlIEZsYWcgKi8KKwlpZiAoU0lSX0JBTkRfNV9HSFogPT0gc2Vzc2lvbl9lbnRyeS0+bGltUkZCYW5kKSB7CisJCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfMTFIX0VOQUJMRUQsICZ2YWwpICE9CisJCQkJZVNJUl9TVUNDRVNTKQorCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJGYWlsIHRvIGdldCBXTklfQ0ZHXzExSF9FTkFCTEVEIikpOworCX0KKworCXNlc3Npb25fZW50cnktPmxpbTExaEVuYWJsZSA9IHZhbDsKKwlzZXNzaW9uX2VudHJ5LT5kb3QxMW1vZGUgPSBjaF9jaGFuZ2VfcmVxLT5kb3QxMW1vZGU7CisJY2RmX21lbV9jb3B5KCZzZXNzaW9uX2VudHJ5LT5yYXRlU2V0LAorCQkJJmNoX2NoYW5nZV9yZXEtPm9wZXJhdGlvbmFsX3JhdGVzZXQsCisJCQlzaXplb2Yoc2Vzc2lvbl9lbnRyeS0+cmF0ZVNldCkpOworCWNkZl9tZW1fY29weSgmc2Vzc2lvbl9lbnRyeS0+ZXh0UmF0ZVNldCwKKwkJCSZjaF9jaGFuZ2VfcmVxLT5leHRlbmRlZF9yYXRlc2V0LAorCQkJc2l6ZW9mKHNlc3Npb25fZW50cnktPmV4dFJhdGVTZXQpKTsKKwlsaW1fc2V0X2NoYW5uZWwobWFjX2N0eCwgY2hfY2hhbmdlX3JlcS0+dGFyZ2V0Q2hhbm5lbCwKKwkJCXNlc3Npb25fZW50cnktPmNoX2NlbnRlcl9mcmVxX3NlZzAsCisJCQlzZXNzaW9uX2VudHJ5LT5jaF9jZW50ZXJfZnJlcV9zZWcxLAorCQkJc2Vzc2lvbl9lbnRyeS0+Y2hfd2lkdGgsCisJCQltYXhfdHhfcHdyLCBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbGltX3N0YXJ0X2Jzc191cGRhdGVfYWRkX2llX2J1ZmZlcigpCisqCisqKipGVU5DVElPTjoKKyogVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIHNyYyBidWZmZXIgYW5kIGl0cyBsZW5ndGggYW5kIHRoZW4gbWFsbG9jIGZvcgorKiBkc3QgYnVmZmVyIHVwZGF0ZSB0aGUgc2FtZQorKgorKioqTE9HSUM6CisqCisqKipBU1NVTVBUSU9OUzoKKyoKKyoqKk5PVEU6CisqCisqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyogQHBhcmFtICAqKnBEc3REYXRhX2J1ZmYgIEEgcG9pbnRlciB0byBwb2ludGVyIG9mICB1aW50OF90IGRzdCBidWZmZXIKKyogQHBhcmFtICAqcERzdERhdGFMZW4gIEEgcG9pbnRlciB0byBwb2ludGVyIG9mICB1aW50MTZfdCBkc3QgYnVmZmVyIGxlbmd0aAorKiBAcGFyYW0gICpwU3JjRGF0YV9idWZmICBBIHBvaW50ZXIgb2YgIHVpbnQ4X3QgIHNyYyBidWZmZXIKKyogQHBhcmFtICBzcmNEYXRhTGVuICBzcmMgYnVmZmVyIGxlbmd0aAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorbGltX3N0YXJ0X2Jzc191cGRhdGVfYWRkX2llX2J1ZmZlcih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgIHVpbnQ4X3QgKipwRHN0RGF0YV9idWZmLAorCQkJCSAgIHVpbnQxNl90ICpwRHN0RGF0YUxlbiwKKwkJCQkgICB1aW50OF90ICpwU3JjRGF0YV9idWZmLCB1aW50MTZfdCBzcmNEYXRhTGVuKQoreworCisJaWYgKHNyY0RhdGFMZW4gPiAwICYmIHBTcmNEYXRhX2J1ZmYgIT0gTlVMTCkgeworCQkqcERzdERhdGFMZW4gPSBzcmNEYXRhTGVuOworCisJCSpwRHN0RGF0YV9idWZmID0gY2RmX21lbV9tYWxsb2MoKnBEc3REYXRhTGVuKTsKKworCQlpZiAoTlVMTCA9PSAqcERzdERhdGFfYnVmZikgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIHBEc3REYXRhX2J1ZmYiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJY2RmX21lbV9jb3B5KCpwRHN0RGF0YV9idWZmLCBwU3JjRGF0YV9idWZmLCAqcERzdERhdGFMZW4pOworCX0gZWxzZSB7CisJCSpwRHN0RGF0YV9idWZmID0gTlVMTDsKKwkJKnBEc3REYXRhTGVuID0gMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbGltX3VwZGF0ZV9hZGRfaWVfYnVmZmVyKCkKKyoKKyoqKkZVTkNUSU9OOgorKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgc3JjIGJ1ZmZlciBhbmQgbGVuZ3RoIGlmIHNyYyBidWZmZXIgbGVuZ3RoIG1vcmUKKyogdGhhbiBkc3QgYnVmZmVyIGxlbmd0aCB0aGVuIGZyZWUgdGhlIGRzdCBidWZmZXIgYW5kIG1hbGxvYyBmb3IgdGhlIG5ldyBzcmMKKyogbGVuZ3RoLCBhbmQgdXBkYXRlIHRoZSBkc3QgYnVmZmVyIGFuZCBsZW5ndGguIEJ1dCBpZiBkc3QgYnVmZmVyIGlzIGJpZ2dlcgorKiB0aGFuIHNyYyBidWZmZXIgbGVuZ3RoIHRoZW4gaXQganVzdCB1cGRhdGUgdGhlIGRzdCBidWZmZXIgYW5kIGxlbmd0aAorKgorKioqTE9HSUM6CisqCisqKipBU1NVTVBUSU9OUzoKKyoKKyoqKk5PVEU6CisqCisqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyogQHBhcmFtICAqKnBEc3REYXRhX2J1ZmYgIEEgcG9pbnRlciB0byBwb2ludGVyIG9mICB1aW50OF90IGRzdCBidWZmZXIKKyogQHBhcmFtICAqcERzdERhdGFMZW4gIEEgcG9pbnRlciB0byBwb2ludGVyIG9mICB1aW50MTZfdCBkc3QgYnVmZmVyIGxlbmd0aAorKiBAcGFyYW0gICpwU3JjRGF0YV9idWZmICBBIHBvaW50ZXIgb2YgIHVpbnQ4X3QgIHNyYyBidWZmZXIKKyogQHBhcmFtICBzcmNEYXRhTGVuICBzcmMgYnVmZmVyIGxlbmd0aAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorbGltX3VwZGF0ZV9hZGRfaWVfYnVmZmVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgdWludDhfdCAqKnBEc3REYXRhX2J1ZmYsCisJCQkgdWludDE2X3QgKnBEc3REYXRhTGVuLAorCQkJIHVpbnQ4X3QgKnBTcmNEYXRhX2J1ZmYsIHVpbnQxNl90IHNyY0RhdGFMZW4pCit7CisKKwlpZiAoTlVMTCA9PSBwU3JjRGF0YV9idWZmKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoInNyYyBidWZmZXIgaXMgbnVsbC4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3JjRGF0YUxlbiA+ICpwRHN0RGF0YUxlbikgeworCQkqcERzdERhdGFMZW4gPSBzcmNEYXRhTGVuOworCQkvKiBmcmVlIG9sZCBidWZmZXIgKi8KKwkJY2RmX21lbV9mcmVlKCpwRHN0RGF0YV9idWZmKTsKKwkJLyogYWxsb2NhdGUgYSBuZXcgKi8KKwkJKnBEc3REYXRhX2J1ZmYgPSBjZGZfbWVtX21hbGxvYygqcERzdERhdGFMZW4pOworCisJCWlmIChOVUxMID09ICpwRHN0RGF0YV9idWZmKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIikpOworCQkJKnBEc3REYXRhTGVuID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIGNvcHkgdGhlIGNvbnRlbnQgb2YgYnVmZmVyIGludG8gZHN0IGJ1ZmZlcgorCSAqLworCSpwRHN0RGF0YUxlbiA9IHNyY0RhdGFMZW47CisJY2RmX21lbV9jb3B5KCpwRHN0RGF0YV9idWZmLCBwU3JjRGF0YV9idWZmLCAqcERzdERhdGFMZW4pOworCit9CisKKy8qCisqIGxpbV9wcm9jZXNzX21vZGlmeV9hZGRfaWVzKCkgLSBwcm9jZXNzIG1vZGlmeSBhZGRpdGlvbmFsIElFIHJlcS4KKyoKKyogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyogQG1zZ19idWY6IHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorKgorKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZSB0aGUgUEUgYnVmZmVycyBmb3IgYWRkaXRpb25hbCBJRXMuCisqCisqIFJldHVybjogTm9uZQorKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX21vZGlmeV9hZGRfaWVzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQzMl90ICptc2dfYnVmKQoreworCXRwU2lyTW9kaWZ5SUVzSW5kIG1vZGlmeV9hZGRfaWVzOworCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnk7CisJdWludDhfdCBzZXNzaW9uX2lkOworCWJvb2wgcmV0ID0gZmFsc2U7CisJdFNpckFkZEllUGFyYW1zICphZGRfaWVfcGFyYW1zOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJtc2dfYnVmIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwltb2RpZnlfYWRkX2llcyA9ICh0cFNpck1vZGlmeUlFc0luZCltc2dfYnVmOworCS8qIEluY29taW5nIG1lc3NhZ2UgaGFzIHNtZVNlc3Npb24sIHVzZSBCU1NJRCB0byBmaW5kIFBFIHNlc3Npb24gKi8KKwlzZXNzaW9uX2VudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKG1hY19jdHgsCisJCQltb2RpZnlfYWRkX2llcy0+bW9kaWZ5SUUuYnNzaWQsICZzZXNzaW9uX2lkKTsKKworCWlmIChOVUxMID09IHNlc3Npb25fZW50cnkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiU2Vzc2lvbiBub3QgZm91bmQgZm9yIGdpdmVuIGJzc2lkLiAiCisJCQkJCU1BQ19BRERSRVNTX1NUUiksCisJCU1BQ19BRERSX0FSUkFZKG1vZGlmeV9hZGRfaWVzLT5tb2RpZnlJRS5ic3NpZCkpOworCQlnb3RvIGVuZDsKKwl9CisJaWYgKCgwID09IG1vZGlmeV9hZGRfaWVzLT5tb2RpZnlJRS5pZUJ1ZmZlcmxlbmd0aCkgfHwKKwkJKDAgPT0gbW9kaWZ5X2FkZF9pZXMtPm1vZGlmeUlFLmllSURMZW4pIHx8CisJCShOVUxMID09IG1vZGlmeV9hZGRfaWVzLT5tb2RpZnlJRS5wSUVCdWZmZXIpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJJbnZhbGlkIHJlcXVlc3QgcElFQnVmZmVyICVwIGllQnVmZmVybGVuZ3RoICVkIGllSURMZW4gJWQgaWVJRCAlZC4gdXBkYXRlIFR5cGUgJWQiKSwKKwkJCQltb2RpZnlfYWRkX2llcy0+bW9kaWZ5SUUucElFQnVmZmVyLAorCQkJCW1vZGlmeV9hZGRfaWVzLT5tb2RpZnlJRS5pZUJ1ZmZlcmxlbmd0aCwKKwkJCQltb2RpZnlfYWRkX2llcy0+bW9kaWZ5SUUuaWVJRCwKKwkJCQltb2RpZnlfYWRkX2llcy0+bW9kaWZ5SUUuaWVJRExlbiwKKwkJCQltb2RpZnlfYWRkX2llcy0+dXBkYXRlVHlwZSk7CisJCWdvdG8gZW5kOworCX0KKwlhZGRfaWVfcGFyYW1zID0gJnNlc3Npb25fZW50cnktPmFkZEllUGFyYW1zOworCXN3aXRjaCAobW9kaWZ5X2FkZF9pZXMtPnVwZGF0ZVR5cGUpIHsKKwljYXNlIGVVUERBVEVfSUVfUFJPQkVfUkVTUDoKKwkJLyogUHJvYmUgcmVzcCAqLworCQlicmVhazsKKwljYXNlIGVVUERBVEVfSUVfQVNTT0NfUkVTUDoKKwkJLyogYXNzb2MgcmVzcCBJRSAqLworCQlpZiAoYWRkX2llX3BhcmFtcy0+YXNzb2NSZXNwRGF0YUxlbiA9PSAwKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgKKwkJCQkiYXNzb2MgcmVzcCBhZGQgaWUgbm90IHByZXNlbnQgJWQiKSwKKwkJCQlhZGRfaWVfcGFyYW1zLT5hc3NvY1Jlc3BEYXRhTGVuKTsKKwkJfQorCQkvKiBzZWFyY2ggdGhyb3VnaCB0aGUgYnVmZmVyIGFuZCBtb2RpZnkgdGhlIElFICovCisJCWJyZWFrOworCWNhc2UgZVVQREFURV9JRV9QUk9CRV9CQ046CisJCS8qcHJvYmUgYmVhY29uIElFICovCisJCWlmIChyZXQgPT0gdHJ1ZSAmJiBtb2RpZnlfYWRkX2llcy0+bW9kaWZ5SUUubm90aWZ5KSB7CisJCQlsaW1faGFuZGxlX3BhcmFtX3VwZGF0ZShtYWNfY3R4LAorCQkJCQltb2RpZnlfYWRkX2llcy0+dXBkYXRlVHlwZSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgidW5oYW5kbGVkIGJ1ZmZlciB0eXBlICVkIiksCisJCQkJbW9kaWZ5X2FkZF9pZXMtPnVwZGF0ZVR5cGUpOworCQlicmVhazsKKwl9CitlbmQ6CisJY2RmX21lbV9mcmVlKG1vZGlmeV9hZGRfaWVzLT5tb2RpZnlJRS5wSUVCdWZmZXIpOworCW1vZGlmeV9hZGRfaWVzLT5tb2RpZnlJRS5wSUVCdWZmZXIgPSBOVUxMOworfQorCisvKgorKiBsaW1fcHJvY2Vzc191cGRhdGVfYWRkX2llcygpIC0gcHJvY2VzcyBhZGRpdGlvbmFsIElFIHVwZGF0ZSByZXEKKyoKKyogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyogQG1zZ19idWY6IHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorKgorKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZSB0aGUgUEUgYnVmZmVycyBmb3IgYWRkaXRpb25hbCBJRXMuCisqCisqIFJldHVybjogTm9uZQorKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX3VwZGF0ZV9hZGRfaWVzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQzMl90ICptc2dfYnVmKQoreworCXRwU2lyVXBkYXRlSUVzSW5kIHVwZGF0ZV9hZGRfaWVzID0gKHRwU2lyVXBkYXRlSUVzSW5kKW1zZ19idWY7CisJdWludDhfdCBzZXNzaW9uX2lkOworCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnk7CisJdFNpckFkZEllUGFyYW1zICphZGRuX2llOworCXVpbnQxNl90IG5ld19sZW5ndGggPSAwOworCXVpbnQ4X3QgKm5ld19wdHIgPSBOVUxMOworCXRTaXJVcGRhdGVJRSAqdXBkYXRlX2llOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJtc2dfYnVmIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisJdXBkYXRlX2llID0gJnVwZGF0ZV9hZGRfaWVzLT51cGRhdGVJRTsKKwkvKiBpbmNvbWluZyBtZXNzYWdlIGhhcyBzbWVTZXNzaW9uLCB1c2UgQlNTSUQgdG8gZmluZCBQRSBzZXNzaW9uICovCisJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChtYWNfY3R4LAorCQkJdXBkYXRlX2llLT5ic3NpZCwgJnNlc3Npb25faWQpOworCisJaWYgKE5VTEwgPT0gc2Vzc2lvbl9lbnRyeSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJTZXNzaW9uIG5vdCBmb3VuZCBmb3IgZ2l2ZW4gYnNzaWQuICIKKwkJCQkgICAgICAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCU1BQ19BRERSX0FSUkFZKHVwZGF0ZV9pZS0+YnNzaWQpKTsKKwkJZ290byBlbmQ7CisJfQorCWFkZG5faWUgPSAmc2Vzc2lvbl9lbnRyeS0+YWRkSWVQYXJhbXM7CisJLyogaWYgbGVuIGlzIDAsIHVwcGVyIGxheWVyIHJlcXVlc3RlZCBmcmVlaW5nIG9mIGJ1ZmZlciAqLworCWlmICgwID09IHVwZGF0ZV9pZS0+aWVCdWZmZXJsZW5ndGgpIHsKKwkJc3dpdGNoICh1cGRhdGVfYWRkX2llcy0+dXBkYXRlVHlwZSkgeworCQljYXNlIGVVUERBVEVfSUVfUFJPQkVfUkVTUDoKKwkJCWNkZl9tZW1fZnJlZShhZGRuX2llLT5wcm9iZVJlc3BEYXRhX2J1ZmYpOworCQkJYWRkbl9pZS0+cHJvYmVSZXNwRGF0YV9idWZmID0gTlVMTDsKKwkJCWFkZG5faWUtPnByb2JlUmVzcERhdGFMZW4gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgZVVQREFURV9JRV9BU1NPQ19SRVNQOgorCQkJY2RmX21lbV9mcmVlKGFkZG5faWUtPmFzc29jUmVzcERhdGFfYnVmZik7CisJCQlhZGRuX2llLT5hc3NvY1Jlc3BEYXRhX2J1ZmYgPSBOVUxMOworCQkJYWRkbl9pZS0+YXNzb2NSZXNwRGF0YUxlbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBlVVBEQVRFX0lFX1BST0JFX0JDTjoKKwkJCWNkZl9tZW1fZnJlZShhZGRuX2llLT5wcm9iZVJlc3BCQ05EYXRhX2J1ZmYpOworCQkJYWRkbl9pZS0+cHJvYmVSZXNwQkNORGF0YV9idWZmID0gTlVMTDsKKwkJCWFkZG5faWUtPnByb2JlUmVzcEJDTkRhdGFMZW4gPSAwOworCisJCQlpZiAodXBkYXRlX2llLT5ub3RpZnkpCisJCQkJbGltX2hhbmRsZV9wYXJhbV91cGRhdGUobWFjX2N0eCwKKwkJCQkJCXVwZGF0ZV9hZGRfaWVzLT51cGRhdGVUeXBlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKHVwZGF0ZV9hZGRfaWVzLT51cGRhdGVUeXBlKSB7CisJY2FzZSBlVVBEQVRFX0lFX1BST0JFX1JFU1A6CisJCWlmICh1cGRhdGVfaWUtPmFwcGVuZCkgeworCQkJLyoKKwkJCSAqIEluIGNhc2Ugb2YgYXBwZW5kLCBhbGxvY2F0ZSBuZXcgbWVtb3J5CisJCQkgKiB3aXRoIGNvbWJpbmVkIGxlbmd0aAorCQkJICovCisJCQluZXdfbGVuZ3RoID0gdXBkYXRlX2llLT5pZUJ1ZmZlcmxlbmd0aCArCisJCQkJYWRkbl9pZS0+cHJvYmVSZXNwRGF0YUxlbjsKKwkJCW5ld19wdHIgPSBjZGZfbWVtX21hbGxvYyhuZXdfbGVuZ3RoKTsKKwkJCWlmIChOVUxMID09IG5ld19wdHIpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKAorCQkJCQkJIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4iKSk7CisJCQkJZ290byBlbmQ7CisJCQl9CisJCQkvKiBhcHBlbmQgYnVmZmVyIHRvIGVuZCBvZiBsb2NhbCBidWZmZXJzICovCisJCQljZGZfbWVtX2NvcHkobmV3X3B0ciwgYWRkbl9pZS0+cHJvYmVSZXNwRGF0YV9idWZmLAorCQkJCQlhZGRuX2llLT5wcm9iZVJlc3BEYXRhTGVuKTsKKwkJCWNkZl9tZW1fY29weSgmbmV3X3B0clthZGRuX2llLT5wcm9iZVJlc3BEYXRhTGVuXSwKKwkJCQkgICAgIHVwZGF0ZV9pZS0+cEFkZGl0aW9uSUVCdWZmZXIsCisJCQkJICAgICB1cGRhdGVfaWUtPmllQnVmZmVybGVuZ3RoKTsKKwkJCS8qIGZyZWUgb2xkIG1lbW9yeSAqLworCQkJY2RmX21lbV9mcmVlKGFkZG5faWUtPnByb2JlUmVzcERhdGFfYnVmZik7CisJCQkvKiBhZGp1c3QgbGVuZ3RoIGFjY29yZGluZ2x5ICovCisJCQlhZGRuX2llLT5wcm9iZVJlc3BEYXRhTGVuID0gbmV3X2xlbmd0aDsKKwkJCS8qIHNhdmUgcmVmZXJuZWNlIG9mIGxvY2FsIGJ1ZmZlciBpbiBQRSBzZXNzaW9uICovCisJCQlhZGRuX2llLT5wcm9iZVJlc3BEYXRhX2J1ZmYgPSBuZXdfcHRyOworCQkJZ290byBlbmQ7CisJCX0KKwkJbGltX3VwZGF0ZV9hZGRfaWVfYnVmZmVyKG1hY19jdHgsICZhZGRuX2llLT5wcm9iZVJlc3BEYXRhX2J1ZmYsCisJCQkJJmFkZG5faWUtPnByb2JlUmVzcERhdGFMZW4sCisJCQkJdXBkYXRlX2llLT5wQWRkaXRpb25JRUJ1ZmZlciwKKwkJCQl1cGRhdGVfaWUtPmllQnVmZmVybGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBlVVBEQVRFX0lFX0FTU09DX1JFU1A6CisJCS8qIGFzc29jIHJlc3AgSUUgKi8KKwkJbGltX3VwZGF0ZV9hZGRfaWVfYnVmZmVyKG1hY19jdHgsICZhZGRuX2llLT5hc3NvY1Jlc3BEYXRhX2J1ZmYsCisJCQkJJmFkZG5faWUtPmFzc29jUmVzcERhdGFMZW4sCisJCQkJdXBkYXRlX2llLT5wQWRkaXRpb25JRUJ1ZmZlciwKKwkJCQl1cGRhdGVfaWUtPmllQnVmZmVybGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBlVVBEQVRFX0lFX1BST0JFX0JDTjoKKwkJLyogcHJvYmUgcmVzcCBCY24gSUUgKi8KKwkJbGltX3VwZGF0ZV9hZGRfaWVfYnVmZmVyKG1hY19jdHgsCisJCQkJJmFkZG5faWUtPnByb2JlUmVzcEJDTkRhdGFfYnVmZiwKKwkJCQkmYWRkbl9pZS0+cHJvYmVSZXNwQkNORGF0YUxlbiwKKwkJCQl1cGRhdGVfaWUtPnBBZGRpdGlvbklFQnVmZmVyLAorCQkJCXVwZGF0ZV9pZS0+aWVCdWZmZXJsZW5ndGgpOworCQlpZiAodXBkYXRlX2llLT5ub3RpZnkpCisJCQlsaW1faGFuZGxlX3BhcmFtX3VwZGF0ZShtYWNfY3R4LAorCQkJCQl1cGRhdGVfYWRkX2llcy0+dXBkYXRlVHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoInVuaGFuZGxlZCBidWZmZXIgdHlwZSAlZC4iKSwKKwkJCXVwZGF0ZV9hZGRfaWVzLT51cGRhdGVUeXBlKTsKKwkJYnJlYWs7CisJfQorZW5kOgorCWNkZl9tZW1fZnJlZSh1cGRhdGVfaWUtPnBBZGRpdGlvbklFQnVmZmVyKTsKKwl1cGRhdGVfaWUtPnBBZGRpdGlvbklFQnVmZmVyID0gTlVMTDsKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19zbWVfZGZzX2NzYV9pZV9yZXF1ZXN0KCkgLSBwcm9jZXNzIHNtZSBkZnMgY3NhIGllIHJlcQorICoKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAbXNnX2J1ZjogcG9pbnRlciB0byB0aGUgU01FIG1lc3NhZ2UgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgU01FIHJlcXVlc3QgbWVzc2FnZXMgZnJvbSBIREQgb3IgdXBwZXIgbGF5ZXIKKyAqIGFwcGxpY2F0aW9uLgorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBsaW1fcHJvY2Vzc19zbWVfZGZzX2NzYV9pZV9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQzMl90ICptc2dfYnVmKQoreworCXRwU2lyRGZzQ3NhSWVSZXF1ZXN0IGRmc19jc2FfaWVfcmVxOworCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkgPSBOVUxMOworCXVpbnQzMl90IGNoX3dpZHRoID0gMDsKKwl1aW50OF90IHNlc3Npb25faWQ7CisJdExpbVdpZGVyQldDaGFubmVsU3dpdGNoSW5mbyAqd2lkZXJfYndfY2hfc3dpdGNoOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCWRmc19jc2FfaWVfcmVxID0gKHRTaXJEZnNDc2FJZVJlcXVlc3QgKiltc2dfYnVmOworCXNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQobWFjX2N0eCwKKwkJCWRmc19jc2FfaWVfcmVxLT5ic3NpZCwgJnNlc3Npb25faWQpOworCWlmIChzZXNzaW9uX2VudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgKKwkJCSJTZXNzaW9uIG5vdCBmb3VuZCBmb3IgZ2l2ZW4gQlNTSUQiIE1BQ19BRERSRVNTX1NUUiksCisJCQlNQUNfQUREUl9BUlJBWShkZnNfY3NhX2llX3JlcS0+YnNzaWQpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzZXNzaW9uX2VudHJ5LT52YWxpZCAmJiAhTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiSW52YWxpZCBTeXN0ZW1Sb2xlICVkIiksCisJCQlHRVRfTElNX1NZU1RFTV9ST0xFKHNlc3Npb25fZW50cnkpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHRhcmdldCBjaGFubmVsICovCisJc2Vzc2lvbl9lbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2gucHJpbWFyeUNoYW5uZWwgPQorCQlkZnNfY3NhX2llX3JlcS0+dGFyZ2V0Q2hhbm5lbDsKKworCS8qIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBuZWVkcyB0byBiZSBpbmNsdWRlZCBpbiBiZWFjb24gKi8KKwlzZXNzaW9uX2VudHJ5LT5kZnNJbmNsdWRlQ2hhblN3SWUgPSB0cnVlOworCXNlc3Npb25fZW50cnktPmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaENvdW50ID0gTElNX01BWF9DU0FfSUVfVVBEQVRFUzsKKwlzZXNzaW9uX2VudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5jaF93aWR0aCA9CisJCQkJIGRmc19jc2FfaWVfcmVxLT5jaF9iYW5kd2lkdGg7CisJaWYgKG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLmRpc2FibGVfZGZzX2NoX3N3aXRjaCA9PSBmYWxzZSkKKwkJc2Vzc2lvbl9lbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoTW9kZSA9IDE7CisKKwkvKgorCSAqIFZhbGlkYXRlIGlmIFNBUCBpcyBvcGVyYXRpbmcgSFQgb3IgVkhUIG1vZGUgYW5kIHNldCB0aGUgQ2hhbm5lbAorCSAqIFN3aXRjaCBXcmFwcGVyIGVsZW1lbnQgd2l0aCB0aGUgV2lkZSBCYW5kIFN3aXRjaCBzdWJlbGVtZW50LgorCSAqLworCWlmICh0cnVlICE9IHNlc3Npb25fZW50cnktPnZodENhcGFiaWxpdHkpCisJCWdvdG8gc2tpcF92aHQ7CisKKwlpZiAoV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF84ME1IWiA9PQorCQkJc2Vzc2lvbl9lbnRyeS0+dmh0VHhDaGFubmVsV2lkdGhTZXQpCisJCWNoX3dpZHRoID0gZUhUX0NIQU5ORUxfV0lEVEhfODBNSFo7CisJZWxzZSBpZiAoV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF8yMF80ME1IWiA9PQorCQkJc2Vzc2lvbl9lbnRyeS0+dmh0VHhDaGFubmVsV2lkdGhTZXQpCisJCWNoX3dpZHRoID0gc2Vzc2lvbl9lbnRyeS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJLyogTm93IGVuY29kZSB0aGUgV2lkZXIgQ2ggQlcgZWxlbWVudCBkZXBlbmRpbmcgb24gdGhlIGNoIHdpZHRoICovCisJd2lkZXJfYndfY2hfc3dpdGNoID0gJnNlc3Npb25fZW50cnktPmdMaW1XaWRlckJXQ2hhbm5lbFN3aXRjaDsKKwlzd2l0Y2ggKGNoX3dpZHRoKSB7CisJY2FzZSBlSFRfQ0hBTk5FTF9XSURUSF8yME1IWjoKKwkJLyoKKwkJICogV2lkZSBjaGFubmVsIEJXIHN1YmxlbWVudCBpbiBjaGFubmVsIHdyYXBwZXIgZWxlbWVudCBpcyBub3QKKwkJICogcmVxdWlyZWQgaW4gY2FzZSBvZiAyMCBNaHogb3BlcmF0aW9uLiBDdXJyZW50bHkgSXQgaXMgc2V0CisJCSAqIG9ubHkgc2V0IGluIGNhc2Ugb2YgNDAvODAgTWh6IE9wZXJhdGlvbi4KKwkJICovCisJCXNlc3Npb25fZW50cnktPmRmc0luY2x1ZGVDaGFuV3JhcHBlckllID0gZmFsc2U7CisJCXdpZGVyX2J3X2NoX3N3aXRjaC0+bmV3Q2hhbldpZHRoID0KKwkJCVdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfMjBfNDBNSFo7CisJCWJyZWFrOworCWNhc2UgZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFo6CisJCXNlc3Npb25fZW50cnktPmRmc0luY2x1ZGVDaGFuV3JhcHBlckllID0gdHJ1ZTsKKwkJd2lkZXJfYndfY2hfc3dpdGNoLT5uZXdDaGFuV2lkdGggPQorCQkJV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF8yMF80ME1IWjsKKwkJYnJlYWs7CisJY2FzZSBlSFRfQ0hBTk5FTF9XSURUSF84ME1IWjoKKwkJc2Vzc2lvbl9lbnRyeS0+ZGZzSW5jbHVkZUNoYW5XcmFwcGVySWUgPSB0cnVlOworCQl3aWRlcl9id19jaF9zd2l0Y2gtPm5ld0NoYW5XaWR0aCA9CisJCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzgwTUhaOworCQlicmVhazsKKwljYXNlIGVIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWjoKKwkJc2Vzc2lvbl9lbnRyeS0+ZGZzSW5jbHVkZUNoYW5XcmFwcGVySWUgPSB0cnVlOworCQl3aWRlcl9id19jaF9zd2l0Y2gtPm5ld0NoYW5XaWR0aCA9CisJCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2Vzc2lvbl9lbnRyeS0+ZGZzSW5jbHVkZUNoYW5XcmFwcGVySWUgPSBmYWxzZTsKKwkJLyoKKwkJICogTmVlZCB0byBoYW5kbGUgODArODAgTWh6IFNjZW5hcmlvLiBXaGVuIDgwKzgwIGlzIHN1cHBvcnRlZAorCQkgKiBzZXQgdGhlIGdMaW1XaWRlckJXQ2hhbm5lbFN3aXRjaC5uZXdDaGFuV2lkdGggdG8gMworCQkgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiSW52YWxpZCBDaGFubmVsIFdpZHRoIikpOworCQlicmVhazsKKwl9CisJLyogRmV0Y2ggdGhlIGNlbnRlciBjaGFubmVsIGJhc2VkIG9uIHRoZSBjaGFubmVsIHdpZHRoICovCisJd2lkZXJfYndfY2hfc3dpdGNoLT5uZXdDZW50ZXJDaGFuRnJlcTAgPQorCQlsaW1fZ2V0X2NlbnRlcl9jaGFubmVsKG1hY19jdHgsIGRmc19jc2FfaWVfcmVxLT50YXJnZXRDaGFubmVsLAorCQkJCSAgICAgICBzZXNzaW9uX2VudHJ5LT5odFNlY29uZGFyeUNoYW5uZWxPZmZzZXQsCisJCQkJICAgICAgIHdpZGVyX2J3X2NoX3N3aXRjaC0+bmV3Q2hhbldpZHRoKTsKKwkvKgorCSAqIFRoaXMgaXMgbm90IGFwcGxpY2FibGUgZm9yIDIwLzQwLzgwIE1oei5Pbmx5IHVzZWQgd2hlbiB3ZSBzdXBwb3J0CisJICogODArODAgTWh6IG9wZXJhdGlvbi4gSW4gY2FzZSBvZiA4MCs4MCBNaHosIHRoaXMgcGFyYW1ldGVyIGluZGljYXRlcworCSAqIGNlbnRlciBjaGFubmVsIGZyZXF1ZW5jeSBpbmRleCBvZiA4MCBNaHogY2hhbm5lbCBvZgorCSAqIGZyZXF1ZW5jeSBzZWdtZW50IDEuCisJICovCisJd2lkZXJfYndfY2hfc3dpdGNoLT5uZXdDZW50ZXJDaGFuRnJlcTEgPSAwOworc2tpcF92aHQ6CisJLyogU2VuZCBDU0EgSUUgcmVxdWVzdCBmcm9tIGhlcmUgKi8KKwlpZiAoc2NoX3NldF9maXhlZF9iZWFjb25fZmllbGRzKG1hY19jdHgsIHNlc3Npb25fZW50cnkpICE9CisJCQllU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiVW5hYmxlIHRvIHNldCBDU0EgSUUgaW4gYmVhY29uIikpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBGaXJzdCBiZWFjb24gdXBkYXRlIHJlcXVlc3QgaXMgc2VudCBoZXJlLCB0aGUgcmVtYWluaW5nIHVwZGF0ZXMgYXJlCisJICogZG9uZSB3aGVuIHRoZSBGVyByZXNwb25kcyBiYWNrIGFmdGVyIHNlbmRpbmcgdGhlIGZpcnN0IGJlYWNvbiBhZnRlcgorCSAqIHRoZSB0ZW1wbGF0ZSB1cGRhdGUKKwkgKi8KKwlsaW1fc2VuZF9iZWFjb25faW5kKG1hY19jdHgsIHNlc3Npb25fZW50cnkpOworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlVwZGF0ZWQgQ1NBIElFLCBJRSBDT1VOVCA9ICVkIiksCisJCSAgICAgICBzZXNzaW9uX2VudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hDb3VudCk7CisJc2Vzc2lvbl9lbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQtLTsKK30KKworLyoqCisgKiBsaW1fcHJvY2Vzc19uc3NfdXBkYXRlX3JlcXVlc3QoKSAtIHByb2Nlc3Mgc21lIG5zcyB1cGRhdGUgcmVxCisgKgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2dfYnVmOiBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBTTUUgcmVxdWVzdCBtZXNzYWdlcyBmcm9tIEhERCBvciB1cHBlciBsYXllcgorICogYXBwbGljYXRpb24uCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbV9wcm9jZXNzX25zc191cGRhdGVfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50MzJfdCAqbXNnX2J1ZikKK3sKKwlzdHJ1Y3Qgc2lyX25zc191cGRhdGVfcmVxdWVzdCAqbnNzX3VwZGF0ZV9yZXFfcHRyOworCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkgPSBOVUxMOworCisJaWYgKG1zZ19idWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCW5zc191cGRhdGVfcmVxX3B0ciA9IChzdHJ1Y3Qgc2lyX25zc191cGRhdGVfcmVxdWVzdCAqKW1zZ19idWY7CisJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKG1hY19jdHgsCisJCQkJbnNzX3VwZGF0ZV9yZXFfcHRyLT52ZGV2X2lkKTsKKwlpZiAoc2Vzc2lvbl9lbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoCisJCQkiU2Vzc2lvbiBub3QgZm91bmQgZm9yIGdpdmVuIHNlc3Npb25faWQgJWQiKSwKKwkJCW5zc191cGRhdGVfcmVxX3B0ci0+dmRldl9pZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2Vzc2lvbl9lbnRyeS0+dmFsaWQgJiYgIUxJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkludmFsaWQgU3lzdGVtUm9sZSAlZCIpLAorCQkJR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uX2VudHJ5KSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBwb3B1bGF0ZSBuc3MgZmllbGQgaW4gdGhlIGJlYWNvbiAqLworCXNlc3Npb25fZW50cnktPmdMaW1PcGVyYXRpbmdNb2RlLnByZXNlbnQgPSAxOworCXNlc3Npb25fZW50cnktPmdMaW1PcGVyYXRpbmdNb2RlLnJ4TlNTID0gbnNzX3VwZGF0ZV9yZXFfcHRyLT5uZXdfbnNzOworCS8qIFNlbmQgbnNzIHVwZGF0ZSByZXF1ZXN0IGZyb20gaGVyZSAqLworCWlmIChzY2hfc2V0X2ZpeGVkX2JlYWNvbl9maWVsZHMobWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSkgIT0KKwkJCWVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiVW5hYmxlIHRvIHNldCBvcCBtb2RlIElFIGluIGJlYWNvbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWxpbV9zZW5kX2JlYWNvbl9pbmQobWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSk7Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3Nfc2V0X2llX3JlcSgpIC0gcHJvY2VzcyBzbWUgc2V0IElFIHJlcXVlc3QKKyAqCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1zZ19idWY6IHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIFNNRSByZXF1ZXN0IG1lc3NhZ2VzIGZyb20gSEREIG9yIHVwcGVyIGxheWVyCisgKiBhcHBsaWNhdGlvbi4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX3Byb2Nlc3Nfc2V0X2llX3JlcSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCAqbXNnX2J1ZikKK3sKKwlzdHJ1Y3Qgc2VuZF9leHRjYXBfaWUgKm1zZzsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCWlmIChtc2dfYnVmID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwltc2cgPSAoc3RydWN0IHNlbmRfZXh0Y2FwX2llICopbXNnX2J1ZjsKKwlzdGF0dXMgPSBsaW1fc2VuZF9leHRfY2FwX2llKG1hY19jdHgsIG1zZy0+c2Vzc2lvbl9pZCwgTlVMTCwgZmFsc2UpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJVbmFibGUgdG8gc2VuZCBFeHRDYXAgdG8gRlciKSk7CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfdGRscy5jIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvY2Vzc190ZGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YTBhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb2Nlc3NfdGRscy5jCkBAIC0wLDAgKzEsMzI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGxpbV9wcm9jZXNzX3RkbHMuYworICogT1ZFUlZJRVc6CisgKgorICogREVQRU5ERU5DSUVTOgorICoKKyAqIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICogICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKyAqICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAqICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisgKiAgJEhlYWRlciQkRGF0ZVRpbWUkJEF1dGhvciQKKworICogIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorICogIC0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIDA1LzA1LzIwMTAgICBBc2h3YW5pICAgIEluaXRpYWwgQ3JlYXRpb24sIGFkZGVkIFRETFMgYWN0aW9uIGZyYW1lCisgKiAgZnVuY3Rpb25hbGl0eSxURExTIG1lc3NhZ2UgZXhjaGFuZ2Ugd2l0aCBTTUUuLmV0Yy4uCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogXGZpbGUgbGltX3Byb2Nlc3NfdGRscy5jCisgKgorICogXGJyaWVmIENvZGUgZm9yIHByZXBhcmluZyxwcm9jZXNzaW5nIGFuZCBzZW5kaW5nIDgwMi4xMXogYWN0aW9uIGZyYW1lcworICoKKyAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKworI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAic2lyX21hY19wcm90X2RlZi5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJ1dGlsc19hcGkuaCIKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VjdXJpdHlfdXRpbHMuaCIKKyNpbmNsdWRlICJkb3QxMWYuaCIKKyNpbmNsdWRlICJsaW1fc3RhX2hhc2hfYXBpLmgiCisjaW5jbHVkZSAic2NoX2FwaS5oIgorI2luY2x1ZGUgImxpbV9zZW5kX21lc3NhZ2VzLmgiCisjaW5jbHVkZSAidXRpbHNfcGFyc2VyLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAiZHBoX2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJjZHNfcmVnZG9tYWluX2NvbW1vbi5oIgorCisvKiBkZWZpbmUgTk9fUEFEX1RETFNfTUlOXzgwMjNfU0laRSB0byBOT1QgcGFkZGluZzogU2VlIENSIzQ0NzYzMAorICAgVGhlcmUgd2FzIElPVCBpc3N1ZSB3aXRoIGNpc2NvIDEyNTIgb3BlbiBtb2RlLCB3aGVyZSBpdCBwYWRzCisgICBkaXNjb3ZlcnkgcmVxL3RlYXJkb3duIGZyYW1lIHdpdGggc29tZSBqdW5rIHZhbHVlIHVwIHRvIG1pbiBzaXplLgorICAgVG8gYXZvaWQgdGhpcyBpc3N1ZSwgd2UgcGFkIFFDT01fVkVORE9SX0lFLgorICAgSWYgdGhlcmUgaXMgb3RoZXIgSU9UIGlzc3VlIGJlY2F1c2Ugb2YgdGhpcyBiYW5kYWdlLCBkZWZpbmUgTk9fUEFELi4uCisgKi8KKyNpZm5kZWYgTk9fUEFEX1RETFNfTUlOXzgwMjNfU0laRQorI2RlZmluZSBNSU5fSUVFRV84MDIzX1NJWkUgICAgICAgICAgICAgIDQ2CisjZGVmaW5lIE1JTl9WRU5ET1JfU1BFQ0lGSUNfSUVfU0laRSAgICAgNQorI2VuZGlmCisKK3N0YXRpYyB0U2lyUmV0U3RhdHVzIGxpbV90ZGxzX3NldHVwX2FkZF9zdGEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdFNpclRkbHNBZGRTdGFSZXEgKiBwQWRkU3RhUmVxLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgcG9wdWxhdGVfZG90MTFmX2xpbmtfaWRlbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJICAgICAgIHREb3QxMWZJRUxpbmtJZGVudGlmaWVyICpsaW5rSWRlbiwKKwkJCSAgICAgICB0U2lyTWFjQWRkciBwZWVyTWFjLCB1aW50OF90IHJlcVR5cGUpOwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfdGRsc19leHRfY2FwYWJpbGl0eSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkJIHREb3QxMWZJRUV4dENhcCAqZXh0Q2FwYWJpbGl0eSk7CisKK3ZvaWQgcG9wdWxhdGVfZG90MTFmX3RkbHNfb2ZmY2hhbm5lbF9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkJCSAgICB0RG90MTFmSUVTdXBwQ2hhbm5lbHMgKnN1cHBDaGFubmVscywKKwkJCQkJICAgIHREb3QxMWZJRVN1cHBPcGVyYXRpbmdDbGFzc2VzICoKKwkJCQkJICAgIHN1cHBPcGVyQ2xhc3Nlcyk7Cit2b2lkIGxpbV9sb2dfdmh0X2NhcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVWSFRDYXBzICpwRG90MTFmKTsKK3RTaXJSZXRTdGF0dXMgbGltX3BvcHVsYXRlX3ZodF9tY3Nfc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICAgIHRwU2lyU3VwcG9ydGVkUmF0ZXMgcFJhdGVzLAorCQkJCSAgICAgICB0RG90MTFmSUVWSFRDYXBzICpwUGVlclZIVENhcHMsCisJCQkJICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworZVBoeUNoYW5Cb25kU3RhdGUgbGltX2dldF9odGNiX3N0YXRlKGVQaHlDaGFuQm9uZFN0YXRlIGFuaUNCTW9kZSk7CisKKy8qCisgKiBURExTIGRhdGEgZnJhbWVzIHdpbGwgZ28gb3V0L2NvbWUgaW4gYXMgbm9uLXFvcyBkYXRhLgorICogc28sIGV0aF84OTBkX2hlYWRlciB3aWxsIGJlIGFsaWduZWQgYWNjZXNzLi4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXRoXzg5MGRfaGVhZGVyW10gPSB7CisJMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwKKwkweDAwLCAweDAwLCAweDg5LCAweDBkLAorfTsKKworLyoKKyAqIHR5cGUgb2YgbGlua3MgdXNlZCBpbiBURExTCisgKi8KK2VudW0gdGRsc0xpbmtzIHsKKwlURExTX0xJTktfQVAsCisJVERMU19MSU5LX0RJUkVDVAorfSBlX3RkbHNfbGluazsKKworLyoKKyAqIG5vZGUgc3RhdHVzIGluIG5vZGUgc2VhcmNoaW5nCisgKi8KK2VudW0gdGRsc0xpbmtOb2RlU3RhdHVzIHsKKwlURExTX05PREVfTk9UX0ZPVU5ELAorCVRETFNfTk9ERV9GT1VORAorfSBlX3RkbHNfbGlua19ub2RlX3N0YXR1czsKKworZW51bSB0ZGxzUmVxVHlwZSB7CisJVERMU19JTklUSUFUT1IsCisJVERMU19SRVNQT05ERVIKK30gZV90ZGxzX3JlcV90eXBlOworCit0eXBlZGVmIGVudW0gdGRsc0xpbmtTZXR1cFN0YXR1cyB7CisJVERMU19TRVRVUF9TVEFUVVNfU1VDQ0VTUyA9IDAsCisJVERMU19TRVRVUF9TVEFUVVNfRkFJTFVSRSA9IDM3Cit9IGV0ZGxzTGlua1NldHVwU3RhdHVzOworCisvKiBUaGVzZSBtYXBzIHRvIEtlcm5lbCBURExTIHBlZXIgY2FwYWJpbGl0eQorICogZmxhZ3MgYW5kIHNob3VsZCBnZXQgY2hhbmdlZCBhcyBhbmQgd2hlbiBuZWNlc3NhcnkKKyAqLworZW51bSB0ZGxzX3BlZXJfY2FwYWJpbGl0eSB7CisJVERMU19QRUVSX0hUX0NBUCA9IDAsCisJVERMU19QRUVSX1ZIVF9DQVAgPSAxLAorCVRETFNfUEVFUl9XTU1fQ0FQID0gMgorfSBlX3RkbHNfcGVlcl9jYXBhYmlsaXR5OworCisvKiBzb21lIGxvY2FsIGRlZmluZXMgKi8KKyNkZWZpbmUgTElOS19JREVOX0FERFJfT0ZGU0VUKHgpICgmeC5MaW5rSWRlbnRpZmllcikKKyNkZWZpbmUgUFRJX0xJTktfSURFTl9PRkZTRVQgICAgICg1KQorI2RlZmluZSBQVElfQlVGX1NUQVRVU19PRkZTRVQgICAgKDI1KQorCisvKiBUT0RPLCBNb3ZlIHRoaXMgcGFyYW1ldGVycyB0byBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFBFRVJfUFNNX1NVUFBPUlQgICAgICAgICAgKDApCisjZGVmaW5lIFRETFNfU1VQUE9SVCAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFRETFNfUFJPSElCSVRFRCAgICAgICAgICAgKDApCisjZGVmaW5lIFRETFNfQ0hfU1dJVENIX1BST0hJQklURUQgKDEpCisvKiogQGJyaWVmIFNldCBiaXQgbWFuaXB1bGF0aW9uIG1hY3JvICovCisjZGVmaW5lIFNFVF9CSVQodmFsdWUsIG1hc2spICAgICAgICgodmFsdWUpIHw9ICgxIDw8IChtYXNrKSkpCisvKiogQGJyaWVmIENsZWFyIGJpdCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KKyNkZWZpbmUgQ0xFQVJfQklUKHZhbHVlLCBtYXNrKSAgICAgKCh2YWx1ZSkgJj0gfigxIDw8IChtYXNrKSkpCisvKiogQGJyaWVmIENoZWNrIGJpdCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KKyNkZWZpbmUgQ0hFQ0tfQklUKHZhbHVlLCBtYXNrKSAgICAoKHZhbHVlKSAmICgxIDw8IChtYXNrKSkpCisKKyNkZWZpbmUgU0VUX1BFRVJfQUlEX0JJVE1BUChwZWVyX2JpdG1hcCwgYWlkKSBcCisJZG8geyBcCisJaWYgKChhaWQpIDwgKHNpemVvZih1aW50MzJfdCkgPDwgMykpIFwKKwkJU0VUX0JJVChwZWVyX2JpdG1hcFswXSwgKGFpZCkpOwlcCisJZWxzZSBpZiAoKGFpZCkgPCAoc2l6ZW9mKHVpbnQzMl90KSA8PCA0KSkgXAorCQlTRVRfQklUKHBlZXJfYml0bWFwWzFdLCAoKGFpZCkgLSAoc2l6ZW9mKHVpbnQzMl90KSA8PCAzKSkpO1wKKwl9IHdoaWxlICgwKTsKKworI2RlZmluZSBDTEVBUl9QRUVSX0FJRF9CSVRNQVAocGVlcl9iaXRtYXAsIGFpZCkJXAorCWRvIHsgXAorCWlmICgoYWlkKSA8IChzaXplb2YodWludDMyX3QpIDw8IDMpKSBcCisJCUNMRUFSX0JJVChwZWVyX2JpdG1hcFswXSwgKGFpZCkpOyBcCisJZWxzZSBpZiAoKGFpZCkgPCAoc2l6ZW9mKHVpbnQzMl90KSA8PCA0KSkgXAorCQlDTEVBUl9CSVQocGVlcl9iaXRtYXBbMV0sICgoYWlkKSAtIChzaXplb2YodWludDMyX3QpIDw8IDMpKSk7XAorCX0gd2hpbGUgKDApOworCisjaWZkZWYgTElNX0RFQlVHX1RETFMKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisjZGVmaW5lIFdOSV9DRkdfVERMU19MSU5LX1NFVFVQX1JTUF9USU1FT1VUICAgICAgICAgKDgwMCkKKyNkZWZpbmUgV05JX0NGR19URExTX0xJTktfU0VUVVBfQ05GX1RJTUVPVVQgICAgICAgICAoMjAwKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfUU9TX0VOQUJMRUQocHNlc3Npb25FbnRyeSkgKCgoKHBzZXNzaW9uRW50cnkpLT5saW1Rb3NFbmFibGVkKSAmJiBcCisJCQkJCVNJUl9NQUNfR0VUX1FPUygocHNlc3Npb25FbnRyeSktPmxpbUN1cnJlbnRCc3NDYXBzKSkgfHwJXAorCQkJCSAgICAgICAoKChwc2Vzc2lvbkVudHJ5KS0+bGltV21lRW5hYmxlZCkgJiYgXAorCQkJCQlMSU1fQlNTX0NBUFNfR0VUKFdNRSwgKHBzZXNzaW9uRW50cnkpLT5saW1DdXJyZW50QnNzUW9zQ2FwcykpKQorCisjZGVmaW5lIFRJRF9BQ19WSSAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVElEX0FDX0JLICAgICAgICAgICAgICAgICAgMQorCitjb25zdCB1aW50OF90ICpsaW1fdHJhY2VfdGRsc19hY3Rpb25fc3RyaW5nKHVpbnQ4X3QgdGRsc0FjdGlvbkNvZGUpCit7CisJc3dpdGNoICh0ZGxzQWN0aW9uQ29kZSkgeworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX01BQ19URExTX1NFVFVQX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTUFDX1RETFNfU0VUVVBfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9NQUNfVERMU19TRVRVUF9DTkYpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX01BQ19URExTX1RFQVJET1dOKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9NQUNfVERMU19QRUVSX1RSQUZGSUNfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9NQUNfVERMU19DSF9TV0lUQ0hfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9NQUNfVERMU19DSF9TV0lUQ0hfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9NQUNfVERMU19QRUVSX1RSQUZGSUNfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9NQUNfVERMU19ESVNfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9NQUNfVERMU19ESVNfUlNQKTsKKwl9CisJcmV0dXJuIChjb25zdCB1aW50OF90ICopIlVOS05PV04iOworfQorI2VuZGlmCisvKgorICogaW5pdGlhbGl6ZSBURExTIHNldHVwIGxpc3QgYW5kIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLgorICovCit2b2lkIGxpbV9pbml0X3RkbHNfZGF0YSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5KQoreworCWxpbV9pbml0X3BlZXJfaWR4cG9vbChwTWFjLCBwU2Vzc2lvbkVudHJ5KTsKKworCXJldHVybjsKK30KKworLyoKKyAqIHByZXBhcmUgVERMUyBmcmFtZSBoZWFkZXIsIGl0IGluY2x1ZGVzCisgKiB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICogfDgwMi4xMSBoZWFkZXJ8UkZDMTA0MiBoZWFkZXJ8VERMU19QWUxPQURfVFlQRXxQQVlMT0FECisgKiB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICovCitzdGF0aWMgdWludDMyX3QgbGltX3ByZXBhcmVfdGRsc19mcmFtZV9oZWFkZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcEZyYW1lLAorCQkJCQkgICAgICB0RG90MTFmSUVMaW5rSWRlbnRpZmllciAqbGlua19pZGVuLAorCQkJCQkgICAgICB1aW50OF90IHRkbHNMaW5rVHlwZSwgdWludDhfdCByZXFUeXBlLAorCQkJCQkgICAgICB1aW50OF90IHRpZCwKKwkJCQkJICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0cFNpck1hY0RhdGFIZHIzYSBwTWFjSGRyOworCXVpbnQzMl90IGhlYWRlcl9vZmZzZXQgPSAwOworCXVpbnQ4X3QgKmFkZHIxID0gTlVMTDsKKwl1aW50OF90ICphZGRyMyA9IE5VTEw7CisJdWludDhfdCB0b0RzID0gKHRkbHNMaW5rVHlwZSA9PSBURExTX0xJTktfQVApCisJCSAgICAgICA/IEFOSV9UWERJUl9UT0RTIDogQU5JX1RYRElSX0lCU1M7CisJdWludDhfdCAqcGVlck1hYyA9IChyZXFUeXBlID09IFRETFNfSU5JVElBVE9SKQorCQkJICAgPyBsaW5rX2lkZW4tPlJlc3BTdGFBZGRyIDogbGlua19pZGVuLT5Jbml0U3RhQWRkcjsKKwl1aW50OF90ICpzdGFNYWMgPSAocmVxVHlwZSA9PSBURExTX0lOSVRJQVRPUikKKwkJCSAgPyBsaW5rX2lkZW4tPkluaXRTdGFBZGRyIDogbGlua19pZGVuLT5SZXNwU3RhQWRkcjsKKworCXBNYWNIZHIgPSAodHBTaXJNYWNEYXRhSGRyM2EpIChwRnJhbWUpOworCisJLyoKKwkgKiBpZiBURExTIGZyYW1lIGdvZXMgdGhyb3VnaCB0aGUgQVAgbGluaywgaXQgZm9sbG93cyBub3JtYWwgYWRkcmVzcworCSAqIHBhdHRlcm4sIGlmIFRETFMgZnJhbWUgZ29lcyB0aG9ydWdoIHRoZSBkaXJlY3QgbGluaywgdGhlbgorCSAqIEExLS0+IFBlZXIgU1RBIGFkZHIsIEEyLS0+U2VsZiBTVEEgYWRkcmVzcywgQTMtLT4gQlNTSUQKKwkgKi8KKwkodGRsc0xpbmtUeXBlID09IFRETFNfTElOS19BUCkgPyAoKGFkZHIxID0gKGxpbmtfaWRlbi0+YnNzaWQpKSwKKwkJCQkJICAoYWRkcjMgPSAocGVlck1hYykpKQorCTogKChhZGRyMSA9IChwZWVyTWFjKSksIChhZGRyMyA9IChsaW5rX2lkZW4tPmJzc2lkKSkpOworCS8qCisJICogcHJlcGFyZSA4MDIuMTEgaGVhZGVyCisJICovCisJcE1hY0hkci0+ZmMucHJvdFZlciA9IFNJUl9NQUNfUFJPVE9DT0xfVkVSU0lPTjsKKwlwTWFjSGRyLT5mYy50eXBlID0gU0lSX01BQ19EQVRBX0ZSQU1FOworCXBNYWNIZHItPmZjLnN1YlR5cGUgPQorCQlJU19RT1NfRU5BQkxFRChwc2Vzc2lvbkVudHJ5KSA/IFNJUl9NQUNfREFUQV9RT1NfREFUQSA6CisJCVNJUl9NQUNfREFUQV9EQVRBOworCisJLyoKKwkgKiBUTCBpcyBub3Qgc2V0dGluZyB1cCBiZWxvdyBmaWVsZHMsIHNvIHdlIGFyZSBkb2luZyBpdCBoZXJlCisJICovCisJcE1hY0hkci0+ZmMudG9EUyA9IHRvRHM7CisJcE1hY0hkci0+ZmMucG93ZXJNZ210ID0gMDsKKwlwTWFjSGRyLT5mYy53ZXAgPSAocHNlc3Npb25FbnRyeS0+ZW5jcnlwdFR5cGUgPT0gZVNJUl9FRF9OT05FKSA/IDAgOiAxOworCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBNYWNIZHItPmFkZHIxLAorCQkgICAgICh1aW50OF90ICopIGFkZHIxLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcE1hY0hkci0+YWRkcjIsCisJCSAgICAgKHVpbnQ4X3QgKikgc3RhTWFjLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwTWFjSGRyLT5hZGRyMywKKwkJICAgICAodWludDhfdCAqKSAoYWRkcjMpLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoCisJCSAgICJQcmVwYXJpbmcgVERMUyBmcmFtZSBoZWFkZXIgdG8gJXMgQTE6IgorCQkgICBNQUNfQUREUkVTU19TVFIiLCBBMjoiTUFDX0FERFJFU1NfU1RSIiwgQTM6IgorCQkgICBNQUNfQUREUkVTU19TVFIKKwkJICApLAorCQkodGRsc0xpbmtUeXBlID09IFRETFNfTElOS19BUCkgPyAiQVAiIDogIkRJUkVDVCIsCisJCU1BQ19BRERSX0FSUkFZKHBNYWNIZHItPmFkZHIxKSwKKwkJTUFDX0FERFJfQVJSQVkocE1hY0hkci0+YWRkcjIpLAorCQlNQUNfQUREUl9BUlJBWShwTWFjSGRyLT5hZGRyMykpOworCisJaWYgKElTX1FPU19FTkFCTEVEKHBzZXNzaW9uRW50cnkpKSB7CisJCXBNYWNIZHItPnFvc0NvbnRyb2wudGlkID0gdGlkOworCQloZWFkZXJfb2Zmc2V0ICs9IHNpemVvZih0U2lyTWFjRGF0YUhkcjNhKTsKKwl9IGVsc2UKKwkJaGVhZGVyX29mZnNldCArPSBzaXplb2YodFNpck1hY01nbXRIZHIpOworCisJLyoKKwkgKiBOb3cgZm9ybSBSRkMxMDQyIGhlYWRlcgorCSAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAocEZyYW1lICsgaGVhZGVyX29mZnNldCksCisJCSAgICAgKHVpbnQ4X3QgKikgZXRoXzg5MGRfaGVhZGVyLCBzaXplb2YoZXRoXzg5MGRfaGVhZGVyKSk7CisKKwloZWFkZXJfb2Zmc2V0ICs9IHNpemVvZihldGhfODkwZF9oZWFkZXIpOworCisJLyogYWRkIHBheWxvYWQgdHlwZSBhcyBURExTICovCisJKihwRnJhbWUgKyBoZWFkZXJfb2Zmc2V0KSA9IFBBWUxPQURfVFlQRV9URExTOworCWhlYWRlcl9vZmZzZXQgKz0gUEFZTE9BRF9UWVBFX1RETFNfU0laRTsKKwlyZXR1cm4gaGVhZGVyX29mZnNldDsKK30KKworLyoKKyAqIFRYIENvbXBsZXRlIGZvciBNYW5hZ2VtZW50IGZyYW1lcworICovCitDREZfU1RBVFVTIGxpbV9tZ210X3R4X2NvbXBsZXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHR4Q29tcGxldGVTdWNjZXNzKQoreworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSBOVUxMOworCisJaWYgKDB4ZmYgIT0gcE1hYy0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCkgeworCQlwc2Vzc2lvbkVudHJ5ID0KKwkJCXBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKHBNYWMsCisJCQkJCQkgICAgICBwTWFjLT5saW0ubWdtdEZyYW1lU2Vzc2lvbklkKTsKKwkJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbklEICVkIGlzIG5vdCBmb3VuZCIpLAorCQkJCXBNYWMtPmxpbS5tZ210RnJhbWVTZXNzaW9uSWQpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCWxpbV9zZW5kX3NtZV9tZ210X3R4X2NvbXBsZXRpb24ocE1hYywgcHNlc3Npb25FbnRyeSwKKwkJCQkJCXR4Q29tcGxldGVTdWNjZXNzKTsKKwkJcE1hYy0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCA9IDB4ZmY7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBiYWNzdCBvciB1bmljYXN0IGRpc2NvdmVyeSByZXF1ZXN0CisgKiBXZSBhcmUgbm90IGRpZmZlcmVudGlhdGluZyBpdCBoZXJlLCBpdCB3aWxsIGFsbCBkZXBuZHMgb24gcGVlciBNQUMgYWRkcmVzcywKKyAqLwordFNpclJldFN0YXR1cyBsaW1fc2VuZF90ZGxzX2Rpc19yZXFfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlcl9tYWMsCisJCQkJCSAgdWludDhfdCBkaWFsb2csIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdERvdDExZlRETFNEaXNSZXEgdGRsc0Rpc1JlcTsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXVpbnQzMl90IG5QYXlsb2FkID0gMDsKKwl1aW50MzJfdCBzaXplID0gMDsKKwl1aW50MzJfdCBuQnl0ZXMgPSAwOworCXVpbnQzMl90IGhlYWRlcl9vZmZzZXQgPSAwOworCXVpbnQ4X3QgKnBGcmFtZTsKKwl2b2lkICpwUGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKyNpZm5kZWYgTk9fUEFEX1RETFNfTUlOXzgwMjNfU0laRQorCXVpbnQzMl90IHBhZExlbiA9IDA7CisjZW5kaWYKKwl1aW50OF90IHNtZVNlc3Npb25JZCA9IDA7CisKKwlpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoInBzZXNzaW9uRW50cnkgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJc21lU2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCS8qCisJICogVGhlIHNjaGVtZSBoZXJlIGlzIHRvIGZpbGwgb3V0IGEgJ3REb3QxMWZQcm9iZVJlcXVlc3QnIHN0cnVjdHVyZQorCSAqIGFuZCB0aGVuIGhhbmQgaXQgb2ZmIHRvICdkb3QxMWZfcGFja19wcm9iZV9yZXF1ZXN0JyAoZm9yCisJICogc2VyaWFsaXphdGlvbikuICBXZSBzdGFydCBieSB6ZXJvLWluaXRpYWxpemluZyB0aGUgc3RydWN0dXJlOgorCSAqLworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZ0ZGxzRGlzUmVxLCBzaXplb2YodERvdDExZlRETFNEaXNSZXEpLCAwKTsKKworCS8qCisJICogc2V0dXAgRml4ZWQgZmllbGRzLAorCSAqLworCXRkbHNEaXNSZXEuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9URExTOworCXRkbHNEaXNSZXEuQWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfVERMU19ESVNfUkVROworCXRkbHNEaXNSZXEuRGlhbG9nVG9rZW4udG9rZW4gPSBkaWFsb2c7CisKKwlzaXplID0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKworCXBvcHVsYXRlX2RvdDExZl9saW5rX2lkZW4ocE1hYywgcHNlc3Npb25FbnRyeSwgJnRkbHNEaXNSZXEuTGlua0lkZW50aWZpZXIsCisJCQkJICBwZWVyX21hYywgVERMU19JTklUSUFUT1IpOworCisJLyoKKwkgKiBub3cgd2UgcGFjayBpdC4gIEZpcnN0LCBob3cgbXVjaCBzcGFjZSBhcmUgd2UgZ29pbmcgdG8gbmVlZD8KKwkgKi8KKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF90ZGxzX2Rpc19yZXFfc2l6ZShwTWFjLCAmdGRsc0Rpc1JlcSwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKAorCQkJICAgIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGZvciBhIGRpc2NvdmVyeSBSZXF1ZXN0ICgweCUwOHgpLiIKKwkJCSAgKSwKKwkJCXN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZlRETFNEaXNSZXEpOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMKAorCQkJICAgIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmcgdGhlIHBhY2tlZCBzaXplIGZvciBhIGRpc2NvdmVyeSBSZXF1ZXN0ICgweCUwOHgpLiIKKwkJCSAgKSwKKwkJCXN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBUaGlzIGZyYW1lIGlzIGdvaW5nIG91dCBmcm9tIFBFIGFzIGRhdGEgZnJhbWVzIHdpdGggc3BlY2lhbCBldGhlcnR5cGUKKwkgKiA4OS0wZC4KKwkgKiA4IGJ5dGVzIG9mIFJGQyAxMDQyIGhlYWRlcgorCSAqLworCisJbkJ5dGVzID0gblBheWxvYWQgKyAoKElTX1FPU19FTkFCTEVEKHBzZXNzaW9uRW50cnkpKQorCQkJICAgICA/IHNpemVvZih0U2lyTWFjRGF0YUhkcjNhKSA6CisJCQkgICAgIHNpemVvZih0U2lyTWFjTWdtdEhkcikpCisJCSArIHNpemVvZihldGhfODkwZF9oZWFkZXIpCisJCSArIFBBWUxPQURfVFlQRV9URExTX1NJWkU7CisKKyNpZm5kZWYgTk9fUEFEX1RETFNfTUlOXzgwMjNfU0laRQorCS8qIElPVCBpc3N1ZSB3aXRoIHNvbWUgQVAgOiBzb21lIEFQIGRvZXNuJ3QgbGlrZSB0aGUgZGF0YSBwYWNrZXQgc2l6ZSA8IG1pbmltdW0gODAyLjMgZnJhbWUgbGVuZ3RoICg2NCkKKwkgICBIZW5jZSBBUCBpdHNlbGYgcGFkZGluZyBzb21lIGJ5dGVzLCB3aGljaCBjYXVzZWQgdGVhcmRvd24gcGFja2V0IGlzIGRyb3BwZWQgYXQKKwkgICByZWNlaXZlciBzaWRlLiBUbyBhdm9pZCBzdWNoIElPVCBpc3N1ZSwgd2UgYWRkZWQgc29tZSBleHRyYSBieXRlcyB0byBtZWV0IGRhdGEgZnJhbWUgc2l6ZSA+PSA2NAorCSAqLworCWlmIChuUGF5bG9hZCArIFBBWUxPQURfVFlQRV9URExTX1NJWkUgPCBNSU5fSUVFRV84MDIzX1NJWkUpIHsKKwkJcGFkTGVuID0KKwkJCU1JTl9JRUVFXzgwMjNfU0laRSAtIChuUGF5bG9hZCArIFBBWUxPQURfVFlQRV9URExTX1NJWkUpOworCisJCS8qIGlmIHBhZExlbiBpcyBsZXNzIHRoYW4gbWluaW11bSB2ZW5kb3JTcGVjaWZpYyAoNSksIHBhZCB1cCB0byA1ICovCisJCWlmIChwYWRMZW4gPCBNSU5fVkVORE9SX1NQRUNJRklDX0lFX1NJWkUpCisJCQlwYWRMZW4gPSBNSU5fVkVORE9SX1NQRUNJRklDX0lFX1NJWkU7CisKKwkJbkJ5dGVzICs9IHBhZExlbjsKKwl9CisjZW5kaWYKKworCS8qIE9rLS0gdHJ5IHRvIGFsbG9jYXRlIG1lbW9yeSBmcm9tIE1HTVQgUEtUIHBvb2wgKi8KKworCWNkZl9zdGF0dXMgPSBjZHNfcGFja2V0X2FsbG9jKCh1aW50MTZfdCkgbkJ5dGVzLCAodm9pZCAqKikmcEZyYW1lLAorCQkJCSAgICAgICh2b2lkICoqKSZwUGFja2V0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgKKwkJCSAgICJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgVERMUyBEaXNjb3ZlcnkgUmVxdWVzdC4iCisJCQkgICksCisJCQluQnl0ZXMpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCS8qIHplcm8gb3V0IHRoZSBtZW1vcnkgKi8KKwljZGZfbWVtX3NldChwRnJhbWUsIG5CeXRlcywgMCk7CisKKwkvKgorCSAqIElFIGZvcm1hdGlvbiwgbWVtb3J5IGFsbG9jYXRpb24gaXMgY29tcGxldGVkLCBOb3cgZm9ybSBURExTIGRpc2NvdmVyeQorCSAqIHJlcXVlc3QgZnJhbWUKKwkgKi8KKworCS8qIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvciAqLworCisJaGVhZGVyX29mZnNldCA9IGxpbV9wcmVwYXJlX3RkbHNfZnJhbWVfaGVhZGVyKHBNYWMsIHBGcmFtZSwKKwkJCQkJCSAgICAgIExJTktfSURFTl9BRERSX09GRlNFVAorCQkJCQkJCSAgICAgICh0ZGxzRGlzUmVxKSwgVERMU19MSU5LX0FQLAorCQkJCQkJICAgICAgVERMU19JTklUSUFUT1IsIFRJRF9BQ19WSSwKKwkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCisJc3RhdHVzID0gZG90MTFmX3BhY2tfdGRsc19kaXNfcmVxKHBNYWMsICZ0ZGxzRGlzUmVxLCBwRnJhbWUKKwkJCQkJICArIGhlYWRlcl9vZmZzZXQsIG5QYXlsb2FkLCAmblBheWxvYWQpOworCisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhY2sgYSBURExTIGRpc2NvdmVyeSByZXEgKDB4JTA4eCkuIiksCisJCQlzdGF0dXMpOworCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKilwUGFja2V0KTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgKKwkJCSAgICJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgVERMUyBEaXNjb3ZlcnkgUmVxdWVzdCAoMHglMDh4KS4iCisJCQkgICksCisJCQlzdGF0dXMpOworCX0KKyNpZm5kZWYgTk9fUEFEX1RETFNfTUlOXzgwMjNfU0laRQorCWlmIChwYWRMZW4gIT0gMCkgeworCQkvKiBRQ09NIFZFTkRPUiBPVUkgPSB7IDB4MDAsIDB4QTAsIDB4QzYsIHR5cGUgPSAweDAwMDAgfTsgKi8KKwkJdWludDhfdCAqcGFkVmVuZG9yU3BlY2lmaWMgPSBwRnJhbWUgKyBoZWFkZXJfb2Zmc2V0ICsgblBheWxvYWQ7CisJCS8qIG1ha2UgUUNPTV9WRU5ET1JfT1VJLCBhbmQgdHlwZSA9IDB4MDAwMCwgYW5kIGFsbCB0aGUgcGF5bG9hZCB0byBiZSB6ZXJvICovCisJCXBhZFZlbmRvclNwZWNpZmljWzBdID0gMjIxOworCQlwYWRWZW5kb3JTcGVjaWZpY1sxXSA9IHBhZExlbiAtIDI7CisJCXBhZFZlbmRvclNwZWNpZmljWzJdID0gMHgwMDsKKwkJcGFkVmVuZG9yU3BlY2lmaWNbM10gPSAweEEwOworCQlwYWRWZW5kb3JTcGVjaWZpY1s0XSA9IDB4QzY7CisKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIlBhZGRpbmcgVmVuZG9yIFNwZWNpZmljIEllIExlbiA9ICVkIiksIHBhZExlbik7CisKKwkJLyogcGFkZGluZyB6ZXJvIGlmIG1vcmUgdGhhbiA1IGJ5dGVzIGFyZSByZXF1aXJlZCAqLworCQlpZiAocGFkTGVuID4gTUlOX1ZFTkRPUl9TUEVDSUZJQ19JRV9TSVpFKQorCQkJY2RmX21lbV9zZXQocEZyYW1lICsgaGVhZGVyX29mZnNldCArIG5QYXlsb2FkICsKKwkJCQkgICAgTUlOX1ZFTkRPUl9TUEVDSUZJQ19JRV9TSVpFLAorCQkJCSAgICBwYWRMZW4gLSBNSU5fVkVORE9SX1NQRUNJRklDX0lFX1NJWkUsIDApOworCX0KKyNlbmRpZgorCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgiW1RETFNdIGFjdGlvbiAlZCAoJXMpIC1BUC0+IE9UQSBwZWVyPSJNQUNfQUREUkVTU19TVFIpLAorCQlTSVJfTUFDX1RETFNfRElTX1JFUSwKKwkJbGltX3RyYWNlX3RkbHNfYWN0aW9uX3N0cmluZyhTSVJfTUFDX1RETFNfRElTX1JFUSksCisJCU1BQ19BRERSX0FSUkFZKHBlZXJfbWFjKSk7CisKKwlwTWFjLT5saW0ubWdtdEZyYW1lU2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisJY2RmX3N0YXR1cyA9IHdtYV90eF9mcmFtZVdpdGhUeENvbXBsZXRlKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCQkgICAgICBUWFJYX0ZSTV84MDJfMTFfREFUQSwKKwkJCQkJICAgICAgQU5JX1RYRElSX1RPRFMsCisJCQkJCSAgICAgIFRJRF9BQ19WSSwKKwkJCQkJICAgICAgbGltX3R4X2NvbXBsZXRlLCBwRnJhbWUsCisJCQkJCSAgICAgIGxpbV9tZ210X3R4X2NvbXBsZXRlLAorCQkJCQkgICAgICBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FLAorCQkJCQkgICAgICBzbWVTZXNzaW9uSWQsIGZhbHNlLCAwKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlwTWFjLT5saW0ubWdtdEZyYW1lU2Vzc2lvbklkID0gMHhmZjsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoImNvdWxkIG5vdCBzZW5kIFRETFMgRGlzY292ZXJ5IFJlcXVlc3QgZnJhbWUiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfQorCisvKgorICogVGhpcyBzdGF0aWMgZnVuY3Rpb24gaXMgY29uc2lzdGVudCB3aXRoIGFueSBraW5kIG9mIFRETFMgbWFuYWdlbWVudAorICogZnJhbWVzIHdlIGFyZSBzZW5kaW5nLiBDdXJyZW50bHkgaXQgaXMgYmVpbmcgdXNlZCBieSBsaW1fc2VuZF90ZGxzX2Rpc19yc3BfZnJhbWUsCisgKiBsaW1fc2VuZF90ZGxzX2xpbmtfc2V0dXBfcmVxX2ZyYW1lIGFuZCBsaW1fc2VuZF90ZGxzX3NldHVwX3JzcF9mcmFtZQorICovCitzdGF0aWMgdm9pZCBwb3B1bGF0ZV9kb3QxMWZfdGRsc19odF92aHRfY2FwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICB1aW50MzJfdCBzZWxmRG90MTFNb2RlLAorCQkJCQkgICAgdERvdDExZklFSFRDYXBzICpodENhcCwKKwkJCQkJICAgIHREb3QxMWZJRVZIVENhcHMgKnZodENhcCwKKwkJCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJaWYgKElTX0RPVDExX01PREVfSFQoc2VsZkRvdDExTW9kZSkpIHsKKwkJLyogSW5jbHVkZSBIVCBDYXBhYmlsaXR5IElFICovCisJCXBvcHVsYXRlX2RvdDExZl9odF9jYXBzKHBNYWMsIE5VTEwsIGh0Q2FwKTsKKwkJLyoKKwkJICogQWR2ZXJ0aXNlIGh0IGNhcGFiaWxpdHkgYW5kIG1heCBzdXBwb3J0ZWQgY2hhbm5lbCBiYW5kd2lkdGgKKwkJICogd2hlbiBwb3B1bGF0aW5nIEhUIElFIGluIFRETFMgU2V0dXAgUmVxdWVzdC9TZXR1cCBSZXNwb25zZS8KKwkJICogU2V0dXAgQ29uZmlybWF0aW9uIGZyYW1lcy4KKwkJICogMTEuMjEuNi4yIFNldHRpbmcgdXAgYSA0MCBNSHogZGlyZWN0IGxpbms6IEEgNDAgTUh6CisJCSAqIG9mZi1jaGFubmVsIGRpcmVjdCBsaW5rIG1heSBiZSBzdGFydGVkIGlmIGJvdGggVERMUyBwZWVyIFNUQXMKKwkJICogaW5kaWNhdGVkIDQwIE1IeiBzdXBwb3J0IGluIHRoZSBTdXBwb3J0ZWQgQ2hhbm5lbCBXaWR0aCBTZXQKKwkJICogZmllbGQgb2YgdGhlIEhUIENhcGFiaWxpdGllcyBlbGVtZW50ICh3aGljaCBpcyBpbmNsdWRlZCBpbgorCQkgKiB0aGUgVERMUyBTZXR1cCBSZXF1ZXN0IGZyYW1lIGFuZCB0aGUgVERMUyBTZXR1cCBSZXNwb25zZQorCQkgKiBmcmFtZSkuIFN3aXRjaGluZyB0byBhIDQwIE1IeiBvZmYtY2hhbm5lbCBkaXJlY3QgbGluayBpcworCQkgKiBhY2hpZXZlZCBieSBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgVERMUworCQkgKiBDaGFubmVsIFN3aXRjaCBSZXF1ZXN0CisJCSAqIDExLjIxLjEgR2VuZXJhbDogVGhlIGNoYW5uZWwgd2lkdGggb2YgdGhlIFRETFMgZGlyZWN0IGxpbmsgb24KKwkJICogdGhlIGJhc2UgY2hhbm5lbCBzaGFsbCBub3QgZXhjZWVkIHRoZSBjaGFubmVsIHdpZHRoIG9mIHRoZQorCQkgKiBCU1MgdG8gd2hpY2ggdGhlIFRETFMgcGVlciBTVEFzIGFyZSBhc3NvY2lhdGVkLgorCQkgKi8KKwkJaHRDYXAtPnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9IDE7CisJfSBlbHNlIHsKKwkJaHRDYXAtPnByZXNlbnQgPSAwOworCX0KKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJIVCBwcmVzZW50ID0gJWh1LCBDaGFuIFdpZHRoID0gJWh1IiksCisJCWh0Q2FwLT5wcmVzZW50LCBodENhcC0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmICgoKHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCA8PSBTSVJfMTFCX0NIQU5ORUxfRU5EKSAmJgorCSAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lbmFibGVWaHRGb3IyNEdIeikgfHwKKwkgICAgKHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCA+PSBTSVJfMTFCX0NIQU5ORUxfRU5EKSkgeworCQlpZiAoSVNfRE9UMTFfTU9ERV9WSFQoc2VsZkRvdDExTW9kZSkgJiYKKwkJICAgIElTX0ZFQVRVUkVfU1VQUE9SVEVEX0JZX0ZXKERPVDExQUMpKSB7CisJCQkvKiBJbmNsdWRlIFZIVCBDYXBhYmlsaXR5IElFICovCisJCQlwb3B1bGF0ZV9kb3QxMWZfdmh0X2NhcHMocE1hYywgcHNlc3Npb25FbnRyeSwgdmh0Q2FwKTsKKwkJCXZodENhcC0+c3VCZWFtZm9ybWVlQ2FwID0gMDsKKwkJCXZodENhcC0+c3VCZWFtRm9ybWVyQ2FwID0gMDsKKwkJCXZodENhcC0+bXVCZWFtZm9ybWVlQ2FwID0gMDsKKwkJCXZodENhcC0+bXVCZWFtZm9ybWVyQ2FwID0gMDsKKwkJfSBlbHNlIHsKKwkJCXZodENhcC0+cHJlc2VudCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBWaHQgRGlzYWJsZSBmcm9tIGluaSBpbiAyLjQgR0h6ICovCisJCXZodENhcC0+cHJlc2VudCA9IDA7CisJfQorCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlZIVCBwcmVzZW50ID0gJWh1LCBDaGFuIFdpZHRoID0gJWh1IiksCisJCXZodENhcC0+cHJlc2VudCwgdmh0Q2FwLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworI2VuZGlmCit9CisKKy8qCisgKiBTZW5kIFRETFMgZGlzY292ZXJ5IHJlc3BvbnNlIGZyYW1lIG9uIGRpcmVjdCBsaW5rLgorICovCisKK3N0YXRpYyB0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX3RkbHNfZGlzX3JzcF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJIHRTaXJNYWNBZGRyIHBlZXJNYWMsIHVpbnQ4X3QgZGlhbG9nLAorCQkJCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkJCQkgdWludDhfdCAqYWRkSWUsIHVpbnQxNl90IGFkZEllTGVuKQoreworCXREb3QxMWZURExTRGlzUnNwIHRkbHNEaXNSc3A7CisJdWludDE2X3QgY2FwcyA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwl1aW50MzJfdCBuUGF5bG9hZCA9IDA7CisJdWludDMyX3QgbkJ5dGVzID0gMDsKKwl1aW50OF90ICpwRnJhbWU7CisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdWludDMyX3Qgc2VsZkRvdDExTW9kZTsKKy8qICBQbGFjZWhvbGRlciB0byBzdXBwb3J0IGRpZmZlcmVudCBjaGFubmVsIGJvbmRpbmcgbW9kZSBvZiBURExTIHRoYW4gQVAuICovCisvKiAgVG9kYXksIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREUgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIGNvbm5lY3RpbmcgdG8gQVAgKi8KKy8qICBUbyBzdXBwb3J0IHRoaXMgZmVhdHVyZSwgd2UgbmVlZCB0byBpbnRyb2R1Y2UgV05JX0NGR19URExTX0NIQU5ORUxfQk9ORElOR19NT0RFICovCisvKiAgQXMgb2Ygbm93LCB3ZSBoYXJkY29kZWQgdG8gbWF4IGNoYW5uZWwgYm9uZGluZyBvZiBkb3QxMU1vZGUgKGkuZSBIVDgwIGZvciAxMWFjL0hUNDAgZm9yIDExbikgKi8KKy8qICB1aW50MzJfdCB0ZGxzQ2hhbm5lbEJvbmRpbmdNb2RlOyAqLworCXVpbnQ4X3Qgc21lU2Vzc2lvbklkID0gMDsKKworCWlmIChOVUxMID09IHBzZXNzaW9uRW50cnkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgicHNlc3Npb25FbnRyeSBpcyBOVUxMIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlzbWVTZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKwkvKgorCSAqIFRoZSBzY2hlbWUgaGVyZSBpcyB0byBmaWxsIG91dCBhICd0RG90MTFmUHJvYmVSZXF1ZXN0JyBzdHJ1Y3R1cmUKKwkgKiBhbmQgdGhlbiBoYW5kIGl0IG9mZiB0byAnZG90MTFmX3BhY2tfcHJvYmVfcmVxdWVzdCcgKGZvcgorCSAqIHNlcmlhbGl6YXRpb24pLiAgV2Ugc3RhcnQgYnkgemVyby1pbml0aWFsaXppbmcgdGhlIHN0cnVjdHVyZToKKwkgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmdGRsc0Rpc1JzcCwgc2l6ZW9mKHREb3QxMWZURExTRGlzUnNwKSwgMCk7CisKKwkvKgorCSAqIHNldHVwIEZpeGVkIGZpZWxkcywKKwkgKi8KKwl0ZGxzRGlzUnNwLkNhdGVnb3J5LmNhdGVnb3J5ID0gU0lSX01BQ19BQ1RJT05fUFVCTElDX1VTQUdFOworCXRkbHNEaXNSc3AuQWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfVERMU19ESVNfUlNQOworCXRkbHNEaXNSc3AuRGlhbG9nVG9rZW4udG9rZW4gPSBkaWFsb2c7CisKKwlwb3B1bGF0ZV9kb3QxMWZfbGlua19pZGVuKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQkJICAmdGRsc0Rpc1JzcC5MaW5rSWRlbnRpZmllciwKKwkJCQkgIHBlZXJNYWMsIFRETFNfUkVTUE9OREVSKTsKKworCWlmIChjZmdfZ2V0X2NhcGFiaWxpdHlfaW5mbyhwTWFjLCAmY2FwcywgcHNlc3Npb25FbnRyeSkKKwkJIT0gZVNJUl9TVUNDRVNTKSB7CisJCS8qCisJCSAqIENvdWxkIG5vdCBnZXQgQ2FwYWJpbGl0aWVzIHZhbHVlCisJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCSAqLworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIENhcGFiaWxpdGllcyB2YWx1ZSIpKTsKKwl9CisJc3dhcF9iaXRfZmllbGQxNihjYXBzLCAodWludDE2X3QgKikgJnRkbHNEaXNSc3AuQ2FwYWJpbGl0aWVzKTsKKworCS8qIHBvcHVsYXRlIHN1cHBvcnRlZCByYXRlIGFuZCBleHQgc3VwcG9ydGVkIHJhdGUgSUUgKi8KKwlpZiAoZVNJUl9GQUlMVVJFID09IHBvcHVsYXRlX2RvdDExZl9yYXRlc190ZGxzKHBNYWMsCisJCQkJCQkmdGRsc0Rpc1JzcC5TdXBwUmF0ZXMsCisJCQkJCQkmdGRsc0Rpc1JzcC5FeHRTdXBwUmF0ZXMpKQorCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiY291bGQgbm90IHBvcHVsYXRlIHN1cHBvcnRlZCBkYXRhIHJhdGVzIikpOworCisJLyogcG9wdWxhdGUgZXh0ZW5kZWQgY2FwYWJpbGl0eSBJRSAqLworCXBvcHVsYXRlX2RvdDExZl90ZGxzX2V4dF9jYXBhYmlsaXR5KHBNYWMsCisJCQkJCSAgICBwc2Vzc2lvbkVudHJ5LAorCQkJCQkgICAgJnRkbHNEaXNSc3AuRXh0Q2FwKTsKKworCXdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19ET1QxMV9NT0RFLCAmc2VsZkRvdDExTW9kZSk7CisKKwkvKiBQb3B1bGF0ZSBIVC9WSFQgQ2FwYWJpbGl0aWVzICovCisJcG9wdWxhdGVfZG90MTFmX3RkbHNfaHRfdmh0X2NhcChwTWFjLCBzZWxmRG90MTFNb2RlLCAmdGRsc0Rpc1JzcC5IVENhcHMsCisJCQkJCSZ0ZGxzRGlzUnNwLlZIVENhcHMsIHBzZXNzaW9uRW50cnkpOworCisJLyogUG9wdWxhdGUgVERMUyBvZmZjaGFubmVsIHBhcmFtIG9ubHkgaWYgb2ZmY2hhbm5lbCBpcyBlbmFibGVkCisJICogYW5kIFRETFMgQ2hhbm5lbCBTd2l0Y2hpbmcgaXMgbm90IHByb2hpYml0ZWQgYnkgQVAgaW4gRXh0Q2FwCisJICogSUUgaW4gYXNzb2MvcmUtYXNzb2MgcmVzcG9uc2UuCisJICovCisJaWYgKCgxID09IHBNYWMtPmxpbS5nTGltVERMU09mZkNoYW5uZWxFbmFibGVkKSAmJgorCSAgICAoIXBzZXNzaW9uRW50cnktPnRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQpKSB7CisJCXBvcHVsYXRlX2RvdDExZl90ZGxzX29mZmNoYW5uZWxfcGFyYW1zKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQkJCQkgICAgICAgJnRkbHNEaXNSc3AuU3VwcENoYW5uZWxzLAorCQkJCQkJICAgICAgICZ0ZGxzRGlzUnNwLgorCQkJCQkJICAgICAgIFN1cHBPcGVyYXRpbmdDbGFzc2VzKTsKKwkJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYmFuZENhcGFiaWxpdHkgIT0gZUNTUl9CQU5EXzI0KSB7CisJCQl0ZGxzRGlzUnNwLmh0MjA0MF9ic3NfY29leGlzdGVuY2UucHJlc2VudCA9IDE7CisJCQl0ZGxzRGlzUnNwLmh0MjA0MF9ic3NfY29leGlzdGVuY2UuaW5mb19yZXF1ZXN0ID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCUZMKCJURExTIG9mZmNoYW4gbm90IGVuYWJsZWQsIG9yIGNoYW5uZWwgc3dpdGNoIHByb2hpYml0ZWQgYnkgQVAsIGdMaW1URExTT2ZmQ2hhbm5lbEVuYWJsZWQgKCVkKSwgdGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZCAoJWQpIiksCisJCQlwTWFjLT5saW0uZ0xpbVRETFNPZmZDaGFubmVsRW5hYmxlZCwKKwkJCXBzZXNzaW9uRW50cnktPnRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQpOworCX0KKwkvKgorCSAqIG5vdyB3ZSBwYWNrIGl0LiAgRmlyc3QsIGhvdyBtdWNoIHNwYWNlIGFyZSB3ZSBnb2luZyB0byBuZWVkPworCSAqLworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX3RkbHNfZGlzX3JzcF9zaXplKHBNYWMsICZ0ZGxzRGlzUnNwLCAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoCisJCQkgICAiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZm9yIGEgRGlzY292ZXJ5IFJlc3BvbnNlICgweCUwOHgpLiIKKwkJCSAgKSwKKwkJCXN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZlByb2JlUmVxdWVzdCk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoCisJCQkgICAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyB0aGUgcGFja2VkIHNpemUgZm9yIGEgRGlzY292ZXJ5IFJlc3BvbnNlICgweCUwOHgpLiIKKwkJCSAgKSwKKwkJCXN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBUaGlzIGZyYW1lIGlzIGdvaW5nIG91dCBmcm9tIFBFIGFzIGRhdGEgZnJhbWVzIHdpdGggc3BlY2lhbCBldGhlcnR5cGUKKwkgKiA4OS0wZC4KKwkgKiA4IGJ5dGVzIG9mIFJGQyAxMDQyIGhlYWRlcgorCSAqLworCisJbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YodFNpck1hY01nbXRIZHIpICsgYWRkSWVMZW47CisKKwkvKiBPay0tIHRyeSB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBNR01UIFBLVCBwb29sICovCisJY2RmX3N0YXR1cyA9IGNkc19wYWNrZXRfYWxsb2MoKHVpbnQxNl90KSBuQnl0ZXMsICh2b2lkICoqKSZwRnJhbWUsCisJCQkJKHZvaWQgKiopJnBQYWNrZXQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKAorCQkJICAgIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBURExTIERpc2NvdmVyeSBSZXF1ZXN0LiIKKwkJCSAgKSwKKwkJCW5CeXRlcyk7CisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJfQorCisJLyogemVybyBvdXQgdGhlIG1lbW9yeSAqLworCWNkZl9tZW1fc2V0KHBGcmFtZSwgbkJ5dGVzLCAwKTsKKworCS8qCisJICogSUUgZm9ybWF0aW9uLCBtZW1vcnkgYWxsb2NhdGlvbiBpcyBjb21wbGV0ZWQsIE5vdyBmb3JtIFRETFMgZGlzY292ZXJ5CisJICogcmVzcG9uc2UgZnJhbWUKKwkgKi8KKworCS8qIE1ha2UgcHVibGljIEFjdGlvbiBGcmFtZSAqLworCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIocE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisJCQkJU0lSX01BQ19NR01UX0FDVElPTiwgcGVlck1hYywKKwkJCQlwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisKKwl7CisJCXRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworCQlwTWFjSGRyID0gKHRwU2lyTWFjTWdtdEhkcikgcEZyYW1lOworCQlwTWFjSGRyLT5mYy50b0RTID0gQU5JX1RYRElSX0lCU1M7CisJCXBNYWNIZHItPmZjLnBvd2VyTWdtdCA9IDA7CisJCXNpcl9jb3B5X21hY19hZGRyKHBNYWNIZHItPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisJfQorCisJc3RhdHVzID0gZG90MTFmX3BhY2tfdGRsc19kaXNfcnNwKHBNYWMsICZ0ZGxzRGlzUnNwLCBwRnJhbWUgKworCQkJCQkgIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCSAgblBheWxvYWQsICZuUGF5bG9hZCk7CisKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKAorCQkJICAgIkZhaWxlZCB0byBwYWNrIGEgVERMUyBkaXNjb3ZlcnkgcmVzcG9uc2UgKDB4JTA4eCkuIgorCQkJICApLAorCQkJc3RhdHVzKTsKKwkJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopcFBhY2tldCk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoCisJCQkgICAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIFRETFMgRGlzY292ZXJ5IFJlc3BvbnNlICgweCUwOHgpLiIKKwkJCSAgKSwKKwkJCXN0YXR1cyk7CisJfQorCWlmICgwICE9IGFkZEllTGVuKSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCUZMKCJDb3B5IEFkZGl0aW9uYWwgSWUgTGVuID0gJWQiKSwgYWRkSWVMZW4pOworCQljZGZfbWVtX2NvcHkocEZyYW1lICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArIG5QYXlsb2FkLCBhZGRJZSwKKwkJCSAgICAgYWRkSWVMZW4pOworCX0KKwlsaW1fbG9nKHBNYWMsIExPRzEsCisJCUZMKCJbVERMU10gYWN0aW9uICVkICglcykgLURJUkVDVC0+IE9UQSBwZWVyPSJNQUNfQUREUkVTU19TVFIpLAorCQlTSVJfTUFDX1RETFNfRElTX1JTUCwKKwkJbGltX3RyYWNlX3RkbHNfYWN0aW9uX3N0cmluZyhTSVJfTUFDX1RETFNfRElTX1JTUCksCisJCU1BQ19BRERSX0FSUkFZKHBlZXJNYWMpKTsKKworCXBNYWMtPmxpbS5tZ210RnJhbWVTZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKwkvKgorCSAqIFRyYW5zbWl0IERpc2NvdmVyeSByZXNwb25zZSBhbmQgd2F0Y2ggaWYgdGhpcyBpcyBkZWxpdmVyZWQgdG8KKwkgKiBwZWVyIFNUQS4KKwkgKi8KKwkvKiBJbiBDTEQgMi4wLCBwYXNzIERpc2NvdmVyeSBSZXNwb25zZSBhcyBtZ210IGZyYW1lIHNvIHRoYXQKKwkgKiB3bWEgZG9lcyBub3QgZG8gaGVhZGVyIGNvbnZlcnNpb24gdG8gODAyLjMgYmVmb3JlIGNhbGxpbmcgdHgvcngKKwkgKiByb3V0aW5lIGFuZCBzdWJzZXF1ZW5seSB0YXJnZXQgYWxzbyBzZW5kcyBmcmFtZSBhcyBpcyBPVEEKKwkgKi8KKwljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lV2l0aFR4Q29tcGxldGUocE1hYywgcFBhY2tldCwgKHVpbnQxNl90KSBuQnl0ZXMsCisJCQkJCSAgICAgIFRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCQkgICAgICBBTklfVFhESVJfSUJTUywKKwkJCQkJICAgICAgMCwKKwkJCQkJICAgICAgbGltX3R4X2NvbXBsZXRlLCBwRnJhbWUsCisJCQkJCSAgICAgIGxpbV9tZ210X3R4X2NvbXBsZXRlLAorCQkJCQkgICAgICBIQUxfVVNFX1NFTEZfU1RBX1JFUVVFU1RFRF9NQVNLLAorCQkJCQkgICAgICBzbWVTZXNzaW9uSWQsIGZhbHNlLCAwKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlwTWFjLT5saW0ubWdtdEZyYW1lU2Vzc2lvbklkID0gMHhmZjsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoImNvdWxkIG5vdCBzZW5kIFRETFMgRGlzY292ZXJ5IFJlc3BvbnNlIGZyYW1lISIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9CisKKy8qCisgKiBUaGlzIHN0YXRpYyBmdW5jdGlvbiBpcyBjdXJyZW50bHkgdXNlZCBieSBsaW1fc2VuZF90ZGxzX2xpbmtfc2V0dXBfcmVxX2ZyYW1lIGFuZAorICogbGltX3NlbmRfdGRsc19zZXR1cF9yc3BfZnJhbWUgdG8gcG9wdWxhdGUgdGhlIEFJRCBpZiBkZXZpY2UgaXMgMTFhYyBjYXBhYmxlLgorICovCitzdGF0aWMgdm9pZCBwb3B1bGF0ZV9kb3RmX3RkbHNfdmh0X2FpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZWxmRG90MTFNb2RlLAorCQkJCSAgICAgICB0U2lyTWFjQWRkciBwZWVyTWFjLCB0RG90MTFmSUVBSUQgKkFpZCwKKwkJCQkgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlpZiAoKChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwgPD0gU0lSXzExQl9DSEFOTkVMX0VORCkgJiYKKwkgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZW5hYmxlVmh0Rm9yMjRHSHopIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwgPj0gU0lSXzExQl9DSEFOTkVMX0VORCkpIHsKKwkJaWYgKElTX0RPVDExX01PREVfVkhUKHNlbGZEb3QxMU1vZGUpICYmCisJCSAgICBJU19GRUFUVVJFX1NVUFBPUlRFRF9CWV9GVyhET1QxMUFDKSkgeworCisJCQl1aW50MTZfdCBhaWQ7CisJCQl0cERwaEhhc2hOb2RlIHBTdGFEczsKKworCQkJcFN0YURzID0KKwkJCQlkcGhfbG9va3VwX2hhc2hfZW50cnkocE1hYywgcGVlck1hYywgJmFpZCwKKwkJCQkJCSAgICAgICZwc2Vzc2lvbkVudHJ5LT5kcGguCisJCQkJCQkgICAgICBkcGhIYXNoVGFibGUpOworCQkJaWYgKE5VTEwgIT0gcFN0YURzKSB7CisJCQkJQWlkLT5wcmVzZW50ID0gMTsKKwkJCQlBaWQtPmFzc29jSWQgPSBhaWQgfCBMSU1fQUlEX01BU0s7ICAgICAgLyogc2V0IGJpdCAxNCBhbmQgMTUgMSdzICovCisJCQl9IGVsc2UgeworCQkJCUFpZC0+cHJlc2VudCA9IDA7CisJCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTCgicFN0YURzIGlzIE5VTEwgZm9yICIKKwkJCQkJICAgTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJTUFDX0FERFJfQVJSQVkocGVlck1hYykpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJQWlkLT5wcmVzZW50ID0gMDsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiVmh0IG5vdCBlbmFibGUgZnJvbSBpbmkgZm9yIDIuNEdIei4iKSk7CisJfQorfQorCisvKgorICogVERMUyBzZXR1cCBSZXF1ZXN0IGZyYW1lIG9uIEFQIGxpbmsKKyAqLworCit0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX3RkbHNfbGlua19zZXR1cF9yZXFfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSB0U2lyTWFjQWRkciBwZWVyTWFjLCB1aW50OF90IGRpYWxvZywKKwkJCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJCQkJIHVpbnQ4X3QgKmFkZEllLCB1aW50MTZfdCBhZGRJZUxlbikKK3sKKwl0RG90MTFmVERMU1NldHVwUmVxIHRkbHNTZXR1cFJlcTsKKwl1aW50MTZfdCBjYXBzID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXVpbnQzMl90IG5QYXlsb2FkID0gMDsKKwl1aW50MzJfdCBuQnl0ZXMgPSAwOworCXVpbnQzMl90IGhlYWRlcl9vZmZzZXQgPSAwOworCXVpbnQ4X3QgKnBGcmFtZTsKKwl2b2lkICpwUGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl1aW50MzJfdCBzZWxmRG90MTFNb2RlOworCXVpbnQ4X3Qgc21lU2Vzc2lvbklkID0gMDsKKy8qICBQbGFjZWhvbGRlciB0byBzdXBwb3J0IGRpZmZlcmVudCBjaGFubmVsIGJvbmRpbmcgbW9kZSBvZiBURExTIHRoYW4gQVAuICovCisvKiAgVG9kYXksIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREUgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIGNvbm5lY3RpbmcgdG8gQVAgKi8KKy8qICBUbyBzdXBwb3J0IHRoaXMgZmVhdHVyZSwgd2UgbmVlZCB0byBpbnRyb2R1Y2UgV05JX0NGR19URExTX0NIQU5ORUxfQk9ORElOR19NT0RFICovCisvKiAgQXMgb2Ygbm93LCB3ZSBoYXJkY29kZWQgdG8gbWF4IGNoYW5uZWwgYm9uZGluZyBvZiBkb3QxMU1vZGUgKGkuZSBIVDgwIGZvciAxMWFjL0hUNDAgZm9yIDExbikgKi8KKy8qICB1aW50MzJfdCB0ZGxzQ2hhbm5lbEJvbmRpbmdNb2RlOyAqLworCisJLyoKKwkgKiBUaGUgc2NoZW1lIGhlcmUgaXMgdG8gZmlsbCBvdXQgYSAndERvdDExZlByb2JlUmVxdWVzdCcgc3RydWN0dXJlCisJICogYW5kIHRoZW4gaGFuZCBpdCBvZmYgdG8gJ2RvdDExZl9wYWNrX3Byb2JlX3JlcXVlc3QnIChmb3IKKwkgKiBzZXJpYWxpemF0aW9uKS4gIFdlIHN0YXJ0IGJ5IHplcm8taW5pdGlhbGl6aW5nIHRoZSBzdHJ1Y3R1cmU6CisJICovCisJc21lU2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJnRkbHNTZXR1cFJlcSwgc2l6ZW9mKHREb3QxMWZURExTU2V0dXBSZXEpLCAwKTsKKwl0ZGxzU2V0dXBSZXEuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9URExTOworCXRkbHNTZXR1cFJlcS5BY3Rpb24uYWN0aW9uID0gU0lSX01BQ19URExTX1NFVFVQX1JFUTsKKwl0ZGxzU2V0dXBSZXEuRGlhbG9nVG9rZW4udG9rZW4gPSBkaWFsb2c7CisKKwlwb3B1bGF0ZV9kb3QxMWZfbGlua19pZGVuKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQkJICAmdGRsc1NldHVwUmVxLkxpbmtJZGVudGlmaWVyLCBwZWVyTWFjLAorCQkJCSAgVERMU19JTklUSUFUT1IpOworCisJaWYgKGNmZ19nZXRfY2FwYWJpbGl0eV9pbmZvKHBNYWMsICZjYXBzLCBwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJLyoKKwkJICogQ291bGQgbm90IGdldCBDYXBhYmlsaXRpZXMgdmFsdWUKKwkJICogZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJICovCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgQ2FwYWJpbGl0aWVzIHZhbHVlIikpOworCX0KKwlzd2FwX2JpdF9maWVsZDE2KGNhcHMsICh1aW50MTZfdCAqKSAmdGRsc1NldHVwUmVxLkNhcGFiaWxpdGllcyk7CisKKwkvKiBwb3B1bGF0ZSBzdXBwb3J0ZWQgcmF0ZSBhbmQgZXh0IHN1cHBvcnRlZCByYXRlIElFICovCisJaWYgKGVTSVJfRkFJTFVSRSA9PSBwb3B1bGF0ZV9kb3QxMWZfcmF0ZXNfdGRscyhwTWFjLAorCQkJCQkJJnRkbHNTZXR1cFJlcS5TdXBwUmF0ZXMsCisJCQkJCQkmdGRsc1NldHVwUmVxLkV4dFN1cHBSYXRlcykpCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJjb3VsZCBub3QgcG9wdWxhdGUgc3VwcG9ydGVkIGRhdGEgcmF0ZXMiKSk7CisKKwkvKiBQb3B1bGF0ZSBleHRlbmRlZCBjYXBhYmlsaXR5IElFICovCisJcG9wdWxhdGVfZG90MTFmX3RkbHNfZXh0X2NhcGFiaWxpdHkocE1hYywKKwkJCQkJICAgIHBzZXNzaW9uRW50cnksCisJCQkJCSAgICAmdGRsc1NldHVwUmVxLkV4dENhcCk7CisKKwlpZiAoMSA9PSBwTWFjLT5saW0uZ0xpbVRETFNXbW1Nb2RlKSB7CisJCXVpbnQzMl90IHZhbCA9IDA7CisKKwkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoInBvcHVsYXRlIFdNTSBJRSBpbiBTZXR1cCBSZXF1ZXN0IEZyYW1lIikpOworCQkvKiBpbmNsdWRlIFdNTSBJRSAqLworCQl0ZGxzU2V0dXBSZXEuV01NSW5mb1N0YXRpb24udmVyc2lvbiA9IFNJUl9NQUNfT1VJX1ZFUlNJT05fMTsKKwkJdGRsc1NldHVwUmVxLldNTUluZm9TdGF0aW9uLmFjdm9fdWFwc2QgPQorCQkJKHBNYWMtPmxpbS5nTGltVERMU1VhcHNkTWFzayAmIDB4MDEpOworCQl0ZGxzU2V0dXBSZXEuV01NSW5mb1N0YXRpb24uYWN2aV91YXBzZCA9CisJCQkoKHBNYWMtPmxpbS5nTGltVERMU1VhcHNkTWFzayAmIDB4MDIpID4+IDEpOworCQl0ZGxzU2V0dXBSZXEuV01NSW5mb1N0YXRpb24uYWNia191YXBzZCA9CisJCQkoKHBNYWMtPmxpbS5nTGltVERMU1VhcHNkTWFzayAmIDB4MDQpID4+IDIpOworCQl0ZGxzU2V0dXBSZXEuV01NSW5mb1N0YXRpb24uYWNiZV91YXBzZCA9CisJCQkoKHBNYWMtPmxpbS5nTGltVERMU1VhcHNkTWFzayAmIDB4MDgpID4+IDMpOworCisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfTUFYX1NQX0xFTkdUSCwgJnZhbCkgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIE1heCBTUCBMZW5ndGgiKSk7CisKKwkJdGRsc1NldHVwUmVxLldNTUluZm9TdGF0aW9uLm1heF9zcF9sZW5ndGggPSAodWludDhfdCkgdmFsOworCQl0ZGxzU2V0dXBSZXEuV01NSW5mb1N0YXRpb24ucHJlc2VudCA9IDE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVE9ETzogd2UgbmVlZCB0byBzZWUgaWYgd2UgaGF2ZSB0byBzdXBwb3J0IGNvbmRpdGlvbnMgd2hlcmUKKwkJICogd2UgaGF2ZSBFRENBIHBhcmFtZXRlciBpbmZvIGVsZW1lbnQgaXMgbmVlZGVkIGEpIGlmIHdlIG5lZWQKKwkJICogZGlmZmVyZW50IFFPUyBwYXJhbWV0ZXJzIGZvciBvZmYgY2hhbm5lbCBvcGVyYXRpb25zIG9yIFFPUworCQkgKiBpcyBub3Qgc3VwcG9ydGVkIG9uIEFQIGxpbmsgYW5kIHdlIHdhbnRlZCB0byBRT1Mgb24gZGlyZWN0CisJCSAqIGxpbmsuCisJCSAqLworCisJCS8qIFBvcHVsYXRlIFFPUyBpbmZvLCBuZWVkZWQgZm9yIFBlZXIgVS1BUFNEIHNlc3Npb24gKi8KKworCQkvKgorCQkgKiBUT0RPOiBOb3cgaGFyZGNvZGVkLCBzaW5jZSBwb3B1bGF0ZV9kb3QxMWZfcW9zX2NhcHNfc3RhdGlvbigpCisJCSAqIGRlcGVuZHMgb24gQVAncyBjYXBhYmlsaXR5LCBhbmQgVERMUyBkb2Vzbid0IHdhbnQgdG8gZGVwZW5kCisJCSAqIG9uIEFQJ3MgY2FwYWJpbGl0eQorCQkgKi8KKworCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQlGTCgicG9wdWxhdGUgUU9TIElFIGluIFNldHVwIFJlcXVlc3QgRnJhbWUiKSk7CisJCXRkbHNTZXR1cFJlcS5RT1NDYXBzU3RhdGlvbi5wcmVzZW50ID0gMTsKKwkJdGRsc1NldHVwUmVxLlFPU0NhcHNTdGF0aW9uLm1heF9zcF9sZW5ndGggPSAwOworCQl0ZGxzU2V0dXBSZXEuUU9TQ2Fwc1N0YXRpb24ucWFjayA9IDA7CisJCXRkbHNTZXR1cFJlcS5RT1NDYXBzU3RhdGlvbi5hY2JlX3VhcHNkID0KKwkJCSgocE1hYy0+bGltLmdMaW1URExTVWFwc2RNYXNrICYgMHgwOCkgPj4gMyk7CisJCXRkbHNTZXR1cFJlcS5RT1NDYXBzU3RhdGlvbi5hY2JrX3VhcHNkID0KKwkJCSgocE1hYy0+bGltLmdMaW1URExTVWFwc2RNYXNrICYgMHgwNCkgPj4gMik7CisJCXRkbHNTZXR1cFJlcS5RT1NDYXBzU3RhdGlvbi5hY3ZpX3VhcHNkID0KKwkJCSgocE1hYy0+bGltLmdMaW1URExTVWFwc2RNYXNrICYgMHgwMikgPj4gMSk7CisJCXRkbHNTZXR1cFJlcS5RT1NDYXBzU3RhdGlvbi5hY3ZvX3VhcHNkID0KKwkJCShwTWFjLT5saW0uZ0xpbVRETFNVYXBzZE1hc2sgJiAweDAxKTsKKwl9CisKKwkvKgorCSAqIHdlIHdpbGwgYWx3YXlzIHRyeSB0byBpbml0IFRETFMgbGluayB3aXRoIDExbiBjYXBhYmlsaXRpZXMKKwkgKiBsZXQgVERMUyBzZXR1cCByZXNwb25zZSB0byBjb21lLCBhbmQgd2Ugd2lsbCBzZXQgb3VyIGNhcHMgYmFzZWQKKwkgKiBvZiBwZWVyIGNhcHMKKwkgKi8KKworCXdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19ET1QxMV9NT0RFLCAmc2VsZkRvdDExTW9kZSk7CisKKwkvKiBQb3B1bGF0ZSBIVC9WSFQgQ2FwYWJpbGl0aWVzICovCisJcG9wdWxhdGVfZG90MTFmX3RkbHNfaHRfdmh0X2NhcChwTWFjLCBzZWxmRG90MTFNb2RlLCAmdGRsc1NldHVwUmVxLkhUQ2FwcywKKwkJCQkJJnRkbHNTZXR1cFJlcS5WSFRDYXBzLCBwc2Vzc2lvbkVudHJ5KTsKKworCS8qIFBvcHVsYXRlIEFJRCAqLworCXBvcHVsYXRlX2RvdGZfdGRsc192aHRfYWlkKHBNYWMsIHNlbGZEb3QxMU1vZGUsIHBlZXJNYWMsCisJCQkJICAgJnRkbHNTZXR1cFJlcS5BSUQsIHBzZXNzaW9uRW50cnkpOworCisJLyogUG9wdWxhdGUgVERMUyBvZmZjaGFubmVsIHBhcmFtIG9ubHkgaWYgb2ZmY2hhbm5lbCBpcyBlbmFibGVkCisJICogYW5kIFRETFMgQ2hhbm5lbCBTd2l0Y2hpbmcgaXMgbm90IHByb2hpYml0ZWQgYnkgQVAgaW4gRXh0Q2FwCisJICogSUUgaW4gYXNzb2MvcmUtYXNzb2MgcmVzcG9uc2UuCisJICovCisJaWYgKCgxID09IHBNYWMtPmxpbS5nTGltVERMU09mZkNoYW5uZWxFbmFibGVkKSAmJgorCSAgICAoIXBzZXNzaW9uRW50cnktPnRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQpKSB7CisJCXBvcHVsYXRlX2RvdDExZl90ZGxzX29mZmNoYW5uZWxfcGFyYW1zKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQkJCQkgICAgICZ0ZGxzU2V0dXBSZXEuU3VwcENoYW5uZWxzLAorCQkJCQkJICAgICAmdGRsc1NldHVwUmVxLgorCQkJCQkJICAgICBTdXBwT3BlcmF0aW5nQ2xhc3Nlcyk7CisJCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmJhbmRDYXBhYmlsaXR5ICE9IGVDU1JfQkFORF8yNCkgeworCQkJdGRsc1NldHVwUmVxLmh0MjA0MF9ic3NfY29leGlzdGVuY2UucHJlc2VudCA9IDE7CisJCQl0ZGxzU2V0dXBSZXEuaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZS5pbmZvX3JlcXVlc3QgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIlRETFMgb2ZmY2hhbiBub3QgZW5hYmxlZCwgb3IgY2hhbm5lbCBzd2l0Y2ggcHJvaGliaXRlZCBieSBBUCwgZ0xpbVRETFNPZmZDaGFubmVsRW5hYmxlZCAoJWQpLCB0ZGxzX2NoYW5fc3dpdF9wcm9oaWJpdGVkICglZCkiKSwKKwkJCXBNYWMtPmxpbS5nTGltVERMU09mZkNoYW5uZWxFbmFibGVkLAorCQkJcHNlc3Npb25FbnRyeS0+dGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZCk7CisJfQorCS8qCisJICogbm93IHdlIHBhY2sgaXQuICBGaXJzdCwgaG93IG11Y2ggc3BhY2UgYXJlIHdlIGdvaW5nIHRvIG5lZWQ/CisJICovCisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfdGRsc19zZXR1cF9yZXFfc2l6ZShwTWFjLCAmdGRsc1NldHVwUmVxLAorCQkJCQkJICAgICAgICZuUGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgKKwkJCSAgICJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBTZXR1cCBSZXF1ZXN0ICgweCUwOHgpLiIKKwkJCSAgKSwKKwkJCXN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZlByb2JlUmVxdWVzdCk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoCisJCQkgICAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyB0aGUgcGFja2VkIHNpemUgZm9yIGEgU2V0dXAgUmVxdWVzdCAoMHglMDh4KS4iCisJCQkgICksCisJCQlzdGF0dXMpOworCX0KKworCS8qCisJICogVGhpcyBmcmFtZSBpcyBnb2luZyBvdXQgZnJvbSBQRSBhcyBkYXRhIGZyYW1lcyB3aXRoIHNwZWNpYWwgZXRoZXJ0eXBlCisJICogODktMGQuCisJICogOCBieXRlcyBvZiBSRkMgMTA0MiBoZWFkZXIKKwkgKi8KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgKChJU19RT1NfRU5BQkxFRChwc2Vzc2lvbkVudHJ5KSkKKwkJCSAgICAgPyBzaXplb2YodFNpck1hY0RhdGFIZHIzYSkgOgorCQkJICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpKQorCQkgKyBzaXplb2YoZXRoXzg5MGRfaGVhZGVyKQorCQkgKyBQQVlMT0FEX1RZUEVfVERMU19TSVpFICsgYWRkSWVMZW47CisKKwkvKiBPay0tIHRyeSB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBNR01UIFBLVCBwb29sICovCisJY2RmX3N0YXR1cyA9IGNkc19wYWNrZXRfYWxsb2MoKHVpbnQxNl90KSBuQnl0ZXMsICh2b2lkICoqKSZwRnJhbWUsCisJCQkodm9pZCAqKikmcFBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoCisJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhIFRETFMgU2V0dXAgUmVxdWVzdC4iCisJCQkgICksCisJCQluQnl0ZXMpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCS8qIHplcm8gb3V0IHRoZSBtZW1vcnkgKi8KKwljZGZfbWVtX3NldChwRnJhbWUsIG5CeXRlcywgMCk7CisKKwkvKgorCSAqIElFIGZvcm1hdGlvbiwgbWVtb3J5IGFsbG9jYXRpb24gaXMgY29tcGxldGVkLCBOb3cgZm9ybSBURExTIGRpc2NvdmVyeQorCSAqIHJlcXVlc3QgZnJhbWUKKwkgKi8KKworCS8qIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvciAqLworCisJaGVhZGVyX29mZnNldCA9IGxpbV9wcmVwYXJlX3RkbHNfZnJhbWVfaGVhZGVyKHBNYWMsIHBGcmFtZSwKKwkJCQkJCSAgICAgIExJTktfSURFTl9BRERSX09GRlNFVAorCQkJCQkJCSAgICAgICh0ZGxzU2V0dXBSZXEpLCBURExTX0xJTktfQVAsCisJCQkJCQkgICAgICBURExTX0lOSVRJQVRPUiwgVElEX0FDX0JLLAorCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisKKwlsaW1fbG9nKHBNYWMsIExPR1csCisJCUZMKAorCQkgICAiU3VwcG9ydGVkQ2hubFdpZHRoICV4IHJ4TUNTTWFwICV4IHJ4TUNTTWFwICV4IHR4U3VwRGF0YVJhdGUgJXgiCisJCSAgKSwKKwkJdGRsc1NldHVwUmVxLlZIVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0LAorCQl0ZGxzU2V0dXBSZXEuVkhUQ2Fwcy5yeE1DU01hcCwKKwkJdGRsc1NldHVwUmVxLlZIVENhcHMudHhNQ1NNYXAsCisJCXRkbHNTZXR1cFJlcS5WSFRDYXBzLnR4U3VwRGF0YVJhdGUpOworCisJc3RhdHVzID0gZG90MTFmX3BhY2tfdGRsc19zZXR1cF9yZXEocE1hYywgJnRkbHNTZXR1cFJlcSwgcEZyYW1lCisJCQkJCSAgICArIGhlYWRlcl9vZmZzZXQsIG5QYXlsb2FkLCAmblBheWxvYWQpOworCisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhY2sgYSBURExTIFNldHVwIHJlcXVlc3QgKDB4JTA4eCkuIiksCisJCQlzdGF0dXMpOworCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKilwUGFja2V0KTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgKKwkJCSAgICJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgVERMUyBTZXR1cCBSZXF1ZXN0ICgweCUwOHgpLiIKKwkJCSAgKSwKKwkJCXN0YXR1cyk7CisJfQorCS8qIENvcHkgdGhlIGFkZGl0aW9uYWwgSUUuICovCisJLyogVE9ETyA6IGFkZEllIGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lLiBUaGlzIG1lYW5zIGl0IGRvZXNudCAqLworCS8qIGZvbGxvdyB0aGUgb3JkZXIuIFRoaXMgc2hvdWxkIGJlIG9rLCBidXQgd2Ugc2hvdWxkIGNvbnNpZGVyIGNoYW5naW5nIHRoaXMgKi8KKwkvKiBpZiB0aGVyZSBpcyBhbnkgSU9UIGlzc3VlLiAqLworCWlmIChhZGRJZUxlbiAhPSAwKSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIkNvcHkgQWRkaXRpb25hbCBJZSBMZW4gPSAlZCIpLAorCQkgICAgICAgYWRkSWVMZW4pOworCQljZGZfbWVtX2NvcHkocEZyYW1lICsgaGVhZGVyX29mZnNldCArIG5QYXlsb2FkLCBhZGRJZSwKKwkJCSAgICAgYWRkSWVMZW4pOworCX0KKworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIltURExTXSBhY3Rpb24gJWQgKCVzKSAtQVAtPiBPVEEgcGVlcj0iTUFDX0FERFJFU1NfU1RSKSwKKwkJU0lSX01BQ19URExTX1NFVFVQX1JFUSwKKwkJbGltX3RyYWNlX3RkbHNfYWN0aW9uX3N0cmluZyhTSVJfTUFDX1RETFNfU0VUVVBfUkVRKSwKKwkJTUFDX0FERFJfQVJSQVkocGVlck1hYykpOworCisJcE1hYy0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisJY2RmX3N0YXR1cyA9IHdtYV90eF9mcmFtZVdpdGhUeENvbXBsZXRlKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCQkgICAgICBUWFJYX0ZSTV84MDJfMTFfREFUQSwKKwkJCQkJICAgICAgQU5JX1RYRElSX1RPRFMsCisJCQkJCSAgICAgIFRJRF9BQ19CSywKKwkJCQkJICAgICAgbGltX3R4X2NvbXBsZXRlLCBwRnJhbWUsCisJCQkJCSAgICAgIGxpbV9tZ210X3R4X2NvbXBsZXRlLAorCQkJCQkgICAgICBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FLAorCQkJCQkgICAgICBzbWVTZXNzaW9uSWQsIGZhbHNlLCAwKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCXBNYWMtPmxpbS5tZ210RnJhbWVTZXNzaW9uSWQgPSAweGZmOworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiY291bGQgbm90IHNlbmQgVERMUyBTZXR1cCBSZXF1ZXN0IGZyYW1lISIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9CisKKy8qCisgKiBTZW5kIFRETFMgVGVhcmRvd24gZnJhbWUgb24gRGlyZWN0IGxpbmsgb3IgQVAgbGluaywgZGVwZW5kcyBvbiByZWFzb24gY29kZS4KKyAqLworCit0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX3RkbHNfdGVhcmRvd25fZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgdFNpck1hY0FkZHIgcGVlck1hYywgdWludDE2X3QgcmVhc29uLAorCQkJCQkgICB1aW50OF90IHJlc3BvbmRlciwKKwkJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkJICAgdWludDhfdCAqYWRkSWUsIHVpbnQxNl90IGFkZEllTGVuKQoreworCXREb3QxMWZURExTVGVhcmRvd24gdGVhcmRvd247CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwl1aW50MzJfdCBuUGF5bG9hZCA9IDA7CisJdWludDMyX3QgbkJ5dGVzID0gMDsKKwl1aW50MzJfdCBoZWFkZXJfb2Zmc2V0ID0gMDsKKwl1aW50OF90ICpwRnJhbWU7CisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisjaWZuZGVmIE5PX1BBRF9URExTX01JTl84MDIzX1NJWkUKKwl1aW50MzJfdCBwYWRMZW4gPSAwOworI2VuZGlmCisJdWludDhfdCBzbWVTZXNzaW9uSWQgPSAwOworCisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJwc2Vzc2lvbkVudHJ5IGlzIE5VTEwiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCXNtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKwkvKgorCSAqIFRoZSBzY2hlbWUgaGVyZSBpcyB0byBmaWxsIG91dCBhICd0RG90MTFmUHJvYmVSZXF1ZXN0JyBzdHJ1Y3R1cmUKKwkgKiBhbmQgdGhlbiBoYW5kIGl0IG9mZiB0byAnZG90MTFmX3BhY2tfcHJvYmVfcmVxdWVzdCcgKGZvcgorCSAqIHNlcmlhbGl6YXRpb24pLiAgV2Ugc3RhcnQgYnkgemVyby1pbml0aWFsaXppbmcgdGhlIHN0cnVjdHVyZToKKwkgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmdGVhcmRvd24sIHNpemVvZih0RG90MTFmVERMU1RlYXJkb3duKSwgMCk7CisJdGVhcmRvd24uQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9URExTOworCXRlYXJkb3duLkFjdGlvbi5hY3Rpb24gPSBTSVJfTUFDX1RETFNfVEVBUkRPV047CisJdGVhcmRvd24uUmVhc29uLmNvZGUgPSByZWFzb247CisKKwlwb3B1bGF0ZV9kb3QxMWZfbGlua19pZGVuKHBNYWMsIHBzZXNzaW9uRW50cnksICZ0ZWFyZG93bi5MaW5rSWRlbnRpZmllciwKKwkJCQkgIHBlZXJNYWMsCisJCQkJICAocmVzcG9uZGVyID09CisJCQkJICAgdHJ1ZSkgPyBURExTX1JFU1BPTkRFUiA6IFRETFNfSU5JVElBVE9SKTsKKworCS8qCisJICogbm93IHdlIHBhY2sgaXQuICBGaXJzdCwgaG93IG11Y2ggc3BhY2UgYXJlIHdlIGdvaW5nIHRvIG5lZWQ/CisJICovCisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfdGRsc190ZWFyZG93bl9zaXplKHBNYWMsICZ0ZWFyZG93biwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKAorCQkJICAgIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGZvciBhIGRpc2NvdmVyeSBSZXF1ZXN0ICgweCUwOHgpLiIKKwkJCSAgKSwKKwkJCXN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZlByb2JlUmVxdWVzdCk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoCisJCQkgICAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyB0aGUgcGFja2VkIHNpemUgZm9yIGEgZGlzY292ZXJ5IFJlcXVlc3QgKDB4JTA4eCkuIgorCQkJICApLAorCQkJc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIFRoaXMgZnJhbWUgaXMgZ29pbmcgb3V0IGZyb20gUEUgYXMgZGF0YSBmcmFtZXMgd2l0aCBzcGVjaWFsIGV0aGVydHlwZQorCSAqIDg5LTBkLgorCSAqIDggYnl0ZXMgb2YgUkZDIDEwNDIgaGVhZGVyCisJICovCisKKwluQnl0ZXMgPSBuUGF5bG9hZCArICgoSVNfUU9TX0VOQUJMRUQocHNlc3Npb25FbnRyeSkpCisJCQkgICAgID8gc2l6ZW9mKHRTaXJNYWNEYXRhSGRyM2EpIDoKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSkKKwkJICsgc2l6ZW9mKGV0aF84OTBkX2hlYWRlcikKKwkJICsgUEFZTE9BRF9UWVBFX1RETFNfU0laRSArIGFkZEllTGVuOworCisjaWZuZGVmIE5PX1BBRF9URExTX01JTl84MDIzX1NJWkUKKwkvKiBJT1QgaXNzdWUgd2l0aCBzb21lIEFQIDogc29tZSBBUCBkb2Vzbid0IGxpa2UgdGhlIGRhdGEgcGFja2V0IHNpemUgPCBtaW5pbXVtIDgwMi4zIGZyYW1lIGxlbmd0aCAoNjQpCisJICAgSGVuY2UgQVAgaXRzZWxmIHBhZGRpbmcgc29tZSBieXRlcywgd2hpY2ggY2F1c2VkIHRlYXJkb3duIHBhY2tldCBpcyBkcm9wcGVkIGF0CisJICAgcmVjZWl2ZXIgc2lkZS4gVG8gYXZvaWQgc3VjaCBJT1QgaXNzdWUsIHdlIGFkZGVkIHNvbWUgZXh0cmEgYnl0ZXMgdG8gbWVldCBkYXRhIGZyYW1lIHNpemUgPj0gNjQKKwkgKi8KKwlpZiAoblBheWxvYWQgKyBQQVlMT0FEX1RZUEVfVERMU19TSVpFIDwgTUlOX0lFRUVfODAyM19TSVpFKSB7CisJCXBhZExlbiA9CisJCQlNSU5fSUVFRV84MDIzX1NJWkUgLSAoblBheWxvYWQgKyBQQVlMT0FEX1RZUEVfVERMU19TSVpFKTsKKworCQkvKiBpZiBwYWRMZW4gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmVuZG9yU3BlY2lmaWMgKDUpLCBwYWQgdXAgdG8gNSAqLworCQlpZiAocGFkTGVuIDwgTUlOX1ZFTkRPUl9TUEVDSUZJQ19JRV9TSVpFKQorCQkJcGFkTGVuID0gTUlOX1ZFTkRPUl9TUEVDSUZJQ19JRV9TSVpFOworCisJCW5CeXRlcyArPSBwYWRMZW47CisJfQorI2VuZGlmCisKKwkvKiBPay0tIHRyeSB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBNR01UIFBLVCBwb29sICovCisJY2RmX3N0YXR1cyA9IGNkc19wYWNrZXRfYWxsb2MoKHVpbnQxNl90KSBuQnl0ZXMsICh2b2lkICoqKSZwRnJhbWUsCisJCQkodm9pZCAqKikmcFBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoCisJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhIFRETFMgVGVhcmRvd24gRnJhbWUuIgorCQkJICApLAorCQkJbkJ5dGVzKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisKKwkvKiB6ZXJvIG91dCB0aGUgbWVtb3J5ICovCisJY2RmX21lbV9zZXQocEZyYW1lLCBuQnl0ZXMsIDApOworCisJLyoKKwkgKiBJRSBmb3JtYXRpb24sIG1lbW9yeSBhbGxvY2F0aW9uIGlzIGNvbXBsZXRlZCwgTm93IGZvcm0gVERMUyBkaXNjb3ZlcnkKKwkgKiByZXF1ZXN0IGZyYW1lCisJICovCisKKwkvKiBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJSZWFzb24gb2YgVERMUyBUZWFyZG93bjogJWQiKSwgcmVhc29uKTsKKwloZWFkZXJfb2Zmc2V0ID0gbGltX3ByZXBhcmVfdGRsc19mcmFtZV9oZWFkZXIocE1hYywgcEZyYW1lLAorCQkJCQkJICAgICAgTElOS19JREVOX0FERFJfT0ZGU0VUCisJCQkJCQkJICAgICAgKHRlYXJkb3duKSwKKwkJCQkJCSAgICAgIChyZWFzb24gPT0KKwkJCQkJCSAgICAgICBlU0lSX01BQ19URExTX1RFQVJET1dOX1BFRVJfVU5SRUFDSEFCTEUpCisJCQkJCQkgICAgICA/IFRETFNfTElOS19BUCA6CisJCQkJCQkgICAgICBURExTX0xJTktfRElSRUNULAorCQkJCQkJICAgICAgKHJlc3BvbmRlciA9PQorCQkJCQkJICAgICAgIHRydWUpID8gVERMU19SRVNQT05ERVIgOgorCQkJCQkJICAgICAgVERMU19JTklUSUFUT1IsIFRJRF9BQ19WSSwKKwkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCisJc3RhdHVzID0gZG90MTFmX3BhY2tfdGRsc190ZWFyZG93bihwTWFjLCAmdGVhcmRvd24sIHBGcmFtZQorCQkJCQkgICArIGhlYWRlcl9vZmZzZXQsIG5QYXlsb2FkLCAmblBheWxvYWQpOworCisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhY2sgYSBURExTIFRlYXJkb3duIGZyYW1lICgweCUwOHgpLiIpLAorCQkJc3RhdHVzKTsKKwkJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopcFBhY2tldCk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoCisJCQkgICAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIFRETFMgVGVhcmRvd24gZnJhbWUgKDB4JTA4eCkuIgorCQkJICApLAorCQkJc3RhdHVzKTsKKwl9CisKKwlpZiAoYWRkSWVMZW4gIT0gMCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgiQ29weSBBZGRpdGlvbmFsIEllIExlbiA9ICVkIiksIGFkZEllTGVuKTsKKwkJY2RmX21lbV9jb3B5KHBGcmFtZSArIGhlYWRlcl9vZmZzZXQgKyBuUGF5bG9hZCwgYWRkSWUsCisJCQkgICAgIGFkZEllTGVuKTsKKwl9CisjaWZuZGVmIE5PX1BBRF9URExTX01JTl84MDIzX1NJWkUKKwlpZiAocGFkTGVuICE9IDApIHsKKwkJLyogUUNPTSBWRU5ET1IgT1VJID0geyAweDAwLCAweEEwLCAweEM2LCB0eXBlID0gMHgwMDAwIH07ICovCisJCXVpbnQ4X3QgKnBhZFZlbmRvclNwZWNpZmljID0KKwkJCXBGcmFtZSArIGhlYWRlcl9vZmZzZXQgKyBuUGF5bG9hZCArIGFkZEllTGVuOworCQkvKiBtYWtlIFFDT01fVkVORE9SX09VSSwgYW5kIHR5cGUgPSAweDAwMDAsIGFuZCBhbGwgdGhlIHBheWxvYWQgdG8gYmUgemVybyAqLworCQlwYWRWZW5kb3JTcGVjaWZpY1swXSA9IDIyMTsKKwkJcGFkVmVuZG9yU3BlY2lmaWNbMV0gPSBwYWRMZW4gLSAyOworCQlwYWRWZW5kb3JTcGVjaWZpY1syXSA9IDB4MDA7CisJCXBhZFZlbmRvclNwZWNpZmljWzNdID0gMHhBMDsKKwkJcGFkVmVuZG9yU3BlY2lmaWNbNF0gPSAweEM2OworCisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlBhZGRpbmcgVmVuZG9yIFNwZWNpZmljIEllIExlbiA9ICVkIiksCisJCQlwYWRMZW4pOworCisJCS8qIHBhZGRpbmcgemVybyBpZiBtb3JlIHRoYW4gNSBieXRlcyBhcmUgcmVxdWlyZWQgKi8KKwkJaWYgKHBhZExlbiA+IE1JTl9WRU5ET1JfU1BFQ0lGSUNfSUVfU0laRSkKKwkJCWNkZl9tZW1fc2V0KHBGcmFtZSArIGhlYWRlcl9vZmZzZXQgKyBuUGF5bG9hZCArCisJCQkJICAgIGFkZEllTGVuICsgTUlOX1ZFTkRPUl9TUEVDSUZJQ19JRV9TSVpFLAorCQkJCSAgICBwYWRMZW4gLSBNSU5fVkVORE9SX1NQRUNJRklDX0lFX1NJWkUsIDApOworCX0KKyNlbmRpZgorCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIltURExTXSBhY3Rpb24gJWQgKCVzKSAtJXMtPiBPVEEgcGVlcj0iTUFDX0FERFJFU1NfU1RSKSwKKwkJU0lSX01BQ19URExTX1RFQVJET1dOLAorCQlsaW1fdHJhY2VfdGRsc19hY3Rpb25fc3RyaW5nKFNJUl9NQUNfVERMU19URUFSRE9XTiksCisJCSgocmVhc29uID09IGVTSVJfTUFDX1RETFNfVEVBUkRPV05fUEVFUl9VTlJFQUNIQUJMRSkgPyAiQVAiIDoKKwkJICAgICJESVJFQ1QiKSwKKwkJTUFDX0FERFJfQVJSQVkocGVlck1hYykpOworCisJcE1hYy0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisJY2RmX3N0YXR1cyA9IHdtYV90eF9mcmFtZVdpdGhUeENvbXBsZXRlKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCQkgICAgICBUWFJYX0ZSTV84MDJfMTFfREFUQSwKKwkJCQkJICAgICAgQU5JX1RYRElSX1RPRFMsCisJCQkJCSAgICAgIFRJRF9BQ19WSSwKKwkJCQkJICAgICAgbGltX3R4X2NvbXBsZXRlLCBwRnJhbWUsCisJCQkJCSAgICAgIGxpbV9tZ210X3R4X2NvbXBsZXRlLAorCQkJCQkgICAgICBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FLAorCQkJCQkgICAgICBzbWVTZXNzaW9uSWQsIGZhbHNlLCAwKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCXBNYWMtPmxpbS5tZ210RnJhbWVTZXNzaW9uSWQgPSAweGZmOworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiY291bGQgbm90IHNlbmQgVERMUyBUZWFyZG93biBmcmFtZSIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworCX0KKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9CisKKy8qCisgKiBTZW5kIFNldHVwIFJTUCBmcmFtZSBvbiBBUCBsaW5rLgorICovCitzdGF0aWMgdFNpclJldFN0YXR1cyBsaW1fc2VuZF90ZGxzX3NldHVwX3JzcF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgdFNpck1hY0FkZHIgcGVlck1hYywKKwkJCQkJCSAgIHVpbnQ4X3QgZGlhbG9nLAorCQkJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkJCSAgIGV0ZGxzTGlua1NldHVwU3RhdHVzIHNldHVwU3RhdHVzLAorCQkJCQkJICAgdWludDhfdCAqYWRkSWUsCisJCQkJCQkgICB1aW50MTZfdCBhZGRJZUxlbikKK3sKKwl0RG90MTFmVERMU1NldHVwUnNwIHRkbHNTZXR1cFJzcDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXVpbnQxNl90IGNhcHMgPSAwOworCXVpbnQzMl90IG5QYXlsb2FkID0gMDsKKwl1aW50MzJfdCBoZWFkZXJfb2Zmc2V0ID0gMDsKKwl1aW50MzJfdCBuQnl0ZXMgPSAwOworCXVpbnQ4X3QgKnBGcmFtZTsKKwl2b2lkICpwUGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl1aW50MzJfdCBzZWxmRG90MTFNb2RlOworLyogIFBsYWNlaG9sZGVyIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNoYW5uZWwgYm9uZGluZyBtb2RlIG9mIFRETFMgdGhhbiBBUC4gKi8KKy8qICBUb2RheSwgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gY29ubmVjdGluZyB0byBBUCAqLworLyogIFRvIHN1cHBvcnQgdGhpcyBmZWF0dXJlLCB3ZSBuZWVkIHRvIGludHJvZHVjZSBXTklfQ0ZHX1RETFNfQ0hBTk5FTF9CT05ESU5HX01PREUgKi8KKy8qICBBcyBvZiBub3csIHdlIGhhcmRjb2RlZCB0byBtYXggY2hhbm5lbCBib25kaW5nIG9mIGRvdDExTW9kZSAoaS5lIEhUODAgZm9yIDExYWMvSFQ0MCBmb3IgMTFuKSAqLworLyogIHVpbnQzMl90IHRkbHNDaGFubmVsQm9uZGluZ01vZGU7ICovCisJdWludDhfdCBzbWVTZXNzaW9uSWQgPSAwOworCisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJwc2Vzc2lvbkVudHJ5IGlzIE5VTEwiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCXNtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCS8qCisJICogVGhlIHNjaGVtZSBoZXJlIGlzIHRvIGZpbGwgb3V0IGEgJ3REb3QxMWZQcm9iZVJlcXVlc3QnIHN0cnVjdHVyZQorCSAqIGFuZCB0aGVuIGhhbmQgaXQgb2ZmIHRvICdkb3QxMWZfcGFja19wcm9iZV9yZXF1ZXN0JyAoZm9yCisJICogc2VyaWFsaXphdGlvbikuICBXZSBzdGFydCBieSB6ZXJvLWluaXRpYWxpemluZyB0aGUgc3RydWN0dXJlOgorCSAqLworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZ0ZGxzU2V0dXBSc3AsIHNpemVvZih0RG90MTFmVERMU1NldHVwUnNwKSwgMCk7CisKKwkvKgorCSAqIHNldHVwIEZpeGVkIGZpZWxkcywKKwkgKi8KKwl0ZGxzU2V0dXBSc3AuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9URExTOworCXRkbHNTZXR1cFJzcC5BY3Rpb24uYWN0aW9uID0gU0lSX01BQ19URExTX1NFVFVQX1JTUDsKKwl0ZGxzU2V0dXBSc3AuRGlhbG9nVG9rZW4udG9rZW4gPSBkaWFsb2c7CisKKwlwb3B1bGF0ZV9kb3QxMWZfbGlua19pZGVuKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQkJICAmdGRsc1NldHVwUnNwLkxpbmtJZGVudGlmaWVyLCBwZWVyTWFjLAorCQkJCSAgVERMU19SRVNQT05ERVIpOworCisJaWYgKGNmZ19nZXRfY2FwYWJpbGl0eV9pbmZvKHBNYWMsICZjYXBzLCBwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJLyoKKwkJICogQ291bGQgbm90IGdldCBDYXBhYmlsaXRpZXMgdmFsdWUKKwkJICogZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJICovCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgQ2FwYWJpbGl0aWVzIHZhbHVlIikpOworCX0KKwlzd2FwX2JpdF9maWVsZDE2KGNhcHMsICh1aW50MTZfdCAqKSAmdGRsc1NldHVwUnNwLkNhcGFiaWxpdGllcyk7CisKKwkvKiBwb3B1bGF0ZSBzdXBwb3J0ZWQgcmF0ZSBhbmQgZXh0IHN1cHBvcnRlZCByYXRlIElFICovCisJaWYgKGVTSVJfRkFJTFVSRSA9PSBwb3B1bGF0ZV9kb3QxMWZfcmF0ZXNfdGRscyhwTWFjLAorCQkJCQkJJnRkbHNTZXR1cFJzcC5TdXBwUmF0ZXMsCisJCQkJCQkmdGRsc1NldHVwUnNwLkV4dFN1cHBSYXRlcykpCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJjb3VsZCBub3QgcG9wdWxhdGUgc3VwcG9ydGVkIGRhdGEgcmF0ZXMiKSk7CisKKwkvKiBQb3B1bGF0ZSBleHRlbmRlZCBjYXBhYmlsaXR5IElFICovCisJcG9wdWxhdGVfZG90MTFmX3RkbHNfZXh0X2NhcGFiaWxpdHkocE1hYywKKwkJCQkJICAgIHBzZXNzaW9uRW50cnksCisJCQkJCSAgICAmdGRsc1NldHVwUnNwLkV4dENhcCk7CisKKwlpZiAoMSA9PSBwTWFjLT5saW0uZ0xpbVRETFNXbW1Nb2RlKSB7CisJCXVpbnQzMl90IHZhbCA9IDA7CisKKwkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoInBvcHVsYXRlIFdNTSBJRSBpbiBTZXR1cCBSZXNwb25zZSBmcmFtZSIpKTsKKwkJLyogaW5jbHVkZSBXTU0gSUUgKi8KKwkJdGRsc1NldHVwUnNwLldNTUluZm9TdGF0aW9uLnZlcnNpb24gPSBTSVJfTUFDX09VSV9WRVJTSU9OXzE7CisJCXRkbHNTZXR1cFJzcC5XTU1JbmZvU3RhdGlvbi5hY3ZvX3VhcHNkID0KKwkJCShwTWFjLT5saW0uZ0xpbVRETFNVYXBzZE1hc2sgJiAweDAxKTsKKwkJdGRsc1NldHVwUnNwLldNTUluZm9TdGF0aW9uLmFjdmlfdWFwc2QgPQorCQkJKChwTWFjLT5saW0uZ0xpbVRETFNVYXBzZE1hc2sgJiAweDAyKSA+PiAxKTsKKwkJdGRsc1NldHVwUnNwLldNTUluZm9TdGF0aW9uLmFjYmtfdWFwc2QgPQorCQkJKChwTWFjLT5saW0uZ0xpbVRETFNVYXBzZE1hc2sgJiAweDA0KSA+PiAyKTsKKwkJdGRsc1NldHVwUnNwLldNTUluZm9TdGF0aW9uLmFjYmVfdWFwc2QgPQorCQkJKChwTWFjLT5saW0uZ0xpbVRETFNVYXBzZE1hc2sgJiAweDA4KSA+PiAzKTsKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19NQVhfU1BfTEVOR1RILCAmdmFsKSAhPQorCQkgICAgZVNJUl9TVUNDRVNTKQorCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgTWF4IFNQIExlbmd0aCIpKTsKKwkJCXRkbHNTZXR1cFJzcC5XTU1JbmZvU3RhdGlvbi5tYXhfc3BfbGVuZ3RoID0gKHVpbnQ4X3QpIHZhbDsKKwkJdGRsc1NldHVwUnNwLldNTUluZm9TdGF0aW9uLnByZXNlbnQgPSAxOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRPRE86IHdlIG5lZWQgdG8gc2VlIGlmIHdlIGhhdmUgdG8gc3VwcG9ydCBjb25kaXRpb25zIHdoZXJlCisJCSAqIHdlIGhhdmUgRURDQSBwYXJhbWV0ZXIgaW5mbyBlbGVtZW50IGlzIG5lZWRlZCBhKSBpZiB3ZSBuZWVkCisJCSAqIGRpZmZlcmVudCBRT1MgcGFyYW1ldGVycyBmb3Igb2ZmIGNoYW5uZWwgb3BlcmF0aW9ucyBvciBRT1MKKwkJICogaXMgbm90IHN1cHBvcnRlZCBvbiBBUCBsaW5rIGFuZCB3ZSB3YW50ZWQgdG8gUU9TIG9uIGRpcmVjdAorCQkgKiBsaW5rLgorCQkgKi8KKwkJLyogUG9wdWxhdGUgUU9TIGluZm8sIG5lZWRlZCBmb3IgUGVlciBVLUFQU0Qgc2Vzc2lvbiAqLworCQkvKgorCQkgKiBUT0RPOiBOb3cgaGFyZGNvZGVkLCBiZWNhdXNlCisJCSAqIHBvcHVsYXRlX2RvdDExZl9xb3NfY2Fwc19zdGF0aW9uKCkgZGVwZW5kcyBvbiBBUCdzCisJCSAqIGNhcGFiaWxpdHksIGFuZCBURExTIGRvZXNuJ3Qgd2FudCB0byBkZXBlbmQgb24gQVAncworCQkgKiBjYXBhYmlsaXR5CisJCSAqLworCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQlGTCgicG9wdWxhdGUgUU9TIElFIGluIFNldHVwIFJlc3BvbnNlIGZyYW1lIikpOworCQl0ZGxzU2V0dXBSc3AuUU9TQ2Fwc1N0YXRpb24ucHJlc2VudCA9IDE7CisJCXRkbHNTZXR1cFJzcC5RT1NDYXBzU3RhdGlvbi5tYXhfc3BfbGVuZ3RoID0gMDsKKwkJdGRsc1NldHVwUnNwLlFPU0NhcHNTdGF0aW9uLnFhY2sgPSAwOworCQl0ZGxzU2V0dXBSc3AuUU9TQ2Fwc1N0YXRpb24uYWNiZV91YXBzZCA9CisJCQkoKHBNYWMtPmxpbS5nTGltVERMU1VhcHNkTWFzayAmIDB4MDgpID4+IDMpOworCQl0ZGxzU2V0dXBSc3AuUU9TQ2Fwc1N0YXRpb24uYWNia191YXBzZCA9CisJCQkoKHBNYWMtPmxpbS5nTGltVERMU1VhcHNkTWFzayAmIDB4MDQpID4+IDIpOworCQl0ZGxzU2V0dXBSc3AuUU9TQ2Fwc1N0YXRpb24uYWN2aV91YXBzZCA9CisJCQkoKHBNYWMtPmxpbS5nTGltVERMU1VhcHNkTWFzayAmIDB4MDIpID4+IDEpOworCQl0ZGxzU2V0dXBSc3AuUU9TQ2Fwc1N0YXRpb24uYWN2b191YXBzZCA9CisJCQkocE1hYy0+bGltLmdMaW1URExTVWFwc2RNYXNrICYgMHgwMSk7CisJfQorCisJd2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0RPVDExX01PREUsICZzZWxmRG90MTFNb2RlKTsKKworCS8qIFBvcHVsYXRlIEhUL1ZIVCBDYXBhYmlsaXRpZXMgKi8KKwlwb3B1bGF0ZV9kb3QxMWZfdGRsc19odF92aHRfY2FwKHBNYWMsIHNlbGZEb3QxMU1vZGUsICZ0ZGxzU2V0dXBSc3AuSFRDYXBzLAorCQkJCQkmdGRsc1NldHVwUnNwLlZIVENhcHMsIHBzZXNzaW9uRW50cnkpOworCisJLyogUG9wdWxhdGUgQUlEICovCisJcG9wdWxhdGVfZG90Zl90ZGxzX3ZodF9haWQocE1hYywgc2VsZkRvdDExTW9kZSwgcGVlck1hYywKKwkJCQkgICAmdGRsc1NldHVwUnNwLkFJRCwgcHNlc3Npb25FbnRyeSk7CisKKwkvKiBQb3B1bGF0ZSBURExTIG9mZmNoYW5uZWwgcGFyYW0gb25seSBpZiBvZmZjaGFubmVsIGlzIGVuYWJsZWQKKwkgKiBhbmQgVERMUyBDaGFubmVsIFN3aXRjaGluZyBpcyBub3QgcHJvaGliaXRlZCBieSBBUCBpbiBFeHRDYXAKKwkgKiBJRSBpbiBhc3NvYy9yZS1hc3NvYyByZXNwb25zZS4KKwkgKi8KKwlpZiAoKDEgPT0gcE1hYy0+bGltLmdMaW1URExTT2ZmQ2hhbm5lbEVuYWJsZWQpICYmCisJICAgICghcHNlc3Npb25FbnRyeS0+dGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZCkpIHsKKwkJcG9wdWxhdGVfZG90MTFmX3RkbHNfb2ZmY2hhbm5lbF9wYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeSwKKwkJCQkJCSAgICAmdGRsc1NldHVwUnNwLlN1cHBDaGFubmVscywKKwkJCQkJCSAgICAmdGRsc1NldHVwUnNwLgorCQkJCQkJICAgIFN1cHBPcGVyYXRpbmdDbGFzc2VzKTsKKwkJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYmFuZENhcGFiaWxpdHkgIT0gZUNTUl9CQU5EXzI0KSB7CisJCQl0ZGxzU2V0dXBSc3AuaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZS5wcmVzZW50ID0gMTsKKwkJCXRkbHNTZXR1cFJzcC5odDIwNDBfYnNzX2NvZXhpc3RlbmNlLmluZm9fcmVxdWVzdCA9IDE7CisJCX0KKwl9IGVsc2UgeworCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQlGTCgiVERMUyBvZmZjaGFuIG5vdCBlbmFibGVkLCBvciBjaGFubmVsIHN3aXRjaCBwcm9oaWJpdGVkIGJ5IEFQLCBnTGltVERMU09mZkNoYW5uZWxFbmFibGVkICglZCksIHRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQgKCVkKSIpLAorCQkJcE1hYy0+bGltLmdMaW1URExTT2ZmQ2hhbm5lbEVuYWJsZWQsCisJCQlwc2Vzc2lvbkVudHJ5LT50ZGxzX2NoYW5fc3dpdF9wcm9oaWJpdGVkKTsKKwl9CisJdGRsc1NldHVwUnNwLlN0YXR1cy5zdGF0dXMgPSBzZXR1cFN0YXR1czsKKwkvKgorCSAqIG5vdyB3ZSBwYWNrIGl0LiAgRmlyc3QsIGhvdyBtdWNoIHNwYWNlIGFyZSB3ZSBnb2luZyB0byBuZWVkPworCSAqLworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX3RkbHNfc2V0dXBfcnNwX3NpemUocE1hYywgJnRkbHNTZXR1cFJzcCwKKwkJCQkJCSAgICAgICAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoCisJCQkgICAiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZm9yIGEgU2V0dXAgUmVzcG9uc2UgKDB4JTA4eCkuIgorCQkJICApLAorCQkJc3RhdHVzKTsKKwkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQluUGF5bG9hZCA9IHNpemVvZih0RG90MTFmUHJvYmVSZXF1ZXN0KTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgKKwkJCSAgICJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIHRoZSBwYWNrZWQgc2l6ZSBmb3IgU2V0dXAgUmVzcG9uc2UgKDB4JTA4eCkuIgorCQkJICApLAorCQkJc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIFRoaXMgZnJhbWUgaXMgZ29pbmcgb3V0IGZyb20gUEUgYXMgZGF0YSBmcmFtZXMgd2l0aCBzcGVjaWFsIGV0aGVydHlwZQorCSAqIDg5LTBkLgorCSAqIDggYnl0ZXMgb2YgUkZDIDEwNDIgaGVhZGVyCisJICovCisKKwluQnl0ZXMgPSBuUGF5bG9hZCArICgoSVNfUU9TX0VOQUJMRUQocHNlc3Npb25FbnRyeSkpCisJCQkgICAgID8gc2l6ZW9mKHRTaXJNYWNEYXRhSGRyM2EpIDoKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSkKKwkJICsgc2l6ZW9mKGV0aF84OTBkX2hlYWRlcikKKwkJICsgUEFZTE9BRF9UWVBFX1RETFNfU0laRSArIGFkZEllTGVuOworCisJLyogT2stLSB0cnkgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20gTUdNVCBQS1QgcG9vbCAqLworCWNkZl9zdGF0dXMgPSBjZHNfcGFja2V0X2FsbG9jKCh1aW50MTZfdCkgbkJ5dGVzLCAodm9pZCAqKikmcEZyYW1lLAorCQkJCSAgICAgICh2b2lkICoqKSZwUGFja2V0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgKKwkJCSAgICJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgVERMUyBTZXR1cCBSZXNwb25zZS4iCisJCQkgICksCisJCQluQnl0ZXMpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCS8qIHplcm8gb3V0IHRoZSBtZW1vcnkgKi8KKwljZGZfbWVtX3NldChwRnJhbWUsIG5CeXRlcywgMCk7CisKKwkvKgorCSAqIElFIGZvcm1hdGlvbiwgbWVtb3J5IGFsbG9jYXRpb24gaXMgY29tcGxldGVkLCBOb3cgZm9ybSBURExTIGRpc2NvdmVyeQorCSAqIHJlcXVlc3QgZnJhbWUKKwkgKi8KKworCS8qIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvciAqLworCisJaGVhZGVyX29mZnNldCA9IGxpbV9wcmVwYXJlX3RkbHNfZnJhbWVfaGVhZGVyKHBNYWMsIHBGcmFtZSwKKwkJCQkJCSAgICAgIExJTktfSURFTl9BRERSX09GRlNFVAorCQkJCQkJCSAgICAgICh0ZGxzU2V0dXBSc3ApLCBURExTX0xJTktfQVAsCisJCQkJCQkgICAgICBURExTX1JFU1BPTkRFUiwgVElEX0FDX0JLLAorCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsCisJCUZMKAorCQkgICAiU3VwcG9ydGVkQ2hubFdpZHRoICV4IHJ4TUNTTWFwICV4IHJ4TUNTTWFwICV4IHR4U3VwRGF0YVJhdGUgJXgiCisJCSAgKSwKKwkJdGRsc1NldHVwUnNwLlZIVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0LAorCQl0ZGxzU2V0dXBSc3AuVkhUQ2Fwcy5yeE1DU01hcCwKKwkJdGRsc1NldHVwUnNwLlZIVENhcHMudHhNQ1NNYXAsCisJCXRkbHNTZXR1cFJzcC5WSFRDYXBzLnR4U3VwRGF0YVJhdGUpOworCXN0YXR1cyA9IGRvdDExZl9wYWNrX3RkbHNfc2V0dXBfcnNwKHBNYWMsICZ0ZGxzU2V0dXBSc3AsCisJCQkJCSAgICBwRnJhbWUgKyBoZWFkZXJfb2Zmc2V0LAorCQkJCQkgICAgblBheWxvYWQsICZuUGF5bG9hZCk7CisKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gcGFjayBhIFRETFMgU2V0dXAgUmVzcG9uc2UgKDB4JTA4eCkuIiksCisJCQlzdGF0dXMpOworCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKilwUGFja2V0KTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgKKwkJCSAgICJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgVERMUyBTZXR1cCBSZXNwb25zZSAoMHglMDh4KS4iCisJCQkgICksCisJCQlzdGF0dXMpOworCX0KKwkvKiBDb3B5IHRoZSBhZGRpdGlvbmFsIElFLiAqLworCS8qIFRPRE8gOiBhZGRJZSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmcmFtZS4gVGhpcyBtZWFucyBpdCBkb2VzbnQgKi8KKwkvKiBmb2xsb3cgdGhlIG9yZGVyLiBUaGlzIHNob3VsZCBiZSBvaywgYnV0IHdlIHNob3VsZCBjb25zaWRlciBjaGFuZ2luZyB0aGlzICovCisJLyogaWYgdGhlcmUgaXMgYW55IElPVCBpc3N1ZS4gKi8KKwlpZiAoYWRkSWVMZW4gIT0gMCkgeworCQljZGZfbWVtX2NvcHkocEZyYW1lICsgaGVhZGVyX29mZnNldCArIG5QYXlsb2FkLCBhZGRJZSwKKwkJCSAgICAgYWRkSWVMZW4pOworCX0KKworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIltURExTXSBhY3Rpb24gJWQgKCVzKSAtQVAtPiBPVEEgcGVlcj0iTUFDX0FERFJFU1NfU1RSKSwKKwkJU0lSX01BQ19URExTX1NFVFVQX1JTUCwKKwkJbGltX3RyYWNlX3RkbHNfYWN0aW9uX3N0cmluZyhTSVJfTUFDX1RETFNfU0VUVVBfUlNQKSwKKwkJTUFDX0FERFJfQVJSQVkocGVlck1hYykpOworCisJcE1hYy0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisJY2RmX3N0YXR1cyA9IHdtYV90eF9mcmFtZVdpdGhUeENvbXBsZXRlKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCQkgICAgICBUWFJYX0ZSTV84MDJfMTFfREFUQSwKKwkJCQkJICAgICAgQU5JX1RYRElSX1RPRFMsCisJCQkJCSAgICAgIFRJRF9BQ19CSywKKwkJCQkJICAgICAgbGltX3R4X2NvbXBsZXRlLCBwRnJhbWUsCisJCQkJCSAgICAgIGxpbV9tZ210X3R4X2NvbXBsZXRlLAorCQkJCQkgICAgICBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FLAorCQkJCQkgICAgICBzbWVTZXNzaW9uSWQsIGZhbHNlLCAwKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCXBNYWMtPmxpbS5tZ210RnJhbWVTZXNzaW9uSWQgPSAweGZmOworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiY291bGQgbm90IHNlbmQgVERMUyBEaXMgUmVxdWVzdCBmcmFtZSEiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfQorCisvKgorICogU2VuZCBURExTIHNldHVwIENORiBmcmFtZSBvbiBBUCBsaW5rCisgKi8KKwordFNpclJldFN0YXR1cyBsaW1fc2VuZF90ZGxzX2xpbmtfc2V0dXBfY25mX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgdFNpck1hY0FkZHIgcGVlck1hYywKKwkJCQkJCSB1aW50OF90IGRpYWxvZywKKwkJCQkJCSB1aW50MzJfdCBwZWVyQ2FwYWJpbGl0eSwKKwkJCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJCQkJIHVpbnQ4X3QgKmFkZEllLCB1aW50MTZfdCBhZGRJZUxlbikKK3sKKwl0RG90MTFmVERMU1NldHVwQ25mIHRkbHNTZXR1cENuZjsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXVpbnQzMl90IG5QYXlsb2FkID0gMDsKKwl1aW50MzJfdCBuQnl0ZXMgPSAwOworCXVpbnQzMl90IGhlYWRlcl9vZmZzZXQgPSAwOworCXVpbnQ4X3QgKnBGcmFtZTsKKwl2b2lkICpwUGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKyNpZm5kZWYgTk9fUEFEX1RETFNfTUlOXzgwMjNfU0laRQorCXVpbnQzMl90IHBhZExlbiA9IDA7CisjZW5kaWYKKwl1aW50OF90IHNtZVNlc3Npb25JZCA9IDA7CisKKwkvKgorCSAqIFRoZSBzY2hlbWUgaGVyZSBpcyB0byBmaWxsIG91dCBhICd0RG90MTFmUHJvYmVSZXF1ZXN0JyBzdHJ1Y3R1cmUKKwkgKiBhbmQgdGhlbiBoYW5kIGl0IG9mZiB0byAnZG90MTFmX3BhY2tfcHJvYmVfcmVxdWVzdCcgKGZvcgorCSAqIHNlcmlhbGl6YXRpb24pLiAgV2Ugc3RhcnQgYnkgemVyby1pbml0aWFsaXppbmcgdGhlIHN0cnVjdHVyZToKKwkgKi8KKwlzbWVTZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmdGRsc1NldHVwQ25mLCBzaXplb2YodERvdDExZlRETFNTZXR1cENuZiksIDApOworCisJLyoKKwkgKiBzZXR1cCBGaXhlZCBmaWVsZHMsCisJICovCisJdGRsc1NldHVwQ25mLkNhdGVnb3J5LmNhdGVnb3J5ID0gU0lSX01BQ19BQ1RJT05fVERMUzsKKwl0ZGxzU2V0dXBDbmYuQWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfVERMU19TRVRVUF9DTkY7CisJdGRsc1NldHVwQ25mLkRpYWxvZ1Rva2VuLnRva2VuID0gZGlhbG9nOworCisJcG9wdWxhdGVfZG90MTFmX2xpbmtfaWRlbihwTWFjLCBwc2Vzc2lvbkVudHJ5LAorCQkJCSAgJnRkbHNTZXR1cENuZi5MaW5rSWRlbnRpZmllciwgcGVlck1hYywKKwkJCQkgIFRETFNfSU5JVElBVE9SKTsKKwkvKgorCSAqIFRPRE86IHdlIG5lZWQgdG8gc2VlIGlmIHdlIGhhdmUgdG8gc3VwcG9ydCBjb25kaXRpb25zIHdoZXJlIHdlIGhhdmUKKwkgKiBFRENBIHBhcmFtZXRlciBpbmZvIGVsZW1lbnQgaXMgbmVlZGVkIGEpIGlmIHdlIG5lZWQgZGlmZmVyZW50IFFPUworCSAqIHBhcmFtZXRlcnMgZm9yIG9mZiBjaGFubmVsIG9wZXJhdGlvbnMgb3IgUU9TIGlzIG5vdCBzdXBwb3J0ZWQgb24KKwkgKiBBUCBsaW5rIGFuZCB3ZSB3YW50ZWQgdG8gUU9TIG9uIGRpcmVjdCBsaW5rLgorCSAqLworCisJLyogQ2hlY2sgc2VsZiBhbmQgcGVlciBXTU0gY2FwYWJsZSAqLworCWlmICgoMSA9PSBwTWFjLT5saW0uZ0xpbVRETFNXbW1Nb2RlKSAmJgorCSAgICAoQ0hFQ0tfQklUKHBlZXJDYXBhYmlsaXR5LCBURExTX1BFRVJfV01NX0NBUCkpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoInBvcHVsYXRlIFdNTSBwcmFyYW0gaW4gU2V0dXAgQ29uZmlybSIpKTsKKwkJcG9wdWxhdGVfZG90MTFmX3dtbV9wYXJhbXMocE1hYywgJnRkbHNTZXR1cENuZi5XTU1QYXJhbXMsCisJCQkJCSAgIHBzZXNzaW9uRW50cnkpOworCX0KKworCS8qIENoZWNrIHBlZXIgaXMgVkhUIGNhcGFibGUgKi8KKwlpZiAoQ0hFQ0tfQklUKHBlZXJDYXBhYmlsaXR5LCBURExTX1BFRVJfVkhUX0NBUCkpIHsKKwkJcG9wdWxhdGVfZG90MTFmX3ZodF9vcGVyYXRpb24ocE1hYywKKwkJCQkJICAgICAgcHNlc3Npb25FbnRyeSwKKwkJCQkJICAgICAgJnRkbHNTZXR1cENuZi5WSFRPcGVyYXRpb24pOworCQlwb3B1bGF0ZV9kb3QxMWZfaHRfaW5mbyhwTWFjLCAmdGRsc1NldHVwQ25mLkhUSW5mbywgcHNlc3Npb25FbnRyeSk7CisJfSBlbHNlIGlmIChDSEVDS19CSVQocGVlckNhcGFiaWxpdHksIFRETFNfUEVFUl9IVF9DQVApKSB7ICAgICAgIC8qIENoZWNrIHBlZXIgaXMgSFQgY2FwYWJsZSAqLworCQlwb3B1bGF0ZV9kb3QxMWZfaHRfaW5mbyhwTWFjLCAmdGRsc1NldHVwQ25mLkhUSW5mbywgcHNlc3Npb25FbnRyeSk7CisJfQorCisJLyoKKwkgKiBub3cgd2UgcGFjayBpdC4gIEZpcnN0LCBob3cgbXVjaCBzcGFjZSBhcmUgd2UgZ29pbmcgdG8gbmVlZD8KKwkgKi8KKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF90ZGxzX3NldHVwX2NuZl9zaXplKHBNYWMsICZ0ZGxzU2V0dXBDbmYsCisJCQkJCQkgICAgICAgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKAorCQkJICAgIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGZvciBhIFNldHVwIENvbmZpcm0gKDB4JTA4eCkuIgorCQkJICApLAorCQkJc3RhdHVzKTsKKwkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQluUGF5bG9hZCA9IHNpemVvZih0RG90MTFmUHJvYmVSZXF1ZXN0KTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgKKwkJCSAgICJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIHRoZSBwYWNrZWQgc2l6ZSBmb3IgU2V0dXAgQ29uZmlybSAoMHglMDh4KS4iCisJCQkgICksCisJCQlzdGF0dXMpOworCX0KKworCS8qCisJICogVGhpcyBmcmFtZSBpcyBnb2luZyBvdXQgZnJvbSBQRSBhcyBkYXRhIGZyYW1lcyB3aXRoIHNwZWNpYWwgZXRoZXJ0eXBlCisJICogODktMGQuCisJICogOCBieXRlcyBvZiBSRkMgMTA0MiBoZWFkZXIKKwkgKi8KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgKChJU19RT1NfRU5BQkxFRChwc2Vzc2lvbkVudHJ5KSkKKwkJCSAgICAgPyBzaXplb2YodFNpck1hY0RhdGFIZHIzYSkgOgorCQkJICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpKQorCQkgKyBzaXplb2YoZXRoXzg5MGRfaGVhZGVyKQorCQkgKyBQQVlMT0FEX1RZUEVfVERMU19TSVpFICsgYWRkSWVMZW47CisKKyNpZm5kZWYgTk9fUEFEX1RETFNfTUlOXzgwMjNfU0laRQorCS8qIElPVCBpc3N1ZSB3aXRoIHNvbWUgQVAgOiBzb21lIEFQIGRvZXNuJ3QgbGlrZSB0aGUgZGF0YSBwYWNrZXQgc2l6ZSA8IG1pbmltdW0gODAyLjMgZnJhbWUgbGVuZ3RoICg2NCkKKwkgICBIZW5jZSBBUCBpdHNlbGYgcGFkZGluZyBzb21lIGJ5dGVzLCB3aGljaCBjYXVzZWQgdGVhcmRvd24gcGFja2V0IGlzIGRyb3BwZWQgYXQKKwkgICByZWNlaXZlciBzaWRlLiBUbyBhdm9pZCBzdWNoIElPVCBpc3N1ZSwgd2UgYWRkZWQgc29tZSBleHRyYSBieXRlcyB0byBtZWV0IGRhdGEgZnJhbWUgc2l6ZSA+PSA2NAorCSAqLworCWlmIChuUGF5bG9hZCArIFBBWUxPQURfVFlQRV9URExTX1NJWkUgPCBNSU5fSUVFRV84MDIzX1NJWkUpIHsKKwkJcGFkTGVuID0KKwkJCU1JTl9JRUVFXzgwMjNfU0laRSAtIChuUGF5bG9hZCArIFBBWUxPQURfVFlQRV9URExTX1NJWkUpOworCisJCS8qIGlmIHBhZExlbiBpcyBsZXNzIHRoYW4gbWluaW11bSB2ZW5kb3JTcGVjaWZpYyAoNSksIHBhZCB1cCB0byA1ICovCisJCWlmIChwYWRMZW4gPCBNSU5fVkVORE9SX1NQRUNJRklDX0lFX1NJWkUpCisJCQlwYWRMZW4gPSBNSU5fVkVORE9SX1NQRUNJRklDX0lFX1NJWkU7CisKKwkJbkJ5dGVzICs9IHBhZExlbjsKKwl9CisjZW5kaWYKKworCS8qIE9rLS0gdHJ5IHRvIGFsbG9jYXRlIG1lbW9yeSBmcm9tIE1HTVQgUEtUIHBvb2wgKi8KKwljZGZfc3RhdHVzID0gY2RzX3BhY2tldF9hbGxvYygodWludDE2X3QpIG5CeXRlcywgKHZvaWQgKiopJnBGcmFtZSwKKwkJCQkgICAgICAodm9pZCAqKikmcFBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoCisJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhIFRETFMgU2V0dXAgQ29uZmlybS4iCisJCQkgICksCisJCQluQnl0ZXMpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCS8qIHplcm8gb3V0IHRoZSBtZW1vcnkgKi8KKwljZGZfbWVtX3NldChwRnJhbWUsIG5CeXRlcywgMCk7CisKKwkvKgorCSAqIElFIGZvcm1hdGlvbiwgbWVtb3J5IGFsbG9jYXRpb24gaXMgY29tcGxldGVkLCBOb3cgZm9ybSBURExTIGRpc2NvdmVyeQorCSAqIHJlcXVlc3QgZnJhbWUKKwkgKi8KKworCS8qIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvciAqLworCisJaGVhZGVyX29mZnNldCA9IGxpbV9wcmVwYXJlX3RkbHNfZnJhbWVfaGVhZGVyKHBNYWMsIHBGcmFtZSwKKwkJCQkJCSAgICAgIExJTktfSURFTl9BRERSX09GRlNFVAorCQkJCQkJCSAgICAgICh0ZGxzU2V0dXBDbmYpLCBURExTX0xJTktfQVAsCisJCQkJCQkgICAgICBURExTX0lOSVRJQVRPUiwgVElEX0FDX1ZJLAorCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisKKwlzdGF0dXMgPSBkb3QxMWZfcGFja190ZGxzX3NldHVwX2NuZihwTWFjLCAmdGRsc1NldHVwQ25mLCBwRnJhbWUKKwkJCQkJICAgICsgaGVhZGVyX29mZnNldCwgblBheWxvYWQsICZuUGF5bG9hZCk7CisKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gcGFjayBhIFRETFMgZGlzY292ZXJ5IHJlcSAoMHglMDh4KS4iKSwKKwkJCXN0YXR1cyk7CisJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXBQYWNrZXQpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMKAorCQkJICAgIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBURExTIERpc2NvdmVyeSBSZXF1ZXN0ICgweCUwOHgpLiIKKwkJCSAgKSwKKwkJCXN0YXR1cyk7CisJfQorCS8qIENvcHkgdGhlIGFkZGl0aW9uYWwgSUUuICovCisJLyogVE9ETyA6IGFkZEllIGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lLiBUaGlzIG1lYW5zIGl0IGRvZXNudCAqLworCS8qIGZvbGxvdyB0aGUgb3JkZXIuIFRoaXMgc2hvdWxkIGJlIG9rLCBidXQgd2Ugc2hvdWxkIGNvbnNpZGVyIGNoYW5naW5nIHRoaXMgKi8KKwkvKiBpZiB0aGVyZSBpcyBhbnkgSU9UIGlzc3VlLiAqLworCWlmIChhZGRJZUxlbiAhPSAwKSB7CisJCWNkZl9tZW1fY29weShwRnJhbWUgKyBoZWFkZXJfb2Zmc2V0ICsgblBheWxvYWQsIGFkZEllLAorCQkJICAgICBhZGRJZUxlbik7CisJfQorI2lmbmRlZiBOT19QQURfVERMU19NSU5fODAyM19TSVpFCisJaWYgKHBhZExlbiAhPSAwKSB7CisJCS8qIFFDT00gVkVORE9SIE9VSSA9IHsgMHgwMCwgMHhBMCwgMHhDNiwgdHlwZSA9IDB4MDAwMCB9OyAqLworCQl1aW50OF90ICpwYWRWZW5kb3JTcGVjaWZpYyA9CisJCQlwRnJhbWUgKyBoZWFkZXJfb2Zmc2V0ICsgblBheWxvYWQgKyBhZGRJZUxlbjsKKwkJLyogbWFrZSBRQ09NX1ZFTkRPUl9PVUksIGFuZCB0eXBlID0gMHgwMDAwLCBhbmQgYWxsIHRoZSBwYXlsb2FkIHRvIGJlIHplcm8gKi8KKwkJcGFkVmVuZG9yU3BlY2lmaWNbMF0gPSAyMjE7CisJCXBhZFZlbmRvclNwZWNpZmljWzFdID0gcGFkTGVuIC0gMjsKKwkJcGFkVmVuZG9yU3BlY2lmaWNbMl0gPSAweDAwOworCQlwYWRWZW5kb3JTcGVjaWZpY1szXSA9IDB4QTA7CisJCXBhZFZlbmRvclNwZWNpZmljWzRdID0gMHhDNjsKKworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJQYWRkaW5nIFZlbmRvciBTcGVjaWZpYyBJZSBMZW4gPSAlZCIpLAorCQkJcGFkTGVuKTsKKworCQkvKiBwYWRkaW5nIHplcm8gaWYgbW9yZSB0aGFuIDUgYnl0ZXMgYXJlIHJlcXVpcmVkICovCisJCWlmIChwYWRMZW4gPiBNSU5fVkVORE9SX1NQRUNJRklDX0lFX1NJWkUpCisJCQljZGZfbWVtX3NldChwRnJhbWUgKyBoZWFkZXJfb2Zmc2V0ICsgblBheWxvYWQgKworCQkJCSAgICBhZGRJZUxlbiArIE1JTl9WRU5ET1JfU1BFQ0lGSUNfSUVfU0laRSwKKwkJCQkgICAgcGFkTGVuIC0gTUlOX1ZFTkRPUl9TUEVDSUZJQ19JRV9TSVpFLCAwKTsKKwl9CisjZW5kaWYKKworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIltURExTXSBhY3Rpb24gJWQgKCVzKSAtQVAtPiBPVEEgcGVlcj0iTUFDX0FERFJFU1NfU1RSKSwKKwkJU0lSX01BQ19URExTX1NFVFVQX0NORiwKKwkJbGltX3RyYWNlX3RkbHNfYWN0aW9uX3N0cmluZyhTSVJfTUFDX1RETFNfU0VUVVBfQ05GKSwKKwkgICAgICAgTUFDX0FERFJfQVJSQVkocGVlck1hYykpOworCisJcE1hYy0+bGltLm1nbXRGcmFtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisJY2RmX3N0YXR1cyA9IHdtYV90eF9mcmFtZVdpdGhUeENvbXBsZXRlKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCQkgICAgICBUWFJYX0ZSTV84MDJfMTFfREFUQSwKKwkJCQkJICAgICAgQU5JX1RYRElSX1RPRFMsCisJCQkJCSAgICAgIFRJRF9BQ19WSSwKKwkJCQkJICAgICAgbGltX3R4X2NvbXBsZXRlLCBwRnJhbWUsCisJCQkJCSAgICAgIGxpbV9tZ210X3R4X2NvbXBsZXRlLAorCQkJCQkgICAgICBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FLAorCQkJCQkgICAgICBzbWVTZXNzaW9uSWQsIGZhbHNlLCAwKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCXBNYWMtPmxpbS5tZ210RnJhbWVTZXNzaW9uSWQgPSAweGZmOworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiY291bGQgbm90IHNlbmQgVERMUyBTZXR1cCBDb25maXJtIGZyYW1lIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyogVGhpcyBGdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHBvcHVsYXRlX2RvdDExZl9odF9jYXBzLCBleGNlcHQgdGhhdCB0aGUgSFQgQ2FwYWJpbGl0aWVzCisgKiBhcmUgY29uc2lkZXJlZCBmcm9tIHRoZSBBZGRTdGFSZXEgcmF0aGVyIGZyb20gdGhlIGNmZy5kYXQgYXMgaW4gcG9wdWxhdGVfZG90MTFmX2h0X2NhcHMKKyAqLworc3RhdGljIHRTaXJSZXRTdGF0dXMgbGltX3RkbHNfcG9wdWxhdGVfZG90MTFmX2h0X2NhcHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkJCQkgICAgICB0U2lyVGRsc0FkZFN0YVJlcSAqCisJCQkJCQkgICAgICBwVGRsc0FkZFN0YVJlcSwKKwkJCQkJCSAgICAgIHREb3QxMWZJRUhUQ2FwcyAqcERvdDExZikKK3sKKwl1aW50MzJfdCBuQ2ZnVmFsdWU7CisJdWludDhfdCBuQ2ZnVmFsdWU4OworCXRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvICpwSFRQYXJhbWV0ZXJzSW5mbzsKKwl1bmlvbiB7CisJCXVpbnQxNl90IG5DZmdWYWx1ZTE2OworCQl0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyBodENhcEluZm87CisJCXRTaXJNYWNFeHRlbmRlZEhUQ2FwYWJpbGl0eUluZm8gZXh0SHRDYXBJbmZvOworCX0gdUhUQ2FwYWJpbGl0eUluZm87CisKKwl0U2lyTWFjVHhCRkNhcGFiaWxpdHlJbmZvICpwVHhCRkNhcGFiaWxpdHlJbmZvOworCXRTaXJNYWNBU0NhcGFiaWxpdHlJbmZvICpwQVNDYXBhYmlsaXR5SW5mbzsKKworCW5DZmdWYWx1ZSA9IHBUZGxzQWRkU3RhUmVxLT5odENhcC5jYXBJbmZvOworCisJdUhUQ2FwYWJpbGl0eUluZm8ubkNmZ1ZhbHVlMTYgPSBuQ2ZnVmFsdWUgJiAweEZGRkY7CisKKwlwRG90MTFmLT5hZHZDb2RpbmdDYXAgPSB1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8uYWR2Q29kaW5nQ2FwOworCXBEb3QxMWYtPm1pbW9Qb3dlclNhdmUgPSB1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8ubWltb1Bvd2VyU2F2ZTsKKwlwRG90MTFmLT5ncmVlbkZpZWxkID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLmdyZWVuRmllbGQ7CisJcERvdDExZi0+c2hvcnRHSTIwTUh6ID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnNob3J0R0kyME1IejsKKwlwRG90MTFmLT5zaG9ydEdJNDBNSHogPSB1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8uc2hvcnRHSTQwTUh6OworCXBEb3QxMWYtPnR4U1RCQyA9IHVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby50eFNUQkM7CisJcERvdDExZi0+cnhTVEJDID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnJ4U1RCQzsKKwlwRG90MTFmLT5kZWxheWVkQkEgPSB1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8uZGVsYXllZEJBOworCXBEb3QxMWYtPm1heGltYWxBTVNEVXNpemUgPQorCQl1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8ubWF4aW1hbEFNU0RVc2l6ZTsKKwlwRG90MTFmLT5kc3NzQ2NrTW9kZTQwTUh6ID0KKwkJdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLmRzc3NDY2tNb2RlNDBNSHo7CisJcERvdDExZi0+cHNtcCA9IHVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby5wc21wOworCXBEb3QxMWYtPnN0YmNDb250cm9sRnJhbWUgPQorCQl1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8uc3RiY0NvbnRyb2xGcmFtZTsKKwlwRG90MTFmLT5sc2lnVFhPUFByb3RlY3Rpb24gPQorCQl1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8ubHNpZ1RYT1BQcm90ZWN0aW9uOworCisJLyoKKwkgKiBBbGwgc2Vzc2lvbml6ZWQgZW50cmllcyB3aWxsIG5lZWQgdGhlIGNoZWNrIGJlbG93CisJICogT25seSBpbiBjYXNlIG9mIE5PIHNlc3Npb24KKwkgKi8KKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCXBEb3QxMWYtPnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQl1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8uc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworCX0gZWxzZSB7CisJCXBEb3QxMWYtPnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQlwc2Vzc2lvbkVudHJ5LT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKwl9CisKKwkvKiBFbnN1cmUgdGhhdCBzaG9ydEdJNDBNSHogaXMgRGlzYWJsZWQgaWYgc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0IGlzCisJICAgZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFogKi8KKwlpZiAocERvdDExZi0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID09IGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaKSB7CisJCXBEb3QxMWYtPnNob3J0R0k0ME1IeiA9IDA7CisJfQorCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgKKwkJICAgIlN1cHBvcnRlZENobmxXaWR0aDogJWQsIG1pbW9QUzogJWQsIEdGOiAlZCwgc2hvcnRHSTIwOiVkLCBzaG9ydEdJNDA6ICVkLCBkc3NzQ2NrOiAlZCIKKwkJICApLAorCQlwRG90MTFmLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQsCisJCXBEb3QxMWYtPm1pbW9Qb3dlclNhdmUsCisJCXBEb3QxMWYtPmdyZWVuRmllbGQsCisJCXBEb3QxMWYtPnNob3J0R0kyME1IeiwKKwkJcERvdDExZi0+c2hvcnRHSTQwTUh6LAorCQlwRG90MTFmLT5kc3NzQ2NrTW9kZTQwTUh6KTsKKworCW5DZmdWYWx1ZSA9IHBUZGxzQWRkU3RhUmVxLT5odENhcC5hbXBkdVBhcmFtc0luZm87CisKKwluQ2ZnVmFsdWU4ID0gKHVpbnQ4X3QpIG5DZmdWYWx1ZTsKKwlwSFRQYXJhbWV0ZXJzSW5mbyA9ICh0U2lyTWFjSFRQYXJhbWV0ZXJzSW5mbyAqKSAmbkNmZ1ZhbHVlODsKKworCXBEb3QxMWYtPm1heFJ4QU1QRFVGYWN0b3IgPSBwSFRQYXJhbWV0ZXJzSW5mby0+bWF4UnhBTVBEVUZhY3RvcjsKKwlwRG90MTFmLT5tcGR1RGVuc2l0eSA9IHBIVFBhcmFtZXRlcnNJbmZvLT5tcGR1RGVuc2l0eTsKKwlwRG90MTFmLT5yZXNlcnZlZDEgPSBwSFRQYXJhbWV0ZXJzSW5mby0+cmVzZXJ2ZWQ7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJBTVBEVSBQYXJhbTogJXgiKSwgbkNmZ1ZhbHVlKTsKKworCWNkZl9tZW1fY29weShwRG90MTFmLT5zdXBwb3J0ZWRNQ1NTZXQsIHBUZGxzQWRkU3RhUmVxLT5odENhcC5zdXBwTWNzU2V0LAorCQkgICAgIFNJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVQpOworCisJbkNmZ1ZhbHVlID0gcFRkbHNBZGRTdGFSZXEtPmh0Q2FwLmV4dGVuZGVkSHRDYXBJbmZvOworCisJdUhUQ2FwYWJpbGl0eUluZm8ubkNmZ1ZhbHVlMTYgPSBuQ2ZnVmFsdWUgJiAweEZGRkY7CisKKwlwRG90MTFmLT5wY28gPSB1SFRDYXBhYmlsaXR5SW5mby5leHRIdENhcEluZm8ucGNvOworCXBEb3QxMWYtPnRyYW5zaXRpb25UaW1lID0gdUhUQ2FwYWJpbGl0eUluZm8uZXh0SHRDYXBJbmZvLnRyYW5zaXRpb25UaW1lOworCXBEb3QxMWYtPm1jc0ZlZWRiYWNrID0gdUhUQ2FwYWJpbGl0eUluZm8uZXh0SHRDYXBJbmZvLm1jc0ZlZWRiYWNrOworCisJbkNmZ1ZhbHVlID0gcFRkbHNBZGRTdGFSZXEtPmh0Q2FwLnR4QkZDYXBJbmZvOworCisJcFR4QkZDYXBhYmlsaXR5SW5mbyA9ICh0U2lyTWFjVHhCRkNhcGFiaWxpdHlJbmZvICopICZuQ2ZnVmFsdWU7CisJcERvdDExZi0+dHhCRiA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPnR4QkY7CisJcERvdDExZi0+cnhTdGFnZ2VyZWRTb3VuZGluZyA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPnJ4U3RhZ2dlcmVkU291bmRpbmc7CisJcERvdDExZi0+dHhTdGFnZ2VyZWRTb3VuZGluZyA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPnR4U3RhZ2dlcmVkU291bmRpbmc7CisJcERvdDExZi0+cnhaTEYgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT5yeFpMRjsKKwlwRG90MTFmLT50eFpMRiA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPnR4WkxGOworCXBEb3QxMWYtPmltcGxpY2l0VHhCRiA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPmltcGxpY2l0VHhCRjsKKwlwRG90MTFmLT5jYWxpYnJhdGlvbiA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPmNhbGlicmF0aW9uOworCXBEb3QxMWYtPmV4cGxpY2l0Q1NJVHhCRiA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPmV4cGxpY2l0Q1NJVHhCRjsKKwlwRG90MTFmLT5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4ID0KKwkJcFR4QkZDYXBhYmlsaXR5SW5mby0+ZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeDsKKwlwRG90MTFmLT5leHBsaWNpdEJGQ1NJRmVlZGJhY2sgPQorCQlwVHhCRkNhcGFiaWxpdHlJbmZvLT5leHBsaWNpdEJGQ1NJRmVlZGJhY2s7CisJcERvdDExZi0+ZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrID0KKwkJcFR4QkZDYXBhYmlsaXR5SW5mby0+ZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrOworCXBEb3QxMWYtPmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgPQorCQlwVHhCRkNhcGFiaWxpdHlJbmZvLT5leHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrOworCXBEb3QxMWYtPmNzaU51bUJGQW50ZW5uYWUgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT5jc2lOdW1CRkFudGVubmFlOworCXBEb3QxMWYtPnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSA9CisJCXBUeEJGQ2FwYWJpbGl0eUluZm8tPnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZTsKKwlwRG90MTFmLT5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlID0KKwkJcFR4QkZDYXBhYmlsaXR5SW5mby0+Y29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZTsKKworCW5DZmdWYWx1ZSA9IHBUZGxzQWRkU3RhUmVxLT5odENhcC5hbnRlbm5hU2VsZWN0aW9uSW5mbzsKKworCW5DZmdWYWx1ZTggPSAodWludDhfdCkgbkNmZ1ZhbHVlOworCisJcEFTQ2FwYWJpbGl0eUluZm8gPSAodFNpck1hY0FTQ2FwYWJpbGl0eUluZm8gKikgJm5DZmdWYWx1ZTg7CisJcERvdDExZi0+YW50ZW5uYVNlbGVjdGlvbiA9IHBBU0NhcGFiaWxpdHlJbmZvLT5hbnRlbm5hU2VsZWN0aW9uOworCXBEb3QxMWYtPmV4cGxpY2l0Q1NJRmVlZGJhY2tUeCA9CisJCXBBU0NhcGFiaWxpdHlJbmZvLT5leHBsaWNpdENTSUZlZWRiYWNrVHg7CisJcERvdDExZi0+YW50ZW5uYUluZGljZXNGZWVkYmFja1R4ID0KKwkJcEFTQ2FwYWJpbGl0eUluZm8tPmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeDsKKwlwRG90MTFmLT5leHBsaWNpdENTSUZlZWRiYWNrID0gcEFTQ2FwYWJpbGl0eUluZm8tPmV4cGxpY2l0Q1NJRmVlZGJhY2s7CisJcERvdDExZi0+YW50ZW5uYUluZGljZXNGZWVkYmFjayA9CisJCXBBU0NhcGFiaWxpdHlJbmZvLT5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrOworCXBEb3QxMWYtPnJ4QVMgPSBwQVNDYXBhYmlsaXR5SW5mby0+cnhBUzsKKwlwRG90MTFmLT50eFNvdW5kaW5nUFBEVXMgPSBwQVNDYXBhYmlsaXR5SW5mby0+dHhTb3VuZGluZ1BQRFVzOworCisJcERvdDExZi0+cHJlc2VudCA9IHBUZGxzQWRkU3RhUmVxLT5odGNhcF9wcmVzZW50OworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfQorCit0U2lyUmV0U3RhdHVzCitsaW1fdGRsc19wb3B1bGF0ZV9kb3QxMWZfdmh0X2NhcHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgIHRTaXJUZGxzQWRkU3RhUmVxICpwVGRsc0FkZFN0YVJlcSwKKwkJCQkgIHREb3QxMWZJRVZIVENhcHMgKnBEb3QxMWYpCit7CisJdWludDMyX3QgbkNmZ1ZhbHVlID0gMDsKKwl1bmlvbiB7CisJCXVpbnQzMl90IG5DZmdWYWx1ZTMyOworCQl0U2lyTWFjVkhUQ2FwYWJpbGl0eUluZm8gdmh0Q2FwSW5mbzsKKwl9IHVWSFRDYXBhYmlsaXR5SW5mbzsKKwl1bmlvbiB7CisJCXVpbnQxNl90IG5DZmdWYWx1ZTE2OworCQl0U2lyTWFjVkhUVHhTdXBEYXRhUmF0ZUluZm8gdmh0VHhTdXBEYXRhUmF0ZUluZm87CisJCXRTaXJNYWNWSFRSeFN1cERhdGFSYXRlSW5mbyB2aHRSeHN1cERhdGFSYXRlSW5mbzsKKwl9IHVWSFRTdXBEYXRhUmF0ZUluZm87CisKKwlwRG90MTFmLT5wcmVzZW50ID0gcFRkbHNBZGRTdGFSZXEtPnZodGNhcF9wcmVzZW50OworCisJbkNmZ1ZhbHVlID0gcFRkbHNBZGRTdGFSZXEtPnZodENhcC52aHRDYXBJbmZvOworCXVWSFRDYXBhYmlsaXR5SW5mby5uQ2ZnVmFsdWUzMiA9IG5DZmdWYWx1ZTsKKworCXBEb3QxMWYtPm1heE1QRFVMZW4gPSB1VkhUQ2FwYWJpbGl0eUluZm8udmh0Q2FwSW5mby5tYXhNUERVTGVuOworCXBEb3QxMWYtPnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCXVWSFRDYXBhYmlsaXR5SW5mby52aHRDYXBJbmZvLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKwlwRG90MTFmLT5sZHBjQ29kaW5nQ2FwID0gdVZIVENhcGFiaWxpdHlJbmZvLnZodENhcEluZm8ubGRwY0NvZGluZ0NhcDsKKwlwRG90MTFmLT5zaG9ydEdJODBNSHogPSB1VkhUQ2FwYWJpbGl0eUluZm8udmh0Q2FwSW5mby5zaG9ydEdJODBNSHo7CisJcERvdDExZi0+c2hvcnRHSTE2MGFuZDgwcGx1czgwTUh6ID0KKwkJdVZIVENhcGFiaWxpdHlJbmZvLnZodENhcEluZm8uc2hvcnRHSTE2MGFuZDgwcGx1czgwTUh6OworCXBEb3QxMWYtPnR4U1RCQyA9IHVWSFRDYXBhYmlsaXR5SW5mby52aHRDYXBJbmZvLnR4U1RCQzsKKwlwRG90MTFmLT5yeFNUQkMgPSB1VkhUQ2FwYWJpbGl0eUluZm8udmh0Q2FwSW5mby5yeFNUQkM7CisJcERvdDExZi0+c3VCZWFtRm9ybWVyQ2FwID0gMDsKKwlwRG90MTFmLT5zdUJlYW1mb3JtZWVDYXAgPSAwOworCXBEb3QxMWYtPmNzbm9mQmVhbWZvcm1lckFudFN1cCA9CisJCXVWSFRDYXBhYmlsaXR5SW5mby52aHRDYXBJbmZvLmNzbm9mQmVhbWZvcm1lckFudFN1cDsKKwlwRG90MTFmLT5udW1Tb3VuZGluZ0RpbSA9IHVWSFRDYXBhYmlsaXR5SW5mby52aHRDYXBJbmZvLm51bVNvdW5kaW5nRGltOworCXBEb3QxMWYtPm11QmVhbWZvcm1lckNhcCA9IDA7CisJcERvdDExZi0+bXVCZWFtZm9ybWVlQ2FwID0gMDsKKwlwRG90MTFmLT52aHRUWE9QUFMgPSB1VkhUQ2FwYWJpbGl0eUluZm8udmh0Q2FwSW5mby52aHRUWE9QUFM7CisJcERvdDExZi0+aHRjVkhUQ2FwID0gdVZIVENhcGFiaWxpdHlJbmZvLnZodENhcEluZm8uaHRjVkhUQ2FwOworCXBEb3QxMWYtPm1heEFNUERVTGVuRXhwID0gdVZIVENhcGFiaWxpdHlJbmZvLnZodENhcEluZm8ubWF4QU1QRFVMZW5FeHA7CisJcERvdDExZi0+dmh0TGlua0FkYXB0Q2FwID0KKwkJdVZIVENhcGFiaWxpdHlJbmZvLnZodENhcEluZm8udmh0TGlua0FkYXB0Q2FwOworCXBEb3QxMWYtPnJ4QW50UGF0dGVybiA9IHVWSFRDYXBhYmlsaXR5SW5mby52aHRDYXBJbmZvLnJ4QW50UGF0dGVybjsKKwlwRG90MTFmLT50eEFudFBhdHRlcm4gPSB1VkhUQ2FwYWJpbGl0eUluZm8udmh0Q2FwSW5mby50eEFudFBhdHRlcm47CisJcERvdDExZi0+cmVzZXJ2ZWQxID0gdVZIVENhcGFiaWxpdHlJbmZvLnZodENhcEluZm8ucmVzZXJ2ZWQxOworCisJcERvdDExZi0+cnhNQ1NNYXAgPSBwVGRsc0FkZFN0YVJlcS0+dmh0Q2FwLnN1cHBNY3MucnhNY3NNYXA7CisKKwluQ2ZnVmFsdWUgPSBwVGRsc0FkZFN0YVJlcS0+dmh0Q2FwLnN1cHBNY3MucnhIaWdoZXN0OworCXVWSFRTdXBEYXRhUmF0ZUluZm8ubkNmZ1ZhbHVlMTYgPSBuQ2ZnVmFsdWUgJiAweGZmZmY7CisJcERvdDExZi0+cnhIaWdoU3VwRGF0YVJhdGUgPQorCQl1VkhUU3VwRGF0YVJhdGVJbmZvLnZodFJ4c3VwRGF0YVJhdGVJbmZvLnJ4U3VwRGF0YVJhdGU7CisKKwlwRG90MTFmLT50eE1DU01hcCA9IHBUZGxzQWRkU3RhUmVxLT52aHRDYXAuc3VwcE1jcy50eE1jc01hcDsKKworCW5DZmdWYWx1ZSA9IHBUZGxzQWRkU3RhUmVxLT52aHRDYXAuc3VwcE1jcy50eEhpZ2hlc3Q7CisJdVZIVFN1cERhdGFSYXRlSW5mby5uQ2ZnVmFsdWUxNiA9IG5DZmdWYWx1ZSAmIDB4ZmZmZjsKKwlwRG90MTFmLT50eFN1cERhdGFSYXRlID0KKwkJdVZIVFN1cERhdGFSYXRlSW5mby52aHRUeFN1cERhdGFSYXRlSW5mby50eFN1cERhdGFSYXRlOworCisJcERvdDExZi0+cmVzZXJ2ZWQzID0gdVZIVFN1cERhdGFSYXRlSW5mby52aHRUeFN1cERhdGFSYXRlSW5mby5yZXNlcnZlZDsKKworCWxpbV9sb2dfdmh0X2NhcChwTWFjLCBwRG90MTFmKTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30KKworLyoqCisgKiBsaW1fdGRsc19wb3B1bGF0ZV9tYXRjaGluZ19yYXRlX3NldCgpIC0gcG9wdWxhdGUgbWF0Y2hpbmcgcmF0ZSBzZXQKKyAqCisgKiBAbWFjX2N0eCAgLSBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBzdGFkcyAtIHN0YXRpb24gaGFzaCBlbnRyeQorICogQHN1cHBfcmF0ZV9zZXQgLSBwb2ludGVyIHRvIHN1cHBvcnRlZCByYXRlIHNldAorICogQHN1cHBfcmF0ZXNfbGVuIC0gbGVuZ3RoIG9mIHRoZSBzdXBwb3J0ZWQgcmF0ZXMKKyAqIEBzdXBwX21jc19zZXQgLSBwb2ludGVyIHRvIHN1cHBvcnRlZCBNU0Mgc2V0CisgKiBAc2Vzc2lvbl9lbnRyeSAtIHBvaW50ZXIgdG8gUEUgc2Vzc2lvbiBlbnRyeQorICogQHZodF9jYXBzIC0gcG9pbnRlciB0byBWSFQgY2FwYWJpbGl0eQorICoKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgc2V0IG9mIGF2YWlsYWJsZSByYXRlcyBmcm9tIHRoZSBjb25maWcgYW5kIGNvbXBhcmUgdGhlbQorICogYWdhaW5zdCB0aGUgc2V0IG9mIHJlY2VpdmVkIHN1cHBvcnRlZCByYXRlcy4gQWZ0ZXIgdGhlIGNvbXBhcmlzb24gc3RhdGlvbgorICogZW50cnkncyByYXRlcyBpcyBwb3B1bGF0ZWQgd2l0aCAxMUEgcmF0ZXMgYW5kIDExQiByYXRlcy4KKyAqCisgKiBSZXR1cm46IGVTSVJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlU0lSX0ZBSUxVUkUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2xpbV90ZGxzX3BvcHVsYXRlX21hdGNoaW5nX3JhdGVfc2V0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwRHBoSGFzaE5vZGUgc3RhZHMsCisJCQkJICAgIHVpbnQ4X3QgKnN1cHBfcmF0ZV9zZXQsCisJCQkJICAgIHVpbnQ4X3Qgc3VwcF9yYXRlc19sZW4sCisJCQkJICAgIHVpbnQ4X3QgKnN1cHBfbWNzX3NldCwKKwkJCQkgICAgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSwKKwkJCQkgICAgdERvdDExZklFVkhUQ2FwcyAqdmh0X2NhcHMpCit7CisJdFNpck1hY1JhdGVTZXQgdGVtcF9yYXRlX3NldDsKKwl1aW50MzJfdCBpLCBqLCB2YWwsIG1pbiwgaXNfYV9yYXRlOworCXRTaXJNYWNSYXRlU2V0IHRlbXBfcmF0ZV9zZXQyOworCXVpbnQzMl90IHBoeW1vZGU7CisJdWludDhfdCBtY3NTZXRbU0laRV9PRl9TVVBQT1JURURfTUNTX1NFVF07CisJdHBTaXJTdXBwb3J0ZWRSYXRlcyByYXRlczsKKwl1aW50OF90IGFfcmF0ZWluZGV4ID0gMDsKKwl1aW50OF90IGJfcmF0ZWluZGV4ID0gMDsKKwlpc19hX3JhdGUgPSAwOworCXRlbXBfcmF0ZV9zZXQyLm51bVJhdGVzID0gMDsKKworCWxpbV9nZXRfcGh5X21vZGUobWFjX2N0eCwgJnBoeW1vZGUsIE5VTEwpOworCisJLyogZ2V0IG93biByYXRlIHNldCAqLworCXZhbCA9IFdOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOOworCWlmICh3bGFuX2NmZ19nZXRfc3RyKG1hY19jdHgsIFdOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVQsCisJCQkgICAgICh1aW50OF90ICopICZ0ZW1wX3JhdGVfc2V0LnJhdGUsCisJCQkgICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkvKiBDb3VsZCBub3QgZ2V0IHJhdGVzZXQgZnJvbSBDRkcuIExvZyBlcnJvci4gKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIHJhdGVzZXQiKSk7CisJCXZhbCA9IDA7CisJfQorCXRlbXBfcmF0ZV9zZXQubnVtUmF0ZXMgPSB2YWw7CisKKwlpZiAocGh5bW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykgeworCQkvKiBnZXQgb3duIGV4dGVuZGVkIHJhdGUgc2V0ICovCisJCXZhbCA9IFdOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOOworCQlpZiAod2xhbl9jZmdfZ2V0X3N0cihtYWNfY3R4LAorCQkJCSAgICAgV05JX0NGR19FWFRFTkRFRF9PUEVSQVRJT05BTF9SQVRFX1NFVCwKKwkJCQkgICAgICh1aW50OF90ICopICZ0ZW1wX3JhdGVfc2V0Mi5yYXRlLAorCQkJCSAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorCQkJdGVtcF9yYXRlX3NldDIubnVtUmF0ZXMgPSB2YWw7CisJfQorCisJaWYgKCh0ZW1wX3JhdGVfc2V0Lm51bVJhdGVzICsgdGVtcF9yYXRlX3NldDIubnVtUmF0ZXMpID4gMTIpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgibW9yZSB0aGFuIDEyIHJhdGVzIGluIENGRyIpKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKioKKwkgKiBIYW5kbGluZyBvZiB0aGUgcmF0ZSBzZXQgSUVzIGlzIHRoZSBmb2xsb3dpbmc6CisJICogLSBrZWVwIG9ubHkgcmF0ZXMgdGhhdCB3ZSBzdXBwb3J0IGFuZCB0aGF0IHRoZSBzdGF0aW9uIHN1cHBvcnRzCisJICogLSBzb3J0IGFuZCB0aGUgcmF0ZXMgaW50byB0aGUgcFN0YS0+cmF0ZSBhcnJheQorCSAqLworCisJLyogQ29weSBhbGwgcmF0ZXMgaW4gdGVtcF9yYXRlX3NldCwgdGhlcmUgYXJlIDEyIHJhdGVzIG1heCAqLworCWZvciAoaSA9IDA7IGkgPCB0ZW1wX3JhdGVfc2V0Mi5udW1SYXRlczsgaSsrKQorCQl0ZW1wX3JhdGVfc2V0LnJhdGVbaSArIHRlbXBfcmF0ZV9zZXQubnVtUmF0ZXNdID0KKwkJCXRlbXBfcmF0ZV9zZXQyLnJhdGVbaV07CisKKwl0ZW1wX3JhdGVfc2V0Lm51bVJhdGVzICs9IHRlbXBfcmF0ZV9zZXQyLm51bVJhdGVzOworCisJLyoqCisJICogU29ydCByYXRlcyBpbiB0ZW1wX3JhdGVfc2V0ICh0aGV5IGFyZSBsaWtlbHkgdG8gYmUgYWxyZWFkeSBzb3J0ZWQpCisJICogcHV0IHRoZSByZXN1bHQgaW4gdGVtcF9yYXRlX3NldDIKKwkgKi8KKwl0ZW1wX3JhdGVfc2V0Mi5udW1SYXRlcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGVtcF9yYXRlX3NldC5udW1SYXRlczsgaSsrKSB7CisJCW1pbiA9IDA7CisJCXZhbCA9IDB4ZmY7CisKKwkJZm9yIChqID0gMDsgaiA8IHRlbXBfcmF0ZV9zZXQubnVtUmF0ZXM7IGorKykKKwkJCWlmICgodWludDMyX3QpICh0ZW1wX3JhdGVfc2V0LnJhdGVbal0gJiAweDdmKSA8IHZhbCkgeworCQkJCXZhbCA9IHRlbXBfcmF0ZV9zZXQucmF0ZVtqXSAmIDB4N2Y7CisJCQkJbWluID0gajsKKwkJCX0KKworCQl0ZW1wX3JhdGVfc2V0Mi5yYXRlW3RlbXBfcmF0ZV9zZXQyLm51bVJhdGVzKytdID0KKwkJCXRlbXBfcmF0ZV9zZXQucmF0ZVttaW5dOworCQl0ZW1wX3JhdGVfc2V0LnJhdGVbbWluXSA9IDB4ZmY7CisJfQorCisJLyoqCisJICogQ29weSByZWNlaXZlZCByYXRlcyBpbiB0ZW1wX3JhdGVfc2V0LCB0aGUgcGFyc2VyIGhhcyBlbnN1cmVkCisJICogdW5pY2l0eSBvZiB0aGUgcmF0ZXMgc28gdGhlcmUgY2Fubm90IGJlIG1vcmUgdGhhbiAxMiAuCisJICovCisJaWYgKHN1cHBfcmF0ZXNfbGVuID4gU0lSX01BQ19SQVRFU0VUX0VJRF9NQVgpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoCisJCQkgICAiU3VwcG9ydGVkIHJhdGVzIGxlbmd0aCAlZCBtb3JlIHRoYW4gdGhlIE1heCBsaW1pdCwgcmVzZXQgdG8gTWF4IgorCQkJICApLAorCQkJc3VwcF9yYXRlc19sZW4pOworCQlzdXBwX3JhdGVzX2xlbiA9IFNJUl9NQUNfUkFURVNFVF9FSURfTUFYOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzdXBwX3JhdGVzX2xlbjsgaSsrKQorCQl0ZW1wX3JhdGVfc2V0LnJhdGVbaV0gPSBzdXBwX3JhdGVfc2V0W2ldOworCisJdGVtcF9yYXRlX3NldC5udW1SYXRlcyA9IHN1cHBfcmF0ZXNfbGVuOworCisJcmF0ZXMgPSAmc3RhZHMtPnN1cHBvcnRlZFJhdGVzOworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHJhdGVzLCBzaXplb2YodFNpclN1cHBvcnRlZFJhdGVzKSwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGVtcF9yYXRlX3NldDIubnVtUmF0ZXM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgdGVtcF9yYXRlX3NldC5udW1SYXRlczsgaisrKSB7CisJCQlpZiAoKHRlbXBfcmF0ZV9zZXQyLnJhdGVbaV0gJiAweDdGKSAhPQorCQkJCSh0ZW1wX3JhdGVfc2V0LnJhdGVbal0gJiAweDdGKSkKKwkJCQljb250aW51ZTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKwkJCWlmICgoYl9yYXRlaW5kZXggPiBIQUxfTlVNXzExQl9SQVRFUykgfHwKKwkJCSAgICAoYV9yYXRlaW5kZXggPiBIQUxfTlVNXzExQV9SQVRFUykpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJJbnZhbGlkIG51bWJlciBvZiByYXRlcyAoMTFiLT4lZCwgMTFhLT4lZCkiKSwKKwkJCQkJYl9yYXRlaW5kZXgsIGFfcmF0ZWluZGV4KTsKKwkJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQkJfQorI2VuZGlmCisJCQlpZiAoc2lySXNBcmF0ZSh0ZW1wX3JhdGVfc2V0Mi5yYXRlW2ldICYgMHg3ZikpIHsKKwkJCQlpc19hX3JhdGUgPSAxOworCQkJCWlmIChhX3JhdGVpbmRleCA8IFNJUl9OVU1fMTFBX1JBVEVTKQorCQkJCQlyYXRlcy0+bGxhUmF0ZXNbYV9yYXRlaW5kZXgrK10gPSB0ZW1wX3JhdGVfc2V0Mi5yYXRlW2ldOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYl9yYXRlaW5kZXggPCBTSVJfTlVNXzExQl9SQVRFUykKKwkJCQkJcmF0ZXMtPmxsYlJhdGVzW2JfcmF0ZWluZGV4KytdID0gdGVtcF9yYXRlX3NldDIucmF0ZVtpXTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogY29tcHV0ZSB0aGUgbWF0Y2hpbmcgTUNTIHJhdGUgc2V0LCBpZiBwZWVyIGlzIDExbiBjYXBhYmxlIGFuZCBzZWxmIG1vZGUgaXMgMTFuICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwlpZiAoc3RhZHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5KQorI2Vsc2UKKwlpZiAoSVNfRE9UMTFfTU9ERV9IVChzZXNzaW9uX2VudHJ5LT5kb3QxMW1vZGUpICYmCisJICAgIChzdGFkcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpKQorI2VuZGlmCisJeworCQl2YWwgPSBTSVpFX09GX1NVUFBPUlRFRF9NQ1NfU0VUOworCQlpZiAod2xhbl9jZmdfZ2V0X3N0cihtYWNfY3R4LCBXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorCQkJCSAgICAgbWNzU2V0LCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCS8qIENvdWxkIG5vdCBnZXQgcmF0ZXNldCBmcm9tIENGRy4gTG9nIGVycm9yLiAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgc3VwcG9ydGVkTUNTU2V0IikpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCB2YWw7IGkrKykKKwkJCXN0YWRzLT5zdXBwb3J0ZWRSYXRlcy5zdXBwb3J0ZWRNQ1NTZXRbaV0gPQorCQkJCW1jc1NldFtpXSAmIHN1cHBfbWNzX3NldFtpXTsKKworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkJIEZMKCJNQ1MgUmF0ZSBTZXQgQml0bWFwIGZyb20gQ0ZHIGFuZCBEUEgiKSk7CisJCWZvciAoaSA9IDA7IGkgPCBTSVJfTUFDX01BWF9TVVBQT1JURURfTUNTX1NFVDsgaSsrKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCIleCAleCIpLCBtY3NTZXRbaV0sCisJCQkJc3RhZHMtPnN1cHBvcnRlZFJhdGVzLnN1cHBvcnRlZE1DU1NldFtpXSk7CisJCX0KKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlsaW1fcG9wdWxhdGVfdmh0X21jc19zZXQobWFjX2N0eCwgJnN0YWRzLT5zdXBwb3J0ZWRSYXRlcywgdmh0X2NhcHMsCisJCQkJIHNlc3Npb25fZW50cnkpOworI2VuZGlmCisJLyoqCisJICogU2V0IHRoZSBlcnBFbmFibGVkIGJpdCBpZiB0aGUgcGh5IGlzIGluIEcgbW9kZSBhbmQgYXQgbGVhc3QKKwkgKiBvbmUgQSByYXRlIGlzIHN1cHBvcnRlZAorCSAqLworCWlmICgocGh5bW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykgJiYgaXNfYV9yYXRlKQorCQlzdGFkcy0+ZXJwRW5hYmxlZCA9IGVIQUxfU0VUOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworZXJyb3I6CisJcmV0dXJuIGVTSVJfRkFJTFVSRTsKK30KKworLyoKKyAqIHVwZGF0ZSBIQVNIIG5vZGUgZW50cnkgaW5mbworICovCitzdGF0aWMgdm9pZCBsaW1fdGRsc191cGRhdGVfaGFzaF9ub2RlX2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgdERwaEhhc2hOb2RlICpwU3RhRHMsCisJCQkJCSAgIHRTaXJUZGxzQWRkU3RhUmVxICpwVGRsc0FkZFN0YVJlcSwKKwkJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0RG90MTFmSUVIVENhcHMgaHRDYXAgPSB7MCx9OworCXREb3QxMWZJRUhUQ2FwcyAqaHRDYXBzOworCXREb3QxMWZJRVZIVENhcHMgKnBWaHRDYXBzID0gTlVMTDsKKwl0RG90MTFmSUVWSFRDYXBzICpwVmh0Q2Fwc190eGJmID0gTlVMTDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCXREb3QxMWZJRVZIVENhcHMgdmh0Q2FwOworCXVpbnQ4X3QgY2JNb2RlOworI2VuZGlmCisJdHBEcGhIYXNoTm9kZSBwU2Vzc1N0YURzID0gTlVMTDsKKwl1aW50MTZfdCBhaWQ7CisKKwlpZiAocFRkbHNBZGRTdGFSZXEtPnRkbHNBZGRPcGVyID09IFRETFNfT1BFUl9BREQpIHsKKwkJcG9wdWxhdGVfZG90MTFmX2h0X2NhcHMocE1hYywgcHNlc3Npb25FbnRyeSwgJmh0Q2FwKTsKKwl9IGVsc2UgaWYgKHBUZGxzQWRkU3RhUmVxLT50ZGxzQWRkT3BlciA9PSBURExTX09QRVJfVVBEQVRFKSB7CisJCWxpbV90ZGxzX3BvcHVsYXRlX2RvdDExZl9odF9jYXBzKHBNYWMsIE5VTEwsIHBUZGxzQWRkU3RhUmVxLCAmaHRDYXApOworCX0KKwlodENhcHMgPSAmaHRDYXA7CisJaWYgKGh0Q2Fwcy0+cHJlc2VudCkgeworCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5ID0gMTsKKwkJcFN0YURzLT5odEdyZWVuZmllbGQgPSBodENhcHMtPmdyZWVuRmllbGQ7CisJCXBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJaHRDYXBzLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJCXBTdGFEcy0+aHRNSU1PUFNTdGF0ZSA9IGh0Q2Fwcy0+bWltb1Bvd2VyU2F2ZTsKKwkJcFN0YURzLT5odE1heEFtc2R1TGVuZ3RoID0gaHRDYXBzLT5tYXhpbWFsQU1TRFVzaXplOworCQlwU3RhRHMtPmh0QU1wZHVEZW5zaXR5ID0gaHRDYXBzLT5tcGR1RGVuc2l0eTsKKwkJcFN0YURzLT5odERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0ID0gaHRDYXBzLT5kc3NzQ2NrTW9kZTQwTUh6OworCQlwU3RhRHMtPmh0U2hvcnRHSTIwTWh6ID0gaHRDYXBzLT5zaG9ydEdJMjBNSHo7CisJCXBTdGFEcy0+aHRTaG9ydEdJNDBNaHogPSBodENhcHMtPnNob3J0R0k0ME1IejsKKwkJcFN0YURzLT5odE1heFJ4QU1wZHVGYWN0b3IgPSBodENhcHMtPm1heFJ4QU1QRFVGYWN0b3I7CisJCWxpbV9maWxsX3J4X2hpZ2hlc3Rfc3VwcG9ydGVkX3JhdGUocE1hYywKKwkJCQkJCSAgICZwU3RhRHMtPnN1cHBvcnRlZFJhdGVzLgorCQkJCQkJICAgcnhIaWdoZXN0RGF0YVJhdGUsCisJCQkJCQkgICBodENhcHMtPnN1cHBvcnRlZE1DU1NldCk7CisJCXBTdGFEcy0+YmFQb2xpY3lGbGFnID0gMHhGRjsKKwkJcE1hYy0+bGltLmdMaW1UZGxzTGlua01vZGUgPSBURExTX0xJTktfTU9ERV9OOworCQlwU3RhRHMtPmh0X2NhcHMgPSBwVGRsc0FkZFN0YVJlcS0+aHRDYXAuY2FwSW5mbzsKKwl9IGVsc2UgeworCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5ID0gMDsKKwkJcE1hYy0+bGltLmdMaW1UZGxzTGlua01vZGUgPSBURExTX0xJTktfTU9ERV9CRzsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlsaW1fdGRsc19wb3B1bGF0ZV9kb3QxMWZfdmh0X2NhcHMocE1hYywgcFRkbHNBZGRTdGFSZXEsICZ2aHRDYXApOworCXBWaHRDYXBzID0gJnZodENhcDsKKwlpZiAocFZodENhcHMtPnByZXNlbnQpIHsKKwkJcFN0YURzLT5tbG1TdGFDb250ZXh0LnZodENhcGFiaWxpdHkgPSAxOworCisJCWlmIChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwgPD0gU0lSXzExQl9DSEFOTkVMX0VORCkgeworCQkJLyoKKwkJCSAqIGlmIHRoZSBjaGFubmVsIGlzIDJHIHRoZW4gdXBkYXRlIHRoZSBtaW4gY2hhbm5lbAorCQkJICogd2lkdGhzZXQgaW4gcFN0YURzLiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgd2hlbgorCQkJICogc2VuZGluZyBhIEFkZFN0YSByZXF1ZXN0IHRvIGZpcm13YXJlCisJCQkgKiAxMS4yMS4xIEdlbmVyYWw6IFRoZSBjaGFubmVsIHdpZHRoIG9mIHRoZSBURExTIGRpcmVjdAorCQkJICogbGluayBvbiB0aGUgYmFzZSBjaGFubmVsIHNoYWxsIG5vdCBleGNlZWQgdGhlIGNoYW5uZWwKKwkJCSAqIHdpZHRoIG9mIHRoZSBCU1MgdG8gd2hpY2ggdGhlIFRETFMgcGVlciBTVEFzIGFyZQorCQkJICogYXNzb2NpYXRlZC4KKwkJCSAqLworCQkJcFN0YURzLT52aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCVdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfMjBfNDBNSFo7CisJCQlwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQllSFRfQ0hBTk5FTF9XSURUSF8yME1IWjsKKwkJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoInZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9ICVodSwgaHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgJWh1IiksCisJCQkJcFN0YURzLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCwKKwkJCQlwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KTsKKwkJfSBlbHNlIHsKKwkJCXBTdGFEcy0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzgwTUhaOworCQkJcFN0YURzLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFo7CisJCX0KKworCQlwU3RhRHMtPnZodExkcGNDYXBhYmxlID0gcFZodENhcHMtPmxkcGNDb2RpbmdDYXA7CisJCXBTdGFEcy0+dmh0QmVhbUZvcm1lckNhcGFibGUgPSAwOworCQlwTWFjLT5saW0uZ0xpbVRkbHNMaW5rTW9kZSA9IFRETFNfTElOS19NT0RFX0FDOworCQlwVmh0Q2Fwc190eGJmID0gKHREb3QxMWZJRVZIVENhcHMgKikgKCZwVGRsc0FkZFN0YVJlcS0+dmh0Q2FwKTsKKwkJcFZodENhcHNfdHhiZi0+c3VCZWFtZm9ybWVlQ2FwID0gMDsKKwkJcFZodENhcHNfdHhiZi0+c3VCZWFtRm9ybWVyQ2FwID0gMDsKKwkJcFZodENhcHNfdHhiZi0+bXVCZWFtZm9ybWVyQ2FwID0gMDsKKwkJcFZodENhcHNfdHhiZi0+bXVCZWFtZm9ybWVlQ2FwID0gMDsKKwkJcFN0YURzLT52aHRfY2FwcyA9IHBUZGxzQWRkU3RhUmVxLT52aHRDYXAudmh0Q2FwSW5mbzsKKwl9IGVsc2UgeworCQlwU3RhRHMtPm1sbVN0YUNvbnRleHQudmh0Q2FwYWJpbGl0eSA9IDA7CisJCXBTdGFEcy0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCVdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfMjBfNDBNSFo7CisJfQorI2VuZGlmCisJLypDYWxjdWxhdGUgdGhlIFNlY29uZGFyeSBDb2FubmVsIE9mZnNldCAqLworCWNiTW9kZSA9IGxpbV9zZWxlY3RfY2JfbW9kZShwU3RhRHMsIHBzZXNzaW9uRW50cnksCisJCQkJICAgIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwKKwkJCQkgICAgcFN0YURzLT52aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworCisJcFN0YURzLT5odFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSBjYk1vZGU7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmIChwU3RhRHMtPm1sbVN0YUNvbnRleHQudmh0Q2FwYWJpbGl0eSkgeworCQlwU3RhRHMtPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IGxpbV9nZXRfaHRjYl9zdGF0ZShjYk1vZGUpOworCX0KKyNlbmRpZgorCisJcFNlc3NTdGFEcyA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgJmFpZCwKKwkJCQkJICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisJLyogTGV0cyBlbmFibGUgUU9TIHBhcmFtZXRlciAqLworCXBTdGFEcy0+cW9zTW9kZSA9IDE7CisJcFN0YURzLT53bWVFbmFibGVkID0gMTsKKwlwU3RhRHMtPmxsZUVuYWJsZWQgPSAwOworCS8qICBURExTIER1bW15IEFkZFNUQSBkb2VzIG5vdCBoYXZlIHFvc0luZm8gLCBpcyBpdCBPSyA/PworCSAqLworCXBTdGFEcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mbyA9CisJCSgqKHRTaXJNYWNRb3NJbmZvU3RhdGlvbiAqKSAmcFRkbHNBZGRTdGFSZXEtPnVhcHNkX3F1ZXVlcyk7CisKKwkvKiBwb3B1bGF0ZSBtYXRjaGluZyByYXRlIHNldCAqLworCisJLyogVERMUyBEdW1teSBBZGRTVEEgZG9lcyBub3QgaGF2ZSBIVENhcCxWSFRDYXAsUmF0ZXMgaW5mbyAsIGlzIGl0IE9LID8/CisJICovCisJbGltX3RkbHNfcG9wdWxhdGVfbWF0Y2hpbmdfcmF0ZV9zZXQocE1hYywgcFN0YURzLAorCQkJCQkgICAgcFRkbHNBZGRTdGFSZXEtPnN1cHBvcnRlZF9yYXRlcywKKwkJCQkJICAgIHBUZGxzQWRkU3RhUmVxLT5zdXBwb3J0ZWRfcmF0ZXNfbGVuZ3RoLAorCQkJCQkgICAgKHVpbnQ4X3QgKikgcFRkbHNBZGRTdGFSZXEtPmh0Q2FwLgorCQkJCQkgICAgc3VwcE1jc1NldCwgcHNlc3Npb25FbnRyeSwgcFZodENhcHMpOworCisJLyogIFRETFMgRHVtbXkgQWRkU1RBIGRvZXMgbm90IGhhdmUgcmlnaHQgY2FwYWJpbGl0eSAsIGlzIGl0IE9LID8/CisJICovCisJcFN0YURzLT5tbG1TdGFDb250ZXh0LmNhcGFiaWxpdHlJbmZvID0KKwkJKCoodFNpck1hY0NhcGFiaWxpdHlJbmZvICopICZwVGRsc0FkZFN0YVJlcS0+Y2FwYWJpbGl0eSk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBBZGQgU1RBIGZvciBURExTIHNldHVwIHByb2NlZHVyZQorICovCitzdGF0aWMgdFNpclJldFN0YXR1cyBsaW1fdGRsc19zZXR1cF9hZGRfc3RhKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICB0U2lyVGRsc0FkZFN0YVJlcSAqcEFkZFN0YVJlcSwKKwkJCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworCXRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCXVpbnQxNl90IGFpZCA9IDA7CisKKwlwU3RhRHMgPSBkcGhfbG9va3VwX2hhc2hfZW50cnkocE1hYywgcEFkZFN0YVJlcS0+cGVlck1hYywgJmFpZCwKKwkJCQkgICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWlmIChOVUxMID09IHBTdGFEcykgeworCQlhaWQgPSBsaW1fYXNzaWduX3BlZXJfaWR4KHBNYWMsIHBzZXNzaW9uRW50cnkpOworCisJCWlmICghYWlkKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIk5vIG1vcmUgZnJlZSBBSUQgZm9yIHBlZXIgIgorCQkJCSAgIE1BQ19BRERSRVNTX1NUUiksCisJCQkJTUFDX0FERFJfQVJSQVkocEFkZFN0YVJlcS0+cGVlck1hYykpOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCisJCS8qIFNldCB0aGUgYWlkIGluIHBlZXJBSURCaXRtYXAgYXMgaXQgaGFzIGJlZW4gYXNzaWduZWQgdG8gVERMUyBwZWVyICovCisJCVNFVF9QRUVSX0FJRF9CSVRNQVAocHNlc3Npb25FbnRyeS0+cGVlckFJREJpdG1hcCwgYWlkKTsKKworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJBaWQgPSAlZCwgZm9yIHBlZXIgPSIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCWFpZCwgTUFDX0FERFJfQVJSQVkocEFkZFN0YVJlcS0+cGVlck1hYykpOworCQlwU3RhRHMgPQorCQkJZHBoX2dldF9oYXNoX2VudHJ5KHBNYWMsIGFpZCwKKwkJCQkJICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisJCWlmIChwU3RhRHMpIHsKKwkJCSh2b2lkKWxpbV9kZWxfc3RhKHBNYWMsIHBTdGFEcywgZmFsc2UgLyphc3luY2hyb25vdXMgKi8sCisJCQkJCSAgcHNlc3Npb25FbnRyeSk7CisJCQlsaW1fZGVsZXRlX2RwaF9oYXNoX2VudHJ5KHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgYWlkLAorCQkJCQkJICBwc2Vzc2lvbkVudHJ5KTsKKwkJfQorCisJCXBTdGFEcyA9IGRwaF9hZGRfaGFzaF9lbnRyeShwTWFjLCBwQWRkU3RhUmVxLT5wZWVyTWFjLCBhaWQsCisJCQkJCSAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisKKwkJaWYgKE5VTEwgPT0gcFN0YURzKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJhZGQgaGFzaCBlbnRyeSBmYWlsZWQiKSk7CisJCQlDREZfQVNTRVJUKDApOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCX0KKworCWxpbV90ZGxzX3VwZGF0ZV9oYXNoX25vZGVfaW5mbyhwTWFjLCBwU3RhRHMsIHBBZGRTdGFSZXEsIHBzZXNzaW9uRW50cnkpOworCisJcFN0YURzLT5zdGFUeXBlID0gU1RBX0VOVFJZX1RETFNfUEVFUjsKKworCXN0YXR1cyA9CisJCWxpbV9hZGRfc3RhKHBNYWMsIHBTdGFEcywKKwkJCSAgICAocEFkZFN0YVJlcS0+dGRsc0FkZE9wZXIgPT0KKwkJCSAgICAgVERMU19PUEVSX1VQREFURSkgPyB0cnVlIDogZmFsc2UsIHBzZXNzaW9uRW50cnkpOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJLyogc2hvdWxkIG5vdCBmYWlsICovCisJCUNERl9BU1NFUlQoMCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWwgU1RBLCBhZnRlciBMaW5rIGlzIHRlYXJkb3duIG9yIGRpc2NvdmVyeSByZXNwb25zZSBzZW50IG9uIGRpcmVjdCBsaW5rCisgKi8KK3N0YXRpYyB0cERwaEhhc2hOb2RlIGxpbV90ZGxzX2RlbF9zdGEodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hYywKKwkJCQkgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCXVpbnQxNl90IHBlZXJJZHggPSAwOworCXRwRHBoSGFzaE5vZGUgcFN0YURzID0gTlVMTDsKKworCXBTdGFEcyA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLCBwZWVyTWFjLCAmcGVlcklkeCwKKwkJCQkgICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisJaWYgKHBTdGFEcykgeworCisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIkRFTCBTVEEgcGVlciBNQUM6ICJNQUNfQUREUkVTU19TVFIpLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkocFN0YURzLT5zdGFBZGRyKSk7CisKKwkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiU1RBIHR5cGUgPSAleCwgc3RhIGlkeCA9ICV4IiksCisJCSAgICAgICBwU3RhRHMtPnN0YVR5cGUsCisJCSAgICAgICBwU3RhRHMtPnN0YUluZGV4KTsKKworCQlzdGF0dXMgPSBsaW1fZGVsX3N0YShwTWFjLCBwU3RhRHMsIGZhbHNlLCBwc2Vzc2lvbkVudHJ5KTsKKwl9CisKKwlyZXR1cm4gcFN0YURzOworfQorCisvKgorICogT25jZSBMaW5rIGlzIHNldHVwIHdpdGggUEVFUiwgc2VuZCBBZGQgU1RBIGluZCB0byBTTUUKKyAqLworc3RhdGljIENERl9TVEFUVVMgbGltX3NlbmRfc21lX3RkbHNfYWRkX3N0YV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCXVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkJdFNpck1hY0FkZHIgcGVlck1hYywKKwkJCQkJCXVpbnQ4X3QgdXBkYXRlU3RhLAorCQkJCQkJdERwaEhhc2hOb2RlICpwU3RhRHMsIHVpbnQ4X3Qgc3RhdHVzKQoreworCXRTaXJNc2dRIG1taE1zZyA9IHsgMCB9OworCXRTaXJUZGxzQWRkU3RhUnNwICphZGRTdGFSc3AgPSBOVUxMOworCW1taE1zZy50eXBlID0gZVdOSV9TTUVfVERMU19BRERfU1RBX1JTUDsKKworCWFkZFN0YVJzcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyVGRsc0FkZFN0YVJzcCkpOworCWlmIChOVUxMID09IGFkZFN0YVJzcCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWFkZFN0YVJzcC0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCWFkZFN0YVJzcC0+c3RhdHVzQ29kZSA9IHN0YXR1czsKKwlpZiAocFN0YURzKSB7CisJCWFkZFN0YVJzcC0+c3RhSWQgPSBwU3RhRHMtPnN0YUluZGV4OworCQlhZGRTdGFSc3AtPnVjYXN0U2lnID0gcFN0YURzLT51Y1VjYXN0U2lnOworCQlhZGRTdGFSc3AtPmJjYXN0U2lnID0gcFN0YURzLT51Y0JjYXN0U2lnOworCX0KKwlpZiAocGVlck1hYykgeworCQljZGZfbWVtX2NvcHkoYWRkU3RhUnNwLT5wZWVyTWFjLAorCQkJICAgICAodWludDhfdCAqKSBwZWVyTWFjLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwl9CisJaWYgKHVwZGF0ZVN0YSkKKwkJYWRkU3RhUnNwLT50ZGxzQWRkT3BlciA9IFRETFNfT1BFUl9VUERBVEU7CisJZWxzZQorCQlhZGRTdGFSc3AtPnRkbHNBZGRPcGVyID0gVERMU19PUEVSX0FERDsKKworCWFkZFN0YVJzcC0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJUZGxzQWRkU3RhUnNwKTsKKwlhZGRTdGFSc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfVERMU19BRERfU1RBX1JTUDsKKworCW1taE1zZy5ib2R5cHRyID0gYWRkU3RhUnNwOworCW1taE1zZy5ib2R5dmFsID0gMDsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworfQorCisvKgorICogU1RBIFJTUCByZWNlaXZlZCBmcm9tIEhBTAorICovCitDREZfU1RBVFVTIGxpbV9wcm9jZXNzX3RkbHNfYWRkX3N0YV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqbXNnLAorCQkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRBZGRTdGFQYXJhbXMgKnBBZGRTdGFQYXJhbXMgPSAodEFkZFN0YVBhcmFtcyAqKSBtc2c7CisJdWludDhfdCBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisJdERwaEhhc2hOb2RlICpwU3RhRHMgPSBOVUxMOworCXVpbnQxNl90IGFpZCA9IDA7CisKKwlTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJzdGFJZHg9JWQsIHN0YU1hYz0iTUFDX0FERFJFU1NfU1RSKSwKKwkgICAgICAgcEFkZFN0YVBhcmFtcy0+c3RhSWR4LAorCSAgICAgICBNQUNfQUREUl9BUlJBWShwQWRkU3RhUGFyYW1zLT5zdGFNYWMpKTsKKworCWlmIChwQWRkU3RhUGFyYW1zLT5zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkFkZCBzdGEgZmFpbGVkICIpKTsKKwkJc3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQlnb3RvIGFkZF9zdGFfZXJyb3I7CisJfQorCisJcFN0YURzID0gZHBoX2xvb2t1cF9oYXNoX2VudHJ5KHBNYWMsIHBBZGRTdGFQYXJhbXMtPnN0YU1hYywgJmFpZCwKKwkJCQkgICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWlmIChOVUxMID09IHBTdGFEcykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJwU3RhRHMgaXMgTlVMTCAiKSk7CisJCXN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKwkJZ290byBhZGRfc3RhX2Vycm9yOworCX0KKworCXBTdGFEcy0+YnNzSWQgPSBwQWRkU3RhUGFyYW1zLT5ic3NJZHg7CisJcFN0YURzLT5zdGFJbmRleCA9IHBBZGRTdGFQYXJhbXMtPnN0YUlkeDsKKwlwU3RhRHMtPnVjVWNhc3RTaWcgPSBwQWRkU3RhUGFyYW1zLT51Y1VjYXN0U2lnOworCXBTdGFEcy0+dWNCY2FzdFNpZyA9IHBBZGRTdGFQYXJhbXMtPnVjQmNhc3RTaWc7CisJcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURTsKKwlwU3RhRHMtPnZhbGlkID0gMTsKK2FkZF9zdGFfZXJyb3I6CisJc3RhdHVzID0gbGltX3NlbmRfc21lX3RkbHNfYWRkX3N0YV9yc3AocE1hYywgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLAorCQkJCQkgICAgICAgcEFkZFN0YVBhcmFtcy0+c3RhTWFjLAorCQkJCQkgICAgICAgcEFkZFN0YVBhcmFtcy0+dXBkYXRlU3RhLCBwU3RhRHMsCisJCQkJCSAgICAgICBzdGF0dXMpOworCWNkZl9tZW1fZnJlZShwQWRkU3RhUGFyYW1zKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHBvcHVsYXRlX2RvdDExZl90ZGxzX29mZmNoYW5uZWxfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJCQkgICAgdERvdDExZklFU3VwcENoYW5uZWxzICpzdXBwQ2hhbm5lbHMsCisJCQkJCSAgICB0RG90MTFmSUVTdXBwT3BlcmF0aW5nQ2xhc3NlcyAqCisJCQkJCSAgICBzdXBwT3BlckNsYXNzZXMpCit7CisJdWludDMyX3QgbnVtQ2hhbnMgPSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU47CisJdWludDhfdCB2YWxpZENoYW5bV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKKwl1aW50OF90IGk7CisJdWludDhfdCB2YWxpZF9jb3VudCA9IDA7CisJdWludDhfdCBjaGFuT2Zmc2V0OworCXVpbnQ4X3Qgb3BfY2xhc3M7CisJdWludDhfdCBudW1DbGFzc2VzOworCXVpbnQ4X3QgY2xhc3Nlc1tTSVJfTUFDX01BWF9TVVBQX09QRVJfQ0xBU1NFU107CisJaWYgKHdsYW5fY2ZnX2dldF9zdHIocE1hYywgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QsCisJCQkgICAgIHZhbGlkQ2hhbiwgJm51bUNoYW5zKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJLyoqCisJCSAqIENvdWxkIG5vdCBnZXQgVmFsaWQgY2hhbm5lbCBsaXN0IGZyb20gQ0ZHLgorCQkgKiBMb2cgZXJyb3IuCisJCSAqLworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIFZhbGlkIGNoYW5uZWwgbGlzdCIpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHZhbGlkYXRpbmcgdGhlIGNoYW5uZWwgbGlzdCBmb3IgREZTIGNoYW5uZWxzICovCisJZm9yIChpID0gMFU7IGkgPCBudW1DaGFuczsgaSsrKSB7CisJCWlmIChDSEFOTkVMX1NUQVRFX0RGUyA9PQorCQkgICAgY2RzX2dldF9jaGFubmVsX3N0YXRlKHZhbGlkQ2hhbltpXSkpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCQlGTCgKKwkJCQkgICAic2tpcHBpbmcgREZTIGNoYW5uZWwgJWQgZnJvbSB0aGUgdmFsaWQgY2hhbm5lbCBsaXN0IgorCQkJCSAgKSwKKwkJCQl2YWxpZENoYW5baV0pOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodmFsaWRfY291bnQgPj0gQVJSQVlfU0laRShzdXBwQ2hhbm5lbHMtPmJhbmRzKSkKKwkJCSBicmVhazsKKwkJc3VwcENoYW5uZWxzLT5iYW5kc1t2YWxpZF9jb3VudF1bMF0gPSB2YWxpZENoYW5baV07CisJCXN1cHBDaGFubmVscy0+YmFuZHNbdmFsaWRfY291bnRdWzFdID0gMTsKKwkJdmFsaWRfY291bnQrKzsKKwl9CisKKwlzdXBwQ2hhbm5lbHMtPm51bV9iYW5kcyA9IHZhbGlkX2NvdW50OworCXN1cHBDaGFubmVscy0+cHJlc2VudCA9IDE7CisKKwkvKiBmaW5kIGNoYW5uZWwgb2Zmc2V0IGFuZCBnZXQgb3AgY2xhc3MgZm9yIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwgKi8KKwlzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCkgeworCWNhc2UgUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOgorCQljaGFuT2Zmc2V0ID0gQlcyMDsKKwkJYnJlYWs7CisKKwljYXNlIFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWToKKwkJY2hhbk9mZnNldCA9IEJXNDBfTE9XX1BSSU1BUlk7CisJCWJyZWFrOworCisJY2FzZSBQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOgorCQljaGFuT2Zmc2V0ID0gQlc0MF9ISUdIX1BSSU1BUlk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJY2hhbk9mZnNldCA9IEJXQUxMOworCQlicmVhazsKKworCX0KKworCW9wX2NsYXNzID0gY2RzX3JlZ2RtX2dldF9vcGNsYXNzX2Zyb21fY2hhbm5lbCgKKwkJcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnQsCisJCXBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwKKwkJY2hhbk9mZnNldCk7CisKKwlpZiAob3BfY2xhc3MgPT0gMCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgKKwkJCSAgICJQcmVzZW50IE9wZXJhdGluZyBjbGFzcyBpcyB3cm9uZywgY291bnRyeUNvZGVDdXJyZW50OiAlcywgY3VycmVudE9wZXJDaGFubmVsOiAlZCwgaHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OiAlZCwgY2hhbk9mZnNldDogJWQiCisJCQkgICksCisJCQlwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwKKwkJCXBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwKKwkJCXBzZXNzaW9uRW50cnktPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCwKKwkJCWNoYW5PZmZzZXQpOworCX0gZWxzZSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCUZMKAorCQkJICAgIlByZXNlbnQgT3BlcmF0aW5nIGNoYW5uZWw6ICVkIGNoYW5PZmZzZXQ6ICVkLCBvcCBjbGFzcz0lZCIKKwkJCSAgKSwKKwkJCXBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwgY2hhbk9mZnNldCwKKwkJCW9wX2NsYXNzKTsKKwl9CisJc3VwcE9wZXJDbGFzc2VzLT5wcmVzZW50ID0gMTsKKwlzdXBwT3BlckNsYXNzZXMtPmNsYXNzZXNbMF0gPSBvcF9jbGFzczsKKworCWNkc19yZWdkbV9nZXRfY3Vycl9vcGNsYXNzZXMoJm51bUNsYXNzZXMsICZjbGFzc2VzWzBdKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1DbGFzc2VzOyBpKyspIHsKKwkJc3VwcE9wZXJDbGFzc2VzLT5jbGFzc2VzW2kgKyAxXSA9IGNsYXNzZXNbaV07CisJfQorCS8qIGFkZCBvbmUgZm9yIHByZXNlbnQgb3BlcmF0aW5nIGNsYXNzLCBhZGRlZCBpbiB0aGUgYmVnaW5uaW5nICovCisJc3VwcE9wZXJDbGFzc2VzLT5udW1fY2xhc3NlcyA9IG51bUNsYXNzZXMgKyAxOworCisJcmV0dXJuOworfQorCisvKgorICogRlVOQ1RJT046IFBvcHVsYXRlIExpbmsgSWRlbnRpZmllciBlbGVtZW50IElFCisgKgorICovCisKK3ZvaWQgcG9wdWxhdGVfZG90MTFmX2xpbmtfaWRlbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJICAgICAgIHREb3QxMWZJRUxpbmtJZGVudGlmaWVyICpsaW5rSWRlbiwKKwkJCSAgICAgICB0U2lyTWFjQWRkciBwZWVyTWFjLCB1aW50OF90IHJlcVR5cGUpCit7CisJdWludDhfdCAqaW5pdFN0YUFkZHIgPSBOVUxMOworCXVpbnQ4X3QgKnJlc3BTdGFBZGRyID0gTlVMTDsKKworCShyZXFUeXBlID09IFRETFNfSU5JVElBVE9SKSA/ICgoaW5pdFN0YUFkZHIgPSBsaW5rSWRlbi0+SW5pdFN0YUFkZHIpLAorCQkJCSAgICAgICAocmVzcFN0YUFkZHIgPSBsaW5rSWRlbi0+UmVzcFN0YUFkZHIpKQorCTogKChyZXNwU3RhQWRkciA9IGxpbmtJZGVuLT5Jbml0U3RhQWRkciksCisJICAgKGluaXRTdGFBZGRyID0gbGlua0lkZW4tPlJlc3BTdGFBZGRyKSk7CisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIGxpbmtJZGVuLT5ic3NpZCwKKwkJICAgICAodWludDhfdCAqKSBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgaW5pdFN0YUFkZHIsCisJCSAgICAgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHJlc3BTdGFBZGRyLCAodWludDhfdCAqKSBwZWVyTWFjLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJbGlua0lkZW4tPnByZXNlbnQgPSAxOworCXJldHVybjsKKworfQorCit2b2lkIHBvcHVsYXRlX2RvdDExZl90ZGxzX2V4dF9jYXBhYmlsaXR5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJCQkgdERvdDExZklFRXh0Q2FwICpleHRDYXBhYmlsaXR5KQoreworCXN0cnVjdCBzX2V4dF9jYXAgKnBfZXh0X2NhcCA9IChzdHJ1Y3Qgc19leHRfY2FwICopZXh0Q2FwYWJpbGl0eS0+Ynl0ZXM7CisKKwlwX2V4dF9jYXAtPnRkbHNfcGVlcl9wc21fc3VwcCA9IFBFRVJfUFNNX1NVUFBPUlQ7CisJcF9leHRfY2FwLT50ZGxzX3BlZXJfdWFwc2RfYnVmZmVyX3N0YSA9IHBNYWMtPmxpbS5nTGltVERMU0J1ZlN0YUVuYWJsZWQ7CisKKwkvKgorCSAqIFNldCBURExTIGNoYW5uZWwgc3dpdGNoaW5nIGJpdHMgb25seSBpZiBvZmZjaGFubmVsIGlzIGVuYWJsZWQKKwkgKiBhbmQgVERMUyBDaGFubmVsIFN3aXRjaGluZyBpcyBub3QgcHJvaGliaXRlZCBieSBBUCBpbiBFeHRDYXAKKwkgKiBJRSBpbiBhc3NvYy9yZS1hc3NvYyByZXNwb25zZS4KKwkgKi8KKwlpZiAoKDEgPT0gcE1hYy0+bGltLmdMaW1URExTT2ZmQ2hhbm5lbEVuYWJsZWQpICYmCisJICAgICghcHNlc3Npb25FbnRyeS0+dGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZCkpIHsKKwkJcF9leHRfY2FwLT50ZGxzX2NoYW5uZWxfc3dpdGNoaW5nID0gMTsKKwkJcF9leHRfY2FwLT50ZGxzX2NoYW5fc3dpdF9wcm9oaWJpdGVkID0gMDsKKwl9IGVsc2UgeworCSAgICBwX2V4dF9jYXAtPnRkbHNfY2hhbm5lbF9zd2l0Y2hpbmcgPSAwOworCSAgICBwX2V4dF9jYXAtPnRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQgPSBURExTX0NIX1NXSVRDSF9QUk9ISUJJVEVEOworCX0KKwlwX2V4dF9jYXAtPnRkbHNfc3VwcG9ydCA9IFRETFNfU1VQUE9SVDsKKwlwX2V4dF9jYXAtPnRkbHNfcHJvaGliaXRlZCA9IFRETFNfUFJPSElCSVRFRDsKKworCWV4dENhcGFiaWxpdHktPnByZXNlbnQgPSAxOworCS8qIEZvciBTVEEgY2FzZXMgd2UgYWx3YXN5IHN1cHBvcnQgMTFtYyAtIEFsbG93IE1BWCBsZW5ndGggKi8KKwlleHRDYXBhYmlsaXR5LT5udW1fYnl0ZXMgPSBET1QxMUZfSUVfRVhUQ0FQX01BWF9MRU47CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3Nfc21lX3RkbHNfbWdtdF9zZW5kX3JlcSgpIC0gc2VuZCBvdXQgdGRscyBtYW5hZ2VtZW50IGZyYW1lcworICoKKyAqIEBtYWNfY3R4IC0gZ2xvYmFsIG1hYyBjb250ZXh0CisgKiBAbXNnIC0gbWVzc2FnZSBidWZmZXIgcmVjZWl2ZWQgZnJvbSBTTUUuCisgKgorICogUHJvY2VzcyBTZW5kIE1nbXQgUmVxdWVzdCBmcm9tIFNNRSBhbmQgdHJhbnNtaXQgdG8gQVAuCisgKgorICogUmV0dXJuOiBlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqLwordFNpclJldFN0YXR1cyBsaW1fcHJvY2Vzc19zbWVfdGRsc19tZ210X3NlbmRfcmVxKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJCQkgdWludDMyX3QgKm1zZykKK3sKKwkvKiBnZXQgYWxsIGRpc2NvdmVyeSByZXF1ZXN0IHBhcmFtZXRlcnMgKi8KKwl0U2lyVGRsc1NlbmRNZ210UmVxICpzZW5kX3JlcSA9ICh0U2lyVGRsc1NlbmRNZ210UmVxICopIG1zZzsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5OworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsKKwl0U2lyUmVzdWx0Q29kZXMgcmVzdWx0X2NvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJTZW5kIE1nbXQgUmVjaWV2ZWQiKSk7CisJc2Vzc2lvbl9lbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChtYWNfY3R4LAorCQkJCQkJIHNlbmRfcmVxLT5ic3NpZCwgJnNlc3Npb25faWQpOworCWlmIChOVUxMID09IHNlc3Npb25fZW50cnkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlBFIFNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNtZSBzZXNzaW9uX2lkICVkIiksCisJCQlzZW5kX3JlcS0+c2Vzc2lvbklkKTsKKwkJZ290byBsaW1fdGRsc19zZW5kX21nbXRfZXJyb3I7CisJfQorCisJLyogY2hlY2sgaWYgd2UgYXJlIGluIHByb3BlciBzdGF0ZSB0byB3b3JrIGFzIFRETFMgY2xpZW50ICovCisJaWYgKCFMSU1fSVNfU1RBX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInNlbmQgbWdtdCByZWNlaXZlZCBpbiB3cm9uZyBzeXN0ZW0gUm9sZSAlZCIpLAorCQkJICBHRVRfTElNX1NZU1RFTV9ST0xFKHNlc3Npb25fZW50cnkpKTsKKwkJZ290byBsaW1fdGRsc19zZW5kX21nbXRfZXJyb3I7CisJfQorCisJLyoKKwkgKiBpZiB3ZSBhcmUgc3RpbGwgZ29vZCwgZ28gYWhlYWQgYW5kIGNoZWNrIGlmIHdlIGFyZSBpbiBwcm9wZXIgc3RhdGUgdG8KKwkgKiBkbyBURExTIGRpc2NvdmVyeSByZXEvcnNwLy4uLi5mcmFtZXMuCisJICovCisJaWYgKChzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFKSAmJgorCSAgICAoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJzZW5kIG1nbXQgcmVjZWl2ZWQgaW4gaW52YWxpZCBMSU1zbWUgc3RhdGUgKCVkKSIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpOworCQlnb3RvIGxpbV90ZGxzX3NlbmRfbWdtdF9lcnJvcjsKKwl9CisKKwlzd2l0Y2ggKHNlbmRfcmVxLT5yZXFUeXBlKSB7CisJY2FzZSBTSVJfTUFDX1RETFNfRElTX1JFUToKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiVHJhbnNtaXQgRGlzY292ZXJ5IFJlcXVlc3QgRnJhbWUiKSk7CisJCS8qIGZvcm1hdCBURExTIGRpc2NvdmVyeSByZXF1ZXN0IGZyYW1lIGFuZCB0cmFuc21pdCBpdCAqLworCQlsaW1fc2VuZF90ZGxzX2Rpc19yZXFfZnJhbWUobWFjX2N0eCwgc2VuZF9yZXEtPnBlZXJNYWMsCisJCQkJCSAgICBzZW5kX3JlcS0+ZGlhbG9nLCBzZXNzaW9uX2VudHJ5KTsKKwkJcmVzdWx0X2NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfVERMU19ESVNfUlNQOgorCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJUcmFuc21pdCBEaXNjb3ZlcnkgUmVzcG9uc2UgRnJhbWUiKSk7CisJCS8qIFNlbmQgYSByZXNwb25zZSBtZ210IGFjdGlvbiBmcmFtZSAqLworCQlsaW1fc2VuZF90ZGxzX2Rpc19yc3BfZnJhbWUobWFjX2N0eCwgc2VuZF9yZXEtPnBlZXJNYWMsCisJCQlzZW5kX3JlcS0+ZGlhbG9nLCBzZXNzaW9uX2VudHJ5LCAmc2VuZF9yZXEtPmFkZEllWzBdLAorCQkJKHNlbmRfcmVxLT5sZW5ndGggLSBzaXplb2YodFNpclRkbHNTZW5kTWdtdFJlcSkpKTsKKwkJcmVzdWx0X2NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfVERMU19TRVRVUF9SRVE6CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlRyYW5zbWl0IFNldHVwIFJlcXVlc3QgRnJhbWUiKSk7CisJCWxpbV9zZW5kX3RkbHNfbGlua19zZXR1cF9yZXFfZnJhbWUobWFjX2N0eCwKKwkJCXNlbmRfcmVxLT5wZWVyTWFjLCBzZW5kX3JlcS0+ZGlhbG9nLCBzZXNzaW9uX2VudHJ5LAorCQkJJnNlbmRfcmVxLT5hZGRJZVswXSwKKwkJCShzZW5kX3JlcS0+bGVuZ3RoIC0gc2l6ZW9mKHRTaXJUZGxzU2VuZE1nbXRSZXEpKSk7CisJCXJlc3VsdF9jb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1RETFNfU0VUVVBfUlNQOgorCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJUcmFuc21pdCBTZXR1cCBSZXNwb25zZSBGcmFtZSIpKTsKKwkJbGltX3NlbmRfdGRsc19zZXR1cF9yc3BfZnJhbWUobWFjX2N0eCwKKwkJCXNlbmRfcmVxLT5wZWVyTWFjLCBzZW5kX3JlcS0+ZGlhbG9nLCBzZXNzaW9uX2VudHJ5LAorCQkJc2VuZF9yZXEtPnN0YXR1c0NvZGUsICZzZW5kX3JlcS0+YWRkSWVbMF0sCisJCQkoc2VuZF9yZXEtPmxlbmd0aCAtIHNpemVvZih0U2lyVGRsc1NlbmRNZ210UmVxKSkpOworCQlyZXN1bHRfY29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19URExTX1NFVFVQX0NORjoKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiVHJhbnNtaXQgU2V0dXAgQ29uZmlybSBGcmFtZSIpKTsKKwkJbGltX3NlbmRfdGRsc19saW5rX3NldHVwX2NuZl9mcmFtZShtYWNfY3R4LAorCQkJc2VuZF9yZXEtPnBlZXJNYWMsIHNlbmRfcmVxLT5kaWFsb2csCisJCQlzZW5kX3JlcS0+cGVlckNhcGFiaWxpdHksIHNlc3Npb25fZW50cnksCisJCQkmc2VuZF9yZXEtPmFkZEllWzBdLAorCQkJKHNlbmRfcmVxLT5sZW5ndGggLSBzaXplb2YodFNpclRkbHNTZW5kTWdtdFJlcSkpKTsKKwkJcmVzdWx0X2NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfVERMU19URUFSRE9XTjoKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiVHJhbnNtaXQgVGVhcmRvd24gRnJhbWUiKSk7CisJCWxpbV9zZW5kX3RkbHNfdGVhcmRvd25fZnJhbWUobWFjX2N0eCwKKwkJCXNlbmRfcmVxLT5wZWVyTWFjLCBzZW5kX3JlcS0+c3RhdHVzQ29kZSwKKwkJCXNlbmRfcmVxLT5yZXNwb25kZXIsIHNlc3Npb25fZW50cnksCisJCQkmc2VuZF9yZXEtPmFkZEllWzBdLAorCQkJKHNlbmRfcmVxLT5sZW5ndGggLSBzaXplb2YodFNpclRkbHNTZW5kTWdtdFJlcSkpKTsKKwkJcmVzdWx0X2NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfVERMU19QRUVSX1RSQUZGSUNfSU5EOgorCQlicmVhazsKKwljYXNlIFNJUl9NQUNfVERMU19DSF9TV0lUQ0hfUkVROgorCQlicmVhazsKKwljYXNlIFNJUl9NQUNfVERMU19DSF9TV0lUQ0hfUlNQOgorCQlicmVhazsKKwljYXNlIFNJUl9NQUNfVERMU19QRUVSX1RSQUZGSUNfUlNQOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKK2xpbV90ZGxzX3NlbmRfbWdtdF9lcnJvcjoKKwlsaW1fc2VuZF9zbWVfcnNwKG1hY19jdHgsIGVXTklfU01FX1RETFNfU0VORF9NR01UX1JTUCwKKwkJCSByZXN1bHRfY29kZSwgc2VuZF9yZXEtPnNlc3Npb25JZCwKKwkJCSBzZW5kX3JlcS0+dHJhbnNhY3Rpb25JZCk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKgorICogU2VuZCBSZXNwb25zZSB0byBMaW5rIEVzdGFibGlzaCBSZXF1ZXN0IHRvIFNNRQorICovCit2b2lkIGxpbV9zZW5kX3NtZV90ZGxzX2xpbmtfZXN0YWJsaXNoX3JlcV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQsIHRTaXJNYWNBZGRyIHBlZXJNYWMsCisJCQkJCSAgICAgIHREcGhIYXNoTm9kZSAqcFN0YURzLCB1aW50OF90IHN0YXR1cykKK3sKKwl0U2lyTXNnUSBtbWhNc2cgPSB7IDAgfTsKKworCXRTaXJUZGxzTGlua0VzdGFibGlzaFJlcVJzcCAqcFRkbHNMaW5rRXN0YWJsaXNoUmVxUnNwID0gTlVMTDsKKworCXBUZGxzTGlua0VzdGFibGlzaFJlcVJzcCA9CisJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyVGRsc0xpbmtFc3RhYmxpc2hSZXFSc3ApKTsKKwlpZiAoTlVMTCA9PSBwVGRsc0xpbmtFc3RhYmxpc2hSZXFSc3ApIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTsKKwkJcmV0dXJuOworCX0KKwlwVGRsc0xpbmtFc3RhYmxpc2hSZXFSc3AtPnN0YXR1c0NvZGUgPSBzdGF0dXM7CisJaWYgKHBlZXJNYWMpIHsKKwkJY2RmX21lbV9jb3B5KHBUZGxzTGlua0VzdGFibGlzaFJlcVJzcC0+cGVlck1hYywgcGVlck1hYywKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJfQorCXBUZGxzTGlua0VzdGFibGlzaFJlcVJzcC0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCW1taE1zZy50eXBlID0gZVdOSV9TTUVfVERMU19MSU5LX0VTVEFCTElTSF9SU1A7CisJbW1oTXNnLmJvZHlwdHIgPSBwVGRsc0xpbmtFc3RhYmxpc2hSZXFSc3A7CisJbW1oTXNnLmJvZHl2YWwgPSAwOworCWxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisJcmV0dXJuOworCit9CisKKy8qCisgKiBPbmNlIGxpbmsgaXMgdGVhcmRvd24sIHNlbmQgRGVsIFBlZXIgSW5kIHRvIFNNRQorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBsaW1fc2VuZF9zbWVfdGRsc19kZWxfc3RhX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCQl0U2lyTWFjQWRkciBwZWVyTWFjLAorCQkJCQkJdERwaEhhc2hOb2RlICpwU3RhRHMsIHVpbnQ4X3Qgc3RhdHVzKQoreworCXRTaXJNc2dRIG1taE1zZyA9IHsgMCB9OworCXRTaXJUZGxzRGVsU3RhUnNwICpwRGVsU3RhID0gTlVMTDsKKwltbWhNc2cudHlwZSA9IGVXTklfU01FX1RETFNfREVMX1NUQV9SU1A7CisKKwlwRGVsU3RhID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJUZGxzRGVsU3RhUnNwKSk7CisJaWYgKE5VTEwgPT0gcERlbFN0YSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCXBEZWxTdGEtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwlwRGVsU3RhLT5zdGF0dXNDb2RlID0gc3RhdHVzOworCWlmIChwU3RhRHMpIHsKKwkJcERlbFN0YS0+c3RhSWQgPSBwU3RhRHMtPnN0YUluZGV4OworCX0gZWxzZQorCQlwRGVsU3RhLT5zdGFJZCA9IFNUQV9JTlZBTElEX0lEWDsKKworCWlmIChwZWVyTWFjKSB7CisJCWNkZl9tZW1fY29weShwRGVsU3RhLT5wZWVyTWFjLCBwZWVyTWFjLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwl9CisKKwlwRGVsU3RhLT5sZW5ndGggPSBzaXplb2YodFNpclRkbHNEZWxTdGFSc3ApOworCXBEZWxTdGEtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfVERMU19ERUxfU1RBX1JTUDsKKworCW1taE1zZy5ib2R5cHRyID0gcERlbFN0YTsKKworCW1taE1zZy5ib2R5dmFsID0gMDsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworLyoKKyAqIFByb2Nlc3MgU2VuZCBNZ210IFJlcXVlc3QgZnJvbSBTTUUgYW5kIHRyYW5zbWl0IHRvIEFQLgorICovCit0U2lyUmV0U3RhdHVzIGxpbV9wcm9jZXNzX3NtZV90ZGxzX2FkZF9zdGFfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB1aW50MzJfdCAqcE1zZ0J1ZikKK3sKKwkvKiBnZXQgYWxsIGRpc2NvdmVyeSByZXF1ZXN0IHBhcmFtZXRlcnMgKi8KKwl0U2lyVGRsc0FkZFN0YVJlcSAqcEFkZFN0YVJlcSA9ICh0U2lyVGRsc0FkZFN0YVJlcSAqKSBwTXNnQnVmOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisJdWludDhfdCBzZXNzaW9uSWQ7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJURExTIEFkZCBTVEEgUmVxdWVzdCBSZWNpZXZlZCIpKTsKKwlwc2Vzc2lvbkVudHJ5ID0KKwkJcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsIHBBZGRTdGFSZXEtPmJzc2lkLCAmc2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKAorCQkJICAgIlBFIFNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNtZSBzZXNzaW9uSWQgJWQiCisJCQkgICksCisJCQlwQWRkU3RhUmVxLT5zZXNzaW9uSWQpOworCQlnb3RvIGxpbV90ZGxzX2FkZF9zdGFfZXJyb3I7CisJfQorCisJLyogY2hlY2sgaWYgd2UgYXJlIGluIHByb3BlciBzdGF0ZSB0byB3b3JrIGFzIFRETFMgY2xpZW50ICovCisJaWYgKCFMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgInNlbmQgbWdtdCByZWNlaXZlZCBpbiB3cm9uZyBzeXN0ZW0gUm9sZSAlZCIsCisJCQkgIEdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSkpOworCQlnb3RvIGxpbV90ZGxzX2FkZF9zdGFfZXJyb3I7CisJfQorCisJLyoKKwkgKiBpZiB3ZSBhcmUgc3RpbGwgZ29vZCwgZ28gYWhlYWQgYW5kIGNoZWNrIGlmIHdlIGFyZSBpbiBwcm9wZXIgc3RhdGUgdG8KKwkgKiBkbyBURExTIGRpc2NvdmVyeSByZXEvcnNwLy4uLi5mcmFtZXMuCisJICovCisJaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFKSAmJgorCSAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpKSB7CisKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInNlbmQgbWdtdCByZWNlaXZlZCBpbiBpbnZhbGlkIExJTXNtZSBzdGF0ZSAoJWQpIiksCisJCQlwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSk7CisJCWdvdG8gbGltX3RkbHNfYWRkX3N0YV9lcnJvcjsKKwl9CisKKwlwTWFjLT5saW0uZ0xpbUFkZFN0YVRkbHMgPSB0cnVlOworCisJLyogVG8gc3RhcnQgd2l0aCwgc2VuZCBhZGQgU1RBIHJlcXVlc3QgdG8gSEFMICovCisJaWYgKGVTSVJfRkFJTFVSRSA9PSBsaW1fdGRsc19zZXR1cF9hZGRfc3RhKHBNYWMsIHBBZGRTdGFSZXEsIHBzZXNzaW9uRW50cnkpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJBZGQgVERMUyBTdGF0aW9uIHJlcXVlc3QgZmFpbGVkIikpOworCQlnb3RvIGxpbV90ZGxzX2FkZF9zdGFfZXJyb3I7CisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7CitsaW1fdGRsc19hZGRfc3RhX2Vycm9yOgorCWxpbV9zZW5kX3NtZV90ZGxzX2FkZF9zdGFfcnNwKHBNYWMsCisJCQkJICAgICAgcEFkZFN0YVJlcS0+c2Vzc2lvbklkLCBwQWRkU3RhUmVxLT5wZWVyTWFjLAorCQkJCSAgICAgIChwQWRkU3RhUmVxLT50ZGxzQWRkT3BlciA9PSBURExTX09QRVJfVVBEQVRFKSwKKwkJCQkgICAgICBOVUxMLCBlU0lSX0ZBSUxVUkUpOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoKKyAqIFByb2Nlc3MgRGVsIFN0YSBSZXF1ZXN0IGZyb20gU01FIC4KKyAqLwordFNpclJldFN0YXR1cyBsaW1fcHJvY2Vzc19zbWVfdGRsc19kZWxfc3RhX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICAgdWludDMyX3QgKnBNc2dCdWYpCit7CisJLyogZ2V0IGFsbCBkaXNjb3ZlcnkgcmVxdWVzdCBwYXJhbWV0ZXJzICovCisJdFNpclRkbHNEZWxTdGFSZXEgKnBEZWxTdGFSZXEgPSAodFNpclRkbHNEZWxTdGFSZXEgKikgcE1zZ0J1ZjsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXRwRHBoSGFzaE5vZGUgcFN0YURzID0gTlVMTDsKKworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlRETFMgRGVsZXRlIFNUQSBSZXF1ZXN0IFJlY2lldmVkIikpOworCXBzZXNzaW9uRW50cnkgPQorCQlwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywgcERlbFN0YVJlcS0+YnNzaWQsICZzZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoCisJCQkgICAiUEUgU2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc21lIHNlc3Npb25JZCAlZCIKKwkJCSAgKSwKKwkJCXBEZWxTdGFSZXEtPnNlc3Npb25JZCk7CisJCWxpbV9zZW5kX3NtZV90ZGxzX2RlbF9zdGFfcnNwKHBNYWMsIHBEZWxTdGFSZXEtPnNlc3Npb25JZCwKKwkJCQkJICAgICAgcERlbFN0YVJlcS0+cGVlck1hYywgTlVMTCwKKwkJCQkJICAgICAgZVNJUl9GQUlMVVJFKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwkvKiBjaGVjayBpZiB3ZSBhcmUgaW4gcHJvcGVyIHN0YXRlIHRvIHdvcmsgYXMgVERMUyBjbGllbnQgKi8KKwlpZiAoIUxJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiRGVsIHN0YSByZWNlaXZlZCBpbiB3cm9uZyBzeXN0ZW0gUm9sZSAlZCIsCisJCQkgIEdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSkpOworCQlnb3RvIGxpbV90ZGxzX2RlbF9zdGFfZXJyb3I7CisJfQorCisJLyoKKwkgKiBpZiB3ZSBhcmUgc3RpbGwgZ29vZCwgZ28gYWhlYWQgYW5kIGNoZWNrIGlmIHdlIGFyZSBpbiBwcm9wZXIgc3RhdGUgdG8KKwkgKiBkbyBURExTIGRpc2NvdmVyeSByZXEvcnNwLy4uLi5mcmFtZXMuCisJICovCisJaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFKSAmJgorCSAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpKSB7CisKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkRlbCBTdGEgcmVjZWl2ZWQgaW4gaW52YWxpZCBMSU1zbWUgc3RhdGUgKCVkKSIpLAorCQkJcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworCQlnb3RvIGxpbV90ZGxzX2RlbF9zdGFfZXJyb3I7CisJfQorCisJcFN0YURzID0gbGltX3RkbHNfZGVsX3N0YShwTWFjLCBwRGVsU3RhUmVxLT5wZWVyTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworCS8qIG5vdyBzZW5kIGluZGljYXRpb24gdG8gU01FLS0+SERELT5UTCB0byByZW1vdmUgU1RBIGZyb20gVEwgKi8KKworCWlmIChwU3RhRHMpIHsKKwkJbGltX3NlbmRfc21lX3RkbHNfZGVsX3N0YV9yc3AocE1hYywgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLAorCQkJCQkgICAgICBwRGVsU3RhUmVxLT5wZWVyTWFjLCBwU3RhRHMsCisJCQkJCSAgICAgIGVTSVJfU1VDQ0VTUyk7CisJCWxpbV9yZWxlYXNlX3BlZXJfaWR4KHBNYWMsIHBTdGFEcy0+YXNzb2NJZCwgcHNlc3Npb25FbnRyeSk7CisKKwkJLyogQ2xlYXIgdGhlIGFpZCBpbiBwZWVyQUlEQml0bWFwIGFzIHRoaXMgYWlkIGlzIG5vdyBpbiBmcmVlcG9vbCAqLworCQlDTEVBUl9QRUVSX0FJRF9CSVRNQVAocHNlc3Npb25FbnRyeS0+cGVlckFJREJpdG1hcCwKKwkJCQkgICAgICBwU3RhRHMtPmFzc29jSWQpOworCQlsaW1fZGVsZXRlX2RwaF9oYXNoX2VudHJ5KHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgcFN0YURzLT5hc3NvY0lkLAorCQkJCQkgIHBzZXNzaW9uRW50cnkpOworCisJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKKwl9CisKK2xpbV90ZGxzX2RlbF9zdGFfZXJyb3I6CisJbGltX3NlbmRfc21lX3RkbHNfZGVsX3N0YV9yc3AocE1hYywgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLAorCQkJCSAgICAgIHBEZWxTdGFSZXEtPnBlZXJNYWMsIE5VTEwsIGVTSVJfRkFJTFVSRSk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiBJbnRlcnNlY3RzIHRoZSB0d28gaW5wdXQgYXJyYXlzIGFuZCBvdXRwdXRzIGFuIGFycmF5ICovCisvKiBGb3Igbm93IHRoZSBhcnJheSBsZW5ndGggb2YgdWludDhfdCBzdWZmaWNlcyAqLworc3RhdGljIHZvaWQgbGltX3RkbHNfZ2V0X2ludGVyc2VjdGlvbih1aW50OF90ICppbnB1dF9hcnJheTEsCisJCQkJICAgICAgdWludDhfdCBpbnB1dDFfbGVuZ3RoLAorCQkJCSAgICAgIHVpbnQ4X3QgKmlucHV0X2FycmF5MiwKKwkJCQkgICAgICB1aW50OF90IGlucHV0Ml9sZW5ndGgsCisJCQkJICAgICAgdWludDhfdCAqb3V0cHV0X2FycmF5LAorCQkJCSAgICAgIHVpbnQ4X3QgKm91dHB1dF9sZW5ndGgpCit7CisJdWludDhfdCBpLCBqLCBrID0gMCwgZmxhZyA9IDA7CisJZm9yIChpID0gMDsgaSA8IGlucHV0MV9sZW5ndGg7IGkrKykgeworCQlmbGFnID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IGlucHV0Ml9sZW5ndGg7IGorKykgeworCQkJaWYgKGlucHV0X2FycmF5MVtpXSA9PSBpbnB1dF9hcnJheTJbal0pIHsKKwkJCQlmbGFnID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZmxhZyA9PSAxKSB7CisJCQlvdXRwdXRfYXJyYXlba10gPSBpbnB1dF9hcnJheTFbaV07CisJCQlrKys7CisJCX0KKwl9CisJKm91dHB1dF9sZW5ndGggPSBrOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX3NtZV90ZGxzX2xpbmtfZXN0YWJsaXNoX3JlcSgpIC0gcHJvY2VzcyB0ZGxzIGxpbmsgZXN0YWJsaXNobWVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QKKyAqCisgKiBAbWFjX2N0eCAtIGdsb2JhbCBNQUMgY29udGV4dAorICogQG1zZ19idWYgLSBtZXNzYWdlIGJ1ZmZlciBmcm9tIFNNRQorICoKKyAqIFByb2Nlc3MgTGluayBFc3RhYmxpc2htZW50IFJlcXVlc3QgZnJvbSBTTUUKKyAqCisgKiBSZXR1cm46IGVTSVJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBmYWlsdXJlIGNvZGUgb3RoZXJ3aXNlLgorICovCit0U2lyUmV0U3RhdHVzIGxpbV9wcm9jZXNzX3NtZV90ZGxzX2xpbmtfZXN0YWJsaXNoX3JlcSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQkJICAgICB1aW50MzJfdCAqbXNnX2J1ZikKK3sKKwkvKiBnZXQgYWxsIGRpc2NvdmVyeSByZXF1ZXN0IHBhcmFtZXRlcnMgKi8KKwl0U2lyVGRsc0xpbmtFc3RhYmxpc2hSZXEgKnRkbHNfcmVxID0KKwkJKHRTaXJUZGxzTGlua0VzdGFibGlzaFJlcSAqKSBtc2dfYnVmOworCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnk7CisJdWludDhfdCBzZXNzaW9uX2lkOworCXRwVGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMgdGRsc19yZXFfcGFyYW1zOworCXRTaXJNc2dRIG1zZzsKKwl1aW50MTZfdCBwZWVyX2lkeCA9IDA7CisJdHBEcGhIYXNoTm9kZSBzdGFkcyA9IE5VTEw7CisJdWludDMyX3Qgc2VsZl9udW1fY2hhbiA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKwl1aW50OF90IHNlbGZfc3VwcF9jaGFuW1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgRkwoIlNlbmQgTWdtdCBSZWNpZXZlZCIpKTsKKworCXNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQobWFjX2N0eCwgdGRsc19yZXEtPmJzc2lkLAorCQkJCQkJICZzZXNzaW9uX2lkKTsKKwlpZiAoTlVMTCA9PSBzZXNzaW9uX2VudHJ5KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJQRSBTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBzbWUgc2Vzc2lvbl9pZCAlZCIpLAorCQkJICB0ZGxzX3JlcS0+c2Vzc2lvbklkKTsKKwkJbGltX3NlbmRfc21lX3RkbHNfbGlua19lc3RhYmxpc2hfcmVxX3JzcChtYWNfY3R4LAorCQkJdGRsc19yZXEtPnNlc3Npb25JZCwgdGRsc19yZXEtPnBlZXJNYWMsIE5VTEwsCisJCQllU0lSX0ZBSUxVUkUpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCS8qIGNoZWNrIGlmIHdlIGFyZSBpbiBwcm9wZXIgc3RhdGUgdG8gd29yayBhcyBURExTIGNsaWVudCAqLworCWlmICghTElNX0lTX1NUQV9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJURExTIExpbmsgRXN0YWJsaXNoIFJlcXVlc3QgcmVjZWl2ZWQgaW4gd3Jvbmcgc3lzdGVtIFJvbGUgJWQiKSwKKwkJCSAgR0VUX0xJTV9TWVNURU1fUk9MRShzZXNzaW9uX2VudHJ5KSk7CisJCWdvdG8gbGltX3RkbHNfbGlua19lc3RhYmxpc2hfZXJyb3I7CisJfQorCisJLyoKKwkgKiBpZiB3ZSBhcmUgc3RpbGwgZ29vZCwgZ28gYWhlYWQgYW5kIGNoZWNrIGlmIHdlIGFyZSBpbiBwcm9wZXIgc3RhdGUgdG8KKwkgKiBkbyBURExTIGRpc2NvdmVyeSByZXEvcnNwLy4uLi5mcmFtZXMuCisJICovCisJaWYgKChzZXNzaW9uX2VudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFKSAmJgorCSAgICAoc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJURExTIExpbmsgRXN0YWJsaXNoIFJlcXVlc3QgcmVjZWl2ZWQgaW4gaW52YWxpZCBMSU1zbWUgc3RhdGUgKCVkKSIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUpOworCQlnb3RvIGxpbV90ZGxzX2xpbmtfZXN0YWJsaXNoX2Vycm9yOworCX0KKworCXN0YWRzID0gZHBoX2xvb2t1cF9oYXNoX2VudHJ5KG1hY19jdHgsIHRkbHNfcmVxLT5wZWVyTWFjLCAmcGVlcl9pZHgsCisJCQkJICAgICAgJnNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWlmIChOVUxMID09IHN0YWRzKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoInN0YWRzIGlzIE5VTEwiKSk7CisJCWdvdG8gbGltX3RkbHNfbGlua19lc3RhYmxpc2hfZXJyb3I7CisJfQorCXRkbHNfcmVxX3BhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0VGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSB0ZGxzX3JlcV9wYXJhbXMpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgVERMUyBMaW5rIEVzdGFibGlzaCBSZXF1ZXN0IikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHRkbHNfcmVxX3BhcmFtcywKKwkJICAgIHNpemVvZih0VGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMpLCAwKTsKKworCXRkbHNfcmVxX3BhcmFtcy0+c3RhSWR4ID0gc3RhZHMtPnN0YUluZGV4OworCXRkbHNfcmVxX3BhcmFtcy0+aXNSZXNwb25kZXIgPSB0ZGxzX3JlcS0+aXNSZXNwb25kZXI7CisJdGRsc19yZXFfcGFyYW1zLT51YXBzZFF1ZXVlcyA9IHRkbHNfcmVxLT51YXBzZFF1ZXVlczsKKwl0ZGxzX3JlcV9wYXJhbXMtPm1heFNwID0gdGRsc19yZXEtPm1heFNwOworCXRkbHNfcmVxX3BhcmFtcy0+aXNCdWZzdGEgPSB0ZGxzX3JlcS0+aXNCdWZTdGE7CisJdGRsc19yZXFfcGFyYW1zLT5pc09mZkNoYW5uZWxTdXBwb3J0ZWQgPQorCQl0ZGxzX3JlcS0+aXNPZmZDaGFubmVsU3VwcG9ydGVkOworCisJaWYgKDAgPT0gdGRsc19yZXEtPnN1cHBvcnRlZENoYW5uZWxzTGVuKQorCQlnb3RvIHNlbmRfdGRsc19lc3RhYmxpc2hfcmVxdWVzdDsKKworCWlmICh3bGFuX2NmZ19nZXRfc3RyKG1hY19jdHgsIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNULAorCQkJICAgICBzZWxmX3N1cHBfY2hhbiwKKwkJCSAgICAgJnNlbGZfbnVtX2NoYW4pICE9IGVTSVJfU1VDQ0VTUykgeworCQkvKioKKwkJICogQ291bGQgbm90IGdldCBWYWxpZCBjaGFubmVsIGxpc3QgZnJvbSBDRkcuCisJCSAqIExvZyBlcnJvci4KKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgVmFsaWQgY2hhbm5lbCBsaXN0IikpOworCX0KKworCWlmIChzZWxmX251bV9jaGFuID4gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJDaGFubmVsIExpc3QgbW9yZSB0aGFuIFZhbGlkIENoYW5uZWwgbGlzdCIpKTsKKwkJc2VsZl9udW1fY2hhbiA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKwl9CisKKwlpZiAodGRsc19yZXEtPnN1cHBvcnRlZENoYW5uZWxzTGVuID4gU0lSX01BQ19NQVhfU1VQUF9DSEFOTkVMUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiQ2hhbm5lbCBMaXN0IGlzIG1vcmUgdGhhbiB0aGUgc3VwcG9ydGVkIENoYW5uZWwgbGlzdCIpKTsKKwkJdGRsc19yZXEtPnN1cHBvcnRlZENoYW5uZWxzTGVuID0gU0lSX01BQ19NQVhfU1VQUF9DSEFOTkVMUzsKKwl9CisKKwlsaW1fdGRsc19nZXRfaW50ZXJzZWN0aW9uKHNlbGZfc3VwcF9jaGFuLCBzZWxmX251bV9jaGFuLAorCQl0ZGxzX3JlcS0+c3VwcG9ydGVkQ2hhbm5lbHMsIHRkbHNfcmVxLT5zdXBwb3J0ZWRDaGFubmVsc0xlbiwKKwkJdGRsc19yZXFfcGFyYW1zLT52YWxpZENoYW5uZWxzLAorCQkmdGRsc19yZXFfcGFyYW1zLT52YWxpZENoYW5uZWxzTGVuKTsKKworc2VuZF90ZGxzX2VzdGFibGlzaF9yZXF1ZXN0OgorCWNkZl9tZW1fY29weSh0ZGxzX3JlcV9wYXJhbXMtPnZhbGlkT3BlckNsYXNzZXMsCisJCSAgICAgdGRsc19yZXEtPnN1cHBvcnRlZE9wZXJDbGFzc2VzLAorCQkgICAgIHRkbHNfcmVxLT5zdXBwb3J0ZWRPcGVyQ2xhc3Nlc0xlbik7CisJdGRsc19yZXFfcGFyYW1zLT52YWxpZE9wZXJDbGFzc2VzTGVuID0KKwkJCXRkbHNfcmVxLT5zdXBwb3J0ZWRPcGVyQ2xhc3Nlc0xlbjsKKworCW1zZy50eXBlID0gV01BX1NFVF9URExTX0xJTktfRVNUQUJMSVNIX1JFUTsKKwltc2cucmVzZXJ2ZWQgPSAwOworCW1zZy5ib2R5cHRyID0gdGRsc19yZXFfcGFyYW1zOworCW1zZy5ib2R5dmFsID0gMDsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHdtYV9wb3N0X2N0cmxfbXNnKG1hY19jdHgsICZtc2cpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoImhhbFBvc3RNc2dBcGkgZmFpbGVkIikpOworCQlnb3RvIGxpbV90ZGxzX2xpbmtfZXN0YWJsaXNoX2Vycm9yOworCX0KKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCitsaW1fdGRsc19saW5rX2VzdGFibGlzaF9lcnJvcjoKKwlsaW1fc2VuZF9zbWVfdGRsc19saW5rX2VzdGFibGlzaF9yZXFfcnNwKG1hY19jdHgsCisJCXNlc3Npb25fZW50cnktPnNtZVNlc3Npb25JZCwgdGRsc19yZXEtPnBlZXJNYWMsIE5VTEwsCisJCWVTSVJfRkFJTFVSRSk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKioKKyAqIGxpbV9kZWxldGVfdGRsc19wZWVycygpIC0gZGVsZXRlIHRkbHMgcGVlcnMKKyAqCisgKiBAbWFjX2N0eCAtIGdsb2JhbCBNQUMgY29udGV4dAorICogQHNlc3Npb25fZW50cnkgLSBQRSBzZXNzaW9uIGVudHJ5CisgKgorICogRGVsZXRlIGFsbCB0aGUgVERMUyBwZWVyIGNvbm5lY3RlZCBiZWZvcmUgbGVhdmluZyB0aGUgQlNTCisgKgorICogUmV0dXJuOiBlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqLwordFNpclJldFN0YXR1cyBsaW1fZGVsZXRlX3RkbHNfcGVlcnModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgICAgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSkKK3sKKwl0cERwaEhhc2hOb2RlIHN0YWRzID0gTlVMTDsKKwlpbnQgaSwgYWlkOworCXNpemVfdCBhaWRfYml0bWFwX3NpemUgPSBzaXplb2Yoc2Vzc2lvbl9lbnRyeS0+cGVlckFJREJpdG1hcCk7CisKKwlpZiAoTlVMTCA9PSBzZXNzaW9uX2VudHJ5KSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIk5VTEwgc2Vzc2lvbl9lbnRyeSIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGFsbCB0aGUgc2V0IGJpdCBpbiBwZWVyQUlEQml0bWFwIGFuZCBkZWxldGUgdGhlIHBlZXIKKwkgKiAod2l0aCB0aGF0IGFpZCkgZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZSBhbmQgYWRkIHRoZSBhaWQKKwkgKiBpbiBmcmVlIHBvb2wKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWlkX2JpdG1hcF9zaXplIC8gc2l6ZW9mKHVpbnQzMl90KTsgaSsrKSB7CisJCWZvciAoYWlkID0gMDsgYWlkIDwgKHNpemVvZih1aW50MzJfdCkgPDwgMyk7IGFpZCsrKSB7CisJCQlpZiAoIUNIRUNLX0JJVChzZXNzaW9uX2VudHJ5LT5wZWVyQUlEQml0bWFwW2ldLCBhaWQpKQorCQkJCWNvbnRpbnVlOworCQkJc3RhZHMgPSBkcGhfZ2V0X2hhc2hfZW50cnkobWFjX2N0eCwKKwkJCQkJKGFpZCArIGkgKiAoc2l6ZW9mKHVpbnQzMl90KSA8PCAzKSksCisJCQkJCSZzZXNzaW9uX2VudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworCQkJaWYgKE5VTEwgIT0gc3RhZHMpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJEZWxldGluZyAiTUFDX0FERFJFU1NfU1RSKSwKKwkJCQkJTUFDX0FERFJfQVJSQVkoc3RhZHMtPnN0YUFkZHIpKTsKKworCQkJCWxpbV9zZW5kX2RlYXV0aF9tZ210X2ZyYW1lKG1hY19jdHgsCisJCQkJCWVTSVJfTUFDX0RFQVVUSF9MRUFWSU5HX0JTU19SRUFTT04sCisJCQkJCXN0YWRzLT5zdGFBZGRyLCBzZXNzaW9uX2VudHJ5LCBmYWxzZSk7CisJCQkJZHBoX2RlbGV0ZV9oYXNoX2VudHJ5KG1hY19jdHgsCisJCQkJCXN0YWRzLT5zdGFBZGRyLCBzdGFkcy0+YXNzb2NJZCwKKwkJCQkJJnNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQkJfQorCQkJbGltX3JlbGVhc2VfcGVlcl9pZHgobWFjX2N0eCwKKwkJCQkoYWlkICsgaSAqIChzaXplb2YodWludDMyX3QpIDw8IDMpKSwKKwkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJCUNMRUFSX0JJVChzZXNzaW9uX2VudHJ5LT5wZWVyQUlEQml0bWFwW2ldLCBhaWQpOworCQl9CisJfQorCWxpbV9zZW5kX3NtZV90ZGxzX2RlbGV0ZV9hbGxfcGVlcl9pbmQobWFjX2N0eCwgc2Vzc2lvbl9lbnRyeSk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb3BfZXh0c191dGlscy5jIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvcF9leHRzX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNDkwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb3BfZXh0c191dGlscy5jCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBsaW1fcHJvcF9leHRzX3V0aWxzLmNjIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucworICogdG8gcG9wdWxhdGUsIHBhcnNlIHByb3ByaWV0YXJ5IGV4dGVuc2lvbnMgcmVxdWlyZWQgdG8KKyAqIHN1cHBvcnQgQU5JIGZlYXR1cmUgc2V0LgorICoKKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDExLzI3LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgInNpcl9jb21tb24uaCIKKyNpbmNsdWRlICJzaXJfZGVidWcuaCIKKyNpbmNsdWRlICJ1dGlsc19hcGkuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAibGltX2FwaS5oIgorI2luY2x1ZGUgImxpbV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9hc3NvY191dGlscy5oIgorI2luY2x1ZGUgImxpbV9wcm9wX2V4dHNfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VyX2Rlc191dGlscy5oIgorI2luY2x1ZGUgImxpbV90cmFjZS5oIgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSAibGltX2Z0X2RlZnMuaCIKKyNlbmRpZgorI2luY2x1ZGUgImxpbV9zZXNzaW9uLmgiCisjZGVmaW5lIExJTV9HRVRfTk9JU0VfTUFYX1RSWSA1CisvKioKKyAqIGxpbV9leHRyYWN0X2FwX2NhcGFiaWxpdHkoKSAtIGV4dHJhY3QgQVAncyBIQ0YvV01FL1dTTSBjYXBhYmlsaXR5CisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBfaWU6IFBvaW50ZXIgdG8gc3RhcnRpbmcgSUUgaW4gQmVhY29uL1Byb2JlIFJlc3BvbnNlCisgKiBAaWVfbGVuOiBMZW5ndGggb2YgYWxsIElFcyBjb21iaW5lZAorICogQHFvc19jYXA6IEJpdHMgYXJlIHNldCBhY2NvcmRpbmcgdG8gY2FwYWJpbGl0aWVzCisgKiBAcHJvcF9jYXA6IFBvaW50ZXIgdG8gcHJvcCBpbmZvIElFLgorICogQHVhcHNkOiBwb2ludGVyIHRvIHVhcHNkCisgKiBAbG9jYWxfY29uc3RyYWludDogUG9pbnRlciB0byBsb2NhbCBwb3dlciBjb25zdHJhaW50LgorICogQHNlc3Npb246IEEgcG9pbnRlciB0byBzZXNzaW9uIGVudHJ5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGV4dHJhY3QgQVAncyBIQ0YvV01FL1dTTSBjYXBhYmlsaXR5CisgKiBmcm9tIHRoZSBJRXMgcmVjZWl2ZWQgZnJvbSBpdCBpbiBCZWFjb24vUHJvYmUgUmVzcG9uc2UgZnJhbWVzCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQKK2xpbV9leHRyYWN0X2FwX2NhcGFiaWxpdHkodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCAqcF9pZSwKKwl1aW50MTZfdCBpZV9sZW4sIHVpbnQ4X3QgKnFvc19jYXAsIHVpbnQxNl90ICpwcm9wX2NhcCwgdWludDhfdCAqdWFwc2QsCisJdFBvd2VyZEJtICpsb2NhbF9jb25zdHJhaW50LCB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXRTaXJQcm9iZVJlc3BCZWFjb24gKmJlYWNvbl9zdHJ1Y3Q7CisjaWYgIWRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXVpbnQzMl90IGxvY2FsX3Bvd2VyX2NvbnN0cmFpbnRzID0gMDsKKyNlbmRpZgorCXVpbnQzMl90IGVuYWJsZV90eGJmXzIwbWh6OworCXRTaXJSZXRTdGF0dXMgY2ZnX3NldF9zdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisJdFNpclJldFN0YXR1cyBjZmdfZ2V0X3N0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKworCWJlYWNvbl9zdHJ1Y3QgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclByb2JlUmVzcEJlYWNvbikpOworCWlmIChOVUxMID09IGJlYWNvbl9zdHJ1Y3QpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTsKKwkJcmV0dXJuOworCX0KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIGJlYWNvbl9zdHJ1Y3QsIHNpemVvZih0U2lyUHJvYmVSZXNwQmVhY29uKSwgMCk7CisJKnFvc19jYXAgPSAwOworCSpwcm9wX2NhcCA9IDA7CisJKnVhcHNkID0gMDsKKwlsaW1fbG9nKG1hY19jdHgsIExPRzMsCisJCUZMKCJJbiBsaW1fZXh0cmFjdF9hcF9jYXBhYmlsaXR5OiBUaGUgSUUncyBiZWluZyByZWNlaXZlZDoiKSk7CisJc2lyX2R1bXBfYnVmKG1hY19jdHgsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0czLCBwX2llLCBpZV9sZW4pOworCWlmIChzaXJfcGFyc2VfYmVhY29uX2llKG1hY19jdHgsIGJlYWNvbl9zdHJ1Y3QsIHBfaWUsCisJCSh1aW50MzJfdCkgaWVfbGVuKSA9PSBlU0lSX1NVQ0NFU1MpIHsKKwkJaWYgKGJlYWNvbl9zdHJ1Y3QtPndtZUluZm9QcmVzZW50CisJCSAgICB8fCBiZWFjb25fc3RydWN0LT53bWVFZGNhUHJlc2VudCkKKwkJCUxJTV9CU1NfQ0FQU19TRVQoV01FLCAqcW9zX2NhcCk7CisJCWlmIChMSU1fQlNTX0NBUFNfR0VUKFdNRSwgKnFvc19jYXApCisJCSAgICAmJiBiZWFjb25fc3RydWN0LT53c21DYXBhYmxlUHJlc2VudCkKKwkJCUxJTV9CU1NfQ0FQU19TRVQoV1NNLCAqcW9zX2NhcCk7CisJCWlmIChiZWFjb25fc3RydWN0LT5wcm9wSUVpbmZvLmNhcGFiaWxpdHlQcmVzZW50KQorCQkJKnByb3BfY2FwID0gYmVhY29uX3N0cnVjdC0+cHJvcElFaW5mby5jYXBhYmlsaXR5OworCQlpZiAoYmVhY29uX3N0cnVjdC0+SFRDYXBzLnByZXNlbnQpCisJCQltYWNfY3R4LT5saW0uaHRDYXBhYmlsaXR5UHJlc2VudEluQmVhY29uID0gMTsKKwkJZWxzZQorCQkJbWFjX2N0eC0+bGltLmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbiA9IDA7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJICAiYmVhY29uLlZIVENhcHMucHJlc2VudCA9ICVkIEJTU19WSFRfQ2FwYWJsZTolZCIsCisJCQkgIGJlYWNvbl9zdHJ1Y3QtPlZIVENhcHMucHJlc2VudCwKKwkJCSAgSVNfQlNTX1ZIVF9DQVBBQkxFKGJlYWNvbl9zdHJ1Y3QtPlZIVENhcHMpKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgIioqKmJlYWNvbi5TVSBCZWFtZm9ybWVyIENhcGFibGUqKioqKj0lZCIsCisJCQkgIGJlYWNvbl9zdHJ1Y3QtPlZIVENhcHMuc3VCZWFtRm9ybWVyQ2FwKTsKKworCQlpZiAoSVNfQlNTX1ZIVF9DQVBBQkxFKGJlYWNvbl9zdHJ1Y3QtPlZIVENhcHMpICYmCisJCQliZWFjb25fc3RydWN0LT5WSFRPcGVyYXRpb24ucHJlc2VudCAmJgorCQkJc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eSkgeworCQkJc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbiA9IDE7CisJCQlpZiAoKChiZWFjb25fc3RydWN0LT5WZW5kb3IxSUVQcmVzZW50ICYmCisJCQkJYmVhY29uX3N0cnVjdC0+dmVuZG9yMl9pZS5wcmVzZW50ICYmCisJCQkJYmVhY29uX3N0cnVjdC0+VmVuZG9yM0lFUHJlc2VudCkpICYmCisJCQkJKCgoYmVhY29uX3N0cnVjdC0+VkhUQ2Fwcy50eE1DU01hcCAmCisJCQkJICAgIFZIVF9NQ1NfM3gzX01BU0spID09IFZIVF9NQ1NfM3gzX01BU0spICYmCisJCQkJICAoKGJlYWNvbl9zdHJ1Y3QtPlZIVENhcHMudHhNQ1NNYXAgJgorCQkJCSAgICBWSFRfTUNTXzJ4Ml9NQVNLKSAhPSBWSFRfTUNTXzJ4Ml9NQVNLKSkpIHsKKwkJCQlzZXNzaW9uLT50eEJGSW5pRmVhdHVyZUVuYWJsZWQgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbiA9IDA7CisJCX0KKwkJaWYgKHNlc3Npb24tPnZodENhcGFiaWxpdHlQcmVzZW50SW5CZWFjb24gPT0gMSAmJgorCQkgICAgc2Vzc2lvbi0+dHhCRkluaUZlYXR1cmVFbmFibGVkID09IDApIHsKKwkJCWNmZ19zZXRfc3RhdHVzID0gY2ZnX3NldF9pbnQobWFjX2N0eCwKKwkJCQkJCVdOSV9DRkdfVkhUX1NVX0JFQU1GT1JNRUVfQ0FQLAorCQkJCQkJMCk7CisJCQlpZiAoY2ZnX3NldF9zdGF0dXMgIT0gZVNJUl9TVUNDRVNTKQorCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQkJRkwoIlNldCBWSFRfU1VfQkVBTUZPUk1FRV9DQVAgRmFpbCIpKTsKKwkJfQorCQlpZiAoc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbiA9PSAxICYmCisJCSAgICAhc2Vzc2lvbi0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpIHsKKwkJCWNmZ19nZXRfc3RhdHVzID0gd2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LAorCQkJCQkJV05JX0NGR19WSFRfRU5BQkxFX1RYQkZfMjBNSFosCisJCQkJCQkmZW5hYmxlX3R4YmZfMjBtaHopOworCQkJaWYgKChJU19TSVJfU1RBVFVTX1NVQ0NFU1MoY2ZnX2dldF9zdGF0dXMpKSAmJgorCQkJICAgIChmYWxzZSA9PSBlbmFibGVfdHhiZl8yMG1oeikpCisJCQkJc2Vzc2lvbi0+dHhCRkluaUZlYXR1cmVFbmFibGVkID0gMDsKKwkJfSBlbHNlIGlmIChzZXNzaW9uLT52aHRDYXBhYmlsaXR5UHJlc2VudEluQmVhY29uID09IDEgJiYKKwkJCSAgIGJlYWNvbl9zdHJ1Y3QtPlZIVE9wZXJhdGlvbi5jaGFuV2lkdGgpIHsKKwkJCXNlc3Npb24tPmNoX2NlbnRlcl9mcmVxX3NlZzAgPQorCQkJCWJlYWNvbl9zdHJ1Y3QtPlZIVE9wZXJhdGlvbi5jaGFuQ2VudGVyRnJlcVNlZzE7CisJCQlzZXNzaW9uLT5jaF9jZW50ZXJfZnJlcV9zZWcxID0KKwkJCQliZWFjb25fc3RydWN0LT5WSFRPcGVyYXRpb24uY2hhbkNlbnRlckZyZXFTZWcyOworCQkJc2Vzc2lvbi0+Y2hfd2lkdGggPQorCQkJCWJlYWNvbl9zdHJ1Y3QtPlZIVE9wZXJhdGlvbi5jaGFuV2lkdGggKyAxOworCQkJaWYgKENIX1dJRFRIXzgwTUhaIDwgc2Vzc2lvbi0+Y2hfd2lkdGgpIHsKKwkJCQlzZXNzaW9uLT5lbmFibGVfc3VfdHhfYmZvcm1lciA9IDA7CisJCQkJc2Vzc2lvbi0+bnNzID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbiA9PSAxICYmCisJCSAgICAhc2Vzc2lvbi0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgJiYKKwkJICAgIHNlc3Npb24tPnR4QkZJbmlGZWF0dXJlRW5hYmxlZCA9PSAwKSB7CisJCQljZmdfc2V0X3N0YXR1cyA9IGNmZ19zZXRfaW50KG1hY19jdHgsCisJCQkJCQlXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVFX0NBUCwKKwkJCQkJCTApOworCQkJaWYgKGNmZ19zZXRfc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJCUZMKCJTZXQgVkhUX1NVX0JFQU1GT1JNRUVfQ0FQIEZhaWwiKSk7CisJCX0KKyNlbmRpZgorCQkvKiBFeHRyYWN0IHRoZSBVQVBTRCBmbGFnIGZyb20gV01NIFBhcmFtZXRlciBlbGVtZW50ICovCisJCWlmIChiZWFjb25fc3RydWN0LT53bWVFZGNhUHJlc2VudCkKKwkJCSp1YXBzZCA9IGJlYWNvbl9zdHJ1Y3QtPmVkY2FQYXJhbXMucW9zSW5mby51YXBzZDsKKyNpZiBkZWZpbmVkIEZFQVRVUkVfV0xBTl9FU0UKKwkJLyogSWYgdGhlcmUgaXMgUG93ZXIgQ29uc3RyYWludCBFbGVtZW50IHNwZWNpZmljYWxseSwKKwkJICogYWRhcHQgdG8gaXQuIEhlbmNlIHRoZXJlIGlzIGVsc2UgY29uZGl0aW9uIGNoZWNrCisJCSAqIGZvciB0aGlzIGlmIHN0YXRlbWVudC4KKwkJICovCisJCWlmIChiZWFjb25fc3RydWN0LT5lc2VUeFB3ci5wcmVzZW50KQorCQkJKmxvY2FsX2NvbnN0cmFpbnQgPSBiZWFjb25fc3RydWN0LT5lc2VUeFB3ci5wb3dlcl9saW1pdDsKKwkJc2Vzc2lvbi0+aXNfZXNlX3ZlcnNpb25faWVfcHJlc2VudCA9CisJCQliZWFjb25fc3RydWN0LT5pc19lc2VfdmVyX2llX3ByZXNlbnQ7CisjZW5kaWYKKwkJaWYgKGJlYWNvbl9zdHJ1Y3QtPnBvd2VyQ29uc3RyYWludFByZXNlbnQpIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwkJCSpsb2NhbF9jb25zdHJhaW50IC09CisJCQkJYmVhY29uX3N0cnVjdC0+bG9jYWxQb3dlckNvbnN0cmFpbnQuCisJCQkJbG9jYWxQb3dlckNvbnN0cmFpbnRzOworI2Vsc2UKKwkJCWxvY2FsX3Bvd2VyX2NvbnN0cmFpbnRzID0KKwkJCQkodWludDMyX3QpIGJlYWNvbl9zdHJ1Y3QtPmxvY2FsUG93ZXJDb25zdHJhaW50LgorCQkJCWxvY2FsUG93ZXJDb25zdHJhaW50czsKKyNlbmRpZgorCQl9CisjaWYgIWRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCQlpZiAoY2ZnX3NldF9pbnQKKwkJCSAgICAobWFjX2N0eCwgV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5ULAorCQkJICAgIGxvY2FsX3Bvd2VyX2NvbnN0cmFpbnRzKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQlGTAorCQkJCQkoIkNvdWxkIG5vdCB1cGRhdGUgbG9jYWwgcG93ZXIgY29uc3RyYWludCB0byBjZmcuIikpOworCQl9CisjZW5kaWYKKwkJc2Vzc2lvbi0+Y291bnRyeV9pbmZvX3ByZXNlbnQgPSBmYWxzZTsKKwkJLyogSW5pdGlhbGl6aW5nIGJlZm9yZSBmaXJzdCB1c2UgKi8KKwkJaWYgKGJlYWNvbl9zdHJ1Y3QtPmNvdW50cnlJbmZvUHJlc2VudCkKKwkJCXNlc3Npb24tPmNvdW50cnlfaW5mb19wcmVzZW50ID0gdHJ1ZTsKKwl9CisJY2RmX21lbV9mcmVlKGJlYWNvbl9zdHJ1Y3QpOworCXJldHVybjsKK30gLyoqKioqKiBlbmQgbGltX2V4dHJhY3RfYXBfY2FwYWJpbGl0eSgpICoqKioqKi8KKworLyoqCisgKiBsaW1fZ2V0X2h0Y2Jfc3RhdGUKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIHJvdXRpbmcgcHJvdmlkZXMgdGhlIHRyYW5zbGF0aW9uIG9mIEFpcmdvIEVudW0gdG8gSFQgZW51bSBmb3IgZGV0ZXJtaW5pbmcKKyAqIHNlY29uZGFyeSBjaGFubmVsIG9mZnNldC4KKyAqIEFpcmdvIEVudW0gaXMgcmVxdWlyZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuCisgKgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgSFQgZW51bWVyYXRpb24KKyAqLworZVBoeUNoYW5Cb25kU3RhdGUgbGltX2dldF9odGNiX3N0YXRlKGVQaHlDaGFuQm9uZFN0YXRlIGFuaUNCTW9kZSkKK3sKKwlzd2l0Y2ggKGFuaUNCTW9kZSkgeworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9MT1c6CisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9DRU5URVJFRDoKKwljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0hJR0g6CisjZW5kaWYKKwljYXNlIFBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlk6CisJCXJldHVybiBQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0xPVzoKKwljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfQ0VOVEVSRUQ6CisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0hJR0g6CisjZW5kaWYKKwljYXNlIFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWToKKwkJcmV0dXJuIFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0NFTlRFUkVEXzQwTUhaX0NFTlRFUkVEOgorCQlyZXR1cm4gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKwl9Cit9CisKKy8qCisgKiBsaW1fZ2V0X3N0YV9wZWVyX3R5cGUKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIEFQSSByZXR1cm5zIFNUQSBwZWVyIHR5cGUKKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzIC0gUG9pbnRlciB0byB0aGUgdHBEcGhIYXNoTm9kZSBvZiB0aGUgU1RBCisgKiAgICAgICAgIHVuZGVyIGNvbnNpZGVyYXRpb24KKyAqIEByZXR1cm4gdFN0YVJhdGVNb2RlCisgKi8KK3RTdGFSYXRlTW9kZSBsaW1fZ2V0X3N0YV9wZWVyX3R5cGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICB0cERwaEhhc2hOb2RlIHBTdGFEcywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U3RhUmF0ZU1vZGUgc3RhUGVlclR5cGUgPSBlU1RBXzExYjsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmIChwU3RhRHMtPm1sbVN0YUNvbnRleHQudmh0Q2FwYWJpbGl0eSkKKwkJc3RhUGVlclR5cGUgPSBlU1RBXzExYWM7CisjZW5kaWYKKwllbHNlIGlmIChwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5KQorCQlzdGFQZWVyVHlwZSA9IGVTVEFfMTFuOworCWVsc2UgaWYgKHBTdGFEcy0+ZXJwRW5hYmxlZCkKKwkJc3RhUGVlclR5cGUgPSBlU1RBXzExYmc7CisJZWxzZSBpZiAocHNlc3Npb25FbnRyeS0+bGltUkZCYW5kID09IFNJUl9CQU5EXzVfR0haKQorCQlzdGFQZWVyVHlwZSA9IGVTVEFfMTFhOworCXJldHVybiBzdGFQZWVyVHlwZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb3BfZXh0c191dGlscy5oIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fcHJvcF9leHRzX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0OGE3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Byb3BfZXh0c191dGlscy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV9wcm9wX2V4dHNfdXRpbHMuaCBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMKKyAqIHVzZWQgYnkgYWxsIExJTSBtb2R1bGVzIHRvIHN1cHBvcnQgcHJvcHJpZXRhcnkgZmVhdHVyZXMuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAxMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19MSU1fUFJPUF9FWFRTX1VUSUxTX0gKKyNkZWZpbmUgX19MSU1fUFJPUF9FWFRTX1VUSUxTX0gKKworLyogRnVuY3Rpb24gdGVtcGxhdGVzICovCit2b2lkIGxpbVF1aWV0QnNzKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCk7Cit2b2lkIGxpbV9jbGVhbnVwTWVhc0RhdGEodHBBbmlTaXJHbG9iYWwpOwordm9pZCBsaW1EZWxldGVNZWFzVGltZXJzKHRwQW5pU2lyR2xvYmFsKTsKK3ZvaWQgbGltU3RvcE1lYXNUaW1lcnModHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGxpbV9jbGVhbnVwTWVhc1Jlc291cmNlcyh0cEFuaVNpckdsb2JhbCk7Cit2b2lkIGxpbVJlc3RvcmVQcmVMZWFyblN0YXRlKHRwQW5pU2lyR2xvYmFsKTsKK3ZvaWQgbGltQ29sbGVjdE1lYXN1cmVtZW50RGF0YSh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QgKiwgdHBTY2hCZWFjb25TdHJ1Y3QpOwordm9pZCBsaW1Db2xsZWN0UlNTSSh0cEFuaVNpckdsb2JhbCk7Cit2b2lkIGxpbURlbGV0ZUN1cnJlbnRCc3NXZHNOb2RlKHRwQW5pU2lyR2xvYmFsKTsKK3VpbnQzMl90IGxpbUNvbXB1dGVBdmcodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90LCB1aW50MzJfdCk7CisKKy8qIC8gRnVuY3Rpb24gdG8gZXh0cmFjdCBBUCdzIEhDRiBjYXBhYmlsaXR5IGZyb20gSUUgZmllbGRzICovCit2b2lkIGxpbV9leHRyYWN0X2FwX2NhcGFiaWxpdHkodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwgdWludDE2X3QsIHVpbnQ4X3QgKiwKKwkJCSAgICAgICB1aW50MTZfdCAqLCB1aW50OF90ICosIHRQb3dlcmRCbSAqLCB0cFBFU2Vzc2lvbik7CisKK3RTdGFSYXRlTW9kZSBsaW1fZ2V0X3N0YV9wZWVyX3R5cGUodHBBbmlTaXJHbG9iYWwsIHRwRHBoSGFzaE5vZGUsIHRwUEVTZXNzaW9uKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworZVBoeUNoYW5Cb25kU3RhdGUgbGltX2dldF9odGNiX3N0YXRlKGVQaHlDaGFuQm9uZFN0YXRlIGFuaUNCTW9kZSk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElNX1BST1BfRVhUU19VVElMU19IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zY2FuX3Jlc3VsdF91dGlscy5jIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2Nhbl9yZXN1bHRfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODcxNTJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2Nhbl9yZXN1bHRfdXRpbHMuYwpAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBsaW1fc2Nhbl9yZXN1bHRfdXRpbHMuY2MgY29udGFpbnMgdGhlIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBMSU0gdXNlcyBmb3IgbWFpbnRhaW5pbmcgYW5kIGFjY2Vzc2luZyBzY2FuIHJlc3VsdHMgb24gU1RBLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VyX2Rlc191dGlscy5oIgorI2luY2x1ZGUgImxpbV9hcGkuaCIKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2luY2x1ZGUgImxpbV9mdF9kZWZzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbi5oIgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybV9hcGkuaCIKKyNlbmRpZgorI2luY2x1ZGUgImNkc191dGlscy5oIgorCisKKy8qKgorICogbGltX2NvbGxlY3RfYnNzX2Rlc2NyaXB0aW9uKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgc2NhbiB1cG9uIHJlY2VpdmluZworICogQmVhY29uL1Byb2JlIFJlc3BvbnNlIGZyYW1lIHRvIGNoZWNrIGlmIHRoZSByZWNlaXZlZAorICogZnJhbWUgbWF0Y2hlcyBzY2FuIGNyaXRlcmlhLCBjb2xsZWN0IEJTUyBkZXNjcmlwdGlvbgorICogYW5kIGFkZCBpdCB0byBjYWNoZWQgc2NhbiByZXN1bHRzLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBCUFIgLSBQb2ludGVyIHRvIHBhcnNlZCBCZWFjb24vUHJvYmUgUmVzcG9uc2Ugc3RydWN0dXJlCisgKiBAcGFyYW0gIHBSeFBhY2tldEluZm8gIC0gUG9pbnRlciB0byBSZWNlaXZlZCBmcmFtZSdzIEJECisgKiAtLS0tLS0tLS1pZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkktLS0tLS0KKyAqIEBwYXJhbSAgZlNjYW5uaW5nIC0gZmxhZyB0byBpbmRpY2F0ZSBpZiBpdCBpcyBkdXJpbmcgc2Nhbi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCitDREZfU1RBVFVTCitsaW1fY29sbGVjdF9ic3NfZGVzY3JpcHRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjciwKKwkJCSAgICB0cFNpclByb2JlUmVzcEJlYWNvbiBwQlBSLAorCQkJICAgIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sIHVpbnQ4X3QgZlNjYW5uaW5nKQorI2Vsc2UKK0NERl9TVEFUVVMKK2xpbV9jb2xsZWN0X2Jzc19kZXNjcmlwdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyLAorCQkJICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uIHBCUFIsIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8pCisjZW5kaWYKK3sKKwl1aW50OF90ICpwQm9keTsKKwl1aW50MzJfdCBpZUxlbiA9IDA7CisJdHBTaXJNYWNNZ210SGRyIHBIZHI7CisJdWludDhfdCBjaGFubmVsTnVtOworCXVpbnQ4X3QgcnhDaGFubmVsOworCXVpbnQ4X3QgcmZCYW5kID0gMDsKKworCXBIZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisKKwlpZiAoU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VUID4gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKSkgeworCQlDREZfQVNTRVJUKFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbykgPj0KKwkJCSAgIFNJUl9NQUNfQl9QUl9TU0lEX09GRlNFVCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJaWVMZW4gPQorCQlXTUFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pIC0gU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VUOworCXJ4Q2hhbm5lbCA9IFdNQV9HRVRfUlhfQ0gocFJ4UGFja2V0SW5mbyk7CisJcEJvZHkgPSBXTUFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKwlyZkJhbmQgPSBXTUFfR0VUX1JYX1JGQkFORChwUnhQYWNrZXRJbmZvKTsKKworCS8qKgorCSAqIExlbmd0aCBvZiBCU1MgZGVzcmlwdGlvbiBpcyB3aXRob3V0IGxlbmd0aCBvZgorCSAqIGxlbmd0aCBpdHNlbGYgYW5kIGxlbmd0aCBvZiBwb2ludGVyIHRoYXQgaG9sZHMgaWVGaWVsZHMuCisJICoKKwkgKiB0U2lyQnNzRGVzY3JpcHRpb24KKwkgKiArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKwkgKiB8IGxlbmd0aCB8IG90aGVyIGZpZWxkcyAgICAgICAgICAgICAgICAgICAgfCBwb2ludGVyIHRvIElFc3wKKwkgKiArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZUZpZWxkcworCSAqLworCXBCc3NEZXNjci0+bGVuZ3RoID0gKHVpbnQxNl90KShvZmZzZXRvZih0U2lyQnNzRGVzY3JpcHRpb24sIGllRmllbGRzWzBdKQorCQkJCQktIHNpemVvZihwQnNzRGVzY3ItPmxlbmd0aCkgKyBpZUxlbik7CisKKwkvKiBDb3B5IEJTUyBJZCAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcEJzc0Rlc2NyLT5ic3NJZCwKKwkJICAgICAodWludDhfdCAqKSBwSGRyLT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkvKiBDb3B5IFRpbWVzdGFtcCwgQmVhY29uIEludGVydmFsIGFuZCBDYXBhYmlsaXR5IEluZm8gKi8KKwlwQnNzRGVzY3ItPnNjYW5TeXNUaW1lTXNlYyA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKKworCXBCc3NEZXNjci0+dGltZVN0YW1wWzBdID0gcEJQUi0+dGltZVN0YW1wWzBdOworCXBCc3NEZXNjci0+dGltZVN0YW1wWzFdID0gcEJQUi0+dGltZVN0YW1wWzFdOworCXBCc3NEZXNjci0+YmVhY29uSW50ZXJ2YWwgPSBwQlBSLT5iZWFjb25JbnRlcnZhbDsKKwlwQnNzRGVzY3ItPmNhcGFiaWxpdHlJbmZvID0KKwkJbGltX2dldF91MTYoKHVpbnQ4X3QgKikgJnBCUFItPmNhcGFiaWxpdHlJbmZvKTsKKworCWlmICghcEJzc0Rlc2NyLT5iZWFjb25JbnRlcnZhbCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgiQmVhY29uIEludGVydmFsIGlzIFpFUk8sIG1ha2luZyBpdCB0byBkZWZhdWx0IDEwMCAiCisJCQkgICBNQUNfQUREUkVTU19TVFIpLCBNQUNfQUREUl9BUlJBWShwSGRyLT5ic3NJZCkpOworCQlwQnNzRGVzY3ItPmJlYWNvbkludGVydmFsID0gMTAwOworCX0KKwkvKgorCSAqIFRoZXJlIGlzIGEgbmFycm93IHdpbmRvdyBhZnRlciBDaGFubmVsIFN3aXRjaCBtc2cgaXMgc2VudCB0byBIQUwgYW5kIGJlZm9yZSB0aGUgQUdDIGlzIHNodXQKKwkgKiBkb3duIGFuZCBiZWFjb25zL1Byb2JlIFJzcHMgY2FuIHRyaWNrbGUgaW4gYW5kIHdlIG1heSByZXBvcnQgdGhlIGluY29ycmVjdCBjaGFubmVsIGluIDVHaHoKKwkgKiBiYW5kLCBzbyBub3QgcmVseWluZyBvbiB0aGUgJ2xhc3QgU2Nhbm5lZCBDaGFubmVsJyBzdG9yZWQgaW4gTElNLgorCSAqIEluc3RlYWQgdXNlIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBSWFAgaW4gQkQuIFRoaXMgdGhlIHRoZSBzYW1lIHZhbHVlIHdoaWNoIEhBTCBwcm9ncmFtcyBpbnRvCisJICogUlhQIGJlZm9yZSBldmVyeSBjaGFubmVsIHN3aXRjaC4KKwkgKiBSaWdodCBub3cgdGhlcmUgaXMgYSBwcm9ibGVtIGluIDVHaHosIHdoZXJlIHdlIGFyZSByZWNlaXZpbmcgYmVhY29ucyBmcm9tIGEgY2hhbm5lbCBkaWZmZXJlbnQgZnJvbQorCSAqIHRoZSBjdXJyZW50bHkgc2Nhbm5lZCBjaGFubmVsLiBzbyBpbmNvcnJlY3QgY2hhbm5lbCBpcyByZXBvcnRlZCB0byBDU1IgYW5kIGFzc29jaWF0aW9uIGRvZXMgbm90IGhhcHBlbi4KKwkgKiBTbyBmb3Igbm93IHdlIGtlZXAgb24gbG9va2luZyBmb3IgdGhlIGNoYW5uZWwgaW5mbyBpbiB0aGUgYmVhY29uIChEU1BhcmFtU2V0IElFIE9SIEhUIEluZm8gSUUpLCBhbmQgb25seSBpZiBpdAorCSAqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBiZWFjb24sIHdlIGdvIGZvciB0aGUgY2hhbm5lbCBpbmZvIHByZXNlbnQgaW4gUlhQLgorCSAqIFRoaXMgZml4IHdpbGwgd29yayBmb3IgNUdoeiAxMW4gZGV2aWNlcywgYnV0IGZvciAxMWEgZGV2aWNlcywgd2UgaGF2ZSB0byByZWx5IG9uIFJYUCByb3V0aW5nIGZsYWcgdG8gZ2V0IHRoZSBjb3JyZWN0IGNoYW5uZWwuCisJICogU28gVGhlIHByb2JsZW0gb2YgaW5jb3JyZWN0IGNoYW5uZWwgcmVwb3J0aW5nIGluIDVHaHogd2lsbCBzdGlsbCByZW1haW4gZm9yIDExYSBkZXZpY2VzLgorCSAqLworCXBCc3NEZXNjci0+Y2hhbm5lbElkID0gbGltX2dldF9jaGFubmVsX2Zyb21fYmVhY29uKHBNYWMsIHBCUFIpOworCisJaWYgKHBCc3NEZXNjci0+Y2hhbm5lbElkID09IDApIHsKKwkJLyogSWYgdGhlIGNoYW5uZWwgSWQgaXMgbm90IHJldHJpZXZlZCBmcm9tIEJlYWNvbiwgZXh0cmFjdCB0aGUgY2hhbm5lbCBmcm9tIEJEICovCisJCWlmICghcnhDaGFubmVsKSB7CisJCQlyeENoYW5uZWwgPSBwTWFjLT5saW0uZ0xpbUN1cnJlbnRTY2FuQ2hhbm5lbElkOworCQl9CisJCXBCc3NEZXNjci0+Y2hhbm5lbElkID0gcnhDaGFubmVsOworCX0KKworCXBCc3NEZXNjci0+Y2hhbm5lbElkU2VsZiA9IHBCc3NEZXNjci0+Y2hhbm5lbElkOworCS8qIHNldCB0aGUgbmV0d29yayB0eXBlIGluIGJzcyBkZXNjcmlwdGlvbiAqLworCWNoYW5uZWxOdW0gPSBwQnNzRGVzY3ItPmNoYW5uZWxJZDsKKwlwQnNzRGVzY3ItPm53VHlwZSA9CisJCWxpbV9nZXRfbndfdHlwZShwTWFjLCBjaGFubmVsTnVtLCBTSVJfTUFDX01HTVRfRlJBTUUsIHBCUFIpOworCisJLyogQ29weSBSU1NJICYgU0lOUiBmcm9tIEJEICovCisKKwlsaW1fbG9nKHBNYWMsIExPRzQsICIqKioqKioqKipCU1MgRGVzY3JpcHRpb24gZm9yIEJTU0lEOioqKioqKioqKiAiKTsKKwlzaXJfZHVtcF9idWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzQsIHBCc3NEZXNjci0+YnNzSWQsIDYpOworCXNpcl9kdW1wX2J1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HNCwKKwkJKHVpbnQ4X3QgKikgcFJ4UGFja2V0SW5mbywgMzYpOworCisJcEJzc0Rlc2NyLT5yc3NpID0gKGludDhfdCkgV01BX0dFVF9SWF9SU1NJX0RCKHBSeFBhY2tldEluZm8pOworCisJLyogU0lOUiBubyBsb25nZXIgcmVwb3J0ZWQgYnkgSFcgKi8KKwlwQnNzRGVzY3ItPnNpbnIgPSAwOworCisJcEJzc0Rlc2NyLT5uUmVjZWl2ZWRUaW1lID0gKHVpbnQzMl90KSBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpOworCXBCc3NEZXNjci0+dHNmX2RlbHRhID0gV01BX0dFVF9SWF9UU0ZfREVMVEEocFJ4UGFja2V0SW5mbyk7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJCU1NJRDogIk1BQ19BRERSRVNTX1NUUiAiIHRzZl9kZWx0YSA9ICV1IiksCisJCQkgICAgTUFDX0FERFJfQVJSQVkocEhkci0+YnNzSWQpLCBwQnNzRGVzY3ItPnRzZl9kZWx0YSk7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlpZiAoZlNjYW5uaW5nKSB7CisJCXJybV9nZXRfc3RhcnRfdHNmKHBNYWMsIHBCc3NEZXNjci0+c3RhcnRUU0YpOworCQlwQnNzRGVzY3ItPnBhcmVudFRTRiA9IFdNQV9HRVRfUlhfVElNRVNUQU1QKHBSeFBhY2tldEluZm8pOworCX0KKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkvKiBNb2JpbGl0eURvbWFpbiAqLworCXBCc3NEZXNjci0+bWRpZVswXSA9IDA7CisJcEJzc0Rlc2NyLT5tZGllWzFdID0gMDsKKwlwQnNzRGVzY3ItPm1kaWVbMl0gPSAwOworCXBCc3NEZXNjci0+bWRpZVByZXNlbnQgPSBmYWxzZTsKKwkvKiBJZiBtZGllIGlzIHByZXNlbnQgaW4gdGhlIHByb2JlIHJlc3Agd2UgKi8KKwkvKiBmaWxsIGl0IGluIHRoZSBic3MgZGVzY3JpcHRpb24gKi8KKwlpZiAocEJQUi0+bWRpZVByZXNlbnQpIHsKKwkJcEJzc0Rlc2NyLT5tZGllUHJlc2VudCA9IHRydWU7CisJCXBCc3NEZXNjci0+bWRpZVswXSA9IHBCUFItPm1kaWVbMF07CisJCXBCc3NEZXNjci0+bWRpZVsxXSA9IHBCUFItPm1kaWVbMV07CisJCXBCc3NEZXNjci0+bWRpZVsyXSA9IHBCUFItPm1kaWVbMl07CisJfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJcEJzc0Rlc2NyLT5RQlNTTG9hZF9wcmVzZW50ID0gZmFsc2U7CisJcEJzc0Rlc2NyLT5RQlNTTG9hZF9hdmFpbCA9IDA7CisJaWYgKHBCUFItPlFCU1NMb2FkLnByZXNlbnQpIHsKKwkJcEJzc0Rlc2NyLT5RQlNTTG9hZF9wcmVzZW50ID0gdHJ1ZTsKKwkJcEJzc0Rlc2NyLT5RQlNTTG9hZF9hdmFpbCA9IHBCUFItPlFCU1NMb2FkLmF2YWlsOworCX0KKyNlbmRpZgorCS8qIENvcHkgSUUgZmllbGRzICovCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwQnNzRGVzY3ItPmllRmllbGRzLAorCQkgICAgIHBCb2R5ICsgU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VULCBpZUxlbik7CisKKwkvKnNldCBjaGFubmVsIG51bWJlciBpbiBiZWFjb24gaW4gY2FzZSBpdCBpcyBub3QgcHJlc2VudCAqLworCXBCUFItPmNoYW5uZWxOdW1iZXIgPSBwQnNzRGVzY3ItPmNoYW5uZWxJZDsKKworCWxpbV9sb2cocE1hYywgTE9HMywKKwkJRkwoIkNvbGxlY3RlZCBCU1MgRGVzY3JpcHRpb24gZm9yIENoYW5uZWwoJTFkKSwgbGVuZ3RoKCV1KSwgSUUgRmllbGRzKCV1KSIpLAorCQlwQnNzRGVzY3ItPmNoYW5uZWxJZCwgcEJzc0Rlc2NyLT5sZW5ndGgsIGllTGVuKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qKiogZW5kIGxpbV9jb2xsZWN0X2Jzc19kZXNjcmlwdGlvbigpICoqKi8KKworLyoqCisgKiBsaW1faXNfc2Nhbl9yZXF1ZXN0ZWRfc3NpZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIHNjYW4gdXBvbiByZWNlaXZpbmcKKyAqIEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBmcmFtZSB0byBjaGVjayBpZiB0aGUgcmVjZWl2ZWQKKyAqIFNTSUQgaXMgcHJlc2VudCBpbiB0aGUgbGlzdCBvZiByZXF1ZXN0ZWQgU1NJRHMgaW4gc2NhbgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHNzSWQgLSBTU0lEIFJlY2VpdmVkIGluIGJlYWNvbnMvUHJvYmUgcmVzcG9uc2VzIHRoYXQgaXMgY29tcGFyZWQgYWdhaW5zdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXVzdGVkIFNTSUQgaW4gc2NhbiBsaXN0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBAcmV0dXJuIGJvb2wgLSB0cnVlIGlmIFNTSUQgaXMgcHJlc2VudCBpbiByZXF1ZXN0ZWQgbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KKworYm9vbCBsaW1faXNfc2Nhbl9yZXF1ZXN0ZWRfc3NpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjU1NpZCAqc3NJZCkKK3sKKwl1aW50OF90IGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPm51bVNzaWQ7IGkrKykgeworCQlpZiAodHJ1ZSA9PSBjZGZfbWVtX2NvbXBhcmUoKHVpbnQ4X3QgKikgc3NJZCwKKwkJCQkJICAgICh1aW50OF90ICopICZwTWFjLT5saW0uCisJCQkJCSAgICBncExpbU1sbVNjYW5SZXEtPnNzSWRbaV0sCisJCQkJCSAgICAodWludDhfdCkgKHBNYWMtPmxpbS4KKwkJCQkJCSAgICAgICBncExpbU1sbVNjYW5SZXEtPnNzSWRbaV0uCisJCQkJCQkgICAgICAgbGVuZ3RoICsgMSkpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogbGltX2NoZWNrX2FuZF9hZGRfYnNzX2Rlc2NyaXB0aW9uKCkKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAYnByOiBQb2ludGVyIHRvIHBhcnNlZCBCZWFjb24vUHJvYmUgUmVzcG9uc2Ugc3RydWN0dXJlCisgKiBAcnhfcGFja2V0X2luZm86IFBvaW50ZXIgdG8gUmVjZWl2ZWQgZnJhbWUncyBCRAorICogQHNjYW5uaW5nOiBib29sIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIEJTUyBpcyBmcm9tIGN1cnJlbnQgc2NhbgorICogICAgICAgICAgICAgb3IganVzdCBoYXBwZW5zIHRvIHJlY2VpdmUgYSBiZWFjb24KKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzY2FuIHVwb24gcmVjZWl2aW5nCisgKiBCZWFjb24vUHJvYmUgUmVzcG9uc2UgZnJhbWUgdG8gY2hlY2sgaWYgdGhlIHJlY2VpdmVkCisgKiBmcmFtZSBtYXRjaGVzIHNjYW4gY3JpdGVyaWEsIGNvbGxlY3QgQlNTIGRlc2NyaXB0aW9uCisgKiBhbmQgYWRkIGl0IHRvIGNhY2hlZCBzY2FuIHJlc3VsdHMuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KKwordm9pZAorbGltX2NoZWNrX2FuZF9hZGRfYnNzX2Rlc2NyaXB0aW9uKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdHBTaXJQcm9iZVJlc3BCZWFjb24gYnByLCB1aW50OF90ICpyeF9wYWNrZXRfaW5mbywKKwlib29sIHNjYW5uaW5nLCB1aW50OF90IGZQcm9iZVJzcCkKK3sKKwl0U2lyQnNzRGVzY3JpcHRpb24gKmJzc2Rlc2NyID0gTlVMTDsKKwl1aW50MzJfdCBmcmFtZV9sZW4sIGllX2xlbiA9IDA7CisJdWludDhfdCByeF9jaGFuX2luX2JlYWNvbiA9IDA7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCBkb250X3VwZGF0ZV9hbGwgPSAwOworCXVpbnQ4X3QgcmZfYmFuZCA9IDA7CisJdWludDhfdCByeF9jaGFuX2JkID0gMDsKKworCXRTaXJNYWNBZGRyIGJzc2lkX3plcm8gPSAgezB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDB9OworCXRwU2lyTWFjRGF0YUhkcjNhIGhkcjsKKworCWhkciA9IFdNQV9HRVRfUlhfTVBEVUhFQURFUjNBKCh1aW50OF90ICopIHJ4X3BhY2tldF9pbmZvKTsKKworCS8qICBDaGVjayBGb3IgTnVsbCBCU1NJRCBhbmQgU2tpcCBpbiBjYXNlIG9mIFAyUCAqLworCWlmIChjZGZfbWVtX2NvbXBhcmUoYnNzaWRfemVybywgJmhkci0+YWRkcjMsIDYpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFNTSUQvQlNTSUQgcG9saWN5OgorCSAqIEFjY2VwdCBiZWFjb25zL3Byb2JlIHJlc3BvbnNlcyB3aXRoIGFueSBTU0lEIG9yIEJTU0lEIGJlY2F1c2UKKwkgKiBtdWx0aXBsZSBzY2FuIHJlcXVlc3RzIG1heSBiZSBydW5uaW5nIGF0IHRoZSBzYW1lIHRpbWUgYW5kCisJICogZmlybXdhcmUgbWF5IGZvcndhcmQgcmVzdWx0cyB0byBDTEQgZnJvbSBzY2FucyByZXF1ZXN0ZWQgdGhyb3VnaCBhCisJICogZGlmZmVyZW50IHBhdGguCisJICoKKwkgKiBDU0EgUG9saWN5OgorCSAqIFRoZXJlIGlzIG5vIHBvaW50IGluIGNhY2hpbmcgJiByZXBvcnRpbmcgdGhlIHNjYW4gcmVzdWx0cyBmb3IgQVBzCisJICogd2hpY2ggYXJlIGluIHRoZSBwcm9jZXNzIG9mIHN3aXRjaGluZyB0aGUgY2hhbm5lbC4gU28sIHdlIGFyZSBub3QKKwkgKiBjYWNoaW5nIHRoZSBzY2FuIHJlc3VsdHMgZm9yIEFQcyB3aGljaCBhcmUgYWR2ZXJ6aW5nIHRoZQorCSAqIGNoYW5uZWwtc3dpdGNoIGVsZW1lbnQgaW4gdGhlaXIgYmVhY29ucyBhbmQgcHJvYmUgcmVzcG9uc2VzLgorCSAqLworCWlmIChicHItPmNoYW5uZWxTd2l0Y2hQcmVzZW50KQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIGJlYWNvbi9wcm9iZSByZXNwIERTIHBhcmFtIGNoYW5uZWwgZG9lcyBub3QgbWF0Y2ggd2l0aAorCSAqIFJYIEJEIGNoYW5uZWwgdGhlbiBkb24ndCBzYXZlIHRoZSByZXN1bHRzLiBJdCBtaWdodCBiZSBhIGJlYWNvbgorCSAqIGZyb20gYW5vdGhlciBjaGFubmVsIGhlYXJkIGFzIG5vaXNlIG9uIHRoZSBjdXJyZW50IHNjYW5uaW5nIGNoYW5uZWwKKwkgKi8KKworCWlmICgoYnByLT5kc1BhcmFtc1ByZXNlbnQpIHx8IChicHItPkhUSW5mby5wcmVzZW50KSkgeworCQkvKiBUaGlzIG1lYW5zIHRoYXQgd2UgYXJlIGluIDIuNEdIeiBtb2RlIG9yIDVHSHogMTFuIG1vZGUgKi8KKwkJcnhfY2hhbl9pbl9iZWFjb24gPSBsaW1fZ2V0X2NoYW5uZWxfZnJvbV9iZWFjb24obWFjX2N0eCwgYnByKTsKKwkJcmZfYmFuZCA9IFdNQV9HRVRfUlhfUkZCQU5EKHJ4X3BhY2tldF9pbmZvKTsKKwkJcnhfY2hhbl9iZCA9IFdNQV9HRVRfUlhfQ0gocnhfcGFja2V0X2luZm8pOworCisJCWlmIChyeF9jaGFuX2JkICE9IHJ4X2NoYW5faW5fYmVhY29uKSB7CisJCQkvKiBCQ0FTVCBGcmFtZSwgaWYgQ0ggZG8gbm90IG1hdGNoLCBEcm9wICovCisJCQlpZiAoV01BX0lTX1JYX0JDQVNUKHJ4X3BhY2tldF9pbmZvKSkgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMywKKwkJCQkJRkwoIkJlYWNvbi9Qcm9iZSBSc3AgZHJvcHBlZC4gQ2hhbm5lbCBpbiBCRCAlZC4gQ2hhbm5lbCBpbiBiZWFjb24gJWQiKSwKKwkJCQkJV01BX0dFVF9SWF9DSChyeF9wYWNrZXRfaW5mbyksCisJCQkJCWxpbV9nZXRfY2hhbm5lbF9mcm9tX2JlYWNvbihtYWNfY3R4LAorCQkJCQkJYnByKSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJLyogVW5pdCBjYXN0IGZyYW1lLCBQcm9iZSBSU1AsIGRvIG5vdCBkcm9wICovCisJCQllbHNlIHsKKwkJCQlkb250X3VwZGF0ZV9hbGwgPSAxOworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMywKKwkJCQkJRkwoIlNTSUQgJXMsIENIIGluIFByb2JlUnNwICVkLCBDSCBpbiBCRCAlZCwgbWlzbWF0Y2gsIERvIE5vdCBEcm9wIiksCisJCQkJCWJwci0+c3NJZC5zc0lkLCByeF9jaGFuX2luX2JlYWNvbiwKKwkJCQkJV01BX0dFVF9SWF9DSChyeF9wYWNrZXRfaW5mbykpOworCQkJCVdNQV9HRVRfUlhfQ0gocnhfcGFja2V0X2luZm8pID0KKwkJCQkJcnhfY2hhbl9pbl9iZWFjb247CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGJ1ZmZlciB0byBob2xkIEJTUyBkZXNjcmlwdGlvbiBmcm9tCisJICogcmVjZWl2ZWQgQmVhY29uIGZyYW1lLgorCSAqIEluY2x1ZGUgc2l6ZSBvZiBmaXhlZCBmaWVsZHMgYW5kIElFcyBsZW5ndGgKKwkgKi8KKworCWllX2xlbiA9IFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocnhfcGFja2V0X2luZm8pOworCWlmIChpZV9sZW4gPD0gU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VUKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJSWCBwYWNrZXQgaGFzIGludmFsaWQgbGVuZ3RoICVkIiksIGllX2xlbik7CisJCXJldHVybjsKKwl9CisKKwlpZV9sZW4gLT0gU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VUOworCisJLyogSUVzIHdpbGwgYmUgb3ZlcmxhcCBpZUZpZWxkcyBmaWVsZC4gQWRqdXN0IHRoZSBsZW5ndGggYWNjb3JkaW5nbHkgKi8KKwlmcmFtZV9sZW4gPSBzaXplb2YoKmJzc2Rlc2NyKSArIGllX2xlbiAtIHNpemVvZihic3NkZXNjci0+aWVGaWVsZHNbMV0pOworCWJzc2Rlc2NyID0gKHRTaXJCc3NEZXNjcmlwdGlvbiAqKSBjZGZfbWVtX21hbGxvYyhmcmFtZV9sZW4pOworCisJaWYgKE5VTEwgPT0gYnNzZGVzY3IpIHsKKwkJLyogTG9nIGVycm9yICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJjZGZfbWVtX21hbGxvYyhsZW5ndGg9JWQpIGZhaWxlZCIpLCBmcmFtZV9sZW4pOworCQlyZXR1cm47CisJfQorCS8qIEluIHNjYW4gc3RhdGUsIHN0b3JlIHNjYW4gcmVzdWx0LiAqLworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXN0YXR1cyA9IGxpbV9jb2xsZWN0X2Jzc19kZXNjcmlwdGlvbihtYWNfY3R4LCBic3NkZXNjciwKKwkJCQkJICAgICBicHIsIHJ4X3BhY2tldF9pbmZvLCBzY2FubmluZyk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisJCWdvdG8gbGFzdDsKKyNlbHNlCisJc3RhdHVzID0gbGltX2NvbGxlY3RfYnNzX2Rlc2NyaXB0aW9uKG1hY19jdHgsIGJzc2Rlc2NyLAorCQkJCQkgICAgIGJwciwgcnhfcGFja2V0X2luZm8pOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQlnb3RvIGxhc3Q7CisjZW5kaWYKKwlic3NkZXNjci0+ZlByb2JlUnNwID0gZlByb2JlUnNwOworCisJLyoKKwkgKiBTZW5kIHRoZSBiZWFjb24gdG8gQ1NSIHdpdGggcmVnaXN0ZXJlZCBjYWxsYmFjayByb3V0aW5lLgorCSAqIHNjYW5faWQgYW5kIGZsYWdzIHBhcmFtZXRlcnMgYXJlIGN1cnJlbnRseSB1bnVzZWQgYW5kIHNldCB0byAwLgorCSAqLworCWlmIChtYWNfY3R4LT5saW0uYWRkX2Jzc2Rlc2NyX2NhbGxiYWNrKSB7CisJCShtYWNfY3R4LT5saW0uYWRkX2Jzc2Rlc2NyX2NhbGxiYWNrKSAobWFjX2N0eCwgYnNzZGVzY3IsIDAsIDApOworCX0gZWxzZSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJObyBDU1IgY2FsbGJhY2sgcm91dGluZSB0byBzZW5kIGJlYWNvbnMiKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CitsYXN0OgorCWNkZl9tZW1fZnJlZShic3NkZXNjcik7CisJcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zY2FuX3Jlc3VsdF91dGlscy5oIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2Nhbl9yZXN1bHRfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjIyZGMyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2Nhbl9yZXN1bHRfdXRpbHMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBsaW1fc2Nhbl9yZXN1bHRfdXRpbHMuaCBjb250YWlucyB0aGUgdXRpbGl0eSBkZWZpbml0aW9ucworICogTElNIHVzZXMgZm9yIG1haW50YWluaW5nIGFuZCBhY2Nlc3Npbmcgc2NhbiByZXN1bHRzIG9uIFNUQS4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzEzLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfX0xJTV9TQ0FOX1VUSUxTX0gKKyNkZWZpbmUgX19MSU1fU0NBTl9VVElMU19ICisKKyNpbmNsdWRlICJwYXJzZXJfYXBpLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisKKy8qIFNjYW4gcmVzdWx0IGhhc2ggcmVsYXRlZCBmdW5jdGlvbnMgKi8KK3VpbnQ4X3QgbGltX3NjYW5faGFzaF9mdW5jdGlvbih0U2lyTWFjQWRkcik7Cit2b2lkIGxpbV9yZXN0b3JlX3ByZV9zY2FuX3N0YXRlKHRwQW5pU2lyR2xvYmFsKTsKK3ZvaWQgbGltX2NvcHlfc2Nhbl9yZXN1bHQodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKik7Cit2b2lkIGxpbV9jaGVja19hbmRfYWRkX2Jzc19kZXNjcmlwdGlvbih0cEFuaVNpckdsb2JhbCwgdHBTaXJQcm9iZVJlc3BCZWFjb24sCisJCQkJICAgICAgIHVpbnQ4X3QgKiwgYm9vbCwgdWludDhfdCk7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCitDREZfU1RBVFVTIGxpbV9jb2xsZWN0X2Jzc19kZXNjcmlwdGlvbih0cEFuaVNpckdsb2JhbCwKKwkJCQkgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICosCisJCQkJICAgICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uLCB1aW50OF90ICosIHVpbnQ4X3QpOworI2Vsc2UKK0NERl9TVEFUVVMgbGltX2NvbGxlY3RfYnNzX2Rlc2NyaXB0aW9uKHRwQW5pU2lyR2xvYmFsLAorCQkJCSAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKiwKKwkJCQkgICAgICAgdHBTaXJQcm9iZVJlc3BCZWFjb24sIHVpbnQ4X3QgKik7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElNX1NDQU5fVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VjdXJpdHlfdXRpbHMuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3NlY3VyaXR5X3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwYTQyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3NlY3VyaXR5X3V0aWxzLmMKQEAgLTAsMCArMSwxMDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBsaW1fdXRpbHMuY2MgY29udGFpbnMgdGhlIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBMSU0gdXNlcy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzEzLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgInduaV9hcGkuaCIKKworI2luY2x1ZGUgInNpcl9jb21tb24uaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlY3VyaXR5X3V0aWxzLmgiCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlICJsaW1fZnRfZGVmcy5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltX3Nlc3Npb24uaCIKKworI2RlZmluZSBMSU1fU0VFRF9MRU5HVEggMTYKKy8qCisgKiBwcmVhdXRoIG5vZGUgdGltZW91dCB2YWx1ZSBpbiBpbnRlcnZhbCBvZiAxMG1zZWMKKyAqLworI2RlZmluZSBMSU1fT1BFTkFVVEhfVElNRU9VVCA1MDAKKworLyoqCisgKiBsaW1faXNfYXV0aF9hbGdvX3N1cHBvcnRlZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdmFyaW91cyBwbGFjZXMgd2l0aGluIExJTSBjb2RlCisgKiB0byBkZXRlcm1pbmUgd2hldGhlciBwYXNzZWQgYXV0aGVudGljYXRpb24gYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAqIG9yIG5vdAorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gYXV0aFR5cGUgSW5kaWNhdGVzIE1BQyBiYXNlZCBhdXRoZW50aWNhdGlvbiB0eXBlCisgKiAgICAgICAgICAgICAgICAgKGVTSVJfT1BFTl9TWVNURU0gb3IgZVNJUl9TSEFSRURfS0VZKQorICogICAgICAgICAgICAgICAgIElmIFNoYXJlZCBLZXkgYXV0aGVudGljYXRpb24gdG8gYmUgdXNlZCwKKyAqICAgICAgICAgICAgICAgICAnUHJpdmFjeSBPcHRpb24gSW1wbGVtZW50ZWQnIGZsYWcgaXMgYWxzbworICogICAgICAgICAgICAgICAgIGNoZWNrZWQuCisgKgorICogQHJldHVybiB0cnVlIGlmIHBhc3NlZCBhdXRoVHlwZSBpcyBlbmFibGVkIGVsc2UgZmFsc2UKKyAqLwordWludDhfdAorbGltX2lzX2F1dGhfYWxnb19zdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFuaUF1dGhUeXBlIGF1dGhUeXBlLAorCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MzJfdCBhbGdvRW5hYmxlLCBwcml2YWN5T3B0SW1wOworCisJaWYgKGF1dGhUeXBlID09IGVTSVJfT1BFTl9TWVNURU0pIHsKKworCQlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJCWlmICgocHNlc3Npb25FbnRyeS0+YXV0aFR5cGUgPT0gZVNJUl9PUEVOX1NZU1RFTSkKKwkJCSAgICB8fCAocHNlc3Npb25FbnRyeS0+YXV0aFR5cGUgPT0gZVNJUl9BVVRPX1NXSVRDSCkpCisJCQkJcmV0dXJuIHRydWU7CisJCQllbHNlCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19PUEVOX1NZU1RFTV9BVVRIX0VOQUJMRSwKKwkJCQkgICAgICZhbGdvRW5hYmxlKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCS8qKgorCQkJICogQ291bGQgbm90IGdldCBBdXRoQWxnbzEgRW5hYmxlIHZhbHVlCisJCQkgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorCQkJICovCisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBBdXRoQWxnbzEgRW5hYmxlIHZhbHVlIikpOworCisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZQorCQkJcmV0dXJuICgoYWxnb0VuYWJsZSA+IDAgPyB0cnVlIDogZmFsc2UpKTsKKwl9IGVsc2UgeworCisJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJaWYgKChwc2Vzc2lvbkVudHJ5LT5hdXRoVHlwZSA9PSBlU0lSX1NIQVJFRF9LRVkpCisJCQkgICAgfHwgKHBzZXNzaW9uRW50cnktPmF1dGhUeXBlID09IGVTSVJfQVVUT19TV0lUQ0gpKQorCQkJCWFsZ29FbmFibGUgPSB0cnVlOworCQkJZWxzZQorCQkJCWFsZ29FbmFibGUgPSBmYWxzZTsKKworCQl9IGVsc2UKKworCQlpZiAod2xhbl9jZmdfZ2V0X2ludAorCQkJICAgIChwTWFjLCBXTklfQ0ZHX1NIQVJFRF9LRVlfQVVUSF9FTkFCTEUsCisJCQkgICAgJmFsZ29FbmFibGUpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJLyoqCisJCQkgKiBDb3VsZCBub3QgZ2V0IEF1dGhBbGdvMiBFbmFibGUgdmFsdWUKKwkJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIEF1dGhBbGdvMiBFbmFibGUgdmFsdWUiKSk7CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJcHJpdmFjeU9wdEltcCA9IHBzZXNzaW9uRW50cnktPnByaXZhY3k7CisJCX0gZWxzZQorCisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfUFJJVkFDWV9FTkFCTEVELAorCQkJCSAgICAgJnByaXZhY3lPcHRJbXApICE9IGVTSVJfU1VDQ0VTUykKKwkJeworCQkJLyoqCisJCQkgKiBDb3VsZCBub3QgZ2V0IFByaXZhY3lPcHRpb25JbXBsZW1lbnRlZCB2YWx1ZQorCQkJICogZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJCSAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiY291bGQgbm90IHJldHJpZXZlIFByaXZhY3lPcHRJbXBsZW1lbnRlZCB2YWx1ZSIpKTsKKworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiAoYWxnb0VuYWJsZSAmJiBwcml2YWN5T3B0SW1wKTsKKwl9Cit9IC8qKioqKiogZW5kIGxpbV9pc19hdXRoX2FsZ29fc3VwcG9ydGVkKCkgKioqKioqLworCisvKioKKyAqIGxpbV9pbml0X3ByZV9hdXRoX2xpc3QKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGlsZSBzdGFydGluZyBhIEJTUyBhdCBBUAorICogdG8gaW5pdGlhbGl6ZSBNQUMgYXV0aGVudGljYXRlZCBTVEEgbGlzdC4gVGhpcyBtYXkgYWxzbyBiZSBjYWxsZWQKKyAqIHdoaWxlIGpvaW5pbmcvc3RhcnRpbmcgYW4gSUJTUyBpZiBNQUMgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZAorICogaW4gSUJTUyBtb2RlLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1faW5pdF9wcmVfYXV0aF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJcE1hYy0+bGltLnBMaW1QcmVBdXRoTGlzdCA9IE5VTEw7CisKK30gLyoqKiBlbmQgbGltX2luaXRfcHJlX2F1dGhfbGlzdCgpICoqKi8KKworLyoqCisgKiBsaW1fZGVsZXRlX3ByZV9hdXRoX2xpc3QKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBjbGVhbnVwIFByZS1hdXRoIGxpc3QgZWl0aGVyIG9uCisgKiBBUCBvciBvbiBTVEEgd2hlbiBtb3ZpbmcgZnJvbSBvbmUgcGVyc29uYSB0byBvdGhlci4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX2RlbGV0ZV9wcmVfYXV0aF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqcEN1cnJOb2RlLCAqcFRlbXBOb2RlOworCisJcEN1cnJOb2RlID0gcFRlbXBOb2RlID0gcE1hYy0+bGltLnBMaW1QcmVBdXRoTGlzdDsKKwl3aGlsZSAocEN1cnJOb2RlICE9IE5VTEwpIHsKKwkJcFRlbXBOb2RlID0gcEN1cnJOb2RlLT5uZXh0OworCisJCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCI9PT09PT4gbGltX2RlbGV0ZV9wcmVfYXV0aF9saXN0ICIpKTspCisJCWxpbV9yZWxlYXNlX3ByZV9hdXRoX25vZGUocE1hYywgcEN1cnJOb2RlKTsKKworCQlwQ3Vyck5vZGUgPSBwVGVtcE5vZGU7CisJfQorCXBNYWMtPmxpbS5wTGltUHJlQXV0aExpc3QgPSBOVUxMOworfSAvKioqIGVuZCBsaW1fZGVsZXRlX3ByZV9hdXRoX2xpc3QoKSAqKiovCisKKy8qKgorICogbGltX3NlYXJjaF9wcmVfYXV0aF9saXN0CisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBBdXRoZW50aWNhdGlvbiBmcmFtZSBpcyByZWNlaXZlZAorICogYnkgQVAgKG9yIGF0IGEgU1RBIGluIElCU1Mgc3VwcG9ydGluZyBNQUMgYmFzZWQgYXV0aGVudGljYXRpb24pCisgKiB0byBzZWFyY2ggaWYgYSBTVEEgaXMgaW4gdGhlIG1pZGRsZSBvZiBNQUMgQXV0aGVudGljYXRpb24KKyAqIHRyYW5zYWN0aW9uIHNlcXVlbmNlLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBtYWNBZGRyIC0gTUFDIGFkZHJlc3Mgb2YgdGhlIFNUQSB0aGF0IHNlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvbiBmcmFtZS4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gcHJlLWF1dGggbm9kZSBpZiBmb3VuZCwgZWxzZSBOVUxMCisgKi8KKworc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqbGltX3NlYXJjaF9wcmVfYXV0aF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgdFNpck1hY0FkZHIgbWFjQWRkcikKK3sKKwlzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICpwVGVtcE5vZGUgPSBwTWFjLT5saW0ucExpbVByZUF1dGhMaXN0OworCisJd2hpbGUgKHBUZW1wTm9kZSAhPSBOVUxMKSB7CisJCWlmIChjZGZfbWVtX2NvbXBhcmUoKHVpbnQ4X3QgKikgbWFjQWRkciwKKwkJCQkgICAgKHVpbnQ4X3QgKikgJnBUZW1wTm9kZS0+cGVlck1hY0FkZHIsCisJCQkJICAgIHNpemVvZih0U2lyTWFjQWRkcikpKQorCQkJYnJlYWs7CisKKwkJcFRlbXBOb2RlID0gcFRlbXBOb2RlLT5uZXh0OworCX0KKworCXJldHVybiBwVGVtcE5vZGU7Cit9IC8qKiogZW5kIGxpbV9zZWFyY2hfcHJlX2F1dGhfbGlzdCgpICoqKi8KKworLyoqCisgKiBsaW1fZGVsZXRlX29wZW5fYXV0aF9wcmVfYXV0aF9ub2RlKCkgLSBkZWxldGUgYW55IHN0YWxlIHByZWF1dGggbm9kZXMKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVsZXRlIGFueSBzdGFsZSBwcmVhdXRoIG5vZGVzIG9uCisgKiByZWNlaXZpbmcgYXV0aGVudGljYXRpb24gZnJhbWUgYW5kIGV4aXN0aW5nIHByZWF1dGggbm9kZXMKKyAqIHJlYWNoZWQgdGhlIG1heGltdW0gYWxsb3dlZCBsaW1pdC4KKyAqCisgKiBSZXR1cm46IHJldHVybiB0cnVlIGlmIGFueSBwcmVhdXRobm9kZSBkZWxldGVkIGVsc2UgZmFsc2UKKyAqLwordWludDhfdAorbGltX2RlbGV0ZV9vcGVuX2F1dGhfcHJlX2F1dGhfbm9kZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4KQoreworCXN0cnVjdCB0TGltUHJlQXV0aE5vZGUgICAgKnByZXZfbm9kZSwgKnRlbXBfbm9kZSwgKmZvdW5kX25vZGU7CisJdWludDhfdCBhdXRoX25vZGVfZnJlZWQgPSBmYWxzZTsKKworCXRlbXBfbm9kZSA9IHByZXZfbm9kZSA9IG1hY19jdHgtPmxpbS5wTGltUHJlQXV0aExpc3Q7CisKKwlpZiAodGVtcF9ub2RlID09IE5VTEwpCisJCXJldHVybiBhdXRoX25vZGVfZnJlZWQ7CisKKwl3aGlsZSAodGVtcF9ub2RlICE9IE5VTEwpIHsKKwkJaWYgKHRlbXBfbm9kZS0+bWxtU3RhdGUgPT0gZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURSAmJgorCQkgICAgdGVtcF9ub2RlLT5hdXRoVHlwZSA9PSBlU0lSX09QRU5fU1lTVEVNICYmCisJCSAgICAoY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKSA+CisJCSAgICAoTElNX09QRU5BVVRIX1RJTUVPVVQgKyB0ZW1wX25vZGUtPnRpbWVzdGFtcCkgfHwKKwkJICAgIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCkgPCB0ZW1wX25vZGUtPnRpbWVzdGFtcCkpIHsKKwkJCS8qIEZvdW5kIG5vZGUgdG8gYmUgZGVsZXRlZCAqLworCQkJYXV0aF9ub2RlX2ZyZWVkID0gdHJ1ZTsKKwkJCWZvdW5kX25vZGUgPSB0ZW1wX25vZGU7CisJCQlpZiAobWFjX2N0eC0+bGltLnBMaW1QcmVBdXRoTGlzdCA9PSB0ZW1wX25vZGUpIHsKKwkJCQlwcmV2X25vZGUgPSBtYWNfY3R4LT5saW0ucExpbVByZUF1dGhMaXN0ID0KKwkJCQkJdGVtcF9ub2RlID0gZm91bmRfbm9kZS0+bmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJcHJldl9ub2RlLT5uZXh0ID0gdGVtcF9ub2RlLT5uZXh0OworCQkJCXRlbXBfbm9kZSA9IHByZXZfbm9kZS0+bmV4dDsKKwkJCX0KKworCQkJbGltX3JlbGVhc2VfcHJlX2F1dGhfbm9kZShtYWNfY3R4LCBmb3VuZF9ub2RlKTsKKwkJfSBlbHNlIHsKKwkJCXByZXZfbm9kZSA9IHRlbXBfbm9kZTsKKwkJCXRlbXBfbm9kZSA9IHByZXZfbm9kZS0+bmV4dDsKKwkJfQorCX0KKworCXJldHVybiBhdXRoX25vZGVfZnJlZWQ7Cit9CisKKy8qKgorICogbGltX2FkZF9wcmVfYXV0aF9ub2RlCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgQVAgd2hpbGUgc2VuZGluZyBBdXRoZW50aWNhdGlvbgorICogZnJhbWUyLgorICogVGhpcyBtYXkgYWxzbyBiZSBjYWxsZWQgb24gYSBTVEEgaW4gSUJTUyBpZiBNQUMgYXV0aGVudGljYXRpb24gaXMKKyAqIGFsbG93ZWQgaW4gSUJTUyBtb2RlLgorICoKKyAqKipMT0dJQzoKKyAqIE5vZGUgaXMgYWx3YXlzIGFkZGVkIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdAorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBBdXRoTm9kZSAtIFBvaW50ZXIgdG8gcHJlLWF1dGggbm9kZSB0byBiZSBhZGRlZCB0byB0aGUgbGlzdC4KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbV9hZGRfcHJlX2F1dGhfbm9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCBzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICpwQXV0aE5vZGUpCit7CisJcE1hYy0+bGltLmdMaW1OdW1QcmVBdXRoQ29udGV4dHMrKzsKKworCXBBdXRoTm9kZS0+bmV4dCA9IHBNYWMtPmxpbS5wTGltUHJlQXV0aExpc3Q7CisKKwlwTWFjLT5saW0ucExpbVByZUF1dGhMaXN0ID0gcEF1dGhOb2RlOworfSAvKioqIGVuZCBsaW1fYWRkX3ByZV9hdXRoX25vZGUoKSAqKiovCisKKy8qKgorICogbGltX3JlbGVhc2VfcHJlX2F1dGhfbm9kZQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWxlYXNlIHRoZSBhY2NxdWlyZWQKKyAqIHByZSBhdXRoIG5vZGUgZnJvbSBsaXN0LgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwQXV0aE5vZGUgLSBQb2ludGVyIHRvIFByZSBBdXRoIG5vZGUgdG8gYmUgcmVsZWFzZWQKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX3JlbGVhc2VfcHJlX2F1dGhfbm9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cExpbVByZUF1dGhOb2RlIHBBdXRoTm9kZSkKK3sKKwlwQXV0aE5vZGUtPmZGcmVlID0gMTsKKwlNVFJBQ0UobWFjX3RyYWNlCisJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9ERUFDVElWQVRFLCBOT19TRVNTSU9OLAorCQkgICAgICAgZUxJTV9QUkVfQVVUSF9DTEVBTlVQX1RJTUVSKSk7CisJdHhfdGltZXJfZGVhY3RpdmF0ZSgmcEF1dGhOb2RlLT50aW1lcik7CisJcE1hYy0+bGltLmdMaW1OdW1QcmVBdXRoQ29udGV4dHMtLTsKK30gLyoqKiBlbmQgbGltX3JlbGVhc2VfcHJlX2F1dGhfbm9kZSgpICoqKi8KKworLyoqCisgKiBsaW1fZGVsZXRlX3ByZV9hdXRoX25vZGUKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBBUCB3aGVuIGEgcHJlLWF1dGhlbnRpY2F0ZWQgU1RBIGlzCisgKiBBc3NvY2lhdGVkL1JlYXNzb2NpYXRlZCBvciB3aGVuIEF1dGhGcmFtZTQgaXMgcmVjZWl2ZWQgYWZ0ZXIKKyAqIEF1dGggUmVzcG9uc2UgdGltZW91dC4KKyAqIFRoaXMgbWF5IGFsc28gYmUgY2FsbGVkIG9uIGEgU1RBIGluIElCU1MgaWYgTUFDIGF1dGhlbnRpY2F0aW9uIGFuZAorICogQXNzb2NpYXRpb24vUmVhc3NvY2lhdGlvbiBpcyBhbGxvd2VkIGluIElCU1MgbW9kZS4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcGVlck1hY0FkZHIgLSBNQUMgYWRkcmVzcyBvZiB0aGUgU1RBIHRoYXQgbmVlZCB0byBiZSBkZWxldGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwcmUtYXV0aCBub2RlIGxpc3QuCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1fZGVsZXRlX3ByZV9hdXRoX25vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgbWFjQWRkcikKK3sKKwlzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICpwUHJldk5vZGUsICpwVGVtcE5vZGU7CisKKwlwVGVtcE5vZGUgPSBwUHJldk5vZGUgPSBwTWFjLT5saW0ucExpbVByZUF1dGhMaXN0OworCisJaWYgKHBUZW1wTm9kZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoY2RmX21lbV9jb21wYXJlKCh1aW50OF90ICopIG1hY0FkZHIsCisJCQkgICAgKHVpbnQ4X3QgKikgJnBUZW1wTm9kZS0+cGVlck1hY0FkZHIsCisJCQkgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJLyogRmlyc3Qgbm9kZSB0byBiZSBkZWxldGVkICovCisKKwkJcE1hYy0+bGltLnBMaW1QcmVBdXRoTGlzdCA9IHBUZW1wTm9kZS0+bmV4dDsKKworCQlQRUxPRzEobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiPT09PT0+IGxpbV9kZWxldGVfcHJlX2F1dGhfbm9kZSA6IGZpcnN0IG5vZGUgdG8gZGVsZXRlIikpOworCQkgICAgICAgKQorCQlQRUxPRzEobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJICAgICAgIEZMKCJSZWxlYXNlIGRhdGEgZW50cnk6ICV4IGlkICVkIHBlZXIgIiksIHBUZW1wTm9kZSwKKwkJCSAgICAgICBwVGVtcE5vZGUtPmF1dGhOb2RlSWR4KTsKKwkJICAgICAgIGxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBtYWNBZGRyLCBMT0cxKTsKKwkJICAgICAgICkKKwkJbGltX3JlbGVhc2VfcHJlX2F1dGhfbm9kZShwTWFjLCBwVGVtcE5vZGUpOworCisJCXJldHVybjsKKwl9CisKKwlwVGVtcE5vZGUgPSBwVGVtcE5vZGUtPm5leHQ7CisKKwl3aGlsZSAocFRlbXBOb2RlICE9IE5VTEwpIHsKKwkJaWYgKGNkZl9tZW1fY29tcGFyZSgodWludDhfdCAqKSBtYWNBZGRyLAorCQkJCSAgICAodWludDhfdCAqKSAmcFRlbXBOb2RlLT5wZWVyTWFjQWRkciwKKwkJCQkgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCS8qIEZvdW5kIG5vZGUgdG8gYmUgZGVsZXRlZCAqLworCisJCQlwUHJldk5vZGUtPm5leHQgPSBwVGVtcE5vZGUtPm5leHQ7CisKKwkJCVBFTE9HMShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCI9PT09PT4gbGltX2RlbGV0ZV9wcmVfYXV0aF9ub2RlIDogc3Vic2VxdWVudCBub2RlIHRvIGRlbGV0ZSIpKTsKKwkJCSAgICAgICBsaW1fbG9nKHBNYWMsIExPRzEsCisJCQkJICAgICAgIEZMKCJSZWxlYXNlIGRhdGEgZW50cnk6ICV4IGlkICVkIHBlZXIgIiksCisJCQkJICAgICAgIHBUZW1wTm9kZSwgcFRlbXBOb2RlLT5hdXRoTm9kZUlkeCk7CisJCQkgICAgICAgbGltX3ByaW50X21hY19hZGRyKHBNYWMsIG1hY0FkZHIsIExPRzEpOworCQkJICAgICAgICkKKwkJCWxpbV9yZWxlYXNlX3ByZV9hdXRoX25vZGUocE1hYywgcFRlbXBOb2RlKTsKKworCQkJcmV0dXJuOworCQl9CisKKwkJcFByZXZOb2RlID0gcFRlbXBOb2RlOworCQlwVGVtcE5vZGUgPSBwVGVtcE5vZGUtPm5leHQ7CisJfQorCisJLyogU2hvdWxkIG5vdCBiZSBoZXJlICovCisJLyogTG9nIGVycm9yICovCisJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgicGVlciBub3QgZm91bmQgaW4gcHJlLWF1dGggbGlzdCwgYWRkcj0gIikpOworCWxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBtYWNBZGRyLCBMT0dQKTsKKworfSAvKioqIGVuZCBsaW1fZGVsZXRlX3ByZV9hdXRoX25vZGUoKSAqKiovCisKKy8qKgorICogbGltUmVzdG9yZUZyb21QcmVBdXRoU3RhdGUKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBTVEEgd2hlbmV2ZXIgYW4gQXV0aGVudGljYXRpb24KKyAqIHNlcXVlbmNlIGlzIGNvbXBsZXRlIGFuZCBzdGF0ZSBwcmlvciB0byBhdXRoIG5lZWQgdG8gYmUKKyAqIHJlc3RvcmVkLgorICoKKyAqKipMT0dJQzoKKyAqIE1MTV9BVVRIX0NORiBpcyBwcmVwYXJlZCBhbmQgc2VudCB0byBTTUUgc3RhdGUgbWFjaGluZS4KKyAqIEluIGNhc2Ugb2YgcmVzdG9yaW5nIGZyb20gcHJlLWF1dGg6CisgKiAgICAgLSBDaGFubmVsIElkIGlzIHByb2dyYW1tZWQgYXQgTE8vUkYgc3ludGhlc2l6ZXIKKyAqICAgICAtIEJTU0lEIGlzIHByb2dyYW1tZWQgYXQgUkhQCisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcmVzdWx0Q29kZSAtIHJlc3VsdCBvZiBhdXRoZW50aWNhdGlvbiBhdHRlbXB0CisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1fcmVzdG9yZV9mcm9tX2F1dGhfc3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUsCisJCQkgICAgdWludDE2X3QgcHJvdFN0YXR1c0NvZGUsIHRwUEVTZXNzaW9uIHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyTWFjQWRkciBjdXJyZW50QnNzSWQ7CisJdExpbU1sbUF1dGhDbmYgbWxtQXV0aENuZjsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKwlsaW1fZGlhZ19ldmVudF9yZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0FVVEhfQ09NUF9FVkVOVCwgc2Vzc2lvbkVudHJ5LAorCQkJICAgICAgcmVzdWx0Q29kZSwgcHJvdFN0YXR1c0NvZGUpOworI2VuZGlmCisKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJm1sbUF1dGhDbmYucGVlck1hY0FkZHIsCisJCSAgICAgKHVpbnQ4X3QgKikgJnBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPnBlZXJNYWNBZGRyLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCW1sbUF1dGhDbmYuYXV0aFR5cGUgPSBwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5hdXRoVHlwZTsKKwltbG1BdXRoQ25mLnJlc3VsdENvZGUgPSByZXN1bHRDb2RlOworCW1sbUF1dGhDbmYucHJvdFN0YXR1c0NvZGUgPSBwcm90U3RhdHVzQ29kZTsKKworCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElEICovCisJbWxtQXV0aENuZi5zZXNzaW9uSWQgPSBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisJLyogLyBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgKi8KKwkvKiAvIGZvciBwTWFjLT5saW0uZ0xpbU1sbUF1dGhSZXEgKi8KKwljZGZfbWVtX2ZyZWUocE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcSk7CisJcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcSA9IE5VTEw7CisKKwlzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gc2Vzc2lvbkVudHJ5LT5saW1QcmV2TWxtU3RhdGU7CisKKwlNVFJBQ0UobWFjX3RyYWNlCisJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCSAgICAgICBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKSk7CisKKwkvKiAnQ2hhbmdlJyB0aW1lciBmb3IgZnV0dXJlIGFjdGl2YXRpb25zICovCisJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihwTWFjLCBlTElNX0FVVEhfRkFJTF9USU1FUik7CisKKwlzaXJfY29weV9tYWNfYWRkcihjdXJyZW50QnNzSWQsIHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisJaWYgKHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfV1RfUFJFX0FVVEhfU1RBVEUpIHsKKwkJcE1hYy0+bGltLmdMaW1QcmVBdXRoQ2hhbm5lbE51bWJlciA9IDA7CisJfQorCisJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywgTElNX01MTV9BVVRIX0NORiwgKHVpbnQzMl90ICopICZtbG1BdXRoQ25mKTsKK30gLyoqKiBlbmQgbGltX3Jlc3RvcmVfZnJvbV9hdXRoX3N0YXRlKCkgKioqLworCisvKioKKyAqIGxpbV9lbmNyeXB0X2F1dGhfZnJhbWUoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGxpbV9wcm9jZXNzX2F1dGhfZnJhbWUoKSBmdW5jdGlvbgorICogdG8gZW5jcnlwdCBBdXRoZW50aWNhdGlvbiBmcmFtZTMgYm9keS4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGtleUlkICAgICAgICAgIGtleSBpZCB0byB1c2VkCisgKiBAcGFyYW0gIHBLZXkgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGtleSB0byBiZSB1c2VkIGZvciBlbmNyeXB0aW9uCisgKiBAcGFyYW0gIHBQbGFpblRleHQgICAgIFBvaW50ZXIgdG8gdGhlIGJvZHkgdG8gYmUgZW5jcnlwdGVkCisgKiBAcGFyYW0gIHBFbmNyQm9keSAgICAgIFBvaW50ZXIgdG8gdGhlIGVuY3J5cHRlZCBhdXRoIGZyYW1lIGJvZHkKKyAqIEBwYXJhbSAga2V5TGVuZ3RoICAgICAgOCAoV0VQNDApIG9yIDE2IChXRVAxMDQpCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1fZW5jcnlwdF9hdXRoX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qga2V5SWQsIHVpbnQ4X3QgKnBLZXksCisJCSAgICAgICB1aW50OF90ICpwUGxhaW5UZXh0LCB1aW50OF90ICpwRW5jckJvZHksCisJCSAgICAgICB1aW50MzJfdCBrZXlMZW5ndGgpCit7CisJdWludDhfdCBzZWVkW0xJTV9TRUVEX0xFTkdUSF0sIGljdltTSVJfTUFDX1dFUF9JQ1ZfTEVOR1RIXTsKKworCWtleUxlbmd0aCArPSAzOworCisJLyogQnl0ZXMgMy03IG9mIHNlZWQgaXMga2V5ICovCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZzZWVkWzNdLCBwS2V5LCBrZXlMZW5ndGggLSAzKTsKKworCS8qIENvbXB1dGUgQ1JDLTMyIGFuZCBwbGFjZSB0aGVtIGluIGxhc3QgNCBieXRlcyBvZiBwbGFpbiB0ZXh0ICovCisJbGltX2NvbXB1dGVfY3JjMzIoaWN2LCBwUGxhaW5UZXh0LCBzaXplb2YodFNpck1hY0F1dGhGcmFtZUJvZHkpKTsKKworCWNkZl9tZW1fY29weShwUGxhaW5UZXh0ICsgc2l6ZW9mKHRTaXJNYWNBdXRoRnJhbWVCb2R5KSwKKwkJICAgICBpY3YsIFNJUl9NQUNfV0VQX0lDVl9MRU5HVEgpOworCisJLyogUnVuIFJDNCBvbiBwbGFpbiB0ZXh0IHdpdGggdGhlIHNlZWQgKi8KKwlsaW1fcmM0KHBFbmNyQm9keSArIFNJUl9NQUNfV0VQX0lWX0xFTkdUSCwKKwkJKHVpbnQ4X3QgKikgcFBsYWluVGV4dCwgc2VlZCwga2V5TGVuZ3RoLAorCQlMSU1fRU5DUl9BVVRIX0JPRFlfTEVOIC0gU0lSX01BQ19XRVBfSVZfTEVOR1RIKTsKKworCS8qIFByZXBhcmUgSVYgKi8KKwlwRW5jckJvZHlbMF0gPSBzZWVkWzBdOworCXBFbmNyQm9keVsxXSA9IHNlZWRbMV07CisJcEVuY3JCb2R5WzJdID0gc2VlZFsyXTsKKwlwRW5jckJvZHlbM10gPSBrZXlJZCA8PCA2OworfSAvKioqKioqIGVuZCBsaW1fZW5jcnlwdF9hdXRoX2ZyYW1lKCkgKioqKioqLworCisvKioKKyAqIGxpbV9jb21wdXRlX2NyYzMyKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjb21wdXRlIENSQy0zMiBvbiBhIGdpdmVuIHNvdXJjZS4KKyAqIFVzZWQgd2hpbGUgZW5jcnlwdGluZy9kZWNyeXB0aW5nIEF1dGhlbnRpY2F0aW9uIGZyYW1lIDMuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcERlc3QgICAgRGVzdGluYXRpb24gbG9jYXRpb24gZm9yIGNvbXB1dGVkIENSQworICogQHBhcmFtICBwU3JjICAgICBTb3VyY2UgbG9jYXRpb24gdG8gYmUgQ1JDIGNvbXB1dGVkCisgKiBAcGFyYW0gIGxlbiAgICAgIExlbmd0aCBvdmVyIHdoaWNoIENSQyB0byBiZSBjb21wdXRlZAorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1fY29tcHV0ZV9jcmMzMih1aW50OF90ICpwRGVzdCwgdWludDhfdCAqcFNyYywgdWludDhfdCBsZW4pCit7CisJdWludDMyX3QgY3JjOworCWludCBpOworCisJY3JjID0gMDsKKwljcmMgPSB+Y3JjOworCisJd2hpbGUgKGxlbi0tID4gMCkKKwkJY3JjID0gbGltX2NyY191cGRhdGUoY3JjLCAqcFNyYysrKTsKKworCWNyYyA9IH5jcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0lSX01BQ19XRVBfSVZfTEVOR1RIOyBpKyspIHsKKwkJcERlc3RbaV0gPSAodWludDhfdCkgY3JjOworCQljcmMgPj49IDg7CisJfQorfSAvKioqKioqIGVuZCBsaW1fY29tcHV0ZV9jcmMzMigpICoqKioqKi8KKworLyoqCisgKiBsaW1fcmM0KCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBydW4gUkM0IGFsZ29yaXRobS4gQ2FsbGVkIHdoaWxlCisgKiBlbmNyeXB0aW5nL2RlY3J5cHRpbmcgQXV0aGVudGljYXRpb24gZnJhbWUgMy4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwRGVzdCAgICAgICAgICBEZXN0aW5hdGlvbiBsb2NhdGlvbiBmb3IgZW5jcnlwdGVkIHRleHQKKyAqIEBwYXJhbSAgcFNyYyAgICAgICAgICAgU291cmNlIGxvY2F0aW9uIHRvIGJlIGVuY3J5cHRlZAorICogQHBhcmFtICBzZWVkICAgICAgICAgICBDb250YWlucyBzZWVkIChJViArIGtleSkgZm9yIFBSTkcKKyAqIEBwYXJhbSAga2V5TGVuZ3RoICAgICAgOCAoV0VQNDApIG9yIDE2IChXRVAxMDQpCisgKiBAcGFyYW0gIGZyYW1lTGVuICAgICAgIExlbmd0aCBvZiB0aGUgZnJhbWUKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1fcmM0KHVpbnQ4X3QgKnBEZXN0LCB1aW50OF90ICpwU3JjLCB1aW50OF90ICpzZWVkLCB1aW50MzJfdCBrZXlMZW5ndGgsCisJdWludDE2X3QgZnJhbWVMZW4pCit7CisJdHlwZWRlZiBzdHJ1Y3QgeworCQl1aW50OF90IGksIGo7CisJCXVpbnQ4X3Qgc2JveFsyNTZdOworCX0gdFJDNENvbnRleHQ7CisKKwl0UkM0Q29udGV4dCBjdHg7CisKKwl7CisJCXVpbnQxNl90IGksIGosIGs7CisKKwkJLyogKi8KKwkJLyogSW5pdGlhbGl6ZSBzYm94IHVzaW5nIHNlZWQgKi8KKwkJLyogKi8KKworCQljdHguaSA9IGN0eC5qID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJY3R4LnNib3hbaV0gPSAodWludDhfdCkgaTsKKworCQlqID0gMDsKKwkJayA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJdWludDhfdCB0ZW1wOworCQkJaWYgKGsgPCBMSU1fU0VFRF9MRU5HVEgpCisJCQkJaiA9ICh1aW50OF90KSAoaiArIGN0eC5zYm94W2ldICsgc2VlZFtrXSk7CisJCQl0ZW1wID0gY3R4LnNib3hbaV07CisJCQljdHguc2JveFtpXSA9IGN0eC5zYm94W2pdOworCQkJY3R4LnNib3hbal0gPSB0ZW1wOworCisJCQlpZiAoKytrID49IGtleUxlbmd0aCkKKwkJCQlrID0gMDsKKwkJfQorCX0KKworCXsKKwkJdWludDhfdCBpID0gY3R4Lmk7CisJCXVpbnQ4X3QgaiA9IGN0eC5qOworCQl1aW50OF90IGxlbiA9ICh1aW50OF90KSBmcmFtZUxlbjsKKworCQl3aGlsZSAobGVuLS0gPiAwKSB7CisJCQl1aW50OF90IHRlbXAxLCB0ZW1wMjsKKworCQkJaSA9ICh1aW50OF90KSAoaSArIDEpOworCQkJdGVtcDEgPSBjdHguc2JveFtpXTsKKwkJCWogPSAodWludDhfdCkgKGogKyB0ZW1wMSk7CisKKwkJCWN0eC5zYm94W2ldID0gdGVtcDIgPSBjdHguc2JveFtqXTsKKwkJCWN0eC5zYm94W2pdID0gdGVtcDE7CisKKwkJCXRlbXAxID0gKHVpbnQ4X3QpICh0ZW1wMSArIHRlbXAyKTsKKwkJCXRlbXAxID0gY3R4LnNib3hbdGVtcDFdOworCQkJdGVtcDIgPSAodWludDhfdCkgKHBTcmMgPyAqcFNyYysrIDogMCk7CisKKwkJCSpwRGVzdCsrID0gKHVpbnQ4X3QpICh0ZW1wMSBeIHRlbXAyKTsKKwkJfQorCisJCWN0eC5pID0gaTsKKwkJY3R4LmogPSBqOworCX0KK30gLyoqKioqKiBlbmQgbGltX3JjNCgpICoqKioqKi8KKworLyoqCisgKiBsaW1fZGVjcnlwdF9hdXRoX2ZyYW1lKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBsaW1fcHJvY2Vzc19hdXRoX2ZyYW1lKCkgZnVuY3Rpb24KKyAqIHRvIGRlY3J5cHQgcmVjZWl2ZWQgQXV0aGVudGljYXRpb24gZnJhbWUzIGJvZHkuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwS2V5ICAgICAgIFBvaW50ZXIgdG8gdGhlIGtleSB0byBiZSB1c2VkIGZvciBkZWNyeXB0aW9uCisgKiBAcGFyYW0gcEVuY3JCb2R5ICBQb2ludGVyIHRvIHRoZSBib2R5IHRvIGJlIGRlY3J5cHRlZAorICogQHBhcmFtIHBQbGFpbkJvZHkgUG9pbnRlciB0byB0aGUgZGVjcnlwdGVkIGJvZHkKKyAqIEBwYXJhbSBrZXlMZW5ndGggIDggKFdFUDQwKSBvciAxNiAoV0VQMTA0KQorICoKKyAqIEByZXR1cm4gRGVjcnlwdCByZXN1bHQgLSBlU0lSX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX0RFQ1JZUFRfSUNWX0ZBSUwgZm9yIElDViBtaXNtYXRjaC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkZWNyeXB0aW9uIGlzIGEgc3VjY2VzcywgcEJvZHkgd2lsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgZGVjcnlwdGVkIGF1dGggZnJhbWUgYm9keS4KKyAqLworCit1aW50OF90CitsaW1fZGVjcnlwdF9hdXRoX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBLZXksIHVpbnQ4X3QgKnBFbmNyQm9keSwKKwkJICAgICAgIHVpbnQ4X3QgKnBQbGFpbkJvZHksIHVpbnQzMl90IGtleUxlbmd0aCwgdWludDE2X3QgZnJhbWVMZW4pCit7CisJdWludDhfdCBzZWVkW0xJTV9TRUVEX0xFTkdUSF0sIGljdltTSVJfTUFDX1dFUF9JQ1ZfTEVOR1RIXTsKKwlpbnQgaTsKKwlrZXlMZW5ndGggKz0gMzsKKworCS8qIEJ5dGVzIDAtMiBvZiBzZWVkIGlzIHJlY2VpdmVkIElWICovCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHNlZWQsIHBFbmNyQm9keSwgU0lSX01BQ19XRVBfSVZfTEVOR1RIIC0gMSk7CisKKwkvKiBCeXRlcyAzLTcgb2Ygc2VlZCBpcyBrZXkgKi8KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnNlZWRbM10sIHBLZXksIGtleUxlbmd0aCAtIDMpOworCisJLyogUnVuIFJDNCBvbiBlbmNyeXB0ZWQgdGV4dCB3aXRoIHRoZSBzZWVkICovCisJbGltX3JjNChwUGxhaW5Cb2R5LAorCQlwRW5jckJvZHkgKyBTSVJfTUFDX1dFUF9JVl9MRU5HVEgsIHNlZWQsIGtleUxlbmd0aCwgZnJhbWVMZW4pOworCisJUEVMT0c0KGxpbV9sb2cocE1hYywgTE9HNCwgRkwoInBsYWluYm9keSBpcyAiKSk7CisJICAgICAgIHNpcl9kdW1wX2J1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HNCwgcFBsYWluQm9keSwgZnJhbWVMZW4pOworCSAgICAgICApCisJLyogQ29tcHV0ZSBDUkMtMzIgYW5kIHBsYWNlIHRoZW0gaW4gbGFzdCA0IGJ5dGVzIG9mIGVuY3J5cHRlZCBib2R5ICovCisJbGltX2NvbXB1dGVfY3JjMzIoaWN2LAorCQkJICAodWludDhfdCAqKSBwUGxhaW5Cb2R5LAorCQkJICAodWludDhfdCkgKGZyYW1lTGVuIC0gU0lSX01BQ19XRVBfSUNWX0xFTkdUSCkpOworCisJLyogQ29tcGFyZSBSWF9JQ1Ygd2l0aCBjb21wdXRlZCBJQ1YgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0lSX01BQ19XRVBfSUNWX0xFTkdUSDsgaSsrKSB7CisJCVBFTE9HNChsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzQsIEZMKCIgY29tcHV0ZWQgSUNWJWRbJXhdLCByeGVkIElDViVkWyV4XSIpLAorCQkJICAgICAgIGksIGljdltpXSwgaSwKKwkJCSAgICAgICBwUGxhaW5Cb2R5W2ZyYW1lTGVuIC0gU0lSX01BQ19XRVBfSUNWX0xFTkdUSCArIGldKTsKKwkJICAgICAgICkKKwkJaWYgKGljdltpXSAhPQorCQkgICAgcFBsYWluQm9keVtmcmFtZUxlbiAtIFNJUl9NQUNfV0VQX0lDVl9MRU5HVEggKyBpXSkKKwkJCXJldHVybiBMSU1fREVDUllQVF9JQ1ZfRkFJTDsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqKioqIGVuZCBsaW1fZGVjcnlwdF9hdXRoX2ZyYW1lKCkgKioqKioqLworCisvKioKKyAqIGxpbV9wb3N0X3NtZV9zZXRfa2V5c19jbmYKKyAqCisgKiBBIHV0aWxpdHkgQVBJIHRvIHNlbmQgTUxNX1NFVEtFWVNfQ05GIHRvIFNNRQorICovCit2b2lkIGxpbV9wb3N0X3NtZV9zZXRfa2V5c19jbmYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgICB0TGltTWxtU2V0S2V5c1JlcSAqcE1sbVNldEtleXNSZXEsCisJCQkgICAgICAgdExpbU1sbVNldEtleXNDbmYgKm1sbVNldEtleXNDbmYpCit7CisJLyogUHJlcGFyZSBhbmQgU2VuZCBMSU1fTUxNX1NFVEtFWVNfQ05GICovCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZtbG1TZXRLZXlzQ25mLT5wZWVyTWFjQWRkciwKKwkJICAgICAodWludDhfdCAqKSBwTWxtU2V0S2V5c1JlcS0+cGVlck1hY0FkZHIsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJm1sbVNldEtleXNDbmYtPnBlZXJNYWNBZGRyLAorCQkgICAgICh1aW50OF90ICopIHBNbG1TZXRLZXlzUmVxLT5wZWVyTWFjQWRkciwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCS8qIC8gRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkIGZvciBtbG1TZXRLZXlzUmVxICovCisJY2RmX21lbV9mcmVlKHBNbG1TZXRLZXlzUmVxKTsKKwlwTWFjLT5saW0uZ3BMaW1NbG1TZXRLZXlzUmVxID0gTlVMTDsKKworCWxpbV9wb3N0X3NtZV9tZXNzYWdlKHBNYWMsCisJCQkgICAgIExJTV9NTE1fU0VUS0VZU19DTkYsICh1aW50MzJfdCAqKSBtbG1TZXRLZXlzQ25mKTsKK30KKworLyoqCisgKiBsaW1fc2VuZF9zZXRfYnNzX2tleV9yZXEoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gbGltX3Byb2Nlc3NfbWxtX3NldF9rZXlzX3JlcSgpLAorICogd2hlbiBQRSBpcyB0cnlpbmcgdG8gc2V0dXAgdGhlIEdyb3VwIEtleXMgcmVsYXRlZAorICogdG8gYSBzcGVjaWZpZWQgZW5jcnlwdGlvbiB0eXBlCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcE1sbVNldEtleXNSZXEgUG9pbnRlciB0byBNTE1fU0VUS0VZU19SRVEgYnVmZmVyCisgKiBAcmV0dXJuIG5vbmUKKyAqLwordm9pZCBsaW1fc2VuZF9zZXRfYnNzX2tleV9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgIHRMaW1NbG1TZXRLZXlzUmVxICpwTWxtU2V0S2V5c1JlcSwKKwkJCSAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpck1zZ1EgbXNnUTsKKwl0cFNldEJzc0tleVBhcmFtcyBwU2V0QnNzS2V5UGFyYW1zID0gTlVMTDsKKwl0TGltTWxtU2V0S2V5c0NuZiBtbG1TZXRLZXlzQ25mOworCXRTaXJSZXRTdGF0dXMgcmV0Q29kZTsKKwl1aW50MzJfdCB2YWwgPSAwOworCisJaWYgKHBNbG1TZXRLZXlzUmVxLT5udW1LZXlzID4gU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZUykgeworCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQlGTAorCQkJCSgibnVtS2V5cyA9ICVkIGlzIG1vcmUgdGhhbiBTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTIiksCisJCQlwTWxtU2V0S2V5c1JlcS0+bnVtS2V5cyk7CisKKwkJLyogUmVzcG9uZCB0byBTTUUgd2l0aCBlcnJvciBjb2RlICovCisJCW1sbVNldEtleXNDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKwkJZ290byBlbmQ7CisJfQorCS8qIFBhY2thZ2UgV01BX1NFVF9CU1NLRVlfUkVRIG1lc3NhZ2UgcGFyYW1ldGVycyAqLworCisJcFNldEJzc0tleVBhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2V0QnNzS2V5UGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gcFNldEJzc0tleVBhcmFtcykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgU0VUX0JTU0tFWSIpKTsKKworCQkvKiBSZXNwb25kIHRvIFNNRSB3aXRoIGVycm9yIGNvZGUgKi8KKwkJbWxtU2V0S2V5c0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQlnb3RvIGVuZDsKKwl9IGVsc2UKKwkJY2RmX21lbV9zZXQoKHZvaWQgKilwU2V0QnNzS2V5UGFyYW1zLAorCQkJICAgIHNpemVvZih0U2V0QnNzS2V5UGFyYW1zKSwgMCk7CisKKwkvKiBVcGRhdGUgdGhlIFdNQV9TRVRfQlNTS0VZX1JFUSBwYXJhbWV0ZXJzICovCisJcFNldEJzc0tleVBhcmFtcy0+YnNzSWR4ID0gcHNlc3Npb25FbnRyeS0+YnNzSWR4OworCXBTZXRCc3NLZXlQYXJhbXMtPmVuY1R5cGUgPSBwTWxtU2V0S2V5c1JlcS0+ZWRUeXBlOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSB3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfU0lOR0xFX1RJRF9SQywgJnZhbCkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIHJlYWQgV05JX0NGR19TSU5HTEVfVElEX1JDIikpOworCX0KKworCXBTZXRCc3NLZXlQYXJhbXMtPnNpbmdsZVRpZFJjID0gKHVpbnQ4X3QpIHZhbDsKKworCS8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICovCisJcFNldEJzc0tleVBhcmFtcy0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKwlwU2V0QnNzS2V5UGFyYW1zLT5zbWVzZXNzaW9uSWQgPSBwTWxtU2V0S2V5c1JlcS0+c21lc2Vzc2lvbklkOworCisJaWYgKHBNbG1TZXRLZXlzUmVxLT5rZXlbMF0ua2V5SWQgJiYKKwkgICAgKChwTWxtU2V0S2V5c1JlcS0+ZWRUeXBlID09IGVTSVJfRURfV0VQNDApIHx8CisJICAgICAocE1sbVNldEtleXNSZXEtPmVkVHlwZSA9PSBlU0lSX0VEX1dFUDEwNCkpCisJICAgICkgeworCQkvKiBJRiB0aGUga2V5IGlkIGlzIG5vbi16ZXJvIGFuZCBlbmNyeXB0aW9uIHR5cGUgaXMgV0VQLCBTZW5kIGFsbCB0aGUgNAorCQkgKiBrZXlzIHRvIEhBTCB3aXRoIGZpbGxpbmcgdGhlIGtleSBhdCByaWdodCBpbmRleCBpbiBwU2V0QnNzS2V5UGFyYW1zLT5rZXkuICovCisJCXBTZXRCc3NLZXlQYXJhbXMtPm51bUtleXMgPSBTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBTZXRCc3NLZXlQYXJhbXMtPgorCQkJICAgICBrZXlbcE1sbVNldEtleXNSZXEtPmtleVswXS5rZXlJZF0sCisJCQkgICAgICh1aW50OF90ICopICZwTWxtU2V0S2V5c1JlcS0+a2V5WzBdLAorCQkJICAgICBzaXplb2YocE1sbVNldEtleXNSZXEtPmtleVswXSkpOworCisJfSBlbHNlIHsKKwkJcFNldEJzc0tleVBhcmFtcy0+bnVtS2V5cyA9IHBNbG1TZXRLZXlzUmVxLT5udW1LZXlzOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBTZXRCc3NLZXlQYXJhbXMtPmtleSwKKwkJCSAgICAgKHVpbnQ4X3QgKikgJnBNbG1TZXRLZXlzUmVxLT5rZXksCisJCQkgICAgIHNpemVvZih0U2lyS2V5cykgKiBwTWxtU2V0S2V5c1JlcS0+bnVtS2V5cyk7CisJfQorCisJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgZmFsc2UpOworCW1zZ1EudHlwZSA9IFdNQV9TRVRfQlNTS0VZX1JFUTsKKwltc2dRLnJlc2VydmVkID0gMDsKKwltc2dRLmJvZHlwdHIgPSBwU2V0QnNzS2V5UGFyYW1zOworCW1zZ1EuYm9keXZhbCA9IDA7CisKKwlsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJTZW5kaW5nIFdNQV9TRVRfQlNTS0VZX1JFUS4uLiIpKTsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbXNnUS50eXBlKSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2dRKSkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlBvc3RpbmcgU0VUX0JTU0tFWSB0byBIQUwgZmFpbGVkLCByZWFzb249JVgiKSwKKwkJCXJldENvZGUpOworCisJCS8qIFJlc3BvbmQgdG8gU01FIHdpdGggTElNX01MTV9TRVRLRVlTX0NORiAqLworCQltbG1TZXRLZXlzQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9IQUxfU0VORF9NRVNTQUdFX0ZBSUw7CisJfSBlbHNlCisJCXJldHVybjsgICAgICAgICAvKiBDb250aW51ZSBhZnRlciBXTUFfU0VUX0JTU0tFWV9SU1AuLi4gKi8KKworZW5kOgorCWxpbV9wb3N0X3NtZV9zZXRfa2V5c19jbmYocE1hYywgcE1sbVNldEtleXNSZXEsICZtbG1TZXRLZXlzQ25mKTsKKworfQorCisvKioKKyAqIEBmdW5jdGlvbiA6IGxpbV9zZW5kX3NldF9zdGFfa2V5X3JlcSgpCisgKgorICogQGJyaWVmIDogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gbGltX3Byb2Nlc3NfbWxtX3NldF9rZXlzX3JlcSgpLAorICogd2hlbiBQRSBpcyB0cnlpbmcgdG8gc2V0dXAgdGhlIFVuaWNhc3QgS2V5cyByZWxhdGVkCisgKiB0byBhIHNwZWNpZmllZCBTVEEgd2l0aCBzcGVjaWZpZWQgZW5jcnlwdGlvbiB0eXBlCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcE1sbVNldEtleXNSZXEgUG9pbnRlciB0byBNTE1fU0VUS0VZU19SRVEgYnVmZmVyCisgKiBAcGFyYW0gc3RhSWR4ICAgICAgICAgU1RBIGluZGV4IGZvciB3aGljaCB0aGUga2V5cyBhcmUgYmVpbmcgc2V0CisgKiBAcGFyYW0gZGVmV0VQSWR4ICAgICAgVGhlIGRlZmF1bHQgV0VQIGtleSBpbmRleCBbMC4uM10KKyAqIEByZXR1cm4gbm9uZQorICovCit2b2lkIGxpbV9zZW5kX3NldF9zdGFfa2V5X3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgdExpbU1sbVNldEtleXNSZXEgKnBNbG1TZXRLZXlzUmVxLAorCQkJICAgICAgdWludDE2X3Qgc3RhSWR4LAorCQkJICAgICAgdWludDhfdCBkZWZXRVBJZHgsCisJCQkgICAgICB0cFBFU2Vzc2lvbiBzZXNzaW9uRW50cnksIGJvb2wgc2VuZFJzcCkKK3sKKwl0U2lyTXNnUSBtc2dROworCXRwU2V0U3RhS2V5UGFyYW1zIHBTZXRTdGFLZXlQYXJhbXMgPSBOVUxMOworCXRMaW1NbG1TZXRLZXlzQ25mIG1sbVNldEtleXNDbmY7CisJdFNpclJldFN0YXR1cyByZXRDb2RlOworCXVpbnQzMl90IHZhbCA9IDA7CisKKwkvKiBQYWNrYWdlIFdNQV9TRVRfU1RBS0VZX1JFUSBtZXNzYWdlIHBhcmFtZXRlcnMgKi8KKwlwU2V0U3RhS2V5UGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTZXRTdGFLZXlQYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBwU2V0U3RhS2V5UGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBTRVRfQlNTS0VZIikpOworCQlyZXR1cm47CisJfSBlbHNlCisJCWNkZl9tZW1fc2V0KCh2b2lkICopcFNldFN0YUtleVBhcmFtcywgc2l6ZW9mKHRTZXRTdGFLZXlQYXJhbXMpLAorCQkJICAgIDApOworCisJLyogVXBkYXRlIHRoZSBXTUFfU0VUX1NUQUtFWV9SRVEgcGFyYW1ldGVycyAqLworCXBTZXRTdGFLZXlQYXJhbXMtPnN0YUlkeCA9IHN0YUlkeDsKKwlwU2V0U3RhS2V5UGFyYW1zLT5lbmNUeXBlID0gcE1sbVNldEtleXNSZXEtPmVkVHlwZTsKKworCWlmIChlU0lSX1NVQ0NFU1MgIT0gd2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1NJTkdMRV9USURfUkMsICZ2YWwpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byByZWFkIFdOSV9DRkdfU0lOR0xFX1RJRF9SQyIpKTsKKwl9CisKKwlwU2V0U3RhS2V5UGFyYW1zLT5zaW5nbGVUaWRSYyA9ICh1aW50OF90KSB2YWw7CisKKwkvKiBVcGRhdGUgIFBFIHNlc3Npb24gSUQgKi8KKwlwU2V0U3RhS2V5UGFyYW1zLT5zZXNzaW9uSWQgPSBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisJLyoqCisJICogRm9yIFdFUCAtIGRlZldFUElkeCBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgV0VQCisJICogS2V5IHRvIGJlIHVzZWQgZm9yIFRYCisJICogRm9yIGFsbCBvdGhlcnMsIHRoZXJlJ3MganVzdCBvbmUga2V5IHRoYXQgY2FuCisJICogYmUgdXNlZCBhbmQgaGVuY2UgaXQgaXMgYXNzdW1lZCB0aGF0CisJICogZGVmV0VQSWR4ID0gMCAoZnJvbSB0aGUgY2FsbGVyKQorCSAqLworCisJcFNldFN0YUtleVBhcmFtcy0+ZGVmV0VQSWR4ID0gZGVmV0VQSWR4OworCisJcFNldFN0YUtleVBhcmFtcy0+c21lc2Vzc2lvbklkID0gcE1sbVNldEtleXNSZXEtPnNtZXNlc3Npb25JZDsKKwljZGZfbWVtX2NvcHkocFNldFN0YUtleVBhcmFtcy0+cGVlck1hY0FkZHIsCisJCSAgICAgcE1sbVNldEtleXNSZXEtPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWlmIChzZW5kUnNwID09IHRydWUpIHsKKwkJLyoqIFN0b3JlIHRoZSBQcmV2aW91cyBNbG1TdGF0ZSovCisJCXNlc3Npb25FbnRyeS0+bGltUHJldk1sbVN0YXRlID0gc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZTsKKwkJU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgZmFsc2UpOworCX0KKworCWlmIChMSU1fSVNfSUJTU19ST0xFKHNlc3Npb25FbnRyeSkKKwkgICAgJiYgIXBNbG1TZXRLZXlzUmVxLT5rZXlbMF0udW5pY2FzdCkgeworCQlpZiAoc2VuZFJzcCA9PSB0cnVlKQorCQkJc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9CisJCQkJZUxJTV9NTE1fV1RfU0VUX1NUQV9CQ0FTVEtFWV9TVEFURTsKKwkJbXNnUS50eXBlID0gV01BX1NFVF9TVEFfQkNBU1RLRVlfUkVROworCX0gZWxzZSB7CisJCWlmIChzZW5kUnNwID09IHRydWUpCisJCQlzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0KKwkJCQllTElNX01MTV9XVF9TRVRfU1RBX0tFWV9TVEFURTsKKwkJbXNnUS50eXBlID0gV01BX1NFVF9TVEFLRVlfUkVROworCX0KKwlNVFJBQ0UobWFjX3RyYWNlCisJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCSAgICAgICBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKSk7CisKKwkvKioKKwkgKiBJbiB0aGUgQ2FzZSBvZiBXRVBfRFlOQU1JQywgRURfVEtJUCBhbmQgRURfQ0NNUAorCSAqIHRoZSBLZXlbMF0gY29udGFpbnMgdGhlIEtFWSwgc28ganVzdCBjb3B5IHRoYXQgYWxvbmUsCisJICogZm9yIHRoZSBjYXNlIG9mIFdFUF9TVEFUSUMgdGhlIGhhbCBnZXRzIHRoZSBrZXkgZnJvbSBjZmcKKwkgKi8KKwlzd2l0Y2ggKHBNbG1TZXRLZXlzUmVxLT5lZFR5cGUpIHsKKwljYXNlIGVTSVJfRURfV0VQNDA6CisJY2FzZSBlU0lSX0VEX1dFUDEwNDoKKwkJLyogRklYTUUhIElzIHRoaXMgT0s/ICovCisJCWlmICgwID09IHBNbG1TZXRLZXlzUmVxLT5udW1LZXlzKSB7CisJCQl1aW50MzJfdCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZUzsgaSsrKSB7CisJCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwU2V0U3RhS2V5UGFyYW1zLT4KKwkJCQkJICAgICBrZXlbaV0sCisJCQkJCSAgICAgKHVpbnQ4X3QgKikgJnBNbG1TZXRLZXlzUmVxLT4KKwkJCQkJICAgICBrZXlbaV0sIHNpemVvZih0U2lyS2V5cykpOworCQkJfQorCQkJcFNldFN0YUtleVBhcmFtcy0+d2VwVHlwZSA9IGVTSVJfV0VQX1NUQVRJQzsKKwkJCXNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPQorCQkJCWVMSU1fTUxNX1dUX1NFVF9TVEFfS0VZX1NUQVRFOworCQkJTVRSQUNFKG1hY190cmFjZQorCQkJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisJCQkJICAgICAgIHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJICAgICAgIHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpKTsKKwkJfSBlbHNlIHsKKwkJCS8qVGhpcyBjYXNlIHRoZSBrZXlzIGFyZSBjb21pbmcgZnJvbSB1cHBlciBsYXllciBzbyBuZWVkIHRvIGZpbGwgdGhlCisJCQkgKiBrZXkgYXQgdGhlIGRlZmF1bHQgd2VwIGtleSBpbmRleCBhbmQgc2VuZCB0byB0aGUgSEFMICovCisJCQlpZiAoZGVmV0VQSWR4IDwgU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZUykgeworCQkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcFNldFN0YUtleVBhcmFtcy0+CisJCQkJCSAgICAga2V5W2RlZldFUElkeF0sCisJCQkJCSAgICAgKHVpbnQ4X3QgKikgJnBNbG1TZXRLZXlzUmVxLT4KKwkJCQkJICAgICBrZXlbMF0sCisJCQkJCSAgICAgc2l6ZW9mKHBNbG1TZXRLZXlzUmVxLT5rZXlbMF0pKTsKKwkJCQlwTWxtU2V0S2V5c1JlcS0+bnVtS2V5cyA9CisJCQkJCVNJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVM7CisJCQl9IGVsc2UgeworCQkJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIldyb25nIEtleSBJbmRleCAlZCIpLAorCQkJCQlkZWZXRVBJZHgpOworCQkJCWNkZl9tZW1fZnJlZShwU2V0U3RhS2V5UGFyYW1zKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlU0lSX0VEX1RLSVA6CisJY2FzZSBlU0lSX0VEX0NDTVA6CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwljYXNlIGVTSVJfRURfV1BJOgorI2VuZGlmCisJCXsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcFNldFN0YUtleVBhcmFtcy0+a2V5LAorCQkJCSAgICAgKHVpbnQ4X3QgKikgJnBNbG1TZXRLZXlzUmVxLT5rZXlbMF0sCisJCQkJICAgICBzaXplb2YodFNpcktleXMpKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlwU2V0U3RhS2V5UGFyYW1zLT5zZW5kUnNwID0gc2VuZFJzcDsKKworCW1zZ1EucmVzZXJ2ZWQgPSAwOworCW1zZ1EuYm9keXB0ciA9IHBTZXRTdGFLZXlQYXJhbXM7CisJbXNnUS5ib2R5dmFsID0gMDsKKworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgV01BX1NFVF9TVEFLRVlfUkVRLi4uIikpOworCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIG1zZ1EudHlwZSkpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gKHJldENvZGUgPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnUSkpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJQb3N0aW5nIFNFVF9TVEFLRVkgdG8gSEFMIGZhaWxlZCwgcmVhc29uPSVYIiksCisJCQlyZXRDb2RlKTsKKwkJLyogUmVzcG9uZCB0byBTTUUgd2l0aCBMSU1fTUxNX1NFVEtFWVNfQ05GICovCisJCW1sbVNldEtleXNDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0hBTF9TRU5EX01FU1NBR0VfRkFJTDsKKwl9IGVsc2UKKwkJcmV0dXJuOyAgICAgICAgIC8qIENvbnRpbnVlIGFmdGVyIFdNQV9TRVRfU1RBS0VZX1JTUC4uLiAqLworCisJaWYgKHNlbmRSc3AgPT0gdHJ1ZSkKKwkJbGltX3Bvc3Rfc21lX3NldF9rZXlzX2NuZihwTWFjLCBwTWxtU2V0S2V5c1JlcSwgJm1sbVNldEtleXNDbmYpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VjdXJpdHlfdXRpbHMuaCBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3NlY3VyaXR5X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMzBiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3NlY3VyaXR5X3V0aWxzLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGZpbGUgbGltX3NlY3VyaXR5X3V0aWxzLmggY29udGFpbnMgdGhlIHV0aWxpdHkgZGVmaW5pdGlvbnMKKyAqIHJlbGF0ZWQgdG8gV0VQIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBldGMuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMy8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgX19MSU1fU0VDVVJJVFlfVVRJTFNfSAorI2RlZmluZSBfX0xJTV9TRUNVUklUWV9VVElMU19ICisjaW5jbHVkZSAic2lyX21hY19wcm90X2RlZi5oIiAgICAgIC8qIGZvciB0U2lyTWFjQXV0aEZyYW1lQm9keSAqLworCisjZGVmaW5lIExJTV9FTkNSX0FVVEhfQk9EWV9MRU4gIChzaXplb2YodFNpck1hY0F1dGhGcmFtZUJvZHkpICsJXAorCQkJCSBTSVJfTUFDX1dFUF9JVl9MRU5HVEggKyBcCisJCQkJIFNJUl9NQUNfV0VQX0lDVl9MRU5HVEgpCitzdHJ1Y3QgdExpbVByZUF1dGhOb2RlOworCit1aW50OF90IGxpbV9pc19hdXRoX2FsZ29fc3VwcG9ydGVkKHRwQW5pU2lyR2xvYmFsLCB0QW5pQXV0aFR5cGUsIHRwUEVTZXNzaW9uKTsKKworLyogTUFDIGJhc2VkIGF1dGhlbnRpY2F0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zICovCit2b2lkIGxpbV9pbml0X3ByZV9hdXRoX2xpc3QodHBBbmlTaXJHbG9iYWwpOwordm9pZCBsaW1fZGVsZXRlX3ByZV9hdXRoX2xpc3QodHBBbmlTaXJHbG9iYWwpOworc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqbGltX3NlYXJjaF9wcmVfYXV0aF9saXN0KHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjQWRkcik7Cit2b2lkIGxpbV9hZGRfcHJlX2F1dGhfbm9kZSh0cEFuaVNpckdsb2JhbCwgc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqKTsKK3ZvaWQgbGltX2RlbGV0ZV9wcmVfYXV0aF9ub2RlKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjQWRkcik7Cit2b2lkIGxpbV9yZWxlYXNlX3ByZV9hdXRoX25vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBMaW1QcmVBdXRoTm9kZSBwQXV0aE5vZGUpOwordm9pZCBsaW1fcmVzdG9yZV9mcm9tX2F1dGhfc3RhdGUodHBBbmlTaXJHbG9iYWwsCisJCQkJIHRTaXJSZXN1bHRDb2RlcywgdWludDE2X3QsIHRwUEVTZXNzaW9uKTsKK3VpbnQ4X3QgbGltX2RlbGV0ZV9vcGVuX2F1dGhfcHJlX2F1dGhfbm9kZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4KTsKKworLyogRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zICovCit2b2lkIGxpbV9jb21wdXRlX2NyYzMyKHVpbnQ4X3QgKiwgdWludDhfdCAqLCB1aW50OF90KTsKK3ZvaWQgbGltX3JjNCh1aW50OF90ICosIHVpbnQ4X3QgKiwgdWludDhfdCAqLCB1aW50MzJfdCwgdWludDE2X3QpOwordm9pZCBsaW1fZW5jcnlwdF9hdXRoX2ZyYW1lKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90LCB1aW50OF90ICosIHVpbnQ4X3QgKiwKKwkJCSAgICB1aW50OF90ICosIHVpbnQzMl90KTsKK3VpbnQ4X3QgbGltX2RlY3J5cHRfYXV0aF9mcmFtZSh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLCB1aW50OF90ICosIHVpbnQ4X3QgKiwKKwkJCSAgICAgICB1aW50MzJfdCwgdWludDE2X3QpOworCit2b2lkIGxpbV9zZW5kX3NldF9ic3Nfa2V5X3JlcSh0cEFuaVNpckdsb2JhbCwgdExpbU1sbVNldEtleXNSZXEgKiwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fc2VuZF9zZXRfc3RhX2tleV9yZXEodHBBbmlTaXJHbG9iYWwsIHRMaW1NbG1TZXRLZXlzUmVxICosIHVpbnQxNl90LCB1aW50OF90LAorCQkJICAgICAgdHBQRVNlc3Npb24sIGJvb2wgc2VuZFJzcCk7Cit2b2lkIGxpbV9wb3N0X3NtZV9zZXRfa2V5c19jbmYodHBBbmlTaXJHbG9iYWwsIHRMaW1NbG1TZXRLZXlzUmVxICosCisJCQkgICAgICAgdExpbU1sbVNldEtleXNDbmYgKik7CisKKyNkZWZpbmUgIFBUQVBTICAweGVkYjg4MzIwCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbGltX2NyY191cGRhdGUodWludDMyX3QgY3JjLCB1aW50OF90IHgpCit7CisKKwkvKiBVcGRhdGUgQ1JDIGNvbXB1dGF0aW9uIGZvciA4IGJpdHMgY29udGFpbmVkIGluIHggKi8KKwkvKiAqLworCXVpbnQzMl90IHo7CisJdWludDMyX3QgZmI7CisJaW50IGk7CisKKwl6ID0gY3JjIF4geDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWZiID0geiAmIDE7CisJCXogPj49IDE7CisJCWlmIChmYikKKwkJCXogXj0gUFRBUFM7CisJfQorCXJldHVybiB6OworfQorCisjZW5kaWYgLyogX19MSU1fU0VDVVJJVFlfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VuZF9tYW5hZ2VtZW50X2ZyYW1lcy5jIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VuZF9tYW5hZ2VtZW50X2ZyYW1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZjQyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zZW5kX21hbmFnZW1lbnRfZnJhbWVzLmMKQEAgLTAsMCArMSw1MTMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIFxmaWxlIGxpbV9zZW5kX21hbmFnZW1lbnRfZnJhbWVzLmMKKyAqCisgKiBcYnJpZWYgQ29kZSBmb3IgcHJlcGFyaW5nIGFuZCBzZW5kaW5nIDgwMi4xMSBNYW5hZ2VtZW50IGZyYW1lcworICoKKyAqCisgKi8KKworI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAic2lyX21hY19wcm90X2RlZi5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJ1dGlsc19hcGkuaCIKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VjdXJpdHlfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fcHJvcF9leHRzX3V0aWxzLmgiCisjaW5jbHVkZSAiZG90MTFmLmgiCisjaW5jbHVkZSAibGltX3N0YV9oYXNoX2FwaS5oIgorI2luY2x1ZGUgInNjaF9hcGkuaCIKKyNpbmNsdWRlICJsaW1fc2VuZF9tZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbV9hc3NvY191dGlscy5oIgorI2luY2x1ZGUgImxpbV9mdC5oIgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSAibGltX2Z0X2RlZnMuaCIKKyNlbmRpZgorI2luY2x1ZGUgImxpbV9zZXNzaW9uLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RzX3V0aWxzLmgiCisjaW5jbHVkZSAic21lX3RyYWNlLmgiCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisjaW5jbHVkZSAicnJtX2FwaS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKworLyoqCisgKgorICogXGJyaWVmIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFkZCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIHRoZQorICogbWFuYWdlbWVudCBmcmFtZXMKKyAqCisgKiBccGFyYW0gIHBNYWMgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIFxwYXJhbSAgcE1hY0hkciBQb2ludGVyIHRvIE1BQyBtYW5hZ2VtZW50IGhlYWRlcgorICoKKyAqIFRoZSBwTWFjSGRyIGFyZ3VtZW50IHBvaW50cyB0byB0aGUgTUFDIG1hbmFnZW1lbnQgaGVhZGVyLiBUaGUKKyAqIHNlcXVlbmNlIG51bWJlciBzdG9yZWQgaW4gdGhlIHBNYWMgc3RydWN0dXJlIHdpbGwgYmUgaW5jcmVtZW50ZWQKKyAqIGFuZCB1cGRhdGVkIHRvIHRoZSBNQUMgbWFuYWdlbWVudCBoZWFkZXIuIFRoZSBzdGFydCBzZXF1ZW5jZQorICogbnVtYmVyIGlzIFdMQU5fSE9TVF9TRVFfTlVNX01JTiBhbmQgdGhlIGVuZCB2YWx1ZSBpcworICogV0xBTl9IT1NUX1NFUV9OVU1fTUFYLiBBZnRlciByZWFjaGluZyB0aGUgTUFYIHZhbHVlLCB0aGUgc2VxdWVuY2UKKyAqIG51bWJlciB3aWxsIHJvbGwgb3Zlci4KKyAqCisgKi8KK3ZvaWQgbGltX2FkZF9tZ210X3NlcV9udW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNYWNNZ210SGRyIHBNYWNIZHIpCit7CisJaWYgKHBNYWMtPm1nbXRTZXFOdW0gPj0gV0xBTl9IT1NUX1NFUV9OVU1fTUFYKSB7CisJCXBNYWMtPm1nbXRTZXFOdW0gPSBXTEFOX0hPU1RfU0VRX05VTV9NSU4gLSAxOworCX0KKworCXBNYWMtPm1nbXRTZXFOdW0rKzsKKworCXBNYWNIZHItPnNlcUNvbnRyb2wuc2VxTnVtTG8gPSAocE1hYy0+bWdtdFNlcU51bSAmIExPV19TRVFfTlVNX01BU0spOworCXBNYWNIZHItPnNlcUNvbnRyb2wuc2VxTnVtSGkgPQorCQkoKHBNYWMtPm1nbXRTZXFOdW0gJiBISUdIX1NFUV9OVU1fTUFTSykgPj4gSElHSF9TRVFfTlVNX09GRlNFVCk7Cit9CisKKy8qKgorICoKKyAqIFxicmllZiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgc2VuZGluZyBhIHAycCBhY3Rpb24gZnJhbWUKKyAqIGlub3JkZXIgdG8gYWRkIHNlcXVlbmNlIG51bWJlcnMgdG8gYWN0aW9uIHBhY2tldHMKKyAqCisgKiBccGFyYW0gIHBNYWMgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIFxwYXJhbSBwQkQgUG9pbnRlciB0byB0aGUgZnJhbWUgYnVmZmVyIHRoYXQgbmVlZHMgdG8gYmUgcG9wdWxhdGUKKyAqCisgKiBUaGUgcE1hY0hkciBhcmd1bWVudCBwb2ludHMgdG8gdGhlIE1BQyBtYW5hZ2VtZW50IGhlYWRlci4gVGhlCisgKiBzZXF1ZW5jZSBudW1iZXIgc3RvcmVkIGluIHRoZSBwTWFjIHN0cnVjdHVyZSB3aWxsIGJlIGluY3JlbWVudGVkCisgKiBhbmQgdXBkYXRlZCB0byB0aGUgTUFDIG1hbmFnZW1lbnQgaGVhZGVyLiBUaGUgc3RhcnQgc2VxdWVuY2UKKyAqIG51bWJlciBpcyBXTEFOX0hPU1RfU0VRX05VTV9NSU4gYW5kIHRoZSBlbmQgdmFsdWUgaXMKKyAqIFdMQU5fSE9TVF9TRVFfTlVNX01BWC4gQWZ0ZXIgcmVhY2hpbmcgdGhlIE1BWCB2YWx1ZSwgdGhlIHNlcXVlbmNlCisgKiBudW1iZXIgd2lsbCByb2xsIG92ZXIuCisgKgorICovCit2b2lkIGxpbV9wb3B1bGF0ZV9wMnBfbWFjX2hlYWRlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwQkQpCit7CisJdHBTaXJNYWNNZ210SGRyIHBNYWNIZHI7CisKKwkvKiAvIFByZXBhcmUgTUFDIG1hbmFnZW1lbnQgaGVhZGVyICovCisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIChwQkQpOworCisJLyogUHJlcGFyZSBzZXF1ZW5jZSBudW1iZXIgKi8KKwlsaW1fYWRkX21nbXRfc2VxX251bShwTWFjLCBwTWFjSGRyKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsICJzZXFOdW1Mbz0lZCwgc2VxTnVtSGk9JWQsIG1nbXRTZXFOdW09JWQiLAorCQlwTWFjSGRyLT5zZXFDb250cm9sLnNlcU51bUxvLAorCQlwTWFjSGRyLT5zZXFDb250cm9sLnNlcU51bUhpLCBwTWFjLT5tZ210U2VxTnVtKTsKK30KKworLyoqCisgKiBsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcigpIC0gRmlsbCBpbiA4MDIuMTEgaGVhZGVyIG9mIGZyYW1lCisgKgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBidWY6IFBvaW50ZXIgdG8gdGhlIGZyYW1lIGJ1ZmZlciB0aGF0IG5lZWRzIHRvIGJlIHBvcHVsYXRlCisgKiBAdHlwZTogODAyLjExIFR5cGUgb2YgdGhlIGZyYW1lCisgKiBAc3ViX3R5cGU6IDgwMi4xMSBTdWJ0eXBlIG9mIHRoZSBmcmFtZQorICogQHBlZXJfYWRkcjogZHN0IGFkZHJlc3MKKyAqIEBzZWxmX21hY19hZGRyOiBsb2NhbCBtYWMgYWRkcmVzcworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHZhcmlvdXMgTElNIG1vZHVsZXMgdG8gcHJlcGFyZSB0aGUKKyAqIDgwMi4xMSBmcmFtZSBNQUMgaGVhZGVyCisgKgorICogVGhlIGJ1ZiBhcmd1bWVudCBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUgYnVmZmVyIHRvCisgKiB3aGljaCAtIGEpIFRoZSA4MDIuMTEgTUFDIGhlYWRlciBpcyBzZXQgYikgRm9sbG93aW5nIHRoaXMgTUFDIGhlYWRlcgorICogd2lsbCBiZSB0aGUgTUdNVCBmcmFtZSBwYXlsb2FkIFRoZSBwYXlsb2FkIGl0c2VsZiBpcyBwb3B1bGF0ZWQgYnkgdGhlCisgKiBjYWxsZXIgQVBJCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KKwordm9pZCBsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50OF90ICpidWYsCisJCXVpbnQ4X3QgdHlwZSwgdWludDhfdCBzdWJfdHlwZSwgdFNpck1hY0FkZHIgcGVlcl9hZGRyLAorCQl0U2lyTWFjQWRkciBzZWxmX21hY19hZGRyKQoreworCXRwU2lyTWFjTWdtdEhkciBtYWNfaGRyOworCisJLyogUHJlcGFyZSBNQUMgbWFuYWdlbWVudCBoZWFkZXIgKi8KKwltYWNfaGRyID0gKHRwU2lyTWFjTWdtdEhkcikgKGJ1Zik7CisKKwkvKiBQcmVwYXJlIEZDICovCisJbWFjX2hkci0+ZmMucHJvdFZlciA9IFNJUl9NQUNfUFJPVE9DT0xfVkVSU0lPTjsKKwltYWNfaGRyLT5mYy50eXBlID0gdHlwZTsKKwltYWNfaGRyLT5mYy5zdWJUeXBlID0gc3ViX3R5cGU7CisKKwkvKiBQcmVwYXJlIEFkZHJlc3MgMSAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBtYWNfaGRyLT5kYSwKKwkJICAgICAodWludDhfdCAqKSBwZWVyX2FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJLyogUHJlcGFyZSBBZGRyZXNzIDIgKi8KKwlzaXJfY29weV9tYWNfYWRkcihtYWNfaGRyLT5zYSwgc2VsZl9tYWNfYWRkcik7CisKKwkvKiBQcmVwYXJlIEFkZHJlc3MgMyAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBtYWNfaGRyLT5ic3NJZCwKKwkJICAgICAodWludDhfdCAqKSBwZWVyX2FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJLyogUHJlcGFyZSBzZXF1ZW5jZSBudW1iZXIgKi8KKwlsaW1fYWRkX21nbXRfc2VxX251bShtYWNfY3R4LCBtYWNfaGRyKTsKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsICJzZXFOdW1Mbz0lZCwgc2VxTnVtSGk9JWQsIG1nbXRTZXFOdW09JWQiLAorCQltYWNfaGRyLT5zZXFDb250cm9sLnNlcU51bUxvLAorCQltYWNfaGRyLT5zZXFDb250cm9sLnNlcU51bUhpLCBtYWNfY3R4LT5tZ210U2VxTnVtKTsKK30KKworLyoqCisgKiBsaW1fc2VuZF9wcm9iZV9yZXFfbWdtdF9mcmFtZSgpIC0gc2VuZCBwcm9iZSByZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWUKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAc3NpZDogU1NJRCB0byBiZSBzZW50IGluIFByb2JlIFJlcXVlc3QgZnJhbWUKKyAqIEBic3NpZDogQlNTSUQgdG8gYmUgc2VudCBpbiBQcm9iZSBSZXF1ZXN0IGZyYW1lCisgKiBAY2hhbm5lbDogQ2hhbm5lbCAjIG9uIHdoaWNoIHRoZSBQcm9iZSBSZXF1ZXN0IGlzIGdvaW5nIG91dAorICogQHNlbGZfbWFjYWRkcjogc2VsZiBNQUMgYWRkcmVzcworICogQGRvdDExbW9kZTogc2VsZiBkb3RsbG1vZGUKKyAqIEBhZGRpdGlvbmFsX2llbGVuOiBpZiBub24temVybywgaW5jbHVkZSBhZGRpdGlvbmFsX2llIGluIHRoZSBQcm9iZSBSZXF1ZXN0CisgKiAgICAgICAgICAgICAgICAgICBmcmFtZQorICogQGFkZGl0aW9uYWxfaWU6IGlmIGFkZGl0aW9uYWxfaWVsZW4gaXMgbm9uIHplcm8sIGluY2x1ZGUgdGhpcyBmaWVsZCBpbiB0aGUKKyAqICAgICAgICAgICAgICAgIFByb2JlIFJlcXVlc3QgZnJhbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB2YXJpb3VzIExJTSBtb2R1bGVzIHRvIHNlbmQgUHJvYmUgUmVxdWVzdCBmcmFtZQorICogZHVyaW5nIGFjdGl2ZSBzY2FuL2xlYXJuIHBoYXNlLgorICogUHJvYmUgcmVxdWVzdCBpcyBzZW50IG91dCBpbiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvczoKKyAqIC0taGVhcnRiZWF0IGZhaWx1cmU6ICBzZXNzaW9uIG5lZWRlZAorICogLS1qb2luIHJlcTogICAgICAgICAgIHNlc3Npb24gbmVlZGVkCisgKiAtLWZvcmVncm91bmQgc2NhbjogICAgbm8gc2Vzc2lvbgorICogLS1iYWNrZ3JvdW5kIHNjYW46ICAgIG5vIHNlc3Npb24KKyAqIC0tc2NoX2JlYWNvbl9wcm9jZXNzaW5nOiAgdG8gZ2V0IEVEQ0EgcGFyYW1ldGVyczogIHNlc3Npb24gbmVlZGVkCisgKgorICogUmV0dXJuOiB0U2lyUmV0U3RhdHVzIChlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcyBhbmQgZXJyb3IgY29kZXMgb3RoZXJ3aXNlKQorICovCit0U2lyUmV0U3RhdHVzCitsaW1fc2VuZF9wcm9iZV9yZXFfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJICAgICAgdFNpck1hY1NTaWQgKnNzaWQsCisJCQkgICAgICB0U2lyTWFjQWRkciBic3NpZCwKKwkJCSAgICAgIHVpbnQ4X3QgY2hhbm5lbCwKKwkJCSAgICAgIHRTaXJNYWNBZGRyIHNlbGZfbWFjYWRkciwKKwkJCSAgICAgIHVpbnQzMl90IGRvdDExbW9kZSwKKwkJCSAgICAgIHVpbnQzMl90IGFkZGl0aW9uYWxfaWVsZW4sIHVpbnQ4X3QgKmFkZGl0aW9uYWxfaWUpCit7CisJdERvdDExZlByb2JlUmVxdWVzdCBwcjsKKwl1aW50MzJfdCBzdGF0dXMsIGJ5dGVzLCBwYXlsb2FkOworCXVpbnQ4X3QgKmZyYW1lOworCXZvaWQgKnBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMsIGV4dGNhcF9zdGF0dXM7CisJdHBQRVNlc3Npb24gcGVzZXNzaW9uOworCXVpbnQ4X3Qgc2Vzc2lvbmlkOworCXVpbnQ4X3QgKnAycGllID0gTlVMTDsKKwl1aW50OF90IHR4ZmxhZyA9IDA7CisJdWludDhfdCBzbWVfc2Vzc2lvbmlkID0gMDsKKwlib29sIGlzX3ZodF9lbmFibGVkID0gZmFsc2U7CisJdWludDhfdCB0eFBvd2VyOworCXVpbnQxNl90IGFkZG5faWVsZW4gPSBhZGRpdGlvbmFsX2llbGVuOworCisJLyogVGhlIHByb2JlIHJlcSBzaG91bGQgbm90IHNlbmQgMTFhYyBjYXBhYmlsaWV0aWVzIGlmIGJhbmQgaXMgMi40R0h6LAorCSAqIHVubGVzcyBlbmFibGVWaHRGb3IyNEdIeiBpcyBlbmFibGVkIGluIElOSS4gU28gaWYgZW5hYmxlVmh0Rm9yMjRHSHoKKwkgKiBpcyBmYWxzZSBhbmQgZG90MTFtb2RlIGlzIDExYWMgc2V0IGl0IHRvIDExbi4KKwkgKi8KKwlpZiAoY2hhbm5lbCA8PSBTSVJfMTFCX0NIQU5ORUxfRU5EICYmCisJICAgIChmYWxzZSA9PSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmVuYWJsZVZodEZvcjI0R0h6KSAmJgorCSAgICAoV05JX0NGR19ET1QxMV9NT0RFXzExQUMgPT0gZG90MTFtb2RlIHx8CisJICAgICBXTklfQ0ZHX0RPVDExX01PREVfMTFBQ19PTkxZID09IGRvdDExbW9kZSkpCisJCWRvdDExbW9kZSA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU47CisJLyoKKwkgKiBzZXNzaW9uIGNvbnRleHQgbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudCwgd2hlbiBwcm9iZSByZXF1ZXN0IG5lZWRzCisJICogdG8gYmUgc2VudCBvdXQuIEZvbGxvd2luZyBjYXNlcyBleGlzdDoKKwkgKiAtLWhlYXJ0YmVhdCBmYWlsdXJlOiAgc2Vzc2lvbiBuZWVkZWQKKwkgKiAtLWpvaW4gcmVxOiAgICAgICAgICAgc2Vzc2lvbiBuZWVkZWQKKwkgKiAtLWZvcmVncm91bmQgc2NhbjogICAgbm8gc2Vzc2lvbgorCSAqIC0tYmFja2dyb3VuZCBzY2FuOiAgICBubyBzZXNzaW9uCisJICogLS1zY2hfYmVhY29uX3Byb2Nlc3Npbmc6ICB0byBnZXQgRURDQSBwYXJhbWV0ZXJzOiAgc2Vzc2lvbiBuZWVkZWQKKwkgKiBJZiBzZXNzaW9uIGNvbnRleHQgZG9lcyBub3QgZXhpc3QsIHNvbWUgSUVzIHdpbGwgYmUgcG9wdWxhdGVkIGZyb20KKwkgKiBDRkdzLCBlLmcuIFN1cHBvcnRlZCBhbmQgRXh0ZW5kZWQgcmF0ZSBzZXQgSUVzCisJICovCisJcGVzZXNzaW9uID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKG1hY19jdHgsIGJzc2lkLCAmc2Vzc2lvbmlkKTsKKworCWlmIChwZXNlc3Npb24gIT0gTlVMTCkKKwkJc21lX3Nlc3Npb25pZCA9IHBlc2Vzc2lvbi0+c21lU2Vzc2lvbklkOworCisJLyogVGhlIHNjaGVtZSBoZXJlIGlzIHRvIGZpbGwgb3V0IGEgJ3REb3QxMWZQcm9iZVJlcXVlc3QnIHN0cnVjdHVyZSAqLworCS8qIGFuZCB0aGVuIGhhbmQgaXQgb2ZmIHRvICdkb3QxMWZfcGFja19wcm9iZV9yZXF1ZXN0JyAoZm9yICovCisJLyogc2VyaWFsaXphdGlvbikuICBXZSBzdGFydCBieSB6ZXJvLWluaXRpYWxpemluZyB0aGUgc3RydWN0dXJlOiAqLworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZwciwgc2l6ZW9mKHByKSwgMCk7CisKKwkvKiAmIGRlbGVnYXRpbmcgdG8gYXNzb3J0ZWQgaGVscGVyczogKi8KKwlwb3B1bGF0ZV9kb3QxMWZfc3NpZChtYWNfY3R4LCBzc2lkLCAmcHIuU1NJRCk7CisKKwlpZiAoYWRkbl9pZWxlbiAmJiBhZGRpdGlvbmFsX2llKQorCQlwMnBpZSA9IGxpbUdldFAycElFUHRyKG1hY19jdHgsIGFkZGl0aW9uYWxfaWUsIGFkZG5faWVsZW4pOworCisJLyoKKwkgKiBEb24ndCBpbmNsdWRlIDExYiByYXRlIGlmIGl0IGlzIGEgUDJQIHNlcmFjaCBvciBwcm9iZSByZXF1ZXN0IGlzCisJICogc2VudCBieSBQMlAgQ2xpZW50CisJICovCisJaWYgKChXTklfQ0ZHX0RPVDExX01PREVfMTFCICE9IGRvdDExbW9kZSkgJiYgKHAycGllICE9IE5VTEwpICYmCisJICAgICgoKG1hY19jdHgtPmxpbS5ncExpbU1sbVNjYW5SZXEgIT0gTlVMTCkgJiYKKwkgICAgICBtYWNfY3R4LT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5wMnBTZWFyY2gpIHx8CisJICAgICAoKHBlc2Vzc2lvbiAhPSBOVUxMKSAmJgorCSAgICAgIChDREZfUDJQX0NMSUVOVF9NT0RFID09IHBlc2Vzc2lvbi0+cGVQZXJzb25hKSkKKwkgICAgKQorCSAgICkgeworCQkvKgorCQkgKiBJbiB0aGUgYmVsb3cgQVBJIHBhc3MgY2hhbm5lbCBudW1iZXIgPiAxNCwgZG8gdGhhdCBpdCBmaWxscworCQkgKiBvbmx5IDExYSByYXRlcyBpbiBzdXBwb3J0ZWQgcmF0ZXMKKwkJICovCisJCXBvcHVsYXRlX2RvdDExZl9zdXBwX3JhdGVzKG1hY19jdHgsIDE1LCAmcHIuU3VwcFJhdGVzLAorCQkJCQkgICBwZXNlc3Npb24pOworCX0gZWxzZSB7CisJCXBvcHVsYXRlX2RvdDExZl9zdXBwX3JhdGVzKG1hY19jdHgsIGNoYW5uZWwsCisJCQkJCSAgICZwci5TdXBwUmF0ZXMsIHBlc2Vzc2lvbik7CisKKwkJaWYgKFdOSV9DRkdfRE9UMTFfTU9ERV8xMUIgIT0gZG90MTFtb2RlKSB7CisJCQlwb3B1bGF0ZV9kb3QxMWZfZXh0X3N1cHBfcmF0ZXMxKG1hY19jdHgsIGNoYW5uZWwsCisJCQkJCQkJJnByLkV4dFN1cHBSYXRlcyk7CisJCX0KKwl9CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwkvKgorCSAqIFRhYmxlIDctMTQgaW4gSUVFRSBTdGQuIDgwMi4xMWstMjAwOCBzYXlzCisJICogRFMgcGFyYW1zICJjYW4iIGJlIHByZXNlbnQgaW4gUlJNIGlzIGRpc2FibGVkIGFuZCAiaXMiIHByZXNlbnQgaWYKKwkgKiBSUk0gaXMgZW5hYmxlZC4gSXQgc2hvdWxkIGJlIG9rIGV2ZW4gaWYgd2UgYWRkIGl0IGludG8gcHJvYmUgcmVxIHdoZW4KKwkgKiBSUk0gaXMgbm90IGVuYWJsZWQuCisJICovCisJcG9wdWxhdGVfZG90MTFmX2RzX3BhcmFtcyhtYWNfY3R4LCAmcHIuRFNQYXJhbXMsIGNoYW5uZWwpOworCS8qIENhbGwgUlJNIG1vZHVsZSB0byBnZXQgdGhlIHR4IHBvd2VyIGZvciBtYW5hZ2VtZW50IHVzZWQuICovCisJdHhQb3dlciA9ICh1aW50OF90KSBycm1fZ2V0X21nbXRfdHhfcG93ZXIobWFjX2N0eCwgcGVzZXNzaW9uKTsKKwlwb3B1bGF0ZV9kb3QxMWZfd2ZhdHBjKG1hY19jdHgsICZwci5XRkFUUEMsIHR4UG93ZXIsIDApOworCisjZW5kaWYKKworCWlmIChwZXNlc3Npb24gIT0gTlVMTCkgeworCQlwZXNlc3Npb24tPmh0Q2FwYWJpbGl0eSA9IElTX0RPVDExX01PREVfSFQoZG90MTFtb2RlKTsKKwkJLyogSW5jbHVkZSBIVCBDYXBhYmlsaXR5IElFICovCisJCWlmIChwZXNlc3Npb24tPmh0Q2FwYWJpbGl0eSkKKwkJCXBvcHVsYXRlX2RvdDExZl9odF9jYXBzKG1hY19jdHgsIHBlc2Vzc2lvbiwgJnByLkhUQ2Fwcyk7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogcGVzZXNzaW9uID09IE5VTEwgKi8KKwkJaWYgKElTX0RPVDExX01PREVfSFQoZG90MTFtb2RlKSkKKwkJCXBvcHVsYXRlX2RvdDExZl9odF9jYXBzKG1hY19jdHgsIE5VTEwsICZwci5IVENhcHMpOworCX0KKworCS8qCisJICogU2V0IGNoYW5uZWxib25kaW5nIGluZm9ybWF0aW9uIGFzICJkaXNhYmxlZCIgd2hlbiB0dW5uZWQgdG8gYQorCSAqIDIuNCBHSHogY2hhbm5lbAorCSAqLworCWlmIChjaGFubmVsIDw9IFNJUl8xMUJfQ0hBTk5FTF9FTkQpIHsKKwkJaWYgKG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHoKKwkJICAgID09IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRCkgeworCQkJcHIuSFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFo7CisJCQlwci5IVENhcHMuc2hvcnRHSTQwTUh6ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXByLkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaOworCQl9CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKHBlc2Vzc2lvbiAhPSBOVUxMKSB7CisJCXBlc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eSA9IElTX0RPVDExX01PREVfVkhUKGRvdDExbW9kZSk7CisJCS8qIEluY2x1ZGUgVkhUIENhcGFiaWxpdHkgSUUgKi8KKwkJaWYgKHBlc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eSkgeworCQkJcG9wdWxhdGVfZG90MTFmX3ZodF9jYXBzKG1hY19jdHgsIHBlc2Vzc2lvbiwKKwkJCQkJCSAmcHIuVkhUQ2Fwcyk7CisJCQlpc192aHRfZW5hYmxlZCA9IHRydWU7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoSVNfRE9UMTFfTU9ERV9WSFQoZG90MTFtb2RlKSkgeworCQkJcG9wdWxhdGVfZG90MTFmX3ZodF9jYXBzKG1hY19jdHgsIHBlc2Vzc2lvbiwKKwkJCQkJCSAmcHIuVkhUQ2Fwcyk7CisJCQlpc192aHRfZW5hYmxlZCA9IHRydWU7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAocGVzZXNzaW9uICE9IE5VTEwpCisJCXBvcHVsYXRlX2RvdDExZl9leHRfY2FwKG1hY19jdHgsIGlzX3ZodF9lbmFibGVkLCAmcHIuRXh0Q2FwLAorCQkJcGVzZXNzaW9uKTsKKworCS8qIFRoYXQncyBpdC0tIG5vdyB3ZSBwYWNrIGl0LiAgRmlyc3QsIGhvdyBtdWNoIHNwYWNlIGFyZSB3ZSBnb2luZyB0byAqLworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX3Byb2JlX3JlcXVlc3Rfc2l6ZShtYWNfY3R4LCAmcHIsICZwYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGZvciBhIFByb2JlIFJlcXVlc3QgKDB4JTA4eCkuIiksIHN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJcGF5bG9hZCA9IHNpemVvZih0RG90MTFmUHJvYmVSZXF1ZXN0KTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyB0aGUgcGFja2VkIHNpemUgZm9yIGEgUHJvYmUgUmVxdWVzdCAoMHglMDh4KS4iKSwgc3RhdHVzKTsKKwl9CisKKwkvKiBTdHJpcCBleHRlbmRlZCBjYXBhYmlsaXR5IElFIChpZiBwcmVzZW50KS4gRlcgd2lsbCBhZGQgdGhhdCBJRSAqLworCWlmIChhZGRuX2llbGVuKSB7CisJCWV4dGNhcF9zdGF0dXMgPSBsaW1fc3RyaXBfZXh0Y2FwX2llKG1hY19jdHgsIGFkZGl0aW9uYWxfaWUsCisJCQkJCSZhZGRuX2llbGVuLCBOVUxMKTsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBleHRjYXBfc3RhdHVzKQorCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJICAgIEZMKCJFcnJvcjolZCBzdHJpcHBpbmcgZXh0Y2FwIElFIiksIGV4dGNhcF9zdGF0dXMpOworCX0KKworCWJ5dGVzID0gcGF5bG9hZCArIHNpemVvZih0U2lyTWFjTWdtdEhkcikgKyBhZGRuX2llbGVuOworCisJLyogT2stLSB0cnkgdG8gYWxsb2NhdGUgc29tZSBtZW1vcnk6ICovCisJY2RmX3N0YXR1cyA9IGNkc19wYWNrZXRfYWxsb2MoKHVpbnQxNl90KSBieXRlcywgKHZvaWQgKiopJmZyYW1lLAorCQkJCSAgICAgICh2b2lkICoqKSZwYWNrZXQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBQcm9iZSBSZXF1ZXN0LiIpLCBieXRlcyk7CisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJfQorCS8qIFBhcmFub2lhOiAqLworCWNkZl9tZW1fc2V0KGZyYW1lLCBieXRlcywgMCk7CisKKwkvKiBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6ICovCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIobWFjX2N0eCwgZnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJU0lSX01BQ19NR01UX1BST0JFX1JFUSwgYnNzaWQsIHNlbGZfbWFjYWRkcik7CisKKwkvKiBUaGF0IGRvbmUsIHBhY2sgdGhlIFByb2JlIFJlcXVlc3Q6ICovCisJc3RhdHVzID0gZG90MTFmX3BhY2tfcHJvYmVfcmVxdWVzdChtYWNfY3R4LCAmcHIsIGZyYW1lICsKKwkJCQkJICAgIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCSAgICBwYXlsb2FkLCAmcGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhY2sgYSBQcm9iZSBSZXF1ZXN0ICgweCUwOHgpLiIpLCBzdGF0dXMpOworCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKilwYWNrZXQpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvKiBhbGxvY2F0ZWQhICovCisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIGEgUHJvYmUgUmVxdWVzdCAoMHglMDh4KS4iKSwgc3RhdHVzKTsKKwl9CisJLyogQXBwZW5kIGFueSBBZGRJRSBpZiBwcmVzZW50LiAqLworCWlmIChhZGRuX2llbGVuKSB7CisJCWNkZl9tZW1fY29weShmcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkcikgKyBwYXlsb2FkLAorCQkJICAgICBhZGRpdGlvbmFsX2llLCBhZGRuX2llbGVuKTsKKwkJcGF5bG9hZCArPSBhZGRuX2llbGVuOworCX0KKworCS8qIElmIHRoaXMgcHJvYmUgcmVxdWVzdCBpcyBzZW50IGR1cmluZyBQMlAgU2VhcmNoIFN0YXRlLCB0aGVuIHdlIG5lZWQKKwkgKiB0byBzZW5kIGl0IGF0IE9GRE0gcmF0ZS4KKwkgKi8KKwlpZiAoKFNJUl9CQU5EXzVfR0haID09IGxpbV9nZXRfcmZfYmFuZChjaGFubmVsKSkKKwkgICAgfHwgKChtYWNfY3R4LT5saW0uZ3BMaW1NbG1TY2FuUmVxICE9IE5VTEwpICYmCisJCW1hY19jdHgtPmxpbS5ncExpbU1sbVNjYW5SZXEtPnAycFNlYXJjaCkKKwkJLyoKKwkJICogRm9yIHVuaWNhc3QgcHJvYmUgcmVxIG1nbXQgZnJvbSBKb2luIGZ1bmN0aW9uIHdlIGRvbid0IHNldAorCQkgKiBhYm92ZSB2YXJpYWJsZXMuIFNvIHdlIG5lZWQgdG8gYWRkIG9uZSBtb3JlIGNoZWNrIHdoZXRoZXIgaXQKKwkJICogaXMgcGVQZXJzb25hIGlzIFAyUF9DTElFTlQgb3Igbm90CisJCSAqLworCSAgICB8fCAoKHBlc2Vzc2lvbiAhPSBOVUxMKSAmJgorCQkoQ0RGX1AyUF9DTElFTlRfTU9ERSA9PSBwZXNlc3Npb24tPnBlUGVyc29uYSkpCisJICAgICkgeworCQl0eGZsYWcgfD0gSEFMX1VTRV9CRF9SQVRFMl9GT1JfTUFOQUdFTUVOVF9GUkFNRTsKKwl9CisKKwljZGZfc3RhdHVzID0KKwkJd21hX3R4X2ZyYW1lKG1hY19jdHgsIHBhY2tldCwKKwkJCSAgICh1aW50MTZfdCkgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArIHBheWxvYWQsCisJCQkgICBUWFJYX0ZSTV84MDJfMTFfTUdNVCwgQU5JX1RYRElSX1RPRFMsIDcsCisJCQkgICBsaW1fdHhfY29tcGxldGUsIGZyYW1lLCB0eGZsYWcsIHNtZV9zZXNzaW9uaWQsCisJCQkgICAwKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiY291bGQgbm90IHNlbmQgUHJvYmUgUmVxdWVzdCBmcmFtZSEiKSk7CisJCS8qIFBrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjayAqLworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qIEVuZCBsaW1fc2VuZF9wcm9iZV9yZXFfbWdtdF9mcmFtZS4gKi8KKwordFNpclJldFN0YXR1cyBsaW1fZ2V0X2FkZG5faWVfZm9yX3Byb2JlX3Jlc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICB1aW50OF90ICphZGRJRSwgdWludDE2X3QgKmFkZG5JRUxlbiwKKwkJCQkJICAgICB1aW50OF90IHByb2JlUmVxUDJwSWUpCit7CisJLyogSWYgUHJvYmUgcmVxdWVzdCBkb2Vzbid0IGhhdmUgUDJQIElFLCB0aGVuIHRha2Ugb3V0IFAyUCBJRQorCSAgIGZyb20gYWRkaXRpb25hbCBJRSAqLworCWlmICghcHJvYmVSZXFQMnBJZSkgeworCQl1aW50OF90ICp0ZW1wYnVmID0gTlVMTDsKKwkJdWludDE2X3QgdGVtcExlbiA9IDA7CisJCWludCBsZWZ0ID0gKmFkZG5JRUxlbjsKKwkJdWludDhfdCAqcHRyID0gYWRkSUU7CisJCXVpbnQ4X3QgZWxlbV9pZCwgZWxlbV9sZW47CisKKwkJaWYgKE5VTEwgPT0gYWRkSUUpIHsKKwkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCIgTlVMTCBhZGRJRSBwb2ludGVyIikpOykKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCX0KKworCQl0ZW1wYnVmID0gY2RmX21lbV9tYWxsb2MobGVmdCk7CisJCWlmIChOVUxMID09IHRlbXBidWYpIHsKKwkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgYWRkbiBJRSIpKTsKKwkJCSAgICAgICApCisJCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQl9CisKKwkJd2hpbGUgKGxlZnQgPj0gMikgeworCQkJZWxlbV9pZCA9IHB0clswXTsKKwkJCWVsZW1fbGVuID0gcHRyWzFdOworCQkJbGVmdCAtPSAyOworCQkJaWYgKGVsZW1fbGVuID4gbGVmdCkgeworCQkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwKKwkJCQkJCSgiKioqKkludmFsaWQgSUVzIGVpZCA9ICVkIGVsZW1fbGVuPSVkIGxlZnQ9JWQqKioqKiIpLAorCQkJCQllbGVtX2lkLCBlbGVtX2xlbiwgbGVmdCk7CisJCQkJY2RmX21lbV9mcmVlKHRlbXBidWYpOworCQkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCQl9CisJCQlpZiAoISgoU0lSX01BQ19FSURfVkVORE9SID09IGVsZW1faWQpICYmCisJCQkgICAgICAobWVtY21wCisJCQkJICAgICAgICgmcHRyWzJdLCBTSVJfTUFDX1AyUF9PVUksCisJCQkJICAgICAgIFNJUl9NQUNfUDJQX09VSV9TSVpFKSA9PSAwKSkpIHsKKwkJCQljZGZfbWVtX2NvcHkodGVtcGJ1ZiArIHRlbXBMZW4sICZwdHJbMF0sCisJCQkJCSAgICAgZWxlbV9sZW4gKyAyKTsKKwkJCQl0ZW1wTGVuICs9IChlbGVtX2xlbiArIDIpOworCQkJfQorCQkJbGVmdCAtPSBlbGVtX2xlbjsKKwkJCXB0ciArPSAoZWxlbV9sZW4gKyAyKTsKKwkJfQorCQljZGZfbWVtX2NvcHkoYWRkSUUsIHRlbXBidWYsIHRlbXBMZW4pOworCQkqYWRkbklFTGVuID0gdGVtcExlbjsKKwkJY2RmX21lbV9mcmVlKHRlbXBidWYpOworCX0KKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKioKKyAqIGxpbV9zZW5kX3Byb2JlX3JzcF9tZ210X2ZyYW1lKCkgLSBTZW5kIHByb2JlIHJlc3BvbnNlCisgKgorICogQG1hY19jdHg6IEhhbmRsZSBmb3IgbWFjIGNvbnRleHQKKyAqIEBwZWVyX21hY2FkZHI6IE1hYyBhZGRyZXNzIG9mIHJlcXVlc3RpbmcgcGVlcgorICogQHNzaWQ6IFNTSUQgZm9yIHJlc3BvbnNlCisgKiBAbl9zdGFpZDogU3RhdGlvbiBJRCwgY3VycmVudGx5IHVudXNlZC4KKyAqIEBwZV9zZXNzaW9uOiBQRSBzZXNzaW9uIGlkCisgKiBAa2VlcGFsaXZlOiBLZWVwIGFsaXZlIGZsYWcuIEN1cnJlbnRseSB1bnVzZWQuCisgKiBAcHJlcV9wMnBpZTogUDJQIElFIGluIGluY29taW5nIHByb2JlIHJlcXVlc3QKKyAqCisgKiBCdWlsZHMgYW5kIHNlbmRzIHByb2JlIHJlc3BvbnNlIGZyYW1lIHRvIHRoZSByZXF1ZXN0aW5nIHBlZXIKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworCit2b2lkCitsaW1fc2VuZF9wcm9iZV9yc3BfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJICAgICAgdFNpck1hY0FkZHIgcGVlcl9tYWNhZGRyLAorCQkJICAgICAgdHBBbmlTU0lEIHNzaWQsCisJCQkgICAgICBzaG9ydCBuX3N0YWlkLAorCQkJICAgICAgdWludDhfdCBrZWVwYWxpdmUsCisJCQkgICAgICB0cFBFU2Vzc2lvbiBwZV9zZXNzaW9uLCB1aW50OF90IHByZXFfcDJwaWUpCit7CisJdERvdDExZlByb2JlUmVzcG9uc2UgKmZybTsKKwl0U2lyUmV0U3RhdHVzIHNpcl9zdGF0dXM7CisJdWludDMyX3QgY2ZnLCBwYXlsb2FkLCBieXRlcywgc3RhdHVzOworCXRwU2lyTWFjTWdtdEhkciBtYWNfaGRyOworCXVpbnQ4X3QgKmZyYW1lOworCXZvaWQgKnBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdWludDMyX3QgYWRkbl9pZV9wcmVzZW50ID0gZmFsc2U7CisKKwl1aW50MTZfdCBhZGRuX2llX2xlbiA9IDA7CisJdWludDMyX3Qgd3BzX2FwID0gMCwgdG1wOworCXVpbnQ4X3QgdHhfZmxhZyA9IDA7CisJdWludDhfdCAqYWRkX2llID0gTlVMTDsKKwl1aW50OF90ICpwMnBfaWUgPSBOVUxMOworCXVpbnQ4X3Qgbm9hbGVuID0gMDsKKwl1aW50OF90IHRvdGFsX25vYWxlbiA9IDA7CisJdWludDhfdCBub2Ffc3RyZWFtW1NJUl9NQVhfTk9BX0FUVFJfTEVOICsgU0lSX1AyUF9JRV9IRUFERVJfTEVOXTsKKwl1aW50OF90IG5vYV9pZVtTSVJfTUFYX05PQV9BVFRSX0xFTiArIFNJUl9QMlBfSUVfSEVBREVSX0xFTl07CisJdWludDhfdCBzbWVfc2Vzc2lvbmlkID0gMDsKKwlib29sIGlzX3ZodF9lbmFibGVkID0gZmFsc2U7CisJdERvdDExZklFRXh0Q2FwIGV4dHJhY3RlZF9leHRfY2FwOworCWJvb2wgZXh0cmFjdGVkX2V4dF9jYXBfZmxhZyA9IHRydWU7CisKKwkvKiBXZSBkb24ndCBhbnN3ZXIgcmVxdWVzdHMgaW4gdGhpcyBjYXNlKi8KKwlpZiAoQU5JX0RSSVZFUl9UWVBFKG1hY19jdHgpID09IGVEUklWRVJfVFlQRV9NRkcpCisJCXJldHVybjsKKworCWlmIChOVUxMID09IHBlX3Nlc3Npb24pCisJCXJldHVybjsKKworCS8qCisJICogSW4gY2FzZSB3aGVuIGNhYyB0aW1lciBpcyBydW5uaW5nIGZvciB0aGlzIFNBUCBzZXNzaW9uIHRoZW4KKwkgKiBhdm9pZCBzZW5kaW5nIHByb2JlIHJzcCBvdXQuIEl0IGlzIHZpb2xhdGlvbiBvZiBkZnMgc3BlY2lmaWNhdGlvbi4KKwkgKi8KKwlpZiAoKChwZV9zZXNzaW9uLT5wZVBlcnNvbmEgPT0gQ0RGX1NBUF9NT0RFKSB8fAorCSAgICAocGVfc2Vzc2lvbi0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkpICYmCisJICAgICh0cnVlID09IG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLmlzX2Rmc19jYWNfdGltZXJfcnVubmluZykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoIkNBQyB0aW1lciBpcyBydW5uaW5nLCBwcm9iZSByZXNwb25zZSBkcm9wcGVkIikpOworCQlyZXR1cm47CisJfQorCXNtZV9zZXNzaW9uaWQgPSBwZV9zZXNzaW9uLT5zbWVTZXNzaW9uSWQ7CisJZnJtID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHREb3QxMWZQcm9iZVJlc3BvbnNlKSk7CisJaWYgKE5VTEwgPT0gZnJtKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworCQlyZXR1cm47CisJfQorCisJY2RmX21lbV96ZXJvKCZleHRyYWN0ZWRfZXh0X2NhcCwgc2l6ZW9mKGV4dHJhY3RlZF9leHRfY2FwKSk7CisKKwkvKgorCSAqIEZpbGwgb3V0ICdmcm0nLCBhZnRlciB3aGljaCB3ZSdsbCBqdXN0IGhhbmQgdGhlIHN0cnVjdCBvZmYgdG8KKwkgKiAnZG90MTFmX3BhY2tfcHJvYmVfcmVzcG9uc2UnLgorCSAqLworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIGZybSwgc2l6ZW9mKHREb3QxMWZQcm9iZVJlc3BvbnNlKSwgMCk7CisKKwkvKgorCSAqIFRpbWVzdGFtcCB0byBiZSB1cGRhdGVkIGJ5IFRGUCwgYmVsb3cuCisJICoKKwkgKiBCZWFjb24gSW50ZXJ2YWw6CisJICovCisJaWYgKExJTV9JU19BUF9ST0xFKHBlX3Nlc3Npb24pKSB7CisJCWZybS0+QmVhY29uSW50ZXJ2YWwuaW50ZXJ2YWwgPQorCQkJbWFjX2N0eC0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uSW50ZXJ2YWw7CisJfSBlbHNlIHsKKwkJc2lyX3N0YXR1cyA9IHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwKKwkJCQlXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTCwgJmNmZyk7CisJCWlmIChlU0lSX1NVQ0NFU1MgIT0gc2lyX3N0YXR1cykgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJGYWlsZWQgdG8gZ2V0IFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMICglZCkuIiksCisJCQkJc2lyX3N0YXR1cyk7CisJCQlnb3RvIGVycl9yZXQ7CisJCX0KKwkJZnJtLT5CZWFjb25JbnRlcnZhbC5pbnRlcnZhbCA9ICh1aW50MTZfdCkgY2ZnOworCX0KKworCXBvcHVsYXRlX2RvdDExZl9jYXBhYmlsaXRpZXMobWFjX2N0eCwgJmZybS0+Q2FwYWJpbGl0aWVzLCBwZV9zZXNzaW9uKTsKKwlwb3B1bGF0ZV9kb3QxMWZfc3NpZChtYWNfY3R4LCAodFNpck1hY1NTaWQgKikgc3NpZCwgJmZybS0+U1NJRCk7CisJcG9wdWxhdGVfZG90MTFmX3N1cHBfcmF0ZXMobWFjX2N0eCwgUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLAorCQkmZnJtLT5TdXBwUmF0ZXMsIHBlX3Nlc3Npb24pOworCisJcG9wdWxhdGVfZG90MTFmX2RzX3BhcmFtcyhtYWNfY3R4LCAmZnJtLT5EU1BhcmFtcywKKwkJcGVfc2Vzc2lvbi0+Y3VycmVudE9wZXJDaGFubmVsKTsKKwlwb3B1bGF0ZV9kb3QxMWZfaWJzc19wYXJhbXMobWFjX2N0eCwgJmZybS0+SUJTU1BhcmFtcywgcGVfc2Vzc2lvbik7CisKKwlpZiAoTElNX0lTX0FQX1JPTEUocGVfc2Vzc2lvbikpIHsKKwkJaWYgKHBlX3Nlc3Npb24tPndwc19zdGF0ZSAhPSBTQVBfV1BTX0RJU0FCTEVEKQorCQkJcG9wdWxhdGVfZG90MTFmX3Byb2JlX3Jlc193cHNpX2VzKG1hY19jdHgsCisJCQkJJmZybS0+V3NjUHJvYmVSZXMsCisJCQkJcGVfc2Vzc2lvbik7CisJfSBlbHNlIHsKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgKHVpbnQxNl90KSBXTklfQ0ZHX1dQU19FTkFCTEUsCisJCQkmdG1wKSAhPSBlU0lSX1NVQ0NFU1MpCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsICJGYWlsZWQgdG8gY2ZnIGdldCBpZCAlZCIsCisJCQkJV05JX0NGR19XUFNfRU5BQkxFKTsKKworCQl3cHNfYXAgPSB0bXAgJiBXTklfQ0ZHX1dQU19FTkFCTEVfQVA7CisKKwkJaWYgKHdwc19hcCkKKwkJCXBvcHVsYXRlX2RvdDExZl93c2NfaW5fcHJvYmVfcmVzKG1hY19jdHgsCisJCQkJJmZybS0+V3NjUHJvYmVSZXMpOworCisJCWlmIChtYWNfY3R4LT5saW0ud3NjSWVJbmZvLnByb2JlUmVzcFdzY0Vucm9sbG1lbnRTdGF0ZSA9PQorCQkgICAgZUxJTV9XU0NfRU5ST0xMX0JFR0lOKSB7CisJCQlwb3B1bGF0ZV9kb3QxMWZfd3NjX3JlZ2lzdHJhcl9pbmZvX2luX3Byb2JlX3JlcyhtYWNfY3R4LAorCQkJCSZmcm0tPldzY1Byb2JlUmVzKTsKKwkJCW1hY19jdHgtPmxpbS53c2NJZUluZm8ucHJvYmVSZXNwV3NjRW5yb2xsbWVudFN0YXRlID0KKwkJCQllTElNX1dTQ19FTlJPTExfSU5fUFJPR1JFU1M7CisJCX0KKworCQlpZiAobWFjX2N0eC0+bGltLndzY0llSW5mby53c2NFbnJvbGxtZW50U3RhdGUgPT0KKwkJICAgIGVMSU1fV1NDX0VOUk9MTF9FTkQpIHsKKwkJCWRlX3BvcHVsYXRlX2RvdDExZl93c2NfcmVnaXN0cmFyX2luZm9faW5fcHJvYmVfcmVzKAorCQkJCW1hY19jdHgsICZmcm0tPldzY1Byb2JlUmVzKTsKKwkJCW1hY19jdHgtPmxpbS53c2NJZUluZm8ucHJvYmVSZXNwV3NjRW5yb2xsbWVudFN0YXRlID0KKwkJCQllTElNX1dTQ19FTlJPTExfTk9PUDsKKwkJfQorCX0KKworCXBvcHVsYXRlX2RvdDExZl9jb3VudHJ5KG1hY19jdHgsICZmcm0tPkNvdW50cnksIHBlX3Nlc3Npb24pOworCXBvcHVsYXRlX2RvdDExZl9lZGNhX3BhcmFtX3NldChtYWNfY3R4LCAmZnJtLT5FRENBUGFyYW1TZXQsIHBlX3Nlc3Npb24pOworCisJaWYgKHBlX3Nlc3Npb24tPmRvdDExbW9kZSAhPSBXTklfQ0ZHX0RPVDExX01PREVfMTFCKQorCQlwb3B1bGF0ZV9kb3QxMWZfZXJwX2luZm8obWFjX2N0eCwgJmZybS0+RVJQSW5mbywgcGVfc2Vzc2lvbik7CisKKwlwb3B1bGF0ZV9kb3QxMWZfZXh0X3N1cHBfcmF0ZXMobWFjX2N0eCwKKwkJUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLAorCQkmZnJtLT5FeHRTdXBwUmF0ZXMsIHBlX3Nlc3Npb24pOworCisJLyogUG9wdWxhdGUgSFQgSUVzLCB3aGVuIG9wZXJhdGluZyBpbiAxMW4gKi8KKwlpZiAocGVfc2Vzc2lvbi0+aHRDYXBhYmlsaXR5KSB7CisJCXBvcHVsYXRlX2RvdDExZl9odF9jYXBzKG1hY19jdHgsIHBlX3Nlc3Npb24sICZmcm0tPkhUQ2Fwcyk7CisJCXBvcHVsYXRlX2RvdDExZl9odF9pbmZvKG1hY19jdHgsICZmcm0tPkhUSW5mbywgcGVfc2Vzc2lvbik7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKHBlX3Nlc3Npb24tPnZodENhcGFiaWxpdHkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiUG9wdWxhdGUgVkhUIElFIGluIFByb2JlIFJlc3BvbnNlIikpOworCQlwb3B1bGF0ZV9kb3QxMWZfdmh0X2NhcHMobWFjX2N0eCwgcGVfc2Vzc2lvbiwgJmZybS0+VkhUQ2Fwcyk7CisJCXBvcHVsYXRlX2RvdDExZl92aHRfb3BlcmF0aW9uKG1hY19jdHgsIHBlX3Nlc3Npb24sCisJCQkmZnJtLT5WSFRPcGVyYXRpb24pOworCQkvKgorCQkgKiB3ZSBkbyBub3Qgc3VwcG9ydCBtdWx0aSB1c2VycyB5ZXQuCisJCSAqIHBvcHVsYXRlX2RvdDExZl92aHRfZXh0X2Jzc19sb2FkKCBtYWNfY3R4LAorCQkgKiAgICAgICAgICZmcm0uVkhURXh0QnNzTG9hZCApOworCQkgKi8KKwkJaXNfdmh0X2VuYWJsZWQgPSB0cnVlOworCX0KKyNlbmRpZgorCisJcG9wdWxhdGVfZG90MTFmX2V4dF9jYXAobWFjX2N0eCwgaXNfdmh0X2VuYWJsZWQsICZmcm0tPkV4dENhcCwKKwkJcGVfc2Vzc2lvbik7CisKKwlpZiAocGVfc2Vzc2lvbi0+cExpbVN0YXJ0QnNzUmVxKSB7CisJCXBvcHVsYXRlX2RvdDExZl93cGEobWFjX2N0eCwKKwkJCSYocGVfc2Vzc2lvbi0+cExpbVN0YXJ0QnNzUmVxLT5yc25JRSksCisJCQkmZnJtLT5XUEEpOworCQlwb3B1bGF0ZV9kb3QxMWZfcnNuX29wYXF1ZShtYWNfY3R4LAorCQkJJihwZV9zZXNzaW9uLT5wTGltU3RhcnRCc3NSZXEtPnJzbklFKSwKKwkJCSZmcm0tPlJTTk9wYXF1ZSk7CisJfQorCisJcG9wdWxhdGVfZG90MTFmX3dtbShtYWNfY3R4LCAmZnJtLT5XTU1JbmZvQXAsICZmcm0tPldNTVBhcmFtcywKKwkJJmZybS0+V01NQ2FwcywgcGVfc2Vzc2lvbik7CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorCWlmIChwZV9zZXNzaW9uLT5wTGltU3RhcnRCc3NSZXEpCisJCXBvcHVsYXRlX2RvdDExZl93YXBpKG1hY19jdHgsCisJCQkmKHBlX3Nlc3Npb24tPnBMaW1TdGFydEJzc1JlcS0+cnNuSUUpLAorCQkJJmZybS0+V0FQSSk7CisjZW5kaWYgLyogZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkgKi8KKworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX3Byb2JlX3Jlc3BvbnNlX3NpemUobWFjX2N0eCwgZnJtLCAmcGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiUHJvYmUgUmVzcG9uc2Ugc2l6ZSBlcnJvciAoMHglMDh4KS4iKSwKKwkJCXN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJcGF5bG9hZCA9IHNpemVvZih0RG90MTFmUHJvYmVSZXNwb25zZSk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIlByb2JlIFJlc3BvbnNlIHNpemUgd2FybmluZyAoMHglMDh4KS4iKSwKKwkJCXN0YXR1cyk7CisJfQorCisJYnl0ZXMgPSBwYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsKKworCWlmIChtYWNfY3R4LT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEpCisJCWJ5dGVzICs9IChtYWNfY3R4LT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEtPmxlbmd0aCAtCisJCQkgc2l6ZW9mKHRTaXJSZW1haW5PbkNoblJlcSkpOworCWVsc2UKKwkJLyoKKwkJICogT25seSB1c2UgQ0ZHIGZvciBub24tbGlzdGVuIG1vZGUuIFRoaXMgQ0ZHIGlzIG5vdCB3b3JraW5nIGZvcgorCQkgKiBjb25jdXJyZW5jeS4gSW4gbGlzdGVuaW5nIG1vZGUsIHByb2JlIHJzcCBJRXMgaXMgcGFzc2VkIGluCisJCSAqIHRoZSBtZXNzYWdlIGZyb20gU01FIHRvIFBFLgorCQkgKi8KKwkJYWRkbl9pZV9wcmVzZW50ID0KKwkJCShwZV9zZXNzaW9uLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BEYXRhTGVuICE9IDApOworCisJaWYgKGFkZG5faWVfcHJlc2VudCkgeworCisJCWFkZF9pZSA9IGNkZl9tZW1fbWFsbG9jKAorCQkJCXBlX3Nlc3Npb24tPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFMZW4pOworCQlpZiAoTlVMTCA9PSBhZGRfaWUpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiYWRkX2llIGFsbG9jYXRpb24gZmFpbGVkIikpOworCQkJZ290byBlcnJfcmV0OworCQl9CisKKwkJY2RmX21lbV9jb3B5KGFkZF9pZSwKKwkJCSAgICAgcGVfc2Vzc2lvbi0+YWRkSWVQYXJhbXMucHJvYmVSZXNwRGF0YV9idWZmLAorCQkJICAgICBwZV9zZXNzaW9uLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BEYXRhTGVuKTsKKwkJYWRkbl9pZV9sZW4gPSBwZV9zZXNzaW9uLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BEYXRhTGVuOworCisJCWlmIChlU0lSX1NVQ0NFU1MgIT0gbGltX2dldF9hZGRuX2llX2Zvcl9wcm9iZV9yZXNwKG1hY19jdHgsCisJCQkJCWFkZF9pZSwgJmFkZG5faWVfbGVuLCBwcmVxX3AycGllKSkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJVbmFibGUgdG8gZ2V0IGFkZG5faWUiKSk7CisJCQlnb3RvIGVycl9yZXQ7CisJCX0KKworCQlzaXJfc3RhdHVzID0gbGltX3N0cmlwX2V4dGNhcF91cGRhdGVfc3RydWN0KG1hY19jdHgsCisJCQkJCWFkZF9pZSwgJmFkZG5faWVfbGVuLAorCQkJCQkmZXh0cmFjdGVkX2V4dF9jYXApOworCQlpZiAoZVNJUl9TVUNDRVNTICE9IHNpcl9zdGF0dXMpIHsKKwkJCWV4dHJhY3RlZF9leHRfY2FwX2ZsYWcgPSBmYWxzZTsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgiVW5hYmxlIHRvIHN0cmlwIG9mZiBFeHRDYXAgSUUiKSk7CisJCX0KKworCQlieXRlcyA9IGJ5dGVzICsgYWRkbl9pZV9sZW47CisKKwkJaWYgKHByZXFfcDJwaWUpCisJCQlwMnBfaWUgPSBsaW1HZXRQMnBJRVB0cihtYWNfY3R4LCAmYWRkX2llWzBdLAorCQkJCQlhZGRuX2llX2xlbik7CisKKwkJaWYgKHAycF9pZSAhPSBOVUxMKSB7CisJCQkvKiBnZXQgTm9BIGF0dHJpYnV0ZSBzdHJlYW0gUDJQIElFICovCisJCQlub2FsZW4gPSBsaW1fZ2V0X25vYV9hdHRyX3N0cmVhbShtYWNfY3R4LAorCQkJCQlub2Ffc3RyZWFtLCBwZV9zZXNzaW9uKTsKKwkJCWlmIChub2FsZW4gIT0gMCkgeworCQkJCXRvdGFsX25vYWxlbiA9CisJCQkJCWxpbV9idWlsZF9wMnBfaWUobWFjX2N0eCwgJm5vYV9pZVswXSwKKwkJCQkJCSZub2Ffc3RyZWFtWzBdLCBub2FsZW4pOworCQkJCWJ5dGVzID0gYnl0ZXMgKyB0b3RhbF9ub2FsZW47CisJCQl9CisJCX0KKwl9CisKKwljZGZfc3RhdHVzID0gY2RzX3BhY2tldF9hbGxvYygodWludDE2X3QpIGJ5dGVzLCAodm9pZCAqKikmZnJhbWUsCisJCQkJICAgICAgKHZvaWQgKiopJnBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLCBGTCgiUHJvYmUgUmVzcG9uc2UgYWxsb2NhdGlvbiBmYWlsZWQiKSk7CisJCWdvdG8gZXJyX3JldDsKKwl9CisJLyogUGFyYW5vaWE6ICovCisJY2RmX21lbV9zZXQoZnJhbWUsIGJ5dGVzLCAwKTsKKworCS8qIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjogKi8KKwlsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcihtYWNfY3R4LCBmcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorCQlTSVJfTUFDX01HTVRfUFJPQkVfUlNQLCBwZWVyX21hY2FkZHIsCisJCXBlX3Nlc3Npb24tPnNlbGZNYWNBZGRyKTsKKworCW1hY19oZHIgPSAodHBTaXJNYWNNZ210SGRyKSBmcmFtZTsKKworCXNpcl9jb3B5X21hY19hZGRyKG1hY19oZHItPmJzc0lkLCBwZV9zZXNzaW9uLT5ic3NJZCk7CisKKwkvKiBtZXJnZSBFeHRDYXAgSUUgKi8KKwlpZiAoZXh0cmFjdGVkX2V4dF9jYXBfZmxhZykKKwkJbGltX21lcmdlX2V4dGNhcF9zdHJ1Y3QoJmZybS0+RXh0Q2FwLCAmZXh0cmFjdGVkX2V4dF9jYXApOworCisJLyogVGhhdCBkb25lLCBwYWNrIHRoZSBQcm9iZSBSZXNwb25zZTogKi8KKwlzdGF0dXMgPQorCQlkb3QxMWZfcGFja19wcm9iZV9yZXNwb25zZShtYWNfY3R4LCBmcm0sCisJCQlmcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQlwYXlsb2FkLCAmcGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiUHJvYmUgUmVzcG9uc2UgcGFjayBmYWlsdXJlICgweCUwOHgpLiIpLAorCQkJc3RhdHVzKTsKKwkJCWdvdG8gZXJyX3JldDsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiUHJvYmUgUmVzcG9uc2UgcGFjayB3YXJuaW5nICgweCUwOHgpLiIpLAorCQkJc3RhdHVzKTsKKwl9CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzMsIEZMKCJTZW5kaW5nIFByb2JlIFJlc3BvbnNlIGZyYW1lIHRvICIpKTsKKwlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwgcGVlcl9tYWNhZGRyLCBMT0czKTsKKworCW1hY19jdHgtPnN5cy5wcm9iZVJlc3BvbmQrKzsKKworCWlmIChtYWNfY3R4LT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEpCisJCWNkZl9tZW1fY29weShmcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkcikgKyBwYXlsb2FkLAorCQkJICAgICBtYWNfY3R4LT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEtPnByb2JlUnNwSWUsCisJCQkgICAgIChtYWNfY3R4LT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEtPmxlbmd0aCAtCisJCQkgICAgICBzaXplb2YodFNpclJlbWFpbk9uQ2huUmVxKSkpOworCisJaWYgKGFkZG5faWVfcHJlc2VudCkKKwkJY2RmX21lbV9jb3B5KGZyYW1lICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArIHBheWxvYWQsCisJCQkgICAgICZhZGRfaWVbMF0sIGFkZG5faWVfbGVuKTsKKworCWlmIChub2FsZW4gIT0gMCkgeworCQlpZiAodG90YWxfbm9hbGVuID4KKwkJICAgIChTSVJfTUFYX05PQV9BVFRSX0xFTiArIFNJUl9QMlBfSUVfSEVBREVSX0xFTikpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiTm90IGFibGUgdG8gaW5zZXJ0IE5vQSwgdG90YWwgbGVuPSVkIiksCisJCQkJdG90YWxfbm9hbGVuKTsKKwkJCWdvdG8gZXJyX3JldDsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fY29weSgmZnJhbWVbYnl0ZXMgLSAodG90YWxfbm9hbGVuKV0sCisJCQkJICAgICAmbm9hX2llWzBdLCB0b3RhbF9ub2FsZW4pOworCQl9CisJfQorCisJaWYgKChTSVJfQkFORF81X0dIWiA9PSBsaW1fZ2V0X3JmX2JhbmQocGVfc2Vzc2lvbi0+Y3VycmVudE9wZXJDaGFubmVsKSkKKwkgICAgfHwgKHBlX3Nlc3Npb24tPnBlUGVyc29uYSA9PSBDREZfUDJQX0NMSUVOVF9NT0RFKSB8fAorCSAgICAocGVfc2Vzc2lvbi0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkKKwkgICAgKQorCQl0eF9mbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisKKwkvKiBRdWV1ZSBQcm9iZSBSZXNwb25zZSBmcmFtZSBpbiBoaWdoIHByaW9yaXR5IFdRICovCisJY2RmX3N0YXR1cyA9IHdtYV90eF9mcmFtZSgodEhhbEhhbmRsZSkgbWFjX2N0eCwgcGFja2V0LAorCQkJCSh1aW50MTZfdCkgYnl0ZXMsCisJCQkJVFhSWF9GUk1fODAyXzExX01HTVQsCisJCQkJQU5JX1RYRElSX1RPRFMsCisJCQkJNywgbGltX3R4X2NvbXBsZXRlLCBmcmFtZSwgdHhfZmxhZywKKwkJCQlzbWVfc2Vzc2lvbmlkLCAwKTsKKworCS8qIFBrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjayAqLworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJDb3VsZCBub3Qgc2VuZCBQcm9iZSBSZXNwb25zZS4iKSk7CisKKwlpZiAoYWRkX2llICE9IE5VTEwpCisJCWNkZl9tZW1fZnJlZShhZGRfaWUpOworCisJY2RmX21lbV9mcmVlKGZybSk7CisJcmV0dXJuOworCitlcnJfcmV0OgorCWlmIChhZGRfaWUgIT0gTlVMTCkKKwkJY2RmX21lbV9mcmVlKGFkZF9pZSk7CisJaWYgKGZybSAhPSBOVUxMKQorCQljZGZfbWVtX2ZyZWUoZnJtKTsKKwlpZiAocGFja2V0ICE9IE5VTEwpCisJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXBhY2tldCk7CisJcmV0dXJuOworCit9IC8qIEVuZCBsaW1fc2VuZF9wcm9iZV9yc3BfbWdtdF9mcmFtZS4gKi8KKwordm9pZAorbGltX3NlbmRfYWRkdHNfcmVxX2FjdGlvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLAorCQkJCXRTaXJBZGR0c1JlcUluZm8gKnBBZGRUUywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MTZfdCBpOworCXVpbnQ4X3QgKnBGcmFtZTsKKwl0RG90MTFmQWRkVFNSZXF1ZXN0IEFkZFRTUmVxOworCXREb3QxMWZXTU1BZGRUU1JlcXVlc3QgV01NQWRkVFNSZXE7CisJdWludDMyX3QgblBheWxvYWQsIG5CeXRlcywgblN0YXR1czsKKwl0cFNpck1hY01nbXRIZHIgcE1hY0hkcjsKKwl2b2lkICpwUGFja2V0OworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwl1aW50MzJfdCBwaHlNb2RlOworI2VuZGlmCisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXVpbnQ4X3QgdHhGbGFnID0gMDsKKwl1aW50OF90IHNtZVNlc3Npb25JZCA9IDA7CisKKwlpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KSB7CisJCXJldHVybjsKKwl9CisKKwlzbWVTZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKwlpZiAoIXBBZGRUUy0+d21lVHNwZWNQcmVzZW50KSB7CisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZBZGRUU1JlcSwgc2l6ZW9mKEFkZFRTUmVxKSwgMCk7CisKKwkJQWRkVFNSZXEuQWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfUU9TX0FERF9UU19SRVE7CisJCUFkZFRTUmVxLkRpYWxvZ1Rva2VuLnRva2VuID0gcEFkZFRTLT5kaWFsb2dUb2tlbjsKKwkJQWRkVFNSZXEuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9RT1NfTUdNVDsKKwkJaWYgKHBBZGRUUy0+bGxlVHNwZWNQcmVzZW50KSB7CisJCQlwb3B1bGF0ZV9kb3QxMWZfdHNwZWMoJnBBZGRUUy0+dHNwZWMsICZBZGRUU1JlcS5UU1BFQyk7CisJCX0gZWxzZSB7CisJCQlwb3B1bGF0ZV9kb3QxMWZfd21tdHNwZWMoJnBBZGRUUy0+dHNwZWMsCisJCQkJCQkgJkFkZFRTUmVxLldNTVRTUEVDKTsKKwkJfQorCisJCWlmIChwQWRkVFMtPmxsZVRzcGVjUHJlc2VudCkgeworCQkJQWRkVFNSZXEubnVtX1dNTVRDTEFTID0gMDsKKwkJCUFkZFRTUmVxLm51bV9UQ0xBUyA9IHBBZGRUUy0+bnVtVGNsYXM7CisJCQlmb3IgKGkgPSAwOyBpIDwgcEFkZFRTLT5udW1UY2xhczsgKytpKSB7CisJCQkJcG9wdWxhdGVfZG90MTFmX3RjbGFzKHBNYWMsICZwQWRkVFMtPnRjbGFzSW5mb1tpXSwKKwkJCQkJCSAgICAgICZBZGRUU1JlcS5UQ0xBU1tpXSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlBZGRUU1JlcS5udW1fVENMQVMgPSAwOworCQkJQWRkVFNSZXEubnVtX1dNTVRDTEFTID0gcEFkZFRTLT5udW1UY2xhczsKKwkJCWZvciAoaSA9IDA7IGkgPCBwQWRkVFMtPm51bVRjbGFzOyArK2kpIHsKKwkJCQlwb3B1bGF0ZV9kb3QxMWZfd21tdGNsYXMocE1hYywKKwkJCQkJCQkgJnBBZGRUUy0+dGNsYXNJbmZvW2ldLAorCQkJCQkJCSAmQWRkVFNSZXEuV01NVENMQVNbaV0pOworCQkJfQorCQl9CisKKwkJaWYgKHBBZGRUUy0+dGNsYXNQcm9jUHJlc2VudCkgeworCQkJaWYgKHBBZGRUUy0+bGxlVHNwZWNQcmVzZW50KSB7CisJCQkJQWRkVFNSZXEuVENMQVNTUFJPQy5wcm9jZXNzaW5nID0KKwkJCQkJcEFkZFRTLT50Y2xhc1Byb2M7CisJCQkJQWRkVFNSZXEuVENMQVNTUFJPQy5wcmVzZW50ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJQWRkVFNSZXEuV01NVENMQVNQUk9DLnZlcnNpb24gPSAxOworCQkJCUFkZFRTUmVxLldNTVRDTEFTUFJPQy5wcm9jZXNzaW5nID0KKwkJCQkJcEFkZFRTLT50Y2xhc1Byb2M7CisJCQkJQWRkVFNSZXEuV01NVENMQVNQUk9DLnByZXNlbnQgPSAxOworCQkJfQorCQl9CisKKwkJblN0YXR1cyA9CisJCQlkb3QxMWZfZ2V0X3BhY2tlZF9hZGRfdHNfcmVxdWVzdF9zaXplKHBNYWMsICZBZGRUU1JlcSwgJm5QYXlsb2FkKTsKKwkJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKwkJCQkgICAib3IgYW4gQWRkIFRTIFJlcXVlc3QgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCQkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQkJblBheWxvYWQgPSBzaXplb2YodERvdDExZkFkZFRTUmVxdWVzdCk7CisJCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCUZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIgorCQkJCSAgICJ0aGUgcGFja2VkIHNpemUgZm9yIGFuIEFkZCBUUyBSZXF1ZXN0IgorCQkJCSAgICIgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCQl9CisJfSBlbHNlIHsKKwkJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJldNTUFkZFRTUmVxLCBzaXplb2YoV01NQWRkVFNSZXEpLCAwKTsKKworCQlXTU1BZGRUU1JlcS5BY3Rpb24uYWN0aW9uID0gU0lSX01BQ19RT1NfQUREX1RTX1JFUTsKKwkJV01NQWRkVFNSZXEuRGlhbG9nVG9rZW4udG9rZW4gPSBwQWRkVFMtPmRpYWxvZ1Rva2VuOworCQlXTU1BZGRUU1JlcS5DYXRlZ29yeS5jYXRlZ29yeSA9IFNJUl9NQUNfQUNUSU9OX1dNRTsKKworCQkvKiBXTU0gc3BlYyAyLjIuMTAgLSBzdGF0dXMgY29kZSBpcyBvbmx5IGZpbGxlZCBpbiBmb3IgQUREVFMgcmVzcG9uc2UgKi8KKwkJV01NQWRkVFNSZXEuU3RhdHVzQ29kZS5zdGF0dXNDb2RlID0gMDsKKworCQlwb3B1bGF0ZV9kb3QxMWZfd21tdHNwZWMoJnBBZGRUUy0+dHNwZWMsICZXTU1BZGRUU1JlcS5XTU1UU1BFQyk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQlsaW1fZ2V0X3BoeV9tb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKworCQlpZiAocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRworCQkgICAgfHwgcGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExQSkgeworCQkJcEFkZFRTLT50c3JzSUUucmF0ZXNbMF0gPSBUU1JTXzExQUdfUkFURV82TUJQUzsKKwkJfSBlbHNlIHsKKwkJCXBBZGRUUy0+dHNyc0lFLnJhdGVzWzBdID0gVFNSU18xMUJfUkFURV81XzVNQlBTOworCQl9CisJCXBvcHVsYXRlX2RvdDExX3RzcnNpZShwTWFjLCAmcEFkZFRTLT50c3JzSUUsCisJCQkJICAgICAgJldNTUFkZFRTUmVxLkVTRVRyYWZTdHJtUmF0ZVNldCwKKwkJCQkgICAgICBzaXplb2YodWludDhfdCkpOworI2VuZGlmCisJCS8qIGZpbGxXbWVUc3BlY0lFICovCisKKwkJblN0YXR1cyA9CisJCQlkb3QxMWZfZ2V0X3BhY2tlZF93bW1fYWRkX3RzX3JlcXVlc3Rfc2l6ZShwTWFjLCAmV01NQWRkVFNSZXEsCisJCQkJCQkJCSAgJm5QYXlsb2FkKTsKKwkJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKwkJCQkgICAib3IgYSBXTU0gQWRkIFRTIFJlcXVlc3QgKDB4JTA4eCkuIiksCisJCQkJblN0YXR1cyk7CisJCQkvKiBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86ICovCisJCQluUGF5bG9hZCA9IHNpemVvZih0RG90MTFmQWRkVFNSZXF1ZXN0KTsKKwkJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmciCisJCQkJICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBXTU0gQWRkIFRTIFJlcXUiCisJCQkJICAgImVzdCAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJCX0KKwl9CisKKwluQnl0ZXMgPSBuUGF5bG9hZCArIHNpemVvZih0U2lyTWFjTWdtdEhkcik7CisKKwljZGZfc3RhdHVzID0gY2RzX3BhY2tldF9hbGxvYygodWludDE2X3QpIG5CeXRlcywgKHZvaWQgKiopJnBGcmFtZSwKKwkJCQkgICAgICAodm9pZCAqKikmcFBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhbiBBZCIKKwkJCQkgICAgICAgImQgVFMgUmVxdWVzdC4iKSwgbkJ5dGVzKTsKKwkJcmV0dXJuOworCX0KKwkvKiBQYXJhbm9pYTogKi8KKwljZGZfbWVtX3NldChwRnJhbWUsIG5CeXRlcywgMCk7CisKKwkvKiBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6ICovCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIocE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisJCVNJUl9NQUNfTUdNVF9BQ1RJT04sIHBlZXJNYWNBZGRyLCBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIHBGcmFtZTsKKworCXNpcl9jb3B5X21hY19hZGRyKHBNYWNIZHItPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJbGltX3NldF9wcm90ZWN0ZWRfYml0KHBNYWMsIHBzZXNzaW9uRW50cnksIHBlZXJNYWNBZGRyLCBwTWFjSGRyKTsKKyNlbmRpZgorCisJLyogVGhhdCBkb25lLCBwYWNrIHRoZSBzdHJ1Y3Q6ICovCisJaWYgKCFwQWRkVFMtPndtZVRzcGVjUHJlc2VudCkgeworCQluU3RhdHVzID0gZG90MTFmX3BhY2tfYWRkX3RzX3JlcXVlc3QocE1hYywgJkFkZFRTUmVxLAorCQkJCQkJICAgICBwRnJhbWUgKworCQkJCQkJICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpLAorCQkJCQkJICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkKTsKKwkJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiRmFpbGVkIHRvIHBhY2sgYW4gQWRkIFRTIFJlcXVlc3QgIgorCQkJCSAgICIoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKilwUGFja2V0KTsKKwkJCXJldHVybjsgLyogYWxsb2NhdGVkISAqLworCQl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCQlGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nICIKKwkJCQkgICAiYW4gQWRkIFRTIFJlcXVlc3QgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCQl9CisJfSBlbHNlIHsKKwkJblN0YXR1cyA9IGRvdDExZl9wYWNrX3dtbV9hZGRfdHNfcmVxdWVzdChwTWFjLCAmV01NQWRkVFNSZXEsCisJCQkJCQkJIHBGcmFtZSArCisJCQkJCQkJIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCQkJIG5QYXlsb2FkLCAmblBheWxvYWQpOworCQlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJGYWlsZWQgdG8gcGFjayBhIFdNTSBBZGQgVFMgUmVxdWUiCisJCQkJICAgInN0ICgweCUwOHgpLiIpLCBuU3RhdHVzKTsKKwkJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXBQYWNrZXQpOworCQkJcmV0dXJuOyAvKiBhbGxvY2F0ZWQhICovCisJCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCUZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgIgorCQkJCSAgICJhIFdNTSBBZGQgVFMgUmVxdWVzdCAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJCX0KKwl9CisKKwlQRUxPRzMobGltX2xvZyhwTWFjLCBMT0czLCBGTCgiU2VuZGluZyBhbiBBZGQgVFMgUmVxdWVzdCBmcmFtZSB0byAiKSk7CisJICAgICAgIGxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwZWVyTWFjQWRkciwgTE9HMyk7CisJICAgICAgICkKKworCWlmICgoU0lSX0JBTkRfNV9HSFogPT0KKwkgICAgIGxpbV9nZXRfcmZfYmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorCSAgICB8fCAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpCisJICAgIHx8IChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKQorCSAgICApIHsKKwkJdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIHBNYWNIZHItPmZjLnN1YlR5cGUpKTsKKworCS8qIFF1ZXVlIEFkZHRzIFJlc3BvbnNlIGZyYW1lIGluIGhpZ2ggcHJpb3JpdHkgV1EgKi8KKwljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCVRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCUFOSV9UWERJUl9UT0RTLAorCQkJCTcsIGxpbV90eF9jb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcsCisJCQkJc21lU2Vzc2lvbklkLCAwKTsKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfQ09NUExFVEUsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGNkZl9zdGF0dXMpKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIioqKiBDb3VsZCBub3Qgc2VuZCBhbiBBZGQgVFMgUmVxdWVzdCIKKwkJCQkgICAgICAgIiAoJVgpICoqKiIpLCBjZGZfc3RhdHVzKTsKKwkJLyogUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrICovCisJfQorCit9IC8qIEVuZCBsaW1fc2VuZF9hZGR0c19yZXFfYWN0aW9uX2ZyYW1lLiAqLworCisvKioKKyAqIGxpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKCkgLSBTZW5kIGFzc29jIHJlc3BvbnNlCisgKiBAbWFjX2N0eDogSGFuZGxlIGZvciBtYWMgY29udGV4dAorICogQHN0YXR1c19jb2RlOiBTdGF0dXMgY29kZSBmb3IgYXNzb2MgcmVzcG9uc2UgZnJhbWUKKyAqIEBhaWQ6IEFzc29jaWF0aW9uIElECisgKiBAcGVlcl9hZGRyOiBNYWMgYWRkcmVzcyBvZiByZXF1ZXN0aW5nIHBlZXIKKyAqIEBzdWJ0eXBlOiBBc3NvYy9SZWFzc29jCisgKiBAc3RhOiBQb2ludGVyIHRvIHN0YXRpb24gbm9kZQorICogQHBlX3Nlc3Npb246IFBFIHNlc3Npb24gaWQuCisgKgorICogQnVpbGRzIGFuZCBzZW5kcyBhc3NvY2lhdGlvbiByZXNwb25zZSBmcmFtZSB0byB0aGUgcmVxdWVzdGluZyBwZWVyLgorICoKKyAqIFJldHVybjogdm9pZAorICovCisKK3ZvaWQKK2xpbV9zZW5kX2Fzc29jX3JzcF9tZ210X2ZyYW1lKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdWludDE2X3Qgc3RhdHVzX2NvZGUsIHVpbnQxNl90IGFpZCwgdFNpck1hY0FkZHIgcGVlcl9hZGRyLAorCXVpbnQ4X3Qgc3VidHlwZSwgdHBEcGhIYXNoTm9kZSBzdGEsIHRwUEVTZXNzaW9uIHBlX3Nlc3Npb24pCit7CisJc3RhdGljIHREb3QxMWZBc3NvY1Jlc3BvbnNlIGZybTsKKwl1aW50OF90ICpmcmFtZTsKKwl0cFNpck1hY01nbXRIZHIgbWFjX2hkcjsKKwl0U2lyUmV0U3RhdHVzIHNpcl9zdGF0dXM7CisJdWludDhfdCBsbGVfbW9kZSA9IDAsIGFkZHRzOworCXRIYWxCaXRWYWwgcW9zX21vZGUsIHdtZV9tb2RlOworCXVpbnQzMl90IHBheWxvYWQsIGJ5dGVzLCBzdGF0dXM7CisJdm9pZCAqcGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl0VXBkYXRlQmVhY29uUGFyYW1zIGJlYWNvbl9wYXJhbXM7CisJdWludDhfdCB0eF9mbGFnID0gMDsKKwl1aW50MzJfdCBhZGRuX2llX2xlbiA9IDA7CisJdWludDhfdCBhZGRfaWVbV05JX0NGR19BU1NPQ19SU1BfQURETklFX0RBVEFfTEVOXTsKKwl0cFNpckFzc29jUmVxIGFzc29jX3JlcSA9IE5VTEw7CisJdWludDhfdCBzbWVfc2Vzc2lvbiA9IDA7CisJYm9vbCBpc192aHQgPSBmYWxzZTsKKwl1aW50MTZfdCBzdHJpcG9mZl9sZW4gPSAwOworCXREb3QxMWZJRUV4dENhcCBleHRyYWN0ZWRfZXh0X2NhcDsKKwlib29sIGV4dHJhY3RlZF9mbGFnID0gZmFsc2U7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXVpbnQzMl90IHJldHJ5X2ludDsKKwl1aW50MzJfdCBtYXhfcmV0cmllczsKKyNlbmRpZgorCisJaWYgKE5VTEwgPT0gcGVfc2Vzc2lvbikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJwZV9zZXNzaW9uIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlzbWVfc2Vzc2lvbiA9IHBlX3Nlc3Npb24tPnNtZVNlc3Npb25JZDsKKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZmcm0sIHNpemVvZihmcm0pLCAwKTsKKworCWxpbUdldFFvc01vZGUocGVfc2Vzc2lvbiwgJnFvc19tb2RlKTsKKwlsaW1HZXRXbWVNb2RlKHBlX3Nlc3Npb24sICZ3bWVfbW9kZSk7CisKKwkvKgorCSAqIEFuIEFkZCBUUyBJRSBpcyBhZGRlZCBvbmx5IGlmIHRoZSBBUCBzdXBwb3J0cyBpdCBhbmQKKwkgKiB0aGUgcmVxdWVzdGluZyBTVEEgc2VudCBhIHRyYWZmaWMgc3BlYy4KKwkgKi8KKwlhZGR0cyA9IChxb3NfbW9kZSAmJiBzdGEgJiYgc3RhLT5xb3MuYWRkdHNQcmVzZW50KSA/IDEgOiAwOworCisJZnJtLlN0YXR1cy5zdGF0dXMgPSBzdGF0dXNfY29kZTsKKworCWZybS5BSUQuYXNzb2NpZCA9IGFpZCB8IExJTV9BSURfTUFTSzsKKworCWlmIChOVUxMID09IHN0YSkgeworCQlwb3B1bGF0ZV9kb3QxMWZfc3VwcF9yYXRlcyhtYWNfY3R4LAorCQkJUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLAorCQkJJmZybS5TdXBwUmF0ZXMsIHBlX3Nlc3Npb24pOworCQlwb3B1bGF0ZV9kb3QxMWZfZXh0X3N1cHBfcmF0ZXMobWFjX2N0eCwKKwkJCVBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwKKwkJCSZmcm0uRXh0U3VwcFJhdGVzLCBwZV9zZXNzaW9uKTsKKwl9IGVsc2UgeworCQlwb3B1bGF0ZV9kb3QxMWZfYXNzb2NfcnNwX3JhdGVzKG1hY19jdHgsICZmcm0uU3VwcFJhdGVzLAorCQkJJmZybS5FeHRTdXBwUmF0ZXMsCisJCQlzdGEtPnN1cHBvcnRlZFJhdGVzLmxsYlJhdGVzLAorCQkJc3RhLT5zdXBwb3J0ZWRSYXRlcy5sbGFSYXRlcyk7CisJfQorCisJaWYgKExJTV9JU19BUF9ST0xFKHBlX3Nlc3Npb24pICYmIHN0YSAhPSBOVUxMICYmCisJICAgIGVTSVJfU1VDQ0VTUyA9PSBzdGF0dXNfY29kZSkgeworCQlhc3NvY19yZXEgPSAodHBTaXJBc3NvY1JlcSkKKwkJCXBlX3Nlc3Npb24tPnBhcnNlZEFzc29jUmVxW3N0YS0+YXNzb2NJZF07CisJCS8qCisJCSAqIHBvcHVsYXRlIFAyUCBJRSBpbiBBc3NvY1JzcCB3aGVuIGFzc29jUmVxIGZyb20gdGhlIHBlZXIKKwkJICogaW5jbHVkZXMgUDJQIElFCisJCSAqLworCQlpZiAoYXNzb2NfcmVxICE9IE5VTEwgJiYgYXNzb2NfcmVxLT5hZGRJRVByZXNlbnQpCisJCQlwb3B1bGF0ZV9kb3QxMV9hc3NvY19yZXNfcDJwX2llKG1hY19jdHgsCisJCQkJJmZybS5QMlBBc3NvY1JlcywKKwkJCQlhc3NvY19yZXEpOworCX0KKworCWlmIChOVUxMICE9IHN0YSkgeworCQlpZiAoZUhBTF9TRVQgPT0gcW9zX21vZGUpIHsKKwkJCWlmIChzdGEtPmxsZUVuYWJsZWQpIHsKKwkJCQlsbGVfbW9kZSA9IDE7CisJCQkJcG9wdWxhdGVfZG90MTFmX2VkY2FfcGFyYW1fc2V0KG1hY19jdHgsCisJCQkJCSZmcm0uRURDQVBhcmFtU2V0LCBwZV9zZXNzaW9uKTsKKwkJCX0KKwkJfQorCisJCWlmICgoIWxsZV9tb2RlKSAmJiAoZUhBTF9TRVQgPT0gd21lX21vZGUpICYmIHN0YS0+d21lRW5hYmxlZCkgeworCQkJcG9wdWxhdGVfZG90MTFmX3dtbV9wYXJhbXMobWFjX2N0eCwgJmZybS5XTU1QYXJhbXMsCisJCQkJcGVfc2Vzc2lvbik7CisKKwkJCWlmIChzdGEtPndzbUVuYWJsZWQpCisJCQkJcG9wdWxhdGVfZG90MTFmX3dtbV9jYXBzKCZmcm0uV01NQ2Fwcyk7CisJCX0KKworCQlpZiAoc3RhLT5tbG1TdGFDb250ZXh0Lmh0Q2FwYWJpbGl0eSAmJgorCQkgICAgcGVfc2Vzc2lvbi0+aHRDYXBhYmlsaXR5KSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkJRkwoIlBvcHVsYXRlIEhUIElFcyBpbiBBc3NvYyBSZXNwb25zZSIpKTsKKwkJCXBvcHVsYXRlX2RvdDExZl9odF9jYXBzKG1hY19jdHgsIHBlX3Nlc3Npb24sCisJCQkJJmZybS5IVENhcHMpOworCQkJcG9wdWxhdGVfZG90MTFmX2h0X2luZm8obWFjX2N0eCwgJmZybS5IVEluZm8sCisJCQkJcGVfc2Vzc2lvbik7CisJCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQlpZiAoc3RhLT5tbG1TdGFDb250ZXh0LnZodENhcGFiaWxpdHkgJiYKKwkJICAgIHBlX3Nlc3Npb24tPnZodENhcGFiaWxpdHkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgiUG9wdWxhdGUgVkhUIElFcyBpbiBBc3NvYyBSZXNwb25zZSIpKTsKKwkJCXBvcHVsYXRlX2RvdDExZl92aHRfY2FwcyhtYWNfY3R4LCBwZV9zZXNzaW9uLAorCQkJCSZmcm0uVkhUQ2Fwcyk7CisJCQlwb3B1bGF0ZV9kb3QxMWZfdmh0X29wZXJhdGlvbihtYWNfY3R4LCBwZV9zZXNzaW9uLAorCQkJCSZmcm0uVkhUT3BlcmF0aW9uKTsKKwkJCWlzX3ZodCA9IHRydWU7CisJCX0KKyNlbmRpZgorCisJCXBvcHVsYXRlX2RvdDExZl9leHRfY2FwKG1hY19jdHgsIGlzX3ZodCwgJmZybS5FeHRDYXAsCisJCQlwZV9zZXNzaW9uKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJaWYgKGVTSVJfTUFDX1RSWV9BR0FJTl9MQVRFUiA9PSBzdGF0dXNfY29kZSkgeworCQkJaWYgKHdsYW5fY2ZnX2dldF9pbnQKKwkJCQkgICAgKG1hY19jdHgsIFdOSV9DRkdfUE1GX1NBX1FVRVJZX01BWF9SRVRSSUVTLAorCQkJCSAgICAmbWF4X3JldHJpZXMpICE9IGVTSVJfU1VDQ0VTUykKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJnZXQgV05JX0NGR19QTUZfU0FfUVVFUllfTUFYX1JFVFJJRVMgZmFpbHVyZSIpKTsKKwkJCWVsc2UgaWYgKHdsYW5fY2ZnX2dldF9pbnQKKwkJCQkJIChtYWNfY3R4LAorCQkJCQkgV05JX0NGR19QTUZfU0FfUVVFUllfUkVUUllfSU5URVJWQUwsCisJCQkJCSAmcmV0cnlfaW50KSAhPSBlU0lSX1NVQ0NFU1MpCisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiZ2V0IFdOSV9DRkdfUE1GX1NBX1FVRVJZX1JFVFJZX0lOVEVSVkFMIGZhaWx1cmUiKSk7CisJCQllbHNlCisJCQkJcG9wdWxhdGVfZG90MTFmX3RpbWVvdXRfaW50ZXJ2YWwobWFjX2N0eCwKKwkJCQkJJmZybS5UaW1lb3V0SW50ZXJ2YWwsCisJCQkJCVNJUl9NQUNfVElfVFlQRV9BU1NPQ19DT01FQkFDSywKKwkJCQkJKG1heF9yZXRyaWVzIC0KKwkJCQkJCXN0YS0+cG1mU2FRdWVyeVJldHJ5Q291bnQpCisJCQkJCQkqIHJldHJ5X2ludCk7CisJCX0KKyNlbmRpZgorCX0KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZiZWFjb25fcGFyYW1zLCBzaXplb2YoYmVhY29uX3BhcmFtcyksIDApOworCisJaWYgKExJTV9JU19BUF9ST0xFKHBlX3Nlc3Npb24pICYmCisJCShwZV9zZXNzaW9uLT5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0KKwkJICAgIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fRElTQUJMRSkpCisJCQlsaW1fZGVjaWRlX2FwX3Byb3RlY3Rpb24obWFjX2N0eCwgcGVlcl9hZGRyLAorCQkJCSZiZWFjb25fcGFyYW1zLCBwZV9zZXNzaW9uKTsKKworCWxpbV91cGRhdGVfc2hvcnRfcHJlYW1ibGUobWFjX2N0eCwgcGVlcl9hZGRyLCAmYmVhY29uX3BhcmFtcywKKwkJcGVfc2Vzc2lvbik7CisJbGltX3VwZGF0ZV9zaG9ydF9zbG90X3RpbWUobWFjX2N0eCwgcGVlcl9hZGRyLCAmYmVhY29uX3BhcmFtcywKKwkJcGVfc2Vzc2lvbik7CisKKwkvKgorCSAqIFBvcHVsYXRlIERvMTFjYXBhYmlsaXRpZXMgYWZ0ZXIgdXBkYXRpbmcgc2Vzc2lvbiB3aXRoCisJICogQXNzb3MgcmVxIGRldGFpbHMKKwkgKi8KKwlwb3B1bGF0ZV9kb3QxMWZfY2FwYWJpbGl0aWVzKG1hY19jdHgsICZmcm0uQ2FwYWJpbGl0aWVzLCBwZV9zZXNzaW9uKTsKKworCWJlYWNvbl9wYXJhbXMuYnNzSWR4ID0gcGVfc2Vzc2lvbi0+YnNzSWR4OworCisJLyogU2VuZCBtZXNzYWdlIHRvIEhBTCBhYm91dCBiZWFjb24gcGFyYW1ldGVyIGNoYW5nZS4gKi8KKwlpZiAoKGZhbHNlID09IG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLmlzX2Rmc19jYWNfdGltZXJfcnVubmluZykKKwkgICAgJiYgYmVhY29uX3BhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcCkgeworCQlzY2hfc2V0X2ZpeGVkX2JlYWNvbl9maWVsZHMobWFjX2N0eCwgcGVfc2Vzc2lvbik7CisJCWxpbV9zZW5kX2JlYWNvbl9wYXJhbXMobWFjX2N0eCwgJmJlYWNvbl9wYXJhbXMsIHBlX3Nlc3Npb24pOworCX0KKwkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhpcyBmcmFtZTogKi8KKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9hc3NvY19yZXNwb25zZV9zaXplKG1hY19jdHgsICZmcm0sICZwYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJnZXQgQXNzb2NpYXRpb24gUmVzcG9uc2Ugc2l6ZSBmYWlsdXJlICgweCUwOHgpLiIpLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJnZXQgQXNzb2NpYXRpb24gUmVzcG9uc2Ugc2l6ZSB3YXJuaW5nICgweCUwOHgpLiIpLAorCQkJc3RhdHVzKTsKKwl9CisKKwlieXRlcyA9IHNpemVvZih0U2lyTWFjTWdtdEhkcikgKyBwYXlsb2FkOworCisJaWYgKGFzc29jX3JlcSAhPSBOVUxMKSB7CisJCWFkZG5faWVfbGVuID0gKHBlX3Nlc3Npb24tPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFMZW4gIT0gMCk7CisKKwkJLyogTm9uemVybyBsZW5ndGggaW5kaWNhdGVzIEFzc29jIHJzcCBJRSBhdmFpbGFibGUgKi8KKwkJaWYgKGFkZG5faWVfbGVuIDw9IFdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9EQVRBX0xFTgorCQkgICAgJiYgKGJ5dGVzICsgYWRkbl9pZV9sZW4pIDw9IFNJUl9NQVhfUEFDS0VUX1NJWkUpIHsKKwkJCWNkZl9tZW1fY29weShhZGRfaWUsCisJCQkJcGVfc2Vzc2lvbi0+YWRkSWVQYXJhbXMuYXNzb2NSZXNwRGF0YV9idWZmLAorCQkJCXBlX3Nlc3Npb24tPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFMZW4pOworCisJCQljZGZfbWVtX3NldCgodWludDhfdCAqKSAmZXh0cmFjdGVkX2V4dF9jYXAsCisJCQkJICAgIHNpemVvZihleHRyYWN0ZWRfZXh0X2NhcCksIDApOworCisJCQlzdHJpcG9mZl9sZW4gPSBhZGRuX2llX2xlbjsKKwkJCXNpcl9zdGF0dXMgPQorCQkJCWxpbV9zdHJpcF9leHRjYXBfdXBkYXRlX3N0cnVjdAorCQkJCQkobWFjX2N0eCwgJmFkZF9pZVswXSwgJnN0cmlwb2ZmX2xlbiwKKwkJCQkJJmV4dHJhY3RlZF9leHRfY2FwKTsKKwkJCWlmIChlU0lSX1NVQ0NFU1MgIT0gc2lyX3N0YXR1cykgeworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQkJRkwoInN0cmlwIG9mZiBleHRjYXAgSUUgZmFpbGVkIikpOworCQkJfSBlbHNlIHsKKwkJCQlhZGRuX2llX2xlbiA9IHN0cmlwb2ZmX2xlbjsKKwkJCQlleHRyYWN0ZWRfZmxhZyA9IHRydWU7CisJCQl9CisJCQlieXRlcyA9IGJ5dGVzICsgYWRkbl9pZV9sZW47CisJCX0KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoImFkZG5faWVfbGVuID0gJWQgZm9yIEFzc29jIFJlc3AgOiAlZCIpLAorCQkJYWRkbl9pZV9sZW4sIGFzc29jX3JlcS0+YWRkSUVQcmVzZW50KTsKKwl9CisJY2RmX3N0YXR1cyA9IGNkc19wYWNrZXRfYWxsb2MoKHVpbnQxNl90KSBieXRlcywgKHZvaWQgKiopJmZyYW1lLAorCQkJCSAgICAgICh2b2lkICoqKSZwYWNrZXQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoImNkc19wYWNrZXRfYWxsb2MgZmFpbGVkLiIpKTsKKwkJcmV0dXJuOworCX0KKwkvKiBQYXJhbm9pYTogKi8KKwljZGZfbWVtX3NldChmcmFtZSwgYnl0ZXMsIDApOworCisJLyogTmV4dCwgd2UgZmlsbCBvdXQgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yOiAqLworCWxpbV9wb3B1bGF0ZV9tYWNfaGVhZGVyKG1hY19jdHgsIGZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisJCShMSU1fQVNTT0MgPT0gc3VidHlwZSkgPworCQkJU0lSX01BQ19NR01UX0FTU09DX1JTUCA6IFNJUl9NQUNfTUdNVF9SRUFTU09DX1JTUCwKKwkJCXBlZXJfYWRkciwKKwkJCXBlX3Nlc3Npb24tPnNlbGZNYWNBZGRyKTsKKwltYWNfaGRyID0gKHRwU2lyTWFjTWdtdEhkcikgZnJhbWU7CisKKwlzaXJfY29weV9tYWNfYWRkcihtYWNfaGRyLT5ic3NJZCwgcGVfc2Vzc2lvbi0+YnNzSWQpOworCisJLyogbWVyZ2UgdGhlIEV4dENhcCBzdHJ1Y3QgKi8KKwlpZiAoZXh0cmFjdGVkX2ZsYWcpCisJCWxpbV9tZXJnZV9leHRjYXBfc3RydWN0KCYoZnJtLkV4dENhcCksICZleHRyYWN0ZWRfZXh0X2NhcCk7CisJc3RhdHVzID0gZG90MTFmX3BhY2tfYXNzb2NfcmVzcG9uc2UobWFjX2N0eCwgJmZybSwKKwkJCQkJICAgICBmcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCSAgICAgcGF5bG9hZCwgJnBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkFzc29jaWF0aW9uIFJlc3BvbnNlIHBhY2sgZmFpbHVyZSgweCUwOHgpLiIpLAorCQkJc3RhdHVzKTsKKwkJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopcGFja2V0KTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJBc3NvY2lhdGlvbiBSZXNwb25zZSBwYWNrIHdhcm5pbmcgKDB4JTA4eCkuIiksCisJCQlzdGF0dXMpOworCX0KKworCWlmIChzdWJ0eXBlID09IExJTV9BU1NPQykKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIioqKiBTZW5kaW5nIEFzc29jIFJlc3Agc3RhdHVzICVkIGFpZCAlZCB0byAiKSwKKwkJCXN0YXR1c19jb2RlLCBhaWQpOworCWVsc2UKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIioqKiBTZW5kaW5nIFJlQXNzb2MgUmVzcCBzdGF0dXMgJWQgYWlkICVkIHRvICIpLAorCQkJc3RhdHVzX2NvZGUsIGFpZCk7CisKKwlsaW1fcHJpbnRfbWFjX2FkZHIobWFjX2N0eCwgbWFjX2hkci0+ZGEsIExPRzEpOworCisJaWYgKGFkZG5faWVfbGVuICYmIGFkZG5faWVfbGVuIDw9IFdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9EQVRBX0xFTikKKwkJY2RmX21lbV9jb3B5KGZyYW1lICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArIHBheWxvYWQsCisJCQkgICAgICZhZGRfaWVbMF0sIGFkZG5faWVfbGVuKTsKKworCWlmICgoU0lSX0JBTkRfNV9HSFogPT0KKwkJbGltX2dldF9yZl9iYW5kKHBlX3Nlc3Npb24tPmN1cnJlbnRPcGVyQ2hhbm5lbCkpIHx8CisJCQkocGVfc2Vzc2lvbi0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpIHx8CisJCQkocGVfc2Vzc2lvbi0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkpCisJCXR4X2ZsYWcgfD0gSEFMX1VTRV9CRF9SQVRFMl9GT1JfTUFOQUdFTUVOVF9GUkFNRTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9NR01ULAorCQkJIHBlX3Nlc3Npb24tPnBlU2Vzc2lvbklkLCBtYWNfaGRyLT5mYy5zdWJUeXBlKSk7CisJLyogUXVldWUgQXNzb2NpYXRpb24gUmVzcG9uc2UgZnJhbWUgaW4gaGlnaCBwcmlvcml0eSBXUSAqLworCWNkZl9zdGF0dXMgPSB3bWFfdHhfZnJhbWUobWFjX2N0eCwgcGFja2V0LCAodWludDE2X3QpIGJ5dGVzLAorCQkJCVRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCUFOSV9UWERJUl9UT0RTLAorCQkJCTcsIGxpbV90eF9jb21wbGV0ZSwgZnJhbWUsIHR4X2ZsYWcsCisJCQkJc21lX3Nlc3Npb24sIDApOworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwKKwkJCSBwZV9zZXNzaW9uLT5wZVNlc3Npb25JZCwgY2RmX3N0YXR1cykpOworCisJLyogUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrICovCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCIqKiogQ291bGQgbm90IFNlbmQgUmUvQXNzb2NSc3AsIHJldENvZGU9JVggKioqIiksCisJCQljZGZfc3RhdHVzKTsKKworCS8qCisJICogdXBkYXRlIHRoZSBBTkkgcGVlciBzdGF0aW9uIGNvdW50LgorCSAqIEZJWE1FX1BST1RFQ1RJT04gOiB0YWtlIGNhcmUgb2YgZGlmZmVyZW50IHR5cGUgb2Ygc3RhdGlvbgorCSAqIGNvdW50ZXIgaW5zaWRlIHRoaXMgZnVuY3Rpb24uCisJICovCisJbGltX3V0aWxfY291bnRfc3RhX2FkZChtYWNfY3R4LCBzdGEsIHBlX3Nlc3Npb24pOworCit9CisKK3ZvaWQKK2xpbV9zZW5kX2RlbHRzX3JlcV9hY3Rpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl0U2lyTWFjQWRkciBwZWVyLAorCQkJCXVpbnQ4X3Qgd21tVHNwZWNQcmVzZW50LAorCQkJCXRTaXJNYWNUU0luZm8gKnBUc2luZm8sCisJCQkJdFNpck1hY1RzcGVjSUUgKnBUc3BlY0llLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQ4X3QgKnBGcmFtZTsKKwl0cFNpck1hY01nbXRIZHIgcE1hY0hkcjsKKwl0RG90MTFmRGVsVFMgRGVsVFM7CisJdERvdDExZldNTURlbFRTIFdNTURlbFRTOworCXVpbnQzMl90IG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXM7CisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdWludDhfdCB0eEZsYWcgPSAwOworCXVpbnQ4X3Qgc21lU2Vzc2lvbklkID0gMDsKKworCWlmIChOVUxMID09IHBzZXNzaW9uRW50cnkpIHsKKwkJcmV0dXJuOworCX0KKworCXNtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCWlmICghd21tVHNwZWNQcmVzZW50KSB7CisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZEZWxUUywgc2l6ZW9mKERlbFRTKSwgMCk7CisKKwkJRGVsVFMuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9RT1NfTUdNVDsKKwkJRGVsVFMuQWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfUU9TX0RFTF9UU19SRVE7CisJCXBvcHVsYXRlX2RvdDExZl90c19pbmZvKHBUc2luZm8sICZEZWxUUy5UU0luZm8pOworCisJCW5TdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9kZWxfdHNfc2l6ZShwTWFjLCAmRGVsVFMsICZuUGF5bG9hZCk7CisJCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaSIKKwkJCQkgICAiemUgZm9yIGEgRGVsIFRTICgweCUwOHgpLiIpLCBuU3RhdHVzKTsKKwkJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJCW5QYXlsb2FkID0gc2l6ZW9mKHREb3QxMWZEZWxUUyk7CisJCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCUZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGEiCisJCQkJICAgInRpbmcgdGhlIHBhY2tlZCBzaXplIGZvciBhIERlbCBUUyIKKwkJCQkgICAiICgweCUwOHgpLiIpLCBuU3RhdHVzKTsKKwkJfQorCX0gZWxzZSB7CisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZXTU1EZWxUUywgc2l6ZW9mKFdNTURlbFRTKSwgMCk7CisKKwkJV01NRGVsVFMuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9XTUU7CisJCVdNTURlbFRTLkFjdGlvbi5hY3Rpb24gPSBTSVJfTUFDX1FPU19ERUxfVFNfUkVROworCQlXTU1EZWxUUy5EaWFsb2dUb2tlbi50b2tlbiA9IDA7CisJCVdNTURlbFRTLlN0YXR1c0NvZGUuc3RhdHVzQ29kZSA9IDA7CisJCXBvcHVsYXRlX2RvdDExZl93bW10c3BlYyhwVHNwZWNJZSwgJldNTURlbFRTLldNTVRTUEVDKTsKKwkJblN0YXR1cyA9CisJCQlkb3QxMWZfZ2V0X3BhY2tlZF93bW1fZGVsX3RzX3NpemUocE1hYywgJldNTURlbFRTLCAmblBheWxvYWQpOworCQlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2kiCisJCQkJICAgInplIGZvciBhIFdNTSBEZWwgVFMgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCQkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQkJblBheWxvYWQgPSBzaXplb2YodERvdDExZkRlbFRTKTsKKwkJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYSIKKwkJCQkgICAidGluZyB0aGUgcGFja2VkIHNpemUgZm9yIGEgV01NIERlIgorCQkJCSAgICJsIFRTICgweCUwOHgpLiIpLCBuU3RhdHVzKTsKKwkJfQorCX0KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsKKworCWNkZl9zdGF0dXMgPQorCQljZHNfcGFja2V0X2FsbG9jKCh1aW50MTZfdCkgbkJ5dGVzLCAodm9pZCAqKikmcEZyYW1lLAorCQkJCSAodm9pZCAqKikmcFBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhbiBBZCIKKwkJCQkgICAgICAgImQgVFMgUmVzcG9uc2UuIiksIG5CeXRlcyk7CisJCXJldHVybjsKKwl9CisJLyogUGFyYW5vaWE6ICovCisJY2RmX21lbV9zZXQocEZyYW1lLCBuQnl0ZXMsIDApOworCisJLyogTmV4dCwgd2UgZmlsbCBvdXQgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yOiAqLworCWxpbV9wb3B1bGF0ZV9tYWNfaGVhZGVyKHBNYWMsIHBGcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorCQlTSVJfTUFDX01HTVRfQUNUSU9OLCBwZWVyLCBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIHBGcmFtZTsKKworCXNpcl9jb3B5X21hY19hZGRyKHBNYWNIZHItPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJbGltX3NldF9wcm90ZWN0ZWRfYml0KHBNYWMsIHBzZXNzaW9uRW50cnksIHBlZXIsIHBNYWNIZHIpOworI2VuZGlmCisKKwkvKiBUaGF0IGRvbmUsIHBhY2sgdGhlIHN0cnVjdDogKi8KKwlpZiAoIXdtbVRzcGVjUHJlc2VudCkgeworCQluU3RhdHVzID0gZG90MTFmX3BhY2tfZGVsX3RzKHBNYWMsICZEZWxUUywKKwkJCQkJICAgICBwRnJhbWUgKyBzaXplb2YodFNpck1hY01nbXRIZHIpLAorCQkJCQkgICAgIG5QYXlsb2FkLCAmblBheWxvYWQpOworCQlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJGYWlsZWQgdG8gcGFjayBhIERlbCBUUyBmcmFtZSAoMHglMDh4KS4iKSwKKwkJCQluU3RhdHVzKTsKKwkJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXBQYWNrZXQpOworCQkJcmV0dXJuOyAvKiBhbGxvY2F0ZWQhICovCisJCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCUZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgIgorCQkJCSAgICJhIERlbCBUUyBmcmFtZSAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJCX0KKwl9IGVsc2UgeworCQluU3RhdHVzID0gZG90MTFmX3BhY2tfd21tX2RlbF90cyhwTWFjLCAmV01NRGVsVFMsCisJCQkJCQkgcEZyYW1lICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKwkJCQkJCSBuUGF5bG9hZCwgJm5QYXlsb2FkKTsKKwkJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTAorCQkJCQkoIkZhaWxlZCB0byBwYWNrIGEgV01NIERlbCBUUyBmcmFtZSAoMHglMDh4KS4iKSwKKwkJCQluU3RhdHVzKTsKKwkJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXBQYWNrZXQpOworCQkJcmV0dXJuOyAvKiBhbGxvY2F0ZWQhICovCisJCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCUZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgIgorCQkJCSAgICJhIFdNTSBEZWwgVFMgZnJhbWUgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCQl9CisJfQorCisJUEVMT0cxKGxpbV9sb2cKKwkJICAgICAgIChwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBERUxUUyBSRVEgKHNpemUgJWQpIHRvICIpLCBuQnl0ZXMpOworCSAgICAgICBsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcE1hY0hkci0+ZGEsIExPRzEpOworCSAgICAgICApCisKKwlpZiAoKFNJUl9CQU5EXzVfR0haID09CisJICAgICBsaW1fZ2V0X3JmX2JhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKwkgICAgfHwgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBDREZfUDJQX0NMSUVOVF9NT0RFKQorCSAgICB8fCAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkKKwkgICAgKSB7CisJCXR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9NR01ULAorCQkJIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBwTWFjSGRyLT5mYy5zdWJUeXBlKSk7CisJY2RmX3N0YXR1cyA9IHdtYV90eF9mcmFtZShwTWFjLCBwUGFja2V0LCAodWludDE2X3QpIG5CeXRlcywKKwkJCQlUWFJYX0ZSTV84MDJfMTFfTUdNVCwKKwkJCQlBTklfVFhESVJfVE9EUywKKwkJCQk3LCBsaW1fdHhfY29tcGxldGUsIHBGcmFtZSwgdHhGbGFnLAorCQkJCXNtZVNlc3Npb25JZCwgMCk7CisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX0NPTVBMRVRFLAorCQkJIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBjZGZfc3RhdHVzKSk7CisJLyogUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrICovCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBzZW5kIERlbCBUUyAoJVgpISIpLAorCQkJY2RmX3N0YXR1cyk7CisKK30gLyogRW5kIGxpbV9zZW5kX2RlbHRzX3JlcV9hY3Rpb25fZnJhbWUuICovCisKKy8qKgorICogbGltX3NlbmRfYXNzb2NfcmVxX21nbXRfZnJhbWUoKSAtIFNlbmQgYXNzb2NpYXRpb24gcmVxdWVzdAorICogQG1hY19jdHg6IEhhbmRsZSB0byBNQUMgY29udGV4dAorICogQG1sbV9hc3NvY19yZXE6IEFzc29jaWF0aW9uIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIEBwZV9zZXNzaW9uOiBQRSBzZXNzaW9uIGluZm9ybWF0aW9uCisgKgorICogQnVpbGRzIGFuZCB0cmFuc21pdHMgYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZSB0byBBUC4KKyAqCisgKiBSZXR1cm46IFZvaWQKKyAqLworCit2b2lkCitsaW1fc2VuZF9hc3NvY19yZXFfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJICAgICAgdExpbU1sbUFzc29jUmVxICptbG1fYXNzb2NfcmVxLAorCQkJICAgICAgdHBQRVNlc3Npb24gcGVfc2Vzc2lvbikKK3sKKwl0RG90MTFmQXNzb2NSZXF1ZXN0ICpmcm07CisJdWludDE2X3QgY2FwczsKKwl1aW50OF90ICpmcmFtZTsKKwl0U2lyUmV0U3RhdHVzIHNpcl9zdGF0dXM7CisJdExpbU1sbUFzc29jQ25mIGFzc29jX2NuZjsKKwl1aW50MzJfdCBieXRlcywgcGF5bG9hZCwgc3RhdHVzOworCXVpbnQ4X3QgcW9zX2VuYWJsZWQsIHdtZV9lbmFibGVkLCB3c21fZW5hYmxlZDsKKwl2b2lkICpwYWNrZXQ7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXVpbnQxNl90IGFkZF9pZV9sZW47CisJdWludDhfdCAqYWRkX2llOworCXVpbnQ4X3QgKndwc19pZSA9IE5VTEw7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJdWludDhfdCBwb3dlcl9jYXBzID0gZmFsc2U7CisjZW5kaWYKKwl1aW50OF90IHR4X2ZsYWcgPSAwOworCXVpbnQ4X3Qgc21lX3Nlc3Npb25pZCA9IDA7CisJYm9vbCB2aHRfZW5hYmxlZCA9IGZhbHNlOworCXREb3QxMWZJRUV4dENhcCBleHRyX2V4dF9jYXA7CisJYm9vbCBleHRyX2V4dF9mbGFnID0gdHJ1ZTsKKwl0cFNpck1hY01nbXRIZHIgbWFjX2hkcjsKKworCWlmIChOVUxMID09IHBlX3Nlc3Npb24pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgicGVfc2Vzc2lvbiBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJc21lX3Nlc3Npb25pZCA9IHBlX3Nlc3Npb24tPnNtZVNlc3Npb25JZDsKKworCS8qIGNoZWNrIHRoaXMgZWFybHkgdG8gYXZvaWQgdW5uY2Vzc2FyeSBvcGVyYXRpb24gKi8KKwlpZiAoTlVMTCA9PSBwZV9zZXNzaW9uLT5wTGltSm9pblJlcSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJwZV9zZXNzaW9uLT5wTGltSm9pblJlcSBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCWFkZF9pZV9sZW4gPSBwZV9zZXNzaW9uLT5wTGltSm9pblJlcS0+YWRkSUVBc3NvYy5sZW5ndGg7CisJYWRkX2llID0gcGVfc2Vzc2lvbi0+cExpbUpvaW5SZXEtPmFkZElFQXNzb2MuYWRkSUVkYXRhOworCisJZnJtID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHREb3QxMWZBc3NvY1JlcXVlc3QpKTsKKwlpZiAoTlVMTCA9PSBmcm0pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTsKKwkJcmV0dXJuOworCX0KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIGZybSwgc2l6ZW9mKHREb3QxMWZBc3NvY1JlcXVlc3QpLCAwKTsKKworCWlmIChhZGRfaWVfbGVuKSB7CisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZleHRyX2V4dF9jYXAsIHNpemVvZih0RG90MTFmSUVFeHRDYXApLAorCQkJICAgIDApOworCQlzaXJfc3RhdHVzID0gbGltX3N0cmlwX2V4dGNhcF91cGRhdGVfc3RydWN0KG1hY19jdHgsCisJCQkJCWFkZF9pZSwgJmFkZF9pZV9sZW4sICZleHRyX2V4dF9jYXApOworCQlpZiAoZVNJUl9TVUNDRVNTICE9IHNpcl9zdGF0dXMpIHsKKwkJCWV4dHJfZXh0X2ZsYWcgPSBmYWxzZTsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCSAgICBGTCgiVW5hYmxlIHRvIFN0cmlwb2ZmIEV4dENhcCBJRSBmcm9tIEFzc29jIFJlcSIpKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBzX2V4dF9jYXAgKnBfZXh0X2NhcCA9IChzdHJ1Y3Qgc19leHRfY2FwICopCisJCQkJCQkJZXh0cl9leHRfY2FwLmJ5dGVzOworCisJCQlpZiAocF9leHRfY2FwLT5pbnRlcndvcmtpbmdfc2VydmljZSkKKwkJCQlwX2V4dF9jYXAtPnFvc19tYXAgPSAxOworCQkJZWxzZSB7CisJCQkvKgorCQkJICogTm8gbmVlZCB0byBtZXJnZSB0aGUgRVhUIENhcCBmcm9tIFN1cHBsaWNhbnQKKwkJCSAqIGlmIGludGVyd29ya2luZ1NlcnZpY2UgaXMgbm90IHNldCwgYXMgY3VycmVudGx5CisJCQkgKiBkcml2ZXIgaXMgb25seSBpbnRlcmVzdGVkIGluIGludGVyd29ya2luZ1NlcnZpY2UKKwkJCSAqIGNhcGFiaWxpdHkgZnJvbSBzdXBwbGljYW50LiBpZiBpbiBmdXR1cmUgYW55IG90aGVyCisJCQkgKiBFWFQgQ2FwIGluZm8gaXMgcmVxdWlyZWQgZnJvbSBzdXBwbGljYW50CisJCQkgKiBpdCBuZWVkcyB0byBiZSBoYW5kbGVkIGhlcmUuCisJCQkgKi8KKwkJCQlleHRyX2V4dF9mbGFnID0gZmFsc2U7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJObyBhZGRpdGlvbmFsIElFIGZvciBBc3NvYyBSZXEiKSk7CisJCWV4dHJfZXh0X2ZsYWcgPSBmYWxzZTsKKwl9CisKKwljYXBzID0gbWxtX2Fzc29jX3JlcS0+Y2FwYWJpbGl0eUluZm87CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKwkvKgorCSAqIEFjY29yZGluZyB0byBXQVBJIHN0YW5kYXJkOgorCSAqIDcuMy4xLjQgQ2FwYWJpbGl0eSBJbmZvcm1hdGlvbiBmaWVsZAorCSAqIEluIFdBUEksIG5vbi1BUCBTVEFzIHdpdGhpbiBhbiBFU1Mgc2V0IHRoZSBQcml2YWN5IHN1YmZpZWxkIHRvIDAKKwkgKiBpbiB0cmFuc21pdHRlZCBBc3NvY2lhdGlvbiBvciBSZWFzc29jaWF0aW9uIG1hbmFnZW1lbnQgZnJhbWVzLgorCSAqIEFQcyBpZ25vcmUgdGhlIFByaXZhY3kgc3ViZmllbGQgd2l0aGluIHJlY2VpdmVkIEFzc29jaWF0aW9uIGFuZAorCSAqIFJlYXNzb2NpYXRpb24gbWFuYWdlbWVudCBmcmFtZXMuCisJICovCisJaWYgKHBlX3Nlc3Npb24tPmVuY3J5cHRUeXBlID09IGVTSVJfRURfV1BJKQorCQkoKHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqKSAmY2FwcyktPnByaXZhY3kgPSAwOworI2VuZGlmCisJc3dhcF9iaXRfZmllbGQxNihjYXBzLCAodWludDE2X3QgKikgJmZybS0+Q2FwYWJpbGl0aWVzKTsKKworCWZybS0+TGlzdGVuSW50ZXJ2YWwuaW50ZXJ2YWwgPSBtbG1fYXNzb2NfcmVxLT5saXN0ZW5JbnRlcnZhbDsKKwlwb3B1bGF0ZV9kb3QxMWZfc3NpZDIobWFjX2N0eCwgJmZybS0+U1NJRCk7CisJcG9wdWxhdGVfZG90MTFmX3N1cHBfcmF0ZXMobWFjX2N0eCwgUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLAorCQkmZnJtLT5TdXBwUmF0ZXMsIHBlX3Nlc3Npb24pOworCisJcW9zX2VuYWJsZWQgPSAocGVfc2Vzc2lvbi0+bGltUW9zRW5hYmxlZCkgJiYKKwkJICAgICAgU0lSX01BQ19HRVRfUU9TKHBlX3Nlc3Npb24tPmxpbUN1cnJlbnRCc3NDYXBzKTsKKworCXdtZV9lbmFibGVkID0gKHBlX3Nlc3Npb24tPmxpbVdtZUVuYWJsZWQpICYmCisJCSAgICAgIExJTV9CU1NfQ0FQU19HRVQoV01FLCBwZV9zZXNzaW9uLT5saW1DdXJyZW50QnNzUW9zQ2Fwcyk7CisKKwkvKiBXZSBwcmVmZXIgLjExZSBhc29jaWF0aW9uczogKi8KKwlpZiAocW9zX2VuYWJsZWQpCisJCXdtZV9lbmFibGVkID0gZmFsc2U7CisKKwl3c21fZW5hYmxlZCA9IChwZV9zZXNzaW9uLT5saW1Xc21FbmFibGVkKSAmJiB3bWVfZW5hYmxlZCAmJgorCQkgICAgICBMSU1fQlNTX0NBUFNfR0VUKFdTTSwgcGVfc2Vzc2lvbi0+bGltQ3VycmVudEJzc1Fvc0NhcHMpOworCisJaWYgKHBlX3Nlc3Npb24tPmxpbTExaEVuYWJsZSAmJgorCSAgICBwZV9zZXNzaW9uLT5wTGltSm9pblJlcS0+c3BlY3RydW1NZ3RJbmRpY2F0b3IgPT0gZVNJUl9UUlVFKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJCXBvd2VyX2NhcHMgPSB0cnVlOworCisJCXBvcHVsYXRlX2RvdDExZl9wb3dlcl9jYXBzKG1hY19jdHgsICZmcm0tPlBvd2VyQ2FwcywKKwkJCUxJTV9BU1NPQywgcGVfc2Vzc2lvbik7CisjZW5kaWYKKwkJcG9wdWxhdGVfZG90MTFmX3N1cHBfY2hhbm5lbHMobWFjX2N0eCwgJmZybS0+U3VwcENoYW5uZWxzLAorCQkJTElNX0FTU09DLCBwZV9zZXNzaW9uKTsKKworCX0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlpZiAobWFjX2N0eC0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGUgJiYKKwkgICAgU0lSX01BQ19HRVRfUlJNKHBlX3Nlc3Npb24tPmxpbUN1cnJlbnRCc3NDYXBzKSkgeworCQlpZiAocG93ZXJfY2FwcyA9PSBmYWxzZSkgeworCQkJcG93ZXJfY2FwcyA9IHRydWU7CisJCQlwb3B1bGF0ZV9kb3QxMWZfcG93ZXJfY2FwcyhtYWNfY3R4LCAmZnJtLT5Qb3dlckNhcHMsCisJCQkJTElNX0FTU09DLCBwZV9zZXNzaW9uKTsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKHFvc19lbmFibGVkKQorCQlwb3B1bGF0ZV9kb3QxMWZfcW9zX2NhcHNfc3RhdGlvbihtYWNfY3R4LCAmZnJtLT5RT1NDYXBzU3RhdGlvbik7CisKKwlwb3B1bGF0ZV9kb3QxMWZfZXh0X3N1cHBfcmF0ZXMobWFjX2N0eCwKKwkJUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLCAmZnJtLT5FeHRTdXBwUmF0ZXMsCisJCXBlX3Nlc3Npb24pOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJaWYgKG1hY19jdHgtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlICYmCisJICAgIFNJUl9NQUNfR0VUX1JSTShwZV9zZXNzaW9uLT5saW1DdXJyZW50QnNzQ2FwcykpCisJCXBvcHVsYXRlX2RvdDExZl9ycm1faWUobWFjX2N0eCwgJmZybS0+UlJNRW5hYmxlZENhcCwKKwkJCXBlX3Nlc3Npb24pOworI2VuZGlmCisJLyoKKwkgKiBUaGUgam9pbiByZXF1ZXN0ICpzaG91bGQqIGNvbnRhaW4gemVybyBvciBvbmUgb2YgdGhlIFdQQSBhbmQgUlNOCisJICogSUVzLiAgVGhlIHBheWxvYWQgc2VuZCBhbG9uZyB3aXRoIHRoZSByZXF1ZXN0IGlzIGEKKwkgKiAndFNpclNtZUpvaW5SZXEnOyB0aGUgSUUgcG9ydGlvbiBpcyBoZWxkIGluc2lkZSBhICd0U2lyUlNOaWUnOgorCSAqICAgICB0eXBlZGVmIHN0cnVjdCBzU2lyUlNOaWUKKwkgKiAgICAgeworCSAqICAgICAgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOworCSAqICAgICAgICAgdWludDhfdCAgICAgICAgcnNuSUVkYXRhW1NJUl9NQUNfTUFYX0lFX0xFTkdUSCsyXTsKKwkgKiAgICAgfSB0U2lyUlNOaWUsICp0cFNpclJTTmllOworCSAqIFNvLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgdHdvIGNhbGxzIGhhcm1sZXNzbHksCisJICogc2luY2UgdGhleSBkbyBub3RoaW5nIGlmIHRoZXkgZG9uJ3QgZmluZCB0aGUgZ2l2ZW4gSUUgaW4gdGhlCisJICogYnl0ZXN0cmVhbSB3aXRoIHdoaWNoIHRoZXkncmUgcHJvdmlkZWQuCisJICogVGhlIG5ldCBlZmZlY3Qgb2YgdGhpcyB3aWxsIGJlIHRvIGZhaXRoZnVsbHkgdHJhbnNtaXQgd2hhdGV2ZXIKKwkgKiBzZWN1cml0eSBJRSBpcyBpbiB0aGUgam9pbiByZXF1ZXN0LgorCSAqIEhvd2V2ZXIsIGlmIHdlJ3JlIGFzc29jaWF0aW5nIGZvciB0aGUgcHVycG9zZSBvZiBXUFMKKwkgKiBlbnJvbGxtZW50LCBhbmQgd2UndmUgYmVlbiBjb25maWd1cmVkIHRvIGluZGljYXRlIHRoYXQgYnkKKwkgKiBlbGlkaW5nIHRoZSBXUEEgb3IgUlNOIElFLCB3ZSBqdXN0IHNraXAgdGhpczoKKwkgKi8KKwlpZiAoYWRkX2llX2xlbiAmJiBhZGRfaWUpCisJCXdwc19pZSA9IGxpbUdldFdzY0lFUHRyKG1hY19jdHgsIGFkZF9pZSwgYWRkX2llX2xlbik7CisKKwlpZiAoTlVMTCA9PSB3cHNfaWUpIHsKKwkJcG9wdWxhdGVfZG90MTFmX3Jzbl9vcGFxdWUobWFjX2N0eCwKKwkJCSYocGVfc2Vzc2lvbi0+cExpbUpvaW5SZXEtPnJzbklFKSwKKwkJCSZmcm0tPlJTTk9wYXF1ZSk7CisJCXBvcHVsYXRlX2RvdDExZl93cGFfb3BhcXVlKG1hY19jdHgsCisJCQkmKHBlX3Nlc3Npb24tPnBMaW1Kb2luUmVxLT5yc25JRSksCisJCQkmZnJtLT5XUEFPcGFxdWUpOworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX1dBUEkpCisJCXBvcHVsYXRlX2RvdDExZl93YXBpX29wYXF1ZShtYWNfY3R4LAorCQkJJihwZV9zZXNzaW9uLT5wTGltSm9pblJlcS0+cnNuSUUpLAorCQkJJmZybS0+V0FQSU9wYXF1ZSk7CisjZW5kaWYgLyogZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkgKi8KKwl9CisJLyogaW5jbHVkZSBXTUUgRURDQSBJRSBhcyB3ZWxsICovCisJaWYgKHdtZV9lbmFibGVkKSB7CisJCXBvcHVsYXRlX2RvdDExZl93bW1faW5mb19zdGF0aW9uX3Blcl9zZXNzaW9uKG1hY19jdHgsCisJCQlwZV9zZXNzaW9uLCAmZnJtLT5XTU1JbmZvU3RhdGlvbik7CisKKwkJaWYgKHdzbV9lbmFibGVkKQorCQkJcG9wdWxhdGVfZG90MTFmX3dtbV9jYXBzKCZmcm0tPldNTUNhcHMpOworCX0KKworCS8qCisJICogUG9wdWxhdGUgSFQgSUVzLCB3aGVuIG9wZXJhdGluZyBpbiAxMW4gYW5kCisJICogd2hlbiBBUCBpcyBhbHNvIG9wZXJhdGluZyBpbiAxMW4gbW9kZQorCSAqLworCWlmIChwZV9zZXNzaW9uLT5odENhcGFiaWxpdHkgJiYKKwkgICAgbWFjX2N0eC0+bGltLmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJQb3B1bGF0ZSBIVCBDYXBzIGluIEFzc29jIFJlcXVlc3QiKSk7CisJCXBvcHVsYXRlX2RvdDExZl9odF9jYXBzKG1hY19jdHgsIHBlX3Nlc3Npb24sICZmcm0tPkhUQ2Fwcyk7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKHBlX3Nlc3Npb24tPnZodENhcGFiaWxpdHkgJiYKKwkgICAgcGVfc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJQb3B1bGF0ZSBWSFQgSUVzIGluIEFzc29jIFJlcXVlc3QiKSk7CisJCXBvcHVsYXRlX2RvdDExZl92aHRfY2FwcyhtYWNfY3R4LCBwZV9zZXNzaW9uLCAmZnJtLT5WSFRDYXBzKTsKKwkJdmh0X2VuYWJsZWQgPSB0cnVlOworCX0KKwlpZiAoIXZodF9lbmFibGVkICYmCisJCQlwZV9zZXNzaW9uLT5pc192ZW5kb3Jfc3BlY2lmaWNfdmh0Y2FwcykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiUG9wdWxhdGUgVmVuZG9yIFZIVCBJRXMgaW4gQXNzb2MgUmVxdWVzdCIpKTsKKwkJZnJtLT52ZW5kb3IyX2llLnByZXNlbnQgPSAxOworCQlmcm0tPnZlbmRvcjJfaWUudHlwZSA9CisJCQlwZV9zZXNzaW9uLT52ZW5kb3Jfc3BlY2lmaWNfdmh0X2llX3R5cGU7CisJCWZybS0+dmVuZG9yMl9pZS5zdWJfdHlwZSA9CisJCQlwZV9zZXNzaW9uLT52ZW5kb3Jfc3BlY2lmaWNfdmh0X2llX3N1Yl90eXBlOworCisJCWZybS0+dmVuZG9yMl9pZS5WSFRDYXBzLnByZXNlbnQgPSAxOworCQlwb3B1bGF0ZV9kb3QxMWZfdmh0X2NhcHMobWFjX2N0eCwgcGVfc2Vzc2lvbiwKKwkJCQkmZnJtLT52ZW5kb3IyX2llLlZIVENhcHMpOworCQl2aHRfZW5hYmxlZCA9IHRydWU7CisJfQorCisjZW5kaWYKKworCXBvcHVsYXRlX2RvdDExZl9leHRfY2FwKG1hY19jdHgsIHZodF9lbmFibGVkLCAmZnJtLT5FeHRDYXAsIHBlX3Nlc3Npb24pOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWlmIChwZV9zZXNzaW9uLT5wTGltSm9pblJlcS0+aXMxMVJjb25uZWN0aW9uKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQl0U2lyQnNzRGVzY3JpcHRpb24gKmJzc2Rlc2NyOworCisJCWJzc2Rlc2NyID0gJnBlX3Nlc3Npb24tPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbjsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgibWRpZSA9ICUwMnggJTAyeCAlMDJ4IiksCisJCQkodW5zaWduZWQgaW50KSBic3NkZXNjci0+bWRpZVswXSwKKwkJCSh1bnNpZ25lZCBpbnQpIGJzc2Rlc2NyLT5tZGllWzFdLAorCQkJKHVuc2lnbmVkIGludCkgYnNzZGVzY3ItPm1kaWVbMl0pOworI2VuZGlmCisJCXBvcHVsYXRlX21kaWUobWFjX2N0eCwgJmZybS0+TW9iaWxpdHlEb21haW4sCisJCQlwZV9zZXNzaW9uLT5wTGltSm9pblJlcS0+YnNzRGVzY3JpcHRpb24ubWRpZSk7CisJfSBlbHNlIHsKKwkJLyogTm8gMTFyIElFcyBkb250IHNlbmQgYW55IE1ESUUgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiTURJRSBub3QgcHJlc2VudCIpKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkvKgorCSAqIEVTRSBWZXJzaW9uIElFIHdpbGwgYmUgaW5jbHVkZWQgaW4gYXNzb2NpYXRpb24gcmVxdWVzdAorCSAqIHdoZW4gRVNFIGlzIGVuYWJsZWQgb24gRFVUIHRocm91Z2ggaW5pIGFuZCBpdCBpcyBhbHNvCisJICogYWR2ZXJ0aXNlZCBieSB0aGUgcGVlciBBUCB0byB3aGljaCB3ZSBhcmUgdHJ5aW5nIHRvCisJICogYXNzb2NpYXRlIHRvLgorCSAqLworCWlmIChwZV9zZXNzaW9uLT5pc19lc2VfdmVyc2lvbl9pZV9wcmVzZW50ICYmCisJCW1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uaXNFc2VJbmlGZWF0dXJlRW5hYmxlZCkKKwkJcG9wdWxhdGVfZG90MTFmX2VzZV92ZXJzaW9uKCZmcm0tPkVTRVZlcnNpb24pOworCS8qIEZvciBFU0UgQXNzb2NpYXRpb25zIGZpbGwgdGhlIEVTRSBJRXMgKi8KKwlpZiAocGVfc2Vzc2lvbi0+aXNFU0Vjb25uZWN0aW9uICYmCisJICAgIHBlX3Nlc3Npb24tPnBMaW1Kb2luUmVxLT5pc0VTRUZlYXR1cmVJbmlFbmFibGVkKSB7CisjaWZuZGVmIEZFQVRVUkVfRElTQUJMRV9STQorCQlwb3B1bGF0ZV9kb3QxMWZfZXNlX3JhZF9tZ210X2NhcCgmZnJtLT5FU0VSYWRNZ210Q2FwKTsKKyNlbmRpZgorCX0KKyNlbmRpZgorCisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfYXNzb2NfcmVxdWVzdF9zaXplKG1hY19jdHgsIGZybSwgJnBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJRkwoIkFzc29jaWF0aW9uIFJlcXVlc3QgcGFja2V0IHNpemUgZmFpbHVyZSgweCUwOHgpLiIpLAorCQkJc3RhdHVzKTsKKwkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQlwYXlsb2FkID0gc2l6ZW9mKHREb3QxMWZBc3NvY1JlcXVlc3QpOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJBc3NvY2lhdGlvbiByZXF1ZXN0IHBhY2tldCBzaXplIHdhcm5pbmcgKDB4JTA4eCkuIiksCisJCQlzdGF0dXMpOworCX0KKworCWJ5dGVzID0gcGF5bG9hZCArIHNpemVvZih0U2lyTWFjTWdtdEhkcikgKyBhZGRfaWVfbGVuOworCisJY2RmX3N0YXR1cyA9IGNkc19wYWNrZXRfYWxsb2MoKHVpbnQxNl90KSBieXRlcywgKHZvaWQgKiopJmZyYW1lLAorCQkJCSh2b2lkICoqKSZwYWNrZXQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcy4iKSwKKwkJCWJ5dGVzKTsKKworCQlwZV9zZXNzaW9uLT5saW1NbG1TdGF0ZSA9IHBlX3Nlc3Npb24tPmxpbVByZXZNbG1TdGF0ZTsKKwkJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX01MTV9TVEFURSwKKwkJCQkgcGVfc2Vzc2lvbi0+cGVTZXNzaW9uSWQsCisJCQkJIHBlX3Nlc3Npb24tPmxpbU1sbVN0YXRlKSk7CisKKwkJLyogVXBkYXRlIFBFIHNlc3Npb24gaWQgKi8KKwkJYXNzb2NfY25mLnNlc3Npb25JZCA9IHBlX3Nlc3Npb24tPnBlU2Vzc2lvbklkOworCisJCWFzc29jX2NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCisJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXBhY2tldCk7CisKKwkJbGltX3Bvc3Rfc21lX21lc3NhZ2UobWFjX2N0eCwgTElNX01MTV9BU1NPQ19DTkYsCisJCQkodWludDMyX3QgKikgJmFzc29jX2NuZik7CisKKwkJY2RmX21lbV9mcmVlKGZybSk7CisJCXJldHVybjsKKwl9CisJLyogUGFyYW5vaWE6ICovCisJY2RmX21lbV9zZXQoZnJhbWUsIGJ5dGVzLCAwKTsKKworCS8qIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjogKi8KKwlsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcihtYWNfY3R4LCBmcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorCQlTSVJfTUFDX01HTVRfQVNTT0NfUkVRLCBwZV9zZXNzaW9uLT5ic3NJZCwKKwkJcGVfc2Vzc2lvbi0+c2VsZk1hY0FkZHIpOworCS8qIG1lcmdlIHRoZSBFeHRDYXAgc3RydWN0ICovCisJaWYgKGV4dHJfZXh0X2ZsYWcpCisJCWxpbV9tZXJnZV9leHRjYXBfc3RydWN0KCZmcm0tPkV4dENhcCwgJmV4dHJfZXh0X2NhcCk7CisJLyogVGhhdCBkb25lLCBwYWNrIHRoZSBBc3NvYyBSZXF1ZXN0OiAqLworCXN0YXR1cyA9IGRvdDExZl9wYWNrX2Fzc29jX3JlcXVlc3QobWFjX2N0eCwgZnJtLAorCQkJZnJhbWUgKyBzaXplb2YodFNpck1hY01nbXRIZHIpLCBwYXlsb2FkLCAmcGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiQXNzb2MgcmVxdWVzdCBwYWNrIGZhaWx1cmUgKDB4JTA4eCkiKSwgc3RhdHVzKTsKKwkJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopcGFja2V0KTsKKwkJY2RmX21lbV9mcmVlKGZybSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiQXNzb2MgcmVxdWVzdCBwYWNrIHdhcm5pbmcgKDB4JTA4eCkiKSwgc3RhdHVzKTsKKwl9CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCIqKiogU2VuZGluZyBBc3NvY2lhdGlvbiBSZXF1ZXN0IGxlbmd0aCAlZCB0byAiKSwgYnl0ZXMpOworCWlmIChwZV9zZXNzaW9uLT5hc3NvY1JlcSAhPSBOVUxMKSB7CisJCWNkZl9tZW1fZnJlZShwZV9zZXNzaW9uLT5hc3NvY1JlcSk7CisJCXBlX3Nlc3Npb24tPmFzc29jUmVxID0gTlVMTDsKKwl9CisKKwlpZiAoYWRkX2llX2xlbikgeworCQljZGZfbWVtX2NvcHkoZnJhbWUgKyBzaXplb2YodFNpck1hY01nbXRIZHIpICsgcGF5bG9hZCwKKwkJCSAgICAgYWRkX2llLCBhZGRfaWVfbGVuKTsKKwkJcGF5bG9hZCArPSBhZGRfaWVfbGVuOworCX0KKworCXBlX3Nlc3Npb24tPmFzc29jUmVxID0gY2RmX21lbV9tYWxsb2MocGF5bG9hZCk7CisJaWYgKE5VTEwgPT0gcGVfc2Vzc2lvbi0+YXNzb2NSZXEpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdG9yZSB0aGUgQXNzb2MgcmVxdWVzdC4gVGhpcyBpcyBzZW50IHRvIGNzci9oZGQgaW4KKwkJICogam9pbiBjbmYgcmVzcG9uc2UuCisJCSAqLworCQljZGZfbWVtX2NvcHkocGVfc2Vzc2lvbi0+YXNzb2NSZXEsCisJCQkgICAgIGZyYW1lICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwgcGF5bG9hZCk7CisJCXBlX3Nlc3Npb24tPmFzc29jUmVxTGVuID0gcGF5bG9hZDsKKwl9CisKKwlpZiAoKFNJUl9CQU5EXzVfR0haID09IGxpbV9nZXRfcmZfYmFuZChwZV9zZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwpKQorCSAgICB8fCAocGVfc2Vzc2lvbi0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpCisJICAgIHx8IChwZV9zZXNzaW9uLT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKQorCSAgICApCisJCXR4X2ZsYWcgfD0gSEFMX1VTRV9CRF9SQVRFMl9GT1JfTUFOQUdFTUVOVF9GUkFNRTsKKworCWlmIChwZV9zZXNzaW9uLT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9DTElFTlRfTU9ERSkKKwkJdHhfZmxhZyB8PSBIQUxfVVNFX1BFRVJfU1RBX1JFUVVFU1RFRF9NQVNLOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChtYWNfY3R4LCBXTEFOX1BFX0RJQUdfQVNTT0NfU1RBUlRfRVZFTlQsCisJCQkgICAgICBwZV9zZXNzaW9uLCBlU0lSX1NVQ0NFU1MsIGVTSVJfU1VDQ0VTUyk7CisjZW5kaWYKKwltYWNfaGRyID0gKHRwU2lyTWFjTWdtdEhkcikgZnJhbWU7CisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgcGVfc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIG1hY19oZHItPmZjLnN1YlR5cGUpKTsKKwljZGZfc3RhdHVzID0KKwkJd21hX3R4X2ZyYW1lKG1hY19jdHgsIHBhY2tldCwKKwkJCSAgICh1aW50MTZfdCkgKHNpemVvZih0U2lyTWFjTWdtdEhkcikgKyBwYXlsb2FkKSwKKwkJCSAgIFRYUlhfRlJNXzgwMl8xMV9NR01ULCBBTklfVFhESVJfVE9EUywgNywKKwkJCSAgIGxpbV90eF9jb21wbGV0ZSwgZnJhbWUsIHR4X2ZsYWcsIHNtZV9zZXNzaW9uaWQsIDApOworCU1UUkFDRShjZGZfdHJhY2UKKwkJICAgICAgIChDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX0NPTVBMRVRFLAorCQkgICAgICAgcGVfc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIGNkZl9zdGF0dXMpKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHNlbmQgQXNzb2NpYXRpb24gUmVxdWVzdCAoJVgpISIpLAorCQkJY2RmX3N0YXR1cyk7CisJCS8qIFBrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjayAqLworCQljZGZfbWVtX2ZyZWUoZnJtKTsKKwkJcmV0dXJuOworCX0KKwkvKiBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIG1sbV9hc3NvY19yZXEgKi8KKwljZGZfbWVtX2ZyZWUobWxtX2Fzc29jX3JlcSk7CisJbWxtX2Fzc29jX3JlcSA9IE5VTEw7CisJY2RmX21lbV9mcmVlKGZybSk7CisJcmV0dXJuOworfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiB8fCBkZWZpbmVkIEZFQVRVUkVfV0xBTl9FU0UgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorLyoqCisgKiBsaW1fc2VuZF9yZWFzc29jX3JlcV93aXRoX2Z0X2llc19tZ210X2ZyYW1lKCkgLSBTZW5kIFJlYXNzb2MgUmVxIHdpdGggRlRJRXMuCisgKgorICogQG1hY19jdHg6IEhhbmRsZSB0byBtYWMgY29udGV4dAorICogQG1sbV9yZWFzc29jX3JlcTogT3JpZ2luYWwgcmVhc3NvYyByZXF1ZXN0CisgKiBAcGVfc2Vzc2lvbjogUEUgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICoKKyAqIEl0IGJ1aWxkcyBhIHJlYXNzb2MgcmVxdWVzdCB3aXRoIEZUIElFcyBhbmQgc2VuZHMgaXQgdG8gQVAgdGhyb3VnaCBXTUEuCisgKiBUaGVuIGl0IGNyZWF0ZXMgYXNzb2MgcmVxdWVzdCBhbmQgc3RvcmVzIGl0IGZvciBzZW5kaW5nIGFmdGVyIGpvaW4KKyAqIGNvbmZpcm1hdGlvbi4KKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworCit2b2lkCitsaW1fc2VuZF9yZWFzc29jX3JlcV93aXRoX2Z0X2llc19tZ210X2ZyYW1lKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdExpbU1sbVJlYXNzb2NSZXEgKm1sbV9yZWFzc29jX3JlcSwKKwl0cFBFU2Vzc2lvbiBwZV9zZXNzaW9uKQoreworCXN0YXRpYyB0RG90MTFmUmVBc3NvY1JlcXVlc3QgZnJtOworCXVpbnQxNl90IGNhcHM7CisJdWludDhfdCAqZnJhbWU7CisJdWludDMyX3QgYnl0ZXMsIHBheWxvYWQsIHN0YXR1czsKKwl1aW50OF90IHFvc19lbmFibGVkLCB3bWVfZW5hYmxlZCwgd3NtX2VuYWJsZWQ7CisJdm9pZCAqcGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwl1aW50OF90IHBvd2VyX2NhcHNfcG9wdWxhdGVkID0gZmFsc2U7CisjZW5kaWYKKwl1aW50MTZfdCBmdF9pZXNfbGVuZ3RoID0gMDsKKwl1aW50OF90ICpib2R5OworCXVpbnQxNl90IGFkZF9pZV9sZW47CisJdWludDhfdCAqYWRkX2llOworI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0VTRSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJdWludDhfdCAqd3BzX2llID0gTlVMTDsKKyNlbmRpZgorCXVpbnQ4X3QgdHhfZmxhZyA9IDA7CisJdWludDhfdCBzbWVfc2Vzc2lvbmlkID0gMDsKKwlib29sIHZodF9lbmFibGVkID0gZmFsc2U7CisJdHBTaXJNYWNNZ210SGRyIG1hY19oZHI7CisJdGZ0U01FQ29udGV4dCAqZnRfc21lX2NvbnRleHQ7CisKKwlpZiAoTlVMTCA9PSBwZV9zZXNzaW9uKQorCQlyZXR1cm47CisKKwlzbWVfc2Vzc2lvbmlkID0gcGVfc2Vzc2lvbi0+c21lU2Vzc2lvbklkOworCisJLyogY2hlY2sgdGhpcyBlYXJseSB0byBhdm9pZCB1bm5jZXNzYXJ5IG9wZXJhdGlvbiAqLworCWlmIChOVUxMID09IHBlX3Nlc3Npb24tPnBMaW1SZUFzc29jUmVxKQorCQlyZXR1cm47CisKKwlhZGRfaWVfbGVuID0gcGVfc2Vzc2lvbi0+cExpbVJlQXNzb2NSZXEtPmFkZElFQXNzb2MubGVuZ3RoOworCWFkZF9pZSA9IHBlX3Nlc3Npb24tPnBMaW1SZUFzc29jUmVxLT5hZGRJRUFzc29jLmFkZElFZGF0YTsKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJjYWxsZWQgaW4gc3RhdGUgKCVkKS4iKSwgcGVfc2Vzc2lvbi0+bGltTWxtU3RhdGUpOworCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJmZybSwgc2l6ZW9mKGZybSksIDApOworCisJY2FwcyA9IG1sbV9yZWFzc29jX3JlcS0+Y2FwYWJpbGl0eUluZm87CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKwkvKgorCSAqIEFjY29yZGluZyB0byBXQVBJIHN0YW5kYXJkOgorCSAqIDcuMy4xLjQgQ2FwYWJpbGl0eSBJbmZvcm1hdGlvbiBmaWVsZAorCSAqIEluIFdBUEksIG5vbi1BUCBTVEFzIHdpdGhpbiBhbiBFU1Mgc2V0IHRoZSBQcml2YWN5IHN1YmZpZWxkCisJICogdG8gMCBpbiB0cmFuc21pdHRlZCBBc3NvY2lhdGlvbiBvciBSZWFzc29jaWF0aW9uIG1hbmFnZW1lbnQKKwkgKiBmcmFtZXMuIEFQcyBpZ25vcmUgdGhlIFByaXZhY3kgc3ViZmllbGQgd2l0aGluIHJlY2VpdmVkCisJICogQXNzb2NpYXRpb24gYW5kIFJlYXNzb2NpYXRpb24gbWFuYWdlbWVudCBmcmFtZXMuCisJICovCisJaWYgKHBlX3Nlc3Npb24tPmVuY3J5cHRUeXBlID09IGVTSVJfRURfV1BJKQorCQkoKHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqKSAmY2FwcyktPnByaXZhY3kgPSAwOworI2VuZGlmCisJc3dhcF9iaXRfZmllbGQxNihjYXBzLCAodWludDE2X3QgKikgJmZybS5DYXBhYmlsaXRpZXMpOworCisJZnJtLkxpc3RlbkludGVydmFsLmludGVydmFsID0gbWxtX3JlYXNzb2NfcmVxLT5saXN0ZW5JbnRlcnZhbDsKKworCS8qCisJICogR2V0IHRoZSBvbGQgYnNzaWQgb2YgdGhlIG9sZGVyIEFQLgorCSAqIFRoZSBwcmV2aW91cyBhcCBic3NpZCBpcyBzdG9yZWQgaW4gdGhlIEZUIFNlc3Npb24KKwkgKiB3aGlsZSBjcmVhdGluZyB0aGUgUEUgRlQgU2Vzc2lvbiBmb3IgcmVhc3NvY2lhdGlvbi4KKwkgKi8KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKilmcm0uQ3VycmVudEFQQWRkcmVzcy5tYWMsCisJCQlwZV9zZXNzaW9uLT5wcmV2X2FwX2Jzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCXBvcHVsYXRlX2RvdDExZl9zc2lkMihtYWNfY3R4LCAmZnJtLlNTSUQpOworCXBvcHVsYXRlX2RvdDExZl9zdXBwX3JhdGVzKG1hY19jdHgsIFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwKKwkJJmZybS5TdXBwUmF0ZXMsIHBlX3Nlc3Npb24pOworCisJcW9zX2VuYWJsZWQgPSAocGVfc2Vzc2lvbi0+bGltUW9zRW5hYmxlZCkgJiYKKwkJICAgICAgU0lSX01BQ19HRVRfUU9TKHBlX3Nlc3Npb24tPmxpbVJlYXNzb2NCc3NDYXBzKTsKKworCXdtZV9lbmFibGVkID0gKHBlX3Nlc3Npb24tPmxpbVdtZUVuYWJsZWQpICYmCisJCSAgICAgIExJTV9CU1NfQ0FQU19HRVQoV01FLCBwZV9zZXNzaW9uLT5saW1SZWFzc29jQnNzUW9zQ2Fwcyk7CisKKwl3c21fZW5hYmxlZCA9IChwZV9zZXNzaW9uLT5saW1Xc21FbmFibGVkKSAmJiB3bWVfZW5hYmxlZCAmJgorCQkgICAgICBMSU1fQlNTX0NBUFNfR0VUKFdTTSwgcGVfc2Vzc2lvbi0+bGltUmVhc3NvY0Jzc1Fvc0NhcHMpOworCisJaWYgKHBlX3Nlc3Npb24tPmxpbTExaEVuYWJsZSAmJgorCSAgICBwZV9zZXNzaW9uLT5wTGltUmVBc3NvY1JlcS0+c3BlY3RydW1NZ3RJbmRpY2F0b3IgPT0gZVNJUl9UUlVFKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJCXBvd2VyX2NhcHNfcG9wdWxhdGVkID0gdHJ1ZTsKKworCQlwb3B1bGF0ZV9kb3QxMWZfcG93ZXJfY2FwcyhtYWNfY3R4LCAmZnJtLlBvd2VyQ2FwcywKKwkJCQkJICAgTElNX1JFQVNTT0MsIHBlX3Nlc3Npb24pOworCQlwb3B1bGF0ZV9kb3QxMWZfc3VwcF9jaGFubmVscyhtYWNfY3R4LCAmZnJtLlN1cHBDaGFubmVscywKKwkJCUxJTV9SRUFTU09DLCBwZV9zZXNzaW9uKTsKKyNlbmRpZgorCX0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlpZiAobWFjX2N0eC0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGUgJiYKKwkgICAgU0lSX01BQ19HRVRfUlJNKHBlX3Nlc3Npb24tPmxpbUN1cnJlbnRCc3NDYXBzKSkgeworCQlpZiAocG93ZXJfY2Fwc19wb3B1bGF0ZWQgPT0gZmFsc2UpIHsKKwkJCXBvd2VyX2NhcHNfcG9wdWxhdGVkID0gdHJ1ZTsKKwkJCXBvcHVsYXRlX2RvdDExZl9wb3dlcl9jYXBzKG1hY19jdHgsICZmcm0uUG93ZXJDYXBzLAorCQkJCUxJTV9SRUFTU09DLCBwZV9zZXNzaW9uKTsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKHFvc19lbmFibGVkKQorCQlwb3B1bGF0ZV9kb3QxMWZfcW9zX2NhcHNfc3RhdGlvbihtYWNfY3R4LCAmZnJtLlFPU0NhcHNTdGF0aW9uKTsKKworCXBvcHVsYXRlX2RvdDExZl9leHRfc3VwcF9yYXRlcyhtYWNfY3R4LAorCQlQT1BVTEFURV9ET1QxMUZfUkFURVNfT1BFUkFUSU9OQUwsICZmcm0uRXh0U3VwcFJhdGVzLAorCQlwZV9zZXNzaW9uKTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCWlmIChtYWNfY3R4LT5ycm0ucnJtUEVDb250ZXh0LnJybUVuYWJsZSAmJgorCSAgICBTSVJfTUFDX0dFVF9SUk0ocGVfc2Vzc2lvbi0+bGltUmVhc3NvY0Jzc0NhcHMpKSB7CisJCXBvcHVsYXRlX2RvdDExZl9ycm1faWUobWFjX2N0eCwgJmZybS5SUk1FbmFibGVkQ2FwLCBwZV9zZXNzaW9uKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogSWRlYWxseSB0aGlzIHNob3VsZCBiZSBlbmFibGVkIGZvciAxMXIgYWxzby4gQnV0IDExciBkb2VzCisJICogbm90IGZvbGxvdyB0aGUgdXN1YWwgbm9ybSBvZiB1c2luZyB0aGUgT3BhcXVlIG9iamVjdAorCSAqIGZvciByc25pZSBhbmQgZnRpZXMuIEluc3RlYWQgd2UganVzdCBhZGQgdGhlIHJzbmllIGFuZCBmdGllcworCSAqIGF0IHRoZSBlbmQgb2YgdGhlIHBhY2sgcm91dGluZSBmb3IgMTFyLgorCSAqIFRoaXMgc2hvdWxkIGlkZWFsbHkhIGJlIGZpeGVkLgorCSAqLworI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0VTRSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJLyoKKwkgKiBUaGUgam9pbiByZXF1ZXN0ICpzaG91bGQqIGNvbnRhaW4gemVybyBvciBvbmUgb2YgdGhlIFdQQSBhbmQgUlNOCisJICogSUVzLiAgVGhlIHBheWxvYWQgc2VuZCBhbG9uZyB3aXRoIHRoZSByZXF1ZXN0IGlzIGEKKwkgKiAndFNpclNtZUpvaW5SZXEnOyB0aGUgSUUgcG9ydGlvbiBpcyBoZWxkIGluc2lkZSBhICd0U2lyUlNOaWUnOgorCSAqCisJICogICAgIHR5cGVkZWYgc3RydWN0IHNTaXJSU05pZQorCSAqICAgICB7CisJICogICAgICAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7CisJICogICAgICAgICB1aW50OF90ICAgICAgICByc25JRWRhdGFbU0lSX01BQ19NQVhfSUVfTEVOR1RIKzJdOworCSAqICAgICB9IHRTaXJSU05pZSwgKnRwU2lyUlNOaWU7CisJICoKKwkgKiBTbywgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHR3byBjYWxscyBoYXJtbGVzc2x5LAorCSAqIHNpbmNlIHRoZXkgZG8gbm90aGluZyBpZiB0aGV5IGRvbid0IGZpbmQgdGhlIGdpdmVuIElFIGluIHRoZQorCSAqIGJ5dGVzdHJlYW0gd2l0aCB3aGljaCB0aGV5J3JlIHByb3ZpZGVkLgorCSAqCisJICogVGhlIG5ldCBlZmZlY3Qgb2YgdGhpcyB3aWxsIGJlIHRvIGZhaXRoZnVsbHkgdHJhbnNtaXQgd2hhdGV2ZXIKKwkgKiBzZWN1cml0eSBJRSBpcyBpbiB0aGUgam9pbiByZXF1ZXN0LgorCisJICogSG93ZXZlciwgaWYgd2UncmUgYXNzb2NpYXRpbmcgZm9yIHRoZSBwdXJwb3NlIG9mIFdQUworCSAqIGVucm9sbG1lbnQsIGFuZCB3ZSd2ZSBiZWVuIGNvbmZpZ3VyZWQgdG8gaW5kaWNhdGUgdGhhdCBieQorCSAqIGVsaWRpbmcgdGhlIFdQQSBvciBSU04gSUUsIHdlIGp1c3Qgc2tpcCB0aGlzOgorCSAqLworCWlmICghcGVfc2Vzc2lvbi0+aXMxMVJjb25uZWN0aW9uKSB7CisJCWlmIChhZGRfaWVfbGVuICYmIGFkZF9pZSkKKwkJCXdwc19pZSA9IGxpbUdldFdzY0lFUHRyKG1hY19jdHgsIGFkZF9pZSwgYWRkX2llX2xlbik7CisJCWlmIChOVUxMID09IHdwc19pZSkgeworCQkJcG9wdWxhdGVfZG90MTFmX3Jzbl9vcGFxdWUobWFjX2N0eCwKKwkJCQkmKHBlX3Nlc3Npb24tPnBMaW1SZUFzc29jUmVxLT5yc25JRSksCisJCQkJJmZybS5SU05PcGFxdWUpOworCQkJcG9wdWxhdGVfZG90MTFmX3dwYV9vcGFxdWUobWFjX2N0eCwKKwkJCQkmKHBlX3Nlc3Npb24tPnBMaW1SZUFzc29jUmVxLT5yc25JRSksCisJCQkJJmZybS5XUEFPcGFxdWUpOworCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQlpZiAocGVfc2Vzc2lvbi0+cExpbVJlQXNzb2NSZXEtPmNja21JRS5sZW5ndGgpIHsKKwkJCXBvcHVsYXRlX2RvdDExZl9lc2VfY2NrbV9vcGFxdWUobWFjX2N0eCwKKwkJCQkmKHBlX3Nlc3Npb24tPnBMaW1SZUFzc29jUmVxLT5jY2ttSUUpLAorCQkJCSZmcm0uRVNFQ2NrbU9wYXF1ZSk7CisJCX0KKyNlbmRpZgorCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJLyoKKwkgKiBFU0UgVmVyc2lvbiBJRSB3aWxsIGJlIGluY2x1ZGVkIGluIHJlLWFzc29jaWF0aW9uIHJlcXVlc3QKKwkgKiB3aGVuIEVTRSBpcyBlbmFibGVkIG9uIERVVCB0aHJvdWdoIGluaSBhbmQgaXQgaXMgYWxzbworCSAqIGFkdmVydGlzZWQgYnkgdGhlIHBlZXIgQVAgdG8gd2hpY2ggd2UgYXJlIHRyeWluZyB0bworCSAqIGFzc29jaWF0ZSB0by4KKwkgKi8KKwlpZiAocGVfc2Vzc2lvbi0+aXNfZXNlX3ZlcnNpb25faWVfcHJlc2VudCAmJgorCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmlzRXNlSW5pRmVhdHVyZUVuYWJsZWQpCisJCXBvcHVsYXRlX2RvdDExZl9lc2VfdmVyc2lvbigmZnJtLkVTRVZlcnNpb24pOworCS8qIEZvciBFU0UgQXNzb2NpYXRpb25zIGZpbGwgdGhlIEVTRSBJRXMgKi8KKwlpZiAocGVfc2Vzc2lvbi0+aXNFU0Vjb25uZWN0aW9uICYmCisJICAgIHBlX3Nlc3Npb24tPnBMaW1SZUFzc29jUmVxLT5pc0VTRUZlYXR1cmVJbmlFbmFibGVkKSB7CisjaWZuZGVmIEZFQVRVUkVfRElTQUJMRV9STQorCQlwb3B1bGF0ZV9kb3QxMWZfZXNlX3JhZF9tZ210X2NhcCgmZnJtLkVTRVJhZE1nbXRDYXApOworI2VuZGlmCisJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFIHx8IEZFQVRVUkVfV0xBTl9MRlIgKi8KKworCS8qIGluY2x1ZGUgV01FIEVEQ0EgSUUgYXMgd2VsbCAqLworCWlmICh3bWVfZW5hYmxlZCkgeworCQlwb3B1bGF0ZV9kb3QxMWZfd21tX2luZm9fc3RhdGlvbl9wZXJfc2Vzc2lvbihtYWNfY3R4LAorCQkJcGVfc2Vzc2lvbiwgJmZybS5XTU1JbmZvU3RhdGlvbik7CisJCWlmICh3c21fZW5hYmxlZCkKKwkJCXBvcHVsYXRlX2RvdDExZl93bW1fY2FwcygmZnJtLldNTUNhcHMpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJaWYgKHBlX3Nlc3Npb24tPmlzRVNFY29ubmVjdGlvbikgeworCQkJdWludDMyX3QgcGh5bW9kZTsKKwkJCXVpbnQ4X3QgcmF0ZTsKKworCQkJcG9wdWxhdGVfZG90MTFmX3JlX2Fzc29jX3RzcGVjKG1hY19jdHgsICZmcm0sCisJCQkJcGVfc2Vzc2lvbik7CisKKwkJCS8qCisJCQkgKiBQb3B1bGF0ZSB0aGUgVFNSUyBJRSBpZiBUU1BFQyBpcyBpbmNsdWRlZCBpbgorCQkJICogdGhlIHJlYXNzb2MgcmVxdWVzdAorCQkJICovCisJCQlsaW1fZ2V0X3BoeV9tb2RlKG1hY19jdHgsICZwaHltb2RlLCBwZV9zZXNzaW9uKTsKKwkJCWlmIChwaHltb2RlID09IFdOSV9DRkdfUEhZX01PREVfMTFHIHx8CisJCQkgICAgcGh5bW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExQSkKKwkJCQlyYXRlID0gVFNSU18xMUFHX1JBVEVfNk1CUFM7CisJCQllbHNlCisJCQkJcmF0ZSA9IFRTUlNfMTFCX1JBVEVfNV81TUJQUzsKKworCQkJaWYgKHBlX3Nlc3Npb24tPnBMaW1SZUFzc29jUmVxLT5lc2VUc3BlY0luZm8uCisJCQkgICAgbnVtVHNwZWNzKSB7CisJCQkJdFNpck1hY0VTRVRTUlNJRSB0c3JzX2llOworCisJCQkJdHNyc19pZS50c2lkID0gMDsKKwkJCQl0c3JzX2llLnJhdGVzWzBdID0gcmF0ZTsKKwkJCQlwb3B1bGF0ZV9kb3QxMV90c3JzaWUobWFjX2N0eCwgJnRzcnNfaWUsCisJCQkJCSZmcm0uRVNFVHJhZlN0cm1SYXRlU2V0LAorCQkJCQlzaXplb2YodWludDhfdCkpOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisKKwlmdF9zbWVfY29udGV4dCA9ICZtYWNfY3R4LT5yb2FtLnJvYW1TZXNzaW9uW3NtZV9zZXNzaW9uaWRdLmZ0U21lQ29udGV4dDsKKwlpZiAocGVfc2Vzc2lvbi0+aHRDYXBhYmlsaXR5ICYmCisJICAgIG1hY19jdHgtPmxpbS5odENhcGFiaWxpdHlQcmVzZW50SW5CZWFjb24pIHsKKwkJcG9wdWxhdGVfZG90MTFmX2h0X2NhcHMobWFjX2N0eCwgcGVfc2Vzc2lvbiwgJmZybS5IVENhcHMpOworCX0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJaWYgKHBlX3Nlc3Npb24tPnBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbi5tZGllUHJlc2VudCAmJgorCSAgICAoZnRfc21lX2NvbnRleHQtPmFkZE1ESUUgPT0gdHJ1ZSkKKyNpZiBkZWZpbmVkIEZFQVRVUkVfV0xBTl9FU0UKKwkgICAgJiYgIXBlX3Nlc3Npb24tPmlzRVNFY29ubmVjdGlvbgorI2VuZGlmCisJICAgICkgeworCQlwb3B1bGF0ZV9tZGllKG1hY19jdHgsICZmcm0uTW9iaWxpdHlEb21haW4sCisJCQlwZV9zZXNzaW9uLT5wTGltUmVBc3NvY1JlcS0+YnNzRGVzY3JpcHRpb24ubWRpZSk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmIChwZV9zZXNzaW9uLT52aHRDYXBhYmlsaXR5ICYmCisJICAgIHBlX3Nlc3Npb24tPnZodENhcGFiaWxpdHlQcmVzZW50SW5CZWFjb24pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIlBvcHVsYXRlIFZIVCBJRXMgaW4gUmUtQXNzb2MgUmVxdWVzdCIpKTsKKwkJcG9wdWxhdGVfZG90MTFmX3ZodF9jYXBzKG1hY19jdHgsIHBlX3Nlc3Npb24sICZmcm0uVkhUQ2Fwcyk7CisJCXZodF9lbmFibGVkID0gdHJ1ZTsKKwkJcG9wdWxhdGVfZG90MTFmX2V4dF9jYXAobWFjX2N0eCwgdmh0X2VuYWJsZWQsICZmcm0uRXh0Q2FwLAorCQkJcGVfc2Vzc2lvbik7CisJfQorCWlmICghdmh0X2VuYWJsZWQgJiYKKwkJCXBlX3Nlc3Npb24tPmlzX3ZlbmRvcl9zcGVjaWZpY192aHRjYXBzKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJQb3B1bGF0ZSBWZW5kb3IgVkhUIElFcyBpbiBSZS1Bc3NvYyBSZXF1ZXN0IikpOworCQlmcm0udmVuZG9yMl9pZS5wcmVzZW50ID0gMTsKKwkJZnJtLnZlbmRvcjJfaWUudHlwZSA9CisJCQlwZV9zZXNzaW9uLT52ZW5kb3Jfc3BlY2lmaWNfdmh0X2llX3R5cGU7CisJCWZybS52ZW5kb3IyX2llLnN1Yl90eXBlID0KKwkJCXBlX3Nlc3Npb24tPnZlbmRvcl9zcGVjaWZpY192aHRfaWVfc3ViX3R5cGU7CisJCWZybS52ZW5kb3IyX2llLlZIVENhcHMucHJlc2VudCA9IDE7CisJCXBvcHVsYXRlX2RvdDExZl92aHRfY2FwcyhtYWNfY3R4LCBwZV9zZXNzaW9uLAorCQkJCSZmcm0udmVuZG9yMl9pZS5WSFRDYXBzKTsKKwkJdmh0X2VuYWJsZWQgPSB0cnVlOworCX0KKyNlbmRpZgorCisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfcmVfYXNzb2NfcmVxdWVzdF9zaXplKG1hY19jdHgsICZmcm0sCisJCQkmcGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiRmFpbHVyZSBpbiBzaXplIGNhbGN1bGF0aW9uICgweCUwOHgpLiIpLCBzdGF0dXMpOworCQkvKiBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86ICovCisJCXBheWxvYWQgPSBzaXplb2YodERvdDExZlJlQXNzb2NSZXF1ZXN0KTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiV2FybmluZ3MgaW4gc2l6ZSBjYWxjdWxhdGlvbigweCUwOHgpLiIpLCBzdGF0dXMpOworCX0KKworCWJ5dGVzID0gcGF5bG9hZCArIHNpemVvZih0U2lyTWFjTWdtdEhkcikgKyBhZGRfaWVfbGVuOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJGVCBJRSBSZWFzc29jIFJlcSAoJWQpLiIpLAorCQlmdF9zbWVfY29udGV4dC0+cmVhc3NvY19mdF9pZXNfbGVuZ3RoKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWlmIChwZV9zZXNzaW9uLT5pczExUmNvbm5lY3Rpb24pCisJCWZ0X2llc19sZW5ndGggPSBmdF9zbWVfY29udGV4dC0+cmVhc3NvY19mdF9pZXNfbGVuZ3RoOworI2VuZGlmCisKKwljZGZfc3RhdHVzID0gY2RzX3BhY2tldF9hbGxvYygodWludDE2X3QpIGJ5dGVzICsgZnRfaWVzX2xlbmd0aCwKKwkJCQkgKHZvaWQgKiopJmZyYW1lLCAodm9pZCAqKikmcGFja2V0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlwZV9zZXNzaW9uLT5saW1NbG1TdGF0ZSA9IHBlX3Nlc3Npb24tPmxpbVByZXZNbG1TdGF0ZTsKKwkJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX01MTV9TVEFURSwKKwkJCQkgcGVfc2Vzc2lvbi0+cGVTZXNzaW9uSWQsCisJCQkJIHBlX3Nlc3Npb24tPmxpbU1sbVN0YXRlKSk7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvYyBtZW1vcnkgJWQiKSwgYnl0ZXMpOworCQlnb3RvIGVuZDsKKwl9CisJLyogUGFyYW5vaWE6ICovCisJY2RmX21lbV9zZXQoZnJhbWUsIGJ5dGVzICsgZnRfaWVzX2xlbmd0aCwgMCk7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHIHx8IGRlZmluZWQgRkVBVFVSRV9XTEFOX0VTRSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJbGltX3ByaW50X21hY19hZGRyKG1hY19jdHgsIHBlX3Nlc3Npb24tPmxpbVJlQXNzb2Nic3NJZCwgTE9HMSk7CisjZW5kaWYKKwkvKiBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6ICovCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIobWFjX2N0eCwgZnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJU0lSX01BQ19NR01UX1JFQVNTT0NfUkVRLCBwZV9zZXNzaW9uLT5saW1SZUFzc29jYnNzSWQsCisJCXBlX3Nlc3Npb24tPnNlbGZNYWNBZGRyKTsKKwltYWNfaGRyID0gKHRwU2lyTWFjTWdtdEhkcikgZnJhbWU7CisJLyogVGhhdCBkb25lLCBwYWNrIHRoZSBSZUFzc29jIFJlcXVlc3Q6ICovCisJc3RhdHVzID0gZG90MTFmX3BhY2tfcmVfYXNzb2NfcmVxdWVzdChtYWNfY3R4LCAmZnJtLCBmcmFtZSArCisJCQkJCSAgICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpLAorCQkJCQkgICAgICAgcGF5bG9hZCwgJnBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiRmFpbHVyZSBpbiBwYWNrICgweCUwOHgpLiIpLCBzdGF0dXMpOworCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKilwYWNrZXQpOworCQlnb3RvIGVuZDsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csIEZMKCJXYXJuaW5ncyBpbiBwYWNrICgweCUwOHgpLiIpLAorCQkJc3RhdHVzKTsKKwl9CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzMsCisJCSAgICAgICBGTCgiKioqIFNlbmRpbmcgUmUtQXNzb2MgUmVxdWVzdCBsZW5ndGggJWQgJWQgdG8gIiksCisJCSAgICAgICBieXRlcywgcGF5bG9hZCk7CisKKwlpZiAocGVfc2Vzc2lvbi0+YXNzb2NSZXEgIT0gTlVMTCkgeworCQljZGZfbWVtX2ZyZWUocGVfc2Vzc2lvbi0+YXNzb2NSZXEpOworCQlwZV9zZXNzaW9uLT5hc3NvY1JlcSA9IE5VTEw7CisJfQorCisJaWYgKGFkZF9pZV9sZW4pIHsKKwkJY2RmX21lbV9jb3B5KGZyYW1lICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArIHBheWxvYWQsCisJCQkgICAgIGFkZF9pZSwgYWRkX2llX2xlbik7CisJCXBheWxvYWQgKz0gYWRkX2llX2xlbjsKKwl9CisKKwlwZV9zZXNzaW9uLT5hc3NvY1JlcSA9IGNkZl9tZW1fbWFsbG9jKHBheWxvYWQpOworCWlmIChOVUxMID09IHBlX3Nlc3Npb24tPmFzc29jUmVxKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkZhaWxlZCB0byBhbGxvYyBtZW1vcnkiKSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU3RvcmUgdGhlIEFzc29jIHJlcXVlc3QuIFRoaXMgaXMgc2VudCB0byBjc3IvaGRkIGluCisJCSAqIGpvaW4gY25mIHJlc3BvbnNlLgorCQkgKi8KKwkJY2RmX21lbV9jb3B5KHBlX3Nlc3Npb24tPmFzc29jUmVxLAorCQkJICAgICBmcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkciksIHBheWxvYWQpOworCQlwZV9zZXNzaW9uLT5hc3NvY1JlcUxlbiA9IHBheWxvYWQ7CisJfQorCisJaWYgKHBlX3Nlc3Npb24tPmlzMTFSY29ubmVjdGlvbiAmJiBmdF9zbWVfY29udGV4dC0+cmVhc3NvY19mdF9pZXMpIHsKKwkJaW50IGkgPSAwOworCisJCWJvZHkgPSBmcmFtZSArIGJ5dGVzOworCQlmb3IgKGkgPSAwOyBpIDwgZnRfaWVzX2xlbmd0aDsgaSsrKSB7CisJCQkqYm9keSA9IGZ0X3NtZV9jb250ZXh0LT5yZWFzc29jX2Z0X2llc1tpXTsKKwkJCWJvZHkrKzsKKwkJfQorCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCVBFTE9HRShsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJSZS1hc3NvYyBSZXEgRnJhbWUgaXM6ICIpKTsKKwkgICAgICAgc2lyX2R1bXBfYnVmKG1hY19jdHgsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cxLAorCQkJICAgICh1aW50OF90ICopIGZyYW1lLCAoYnl0ZXMgKyBmdF9pZXNfbGVuZ3RoKSk7CisJICAgICAgICkKKyNlbmRpZgorCWlmICgoU0lSX0JBTkRfNV9HSFogPT0KKwkgICAgIGxpbV9nZXRfcmZfYmFuZChwZV9zZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwpKSB8fAorCSAgICAocGVfc2Vzc2lvbi0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpIHx8CisJICAgIChwZV9zZXNzaW9uLT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKSkgeworCQl0eF9mbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisJfQorCisJaWYgKE5VTEwgIT0gcGVfc2Vzc2lvbi0+YXNzb2NSZXEpIHsKKwkJY2RmX21lbV9mcmVlKHBlX3Nlc3Npb24tPmFzc29jUmVxKTsKKwkJcGVfc2Vzc2lvbi0+YXNzb2NSZXEgPSBOVUxMOworCX0KKworCXBlX3Nlc3Npb24tPmFzc29jUmVxID0gY2RmX21lbV9tYWxsb2MoZnRfaWVzX2xlbmd0aCk7CisJaWYgKE5VTEwgPT0gcGVfc2Vzc2lvbi0+YXNzb2NSZXEpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jIG1lbW9yeSIpKTsKKwkJcGVfc2Vzc2lvbi0+YXNzb2NSZXFMZW4gPSAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFN0b3JlIHRoZSBBc3NvYyByZXF1ZXN0LiBUaGlzIGlzIHNlbnQgdG8gY3NyL2hkZCBpbgorCQkgKiBqb2luIGNuZiByZXNwb25zZS4KKwkJICovCisJCWNkZl9tZW1fY29weShwZV9zZXNzaW9uLT5hc3NvY1JlcSwKKwkJCSAgICAgZnRfc21lX2NvbnRleHQtPnJlYXNzb2NfZnRfaWVzLCAoZnRfaWVzX2xlbmd0aCkpOworCQlwZV9zZXNzaW9uLT5hc3NvY1JlcUxlbiA9IChmdF9pZXNfbGVuZ3RoKTsKKwl9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KG1hY19jdHgsIFdMQU5fUEVfRElBR19SRUFTU09DX1NUQVJUX0VWRU5ULAorCQkJICAgICAgcGVfc2Vzc2lvbiwgZVNJUl9TVUNDRVNTLCBlU0lSX1NVQ0NFU1MpOworI2VuZGlmCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgcGVfc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIG1hY19oZHItPmZjLnN1YlR5cGUpKTsKKwljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lKG1hY19jdHgsIHBhY2tldCwKKwkJCQkodWludDE2X3QpIChieXRlcyArIGZ0X2llc19sZW5ndGgpLAorCQkJCVRYUlhfRlJNXzgwMl8xMV9NR01ULCBBTklfVFhESVJfVE9EUywgNywKKwkJCQlsaW1fdHhfY29tcGxldGUsIGZyYW1lLCB0eF9mbGFnLCBzbWVfc2Vzc2lvbmlkLAorCQkJCTApOworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwKKwkJICAgICAgIHBlX3Nlc3Npb24tPnBlU2Vzc2lvbklkLCBjZGZfc3RhdHVzKSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBzZW5kIFJlLUFzc29jIFJlcXVlc3QgKCVYKSEiKSwKKwkJCWNkZl9zdGF0dXMpOworCX0KKworZW5kOgorCS8qIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZCBmb3IgbWxtQXNzb2NSZXEgKi8KKwljZGZfbWVtX2ZyZWUobWxtX3JlYXNzb2NfcmVxKTsKKwlwZV9zZXNzaW9uLT5wTGltTWxtUmVhc3NvY1JlcSA9IE5VTEw7CisKK30KKwordm9pZCBsaW1fc2VuZF9yZXRyeV9yZWFzc29jX3JlcV9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgIHRMaW1NbG1SZWFzc29jUmVxICpwTWxtUmVhc3NvY1JlcSwKKwkJCQkgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRMaW1NbG1SZWFzc29jQ25mIG1sbVJlYXNzb2NDbmY7ICAgICAgICAvKiBrZWVwIHNtZSAqLworCXRMaW1NbG1SZWFzc29jUmVxICpwVG1wTWxtUmVhc3NvY1JlcSA9IE5VTEw7CisJaWYgKE5VTEwgPT0gcFRtcE1sbVJlYXNzb2NSZXEpIHsKKwkJcFRtcE1sbVJlYXNzb2NSZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodExpbU1sbVJlYXNzb2NSZXEpKTsKKwkJaWYgKE5VTEwgPT0gcFRtcE1sbVJlYXNzb2NSZXEpCisJCQlnb3RvIGVuZDsKKwkJY2RmX21lbV9zZXQocFRtcE1sbVJlYXNzb2NSZXEsIHNpemVvZih0TGltTWxtUmVhc3NvY1JlcSksIDApOworCQljZGZfbWVtX2NvcHkocFRtcE1sbVJlYXNzb2NSZXEsIHBNbG1SZWFzc29jUmVxLAorCQkJICAgICBzaXplb2YodExpbU1sbVJlYXNzb2NSZXEpKTsKKwl9CisJLyogUHJlcGFyZSBhbmQgc2VuZCBSZWFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUgKi8KKwkvKiBzdGFydCByZWFzc29jIHRpbWVyLiAqLworCXBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVJlYXNzb2NGYWlsdXJlVGltZXIuc2Vzc2lvbklkID0KKwkJcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisJLyogU3RhcnQgcmVhc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyICovCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLAorCQkJIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBlTElNX1JFQVNTT0NfRkFJTF9USU1FUikpOworCWlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVhc3NvY0ZhaWx1cmVUaW1lcikKKwkgICAgIT0gVFhfU1VDQ0VTUykgeworCQkvKiBDb3VsZCBub3Qgc3RhcnQgcmVhc3NvYyBmYWlsdXJlIHRpbWVyLiAqLworCQkvKiBMb2cgZXJyb3IgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCBzdGFydCBSZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIiKSk7CisJCS8qIFJldHVybiBSZWFzc29jIGNvbmZpcm0gd2l0aCAqLworCQkvKiBSZXNvdXJjZXMgVW5hdmFpbGFibGUgKi8KKwkJbWxtUmVhc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworCQltbG1SZWFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCQlnb3RvIGVuZDsKKwl9CisKKwlsaW1fc2VuZF9yZWFzc29jX3JlcV93aXRoX2Z0X2llc19tZ210X2ZyYW1lKHBNYWMsIHBUbXBNbG1SZWFzc29jUmVxLAorCQkJCQkJICAgIHBzZXNzaW9uRW50cnkpOworCXJldHVybjsKKworZW5kOgorCS8qIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZCBmb3IgcmVhc3NvY1JlcSAqLworCWlmIChwTWxtUmVhc3NvY1JlcSAhPSBOVUxMKSB7CisJCWNkZl9tZW1fZnJlZShwTWxtUmVhc3NvY1JlcSk7CisJCXBNbG1SZWFzc29jUmVxID0gTlVMTDsKKwl9CisJaWYgKHBUbXBNbG1SZWFzc29jUmVxICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHBUbXBNbG1SZWFzc29jUmVxKTsKKwkJcFRtcE1sbVJlYXNzb2NSZXEgPSBOVUxMOworCX0KKwltbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9GVF9SRUFTU09DX0ZBSUxVUkU7CisJbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvIElkICovCisJbWxtUmVhc3NvY0NuZi5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworCWxpbV9wb3N0X3NtZV9tZXNzYWdlKHBNYWMsIExJTV9NTE1fUkVBU1NPQ19DTkYsCisJCQkgICAgICh1aW50MzJfdCAqKSAmbWxtUmVhc3NvY0NuZik7Cit9CisKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCit2b2lkCitsaW1fc2VuZF9yZWFzc29jX3JlcV9tZ210X2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdExpbU1sbVJlYXNzb2NSZXEgKnBNbG1SZWFzc29jUmVxLAorCQkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJc3RhdGljIHREb3QxMWZSZUFzc29jUmVxdWVzdCBmcm07CisJdWludDE2X3QgY2FwczsKKwl1aW50OF90ICpwRnJhbWU7CisJdWludDMyX3QgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1czsKKwl1aW50OF90IGZRb3NFbmFibGVkLCBmV21lRW5hYmxlZCwgZldzbUVuYWJsZWQ7CisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdWludDE2X3QgbkFkZElFTGVuOworCXVpbnQ4X3QgKnBBZGRJRTsKKwl1aW50OF90ICp3cHNJZSA9IE5VTEw7CisJdWludDhfdCB0eEZsYWcgPSAwOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXVpbnQ4X3QgUG93ZXJDYXBzUG9wdWxhdGVkID0gZmFsc2U7CisjZW5kaWYKKwl1aW50OF90IHNtZVNlc3Npb25JZCA9IDA7CisJYm9vbCBpc1ZIVEVuYWJsZWQgPSBmYWxzZTsKKwl0cFNpck1hY01nbXRIZHIgcE1hY0hkcjsKKworCWlmIChOVUxMID09IHBzZXNzaW9uRW50cnkpIHsKKwkJcmV0dXJuOworCX0KKworCXNtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCS8qIGNoZWNrIHRoaXMgZWFybHkgdG8gYXZvaWQgdW5uY2Vzc2FyeSBvcGVyYXRpb24gKi8KKwlpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcSkgeworCQlyZXR1cm47CisJfQorCW5BZGRJRUxlbiA9IHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5hZGRJRUFzc29jLmxlbmd0aDsKKwlwQWRkSUUgPSBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+YWRkSUVBc3NvYy5hZGRJRWRhdGE7CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmZnJtLCBzaXplb2YoZnJtKSwgMCk7CisKKwljYXBzID0gcE1sbVJlYXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvOworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX1dBUEkpCisJLyogQ1I6IDI2MjQ2MyA6CisJICAgQWNjb3JkaW5nIHRvIFdBUEkgc3RhbmRhcmQ6CisJICAgNy4zLjEuNCBDYXBhYmlsaXR5IEluZm9ybWF0aW9uIGZpZWxkCisJICAgSW4gV0FQSSwgbm9uLUFQIFNUQXMgd2l0aGluIGFuIEVTUyBzZXQgdGhlIFByaXZhY3kgc3ViZmllbGQgdG8gMCBpbiB0cmFuc21pdHRlZAorCSAgIEFzc29jaWF0aW9uIG9yIFJlYXNzb2NpYXRpb24gbWFuYWdlbWVudCBmcmFtZXMuIEFQcyBpZ25vcmUgdGhlIFByaXZhY3kgc3ViZmllbGQgd2l0aGluIHJlY2VpdmVkIEFzc29jaWF0aW9uIGFuZAorCSAgIFJlYXNzb2NpYXRpb24gbWFuYWdlbWVudCBmcmFtZXMuICovCisJaWYgKHBzZXNzaW9uRW50cnktPmVuY3J5cHRUeXBlID09IGVTSVJfRURfV1BJKQorCQkoKHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqKSAmY2FwcyktPnByaXZhY3kgPSAwOworI2VuZGlmCisJc3dhcF9iaXRfZmllbGQxNihjYXBzLCAodWludDE2X3QgKikgJmZybS5DYXBhYmlsaXRpZXMpOworCisJZnJtLkxpc3RlbkludGVydmFsLmludGVydmFsID0gcE1sbVJlYXNzb2NSZXEtPmxpc3RlbkludGVydmFsOworCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIGZybS5DdXJyZW50QVBBZGRyZXNzLm1hYywKKwkJICAgICAodWludDhfdCAqKSBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgNik7CisKKwlwb3B1bGF0ZV9kb3QxMWZfc3NpZDIocE1hYywgJmZybS5TU0lEKTsKKwlwb3B1bGF0ZV9kb3QxMWZfc3VwcF9yYXRlcyhwTWFjLCBQT1BVTEFURV9ET1QxMUZfUkFURVNfT1BFUkFUSU9OQUwsCisJCQkJICAgJmZybS5TdXBwUmF0ZXMsIHBzZXNzaW9uRW50cnkpOworCisJZlFvc0VuYWJsZWQgPSAocHNlc3Npb25FbnRyeS0+bGltUW9zRW5hYmxlZCkgJiYKKwkJICAgICAgU0lSX01BQ19HRVRfUU9TKHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NDYXBzKTsKKworCWZXbWVFbmFibGVkID0gKHBzZXNzaW9uRW50cnktPmxpbVdtZUVuYWJsZWQpICYmCisJCSAgICAgIExJTV9CU1NfQ0FQU19HRVQoV01FLCBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUW9zQ2Fwcyk7CisKKwlmV3NtRW5hYmxlZCA9IChwc2Vzc2lvbkVudHJ5LT5saW1Xc21FbmFibGVkKSAmJiBmV21lRW5hYmxlZCAmJgorCQkgICAgICBMSU1fQlNTX0NBUFNfR0VUKFdTTSwgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0Jzc1Fvc0NhcHMpOworCisJaWYgKHBzZXNzaW9uRW50cnktPmxpbTExaEVuYWJsZSAmJgorCSAgICBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+c3BlY3RydW1NZ3RJbmRpY2F0b3IgPT0gZVNJUl9UUlVFKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJCVBvd2VyQ2Fwc1BvcHVsYXRlZCA9IHRydWU7CisJCXBvcHVsYXRlX2RvdDExZl9wb3dlcl9jYXBzKHBNYWMsICZmcm0uUG93ZXJDYXBzLCBMSU1fUkVBU1NPQywKKwkJCQkJICAgcHNlc3Npb25FbnRyeSk7CisJCXBvcHVsYXRlX2RvdDExZl9zdXBwX2NoYW5uZWxzKHBNYWMsICZmcm0uU3VwcENoYW5uZWxzLCBMSU1fUkVBU1NPQywKKwkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKwl9CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJaWYgKHBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlICYmCisJICAgIFNJUl9NQUNfR0VUX1JSTShwc2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QnNzQ2FwcykpIHsKKwkJaWYgKFBvd2VyQ2Fwc1BvcHVsYXRlZCA9PSBmYWxzZSkgeworCQkJUG93ZXJDYXBzUG9wdWxhdGVkID0gdHJ1ZTsKKwkJCXBvcHVsYXRlX2RvdDExZl9wb3dlcl9jYXBzKHBNYWMsICZmcm0uUG93ZXJDYXBzLAorCQkJCQkJICAgTElNX1JFQVNTT0MsIHBzZXNzaW9uRW50cnkpOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoZlFvc0VuYWJsZWQpCisJCXBvcHVsYXRlX2RvdDExZl9xb3NfY2Fwc19zdGF0aW9uKHBNYWMsICZmcm0uUU9TQ2Fwc1N0YXRpb24pOworCisJcG9wdWxhdGVfZG90MTFmX2V4dF9zdXBwX3JhdGVzKHBNYWMsIFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwKKwkJCQkgICAgICAgJmZybS5FeHRTdXBwUmF0ZXMsIHBzZXNzaW9uRW50cnkpOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJaWYgKHBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlICYmCisJICAgIFNJUl9NQUNfR0VUX1JSTShwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzQ2FwcykpIHsKKwkJcG9wdWxhdGVfZG90MTFmX3JybV9pZShwTWFjLCAmZnJtLlJSTUVuYWJsZWRDYXAsIHBzZXNzaW9uRW50cnkpOworCX0KKyNlbmRpZgorCS8qIFRoZSBqb2luIHJlcXVlc3QgKnNob3VsZCogY29udGFpbiB6ZXJvIG9yIG9uZSBvZiB0aGUgV1BBIGFuZCBSU04gKi8KKwkvKiBJRXMuICBUaGUgcGF5bG9hZCBzZW5kIGFsb25nIHdpdGggdGhlIHJlcXVlc3QgaXMgYSAqLworCS8qICd0U2lyU21lSm9pblJlcSc7IHRoZSBJRSBwb3J0aW9uIGlzIGhlbGQgaW5zaWRlIGEgJ3RTaXJSU05pZSc6ICovCisKKwkvKiAgICAgdHlwZWRlZiBzdHJ1Y3Qgc1NpclJTTmllICovCisJLyogICAgIHsgKi8KKwkvKiAgICAgICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgKi8KKwkvKiAgICAgICAgIHVpbnQ4X3QgICAgICAgIHJzbklFZGF0YVtTSVJfTUFDX01BWF9JRV9MRU5HVEgrMl07ICovCisJLyogICAgIH0gdFNpclJTTmllLCAqdHBTaXJSU05pZTsgKi8KKworCS8qIFNvLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgdHdvIGNhbGxzIGhhcm1sZXNzbHksICovCisJLyogc2luY2UgdGhleSBkbyBub3RoaW5nIGlmIHRoZXkgZG9uJ3QgZmluZCB0aGUgZ2l2ZW4gSUUgaW4gdGhlICovCisJLyogYnl0ZXN0cmVhbSB3aXRoIHdoaWNoIHRoZXkncmUgcHJvdmlkZWQuICovCisKKwkvKiBUaGUgbmV0IGVmZmVjdCBvZiB0aGlzIHdpbGwgYmUgdG8gZmFpdGhmdWxseSB0cmFuc21pdCB3aGF0ZXZlciAqLworCS8qIHNlY3VyaXR5IElFIGlzIGluIHRoZSBqb2luIHJlcXVlc3QuICovCisKKwkvKipIb3dldmVyKiwgaWYgd2UncmUgYXNzb2NpYXRpbmcgZm9yIHRoZSBwdXJwb3NlIG9mIFdQUyAqLworCS8qIGVucm9sbG1lbnQsIGFuZCB3ZSd2ZSBiZWVuIGNvbmZpZ3VyZWQgdG8gaW5kaWNhdGUgdGhhdCBieSAqLworCS8qIGVsaWRpbmcgdGhlIFdQQSBvciBSU04gSUUsIHdlIGp1c3Qgc2tpcCB0aGlzOiAqLworCWlmIChuQWRkSUVMZW4gJiYgcEFkZElFKSB7CisJCXdwc0llID0gbGltR2V0V3NjSUVQdHIocE1hYywgcEFkZElFLCBuQWRkSUVMZW4pOworCX0KKwlpZiAoTlVMTCA9PSB3cHNJZSkgeworCQlwb3B1bGF0ZV9kb3QxMWZfcnNuX29wYXF1ZShwTWFjLAorCQkJCQkgICAmKHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5yc25JRSksCisJCQkJCSAgICZmcm0uUlNOT3BhcXVlKTsKKwkJcG9wdWxhdGVfZG90MTFmX3dwYV9vcGFxdWUocE1hYywKKwkJCQkJICAgJihwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+cnNuSUUpLAorCQkJCQkgICAmZnJtLldQQU9wYXF1ZSk7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKwkJcG9wdWxhdGVfZG90MTFmX3dhcGlfb3BhcXVlKHBNYWMsCisJCQkJCSAgICAmKHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT4KKwkJCQkJICAgICAgcnNuSUUpLCAmZnJtLldBUElPcGFxdWUpOworI2VuZGlmIC8qIGRlZmluZWQoRkVBVFVSRV9XTEFOX1dBUEkpICovCisJfQorCS8qIGluY2x1ZGUgV01FIEVEQ0EgSUUgYXMgd2VsbCAqLworCWlmIChmV21lRW5hYmxlZCkgeworCQlwb3B1bGF0ZV9kb3QxMWZfd21tX2luZm9fc3RhdGlvbl9wZXJfc2Vzc2lvbihwTWFjLAorCQkJCQkJCSAgICAgcHNlc3Npb25FbnRyeSwKKwkJCQkJCQkgICAgICZmcm0uV01NSW5mb1N0YXRpb24pOworCisJCWlmIChmV3NtRW5hYmxlZCkKKwkJCXBvcHVsYXRlX2RvdDExZl93bW1fY2FwcygmZnJtLldNTUNhcHMpOworCX0KKworCWlmIChwc2Vzc2lvbkVudHJ5LT5odENhcGFiaWxpdHkgJiYKKwkgICAgcE1hYy0+bGltLmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbikgeworCQlwb3B1bGF0ZV9kb3QxMWZfaHRfY2FwcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LCAmZnJtLkhUQ2Fwcyk7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKHBzZXNzaW9uRW50cnktPnZodENhcGFiaWxpdHkgJiYKKwkgICAgcHNlc3Npb25FbnRyeS0+dmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbikgeworCQlsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJQb3B1bGF0ZSBWSFQgSUVzIGluIFJlLUFzc29jIFJlcXVlc3QiKSk7CisJCXBvcHVsYXRlX2RvdDExZl92aHRfY2FwcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LCAmZnJtLlZIVENhcHMpOworCQlpc1ZIVEVuYWJsZWQgPSB0cnVlOworCX0KKyNlbmRpZgorCisJcG9wdWxhdGVfZG90MTFmX2V4dF9jYXAocE1hYywgaXNWSFRFbmFibGVkLCAmZnJtLkV4dENhcCwgcHNlc3Npb25FbnRyeSk7CisKKwluU3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfcmVfYXNzb2NfcmVxdWVzdF9zaXplKHBNYWMsICZmcm0sICZuUGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKwkJCQkgICAgICAgIm9yIGEgUmUtQXNzb2NpYXRpb24gUmVxdWVzdCAoMHglMDh4KS4iKSwKKwkJCW5TdGF0dXMpOworCQkvKiBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86ICovCisJCW5QYXlsb2FkID0gc2l6ZW9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmcgIgorCQkJCSAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIFJlLUFzc29jaWF0aW9uIFJlICIKKwkJCQkgICAgICAgInF1ZXN0KDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArIG5BZGRJRUxlbjsKKworCWNkZl9zdGF0dXMgPSBjZHNfcGFja2V0X2FsbG9jKCh1aW50MTZfdCkgbkJ5dGVzLCAodm9pZCAqKikmcEZyYW1lLAorCQkJCSAgICAgICh2b2lkICoqKSZwUGFja2V0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVByZXZNbG1TdGF0ZTsKKwkJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX01MTV9TVEFURSwKKwkJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKSk7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgUmUtQXMiCisJCQkgICAic29jaWF0aW9uIFJlcXVlc3QuIiksIG5CeXRlcyk7CisJCWdvdG8gZW5kOworCX0KKwkvKiBQYXJhbm9pYTogKi8KKwljZGZfbWVtX3NldChwRnJhbWUsIG5CeXRlcywgMCk7CisKKwkvKiBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6ICovCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIocE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisJCVNJUl9NQUNfTUdNVF9SRUFTU09DX1JFUSwgcHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkLAorCQlwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIHBGcmFtZTsKKworCS8qIFRoYXQgZG9uZSwgcGFjayB0aGUgUHJvYmUgUmVxdWVzdDogKi8KKwluU3RhdHVzID0gZG90MTFmX3BhY2tfcmVfYXNzb2NfcmVxdWVzdChwTWFjLCAmZnJtLCBwRnJhbWUgKworCQkJCQkgICAgICAgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKwkJCQkJICAgICAgIG5QYXlsb2FkLCAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwYWNrIGEgUmUtQXNzb2NpYXRpb24gUmVxdWUiCisJCQkJICAgICAgICJzdCAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXBQYWNrZXQpOworCQlnb3RvIGVuZDsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIGEgUiIKKwkJCQkgICAgICAgImUtQXNzb2NpYXRpb24gUmVxdWVzdCAoMHglMDh4KS4iKSwKKwkJCW5TdGF0dXMpOworCX0KKworCVBFTE9HMShsaW1fbG9nCisJCSAgICAgICAocE1hYywgTE9HMSwKKwkJICAgICAgIEZMKCIqKiogU2VuZGluZyBSZS1Bc3NvY2lhdGlvbiBSZXF1ZXN0IGxlbmd0aCAlZCIgInRvICIpLAorCQkgICAgICAgbkJ5dGVzKTsKKwkgICAgICAgKQorCisJaWYgKHBzZXNzaW9uRW50cnktPmFzc29jUmVxICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHBzZXNzaW9uRW50cnktPmFzc29jUmVxKTsKKwkJcHNlc3Npb25FbnRyeS0+YXNzb2NSZXEgPSBOVUxMOworCX0KKworCWlmIChuQWRkSUVMZW4pIHsKKwkJY2RmX21lbV9jb3B5KHBGcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkcikgKyBuUGF5bG9hZCwKKwkJCSAgICAgcEFkZElFLCBuQWRkSUVMZW4pOworCQluUGF5bG9hZCArPSBuQWRkSUVMZW47CisJfQorCisJcHNlc3Npb25FbnRyeS0+YXNzb2NSZXEgPSBjZGZfbWVtX21hbGxvYyhuUGF5bG9hZCk7CisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeS0+YXNzb2NSZXEpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBhc3NvYyByZXF1ZXN0IikpOworCQkgICAgICAgKQorCX0gZWxzZSB7CisJCS8qIFN0b3JlIHRoZSBBc3NvYyByZXF1ZXN0LiBUaGlzIGlzIHNlbnQgdG8gY3NyL2hkZCBpbiBqb2luIGNuZiByZXNwb25zZS4gKi8KKwkJY2RmX21lbV9jb3B5KHBzZXNzaW9uRW50cnktPmFzc29jUmVxLAorCQkJICAgICBwRnJhbWUgKyBzaXplb2YodFNpck1hY01nbXRIZHIpLCBuUGF5bG9hZCk7CisJCXBzZXNzaW9uRW50cnktPmFzc29jUmVxTGVuID0gblBheWxvYWQ7CisJfQorCisJaWYgKChTSVJfQkFORF81X0dIWiA9PSBsaW1fZ2V0X3JmX2JhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKwkgICAgfHwgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBDREZfUDJQX0NMSUVOVF9NT0RFKSB8fAorCSAgICAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkKKwkgICAgKSB7CisJCXR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworCX0KKworCWlmIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9DTElFTlRfTU9ERSkgeworCQl0eEZsYWcgfD0gSEFMX1VTRV9QRUVSX1NUQV9SRVFVRVNURURfTUFTSzsKKwl9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19SRUFTU09DX1NUQVJUX0VWRU5ULAorCQkJICAgICAgcHNlc3Npb25FbnRyeSwgZVNJUl9TVUNDRVNTLCBlU0lSX1NVQ0NFU1MpOworI2VuZGlmCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIHBNYWNIZHItPmZjLnN1YlR5cGUpKTsKKwljZGZfc3RhdHVzID0KKwkJd21hX3R4X2ZyYW1lKHBNYWMsIHBQYWNrZXQsCisJCQkgICAodWludDE2X3QpIChzaXplb2YodFNpck1hY01nbXRIZHIpICsgblBheWxvYWQpLAorCQkJICAgVFhSWF9GUk1fODAyXzExX01HTVQsIEFOSV9UWERJUl9UT0RTLCA3LAorCQkJICAgbGltX3R4X2NvbXBsZXRlLCBwRnJhbWUsIHR4RmxhZywgc21lU2Vzc2lvbklkLCAwKTsKKwlNVFJBQ0UoY2RmX3RyYWNlCisJCSAgICAgICAoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwKKwkJICAgICAgIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBjZGZfc3RhdHVzKSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBzZW5kIFJlLUFzc29jaWF0aW9uIFJlcXVlc3QgKCVYKSEiKSwKKwkJCWNkZl9zdGF0dXMpOworCQkvKiBQa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sgKi8KKwl9CisKK2VuZDoKKwkvKiBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIG1sbUFzc29jUmVxICovCisJY2RmX21lbV9mcmVlKHBNbG1SZWFzc29jUmVxKTsKKwlwc2Vzc2lvbkVudHJ5LT5wTGltTWxtUmVhc3NvY1JlcSA9IE5VTEw7CisKK30gLyogbGltX3NlbmRfcmVhc3NvY19yZXFfbWdtdF9mcmFtZSAqLworCisvKioKKyAqIGxpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZSgpIC0gU2VuZCBhbiBBdXRoZW50aWNhdGlvbiBmcmFtZQorICoKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAYXV0aF9mcmFtZTogUG9pbnRlciB0byBBdXRoZW50aWNhdGlvbiBmcmFtZSBzdHJ1Y3R1cmUKKyAqIEBwZWVyX2FkZHI6IE1BQyBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uIHBlZXIKKyAqIEB3ZXBfYml0OiB3ZXAgYml0IGluIGZyYW1lIGNvbnRyb2wgZm9yIEF1dGhlbnRpY2F0aW9uIGZyYW1lMworICogQHNlc3Npb246IFBFIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19tbG1fbWVzc2FnZXMoKS4gQXV0aGVudGljYXRpb24gZnJhbWUKKyAqIGlzIGZvcm1hdHRlZCBhbmQgc2VudCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqIFJldHVybjogdm9pZAorICovCisKK3ZvaWQKK2xpbV9zZW5kX2F1dGhfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJIHRwU2lyTWFjQXV0aEZyYW1lQm9keSBhdXRoX2ZyYW1lLAorCQkJIHRTaXJNYWNBZGRyIHBlZXJfYWRkciwKKwkJCSB1aW50OF90IHdlcF9iaXQsIHRwUEVTZXNzaW9uIHNlc3Npb24pCit7CisJdWludDhfdCAqZnJhbWUsICpib2R5OworCXVpbnQzMl90IGZyYW1lX2xlbiA9IDAsIGJvZHlfbGVuID0gMDsKKwl0cFNpck1hY01nbXRIZHIgbWFjX2hkcjsKKwl2b2lkICpwYWNrZXQ7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXVpbnQ4X3QgdHhfZmxhZyA9IDA7CisJdWludDhfdCBzbWVfc2Vzc2lvbmlkID0gMDsKKwl1aW50MTZfdCBmdF9pZXNfbGVuZ3RoID0gMDsKKworCWlmIChOVUxMID09IHNlc3Npb24pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiRXJyb3I6IHBzZXNzaW9uIEVudHJ5IGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlzbWVfc2Vzc2lvbmlkID0gc2Vzc2lvbi0+c21lU2Vzc2lvbklkOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgiU2VuZGluZyBBdXRoIHNlcSMgJWQgc3RhdHVzICVkICglZCkgdG8gIiBNQUNfQUREUkVTU19TVFIpLAorCQlhdXRoX2ZyYW1lLT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIsCisJCWF1dGhfZnJhbWUtPmF1dGhTdGF0dXNDb2RlLAorCQkoYXV0aF9mcmFtZS0+YXV0aFN0YXR1c0NvZGUgPT0gZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMpLAorCQlNQUNfQUREUl9BUlJBWShwZWVyX2FkZHIpKTsKKworCXN3aXRjaCAoYXV0aF9mcmFtZS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyKSB7CisJY2FzZSBTSVJfTUFDX0FVVEhfRlJBTUVfMToKKwkJLyoKKwkJICogQWxsb2NhdGUgYnVmZmVyIGZvciBBdXRoZW50aWNhdG9uIGZyYW1lIG9mIHNpemUKKwkJICogZXF1YWwgdG8gbWFuYWdlbWVudCBmcmFtZSBoZWFkZXIgbGVuZ3RoIHBsdXMgMiBieXRlcworCQkgKiBlYWNoIGZvciBhdXRoIGFsZ29yaXRobSBudW1iZXIsIHRyYW5zYWN0aW9uIG51bWJlcgorCQkgKiBhbmQgc3RhdHVzIGNvZGUuCisJCSAqLworCisJCWZyYW1lX2xlbiA9IHNpemVvZih0U2lyTWFjTWdtdEhkcikgKworCQkJICAgU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9PRkZTRVQ7CisJCWJvZHlfbGVuID0gU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9PRkZTRVQ7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCWlmIChhdXRoX2ZyYW1lLT5hdXRoQWxnb051bWJlciA9PSBlU0lSX0ZUX0FVVEgpIHsKKwkJCWlmIChOVUxMICE9IHNlc3Npb24tPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgJiYKKwkJCSAgICAwICE9IHNlc3Npb24tPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPgorCQkJCWZ0X2llc19sZW5ndGgpIHsKKwkJCQlmdF9pZXNfbGVuZ3RoID0gc2Vzc2lvbi0+ZnRQRUNvbnRleHQuCisJCQkJCXBGVFByZUF1dGhSZXEtPmZ0X2llc19sZW5ndGg7CisJCQkJZnJhbWVfbGVuICs9IGZ0X2llc19sZW5ndGg7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0czLAorCQkJCQlGTCgiQXV0aCBmcmFtZSwgRlRJRVMgbGVuZ3RoIGFkZGVkPSVkIiksCisJCQkJCWZ0X2llc19sZW5ndGgpOworCQkJfSBlbHNlIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPRzMsCisJCQkJCUZMKCJBdXRoIGZyYW1lLCBEb2VzIG5vdCBjb250YWluIEZUSUVTISEhIikpOworCQkJCWZyYW1lX2xlbiArPSAoMiArIFNJUl9NRElFX1NJWkUpOworCQkJfQorCQl9CisjZW5kaWYKKwkJYnJlYWs7CisKKwljYXNlIFNJUl9NQUNfQVVUSF9GUkFNRV8yOgorCQlpZiAoKGF1dGhfZnJhbWUtPmF1dGhBbGdvTnVtYmVyID09IGVTSVJfT1BFTl9TWVNURU0pIHx8CisJCSAgICAoKGF1dGhfZnJhbWUtPmF1dGhBbGdvTnVtYmVyID09IGVTSVJfU0hBUkVEX0tFWSkgJiYKKwkJCShhdXRoX2ZyYW1lLT5hdXRoU3RhdHVzQ29kZSAhPQorCQkJIGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTKSkpIHsKKwkJCS8qCisJCQkgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIEF1dGhlbnRpY2F0b24gZnJhbWUgb2Ygc2l6ZQorCQkJICogZXF1YWwgdG8gbWFuYWdlbWVudCBmcmFtZSBoZWFkZXIgbGVuZ3RoIHBsdXMKKwkJCSAqIDIgYnl0ZXMgZWFjaCBmb3IgYXV0aCBhbGdvcml0aG0gbnVtYmVyLAorCQkJICogdHJhbnNhY3Rpb24gbnVtYmVyIGFuZCBzdGF0dXMgY29kZS4KKwkJCSAqLworCisJCQlmcmFtZV9sZW4gPSBzaXplb2YodFNpck1hY01nbXRIZHIpICsKKwkJCQkgICBTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX09GRlNFVDsKKwkJCWJvZHlfbGVuID0gU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9PRkZTRVQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogU2hhcmVkIEtleSBhbGdvcml0aG0gd2l0aCBjaGFsbGVuZ2UgdGV4dAorCQkJICogdG8gYmUgc2VudC4KKwkJCSAqCisJCQkgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIEF1dGhlbnRpY2F0b24gZnJhbWUgb2Ygc2l6ZQorCQkJICogZXF1YWwgdG8gbWFuYWdlbWVudCBmcmFtZSBoZWFkZXIgbGVuZ3RoIHBsdXMKKwkJCSAqIDIgYnl0ZXMgZWFjaCBmb3IgYXV0aCBhbGdvcml0aG0gbnVtYmVyLAorCQkJICogdHJhbnNhY3Rpb24gbnVtYmVyLCBzdGF0dXMgY29kZSBhbmQgMTI4IGJ5dGVzCisJCQkgKiBmb3IgY2hhbGxlbmdlIHRleHQuCisJCQkgKi8KKworCQkJZnJhbWVfbGVuID0gc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArCisJCQkJICAgc2l6ZW9mKHRTaXJNYWNBdXRoRnJhbWUpOworCQkJYm9keV9sZW4gPSBzaXplb2YodFNpck1hY0F1dGhGcmFtZUJvZHkpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTSVJfTUFDX0FVVEhfRlJBTUVfMzoKKwkJaWYgKHdlcF9iaXQgPT0gTElNX1dFUF9JTl9GQykgeworCQkJLyoKKwkJCSAqIEF1dGggZnJhbWUzIHRvIGJlIHNlbnQgd2l0aCBlbmNyeXB0ZWQgZnJhbWVib2R5CisJCQkgKgorCQkJICogQWxsb2NhdGUgYnVmZmVyIGZvciBBdXRoZW50aWNhdG9uIGZyYW1lIG9mIHNpemUKKwkJCSAqIGVxdWFsIHRvIG1hbmFnZW1lbnQgZnJhbWUgaGVhZGVyIGxlbmd0aCBwbHVzIDIgYnl0ZXMKKwkJCSAqIGVhY2ggZm9yIGF1dGggYWxnb3JpdGhtIG51bWJlciwgdHJhbnNhY3Rpb24gbnVtYmVyLAorCQkJICogc3RhdHVzIGNvZGUsIDEyOCBieXRlcyBmb3IgY2hhbGxlbmdlIHRleHQgYW5kCisJCQkgKiA0IGJ5dGVzIGVhY2ggZm9yIElWICYgSUNWLgorCQkJICovCisKKwkJCWZyYW1lX2xlbiA9IHNpemVvZih0U2lyTWFjTWdtdEhkcikgKworCQkJCQlMSU1fRU5DUl9BVVRIX0JPRFlfTEVOOworCQkJYm9keV9sZW4gPSBMSU1fRU5DUl9BVVRIX0JPRFlfTEVOOworCQl9IGVsc2UgeworCisJCQkvKgorCQkJICogQXV0aCBmcmFtZTMgdG8gYmUgc2VudCB3aXRob3V0IGVuY3J5cHRlZCBmcmFtZWJvZHkKKwkJCSAqCisJCQkgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIEF1dGhlbnRpY2F0b24gZnJhbWUgb2Ygc2l6ZSBlcXVhbAorCQkJICogdG8gbWFuYWdlbWVudCBmcmFtZSBoZWFkZXIgbGVuZ3RoIHBsdXMgMiBieXRlcyBlYWNoCisJCQkgKiBmb3IgYXV0aCBhbGdvcml0aG0gbnVtYmVyLCB0cmFuc2FjdGlvbiBudW1iZXIgYW5kCisJCQkgKiBzdGF0dXMgY29kZS4KKwkJCSAqLworCisJCQlmcmFtZV9sZW4gPSBzaXplb2YodFNpck1hY01nbXRIZHIpICsKKwkJCQkgICBTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX09GRlNFVDsKKwkJCWJvZHlfbGVuID0gU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9PRkZTRVQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNJUl9NQUNfQVVUSF9GUkFNRV80OgorCQkvKgorCQkgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIEF1dGhlbnRpY2F0b24gZnJhbWUgb2Ygc2l6ZSBlcXVhbAorCQkgKiB0byBtYW5hZ2VtZW50IGZyYW1lIGhlYWRlciBsZW5ndGggcGx1cyAyIGJ5dGVzIGVhY2gKKwkJICogZm9yIGF1dGggYWxnb3JpdGhtIG51bWJlciwgdHJhbnNhY3Rpb24gbnVtYmVyIGFuZAorCQkgKiBzdGF0dXMgY29kZS4KKwkJICovCisKKwkJZnJhbWVfbGVuID0gc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArCisJCQkgICBTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX09GRlNFVDsKKwkJYm9keV9sZW4gPSBTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX09GRlNFVDsKKworCQlicmVhazsKKwl9IC8qIHN3aXRjaCAoYXV0aF9mcmFtZS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyKSAqLworCisJY2RmX3N0YXR1cyA9IGNkc19wYWNrZXRfYWxsb2MoKHVpbnQxNl90KSBmcmFtZV9sZW4sICh2b2lkICoqKSZmcmFtZSwKKwkJCQkgKHZvaWQgKiopJnBhY2tldCk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiY2FsbCB0byBidWZBbGxvYyBmYWlsZWQgZm9yIEFVVEggZnJhbWUiKSk7CisJCXJldHVybjsKKwl9CisKKwljZGZfbWVtX3plcm8oZnJhbWUsIGZyYW1lX2xlbik7CisKKwkvKiBQcmVwYXJlIEJEICovCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIobWFjX2N0eCwgZnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJU0lSX01BQ19NR01UX0FVVEgsIHBlZXJfYWRkciwgc2Vzc2lvbi0+c2VsZk1hY0FkZHIpOworCW1hY19oZHIgPSAodHBTaXJNYWNNZ210SGRyKSBmcmFtZTsKKwltYWNfaGRyLT5mYy53ZXAgPSB3ZXBfYml0OworCisJLyogUHJlcGFyZSBCU1NJZCAqLworCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uKSB8fAorCSAgICBMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbikpCisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBtYWNfaGRyLT5ic3NJZCwKKwkJCSAgICAgKHVpbnQ4X3QgKikgc2Vzc2lvbi0+YnNzSWQsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJLyogUHJlcGFyZSBBdXRoZW50aWNhdGlvbiBmcmFtZSBib2R5ICovCisJYm9keSA9IGZyYW1lICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsKKworCWlmICh3ZXBfYml0ID09IExJTV9XRVBfSU5fRkMpIHsKKwkJY2RmX21lbV9jb3B5KGJvZHksICh1aW50OF90ICopIGF1dGhfZnJhbWUsIGJvZHlfbGVuKTsKKworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiKioqIFNlbmRpbmcgQXV0aCBzZXEjIDMgc3RhdHVzICVkICglZCkgdG8iCisJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJCWF1dGhfZnJhbWUtPmF1dGhTdGF0dXNDb2RlLAorCQkJKGF1dGhfZnJhbWUtPmF1dGhTdGF0dXNDb2RlID09IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTKSwKKwkJCU1BQ19BRERSX0FSUkFZKG1hY19oZHItPmRhKSk7CisKKwl9IGVsc2UgeworCQkqKCh1aW50MTZfdCAqKSAoYm9keSkpID0KKwkJCXNpcl9zd2FwX3UxNmlmX25lZWRlZChhdXRoX2ZyYW1lLT5hdXRoQWxnb051bWJlcik7CisJCWJvZHkgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwkJYm9keV9sZW4gLT0gc2l6ZW9mKHVpbnQxNl90KTsKKworCQkqKCh1aW50MTZfdCAqKSAoYm9keSkpID0KKwkJCXNpcl9zd2FwX3UxNmlmX25lZWRlZCgKKwkJCQlhdXRoX2ZyYW1lLT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIpOworCQlib2R5ICs9IHNpemVvZih1aW50MTZfdCk7CisJCWJvZHlfbGVuIC09IHNpemVvZih1aW50MTZfdCk7CisKKwkJKigodWludDE2X3QgKikgKGJvZHkpKSA9CisJCQlzaXJfc3dhcF91MTZpZl9uZWVkZWQoYXV0aF9mcmFtZS0+YXV0aFN0YXR1c0NvZGUpOworCQlib2R5ICs9IHNpemVvZih1aW50MTZfdCk7CisJCWJvZHlfbGVuIC09IHNpemVvZih1aW50MTZfdCk7CisJCWlmIChib2R5X2xlbiA8PSAoc2l6ZW9mKGF1dGhfZnJhbWUtPnR5cGUpICsKKwkJCQlzaXplb2YoYXV0aF9mcmFtZS0+bGVuZ3RoKSArCisJCQkJc2l6ZW9mKGF1dGhfZnJhbWUtPmNoYWxsZW5nZVRleHQpKSkKKwkJCWNkZl9tZW1fY29weShib2R5LCAodWludDhfdCAqKSAmYXV0aF9mcmFtZS0+dHlwZSwKKwkJCQkgICAgIGJvZHlfbGVuKTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJaWYgKChhdXRoX2ZyYW1lLT5hdXRoQWxnb051bWJlciA9PSBlU0lSX0ZUX0FVVEgpICYmCisJCSAgICAoYXV0aF9mcmFtZS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID09CisJCSAgICAgU0lSX01BQ19BVVRIX0ZSQU1FXzEpICYmCisJCSAgICAgKHNlc3Npb24tPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgIT0gTlVMTCkpIHsKKworCQkJaWYgKGZ0X2llc19sZW5ndGggPiAwKSB7CisJCQkJY2RmX21lbV9jb3B5KGJvZHksCisJCQkJCXNlc3Npb24tPmZ0UEVDb250ZXh0LgorCQkJCQkJcEZUUHJlQXV0aFJlcS0+ZnRfaWVzLAorCQkJCQlmdF9pZXNfbGVuZ3RoKTsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cyLAorCQkJCQlGTCgiQXV0aDEgRnJhbWUgRlRJRSBpczogIikpOworCQkJCXNpcl9kdW1wX2J1ZihtYWNfY3R4LCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMiwKKwkJCQkJKHVpbnQ4X3QgKikgYm9keSwKKwkJCQkJZnRfaWVzX2xlbmd0aCk7CisjZW5kaWYKKwkJCX0gZWxzZSBpZiAoTlVMTCAhPSBzZXNzaW9uLT5mdFBFQ29udGV4dC4KKwkJCQkJcEZUUHJlQXV0aFJlcS0+cGJzc0Rlc2NyaXB0aW9uKSB7CisJCQkJLyogTURJRCBhdHRyIGlzIDU0ICovCisJCQkJKmJvZHkgPSBTSVJfTURJRV9FTEVNRU5UX0lEOworCQkJCWJvZHkrKzsKKwkJCQkqYm9keSA9IFNJUl9NRElFX1NJWkU7CisJCQkJYm9keSsrOworCQkJCWNkZl9tZW1fY29weShib2R5LAorCQkJCQkmc2Vzc2lvbi0+ZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+CisJCQkJCQlwYnNzRGVzY3JpcHRpb24tPm1kaWVbMF0sCisJCQkJCVNJUl9NRElFX1NJWkUpOworCQkJfQorCQl9CisjZW5kaWYKKworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiKioqIFNlbmRpbmcgQXV0aCBzZXEjICVkIHN0YXR1cyAlZCAoJWQpIHRvICIKKwkJCQlNQUNfQUREUkVTU19TVFIpLAorCQkJYXV0aF9mcmFtZS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyLAorCQkJYXV0aF9mcmFtZS0+YXV0aFN0YXR1c0NvZGUsCisJCQkoYXV0aF9mcmFtZS0+YXV0aFN0YXR1c0NvZGUgPT0KKwkJCQllU0lSX01BQ19TVUNDRVNTX1NUQVRVUyksCisJCQlNQUNfQUREUl9BUlJBWShtYWNfaGRyLT5kYSkpOworCX0KKwlzaXJfZHVtcF9idWYobWFjX2N0eCwgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzIsIGZyYW1lLCBmcmFtZV9sZW4pOworCisJaWYgKChTSVJfQkFORF81X0dIWiA9PSBsaW1fZ2V0X3JmX2JhbmQoc2Vzc2lvbi0+Y3VycmVudE9wZXJDaGFubmVsKSkKKwkgICAgfHwgKHNlc3Npb24tPnBlUGVyc29uYSA9PSBDREZfUDJQX0NMSUVOVF9NT0RFKQorCSAgICB8fCAoc2Vzc2lvbi0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkKKyNpZiBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwkgICAgfHwgKChOVUxMICE9IHNlc3Npb24tPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEpICYmCisJCShTSVJfQkFORF81X0dIWiA9PQorCQkgbGltX2dldF9yZl9iYW5kKHNlc3Npb24tPmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPgorCQkJCSBwcmVBdXRoY2hhbm5lbE51bSkpKQorI2VuZGlmCisJICAgICkKKwkJdHhfZmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworCisKKwlpZiAoc2Vzc2lvbi0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpCisJCXR4X2ZsYWcgfD0gSEFMX1VTRV9QRUVSX1NUQV9SRVFVRVNURURfTUFTSzsKKworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIG1hY19oZHItPmZjLnN1YlR5cGUpKTsKKwkvKiBRdWV1ZSBBdXRoZW50aWNhdGlvbiBmcmFtZSBpbiBoaWdoIHByaW9yaXR5IFdRICovCisJY2RmX3N0YXR1cyA9IHdtYV90eF9mcmFtZShtYWNfY3R4LCBwYWNrZXQsICh1aW50MTZfdCkgZnJhbWVfbGVuLAorCQkJCVRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCUFOSV9UWERJUl9UT0RTLCA3LCBsaW1fdHhfY29tcGxldGUsCisJCQkJZnJhbWUsIHR4X2ZsYWcsIHNtZV9zZXNzaW9uaWQsIDApOworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwKKwkJCSBzZXNzaW9uLT5wZVNlc3Npb25JZCwgY2RmX3N0YXR1cykpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiKioqIENvdWxkIG5vdCBzZW5kIEF1dGggZnJhbWUsIHJldENvZGU9JVggKioqIiksCisJCQljZGZfc3RhdHVzKTsKKworCXJldHVybjsKK30KKworQ0RGX1NUQVRVUyBsaW1fc2VuZF9kZWF1dGhfY25mKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDE2X3QgYWlkOworCXRwRHBoSGFzaE5vZGUgcFN0YURzOworCXRMaW1NbG1EZWF1dGhSZXEgKnBNbG1EZWF1dGhSZXE7CisJdExpbU1sbURlYXV0aENuZiBtbG1EZWF1dGhDbmY7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKworCXBNbG1EZWF1dGhSZXEgPSBwTWFjLT5saW0ubGltRGlzYXNzb2NEZWF1dGhDbmZSZXEucE1sbURlYXV0aFJlcTsKKwlpZiAocE1sbURlYXV0aFJlcSkgeworCQlpZiAodHhfdGltZXJfcnVubmluZygmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltRGVhdXRoQWNrVGltZXIpKSB7CisJCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKHBNYWMsCisJCQkJCQkJZUxJTV9ERUFVVEhfQUNLX1RJTUVSKTsKKwkJfQorCisJCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChwTWFjLAorCQkJCXBNbG1EZWF1dGhSZXEtPnNlc3Npb25JZCk7CisJCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JZCIpKTsKKwkJCSAgICAgICApCisJCQltbG1EZWF1dGhDbmYucmVzdWx0Q29kZSA9CisJCQkJZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCQkJZ290byBlbmQ7CisJCX0KKworCQlwU3RhRHMgPQorCQkJZHBoX2xvb2t1cF9oYXNoX2VudHJ5KHBNYWMsIHBNbG1EZWF1dGhSZXEtPnBlZXJNYWNBZGRyLCAmYWlkLAorCQkJCQkgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCWlmIChwU3RhRHMgPT0gTlVMTCkgeworCQkJbWxtRGVhdXRoQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCQlnb3RvIGVuZDsKKwkJfQorCisJCS8qIC8gUmVjZWl2ZSBwYXRoIGNsZWFudXAgd2l0aCBkdW1teSBwYWNrZXQgKi8KKwkJbGltX2Z0X2NsZWFudXBfcHJlX2F1dGhfaW5mbyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJbGltX2NsZWFudXBfcnhfcGF0aChwTWFjLCBwU3RhRHMsIHBzZXNzaW9uRW50cnkpOworCQkvKiAvIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZCBmb3IgbWxtRGVhdXRoUmVxICovCisJCWNkZl9tZW1fZnJlZShwTWxtRGVhdXRoUmVxKTsKKwkJcE1hYy0+bGltLmxpbURpc2Fzc29jRGVhdXRoQ25mUmVxLnBNbG1EZWF1dGhSZXEgPSBOVUxMOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworZW5kOgorCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWxtRGVhdXRoQ25mLnBlZXJNYWNBZGRyLAorCQkgICAgICh1aW50OF90ICopIHBNbG1EZWF1dGhSZXEtPnBlZXJNYWNBZGRyLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCW1sbURlYXV0aENuZi5kZWF1dGhUcmlnZ2VyID0gcE1sbURlYXV0aFJlcS0+ZGVhdXRoVHJpZ2dlcjsKKwltbG1EZWF1dGhDbmYuYWlkID0gcE1sbURlYXV0aFJlcS0+YWlkOworCW1sbURlYXV0aENuZi5zZXNzaW9uSWQgPSBwTWxtRGVhdXRoUmVxLT5zZXNzaW9uSWQ7CisKKwkvKiBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgKi8KKwkvKiBmb3IgbWxtRGVhdXRoUmVxICovCisJY2RmX21lbV9mcmVlKHBNbG1EZWF1dGhSZXEpOworCisJbGltX3Bvc3Rfc21lX21lc3NhZ2UocE1hYywKKwkJCSAgICAgTElNX01MTV9ERUFVVEhfQ05GLCAodWludDMyX3QgKikgJm1sbURlYXV0aENuZik7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBsaW1fc2VuZF9kaXNhc3NvY19jbmYoKSAtIFNlbmQgZGlzYXNzb2MgY29uZmlybWF0aW9uIHRvIFNNRQorICoKKyAqIEBtYWNfY3R4OiBIYW5kbGUgdG8gTUFDIGNvbnRleHQKKyAqCisgKiBTZW5kcyBkaXNhc3NvYyBjb25maXJtYXRpb24gdG8gU01FLiBSZW1vdmVzIGRpc2Fzc29jIHJlcXVlc3Qgc3RvcmVkCisgKiBpbiBsaW0uCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MKKyAqLworCitDREZfU1RBVFVTIGxpbV9zZW5kX2Rpc2Fzc29jX2NuZih0cEFuaVNpckdsb2JhbCBtYWNfY3R4KQoreworCXVpbnQxNl90IGFpZDsKKwl0cERwaEhhc2hOb2RlIHN0YV9kczsKKwl0TGltTWxtRGlzYXNzb2NDbmYgZGlzYXNzb2NfY25mOworCXRwUEVTZXNzaW9uIHBlX3Nlc3Npb247CisJdExpbU1sbURpc2Fzc29jUmVxICpkaXNhc3NvY19yZXE7CisKKwlkaXNhc3NvY19yZXEgPSBtYWNfY3R4LT5saW0ubGltRGlzYXNzb2NEZWF1dGhDbmZSZXEucE1sbURpc2Fzc29jUmVxOworCWlmIChkaXNhc3NvY19yZXEpIHsKKwkJaWYgKHR4X3RpbWVyX3J1bm5pbmcoCisJCQkmbWFjX2N0eC0+bGltLmxpbVRpbWVycy5nTGltRGlzYXNzb2NBY2tUaW1lcikpCisJCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKG1hY19jdHgsCisJCQkJZUxJTV9ESVNBU1NPQ19BQ0tfVElNRVIpOworCisJCXBlX3Nlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZCgKKwkJCQkJbWFjX2N0eCwgZGlzYXNzb2NfcmVxLT5zZXNzaW9uSWQpOworCQlpZiAocGVfc2Vzc2lvbiA9PSBOVUxMKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJICAgICAgIEZMKCJObyBzZXNzaW9uIGZvciBnaXZlbiBzZXNzaW9uSWQiKSk7CisJCQlkaXNhc3NvY19jbmYucmVzdWx0Q29kZSA9CisJCQkJZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCQkJZ290byBlbmQ7CisJCX0KKworCQlzdGFfZHMgPSBkcGhfbG9va3VwX2hhc2hfZW50cnkobWFjX2N0eCwKKwkJCQlkaXNhc3NvY19yZXEtPnBlZXJNYWNBZGRyLCAmYWlkLAorCQkJCSZwZV9zZXNzaW9uLT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJaWYgKHN0YV9kcyA9PSBOVUxMKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJTdGFEcyBOdWxsIikpOworCQkJZGlzYXNzb2NfY25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisJCQlnb3RvIGVuZDsKKwkJfQorCQkvKiBSZWNlaXZlIHBhdGggY2xlYW51cCB3aXRoIGR1bW15IHBhY2tldCAqLworCQlpZiAoZVNJUl9TVUNDRVNTICE9CisJCSAgICBsaW1fY2xlYW51cF9yeF9wYXRoKG1hY19jdHgsIHN0YV9kcywgcGVfc2Vzc2lvbikpIHsKKwkJCWRpc2Fzc29jX2NuZi5yZXN1bHRDb2RlID0KKwkJCQllU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJjbGVhbnVwX3J4X3BhdGggZXJyb3IiKSk7CisJCQlnb3RvIGVuZDsKKwkJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCWlmIChMSU1fSVNfU1RBX1JPTEUocGVfc2Vzc2lvbikgJiYgKAorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJCSAgICAocGVfc2Vzc2lvbi0+aXNFU0Vjb25uZWN0aW9uKSB8fAorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCQkJICAgIChwZV9zZXNzaW9uLT5pc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQpIHx8CisjZW5kaWYKKwkJCSAgICAocGVfc2Vzc2lvbi0+aXMxMVJjb25uZWN0aW9uKSkgJiYKKwkJCSAgICAoZGlzYXNzb2NfcmVxLT5yZWFzb25Db2RlICE9CisJCQkJZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0ZUSEFORE9GRl9SRUFTT04pKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIkZUIFByZWF1dGggU2Vzc2lvbiAoJXAsJWQpIENsZWFuIHVwIiksCisJCQkJcGVfc2Vzc2lvbiwgcGVfc2Vzc2lvbi0+cGVTZXNzaW9uSWQpOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQkJLyogRGVsZXRlIEZUIHNlc3Npb24gaWYgdGhlcmUgZXhpc3RzIG9uZSAqLworCQkJbGltX2Z0X2NsZWFudXBfcHJlX2F1dGhfaW5mbyhtYWNfY3R4LCBwZV9zZXNzaW9uKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJObyBGVCBQcmVhdXRoIFNlc3Npb24gQ2xlYW4gdXAgaW4gcm9sZSAlZCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCQkJIiBpc0VTRSAlZCIKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwkJCQkiIGlzTEZSICVkIgorI2VuZGlmCisJCQkJIiBpczExciAlZCByZWFzb24gJWQiKSwKKwkJCQlHRVRfTElNX1NZU1RFTV9ST0xFKHBlX3Nlc3Npb24pLAorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJCQlwZV9zZXNzaW9uLT5pc0VTRWNvbm5lY3Rpb24sCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJCQkJcGVfc2Vzc2lvbi0+aXNGYXN0Um9hbUluaUZlYXR1cmVFbmFibGVkLAorI2VuZGlmCisJCQkJcGVfc2Vzc2lvbi0+aXMxMVJjb25uZWN0aW9uLAorCQkJCWRpc2Fzc29jX3JlcS0+cmVhc29uQ29kZSk7CisJCX0KKyNlbmRpZgorCQkvKiBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIG1sbURpc2Fzc29jUmVxICovCisJCWNkZl9tZW1fZnJlZShkaXNhc3NvY19yZXEpOworCQltYWNfY3R4LT5saW0ubGltRGlzYXNzb2NEZWF1dGhDbmZSZXEucE1sbURpc2Fzc29jUmVxID0gTlVMTDsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KK2VuZDoKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJmRpc2Fzc29jX2NuZi5wZWVyTWFjQWRkciwKKwkJICAgICAodWludDhfdCAqKSBkaXNhc3NvY19yZXEtPnBlZXJNYWNBZGRyLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCWRpc2Fzc29jX2NuZi5haWQgPSBkaXNhc3NvY19yZXEtPmFpZDsKKwlkaXNhc3NvY19jbmYuZGlzYXNzb2NUcmlnZ2VyID0gZGlzYXNzb2NfcmVxLT5kaXNhc3NvY1RyaWdnZXI7CisKKwkvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJRCAqLworCWRpc2Fzc29jX2NuZi5zZXNzaW9uSWQgPSBkaXNhc3NvY19yZXEtPnNlc3Npb25JZDsKKworCWlmIChkaXNhc3NvY19yZXEgIT0gTlVMTCkgeworCQkvKiAvIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZCBmb3IgbWxtRGlzYXNzb2NSZXEgKi8KKwkJY2RmX21lbV9mcmVlKGRpc2Fzc29jX3JlcSk7CisJCW1hY19jdHgtPmxpbS5saW1EaXNhc3NvY0RlYXV0aENuZlJlcS5wTWxtRGlzYXNzb2NSZXEgPSBOVUxMOworCX0KKworCWxpbV9wb3N0X3NtZV9tZXNzYWdlKG1hY19jdHgsIExJTV9NTE1fRElTQVNTT0NfQ05GLAorCQkodWludDMyX3QgKikgJmRpc2Fzc29jX2NuZik7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBsaW1fZGlzYXNzb2NfdHhfY29tcGxldGVfY25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXVpbnQzMl90IHR4Q29tcGxldGVTdWNjZXNzKQoreworCXJldHVybiBsaW1fc2VuZF9kaXNhc3NvY19jbmYocE1hYyk7Cit9CisKK0NERl9TVEFUVVMgbGltX2RlYXV0aF90eF9jb21wbGV0ZV9jbmYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICB1aW50MzJfdCB0eENvbXBsZXRlU3VjY2VzcykKK3sKKwlyZXR1cm4gbGltX3NlbmRfZGVhdXRoX2NuZihwTWFjKTsKK30KKworLyoqCisgKiBcYnJpZWYgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBEaXNhc3NvY2lhdGUgZnJhbWUuCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gblJlYXNvbiBJbmRpY2F0ZXMgdGhlIHJlYXNvbiB0aGF0IG5lZWQgdG8gYmUgc2VudCBpbgorICogRGlzYXNzb2NpYXRpb24gZnJhbWUKKyAqCisgKiBccGFyYW0gcGVlck1hY0FkZHIgTUFDIGFkZHJlc3Mgb2YgdGhlIFNUQSB0byB3aGljaCBEaXNhc3NvY2lhdGlvbiBmcmFtZSBpcworICogc2VudAorICoKKyAqCisgKi8KKwordm9pZAorbGltX3NlbmRfZGlzYXNzb2NfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICB1aW50MTZfdCBuUmVhc29uLAorCQkJICAgICB0U2lyTWFjQWRkciBwZWVyLAorCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LCBib29sIHdhaXRGb3JBY2spCit7CisJdERvdDExZkRpc2Fzc29jaWF0aW9uIGZybTsKKwl1aW50OF90ICpwRnJhbWU7CisJdHBTaXJNYWNNZ210SGRyIHBNYWNIZHI7CisJdWludDMyX3QgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1czsKKwl2b2lkICpwUGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl1aW50OF90IHR4RmxhZyA9IDA7CisJdWludDMyX3QgdmFsID0gMDsKKwl1aW50OF90IHNtZVNlc3Npb25JZCA9IDA7CisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkgeworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJbiBjYXNlIHdoZW4gY2FjIHRpbWVyIGlzIHJ1bm5pbmcgZm9yIHRoaXMgU0FQIHNlc3Npb24gdGhlbgorCSAqIGF2b2lkIHNlbmRpbmcgZGlzYXNzb2Mgb3V0LiBJdCBpcyB2aW9sYXRpb24gb2YgZGZzIHNwZWNpZmljYXRpb24uCisJICovCisJaWYgKCgocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9TQVBfTU9ERSkgfHwKKwkgICAgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBDREZfUDJQX0dPX01PREUpKSAmJgorCSAgICAodHJ1ZSA9PSBwTWFjLT5zYXAuU2FwRGZzSW5mby5pc19kZnNfY2FjX3RpbWVyX3J1bm5pbmcpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgIEZMCisJCQkJICAoIkNBQyB0aW1lciBpcyBydW5uaW5nLCBkcm9wIGRpc2Fzc29jIGZyb20gZ29pbmcgb3V0IikpOworCQlyZXR1cm47CisJfQorCXNtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZmcm0sIHNpemVvZihmcm0pLCAwKTsKKworCWZybS5SZWFzb24uY29kZSA9IG5SZWFzb247CisKKwluU3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfZGlzYXNzb2NpYXRpb25fc2l6ZShwTWFjLCAmZnJtLCAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisJCQkJICAgICAgICJvciBhIERpc2Fzc29jaWF0aW9uICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZkRpc2Fzc29jaWF0aW9uKTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyAiCisJCQkJICAgICAgICJ0aGUgcGFja2VkIHNpemUgZm9yIGEgRGlzYXNzb2NpYXRpb24gIgorCQkJCSAgICAgICAiKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsKKworCWNkZl9zdGF0dXMgPSBjZHNfcGFja2V0X2FsbG9jKCh1aW50MTZfdCkgbkJ5dGVzLCAodm9pZCAqKikmcEZyYW1lLAorCQkJCSAgICAgICh2b2lkICoqKSZwUGFja2V0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgRGlzIgorCQkJCSAgICAgICAiYXNzb2NpYXRpb24uIiksIG5CeXRlcyk7CisJCXJldHVybjsKKwl9CisJLyogUGFyYW5vaWE6ICovCisJY2RmX21lbV9zZXQocEZyYW1lLCBuQnl0ZXMsIDApOworCisJLyogTmV4dCwgd2UgZmlsbCBvdXQgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yOiAqLworCWxpbV9wb3B1bGF0ZV9tYWNfaGVhZGVyKHBNYWMsIHBGcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorCQlTSVJfTUFDX01HTVRfRElTQVNTT0MsIHBlZXIsIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKTsKKwlwTWFjSGRyID0gKHRwU2lyTWFjTWdtdEhkcikgcEZyYW1lOworCisJLyogUHJlcGFyZSB0aGUgQlNTSUQgKi8KKwlzaXJfY29weV9tYWNfYWRkcihwTWFjSGRyLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWxpbV9zZXRfcHJvdGVjdGVkX2JpdChwTWFjLCBwc2Vzc2lvbkVudHJ5LCBwZWVyLCBwTWFjSGRyKTsKKyNlbmRpZgorCisJblN0YXR1cyA9IGRvdDExZl9wYWNrX2Rpc2Fzc29jaWF0aW9uKHBNYWMsICZmcm0sIHBGcmFtZSArCisJCQkJCSAgICAgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKwkJCQkJICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhY2sgYSBEaXNhc3NvY2lhdGlvbiAoMHglMDh4KS4iKSwKKwkJCW5TdGF0dXMpOworCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKilwUGFja2V0KTsKKwkJcmV0dXJuOyAgICAgICAgIC8qIGFsbG9jYXRlZCEgKi8KKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIGEgRCIKKwkJCQkgICAgICAgImlzYXNzb2NpYXRpb24gKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIioqKlNlc3Npb25pZCAlZCBTZW5kaW5nIERpc2Fzc29jaWF0aW9uIGZyYW1lIHdpdGggIgorCQkgICAicmVhc29uICV1IGFuZCB3YWl0Rm9yQWNrICVkIHRvICIgTUFDX0FERFJFU1NfU1RSICIgLEZyb20gIgorCQkgICBNQUNfQUREUkVTU19TVFIpLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgblJlYXNvbiwKKwkJd2FpdEZvckFjaywgTUFDX0FERFJfQVJSQVkocE1hY0hkci0+ZGEpLAorCQlNQUNfQUREUl9BUlJBWShwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcikpOworCisJaWYgKChTSVJfQkFORF81X0dIWiA9PSBsaW1fZ2V0X3JmX2JhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKwkgICAgfHwgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBDREZfUDJQX0NMSUVOVF9NT0RFKSB8fAorCSAgICAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkKKwkgICAgKSB7CisJCXR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworCX0KKworCWlmICgocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKSkgeworCQl0eEZsYWcgfD0gSEFMX1VTRV9QRUVSX1NUQV9SRVFVRVNURURfTUFTSzsKKwl9CisKKwlpZiAod2FpdEZvckFjaykgeworCQlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfTUdNVCwKKwkJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJIHBNYWNIZHItPmZjLnN1YlR5cGUpKTsKKwkJLyogUXVldWUgRGlzYXNzb2NpYXRpb24gZnJhbWUgaW4gaGlnaCBwcmlvcml0eSBXUSAqLworCQkvKiBnZXQgdGhlIGR1cmF0aW9uIGZyb20gdGhlIHJlcXVlc3QgKi8KKwkJY2RmX3N0YXR1cyA9CisJCQl3bWFfdHhfZnJhbWVXaXRoVHhDb21wbGV0ZShwTWFjLCBwUGFja2V0LCAodWludDE2X3QpIG5CeXRlcywKKwkJCQkJIFRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCQkgQU5JX1RYRElSX1RPRFMsIDcsIGxpbV90eF9jb21wbGV0ZSwKKwkJCQkJIHBGcmFtZSwgbGltX2Rpc2Fzc29jX3R4X2NvbXBsZXRlX2NuZiwKKwkJCQkJIHR4RmxhZywgc21lU2Vzc2lvbklkLCBmYWxzZSwgMCk7CisJCU1UUkFDRShjZGZfdHJhY2UKKwkJCSAgICAgICAoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgY2RmX3N0YXR1cykpOworCisJCXZhbCA9IFNZU19NU19UT19USUNLUyhMSU1fRElTQVNTT0NfREVBVVRIX0FDS19USU1FT1VUKTsKKworCQlpZiAodHhfdGltZXJfY2hhbmdlCisJCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1EaXNhc3NvY0Fja1RpbWVyLCB2YWwsIDApCisJCSAgICAhPSBUWF9TVUNDRVNTKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIlVuYWJsZSB0byBjaGFuZ2UgRGlzYXNzb2MgYWNrIFRpbWVyIHZhbCIpKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChUWF9TVUNDRVNTICE9CisJCQkgICB0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy4KKwkJCQkJICAgICBnTGltRGlzYXNzb2NBY2tUaW1lcikpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiVW5hYmxlIHRvIGFjdGl2YXRlIERpc2Fzc29jIGFjayBUaW1lciIpKTsKKwkJCWxpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfdGltZXIocE1hYywKKwkJCQkJCQllTElNX0RJU0FTU09DX0FDS19USU1FUik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfTUdNVCwKKwkJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJIHBNYWNIZHItPmZjLnN1YlR5cGUpKTsKKwkJLyogUXVldWUgRGlzYXNzb2NpYXRpb24gZnJhbWUgaW4gaGlnaCBwcmlvcml0eSBXUSAqLworCQljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCQlUWFJYX0ZSTV84MDJfMTFfTUdNVCwKKwkJCQkJQU5JX1RYRElSX1RPRFMsCisJCQkJCTcsCisJCQkJCWxpbV90eF9jb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcsCisJCQkJCXNtZVNlc3Npb25JZCwgMCk7CisJCU1UUkFDRShjZGZfdHJhY2UKKwkJCSAgICAgICAoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgY2RmX3N0YXR1cykpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJGYWlsZWQgdG8gc2VuZCBEaXNhc3NvY2lhdGlvbiAoJVgpISIpLAorCQkJCWNkZl9zdGF0dXMpOworCQkJLyogUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrICovCisJCX0KKwl9Cit9IC8qIEVuZCBsaW1fc2VuZF9kaXNhc3NvY19tZ210X2ZyYW1lLiAqLworCisvKioKKyAqIFxicmllZiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGEgRGVhdXRoZW50aWNhdGUgZnJhbWUKKyAqCisgKgorICogXHBhcmFtIHBNYWMgUG9pbnRlciB0byBnbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIFxwYXJhbSBuUmVhc29uIEluZGljYXRlcyB0aGUgcmVhc29uIHRoYXQgbmVlZCB0byBiZSBzZW50IGluIHRoZQorICogRGVhdXRoZW50aWNhdGUgZnJhbWUKKyAqCisgKiBccGFyYW0gcGVlZXIgYWRkcmVzcyBvZiB0aGUgU1RBIHRvIHdoaWNoIHRoZSBmcmFtZSBpcyB0byBiZSBzZW50CisgKgorICoKKyAqLworCit2b2lkCitsaW1fc2VuZF9kZWF1dGhfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgdWludDE2X3QgblJlYXNvbiwKKwkJCSAgIHRTaXJNYWNBZGRyIHBlZXIsCisJCQkgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LCBib29sIHdhaXRGb3JBY2spCit7CisJdERvdDExZkRlQXV0aCBmcm07CisJdWludDhfdCAqcEZyYW1lOworCXRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworCXVpbnQzMl90IG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXM7CisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdWludDhfdCB0eEZsYWcgPSAwOworCXVpbnQzMl90IHZhbCA9IDA7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwl1aW50MTZfdCBhaWQ7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisjZW5kaWYKKwl1aW50OF90IHNtZVNlc3Npb25JZCA9IDA7CisKKwlpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KSB7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEluIGNhc2Ugd2hlbiBjYWMgdGltZXIgaXMgcnVubmluZyBmb3IgdGhpcyBTQVAgc2Vzc2lvbiB0aGVuCisJICogYXZvaWQgZGVhdXRoIGZyYW1lIG91dC4gSXQgaXMgdmlvbGF0aW9uIG9mIGRmcyBzcGVjaWZpY2F0aW9uLgorCSAqLworCWlmICgoKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBDREZfU0FQX01PREUpIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKSkgJiYKKwkgICAgKHRydWUgPT0gcE1hYy0+c2FwLlNhcERmc0luZm8uaXNfZGZzX2NhY190aW1lcl9ydW5uaW5nKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICBGTAorCQkJCSAgKCJDQUMgdGltZXIgaXMgcnVubmluZywgZHJvcCB0aGUgZGVhdXRoIGZyb20gZ29pbmcgb3V0IikpOworCQlyZXR1cm47CisJfQorCXNtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZmcm0sIHNpemVvZihmcm0pLCAwKTsKKworCWZybS5SZWFzb24uY29kZSA9IG5SZWFzb247CisKKwluU3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfZGVfYXV0aF9zaXplKHBNYWMsICZmcm0sICZuUGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKwkJCQkgICAgICAgIm9yIGEgRGUtQXV0aGVudGljYXRpb24gKDB4JTA4eCkuIiksCisJCQluU3RhdHVzKTsKKwkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQluUGF5bG9hZCA9IHNpemVvZih0RG90MTFmRGVBdXRoKTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyAiCisJCQkJICAgICAgICJ0aGUgcGFja2VkIHNpemUgZm9yIGEgRGUtQXV0aGVudGljYXRpb24gIgorCQkJCSAgICAgICAiKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsKKworCWNkZl9zdGF0dXMgPSBjZHNfcGFja2V0X2FsbG9jKCh1aW50MTZfdCkgbkJ5dGVzLCAodm9pZCAqKikmcEZyYW1lLAorCQkJCSAgICAgICh2b2lkICoqKSZwUGFja2V0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgRGUtIgorCQkJCSAgICAgICAiQXV0aGVudGljYXRpb24uIiksIG5CeXRlcyk7CisJCXJldHVybjsKKwl9CisJLyogUGFyYW5vaWE6ICovCisJY2RmX21lbV9zZXQocEZyYW1lLCBuQnl0ZXMsIDApOworCisJLyogTmV4dCwgd2UgZmlsbCBvdXQgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yOiAqLworCWxpbV9wb3B1bGF0ZV9tYWNfaGVhZGVyKHBNYWMsIHBGcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorCQlTSVJfTUFDX01HTVRfREVBVVRILCBwZWVyLCBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIHBGcmFtZTsKKworCS8qIFByZXBhcmUgdGhlIEJTU0lEICovCisJc2lyX2NvcHlfbWFjX2FkZHIocE1hY0hkci0+YnNzSWQsIHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwlsaW1fc2V0X3Byb3RlY3RlZF9iaXQocE1hYywgcHNlc3Npb25FbnRyeSwgcGVlciwgcE1hY0hkcik7CisjZW5kaWYKKworCW5TdGF0dXMgPSBkb3QxMWZfcGFja19kZV9hdXRoKHBNYWMsICZmcm0sIHBGcmFtZSArCisJCQkJICAgICAgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwgblBheWxvYWQsICZuUGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBwYWNrIGEgRGVBdXRoZW50aWNhdGlvbiAoMHglMDh4KS4iKSwKKwkJCW5TdGF0dXMpOworCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKilwUGFja2V0KTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgYSBEIgorCQkJCSAgICAgICAiZS1BdXRoZW50aWNhdGlvbiAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJfQorCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIioqKlNlc3Npb25pZCAlZCBTZW5kaW5nIERlYXV0aCBmcmFtZSB3aXRoICIKKwkJCSAgICAgICAicmVhc29uICV1IGFuZCB3YWl0Rm9yQWNrICVkIHRvICIgTUFDX0FERFJFU1NfU1RSCisJCQkgICAgICAgIiAsRnJvbSAiIE1BQ19BRERSRVNTX1NUUiksCisJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBuUmVhc29uLCB3YWl0Rm9yQWNrLAorCQlNQUNfQUREUl9BUlJBWShwTWFjSGRyLT5kYSksCisJCU1BQ19BRERSX0FSUkFZKHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKSk7CisKKwlpZiAoKFNJUl9CQU5EXzVfR0haID09IGxpbV9nZXRfcmZfYmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorCSAgICB8fCAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKQorCSAgICApIHsKKwkJdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisJfQorCisJaWYgKChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9DTElFTlRfTU9ERSkgfHwKKwkgICAgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBDREZfUDJQX0dPX01PREUpKSB7CisJCXR4RmxhZyB8PSBIQUxfVVNFX1BFRVJfU1RBX1JFUVVFU1RFRF9NQVNLOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXBTdGFEcyA9CisJCWRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLCBwZWVyLCAmYWlkLAorCQkJCSAgICAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyNlbmRpZgorCisJaWYgKHdhaXRGb3JBY2spIHsKKwkJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkJIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkJCSBwTWFjSGRyLT5mYy5zdWJUeXBlKSk7CisJCS8qIFF1ZXVlIERpc2Fzc29jaWF0aW9uIGZyYW1lIGluIGhpZ2ggcHJpb3JpdHkgV1EgKi8KKwkJY2RmX3N0YXR1cyA9CisJCQl3bWFfdHhfZnJhbWVXaXRoVHhDb21wbGV0ZShwTWFjLCBwUGFja2V0LCAodWludDE2X3QpIG5CeXRlcywKKwkJCQkJIFRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCQkgQU5JX1RYRElSX1RPRFMsIDcsIGxpbV90eF9jb21wbGV0ZSwKKwkJCQkJIHBGcmFtZSwgbGltX2RlYXV0aF90eF9jb21wbGV0ZV9jbmYsCisJCQkJCSB0eEZsYWcsIHNtZVNlc3Npb25JZCwgZmFsc2UsIDApOworCQlNVFJBQ0UoY2RmX3RyYWNlCisJCQkgICAgICAgKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfQ09NUExFVEUsCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGNkZl9zdGF0dXMpKTsKKwkJLyogUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrIGxpbV90eF9jb21wbGV0ZSAqLworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJGYWlsZWQgdG8gc2VuZCBEZS1BdXRoZW50aWNhdGlvbiAoJVgpISIpLAorCQkJCWNkZl9zdGF0dXMpOworCisJCQkvKiBDYWxsIGxpbV9wcm9jZXNzX2RlYXV0aF9hY2tfdGltZW91dCB3aGljaCB3aWxsIHNlbmQKKwkJCSAqIERlYXV0aENuZiBmb3IgdGhpcyBmcmFtZQorCQkJICovCisJCQlsaW1fcHJvY2Vzc19kZWF1dGhfYWNrX3RpbWVvdXQocE1hYyk7CisJCQlyZXR1cm47CisJCX0KKworCQl2YWwgPSBTWVNfTVNfVE9fVElDS1MoTElNX0RJU0FTU09DX0RFQVVUSF9BQ0tfVElNRU9VVCk7CisKKwkJaWYgKHR4X3RpbWVyX2NoYW5nZQorCQkJICAgICgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltRGVhdXRoQWNrVGltZXIsIHZhbCwgMCkKKwkJICAgICE9IFRYX1NVQ0NFU1MpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiVW5hYmxlIHRvIGNoYW5nZSBEZWF1dGggYWNrIFRpbWVyIHZhbCIpKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChUWF9TVUNDRVNTICE9CisJCQkgICB0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy4KKwkJCQkJICAgICBnTGltRGVhdXRoQWNrVGltZXIpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIlVuYWJsZSB0byBhY3RpdmF0ZSBEZWF1dGggYWNrIFRpbWVyIikpOworCQkJbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihwTWFjLAorCQkJCQkJCWVMSU1fREVBVVRIX0FDS19USU1FUik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfTUdNVCwKKwkJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJIHBNYWNIZHItPmZjLnN1YlR5cGUpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCQlpZiAoKE5VTEwgIT0gcFN0YURzKQorCQkgICAgJiYgKFNUQV9FTlRSWV9URExTX1BFRVIgPT0gcFN0YURzLT5zdGFUeXBlKSkgeworCQkJLyogUXVldWUgRGlzYXNzb2NpYXRpb24gZnJhbWUgaW4gaGlnaCBwcmlvcml0eSBXUSAqLworCQkJY2RmX3N0YXR1cyA9CisJCQkJd21hX3R4X2ZyYW1lKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCQkgICBUWFJYX0ZSTV84MDJfMTFfTUdNVCwgQU5JX1RYRElSX0lCU1MsCisJCQkJCSAgIDcsIGxpbV90eF9jb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcsCisJCQkJCSAgIHNtZVNlc3Npb25JZCwgMCk7CisJCX0gZWxzZSB7CisjZW5kaWYKKwkJLyogUXVldWUgRGlzYXNzb2NpYXRpb24gZnJhbWUgaW4gaGlnaCBwcmlvcml0eSBXUSAqLworCQljZGZfc3RhdHVzID0KKwkJCXdtYV90eF9mcmFtZShwTWFjLCBwUGFja2V0LCAodWludDE2X3QpIG5CeXRlcywKKwkJCQkgICBUWFJYX0ZSTV84MDJfMTFfTUdNVCwgQU5JX1RYRElSX1RPRFMsCisJCQkJICAgNywgbGltX3R4X2NvbXBsZXRlLCBwRnJhbWUsIHR4RmxhZywKKwkJCQkgICBzbWVTZXNzaW9uSWQsIDApOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJfQorI2VuZGlmCisJCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwKKwkJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGNkZl9zdGF0dXMpKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiRmFpbGVkIHRvIHNlbmQgRGUtQXV0aGVudGljYXRpb24gKCVYKSEiKSwKKwkJCQljZGZfc3RhdHVzKTsKKwkJCS8qIFBrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjayAqLworCQl9CisJfQorCit9IC8qIEVuZCBsaW1fc2VuZF9kZWF1dGhfbWdtdF9mcmFtZS4gKi8KKworI2lmZGVmIEFOSV9TVVBQT1JUXzExSAorLyoqCisgKiBcYnJpZWYgU2VuZCBhIE1lYXN1cmVtZW50IFJlcG9ydCBBY3Rpb24gZnJhbWUKKyAqCisgKgorICogXHBhcmFtIHBNYWMgUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcE1lYXNSZXFGcmFtZSBBZGRyZXNzIG9mIGEgdFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZQorICoKKyAqIFxyZXR1cm4gZVNJUl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVTSVJfRkFJTFVSRSBlbHNlCisgKgorICoKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1fc2VuZF9tZWFzX3JlcG9ydF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgdHBTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUgcE1lYXNSZXFGcmFtZSwKKwkJCSAgIHRTaXJNYWNBZGRyIHBlZXIsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdERvdDExZk1lYXN1cmVtZW50UmVwb3J0IGZybTsKKwl1aW50OF90ICpwRnJhbWU7CisJdFNpclJldFN0YXR1cyBuU2lyU3RhdHVzOworCXRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworCXVpbnQzMl90IG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXM7CisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmZnJtLCBzaXplb2YoZnJtKSwgMCk7CisKKwlmcm0uQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9TUEVDVFJVTV9NR01UOworCWZybS5BY3Rpb24uYWN0aW9uID0gU0lSX01BQ19BQ1RJT05fTUVBU1VSRV9SRVBPUlRfSUQ7CisJZnJtLkRpYWxvZ1Rva2VuLnRva2VuID0gcE1lYXNSZXFGcmFtZS0+YWN0aW9uSGVhZGVyLmRpYWxvZ1Rva2VuOworCisJc3dpdGNoIChwTWVhc1JlcUZyYW1lLT5tZWFzUmVxSUUubWVhc1R5cGUpIHsKKwljYXNlIFNJUl9NQUNfQkFTSUNfTUVBU1VSRU1FTlRfVFlQRToKKwkJblNpclN0YXR1cyA9CisJCQlwb3B1bGF0ZV9kb3QxMWZfbWVhc3VyZW1lbnRfcmVwb3J0MChwTWFjLCBwTWVhc1JlcUZyYW1lLAorCQkJCQkJCSAgICAmZnJtLk1lYXN1cmVtZW50UmVwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX0NDQV9NRUFTVVJFTUVOVF9UWVBFOgorCQluU2lyU3RhdHVzID0KKwkJCXBvcHVsYXRlX2RvdDExZl9tZWFzdXJlbWVudF9yZXBvcnQxKHBNYWMsIHBNZWFzUmVxRnJhbWUsCisJCQkJCQkJICAgICZmcm0uTWVhc3VyZW1lbnRSZXBvcnQpOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUlBJX01FQVNVUkVNRU5UX1RZUEU6CisJCW5TaXJTdGF0dXMgPQorCQkJcG9wdWxhdGVfZG90MTFmX21lYXN1cmVtZW50X3JlcG9ydDIocE1hYywgcE1lYXNSZXFGcmFtZSwKKwkJCQkJCQkgICAgJmZybS5NZWFzdXJlbWVudFJlcG9ydCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIlVua25vd24gbWVhc3VyZW1lbnQgdHlwZSAlZCBpbiBsaW1TZW4iCisJCQkJICAgICAgICJkTWVhc1JlcG9ydEZyYW1lLiIpLAorCQkJcE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLm1lYXNUeXBlKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlpZiAoZVNJUl9TVUNDRVNTICE9IG5TaXJTdGF0dXMpCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisKKwluU3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfbWVhc3VyZW1lbnRfcmVwb3J0X3NpemUocE1hYywgJmZybSwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorCQkJCSAgICAgICAib3IgYSBNZWFzdXJlbWVudCBSZXBvcnQgKDB4JTA4eCkuIiksCisJCQluU3RhdHVzKTsKKwkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQluUGF5bG9hZCA9IHNpemVvZih0RG90MTFmTWVhc3VyZW1lbnRSZXBvcnQpOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nICIKKwkJCQkgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBNZWFzdXJlbWVudCBSZXAiCisJCQkJICAgICAgICJvcnQgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsKKworCWNkZl9zdGF0dXMgPQorCQljZHNfcGFja2V0X2FsbG9jKHBNYWMtPmhIZGQsIFRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCSAodWludDE2X3QpIG5CeXRlcywgKHZvaWQgKiopJnBGcmFtZSwKKwkJCQkgKHZvaWQgKiopJnBQYWNrZXQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBEZS0iCisJCQkJICAgICAgICJBdXRoZW50aWNhdGlvbi4iKSwgbkJ5dGVzKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJLyogUGFyYW5vaWE6ICovCisJY2RmX21lbV9zZXQocEZyYW1lLCBuQnl0ZXMsIDApOworCisJLyogTmV4dCwgd2UgZmlsbCBvdXQgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yOiAqLworCWxpbV9wb3B1bGF0ZV9tYWNfaGVhZGVyKHBNYWMsIHBGcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorCQlTSVJfTUFDX01HTVRfQUNUSU9OLCBwZWVyKTsKKwlwTWFjSGRyID0gKHRwU2lyTWFjTWdtdEhkcikgcEZyYW1lOworCisJY2RmX21lbV9jb3B5KHBNYWNIZHItPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJbGltX3NldF9wcm90ZWN0ZWRfYml0KHBNYWMsIHBzZXNzaW9uRW50cnksIHBlZXIsIHBNYWNIZHIpOworI2VuZGlmCisKKwluU3RhdHVzID0gZG90MTFmX3BhY2tfbWVhc3VyZW1lbnRfcmVwb3J0KHBNYWMsICZmcm0sIHBGcmFtZSArCisJCQkJCQkgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKwkJCQkJCSBuUGF5bG9hZCwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhY2sgYSBNZWFzdXJlbWVudCBSZXBvcnQgKDB4JTA4eCkuIiksCisJCQluU3RhdHVzKTsKKwkJY2RzX3BhY2tldF9mcmVlKHBNYWMtPmhIZGQsIFRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCSh2b2lkICopcEZyYW1lLCAodm9pZCAqKXBQYWNrZXQpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvKiBhbGxvY2F0ZWQhICovCisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIE0iCisJCQkJICAgICAgICJlYXN1cmVtZW50IFJlcG9ydCAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgKChwc2Vzc2lvbkVudHJ5KSA/IHBzZXNzaW9uRW50cnktPgorCQkJICBwZVNlc3Npb25JZCA6IE5PX1NFU1NJT04pLCBwTWFjSGRyLT5mYy5zdWJUeXBlKSk7CisJY2RmX3N0YXR1cyA9CisJCXdtYV90eF9mcmFtZShwTWFjLCBwUGFja2V0LCAodWludDE2X3QpIG5CeXRlcywKKwkJCSAgIFRYUlhfRlJNXzgwMl8xMV9NR01ULCBBTklfVFhESVJfVE9EUywgNywKKwkJCSAgIGxpbV90eF9jb21wbGV0ZSwgcEZyYW1lLCAwLCAwKTsKKwlNVFJBQ0UoY2RmX3RyYWNlCisJCSAgICAgICAoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwKKwkJICAgICAgICgocHNlc3Npb25FbnRyeSkgPyBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCA6IE5PX1NFU1NJT04pLAorCQkgICAgICAgY2RmX3N0YXR1cykpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gc2VuZCBhIE1lYXN1cmVtZW50IFJlcG9ydCAgKCVYKSEiKSwKKwkJCWNkZl9zdGF0dXMpOworCQkvKiBQa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sgKi8KKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsgICAgLyoganVzdCBhbGxvY2F0ZWQuLi4gKi8KKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qIEVuZCBsaW1fc2VuZF9tZWFzX3JlcG9ydF9mcmFtZS4gKi8KKworLyoqCisgKiBcYnJpZWYgU2VuZCBhIFRQQyBSZXF1ZXN0IEFjdGlvbiBmcmFtZQorICoKKyAqCisgKiBccGFyYW0gcE1hYyBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIGRhdGFzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcGVlciBNQUMgYWRkcmVzcyB0byB3aGljaCB0aGUgZnJhbWUgc2hvdWxkIGJlIHNlbnQKKyAqCisgKgorICovCisKK3ZvaWQKK2xpbV9zZW5kX3RwY19yZXF1ZXN0X2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICB0U2lyTWFjQWRkciBwZWVyLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXREb3QxMWZUUENSZXF1ZXN0IGZybTsKKwl1aW50OF90ICpwRnJhbWU7CisJdHBTaXJNYWNNZ210SGRyIHBNYWNIZHI7CisJdWludDMyX3QgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1czsKKwl2b2lkICpwUGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZmcm0sIHNpemVvZihmcm0pLCAwKTsKKworCWZybS5DYXRlZ29yeS5jYXRlZ29yeSA9IFNJUl9NQUNfQUNUSU9OX1NQRUNUUlVNX01HTVQ7CisJZnJtLkFjdGlvbi5hY3Rpb24gPSBTSVJfTUFDX0FDVElPTl9UUENfUkVRVUVTVF9JRDsKKwlmcm0uRGlhbG9nVG9rZW4udG9rZW4gPSAxOworCWZybS5UUENSZXF1ZXN0LnByZXNlbnQgPSAxOworCisJblN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX3RwY19yZXF1ZXN0X3NpemUocE1hYywgJmZybSwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorCQkJCSAgICAgICAib3IgYSBUUEMgUmVxdWVzdCAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZlRQQ1JlcXVlc3QpOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nICIKKwkJCQkgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBUUEMgUmVxdWVzdCAoMHgiCisJCQkJICAgICAgICIlMDh4KS4iKSwgblN0YXR1cyk7CisJfQorCisJbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YodFNpck1hY01nbXRIZHIpOworCisJY2RmX3N0YXR1cyA9CisJCWNkc19wYWNrZXRfYWxsb2MocE1hYy0+aEhkZCwgVFhSWF9GUk1fODAyXzExX01HTVQsCisJCQkJICh1aW50MTZfdCkgbkJ5dGVzLCAodm9pZCAqKikmcEZyYW1lLAorCQkJCSAodm9pZCAqKikmcFBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhIFRQQyIKKwkJCQkgICAgICAgIiBSZXF1ZXN0LiIpLCBuQnl0ZXMpOworCQlyZXR1cm47CisJfQorCS8qIFBhcmFub2lhOiAqLworCWNkZl9tZW1fc2V0KHBGcmFtZSwgbkJ5dGVzLCAwKTsKKworCS8qIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjogKi8KKwlsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcihwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJU0lSX01BQ19NR01UX0FDVElPTiwgcGVlcik7CisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIHBGcmFtZTsKKworCWNkZl9tZW1fY29weShwTWFjSGRyLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWxpbV9zZXRfcHJvdGVjdGVkX2JpdChwTWFjLCBwc2Vzc2lvbkVudHJ5LCBwZWVyLCBwTWFjSGRyKTsKKyNlbmRpZgorCisJblN0YXR1cyA9IGRvdDExZl9wYWNrX3RwY19yZXF1ZXN0KHBNYWMsICZmcm0sIHBGcmFtZSArCisJCQkJCSAgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKwkJCQkJICBuUGF5bG9hZCwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFjayBhIFRQQyBSZXF1ZXN0ICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJCWNkc19wYWNrZXRfZnJlZShwTWFjLT5oSGRkLCBUWFJYX0ZSTV84MDJfMTFfTUdNVCwKKwkJCQkodm9pZCAqKXBGcmFtZSwgKHZvaWQgKilwUGFja2V0KTsKKwkJcmV0dXJuOyAgICAgICAgIC8qIGFsbG9jYXRlZCEgKi8KKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIGEgVCIKKwkJCQkgICAgICAgIlBDIFJlcXVlc3QgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9NR01ULAorCQkJICgocHNlc3Npb25FbnRyeSkgPyBwc2Vzc2lvbkVudHJ5LT4KKwkJCSAgcGVTZXNzaW9uSWQgOiBOT19TRVNTSU9OKSwgcE1hY0hkci0+ZmMuc3ViVHlwZSkpOworCWNkZl9zdGF0dXMgPQorCQl3bWFfdHhfZnJhbWUocE1hYywgcFBhY2tldCwgKHVpbnQxNl90KSBuQnl0ZXMsCisJCQkgICBUWFJYX0ZSTV84MDJfMTFfTUdNVCwgQU5JX1RYRElSX1RPRFMsIDcsCisJCQkgICBsaW1fdHhfY29tcGxldGUsIHBGcmFtZSwgMCwgMCk7CisJTVRSQUNFKGNkZl90cmFjZQorCQkgICAgICAgKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfQ09NUExFVEUsCisJCSAgICAgICAoKHBzZXNzaW9uRW50cnkpID8gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQgOiBOT19TRVNTSU9OKSwKKwkJICAgICAgIGNkZl9zdGF0dXMpKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHNlbmQgYSBUUEMgUmVxdWVzdCAoJVgpISIpLAorCQkJY2RmX3N0YXR1cyk7CisJCS8qIFBrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjayAqLworCX0KKworfSAvKiBFbmQgbGltX3NlbmRfdHBjX3JlcXVlc3RfZnJhbWUuICovCisKKy8qKgorICogXGJyaWVmIFNlbmQgYSBUUEMgUmVwb3J0IEFjdGlvbiBmcmFtZQorICoKKyAqCisgKiBccGFyYW0gcE1hYyBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIGRhdGFzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcFRwY1JlcUZyYW1lIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFRQQyBSZXF1ZXN0CisgKgorICogXHJldHVybiBlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcywgZVNJUl9GQUlMVVJFIGVsc2UKKyAqCisgKgorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbV9zZW5kX3RwY19yZXBvcnRfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgdHBTaXJNYWNUcGNSZXFBY3Rpb25GcmFtZSBwVHBjUmVxRnJhbWUsCisJCQkgIHRTaXJNYWNBZGRyIHBlZXIsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdERvdDExZlRQQ1JlcG9ydCBmcm07CisJdWludDhfdCAqcEZyYW1lOworCXRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworCXVpbnQzMl90IG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXM7CisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmZnJtLCBzaXplb2YoZnJtKSwgMCk7CisKKwlmcm0uQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9TUEVDVFJVTV9NR01UOworCWZybS5BY3Rpb24uYWN0aW9uID0gU0lSX01BQ19BQ1RJT05fVFBDX1JFUE9SVF9JRDsKKwlmcm0uRGlhbG9nVG9rZW4udG9rZW4gPSBwVHBjUmVxRnJhbWUtPmFjdGlvbkhlYWRlci5kaWFsb2dUb2tlbjsKKworCWZybS5UUENSZXBvcnQudHhfcG93ZXIgPSAwOworCWZybS5UUENSZXBvcnQubGlua19tYXJnaW4gPSAwOworCWZybS5UUENSZXBvcnQucHJlc2VudCA9IDE7CisKKwluU3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfdHBjX3JlcG9ydF9zaXplKHBNYWMsICZmcm0sICZuUGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKwkJCQkgICAgICAgIm9yIGEgVFBDIFJlcG9ydCAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZlRQQ1JlcG9ydCk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmcgIgorCQkJCSAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIFRQQyBSZXBvcnQgKDB4IgorCQkJCSAgICAgICAiJTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsKKworCWNkZl9zdGF0dXMgPQorCQljZHNfcGFja2V0X2FsbG9jKHBNYWMtPmhIZGQsIFRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCSAodWludDE2X3QpIG5CeXRlcywgKHZvaWQgKiopJnBGcmFtZSwKKwkJCQkgKHZvaWQgKiopJnBQYWNrZXQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBUUEMiCisJCQkJICAgICAgICIgUmVwb3J0LiIpLCBuQnl0ZXMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwkvKiBQYXJhbm9pYTogKi8KKwljZGZfbWVtX3NldChwRnJhbWUsIG5CeXRlcywgMCk7CisKKwkvKiBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6ICovCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIocE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisJCVNJUl9NQUNfTUdNVF9BQ1RJT04sIHBlZXIpOworCisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIHBGcmFtZTsKKworCWNkZl9tZW1fY29weShwTWFjSGRyLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWxpbV9zZXRfcHJvdGVjdGVkX2JpdChwTWFjLCBwc2Vzc2lvbkVudHJ5LCBwZWVyLCBwTWFjSGRyKTsKKyNlbmRpZgorCisJblN0YXR1cyA9IGRvdDExZl9wYWNrX3RwY19yZXBvcnQocE1hYywgJmZybSwgcEZyYW1lICsKKwkJCQkJIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCSBuUGF5bG9hZCwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFjayBhIFRQQyBSZXBvcnQgKDB4JTA4eCkuIiksCisJCQluU3RhdHVzKTsKKwkJY2RzX3BhY2tldF9mcmVlKHBNYWMtPmhIZGQsIFRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCSh2b2lkICopcEZyYW1lLCAodm9pZCAqKXBQYWNrZXQpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvKiBhbGxvY2F0ZWQhICovCisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIFQiCisJCQkJICAgICAgICJQQyBSZXBvcnQgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9NR01ULAorCQkJICgocHNlc3Npb25FbnRyeSkgPyBwc2Vzc2lvbkVudHJ5LT4KKwkJCSAgcGVTZXNzaW9uSWQgOiBOT19TRVNTSU9OKSwgcE1hY0hkci0+ZmMuc3ViVHlwZSkpOworCWNkZl9zdGF0dXMgPQorCQl3bWFfdHhfZnJhbWUocE1hYywgcFBhY2tldCwgKHVpbnQxNl90KSBuQnl0ZXMsCisJCQkgICBUWFJYX0ZSTV84MDJfMTFfTUdNVCwgQU5JX1RYRElSX1RPRFMsIDcsCisJCQkgICBsaW1fdHhfY29tcGxldGUsIHBGcmFtZSwgMCwgMCk7CisJTVRSQUNFKGNkZl90cmFjZQorCQkgICAgICAgKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfQ09NUExFVEUsCisJCSAgICAgICAoKHBzZXNzaW9uRW50cnkpID8gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQgOiBOT19TRVNTSU9OKSwKKwkJICAgICAgIGNkZl9zdGF0dXMpKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHNlbmQgYSBUUEMgUmVwb3J0ICglWCkhIiksCisJCQljZGZfc3RhdHVzKTsKKwkJLyogUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrICovCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7ICAgIC8qIGp1c3QgYWxsb2NhdGVkLi4uICovCisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvKiBFbmQgbGltX3NlbmRfdHBjX3JlcG9ydF9mcmFtZS4gKi8KKyNlbmRpZiAvKiBBTklfU1VQUE9SVF8xMUggKi8KKworLyoqCisgKiBcYnJpZWYgU2VuZCBhIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudAorICoKKyAqCisgKiBccGFyYW0gcE1hYyBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIGRhdGFzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcGVlciBNQUMgYWRkcmVzcyB0byB3aGljaCB0aGlzIGZyYW1lIHdpbGwgYmUgc2VudAorICoKKyAqIFxwYXJhbSBuTW9kZQorICoKKyAqIFxwYXJhbSBuTmV3Q2hhbm5lbAorICoKKyAqIFxwYXJhbSBuQ291bnQKKyAqCisgKiBccmV0dXJuIGVTSVJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlU0lSX0ZBSUxVUkUgZWxzZQorICoKKyAqCisgKi8KKwordFNpclJldFN0YXR1cworbGltX3NlbmRfY2hhbm5lbF9zd2l0Y2hfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgIHRTaXJNYWNBZGRyIHBlZXIsCisJCQkJICAgdWludDhfdCBuTW9kZSwKKwkJCQkgICB1aW50OF90IG5OZXdDaGFubmVsLAorCQkJCSAgIHVpbnQ4X3QgbkNvdW50LCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXREb3QxMWZDaGFubmVsU3dpdGNoIGZybTsKKwl1aW50OF90ICpwRnJhbWU7CisJdHBTaXJNYWNNZ210SGRyIHBNYWNIZHI7CisJdWludDMyX3QgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1czsgICAgIC8qICwgbkNmZzsgKi8KKwl2b2lkICpwUGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl1aW50OF90IHR4RmxhZyA9IDA7CisKKwl1aW50OF90IHNtZVNlc3Npb25JZCA9IDA7CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJTZXNzaW9uIGVudHJ5IGlzIE5VTEwhISEiKSk7KQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlzbWVTZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmZnJtLCBzaXplb2YoZnJtKSwgMCk7CisKKwlmcm0uQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9TUEVDVFJVTV9NR01UOworCWZybS5BY3Rpb24uYWN0aW9uID0gU0lSX01BQ19BQ1RJT05fQ0hBTk5FTF9TV0lUQ0hfSUQ7CisJZnJtLkNoYW5Td2l0Y2hBbm4uc3dpdGNoTW9kZSA9IG5Nb2RlOworCWZybS5DaGFuU3dpdGNoQW5uLm5ld0NoYW5uZWwgPSBuTmV3Q2hhbm5lbDsKKwlmcm0uQ2hhblN3aXRjaEFubi5zd2l0Y2hDb3VudCA9IG5Db3VudDsKKwlmcm0uQ2hhblN3aXRjaEFubi5wcmVzZW50ID0gMTsKKworCW5TdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9jaGFubmVsX3N3aXRjaF9zaXplKHBNYWMsICZmcm0sICZuUGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKwkJCQkgICAgICAgIm9yIGEgQ2hhbm5lbCBTd2l0Y2ggKDB4JTA4eCkuIiksCisJCQluU3RhdHVzKTsKKwkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQluUGF5bG9hZCA9IHNpemVvZih0RG90MTFmQ2hhbm5lbFN3aXRjaCk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmcgIgorCQkJCSAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIENoYW5uZWwgU3dpdGNoICgweCIKKwkJCQkgICAgICAgIiUwOHgpLiIpLCBuU3RhdHVzKTsKKwl9CisKKwluQnl0ZXMgPSBuUGF5bG9hZCArIHNpemVvZih0U2lyTWFjTWdtdEhkcik7CisKKwljZGZfc3RhdHVzID0KKwkJY2RzX3BhY2tldF9hbGxvYygodWludDE2X3QpIG5CeXRlcywgKHZvaWQgKiopJnBGcmFtZSwKKwkJCQkgKHZvaWQgKiopJnBQYWNrZXQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBUUEMiCisJCQkJICAgICAgICIgUmVwb3J0LiIpLCBuQnl0ZXMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwkvKiBQYXJhbm9pYTogKi8KKwljZGZfbWVtX3NldChwRnJhbWUsIG5CeXRlcywgMCk7CisKKwkvKiBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6ICovCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIocE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisJCVNJUl9NQUNfTUdNVF9BQ1RJT04sIHBlZXIsCisJCXBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKTsKKwlwTWFjSGRyID0gKHRwU2lyTWFjTWdtdEhkcikgcEZyYW1lOworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwTWFjSGRyLT5ic3NJZCwKKwkJICAgICAodWludDhfdCAqKSBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJbGltX3NldF9wcm90ZWN0ZWRfYml0KHBNYWMsIHBzZXNzaW9uRW50cnksIHBlZXIsIHBNYWNIZHIpOworI2VuZGlmCisKKwluU3RhdHVzID0gZG90MTFmX3BhY2tfY2hhbm5lbF9zd2l0Y2gocE1hYywgJmZybSwgcEZyYW1lICsKKwkJCQkJICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpLAorCQkJCQkgICAgIG5QYXlsb2FkLCAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gcGFjayBhIENoYW5uZWwgU3dpdGNoICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXBQYWNrZXQpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvKiBhbGxvY2F0ZWQhICovCisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIEMiCisJCQkJICAgICAgICJoYW5uZWwgU3dpdGNoICgweCUwOHgpLiIpLCBuU3RhdHVzKTsKKwl9CisKKwlpZiAoKFNJUl9CQU5EXzVfR0haID09IGxpbV9nZXRfcmZfYmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorCSAgICB8fCAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKQorCSAgICApIHsKKwkJdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIHBNYWNIZHItPmZjLnN1YlR5cGUpKTsKKwljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCVRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCUFOSV9UWERJUl9UT0RTLAorCQkJCTcsIGxpbV90eF9jb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcsCisJCQkJc21lU2Vzc2lvbklkLCAwKTsKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfQ09NUExFVEUsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGNkZl9zdGF0dXMpKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHNlbmQgYSBDaGFubmVsIFN3aXRjaCAoJVgpISIpLAorCQkJY2RmX3N0YXR1cyk7CisJCS8qIFBrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjayAqLworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIGxpbV9zZW5kX2NoYW5uZWxfc3dpdGNoX21nbXRfZnJhbWUuICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQwordFNpclJldFN0YXR1cworbGltX3NlbmRfdmh0X29wbW9kZV9ub3RpZmljYXRpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICAgdFNpck1hY0FkZHIgcGVlciwKKwkJCQkgICAgICAgdWludDhfdCBuTW9kZSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0RG90MTFmT3BlcmF0aW5nTW9kZSBmcm07CisJdWludDhfdCAqcEZyYW1lOworCXRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworCXVpbnQzMl90IG5CeXRlcywgblBheWxvYWQgPSAwLCBuU3RhdHVzOyAvKiAsIG5DZmc7ICovCisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdWludDhfdCB0eEZsYWcgPSAwOworCisJdWludDhfdCBzbWVTZXNzaW9uSWQgPSAwOworCisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiU2Vzc2lvbiBlbnRyeSBpcyBOVUxMISEhIikpOykKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJc21lU2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJmZybSwgc2l6ZW9mKGZybSksIDApOworCisJZnJtLkNhdGVnb3J5LmNhdGVnb3J5ID0gU0lSX01BQ19BQ1RJT05fVkhUOworCWZybS5BY3Rpb24uYWN0aW9uID0gU0lSX01BQ19WSFRfT1BNT0RFX05PVElGSUNBVElPTjsKKwlmcm0uT3BlcmF0aW5nTW9kZS5jaGFuV2lkdGggPSBuTW9kZTsKKwlmcm0uT3BlcmF0aW5nTW9kZS5yeE5TUyA9IDA7CisJZnJtLk9wZXJhdGluZ01vZGUucnhOU1NUeXBlID0gMDsKKworCW5TdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9vcGVyYXRpbmdfbW9kZV9zaXplKHBNYWMsICZmcm0sICZuUGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKwkJCQkgICAgICAgIm9yIGEgT3BlcmF0aW5nIE1vZGUgKDB4JTA4eCkuIiksCisJCQluU3RhdHVzKTsKKwkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQluUGF5bG9hZCA9IHNpemVvZih0RG90MTFmT3BlcmF0aW5nTW9kZSk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmcgIgorCQkJCSAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIE9wZXJhdGluZyBNb2RlICgweCIKKwkJCQkgICAgICAgIiUwOHgpLiIpLCBuU3RhdHVzKTsKKwl9CisKKwluQnl0ZXMgPSBuUGF5bG9hZCArIHNpemVvZih0U2lyTWFjTWdtdEhkcik7CisKKwljZGZfc3RhdHVzID0KKwkJY2RzX3BhY2tldF9hbGxvYygodWludDE2X3QpIG5CeXRlcywgKHZvaWQgKiopJnBGcmFtZSwKKwkJCQkgKHZvaWQgKiopJnBQYWNrZXQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgT3BlcmF0aW5nIE1vZGUiCisJCQkgICAiIFJlcG9ydC4iKSwgbkJ5dGVzKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJLyogUGFyYW5vaWE6ICovCisJY2RmX21lbV9zZXQocEZyYW1lLCBuQnl0ZXMsIDApOworCisJLyogTmV4dCwgd2UgZmlsbCBvdXQgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yOiAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1NBUF9NT0RFKQorCQlsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcihwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJCVNJUl9NQUNfTUdNVF9BQ1RJT04sIHBlZXIsCisJCQlwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisJZWxzZQorCQlsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcihwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJCVNJUl9NQUNfTUdNVF9BQ1RJT04sIHBzZXNzaW9uRW50cnktPmJzc0lkLAorCQkJcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworCXBNYWNIZHIgPSAodHBTaXJNYWNNZ210SGRyKSBwRnJhbWU7CisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBNYWNIZHItPmJzc0lkLAorCQkgICAgICh1aW50OF90ICopIHBzZXNzaW9uRW50cnktPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwluU3RhdHVzID0gZG90MTFmX3BhY2tfb3BlcmF0aW5nX21vZGUocE1hYywgJmZybSwgcEZyYW1lICsKKwkJCQkJICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpLAorCQkJCQkgICAgIG5QYXlsb2FkLCAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gcGFjayBhIE9wZXJhdGluZyBNb2RlICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXBQYWNrZXQpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvKiBhbGxvY2F0ZWQhICovCisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgYSBPcGVyYXRpbmcgTW9kZSIKKwkJCSAgICIgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKwlpZiAoKFNJUl9CQU5EXzVfR0haID09IGxpbV9nZXRfcmZfYmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorCSAgICB8fCAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKQorCSAgICApIHsKKwkJdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIHBNYWNIZHItPmZjLnN1YlR5cGUpKTsKKwljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCVRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCUFOSV9UWERJUl9UT0RTLAorCQkJCTcsIGxpbV90eF9jb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcsCisJCQkJc21lU2Vzc2lvbklkLCAwKTsKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfQ09NUExFVEUsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGNkZl9zdGF0dXMpKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHNlbmQgYSBDaGFubmVsIFN3aXRjaCAoJVgpISIpLAorCQkJY2RmX3N0YXR1cyk7CisJCS8qIFBrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjayAqLworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKgorICogXGJyaWVmIFNlbmQgYSBWSFQgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50CisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgZGF0YXN0cnVjdHVyZQorICoKKyAqIFxwYXJhbSBwZWVyIE1BQyBhZGRyZXNzIHRvIHdoaWNoIHRoaXMgZnJhbWUgd2lsbCBiZSBzZW50CisgKgorICogXHBhcmFtIG5DaGFuV2lkdGgKKyAqCisgKiBccGFyYW0gbk5ld0NoYW5uZWwKKyAqCisgKgorICogXHJldHVybiBlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcywgZVNJUl9GQUlMVVJFIGVsc2UKKyAqCisgKgorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbV9zZW5kX3ZodF9jaGFubmVsX3N3aXRjaF9tZ210X2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICAgIHRTaXJNYWNBZGRyIHBlZXIsCisJCQkJICAgICAgIHVpbnQ4X3QgbkNoYW5XaWR0aCwKKwkJCQkgICAgICAgdWludDhfdCBuTmV3Q2hhbm5lbCwKKwkJCQkgICAgICAgdWludDhfdCBuY2JNb2RlLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXREb3QxMWZDaGFubmVsU3dpdGNoIGZybTsKKwl1aW50OF90ICpwRnJhbWU7CisJdHBTaXJNYWNNZ210SGRyIHBNYWNIZHI7CisJdWludDMyX3QgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1czsgICAgIC8qICwgbkNmZzsgKi8KKwl2b2lkICpwUGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl1aW50OF90IHR4RmxhZyA9IDA7CisKKwl1aW50OF90IHNtZVNlc3Npb25JZCA9IDA7CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJTZXNzaW9uIGVudHJ5IGlzIE5VTEwhISEiKSk7KQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlzbWVTZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmZnJtLCBzaXplb2YoZnJtKSwgMCk7CisKKwlmcm0uQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9TUEVDVFJVTV9NR01UOworCWZybS5BY3Rpb24uYWN0aW9uID0gU0lSX01BQ19BQ1RJT05fQ0hBTk5FTF9TV0lUQ0hfSUQ7CisJZnJtLkNoYW5Td2l0Y2hBbm4uc3dpdGNoTW9kZSA9IDE7CisJZnJtLkNoYW5Td2l0Y2hBbm4ubmV3Q2hhbm5lbCA9IG5OZXdDaGFubmVsOworCWZybS5DaGFuU3dpdGNoQW5uLnN3aXRjaENvdW50ID0gMTsKKwlmcm0uc2VjX2NoYW5fb2Zmc2V0X2VsZS5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0KKwkJCQkJCWxpbV9nZXRfaHRjYl9zdGF0ZShuY2JNb2RlKTsKKwlmcm0uc2VjX2NoYW5fb2Zmc2V0X2VsZS5wcmVzZW50ID0gMTsKKwlmcm0uV2lkZXJCV0NoYW5Td2l0Y2hBbm4ubmV3Q2hhbldpZHRoID0gbkNoYW5XaWR0aDsKKwlmcm0uV2lkZXJCV0NoYW5Td2l0Y2hBbm4ubmV3Q2VudGVyQ2hhbkZyZXEwID0KKwkJbGltX2dldF9jZW50ZXJfY2hhbm5lbChwTWFjLCBuTmV3Q2hhbm5lbCwgbmNiTW9kZSwgbkNoYW5XaWR0aCk7CisJZnJtLldpZGVyQldDaGFuU3dpdGNoQW5uLm5ld0NlbnRlckNoYW5GcmVxMSA9IDA7CisJZnJtLkNoYW5Td2l0Y2hBbm4ucHJlc2VudCA9IDE7CisJZnJtLldpZGVyQldDaGFuU3dpdGNoQW5uLnByZXNlbnQgPSAxOworCisJblN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2NoYW5uZWxfc3dpdGNoX3NpemUocE1hYywgJmZybSwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorCQkJCSAgICAgICAib3IgYSBDaGFubmVsIFN3aXRjaCAoMHglMDh4KS4iKSwKKwkJCW5TdGF0dXMpOworCQkvKiBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86ICovCisJCW5QYXlsb2FkID0gc2l6ZW9mKHREb3QxMWZDaGFubmVsU3dpdGNoKTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyAiCisJCQkJICAgICAgICJ0aGUgcGFja2VkIHNpemUgZm9yIGEgQ2hhbm5lbCBTd2l0Y2ggKDB4IgorCQkJCSAgICAgICAiJTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsKKworCWNkZl9zdGF0dXMgPQorCQljZHNfcGFja2V0X2FsbG9jKCh1aW50MTZfdCkgbkJ5dGVzLCAodm9pZCAqKikmcEZyYW1lLAorCQkJCSAodm9pZCAqKikmcFBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhIFRQQyIKKwkJCQkgICAgICAgIiBSZXBvcnQuIiksIG5CeXRlcyk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIFBhcmFub2lhOiAqLworCWNkZl9tZW1fc2V0KHBGcmFtZSwgbkJ5dGVzLCAwKTsKKworCS8qIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjogKi8KKwlsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcihwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJU0lSX01BQ19NR01UX0FDVElPTiwgcGVlciwgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworCXBNYWNIZHIgPSAodHBTaXJNYWNNZ210SGRyKSBwRnJhbWU7CisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBNYWNIZHItPmJzc0lkLAorCQkgICAgICh1aW50OF90ICopIHBzZXNzaW9uRW50cnktPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwluU3RhdHVzID0gZG90MTFmX3BhY2tfY2hhbm5lbF9zd2l0Y2gocE1hYywgJmZybSwgcEZyYW1lICsKKwkJCQkJICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpLAorCQkJCQkgICAgIG5QYXlsb2FkLCAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gcGFjayBhIENoYW5uZWwgU3dpdGNoICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXBQYWNrZXQpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvKiBhbGxvY2F0ZWQhICovCisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIEMiCisJCQkJICAgICAgICJoYW5uZWwgU3dpdGNoICgweCUwOHgpLiIpLCBuU3RhdHVzKTsKKwl9CisKKwlpZiAoKFNJUl9CQU5EXzVfR0haID09IGxpbV9nZXRfcmZfYmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorCSAgICB8fCAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKQorCSAgICApIHsKKwkJdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIHBNYWNIZHItPmZjLnN1YlR5cGUpKTsKKwljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lKHBNYWMsIHBQYWNrZXQsICh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCVRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCUFOSV9UWERJUl9UT0RTLAorCQkJCTcsIGxpbV90eF9jb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcsCisJCQkJc21lU2Vzc2lvbklkLCAwKTsKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfQ09NUExFVEUsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGNkZl9zdGF0dXMpKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHNlbmQgYSBDaGFubmVsIFN3aXRjaCAoJVgpISIpLAorCQkJY2RmX3N0YXR1cyk7CisJCS8qIFBrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjayAqLworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIGxpbV9zZW5kX3ZodF9jaGFubmVsX3N3aXRjaF9tZ210X2ZyYW1lLiAqLworCisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCisvKioKKyAqIFxicmllZiBTZW5kIGEgTmVpZ2hib3IgUmVwb3J0IFJlcXVlc3QgQWN0aW9uIGZyYW1lCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogXHBhcmFtIHBOZWlnaGJvclJlcSBBZGRyZXNzIG9mIGEgdFNpck1hY05laWdoYm9yUmVwb3J0UmVxCisgKgorICogXHBhcmFtIHBlZXIgbWFjIGFkZHJlc3Mgb2YgcGVlciBzdGF0aW9uLgorICoKKyAqIFxwYXJhbSBwc2Vzc2lvbkVudHJ5IGFkZHJlc3Mgb2Ygc2Vzc2lvbiBlbnRyeS4KKyAqCisgKiBccmV0dXJuIGVTSVJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlU0lSX0ZBSUxVUkUgZWxzZQorICoKKyAqCisgKi8KKwordFNpclJldFN0YXR1cworbGltX3NlbmRfbmVpZ2hib3JfcmVwb3J0X3JlcXVlc3RfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICAgdHBTaXJNYWNOZWlnaGJvclJlcG9ydFJlcSBwTmVpZ2hib3JSZXEsCisJCQkJICAgICAgIHRTaXJNYWNBZGRyIHBlZXIsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpclJldFN0YXR1cyBzdGF0dXNDb2RlID0gZVNJUl9TVUNDRVNTOworCXREb3QxMWZOZWlnaGJvclJlcG9ydFJlcXVlc3QgZnJtOworCXVpbnQ4X3QgKnBGcmFtZTsKKwl0cFNpck1hY01nbXRIZHIgcE1hY0hkcjsKKwl1aW50MzJfdCBuQnl0ZXMsIG5QYXlsb2FkLCBuU3RhdHVzOworCXZvaWQgKnBQYWNrZXQ7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXVpbnQ4X3QgdHhGbGFnID0gMDsKKwl1aW50OF90IHNtZVNlc3Npb25JZCA9IDA7CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCIocHNlc3Npb24gPT0gTlVMTCkgaW4gUmVxdWVzdCB0byBzZW5kIE5laWdoYm9yIFJlcG9ydCByZXF1ZXN0IGFjdGlvbiBmcmFtZSIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJc21lU2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZmcm0sIHNpemVvZihmcm0pLCAwKTsKKworCWZybS5DYXRlZ29yeS5jYXRlZ29yeSA9IFNJUl9NQUNfQUNUSU9OX1JSTTsKKwlmcm0uQWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfUlJNX05FSUdIQk9SX1JFUTsKKwlmcm0uRGlhbG9nVG9rZW4udG9rZW4gPSBwTmVpZ2hib3JSZXEtPmRpYWxvZ1Rva2VuOworCisJaWYgKHBOZWlnaGJvclJlcS0+c3NpZF9wcmVzZW50KSB7CisJCXBvcHVsYXRlX2RvdDExZl9zc2lkKHBNYWMsICZwTmVpZ2hib3JSZXEtPnNzaWQsICZmcm0uU1NJRCk7CisJfQorCisJblN0YXR1cyA9CisJCWRvdDExZl9nZXRfcGFja2VkX25laWdoYm9yX3JlcG9ydF9yZXF1ZXN0X3NpemUocE1hYywgJmZybSwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorCQkJCSAgICAgICAib3IgYSBOZWlnaGJvciBSZXBvcnQgUmVxdWVzdCgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZk5laWdoYm9yUmVwb3J0UmVxdWVzdCk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmcgIgorCQkJCSAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIE5laWdoYm9yIFJlcCIKKwkJCQkgICAgICAgIm9ydCBSZXF1ZXN0KDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsKKworCWNkZl9zdGF0dXMgPQorCQljZHNfcGFja2V0X2FsbG9jKCh1aW50MTZfdCkgbkJ5dGVzLCAodm9pZCAqKikmcEZyYW1lLAorCQkJCSAodm9pZCAqKikmcFBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBOZWlnaGJvciAiCisJCQkgICAiUmVwb3J0IFJlcXVlc3QuIiksIG5CeXRlcyk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIFBhcmFub2lhOiAqLworCWNkZl9tZW1fc2V0KHBGcmFtZSwgbkJ5dGVzLCAwKTsKKworCS8qIENvcHkgbmVjZXNzYXJ5IGluZm8gdG8gQkQgKi8KKwlsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcihwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJU0lSX01BQ19NR01UX0FDVElPTiwgcGVlciwgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworCisJLyogVXBkYXRlIEEzIHdpdGggdGhlIEJTU0lEICovCisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIHBGcmFtZTsKKworCXNpcl9jb3B5X21hY19hZGRyKHBNYWNIZHItPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJbGltX3NldF9wcm90ZWN0ZWRfYml0KHBNYWMsIHBzZXNzaW9uRW50cnksIHBlZXIsIHBNYWNIZHIpOworI2VuZGlmCisKKwkvKiBOb3csIHdlJ3JlIHJlYWR5IHRvICJwYWNrIiB0aGUgZnJhbWVzICovCisJblN0YXR1cyA9IGRvdDExZl9wYWNrX25laWdoYm9yX3JlcG9ydF9yZXF1ZXN0KHBNYWMsCisJCQkJCQkgICAgICAmZnJtLAorCQkJCQkJICAgICAgcEZyYW1lICsKKwkJCQkJCSAgICAgIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCQkgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkKTsKKworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJGYWlsZWQgdG8gcGFjayBhbiBOZWlnaGJvciBSZXBvcnQgUmVxdWVzdCAoMHglMDh4KS4iKSwKKwkJCW5TdGF0dXMpOworCisJCS8qIEZJWE1FIC0gTmVlZCB0byBjb252ZXJ0IHRvIHRTaXJSZXRTdGF0dXMgKi8KKwkJc3RhdHVzQ29kZSA9IGVTSVJfRkFJTFVSRTsKKwkJZ290byByZXR1cm5BZnRlckVycm9yOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIE5laWdoYm9yIFJlcG9ydCAiCisJCQkgICAiUmVxdWVzdCAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJfQorCisJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiU2VuZGluZyBhIE5laWdoYm9yIFJlcG9ydCBSZXF1ZXN0IHRvICIpKTsKKwlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcGVlciwgTE9HVyk7CisKKwlpZiAoKFNJUl9CQU5EXzVfR0haID09IGxpbV9nZXRfcmZfYmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorCSAgICB8fCAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKQorCSAgICApIHsKKwkJdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIHBNYWNIZHItPmZjLnN1YlR5cGUpKTsKKwljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lKHBNYWMsCisJCQkJcFBhY2tldCwKKwkJCQkodWludDE2X3QpIG5CeXRlcywKKwkJCQlUWFJYX0ZSTV84MDJfMTFfTUdNVCwKKwkJCQlBTklfVFhESVJfVE9EUywKKwkJCQk3LCBsaW1fdHhfY29tcGxldGUsIHBGcmFtZSwgdHhGbGFnLAorCQkJCXNtZVNlc3Npb25JZCwgMCk7CisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX0NPTVBMRVRFLAorCQkJIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBjZGZfc3RhdHVzKSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfc3RhdHVzKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJ3bWFfdHhfZnJhbWUgRkFJTEVEISBTdGF0dXMgWyVkXSIpLAorCQkJICAgICAgIGNkZl9zdGF0dXMpOworCQkgICAgICAgKQorCQlzdGF0dXNDb2RlID0gZVNJUl9GQUlMVVJFOworCQkvKiBQa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sgKi8KKwkJcmV0dXJuIHN0YXR1c0NvZGU7CisJfSBlbHNlCisJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK3JldHVybkFmdGVyRXJyb3I6CisJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopcFBhY2tldCk7CisKKwlyZXR1cm4gc3RhdHVzQ29kZTsKK30gLyogRW5kIGxpbV9zZW5kX25laWdoYm9yX3JlcG9ydF9yZXF1ZXN0X2ZyYW1lLiAqLworCisvKioKKyAqIFxicmllZiBTZW5kIGEgTGluayBSZXBvcnQgQWN0aW9uIGZyYW1lCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogXHBhcmFtIHBMaW5rUmVwb3J0IEFkZHJlc3Mgb2YgYSB0U2lyTWFjTGlua1JlcG9ydAorICoKKyAqIFxwYXJhbSBwZWVyIG1hYyBhZGRyZXNzIG9mIHBlZXIgc3RhdGlvbi4KKyAqCisgKiBccGFyYW0gcHNlc3Npb25FbnRyeSBhZGRyZXNzIG9mIHNlc3Npb24gZW50cnkuCisgKgorICogXHJldHVybiBlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcywgZVNJUl9GQUlMVVJFIGVsc2UKKyAqCisgKgorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbV9zZW5kX2xpbmtfcmVwb3J0X2FjdGlvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgdHBTaXJNYWNMaW5rUmVwb3J0IHBMaW5rUmVwb3J0LAorCQkJCSAgdFNpck1hY0FkZHIgcGVlciwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUmV0U3RhdHVzIHN0YXR1c0NvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCBmcm07CisJdWludDhfdCAqcEZyYW1lOworCXRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworCXVpbnQzMl90IG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXM7CisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdWludDhfdCB0eEZsYWcgPSAwOworCXVpbnQ4X3Qgc21lU2Vzc2lvbklkID0gMDsKKworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIihwc2Vzc2lvbiA9PSBOVUxMKSBpbiBSZXF1ZXN0IHRvIHNlbmQgTGluayBSZXBvcnQgYWN0aW9uIGZyYW1lIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZmcm0sIHNpemVvZihmcm0pLCAwKTsKKworCWZybS5DYXRlZ29yeS5jYXRlZ29yeSA9IFNJUl9NQUNfQUNUSU9OX1JSTTsKKwlmcm0uQWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfUlJNX0xJTktfTUVBU1VSRU1FTlRfUlBUOworCWZybS5EaWFsb2dUb2tlbi50b2tlbiA9IHBMaW5rUmVwb3J0LT5kaWFsb2dUb2tlbjsKKworCS8qIElFRUUgU3RkLiA4MDIuMTEgNy4zLjIuMTguIGZvciB0aGUgcmVwb3J0IGVsZW1lbnQuICovCisJLyogRXZlbiB0aG91Z2ggVFBDIHJlcG9ydCBhbiBJRSwgaXQgaXMgcmVwcmVzZW50ZWQgdXNpbmcgZml4ZWQgZmllbGRzIHNpbmNlIGl0IGlzIHBvc2l0aW9uZWQgKi8KKwkvKiBpbiB0aGUgbWlkZGxlIG9mIG90aGVyIGZpeGVkIGZpZWxkcyBpbiB0aGUgbGluayByZXBvcnQgZnJhbWUoSUVFRSBTdGQuIDgwMi4xMWsgc2VjdGlvbjcuNC42LjQgKi8KKwkvKiBhbmQgZnJhbWUgcGFyc2VyIGFsd2F5cyBleHBlY3RzIElFcyB0byBjb21lIGFmdGVyIGFsbCBmaXhlZCBmaWVsZHMuIEl0IGlzIGVhc2llciB0byBoYW5kbGUgKi8KKwkvKiBzdWNoIGNhc2UgdGhpcyB3YXkgdGhhbiBjaGFuZ2luZyB0aGUgZnJhbWUgcGFyc2VyLiAqLworCWZybS5UUENFbGVJRC5UUENJZCA9IFNJUl9NQUNfVFBDX1JQVF9FSUQ7CisJZnJtLlRQQ0VsZUxlbi5UUENMZW4gPSAyOworCWZybS5UeFBvd2VyLnR4UG93ZXIgPSBwTGlua1JlcG9ydC0+dHhQb3dlcjsKKwlmcm0uTGlua01hcmdpbi5saW5rTWFyZ2luID0gMDsKKworCWZybS5SeEFudGVubmFJZC5hbnRlbm5hSWQgPSBwTGlua1JlcG9ydC0+cnhBbnRlbm5hOworCWZybS5UeEFudGVubmFJZC5hbnRlbm5hSWQgPSBwTGlua1JlcG9ydC0+dHhBbnRlbm5hOworCWZybS5SQ1BJLnJjcGkgPSBwTGlua1JlcG9ydC0+cmNwaTsKKwlmcm0uUlNOSS5yc25pID0gcExpbmtSZXBvcnQtPnJzbmk7CisKKwluU3RhdHVzID0KKwkJZG90MTFmX2dldF9wYWNrZWRfbGlua19tZWFzdXJlbWVudF9yZXBvcnRfc2l6ZShwTWFjLCAmZnJtLCAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisJCQkJICAgICAgICJvciBhIExpbmsgUmVwb3J0ICgweCUwOHgpLiIpLCBuU3RhdHVzKTsKKwkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQluUGF5bG9hZCA9IHNpemVvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0KTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyAiCisJCQkJICAgICAgICJ0aGUgcGFja2VkIHNpemUgZm9yIGEgTGluayBSZXAiCisJCQkJICAgICAgICJvcnQgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCW5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsKKworCWNkZl9zdGF0dXMgPQorCQljZHNfcGFja2V0X2FsbG9jKCh1aW50MTZfdCkgbkJ5dGVzLCAodm9pZCAqKikmcEZyYW1lLAorCQkJCSAodm9pZCAqKikmcFBhY2tldCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhIExpbmsgIgorCQkJCSAgICAgICAiUmVwb3J0LiIpLCBuQnl0ZXMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwkvKiBQYXJhbm9pYTogKi8KKwljZGZfbWVtX3NldChwRnJhbWUsIG5CeXRlcywgMCk7CisKKwkvKiBDb3B5IG5lY2Vzc2FyeSBpbmZvIHRvIEJEICovCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIocE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisJCVNJUl9NQUNfTUdNVF9BQ1RJT04sIHBlZXIsIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKTsKKworCS8qIFVwZGF0ZSBBMyB3aXRoIHRoZSBCU1NJRCAqLworCXBNYWNIZHIgPSAodHBTaXJNYWNNZ210SGRyKSBwRnJhbWU7CisKKwlzaXJfY29weV9tYWNfYWRkcihwTWFjSGRyLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWxpbV9zZXRfcHJvdGVjdGVkX2JpdChwTWFjLCBwc2Vzc2lvbkVudHJ5LCBwZWVyLCBwTWFjSGRyKTsKKyNlbmRpZgorCisJLyogTm93LCB3ZSdyZSByZWFkeSB0byAicGFjayIgdGhlIGZyYW1lcyAqLworCW5TdGF0dXMgPSBkb3QxMWZfcGFja19saW5rX21lYXN1cmVtZW50X3JlcG9ydChwTWFjLAorCQkJCQkJICAgICAgJmZybSwKKwkJCQkJCSAgICAgIHBGcmFtZSArCisJCQkJCQkgICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpLAorCQkJCQkJICAgICAgblBheWxvYWQsICZuUGF5bG9hZCk7CisKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhY2sgYW4gTGluayBSZXBvcnQgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCisJCS8qIEZJWE1FIC0gTmVlZCB0byBjb252ZXJ0IHRvIHRTaXJSZXRTdGF0dXMgKi8KKwkJc3RhdHVzQ29kZSA9IGVTSVJfRkFJTFVSRTsKKwkJZ290byByZXR1cm5BZnRlckVycm9yOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTAorCQkJCSgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIExpbmsgUmVwb3J0ICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJfQorCisJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiU2VuZGluZyBhIExpbmsgUmVwb3J0IHRvICIpKTsKKwlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcGVlciwgTE9HVyk7CisKKwlpZiAoKFNJUl9CQU5EXzVfR0haID09IGxpbV9nZXRfcmZfYmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorCSAgICB8fCAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfQ0xJRU5UX01PREUpIHx8CisJICAgIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKSkgeworCQl0eEZsYWcgfD0gSEFMX1VTRV9CRF9SQVRFMl9GT1JfTUFOQUdFTUVOVF9GUkFNRTsKKwl9CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfTUdNVCwKKwkJCSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgcE1hY0hkci0+ZmMuc3ViVHlwZSkpOworCWNkZl9zdGF0dXMgPSB3bWFfdHhfZnJhbWUocE1hYywKKwkJCQlwUGFja2V0LAorCQkJCSh1aW50MTZfdCkgbkJ5dGVzLAorCQkJCVRYUlhfRlJNXzgwMl8xMV9NR01ULAorCQkJCUFOSV9UWERJUl9UT0RTLAorCQkJCTcsIGxpbV90eF9jb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcsCisJCQkJc21lU2Vzc2lvbklkLCAwKTsKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfUEUsIFRSQUNFX0NPREVfVFhfQ09NUExFVEUsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGNkZl9zdGF0dXMpKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoIndtYV90eF9mcmFtZSBGQUlMRUQhIFN0YXR1cyBbJWRdIiksCisJCQkgICAgICAgY2RmX3N0YXR1cyk7CisJCSAgICAgICApCisJCXN0YXR1c0NvZGUgPSBlU0lSX0ZBSUxVUkU7CisJCS8qIFBrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjayAqLworCQlyZXR1cm4gc3RhdHVzQ29kZTsKKwl9IGVsc2UKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworcmV0dXJuQWZ0ZXJFcnJvcjoKKwljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKilwUGFja2V0KTsKKworCXJldHVybiBzdGF0dXNDb2RlOworfSAvKiBFbmQgbGltX3NlbmRfbGlua19yZXBvcnRfYWN0aW9uX2ZyYW1lLiAqLworCisvKioKKyAqIFxicmllZiBTZW5kIGEgQmVhY29uIFJlcG9ydCBBY3Rpb24gZnJhbWUKKyAqCisgKgorICogXHBhcmFtIHBNYWMgUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gZGlhbG9nX3Rva2VuIGRpYWxvZyB0b2tlbiB0byBiZSB1c2VkIGluIHRoZSBhY3Rpb24gZnJhbWUuCisgKgorICogXHBhcmFtIG51bV9yZXBvcnQgbnVtYmVyIG9mIHJlcG9ydHMgaW4gcFJSTVJlcG9ydC4KKyAqCisgKiBccGFyYW0gcFJSTVJlcG9ydCBBZGRyZXNzIG9mIGEgdFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydC4KKyAqCisgKiBccGFyYW0gcGVlciBtYWMgYWRkcmVzcyBvZiBwZWVyIHN0YXRpb24uCisgKgorICogXHBhcmFtIHBzZXNzaW9uRW50cnkgYWRkcmVzcyBvZiBzZXNzaW9uIGVudHJ5LgorICoKKyAqIFxyZXR1cm4gZVNJUl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVTSVJfRkFJTFVSRSBlbHNlCisgKgorICoKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1fc2VuZF9yYWRpb19tZWFzdXJlX3JlcG9ydF9hY3Rpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgdWludDhfdCBkaWFsb2dfdG9rZW4sCisJCQkJCSAgIHVpbnQ4X3QgbnVtX3JlcG9ydCwKKwkJCQkJICAgdHBTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQgcFJSTVJlcG9ydCwKKwkJCQkJICAgdFNpck1hY0FkZHIgcGVlciwKKwkJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUmV0U3RhdHVzIHN0YXR1c0NvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdWludDhfdCAqcEZyYW1lOworCXRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworCXVpbnQzMl90IG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXM7CisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdWludDhfdCBpOworCXVpbnQ4X3QgdHhGbGFnID0gMDsKKwl1aW50OF90IHNtZVNlc3Npb25JZCA9IDA7CisKKwl0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydCAqZnJtID0KKwkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVwb3J0KSk7CisJaWYgKCFmcm0pIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVwb3J0IikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIihwc2Vzc2lvbiA9PSBOVUxMKSBpbiBSZXF1ZXN0IHRvIHNlbmQgQmVhY29uIFJlcG9ydCBhY3Rpb24gZnJhbWUiKSk7CisJCWNkZl9tZW1fZnJlZShmcm0pOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBmcm0sIHNpemVvZigqZnJtKSwgMCk7CisKKwlmcm0tPkNhdGVnb3J5LmNhdGVnb3J5ID0gU0lSX01BQ19BQ1RJT05fUlJNOworCWZybS0+QWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfUlJNX1JBRElPX01FQVNVUkVfUlBUOworCWZybS0+RGlhbG9nVG9rZW4udG9rZW4gPSBkaWFsb2dfdG9rZW47CisKKwlmcm0tPm51bV9NZWFzdXJlbWVudFJlcG9ydCA9CisJCShudW1fcmVwb3J0ID4KKwkJIFJBRElPX1JFUE9SVFNfTUFYX0lOX0FfRlJBTUUpID8gUkFESU9fUkVQT1JUU19NQVhfSU5fQV9GUkFNRSA6CisJCW51bV9yZXBvcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnJtLT5udW1fTWVhc3VyZW1lbnRSZXBvcnQ7IGkrKykgeworCQlmcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnR5cGUgPSBwUlJNUmVwb3J0W2ldLnR5cGU7CisJCWZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0udG9rZW4gPSBwUlJNUmVwb3J0W2ldLnRva2VuOworCQlmcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLmxhdGUgPSAwOyAgICAgLyogSUVFRSA4MDIuMTFrIHNlY3Rpb24gNy4zLjIyLiAoYWx3YXlzIHplcm8gaW4gcnJtKSAqLworCQlzd2l0Y2ggKHBSUk1SZXBvcnRbaV0udHlwZSkgeworCQljYXNlIFNJUl9NQUNfUlJNX0JFQUNPTl9UWVBFOgorCQkJcG9wdWxhdGVfZG90MTFmX2JlYWNvbl9yZXBvcnQocE1hYywKKwkJCQkJCSAgICAgICZmcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLAorCQkJCQkJICAgICAgJnBSUk1SZXBvcnRbaV0ucmVwb3J0LgorCQkJCQkJICAgICAgYmVhY29uUmVwb3J0KTsKKwkJCWZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0uaW5jYXBhYmxlID0KKwkJCQlwUlJNUmVwb3J0W2ldLmluY2FwYWJsZTsKKwkJCWZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVmdXNlZCA9CisJCQkJcFJSTVJlcG9ydFtpXS5yZWZ1c2VkOworCQkJZnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5wcmVzZW50ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5pbmNhcGFibGUgPQorCQkJCXBSUk1SZXBvcnRbaV0uaW5jYXBhYmxlOworCQkJZnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZWZ1c2VkID0KKwkJCQlwUlJNUmVwb3J0W2ldLnJlZnVzZWQ7CisJCQlmcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnByZXNlbnQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwluU3RhdHVzID0KKwkJZG90MTFmX2dldF9wYWNrZWRfcmFkaW9fbWVhc3VyZW1lbnRfcmVwb3J0X3NpemUocE1hYywgZnJtLCAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisJCQkJICAgICAgICJvciBhIFJhZGlvIE1lYXN1cmUgUmVwb3J0ICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCk7CisJCWNkZl9tZW1fZnJlZShmcm0pOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nICIKKwkJCQkgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBSYWRpbyBNZWFzdXJlIFJlcCIKKwkJCQkgICAgICAgIm9ydCAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJfQorCisJbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YodFNpck1hY01nbXRIZHIpOworCisJY2RmX3N0YXR1cyA9CisJCWNkc19wYWNrZXRfYWxsb2MoKHVpbnQxNl90KSBuQnl0ZXMsICh2b2lkICoqKSZwRnJhbWUsCisJCQkJICh2b2lkICoqKSZwUGFja2V0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhIFJhZGlvIE1lYXN1cmUgIgorCQkJICAgIlJlcG9ydC4iKSwgbkJ5dGVzKTsKKwkJY2RmX21lbV9mcmVlKGZybSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIFBhcmFub2lhOiAqLworCWNkZl9tZW1fc2V0KHBGcmFtZSwgbkJ5dGVzLCAwKTsKKworCS8qIENvcHkgbmVjZXNzYXJ5IGluZm8gdG8gQkQgKi8KKwlsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcihwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJU0lSX01BQ19NR01UX0FDVElPTiwgcGVlciwgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworCisJLyogVXBkYXRlIEEzIHdpdGggdGhlIEJTU0lEICovCisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIHBGcmFtZTsKKworCXNpcl9jb3B5X21hY19hZGRyKHBNYWNIZHItPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJbGltX3NldF9wcm90ZWN0ZWRfYml0KHBNYWMsIHBzZXNzaW9uRW50cnksIHBlZXIsIHBNYWNIZHIpOworI2VuZGlmCisKKwkvKiBOb3csIHdlJ3JlIHJlYWR5IHRvICJwYWNrIiB0aGUgZnJhbWVzICovCisJblN0YXR1cyA9IGRvdDExZl9wYWNrX3JhZGlvX21lYXN1cmVtZW50X3JlcG9ydChwTWFjLAorCQkJCQkJICAgICAgIGZybSwKKwkJCQkJCSAgICAgICBwRnJhbWUgKworCQkJCQkJICAgICAgIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCQkgICAgICAgblBheWxvYWQsICZuUGF5bG9hZCk7CisKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhY2sgYW4gUmFkaW8gTWVhc3VyZSBSZXBvcnQgKDB4JTA4eCkuIiksCisJCQluU3RhdHVzKTsKKworCQkvKiBGSVhNRSAtIE5lZWQgdG8gY29udmVydCB0byB0U2lyUmV0U3RhdHVzICovCisJCXN0YXR1c0NvZGUgPSBlU0lSX0ZBSUxVUkU7CisJCWdvdG8gcmV0dXJuQWZ0ZXJFcnJvcjsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBSYWRpbyAiCisJCQkgICAiTWVhc3VyZSBSZXBvcnQgKDB4JTA4eCkuIiksIG5TdGF0dXMpOworCX0KKworCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlNlbmRpbmcgYSBSYWRpbyBNZWFzdXJlIFJlcG9ydCB0byAiKSk7CisJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHBlZXIsIExPR1cpOworCisJaWYgKChTSVJfQkFORF81X0dIWiA9PSBsaW1fZ2V0X3JmX2JhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKwkgICAgfHwgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBDREZfUDJQX0NMSUVOVF9NT0RFKSB8fAorCSAgICAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkKKwkgICAgKSB7CisJCXR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9NR01ULAorCQkJIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBwTWFjSGRyLT5mYy5zdWJUeXBlKSk7CisJY2RmX3N0YXR1cyA9IHdtYV90eF9mcmFtZShwTWFjLAorCQkJCXBQYWNrZXQsCisJCQkJKHVpbnQxNl90KSBuQnl0ZXMsCisJCQkJVFhSWF9GUk1fODAyXzExX01HTVQsCisJCQkJQU5JX1RYRElSX1RPRFMsCisJCQkJNywgbGltX3R4X2NvbXBsZXRlLCBwRnJhbWUsIHR4RmxhZywKKwkJCQlzbWVTZXNzaW9uSWQsIDApOworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9QRSwgVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwKKwkJCSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgY2RmX3N0YXR1cykpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RmX3N0YXR1cykgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgid21hX3R4X2ZyYW1lIEZBSUxFRCEgU3RhdHVzIFslZF0iKSwKKwkJCSAgICAgICBjZGZfc3RhdHVzKTsKKwkJICAgICAgICkKKwkJc3RhdHVzQ29kZSA9IGVTSVJfRkFJTFVSRTsKKwkJLyogUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrICovCisJCWNkZl9tZW1fZnJlZShmcm0pOworCQlyZXR1cm4gc3RhdHVzQ29kZTsKKwl9IGVsc2UgeworCQljZGZfbWVtX2ZyZWUoZnJtKTsKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwl9CisKK3JldHVybkFmdGVyRXJyb3I6CisJY2RmX21lbV9mcmVlKGZybSk7CisJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopcFBhY2tldCk7CisJcmV0dXJuIHN0YXR1c0NvZGU7Cit9CisKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworLyoqCisgKiBcYnJpZWYgU2VuZCBTQSBxdWVyeSByZXF1ZXN0IGFjdGlvbiBmcmFtZSB0byBwZWVyCisgKgorICogXHNhIGxpbV9zZW5kX3NhX3F1ZXJ5X3JlcXVlc3RfZnJhbWUKKyAqCisgKgorICogXHBhcmFtIHBNYWMgICAgVGhlIGdsb2JhbCB0cEFuaVNpckdsb2JhbCBvYmplY3QKKyAqCisgKiBccGFyYW0gdHJhbnNJZCBUcmFuc2FjdGlvbiBpZGVudGlmaWVyCisgKgorICogXHBhcmFtIHBlZXIgICAgVGhlIE1hYyBhZGRyZXNzIG9mIHRoZSBzdGF0aW9uIHRvIHdoaWNoIHRoaXMgYWN0aW9uIGZyYW1lIGlzIGFkZHJlc3NlZAorICoKKyAqIFxwYXJhbSBwc2Vzc2lvbkVudHJ5IFRoZSBQRSBzZXNzaW9uIGVudHJ5CisgKgorICogXHJldHVybiBlU0lSX1NVQ0NFU1MgaWYgc2V0dXAgY29tcGxldGVzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICBlU0lSX0ZBSUxVUkUgaXMgc29tZSBwcm9ibGVtIGlzIGVuY291bnRlcmVkCisgKi8KKwordFNpclJldFN0YXR1cyBsaW1fc2VuZF9zYV9xdWVyeV9yZXF1ZXN0X2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnRyYW5zSWQsCisJCQkJCSAgICAgIHRTaXJNYWNBZGRyIHBlZXIsCisJCQkJCSAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwl0RG90MTFmU2FRdWVyeVJlcSBmcm07ICAvKiBTQSBxdWVyeSByZXF1ZXN0IGFjdGlvbiBmcmFtZSAqLworCXVpbnQ4X3QgKnBGcmFtZTsKKwl0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisJdHBTaXJNYWNNZ210SGRyIHBNYWNIZHI7CisJdWludDMyX3QgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1czsKKwl2b2lkICpwUGFja2V0OworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl1aW50OF90IHR4RmxhZyA9IDA7CisJdWludDhfdCBzbWVTZXNzaW9uSWQgPSAwOworCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJmZybSwgc2l6ZW9mKGZybSksIDApOworCWZybS5DYXRlZ29yeS5jYXRlZ29yeSA9IFNJUl9NQUNfQUNUSU9OX1NBX1FVRVJZOworCS8qIDExdyBhY3Rpb24gIGZpZWxkIGlzIDoKKwkgICBhY3Rpb246IDAgLS0+IFNBIFF1ZXJ5IFJlcXVlc3QgYWN0aW9uIGZyYW1lCisJICAgYWN0aW9uOiAxIC0tPiBTQSBRdWVyeSBSZXNwb25zZSBhY3Rpb24gZnJhbWUgKi8KKwlmcm0uQWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfU0FfUVVFUllfUkVROworCS8qIDExdyBTQSBRdWVyeSBSZXF1ZXN0IHRyYW5zSWQgKi8KKwljZGZfbWVtX2NvcHkoJmZybS5UcmFuc2FjdGlvbklkLnRyYW5zSWRbMF0sICZ0cmFuc0lkWzBdLCAyKTsKKworCW5TdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9zYV9xdWVyeV9yZXFfc2l6ZShwTWFjLCAmZnJtLCAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplICIKKwkJCQkgICAgICAgImZvciBhbiBTQSBRdWVyeSBSZXF1ZXN0ICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZlNhUXVlcnlSZXEpOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nICIKKwkJCQkgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYW4gU0EgUXVlcnkgUmVxdWVzdCIKKwkJCQkgICAgICAgIiAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJfQorCisJbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YodFNpck1hY01nbXRIZHIpOworCWNkZl9zdGF0dXMgPQorCQljZHNfcGFja2V0X2FsbG9jKG5CeXRlcywgKHZvaWQgKiopJnBGcmFtZSwgKHZvaWQgKiopJnBQYWNrZXQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgU0EgUXVlcnkgUmVxdWVzdCAiCisJCQkgICAiYWN0aW9uIGZyYW1lIiksIG5CeXRlcyk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIFBhcmFub2lhOiAqLworCWNkZl9tZW1fc2V0KHBGcmFtZSwgbkJ5dGVzLCAwKTsKKworCS8qIENvcHkgbmVjZXNzYXJ5IGluZm8gdG8gQkQgKi8KKwlsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcihwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJU0lSX01BQ19NR01UX0FDVElPTiwgcGVlciwgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworCisJLyogVXBkYXRlIEEzIHdpdGggdGhlIEJTU0lEICovCisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIHBGcmFtZTsKKworCXNpcl9jb3B5X21hY19hZGRyKHBNYWNIZHItPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKwkvKiBTaW5jZSB0aGlzIGlzIGEgU0EgUXVlcnkgUmVxdWVzdCwgc2V0IHRoZSAicHJvdGVjdCIgKGFrYSBXRVApIGJpdCAqLworCS8qIGluIHRoZSBGQyAqLworCWxpbV9zZXRfcHJvdGVjdGVkX2JpdChwTWFjLCBwc2Vzc2lvbkVudHJ5LCBwZWVyLCBwTWFjSGRyKTsKKworCS8qIFBhY2sgMTF3IFNBIFF1ZXJ5IFJlcXVlc3QgZnJhbWUgKi8KKwluU3RhdHVzID0gZG90MTFmX3BhY2tfc2FfcXVlcnlfcmVxKHBNYWMsCisJCQkJCSAgICZmcm0sCisJCQkJCSAgIHBGcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCSAgIG5QYXlsb2FkLCAmblBheWxvYWQpOworCisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBwYWNrIGFuIFNBIFF1ZXJ5IFJlcXVlc3QgKDB4JTA4eCkuIiksCisJCQluU3RhdHVzKTsKKwkJLyogRklYTUUgLSBOZWVkIHRvIGNvbnZlcnQgdG8gdFNpclJldFN0YXR1cyAqLworCQluU2lyU3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQlnb3RvIHJldHVybkFmdGVyRXJyb3I7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMCisJCQkJKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgU0EgUXVlcnkgUmVxdWVzdCAoMHglMDh4KS4iKSwKKwkJCW5TdGF0dXMpOworCX0KKworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgYW4gU0EgUXVlcnkgUmVxdWVzdCB0byAiKSk7CisJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHBlZXIsIExPRzEpOworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgYW4gU0EgUXVlcnkgUmVxdWVzdCBmcm9tICIpKTsKKwlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsIExPRzEpOworCisJaWYgKChTSVJfQkFORF81X0dIWiA9PSBsaW1fZ2V0X3JmX2JhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisJICAgIHx8IChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9DTElFTlRfTU9ERSkgfHwKKwkgICAgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBDREZfUDJQX0dPX01PREUpCisjZW5kaWYKKwkgICAgKSB7CisJCXR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworCX0KKwlzbWVTZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKwljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lKHBNYWMsCisJCQkJcFBhY2tldCwKKwkJCQkodWludDE2X3QpIG5CeXRlcywKKwkJCQlUWFJYX0ZSTV84MDJfMTFfTUdNVCwKKwkJCQlBTklfVFhESVJfVE9EUywKKwkJCQk3LCBsaW1fdHhfY29tcGxldGUsIHBGcmFtZSwgdHhGbGFnLAorCQkJCXNtZVNlc3Npb25JZCwgMCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfc3RhdHVzKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJ3bWFfdHhfZnJhbWUgRkFJTEVEISBTdGF0dXMgWyVkXSIpLAorCQkJICAgICAgIGNkZl9zdGF0dXMpOworCQkgICAgICAgKQorCQluU2lyU3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQkvKiBQa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sgKi8KKwkJcmV0dXJuIG5TaXJTdGF0dXM7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwl9CisKK3JldHVybkFmdGVyRXJyb3I6CisJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopcFBhY2tldCk7CisJcmV0dXJuIG5TaXJTdGF0dXM7Cit9IC8qIEVuZCBsaW1fc2VuZF9zYV9xdWVyeV9yZXF1ZXN0X2ZyYW1lICovCisKKy8qKgorICogXGJyaWVmIFNlbmQgU0EgcXVlcnkgcmVzcG9uc2UgYWN0aW9uIGZyYW1lIHRvIHBlZXIKKyAqCisgKiBcc2EgbGltX3NlbmRfc2FfcXVlcnlfcmVzcG9uc2VfZnJhbWUKKyAqCisgKgorICogXHBhcmFtIHBNYWMgICAgVGhlIGdsb2JhbCB0cEFuaVNpckdsb2JhbCBvYmplY3QKKyAqCisgKiBccGFyYW0gdHJhbnNJZCBUcmFuc2FjdGlvbiBpZGVudGlmaWVyIHJlY2VpdmVkIGluIFNBIHF1ZXJ5IHJlcXVlc3QgYWN0aW9uIGZyYW1lCisgKgorICogXHBhcmFtIHBlZXIgICAgVGhlIE1hYyBhZGRyZXNzIG9mIHRoZSBBUCB0byB3aGljaCB0aGlzIGFjdGlvbiBmcmFtZSBpcyBhZGRyZXNzZWQKKyAqCisgKiBccGFyYW0gcHNlc3Npb25FbnRyeSBUaGUgUEUgc2Vzc2lvbiBlbnRyeQorICoKKyAqIFxyZXR1cm4gZVNJUl9TVUNDRVNTIGlmIHNldHVwIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgZVNJUl9GQUlMVVJFIGlzIHNvbWUgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZAorICovCisKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfc2FfcXVlcnlfcmVzcG9uc2VfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgIHVpbnQ4X3QgKnRyYW5zSWQsIHRTaXJNYWNBZGRyIHBlZXIsCisJCQkJCSAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCisJdERvdDExZlNhUXVlcnlSc3AgZnJtOyAgLyogU0EgcXVlcnkgcmVwb25zZSBhY3Rpb24gZnJhbWUgKi8KKwl1aW50OF90ICpwRnJhbWU7CisJdFNpclJldFN0YXR1cyBuU2lyU3RhdHVzOworCXRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworCXVpbnQzMl90IG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXM7CisJdm9pZCAqcFBhY2tldDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdWludDhfdCB0eEZsYWcgPSAwOworCXVpbnQ4X3Qgc21lU2Vzc2lvbklkID0gMDsKKworCXNtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZmcm0sIHNpemVvZihmcm0pLCAwKTsKKwlmcm0uQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9TQV9RVUVSWTsKKwkvKjExdyBhY3Rpb24gIGZpZWxkIGlzIDoKKwkgICBhY3Rpb246IDAgLS0+IFNBIHF1ZXJ5IHJlcXVlc3QgYWN0aW9uIGZyYW1lCisJICAgYWN0aW9uOiAxIC0tPiBTQSBxdWVyeSByZXNwb25zZSBhY3Rpb24gZnJhbWUgKi8KKwlmcm0uQWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfU0FfUVVFUllfUlNQOworCS8qMTF3IFNBIHF1ZXJ5IHJlc3BvbnNlIHRyYW5zSWQgaXMgc2FtZSBhcworCSAgIFNBIHF1ZXJ5IHJlcXVlc3QgdHJhbnNJZCAqLworCWNkZl9tZW1fY29weSgmZnJtLlRyYW5zYWN0aW9uSWQudHJhbnNJZFswXSwgJnRyYW5zSWRbMF0sIDIpOworCisJblN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX3NhX3F1ZXJ5X3JzcF9zaXplKHBNYWMsICZmcm0sICZuUGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKwkJCQkgICAgICAgIm9yIGEgU0EgUXVlcnkgUmVzcG9uc2UgKDB4JTA4eCkuIiksCisJCQluU3RhdHVzKTsKKwkJLyogV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOiAqLworCQluUGF5bG9hZCA9IHNpemVvZih0RG90MTFmU2FRdWVyeVJzcCk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmcgIgorCQkJCSAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhbiBTQSBRdWVyeSBSZXNwb25zZSIKKwkJCQkgICAgICAgIiAoMHglMDh4KS4iKSwgblN0YXR1cyk7CisJfQorCisJbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YodFNpck1hY01nbXRIZHIpOworCWNkZl9zdGF0dXMgPQorCQljZHNfcGFja2V0X2FsbG9jKG5CeXRlcywgKHZvaWQgKiopJnBGcmFtZSwgKHZvaWQgKiopJnBQYWNrZXQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgU0EgcXVlcnkgcmVzcG9uc2UiCisJCQkgICAiIGFjdGlvbiBmcmFtZSIpLCBuQnl0ZXMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwkvKiBQYXJhbm9pYTogKi8KKwljZGZfbWVtX3NldChwRnJhbWUsIG5CeXRlcywgMCk7CisKKwkvKiBDb3B5IG5lY2Vzc2FyeSBpbmZvIHRvIEJEICovCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIocE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisJCVNJUl9NQUNfTUdNVF9BQ1RJT04sIHBlZXIsIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKTsKKworCS8qIFVwZGF0ZSBBMyB3aXRoIHRoZSBCU1NJRCAqLworCXBNYWNIZHIgPSAodHBTaXJNYWNNZ210SGRyKSBwRnJhbWU7CisKKwlzaXJfY29weV9tYWNfYWRkcihwTWFjSGRyLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisJLyogU2luY2UgdGhpcyBpcyBhIFNBIFF1ZXJ5IFJlc3BvbnNlLCBzZXQgdGhlICJwcm90ZWN0IiAoYWthIFdFUCkgYml0ICovCisJLyogaW4gdGhlIEZDICovCisJbGltX3NldF9wcm90ZWN0ZWRfYml0KHBNYWMsIHBzZXNzaW9uRW50cnksIHBlZXIsIHBNYWNIZHIpOworCisJLyogUGFjayAxMXcgU0EgcXVlcnkgcmVzcG9uc2UgZnJhbWUgKi8KKwluU3RhdHVzID0gZG90MTFmX3BhY2tfc2FfcXVlcnlfcnNwKHBNYWMsCisJCQkJCSAgICZmcm0sCisJCQkJCSAgIHBGcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCSAgIG5QYXlsb2FkLCAmblBheWxvYWQpOworCisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBwYWNrIGFuIFNBIFF1ZXJ5IFJlc3BvbnNlICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJCS8qIEZJWE1FIC0gTmVlZCB0byBjb252ZXJ0IHRvIHRTaXJSZXRTdGF0dXMgKi8KKwkJblNpclN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKwkJZ290byByZXR1cm5BZnRlckVycm9yOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTAorCQkJCSgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIFNBIFF1ZXJ5IFJlc3BvbnNlICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJfQorCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBhIFNBIFF1ZXJ5IFJlc3BvbnNlIHRvICIpKTsKKwlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgcGVlciwgTE9HVyk7CisKKwlpZiAoKFNJUl9CQU5EXzVfR0haID09IGxpbV9nZXRfcmZfYmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKwkgICAgfHwgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBDREZfUDJQX0NMSUVOVF9NT0RFKSB8fAorCSAgICAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkKKyNlbmRpZgorCSAgICApIHsKKwkJdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisJfQorCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX01HTVQsCisJCQkgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIHBNYWNIZHItPmZjLnN1YlR5cGUpKTsKKwljZGZfc3RhdHVzID0gd21hX3R4X2ZyYW1lKHBNYWMsCisJCQkJcFBhY2tldCwKKwkJCQkodWludDE2X3QpIG5CeXRlcywKKwkJCQlUWFJYX0ZSTV84MDJfMTFfTUdNVCwKKwkJCQlBTklfVFhESVJfVE9EUywKKwkJCQk3LCBsaW1fdHhfY29tcGxldGUsIHBGcmFtZSwgdHhGbGFnLAorCQkJCXNtZVNlc3Npb25JZCwgMCk7CisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1BFLCBUUkFDRV9DT0RFX1RYX0NPTVBMRVRFLAorCQkJIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLCBjZGZfc3RhdHVzKSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfc3RhdHVzKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJ3bWFfdHhfZnJhbWUgRkFJTEVEISBTdGF0dXMgWyVkXSIpLAorCQkJICAgICAgIGNkZl9zdGF0dXMpOworCQkgICAgICAgKQorCQluU2lyU3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQkvKiBQa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sgKi8KKwkJcmV0dXJuIG5TaXJTdGF0dXM7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwl9CisKK3JldHVybkFmdGVyRXJyb3I6CisJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopcFBhY2tldCk7CisJcmV0dXJuIG5TaXJTdGF0dXM7Cit9IC8qIEVuZCBsaW1fc2VuZF9zYV9xdWVyeV9yZXNwb25zZV9mcmFtZSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zZW5kX21lc3NhZ2VzLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zZW5kX21lc3NhZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3YmYyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3NlbmRfbWVzc2FnZXMuYwpAQCAtMCwwICsxLDg1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBsaW1fc2VuZF9tZXNzYWdlcy5jOiBQcm92aWRlcyBmdW5jdGlvbnMgdG8gc2VuZCBtZXNzYWdlcyBvciBJbmRpY2F0aW9ucyB0byBIQUwuCisgKiBBdXRob3I6ICAgIFN1bml0IEJoYXRpYQorICogRGF0ZTogICAgICAgMDkvMjEvMjAwNgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICBNb2RpZmllZCBieSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaW5jbHVkZSAibGltX3NlbmRfbWVzc2FnZXMuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAibGltX3RyYWNlLmgiCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKy8qIFdoZW4gYmVhY29uIGZpbHRlcmluZyBpcyBlbmFibGVkLCBmaXJtd2FyZSB3aWxsCisgKiBhbmFseXplIHRoZSBzZWxlY3RlZCBiZWFjb25zIHJlY2VpdmVkIGR1cmluZyBCTVBTLAorICogYW5kIG1vbml0b3IgYW55IGNoYW5nZXMgaW4gdGhlIElFcyBhcyBsaXN0ZWQgYmVsb3cuCisgKiBUaGUgZm9ybWF0IG9mIHRoZSB0YWJsZSBpczoKKyAqICAgIC0gRUlECisgKiAgICAtIENoZWNrIGZvciBJRSBwcmVzZW5jZQorICogICAgLSBCeXRlIG9mZnNldAorICogICAgLSBCeXRlIHZhbHVlCisgKiAgICAtIEJpdCBNYXNrCisgKiAgICAtIEJ5dGUgcmVmcmVuY2UKKyAqLworc3RhdGljIHRCZWFjb25GaWx0ZXJJZSBiZWFjb25fZmlsdGVyX3RhYmxlW10gPSB7CisJe1NJUl9NQUNfRFNfUEFSQU1fU0VUX0VJRCwgMCwgezAsIDAsIERTX1BBUkFNX0NIQU5ORUxfTUFTSywgMH0gfSwKKwl7U0lSX01BQ19FUlBfSU5GT19FSUQsIDAsIHswLCAwLCBFUlBfRklMVEVSX01BU0ssIDB9IH0sCisJe1NJUl9NQUNfRURDQV9QQVJBTV9TRVRfRUlELCAwLCB7MCwgMCwgRURDQV9GSUxURVJfTUFTSywgMH0gfSwKKwl7U0lSX01BQ19RT1NfQ0FQQUJJTElUWV9FSUQsIDAsIHswLCAwLCBRT1NfRklMVEVSX01BU0ssIDB9IH0sCisJe1NJUl9NQUNfQ0hOTF9TV0lUQ0hfQU5OX0VJRCwgMSwgezAsIDAsIDAsIDB9IH0sCisJe1NJUl9NQUNfSFRfSU5GT19FSUQsIDAsIHswLCAwLCBIVF9CWVRFMF9GSUxURVJfTUFTSywgMH0gfSwKKwl7U0lSX01BQ19IVF9JTkZPX0VJRCwgMCwgezIsIDAsIEhUX0JZVEUyX0ZJTFRFUl9NQVNLLCAwfSB9LAorCXtTSVJfTUFDX0hUX0lORk9fRUlELCAwLCB7NSwgMCwgSFRfQllURTVfRklMVEVSX01BU0ssIDB9IH0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwksIHtTSVJfTUFDX1BXUl9DT05TVFJBSU5UX0VJRCwgMCwgezAsIDAsIDAsIDB9IH0KKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJLCB7U0lSX01BQ19WSFRfT1BNT0RFX0VJRCwgMCwgezAsIDAsIDAsIDB9IH0KKwksIHtTSVJfTUFDX1ZIVF9PUEVSQVRJT05fRUlELCAwLCB7MCwgMCwgVkhUT1BfQ0hXSURUSF9NQVNLLCAwfSB9CisjZW5kaWYKK307CisKKy8qKgorICogbGltX3NlbmRfY2ZfcGFyYW1zKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIENGUCBQYXJhbWV0ZXJzIHRvIFdNQSwgd2hlbiB0aGV5IGFyZSBjaGFuZ2VkLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgcG9pbnRlciB0byBHbG9iYWwgTWFjIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBic3NJZHggQnNzIEluZGV4IG9mIHRoZSBCU1MgdG8gd2hpY2ggU1RBIGlzIGFzc29jaWF0ZWQuCisgKiBAcGFyYW0gY2ZwQ291bnQgQ0ZQIENvdW50LCBpZiB0aGF0IGlzIGNoYW5nZWQuCisgKiBAcGFyYW0gY2ZwUGVyaW9kIENGUCBQZXJpb2QgaWYgdGhhdCBpcyBjaGFuZ2VkLgorICoKKyAqIEByZXR1cm4gc3VjY2VzcyBpZiBtZXNzYWdlIHNlbmQgaXMgb2ssIGVsc2UgZmFsc2UuCisgKi8KK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfY2ZfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgYnNzSWR4LAorCQkJCSB1aW50OF90IGNmcENvdW50LCB1aW50OF90IGNmcFBlcmlvZCkKK3sKKwl0cFVwZGF0ZUNGUGFyYW1zIHBDRlBhcmFtcyA9IE5VTEw7CisJdFNpclJldFN0YXR1cyByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworCXRTaXJNc2dRIG1zZ1E7CisKKwlwQ0ZQYXJhbXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFVwZGF0ZUNGUGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gcENGUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBVcGRhdGUgQ0YgUGFyYW1zIikpOworCQlyZXRDb2RlID0gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQlnb3RvIHJldHVybkZhaWx1cmU7CisJfQorCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBDRlBhcmFtcywgc2l6ZW9mKHRVcGRhdGVDRlBhcmFtcyksIDApOworCXBDRlBhcmFtcy0+Y2ZwQ291bnQgPSBjZnBDb3VudDsKKwlwQ0ZQYXJhbXMtPmNmcFBlcmlvZCA9IGNmcFBlcmlvZDsKKwlwQ0ZQYXJhbXMtPmJzc0lkeCA9IGJzc0lkeDsKKworCW1zZ1EudHlwZSA9IFdNQV9VUERBVEVfQ0ZfSU5EOworCW1zZ1EucmVzZXJ2ZWQgPSAwOworCW1zZ1EuYm9keXB0ciA9IHBDRlBhcmFtczsKKwltc2dRLmJvZHl2YWwgPSAwOworCWxpbV9sb2cocE1hYywgTE9HMywgRkwoIlNlbmRpbmcgV01BX1VQREFURV9DRl9JTkQuLi4iKSk7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbXNnUS50eXBlKSk7CisJcmV0Q29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2dRKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHJldENvZGUpIHsKKwkJY2RmX21lbV9mcmVlKHBDRlBhcmFtcyk7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJQb3N0aW5nIFdNQV9VUERBVEVfQ0ZfSU5EIGZhaWxlZCwgcmVhc29uPSVYIiksCisJCQlyZXRDb2RlKTsKKwl9CityZXR1cm5GYWlsdXJlOgorCXJldHVybiByZXRDb2RlOworfQorCisvKioKKyAqIGxpbV9zZW5kX2JlYWNvbl9wYXJhbXMoKSAtIHVwZGF0ZXMgYmNuIHBhcmFtcyB0byBXTUEKKyAqCisgKiBAcE1hYyAgICAgICAgICAgICAgICAgOiBwb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlLgorICogQHRwVXBkYXRlQmVhY29uUGFyYW1zIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLCB3aGljaCBjb250YWlucyB0aGUgYmVhY29uCisgKiBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBjaGFuZ2VkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgYmVhY29uIGludGVydmFsLCBzaG9ydCBwcmVhbWJsZSBvciBvdGhlcgorICogcGFyYW1ldGVycyB0byBXTUEsIHdoaWNoIGFyZSBjaGFuZ2VkIGFuZCBpbmRpY2F0aW9uIGlzIHJlY2VpdmVkIGluIGJlYWNvbi4KKyAqCisgKiBAcmV0dXJuIHN1Y2Nlc3MgaWYgbWVzc2FnZSBzZW5kIGlzIG9rLCBlbHNlIGZhbHNlLgorICovCit0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX2JlYWNvbl9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBVcGRhdGVkQmNuUGFyYW1zLAorCQkJCSAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmNuUGFyYW1zID0gTlVMTDsKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdFNpck1zZ1EgbXNnUTsKKworCXBCY25QYXJhbXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnBCY25QYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBwQmNuUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBVcGRhdGUgQmVhY29uIFBhcmFtcyIpKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBCY25QYXJhbXMsIHBVcGRhdGVkQmNuUGFyYW1zLAorCQkgICAgIHNpemVvZigqcEJjblBhcmFtcykpOworCW1zZ1EudHlwZSA9IFdNQV9VUERBVEVfQkVBQ09OX0lORDsKKwltc2dRLnJlc2VydmVkID0gMDsKKwltc2dRLmJvZHlwdHIgPSBwQmNuUGFyYW1zOworCW1zZ1EuYm9keXZhbCA9IDA7CisJUEVMT0czKGxpbV9sb2cocE1hYywgTE9HMywKKwkgICAgICAgRkwoIlNlbmRpbmcgV01BX1VQREFURV9CRUFDT05fSU5ELCBwYXJhbUNoYW5nZUJpdG1hcCBpbiBoZXggPSAleCIpLAorCSAgICAgICBwVXBkYXRlZEJjblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXApOykKKwlpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KSB7CisJCWNkZl9tZW1fZnJlZShwQmNuUGFyYW1zKTsKKwkJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbXNnUS50eXBlKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIHsKKwkJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywKKwkJCQkJcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJCW1zZ1EudHlwZSkpOworCX0KKwlwQmNuUGFyYW1zLT5zbWVTZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisJcmV0Q29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2dRKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHJldENvZGUpIHsKKwkJY2RmX21lbV9mcmVlKHBCY25QYXJhbXMpOworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiUG9zdGluZyBXTUFfVVBEQVRFX0JFQUNPTl9JTkQsIHJlYXNvbj0lWCIpLAorCQkJcmV0Q29kZSk7CisJfQorCWxpbV9zZW5kX2JlYWNvbl9pbmQocE1hYywgcHNlc3Npb25FbnRyeSk7CisJcmV0dXJuIHJldENvZGU7Cit9CisKKy8qKgorICogbGltX3NlbmRfc3dpdGNoX2NobmxfcGFyYW1zKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIENoYW5uZWwgU3dpdGNoIEluZGljYXRpb24gdG8gV01BCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICBwb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlLgorICogQHBhcmFtIGNobmxOdW1iZXIgTmV3IENoYW5uZWwgTnVtYmVyIHRvIGJlIHN3aXRjaGVkIHRvLgorICogQHBhcmFtIGNoX3dpZHRoIGFuIGVudW0gZm9yIGNoYW5uZWwgd2lkdGguCisgKiBAcGFyYW0gbG9jYWxQb3dlckNvbnN0cmFpbnQgMTFoIGxvY2FsIHBvd2VyIGNvbnN0cmFpbnQgdmFsdWUKKyAqCisgKiBAcmV0dXJuIHN1Y2Nlc3MgaWYgbWVzc2FnZSBzZW5kIGlzIG9rLCBlbHNlIGZhbHNlLgorICovCisjaWYgIWRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQordFNpclJldFN0YXR1cyBsaW1fc2VuZF9zd2l0Y2hfY2hubF9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICB1aW50OF90IGNobmxOdW1iZXIsCisJCQkJCSAgdWludDhfdCBjaF9jZW50ZXJfZnJlcV9zZWcwLAorCQkJCQkgIHVpbnQ4X3QgY2hfY2VudGVyX2ZyZXFfc2VnMSwKKwkJCQkJICBwaHlfY2hfd2lkdGggY2hfd2lkdGgsCisJCQkJCSAgdWludDhfdCBsb2NhbFB3ckNvbnN0cmFpbnQsCisJCQkJCSAgdWludDhfdCBwZVNlc3Npb25JZCwKKwkJCQkJICB1aW50OF90IGlzX3Jlc3RhcnQpCisjZWxzZQordFNpclJldFN0YXR1cyBsaW1fc2VuZF9zd2l0Y2hfY2hubF9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICB1aW50OF90IGNobmxOdW1iZXIsCisJCQkJCSAgdWludDhfdCBjaF9jZW50ZXJfZnJlcV9zZWcwLAorCQkJCQkgIHVpbnQ4X3QgY2hfY2VudGVyX2ZyZXFfc2VnMSwKKwkJCQkJICBwaHlfY2hfd2lkdGggY2hfd2lkdGgsCisJCQkJCSAgdFBvd2VyZEJtIG1heFR4UG93ZXIsCisJCQkJCSAgdWludDhfdCBwZVNlc3Npb25JZCwKKwkJCQkJICB1aW50OF90IGlzX3Jlc3RhcnQpCisjZW5kaWYKK3sKKwl0cFN3aXRjaENoYW5uZWxQYXJhbXMgcENobmxQYXJhbXMgPSBOVUxMOworCXRTaXJNc2dRIG1zZ1E7CisJdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeTsKKwlwU2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQocE1hYywgcGVTZXNzaW9uSWQpOworCWlmIChwU2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgKKwkJCQkiVW5hYmxlIHRvIGdldCBTZXNzaW9uIGZvciBzZXNzaW9uIElkICVkIiksCisJCQkJcGVTZXNzaW9uSWQpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlwQ2hubFBhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U3dpdGNoQ2hhbm5lbFBhcmFtcykpOworCWlmIChOVUxMID09IHBDaG5sUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoCisJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgU3dpdGNoIENoIFBhcmFtcyIpKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcENobmxQYXJhbXMsIHNpemVvZih0U3dpdGNoQ2hhbm5lbFBhcmFtcyksIDApOworCXBDaG5sUGFyYW1zLT5jaGFubmVsTnVtYmVyID0gY2hubE51bWJlcjsKKwlwQ2hubFBhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMCA9IGNoX2NlbnRlcl9mcmVxX3NlZzA7CisJcENobmxQYXJhbXMtPmNoX2NlbnRlcl9mcmVxX3NlZzEgPSBjaF9jZW50ZXJfZnJlcV9zZWcxOworCXBDaG5sUGFyYW1zLT5jaF93aWR0aCA9IGNoX3dpZHRoOworCWNkZl9tZW1fY29weShwQ2hubFBhcmFtcy0+c2VsZlN0YU1hY0FkZHIsIHBTZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXBDaG5sUGFyYW1zLT5tYXhUeFBvd2VyID0gbWF4VHhQb3dlcjsKKyNlbHNlCisJcENobmxQYXJhbXMtPmxvY2FsUG93ZXJDb25zdHJhaW50ID0gbG9jYWxQd3JDb25zdHJhaW50OworI2VuZGlmCisJY2RmX21lbV9jb3B5KHBDaG5sUGFyYW1zLT5ic3NJZCwgcFNlc3Npb25FbnRyeS0+YnNzSWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJcENobmxQYXJhbXMtPnBlU2Vzc2lvbklkID0gcGVTZXNzaW9uSWQ7CisJcENobmxQYXJhbXMtPnZodENhcGFibGUgPSBwU2Vzc2lvbkVudHJ5LT52aHRDYXBhYmlsaXR5OworCXBDaG5sUGFyYW1zLT5kb3QxMV9tb2RlID0gcFNlc3Npb25FbnRyeS0+ZG90MTFtb2RlOworCXBDaG5sUGFyYW1zLT5uc3MgPSBwU2Vzc2lvbkVudHJ5LT5uc3M7CisJbGltX2xvZyhwTWFjLCBMT0cyLCBGTCgibnNzIHZhbHVlOiAlZCIpLCBwQ2hubFBhcmFtcy0+bnNzKTsKKworCS8qU2V0IERGUyBmbGFnIGZvciBERlMgY2hhbm5lbCAqLworCWlmIChjZHNfZ2V0X2NoYW5uZWxfc3RhdGUoY2hubE51bWJlcikgPT0gQ0hBTk5FTF9TVEFURV9ERlMpCisJCXBDaG5sUGFyYW1zLT5pc0Rmc0NoYW5uZWwgPSB0cnVlOworCWVsc2UKKwkJcENobmxQYXJhbXMtPmlzRGZzQ2hhbm5lbCA9IGZhbHNlOworCisJcENobmxQYXJhbXMtPnJlc3RhcnRfb25fY2hhbl9zd2l0Y2ggPSBpc19yZXN0YXJ0OworCisJLyogd2UgbmVlZCB0byBkZWZlciB0aGUgbWVzc2FnZSB1bnRpbCB3ZQorCSAqIGdldCB0aGUgcmVzcG9uc2UgYmFjayBmcm9tIFdNQQorCSAqLworCVNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKwltc2dRLnR5cGUgPSBXTUFfQ0hOTF9TV0lUQ0hfUkVROworCW1zZ1EucmVzZXJ2ZWQgPSAwOworCW1zZ1EuYm9keXB0ciA9IHBDaG5sUGFyYW1zOworCW1zZ1EuYm9keXZhbCA9IDA7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJUEVMT0czKGxpbV9sb2cocE1hYywgTE9HMywgRkwoCisJCSJTZW5kaW5nIENIX1NXSVRDSF9SRVEsIGNoX3dpZHRoICVkLCBjaF9udW0gJWQsIG1heFR4UG93ZXIgJWQiKSwKKwkJICAgICAgIHBDaG5sUGFyYW1zLT5jaF93aWR0aCwKKwkJICAgICAgIHBDaG5sUGFyYW1zLT5jaGFubmVsTnVtYmVyLCBwQ2hubFBhcmFtcy0+bWF4VHhQb3dlcik7KQorI2Vsc2UKKwlQRUxPRzMobGltX2xvZyhwTWFjLCBMT0czLCBGTCgKKwkJIlNlbmRpbmcgQ0hfU1dJVENIX1JFUSwgY2hfd2lkdGggJWQsIGNoX251bSAlZCwgbG9jYWxfcHdyX2NvbnN0cmFpbnQgJWQiKSwKKwkJICAgICAgIHBDaG5sUGFyYW1zLT5jaF93aWR0aCwKKwkJICAgICAgIHBDaG5sUGFyYW1zLT5jaGFubmVsTnVtYmVyLAorCQkgICAgICAgcENobmxQYXJhbXMtPmxvY2FsUG93ZXJDb25zdHJhaW50KTspCisjZW5kaWYKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwZVNlc3Npb25JZCwgbXNnUS50eXBlKSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnUSkpIHsKKwkJY2RmX21lbV9mcmVlKHBDaG5sUGFyYW1zKTsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgKKwkJCSJQb3N0aW5nICBDSF9TV0lUQ0hfUkVRIHRvIFdNQSBmYWlsZWQiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKgorICogbGltX3NlbmRfZWRjYV9wYXJhbXMoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgZHluYW1pY2FsbHkgY2hhbmdpbmcgRURDQSBQYXJhbWV0ZXJzIHRvIFdNQS4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgIHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gdHBVcGRhdGVkRWRjYVBhcmFtcyBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY2FsbHkgY2hhbmdpbmcgRURDQSBwYXJhbWV0ZXJzLgorICogQHBhcmFtIGhpZ2hQZXJmb3JtYW5jZSAgSWYgdGhlIHBlZXIgaXMgQWlyZ28gKHRhdXJ1cykgdGhlbiBzd2l0Y2ggdG8gaGlnaFBlcmZvcm1hbmNlIGlzIHRydWUuCisgKgorICogQHJldHVybiBzdWNjZXNzIGlmIG1lc3NhZ2Ugc2VuZCBpcyBvaywgZWxzZSBmYWxzZS4KKyAqLwordFNpclJldFN0YXR1cyBsaW1fc2VuZF9lZGNhX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgIHRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgKnBVcGRhdGVkRWRjYVBhcmFtcywKKwkJCQkgICB1aW50MTZfdCBic3NJZHgpCit7CisJdEVkY2FQYXJhbXMgKnBFZGNhUGFyYW1zID0gTlVMTDsKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdFNpck1zZ1EgbXNnUTsKKwl1aW50OF90IGk7CisKKwlwRWRjYVBhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0RWRjYVBhcmFtcykpOworCWlmIChOVUxMID09IHBFZGNhUGFyYW1zKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBVcGRhdGUgRURDQSBQYXJhbXMiKSk7CisJCXJldENvZGUgPSBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJCXJldHVybiByZXRDb2RlOworCX0KKwlwRWRjYVBhcmFtcy0+YnNzSWR4ID0gYnNzSWR4OworCXBFZGNhUGFyYW1zLT5hY2JlID0gcFVwZGF0ZWRFZGNhUGFyYW1zW0VEQ0FfQUNfQkVdOworCXBFZGNhUGFyYW1zLT5hY2JrID0gcFVwZGF0ZWRFZGNhUGFyYW1zW0VEQ0FfQUNfQktdOworCXBFZGNhUGFyYW1zLT5hY3ZpID0gcFVwZGF0ZWRFZGNhUGFyYW1zW0VEQ0FfQUNfVkldOworCXBFZGNhUGFyYW1zLT5hY3ZvID0gcFVwZGF0ZWRFZGNhUGFyYW1zW0VEQ0FfQUNfVk9dOworCW1zZ1EudHlwZSA9IFdNQV9VUERBVEVfRURDQV9QUk9GSUxFX0lORDsKKwltc2dRLnJlc2VydmVkID0gMDsKKwltc2dRLmJvZHlwdHIgPSBwRWRjYVBhcmFtczsKKwltc2dRLmJvZHl2YWwgPSAwOworCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsCisJICAgICAgIEZMKCJTZW5kaW5nIFdNQV9VUERBVEVfRURDQV9QUk9GSUxFX0lORCwgRURDQSBQYXJhbWV0ZXJzOiIpKTspCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fQUM7IGkrKykgeworCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLAorCQkgICAgICAgRkwoIkFDWyVkXTogIEFJRlNOICVkLCBBQ00gJWQsIENXbWluICVkLCBDV21heCAlZCwgVHhPcCAlZCAiKSwKKwkJICAgICAgIGksIHBVcGRhdGVkRWRjYVBhcmFtc1tpXS5hY2kuYWlmc24sCisJCSAgICAgICBwVXBkYXRlZEVkY2FQYXJhbXNbaV0uYWNpLmFjbSwKKwkJICAgICAgIHBVcGRhdGVkRWRjYVBhcmFtc1tpXS5jdy5taW4sCisJCSAgICAgICBwVXBkYXRlZEVkY2FQYXJhbXNbaV0uY3cubWF4LAorCQkgICAgICAgcFVwZGF0ZWRFZGNhUGFyYW1zW2ldLnR4b3BsaW1pdCk7KQorCX0KKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBOT19TRVNTSU9OLCBtc2dRLnR5cGUpKTsKKwlyZXRDb2RlID0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ1EpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkgeworCQljZGZfbWVtX2ZyZWUocEVkY2FQYXJhbXMpOworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiUG9zdGluZyBXTUFfVVBEQVRFX0VEQ0FfUFJPRklMRV9JTkQgZmFpbGVkLCByZWFzb249JVgiKSwKKwkJCXJldENvZGUpOworCX0KKwlyZXR1cm4gcmV0Q29kZTsKK30KKworLyoqCisgKiBsaW1fc2V0X2FjdGl2ZV9lZGNhX3BhcmFtcygpIC0gQ2hvb3NlIGJlc3QgRURDQSBwYXJhbWV0ZXJzCisgKgorICogQG1hY19jdHg6ICBwb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlLgorICogQGVkY2FfcGFyYW1zOiBwb2ludGVyIHRvIHRoZSBsb2NhbCBFRENBIHBhcmFtZXRlcnMKKyAqIEBwZV9zZXNzaW9uOiBwb2ludCB0byB0aGUgc2Vzc2lvbiBlbnRyeQorICoKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBFRENBIHBhcmFtZXRlcnMKKyAqICBnaXZlbiB0aGUgZGVmYXVsdCBsb2NhbCBFRENBIHBhcmFtZXRlcnMuICBUaGUgcnVsZXMgYXJlIGFzIGZvbGxvd2luZzoKKyAqICAtIElmIEFDTSBiaXQgaXMgc2V0IGZvciBhbGwgQUNzLCB0aGVuIGRvd25ncmFkZSBldmVyeXRoaW5nIHRvIEJlc3QgRWZmb3J0LgorICogIC0gSWYgQUNNIGlzIG5vdCBzZXQgZm9yIGFueSBBQywgdGhlbiBQRSB3aWxsIHVzZSB0aGUgZGVmYXVsdCBFRENBCisgKiAgICBwYXJhbWV0ZXJzIGFzIGFkdmVydGlzZWQgYnkgQVAuCisgKiAgLSBJZiBBQ00gaXMgc2V0IGluIGFueSBvZiB0aGUgQUNzLCBQRSB3aWxsIHVzZSB0aGUgRURDQSBwYXJhbWV0ZXJzCisgKiAgICBmcm9tIHRoZSBuZXh0IGJlc3QgQUMgZm9yIHdoaWNoIEFDTSBpcyBub3QgZW5hYmxlZC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworCit2b2lkIGxpbV9zZXRfYWN0aXZlX2VkY2FfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJdFNpck1hY0VkY2FQYXJhbVJlY29yZCAqZWRjYV9wYXJhbXMsCisJCQkJdHBQRVNlc3Npb24gcGVfc2Vzc2lvbikKK3sKKwl1aW50OF90IGFjLCBuZXdfYWMsIGk7CisJdWludDhfdCBhY19hZG1pdHRlZDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAgICAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJaG9zdF9sb2dfcW9zX2VkY2FfcGt0X3R5cGUgKmxvZ19wdHIgPSBOVUxMOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwkvKiBJbml0aWFsaXplIGdMaW1FZGNhUGFyYW1zQWN0aXZlW10gdG8gYmUgc2FtZSBhcyBsb2NhbEVkY2FQYXJhbXMgKi8KKwlwZV9zZXNzaW9uLT5nTGltRWRjYVBhcmFtc0FjdGl2ZVtFRENBX0FDX0JFXSA9IGVkY2FfcGFyYW1zW0VEQ0FfQUNfQkVdOworCXBlX3Nlc3Npb24tPmdMaW1FZGNhUGFyYW1zQWN0aXZlW0VEQ0FfQUNfQktdID0gZWRjYV9wYXJhbXNbRURDQV9BQ19CS107CisJcGVfc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbRURDQV9BQ19WSV0gPSBlZGNhX3BhcmFtc1tFRENBX0FDX1ZJXTsKKwlwZV9zZXNzaW9uLT5nTGltRWRjYVBhcmFtc0FjdGl2ZVtFRENBX0FDX1ZPXSA9IGVkY2FfcGFyYW1zW0VEQ0FfQUNfVk9dOworCS8qIEFuIEFDIHJlcXVpcmVzIGRvd25ncmFkZSBpZiB0aGUgQUNNIGJpdCBpcyBzZXQsIGFuZCB0aGUgQUMgaGFzIG5vdAorCSAqIHlldCBiZWVuIGFkbWl0dGVkIGluIHVwbGluayBvciBiaS1kaXJlY3Rpb25zLgorCSAqIElmIGFuIEFDIHJlcXVpcmVzIGRvd25ncmFkZSwgaXQgd2lsbCBkb3duZ3JhZGUgdG8gdGhlIG5leHQgYmVzZXQgQUMKKwkgKiBmb3Igd2hpY2ggQUNNIGlzIG5vdCBlbmFibGVkLgorCSAqCisJICogLSBUaGVyZSdzIG5vIG5lZWQgdG8gZG93bmdyYWRlIEFDX0JFIHNpbmNlIGl0IElTIHRoZSBsb3dlc3QgQUMuIEhlbmNlCisJICogICBzdGFydCB0aGUgZm9yIGxvb3Agd2l0aCBBQ19CSy4KKwkgKiAtIElmIEFDTSBiaXQgaXMgc2V0IGZvciBhbiBBQywgaW5pdGlhbGx5IGRvd25ncmFkZSBpdCB0byBBQ19CRS4gVGhlbgorCSAqICAgdHJhdmVyc2UgdGhydSB0aGUgQUMgbGlzdC4gSWYgd2UgZG8gZmluZCB0aGUgbmV4dCBiZXN0IEFDIHdoaWNoIGlzCisJICogICBiZXR0ZXIgdGhhbiBBQ19CRSwgdGhlbiB1c2UgdGhhdCBvbmUuIEZvciBleGFtcGxlLCBpZiBBQ00gYml0cyBhcmUgc2V0CisJICogICBzdWNoIHRoYXQ6IEJFX0FDTT0xLCBCS19BQ009MSwgVklfQUNNPTEsIFZPX0FDTT0wCisJICogICB0aGVuIGFsbCBBQyB3aWxsIGJlIGRvd25ncmFkZWQgdG8gQUNfQkUuCisJICovCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiYWRBZG1pdE1hc2tbVVBMSU5LXSA9IDB4JXggIiksCisJCXBlX3Nlc3Npb24tPmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9VUExJTktdKTsKKwlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJhZEFkbWl0TWFza1tET1dOTElOS10gPSAweCV4ICIpLAorCQlwZV9zZXNzaW9uLT5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LXSk7CisJZm9yIChhYyA9IEVEQ0FfQUNfQks7IGFjIDw9IEVEQ0FfQUNfVk87IGFjKyspIHsKKwkJYWNfYWRtaXR0ZWQgPQorCQkJKChwZV9zZXNzaW9uLT5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LXSAmCisJCQkgKDEgPDwgYWMpKSA+PiBhYyk7CisKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIkZvciBBQ1slZF06IGFjbT0lZCwgIGFjX2FkbWl0dGVkPSVkICIpLAorCQkJYWMsIGVkY2FfcGFyYW1zW2FjXS5hY2kuYWNtLCBhY19hZG1pdHRlZCk7CisJCWlmICgoZWRjYV9wYXJhbXNbYWNdLmFjaS5hY20gPT0gMSkgJiYgKGFjX2FkbWl0dGVkID09IDApKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkJRkwoIldlIG5lZWQgdG8gZG93bmdyYWRlIEFDICVkISEgIiksIGFjKTsKKwkJCS8qIExvb3AgYmFja3dhcmRzIHRocm91Z2ggQUMgdmFsdWVzIHVudGlsIGl0IGZpbmRzCisJCQkgKiBhY20gPT0gMCBvciByZWFjaGVzIEVEQ0FfQUNfQkUuCisJCQkgKiBOb3RlIHRoYXQgZm9yIGJsb2NrIGhhcyBubyBleGVjdXRhYmxlIHN0YXRlbWVudHMuCisJCQkgKi8KKwkJCWZvciAoaSA9IGFjIC0gMTsKKwkJCSAgICAoaSA+IEVEQ0FfQUNfQkUgJiYKKwkJCQkoZWRjYV9wYXJhbXNbaV0uYWNpLmFjbSAhPSAwKSk7CisJCQkgICAgIGktLSkKKwkJCQk7CisJCQluZXdfYWMgPSBpOworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJEb3duZ3JhZGluZyBBQyAlZCAtLS0+IEFDICVkICIpLAorCQkJCWFjLCBuZXdfYWMpOworCQkJcGVfc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbYWNdID0KKwkJCQllZGNhX3BhcmFtc1tuZXdfYWNdOworCQl9CisJfQorLyogbG9nOiBMT0dfV0xBTl9RT1NfRURDQV9DICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCVdMQU5fSE9TVF9ESUFHX0xPR19BTExPQyhsb2dfcHRyLCBob3N0X2xvZ19xb3NfZWRjYV9wa3RfdHlwZSwKKwkJCQkgTE9HX1dMQU5fUU9TX0VEQ0FfQyk7CisJaWYgKGxvZ19wdHIpIHsKKwkJdFNpck1hY0VkY2FQYXJhbVJlY29yZCAqcmVjOworCisJCXJlYyA9ICZwZV9zZXNzaW9uLT5nTGltRWRjYVBhcmFtc0FjdGl2ZVtFRENBX0FDX0JFXTsKKwkJbG9nX3B0ci0+YWNpX2JlID0gcmVjLT5hY2kuYWNpOworCQlsb2dfcHRyLT5jd19iZSA9IHJlYy0+Y3cubWF4IDw8IDQgfCByZWMtPmN3Lm1pbjsKKwkJbG9nX3B0ci0+dHhvcGxpbWl0X2JlID0gcmVjLT50eG9wbGltaXQ7CisKKwkJcmVjID0gJnBlX3Nlc3Npb24tPmdMaW1FZGNhUGFyYW1zQWN0aXZlW0VEQ0FfQUNfQktdOworCQlsb2dfcHRyLT5hY2lfYmsgPSByZWMtPmFjaS5hY2k7CisJCWxvZ19wdHItPmN3X2JrID0gcmVjLT5jdy5tYXggPDwgNCB8IHJlYy0+Y3cubWluOworCQlsb2dfcHRyLT50eG9wbGltaXRfYmsgPSByZWMtPnR4b3BsaW1pdDsKKworCQlyZWMgPSAmcGVfc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbRURDQV9BQ19WSV07CisJCWxvZ19wdHItPmFjaV92aSA9IHJlYy0+YWNpLmFjaTsKKwkJbG9nX3B0ci0+Y3dfdmkgPSByZWMtPmN3Lm1heCA8PCA0IHwgcmVjLT5jdy5taW47CisJCWxvZ19wdHItPnR4b3BsaW1pdF92aSA9IHJlYy0+dHhvcGxpbWl0OworCisJCXJlYyA9ICZwZV9zZXNzaW9uLT5nTGltRWRjYVBhcmFtc0FjdGl2ZVtFRENBX0FDX1ZPXTsKKwkJbG9nX3B0ci0+YWNpX3ZvID0gcmVjLT5hY2kuYWNpOworCQlsb2dfcHRyLT5jd192byA9IHJlYy0+Y3cubWF4IDw8IDQgfCByZWMtPmN3Lm1pbjsKKwkJbG9nX3B0ci0+dHhvcGxpbWl0X3ZvID0gcmVjLT50eG9wbGltaXQ7CisJfQorCVdMQU5fSE9TVF9ESUFHX0xPR19SRVBPUlQobG9nX3B0cik7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJcmV0dXJuOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgICBsaW1fc2V0X2xpbmtfc3RhdGUKKyAgIFxicmllZiAgIExJTSBzZW5kcyBhIG1lc3NhZ2UgdG8gV01BIHRvIHNldCB0aGUgbGluayBzdGF0ZQorICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKKyAgIFxwYXJhbSAgIHRTaXJMaW5rU3RhdGUgICAgICBzdGF0ZQorICAgXHJldHVybiAgTm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFNpclJldFN0YXR1cyBsaW1fc2V0X2xpbmtfc3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckxpbmtTdGF0ZSBzdGF0ZSwKKwkJCQkgdFNpck1hY0FkZHIgYnNzSWQsIHRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyLAorCQkJCSB0cFNldExpbmtTdGF0ZUNhbGxiYWNrIGNhbGxiYWNrLAorCQkJCSB2b2lkICpjYWxsYmFja0FyZykKK3sKKwl0U2lyTXNnUSBtc2dROworCXRTaXJSZXRTdGF0dXMgcmV0Q29kZTsKKwl0cExpbmtTdGF0ZVBhcmFtcyBwTGlua1N0YXRlUGFyYW1zID0gTlVMTDsKKwkvKiBBbGxvY2F0ZSBtZW1vcnkuICovCisJcExpbmtTdGF0ZVBhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0TGlua1N0YXRlUGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gcExpbmtTdGF0ZVBhcmFtcykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSB3aGlsZSBzZW5kaW5nIFNldCBMaW5rIFN0YXRlIikpOworCQlyZXRDb2RlID0gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQlyZXR1cm4gcmV0Q29kZTsKKwl9CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcExpbmtTdGF0ZVBhcmFtcywgc2l6ZW9mKHRMaW5rU3RhdGVQYXJhbXMpLCAwKTsKKwlwTGlua1N0YXRlUGFyYW1zLT5zdGF0ZSA9IHN0YXRlOworCXBMaW5rU3RhdGVQYXJhbXMtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJcExpbmtTdGF0ZVBhcmFtcy0+Y2FsbGJhY2tBcmcgPSBjYWxsYmFja0FyZzsKKworCS8qIENvcHkgTWFjIGFkZHJlc3MgKi8KKwlzaXJfY29weV9tYWNfYWRkcihwTGlua1N0YXRlUGFyYW1zLT5ic3NpZCwgYnNzSWQpOworCXNpcl9jb3B5X21hY19hZGRyKHBMaW5rU3RhdGVQYXJhbXMtPnNlbGZNYWNBZGRyLCBzZWxmTWFjQWRkcik7CisKKwltc2dRLnR5cGUgPSBXTUFfU0VUX0xJTktfU1RBVEU7CisJbXNnUS5yZXNlcnZlZCA9IDA7CisJbXNnUS5ib2R5cHRyID0gcExpbmtTdGF0ZVBhcmFtczsKKwltc2dRLmJvZHl2YWwgPSAwOworCisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbXNnUS50eXBlKSk7CisKKwlyZXRDb2RlID0gKHVpbnQzMl90KSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnUSk7CisJaWYgKHJldENvZGUgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWNkZl9tZW1fZnJlZShwTGlua1N0YXRlUGFyYW1zKTsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlBvc3RpbmcgbGluayBzdGF0ZSAlZCBmYWlsZWQsIHJlYXNvbiA9ICV4ICIpLCBzdGF0ZSwKKwkJCXJldENvZGUpOworCX0KKwlyZXR1cm4gcmV0Q29kZTsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1fc2V0X2xpbmtfc3RhdGVfZnQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckxpbmtTdGF0ZQorCQkJCQkgICBzdGF0ZSwgdFNpck1hY0FkZHIgYnNzSWQsCisJCQkJCSAgIHRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyLCBpbnQgZnQsCisJCQkJCSAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpck1zZ1EgbXNnUTsKKwl0U2lyUmV0U3RhdHVzIHJldENvZGU7CisJdHBMaW5rU3RhdGVQYXJhbXMgcExpbmtTdGF0ZVBhcmFtcyA9IE5VTEw7CisJLyogQWxsb2NhdGUgbWVtb3J5LiAqLworCXBMaW5rU3RhdGVQYXJhbXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodExpbmtTdGF0ZVBhcmFtcykpOworCWlmIChOVUxMID09IHBMaW5rU3RhdGVQYXJhbXMpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwKKwkJCQkoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgd2hpbGUgc2VuZGluZyBTZXQgTGluayBTdGF0ZSIpKTsKKwkJcmV0Q29kZSA9IGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwkJcmV0dXJuIHJldENvZGU7CisJfQorCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBMaW5rU3RhdGVQYXJhbXMsIHNpemVvZih0TGlua1N0YXRlUGFyYW1zKSwgMCk7CisJcExpbmtTdGF0ZVBhcmFtcy0+c3RhdGUgPSBzdGF0ZTsKKwkvKiBDb3B5IE1hYyBhZGRyZXNzICovCisJc2lyX2NvcHlfbWFjX2FkZHIocExpbmtTdGF0ZVBhcmFtcy0+YnNzaWQsIGJzc0lkKTsKKwlzaXJfY29weV9tYWNfYWRkcihwTGlua1N0YXRlUGFyYW1zLT5zZWxmTWFjQWRkciwgc2VsZk1hY0FkZHIpOworCXBMaW5rU3RhdGVQYXJhbXMtPmZ0ID0gMTsKKwlwTGlua1N0YXRlUGFyYW1zLT5zZXNzaW9uID0gcHNlc3Npb25FbnRyeTsKKworCW1zZ1EudHlwZSA9IFdNQV9TRVRfTElOS19TVEFURTsKKwltc2dRLnJlc2VydmVkID0gMDsKKwltc2dRLmJvZHlwdHIgPSBwTGlua1N0YXRlUGFyYW1zOworCW1zZ1EuYm9keXZhbCA9IDA7CisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkgeworCQlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBOT19TRVNTSU9OLCBtc2dRLnR5cGUpKTsKKwl9IGVsc2UgeworCQlNVFJBQ0UobWFjX3RyYWNlX21zZ190eAorCQkJICAgICAgIChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbXNnUS50eXBlKSk7CisJfQorCisJcmV0Q29kZSA9ICh1aW50MzJfdCkgd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ1EpOworCWlmIChyZXRDb2RlICE9IGVTSVJfU1VDQ0VTUykgeworCQljZGZfbWVtX2ZyZWUocExpbmtTdGF0ZVBhcmFtcyk7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJQb3N0aW5nIGxpbmsgc3RhdGUgJWQgZmFpbGVkLCByZWFzb24gPSAleCAiKSwgc3RhdGUsCisJCQlyZXRDb2RlKTsKKwl9CisJcmV0dXJuIHJldENvZGU7Cit9CisjZW5kaWYKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuICAgICAgbGltX3NlbmRfYmVhY29uX2ZpbHRlcl9pbmZvCisgICBcYnJpZWYgICBMSU0gc2VuZHMgYmVhY29uIGZpbHRlcmluZyBpbmZvIHRvIFdNQQorICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKKyAgIFxyZXR1cm4gIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfYmVhY29uX2ZpbHRlcl9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0cEJlYWNvbkZpbHRlck1zZyBwQmVhY29uRmlsdGVyTXNnID0gTlVMTDsKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdFNpck1zZ1EgbXNnUTsKKwl1aW50OF90ICpwdHI7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCBtc2dTaXplOworCXRwQmVhY29uRmlsdGVySWUgcEllOworCisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsIHRvIGZpbmQgdGhlIHJpZ2h0IHNlc3Npb24gIikpOworCQlyZXRDb2RlID0gZVNJUl9GQUlMVVJFOworCQlyZXR1cm4gcmV0Q29kZTsKKwl9CisJbXNnU2l6ZSA9IHNpemVvZih0QmVhY29uRmlsdGVyTXNnKSArIHNpemVvZihiZWFjb25fZmlsdGVyX3RhYmxlKTsKKwlwQmVhY29uRmlsdGVyTXNnID0gY2RmX21lbV9tYWxsb2MobXNnU2l6ZSk7CisJaWYgKE5VTEwgPT0gcEJlYWNvbkZpbHRlck1zZykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiRmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJlYWNvbkZpaWx0ZXJNc2cgIikpOworCQlyZXRDb2RlID0gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQlyZXR1cm4gcmV0Q29kZTsKKwl9CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcEJlYWNvbkZpbHRlck1zZywgbXNnU2l6ZSwgMCk7CisJLyogRmlsbCBpbiBjYXBhYmlsaXR5IEluZm8gYW5kIG1hc2sgKi8KKwkvKiBEb24ndCBzZW5kIHRoaXMgbWVzc2FnZSBpZiBubyBhY3RpdmUgSW5mcmEgc2Vzc2lvbiBpcyBmb3VuZC4gKi8KKwlwQmVhY29uRmlsdGVyTXNnLT5jYXBhYmlsaXR5SW5mbyA9IHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzOworCXBCZWFjb25GaWx0ZXJNc2ctPmNhcGFiaWxpdHlNYXNrID0gQ0FQQUJJTElUWV9GSUxURVJfTUFTSzsKKwlwQmVhY29uRmlsdGVyTXNnLT5iZWFjb25JbnRlcnZhbCA9CisJCSh1aW50MTZfdCkgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmJlYWNvbkludGVydmFsOworCS8qIEZpbGwgaW4gbnVtYmVyIG9mIElFcyBpbiBiZWFjb25fZmlsdGVyX3RhYmxlICovCisJcEJlYWNvbkZpbHRlck1zZy0+aWVOdW0gPQorCQkodWludDE2X3QpIChzaXplb2YoYmVhY29uX2ZpbHRlcl90YWJsZSkgLyBzaXplb2YodEJlYWNvbkZpbHRlckllKSk7CisJLyogRmlsbCB0aGUgQlNTSURYICovCisJcEJlYWNvbkZpbHRlck1zZy0+YnNzSWR4ID0gcHNlc3Npb25FbnRyeS0+YnNzSWR4OworCisJLyogRmlsbCBtZXNzYWdlIHdpdGggaW5mbyBjb250YWluZWQgaW4gdGhlIGJlYWNvbl9maWx0ZXJfdGFibGUgKi8KKwlwdHIgPSAodWludDhfdCAqKSBwQmVhY29uRmlsdGVyTXNnICsgc2l6ZW9mKHRCZWFjb25GaWx0ZXJNc2cpOworCWZvciAoaSA9IDA7IGkgPCAocEJlYWNvbkZpbHRlck1zZy0+aWVOdW0pOyBpKyspIHsKKwkJcEllID0gKHRwQmVhY29uRmlsdGVySWUpIHB0cjsKKwkJcEllLT5lbGVtZW50SWQgPSBiZWFjb25fZmlsdGVyX3RhYmxlW2ldLmVsZW1lbnRJZDsKKwkJcEllLT5jaGVja0llUHJlc2VuY2UgPSBiZWFjb25fZmlsdGVyX3RhYmxlW2ldLmNoZWNrSWVQcmVzZW5jZTsKKwkJcEllLT5ieXRlLm9mZnNldCA9IGJlYWNvbl9maWx0ZXJfdGFibGVbaV0uYnl0ZS5vZmZzZXQ7CisJCXBJZS0+Ynl0ZS52YWx1ZSA9IGJlYWNvbl9maWx0ZXJfdGFibGVbaV0uYnl0ZS52YWx1ZTsKKwkJcEllLT5ieXRlLmJpdE1hc2sgPSBiZWFjb25fZmlsdGVyX3RhYmxlW2ldLmJ5dGUuYml0TWFzazsKKwkJcEllLT5ieXRlLnJlZiA9IGJlYWNvbl9maWx0ZXJfdGFibGVbaV0uYnl0ZS5yZWY7CisJCXB0ciArPSBzaXplb2YodEJlYWNvbkZpbHRlckllKTsKKwl9CisJbXNnUS50eXBlID0gV01BX0JFQUNPTl9GSUxURVJfSU5EOworCW1zZ1EucmVzZXJ2ZWQgPSAwOworCW1zZ1EuYm9keXB0ciA9IHBCZWFjb25GaWx0ZXJNc2c7CisJbXNnUS5ib2R5dmFsID0gMDsKKwlsaW1fbG9nKHBNYWMsIExPRzMsIEZMKCJTZW5kaW5nIFdNQV9CRUFDT05fRklMVEVSX0lORC4uLiIpKTsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbXNnUS50eXBlKSk7CisJcmV0Q29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2dRKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHJldENvZGUpIHsKKwkJY2RmX21lbV9mcmVlKHBCZWFjb25GaWx0ZXJNc2cpOworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiUG9zdGluZyBXTUFfQkVBQ09OX0ZJTFRFUl9JTkQgZmFpbGVkLCByZWFzb249JVgiKSwKKwkJCXJldENvZGUpOworCQlyZXR1cm4gcmV0Q29kZTsKKwl9CisJcmV0dXJuIHJldENvZGU7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQwordFNpclJldFN0YXR1cyBsaW1fc2VuZF9tb2RlX3VwZGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgIHRVcGRhdGVWSFRPcE1vZGUgKnBUZW1wUGFyYW0sCisJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0VXBkYXRlVkhUT3BNb2RlICpwVmh0T3BNb2RlID0gTlVMTDsKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdFNpck1zZ1EgbXNnUTsKKworCXBWaHRPcE1vZGUgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFVwZGF0ZVZIVE9wTW9kZSkpOworCWlmIChOVUxMID09IHBWaHRPcE1vZGUpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIFVwZGF0ZSBPcCBNb2RlIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcFZodE9wTW9kZSwgcFRlbXBQYXJhbSwKKwkJICAgICBzaXplb2YodFVwZGF0ZVZIVE9wTW9kZSkpOworCW1zZ1EudHlwZSA9IFdNQV9VUERBVEVfT1BfTU9ERTsKKwltc2dRLnJlc2VydmVkID0gMDsKKwltc2dRLmJvZHlwdHIgPSBwVmh0T3BNb2RlOworCW1zZ1EuYm9keXZhbCA9IDA7CisJbGltX2xvZyhwTWFjLCBMT0czLCBGTCgKKwkJCSJTZW5kaW5nIFdNQV9VUERBVEVfT1BfTU9ERSwgb3BfbW9kZSAlZCwgc3RhX2lkICVkIiksCisJCQlwVmh0T3BNb2RlLT5vcE1vZGUsIHBWaHRPcE1vZGUtPnN0YUlkKTsKKwlpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KQorCQlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBOT19TRVNTSU9OLCBtc2dRLnR5cGUpKTsKKwllbHNlCisJCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsCisJCQkJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkJCQltc2dRLnR5cGUpKTsKKwlyZXRDb2RlID0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ1EpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkgeworCQljZGZfbWVtX2ZyZWUocFZodE9wTW9kZSk7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJQb3N0aW5nIFdNQV9VUERBVEVfT1BfTU9ERSBmYWlsZWQsIHJlYXNvbj0lWCIpLAorCQkJcmV0Q29kZSk7CisJfQorCisJcmV0dXJuIHJldENvZGU7Cit9CisKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfcnhfbnNzX3VwZGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgdFVwZGF0ZVJ4TnNzICpwVGVtcFBhcmFtLAorCQkJCSAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0VXBkYXRlUnhOc3MgKnBSeE5zcyA9IE5VTEw7CisJdFNpclJldFN0YXR1cyByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworCXRTaXJNc2dRIG1zZ1E7CisKKwlwUnhOc3MgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFVwZGF0ZVJ4TnNzKSk7CisJaWYgKE5VTEwgPT0gcFJ4TnNzKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBVcGRhdGUgUnggTnNzIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcFJ4TnNzLCBwVGVtcFBhcmFtLCBzaXplb2YodFVwZGF0ZVJ4TnNzKSk7CisJbXNnUS50eXBlID0gV01BX1VQREFURV9SWF9OU1M7CisJbXNnUS5yZXNlcnZlZCA9IDA7CisJbXNnUS5ib2R5cHRyID0gcFJ4TnNzOworCW1zZ1EuYm9keXZhbCA9IDA7CisJUEVMT0czKGxpbV9sb2cocE1hYywgTE9HMywgRkwoIlNlbmRpbmcgV01BX1VQREFURV9SWF9OU1MiKSk7KQorCWlmIChOVUxMID09IHBzZXNzaW9uRW50cnkpCisJCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIE5PX1NFU1NJT04sIG1zZ1EudHlwZSkpOworCWVsc2UKKwkJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywKKwkJCQkJcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJCW1zZ1EudHlwZSkpOworCXJldENvZGUgPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnUSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSByZXRDb2RlKSB7CisJCWNkZl9tZW1fZnJlZShwUnhOc3MpOworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiUG9zdGluZyBXTUFfVVBEQVRFX1JYX05TUyBmYWlsZWQsIHJlYXNvbj0lWCIpLAorCQkJcmV0Q29kZSk7CisJfQorCisJcmV0dXJuIHJldENvZGU7Cit9CisKK3RTaXJSZXRTdGF0dXMgbGltX3NldF9tZW1iZXJzaGlwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIHRVcGRhdGVNZW1iZXJzaGlwICpwVGVtcFBhcmFtLAorCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRVcGRhdGVNZW1iZXJzaGlwICpwTWVtYmVyc2hpcCA9IE5VTEw7CisJdFNpclJldFN0YXR1cyByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworCXRTaXJNc2dRIG1zZ1E7CisKKwlwTWVtYmVyc2hpcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0VXBkYXRlTWVtYmVyc2hpcCkpOworCWlmIChOVUxMID09IHBNZW1iZXJzaGlwKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBVcGRhdGUgTWVtYmVyc2hpcCBNb2RlIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcE1lbWJlcnNoaXAsIHBUZW1wUGFyYW0sCisJCSAgICAgc2l6ZW9mKHRVcGRhdGVNZW1iZXJzaGlwKSk7CisKKwltc2dRLnR5cGUgPSBXTUFfVVBEQVRFX01FTUJFUlNISVA7CisJbXNnUS5yZXNlcnZlZCA9IDA7CisJbXNnUS5ib2R5cHRyID0gcE1lbWJlcnNoaXA7CisJbXNnUS5ib2R5dmFsID0gMDsKKwlQRUxPRzMobGltX2xvZyhwTWFjLCBMT0czLCBGTCgiU2VuZGluZyBXTUFfVVBEQVRFX01FTUJFUlNISVAiKSk7KQorCWlmIChOVUxMID09IHBzZXNzaW9uRW50cnkpCisJCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIE5PX1NFU1NJT04sIG1zZ1EudHlwZSkpOworCWVsc2UKKwkJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywKKwkJCQkJcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJCW1zZ1EudHlwZSkpOworCXJldENvZGUgPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnUSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSByZXRDb2RlKSB7CisJCWNkZl9tZW1fZnJlZShwTWVtYmVyc2hpcCk7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJQb3N0aW5nIFdNQV9VUERBVEVfTUVNQkVSU0hJUCBmYWlsZWQsIHJlYXNvbj0lWCIpLAorCQkJcmV0Q29kZSk7CisJfQorCisJcmV0dXJuIHJldENvZGU7Cit9CisKK3RTaXJSZXRTdGF0dXMgbGltX3NldF91c2VyX3Bvcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgIHRVcGRhdGVVc2VyUG9zICpwVGVtcFBhcmFtLAorCQkJICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFVwZGF0ZVVzZXJQb3MgKnBVc2VyUG9zID0gTlVMTDsKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdFNpck1zZ1EgbXNnUTsKKworCXBVc2VyUG9zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRVcGRhdGVVc2VyUG9zKSk7CisJaWYgKE5VTEwgPT0gcFVzZXJQb3MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIFVwZGF0ZSBVc2VyIFBvc2l0aW9uIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcFVzZXJQb3MsIHBUZW1wUGFyYW0sIHNpemVvZih0VXBkYXRlVXNlclBvcykpOworCisJbXNnUS50eXBlID0gV01BX1VQREFURV9VU0VSUE9TOworCW1zZ1EucmVzZXJ2ZWQgPSAwOworCW1zZ1EuYm9keXB0ciA9IHBVc2VyUG9zOworCW1zZ1EuYm9keXZhbCA9IDA7CisJUEVMT0czKGxpbV9sb2cocE1hYywgTE9HMywgRkwoIlNlbmRpbmcgV01BX1VQREFURV9VU0VSUE9TIikpOykKKwlpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KQorCQlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBOT19TRVNTSU9OLCBtc2dRLnR5cGUpKTsKKwllbHNlCisJCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsCisJCQkJCXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkLAorCQkJCQltc2dRLnR5cGUpKTsKKwlyZXRDb2RlID0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ1EpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkgeworCQljZGZfbWVtX2ZyZWUocFVzZXJQb3MpOworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiUG9zdGluZyBXTUFfVVBEQVRFX1VTRVJQT1MgZmFpbGVkLCByZWFzb249JVgiKSwKKwkJCXJldENvZGUpOworCX0KKworCXJldHVybiByZXRDb2RlOworfQorCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKy8qKgorICogbGltX3NlbmRfZXhjbHVkZV91bmVuY3J5cHRfaW5kKCkgLSBzZW5kcyBXTUFfRVhDTFVERV9VTkVOQ1JZUFRFRF9JTkQgdG8gSEFMCisgKiBAcE1hYzogICAgICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAZXhjbHVkZVVuZW5jOiAgdHJ1ZTogaWdub3JlLCBmYWxzZTogaW5kaWNhdGUKKyAqIEBwc2Vzc2lvbkVudHJ5OiBzZXNzaW9uIGNvbnRleHQKKyAqCisgKiBMSU0gc2VuZHMgYSBtZXNzYWdlIHRvIEhBTCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGlnbm9yZSBvciBpbmRpY2F0ZSB0aGUKKyAqIHVucHJvdGVjdGVkIHBhY2tldCBlcnJvci4KKyAqCisgKiBSZXR1cm46IHN0YXR1cyBvZiBvcGVyYXRpb24KKyAqLwordFNpclJldFN0YXR1cyBsaW1fc2VuZF9leGNsdWRlX3VuZW5jcnlwdF9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICBib29sIGV4Y2x1ZGVVbmVuYywKKwkJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJSZXRTdGF0dXMgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKwl0U2lyTXNnUSBtc2dROworCXRTaXJXbGFuRXhjbHVkZVVuZW5jcnlwdFBhcmFtICpwRXhjbHVkZVVuZW5jcnlwdFBhcmFtOworCisJcEV4Y2x1ZGVVbmVuY3J5cHRQYXJhbSA9CisJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyV2xhbkV4Y2x1ZGVVbmVuY3J5cHRQYXJhbSkpOworCWlmIChOVUxMID09IHBFeGNsdWRlVW5lbmNyeXB0UGFyYW0pIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIGxpbV9zZW5kX2V4Y2x1ZGVfdW5lbmNyeXB0X2luZCIpKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisKKwlwRXhjbHVkZVVuZW5jcnlwdFBhcmFtLT5leGNsdWRlVW5lbmNyeXB0ID0gZXhjbHVkZVVuZW5jOworCXNpcl9jb3B5X21hY19hZGRyKHBFeGNsdWRlVW5lbmNyeXB0UGFyYW0tPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKwltc2dRLnR5cGUgPSBXTUFfRVhDTFVERV9VTkVOQ1JZUFRFRF9JTkQ7CisJbXNnUS5yZXNlcnZlZCA9IDA7CisJbXNnUS5ib2R5cHRyID0gcEV4Y2x1ZGVVbmVuY3J5cHRQYXJhbTsKKwltc2dRLmJvZHl2YWwgPSAwOworCVBFTE9HMyhsaW1fbG9nKHBNYWMsIExPRzMsIEZMKCJTZW5kaW5nIFdNQV9FWENMVURFX1VORU5DUllQVEVEX0lORCIpKTspCisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIG1zZ1EudHlwZSkpOworCXJldENvZGUgPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnUSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSByZXRDb2RlKSB7CisJCWNkZl9tZW1fZnJlZShwRXhjbHVkZVVuZW5jcnlwdFBhcmFtKTsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlBvc3RpbmcgV01BX0VYQ0xVREVfVU5FTkNSWVBURURfSU5EIGZhaWxlZCwgcmVhc29uPSVYIiksCisJCQlyZXRDb2RlKTsKKwl9CisKKwlyZXR1cm4gcmV0Q29kZTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VuZF9tZXNzYWdlcy5oIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VuZF9tZXNzYWdlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODRkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zZW5kX21lc3NhZ2VzLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogbGltX3NlbmRfbWVzc2FnZXMuaDogUHJvdmlkZXMgZnVuY3Rpb25zIHRvIHNlbmQgbWVzc2FnZXMgb3IgSW5kaWNhdGlvbnMgdG8gSEFMLgorICogQXV0aG9yOiAgICBTdW5pdCBCaGF0aWEKKyAqIERhdGU6ICAgICAgIDA5LzIxLzIwMDYKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgTW9kaWZpZWQgYnkgICAgICAgICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2lmbmRlZiBfX0xJTV9TRU5EX01FU1NBR0VTX0gKKyNkZWZpbmUgX19MSU1fU0VORF9NRVNTQUdFU19ICisKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAid21hX2lmLmgiCisjaW5jbHVkZSAic2lyX3BhcmFtcy5oIgordFNpclJldFN0YXR1cyBsaW1fc2VuZF9jZl9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBic3NJZHgsCisJCQkJIHVpbnQ4X3QgY2ZwQ291bnQsIHVpbnQ4X3QgY2ZwUGVyaW9kKTsKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfYmVhY29uX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcFVwZGF0ZWRCY25QYXJhbXMsCisJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKy8qIHRTaXJSZXRTdGF0dXMgbGltX3NlbmRfYmVhY29uX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwVXBkYXRlZEJjblBhcmFtcyk7ICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfbW9kZV91cGRhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICB0VXBkYXRlVkhUT3BNb2RlICp0ZW1wUGFyYW0sCisJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX3J4X25zc191cGRhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgIHRVcGRhdGVSeE5zcyAqdGVtcFBhcmFtLAorCQkJCSAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3VpbnQzMl90IGxpbV9nZXRfY2VudGVyX2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl1aW50OF90IHByaW1hcnljaGFuTnVtLAorCQkJCWVQaHlDaGFuQm9uZFN0YXRlIHNlY29uZGFyeUNoYW5PZmZzZXQsCisJCQkJdWludDhfdCBjaGFuV2lkdGgpOworCit0U2lyUmV0U3RhdHVzIGxpbV9zZXRfbWVtYmVyc2hpcCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSB0VXBkYXRlTWVtYmVyc2hpcCAqcFRlbXBQYXJhbSwKKwkJCQkgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3RTaXJSZXRTdGF0dXMgbGltX3NldF91c2VyX3Bvcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgIHRVcGRhdGVVc2VyUG9zICpwVGVtcFBhcmFtLAorCQkJICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCit0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX3N3aXRjaF9jaG5sX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgIHVpbnQ4X3QgY2hubE51bWJlciwKKwkJCQkJICB1aW50OF90IGNoX2NlbnRlcl9mcmVxX3NlZzAsCisJCQkJCSAgdWludDhfdCBjaF9jZW50ZXJfZnJlcV9zZWcxLAorCQkJCQkgIHBoeV9jaF93aWR0aCBjaF93aWR0aCwKKwkJCQkJICB0UG93ZXJkQm0gbWF4VHhQb3dlciwKKwkJCQkJICB1aW50OF90IHBlU2Vzc2lvbklkLAorCQkJCQkgIHVpbnQ4X3QgaXNfcmVzdGFydCk7CisjZWxzZQordFNpclJldFN0YXR1cyBsaW1fc2VuZF9zd2l0Y2hfY2hubF9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICB1aW50OF90IGNobmxOdW1iZXIsCisJCQkJCSAgdWludDhfdCBjaF9jZW50ZXJfZnJlcV9zZWcwLAorCQkJCQkgIHVpbnQ4X3QgY2hfY2VudGVyX2ZyZXFfc2VnMSwKKwkJCQkJICBwaHlfY2hfd2lkdGggY2hfd2lkdGgsCisJCQkJCSAgdWludDhfdCBsb2NhbFB3ckNvbnN0cmFpbnQsCisJCQkJCSAgdWludDhfdCBwZVNlc3Npb25JZCwKKwkJCQkJICB1aW50OF90IGlzX3Jlc3RhcnQpOworI2VuZGlmCit0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX2VkY2FfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgdFNpck1hY0VkY2FQYXJhbVJlY29yZCAqcFVwZGF0ZWRFZGNhUGFyYW1zLAorCQkJCSAgIHVpbnQxNl90IGJzc0lkeCk7Cit0U2lyUmV0U3RhdHVzIGxpbV9zZXRfbGlua19zdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTGlua1N0YXRlIHN0YXRlLAorCQkJCSB0U2lyTWFjQWRkciBic3NJZCwgdFNpck1hY0FkZHIgc2VsZk1hYywKKwkJCQkgdHBTZXRMaW5rU3RhdGVDYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgdm9pZCAqY2FsbGJhY2tBcmcpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1fc2V0X2xpbmtfc3RhdGVfZnQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckxpbmtTdGF0ZQorCQkJCQkgICBzdGF0ZSwgdFNpck1hY0FkZHIgYnNzSWQsCisJCQkJCSAgIHRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyLCBpbnQgZnQsCisJCQkJCSAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCit2b2lkIGxpbV9zZXRfYWN0aXZlX2VkY2FfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdFNpck1hY0VkY2FQYXJhbVJlY29yZCAqcGxvY2FsRWRjYVBhcmFtcywKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKyNkZWZpbmUgQ0FQQUJJTElUWV9GSUxURVJfTUFTSyAgMHg3M0NGCisjZGVmaW5lIEVSUF9GSUxURVJfTUFTSyAgICAgICAgIDB4RjgKKyNkZWZpbmUgRURDQV9GSUxURVJfTUFTSyAgICAgICAgMHhGMAorI2RlZmluZSBRT1NfRklMVEVSX01BU0sgICAgICAgICAweEYwCisjZGVmaW5lIEhUX0JZVEUwX0ZJTFRFUl9NQVNLICAgIDB4MAorI2RlZmluZSBIVF9CWVRFMl9GSUxURVJfTUFTSyAgICAweEVCCisjZGVmaW5lIEhUX0JZVEU1X0ZJTFRFUl9NQVNLICAgIDB4RkQKKyNkZWZpbmUgRFNfUEFSQU1fQ0hBTk5FTF9NQVNLICAgMHgwCisjZGVmaW5lIFZIVE9QX0NIV0lEVEhfTUFTSyAgICAgIDB4RkMKKwordFNpclJldFN0YXR1cyBsaW1fc2VuZF9iZWFjb25fZmlsdGVyX2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfZXhjbHVkZV91bmVuY3J5cHRfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgYm9vbCBleGNsdWRlVW5lbmMsCisJCQkJCSAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VuZF9zbWVfcnNwX21lc3NhZ2VzLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zZW5kX3NtZV9yc3BfbWVzc2FnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjcxMTNjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VuZF9zbWVfcnNwX21lc3NhZ2VzLmMKQEAgLTAsMCArMSwyMzcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGxpbV9zZW5kX3NtZV9yc3BNZXNzYWdlcy5jYyBjb250YWlucyB0aGUgZnVuY3Rpb25zCisgKiBmb3Igc2VuZGluZyBTTUUgcmVzcG9uc2Uvbm90aWZpY2F0aW9uIG1lc3NhZ2VzIHRvIGFwcGxpY2F0aW9ucworICogYWJvdmUgTUFDIHNvZnR3YXJlLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAic2lyX2NvbW1vbi5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKworI2luY2x1ZGUgInduaV9jZmcuaCIKKyNpbmNsdWRlICJzeXNfZGVmLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorCisjaW5jbHVkZSAic2NoX2FwaS5oIgorI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZWN1cml0eV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZXJfZGVzX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlbmRfc21lX3JzcF9tZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbV9pYnNzX3BlZXJfbWdtdC5oIgorI2luY2x1ZGUgImxpbV9zZXNzaW9uX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorCitzdGF0aWMgdm9pZCBsaW1faGFuZGxlX2pvaW5fcnNwX3N0YXR1cyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnksIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRfY29kZSwKKwl0cFNpclNtZUpvaW5Sc3Agc21lX2pvaW5fcnNwKTsKKworLyoqCisgKiBsaW1fc2VuZF9zbWVfcnNwKCkgLSBTZW5kIFJlc3BvbnNlIHRvIHVwcGVyIGxheWVycworICogQG1hY19jdHg6ICAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBtc2dfdHlwZTogICAgICAgICBJbmRpY2F0ZXMgbWVzc2FnZSB0eXBlCisgKiBAcmVzdWx0X2NvZGU6ICAgICAgIEluZGljYXRlcyB0aGUgcmVzdWx0IG9mIHByZXZpb3VzbHkgaXNzdWVkCisgKiAgICAgICAgICAgICAgICAgICAgZVdOSV9TTUVfbXNnX3R5cGVfUkVRIG1lc3NhZ2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19zbWVfcmVxX21lc3NhZ2VzKCkgdG8gc2VuZAorICogZVdOSV9TTUVfU1RBUlRfUlNQLCBlV05JX1NNRV9TVE9QX0JTU19SU1AKKyAqIG9yIGVXTklfU01FX1NXSVRDSF9DSExfUlNQIG1lc3NhZ2VzIHRvIGFwcGxpY2F0aW9ucyBhYm92ZSBNQUMKKyAqIFNvZnR3YXJlLgorICoKKyAqIFJldHVybjogTm9uZQorICovCisKK3ZvaWQKK2xpbV9zZW5kX3NtZV9yc3AodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDE2X3QgbXNnX3R5cGUsCisJIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRfY29kZSwgdWludDhfdCBzbWVfc2Vzc2lvbl9pZCwKKwkgdWludDE2X3Qgc21lX3RyYW5zYWN0aW9uX2lkKQoreworCXRTaXJNc2dRIG1zZzsKKwl0U2lyU21lUnNwICpzbWVfcnNwOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiU2VuZGluZyBtZXNzYWdlICVzIHdpdGggcmVhc29uQ29kZSAlcyIpLAorCQlsaW1fbXNnX3N0cihtc2dfdHlwZSksIGxpbV9yZXN1bHRfY29kZV9zdHIocmVzdWx0X2NvZGUpKTsKKworCXNtZV9yc3AgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclNtZVJzcCkpOworCWlmIChOVUxMID09IHNtZV9yc3ApIHsKKwkJLyogQnVmZmVyIG5vdCBhdmFpbGFibGUuIExvZyBlcnJvciAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgTE9HUCwKKwkJCUZMKCJjYWxsIHRvIEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfKl9SU1AiKSk7CisJCXJldHVybjsKKwl9CisKKwlzbWVfcnNwLT5tZXNzYWdlVHlwZSA9IG1zZ190eXBlOworCXNtZV9yc3AtPmxlbmd0aCA9IHNpemVvZih0U2lyU21lUnNwKTsKKwlzbWVfcnNwLT5zdGF0dXNDb2RlID0gcmVzdWx0X2NvZGU7CisKKwlzbWVfcnNwLT5zZXNzaW9uSWQgPSBzbWVfc2Vzc2lvbl9pZDsKKwlzbWVfcnNwLT50cmFuc2FjdGlvbklkID0gc21lX3RyYW5zYWN0aW9uX2lkOworCisJbXNnLnR5cGUgPSBtc2dfdHlwZTsKKwltc2cuYm9keXB0ciA9IHNtZV9yc3A7CisJbXNnLmJvZHl2YWwgPSAwOworCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KG1hY19jdHgsIHNtZV9zZXNzaW9uX2lkLCBtc2cudHlwZSkpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIGVXTklfU01FX1NUT1BfQlNTX1JTUDoKKwkJbGltX2RpYWdfZXZlbnRfcmVwb3J0KG1hY19jdHgsIFdMQU5fUEVfRElBR19TVE9QX0JTU19SU1BfRVZFTlQsCisJCQkJTlVMTCwgKHVpbnQxNl90KSByZXN1bHRfY29kZSwgMCk7CisJCWJyZWFrOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKG1hY19jdHgsICZtc2csIGVQUk9UKTsKK30KKworCisKKy8qKgorICogbGltX3NlbmRfc21lX3JvY19yc3AoKSAtIFNlbmQgUmVzcG9uc2UgdG8gU01FCisgKiBAbWFjX2N0eDogICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHN0YXR1czogICAgICAgICAgIFJlc3VtZSBsaW5rIHN0YXR1cworICogQHJlc3VsdF9jb2RlOiAgUmVzdWx0IG9mIHRoZSBST0MgcmVxdWVzdAorICogQHNtZV9zZXNzaW9uX2lkOiAgIFNNRSBzZXNzb24gSWQKKyAqIEBzY2FuX2lkOiAgU2NhbiBJZGVudGlmaWVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBST0MgcnNwCisgKiBtZXNzYWdlIHRvIFNNRS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZAorbGltX3NlbmRfc21lX3JvY19yc3AodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDE2X3QgbXNnX3R5cGUsCisJIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRfY29kZSwgdWludDhfdCBzbWVfc2Vzc2lvbl9pZCwKKwkgdWludDMyX3Qgc2Nhbl9pZCkKK3sKKwl0U2lyTXNnUSBtc2c7CisJc3RydWN0IHNpcl9yb2NfcnNwICpzbWVfcnNwOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgiU2VuZGluZyBtZXNzYWdlICVzIHdpdGggcmVhc29uQ29kZSAlcyBzY2FuSWQgJWQiKSwKKwkJbGltX21zZ19zdHIobXNnX3R5cGUpLCBsaW1fcmVzdWx0X2NvZGVfc3RyKHJlc3VsdF9jb2RlKSwKKwkJc2Nhbl9pZCk7CisKKwlzbWVfcnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaXJfcm9jX3JzcCkpOworCWlmIChOVUxMID09IHNtZV9yc3ApIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIExPR1AsCisJCQlGTCgiY2FsbCB0byBBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FXypfUlNQIikpOworCQlyZXR1cm47CisJfQorCisJc21lX3JzcC0+bWVzc2FnZV90eXBlID0gbXNnX3R5cGU7CisJc21lX3JzcC0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzaXJfcm9jX3JzcCk7CisJc21lX3JzcC0+c3RhdHVzID0gcmVzdWx0X2NvZGU7CisKKwlzbWVfcnNwLT5zZXNzaW9uX2lkID0gc21lX3Nlc3Npb25faWQ7CisJc21lX3JzcC0+c2Nhbl9pZCA9IHNjYW5faWQ7CisKKwltc2cudHlwZSA9IG1zZ190eXBlOworCW1zZy5ib2R5cHRyID0gc21lX3JzcDsKKwltc2cuYm9keXZhbCA9IDA7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgobWFjX2N0eCwgc21lX3Nlc3Npb25faWQsIG1zZy50eXBlKSk7CisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKG1hY19jdHgsICZtc2csIGVQUk9UKTsKK30KKworCisvKioKKyAqIGxpbV9zZW5kX3NtZV9qb2luX3JlYXNzb2NfcnNwX2FmdGVyX3Jlc3VtZSgpIC0gU2VuZCBSZXNwb25zZSB0byBTTUUKKyAqIEBtYWNfY3R4ICAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBzdGF0dXMgICAgICAgICAgIFJlc3VtZSBsaW5rIHN0YXR1cworICogQGN0eCAgICAgICAgICAgICAgY29udGV4dCBwYXNzZWQgd2hpbGUgY2FsbGluZyByZXNtdW5lIGxpbmsuCisgKiAgICAgICAgICAgICAgICAgICAoam9pbiByZXNwb25zZSB0byBiZSBzZW50KQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgSm9pbi9SZWFzc29jIHJzcAorICogbWVzc2FnZSB0byBTTUUgYWZ0ZXIgdGhlIHJlc3VtZSBsaW5rLgorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBsaW1fc2VuZF9zbWVfam9pbl9yZWFzc29jX3JzcF9hZnRlcl9yZXN1bWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwlDREZfU1RBVFVTIHN0YXR1cywgdWludDMyX3QgKmN0eCkKK3sKKwl0U2lyTXNnUSBtc2c7CisJdHBTaXJTbWVKb2luUnNwIHNtZV9qb2luX3JzcCA9ICh0cFNpclNtZUpvaW5Sc3ApIGN0eDsKKworCW1zZy50eXBlID0gc21lX2pvaW5fcnNwLT5tZXNzYWdlVHlwZTsKKwltc2cuYm9keXB0ciA9IHNtZV9qb2luX3JzcDsKKwltc2cuYm9keXZhbCA9IDA7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgobWFjX2N0eCwgTk9fU0VTU0lPTiwgbXNnLnR5cGUpKTsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkobWFjX2N0eCwgJm1zZywgZVBST1QpOworfQorCisvKioKKyAqIGxpbV9oYW5kbGVfam9pbl9yc3Bfc3RhdHVzKCkgLSBIYW5kbGUgdGhlIHJlc3BvbnNlLgorICogQG1hY19jdHg6ICAgICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHNlc3Npb25fZW50cnk6ICAgICAgUEUgU2Vzc2lvbiBJbmZvCisgKiBAcmVzdWx0X2NvZGU6ICAgICAgICBJbmRpY2F0ZXMgdGhlIHJlc3VsdCBvZiBwcmV2aW91c2x5IGlzc3VlZAorICogICAgICAgICAgICAgICAgICAgICAgZVdOSV9TTUVfbXNnVHlwZV9SRVEgbWVzc2FnZQorICogQHNtZV9qb2luX3JzcCAgICAgICAgVGhlIHJlY2VpdmVkIHJlc3BvbnNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBoYW5kbGUgYm90aCB0aGUgc3VjY2VzcyBhbmQgZmFpbHVyZSBzdGF0dXMKKyAqIG9mIHRoZSByZWNlaXZlZCByZXNwb25zZS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX2hhbmRsZV9qb2luX3JzcF9zdGF0dXModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5LCB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0X2NvZGUsCisJdHBTaXJTbWVKb2luUnNwIHNtZV9qb2luX3JzcCkKK3sKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwl0U2lyU21lSFRQcm9maWxlICpodF9wcm9maWxlOworI2VuZGlmCisJaWYgKHJlc3VsdF9jb2RlID09IGVTSVJfU01FX1NVQ0NFU1MpIHsKKwkJaWYgKHNlc3Npb25fZW50cnktPmJlYWNvbiAhPSBOVUxMKSB7CisJCQlzbWVfam9pbl9yc3AtPmJlYWNvbkxlbmd0aCA9IHNlc3Npb25fZW50cnktPmJjbkxlbjsKKwkJCWNkZl9tZW1fY29weShzbWVfam9pbl9yc3AtPmZyYW1lcywKKwkJCQlzZXNzaW9uX2VudHJ5LT5iZWFjb24sCisJCQkJc21lX2pvaW5fcnNwLT5iZWFjb25MZW5ndGgpOworCQkJY2RmX21lbV9mcmVlKHNlc3Npb25fZW50cnktPmJlYWNvbik7CisJCQlzZXNzaW9uX2VudHJ5LT5iZWFjb24gPSBOVUxMOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJCZWFjb249JWQiKSwKKwkJCQlzZXNzaW9uX2VudHJ5LT5iY25MZW4pOworI2VuZGlmCisJCX0KKwkJaWYgKHNlc3Npb25fZW50cnktPmFzc29jUmVxICE9IE5VTEwpIHsKKwkJCXNtZV9qb2luX3JzcC0+YXNzb2NSZXFMZW5ndGggPQorCQkJCXNlc3Npb25fZW50cnktPmFzc29jUmVxTGVuOworCQkJY2RmX21lbV9jb3B5KHNtZV9qb2luX3JzcC0+ZnJhbWVzICsKKwkJCQlzZXNzaW9uX2VudHJ5LT5iY25MZW4sIHNlc3Npb25fZW50cnktPmFzc29jUmVxLAorCQkJCXNtZV9qb2luX3JzcC0+YXNzb2NSZXFMZW5ndGgpOworCQkJY2RmX21lbV9mcmVlKHNlc3Npb25fZW50cnktPmFzc29jUmVxKTsKKwkJCXNlc3Npb25fZW50cnktPmFzc29jUmVxID0gTlVMTDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQkJbGltX2xvZyhtYWNfY3R4LAorCQkJCUxPRzEsIEZMKCJBc3NvY1JlcT0lZCIpLAorCQkJCXNlc3Npb25fZW50cnktPmFzc29jUmVxTGVuKTsKKyNlbmRpZgorCQl9CisJCWlmIChzZXNzaW9uX2VudHJ5LT5hc3NvY1JzcCAhPSBOVUxMKSB7CisJCQlzbWVfam9pbl9yc3AtPmFzc29jUnNwTGVuZ3RoID0KKwkJCQlzZXNzaW9uX2VudHJ5LT5hc3NvY1JzcExlbjsKKwkJCWNkZl9tZW1fY29weShzbWVfam9pbl9yc3AtPmZyYW1lcyArCisJCQkJc2Vzc2lvbl9lbnRyeS0+YmNuTGVuICsKKwkJCQlzZXNzaW9uX2VudHJ5LT5hc3NvY1JlcUxlbiwKKwkJCQlzZXNzaW9uX2VudHJ5LT5hc3NvY1JzcCwKKwkJCQlzbWVfam9pbl9yc3AtPmFzc29jUnNwTGVuZ3RoKTsKKwkJCWNkZl9tZW1fZnJlZShzZXNzaW9uX2VudHJ5LT5hc3NvY1JzcCk7CisJCQlzZXNzaW9uX2VudHJ5LT5hc3NvY1JzcCA9IE5VTEw7CisJCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQlpZiAoc2Vzc2lvbl9lbnRyeS0+cmljRGF0YSAhPSBOVUxMKSB7CisJCQlzbWVfam9pbl9yc3AtPnBhcnNlZFJpY1JzcExlbiA9CisJCQkJc2Vzc2lvbl9lbnRyeS0+UklDRGF0YUxlbjsKKwkJCWNkZl9tZW1fY29weShzbWVfam9pbl9yc3AtPmZyYW1lcyArCisJCQkJc2Vzc2lvbl9lbnRyeS0+YmNuTGVuICsKKwkJCQlzZXNzaW9uX2VudHJ5LT5hc3NvY1JlcUxlbiArCisJCQkJc2Vzc2lvbl9lbnRyeS0+YXNzb2NSc3BMZW4sCisJCQkJc2Vzc2lvbl9lbnRyeS0+cmljRGF0YSwKKwkJCQlzbWVfam9pbl9yc3AtPnBhcnNlZFJpY1JzcExlbik7CisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9lbnRyeS0+cmljRGF0YSk7CisJCQlzZXNzaW9uX2VudHJ5LT5yaWNEYXRhID0gTlVMTDsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlJpY0xlbmd0aD0lZCIpLAorCQkJCXNtZV9qb2luX3JzcC0+cGFyc2VkUmljUnNwTGVuKTsKKwkJfQorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQlpZiAoc2Vzc2lvbl9lbnRyeS0+dHNwZWNJZXMgIT0gTlVMTCkgeworCQkJc21lX2pvaW5fcnNwLT50c3BlY0llTGVuID0KKwkJCQlzZXNzaW9uX2VudHJ5LT50c3BlY0xlbjsKKwkJCWNkZl9tZW1fY29weShzbWVfam9pbl9yc3AtPmZyYW1lcyArCisJCQkJc2Vzc2lvbl9lbnRyeS0+YmNuTGVuICsKKwkJCQlzZXNzaW9uX2VudHJ5LT5hc3NvY1JlcUxlbiArCisJCQkJc2Vzc2lvbl9lbnRyeS0+YXNzb2NSc3BMZW4gKworCQkJCXNlc3Npb25fZW50cnktPlJJQ0RhdGFMZW4sCisJCQkJc2Vzc2lvbl9lbnRyeS0+dHNwZWNJZXMsCisJCQkJc21lX2pvaW5fcnNwLT50c3BlY0llTGVuKTsKKwkJCWNkZl9tZW1fZnJlZShzZXNzaW9uX2VudHJ5LT50c3BlY0llcyk7CisJCQlzZXNzaW9uX2VudHJ5LT50c3BlY0llcyA9IE5VTEw7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJFU0UtVHNwZWNMZW49JWQiKSwKKwkJCQlzZXNzaW9uX2VudHJ5LT50c3BlY0xlbik7CisJCX0KKyNlbmRpZgorCQlzbWVfam9pbl9yc3AtPmFpZCA9IHNlc3Npb25fZW50cnktPmxpbUFJRDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJBc3NvY1JzcD0lZCIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+YXNzb2NSc3BMZW4pOworI2VuZGlmCisJCXNtZV9qb2luX3JzcC0+dmh0X2NoYW5uZWxfd2lkdGggPQorCQkJc2Vzc2lvbl9lbnRyeS0+Y2hfd2lkdGg7CisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisJCWlmIChzZXNzaW9uX2VudHJ5LT5jY19zd2l0Y2hfbW9kZSAhPQorCQkJCUNERl9NQ0NfVE9fU0NDX1NXSVRDSF9ESVNBQkxFKSB7CisJCQlodF9wcm9maWxlID0gJnNtZV9qb2luX3JzcC0+SFRQcm9maWxlOworCQkJaHRfcHJvZmlsZS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCXNlc3Npb25fZW50cnktPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworCQkJaHRfcHJvZmlsZS0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPQorCQkJCXNlc3Npb25fZW50cnktPmh0UmVjb21tZW5kZWRUeFdpZHRoU2V0OworCQkJaHRfcHJvZmlsZS0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0KKwkJCQlzZXNzaW9uX2VudHJ5LT5odFNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisJCQlodF9wcm9maWxlLT5kb3QxMW1vZGUgPSBzZXNzaW9uX2VudHJ5LT5kb3QxMW1vZGU7CisJCQlodF9wcm9maWxlLT5odENhcGFiaWxpdHkgPSBzZXNzaW9uX2VudHJ5LT5odENhcGFiaWxpdHk7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJCWh0X3Byb2ZpbGUtPnZodENhcGFiaWxpdHkgPQorCQkJCXNlc3Npb25fZW50cnktPnZodENhcGFiaWxpdHk7CisJCQlodF9wcm9maWxlLT52aHRUeENoYW5uZWxXaWR0aFNldCA9CisJCQkJc2Vzc2lvbl9lbnRyeS0+dmh0VHhDaGFubmVsV2lkdGhTZXQ7CisJCQlodF9wcm9maWxlLT5hcENlbnRlckNoYW4gPSBzZXNzaW9uX2VudHJ5LT5jaF9jZW50ZXJfZnJlcV9zZWcwOworCQkJaHRfcHJvZmlsZS0+YXBDaGFuV2lkdGggPSBzZXNzaW9uX2VudHJ5LT5jaF93aWR0aDsKKyNlbmRpZgorCQl9CisjZW5kaWYKKwl9IGVsc2UgeworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+YmVhY29uICE9IE5VTEwpIHsKKwkJCWNkZl9tZW1fZnJlZShzZXNzaW9uX2VudHJ5LT5iZWFjb24pOworCQkJc2Vzc2lvbl9lbnRyeS0+YmVhY29uID0gTlVMTDsKKwkJfQorCQlpZiAoc2Vzc2lvbl9lbnRyeS0+YXNzb2NSZXEgIT0gTlVMTCkgeworCQkJY2RmX21lbV9mcmVlKHNlc3Npb25fZW50cnktPmFzc29jUmVxKTsKKwkJCXNlc3Npb25fZW50cnktPmFzc29jUmVxID0gTlVMTDsKKwkJfQorCQlpZiAoc2Vzc2lvbl9lbnRyeS0+YXNzb2NSc3AgIT0gTlVMTCkgeworCQkJY2RmX21lbV9mcmVlKHNlc3Npb25fZW50cnktPmFzc29jUnNwKTsKKwkJCXNlc3Npb25fZW50cnktPmFzc29jUnNwID0gTlVMTDsKKwkJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCWlmIChzZXNzaW9uX2VudHJ5LT5yaWNEYXRhICE9IE5VTEwpIHsKKwkJCWNkZl9tZW1fZnJlZShzZXNzaW9uX2VudHJ5LT5yaWNEYXRhKTsKKwkJCXNlc3Npb25fZW50cnktPnJpY0RhdGEgPSBOVUxMOworCQl9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCWlmIChzZXNzaW9uX2VudHJ5LT50c3BlY0llcyAhPSBOVUxMKSB7CisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9lbnRyeS0+dHNwZWNJZXMpOworCQkJc2Vzc2lvbl9lbnRyeS0+dHNwZWNJZXMgPSBOVUxMOworCQl9CisjZW5kaWYKKwl9Cit9CisvKioKKyAqIGxpbV9zZW5kX3NtZV9qb2luX3JlYXNzb2NfcnNwKCkgLSBTZW5kIFJlc3BvbnNlIHRvIFVwcGVyIExheWVycworICogQG1hY19jdHg6ICAgICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1zZ190eXBlOiAgICAgICAgICAgSW5kaWNhdGVzIG1lc3NhZ2UgdHlwZQorICogQHJlc3VsdF9jb2RlOiAgICAgICAgSW5kaWNhdGVzIHRoZSByZXN1bHQgb2YgcHJldmlvdXNseSBpc3N1ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIGVXTklfU01FX21zZ1R5cGVfUkVRIG1lc3NhZ2UKKyAqIEBwcm90X3N0YXR1c19jb2RlOiAgIFByb3RvY29sIFN0YXR1cyBDb2RlCisgKiBAc2Vzc2lvbl9lbnRyeTogICAgICBQRSBTZXNzaW9uIEluZm8KKyAqIEBzbWVfc2Vzc2lvbl9pZDogICAgIFNNRSBTZXNzaW9uIElECisgKiBAc21lX3RyYW5zYWN0aW9uX2lkOiBTTUUgVHJhbnNhY3Rpb24gSUQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19zbWVfcmVxX21lc3NhZ2VzKCkgdG8gc2VuZAorICogZVdOSV9TTUVfSk9JTl9SU1Agb3IgZVdOSV9TTUVfUkVBU1NPQ19SU1AgbWVzc2FnZXMgdG8gYXBwbGljYXRpb25zCisgKiBhYm92ZSBNQUMgU29mdHdhcmUuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KKwordm9pZAorbGltX3NlbmRfc21lX2pvaW5fcmVhc3NvY19yc3AodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDE2X3QgbXNnX3R5cGUsCisJdFNpclJlc3VsdENvZGVzIHJlc3VsdF9jb2RlLCB1aW50MTZfdCBwcm90X3N0YXR1c19jb2RlLAorCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnksIHVpbnQ4X3Qgc21lX3Nlc3Npb25faWQsCisJdWludDE2X3Qgc21lX3RyYW5zYWN0aW9uX2lkKQoreworCXRwU2lyU21lSm9pblJzcCBzbWVfam9pbl9yc3A7CisJdWludDMyX3QgcnNwX2xlbjsKKwl0cERwaEhhc2hOb2RlIHN0YV9kcyA9IE5VTEw7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWlmIChtc2dfdHlwZSA9PSBlV05JX1NNRV9SRUFTU09DX1JTUCkKKwkJbGltX2RpYWdfZXZlbnRfcmVwb3J0KG1hY19jdHgsIFdMQU5fUEVfRElBR19SRUFTU09DX1JTUF9FVkVOVCwKKwkJCXNlc3Npb25fZW50cnksICh1aW50MTZfdCkgcmVzdWx0X2NvZGUsIDApOworCWVsc2UKKwkJbGltX2RpYWdfZXZlbnRfcmVwb3J0KG1hY19jdHgsIFdMQU5fUEVfRElBR19KT0lOX1JTUF9FVkVOVCwKKwkJCXNlc3Npb25fZW50cnksICh1aW50MTZfdCkgcmVzdWx0X2NvZGUsIDApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlNlbmRpbmcgbWVzc2FnZSAlcyB3aXRoIHJlYXNvbkNvZGUgJXMiKSwKKwkJbGltX21zZ19zdHIobXNnX3R5cGUpLCBsaW1fcmVzdWx0X2NvZGVfc3RyKHJlc3VsdF9jb2RlKSk7CisKKwlpZiAoc2Vzc2lvbl9lbnRyeSA9PSBOVUxMKSB7CisJCXJzcF9sZW4gPSBzaXplb2YodFNpclNtZUpvaW5Sc3ApOworCQlzbWVfam9pbl9yc3AgPSBjZGZfbWVtX21hbGxvYyhyc3BfbGVuKTsKKwkJaWYgKE5VTEwgPT0gc21lX2pvaW5fcnNwKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJRkwoIk1lbSBBbGxvYyBmYWlsIC0gSk9JTi9SRUFTU09DX1JTUCIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHNtZV9qb2luX3JzcCwgcnNwX2xlbiwgMCk7CisJCXNtZV9qb2luX3JzcC0+YmVhY29uTGVuZ3RoID0gMDsKKwkJc21lX2pvaW5fcnNwLT5hc3NvY1JlcUxlbmd0aCA9IDA7CisJCXNtZV9qb2luX3JzcC0+YXNzb2NSc3BMZW5ndGggPSAwOworCX0gZWxzZSB7CisJCXJzcF9sZW4gPSBzZXNzaW9uX2VudHJ5LT5hc3NvY1JlcUxlbiArCisJCQlzZXNzaW9uX2VudHJ5LT5hc3NvY1JzcExlbiArIHNlc3Npb25fZW50cnktPmJjbkxlbiArCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJCXNlc3Npb25fZW50cnktPlJJQ0RhdGFMZW4gKworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQkJc2Vzc2lvbl9lbnRyeS0+dHNwZWNMZW4gKworI2VuZGlmCisJCQlzaXplb2YodFNpclNtZUpvaW5Sc3ApIC0gc2l6ZW9mKHVpbnQ4X3QpOworCQlzbWVfam9pbl9yc3AgPSBjZGZfbWVtX21hbGxvYyhyc3BfbGVuKTsKKwkJaWYgKE5VTEwgPT0gc21lX2pvaW5fcnNwKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQkJRkwoIk1lbUFsbG9jIGZhaWwgLSBKT0lOL1JFQVNTT0NfUlNQIikpOworCQkJcmV0dXJuOworCQl9CisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHNtZV9qb2luX3JzcCwgcnNwX2xlbiwgMCk7CisJCWlmIChyZXN1bHRfY29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKSB7CisJCQlzdGFfZHMgPSBkcGhfZ2V0X2hhc2hfZW50cnkobWFjX2N0eCwKKwkJCQlEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCQkmc2Vzc2lvbl9lbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCQlpZiAoc3RhX2RzID09IE5VTEwpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJHZXQgU2VsZiBTdGEgRW50cnkgZmFpbCIpKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogUGFzcyB0aGUgcGVlcidzIHN0YUlkICovCisJCQkJc21lX2pvaW5fcnNwLT5zdGFJZCA9IHN0YV9kcy0+c3RhSW5kZXg7CisJCQkJc21lX2pvaW5fcnNwLT51Y2FzdFNpZyA9CisJCQkJCXN0YV9kcy0+dWNVY2FzdFNpZzsKKwkJCQlzbWVfam9pbl9yc3AtPmJjYXN0U2lnID0KKwkJCQkJc3RhX2RzLT51Y0JjYXN0U2lnOworCQkJCXNtZV9qb2luX3JzcC0+dGltaW5nTWVhc0NhcCA9CisJCQkJCXN0YV9kcy0+dGltaW5nTWVhc0NhcDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCQkJCXNtZV9qb2luX3JzcC0+dGRsc19wcm9oaWJpdGVkID0KKwkJCQkJc2Vzc2lvbl9lbnRyeS0+dGRsc19wcm9oaWJpdGVkOworCQkJCXNtZV9qb2luX3JzcC0+dGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZCA9CisJCQkJICAgc2Vzc2lvbl9lbnRyeS0+dGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZDsKKyNlbmRpZgorCQkJfQorCQl9CisJCXNtZV9qb2luX3JzcC0+YmVhY29uTGVuZ3RoID0gMDsKKwkJc21lX2pvaW5fcnNwLT5hc3NvY1JlcUxlbmd0aCA9IDA7CisJCXNtZV9qb2luX3JzcC0+YXNzb2NSc3BMZW5ndGggPSAwOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCXNtZV9qb2luX3JzcC0+cGFyc2VkUmljUnNwTGVuID0gMDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJc21lX2pvaW5fcnNwLT50c3BlY0llTGVuID0gMDsKKyNlbmRpZgorCisJCWxpbV9oYW5kbGVfam9pbl9yc3Bfc3RhdHVzKG1hY19jdHgsIHNlc3Npb25fZW50cnksIHJlc3VsdF9jb2RlLAorCQkJc21lX2pvaW5fcnNwKTsKKwl9CisKKwlzbWVfam9pbl9yc3AtPm1lc3NhZ2VUeXBlID0gbXNnX3R5cGU7CisJc21lX2pvaW5fcnNwLT5sZW5ndGggPSAodWludDE2X3QpIHJzcF9sZW47CisJc21lX2pvaW5fcnNwLT5zdGF0dXNDb2RlID0gcmVzdWx0X2NvZGU7CisJc21lX2pvaW5fcnNwLT5wcm90U3RhdHVzQ29kZSA9IHByb3Rfc3RhdHVzX2NvZGU7CisKKwlzbWVfam9pbl9yc3AtPnNlc3Npb25JZCA9IHNtZV9zZXNzaW9uX2lkOworCXNtZV9qb2luX3JzcC0+dHJhbnNhY3Rpb25JZCA9IHNtZV90cmFuc2FjdGlvbl9pZDsKKworCWxpbV9zZW5kX3NtZV9qb2luX3JlYXNzb2NfcnNwX2FmdGVyX3Jlc3VtZShtYWNfY3R4LCBDREZfU1RBVFVTX1NVQ0NFU1MsCisJCQkodWludDMyX3QgKilzbWVfam9pbl9yc3ApOworfQorCisvKioKKyAqIGxpbV9zZW5kX3NtZV9zdGFydF9ic3NfcnNwKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGVXTklfU01FX1NUQVJUX0JTU19SU1AKKyAqIG1lc3NhZ2UgdG8gYXBwbGljYXRpb25zIGFib3ZlIE1BQyBTb2Z0d2FyZS4KKyAqCisgKioqUEFSQU1TOgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBtc2dUeXBlICAgICAgSW5kaWNhdGVzIG1lc3NhZ2UgdHlwZQorICogQHBhcmFtIHJlc3VsdENvZGUgICBJbmRpY2F0ZXMgdGhlIHJlc3VsdCBvZiBwcmV2aW91c2x5IGlzc3VlZAorICogICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9tc2dUeXBlX1JFUSBtZXNzYWdlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltX3NlbmRfc21lX3N0YXJ0X2Jzc19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgIHVpbnQxNl90IG1zZ1R5cGUsIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlLAorCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwgdWludDhfdCBzbWVzZXNzaW9uSWQsCisJCQkgICB1aW50MTZfdCBzbWV0cmFuc2FjdGlvbklkKQoreworCisJdWludDE2X3Qgc2l6ZSA9IDA7CisJdFNpck1zZ1EgbW1oTXNnOworCXRTaXJTbWVTdGFydEJzc1JzcCAqcFNpclNtZVJzcDsKKwl1aW50MTZfdCBpZUxlbjsKKwl1aW50MTZfdCBpZU9mZnNldCwgY3VyTGVuOworCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgbWVzc2FnZSAlcyB3aXRoIHJlYXNvbkNvZGUgJXMiKSwKKwkJICAgICAgIGxpbV9tc2dfc3RyKG1zZ1R5cGUpLCBsaW1fcmVzdWx0X2NvZGVfc3RyKHJlc3VsdENvZGUpKTsKKwkgICAgICAgKQorCisJc2l6ZSA9IHNpemVvZih0U2lyU21lU3RhcnRCc3NSc3ApOworCisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlwU2lyU21lUnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZSk7CisJCWlmIChOVUxMID09IHBTaXJTbWVSc3ApIHsKKwkJCS8qIC8gQnVmZmVyIG5vdCBhdmFpbGFibGUuIExvZyBlcnJvciAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiY2FsbCB0byBBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX1NUQVJUX0JTU19SU1AiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcFNpclNtZVJzcCwgc2l6ZSwgMCk7CisKKwl9IGVsc2UgeworCQkvKiBzdWJ0cmFjdCBzaXplIG9mIGJlYWNvbkxlbmd0aCArIE1hYyBIZHIgKyBGaXhlZCBGaWVsZHMgYmVmb3JlIFNTSUQgKi8KKwkJaWVPZmZzZXQgPSBzaXplb2YodEFuaUJlYWNvblN0cnVjdCkgKyBTSVJfTUFDX0JfUFJfU1NJRF9PRkZTRVQ7CisJCWllTGVuID0gcHNlc3Npb25FbnRyeS0+c2NoQmVhY29uT2Zmc2V0QmVnaW4KKwkJCSsgcHNlc3Npb25FbnRyeS0+c2NoQmVhY29uT2Zmc2V0RW5kIC0gaWVPZmZzZXQ7CisJCS8qIGNhbGN1bGF0ZSB0aGUgbWVtb3J5IHNpemUgdG8gYWxsb2NhdGUgKi8KKwkJc2l6ZSArPSBpZUxlbjsKKworCQlwU2lyU21lUnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZSk7CisJCWlmIChOVUxMID09IHBTaXJTbWVSc3ApIHsKKwkJCS8qIC8gQnVmZmVyIG5vdCBhdmFpbGFibGUuIExvZyBlcnJvciAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiY2FsbCB0byBBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX1NUQVJUX0JTU19SU1AiKSk7CisKKwkJCXJldHVybjsKKwkJfQorCQljZGZfbWVtX3NldCgodWludDhfdCAqKSBwU2lyU21lUnNwLCBzaXplLCAwKTsKKwkJc2l6ZSA9IHNpemVvZih0U2lyU21lU3RhcnRCc3NSc3ApOworCQlpZiAocmVzdWx0Q29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKSB7CisKKwkJCXNpcl9jb3B5X21hY19hZGRyKHBTaXJTbWVSc3AtPmJzc0Rlc2NyaXB0aW9uLmJzc0lkLAorCQkJCQkgIHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworCQkJLyogUmVhZCBiZWFjb24gaW50ZXJ2YWwgZnJvbSBzZXNzaW9uICovCisJCQlwU2lyU21lUnNwLT5ic3NEZXNjcmlwdGlvbi5iZWFjb25JbnRlcnZhbCA9CisJCQkJKHVpbnQxNl90KSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuCisJCQkJYmVhY29uSW50ZXJ2YWw7CisJCQlwU2lyU21lUnNwLT5ic3NUeXBlID0gcHNlc3Npb25FbnRyeS0+YnNzVHlwZTsKKworCQkJaWYgKGNmZ19nZXRfY2FwYWJpbGl0eV9pbmZvCisJCQkJICAgIChwTWFjLCAmcFNpclNtZVJzcC0+YnNzRGVzY3JpcHRpb24uY2FwYWJpbGl0eUluZm8sCisJCQkJICAgIHBzZXNzaW9uRW50cnkpCisJCQkgICAgIT0gZVNJUl9TVUNDRVNTKQorCQkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQkJRkwKKwkJCQkJCSgiY291bGQgbm90IHJldHJpZXZlIENhcGFiaWxpdGllcyB2YWx1ZSIpKTsKKworCQkJbGltX2dldF9waHlfbW9kZShwTWFjLAorCQkJCQkgKHVpbnQzMl90ICopICZwU2lyU21lUnNwLT5ic3NEZXNjcmlwdGlvbi4KKwkJCQkJIG53VHlwZSwgcHNlc3Npb25FbnRyeSk7CisKKwkJCXBTaXJTbWVSc3AtPmJzc0Rlc2NyaXB0aW9uLmNoYW5uZWxJZCA9CisJCQkJcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsOworCisJCQljdXJMZW4gPSBwc2Vzc2lvbkVudHJ5LT5zY2hCZWFjb25PZmZzZXRCZWdpbiAtIGllT2Zmc2V0OworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwU2lyU21lUnNwLT5ic3NEZXNjcmlwdGlvbi4KKwkJCQkgICAgIGllRmllbGRzLAorCQkJCSAgICAgcHNlc3Npb25FbnRyeS0+cFNjaEJlYWNvbkZyYW1lQmVnaW4gKworCQkJCSAgICAgaWVPZmZzZXQsICh1aW50MzJfdCkgY3VyTGVuKTsKKworCQkJY2RmX21lbV9jb3B5KCgodWludDhfdCAqKSAmcFNpclNtZVJzcC0+YnNzRGVzY3JpcHRpb24uCisJCQkJICAgICAgaWVGaWVsZHMpICsgY3VyTGVuLAorCQkJCSAgICAgcHNlc3Npb25FbnRyeS0+cFNjaEJlYWNvbkZyYW1lRW5kLAorCQkJCSAgICAgKHVpbnQzMl90KSBwc2Vzc2lvbkVudHJ5LT4KKwkJCQkgICAgIHNjaEJlYWNvbk9mZnNldEVuZCk7CisKKwkJCS8qIHN1YnRyYWN0aW5nIHNpemUgb2YgbGVuZ3RoIGluZGljYXRvciBpdHNlbGYgYW5kIHNpemUgb2YgcG9pbnRlciB0byBpZUZpZWxkcyAqLworCQkJcFNpclNtZVJzcC0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoID0KKwkJCQlzaXplb2YodFNpckJzc0Rlc2NyaXB0aW9uKSAtIHNpemVvZih1aW50MTZfdCkgLQorCQkJCXNpemVvZih1aW50MzJfdCkgKyBpZUxlbjsKKwkJCS8qIFRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UsIHN1YnRyYWN0aW5nIHRoZSBzaXplIG9mIHRoZSBwb2ludGVyIHRvIGllRmllbGRzICovCisJCQlzaXplICs9IGllTGVuIC0gc2l6ZW9mKHVpbnQzMl90KTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwkJCWlmIChwc2Vzc2lvbkVudHJ5LT5jY19zd2l0Y2hfbW9kZQorCQkJICAgICE9IENERl9NQ0NfVE9fU0NDX1NXSVRDSF9ESVNBQkxFKSB7CisJCQkJcFNpclNtZVJzcC0+SFRQcm9maWxlLgorCQkJCWh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQkJcHNlc3Npb25FbnRyeS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJCQkJcFNpclNtZVJzcC0+SFRQcm9maWxlLmh0UmVjb21tZW5kZWRUeFdpZHRoU2V0ID0KKwkJCQkJcHNlc3Npb25FbnRyeS0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisJCQkJcFNpclNtZVJzcC0+SFRQcm9maWxlLmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9CisJCQkJCXBzZXNzaW9uRW50cnktPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwkJCQlwU2lyU21lUnNwLT5IVFByb2ZpbGUuZG90MTFtb2RlID0KKwkJCQkJcHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlOworCQkJCXBTaXJTbWVSc3AtPkhUUHJvZmlsZS5odENhcGFiaWxpdHkgPQorCQkJCQlwc2Vzc2lvbkVudHJ5LT5odENhcGFiaWxpdHk7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJCQlwU2lyU21lUnNwLT5IVFByb2ZpbGUudmh0Q2FwYWJpbGl0eSA9CisJCQkJCXBzZXNzaW9uRW50cnktPnZodENhcGFiaWxpdHk7CisJCQkJcFNpclNtZVJzcC0+SFRQcm9maWxlLnZodFR4Q2hhbm5lbFdpZHRoU2V0ID0KKwkJCQkJcHNlc3Npb25FbnRyeS0+dmh0VHhDaGFubmVsV2lkdGhTZXQ7CisJCQkJcFNpclNtZVJzcC0+SFRQcm9maWxlLmFwQ2VudGVyQ2hhbiA9CisJCQkJCXBzZXNzaW9uRW50cnktPmNoX2NlbnRlcl9mcmVxX3NlZzA7CisJCQkJcFNpclNtZVJzcC0+SFRQcm9maWxlLmFwQ2hhbldpZHRoID0KKwkJCQkJcHNlc3Npb25FbnRyeS0+Y2hfd2lkdGg7CisjZW5kaWYKKwkJCX0KKyNlbmRpZgorCQl9CisKKwl9CisKKwlwU2lyU21lUnNwLT5tZXNzYWdlVHlwZSA9IG1zZ1R5cGU7CisJcFNpclNtZVJzcC0+bGVuZ3RoID0gc2l6ZTsKKworCS8qIFVwZGF0ZSBTTUUgc2Vzc2lvbiBJZCBhbmQgdHJhbnNhY3Rpb24gSWQgKi8KKwlwU2lyU21lUnNwLT5zZXNzaW9uSWQgPSBzbWVzZXNzaW9uSWQ7CisJcFNpclNtZVJzcC0+dHJhbnNhY3Rpb25JZCA9IHNtZXRyYW5zYWN0aW9uSWQ7CisJcFNpclNtZVJzcC0+c3RhdHVzQ29kZSA9IHJlc3VsdENvZGU7CisJaWYgKHBzZXNzaW9uRW50cnkgIT0gTlVMTCkKKwkJcFNpclNtZVJzcC0+c3RhSWQgPSBwc2Vzc2lvbkVudHJ5LT5zdGFJZDsgICAgICAgLyogZWxzZSBpdCB3aWxsIGJlIGFsd2F5cyB6ZXJvIHNtZVJzcCBTdGFJRCA9IDAgKi8KKworCW1taE1zZy50eXBlID0gbXNnVHlwZTsKKwltbWhNc2cuYm9keXB0ciA9IHBTaXJTbWVSc3A7CisJbW1oTXNnLmJvZHl2YWwgPSAwOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbW1oTXNnLnR5cGUpKTsKKwl9IGVsc2UgeworCQlNVFJBQ0UobWFjX3RyYWNlX21zZ190eAorCQkJICAgICAgIChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbW1oTXNnLnR5cGUpKTsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfU1RBUlRfQlNTX1JTUF9FVkVOVCwKKwkJCSAgICAgIHBzZXNzaW9uRW50cnksICh1aW50MTZfdCkgcmVzdWx0Q29kZSwgMCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKK30gLyoqKiBlbmQgbGltX3NlbmRfc21lX3N0YXJ0X2Jzc19yc3AoKSAqKiovCisKKyNkZWZpbmUgTElNX01BWF9OVU1fT0ZfU0NBTl9SRVNVTFRTX1JFUE9SVEVEICAyMAorI2RlZmluZSBMSU1fU0laRV9PRl9FQUNIX0JTUyAgNDAwICAgICAgIC8qIHRoaXMgaXMgYSByb3VnaCBlc3RpbWF0ZSAqLworCisvKioKKyAqIGxpbV9zZW5kX3NtZV9zY2FuX3JzcCgpIC0gU2VuZCBzY2FuIHJlc3BvbnNlIHRvIFNNRQorICogQHBNYWM6ICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQGxlbmd0aDogICAgICAgSW5kaWNhdGVzIGxlbmd0aCBvZiBtZXNzYWdlCisgKiBAcmVzdWx0Q29kZTogICBJbmRpY2F0ZXMgdGhlIHJlc3VsdCBvZiBwcmV2aW91c2x5IGlzc3VlZAorICogICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9TQ0FOX1JFUSBtZXNzYWdlCisgKiBAc2Nhbl9pZDogc2NhbiBpZGVudGlmaWVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX3Byb2Nlc3Nfc21lX3JlcV9tZXNzYWdlcygpIHRvIHNlbmQKKyAqIGVXTklfU01FX1NDQU5fUlNQIG1lc3NhZ2UgdG8gYXBwbGljYXRpb25zIGFib3ZlIE1BQworICoKKyAqIHJldHVybjogTm9uZQorICovCisKK3ZvaWQKK2xpbV9zZW5kX3NtZV9zY2FuX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZSwKKwkJdWludDhfdCBzbWVzZXNzaW9uSWQsIHVpbnQxNl90IHNtZXRyYW5zY2F0aW9uSWQsCisJCXVpbnQzMl90IHNjYW5faWQpCit7CisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgiU2VuZGluZyBtZXNzYWdlIFNNRV9TQ0FOX1JTUCByZWFzb25Db2RlICVzIHNjYW5JZCAlZCIpLAorCQlsaW1fcmVzdWx0X2NvZGVfc3RyKHJlc3VsdENvZGUpLCBzY2FuX2lkKTsKKwlsaW1fcG9zdF9zbWVfc2Nhbl9yc3BfbWVzc2FnZShwTWFjLCByZXN1bHRDb2RlLCBzbWVzZXNzaW9uSWQsCisJCQkJc21ldHJhbnNjYXRpb25JZCwgc2Nhbl9pZCk7Cit9CisKKy8qKgorICogbGltX3Bvc3Rfc21lX3NjYW5fcnNwX21lc3NhZ2UoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbV9zZW5kX3NtZV9zY2FuX3JzcCgpIHRvIHNlbmQKKyAqIGVXTklfU01FX1NDQU5fUlNQIG1lc3NhZ2Ugd2l0aCBmYWlsZWQgcmVzdWx0IGNvZGUKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gbGVuZ3RoICAgICAgIEluZGljYXRlcyBsZW5ndGggb2YgbWVzc2FnZQorICogQHBhcmFtIHJlc3VsdENvZGUgICBmYWlsZWQgcmVzdWx0IGNvZGUKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1fcG9zdF9zbWVfc2Nhbl9yc3BfbWVzc2FnZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUsIHVpbnQ4X3Qgc21lc2Vzc2lvbklkLAorCQkJdWludDE2X3Qgc21ldHJhbnNhY3Rpb25JZCwKKwkJCXVpbnQzMl90IHNjYW5faWQpCit7CisJdHBTaXJTbWVTY2FuUnNwIHBTaXJTbWVTY2FuUnNwOworCXRTaXJNc2dRIG1taE1zZzsKKworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoInNlbmQgU01FX1NDQU5fUlNQIChyZWFzb25Db2RlICVzKS4iKSwKKwkJbGltX3Jlc3VsdF9jb2RlX3N0cihyZXN1bHRDb2RlKSk7CisKKwlwU2lyU21lU2NhblJzcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU21lU2NhblJzcCkpOworCWlmIChOVUxMID09IHBTaXJTbWVTY2FuUnNwKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX1NDQU5fUlNQIikpOworCQlyZXR1cm47CisJfQorCWNkZl9tZW1fc2V0KCh2b2lkICopcFNpclNtZVNjYW5Sc3AsIHNpemVvZih0U2lyU21lU2NhblJzcCksIDApOworCisJcFNpclNtZVNjYW5Sc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfU0NBTl9SU1A7CisJcFNpclNtZVNjYW5Sc3AtPnN0YXR1c0NvZGUgPSByZXN1bHRDb2RlOworCisJLypVcGRhdGUgU01FIHNlc3Npb24gSWQgYW5kIHRyYW5zYWN0aW9uIElkICovCisJcFNpclNtZVNjYW5Sc3AtPnNlc3Npb25JZCA9IHNtZXNlc3Npb25JZDsKKwlwU2lyU21lU2NhblJzcC0+dHJhbnNjYXRpb25JZCA9IHNtZXRyYW5zYWN0aW9uSWQ7CisJcFNpclNtZVNjYW5Sc3AtPnNjYW5faWQgPSBzY2FuX2lkOworCisJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9TQ0FOX1JTUDsKKwltbWhNc2cuYm9keXB0ciA9IHBTaXJTbWVTY2FuUnNwOworCW1taE1zZy5ib2R5dmFsID0gMDsKKworCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIE5PX1NFU1NJT04sIG1taE1zZy50eXBlKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfU0NBTl9SU1BfRVZFTlQsIE5VTEwsCisJCQkgICAgICAodWludDE2X3QpIHJlc3VsdENvZGUsIDApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworCWxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisJcmV0dXJuOworCit9IC8qKiogbGltX3Bvc3Rfc21lX3NjYW5fcnNwX21lc3NhZ2UgKioqLworCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisKKy8qKgorICogbGltX3NlbmRfc21lX29lbV9kYXRhX3JzcCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX3Byb2Nlc3Nfc21lX3JlcV9tZXNzYWdlcygpIHRvIHNlbmQKKyAqIGVXTklfU01FX09FTV9EQVRBX1JTUCBtZXNzYWdlIHRvIGFwcGxpY2F0aW9ucyBhYm92ZSBNQUMKKyAqIFNvZnR3YXJlLgorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2dCdWYgICAgICBJbmRpY2F0ZXMgdGhlIG1sbSBtZXNzYWdlCisgKiBAcGFyYW0gcmVzdWx0Q29kZSAgIEluZGljYXRlcyB0aGUgcmVzdWx0IG9mIHByZXZpb3VzbHkgaXNzdWVkCisgKiAgICAgICAgICAgICAgICAgICAgIGVXTklfU01FX09FTV9EQVRBX1JTUCBtZXNzYWdlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1fc2VuZF9zbWVfb2VtX2RhdGFfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwTXNnQnVmLAorCQkJICAgICAgIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlKQoreworCXRTaXJNc2dRIG1taE1zZzsKKwl0U2lyT2VtRGF0YVJzcCAqcFNpclNtZU9lbURhdGFSc3AgPSBOVUxMOworCXRMaW1NbG1PZW1EYXRhUnNwICpwTWxtT2VtRGF0YVJzcCA9IE5VTEw7CisJdWludDE2X3QgbXNnTGVuZ3RoOworCisJLyogZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSBtbG0gbWVzc2FnZSAqLworCXBNbG1PZW1EYXRhUnNwID0gKHRMaW1NbG1PZW1EYXRhUnNwICopIChwTXNnQnVmKTsKKworCW1zZ0xlbmd0aCA9IHNpemVvZih0U2lyT2VtRGF0YVJzcCk7CisKKwkvKiBub3cgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgY2hhciBidWZmZXIgKi8KKwlwU2lyU21lT2VtRGF0YVJzcCA9IGNkZl9tZW1fbWFsbG9jKG1zZ0xlbmd0aCk7CisJaWYgKE5VTEwgPT0gcFNpclNtZU9lbURhdGFSc3ApIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwKKwkJCQkoImNhbGwgdG8gQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBwU2lyU21lT2VtRGF0YVJzcCIpKTsKKwkJcmV0dXJuOworCX0KKyNpZiBkZWZpbmVkIChBTklfTElUVExFX0JZVEVfRU5ESUFOKQorCXNpcl9zdG9yZV91MTZfbigodWludDhfdCAqKSAmcFNpclNtZU9lbURhdGFSc3AtPmxlbmd0aCwgbXNnTGVuZ3RoKTsKKwlzaXJfc3RvcmVfdTE2X24oKHVpbnQ4X3QgKikgJnBTaXJTbWVPZW1EYXRhUnNwLT5tZXNzYWdlVHlwZSwKKwkJCWVXTklfU01FX09FTV9EQVRBX1JTUCk7CisjZWxzZQorCXBTaXJTbWVPZW1EYXRhUnNwLT5sZW5ndGggPSBtc2dMZW5ndGg7CisJcFNpclNtZU9lbURhdGFSc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfT0VNX0RBVEFfUlNQOworI2VuZGlmCisKKwljZGZfbWVtX2NvcHkocFNpclNtZU9lbURhdGFSc3AtPm9lbURhdGFSc3AsIHBNbG1PZW1EYXRhUnNwLT5vZW1EYXRhUnNwLAorCQkgICAgIE9FTV9EQVRBX1JTUF9TSVpFKTsKKworCS8qIE5vdyBmcmVlIHRoZSBtZW1vcnkgZnJvbSBNTE0gUnNwIE1lc3NhZ2UgKi8KKwljZGZfbWVtX2ZyZWUocE1sbU9lbURhdGFSc3ApOworCisJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9PRU1fREFUQV9SU1A7CisJbW1oTXNnLmJvZHlwdHIgPSBwU2lyU21lT2VtRGF0YVJzcDsKKwltbWhNc2cuYm9keXZhbCA9IDA7CisKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCisJcmV0dXJuOworfSAvKioqIGxpbV9zZW5kX3NtZV9vZW1fZGF0YV9yc3AgKioqLworCisjZW5kaWYKKwordm9pZCBsaW1fc2VuZF9zbWVfZGlzYXNzb2NfZGVhdXRoX250Zih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgIENERl9TVEFUVVMgc3RhdHVzLCB1aW50MzJfdCAqcEN0eCkKK3sKKwl0U2lyTXNnUSBtbWhNc2c7CisJdFNpck1zZ1EgKnBNc2cgPSAodFNpck1zZ1EgKikgcEN0eDsKKworCW1taE1zZy50eXBlID0gcE1zZy0+dHlwZTsKKwltbWhNc2cuYm9keXB0ciA9IHBNc2c7CisJbW1oTXNnLmJvZHl2YWwgPSAwOworCisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbW1oTXNnLnR5cGUpKTsKKworCWxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7Cit9CisKKy8qKgorICogbGltX3NlbmRfc21lX2Rpc2Fzc29jX250ZigpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkgdG8gc2VuZAorICogZVdOSV9TTUVfRElTQVNTT0NfUlNQL0lORCBtZXNzYWdlIHRvIGhvc3QKKyAqCisgKioqUEFSQU1TOgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBzZW5kaW5nIGVXTklfU01FX0RJU0FTU09DX0NORiwKKyAqIG9yIGVXTklfU01FX0RJU0FTU09DX0lORCB0byBob3N0IGRlcGVuZGluZyBvbgorICogZGlzYXNzb2NpYXRpb24gdHJpZ2dlci4KKyAqCisgKiBAcGFyYW0gcGVlck1hY0FkZHIgICAgICAgSW5kaWNhdGVzIHRoZSBwZWVyIE1BQyBhZGRyIHRvIHdoaWNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNzb2NpYXRlIHdhcyBpbml0aWF0ZWQKKyAqIEBwYXJhbSByZWFzb25Db2RlICAgICAgICBJbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3IgRGlzYXNzb2NpYXRpb24KKyAqIEBwYXJhbSBkaXNhc3NvY1RyaWdnZXIgICBJbmRpY2F0ZXMgdGhlIHRyaWdnZXIgZm9yIERpc2Fzc29jaWF0aW9uCisgKiBAcGFyYW0gYWlkICAgICAgICAgICAgICAgSW5kaWNhdGVzIHRoZSBTVEFJRC4gVGhpcyBwYXJhbWV0ZXIgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50IG9ubHkgb24gQVAuCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbV9zZW5kX3NtZV9kaXNhc3NvY19udGYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisJCQkgIHRTaXJSZXN1bHRDb2RlcyByZWFzb25Db2RlLAorCQkJICB1aW50MTZfdCBkaXNhc3NvY1RyaWdnZXIsCisJCQkgIHVpbnQxNl90IGFpZCwKKwkJCSAgdWludDhfdCBzbWVzZXNzaW9uSWQsCisJCQkgIHVpbnQxNl90IHNtZXRyYW5zYWN0aW9uSWQsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwl1aW50OF90ICpwQnVmOworCXRTaXJTbWVEaXNhc3NvY1JzcCAqcFNpclNtZURpc2Fzc29jUnNwOworCXRTaXJTbWVEaXNhc3NvY0luZCAqcFNpclNtZURpc2Fzc29jSW5kOworCXVpbnQzMl90ICpwTXNnOworCWJvb2wgZmFpbHVyZSA9IGZhbHNlOworCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiRGlzYXNzb2MgTnRmIHdpdGggdHJpZ2dlciA6ICVkIHJlYXNvbkNvZGU6ICVkIiksCisJCWRpc2Fzc29jVHJpZ2dlciwgcmVhc29uQ29kZSk7CisKKwlzd2l0Y2ggKGRpc2Fzc29jVHJpZ2dlcikgeworCWNhc2UgZUxJTV9QRUVSX0VOVElUWV9ESVNBU1NPQzoKKwkJaWYgKHJlYXNvbkNvZGUgIT0gZVNJUl9TTUVfU1RBX05PVF9BU1NPQ0lBVEVEKSB7CisJCQlmYWlsdXJlID0gdHJ1ZTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCWNhc2UgZUxJTV9IT1NUX0RJU0FTU09DOgorCQkvKioKKwkJICogRGlzYXNzb2NpYXRpb24gcmVzcG9uc2UgZHVlIHRvCisJCSAqIGhvc3QgdHJpZ2dlcmVkIGRpc2Fzc29jaWF0aW9uCisJCSAqLworCisJCXBTaXJTbWVEaXNhc3NvY1JzcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU21lRGlzYXNzb2NSc3ApKTsKKwkJaWYgKE5VTEwgPT0gcFNpclNtZURpc2Fzc29jUnNwKSB7CisJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJCWZhaWx1cmUgPSB0cnVlOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJzZW5kIGVXTklfU01FX0RJU0FTU09DX1JTUCB3aXRoICIKKwkJCQkgICAgICAgInJldENvZGU6ICVkIGZvciAiIE1BQ19BRERSRVNTX1NUUiksCisJCQlyZWFzb25Db2RlLCBNQUNfQUREUl9BUlJBWShwZWVyTWFjQWRkcikpOworCQlwU2lyU21lRGlzYXNzb2NSc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfRElTQVNTT0NfUlNQOworCQlwU2lyU21lRGlzYXNzb2NSc3AtPmxlbmd0aCA9IHNpemVvZih0U2lyU21lRGlzYXNzb2NSc3ApOworCQkvKiBzZXNzaW9uSWQgKi8KKwkJcEJ1ZiA9ICh1aW50OF90ICopICZwU2lyU21lRGlzYXNzb2NSc3AtPnNlc3Npb25JZDsKKwkJKnBCdWYgPSBzbWVzZXNzaW9uSWQ7CisJCXBCdWYrKzsKKworCQkvKiB0cmFuc2FjdGlvbklkICovCisJCWxpbV9jb3B5X3UxNihwQnVmLCBzbWV0cmFuc2FjdGlvbklkKTsKKwkJcEJ1ZiArPSBzaXplb2YodWludDE2X3QpOworCisJCS8qIHN0YXR1c0NvZGUgKi8KKwkJbGltX2NvcHlfdTMyKHBCdWYsIHJlYXNvbkNvZGUpOworCQlwQnVmICs9IHNpemVvZih0U2lyUmVzdWx0Q29kZXMpOworCisJCS8qIHBlZXJNYWNBZGRyICovCisJCWNkZl9tZW1fY29weShwQnVmLCBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCXBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKworCQkvKiBDbGVhciBTdGF0aW9uIFN0YXRzICovCisJCS8qIGZvciBzdGEsIGl0IGlzIGFsd2F5cyAxLCBJQlNTIGlzIGhhbmRsZWQgYXQgaGFsSW5pdFN0YSAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfRElTQVNTT0NfUlNQX0VWRU5ULAorCQkJCSAgICAgIHBzZXNzaW9uRW50cnksICh1aW50MTZfdCkgcmVhc29uQ29kZSwgMCk7CisjZW5kaWYKKwkJcE1zZyA9ICh1aW50MzJfdCAqKSBwU2lyU21lRGlzYXNzb2NSc3A7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyoqCisJCSAqIERpc2Fzc29jaWF0aW9uIGluZGljYXRpb24gZHVlIHRvIERpc2Fzc29jaWF0aW9uCisJCSAqIGZyYW1lIHJlY2VwdGlvbiBmcm9tIHBlZXIgZW50aXR5IG9yIGR1ZSB0bworCQkgKiBsb3NzIG9mIGxpbmsgd2l0aCBwZWVyIGVudGl0eS4KKwkJICovCisJCXBTaXJTbWVEaXNhc3NvY0luZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU21lRGlzYXNzb2NJbmQpKTsKKwkJaWYgKE5VTEwgPT0gcFNpclNtZURpc2Fzc29jSW5kKSB7CisJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJCWZhaWx1cmUgPSB0cnVlOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJzZW5kIGVXTklfU01FX0RJU0FTU09DX0lORCB3aXRoICIKKwkJCQkgICAgICAgInJldENvZGU6ICVkIGZvciAiIE1BQ19BRERSRVNTX1NUUiksCisJCQlyZWFzb25Db2RlLCBNQUNfQUREUl9BUlJBWShwZWVyTWFjQWRkcikpOworCQlwU2lyU21lRGlzYXNzb2NJbmQtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfRElTQVNTT0NfSU5EOworCQlwU2lyU21lRGlzYXNzb2NJbmQtPmxlbmd0aCA9IHNpemVvZih0U2lyU21lRGlzYXNzb2NJbmQpOworCisJCS8qIFVwZGF0ZSBTTUUgc2Vzc2lvbiBJZCBhbmQgVHJhbnNhY3Rpb24gSWQgKi8KKwkJcFNpclNtZURpc2Fzc29jSW5kLT5zZXNzaW9uSWQgPSBzbWVzZXNzaW9uSWQ7CisJCXBTaXJTbWVEaXNhc3NvY0luZC0+dHJhbnNhY3Rpb25JZCA9IHNtZXRyYW5zYWN0aW9uSWQ7CisJCXBTaXJTbWVEaXNhc3NvY0luZC0+cmVhc29uQ29kZSA9IHJlYXNvbkNvZGU7CisJCXBCdWYgPSAodWludDhfdCAqKSAmcFNpclNtZURpc2Fzc29jSW5kLT5zdGF0dXNDb2RlOworCisJCWxpbV9jb3B5X3UzMihwQnVmLCByZWFzb25Db2RlKTsKKwkJcEJ1ZiArPSBzaXplb2YodFNpclJlc3VsdENvZGVzKTsKKworCQljZGZfbWVtX2NvcHkocEJ1ZiwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKwkJY2RmX21lbV9jb3B5KHBCdWYsIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNICAgIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwkJbGltX2RpYWdfZXZlbnRfcmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19ESVNBU1NPQ19JTkRfRVZFTlQsCisJCQkJICAgICAgcHNlc3Npb25FbnRyeSwgKHVpbnQxNl90KSByZWFzb25Db2RlLCAwKTsKKyNlbmRpZgorCQlwTXNnID0gKHVpbnQzMl90ICopIHBTaXJTbWVEaXNhc3NvY0luZDsKKworCQlicmVhazsKKwl9CisKK2Vycm9yOgorCS8qIERlbGV0ZSB0aGUgUEUgc2Vzc2lvbiBDcmVhdGVkICovCisJaWYgKChwc2Vzc2lvbkVudHJ5ICE9IE5VTEwpICYmCisJICAgIChMSU1fSVNfU1RBX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkgICAgTElNX0lTX0JUX0FNUF9TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkpIHsKKwkJcGVfZGVsZXRlX3Nlc3Npb24ocE1hYywgcHNlc3Npb25FbnRyeSk7CisJfQorCisJaWYgKGZhbHNlID09IGZhaWx1cmUpCisJCWxpbV9zZW5kX3NtZV9kaXNhc3NvY19kZWF1dGhfbnRmKHBNYWMsIENERl9TVEFUVVNfU1VDQ0VTUywKKwkJCQkJCSAodWludDMyX3QgKikgcE1zZyk7Cit9IC8qKiogZW5kIGxpbV9zZW5kX3NtZV9kaXNhc3NvY19udGYoKSAqKiovCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIGxpbV9zZW5kX3NtZV9kaXNhc3NvY19pbmQoKSAtIHNlbmRzIFNNRV9ESVNBU1NPQ19JTkQKKworICAgQWZ0ZXIgcmVjZWl2aW5nIGRpc2Fzc29jaWF0aW9uIGZyYW1lIGZyb20gcGVlciBlbnRpdHksIHRoaXMKKyAgIGZ1bmN0aW9uIHNlbmRzIGEgZVdOSV9TTUVfRElTQVNTT0NfSU5EIHRvIFNNRSB3aXRoIGEgc3BlY2lmaWMKKyAgIHJlYXNvbiBjb2RlLgorCisgICBccGFyYW0gcE1hYyAtIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgICBccGFyYW0gcFN0YURzIC0gc3RhdGlvbiBkcGggaGFzaCBub2RlCisgICBccmV0dXJuIG5vbmUKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK2xpbV9zZW5kX3NtZV9kaXNhc3NvY19pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhRHMsCisJCQkgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpck1zZ1EgbW1oTXNnOworCXRTaXJTbWVEaXNhc3NvY0luZCAqcFNpclNtZURpc2Fzc29jSW5kOworCisJcFNpclNtZURpc2Fzc29jSW5kID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVEaXNhc3NvY0luZCkpOworCWlmIChOVUxMID09IHBTaXJTbWVEaXNhc3NvY0luZCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9ESVNBU1NPQ19JTkQiKSk7CisJCXJldHVybjsKKwl9CisKKwlwU2lyU21lRGlzYXNzb2NJbmQtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfRElTQVNTT0NfSU5EOworCXBTaXJTbWVEaXNhc3NvY0luZC0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJTbWVEaXNhc3NvY0luZCk7CisKKwlwU2lyU21lRGlzYXNzb2NJbmQtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKwlwU2lyU21lRGlzYXNzb2NJbmQtPnRyYW5zYWN0aW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkOworCXBTaXJTbWVEaXNhc3NvY0luZC0+c3RhdHVzQ29kZSA9IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5kaXNhc3NvY1JlYXNvbjsKKwlwU2lyU21lRGlzYXNzb2NJbmQtPnJlYXNvbkNvZGUgPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb247CisKKwljZGZfbWVtX2NvcHkocFNpclNtZURpc2Fzc29jSW5kLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwljZGZfbWVtX2NvcHkocFNpclNtZURpc2Fzc29jSW5kLT5wZWVyTWFjQWRkciwgcFN0YURzLT5zdGFBZGRyLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJcFNpclNtZURpc2Fzc29jSW5kLT5zdGFJZCA9IHBTdGFEcy0+c3RhSW5kZXg7CisKKwltbWhNc2cudHlwZSA9IGVXTklfU01FX0RJU0FTU09DX0lORDsKKwltbWhNc2cuYm9keXB0ciA9IHBTaXJTbWVEaXNhc3NvY0luZDsKKwltbWhNc2cuYm9keXZhbCA9IDA7CisKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbW1oTXNnLnR5cGUpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAgICAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19ESVNBU1NPQ19JTkRfRVZFTlQsIHBzZXNzaW9uRW50cnksCisJCQkgICAgICAwLCAodWludDE2X3QpIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5kaXNhc3NvY1JlYXNvbik7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKworfSAvKioqIGVuZCBsaW1fc2VuZF9zbWVfZGlzYXNzb2NfaW5kKCkgKioqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBsaW1fc2VuZF9zbWVfZGVhdXRoX2luZCgpIC0gc2VuZHMgU01FX0RFQVVUSF9JTkQKKworICAgQWZ0ZXIgcmVjZWl2aW5nIGRlYXV0aGVudGljYXRpb24gZnJhbWUgZnJvbSBwZWVyIGVudGl0eSwgdGhpcworICAgZnVuY3Rpb24gc2VuZHMgYSBlV05JX1NNRV9ERUFVVEhfSU5EIHRvIFNNRSB3aXRoIGEgc3BlY2lmaWMKKyAgIHJlYXNvbiBjb2RlLgorCisgICBccGFyYW0gcE1hYyAtIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgICBccGFyYW0gcFN0YURzIC0gc3RhdGlvbiBkcGggaGFzaCBub2RlCisgICBccmV0dXJuIG5vbmUKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK2xpbV9zZW5kX3NtZV9kZWF1dGhfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YURzLAorCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyTXNnUSBtbWhNc2c7CisJdFNpclNtZURlYXV0aEluZCAqcFNpclNtZURlYXV0aEluZDsKKworCXBTaXJTbWVEZWF1dGhJbmQgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclNtZURlYXV0aEluZCkpOworCWlmIChOVUxMID09IHBTaXJTbWVEZWF1dGhJbmQpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIkFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfREVBVVRIX0lORCAiKSk7CisJCXJldHVybjsKKwl9CisKKwlwU2lyU21lRGVhdXRoSW5kLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0RFQVVUSF9JTkQ7CisJcFNpclNtZURlYXV0aEluZC0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJTbWVEZWF1dGhJbmQpOworCisJcFNpclNtZURlYXV0aEluZC0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCXBTaXJTbWVEZWF1dGhJbmQtPnRyYW5zYWN0aW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkOworCWlmIChlU0lSX0lORlJBX0FQX01PREUgPT0gcHNlc3Npb25FbnRyeS0+YnNzVHlwZSkgeworCQlwU2lyU21lRGVhdXRoSW5kLT5zdGF0dXNDb2RlID0KKwkJCSh0U2lyUmVzdWx0Q29kZXMpIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcjsKKwl9IGVsc2UgeworCQkvKiBOZWVkIHRvIGluZGljYXRldCBoZSByZWFzY29uIGNvZGUgb3ZlciB0aGUgYWlyICovCisJCXBTaXJTbWVEZWF1dGhJbmQtPnN0YXR1c0NvZGUgPQorCQkJKHRTaXJSZXN1bHRDb2RlcykgcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uOworCX0KKwkvKiBCU1NJRCAqLworCWNkZl9tZW1fY29weShwU2lyU21lRGVhdXRoSW5kLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJLyogcGVlck1hY0FkZHIgKi8KKwljZGZfbWVtX2NvcHkocFNpclNtZURlYXV0aEluZC0+cGVlck1hY0FkZHIsIHBTdGFEcy0+c3RhQWRkciwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlwU2lyU21lRGVhdXRoSW5kLT5yZWFzb25Db2RlID0gcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uOworCisJcFNpclNtZURlYXV0aEluZC0+c3RhSWQgPSBwU3RhRHMtPnN0YUluZGV4OworCisJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9ERUFVVEhfSU5EOworCW1taE1zZy5ib2R5cHRyID0gcFNpclNtZURlYXV0aEluZDsKKwltbWhNc2cuYm9keXZhbCA9IDA7CisKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbW1oTXNnLnR5cGUpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAgICAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19ERUFVVEhfSU5EX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LAorCQkJICAgICAgMCwgcFN0YURzLT5tbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCXJldHVybjsKK30gLyoqKiBlbmQgbGltX3NlbmRfc21lX2RlYXV0aF9pbmQoKSAqKiovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworLyoqCisgKiBsaW1fc2VuZF9zbWVfdGRsc19kZWxfc3RhX2luZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCB0aGUgVERMUyBTVEEgY29udGV4dCBkZWxldGlvbiB0byBTTUUuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgLSBQb2ludGVyIHRvIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBTdGFEcyAtIFBvaW50ZXIgdG8gaW50ZXJuYWwgU1RBIERhdGFzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcHNlc3Npb25FbnRyeSAtIFBvaW50ZXIgdG8gdGhlIHNlc3Npb24gZW50cnkKKyAqIEBwYXJhbSAgcmVhc29uQ29kZSAtIFJlYXNvbiBmb3IgVERMUyBzdGEgZGVsZXRpb24KKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1fc2VuZF9zbWVfdGRsc19kZWxfc3RhX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywKKwkJCSAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksIHVpbnQxNl90IHJlYXNvbkNvZGUpCit7CisJdFNpck1zZ1EgbW1oTXNnOworCXRTaXJUZGxzRGVsU3RhSW5kICpwU2lyVGRsc0RlbFN0YUluZDsKKworCXBTaXJUZGxzRGVsU3RhSW5kID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJUZGxzRGVsU3RhSW5kKSk7CisJaWYgKE5VTEwgPT0gcFNpclRkbHNEZWxTdGFJbmQpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwKKwkJCQkoIkFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfVERMU19ERUxfU1RBX0lORCAiKSk7CisJCXJldHVybjsKKwl9CisJLyogbWVzc2FnZVR5cGUgKi8KKwlwU2lyVGRsc0RlbFN0YUluZC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9URExTX0RFTF9TVEFfSU5EOworCXBTaXJUZGxzRGVsU3RhSW5kLT5sZW5ndGggPSBzaXplb2YodFNpclRkbHNEZWxTdGFJbmQpOworCisJLyogc2Vzc2lvbklkICovCisJcFNpclRkbHNEZWxTdGFJbmQtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCS8qIHBlZXJNYWNBZGRyICovCisJY2RmX21lbV9jb3B5KHBTaXJUZGxzRGVsU3RhSW5kLT5wZWVyTWFjLCBwU3RhRHMtPnN0YUFkZHIsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkvKiBzdGFJZCAqLworCWxpbV9jb3B5X3UxNigodWludDhfdCAqKSAoJnBTaXJUZGxzRGVsU3RhSW5kLT5zdGFJZCksCisJCSAgICAgKHVpbnQxNl90KSBwU3RhRHMtPnN0YUluZGV4KTsKKworCS8qIHJlYXNvbkNvZGUgKi8KKwlsaW1fY29weV91MTYoKHVpbnQ4X3QgKikgKCZwU2lyVGRsc0RlbFN0YUluZC0+cmVhc29uQ29kZSksIHJlYXNvbkNvZGUpOworCisJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9URExTX0RFTF9TVEFfSU5EOworCW1taE1zZy5ib2R5cHRyID0gcFNpclRkbHNEZWxTdGFJbmQ7CisJbW1oTXNnLmJvZHl2YWwgPSAwOworCisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKwlyZXR1cm47Cit9IC8qKiogZW5kIGxpbV9zZW5kX3NtZV90ZGxzX2RlbF9zdGFfaW5kKCkgKioqLworCisvKioKKyAqIGxpbV9zZW5kX3NtZV90ZGxzX2RlbGV0ZV9hbGxfcGVlcl9pbmQoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgdGhlIGVXTklfU01FX1RETFNfREVMX0FMTF9QRUVSX0lORAorICogbWVzc2FnZSB0byBTTUUuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgLSBQb2ludGVyIHRvIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBzZXNzaW9uRW50cnkgLSBQb2ludGVyIHRvIHRoZSBzZXNzaW9uIGVudHJ5CisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltX3NlbmRfc21lX3RkbHNfZGVsZXRlX2FsbF9wZWVyX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJNc2dRIG1taE1zZzsKKwl0U2lyVGRsc0RlbEFsbFBlZXJJbmQgKnBTaXJUZGxzRGVsQWxsUGVlckluZDsKKworCXBTaXJUZGxzRGVsQWxsUGVlckluZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyVGRsc0RlbEFsbFBlZXJJbmQpKTsKKwlpZiAoTlVMTCA9PSBwU2lyVGRsc0RlbEFsbFBlZXJJbmQpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwKKwkJCQkoIkFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfVERMU19ERUxfQUxMX1BFRVJfSU5EIikpOworCQlyZXR1cm47CisJfQorCS8qIG1lc3NhZ2VUeXBlICovCisJcFNpclRkbHNEZWxBbGxQZWVySW5kLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1RETFNfREVMX0FMTF9QRUVSX0lORDsKKwlwU2lyVGRsc0RlbEFsbFBlZXJJbmQtPmxlbmd0aCA9IHNpemVvZih0U2lyVGRsc0RlbEFsbFBlZXJJbmQpOworCisJLyogc2Vzc2lvbklkICovCisJcFNpclRkbHNEZWxBbGxQZWVySW5kLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKwltbWhNc2cudHlwZSA9IGVXTklfU01FX1RETFNfREVMX0FMTF9QRUVSX0lORDsKKwltbWhNc2cuYm9keXB0ciA9IHBTaXJUZGxzRGVsQWxsUGVlckluZDsKKwltbWhNc2cuYm9keXZhbCA9IDA7CisKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCXJldHVybjsKK30gLyoqKiBlbmQgbGltX3NlbmRfc21lX3RkbHNfZGVsZXRlX2FsbF9wZWVyX2luZCgpICoqKi8KKworLyoqCisgKiBsaW1fc2VuZF9zbWVfbWdtdF90eF9jb21wbGV0aW9uKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIHRoZSBlV05JX1NNRV9NR01UX0ZSTV9UWF9DT01QTEVUSU9OX0lORAorICogbWVzc2FnZSB0byBTTUUuCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgLSBQb2ludGVyIHRvIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBzZXNzaW9uRW50cnkgLSBQb2ludGVyIHRvIHRoZSBzZXNzaW9uIGVudHJ5CisgKiBAcGFyYW0gIHR4Q29tcGxldGVTdGF0dXMgLSBUWCBDb21wbGV0ZSBTdGF0dXMgb2YgTWdtdCBGcmFtZXMKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1fc2VuZF9zbWVfbWdtdF90eF9jb21wbGV0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwgdWludDMyX3QgdHhDb21wbGV0ZVN0YXR1cykKK3sKKwl0U2lyTXNnUSBtbWhNc2c7CisJdFNpck1nbXRUeENvbXBsZXRpb25JbmQgKnBTaXJNZ210VHhDb21wbGV0aW9uSW5kOworCisJcFNpck1nbXRUeENvbXBsZXRpb25JbmQgPQorCQljZGZfbWVtX21hbGxvYyhzaXplb2YodFNpck1nbXRUeENvbXBsZXRpb25JbmQpKTsKKwlpZiAoTlVMTCA9PSBwU2lyTWdtdFR4Q29tcGxldGlvbkluZCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgiQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9NR01UX0ZSTV9UWF9DT01QTEVUSU9OX0lORCIpKTsKKwkJcmV0dXJuOworCX0KKwkvKiBtZXNzYWdlVHlwZSAqLworCXBTaXJNZ210VHhDb21wbGV0aW9uSW5kLT5tZXNzYWdlVHlwZSA9CisJCWVXTklfU01FX01HTVRfRlJNX1RYX0NPTVBMRVRJT05fSU5EOworCXBTaXJNZ210VHhDb21wbGV0aW9uSW5kLT5sZW5ndGggPSBzaXplb2YodFNpck1nbXRUeENvbXBsZXRpb25JbmQpOworCisJLyogc2Vzc2lvbklkICovCisJcFNpck1nbXRUeENvbXBsZXRpb25JbmQtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCXBTaXJNZ210VHhDb21wbGV0aW9uSW5kLT50eENvbXBsZXRlU3RhdHVzID0gdHhDb21wbGV0ZVN0YXR1czsKKworCW1taE1zZy50eXBlID0gZVdOSV9TTUVfTUdNVF9GUk1fVFhfQ09NUExFVElPTl9JTkQ7CisJbW1oTXNnLmJvZHlwdHIgPSBwU2lyTWdtdFR4Q29tcGxldGlvbkluZDsKKwltbWhNc2cuYm9keXZhbCA9IDA7CisKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCXJldHVybjsKK30gLyoqKiBlbmQgbGltX3NlbmRfc21lX3RkbHNfZGVsZXRlX2FsbF9wZWVyX2luZCgpICoqKi8KKwordm9pZCBsaW1fc2VuZF9zbWVfdGRsc19ldmVudF9ub3RpZnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgbXNnVHlwZSwKKwkJCQkgICAgdm9pZCAqZXZlbnRzKQoreworCXRTaXJNc2dRIG1taE1zZzsKKworCXN3aXRjaCAobXNnVHlwZSkgeworCWNhc2UgU0lSX0hBTF9URExTX1NIT1VMRF9ESVNDT1ZFUjoKKwkJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9URExTX1NIT1VMRF9ESVNDT1ZFUjsKKwkJYnJlYWs7CisJY2FzZSBTSVJfSEFMX1RETFNfU0hPVUxEX1RFQVJET1dOOgorCQltbWhNc2cudHlwZSA9IGVXTklfU01FX1RETFNfU0hPVUxEX1RFQVJET1dOOworCQlicmVhazsKKwljYXNlIFNJUl9IQUxfVERMU19QRUVSX0RJU0NPTk5FQ1RFRDoKKwkJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9URExTX1BFRVJfRElTQ09OTkVDVEVEOworCQlicmVhazsKKwl9CisKKwltbWhNc2cuYm9keXB0ciA9IGV2ZW50czsKKwltbWhNc2cuYm9keXZhbCA9IDA7CisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KKworLyoqCisgKiBsaW1fc2VuZF9zbWVfZGVhdXRoX250ZigpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkgdG8gc2VuZAorICogZVdOSV9TTUVfRElTQVNTT0NfUlNQL0lORCBtZXNzYWdlIHRvIGhvc3QKKyAqCisgKioqUEFSQU1TOgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBzZW5kaW5nIGVXTklfU01FX0RFQVVUSF9DTkYgb3IKKyAqIGVXTklfU01FX0RFQVVUSF9JTkQgdG8gaG9zdCBkZXBlbmRpbmcgb24gZGVhdXRoZW50aWNhdGlvbiB0cmlnZ2VyLgorICoKKyAqIEBwYXJhbSBwZWVyTWFjQWRkciAgICAgICBJbmRpY2F0ZXMgdGhlIHBlZXIgTUFDIGFkZHIgdG8gd2hpY2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkZWF1dGhlbnRpY2F0aW9uIHdhcyBpbml0aWF0ZWQKKyAqIEBwYXJhbSByZWFzb25Db2RlICAgICAgICBJbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3IgRGVhdXRoZXRpY2F0aW9uCisgKiBAcGFyYW0gZGVhdXRoVHJpZ2dlciAgICAgSW5kaWNhdGVzIHRoZSB0cmlnZ2VyIGZvciBEZWF1dGhldGljYXRpb24KKyAqIEBwYXJhbSBhaWQgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIFNUQUlELiBUaGlzIHBhcmFtZXRlciBpcyBwcmVzZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBvbiBBUC4KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltX3NlbmRfc21lX2RlYXV0aF9udGYodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisJCQl0U2lyUmVzdWx0Q29kZXMgcmVhc29uQ29kZSwgdWludDE2X3QgZGVhdXRoVHJpZ2dlciwKKwkJCXVpbnQxNl90IGFpZCwgdWludDhfdCBzbWVzZXNzaW9uSWQsCisJCQl1aW50MTZfdCBzbWV0cmFuc2FjdGlvbklkKQoreworCXVpbnQ4X3QgKnBCdWY7CisJdFNpclNtZURlYXV0aFJzcCAqcFNpclNtZURlYXV0aFJzcDsKKwl0U2lyU21lRGVhdXRoSW5kICpwU2lyU21lRGVhdXRoSW5kOworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDMyX3QgKnBNc2c7CisKKwlwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsIHBlZXJNYWNBZGRyLCAmc2Vzc2lvbklkKTsKKwlzd2l0Y2ggKGRlYXV0aFRyaWdnZXIpIHsKKwljYXNlIGVMSU1fUEVFUl9FTlRJVFlfREVBVVRIOgorCQlyZXR1cm47CisKKwljYXNlIGVMSU1fSE9TVF9ERUFVVEg6CisJCS8qKgorCQkgKiBEZWF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHRvIGhvc3QgdHJpZ2dlcmVkCisJCSAqIGRlYXV0aGVudGljYXRpb24uCisJCSAqLworCQlwU2lyU21lRGVhdXRoUnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVEZWF1dGhSc3ApKTsKKwkJaWYgKE5VTEwgPT0gcFNpclNtZURlYXV0aFJzcCkgeworCQkJLyogTG9nIGVycm9yICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwKKwkJCQkJKCJjYWxsIHRvIEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfREVBVVRIX1JTUCIpKTsKKworCQkJcmV0dXJuOworCQl9CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoInNlbmQgZVdOSV9TTUVfREVBVVRIX1JTUCB3aXRoICIKKwkJCQkgICAgICAgInJldENvZGU6ICVkIGZvciIgTUFDX0FERFJFU1NfU1RSKSwKKwkJCXJlYXNvbkNvZGUsIE1BQ19BRERSX0FSUkFZKHBlZXJNYWNBZGRyKSk7CisJCXBTaXJTbWVEZWF1dGhSc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfREVBVVRIX1JTUDsKKwkJcFNpclNtZURlYXV0aFJzcC0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJTbWVEZWF1dGhSc3ApOworCQlwU2lyU21lRGVhdXRoUnNwLT5zdGF0dXNDb2RlID0gcmVhc29uQ29kZTsKKwkJcFNpclNtZURlYXV0aFJzcC0+c2Vzc2lvbklkID0gc21lc2Vzc2lvbklkOworCQlwU2lyU21lRGVhdXRoUnNwLT50cmFuc2FjdGlvbklkID0gc21ldHJhbnNhY3Rpb25JZDsKKworCQlwQnVmID0gKHVpbnQ4X3QgKikgcFNpclNtZURlYXV0aFJzcC0+cGVlck1hY0FkZHI7CisJCWNkZl9tZW1fY29weShwQnVmLCBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAgICAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfREVBVVRIX1JTUF9FVkVOVCwKKwkJCQkgICAgICBwc2Vzc2lvbkVudHJ5LCAwLCAodWludDE2X3QpIHJlYXNvbkNvZGUpOworI2VuZGlmCisJCXBNc2cgPSAodWludDMyX3QgKikgcFNpclNtZURlYXV0aFJzcDsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qKgorCQkgKiBEZWF1dGhlbnRpY2F0aW9uIGluZGljYXRpb24gZHVlIHRvIERlYXV0aGVudGljYXRpb24KKwkJICogZnJhbWUgcmVjZXB0aW9uIGZyb20gcGVlciBlbnRpdHkgb3IgZHVlIHRvCisJCSAqIGxvc3Mgb2YgbGluayB3aXRoIHBlZXIgZW50aXR5LgorCQkgKi8KKwkJcFNpclNtZURlYXV0aEluZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU21lRGVhdXRoSW5kKSk7CisJCWlmIChOVUxMID09IHBTaXJTbWVEZWF1dGhJbmQpIHsKKwkJCS8qIExvZyBlcnJvciAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiY2FsbCB0byBBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX0RFQVVUSF9JbmQiKSk7CisKKwkJCXJldHVybjsKKwkJfQorCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJzZW5kIGVXTklfU01FX0RFQVVUSF9JTkQgd2l0aCAiCisJCQkJICAgICAgICJyZXRDb2RlOiAlZCBmb3IgIiBNQUNfQUREUkVTU19TVFIpLAorCQkJcmVhc29uQ29kZSwgTUFDX0FERFJfQVJSQVkocGVlck1hY0FkZHIpKTsKKwkJcFNpclNtZURlYXV0aEluZC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9ERUFVVEhfSU5EOworCQlwU2lyU21lRGVhdXRoSW5kLT5sZW5ndGggPSBzaXplb2YodFNpclNtZURlYXV0aEluZCk7CisJCXBTaXJTbWVEZWF1dGhJbmQtPnJlYXNvbkNvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT047CisKKwkJLyogc2Vzc2lvbklkICovCisJCXBCdWYgPSAodWludDhfdCAqKSAmcFNpclNtZURlYXV0aEluZC0+c2Vzc2lvbklkOworCQkqcEJ1ZisrID0gc21lc2Vzc2lvbklkOworCisJCS8qIHRyYW5zYWN0aW9uIElEICovCisJCWxpbV9jb3B5X3UxNihwQnVmLCBzbWV0cmFuc2FjdGlvbklkKTsKKwkJcEJ1ZiArPSBzaXplb2YodWludDE2X3QpOworCisJCS8qIHN0YXR1cyBjb2RlICovCisJCWxpbV9jb3B5X3UzMihwQnVmLCByZWFzb25Db2RlKTsKKwkJcEJ1ZiArPSBzaXplb2YodFNpclJlc3VsdENvZGVzKTsKKworCQkvKiBic3NJZCAqLworCQljZGZfbWVtX2NvcHkocEJ1ZiwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKwkJLyogcGVlck1hY0FkZHIgKi8KKwkJY2RmX21lbV9jb3B5KHBTaXJTbWVEZWF1dGhJbmQtPnBlZXJNYWNBZGRyLCBwZWVyTWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAgICAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfREVBVVRIX0lORF9FVkVOVCwKKwkJCQkgICAgICBwc2Vzc2lvbkVudHJ5LCAwLCAodWludDE2X3QpIHJlYXNvbkNvZGUpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwkJcE1zZyA9ICh1aW50MzJfdCAqKSBwU2lyU21lRGVhdXRoSW5kOworCisJCWJyZWFrOworCX0KKworCS8qRGVsZXRlIHRoZSBQRSBzZXNzaW9uICBjcmVhdGVkICovCisJaWYgKHBzZXNzaW9uRW50cnkgIT0gTlVMTCkgeworCQlwZV9kZWxldGVfc2Vzc2lvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwl9CisKKwlsaW1fc2VuZF9zbWVfZGlzYXNzb2NfZGVhdXRoX250ZihwTWFjLCBDREZfU1RBVFVTX1NVQ0NFU1MsCisJCQkJCSAodWludDMyX3QgKikgcE1zZyk7CisKK30gLyoqKiBlbmQgbGltX3NlbmRfc21lX2RlYXV0aF9udGYoKSAqKiovCisKKy8qKgorICogbGltX3NlbmRfc21lX3dtX3N0YXR1c19jaGFuZ2VfbnRmKCkgLSBTZW5kIE5vdGlmaWNhdGlvbgorICogQG1hY19jdHg6ICAgICAgICAgICAgIEdsb2JhbCBNQUMgQ29udGV4dAorICogQHN0YXR1c19jaGFuZ2VfY29kZTogIEluZGljYXRlcyB0aGUgY2hhbmdlIGluIHRoZSB3aXJlbGVzcyBtZWRpdW0uCisgKiBAc3RhdHVzX2NoYW5nZV9pbmZvOiAgSW5kaWNhdGVzIHRoZSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgaW4gdGhlIHdpcmVsZXNzIG1lZGl1bS4KKyAqIEBpbmZvX2xlbjogICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiBzdGF0dXMgY2hhbmdlIGluZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgc2VudC4KKyAqIEBzZXNzaW9uX2lkICAgICAgICAgICBTZXNzaW9uSUQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lTWVzc2FnZXMoKSB0byBzZW5kCisgKiBlV05JX1NNRV9XTV9TVEFUVVNfQ0hBTkdFX05URiBtZXNzYWdlIHRvIGhvc3QuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQKK2xpbV9zZW5kX3NtZV93bV9zdGF0dXNfY2hhbmdlX250Zih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXRTaXJTbWVTdGF0dXNDaGFuZ2VDb2RlIHN0YXR1c19jaGFuZ2VfY29kZSwKKwl1aW50MzJfdCAqc3RhdHVzX2NoYW5nZV9pbmZvLCB1aW50MTZfdCBpbmZvX2xlbiwgdWludDhfdCBzZXNzaW9uX2lkKQoreworCXRTaXJNc2dRIG1zZzsKKwl0U2lyU21lV21TdGF0dXNDaGFuZ2VOdGYgKndtX3N0YXR1c19jaGFuZ2VfbnRmOworCisJd21fc3RhdHVzX2NoYW5nZV9udGYgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmKSk7CisJaWYgKE5VTEwgPT0gd21fc3RhdHVzX2NoYW5nZV9udGYpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIk1lbSBBbGxvYyBmYWlsZWQgLSBlV05JX1NNRV9XTV9TVEFUVVNfQ0hBTkdFX05URiIpKTsKKwkJcmV0dXJuOworCX0KKworCW1zZy50eXBlID0gZVdOSV9TTUVfV01fU1RBVFVTX0NIQU5HRV9OVEY7CisJbXNnLmJvZHl2YWwgPSAwOworCW1zZy5ib2R5cHRyID0gd21fc3RhdHVzX2NoYW5nZV9udGY7CisKKwlzd2l0Y2ggKHN0YXR1c19jaGFuZ2VfY29kZSkgeworCWNhc2UgZVNJUl9TTUVfUkFEQVJfREVURUNURUQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXdtX3N0YXR1c19jaGFuZ2VfbnRmLT5tZXNzYWdlVHlwZSA9CisJCQllV05JX1NNRV9XTV9TVEFUVVNfQ0hBTkdFX05URjsKKwkJd21fc3RhdHVzX2NoYW5nZV9udGYtPnN0YXR1c0NoYW5nZUNvZGUgPSBzdGF0dXNfY2hhbmdlX2NvZGU7CisJCXdtX3N0YXR1c19jaGFuZ2VfbnRmLT5sZW5ndGggPSBzaXplb2YodFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmKTsKKwkJd21fc3RhdHVzX2NoYW5nZV9udGYtPnNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisJCWlmIChzaXplb2Yod21fc3RhdHVzX2NoYW5nZV9udGYtPnN0YXR1c0NoYW5nZUluZm8pID49CisJCQlpbmZvX2xlbikgeworCQkJY2RmX21lbV9jb3B5KAorCQkJICAgICh1aW50OF90ICopICZ3bV9zdGF0dXNfY2hhbmdlX250Zi0+c3RhdHVzQ2hhbmdlSW5mbywKKwkJCSAgICAodWludDhfdCAqKSBzdGF0dXNfY2hhbmdlX2luZm8sIGluZm9fbGVuKTsKKwkJfQorCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiKiotLS0qKiBTdGF0dXNDaGc6IGNvZGUgMHgleCwgbGVuZ3RoICVkICoqLS0tKioiKSwKKwkJCXN0YXR1c19jaGFuZ2VfY29kZSwgaW5mb19sZW4pOworCQlicmVhazsKKwl9CisKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChtYWNfY3R4LCBzZXNzaW9uX2lkLCBtc2cudHlwZSkpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKG1hY19jdHgsICZtc2csIGVQUk9UKSkgeworCQljZGZfbWVtX2ZyZWUod21fc3RhdHVzX2NoYW5nZV9udGYpOworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgibGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpIGZhaWxlZCIpKTsKKwl9CisKK30gLyoqKiBlbmQgbGltX3NlbmRfc21lX3dtX3N0YXR1c19jaGFuZ2VfbnRmKCkgKioqLworCisvKioKKyAqIGxpbV9zZW5kX3NtZV9zZXRfY29udGV4dF9yc3AoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVNZXNzYWdlcygpIHRvIHNlbmQKKyAqIGVXTklfU01FX1NFVENPTlRFWFRfUlNQIG1lc3NhZ2UgdG8gaG9zdAorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcGVlck1hY0FkZHIgIEluZGljYXRlcyB0aGUgcGVlciBNQUMgYWRkciB0byB3aGljaAorICogICAgICAgICAgICAgICAgICAgICBzZXRDb250ZXh0IHdhcyBwZXJmb3JtZWQKKyAqIEBwYXJhbSBhaWQgICAgICAgICAgSW5kaWNhdGVzIHRoZSBhaWQgY29ycmVzcG9uZGluZyB0byB0aGUgcGVlciBNQUMKKyAqICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcworICogQHBhcmFtIHJlc3VsdENvZGUgICBJbmRpY2F0ZXMgdGhlIHJlc3VsdCBvZiBwcmV2aW91c2x5IGlzc3VlZAorICogICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9TRVRDT05URVhUX1JTUCBtZXNzYWdlCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbV9zZW5kX3NtZV9zZXRfY29udGV4dF9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsIHVpbnQxNl90IGFpZCwKKwkJCSAgICAgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUsCisJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksIHVpbnQ4X3Qgc21lc2Vzc2lvbklkLAorCQkJICAgICB1aW50MTZfdCBzbWV0cmFuc2FjdGlvbklkKQoreworCisJdWludDhfdCAqcEJ1ZjsKKwl0U2lyTXNnUSBtbWhNc2c7CisJdFNpclNtZVNldENvbnRleHRSc3AgKnBTaXJTbWVTZXRDb250ZXh0UnNwOworCisJcFNpclNtZVNldENvbnRleHRSc3AgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclNtZVNldENvbnRleHRSc3ApKTsKKwlpZiAoTlVMTCA9PSBwU2lyU21lU2V0Q29udGV4dFJzcCkgeworCQkvKiBMb2cgZXJyb3IgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwKKwkJCQkoImNhbGwgdG8gQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBTbWVTZXRDb250ZXh0UnNwIikpOworCisJCXJldHVybjsKKwl9CisKKwlwU2lyU21lU2V0Q29udGV4dFJzcC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9TRVRDT05URVhUX1JTUDsKKwlwU2lyU21lU2V0Q29udGV4dFJzcC0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJTbWVTZXRDb250ZXh0UnNwKTsKKwlwU2lyU21lU2V0Q29udGV4dFJzcC0+c3RhdHVzQ29kZSA9IHJlc3VsdENvZGU7CisKKwlwQnVmID0gcFNpclNtZVNldENvbnRleHRSc3AtPnBlZXJNYWNBZGRyOworCisJY2RmX21lbV9jb3B5KHBCdWYsICh1aW50OF90ICopIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKwkvKiBVcGRhdGUgU01FIHNlc3Npb24gYW5kIHRyYW5zYWN0aW9uIElkICovCisJcFNpclNtZVNldENvbnRleHRSc3AtPnNlc3Npb25JZCA9IHNtZXNlc3Npb25JZDsKKwlwU2lyU21lU2V0Q29udGV4dFJzcC0+dHJhbnNhY3Rpb25JZCA9IHNtZXRyYW5zYWN0aW9uSWQ7CisKKwltbWhNc2cudHlwZSA9IGVXTklfU01FX1NFVENPTlRFWFRfUlNQOworCW1taE1zZy5ib2R5cHRyID0gcFNpclNtZVNldENvbnRleHRSc3A7CisJbW1oTXNnLmJvZHl2YWwgPSAwOworCWlmIChOVUxMID09IHBzZXNzaW9uRW50cnkpIHsKKwkJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbW1oTXNnLnR5cGUpKTsKKwl9IGVsc2UgeworCQlNVFJBQ0UobWFjX3RyYWNlX21zZ190eAorCQkJICAgICAgIChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbW1oTXNnLnR5cGUpKTsKKwl9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAgICAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJbGltX2RpYWdfZXZlbnRfcmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19TRVRDT05URVhUX1JTUF9FVkVOVCwKKwkJCSAgICAgIHBzZXNzaW9uRW50cnksICh1aW50MTZfdCkgcmVzdWx0Q29kZSwgMCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKK30gLyoqKiBlbmQgbGltX3NlbmRfc21lX3NldF9jb250ZXh0X3JzcCgpICoqKi8KKworLyoqCisgKiBsaW1fc2VuZF9zbWVfbmVpZ2hib3JfYnNzX2luZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX2xvb2t1cF9uYWRkX2hhc2hfZW50cnkoKSB0byBzZW5kCisgKiBlV05JX1NNRV9ORUlHSEJPUl9CU1NfSU5EIG1lc3NhZ2UgdG8gaG9zdAorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNlbmRpbmcgZVdOSV9TTUVfTkVJR0hCT1JfQlNTX0lORCB0bworICogaG9zdCB1cG9uIGRldGVjdGluZyBuZXcgQlNTIGR1cmluZyBiYWNrZ3JvdW5kIHNjYW5uaW5nIGlmIENGRworICogb3B0aW9uIGlzIGVuYWJsZWQgZm9yIHNlbmRpbmcgc3VjaCBpbmRpY2F0aW9uCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltX3NlbmRfc21lX25laWdoYm9yX2Jzc19pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpbVNjYW5SZXN1bHROb2RlICpwQnNzRGVzY3IpCit7CisJdFNpck1zZ1EgbXNnUTsKKwl1aW50MzJfdCB2YWw7CisJdFNpclNtZU5laWdoYm9yQnNzSW5kICpwTmV3QnNzSW5kOworCisJaWYgKChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlICE9IGVMSU1fU01FX0xJTktfRVNUX1dUX1NDQU5fU1RBVEUpIHx8CisJICAgICgocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9MSU5LX0VTVF9XVF9TQ0FOX1NUQVRFKSAmJgorCSAgICAgcE1hYy0+bGltLmdMaW1Sc3BSZXFkKSkgeworCQkvKiBMSU0gaXMgbm90IGluIGJhY2tncm91bmQgc2NhbiBzdGF0ZSBPUiAqLworCQkvKiBjdXJyZW50IHNjYW4gaXMgaW5pdGlhdGVkIGJ5IEhERC4gKi8KKwkJLyogTm8gbmVlZCB0byBzZW5kIG5ldyBCU1MgaW5kaWNhdGlvbiB0byBIREQgKi8KKwkJcmV0dXJuOworCX0KKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfTkVXX0JTU19GT1VORF9JTkQsICZ2YWwpICE9CisJICAgIGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiY291bGQgbm90IGdldCBORUlHSEJPUl9CU1NfSU5EIGZyb20gQ0ZHIikpOworCisJCXJldHVybjsKKwl9CisKKwlpZiAodmFsID09IDApCisJCXJldHVybjsKKworCS8qKgorCSAqIE5lZWQgdG8gaW5kaWNhdGUgbmV3IEJTU3MgZm91bmQgZHVyaW5nCisJICogYmFja2dyb3VuZCBzY2FubmluZyB0byBob3N0LgorCSAqIEFsbG9jYXRlIGJ1ZmZlciBmb3Igc2VuZGluZyBpbmRpY2F0aW9uLgorCSAqIExlbmd0aCBvZiBidWZmZXIgaXMgbGVuZ3RoIG9mIEJTUyBkZXNjcmlwdGlvbgorCSAqIGFuZCBsZW5ndGggb2YgaGVhZGVyIGl0c2VsZgorCSAqLworCXZhbCA9IHBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoICsgc2l6ZW9mKHVpbnQxNl90KSArCisJCXNpemVvZih1aW50MzJfdCkgKyBzaXplb2YodWludDhfdCk7CisJcE5ld0Jzc0luZCA9IGNkZl9tZW1fbWFsbG9jKHZhbCk7CisJaWYgKE5VTEwgPT0gcE5ld0Jzc0luZCkgeworCQkvKiBMb2cgZXJyb3IgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwKKwkJCQkoImNhbGwgdG8gQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9ORUlHSEJPUl9CU1NfSU5EIikpOworCisJCXJldHVybjsKKwl9CisKKwlwTmV3QnNzSW5kLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX05FSUdIQk9SX0JTU19JTkQ7CisJcE5ld0Jzc0luZC0+bGVuZ3RoID0gKHVpbnQxNl90KSB2YWw7CisJcE5ld0Jzc0luZC0+c2Vzc2lvbklkID0gMDsKKworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwTmV3QnNzSW5kLT5ic3NEZXNjcmlwdGlvbiwKKwkJICAgICAodWludDhfdCAqKSAmcEJzc0Rlc2NyLT5ic3NEZXNjcmlwdGlvbiwKKwkJICAgICBwQnNzRGVzY3ItPmJzc0Rlc2NyaXB0aW9uLmxlbmd0aCArIHNpemVvZih1aW50MTZfdCkpOworCisJbXNnUS50eXBlID0gZVdOSV9TTUVfTkVJR0hCT1JfQlNTX0lORDsKKwltc2dRLmJvZHlwdHIgPSBwTmV3QnNzSW5kOworCW1zZ1EuYm9keXZhbCA9IDA7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbXNnUS50eXBlKSk7CisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtc2dRLCBlUFJPVCk7Cit9IC8qKiogZW5kIGxpbV9zZW5kX3NtZV9uZWlnaGJvcl9ic3NfaW5kKCkgKioqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBsaW1fc2VuZF9zbWVfYWRkdHNfcnNwKCkgLSBzZW5kcyBTTUUgQUREVFMgUlNQCisgXCAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBlV05JX1NNRV9BRERUU19SU1AgdG8gU01FLgorIFwgICAgICBTTUUgb25seSBsb29rcyBhdCByYyBhbmQgdHNwZWMgZmllbGQuCisgICBccGFyYW0gcE1hYyAtIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgICBccGFyYW0gcnNwUmVxZCAtIGlzIFNtZUFkZFRzUnNwIHJlcXVpcmVkCisgICBccGFyYW0gc3RhdHVzIC0gc3RhdHVzIGNvZGUgb2YgU01FX0FERF9UU19SU1AKKyAgIFxyZXR1cm4gdHNwZWMKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK2xpbV9zZW5kX3NtZV9hZGR0c19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCByc3BSZXFkLCB1aW50MzJfdCBzdGF0dXMsCisJCSAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LCB0U2lyTWFjVHNwZWNJRSB0c3BlYywKKwkJICAgICAgIHVpbnQ4X3Qgc21lc2Vzc2lvbklkLCB1aW50MTZfdCBzbWV0cmFuc2FjdGlvbklkKQoreworCXRwU2lyQWRkdHNSc3AgcnNwOworCXRTaXJNc2dRIG1taE1zZzsKKworCWlmICghcnNwUmVxZCkKKwkJcmV0dXJuOworCisJcnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJBZGR0c1JzcCkpOworCWlmIChOVUxMID09IHJzcCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIEFERFRTX1JTUCIpKTsKKwkJcmV0dXJuOworCX0KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHJzcCwgc2l6ZW9mKCpyc3ApLCAwKTsKKwlyc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfQUREVFNfUlNQOworCXJzcC0+cmMgPSBzdGF0dXM7CisJcnNwLT5yc3Auc3RhdHVzID0gKGVudW0gZVNpck1hY1N0YXR1c0NvZGVzKXN0YXR1czsKKwlyc3AtPnJzcC50c3BlYyA9IHRzcGVjOworCS8qIFVwZGF0ZSBTTUUgc2Vzc2lvbiBJZCBhbmQgdHJhbnNjYXRpb24gSWQgKi8KKwlyc3AtPnNlc3Npb25JZCA9IHNtZXNlc3Npb25JZDsKKwlyc3AtPnRyYW5zYWN0aW9uSWQgPSBzbWV0cmFuc2FjdGlvbklkOworCisJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9BRERUU19SU1A7CisJbW1oTXNnLmJvZHlwdHIgPSByc3A7CisJbW1oTXNnLmJvZHl2YWwgPSAwOworCWlmIChOVUxMID09IHBzZXNzaW9uRW50cnkpIHsKKwkJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbW1oTXNnLnR5cGUpKTsKKwl9IGVsc2UgeworCQlNVFJBQ0UobWFjX3RyYWNlX21zZ190eAorCQkJICAgICAgIChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbW1oTXNnLnR5cGUpKTsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfQUREVFNfUlNQX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAwLAorCQkJICAgICAgMCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQKK2xpbV9zZW5kX3NtZV9kZWx0c19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJEZWx0c1JlcSBkZWx0cywgdWludDMyX3Qgc3RhdHVzLAorCQkgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwgdWludDhfdCBzbWVzZXNzaW9uSWQsCisJCSAgICAgICB1aW50MTZfdCBzbWV0cmFuc2FjdGlvbklkKQoreworCXRwU2lyRGVsdHNSc3AgcnNwOworCXRTaXJNc2dRIG1taE1zZzsKKworCWxpbV9sb2cocE1hYywgTE9HVywgIlNlbmRTbWVEZWx0c1JzcCAoYWlkICVkLCB0c2lkICVkLCB1cCAlZCkgc3RhdHVzICVkIiwKKwkJZGVsdHMtPmFpZCwKKwkJZGVsdHMtPnJlcS50c2luZm8udHJhZmZpYy50c2lkLAorCQlkZWx0cy0+cmVxLnRzaW5mby50cmFmZmljLnVzZXJQcmlvLCBzdGF0dXMpOworCWlmICghZGVsdHMtPnJzcFJlcWQpCisJCXJldHVybjsKKworCXJzcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyRGVsdHNSc3ApKTsKKwlpZiAoTlVMTCA9PSByc3ApIHsKKwkJLyogTG9nIGVycm9yICovCisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIkFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgREVMVFNfUlNQIikpOworCQlyZXR1cm47CisJfQorCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHJzcCwgc2l6ZW9mKCpyc3ApLCAwKTsKKworCWlmIChwc2Vzc2lvbkVudHJ5ICE9IE5VTEwpIHsKKworCQlyc3AtPmFpZCA9IGRlbHRzLT5haWQ7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcnNwLT5tYWNBZGRyWzBdLAorCQkJICAgICAodWludDhfdCAqKSAmZGVsdHMtPm1hY0FkZHJbMF0sIDYpOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnJzcC0+cnNwLCAodWludDhfdCAqKSAmZGVsdHMtPnJlcSwKKwkJCSAgICAgc2l6ZW9mKHRTaXJEZWx0c1JlcUluZm8pKTsKKwl9CisKKwlyc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfREVMVFNfUlNQOworCXJzcC0+cmMgPSBzdGF0dXM7CisKKwkvKiBVcGRhdGUgU01FIHNlc3Npb24gSWQgYW5kIHRyYW5zY2F0aW9uIElkICovCisJcnNwLT5zZXNzaW9uSWQgPSBzbWVzZXNzaW9uSWQ7CisJcnNwLT50cmFuc2FjdGlvbklkID0gc21ldHJhbnNhY3Rpb25JZDsKKworCW1taE1zZy50eXBlID0gZVdOSV9TTUVfREVMVFNfUlNQOworCW1taE1zZy5ib2R5cHRyID0gcnNwOworCW1taE1zZy5ib2R5dmFsID0gMDsKKwlpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KSB7CisJCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIE5PX1NFU1NJT04sIG1taE1zZy50eXBlKSk7CisJfSBlbHNlIHsKKwkJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgKKwkJCSAgICAgICAocE1hYywgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIG1taE1zZy50eXBlKSk7CisJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNICAgIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwlsaW1fZGlhZ19ldmVudF9yZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0RFTFRTX1JTUF9FVkVOVCwgcHNlc3Npb25FbnRyeSwKKwkJCSAgICAgICh1aW50MTZfdCkgc3RhdHVzLCAwKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworfQorCit2b2lkCitsaW1fc2VuZF9zbWVfZGVsdHNfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyRGVsdHNSZXFJbmZvIGRlbHRzLCB1aW50MTZfdCBhaWQsCisJCSAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRwU2lyRGVsdHNSc3AgcnNwOworCXRTaXJNc2dRIG1taE1zZzsKKworCWxpbV9sb2cocE1hYywgTE9HVywgIlNlbmRTbWVEZWx0c0luZCAoYWlkICVkLCB0c2lkICVkLCB1cCAlZCkiLAorCQlhaWQsIGRlbHRzLT50c2luZm8udHJhZmZpYy50c2lkLCBkZWx0cy0+dHNpbmZvLnRyYWZmaWMudXNlclByaW8pOworCisJcnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJEZWx0c1JzcCkpOworCWlmIChOVUxMID09IHJzcCkgeworCQkvKiBMb2cgZXJyb3IgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBERUxUU19JTkQiKSk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcnNwLCBzaXplb2YoKnJzcCksIDApOworCisJcnNwLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0RFTFRTX0lORDsKKwlyc3AtPnJjID0gZVNJUl9TVUNDRVNTOworCXJzcC0+YWlkID0gYWlkOworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcnNwLT5yc3AsICh1aW50OF90ICopIGRlbHRzLCBzaXplb2YoKmRlbHRzKSk7CisKKwkvKiBVcGRhdGUgU01FICBzZXNzaW9uIElkIGFuZCBTTUUgdHJhbnNhY3Rpb24gSWQgKi8KKworCXJzcC0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCXJzcC0+dHJhbnNhY3Rpb25JZCA9IHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQ7CisKKwltbWhNc2cudHlwZSA9IGVXTklfU01FX0RFTFRTX0lORDsKKwltbWhNc2cuYm9keXB0ciA9IHJzcDsKKwltbWhNc2cuYm9keXZhbCA9IDA7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIG1taE1zZy50eXBlKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfREVMVFNfSU5EX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAwLAorCQkJICAgICAgMCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKK30KKworLyoqCisgKiBsaW1fc2VuZF9zbWVfcGVfc3RhdGlzdGljc19yc3AoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgODAyLjExIHN0YXRpc3RpY3MgcmVzcG9uc2UgdG8gSERELgorICogVGhpcyBmdW5jdGlvbiBwb3N0cyB0aGUgcmVzdWx0IGJhY2sgdG8gSERELiBUaGlzIGlzIGEgcmVzcG9uc2UgdG8KKyAqIEhERCdzIHJlcXVlc3QgZm9yIHN0YXRpc3RpY3MuCisgKgorICoqKlBBUkFNUzoKKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcDgwMjExU3RhdHMgIFN0YXRpc3RpY3Mgc2VudCBpbiByZXNwb25zZQorICogQHBhcmFtIHJlc3VsdENvZGUgICBUT0RPOgorICoKKyAqCisgKiBAcmV0dXJuIG5vbmUKKyAqLworCit2b2lkCitsaW1fc2VuZF9zbWVfcGVfc3RhdGlzdGljc19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgbXNnVHlwZSwgdm9pZCAqc3RhdHMpCit7CisJdFNpck1zZ1EgbW1oTXNnOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXRBbmlHZXRQRVN0YXRzUnNwICpwUGVTdGF0cyA9ICh0QW5pR2V0UEVTdGF0c1JzcCAqKSBzdGF0czsKKwl0cFBFU2Vzc2lvbiBwUGVTZXNzaW9uRW50cnk7CisKKwkvKiBHZXQgdGhlIFNlc3Npb24gSWQgYmFzZWQgb24gU3RhIElkICovCisJcFBlU2Vzc2lvbkVudHJ5ID0KKwkJcGVfZmluZF9zZXNzaW9uX2J5X3N0YV9pZChwTWFjLCBwUGVTdGF0cy0+c3RhSWQsICZzZXNzaW9uSWQpOworCisJLyogRmlsbCB0aGUgU2Vzc2lvbiBJZCAqLworCWlmIChOVUxMICE9IHBQZVNlc3Npb25FbnRyeSkgeworCQkvKiBGaWxsIHRoZSBTZXNzaW9uIElkICovCisJCXBQZVN0YXRzLT5zZXNzaW9uSWQgPSBwUGVTZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKwl9CisKKwlwUGVTdGF0cy0+bXNnVHlwZSA9IGVXTklfU01FX0dFVF9TVEFUSVNUSUNTX1JTUDsKKworCS8qIG1zZ1R5cGUgc2hvdWxkIGJlIFdNQV9HRVRfU1RBVElTVElDU19SU1AgKi8KKwltbWhNc2cudHlwZSA9IGVXTklfU01FX0dFVF9TVEFUSVNUSUNTX1JTUDsKKworCW1taE1zZy5ib2R5cHRyID0gc3RhdHM7CisJbW1oTXNnLmJvZHl2YWwgPSAwOworCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIE5PX1NFU1NJT04sIG1taE1zZy50eXBlKSk7CisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKworCXJldHVybjsKKworfSAvKioqIGVuZCBsaW1fc2VuZF9zbWVfcGVfc3RhdGlzdGljc19yc3AoKSAqKiovCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisvKioKKyAqIGxpbV9zZW5kX3NtZV9wZV9lc2VfdHNtX3JzcCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCB0c20gc3RhdHMgcmVzcG9uc2UgdG8gSERELgorICogVGhpcyBmdW5jdGlvbiBwb3N0cyB0aGUgcmVzdWx0IGJhY2sgdG8gSERELiBUaGlzIGlzIGEgcmVzcG9uc2UgdG8KKyAqIEhERCdzIHJlcXVlc3QgdG8gZ2V0IHRzbSBzdGF0cy4KKyAqCisgKioqUEFSQU1TOgorICogQHBhcmFtIHBNYWMgICAtIFBvaW50ZXIgdG8gZ2xvYmFsIHBNYWMgc3RydWN0dXJlCisgKiBAcGFyYW0gcFN0YXRzIC0gUG9pbnRlciB0byBUU00gU3RhdHMKKyAqCisgKiBAcmV0dXJuIG5vbmUKKyAqLworCit2b2lkIGxpbV9zZW5kX3NtZV9wZV9lc2VfdHNtX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QW5pR2V0VHNtU3RhdHNSc3AgKnBTdGF0cykKK3sKKwl0U2lyTXNnUSBtbWhNc2c7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdEFuaUdldFRzbVN0YXRzUnNwICpwUGVTdGF0cyA9ICh0QW5pR2V0VHNtU3RhdHNSc3AgKikgcFN0YXRzOworCXRwUEVTZXNzaW9uIHBQZVNlc3Npb25FbnRyeSA9IE5VTEw7CisKKwkvKiBHZXQgdGhlIFNlc3Npb24gSWQgYmFzZWQgb24gU3RhIElkICovCisJcFBlU2Vzc2lvbkVudHJ5ID0KKwkJcGVfZmluZF9zZXNzaW9uX2J5X3N0YV9pZChwTWFjLCBwUGVTdGF0cy0+c3RhSWQsICZzZXNzaW9uSWQpOworCisJLyogRmlsbCB0aGUgU2Vzc2lvbiBJZCAqLworCWlmIChOVUxMICE9IHBQZVNlc3Npb25FbnRyeSkgeworCQkvKiBGaWxsIHRoZSBTZXNzaW9uIElkICovCisJCXBQZVN0YXRzLT5zZXNzaW9uSWQgPSBwUGVTZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKwl9IGVsc2UgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgiU2Vzc2lvbiBub3QgZm91bmQgZm9yIHRoZSBTdGEgaWQoJWQpIiksCisJCQkgICAgICAgcFBlU3RhdHMtPnN0YUlkKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KKworCXBQZVN0YXRzLT5tc2dUeXBlID0gZVdOSV9TTUVfR0VUX1RTTV9TVEFUU19SU1A7CisJcFBlU3RhdHMtPnRzbU1ldHJpY3MuUm9hbWluZ0NvdW50CisJCT0gcFBlU2Vzc2lvbkVudHJ5LT5lc2VDb250ZXh0LnRzbS50c21NZXRyaWNzLlJvYW1pbmdDb3VudDsKKwlwUGVTdGF0cy0+dHNtTWV0cmljcy5Sb2FtaW5nRGx5CisJCT0gcFBlU2Vzc2lvbkVudHJ5LT5lc2VDb250ZXh0LnRzbS50c21NZXRyaWNzLlJvYW1pbmdEbHk7CisKKwltbWhNc2cudHlwZSA9IGVXTklfU01FX0dFVF9UU01fU1RBVFNfUlNQOworCW1taE1zZy5ib2R5cHRyID0gcFN0YXRzOworCW1taE1zZy5ib2R5dmFsID0gMDsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBzZXNzaW9uSWQsIG1taE1zZy50eXBlKSk7CisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKworCXJldHVybjsKK30gLyoqKiBlbmQgbGltX3NlbmRfc21lX3BlX2VzZV90c21fcnNwKCkgKioqLworCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSkgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKwordm9pZAorbGltX3NlbmRfc21lX2lic3NfcGVlcl9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLAorCQkJICAgdWludDE2X3Qgc3RhSW5kZXgsCisJCQkgICB1aW50OF90IHVjYXN0SWR4LAorCQkJICAgdWludDhfdCBiY2FzdElkeCwKKwkJCSAgIHVpbnQ4X3QgKmJlYWNvbiwKKwkJCSAgIHVpbnQxNl90IGJlYWNvbkxlbiwgdWludDE2X3QgbXNnVHlwZSwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdFNpck1zZ1EgbW1oTXNnOworCXRTbWVJYnNzUGVlckluZCAqcE5ld1BlZXJJbmQ7CisKKwlwTmV3UGVlckluZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U21lSWJzc1BlZXJJbmQpICsgYmVhY29uTGVuKTsKKwlpZiAoTlVMTCA9PSBwTmV3UGVlckluZCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTspCisJCXJldHVybjsKKwl9CisKKwljZGZfbWVtX3NldCgodm9pZCAqKXBOZXdQZWVySW5kLCAoc2l6ZW9mKHRTbWVJYnNzUGVlckluZCkgKyBiZWFjb25MZW4pLAorCQkgICAgMCk7CisKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcE5ld1BlZXJJbmQtPnBlZXJBZGRyLAorCQkgICAgIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlwTmV3UGVlckluZC0+c3RhSWQgPSBzdGFJbmRleDsKKwlwTmV3UGVlckluZC0+dWNhc3RTaWcgPSB1Y2FzdElkeDsKKwlwTmV3UGVlckluZC0+YmNhc3RTaWcgPSBiY2FzdElkeDsKKwlwTmV3UGVlckluZC0+bWVzZ0xlbiA9IHNpemVvZih0U21lSWJzc1BlZXJJbmQpICsgYmVhY29uTGVuOworCXBOZXdQZWVySW5kLT5tZXNnVHlwZSA9IG1zZ1R5cGU7CisJcE5ld1BlZXJJbmQtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworCWlmIChiZWFjb24gIT0gTlVMTCkgeworCQljZGZfbWVtX2NvcHkoKHZvaWQgKikoKHVpbnQ4X3QgKikgcE5ld1BlZXJJbmQgKworCQkJCSAgICAgIHNpemVvZih0U21lSWJzc1BlZXJJbmQpKSwgKHZvaWQgKiliZWFjb24sCisJCQkgICAgIGJlYWNvbkxlbik7CisJfQorCisJbW1oTXNnLnR5cGUgPSBtc2dUeXBlOworCW1taE1zZy5ib2R5cHRyID0gcE5ld1BlZXJJbmQ7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgc2Vzc2lvbklkLCBtbWhNc2cudHlwZSkpOworCWxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisKK30KKworLyoqCisgKiBsaW1faGFuZGxlX2NzYV9vZmZsb2FkX21zZygpIC0gSGFuZGxlIENTQSBvZmZsb2FkIG1lc3NhZ2UKKyAqIEBtYWNfY3R4OiAgICAgICAgIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICogQG1zZzogICAgICAgICAgICAgTWVzc2FnZSBwb2ludGVyLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGxpbV9oYW5kbGVfY3NhX29mZmxvYWRfbXNnKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwU2lyTXNnUSBtc2cpCit7CisJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeTsKKwl0U2lyTXNnUSBtbWhfbXNnOworCXRwQ1NBT2ZmbG9hZFBhcmFtcyBjc2FfcGFyYW1zID0gKHRwQ1NBT2ZmbG9hZFBhcmFtcykgKG1zZy0+Ym9keXB0cik7CisJdHBTbWVDc2FPZmZsb2FkSW5kIGNzYV9vZmZsb2FkX2luZDsKKwl0cERwaEhhc2hOb2RlIHN0YV9kcyA9IE5VTEw7CisJdWludDhfdCBzZXNzaW9uX2lkOworCXVpbnQxNl90IGFpZCA9IDA7CisJdExpbVdpZGVyQldDaGFubmVsU3dpdGNoSW5mbyAqY2hubF9zd2l0Y2hfaW5mbyA9IE5VTEw7CisKKwlpZiAoIWNzYV9wYXJhbXMpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgibGltTXNnUSBib2R5IHB0ciBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJc2Vzc2lvbl9lbnRyeSA9CisJCXBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChtYWNfY3R4LAorCQkJY3NhX3BhcmFtcy0+YnNzSWQsICZzZXNzaW9uX2lkKTsKKwlpZiAoIXNlc3Npb25fZW50cnkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlNlc3Npb24gZG9lcyBub3QgZXhpc3QiKSk7CisJCWdvdG8gZXJyOworCX0KKworCXN0YV9kcyA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShtYWNfY3R4LCBzZXNzaW9uX2VudHJ5LT5ic3NJZCwgJmFpZCwKKwkJJnNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisJaWYgKCFzdGFfZHMpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInN0YV9kcyBkb2VzIG5vdCBleGlzdCIpKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKExJTV9JU19TVEFfUk9MRShzZXNzaW9uX2VudHJ5KSkgeworCQlzZXNzaW9uX2VudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hNb2RlID0KKwkJCWNzYV9wYXJhbXMtPnN3aXRjaG1vZGU7CisJCS8qIHRpbWVyIGFscmVhZHkgc3RhcnRlZCBieSBmaXJtd2FyZSwgc3dpdGNoIGltbWVkaWF0ZWx5ICovCisJCXNlc3Npb25fZW50cnktPmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaENvdW50ID0gMDsKKwkJc2Vzc2lvbl9lbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2gucHJpbWFyeUNoYW5uZWwgPQorCQkJY3NhX3BhcmFtcy0+Y2hhbm5lbDsKKwkJc2Vzc2lvbl9lbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUgPQorCQkJZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX09OTFk7CisJCXNlc3Npb25fZW50cnktPmdMaW1DaGFubmVsU3dpdGNoLmNoX3dpZHRoID0gQ0hfV0lEVEhfMjBNSFo7CisKKwkJaWYgKHNlc3Npb25fZW50cnktPnZodENhcGFiaWxpdHkgJiYKKwkJCQlzZXNzaW9uX2VudHJ5LT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgeworCQkJY2hubF9zd2l0Y2hfaW5mbyA9CisJCQkJJnNlc3Npb25fZW50cnktPmdMaW1XaWRlckJXQ2hhbm5lbFN3aXRjaDsKKwkJCWlmIChjc2FfcGFyYW1zLT5pZXNfcHJlc2VudF9mbGFnICYgbGltX3did19pZV9wcmVzZW50KSB7CisJCQkJY2hubF9zd2l0Y2hfaW5mby0+bmV3Q2hhbldpZHRoID0KKwkJCQkJY3NhX3BhcmFtcy0+bmV3X2NoX3dpZHRoOworCQkJCWNobmxfc3dpdGNoX2luZm8tPm5ld0NlbnRlckNoYW5GcmVxMCA9CisJCQkJCWNzYV9wYXJhbXMtPm5ld19jaF9mcmVxX3NlZzE7CisJCQkJY2hubF9zd2l0Y2hfaW5mby0+bmV3Q2VudGVyQ2hhbkZyZXExID0KKwkJCQkJY3NhX3BhcmFtcy0+bmV3X2NoX2ZyZXFfc2VnMjsKKwkJCQlzZXNzaW9uX2VudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSA9CisJCQkJICAgZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX0FORF9TRUNPTkRBUlk7CisJCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guY2hfd2lkdGggPQorCQkJCQljc2FfcGFyYW1zLT5uZXdfY2hfd2lkdGggKyAxOworCQkJfQorCQl9IGVsc2UgaWYgKHNlc3Npb25fZW50cnktPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KSB7CisJCQlpZiAoY3NhX3BhcmFtcy0+c2VjX2NoYW5fb2Zmc2V0KSB7CisJCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guY2hfd2lkdGggPQorCQkJCQlDSF9XSURUSF80ME1IWjsKKwkJCQlzZXNzaW9uX2VudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSA9CisJCQkJICAgICBlTElNX0NIQU5ORUxfU1dJVENIX1BSSU1BUllfQU5EX1NFQ09OREFSWTsKKwkJCX0gZWxzZSB7CisJCQkJc2Vzc2lvbl9lbnRyeS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCQlXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisJCQkJc2Vzc2lvbl9lbnRyeS0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPQorCQkJCSAgICBzZXNzaW9uX2VudHJ5LT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKwkJCX0KKwkJfQorCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJuZXcgY2ggd2lkdGggPSAlZCIpLAorCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guY2hfd2lkdGgpOworCisJCWxpbV9wcmVwYXJlX2ZvcjExaF9jaGFubmVsX3N3aXRjaChtYWNfY3R4LCBzZXNzaW9uX2VudHJ5KTsKKwkJY3NhX29mZmxvYWRfaW5kID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTbWVDc2FPZmZsb2FkSW5kKSk7CisJCWlmIChOVUxMID09IGNzYV9vZmZsb2FkX2luZCkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJtZW1hbGxvYyBmYWlsIGVXTklfU01FX0NTQV9PRkZMT0FEX0VWRU5UIikpOworCQkJZ290byBlcnI7CisJCX0KKworCQljZGZfbWVtX3NldChjc2Ffb2ZmbG9hZF9pbmQsIHNpemVvZih0U21lQ3NhT2ZmbG9hZEluZCksIDApOworCQljc2Ffb2ZmbG9hZF9pbmQtPm1lc2dUeXBlID0gZVdOSV9TTUVfQ1NBX09GRkxPQURfRVZFTlQ7CisJCWNzYV9vZmZsb2FkX2luZC0+bWVzZ0xlbiA9IHNpemVvZih0U21lQ3NhT2ZmbG9hZEluZCk7CisJCWNkZl9tZW1fY29weShjc2Ffb2ZmbG9hZF9pbmQtPmJzc0lkLCBzZXNzaW9uX2VudHJ5LT5ic3NJZCwKKwkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQltbWhfbXNnLnR5cGUgPSBlV05JX1NNRV9DU0FfT0ZGTE9BRF9FVkVOVDsKKwkJbW1oX21zZy5ib2R5cHRyID0gY3NhX29mZmxvYWRfaW5kOworCQltbWhfbXNnLmJvZHl2YWwgPSAwOworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiU2VuZGluZyBlV05JX1NNRV9DU0FfT0ZGTE9BRF9FVkVOVCB0byBTTUUuICIpKTsKKwkJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgKKwkJCShtYWNfY3R4LCBzZXNzaW9uX2VudHJ5LT5wZVNlc3Npb25JZCwgbW1oX21zZy50eXBlKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCQlsaW1fZGlhZ19ldmVudF9yZXBvcnQobWFjX2N0eCwKKwkJCVdMQU5fUEVfRElBR19TV0lUQ0hfQ0hMX0lORF9FVkVOVCwgc2Vzc2lvbl9lbnRyeSwKKwkJCWVTSVJfU1VDQ0VTUywgZVNJUl9TVUNDRVNTKTsKKyNlbmRpZgorCQlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkobWFjX2N0eCwgJm1taF9tc2csIGVQUk9UKTsKKwl9CisKK2VycjoKKwljZGZfbWVtX2ZyZWUoY3NhX3BhcmFtcyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBwZV9kZWxldGVfc2Vzc2lvbigpIC0gSGFuZGxlIHRoZSBEZWxldGUgQlNTIFJlc3BvbnNlIGZyb20gSEFMLgorCisgICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICAgXHBhcmFtIHNlc3Npb25JZCAgICAgICAgICAgICAtIE1lc3NhZ2UgcG9pbnRlci4KKworICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgbGltX2hhbmRsZV9kZWxldGVfYnNzX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgTXNnUSkKK3sKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCXRwRGVsZXRlQnNzUGFyYW1zIHBEZWxCc3MgPSAodHBEZWxldGVCc3NQYXJhbXMpIChNc2dRLT5ib2R5cHRyKTsKKworCXBzZXNzaW9uRW50cnkgPQorCQlwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChwTWFjLCBwRGVsQnNzLT5zZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlNlc3Npb24gRG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JRCAlZCIpLAorCQkJcERlbEJzcy0+c2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoTElNX0lTX0lCU1NfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQlsaW1faWJzc19kZWxfYnNzX3JzcChwTWFjLCBNc2dRLT5ib2R5cHRyLCBwc2Vzc2lvbkVudHJ5KTsKKwl9IGVsc2UgaWYgKExJTV9JU19VTktOT1dOX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJbGltX3Byb2Nlc3Nfc21lX2RlbF9ic3NfcnNwKHBNYWMsIE1zZ1EtPmJvZHl2YWwsIHBzZXNzaW9uRW50cnkpOworCX0KKworCWVsc2UKKwkJbGltX3Byb2Nlc3NfbWxtX2RlbF9ic3NfcnNwKHBNYWMsIE1zZ1EsIHBzZXNzaW9uRW50cnkpOworCit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgbGltX3NlbmRfc21lX2FnZ3JfcW9zX3JzcCgpIC0gc2VuZHMgU01FIEZUIEFHR1IgUU9TIFJTUAorIFwgICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgZVdOSV9TTUVfRlRfQUdHUl9RT1NfUlNQIHRvIFNNRS4KKyBcICAgICAgU01FIG9ubHkgbG9va3MgYXQgcmMgYW5kIHRzcGVjIGZpZWxkLgorICAgXHBhcmFtIHBNYWMgLSBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICAgXHBhcmFtIHJzcFJlcWQgLSBpcyBTbWVBZGRUc1JzcCByZXF1aXJlZAorICAgXHBhcmFtIHN0YXR1cyAtIHN0YXR1cyBjb2RlIG9mIGVXTklfU01FX0ZUX0FHR1JfUU9TX1JTUAorICAgXHJldHVybiB0c3BlYworICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZAorbGltX3NlbmRfc21lX2FnZ3JfcW9zX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpckFnZ3JRb3NSc3AgYWdnclFvc1JzcCwKKwkJCSAgdWludDhfdCBzbWVzZXNzaW9uSWQpCit7CisJdFNpck1zZ1EgbW1oTXNnOworCisJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9GVF9BR0dSX1FPU19SU1A7CisJbW1oTXNnLmJvZHlwdHIgPSBhZ2dyUW9zUnNwOworCW1taE1zZy5ib2R5dmFsID0gMDsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBzbWVzZXNzaW9uSWQsIG1taE1zZy50eXBlKSk7CisJbGltX3N5c19wcm9jZXNzX21taF9tc2dfYXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKworCXJldHVybjsKK30KKyNlbmRpZgorCit2b2lkIGxpbV9zZW5kX3NtZV9tYXhfYXNzb2NfZXhjZWVkZWRfbnRmKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLAorCQkJCQkgdWludDhfdCBzbWVzZXNzaW9uSWQpCit7CisJdFNpck1zZ1EgbW1oTXNnOworCXRTbWVNYXhBc3NvY0luZCAqcFNtZU1heEFzc29jSW5kOworCisJcFNtZU1heEFzc29jSW5kID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTbWVNYXhBc3NvY0luZCkpOworCWlmIChOVUxMID09IHBTbWVNYXhBc3NvY0luZCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTspCisJCXJldHVybjsKKwl9CisJY2RmX21lbV9zZXQoKHZvaWQgKilwU21lTWF4QXNzb2NJbmQsIHNpemVvZih0U21lTWF4QXNzb2NJbmQpLCAwKTsKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcFNtZU1heEFzc29jSW5kLT5wZWVyTWFjLAorCQkgICAgICh1aW50OF90ICopIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlwU21lTWF4QXNzb2NJbmQtPm1lc2dUeXBlID0gZVdOSV9TTUVfTUFYX0FTU09DX0VYQ0VFREVEOworCXBTbWVNYXhBc3NvY0luZC0+bWVzZ0xlbiA9IHNpemVvZih0U21lTWF4QXNzb2NJbmQpOworCXBTbWVNYXhBc3NvY0luZC0+c2Vzc2lvbklkID0gc21lc2Vzc2lvbklkOworCW1taE1zZy50eXBlID0gcFNtZU1heEFzc29jSW5kLT5tZXNnVHlwZTsKKwltbWhNc2cuYm9keXB0ciA9IHBTbWVNYXhBc3NvY0luZDsKKwlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgibXNnVHlwZSAlcyBwZWVyTWFjQWRkciAiIE1BQ19BRERSRVNTX1NUUgorCQkJCSAgICAgICIgc21lIHNlc3Npb24gaWQgJWQiKSwKKwkJICAgICAgICJlV05JX1NNRV9NQVhfQVNTT0NfRVhDRUVERUQiLAorCQkgICAgICAgTUFDX0FERFJfQVJSQVkocGVlck1hY0FkZHIpKTsKKwkgICAgICAgKQorCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIHNtZXNlc3Npb25JZCwgbW1oTXNnLnR5cGUpKTsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCisJcmV0dXJuOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBsaW1fc2VuZF9zbWVfZGZzX2V2ZW50X25vdGlmeSgpIC0gc2VuZHMKKyAgIGVXTklfU01FX0RGU19SQURBUl9GT1VORAorICAgQWZ0ZXIgcmVjZWl2aW5nIFdNSV9QSFlFUlJfRVZFTlRJRCBpbmRpY2F0aW9uIGZyYW1lIGZyb20gRlcsIHRoaXMKKyAgIGZ1bmN0aW9uIHNlbmRzIGEgZVdOSV9TTUVfREZTX1JBREFSX0ZPVU5EIHRvIFNNRSB0byBub3RpZnkKKyAgIHRoYXQgYSBSQURBUiBpcyBmb3VuZCBvbiBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsIGFuZCBTQVAtCisgICBoYXMgdG8gbW92ZSB0byBhIG5ldyBjaGFubmVsLgorICAgXHBhcmFtIHBNYWMgLSBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICAgXHBhcmFtIG1zZ1R5cGUgLSBtZXNzYWdlIHR5cGUgcmVjZWl2ZWQgZnJvbSBsb3dlciBsYXllcgorICAgXHBhcmFtIGV2ZW50IC0gZXZlbnQgZGF0YSByZWNlaXZlZCBmcm9tIGxvd2VyIGxheWVyCisgICBccmV0dXJuIG5vbmUKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK2xpbV9zZW5kX3NtZV9kZnNfZXZlbnRfbm90aWZ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IG1zZ1R5cGUsIHZvaWQgKmV2ZW50KQoreworCXRTaXJNc2dRIG1taE1zZzsKKwltbWhNc2cudHlwZSA9IGVXTklfU01FX0RGU19SQURBUl9GT1VORDsKKwltbWhNc2cuYm9keXB0ciA9IGV2ZW50OworCW1taE1zZy5ib2R5dmFsID0gMDsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIGxpbV9zZW5kX2Rmc19jaGFuX3N3X2llX3VwZGF0ZSgpCisgICBUaGlzIHRpbWVyIGhhbmRsZXIgdXBkYXRlcyB0aGUgY2hhbm5lbCBzd2l0Y2ggSUUgaW4gYmVhY29uIHRlbXBsYXRlCisKKyAgIFxwYXJhbSBwTWFjIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgICBccmV0dXJuICAgICAtIGNoYW5uZWwgdG8gc2NhbiBmcm9tIHZhbGlkIHNlc3Npb24gZWxzZSB6ZXJvLgorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZAorbGltX3NlbmRfZGZzX2NoYW5fc3dfaWVfdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwkvKiBVcGRhdGUgdGhlIGJlYWNvbiB0ZW1wbGF0ZSBhbmQgc2VuZCB0byBGVyAqLworCWlmIChzY2hfc2V0X2ZpeGVkX2JlYWNvbl9maWVsZHMocE1hYywgcHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gc2V0IENTQSBJRSBpbiBiZWFjb24iKSk7KQorCQlyZXR1cm47CisJfQorCisJLyogU2VuZCB1cGRhdGUgYmVhY29uIHRlbXBsYXRlIG1lc3NhZ2UgKi8KKwlsaW1fc2VuZF9iZWFjb25faW5kKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsCisJCSAgICAgICBGTCgiIFVwZGF0ZWQgQ1NBIElFLCBJRSBDT1VOVCA9ICVkIiksCisJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hDb3VudCk7CisJICAgICAgICkKKworCXJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgbGltX3NlbmRfc21lX2FwX2NoYW5uZWxfc3dpdGNoX3Jlc3AoKSAtIHNlbmRzCisgICBlV05JX1NNRV9DSEFOTkVMX0NIQU5HRV9SU1AKKyAgIEFmdGVyIHJlY2VpdmluZyBXTUFfU1dJVENIX0NIQU5ORUxfUlNQIGluZGljYXRpb24gdGhpcworICAgZnVuY3Rpb24gc2VuZHMgYSBlV05JX1NNRV9DSEFOTkVMX0NIQU5HRV9SU1AgdG8gU01FIHRvIG5vdGlmeQorICAgdGhhdCB0aGUgQ2hhbm5lbCBjaGFuZ2UgaGFzIGJlZW4gZG9uZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAorICAgY2hhbm5lbCBpbiB0aGUgQ2hhbm5lbCBjaGFuZ2UgcmVxdWVzdAorICAgXHBhcmFtIHBNYWMgLSBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICAgXHBhcmFtIHBzZXNzaW9uRW50cnkgLSBzZXNzaW9uIGluZm8KKyAgIFxwYXJhbSBwQ2hubFBhcmFtcyAtIENoYW5uZWwgc3dpdGNoIHBhcmFtcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltX3NlbmRfc21lX2FwX2NoYW5uZWxfc3dpdGNoX3Jlc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkgICAgdHBTd2l0Y2hDaGFubmVsUGFyYW1zIHBDaG5sUGFyYW1zKQoreworCXRTaXJNc2dRIG1taE1zZzsKKwl0cFN3aXRjaENoYW5uZWxQYXJhbXMgcFNtZVN3aXRoQ2hubFBhcmFtczsKKwl1aW50OF90IGNoYW5uZWxJZDsKKworCXBTbWVTd2l0aENobmxQYXJhbXMgPSAodFN3aXRjaENoYW5uZWxQYXJhbXMgKikKKwkJCSAgICAgIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U3dpdGNoQ2hhbm5lbFBhcmFtcykpOworCWlmIChOVUxMID09IHBTbWVTd2l0aENobmxQYXJhbXMpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIkFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcFNtZVN3aXRoQ2hubFBhcmFtc1xuIikpOworCQlyZXR1cm47CisJfQorCisJY2RmX21lbV9zZXQoKHZvaWQgKilwU21lU3dpdGhDaG5sUGFyYW1zLAorCQkgICAgc2l6ZW9mKHRTd2l0Y2hDaGFubmVsUGFyYW1zKSwgMCk7CisKKwljZGZfbWVtX2NvcHkocFNtZVN3aXRoQ2hubFBhcmFtcywgcENobmxQYXJhbXMsCisJCSAgICAgc2l6ZW9mKHRTd2l0Y2hDaGFubmVsUGFyYW1zKSk7CisKKwljaGFubmVsSWQgPSBwU21lU3dpdGhDaG5sUGFyYW1zLT5jaGFubmVsTnVtYmVyOworCisJLyoKKwkgKiBQYXNzIHRoZSBzbWUgc2Vzc2lvbklEIHRvIFNNRSBpbnN0ZWFkCisJICogUEUgc2Vzc2lvbiBJRC4KKwkgKi8KKwlwU21lU3dpdGhDaG5sUGFyYW1zLT5wZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworCW1taE1zZy50eXBlID0gZVdOSV9TTUVfQ0hBTk5FTF9DSEFOR0VfUlNQOworCW1taE1zZy5ib2R5cHRyID0gKHZvaWQgKilwU21lU3dpdGhDaG5sUGFyYW1zOworCW1taE1zZy5ib2R5dmFsID0gMDsKKwlsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCisJLyoKKwkgKiBXZSBzaG91bGQgc3RhcnQgYmVhY29uIHRyYW5zbWlzc2lvbiBvbmx5IGlmIHRoZSBuZXcKKwkgKiBjaGFubmVsIGFmdGVyIGNoYW5uZWwgY2hhbmdlIGlzIE5vbi1ERlMuIEZvciBhIERGUworCSAqIGNoYW5uZWwsIFBFIHdpbGwgcmVjZWl2ZSBhbiBleHBsaWNpdCByZXF1ZXN0IGZyb20KKwkgKiB1cHBlciBsYXllcnMgdG8gc3RhcnQgdGhlIGJlYWNvbiB0cmFuc21pc3Npb24gLgorCSAqLworCisJaWYgKENIQU5ORUxfU1RBVEVfREZTICE9IGNkc19nZXRfY2hhbm5lbF9zdGF0ZShjaGFubmVsSWQpKSB7CisJCWlmIChjaGFubmVsSWQgPT0gcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSB7CisJCQlsaW1fYXBwbHlfY29uZmlndXJhdGlvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJCWxpbV9zZW5kX2JlYWNvbl9pbmQocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCX0gZWxzZSB7CisJCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJGYWlsZWQgdG8gVHJhbnNtaXQgQmVhY29ucyBvbiBjaGFubmVsID0gJWQiCisJCQkJCSAgICAgICAiYWZ0ZXIgQVAgY2hhbm5lbCBjaGFuZ2UgcmVzcG9uc2UiKSwKKwkJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+YmNuTGVuKTsKKwkJCSAgICAgICApCisJCX0KKwl9CisJcmV0dXJuOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBsaW1fcHJvY2Vzc19iZWFjb25fdHhfc3VjY2Vzc19pbmQoKSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZAorICAgZXhwbGljaXRlbHkgdG8gaGFuZGxlIHN1Y2Nlc3NmdWwgYmVhY29uIHRyYW5zbWlzc2lvbiBpbmRpY2F0aW9uCisgICBmcm9tIHRoZSBGVy4gVGhpcyBpcyBhIGdlbmVyaWMgZXZlbnQgZ2VuZXJhdGVkIGJ5IHRoZSBGVyBhZmVyIHRoZQorICAgZmlyc3QgYmVhY29uIGlzIHNlbnQgb3V0IGFmdGVyIHRoZSBiZWFjb24gdGVtcGxhdGUgdXBkYXRlIGJ5IHRoZQorICAgaG9zdAorICAgXHBhcmFtIHBNYWMgLSBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICAgXHBhcmFtIHBzZXNzaW9uRW50cnkgLSBzZXNzaW9uIGluZm8KKyAgIFxyZXR1cm4gbm9uZQorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZAorbGltX3Byb2Nlc3NfYmVhY29uX3R4X3N1Y2Nlc3NfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IG1zZ1R5cGUsIHZvaWQgKmV2ZW50KQoreworCS8qIEN1cnJlbnRseSwgdGhpcyBldmVudCBpcyB1c2VkIG9ubHkgZm9yIERGUyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQKKwkgKiBJRSB1cGRhdGUgaW4gdGhlIHRlbXBsYXRlLiBJZiByZXF1aXJlZCB0byBiZSB1c2VkIGZvciBvdGhlciBJRSB1cGRhdGVzCisJICogYWRkIGFwcHJvcHJpYXRlIGNvZGUgYnkgaW50cm9kdWNpbmcgYSBzdGF0ZSB2YXJpYWJsZQorCSAqLworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisJdFNpck1zZ1EgbW1oTXNnOworCXRTaXJTbWVDU0FJZVR4Q29tcGxldGVSc3AgKnBDaGFuU3dUeFJlc3BvbnNlOworCXN0cnVjdCBzaXJfYmVhY29uX3R4X2NvbXBsZXRlX3JzcCAqYmVhY29uX3R4X2NvbXBfcnNwX3B0cjsKKwl1aW50OF90IGxlbmd0aCA9IHNpemVvZih0U2lyU21lQ1NBSWVUeENvbXBsZXRlUnNwKTsKKwl0cFNpckZpcnN0QmVhY29uVHhDb21wbGV0ZUluZCBwQmNuVHhJbmQgPQorCQkodFNpckZpcnN0QmVhY29uVHhDb21wbGV0ZUluZCAqKSBldmVudDsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzX2lkeChwTWFjLCBwQmNuVHhJbmQtPmJzc0lkeCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpICYmCisJICAgIHRydWUgPT0gcHNlc3Npb25FbnRyeS0+ZGZzSW5jbHVkZUNoYW5Td0llKSB7CisJCS8qIFNlbmQgb25seSA1IGJlYWNvbnMgd2l0aCBDU0EgSUUgU2V0IGluIHdoZW4gYSByYWRhciBpcyBkZXRlY3RlZCAqLworCQlpZiAocHNlc3Npb25FbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQgPiAwKSB7CisJCQkvKgorCQkJICogU2VuZCB0aGUgbmV4dCBiZWFjb24gd2l0aCB1cGRhdGVkIENTQSBJRSBjb3VudAorCQkJICovCisJCQlsaW1fc2VuZF9kZnNfY2hhbl9zd19pZV91cGRhdGUocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCQkvKiBEZWNyZW1lbnQgdGhlIElFIGNvdW50ICovCisJCQlwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hDb3VudC0tOworCQl9IGVsc2UgeworCQkJLyogRG9uZSB3aXRoIENTQSBJRSB1cGRhdGUsIHNlbmQgcmVzcG9uc2UgYmFjayB0byBTTUUgKi8KKwkJCXBzZXNzaW9uRW50cnktPmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaENvdW50ID0gMDsKKwkJCWlmIChwTWFjLT5zYXAuU2FwRGZzSW5mby5kaXNhYmxlX2Rmc19jaF9zd2l0Y2ggPT0gZmFsc2UpCisJCQkJcHNlc3Npb25FbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoTW9kZSA9IDA7CisJCQlwc2Vzc2lvbkVudHJ5LT5kZnNJbmNsdWRlQ2hhblN3SWUgPSBmYWxzZTsKKwkJCXBzZXNzaW9uRW50cnktPmRmc0luY2x1ZGVDaGFuV3JhcHBlckllID0gZmFsc2U7CisKKwkJCXBDaGFuU3dUeFJlc3BvbnNlID0gKHRTaXJTbWVDU0FJZVR4Q29tcGxldGVSc3AgKikKKwkJCQkJICAgIGNkZl9tZW1fbWFsbG9jKGxlbmd0aCk7CisKKwkJCWlmIChOVUxMID09IHBDaGFuU3dUeFJlc3BvbnNlKSB7CisJCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCQlGTAorCQkJCQkJKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIHRTaXJTbWVDU0FJZVR4Q29tcGxldGVSc3AiKSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQljZGZfbWVtX3NldCgodm9pZCAqKXBDaGFuU3dUeFJlc3BvbnNlLCBsZW5ndGgsIDApOworCQkJcENoYW5Td1R4UmVzcG9uc2UtPnNlc3Npb25JZCA9CisJCQkJcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCQkJcENoYW5Td1R4UmVzcG9uc2UtPmNoYW5Td0llVHhTdGF0dXMgPQorCQkJCUNERl9TVEFUVVNfU1VDQ0VTUzsKKworCQkJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9ERlNfQ1NBSUVfVFhfQ09NUExFVEVfSU5EOworCQkJbW1oTXNnLmJvZHlwdHIgPSBwQ2hhblN3VHhSZXNwb25zZTsKKwkJCW1taE1zZy5ib2R5dmFsID0gMDsKKwkJCWxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisJCX0KKwl9CisKKwlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgJiYKKwkJcHNlc3Npb25FbnRyeS0+Z0xpbU9wZXJhdGluZ01vZGUucHJlc2VudCkgeworCQkvKiBEb25lIHdpdGggbnNzIHVwZGF0ZSwgc2VuZCByZXNwb25zZSBiYWNrIHRvIFNNRSAqLworCQlwc2Vzc2lvbkVudHJ5LT5nTGltT3BlcmF0aW5nTW9kZS5wcmVzZW50ID0gMDsKKwkJYmVhY29uX3R4X2NvbXBfcnNwX3B0ciA9IChzdHJ1Y3Qgc2lyX2JlYWNvbl90eF9jb21wbGV0ZV9yc3AgKikKKwkJCQljZGZfbWVtX21hbGxvYyhzaXplb2YoKmJlYWNvbl90eF9jb21wX3JzcF9wdHIpKTsKKwkJaWYgKE5VTEwgPT0gYmVhY29uX3R4X2NvbXBfcnNwX3B0cikgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGJlYWNvbl90eF9jb21wX3JzcF9wdHIiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJY2RmX21lbV9zZXQoKHZvaWQgKiliZWFjb25fdHhfY29tcF9yc3BfcHRyLAorCQkJCQlzaXplb2YoKmJlYWNvbl90eF9jb21wX3JzcF9wdHIpLCAwKTsKKwkJYmVhY29uX3R4X2NvbXBfcnNwX3B0ci0+c2Vzc2lvbl9pZCA9CisJCQlwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisJCWJlYWNvbl90eF9jb21wX3JzcF9wdHItPnR4X3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9OU1NfVVBEQVRFX1JTUDsKKwkJbW1oTXNnLmJvZHlwdHIgPSBiZWFjb25fdHhfY29tcF9yc3BfcHRyOworCQltbWhNc2cuYm9keXZhbCA9IDA7CisJCWxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisJfQorCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3NlbmRfc21lX3JzcF9tZXNzYWdlcy5oIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VuZF9zbWVfcnNwX21lc3NhZ2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwNzQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3NlbmRfc21lX3JzcF9tZXNzYWdlcy5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGxpbV9zZW5kX3NtZV9yc3BfbWVzc2FnZXMuaCBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yCisgKiBzZW5kaW5nIFNNRSByZXNwb25zZS9ub3RpZmljYXRpb24gbWVzc2FnZXMgdG8gYXBwbGljYXRpb25zIGFib3ZlCisgKiBNQUMgc29mdHdhcmUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaWZuZGVmIF9fTElNX1NFTkRfU01FX1JTUF9ICisjZGVmaW5lIF9fTElNX1NFTkRfU01FX1JTUF9ICisKKyNpbmNsdWRlICJzaXJfY29tbW9uLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorI2luY2x1ZGUgInNpcl9tYWNfcHJvdF9kZWYuaCIKKworLyogRnVuY3Rpb25zIGZvciBzZW5kaW5nIHJlc3BvbnNlcyB0byBIb3N0ICovCit2b2lkIGxpbV9zZW5kX3NtZV9yc3AodHBBbmlTaXJHbG9iYWwsIHVpbnQxNl90LCB0U2lyUmVzdWx0Q29kZXMsIHVpbnQ4X3QsCisJCSAgICAgIHVpbnQxNl90KTsKK3ZvaWQgbGltX3NlbmRfc21lX3JvY19yc3AodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDE2X3QgbXNnX3R5cGUsCisJIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRfY29kZSwgdWludDhfdCBzbWVfc2Vzc2lvbl9pZCwKKwkgdWludDMyX3Qgc2Nhbl9pZCk7Cit2b2lkIGxpbV9zZW5kX3NtZV9zdGFydF9ic3NfcnNwKHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdFNpclJlc3VsdENvZGVzLAorCQkJCXRwUEVTZXNzaW9uLCB1aW50OF90LCB1aW50MTZfdCk7Cit2b2lkIGxpbV9zZW5kX3NtZV9zY2FuX3JzcCh0cEFuaVNpckdsb2JhbCwgdFNpclJlc3VsdENvZGVzLCB1aW50OF90LAorCXVpbnQxNl90LCB1aW50MzJfdCBzY2FuX2lkKTsKK3ZvaWQgbGltX3Bvc3Rfc21lX3NjYW5fcnNwX21lc3NhZ2UodHBBbmlTaXJHbG9iYWwsIHRTaXJSZXN1bHRDb2RlcywKKwkJCQkgICB1aW50OF90LCB1aW50MTZfdCwgdWludDMyX3Qgc2Nhbl9pZCk7CisKK3ZvaWQgbGltX3NlbmRfc21lX2pvaW5fcmVhc3NvY19yc3AodHBBbmlTaXJHbG9iYWwsIHVpbnQxNl90LCB0U2lyUmVzdWx0Q29kZXMsCisJCQkJICAgdWludDE2X3QsIHRwUEVTZXNzaW9uLCB1aW50OF90LCB1aW50MTZfdCk7Cit2b2lkIGxpbV9zZW5kX3NtZV9kaXNhc3NvY19udGYodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNBZGRyLCB0U2lyUmVzdWx0Q29kZXMsCisJCQkgICAgICAgdWludDE2X3QsIHVpbnQxNl90LCB1aW50OF90LCB1aW50MTZfdCwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fc2VuZF9zbWVfZGVhdXRoX250Zih0cEFuaVNpckdsb2JhbCwgdFNpck1hY0FkZHIsIHRTaXJSZXN1bHRDb2RlcywgdWludDE2X3QsCisJCQkgICAgIHVpbnQxNl90LCB1aW50OF90LCB1aW50MTZfdCk7Cit2b2lkIGxpbV9zZW5kX3NtZV9kaXNhc3NvY19pbmQodHBBbmlTaXJHbG9iYWwsIHRwRHBoSGFzaE5vZGUsIHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltX3NlbmRfc21lX2RlYXV0aF9pbmQodHBBbmlTaXJHbG9iYWwsIHRwRHBoSGFzaE5vZGUsCisJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fc2VuZF9zbWVfd21fc3RhdHVzX2NoYW5nZV9udGYodHBBbmlTaXJHbG9iYWwsIHRTaXJTbWVTdGF0dXNDaGFuZ2VDb2RlLAorCQkJCSAgICAgICB1aW50MzJfdCAqLCB1aW50MTZfdCwgdWludDhfdCk7Cit2b2lkIGxpbV9zZW5kX3NtZV9zZXRfY29udGV4dF9yc3AodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNBZGRyLCB1aW50MTZfdCwKKwkJCQkgIHRTaXJSZXN1bHRDb2RlcywgdHBQRVNlc3Npb24sIHVpbnQ4X3QsIHVpbnQxNl90KTsKK3ZvaWQgbGltX3NlbmRfc21lX25laWdoYm9yX2Jzc19pbmQodHBBbmlTaXJHbG9iYWwsIHRMaW1TY2FuUmVzdWx0Tm9kZSAqKTsKK3ZvaWQgbGltX2hhbmRsZV9kZWxldGVfYnNzX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgTXNnUSk7Cit2b2lkIGxpbV9oYW5kbGVfY3NhX29mZmxvYWRfbXNnKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwU2lyTXNnUSBtc2cpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK3ZvaWQKK2xpbV9zZW5kX3NtZV9hZ2dyX3Fvc19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJBZ2dyUW9zUnNwIGFnZ3JRb3NSc3AsCisJCQkgIHVpbnQ4X3Qgc21lc2Vzc2lvbklkKTsKKyNlbmRpZiAvKldMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKK3ZvaWQgbGltX3NlbmRfc21lX2FkZHRzX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHJzcFJlcWQsIHVpbnQzMl90IHN0YXR1cywKKwkJCSAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LCB0U2lyTWFjVHNwZWNJRSB0c3BlYywKKwkJCSAgICB1aW50OF90IHNtZXNlc3Npb25JZCwgdWludDE2X3Qgc21ldHJhbnNhY3Rpb25JZCk7Cit2b2lkIGxpbV9zZW5kX3NtZV9kZWx0c19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJEZWx0c1JlcSBkZWx0cywKKwkJCSAgICB1aW50MzJfdCBzdGF0dXMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkgICAgdWludDhfdCBzbWVzc2lvbklkLCB1aW50MTZfdCBzbWV0cmFuc2FjdGlvbklkKTsKK3ZvaWQgbGltX3NlbmRfc21lX2RlbHRzX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpckRlbHRzUmVxSW5mbyBkZWx0cywKKwkJCSAgICB1aW50MTZfdCBhaWQsIHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltX3NlbmRfc21lX3N0YXRzX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBtc2d0eXBlLCB2b2lkICpzdGF0cyk7CisKK3ZvaWQgbGltX3NlbmRfc21lX3BlX3N0YXRpc3RpY3NfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IG1zZ3R5cGUsCisJCQkJICAgIHZvaWQgKnN0YXRzKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAordm9pZCBsaW1fc2VuZF9zbWVfcGVfZXNlX3RzbV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFuaUdldFRzbVN0YXRzUnNwICpwU3RhdHMpOworI2VuZGlmCisKK3ZvaWQgbGltX3NlbmRfc21lX2lic3NfcGVlcl9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisJCQkJdWludDE2X3Qgc3RhSW5kZXgsIHVpbnQ4X3QgdWNhc3RJZHgsCisJCQkJdWludDhfdCBiY2FzdElkeCwgdWludDhfdCAqYmVhY29uLAorCQkJCXVpbnQxNl90IGJlYWNvbkxlbiwgdWludDE2X3QgbXNnVHlwZSwKKwkJCQl1aW50OF90IHNlc3Npb25JZCk7CisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCit2b2lkIGxpbV9zZW5kX3NtZV9vZW1fZGF0YV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgKnBNc2dCdWYsCisJCQkgICAgICAgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUpOworI2VuZGlmCisKK3ZvaWQgbGltX3NlbmRfc21lX21heF9hc3NvY19leGNlZWRlZF9udGYodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisJCQkJCSB1aW50OF90IHNtZXNlc3Npb25JZCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKK3ZvaWQgbGltX3NlbmRfc21lX3RkbHNfbGlua19lc3RhYmxpc2hfcmVxX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgdFNpck1hY0FkZHIgcGVlck1hYywKKwkJCQkJICAgICAgdERwaEhhc2hOb2RlICpwU3RhRHMsIHVpbnQ4X3Qgc3RhdHVzKTsKK3ZvaWQgbGltX3NlbmRfc21lX3RkbHNfZXZlbnRfbm90aWZ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IG1zZ1R5cGUsCisJCQkJICAgIHZvaWQgKmV2ZW50cyk7CisjZW5kaWYKKwordm9pZCBsaW1fc2VuZF9zbWVfZGZzX2V2ZW50X25vdGlmeSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBtc2dUeXBlLAorCQkJCSAgIHZvaWQgKmV2ZW50KTsKK3ZvaWQgbGltX3NlbmRfc21lX2FwX2NoYW5uZWxfc3dpdGNoX3Jlc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkJCSB0cFN3aXRjaENoYW5uZWxQYXJhbXMgcENobmxQYXJhbXMpOwordm9pZAorbGltX3Byb2Nlc3NfYmVhY29uX3R4X3N1Y2Nlc3NfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IG1zZ1R5cGUsCisJCQkJICB2b2lkICpldmVudCk7CisKK3R5cGVkZWYgZW51bSB7CisJbGltX2NzYV9pZV9wcmVzZW50ID0gMHgwMDAwMDAwMSwKKwlsaW1feGNzYV9pZV9wcmVzZW50ID0gMHgwMDAwMDAwMiwKKwlsaW1fd2J3X2llX3ByZXNlbnQgPSAweDAwMDAwMDA0LAorCWxpbV9jc3dhcnBfaWVfcHJlc2VudCA9IDB4MDAwMDAwMDgsCit9IGxpbV9jc2FfZXZlbnRfaWVzX3ByZXNlbnRfZmxhZzsKKworI2VuZGlmIC8qIF9fTElNX1NFTkRfU01FX1JTUF9IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zZXJfZGVzX3V0aWxzLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zZXJfZGVzX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3NzhmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Nlcl9kZXNfdXRpbHMuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBsaW1fc2VyX2Rlc191dGlscy5jYyBjb250YWlucyB0aGUgc2VyaWFsaXplci9kZXNlcmlhbGl6ZXIKKyAqIHV0aWxpdHkgZnVuY3Rpb25zIExJTSB1c2VzIHdoaWxlIGNvbW11bmljYXRpbmcgd2l0aCB1cHBlciBsYXllcgorICogc29mdHdhcmUgZW50aXRpZXMKKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDEwLzIwLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAiYW5pX3N5c3RlbV9kZWZzLmgiCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Nlcl9kZXNfdXRpbHMuaCIKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgIGxpbV9nZXRfc2Vzc2lvbl9pbmZvCisgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2Vzc2lvbklkIGFuZCB0cmFuc2FjdGlvbklkCisgXCAgICAgICBvZiBhIG1lc3NhZ2UuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBtZXNzYWdlIHN0cnVjdHVyZQorIFwgICAgICAgaXMgb2YgZm9ybWF0OgorIFwgICAgICAgICAgdWludDE2X3QgICBtZXNzYWdlVHlwZQorIFwgICAgICAgICAgdWludDE2X3QgICBtZXNzYWdlTGVuZ3RoCisgXCAgICAgICAgICB1aW50OF90ICAgIHNlc3Npb25JZAorIFwgICAgICAgICAgdWludDE2X3QgICB0cmFuc2FjdGlvbklkCisgICBccGFyYW0gIHBNYWMgICAgICAgICAgLSBwTWFjIGdsb2JhbCBzdHJ1Y3R1cmUKKyAgIFxwYXJhbSAgKnBCdWYgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgYnVmZmVyCisgICBccGFyYW0gIHNlc3Npb25JZCAgICAgLSByZXR1cm5lZCBzZXNzaW9uIGlkIHZhbHVlCisgICBccGFyYW0gIHRyYW5zYWN0aW9uSWQgLSByZXR1cm5lZCB0cmFuc2FjdGlvbiBJRCB2YWx1ZQorICAgXHJldHVybiBOb25lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltX2dldF9zZXNzaW9uX2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcEJ1ZiwgdWludDhfdCAqc2Vzc2lvbklkLAorCQkgICAgIHVpbnQxNl90ICp0cmFuc2FjdGlvbklkKQoreworCWlmICghcEJ1ZikgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJOVUxMIHB0ciByZWNlaXZlZC4gIikpOworCQlyZXR1cm47CisJfQorCisJcEJ1ZiArPSBzaXplb2YodWludDE2X3QpOyAgICAgICAvKiBza2lwIG1lc3NhZ2UgdHlwZSAqLworCXBCdWYgKz0gc2l6ZW9mKHVpbnQxNl90KTsgICAgICAgLyogc2tpcCBtZXNzYWdlIGxlbmd0aCAqLworCisJKnNlc3Npb25JZCA9ICpwQnVmOyAgICAgLyogZ2V0IHNlc3Npb25JZCAqLworCXBCdWYrKzsKKwkqdHJhbnNhY3Rpb25JZCA9IGxpbV9nZXRfdTE2KHBCdWYpOyAgICAgICAvKiBnZXQgdHJhbnNhY3Rpb25JZCAqLworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VyX2Rlc191dGlscy5oIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2VyX2Rlc191dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNWY0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zZXJfZGVzX3V0aWxzLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGZpbGUgbGltX3Nlcl9kZXNfdXRpbHMuaCBjb250YWlucyB0aGUgdXRpbGl0eSBkZWZpbml0aW9ucworICogTElNIHVzZXMgd2hpbGUgcHJvY2Vzc2luZyBtZXNzYWdlcyBmcm9tIHVwcGVyIGxheWVyIHNvZnR3YXJlCisgKiBtb2R1bGVzCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAxMC8yMC8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgX19MSU1fU0VSREVTX1VUSUxTX0gKKyNkZWZpbmUgX19MSU1fU0VSREVTX1VUSUxTX0gKKworI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJhbmlfc3lzdGVtX2RlZnMuaCIKKyNpbmNsdWRlICJzaXJfbWFjX3Byb3RfZGVmLmgiCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3Byb3BfZXh0c191dGlscy5oIgorCit2b2lkIGxpbV9nZXRfc2Vzc2lvbl9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKiwKKwkJCSAgdWludDhfdCAqLCB1aW50MTZfdCAqKTsKKworLyogQnl0ZSBTdHJpbmcgPC0tPiB1aW50MTZfdC91aW50MzJfdCBjb3B5IGZ1bmN0aW9ucyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpbV9jb3B5X3UxNih1aW50OF90ICpwdHIsIHVpbnQxNl90IHUxNlZhbCkKK3sKKyNpZiAoKGRlZmluZWQoQU5JX09TX1RZUEVfUU5YKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKSB8fAlcCisJKGRlZmluZWQoQU5JX09TX1RZUEVfQU5EUk9JRCkgJiYgZGVmaW5lZChBTklfTElUVExFX0JZVEVfRU5ESUFOKSkpCisJKnB0cisrID0gKHVpbnQ4X3QpICh1MTZWYWwgJiAweGZmKTsKKwkqcHRyID0gKHVpbnQ4X3QpICgodTE2VmFsID4+IDgpICYgMHhmZik7CisjZWxzZQorI2Vycm9yICJVbmtub3duIGNvbWJpbmF0aW9uIG9mIE9TIFR5cGUgYW5kIGVuZGlhbmVzcyIKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGxpbV9nZXRfdTE2KHVpbnQ4X3QgKnB0cikKK3sKKyNpZiAoKGRlZmluZWQoQU5JX09TX1RZUEVfUU5YKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKSB8fAlcCisJKGRlZmluZWQoQU5JX09TX1RZUEVfQU5EUk9JRCkgJiYgZGVmaW5lZChBTklfTElUVExFX0JZVEVfRU5ESUFOKSkpCisJcmV0dXJuICgodWludDE2X3QpICgqKHB0ciArIDEpIDw8IDgpKSB8ICgodWludDE2X3QpICgqcHRyKSk7CisjZWxzZQorI2Vycm9yICJVbmtub3duIGNvbWJpbmF0aW9uIG9mIE9TIFR5cGUgYW5kIGVuZGlhbmVzcyIKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGltX2NvcHlfdTMyKHVpbnQ4X3QgKnB0ciwgdWludDMyX3QgdTMyVmFsKQoreworI2lmICgoZGVmaW5lZChBTklfT1NfVFlQRV9RTlgpICYmIGRlZmluZWQoQU5JX0xJVFRMRV9CWVRFX0VORElBTikpIHx8CVwKKwkoZGVmaW5lZChBTklfT1NfVFlQRV9BTkRST0lEKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKSkKKwkqcHRyKysgPSAodWludDhfdCkgKHUzMlZhbCAmIDB4ZmYpOworCSpwdHIrKyA9ICh1aW50OF90KSAoKHUzMlZhbCA+PiA4KSAmIDB4ZmYpOworCSpwdHIrKyA9ICh1aW50OF90KSAoKHUzMlZhbCA+PiAxNikgJiAweGZmKTsKKwkqcHRyID0gKHVpbnQ4X3QpICgodTMyVmFsID4+IDI0KSAmIDB4ZmYpOworI2Vsc2UKKyNlcnJvciAiVW5rbm93biBjb21iaW5hdGlvbiBvZiBPUyBUeXBlIGFuZCBlbmRpYW5lc3MiCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBsaW1fZ2V0X3UzMih1aW50OF90ICpwdHIpCit7CisjaWYgKChkZWZpbmVkKEFOSV9PU19UWVBFX1FOWCkgJiYgZGVmaW5lZChBTklfTElUVExFX0JZVEVfRU5ESUFOKSkgfHwJXAorCShkZWZpbmVkKEFOSV9PU19UWVBFX0FORFJPSUQpICYmIGRlZmluZWQoQU5JX0xJVFRMRV9CWVRFX0VORElBTikpKQorCXJldHVybiAoKCoocHRyICsgMykgPDwgMjQpIHwKKwkJKCoocHRyICsgMikgPDwgMTYpIHwgKCoocHRyICsgMSkgPDwgOCkgfCAoKihwdHIpKSk7CisjZWxzZQorI2Vycm9yICJVbmtub3duIGNvbWJpbmF0aW9uIG9mIE9TIFR5cGUgYW5kIGVuZGlhbmVzcyIKKyNlbmRpZgorfQorCisjZW5kaWYgLyogX19MSU1fU0VSREVTX1VUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Nlc3Npb24uYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3Nlc3Npb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzczYjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2Vzc2lvbi5jCkBAIC0wLDAgKzEsNzY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICBsaW1fc2Vzc2lvbi5jCisKKyAgIFxicmllZiBpbXBsZW1lbnRhdGlvbiBmb3IgbGltIFNlc3Npb24gcmVsYXRlZCBBUElzCisKKyAgIFxhdXRob3IgU3VuaXQgQmhhdGlhCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgImxpbV9kZWJ1Zy5oIgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSAibGltX2Z0X2RlZnMuaCIKKyNpbmNsdWRlICJsaW1fZnQuaCIKKyNlbmRpZgorI2luY2x1ZGUgImxpbV9zZXNzaW9uLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisjaW5jbHVkZSAibGltX3NlbmRfbWVzc2FnZXMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgcGVfaW5pdF9iZWFjb25fcGFyYW1zKCkgLSBJbml0aWFsaXplIHRoZSBiZWFjb25QYXJhbXMgc3RydWN0dXJlCisKKyAgIFxwYXJhbSB0cFBFU2Vzc2lvbiAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gY29udGV4dCBvciBOVUxMIGlmIHNlc3Npb24gY2FuIG5vdCBiZSBjcmVhdGVkLgorICAgXHJldHVybiB2b2lkCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHBlX2luaXRfYmVhY29uX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbCA9IDA7CisJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZTaG9ydFByZWFtYmxlID0gMDsKKwlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxhQ29leGlzdCA9IDA7CisJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYkNvZXhpc3QgPSAwOworCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0ID0gMDsKKwlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuaHQyMENvZXhpc3QgPSAwOworCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QgPSAwOworCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGUgPSAwOworCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSAwOworCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5nSFRPYnNzTW9kZSA9IDA7CisKKwkvKiBOdW1iZXIgb2YgbGVnYWN5IFNUQXMgYXNzb2NpYXRlZCAqLworCWNkZl9tZW1fc2V0KCh2b2lkICopJnBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMsCisJCSAgICBzaXplb2YodExpbVByb3RTdGFQYXJhbXMpLCAwKTsKKwljZGZfbWVtX3NldCgodm9pZCAqKSZwc2Vzc2lvbkVudHJ5LT5nTGltMTFhUGFyYW1zLAorCQkgICAgc2l6ZW9mKHRMaW1Qcm90U3RhUGFyYW1zKSwgMCk7CisJY2RmX21lbV9zZXQoKHZvaWQgKikmcHNlc3Npb25FbnRyeS0+Z0xpbTExZ1BhcmFtcywKKwkJICAgIHNpemVvZih0TGltUHJvdFN0YVBhcmFtcyksIDApOworCWNkZl9tZW1fc2V0KCh2b2lkICopJnBzZXNzaW9uRW50cnktPmdMaW1Ob25HZlBhcmFtcywKKwkJICAgIHNpemVvZih0TGltUHJvdFN0YVBhcmFtcyksIDApOworCWNkZl9tZW1fc2V0KCh2b2lkICopJnBzZXNzaW9uRW50cnktPmdMaW1IdDIwUGFyYW1zLAorCQkgICAgc2l6ZW9mKHRMaW1Qcm90U3RhUGFyYW1zKSwgMCk7CisJY2RmX21lbV9zZXQoKHZvaWQgKikmcHNlc3Npb25FbnRyeS0+Z0xpbUxzaWdUeG9wUGFyYW1zLAorCQkgICAgc2l6ZW9mKHRMaW1Qcm90U3RhUGFyYW1zKSwgMCk7CisJY2RmX21lbV9zZXQoKHZvaWQgKikmcHNlc3Npb25FbnRyeS0+Z0xpbU9sYmNQYXJhbXMsCisJCSAgICBzaXplb2YodExpbVByb3RTdGFQYXJhbXMpLCAwKTsKK30KKworLyoKKyAqIHBlX3Jlc2V0X3Byb3RlY3Rpb25fY2FsbGJhY2soKSAtIHJlc2V0cyBwcm90ZWN0aW9uIHN0cnVjdHMgc28gdGhhdCB3aGVuIGFuIEFQCisgKiBjYXVzaW5nIHVzZSBvZiBwcm90ZWN0aW9uIGdvZXMgYXdheSwgY29ycmVzcG9uZGluZyBwcm90ZWN0aW9uIGJpdCBjYW4gYmUKKyAqIHJlc2V0CisgKiBAcHRyOiAgICAgICAgcG9pbnRlciB0byBwU2Vzc2lvbkVudHJ5CisgKgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgcHJvdGVjdGlvbiBzdHJ1Y3RzIHNvIHRoYXQgd2hlbiBhbiBBUCBjYXVzaW5nIHVzZSBvZgorICogcHJvdGVjdGlvbiBnb2VzIGF3YXksIGNvcnJlc3BvbmRpbmcgcHJvdGVjdGlvbiBiaXQgY2FuIGJlIHJlc2V0LiBUaGlzIGFsbG93ZXMKKyAqIHByb3RlY3Rpb24gYml0cyB0byBiZSByZXNldCBvbmNlIGxlZ2FjeSBvdmVybGFwcGluZyBBUHMgYXJlIGdvbmUuCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgcGVfcmVzZXRfcHJvdGVjdGlvbl9jYWxsYmFjayh2b2lkICpwdHIpCit7CisJdHBQRVNlc3Npb24gcGVfc2Vzc2lvbl9lbnRyeSA9ICh0cFBFU2Vzc2lvbilwdHI7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9ICh0cEFuaVNpckdsb2JhbClwZV9zZXNzaW9uX2VudHJ5LT5tYWNfY3R4OworCWludDhfdCBpID0gMDsKKwl0VXBkYXRlQmVhY29uUGFyYW1zIGJlYWNvbl9wYXJhbXM7CisJdWludDE2X3QgY3VycmVudF9wcm90ZWN0aW9uX3N0YXRlID0gMDsKKwl0cERwaEhhc2hOb2RlIHN0YXRpb25faGFzaF9ub2RlID0gTlVMTDsKKwl0U2lyTWFjSFRPcGVyYXRpbmdNb2RlIG9sZF9vcF9tb2RlOworCWJvb2wgYmNuX3BybXNfY2hhbmdlZCA9IGZhbHNlOworCisJaWYgKHBlX3Nlc3Npb25fZW50cnktPnZhbGlkID09IGZhbHNlKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJzZXNzaW9uIGFscmVhZHkgZGVsZXRlZC4gZXhpdGluZyB0aW1lciBjYWxsYmFjayIpKTsKKwkJcmV0dXJuOworCX0KKworCWN1cnJlbnRfcHJvdGVjdGlvbl9zdGF0ZSB8PQorCSAgICAgICBwZV9zZXNzaW9uX2VudHJ5LT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCAgICAgICAgfAorCSAgICAgICBwZV9zZXNzaW9uX2VudHJ5LT5nTGltT3ZlcmxhcDExYVBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCAgIDw8IDEgfAorCSAgICAgICBwZV9zZXNzaW9uX2VudHJ5LT5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgIDw8IDIgfAorCSAgICAgICBwZV9zZXNzaW9uX2VudHJ5LT5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIDw8IDMgfAorCSAgICAgICBwZV9zZXNzaW9uX2VudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCAgICAgICAgIDw8IDQ7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwKKwkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICBGTCgib2xkIHByb3RlY3Rpb24gc3RhdGU6IDB4JTA0WCwgbmV3IHByb3RlY3Rpb24gc3RhdGU6IDB4JTA0WFxuIiksCisJCSAgcGVfc2Vzc2lvbl9lbnRyeS0+b2xkX3Byb3RlY3Rpb25fc3RhdGUsCisJCSAgY3VycmVudF9wcm90ZWN0aW9uX3N0YXRlKTsKKworCWNkZl9tZW1femVybygmcGVfc2Vzc2lvbl9lbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMsCisJCSAgICAgc2l6ZW9mKHBlX3Nlc3Npb25fZW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zKSk7CisJY2RmX21lbV96ZXJvKCZwZV9zZXNzaW9uX2VudHJ5LT5nTGltT3ZlcmxhcDExYVBhcmFtcywKKwkJICAgICBzaXplb2YocGVfc2Vzc2lvbl9lbnRyeS0+Z0xpbU92ZXJsYXAxMWFQYXJhbXMpKTsKKwljZGZfbWVtX3plcm8oJnBlX3Nlc3Npb25fZW50cnktPmdMaW1PdmVybGFwSHQyMFBhcmFtcywKKwkJICAgICBzaXplb2YocGVfc2Vzc2lvbl9lbnRyeS0+Z0xpbU92ZXJsYXBIdDIwUGFyYW1zKSk7CisJY2RmX21lbV96ZXJvKCZwZV9zZXNzaW9uX2VudHJ5LT5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLAorCQkgICAgIHNpemVvZihwZV9zZXNzaW9uX2VudHJ5LT5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zKSk7CisKKwljZGZfbWVtX3plcm8oJnBlX3Nlc3Npb25fZW50cnktPmdMaW1PbGJjUGFyYW1zLAorCQkgICAgIHNpemVvZihwZV9zZXNzaW9uX2VudHJ5LT5nTGltT2xiY1BhcmFtcykpOworCisJY2RmX21lbV96ZXJvKCZwZV9zZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMsCisJCSAgICAgc2l6ZW9mKHBlX3Nlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcykpOworCisJY2RmX21lbV96ZXJvKCZtYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXAxMWdQYXJhbXMsCisJCSAgICAgc2l6ZW9mKG1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcDExZ1BhcmFtcykpOworCWNkZl9tZW1femVybygmbWFjX2N0eC0+bGltLmdMaW1PdmVybGFwMTFhUGFyYW1zLAorCQkgICAgIHNpemVvZihtYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXAxMWFQYXJhbXMpKTsKKwljZGZfbWVtX3plcm8oJm1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMsCisJCSAgICAgc2l6ZW9mKG1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMpKTsKKwljZGZfbWVtX3plcm8oJm1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLAorCQkgICAgIHNpemVvZihtYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXBOb25HZlBhcmFtcykpOworCisJb2xkX29wX21vZGUgPSBwZV9zZXNzaW9uX2VudHJ5LT5odE9wZXJNb2RlOworCXBlX3Nlc3Npb25fZW50cnktPmh0T3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfUFVSRTsKKworCWNkZl9tZW1femVybygmYmVhY29uX3BhcmFtcywgc2l6ZW9mKHRVcGRhdGVCZWFjb25QYXJhbXMpKTsKKwkvKiBpbmRleCAwLCBpcyBzZWxmIG5vZGUsIHBlZXJzIHN0YXJ0IGZyb20gMSAqLworCWZvciAoaSA9IDEgOyBpIDw9IG1hY19jdHgtPmxpbS5nTGltQXNzb2NTdGFMaW1pdCA7IGkrKykKKwl7CisJCXN0YXRpb25faGFzaF9ub2RlID0gZHBoX2dldF9oYXNoX2VudHJ5KG1hY19jdHgsIGksCisJCQkJCSZwZV9zZXNzaW9uX2VudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJaWYgKE5VTEwgPT0gc3RhdGlvbl9oYXNoX25vZGUpCisJCQljb250aW51ZTsKKwkJbGltX2RlY2lkZV9hcF9wcm90ZWN0aW9uKG1hY19jdHgsIHN0YXRpb25faGFzaF9ub2RlLT5zdGFBZGRyLAorCQkmYmVhY29uX3BhcmFtcywgcGVfc2Vzc2lvbl9lbnRyeSk7CisJfQorCisJaWYgKHBlX3Nlc3Npb25fZW50cnktPmh0T3Blck1vZGUgIT0gb2xkX29wX21vZGUpCisJCWJjbl9wcm1zX2NoYW5nZWQgPSB0cnVlOworCisJaWYgKChjdXJyZW50X3Byb3RlY3Rpb25fc3RhdGUgIT0KKwkJcGVfc2Vzc2lvbl9lbnRyeS0+b2xkX3Byb3RlY3Rpb25fc3RhdGUpICYmCisJCShmYWxzZSA9PSBtYWNfY3R4LT5zYXAuU2FwRGZzSW5mby5pc19kZnNfY2FjX3RpbWVyX3J1bm5pbmcpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJwcm90ZWN0aW9uIGNoYW5nZWQsIHVwZGF0ZSBiZWFjb24gdGVtcGxhdGVcbiIpKTsKKwkJLyogdXBkYXRlIGJlYWNvbiBmaXggcGFyYW1zIGFuZCBzZW5kIHVwZGF0ZSB0byBGVyAqLworCQljZGZfbWVtX3plcm8oJmJlYWNvbl9wYXJhbXMsIHNpemVvZih0VXBkYXRlQmVhY29uUGFyYW1zKSk7CisJCWJlYWNvbl9wYXJhbXMuYnNzSWR4ID0gcGVfc2Vzc2lvbl9lbnRyeS0+YnNzSWR4OworCQliZWFjb25fcGFyYW1zLmZTaG9ydFByZWFtYmxlID0KKwkJCQlwZV9zZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGU7CisJCWJlYWNvbl9wYXJhbXMuYmVhY29uSW50ZXJ2YWwgPQorCQkJCXBlX3Nlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbDsKKwkJYmVhY29uX3BhcmFtcy5sbGFDb2V4aXN0ID0KKwkJCQlwZV9zZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMubGxhQ29leGlzdDsKKwkJYmVhY29uX3BhcmFtcy5sbGJDb2V4aXN0ID0KKwkJCQlwZV9zZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMubGxiQ29leGlzdDsKKwkJYmVhY29uX3BhcmFtcy5sbGdDb2V4aXN0ID0KKwkJCQlwZV9zZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMubGxnQ29leGlzdDsKKwkJYmVhY29uX3BhcmFtcy5odDIwTWh6Q29leGlzdCA9CisJCQkJcGVfc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmh0MjBDb2V4aXN0OworCQliZWFjb25fcGFyYW1zLmxsbk5vbkdGQ29leGlzdCA9CisJCQkJcGVfc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmxsbk5vbkdGQ29leGlzdDsKKwkJYmVhY29uX3BhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPQorCQkJCXBlX3Nlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy4KKwkJCQkJZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OworCQliZWFjb25fcGFyYW1zLmZSSUZTTW9kZSA9CisJCQkJcGVfc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmZSSUZTTW9kZTsKKwkJYmVhY29uX3BhcmFtcy5zbWVTZXNzaW9uSWQgPQorCQkJCXBlX3Nlc3Npb25fZW50cnktPnNtZVNlc3Npb25JZDsKKwkJYmNuX3BybXNfY2hhbmdlZCA9IHRydWU7CisJfQorCisJaWYgKGJjbl9wcm1zX2NoYW5nZWQpIHsKKwkJc2NoX3NldF9maXhlZF9iZWFjb25fZmllbGRzKG1hY19jdHgsIHBlX3Nlc3Npb25fZW50cnkpOworCQlsaW1fc2VuZF9iZWFjb25fcGFyYW1zKG1hY19jdHgsICZiZWFjb25fcGFyYW1zLCBwZV9zZXNzaW9uX2VudHJ5KTsKKwl9CisKKwlwZV9zZXNzaW9uX2VudHJ5LT5vbGRfcHJvdGVjdGlvbl9zdGF0ZSA9IGN1cnJlbnRfcHJvdGVjdGlvbl9zdGF0ZTsKKwlpZiAoY2RmX21jX3RpbWVyX3N0YXJ0KCZwZV9zZXNzaW9uX2VudHJ5LT4KKwkJCQlwcm90ZWN0aW9uX2ZpZWxkc19yZXNldF90aW1lciwKKwkJCQlTQ0hfUFJPVEVDVElPTl9SRVNFVF9USU1FKQorCQkhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsCisJCQlDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiY2Fubm90IGNyZWF0ZSBvciBzdGFydCBwcm90ZWN0aW9uRmllbGRzUmVzZXRUaW1lclxuIikpOworCX0KK30KKworLyoqCisgKiBwZV9jcmVhdGVfc2Vzc2lvbigpIGNyZWF0ZXMgYSBuZXcgUEUgc2Vzc2lvbiBnaXZlbiB0aGUgQlNTSUQKKyAqIEBwYXJhbSBwTWFjOiAgICAgICAgcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgKiBAcGFyYW0gYnNzaWQ6ICAgICAgIEJTU0lEIG9mIHRoZSBuZXcgc2Vzc2lvbgorICogQHBhcmFtIHNlc3Npb25JZDogICBzZXNzaW9uIElEIGlzIHJldHVybmVkIGhlcmUsIGlmIHNlc3Npb24gaXMgY3JlYXRlZC4KKyAqIEBwYXJhbSBic3NUeXBlOiAgICAgc3RhdGlvbiBvciBhCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgYW5kIHRoZSBzZXNzaW9uIElEIGlmIHRoZSBzZXNzaW9uCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXNzZWQgQlNTSUQgaXMgZm91bmQgaW4gdGhlIFBFIHNlc3Npb24gdGFibGUuCisgKgorICogUmV0dXJuOiB0cFBFU2Vzc2lvbjogICBwb2ludGVyIHRvIHRoZSBzZXNzaW9uIGNvbnRleHQgb3IgTlVMTCBpZiBzZXNzaW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBub3QgYmUgY3JlYXRlZC4KKyAqLworCit0cFBFU2Vzc2lvbgorcGVfY3JlYXRlX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqYnNzaWQsIHVpbnQ4X3QgKnNlc3Npb25JZCwKKwkJICB1aW50MTZfdCBudW1TdGEsIHRTaXJCc3NUeXBlIGJzc1R5cGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCBpOworCXRwUEVTZXNzaW9uIHNlc3Npb25fcHRyOworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQkvKiBGaW5kIGZpcnN0IGZyZWUgcm9vbSBpbiBzZXNzaW9uIHRhYmxlICovCisJCWlmIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkID09IHRydWUpCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcE1hYy0+bGltLm1heEJzc0lkKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJTZXNzaW9uIGNhbid0IGJlIGNyZWF0ZWQuIFJlYWNoZWQgbWF4IHNlc3Npb25zXG4iKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNlc3Npb25fcHRyID0gJnBNYWMtPmxpbS5ncFNlc3Npb25baV07CisJY2RmX21lbV9zZXQoKHZvaWQgKilzZXNzaW9uX3B0ciwgc2l6ZW9mKHRQRVNlc3Npb24pLCAwKTsKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgU3RhdGlvbiBUYWJsZSBmb3IgdGhpcyBzZXNzaW9uLiAqLworCXNlc3Npb25fcHRyLT5kcGguZHBoSGFzaFRhYmxlLnBIYXNoVGFibGUgPQorCQljZGZfbWVtX21hbGxvYyhzaXplb2YodHBEcGhIYXNoTm9kZSkgKiAobnVtU3RhICsgMSkpOworCWlmIChOVUxMID09IHNlc3Npb25fcHRyLT5kcGguZHBoSGFzaFRhYmxlLnBIYXNoVGFibGUpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgibWVtb3J5IGFsbG9jYXRlIGZhaWxlZCEiKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNlc3Npb25fcHRyLT5kcGguZHBoSGFzaFRhYmxlLnBEcGhOb2RlQXJyYXkgPQorCQljZGZfbWVtX21hbGxvYyhzaXplb2YodERwaEhhc2hOb2RlKSAqIChudW1TdGEgKyAxKSk7CisJaWYgKE5VTEwgPT0gc2Vzc2lvbl9wdHItPmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkISIpKTsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb25fcHRyLT5kcGguZHBoSGFzaFRhYmxlLnBIYXNoVGFibGUpOworCQlzZXNzaW9uX3B0ci0+ZHBoLmRwaEhhc2hUYWJsZS4KKwkJcEhhc2hUYWJsZSA9IE5VTEw7CisJCXJldHVybiBOVUxMOworCX0KKworCXNlc3Npb25fcHRyLT5kcGguZHBoSGFzaFRhYmxlLnNpemUgPSBudW1TdGEgKyAxOworCWRwaF9oYXNoX3RhYmxlX2NsYXNzX2luaXQocE1hYywgJnNlc3Npb25fcHRyLT5kcGguZHBoSGFzaFRhYmxlKTsKKwlzZXNzaW9uX3B0ci0+Z3BMaW1QZWVySWR4cG9vbCA9IGNkZl9tZW1fbWFsbG9jKAorCQlzaXplb2YoKihzZXNzaW9uX3B0ci0+Z3BMaW1QZWVySWR4cG9vbCkpICogKG51bVN0YSArIDEpKTsKKwlpZiAoTlVMTCA9PSBzZXNzaW9uX3B0ci0+Z3BMaW1QZWVySWR4cG9vbCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkISIpKTsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb25fcHRyLT5kcGguZHBoSGFzaFRhYmxlLnBIYXNoVGFibGUpOworCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9wdHItPmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheSk7CisJCXNlc3Npb25fcHRyLT5kcGguZHBoSGFzaFRhYmxlLnBIYXNoVGFibGUgPSBOVUxMOworCQlzZXNzaW9uX3B0ci0+ZHBoLmRwaEhhc2hUYWJsZS5wRHBoTm9kZUFycmF5ID0gTlVMTDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNkZl9tZW1fc2V0KHNlc3Npb25fcHRyLT5ncExpbVBlZXJJZHhwb29sLAorCQkgICAgc2l6ZW9mKCpzZXNzaW9uX3B0ci0+Z3BMaW1QZWVySWR4cG9vbCkgKiAobnVtU3RhICsgMSksCisJCSAgICAwKTsKKwlzZXNzaW9uX3B0ci0+ZnJlZVBlZXJJZHhIZWFkID0gMDsKKwlzZXNzaW9uX3B0ci0+ZnJlZVBlZXJJZHhUYWlsID0gMDsKKwlzZXNzaW9uX3B0ci0+Z0xpbU51bU9mQ3VycmVudFNUQXMgPSAwOworCS8qIENvcHkgdGhlIEJTU0lEIHRvIHRoZSBzZXNzaW9uIHRhYmxlICovCisJc2lyX2NvcHlfbWFjX2FkZHIoc2Vzc2lvbl9wdHItPmJzc0lkLCBic3NpZCk7CisJc2Vzc2lvbl9wdHItPnZhbGlkID0gdHJ1ZTsKKwkvKiBJbnRpYWxpemUgdGhlIFNNRSBhbmQgTUxNIHN0YXRlcyB0byBJRExFICovCisJc2Vzc2lvbl9wdHItPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKwlzZXNzaW9uX3B0ci0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9JRExFX1NUQVRFOworCXNlc3Npb25fcHRyLT5saW1DdXJyZW50QXV0aFR5cGUgPSBlU0lSX09QRU5fU1lTVEVNOworCXBlX2luaXRfYmVhY29uX3BhcmFtcyhwTWFjLCAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlzZXNzaW9uX3B0ci0+aXMxMVJjb25uZWN0aW9uID0gZmFsc2U7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJc2Vzc2lvbl9wdHItPmlzRVNFY29ubmVjdGlvbiA9IGZhbHNlOworI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiB8fCBkZWZpbmVkIEZFQVRVUkVfV0xBTl9FU0UgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCXNlc3Npb25fcHRyLT5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZCA9IGZhbHNlOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCXNlc3Npb25fcHRyLT5pc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQgPSBmYWxzZTsKKyNlbmRpZgorCSpzZXNzaW9uSWQgPSBpOworCXNlc3Npb25fcHRyLT5nTGltUGh5TW9kZSA9IFdOSV9DRkdfUEhZX01PREVfMTFHOworCS8qIEluaXRpYWxpemUgQ0IgbW9kZSB2YXJpYWJsZXMgd2hlbiBzZXNzaW9uIGlzIGNyZWF0ZWQgKi8KKwlzZXNzaW9uX3B0ci0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPSAwOworCXNlc3Npb25fcHRyLT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCA9IDA7CisJc2Vzc2lvbl9wdHItPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IDA7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwljZGZfbWVtX3NldChzZXNzaW9uX3B0ci0+cGVlckFJREJpdG1hcCwKKwkJICAgIHNpemVvZihzZXNzaW9uX3B0ci0+cGVlckFJREJpdG1hcCksIDApOworCXNlc3Npb25fcHRyLT50ZGxzX3Byb2hpYml0ZWQgPSBmYWxzZTsKKwlzZXNzaW9uX3B0ci0+dGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZCA9IGZhbHNlOworI2VuZGlmCisJc2Vzc2lvbl9wdHItPmZXYWl0Rm9yUHJvYmVSc3AgPSAwOworCXNlc3Npb25fcHRyLT5mSWdub3JlQ2Fwc0NoYW5nZSA9IDA7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQlGTCgiQ3JlYXRlIGEgbmV3IFBFIHNlc3Npb24oJWQpLCBCU1NJRDogIk1BQ19BRERSRVNTX1NUUiIgTWF4IE5vLiBvZiBTVEEgJWQiKSwKKwkJc2Vzc2lvbl9wdHItPnBlU2Vzc2lvbklkLCBNQUNfQUREUl9BUlJBWShic3NpZCksIG51bVN0YSk7CisKKwlpZiAoZVNJUl9JTkZSQV9BUF9NT0RFID09IGJzc1R5cGUKKwkgICAgfHwgZVNJUl9JQlNTX01PREUgPT0gYnNzVHlwZQorCSAgICB8fCBlU0lSX0JUQU1QX0FQX01PREUgPT0gYnNzVHlwZSkgeworCQlzZXNzaW9uX3B0ci0+cFNjaFByb2JlUnNwVGVtcGxhdGUgPQorCQkJY2RmX21lbV9tYWxsb2MoU0NIX01BWF9QUk9CRV9SRVNQX1NJWkUpOworCQlzZXNzaW9uX3B0ci0+cFNjaEJlYWNvbkZyYW1lQmVnaW4gPQorCQkJY2RmX21lbV9tYWxsb2MoU0NIX01BWF9CRUFDT05fU0laRSk7CisJCXNlc3Npb25fcHRyLT5wU2NoQmVhY29uRnJhbWVFbmQgPQorCQkJY2RmX21lbV9tYWxsb2MoU0NIX01BWF9CRUFDT05fU0laRSk7CisJCWlmICgoTlVMTCA9PSBzZXNzaW9uX3B0ci0+cFNjaFByb2JlUnNwVGVtcGxhdGUpCisJCSAgICB8fCAoTlVMTCA9PSBzZXNzaW9uX3B0ci0+cFNjaEJlYWNvbkZyYW1lQmVnaW4pCisJCSAgICB8fCAoTlVMTCA9PSBzZXNzaW9uX3B0ci0+cFNjaEJlYWNvbkZyYW1lRW5kKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgibWVtb3J5IGFsbG9jYXRlIGZhaWxlZCEiKSk7CisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9wdHItPmRwaC5kcGhIYXNoVGFibGUucEhhc2hUYWJsZSk7CisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9wdHItPmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheSk7CisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9wdHItPmdwTGltUGVlcklkeHBvb2wpOworCQkJY2RmX21lbV9mcmVlKHNlc3Npb25fcHRyLT5wU2NoUHJvYmVSc3BUZW1wbGF0ZSk7CisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbl9wdHItPnBTY2hCZWFjb25GcmFtZUJlZ2luKTsKKwkJCWNkZl9tZW1fZnJlZShzZXNzaW9uX3B0ci0+cFNjaEJlYWNvbkZyYW1lRW5kKTsKKworCQkJc2Vzc2lvbl9wdHItPmRwaC5kcGhIYXNoVGFibGUucEhhc2hUYWJsZSA9IE5VTEw7CisJCQlzZXNzaW9uX3B0ci0+ZHBoLmRwaEhhc2hUYWJsZS5wRHBoTm9kZUFycmF5ID0gTlVMTDsKKwkJCXNlc3Npb25fcHRyLT5ncExpbVBlZXJJZHhwb29sID0gTlVMTDsKKwkJCXNlc3Npb25fcHRyLT5wU2NoUHJvYmVSc3BUZW1wbGF0ZSA9IE5VTEw7CisJCQlzZXNzaW9uX3B0ci0+cFNjaEJlYWNvbkZyYW1lQmVnaW4gPSBOVUxMOworCQkJc2Vzc2lvbl9wdHItPnBTY2hCZWFjb25GcmFtZUVuZCA9IE5VTEw7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJaWYgKGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERSA9PSBic3NUeXBlKQorCQlsaW1fZnRfb3BlbihwTWFjLCAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXSk7CisjZW5kaWYKKwlpZiAoZVNJUl9JTkZSQV9BUF9NT0RFID09IGJzc1R5cGUpIHsKKwkJc2Vzc2lvbl9wdHItPm9sZF9wcm90ZWN0aW9uX3N0YXRlID0gMDsKKwkJc2Vzc2lvbl9wdHItPm1hY19jdHggPSAodm9pZCAqKXBNYWM7CisJCXN0YXR1cyA9IGNkZl9tY190aW1lcl9pbml0KAorCQkJJnNlc3Npb25fcHRyLT5wcm90ZWN0aW9uX2ZpZWxkc19yZXNldF90aW1lciwKKwkJCUNERl9USU1FUl9UWVBFX1NXLCBwZV9yZXNldF9wcm90ZWN0aW9uX2NhbGxiYWNrLAorCQkJKHZvaWQgKikmcE1hYy0+bGltLmdwU2Vzc2lvbltpXSk7CisJCWlmIChzdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlzdGF0dXMgPSBjZGZfbWNfdGltZXJfc3RhcnQoCisJCQkJJnNlc3Npb25fcHRyLT5wcm90ZWN0aW9uX2ZpZWxkc19yZXNldF90aW1lciwKKwkJCQlTQ0hfUFJPVEVDVElPTl9SRVNFVF9USU1FKTsKKwkJfQorCQlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1BFLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoImNhbm5vdCBjcmVhdGUgb3Igc3RhcnQgcHJvdGVjdGlvbkZpZWxkc1Jlc2V0VGltZXJcbiIpKTsKKwl9CisJcmV0dXJuICZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKCkgLSBsb29rcyB1cCB0aGUgUEUgc2Vzc2lvbiBnaXZlbiB0aGUgQlNTSUQuCisKKyAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2Vzc2lvbiBjb250ZXh0IGFuZCB0aGUgc2Vzc2lvbiBJRCBpZiB0aGUgc2Vzc2lvbgorICAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gQlNTSUQgaXMgZm91bmQgaW4gdGhlIFBFIHNlc3Npb24gdGFibGUuCisKKyAgIFxwYXJhbSBwTWFjICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgICBccGFyYW0gYnNzaWQgICAgICAgICAgICAgICAgICAgLSBCU1NJRCBvZiB0aGUgc2Vzc2lvbgorICAgXHBhcmFtIHNlc3Npb25JZCAgICAgICAgICAgICAtc2Vzc2lvbiBJRCBpcyByZXR1cm5lZCBoZXJlLCBpZiBzZXNzaW9uIGlzIGZvdW5kLgorCisgICBccmV0dXJuIHRwUEVTZXNzaW9uICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgc2Vzc2lvbiBjb250ZXh0IG9yIE5VTEwgaWYgc2Vzc2lvbiBpcyBub3QgZm91bmQuCisKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHBQRVNlc3Npb24gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKmJzc2lkLAorCQkJCSAgICAgdWludDhfdCAqc2Vzc2lvbklkKQoreworCXVpbnQ4X3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQkvKiBJZiBCU1NJRCBtYXRjaGVzIHJldHVybiBjb3JyZXNwb25kaW5nIHRhYmxlcyBhZGRyZXNzICovCisJCWlmICgocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCkKKwkJICAgICYmIChzaXJfY29tcGFyZV9tYWNfYWRkcihwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmJzc0lkLCBic3NpZCkpKQorCQl7CisJCQkqc2Vzc2lvbklkID0gaTsKKwkJCXJldHVybiAoJnBNYWMtPmxpbS5ncFNlc3Npb25baV0pOworCQl9CisJfQorCisJbGltX2xvZyhwTWFjLCBMT0c0LCBGTCgiU2Vzc2lvbiBsb29rdXAgZmFpbHMgZm9yIEJTU0lEOiBcbiAiKSk7CisJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIGJzc2lkLCBMT0c0KTsKKwlyZXR1cm4gKE5VTEwpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBwZV9maW5kX3Nlc3Npb25fYnlfYnNzX2lkeCgpIC0gbG9va3MgdXAgdGhlIFBFIHNlc3Npb24gZ2l2ZW4gdGhlIGJzc0lkeC4KKworICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgIGlmIHRoZSBzZXNzaW9uCisgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBic3NJZHggaXMgZm91bmQgaW4gdGhlIFBFIHNlc3Npb24gdGFibGUuCisgICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICAgXHBhcmFtIGJzc0lkeCAgICAgICAgICAgICAgICAgICAtIGJzcyBpbmRleCBvZiB0aGUgc2Vzc2lvbgorICAgXHJldHVybiB0cFBFU2Vzc2lvbiAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gY29udGV4dCBvciBOVUxMIGlmIHNlc3Npb24gaXMgbm90IGZvdW5kLgorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0cFBFU2Vzc2lvbiBwZV9maW5kX3Nlc3Npb25fYnlfYnNzX2lkeCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGJzc0lkeCkKK3sKKwl1aW50OF90IGk7CisJZm9yIChpID0gMDsgaSA8IHBNYWMtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCS8qIElmIEJTU0lEIG1hdGNoZXMgcmV0dXJuIGNvcnJlc3BvbmRpbmcgdGFibGVzIGFkZHJlc3MgKi8KKwkJaWYgKChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkKQorCQkgICAgJiYgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0uYnNzSWR4ID09IGJzc0lkeCkpIHsKKwkJCXJldHVybiAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXTsKKwkJfQorCX0KKwlsaW1fbG9nKHBNYWMsIExPRzQsIEZMKCJTZXNzaW9uIGxvb2t1cCBmYWlscyBmb3IgYnNzSWR4OiAlZCIpLCBic3NJZHgpOworCXJldHVybiBOVUxMOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQoKSAtIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGdpdmVuIHRoZSBzZXNzaW9uIElELgorCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNlc3Npb24gY29udGV4dCAgaWYgdGhlIHNlc3Npb24KKyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHNlc3Npb24gSUQgaXMgZm91bmQgaW4gdGhlIFBFIHNlc3Npb24gdGFibGUuCisKKyAgIFxwYXJhbSBwTWFjICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC1zZXNzaW9uIElEIGZvciB3aGljaCBzZXNzaW9uIGNvbnRleHQgbmVlZHMgdG8gYmUgbG9va2VkIHVwLgorCisgICBccmV0dXJuIHRwUEVTZXNzaW9uICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgc2Vzc2lvbiBjb250ZXh0IG9yIE5VTEwgaWYgc2Vzc2lvbiBpcyBub3QgZm91bmQuCisKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHBQRVNlc3Npb24gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisJaWYgKHNlc3Npb25JZCA+PSBwTWFjLT5saW0ubWF4QnNzSWQpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBzZXNzaW9uSWQ6ICVkIFxuICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlpZiAoKHBNYWMtPmxpbS5ncFNlc3Npb25bc2Vzc2lvbklkXS52YWxpZCA9PSB0cnVlKSkgeworCQlyZXR1cm4gKCZwTWFjLT5saW0uZ3BTZXNzaW9uW3Nlc3Npb25JZF0pOworCX0KKwlyZXR1cm4gKE5VTEwpOworCit9CisKKy8qKgorICogcGVfZmluZF9zZXNzaW9uX2J5X3N0YV9pZCgpIC0gbG9va3MgdXAgdGhlIFBFIHNlc3Npb24gZ2l2ZW4gc3RhaWQuCisgKiBAbWFjX2N0eDogICAgICAgcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgKiBAc3RhaWQ6ICAgICAgICAgU3RhSWQgb2YgdGhlIHNlc3Npb24KKyAqIEBzZXNzaW9uX2lkOiAgICBzZXNzaW9uIElEIGlzIHJldHVybmVkIGhlcmUsIGlmIHNlc3Npb24gaXMgZm91bmQuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgYW5kIHRoZSBzZXNzaW9uIElEIGlmIHRoZSBzZXNzaW9uCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBTdGFJZCBpcyBmb3VuZCBpbiB0aGUgUEUgc2Vzc2lvbiB0YWJsZS4KKyAqCisgKiBSZXR1cm46IHNlc3Npb24gcG9pbnRlcgorICovCit0cFBFU2Vzc2lvbgorcGVfZmluZF9zZXNzaW9uX2J5X3N0YV9pZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJICB1aW50OF90IHN0YWlkLAorCQkJICB1aW50OF90ICpzZXNzaW9uX2lkKQoreworCXVpbnQ4X3QgaSwgajsKKwl0cFBFU2Vzc2lvbiBzZXNzaW9uX3B0cjsKKwlkcGhIYXNoVGFibGVDbGFzcyAqZHBoX3B0cjsKKworCWZvciAoaSA9IDA7IGkgPCBtYWNfY3R4LT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQlpZiAoIW1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0udmFsaWQpCisJCQljb250aW51ZTsKKwkJc2Vzc2lvbl9wdHIgPSAmbWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXTsKKwkJZHBoX3B0ciA9ICZzZXNzaW9uX3B0ci0+ZHBoLmRwaEhhc2hUYWJsZTsKKwkJZm9yIChqID0gMDsgaiA8IGRwaF9wdHItPnNpemU7IGorKykgeworCQkJaWYgKGRwaF9wdHItPnBEcGhOb2RlQXJyYXlbal0udmFsaWQKKwkJCSAgICAmJiBkcGhfcHRyLT5wRHBoTm9kZUFycmF5W2pdLmFkZGVkCisJCQkgICAgJiYgc3RhaWQgPT0gZHBoX3B0ci0+cERwaE5vZGVBcnJheVtqXS5zdGFJbmRleCkgeworCQkJCSpzZXNzaW9uX2lkID0gaTsKKwkJCQlyZXR1cm4gc2Vzc2lvbl9wdHI7CisJCQl9CisJCX0KKwl9CisKKwlsaW1fbG9nKG1hY19jdHgsIExPRzQsCisJCUZMKCJTZXNzaW9uIGxvb2t1cCBmYWlscyBmb3IgU3RhSWQ6ICVkXG4gIiksIHN0YWlkKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBwZV9kZWxldGVfc2Vzc2lvbigpIC0gZGVsZXRlcyB0aGUgUEUgc2Vzc2lvbiBnaXZlbiB0aGUgc2Vzc2lvbiBJRC4KKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIGdsb2JhbCBhZGFwdGVyIGNvbnRleHQKKyAqIEBzZXNzaW9uOiBzZXNzaW9uIHRvIGJlIGRlbGV0ZWQuCisgKgorICogRGVsZXRlcyB0aGUgZ2l2ZW4gUEUgc2Vzc2lvbgorICoKKyAqIFJldHVybjogdm9pZAorICovCit2b2lkIHBlX2RlbGV0ZV9zZXNzaW9uKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwUEVTZXNzaW9uIHNlc3Npb24pCit7CisJdWludDE2X3QgaSA9IDA7CisJdWludDE2X3QgbjsKKwlUWF9USU1FUiAqdGltZXJfcHRyOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJRkwoIlRyeWluZyB0byBkZWxldGUgUEUgc2Vzc2lvbiAlZCBPcG1vZGUgJWQgQnNzSWR4ICVkIEJTU0lEOiAiTUFDX0FERFJFU1NfU1RSKSwKKwkJc2Vzc2lvbi0+cGVTZXNzaW9uSWQsIHNlc3Npb24tPm9wZXJNb2RlLAorCQlzZXNzaW9uLT5ic3NJZHgsCisJCU1BQ19BRERSX0FSUkFZKHNlc3Npb24tPmJzc0lkKSk7CisJZm9yIChuID0gMDsgbiA8IChtYWNfY3R4LT5saW0ubWF4U3RhdGlvbiArIDEpOyBuKyspIHsKKwkJdGltZXJfcHRyID0gJm1hY19jdHgtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXJbbl07CisJCWlmIChzZXNzaW9uLT5wZVNlc3Npb25JZCA9PSB0aW1lcl9wdHItPnNlc3Npb25JZCkKKwkJCWlmICh0cnVlID09IHR4X3RpbWVyX3J1bm5pbmcodGltZXJfcHRyKSkKKwkJCQl0eF90aW1lcl9kZWFjdGl2YXRlKHRpbWVyX3B0cik7CisJfQorCisjaWYgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpCisJLyogRGVsZXRlIEZUIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KKwlsaW1fZnRfY2xlYW51cChtYWNfY3R4LCBzZXNzaW9uKTsKKyNlbmRpZgorCWlmIChzZXNzaW9uLT5wTGltU3RhcnRCc3NSZXEgIT0gTlVMTCkgeworCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+cExpbVN0YXJ0QnNzUmVxKTsKKwkJc2Vzc2lvbi0+cExpbVN0YXJ0QnNzUmVxID0gTlVMTDsKKwl9CisKKwlpZiAoc2Vzc2lvbi0+cExpbUpvaW5SZXEgIT0gTlVMTCkgeworCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+cExpbUpvaW5SZXEpOworCQlzZXNzaW9uLT5wTGltSm9pblJlcSA9IE5VTEw7CisJfQorCisJaWYgKHNlc3Npb24tPnBMaW1SZUFzc29jUmVxICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPnBMaW1SZUFzc29jUmVxKTsKKwkJc2Vzc2lvbi0+cExpbVJlQXNzb2NSZXEgPSBOVUxMOworCX0KKworCWlmIChzZXNzaW9uLT5wTGltTWxtSm9pblJlcSAhPSBOVUxMKSB7CisJCWNkZl9tZW1fZnJlZShzZXNzaW9uLT5wTGltTWxtSm9pblJlcSk7CisJCXNlc3Npb24tPnBMaW1NbG1Kb2luUmVxID0gTlVMTDsKKwl9CisKKwlpZiAoc2Vzc2lvbi0+ZHBoLmRwaEhhc2hUYWJsZS5wSGFzaFRhYmxlICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPmRwaC5kcGhIYXNoVGFibGUucEhhc2hUYWJsZSk7CisJCXNlc3Npb24tPmRwaC5kcGhIYXNoVGFibGUucEhhc2hUYWJsZSA9IE5VTEw7CisJfQorCisJaWYgKHNlc3Npb24tPmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheSAhPSBOVUxMKSB7CisJCWNkZl9tZW1fZnJlZShzZXNzaW9uLT5kcGguZHBoSGFzaFRhYmxlLnBEcGhOb2RlQXJyYXkpOworCQlzZXNzaW9uLT5kcGguZHBoSGFzaFRhYmxlLnBEcGhOb2RlQXJyYXkgPSBOVUxMOworCX0KKworCWlmIChzZXNzaW9uLT5ncExpbVBlZXJJZHhwb29sICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPmdwTGltUGVlcklkeHBvb2wpOworCQlzZXNzaW9uLT5ncExpbVBlZXJJZHhwb29sID0gTlVMTDsKKwl9CisKKwlpZiAoc2Vzc2lvbi0+YmVhY29uICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPmJlYWNvbik7CisJCXNlc3Npb24tPmJlYWNvbiA9IE5VTEw7CisJfQorCisJaWYgKHNlc3Npb24tPmFzc29jUmVxICE9IE5VTEwpIHsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPmFzc29jUmVxKTsKKwkJc2Vzc2lvbi0+YXNzb2NSZXEgPSBOVUxMOworCX0KKworCWlmIChzZXNzaW9uLT5hc3NvY1JzcCAhPSBOVUxMKSB7CisJCWNkZl9tZW1fZnJlZShzZXNzaW9uLT5hc3NvY1JzcCk7CisJCXNlc3Npb24tPmFzc29jUnNwID0gTlVMTDsKKwl9CisKKwlpZiAoc2Vzc2lvbi0+cGFyc2VkQXNzb2NSZXEgIT0gTlVMTCkgeworCQl0cFNpckFzc29jUmVxIHRtcF9wdHIgPSBOVUxMOworCQkvKiBDbGVhbnVwIHRoZSBpbmRpdmlkdWFsIGFsbG9jYXRpb24gZmlyc3QgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNlc3Npb24tPmRwaC5kcGhIYXNoVGFibGUuc2l6ZTsgaSsrKSB7CisJCQlpZiAoc2Vzc2lvbi0+cGFyc2VkQXNzb2NSZXFbaV0gPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCXRtcF9wdHIgPSAoKHRwU2lyQXNzb2NSZXEpCisJCQkJICAoc2Vzc2lvbi0+cGFyc2VkQXNzb2NSZXFbaV0pKTsKKwkJCWlmICh0bXBfcHRyLT5hc3NvY1JlcUZyYW1lKSB7CisJCQkJY2RmX21lbV9mcmVlKHRtcF9wdHItPmFzc29jUmVxRnJhbWUpOworCQkJCXRtcF9wdHItPmFzc29jUmVxRnJhbWUgPSBOVUxMOworCQkJCXRtcF9wdHItPmFzc29jUmVxRnJhbWVMZW5ndGggPSAwOworCQkJfQorCQkJY2RmX21lbV9mcmVlKHNlc3Npb24tPnBhcnNlZEFzc29jUmVxW2ldKTsKKwkJCXNlc3Npb24tPnBhcnNlZEFzc29jUmVxW2ldID0gTlVMTDsKKwkJfQorCQkvKiBDbGVhbnVwIHRoZSB3aG9sZSBibG9jayAqLworCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+cGFyc2VkQXNzb2NSZXEpOworCQlzZXNzaW9uLT5wYXJzZWRBc3NvY1JlcSA9IE5VTEw7CisJfQorCWlmIChOVUxMICE9IHNlc3Npb24tPmxpbUFzc29jUmVzcG9uc2VEYXRhKSB7CisJCWNkZl9tZW1fZnJlZShzZXNzaW9uLT5saW1Bc3NvY1Jlc3BvbnNlRGF0YSk7CisJCXNlc3Npb24tPmxpbUFzc29jUmVzcG9uc2VEYXRhID0gTlVMTDsKKwl9CisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJaWYgKE5VTEwgIT0gc2Vzc2lvbi0+cExpbU1sbVJlYXNzb2NSZXRyeVJlcSkgeworCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+cExpbU1sbVJlYXNzb2NSZXRyeVJlcSk7CisJCXNlc3Npb24tPnBMaW1NbG1SZWFzc29jUmV0cnlSZXEgPSBOVUxMOworCX0KKyNlbmRpZgorCWlmIChOVUxMICE9IHNlc3Npb24tPnBMaW1NbG1SZWFzc29jUmVxKSB7CisJCWNkZl9tZW1fZnJlZShzZXNzaW9uLT5wTGltTWxtUmVhc3NvY1JlcSk7CisJCXNlc3Npb24tPnBMaW1NbG1SZWFzc29jUmVxID0gTlVMTDsKKwl9CisKKwlpZiAoTlVMTCAhPSBzZXNzaW9uLT5wU2NoUHJvYmVSc3BUZW1wbGF0ZSkgeworCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+cFNjaFByb2JlUnNwVGVtcGxhdGUpOworCQlzZXNzaW9uLT5wU2NoUHJvYmVSc3BUZW1wbGF0ZSA9IE5VTEw7CisJfQorCisJaWYgKE5VTEwgIT0gc2Vzc2lvbi0+cFNjaEJlYWNvbkZyYW1lQmVnaW4pIHsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPnBTY2hCZWFjb25GcmFtZUJlZ2luKTsKKwkJc2Vzc2lvbi0+cFNjaEJlYWNvbkZyYW1lQmVnaW4gPSBOVUxMOworCX0KKworCWlmIChOVUxMICE9IHNlc3Npb24tPnBTY2hCZWFjb25GcmFtZUVuZCkgeworCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+cFNjaEJlYWNvbkZyYW1lRW5kKTsKKwkJc2Vzc2lvbi0+cFNjaEJlYWNvbkZyYW1lRW5kID0gTlVMTDsKKwl9CisKKwkvKiBNdXN0IGZyZWUgdGhlIGJ1ZmZlciBiZWZvcmUgcGVTZXNzaW9uIGludmFsaWQgKi8KKwlpZiAoTlVMTCAhPSBzZXNzaW9uLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BEYXRhX2J1ZmYpIHsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFfYnVmZik7CisJCXNlc3Npb24tPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFfYnVmZiA9IE5VTEw7CisJCXNlc3Npb24tPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFMZW4gPSAwOworCX0KKwlpZiAoTlVMTCAhPSBzZXNzaW9uLT5hZGRJZVBhcmFtcy5hc3NvY1Jlc3BEYXRhX2J1ZmYpIHsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFfYnVmZik7CisJCXNlc3Npb24tPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFfYnVmZiA9IE5VTEw7CisJCXNlc3Npb24tPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFMZW4gPSAwOworCX0KKwlpZiAoTlVMTCAhPSBzZXNzaW9uLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BCQ05EYXRhX2J1ZmYpIHsKKwkJY2RmX21lbV9mcmVlKHNlc3Npb24tPmFkZEllUGFyYW1zLnByb2JlUmVzcEJDTkRhdGFfYnVmZik7CisJCXNlc3Npb24tPmFkZEllUGFyYW1zLnByb2JlUmVzcEJDTkRhdGFfYnVmZiA9IE5VTEw7CisJCXNlc3Npb24tPmFkZEllUGFyYW1zLnByb2JlUmVzcEJDTkRhdGFMZW4gPSAwOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJLyogaWYgUE1GIGNvbm5lY3Rpb24gKi8KKwlpZiAoc2Vzc2lvbi0+bGltUm1mRW5hYmxlZCkKKwkJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnNlc3Npb24tPnBtZkNvbWViYWNrVGltZXIpOworI2VuZGlmCisKKwlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbikpIHsKKwkJY2RmX21jX3RpbWVyX3N0b3AoJnNlc3Npb24tPnByb3RlY3Rpb25fZmllbGRzX3Jlc2V0X3RpbWVyKTsKKwkJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnNlc3Npb24tPnByb3RlY3Rpb25fZmllbGRzX3Jlc2V0X3RpbWVyKTsKKwl9CisKKwlzZXNzaW9uLT52YWxpZCA9IGZhbHNlOworCisJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb24pKQorCQlsaW1fY2hlY2tfYW5kX3Jlc2V0X3Byb3RlY3Rpb25fcGFyYW1zKG1hY19jdHgpOworCisJcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgcGVfZmluZF9zZXNzaW9uX2J5X3BlZXJfc3RhKCkgLSBsb29rcyB1cCB0aGUgUEUgc2Vzc2lvbiBnaXZlbiB0aGUgU3RhdGlvbiBBZGRyZXNzLgorCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNlc3Npb24gY29udGV4dCBhbmQgdGhlIHNlc3Npb24gSUQgaWYgdGhlIHNlc3Npb24KKyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHN0YXRpb24gYWRkcmVzcyBpcyBmb3VuZCBpbiB0aGUgUEUgc2Vzc2lvbiB0YWJsZS4KKworICAgXHBhcmFtIHBNYWMgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIGdsb2JhbCBhZGFwdGVyIGNvbnRleHQKKyAgIFxwYXJhbSBzYSAgICAgICAgICAgICAgICAgICAgICAgLSBQZWVyIFNUQSBBZGRyZXNzIG9mIHRoZSBzZXNzaW9uCisgICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC1zZXNzaW9uIElEIGlzIHJldHVybmVkIGhlcmUsIGlmIHNlc3Npb24gaXMgZm91bmQuCisKKyAgIFxyZXR1cm4gdHBQRVNlc3Npb24gICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBzZXNzaW9uIGNvbnRleHQgb3IgTlVMTCBpZiBzZXNzaW9uIGlzIG5vdCBmb3VuZC4KKworICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RwUEVTZXNzaW9uIHBlX2ZpbmRfc2Vzc2lvbl9ieV9wZWVyX3N0YSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpzYSwKKwkJCQkJdWludDhfdCAqc2Vzc2lvbklkKQoreworCXVpbnQ4X3QgaTsKKwl0cERwaEhhc2hOb2RlIHBTdGE7CisJdWludDE2X3QgYWlkOworCisJZm9yIChpID0gMDsgaSA8IHBNYWMtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCWlmICgocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCkpIHsKKwkJCXBTdGEgPQorCQkJCWRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLCBzYSwgJmFpZCwKKwkJCQkJCSAgICAgICZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmRwaC4KKwkJCQkJCSAgICAgIGRwaEhhc2hUYWJsZSk7CisJCQlpZiAocFN0YSAhPSBOVUxMKSB7CisJCQkJKnNlc3Npb25JZCA9IGk7CisJCQkJcmV0dXJuICZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldOworCQkJfQorCQl9CisJfQorCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiU2Vzc2lvbiBsb29rdXAgZmFpbHMgZm9yIFBlZXIgU3RhSWQ6IFxuICIpKTsKKwlsaW1fcHJpbnRfbWFjX2FkZHIocE1hYywgc2EsIExPRzEpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHBlX2ZpbmRfc2Vzc2lvbl9ieV9zbWVfc2Vzc2lvbl9pZCgpIC0gbG9va3MgdXAgdGhlIFBFIHNlc3Npb24gZm9yIGdpdmVuIHNtZQorICogc2Vzc2lvbiBpZAorICogQG1hY19jdHg6ICAgICAgICAgIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICogQHNtZV9zZXNzaW9uX2lkOiAgIHNtZSBzZXNzaW9uIGlkCisgKgorICogbG9va3MgdXAgdGhlIFBFIHNlc3Npb24gZm9yIGdpdmVuIHNtZSBzZXNzaW9uIGlkCisgKgorICogUmV0dXJuOiBwZSBzZXNzaW9uIGVudHJ5IGZvciBnaXZlbiBzbWUgc2Vzc2lvbiBpZiBmb3VuZCBlbHNlIE5VTEwKKyAqLwordHBQRVNlc3Npb24gcGVfZmluZF9zZXNzaW9uX2J5X3NtZV9zZXNzaW9uX2lkKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJCSAgICAgIHVpbnQ4X3Qgc21lX3Nlc3Npb25faWQpCit7CisJdWludDhfdCBpOworCWZvciAoaSA9IDA7IGkgPCBtYWNfY3R4LT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQlpZiAoKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0udmFsaWQpICYmCisJCSAgICAgKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0uc21lU2Vzc2lvbklkID09CisJCQlzbWVfc2Vzc2lvbl9pZCkpIHsKKwkJCXJldHVybiAmbWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXTsKKwkJfQorCX0KKwlsaW1fbG9nKG1hY19jdHgsIExPRzQsCisJCUZMKCJTZXNzaW9uIGxvb2t1cCBmYWlscyBmb3Igc21lU2Vzc2lvbklEOiAlZCIpLAorCQlzbWVfc2Vzc2lvbl9pZCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogcGVfZ2V0X2FjdGl2ZV9zZXNzaW9uX2NvdW50KCkgLSBmdW5jdGlvbiB0byByZXR1cm4gYWN0aXZlIHBlIHNlc3Npb24gY291bnQKKyAqCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgbnVtYmVyIG9mIGFjdGl2ZSBwZSBzZXNzaW9uIGNvdW50CisgKgorICogUmV0dXJuOiAwIGlmIHRoZXJlIGFyZSBubyBhY3RpdmUgc2Vzc2lvbnMgZWxzZSByZXR1cm4gbnVtYmVyIG9mIGFjdGl2ZQorICogICAgICAgICAgc2Vzc2lvbnMKKyAqLwordWludDhfdCBwZV9nZXRfYWN0aXZlX3Nlc3Npb25fY291bnQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCkKK3sKKwl1aW50OF90IGksIGFjdGl2ZV9zZXNzaW9uX2NvdW50ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBtYWNfY3R4LT5saW0ubWF4QnNzSWQ7IGkrKykKKwkJaWYgKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0udmFsaWQpCisJCQlhY3RpdmVfc2Vzc2lvbl9jb3VudCsrOworCisJcmV0dXJuIGFjdGl2ZV9zZXNzaW9uX2NvdW50OworfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2Vzc2lvbl91dGlscy5jIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2Vzc2lvbl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YjM3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zZXNzaW9uX3V0aWxzLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIGxpbV9zZXNzaW9uX3V0aWxzLmMKKyAgIFxicmllZiBpbXBsZW1lbnRhdGlvbiBmb3IgbGltIFNlc3Npb24gVXRpbGl0eSAgQVBJcworICAgXGF1dGhvciBTdW5pdCBCaGF0aWEKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgImxpbV9kZWJ1Zy5oIgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSAibGltX2Z0X2RlZnMuaCIKKyNlbmRpZgorI2luY2x1ZGUgImxpbV9zZXNzaW9uLmgiCisjaW5jbHVkZSAibGltX3Nlc3Npb25fdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKworLyoqCisgKiBpc19saW1fc2Vzc2lvbl9vZmZfY2hhbm5lbCgpIC0gY2hlY2tzIGlmIGFueSBvdGhlciBvZmYgY2hhbm5lbCBzZXNzaW9uIGV4aXN0cworICogQG1hY19jdHg6IEdsb2JhbCBNQUMgY29udGV4dC4KKyAqIEBzZXNzaW9uSWQ6IFBFIHNlc3Npb24gSUQuCisgKgorICogUmV0dXJuOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgc2Vzc2lvbiBJZCBwYXNzZWQgbmVlZHMgdG8gYmUgb24KKyAqICAgICAgICAgYSBkaWZmZXJlbnQgY2hhbm5lbCB0aGFuIGF0bGVhc3Qgb25lIHNlc3Npb24gYWxyZWFkeSBhY3RpdmUuCisgKiovCit1aW50OF90IGlzX2xpbV9zZXNzaW9uX29mZl9jaGFubmVsKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3Qgc2Vzc2lvbl9pZCkKK3sKKwl1aW50OF90IGk7CisKKwlpZiAoc2Vzc2lvbl9pZCA+PSBtYWNfY3R4LT5saW0ubWF4QnNzSWQpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiSW52YWxpZCBzZXNzaW9uX2lkOiVkIiksIHNlc3Npb25faWQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1hY19jdHgtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCS8qIFNraXAgdGhlIHNlc3Npb25faWQgdGhhdCBpcyB0byBiZSBqb2luZWQuICovCisJCWlmIChpID09IHNlc3Npb25faWQpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogaWYgYW5vdGhlciBzZXNzaW9uIGlzIHZhbGlkIGFuZCBpdCBpcyBvbiBkaWZmZXJlbnQgY2hhbm5lbAorCQkgKiB0aGVuIGl0IGlzIGFuIG9mZiBjaGFubmVsIG9wZXJhdGlvbi4KKwkJICovCisJCWlmICgobWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCkgJiYKKwkJICAgIChtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmN1cnJlbnRPcGVyQ2hhbm5lbCAhPQorCQkgICAgIG1hY19jdHgtPmxpbS5ncFNlc3Npb25bc2Vzc2lvbl9pZF0uY3VycmVudE9wZXJDaGFubmVsKSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7CisKK30KKworLyoqCisgKiBsaW1faXNfY2hhbl9zd2l0Y2hfcnVubmluZygpIC0gY2hlY2sgaWYgY2hhbm5lbCBzd2l0Y2ggaXMgaGFwcGVuaW5nCisgKiBAbWFjX2N0eDogR2xvYmFsIE1BQyBjb250ZXh0LgorICoKKyAqIFJldHVybjogMSAtIGlmIGNoYW5uZWwgc3dpdGNoIGlzIGhhcHBlbmluZyBvbiBhbnkgc2Vzc2lvbi4KKyAqICAgICAgICAgMCAtIGlmIGNoYW5uZWwgc3dpdGNoIGlzIG5vdCBoYXBwZW5pbmcuCisgKiovCit1aW50OF90IGxpbV9pc19jaGFuX3N3aXRjaF9ydW5uaW5nKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJdWludDhfdCBpOworCisJZm9yIChpID0gMDsgaSA8IG1hY19jdHgtPmxpbS5tYXhCc3NJZDsgaSsrKQorCQlpZiAobWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCAmJgorCQkJbWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS5nTGltU3BlY01nbXQuZG90MTFoQ2hhblN3U3RhdGUKKwkJCT09IGVMSU1fMTFIX0NIQU5TV19SVU5OSU5HKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbGltX2lzX2luX21jYygpIC0gY2hlY2sgaWYgZGV2aWNlIGlzIGluIE1DQworICogQG1hY19jdHg6IEdsb2JhbCBNQUMgY29udGV4dC4KKyAqCisgKiBSZXR1cm46IHRydWUgLSBpZiBpbiBNQ0MuCisgKiAgICAgICAgIGZhbHNlIC0gTm90IGluIE1DQworICoqLwordWludDhfdCBsaW1faXNfaW5fbWNjKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJdWludDhfdCBpOworCXVpbnQ4X3QgY2hhbiA9IDA7CisJdWludDhfdCBjdXJyX29wZXJfY2hhbm5lbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFjX2N0eC0+bGltLm1heEJzc0lkOyBpKyspIHsKKwkJLyoKKwkJICogaWYgYW5vdGhlciBzZXNzaW9uIGlzIHZhbGlkIGFuZCBpdCBpcyBvbiBkaWZmZXJlbnQgY2hhbm5lbAorCQkgKiBpdCBpcyBhbiBvZmYgY2hhbm5lbCBvcGVyYXRpb24uCisJCSAqLworCQlpZiAoKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0udmFsaWQpKSB7CisJCQljdXJyX29wZXJfY2hhbm5lbCA9CisJCQkJbWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS5jdXJyZW50T3BlckNoYW5uZWw7CisJCQlpZiAoY2hhbiA9PSAwKQorCQkJCWNoYW4gPSBjdXJyX29wZXJfY2hhbm5lbDsKKwkJCWVsc2UgaWYgKGNoYW4gIT0gY3Vycl9vcGVyX2NoYW5uZWwpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIHBlX2dldF9jdXJyZW50X3N0YXNfY291bnQoKSAtIFRvdGFsIHN0YXRpb25zIGFzc29jaWF0ZWQgb24gYWxsIHNlc3Npb25zLgorICogQG1hY19jdHg6IEdsb2JhbCBNQUMgY29udGV4dC4KKyAqCisgKiBSZXR1cm46IHRydWUgLSBOdW1iZXIgb2Ygc3RhdGlvbnMgYWN0aXZlIG9uIGFsbCBzZXNzaW9ucy4KKyAqKi8KK3VpbnQ4X3QgcGVfZ2V0X2N1cnJlbnRfc3Rhc19jb3VudCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4KQoreworCXVpbnQ4X3QgaTsKKwl1aW50OF90IHN0YWNvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWFjX2N0eC0+bGltLm1heEJzc0lkOyBpKyspCisJCWlmIChtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkID09IHRydWUpCisJCQlzdGFjb3VudCArPQorCQkJCW1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0uZ0xpbU51bU9mQ3VycmVudFNUQXM7CisJcmV0dXJuIHN0YWNvdW50OworfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2Vzc2lvbl91dGlscy5oIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc2Vzc2lvbl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZGQ3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zZXNzaW9uX3V0aWxzLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKF9fTElNX1NFU1NJT05fVVRJTFNfSCkKKyNkZWZpbmUgX19MSU1fU0VTU0lPTl9VVElMU19ICisKK3VpbnQ4X3QgaXNfbGltX3Nlc3Npb25fb2ZmX2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpOwordWludDhfdCBsaW1faXNfY2hhbl9zd2l0Y2hfcnVubmluZyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3VpbnQ4X3QgbGltX2lzX2luX21jYyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3VpbnQ4X3QgcGVfZ2V0X2N1cnJlbnRfc3Rhc19jb3VudCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZCggX19MSU1fU0VTU0lPTl9VVElMU19IICkgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3NtZV9yZXFfdXRpbHMuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3NtZV9yZXFfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTAyMzFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc21lX3JlcV91dGlscy5jCkBAIC0wLDAgKzEsOTI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBsaW1fc21lX3JlcV91dGlscy5jYyBjb250YWlucyB0aGUgdXRpbGl0eSBmdW5jdGlvbnMKKyAqIGZvciBwcm9jZXNzaW5nIFNNRSByZXF1ZXN0IG1lc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMDUvMjYvMTAgICAgICAganMgICAgICAgICAgICAgV1BBIGhhbmRsaW5nIGluIChSZSlBc3NvYyBmcmFtZXMKKyAqCisgKi8KKworI2luY2x1ZGUgInduaV9hcGkuaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlY3VyaXR5X3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3Nlcl9kZXNfdXRpbHMuaCIKKworLyoqCisgKiBsaW1faXNfcnNfbmllX3ZhbGlkX2luX3NtZV9yZXFfbWVzc2FnZSgpCisgKgorICogQG1hY19jdHggICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcnNuX2llICAgIFBvaW50ZXIgdG8gcmVjZWl2ZWQgUlNOIElFCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IGlmIHRoZSBSU04gSUUgcmVjZWl2ZWQgaW4gdmFyaW91cyBTTUVfUkVRCisgKiBtZXNzYWdlcyBpcyB2YWxpZCBvciBub3QKKyAqCisgKiBSZXR1cm46IHRydWUgd2hlbiBSU04gSUUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZQorICoKKyAqLworCitzdGF0aWMgdWludDhfdAorbGltX2lzX3Jzbl9pZV92YWxpZF9pbl9zbWVfcmVxX21lc3NhZ2UodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdHBTaXJSU05pZSByc25faWUpCit7CisJdWludDhfdCBzdGFydCA9IDA7CisJdWludDMyX3QgcHJpdmFjeSwgdmFsOworCWludCBsZW47CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRCwKKwkJCSAgICAgJnByaXZhY3kpICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsIEZMKCJVbmFibGUgdG8gcmV0cmlldmUgUE9JIGZyb20gQ0ZHIikpOworCX0KKworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfUlNOX0VOQUJMRUQsICZ2YWwpCisJCSE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiVW5hYmxlIHRvIHJldHJpZXZlIFJTTl9FTkFCTEVEIGZyb20gQ0ZHIikpOworCX0KKworCWlmIChyc25faWUtPmxlbmd0aCAmJiAoIXByaXZhY3kgfHwgIXZhbCkpIHsKKwkJLyogUHJpdmFjeSAmIFJTTiBub3QgZW5hYmxlZCBpbiBDRkcuCisJCSAqIEluIG9yZGVyIHRvIGFsbG93IG1peGVkIG1vZGUgZm9yIEd1ZXN0IGFjY2VzcworCQkgKiBhbGxvdyBCU1MgY3JlYXRpb24vam9pbiB3aXRoIG5vIFByaXZhY3kgY2FwYWJpbGl0eQorCQkgKiB5ZXQgYWR2ZXJ0aXNpbmcgV1BBIElFCisJCSAqLworCQlQRUxPRzEobGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJICAgICAgIEZMKCJSU04gaWUgbGVuICVkIFBSSVZBQ1kgJWQgUlNOICVkIiksCisJCQkgICAgICAgcnNuX2llLT5sZW5ndGgsIHByaXZhY3ksIHZhbCk7KQorCX0KKworCWlmICghcnNuX2llLT5sZW5ndGgpCisJCXJldHVybiB0cnVlOworCisJaWYgKChyc25faWUtPnJzbklFZGF0YVswXSAhPSBET1QxMUZfRUlEX1JTTikKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCSAgICAmJiAocnNuX2llLT5yc25JRWRhdGFbMF0gIT0gRE9UMTFGX0VJRF9XQVBJKQorI2VuZGlmCisJICAgICYmIChyc25faWUtPnJzbklFZGF0YVswXSAhPSBET1QxMUZfRUlEX1dQQSkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiUlNOL1dQQS9XQVBJIEVJRCAlZCBub3QgWyVkIHx8ICVkXSIpLAorCQkJcnNuX2llLT5yc25JRWRhdGFbMF0sIERPVDExRl9FSURfUlNOLAorCQkJRE9UMTFGX0VJRF9XUEEpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJbGVuID0gcnNuX2llLT5sZW5ndGg7CisJc3RhcnQgPSAwOworCXdoaWxlIChsZW4gPiAwKSB7CisJCXN3aXRjaCAocnNuX2llLT5yc25JRWRhdGFbc3RhcnRdKSB7CisJCWNhc2UgRE9UMTFGX0VJRF9SU046CisJCS8qIENoZWNrIHZhbGlkaXR5IG9mIFJTTiBJRSAqLworCQkJaWYgKChyc25faWUtPnJzbklFZGF0YVtzdGFydCArIDFdID4KKwkJCSAgICBET1QxMUZfSUVfUlNOX01BWF9MRU4pCisJCQkgICAgfHwgKHJzbl9pZS0+cnNuSUVkYXRhW3N0YXJ0ICsgMV0gPAorCQkJCURPVDExRl9JRV9SU05fTUlOX0xFTikpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJSU04gSUUgbGVuICVkIG5vdCBbJWQsJWRdIiksCisJCQkJCXJzbl9pZS0+cnNuSUVkYXRhW3N0YXJ0ICsgMV0sCisJCQkJCURPVDExRl9JRV9SU05fTUlOX0xFTiwKKwkJCQkJRE9UMTFGX0lFX1JTTl9NQVhfTEVOKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBET1QxMUZfRUlEX1dQQToKKwkJCS8qIENoZWNrIHZhbGlkaXR5IG9mIFdQQSBJRSAqLworCQkJaWYgKFNJUl9NQUNfTUFYX0lFX0xFTkdUSCA8PSBzdGFydCkKKwkJCQlicmVhazsKKworCQkJaWYgKHN0YXJ0IDw9IChTSVJfTUFDX01BWF9JRV9MRU5HVEggLSBzaXplb2YodWludDMyX3QpKSkKKwkJCQl2YWwgPSBzaXJfcmVhZF91MzIoKHVpbnQ4X3QgKikgJgorCQkJCQlyc25faWUtPnJzbklFZGF0YVtzdGFydCArIDJdKTsKKworCQkJaWYgKChyc25faWUtPnJzbklFZGF0YVtzdGFydCArIDFdIDwKKwkJCSAgICAgRE9UMTFGX0lFX1dQQV9NSU5fTEVOKQorCQkJICAgIHx8IChyc25faWUtPnJzbklFZGF0YVtzdGFydCArIDFdID4KKwkJCQlET1QxMUZfSUVfV1BBX01BWF9MRU4pCisJCQkgICAgfHwgKFNJUl9NQUNfV1BBX09VSSAhPSB2YWwpKSB7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiV1BBIElFIGxlbiAlZCBub3QgWyVkLCVkXSBPUiBkYXRhIDB4JXggbm90IDB4JXgiKSwKKwkJCQkJcnNuX2llLT5yc25JRWRhdGFbc3RhcnQgKyAxXSwKKwkJCQkJRE9UMTFGX0lFX1dQQV9NSU5fTEVOLAorCQkJCQlET1QxMUZfSUVfV1BBX01BWF9MRU4sCisJCQkJCXZhbCwgU0lSX01BQ19XUEFfT1VJKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCQljYXNlIERPVDExRl9FSURfV0FQSToKKwkJCWlmICgocnNuX2llLT5yc25JRWRhdGFbc3RhcnQgKyAxXSA+CisJCQkgICAgRE9UMTFGX0lFX1dBUElfTUFYX0xFTikKKwkJCSAgICB8fCAocnNuX2llLT5yc25JRWRhdGFbc3RhcnQgKyAxXSA8CisJCQkJRE9UMTFGX0lFX1dBUElfTUlOX0xFTikpIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJXQVBJIElFIGxlbiAlZCBub3QgWyVkLCVkXSIpLAorCQkJCQlyc25faWUtPnJzbklFZGF0YVtzdGFydCArIDFdLAorCQkJCQlET1QxMUZfSUVfV0FQSV9NSU5fTEVOLAorCQkJCQlET1QxMUZfSUVfV0FQSV9NQVhfTEVOKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJLyogd2Ugd2lsbCBuZXZlciBiZSBoZXJlLCBzaW1wbHkgZm9yIGNvbXBsZXRlbmVzcyAqLworCQkJcmV0dXJuIGZhbHNlOworCQl9IC8qIGVuZCBvZiBzd2l0Y2ggKi8KKwkJLyogRUlEICsgbGVuZ3RoIGZpZWxkICsgbGVuZ3RoICovCisJCXN0YXJ0ICs9IDIgKyByc25faWUtPnJzbklFZGF0YVtzdGFydCArIDFdOworCQlsZW4gLT0gc3RhcnQ7CisJfSAvKiBlbmQgd2hpbGUgbG9vcCAqLworCXJldHVybiB0cnVlOworfSAvKioqIGVuZCBsaW1faXNfcnNfbmllX3ZhbGlkX2luX3NtZV9yZXFfbWVzc2FnZSgpICoqKi8KKworLyoqCisgKiBsaW1faXNfYWRkaWVfdmFsaWRfaW5fc21lX3JlcV9tZXNzYWdlKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB2ZXJpZnkgaWYgdGhlIEFkZCBJRQorICogcmVjZWl2ZWQgaW4gdmFyaW91cyBTTUVfUkVRIG1lc3NhZ2VzIGlzIHZhbGlkIG9yIG5vdAorICoKKyAqKipMT0dJQzoKKyAqIEFkZCBJRSB2YWxpZGl0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBvbiBvbmx5IGxlbmd0aAorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBXU0NpZSBQb2ludGVyIHRvIHJlY2VpdmVkIFdTQyBJRQorICogQHJldHVybiB0cnVlIHdoZW4gV1NDIElFIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgdWludDhfdAorbGltX2lzX2FkZGllX3ZhbGlkX2luX3NtZV9yZXFfbWVzc2FnZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpckFkZGllIHBBZGRpZSkKK3sKKwlpbnQgbGVmdCA9IHBBZGRpZS0+bGVuZ3RoOworCXVpbnQ4X3QgKnB0ciA9IHBBZGRpZS0+YWRkSUVkYXRhOworCXVpbnQ4X3QgZWxlbV9pZCwgZWxlbV9sZW47CisKKwlpZiAobGVmdCA9PSAwKQorCQlyZXR1cm4gdHJ1ZTsKKworCXdoaWxlIChsZWZ0ID49IDIpIHsKKwkJZWxlbV9pZCA9IHB0clswXTsKKwkJZWxlbV9sZW4gPSBwdHJbMV07CisJCWxlZnQgLT0gMjsKKwkJaWYgKGVsZW1fbGVuID4gbGVmdCkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiKioqKkludmFsaWQgQWRkIElFcyBlaWQgPSAlZCBlbGVtX2xlbj0lZCBsZWZ0PSVkKioqKioiKSwKKwkJCQllbGVtX2lkLCBlbGVtX2xlbiwgbGVmdCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlsZWZ0IC09IGVsZW1fbGVuOworCQlwdHIgKz0gKGVsZW1fbGVuICsgMik7CisJfQorCS8qIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbGVmdCBieXRlICovCisKKwlyZXR1cm4gdHJ1ZTsKK30gLyoqKiBlbmQgbGltX2lzX2FkZGllX3ZhbGlkX2luX3NtZV9yZXFfbWVzc2FnZSgpICoqKi8KKworLyoqCisgKiBsaW1fc2V0X3JzX25pZV93cF9haWVmcm9tX3NtZV9zdGFydF9ic3NfcmVxX21lc3NhZ2UoKSAtIHRvIHNldCByc25pZS93cGFpZQorICoKKyAqIEBtYWNfY3R4IDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJzbl9pZSAgOiBQb2ludGVyIHRvIHJlY2VpdmVkIFJTTiBJRQorICogQHNlc3Npb24gOiBQb2ludGVyIHRvIHBlIHNlc3Npb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB2ZXJpZnkgaWYgdGhlIFJTTiBJRSByZWNlaXZlZCBpbiB2YXJpb3VzCisgKiBTTUVfUkVRIG1lc3NhZ2VzIGlzIHZhbGlkIG9yIG5vdC4gUlNOIElFIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluCisgKiB0aGlzIGZ1bmN0aW9uCisgKgorICogUmV0dXJuOiB0cnVlIHdoZW4gUlNOIElFIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UKKyAqLwordWludDhfdAorbGltX3NldF9yc19uaWVfd3BfYWllZnJvbV9zbWVfc3RhcnRfYnNzX3JlcV9tZXNzYWdlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJCQkgICAgdHBTaXJSU05pZSByc25faWUsCisJCQkJCQkgICAgdHBQRVNlc3Npb24gc2Vzc2lvbikKK3sKKwl1aW50OF90IHdwYV9pZHggPSAwOworCXVpbnQzMl90IHByaXZhY3ksIHZhbDsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfUFJJVkFDWV9FTkFCTEVELAorCQkJICAgICAmcHJpdmFjeSkgIT0gZVNJUl9TVUNDRVNTKQorCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsIEZMKCJVbmFibGUgdG8gcmV0cmlldmUgUE9JIGZyb20gQ0ZHIikpOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19SU05fRU5BQkxFRCwKKwkJCSAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiVW5hYmxlIHRvIHJldHJpZXZlIFJTTl9FTkFCTEVEIGZyb20gQ0ZHIikpOworCisJaWYgKHJzbl9pZS0+bGVuZ3RoICYmICghcHJpdmFjeSB8fCAhdmFsKSkgeworCQkvKgorCQkgKiBQcml2YWN5ICYgUlNOIG5vdCBlbmFibGVkIGluIENGRy4KKwkJICogSW4gb3JkZXIgdG8gYWxsb3cgbWl4ZWQgbW9kZSBmb3IgR3Vlc3QgYWNjZXNzCisJCSAqIGFsbG93IEJTUyBjcmVhdGlvbi9qb2luIHdpdGggbm8gUHJpdmFjeSBjYXBhYmlsaXR5CisJCSAqIHlldCBhZHZlcnRpc2luZyBXUEEgSUUKKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJSU04gaWUgbGVuICVkIGJ1dCBQUklWQUNZICVkIFJTTiAlZCIpLAorCQkJcnNuX2llLT5sZW5ndGgsIHByaXZhY3ksIHZhbCk7CisJfQorCisJaWYgKCFyc25faWUtPmxlbmd0aCkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoKHJzbl9pZS0+cnNuSUVkYXRhWzBdICE9IFNJUl9NQUNfUlNOX0VJRCkgJiYKKwkgICAgKHJzbl9pZS0+cnNuSUVkYXRhWzBdICE9IFNJUl9NQUNfV1BBX0VJRCkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiUlNOL1dQQSBFSUQgJWQgbm90IFslZCB8fCAlZF0iKSwKKwkJCXJzbl9pZS0+cnNuSUVkYXRhWzBdLCBTSVJfTUFDX1JTTl9FSUQsCisJCQlTSVJfTUFDX1dQQV9FSUQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qIENoZWNrIHZhbGlkaXR5IG9mIFJTTiBJRSAqLworCWlmICgocnNuX2llLT5yc25JRWRhdGFbMF0gPT0gU0lSX01BQ19SU05fRUlEKSAmJgorCSAgICAocnNuX2llLT5yc25JRWRhdGFbMV0gPCBTSVJfTUFDX1JTTl9JRV9NSU5fTEVOR1RIKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJSU04gSUUgbGVuICVkIG5vdCBbJWQsJWRdIiksCisJCQlyc25faWUtPnJzbklFZGF0YVsxXSwgU0lSX01BQ19SU05fSUVfTUlOX0xFTkdUSCwKKwkJCVNJUl9NQUNfUlNOX0lFX01BWF9MRU5HVEgpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHJzbl9pZS0+bGVuZ3RoID4gcnNuX2llLT5yc25JRWRhdGFbMV0gKyAyKSB7CisJCWlmIChyc25faWUtPnJzbklFZGF0YVswXSAhPSBTSVJfTUFDX1JTTl9FSUQpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiRmlyc3QgYnl0ZVslZF0gaW4gcnNuSUVkYXRhIGlzbid0IFJTTl9FSUQiKSwKKwkJCQlyc25faWUtPnJzbklFZGF0YVsxXSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIldQQSBJRSBpcyBwcmVzZW50IGFsb25nIHdpdGggV1BBMiBJRSIpKTsKKwkJd3BhX2lkeCA9IDIgKyByc25faWUtPnJzbklFZGF0YVsxXTsKKwl9IGVsc2UgaWYgKChyc25faWUtPmxlbmd0aCA9PSByc25faWUtPnJzbklFZGF0YVsxXSArIDIpICYmCisJCSAgIChyc25faWUtPnJzbklFZGF0YVswXSA9PSBTSVJfTUFDX1JTTl9FSUQpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIk9ubHkgUlNOIElFIGlzIHByZXNlbnQiKSk7CisJCWRvdDExZl91bnBhY2tfaWVfcnNuKG1hY19jdHgsICZyc25faWUtPnJzbklFZGF0YVsyXSwKKwkJCQkgICAgICh1aW50OF90KSByc25faWUtPmxlbmd0aCwKKwkJCQkgICAgICZzZXNzaW9uLT5nU3RhcnRCc3NSU05JZSk7CisJfSBlbHNlIGlmICgocnNuX2llLT5sZW5ndGggPT0gcnNuX2llLT5yc25JRWRhdGFbMV0gKyAyKQorCQkgICAmJiAocnNuX2llLT5yc25JRWRhdGFbMF0gPT0gU0lSX01BQ19XUEFfRUlEKSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJPbmx5IFdQQSBJRSBpcyBwcmVzZW50IikpOworCQlkb3QxMWZfdW5wYWNrX2llX3dwYShtYWNfY3R4LCAmcnNuX2llLT5yc25JRWRhdGFbNl0sCisJCQkJICAgICAodWludDhfdCkgcnNuX2llLT5sZW5ndGggLSA0LAorCQkJCSAgICAgJnNlc3Npb24tPmdTdGFydEJzc1dQQUllKTsKKwl9CisJLyogQ2hlY2sgdmFsaWRpdHkgb2YgV1BBIElFICovCisJaWYgKHdwYV9pZHggKyA2ID49IFNJUl9NQUNfTUFYX0lFX0xFTkdUSCkKKwkJcmV0dXJuIGZhbHNlOworCisJdmFsID0gc2lyX3JlYWRfdTMyKCh1aW50OF90ICopJnJzbl9pZS0+cnNuSUVkYXRhW3dwYV9pZHggKyAyXSk7CisJaWYgKChyc25faWUtPnJzbklFZGF0YVt3cGFfaWR4XSA9PSBTSVJfTUFDX1dQQV9FSUQpCisJICAgICYmICgocnNuX2llLT5yc25JRWRhdGFbd3BhX2lkeCArIDFdIDwgU0lSX01BQ19XUEFfSUVfTUlOX0xFTkdUSCkKKwkgICAgIHx8IChTSVJfTUFDX1dQQV9PVUkgIT0gdmFsKSkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIldQQSBJRSBsZW4gJWQgbm90IFslZCwlZF0gT1IgZGF0YSAweCV4IG5vdCAweCV4IiksCisJCQlyc25faWUtPnJzbklFZGF0YVsxXSwKKwkJCVNJUl9NQUNfUlNOX0lFX01JTl9MRU5HVEgsCisJCQlTSVJfTUFDX1JTTl9JRV9NQVhfTEVOR1RILCB2YWwsCisJCQlTSVJfTUFDX1dQQV9PVUkpOworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJLyogQm90aCBSU04gYW5kIFdQQSBJRXMgYXJlIHByZXNlbnQgKi8KKwkJZG90MTFmX3VucGFja19pZV9yc24obWFjX2N0eCwgJnJzbl9pZS0+cnNuSUVkYXRhWzJdLAorCQkJCSAgICAgKHVpbnQ4X3QpIHJzbl9pZS0+bGVuZ3RoLAorCQkJCSAgICAgJnNlc3Npb24tPmdTdGFydEJzc1JTTkllKTsKKwkJZG90MTFmX3VucGFja19pZV93cGEobWFjX2N0eCwgJnJzbl9pZS0+cnNuSUVkYXRhW3dwYV9pZHggKyA2XSwKKwkJCQkgICAgIHJzbl9pZS0+cnNuSUVkYXRhW3dwYV9pZHggKyAxXSAtIDQsCisJCQkJICAgICAmc2Vzc2lvbi0+Z1N0YXJ0QnNzV1BBSWUpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBsaW1faXNfYnNzX2Rlc2NyX3ZhbGlkX2luX3NtZV9yZXFfbWVzc2FnZSgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IGlmIHRoZSBCU1MgRGVzY3IKKyAqIHJlY2VpdmVkIGluIHZhcmlvdXMgU01FX1JFUSBtZXNzYWdlcyBpcyB2YWxpZCBvciBub3QKKyAqCisgKioqTE9HSUM6CisgKiBCU1MgRGVzY3JpdGlwaW9uIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwQnNzRGVzY3IgUG9pbnRlciB0byByZWNlaXZlZCBCc3MgRGVzY3JpdGlwaW9uCisgKiBAcmV0dXJuIHRydWUgd2hlbiBCU1MgZGVzY3JpcHRpb24gaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZQorICovCisKK3N0YXRpYyB1aW50OF90CitsaW1faXNfYnNzX2Rlc2NyX3ZhbGlkX2luX3NtZV9yZXFfbWVzc2FnZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgIHRwU2lyQnNzRGVzY3JpcHRpb24gcEJzc0Rlc2NyKQoreworCXVpbnQ4X3QgdmFsaWQgPSB0cnVlOworCisJaWYgKGxpbV9pc19hZGRyX2JjKHBCc3NEZXNjci0+YnNzSWQpIHx8ICFwQnNzRGVzY3ItPmNoYW5uZWxJZCkgeworCQl2YWxpZCA9IGZhbHNlOworCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoKKwlyZXR1cm4gdmFsaWQ7Cit9IC8qKiogZW5kIGxpbV9pc19ic3NfZGVzY3JfdmFsaWRfaW5fc21lX3JlcV9tZXNzYWdlKCkgKioqLworCisvKioKKyAqIGxpbV9pc19zbWVfc3RhcnRfYnNzX3JlcV92YWxpZCgpIC0gVG8gdmFsaWRhdGUgc21lIHN0YXJ0IGJzcyByZXF1ZXN0CisgKgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBzdGFydF9ic3NfcmVxOiBQb2ludGVyIHRvIHJlY2VpdmVkIFNNRV9TVEFSVF9CU1NfUkVRIG1lc3NhZ2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19zbWVfcmVxX21lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9TVEFSVF9CU1NfUkVRIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKiBSZXR1cm46IHRydWUgd2hlbiByZWNlaXZlZCBTTUVfU1RBUlRfQlNTX1JFUSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5IGZhbHNlCisgKiAgICAgICAgIG90aGVyd2lzZQorICovCisKK3VpbnQ4X3QKK2xpbV9pc19zbWVfc3RhcnRfYnNzX3JlcV92YWxpZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJICAgICAgIHRwU2lyU21lU3RhcnRCc3NSZXEgc3RhcnRfYnNzX3JlcSkKK3sKKwl1aW50OF90IGkgPSAwOworCXRTaXJNYWNSYXRlU2V0ICpvcHJfcmF0ZXMgPSAmc3RhcnRfYnNzX3JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0OworCisJUEVMT0cxKGxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkgICAgICAgRkwoIlBhcnNlZCBTVEFSVF9CU1NfUkVRIGZpZWxkcyBhcmUgYnNzVHlwZT0lZCwgY2hhbm5lbElkPSVkLCBTU0lEIGxlbj0lZCwgcnNuSUUgbGVuPSVkLCBud1R5cGU9JWQsIHJhdGVzZXQgbGVuPSVkIiksCisJICAgICAgIHN0YXJ0X2Jzc19yZXEtPmJzc1R5cGUsIHN0YXJ0X2Jzc19yZXEtPmNoYW5uZWxJZCwKKwkgICAgICAgc3RhcnRfYnNzX3JlcS0+c3NJZC5sZW5ndGgsIHN0YXJ0X2Jzc19yZXEtPnJzbklFLmxlbmd0aCwKKwkgICAgICAgc3RhcnRfYnNzX3JlcS0+bndUeXBlLCBvcHJfcmF0ZXMtPm51bVJhdGVzKTspCisKKwlzd2l0Y2ggKHN0YXJ0X2Jzc19yZXEtPmJzc1R5cGUpIHsKKwljYXNlIGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKwkJLyoqCisJCSAqIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBzdGFydCBCU1MgcmVxIHdpdGggYnNzVHlwZQorCQkgKiBJbmZyYXN0cnVjdHVyZSBvbiBTVEEuCisJCSAqLworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiSW52YWxpZCBic3NUeXBlICVkIGluIGVXTklfU01FX1NUQVJUX0JTU19SRVEiKSwKKwkJCXN0YXJ0X2Jzc19yZXEtPmJzc1R5cGUpOworCQlyZXR1cm4gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgZVNJUl9JQlNTX01PREU6CisJCWJyZWFrOworCWNhc2UgZVNJUl9CVEFNUF9TVEFfTU9ERToKKwkJYnJlYWs7CisJY2FzZSBlU0lSX0JUQU1QX0FQX01PREU6CisJCWJyZWFrOworCWNhc2UgZVNJUl9JTkZSQV9BUF9NT0RFOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKioKKwkJICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHN0YXJ0IEJTUyByZXEgd2l0aCBic3NUeXBlCisJCSAqIG90aGVyIHRoYW4gSW5mcmFzdHJ1Y3R1cmUvSUJTUy4KKwkJICovCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJJbnZhbGlkIGJzc1R5cGUgJWQgaW4gZVdOSV9TTUVfU1RBUlRfQlNTX1JFUSIpLAorCQkJc3RhcnRfYnNzX3JlcS0+YnNzVHlwZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoc3RhcnRfYnNzX3JlcS0+YnNzVHlwZSA9PSBlU0lSX0lCU1NfTU9ERQorCSAgICAmJiAoIXN0YXJ0X2Jzc19yZXEtPnNzSWQubGVuZ3RoCisJCXx8IHN0YXJ0X2Jzc19yZXEtPnNzSWQubGVuZ3RoID4gU0lSX01BQ19NQVhfU1NJRF9MRU5HVEgpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJJbnZhbGlkIFNTSUQgbGVuZ3RoIGluIGVXTklfU01FX1NUQVJUX0JTU19SRVEiKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIWxpbV9pc19yc25faWVfdmFsaWRfaW5fc21lX3JlcV9tZXNzYWdlKG1hY19jdHgsCisJCQkJCQkgICAgJnN0YXJ0X2Jzc19yZXEtPnJzbklFKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHN0YXJ0X2Jzc19yZXEtPm53VHlwZSAhPSBlU0lSXzExQV9OV19UWVBFCisJICAgICYmIHN0YXJ0X2Jzc19yZXEtPm53VHlwZSAhPSBlU0lSXzExQl9OV19UWVBFCisJICAgICYmIHN0YXJ0X2Jzc19yZXEtPm53VHlwZSAhPSBlU0lSXzExR19OV19UWVBFKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc3RhcnRfYnNzX3JlcS0+bndUeXBlID09IGVTSVJfMTFBX05XX1RZUEUpIHsKKwkJZm9yIChpID0gMDsgaSA8IG9wcl9yYXRlcy0+bnVtUmF0ZXM7IGkrKykgeworCQkJaWYgKHNpcklzQXJhdGUob3ByX3JhdGVzLT5yYXRlW2ldICYgMHg3RikpCisJCQkJY29udGludWU7CisKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiSW52YWxpZCBvcGVyYXRpb25hbCAxMUEgcmF0ZXMiKSk7CisJCQlzaXJfZHVtcF9idWYobWFjX2N0eCwgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzIsCisJCQkJICAgICBvcHJfcmF0ZXMtPnJhdGUsIG9wcl9yYXRlcy0+bnVtUmF0ZXMpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkvKiBjaGVjayBpZiBhbGwgdGhlIHJhdGVzIGluIHRoZSBvcHIgcmF0ZSBzZXQgYXJlIGxlZ2FsIDExRyByYXRlcyAqLworCWlmIChzdGFydF9ic3NfcmVxLT5ud1R5cGUgPT0gZVNJUl8xMUdfTldfVFlQRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgb3ByX3JhdGVzLT5udW1SYXRlczsgaSsrKSB7CisJCQlpZiAoc2lySXNHcmF0ZShvcHJfcmF0ZXMtPnJhdGVbaV0gJiAweDdGKSkKKwkJCQljb250aW51ZTsKKworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJJbnZhbGlkIG9wZXJhdGlvbmFsIDExRyByYXRlcyIpKTsKKwkJCXNpcl9kdW1wX2J1ZihtYWNfY3R4LCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMiwKKwkJCQkgICAgIG9wcl9yYXRlcy0+cmF0ZSwgb3ByX3JhdGVzLT5udW1SYXRlcyk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG9wcl9yYXRlcy0+bnVtUmF0ZXM7IGkrKykgeworCQlpZiAoc2lySXNCcmF0ZShvcHJfcmF0ZXMtPnJhdGVbaV0gJiAweDdGKSkKKwkJCWNvbnRpbnVlOworCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJJbnZhbGlkIG9wZXJhdGlvbmFsIDExQiByYXRlcyIpKTsKKwkJc2lyX2R1bXBfYnVmKG1hY19jdHgsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cyLAorCQkJICAgICBvcHJfcmF0ZXMtPnJhdGUsIG9wcl9yYXRlcy0+bnVtUmF0ZXMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGxpbV9pc19zbWVfam9pbl9yZXFfdmFsaWQoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX0pPSU5fUkVRIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKioqTE9HSUM6CisgKiBNZXNzYWdlIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEpvaW5SZXEgICBQb2ludGVyIHRvIHJlY2VpdmVkIFNNRV9KT0lOX1JFUSBtZXNzYWdlCisgKiBAcmV0dXJuIHRydWUgIHdoZW4gcmVjZWl2ZWQgU01FX0pPSU5fUkVRIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkKKyAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KKwordWludDhfdCBsaW1faXNfc21lX2pvaW5fcmVxX3ZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyU21lSm9pblJlcSBwSm9pblJlcSkKK3sKKwl1aW50OF90IHZhbGlkID0gdHJ1ZTsKKworCWlmICghbGltX2lzX3Jzbl9pZV92YWxpZF9pbl9zbWVfcmVxX21lc3NhZ2UocE1hYywgJnBKb2luUmVxLT5yc25JRSkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInJlY2VpdmVkIFNNRV9KT0lOX1JFUSB3aXRoIGludmFsaWQgUlNOSUUiKSk7CisJCXZhbGlkID0gZmFsc2U7CisJCWdvdG8gZW5kOworCX0KKworCWlmICghbGltX2lzX2FkZGllX3ZhbGlkX2luX3NtZV9yZXFfbWVzc2FnZShwTWFjLCAmcEpvaW5SZXEtPmFkZElFU2NhbikpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoInJlY2VpdmVkIFNNRV9KT0lOX1JFUSB3aXRoIGludmFsaWQgYWRkaXRpb25hbCBJRSBmb3Igc2NhbiIpKTsKKwkJdmFsaWQgPSBmYWxzZTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKCFsaW1faXNfYWRkaWVfdmFsaWRfaW5fc21lX3JlcV9tZXNzYWdlKHBNYWMsICZwSm9pblJlcS0+YWRkSUVBc3NvYykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoInJlY2VpdmVkIFNNRV9KT0lOX1JFUSB3aXRoIGludmFsaWQgYWRkaXRpb25hbCBJRSBmb3IgYXNzb2MiKSk7CisJCXZhbGlkID0gZmFsc2U7CisJCWdvdG8gZW5kOworCX0KKworCWlmICghbGltX2lzX2Jzc19kZXNjcl92YWxpZF9pbl9zbWVfcmVxX21lc3NhZ2UocE1hYywgJnBKb2luUmVxLT5ic3NEZXNjcmlwdGlvbikpIHsKKwkJLyogLyBSZWNlaXZlZCBlV05JX1NNRV9KT0lOX1JFUSB3aXRoIGludmFsaWQgQlNTIEluZm8gKi8KKwkJLyogTG9nIHRoZSBldmVudCAqLworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgicmVjZWl2ZWQgU01FX0pPSU5fUkVRIHdpdGggaW52YWxpZCBic3NJbmZvIikpOworCisJCXZhbGlkID0gZmFsc2U7CisJCWdvdG8gZW5kOworCX0KKworCS8qCisJICAgUmVqZWN0IEpvaW4gUmVxIGlmIHRoZSBTZWxmIE1hYyBBZGRyZXNzIGFuZAorCSAgIHRoZSBBcCdzIE1hYyBBZGRyZXNzIGlzIHNhbWUKKwkgKi8KKwlpZiAoY2RmX21lbV9jb21wYXJlKCh1aW50OF90ICopIHBKb2luUmVxLT5zZWxmTWFjQWRkciwKKwkJCSAgICAodWludDhfdCAqKSBwSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uYnNzSWQsCisJCQkgICAgKHVpbnQ4X3QpIChzaXplb2YodFNpck1hY0FkZHIpKSkpIHsKKwkJLyogTG9nIHRoZSBldmVudCAqLworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkJCSgicmVjZWl2ZWQgU01FX0pPSU5fUkVRIHdpdGggU2VsZiBNYWMgYW5kIEJTU0lEIFNhbWUiKSk7CisKKwkJdmFsaWQgPSBmYWxzZTsKKwkJZ290byBlbmQ7CisJfQorCitlbmQ6CisJcmV0dXJuIHZhbGlkOworfSAvKioqIGVuZCBsaW1faXNfc21lX2pvaW5fcmVxX3ZhbGlkKCkgKioqLworCisvKioKKyAqIGxpbV9pc19zbWVfZGlzYXNzb2NfcmVxX3ZhbGlkKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1fcHJvY2Vzc19zbWVfcmVxX21lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9ESVNBU1NPQ19SRVEgbWVzc2FnZSBmcm9tIGFwcGxpY2F0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqIE1lc3NhZ2UgdmFsaWRpdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBEaXNhc3NvY1JlcSBQb2ludGVyIHRvIHJlY2VpdmVkIFNNRV9ESVNBU1NPQ19SRVEgbWVzc2FnZQorICogQHJldHVybiB0cnVlICAgICAgICAgV2hlbiByZWNlaXZlZCBTTUVfRElTQVNTT0NfUkVRIGlzIGZvcm1hdHRlZAorICogICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5CisgKiAgICAgICAgIGZhbHNlICAgICAgICBvdGhlcndpc2UKKyAqLworCit1aW50OF90CitsaW1faXNfc21lX2Rpc2Fzc29jX3JlcV92YWxpZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgdHBTaXJTbWVEaXNhc3NvY1JlcSBwRGlzYXNzb2NSZXEsCisJCQkgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCWlmIChsaW1faXNfZ3JvdXBfYWRkcihwRGlzYXNzb2NSZXEtPnBlZXJNYWNBZGRyKSAmJgorCSAgICAhbGltX2lzX2FkZHJfYmMocERpc2Fzc29jUmVxLT5wZWVyTWFjQWRkcikpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfSAvKioqIGVuZCBsaW1faXNfc21lX2Rpc2Fzc29jX3JlcV92YWxpZCgpICoqKi8KKworLyoqCisgKiBsaW1faXNfc21lX2Rpc2Fzc29jX2NuZl92YWxpZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX3Byb2Nlc3Nfc21lX3JlcV9tZXNzYWdlcygpIHVwb24KKyAqIHJlY2VpdmluZyBTTUVfRElTQVNTT0NfQ05GIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKioqTE9HSUM6CisgKiBNZXNzYWdlIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwRGlzYXNzb2NDbmYgUG9pbnRlciB0byByZWNlaXZlZCBTTUVfRElTQVNTT0NfUkVRIG1lc3NhZ2UKKyAqIEByZXR1cm4gdHJ1ZSAgICAgICAgIFdoZW4gcmVjZWl2ZWQgU01FX0RJU0FTU09DX0NORiBpcyBmb3JtYXR0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RseQorICogICAgICAgICBmYWxzZSAgICAgICAgb3RoZXJ3aXNlCisgKi8KKwordWludDhfdAorbGltX2lzX3NtZV9kaXNhc3NvY19jbmZfdmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgIHRwU2lyU21lRGlzYXNzb2NDbmYgcERpc2Fzc29jQ25mLAorCQkJICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlpZiAobGltX2lzX2dyb3VwX2FkZHIocERpc2Fzc29jQ25mLT5wZWVyTWFjQWRkcikpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfSAvKioqIGVuZCBsaW1faXNfc21lX2Rpc2Fzc29jX2NuZl92YWxpZCgpICoqKi8KKworLyoqCisgKiBsaW1faXNfc21lX2RlYXV0aF9yZXFfdmFsaWQoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX0RFQVVUSF9SRVEgbWVzc2FnZSBmcm9tIGFwcGxpY2F0aW9uLgorICoKKyAqKipMT0dJQzoKKyAqIE1lc3NhZ2UgdmFsaWRpdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwRGVhdXRoUmVxIFBvaW50ZXIgdG8gcmVjZWl2ZWQgU01FX0RFQVVUSF9SRVEgbWVzc2FnZQorICogQHJldHVybiB0cnVlICAgICAgIFdoZW4gcmVjZWl2ZWQgU01FX0RFQVVUSF9SRVEgaXMgZm9ybWF0dGVkIGNvcnJlY3RseQorICogICAgICAgICBmYWxzZSAgICAgIG90aGVyd2lzZQorICovCisKK3VpbnQ4X3QKK2xpbV9pc19zbWVfZGVhdXRoX3JlcV92YWxpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZURlYXV0aFJlcSBwRGVhdXRoUmVxLAorCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJaWYgKGxpbV9pc19ncm91cF9hZGRyKHBEZWF1dGhSZXEtPnBlZXJNYWNBZGRyKSAmJgorCSAgICAhbGltX2lzX2FkZHJfYmMocERlYXV0aFJlcS0+cGVlck1hY0FkZHIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30gLyoqKiBlbmQgbGltX2lzX3NtZV9kZWF1dGhfcmVxX3ZhbGlkKCkgKioqLworCisvKioKKyAqIGxpbV9pc19zbWVfc2Nhbl9yZXFfdmFsaWQoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX1NDQU5fUkVRIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKioqTE9HSUM6CisgKiBNZXNzYWdlIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwU2NhblJlcSBQb2ludGVyIHRvIHJlY2VpdmVkIFNNRV9TQ0FOX1JFUSBtZXNzYWdlCisgKiBAcmV0dXJuIHRydWUgIHdoZW4gcmVjZWl2ZWQgU01FX1NDQU5fUkVRIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkKKyAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KKwordWludDhfdCBsaW1faXNfc21lX3NjYW5fcmVxX3ZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyU21lU2NhblJlcSBwU2NhblJlcSkKK3sKKwl1aW50OF90IHZhbGlkID0gdHJ1ZTsKKwl1aW50OF90IGkgPSAwOworCisJaWYgKHBTY2FuUmVxLT5udW1Tc2lkID4gU0lSX1NDQU5fTUFYX05VTV9TU0lEKSB7CisJCXZhbGlkID0gZmFsc2U7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJOdW1iZXIgb2YgU1NJRHMgPiBTSVJfU0NBTl9NQVhfTlVNX1NTSUQiKSk7CisJCWdvdG8gZW5kOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwU2NhblJlcS0+bnVtU3NpZDsgaSsrKSB7CisJCWlmIChwU2NhblJlcS0+c3NJZFtpXS5sZW5ndGggPiBTSVJfTUFDX01BWF9TU0lEX0xFTkdUSCkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiUmVxdWVzdGVkIFNTSUQgbGVuZ3RoID4gU0lSX01BQ19NQVhfU1NJRF9MRU5HVEgiKSk7CisJCQl2YWxpZCA9IGZhbHNlOworCQkJZ290byBlbmQ7CisJCX0KKwl9CisJaWYgKChwU2NhblJlcS0+YnNzVHlwZSA8IDApIHx8IChwU2NhblJlcS0+YnNzVHlwZSA+IGVTSVJfQVVUT19NT0RFKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIEJTUyBUeXBlIikpOworCQl2YWxpZCA9IGZhbHNlOworCX0KKwlpZiAobGltX2lzX2dyb3VwX2FkZHIocFNjYW5SZXEtPmJzc0lkKSAmJiAhbGltX2lzX2FkZHJfYmMocFNjYW5SZXEtPmJzc0lkKSkgeworCQl2YWxpZCA9IGZhbHNlOworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiQlNTSUQgaXMgZ3JvdXAgYWRkciBhbmQgaXMgbm90IEJyb2FkY2FzdCBBZGRyIikpOworCX0KKwlpZiAoIQorCSAgICAocFNjYW5SZXEtPnNjYW5UeXBlID09IGVTSVJfUEFTU0lWRV9TQ0FOCisJICAgICB8fCBwU2NhblJlcS0+c2NhblR5cGUgPT0gZVNJUl9BQ1RJVkVfU0NBTikpIHsKKwkJdmFsaWQgPSBmYWxzZTsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBTY2FuIFR5cGUiKSk7CisJfQorCWlmIChwU2NhblJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgPiBTSVJfTUFYX05VTV9DSEFOTkVMUykgeworCQl2YWxpZCA9IGZhbHNlOworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiTnVtYmVyIG9mIENoYW5uZWxzID4gU0lSX01BWF9OVU1fQ0hBTk5FTFMiKSk7CisJfQorCisJLyoKKwkqKiBjaGVjayBtaW4vbWF4IGNoYW5uZWxUaW1lIHJhbmdlCisJKiovCisJaWYgKHZhbGlkKSB7CisJCWlmICgocFNjYW5SZXEtPnNjYW5UeXBlID09IGVTSVJfQUNUSVZFX1NDQU4pICYmCisJCSAgICAocFNjYW5SZXEtPm1heENoYW5uZWxUaW1lIDwgcFNjYW5SZXEtPm1pbkNoYW5uZWxUaW1lKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJNYXggQ2hhbm5lbCBUaW1lIDwgTWluIENoYW5uZWwgVGltZSIpKTsKKwkJCXZhbGlkID0gZmFsc2U7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKworZW5kOgorCXJldHVybiB2YWxpZDsKK30gLyoqKiBlbmQgbGltX2lzX3NtZV9zY2FuX3JlcV92YWxpZCgpICoqKi8KKworLyoqCisgKiBsaW1faXNfc21lX3NldF9jb250ZXh0X3JlcV92YWxpZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltX3Byb2Nlc3Nfc21lX3JlcV9tZXNzYWdlcygpIHVwb24KKyAqIHJlY2VpdmluZyBTTUVfU0VUX0NPTlRFWFRfUkVRIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKioqTE9HSUM6CisgKiBNZXNzYWdlIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTXNnIC0gUG9pbnRlciB0byByZWNlaXZlZCBTTUVfU0VUX0NPTlRFWFRfUkVRIG1lc3NhZ2UKKyAqIEByZXR1cm4gdHJ1ZSAgd2hlbiByZWNlaXZlZCBTTUVfU0VUX0NPTlRFWFRfUkVRIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkKKyAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KKwordWludDhfdAorbGltX2lzX3NtZV9zZXRfY29udGV4dF9yZXFfdmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgdHBTaXJTbWVTZXRDb250ZXh0UmVxIHBTZXRDb250ZXh0UmVxKQoreworCXVpbnQ4X3QgaSA9IDA7CisJdWludDhfdCB2YWxpZCA9IHRydWU7CisJdHBTaXJLZXlzIHBLZXkgPSBwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwua2V5OworCisJaWYgKChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlICE9IGVTSVJfRURfV0VQNDApICYmCisJICAgIChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlICE9IGVTSVJfRURfV0VQMTA0KSAmJgorCSAgICAocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSAhPSBlU0lSX0VEX05PTkUpICYmCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwkgICAgKHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5lZFR5cGUgIT0gZVNJUl9FRF9XUEkpICYmCisjZW5kaWYKKwkgICAgIXBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5udW1LZXlzKSB7CisJCS8qKgorCQkgKiBObyBrZXlzIHByZXNlbnQgaW4gY2FzZSBvZiBUS0lQIG9yIENDTVAKKwkJICogTG9nIGVycm9yLgorCQkgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIk5vIGtleXMgcHJlc2VudCBpbiBTTUVfU0VUQ09OVEVYVF9SRVEgZm9yIGVkVHlwZT0lZCIpLAorCQkJcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSk7CisKKwkJdmFsaWQgPSBmYWxzZTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5udW1LZXlzICYmCisJICAgIChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlID09IGVTSVJfRURfTk9ORSkpIHsKKwkJLyoqCisJCSAqIEtleXMgcHJlc2VudCBpbiBjYXNlIG9mIG5vIEVEIHBvbGljeQorCQkgKiBMb2cgZXJyb3IuCisJCSAqLworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgiS2V5cyBwcmVzZW50IGluIFNNRV9TRVRDT05URVhUX1JFUSBmb3IgZWRUeXBlPSVkIiksCisJCQlwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlKTsKKworCQl2YWxpZCA9IGZhbHNlOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSA+PSBlU0lSX0VEX05PVF9JTVBMRU1FTlRFRCkgeworCQkvKioKKwkJICogSW52YWxpZCBlZFR5cGUgaW4gdGhlIG1lc3NhZ2UKKwkJICogTG9nIGVycm9yLgorCQkgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIkludmFsaWQgZWRUeXBlPSVkIGluIFNNRV9TRVRDT05URVhUX1JFUSIpLAorCQkJcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSk7CisKKwkJdmFsaWQgPSBmYWxzZTsKKwkJZ290byBlbmQ7CisJfSBlbHNlIGlmIChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlID4gZVNJUl9FRF9OT05FKSB7CisJCXVpbnQzMl90IHBvaTsKKworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRCwKKwkJCQkgICAgICZwb2kpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMKCJVbmFibGUgdG8gcmV0cmlldmUgUE9JIGZyb20gQ0ZHIikpOworCQl9CisKKwkJaWYgKCFwb2kpIHsKKwkJCS8qKgorCQkJICogUHJpdmFjeSBpcyBub3QgZW5hYmxlZAorCQkJICogSW4gb3JkZXIgdG8gYWxsb3cgbWl4ZWQgbW9kZSBmb3IgR3Vlc3QgYWNjZXNzCisJCQkgKiBhbGxvdyBCU1MgY3JlYXRpb24vam9pbiB3aXRoIG5vIFByaXZhY3kgY2FwYWJpbGl0eQorCQkJICogeWV0IGFkdmVydGlzaW5nIFdQQSBJRQorCQkJICovCisJCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCJQcml2YWN5IGlzIG5vdCBlbmFibGVkLCB5ZXQgbm9uLU5vbmUgRUR0eXBlPSVkIGluIFNNRV9TRVRDT05URVhUX1JFUSIpLAorCQkJCSAgICAgICBwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlKTsKKwkJCSAgICAgICApCisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLm51bUtleXM7IGkrKykgeworCQlpZiAoKChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlID09IGVTSVJfRURfV0VQNDApICYmCisJCSAgICAgKHBLZXktPmtleUxlbmd0aCAhPSA1KSkgfHwKKwkJICAgICgocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSA9PSBlU0lSX0VEX1dFUDEwNCkgJiYKKwkJICAgICAocEtleS0+a2V5TGVuZ3RoICE9IDEzKSkgfHwKKwkJICAgICgocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSA9PSBlU0lSX0VEX1RLSVApICYmCisJCSAgICAgKHBLZXktPmtleUxlbmd0aCAhPSAzMikpIHx8CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwkJICAgICgocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSA9PSBlU0lSX0VEX1dQSSkgJiYKKwkJICAgICAocEtleS0+a2V5TGVuZ3RoICE9IDMyKSkgfHwKKyNlbmRpZgorCQkgICAgKChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlID09IGVTSVJfRURfQ0NNUCkgJiYKKwkJICAgICAocEtleS0+a2V5TGVuZ3RoICE9IDE2KSkpIHsKKwkJCS8qKgorCQkJICogSW52YWxpZCBrZXkgbGVuZ3RoIGZvciBhIGdpdmVuIEVEIHR5cGUKKwkJCSAqIExvZyBlcnJvci4KKwkJCSAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJCUZMCisJCQkJCSgiSW52YWxpZCBrZXlMZW5ndGggPSVkIGZvciBlZFR5cGU9JWQgaW4gU01FX1NFVENPTlRFWFRfUkVRIiksCisJCQkJcEtleS0+a2V5TGVuZ3RoLAorCQkJCXBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5lZFR5cGUpOworCisJCQl2YWxpZCA9IGZhbHNlOworCQkJZ290byBlbmQ7CisJCX0KKwkJcEtleSsrOworCX0KKworZW5kOgorCXJldHVybiB2YWxpZDsKK30gLyoqKiBlbmQgbGltX2lzX3NtZV9zZXRfY29udGV4dF9yZXFfdmFsaWQoKSAqKiovCisKKy8qKgorICogbGltX2lzX3NtZV9zdG9wX2Jzc19yZXFfdmFsaWQoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX1NUT1BfQlNTX1JFUSBtZXNzYWdlIGZyb20gYXBwbGljYXRpb24uCisgKgorICoqKkxPR0lDOgorICogTWVzc2FnZSB2YWxpZGl0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uCisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1zZyAtIFBvaW50ZXIgdG8gcmVjZWl2ZWQgU01FX1NUT1BfQlNTX1JFUSBtZXNzYWdlCisgKiBAcmV0dXJuIHRydWUgIHdoZW4gcmVjZWl2ZWQgU01FX1NUT1BfQlNTX1JFUSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5CisgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICovCisKK3VpbnQ4X3QgbGltX2lzX3NtZV9zdG9wX2Jzc19yZXFfdmFsaWQodWludDMyX3QgKnBNc2cpCit7CisJdWludDhfdCB2YWxpZCA9IHRydWU7CisKKwlyZXR1cm4gdmFsaWQ7Cit9IC8qKiogZW5kIGxpbV9pc19zbWVfc3RvcF9ic3NfcmVxX3ZhbGlkKCkgKioqLworCisvKioKKyAqIGxpbV9nZXRfYnNzX2lkX2Zyb21fc21lX2pvaW5fcmVxX21zZygpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdmFyaW91cyBwbGFjZXMgdG8gZ2V0IEJTU0lECisgKiBmcm9tIEJTUyBkZXNjcmlwdGlvbi9OZWlnaGJvciBCU1MgSW5mbyBpbiB0aGUgU01FX0pPSU5fUkVRLworICogU01FX1JFQVNTT0NfUkVRIG1lc3NhZ2UuCisgKgorICoqKlBBUkFNUzoKKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICAgICBwQnVmICAgLSBQb2ludGVyIHRvIHJlY2VpdmVkIFNNRV9KT0lOL1NNRV9SRUFTU09DX1JFUQorICogICAgICAgICAgICAgICAgICAgICBtZXNzYWdlCisgKiBAcmV0dXJuICAgIHBCc3NJZCAtIFBvaW50ZXIgdG8gQlNTSUQKKyAqLworCit1aW50OF90ICpsaW1fZ2V0X2Jzc19pZF9mcm9tX3NtZV9qb2luX3JlcV9tc2codWludDhfdCAqcEJ1ZikKK3sKKwlpZiAoIXBCdWYpCisJCXJldHVybiBOVUxMOworCisJcEJ1ZiArPSBzaXplb2YodWludDMyX3QpOyAgICAgICAvKiBza2lwIG1lc3NhZ2UgaGVhZGVyICovCisKKwlwQnVmICs9IGxpbV9nZXRfdTE2KHBCdWYpICsgc2l6ZW9mKHVpbnQxNl90KTsgICAgIC8qIHNraXAgUlNOIElFICovCisKKwlwQnVmICs9IHNpemVvZih1aW50MTZfdCk7ICAgICAgIC8qIHNraXAgbGVuZ3RoIG9mIEJTUyBkZXNjcmlwdGlvbiAqLworCisJcmV0dXJuIChwQnVmKTsKK30gLyoqKiBlbmQgbGltX2dldF9ic3NfaWRfZnJvbV9zbWVfam9pbl9yZXFfbXNnKCkgKioqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc21lX3JlcV91dGlscy5oIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc21lX3JlcV91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODkzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zbWVfcmVxX3V0aWxzLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV9zbWVfcmVxX3V0aWxzLmggY29udGFpbnMgdGhlIHV0aWxpdHkgZGVmaW5pdGlvbnMKKyAqIExJTSB1c2VzIHdoaWxlIHByb2Nlc3NpbmcgU01FIHJlcXVlc3QgbWVzc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9fTElNX1NNRV9SRVFfVVRJTFNfSAorI2RlZmluZSBfX0xJTV9TTUVfUkVRX1VUSUxTX0gKKworI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKworLyogTElNIFNNRSByZXF1ZXN0IG1lc3NhZ2VzIHJlbGF0ZWQgdXRpbGl0eSBmdW5jdGlvbnMgKi8KK3VpbnQ4X3QgbGltX2lzX3NtZV9zdGFydF9ic3NfcmVxX3ZhbGlkKHRwQW5pU2lyR2xvYmFsLCB0cFNpclNtZVN0YXJ0QnNzUmVxKTsKK3VpbnQ4X3QgbGltX3NldF9yc19uaWVfd3BfYWllZnJvbV9zbWVfc3RhcnRfYnNzX3JlcV9tZXNzYWdlKHRwQW5pU2lyR2xvYmFsLAorCQkJCQkJCSAgICB0cFNpclJTTmllLCB0cFBFU2Vzc2lvbik7Cit1aW50OF90IGxpbV9pc19zbWVfc2Nhbl9yZXFfdmFsaWQodHBBbmlTaXJHbG9iYWwsIHRwU2lyU21lU2NhblJlcSk7Cit1aW50OF90IGxpbV9pc19zbWVfam9pbl9yZXFfdmFsaWQodHBBbmlTaXJHbG9iYWwsIHRwU2lyU21lSm9pblJlcSk7Cit1aW50OF90IGxpbV9pc19zbWVfZGlzYXNzb2NfcmVxX3ZhbGlkKHRwQW5pU2lyR2xvYmFsLCB0cFNpclNtZURpc2Fzc29jUmVxLAorCQkJCSAgICAgIHRwUEVTZXNzaW9uKTsKK3VpbnQ4X3QgbGltX2lzX3NtZV9kZWF1dGhfcmVxX3ZhbGlkKHRwQW5pU2lyR2xvYmFsLCB0cFNpclNtZURlYXV0aFJlcSwgdHBQRVNlc3Npb24pOwordWludDhfdCBsaW1faXNfc21lX3NldF9jb250ZXh0X3JlcV92YWxpZCh0cEFuaVNpckdsb2JhbCwgdHBTaXJTbWVTZXRDb250ZXh0UmVxKTsKK3VpbnQ4X3QgbGltX2lzX3NtZV9zdG9wX2Jzc19yZXFfdmFsaWQodWludDMyX3QgKik7Cit1aW50OF90ICpsaW1fZ2V0X2Jzc19pZF9mcm9tX3NtZV9qb2luX3JlcV9tc2codWludDhfdCAqKTsKK3VpbnQ4X3QgbGltX2lzX3NtZV9kaXNhc3NvY19jbmZfdmFsaWQodHBBbmlTaXJHbG9iYWwsIHRwU2lyU21lRGlzYXNzb2NDbmYsCisJCQkJICAgICAgdHBQRVNlc3Npb24pOworCisjZW5kaWYgLyogX19MSU1fU01FX1JFUV9VVElMU19IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zdGFfaGFzaF9hcGkuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3N0YV9oYXNoX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NGViYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zdGFfaGFzaF9hcGkuYwpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIGxpbV9zdGFfaGFzaF9hcGkuYzogUHJvdmlkZXMgYWNjZXNzIGZ1bmN0aW9ucyB0byBnZXQvc2V0IHZhbHVlcyBvZiBzdGF0aW9uIGhhc2ggZW50cnkgZmllbGRzLgorICogQXV0aG9yOiAgICBTdW5pdCBCaGF0aWEKKyAqIERhdGU6ICAgICAgIDA5LzE5LzIwMDYKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgTW9kaWZpZWQgYnkgICAgICAgICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAibGltX3N0YV9oYXNoX2FwaS5oIgorCisvKioKKyAqIGxpbV9nZXRfc3RhX2hhc2hfYnNzaWR4KCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBHZXQgdGhlIEJzcyBJbmRleCBvZiB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgU3RhdGlvbi4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgIHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gYXNzb2NJZCBBc3NvY0lEIG9mIHRoZSBTdGF0aW9uLgorICogQHBhcmFtIGJzc2lkeCBwb2ludGVyIHRvIHRoZSBic3MgaW5kZXgsIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLgorICoKKyAqIEByZXR1cm4gc3VjY2VzcyBpZiBHRVQgb3BlcmF0aW9uIGlzIG9rLCBlbHNlIEZhaWx1cmUuCisgKi8KKwordFNpclJldFN0YXR1cyBsaW1fZ2V0X3N0YV9oYXNoX2Jzc2lkeCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBhc3NvY0lkLAorCQkJCSAgICAgIHVpbnQ4X3QgKmJzc2lkeCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0cERwaEhhc2hOb2RlIHBTdGEgPQorCQlkcGhfZ2V0X2hhc2hfZW50cnkocE1hYywgYXNzb2NJZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisJaWYgKHBTdGEgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiaW52YWxpZCBTVEEgJWQiKSwgYXNzb2NJZCk7KQorCQlyZXR1cm4gZVNJUl9MSU1fSU5WQUxJRF9TVEE7CisJfQorCisJKmJzc2lkeCA9ICh1aW50OF90KSBwU3RhLT5ic3NJZDsKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc3RhX2hhc2hfYXBpLmggYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV9zdGFfaGFzaF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTM0MDkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fc3RhX2hhc2hfYXBpLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGZpbGUgbGltX3N0YV9oYXNoX2FwaS5oIGNvbnRhaW5zIHRoZQorICogZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgYWNjZXNzaW5nIHN0YXRpb24gaGFzaCBlbnRyeSBmaWVsZHMuCisgKgorICogQXV0aG9yOiAgICAgIFN1bml0IEJoYXRpYQorICogRGF0ZTogICAgICAgIDA5LzE5LzIwMDYKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTV9TVEFfSEFTSF9BUElfSF9fCisjZGVmaW5lIF9fTElNX1NUQV9IQVNIX0FQSV9IX18KKworI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKwordFNpclJldFN0YXR1cyBsaW1fZ2V0X3N0YV9oYXNoX2Jzc2lkeCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBhc3NvY0lkLAorCQkJCSAgICAgIHVpbnQ4X3QgKmJzc2lkeCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fdGltZXJfdXRpbHMuYyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3RpbWVyX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4ZjdiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3RpbWVyX3V0aWxzLmMKQEAgLTAsMCArMSwxMzU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGxpbV90aW1lcl91dGlscy5jYyBjb250YWlucyB0aGUgdXRpbGl0eSBmdW5jdGlvbnMKKyAqIExJTSB1c2VzIGZvciBoYW5kbGluZyB2YXJpb3VzIHRpbWVycy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzEzLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2Fzc29jX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX3NlY3VyaXR5X3V0aWxzLmgiCisKKy8qIGNoYW5uZWwgU3dpdGNoIFRpbWVyIGluIHRpY2tzICovCisjZGVmaW5lIExJTV9DSEFOTkVMX1NXSVRDSF9USU1FUl9USUNLUyAgICAgICAgICAgMQorLyogTGltIFF1aXRlIHRpbWVyIGluIHRpY2tzICovCisjZGVmaW5lIExJTV9RVUlFVF9USU1FUl9USUNLUyAgICAgICAgICAgICAgICAgICAgMTAwCisvKiBMaW0gUXVpdGUgQlNTIHRpbWVyIGludGVydmFsIGluIHRpY2tzICovCisjZGVmaW5lIExJTV9RVUlFVF9CU1NfVElNRVJfVElDSyAgICAgICAgICAgICAgICAgMTAwCisvKiBMaW0gS2VlcEFsaXZlIHRpbWVyIGRlZmF1bHQgKDMwMDApbXMgKi8KKyNkZWZpbmUgTElNX0tFRVBBTElWRV9USU1FUl9NUyAgICAgICAgICAgICAgICAgICAzMDAwCisvKiBMaW0gSm9pblByb2JlUmVxdWVzdCBSZXRyeSAgdGltZXIgZGVmYXVsdCAoMjAwKW1zICovCisjZGVmaW5lIExJTV9KT0lOX1BST0JFX1JFUV9USU1FUl9NUyAgICAgICAgICAgICAgMjAwCisKKy8qIFRoaXMgdGltZXIgaXMgYSBwZXJpb2RpYyB0aW1lciB3aGljaCBleHBpcmVzIGF0IGV2ZXJ5IDEgc2VjIHRvCisgICBjb252ZXJ0ICBBQ1RJVkUgREZTIGNoYW5uZWwgdG8gREZTIGNoYW5uZWxzICovCisjZGVmaW5lIEFDVElWRV9UT19QQVNTSVZFX0NPTlZFUklTT05fVElNRU9VVCAgICAgMTAwMAorCitzdGF0aWMgYm9vbAorbGltX2NyZWF0ZV9ub25fYXBfdGltZXJzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDMyX3QgY2ZnVmFsdWU7CisJLyogQ3JlYXRlIENoYW5uZWwgU3dpdGNoIFRpbWVyICovCisJaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQ2hhbm5lbFN3aXRjaFRpbWVyLAorCQkJICAgICJDSEFOTkVMIFNXSVRDSCBUSU1FUiIsCisJCQkgICAgbGltX2NoYW5uZWxfc3dpdGNoX3RpbWVyX2hhbmRsZXIsIDAsCisJCQkgICAgTElNX0NIQU5ORUxfU1dJVENIX1RJTUVSX1RJQ0tTLAorCQkJICAgIDAsIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImZhaWxlZCB0byBjcmVhdGUgQ2ggU3dpdGNoIHRpbWVyIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qIENyZWF0ZSBRdWlldCBUaW1lcgorCSAqIFRoaXMgaXMgdXNlZCBvbiB0aGUgU1RBIHRvIGdvIGFuZCBzaHV0LW9mZiBUeC9SeCAiYWZ0ZXIiIHRoZQorCSAqIHNwZWNpZmllZCBxdWl0ZUludGVydmFsCisJICovCisJaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRUaW1lciwKKwkJCSAgICAiUVVJRVQgVElNRVIiLCBsaW1fcXVpZXRfdGltZXJfaGFuZGxlciwKKwkJCSAgICBTSVJfTElNX1FVSUVUX1RJTUVPVVQsIExJTV9RVUlFVF9USU1FUl9USUNLUywKKwkJCSAgICAwLCBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJmYWlsZWQgdG8gY3JlYXRlIFF1aWV0IEJlZ2luIFRpbWVyIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qIENyZWF0ZSBRdWlldCBCU1MgVGltZXIKKwkgKiBBZnRlciB0aGUgc3BlY2lmaWVkIHF1aXRlSW50ZXJ2YWwsIGRldGVybWluZWQgYnkgZ0xpbVF1aWV0VGltZXIsIHRoaXMKKwkgKiB0aW1lciwgZ0xpbVF1aWV0QnNzVGltZXIsIHRyaWdnZXIgYW5kIHB1dCB0aGUgU1RBIHRvIHNsZWVwIGZvciB0aGUKKwkgKiBzcGVjaWZpZWQgZ0xpbVF1aWV0RHVyYXRpb24KKwkgKi8KKwlpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyLAorCQkJICAgICJRVUlFVCBCU1MgVElNRVIiLCBsaW1fcXVpZXRfYnNzX3RpbWVyX2hhbmRsZXIsCisJCQkgICAgU0lSX0xJTV9RVUlFVF9CU1NfVElNRU9VVCwgTElNX1FVSUVUX0JTU19USU1FUl9USUNLLAorCQkJICAgIDAsIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImZhaWxlZCB0byBjcmVhdGUgUXVpZXQgQnNzIFRpbWVyIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVCwKKwkJCSAgICAgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgSm9pbkZhaWx1cmVUaW1lb3V0IHZhbHVlIikpOworCWNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKwkvKiBDcmVhdGUgSm9pbiBmYWlsdXJlIHRpbWVyIGFuZCBhY3RpdmF0ZSBpdCBsYXRlciAqLworCWlmICh0eF90aW1lcl9jcmVhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUpvaW5GYWlsdXJlVGltZXIsCisJCQkgICAgIkpPSU4gRkFJTFVSRSBUSU1FT1VUIiwKKwkJCSAgICBsaW1fdGltZXJfaGFuZGxlciwgU0lSX0xJTV9KT0lOX0ZBSUxfVElNRU9VVCwKKwkJCSAgICBjZmdWYWx1ZSwgMCwKKwkJCSAgICBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykgeworCQkvKiAvIENvdWxkIG5vdCBjcmVhdGUgSm9pbiBmYWlsdXJlIHRpbWVyLiAqLworCQkvKiBMb2cgZXJyb3IgKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCBjcmVhdGUgSm9pbiBmYWlsdXJlIHRpbWVyIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qIFNlbmQgdW5pY2FzdCBwcm9iZSByZXEgZnJhbWUgZXZlcnkgMjAwIG1zICovCisJaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUGVyaW9kaWNKb2luUHJvYmVSZXFUaW1lciwKKwkJCSAgICAiUGVyaW9kaWMgSm9pbiBQcm9iZSBSZXF1ZXN0IFRpbWVyIiwKKwkJCSAgICBsaW1fdGltZXJfaGFuZGxlciwKKwkJCSAgICBTSVJfTElNX1BFUklPRElDX0pPSU5fUFJPQkVfUkVRX1RJTUVPVVQsCisJCQkgICAgU1lTX01TX1RPX1RJQ0tTKExJTV9KT0lOX1BST0JFX1JFUV9USU1FUl9NUyksIDAsCisJCQkgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCBjcmVhdGUgUGVyaW9kaWMgSm9pbiBQcm9iZSBSZXF1ZXN0IHRtciIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VULAorCQkJICAgICAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBBc3NvY0ZhaWx1cmVUaW1lb3V0IHZhbHVlIikpOworCisJY2ZnVmFsdWUgPSBTWVNfTVNfVE9fVElDS1MoY2ZnVmFsdWUpOworCS8qIENyZWF0ZSBBc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyIGFuZCBhY3RpdmF0ZSBpdCBsYXRlciAqLworCWlmICh0eF90aW1lcl9jcmVhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFzc29jRmFpbHVyZVRpbWVyLAorCQkJICAgICJBU1NPQyBGQUlMVVJFIFRJTUVPVVQiLAorCQkJICAgIGxpbV9hc3NvY19mYWlsdXJlX3RpbWVyX2hhbmRsZXIsIExJTV9BU1NPQywKKwkJCSAgICBjZmdWYWx1ZSwgMCwgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCBjcmVhdGUgQXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lciIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1JFQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VULAorCQkJICAgICAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBSZWFzc29jRmFpbHVyZVRpbWVvdXQgdmFsdWUiKSk7CisKKwljZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisJLyogQ3JlYXRlIEFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIgYW5kIGFjdGl2YXRlIGl0IGxhdGVyICovCisJaWYgKHR4X3RpbWVyX2NyZWF0ZQorCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZWFzc29jRmFpbHVyZVRpbWVyLAorCQkgICAgIlJFQVNTT0MgRkFJTFVSRSBUSU1FT1VUIiwgbGltX2Fzc29jX2ZhaWx1cmVfdGltZXJfaGFuZGxlciwKKwkJICAgIExJTV9SRUFTU09DLCBjZmdWYWx1ZSwgMCwgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCBjcmVhdGUgUmVhc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19BRERUU19SU1BfVElNRU9VVCwgJmNmZ1ZhbHVlKQorCQkJICAgICAhPSBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJGYWlsIHRvIGdldCBXTklfQ0ZHX0FERFRTX1JTUF9USU1FT1VUICIpKTsKKworCWNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKworCS8qIENyZWF0ZSBBZGR0cyByZXNwb25zZSB0aW1lciBhbmQgYWN0aXZhdGUgaXQgbGF0ZXIgKi8KKwlpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1BZGR0c1JzcFRpbWVyLAorCQkJICAgICJBRERUUyBSU1AgVElNRU9VVCIsCisJCQkgICAgbGltX2FkZHRzX3Jlc3BvbnNlX3RpbWVyX2hhbmRsZXIsCisJCQkgICAgU0lSX0xJTV9BRERUU19SU1BfVElNRU9VVCwKKwkJCSAgICBjZmdWYWx1ZSwgMCwgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCBjcmVhdGUgQWRkdHMgcmVzcG9uc2UgdGltZXIiKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVQsCisJCQkgICAgICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKQorCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIEF1dGhGYWlsdXJlVGltZW91dCB2YWx1ZSIpKTsKKworCWNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKwkvKiBDcmVhdGUgQXV0aCBmYWlsdXJlIHRpbWVyIGFuZCBhY3RpdmF0ZSBpdCBsYXRlciAqLworCWlmICh0eF90aW1lcl9jcmVhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUF1dGhGYWlsdXJlVGltZXIsCisJCQkgICAgIkFVVEggRkFJTFVSRSBUSU1FT1VUIiwKKwkJCSAgICBsaW1fdGltZXJfaGFuZGxlciwKKwkJCSAgICBTSVJfTElNX0FVVEhfRkFJTF9USU1FT1VULAorCQkJICAgIGNmZ1ZhbHVlLCAwLCBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgY3JlYXRlIEF1dGggZmFpbHVyZSB0aW1lciIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VULAorCQkJICAgICAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBQUk9CRV9BRlRFUl9IQl9GQUlMX1RJTUVPVVQgdmFsdWUiKSk7CisKKwkvKiBDaGFuZ2UgdGltZXIgdG8gcmVhY3RpdmF0ZSBpdCBpbiBmdXR1cmUgKi8KKwljZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisJaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUHJvYmVBZnRlckhCVGltZXIsCisJCQkgICAgIlByb2JlIGFmdGVyIEhlYXJ0YmVhdCBUSU1FT1VUIiwKKwkJCSAgICBsaW1fdGltZXJfaGFuZGxlciwKKwkJCSAgICBTSVJfTElNX1BST0JFX0hCX0ZBSUxVUkVfVElNRU9VVCwKKwkJCSAgICBjZmdWYWx1ZSwgMCwgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgidW5hYmxlIHRvIGNyZWF0ZSBQcm9iZUFmdGVySEJUaW1lciIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorLyoqCisgKiBsaW1fY3JlYXRlX3RpbWVycygpCisgKgorICogQHBNYWMgOiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiByZWNlaXZpbmcKKyAqIDEuIFNNRV9TVEFSVF9SRVEgZm9yIFNUQSBpbiBFU1Mgcm9sZQorICogMi4gU01FX1NUQVJUX0JTU19SRVEgZm9yIEFQIHJvbGUgJiBTVEEgaW4gSUJTUyByb2xlCisgKgorICogQHJldHVybiA6IHN0YXR1cyBvZiBvcGVyYXRpb24KKyAqLworCit1aW50MzJfdCBsaW1fY3JlYXRlX3RpbWVycyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQzMl90IGNmZ1ZhbHVlLCBpID0gMDsKKwl1aW50MzJfdCBjZmdWYWx1ZTE7CisKKwlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLAorCSAgICAgICBGTCgiQ3JlYXRpbmcgVGltZXJzIHVzZWQgYnkgTElNIG1vZHVsZSBpbiBSb2xlICVkIiksCisJICAgICAgIHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSk7KQorCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19BQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUsCisJCQkgICAgICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgTWluQ2hhbm5lbFRpbWVvdXQgdmFsdWUiKSk7CisJfQorCWNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKwkvKiBQZXJpb2RpYyBwcm9iZSByZXF1ZXN0IHRpbWVyIHZhbHVlIGlzIGhhbGYgb2YgdGhlIE1pbiBjaGFubmVsCisJICogdGltZXIuIFByb2JlIHJlcXVlc3Qgc2VuZHMgcGVyaW9kaWNhbGx5IHRpbGwgbWluL21heCBjaGFubmVsCisJICogdGltZXIgZXhwaXJlcworCSAqLworCWNmZ1ZhbHVlMSA9IGNmZ1ZhbHVlIC8gMjsKKwkvKiBDcmVhdGUgcGVyaW9kaWMgcHJvYmUgcmVxdWVzdCB0aW1lciBhbmQgYWN0aXZhdGUgdGhlbSBsYXRlciAqLworCWlmIChjZmdWYWx1ZTEgPj0gMQorCSAgICAmJiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY1Byb2JlUmVxVGltZXIsCisJCSJQZXJpb2RpYyBQcm9iZSBSZXF1ZXN0IFRpbWVyIiwgbGltX3RpbWVyX2hhbmRsZXIsCisJCVNJUl9MSU1fUEVSSU9ESUNfUFJPQkVfUkVRX1RJTUVPVVQsIGNmZ1ZhbHVlMSwgMCwKKwkJVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJjb3VsZCBub3QgY3JlYXRlIHBlcmlvZGljIHByb2JlIHRpbWVyIikpOworCQlnb3RvIGVycl90aW1lcjsKKwl9CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0FDVElWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSwKKwkJCSAgICAgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJjb3VsZCBub3QgcmV0cmlldmUgTUFYQ2hhbm5lbFRpbWVvdXQgdmFsdWUiKSk7CisKKwljZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisJLyogTGltaXRpbmcgbWF4IG51bW0gb2YgcHJvYmUgcmVxIGZvciBlYWNoIGNoYW5uZWwgc2NhbiAqLworCXBNYWMtPmxpbS5tYXhQcm9iZSA9IChjZmdWYWx1ZSAvIGNmZ1ZhbHVlMSk7CisKKwlpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkKKwkJaWYgKGZhbHNlID09IGxpbV9jcmVhdGVfbm9uX2FwX3RpbWVycyhwTWFjKSkKKwkJCWdvdG8gZXJyX3RpbWVyOworCisJY2ZnVmFsdWUgPSBTWVNfTVNfVE9fVElDS1MoTElNX0hBU0hfTUlTU19USU1FUl9NUyk7CisKKwlpZiAodHhfdGltZXJfY3JlYXRlKAorCQkmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltU2VuZERpc2Fzc29jRnJhbWVUaHJlc2hvbGRUaW1lciwKKwkJIkRpc2Fzc29jIHRocm90dGxlIFRJTUVPVVQiLAorCQlsaW1fc2VuZF9kaXNhc3NvY19mcmFtZV90aHJlc2hvbGRfaGFuZGxlciwKKwkJU0lSX0xJTV9IQVNIX01JU1NfVEhSRVNfVElNRU9VVCwgY2ZnVmFsdWUsIGNmZ1ZhbHVlLAorCQlUWF9BVVRPX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJjcmVhdGUgRGlzYXNzb2NpYXRlIHRocm90dGxlIHRpbWVyIGZhaWxlZCIpKTsKKwkJZ290byBlcnJfdGltZXI7CisJfQorCVBFTE9HMShsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJDcmVhdGVkIERpc2Fzc29jaWF0ZSB0aHJvdHRsZSB0aW1lciAiKSk7KQorCisJLyogQ3JlYXRlIGFsbCBDTkZfV0FJVCBUaW1lcnMgdXBmcm9udCAqLworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfV1RfQ05GX1RJTUVPVVQsICZjZmdWYWx1ZSkKKwkJIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBDTkYgdGltZW91dCB2YWx1ZSIpKTsKKwl9CisKKwljZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisJZm9yIChpID0gMDsgaSA8IChwTWFjLT5saW0ubWF4U3RhdGlvbiArIDEpOyBpKyspIHsKKwkJaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5ncExpbUNuZldhaXRUaW1lcltpXSwKKwkJCQkgICAgIkNORl9NSVNTX1RJTUVPVVQiLAorCQkJCSAgICBsaW1fY25mX3dhaXRfdG1lcl9oYW5kbGVyLAorCQkJCSAgICAodWludDMyX3QpIGksIGNmZ1ZhbHVlLAorCQkJCSAgICAwLCBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiQ2Fubm90IGNyZWF0ZSBDTkYgd2FpdCB0aW1lciIpKTsKKwkJCWdvdG8gZXJyX3RpbWVyOworCQl9CisJfQorCisJLyogQWxsb2MgYW5kIGluaXQgdGFibGUgZm9yIHRoZSBwcmVBdXRoIHRpbWVyIGxpc3QgKi8KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX01BWF9OVU1fUFJFX0FVVEgsCisJCQkgICAgICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKQorCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgbWFjIHByZWF1dGggdmFsdWUiKSk7CisJcE1hYy0+bGltLmdMaW1QcmVBdXRoVGltZXJUYWJsZS5udW1FbnRyeSA9IGNmZ1ZhbHVlOworCXBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUucFRhYmxlID0KKwkJY2RmX21lbV9tYWxsb2MoY2ZnVmFsdWUgKiBzaXplb2YodExpbVByZUF1dGhOb2RlKSk7CisKKwlpZiAocE1hYy0+bGltLmdMaW1QcmVBdXRoVGltZXJUYWJsZS5wVGFibGUgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJBbGxvY2F0ZU1lbW9yeSBmYWlsZWQhIikpOworCQlnb3RvIGVycl90aW1lcjsKKwl9CisKKwlsaW1faW5pdF9wcmVfYXV0aF90aW1lcl90YWJsZShwTWFjLCAmcE1hYy0+bGltLmdMaW1QcmVBdXRoVGltZXJUYWJsZSk7CisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoImFsbG9jIGFuZCBpbml0IHRhYmxlIGZvciBwcmVBdXRoIHRpbWVycyIpKTspCisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX09MQkNfREVURUNUX1RJTUVPVVQsCisJCQkgICAgICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKQorCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIE9MQkQgZGV0ZWN0IHRpbWVvdXQgdmFsdWUiKSk7CisKKwljZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisJaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltVXBkYXRlT2xiY0NhY2hlVGltZXIsCisJCQkgICAgIk9MQkMgVVBEQVRFIENBQ0hFIFRJTUVPVVQiLAorCQkJICAgIGxpbV91cGRhdGVfb2xiY19jYWNoZV90aW1lcl9oYW5kbGVyLAorCQkJICAgIFNJUl9MSU1fVVBEQVRFX09MQkNfQ0FDSEVMX1RJTUVPVVQsIGNmZ1ZhbHVlLAorCQkJICAgIGNmZ1ZhbHVlLCBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJDYW5ub3QgY3JlYXRlIHVwZGF0ZSBPTEJDIGNhY2hlIHRtciIpKTsKKwkJZ290byBlcnJfdGltZXI7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJLyogSW4gZnV0dXJlIHdlIG5lZWQgdG8gdXNlIHRoZSBhdXRoIHRpbWVyLCBjYXVzZSB0aGUgcHJlIGF1dGggc2Vzc2lvbgorCSAqIHdpbGwgYmUgaW50cm9kdWNlZCBiZWZvcmUgc2VuZGluZyBBdXRoIGZyYW1lLiBXZSBuZWVkIHRvIGdvIG9mZgorCSAqIGNoYW5uZWwgYW5kIGNvbWUgYmFjayB0byBob21lIGNoYW5uZWwKKwkgKi8KKwljZmdWYWx1ZSA9IDEwMDA7CisJY2ZnVmFsdWUgPSBTWVNfTVNfVE9fVElDS1MoY2ZnVmFsdWUpOworCWlmICh0eF90aW1lcl9jcmVhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUZUUHJlQXV0aFJzcFRpbWVyLAorCQkJICAgICJGVCBQUkVBVVRIIFJTUCBUSU1FT1VUIiwKKwkJCSAgICBsaW1fdGltZXJfaGFuZGxlciwgU0lSX0xJTV9GVF9QUkVBVVRIX1JTUF9USU1FT1VULAorCQkJICAgIGNmZ1ZhbHVlLCAwLCBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgY3JlYXRlIEpvaW4gZmFpbHVyZSB0aW1lciIpKTsKKwkJZ290byBlcnJfdGltZXI7CisJfQorI2VuZGlmCisJY2ZnVmFsdWUgPSAxMDAwOworCWNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKwlpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZW1haW5PbkNoYW5uZWxUaW1lciwKKwkJCSAgICAiRlQgUFJFQVVUSCBSU1AgVElNRU9VVCIsCisJCQkgICAgbGltX3RpbWVyX2hhbmRsZXIsIFNJUl9MSU1fUkVNQUlOX0NITl9USU1FT1VULAorCQkJICAgIGNmZ1ZhbHVlLCAwLCBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgY3JlYXRlIEpvaW4gZmFpbHVyZSB0aW1lciIpKTsKKwkJZ290byBlcnJfdGltZXI7CisJfQorCisJY2ZnVmFsdWUgPSAxMDAwOworCWNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKwlpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1EaXNhc3NvY0Fja1RpbWVyLAorCQkJICAgICJESVNBU1NPQyBBQ0sgVElNRU9VVCIsCisJCQkgICAgbGltX3RpbWVyX2hhbmRsZXIsIFNJUl9MSU1fRElTQVNTT0NfQUNLX1RJTUVPVVQsCisJCQkgICAgY2ZnVmFsdWUsIDAsIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCBESVNBU1NPQyBBQ0sgVElNRU9VVCB0aW1lciIpKTsKKwkJZ290byBlcnJfdGltZXI7CisJfQorCisJY2ZnVmFsdWUgPSAxMDAwOworCWNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKwlpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1EZWF1dGhBY2tUaW1lciwKKwkJCSAgICAiRElTQVNTT0MgQUNLIFRJTUVPVVQiLAorCQkJICAgIGxpbV90aW1lcl9oYW5kbGVyLCBTSVJfTElNX0RFQVVUSF9BQ0tfVElNRU9VVCwKKwkJCSAgICBjZmdWYWx1ZSwgMCwgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCBjcmVhdGUgREVBVVRIIEFDSyBUSU1FT1VUIHRpbWVyIikpOworCQlnb3RvIGVycl90aW1lcjsKKwl9CisKKwkvKiAoPiBubyBvZiBCSSogbm8gb2YgVFVzIHBlciBCSSAqIDFUVSBpbiBtc2VjICsKKwkgKiBwMnAgc3RhcnQgdGltZSBvZmZzZXQqMSBUVSBpbiBtc2VjID0gMioxMDAqMS4wMjQgKyA1KjEuMDI0CisJICogPSAyMDQuOCArIDUuMTIgPSAyMDkuMjApCisJICovCisJY2ZnVmFsdWUgPSBMSU1fSU5TRVJUX1NJTkdMRVNIT1ROT0FfVElNRU9VVF9WQUxVRTsKKwljZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisJaWYgKHR4X3RpbWVyX2NyZWF0ZSgKKwkJJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVAycFNpbmdsZVNob3ROb2FJbnNlcnRUaW1lciwKKwkJIlNpbmdsZSBTaG90IE5PQSBJbnNlcnQgdGltZW91dCIsIGxpbV90aW1lcl9oYW5kbGVyLAorCQlTSVJfTElNX0lOU0VSVF9TSU5HTEVTSE9UX05PQV9USU1FT1VULCBjZmdWYWx1ZSwgMCwKKwkJVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIkNhbid0IGNyZWF0ZSBTaW5nbGUgU2hvdCBOT0EgSW5zZXJ0IFRpbWVvdXQgdG1yIikpOworCQlnb3RvIGVycl90aW1lcjsKKwl9CisKKwljZmdWYWx1ZSA9IEFDVElWRV9UT19QQVNTSVZFX0NPTlZFUklTT05fVElNRU9VVDsKKwljZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisJaWYgKHR4X3RpbWVyX2NyZWF0ZSgKKwkJJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFjdGl2ZVRvUGFzc2l2ZUNoYW5uZWxUaW1lciwKKwkJIkFDVElWRSBUTyBQQVNTSVZFIENIQU5ORUwiLCBsaW1fdGltZXJfaGFuZGxlciwKKwkJU0lSX0xJTV9DT05WRVJUX0FDVElWRV9DSEFOTkVMX1RPX1BBU1NJVkUsIGNmZ1ZhbHVlLCAwLAorCQlUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgiY291bGQgbm90IGNyZWF0ZSB0aW1lciBmb3IgcGFzc2l2ZSBjaGFubmVsIHRvIGFjdGl2ZSBjaGFubmVsIikpOworCQlnb3RvIGVycl90aW1lcjsKKwl9CisKKwlyZXR1cm4gVFhfU1VDQ0VTUzsKKworZXJyX3RpbWVyOgorCXR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltRGVhdXRoQWNrVGltZXIpOworCXR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltRGlzYXNzb2NBY2tUaW1lcik7CisJdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZW1haW5PbkNoYW5uZWxUaW1lcik7CisJdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1GVFByZUF1dGhSc3BUaW1lcik7CisJdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1VcGRhdGVPbGJjQ2FjaGVUaW1lcik7CisJd2hpbGUgKCgoaW50MzJfdCktLSBpKSA+PSAwKSB7CisJCXR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5ncExpbUNuZldhaXRUaW1lcltpXSk7CisJfQorCXR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy4KKwkJCWdMaW1TZW5kRGlzYXNzb2NGcmFtZVRocmVzaG9sZFRpbWVyKTsKKwl0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVByb2JlQWZ0ZXJIQlRpbWVyKTsKKwl0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUF1dGhGYWlsdXJlVGltZXIpOworCXR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQWRkdHNSc3BUaW1lcik7CisJdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZWFzc29jRmFpbHVyZVRpbWVyKTsKKwl0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFzc29jRmFpbHVyZVRpbWVyKTsKKwl0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUpvaW5GYWlsdXJlVGltZXIpOworCXR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUGVyaW9kaWNKb2luUHJvYmVSZXFUaW1lcik7CisJdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyKTsKKwl0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0VGltZXIpOworCXR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQ2hhbm5lbFN3aXRjaFRpbWVyKTsKKwl0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVBlcmlvZGljUHJvYmVSZXFUaW1lcik7CisJdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QMnBTaW5nbGVTaG90Tm9hSW5zZXJ0VGltZXIpOworCXR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQWN0aXZlVG9QYXNzaXZlQ2hhbm5lbFRpbWVyKTsKKworCWlmIChOVUxMICE9IHBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUucFRhYmxlKSB7CisJCWNkZl9tZW1fZnJlZShwTWFjLT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlLnBUYWJsZSk7CisJCXBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUucFRhYmxlID0gTlVMTDsKKwl9CisJcmV0dXJuIFRYX1RJTUVSX0VSUk9SOworfSAvKioqKioqIGVuZCBsaW1fY3JlYXRlX3RpbWVycygpICoqKioqKi8KKworLyoqCisgKiBsaW1fdGltZXJfaGFuZGxlcigpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbgorICogMS4gTUlOX0NIQU5ORUwsIE1BWF9DSEFOTkVMIHRpbWVyIGV4cGlyYXRpb24gZHVyaW5nIHNjYW5uaW5nCisgKiAyLiBKT0lOX0ZBSUxVUkUgdGltZXIgZXhwaXJhdGlvbiB3aGlsZSBqb2luaW5nIGEgQlNTCisgKiAzLiBBVVRIX0ZBSUxVUkUgdGltZXIgZXhwaXJhdGlvbiB3aGlsZSBhdXRoZW50aWNhdGluZyB3aXRoIGEgcGVlcgorICogNC4gSGVhcnRiZWF0IHRpbWVyIGV4cGlyYXRpb24gb24gU1RBCisgKiA1LiBCYWNrZ3JvdW5kIHNjYW4gdGltZXIgZXhwaXJhdGlvbiBvbiBTVEEKKyAqIDYuIEFJRCByZWxlYXNlLCBQcmUtYXV0aCBjbGVhbnVwIGFuZCBMaW5rIG1vbml0b3JpbmcgdGltZXIKKyAqICAgIGV4cGlyYXRpb24gb24gQVAKKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwYXJhbSAtIE1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgdGltZXIgdGhhdCBleHBpcmVkCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1fdGltZXJfaGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB1aW50MzJfdCBwYXJhbSkKK3sKKwl1aW50MzJfdCBzdGF0dXNDb2RlOworCXRTaXJNc2dRIG1zZzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSBwTWFjR2xvYmFsOworCisJLyogUHJlcGFyZSBhbmQgcG9zdCBtZXNzYWdlIHRvIExJTSBNZXNzYWdlIFF1ZXVlICovCisKKwltc2cudHlwZSA9ICh1aW50MTZfdCkgcGFyYW07CisJbXNnLmJvZHlwdHIgPSBOVUxMOworCW1zZy5ib2R5dmFsID0gMDsKKworCWlmICgoc3RhdHVzQ29kZSA9IGxpbV9wb3N0X21zZ19hcGkocE1hYywgJm1zZykpICE9IGVTSVJfU1VDQ0VTUykKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInBvc3RpbmcgbWVzc2FnZSAlWCB0byBMSU0gZmFpbGVkLCByZWFzb249JWQiKSwKKwkJCW1zZy50eXBlLCBzdGF0dXNDb2RlKTsKK30gLyoqKioqKiBlbmQgbGltX3RpbWVyX2hhbmRsZXIoKSAqKioqKiovCisKKy8qKgorICogbGltX2FkZHRzX3Jlc3BvbnNlX3RpbWVyX2hhbmRsZXIoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24gQWRkdHMgcmVzcG9uc2UgdGltZXIgZXhwaXJhdGlvbiBvbiBzdGEKKyAqCisgKioqTE9HSUM6CisgKiBNZXNzYWdlIFNJUl9MSU1fQUREVFNfUlNQX1RJTUVPVVQgaXMgcG9zdGVkIHRvIGdTaXJMaW1Nc2dRCisgKiB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuCisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwYXJhbSAtIHBvaW50ZXIgdG8gcHJlLWF1dGggbm9kZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX2FkZHRzX3Jlc3BvbnNlX3RpbWVyX2hhbmRsZXIodm9pZCAqcE1hY0dsb2JhbCwgdWludDMyX3QgcGFyYW0pCit7CisJdFNpck1zZ1EgbXNnOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpIHBNYWNHbG9iYWw7CisKKwkvKiBQcmVwYXJlIGFuZCBwb3N0IG1lc3NhZ2UgdG8gTElNIE1lc3NhZ2UgUXVldWUgKi8KKworCW1zZy50eXBlID0gU0lSX0xJTV9BRERUU19SU1BfVElNRU9VVDsKKwltc2cuYm9keXZhbCA9IHBhcmFtOworCW1zZy5ib2R5cHRyID0gTlVMTDsKKworCWxpbV9wb3N0X21zZ19hcGkocE1hYywgJm1zZyk7Cit9IC8qKioqKiogZW5kIGxpbV9hdXRoX3Jlc3BvbnNlX3RpbWVyX2hhbmRsZXIoKSAqKioqKiovCisKKy8qKgorICogbGltX2F1dGhfcmVzcG9uc2VfdGltZXJfaGFuZGxlcigpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiBBdXRoIHJlc3BvbnNlIHRpbWVyIGV4cGlyYXRpb24gb24gQVAKKyAqCisgKioqTE9HSUM6CisgKiBNZXNzYWdlIFNJUl9MSU1fQVVUSF9SU1BfVElNRU9VVCBpcyBwb3N0ZWQgdG8gZ1NpckxpbU1zZ1EKKyAqIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZC4KKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBhcmFtIC0gcG9pbnRlciB0byBwcmUtYXV0aCBub2RlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1fYXV0aF9yZXNwb25zZV90aW1lcl9oYW5kbGVyKHZvaWQgKnBNYWNHbG9iYWwsIHVpbnQzMl90IHBhcmFtKQoreworCXRTaXJNc2dRIG1zZzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSBwTWFjR2xvYmFsOworCisJLyogUHJlcGFyZSBhbmQgcG9zdCBtZXNzYWdlIHRvIExJTSBNZXNzYWdlIFF1ZXVlICovCisKKwltc2cudHlwZSA9IFNJUl9MSU1fQVVUSF9SU1BfVElNRU9VVDsKKwltc2cuYm9keXB0ciA9IE5VTEw7CisJbXNnLmJvZHl2YWwgPSAodWludDMyX3QpIHBhcmFtOworCisJbGltX3Bvc3RfbXNnX2FwaShwTWFjLCAmbXNnKTsKK30gLyoqKioqKiBlbmQgbGltX2F1dGhfcmVzcG9uc2VfdGltZXJfaGFuZGxlcigpICoqKioqKi8KKworLyoqCisgKiBsaW1fYXNzb2NfZmFpbHVyZV90aW1lcl9oYW5kbGVyKCkKKyAqCisgKiBAbWFjX2dsb2JhbCAgOiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICAgICAgOiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFzc29jIG9yIHJlYXNzb2MgZmFpbHVyZSB0aW1lb3V0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiBSZS9Bc3NvYyBmYWlsdXJlIHRpbWVyIGV4cGlyYXRpb24gb24gU1RBLgorICogTWVzc2FnZSBTSVJfTElNX0FTU09DX0ZBSUxfVElNRU9VVCBpcyBwb3N0ZWQgdG8gZ1NpckxpbU1zZ1Egd2hlbiB0aGlzCisgKiBmdW5jdGlvbiBpcyBleGVjdXRlZC4KKyAqCisgKiBSZXR1cm4gdm9pZAorICovCit2b2lkIGxpbV9hc3NvY19mYWlsdXJlX3RpbWVyX2hhbmRsZXIodm9pZCAqbWFjX2dsb2JhbCwgdWludDMyX3QgcGFyYW0pCit7CisJdFNpck1zZ1EgbXNnOworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSAodHBBbmlTaXJHbG9iYWwpIG1hY19nbG9iYWw7CisJdHBQRVNlc3Npb24gc2Vzc2lvbiA9IE5VTEw7CisKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwlzZXNzaW9uID0gbWFjX2N0eC0+bGltLnBTZXNzaW9uRW50cnk7CisJaWYgKExJTV9SRUFTU09DID09IHBhcmFtICYmIE5VTEwgIT0gc2Vzc2lvbgorCSAgICAmJiBzZXNzaW9uLT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9GVF9SRUFTU09DX1JTUF9TVEFURSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJSZWFzc29jIHRpbWVvdXQgaGFwcGVuZWQiKSk7CisJCWlmIChtYWNfY3R4LT5saW0ucmVBc3NvY1JldHJ5QXR0ZW1wdCA8CisJCSAgICBMSU1fTUFYX1JFQVNTT0NfUkVUUllfTElNSVQpIHsKKwkJCWxpbV9zZW5kX3JldHJ5X3JlYXNzb2NfcmVxX2ZyYW1lKG1hY19jdHgsCisJCQkgICAgc2Vzc2lvbi0+cExpbU1sbVJlYXNzb2NSZXRyeVJlcSwgc2Vzc2lvbik7CisJCQltYWNfY3R4LT5saW0ucmVBc3NvY1JldHJ5QXR0ZW1wdCsrOworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJSZWFzc29jIHJlcXVlc3QgcmV0cnkgaXMgc2VudCAlZCB0aW1lcyIpLAorCQkJCW1hY19jdHgtPmxpbS5yZUFzc29jUmV0cnlBdHRlbXB0KTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiUmVhc3NvYyByZXF1ZXN0IHJldHJ5IE1BWCglZCkgcmVhY2hlZCIpLAorCQkJCUxJTV9NQVhfUkVBU1NPQ19SRVRSWV9MSU1JVCk7CisJCQlpZiAoTlVMTCAhPSBzZXNzaW9uLT5wTGltTWxtUmVhc3NvY1JldHJ5UmVxKSB7CisJCQkJY2RmX21lbV9mcmVlKHNlc3Npb24tPnBMaW1NbG1SZWFzc29jUmV0cnlSZXEpOworCQkJCXNlc3Npb24tPnBMaW1NbG1SZWFzc29jUmV0cnlSZXEgPSBOVUxMOworCQkJfQorCQl9CisJfQorI2VuZGlmCisJLyogUHJlcGFyZSBhbmQgcG9zdCBtZXNzYWdlIHRvIExJTSBNZXNzYWdlIFF1ZXVlICovCisJbXNnLnR5cGUgPSBTSVJfTElNX0FTU09DX0ZBSUxfVElNRU9VVDsKKwltc2cuYm9keXZhbCA9ICh1aW50MzJfdCkgcGFyYW07CisJbXNnLmJvZHlwdHIgPSBOVUxMOworCWxpbV9wb3N0X21zZ19hcGkobWFjX2N0eCwgJm1zZyk7Cit9IC8qKioqKiogZW5kIGxpbV9hc3NvY19mYWlsdXJlX3RpbWVyX2hhbmRsZXIoKSAqKioqKiovCisKKy8qKgorICogbGltX3VwZGF0ZV9vbGJjX2NhY2hlX3RpbWVyX2hhbmRsZXIoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24gdXBkYXRlIG9sYmMgY2FjaGUgdGltZXIgZXhwaXJhdGlvbgorICogb24gU1RBCisgKgorICoqKkxPR0lDOgorICogTWVzc2FnZSBTSVJfTElNX1VQREFURV9PTEJDX0NBQ0hFTF9USU1FT1VUIGlzIHBvc3RlZCB0byBnU2lyTGltTXNnUQorICogd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbV91cGRhdGVfb2xiY19jYWNoZV90aW1lcl9oYW5kbGVyKHZvaWQgKnBNYWNHbG9iYWwsIHVpbnQzMl90IHBhcmFtKQoreworCXRTaXJNc2dRIG1zZzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSBwTWFjR2xvYmFsOworCisJLyogUHJlcGFyZSBhbmQgcG9zdCBtZXNzYWdlIHRvIExJTSBNZXNzYWdlIFF1ZXVlICovCisKKwltc2cudHlwZSA9IFNJUl9MSU1fVVBEQVRFX09MQkNfQ0FDSEVMX1RJTUVPVVQ7CisJbXNnLmJvZHl2YWwgPSAwOworCW1zZy5ib2R5cHRyID0gTlVMTDsKKworCWxpbV9wb3N0X21zZ19hcGkocE1hYywgJm1zZyk7Cit9IC8qKioqKiogZW5kIGxpbV91cGRhdGVfb2xiY19jYWNoZV90aW1lcl9oYW5kbGVyKCkgKioqKioqLworCisvKioKKyAqIGxpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfdGltZXIoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlYWN0aXZhdGUgYW5kIGNoYW5nZSBhIHRpbWVyCisgKiBmb3IgZnV0dXJlIHJlLWFjdGl2YXRpb24KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICB0aW1lcklkIC0gZW51bSBvZiB0aW1lciB0byBiZSBkZWFjdGl2YXRlZCBhbmQgY2hhbmdlZAorICogICAgICAgICAgICAgICAgICAgVGhpcyBlbnVtIGlzIGRlZmluZWQgaW4gbGltX3V0aWxzLmggZmlsZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCB0aW1lcklkKQoreworCXVpbnQzMl90IHZhbCA9IDA7CisKKwlNVFJBQ0UobWFjX3RyYWNlCisJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9ERUFDVElWQVRFLCBOT19TRVNTSU9OLCB0aW1lcklkKSk7CisKKwlzd2l0Y2ggKHRpbWVySWQpIHsKKwljYXNlIGVMSU1fQUREVFNfUlNQX1RJTUVSOgorCQlwTWFjLT5saW0uZ0xpbUFkZHRzUnNwVGltZXJDb3VudCsrOworCQlpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQWRkdHNSc3BUaW1lcikKKwkJICAgICE9IFRYX1NVQ0NFU1MpIHsKKwkJCS8qIENvdWxkIG5vdCBkZWFjdGl2YXRlIEFkZHRzUnNwIFRpbWVyICovCisJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgQWRkdHNSc3AgdGltZXIiKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGVMSU1fUEVSSU9ESUNfUFJPQkVfUkVRX1RJTUVSOgorCQlpZiAodHhfdGltZXJfZGVhY3RpdmF0ZQorCQkJICAgICgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUGVyaW9kaWNQcm9iZVJlcVRpbWVyKQorCQkgICAgIT0gVFhfU1VDQ0VTUykgeworCQkJLyogQ291bGQgbm90IGRlYWN0aXZhdGUgbWluIGNoYW5uZWwgdGltZXIuICovCisJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgcGVyaW9kaWMgdGltZXIiKSk7CisJCX0KKworCQl2YWwgPQorCQkJU1lTX01TX1RPX1RJQ0tTKHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPm1pbkNoYW5uZWxUaW1lKSAvCisJCQkyOworCQlpZiAodHhfdGltZXJfY2hhbmdlCisJCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY1Byb2JlUmVxVGltZXIsIHZhbCwKKwkJCSAgICAwKSAhPSBUWF9TVUNDRVNTKSB7CisJCQkvKiBDb3VsZCBub3QgY2hhbmdlIG1pbiBjaGFubmVsIHRpbWVyLiAqLworCQkJLyogTG9nIGVycm9yICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIlVuYWJsZSB0byBjaGFuZ2UgcGVyaW9kaWMgdGltZXIiKSk7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgZUxJTV9KT0lOX0ZBSUxfVElNRVI6CisJCWlmICh0eF90aW1lcl9kZWFjdGl2YXRlCisJCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Kb2luRmFpbHVyZVRpbWVyKQorCQkgICAgIT0gVFhfU1VDQ0VTUykgeworCQkJLyoqCisJCQkgKiBDb3VsZCBub3QgZGVhY3RpdmF0ZSBKb2luIEZhaWx1cmUKKwkJCSAqIHRpbWVyLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgSm9pbiBGYWlsdXJlIHRpbWVyIikpOworCQl9CisKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVCwKKwkJCQkgICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJLyoqCisJCQkgKiBDb3VsZCBub3QgZ2V0IEpvaW5GYWlsdXJlVGltZW91dCB2YWx1ZQorCQkJICogZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJCSAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiY291bGQgbm90IHJldHJpZXZlIEpvaW5GYWlsdXJlVGltZW91dCB2YWx1ZSIpKTsKKwkJfQorCQl2YWwgPSBTWVNfTVNfVE9fVElDS1ModmFsKTsKKworCQlpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Kb2luRmFpbHVyZVRpbWVyLAorCQkJCSAgICB2YWwsIDApICE9IFRYX1NVQ0NFU1MpIHsKKwkJCS8qKgorCQkJICogQ291bGQgbm90IGNoYW5nZSBKb2luIEZhaWx1cmUKKwkJCSAqIHRpbWVyLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiVW5hYmxlIHRvIGNoYW5nZSBKb2luIEZhaWx1cmUgdGltZXIiKSk7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgZUxJTV9QRVJJT0RJQ19KT0lOX1BST0JFX1JFUV9USU1FUjoKKwkJaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUKKwkJCSAgICAoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVBlcmlvZGljSm9pblByb2JlUmVxVGltZXIpCisJCSAgICAhPSBUWF9TVUNDRVNTKSB7CisJCQkvKiBDb3VsZCBub3QgZGVhY3RpdmF0ZSBwZXJpb2RpYyBqb2luIHJlcSBUaW1lcy4gKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTAorCQkJCQkoIlVuYWJsZSB0byBkZWFjdGl2YXRlIHBlcmlvZGljIGpvaW4gcmVxdWVzdCB0aW1lciIpKTsKKwkJfQorCisJCXZhbCA9IFNZU19NU19UT19USUNLUyhMSU1fSk9JTl9QUk9CRV9SRVFfVElNRVJfTVMpOworCQlpZiAodHhfdGltZXJfY2hhbmdlCisJCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY0pvaW5Qcm9iZVJlcVRpbWVyLCB2YWwsCisJCQkgICAgMCkgIT0gVFhfU1VDQ0VTUykgeworCQkJLyogQ291bGQgbm90IGNoYW5nZSBwZXJpb2RpYyBqb2luIHJlcSB0aW1lcy4gKi8KKwkJCS8qIExvZyBlcnJvciAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiVW5hYmxlIHRvIGNoYW5nZSBwZXJpb2RpYyBqb2luIHJlcXVlc3QgdGltZXIiKSk7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgZUxJTV9BVVRIX0ZBSUxfVElNRVI6CisJCWlmICh0eF90aW1lcl9kZWFjdGl2YXRlCisJCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1BdXRoRmFpbHVyZVRpbWVyKQorCQkgICAgIT0gVFhfU1VDQ0VTUykgeworCQkJLyogQ291bGQgbm90IGRlYWN0aXZhdGUgQXV0aCBmYWlsdXJlIHRpbWVyLiAqLworCQkJLyogTG9nIGVycm9yICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIlVuYWJsZSB0byBkZWFjdGl2YXRlIGF1dGggZmFpbHVyZSB0aW1lciIpKTsKKwkJfQorCQkvKiBDaGFuZ2UgdGltZXIgdG8gcmVhY3RpdmF0ZSBpdCBpbiBmdXR1cmUgKi8KKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19BVVRIRU5USUNBVEVfRkFJTFVSRV9USU1FT1VULAorCQkJCSAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkvKioKKwkJCSAqIENvdWxkIG5vdCBnZXQgQXV0aEZhaWx1cmVUaW1lb3V0IHZhbHVlCisJCQkgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorCQkJICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwKKwkJCQkJKCJjb3VsZCBub3QgcmV0cmlldmUgQXV0aEZhaWx1cmVUaW1lb3V0IHZhbHVlIikpOworCQl9CisJCXZhbCA9IFNZU19NU19UT19USUNLUyh2YWwpOworCisJCWlmICh0eF90aW1lcl9jaGFuZ2UoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUF1dGhGYWlsdXJlVGltZXIsCisJCQkJICAgIHZhbCwgMCkgIT0gVFhfU1VDQ0VTUykgeworCQkJLyogQ291bGQgbm90IGNoYW5nZSBBdXRoZW50aWNhdGlvbiBmYWlsdXJlIHRpbWVyLiAqLworCQkJLyogTG9nIGVycm9yICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoInVuYWJsZSB0byBjaGFuZ2UgQXV0aCBmYWlsdXJlIHRpbWVyIikpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGVMSU1fQVNTT0NfRkFJTF9USU1FUjoKKwkJaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUKKwkJCSAgICAoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFzc29jRmFpbHVyZVRpbWVyKSAhPQorCQkgICAgVFhfU1VDQ0VTUykgeworCQkJLyogQ291bGQgbm90IGRlYWN0aXZhdGUgQXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lci4gKi8KKwkJCS8qIExvZyBlcnJvciAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgidW5hYmxlIHRvIGRlYWN0aXZhdGUgQXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lciIpKTsKKwkJfQorCQkvKiBDaGFuZ2UgdGltZXIgdG8gcmVhY3RpdmF0ZSBpdCBpbiBmdXR1cmUgKi8KKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19BU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQsCisJCQkJICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCS8qKgorCQkJICogQ291bGQgbm90IGdldCBBc3NvY0ZhaWx1cmVUaW1lb3V0IHZhbHVlCisJCQkgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorCQkJICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwKKwkJCQkJKCJjb3VsZCBub3QgcmV0cmlldmUgQXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZSIpKTsKKwkJfQorCQl2YWwgPSBTWVNfTVNfVE9fVElDS1ModmFsKTsKKworCQlpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Bc3NvY0ZhaWx1cmVUaW1lciwKKwkJCQkgICAgdmFsLCAwKSAhPSBUWF9TVUNDRVNTKSB7CisJCQkvKiBDb3VsZCBub3QgY2hhbmdlIEFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIuICovCisJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgidW5hYmxlIHRvIGNoYW5nZSBBc3NvYyBmYWlsdXJlIHRpbWVyIikpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGVMSU1fUkVBU1NPQ19GQUlMX1RJTUVSOgorCQlpZiAodHhfdGltZXJfZGVhY3RpdmF0ZQorCQkJICAgICgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVhc3NvY0ZhaWx1cmVUaW1lcikgIT0KKwkJICAgIFRYX1NVQ0NFU1MpIHsKKwkJCS8qIENvdWxkIG5vdCBkZWFjdGl2YXRlIFJlYXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lci4gKi8KKwkJCS8qIExvZyBlcnJvciAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgidW5hYmxlIHRvIGRlYWN0aXZhdGUgUmVhc3NvYyBmYWlsdXJlIHRpbWVyIikpOworCQl9CisJCS8qIENoYW5nZSB0aW1lciB0byByZWFjdGl2YXRlIGl0IGluIGZ1dHVyZSAqLworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1JFQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VULAorCQkJCSAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkvKioKKwkJCSAqIENvdWxkIG5vdCBnZXQgUmVhc3NvY0ZhaWx1cmVUaW1lb3V0IHZhbHVlCisJCQkgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorCQkJICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwKKwkJCQkJKCJjb3VsZCBub3QgcmV0cmlldmUgUmVhc3NvY0ZhaWx1cmVUaW1lb3V0IHZhbHVlIikpOworCQl9CisJCXZhbCA9IFNZU19NU19UT19USUNLUyh2YWwpOworCisJCWlmICh0eF90aW1lcl9jaGFuZ2UKKwkJCSAgICAoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVJlYXNzb2NGYWlsdXJlVGltZXIsIHZhbCwKKwkJCSAgICAwKSAhPSBUWF9TVUNDRVNTKSB7CisJCQkvKiBDb3VsZCBub3QgY2hhbmdlIFJlYXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lci4gKi8KKwkJCS8qIExvZyBlcnJvciAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgidW5hYmxlIHRvIGNoYW5nZSBSZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIiKSk7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgZUxJTV9QUk9CRV9BRlRFUl9IQl9USU1FUjoKKwkJaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUKKwkJCSAgICAoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVByb2JlQWZ0ZXJIQlRpbWVyKSAhPQorCQkgICAgVFhfU1VDQ0VTUykgeworCQkJLyogQ291bGQgbm90IGRlYWN0aXZhdGUgSGVhcnRiZWF0IHRpbWVyLiAqLworCQkJLyogTG9nIGVycm9yICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoInVuYWJsZSB0byBkZWFjdGl2YXRlIHByb2JlQWZ0ZXJIQlRpbWVyIikpOworCQl9IGVsc2UgeworCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMKCJEZWFjdGl2YXRlZCBwcm9iZSBhZnRlciBoYiB0aW1lciIpKTsKKwkJfQorCisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VULAorCQkJCSAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkvKioKKwkJCSAqIENvdWxkIG5vdCBnZXQgUFJPQkVfQUZURVJfSEJfRkFJTFVSRQorCQkJICogdmFsdWUgZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJCSAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiY291bGQgbm90IHJldHJpZXZlIFBST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVCB2YWx1ZSIpKTsKKwkJfQorCQkvKiBDaGFuZ2UgdGltZXIgdG8gcmVhY3RpdmF0ZSBpdCBpbiBmdXR1cmUgKi8KKwkJdmFsID0gU1lTX01TX1RPX1RJQ0tTKHZhbCk7CisKKwkJaWYgKHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUHJvYmVBZnRlckhCVGltZXIsCisJCQkJICAgIHZhbCwgMCkgIT0gVFhfU1VDQ0VTUykgeworCQkJLyogQ291bGQgbm90IGNoYW5nZSBIZWFydEJlYXQgdGltZXIuICovCisJCQkvKiBMb2cgZXJyb3IgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgidW5hYmxlIHRvIGNoYW5nZSBQcm9iZUFmdGVySEJUaW1lciIpKTsKKwkJfSBlbHNlIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCQlGTCgiUHJvYmUgYWZ0ZXIgSEIgdGltZXIgdmFsdWUgaXMgY2hhbmdlZCA9ICV1IiksCisJCQkJdmFsKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBlTElNX0xFQVJOX0RVUkFUSU9OX1RJTUVSOgorCQlicmVhazsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJY2FzZSBlTElNX0ZUX1BSRUFVVEhfUlNQX1RJTUVSOgorCQlpZiAodHhfdGltZXJfZGVhY3RpdmF0ZQorCQkJICAgICgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltRlRQcmVBdXRoUnNwVGltZXIpICE9CisJCSAgICBUWF9TVUNDRVNTKSB7CisJCQkvKioKKwkJCSoqIENvdWxkIG5vdCBkZWFjdGl2YXRlIEpvaW4gRmFpbHVyZQorCQkJKiogdGltZXIuIExvZyBlcnJvci4KKwkJCSoqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgUHJlYXV0aCByZXNwb25zZSBGYWlsdXJlIHRpbWVyIikpOworCQkJcmV0dXJuOworCQl9CisJCXZhbCA9IDEwMDA7CisJCXZhbCA9IFNZU19NU19UT19USUNLUyh2YWwpOworCQlpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1GVFByZUF1dGhSc3BUaW1lciwKKwkJCQkgICAgdmFsLCAwKSAhPSBUWF9TVUNDRVNTKSB7CisJCQkvKioKKwkJCSAqIENvdWxkIG5vdCBjaGFuZ2UgSm9pbiBGYWlsdXJlCisJCQkgKiB0aW1lci4gTG9nIGVycm9yLgorCQkJICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIlVuYWJsZSB0byBjaGFuZ2UgSm9pbiBGYWlsdXJlIHRpbWVyIikpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBlTElNX1JFTUFJTl9DSE5fVElNRVI6CisJCWlmICh0eF90aW1lcl9kZWFjdGl2YXRlCisJCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZW1haW5PbkNoYW5uZWxUaW1lcikgIT0KKwkJICAgIFRYX1NVQ0NFU1MpIHsKKwkJCS8qKgorCQkJKiogQ291bGQgbm90IGRlYWN0aXZhdGUgSm9pbiBGYWlsdXJlCisJCQkqKiB0aW1lci4gTG9nIGVycm9yLgorCQkJKiovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIlVuYWJsZSB0byBkZWFjdGl2YXRlIFJlbWFpbiBvbiBDaG4gdGltZXIiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJdmFsID0gMTAwMDsKKwkJdmFsID0gU1lTX01TX1RPX1RJQ0tTKHZhbCk7CisJCWlmICh0eF90aW1lcl9jaGFuZ2UKKwkJCSAgICAoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVJlbWFpbk9uQ2hhbm5lbFRpbWVyLCB2YWwsCisJCQkgICAgMCkgIT0gVFhfU1VDQ0VTUykgeworCQkJLyoqCisJCQkgKiBDb3VsZCBub3QgY2hhbmdlIEpvaW4gRmFpbHVyZQorCQkJICogdGltZXIuIExvZyBlcnJvci4KKwkJCSAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGNoYW5nZSB0aW1lciIpKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgZUxJTV9DT05WRVJUX0FDVElWRV9DSEFOTkVMX1RPX1BBU1NJVkU6CisJCWlmICh0eF90aW1lcl9kZWFjdGl2YXRlCisJCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1BY3RpdmVUb1Bhc3NpdmVDaGFubmVsVGltZXIpICE9CisJCSAgICBUWF9TVUNDRVNTKSB7CisJCQkvKioKKwkJCSoqIENvdWxkIG5vdCBkZWFjdGl2YXRlIEFjdGl2ZSB0byBwYXNzaXZlIGNoYW5uZWwgdGltZXIuCisJCQkqKiBMb2cgZXJyb3IuCisJCQkqKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBEZWFjdGl2YXRlICIKKwkJCQkJICAgICAgICJBY3RpdmUgdG8gcGFzc2l2ZSBjaGFubmVsIHRpbWVyIikpOworCQkJcmV0dXJuOworCQl9CisJCXZhbCA9IEFDVElWRV9UT19QQVNTSVZFX0NPTlZFUklTT05fVElNRU9VVDsKKwkJdmFsID0gU1lTX01TX1RPX1RJQ0tTKHZhbCk7CisJCWlmICh0eF90aW1lcl9jaGFuZ2UKKwkJCSAgICAoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFjdGl2ZVRvUGFzc2l2ZUNoYW5uZWxUaW1lciwgdmFsLAorCQkJICAgIDApICE9IFRYX1NVQ0NFU1MpIHsKKwkJCS8qKgorCQkJICogQ291bGQgbm90IGNoYW5nZSB0aW1lciB0byBjaGVjayBzY2FuIHR5cGUgZm9yIHBhc3NpdmUgY2hhbm5lbC4KKwkJCSAqIHRpbWVyLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBjaGFuZ2UgdGltZXIiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGVMSU1fRElTQVNTT0NfQUNLX1RJTUVSOgorCQlpZiAodHhfdGltZXJfZGVhY3RpdmF0ZQorCQkJICAgICgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltRGlzYXNzb2NBY2tUaW1lcikgIT0gVFhfU1VDQ0VTUykgeworCQkJLyoqCisJCQkqKiBDb3VsZCBub3QgZGVhY3RpdmF0ZSBKb2luIEZhaWx1cmUKKwkJCSoqIHRpbWVyLiBMb2cgZXJyb3IuCisJCQkqKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgRGlzYXNzb2MgYWNrIHRpbWVyIikpOworCQkJcmV0dXJuOworCQl9CisJCXZhbCA9IDEwMDA7CisJCXZhbCA9IFNZU19NU19UT19USUNLUyh2YWwpOworCQlpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1EaXNhc3NvY0Fja1RpbWVyLAorCQkJCSAgICB2YWwsIDApICE9IFRYX1NVQ0NFU1MpIHsKKwkJCS8qKgorCQkJICogQ291bGQgbm90IGNoYW5nZSBKb2luIEZhaWx1cmUKKwkJCSAqIHRpbWVyLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBjaGFuZ2UgdGltZXIiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGVMSU1fREVBVVRIX0FDS19USU1FUjoKKwkJaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbURlYXV0aEFja1RpbWVyKQorCQkgICAgIT0gVFhfU1VDQ0VTUykgeworCQkJLyoqCisJCQkqKiBDb3VsZCBub3QgZGVhY3RpdmF0ZSBKb2luIEZhaWx1cmUKKwkJCSoqIHRpbWVyLiBMb2cgZXJyb3IuCisJCQkqKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgRGVhdXRoIGFjayB0aW1lciIpKTsKKwkJCXJldHVybjsKKwkJfQorCQl2YWwgPSAxMDAwOworCQl2YWwgPSBTWVNfTVNfVE9fVElDS1ModmFsKTsKKwkJaWYgKHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltRGVhdXRoQWNrVGltZXIsCisJCQkJICAgIHZhbCwgMCkgIT0gVFhfU1VDQ0VTUykgeworCQkJLyoqCisJCQkgKiBDb3VsZCBub3QgY2hhbmdlIEpvaW4gRmFpbHVyZQorCQkJICogdGltZXIuIExvZyBlcnJvci4KKwkJCSAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGNoYW5nZSB0aW1lciIpKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgZUxJTV9JTlNFUlRfU0lOR0xFU0hPVF9OT0FfVElNRVI6CisJCWlmICh0eF90aW1lcl9kZWFjdGl2YXRlCisJCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QMnBTaW5nbGVTaG90Tm9hSW5zZXJ0VGltZXIpICE9CisJCSAgICBUWF9TVUNDRVNTKSB7CisJCQkvKioKKwkJCSoqIENvdWxkIG5vdCBkZWFjdGl2YXRlIFNpbmdsZVNob3QgTk9BIEluc2VydAorCQkJKiogdGltZXIuIExvZyBlcnJvci4KKwkJCSoqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgU2luZ2xlU2hvdCBOT0EgSW5zZXJ0IHRpbWVyIikpOworCQkJcmV0dXJuOworCQl9CisJCXZhbCA9IExJTV9JTlNFUlRfU0lOR0xFU0hPVE5PQV9USU1FT1VUX1ZBTFVFOworCQl2YWwgPSBTWVNfTVNfVE9fVElDS1ModmFsKTsKKwkJaWYgKHR4X3RpbWVyX2NoYW5nZQorCQkJICAgICgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUDJwU2luZ2xlU2hvdE5vYUluc2VydFRpbWVyLCB2YWwsCisJCQkgICAgMCkgIT0gVFhfU1VDQ0VTUykgeworCQkJLyoqCisJCQkgKiBDb3VsZCBub3QgY2hhbmdlIFNpbmdsZSBTaG90IE5PQSBJbnNlcnQKKwkJCSAqIHRpbWVyLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBjaGFuZ2UgdGltZXIiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBJbnZhbGlkIHRpbWVySWQuIExvZyBlcnJvciAqLworCQlicmVhazsKKwl9Cit9IC8qKioqKiogZW5kIGxpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfdGltZXIoKSAqKioqKiovCisKKy8qKgorICogbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV9wZXJfc3RhX2lkX3RpbWVyKCkKKyAqCisgKgorICogQGJyaWVmOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZWFjdGl2YXRlIGFuZCBjaGFuZ2UgYSBwZXIgU1RBIHRpbWVyCisgKiBmb3IgZnV0dXJlIHJlLWFjdGl2YXRpb24KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKiBAbm90ZSAgIHN0YUlkIGZvciBlTElNX0FVVEhfUlNQX1RJTUVSIGlzIGF1dGggTm9kZSBJbmRleC4KKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHRpbWVySWQgLSBlbnVtIG9mIHRpbWVyIHRvIGJlIGRlYWN0aXZhdGVkIGFuZCBjaGFuZ2VkCisgKiAgICAgICAgICAgICAgICAgICBUaGlzIGVudW0gaXMgZGVmaW5lZCBpbiBsaW1fdXRpbHMuaCBmaWxlCisgKiBAcGFyYW0gIHN0YUlkICAgLSBzdGFJZAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbV9kZWFjdGl2YXRlX2FuZF9jaGFuZ2VfcGVyX3N0YV9pZF90aW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCB0aW1lcklkLAorCQkJCQkgICB1aW50MTZfdCBzdGFJZCkKK3sKKwl1aW50MzJfdCB2YWw7CisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfREVBQ1RJVkFURSwgTk9fU0VTU0lPTiwgdGltZXJJZCkpOworCisJc3dpdGNoICh0aW1lcklkKSB7CisJY2FzZSBlTElNX0NORl9XQUlUX1RJTUVSOgorCisJCWlmICh0eF90aW1lcl9kZWFjdGl2YXRlCisJCQkgICAgKCZwTWFjLT5saW0ubGltVGltZXJzLmdwTGltQ25mV2FpdFRpbWVyW3N0YUlkXSkKKwkJICAgICE9IFRYX1NVQ0NFU1MpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgidW5hYmxlIHRvIGRlYWN0aXZhdGUgQ05GIHdhaXQgdGltZXIiKSk7CisKKwkJfQorCQkvKiBDaGFuZ2UgdGltZXIgdG8gcmVhY3RpdmF0ZSBpdCBpbiBmdXR1cmUgKi8KKworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1dUX0NORl9USU1FT1VULAorCQkJCSAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkvKioKKwkJCSAqIENvdWxkIG5vdCBnZXQgY25mIHRpbWVvdXQgdmFsdWUKKwkJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIGNuZiB0aW1lb3V0IHZhbHVlIikpOworCQl9CisJCXZhbCA9IFNZU19NU19UT19USUNLUyh2YWwpOworCisJCWlmICh0eF90aW1lcl9jaGFuZ2UKKwkJCSAgICAoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXJbc3RhSWRdLCB2YWwsCisJCQkgICAgdmFsKSAhPSBUWF9TVUNDRVNTKSB7CisJCQkvKiBDb3VsZCBub3QgY2hhbmdlIGNuZiB0aW1lci4gKi8KKwkJCS8qIExvZyBlcnJvciAqLworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMKCJ1bmFibGUgdG8gY2hhbmdlIGNuZiB3YWl0IHRpbWVyIikpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGVMSU1fQVVUSF9SU1BfVElNRVI6CisJeworCQl0TGltUHJlQXV0aE5vZGUgKnBBdXRoTm9kZTsKKworCQlwQXV0aE5vZGUgPQorCQkJbGltX2dldF9wcmVfYXV0aF9ub2RlX2Zyb21faW5kZXgocE1hYywKKwkJCQkJCQkgJnBNYWMtPmxpbS4KKwkJCQkJCQkgZ0xpbVByZUF1dGhUaW1lclRhYmxlLAorCQkJCQkJCSBzdGFJZCk7CisKKwkJaWYgKHBBdXRoTm9kZSA9PSBOVUxMKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIkludmFsaWQgUHJlIEF1dGggSW5kZXggcGFzc2VkIDolZCIpLAorCQkJCXN0YUlkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBBdXRoTm9kZS0+dGltZXIpICE9CisJCSAgICBUWF9TVUNDRVNTKSB7CisJCQkvKiBDb3VsZCBub3QgZGVhY3RpdmF0ZSBhdXRoIHJlc3BvbnNlIHRpbWVyLiAqLworCQkJLyogTG9nIGVycm9yICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwKKwkJCQkJKCJ1bmFibGUgdG8gZGVhY3RpdmF0ZSBhdXRoIHJlc3BvbnNlIHRpbWVyIikpOworCQl9CisJCS8qIENoYW5nZSB0aW1lciB0byByZWFjdGl2YXRlIGl0IGluIGZ1dHVyZSAqLworCisJCWlmICh3bGFuX2NmZ19nZXRfaW50CisJCQkgICAgKHBNYWMsIFdOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VULAorCQkJICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJLyoqCisJCQkgKiBDb3VsZCBub3QgZ2V0IGF1dGggcnNwIHRpbWVvdXQgdmFsdWUKKwkJCSAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisJCQkgKi8KKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTAorCQkJCQkoImNvdWxkIG5vdCByZXRyaWV2ZSBhdXRoIHJlc3BvbnNlIHRpbWVvdXQgdmFsdWUiKSk7CisJCX0KKworCQl2YWwgPSBTWVNfTVNfVE9fVElDS1ModmFsKTsKKworCQlpZiAodHhfdGltZXJfY2hhbmdlKCZwQXV0aE5vZGUtPnRpbWVyLCB2YWwsIDApICE9CisJCSAgICBUWF9TVUNDRVNTKSB7CisJCQkvKiBDb3VsZCBub3QgY2hhbmdlIGF1dGggcnNwIHRpbWVyLiAqLworCQkJLyogTG9nIGVycm9yICovCisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoInVuYWJsZSB0byBjaGFuZ2UgYXV0aCByc3AgdGltZXIiKSk7CisJCX0KKwl9CisJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBJbnZhbGlkIHRpbWVySWQuIExvZyBlcnJvciAqLworCQlicmVhazsKKworCX0KK30KKworLyoqCisgKiBsaW1fYWN0aXZhdGVfY25mX3RpbWVyKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhY3RpdmF0ZSBhIHBlciBTVEEgdGltZXIKKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBTdGFJZCAgIC0gc3RhSWQKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbV9hY3RpdmF0ZV9jbmZfdGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3Qgc3RhSWQsCisJCQkgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlNVFJBQ0UobWFjX3RyYWNlCisJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCSAgICAgICBlTElNX0NORl9XQUlUX1RJTUVSKSk7CisJcE1hYy0+bGltLmxpbVRpbWVycy5ncExpbUNuZldhaXRUaW1lcltzdGFJZF0uc2Vzc2lvbklkID0KKwkJcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisJaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdwTGltQ25mV2FpdFRpbWVyW3N0YUlkXSkKKwkgICAgIT0gVFhfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgYWN0aXZhdGUgY25mIHdhaXQgdGltZXIiKSk7CisJfQorfQorCisvKioKKyAqIGxpbV9hY3RpdmF0ZV9hdXRoX3JzcF90aW1lcigpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWN0aXZhdGUgYSBwZXIgU1RBIHRpbWVyCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgaWQgICAgICAtIGlkCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1fYWN0aXZhdGVfYXV0aF9yc3BfdGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpbVByZUF1dGhOb2RlICpwQXV0aE5vZGUpCit7CisJTVRSQUNFKG1hY190cmFjZQorCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsIE5PX1NFU1NJT04sCisJCSAgICAgICBlTElNX0FVVEhfUkVTUF9USU1FUikpOworCWlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcEF1dGhOb2RlLT50aW1lcikgIT0gVFhfU1VDQ0VTUykgeworCQkvKiAvIENvdWxkIG5vdCBhY3RpdmF0ZSBhdXRoIHJzcCB0aW1lci4gKi8KKwkJLyogTG9nIGVycm9yICovCisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCBhY3RpdmF0ZSBhdXRoIHJzcCB0aW1lciIpKTsKKwl9Cit9CisKKy8qKgorICogbGltX3NlbmRfZGlzYXNzb2NfZnJhbWVfdGhyZXNob2xkX2hhbmRsZXIoKQorICoKKyAqKipGVU5DVElPTjoKKyAqICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlbG9hZHMgdGhlIGNyZWRpdCB0byB0aGUgc2VuZCBkaXNhc3NvY2lhdGUgZnJhbWUgYnVja2V0CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1fc2VuZF9kaXNhc3NvY19mcmFtZV90aHJlc2hvbGRfaGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB1aW50MzJfdCBwYXJhbSkKK3sKKwl0U2lyTXNnUSBtc2c7CisJdWludDMyX3Qgc3RhdHVzQ29kZTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSBwTWFjR2xvYmFsOworCisJbXNnLnR5cGUgPSBTSVJfTElNX0hBU0hfTUlTU19USFJFU19USU1FT1VUOworCW1zZy5ib2R5dmFsID0gMDsKKwltc2cuYm9keXB0ciA9IE5VTEw7CisKKwlpZiAoKHN0YXR1c0NvZGUgPSBsaW1fcG9zdF9tc2dfYXBpKHBNYWMsICZtc2cpKSAhPSBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJwb3N0aW5nIHRvIExJTSBmYWlsZWQsIHJlYXNvbj0lZCIpLCBzdGF0dXNDb2RlKTsKKworfQorCisvKioKKyAqIGxpbUFzc29jQ25mV2FpdFRtZXJIYW5kbGVyKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiAgICAgICAgVGhpcyBmdW5jdGlvbiBwb3N0IGEgbWVzc2FnZSB0byBzZW5kIGEgZGlzYXNzb2NpYXRlIGZyYW1lIG91dC4KKyAqCisgKioqTE9HSUM6CisgKgorICoqKkFTU1VNUFRJT05TOgorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbV9jbmZfd2FpdF90bWVyX2hhbmRsZXIodm9pZCAqcE1hY0dsb2JhbCwgdWludDMyX3QgcGFyYW0pCit7CisJdFNpck1zZ1EgbXNnOworCXVpbnQzMl90IHN0YXR1c0NvZGU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgcE1hY0dsb2JhbDsKKworCW1zZy50eXBlID0gU0lSX0xJTV9DTkZfV0FJVF9USU1FT1VUOworCW1zZy5ib2R5dmFsID0gKHVpbnQzMl90KSBwYXJhbTsKKwltc2cuYm9keXB0ciA9IE5VTEw7CisKKwlpZiAoKHN0YXR1c0NvZGUgPSBsaW1fcG9zdF9tc2dfYXBpKHBNYWMsICZtc2cpKSAhPSBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJwb3N0aW5nIHRvIExJTSBmYWlsZWQsIHJlYXNvbj0lZCIpLCBzdGF0dXNDb2RlKTsKKworfQorCit2b2lkIGxpbV9jaGFubmVsX3N3aXRjaF90aW1lcl9oYW5kbGVyKHZvaWQgKnBNYWNHbG9iYWwsIHVpbnQzMl90IHBhcmFtKQoreworCXRTaXJNc2dRIG1zZzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSBwTWFjR2xvYmFsOworCisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwKKwkJICAgICAgIEZMKCJDaGFubmVsU3dpdGNoIFRpbWVyIGV4cGlyZWQuICBQb3N0aW5nIG1zZyB0byBMSU0gIikpOworCSAgICAgICApCisKKwltc2cudHlwZSA9IFNJUl9MSU1fQ0hBTk5FTF9TV0lUQ0hfVElNRU9VVDsKKwltc2cuYm9keXZhbCA9ICh1aW50MzJfdCkgcGFyYW07CisJbXNnLmJvZHlwdHIgPSBOVUxMOworCisJbGltX3Bvc3RfbXNnX2FwaShwTWFjLCAmbXNnKTsKK30KKwordm9pZCBsaW1fcXVpZXRfdGltZXJfaGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB1aW50MzJfdCBwYXJhbSkKK3sKKwl0U2lyTXNnUSBtc2c7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgcE1hY0dsb2JhbDsKKworCW1zZy50eXBlID0gU0lSX0xJTV9RVUlFVF9USU1FT1VUOworCW1zZy5ib2R5dmFsID0gKHVpbnQzMl90KSBwYXJhbTsKKwltc2cuYm9keXB0ciA9IE5VTEw7CisKKwlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiUG9zdCBTSVJfTElNX1FVSUVUX1RJTUVPVVQgbXNnLiAiKSk7KQorCWxpbV9wb3N0X21zZ19hcGkocE1hYywgJm1zZyk7Cit9CisKK3ZvaWQgbGltX3F1aWV0X2Jzc190aW1lcl9oYW5kbGVyKHZvaWQgKnBNYWNHbG9iYWwsIHVpbnQzMl90IHBhcmFtKQoreworCXRTaXJNc2dRIG1zZzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSBwTWFjR2xvYmFsOworCisJbXNnLnR5cGUgPSBTSVJfTElNX1FVSUVUX0JTU19USU1FT1VUOworCW1zZy5ib2R5dmFsID0gKHVpbnQzMl90KSBwYXJhbTsKKwltc2cuYm9keXB0ciA9IE5VTEw7CisJUEVMT0cxKGxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlBvc3QgU0lSX0xJTV9RVUlFVF9CU1NfVElNRU9VVCBtc2cuICIpKTspCisJbGltX3Bvc3RfbXNnX2FwaShwTWFjLCAmbXNnKTsKK30KKwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fdGltZXJfdXRpbHMuaCBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3RpbWVyX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzM2Q3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3RpbWVyX3V0aWxzLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIGxpbV90aW1lcl91dGlscy5oIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGRlZmluaXRpb25zCisgKiBMSU0gdXNlcyBmb3IgdGltZXIgaGFuZGxpbmcuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMy8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgX19MSU1fVElNRVJfVVRJTFNfSAorI2RlZmluZSBfX0xJTV9USU1FUl9VVElMU19ICisKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKworLyogVGltZXIgcmVsYXRlZCBmdW5jdGlvbnMgKi8KK2VudW0geworCWVMSU1fTUlOX0NIQU5ORUxfVElNRVIsCisJZUxJTV9NQVhfQ0hBTk5FTF9USU1FUiwKKwllTElNX0pPSU5fRkFJTF9USU1FUiwKKwllTElNX0FVVEhfRkFJTF9USU1FUiwKKwllTElNX0FVVEhfUkVTUF9USU1FUiwKKwllTElNX0FTU09DX0ZBSUxfVElNRVIsCisJZUxJTV9SRUFTU09DX0ZBSUxfVElNRVIsCisJZUxJTV9QUkVfQVVUSF9DTEVBTlVQX1RJTUVSLAorCWVMSU1fQ05GX1dBSVRfVElNRVIsCisJZUxJTV9BVVRIX1JTUF9USU1FUiwKKwllTElNX1VQREFURV9PTEJDX0NBQ0hFX1RJTUVSLAorCWVMSU1fUFJPQkVfQUZURVJfSEJfVElNRVIsCisJZUxJTV9BRERUU19SU1BfVElNRVIsCisJZUxJTV9DSEFOTkVMX1NXSVRDSF9USU1FUiwKKwllTElNX0xFQVJOX0RVUkFUSU9OX1RJTUVSLAorCWVMSU1fUVVJRVRfVElNRVIsCisJZUxJTV9RVUlFVF9CU1NfVElNRVIsCisJZUxJTV9XUFNfT1ZFUkxBUF9USU1FUiwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWVMSU1fRlRfUFJFQVVUSF9SU1BfVElNRVIsCisjZW5kaWYKKwllTElNX1JFTUFJTl9DSE5fVElNRVIsCisJZUxJTV9QRVJJT0RJQ19QUk9CRV9SRVFfVElNRVIsCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCWVMSU1fVFNNX1RJTUVSLAorI2VuZGlmCisJZUxJTV9ESVNBU1NPQ19BQ0tfVElNRVIsCisJZUxJTV9ERUFVVEhfQUNLX1RJTUVSLAorCWVMSU1fUEVSSU9ESUNfSk9JTl9QUk9CRV9SRVFfVElNRVIsCisJZUxJTV9JTlNFUlRfU0lOR0xFU0hPVF9OT0FfVElNRVIsCisJZUxJTV9DT05WRVJUX0FDVElWRV9DSEFOTkVMX1RPX1BBU1NJVkUKK307CisKKyNkZWZpbmUgTElNX0RJU0FTU09DX0RFQVVUSF9BQ0tfVElNRU9VVCAgICAgICAgIDUwMAorI2RlZmluZSBMSU1fSU5TRVJUX1NJTkdMRVNIT1ROT0FfVElNRU9VVF9WQUxVRSAgNTAwCisKKy8qIFRpbWVyIEhhbmRsZXIgZnVuY3Rpb25zICovCit1aW50MzJfdCBsaW1fY3JlYXRlX3RpbWVycyh0cEFuaVNpckdsb2JhbCk7Cit2b2lkIGxpbV90aW1lcl9oYW5kbGVyKHZvaWQgKiwgdWludDMyX3QpOwordm9pZCBsaW1fYXV0aF9yZXNwb25zZV90aW1lcl9oYW5kbGVyKHZvaWQgKiwgdWludDMyX3QpOwordm9pZCBsaW1fYXNzb2NfZmFpbHVyZV90aW1lcl9oYW5kbGVyKHZvaWQgKiwgdWludDMyX3QpOwordm9pZCBsaW1SZWFzc29jRmFpbHVyZVRpbWVySGFuZGxlcih2b2lkICosIHVpbnQzMl90KTsKKwordm9pZCBsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCk7Cit2b2lkIGxpbUR1bW15UGt0RXhwVGltZXJIYW5kbGVyKHZvaWQgKiwgdWludDMyX3QpOwordm9pZCBsaW1fc2VuZF9kaXNhc3NvY19mcmFtZV90aHJlc2hvbGRfaGFuZGxlcih2b2lkICosIHVpbnQzMl90KTsKK3ZvaWQgbGltX2NuZl93YWl0X3RtZXJfaGFuZGxlcih2b2lkICosIHVpbnQzMl90KTsKK3ZvaWQgbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV9wZXJfc3RhX2lkX3RpbWVyKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCwgdWludDE2X3QpOwordm9pZCBsaW1fYWN0aXZhdGVfY25mX3RpbWVyKHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fYWN0aXZhdGVfYXV0aF9yc3BfdGltZXIodHBBbmlTaXJHbG9iYWwsIHRMaW1QcmVBdXRoTm9kZSAqKTsKK3ZvaWQgbGltX3VwZGF0ZV9vbGJjX2NhY2hlX3RpbWVyX2hhbmRsZXIodm9pZCAqLCB1aW50MzJfdCk7Cit2b2lkIGxpbV9hZGR0c19yZXNwb25zZV90aW1lcl9oYW5kbGVyKHZvaWQgKiwgdWludDMyX3QpOwordm9pZCBsaW1fY2hhbm5lbF9zd2l0Y2hfdGltZXJfaGFuZGxlcih2b2lkICosIHVpbnQzMl90KTsKK3ZvaWQgbGltX3F1aWV0X3RpbWVyX2hhbmRsZXIodm9pZCAqLCB1aW50MzJfdCk7Cit2b2lkIGxpbV9xdWlldF9ic3NfdGltZXJfaGFuZGxlcih2b2lkICosIHVpbnQzMl90KTsKK3ZvaWQgbGltQ0JTY2FuSW50ZXJ2YWxUaW1lckhhbmRsZXIodm9pZCAqLCB1aW50MzJfdCk7Cit2b2lkIGxpbUNCU2NhbkR1cmF0aW9uVGltZXJIYW5kbGVyKHZvaWQgKiwgdWludDMyX3QpOworI2VuZGlmIC8qIF9fTElNX1RJTUVSX1VUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3RyYWNlLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV90cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDcxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV90cmFjZS5jCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICBsaW1fdHJhY2UuYworCisgICBcYnJpZWYgaW1wbGVtZW50YXRpb24gZm9yIHRyYWNlIHJlbGF0ZWQgQVBJcworCisgICBcYXV0aG9yIFN1bml0IEJoYXRpYQorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBJbmNsdWRlIEZpbGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIiAgICAgICAgICAvKiBmb3IgdHBBbmlTaXJHbG9iYWwgKi8KKworI2luY2x1ZGUgImxpbV90cmFjZS5oIgorI2luY2x1ZGUgImxpbV90aW1lcl91dGlscy5oIgorI2luY2x1ZGUgImNkZl90cmFjZS5oIgorCisjaWZkZWYgTElNX1RSQUNFX1JFQ09SRAordWludDMyX3QgZ19tZ210X2ZyYW1lX3N0YXRzWzE0XTsKKworI2RlZmluZSBMSU1fVFJBQ0VfTUFYX1NVQlRZUEVTIDE0CisKK3N0YXRpYyB1aW50OF90ICpfX2xpbV90cmFjZV9nZXRfdGltZXJfc3RyaW5nKHVpbnQxNl90IHRpbWVySWQpCit7CisJc3dpdGNoICh0aW1lcklkKSB7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01JTl9DSEFOTkVMX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUFYX0NIQU5ORUxfVElNRVIpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9KT0lOX0ZBSUxfVElNRVIpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9BVVRIX0ZBSUxfVElNRVIpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9BVVRIX1JFU1BfVElNRVIpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9BU1NPQ19GQUlMX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fUkVBU1NPQ19GQUlMX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fUFJFX0FVVEhfQ0xFQU5VUF9USU1FUik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX0NORl9XQUlUX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fQVVUSF9SU1BfVElNRVIpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9VUERBVEVfT0xCQ19DQUNIRV9USU1FUik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1BST0JFX0FGVEVSX0hCX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fQUREVFNfUlNQX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fQ0hBTk5FTF9TV0lUQ0hfVElNRVIpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9MRUFSTl9EVVJBVElPTl9USU1FUik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1FVSUVUX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fUVVJRVRfQlNTX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fV1BTX09WRVJMQVBfVElNRVIpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX0ZUX1BSRUFVVEhfUlNQX1RJTUVSKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9SRU1BSU5fQ0hOX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fUEVSSU9ESUNfUFJPQkVfUkVRX1RJTUVSKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1RTTV9USU1FUik7CisjZW5kaWYKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fRElTQVNTT0NfQUNLX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fREVBVVRIX0FDS19USU1FUik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1BFUklPRElDX0pPSU5fUFJPQkVfUkVRX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fSU5TRVJUX1NJTkdMRVNIT1RfTk9BX1RJTUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fQ09OVkVSVF9BQ1RJVkVfQ0hBTk5FTF9UT19QQVNTSVZFKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCJVTktOT1dOIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHVpbnQ4X3QgKl9fbGltX3RyYWNlX2dldF9tZ210X2Ryb3BfcmVhc29uX3N0cmluZyh1aW50MTZfdCBkcm9wUmVhc29uKQoreworCisJc3dpdGNoIChkcm9wUmVhc29uKSB7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTUdNVF9EUk9QX0lORlJBX0JDTl9JTl9JQlNTKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVNR01UX0RST1BfSU5WQUxJRF9TSVpFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVNR01UX0RST1BfTk9OX1NDQU5fTU9ERV9GUkFNRSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTUdNVF9EUk9QX05PVF9MQVNUX0lCU1NfQkNOKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVNR01UX0RST1BfTk9fRFJPUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTUdNVF9EUk9QX1NDQU5fTU9ERV9GUkFNRSk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCJVTktOT1dOIik7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBsaW1fdHJhY2VfaW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCWNkZl90cmFjZV9yZWdpc3RlcihDREZfTU9EVUxFX0lEX1BFLCAodHBfY2RmX3RyYWNlX2NiKSAmIGxpbV90cmFjZV9kdW1wKTsKK30KKwordm9pZCBsaW1fdHJhY2VfZHVtcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cF9jZGZfdHJhY2VfcmVjb3JkIHBSZWNvcmQsCisJCSAgICB1aW50MTZfdCByZWNJbmRleCkKK3sKKworCXN0YXRpYyBjaGFyICpmcmFtZVN1YnR5cGVTdHJbTElNX1RSQUNFX01BWF9TVUJUWVBFU10gPSB7CisJCSJBc3NvY2lhdGlvbiByZXF1ZXN0IiwKKwkJIkFzc29jaWF0aW9uIHJlc3BvbnNlIiwKKwkJIlJlYXNzb2NpYXRpb24gcmVxdWVzdCIsCisJCSJSZWFzc29jaWF0aW9uIHJlc3BvbnNlIiwKKwkJIlByb2JlIHJlcXVlc3QiLAorCQkiUHJvYmUgcmVzcG9uc2UiLAorCQlOVUxMLAorCQlOVUxMLAorCQkiQmVhY29uIiwKKwkJIkFUSU0iLAorCQkiRGlzYXNzb2NpYXRpb24iLAorCQkiQXV0aGVudGljYXRpb24iLAorCQkiRGVhdXRoZW50aWNhdGlvbiIsCisJCSJBY3Rpb24iCisJfTsKKworCXN3aXRjaCAocFJlY29yZC0+Y29kZSkgeworCWNhc2UgVFJBQ0VfQ09ERV9NTE1fU1RBVEU6CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSIlMDRkICAgICUwMTJsbHUgIFMlZCAgICAlLTE0cyAgJS0zMHMoMHgleCkgIiwgcmVjSW5kZXgsCisJCQlwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLCAiTUxNIFN0YXRlOiIsCisJCQlsaW1fdHJhY2VfZ2V0X21sbV9zdGF0ZV9zdHJpbmcoKHVpbnQxNl90KSBwUmVjb3JkLT5kYXRhKSwKKwkJCXBSZWNvcmQtPmRhdGEpOworCQlicmVhazsKKwljYXNlIFRSQUNFX0NPREVfU01FX1NUQVRFOgorCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkiJTA0ZCAgICAlMDEybGx1ICBTJWQgICAgJS0xNHMgICUtMzBzKDB4JXgpICIsIHJlY0luZGV4LAorCQkJcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwgIlNNRSBTdGF0ZToiLAorCQkJbGltX3RyYWNlX2dldF9zbWVfc3RhdGVfc3RyaW5nKCh1aW50MTZfdCkgcFJlY29yZC0+ZGF0YSksCisJCQlwUmVjb3JkLT5kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFDRV9DT0RFX1RYX01HTVQ6CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSIlMDRkICAgICUwMTJsbHUgIFMlZCAgICAlLTE0cyAgJS0zMHMoMHgleCkgIiwgcmVjSW5kZXgsCisJCQlwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLCAiVFggTWdtdDoiLAorCQkJZnJhbWVTdWJ0eXBlU3RyW3BSZWNvcmQtPmRhdGFdLCBwUmVjb3JkLT5kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFRSQUNFX0NPREVfUlhfTUdNVDoKKwkJaWYgKExJTV9UUkFDRV9NQVhfU1VCVFlQRVMgPD0KKwkJICAgIExJTV9UUkFDRV9HRVRfU1VCVFlQRShwUmVjb3JkLT5kYXRhKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLCAiV3JvbmcgU3VidHlwZSAtICVkIiwKKwkJCQlMSU1fVFJBQ0VfR0VUX1NVQlRZUEUocFJlY29yZC0+ZGF0YSkpOworCQl9IGVsc2UgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCSIlMDRkICAgICUwMTJsbHUgIFMlZCAgICAlLTE0cyAgJS0zMHMoJWQpICAgIFNOOiAlZCAiLAorCQkJCXJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorCQkJCSJSWCBNZ210OiIsCisJCQkJZnJhbWVTdWJ0eXBlU3RyW0xJTV9UUkFDRV9HRVRfU1VCVFlQRQorCQkJCQkJCShwUmVjb3JkLT5kYXRhKV0sCisJCQkJTElNX1RSQUNFX0dFVF9TVUJUWVBFKHBSZWNvcmQtPmRhdGEpLAorCQkJCUxJTV9UUkFDRV9HRVRfU1NOKHBSZWNvcmQtPmRhdGEpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFRSQUNFX0NPREVfUlhfTUdNVF9EUk9QOgorCQlsaW1fbG9nKHBNYWMsIExPR0UsICIlMDRkICAgICUwMTJsbHUgIFMlZCAgICAlLTE0cyAgJS0zMHMoJWQpICAiLAorCQkJcmVjSW5kZXgsIHBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sCisJCQkiRHJvcCBSWCBNZ210OiIsCisJCQlfX2xpbV90cmFjZV9nZXRfbWdtdF9kcm9wX3JlYXNvbl9zdHJpbmcoKHVpbnQxNl90KSBwUmVjb3JkLT4KKwkJCQkJCQkJZGF0YSksIHBSZWNvcmQtPmRhdGEpOworCQlicmVhazsKKworCWNhc2UgVFJBQ0VfQ09ERV9SWF9NR01UX1RTRjoKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJIiUwNGQgICAgJTAxMmxsdSAgUyVkICAgICUtMTRzICAlLTMwczB4JXgoJWQpICIsCisJCQlyZWNJbmRleCwgcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwKKwkJCSJSWCBNZ210IFRTRjoiLCAiICIsIHBSZWNvcmQtPmRhdGEsIHBSZWNvcmQtPmRhdGEpOworCQlicmVhazsKKworCWNhc2UgVFJBQ0VfQ09ERV9UWF9DT01QTEVURToKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCAiJTA0ZCAlMDEybGx1IFMlZCAlLTE0cyAlZCAiLCByZWNJbmRleCwKKwkJCXBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sICJUWCBDb21wbGV0ZSIsCisJCQlwUmVjb3JkLT5kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFRSQUNFX0NPREVfVFhfU01FX01TRzoKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJIiUwNGQgICAgJTAxMmxsdSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSAiLCByZWNJbmRleCwKKwkJCXBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sICJUWCBTTUUgTXNnOiIsCisJCQltYWNfdHJhY2VfZ2V0X3NtZV9tc2dfc3RyaW5nKCh1aW50MTZfdCkgcFJlY29yZC0+ZGF0YSksCisJCQlwUmVjb3JkLT5kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFDRV9DT0RFX1JYX1NNRV9NU0c6CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSIlMDRkICAgICUwMTJsbHUgIFMlZCAgICAlLTE0cyAgJS0zMHMoMHgleCkgIiwgcmVjSW5kZXgsCisJCQlwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorCQkJTElNX1RSQUNFX0dFVF9ERUZSRF9PUl9EUk9QUEVEKHBSZWNvcmQtPgorCQkJCQkJICAgICAgIGRhdGEpID8gIkRlZi9EcnAgTElNIE1zZzoiCisJCQk6ICJSWCBTbWUgTXNnOiIsCisJCQltYWNfdHJhY2VfZ2V0X3NtZV9tc2dfc3RyaW5nKCh1aW50MTZfdCkgcFJlY29yZC0+ZGF0YSksCisJCQlwUmVjb3JkLT5kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFRSQUNFX0NPREVfVFhfV01BX01TRzoKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJIiUwNGQgICAgJTAxMmxsdSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSAiLCByZWNJbmRleCwKKwkJCXBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sICJUWCBXTUEgTXNnOiIsCisJCQltYWNfdHJhY2VfZ2V0X3dtYV9tc2dfc3RyaW5nKCh1aW50MTZfdCkgcFJlY29yZC0+ZGF0YSksCisJCQlwUmVjb3JkLT5kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFRSQUNFX0NPREVfUlhfV01BX01TRzoKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJIiUwNGQgICAgJTAxMmxsdSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSAiLCByZWNJbmRleCwKKwkJCXBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sCisJCQlMSU1fVFJBQ0VfR0VUX0RFRlJEX09SX0RST1BQRUQocFJlY29yZC0+CisJCQkJCQkgICAgICAgZGF0YSkgPyAiRGVmL0RycCBMSU0gTXNnOiIKKwkJCTogIlJYIFdNQSBNc2c6IiwKKwkJCW1hY190cmFjZV9nZXRfd21hX21zZ19zdHJpbmcoKHVpbnQxNl90KSBwUmVjb3JkLT5kYXRhKSwKKwkJCXBSZWNvcmQtPmRhdGEpOworCQlicmVhazsKKworCWNhc2UgVFJBQ0VfQ09ERV9UWF9MSU1fTVNHOgorCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkiJTA0ZCAgICAlMDEybGx1ICBTJWQgICAgJS0xNHMgICUtMzBzKDB4JXgpICIsIHJlY0luZGV4LAorCQkJcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwgIlRYIExJTSBNc2c6IiwKKwkJCW1hY190cmFjZV9nZXRfbGltX21zZ19zdHJpbmcoKHVpbnQxNl90KSBwUmVjb3JkLT5kYXRhKSwKKwkJCXBSZWNvcmQtPmRhdGEpOworCQlicmVhazsKKwljYXNlIFRSQUNFX0NPREVfUlhfTElNX01TRzoKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJIiUwNGQgICAgJTAxMmxsdSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSAiLCByZWNJbmRleCwKKwkJCXBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sCisJCQlMSU1fVFJBQ0VfR0VUX0RFRlJEX09SX0RST1BQRUQocFJlY29yZC0+CisJCQkJCQkgICAgICAgZGF0YSkgPyAiRGVmL0RycCBMSU0gTXNnOiIKKwkJCTogIlJYIExJTSBNc2ciLAorCQkJbWFjX3RyYWNlX2dldF9saW1fbXNnX3N0cmluZygodWludDE2X3QpIHBSZWNvcmQtPmRhdGEpLAorCQkJcFJlY29yZC0+ZGF0YSk7CisJCWJyZWFrOworCWNhc2UgVFJBQ0VfQ09ERV9UWF9DRkdfTVNHOgorCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkiJTA0ZCAgICAlMDEybGx1ICBTJWQgICAgJS0xNHMgICUtMzBzKDB4JXgpICIsIHJlY0luZGV4LAorCQkJcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwgIlRYIENGRyBNc2c6IiwKKwkJCW1hY190cmFjZV9nZXRfY2ZnX21zZ19zdHJpbmcoKHVpbnQxNl90KSBwUmVjb3JkLT5kYXRhKSwKKwkJCXBSZWNvcmQtPmRhdGEpOworCQlicmVhazsKKwljYXNlIFRSQUNFX0NPREVfUlhfQ0ZHX01TRzoKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJIiUwNGQgICAgJTAxMmxsdSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSAiLCByZWNJbmRleCwKKwkJCXBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sCisJCQlMSU1fVFJBQ0VfR0VUX0RFRlJEX09SX0RST1BQRUQocFJlY29yZC0+CisJCQkJCQkgICAgICAgZGF0YSkgPyAiRGVmL0RycCBMSU0gTXNnOiIKKwkJCTogIlJYIENGRyBNc2c6IiwKKwkJCW1hY190cmFjZV9nZXRfY2ZnX21zZ19zdHJpbmcoKHVpbnQxNl90KQorCQkJCQkJICAgICBNQUNfVFJBQ0VfR0VUX01TR19JRChwUmVjb3JkLT4KKwkJCQkJCQkJCSAgZGF0YSkpLAorCQkJcFJlY29yZC0+ZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFOgorCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkiJTA0ZCAgICAlMDEybGx1ICBTJWQgICAgJS0xNHMgICUtMzBzKDB4JXgpICIsIHJlY0luZGV4LAorCQkJcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwgIlRpbWVyIEFjdHZ0ZCIsCisJCQlfX2xpbV90cmFjZV9nZXRfdGltZXJfc3RyaW5nKCh1aW50MTZfdCkgcFJlY29yZC0+ZGF0YSksCisJCQlwUmVjb3JkLT5kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEU6CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSIlMDRkICAgICUwMTJsbHUgIFMlZCAgICAlLTE0cyAgJS0zMHMoMHgleCkgIiwgcmVjSW5kZXgsCisJCQlwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLCAiVGltZXIgRGVBY3R2dGQiLAorCQkJX19saW1fdHJhY2VfZ2V0X3RpbWVyX3N0cmluZygodWludDE2X3QpIHBSZWNvcmQtPmRhdGEpLAorCQkJcFJlY29yZC0+ZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBUUkFDRV9DT0RFX0lORk9fTE9HOgorCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkiJTA0ZCAgICAlMDEybGx1ICBTJWQgICAgJS0xNHMgICUtMzBzKDB4JXgpIFxuIiwKKwkJCXJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorCQkJIklORk9STUFUSU9OX0xPRyIsCisJCQltYWNfdHJhY2VfZ2V0X2luZm9fbG9nX3N0cmluZygodWludDE2X3QpIHBSZWNvcmQtPmRhdGEpLAorCQkJcFJlY29yZC0+ZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbV9sb2cocE1hYywgTE9HRSwgIiUwNGQgICAgJTAxMmxsdSAgUyVkICAgICUtMTRzKCVkKSAoMHgleCkgIiwKKwkJCXJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorCQkJIlVua25vd24gQ29kZSIsIHBSZWNvcmQtPmNvZGUsIHBSZWNvcmQtPmRhdGEpOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgbWFjX3RyYWNlX21zZ190eCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb24sIHVpbnQzMl90IGRhdGEpCit7CisKKwl1aW50MTZfdCBtc2dJZCA9ICh1aW50MTZfdCkgTUFDX1RSQUNFX0dFVF9NU0dfSUQoZGF0YSk7CisJdWludDhfdCBtb2R1bGVJZCA9ICh1aW50OF90KSBNQUNfVFJBQ0VfR0VUX01PRFVMRV9JRChkYXRhKTsKKworCXN3aXRjaCAobW9kdWxlSWQpIHsKKwljYXNlIFNJUl9MSU1fTU9EVUxFX0lEOgorCQlpZiAobXNnSWQgPj0gU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOKQorCQkJbWFjX3RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVFhfTElNX01TRywgc2Vzc2lvbiwgZGF0YSk7CisJCWVsc2UKKwkJCW1hY190cmFjZShwTWFjLCBUUkFDRV9DT0RFX1RYX1NNRV9NU0csIHNlc3Npb24sIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNJUl9XTUFfTU9EVUxFX0lEOgorCQltYWNfdHJhY2UocE1hYywgVFJBQ0VfQ09ERV9UWF9XTUFfTVNHLCBzZXNzaW9uLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfQ0ZHX01PRFVMRV9JRDoKKwkJbWFjX3RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVFhfQ0ZHX01TRywgc2Vzc2lvbiwgZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1hY190cmFjZShwTWFjLCBtb2R1bGVJZCwgc2Vzc2lvbiwgZGF0YSk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBtYWNfdHJhY2VfbXNnX3R4X25ldyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IG1vZHVsZSwgdWludDhfdCBzZXNzaW9uLAorCQkJICB1aW50MzJfdCBkYXRhKQoreworCXVpbnQxNl90IG1zZ0lkID0gKHVpbnQxNl90KSBNQUNfVFJBQ0VfR0VUX01TR19JRChkYXRhKTsKKwl1aW50OF90IG1vZHVsZUlkID0gKHVpbnQ4X3QpIE1BQ19UUkFDRV9HRVRfTU9EVUxFX0lEKGRhdGEpOworCisJc3dpdGNoIChtb2R1bGVJZCkgeworCWNhc2UgU0lSX0xJTV9NT0RVTEVfSUQ6CisJCWlmIChtc2dJZCA+PSBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4pCisJCQltYWNfdHJhY2VfbmV3KHBNYWMsIG1vZHVsZSwgVFJBQ0VfQ09ERV9UWF9MSU1fTVNHLAorCQkJCSAgICAgIHNlc3Npb24sIGRhdGEpOworCQllbHNlCisJCQltYWNfdHJhY2VfbmV3KHBNYWMsIG1vZHVsZSwgVFJBQ0VfQ09ERV9UWF9TTUVfTVNHLAorCQkJCSAgICAgIHNlc3Npb24sIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNJUl9XTUFfTU9EVUxFX0lEOgorCQltYWNfdHJhY2VfbmV3KHBNYWMsIG1vZHVsZSwgVFJBQ0VfQ09ERV9UWF9XTUFfTVNHLCBzZXNzaW9uLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfQ0ZHX01PRFVMRV9JRDoKKwkJbWFjX3RyYWNlX25ldyhwTWFjLCBtb2R1bGUsIFRSQUNFX0NPREVfVFhfQ0ZHX01TRywgc2Vzc2lvbiwgZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1hY190cmFjZShwTWFjLCBtb2R1bGVJZCwgc2Vzc2lvbiwgZGF0YSk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIGJpdDMxOiBSeCBtZXNzYWdlIGRlZmZlcnJlZCBvciBub3QKKyAqIGJpdCAwLTE1OiBtZXNzYWdlIElEOgorICovCit2b2lkIG1hY190cmFjZV9tc2dfcngodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uLCB1aW50MzJfdCBkYXRhKQoreworCXVpbnQxNl90IG1zZ0lkID0gKHVpbnQxNl90KSBNQUNfVFJBQ0VfR0VUX01TR19JRChkYXRhKTsKKwl1aW50OF90IG1vZHVsZUlkID0gKHVpbnQ4X3QpIE1BQ19UUkFDRV9HRVRfTU9EVUxFX0lEKGRhdGEpOworCisJc3dpdGNoIChtb2R1bGVJZCkgeworCWNhc2UgU0lSX0xJTV9NT0RVTEVfSUQ6CisJCWlmIChtc2dJZCA+PSBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4pCisJCQltYWNfdHJhY2UocE1hYywgVFJBQ0VfQ09ERV9SWF9MSU1fTVNHLCBzZXNzaW9uLCBkYXRhKTsKKwkJZWxzZQorCQkJbWFjX3RyYWNlKHBNYWMsIFRSQUNFX0NPREVfUlhfU01FX01TRywgc2Vzc2lvbiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU0lSX1dNQV9NT0RVTEVfSUQ6CisJCW1hY190cmFjZShwTWFjLCBUUkFDRV9DT0RFX1JYX1dNQV9NU0csIHNlc3Npb24sIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNJUl9DRkdfTU9EVUxFX0lEOgorCQltYWNfdHJhY2UocE1hYywgVFJBQ0VfQ09ERV9SWF9DRkdfTVNHLCBzZXNzaW9uLCBkYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWFjX3RyYWNlKHBNYWMsIG1vZHVsZUlkLCBzZXNzaW9uLCBkYXRhKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogYml0MzE6IFJ4IG1lc3NhZ2UgZGVmZmVycmVkIG9yIG5vdAorICogYml0IDAtMTU6IG1lc3NhZ2UgSUQ6CisgKi8KK3ZvaWQgbWFjX3RyYWNlX21zZ19yeF9uZXcodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBtb2R1bGUsIHVpbnQ4X3Qgc2Vzc2lvbiwKKwkJCSAgdWludDMyX3QgZGF0YSkKK3sKKwl1aW50MTZfdCBtc2dJZCA9ICh1aW50MTZfdCkgTUFDX1RSQUNFX0dFVF9NU0dfSUQoZGF0YSk7CisJdWludDhfdCBtb2R1bGVJZCA9ICh1aW50OF90KSBNQUNfVFJBQ0VfR0VUX01PRFVMRV9JRChkYXRhKTsKKworCXN3aXRjaCAobW9kdWxlSWQpIHsKKwljYXNlIFNJUl9MSU1fTU9EVUxFX0lEOgorCQlpZiAobXNnSWQgPj0gU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOKQorCQkJbWFjX3RyYWNlX25ldyhwTWFjLCBtb2R1bGUsIFRSQUNFX0NPREVfUlhfTElNX01TRywKKwkJCQkgICAgICBzZXNzaW9uLCBkYXRhKTsKKwkJZWxzZQorCQkJbWFjX3RyYWNlX25ldyhwTWFjLCBtb2R1bGUsIFRSQUNFX0NPREVfUlhfU01FX01TRywKKwkJCQkgICAgICBzZXNzaW9uLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfV01BX01PRFVMRV9JRDoKKwkJbWFjX3RyYWNlX25ldyhwTWFjLCBtb2R1bGUsIFRSQUNFX0NPREVfUlhfV01BX01TRywgc2Vzc2lvbiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU0lSX0NGR19NT0RVTEVfSUQ6CisJCW1hY190cmFjZV9uZXcocE1hYywgbW9kdWxlLCBUUkFDRV9DT0RFX1JYX0NGR19NU0csIHNlc3Npb24sIGRhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltYWNfdHJhY2UocE1hYywgbW9kdWxlSWQsIHNlc3Npb24sIGRhdGEpOworCQlicmVhazsKKwl9Cit9CisKK3VpbnQ4X3QgKmxpbV90cmFjZV9nZXRfbWxtX3N0YXRlX3N0cmluZyh1aW50MzJfdCBtbG1TdGF0ZSkKK3sKKwlzd2l0Y2ggKG1sbVN0YXRlKSB7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9PRkZMSU5FX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX0lETEVfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9QQVNTSVZFX1NDQU5fU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfSk9JTl9CRUFDT05fU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fSk9JTkVEX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUyX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUzX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1dUX0FVVEhfRlJBTUU0X1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX0FVVEhfUlNQX1RJTUVPVVRfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9BU1NPQ19SU1BfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfUkVBU1NPQ19SU1BfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fQVNTT0NJQVRFRF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9SRUFTU09DSUFURURfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9BU1NPQ19DTkZfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fTEVBUk5fU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfREVMX0JTU19SU1BfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfQVNTT0NfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUFJFQVNTT0NfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUkVBU1NPQ19TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9BRERfU1RBX1JTUF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9BU1NPQ19ERUxfU1RBX1JTUF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9TRVRfQlNTX0tFWV9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9TRVRfU1RBX0tFWV9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9TRVRfU1RBX0JDQVNUS0VZX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1dUX1NFVF9NSU1PUFNfU1RBVEUpOworCWRlZmF1bHQ6CisJCXJldHVybiAoIlVOS05PV04iKTsKKwkJYnJlYWs7CisJfQorfQorCit1aW50OF90ICpsaW1fdHJhY2VfZ2V0X3NtZV9zdGF0ZV9zdHJpbmcodWludDMyX3Qgc21lU3RhdGUpCit7CisJc3dpdGNoIChzbWVTdGF0ZSkgeworCisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9PRkZMSU5FX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX0lETEVfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfU1VTUEVORF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9TQ0FOX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX0pPSU5fU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfV1RfQVVUSF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9BU1NPQ19TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX1JFQVNTT0NfTElOS19GQUlMX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX0pPSU5fRkFJTFVSRV9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1JFQVNTT0NJQVRFRF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9MSU5LX0VTVF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9MSU5LX0VTVF9XVF9TQ0FOX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX1BSRV9BVVRIX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9TVEFSVF9CU1NfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfV1RfU1RPUF9CU1NfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfTk9STUFMX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX0NIQU5ORUxfU0NBTl9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9OT1JNQUxfQ0hBTk5FTF9TQ0FOX1NUQVRFKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCJVTktOT1dOIik7CisJCWJyZWFrOworCX0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV90eXBlcy5oIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTVlNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fdHlwZXMuaApAQCAtMCwwICsxLDg2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBsaW1fdHlwZXMuaCBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCBieSBhbGwKKyAqIGFsbCBMSU0gbW9kdWxlcy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzExLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpZm5kZWYgX19MSU1fVFlQRVNfSAorI2RlZmluZSBfX0xJTV9UWVBFU19ICisKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorI2luY2x1ZGUgInNpcl9jb21tb24uaCIKKyNpbmNsdWRlICJzaXJfbWFjX3Byb3RfZGVmLmgiCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisKKyNpbmNsdWRlICJsaW1fYXBpLmgiCisjaW5jbHVkZSAibGltX2RlYnVnLmgiCisjaW5jbHVkZSAibGltX3NlbmRfc21lX3JzcF9tZXNzYWdlcy5oIgorI2luY2x1ZGUgInN5c19nbG9iYWwuaCIKKyNpbmNsdWRlICJkcGhfZ2xvYmFsLmgiCisjaW5jbHVkZSAicGFyc2VyX2FwaS5oIgorI2luY2x1ZGUgIndtYV9pZi5oIgorCisjZGVmaW5lIExJTktfVEVTVF9ERUZFUiAxCisKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ05GX1RJTUVSX0RFQUNUICAgICAgICAweDY2MDAKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ05GX1RJTUVSX0FDVCAgICAgICAgICAweDY2MDEKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVVUSF9SU1BfVElNRVJfREVBQ1QgICAweDY2MDIKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVVUSF9SU1BfVElNRVJfQUNUICAgICAweDY2MDMKKworLyogTUxNIG1lc3NhZ2UgdHlwZXMgKi8KKyNkZWZpbmUgTElNX01MTV9NU0dfU1RBUlQgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTElNX01MTV9TQ0FOX1JFUSAgICAgICAgICAgIExJTV9NTE1fTVNHX1NUQVJUCisjZGVmaW5lIExJTV9NTE1fU0NBTl9DTkYgICAgICAgICAgICAoTElNX01MTV9NU0dfU1RBUlQgKyAxKQorI2RlZmluZSBMSU1fTUxNX1NUQVJUX1JFUSAgICAgICAgICAgKExJTV9NTE1fTVNHX1NUQVJUICsgMikKKyNkZWZpbmUgTElNX01MTV9TVEFSVF9DTkYgICAgICAgICAgIChMSU1fTUxNX01TR19TVEFSVCArIDMpCisjZGVmaW5lIExJTV9NTE1fSk9JTl9SRVEgICAgICAgICAgICAoTElNX01MTV9NU0dfU1RBUlQgKyA0KQorI2RlZmluZSBMSU1fTUxNX0pPSU5fQ05GICAgICAgICAgICAgKExJTV9NTE1fTVNHX1NUQVJUICsgNSkKKyNkZWZpbmUgTElNX01MTV9BVVRIX1JFUSAgICAgICAgICAgIChMSU1fTUxNX01TR19TVEFSVCArIDYpCisjZGVmaW5lIExJTV9NTE1fQVVUSF9DTkYgICAgICAgICAgICAoTElNX01MTV9NU0dfU1RBUlQgKyA3KQorI2RlZmluZSBMSU1fTUxNX0FVVEhfSU5EICAgICAgICAgICAgKExJTV9NTE1fTVNHX1NUQVJUICsgOCkKKyNkZWZpbmUgTElNX01MTV9BU1NPQ19SRVEgICAgICAgICAgIChMSU1fTUxNX01TR19TVEFSVCArIDkpCisjZGVmaW5lIExJTV9NTE1fQVNTT0NfQ05GICAgICAgICAgICAoTElNX01MTV9NU0dfU1RBUlQgKyAxMCkKKyNkZWZpbmUgTElNX01MTV9BU1NPQ19JTkQgICAgICAgICAgIChMSU1fTUxNX01TR19TVEFSVCArIDExKQorI2RlZmluZSBMSU1fTUxNX0RJU0FTU09DX1JFUSAgICAgICAgKExJTV9NTE1fTVNHX1NUQVJUICsgMTIpCisjZGVmaW5lIExJTV9NTE1fRElTQVNTT0NfQ05GICAgICAgICAoTElNX01MTV9NU0dfU1RBUlQgKyAxMykKKyNkZWZpbmUgTElNX01MTV9ESVNBU1NPQ19JTkQgICAgICAgIChMSU1fTUxNX01TR19TVEFSVCArIDE0KQorI2RlZmluZSBMSU1fTUxNX1JFQVNTT0NfUkVRICAgICAgICAgKExJTV9NTE1fTVNHX1NUQVJUICsgMTUpCisjZGVmaW5lIExJTV9NTE1fUkVBU1NPQ19DTkYgICAgICAgICAoTElNX01MTV9NU0dfU1RBUlQgKyAxNikKKyNkZWZpbmUgTElNX01MTV9SRUFTU09DX0lORCAgICAgICAgIChMSU1fTUxNX01TR19TVEFSVCArIDE3KQorI2RlZmluZSBMSU1fTUxNX0RFQVVUSF9SRVEgICAgICAgICAgKExJTV9NTE1fTVNHX1NUQVJUICsgMTgpCisjZGVmaW5lIExJTV9NTE1fREVBVVRIX0NORiAgICAgICAgICAoTElNX01MTV9NU0dfU1RBUlQgKyAxOSkKKyNkZWZpbmUgTElNX01MTV9ERUFVVEhfSU5EICAgICAgICAgIChMSU1fTUxNX01TR19TVEFSVCArIDIwKQorI2RlZmluZSBMSU1fTUxNX1RTUEVDX1JFUSAgICAgICAgICAgKExJTV9NTE1fTVNHX1NUQVJUICsgMjEpCisjZGVmaW5lIExJTV9NTE1fVFNQRUNfQ05GICAgICAgICAgICAoTElNX01MTV9NU0dfU1RBUlQgKyAyMikKKyNkZWZpbmUgTElNX01MTV9UU1BFQ19JTkQgICAgICAgICAgIChMSU1fTUxNX01TR19TVEFSVCArIDIzKQorI2RlZmluZSBMSU1fTUxNX1NFVEtFWVNfUkVRICAgICAgICAgKExJTV9NTE1fTVNHX1NUQVJUICsgMjQpCisjZGVmaW5lIExJTV9NTE1fU0VUS0VZU19DTkYgICAgICAgICAoTElNX01MTV9NU0dfU1RBUlQgKyAyNSkKKyNkZWZpbmUgTElNX01MTV9MSU5LX1RFU1RfU1RPUF9SRVEgIChMSU1fTUxNX01TR19TVEFSVCArIDMwKQorI2RlZmluZSBMSU1fTUxNX1BVUkdFX1NUQV9JTkQgICAgICAgKExJTV9NTE1fTVNHX1NUQVJUICsgMzEpCisvKgorICogVmFsdWVzIChMSU1fTUxNX01TR19TVEFSVCArIDMyKSB0aHJvdWdoCisgKiAoTElNX01MTV9NU0dfU1RBUlQgKyA0MCkgYXJlIHVudXNlZC4KKyAqLworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorI2RlZmluZSBMSU1fTUxNX09FTV9EQVRBX1JFUSAgICAgICAgICAgIChMSU1fTUxNX01TR19TVEFSVCArIDQxKQorI2RlZmluZSBMSU1fTUxNX09FTV9EQVRBX0NORiAgICAgICAgICAgIChMSU1fTUxNX01TR19TVEFSVCArIDQyKQorI2VuZGlmCisKKyNkZWZpbmUgTElNX0hBU0hfQUREICAgICAgICAgICAgMAorI2RlZmluZSBMSU1fSEFTSF9VUERBVEUgICAgICAgICAxCisKKyNkZWZpbmUgTElNX1dFUF9JTl9GQyAgICAgICAgICAgMQorI2RlZmluZSBMSU1fTk9fV0VQX0lOX0ZDICAgICAgICAwCisKKyNkZWZpbmUgTElNX0RFQ1JZUFRfSUNWX0ZBSUwgICAgMQorCisvKiAvIERlZmluaXRpb25zIHRvIGRpc3RpbnF1aXNoIGJldHdlZW4gQXNzb2NpYXRpb24vUmVhc3NvY2lhdG9uICovCisjZGVmaW5lIExJTV9BU1NPQyAgICAwCisjZGVmaW5lIExJTV9SRUFTU09DICAxCisKKy8qIC8gTWluaW11bSBNZW1vcnkgYmxvY2tzIHJlcXVpcmUgZm9yIGRpZmZlcmVudCBzY2VuYXJpbyAqLworI2RlZmluZSBMSU1fTUlOX01FTV9BU1NPQyAgICAgICA0CisKKy8qIC8gVmVyaWZpZXMgd2hldGhlciBnaXZlbiBtYWMgYWRkciBtYXRjaGVzIHRoZSBDVVJSRU5UIEJzc2lkICovCisjZGVmaW5lIElTX0NVUlJFTlRfQlNTSUQocE1hYywgYWRkciwgcHNlc3Npb25FbnRyeSkgIChjZGZfbWVtX2NvbXBhcmUoYWRkciwgXAorCQkJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgXAorCQkJCQkJCQkgICAgICBzaXplb2YocHNlc3Npb25FbnRyeS0+YnNzSWQpKSkKKy8qIC8gVmVyaWZpZXMgd2hldGhlciBnaXZlbiBhZGRyIG1hdGNoZXMgdGhlIFJFQVNTT0MgQnNzaWQgKi8KKyNkZWZpbmUgSVNfUkVBU1NPQ19CU1NJRChwTWFjLCBhZGRyLCBwc2Vzc2lvbkVudHJ5KSAgKGNkZl9tZW1fY29tcGFyZShhZGRyLCBcCisJCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCwgXAorCQkJCQkJCQkgICAgICBzaXplb2YocHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkKSkpCisKKyNkZWZpbmUgUkVRX1RZUEVfUkVHSVNUUkFSICAgICAgICAgICAgICAgICAgICgweDIpCisjZGVmaW5lIFJFUV9UWVBFX1dMQU5fTUFOQUdFUl9SRUdJU1RSQVIgICAgICAoMHgzKQorCisjZGVmaW5lIFJFU1BfVFlQRV9SRUdJU1RSQVIgICAgICAgICAgICAgICAgICAoMHgyKQorI2RlZmluZSBSRVNQX1RZUEVfRU5ST0xMRUVfSU5GT19PTkxZICAgICAgICAgKDB4MCkKKyNkZWZpbmUgUkVTUF9UWVBFX0VOUk9MTEVFX09QRU5fODAyMVggICAgICAgICgweDEpCisjZGVmaW5lIFJFU1BfVFlQRV9BUCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzKQorI2RlZmluZSBMSU1fVFhfRlJBTUVTX1RIUkVTSE9MRF9PTl9DSElQICAgICAgIDMwMAorCisKKyNkZWZpbmUgSEFMX1RYQ09NUF9SRVFVRVNURURfTUFTSyAgICAgICAgICAgMHgxIC8qIGJpdCAwIGZvciBUeENvbXAgaW50ciByZXF1ZXN0ZWQuICovCisjZGVmaW5lIEhBTF9VU0VfU0VMRl9TVEFfUkVRVUVTVEVEX01BU0sgICAgIDB4MiAvKiBiaXQgMSBmb3IgU1RBIG92ZXJ3cml0ZSB3aXRoIHNlbGZTdGEgUmVxdWVzdGVkLiAqLworI2RlZmluZSBIQUxfVFhfTk9fRU5DUllQVElPTl9NQVNLICAgICAgICAgICAweDQgLyogYml0IDIuIElmIHNldCwgdGhlIGZyYW1lIGlzIG5vdCB0byBiZSBlbmNyeXB0ZWQgKi8KKyNpZiBkZWZpbmVkKExJQlJBX1dBUElfU1VQUE9SVCkKKyNkZWZpbmUgSEFMX1dBUElfU1RBX01BU0sgICAgICAgICAgICAweDggICAgICAgIC8qIGJpdCAzLiBJZiBzZXQsIHRoaXMgZnJhbWUgaXMgZm9yIFdBUEkgc3RhdGlvbiAqLworI2VuZGlmCisKKyNkZWZpbmUgSEFMX1RSSUdHRVJfRU5BQkxFRF9BQ19NQVNLICAgICAgICAgMHgxMCAgICAgICAgLyogYml0IDQgZm9yIGRhdGEgZnJhbWVzIGJlbG9uZ2luZyB0byB0cmlnZ2VyIGVuYWJsZWQgQUMgKi8KKyNkZWZpbmUgSEFMX1VTRV9OT19BQ0tfUkVRVUVTVEVEX01BU0sgICAgICAgMHgyMAorCisjZGVmaW5lIEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUUgMHg0MCAgICAgIC8qIEJpdCA2IHdpbGwgYmUgdXNlZCB0byBjb250cm9sIEJEIHJhdGUgZm9yIE1hbmFnZW1lbnQgZnJhbWVzICovCisjZGVmaW5lIEhBTF9VU0VfUEVFUl9TVEFfUkVRVUVTVEVEX01BU0sgICAweDgwICAvKiBiaXQgNyB3aWxsIGJlIHVzZWQgdG8gY29udHJvbCBmcmFtZXMgZm9yIHAycCBpbnRlcmZhY2UgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisjZGVmaW5lIEhBTF9URExTX1BFRVJfU1RBX01BU0sgICAgICAgICAgICAgIDB4ODAgICAgICAgIC8qIGJpdCA3IHNldCBmb3IgVERMUyBwZWVyIHN0YXRpb24gKi8KKyNlbmRpZgorCisKKy8qIGVudW1zIHVzZWQgYnkgTElNIGFyZSBhcyBmb2xsb3dzICovCisKK2VudW0gZUxpbURpc2Fzc29jVHJpZ2dlciB7CisJZUxJTV9IT1NUX0RJU0FTU09DLAorCWVMSU1fUEVFUl9FTlRJVFlfRElTQVNTT0MsCisJZUxJTV9MSU5LX01PTklUT1JJTkdfRElTQVNTT0MsCisJZUxJTV9QUk9NSVNDVU9VU19NT0RFX0RJU0FTU09DLAorCWVMSU1fSE9TVF9ERUFVVEgsCisJZUxJTV9QRUVSX0VOVElUWV9ERUFVVEgsCisJZUxJTV9MSU5LX01PTklUT1JJTkdfREVBVVRILAorCWVMSU1fSk9JTl9GQUlMVVJFLAorCWVMSU1fUkVBU1NPQ19SRUpFQ1QKK307CisKKy8qIFJlYXNvbiBjb2RlIHRvIGRldGVybWluZSB0aGUgY2hhbm5lbCBjaGFuZ2UgY29udGV4dCB3aGlsZSBzZW5kaW5nCisgKiBXTUFfQ0hOTF9TV0lUQ0hfUkVRIG1lc3NhZ2UgdG8gSEFMCisgKi8KK2VudW0gZUNoYW5uZWxDaGFuZ2VSZWFzb25Db2RlcyB7CisJTElNX1NXSVRDSF9DSEFOTkVMX1JFQVNTT0MsCisJTElNX1NXSVRDSF9DSEFOTkVMX0pPSU4sCisJTElNX1NXSVRDSF9DSEFOTkVMX09QRVJBVElPTiwgICAvKiBHZW5lcmljIGNoYW5nZSBjaGFubmVsICovCisJTElNX1NXSVRDSF9DSEFOTkVMX1NBUF9ERlMsICAgICAvKiBERlMgY2hhbm5lbCBjaGFuZ2UgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHNMaW1BdXRoUnNwVGltZW91dCB7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7Cit9IHRMaW1BdXRoUnNwVGltZW91dDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVN0YXJ0UmVxIHsKKwl0U2lyTWFjU1NpZCBzc0lkOworCXRTaXJCc3NUeXBlIGJzc1R5cGU7CisJdFNpck1hY0FkZHIgYnNzSWQ7CisJdFNpck1hY0JlYWNvbkludGVydmFsIGJlYWNvblBlcmlvZDsKKwl1aW50OF90IGR0aW1QZXJpb2Q7CisJdFNpck1hY0NmUGFyYW1TZXQgY2ZQYXJhbVNldDsKKwl0U2lyTWFjQ2hhbk51bSBjaGFubmVsTnVtYmVyOworCWVQaHlDaGFuQm9uZFN0YXRlIGNiTW9kZTsKKwl1aW50MTZfdCBhdGltV2luZG93OworCXRTaXJNYWNSYXRlU2V0IHJhdGVTZXQ7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogQWRkZWQgRm9yIEJULUFNUCBTdXBwb3J0ICovCisKKwkvKiBQYXJhbWV0ZXJzIHJlcWQgZm9yIG5ldyBIQUwgKG1lc3NhZ2UpIGludGVyZmFjZSAqLworCXRTaXJOd1R5cGUgbndUeXBlOworCXVpbnQ4X3QgaHRDYXBhYmxlOworCXRTaXJNYWNIVE9wZXJhdGluZ01vZGUgaHRPcGVyTW9kZTsKKwl1aW50OF90IGR1YWxDVFNQcm90ZWN0aW9uOworCXVpbnQ4X3QgdHhDaGFubmVsV2lkdGhTZXQ7CisJdWludDhfdCBzc2lkSGlkZGVuOworCXVpbnQ4X3Qgd3BzX3N0YXRlOworCXVpbnQ4X3Qgb2Jzc1Byb3RFbmFibGVkOworfSB0TGltTWxtU3RhcnRSZXEsICp0cExpbU1sbVN0YXJ0UmVxOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtU3RhcnRDbmYgeworCXRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworfSB0TGltTWxtU3RhcnRDbmYsICp0cExpbU1sbVN0YXJ0Q25mOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtU2NhbkNuZiB7CisJdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGU7CisJdWludDE2X3Qgc2NhblJlc3VsdExlbmd0aDsKKwl0U2lyQnNzRGVzY3JpcHRpb24gYnNzRGVzY3JpcHRpb25bMV07CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRMaW1NbG1TY2FuQ25mLCAqdHBMaW1NbG1TY2FuQ25mOworCit0eXBlZGVmIHN0cnVjdCBzTGltU2NhblJlc3VsdCB7CisJdWludDE2X3QgbnVtQnNzRGVzY3JpcHRpb25zOworCXRTaXJCc3NEZXNjcmlwdGlvbiBic3NEZXNjcmlwdGlvblsxXTsKK30gdExpbVNjYW5SZXN1bHQ7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1Kb2luQ25mIHsKKwl0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZTsKKwl1aW50MTZfdCBwcm90U3RhdHVzQ29kZTsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdExpbU1sbUpvaW5DbmYsICp0cExpbU1sbUpvaW5DbmY7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1Bc3NvY1JlcSB7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisJdWludDMyX3QgYXNzb2NGYWlsdXJlVGltZW91dDsKKwl1aW50MTZfdCBjYXBhYmlsaXR5SW5mbzsKKwl0U2lyTWFjTGlzdGVuSW50ZXJ2YWwgbGlzdGVuSW50ZXJ2YWw7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRMaW1NbG1Bc3NvY1JlcSwgKnRwTGltTWxtQXNzb2NSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1Bc3NvY0NuZiB7CisJdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGU7ICAgICAvKiBJbnRlcm5hbCBzdGF0dXMgY29kZS4gKi8KKwl1aW50MTZfdCBwcm90U3RhdHVzQ29kZTsgICAgICAgIC8qIFByb3RvY29sIFN0YXR1cyBjb2RlLiAqLworCXVpbnQ4X3Qgc2Vzc2lvbklkOworfSB0TGltTWxtQXNzb2NDbmYsICp0cExpbU1sbUFzc29jQ25mOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtQXNzb2NJbmQgeworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXVpbnQxNl90IGFpZDsKKwl0QW5pQXV0aFR5cGUgYXV0aFR5cGU7CisJdEFuaVNTSUQgc3NJZDsKKwl0U2lyUlNOaWUgcnNuSUU7CisJdFNpcldBUElpZSB3YXBpSUU7CisJdFNpckFkZGllIGFkZElFOyAgICAgICAgLyogYWRkaXRpb25hbCBJRSByZWNlaXZlZCBmcm9tIHRoZSBwZWVyLCB3aGljaCBwb3NzaWJseSBpbmNsdWRlcyBXU0MgSUUgYW5kL29yIFAyUCBJRS4gKi8KKwl0U2lyTWFjQ2FwYWJpbGl0eUluZm8gY2FwYWJpbGl0eUluZm87CisJdEFuaUJvb2wgc3BlY3RydW1NZ3RJbmRpY2F0b3I7CisJdFNpck1hY1Bvd2VyQ2FwSW5mbyBwb3dlckNhcDsKKwl0U2lyU3VwQ2hubCBzdXBwb3J0ZWRDaGFubmVsczsKKwl1aW50OF90IHNlc3Npb25JZDsKKworCXRBbmlCb29sIFdtbVN0YUluZm9QcmVzZW50OworCisJLyogUmVxdWlyZWQgZm9yIGluZGljYXRpbmcgdGhlIGZyYW1lcyB0byB1cHBlciBsYXllciAqLworCXVpbnQzMl90IGJlYWNvbkxlbmd0aDsKKwl1aW50OF90ICpiZWFjb25QdHI7CisJdWludDMyX3QgYXNzb2NSZXFMZW5ndGg7CisJdWludDhfdCAqYXNzb2NSZXFQdHI7CisJdFNpclNtZUNoYW5JbmZvIGNoYW5faW5mbzsKK30gdExpbU1sbUFzc29jSW5kLCAqdHBMaW1NbG1Bc3NvY0luZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVJlYXNzb2NSZXEgeworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXVpbnQzMl90IHJlYXNzb2NGYWlsdXJlVGltZW91dDsKKwl1aW50MTZfdCBjYXBhYmlsaXR5SW5mbzsKKwl0U2lyTWFjTGlzdGVuSW50ZXJ2YWwgbGlzdGVuSW50ZXJ2YWw7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRMaW1NbG1SZWFzc29jUmVxLCAqdHBMaW1NbG1SZWFzc29jUmVxOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtUmVhc3NvY0NuZiB7CisJdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGU7CisJdWludDE2X3QgcHJvdFN0YXR1c0NvZGU7ICAgICAgICAvKiBQcm90b2NvbCBTdGF0dXMgY29kZS4gKi8KKwl1aW50OF90IHNlc3Npb25JZDsKK30gdExpbU1sbVJlYXNzb2NDbmYsICp0cExpbU1sbVJlYXNzb2NDbmY7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1SZWFzc29jSW5kIHsKKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl0U2lyTWFjQWRkciBjdXJyZW50QXBBZGRyOworCXVpbnQxNl90IGFpZDsKKwl0QW5pQXV0aFR5cGUgYXV0aFR5cGU7CisJdEFuaVNTSUQgc3NJZDsKKwl0U2lyUlNOaWUgcnNuSUU7CisJdFNpcldBUElpZSB3YXBpSUU7CisJdFNpckFkZGllIGFkZElFOyAgICAgICAgLyogYWRkaXRpb25hbCBJRSByZWNlaXZlZCBmcm9tIHRoZSBwZWVyLCB3aGljaCBjYW4gYmUgV1NDIElFIGFuZC9vciBQMlAgSUUuICovCisJdFNpck1hY0NhcGFiaWxpdHlJbmZvIGNhcGFiaWxpdHlJbmZvOworCXRBbmlCb29sIHNwZWN0cnVtTWd0SW5kaWNhdG9yOworCXRTaXJNYWNQb3dlckNhcEluZm8gcG93ZXJDYXA7CisJdFNpclN1cENobmwgc3VwcG9ydGVkQ2hhbm5lbHM7CisKKwl0QW5pQm9vbCBXbW1TdGFJbmZvUHJlc2VudDsKKworCS8qIFJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZXMgdG8gdXBwZXIgbGF5ZXIgKi8KKwl1aW50MzJfdCBiZWFjb25MZW5ndGg7CisJdWludDhfdCAqYmVhY29uUHRyOworCXVpbnQzMl90IGFzc29jUmVxTGVuZ3RoOworCXVpbnQ4X3QgKmFzc29jUmVxUHRyOworfSB0TGltTWxtUmVhc3NvY0luZCwgKnRwTGltTWxtUmVhc3NvY0luZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbUF1dGhDbmYgeworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXRBbmlBdXRoVHlwZSBhdXRoVHlwZTsKKwl0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZTsKKwl1aW50MTZfdCBwcm90U3RhdHVzQ29kZTsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdExpbU1sbUF1dGhDbmYsICp0cExpbU1sbUF1dGhDbmY7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1EZWF1dGhSZXEgeworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXVpbnQxNl90IHJlYXNvbkNvZGU7CisJdWludDE2X3QgZGVhdXRoVHJpZ2dlcjsKKwl1aW50MTZfdCBhaWQ7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogQWRkZWQgZm9yIEJULUFNUCBTVVBQT1JUICovCisKK30gdExpbU1sbURlYXV0aFJlcSwgKnRwTGltTWxtRGVhdXRoUmVxOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtRGVhdXRoQ25mIHsKKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZTsKKwl1aW50MTZfdCBkZWF1dGhUcmlnZ2VyOworCXVpbnQxNl90IGFpZDsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdExpbU1sbURlYXV0aENuZiwgKnRwTGltTUxtRGVhdXRoQ25mOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtRGVhdXRoSW5kIHsKKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl1aW50MTZfdCByZWFzb25Db2RlOworCXVpbnQxNl90IGRlYXV0aFRyaWdnZXI7CisJdWludDE2X3QgYWlkOworfSB0TGltTWxtRGVhdXRoSW5kLCAqdHBMaW1NbG1EZWF1dGhJbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1EaXNhc3NvY1JlcSB7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisJdWludDE2X3QgcmVhc29uQ29kZTsKKwl1aW50MTZfdCBkaXNhc3NvY1RyaWdnZXI7CisJdWludDE2X3QgYWlkOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworfSB0TGltTWxtRGlzYXNzb2NSZXEsICp0cExpbU1sbURpc2Fzc29jUmVxOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtRGlzYXNzb2NDbmYgeworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlOworCXVpbnQxNl90IGRpc2Fzc29jVHJpZ2dlcjsKKwl1aW50MTZfdCBhaWQ7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRMaW1NbG1EaXNhc3NvY0NuZiwgKnRwTGltTWxtRGlzYXNzb2NDbmY7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1EaXNhc3NvY0luZCB7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisJdWludDE2X3QgcmVhc29uQ29kZTsKKwl1aW50MTZfdCBkaXNhc3NvY1RyaWdnZXI7CisJdWludDE2X3QgYWlkOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworfSB0TGltTWxtRGlzYXNzb2NJbmQsICp0cExpbU1sbURpc2Fzc29jSW5kOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtUHVyZ2VTdGFSZXEgeworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXVpbnQxNl90IGFpZDsKKwl1aW50OF90IHNlc3Npb25JZDsgICAgICAvKiBBZGRlZCBGb3IgQlQtQU1QIFN1cHBvcnQgKi8KK30gdExpbU1sbVB1cmdlU3RhUmVxLCAqdHBMaW1NbG1QdXJnZVN0YVJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVB1cmdlU3RhSW5kIHsKKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl1aW50MTZfdCByZWFzb25Db2RlOworCXVpbnQxNl90IHB1cmdlVHJpZ2dlcjsKKwl1aW50MTZfdCBhaWQ7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRMaW1NbG1QdXJnZVN0YUluZCwgKnRwTGltTWxtUHVyZ2VTdGFJbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1TZXRLZXlzQ25mIHsKKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl1aW50MTZfdCByZXN1bHRDb2RlOworCXVpbnQxNl90IGFpZDsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdExpbU1sbVNldEtleXNDbmYsICp0cExpbU1sbVNldEtleXNDbmY7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1SZXNldFJlcSB7CisJdFNpck1hY0FkZHIgbWFjQWRkcjsKKwl1aW50OF90IHBlcmZvcm1DbGVhbnVwOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworfSB0TGltTWxtUmVzZXRSZXEsICp0cExpbU1sbVJlc2V0UmVxOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtUmVzZXRDbmYgeworCXRTaXJNYWNBZGRyIG1hY0FkZHI7CisJdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGU7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRMaW1NbG1SZXNldENuZiwgKnRwTGltTWxtUmVzZXRDbmY7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1MaW5rVGVzdFN0b3BSZXEgeworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworfSB0TGltTWxtTGlua1Rlc3RTdG9wUmVxLCAqdHBMaW1NbG1MaW5rVGVzdFN0b3BSZXE7CisKKy8qIEZ1bmN0aW9uIHRlbXBsYXRlcyAqLworCitib29sIGxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXModHBBbmlTaXJHbG9iYWwsIHRwU2lyTXNnUSk7Cit2b2lkIGxpbV9wcm9jZXNzX21sbV9yZXFfbWVzc2FnZXModHBBbmlTaXJHbG9iYWwsIHRwU2lyTXNnUSk7Cit2b2lkIGxpbV9wcm9jZXNzX21sbV9yc3BfbWVzc2FnZXModHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90LCB1aW50MzJfdCAqKTsKK3ZvaWQgbGltX3Byb2Nlc3Nfc21lX2RlbF9ic3NfcnNwKHRwQW5pU2lyR2xvYmFsLCB1aW50MzJfdCwgdHBQRVNlc3Npb24pOworCit2b2lkIGxpbV9nZXRfcmFuZG9tX2Jzc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKmRhdGEpOworCisvKiBGdW5jdGlvbiB0byBoYW5kbGUgSFQgYW5kIEhUIElFIENGRyBwYXJhbWV0ZXIgaW50aWFsaXphdGlvbnMgKi8KK3ZvaWQgaGFuZGxlX2h0X2NhcGFiaWxpdHlhbmRfaHRfaW5mbyhzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywKKwkJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvKiBGdW5jdGlvbiB0byBoYW5kbGUgQ0ZHIHBhcmFtZXRlciB1cGRhdGVzICovCit2b2lkIGxpbV9oYW5kbGVfY2ZfZ3BhcmFtX3VwZGF0ZSh0cEFuaVNpckdsb2JhbCwgdWludDMyX3QpOworCit2b2lkIGxpbV9oYW5kbGVfcGFyYW1fdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVVcGRhdGVJRXNUeXBlIGNmZ0lkKTsKKworLyogRnVuY3Rpb24gdG8gYXBwbHkgQ0ZHIHBhcmFtZXRlcnMgYmVmb3JlIGpvaW4vcmVhc3NvYy9zdGFydCBCU1MgKi8KK3ZvaWQgbGltX2FwcGx5X2NvbmZpZ3VyYXRpb24odHBBbmlTaXJHbG9iYWwsIHRwUEVTZXNzaW9uKTsKKwordm9pZCBsaW1fc2V0X2NmZ19wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBlc2Vzc2lvbkVudHJ5KTsKKworLyogRnVuY3Rpb24gdG8gSW5pdGlhbGl6ZSBNTE0gc3RhdGUgbWFjaGluZSBvbiBTVEEgKi8KK3ZvaWQgbGltX2luaXRfbWxtKHRwQW5pU2lyR2xvYmFsKTsKKworLyogRnVuY3Rpb24gdG8gY2xlYW51cCBNTE0gc3RhdGUgbWFjaGluZSAqLwordm9pZCBsaW1fY2xlYW51cF9tbG0odHBBbmlTaXJHbG9iYWwpOworCisvKiBGdW5jdGlvbiB0byBjbGVhbnVwIExNTSBzdGF0ZSBtYWNoaW5lICovCit2b2lkIGxpbV9jbGVhbnVwX2xtbSh0cEFuaVNpckdsb2JhbCk7CisKKy8qIE1hbmFnZW1lbnQgZnJhbWUgaGFuZGxpbmcgZnVuY3Rpb25zICovCit2b2lkIGxpbV9wcm9jZXNzX2JlYWNvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbV9wcm9jZXNzX2JlYWNvbl9mcmFtZV9ub19zZXNzaW9uKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICopOwordm9pZCBsaW1fcHJvY2Vzc19wcm9iZV9yZXFfZnJhbWUodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fcHJvY2Vzc19wcm9iZV9yc3BfZnJhbWUodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fcHJvY2Vzc19wcm9iZV9yc3BfZnJhbWVfbm9fc2Vzc2lvbih0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqKTsKK3ZvaWQgbGltX3Byb2Nlc3NfcHJvYmVfcmVxX2ZyYW1lX211bHRpcGxlX2Jzcyh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLAorCQkJCQkgICAgICB0cFBFU2Vzc2lvbik7CisKKy8qIFByb2Nlc3MgQXV0aCBmcmFtZSB3aGVuIHdlIGhhdmUgYSBzZXNzaW9uIGluIHByb2dyZXNzLiAqLwordm9pZCBsaW1fcHJvY2Vzc19hdXRoX2ZyYW1lKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosIHRwUEVTZXNzaW9uKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgordFNpclJldFN0YXR1cyBsaW1fcHJvY2Vzc19hdXRoX2ZyYW1lX25vX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqLAorCQkJCQkJdm9pZCAqYm9keSk7CisjZW5kaWYKKwordm9pZCBsaW1fcHJvY2Vzc19hc3NvY19yZXFfZnJhbWUodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwgdWludDhfdCwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fc2VuZF9tbG1fYXNzb2NfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YURzLAorCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2b2lkIGxpbV9wcm9jZXNzX2Fzc29jX3JzcF9mcmFtZSh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLCB1aW50OF90LCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbV9wcm9jZXNzX2Rpc2Fzc29jX2ZyYW1lKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosIHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltX3Byb2Nlc3NfZGVhdXRoX2ZyYW1lKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosIHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltX3Byb2Nlc3NfYWN0aW9uX2ZyYW1lKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90ICosIHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltX3Byb2Nlc3NfYWN0aW9uX2ZyYW1lX25vX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqcFJ4TWV0YUluZm8pOworCit2b2lkIGxpbV9wb3B1bGF0ZV9wMnBfbWFjX2hlYWRlcih0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqKTsKK3ZvaWQgbGltX3BvcHVsYXRlX21hY19oZWFkZXIodHBBbmlTaXJHbG9iYWwsIHVpbnQ4X3QgKiwgdWludDhfdCwgdWludDhfdCwKKwkJCQkgICAgICB0U2lyTWFjQWRkciwgdFNpck1hY0FkZHIpOwordFNpclJldFN0YXR1cyBsaW1fc2VuZF9wcm9iZV9yZXFfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1NTaWQgKiwKKwkJCQkJICAgIHRTaXJNYWNBZGRyLCB1aW50OF90LCB0U2lyTWFjQWRkciwKKwkJCQkJICAgIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDhfdCAqKTsKK3ZvaWQgbGltX3NlbmRfcHJvYmVfcnNwX21nbXRfZnJhbWUodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNBZGRyLCB0cEFuaVNTSUQsIHNob3J0LAorCQkJCSAgIHVpbnQ4X3QsIHRwUEVTZXNzaW9uLCB1aW50OF90KTsKK3ZvaWQgbGltX3NlbmRfYXV0aF9tZ210X2ZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjQXV0aEZyYW1lQm9keSAqLCB0U2lyTWFjQWRkciwKKwkJCSAgICAgIHVpbnQ4X3QsIHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltX3NlbmRfYXNzb2NfcmVxX21nbXRfZnJhbWUodHBBbmlTaXJHbG9iYWwsIHRMaW1NbG1Bc3NvY1JlcSAqLCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbV9zZW5kX3JlYXNzb2NfcmVxX21nbXRfZnJhbWUodHBBbmlTaXJHbG9iYWwsIHRMaW1NbG1SZWFzc29jUmVxICosCisJCQkJICAgICB0cFBFU2Vzc2lvbik7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK3ZvaWQgbGltX3NlbmRfcmVhc3NvY19yZXFfd2l0aF9mdF9pZXNfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJIHRMaW1NbG1SZWFzc29jUmVxICpwTWxtUmVhc3NvY1JlcSwKKwkJCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZgordm9pZCBsaW1fc2VuZF9kZWx0c19yZXFfYWN0aW9uX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHBlZXIsCisJCQkJICAgICB1aW50OF90IHdtbVRzcGVjUHJlc2VudCwKKwkJCQkgICAgIHRTaXJNYWNUU0luZm8gKnBUc2luZm8sCisJCQkJICAgICB0U2lyTWFjVHNwZWNJRSAqcFRzcGVjSWUsCisJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltX3NlbmRfYWRkdHNfcmVxX2FjdGlvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwKKwkJCQkgICAgIHRTaXJBZGR0c1JlcUluZm8gKmFkZHRzLCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbV9zZW5kX2FkZHRzX3JzcF9hY3Rpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisJCQkJICAgICB1aW50MTZfdCBzdGF0dXNDb2RlLCB0U2lyQWRkdHNSZXFJbmZvICphZGR0cywKKwkJCQkgICAgIHRTaXJNYWNTY2hlZHVsZUlFICpwU2NoZWR1bGUsIHRwUEVTZXNzaW9uKTsKKwordm9pZCBsaW1fc2VuZF9hc3NvY19yc3BfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCwgdWludDE2X3QsIHVpbnQxNl90LCB0U2lyTWFjQWRkciwKKwkJCQkgICB1aW50OF90LCB0cERwaEhhc2hOb2RlIHBTdGEsIHRwUEVTZXNzaW9uKTsKKwordm9pZCBsaW1fc2VuZF9kaXNhc3NvY19tZ210X2ZyYW1lKHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdFNpck1hY0FkZHIsCisJCQkJICB0cFBFU2Vzc2lvbiwgYm9vbCB3YWl0Rm9yQWNrKTsKK3ZvaWQgbGltX3NlbmRfZGVhdXRoX21nbXRfZnJhbWUodHBBbmlTaXJHbG9iYWwsIHVpbnQxNl90LCB0U2lyTWFjQWRkciwgdHBQRVNlc3Npb24sCisJCQkJYm9vbCB3YWl0Rm9yQWNrKTsKKwordFNpclJlc3VsdENvZGVzIGxpbV9tbG1fYWRkX2Jzcyh0cEFuaVNpckdsb2JhbCwgdExpbU1sbVN0YXJ0UmVxICosCisJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfY2hhbm5lbF9zd2l0Y2hfbWdtdF9mcmFtZSh0cEFuaVNpckdsb2JhbCwgdFNpck1hY0FkZHIsCisJCQkJCQkgdWludDhfdCwgdWludDhfdCwgdWludDhfdCwKKwkJCQkJCSB0cFBFU2Vzc2lvbik7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQwordFNpclJldFN0YXR1cyBsaW1fc2VuZF92aHRfb3Btb2RlX25vdGlmaWNhdGlvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgICB0U2lyTWFjQWRkciBwZWVyLCB1aW50OF90IG5Nb2RlLAorCQkJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfdmh0X2NoYW5uZWxfc3dpdGNoX21nbXRfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgICAgdFNpck1hY0FkZHIgcGVlciwKKwkJCQkJCSAgICAgdWludDhfdCBuQ2hhbldpZHRoLAorCQkJCQkJICAgICB1aW50OF90IG5OZXdDaGFubmVsLAorCQkJCQkJICAgICB1aW50OF90IG5jYk1vZGUsCisJCQkJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfbmVpZ2hib3JfcmVwb3J0X3JlcXVlc3RfZnJhbWUodHBBbmlTaXJHbG9iYWwsCisJCQkJCQkgICAgIHRwU2lyTWFjTmVpZ2hib3JSZXBvcnRSZXEsCisJCQkJCQkgICAgIHRTaXJNYWNBZGRyLCB0cFBFU2Vzc2lvbik7Cit0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX2xpbmtfcmVwb3J0X2FjdGlvbl9mcmFtZSh0cEFuaVNpckdsb2JhbCwgdHBTaXJNYWNMaW5rUmVwb3J0LAorCQkJCQkJdFNpck1hY0FkZHIsIHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfcmFkaW9fbWVhc3VyZV9yZXBvcnRfYWN0aW9uX2ZyYW1lKHRwQW5pU2lyR2xvYmFsLCB1aW50OF90LAorCQkJCQkJCSB1aW50OF90LAorCQkJCQkJCSB0cFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCwKKwkJCQkJCQkgdFNpck1hY0FkZHIsIHRwUEVTZXNzaW9uKTsKKyNlbmRpZgorCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwordm9pZCBsaW1faW5pdF90ZGxzX2RhdGEodHBBbmlTaXJHbG9iYWwsIHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgbGltX3Byb2Nlc3Nfc21lX3RkbHNfbWdtdF9zZW5kX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJIHVpbnQzMl90ICpwTXNnQnVmKTsKK3RTaXJSZXRTdGF0dXMgbGltX3Byb2Nlc3Nfc21lX3RkbHNfYWRkX3N0YV9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgIHVpbnQzMl90ICpwTXNnQnVmKTsKK3RTaXJSZXRTdGF0dXMgbGltX3Byb2Nlc3Nfc21lX3RkbHNfbGlua19lc3RhYmxpc2hfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgIHVpbnQzMl90ICpwTXNnQnVmKTsKK3RTaXJSZXRTdGF0dXMgbGltX3Byb2Nlc3Nfc21lX3RkbHNfZGVsX3N0YV9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgIHVpbnQzMl90ICpwTXNnQnVmKTsKK3ZvaWQgbGltX3NlbmRfc21lX3RkbHNfZGVsZXRlX2FsbF9wZWVyX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltX3NlbmRfc21lX21nbXRfdHhfY29tcGxldGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJCSAgICAgdWludDMyX3QgdHhDb21wbGV0ZVN0YXR1cyk7Cit0U2lyUmV0U3RhdHVzIGxpbV9kZWxldGVfdGRsc19wZWVycyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK0NERl9TVEFUVVMgbGltX3Byb2Nlc3NfdGRsc19hZGRfc3RhX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICptc2csIHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfdGRsc190ZWFyZG93bl9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICB0U2lyTWFjQWRkciBwZWVyTWFjLCB1aW50MTZfdCByZWFzb24sCisJCQkJCSAgIHVpbnQ4X3QgcmVzcG9uZGVyLAorCQkJCQkgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJCQkgICB1aW50OF90ICphZGRJZSwgdWludDE2X3QgYWRkSWVMZW4pOworI2VuZGlmCisKKy8qIEFsZ29yaXRobXMgJiBMaW5rIE1vbml0b3JpbmcgcmVsYXRlZCBmdW5jdGlvbnMgKi8KKy8qIC8gRnVuY3Rpb24gdGhhdCBoYW5kbGVzIGhlYXJ0YmVhdCBmYWlsdXJlICovCit2b2lkIGxpbV9oYW5kbGVfaGVhcnRfYmVhdF9mYWlsdXJlKHRwQW5pU2lyR2xvYmFsLCB0cFBFU2Vzc2lvbik7CisKKy8qIC8gRnVuY3Rpb24gdGhhdCB0cmlnZ2VycyBsaW5rIHRlYXIgZG93biB3aXRoIEFQIHVwb24gSEIgZmFpbHVyZSAqLwordm9pZCBsaW1fdGVhcl9kb3duX2xpbmtfd2l0aF9hcCh0cEFuaVNpckdsb2JhbCwgdWludDhfdCwgdFNpck1hY1JlYXNvbkNvZGVzKTsKKworLyogLyBGdW5jdGlvbiB0aGF0IHByb2Nlc3NlcyBNYXggcmV0cmllcyBpbnRlcnJ1cHQgZnJvbSBURlAgKi8KK3ZvaWQgbGltSGFuZGxlTWF4UmV0cmllc0ludGVycnVwdCh1aW50MzJfdCk7CisKKy8qIC8gRnVuY3Rpb24gdGhhdCBwcm9jZXNzZXMgbWVzc2FnZXMgZGVmZXJyZWQgZHVyaW5nIExlYXJuIG1vZGUgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfZGVmZXJyZWRfbWVzc2FnZV9xdWV1ZSh0cEFuaVNpckdsb2JhbCk7CisKKy8qIC8gRnVuY3Rpb24gdGhhdCBkZWZlcnMgdGhlIG1lc3NhZ2VzIHJlY2VpdmVkICovCit1aW50MzJfdCBsaW1fZGVmZXJfbXNnKHRwQW5pU2lyR2xvYmFsLCB0U2lyTXNnUSAqKTsKKworLyogLyBGdW5jdGlvbiB0aGF0IFN3aXRjaGVzIHRoZSBDaGFubmVsIGFuZCBzZXRzIHRoZSBDQiBNb2RlICovCit2b2lkIGxpbV9zZXRfY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNoYW5uZWwsCisJCXVpbnQ4X3QgY2hfY2VudGVyX2ZyZXFfc2VnMCwgdWludDhfdCBjaF9jZW50ZXJfZnJlcV9zZWcxLAorCQlwaHlfY2hfd2lkdGggY2hfd2lkdGgsIHRQb3dlcmRCbSBtYXhUeFBvd2VyLAorCQl1aW50OF90IHBlU2Vzc2lvbklkKTsKKworCisvKiAvIEZ1bmN0aW9uIHRoYXQgY29tcGxldGVzIGNoYW5uZWwgc2NhbiAqLwordm9pZCBsaW1fY29tcGxldGVfbWxtX3NjYW4odHBBbmlTaXJHbG9iYWwsIHRTaXJSZXN1bHRDb2Rlcyk7CisKKyNpZmRlZiBBTklfU1VQUE9SVF8xMUgKKy8qIC8gRnVuY3Rpb24gdGhhdCBzZW5kcyBNZWFzdXJlbWVudCBSZXBvcnQgYWN0aW9uIGZyYW1lICovCit0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX21lYXNfcmVwb3J0X2ZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSwKKwkJCQkJIHRTaXJNYWNBZGRyLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLyogLyBGdW5jdGlvbiB0aGF0IHNlbmRzIFRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lICovCit0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX3RwY19yZXBvcnRfZnJhbWUodHBBbmlTaXJHbG9iYWwsIHRwU2lyTWFjVHBjUmVxQWN0aW9uRnJhbWUsCisJCQkJCXRTaXJNYWNBZGRyLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZgorCisvKiAvIEZ1bmN0aW9uIHRoYXQgc2VuZHMgVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lICovCit2b2lkIGxpbV9zZW5kX3RwY19yZXF1ZXN0X2ZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjQWRkciwKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLyogRnVuY3Rpb24ocykgdG8gaGFuZGxlIHJlc3BvbnNlcyByZWNlaXZlZCBmcm9tIEhBTCAqLwordm9pZCBsaW1fcHJvY2Vzc19tbG1fYWRkX2Jzc19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EpOwordm9pZCBsaW1fcHJvY2Vzc19tbG1fYWRkX3N0YV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1F0LAorCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2RlbF9zdGFfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRKTsKK3ZvaWQgbGltX3Byb2Nlc3NfbWxtX2RlbF9ic3NfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRLAorCQkJCSB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbV9wcm9jZXNzX3N0YV9tbG1fYWRkX3N0YV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EsCisJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltX3Byb2Nlc3Nfc3RhX21sbV9kZWxfc3RhX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSwKKwkJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fcHJvY2Vzc19zdGFfbWxtX2RlbF9ic3NfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRLAorCQkJCSAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbV9wcm9jZXNzX21sbV9zZXRfc3RhX2tleV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EpOwordm9pZCBsaW1fcHJvY2Vzc19tbG1fc2V0X2Jzc19rZXlfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRKTsKKworLyogRnVuY3Rpb24gdG8gcHJvY2VzcyBXTUFfU1dJVENIX0NIQU5ORUxfUlNQIG1lc3NhZ2UgKi8KK3ZvaWQgbGltX3Byb2Nlc3Nfc3dpdGNoX2NoYW5uZWxfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKik7CisKK3ZvaWQgbGltX2NvdmVydF9jaGFubmVsX3NjYW5fdHlwZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNoYW5uZWxOdW0sCisJCQkJICBib29sIHBhc3NpdmVUb0FjdGl2ZSk7Cit2b2lkIGxpbV9zZXRfZGZzX2NoYW5uZWxfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNoYW5uZWxOdW0sCisJCQkgICAgICB0U2lyREZTQ2hhbm5lbExpc3QgKmRmc0NoYW5uZWxMaXN0KTsKK3ZvaWQgbGltQ29udGludWVDaGFubmVsTGVhcm4odHBBbmlTaXJHbG9iYWwpOworLyogV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZCAqLwordWludDhfdCBsaW1faXNfbGlua19zdXNwZW5kZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisvKiBlbmQgV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZCAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworLyogMTF3IHNlbmQgU0EgcXVlcnkgcmVxdWVzdCBhY3Rpb24gZnJhbWUgKi8KK3RTaXJSZXRTdGF0dXMgbGltX3NlbmRfc2FfcXVlcnlfcmVxdWVzdF9mcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICp0cmFuc0lkLAorCQkJCQkgICAgICB0U2lyTWFjQWRkciBwZWVyLAorCQkJCQkgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKy8qIDExdyBTQSBxdWVyeSByZXF1ZXN0IGFjdGlvbiBmcmFtZSBoYW5kbGVyICovCit0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX3NhX3F1ZXJ5X3Jlc3BvbnNlX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB1aW50OF90ICp0cmFuc0lkLCB0U2lyTWFjQWRkciBwZWVyLAorCQkJCQkgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKworLyogSW5saW5lIGZ1bmN0aW9ucyAqLworCisvKioKKyAqIGxpbV9wb3N0X3NtZV9tZXNzYWdlKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWxtTWVzc2FnZXMoKS4gSW4gdGhpcworICogZnVuY3Rpb24gTUxNIHN1Yi1tb2R1bGUgaW52b2tlcyBNTE0gaW5kL2NuZiBwcmltaXRpdmVzLgorICoKKyAqKipMT0dJQzoKKyAqIEluaXRpYWxseSBNTE0gbWFrZXMgYW4gU01FIGZ1bmN0aW9uIGNhbGwgdG8gaW52b2tlIE1MTSBpbmQvY25mCisgKiBwcmltaXRpdmUuIEluIGZ1dHVyZSB0aGlzIGNhbiBiZSBlbmhhbmNlZCB0byAncG9zdCcgbWVzc2FnZXMgdG8gU01FLgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIG1zZ1R5cGUgICBJbmRpY2F0ZXMgdGhlIE1MTSBwcmltaXRpdmUgbWVzc2FnZSB0eXBlCisgKiBAcGFyYW0gKnBNc2dCdWYgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbGltX3Bvc3Rfc21lX21lc3NhZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgbXNnVHlwZSwgdWludDMyX3QgKnBNc2dCdWYpCit7CisJdFNpck1zZ1EgbXNnOworCisJaWYgKHBNc2dCdWYgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCW1zZy50eXBlID0gKHVpbnQxNl90KSBtc2dUeXBlOworCW1zZy5ib2R5cHRyID0gcE1zZ0J1ZjsKKwltc2cuYm9keXZhbCA9IDA7CisJaWYgKG1zZ1R5cGUgPiBlV05JX1NNRV9NU0dfVFlQRVNfQkVHSU4pCisJCWxpbV9wcm9jZXNzX3NtZV9yZXFfbWVzc2FnZXMocE1hYywgJm1zZyk7CisJZWxzZQorCQlsaW1fcHJvY2Vzc19tbG1fcnNwX21lc3NhZ2VzKHBNYWMsIG1zZ1R5cGUsIHBNc2dCdWYpOworfSAvKioqIGVuZCBsaW1fcG9zdF9zbWVfbWVzc2FnZSgpICoqKi8KKworLyoqCisgKiBsaW1fcG9zdF9tbG1fbWVzc2FnZSgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkuIEluIHRoaXMKKyAqIGZ1bmN0aW9uIFNNRSBpbnZva2VzIE1MTUUgcHJpbWl0aXZlcy4KKyAqCisgKioqUEFSQU1TOgorICoKKyAqKipMT0dJQzoKKyAqIEluaXRpYWxseSBTTUUgbWFrZXMgYW4gTUxNIGZ1bmN0aW9uIGNhbGwgdG8gaW52b2tlIE1MTSBwcmltaXRpdmUuCisgKiBJbiBmdXR1cmUgdGhpcyBjYW4gYmUgZW5oYW5jZWQgdG8gJ3Bvc3QnIG1lc3NhZ2VzIHRvIE1MTS4KKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBtc2dUeXBlICAgSW5kaWNhdGVzIHRoZSBNTE0gcHJpbWl0aXZlIG1lc3NhZ2UgdHlwZQorICogQHBhcmFtICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2xpbV9wb3N0X21sbV9tZXNzYWdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IG1zZ1R5cGUsIHVpbnQzMl90ICpwTXNnQnVmKQoreworCisJdFNpck1zZ1EgbXNnOworCWlmIChwTXNnQnVmID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisJbXNnLnR5cGUgPSAodWludDE2X3QpIG1zZ1R5cGU7CisJbXNnLmJvZHlwdHIgPSBwTXNnQnVmOworCW1zZy5ib2R5dmFsID0gMDsKKwlsaW1fcHJvY2Vzc19tbG1fcmVxX21lc3NhZ2VzKHBNYWMsICZtc2cpOworfSAvKioqIGVuZCBsaW1fcG9zdF9tbG1fbWVzc2FnZSgpICoqKi8KKworLyoqCisgKiBsaW1fZ2V0X2N1cnJlbnRfc2Nhbl9jaGFubmVsKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB2YXJpb3VzIHBsYWNlcyB0byBnZXQgY3VycmVudCBjaGFubmVsCisgKiBudW1iZXIgYmVpbmcgc2Nhbm5lZC4KKyAqCisgKioqUEFSQU1TOgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIENoYW5uZWwgbnVtYmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBsaW1fZ2V0X2N1cnJlbnRfc2Nhbl9jaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDhfdCAqcENoYW5OdW0gPQorCQlwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5jaGFubmVsTGlzdC5jaGFubmVsTnVtYmVyOworCisJcmV0dXJuICoocENoYW5OdW0gKyBwTWFjLT5saW0uZ0xpbUN1cnJlbnRTY2FuQ2hhbm5lbElkKTsKK30gLyoqKiBlbmQgbGltX2dldF9jdXJyZW50X3NjYW5fY2hhbm5lbCgpICoqKi8KKworLyoqCisgKiBsaW1fZ2V0X2llbGVuX2Zyb21fYnNzX2Rlc2NyaXB0aW9uKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB2YXJpb3VzIHBsYWNlcyB0byBnZXQgSUUgbGVuZ3RoCisgKiBmcm9tIHRTaXJCc3NEZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKyAqIG51bWJlciBiZWluZyBzY2FubmVkLgorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgICAgcEJzc0Rlc2NyCisgKiBAcmV0dXJuICAgIFRvdGFsIElFIGxlbmd0aAorICovCisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QKK2xpbV9nZXRfaWVsZW5fZnJvbV9ic3NfZGVzY3JpcHRpb24odHBTaXJCc3NEZXNjcmlwdGlvbiBwQnNzRGVzY3IpCit7CisJdWludDE2X3QgaWVsZW47CisKKwlpZiAoIXBCc3NEZXNjcikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIExlbmd0aCBvZiBCU1MgZGVzcmlwdGlvbiBpcyB3aXRob3V0IGxlbmd0aCBvZgorCSAqIGxlbmd0aCBpdHNlbGYgYW5kIGxlbmd0aCBvZiBwb2ludGVyCisJICogdGhhdCBob2xkcyBpZUZpZWxkcworCSAqCisJICogPC0tLS0tLS0tLS0tLXNpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisJICogKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCisJICogfCBsZW5ndGggfCBvdGhlciBmaWVsZHMgICAgICAgICAgICAgICAgICAgIHwgcG9pbnRlciB0byBJRXN8CisJICogKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVGaWVsZHMKKwkgKi8KKworCWllbGVuID0gKHVpbnQxNl90KShwQnNzRGVzY3ItPmxlbmd0aCArIHNpemVvZihwQnNzRGVzY3ItPmxlbmd0aCkgLQorCQkJICAgR0VUX0ZJRUxEX09GRlNFVCh0U2lyQnNzRGVzY3JpcHRpb24sIGllRmllbGRzKSk7CisKKwlyZXR1cm4gaWVsZW47Cit9IC8qKiogZW5kIGxpbV9nZXRfaWVsZW5fZnJvbV9ic3NfZGVzY3JpcHRpb24oKSAqKiovCisKKy8qKgorICogbGltX3NlbmRfYmVhY29uX2luZCgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHRvIHNlbmQgdGhlIGJlYWNvbiBpbmRpY2F0aW9uCisgKiBudW1iZXIgYmVpbmcgc2Nhbm5lZC4KKyAqCisgKioqUEFSQU1TOgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKi8KKwordm9pZCBsaW1fc2VuZF9iZWFjb25faW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2b2lkCitsaW1fc2VuZF92ZGV2X3Jlc3RhcnQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJICAgICAgdWludDhfdCBzZXNzaW9uSWQpOworCit2b2lkIGxpbV9nZXRfd3BzcGJjX3Nlc3Npb25zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKmFkZHIsIHVpbnQ4X3QgKnV1aWRfZSwKKwkJCSAgICAgZVdQU1BCQ092ZXJsYXAgKm92ZXJsYXAsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1XUFNQQkNUaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fd3BzcGJjX2Nsb3NlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fcmVtb3ZlX3BiY19zZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwUmVtb3ZlTWFjLAorCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworI2RlZmluZSBMSU1fV1BTX09WRVJMQVBfVElNRVJfTVMgICAgICAgICAgICAgICAgIDEwMDAwCit2b2lkCitsaW1fY2hhbmdlX2NoYW5uZWxfd2l0aF9jYWxsYmFjayh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IG5ld0NoYW5uZWwsCisJCQkJIENIQU5HRV9DSEFOTkVMX0NBTExCQUNLIGNhbGxiYWNrLAorCQkJCSB1aW50MzJfdCAqY2JkYXRhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordm9pZCBsaW1fc2VuZF9zbWVfbWdtdF9mcmFtZV9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBmcmFtZVR5cGUsCisJCQkJIHVpbnQ4X3QgKmZyYW1lLCB1aW50MzJfdCBmcmFtZUxlbiwKKwkJCQkgdWludDE2X3Qgc2Vzc2lvbklkLCB1aW50MzJfdCByeENoYW4sCisJCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksIGludDhfdCByeFJzc2kpOwordm9pZCBsaW1fcHJvY2Vzc19yZW1haW5fb25fY2huX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGxpbV9wcm9jZXNzX2luc2VydF9zaW5nbGVfc2hvdF9ub2FfdGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltX2NvbnZlcnRfYWN0aXZlX2NoYW5uZWxfdG9fcGFzc2l2ZV9jaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBsaW1fc2VuZF9wMnBfYWN0aW9uX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKTsKK3ZvaWQgbGltX2Fib3J0X3JlbWFpbl9vbl9jaGFuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCXVpbnQzMl90IHNjYW5faWQpOwordFNpclJldFN0YXR1cyBfX2xpbV9wcm9jZXNzX3NtZV9ub19hX3VwZGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZ0J1Zik7Cit2b2lkIGxpbV9wcm9jZXNzX3JlZ2RfZGVmZF9zbWVfcmVxX2FmdGVyX25vYV9zdGFydCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKwordm9pZCBsaW1fcHJvY2Vzc19kaXNhc3NvY19hY2tfdGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltX3Byb2Nlc3NfZGVhdXRoX2Fja190aW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworQ0RGX1NUQVRVUyBsaW1fc2VuZF9kaXNhc3NvY19jbmYodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitDREZfU1RBVFVTIGxpbV9zZW5kX2RlYXV0aF9jbmYodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitDREZfU1RBVFVTIGxpbV9kaXNhc3NvY190eF9jb21wbGV0ZV9jbmYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJdWludDMyX3QgdHhDb21wbGV0ZVN1Y2Nlc3MpOworQ0RGX1NUQVRVUyBsaW1fZGVhdXRoX3R4X2NvbXBsZXRlX2NuZih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgIHVpbnQzMl90IHR4Q29tcGxldGVTdWNjZXNzKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCit0eXBlZGVmIHN0cnVjdCBzU2V0TGlua0NiYWNrUGFyYW1zIHsKKwl2b2lkICpjYmFja0RhdGFQdHI7Cit9IHRTZXRMaW5rQ2JhY2tQYXJhbXM7CisjZW5kaWYKKwordm9pZCBsaW1fcHJvY2Vzc19yeF9zY2FuX2V2ZW50KHRwQW5pU2lyR2xvYmFsIG1hYywgdm9pZCAqYnVmKTsKKworaW50IGxpbV9wcm9jZXNzX3JlbWFpbl9vbl9jaG5sX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCAqcE1zZyk7Cit2b2lkIGxpbV9yZW1haW5fb25fY2huX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCBDREZfU1RBVFVTIHN0YXR1cywgdWludDMyX3QgKmRhdGEpOworCisvKiAvIEJpdCB2YWx1ZSBkYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiBlbnVtIHNIYWxCaXRWYWwgICAgICAgICAvKiBGb3IgQml0IG9wZXJhdGlvbnMgKi8KK3sKKwllSEFMX0NMRUFSLAorCWVIQUxfU0VUCit9IHRIYWxCaXRWYWw7CisKK2VudW0geworCWVISV9QUkksCisJZVBST1QsCisJZURCRworfTsKKworI2VuZGlmIC8qIF9fTElNX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3V0aWxzLmMgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNGMyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvbGltL2xpbV91dGlscy5jCkBAIC0wLDAgKzEsNzE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBsaW1fdXRpbHMuY2MgY29udGFpbnMgdGhlIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBMSU0gdXNlcy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzEzLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAic2NoX2FwaS5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV9zZWN1cml0eV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9wcm9wX2V4dHNfdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VuZF9tZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbV9zZXJfZGVzX3V0aWxzLmgiCisjaW5jbHVkZSAibGltX2FkbWl0X2NvbnRyb2wuaCIKKyNpbmNsdWRlICJsaW1fc3RhX2hhc2hfYXBpLmgiCisjaW5jbHVkZSAiZG90MTFmLmgiCisjaW5jbHVkZSAiZG90MTFmZGVmcy5oIgorI2luY2x1ZGUgIndtbV9hcHNkLmgiCisjaW5jbHVkZSAibGltX3RyYWNlLmgiCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2V2ZW50LmgiCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworI2luY2x1ZGUgImxpbV9pYnNzX3BlZXJfbWdtdC5oIgorI2luY2x1ZGUgImxpbV9zZXNzaW9uX3V0aWxzLmgiCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlICJsaW1fZnRfZGVmcy5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltX3Nlc3Npb24uaCIKKyNpbmNsdWRlICJjZHNfcmVnX3NlcnZpY2UuaCIKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjZW5kaWYKKyNkZWZpbmUgQVNDSUlfU1BBQ0VfQ0hBUkFDVEVSIDB4MjAKKworI2RlZmluZSBTVUNDRVNTIDEKKworI2RlZmluZSBNQVhfQkFfV0lORE9XX1NJWkVfRk9SX0NJU0NPIDI1CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX2RlbGV0ZV9kaWFsb2d1ZV90b2tlbl9saXN0CisgICBcYnJpZWYgZGVsZXRlcyB0aGUgY29tcGxldGUgbGltIGRpYWxvZ3VlIHRva2VuIGxpbmtlZCBsaXN0LgorICAgXHBhcmFtICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCisgICBccmV0dXJuICAgICBOb25lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltX2RlbGV0ZV9kaWFsb2d1ZV90b2tlbl9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdHBEaWFsb2d1ZVRva2VuIHBDdXJyTm9kZSA9IHBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlbkhlYWQ7CisKKwl3aGlsZSAoTlVMTCAhPSBwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5IZWFkKSB7CisJCXBDdXJyTm9kZSA9IHBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlbkhlYWQ7CisJCXBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlbkhlYWQgPQorCQkJcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuSGVhZC0+bmV4dDsKKwkJY2RmX21lbV9mcmVlKHBDdXJyTm9kZSk7CisJCXBDdXJyTm9kZSA9IE5VTEw7CisJfQorCXBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlblRhaWwgPSBOVUxMOworfQorCitjaGFyICpsaW1fZG90MTFfcmVhc29uX3N0cih1aW50MTZfdCByZWFzb25Db2RlKQoreworCXN3aXRjaCAocmVhc29uQ29kZSkgeworCWNhc2UgMDoKKwkJcmV0dXJuICIgIjsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ19QUkVWX0FVVEhfTk9UX1ZBTElEX1JFQVNPTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ19ERUFVVEhfTEVBVklOR19CU1NfUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX0RJU0FTU09DX0RVRV9UT19JTkFDVElWSVRZX1JFQVNPTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ19ESVNBU1NPQ19EVUVfVE9fRElTQUJJTElUWV9SRUFTT04pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcKKwkJCShlU0lSX01BQ19DTEFTUzJfRlJBTUVfRlJPTV9OT05fQVVUSF9TVEFfUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HCisJCQkoZVNJUl9NQUNfQ0xBU1MzX0ZSQU1FX0ZST01fTk9OX0FTU09DX1NUQV9SRUFTT04pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNJUl9NQUNfRElTQVNTT0NfTEVBVklOR19CU1NfUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX1NUQV9OT1RfUFJFX0FVVEhFTlRJQ0FURURfUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX1BXUl9DQVBBQklMSVRZX0JBRF9SRUFTT04pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNJUl9NQUNfU1BSVERfQ0hBTk5FTFNfQkFEX1JFQVNPTik7CisKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX0lOVkFMSURfSUVfUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX01JQ19GQUlMVVJFX1JFQVNPTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ180V0FZX0hBTkRTSEFLRV9USU1FT1VUX1JFQVNPTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ19HUl9LRVlfVVBEQVRFX1RJTUVPVVRfUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX1JTTl9JRV9NSVNNQVRDSF9SRUFTT04pOworCisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ19JTlZBTElEX01DX0NJUEhFUl9SRUFTT04pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNJUl9NQUNfSU5WQUxJRF9VQ19DSVBIRVJfUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX0lOVkFMSURfQUtNUF9SRUFTT04pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNJUl9NQUNfVU5TVVBQT1JURURfUlNOX0lFX1ZFUl9SRUFTT04pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNJUl9NQUNfSU5WQUxJRF9SU05fQ0FQQUJJTElUSUVTX1JFQVNPTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ18xWF9BVVRIX0ZBSUxVUkVfUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX0NJUEhFUl9TVUlURV9SRUpFQ1RFRF9SRUFTT04pOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ19URExTX1RFQVJET1dOX1BFRVJfVU5SRUFDSEFCTEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNJUl9NQUNfVERMU19URUFSRE9XTl9VTlNQRUNfUkVBU09OKTsKKyNlbmRpZgorCQkvKiBSZXNlcnZlZCAgIDI3IC0gMzAgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJCUNBU0VfUkVUVVJOX1NUUklORworCQkJKGVTSVJfTUFDX1JPQlVTVF9NR01UX0ZSQU1FU19QT0xJQ1lfVklPTEFUSU9OKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNJUl9NQUNfUU9TX1VOU1BFQ0lGSUVEX1JFQVNPTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ19RQVBfTk9fQkFORFdJRFRIX1JFQVNPTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ19YU19VTkFDS0VEX0ZSQU1FU19SRUFTT04pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNJUl9NQUNfQkFEX1RYT1BfVVNFX1JFQVNPTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU0lSX01BQ19QRUVSX1NUQV9SRVFfTEVBVklOR19CU1NfUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX1BFRVJfUkVKRUNUX01FQ0hBTklTSU1fUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX01FQ0hBTklTTV9OT1RfU0VUVVBfUkVBU09OKTsKKworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNJUl9NQUNfUEVFUl9USU1FRE9VVF9SRUFTT04pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNJUl9NQUNfQ0lQSEVSX05PVF9TVVBQT1JURURfUkVBU09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTSVJfTUFDX0RJU0FTU09DX0RVRV9UT19GVEhBTkRPRkZfUkVBU09OKTsKKwkvKiBSZXNlcnZlZCA0NyAtIDY1NTM1ICovCisJZGVmYXVsdDoKKwkJcmV0dXJuICJVbmtub3duIjsKKwl9Cit9CisKK2NoYXIgKmxpbV9tbG1fc3RhdGVfc3RyKHRMaW1NbG1TdGF0ZXMgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgZUxJTV9NTE1fT0ZGTElORV9TVEFURToKKwkJcmV0dXJuICJlTElNX01MTV9PRkZMSU5FX1NUQVRFIjsKKwljYXNlIGVMSU1fTUxNX0lETEVfU1RBVEU6CisJCXJldHVybiAiZUxJTV9NTE1fSURMRV9TVEFURSI7CisJY2FzZSBlTElNX01MTV9XVF9QUk9CRV9SRVNQX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUiOworCWNhc2UgZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fTUxNX1BBU1NJVkVfU0NBTl9TVEFURSI7CisJY2FzZSBlTElNX01MTV9XVF9KT0lOX0JFQUNPTl9TVEFURToKKwkJcmV0dXJuICJlTElNX01MTV9XVF9KT0lOX0JFQUNPTl9TVEFURSI7CisJY2FzZSBlTElNX01MTV9KT0lORURfU1RBVEU6CisJCXJldHVybiAiZUxJTV9NTE1fSk9JTkVEX1NUQVRFIjsKKwljYXNlIGVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFIjsKKwljYXNlIGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUyX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fTUxNX1dUX0FVVEhfRlJBTUUyX1NUQVRFIjsKKwljYXNlIGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUzX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fTUxNX1dUX0FVVEhfRlJBTUUzX1NUQVRFIjsKKwljYXNlIGVMSU1fTUxNX1dUX0FVVEhfRlJBTUU0X1NUQVRFOgorCQlyZXR1cm4gImVMSU1fTUxNX1dUX0FVVEhfRlJBTUU0X1NUQVRFIjsKKwljYXNlIGVMSU1fTUxNX0FVVEhfUlNQX1RJTUVPVVRfU1RBVEU6CisJCXJldHVybiAiZUxJTV9NTE1fQVVUSF9SU1BfVElNRU9VVF9TVEFURSI7CisJY2FzZSBlTElNX01MTV9BVVRIRU5USUNBVEVEX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fTUxNX0FVVEhFTlRJQ0FURURfU1RBVEUiOworCWNhc2UgZUxJTV9NTE1fV1RfQVNTT0NfUlNQX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURSI7CisJY2FzZSBlTElNX01MTV9XVF9SRUFTU09DX1JTUF9TVEFURToKKwkJcmV0dXJuICJlTElNX01MTV9XVF9SRUFTU09DX1JTUF9TVEFURSI7CisJY2FzZSBlTElNX01MTV9XVF9GVF9SRUFTU09DX1JTUF9TVEFURToKKwkJcmV0dXJuICJlTElNX01MTV9XVF9GVF9SRUFTU09DX1JTUF9TVEFURSI7CisJY2FzZSBlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURToKKwkJcmV0dXJuICJlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURSI7CisJY2FzZSBlTElNX01MTV9XVF9ERUxfQlNTX1JTUF9TVEFURToKKwkJcmV0dXJuICJlTElNX01MTV9XVF9ERUxfQlNTX1JTUF9TVEFURSI7CisJY2FzZSBlTElNX01MTV9XVF9BRERfU1RBX1JTUF9TVEFURToKKwkJcmV0dXJuICJlTElNX01MTV9XVF9BRERfU1RBX1JTUF9TVEFURSI7CisJY2FzZSBlTElNX01MTV9XVF9BRERfQlNTX1JTUF9TVEFURToKKwkJcmV0dXJuICJlTElNX01MTV9XVF9BRERfQlNTX1JTUF9TVEFURSI7CisJY2FzZSBlTElNX01MTV9SRUFTU09DSUFURURfU1RBVEU6CisJCXJldHVybiAiZUxJTV9NTE1fUkVBU1NPQ0lBVEVEX1NUQVRFIjsKKwljYXNlIGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEU6CisJCXJldHVybiAiZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSI7CisJY2FzZSBlTElNX01MTV9XVF9BU1NPQ19DTkZfU1RBVEU6CisJCXJldHVybiAiZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFIjsKKwljYXNlIGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0FTU09DX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0FTU09DX1NUQVRFIjsKKwljYXNlIGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1JFQVNTT0NfU1RBVEU6CisJCXJldHVybiAiZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUkVBU1NPQ19TVEFURSI7CisJY2FzZSBlTElNX01MTV9XVF9BRERfQlNTX1JTUF9GVF9SRUFTU09DX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0ZUX1JFQVNTT0NfU1RBVEUiOworCWNhc2UgZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEU6CisJCXJldHVybiAiZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEUiOworCWNhc2UgZUxJTV9NTE1fV1RfU0VUX0JTU19LRVlfU1RBVEU6CisJCXJldHVybiAiZUxJTV9NTE1fV1RfU0VUX0JTU19LRVlfU1RBVEUiOworCWNhc2UgZUxJTV9NTE1fV1RfU0VUX1NUQV9LRVlfU1RBVEU6CisJCXJldHVybiAiZUxJTV9NTE1fV1RfU0VUX1NUQV9LRVlfU1RBVEUiOworCWRlZmF1bHQ6CisJCXJldHVybiAiSU5WQUxJRCBNTE0gc3RhdGUiOworCX0KK30KKwordm9pZAorbGltX3ByaW50X21sbV9zdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBsb2dMZXZlbCwgdExpbU1sbVN0YXRlcyBzdGF0ZSkKK3sKKwlsaW1fbG9nKHBNYWMsIGxvZ0xldmVsLCBsaW1fbWxtX3N0YXRlX3N0cihzdGF0ZSkpOworfQorCitjaGFyICpsaW1fc21lX3N0YXRlX3N0cih0TGltU21lU3RhdGVzIHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIGVMSU1fU01FX09GRkxJTkVfU1RBVEU6CisJCXJldHVybiAiZUxJTV9TTUVfT0ZGTElORV9TVEFURSI7CisJY2FzZSAgZUxJTV9TTUVfSURMRV9TVEFURToKKwkJcmV0dXJuICJlTElNX1NNRV9PRkZMSU5FX1NUQVRFIjsKKwljYXNlIGVMSU1fU01FX1NVU1BFTkRfU1RBVEU6CisJCXJldHVybiAiZUxJTV9TTUVfU1VTUEVORF9TVEFURSI7CisJY2FzZSBlTElNX1NNRV9XVF9TQ0FOX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fU01FX1dUX1NDQU5fU1RBVEUiOworCWNhc2UgZUxJTV9TTUVfV1RfSk9JTl9TVEFURToKKwkJcmV0dXJuICJlTElNX1NNRV9XVF9KT0lOX1NUQVRFIjsKKwljYXNlIGVMSU1fU01FX1dUX0FVVEhfU1RBVEU6CisJCXJldHVybiAiZUxJTV9TTUVfV1RfQVVUSF9TVEFURSI7CisJY2FzZSBlTElNX1NNRV9XVF9BU1NPQ19TVEFURToKKwkJcmV0dXJuICJlTElNX1NNRV9XVF9BU1NPQ19TVEFURSI7CisJY2FzZSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEUiOworCWNhc2UgZUxJTV9TTUVfV1RfUkVBU1NPQ19MSU5LX0ZBSUxfU1RBVEU6CisJCXJldHVybiAiZUxJTV9TTUVfV1RfUkVBU1NPQ19MSU5LX0ZBSUxfU1RBVEUiOworCWNhc2UgZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fU01FX0pPSU5fRkFJTFVSRV9TVEFURSI7CisJY2FzZSBlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fU01FX0FTU09DSUFURURfU1RBVEUiOworCWNhc2UgZUxJTV9TTUVfUkVBU1NPQ0lBVEVEX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fU01FX1JFQVNTT0NJQVRFRF9TVEFURSI7CisJY2FzZSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURToKKwkJcmV0dXJuICJlTElNX1NNRV9MSU5LX0VTVF9TVEFURSI7CisJY2FzZSBlTElNX1NNRV9MSU5LX0VTVF9XVF9TQ0FOX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fU01FX0xJTktfRVNUX1dUX1NDQU5fU1RBVEUiOworCWNhc2UgZUxJTV9TTUVfV1RfUFJFX0FVVEhfU1RBVEU6CisJCXJldHVybiAiZUxJTV9TTUVfV1RfUFJFX0FVVEhfU1RBVEUiOworCWNhc2UgZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEU6CisJCXJldHVybiAiZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEUiOworCWNhc2UgZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSI7CisJY2FzZSBlTElNX1NNRV9XVF9TVEFSVF9CU1NfU1RBVEU6CisJCXJldHVybiAiZUxJTV9TTUVfV1RfU1RBUlRfQlNTX1NUQVRFIjsKKwljYXNlIGVMSU1fU01FX1dUX1NUT1BfQlNTX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fU01FX1dUX1NUT1BfQlNTX1NUQVRFIjsKKwljYXNlIGVMSU1fU01FX05PUk1BTF9TVEFURToKKwkJcmV0dXJuICJlTElNX1NNRV9OT1JNQUxfU1RBVEUiOworCWNhc2UgZUxJTV9TTUVfQ0hBTk5FTF9TQ0FOX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fU01FX0NIQU5ORUxfU0NBTl9TVEFURSI7CisJY2FzZSBlTElNX1NNRV9OT1JNQUxfQ0hBTk5FTF9TQ0FOX1NUQVRFOgorCQlyZXR1cm4gImVMSU1fU01FX05PUk1BTF9DSEFOTkVMX1NDQU5fU1RBVEUiOworCWRlZmF1bHQ6CisJCXJldHVybiAiSU5WQUxJRCBTTUUgU1RBVEUiOworCX0KK30KKwordm9pZAorbGltX3ByaW50X3NtZV9zdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBsb2dMZXZlbCwgdExpbVNtZVN0YXRlcyBzdGF0ZSkKK3sKKwlsaW1fbG9nKHBNYWMsIGxvZ0xldmVsLCBsaW1fc21lX3N0YXRlX3N0cihzdGF0ZSkpOworfQorCitjaGFyICpsaW1fbXNnX3N0cih1aW50MzJfdCBtc2dUeXBlKQoreworI2lmZGVmIEZJWE1FX0dFTjYKKwlzd2l0Y2ggKG1zZ1R5cGUpIHsKKwljYXNlIGVXTklfU01FX1NZU19SRUFEWV9JTkQ6CisJCXJldHVybiAiZVdOSV9TTUVfU1lTX1JFQURZX0lORCI7CisJY2FzZSBlV05JX1NNRV9TQ0FOX1JFUToKKwkJcmV0dXJuICJlV05JX1NNRV9TQ0FOX1JFUSI7CisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisJY2FzZSBlV05JX1NNRV9PRU1fREFUQV9SRVE6CisJCXJldHVybiAiZVdOSV9TTUVfT0VNX0RBVEFfUkVRIjsKKwljYXNlIGVXTklfU01FX09FTV9EQVRBX1JTUDoKKwkJcmV0dXJuICJlV05JX1NNRV9PRU1fREFUQV9SU1AiOworI2VuZGlmCisJY2FzZSBlV05JX1NNRV9TQ0FOX1JTUDoKKwkJcmV0dXJuICJlV05JX1NNRV9TQ0FOX1JTUCI7CisJY2FzZSBlV05JX1NNRV9KT0lOX1JFUToKKwkJcmV0dXJuICJlV05JX1NNRV9KT0lOX1JFUSI7CisJY2FzZSBlV05JX1NNRV9KT0lOX1JTUDoKKwkJcmV0dXJuICJlV05JX1NNRV9KT0lOX1JTUCI7CisJY2FzZSBlV05JX1NNRV9TRVRDT05URVhUX1JFUToKKwkJcmV0dXJuICJlV05JX1NNRV9TRVRDT05URVhUX1JFUSI7CisJY2FzZSBlV05JX1NNRV9TRVRDT05URVhUX1JTUDoKKwkJcmV0dXJuICJlV05JX1NNRV9TRVRDT05URVhUX1JTUCI7CisJY2FzZSBlV05JX1NNRV9SRUFTU09DX1JFUToKKwkJcmV0dXJuICJlV05JX1NNRV9SRUFTU09DX1JFUSI7CisJY2FzZSBlV05JX1NNRV9SRUFTU09DX1JTUDoKKwkJcmV0dXJuICJlV05JX1NNRV9SRUFTU09DX1JTUCI7CisJY2FzZSBlV05JX1NNRV9ESVNBU1NPQ19SRVE6CisJCXJldHVybiAiZVdOSV9TTUVfRElTQVNTT0NfUkVRIjsKKwljYXNlIGVXTklfU01FX0RJU0FTU09DX1JTUDoKKwkJcmV0dXJuICJlV05JX1NNRV9ESVNBU1NPQ19SU1AiOworCWNhc2UgZVdOSV9TTUVfRElTQVNTT0NfSU5EOgorCQlyZXR1cm4gImVXTklfU01FX0RJU0FTU09DX0lORCI7CisJY2FzZSBlV05JX1NNRV9ESVNBU1NPQ19DTkY6CisJCXJldHVybiAiZVdOSV9TTUVfRElTQVNTT0NfQ05GIjsKKwljYXNlIGVXTklfU01FX0RFQVVUSF9SRVE6CisJCXJldHVybiAiZVdOSV9TTUVfREVBVVRIX1JFUSI7CisJY2FzZSBlV05JX1NNRV9ERUFVVEhfUlNQOgorCQlyZXR1cm4gImVXTklfU01FX0RFQVVUSF9SU1AiOworCWNhc2UgZVdOSV9TTUVfREVBVVRIX0lORDoKKwkJcmV0dXJuICJlV05JX1NNRV9ERUFVVEhfSU5EIjsKKwljYXNlIGVXTklfU01FX1dNX1NUQVRVU19DSEFOR0VfTlRGOgorCQlyZXR1cm4gImVXTklfU01FX1dNX1NUQVRVU19DSEFOR0VfTlRGIjsKKwljYXNlIGVXTklfU01FX1NUQVJUX0JTU19SRVE6CisJCXJldHVybiAiZVdOSV9TTUVfU1RBUlRfQlNTX1JFUSI7CisJY2FzZSBlV05JX1NNRV9TVEFSVF9CU1NfUlNQOgorCQlyZXR1cm4gImVXTklfU01FX1NUQVJUX0JTU19SU1AiOworCWNhc2UgZVdOSV9TTUVfQVNTT0NfSU5EOgorCQlyZXR1cm4gImVXTklfU01FX0FTU09DX0lORCI7CisJY2FzZSBlV05JX1NNRV9BU1NPQ19DTkY6CisJCXJldHVybiAiZVdOSV9TTUVfQVNTT0NfQ05GIjsKKwljYXNlIGVXTklfU01FX1NXSVRDSF9DSExfSU5EOgorCQlyZXR1cm4gImVXTklfU01FX1NXSVRDSF9DSExfSU5EIjsKKwljYXNlIGVXTklfU01FX1NUT1BfQlNTX1JFUToKKwkJcmV0dXJuICJlV05JX1NNRV9TVE9QX0JTU19SRVEiOworCWNhc2UgZVdOSV9TTUVfU1RPUF9CU1NfUlNQOgorCQlyZXR1cm4gImVXTklfU01FX1NUT1BfQlNTX1JTUCI7CisJY2FzZSBlV05JX1NNRV9ORUlHSEJPUl9CU1NfSU5EOgorCQlyZXR1cm4gImVXTklfU01FX05FSUdIQk9SX0JTU19JTkQiOworCWNhc2UgZVdOSV9TTUVfREVBVVRIX0NORjoKKwkJcmV0dXJuICJlV05JX1NNRV9ERUFVVEhfQ05GIjsKKwljYXNlIGVXTklfU01FX0FERFRTX1JFUToKKwkJcmV0dXJuICJlV05JX1NNRV9BRERUU19SRVEiOworCWNhc2UgZVdOSV9TTUVfQUREVFNfUlNQOgorCQlyZXR1cm4gImVXTklfU01FX0FERFRTX1JTUCI7CisJY2FzZSBlV05JX1NNRV9ERUxUU19SRVE6CisJCXJldHVybiAiZVdOSV9TTUVfREVMVFNfUkVRIjsKKwljYXNlIGVXTklfU01FX0RFTFRTX1JTUDoKKwkJcmV0dXJuICJlV05JX1NNRV9ERUxUU19SU1AiOworCWNhc2UgZVdOSV9TTUVfREVMVFNfSU5EOgorCQlyZXR1cm4gImVXTklfU01FX0RFTFRTX0lORCI7CisJY2FzZSBXTUFfU1VTUEVORF9BQ1RJVklUWV9SU1A6CisJCXJldHVybiAiV01BX1NVU1BFTkRfQUNUSVZJVFlfUlNQIjsKKwljYXNlIFNJUl9MSU1fUkVUUllfSU5URVJSVVBUX01TRzoKKwkJcmV0dXJuICJTSVJfTElNX1JFVFJZX0lOVEVSUlVQVF9NU0ciOworCWNhc2UgU0lSX0JCX1hQT1JUX01HTVRfTVNHOgorCQlyZXR1cm4gIlNJUl9CQl9YUE9SVF9NR01UX01TRyI7CisJY2FzZSBTSVJfTElNX0lOVl9LRVlfSU5URVJSVVBUX01TRzoKKwkJcmV0dXJuICJTSVJfTElNX0lOVl9LRVlfSU5URVJSVVBUX01TRyI7CisJY2FzZSBTSVJfTElNX0tFWV9JRF9JTlRFUlJVUFRfTVNHOgorCQlyZXR1cm4gIlNJUl9MSU1fS0VZX0lEX0lOVEVSUlVQVF9NU0ciOworCWNhc2UgU0lSX0xJTV9SRVBMQVlfVEhSRVNfSU5URVJSVVBUX01TRzoKKwkJcmV0dXJuICJTSVJfTElNX1JFUExBWV9USFJFU19JTlRFUlJVUFRfTVNHIjsKKwljYXNlIFNJUl9MSU1fSk9JTl9GQUlMX1RJTUVPVVQ6CisJCXJldHVybiAiU0lSX0xJTV9KT0lOX0ZBSUxfVElNRU9VVCI7CisJY2FzZSBTSVJfTElNX0FVVEhfRkFJTF9USU1FT1VUOgorCQlyZXR1cm4gIlNJUl9MSU1fQVVUSF9GQUlMX1RJTUVPVVQiOworCWNhc2UgU0lSX0xJTV9BVVRIX1JTUF9USU1FT1VUOgorCQlyZXR1cm4gIlNJUl9MSU1fQVVUSF9SU1BfVElNRU9VVCI7CisJY2FzZSBTSVJfTElNX0FTU09DX0ZBSUxfVElNRU9VVDoKKwkJcmV0dXJuICJTSVJfTElNX0FTU09DX0ZBSUxfVElNRU9VVCI7CisJY2FzZSBTSVJfTElNX1JFQVNTT0NfRkFJTF9USU1FT1VUOgorCQlyZXR1cm4gIlNJUl9MSU1fUkVBU1NPQ19GQUlMX1RJTUVPVVQiOworCWNhc2UgU0lSX0xJTV9IRUFSVF9CRUFUX1RJTUVPVVQ6CisJCXJldHVybiAiU0lSX0xJTV9IRUFSVF9CRUFUX1RJTUVPVVQiOworCWNhc2UgU0lSX0xJTV9BRERUU19SU1BfVElNRU9VVDoKKwkJcmV0dXJuICJTSVJfTElNX0FERFRTX1JTUF9USU1FT1VUIjsKKwljYXNlIFNJUl9MSU1fTElOS19URVNUX0RVUkFUSU9OX1RJTUVPVVQ6CisJCXJldHVybiAiU0lSX0xJTV9MSU5LX1RFU1RfRFVSQVRJT05fVElNRU9VVCI7CisJY2FzZSBTSVJfTElNX0hBU0hfTUlTU19USFJFU19USU1FT1VUOgorCQlyZXR1cm4gIlNJUl9MSU1fSEFTSF9NSVNTX1RIUkVTX1RJTUVPVVQiOworCWNhc2UgU0lSX0xJTV9VUERBVEVfT0xCQ19DQUNIRUxfVElNRU9VVDoKKwkJcmV0dXJuICJTSVJfTElNX1VQREFURV9PTEJDX0NBQ0hFTF9USU1FT1VUIjsKKwljYXNlIFNJUl9MSU1fQ05GX1dBSVRfVElNRU9VVDoKKwkJcmV0dXJuICJTSVJfTElNX0NORl9XQUlUX1RJTUVPVVQiOworCWNhc2UgU0lSX0xJTV9SQURBUl9ERVRFQ1RfSU5EOgorCQlyZXR1cm4gIlNJUl9MSU1fUkFEQVJfREVURUNUX0lORCI7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwljYXNlIFNJUl9MSU1fRlRfUFJFQVVUSF9SU1BfVElNRU9VVDoKKwkJcmV0dXJuICJTSVJfTElNX0ZUX1BSRUFVVEhfUlNQX1RJTUVPVVQiOworI2VuZGlmCisKKwljYXNlIFdOSV9DRkdfUEFSQU1fVVBEQVRFX0lORDoKKwkJcmV0dXJuICJXTklfQ0ZHX1BBUkFNX1VQREFURV9JTkQiOworCWNhc2UgV05JX0NGR19ETkxEX1JFUToKKwkJcmV0dXJuICJXTklfQ0ZHX0ROTERfUkVRIjsKKwljYXNlIFdOSV9DRkdfRE5MRF9DTkY6CisJCXJldHVybiAiV05JX0NGR19ETkxEX0NORiI7CisJY2FzZSBXTklfQ0ZHX0dFVF9SU1A6CisJCXJldHVybiAiV05JX0NGR19HRVRfUlNQIjsKKwljYXNlIFdOSV9DRkdfU0VUX0NORjoKKwkJcmV0dXJuICJXTklfQ0ZHX1NFVF9DTkYiOworCWNhc2UgV05JX0NGR19HRVRfQVRUUklCX1JTUDoKKwkJcmV0dXJuICJXTklfQ0ZHX0dFVF9BVFRSSUJfUlNQIjsKKwljYXNlIFdOSV9DRkdfQUREX0dSUF9BRERSX0NORjoKKwkJcmV0dXJuICJXTklfQ0ZHX0FERF9HUlBfQUREUl9DTkYiOworCWNhc2UgV05JX0NGR19ERUxfR1JQX0FERFJfQ05GOgorCQlyZXR1cm4gIldOSV9DRkdfREVMX0dSUF9BRERSX0NORiI7CisJY2FzZSBBTklfQ0ZHX0dFVF9SQURJT19TVEFUX1JTUDoKKwkJcmV0dXJuICJBTklfQ0ZHX0dFVF9SQURJT19TVEFUX1JTUCI7CisJY2FzZSBBTklfQ0ZHX0dFVF9QRVJfU1RBX1NUQVRfUlNQOgorCQlyZXR1cm4gIkFOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SU1AiOworCWNhc2UgQU5JX0NGR19HRVRfQUdHX1NUQV9TVEFUX1JTUDoKKwkJcmV0dXJuICJBTklfQ0ZHX0dFVF9BR0dfU1RBX1NUQVRfUlNQIjsKKwljYXNlIEFOSV9DRkdfQ0xFQVJfU1RBVF9SU1A6CisJCXJldHVybiAiQU5JX0NGR19DTEVBUl9TVEFUX1JTUCI7CisJY2FzZSBXTklfQ0ZHX0ROTERfUlNQOgorCQlyZXR1cm4gIldOSV9DRkdfRE5MRF9SU1AiOworCWNhc2UgV05JX0NGR19HRVRfUkVROgorCQlyZXR1cm4gIldOSV9DRkdfR0VUX1JFUSI7CisJY2FzZSBXTklfQ0ZHX1NFVF9SRVE6CisJCXJldHVybiAiV05JX0NGR19TRVRfUkVRIjsKKwljYXNlIFdOSV9DRkdfU0VUX1JFUV9OT19SU1A6CisJCXJldHVybiAiV05JX0NGR19TRVRfUkVRX05PX1JTUCI7CisJY2FzZSBlV05JX1BNQ19FTlRFUl9JTVBTX1JTUDoKKwkJcmV0dXJuICJlV05JX1BNQ19FTlRFUl9JTVBTX1JTUCI7CisJY2FzZSBlV05JX1BNQ19FWElUX0lNUFNfUlNQOgorCQlyZXR1cm4gImVXTklfUE1DX0VYSVRfSU1QU19SU1AiOworCWNhc2UgZVdOSV9QTUNfRU5URVJfQk1QU19SU1A6CisJCXJldHVybiAiZVdOSV9QTUNfRU5URVJfQk1QU19SU1AiOworCWNhc2UgZVdOSV9QTUNfRVhJVF9CTVBTX1JTUDoKKwkJcmV0dXJuICJlV05JX1BNQ19FWElUX0JNUFNfUlNQIjsKKwljYXNlIGVXTklfUE1DX0VYSVRfQk1QU19JTkQ6CisJCXJldHVybiAiZVdOSV9QTUNfRVhJVF9CTVBTX0lORCI7CisJY2FzZSBlV05JX1NNRV9TRVRfQkNOX0ZJTFRFUl9SRVE6CisJCXJldHVybiAiZVdOSV9TTUVfU0VUX0JDTl9GSUxURVJfUkVRIjsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisJY2FzZSBlV05JX1NNRV9HRVRfVFNNX1NUQVRTX1JFUToKKwkJcmV0dXJuICJlV05JX1NNRV9HRVRfVFNNX1NUQVRTX1JFUSI7CisJY2FzZSBlV05JX1NNRV9HRVRfVFNNX1NUQVRTX1JTUDoKKwkJcmV0dXJuICJlV05JX1NNRV9HRVRfVFNNX1NUQVRTX1JTUCI7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAmJiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworCWNhc2UgZVdOSV9TTUVfQ1NBX09GRkxPQURfRVZFTlQ6CisJCXJldHVybiAiZVdOSV9TTUVfQ1NBX09GRkxPQURfRVZFTlQiOworCWNhc2UgZVdOSV9TTUVfU0VUX0hXX01PREVfUkVROgorCQlyZXR1cm4gImVXTklfU01FX1NFVF9IV19NT0RFX1JFUSI7CisJY2FzZSBlV05JX1NNRV9TRVRfSFdfTU9ERV9SRVNQOgorCQlyZXR1cm4gImVXTklfU01FX1NFVF9IV19NT0RFX1JFU1AiOworCWNhc2UgZVdOSV9TTUVfSFdfTU9ERV9UUkFOU19JTkQ6CisJCXJldHVybiAiZVdOSV9TTUVfSFdfTU9ERV9UUkFOU19JTkQiOworCWRlZmF1bHQ6CisJCXJldHVybiAiSU5WQUxJRCBTTUUgbWVzc2FnZSI7CisJfQorI2VuZGlmCisJcmV0dXJuICIiOworfQorCitjaGFyICpsaW1fcmVzdWx0X2NvZGVfc3RyKHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlKQoreworCXN3aXRjaCAocmVzdWx0Q29kZSkgeworCWNhc2UgZVNJUl9TTUVfU1VDQ0VTUzoKKwkJcmV0dXJuICJlU0lSX1NNRV9TVUNDRVNTIjsKKwljYXNlIGVTSVJfTE9HUF9FWENFUFRJT046CisJCXJldHVybiAiZVNJUl9MT0dQX0VYQ0VQVElPTiI7CisJY2FzZSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM6CisJCXJldHVybiAiZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTIjsKKwljYXNlIGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFOgorCQlyZXR1cm4gImVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFIjsKKwljYXNlIGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRToKKwkJcmV0dXJuICJlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEUiOworCWNhc2UgZVNJUl9TTUVfU0NBTl9GQUlMRUQ6CisJCXJldHVybiAiZVNJUl9TTUVfU0NBTl9GQUlMRUQiOworCWNhc2UgZVNJUl9TTUVfQlNTX0FMUkVBRFlfU1RBUlRFRF9PUl9KT0lORUQ6CisJCXJldHVybiAiZVNJUl9TTUVfQlNTX0FMUkVBRFlfU1RBUlRFRF9PUl9KT0lORUQiOworCWNhc2UgZVNJUl9TTUVfTE9TVF9MSU5LX1dJVEhfUEVFUl9SRVNVTFRfQ09ERToKKwkJcmV0dXJuICJlU0lSX1NNRV9MT1NUX0xJTktfV0lUSF9QRUVSX1JFU1VMVF9DT0RFIjsKKwljYXNlIGVTSVJfU01FX1JFRlVTRUQ6CisJCXJldHVybiAiZVNJUl9TTUVfUkVGVVNFRCI7CisJY2FzZSBlU0lSX1NNRV9KT0lOX1RJTUVPVVRfUkVTVUxUX0NPREU6CisJCXJldHVybiAiZVNJUl9TTUVfSk9JTl9USU1FT1VUX1JFU1VMVF9DT0RFIjsKKwljYXNlIGVTSVJfU01FX0FVVEhfVElNRU9VVF9SRVNVTFRfQ09ERToKKwkJcmV0dXJuICJlU0lSX1NNRV9BVVRIX1RJTUVPVVRfUkVTVUxUX0NPREUiOworCWNhc2UgZVNJUl9TTUVfQVNTT0NfVElNRU9VVF9SRVNVTFRfQ09ERToKKwkJcmV0dXJuICJlU0lSX1NNRV9BU1NPQ19USU1FT1VUX1JFU1VMVF9DT0RFIjsKKwljYXNlIGVTSVJfU01FX1JFQVNTT0NfVElNRU9VVF9SRVNVTFRfQ09ERToKKwkJcmV0dXJuICJlU0lSX1NNRV9SRUFTU09DX1RJTUVPVVRfUkVTVUxUX0NPREUiOworCWNhc2UgZVNJUl9TTUVfTUFYX05VTV9PRl9QUkVfQVVUSF9SRUFDSEVEOgorCQlyZXR1cm4gImVTSVJfU01FX01BWF9OVU1fT0ZfUFJFX0FVVEhfUkVBQ0hFRCI7CisJY2FzZSBlU0lSX1NNRV9BVVRIX1JFRlVTRUQ6CisJCXJldHVybiAiZVNJUl9TTUVfQVVUSF9SRUZVU0VEIjsKKwljYXNlIGVTSVJfU01FX0lOVkFMSURfV0VQX0RFRkFVTFRfS0VZOgorCQlyZXR1cm4gImVTSVJfU01FX0lOVkFMSURfV0VQX0RFRkFVTFRfS0VZIjsKKwljYXNlIGVTSVJfU01FX0FTU09DX1JFRlVTRUQ6CisJCXJldHVybiAiZVNJUl9TTUVfQVNTT0NfUkVGVVNFRCI7CisJY2FzZSBlU0lSX1NNRV9SRUFTU09DX1JFRlVTRUQ6CisJCXJldHVybiAiZVNJUl9TTUVfUkVBU1NPQ19SRUZVU0VEIjsKKwljYXNlIGVTSVJfU01FX1NUQV9OT1RfQVVUSEVOVElDQVRFRDoKKwkJcmV0dXJuICJlU0lSX1NNRV9TVEFfTk9UX0FVVEhFTlRJQ0FURUQiOworCWNhc2UgZVNJUl9TTUVfU1RBX05PVF9BU1NPQ0lBVEVEOgorCQlyZXR1cm4gImVTSVJfU01FX1NUQV9OT1RfQVNTT0NJQVRFRCI7CisJY2FzZSBlU0lSX1NNRV9BTFJFQURZX0pPSU5FRF9BX0JTUzoKKwkJcmV0dXJuICJlU0lSX1NNRV9BTFJFQURZX0pPSU5FRF9BX0JTUyI7CisJY2FzZSBlU0lSX1NNRV9NT1JFX1NDQU5fUkVTVUxUU19GT0xMT1c6CisJCXJldHVybiAiZVNJUl9TTUVfTU9SRV9TQ0FOX1JFU1VMVFNfRk9MTE9XIjsKKwljYXNlIGVTSVJfU01FX0lOVkFMSURfQVNTT0NfUlNQX1JYRUQ6CisJCXJldHVybiAiZVNJUl9TTUVfSU5WQUxJRF9BU1NPQ19SU1BfUlhFRCI7CisJY2FzZSBlU0lSX1NNRV9NSUNfQ09VTlRFUl9NRUFTVVJFUzoKKwkJcmV0dXJuICJlU0lSX1NNRV9NSUNfQ09VTlRFUl9NRUFTVVJFUyI7CisJY2FzZSBlU0lSX1NNRV9BRERUU19SU1BfVElNRU9VVDoKKwkJcmV0dXJuICJlU0lSX1NNRV9BRERUU19SU1BfVElNRU9VVCI7CisJY2FzZSBlU0lSX1NNRV9DSEFOTkVMX1NXSVRDSF9GQUlMOgorCQlyZXR1cm4gImVTSVJfU01FX0NIQU5ORUxfU1dJVENIX0ZBSUwiOworCWNhc2UgZVNJUl9TTUVfSEFMX1NDQU5fSU5JVF9GQUlMRUQ6CisJCXJldHVybiAiZVNJUl9TTUVfSEFMX1NDQU5fSU5JVF9GQUlMRUQiOworCWNhc2UgZVNJUl9TTUVfSEFMX1NDQU5fRU5EX0ZBSUxFRDoKKwkJcmV0dXJuICJlU0lSX1NNRV9IQUxfU0NBTl9FTkRfRkFJTEVEIjsKKwljYXNlIGVTSVJfU01FX0hBTF9TQ0FOX0ZJTklTSF9GQUlMRUQ6CisJCXJldHVybiAiZVNJUl9TTUVfSEFMX1NDQU5fRklOSVNIX0ZBSUxFRCI7CisJY2FzZSBlU0lSX1NNRV9IQUxfU0VORF9NRVNTQUdFX0ZBSUw6CisJCXJldHVybiAiZVNJUl9TTUVfSEFMX1NFTkRfTUVTU0FHRV9GQUlMIjsKKworCWRlZmF1bHQ6CisJCXJldHVybiAiSU5WQUxJRCByZXN1bHRDb2RlIjsKKwl9Cit9CisKK3ZvaWQgbGltX3ByaW50X21zZ19uYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGxvZ0xldmVsLCB1aW50MzJfdCBtc2dUeXBlKQoreworCWxpbV9sb2cocE1hYywgbG9nTGV2ZWwsIGxpbV9tc2dfc3RyKG1zZ1R5cGUpKTsKK30KKworLyoqCisgKiBsaW1faW5pdF9tbG0oKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVNZXNzYWdlcygpIHRvCisgKiBpbml0aWFsaXplIE1MTSBzdGF0ZSBtYWNoaW5lIG9uIFNUQQorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbV9pbml0X21sbSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQzMl90IHJldFZhbDsKKworCXBNYWMtPmxpbS5nTGltVGltZXJzQ3JlYXRlZCA9IDA7CisKKwlNVFJBQ0UobWFjX3RyYWNlCisJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIE5PX1NFU1NJT04sCisJCSAgICAgICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKworCS8qIC8gSW5pdGlhbGl6ZSBudW1iZXIgb2YgcHJlLWF1dGggY29udGV4dHMgKi8KKwlwTWFjLT5saW0uZ0xpbU51bVByZUF1dGhDb250ZXh0cyA9IDA7CisKKwkvKiAvIEluaXRpYWxpemUgTUFDIGJhc2VkIEF1dGhlbnRpY2F0aW9uIFNUQSBsaXN0ICovCisJbGltX2luaXRfcHJlX2F1dGhfbGlzdChwTWFjKTsKKworCS8qIENyZWF0ZSB0aW1lcnMgdXNlZCBieSBMSU0gKi8KKwlyZXRWYWwgPSBsaW1fY3JlYXRlX3RpbWVycyhwTWFjKTsKKwlpZiAocmV0VmFsID09IFRYX1NVQ0NFU1MpIHsKKwkJcE1hYy0+bGltLmdMaW1UaW1lcnNDcmVhdGVkID0gMTsKKwl9IGVsc2UgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiIGxpbV9jcmVhdGVfdGltZXJzIEZhaWxlZCB0byBjcmVhdGUgbGltIHRpbWVycyAiKSk7CisJfQorfSAvKioqIGVuZCBsaW1faW5pdF9tbG0oKSAqKiovCisKKy8qKgorICogbGltX2RlYWN0aXZhdGVfZGVsX3N0YSgpIC0gVGhpcyBmdW5jdGlvbiBkZWFjdGl2YXRlL2RlbGV0ZSBhc3NvY2lhdGVzIFNUQQorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBTdHJ1Y3R1cmUKKyAqIEBic3NfZW50cnk6IGluZGV4IGZvciBic3NfZW50cnkKKyAqIEBwc2Vzc2lvbl9lbnRyeTogcG9pbnRlciB0byBzZXNzaW9uIGVudHJ5CisgKiBAc3RhX2RzOiBwb2ludGVyIHRvIHRwRHBoSGFzaE5vZGUKKyAqCisgKiBGdW5jdGlvbiBkZWFjdGl2YXRlL2RlbGV0ZSBhc3NvY2lhdGVzIFNUQQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBsaW1fZGVhY3RpdmF0ZV9kZWxfc3RhKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQzMl90IGJzc19lbnRyeSwKKwkJdHBQRVNlc3Npb24gcHNlc3Npb25fZW50cnksIHRwRHBoSGFzaE5vZGUgc3RhX2RzKQoreworCXVpbnQzMl90IHN0YV9lbnRyeTsKKworCWZvciAoc3RhX2VudHJ5ID0gMTsgc3RhX2VudHJ5IDwgbWFjX2N0eC0+bGltLmdMaW1Bc3NvY1N0YUxpbWl0OworCQkJCXN0YV9lbnRyeSsrKSB7CisJCXBzZXNzaW9uX2VudHJ5ID0gJm1hY19jdHgtPmxpbS5ncFNlc3Npb25bYnNzX2VudHJ5XTsKKwkJc3RhX2RzID0gZHBoX2dldF9oYXNoX2VudHJ5KG1hY19jdHgsIHN0YV9lbnRyeSwKKwkJCQkJJnBzZXNzaW9uX2VudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwkJaWYgKE5VTEwgPT0gc3RhX2RzKQorCQkJY29udGludWU7CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgiRGVsZXRpbmcgcG1mU2FRdWVyeVRpbWVyIGZvciBzdGFpZFslZF0iKSwKKwkJCQlzdGFfZHMtPnN0YUluZGV4KTsKKwkJdHhfdGltZXJfZGVhY3RpdmF0ZSgmc3RhX2RzLT5wbWZTYVF1ZXJ5VGltZXIpOworCQl0eF90aW1lcl9kZWxldGUoJnN0YV9kcy0+cG1mU2FRdWVyeVRpbWVyKTsKKwl9Cit9CisKKy8qKgorICogbGltX2NsZWFudXBfbWxtKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbGVhbnVwCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIEZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbGVhbnVwIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoZSAgTUxNCisgKiBzdGF0ZSBtYWNoaW5lLgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGxpbV9jbGVhbnVwX21sbSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4KQoreworCXVpbnQzMl90IG47CisJdExpbVByZUF1dGhOb2RlICpwQXV0aE5vZGU7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXVpbnQzMl90IGJzc19lbnRyeTsKKwl0cERwaEhhc2hOb2RlIHN0YV9kcyA9IE5VTEw7CisJdHBQRVNlc3Npb24gcHNlc3Npb25fZW50cnkgPSBOVUxMOworI2VuZGlmCisJdExpbVRpbWVycyAqbGltX3RpbWVyID0gTlVMTDsKKworCWlmIChtYWNfY3R4LT5saW0uZ0xpbVRpbWVyc0NyZWF0ZWQgPT0gMSkgeworCQlsaW1fdGltZXIgPSAmbWFjX2N0eC0+bGltLmxpbVRpbWVyczsKKworCQkvKiBEZWFjdGl2YXRlIGFuZCBkZWxldGUgUGVyaW9kaWMgUHJvYmUgY2hhbm5lbCB0aW1lcnMuICovCisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJmxpbV90aW1lci0+Z0xpbVBlcmlvZGljUHJvYmVSZXFUaW1lcik7CisJCXR4X3RpbWVyX2RlbGV0ZSgmbGltX3RpbWVyLT5nTGltUGVyaW9kaWNQcm9iZVJlcVRpbWVyKTsKKworCQkvKiBEZWFjdGl2YXRlIGFuZCBkZWxldGUgY2hhbm5lbCBzd2l0Y2ggdGltZXIuICovCisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJmxpbV90aW1lci0+Z0xpbUNoYW5uZWxTd2l0Y2hUaW1lcik7CisJCXR4X3RpbWVyX2RlbGV0ZSgmbGltX3RpbWVyLT5nTGltQ2hhbm5lbFN3aXRjaFRpbWVyKTsKKworCQkvKiBEZWFjdGl2YXRlIGFuZCBkZWxldGUgYWRkdHMgcmVzcG9uc2UgdGltZXIuICovCisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJmxpbV90aW1lci0+Z0xpbUFkZHRzUnNwVGltZXIpOworCQl0eF90aW1lcl9kZWxldGUoJmxpbV90aW1lci0+Z0xpbUFkZHRzUnNwVGltZXIpOworCisJCS8qIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBKb2luIGZhaWx1cmUgdGltZXIuICovCisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJmxpbV90aW1lci0+Z0xpbUpvaW5GYWlsdXJlVGltZXIpOworCQl0eF90aW1lcl9kZWxldGUoJmxpbV90aW1lci0+Z0xpbUpvaW5GYWlsdXJlVGltZXIpOworCisJCS8qIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBQZXJpb2RpYyBKb2luIFByb2JlIFJlcXVlc3QgdGltZXIuICovCisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJmxpbV90aW1lci0+Z0xpbVBlcmlvZGljSm9pblByb2JlUmVxVGltZXIpOworCQl0eF90aW1lcl9kZWxldGUoJmxpbV90aW1lci0+Z0xpbVBlcmlvZGljSm9pblByb2JlUmVxVGltZXIpOworCisJCS8qIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBBc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyLiAqLworCQl0eF90aW1lcl9kZWFjdGl2YXRlKCZsaW1fdGltZXItPmdMaW1Bc3NvY0ZhaWx1cmVUaW1lcik7CisJCXR4X3RpbWVyX2RlbGV0ZSgmbGltX3RpbWVyLT5nTGltQXNzb2NGYWlsdXJlVGltZXIpOworCisJCS8qIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBSZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIuICovCisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJmxpbV90aW1lci0+Z0xpbVJlYXNzb2NGYWlsdXJlVGltZXIpOworCQl0eF90aW1lcl9kZWxldGUoJmxpbV90aW1lci0+Z0xpbVJlYXNzb2NGYWlsdXJlVGltZXIpOworCisJCS8qIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBBdXRoZW50aWNhdGlvbiBmYWlsdXJlIHRpbWVyLiAqLworCQl0eF90aW1lcl9kZWFjdGl2YXRlKCZsaW1fdGltZXItPmdMaW1BdXRoRmFpbHVyZVRpbWVyKTsKKwkJdHhfdGltZXJfZGVsZXRlKCZsaW1fdGltZXItPmdMaW1BdXRoRmFpbHVyZVRpbWVyKTsKKworCQkvKiBEZWFjdGl2YXRlIGFuZCBkZWxldGUgd2FpdC1mb3ItcHJvYmUtYWZ0ZXItSGVhcnRiZWF0IHRpbWVyLiAqLworCQl0eF90aW1lcl9kZWFjdGl2YXRlKCZsaW1fdGltZXItPmdMaW1Qcm9iZUFmdGVySEJUaW1lcik7CisJCXR4X3RpbWVyX2RlbGV0ZSgmbGltX3RpbWVyLT5nTGltUHJvYmVBZnRlckhCVGltZXIpOworCisJCS8qIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBRdWlldCB0aW1lci4gKi8KKwkJdHhfdGltZXJfZGVhY3RpdmF0ZSgmbGltX3RpbWVyLT5nTGltUXVpZXRUaW1lcik7CisJCXR4X3RpbWVyX2RlbGV0ZSgmbGltX3RpbWVyLT5nTGltUXVpZXRUaW1lcik7CisKKwkJLyogRGVhY3RpdmF0ZSBhbmQgZGVsZXRlIFF1aWV0IEJTUyB0aW1lci4gKi8KKwkJdHhfdGltZXJfZGVhY3RpdmF0ZSgmbGltX3RpbWVyLT5nTGltUXVpZXRCc3NUaW1lcik7CisJCXR4X3RpbWVyX2RlbGV0ZSgmbGltX3RpbWVyLT5nTGltUXVpZXRCc3NUaW1lcik7CisKKwkJLyogRGVhY3RpdmF0ZSBhbmQgZGVsZXRlIGNuZiB3YWl0IHRpbWVyICovCisJCWZvciAobiA9IDA7IG4gPCAobWFjX2N0eC0+bGltLm1heFN0YXRpb24gKyAxKTsgbisrKSB7CisJCQl0eF90aW1lcl9kZWFjdGl2YXRlKCZsaW1fdGltZXItPmdwTGltQ25mV2FpdFRpbWVyW25dKTsKKwkJCXR4X3RpbWVyX2RlbGV0ZSgmbGltX3RpbWVyLT5ncExpbUNuZldhaXRUaW1lcltuXSk7CisJCX0KKworCQlwQXV0aE5vZGUgPSBtYWNfY3R4LT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlLnBUYWJsZTsKKworCQkvKiBEZWFjdGl2YXRlIGFueSBBdXRoZW50aWNhdGlvbiByZXNwb25zZSB0aW1lcnMgKi8KKwkJbGltX2RlbGV0ZV9wcmVfYXV0aF9saXN0KG1hY19jdHgpOworCisJCWZvciAobiA9IDA7IG4gPCBtYWNfY3R4LT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlLm51bUVudHJ5OworCQkJCQluKyssIHBBdXRoTm9kZSsrKSB7CisJCQkvKgorCQkJICogRGVsZXRlIGFueSBBdXRoZW50aWNhdGlvbiByZXNwb25zZQorCQkJICogdGltZXJzLCB3aGljaCBtaWdodCBoYXZlIGJlZW4gc3RhcnRlZC4KKwkJCSAqLworCQkJdHhfdGltZXJfZGVsZXRlKCZwQXV0aE5vZGUtPnRpbWVyKTsKKwkJfQorCisJCS8qIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBIYXNoIE1pc3MgdGhyb3R0bGUgdGltZXIgKi8KKwkJdHhfdGltZXJfZGVhY3RpdmF0ZSgmbGltX3RpbWVyLT4KKwkJCQlnTGltU2VuZERpc2Fzc29jRnJhbWVUaHJlc2hvbGRUaW1lcik7CisJCXR4X3RpbWVyX2RlbGV0ZSgmbGltX3RpbWVyLT4KKwkJCQlnTGltU2VuZERpc2Fzc29jRnJhbWVUaHJlc2hvbGRUaW1lcik7CisKKwkJdHhfdGltZXJfZGVhY3RpdmF0ZSgmbGltX3RpbWVyLT5nTGltVXBkYXRlT2xiY0NhY2hlVGltZXIpOworCQl0eF90aW1lcl9kZWxldGUoJmxpbV90aW1lci0+Z0xpbVVwZGF0ZU9sYmNDYWNoZVRpbWVyKTsKKwkJdHhfdGltZXJfZGVhY3RpdmF0ZSgmbGltX3RpbWVyLT5nTGltUHJlQXV0aENsbnVwVGltZXIpOworCQl0eF90aW1lcl9kZWxldGUoJmxpbV90aW1lci0+Z0xpbVByZUF1dGhDbG51cFRpbWVyKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCS8qIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBGVCBQcmVhdXRoIHJlc3BvbnNlIHRpbWVyICovCisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJmxpbV90aW1lci0+Z0xpbUZUUHJlQXV0aFJzcFRpbWVyKTsKKwkJdHhfdGltZXJfZGVsZXRlKCZsaW1fdGltZXItPmdMaW1GVFByZUF1dGhSc3BUaW1lcik7CisjZW5kaWYKKworCQkvKiBEZWFjdGl2YXRlIGFuZCBkZWxldGUgcmVtYWluIG9uIGNoYW5uZWwgdGltZXIgKi8KKwkJdHhfdGltZXJfZGVhY3RpdmF0ZSgmbGltX3RpbWVyLT5nTGltUmVtYWluT25DaGFubmVsVGltZXIpOworCQl0eF90aW1lcl9kZWxldGUoJmxpbV90aW1lci0+Z0xpbVJlbWFpbk9uQ2hhbm5lbFRpbWVyKTsKKworCisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJmxpbV90aW1lci0+Z0xpbURpc2Fzc29jQWNrVGltZXIpOworCQl0eF90aW1lcl9kZWxldGUoJmxpbV90aW1lci0+Z0xpbURpc2Fzc29jQWNrVGltZXIpOworCisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJmxpbV90aW1lci0+Z0xpbURlYXV0aEFja1RpbWVyKTsKKwkJdHhfdGltZXJfZGVsZXRlKCZsaW1fdGltZXItPmdMaW1EZWF1dGhBY2tUaW1lcik7CisKKwkJdHhfdGltZXJfZGVhY3RpdmF0ZSgmbGltX3RpbWVyLT4KKwkJCQlnTGltUDJwU2luZ2xlU2hvdE5vYUluc2VydFRpbWVyKTsKKwkJdHhfdGltZXJfZGVsZXRlKCZsaW1fdGltZXItPgorCQkJCWdMaW1QMnBTaW5nbGVTaG90Tm9hSW5zZXJ0VGltZXIpOworCisJCXR4X3RpbWVyX2RlYWN0aXZhdGUoJmxpbV90aW1lci0+CisJCQkJZ0xpbUFjdGl2ZVRvUGFzc2l2ZUNoYW5uZWxUaW1lcik7CisJCXR4X3RpbWVyX2RlbGV0ZSgmbGltX3RpbWVyLT4KKwkJCQlnTGltQWN0aXZlVG9QYXNzaXZlQ2hhbm5lbFRpbWVyKTsKKworCQltYWNfY3R4LT5saW0uZ0xpbVRpbWVyc0NyZWF0ZWQgPSAwOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJLyoKKwkgKiBXaGVuIFNTUiBpcyB0cmlnZ2VyZWQsIHdlIG5lZWQgdG8gbG9vcCB0aHJvdWdoCisJICogZWFjaCBTVEEgYXNzb2NpYXRlZCBwZXIgQlNTSWQgYW5kIGRlYWN0aXZhdGUvZGVsZXRlCisJICogdGhlIHBtZlNhUXVlcnlUaW1lciBmb3IgaXQKKwkgKi8KKwlpZiAoY2RzX2lzX2xvZ3BfaW5fcHJvZ3Jlc3MoKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMKCJTU1IgaXMgZGV0ZWN0ZWQsIHByb2NlZWQgdG8gY2xlYW4gdXAgcG1mU2FRdWVyeVRpbWVyIikpOworCQlmb3IgKGJzc19lbnRyeSA9IDA7IGJzc19lbnRyeSA8IG1hY19jdHgtPmxpbS5tYXhCc3NJZDsKKwkJCQkJCWJzc19lbnRyeSsrKSB7CisJCQlpZiAoIW1hY19jdHgtPmxpbS5ncFNlc3Npb25bYnNzX2VudHJ5XS52YWxpZCkKKwkJCQljb250aW51ZTsKKwkJCWxpbV9kZWFjdGl2YXRlX2RlbF9zdGEobWFjX2N0eCwgYnNzX2VudHJ5LAorCQkJCQlwc2Vzc2lvbl9lbnRyeSwgc3RhX2RzKTsKKwkJfQorCX0KKyNlbmRpZgorCit9IC8qKiogZW5kIGxpbV9jbGVhbnVwX21sbSgpICoqKi8KKworLyoqCisgKiBsaW1fY2xlYW51cF9sbW0oKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsZWFudXAgYW55IHJlc291cmNlcworICogYWxsb2NhdGVkIGJ5IExNTSBzdWItbW9kdWxlLgorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltX2NsZWFudXBfbG1tKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7Cit9IC8qKiogZW5kIGxpbV9jbGVhbnVwX2xtbSgpICoqKi8KKworLyoqCisgKiBsaW1faXNfYWRkcl9iYygpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdmFyaW91cyBwbGFjZXMgd2l0aGluIExJTSBjb2RlCisgKiB0byBkZXRlcm1pbmUgd2hldGhlciBwYXNzZWQgTUFDIGFkZHJlc3MgaXMgYSBicm9hZGNhc3Qgb3Igbm90CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBtYWNBZGRyICBJbmRpY2F0ZXMgTUFDIGFkZHJlc3MgdGhhdCBuZWVkIHRvIGJlIGRldGVybWluZWQKKyAqICAgICAgICAgICAgICAgICB3aGV0aGVyIGl0IGlzIEJyb2FkY2FzdCBhZGRyZXNzIG9yIG5vdAorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBwYXNzZWQgYWRkcmVzcyBpcyBCcm9hZGNhc3QgYWRkcmVzcyBlbHNlIGZhbHNlCisgKi8KKwordWludDhfdCBsaW1faXNfYWRkcl9iYyh0U2lyTWFjQWRkciBtYWNBZGRyKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKChtYWNBZGRyW2ldICYgMHhGRikgIT0gMHhGRikKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30gLyoqKioqKiBlbmQgbGltX2lzX2FkZHJfYmMoKSAqKioqKiovCisKKy8qKgorICogbGltX2lzX2dyb3VwX2FkZHIoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHZhcmlvdXMgcGxhY2VzIHdpdGhpbiBMSU0gY29kZQorICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgcGFzc2VkIE1BQyBhZGRyZXNzIGlzIGEgZ3JvdXAgYWRkcmVzcyBvciBub3QKKyAqCisgKioqTE9HSUM6CisgKiBJZiBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgZmlyc3Qgb2N0ZXQgb2YgdGhlIE1BQyBhZGRyZXNzIGlzCisgKiBzZXQgdG8gMSwgaXQgaXMgYSBHcm91cCBhZGRyZXNzLgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBtYWNBZGRyICBJbmRpY2F0ZXMgTUFDIGFkZHJlc3MgdGhhdCBuZWVkIHRvIGJlIGRldGVybWluZWQKKyAqICAgICAgICAgICAgICAgICB3aGV0aGVyIGl0IGlzIEdyb3VwIGFkZHJlc3Mgb3Igbm90CisgKgorICogQHJldHVybiB0cnVlIGlmIHBhc3NlZCBhZGRyZXNzIGlzIEdyb3VwIGFkZHJlc3MgZWxzZSBmYWxzZQorICovCisKK3VpbnQ4X3QgbGltX2lzX2dyb3VwX2FkZHIodFNpck1hY0FkZHIgbWFjQWRkcikKK3sKKwlpZiAoKG1hY0FkZHJbMF0gJiAweDAxKSA9PSAweDAxKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30gLyoqKioqKiBlbmQgbGltX2lzX2dyb3VwX2FkZHIoKSAqKioqKiovCisKKy8qKgorICogbGltX3ByaW50X21hY19hZGRyKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcmludCBwYXNzZWQgTUFDIGFkZHJlc3MKKyAqIGluIDogZm9ybWF0LgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogQHBhcmFtICBtYWNBZGRyICAtIE1hY0FkZHIgdG8gYmUgcHJpbnRlZAorICogQHBhcmFtICBsb2dMZXZlbCAtIExvZ2xldmVsIHRvIGJlIHVzZWQKKyAqCisgKiBAcmV0dXJuIE5vbmUuCisgKi8KKwordm9pZCBsaW1fcHJpbnRfbWFjX2FkZHIodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgbWFjQWRkciwgdWludDhfdCBsb2dMZXZlbCkKK3sKKwlsaW1fbG9nKHBNYWMsIGxvZ0xldmVsLCBGTChNQUNfQUREUkVTU19TVFIpLCBNQUNfQUREUl9BUlJBWShtYWNBZGRyKSk7Cit9IC8qKioqKiogZW5kIGxpbV9wcmludF9tYWNfYWRkcigpICoqKioqKi8KKworLyoKKyAqIGxpbV9yZXNldF9kZWZlcnJlZF9tc2dfcSgpCisgKgorICoqKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGRlZmVycmVkIG1lc3NhZ2UgcXVldWUgcGFyYW1ldGVycy4KKyAqCisgKioqUEFSQU1TOgorICogQHBhcmFtIHBNYWMgICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICogTkEKKyAqCisgKioqUkVUVVJOUzoKKyAqIE5vbmUKKyAqLworCit2b2lkIGxpbV9yZXNldF9kZWZlcnJlZF9tc2dfcSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemUgPQorCQlwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS53cml0ZSA9CisJCQlwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5yZWFkID0gMDsKKworfQorCisjZGVmaW5lIExJTV9ERUZFUlJFRF9RX0NIRUNLX1RIUkVTSE9MRCAgKE1BWF9ERUZFUlJFRF9RVUVVRV9MRU4vMikKKyNkZWZpbmUgTElNX01BWF9OVU1fTUdNVF9GUkFNRV9ERUZFUlJFRCAoTUFYX0RFRkVSUkVEX1FVRVVFX0xFTi8yKQorCisvKioKKyAqIGxpbV93cml0ZV9kZWZlcnJlZF9tc2dfcSgpIC0gVGhpcyBmdW5jdGlvbiBxdWV1ZXMgdXAgYSBkZWZlcnJlZCBtZXNzYWdlCisgKgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBsaW1fbXNnOiBhIExJTSBtZXNzYWdlCisgKgorICogRnVuY3Rpb24gcXVldWVzIHVwIGEgZGVmZXJyZWQgbWVzc2FnZSBmb3IgbGF0ZXIgcHJvY2Vzc2luZyBvbiB0aGUKKyAqIFNUQSBzaWRlLgorICoKKyAqIFJldHVybjogbm9uZQorICovCisKK3VpbnQ4X3QgbGltX3dyaXRlX2RlZmVycmVkX21zZ19xKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwU2lyTXNnUSBsaW1fbXNnKQoreworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlF1ZXVlIGEgZGVmZXJyZWQgbWVzc2FnZSAoc2l6ZSAlZCwgd3JpdGUgJWQpIC0gdHlwZSAweCV4ICIpLAorCQltYWNfY3R4LT5saW0uZ0xpbURlZmVycmVkTXNnUS5zaXplLAorCQltYWNfY3R4LT5saW0uZ0xpbURlZmVycmVkTXNnUS53cml0ZSwKKwkJbGltX21zZy0+dHlwZSk7CisKKwkvKiBjaGVjayBpZiB0aGUgZGVmZXJyZWQgbWVzc2FnZSBxdWV1ZSBpcyBmdWxsICovCisJaWYgKG1hY19jdHgtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemUgPj0gTUFYX0RFRkVSUkVEX1FVRVVFX0xFTikgeworCQlpZiAoIShtYWNfY3R4LT5saW0uZGVmZXJyZWRNc2dDbnQgJiAweEYpKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoInF1ZXVlLT5Nc2dRIGZ1bGwgTXNnOiVkIE1zZ3MgRmFpbGVkOiVkIiksCisJCQkJbGltX21zZy0+dHlwZSwKKwkJCQkrK21hY19jdHgtPmxpbS5kZWZlcnJlZE1zZ0NudCk7CisJCX0gZWxzZSB7CisJCQltYWNfY3R4LT5saW0uZGVmZXJyZWRNc2dDbnQrKzsKKwkJfQorCQlyZXR1cm4gVFhfUVVFVUVfRlVMTDsKKwl9CisKKwkvKgorCSAqIEluIHRoZSBhcHBsaWNhdGlvbiwgdGhlcmUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gMSBtZXNzYWdlIGdldAorCSAqIHF1ZXVlZCB1cC4gSWYgaGFwcGVucywgZmxhZ3MgYSB3YXJuaW5nLiBJbiB0aGUgZnV0dXJlLCB0aGlzIGNhbgorCSAqIGhhcHBlbi4KKwkgKi8KKwlpZiAobWFjX2N0eC0+bGltLmdMaW1EZWZlcnJlZE1zZ1Euc2l6ZSA+IDApCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCIlZCBEZWZlcnJlZCBNc2cgKHR5cGUgMHgleCwgc2NhbiAlZCwgZ2xvYmFsIHNtZSAlZCwgZ2xvYmFsIG1sbWUgJWQsIGFkZHRzICVkKSIpLAorCQkJbWFjX2N0eC0+bGltLmdMaW1EZWZlcnJlZE1zZ1Euc2l6ZSwKKwkJCWxpbV9tc2ctPnR5cGUsCisJCQlsaW1faXNfc3lzdGVtX2luX3NjYW5fc3RhdGUobWFjX2N0eCksCisJCQltYWNfY3R4LT5saW0uZ0xpbVNtZVN0YXRlLAorCQkJbWFjX2N0eC0+bGltLmdMaW1NbG1TdGF0ZSwKKwkJCW1hY19jdHgtPmxpbS5nTGltQWRkdHNTZW50KTsKKworCS8qCisJICogVG8gcHJldmVudCB0aGUgZGVmZXJyZWQgUSBpcyBmdWxsIG9mIG1hbmFnZW1lbnQgZnJhbWVzLCBvbmx5IGdpdmUKKwkgKiB0aGVtIGNlcnRhaW4gc3BhY2UKKwkgKi8KKwlpZiAoKFNJUl9CQl9YUE9SVF9NR01UX01TRyA9PSBsaW1fbXNnLT50eXBlKSAmJgorCQkoTElNX0RFRkVSUkVEX1FfQ0hFQ0tfVEhSRVNIT0xEIDwKKwkJCW1hY19jdHgtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemUpKSB7CisJCXVpbnQxNl90IGlkeCwgY291bnQgPSAwOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG1hY19jdHgtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemU7CisJCQkJCQkJCWlkeCsrKSB7CisJCQlpZiAoU0lSX0JCX1hQT1JUX01HTVRfTVNHID09CisJCQkJCW1hY19jdHgtPmxpbS5nTGltRGVmZXJyZWRNc2dRLgorCQkJCQkJZGVmZXJyZWRRdWV1ZVtpZHhdLnR5cGUpIHsKKwkJCQljb3VudCsrOworCQkJfQorCQl9CisJCWlmIChMSU1fTUFYX05VTV9NR01UX0ZSQU1FX0RFRkVSUkVEIDwgY291bnQpIHsKKwkJCS8qCisJCQkgKiBXZSByZWFjaCB0aGUgcXVvdGEgZm9yIG1hbmFnZW1lbnQgZnJhbWVzLAorCQkJICogZHJvcCB0aGlzIG9uZQorCQkJICovCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoIlRvbyBtYW55IHF1ZXVlLT5Nc2dRIE1zZzogJWQgKGNvdW50PSVkKSIpLAorCQkJCWxpbV9tc2ctPnR5cGUsIGNvdW50KTsKKwkJCS8qIFJldHVybiBlcnJvciwgY2FsbGVyIGtub3dzIHdoYXQgdG8gZG8gKi8KKwkJCXJldHVybiBUWF9RVUVVRV9GVUxMOworCQl9CisJfQorCisJKyttYWNfY3R4LT5saW0uZ0xpbURlZmVycmVkTXNnUS5zaXplOworCisJLyogcmVzZXQgdGhlIGNvdW50IGhlcmUgc2luY2Ugd2UgYXJlIGFibGUgdG8gZGVmZXIgdGhlIG1lc3NhZ2UgKi8KKwlpZiAobWFjX2N0eC0+bGltLmRlZmVycmVkTXNnQ250ICE9IDApCisJCW1hY19jdHgtPmxpbS5kZWZlcnJlZE1zZ0NudCA9IDA7CisKKwkvKiBpZiB0aGUgd3JpdGUgcG9pbnRlciBoaXRzIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLCByZXdpbmQgaXQgKi8KKwlpZiAobWFjX2N0eC0+bGltLmdMaW1EZWZlcnJlZE1zZ1Eud3JpdGUgPj0gTUFYX0RFRkVSUkVEX1FVRVVFX0xFTikKKwkJbWFjX2N0eC0+bGltLmdMaW1EZWZlcnJlZE1zZ1Eud3JpdGUgPSAwOworCisJLyogc2F2ZSB0aGUgbWVzc2FnZSB0byB0aGUgcXVldWUgYW5kIGFkdmFuY2VkIHRoZSB3cml0ZSBwb2ludGVyICovCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZtYWNfY3R4LT5saW0uZ0xpbURlZmVycmVkTXNnUS4KKwkJCWRlZmVycmVkUXVldWVbbWFjX2N0eC0+bGltLmdMaW1EZWZlcnJlZE1zZ1Eud3JpdGUrK10sCisJCQkJKHVpbnQ4X3QgKikgbGltX21zZywgc2l6ZW9mKHRTaXJNc2dRKSk7CisJcmV0dXJuIFRYX1NVQ0NFU1M7CisKK30KKworLyoKKyAqIGxpbV9yZWFkX2RlZmVycmVkX21zZ19xKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGRlcXVldWVzIGEgZGVmZXJyZWQgbWVzc2FnZSBmb3IgcHJvY2Vzc2luZyBvbiB0aGUKKyAqIFNUQSBzaWRlLgorICoKKyAqKipQQVJBTVM6CisgKiBAcGFyYW0gcE1hYyAgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICoqKk5PVEU6CisgKgorICoKKyAqKipSRVRVUk5TOgorICogUmV0dXJucyB0aGUgbWVzc2FnZSBhdCB0aGUgaGVhZCBvZiB0aGUgZGVmZXJyZWQgbWVzc2FnZSBxdWV1ZQorICovCisKK3RTaXJNc2dRICpsaW1fcmVhZF9kZWZlcnJlZF9tc2dfcSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRTaXJNc2dRICptc2c7CisKKwkvKgorCSoqIGNoZWNrIGFueSBtZXNzYWdlcyBsZWZ0LiBJZiBubywgcmV0dXJuCisJKiovCisJaWYgKHBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemUgPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSoqIGRlY3JlbWVudCB0aGUgcXVldWUgc2l6ZQorCSoqLworCXBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemUtLTsKKworCS8qCisJKiogcmV0cmlldmUgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgaGVhZCBvZiB0aGUgcXVldWUKKwkqKi8KKwltc2cgPQorCQkmcE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1EuZGVmZXJyZWRRdWV1ZVtwTWFjLT5saW0uCisJCQkJCQkJICBnTGltRGVmZXJyZWRNc2dRLnJlYWRdOworCisJLyoKKwkqKiBhZHZhbmNlIHRoZSByZWFkIHBvaW50ZXIKKwkqKi8KKwlwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5yZWFkKys7CisKKwkvKgorCSoqIGlmIHRoZSByZWFkIHBvaW50ZXIgaGl0cyB0aGUgZW5kIG9mIHRoZSBxdWV1ZSwgcmV3aW5kIGl0CisJKiovCisJaWYgKHBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnJlYWQgPj0gTUFYX0RFRkVSUkVEX1FVRVVFX0xFTikKKwkJcE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1EucmVhZCA9IDA7CisKKwlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLAorCQkgICAgICAgRkwKKwkJCSAgICAgICAoIioqICBEZVF1ZXVlIGEgZGVmZXJyZWQgbWVzc2FnZSAoc2l6ZSAlZCByZWFkICVkKSAtIHR5cGUgMHgleCAgKioiKSwKKwkJICAgICAgIHBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemUsCisJCSAgICAgICBwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5yZWFkLCBtc2ctPnR5cGUpOworCSAgICAgICApCisKKwlQRUxPRzEobGltX2xvZworCQkgICAgICAgKHBNYWMsIExPRzEsCisJCSAgICAgICBGTAorCQkJICAgICAgICgiRFEgbXNnIC0tIHNjYW4gJWQsIGdsb2JhbCBzbWUgJWQsIGdsb2JhbCBtbG1lICVkLCBhZGR0cyAlZCIpLAorCQkgICAgICAgbGltX2lzX3N5c3RlbV9pbl9zY2FuX3N0YXRlKHBNYWMpLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlLAorCQkgICAgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSwgcE1hYy0+bGltLmdMaW1BZGR0c1NlbnQpOworCSAgICAgICApCisKKwlyZXR1cm4gbXNnOworfQorCit0U2lyUmV0U3RhdHVzCitsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKnBNc2csIHVpbnQ4X3QgcVR5cGUpCit7CisJLyogRklYTUUgKi8KKwlzeXNfcHJvY2Vzc19tbWhfbXNnKHBNYWMsIHBNc2cpOworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBsaW1faGFuZGxlX3VwZGF0ZV9vbGJjX2NhY2hlKCkgLSBUaGlzIGZ1bmN0aW9uIHVwZGF0ZSBvbGJjIGNhY2hlCisgKgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBGdW5jdGlvbiB1cGRhdGVzIG9sYmMgY2FjaGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBsaW1faGFuZGxlX3VwZGF0ZV9vbGJjX2NhY2hlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJaW50IGk7CisJc3RhdGljIGludCBlbmFibGU7CisJdFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25QYXJhbXM7CisKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gbGltX2lzX2FwX3Nlc3Npb25fYWN0aXZlKG1hY19jdHgpOworCisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCIgU2Vzc2lvbiBub3QgZm91bmQiKSk7CisJCXJldHVybjsKKwl9CisKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmYmVhY29uUGFyYW1zLCBzaXplb2YodFVwZGF0ZUJlYWNvblBhcmFtcyksIDApOworCWJlYWNvblBhcmFtcy5ic3NJZHggPSBwc2Vzc2lvbkVudHJ5LT5ic3NJZHg7CisKKwliZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXAgPSAwOworCS8qCisJICogVGhpcyBpcyBkb2luZyBhIDIgcGFzcyBjaGVjay4gVGhlIGZpcnN0IHBhc3MgaXMgdG8gaW52YWxpZGF0ZQorCSAqIGFsbCB0aGUgY2FjaGUgZW50cmllcy4gVGhlIHNlY29uZCBwYXNzIGlzIHRvIGRlY2lkZSB3aGV0aGVyIHRvCisJICogZGlzYWJsZSBwcm90ZWN0aW9uLgorCSAqLworCWlmICghZW5hYmxlKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMiwgRkwoIlJlc2V0dGluZyBPTEJDIGNhY2hlIikpOworCQlwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5udW1TdGEgPSAwOworCQlwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5udW1TdGEgPSAwOworCQlwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcEh0MjBQYXJhbXMubnVtU3RhID0gMDsKKwkJcHNlc3Npb25FbnRyeS0+Z0xpbU5vbkdmUGFyYW1zLm51bVN0YSA9IDA7CisJCXBzZXNzaW9uRW50cnktPmdMaW1Mc2lnVHhvcFBhcmFtcy5udW1TdGEgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfT1ZFUkxBUF9DQUNIRV9TSVpFOyBpKyspCisJCQltYWNfY3R4LT5saW0ucHJvdFN0YU92ZXJsYXBDYWNoZVtpXS5hY3RpdmUgPSBmYWxzZTsKKworCQllbmFibGUgPSAxOworCX0gZWxzZSB7CisJCWlmICgoIXBzZXNzaW9uRW50cnktPmdMaW1PbGJjUGFyYW1zLm51bVN0YSkgJiYKKwkJCShwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkgJiYKKwkJCSghcHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgiT3ZlcmxhcCBjYWNoZSBjbGVhciBhbmQgbm8gMTFCIFNUQSBzZXQiKSk7CisJCQlsaW1fZW5hYmxlMTFnX3Byb3RlY3Rpb24obWFjX2N0eCwgZmFsc2UsIHRydWUsCisJCQkJCQkmYmVhY29uUGFyYW1zLAorCQkJCQkJcHNlc3Npb25FbnRyeSk7CisJCX0KKworCQlpZiAoKCFwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5udW1TdGEpICYmCisJCQkocHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisJCQkmJiAoIXBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkJRkwoIk92ZXJsYXAgY2FjaGUgY2xlYXIgYW5kIG5vIDExRyBTVEEgc2V0IikpOworCQkJbGltX2VuYWJsZV9odF9wcm90ZWN0aW9uX2Zyb20xMWcobWFjX2N0eCwgZmFsc2UsIHRydWUsCisJCQkJCQkJJmJlYWNvblBhcmFtcywKKwkJCQkJCQlwc2Vzc2lvbkVudHJ5KTsKKwkJfQorCisJCWlmICgoIXBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwSHQyMFBhcmFtcy5udW1TdGEpICYmCisJCQkocHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorCQkJJiYgKCFwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgiT3ZlcmxhcCBjYWNoZSBjbGVhciBhbmQgbm8gSFQyMCBTVEEgc2V0IikpOworCQkJbGltX2VuYWJsZTExZ19wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLCB0cnVlLAorCQkJCQkJJmJlYWNvblBhcmFtcywKKwkJCQkJCXBzZXNzaW9uRW50cnkpOworCQl9CisKKwkJZW5hYmxlID0gMDsKKwl9CisKKwlpZiAoKGZhbHNlID09IG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLmlzX2Rmc19jYWNfdGltZXJfcnVubmluZykKKwkJCQkJJiYgYmVhY29uUGFyYW1zLnBhcmFtQ2hhbmdlQml0bWFwKSB7CisJCXNjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyhtYWNfY3R4LCBwc2Vzc2lvbkVudHJ5KTsKKwkJbGltX3NlbmRfYmVhY29uX3BhcmFtcyhtYWNfY3R4LCAmYmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKwl9CisJLyogU3RhcnQgT0xCQyB0aW1lciAqLworCWlmICh0eF90aW1lcl9hY3RpdmF0ZSgmbWFjX2N0eC0+bGltLmxpbVRpbWVycy5nTGltVXBkYXRlT2xiY0NhY2hlVGltZXIpCisJCQkJCQkhPSBUWF9TVUNDRVNTKQorCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJ0eF90aW1lcl9hY3RpdmF0ZSBmYWlsZWQiKSk7Cit9CisKKy8qKgorICogbGltX2lzX251bGxfc3NpZCgpIC0gVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgc3NpZCBzdXBwbGllZCBpcyBOdWxsIFNTSUQKKyAqIEBzc2lkOiBwb2ludGVyIHRvIHRTaXJNYWNTU2lkCisgKgorICogRnVuY3Rpb24gY2hlY2tzIGlmIHNzaWQgc3VwcGxpZWQgaXMgTnVsbCBTU0lECisgKgorICogUmV0dXJuOiBub25lCisgKi8KKwordWludDhfdCBsaW1faXNfbnVsbF9zc2lkKHRTaXJNYWNTU2lkICpzc2lkKQoreworCXVpbnQ4X3QgZm51bGxfc3NpZCA9IGZhbHNlOworCXVpbnQzMl90IHNzaWRfbGVuOworCXVpbnQ4X3QgKnNzaWRfc3RyOworCisJaWYgKDAgPT0gc3NpZC0+bGVuZ3RoKSB7CisJCWZudWxsX3NzaWQgPSB0cnVlOworCQlyZXR1cm4gZm51bGxfc3NpZDsKKwl9CisJLyogSWYgdGhlIGZpcnN0IGNoYXJhY3RlcyBpcyBzcGFjZSwgdGhlbiBjaGVjayBpZiBhbGwKKwkgKiBjaGFyYWN0ZXJzIGluIFNTSUQgYXJlIHNwYWNlcyB0byBjb25zaWRlciBpdCBhcyBOVUxMIFNTSUQKKwkgKi8KKwlpZiAoKEFTQ0lJX1NQQUNFX0NIQVJBQ1RFUiA9PSBzc2lkLT5zc0lkWzBdKSAmJgorCQkoc3NpZC0+bGVuZ3RoID09IDEpKXsKKwkJCWZudWxsX3NzaWQgPSB0cnVlOworCQkJcmV0dXJuIGZudWxsX3NzaWQ7CisJfSBlbHNlIHsKKwkJLyogY2hlY2sgaWYgYWxsIHRoZSBjaGFyYWN0ZXMgaW4gU1NJRCBhcmUgTlVMTCAqLworCQlzc2lkX2xlbiA9IHNzaWQtPmxlbmd0aDsKKwkJc3NpZF9zdHIgPSBzc2lkLT5zc0lkOworCisJCXdoaWxlIChzc2lkX2xlbikgeworCQkJaWYgKCpzc2lkX3N0cikKKwkJCQlyZXR1cm4gZm51bGxfc3NpZDsKKworCQkJc3NpZF9zdHIrKzsKKwkJCXNzaWRfbGVuLS07CisJCX0KKworCQlpZiAoMCA9PSBzc2lkX2xlbikgeworCQkJZm51bGxfc3NpZCA9IHRydWU7CisJCQlyZXR1cm4gZm51bGxfc3NpZDsKKwkJfQorCX0KKworCXJldHVybiBmbnVsbF9zc2lkOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIGxpbV91cGRhdGVfcHJvdF9zdGFfcGFyYW1zCisgICBcYnJpZWYgdXBkYXRlcyBwcm90ZWN0aW9uIHJlbGF0ZWQgY291bnRlcnMuCisgICBccGFyYW0gICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCisgICBccGFyYW0gICAgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkcgorICAgXHBhcmFtICAgICAgdExpbVByb3RTdGFDYWNoZVR5cGUgcHJvdFN0YUNhY2hlVHlwZQorICAgXHBhcmFtICAgICAgdEhhbEJpdFZhbCBnZlN1cHBvcnRlZAorICAgXHBhcmFtICAgICAgdEhhbEJpdFZhbCBsc2lnVHhvcFN1cHBvcnRlZAorICAgXHJldHVybiAgICAgIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltX3VwZGF0ZV9wcm90X3N0YV9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLAorCQkJICAgdExpbVByb3RTdGFDYWNoZVR5cGUgcHJvdFN0YUNhY2hlVHlwZSwKKwkJCSAgIHRIYWxCaXRWYWwgZ2ZTdXBwb3J0ZWQsIHRIYWxCaXRWYWwgbHNpZ1R4b3BTdXBwb3J0ZWQsCisJCQkgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQzMl90IGk7CisKKwlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiQSBTVEEgaXMgYXNzb2NpYXRlZDoiKSk7CisJICAgICAgIGxpbV9sb2cocE1hYywgTE9HMSwgRkwoIkFkZHIgOiAiKSk7CisJICAgICAgIGxpbV9wcmludF9tYWNfYWRkcihwTWFjLCBwZWVyTWFjQWRkciwgTE9HMSk7CisJICAgICAgICkKKworCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCWlmIChwc2Vzc2lvbkVudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlKSB7CisJCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiQWRkcjogIikpOykKKwkJCVBFTE9HMShsaW1fcHJpbnRfbWFjX2FkZHIKKwkJCQkgICAgICAgKHBNYWMsIHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hZGRyLAorCQkJCSAgICAgICBMT0cxKTsKKwkJCSAgICAgICApCisKKwkJCWlmIChjZGZfbWVtX2NvbXBhcmUKKwkJCQkgICAgKHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hZGRyLAorCQkJCSAgICBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCQlQRUxPRzEobGltX2xvZworCQkJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkJCSAgICAgICBGTAorCQkJCQkJICAgICAgICgibWF0Y2hpbmcgY2FjaGUgZW50cnkgYXQgJWQgYWxyZWFkeSBhY3RpdmUuIiksCisJCQkJCSAgICAgICBpKTsKKwkJCQkgICAgICAgKQorCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCWlmICghcHNlc3Npb25FbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID49IExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJObyBzcGFjZSBpbiBQcm90U3RhQ2FjaGUiKSk7KQorCQlyZXR1cm47CisJfQorCisJY2RmX21lbV9jb3B5KHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hZGRyLAorCQkgICAgIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCXBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5wcm90U3RhQ2FjaGVUeXBlID0gcHJvdFN0YUNhY2hlVHlwZTsKKwlwc2Vzc2lvbkVudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlID0gdHJ1ZTsKKwlpZiAoZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX2xsQiA9PSBwcm90U3RhQ2FjaGVUeXBlKSB7CisJCXBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMubnVtU3RhKys7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIjExQiwgIikpOworCX0gZWxzZSBpZiAoZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX2xsRyA9PSBwcm90U3RhQ2FjaGVUeXBlKSB7CisJCXBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMubnVtU3RhKys7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIjExRywgIikpOworCX0gZWxzZSBpZiAoZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX0hUMjAgPT0gcHJvdFN0YUNhY2hlVHlwZSkgeworCQlwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5udW1TdGErKzsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiSFQyMCwgIikpOworCX0KKworCWlmICghZ2ZTdXBwb3J0ZWQpIHsKKwkJcHNlc3Npb25FbnRyeS0+Z0xpbU5vbkdmUGFyYW1zLm51bVN0YSsrOworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJOb25HZiwgIikpOworCX0KKwlpZiAoIWxzaWdUeG9wU3VwcG9ydGVkKSB7CisJCXBzZXNzaW9uRW50cnktPmdMaW1Mc2lnVHhvcFBhcmFtcy5udW1TdGErKzsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiIWxzaWdUeG9wU3VwcG9ydGVkIikpOworCX0KK30gLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX2RlY2lkZV9hcF9wcm90ZWN0aW9uCisgICBcYnJpZWYgRGVjaWRlcyBhbGwgdGhlIHByb3RlY3Rpb24gcmVsYXRlZCBzdGFpdG9uIGNvZXhpc3RlbmNlIGFuZCBhbHNvIHNldHMKKyBcICAgICAgICBzaG9ydCBwcmVhbWJsZSBhbmQgc2hvcnQgc2xvdCBhcHByb3ByaWF0ZWx5LiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisgXCAgICAgICAgd2hlbiBBUCBpcyByZWFkeSB0byBzZW5kIGFzc29jUnNwIHRwIHRoZSBzdGF0aW9uIGpvaW5pbmcgcmlnaHQgbm93LgorICAgXHBhcmFtICAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworICAgXHBhcmFtICAgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIKKyAgIFxyZXR1cm4gICAgICBOb25lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQKK2xpbV9kZWNpZGVfYXBfcHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwKKwkJCSB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLAorCQkJIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDE2X3QgdG1wQWlkOworCXRwRHBoSGFzaE5vZGUgcFN0YURzOworCXRTaXJSRkJhbmQgcmZCYW5kID0gU0lSX0JBTkRfVU5LTk9XTjsKKwl1aW50MzJfdCBwaHlNb2RlOworCXRMaW1Qcm90U3RhQ2FjaGVUeXBlIHByb3RTdGFDYWNoZVR5cGUgPQorCQllTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfSU5WQUxJRDsKKwl0SGFsQml0VmFsIGdmU3VwcG9ydGVkID0gZUhBTF9TRVQsIGxzaWdUeG9wU3VwcG9ydGVkID0gZUhBTF9TRVQ7CisKKwlwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCA9IDA7CisJLyogY2hlY2sgd2hldGhlciB0byBlbmFibGUgcHJvdGVjdGlvbiBvciBub3QgKi8KKwlwU3RhRHMgPQorCQlkcGhfbG9va3VwX2hhc2hfZW50cnkocE1hYywgcGVlck1hY0FkZHIsICZ0bXBBaWQsCisJCQkJICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWlmIChOVUxMID09IHBTdGFEcykgeworCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgicFN0YURzIGlzIE5VTEwiKSk7KQorCQlyZXR1cm47CisJfQorCWxpbV9nZXRfcmZfYmFuZF9uZXcocE1hYywgJnJmQmFuZCwgcHNlc3Npb25FbnRyeSk7CisJLyogaWYgd2UgYXJlIGluIDUgR0haIGJhbmQgKi8KKwlpZiAoU0lSX0JBTkRfNV9HSFogPT0gcmZCYW5kKSB7CisJCS8qIFdlIGFyZSAxMU4uIHdlIG5lZWQgdG8gcHJvdGVjdCBmcm9tIDExQSBhbmQgSHQyMC4gd2UgZG9uJ3QgbmVlZCBhbnkgb3RoZXIgcHJvdGVjdGlvbiBpbiA1IEdIWi4gKi8KKwkJLyogSFQyMCBjYXNlIGlzIGNvbW1vbiBiZXR3ZWVuIGJvdGggdGhlIGJhbmRzIGFuZCBoYW5kbGVkIGRvd24gYXMgY29tbW9uIGNvZGUuICovCisJCWlmICh0cnVlID09IHBzZXNzaW9uRW50cnktPmh0Q2FwYWJpbGl0eSkgeworCQkJLyogd2UgYXJlIDExTiBhbmQgMTFBIHN0YXRpb24gaXMgam9pbmluZy4gKi8KKwkJCS8qIHByb3RlY3Rpb24gZnJvbSAxMUEgcmVxdWlyZWQuICovCisJCQlpZiAoZmFsc2UgPT0gcFN0YURzLT5tbG1TdGFDb250ZXh0Lmh0Q2FwYWJpbGl0eSkgeworCQkJCWxpbV91cGRhdGVfMTFhX3Byb3RlY3Rpb24ocE1hYywgdHJ1ZSwgZmFsc2UsCisJCQkJCQkJIHBCZWFjb25QYXJhbXMsCisJCQkJCQkJIHBzZXNzaW9uRW50cnkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoU0lSX0JBTkRfMl80X0dIWiA9PSByZkJhbmQpIHsKKwkJbGltX2dldF9waHlfbW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKwkJLyogV2UgYXJlIDExRy4gQ2hlY2sgaWYgd2UgbmVlZCBwcm90ZWN0aW9uIGZyb20gMTFiIFN0YXRpb25zLiAqLworCQlpZiAoKHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpICYmCisJCSAgICAoZmFsc2UgPT0gcHNlc3Npb25FbnRyeS0+aHRDYXBhYmlsaXR5KSkgeworCisJCQlpZiAocFN0YURzLT5lcnBFbmFibGVkID09IGVIQUxfQ0xFQVIpIHsKKwkJCQlwcm90U3RhQ2FjaGVUeXBlID0gZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX2xsQjsKKwkJCQkvKiBlbmFibGUgcHJvdGVjdGlvbiAqLworCQkJCVBFTE9HMyhsaW1fbG9nCisJCQkJCSAgICAgICAocE1hYywgTE9HMywKKwkJCQkJICAgICAgIEZMKCJFbmFibGluZyBwcm90ZWN0aW9uIGZyb20gMTFCIikpOworCQkJCSAgICAgICApCisJCQkJbGltX2VuYWJsZTExZ19wcm90ZWN0aW9uKHBNYWMsIHRydWUsIGZhbHNlLAorCQkJCQkJCSBwQmVhY29uUGFyYW1zLAorCQkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKwkJCX0KKwkJfQorCQkvKiBIVCBzdGF0aW9uLiAqLworCQlpZiAodHJ1ZSA9PSBwc2Vzc2lvbkVudHJ5LT5odENhcGFiaWxpdHkpIHsKKwkJCS8qIGNoZWNrIGlmIHdlIG5lZWQgcHJvdGVjdGlvbiBmcm9tIDExYiBzdGF0aW9uICovCisJCQlpZiAoKHBTdGFEcy0+ZXJwRW5hYmxlZCA9PSBlSEFMX0NMRUFSKSAmJgorCQkJICAgICghcFN0YURzLT5tbG1TdGFDb250ZXh0Lmh0Q2FwYWJpbGl0eSkpIHsKKwkJCQlwcm90U3RhQ2FjaGVUeXBlID0gZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX2xsQjsKKwkJCQkvKiBlbmFibGUgcHJvdGVjdGlvbiAqLworCQkJCVBFTE9HMyhsaW1fbG9nCisJCQkJCSAgICAgICAocE1hYywgTE9HMywKKwkJCQkJICAgICAgIEZMKCJFbmFibGluZyBwcm90ZWN0aW9uIGZyb20gMTFCIikpOworCQkJCSAgICAgICApCisJCQkJbGltX2VuYWJsZTExZ19wcm90ZWN0aW9uKHBNYWMsIHRydWUsIGZhbHNlLAorCQkJCQkJCSBwQmVhY29uUGFyYW1zLAorCQkJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKwkJCX0KKwkJCS8qIHN0YXRpb24gYmVpbmcgam9pbmVkIGlzIG5vbi0xMWIgYW5kIG5vbi1odCA9PT4gMTFnIGRldmljZSAqLworCQkJZWxzZSBpZiAoIXBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpIHsKKwkJCQlwcm90U3RhQ2FjaGVUeXBlID0gZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX2xsRzsKKwkJCQkvKiBlbmFibGUgcHJvdGVjdGlvbiAqLworCQkJCWxpbV9lbmFibGVfaHRfcHJvdGVjdGlvbl9mcm9tMTFnKHBNYWMsIHRydWUsIGZhbHNlLAorCQkJCQkJCQkgcEJlYWNvblBhcmFtcywKKwkJCQkJCQkJIHBzZXNzaW9uRW50cnkpOworCQkJfQorCQkJLyogRVJQIG1vZGUgaXMgZW5hYmxlZCBmb3IgdGhlIGxhdGVzdCBzdGF0aW9uIGpvaW5lZCAqLworCQkJLyogbGF0ZXN0IHN0YXRpb24gam9pbmVkIGlzIEhUIGNhcGFibGUgKi8KKwkJCS8qIFRoaXMgY2FzZSBpcyBiZWluZyBoYW5kbGVkIGluIGNvbW1vbiBjb2RlIChjb21tbiBiZXR3ZWVuIGJvdGggdGhlIGJhbmRzKSBiZWxvdy4gKi8KKwkJfQorCX0KKwkvKiB3ZSBhcmUgSFQgYW5kIEhUIHN0YXRpb24gaXMgam9pbmluZy4gVGhpcyBjb2RlIGlzIGNvbW1vbiBmb3IgYm90aCB0aGUgYmFuZHMuICovCisJaWYgKCh0cnVlID09IHBzZXNzaW9uRW50cnktPmh0Q2FwYWJpbGl0eSkgJiYKKwkgICAgKHRydWUgPT0gcFN0YURzLT5tbG1TdGFDb250ZXh0Lmh0Q2FwYWJpbGl0eSkpIHsKKwkJaWYgKCFwU3RhRHMtPmh0R3JlZW5maWVsZCkgeworCQkJbGltX2VuYWJsZV9odF9ub25fZ2ZfcHJvdGVjdGlvbihwTWFjLCB0cnVlLCBmYWxzZSwKKwkJCQkJCQlwQmVhY29uUGFyYW1zLAorCQkJCQkJCXBzZXNzaW9uRW50cnkpOworCQkJZ2ZTdXBwb3J0ZWQgPSBlSEFMX0NMRUFSOworCQl9CisJCS8qIFN0YXRpb24gam9pbmluZyBpcyBIVCAyME1oeiAqLworCQlpZiAoKGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaID09CisJCXBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpICYmCisJCShlSFRfQ0hBTk5FTF9XSURUSF8yME1IWiAhPQorCQkgcHNlc3Npb25FbnRyeS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpKXsKKwkJCXByb3RTdGFDYWNoZVR5cGUgPSBlTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfSFQyMDsKKwkJCWxpbV9lbmFibGVfaHQyMF9wcm90ZWN0aW9uKHBNYWMsIHRydWUsIGZhbHNlLAorCQkJCQkJICAgcEJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisJCX0KKwkJLyogU3RhdGlvbiBqb2luaW5nIGRvZXMgbm90IHN1cHBvcnQgTFNJRyBUWE9QIFByb3RlY3Rpb24gKi8KKwkJaWYgKCFwU3RhRHMtPmh0THNpZ1RYT1BQcm90ZWN0aW9uKSB7CisJCQlsaW1fZW5hYmxlX2h0X2xzaWdfdHhvcF9wcm90ZWN0aW9uKHBNYWMsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCQkgICBwQmVhY29uUGFyYW1zLAorCQkJCQkJCSAgIHBzZXNzaW9uRW50cnkpOworCQkJbHNpZ1R4b3BTdXBwb3J0ZWQgPSBlSEFMX0NMRUFSOworCQl9CisJfQorCisJbGltX3VwZGF0ZV9wcm90X3N0YV9wYXJhbXMocE1hYywgcGVlck1hY0FkZHIsIHByb3RTdGFDYWNoZVR5cGUsCisJCQkJICAgZ2ZTdXBwb3J0ZWQsIGxzaWdUeG9wU3VwcG9ydGVkLCBwc2Vzc2lvbkVudHJ5KTsKKworCXJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fZW5hYmxlX292ZXJsYXAxMWdfcHJvdGVjdGlvbgorICAgXGJyaWVmIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHNldHRpbmcgb3ZlcmxhcCAxMWcgcHJvdGVjdGlvbi4KKyAgIFxwYXJhbSAgICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKKyAgIFxwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKKyAgIFxwYXJhbSAgICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgIHBNaAorICAgXHJldHVybiAgICAgIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltX2VuYWJsZV9vdmVybGFwMTFnX3Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywKKwkJCQkgdHBTaXJNYWNNZ210SGRyIHBNaCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlsaW1fdXBkYXRlX292ZXJsYXBfc3RhX3BhcmFtKHBNYWMsIHBNaC0+YnNzSWQsCisJCQkJICAgICAmKHBzZXNzaW9uRW50cnktPmdMaW1PbGJjUGFyYW1zKSk7CisKKwlpZiAocHNlc3Npb25FbnRyeS0+Z0xpbU9sYmNQYXJhbXMubnVtU3RhICYmCisJICAgICFwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkgeworCQkvKiBlbmFibGUgcHJvdGVjdGlvbiAqLworCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiT0xCQyBoYXBwZW5zISEhIikpOykKKwkJbGltX2VuYWJsZTExZ19wcm90ZWN0aW9uKHBNYWMsIHRydWUsIHRydWUsIHBCZWFjb25QYXJhbXMsCisJCQkJCSBwc2Vzc2lvbkVudHJ5KTsKKwl9Cit9CisKKy8qKgorICogbGltX3VwZGF0ZV9zaG9ydF9wcmVhbWJsZSgpIC0gVGhpcyBmdW5jdGlvbiBVcGRhdGVzIHNob3J0IHByZWFtYmxlCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBlZXJfbWFjX2FkZHI6IHBvaW50ZXIgdG8gdFNpck1hY0FkZHIKKyAqIEBwYmVhY29ucGFyYW1zOiBwb2ludGVyIHRvIHRwVXBkYXRlQmVhY29uUGFyYW1zCisgKiBAcHNlc3Npb25fZW50cnk6IHBvaW50ZXIgdG8gdHBQRVNlc3Npb24KKyAqCisgKiBGdW5jdGlvbiBVcGRhdGVzIHNob3J0IHByZWFtYmxlIGlmIG5lZWRlZCB3aGVuIGEgbmV3IHN0YXRpb24gam9pbnMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZAorbGltX3VwZGF0ZV9zaG9ydF9wcmVhbWJsZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U2lyTWFjQWRkciBwZWVyX21hY19hZGRyLAorCQkJCXRwVXBkYXRlQmVhY29uUGFyYW1zIGJlYWNvbnBhcmFtcywKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbl9lbnRyeSkKK3sKKwl1aW50MTZfdCBhaWQ7CisJdHBEcGhIYXNoTm9kZSBzdGFfZHM7CisJdWludDMyX3QgcGh5X21vZGU7CisJdWludDE2X3QgaTsKKworCS8qIGNoZWNrIHdoZXRoZXIgdG8gZW5hYmxlIHByb3RlY3Rpb24gb3Igbm90ICovCisJc3RhX2RzID0KKwkJZHBoX2xvb2t1cF9oYXNoX2VudHJ5KG1hY19jdHgsIHBlZXJfbWFjX2FkZHIsICZhaWQsCisJCQkJICAgICAgJnBzZXNzaW9uX2VudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworCWxpbV9nZXRfcGh5X21vZGUobWFjX2N0eCwgJnBoeV9tb2RlLCBwc2Vzc2lvbl9lbnRyeSk7CisKKwlpZiAoc3RhX2RzID09IE5VTEwgfHwgcGh5X21vZGUgIT0gV05JX0NGR19QSFlfTU9ERV8xMUcpCisJCXJldHVybjsKKworCWlmIChzdGFfZHMtPnNob3J0UHJlYW1ibGVFbmFibGVkICE9IGVIQUxfQ0xFQVIpCisJCXJldHVybjsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlNob3J0IFByZWFtYmxlIGlzIG5vdCBlbmFibGVkIGluIEFzc29jIFJlcSBmcm9tICIpKTsKKworCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCBwZWVyX21hY19hZGRyLCBMT0cxKTsKKworCWZvciAoaSA9IDA7IGkgPCBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKSB7CisJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbl9lbnRyeSkgJiYKKwkJCShwc2Vzc2lvbl9lbnRyeS0+Z0xpbU5vU2hvcnRQYXJhbXMuCisJCQkJc3RhTm9TaG9ydENhY2hlW2ldLmFjdGl2ZSkgJiYKKwkJCShjZGZfbWVtX2NvbXBhcmUKKwkJCQkocHNlc3Npb25fZW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLgorCQkJCXN0YU5vU2hvcnRDYWNoZVtpXS5hZGRyLAorCQkJCXBlZXJfbWFjX2FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpKSkKKwkJCXJldHVybjsKKwkJZWxzZSBpZiAoIUxJTV9JU19BUF9ST0xFKHBzZXNzaW9uX2VudHJ5KSAmJgorCQkJCShtYWNfY3R4LT5saW0uZ0xpbU5vU2hvcnRQYXJhbXMuCisJCQkJCXN0YU5vU2hvcnRDYWNoZVtpXS5hY3RpdmUpICYmCisJCQkoY2RmX21lbV9jb21wYXJlKG1hY19jdHgtPmxpbS5nTGltTm9TaG9ydFBhcmFtcy4KKwkJCQlzdGFOb1Nob3J0Q2FjaGVbaV0uYWRkciwKKwkJCQlwZWVyX21hY19hZGRyLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpKSkKKwkJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykgeworCQlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25fZW50cnkpICYmCisJCQkhcHNlc3Npb25fZW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLgorCQkJCXN0YU5vU2hvcnRDYWNoZVtpXS5hY3RpdmUpCisJCQlicmVhazsKKwkJZWxzZSBpZiAoIW1hY19jdHgtPmxpbS5nTGltTm9TaG9ydFBhcmFtcy4KKwkJCQlzdGFOb1Nob3J0Q2FjaGVbaV0uYWN0aXZlKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPj0gTElNX1BST1RfU1RBX0NBQ0hFX1NJWkUpIHsKKwkJdExpbU5vU2hvcnRQYXJhbXMgKmxpbV9wYXJhbXMgPQorCQkJCSZwc2Vzc2lvbl9lbnRyeS0+Z0xpbU5vU2hvcnRQYXJhbXM7CisJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbl9lbnRyeSkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiTm8gc3BhY2UgaW4gU2hvcnQgY2FjaGUgKCNhY3RpdmUgJWQsICNzdGEgJWQpIGZvciBzdGEgIiksCisJCQkJaSwKKwkJCQlsaW1fcGFyYW1zLT5udW1Ob25TaG9ydFByZWFtYmxlU3RhKTsKKwkJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCBwZWVyX21hY19hZGRyLCBMT0dFKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiTm8gc3BhY2UgaW4gU2hvcnQgY2FjaGUgKCNhY3RpdmUgJWQsICNzdGEgJWQpIGZvciBzdGEgIiksCisJCQkJaSwKKwkJCQlsaW1fcGFyYW1zLT5udW1Ob25TaG9ydFByZWFtYmxlU3RhKTsKKwkJCWxpbV9wcmludF9tYWNfYWRkcihtYWNfY3R4LCBwZWVyX21hY19hZGRyLCBMT0dFKTsKKwkJCXJldHVybjsKKwkJfQorCisJfQorCisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uX2VudHJ5KSkgeworCQljZGZfbWVtX2NvcHkocHNlc3Npb25fZW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLgorCQkJCXN0YU5vU2hvcnRDYWNoZVtpXS5hZGRyLAorCQkJCXBlZXJfbWFjX2FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwc2Vzc2lvbl9lbnRyeS0+Z0xpbU5vU2hvcnRQYXJhbXMuc3RhTm9TaG9ydENhY2hlW2ldLgorCQkJCQkJCWFjdGl2ZSA9IHRydWU7CisJCXBzZXNzaW9uX2VudHJ5LT5nTGltTm9TaG9ydFBhcmFtcy5udW1Ob25TaG9ydFByZWFtYmxlU3RhKys7CisJfSBlbHNlIHsKKwkJY2RmX21lbV9jb3B5KG1hY19jdHgtPmxpbS5nTGltTm9TaG9ydFBhcmFtcy4KKwkJCQkJc3RhTm9TaG9ydENhY2hlW2ldLmFkZHIsCisJCQkJcGVlcl9tYWNfYWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCW1hY19jdHgtPmxpbS5nTGltTm9TaG9ydFBhcmFtcy5zdGFOb1Nob3J0Q2FjaGVbaV0uYWN0aXZlID0gdHJ1ZTsKKwkJbWFjX2N0eC0+bGltLmdMaW1Ob1Nob3J0UGFyYW1zLm51bU5vblNob3J0UHJlYW1ibGVTdGErKzsKKwl9CisKKwkvKiBlbmFibGUgbG9uZyBwcmVhbWJsZSAqLworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIkRpc2FibGluZyBzaG9ydCBwcmVhbWJsZSIpKTsKKworCWlmIChsaW1fZW5hYmxlX3Nob3J0X3ByZWFtYmxlKG1hY19jdHgsIGZhbHNlLCBiZWFjb25wYXJhbXMsCisJCQkJCXBzZXNzaW9uX2VudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkNhbm5vdCBlbmFibGUgbG9uZyBwcmVhbWJsZSIpKTsKK30KKworLyoqCisgKiBsaW1fdXBkYXRlX3Nob3J0X3Nsb3RfdGltZSgpIC0gVGhpcyBmdW5jdGlvbiBVcGRhdGVzIHNob3J0IHNsb3QgdGltZQorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwZWVyX21hY19hZGRyOiBwb2ludGVyIHRvIHRTaXJNYWNBZGRyCisgKiBAYmVhY29ucGFyYW1zOiBwb2ludGVyIHRvIHRwVXBkYXRlQmVhY29uUGFyYW1zCisgKiBAcHNlc3Npb25fZW50cnk6IHBvaW50ZXIgdG8gdHBQRVNlc3Npb24KKyAqCisgKiBGdW5jdGlvbiBVcGRhdGVzIHNob3J0IHNsb3QgdGltZSBpZiBuZWVkZWQgd2hlbiBhIG5ldyBzdGF0aW9uIGpvaW5zCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQKK2xpbV91cGRhdGVfc2hvcnRfc2xvdF90aW1lKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRTaXJNYWNBZGRyIHBlZXJfbWFjX2FkZHIsCisJCQl0cFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25wYXJhbXMsCisJCQl0cFBFU2Vzc2lvbiBzZXNzaW9uX2VudHJ5KQoreworCXVpbnQxNl90IGFpZDsKKwl0cERwaEhhc2hOb2RlIHN0YV9kczsKKwl1aW50MzJfdCBwaHlfbW9kZTsKKwl1aW50MzJfdCB2YWw7CisJdWludDE2X3QgaTsKKworCS8qIGNoZWNrIHdoZXRoZXIgdG8gZW5hYmxlIHByb3RlY3Rpb24gb3Igbm90ICovCisJc3RhX2RzID0KKwkJZHBoX2xvb2t1cF9oYXNoX2VudHJ5KG1hY19jdHgsIHBlZXJfbWFjX2FkZHIsICZhaWQsCisJCQkJICAgICAgJnNlc3Npb25fZW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCWxpbV9nZXRfcGh5X21vZGUobWFjX2N0eCwgJnBoeV9tb2RlLCBzZXNzaW9uX2VudHJ5KTsKKworCWlmIChzdGFfZHMgPT0gTlVMTCB8fCBwaHlfbW9kZSAhPSBXTklfQ0ZHX1BIWV9NT0RFXzExRykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBPbmx5IGluIGNhc2Ugb2Ygc29mdGFwIGluIDExZyBtb2RlLCBzbG90IHRpbWUgbWlnaHQgY2hhbmdlCisJICogZGVwZW5kaW5nIG9uIHRoZSBTVEEgYmVpbmcgYWRkZWQuIEluIDExYSBjYXNlLCBpdCBzaG91bGQKKwkgKiBiZSBhbHdheXMgMSBhbmQgaW4gMTFiIGNhc2UsIGl0IHNob3VsZCBiZSBhbHdheXMgMC4KKwkgKiBPbmx5IHdoZW4gdGhlIG5ldyBTVEEgaGFzIHNob3J0IHNsb3QgdGltZSBkaXNhYmxlZCwgd2UgbmVlZCB0bworCSAqIGNoYW5nZSBzb2Z0YXAncyBvdmVyYWxsIHNsb3QgdGltZSBzZXR0aW5ncyBlbHNlIHRoZSBkZWZhdWx0IGZvcgorCSAqIHNvZnRhcCBpcyBhbHdheXMgc2hvcnQgc2xvdCBlbmFibGVkLiBXaGVuIHRoZSBsYXN0IGxvbmcgc2xvdCBTVEEKKwkgKiBsZWF2ZXMgc29mdEFQLCB3ZSB0YWtlIGNhcmUgb2YgaXQgaW4gbGltX2RlY2lkZV9zaG9ydF9zbG90CisJICovCisJaWYgKHN0YV9kcy0+c2hvcnRTbG90VGltZUVuYWJsZWQgPT0gZUhBTF9DTEVBUikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiU2hvcnQgU2xvdCBUaW1lIGlzIG5vdCBlbmFibGVkIGluIEFzc29jIFJlcSBmcm9tICIpKTsKKwkJbGltX3ByaW50X21hY19hZGRyKG1hY19jdHgsIHBlZXJfbWFjX2FkZHIsIExPRzEpOworCQlmb3IgKGkgPSAwOyBpIDwgTElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykgeworCQkJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpICYmCisJCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbU5vU2hvcnRTbG90UGFyYW1zLgorCQkJCQlzdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFjdGl2ZSkgeworCQkJCWlmIChjZGZfbWVtX2NvbXBhcmUoCisJCQkJCXNlc3Npb25fZW50cnktPmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy4KKwkJCQkJc3RhTm9TaG9ydFNsb3RDYWNoZVtpXS5hZGRyLAorCQkJCQlwZWVyX21hY19hZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSkKKwkJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICghTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJCQlpZiAobWFjX2N0eC0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy4KKwkJCQkJc3RhTm9TaG9ydFNsb3RDYWNoZVtpXS5hY3RpdmUpIHsKKwkJCQkJaWYgKGNkZl9tZW1fY29tcGFyZShtYWNfY3R4LT5saW0uCisJCQkJCQkJZ0xpbU5vU2hvcnRTbG90UGFyYW1zLgorCQkJCQkJCXN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uCisJCQkJCQkJYWRkciwgcGVlcl9tYWNfYWRkciwKKwkJCQkJCQlzaXplb2YodFNpck1hY0FkZHIpKSkKKwkJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFOyBpKyspIHsKKwkJCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSAmJgorCQkJCSFzZXNzaW9uX2VudHJ5LT5nTGltTm9TaG9ydFNsb3RQYXJhbXMuCisJCQkJCXN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWN0aXZlKQorCQkJCWJyZWFrOworCQkJZWxzZSB7CisJCQkJaWYgKCFtYWNfY3R4LT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLgorCQkJCQlzdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFjdGl2ZSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoaSA+PSBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRSkgeworCQkJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiTm8gc3BhY2UgaW4gU2hvcnRTbG90IGNhY2hlICgjYWN0aXZlICVkLCAjc3RhICVkKSBmb3Igc3RhICIpLAorCQkJCQlpLAorCQkJCQlzZXNzaW9uX2VudHJ5LT5nTGltTm9TaG9ydFNsb3RQYXJhbXMuCisJCQkJCW51bU5vblNob3J0U2xvdFN0YSk7CisJCQkJbGltX3ByaW50X21hY19hZGRyKG1hY19jdHgsIHBlZXJfbWFjX2FkZHIsCisJCQkJCQkJTE9HRSk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJObyBzcGFjZSBpbiBTaG9ydFNsb3QgY2FjaGUgKCNhY3RpdmUgJWQsICNzdGEgJWQpIGZvciBzdGEgIiksCisJCQkJCWksCisJCQkJCW1hY19jdHgtPmxpbS5nTGltTm9TaG9ydFNsb3RQYXJhbXMuCisJCQkJCW51bU5vblNob3J0U2xvdFN0YSk7CisJCQkJbGltX3ByaW50X21hY19hZGRyKG1hY19jdHgsIHBlZXJfbWFjX2FkZHIsCisJCQkJCQkJTE9HRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCQljZGZfbWVtX2NvcHkoc2Vzc2lvbl9lbnRyeS0+Z0xpbU5vU2hvcnRTbG90UGFyYW1zLgorCQkJCQlzdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFkZHIsCisJCQkJCXBlZXJfbWFjX2FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbU5vU2hvcnRTbG90UGFyYW1zLgorCQkJCXN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWN0aXZlID0gdHJ1ZTsKKwkJCXNlc3Npb25fZW50cnktPmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy4KKwkJCQludW1Ob25TaG9ydFNsb3RTdGErKzsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fY29weShtYWNfY3R4LT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLgorCQkJCQlzdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFkZHIsCisJCQkJCXBlZXJfbWFjX2FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkJbWFjX2N0eC0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy4KKwkJCQlzdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFjdGl2ZSA9IHRydWU7CisJCQltYWNfY3R4LT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLgorCQkJCW51bU5vblNob3J0U2xvdFN0YSsrOworCQl9CisJCXdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwKKwkJCQlXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRCwKKwkJCQkmdmFsKTsKKwkJLyoKKwkJICogSGVyZSB3ZSBjaGVjayBpZiB3ZSBhcmUgQVAgcm9sZSBhbmQgc2hvcnQgc2xvdCBlbmFibGVkCisJCSAqIChib3RoIGFkbWluIGFuZCBvcGVyIG1vZGVzKSBidXQgd2UgaGF2ZSBhdGxlYXN0IG9uZSBTVEEKKwkJICogY29ubmVjdGVkIHdpdGggb25seSBsb25nIHNsb3QgZW5hYmxlZCwgd2UgbmVlZCB0byBjaGFuZ2UKKwkJICogb3VyIGJlYWNvbi9wYiByc3AgdG8gYnJvYWRjYXN0IHNob3J0IHNsb3QgZGlzYWJsZWQKKwkJICovCisJCWlmICgoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpICYmICh2YWwgJiYKKwkJCXNlc3Npb25fZW50cnktPmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5udW1Ob25TaG9ydFNsb3RTdGEKKwkJCSYmIHNlc3Npb25fZW50cnktPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQpKSB7CisJCQkvKiBlbmFibGUgbG9uZyBzbG90IHRpbWUgKi8KKwkJCWJlYWNvbnBhcmFtcy0+ZlNob3J0U2xvdFRpbWUgPSBmYWxzZTsKKwkJCWJlYWNvbnBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9TSE9SVF9TTE9UX1RJTUVfQ0hBTkdFRDsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgiRGlzYWJsZSBzaG9ydCBzbG90IHRpbWUuIEVuYWJsZSBsb25nIHNsb3QgdGltZS4iKSk7CisJCQkJc2Vzc2lvbl9lbnRyeS0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCA9IGZhbHNlOworCQl9IGVsc2UgaWYgKCFMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSAmJgorCQkJKHZhbCAmJiBtYWNfY3R4LT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLgorCQkJCW51bU5vblNob3J0U2xvdFN0YSAmJgorCQkJCXNlc3Npb25fZW50cnktPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQpKSB7CisJCQkJLyogZW5hYmxlIGxvbmcgc2xvdCB0aW1lICovCisJCQkJYmVhY29ucGFyYW1zLT5mU2hvcnRTbG90VGltZSA9IGZhbHNlOworCQkJCWJlYWNvbnBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQkJUEFSQU1fU0hPUlRfU0xPVF9USU1FX0NIQU5HRUQ7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJCQlGTCgiRGlzYWJsZSBzaG9ydCBzbG90IHRpbWUuIEVuYWJsZSBsb25nIHNsb3QgdGltZS4iKSk7CisJCQkJCXNlc3Npb25fZW50cnktPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQgPQorCQkJCQkJCQkJZmFsc2U7CisJCX0KKwl9Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX2RlY2lkZV9zdGFfcHJvdGVjdGlvbl9vbl9hc3NvYworICAgXGJyaWVmIERlY2lkZSBwcm90ZWN0aW9uIHJlbGF0ZWQgc2V0dGluZ3Mgb24gU3RhIHdoaWxlIGFzc29jaWF0aW9uLgorICAgXHBhcmFtICAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworICAgXHBhcmFtICAgICAgdHBTY2hCZWFjb25TdHJ1Y3QgcEJlYWNvblN0cnVjdAorICAgXHJldHVybiAgICAgIE5vbmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltX2RlY2lkZV9zdGFfcHJvdGVjdGlvbl9vbl9hc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgIHRwU2NoQmVhY29uU3RydWN0IHBCZWFjb25TdHJ1Y3QsCisJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUkZCYW5kIHJmQmFuZCA9IFNJUl9CQU5EX1VOS05PV047CisJdWludDMyX3QgcGh5TW9kZSA9IFdOSV9DRkdfUEhZX01PREVfTk9ORTsKKworCWxpbV9nZXRfcmZfYmFuZF9uZXcocE1hYywgJnJmQmFuZCwgcHNlc3Npb25FbnRyeSk7CisJbGltX2dldF9waHlfbW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKwlpZiAoU0lSX0JBTkRfNV9HSFogPT0gcmZCYW5kKSB7CisJCWlmICgoZVNJUl9IVF9PUF9NT0RFX01JWEVEID09IHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5vcE1vZGUpIHx8CisJCSAgICAoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZID09CisJCSAgICAgcEJlYWNvblN0cnVjdC0+SFRJbmZvLm9wTW9kZSkpIHsKKwkJCWlmIChwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5mcm9tbGxhKQorCQkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGFDb2V4aXN0ID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUID09CisJCQkgICBwQmVhY29uU3RydWN0LT5IVEluZm8ub3BNb2RlKSB7CisJCQlpZiAocE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24uaHQyMCkKKwkJCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuaHQyMENvZXhpc3QgPSB0cnVlOworCQl9CisKKwl9IGVsc2UgaWYgKFNJUl9CQU5EXzJfNF9HSFogPT0gcmZCYW5kKSB7CisJCS8qIHNwZWMgNy4zLjIuMTMgKi8KKwkJLyogVXNlUHJvdGVjdGlvbiB3aWxsIGJlIHNldCB3aGVuIG5vbkVSUCBTVEEgaXMgYXNzb2NpYXRlZC4gKi8KKwkJLyogTm9uRVJQUHJlc2VudCBiaXQgd2lsbCBiZSBzZXQgd2hlbjogKi8KKwkJLyogLS1ub25FUlAgU3RhIGlzIGFzc29jaWF0ZWQgT1IgKi8KKwkJLyogLS1ub25FUlAgU3RhIGV4aXN0cyBpbiBvdmVybGFwcGluZyBCU1MgKi8KKwkJLyogd2hlbiB1c2VQcm90ZWN0aW9uIGlzIG5vdCBzZXQgdGhlbiBwcm90ZWN0aW9uIGZyb20gbm9uRVJQIHN0YXRpb25zIGlzIG9wdGlvbmFsLiAqLworCisJCS8qIENGRyBwcm90ZWN0aW9uIGZyb20gMTFiIGlzIGVuYWJsZWQgYW5kICovCisJCS8qIDExQiBkZXZpY2UgaW4gdGhlIEJTUyAqLworCQkvKiBUT0RPLCBUaGlzIGlzIG5vdCBzZXNzaW9uaXplZCAqLworCQlpZiAocGh5TW9kZSAhPSBXTklfQ0ZHX1BIWV9NT0RFXzExQikgeworCQkJaWYgKHBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmZyb21sbGIgJiYKKwkJCSAgICBwQmVhY29uU3RydWN0LT5lcnBQcmVzZW50ICYmCisJCQkgICAgKHBCZWFjb25TdHJ1Y3QtPmVycElFSW5mby51c2VQcm90ZWN0aW9uIHx8CisJCQkgICAgIHBCZWFjb25TdHJ1Y3QtPmVycElFSW5mby5ub25FcnBQcmVzZW50KSkgeworCQkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0ID0gdHJ1ZTsKKwkJCX0KKwkJCS8qIEFQIGhhcyBubyAxMWIgc3RhdGlvbiBhc3NvY2lhdGVkLiAqLworCQkJZWxzZSB7CisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYkNvZXhpc3QgPSBmYWxzZTsKKwkJCX0KKwkJfQorCQkvKiBmb2xsb3dpbmcgY29kZSBibG9jayBpcyBvbmx5IGZvciBIVCBzdGF0aW9uLiAqLworCQlpZiAoKHBzZXNzaW9uRW50cnktPmh0Q2FwYWJpbGl0eSkgJiYKKwkJICAgIChwQmVhY29uU3RydWN0LT5IVEluZm8ucHJlc2VudCkpIHsKKwkJCXREb3QxMWZJRUhUSW5mbyBodEluZm8gPSBwQmVhY29uU3RydWN0LT5IVEluZm87CisKKwkJCS8qIE9ic3MgTm9uIEhUIFNUQSBwcmVzZW50IG1vZGUgKi8KKwkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5nSFRPYnNzTW9kZSA9CisJCQkJKHVpbnQ4X3QpIGh0SW5mby5vYnNzTm9uSFRTdGFQcmVzZW50OworCisJCQkvKiBDRkcgcHJvdGVjdGlvbiBmcm9tIDExRyBpcyBlbmFibGVkIGFuZCAqLworCQkJLyogb3VyIEFQIGhhcyBhdCBsZWFzdCBvbmUgMTFHIHN0YXRpb24gYXNzb2NpYXRlZC4gKi8KKwkJCWlmIChwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5mcm9tbGxnICYmCisJCQkgICAgKChlU0lSX0hUX09QX01PREVfTUlYRUQgPT0gaHRJbmZvLm9wTW9kZSkgfHwKKwkJCSAgICAgKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSA9PSBodEluZm8ub3BNb2RlKSkKKwkJCSAgICAmJiAoIXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0KSkgeworCQkJCWlmIChwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5mcm9tbGxnKQorCQkJCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxnQ29leGlzdCA9CisJCQkJCQl0cnVlOworCQkJfQorCQkJLyogQVAgaGFzIG9ubHkgSFQgc3RhdGlvbnMgYXNzb2NpYXRlZCBhbmQgYXQgbGVhc3Qgb25lIHN0YXRpb24gaXMgSFQgMjAgKi8KKwkJCS8qIGRpc2FibGUgcHJvdGVjdGlvbiBmcm9tIGFueSBub24tSFQgZGV2aWNlcy4gKi8KKwkJCS8qIGRlY2lzaW9uIGZvciBkaXNhYmxpbmcgcHJvdGVjdGlvbiBmcm9tIDExYiBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGFib3ZlLiAqLworCQkJaWYgKGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQgPT0gaHRJbmZvLm9wTW9kZSkgeworCQkJCS8qIERpc2FibGUgcHJvdGVjdGlvbiBmcm9tIDExRyBzdGF0aW9uLiAqLworCQkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0ID0gZmFsc2U7CisJCQkJLyogQ0ZHIHByb3RlY3Rpb24gZnJvbSBIVCAyMCBpcyBlbmFibGVkLiAqLworCQkJCWlmIChwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5odDIwKQorCQkJCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuCisJCQkJCWh0MjBDb2V4aXN0ID0gdHJ1ZTsKKwkJCX0KKwkJCS8qIERpc2FibGUgcHJvdGVjdGlvbiBmcm9tIG5vbi1IVCBhbmQgSFQyMCBkZXZpY2VzLiAqLworCQkJLyogZGVjaXNpb24gZm9yIGRpc2FibGluZyBwcm90ZWN0aW9uIGZyb20gMTFiIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gYWJvdmUuICovCisJCQlpZiAoZVNJUl9IVF9PUF9NT0RFX1BVUkUgPT0gaHRJbmZvLm9wTW9kZSkgeworCQkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0ID0gZmFsc2U7CisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmh0MjBDb2V4aXN0ID0gZmFsc2U7CisJCQl9CisKKwkJfQorCX0KKwkvKiBwcm90ZWN0aW9uIHJlbGF0ZWQgZmFjdG9ycyBvdGhlciB0aGFuIEhUIG9wZXJhdGluZyBtb2RlLiBBcHBsaWVzIHRvIDIuNCBHSFogYXMgd2VsbCBhcyA1IEdIWi4gKi8KKwlpZiAoKHBzZXNzaW9uRW50cnktPmh0Q2FwYWJpbGl0eSkgJiYgKHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5wcmVzZW50KSkgeworCQl0RG90MTFmSUVIVEluZm8gaHRJbmZvID0gcEJlYWNvblN0cnVjdC0+SFRJbmZvOworCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlID0KKwkJCSh1aW50OF90KSBodEluZm8ucmlmc01vZGU7CisJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QgPQorCQkJKHVpbnQ4X3QpIGh0SW5mby5ub25HRkRldmljZXNQcmVzZW50OworCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0KKwkJCSh1aW50OF90KSBodEluZm8ubHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisJfQorfQorCisKKy8qKgorICogbGltX2RlY2lkZV9zdGFfMTFiZ19wcm90ZWN0aW9uKCkgLSBkZWNpZGVzIHByb3RlY3Rpb24gcmVsYXRlZCBzZXR0aW5ncyBvbiBzdGEKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgKiBAYmVhY29uX3N0cnVjdDogcG9pbnRlciB0byB0cHNjaGJlYWNvbnN0cnVjdAorICogQGJlYWNvbnBhcmFtczogcG9pbnRlciB0byB0cHVwZGF0ZWJlYWNvbnBhcmFtcworICogQHBzZXNzaW9uX2VudHJ5OiBwb2ludGVyIHRvIHRwcGVzZXNzaW9uCisgKiBAcGh5X21vZGU6IHBoeSBtb2RlIGluZGV4CisgKgorICogZGVjaWRlcyAxMWJnIHByb3RlY3Rpb24gcmVsYXRlZCBzZXR0aW5ncyBvbiBzdGEgd2hpbGUgcHJvY2Vzc2luZyBiZWFjb24KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQKK2xpbV9kZWNpZGVfc3RhXzExYmdfcHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJdHBTY2hCZWFjb25TdHJ1Y3QgYmVhY29uX3N0cnVjdCwKKwkJCXRwVXBkYXRlQmVhY29uUGFyYW1zIGJlYWNvbnBhcmFtcywKKwkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uX2VudHJ5LAorCQkJdWludDMyX3QgcGh5X21vZGUpCit7CisKKwl0RG90MTFmSUVIVEluZm8gaHRJbmZvOworCisJLyoKKwkgKiBzcGVjIDcuMy4yLjEzCisJICogVXNlUHJvdGVjdGlvbiB3aWxsIGJlIHNldCB3aGVuIG5vbkVSUCBTVEEgaXMgYXNzb2NpYXRlZC4KKwkgKiBOb25FUlBQcmVzZW50IGJpdCB3aWxsIGJlIHNldCB3aGVuOgorCSAqIC0tbm9uRVJQIFN0YSBpcyBhc3NvY2lhdGVkIE9SCisJICogLS1ub25FUlAgU3RhIGV4aXN0cyBpbiBvdmVybGFwcGluZyBCU1MKKwkgKiB3aGVuIHVzZVByb3RlY3Rpb24gaXMgbm90IHNldCB0aGVuIHByb3RlY3Rpb24gZnJvbQorCSAqIG5vbkVSUCBzdGF0aW9ucyBpcyBvcHRpb25hbC4KKwkgKi8KKwlpZiAocGh5X21vZGUgIT0gV05JX0NGR19QSFlfTU9ERV8xMUIpIHsKKwkJaWYgKGJlYWNvbl9zdHJ1Y3QtPmVycFByZXNlbnQgJiYKKwkJCShiZWFjb25fc3RydWN0LT5lcnBJRUluZm8udXNlUHJvdGVjdGlvbiB8fAorCQkJYmVhY29uX3N0cnVjdC0+ZXJwSUVJbmZvLm5vbkVycFByZXNlbnQpKSB7CisJCQlsaW1fZW5hYmxlMTFnX3Byb3RlY3Rpb24obWFjX2N0eCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQliZWFjb25wYXJhbXMsCisJCQkJCQlwc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwkJLyogQVAgaGFzIG5vIDExYiBzdGF0aW9uIGFzc29jaWF0ZWQuICovCisJCWVsc2UgeworCQkJLyogZGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFiIHN0YXRpb24gKi8KKwkJCWxpbV9lbmFibGUxMWdfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwgZmFsc2UsCisJCQkJCQliZWFjb25wYXJhbXMsCisJCQkJCQlwc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwl9CisKKwlpZiAoIShwc2Vzc2lvbl9lbnRyeS0+aHRDYXBhYmlsaXR5KSB8fAorCQkhKGJlYWNvbl9zdHJ1Y3QtPkhUSW5mby5wcmVzZW50KSkKKwkJcmV0dXJuOworCisJLyogZm9sbG93aW5nIGNvZGUgaXMgb25seSBmb3IgSFQgc3RhdGlvbi4gKi8KKworCWh0SW5mbyA9IGJlYWNvbl9zdHJ1Y3QtPkhUSW5mbzsKKwkvKiBBUCBoYXMgYXQgbGVhc3Qgb25lIDExRyBzdGF0aW9uIGFzc29jaWF0ZWQuICovCisJaWYgKCgoZVNJUl9IVF9PUF9NT0RFX01JWEVEID09IGh0SW5mby5vcE1vZGUpIHx8CisJCShlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgPT0gaHRJbmZvLm9wTW9kZSkpICYmCisJCSghcHNlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0KSkgeworCQlsaW1fZW5hYmxlX2h0X3Byb3RlY3Rpb25fZnJvbTExZyhtYWNfY3R4LCB0cnVlLCBmYWxzZSwKKwkJCQkJCWJlYWNvbnBhcmFtcywgcHNlc3Npb25fZW50cnkpOworCisJfQorCS8qCisJICogbm8gSFQgb3BlcmF0aW5nIG1vZGUgY2hhbmdlICA9PT4gbm8gY2hhbmdlIGluCisJICogcHJvdGVjdGlvbiBzZXR0aW5ncyBleGNlcHQgZm9yIE1JWEVEX01PREUvTGVnYWN5CisJICogTW9kZS4KKwkgKi8KKwkvKgorCSAqIGluIE1peGVkIG1vZGUvbGVnYWN5IE1vZGUgZXZlbiBpZiB0aGVyZSBpcyBubworCSAqIGNoYW5nZSBpbiBIVCBvcGVyYXRpbmcgbW9kZSwgdGhlcmUgbWlnaHQgYmUKKwkgKiBjaGFuZ2UgaW4gMTFiQ29leGlzdCBvciAxMWdDb2V4aXN0LiBIZW5jZSB0aGlzCisJICogY2hlY2sgaXMgYmVpbmcgZG9uZSBhZnRlciBtaXhlZC9sZWdhY3kgbW9kZQorCSAqIGNoZWNrLgorCSAqLworCWlmIChtYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgIT0KKwkJKHRTaXJNYWNIVE9wZXJhdGluZ01vZGUpaHRJbmZvLm9wTW9kZSkgeworCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgPQorCQkJKHRTaXJNYWNIVE9wZXJhdGluZ01vZGUpIGh0SW5mby5vcE1vZGU7CisJCS8qCisJCSAqIEFQIGhhcyBvbmx5IEhUIHN0YXRpb25zIGFzc29jaWF0ZWQgYW5kCisJCSAqIGF0IGxlYXN0IG9uZSBzdGF0aW9uIGlzIEhUIDIwCisJCSAqLworCisJCS8qIGRpc2FibGUgcHJvdGVjdGlvbiBmcm9tIGFueSBub24tSFQgZGV2aWNlcy4gKi8KKworCQkvKgorCQkgKiBkZWNpc2lvbiBmb3IgZGlzYWJsaW5nIHByb3RlY3Rpb24gZnJvbQorCQkgKiAxMWIgaGFzIGFscmVhZHkgYmVlbiB0YWtlbiBhYm92ZS4KKwkJICovCisJCWlmIChlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUID09CisJCQkJaHRJbmZvLm9wTW9kZSkgeworCQkJLyogRGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFHIHN0YXRpb24uICovCisJCQlsaW1fZW5hYmxlX2h0X3Byb3RlY3Rpb25fZnJvbTExZyhtYWNfY3R4LCBmYWxzZSwKKwkJCQkJCWZhbHNlLCBiZWFjb25wYXJhbXMsCisJCQkJCQlwc2Vzc2lvbl9lbnRyeSk7CisKKwkJCWxpbV9lbmFibGVfaHQyMF9wcm90ZWN0aW9uKG1hY19jdHgsIHRydWUsIGZhbHNlLAorCQkJCQkJYmVhY29ucGFyYW1zLAorCQkJCQkJcHNlc3Npb25fZW50cnkpOworCQl9CisJCS8qCisJCSAqIERpc2FibGUgcHJvdGVjdGlvbiBmcm9tIG5vbi1IVCBhbmQKKwkJICogSFQyMCBkZXZpY2VzLgorCQkgKi8KKwkJLyoKKwkJICogZGVjaXNpb24gZm9yIGRpc2FibGluZyBwcm90ZWN0aW9uIGZyb20KKwkJICogMTFiIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gYWJvdmUuCisJCSAqLworCQllbHNlIGlmIChlU0lSX0hUX09QX01PREVfUFVSRSA9PSBodEluZm8ub3BNb2RlKSB7CisJCQlsaW1fZW5hYmxlX2h0X3Byb3RlY3Rpb25fZnJvbTExZyhtYWNfY3R4LCBmYWxzZSwKKwkJCQkJCWZhbHNlLCBiZWFjb25wYXJhbXMsCisJCQkJCQlwc2Vzc2lvbl9lbnRyeSk7CisKKwkJCWxpbV9lbmFibGVfaHQyMF9wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLAorCQkJCQkJZmFsc2UsIGJlYWNvbnBhcmFtcywKKwkJCQkJCXBzZXNzaW9uX2VudHJ5KTsKKworCQl9CisJfQorCit9CisKKy8qKgorICogbGltX2RlY2lkZV9zdGFfcHJvdGVjdGlvbigpIC0gIGRlY2lkZXMgcHJvdGVjdGlvbiByZWxhdGVkIHNldHRpbmdzIG9uIHN0YQorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAqIEBiZWFjb25fc3RydWN0OiBwb2ludGVyIHRvIHRwc2NoYmVhY29uc3RydWN0CisgKiBAYmVhY29ucGFyYW1zOiBwb2ludGVyIHRvIHRwdXBkYXRlYmVhY29ucGFyYW1zCisgKiBAcHNlc3Npb25fZW50cnk6IHBvaW50ZXIgdG8gdHBwZXNlc3Npb24KKyAqCisgKiBkZWNpZGVzIHByb3RlY3Rpb24gcmVsYXRlZCBzZXR0aW5ncyBvbiBzdGEgd2hpbGUgcHJvY2Vzc2luZyBiZWFjb24KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZAorbGltX2RlY2lkZV9zdGFfcHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCXRwU2NoQmVhY29uU3RydWN0IGJlYWNvbl9zdHJ1Y3QsCisJCQkJdHBVcGRhdGVCZWFjb25QYXJhbXMgYmVhY29ucGFyYW1zLAorCQkJCXRwUEVTZXNzaW9uIHBzZXNzaW9uX2VudHJ5KQoreworCisJdFNpclJGQmFuZCByZmJhbmQgPSBTSVJfQkFORF9VTktOT1dOOworCXVpbnQzMl90IHBoeV9tb2RlID0gV05JX0NGR19QSFlfTU9ERV9OT05FOworCisJbGltX2dldF9yZl9iYW5kX25ldyhtYWNfY3R4LCAmcmZiYW5kLCBwc2Vzc2lvbl9lbnRyeSk7CisJbGltX2dldF9waHlfbW9kZShtYWNfY3R4LCAmcGh5X21vZGUsIHBzZXNzaW9uX2VudHJ5KTsKKworCWlmICgoU0lSX0JBTkRfNV9HSFogPT0gcmZiYW5kKSAmJgorCQkvKiB3ZSBhcmUgSFQgY2FwYWJsZS4gKi8KKwkJKHRydWUgPT0gcHNlc3Npb25fZW50cnktPmh0Q2FwYWJpbGl0eSkgJiYKKwkJKGJlYWNvbl9zdHJ1Y3QtPkhUSW5mby5wcmVzZW50KSkgeworCQkvKgorCQkgKiB3ZSBhcmUgSFQgY2FwYWJsZSwgQVAncyBIVCBPUE1vZGUgaXMKKwkJICogbWl4ZWQgLyBvdmVybGFwIGxlZ2FjeSA9PT4gbmVlZCBwcm90ZWN0aW9uCisJCSAqIGZyb20gMTFBLgorCQkgKi8KKwkJaWYgKChlU0lSX0hUX09QX01PREVfTUlYRUQgPT0KKwkJCQliZWFjb25fc3RydWN0LT5IVEluZm8ub3BNb2RlKSB8fAorCQkJKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSA9PQorCQkJCWJlYWNvbl9zdHJ1Y3QtPkhUSW5mby5vcE1vZGUpKSB7CisJCQlsaW1fdXBkYXRlXzExYV9wcm90ZWN0aW9uKG1hY19jdHgsIHRydWUsIGZhbHNlLAorCQkJCQkJYmVhY29ucGFyYW1zLCBwc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwkJLyoKKwkJICogd2UgYXJlIEhUIGNhcGFibGUsIEFQJ3MgSFQgT1BNb2RlIGlzCisJCSAqIEhUMjAgPT0+IGRpc2FibGUgcHJvdGVjdGlvbiBmcm9tIDExQSBpZgorCQkgKiBlbmFibGVkLgorCQkgKi8KKwkJLyogcHJvdGVjdGlvbiBmcm9tIEhUMjAgaWYgbmVlZGVkLiAqLworCQllbHNlIGlmIChlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUID09CisJCQkJCWJlYWNvbl9zdHJ1Y3QtPkhUSW5mby5vcE1vZGUpIHsKKwkJCWxpbV91cGRhdGVfMTFhX3Byb3RlY3Rpb24obWFjX2N0eCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJYmVhY29ucGFyYW1zLCBwc2Vzc2lvbl9lbnRyeSk7CisJCQlsaW1fZW5hYmxlX2h0MjBfcHJvdGVjdGlvbihtYWNfY3R4LCB0cnVlLCBmYWxzZSwKKwkJCQkJCWJlYWNvbnBhcmFtcywgcHNlc3Npb25fZW50cnkpOworCQl9IGVsc2UgaWYgKGVTSVJfSFRfT1BfTU9ERV9QVVJFID09CisJCQkJYmVhY29uX3N0cnVjdC0+SFRJbmZvLm9wTW9kZSkgeworCQkJbGltX3VwZGF0ZV8xMWFfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwgZmFsc2UsCisJCQkJCQliZWFjb25wYXJhbXMsIHBzZXNzaW9uX2VudHJ5KTsKKwkJCWxpbV9lbmFibGVfaHQyMF9wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLAorCQkJCQkJZmFsc2UsIGJlYWNvbnBhcmFtcywKKwkJCQkJCXBzZXNzaW9uX2VudHJ5KTsKKwkJfQorCX0gZWxzZSBpZiAoU0lSX0JBTkRfMl80X0dIWiA9PSByZmJhbmQpIHsKKwkJbGltX2RlY2lkZV9zdGFfMTFiZ19wcm90ZWN0aW9uKG1hY19jdHgsIGJlYWNvbl9zdHJ1Y3QsCisJCQkJCWJlYWNvbnBhcmFtcywgcHNlc3Npb25fZW50cnksIHBoeV9tb2RlKTsKKwl9CisJLyoKKwkgKiBmb2xsb3dpbmcgY29kZSBibG9jayBpcyBvbmx5IGZvciBIVCBzdGF0aW9uLgorCSAqICgyLjQgR0haIGFzIHdlbGwgYXMgNSBHSFopCisJICovCisJaWYgKChwc2Vzc2lvbl9lbnRyeS0+aHRDYXBhYmlsaXR5KSAmJiAoYmVhY29uX3N0cnVjdC0+SFRJbmZvLnByZXNlbnQpKSB7CisJCXREb3QxMWZJRUhUSW5mbyBodEluZm8gPSBiZWFjb25fc3RydWN0LT5IVEluZm87CisJCS8qCisJCSAqIENoZWNrIGZvciBjaGFuZ2VzIGluIHByb3RlY3Rpb24gcmVsYXRlZCBmYWN0b3JzIG90aGVyCisJCSAqIHRoYW4gSFQgb3BlcmF0aW5nIG1vZGUuCisJCSAqLworCQkvKgorCQkgKiBDaGVjayBmb3IgY2hhbmdlcyBpbiBSSUZTIG1vZGUsIG5vbkdGRGV2aWNlc1ByZXNlbnQsCisJCSAqIGxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0LgorCQkgKi8KKwkJaWYgKHBzZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlICE9CisJCQkJKHVpbnQ4X3QpIGh0SW5mby5yaWZzTW9kZSkgeworCQkJYmVhY29ucGFyYW1zLT5mUklGU01vZGUgPQorCQkJCXBzZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlID0KKwkJCQkJCSh1aW50OF90KSBodEluZm8ucmlmc01vZGU7CisJCQliZWFjb25wYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQkJCQlQQVJBTV9SSUZTX01PREVfQ0hBTkdFRDsKKwkJfQorCisJCWlmIChwc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmxsbk5vbkdGQ29leGlzdCAhPQorCQkJCQlodEluZm8ubm9uR0ZEZXZpY2VzUHJlc2VudCkgeworCQkJYmVhY29ucGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgPQorCQkJCXBzZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0ID0KKwkJCQkJKHVpbnQ4X3QpIGh0SW5mby5ub25HRkRldmljZXNQcmVzZW50OworCQkJYmVhY29ucGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PQorCQkJCQlQQVJBTV9OT05fR0ZfREVWSUNFU19QUkVTRU5UX0NIQU5HRUQ7CisJCX0KKworCQlpZiAocHNlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy4KKwkJCWZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCAhPQorCQkJKHVpbnQ4X3QpIGh0SW5mby5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCkgeworCQkJYmVhY29ucGFyYW1zLT5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPQorCQkJCXBzZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMuCisJCQkJCWZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9CisJCQkJCQkodWludDhfdCkgaHRJbmZvLgorCQkJCQkJbHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisJCQliZWFjb25wYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQkJCVBBUkFNX0xTSUdfVFhPUF9GVUxMX1NVUFBPUlRfQ0hBTkdFRDsKKwkJfQorCQkvKgorCQkgKiBGb3IgU3RhdGlvbiBqdXN0IHVwZGF0ZSB0aGUgZ2xvYmFsIGxpbSB2YXJpYWJsZSwKKwkJICogbm8gbmVlZCB0byBzZW5kIG1lc3NhZ2UgdG8gSEFMIHNpbmNlIFN0YXRpb24gYWxyZWFkeQorCQkgKiB0YWtpbmcgY2FyZSBvZiBIVCBPUFIgTW9kZT0wMSwKKwkJICogbWVhbmluZyBBUCBpcyBzZWVpbmcgbGVnYWN5CisJCSAqLworCQkvKiBzdGF0aW9ucyBpbiBvdmVybGFwcGluZyBCU1MuICovCisJCWlmIChwc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmdIVE9ic3NNb2RlICE9CisJCQkJKHVpbnQ4X3QpIGh0SW5mby5vYnNzTm9uSFRTdGFQcmVzZW50KQorCQkJcHNlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy5nSFRPYnNzTW9kZSA9CisJCQkJKHVpbnQ4X3QpIGh0SW5mby5vYnNzTm9uSFRTdGFQcmVzZW50OworCisJfQorfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX2NoYW5uZWxfc3dpdGNoX3RpbWVvdXQoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB3aGVuIENoYW5uZWwgU3dpdGNoIFRpbWVyIGV4cGlyZXMgYXQKKyAqIHRoZSBTVEEuICBOb3csIFNUQSBtdXN0IHN0b3AgdHJhZmZpYywgYW5kIHRoZW4gY2hhbmdlL2Rpc2FibGUKKyAqIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNoYW5uZWwuCisgKgorICoKKyAqKipOT1RFOgorICogQHBhcmFtICBwTWFjICAgICAgICAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbV9wcm9jZXNzX2NoYW5uZWxfc3dpdGNoX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKwl1aW50OF90IGNoYW5uZWw7IC8qIFRoaXMgaXMgcmVjZWl2ZWQgYW5kIHN0b3JlZCBmcm9tIGNoYW5uZWxTd2l0Y2ggQWN0aW9uIGZyYW1lICovCisKKwlwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQocE1hYywKKwkJCXBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUNoYW5uZWxTd2l0Y2hUaW1lci5zZXNzaW9uSWQpOworCWlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlNlc3Npb24gRG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JRCIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCVBFTE9HVyhsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR1csCisJCQkgICAgICAgIkNoYW5uZWwgc3dpdGNoIGNhbiBiZSBkb25lIG9ubHkgaW4gU1RBIHJvbGUsIEN1cnJlbnQgUm9sZSA9ICVkIiwKKwkJCSAgICAgICBHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuOworCX0KKworCWNoYW5uZWwgPSBwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5wcmltYXJ5Q2hhbm5lbDsKKwkvKiBSZXN0b3JlIENoYW5uZWwgU3dpdGNoIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCAqLworCXBzZXNzaW9uRW50cnktPmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaFRpbWVvdXRWYWx1ZSA9IDA7CisKKwkvKiBDaGFubmVsLXN3aXRjaCB0aW1lb3V0IGhhcyBvY2N1cnJlZC4gcmVzZXQgdGhlIHN0YXRlICovCisJcHNlc3Npb25FbnRyeS0+Z0xpbVNwZWNNZ210LmRvdDExaENoYW5Td1N0YXRlID0gZUxJTV8xMUhfQ0hBTlNXX0VORDsKKworCS8qIENoZWNrIGlmIHRoZSBBUCBpcyBzd2l0Y2hpbmcgdG8gYSBjaGFubmVsIHRoYXQgd2Ugc3VwcG9ydC4KKwkgKiBFbHNlLCBqdXN0IGRvbid0IGJvdGhlciB0byBzd2l0Y2guIEluZGljYXRlIEhERCB0byBsb29rIGZvciBhCisJICogYmV0dGVyIEFQIHRvIGFzc29jaWF0ZQorCSAqLworCWlmICghbGltX2lzX2NoYW5uZWxfdmFsaWRfZm9yX2NoYW5uZWxfc3dpdGNoKHBNYWMsIGNoYW5uZWwpKSB7CisJCS8qIFdlIG5lZWQgdG8gcmVzdG9yZSBwcmUtY2hhbm5lbFN3aXRjaCBzdGF0ZSBvbiB0aGUgU1RBICovCisJCWlmIChsaW1fcmVzdG9yZV9wcmVfY2hhbm5lbF9zd2l0Y2hfc3RhdGUocE1hYywgcHNlc3Npb25FbnRyeSkgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiQ291bGQgbm90IHJlc3RvcmUgcHJlLWNoYW5uZWxTd2l0Y2ggKDExaCkgc3RhdGUsIHJlc2V0dGluZyB0aGUgc3lzdGVtIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogSWYgdGhlIGNoYW5uZWwtbGlzdCB0aGF0IEFQIGlzIGFza2luZyB1cyB0byBzd2l0Y2ggaXMgaW52YWxpZCwKKwkJICogdGhlbiB3ZSBjYW5ub3Qgc3dpdGNoIHRoZSBjaGFubmVsLiBKdXN0IGRpc2Fzc29jaWF0ZSBmcm9tIEFQLgorCQkgKiBXZSB3aWxsIGZpbmQgYSBiZXR0ZXIgQVAgISEhCisJCSAqLworCQlsaW1fdGVhcl9kb3duX2xpbmtfd2l0aF9hcChwTWFjLAorCQkJCQkgICBwTWFjLT5saW0ubGltVGltZXJzLgorCQkJCQkgICBnTGltQ2hhbm5lbFN3aXRjaFRpbWVyLnNlc3Npb25JZCwKKwkJCQkJICAgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OKTsKKwkJcmV0dXJuOworCX0KKwlsaW1fY292ZXJ0X2NoYW5uZWxfc2Nhbl90eXBlKHBNYWMsIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwKKwkJCQkgICAgIGZhbHNlKTsKKwlwTWFjLT5saW0uZGZzY2hhbm5lbExpc3QudGltZVN0YW1wW3BzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbF0gPQorCQkwOworCXN3aXRjaCAocHNlc3Npb25FbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUpIHsKKwljYXNlIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9PTkxZOgorCQlQRUxPR1cobGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9PTkxZICIpKTspCisJCWxpbV9zd2l0Y2hfcHJpbWFyeV9jaGFubmVsKHBNYWMsCisJCQkJCSAgIHBzZXNzaW9uRW50cnktPmdMaW1DaGFubmVsU3dpdGNoLgorCQkJCQkgICBwcmltYXJ5Q2hhbm5lbCwgcHNlc3Npb25FbnRyeSk7CisJCXBzZXNzaW9uRW50cnktPmdMaW1DaGFubmVsU3dpdGNoLnN0YXRlID0KKwkJCWVMSU1fQ0hBTk5FTF9TV0lUQ0hfSURMRTsKKwkJYnJlYWs7CisJY2FzZSBlTElNX0NIQU5ORUxfU1dJVENIX1BSSU1BUllfQU5EX1NFQ09OREFSWToKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywgRkwoIkNIQU5ORUxfU1dJVENIX1BSSU1BUllfQU5EX1NFQ09OREFSWSIpKTsKKwkJICAgICAgICkKKwkJbGltX3N3aXRjaF9wcmltYXJ5X3NlY29uZGFyeV9jaGFubmVsKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQlwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5wcmltYXJ5Q2hhbm5lbCwKKwkJCXBzZXNzaW9uRW50cnktPmdMaW1DaGFubmVsU3dpdGNoLmNoX2NlbnRlcl9mcmVxX3NlZzAsCisJCQlwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5jaF9jZW50ZXJfZnJlcV9zZWcxLAorCQkJcHNlc3Npb25FbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guY2hfd2lkdGgpOworCQlwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSA9CisJCQllTElNX0NIQU5ORUxfU1dJVENIX0lETEU7CisJCWJyZWFrOworCisJY2FzZSBlTElNX0NIQU5ORUxfU1dJVENIX0lETEU6CisJZGVmYXVsdDoKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoImluY29ycmVjdCBzdGF0ZSAiKSk7KQorCQlpZiAobGltX3Jlc3RvcmVfcHJlX2NoYW5uZWxfc3dpdGNoX3N0YXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpICE9CisJCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTAorCQkJCQkoIkNvdWxkIG5vdCByZXN0b3JlIHByZS1jaGFubmVsU3dpdGNoICgxMWgpIHN0YXRlLCByZXNldHRpbmcgdGhlIHN5c3RlbSIpKTsKKwkJfQorCQlyZXR1cm47IC8qIFBsZWFzZSBub3RlLCB0aGlzIGlzICdyZXR1cm4nIGFuZCBub3QgJ2JyZWFrJyAqLworCX0KK30KKworLyoqCisgKiBsaW1fdXBkYXRlX2NoYW5uZWxfc3dpdGNoKCkgLSBUaGlzIEZ1bmN0aW9uIHVwZGF0ZXMgY2hhbm5lbCBzd2l0Y2gKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAYmVhY29uOiBwb2ludGVyIHRvIHRwU2lyUHJvYmVSZXNwQmVhY29uCisgKiBAcHNlc3Npb25lbnRyeTogcG9pbnRlciB0byB0cFBFU2Vzc2lvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB3aGVuZXZlciBTdGF0aW9uIHJlY2VpdmVzCisgKiBlaXRoZXIgODAyLjExaCBjaGFubmVsIHN3aXRjaCBJRSBvciBhaXJnbyBwcm9wcmlldGFyeQorICogY2hhbm5lbCBzd2l0Y2ggSUUuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQKK2xpbV91cGRhdGVfY2hhbm5lbF9zd2l0Y2goc3RydWN0IHNBbmlTaXJHbG9iYWwgKm1hY19jdHgsCisJCQl0cFNpclByb2JlUmVzcEJlYWNvbiBiZWFjb24sCisJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbl9lbnRyeSkKK3sKKwl1aW50MTZfdCBiZWFjb25fcGVyaW9kOworCXREb3QxMWZJRUNoYW5Td2l0Y2hBbm4gKmNobmxfc3dpdGNoOworCXRMaW1DaGFubmVsU3dpdGNoSW5mbyAqY2hfc3dpdGNoX3BhcmFtczsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCXREb3QxMWZJRVdpZGVyQldDaGFuU3dpdGNoQW5uICp3aWRlcmNobmxfc3dpdGNoOworI2VuZGlmCisKKwliZWFjb25fcGVyaW9kID0gcHNlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbDsKKworCS8qIDgwMi4xMWggc3RhbmRhcmQgY2hhbm5lbCBzd2l0Y2ggSUUgKi8KKwljaG5sX3N3aXRjaCA9ICYoYmVhY29uLT5jaGFubmVsU3dpdGNoSUUpOworCWNoX3N3aXRjaF9wYXJhbXMgPSAmcHNlc3Npb25fZW50cnktPmdMaW1DaGFubmVsU3dpdGNoOworCWNoX3N3aXRjaF9wYXJhbXMtPnByaW1hcnlDaGFubmVsID0KKwkJY2hubF9zd2l0Y2gtPm5ld0NoYW5uZWw7CisJY2hfc3dpdGNoX3BhcmFtcy0+c3dpdGNoQ291bnQgPSBjaG5sX3N3aXRjaC0+c3dpdGNoQ291bnQ7CisJY2hfc3dpdGNoX3BhcmFtcy0+c3dpdGNoVGltZW91dFZhbHVlID0KKwkJU1lTX01TX1RPX1RJQ0tTKGJlYWNvbl9wZXJpb2QpICogKGNobmxfc3dpdGNoLT5zd2l0Y2hDb3VudCk7CisJY2hfc3dpdGNoX3BhcmFtcy0+c3dpdGNoTW9kZSA9IGNobmxfc3dpdGNoLT5zd2l0Y2hNb2RlOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJd2lkZXJjaG5sX3N3aXRjaCA9ICYoYmVhY29uLT5XaWRlckJXQ2hhblN3aXRjaEFubik7CisJaWYgKGJlYWNvbi0+V2lkZXJCV0NoYW5Td2l0Y2hBbm5QcmVzZW50KSB7CisJCXBzZXNzaW9uX2VudHJ5LT5nTGltV2lkZXJCV0NoYW5uZWxTd2l0Y2gubmV3Q2hhbldpZHRoID0KKwkJCQl3aWRlcmNobmxfc3dpdGNoLT5uZXdDaGFuV2lkdGg7CisJCXBzZXNzaW9uX2VudHJ5LT5nTGltV2lkZXJCV0NoYW5uZWxTd2l0Y2gubmV3Q2VudGVyQ2hhbkZyZXEwID0KKwkJCQl3aWRlcmNobmxfc3dpdGNoLT5uZXdDZW50ZXJDaGFuRnJlcTA7CisJCXBzZXNzaW9uX2VudHJ5LT5nTGltV2lkZXJCV0NoYW5uZWxTd2l0Y2gubmV3Q2VudGVyQ2hhbkZyZXExID0KKwkJCQl3aWRlcmNobmxfc3dpdGNoLT5uZXdDZW50ZXJDaGFuRnJlcTE7CisJfQorI2VuZGlmCisKKwkvKiBPbmx5IHByaW1hcnkgY2hhbm5lbCBzd2l0Y2ggZWxlbWVudCBpcyBwcmVzZW50ICovCisJY2hfc3dpdGNoX3BhcmFtcy0+c3RhdGUgPQorCQkJZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX09OTFk7CisJY2hfc3dpdGNoX3BhcmFtcy0+Y2hfd2lkdGggPSBDSF9XSURUSF8yME1IWjsKKworCS8qCisJICogRG8gbm90IGJvdGhlciB0byBsb29rIGFuZCBvcGVyYXRlIG9uIGV4dGVuZGVkIGNoYW5uZWwgc3dpdGNoIGVsZW1lbnQKKwkgKiBpZiBvdXIgb3duIGNoYW5uZWwtYm9uZGluZyBzdGF0ZSBpcyBub3QgZW5hYmxlZAorCSAqLworCWlmIChwc2Vzc2lvbl9lbnRyeS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgJiYKKwkJCWJlYWNvbi0+c2VjX2NoYW5fb2Zmc2V0X3ByZXNlbnQpIHsKKwkJaWYgKGJlYWNvbi0+c2VjX2NoYW5fb2Zmc2V0LnNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPT0KKwkJCQkJUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZKSB7CisJCQljaF9zd2l0Y2hfcGFyYW1zLT5zdGF0ZSA9CisJCQkJICAgIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9BTkRfU0VDT05EQVJZOworCQkJY2hfc3dpdGNoX3BhcmFtcy0+Y2hfd2lkdGggPSBDSF9XSURUSF80ME1IWjsKKwkJCWNoX3N3aXRjaF9wYXJhbXMtPmNoX2NlbnRlcl9mcmVxX3NlZzAgPQorCQkJCWNoX3N3aXRjaF9wYXJhbXMtPnByaW1hcnlDaGFubmVsICsgMjsKKwkJfSBlbHNlIGlmIChiZWFjb24tPnNlY19jaGFuX29mZnNldC5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID09CisJCQkJUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWSkgeworCQkJY2hfc3dpdGNoX3BhcmFtcy0+c3RhdGUgPQorCQkJCSAgICBlTElNX0NIQU5ORUxfU1dJVENIX1BSSU1BUllfQU5EX1NFQ09OREFSWTsKKwkJCWNoX3N3aXRjaF9wYXJhbXMtPmNoX3dpZHRoID0gQ0hfV0lEVEhfNDBNSFo7CisJCQljaF9zd2l0Y2hfcGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQljaF9zd2l0Y2hfcGFyYW1zLT5wcmltYXJ5Q2hhbm5lbCAtIDI7CisJCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQlpZiAocHNlc3Npb25fZW50cnktPnZodENhcGFiaWxpdHkgJiYKKwkJCWJlYWNvbi0+V2lkZXJCV0NoYW5Td2l0Y2hBbm5QcmVzZW50KSB7CisJCQljaF9zd2l0Y2hfcGFyYW1zLT5jaF93aWR0aCA9CisJCQkJd2lkZXJjaG5sX3N3aXRjaC0+bmV3Q2hhbldpZHRoICsgMTsKKwkJCWNoX3N3aXRjaF9wYXJhbXMtPmNoX2NlbnRlcl9mcmVxX3NlZzAgPQorCQkJCXBzZXNzaW9uX2VudHJ5LT5nTGltV2lkZXJCV0NoYW5uZWxTd2l0Y2guCisJCQkJCQluZXdDZW50ZXJDaGFuRnJlcTA7CisJCQljaF9zd2l0Y2hfcGFyYW1zLT5jaF9jZW50ZXJfZnJlcV9zZWcxID0KKwkJCQlwc2Vzc2lvbl9lbnRyeS0+Z0xpbVdpZGVyQldDaGFubmVsU3dpdGNoLgorCQkJCQkJbmV3Q2VudGVyQ2hhbkZyZXExOworI2VuZGlmCisJCX0KKwl9CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBsaW1fc3RhcnRfY2hhbm5lbF9zd2l0Y2gobWFjX2N0eCwgcHNlc3Npb25fZW50cnkpKQorCQlsaW1fbG9nKG1hY19jdHgsIExPR1csIEZMKCJDb3VsZCBub3Qgc3RhcnQgQ2hhbm5lbCBTd2l0Y2giKSk7CisKKwlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCUZMKCJzZXNzaW9uICVkIHByaW1hcnkgY2hsICVkLCBjaF93aWR0aCAlZCwgY291bnQgICVkICglZCB0aWNrcykiKSwKKwkJcHNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkLAorCQlwc2Vzc2lvbl9lbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2gucHJpbWFyeUNoYW5uZWwsCisJCXBzZXNzaW9uX2VudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5jaF93aWR0aCwKKwkJcHNlc3Npb25fZW50cnktPmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaENvdW50LAorCQlwc2Vzc2lvbl9lbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoVGltZW91dFZhbHVlKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogbGltX2NhbmNlbF9kb3QxMWhfY2hhbm5lbF9zd2l0Y2gKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIFNUQSBkb2VzIG5vdCBzZW5kIHVwZGF0ZWQgY2hhbm5lbC1zd2l0aCBJRQorICogYWZ0ZXIgaW5kaWNhdGluZyBjaGFubmVsLXN3aXRjaCBzdGFydC4gVGhpcyB3aWxsIGNhbmNlbCB0aGUgY2hhbm5lbC1zd2l0aAorICogdGltZXIgd2hpY2ggaXMgYWxyZWFkeSBydW5uaW5nLgorICoKKyAqKipMT0dJQzoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbV9jYW5jZWxfZG90MTFoX2NoYW5uZWxfc3dpdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlpZiAoIUxJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkKKwkJcmV0dXJuOworCisJUEVMT0dXKGxpbV9sb2cKKwkJICAgICAgIChwTWFjLCBMT0dXLCBGTCgiUmVjZWl2ZWQgYSBiZWFjb24gd2l0aG91dCBjaGFubmVsIHN3aXRjaCBJRSIpKTsKKwkgICAgICAgKQorCU1UUkFDRShtYWNfdHJhY2UKKwkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEUsCisJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgZUxJTV9DSEFOTkVMX1NXSVRDSF9USU1FUikpOworCisJaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUNoYW5uZWxTd2l0Y2hUaW1lcikgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJ0eF90aW1lcl9kZWFjdGl2YXRlIGZhaWxlZCEiKSk7KQorCX0KKworCS8qIFdlIG5lZWQgdG8gcmVzdG9yZSBwcmUtY2hhbm5lbFN3aXRjaCBzdGF0ZSBvbiB0aGUgU1RBICovCisJaWYgKGxpbV9yZXN0b3JlX3ByZV9jaGFubmVsX3N3aXRjaF9zdGF0ZShwTWFjLCBwc2Vzc2lvbkVudHJ5KSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTAorCQkJCSAgICAgICAoIkxJTTogQ291bGQgbm90IHJlc3RvcmUgcHJlLWNoYW5uZWxTd2l0Y2ggKDExaCkgc3RhdGUsIHJlc2V0dGluZyB0aGUgc3lzdGVtIikpOworCQkgICAgICAgKQorCisJfQorfQorCisvKioKKyAqIGxpbV9jYW5jZWxfZG90MTFoX3F1aWV0KCkKKyAqCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICogQHBzZXNzaW9uX2VudHJ5OiBwb2ludGVyIHRvIHRwcGVzZXNzaW9uCisgKgorICogQ2FuY2VsIHRoZSBxdWlldGluZyBvbiBTdGF0aW9uIGlmIGxhdGVzdCBiZWFjb24KKyAqIGRvZXNuJ3QgY29udGFpbiBxdWlldCBJRSBpbiBpdC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBsaW1fY2FuY2VsX2RvdDExaF9xdWlldCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCWlmICghTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKQorCQlyZXR1cm47CisKKwlpZiAocHNlc3Npb25FbnRyeS0+Z0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPT0gZUxJTV9RVUlFVF9CRUdJTikgeworCQlNVFJBQ0UobWFjX3RyYWNlCisJCQkgICAgICAgKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfREVBQ1RJVkFURSwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgZUxJTV9RVUlFVF9USU1FUikpOworCQlpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRUaW1lcikgIT0KKwkJICAgIFRYX1NVQ0NFU1MpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgidHhfdGltZXJfZGVhY3RpdmF0ZSBmYWlsZWQiKSk7CisJCQkgICAgICAgKQorCQl9CisJfSBlbHNlIGlmIChwc2Vzc2lvbkVudHJ5LT5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9PSBlTElNX1FVSUVUX1JVTk5JTkcpIHsKKwkJTVRSQUNFKG1hY190cmFjZQorCQkJICAgICAgIChwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEUsCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGVMSU1fUVVJRVRfQlNTX1RJTUVSKSk7CisJCWlmICh0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyKQorCQkgICAgIT0gVFhfU1VDQ0VTUykgeworCQkJUEVMT0dFKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJ0eF90aW1lcl9kZWFjdGl2YXRlIGZhaWxlZCIpKTsKKwkJCSAgICAgICApCisJCX0KKwkJLyoqCisJCSAqIElmIHRoZSBjaGFubmVsIHN3aXRjaCBpcyBhbHJlYWR5IHJ1bm5pbmcgaW4gc2lsZW50IG1vZGUsIGRvbnQgcmVzdW1lIHRoZQorCQkgKiB0cmFuc21pc3Npb24uIENoYW5uZWwgc3dpdGNoIHRpbWVyIHdoZW4gdGltZW91dCwgdHJhbnNtaXNzaW9uIHdpbGwgYmUgcmVzdW1lZC4KKwkJICovCisJCWlmICghCisJCSAgICAoKHBzZXNzaW9uRW50cnktPmdMaW1TcGVjTWdtdC5kb3QxMWhDaGFuU3dTdGF0ZSA9PQorCQkgICAgICBlTElNXzExSF9DSEFOU1dfUlVOTklORykKKwkJICAgICAmJiAocHNlc3Npb25FbnRyeS0+Z0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoTW9kZSA9PQorCQkJIGVTSVJfQ0hBTlNXX01PREVfU0lMRU5UKSkpIHsKKwkJCWxpbV9mcmFtZV90cmFuc21pc3Npb25fY29udHJvbChwTWFjLCBlTElNX1RYX0FMTCwKKwkJCQkJCSAgICAgICBlTElNX1JFU1VNRV9UWCk7CisJCQlsaW1fcmVzdG9yZV9wcmVfcXVpZXRfc3RhdGUocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCX0KKwl9CisJcHNlc3Npb25FbnRyeS0+Z0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPSBlTElNX1FVSUVUX0lOSVQ7Cit9CisKKy8qKgorICogbGltX3Byb2Nlc3NfcXVpZXRfdGltZW91dAorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBhY3RpdmUgb25seSBvbiB0aGUgU1RBLgorICogSGFuZGxlcyBTSVJfTElNX1FVSUVUX1RJTUVPVVQKKyAqCisgKiBMT0dJQzoKKyAqIFRoaXMgdGltZW91dCBjYW4gb2NjdXIgdW5kZXIgb25seSBvbmUgY2lyY3Vtc3RhbmNlOgorICoKKyAqIDEpIFdoZW4gZ0xpbVF1aWV0U3RhdGUgPSBlTElNX1FVSUVUX0JFR0lOCisgKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB0aW1lb3V0ICJpbnRlcnZhbCIgaGFzCisgKiBleHBpcmVkLiBUaGlzIGlzIGEgdHJpZ2dlciBmb3IgdGhlIFNUQSB0byBub3cKKyAqIHNodXQtb2ZmIFR4L1J4IGZvciB0aGUgc3BlY2lmaWVkIGdMaW1RdWlldER1cmF0aW9uCisgKiAtPiBUaGUgVElNRVIgb2JqZWN0IGdMaW1RdWlldEJzc1RpbWVyIGlzCisgKiBhY3RpdmF0ZWQKKyAqIC0+IFdpdGggdGltZW91dCA9IGdMaW1RdWlldER1cmF0aW9uCisgKiAtPiBnTGltUXVpZXRTdGF0ZSBpcyBzZXQgdG8gZUxJTV9RVUlFVF9SVU5OSU5HCisgKgorICogQVNTVU1QVElPTlM6CisgKiBVc2luZyB0d28gVElNRVIgb2JqZWN0cyAtCisgKiBnTGltUXVpZXRUaW1lciAmIGdMaW1RdWlldEJzc1RpbWVyCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfcXVpZXRfdGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisKKwlwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQocE1hYywKKwkJCXBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0VGltZXIuc2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSUQiKSk7CisJCXJldHVybjsKKwl9CisKKwlQRUxPRzEobGltX2xvZworCQkgICAgICAgKHBNYWMsIExPRzEsIEZMKCJxdWlldFN0YXRlID0gJWQiKSwKKwkJICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlKTsKKwkgICAgICAgKQorCXN3aXRjaCAocHNlc3Npb25FbnRyeS0+Z0xpbVNwZWNNZ210LnF1aWV0U3RhdGUpIHsKKwljYXNlIGVMSU1fUVVJRVRfQkVHSU46CisJCS8qIFRpbWUgdG8gU3RvcCBkYXRhIHRyYWZmaWMgZm9yIHF1aWV0RHVyYXRpb24gKi8KKwkJLyogbGltX2RlYWN0aXZhdGVfYW5kX2NoYW5nZV90aW1lcihwTWFjLCBlTElNX1FVSUVUX0JTU19USU1FUik7ICovCisJCWlmIChUWF9TVUNDRVNTICE9IHR4X3RpbWVyX2RlYWN0aXZhdGUoCisJCQkJJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0QnNzVGltZXIpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwKKwkJCQkJKCJVbmFibGUgdG8gZGUtYWN0aXZhdGUgZ0xpbVF1aWV0QnNzVGltZXIhIFdpbGwgYXR0ZW1wdCB0byBhY3RpdmF0ZSBhbnl3YXkuLi4iKSk7CisJCX0KKwkJLyogZ0xpbVF1aWV0RHVyYXRpb24gYXBwZWFycyB0byBiZSBpbiB1bml0cyBvZiB0aWNrcyAqLworCQkvKiBVc2UgaXQgYXMgaXMgKi8KKwkJaWYgKFRYX1NVQ0NFU1MgIT0KKwkJICAgIHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRCc3NUaW1lciwKKwkJCQkgICAgcHNlc3Npb25FbnRyeS0+Z0xpbVNwZWNNZ210LnF1aWV0RHVyYXRpb24sCisJCQkJICAgIDApKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwKKwkJCQkJKCJVbmFibGUgdG8gY2hhbmdlIGdMaW1RdWlldEJzc1RpbWVyISBXaWxsIHN0aWxsIGF0dGVtcHQgdG8gYWN0aXZhdGUgYW55d2F5Li4uIikpOworCQl9CisJCU1UUkFDRShtYWNfdHJhY2UKKwkJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwKKwkJCSAgICAgICBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldFRpbWVyLnNlc3Npb25JZCwKKwkJCSAgICAgICBlTElNX1FVSUVUX0JTU19USU1FUikpOworCQlpZiAoVFhfU1VDQ0VTUyAhPQorCQkgICAgdHhfdGltZXJfYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0QnNzVGltZXIpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQkJRkwKKwkJCQkJKCJVbmFibGUgdG8gYWN0aXZhdGUgZ0xpbVF1aWV0QnNzVGltZXIhIFRoZSBTVEEgd2lsbCBiZSB1bmFibGUgdG8gaG9ub3IgUXVpZXQgQlNTLi4uIikpOworCQl9IGVsc2UgeworCQkJLyogVHJhbnNpdGlvbiB0byBlTElNX1FVSUVUX1JVTk5JTkcgKi8KKwkJCXBzZXNzaW9uRW50cnktPmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID0KKwkJCQllTElNX1FVSUVUX1JVTk5JTkc7CisJCQkvKiBTaHV0LW9mZiBUeC9SeCBmb3IgZ0xpbVNwZWNNZ210LnF1aWV0RHVyYXRpb24gKi8KKwkJCS8qIGZyZWV6ZSB0aGUgdHJhbnNtaXNzaW9uICovCisJCQlsaW1fZnJhbWVfdHJhbnNtaXNzaW9uX2NvbnRyb2wocE1hYywgZUxJTV9UWF9BTEwsCisJCQkJCQkgICAgICAgZUxJTV9TVE9QX1RYKTsKKworCQkJbGltX2xvZyhwTWFjLCBMT0cyLAorCQkJCUZMKCJRdWlldCBCU1M6IFNUQSBzaHV0dGluZyBkb3duIGZvciAlZCB0aWNrcyIpLAorCQkJCXBzZXNzaW9uRW50cnktPmdMaW1TcGVjTWdtdC5xdWlldER1cmF0aW9uKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgZUxJTV9RVUlFVF9SVU5OSU5HOgorCWNhc2UgZUxJTV9RVUlFVF9JTklUOgorCWNhc2UgZUxJTV9RVUlFVF9FTkQ6CisJZGVmYXVsdDoKKwkJLyogKi8KKwkJLyogQXMgb2Ygbm93LCBub3RoaW5nIHRvIGJlIGRvbmUgKi8KKwkJLyogKi8KKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX3F1aWV0X2Jzc190aW1lb3V0KCkgLSBIYW5kbGVzIFNJUl9MSU1fUVVJRVRfQlNTX1RJTUVPVVQKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIEdsb2JhbGUgTWFjIFN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYWN0aXZlIG9uIHRoZSBBUCBhbmQgU1RBLgorICogSGFuZGxlcyBTSVJfTElNX1FVSUVUX0JTU19USU1FT1VUCisgKgorICogT24gdGhlIEFQIC0KKyAqIFdoZW4gdGhlIFNJUl9MSU1fUVVJRVRfQlNTX1RJTUVPVVQgaXMgdHJpZ2dlcmVkLCBpdCBpcworICogYW4gaW5kaWNhdGlvbiBmb3IgdGhlIEFQIHRvIFNUQVJUIHNlbmRpbmcgb3V0IHRoZQorICogUXVpZXQgQlNTIElFLgorICogSWYgODAyLjExSCBpcyBlbmFibGVkLCB0aGUgUXVpZXQgQlNTIElFIGlzIHNlbnQgYXMgcGVyCisgKiB0aGUgMTFIIHNwZWMKKyAqIElmIDgwMi4xMUggaXMgbm90IGVuYWJsZWQsIHRoZSBRdWlldCBCU1MgSUUgaXMgc2VudCBhcworICogYSBQcm9wcmlldGFyeSBJRS4gVGhpcyB3aWxsIGJlIHVuZGVyc3Rvb2QgYnkgYWxsIHRoZQorICogVElUQU4gU1RBJ3MKKyAqIFRyYW5zaXRpb25pbmcgZ0xpbVF1aWV0U3RhdGUgdG8gZUxJTV9RVUlFVF9CRUdJTiB3aWxsCisgKiBpbml0aWF0ZSB0aGUgU0NIIHRvIGluY2x1ZGUgdGhlIFF1aWV0IEJTUyBJRSBpbiBhbGwKKyAqIGl0cyBzdWJzZXF1ZW50IEJlYWNvbnMvUFIncy4KKyAqIFRoZSBRdWlldCBCU1MgSUUgd2lsbCBiZSBpbmNsdWRlZCBpbiBhbGwgdGhlIEJlYWNvbnMKKyAqICYgUFIncyB1bnRpbCB0aGUgbmV4dCBEVElNIHBlcmlvZAorICoKKyAqIE9uIHRoZSBTVEEgLQorICogV2hlbiBnTGltUXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfUlVOTklORworICogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgU1RBIHdhcyBzdWNjZXNzZnVsbHkgc2h1dC1vZmYKKyAqIGZvciB0aGUgc3BlY2lmaWVkIGdMaW1RdWlldER1cmF0aW9uLiBUaGlzIGlzIGEgdHJpZ2dlcgorICogZm9yIHRoZSBTVEEgdG8gbm93IHJlc3VtZSBkYXRhIHRyYWZmaWMuCisgKiAtPiBnTGltUXVpZXRTdGF0ZSBpcyBzZXQgdG8gZUxJTV9RVUlFVF9JTklUCisgKgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGxpbV9wcm9jZXNzX3F1aWV0X2Jzc190aW1lb3V0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJdHBQRVNlc3Npb24gcHNlc3Npb25fZW50cnkgPSBOVUxMOworCXRMaW1UaW1lcnMgKmxpbV90aW1lciA9ICZtYWNfY3R4LT5saW0ubGltVGltZXJzOworCisJcHNlc3Npb25fZW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChtYWNfY3R4LAorCQkJCQlsaW1fdGltZXItPmdMaW1RdWlldEJzc1RpbWVyLnNlc3Npb25JZCk7CisKKwlpZiAocHNlc3Npb25fZW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEIikpOworCQlyZXR1cm47CisJfQorCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgicXVpZXRTdGF0ZSA9ICVkIiksCisJCQlwc2Vzc2lvbl9lbnRyeS0+Z0xpbVNwZWNNZ210LnF1aWV0U3RhdGUpOworCisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uX2VudHJ5KSkKKwkJcmV0dXJuOworCisJLyogZUxJTV9TVEFfUk9MRSAqLworCXN3aXRjaCAocHNlc3Npb25fZW50cnktPmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlKSB7CisJY2FzZSBlTElNX1FVSUVUX1JVTk5JTkc6CisJCS8qIFRyYW5zaXRpb24gdG8gZUxJTV9RVUlFVF9JTklUICovCisJCXBzZXNzaW9uX2VudHJ5LT5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfSU5JVDsKKworCQkvKgorCQkgKiBSZXN1bWUgZGF0YSB0cmFmZmljIG9ubHkgaWYgY2hhbm5lbCBzd2l0Y2ggaXMKKwkJICogbm90IHJ1bm5pbmcgaW4gc2lsZW50IG1vZGUuCisJCSAqLworCQlpZiAoISgocHNlc3Npb25fZW50cnktPmdMaW1TcGVjTWdtdC5kb3QxMWhDaGFuU3dTdGF0ZSA9PQorCQkJCWVMSU1fMTFIX0NIQU5TV19SVU5OSU5HKSAmJgorCQkJKHBzZXNzaW9uX2VudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hNb2RlID09CisJCQkJZVNJUl9DSEFOU1dfTU9ERV9TSUxFTlQpKSkgeworCQkJbGltX2ZyYW1lX3RyYW5zbWlzc2lvbl9jb250cm9sKG1hY19jdHgsIGVMSU1fVFhfQUxMLAorCQkJCWVMSU1fUkVTVU1FX1RYKTsKKwkJCWxpbV9yZXN0b3JlX3ByZV9xdWlldF9zdGF0ZShtYWNfY3R4LCBwc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cyLCBGTCgiUXVpZXQgQlNTOiBSZXN1bWluZyB0cmFmZmljLi4uIikpOworCQlicmVhazsKKworCWNhc2UgZUxJTV9RVUlFVF9JTklUOgorCWNhc2UgZUxJTV9RVUlFVF9CRUdJTjoKKwljYXNlIGVMSU1fUVVJRVRfRU5EOgorCQlsaW1fbG9nKG1hY19jdHgsIExPRzIsIEZMKCJRdWlldCBzdGF0ZSBub3QgaW4gUlVOTklORyIpKTsKKwkJLyoKKwkJICogSWYgdGhlIHF1aWV0IHBlcmlvZCBoYXMgZW5kZWQsIHRoZW4gcmVzdW1lIHRoZQorCQkgKiBmcmFtZSB0cmFuc21pc3Npb24KKwkJICovCisJCWxpbV9mcmFtZV90cmFuc21pc3Npb25fY29udHJvbChtYWNfY3R4LCBlTElNX1RYX0FMTCwKKwkJCQkJZUxJTV9SRVNVTUVfVFgpOworCQlsaW1fcmVzdG9yZV9wcmVfcXVpZXRfc3RhdGUobWFjX2N0eCwgcHNlc3Npb25fZW50cnkpOworCQlwc2Vzc2lvbl9lbnRyeS0+Z0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPSBlTElNX1FVSUVUX0lOSVQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogQXMgb2Ygbm93LCBub3RoaW5nIHRvIGJlIGRvbmUgKi8KKwkJYnJlYWs7CisJfQorfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgICAgIGxpbV9zdGFydF9xdWlldF90aW1lcgorICAgXGJyaWVmICAgIFN0YXJ0cyB0aGUgcXVpZXQgdGltZXIuCisKKyAgIFxwYXJhbSBwTWFjCisgICBccmV0dXJuIE5PTkUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltX3N0YXJ0X3F1aWV0X3RpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisJcHNlc3Npb25FbnRyeSA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSUQiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIUxJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkKKwkJcmV0dXJuOworCS8qIEZpcnN0LCBkZS1hY3RpdmF0ZSBUaW1lciwgaWYgaXRzIGFscmVhZHkgYWN0aXZlICovCisJbGltX2NhbmNlbF9kb3QxMWhfcXVpZXQocE1hYywgcHNlc3Npb25FbnRyeSk7CisKKwlNVFJBQ0UobWFjX3RyYWNlCisJCSAgICAgICAocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgc2Vzc2lvbklkLCBlTElNX1FVSUVUX1RJTUVSKSk7CisJaWYgKFRYX1NVQ0NFU1MgIT0KKwkgICAgdHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRUaW1lcikpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIlVuYWJsZSB0byBkZWFjdGl2YXRlIGdMaW1RdWlldFRpbWVyISBXaWxsIHN0aWxsIGF0dGVtcHQgdG8gcmUtYWN0aXZhdGUgYW55d2F5Li4uIikpOworCX0KKwkvKiBTZXQgdGhlIE5FVyB0aW1lb3V0IHZhbHVlLCBpbiB0aWNrcyAqLworCWlmIChUWF9TVUNDRVNTICE9IHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRUaW1lciwKKwkJCQkJICBTWVNfTVNfVE9fVElDS1MocHNlc3Npb25FbnRyeS0+CisJCQkJCQkJICBnTGltU3BlY01nbXQuCisJCQkJCQkJICBxdWlldFRpbWVvdXRWYWx1ZSksCisJCQkJCSAgMCkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIlVuYWJsZSB0byBjaGFuZ2UgZ0xpbVF1aWV0VGltZXIhIFdpbGwgc3RpbGwgYXR0ZW1wdCB0byByZS1hY3RpdmF0ZSBhbnl3YXkuLi4iKSk7CisJfQorCisJcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRUaW1lci5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJaWYgKFRYX1NVQ0NFU1MgIT0KKwkgICAgdHhfdGltZXJfYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0VGltZXIpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJVbmFibGUgdG8gYWN0aXZhdGUgZ0xpbVF1aWV0VGltZXIhIFNUQSBjYW5ub3QgaG9ub3IgUXVpZXQgQlNTISIpKTsKKwkJbGltX3Jlc3RvcmVfcHJlX3F1aWV0X3N0YXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCisJCXBzZXNzaW9uRW50cnktPmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID0gZUxJTV9RVUlFVF9JTklUOworCQlyZXR1cm47CisJfQorfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoqLworLyoqCisgKiBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgQU5JIHBlZXJzIGFzc29jaWF0ZWQgaW4gdGhlIEJTUworICogRm9yIHRoZSBmaXJzdCBhbmQgbGFzdCBBTkkgcGVlciwgd2UgaGF2ZSB0byB1cGRhdGUgRURDQSBwYXJhbXMgYXMgbmVlZGVkCisgKgorICogV2hlbiB0aGUgZmlyc3QgQU5JIHBlZXIgam9pbnMgdGhlIEJTUywgd2Ugbm90aWZ5IFNDSAorICogV2hlbiB0aGUgbGFzdCBBTkkgcGVlciBsZWF2ZXMgdGhlIEJTUywgd2Ugbm90Zml5IFNDSAorICovCit2b2lkCitsaW1fdXRpbF9jb3VudF9zdGFfYWRkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgICB0cERwaEhhc2hOb2RlIHBTdGEsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwlpZiAoKCFwU3RhKSB8fCAoIXBTdGEtPnZhbGlkKSB8fCAocFN0YS0+ZkFuaUNvdW50KSkKKwkJcmV0dXJuOworCisJcFN0YS0+ZkFuaUNvdW50ID0gMTsKKworCWlmIChwTWFjLT5saW0uZ0xpbU51bU9mQW5pU1RBcysrICE9IDApCisJCXJldHVybjsKKworCS8qIGdldCBoZXJlIG9ubHkgaWYgdGhpcyBpcyB0aGUgZmlyc3QgQU5JIHBlZXIgaW4gdGhlIEJTUyAqLworCXNjaF9lZGNhX3Byb2ZpbGVfdXBkYXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpOworfQorCit2b2lkCitsaW1fdXRpbF9jb3VudF9zdGFfZGVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgICB0cERwaEhhc2hOb2RlIHBTdGEsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwlpZiAoKHBTdGEgPT0gTlVMTCkgfHwgKCFwU3RhLT5mQW5pQ291bnQpKQorCQlyZXR1cm47CisKKwkvKiBPbmx5IGlmIHN0YSBpcyBpbnZhbGlkIGFuZCB0aGUgdmFsaWRJbkR1bW15U3RhdGUgYml0IGlzIHNldCB0byAxLAorCSAqIHRoZW4gZ28gYWhlYWQgYW5kIHVwZGF0ZSB0aGUgY291bnQgYW5kIHByb2ZpbGVzLiBUaGlzIGVuc3VyZXMKKwkgKiB0aGF0IHRoZSAibnVtYmVyIG9mIGFuaSBzdGF0aW9uIiBjb3VudCBpcyBwcm9wZXJseSBpbmNyZW1lbnRlZC9kZWNyZW1lbnRlZC4KKwkgKi8KKwlpZiAocFN0YS0+dmFsaWQgPT0gMSkKKwkJcmV0dXJuOworCisJcFN0YS0+ZkFuaUNvdW50ID0gMDsKKworCWlmIChwTWFjLT5saW0uZ0xpbU51bU9mQW5pU1RBcyA8PSAwKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJDb3VudFN0YURlbDogaWdub3JpbmcgRGVsZXRlIFJlcSB3aGVuIEFuaVBlZXIgY291bnQgaXMgJWQiKSwKKwkJCXBNYWMtPmxpbS5nTGltTnVtT2ZBbmlTVEFzKTsKKwkJcmV0dXJuOworCX0KKworCXBNYWMtPmxpbS5nTGltTnVtT2ZBbmlTVEFzLS07CisKKwlpZiAocE1hYy0+bGltLmdMaW1OdW1PZkFuaVNUQXMgIT0gMCkKKwkJcmV0dXJuOworCisJLyogZ2V0IGhlcmUgb25seSBpZiB0aGlzIGlzIHRoZSBsYXN0IEFOSSBwZWVyIGluIHRoZSBCU1MgKi8KKwlzY2hfZWRjYV9wcm9maWxlX3VwZGF0ZShwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKK30KKworLyoqCisgKiBsaW1fc3dpdGNoX2NoYW5uZWxfY2JhY2soKQorICoKKyAqKipGVU5DVElPTjoKKyAqICBUaGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIHdoaWxlIHJlcXVlc3RpbmcgdG8gc3dpdGNoIGNoYW5uZWwKKyAqICBhZnRlciBBUCBpbmRpY2F0ZXMgYSBjaGFubmVsIHN3aXRjaCBmb3Igc3BlY3RydW0gbWFuYWdlbWVudCAoMTFoKS4KKyAqCisgKioqTk9URToKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgc3RhdHVzICAgICAgICAgICAgIFN0YXR1cyBvZiBjaGFubmVsIHN3aXRjaCByZXF1ZXN0CisgKiBAcGFyYW0gIGRhdGEgICAgICAgICAgICAgICBVc2VyIGRhdGEKKyAqIEBwYXJhbSAgcHNlc3Npb25FbnRyeSAgICAgIFNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEByZXR1cm4gTk9ORQorICovCit2b2lkIGxpbV9zd2l0Y2hfY2hhbm5lbF9jYmFjayh0cEFuaVNpckdsb2JhbCBwTWFjLCBDREZfU1RBVFVTIHN0YXR1cywKKwkJCSAgICAgIHVpbnQzMl90ICpkYXRhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJNc2dRIG1taE1zZyA9IHsgMCB9OworCXRTaXJTbWVTd2l0Y2hDaGFubmVsSW5kICpwU2lyU21lU3dpdGNoQ2hJbmQ7CisKKwlwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwgPSBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50UmVxQ2hhbm5lbDsKKworCS8qIFdlIG5lZWQgdG8gcmVzdG9yZSBwcmUtY2hhbm5lbFN3aXRjaCBzdGF0ZSBvbiB0aGUgU1RBICovCisJaWYgKGxpbV9yZXN0b3JlX3ByZV9jaGFubmVsX3N3aXRjaF9zdGF0ZShwTWFjLCBwc2Vzc2lvbkVudHJ5KSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwKKwkJCQkoIkNvdWxkIG5vdCByZXN0b3JlIHByZS1jaGFubmVsU3dpdGNoICgxMWgpIHN0YXRlLCByZXNldHRpbmcgdGhlIHN5c3RlbSIpKTsKKwkJcmV0dXJuOworCX0KKworCW1taE1zZy50eXBlID0gZVdOSV9TTUVfU1dJVENIX0NITF9JTkQ7CisJcFNpclNtZVN3aXRjaENoSW5kID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVTd2l0Y2hDaGFubmVsSW5kKSk7CisJaWYgKE5VTEwgPT0gcFNpclNtZVN3aXRjaENoSW5kKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBidWZmZXIgZGVzY3JpcHRvciIpKTsKKwkJcmV0dXJuOworCX0KKworCXBTaXJTbWVTd2l0Y2hDaEluZC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9TV0lUQ0hfQ0hMX0lORDsKKwlwU2lyU21lU3dpdGNoQ2hJbmQtPmxlbmd0aCA9IHNpemVvZih0U2lyU21lU3dpdGNoQ2hhbm5lbEluZCk7CisJcFNpclNtZVN3aXRjaENoSW5kLT5uZXdDaGFubmVsSWQgPQorCQlwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5wcmltYXJ5Q2hhbm5lbDsKKwlwU2lyU21lU3dpdGNoQ2hJbmQtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKwljZGZfbWVtX2NvcHkocFNpclNtZVN3aXRjaENoSW5kLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJbW1oTXNnLmJvZHlwdHIgPSBwU2lyU21lU3dpdGNoQ2hJbmQ7CisJbW1oTXNnLmJvZHl2YWwgPSAwOworCisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIG1taE1zZy50eXBlKSk7CisKKwlzeXNfcHJvY2Vzc19tbWhfbXNnKHBNYWMsICZtbWhNc2cpOworfQorCisvKioKKyAqIGxpbV9zd2l0Y2hfcHJpbWFyeV9jaGFubmVsKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiAgVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsCisgKiAgYW5kIHNldHMgdGhlIG5ldyBuZXcgY2hhbm5lbCBJRCBpbiBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTC4KKyAqCisgKioqTk9URToKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBuZXdDaGFubmVsICBuZXcgY2huYW5uZWwgSUQKKyAqIEByZXR1cm4gTk9ORQorICovCit2b2lkIGxpbV9zd2l0Y2hfcHJpbWFyeV9jaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgbmV3Q2hhbm5lbCwKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworI2lmICFkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwl1aW50MzJfdCBsb2NhbFB3ckNvbnN0cmFpbnQ7CisjZW5kaWYKKworCVBFTE9HMyhsaW1fbG9nCisJCSAgICAgICAocE1hYywgTE9HMywKKwkJICAgICAgIEZMKCJsaW1fc3dpdGNoX3ByaW1hcnlfY2hhbm5lbDogb2xkIGNobmwgJWQgLS0+IG5ldyBjaG5sICVkICIpLAorCQkgICAgICAgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsLCBuZXdDaGFubmVsKTsKKwkgICAgICAgKQorCXBzZXNzaW9uRW50cnktPmN1cnJlbnRSZXFDaGFubmVsID0gbmV3Q2hhbm5lbDsKKwlwc2Vzc2lvbkVudHJ5LT5saW1SRkJhbmQgPSBsaW1fZ2V0X3JmX2JhbmQobmV3Q2hhbm5lbCk7CisKKwlwc2Vzc2lvbkVudHJ5LT5jaGFubmVsQ2hhbmdlUmVhc29uQ29kZSA9IExJTV9TV0lUQ0hfQ0hBTk5FTF9PUEVSQVRJT047CisKKwlwTWFjLT5saW0uZ3BjaGFuZ2VDaGFubmVsQ2FsbGJhY2sgPSBsaW1fc3dpdGNoX2NoYW5uZWxfY2JhY2s7CisJcE1hYy0+bGltLmdwY2hhbmdlQ2hhbm5lbERhdGEgPSBOVUxMOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJbGltX3NlbmRfc3dpdGNoX2NobmxfcGFyYW1zKHBNYWMsIG5ld0NoYW5uZWwsIDAsIDAsIENIX1dJRFRIXzIwTUhaLAorCQkJCSAgICBwc2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyLAorCQkJCSAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgZmFsc2UpOworI2Vsc2UKKwlpZiAod2xhbl9jZmdfZ2V0X2ludAorCQkgICAgKHBNYWMsIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCwKKwkJICAgICZsb2NhbFB3ckNvbnN0cmFpbnQpICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiVW5hYmxlIHRvIHJlYWQgTG9jYWwgUG93ZXIgQ29uc3RyYWludCBmcm9tIGNmZyIpKTsKKwkJcmV0dXJuOworCX0KKwlsaW1fc2VuZF9zd2l0Y2hfY2hubF9wYXJhbXMocE1hYywgbmV3Q2hhbm5lbCwgMCwgMCwgQ0hfV0lEVEhfMjBNSFosCisJCQkJICAgICh0UG93ZXJkQm0pIGxvY2FsUHdyQ29uc3RyYWludCwKKwkJCQkgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIGZhbHNlKTsKKyNlbmRpZgorCXJldHVybjsKK30KKworLyoqCisgKiBsaW1fc3dpdGNoX3ByaW1hcnlfc2Vjb25kYXJ5X2NoYW5uZWwoKQorICoKKyAqKipGVU5DVElPTjoKKyAqICBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIHByaW1hcnkgYW5kIHNlY29uZGFyeSBjaGFubmVsLgorICogIElmIDExaCBpcyBlbmFibGVkIGFuZCB1c2VyIHByb3ZpZGVzIGEgIm5ldyBjaGFubmVsIElEIgorICogIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwsCisgKiAgdGhlbiB3ZSBtdXN0IHNldCB0aGlzIG5ldyBjaGFubmVsIGluIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMLAorICogIGFzc2lnbiBub3RpZnkgTElNIG9mIHN1Y2ggY2hhbmdlLgorICoKKyAqKipOT1RFOgorICogQHBhcmFtICBwTWFjICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIG5ld0NoYW5uZWwgIE5ldyBjaG5hbm5lbCBJRCAob3IgY3VycmVudCBjaGFubmVsIElEKQorICogQHBhcmFtICBzdWJiYW5kICAgICBDQiBzZWNvbmRhcnkgaW5mbzoKKyAqICAgICAgICAgICAgICAgICAgICAgICAtIGVBTklfQ0JfU0VDT05EQVJZX05PTkUKKyAqICAgICAgICAgICAgICAgICAgICAgICAtIGVBTklfQ0JfU0VDT05EQVJZX1VQCisgKiAgICAgICAgICAgICAgICAgICAgICAgLSBlQU5JX0NCX1NFQ09OREFSWV9ET1dOCisgKiBAcmV0dXJuIE5PTkUKKyAqLwordm9pZCBsaW1fc3dpdGNoX3ByaW1hcnlfc2Vjb25kYXJ5X2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkJdWludDhfdCBuZXdDaGFubmVsLAorCQkJCQl1aW50OF90IGNoX2NlbnRlcl9mcmVxX3NlZzAsCisJCQkJCXVpbnQ4X3QgY2hfY2VudGVyX2ZyZXFfc2VnMSwKKwkJCQkJcGh5X2NoX3dpZHRoIGNoX3dpZHRoKQoreworI2lmICFkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwl1aW50MzJfdCBsb2NhbFB3ckNvbnN0cmFpbnQ7CisjZW5kaWYKKwl1aW50OF90IHN1YmJhbmQgPSAwOworI2lmICFkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlpZiAod2xhbl9jZmdfZ2V0X2ludAorCQkgICAgKHBNYWMsIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCwKKwkJICAgICZsb2NhbFB3ckNvbnN0cmFpbnQpICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiVW5hYmxlIHRvIGdldCBMb2NhbCBQb3dlciBDb25zdHJhaW50IGZyb20gY2ZnIikpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJLyogQXNzaWduIHRoZSBjYWxsYmFjayB0byByZXN1bWUgVFggb25jZSBjaGFubmVsIGlzIGNoYW5nZWQuICovCisJcHNlc3Npb25FbnRyeS0+Y3VycmVudFJlcUNoYW5uZWwgPSBuZXdDaGFubmVsOworCXBzZXNzaW9uRW50cnktPmxpbVJGQmFuZCA9IGxpbV9nZXRfcmZfYmFuZChuZXdDaGFubmVsKTsKKwlwc2Vzc2lvbkVudHJ5LT5jaGFubmVsQ2hhbmdlUmVhc29uQ29kZSA9IExJTV9TV0lUQ0hfQ0hBTk5FTF9PUEVSQVRJT047CisJcE1hYy0+bGltLmdwY2hhbmdlQ2hhbm5lbENhbGxiYWNrID0gbGltX3N3aXRjaF9jaGFubmVsX2NiYWNrOworCXBNYWMtPmxpbS5ncGNoYW5nZUNoYW5uZWxEYXRhID0gTlVMTDsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCWxpbV9zZW5kX3N3aXRjaF9jaG5sX3BhcmFtcyhwTWFjLCBuZXdDaGFubmVsLCBjaF9jZW50ZXJfZnJlcV9zZWcwLAorCQkJCQljaF9jZW50ZXJfZnJlcV9zZWcxLCBjaF93aWR0aCwKKwkJCQkJcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciwKKwkJCQkJcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJCWZhbHNlKTsKKyNlbHNlCisJbGltX3NlbmRfc3dpdGNoX2NobmxfcGFyYW1zKHBNYWMsIG5ld0NoYW5uZWwsIGNoX2NlbnRlcl9mcmVxX3NlZzAsCisJCQkJCWNoX2NlbnRlcl9mcmVxX3NlZzEsIGNoX3dpZHRoLAorCQkJCQlwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQkJZmFsc2UpOworI2VuZGlmCisKKwkvKiBTdG9yZSB0aGUgbmV3IHByaW1hcnkgYW5kIHNlY29uZGFyeSBjaGFubmVsIGluIHNlc3Npb24gZW50cmllcyBpZiBkaWZmZXJlbnQgKi8KKwlpZiAocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsICE9IG5ld0NoYW5uZWwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoInN3aXRjaCBvbGQgY2hubCAlZCAtLT4gbmV3IGNobmwgJWQgIiksCisJCQlwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwsIG5ld0NoYW5uZWwpOworCQlwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwgPSBuZXdDaGFubmVsOworCX0KKwlpZiAocHNlc3Npb25FbnRyeS0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ICE9IHN1YmJhbmQpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoInN3aXRjaCBvbGQgc2VjIGNobmwgJWQgLS0+IG5ldyBzZWMgY2hubCAlZCAiKSwKKwkJCXBzZXNzaW9uRW50cnktPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCwgc3ViYmFuZCk7CisJCXBzZXNzaW9uRW50cnktPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IHN1YmJhbmQ7CisJCWlmIChwc2Vzc2lvbkVudHJ5LT5odFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPT0KKwkJICAgIFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRCkgeworCQkJcHNlc3Npb25FbnRyeS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCVdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRTsKKwkJfSBlbHNlIHsKKwkJCXBzZXNzaW9uRW50cnktPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQlXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0VOQUJMRTsKKwkJfQorCQlwc2Vzc2lvbkVudHJ5LT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCA9CisJCQlwc2Vzc2lvbkVudHJ5LT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogbGltX2FjdGl2ZV9zY2FuX2FsbG93ZWQoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIENoZWNrcyBpZiBhY3RpdmUgc2NhbnMgYXJlIHBlcm1pdHRlZCBvbiB0aGUgZ2l2ZW4gY2hhbm5lbAorICoKKyAqKipMT0dJQzoKKyAqIFRoZSBjb25maWcgdmFyaWFibGUgU0NBTl9DT05UUk9MX0xJU1QgY29udGFpbnMgcGFpcnMgb2YgKGNoYW5uZWxOdW0sIGFjdGl2ZVNjYW5BbGxvd2VkKQorICogTmVlZCB0byBjaGVjayBpZiB0aGUgY2hhbm5lbE51bSBtYXRjaGVzLCB0aGVuIGRlcGVuZGluZyBvbiB0aGUgY29ycmVzcG9uZGluZworICogc2NhbiBmbGFnLCByZXR1cm4gdHJ1ZSAoZm9yIGFjdGl2ZVNjYW5BbGxvd2VkPT0xKSBvciBmYWxzZSAob3RoZXJ3aXNlKS4KKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgY2hhbm5lbE51bSBjaGFubmVsIG51bWJlcgorICogQHJldHVybiBOb25lCisgKi8KKwordWludDhfdCBsaW1fYWN0aXZlX3NjYW5fYWxsb3dlZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNoYW5uZWxOdW0pCit7CisJdWludDMyX3QgaTsKKwl1aW50OF90IGNoYW5uZWxQYWlyW1dOSV9DRkdfU0NBTl9DT05UUk9MX0xJU1RfTEVOXTsKKwl1aW50MzJfdCBsZW4gPSBXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNUX0xFTjsKKwlpZiAod2xhbl9jZmdfZ2V0X3N0cihwTWFjLCBXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNULCBjaGFubmVsUGFpciwgJmxlbikKKwkgICAgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gZ2V0IHNjYW4gY29udHJvbCBsaXN0IikpOworCQkgICAgICAgKQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGxlbiA+IFdOSV9DRkdfU0NBTl9DT05UUk9MX0xJU1RfTEVOKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgc2NhbiBjb250cm9sIGxpc3QgbGVuZ3RoOiVkIiksCisJCQlsZW4pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZm9yIChpID0gMDsgKGkgKyAxKSA8IGxlbjsgaSArPSAyKSB7CisJCWlmIChjaGFubmVsUGFpcltpXSA9PSBjaGFubmVsTnVtKQorCQkJcmV0dXJuICgoY2hhbm5lbFBhaXJbaSArIDFdID09CisJCQkJIGVTSVJfQUNUSVZFX1NDQU4pID8gdHJ1ZSA6IGZhbHNlKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIGxpbV9nZXRfaHRfY2FwYWJpbGl0eSgpCisgKgorICoqKkZVTkNUSU9OOgorICogQSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgImN1cnJlbnQgSFQgY2FwYWJpbGl0eSBzdGF0ZSIgZm9yIHRoZSBIVAorICogY2FwYWJpbGl0eSBvZiBpbnRlcmVzdCAoYXMgcmVxdWVzdGVkIGluIHRoZSBBUEkpCisgKgorICoqKkxPR0lDOgorICogVGhpcyByb3V0aW5lIHdpbGwgcmV0dXJuIHdpdGggdGhlICJjdXJyZW50IiBzZXR0aW5nIG9mIGEgcmVxdWVzdGVkIEhUCisgKiBjYXBhYmlsaXR5LiBUaGlzIHN0YXRlIGluZm8gY291bGQgYmUgcmV0cmlldmVkIGZyb20gLQorICogYSkgQ0ZHIChmb3Igc3RhdGljIGVudHJpZXMpCisgKiBiKSBSdW4gdGltZSBpbmZvCisgKiAgIC0gRHluYW1pYyBzdGF0ZSBtYWludGFpbmVkIGJ5IExJTQorICogICAtIENvbmZpZ3VyZWQgYXQgcmFkaW8gaW5pdCB0aW1lIGJ5IFNNRQorICoKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBodENhcCBUaGUgSFQgY2FwYWJpbGl0eSBiZWluZyBxdWVyaWVkCisgKiBAcmV0dXJuIHVpbnQ4X3QgVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlcXVlc3RlZCBIVCBjYXBhYmlsaXR5IGlzIHJldHVybmVkIGluIGEKKyAqICAgICAgICAgICAgdWludDhfdCB2YXJpYWJsZQorICovCisKK3VpbnQ4X3QgbGltX2dldF9odF9jYXBhYmlsaXR5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgICB1aW50MzJfdCBodENhcCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50OF90IHJldFZhbCA9IDA7CisJdWludDhfdCAqcHRyOworCXVpbnQzMl90IGNmZ1ZhbHVlOworCXRTaXJNYWNIVENhcGFiaWxpdHlJbmZvIG1hY0hUQ2FwYWJpbGl0eUluZm8gPSB7IDAgfTsKKwl0U2lyTWFjRXh0ZW5kZWRIVENhcGFiaWxpdHlJbmZvIG1hY0V4dEhUQ2FwYWJpbGl0eUluZm8gPSB7IDAgfTsKKwl0U2lyTWFjVHhCRkNhcGFiaWxpdHlJbmZvIG1hY1R4QkZDYXBhYmlsaXR5SW5mbyA9IHsgMCB9OworCXRTaXJNYWNBU0NhcGFiaWxpdHlJbmZvIG1hY0FTQ2FwYWJpbGl0eUluZm8gPSB7IDAgfTsKKworCS8qICovCisJLyogRGV0ZXJtaW5lIHdoaWNoIENGRyB0byByZWFkIGZyb20uIE5vdCBBTEwgb2YgdGhlIEhUICovCisJLyogcmVsYXRlZCBDRkcncyBuZWVkIHRvIGJlIHJlYWQgZWFjaCB0aW1lIHRoaXMgQVBJIGlzICovCisJLyogYWNjZXNzZWQgKi8KKwkvKiAqLworCWlmIChodENhcCA+PSBlSFRfQU5URU5OQV9TRUxFQ1RJT04gJiYgaHRDYXAgPCBlSFRfU0lfR1JBTlVMQVJJVFkpIHsKKwkJLyogR2V0IEFudGVubmEgU2VsZXRpb24gSFQgQ2FwYWJpbGl0aWVzICovCisJCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkJICAgIHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19BU19DQVAsICZjZmdWYWx1ZSkpCisJCQljZmdWYWx1ZSA9IDA7CisJCXB0ciA9ICh1aW50OF90ICopICZtYWNBU0NhcGFiaWxpdHlJbmZvOworCQkqKCh1aW50OF90ICopIHB0cikgPSAodWludDhfdCkgKGNmZ1ZhbHVlICYgMHhmZik7CisJfSBlbHNlIHsKKwkJaWYgKGh0Q2FwID49IGVIVF9UWF9CRUFNRk9STUlORyAmJgorCQkgICAgaHRDYXAgPCBlSFRfQU5URU5OQV9TRUxFQ1RJT04pIHsKKwkJCS8qIEdldCBUcmFuc21pdCBCZWFtIEZvcm1pbmcgSFQgQ2FwYWJpbGl0aWVzICovCisJCQlpZiAoZVNJUl9TVUNDRVNTICE9CisJCQkgICAgd2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1RYX0JGX0NBUCwgJmNmZ1ZhbHVlKSkKKwkJCQljZmdWYWx1ZSA9IDA7CisJCQlwdHIgPSAodWludDhfdCAqKSAmbWFjVHhCRkNhcGFiaWxpdHlJbmZvOworCQkJKigodWludDMyX3QgKikgcHRyKSA9ICh1aW50MzJfdCkgKGNmZ1ZhbHVlKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChodENhcCA+PSBlSFRfUENPICYmIGh0Q2FwIDwgZUhUX1RYX0JFQU1GT1JNSU5HKSB7CisJCQkJLyogR2V0IEV4dGVuZGVkIEhUIENhcGFiaWxpdGllcyAqLworCQkJCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkJCQkgICAgd2xhbl9jZmdfZ2V0X2ludChwTWFjLAorCQkJCQkJICAgICBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GTywKKwkJCQkJCSAgICAgJmNmZ1ZhbHVlKSkKKwkJCQkJY2ZnVmFsdWUgPSAwOworCQkJCXB0ciA9ICh1aW50OF90ICopICZtYWNFeHRIVENhcGFiaWxpdHlJbmZvOworCQkJCSooKHVpbnQxNl90ICopIHB0cikgPQorCQkJCQkodWludDE2X3QpIChjZmdWYWx1ZSAmIDB4ZmZmZik7CisJCQl9IGVsc2UgeworCQkJCWlmIChodENhcCA8IGVIVF9NQVhfUlhfQU1QRFVfRkFDVE9SKSB7CisJCQkJCS8qIEdldCBIVCBDYXBhYmlsaXRpZXMgKi8KKwkJCQkJaWYgKGVTSVJfU1VDQ0VTUyAhPQorCQkJCQkgICAgd2xhbl9jZmdfZ2V0X2ludChwTWFjLAorCQkJCQkJCSAgICAgV05JX0NGR19IVF9DQVBfSU5GTywKKwkJCQkJCQkgICAgICZjZmdWYWx1ZSkpCisJCQkJCQljZmdWYWx1ZSA9IDA7CisJCQkJCXB0ciA9ICh1aW50OF90ICopICZtYWNIVENhcGFiaWxpdHlJbmZvOworCQkJCQkvKiBDUiAyNjUyODIgTURNIFNvZnRBUCAyLjRQTDogU29mdEFQIGJvb3QgdXAgY3Jhc2ggaW4gMi40IFBMIGJ1aWxkcyB3aGlsZSBzYW1lIFdMQU4gU1UgaXMgd29ya2luZyBvbiAyLjEgUEwgKi8KKwkJCQkJKnB0cisrID0gY2ZnVmFsdWUgJiAweGZmOworCQkJCQkqcHRyID0gKGNmZ1ZhbHVlID4+IDgpICYgMHhmZjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlzd2l0Y2ggKGh0Q2FwKSB7CisJY2FzZSBlSFRfTFNJR19UWE9QX1BST1RFQ1RJT046CisJCXJldFZhbCA9IHBNYWMtPmxpbS5nSFRMc2lnVFhPUFByb3RlY3Rpb247CisJCWJyZWFrOworCisJY2FzZSBlSFRfU1RCQ19DT05UUk9MX0ZSQU1FOgorCQlyZXRWYWwgPSAodWludDhfdCkgbWFjSFRDYXBhYmlsaXR5SW5mby5zdGJjQ29udHJvbEZyYW1lOworCQlicmVhazsKKworCWNhc2UgZUhUX1BTTVA6CisJCXJldFZhbCA9IHBNYWMtPmxpbS5nSFRQU01QU3VwcG9ydDsKKwkJYnJlYWs7CisKKwljYXNlIGVIVF9EU1NTX0NDS19NT0RFXzQwTUhaOgorCQlyZXRWYWwgPSBwTWFjLT5saW0uZ0hURHNzc0Nja1JhdGU0ME1IelN1cHBvcnQ7CisJCWJyZWFrOworCisJY2FzZSBlSFRfTUFYX0FNU0RVX0xFTkdUSDoKKwkJcmV0VmFsID0gKHVpbnQ4X3QpIG1hY0hUQ2FwYWJpbGl0eUluZm8ubWF4aW1hbEFNU0RVc2l6ZTsKKwkJYnJlYWs7CisKKwljYXNlIGVIVF9SWF9TVEJDOgorCQlyZXRWYWwgPSAodWludDhfdCkgcHNlc3Npb25FbnRyeS0+aHRDb25maWcuaHRfcnhfc3RiYzsKKwkJYnJlYWs7CisKKwljYXNlIGVIVF9UWF9TVEJDOgorCQlyZXRWYWwgPSAodWludDhfdCkgcHNlc3Npb25FbnRyeS0+aHRDb25maWcuaHRfdHhfc3RiYzsKKwkJYnJlYWs7CisKKwljYXNlIGVIVF9TSE9SVF9HSV80ME1IWjoKKwkJcmV0VmFsID0gKHVpbnQ4X3QpCisJCQkgKHBzZXNzaW9uRW50cnktPmh0Q29uZmlnLmh0X3NnaSkgPyBtYWNIVENhcGFiaWxpdHlJbmZvLgorCQkJIHNob3J0R0k0ME1IeiA6IDA7CisJCWJyZWFrOworCisJY2FzZSBlSFRfU0hPUlRfR0lfMjBNSFo6CisJCXJldFZhbCA9ICh1aW50OF90KQorCQkJIChwc2Vzc2lvbkVudHJ5LT5odENvbmZpZy5odF9zZ2kpID8gbWFjSFRDYXBhYmlsaXR5SW5mby4KKwkJCSBzaG9ydEdJMjBNSHogOiAwOworCQlicmVhazsKKworCWNhc2UgZUhUX0dSRUVORklFTEQ6CisJCXJldFZhbCA9ICh1aW50OF90KSBtYWNIVENhcGFiaWxpdHlJbmZvLmdyZWVuRmllbGQ7CisJCWJyZWFrOworCisJY2FzZSBlSFRfTUlNT19QT1dFUl9TQVZFOgorCQlyZXRWYWwgPSAodWludDhfdCkgcE1hYy0+bGltLmdIVE1JTU9QU1N0YXRlOworCQlicmVhazsKKworCWNhc2UgZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVDoKKwkJcmV0VmFsID0gKHVpbnQ4X3QpIHBzZXNzaW9uRW50cnktPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworCQlicmVhazsKKworCWNhc2UgZUhUX0FEVkFOQ0VEX0NPRElORzoKKwkJcmV0VmFsID0gKHVpbnQ4X3QpIHBzZXNzaW9uRW50cnktPmh0Q29uZmlnLmh0X3J4X2xkcGM7CisJCWJyZWFrOworCisJY2FzZSBlSFRfTUFYX1JYX0FNUERVX0ZBQ1RPUjoKKwkJcmV0VmFsID0gcE1hYy0+bGltLmdIVE1heFJ4QU1wZHVGYWN0b3I7CisJCWJyZWFrOworCisJY2FzZSBlSFRfTVBEVV9ERU5TSVRZOgorCQlyZXRWYWwgPSBwTWFjLT5saW0uZ0hUQU1wZHVEZW5zaXR5OworCQlicmVhazsKKworCWNhc2UgZUhUX1BDTzoKKwkJcmV0VmFsID0gKHVpbnQ4X3QpIG1hY0V4dEhUQ2FwYWJpbGl0eUluZm8ucGNvOworCQlicmVhazsKKworCWNhc2UgZUhUX1RSQU5TSVRJT05fVElNRToKKwkJcmV0VmFsID0gKHVpbnQ4X3QpIG1hY0V4dEhUQ2FwYWJpbGl0eUluZm8udHJhbnNpdGlvblRpbWU7CisJCWJyZWFrOworCisJY2FzZSBlSFRfTUNTX0ZFRURCQUNLOgorCQlyZXRWYWwgPSAodWludDhfdCkgbWFjRXh0SFRDYXBhYmlsaXR5SW5mby5tY3NGZWVkYmFjazsKKwkJYnJlYWs7CisKKwljYXNlIGVIVF9UWF9CRUFNRk9STUlORzoKKwkJcmV0VmFsID0gKHVpbnQ4X3QpIG1hY1R4QkZDYXBhYmlsaXR5SW5mby50eEJGOworCQlicmVhazsKKworCWNhc2UgZUhUX0FOVEVOTkFfU0VMRUNUSU9OOgorCQlyZXRWYWwgPSAodWludDhfdCkgbWFjQVNDYXBhYmlsaXR5SW5mby5hbnRlbm5hU2VsZWN0aW9uOworCQlicmVhazsKKworCWNhc2UgZUhUX1NJX0dSQU5VTEFSSVRZOgorCQlyZXRWYWwgPSBwTWFjLT5saW0uZ0hUU2VydmljZUludGVydmFsR3JhbnVsYXJpdHk7CisJCWJyZWFrOworCisJY2FzZSBlSFRfQ09OVFJPTExFRF9BQ0NFU1M6CisJCXJldFZhbCA9IHBNYWMtPmxpbS5nSFRDb250cm9sbGVkQWNjZXNzT25seTsKKwkJYnJlYWs7CisKKwljYXNlIGVIVF9SSUZTX01PREU6CisJCXJldFZhbCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGU7CisJCWJyZWFrOworCisJY2FzZSBlSFRfUkVDT01NRU5ERURfVFhfV0lEVEhfU0VUOgorCQlyZXRWYWwgPSBwc2Vzc2lvbkVudHJ5LT5odFJlY29tbWVuZGVkVHhXaWR0aFNldDsKKwkJYnJlYWs7CisKKwljYXNlIGVIVF9FWFRFTlNJT05fQ0hBTk5FTF9PRkZTRVQ6CisJCXJldFZhbCA9IHBzZXNzaW9uRW50cnktPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwkJYnJlYWs7CisKKwljYXNlIGVIVF9PUF9NT0RFOgorCQlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpCisJCQlyZXRWYWwgPSBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlOworCQllbHNlCisJCQlyZXRWYWwgPSBwTWFjLT5saW0uZ0hUT3Blck1vZGU7CisJCWJyZWFrOworCisJY2FzZSBlSFRfQkFTSUNfU1RCQ19NQ1M6CisJCXJldFZhbCA9IHBNYWMtPmxpbS5nSFRTVEJDQmFzaWNNQ1M7CisJCWJyZWFrOworCisJY2FzZSBlSFRfRFVBTF9DVFNfUFJPVEVDVElPTjoKKwkJcmV0VmFsID0gcE1hYy0+bGltLmdIVER1YWxDVFNQcm90ZWN0aW9uOworCQlicmVhazsKKworCWNhc2UgZUhUX0xTSUdfVFhPUF9QUk9URUNUSU9OX0ZVTExfU1VQUE9SVDoKKwkJcmV0VmFsID0KKwkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisJCWJyZWFrOworCisJY2FzZSBlSFRfUENPX0FDVElWRToKKwkJcmV0VmFsID0gcE1hYy0+bGltLmdIVFBDT0FjdGl2ZTsKKwkJYnJlYWs7CisKKwljYXNlIGVIVF9QQ09fUEhBU0U6CisJCXJldFZhbCA9IHBNYWMtPmxpbS5nSFRQQ09QaGFzZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIGxpbV9lbmFibGVfMTFhX3Byb3RlY3Rpb24oKSAtIHVwZGF0ZXMgcHJvdGVjdGlvbiBwYXJhbXMgZm9yIGVuYWJsZSAxMWEKKyAqIHByb3RlY3Rpb24gcmVxdWVzdAorICogQG1hY19jdHg6ICAgIHBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBvdmVybGFwOiAgICAxPT4gY2FsbGVkIGZyb20gb3ZlcmxhcCBjb250ZXh0LCAwID0+IGNhbGxlZCBmcm9tIGFzc29jIGNvbnRleHQuCisgKiBAYmNuX3BybXM6ICAgYmVhY29uIHBhcmFtZXRlcnMKKyAqIEBwZV9zZXNzaW9uOiBwZSBzZXNzaW9uIGVudHJ5CisgKgorICogVGhpcyBmdWNudGlvbiB1cGRhdGVzIHByb3RlY3Rpb24gcGFyYW1zIGZvciBlbmFibGUgMTFhIHByb3RlY3Rpb24gcmVxdWVzdAorICoKKyAqIEBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIHZvaWQKK2xpbV9lbmFibGVfMTFhX3Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCSB1aW50OF90IG92ZXJsYXAsCisJCQkgdHBVcGRhdGVCZWFjb25QYXJhbXMgYmNuX3BybXMsCisJCQkgdHBQRVNlc3Npb24gcGVfc2Vzc2lvbikKK3sKKwkvKgorCSAqIElmIHdlIGFyZSBBUCBhbmQgSFQgY2FwYWJsZSwgd2UgbmVlZCB0byBzZXQgdGhlIEhUIE9QIG1vZGUKKwkgKiBhcHByb3ByaWF0ZWx5LgorCSAqLworCWlmICgoTElNX0lTX0FQX1JPTEUocGVfc2Vzc2lvbikgfHwgTElNX0lTX0JUX0FNUF9BUF9ST0xFKHBlX3Nlc3Npb24pKQorCSAgICAmJiAodHJ1ZSA9PSBwZV9zZXNzaW9uLT5odENhcGFiaWxpdHkpKSB7CisJCWlmIChvdmVybGFwKSB7CisJCQltYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXAxMWFQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPQorCQkJCXRydWU7CisJCQlpZiAoKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSAhPQorCQkJICAgIG1hY19jdHgtPmxpbS5nSFRPcGVyTW9kZSkKKwkJCQkmJiAoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9CisJCQkJICAgIG1hY19jdHgtPmxpbS5nSFRPcGVyTW9kZSkpIHsKKwkJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCQllU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1k7CisJCQkJcGVfc2Vzc2lvbi0+aHRPcGVyTW9kZSA9CisJCQkJCWVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKwkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LCB0cnVlLAorCQkJCQlvdmVybGFwLCBiY25fcHJtcywgcGVfc2Vzc2lvbik7CisJCQkJbGltX2VuYWJsZV9odF9vYnNzX3Byb3RlY3Rpb24obWFjX2N0eCwgdHJ1ZSwKKwkJCQkJb3ZlcmxhcCwgYmNuX3BybXMsIHBlX3Nlc3Npb24pOworCQkJfQorCQl9IGVsc2UgeworCQkJcGVfc2Vzc2lvbi0+Z0xpbTExYVBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisJCQlpZiAoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9IHBlX3Nlc3Npb24tPmh0T3Blck1vZGUpIHsKKwkJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCQllU0lSX0hUX09QX01PREVfTUlYRUQ7CisJCQkJcGVfc2Vzc2lvbi0+aHRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9NSVhFRDsKKwkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LCB0cnVlLAorCQkJCQlvdmVybGFwLCBiY25fcHJtcywgcGVfc2Vzc2lvbik7CisJCQkJbGltX2VuYWJsZV9odF9vYnNzX3Byb3RlY3Rpb24obWFjX2N0eCwgdHJ1ZSwKKwkJCQkJb3ZlcmxhcCwgYmNuX3BybXMsIHBlX3Nlc3Npb24pOworCQkJfQorCQl9CisJfQorCS8qIFRoaXMgcGFydCBpcyBjb21tb24gZm9yIHN0YXRpb24gYXMgd2VsbC4gKi8KKwlpZiAoZmFsc2UgPT0gcGVfc2Vzc2lvbi0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3QpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkgICAgICAgRkwoIiA9PiBwcm90ZWN0aW9uIGZyb20gMTFBIEVuYWJsZWQiKSk7CisJCWJjbl9wcm1zLT5sbGFDb2V4aXN0ID0gdHJ1ZTsKKwkJcGVfc2Vzc2lvbi0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3QgPSB0cnVlOworCQliY25fcHJtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxBQ09FWElTVF9DSEFOR0VEOworCX0KK30KKworLyoqCisgKiBsaW1fZGlzYWJsZV8xMWFfcHJvdGVjdGlvbigpIC0gdXBkYXRlcyBwcm90ZWN0aW9uIHBhcmFtcyBmb3IgZGlzYWJsZSAxMWEKKyAqIHByb3RlY3Rpb24gcmVxdWVzdAorICogQG1hY19jdHg6ICAgIHBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBvdmVybGFwOiAgICAxPT4gY2FsbGVkIGZyb20gb3ZlcmxhcCBjb250ZXh0LCAwID0+IGNhbGxlZCBmcm9tIGFzc29jIGNvbnRleHQuCisgKiBAYmNuX3BybXM6ICAgYmVhY29uIHBhcmFtZXRlcnMKKyAqIEBwZV9zZXNzaW9uOiBwZSBzZXNzaW9uIGVudHJ5CisgKgorICogVGhpcyBmdWNudGlvbiB1cGRhdGVzIHByb3RlY3Rpb24gcGFyYW1zIGZvciBkaXNhYmxlIDExYSBwcm90ZWN0aW9uIHJlcXVlc3QKKyAqCisgKiBAUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitsaW1fZGlzYWJsZV8xMWFfcHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJICAgdWludDhfdCBvdmVybGFwLAorCQkJICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgYmNuX3BybXMsCisJCQkgICB0cFBFU2Vzc2lvbiBwZV9zZXNzaW9uKQoreworCWlmIChmYWxzZSA9PSBwZV9zZXNzaW9uLT5iZWFjb25QYXJhbXMubGxhQ29leGlzdCkKKwkJcmV0dXJuOworCisJLyogZm9yIHN0YXRpb24gcm9sZSAqLworCWlmICghTElNX0lTX0FQX1JPTEUocGVfc2Vzc2lvbikpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkgICAgICAgRkwoIj09PT4gUHJvdGVjdGlvbiBmcm9tIDExQSBEaXNhYmxlZCIpKTsKKwkJYmNuX3BybXMtPmxsYUNvZXhpc3QgPSBmYWxzZTsKKwkJcGVfc2Vzc2lvbi0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3QgPSBmYWxzZTsKKwkJYmNuX3BybXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX2xsQUNPRVhJU1RfQ0hBTkdFRDsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIGZvciBBUCByb2xlLgorCSAqIHdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIEhUIE9QIG1vZGUgY2hhbmdlIGlmIG5lZWRlZC4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBPdmVybGFwIGNhc2VzLgorCSAqLworCWlmIChvdmVybGFwKSB7CisJCS8qIE92ZXJsYXAgTGVnYWN5IHByb3RlY3Rpb24gZGlzYWJsZWQuICovCisJCW1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcDExYVBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IGZhbHNlOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIEhUIE9QIG1vZGUgaWZmIHdlIGFyZSBIVCBBUC4KKwkJICogT1Igbm8gSFQgb3AtbW9kZSBjaGFuZ2UgaXMgbmVlZGVkIGlmIGFueSBvZiB0aGUgb3ZlcmxhcAorCQkgKiBwcm90ZWN0aW9uIGVuYWJsZWQuCisJCSAqLworCQlpZiAoIXBlX3Nlc3Npb24tPmh0Q2FwYWJpbGl0eSB8fAorCQkgICAgIChtYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXAxMWFQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQKKwkJICAgICB8fCBtYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkCisJCSAgICAgfHwgbWFjX2N0eC0+bGltLmdMaW1PdmVybGFwTm9uR2ZQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpKQorCQkJZ290byBkaXNhYmxlXzExYV9lbmQ7CisKKwkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZWVkIHRvIGNoYW5nZSBIVCBPUCBtb2RlLiAqLworCQlpZiAoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZID09CisJCSAgICBtYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUpIHsKKwkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLCBvdmVybGFwLAorCQkJCQkJICAgICAgYmNuX3BybXMsIHBlX3Nlc3Npb24pOworCQkJbGltX2VuYWJsZV9odF9vYnNzX3Byb3RlY3Rpb24obWFjX2N0eCwgZmFsc2UsIG92ZXJsYXAsCisJCQkJCQkgICAgICBiY25fcHJtcywgcGVfc2Vzc2lvbik7CisKKwkJCWlmIChwZV9zZXNzaW9uLT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKwkJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCQllU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUOworCQkJZWxzZQorCQkJCW1hY19jdHgtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9QVVJFOworCQl9CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFBIHN0YXRpb25zLiAqLworCQlwZV9zZXNzaW9uLT5nTGltMTFhUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gZmFsc2U7CisJCWxpbV9lbmFibGVfaHRfb2Jzc19wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLCBvdmVybGFwLAorCQkJCQkgICAgICBiY25fcHJtcywgcGVfc2Vzc2lvbik7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgYW55IG90aGVyIG5vbi1IVCBwcm90ZWN0aW9uIGVuYWJsZWQuIFJpZ2h0IG5vdyB3ZQorCQkgKiBhcmUgaW4gSFQgT1AgTWl4ZWQgbW9kZS4gQ2hhbmdlIEhUIG9wIG1vZGUgYXBwcm9wcmlhdGVseS4KKwkJICovCisKKwkJLyogQ2hhbmdlIEhUIE9QIG1vZGUgdG8gMDEgaWYgYW55IG92ZXJsYXAgcHJvdGVjdGlvbiBlbmFibGVkICovCisJCWlmIChtYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXAxMWFQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQKKwkJICAgIHx8IG1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQKKwkJICAgIHx8IG1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSB7CisJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCWVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKwkJCXBlX3Nlc3Npb24tPmh0T3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1k7CisJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LCB0cnVlLCBvdmVybGFwLAorCQkJCQkJICAgICAgYmNuX3BybXMsIHBlX3Nlc3Npb24pOworCQl9IGVsc2UgaWYgKHBlX3Nlc3Npb24tPmdMaW1IdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSB7CisJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCWVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQ7CisJCQlwZV9zZXNzaW9uLT5odE9wZXJNb2RlID0KKwkJCQllU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUOworCQkJbGltX2VuYWJsZV9odF9yaWZzX3Byb3RlY3Rpb24obWFjX2N0eCwgZmFsc2UsIG92ZXJsYXAsCisJCQkJCQkgICAgICBiY25fcHJtcywgcGVfc2Vzc2lvbik7CisJCX0gZWxzZSB7CisJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfUFVSRTsKKwkJCXBlX3Nlc3Npb24tPmh0T3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfUFVSRTsKKwkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLCBvdmVybGFwLAorCQkJCQkJICAgICAgYmNuX3BybXMsIHBlX3Nlc3Npb24pOworCQl9CisJfQorCitkaXNhYmxlXzExYV9lbmQ6CisJaWYgKCFtYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXAxMWFQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgJiYKKwkgICAgIXBlX3Nlc3Npb24tPmdMaW0xMWFQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkgICAgICAgRkwoIj09PT4gUHJvdGVjdGlvbiBmcm9tIDExQSBEaXNhYmxlZCIpKTsKKwkJYmNuX3BybXMtPmxsYUNvZXhpc3QgPSBmYWxzZTsKKwkJcGVfc2Vzc2lvbi0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3QgPSBmYWxzZTsKKwkJYmNuX3BybXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX2xsQUNPRVhJU1RfQ0hBTkdFRDsKKwl9Cit9CisKKy8qKgorICogbGltX3VwZGF0ZV8xMWFfcHJvdGVjdGlvbigpIC0gYmFzZWQgb24gY29uZmlnIHNldHRpbmcgZW5hYmxlc1xkaXNhYmxlcyAxMWEKKyAqIHByb3RlY3Rpb24uCisgKiBAbWFjX2N0eDogICAgcG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQGVuYWJsZTogICAgIDE9PiBlbmFibGUgcHJvdGVjdGlvbiwgMD0+IGRpc2FibGUgcHJvdGVjdGlvbi4KKyAqIEBvdmVybGFwOiAgICAxPT4gY2FsbGVkIGZyb20gb3ZlcmxhcCBjb250ZXh0LCAwID0+IGNhbGxlZCBmcm9tIGFzc29jIGNvbnRleHQuCisgKiBAYmNuX3BybXM6ICAgYmVhY29uIHBhcmFtZXRlcnMKKyAqIEBzZXNzaW9uOiAgICBwZSBzZXNzaW9uIGVudHJ5CisgKgorICogVGhpcyBiYXNlZCBvbiBjb25maWcgc2V0dGluZyBlbmFibGVzXGRpc2FibGVzIDExYSBwcm90ZWN0aW9uLgorICoKKyAqIEBSZXR1cm46IHN1Y2Nlc3Mgb2YgZmFpbHVyZSBvZiBvcGVyYXRpb24KKyAqLwordFNpclJldFN0YXR1cworbGltX3VwZGF0ZV8xMWFfcHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50OF90IGVuYWJsZSwKKwkJCSB1aW50OF90IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIGJjbl9wcm1zLAorCQkJIHRwUEVTZXNzaW9uIHNlc3Npb24pCit7CisJaWYgKE5VTEwgPT0gc2Vzc2lvbikgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csIEZMKCJzZXNzaW9uIGlzIE5VTEwiKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIG92ZXJsYXBwaW5nIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiBjaGVjay4gKi8KKwlpZiAoIW92ZXJsYXApIHsKKwkJLyogbm9ybWFsIHByb3RlY3Rpb24gY29uZmlnIGNoZWNrICovCisJCWlmICgoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbikpICYmCisJCSAgICAoIXNlc3Npb24tPmNmZ1Byb3RlY3Rpb24uZnJvbWxsYSkpIHsKKwkJCS8qIHByb3RlY3Rpb24gZGlzYWJsZWQuICovCisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkgICAgICAgRkwoInByb3RlY3Rpb24gZnJvbSAxMWEgaXMgZGlzYWJsZWQiKSk7CisJCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCQl9CisJfQorCisJaWYgKGVuYWJsZSkKKwkJbGltX2VuYWJsZV8xMWFfcHJvdGVjdGlvbihtYWNfY3R4LCBvdmVybGFwLCBiY25fcHJtcywgc2Vzc2lvbik7CisJZWxzZQorCQlsaW1fZGlzYWJsZV8xMWFfcHJvdGVjdGlvbihtYWNfY3R4LCBvdmVybGFwLCBiY25fcHJtcywgc2Vzc2lvbik7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKioKKyAqIGxpbV9oYW5kbGVfZW5hYmxlMTFnX3Byb3RlY3Rpb25fZW5hYmxlZCgpIC0gaGFuZGxlIDExZyBwcm90ZWN0aW9uIGVuYWJsZWQKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIEdsb2JhbGUgTWFjIHN0cnVjdHVyZQorICogQGJlYWNvbnBhcmFtczogcG9pbnRlciB0byB0cFVwZGF0ZUJlYWNvblBhcmFtcworICogQG92ZXJsYXA6IDE9PiBjYWxsZWQgZnJvbSBvdmVybGFwIGNvbnRleHQsIDAgPT4gY2FsbGVkIGZyb20gYXNzb2MgY29udGV4dC4KKyAqIEBzZXNzaW9uX2VudHJ5OiBwb2ludGVyIHRvIHRwUEVTZXNzaW9uCisgKgorICogRnVuY3Rpb24gaGFuZGxlcyAxMWcgcHJvdGVjdGlvbiBlbmFsZWQgY2FzZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAorbGltX2hhbmRsZV9lbmFibGUxMWdfcHJvdGVjdGlvbl9lbmFibGVkKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQl0cFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25wYXJhbXMsCisJCQl1aW50OF90IG92ZXJsYXAsIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJLyoKKwkgKiBJZiB3ZSBhcmUgQVAgYW5kIEhUIGNhcGFibGUsIHdlIG5lZWQgdG8gc2V0IHRoZSBIVCBPUCBtb2RlCisJICogYXBwcm9wcmlhdGVseS4KKwkgKi8KKwlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgJiYgb3ZlcmxhcCkgeworCQlzZXNzaW9uX2VudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgicHJvdGVjdGlvbiBmcm9tIG9sYmMgaXMgZW5hYmxlZCIpKTsKKworCQlpZiAodHJ1ZSA9PSBzZXNzaW9uX2VudHJ5LT5odENhcGFiaWxpdHkpIHsKKwkJCWlmICgoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZICE9CisJCQkJc2Vzc2lvbl9lbnRyeS0+aHRPcGVyTW9kZSkgJiYKKwkJCQkoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9CisJCQkJc2Vzc2lvbl9lbnRyeS0+aHRPcGVyTW9kZSkpIHsKKwkJCQlzZXNzaW9uX2VudHJ5LT5odE9wZXJNb2RlID0KKwkJCQkJZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZOworCQkJfQorCQkJLyoKKwkJCSAqIENSLTI2MzAyMTogT0JTUyBiaXQgaXMgbm90IHN3aXRjaGluZyBiYWNrIHRvIDAgYWZ0ZXIKKwkJCSAqIGRpc2FibGluZyB0aGUgb3ZlcmxhcHBpbmcgbGVnYWN5IEJTUworCQkJICovCisJCQkvKgorCQkJICogVGhpcyBmaXhlcyBpc3N1ZSBvZiBPQlNTIGJpdCBub3Qgc2V0IGFmdGVyIDExYiwgMTFnCisJCQkgKiBzdGF0aW9uIGxlYXZlcworCQkJICovCisJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LCB0cnVlLAorCQkJCQlvdmVybGFwLCBiZWFjb25wYXJhbXMsIHNlc3Npb25fZW50cnkpOworCQkJLyoKKwkJCSAqIE5vdCBwcm9jZXNzaW5nIE9CU1MgYml0IGZyb20gb3RoZXIgQVBzLCBhcyB3ZSBhcmUKKwkJCSAqIGFscmVhZHkgdGFraW5nIGNhcmUgb2YgUHJvdGVjdGlvbiBmcm9tIG92ZXJsYXBwaW5nCisJCQkgKiBCU1MgYmFzZWQgb24gZXJwIElFIG9yIHVzZVByb3RlY3Rpb24gYml0CisJCQkgKi8KKwkJCWxpbV9lbmFibGVfaHRfb2Jzc19wcm90ZWN0aW9uKG1hY19jdHgsIHRydWUsCisJCQkJCW92ZXJsYXAsIGJlYWNvbnBhcmFtcywgc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwl9IGVsc2UgaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpICYmICFvdmVybGFwKSB7CisJCXNlc3Npb25fZW50cnktPmdMaW0xMWJQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJwcm90ZWN0aW9uIGZyb20gMTFiIGlzIGVuYWJsZWQiKSk7CisJCWlmICh0cnVlID09IHNlc3Npb25fZW50cnktPmh0Q2FwYWJpbGl0eSkgeworCQkJaWYgKGVTSVJfSFRfT1BfTU9ERV9NSVhFRCAhPQorCQkJCXNlc3Npb25fZW50cnktPmh0T3Blck1vZGUpIHsKKwkJCQlzZXNzaW9uX2VudHJ5LT5odE9wZXJNb2RlID0KKwkJCQkJZVNJUl9IVF9PUF9NT0RFX01JWEVEOworCQkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKG1hY19jdHgsCisJCQkJCQl0cnVlLCBvdmVybGFwLCBiZWFjb25wYXJhbXMsCisJCQkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihtYWNfY3R4LAorCQkJCQkJdHJ1ZSwgb3ZlcmxhcCwgYmVhY29ucGFyYW1zLAorCQkJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKExJTV9JU19CVF9BTVBfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSAmJgorCQkJKHRydWUgPT0gc2Vzc2lvbl9lbnRyeS0+aHRDYXBhYmlsaXR5KSAmJiBvdmVybGFwKSB7CisJCXNlc3Npb25fZW50cnktPmdMaW1PbGJjUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gdHJ1ZTsKKwkJaWYgKChlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgIT0KKwkJCW1hY19jdHgtPmxpbS5nSFRPcGVyTW9kZSkgJiYKKwkJCShlU0lSX0hUX09QX01PREVfTUlYRUQgIT0KKwkJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUpKSB7CisJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCWVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKwkJfQorCQkvKgorCQkgKiBDUi0yNjMwMjE6IE9CU1MgYml0IGlzIG5vdCBzd2l0Y2hpbmcgYmFjayB0byAwIGFmdGVyCisJCSAqIGRpc2FibGluZyB0aGUgb3ZlcmxhcHBpbmcgbGVnYWN5IEJTUworCQkgKi8KKwkJLyoKKwkJICogVGhpcyBmaXhlcyBpc3N1ZSBvZiBPQlNTIGJpdCBub3Qgc2V0IGFmdGVyIDExYiwgMTFnIHN0YXRpb24KKwkJICogbGVhdmVzCisJCSAqLworCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LCB0cnVlLCBvdmVybGFwLAorCQkJCWJlYWNvbnBhcmFtcywgc2Vzc2lvbl9lbnRyeSk7CisJCS8qCisJCSAqIE5vdCBwcm9jZXNzaW5nIE9CU1MgYml0IGZyb20gb3RoZXIgQVBzLCBhcyB3ZSBhcmUgYWxyZWFkeQorCQkgKiB0YWtpbmcgY2FyZSBvZiBQcm90ZWN0aW9uIGZyb20gb3ZlcmxhcHBpbmcgQlNTIGJhc2VkIG9uIGVycAorCQkgKiBJRSBvciB1c2VQcm90ZWN0aW9uIGJpdAorCQkgKi8KKwkJbGltX2VuYWJsZV9odF9vYnNzX3Byb3RlY3Rpb24obWFjX2N0eCwgdHJ1ZSwgb3ZlcmxhcCwKKwkJCQliZWFjb25wYXJhbXMsIHNlc3Npb25fZW50cnkpOworCX0gZWxzZSBpZiAoTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb25fZW50cnkpICYmCisJCQkodHJ1ZSA9PSBzZXNzaW9uX2VudHJ5LT5odENhcGFiaWxpdHkpICYmICFvdmVybGFwKSB7CisJCXNlc3Npb25fZW50cnktPmdMaW0xMWJQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworCQlpZiAoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9CisJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUpIHsKKwkJCW1hY19jdHgtPmxpbS5nSFRPcGVyTW9kZSA9CisJCQkJZVNJUl9IVF9PUF9NT0RFX01JWEVEOworCQkJbGltX2VuYWJsZV9odF9yaWZzX3Byb3RlY3Rpb24obWFjX2N0eCwgdHJ1ZSwKKwkJCQkJb3ZlcmxhcCwgYmVhY29ucGFyYW1zLCBzZXNzaW9uX2VudHJ5KTsKKwkJCWxpbV9lbmFibGVfaHRfb2Jzc19wcm90ZWN0aW9uKG1hY19jdHgsIHRydWUsCisJCQkJCW92ZXJsYXAsIGJlYWNvbnBhcmFtcywgc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwl9CisJLyogVGhpcyBwYXJ0IGlzIGNvbW1vbiBmb3Igc3RhaXRvbiBhcyB3ZWxsLiAqLworCWlmIChmYWxzZSA9PSBzZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMubGxiQ29leGlzdCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCI9PiAxMUcgUHJvdGVjdGlvbiBFbmFibGVkIikpOworCQliZWFjb25wYXJhbXMtPmxsYkNvZXhpc3QgPQorCQkJc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmxsYkNvZXhpc3QgPSB0cnVlOworCQliZWFjb25wYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQlQQVJBTV9sbEJDT0VYSVNUX0NIQU5HRUQ7CisJfQorfQorCisvKioKKyAqIGxpbV9oYW5kbGVfMTFnX3Byb3RlY3Rpb25fZm9yXzExYmNvZXhpc3QoKSAtIDExZyBwcm90ZWN0aW9uIGZvciAxMWIgY28tZXgKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIEdsb2JhbGUgTWFjIHN0cnVjdHVyZQorICogQGJlYWNvbnBhcmFtczogcG9pbnRlciB0byB0cFVwZGF0ZUJlYWNvblBhcmFtcworICogQG92ZXJsYXA6IDE9PiBjYWxsZWQgZnJvbSBvdmVybGFwIGNvbnRleHQsIDAgPT4gY2FsbGVkIGZyb20gYXNzb2MgY29udGV4dC4KKyAqIEBzZXNzaW9uX2VudHJ5OiBwb2ludGVyIHRvIHRwUEVTZXNzaW9uCisgKgorICogRnVuY3Rpb24gaGFuZGxlcyAxMWcgcHJvdGVjdGlvbiBmb3IgMTFiIGNvLWV4aXN0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCitsaW1faGFuZGxlXzExZ19wcm90ZWN0aW9uX2Zvcl8xMWJjb2V4aXN0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQl0cFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25wYXJhbXMsCisJCQl1aW50OF90IG92ZXJsYXAsIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJLyoKKwkgKiBGb3IgQVAgcm9sZToKKwkgKiB3ZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBIVCBPUCBtb2RlIGNoYW5nZSBpZiBuZWVkZWQuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgT3ZlcmxhcCBjYXNlcy4KKwkgKi8KKwlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgJiYgb3ZlcmxhcCkgeworCQkvKiBPdmVybGFwIExlZ2FjeSBwcm90ZWN0aW9uIGRpc2FibGVkLiAqLworCQlzZXNzaW9uX2VudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IGZhbHNlOworCisJCS8qIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIEhUIE9QIG1vZGUgaWYgd2UgYXJlIEhUIEFQLiAqLworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+aHRDYXBhYmlsaXR5KSB7CisJCQkvKgorCQkJICogbm8gSFQgb3AgbW9kZSBjaGFuZ2UgaWYgYW55IG9mIHRoZSBvdmVybGFwCisJCQkgKiBwcm90ZWN0aW9uIGVuYWJsZWQuCisJCQkgKi8KKwkJCWlmICghKHNlc3Npb25fZW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zLgorCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCB8fAorCQkJCXNlc3Npb25fZW50cnktPmdMaW1PdmVybGFwSHQyMFBhcmFtcy4KKwkJCQkJcHJvdGVjdGlvbkVuYWJsZWQgfHwKKwkJCQlzZXNzaW9uX2VudHJ5LT5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLgorCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCkgJiYKKwkJCQkvKgorCQkJCSAqIENoZWNrIGlmIHRoZXJlIGlzIGEgbmVlZCB0byBjaGFuZ2UgSFQKKwkJCQkgKiBPUCBtb2RlLgorCQkJCSAqLworCQkJCShlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgPT0KKwkJCQkJCXNlc3Npb25fZW50cnktPmh0T3Blck1vZGUpKSB7CisJCQkJbGltX2VuYWJsZV9odF9yaWZzX3Byb3RlY3Rpb24obWFjX2N0eCwgZmFsc2UsCisJCQkJCW92ZXJsYXAsIGJlYWNvbnBhcmFtcywgc2Vzc2lvbl9lbnRyeSk7CisJCQkJbGltX2VuYWJsZV9odF9vYnNzX3Byb3RlY3Rpb24obWFjX2N0eCwgZmFsc2UsCisJCQkJCW92ZXJsYXAsIGJlYWNvbnBhcmFtcywgc2Vzc2lvbl9lbnRyeSk7CisJCQkJaWYgKHNlc3Npb25fZW50cnktPmdMaW1IdDIwUGFyYW1zLgorCQkJCQkJcHJvdGVjdGlvbkVuYWJsZWQpIHsKKwkJCQlpZihlSFRfQ0hBTk5FTF9XSURUSF8yME1IWiA9PQorCQkJCQlzZXNzaW9uX2VudHJ5LT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkKKwkJCQkJc2Vzc2lvbl9lbnRyeS0+aHRPcGVyTW9kZSA9CisJCQkJCQllU0lSX0hUX09QX01PREVfUFVSRTsKKwkJCQllbHNlCisJCQkJCXNlc3Npb25fZW50cnktPmh0T3Blck1vZGUgPQorCQkJCQllU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUOworCQkJCX0gZWxzZQorCQkJCQlzZXNzaW9uX2VudHJ5LT5odE9wZXJNb2RlID0KKwkJCQkJCWVTSVJfSFRfT1BfTU9ERV9QVVJFOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSAmJiAhb3ZlcmxhcCkgeworCQkvKiBEaXNhYmxlIHByb3RlY3Rpb24gZnJvbSAxMUIgc3RhdGlvbnMuICovCisJCXNlc3Npb25fZW50cnktPmdMaW0xMWJQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSBmYWxzZTsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiPT09PiAxMUIgUHJvdGVjdGlvbiBEaXNhYmxlZCIpKTsKKwkJLyogQ2hlY2sgaWYgYW55IG90aGVyIG5vbi1IVCBwcm90ZWN0aW9uIGVuYWJsZWQuICovCisJCWlmICghc2Vzc2lvbl9lbnRyeS0+Z0xpbTExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkgeworCQkJLyogUmlnaHQgbm93IHdlIGFyZSBpbiBIVCBPUCBNaXhlZCBtb2RlLiAqLworCQkJLyogQ2hhbmdlIEhUIG9wIG1vZGUgYXBwcm9wcmlhdGVseS4gKi8KKwkJCWxpbV9lbmFibGVfaHRfb2Jzc19wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLCBvdmVybGFwLAorCQkJCQliZWFjb25wYXJhbXMsIHNlc3Npb25fZW50cnkpOworCQkJLyoKKwkJCSAqIENoYW5nZSBIVCBPUCBtb2RlIHRvIDAxIGlmIGFueSBvdmVybGFwIHByb3RlY3Rpb24KKwkJCSAqIGVuYWJsZWQKKwkJCSAqLworCQkJaWYgKHNlc3Npb25fZW50cnktPmdMaW1PbGJjUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisJCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMuCisJCQkJCXByb3RlY3Rpb25FbmFibGVkIHx8CisJCQkJc2Vzc2lvbl9lbnRyeS0+Z0xpbU92ZXJsYXBIdDIwUGFyYW1zLgorCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCB8fAorCQkJCXNlc3Npb25fZW50cnktPmdMaW1PdmVybGFwTm9uR2ZQYXJhbXMuCisJCQkJCXByb3RlY3Rpb25FbmFibGVkKSB7CisJCQkJc2Vzc2lvbl9lbnRyeS0+aHRPcGVyTW9kZSA9CisJCQkJCWVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKwkJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkJCUZMKCI9PT0+IDExRyBQcm90ZWN0aW9uIERpc2FibGVkIikpOworCQkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKG1hY19jdHgsIHRydWUsCisJCQkJCQlvdmVybGFwLCBiZWFjb25wYXJhbXMsCisJCQkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJCX0gZWxzZSBpZiAoc2Vzc2lvbl9lbnRyeS0+Z0xpbUh0MjBQYXJhbXMuCisJCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCkgeworCQkJCS8qIENvbW1lbnRpbmcgYmVjYXVzZSBvZiBDUiAyNTg1ODggV0ZBIGNlcnQgKi8KKwkJCQkvKiBzZXNzaW9uX2VudHJ5LT5odE9wZXJNb2RlID0KKwkJCQllU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUOyAqLworCQkJCXNlc3Npb25fZW50cnktPmh0T3Blck1vZGUgPQorCQkJCQkJZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisJCQkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJCQlGTCgiPT09PiAxMUcgUHJvdGVjdGlvbiBEaXNhYmxlZCIpKTsKKwkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwKKwkJCQkJCW92ZXJsYXAsIGJlYWNvbnBhcmFtcywKKwkJCQkJCXNlc3Npb25fZW50cnkpOworCQkJfSBlbHNlIHsKKwkJCQlzZXNzaW9uX2VudHJ5LT5odE9wZXJNb2RlID0KKwkJCQkJCWVTSVJfSFRfT1BfTU9ERV9QVVJFOworCQkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLAorCQkJCQkJb3ZlcmxhcCwgYmVhY29ucGFyYW1zLAorCQkJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCQl9CisJCX0KKwl9CisJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCWlmICghc2Vzc2lvbl9lbnRyeS0+Z0xpbU9sYmNQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgJiYKKwkJCSFzZXNzaW9uX2VudHJ5LT5nTGltMTFiUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQkJRkwoIj09PT4gMTFHIFByb3RlY3Rpb24gRGlzYWJsZWQiKSk7CisJCQliZWFjb25wYXJhbXMtPmxsYkNvZXhpc3QgPQorCQkJCXNlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0ID0KKwkJCQkJCQlmYWxzZTsKKwkJCWJlYWNvbnBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9sbEJDT0VYSVNUX0NIQU5HRUQ7CisJCX0KKwl9CisJaWYgKExJTV9JU19CVF9BTVBfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSAmJiBvdmVybGFwKSB7CisJCS8qIE92ZXJsYXAgTGVnYWN5IHByb3RlY3Rpb24gZGlzYWJsZWQuICovCisJCXNlc3Npb25fZW50cnktPmdMaW1PbGJjUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gZmFsc2U7CisKKwkJLyogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgSFQgT1AgbW9kZSBpZmYgd2UgYXJlIEhUIEFQLiAqLworCQlpZiAoc2Vzc2lvbl9lbnRyeS0+aHRDYXBhYmlsaXR5KSB7CisJCQkvKgorCQkJICogbm8gSFQgb3AgbW9kZSBjaGFuZ2UgaWYgYW55IG9mIHRoZSBvdmVybGFwIHByb3RlY3Rpb24KKwkJCSAqIGVuYWJsZWQuCisJCQkgKi8KKwkJCWlmICghKG1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcDExZ1BhcmFtcy4KKwkJCQkJcHJvdGVjdGlvbkVuYWJsZWQgfHwKKwkJCQltYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXBIdDIwUGFyYW1zLgorCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCB8fAorCQkJCW1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLgorCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCkgJiYKKwkJCQkvKgorCQkJCSAqIENoZWNrIGlmIHRoZXJlIGlzIGEgbmVlZCB0byBjaGFuZ2UgSFQKKwkJCQkgKiBPUCBtb2RlLgorCQkJCSAqLworCQkJCShlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgPT0KKwkJCQkJCW1hY19jdHgtPmxpbS5nSFRPcGVyTW9kZSkpIHsKKwkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LAorCQkJCQlmYWxzZSwgb3ZlcmxhcCwgYmVhY29ucGFyYW1zLAorCQkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihtYWNfY3R4LAorCQkJCQlmYWxzZSwgb3ZlcmxhcCwgYmVhY29ucGFyYW1zLAorCQkJCQlzZXNzaW9uX2VudHJ5KTsKKwkJCQlpZiAoc2Vzc2lvbl9lbnRyeS0+Z0xpbUh0MjBQYXJhbXMuCisJCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCkKKwkJCQkJbWFjX2N0eC0+bGltLmdIVE9wZXJNb2RlID0KKwkJCQkJICAgIGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQ7CisJCQkJZWxzZQorCQkJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCQkJCWVTSVJfSFRfT1BfTU9ERV9QVVJFOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgJiYgIW92ZXJsYXApIHsKKwkJLyogRGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFCIHN0YXRpb25zLiAqLworCQlzZXNzaW9uX2VudHJ5LT5nTGltMTFiUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gZmFsc2U7CisJCS8qIENoZWNrIGlmIGFueSBvdGhlciBub24tSFQgcHJvdGVjdGlvbiBlbmFibGVkLiAqLworCQlpZiAoIXNlc3Npb25fZW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpIHsKKwkJCS8qIFJpZ2h0IG5vdyB3ZSBhcmUgaW4gSFQgT1AgTWl4ZWQgbW9kZS4gKi8KKwkJCS8qIENoYW5nZSBIVCBvcCBtb2RlIGFwcHJvcHJpYXRlbHkuICovCisJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwKKwkJCQkJb3ZlcmxhcCwgYmVhY29ucGFyYW1zLCBzZXNzaW9uX2VudHJ5KTsKKwkJCS8qCisJCQkgKiBDaGFuZ2UgSFQgT1AgbW9kZSB0byAwMSBpZiBhbnkgb3ZlcmxhcCBwcm90ZWN0aW9uCisJCQkgKiBlbmFibGVkCisJCQkgKi8KKwkJCWlmIChzZXNzaW9uX2VudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorCQkJCW1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcDExZ1BhcmFtcy4KKwkJCQkJcHJvdGVjdGlvbkVuYWJsZWQgfHwKKwkJCQltYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXBIdDIwUGFyYW1zLgorCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCB8fAorCQkJCW1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLgorCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCkgeworCQkJCW1hY19jdHgtPmxpbS5nSFRPcGVyTW9kZSA9CisJCQkJCWVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKwkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LAorCQkJCQkJdHJ1ZSwgb3ZlcmxhcCwgYmVhY29ucGFyYW1zLAorCQkJCQkJc2Vzc2lvbl9lbnRyeSk7CisJCQl9IGVsc2UgaWYgKHNlc3Npb25fZW50cnktPmdMaW1IdDIwUGFyYW1zLgorCQkJCXByb3RlY3Rpb25FbmFibGVkKSB7CisJCQkJbWFjX2N0eC0+bGltLmdIVE9wZXJNb2RlID0KKwkJCQkJZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKwkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LAorCQkJCQkJZmFsc2UsIG92ZXJsYXAsIGJlYWNvbnBhcmFtcywKKwkJCQkJCXNlc3Npb25fZW50cnkpOworCQkJfSBlbHNlIHsKKwkJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCQllU0lSX0hUX09QX01PREVfUFVSRTsKKwkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LAorCQkJCQkJZmFsc2UsIG92ZXJsYXAsIGJlYWNvbnBhcmFtcywKKwkJCQkJCXNlc3Npb25fZW50cnkpOworCQkJfQorCQl9CisJfQorCWlmIChMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJaWYgKCFzZXNzaW9uX2VudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCAmJgorCQkJIXNlc3Npb25fZW50cnktPmdMaW0xMWJQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgiPT09PiAxMUcgUHJvdGVjdGlvbiBEaXNhYmxlZCIpKTsKKwkJCWJlYWNvbnBhcmFtcy0+bGxiQ29leGlzdCA9CisJCQkJc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmxsYkNvZXhpc3QgPQorCQkJCQkJCQlmYWxzZTsKKwkJCWJlYWNvbnBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9sbEJDT0VYSVNUX0NIQU5HRUQ7CisJCX0KKwl9CisJLyogRm9yIHN0YXRpb24gcm9sZSAqLworCWlmICghTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgJiYKKwkJCSFMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiPT09PiAxMUcgUHJvdGVjdGlvbiBEaXNhYmxlZCIpKTsKKwkJYmVhY29ucGFyYW1zLT5sbGJDb2V4aXN0ID0KKwkJCXNlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0ID0gZmFsc2U7CisJCWJlYWNvbnBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCVBBUkFNX2xsQkNPRVhJU1RfQ0hBTkdFRDsKKwl9Cit9CisKKy8qKgorICogbGltX2VuYWJsZTExZ19wcm90ZWN0aW9uKCkgLSBGdW5jdGlvbiB0byBlbmFibGUgMTFnIHByb3RlY3Rpb24KKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlCisgKiBAZW5hYmxlOiAxPT4gZW5hYmxlIHByb3RlY3Rpb24sIDA9PiBkaXNhYmxlIHByb3RlY3Rpb24uCisgKiBAb3ZlcmxhcDogMT0+IGNhbGxlZCBmcm9tIG92ZXJsYXAgY29udGV4dCwgMCA9PiBjYWxsZWQgZnJvbSBhc3NvYyBjb250ZXh0LgorICogQGJlYWNvbnBhcmFtczogcG9pbnRlciB0byB0cFVwZGF0ZUJlYWNvblBhcmFtcworICogQHNlc3Npb25fZW50cnk6IHBvaW50ZXIgdG8gdHBQRVNlc3Npb24KKyAqCisgKiBiYXNlZCBvbiBjb25maWcgc2V0dGluZyBlbmFibGVzXGRpc2FibGVzIDExZyBwcm90ZWN0aW9uLgorICoKKyAqIFJldHVybjogU3VjY2VzcyAtIGVTSVJfU1VDQ0VTUyAtIFN1Y2Nlc3MsIEVycm9yIG51bWJlciAtIEZhaWx1cmUKKyAqLwordFNpclJldFN0YXR1cworbGltX2VuYWJsZTExZ19wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgZW5hYmxlLAorCQkJIHVpbnQ4X3Qgb3ZlcmxhcCwgdHBVcGRhdGVCZWFjb25QYXJhbXMgYmVhY29ucGFyYW1zLAorCQkJIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisKKwkvKiBvdmVybGFwcGluZyBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gY2hlY2suICovCisJaWYgKCFvdmVybGFwKSB7CisJCS8qIG5vcm1hbCBwcm90ZWN0aW9uIGNvbmZpZyBjaGVjayAqLworCQlpZiAoKExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpKSAmJgorCQkJIXNlc3Npb25fZW50cnktPmNmZ1Byb3RlY3Rpb24uZnJvbWxsYikgeworCQkJLyogcHJvdGVjdGlvbiBkaXNhYmxlZC4gKi8KKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgicHJvdGVjdGlvbiBmcm9tIDExYiBpcyBkaXNhYmxlZCIpKTsKKwkJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisJCX0gZWxzZSBpZiAoIUxJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCQlpZiAoIW1hY19jdHgtPmxpbS5jZmdQcm90ZWN0aW9uLmZyb21sbGIpIHsKKwkJCQkvKiBwcm90ZWN0aW9uIGRpc2FibGVkLiAqLworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQkJRkwoInByb3RlY3Rpb24gZnJvbSAxMWIgaXMgZGlzYWJsZWQiKSk7CisJCQkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwkJCX0KKwkJfQorCX0KKworCWlmIChlbmFibGUpIHsKKwkJbGltX2hhbmRsZV9lbmFibGUxMWdfcHJvdGVjdGlvbl9lbmFibGVkKG1hY19jdHgsIGJlYWNvbnBhcmFtcywKKwkJCQkJb3ZlcmxhcCwgc2Vzc2lvbl9lbnRyeSk7CisJfSBlbHNlIGlmICh0cnVlID09IHNlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0KSB7CisJCWxpbV9oYW5kbGVfMTFnX3Byb3RlY3Rpb25fZm9yXzExYmNvZXhpc3QobWFjX2N0eCwgYmVhY29ucGFyYW1zLAorCQkJCQlvdmVybGFwLCBzZXNzaW9uX2VudHJ5KTsKKwl9CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fZW5hYmxlX2h0X3Byb3RlY3Rpb25fZnJvbTExZworICAgXGJyaWVmIGJhc2VkIG9uIGNvZmlnIGVuYWJsZXNcZGlzYWJsZXMgcHJvdGVjdGlvbiBmcm9tIDExZy4KKyAgIFxwYXJhbSAgICAgIHVpbnQ4X3QgZW5hYmxlIDogMT0+IGVuYWJsZSBwcm90ZWN0aW9uLCAwPT4gZGlzYWJsZSBwcm90ZWN0aW9uLgorICAgXHBhcmFtICAgICAgdWludDhfdCBvdmVybGFwOiAxPT4gY2FsbGVkIGZyb20gb3ZlcmxhcCBjb250ZXh0LCAwID0+IGNhbGxlZCBmcm9tIGFzc29jIGNvbnRleHQuCisgICBccGFyYW0gICAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zCisgICBccmV0dXJuICAgICAgTm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U2lyUmV0U3RhdHVzCitsaW1fZW5hYmxlX2h0X3Byb3RlY3Rpb25fZnJvbTExZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGVuYWJsZSwKKwkJCQkgdWludDhfdCBvdmVybGFwLAorCQkJCSB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLAorCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCWlmICghcHNlc3Npb25FbnRyeS0+aHRDYXBhYmlsaXR5KQorCQlyZXR1cm4gZVNJUl9TVUNDRVNTOyAgLyogcHJvdGVjdGlvbiBmcm9tIDExZyBpcyBvbmx5IGZvciBIVCBzdGF0aW9ucy4gKi8KKworCS8qIG92ZXJsYXBwaW5nIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiBjaGVjay4gKi8KKwlpZiAob3ZlcmxhcCkgeworCQlpZiAoKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKQorCQkgICAgJiYgKCFwc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLm92ZXJsYXBGcm9tbGxnKSkgeworCQkJLyogcHJvdGVjdGlvbiBkaXNhYmxlZC4gKi8KKwkJCVBFTE9HMyhsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0czLAorCQkJCSAgICAgICBGTCgib3ZlcmxhcCBwcm90ZWN0aW9uIGZyb20gMTFnIGlzIGRpc2FibGVkIikpOworCQkJICAgICAgICk7CisJCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCQl9IGVsc2UgaWYgKExJTV9JU19CVF9BTVBfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSAmJgorCQkJICAoIXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm92ZXJsYXBGcm9tbGxnKSkgeworCQkJLyogcHJvdGVjdGlvbiBkaXNhYmxlZC4gKi8KKwkJCVBFTE9HMyhsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0czLAorCQkJCSAgICAgICBGTCgib3ZlcmxhcCBwcm90ZWN0aW9uIGZyb20gMTFnIGlzIGRpc2FibGVkIikpOworCQkJICAgICAgICk7CisJCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCQl9CisJfSBlbHNlIHsKKwkJLyogbm9ybWFsIHByb3RlY3Rpb24gY29uZmlnIGNoZWNrICovCisJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSAmJgorCQkgICAgIXBzZXNzaW9uRW50cnktPmNmZ1Byb3RlY3Rpb24uZnJvbWxsZykgeworCQkJLyogcHJvdGVjdGlvbiBkaXNhYmxlZC4gKi8KKwkJCVBFTE9HMyhsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0czLAorCQkJCSAgICAgICBGTCgicHJvdGVjdGlvbiBmcm9tIDExZyBpcyBkaXNhYmxlZCIpKTsKKwkJCSAgICAgICApCisJCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCQl9IGVsc2UgaWYgKCFMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJaWYgKCFwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5mcm9tbGxnKSB7CisJCQkJLyogcHJvdGVjdGlvbiBkaXNhYmxlZC4gKi8KKwkJCQlQRUxPRzMobGltX2xvZworCQkJCQkgICAgICAgKHBNYWMsIExPRzMsCisJCQkJCSAgICAgICBGTCgicHJvdGVjdGlvbiBmcm9tIDExZyBpcyBkaXNhYmxlZCIpKTsKKwkJCQkgICAgICAgKQorCQkJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisJCQl9CisJCX0KKwl9CisJaWYgKGVuYWJsZSkgeworCQkvKiBJZiB3ZSBhcmUgQVAgYW5kIEhUIGNhcGFibGUsIHdlIG5lZWQgdG8gc2V0IHRoZSBIVCBPUCBtb2RlICovCisJCS8qIGFwcHJvcHJpYXRlbHkuICovCisKKwkJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQlpZiAob3ZlcmxhcCkgeworCQkJCXBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zLgorCQkJCXByb3RlY3Rpb25FbmFibGVkID0gdHJ1ZTsKKwkJCQkvKiAxMWcgZXhpc3RzIGluIG92ZXJsYXAgQlNTLiAqLworCQkJCS8qIG5lZWQgbm90IHRvIGNoYW5nZSB0aGUgb3BlcmF0aW5nIG1vZGUgdG8gb3ZlcmxhcF9sZWdhY3kgKi8KKwkJCQkvKiBpZiBoaWdoZXIgb3Igc2FtZSBwcm90ZWN0aW9uIG9wZXJhdGluZyBtb2RlIGlzIGVuYWJsZWQgcmlnaHQgbm93LiAqLworCQkJCWlmICgoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZICE9CisJCQkJICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlKQorCQkJCSAgICAmJiAoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9CisJCQkJCXBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUpKSB7CisJCQkJCXBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUgPQorCQkJCQkJZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZOworCQkJCX0KKwkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihwTWFjLCB0cnVlLCBvdmVybGFwLAorCQkJCQkJCSAgICAgIHBCZWFjb25QYXJhbXMsCisJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisJCQkJbGltX2VuYWJsZV9odF9vYnNzX3Byb3RlY3Rpb24ocE1hYywgdHJ1ZSwgb3ZlcmxhcCwKKwkJCQkJCQkgICAgICBwQmVhY29uUGFyYW1zLAorCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQkJfSBlbHNlIHsKKwkJCQkvKiAxMWcgaXMgYXNzb2NpYXRlZCB0byBhbiBBUCBvcGVyYXRpbmcgaW4gMTFuIG1vZGUuICovCisJCQkJLyogQ2hhbmdlIHRoZSBIVCBvcGVyYXRpbmcgbW9kZSB0byAnbWl4ZWQgbW9kZScuICovCisJCQkJcHNlc3Npb25FbnRyeS0+Z0xpbTExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9CisJCQkJCXRydWU7CisJCQkJaWYgKGVTSVJfSFRfT1BfTU9ERV9NSVhFRCAhPQorCQkJCSAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlKSB7CisJCQkJCXBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUgPQorCQkJCQkJZVNJUl9IVF9PUF9NT0RFX01JWEVEOworCQkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihwTWFjLCB0cnVlLAorCQkJCQkJCQkgICAgICBvdmVybGFwLAorCQkJCQkJCQkgICAgICBwQmVhY29uUGFyYW1zLAorCQkJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCQkJbGltX2VuYWJsZV9odF9vYnNzX3Byb3RlY3Rpb24ocE1hYywgdHJ1ZSwKKwkJCQkJCQkJICAgICAgb3ZlcmxhcCwKKwkJCQkJCQkJICAgICAgcEJlYWNvblBhcmFtcywKKwkJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKExJTV9JU19CVF9BTVBfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJaWYgKG92ZXJsYXApIHsKKwkJCQlwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWdQYXJhbXMuCisJCQkJcHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworCQkJCS8qIDExZyBleGlzdHMgaW4gb3ZlcmxhcCBCU1MuICovCisJCQkJLyogbmVlZCBub3QgdG8gY2hhbmdlIHRoZSBvcGVyYXRpbmcgbW9kZSB0byBvdmVybGFwX2xlZ2FjeSAqLworCQkJCS8qIGlmIGhpZ2hlciBvciBzYW1lIHByb3RlY3Rpb24gb3BlcmF0aW5nIG1vZGUgaXMgZW5hYmxlZCByaWdodCBub3cuICovCisJCQkJaWYgKChlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgIT0KKwkJCQkgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSkKKwkJCQkgICAgJiYgKGVTSVJfSFRfT1BfTU9ERV9NSVhFRCAhPQorCQkJCQlwTWFjLT5saW0uZ0hUT3Blck1vZGUpKSB7CisJCQkJCXBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9CisJCQkJCQllU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1k7CisJCQkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKHBNYWMsIHRydWUsCisJCQkJCQkJCSAgICAgIG92ZXJsYXAsCisJCQkJCQkJCSAgICAgIHBCZWFjb25QYXJhbXMsCisJCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogMTFnIGlzIGFzc29jaWF0ZWQgdG8gYW4gQVAgb3BlcmF0aW5nIGluIDExbiBtb2RlLiAqLworCQkJCS8qIENoYW5nZSB0aGUgSFQgb3BlcmF0aW5nIG1vZGUgdG8gJ21peGVkIG1vZGUnLiAqLworCQkJCXBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPQorCQkJCQl0cnVlOworCQkJCWlmIChlU0lSX0hUX09QX01PREVfTUlYRUQgIT0KKwkJCQkgICAgcE1hYy0+bGltLmdIVE9wZXJNb2RlKSB7CisJCQkJCXBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9CisJCQkJCQllU0lSX0hUX09QX01PREVfTUlYRUQ7CisJCQkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKHBNYWMsIHRydWUsCisJCQkJCQkJCSAgICAgIG92ZXJsYXAsCisJCQkJCQkJCSAgICAgIHBCZWFjb25QYXJhbXMsCisJCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQkJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihwTWFjLCB0cnVlLAorCQkJCQkJCQkgICAgICBvdmVybGFwLAorCQkJCQkJCQkgICAgICBwQmVhY29uUGFyYW1zLAorCQkJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogVGhpcyBwYXJ0IGlzIGNvbW1vbiBmb3Igc3RhaXRvbiBhcyB3ZWxsLiAqLworCQlpZiAoZmFsc2UgPT0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsZ0NvZXhpc3QpIHsKKwkJCXBCZWFjb25QYXJhbXMtPmxsZ0NvZXhpc3QgPQorCQkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0ID0gdHJ1ZTsKKwkJCXBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQkJUEFSQU1fbGxHQ09FWElTVF9DSEFOR0VEOworCQl9IGVsc2UgaWYgKHRydWUgPT0KKwkJCSAgIHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zLgorCQkJICAgcHJvdGVjdGlvbkVuYWJsZWQpIHsKKwkJCS8qIEFzIG9wZXJhdGluZyBtb2RlIGNoYW5nZWQgYWZ0ZXIgRyBzdGF0aW9uIGFzc29jIHNvbWUgd2F5IHRvIHVwZGF0ZSBiZWFjb24gKi8KKwkJCS8qIFRoaXMgYWRkcmVzc2VzIHRoZSBpc3N1ZSBvZiBtb2RlIG5vdCBjaGFuZ2luZyB0byAtIDExIGluIGJlYWNvbiB3aGVuIE9CU1Mgb3ZlcmxhcCBpcyBlbmFibGVkICovCisJCQkvKiBwTWFjLT5zY2guc2NoT2JqZWN0LmZCZWFjb25DaGFuZ2VkID0gMTsgKi8KKwkJCXBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQkJUEFSQU1fbGxHQ09FWElTVF9DSEFOR0VEOworCQl9CisJfSBlbHNlIGlmICh0cnVlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0KSB7CisJCS8qIGZvciBBUCByb2xlLiAqLworCQkvKiB3ZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBIVCBPUCBtb2RlIGNoYW5nZSBpZiBuZWVkZWQuICovCisJCS8qIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIE92ZXJsYXAgY2FzZXMuICovCisKKwkJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQlpZiAob3ZlcmxhcCkgeworCQkJCS8qIE92ZXJsYXAgTGVnYWN5IHByb3RlY3Rpb24gZGlzYWJsZWQuICovCisJCQkJaWYgKHBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMubnVtU3RhID09IDApCisJCQkJCXBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zLgorCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCA9IGZhbHNlOworCisJCQkJLyogbm8gSFQgb3AgbW9kZSBjaGFuZ2UgaWYgYW55IG9mIHRoZSBvdmVybGFwIHByb3RlY3Rpb24gZW5hYmxlZC4gKi8KKwkJCQlpZiAoIQorCQkJCSAgICAocHNlc3Npb25FbnRyeS0+Z0xpbU9sYmNQYXJhbXMuCisJCQkJICAgICBwcm90ZWN0aW9uRW5hYmxlZAorCQkJCSAgICAgfHwgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXBIdDIwUGFyYW1zLgorCQkJCSAgICAgcHJvdGVjdGlvbkVuYWJsZWQKKwkJCQkgICAgIHx8IHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwTm9uR2ZQYXJhbXMuCisJCQkJICAgICBwcm90ZWN0aW9uRW5hYmxlZCkpIHsKKwkJCQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZWVkIHRvIGNoYW5nZSBIVCBPUCBtb2RlLiAqLworCQkJCQlpZiAoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZID09CisJCQkJCSAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlKSB7CisJCQkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihwTWFjLAorCQkJCQkJCQkJICAgICAgZmFsc2UsCisJCQkJCQkJCQkgICAgICBvdmVybGFwLAorCQkJCQkJCQkJICAgICAgcEJlYWNvblBhcmFtcywKKwkJCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCQkJCQkJbGltX2VuYWJsZV9odF9vYnNzX3Byb3RlY3Rpb24ocE1hYywKKwkJCQkJCQkJCSAgICAgIGZhbHNlLAorCQkJCQkJCQkJICAgICAgb3ZlcmxhcCwKKwkJCQkJCQkJCSAgICAgIHBCZWFjb25QYXJhbXMsCisJCQkJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKworCQkJCQkJaWYgKHBzZXNzaW9uRW50cnktPmdMaW1IdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSB7CisJCQkJCQlpZihlSFRfQ0hBTk5FTF9XSURUSF8yME1IWiA9PQorCQkJCQkJCXBzZXNzaW9uRW50cnktPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KQorCQkJCQkJCXBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUgPQorCQkJCQkJCQllU0lSX0hUX09QX01PREVfUFVSRTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0KKwkJCQkJCQkJZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKwkJCQkJCX0gZWxzZQorCQkJCQkJCXBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUgPQorCQkJCQkJCQllU0lSX0hUX09QX01PREVfUFVSRTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogRGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFHIHN0YXRpb25zLiAqLworCQkJCXBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPQorCQkJCQlmYWxzZTsKKwkJCQkvKiBDaGVjayBpZiBhbnkgb3RoZXIgbm9uLUhUIHByb3RlY3Rpb24gZW5hYmxlZC4gKi8KKwkJCQlpZiAoIXBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMuCisJCQkJICAgIHByb3RlY3Rpb25FbmFibGVkKSB7CisKKwkJCQkJLyogUmlnaHQgbm93IHdlIGFyZSBpbiBIVCBPUCBNaXhlZCBtb2RlLiAqLworCQkJCQkvKiBDaGFuZ2UgSFQgb3AgbW9kZSBhcHByb3ByaWF0ZWx5LiAqLworCQkJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihwTWFjLCBmYWxzZSwKKwkJCQkJCQkJICAgICAgb3ZlcmxhcCwKKwkJCQkJCQkJICAgICAgcEJlYWNvblBhcmFtcywKKwkJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisKKwkJCQkJLyogQ2hhbmdlIEhUIE9QIG1vZGUgdG8gMDEgaWYgYW55IG92ZXJsYXAgcHJvdGVjdGlvbiBlbmFibGVkICovCisJCQkJCWlmIChwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy4KKwkJCQkJICAgIHByb3RlY3Rpb25FbmFibGVkCisJCQkJCSAgICB8fCBwc2Vzc2lvbkVudHJ5LT4KKwkJCQkJICAgIGdMaW1PdmVybGFwMTFnUGFyYW1zLgorCQkJCQkgICAgcHJvdGVjdGlvbkVuYWJsZWQKKwkJCQkJICAgIHx8IHBzZXNzaW9uRW50cnktPgorCQkJCQkgICAgZ0xpbU92ZXJsYXBIdDIwUGFyYW1zLgorCQkJCQkgICAgcHJvdGVjdGlvbkVuYWJsZWQKKwkJCQkJICAgIHx8IHBzZXNzaW9uRW50cnktPgorCQkJCQkgICAgZ0xpbU92ZXJsYXBOb25HZlBhcmFtcy4KKwkJCQkJICAgIHByb3RlY3Rpb25FbmFibGVkKSB7CisJCQkJCQlwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0KKwkJCQkJCQllU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1k7CisJCQkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihwTWFjLAorCQkJCQkJCQkJICAgICAgdHJ1ZSwKKwkJCQkJCQkJCSAgICAgIG92ZXJsYXAsCisJCQkJCQkJCQkgICAgICBwQmVhY29uUGFyYW1zLAorCQkJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisJCQkJCX0gZWxzZSBpZiAocHNlc3Npb25FbnRyeS0+CisJCQkJCQkgICBnTGltSHQyMFBhcmFtcy4KKwkJCQkJCSAgIHByb3RlY3Rpb25FbmFibGVkKSB7CisJCQkJCQkvKiBDb21tZW50aW5nIGJlY2F1c2Ugb2YgQ1IgMjU4NTg4IFdGQSBjZXJ0ICovCisJCQkJCQkvKiBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsgKi8KKwkJCQkJCXBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUgPQorCQkJCQkJCWVTSVJfSFRfT1BfTU9ERV9QVVJFOworCQkJCQkJbGltX2VuYWJsZV9odF9yaWZzX3Byb3RlY3Rpb24ocE1hYywKKwkJCQkJCQkJCSAgICAgIGZhbHNlLAorCQkJCQkJCQkJICAgICAgb3ZlcmxhcCwKKwkJCQkJCQkJCSAgICAgIHBCZWFjb25QYXJhbXMsCisJCQkJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUgPQorCQkJCQkJCWVTSVJfSFRfT1BfTU9ERV9QVVJFOworCQkJCQkJbGltX2VuYWJsZV9odF9yaWZzX3Byb3RlY3Rpb24ocE1hYywKKwkJCQkJCQkJCSAgICAgIGZhbHNlLAorCQkJCQkJCQkJICAgICAgb3ZlcmxhcCwKKwkJCQkJCQkJCSAgICAgIHBCZWFjb25QYXJhbXMsCisJCQkJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICghcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMuCisJCQkgICAgcHJvdGVjdGlvbkVuYWJsZWQKKwkJCSAgICAmJiAhcHNlc3Npb25FbnRyeS0+Z0xpbTExZ1BhcmFtcy4KKwkJCSAgICBwcm90ZWN0aW9uRW5hYmxlZCkgeworCQkJCVBFTE9HMShsaW1fbG9nCisJCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkJICAgICAgIEZMCisJCQkJCQkgICAgICAgKCI9PT0+IFByb3RlY3Rpb24gZnJvbSAxMUcgRGlzYWJsZWQiKSk7CisJCQkJICAgICAgICkKKwkJCQlwQmVhY29uUGFyYW1zLT5sbGdDb2V4aXN0ID0KKwkJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsZ0NvZXhpc3QgPQorCQkJCQkJZmFsc2U7CisJCQkJcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQkJUEFSQU1fbGxHQ09FWElTVF9DSEFOR0VEOworCQkJfQorCQl9IGVsc2UgaWYgKExJTV9JU19CVF9BTVBfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJaWYgKG92ZXJsYXApIHsKKwkJCQkvKiBPdmVybGFwIExlZ2FjeSBwcm90ZWN0aW9uIGRpc2FibGVkLiAqLworCQkJCXBNYWMtPmxpbS5nTGltT3ZlcmxhcDExZ1BhcmFtcy4KKwkJCQlwcm90ZWN0aW9uRW5hYmxlZCA9IGZhbHNlOworCisJCQkJLyogbm8gSFQgb3AgbW9kZSBjaGFuZ2UgaWYgYW55IG9mIHRoZSBvdmVybGFwIHByb3RlY3Rpb24gZW5hYmxlZC4gKi8KKwkJCQlpZiAoIQorCQkJCSAgICAocHNlc3Npb25FbnRyeS0+Z0xpbU9sYmNQYXJhbXMuCisJCQkJICAgICBwcm90ZWN0aW9uRW5hYmxlZAorCQkJCSAgICAgfHwgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXBIdDIwUGFyYW1zLgorCQkJCSAgICAgcHJvdGVjdGlvbkVuYWJsZWQKKwkJCQkgICAgIHx8IHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwTm9uR2ZQYXJhbXMuCisJCQkJICAgICBwcm90ZWN0aW9uRW5hYmxlZCkpIHsKKwkJCQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZWVkIHRvIGNoYW5nZSBIVCBPUCBtb2RlLiAqLworCQkJCQlpZiAoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZID09CisJCQkJCSAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUpIHsKKwkJCQkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKHBNYWMsCisJCQkJCQkJCQkgICAgICBmYWxzZSwKKwkJCQkJCQkJCSAgICAgIG92ZXJsYXAsCisJCQkJCQkJCQkgICAgICBwQmVhY29uUGFyYW1zLAorCQkJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisJCQkJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihwTWFjLAorCQkJCQkJCQkJICAgICAgZmFsc2UsCisJCQkJCQkJCQkgICAgICBvdmVybGFwLAorCQkJCQkJCQkJICAgICAgcEJlYWNvblBhcmFtcywKKwkJCQkJCQkJCSAgICAgIHBzZXNzaW9uRW50cnkpOworCisJCQkJCQlpZiAocHNlc3Npb25FbnRyeS0+CisJCQkJCQkgICAgZ0xpbUh0MjBQYXJhbXMuCisJCQkJCQkgICAgcHJvdGVjdGlvbkVuYWJsZWQpCisJCQkJCQkJcE1hYy0+bGltLmdIVE9wZXJNb2RlID0KKwkJCQkJCQkJZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwTWFjLT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCQkJCQllU0lSX0hUX09QX01PREVfUFVSRTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogRGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFHIHN0YXRpb25zLiAqLworCQkJCXBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPQorCQkJCQlmYWxzZTsKKwkJCQkvKiBDaGVjayBpZiBhbnkgb3RoZXIgbm9uLUhUIHByb3RlY3Rpb24gZW5hYmxlZC4gKi8KKwkJCQlpZiAoIXBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMuCisJCQkJICAgIHByb3RlY3Rpb25FbmFibGVkKSB7CisKKwkJCQkJLyogUmlnaHQgbm93IHdlIGFyZSBpbiBIVCBPUCBNaXhlZCBtb2RlLiAqLworCQkJCQkvKiBDaGFuZ2UgSFQgb3AgbW9kZSBhcHByb3ByaWF0ZWx5LiAqLworCQkJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihwTWFjLCBmYWxzZSwKKwkJCQkJCQkJICAgICAgb3ZlcmxhcCwKKwkJCQkJCQkJICAgICAgcEJlYWNvblBhcmFtcywKKwkJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisKKwkJCQkJLyogQ2hhbmdlIEhUIE9QIG1vZGUgdG8gMDEgaWYgYW55IG92ZXJsYXAgcHJvdGVjdGlvbiBlbmFibGVkICovCisJCQkJCWlmIChwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy4KKwkJCQkJICAgIHByb3RlY3Rpb25FbmFibGVkCisJCQkJCSAgICB8fCBwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWdQYXJhbXMuCisJCQkJCSAgICBwcm90ZWN0aW9uRW5hYmxlZAorCQkJCQkgICAgfHwgcE1hYy0+bGltLmdMaW1PdmVybGFwSHQyMFBhcmFtcy4KKwkJCQkJICAgIHByb3RlY3Rpb25FbmFibGVkCisJCQkJCSAgICB8fCBwTWFjLT5saW0uZ0xpbU92ZXJsYXBOb25HZlBhcmFtcy4KKwkJCQkJICAgIHByb3RlY3Rpb25FbmFibGVkKSB7CisJCQkJCQlwTWFjLT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCQkJCWVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKwkJCQkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKHBNYWMsCisJCQkJCQkJCQkgICAgICB0cnVlLAorCQkJCQkJCQkJICAgICAgb3ZlcmxhcCwKKwkJCQkJCQkJCSAgICAgIHBCZWFjb25QYXJhbXMsCisJCQkJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCQkJfSBlbHNlIGlmIChwc2Vzc2lvbkVudHJ5LT4KKwkJCQkJCSAgIGdMaW1IdDIwUGFyYW1zLgorCQkJCQkJICAgcHJvdGVjdGlvbkVuYWJsZWQpIHsKKwkJCQkJCXBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9CisJCQkJCQkJZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKwkJCQkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKHBNYWMsCisJCQkJCQkJCQkgICAgICBmYWxzZSwKKwkJCQkJCQkJCSAgICAgIG92ZXJsYXAsCisJCQkJCQkJCQkgICAgICBwQmVhY29uUGFyYW1zLAorCQkJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwTWFjLT5saW0uZ0hUT3Blck1vZGUgPQorCQkJCQkJCWVTSVJfSFRfT1BfTU9ERV9QVVJFOworCQkJCQkJbGltX2VuYWJsZV9odF9yaWZzX3Byb3RlY3Rpb24ocE1hYywKKwkJCQkJCQkJCSAgICAgIGZhbHNlLAorCQkJCQkJCQkJICAgICAgb3ZlcmxhcCwKKwkJCQkJCQkJCSAgICAgIHBCZWFjb25QYXJhbXMsCisJCQkJCQkJCQkgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICghcE1hYy0+bGltLmdMaW1PdmVybGFwMTFnUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkICYmCisJCQkgICAgIXBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpIHsKKwkJCQlQRUxPRzEobGltX2xvZworCQkJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkJCSAgICAgICBGTAorCQkJCQkJICAgICAgICgiPT09PiBQcm90ZWN0aW9uIGZyb20gMTFHIERpc2FibGVkIikpOworCQkJCSAgICAgICApCisJCQkJcEJlYWNvblBhcmFtcy0+bGxnQ29leGlzdCA9CisJCQkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0ID0KKwkJCQkJCWZhbHNlOworCQkJCXBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQkJCVBBUkFNX2xsR0NPRVhJU1RfQ0hBTkdFRDsKKwkJCX0KKwkJfQorCQkvKiBmb3Igc3RhdGlvbiByb2xlICovCisJCWVsc2UgeworCQkJUEVMT0cxKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkJICAgICAgIEZMKCI9PT0+IFByb3RlY3Rpb24gZnJvbSAxMUcgRGlzYWJsZWQiKSk7CisJCQkgICAgICAgKQorCQkJcEJlYWNvblBhcmFtcy0+bGxnQ29leGlzdCA9CisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsZ0NvZXhpc3QgPSBmYWxzZTsKKwkJCXBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQkJUEFSQU1fbGxHQ09FWElTVF9DSEFOR0VEOworCQl9CisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qIEZJWE1FX1BST1RFQ1RJT04gOiBuZWVkIHRvIGNoZWNrIGZvciBubyBBUFNEIHdoZW5ldmVyIHdlIHdhbnQgdG8gZW5hYmxlIHRoaXMgcHJvdGVjdGlvbi4gKi8KKy8qIFRoaXMgY2hlY2sgd2lsbCBiZSBkb25lIGF0IHRoZSBjYWxsZXIuICovCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltRW5hYmxlSHRPYnNzUHJvdGVjdGlvbgorICAgXGJyaWVmIGJhc2VkIG9uIGNvZmlnIGVuYWJsZXNcZGlzYWJsZXMgb2JzcyBwcm90ZWN0aW9uLgorICAgXHBhcmFtICAgICAgdWludDhfdCBlbmFibGUgOiAxPT4gZW5hYmxlIHByb3RlY3Rpb24sIDA9PiBkaXNhYmxlIHByb3RlY3Rpb24uCisgICBccGFyYW0gICAgICB1aW50OF90IG92ZXJsYXA6IDE9PiBjYWxsZWQgZnJvbSBvdmVybGFwIGNvbnRleHQsIDAgPT4gY2FsbGVkIGZyb20gYXNzb2MgY29udGV4dC4KKyAgIFxwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKKyAgIFxyZXR1cm4gICAgICBOb25lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMKK2xpbV9lbmFibGVfaHRfb2Jzc19wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgZW5hYmxlLAorCQkJICAgICAgdWludDhfdCBvdmVybGFwLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLAorCQkJICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworCWlmICghcHNlc3Npb25FbnRyeS0+aHRDYXBhYmlsaXR5KQorCQlyZXR1cm4gZVNJUl9TVUNDRVNTOyAgLyogdGhpcyBwcm90ZWN0aW9uICBpcyBvbmx5IGZvciBIVCBzdGF0aW9ucy4gKi8KKworCS8qIG92ZXJsYXBwaW5nIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiBjaGVjay4gKi8KKwlpZiAob3ZlcmxhcCkgeworCQkvKiBvdmVybGFwcGluZyBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gY2hlY2suICovCisJfSBlbHNlIHsKKwkJLyogbm9ybWFsIHByb3RlY3Rpb24gY29uZmlnIGNoZWNrICovCisJCWlmICgoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpICYmCisJCSAgICAhcHNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5vYnNzKSB7IC8qIFRvRG8gVXBkYXRlIHRoaXMgZmllbGQgKi8KKwkJCS8qIHByb3RlY3Rpb24gZGlzYWJsZWQuICovCisJCQlQRUxPRzEobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkgICAgICAgRkwoInByb3RlY3Rpb24gZnJvbSBPYnNzIGlzIGRpc2FibGVkIikpOworCQkJICAgICAgICkKKwkJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisJCX0gZWxzZSBpZiAoIUxJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQlpZiAoIXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm9ic3MpIHsgLyogVG9EbyBVcGRhdGUgdGhpcyBmaWVsZCAqLworCQkJCS8qIHByb3RlY3Rpb24gZGlzYWJsZWQuICovCisJCQkJUEVMT0cxKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJCQkgICAgICAgRkwoInByb3RlY3Rpb24gZnJvbSBPYnNzIGlzIGRpc2FibGVkIikpOworCQkJCSAgICAgICApCisJCQkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwkJCX0KKwkJfQorCX0KKworCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQlpZiAoKGVuYWJsZSkKKwkJICAgICYmIChmYWxzZSA9PSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZ0hUT2Jzc01vZGUpKSB7CisJCQlQRUxPRzEobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HMSwgRkwoIj0+b2JzcyBwcm90ZWN0aW9uIGVuYWJsZWQiKSk7CisJCQkgICAgICAgKQorCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmdIVE9ic3NNb2RlID0gdHJ1ZTsKKwkJCXBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX09CU1NfTU9ERV9DSEFOR0VEOyAvKiBVUERBVEUgQU4gRU5VTSBGT1IgT0JTUyBNT0RFIDx0b2RvPiAqLworCisJCX0gZWxzZSBpZiAoIWVuYWJsZQorCQkJICAgJiYgKHRydWUgPT0KKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZ0hUT2Jzc01vZGUpKSB7CisJCQlQRUxPRzEobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkgICAgICAgRkwoIj09PT4gb2JzcyBQcm90ZWN0aW9uIGRpc2FibGVkIikpOworCQkJICAgICAgICkKKwkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5nSFRPYnNzTW9kZSA9IGZhbHNlOworCQkJcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9PQlNTX01PREVfQ0hBTkdFRDsKKworCQl9CisvKiBDUi0yNjMwMjE6IE9CU1MgYml0IGlzIG5vdCBzd2l0Y2hpbmcgYmFjayB0byAwIGFmdGVyIGRpc2FibGluZyB0aGUgb3ZlcmxhcHBpbmcgbGVnYWN5IEJTUyAqLworCQlpZiAoIWVuYWJsZSAmJiAhb3ZlcmxhcCkgeworCQkJcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPQorCQkJCWZhbHNlOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChlbmFibGUpCisJCSAgICAmJiAoZmFsc2UgPT0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmdIVE9ic3NNb2RlKSkgeworCQkJUEVMT0cxKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzEsIEZMKCI9Pm9ic3MgcHJvdGVjdGlvbiBlbmFibGVkIikpOworCQkJICAgICAgICkKKwkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5nSFRPYnNzTW9kZSA9IHRydWU7CisJCQlwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9PQlNTX01PREVfQ0hBTkdFRDsgLyogVVBEQVRFIEFOIEVOVU0gRk9SIE9CU1MgTU9ERSA8dG9kbz4gKi8KKworCQl9IGVsc2UgaWYgKCFlbmFibGUKKwkJCSAgICYmICh0cnVlID09CisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmdIVE9ic3NNb2RlKSkgeworCisJCQlQRUxPRzEobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkgICAgICAgRkwoIj09PT4gb2JzcyBQcm90ZWN0aW9uIGRpc2FibGVkIikpOworCQkJICAgICAgICkKKwkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5nSFRPYnNzTW9kZSA9IGZhbHNlOworCQkJcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9PQlNTX01PREVfQ0hBTkdFRDsKKworCQl9CisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKgorICogbGltX2hhbmRsZV9odDIwcHJvdGVjdGlvbl9lbmFibGVkKCkgLSBIYW5kbGUgaHQyMCBwcm90ZWN0aW9uICBlbmFibGVkCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBHbG9hbCBNYWMgU3RydWN0dXJlCisgKiBAb3ZlcmxhcDogdmFyaWFibGUgZm9yIG92ZXJsYXAgZGV0ZWN0aW9uCisgKiBAYmVhY29ucGFyYW1zOiBwb2ludGVyIHRvIHRwVXBkYXRlQmVhY29uUGFyYW1zCisgKiBAc2Vzc2lvbl9lbnRyeTogcG9pbnRlciB0byB0cFBFU2Vzc2lvbgorICoKKyAqIEZ1bmN0aW9uIGhhbmRsZXMgaHQyMCBwcm90ZWN0aW9uIGVuYWJsZWQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX2hhbmRsZV9odDIwcHJvdGVjdGlvbl9lbmFibGVkKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQl1aW50OF90IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIGJlYWNvbnBhcmFtcywKKwkJCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJLyoKKwkgKiBJZiB3ZSBhcmUgQVAgYW5kIEhUIGNhcGFibGUsIHdlIG5lZWQgdG8gc2V0IHRoZSBIVCBPUCBtb2RlCisJICogYXBwcm9wcmlhdGVseS4KKwkgKi8KKwlpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgJiYgb3ZlcmxhcCkgeworCQlzZXNzaW9uX2VudHJ5LT5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworCQlpZiAoKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSAhPQorCQkJCXNlc3Npb25fZW50cnktPmh0T3Blck1vZGUpICYmCisJCQkoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9CisJCQkJc2Vzc2lvbl9lbnRyeS0+aHRPcGVyTW9kZSkpIHsKKwkJCXNlc3Npb25fZW50cnktPmh0T3Blck1vZGUgPQorCQkJCWVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKwkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKG1hY19jdHgsIHRydWUsCisJCQkJb3ZlcmxhcCwgYmVhY29ucGFyYW1zLCBzZXNzaW9uX2VudHJ5KTsKKwkJfQorCX0gZWxzZSBpZiAoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgJiYgIW92ZXJsYXApIHsKKwkJc2Vzc2lvbl9lbnRyeS0+Z0xpbUh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworCQlpZiAoZVNJUl9IVF9PUF9NT0RFX1BVUkUgPT0gc2Vzc2lvbl9lbnRyeS0+aHRPcGVyTW9kZSkgeworCQkJaWYgKHNlc3Npb25fZW50cnktPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ICE9CisJCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaKQorCQkJCSBzZXNzaW9uX2VudHJ5LT5odE9wZXJNb2RlID0KKwkJCQkJZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKwkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLAorCQkJCW92ZXJsYXAsIGJlYWNvbnBhcmFtcywgc2Vzc2lvbl9lbnRyeSk7CisJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwKKwkJCQlvdmVybGFwLCBiZWFjb25wYXJhbXMsIHNlc3Npb25fZW50cnkpOworCQl9CisJfSBlbHNlIGlmIChMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgJiYgb3ZlcmxhcCkgeworCQkJbWFjX2N0eC0+bGltLmdMaW1PdmVybGFwSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9CisJCQkJdHJ1ZTsKKwkJaWYgKChlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgIT0KKwkJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUpICYmCisJCQkoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9CisJCQkJbWFjX2N0eC0+bGltLmdIVE9wZXJNb2RlKSkgeworCQkJbWFjX2N0eC0+bGltLmdIVE9wZXJNb2RlID0KKwkJCQllU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1k7CisJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LCB0cnVlLAorCQkJCW92ZXJsYXAsIGJlYWNvbnBhcmFtcywgc2Vzc2lvbl9lbnRyeSk7CisJCX0KKwl9IGVsc2UgaWYgKExJTV9JU19CVF9BTVBfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSAmJiAhb3ZlcmxhcCkgeworCQlzZXNzaW9uX2VudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisJCWlmIChlU0lSX0hUX09QX01PREVfUFVSRSA9PSBtYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUpIHsKKwkJCW1hY19jdHgtPmxpbS5nSFRPcGVyTW9kZSA9CisJCQkJZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKwkJCWxpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLAorCQkJCW92ZXJsYXAsIGJlYWNvbnBhcmFtcywgc2Vzc2lvbl9lbnRyeSk7CisJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwKKwkJCQlvdmVybGFwLCBiZWFjb25wYXJhbXMsIHNlc3Npb25fZW50cnkpOworCQl9CisJfQorCS8qIFRoaXMgcGFydCBpcyBjb21tb24gZm9yIHN0YWl0b24gYXMgd2VsbC4gKi8KKwlpZiAoZmFsc2UgPT0gc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmh0MjBDb2V4aXN0KSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCI9PiBQcm90ZWN0aW9uIGZyb20gSFQyMCBFbmFibGVkIikpOworCQliZWFjb25wYXJhbXMtPmh0MjBNaHpDb2V4aXN0ID0KKwkJCXNlc3Npb25fZW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdCA9IHRydWU7CisJCWJlYWNvbnBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCVBBUkFNX0hUMjBNSFpDT0VYSVNUX0NIQU5HRUQ7CisJfQorfQorCisvKioKKyAqIGxpbV9oYW5kbGVfaHQyMGNvZXhpc3RfaHQyMHByb3RlY3Rpb24oKSAtIGh0MjAgcHJvdGVjdGlvbiBmb3IgaHQyMCBjb2V4aXN0CisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBHbG9hbCBNYWMgU3RydWN0dXJlCisgKiBAYmVhY29ucGFyYW1zOiBwb2ludGVyIHRvIHRwVXBkYXRlQmVhY29uUGFyYW1zCisgKiBAc2Vzc2lvbl9lbnRyeTogcG9pbnRlciB0byB0cFBFU2Vzc2lvbgorICogQG92ZXJsYXA6IHZhcmlhYmxlIGZvciBvdmVybGFwIGRldGVjdGlvbgorICoKKyAqIEZ1bmN0aW9uIGhhbmRsZXMgaHQyMCBwcm90ZWN0aW9uIGZvciBodDIwIGNvZXhpc3QKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltX2hhbmRsZV9odDIwY29leGlzdF9odDIwcHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJdHBVcGRhdGVCZWFjb25QYXJhbXMgYmVhY29ucGFyYW1zLAorCQkJdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSwgdWludDhfdCBvdmVybGFwKQoreworCS8qCisJICogRm9yIEFQIHJvbGU6CisJICogd2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgSFQgT1AgbW9kZSBjaGFuZ2UgaWYgbmVlZGVkLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIE92ZXJsYXAgY2FzZXMuCisJICovCisJaWYgKExJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpICYmIG92ZXJsYXApIHsKKwkJLyogT3ZlcmxhcCBMZWdhY3kgcHJvdGVjdGlvbiBkaXNhYmxlZC4gKi8KKwkJc2Vzc2lvbl9lbnRyeS0+Z0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0KKwkJCWZhbHNlOworCQkvKgorCQkgKiBubyBIVCBvcCBtb2RlIGNoYW5nZSBpZiBhbnkgb2YgdGhlIG92ZXJsYXAKKwkJICogcHJvdGVjdGlvbiBlbmFibGVkLgorCQkgKi8KKwkJaWYgKCEoc2Vzc2lvbl9lbnRyeS0+Z0xpbU9sYmNQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgfHwKKwkJCXNlc3Npb25fZW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisJCQlzZXNzaW9uX2VudHJ5LT5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQKKwkJCXx8IHNlc3Npb25fZW50cnktPmdMaW1PdmVybGFwTm9uR2ZQYXJhbXMuCisJCQkJcHJvdGVjdGlvbkVuYWJsZWQpICYmCisJCQkvKgorCQkJICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZWVkIHRvIGNoYW5nZSBIVAorCQkJICogT1AgbW9kZS4KKwkJCSAqLworCQkJKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSA9PQorCQkJCXNlc3Npb25fZW50cnktPmh0T3Blck1vZGUpKSB7CisJCQkJaWYgKHNlc3Npb25fZW50cnktPmdMaW1IdDIwUGFyYW1zLgorCQkJCQlwcm90ZWN0aW9uRW5hYmxlZCkgeworCQkJCWlmKGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaID09CisJCQkJc2Vzc2lvbl9lbnRyeS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpCisJCQkJCXNlc3Npb25fZW50cnktPmh0T3Blck1vZGUgPQorCQkJCQkJZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisJCQkJZWxzZQorCQkJCQlzZXNzaW9uX2VudHJ5LT5odE9wZXJNb2RlID0KKwkJCQkJZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKworCQkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LAorCQkJCQkJZmFsc2UsIG92ZXJsYXAsIGJlYWNvbnBhcmFtcywKKwkJCQkJCXNlc3Npb25fZW50cnkpOworCQkJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihtYWNfY3R4LAorCQkJCQkJZmFsc2UsIG92ZXJsYXAsIGJlYWNvbnBhcmFtcywKKwkJCQkJCXNlc3Npb25fZW50cnkpOworCQkJCX0gZWxzZSB7CisJCQkJCXNlc3Npb25fZW50cnktPmh0T3Blck1vZGUgPQorCQkJCQkJZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisJCQkJfQorCQl9CisJfSBlbHNlIGlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSAmJiAhb3ZlcmxhcCkgeworCQkvKiBEaXNhYmxlIHByb3RlY3Rpb24gZnJvbSAxMUcgc3RhdGlvbnMuICovCisJCXNlc3Npb25fZW50cnktPmdMaW1IdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gZmFsc2U7CisJCS8qIENoYW5nZSBIVCBvcCBtb2RlIGFwcHJvcHJpYXRlbHkuICovCisJCWlmIChlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUID09CisJCQkJc2Vzc2lvbl9lbnRyeS0+aHRPcGVyTW9kZSkgeworCQkJc2Vzc2lvbl9lbnRyeS0+aHRPcGVyTW9kZSA9CisJCQkJZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwKKwkJCQkJb3ZlcmxhcCwgYmVhY29ucGFyYW1zLCBzZXNzaW9uX2VudHJ5KTsKKwkJCWxpbV9lbmFibGVfaHRfb2Jzc19wcm90ZWN0aW9uKG1hY19jdHgsIGZhbHNlLAorCQkJCQlvdmVybGFwLCBiZWFjb25wYXJhbXMsIHNlc3Npb25fZW50cnkpOworCQl9CisJfQorCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiPT09PiBQcm90ZWN0aW9uIGZyb20gSFQgMjAgRGlzYWJsZWQiKSk7CisJCWJlYWNvbnBhcmFtcy0+aHQyME1oekNvZXhpc3QgPQorCQkJc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmh0MjBDb2V4aXN0ID0gZmFsc2U7CisJCWJlYWNvbnBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCVBBUkFNX0hUMjBNSFpDT0VYSVNUX0NIQU5HRUQ7CisJfQorCWlmIChMSU1fSVNfQlRfQU1QX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkgJiYgb3ZlcmxhcCkgeworCQkvKiBPdmVybGFwIExlZ2FjeSBwcm90ZWN0aW9uIGRpc2FibGVkLiAqLworCQltYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gZmFsc2U7CisJCS8qCisJCSAqIG5vIEhUIG9wIG1vZGUgY2hhbmdlIGlmIGFueSBvZiB0aGUgb3ZlcmxhcAorCQkgKiBwcm90ZWN0aW9uIGVuYWJsZWQuCisJCSAqLworCQlpZiAoIShzZXNzaW9uX2VudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorCQkJbWFjX2N0eC0+bGltLmdMaW1PdmVybGFwMTFnUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisJCQltYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisJCQltYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXBOb25HZlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB0aGVyZSBpcyBhIG5lZWQgdG8gY2hhbmdlCisJCQkgKiBIVCBPUCBtb2RlLgorCQkJICovCisJCQkmJiAoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZID09CisJCQkJbWFjX2N0eC0+bGltLmdIVE9wZXJNb2RlKSkgeworCQkJaWYgKHNlc3Npb25fZW50cnktPmdMaW1IdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSB7CisJCQkJbWFjX2N0eC0+bGltLmdIVE9wZXJNb2RlID0KKwkJCQkJZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKwkJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwKKwkJCQkJb3ZlcmxhcCwgYmVhY29ucGFyYW1zLCBzZXNzaW9uX2VudHJ5KTsKKwkJCQlsaW1fZW5hYmxlX2h0X29ic3NfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwKKwkJCQkJb3ZlcmxhcCwgYmVhY29ucGFyYW1zLCBzZXNzaW9uX2VudHJ5KTsKKwkJCX0gZWxzZSB7CisJCQkJbWFjX2N0eC0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKExJTV9JU19CVF9BTVBfQVBfUk9MRShzZXNzaW9uX2VudHJ5KSAmJiAhb3ZlcmxhcCkgeworCQkvKiBEaXNhYmxlIHByb3RlY3Rpb24gZnJvbSAxMUcgc3RhdGlvbnMuICovCisJCXNlc3Npb25fZW50cnktPmdMaW1IdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gZmFsc2U7CisKKwkJLyogQ2hhbmdlIEhUIG9wIG1vZGUgYXBwcm9wcmlhdGVseS4gKi8KKwkJaWYgKGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQgPT0KKwkJCQltYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUpIHsKKwkJCW1hY19jdHgtPmxpbS5nSFRPcGVyTW9kZSA9CisJCQkJZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisJCQlsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbihtYWNfY3R4LCBmYWxzZSwKKwkJCQlvdmVybGFwLCBiZWFjb25wYXJhbXMsIHNlc3Npb25fZW50cnkpOworCQkJbGltX2VuYWJsZV9odF9vYnNzX3Byb3RlY3Rpb24obWFjX2N0eCwgZmFsc2UsCisJCQkJb3ZlcmxhcCwgYmVhY29ucGFyYW1zLCBzZXNzaW9uX2VudHJ5KTsKKwkJfQorCX0KKwlpZiAoTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCI9PT0+IFByb3RlY3Rpb24gZnJvbSBIVCAyMCBEaXNhYmxlZCIpKTsKKwkJYmVhY29ucGFyYW1zLT5odDIwTWh6Q29leGlzdCA9CisJCQlzZXNzaW9uX2VudHJ5LT5iZWFjb25QYXJhbXMuaHQyMENvZXhpc3QgPSBmYWxzZTsKKwkJYmVhY29ucGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PQorCQkJUEFSQU1fSFQyME1IWkNPRVhJU1RfQ0hBTkdFRDsKKwl9CisKKwlpZiAoIUxJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpICYmCisJCQkhTElNX0lTX0JUX0FNUF9BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCS8qIEZvciBzdGF0aW9uIHJvbGUgKi8KKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIj09PT4gUHJvdGVjdGlvbiBmcm9tIEhUMjAgRGlzYWJsZWQiKSk7CisJCWJlYWNvbnBhcmFtcy0+aHQyME1oekNvZXhpc3QgPQorCQkJc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmh0MjBDb2V4aXN0ID0gZmFsc2U7CisJCWJlYWNvbnBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCVBBUkFNX0hUMjBNSFpDT0VYSVNUX0NIQU5HRUQ7CisJfQorfQorCisvKioKKyAqIGxpbV9lbmFibGVfaHQyMF9wcm90ZWN0aW9uKCkgLSAgRnVuY3Rpb24gdG8gZW5hYmxlIGh0MjAgcHJvdGVjdGlvbgorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBzdHJ1Y3R1cmUKKyAqIEBlbmFibGU6IDE9PiBlbmFibGUgcHJvdGVjdGlvbiwgMD0+IGRpc2FibGUgcHJvdGVjdGlvbi4KKyAqIEBvdmVybGFwOiAxPT4gY2FsbGVkIGZyb20gb3ZlcmxhcCBjb250ZXh0LCAwID0+IGNhbGxlZCBmcm9tIGFzc29jIGNvbnRleHQuCisgKiBAYmVhY29ucGFyYW1zOiBwb2ludGVyIHRvIHRwVXBkYXRlQmVhY29uUGFyYW1zCisgKiBAc2Vzc2lvbl9lbnRyeTogcG9pbnRlciB0byB0cFBFU2Vzc2lvbgorICoKKyAqIGJhc2VkIG9uIGNvZmlnIGVuYWJsZXNcZGlzYWJsZXMgcHJvdGVjdGlvbiBmcm9tIEh0MjAKKyAqCisgKiBSZXR1cm46IDAgLSBzdWNjZXNzCisgKi8KK3RTaXJSZXRTdGF0dXMgbGltX2VuYWJsZV9odDIwX3Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCBlbmFibGUsCisJCQkgICB1aW50OF90IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIGJlYWNvbnBhcmFtcywKKwkJCSAgIHRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJLyogVGhpcyBwcm90ZWN0aW9uICBpcyBvbmx5IGZvciBIVCBzdGF0aW9ucy4gKi8KKwlpZiAoIXNlc3Npb25fZW50cnktPmh0Q2FwYWJpbGl0eSkKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworCS8qIG92ZXJsYXBwaW5nIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiBjaGVjay4gKi8KKwlpZiAoIW92ZXJsYXApIHsKKwkJLyogbm9ybWFsIHByb3RlY3Rpb24gY29uZmlnIGNoZWNrICovCisJCWlmICgoTElNX0lTX0FQX1JPTEUoc2Vzc2lvbl9lbnRyeSkpICYmCisJCSAgICAhc2Vzc2lvbl9lbnRyeS0+Y2ZnUHJvdGVjdGlvbi5odDIwKSB7CisJCQkvKiBwcm90ZWN0aW9uIGRpc2FibGVkLiAqLworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0czLAorCQkJCUZMKCJwcm90ZWN0aW9uIGZyb20gSFQyMCBpcyBkaXNhYmxlZCIpKTsKKwkJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisJCX0gZWxzZSBpZiAoIUxJTV9JU19BUF9ST0xFKHNlc3Npb25fZW50cnkpKSB7CisJCQlpZiAoIW1hY19jdHgtPmxpbS5jZmdQcm90ZWN0aW9uLmh0MjApIHsKKwkJCQkvKiBwcm90ZWN0aW9uIGRpc2FibGVkLiAqLworCQkJCWxpbV9sb2cobWFjX2N0eCwgTE9HMywKKwkJCQkJRkwoInByb3RlY3Rpb24gZnJvbSBIVDIwIGlzIGRpc2FibGVkIikpOworCQkJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZW5hYmxlKQorCQlsaW1faGFuZGxlX2h0MjBwcm90ZWN0aW9uX2VuYWJsZWQobWFjX2N0eCwgb3ZlcmxhcCwKKwkJCQliZWFjb25wYXJhbXMsIHNlc3Npb25fZW50cnkpOworCWVsc2UgaWYgKHRydWUgPT0gc2Vzc2lvbl9lbnRyeS0+YmVhY29uUGFyYW1zLmh0MjBDb2V4aXN0KQorCQlsaW1faGFuZGxlX2h0MjBjb2V4aXN0X2h0MjBwcm90ZWN0aW9uKG1hY19jdHgsIGJlYWNvbnBhcmFtcywKKwkJCQkJc2Vzc2lvbl9lbnRyeSwgb3ZlcmxhcCk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIGxpbV9lbmFibGVfaHRfbm9uX2dmX3Byb3RlY3Rpb24KKyAgIFxicmllZiBiYXNlZCBvbiBjb2ZpZyBlbmFibGVzXGRpc2FibGVzIHByb3RlY3Rpb24gZnJvbSBOb25HZi4KKyAgIFxwYXJhbSAgICAgIHVpbnQ4X3QgZW5hYmxlIDogMT0+IGVuYWJsZSBwcm90ZWN0aW9uLCAwPT4gZGlzYWJsZSBwcm90ZWN0aW9uLgorICAgXHBhcmFtICAgICAgdWludDhfdCBvdmVybGFwOiAxPT4gY2FsbGVkIGZyb20gb3ZlcmxhcCBjb250ZXh0LCAwID0+IGNhbGxlZCBmcm9tIGFzc29jIGNvbnRleHQuCisgICBccGFyYW0gICAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zCisgICBccmV0dXJuICAgICAgTm9uZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U2lyUmV0U3RhdHVzCitsaW1fZW5hYmxlX2h0X25vbl9nZl9wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgZW5hYmxlLAorCQkJCXVpbnQ4X3Qgb3ZlcmxhcCwgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCWlmICghcHNlc3Npb25FbnRyeS0+aHRDYXBhYmlsaXR5KQorCQlyZXR1cm4gZVNJUl9TVUNDRVNTOyAgLyogdGhpcyBwcm90ZWN0aW9uICBpcyBvbmx5IGZvciBIVCBzdGF0aW9ucy4gKi8KKworCS8qIG92ZXJsYXBwaW5nIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiBjaGVjay4gKi8KKwlpZiAob3ZlcmxhcCkgeworCX0gZWxzZSB7CisJCS8qIG5vcm1hbCBwcm90ZWN0aW9uIGNvbmZpZyBjaGVjayAqLworCQlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgJiYKKwkJICAgICFwc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLm5vbkdmKSB7CisJCQkvKiBwcm90ZWN0aW9uIGRpc2FibGVkLiAqLworCQkJUEVMT0czKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzMsCisJCQkJICAgICAgIEZMKCJwcm90ZWN0aW9uIGZyb20gTm9uR2YgaXMgZGlzYWJsZWQiKSk7CisJCQkgICAgICAgKQorCQkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwkJfSBlbHNlIGlmICghTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJCS8qIG5vcm1hbCBwcm90ZWN0aW9uIGNvbmZpZyBjaGVjayAqLworCQkJaWYgKCFwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5ub25HZikgeworCQkJCS8qIHByb3RlY3Rpb24gZGlzYWJsZWQuICovCisJCQkJUEVMT0czKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0czLAorCQkJCQkgICAgICAgRkwKKwkJCQkJCSAgICAgICAoInByb3RlY3Rpb24gZnJvbSBOb25HZiBpcyBkaXNhYmxlZCIpKTsKKwkJCQkgICAgICAgKQorCQkJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisJCQl9CisJCX0KKwl9CisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCWlmICgoZW5hYmxlKQorCQkgICAgJiYgKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QpKSB7CisJCQlQRUxPRzEobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkgICAgICAgRkwoIiA9PiBQcm90ZWN0aW9uIGZyb20gbm9uIEdGIEVuYWJsZWQiKSk7CisJCQkgICAgICAgKQorCQkJcEJlYWNvblBhcmFtcy0+bGxuTm9uR0ZDb2V4aXN0ID0KKwkJCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0ID0gdHJ1ZTsKKwkJCXBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQkJUEFSQU1fTk9OX0dGX0RFVklDRVNfUFJFU0VOVF9DSEFOR0VEOworCQl9IGVsc2UgaWYgKCFlbmFibGUKKwkJCSAgICYmICh0cnVlID09CisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsbk5vbkdGQ29leGlzdCkpIHsKKwkJCVBFTE9HMShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJCSAgICAgICBGTCgiPT09PiBQcm90ZWN0aW9uIGZyb20gTm9uIEdGIERpc2FibGVkIikpOworCQkJICAgICAgICkKKwkJCXBCZWFjb25QYXJhbXMtPmxsbk5vbkdGQ29leGlzdCA9CisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsbk5vbkdGQ29leGlzdCA9IGZhbHNlOworCQkJcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9OT05fR0ZfREVWSUNFU19QUkVTRU5UX0NIQU5HRUQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGVuYWJsZSkKKwkJICAgICYmIChmYWxzZSA9PSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0KSkgeworCQkJUEVMT0cxKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkJICAgICAgIEZMKCIgPT4gUHJvdGVjdGlvbiBmcm9tIG5vbiBHRiBFbmFibGVkIikpOworCQkJICAgICAgICkKKwkJCXBCZWFjb25QYXJhbXMtPmxsbk5vbkdGQ29leGlzdCA9CisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsbk5vbkdGQ29leGlzdCA9IHRydWU7CisJCQlwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PQorCQkJCVBBUkFNX05PTl9HRl9ERVZJQ0VTX1BSRVNFTlRfQ0hBTkdFRDsKKwkJfSBlbHNlIGlmICghZW5hYmxlCisJCQkgICAmJiAodHJ1ZSA9PQorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QpKSB7CisJCQlQRUxPRzEobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkgICAgICAgRkwoIj09PT4gUHJvdGVjdGlvbiBmcm9tIE5vbiBHRiBEaXNhYmxlZCIpKTsKKwkJCSAgICAgICApCisJCQlwQmVhY29uUGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgPQorCQkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QgPSBmYWxzZTsKKwkJCXBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQkJUEFSQU1fTk9OX0dGX0RFVklDRVNfUFJFU0VOVF9DSEFOR0VEOworCQl9CisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fZW5hYmxlX2h0X2xzaWdfdHhvcF9wcm90ZWN0aW9uCisgICBcYnJpZWYgYmFzZWQgb24gY29maWcgZW5hYmxlc1xkaXNhYmxlcyBMc2lnVHhvcCBwcm90ZWN0aW9uLgorICAgXHBhcmFtICAgICAgdWludDhfdCBlbmFibGUgOiAxPT4gZW5hYmxlIHByb3RlY3Rpb24sIDA9PiBkaXNhYmxlIHByb3RlY3Rpb24uCisgICBccGFyYW0gICAgICB1aW50OF90IG92ZXJsYXA6IDE9PiBjYWxsZWQgZnJvbSBvdmVybGFwIGNvbnRleHQsIDAgPT4gY2FsbGVkIGZyb20gYXNzb2MgY29udGV4dC4KKyAgIFxwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKKyAgIFxyZXR1cm4gICAgICBOb25lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMKK2xpbV9lbmFibGVfaHRfbHNpZ190eG9wX3Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBlbmFibGUsCisJCQkJICAgdWludDhfdCBvdmVybGFwLAorCQkJCSAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsCisJCQkJICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlpZiAoIXBzZXNzaW9uRW50cnktPmh0Q2FwYWJpbGl0eSkKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsgIC8qIHRoaXMgcHJvdGVjdGlvbiAgaXMgb25seSBmb3IgSFQgc3RhdGlvbnMuICovCisKKwkvKiBvdmVybGFwcGluZyBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gY2hlY2suICovCisJaWYgKG92ZXJsYXApIHsKKwl9IGVsc2UgeworCQkvKiBub3JtYWwgcHJvdGVjdGlvbiBjb25maWcgY2hlY2sgKi8KKwkJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpICYmCisJCQkhcHNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5sc2lnVHhvcCkgeworCQkJLyogcHJvdGVjdGlvbiBkaXNhYmxlZC4gKi8KKwkJCVBFTE9HMyhsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0czLAorCQkJCSAgICAgICBGTAorCQkJCQkgICAgICAgKCIgcHJvdGVjdGlvbiBmcm9tIExzaWdUeG9wIG5vdCBzdXBwb3J0ZWQgaXMgZGlzYWJsZWQiKSk7CisJCQkgICAgICAgKQorCQkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwkJfSBlbHNlIGlmICghTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJCS8qIG5vcm1hbCBwcm90ZWN0aW9uIGNvbmZpZyBjaGVjayAqLworCQkJaWYgKCFwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5sc2lnVHhvcCkgeworCQkJCS8qIHByb3RlY3Rpb24gZGlzYWJsZWQuICovCisJCQkJUEVMT0czKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0czLAorCQkJCQkgICAgICAgRkwKKwkJCQkJCSAgICAgICAoIiBwcm90ZWN0aW9uIGZyb20gTHNpZ1R4b3Agbm90IHN1cHBvcnRlZCBpcyBkaXNhYmxlZCIpKTsKKwkJCQkgICAgICAgKQorCQkJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJaWYgKChlbmFibGUpCisJCSAgICAmJiAoZmFsc2UgPT0KKwkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy4KKwkJCWZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCkpIHsKKwkJCVBFTE9HMShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJCSAgICAgICBGTCgiID0+IFByb3RlY3Rpb24gZnJvbSBMc2lnVHhvcCBFbmFibGVkIikpOworCQkJICAgICAgICkKKwkJCXBCZWFjb25QYXJhbXMtPmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9CisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLgorCQkJCWZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9IHRydWU7CisJCQlwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PQorCQkJCVBBUkFNX0xTSUdfVFhPUF9GVUxMX1NVUFBPUlRfQ0hBTkdFRDsKKwkJfSBlbHNlIGlmICghZW5hYmxlCisJCQkgICAmJiAodHJ1ZSA9PQorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy4KKwkJCSAgICAgICBmTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQpKSB7CisJCQlQRUxPRzEobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCQkgICAgICAgRkwoIj09PT4gUHJvdGVjdGlvbiBmcm9tIExzaWdUeG9wIERpc2FibGVkIikpOworCQkJICAgICAgICkKKwkJCXBCZWFjb25QYXJhbXMtPmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9CisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLgorCQkJCWZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9IGZhbHNlOworCQkJcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9MU0lHX1RYT1BfRlVMTF9TVVBQT1JUX0NIQU5HRUQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGVuYWJsZSkKKwkJICAgICYmIChmYWxzZSA9PQorCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLgorCQkJZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0KSkgeworCQkJUEVMT0cxKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkJICAgICAgIEZMKCIgPT4gUHJvdGVjdGlvbiBmcm9tIExzaWdUeG9wIEVuYWJsZWQiKSk7CisJCQkgICAgICAgKQorCQkJcEJlYWNvblBhcmFtcy0+ZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0KKwkJCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuCisJCQkJZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0gdHJ1ZTsKKwkJCXBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9CisJCQkJUEFSQU1fTFNJR19UWE9QX0ZVTExfU1VQUE9SVF9DSEFOR0VEOworCQl9IGVsc2UgaWYgKCFlbmFibGUKKwkJCSAgICYmICh0cnVlID09CisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLgorCQkJICAgICAgIGZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCkpIHsKKwkJCVBFTE9HMShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJCSAgICAgICBGTCgiPT09PiBQcm90ZWN0aW9uIGZyb20gTHNpZ1R4b3AgRGlzYWJsZWQiKSk7CisJCQkgICAgICAgKQorCQkJcEJlYWNvblBhcmFtcy0+ZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0KKwkJCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuCisJCQkJZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0gZmFsc2U7CisJCQlwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PQorCQkJCVBBUkFNX0xTSUdfVFhPUF9GVUxMX1NVUFBPUlRfQ0hBTkdFRDsKKwkJfQorCX0KKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiBGSVhNRV9QUk9URUNUSU9OIDogbmVlZCB0byBjaGVjayBmb3Igbm8gQVBTRCB3aGVuZXZlciB3ZSB3YW50IHRvIGVuYWJsZSB0aGlzIHByb3RlY3Rpb24uICovCisvKiBUaGlzIGNoZWNrIHdpbGwgYmUgZG9uZSBhdCB0aGUgY2FsbGVyLiAqLworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBsaW1fZW5hYmxlX2h0X3JpZnNfcHJvdGVjdGlvbgorICAgXGJyaWVmIGJhc2VkIG9uIGNvZmlnIGVuYWJsZXNcZGlzYWJsZXMgUmlmcyBwcm90ZWN0aW9uLgorICAgXHBhcmFtICAgICAgdWludDhfdCBlbmFibGUgOiAxPT4gZW5hYmxlIHByb3RlY3Rpb24sIDA9PiBkaXNhYmxlIHByb3RlY3Rpb24uCisgICBccGFyYW0gICAgICB1aW50OF90IG92ZXJsYXA6IDE9PiBjYWxsZWQgZnJvbSBvdmVybGFwIGNvbnRleHQsIDAgPT4gY2FsbGVkIGZyb20gYXNzb2MgY29udGV4dC4KKyAgIFxwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKKyAgIFxyZXR1cm4gICAgICBOb25lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMKK2xpbV9lbmFibGVfaHRfcmlmc19wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgZW5hYmxlLAorCQkJICAgICAgdWludDhfdCBvdmVybGFwLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLAorCQkJICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlpZiAoIXBzZXNzaW9uRW50cnktPmh0Q2FwYWJpbGl0eSkKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsgIC8qIHRoaXMgcHJvdGVjdGlvbiAgaXMgb25seSBmb3IgSFQgc3RhdGlvbnMuICovCisKKwkvKiBvdmVybGFwcGluZyBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gY2hlY2suICovCisJaWYgKG92ZXJsYXApIHsKKwl9IGVsc2UgeworCQkvKiBub3JtYWwgcHJvdGVjdGlvbiBjb25maWcgY2hlY2sgKi8KKwkJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpICYmCisJCSAgICAhcHNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5yaWZzKSB7CisJCQkvKiBwcm90ZWN0aW9uIGRpc2FibGVkLiAqLworCQkJUEVMT0czKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzMsCisJCQkJICAgICAgIEZMKCIgcHJvdGVjdGlvbiBmcm9tIFJpZnMgaXMgZGlzYWJsZWQiKSk7CisJCQkgICAgICAgKQorCQkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwkJfSBlbHNlIGlmICghTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJCS8qIG5vcm1hbCBwcm90ZWN0aW9uIGNvbmZpZyBjaGVjayAqLworCQkJaWYgKCFwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5yaWZzKSB7CisJCQkJLyogcHJvdGVjdGlvbiBkaXNhYmxlZC4gKi8KKwkJCQlQRUxPRzMobGltX2xvZworCQkJCQkgICAgICAgKHBNYWMsIExPRzMsCisJCQkJCSAgICAgICBGTAorCQkJCQkJICAgICAgICgiIHByb3RlY3Rpb24gZnJvbSBSaWZzIGlzIGRpc2FibGVkIikpOworCQkJCSAgICAgICApCisJCQkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwkJCX0KKwkJfQorCX0KKworCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkvKiBEaXNhYmxpbmcgdGhlIFJJRlMgUHJvdGVjdGlvbiBtZWFucyBFbmFibGUgdGhlIFJJRlMgbW9kZSBvZiBvcGVyYXRpb24gaW4gdGhlIEJTUyAqLworCQlpZiAoKCFlbmFibGUpCisJCSAgICAmJiAoZmFsc2UgPT0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZSSUZTTW9kZSkpIHsKKwkJCVBFTE9HMShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0cxLCBGTCgiID0+IFJpZnMgcHJvdGVjdGlvbiBEaXNhYmxlZCIpKTsKKwkJCSAgICAgICApCisJCQlwQmVhY29uUGFyYW1zLT5mUklGU01vZGUgPQorCQkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGUgPSB0cnVlOworCQkJcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9SSUZTX01PREVfQ0hBTkdFRDsKKwkJfQorCQkvKiBFbmFibGluZyB0aGUgUklGUyBQcm90ZWN0aW9uIG1lYW5zIERpc2FibGUgdGhlIFJJRlMgbW9kZSBvZiBvcGVyYXRpb24gaW4gdGhlIEJTUyAqLworCQllbHNlIGlmIChlbmFibGUKKwkJCSAmJiAodHJ1ZSA9PSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlKSkgeworCQkJUEVMT0cxKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzEsIEZMKCI9PT0+IFJpZnMgUHJvdGVjdGlvbiBFbmFibGVkIikpOworCQkJICAgICAgICkKKwkJCXBCZWFjb25QYXJhbXMtPmZSSUZTTW9kZSA9CisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZSSUZTTW9kZSA9IGZhbHNlOworCQkJcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9SSUZTX01PREVfQ0hBTkdFRDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIERpc2FibGluZyB0aGUgUklGUyBQcm90ZWN0aW9uIG1lYW5zIEVuYWJsZSB0aGUgUklGUyBtb2RlIG9mIG9wZXJhdGlvbiBpbiB0aGUgQlNTICovCisJCWlmICgoIWVuYWJsZSkKKwkJICAgICYmIChmYWxzZSA9PSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlKSkgeworCQkJUEVMT0cxKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzEsIEZMKCIgPT4gUmlmcyBwcm90ZWN0aW9uIERpc2FibGVkIikpOworCQkJICAgICAgICkKKwkJCXBCZWFjb25QYXJhbXMtPmZSSUZTTW9kZSA9CisJCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZSSUZTTW9kZSA9IHRydWU7CisJCQlwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PQorCQkJCVBBUkFNX1JJRlNfTU9ERV9DSEFOR0VEOworCQl9CisJCS8qIEVuYWJsaW5nIHRoZSBSSUZTIFByb3RlY3Rpb24gbWVhbnMgRGlzYWJsZSB0aGUgUklGUyBtb2RlIG9mIG9wZXJhdGlvbiBpbiB0aGUgQlNTICovCisJCWVsc2UgaWYgKGVuYWJsZQorCQkJICYmICh0cnVlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGUpKSB7CisJCQlQRUxPRzEobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HMSwgRkwoIj09PT4gUmlmcyBQcm90ZWN0aW9uIEVuYWJsZWQiKSk7CisJCQkgICAgICAgKQorCQkJcEJlYWNvblBhcmFtcy0+ZlJJRlNNb2RlID0KKwkJCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlID0gZmFsc2U7CisJCQlwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PQorCQkJCVBBUkFNX1JJRlNfTU9ERV9DSEFOR0VEOworCQl9CisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBsaW1fZW5hYmxlX3Nob3J0X3ByZWFtYmxlCisgKgorICogRlVOQ1RJT046CisgKiBFbmFibGUvRGlzYWJsZSBzaG9ydCBwcmVhbWJsZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGVuYWJsZSAgICAgICAgRmxhZyB0byBlbmFibGUvZGlzYWJsZSBzaG9ydCBwcmVhbWJsZQorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cworbGltX2VuYWJsZV9zaG9ydF9wcmVhbWJsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGVuYWJsZSwKKwkJCSAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywKKwkJCSAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MzJfdCB2YWw7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFLCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJLyogQ291bGQgbm90IGdldCBzaG9ydCBwcmVhbWJsZSBlbmFibGVkIGZsYWcgZnJvbSBDRkcuIExvZyBlcnJvci4gKi8KKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBzaG9ydCBwcmVhbWJsZSBmbGFnIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWlmICghdmFsKQorCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRCwgJnZhbCkgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMCisJCQkJKCJjb3VsZCBub3QgcmV0cmlldmUgMTFHIHNob3J0IHByZWFtYmxlIHN3aXRjaGluZyAgZW5hYmxlZCBmbGFnIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWlmICghdmFsKSAvKiAxMUcgc2hvcnQgcHJlYW1ibGUgc3dpdGNoaW5nIGlzIGRpc2FibGVkLiAqLworCQlyZXR1cm4gZVNJUl9TVUNDRVNTOworCisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCWlmIChlbmFibGUgJiYgKHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZSA9PSAwKSkgeworCQkJUEVMT0cxKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzEsIEZMKCI9PT0+IFNob3J0IFByZWFtYmxlIEVuYWJsZWQiKSk7CisJCQkgICAgICAgKQorCQkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZTaG9ydFByZWFtYmxlID0gdHJ1ZTsKKwkJCXBCZWFjb25QYXJhbXMtPmZTaG9ydFByZWFtYmxlID0KKwkJCQkodWludDhfdCkgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLgorCQkJCWZTaG9ydFByZWFtYmxlOworCQkJcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0KKwkJCQlQQVJBTV9TSE9SVF9QUkVBTUJMRV9DSEFOR0VEOworCQl9IGVsc2UgaWYgKCFlbmFibGUKKwkJCSAgICYmIChwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGUgPT0KKwkJCSAgICAgICAxKSkgeworCQkJUEVMT0cxKGxpbV9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPRzEsIEZMKCI9PT0+IFNob3J0IFByZWFtYmxlIERpc2FibGVkIikpOworCQkJICAgICAgICkKKwkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZSA9IGZhbHNlOworCQkJcEJlYWNvblBhcmFtcy0+ZlNob3J0UHJlYW1ibGUgPQorCQkJCSh1aW50OF90KSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuCisJCQkJZlNob3J0UHJlYW1ibGU7CisJCQlwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PQorCQkJCVBBUkFNX1NIT1JUX1BSRUFNQkxFX0NIQU5HRUQ7CisJCX0KKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKioKKyAqIGxpbV90eF9jb21wbGV0ZQorICoKKyAqIEZ1bmN0aW9uOgorICogVGhpcyBpcyBMSU0ncyB2ZXJ5IG93biAiVFggTUdNVCBmcmFtZSBjb21wbGV0ZSIgY29tcGxldGlvbiByb3V0aW5lLgorICoKKyAqIExvZ2ljOgorICogTElNIHdhbnRzIHRvIHNlbmQgYSBNR01UIGZyYW1lIChicm9hZGNhc3Qgb3IgdW5pY2FzdCkKKyAqIExJTSBhbGxvY2F0ZXMgbWVtb3J5IHVzaW5nIGNkc19wYWNrZXRfYWxsb2MoIC4uLiwgKipwRGF0YSwgKipwUGFja2V0ICkKKyAqIExJTSB0cmFuc21pdHMgdGhlIE1HTVQgZnJhbWUgdXNpbmcgdGhlIEFQSToKKyAqICB3bWFfdHhfZnJhbWUoIC4uLiBwUGFja2V0LCAuLi4sICh2b2lkICopIGxpbV90eF9jb21wbGV0ZSwgcERhdGEgKQorICogSERELCB2aWEgd21hX3R4X2ZyYW1lL0RYRSwgInRyYW5zZmVycyIgdGhlIHBhY2tldCBvdmVyIHRvIEJNVQorICogSERELCBpZiBpdCBkZXRlcm1pbmVzIHRoYXQgYSBUWCBjb21wbGV0aW9uIHJvdXRpbmUgKGluIHRoaXMgY2FzZQorICogbGltX3R4X2NvbXBsZXRlKSBoYXMgYmVlbiBwcm92aWRlZCwgd2lsbCBpbnZva2UgdGhpcyBjYWxsYmFjaworICogTElNIHdpbGwgdHJ5IHRvIGZyZWUgdGhlIFRYIE1HTVQgcGFja2V0IHRoYXQgd2FzIGVhcmxpZXIgYWxsb2NhdGVkLCBpbiBvcmRlcgorICogdG8gc2VuZCB0aGlzIE1HTVQgZnJhbWUsIHVzaW5nIHRoZSBQQUwgQVBJIGNkc19wYWNrZXRfZnJlZSggLi4uIHBEYXRhLCBwUGFja2V0ICkKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqIFByZXNlbnRseSwgdGhpcyBpcyBPTkxZIGJlaW5nIHVzZWQgZm9yIE1HTVQgZnJhbWVzL3BhY2tldHMKKyAqIFRPRE86CisgKiBXb3VsZCBpdCBkbyBnb29kIGZvciBMSU0gdG8gaGF2ZSBzb21lIHNvcnQgb2YgInNpZ25hdHVyZSIgdmFsaWRhdGlvbiB0bworICogZW5zdXJlIHRoYXQgdGhlIHBEYXRhIGFyZ3VtZW50IHBhc3NlZCBpbiB3YXMgYSBidWZmZXIgdGhhdCB3YXMgYWN0dWFsbHkKKyAqIGFsbG9jYXRlZCBieSBMSU0gYW5kL29yIGlzIG5vdCBjb3JydXB0ZWQ/CisgKgorICogTm90ZTogRklYTUUgYW5kIFRPRE8KKyAqIExvb2tzIGxpa2UgY2RzX3BhY2tldF9mcmVlKCkgaXMgaW50ZXJlc3RlZCBpbiBwUGFja2V0LiBCdXQsIHdoZW4gdGhpcyBjb21wbGV0aW9uCisgKiByb3V0aW5lIGlzIGNhbGxlZCwgb25seSBwRGF0YSBpcyBtYWRlIGF2YWlsYWJsZSB0byBMSU0hIQorICoKKyAqIEBwYXJhbSB2b2lkIEEgcG9pbnRlciB0byBwRGF0YS4gU2hvdWxkbid0IGl0IGJlIHBQYWNrZXQ/IQorICoKKyAqIEByZXR1cm4gbm9uZQorICovCit2b2lkIGxpbV90eF9jb21wbGV0ZSh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKmRhdGEsIGJvb2wgZnJlZSkKK3sKKwlpZiAoZnJlZSkKKwkJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopZGF0YSk7Cit9CisKKy8qKgorICogXGJyaWVmIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBsaW0gZ2xvYmFsIHN0cnVjdHVyZSwgaWYgQ0IgcGFyYW1ldGVycyBpbiB0aGUgQlNTCisgKiAgaGF2ZSBjaGFuZ2VkLCBhbmQgc2VuZHMgYW4gaW5kaWNhdGlvbiB0byBIQUwgYWxzbyB3aXRoIHRoZQorICogdXBkYXRlZCBIVCBQYXJhbWV0ZXJzLgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkZXRlY3QgdGhlIGNoYW5nZSBpbiB0aGUgcHJpbWFyeSBjaGFubmVsLCB0aGF0IGlzIGRvbmUgYXMgcGFydAorICogb2YgY2hhbm5lbCBTd3RpY2ggSUUgcHJvY2Vzc2luZy4KKyAqIElmIFNUQSBpcyBjb25maWd1cmVkIHdpdGggJzIwTWh6IG9ubHknIG1vZGUsIHRoZW4gdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkbyBhbnl0aGluZworICogVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBDQiBtb2RlLCBvbmx5IGlmIHRoZSBzZWxmIGNhcGFiaWxpdHkgaXMgc2V0IHRvICcyMCBhcyB3ZWxsIGFzIDQwTWh6JworICoKKyAqCisgKiBccGFyYW0gcE1hYyBQb2ludGVyIHRvIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogXHBhcmFtIHBSY3ZkSFRJbmZvIFBvaW50ZXIgdG8gSFQgSW5mbyBJRSBvYnRhaW5lZCBmcm9tIGEgIEJlYWNvbiBvcgorICogUHJvYmUgUmVzcG9uc2UKKyAqCisgKiBccGFyYW0gYnNzSWR4IEJTUyBJbmRleCBvZiB0aGUgQnNzIHRvIHdoaWNoIFN0YXRpb24gaXMgYXNzb2NpYXRlZC4KKyAqCisgKgorICovCisKK3ZvaWQgbGltX3VwZGF0ZV9zdGFfcnVuX3RpbWVfaHRfc3dpdGNoX2NobmxfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICB0RG90MTFmSUVIVEluZm8gKnBIVEluZm8sCisJCQkJCQkgICB1aW50OF90IGJzc0lkeCwKKwkJCQkJCSAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDhfdCBjZW50ZXJfZnJlcSA9IDA7CisjaWYgIWRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXVpbnQzMl90IGxvY2FsUHdyQ29uc3RyYWludDsKKyNlbmRpZgorCisJLyogSWYgc2VsZiBjYXBhYmlsaXR5IGlzIHNldCB0byAnMjBNaHogb25seScsIHRoZW4gZG8gbm90IGNoYW5nZSB0aGUgQ0IgbW9kZS4gKi8KKwlpZiAoIWxpbV9nZXRfaHRfY2FwYWJpbGl0eQorCQkgICAgKHBNYWMsIGVIVF9TVVBQT1JURURfQ0hBTk5FTF9XSURUSF9TRVQsIHBzZXNzaW9uRW50cnkpKQorCQlyZXR1cm47CisKKyNpZiAhZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQKKwkJICAgIChwTWFjLCBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlQsCisJCSAgICAmbG9jYWxQd3JDb25zdHJhaW50KSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIlVuYWJsZSB0byBnZXQgTG9jYWwgUG93ZXIgQ29uc3RyYWludCBmcm9tIGNmZyIpKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJaWYgKHBzZXNzaW9uRW50cnktPmZ0UEVDb250ZXh0LmZ0UHJlQXV0aFNlc3Npb24pIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkZUIFBSRUFVVEggY2hhbm5lbCBjaGFuZ2UgaXMgaW4gcHJvZ3Jlc3MiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocHNlc3Npb25FbnRyeS0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ICE9CisJICAgICh1aW50OF90KSBwSFRJbmZvLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0CisJICAgIHx8IHBzZXNzaW9uRW50cnktPmh0UmVjb21tZW5kZWRUeFdpZHRoU2V0ICE9CisJICAgICh1aW50OF90KSBwSFRJbmZvLT5yZWNvbW1lbmRlZFR4V2lkdGhTZXQpIHsKKwkJcHNlc3Npb25FbnRyeS0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0KKwkJCShlUGh5Q2hhbkJvbmRTdGF0ZSkgcEhUSW5mby0+c2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwkJcHNlc3Npb25FbnRyeS0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPQorCQkJKHVpbnQ4X3QpIHBIVEluZm8tPnJlY29tbWVuZGVkVHhXaWR0aFNldDsKKwkJaWYgKGVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaID09CisJCSAgICBwc2Vzc2lvbkVudHJ5LT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCkgeworCQkJaWYgKFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWSA9PQorCQkJCQlwSFRJbmZvLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KQorCQkJCWNlbnRlcl9mcmVxID0gcEhUSW5mby0+cHJpbWFyeUNoYW5uZWwgKyAyOworCQkJZWxzZSBpZiAoUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWSA9PQorCQkJCQlwSFRJbmZvLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KQorCQkJCWNlbnRlcl9mcmVxID0gcEhUSW5mby0+cHJpbWFyeUNoYW5uZWwgLSAyOworCQl9CisKKwkJLyogbm90aWZ5IEhBTCAqLworCQlsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJDaGFubmVsIEluZm9ybWF0aW9uIGluIEhUIElFIGNoYW5nZSIKKwkJCQkgICAgICAgImQ7IHNlbmRpbmcgbm90aWZpY2F0aW9uIHRvIEhBTC4iKSk7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlByaW1hcnkgQ2hhbm5lbDogJWQsIFNlY29uZGFyeSBDaGFuIgorCQkJCSAgICAgICAibmVsIE9mZnNldDogJWQsIENoYW5uZWwgV2lkdGg6ICVkIiksCisJCQlwSFRJbmZvLT5wcmltYXJ5Q2hhbm5lbCwgY2VudGVyX2ZyZXEsCisJCQlwc2Vzc2lvbkVudHJ5LT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCk7CisJCXBzZXNzaW9uRW50cnktPmNoYW5uZWxDaGFuZ2VSZWFzb25Db2RlID0KKwkJCUxJTV9TV0lUQ0hfQ0hBTk5FTF9PUEVSQVRJT047CisJCXBNYWMtPmxpbS5ncGNoYW5nZUNoYW5uZWxDYWxsYmFjayA9IE5VTEw7CisJCXBNYWMtPmxpbS5ncGNoYW5nZUNoYW5uZWxEYXRhID0gTlVMTDsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCQlsaW1fc2VuZF9zd2l0Y2hfY2hubF9wYXJhbXMocE1hYywgKHVpbnQ4X3QpIHBIVEluZm8tPnByaW1hcnlDaGFubmVsLAorCQkJCQkgICAgY2VudGVyX2ZyZXEsIDAsCisJCQkJCSAgICBwc2Vzc2lvbkVudHJ5LT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCwKKwkJCQkJICAgIHBzZXNzaW9uRW50cnktPm1heFR4UG93ZXIsCisJCQkJCSAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQkJICAgIHRydWUpOworI2Vsc2UKKwkJbGltX3NlbmRfc3dpdGNoX2NobmxfcGFyYW1zKHBNYWMsICh1aW50OF90KSBwSFRJbmZvLT5wcmltYXJ5Q2hhbm5lbCwKKwkJCQkJICAgIGNlbnRlcl9mcmVxLCAwLAorCQkJCQkgICAgcHNlc3Npb25FbnRyeS0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQsCisJCQkJCSAgICAodFBvd2VyZEJtKSBsb2NhbFB3ckNvbnN0cmFpbnQsCisJCQkJCSAgICBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwKKwkJCQkJICAgIHRydWUpOworI2VuZGlmCisKKwkJLyogSW4gY2FzZSBvZiBJQlNTLCBpZiBTVEEgc2hvdWxkIHVwZGF0ZSBIVCBJbmZvIElFIGluIGl0cyBiZWFjb25zLiAqLworCQlpZiAoTElNX0lTX0lCU1NfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJc2NoX3NldF9maXhlZF9iZWFjb25fZmllbGRzKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCQl9CisKKwl9Cit9IC8qIEVuZCBsaW1VcGRhdGVTdGFSdW5UaW1lSFRQYXJhbXMuICovCisKKy8qKgorICogXGJyaWVmIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbGltIGdsb2JhbCBzdHJ1Y3R1cmUsIGlmIGFueSBvZiB0aGUKKyAqIEhUIENhcGFiaWxpdGllcyBoYXZlIGNoYW5nZWQuCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcEhUQ2FwYWJpbGl0eSBQb2ludGVyIHRvIEhUIENhcGFiaWxpdHkgSW5mb3JtYXRpb24gRWxlbWVudAorICogb2J0YWluZWQgZnJvbSBhIEJlYWNvbiBvciBQcm9iZSBSZXNwb25zZQorICoKKyAqCisgKgorICovCisKK3ZvaWQgbGltX3VwZGF0ZV9zdGFfcnVuX3RpbWVfaHRfY2FwYWJpbGl0eSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICB0RG90MTFmSUVIVENhcHMgKnBIVENhcHMpCit7CisKKwlpZiAocE1hYy0+bGltLmdIVExzaWdUWE9QUHJvdGVjdGlvbiAhPQorCSAgICAodWludDhfdCkgcEhUQ2Fwcy0+bHNpZ1RYT1BQcm90ZWN0aW9uKSB7CisJCXBNYWMtPmxpbS5nSFRMc2lnVFhPUFByb3RlY3Rpb24gPQorCQkJKHVpbnQ4X3QpIHBIVENhcHMtPmxzaWdUWE9QUHJvdGVjdGlvbjsKKwkJLyogU2VuZCBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRvIEhBTCAqLworCX0KKworCWlmIChwTWFjLT5saW0uZ0hUQU1wZHVEZW5zaXR5ICE9ICh1aW50OF90KSBwSFRDYXBzLT5tcGR1RGVuc2l0eSkgeworCQlwTWFjLT5saW0uZ0hUQU1wZHVEZW5zaXR5ID0gKHVpbnQ4X3QpIHBIVENhcHMtPm1wZHVEZW5zaXR5OworCQkvKiBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMICovCisJfQorCisJaWYgKHBNYWMtPmxpbS5nSFRNYXhSeEFNcGR1RmFjdG9yICE9CisJICAgICh1aW50OF90KSBwSFRDYXBzLT5tYXhSeEFNUERVRmFjdG9yKSB7CisJCXBNYWMtPmxpbS5nSFRNYXhSeEFNcGR1RmFjdG9yID0KKwkJCSh1aW50OF90KSBwSFRDYXBzLT5tYXhSeEFNUERVRmFjdG9yOworCQkvKiBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMICovCisJfQorCit9IC8qIEVuZCBsaW1fdXBkYXRlX3N0YV9ydW5fdGltZV9odF9jYXBhYmlsaXR5LiAqLworCisvKioKKyAqIFxicmllZiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgbGltIGdsb2JhbCBzdHJ1Y3R1cmUsIGlmIGFueSBvZiB0aGUgSFQKKyAqIEluZm8gUGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogXHBhcmFtIHBIVEluZm8gUG9pbnRlciB0byB0aGUgSFQgSW5mbyBJRSBvYnRhaW5lZCBmcm9tIGEgQmVhY29uIG9yCisgKiBQcm9iZSBSZXNwb25zZQorICoKKyAqCisgKi8KKwordm9pZCBsaW1fdXBkYXRlX3N0YV9ydW5fdGltZV9odF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICB0RG90MTFmSUVIVEluZm8gKnBIVEluZm8sCisJCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCWlmIChwc2Vzc2lvbkVudHJ5LT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCAhPQorCSAgICAodWludDhfdCkgcEhUSW5mby0+cmVjb21tZW5kZWRUeFdpZHRoU2V0KSB7CisJCXBzZXNzaW9uRW50cnktPmh0UmVjb21tZW5kZWRUeFdpZHRoU2V0ID0KKwkJCSh1aW50OF90KSBwSFRJbmZvLT5yZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisJCS8qIFNlbmQgY2hhbmdlIG5vdGlmaWNhdGlvbiB0byBIQUwgKi8KKwl9CisKKwlpZiAocHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZSSUZTTW9kZSAhPQorCSAgICAodWludDhfdCkgcEhUSW5mby0+cmlmc01vZGUpIHsKKwkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZSSUZTTW9kZSA9CisJCQkodWludDhfdCkgcEhUSW5mby0+cmlmc01vZGU7CisJCS8qIFNlbmQgY2hhbmdlIG5vdGlmaWNhdGlvbiB0byBIQUwgKi8KKwl9CisKKwlpZiAocE1hYy0+bGltLmdIVFNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ICE9CisJICAgICh1aW50OF90KSBwSFRJbmZvLT5zZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSkgeworCQlwTWFjLT5saW0uZ0hUU2VydmljZUludGVydmFsR3JhbnVsYXJpdHkgPQorCQkJKHVpbnQ4X3QpIHBIVEluZm8tPnNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5OworCQkvKiBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMICovCisJfQorCisJaWYgKHBNYWMtPmxpbS5nSFRPcGVyTW9kZSAhPSAodFNpck1hY0hUT3BlcmF0aW5nTW9kZSkgcEhUSW5mby0+b3BNb2RlKSB7CisJCXBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9CisJCQkodFNpck1hY0hUT3BlcmF0aW5nTW9kZSkgcEhUSW5mby0+b3BNb2RlOworCQkvKiBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMICovCisJfQorCisJaWYgKHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QgIT0KKwkgICAgcEhUSW5mby0+bm9uR0ZEZXZpY2VzUHJlc2VudCkgeworCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0ID0KKwkJCSh1aW50OF90KSBwSFRJbmZvLT5ub25HRkRldmljZXNQcmVzZW50OworCX0KKworCWlmIChwTWFjLT5saW0uZ0hUU1RCQ0Jhc2ljTUNTICE9ICh1aW50OF90KSBwSFRJbmZvLT5iYXNpY1NUQkNNQ1MpIHsKKwkJcE1hYy0+bGltLmdIVFNUQkNCYXNpY01DUyA9ICh1aW50OF90KSBwSFRJbmZvLT5iYXNpY1NUQkNNQ1M7CisJCS8qIFNlbmQgY2hhbmdlIG5vdGlmaWNhdGlvbiB0byBIQUwgKi8KKwl9CisKKwlpZiAocE1hYy0+bGltLmdIVER1YWxDVFNQcm90ZWN0aW9uICE9CisJICAgICh1aW50OF90KSBwSFRJbmZvLT5kdWFsQ1RTUHJvdGVjdGlvbikgeworCQlwTWFjLT5saW0uZ0hURHVhbENUU1Byb3RlY3Rpb24gPQorCQkJKHVpbnQ4X3QpIHBIVEluZm8tPmR1YWxDVFNQcm90ZWN0aW9uOworCQkvKiBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMICovCisJfQorCisJaWYgKHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlCZWFjb24gIT0gKHVpbnQ4X3QpIHBIVEluZm8tPnNlY29uZGFyeUJlYWNvbikgeworCQlwTWFjLT5saW0uZ0hUU2Vjb25kYXJ5QmVhY29uID0KKwkJCSh1aW50OF90KSBwSFRJbmZvLT5zZWNvbmRhcnlCZWFjb247CisJCS8qIFNlbmQgY2hhbmdlIG5vdGlmaWNhdGlvbiB0byBIQUwgKi8KKwl9CisKKwlpZiAocHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCAhPQorCSAgICAodWludDhfdCkgcEhUSW5mby0+bHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQpIHsKKwkJcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9CisJCQkodWludDhfdCkgcEhUSW5mby0+bHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisJCS8qIFNlbmQgY2hhbmdlIG5vdGlmaWNhdGlvbiB0byBIQUwgKi8KKwl9CisKKwlpZiAocE1hYy0+bGltLmdIVFBDT0FjdGl2ZSAhPSAodWludDhfdCkgcEhUSW5mby0+cGNvQWN0aXZlKSB7CisJCXBNYWMtPmxpbS5nSFRQQ09BY3RpdmUgPSAodWludDhfdCkgcEhUSW5mby0+cGNvQWN0aXZlOworCQkvKiBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMICovCisJfQorCisJaWYgKHBNYWMtPmxpbS5nSFRQQ09QaGFzZSAhPSAodWludDhfdCkgcEhUSW5mby0+cGNvUGhhc2UpIHsKKwkJcE1hYy0+bGltLmdIVFBDT1BoYXNlID0gKHVpbnQ4X3QpIHBIVEluZm8tPnBjb1BoYXNlOworCQkvKiBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMICovCisJfQorCit9IC8qIEVuZCBsaW1fdXBkYXRlX3N0YV9ydW5fdGltZV9odF9pbmZvLiAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIGxpbV9wcm9jZXNzX2hhbF9pbmRfbWVzc2FnZXMKKyAgIFxicmllZiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgSEFMIGluZGljYXRpb24KKyAgIFxwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKKyAgIFxwYXJhbSAgICB1aW50MzJfdCBtZXNnSWQKKyAgIFxwYXJhbSAgICB2b2lkICptZXNnUGFyYW0KKyAgIFxyZXR1cm4gdFNpclJldFN0YXR1IC0gc3RhdHVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBsaW1fcHJvY2Vzc19oYWxfaW5kX21lc3NhZ2VzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IG1zZ0lkLAorCQkJCQkgICB2b2lkICptc2dQYXJhbSkKK3sKKwkvKiBpdHMgUEUncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIG1zZ3BhcmFtIHdoZW4gaXRzIGRvbmUgZXh0cmFjdGluZyB0aGUgbWVzc2FnZSBwYXJhbWV0ZXJzLiAqLworCXRTaXJNc2dRIG1zZzsKKworCXN3aXRjaCAobXNnSWQpIHsKKwljYXNlIFNJUl9MSU1fREVMX1RTX0lORDoKKwljYXNlIFNJUl9MSU1fREVMRVRFX1NUQV9DT05URVhUX0lORDoKKwljYXNlIFNJUl9MSU1fQkVBQ09OX0dFTl9JTkQ6CisJCW1zZy50eXBlID0gKHVpbnQxNl90KSBtc2dJZDsKKwkJbXNnLmJvZHlwdHIgPSBtc2dQYXJhbTsKKwkJbXNnLmJvZHl2YWwgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWNkZl9tZW1fZnJlZShtc2dQYXJhbSk7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImludmFsaWQgbWVzc2FnZSBpZCA9ICVkIHJlY2VpdmVkIiksCisJCQltc2dJZCk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJaWYgKGxpbV9wb3N0X21zZ19hcGkocE1hYywgJm1zZykgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWNkZl9tZW1fZnJlZShtc2dQYXJhbSk7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImxpbV9wb3N0X21zZ19hcGkgZmFpbGVkIGZvciBtc2dpZCA9ICVkIiksCisJCQltc2cudHlwZSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKgorICogbGltX3ZhbGlkYXRlX2RlbHRzX3JlcSgpIC0gVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgRGVsVHMgcmVxCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBHbG9iYWwgTWFjIHN0cnVjdHVyZQorICogQGRlbHRzX3JlcTogcG9pbnRlciB0byBkZWxldGUgdHJhZmZpYyBzdHJlYW0gc3RydWN0dXJlCisgKiBAcGVlcl9tYWNfYWRkcjogdmFyaWFibGUgZm9yIHBlZXIgbWFjIGFkZHJlc3MKKyAqCisgKiBGdW5jdGlvbiB2YWxpZGF0ZXMgRGVsVHMgcmVxIG9yaWdpbmF0ZWQgYnkgU01FIG9yIGJ5IEhBTCBhbmQgYWxzbworICogc2VuZHMgaGFsTXNnX0RlbFRzIHRvIEhBTAorICoKKyAqIFJldHVybjogZVNJUl9TVUNDRVNTIC0gU3VjY2VzcywgZVNJUl9GQUlMVVJFIC0gRmFpbHVyZQorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbV92YWxpZGF0ZV9kZWx0c19yZXEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdHBTaXJEZWx0c1JlcSBkZWx0c19yZXEsCisJCSAgICAgICB0U2lyTWFjQWRkciBwZWVyX21hY19hZGRyLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbl9lbnRyeSkKK3sKKwl0cERwaEhhc2hOb2RlIHN0YTsKKwl1aW50OF90IHRzX3N0YXR1czsKKwl0U2lyTWFjVFNJbmZvICp0c2luZm87CisJdWludDMyX3QgaTsKKwl1aW50OF90IHRzcGVjX2lkeDsKKworCS8qCisJICogaWYgc3RhCisJICogIC0gdmVyaWZ5IGFzc29jIHN0YXRlCisJICogIC0gZGVsIHRzcGVjIGxvY2FsbHkKKwkgKiBpZiBhcAorCSAqICAtIHZlcmlmeSBzdGEgaXMgaW4gYXNzb2Mgc3RhdGUKKwkgKiAgLSBkZWwgc3RhIHRzcGVjIGxvY2FsbHkKKwkgKi8KKwlpZiAoZGVsdHNfcmVxID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkRlbGV0ZSBUUyByZXF1ZXN0IHBvaW50ZXIgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlpZiAoTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uX2VudHJ5KSB8fAorCQlMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHBzZXNzaW9uX2VudHJ5KSkgeworCQl1aW50MzJfdCB2YWw7CisKKwkJLyogc3RhdGlvbiBhbHdheXMgdGFsa3MgdG8gdGhlIEFQICovCisJCXN0YSA9IGRwaF9nZXRfaGFzaF9lbnRyeShtYWNfY3R4LCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwKKwkJCQkJJnBzZXNzaW9uX2VudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworCQl2YWwgPSBzaXplb2YodFNpck1hY0FkZHIpOworCQlzaXJfY29weV9tYWNfYWRkcihwZWVyX21hY19hZGRyLCBwc2Vzc2lvbl9lbnRyeS0+YnNzSWQpOworCisJfSBlbHNlIHsKKwkJdWludDE2X3QgYXNzb2NpZDsKKwkJdWludDhfdCAqbWFjYWRkciA9ICh1aW50OF90ICopIHBlZXJfbWFjX2FkZHI7CisKKwkJYXNzb2NpZCA9IGRlbHRzX3JlcS0+YWlkOworCQlpZiAoYXNzb2NpZCAhPSAwKQorCQkJc3RhID0gZHBoX2dldF9oYXNoX2VudHJ5KG1hY19jdHgsIGFzc29jaWQsCisJCQkJCSZwc2Vzc2lvbl9lbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJCWVsc2UKKwkJCXN0YSA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShtYWNfY3R4LAorCQkJCQkJZGVsdHNfcmVxLT5tYWNBZGRyLAorCQkJCQkJJmFzc29jaWQsCisJCQkJCQkmcHNlc3Npb25fZW50cnktPmRwaC4KKwkJCQkJCQlkcGhIYXNoVGFibGUpOworCisJCWlmIChzdGEgIT0gTlVMTCkKKwkJCS8qIFRCRDogY2hlY2sgc3RhIGFzc29jIHN0YXRlIGFzIHdlbGwgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodFNpck1hY0FkZHIpOyBpKyspCisJCQkJbWFjYWRkcltpXSA9IHN0YS0+c3RhQWRkcltpXTsKKwl9CisKKwlpZiAoc3RhID09IE5VTEwpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkNhbm5vdCBmaW5kIHN0YXRpb24gY29udGV4dCBmb3IgZGVsdHMgcmVxIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWlmICgoIXN0YS0+dmFsaWQpIHx8CisJCShzdGEtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0KKwkJCWVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJJbnZhbGlkIFN0YSAob3Igc3RhdGUpIGZvciBEZWxUc1JlcSIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlkZWx0c19yZXEtPnJlcS53c21Uc3BlY1ByZXNlbnQgPSAwOworCWRlbHRzX3JlcS0+cmVxLndtZVRzcGVjUHJlc2VudCA9IDA7CisJZGVsdHNfcmVxLT5yZXEubGxlVHNwZWNQcmVzZW50ID0gMDsKKworCWlmICgoc3RhLT53c21FbmFibGVkKSAmJgorCQkoZGVsdHNfcmVxLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ICE9CisJCQkJCQlTSVJfTUFDX0FDQ0VTU1BPTElDWV9FRENBKSkKKwkJZGVsdHNfcmVxLT5yZXEud3NtVHNwZWNQcmVzZW50ID0gMTsKKwllbHNlIGlmIChzdGEtPndtZUVuYWJsZWQpCisJCWRlbHRzX3JlcS0+cmVxLndtZVRzcGVjUHJlc2VudCA9IDE7CisJZWxzZSBpZiAoc3RhLT5sbGVFbmFibGVkKQorCQlkZWx0c19yZXEtPnJlcS5sbGVUc3BlY1ByZXNlbnQgPSAxOworCWVsc2UgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiREVMVFNfUkVRIGlnbm9yZSAtIHFvcyBpcyBkaXNhYmxlZCIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwl0c2luZm8gPSBkZWx0c19yZXEtPnJlcS53bWVUc3BlY1ByZXNlbnQgPyAmZGVsdHNfcmVxLT5yZXEudHNwZWMudHNpbmZvCisJCQkJCQk6ICZkZWx0c19yZXEtPnJlcS50c2luZm87CisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgicmVjZWl2ZWQgREVMVFNfUkVRIG1lc3NhZ2UgKHdtZVRzcGVjUHJlc2VudCA9ICVkLCBsbGVUc3BlY1ByZXNlbnQgPSAlZCwgd3NtVHNwZWNQcmVzZW50ID0gJWQsIHRzaWQgJWQsICB1cCAlZCwgZGlyZWN0aW9uID0gJWQpIiksCisJCWRlbHRzX3JlcS0+cmVxLndtZVRzcGVjUHJlc2VudCwKKwkJZGVsdHNfcmVxLT5yZXEubGxlVHNwZWNQcmVzZW50LAorCQlkZWx0c19yZXEtPnJlcS53c21Uc3BlY1ByZXNlbnQsIHRzaW5mby0+dHJhZmZpYy50c2lkLAorCQl0c2luZm8tPnRyYWZmaWMudXNlclByaW8sIHRzaW5mby0+dHJhZmZpYy5kaXJlY3Rpb24pOworCisJLyogaWYgbm8gQWNjZXNzIENvbnRyb2wsIGlnbm9yZSB0aGUgcmVxdWVzdCAqLworCWlmIChsaW1fYWRtaXRfY29udHJvbF9kZWxldGVfdHMobWFjX2N0eCwgc3RhLT5hc3NvY0lkLCB0c2luZm8sCisJCQkJJnRzX3N0YXR1cywgJnRzcGVjX2lkeCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJFUlJPUiBERUxUUyByZXF1ZXN0IGZvciBzdGEgYXNzb2NJZCAlZCAodHNpZCAlZCwgdXAgJWQpIiksCisJCQlzdGEtPmFzc29jSWQsIHRzaW5mby0+dHJhZmZpYy50c2lkLAorCQkJdHNpbmZvLT50cmFmZmljLnVzZXJQcmlvKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9IGVsc2UgaWYgKCh0c2luZm8tPnRyYWZmaWMuYWNjZXNzUG9saWN5ID09IFNJUl9NQUNfQUNDRVNTUE9MSUNZX0hDQ0EpCisJCQkJfHwgKHRzaW5mby0+dHJhZmZpYy5hY2Nlc3NQb2xpY3kgPT0KKwkJCVNJUl9NQUNfQUNDRVNTUE9MSUNZX0JPVEgpKSB7CisJCS8qIGVkY2Egb25seSBub3cuICovCisJfSBlbHNlIGlmICh0c2luZm8tPnRyYWZmaWMuYWNjZXNzUG9saWN5ID09IFNJUl9NQUNfQUNDRVNTUE9MSUNZX0VEQ0EpIHsKKwkJLyogc2VuZCBtZXNzYWdlIHRvIEhBTCB0byBkZWxldGUgVFMgKi8KKwkJaWYgKGVTSVJfU1VDQ0VTUyAhPQorCQkJbGltX3NlbmRfaGFsX21zZ19kZWxfdHMobWFjX2N0eCwgc3RhLT5zdGFJbmRleCwKKwkJCQkJCXRzcGVjX2lkeCwgZGVsdHNfcmVxLT5yZXEsCisJCQkJCQlwc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJCQlwc2Vzc2lvbl9lbnRyeS0+YnNzSWQpKSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoIkRlbFRzIHdpdGggVVAgJWQgZmFpbGVkIGluIGxpbV9zZW5kX2hhbF9tc2dfZGVsX3RzIC0gaWdub3JpbmcgcmVxdWVzdCIpLAorCQkJCXRzaW5mby0+dHJhZmZpYy51c2VyUHJpbyk7CisJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQl9CisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gbGltX3JlZ2lzdGVyX2hhbF9pbmRfY2FsbF9iYWNrCisgICBcYnJpZWYgcmVnaXN0ZXJzIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIEhBTCBmb3IgYW55IGluZGljYXRpb24uCisgICBccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCisgICBccmV0dXJuIG5vbmUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltX3JlZ2lzdGVyX2hhbF9pbmRfY2FsbF9iYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdFNpck1zZ1EgbXNnOworCXRwSGFsSW5kQ0IgcEhhbENCOworCisJcEhhbENCID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRIYWxJbmRDQikpOworCWlmIChOVUxMID09IHBIYWxDQikgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKworCXBIYWxDQi0+cEhhbEluZENCID0gbGltX3Byb2Nlc3NfaGFsX2luZF9tZXNzYWdlczsKKworCW1zZy50eXBlID0gV01BX1JFR0lTVEVSX1BFX0NBTExCQUNLOworCW1zZy5ib2R5cHRyID0gcEhhbENCOworCW1zZy5ib2R5dmFsID0gMDsKKworCU1UUkFDRShtYWNfdHJhY2VfbXNnX3R4KHBNYWMsIE5PX1NFU1NJT04sIG1zZy50eXBlKSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnKSkgeworCQljZGZfbWVtX2ZyZWUocEhhbENCKTsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgid21hX3Bvc3RfY3RybF9tc2coKSBmYWlsZWQiKSk7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIGxpbV9wcm9jZXNzX2RlbF90c19pbmQoKSAtIGhhbmRsZSBkZWxfdHNfaW5kIGZyb20gSEFMCisgKgorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBTdHJ1Y3R1cmUKKyAqIEBsaW1fbXNnOiBwb2ludGVyIHRvIG1zZyBidWZmCisgKgorICogaGFuZGxlcyB0aGUgRGVsZXRlVFMgaW5kaWNhdGlvbiBjb21pbmcgZnJvbSBIQUwgb3IgZ2VuZXJhdGVkIGJ5IFBFIGl0c2VsZgorICogaW4gc29tZSBlcnJvciBjYXNlcy4gVmFsaWRhdGVzIHRoZSByZXF1ZXN0LCBzZW5kcyB0aGUgRGVsVHMgYWN0aW9uIGZyYW1lCisgKiB0byB0aGUgUGVlciBhbmQgc2VuZHMgRGVsVHMgaW5kaWNhdG9pbiB0byBIREQuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgbGltX3Byb2Nlc3NfZGVsX3RzX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKQoreworCXRwRHBoSGFzaE5vZGUgcFN0YTsKKwl0cERlbFRzUGFyYW1zIHBEZWxUc1BhcmFtID0gKHRwRGVsVHNQYXJhbXMpIChsaW1Nc2ctPmJvZHlwdHIpOworCXRwU2lyRGVsdHNSZXEgcERlbFRzUmVxID0gTlVMTDsKKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl0cFNpckRlbHRzUmVxSW5mbyBwRGVsVHNSZXFJbmZvOworCXRwTGltVHNwZWNJbmZvIHBUc3BlY0luZm87CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZDsKKworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywgcERlbFRzUGFyYW0tPmJzc0lkLAorCQkJJnNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gQnNzSWQiKSk7CisJCWNkZl9tZW1fZnJlZShsaW1Nc2ctPmJvZHlwdHIpOworCQlsaW1Nc2ctPmJvZHlwdHIgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJcFRzcGVjSW5mbyA9ICYocE1hYy0+bGltLnRzcGVjSW5mb1twRGVsVHNQYXJhbS0+dHNwZWNJZHhdKTsKKwlpZiAocFRzcGVjSW5mby0+aW51c2UgPT0gZmFsc2UpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTCgidHNwZWMgZW50cnkgd2l0aCBpbmRleCAlZCBpcyBub3QgaW4gdXNlIiksCisJCQkgICAgICAgcERlbFRzUGFyYW0tPnRzcGVjSWR4KTsKKwkJICAgICAgICkKKwkJZ290byBlcnJvcjE7CisJfQorCisJcFN0YSA9CisJCWRwaF9nZXRfaGFzaF9lbnRyeShwTWFjLCBwVHNwZWNJbmZvLT5hc3NvY0lkLAorCQkJCSAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAocFN0YSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJDb3VsZCBub3QgZmluZCBlbnRyeSBpbiBEUEggdGFibGUgZm9yIGFzc29jSWQgPSAlZCIpLAorCQkJcFRzcGVjSW5mby0+YXNzb2NJZCk7CisJCWdvdG8gZXJyb3IxOworCX0KKworCXBEZWxUc1JlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyRGVsdHNSZXEpKTsKKwlpZiAoTlVMTCA9PSBwRGVsVHNSZXEpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkIikpOykKKwkJZ290byBlcnJvcjE7CisJfQorCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcERlbFRzUmVxLCBzaXplb2YodFNpckRlbHRzUmVxKSwgMCk7CisKKwlpZiAocFN0YS0+d21lRW5hYmxlZCkKKwkJY2RmX21lbV9jb3B5KCYocERlbFRzUmVxLT5yZXEudHNwZWMpLCAmKHBUc3BlY0luZm8tPnRzcGVjKSwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNUc3BlY0lFKSk7CisJZWxzZQorCQljZGZfbWVtX2NvcHkoJihwRGVsVHNSZXEtPnJlcS50c2luZm8pLAorCQkJICAgICAmKHBUc3BlY0luZm8tPnRzcGVjLnRzaW5mbyksCisJCQkgICAgIHNpemVvZih0U2lyTWFjVFNJbmZvKSk7CisKKwkvKiB2YWxpZGF0ZSB0aGUgcmVxICovCisJaWYgKGVTSVJfU1VDQ0VTUyAhPQorCSAgICBsaW1fdmFsaWRhdGVfZGVsdHNfcmVxKHBNYWMsIHBEZWxUc1JlcSwgcGVlck1hY0FkZHIsIHBzZXNzaW9uRW50cnkpKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJsaW1fdmFsaWRhdGVfZGVsdHNfcmVxIGZhaWxlZCIpKTspCisJCWdvdG8gZXJyb3IyOworCX0KKwlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLCAiU2VudCBERUxUUyByZXF1ZXN0IHRvIHN0YXRpb24gd2l0aCAiCisJCSAgICAgICAiYXNzb2NJZCA9ICVkIE1hY0FkZHIgPSAiIE1BQ19BRERSRVNTX1NUUiwKKwkJICAgICAgIHBEZWxUc1JlcS0+YWlkLCBNQUNfQUREUl9BUlJBWShwZWVyTWFjQWRkcikpOworCSAgICAgICApCisKKwlsaW1fc2VuZF9kZWx0c19yZXFfYWN0aW9uX2ZyYW1lKHBNYWMsIHBlZXJNYWNBZGRyLAorCQkJCQlwRGVsVHNSZXEtPnJlcS53bWVUc3BlY1ByZXNlbnQsCisJCQkJCSZwRGVsVHNSZXEtPnJlcS50c2luZm8sCisJCQkJCSZwRGVsVHNSZXEtPnJlcS50c3BlYywgcHNlc3Npb25FbnRyeSk7CisKKwkvKiBwcmVwYXJlIGFuZCBzZW5kIGFuIHNtZSBpbmRpY2F0aW9uIHRvIEhERCAqLworCXBEZWxUc1JlcUluZm8gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpckRlbHRzUmVxSW5mbykpOworCWlmIChOVUxMID09IHBEZWxUc1JlcUluZm8pIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkIikpOykKKwkJZ290byBlcnJvcjM7CisJfQorCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBEZWxUc1JlcUluZm8sIHNpemVvZih0U2lyRGVsdHNSZXFJbmZvKSwgMCk7CisKKwlpZiAocFN0YS0+d21lRW5hYmxlZCkKKwkJY2RmX21lbV9jb3B5KCYocERlbFRzUmVxSW5mby0+dHNwZWMpLCAmKHBUc3BlY0luZm8tPnRzcGVjKSwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNUc3BlY0lFKSk7CisJZWxzZQorCQljZGZfbWVtX2NvcHkoJihwRGVsVHNSZXFJbmZvLT50c2luZm8pLAorCQkJICAgICAmKHBUc3BlY0luZm8tPnRzcGVjLnRzaW5mbyksCisJCQkgICAgIHNpemVvZih0U2lyTWFjVFNJbmZvKSk7CisKKwlsaW1fc2VuZF9zbWVfZGVsdHNfaW5kKHBNYWMsIHBEZWxUc1JlcUluZm8sIHBEZWxUc1JlcS0+YWlkLCBwc2Vzc2lvbkVudHJ5KTsKKworZXJyb3IzOgorCWNkZl9tZW1fZnJlZShwRGVsVHNSZXFJbmZvKTsKK2Vycm9yMjoKKwljZGZfbWVtX2ZyZWUocERlbFRzUmVxKTsKK2Vycm9yMToKKwljZGZfbWVtX2ZyZWUobGltTXNnLT5ib2R5cHRyKTsKKwlsaW1Nc2ctPmJvZHlwdHIgPSBOVUxMOworCXJldHVybjsKK30KKworLyoqCisgKiBAZnVuY3Rpb24gOiAgbGltX3Bvc3Rfc21fc3RhdGVfdXBkYXRlKCkKKyAqCisgKiBAYnJpZWYgIDogIFRoaXMgZnVuY3Rpb24gVXBkYXRlcyB0aGUgSEFMIGFuZCBTb2Z0bWFjIGFib3V0IHRoZSBjaGFuZ2UgaW4gdGhlIFNUQSdzIFNNUFMgc3RhdGUuCisgKgorICogICAgICBMT0dJQzoKKyAqCisgKiAgICAgIEFTU1VNUFRJT05TOgorICogICAgICAgICAgTkEKKyAqCisgKiAgICAgIE5PVEU6CisgKiAgICAgICAgICBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgbGltTXNnIC0gTGltIE1lc3NhZ2Ugc3RydWN0dXJlIG9iamVjdCB3aXRoIHRoZSBNaW1vUFNwYXJhbSBpbiBib2R5CisgKiBAcmV0dXJuIE5vbmUKKyAqLwordFNpclJldFN0YXR1cworbGltX3Bvc3Rfc21fc3RhdGVfdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgdWludDE2X3Qgc3RhSWR4LCB0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUgc3RhdGUsCisJCQkgdWludDhfdCAqcFBlZXJTdGFNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRTaXJSZXRTdGF0dXMgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKwl0U2lyTXNnUSBtc2dROworCXRwU2V0TUlNT1BTIHBNSU1PX1BTUGFyYW1zOworCisJbXNnUS5yZXNlcnZlZCA9IDA7CisJbXNnUS50eXBlID0gV01BX1NFVF9NSU1PUFNfUkVROworCisJLyogQWxsb2NhdGUgZm9yIFdNQV9TRVRfTUlNT1BTX1JFUSAqLworCXBNSU1PX1BTUGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTZXRNSU1PUFMpKTsKKwlpZiAoTlVMTCA9PSBwTUlNT19QU1BhcmFtcykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCIgQWxsb2NhdGVNZW1vcnkgZmFpbGVkIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCXBNSU1PX1BTUGFyYW1zLT5odE1JTU9QU1N0YXRlID0gc3RhdGU7CisJcE1JTU9fUFNQYXJhbXMtPnN0YUlkeCA9IHN0YUlkeDsKKwlwTUlNT19QU1BhcmFtcy0+ZnNlbmRSc3AgPSB0cnVlOworCXBNSU1PX1BTUGFyYW1zLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJY2RmX21lbV9jb3B5KHBNSU1PX1BTUGFyYW1zLT5wZWVyTWFjLCBwUGVlclN0YU1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwltc2dRLmJvZHlwdHIgPSBwTUlNT19QU1BhcmFtczsKKwltc2dRLmJvZHl2YWwgPSAwOworCisJbGltX2xvZyhwTWFjLCBMT0cyLCBGTCgiU2VuZGluZyBXTUFfU0VUX01JTU9QU19SRVEuLi4iKSk7CisKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBOT19TRVNTSU9OLCBtc2dRLnR5cGUpKTsKKwlyZXRDb2RlID0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ1EpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgiUG9zdGluZyBXTUFfU0VUX01JTU9QU19SRVEgdG8gSEFMIGZhaWxlZCEgUmVhc29uID0gJWQiKSwKKwkJCXJldENvZGUpOworCQljZGZfbWVtX2ZyZWUocE1JTU9fUFNQYXJhbXMpOworCQlyZXR1cm4gcmV0Q29kZTsKKwl9CisKKwlyZXR1cm4gcmV0Q29kZTsKK30KKwordm9pZCBsaW1fcGt0X2ZyZWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICBlRnJhbWVUeXBlIGZybVR5cGUsIHVpbnQ4X3QgKnBSeFBhY2tldEluZm8sIHZvaWQgKnBCb2R5KQoreworCSh2b2lkKXBNYWM7CisJKHZvaWQpZnJtVHlwZTsKKwkodm9pZClwUnhQYWNrZXRJbmZvOworCSh2b2lkKXBCb2R5OworfQorCisvKioKKyAqIGxpbV9nZXRfYl9kZnJvbV9yeF9wYWNrZXQoKQorICoKKyAqKipGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCBwb2ludGVyIHRvIFBvbGFyaXMKKyAqIEJ1ZmZlciBEZXNjcmlwdG9yIGNvbnRhaW5pbmcgTUFDIGhlYWRlciAmIG90aGVyIGNvbnRyb2wKKyAqIGluZm8gZnJvbSB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSBwb3N0ZWQgdG8gTElNLgorICoKKyAqKipMT0dJQzoKKyAqIE5BCisgKgorICoqKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKioqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBib2R5ICAgIC0gUmVjZWl2ZWQgbWVzc2FnZSBib2R5CisgKiBAcGFyYW0gIHBSeFBhY2tldEluZm8gICAgIC0gUG9pbnRlciB0byByZWNlaXZlZCBCRAorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltX2dldF9iX2Rmcm9tX3J4X3BhY2tldCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpib2R5LCB1aW50MzJfdCAqKnBSeFBhY2tldEluZm8pCit7CisJKnBSeFBhY2tldEluZm8gPSAodWludDMyX3QgKikgYm9keTsKK30gLyoqKiBlbmQgbGltX2dldF9iX2Rmcm9tX3J4X3BhY2tldCgpICoqKi8KKwordm9pZCBsaW1fcmVzc2V0X3NjYW5fY2hhbm5lbF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJY2RmX21lbV9zZXQoJnBNYWMtPmxpbS5zY2FuQ2huSW5mbywgc2l6ZW9mKHRMaW1TY2FuQ2huSW5mbyksIDApOworfQorCisvKioKKyAqIEBmdW5jdGlvbiA6ICBsaW1faXNfY2hhbm5lbF92YWxpZF9mb3JfY2hhbm5lbF9zd2l0Y2goKQorICoKKyAqIEBicmllZiAgOiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGNoYW5uZWwgdG8gd2hpY2ggQVAKKyAqICAgICAgICAgICAgaXMgZXhwZWN0aW5nIHVzIHRvIHN3aXRjaCwgaXMgYSB2YWxpZCBjaGFubmVsIGZvciB1cy4KKyAqICAgICAgTE9HSUM6CisgKgorICogICAgICBBU1NVTVBUSU9OUzoKKyAqICAgICAgICAgIE5BCisgKgorICogICAgICBOT1RFOgorICogICAgICAgICAgTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGNoYW5uZWwgLSBOZXcgY2hhbm5lbCB0byB3aGljaCB3ZSBhcmUgZXhwZWN0ZWQgdG8gbW92ZQorICogQHJldHVybiBOb25lCisgKi8KK3RBbmlCb29sIGxpbV9pc19jaGFubmVsX3ZhbGlkX2Zvcl9jaGFubmVsX3N3aXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNoYW5uZWwpCit7CisJdWludDhfdCBpbmRleDsKKwl1aW50MzJfdCB2YWxpZENoYW5uZWxMaXN0TGVuID0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOOworCXRTaXJNYWNDaGFuTnVtIHZhbGlkQ2hhbm5lbExpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKKworCWlmICh3bGFuX2NmZ19nZXRfc3RyKHBNYWMsIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNULAorCQkJICAgICAodWludDhfdCAqKSB2YWxpZENoYW5uZWxMaXN0LAorCQkJICAgICAodWludDMyX3QgKikgJnZhbGlkQ2hhbm5lbExpc3RMZW4pICE9CisJCQllU0lSX1NVQ0NFU1MpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIHZhbGlkIGNoYW5uZWwgbGlzdCIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFMU0U7CisJfQorCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdmFsaWRDaGFubmVsTGlzdExlbjsgaW5kZXgrKykgeworCQlpZiAodmFsaWRDaGFubmVsTGlzdFtpbmRleF0gPT0gY2hhbm5lbCkKKwkJCXJldHVybiBlU0lSX1RSVUU7CisJfQorCisJLyogY2hhbm5lbCBkb2VzIG5vdCBiZWxvbmcgdG8gbGlzdCBvZiB2YWxpZCBjaGFubmVscyAqLworCXJldHVybiBlU0lSX0ZBTFNFOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiAgICAgX19saW1fZmlsbF90eF9jb250cm9sX3BhcmFtcworICAgXGJyaWVmICBGaWxsIHRoZSBtZXNzYWdlIGZvciBzdG9wcGluZy9yZXN1bWluZyB0eC4KKworICAgXHBhcmFtICBwTWFjCisgICBccGFyYW0gIHBUeEN0cmxNc2cgLSBQb2ludGVyIHRvIHR4IGNvbnRyb2wgbWVzc2FnZS4KKyAgIFxwYXJhbSAgdHlwZSAtIFdoaWNoIHdheSB3ZSB3YW50IHRvIHN0b3AvIHJlc3VtZSB0eC4KKyAgIFxwYXJhbSAgbW9kZSAtIFRvIHN0b3AvcmVzdW1lLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgQ0RGX1NUQVRVUworX19saW1fZmlsbF90eF9jb250cm9sX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFR4Q29udHJvbFBhcmFtcyBwVHhDdHJsTXNnLAorCQkJICAgICB0TGltUXVpZXRUeE1vZGUgdHlwZSwgdExpbUNvbnRyb2xUeCBtb2RlKQoreworCisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9ICZwTWFjLT5saW0uZ3BTZXNzaW9uWzBdOworCisJaWYgKG1vZGUgPT0gZUxJTV9TVE9QX1RYKQorCQlwVHhDdHJsTXNnLT5zdG9wVHggPSB0cnVlOworCWVsc2UKKwkJcFR4Q3RybE1zZy0+c3RvcFR4ID0gZmFsc2U7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGVMSU1fVFhfQUxMOgorCQkvKiogU3RvcHMvcmVzdW1lcyB0cmFuc21pc3Npb24gY29tcGxldGVseSAqLworCQlwVHhDdHJsTXNnLT5mQ3RybEdsb2JhbCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBlTElNX1RYX0JTU19CVVRfQkVBQ09OOgorCQkvKiogU3RvcHMvcmVzdW1lcyB0cmFuc21pc3Npb24gb24gYSBwYXJ0aWN1bGFyIEJTUy4gU3RvcHBpbmcgQlNTLCBkb2VzbnQKKwkJICogIHN0b3AgYmVhY29uIHRyYW5zbWlzc2lvbi4KKwkJICovCisJCXBUeEN0cmxNc2ctPmN0cmxCc3MgPSAxOworCQlwVHhDdHJsTXNnLT5ic3NCaXRtYXAgfD0gKDEgPDwgcHNlc3Npb25FbnRyeS0+YnNzSWR4KTsKKwkJYnJlYWs7CisKKwljYXNlIGVMSU1fVFhfU1RBOgorCS8qKiBNZW1vcnkgZm9yIHN0YXRpb24gYml0bWFwIGlzIGFsbG9jYXRlZCBkeW5hbWljYWxseSBpbiBjYWxsZXIgb2YgdGhpcworCSAqICBzbyBkZWNvZGUgcHJvcGVybHkgaGVyZSBhbmQgZmlsbCB0aGUgYml0bWFwLiBOb3cgbm90IGltcGxlbWVudGVkLAorCSAqICBmYWxsIHRocm91Z2guCisJICovCisJY2FzZSBlTElNX1RYX0JTUzoKKwkvKiBGYWxsIHRocnUuLi4gKi8KKwlkZWZhdWx0OgorCQlQRUxPR1cobGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiSW52YWxpZCBjYXNlOiBOb3QgSGFuZGxlZCIpKTspCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIEBmdW5jdGlvbiA6ICBsaW1fZnJhbWVfdHJhbnNtaXNzaW9uX2NvbnRyb2woKQorICoKKyAqIEBicmllZiAgOiAgVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IHRoZSB1c2VyIHRvIGhhbHQvcmVzdW1lIGFueSBmcmFtZQorICogICAgICAgdHJhbnNtaXNzaW9uIGZyb20gdGhlIGRldmljZS4gSWYgc3RvcHBlZCwgYWxsIGZyYW1lcyB3aWxsIGJlCisgKiAgICAgICAgICAgIHF1ZXVlZCBzdGFydGluZyBmcm9tIGhhcmR3YXJlLiBUaGVuIGJhY2stcHJlc3N1cmUKKyAqICAgICAgICAgICAgaXMgYnVpbHQgdGlsbCB0aGUgZHJpdmVyLgorICogICAgICBMT0dJQzoKKyAqCisgKiAgICAgIEFTU1VNUFRJT05TOgorICogICAgICAgICAgTkEKKyAqCisgKiAgICAgIE5PVEU6CisgKiAgICAgICAgICBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbV9mcmFtZV90cmFuc21pc3Npb25fY29udHJvbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0TGltUXVpZXRUeE1vZGUgdHlwZSwKKwkJCQkgICAgdExpbUNvbnRyb2xUeCBtb2RlKQoreworCisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cFR4Q29udHJvbFBhcmFtcyBwVHhDdHJsTXNnOworCXRTaXJNc2dRIG1zZ1E7CisJdWludDhfdCBuQnl0ZXMgPSAwOyAvKiBObyBvZiBieXRlcyByZXF1aXJlZCBmb3Igc3RhdGlvbiBiaXRtYXAuICovCisKKwkvKiogQWxsb2NhdGUgb25seSByZXF1aXJlZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHN0YXRpb24gYml0bWFwCisJICogTWFrZSBpdCB0byBhbGlnbiB0byA0IGJ5dGUgYm91bmRhcnkgICovCisJbkJ5dGVzID0gKHVpbnQ4X3QpIEhBTE1TR19OVU1CWVRFU19TVEFUSU9OX0JJVE1BUChwTWFjLT5saW0ubWF4U3RhdGlvbik7CisKKwlwVHhDdHJsTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwVHhDdHJsTXNnKSArIG5CeXRlcyk7CisJaWYgKE5VTEwgPT0gcFR4Q3RybE1zZykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsIEZMKCJBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKworCWNkZl9tZW1fc2V0KCh2b2lkICopcFR4Q3RybE1zZywgKHNpemVvZigqcFR4Q3RybE1zZykgKyBuQnl0ZXMpLCAwKTsKKwlzdGF0dXMgPSBfX2xpbV9maWxsX3R4X2NvbnRyb2xfcGFyYW1zKHBNYWMsIHBUeEN0cmxNc2csIHR5cGUsIG1vZGUpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWNkZl9tZW1fZnJlZShwVHhDdHJsTXNnKTsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIl9fbGltX2ZpbGxfdHhfY29udHJvbF9wYXJhbXMgZmFpbGVkLCBzdGF0dXMgPSAlZCIpLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCW1zZ1EuYm9keXB0ciA9ICh2b2lkICopcFR4Q3RybE1zZzsKKwltc2dRLmJvZHl2YWwgPSAwOworCW1zZ1EucmVzZXJ2ZWQgPSAwOworCW1zZ1EudHlwZSA9IFdNQV9UUkFOU01JU1NJT05fQ09OVFJPTF9JTkQ7CisKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBOT19TRVNTSU9OLCBtc2dRLnR5cGUpKTsKKwlpZiAod21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ1EpICE9IGVTSVJfU1VDQ0VTUykgeworCQljZGZfbWVtX2ZyZWUocFR4Q3RybE1zZyk7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIlBvc3RpbmcgTWVzc2FnZSB0byBIQUwgZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1vZGUgPT0gZUxJTV9TVE9QX1RYKSB7CisJCVBFTE9HMShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJTdG9wcGluZyB0aGUgdHJhbnNtaXNzaW9uIG9mIGFsbCBwYWNrZXRzLCBpbmRpY2F0ZWQgc29mdG1hYyIpKTsKKwkJICAgICAgICkKKwl9IGVsc2UgeworCQlQRUxPRzEobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiUmVzdW1pbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBhbGwgcGFja2V0cywgaW5kaWNhdGVkIHNvZnRtYWMiKSk7CisJCSAgICAgICApCisJfQorCXJldHVybjsKK30KKworLyoqCisgKiBAZnVuY3Rpb24gOiAgbGltX3Jlc3RvcmVfcHJlX2NoYW5uZWxfc3dpdGNoX3N0YXRlKCkKKyAqCisgKiBAYnJpZWYgIDogIFRoaXMgQVBJIGlzIGNhbGxlZCBieSB0aGUgdXNlciB0byB1bmRvIGFueQorICogICAgICAgICAgICBzcGVjaWZpYyBjaGFuZ2VzIGRvbmUgb24gdGhlIGRldmljZSBkdXJpbmcKKyAqICAgICAgICAgICAgY2hhbm5lbCBzd2l0Y2guCisgKiAgICAgIExPR0lDOgorICoKKyAqICAgICAgQVNTVU1QVElPTlM6CisgKiAgICAgICAgICBOQQorICoKKyAqICAgICAgTk9URToKKyAqICAgICAgICAgIE5BCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cworbGltX3Jlc3RvcmVfcHJlX2NoYW5uZWxfc3dpdGNoX3N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisKKwlpZiAoIUxJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkKKwkJcmV0dXJuIHJldENvZGU7CisKKwkvKiBDaGFubmVsIHN3aXRjaCBzaG91bGQgYmUgcmVhZHkgZm9yIHRoZSBuZXh0IHRpbWUgKi8KKwlwc2Vzc2lvbkVudHJ5LT5nTGltU3BlY01nbXQuZG90MTFoQ2hhblN3U3RhdGUgPSBlTElNXzExSF9DSEFOU1dfSU5JVDsKKworCS8qIFJlc3RvcmUgdGhlIGZyYW1lIHRyYW5zbWlzc2lvbiwgYWxsIHRoZSB0aW1lLiAqLworCWxpbV9mcmFtZV90cmFuc21pc3Npb25fY29udHJvbChwTWFjLCBlTElNX1RYX0FMTCwgZUxJTV9SRVNVTUVfVFgpOworCisJcmV0dXJuIHJldENvZGU7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgICAgbGltX3Jlc3RvcmVfcHJlX3F1aWV0X3N0YXRlCisgICBcYnJpZWYgICBSZXN0b3JlIHRoZSBwcmUgcXVpZXQgc3RhdGUKKworICAgXHBhcmFtIHBNYWMKKyAgIFxyZXR1cm4gTk9ORQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMgbGltX3Jlc3RvcmVfcHJlX3F1aWV0X3N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworCXRTaXJSZXRTdGF0dXMgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKworCWlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgIT0gZUxJTV9TVEFfUk9MRSkKKwkJcmV0dXJuIHJldENvZGU7CisKKwkvKiBRdWlldCBzaG91bGQgYmUgcmVhZHkgZm9yIHRoZSBuZXh0IHRpbWUgKi8KKwlwc2Vzc2lvbkVudHJ5LT5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfSU5JVDsKKworCS8qIFJlc3RvcmUgdGhlIGZyYW1lIHRyYW5zbWlzc2lvbiwgYWxsIHRoZSB0aW1lLiAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9PSBlTElNX1FVSUVUX1JVTk5JTkcpCisJCWxpbV9mcmFtZV90cmFuc21pc3Npb25fY29udHJvbChwTWFjLCBlTElNX1RYX0FMTCwgZUxJTV9SRVNVTUVfVFgpOworCisJcmV0dXJuIHJldENvZGU7Cit9CisKKy8qKgorICogQGZ1bmN0aW9uOiBsaW1fcHJlcGFyZV9mb3IxMWhfY2hhbm5lbF9zd2l0Y2goKQorICoKKyAqIEBicmllZiAgOiAgVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IHRoZSB1c2VyIHRvIHByZXBhcmUgZm9yCisgKiAgICAgICAgICAgIDExaCBjaGFubmVsIHN3aXRjaC4gQXMgb2Ygbm93LCB0aGUgQVBJIGRvZXMKKyAqICAgICAgICAgICAgdmVyeSBtaW5pbWFsIHdvcmsuIFVzZXIgY2FuIGFkZCBtb3JlIGludG8gdGhlCisgKiAgICAgICAgICAgIHNhbWUgQVBJIGlmIG5lZWRlZC4KKyAqICAgICAgTE9HSUM6CisgKgorICogICAgICBBU1NVTVBUSU9OUzoKKyAqICAgICAgICAgIE5BCisgKgorICogICAgICBOT1RFOgorICogICAgICAgICAgTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBzZXNzaW9uRW50cnkKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1fcHJlcGFyZV9mb3IxMWhfY2hhbm5lbF9zd2l0Y2godHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlpZiAoIUxJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkKKwkJcmV0dXJuOworCisJLyogRmxhZyB0byBpbmRpY2F0ZSAxMWggY2hhbm5lbCBzd2l0Y2ggaW4gcHJvZ3Jlc3MgKi8KKwlwc2Vzc2lvbkVudHJ5LT5nTGltU3BlY01nbXQuZG90MTFoQ2hhblN3U3RhdGUgPSBlTElNXzExSF9DSEFOU1dfUlVOTklORzsKKworCWlmIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX0xJTktfRVNUX1dUX1NDQU5fU1RBVEUgfHwKKwkgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9DSEFOTkVMX1NDQU5fU1RBVEUpIHsKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCSAgICAgICBGTCgiUG9zdGluZyBmaW5pc2ggc2NhbiBhcyB3ZSBhcmUgaW4gc2NhbiBzdGF0ZSIpKTsKKwkJICAgICAgICkKKwkJLyogU3RvcCBvbmdvaW5nIHNjYW5uaW5nIGlmIGFueSAqLworCQlpZiAoR0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYykpIHsKKwkJCS8qIFNldCB0aGUgcmVzdW1lIGNoYW5uZWwgdG8gQW55IHZhbGlkIGNoYW5uZWwgKGludmFsaWQpLiAqLworCQkJLyogVGhpcyB3aWxsIGluc3RydWN0IEhBTCB0byBzZXQgaXQgdG8gYW55IHByZXZpb3VzIHZhbGlkIGNoYW5uZWwuICovCisJCQlwZV9zZXRfcmVzdW1lX2NoYW5uZWwocE1hYywgMCwgMCk7CisJCX0gZWxzZSB7CisJCQlsaW1fcmVzdG9yZV9wcmVfY2hhbm5lbF9zd2l0Y2hfc3RhdGUocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCX0KKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkgICAgICAgRkwoIk5vdCBpbiBzY2FuIHN0YXRlLCBzdGFydCBjaGFubmVsIHN3aXRjaCB0aW1lciIpKTsKKwkJICAgICAgICkKKwkJLyoqIFdlIGFyZSBzYWZlIHRvIHN3aXRjaCBjaGFubmVsIGF0IHRoaXMgcG9pbnQgKi8KKwkJbGltX3N0b3BfdHhfYW5kX3N3aXRjaF9jaGFubmVsKHBNYWMsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKwl9Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiAgICAgICAgbGltX2dldF9ud190eXBlCisKKyAgIFxicmllZiAgICBHZXQgdHlwZSBvZiB0aGUgbmV0d29yayBmcm9tIGRhdGEgcGFja2V0IG9yIGJlYWNvbgorICAgXHBhcmFtIHBNYWMKKyAgIFxwYXJhbSBjaGFubmVsTnVtIC0gQ2hhbm5lbCBudW1iZXIKKyAgIFxwYXJhbSB0eXBlIC0gVHlwZSBvZiBwYWNrZXQuCisgICBccGFyYW0gcEJlYWNvbiAtIFBvaW50ZXIgdG8gYmVhY29uIG9yIHByb2JlIHJlc3BvbnNlCisKKyAgIFxyZXR1cm4gTmV0d29yayB0eXBlIGEvYi9nLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFNpck53VHlwZSBsaW1fZ2V0X253X3R5cGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBjaGFubmVsTnVtLCB1aW50MzJfdCB0eXBlLAorCQkJICAgdHBTY2hCZWFjb25TdHJ1Y3QgcEJlYWNvbikKK3sKKwl0U2lyTndUeXBlIG53VHlwZSA9IGVTSVJfMTFCX05XX1RZUEU7CisKKwlpZiAodHlwZSA9PSBTSVJfTUFDX0RBVEFfRlJBTUUpIHsKKwkJaWYgKChjaGFubmVsTnVtID4gMCkgJiYgKGNoYW5uZWxOdW0gPCAxNSkpIHsKKwkJCW53VHlwZSA9IGVTSVJfMTFHX05XX1RZUEU7CisJCX0gZWxzZSB7CisJCQlud1R5cGUgPSBlU0lSXzExQV9OV19UWVBFOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChjaGFubmVsTnVtID4gMCkgJiYgKGNoYW5uZWxOdW0gPCAxNSkpIHsKKwkJCWludCBpOworCQkJLyogMTFiIG9yIDExZyBwYWNrZXQgKi8KKwkJCS8qIDExZyBpZmYgZXh0ZW5kZWQgUmF0ZSBJRSBpcyBwcmVzZW50IG9yICovCisJCQkvKiBpZiB0aGVyZSBpcyBhbiBBIHJhdGUgaW4gc3VwcFJhdGUgSUUgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBwQmVhY29uLT5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlczsgaSsrKSB7CisJCQkJaWYgKHNpcklzQXJhdGUKKwkJCQkJICAgIChwQmVhY29uLT5zdXBwb3J0ZWRSYXRlcy5yYXRlW2ldICYgMHg3ZikpIHsKKwkJCQkJbndUeXBlID0gZVNJUl8xMUdfTldfVFlQRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHBCZWFjb24tPmV4dGVuZGVkUmF0ZXNQcmVzZW50KSB7CisJCQkJUEVMT0czKGxpbV9sb2cKKwkJCQkJICAgICAgIChwTWFjLCBMT0czLCBGTCgiQmVhY29uLCBud3R5cGU9RyIpKTsKKwkJCQkgICAgICAgKQorCQkJCW53VHlwZSA9IGVTSVJfMTFHX05XX1RZUEU7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiAxMWEgcGFja2V0ICovCisJCQlQRUxPRzMobGltX2xvZyhwTWFjLCBMT0czLCBGTCgiQmVhY29uLCBud3R5cGU9QSIpKTspCisJCQlud1R5cGUgPSBlU0lSXzExQV9OV19UWVBFOworCQl9CisJfQorCXJldHVybiBud1R5cGU7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuICAgICAgICBsaW1fZ2V0X2NoYW5uZWxfZnJvbV9iZWFjb24KKyAgIFxicmllZiAgICBUbyBleHRyYWN0IGNoYW5uZWwgbnVtYmVyIGZyb20gYmVhY29uCisKKyAgIFxwYXJhbSBwTWFjCisgICBccGFyYW0gcEJlYWNvbiAtIFBvaW50ZXIgdG8gYmVhY29uIG9yIHByb2JlIHJzcAorICAgXHJldHVybiBjaGFubmVsIG51bWJlcgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDhfdCBsaW1fZ2V0X2NoYW5uZWxfZnJvbV9iZWFjb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTY2hCZWFjb25TdHJ1Y3QgcEJlYWNvbikKK3sKKwl1aW50OF90IGNoYW5uZWxOdW0gPSAwOworCisJaWYgKHBCZWFjb24tPmRzUGFyYW1zUHJlc2VudCkKKwkJY2hhbm5lbE51bSA9IHBCZWFjb24tPmNoYW5uZWxOdW1iZXI7CisJZWxzZSBpZiAocEJlYWNvbi0+SFRJbmZvLnByZXNlbnQpCisJCWNoYW5uZWxOdW0gPSBwQmVhY29uLT5IVEluZm8ucHJpbWFyeUNoYW5uZWw7CisJZWxzZQorCQljaGFubmVsTnVtID0gcEJlYWNvbi0+Y2hhbm5lbE51bWJlcjsKKworCXJldHVybiBjaGFubmVsTnVtOworfQorCit2b2lkIGxpbV9zZXRfdHNwZWNfdWFwc2RfbWFza19wZXJfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkJCSAgdFNpck1hY1RTSW5mbyAqcFRzSW5mbywgdWludDMyX3QgYWN0aW9uKQoreworCXVpbnQ4X3QgdXNlclByaW8gPSAodWludDhfdCkgcFRzSW5mby0+dHJhZmZpYy51c2VyUHJpbzsKKwl1aW50MTZfdCBkaXJlY3Rpb24gPSBwVHNJbmZvLT50cmFmZmljLmRpcmVjdGlvbjsKKwl1aW50OF90IGFjID0gdXBUb0FjKHVzZXJQcmlvKTsKKworCVBFTE9HMShsaW1fbG9nCisJCSAgICAgICAocE1hYywgTE9HMSwgRkwoIlNldCBVQVBTRCBtYXNrIGZvciBBQyAlZCwgZGlyICVkLCBhY3Rpb249JWQiKQorCQkgICAgICAgLCBhYywgZGlyZWN0aW9uLCBhY3Rpb24pOworCSAgICAgICApCisKKwkvKiBDb252ZXJ0aW5nIEFDIHRvIGFwcHJvcHJpYXRlIFVhcHNkIEJpdCBNYXNrCisJICogQUNfQkUoMCkgLS0+IFVBUFNEX0JJVE9GRlNFVF9BQ1ZPKDMpCisJICogQUNfQksoMSkgLS0+IFVBUFNEX0JJVE9GRlNFVF9BQ1ZPKDIpCisJICogQUNfVkkoMikgLS0+IFVBUFNEX0JJVE9GRlNFVF9BQ1ZPKDEpCisJICogQUNfVk8oMykgLS0+IFVBUFNEX0JJVE9GRlNFVF9BQ1ZPKDApCisJICovCisJYWMgPSAoKH5hYykgJiAweDMpOworCisJaWYgKGFjdGlvbiA9PSBDTEVBUl9VQVBTRF9NQVNLKSB7CisJCWlmIChkaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LKQorCQkJcHNlc3Npb25FbnRyeS0+Z1VhcHNkUGVyQWNUcmlnZ2VyRW5hYmxlTWFzayAmPQorCQkJCX4oMSA8PCBhYyk7CisJCWVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9ETkxJTkspCisJCQlwc2Vzc2lvbkVudHJ5LT5nVWFwc2RQZXJBY0RlbGl2ZXJ5RW5hYmxlTWFzayAmPQorCQkJCX4oMSA8PCBhYyk7CisJCWVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9CSURJUikgeworCQkJcHNlc3Npb25FbnRyeS0+Z1VhcHNkUGVyQWNUcmlnZ2VyRW5hYmxlTWFzayAmPQorCQkJCX4oMSA8PCBhYyk7CisJCQlwc2Vzc2lvbkVudHJ5LT5nVWFwc2RQZXJBY0RlbGl2ZXJ5RW5hYmxlTWFzayAmPQorCQkJCX4oMSA8PCBhYyk7CisJCX0KKwl9IGVsc2UgaWYgKGFjdGlvbiA9PSBTRVRfVUFQU0RfTUFTSykgeworCQlpZiAoZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX1VQTElOSykKKwkJCXBzZXNzaW9uRW50cnktPmdVYXBzZFBlckFjVHJpZ2dlckVuYWJsZU1hc2sgfD0KKwkJCQkoMSA8PCBhYyk7CisJCWVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9ETkxJTkspCisJCQlwc2Vzc2lvbkVudHJ5LT5nVWFwc2RQZXJBY0RlbGl2ZXJ5RW5hYmxlTWFzayB8PQorCQkJCSgxIDw8IGFjKTsKKwkJZWxzZSBpZiAoZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX0JJRElSKSB7CisJCQlwc2Vzc2lvbkVudHJ5LT5nVWFwc2RQZXJBY1RyaWdnZXJFbmFibGVNYXNrIHw9CisJCQkJKDEgPDwgYWMpOworCQkJcHNlc3Npb25FbnRyeS0+Z1VhcHNkUGVyQWNEZWxpdmVyeUVuYWJsZU1hc2sgfD0KKwkJCQkoMSA8PCBhYyk7CisJCX0KKwl9CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsCisJCUZMKCJOZXcgcHNlc3Npb25FbnRyeS0+Z1VhcHNkUGVyQWNUcmlnZ2VyRW5hYmxlTWFzayA9IDB4JXggIiksCisJCXBzZXNzaW9uRW50cnktPmdVYXBzZFBlckFjVHJpZ2dlckVuYWJsZU1hc2spOworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIk5ldyBwc2Vzc2lvbkVudHJ5LT5nVWFwc2RQZXJBY0RlbGl2ZXJ5RW5hYmxlTWFzayA9IDB4JXggIiksCisJCXBzZXNzaW9uRW50cnktPmdVYXBzZFBlckFjRGVsaXZlcnlFbmFibGVNYXNrKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBsaW1faGFuZGxlX2hlYXJ0X2JlYXRfdGltZW91dF9mb3Jfc2Vzc2lvbigpIC0gSGFuZGxlIGhlYXJ0IGJlYXQgdGltZSBvdXQKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIEdsb2JhbCBNYWMgU3RydWN0dXJlCisgKiBAcHNlc3Npb25fZW50cnk6IHBvaW50ZXIgdG8gdHBQRVNlc3Npb24KKyAqCisgKiBGdW5jdGlvbiBoYW5kbGVzIGhlYXJ0IGJlYXQgdGltZSBvdXQgZm9yIHNlc3Npb24KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBsaW1faGFuZGxlX2hlYXJ0X2JlYXRfdGltZW91dF9mb3Jfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQkgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25fZW50cnkpCit7CisJaWYgKHBzZXNzaW9uX2VudHJ5LT52YWxpZCA9PSB0cnVlKSB7CisJCWlmIChwc2Vzc2lvbl9lbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0lCU1NfTU9ERSkKKwkJCWxpbV9pYnNzX2hlYXJ0X2JlYXRfaGFuZGxlKG1hY19jdHgsIHBzZXNzaW9uX2VudHJ5KTsKKworCQlpZiAoKHBzZXNzaW9uX2VudHJ5LT5ic3NUeXBlID09IGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERSkgJiYKKwkJCQkJKExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbl9lbnRyeSkpKQorCQkJbGltX2hhbmRsZV9oZWFydF9iZWF0X2ZhaWx1cmUobWFjX2N0eCwgcHNlc3Npb25fZW50cnkpOworCX0KKwkvKgorCSAqIEluIHRoZSBmdW5jdGlvbiBsaW1faGFuZGxlX2hlYXJ0X2JlYXRfZmFpbHVyZSB0aGluZ3MgY2FuIGNoYW5nZQorCSAqIHNvIGNoZWNrIGZvciB0aGUgc2Vzc2lvbiBlbnRyeSAgdmFsaWQgYW5kIHRoZSBvdGhlciB0aGluZ3MKKwkgKiBhZ2FpbgorCSAqLworCWlmICgocHNlc3Npb25fZW50cnktPnZhbGlkID09IHRydWUpICYmCisJCShwc2Vzc2lvbl9lbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREUpICYmCisJCQkoTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uX2VudHJ5KSkgJiYKKwkJCQkocHNlc3Npb25fZW50cnktPkxpbUhCRmFpbHVyZVN0YXR1cyA9PSB0cnVlKSkgeworCQl0TGltVGltZXJzICpsaW1fdGltZXIgID0gJm1hY19jdHgtPmxpbS5saW1UaW1lcnM7CisJCS8qCisJCSAqIEFjdGl2YXRlIFByb2JlIEFmdGVyIEhlYXJ0QmVhdCBUaW1lciBpbmNhc2UgSEIKKwkJICogRmFpbHVyZSBkZXRlY3RlZAorCQkgKi8KKwkJUEVMT0dXKGxpbV9sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJTZW5kaW5nIFByb2JlIGZvciBTZXNzaW9uOiAlZCIpLAorCQkJcHNlc3Npb25fZW50cnktPmJzc0lkeCk7KQorCQlsaW1fZGVhY3RpdmF0ZV9hbmRfY2hhbmdlX3RpbWVyKG1hY19jdHgsCisJCQllTElNX1BST0JFX0FGVEVSX0hCX1RJTUVSKTsKKwkJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLAorCQkJZUxJTV9QUk9CRV9BRlRFUl9IQl9USU1FUikpOworCQlpZiAodHhfdGltZXJfYWN0aXZhdGUoJmxpbV90aW1lci0+Z0xpbVByb2JlQWZ0ZXJIQlRpbWVyKQorCQkJCQkhPSBUWF9TVUNDRVNTKQorCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCUZMKCJGYWlsIHRvIHJlLWFjdGl2YXRlIFByb2JlLWFmdGVyLWhiIHRpbWVyIikpOworCX0KK30KKwordWludDhfdCBsaW1fZ2V0X2N1cnJlbnRfb3BlcmF0aW5nX2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl1aW50OF90IGk7CisJZm9yIChpID0gMDsgaSA8IHBNYWMtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCWlmIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkID09IHRydWUpIHsKKwkJCWlmICgocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5ic3NUeXBlID09CisJCQkgICAgIGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERSkKKwkJCSAgICAmJiAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09CisJCQkJZUxJTV9TVEFfUk9MRSkpIHsKKwkJCQlyZXR1cm4gcE1hYy0+bGltLmdwU2Vzc2lvbltpXS4KKwkJCQkgICAgICAgY3VycmVudE9wZXJDaGFubmVsOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGxpbV9wcm9jZXNzX2FkZF9zdGFfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRKQoreworCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisJdHBBZGRTdGFQYXJhbXMgcEFkZFN0YVBhcmFtczsKKworCXBBZGRTdGFQYXJhbXMgPSAodHBBZGRTdGFQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisKKwlwc2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X3Nlc3Npb25faWQocE1hYywKKwkJCXBBZGRTdGFQYXJhbXMtPnNlc3Npb25JZCk7CisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEIikpOworCQljZGZfbWVtX2ZyZWUocEFkZFN0YVBhcmFtcyk7CisJCXJldHVybjsKKwl9CisJcHNlc3Npb25FbnRyeS0+Y3NhT2ZmbG9hZEVuYWJsZSA9IHBBZGRTdGFQYXJhbXMtPmNzYU9mZmxvYWRFbmFibGU7CisJaWYgKExJTV9JU19JQlNTX1JPTEUocHNlc3Npb25FbnRyeSkpCisJCSh2b2lkKWxpbV9pYnNzX2FkZF9zdGFfcnNwKHBNYWMsIGxpbU1zZ1EtPmJvZHlwdHIsIHBzZXNzaW9uRW50cnkpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJZWxzZSBpZiAocE1hYy0+bGltLmdMaW1BZGRTdGFUZGxzKSB7CisJCWxpbV9wcm9jZXNzX3RkbHNfYWRkX3N0YV9yc3AocE1hYywgbGltTXNnUS0+Ym9keXB0ciwgcHNlc3Npb25FbnRyeSk7CisJCXBNYWMtPmxpbS5nTGltQWRkU3RhVGRscyA9IGZhbHNlOworCX0KKyNlbmRpZgorCWVsc2UKKwkJbGltX3Byb2Nlc3NfbWxtX2FkZF9zdGFfcnNwKHBNYWMsIGxpbU1zZ1EsIHBzZXNzaW9uRW50cnkpOworCit9CisKKy8qKgorICogbGltX3VwZGF0ZV9iZWFjb24oKSAtIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBiZWFjb24KKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIEdsb2JhbCBNYWMgU3RydWN0dXJlCisgKgorICogVGhpcyBGdW5jdGlvbiBpcyBpbnZva2VkIHRvIHVwZGF0ZSB0aGUgYmVhY29uCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgbGltX3VwZGF0ZV9iZWFjb24odHBBbmlTaXJHbG9iYWwgbWFjX2N0eCkKK3sKKwl1aW50OF90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFjX2N0eC0+bGltLm1heEJzc0lkOyBpKyspIHsKKwkJaWYgKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgIT0gdHJ1ZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKChtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorCQkJfHwgKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0ubGltU3lzdGVtUm9sZSA9PQorCQkJCQllTElNX1NUQV9JTl9JQlNTX1JPTEUpKQorCQkJJiYgKGVMSU1fU01FX05PUk1BTF9TVEFURSA9PQorCQkJCW1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0ubGltU21lU3RhdGUpKSB7CisKKwkJCXNjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyhtYWNfY3R4LAorCQkJCQkJJm1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0pOworCisJCQlpZiAoZmFsc2UgPT0gbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uCisJCQkJCWlzX2Rmc19jYWNfdGltZXJfcnVubmluZykKKwkJCQlsaW1fc2VuZF9iZWFjb25faW5kKG1hY19jdHgsCisJCQkJCQkmbWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXSk7CisJCX0gZWxzZSBpZiAoKChtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUgPT0KKwkJCQkJCWVMSU1fQlRfQU1QX0FQX1JPTEUpIHx8CisJCQkJKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0ubGltU3lzdGVtUm9sZSA9PQorCQkJCQkJZUxJTV9CVF9BTVBfU1RBX1JPTEUpKSAmJgorCQkJCShtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLnN0YXR5cGVGb3JCc3MgPT0KKwkJCQkJCQlTVEFfRU5UUllfU0VMRikpeworCQkJc2NoX3NldF9maXhlZF9iZWFjb25fZmllbGRzKG1hY19jdHgsCisJCQkJCQkmbWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogbGltX2hhbmRsZV9oZWFydF9iZWF0X2ZhaWx1cmVfdGltZW91dCAtIGhhbmRsZSBoZWFydCBiZWF0IGZhaWx1cmUKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIEdsb2JhbCBNYWMgU3RydWN0dXJlCisgKgorICogRnVuY3Rpb24gaGFuZGxlIGhlYXJ0IGJlYXQgZmFpbHVyZSB0aW1lb3V0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgbGltX2hhbmRsZV9oZWFydF9iZWF0X2ZhaWx1cmVfdGltZW91dCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4KQoreworCXVpbnQ4X3QgaTsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbl9lbnRyeTsKKwkvKgorCSAqIFByb2JlIHJlc3BvbnNlIGlzIG5vdCByZWNlaXZlZCAgYWZ0ZXIgSEIgZmFpbHVyZS4KKwkgKiBUaGlzIGlzIGhhbmRsZWQgYnkgTE1NIHN1YiBtb2R1bGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IG1hY19jdHgtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCWlmIChtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkICE9IHRydWUpCisJCQljb250aW51ZTsKKwkJcHNlc3Npb25fZW50cnkgPSAmbWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXTsKKwkJaWYgKHBzZXNzaW9uX2VudHJ5LT5MaW1IQkZhaWx1cmVTdGF0dXMgIT0gdHJ1ZSkKKwkJCWNvbnRpbnVlOworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJTTUUgJWQsIE1MTUUgJWQsIEhCLUNvdW50ICVkIiksCisJCQkJcHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlLAorCQkJCXBzZXNzaW9uX2VudHJ5LT5saW1NbG1TdGF0ZSwKKwkJCQlwc2Vzc2lvbl9lbnRyeS0+TGltUnhlZEJlYWNvbkNudER1cmluZ0hCKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNCisJCWxpbV9kaWFnX2V2ZW50X3JlcG9ydChtYWNfY3R4LCBXTEFOX1BFX0RJQUdfSEJfRkFJTFVSRV9USU1FT1VULAorCQkJCQlwc2Vzc2lvbl9lbnRyeSwgMCwgMCk7CisjZW5kaWYKKwkJaWYgKChwc2Vzc2lvbl9lbnRyeS0+bGltTWxtU3RhdGUgPT0KKwkJCQkJZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkgJiYKKwkJCShwc2Vzc2lvbl9lbnRyeS0+bGltU21lU3RhdGUgIT0KKwkJCQkJZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEUpICYmCisJCQkocHNlc3Npb25fZW50cnktPmxpbVNtZVN0YXRlICE9CisJCQkJCWVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSkgJiYKKwkJCSgoIUxJTV9JU19DT05ORUNUSU9OX0FDVElWRShwc2Vzc2lvbl9lbnRyeSkpIHx8CisJCQkvKgorCQkJICogRGlzY29ubmVjdCBldmVuIGlmIHdlIGhhdmUgbm90IHJlY2VpdmVkIGEgc2luZ2xlCisJCQkgKiBiZWFjb24gYWZ0ZXIgY29ubmVjdGlvbi4KKwkJCSAqLworCQkJIChwc2Vzc2lvbl9lbnRyeS0+Y3VycmVudEJzc0JlYWNvbkNudCA9PSAwKSkpIHsKKwkJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoImZvciBzZXNzaW9uOiVkICIpLAorCQkJCQkJcHNlc3Npb25fZW50cnktPnBlU2Vzc2lvbklkKTsKKwkJCS8qCisJCQkgKiBBUCBkaWQgbm90IHJlc3BvbmQgdG8gUHJvYmUgUmVxdWVzdC4KKwkJCSAqIFRlYXIgZG93biBsaW5rIHdpdGggaXQuCisJCQkgKi8KKwkJCWxpbV90ZWFyX2Rvd25fbGlua193aXRoX2FwKG1hY19jdHgsCisJCQkJCQlwc2Vzc2lvbl9lbnRyeS0+cGVTZXNzaW9uSWQsCisJCQkJCQllU0lSX0JFQUNPTl9NSVNTRUQpOworCQkJbWFjX2N0eC0+bGltLmdMaW1Qcm9iZUZhaWx1cmVBZnRlckhCZmFpbGVkQ250Kys7CisJCX0gZWxzZSB7CisJCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIlVuZXhwZWN0ZWQgd3QtcHJvYmUtdGltZW91dCBpbiBzdGF0ZSAiKSk7CisJCQlsaW1fcHJpbnRfbWxtX3N0YXRlKG1hY19jdHgsIExPR0UsCisJCQkJcHNlc3Npb25fZW50cnktPmxpbU1sbVN0YXRlKTsKKwkJfQorCX0KKwkvKgorCSAqIERlYWN0aXZhdGUgVGltZXIgUHJvYmVBZnRlckhCIFRpbWVyIC0+IEFzIGl0cyBhIG9uZXNob3QgdGltZXIsCisJICogbmVlZCBub3QgZGVhY3RpdmF0ZSB0aGUgdGltZXIKKwkgKiB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Qcm9iZUFmdGVySEJUaW1lcik7CisJICovCit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlcmUgd2lsbCBub3QgYmUgbW9yZSB0aGFuIG9uZSBJQlNTIHNlc3Npb24gYWN0aXZlIGF0IGFueSB0aW1lLgorICovCit0cFBFU2Vzc2lvbiBsaW1faXNfaWJzc19zZXNzaW9uX2FjdGl2ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQ4X3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQlpZiAoKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQpICYmCisJCSAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09CisJCSAgICAgZUxJTV9TVEFfSU5fSUJTU19ST0xFKSkKKwkJCXJldHVybiAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordHBQRVNlc3Npb24gbGltX2lzX2FwX3Nlc3Npb25fYWN0aXZlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDhfdCBpOworCisJZm9yIChpID0gMDsgaSA8IHBNYWMtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCWlmICgocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCkgJiYKKwkJICAgICgocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgfHwKKwkJICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09CisJCSAgICAgIGVMSU1fQlRfQU1QX0FQX1JPTEUpKSkKKwkJCXJldHVybiAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgICAgIGxpbV9oYW5kbGVfZGVmZXJfbXNnX2Vycm9yCisgICBcYnJpZWYgICAgaGFuZGxlcyBlcnJvciBzY2VuYXJpbywgd2hlbiB0aGUgbXNnIGNhbiBub3QgYmUgZGVmZXJyZWQuCisgICBccGFyYW0gcE1hYworICAgXHBhcmFtIHBMaW1Nc2cgTElNIG1zZywgd2hpY2ggY291bGQgbm90IGJlIGRlZmVycmVkLgorICAgXHJldHVybiB2b2lkCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgbGltX2hhbmRsZV9kZWZlcl9tc2dfZXJyb3IodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBMaW1Nc2cpCit7CisJaWYgKFNJUl9CQl9YUE9SVF9NR01UX01TRyA9PSBwTGltTXNnLT50eXBlKSB7CisJCWNkc19wa3RfcmV0dXJuX3BhY2tldCgoY2RzX3BrdF90ICopIHBMaW1Nc2ctPmJvZHlwdHIpOworCQlwTGltTXNnLT5ib2R5cHRyID0gTlVMTDsKKwl9IGVsc2UgaWYgKHBMaW1Nc2ctPmJvZHlwdHIgIT0gTlVMTCkgeworCQljZGZfbWVtX2ZyZWUocExpbU1zZy0+Ym9keXB0cik7CisJCXBMaW1Nc2ctPmJvZHlwdHIgPSBOVUxMOworCX0KKworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgbGltX2RpYWdfZXZlbnRfcmVwb3J0CisgICBcYnJpZWYgVGhpcyBmdW5jdGlvbiByZXBvcnRzIERpYWcgZXZlbnQKKyAgIFxwYXJhbSBwTWFjCisgICBccGFyYW0gZXZlbnRUeXBlCisgICBccGFyYW0gYnNzaWQKKyAgIFxwYXJhbSBzdGF0dXMKKyAgIFxwYXJhbSByZWFzb25Db2RlCisgICBccmV0dXJuIHZvaWQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltX2RpYWdfZXZlbnRfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGV2ZW50VHlwZSwKKwkJCSAgIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnksIHVpbnQxNl90IHN0YXR1cywKKwkJCSAgIHVpbnQxNl90IHJlYXNvbkNvZGUpCit7CisJdFNpck1hY0FkZHIgbnVsbEJzc2lkID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfREVGKHBlRXZlbnQsIGhvc3RfZXZlbnRfd2xhbl9wZV9wYXlsb2FkX3R5cGUpOworCisJY2RmX21lbV9zZXQoJnBlRXZlbnQsIHNpemVvZihob3N0X2V2ZW50X3dsYW5fcGVfcGF5bG9hZF90eXBlKSwgMCk7CisKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbkVudHJ5KSB7CisJCWNkZl9tZW1fY29weShwZUV2ZW50LmJzc2lkLCBudWxsQnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwZUV2ZW50LnNtZV9zdGF0ZSA9ICh1aW50MTZfdCkgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZTsKKwkJcGVFdmVudC5tbG1fc3RhdGUgPSAodWludDE2X3QpIHBNYWMtPmxpbS5nTGltTWxtU3RhdGU7CisKKwl9IGVsc2UgeworCQljZGZfbWVtX2NvcHkocGVFdmVudC5ic3NpZCwgcFNlc3Npb25FbnRyeS0+YnNzSWQsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwZUV2ZW50LnNtZV9zdGF0ZSA9ICh1aW50MTZfdCkgcFNlc3Npb25FbnRyeS0+bGltU21lU3RhdGU7CisJCXBlRXZlbnQubWxtX3N0YXRlID0gKHVpbnQxNl90KSBwU2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZTsKKwl9CisJcGVFdmVudC5ldmVudF90eXBlID0gZXZlbnRUeXBlOworCXBlRXZlbnQuc3RhdHVzID0gc3RhdHVzOworCXBlRXZlbnQucmVhc29uX2NvZGUgPSByZWFzb25Db2RlOworCisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfUkVQT1JUKCZwZUV2ZW50LCBFVkVOVF9XTEFOX1BFKTsKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisKK3VpbnQ4X3QgKmxpbV9nZXRfaWVfcHRyX25ldyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwSWVzLCBpbnQgbGVuZ3RoLAorCQkJCSB1aW50OF90IGVpZCwgZVNpemVPZkxlbkZpZWxkIHNpemVfb2ZfbGVuX2ZpZWxkKQoreworCWludCBsZWZ0ID0gbGVuZ3RoOworCXVpbnQ4X3QgKnB0ciA9IHBJZXM7CisJdWludDhfdCBlbGVtX2lkOworCXVpbnQxNl90IGVsZW1fbGVuOworCisJd2hpbGUgKGxlZnQgPj0gKHNpemVfb2ZfbGVuX2ZpZWxkICsgMSkpIHsKKwkJZWxlbV9pZCA9IHB0clswXTsKKwkJaWYgKHNpemVfb2ZfbGVuX2ZpZWxkID09IFRXT19CWVRFKSB7CisJCQllbGVtX2xlbiA9ICgodWludDE2X3QpIHB0clsxXSkgfCAocHRyWzJdIDw8IDgpOworCQl9IGVsc2UgeworCQkJZWxlbV9sZW4gPSBwdHJbMV07CisJCX0KKworCQlsZWZ0IC09IChzaXplX29mX2xlbl9maWVsZCArIDEpOworCQlpZiAoZWxlbV9sZW4gPiBsZWZ0KSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwKKwkJCQkJKCIqKioqSW52YWxpZCBJRXMgZWlkID0gJWQgZWxlbV9sZW49JWQgbGVmdD0lZCoqKioqIiksCisJCQkJZWlkLCBlbGVtX2xlbiwgbGVmdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoZWxlbV9pZCA9PSBlaWQpIHsKKwkJCXJldHVybiBwdHI7CisJCX0KKworCQlsZWZ0IC09IGVsZW1fbGVuOworCQlwdHIgKz0gKGVsZW1fbGVuICsgKHNpemVfb2ZfbGVuX2ZpZWxkICsgMSkpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJucyBsZW5ndGggb2YgUDJQIHN0cmVhbSBhbmQgUG9pbnRlciBpZSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBpcyBmaWxsZWQgd2l0aCBub2Egc3RyZWFtICovCisKK3VpbnQ4X3QgbGltX2J1aWxkX3AycF9pZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICppZSwgdWludDhfdCAqZGF0YSwKKwkJCSB1aW50OF90IGllX2xlbikKK3sKKwlpbnQgbGVuZ3RoID0gMDsKKwl1aW50OF90ICpwdHIgPSBpZTsKKworCXB0cltsZW5ndGgrK10gPSBTSVJfTUFDX0VJRF9WRU5ET1I7CisJcHRyW2xlbmd0aCsrXSA9IGllX2xlbiArIFNJUl9NQUNfUDJQX09VSV9TSVpFOworCWNkZl9tZW1fY29weSgmcHRyW2xlbmd0aF0sIFNJUl9NQUNfUDJQX09VSSwgU0lSX01BQ19QMlBfT1VJX1NJWkUpOworCWNkZl9tZW1fY29weSgmcHRyW2xlbmd0aCArIFNJUl9NQUNfUDJQX09VSV9TSVpFXSwgZGF0YSwgaWVfbGVuKTsKKwlyZXR1cm4gaWVfbGVuICsgU0lSX1AyUF9JRV9IRUFERVJfTEVOOworfQorCisvKiBSZXR1cm5zIGxlbmd0aCBvZiBOb0Egc3RyZWFtIGFuZCBQb2ludGVyIHBOb2FTdHJlYW0gcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gaXMgZmlsbGVkIHdpdGggbm9hIHN0cmVhbSAqLworCit1aW50OF90IGxpbV9nZXRfbm9hX2F0dHJfc3RyZWFtX2luX211bHRfcDJwX2llcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdWludDhfdCAqbm9hU3RyZWFtLCB1aW50OF90IG5vYUxlbiwKKwkJCQkJCXVpbnQ4X3Qgb3ZlckZsb3dMZW4pCit7CisJdWludDhfdCBvdmVyRmxvd1AycFN0cmVhbVtTSVJfTUFYX05PQV9BVFRSX0xFTl07CisKKwlpZiAoKG5vYUxlbiA8PSAoU0lSX01BWF9OT0FfQVRUUl9MRU4gKyBTSVJfUDJQX0lFX0hFQURFUl9MRU4pKSAmJgorCSAgICAobm9hTGVuID49IG92ZXJGbG93TGVuKSAmJiAob3ZlckZsb3dMZW4gPD0gU0lSX01BWF9OT0FfQVRUUl9MRU4pKSB7CisJCWNkZl9tZW1fY29weShvdmVyRmxvd1AycFN0cmVhbSwKKwkJCSAgICAgbm9hU3RyZWFtICsgbm9hTGVuIC0gb3ZlckZsb3dMZW4sIG92ZXJGbG93TGVuKTsKKwkJbm9hU3RyZWFtW25vYUxlbiAtIG92ZXJGbG93TGVuXSA9IFNJUl9NQUNfRUlEX1ZFTkRPUjsKKwkJbm9hU3RyZWFtW25vYUxlbiAtIG92ZXJGbG93TGVuICsgMV0gPQorCQkJb3ZlckZsb3dMZW4gKyBTSVJfTUFDX1AyUF9PVUlfU0laRTsKKwkJY2RmX21lbV9jb3B5KG5vYVN0cmVhbSArIG5vYUxlbiAtIG92ZXJGbG93TGVuICsgMiwKKwkJCSAgICAgU0lSX01BQ19QMlBfT1VJLCBTSVJfTUFDX1AyUF9PVUlfU0laRSk7CisJCWNkZl9tZW1fY29weShub2FTdHJlYW0gKyBub2FMZW4gKyAyICsgU0lSX01BQ19QMlBfT1VJX1NJWkUgLQorCQkJICAgICBvdmVyRmxvd0xlbiwgb3ZlckZsb3dQMnBTdHJlYW0sIG92ZXJGbG93TGVuKTsKKwl9CisKKwlyZXR1cm4gbm9hTGVuICsgU0lSX1AyUF9JRV9IRUFERVJfTEVOOworCit9CisKKy8qIFJldHVybnMgbGVuZ3RoIG9mIE5vQSBzdHJlYW0gYW5kIFBvaW50ZXIgcE5vYVN0cmVhbSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBpcyBmaWxsZWQgd2l0aCBub2Egc3RyZWFtICovCit1aW50OF90IGxpbV9nZXRfbm9hX2F0dHJfc3RyZWFtKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBOb2FTdHJlYW0sCisJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50OF90IGxlbiA9IDA7CisKKwl1aW50OF90ICpwQm9keSA9IHBOb2FTdHJlYW07CisKKwlpZiAoKHBzZXNzaW9uRW50cnkgIT0gTlVMTCkgJiYgKHBzZXNzaW9uRW50cnktPnZhbGlkKSAmJgorCSAgICAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkpIHsKKwkJaWYgKCghKHBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUudU5vYTFEdXJhdGlvbikpCisJCSAgICAmJiAoIShwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLnVOb2EyRHVyYXRpb24pKQorCQkgICAgJiYgKCFwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLm9wcFBzRmxhZykKKwkJICAgICkKKwkJCXJldHVybiAwOyAgLyogTm8gTm9BIERlc2NyaXB0b3IgdGhlbiByZXR1cm4gMCAqLworCisJCXBCb2R5WzBdID0gU0lSX1AyUF9OT0FfQVRUUjsKKworCQlwQm9keVszXSA9IHBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUuaW5kZXg7CisJCXBCb2R5WzRdID0KKwkJCXBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUuY3RXaW4gfCAocHNlc3Npb25FbnRyeS0+CisJCQkJCQkJICAgICAgcDJwR29Qc1VwZGF0ZS4KKwkJCQkJCQkgICAgICBvcHBQc0ZsYWcgPDwgNyk7CisJCWxlbiA9IDU7CisJCXBCb2R5ICs9IGxlbjsKKworCQlpZiAocHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMUR1cmF0aW9uKSB7CisJCQkqcEJvZHkgPSBwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLnVOb2ExSW50ZXJ2YWxDbnQ7CisJCQlwQm9keSArPSAxOworCQkJbGVuICs9IDE7CisKKwkJCSooKHVpbnQzMl90ICopIChwQm9keSkpID0KKwkJCQlzaXJfc3dhcF91MzJpZl9uZWVkZWQocHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS4KKwkJCQkJCSAgICAgIHVOb2ExRHVyYXRpb24pOworCQkJcEJvZHkgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWxlbiArPSA0OworCisJCQkqKCh1aW50MzJfdCAqKSAocEJvZHkpKSA9CisJCQkJc2lyX3N3YXBfdTMyaWZfbmVlZGVkKHBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUuCisJCQkJCQkgICAgICB1Tm9hMUludGVydmFsKTsKKwkJCXBCb2R5ICs9IHNpemVvZih1aW50MzJfdCk7CisJCQlsZW4gKz0gNDsKKworCQkJKigodWludDMyX3QgKikgKHBCb2R5KSkgPQorCQkJCXNpcl9zd2FwX3UzMmlmX25lZWRlZChwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLgorCQkJCQkJICAgICAgdU5vYTFTdGFydFRpbWUpOworCQkJcEJvZHkgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWxlbiArPSA0OworCisJCX0KKworCQlpZiAocHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMkR1cmF0aW9uKSB7CisJCQkqcEJvZHkgPSBwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLnVOb2EySW50ZXJ2YWxDbnQ7CisJCQlwQm9keSArPSAxOworCQkJbGVuICs9IDE7CisKKwkJCSooKHVpbnQzMl90ICopIChwQm9keSkpID0KKwkJCQlzaXJfc3dhcF91MzJpZl9uZWVkZWQocHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS4KKwkJCQkJCSAgICAgIHVOb2EyRHVyYXRpb24pOworCQkJcEJvZHkgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWxlbiArPSA0OworCisJCQkqKCh1aW50MzJfdCAqKSAocEJvZHkpKSA9CisJCQkJc2lyX3N3YXBfdTMyaWZfbmVlZGVkKHBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUuCisJCQkJCQkgICAgICB1Tm9hMkludGVydmFsKTsKKwkJCXBCb2R5ICs9IHNpemVvZih1aW50MzJfdCk7CisJCQlsZW4gKz0gNDsKKworCQkJKigodWludDMyX3QgKikgKHBCb2R5KSkgPQorCQkJCXNpcl9zd2FwX3UzMmlmX25lZWRlZChwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLgorCQkJCQkJICAgICAgdU5vYTJTdGFydFRpbWUpOworCQkJcEJvZHkgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWxlbiArPSA0OworCisJCX0KKworCQlwQm9keSA9IHBOb2FTdHJlYW0gKyAxOworCQkqKCh1aW50MTZfdCAqKSAocEJvZHkpKSA9IHNpcl9zd2FwX3UxNmlmX25lZWRlZChsZW4gLSAzKTsgLypvbmUgYnl0ZSBmb3IgQXR0ciBhbmQgMiBieXRlcyBmb3IgbGVuZ3RoICovCisKKwkJcmV0dXJuIGxlbjsKKworCX0KKwlyZXR1cm4gMDsKKworfQorCit2b2lkIHBlX3NldF9yZXN1bWVfY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBjaGFubmVsLAorCQkJICAgZVBoeUNoYW5Cb25kU3RhdGUgcGh5Q2JTdGF0ZSkKK3sKKworCXBNYWMtPmxpbS5nUmVzdW1lQ2hhbm5lbCA9IGNoYW5uZWw7CisJcE1hYy0+bGltLmdSZXN1bWVQaHlDYlN0YXRlID0gcGh5Q2JTdGF0ZTsKK30KKworYm9vbCBsaW1faXNfbm9hX2luc2VydF9yZXFkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDhfdCBpOworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQlpZiAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCA9PSB0cnVlKSB7CisJCQlpZiAoKGVMSU1fQVBfUk9MRSA9PQorCQkJICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUpCisJCQkgICAgJiYgKENERl9QMlBfR09fTU9ERSA9PQorCQkJCXBNYWMtPmxpbS5ncFNlc3Npb25baV0ucGVQZXJzb25hKQorCQkJICAgICkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworYm9vbCBsaW1faXNjb25uZWN0ZWRfb25fZGZzX2NoYW5uZWwodWludDhfdCBjdXJyZW50Q2hhbm5lbCkKK3sKKwlpZiAoQ0hBTk5FTF9TVEFURV9ERlMgPT0KKwkgICAgY2RzX2dldF9jaGFubmVsX3N0YXRlKGN1cnJlbnRDaGFubmVsKSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVwordm9pZCBsaW1fcG1mX3NhX3F1ZXJ5X3RpbWVyX2hhbmRsZXIodm9pZCAqcE1hY0dsb2JhbCwgdWludDMyX3QgcGFyYW0pCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgcE1hY0dsb2JhbDsKKwl0UG1mU2FRdWVyeVRpbWVySWQgdGltZXJJZDsKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCXRwRHBoSGFzaE5vZGUgcFN0YTsKKwl1aW50MzJfdCBtYXhSZXRyaWVzOworCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiU0EgUXVlcnkgdGltZXIgZmlyZXMiKSk7CisJdGltZXJJZC52YWx1ZSA9IHBhcmFtOworCisJLyogQ2hlY2sgdGhhdCBTQSBRdWVyeSBpcyBpbiBwcm9ncmVzcyAqLworCXBzZXNzaW9uRW50cnkgPSBwZV9maW5kX3Nlc3Npb25fYnlfc2Vzc2lvbl9pZChwTWFjLAorCQkJdGltZXJJZC5maWVsZHMuc2Vzc2lvbklkKTsKKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uIElEICVkIiksCisJCQl0aW1lcklkLmZpZWxkcy5zZXNzaW9uSWQpOworCQlyZXR1cm47CisJfQorCXBTdGEgPSBkcGhfZ2V0X2hhc2hfZW50cnkocE1hYywgdGltZXJJZC5maWVsZHMucGVlcklkeCwKKwkJCSAgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisJaWYgKHBTdGEgPT0gTlVMTCkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRW50cnkgZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHBlZXIgaW5kZXggJWQiKSwKKwkJCXRpbWVySWQuZmllbGRzLnBlZXJJZHgpOworCQlyZXR1cm47CisJfQorCWlmIChEUEhfU0FfUVVFUllfSU5fUFJPR1JFU1MgIT0gcFN0YS0+cG1mU2FRdWVyeVN0YXRlKQorCQlyZXR1cm47CisKKwkvKiBJbmNyZW1lbnQgdGhlIHJldHJ5IGNvdW50LCBjaGVjayBpZiByZWFjaGVkIG1heGltdW0gKi8KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1BNRl9TQV9RVUVSWV9NQVhfUkVUUklFUywKKwkJCSAgICAgJm1heFJldHJpZXMpICE9IGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkoIkNvdWxkIG5vdCByZXRyaWV2ZSBQTUYgU0EgUXVlcnkgbWF4aW11bSByZXRyaWVzIHZhbHVlIikpOworCQlwU3RhLT5wbWZTYVF1ZXJ5U3RhdGUgPSBEUEhfU0FfUVVFUllfTk9UX0lOX1BST0dSRVNTOworCQlyZXR1cm47CisJfQorCXBTdGEtPnBtZlNhUXVlcnlSZXRyeUNvdW50Kys7CisJaWYgKHBTdGEtPnBtZlNhUXVlcnlSZXRyeUNvdW50ID49IG1heFJldHJpZXMpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiU0EgUXVlcnkgdGltZWQgb3V0LERlbGV0aW5nIFNUQSIpKTsKKwkJbGltX3ByaW50X21hY19hZGRyKHBNYWMsIHBTdGEtPnN0YUFkZHIsIExPR0UpOworCQlsaW1fc2VuZF9kaXNhc3NvY19tZ210X2ZyYW1lKHBNYWMsCisJCQllU0lSX01BQ19ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWV9SRUFTT04sCisJCQlwU3RhLT5zdGFBZGRyLCBwc2Vzc2lvbkVudHJ5LCBmYWxzZSk7CisJCWxpbV90cmlnZ2VyX3N0YV9kZWxldGlvbihwTWFjLCBwU3RhLCBwc2Vzc2lvbkVudHJ5KTsKKwkJcFN0YS0+cG1mU2FRdWVyeVN0YXRlID0gRFBIX1NBX1FVRVJZX1RJTUVEX09VVDsKKwkJcmV0dXJuOworCX0KKwkvKiBSZXRyeSBTQSBRdWVyeSAqLworCWxpbV9zZW5kX3NhX3F1ZXJ5X3JlcXVlc3RfZnJhbWUocE1hYywKKwkJCQkJKHVpbnQ4X3QgKikgJihwU3RhLT4KKwkJCQkJCSAgICAgIHBtZlNhUXVlcnlDdXJyZW50VHJhbnNJZCksCisJCQkJCXBTdGEtPnN0YUFkZHIsIHBzZXNzaW9uRW50cnkpOworCXBTdGEtPnBtZlNhUXVlcnlDdXJyZW50VHJhbnNJZCsrOworCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIlN0YXJ0aW5nIFNBIFF1ZXJ5IHJldHJ5ICVkIiksCisJCXBTdGEtPnBtZlNhUXVlcnlSZXRyeUNvdW50KTsKKwlpZiAodHhfdGltZXJfYWN0aXZhdGUoJnBTdGEtPnBtZlNhUXVlcnlUaW1lcikgIT0gVFhfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJQTUYgU0EgUXVlcnkgdGltZXIgYWN0aXZhdGlvbiBmYWlsZWQhIikpOworCQlwU3RhLT5wbWZTYVF1ZXJ5U3RhdGUgPSBEUEhfU0FfUVVFUllfTk9UX0lOX1BST0dSRVNTOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKK2Jvb2wgbGltX2NoZWNrX3ZodF9vcF9tb2RlX2NoYW5nZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJCSAgdWludDhfdCBjaGFuV2lkdGgsIHVpbnQ4X3Qgc3RhSWQsCisJCQkJICB1aW50OF90ICpwZWVyTWFjKQoreworCXRVcGRhdGVWSFRPcE1vZGUgdGVtcFBhcmFtOworCisJdGVtcFBhcmFtLm9wTW9kZSA9IGNoYW5XaWR0aDsKKwl0ZW1wUGFyYW0uc3RhSWQgPSBzdGFJZDsKKwl0ZW1wUGFyYW0uc21lc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCWNkZl9tZW1fY29weSh0ZW1wUGFyYW0ucGVlcl9tYWMsIHBlZXJNYWMsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJbGltX3NlbmRfbW9kZV91cGRhdGUocE1hYywgJnRlbXBQYXJhbSwgcHNlc3Npb25FbnRyeSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBsaW1fc2V0X25zc19jaGFuZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCXVpbnQ4X3QgcnhOc3MsIHVpbnQ4X3Qgc3RhSWQsIHVpbnQ4X3QgKnBlZXJNYWMpCit7CisJdFVwZGF0ZVJ4TnNzIHRlbXBQYXJhbTsKKworCXRlbXBQYXJhbS5yeE5zcyA9IHJ4TnNzOworCXRlbXBQYXJhbS5zdGFJZCA9IHN0YUlkOworCXRlbXBQYXJhbS5zbWVzZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisJY2RmX21lbV9jb3B5KHRlbXBQYXJhbS5wZWVyX21hYywgcGVlck1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlsaW1fc2VuZF9yeF9uc3NfdXBkYXRlKHBNYWMsICZ0ZW1wUGFyYW0sIHBzZXNzaW9uRW50cnkpOworCisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgbGltX2NoZWNrX21lbWJlcnNoaXBfdXNlcl9wb3NpdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJCQl1aW50MzJfdCBtZW1iZXJzaGlwLCB1aW50MzJfdCB1c2VyUG9zaXRpb24sCisJCQkJCXVpbnQ4X3Qgc3RhSWQpCit7CisJdFVwZGF0ZU1lbWJlcnNoaXAgdGVtcFBhcmFtTWVtYmVyc2hpcDsKKwl0VXBkYXRlVXNlclBvcyB0ZW1wUGFyYW1Vc2VyUG9zaXRpb247CisKKwl0ZW1wUGFyYW1NZW1iZXJzaGlwLm1lbWJlcnNoaXAgPSBtZW1iZXJzaGlwOworCXRlbXBQYXJhbU1lbWJlcnNoaXAuc3RhSWQgPSBzdGFJZDsKKwl0ZW1wUGFyYW1NZW1iZXJzaGlwLnNtZXNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKwljZGZfbWVtX2NvcHkodGVtcFBhcmFtTWVtYmVyc2hpcC5wZWVyX21hYywgcHNlc3Npb25FbnRyeS0+YnNzSWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlsaW1fc2V0X21lbWJlcnNoaXAocE1hYywgJnRlbXBQYXJhbU1lbWJlcnNoaXAsIHBzZXNzaW9uRW50cnkpOworCisJdGVtcFBhcmFtVXNlclBvc2l0aW9uLnVzZXJQb3MgPSB1c2VyUG9zaXRpb247CisJdGVtcFBhcmFtVXNlclBvc2l0aW9uLnN0YUlkID0gc3RhSWQ7CisJdGVtcFBhcmFtVXNlclBvc2l0aW9uLnNtZXNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKwljZGZfbWVtX2NvcHkodGVtcFBhcmFtVXNlclBvc2l0aW9uLnBlZXJfbWFjLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWxpbV9zZXRfdXNlcl9wb3MocE1hYywgJnRlbXBQYXJhbVVzZXJQb3NpdGlvbiwgcHNlc3Npb25FbnRyeSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCit2b2lkIGxpbV9nZXRfc2hvcnRfc2xvdF9mcm9tX3BoeV9tb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisJCQkJICAgICAgdWludDMyX3QgcGh5TW9kZSwgdWludDhfdCAqcFNob3J0U2xvdEVuYWJsZWQpCit7CisJdWludDhfdCB2YWwgPSAwOworCisJLyogb25seSAyLjRHIGJhbmQgc2hvdWxkIGhhdmUgc2hvcnQgc2xvdCBlbmFibGUsIHJlc3QgaXQgc2hvdWxkIGJlIGRlZmF1bHQgKi8KKwlpZiAocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykgeworCQkvKiBzaG9ydCBzbG90IGlzIGRlZmF1bHQgaW4gYWxsIG90aGVyIG1vZGVzICovCisJCWlmICgocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IENERl9TQVBfTU9ERSkgfHwKKwkJICAgIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX0lCU1NfTU9ERSkgfHwKKwkJICAgIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKSkgeworCQkJdmFsID0gdHJ1ZTsKKwkJfQorCQkvKiBQcm9ncmFtIFBvbGFyaXMgYmFzZWQgb24gQVAgY2FwYWJpbGl0eSAqLworCQlpZiAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfSk9JTl9CRUFDT05fU1RBVEUpIHsKKwkJCS8qIEpvaW5pbmcgQlNTLiAqLworCQkJdmFsID0KKwkJCQlTSVJfTUFDX0dFVF9TSE9SVF9TTE9UX1RJTUUocHNlc3Npb25FbnRyeS0+CisJCQkJCQkJICAgIGxpbUN1cnJlbnRCc3NDYXBzKTsKKwkJfSBlbHNlIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PQorCQkJICAgZUxJTV9NTE1fV1RfUkVBU1NPQ19SU1BfU1RBVEUpIHsKKwkJCS8qIFJlYXNzb2NpYXRpbmcgd2l0aCBBUC4gKi8KKwkJCXZhbCA9CisJCQkJU0lSX01BQ19HRVRfU0hPUlRfU0xPVF9USU1FKHBzZXNzaW9uRW50cnktPgorCQkJCQkJCSAgICBsaW1SZWFzc29jQnNzQ2Fwcyk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiAxMUIgZG9lcyBub3Qgc2hvcnQgc2xvdCBhbmQgc2hvcnQgc2xvdCBpcyBkZWZhdWx0CisJCSAqIGZvciAxMUEgbW9kZS4gSGVuY2UsIG5vdCBuZWVkIHRvIHNldCB0aGlzIGJpdAorCQkgKi8KKwkJdmFsID0gZmFsc2U7CisJfQorCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgicGh5TW9kZSA9ICV1IHNob3J0c2xvdHN1cHBvcnRlZCA9ICV1IiksIHBoeU1vZGUsCisJCXZhbCk7CisJKnBTaG9ydFNsb3RFbmFibGVkID0gdmFsOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworLyoqCisgKgorICogXGJyaWVmIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHZhcmlvdXMgTElNIG1vZHVsZXMgdG8gY29ycmVjdGx5IHNldAorICogdGhlIFByb3RlY3RlZCBiaXQgaW4gdGhlIEZyYW1lIENvbnRyb2wgRmllbGQgb2YgdGhlIDgwMi4xMSBmcmFtZSBNQUMgaGVhZGVyCisgKgorICoKKyAqIFxwYXJhbSAgcE1hYyBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogXHBhcmFtIHBzZXNzaW9uRW50cnkgUG9pbnRlciB0byBzZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbm5lY3Rpb24KKyAqCisgKiBccGFyYW0gcGVlciBQZWVyIGFkZHJlc3Mgb2YgdGhlIFNUQSB0byB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgc2VudAorICoKKyAqIFxwYXJhbSBwTWFjSGRyIFBvaW50ZXIgdG8gdGhlIGZyYW1lIE1BQyBoZWFkZXIKKyAqCisgKiBccmV0dXJuIG5vdGhpbmcKKyAqCisgKgorICovCit2b2lkCitsaW1fc2V0X3Byb3RlY3RlZF9iaXQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJICAgICAgdFNpck1hY0FkZHIgcGVlciwgdHBTaXJNYWNNZ210SGRyIHBNYWNIZHIpCit7CisJdWludDE2X3QgYWlkOworCXRwRHBoSGFzaE5vZGUgcFN0YURzOworCisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpIHx8CisJICAgIExJTV9JU19CVF9BTVBfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCisJCXBTdGFEcyA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShwTWFjLCBwZWVyLCAmYWlkLAorCQkJCQkgICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCQlpZiAocFN0YURzICE9IE5VTEwpIHsKKwkJCS8qIHJtZmVuYWJsZWQgd2lsbCBiZSBzZXQgYXQgdGhlIHRpbWUgb2YgYWRkYnNzLgorCQkJICogYnV0IHNvbWV0aW1lcyBFQVAgYXV0aCBmYWlscyBhbmQga2V5cyBhcmUgbm90CisJCQkgKiBpbnN0YWxsZWQgdGhlbiBpZiB3ZSBzZW5kIGFueSBtYW5hZ2VtZW50IGZyYW1lCisJCQkgKiBsaWtlIGRlYXV0aC9kaXNhc3NvYyB3aXRoIHRoaXMgYml0IHNldCB0aGVuCisJCQkgKiBmaXJtd2FyZSBjcmFzaGVzLiBzbyBjaGVjayBmb3Iga2V5cyBhcmUKKwkJCSAqIGluc3RhbGxlZCBvciBub3QgYWxzbyBiZWZvcmUgc2V0dGluZyB0aGUgYml0CisJCQkgKi8KKwkJCWlmIChwU3RhRHMtPnJtZkVuYWJsZWQgJiYgcFN0YURzLT5pc19rZXlfaW5zdGFsbGVkKQorCQkJCXBNYWNIZHItPmZjLndlcCA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKHBzZXNzaW9uRW50cnktPmxpbVJtZkVuYWJsZWQgJiYKKwkJCXBzZXNzaW9uRW50cnktPmlzX2tleV9pbnN0YWxsZWQpIHsKKwkJcE1hY0hkci0+ZmMud2VwID0gMTsKKwl9Cit9IC8qKiogZW5kIGxpbV9zZXRfcHJvdGVjdGVkX2JpdCgpICoqKi8KKyNlbmRpZgorCit2b2lkIGxpbV9zZXRfaHRfY2Fwcyh0cEFuaVNpckdsb2JhbCBwX21hYywgdHBQRVNlc3Npb24gcF9zZXNzaW9uX2VudHJ5LAorCQl1aW50OF90ICpwX2llX3N0YXJ0LCB1aW50MzJfdCBudW1fYnl0ZXMpCit7CisJdWludDhfdCAqcF9pZSA9IE5VTEw7CisJdERvdDExZklFSFRDYXBzIGRvdDExX2h0X2NhcCA9IHswLH07CisKKwlwb3B1bGF0ZV9kb3QxMWZfaHRfY2FwcyhwX21hYywgcF9zZXNzaW9uX2VudHJ5LCAmZG90MTFfaHRfY2FwKTsKKwlwX2llID0gbGltX2dldF9pZV9wdHJfbmV3KHBfbWFjLCBwX2llX3N0YXJ0LCBudW1fYnl0ZXMsCisJCQlET1QxMUZfRUlEX0hUQ0FQUywgT05FX0JZVEUpOworCWxpbV9sb2cocF9tYWMsIExPRzIsIEZMKCJwX2llICVwIGRvdDExX2h0X2NhcC5zdXBwb3J0ZWRNQ1NTZXRbMF09MHgleCIpLAorCQlwX2llLCBkb3QxMV9odF9jYXAuc3VwcG9ydGVkTUNTU2V0WzBdKTsKKwlpZiAocF9pZSkgeworCQkvKiBjb252ZXJ0IGZyb20gdW5wYWNrZWQgdG8gcGFja2VkIHN0cnVjdHVyZSAqLworCQl0SHRDYXBzICpwX2h0X2NhcCA9ICh0SHRDYXBzICopICZwX2llWzJdOworCisJCXBfaHRfY2FwLT5hZHZDb2RpbmdDYXAgPSBkb3QxMV9odF9jYXAuYWR2Q29kaW5nQ2FwOworCQlwX2h0X2NhcC0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCWRvdDExX2h0X2NhcC5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJCXBfaHRfY2FwLT5taW1vUG93ZXJTYXZlID0gZG90MTFfaHRfY2FwLm1pbW9Qb3dlclNhdmU7CisJCXBfaHRfY2FwLT5ncmVlbkZpZWxkID0gZG90MTFfaHRfY2FwLmdyZWVuRmllbGQ7CisJCXBfaHRfY2FwLT5zaG9ydEdJMjBNSHogPSBkb3QxMV9odF9jYXAuc2hvcnRHSTIwTUh6OworCQlwX2h0X2NhcC0+c2hvcnRHSTQwTUh6ID0gZG90MTFfaHRfY2FwLnNob3J0R0k0ME1IejsKKwkJcF9odF9jYXAtPnR4U1RCQyA9IGRvdDExX2h0X2NhcC50eFNUQkM7CisJCXBfaHRfY2FwLT5yeFNUQkMgPSBkb3QxMV9odF9jYXAucnhTVEJDOworCQlwX2h0X2NhcC0+ZGVsYXllZEJBID0gZG90MTFfaHRfY2FwLmRlbGF5ZWRCQTsKKwkJcF9odF9jYXAtPm1heGltYWxBTVNEVXNpemUgPSBkb3QxMV9odF9jYXAubWF4aW1hbEFNU0RVc2l6ZTsKKwkJcF9odF9jYXAtPmRzc3NDY2tNb2RlNDBNSHogPSBkb3QxMV9odF9jYXAuZHNzc0Nja01vZGU0ME1IejsKKwkJcF9odF9jYXAtPnBzbXAgPSBkb3QxMV9odF9jYXAucHNtcDsKKwkJcF9odF9jYXAtPnN0YmNDb250cm9sRnJhbWUgPSBkb3QxMV9odF9jYXAuc3RiY0NvbnRyb2xGcmFtZTsKKwkJcF9odF9jYXAtPmxzaWdUWE9QUHJvdGVjdGlvbiA9IGRvdDExX2h0X2NhcC5sc2lnVFhPUFByb3RlY3Rpb247CisJCXBfaHRfY2FwLT5tYXhSeEFNUERVRmFjdG9yID0gZG90MTFfaHRfY2FwLm1heFJ4QU1QRFVGYWN0b3I7CisJCXBfaHRfY2FwLT5tcGR1RGVuc2l0eSA9IGRvdDExX2h0X2NhcC5tcGR1RGVuc2l0eTsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopcF9odF9jYXAtPnN1cHBvcnRlZE1DU1NldCwKKwkJCSh2b2lkICopKGRvdDExX2h0X2NhcC5zdXBwb3J0ZWRNQ1NTZXQpLAorCQkJc2l6ZW9mKHBfaHRfY2FwLT5zdXBwb3J0ZWRNQ1NTZXQpKTsKKwkJcF9odF9jYXAtPnBjbyA9IGRvdDExX2h0X2NhcC5wY287CisJCXBfaHRfY2FwLT50cmFuc2l0aW9uVGltZSA9IGRvdDExX2h0X2NhcC50cmFuc2l0aW9uVGltZTsKKwkJcF9odF9jYXAtPm1jc0ZlZWRiYWNrID0gZG90MTFfaHRfY2FwLm1jc0ZlZWRiYWNrOworCQlwX2h0X2NhcC0+dHhCRiA9IGRvdDExX2h0X2NhcC50eEJGOworCQlwX2h0X2NhcC0+cnhTdGFnZ2VyZWRTb3VuZGluZyA9CisJCQlkb3QxMV9odF9jYXAucnhTdGFnZ2VyZWRTb3VuZGluZzsKKwkJcF9odF9jYXAtPnR4U3RhZ2dlcmVkU291bmRpbmcgPQorCQkJZG90MTFfaHRfY2FwLnR4U3RhZ2dlcmVkU291bmRpbmc7CisJCXBfaHRfY2FwLT5yeFpMRiA9IGRvdDExX2h0X2NhcC5yeFpMRjsKKwkJcF9odF9jYXAtPnR4WkxGID0gZG90MTFfaHRfY2FwLnR4WkxGOworCQlwX2h0X2NhcC0+aW1wbGljaXRUeEJGID0gZG90MTFfaHRfY2FwLmltcGxpY2l0VHhCRjsKKwkJcF9odF9jYXAtPmNhbGlicmF0aW9uID0gZG90MTFfaHRfY2FwLmNhbGlicmF0aW9uOworCQlwX2h0X2NhcC0+ZXhwbGljaXRDU0lUeEJGID0gZG90MTFfaHRfY2FwLmV4cGxpY2l0Q1NJVHhCRjsKKwkJcF9odF9jYXAtPmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggPQorCQkJZG90MTFfaHRfY2FwLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXg7CisJCXBfaHRfY2FwLT5leHBsaWNpdEJGQ1NJRmVlZGJhY2sgPQorCQkJZG90MTFfaHRfY2FwLmV4cGxpY2l0QkZDU0lGZWVkYmFjazsKKwkJcF9odF9jYXAtPmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayA9CisJCQlkb3QxMV9odF9jYXAuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrOworCQlwX2h0X2NhcC0+ZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayA9CisJCQlkb3QxMV9odF9jYXAuZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjazsKKwkJcF9odF9jYXAtPmNzaU51bUJGQW50ZW5uYWUgPSBkb3QxMV9odF9jYXAuY3NpTnVtQkZBbnRlbm5hZTsKKwkJcF9odF9jYXAtPnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSA9CisJCQlkb3QxMV9odF9jYXAudW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlOworCQlwX2h0X2NhcC0+Y29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSA9CisJCQlkb3QxMV9odF9jYXAuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZTsKKwkJcF9odF9jYXAtPmFudGVubmFTZWxlY3Rpb24gPSBkb3QxMV9odF9jYXAuYW50ZW5uYVNlbGVjdGlvbjsKKwkJcF9odF9jYXAtPmV4cGxpY2l0Q1NJRmVlZGJhY2tUeCA9CisJCQlkb3QxMV9odF9jYXAuZXhwbGljaXRDU0lGZWVkYmFja1R4OworCQlwX2h0X2NhcC0+YW50ZW5uYUluZGljZXNGZWVkYmFja1R4ID0KKwkJCWRvdDExX2h0X2NhcC5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHg7CisJCXBfaHRfY2FwLT5leHBsaWNpdENTSUZlZWRiYWNrID0KKwkJCWRvdDExX2h0X2NhcC5leHBsaWNpdENTSUZlZWRiYWNrOworCQlwX2h0X2NhcC0+YW50ZW5uYUluZGljZXNGZWVkYmFjayA9CisJCQlkb3QxMV9odF9jYXAuYW50ZW5uYUluZGljZXNGZWVkYmFjazsKKwkJcF9odF9jYXAtPnJ4QVMgPSBkb3QxMV9odF9jYXAucnhBUzsKKwkJcF9odF9jYXAtPnR4U291bmRpbmdQUERVcyA9IGRvdDExX2h0X2NhcC50eFNvdW5kaW5nUFBEVXM7CisJfQorfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKK3ZvaWQgbGltX3NldF92aHRfY2Fwcyh0cEFuaVNpckdsb2JhbCBwX21hYywgdHBQRVNlc3Npb24gcF9zZXNzaW9uX2VudHJ5LAorCQkgICAgICB1aW50OF90ICpwX2llX3N0YXJ0LCB1aW50MzJfdCBudW1fYnl0ZXMpCit7CisJdWludDhfdCAgICAgICAgICAgICAgKnBfaWUgPSBOVUxMOworCXREb3QxMWZJRVZIVENhcHMgICAgIGRvdDExX3ZodF9jYXA7CisKKwlwb3B1bGF0ZV9kb3QxMWZfdmh0X2NhcHMocF9tYWMsIHBfc2Vzc2lvbl9lbnRyeSwgJmRvdDExX3ZodF9jYXApOworCXBfaWUgPSBsaW1fZ2V0X2llX3B0cl9uZXcocF9tYWMsIHBfaWVfc3RhcnQsIG51bV9ieXRlcywKKwkJCQkgIERPVDExRl9FSURfVkhUQ0FQUywgT05FX0JZVEUpOworCisJaWYgKHBfaWUpIHsKKwkJdFNpck1hY1ZIVENhcGFiaWxpdHlJbmZvICp2aHRfY2FwID0KKwkJCQkJKHRTaXJNYWNWSFRDYXBhYmlsaXR5SW5mbyAqKSAmcF9pZVsyXTsKKwkJdFNpclZodE1jc0luZm8gKnZodF9tY3MgPSAodFNpclZodE1jc0luZm8gKikgJnBfaWVbMiArCisJCQkJCSAgc2l6ZW9mKHRTaXJNYWNWSFRDYXBhYmlsaXR5SW5mbyldOworCisJCXVuaW9uIHsKKwkJCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICB1X3ZhbHVlOworCQkJdFNpck1hY1ZIVFJ4U3VwRGF0YVJhdGVJbmZvICAgIHZodF9yeF9zdXBwX3JhdGU7CisJCQl0U2lyTWFjVkhUVHhTdXBEYXRhUmF0ZUluZm8gICAgdmh0X3R4X3N1cHBfcmF0ZTsKKwkJfSB1X3ZodF9kYXRhX3JhdGVfaW5mbzsKKworCQl2aHRfY2FwLT5tYXhNUERVTGVuID0gZG90MTFfdmh0X2NhcC5tYXhNUERVTGVuOworCQl2aHRfY2FwLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCQlkb3QxMV92aHRfY2FwLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKwkJdmh0X2NhcC0+bGRwY0NvZGluZ0NhcCA9IGRvdDExX3ZodF9jYXAubGRwY0NvZGluZ0NhcDsKKwkJdmh0X2NhcC0+c2hvcnRHSTgwTUh6ID0gZG90MTFfdmh0X2NhcC5zaG9ydEdJODBNSHo7CisJCXZodF9jYXAtPnNob3J0R0kxNjBhbmQ4MHBsdXM4ME1IeiA9CisJCQkJCWRvdDExX3ZodF9jYXAuc2hvcnRHSTE2MGFuZDgwcGx1czgwTUh6OworCQl2aHRfY2FwLT50eFNUQkMgPSBkb3QxMV92aHRfY2FwLnR4U1RCQzsKKwkJdmh0X2NhcC0+cnhTVEJDID0gZG90MTFfdmh0X2NhcC5yeFNUQkM7CisJCXZodF9jYXAtPnN1QmVhbUZvcm1lckNhcCA9IGRvdDExX3ZodF9jYXAuc3VCZWFtRm9ybWVyQ2FwOworCQl2aHRfY2FwLT5zdUJlYW1mb3JtZWVDYXAgPSBkb3QxMV92aHRfY2FwLnN1QmVhbWZvcm1lZUNhcDsKKwkJdmh0X2NhcC0+Y3Nub2ZCZWFtZm9ybWVyQW50U3VwID0KKwkJCQkJZG90MTFfdmh0X2NhcC5jc25vZkJlYW1mb3JtZXJBbnRTdXA7CisJCXZodF9jYXAtPm51bVNvdW5kaW5nRGltID0gZG90MTFfdmh0X2NhcC5udW1Tb3VuZGluZ0RpbTsKKwkJdmh0X2NhcC0+bXVCZWFtZm9ybWVyQ2FwID0gZG90MTFfdmh0X2NhcC5tdUJlYW1mb3JtZXJDYXA7CisJCXZodF9jYXAtPm11QmVhbWZvcm1lZUNhcCA9IGRvdDExX3ZodF9jYXAubXVCZWFtZm9ybWVlQ2FwOworCQl2aHRfY2FwLT52aHRUWE9QUFMgPSBkb3QxMV92aHRfY2FwLnZodFRYT1BQUzsKKwkJdmh0X2NhcC0+aHRjVkhUQ2FwID0gZG90MTFfdmh0X2NhcC5odGNWSFRDYXA7CisJCXZodF9jYXAtPm1heEFNUERVTGVuRXhwID0gZG90MTFfdmh0X2NhcC5tYXhBTVBEVUxlbkV4cDsKKwkJdmh0X2NhcC0+dmh0TGlua0FkYXB0Q2FwID0gZG90MTFfdmh0X2NhcC52aHRMaW5rQWRhcHRDYXA7CisJCXZodF9jYXAtPnJ4QW50UGF0dGVybiA9IGRvdDExX3ZodF9jYXAucnhBbnRQYXR0ZXJuOworCQl2aHRfY2FwLT50eEFudFBhdHRlcm4gPSBkb3QxMV92aHRfY2FwLnR4QW50UGF0dGVybjsKKwkJdmh0X2NhcC0+cmVzZXJ2ZWQxID0gZG90MTFfdmh0X2NhcC5yZXNlcnZlZDE7CisKKwkJLyogUG9wdWxhdGUgVkhUIE1DUyBJbmZvcm1hdGlvbiAqLworCQl2aHRfbWNzLT5yeE1jc01hcCA9IGRvdDExX3ZodF9jYXAucnhNQ1NNYXA7CisJCXVfdmh0X2RhdGFfcmF0ZV9pbmZvLnZodF9yeF9zdXBwX3JhdGUucnhTdXBEYXRhUmF0ZSA9CisJCQkJCWRvdDExX3ZodF9jYXAucnhIaWdoU3VwRGF0YVJhdGU7CisJCXVfdmh0X2RhdGFfcmF0ZV9pbmZvLnZodF9yeF9zdXBwX3JhdGUucmVzZXJ2ZWQgPQorCQkJCQlkb3QxMV92aHRfY2FwLnJlc2VydmVkMjsKKwkJdmh0X21jcy0+cnhIaWdoZXN0ID0gdV92aHRfZGF0YV9yYXRlX2luZm8udV92YWx1ZTsKKworCQl2aHRfbWNzLT50eE1jc01hcCA9IGRvdDExX3ZodF9jYXAudHhNQ1NNYXA7CisJCXVfdmh0X2RhdGFfcmF0ZV9pbmZvLnZodF90eF9zdXBwX3JhdGUudHhTdXBEYXRhUmF0ZSA9CisJCQkJCWRvdDExX3ZodF9jYXAudHhTdXBEYXRhUmF0ZTsKKwkJdV92aHRfZGF0YV9yYXRlX2luZm8udmh0X3R4X3N1cHBfcmF0ZS5yZXNlcnZlZCA9CisJCQkJCWRvdDExX3ZodF9jYXAucmVzZXJ2ZWQzOworCQl2aHRfbWNzLT50eEhpZ2hlc3QgPSB1X3ZodF9kYXRhX3JhdGVfaW5mby51X3ZhbHVlOworCX0KK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFBQyAqLworCisvKioKKyAqIGxpbV92YWxpZGF0ZV9yZWNlaXZlZF9mcmFtZV9hMV9hZGRyKCkgLSBUbyB2YWxpZGF0ZSByZWNlaXZlZCBmcmFtZSdzIEExIGFkZHIKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKiBAYTE6IHJlY2VpdmVkIGZyYW1lJ3MgYTEgYWRkcmVzcyB3aGljaCBpcyBub3RoaW5nIGJ1dCBvdXIgc2VsZiBhZGRyZXNzCisgKiBAc2Vzc2lvbjogUEUgc2Vzc2lvbiBwb2ludGVyCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgdmFsaWRhdGUsIEExIGFkZHJlcyBvZiB0aGUgcmVjZWl2ZWQgZnJhbWUKKyAqCisgKiBSZXR1cm46IHRydWUgb3IgZmFsc2UKKyAqLworYm9vbCBsaW1fdmFsaWRhdGVfcmVjZWl2ZWRfZnJhbWVfYTFfYWRkcih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl0U2lyTWFjQWRkciBhMSwgdHBQRVNlc3Npb24gc2Vzc2lvbikKK3sKKwlpZiAobWFjX2N0eCA9PSBOVUxMIHx8IHNlc3Npb24gPT0gTlVMTCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJIm1hYyBvciBzZXNzaW9uIGNvbnRleHQgaXMgbnVsbCIpOworCQkvKiBsZXQgbWFpbiByb3V0aW5lIGhhbmRsZSBpdCAqLworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKGxpbV9pc19ncm91cF9hZGRyKGExKSB8fCBsaW1faXNfYWRkcl9iYyhhMSkpIHsKKwkJLyoganVzdCBmb3IgZmFpbCBzYWZlLCBkb24ndCBoYW5kbGUgTUMvQkMgYTEgaW4gdGhpcyByb3V0aW5lICovCisJCXJldHVybiB0cnVlOworCX0KKwlpZiAoIWNkZl9tZW1fY29tcGFyZShhMSwgc2Vzc2lvbi0+c2VsZk1hY0FkZHIsIDYpKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiSW52YWxpZCBBMSBhZGRyZXNzIGluIHJlY2VpdmVkIGZyYW1lIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGxpbV9jaGVja19hbmRfcmVzZXRfcHJvdGVjdGlvbl9wYXJhbXMoKSAtIHJlc2V0IHByb3RlY3Rpb24gcmVsYXRlZCBwYXJhbWV0ZXJzCisgKgorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAqCisgKiByZXNldHMgcHJvdGVjdGlvbiByZWxhdGVkIGdsb2JhbCBwYXJhbWV0ZXJzIGlmIHRoZSBwZSBhY3RpdmUgc2Vzc2lvbiBjb3VudAorICogaXMgemVyby4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBsaW1fY2hlY2tfYW5kX3Jlc2V0X3Byb3RlY3Rpb25fcGFyYW1zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJaWYgKCFwZV9nZXRfYWN0aXZlX3Nlc3Npb25fY291bnQobWFjX2N0eCkpIHsKKwkJY2RmX21lbV96ZXJvKCZtYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXAxMWdQYXJhbXMsCisJCQlzaXplb2YobWFjX2N0eC0+bGltLmdMaW1PdmVybGFwMTFnUGFyYW1zKSk7CisJCWNkZl9tZW1femVybygmbWFjX2N0eC0+bGltLmdMaW1PdmVybGFwMTFhUGFyYW1zLAorCQkJc2l6ZW9mKG1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcDExYVBhcmFtcykpOworCQljZGZfbWVtX3plcm8oJm1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMsCisJCQlzaXplb2YobWFjX2N0eC0+bGltLmdMaW1PdmVybGFwSHQyMFBhcmFtcykpOworCQljZGZfbWVtX3plcm8oJm1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLAorCQkJc2l6ZW9mKG1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zKSk7CisKKwkJbWFjX2N0eC0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisJfQorfQorCisvKioKKyAqIGxpbV9zZXRfc3RhZHNfcnR0X2NhcCgpIC0gdXBkYXRlIHN0YXRpb24gbm9kZSBSVFQgY2FwYWJpbGl0eQorICogQHN0YV9kczogU3RhdGlvbiBoYXNoIG5vZGUKKyAqIEBleHRfY2FwOiBQb2ludGVyIHRvIGV4dGVuZGVkIGNhcGFiaWxpdHkKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqCisgKiBUaGlzIGZ1bmNpdG9uIHVwZGF0ZSBoYXNoIG5vZGUncyBSVFQgY2FwYWJpbGl0eSBiYXNlZCBvbiByZWNlaXZlZAorICogRXh0ZW5kZWQgY2FwYWJpbGl0eSBJRS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBsaW1fc2V0X3N0YWRzX3J0dF9jYXAodHBEcGhIYXNoTm9kZSBzdGFfZHMsIHN0cnVjdCBzX2V4dF9jYXAgKmV4dF9jYXAsCisJCQkgICB0cEFuaVNpckdsb2JhbCBtYWNfY3R4KQoreworCXN0YV9kcy0+dGltaW5nTWVhc0NhcCA9IDA7CisJc3RhX2RzLT50aW1pbmdNZWFzQ2FwIHw9IChleHRfY2FwLT50aW1pbmdfbWVhcykgPworCQkJCSAgUlRUX1RJTUlOR19NRUFTX0NBUEFCSUxJVFkgOgorCQkJCSAgUlRUX0lOVkFMSUQ7CisJc3RhX2RzLT50aW1pbmdNZWFzQ2FwIHw9IChleHRfY2FwLT5maW5lX3RpbWVfbWVhc19pbml0aWF0b3IpID8KKwkJCQkgIFJUVF9GSU5FX1RJTUVfTUVBU19JTklUSUFUT1JfQ0FQQUJJTElUWSA6CisJCQkJICBSVFRfSU5WQUxJRDsKKwlzdGFfZHMtPnRpbWluZ01lYXNDYXAgfD0gKGV4dF9jYXAtPmZpbmVfdGltZV9tZWFzX3Jlc3BvbmRlcikgPworCQkJCSAgUlRUX0ZJTkVfVElNRV9NRUFTX1JFU1BPTkRFUl9DQVBBQklMSVRZIDoKKwkJCQkgIFJUVF9JTlZBTElEOworCisJbGltX2xvZyhtYWNfY3R4LCBMT0cxLAorCSAgICBGTCgiRXh0Q2FwIHByZXNlbnQsIHRpbWluZ01lYXM6ICVkIEluaXRpYXRvcjogJWQgUmVzcG9uZGVyOiAlZCIpLAorCSAgICBleHRfY2FwLT50aW1pbmdfbWVhcywgZXh0X2NhcC0+ZmluZV90aW1lX21lYXNfaW5pdGlhdG9yLAorCSAgICBleHRfY2FwLT5maW5lX3RpbWVfbWVhc19yZXNwb25kZXIpOworfQorCisvKioKKyAqIGxpbV9zZW5kX2V4dF9jYXBfaWUoKSAtIHNlbmQgZXh0IGNhcCBJRSB0byBGVworICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dAorICogQHNlc3Npb25fZW50cnk6IFBFIHNlc3Npb24KKyAqIEBleHRyYV9leHRjYXA6IGV4dHJhY3RlZCBleHQgY2FwCisgKiBAbWVyZ2U6IG1lcmdlIGV4dHJhIGV4dCBjYXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgYWZ0ZXIgVkRFViBpcyBjcmVhdGVkIHRvIHVwZGF0ZSBmaXJtd2FyZQorICogYWJvdXQgdGhlIGV4dGVuZGVkIGNhcGFiaWxpdGllcyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIFZERVYgaXMgY2FwYWJsZQorICogb2YuIFNpbmNlIFNUQS9TQVAgY2FuIGhhdmUgZGlmZmVyZW50IEV4dGVuZGVkIGNhcGFiaWxpdGllcyBzZXQsIHRoaXMgZnVuY3Rpb24KKyAqIGlzIGNhbGxlZCBwZXIgdmRldiBjcmVhdGlvbi4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBsaW1fc2VuZF9leHRfY2FwX2llKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkgICAgICAgdWludDMyX3Qgc2Vzc2lvbl9pZCwKKwkJCSAgICAgICB0RG90MTFmSUVFeHRDYXAgKmV4dHJhX2V4dGNhcCwgYm9vbCBtZXJnZSkKK3sKKwl0RG90MTFmSUVFeHRDYXAgZXh0X2NhcF9kYXRhID0gezB9OworCXVpbnQzMl90IGRvdDExbW9kZSwgbnVtX2J5dGVzOworCWJvb2wgdmh0X2VuYWJsZWQgPSBmYWxzZTsKKwlzdHJ1Y3QgdmRldl9pZV9pbmZvICp2ZGV2X2llOworCWNkc19tc2dfdCBtc2cgPSB7MH07CisJdFNpclJldFN0YXR1cyBzdGF0dXM7CisJdWludDhfdCAqdGVtcCwgaTsKKworCXdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19ET1QxMV9NT0RFLCAmZG90MTFtb2RlKTsKKwlpZiAoSVNfRE9UMTFfTU9ERV9WSFQoZG90MTFtb2RlKSkKKwkJdmh0X2VuYWJsZWQgPSB0cnVlOworCisJc3RhdHVzID0gcG9wdWxhdGVfZG90MTFmX2V4dF9jYXAobWFjX2N0eCwgdmh0X2VuYWJsZWQsICZleHRfY2FwX2RhdGEsCisJCQkJCSBOVUxMKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHN0YXR1cykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJGYWlsZWQgdG8gcG9wdWxhdGUgZXh0IGNhcCBJRSIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCW51bV9ieXRlcyA9IGV4dF9jYXBfZGF0YS5udW1fYnl0ZXM7CisKKwlpZiAobWVyZ2UgJiYgTlVMTCAhPSBleHRyYV9leHRjYXAgJiYgZXh0cmFfZXh0Y2FwLT5udW1fYnl0ZXMgPiAwKSB7CisJCWlmIChleHRyYV9leHRjYXAtPm51bV9ieXRlcyA+IGV4dF9jYXBfZGF0YS5udW1fYnl0ZXMpCisJCQludW1fYnl0ZXMgPSBleHRyYV9leHRjYXAtPm51bV9ieXRlczsKKwkJbGltX21lcmdlX2V4dGNhcF9zdHJ1Y3QoJmV4dF9jYXBfZGF0YSwgZXh0cmFfZXh0Y2FwKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBXTUkgcmVxdWVzdCwgYW5kIGNvcHkgdGhlIHBhcmFtZXRlciAqLworCXZkZXZfaWUgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnZkZXZfaWUpICsgbnVtX2J5dGVzKTsKKwlpZiAoIXZkZXZfaWUpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwl2ZGV2X2llLT52ZGV2X2lkID0gc2Vzc2lvbl9pZDsKKwl2ZGV2X2llLT5pZV9pZCA9IERPVDExRl9FSURfRVhUQ0FQOworCXZkZXZfaWUtPmxlbmd0aCA9IG51bV9ieXRlczsKKworCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoInZkZXYgJWQgaWVpZCAlZCBsZW4gJWQiKSwgc2Vzc2lvbl9pZCwKKwkJCURPVDExRl9FSURfRVhUQ0FQLCBudW1fYnl0ZXMpOworCXRlbXAgPSBleHRfY2FwX2RhdGEuYnl0ZXM7CisJZm9yIChpID0gMDsgaSA8IG51bV9ieXRlczsgaSsrLCB0ZW1wKyspCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIiVkIGJ5dGUgaXMgJTAyeCIpLCBpKzEsICp0ZW1wKTsKKworCXZkZXZfaWUtPmRhdGEgPSAodWludDhfdCAqKXZkZXZfaWUgKyBzaXplb2YoKnZkZXZfaWUpOworCWNkZl9tZW1fY29weSh2ZGV2X2llLT5kYXRhLCBleHRfY2FwX2RhdGEuYnl0ZXMsIG51bV9ieXRlcyk7CisKKwltc2cudHlwZSA9IFdNQV9TRVRfSUVfSU5GTzsKKwltc2cuYm9keXB0ciA9IHZkZXZfaWU7CisJbXNnLnJlc2VydmVkID0gMDsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkgICAgICAgRkwoIk5vdCBhYmxlIHRvIHBvc3QgV01BX1NFVF9JRV9JTkZPIHRvIFdEQSIpKTsKKwkJY2RmX21lbV9mcmVlKHZkZXZfaWUpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBsaW1fc3RyaXBfZXh0Y2FwX2llKCkgLSBzdHJpcCBleHRlbmRlZCBjYXBhYmlsaXR5IElFIGZyb20gSUUgYnVmZmVyCisgKiBAbWFjX2N0eDogZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAYWRkbl9pZTogQWRkaXRpb25hbCBJRSBidWZmZXIKKyAqIEBhZGRuX2llbGVuOiBMZW5ndGggb2YgYWRkaXRpb25hbCBJRQorICogQGV4dHJhY3RlZF9pZTogaWYgbm90IE5VTEwsIGNvcHkgdGhlIHN0cmlwcGVkIElFIHRvIHRoaXMgYnVmZmVyCisgKgorICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RyaXAgb2YgdGhlIGV4dGVuZGVkIGNhcGFiaWxpdHkgSUUgcHJlc2VudAorICogaW4gYWRkaXRpb25hbCBJRSBidWZmZXIuCisgKgorICogUmV0dXJuOiB0U2lyUmV0U3RhdHVzCisgKi8KK3RTaXJSZXRTdGF0dXMgbGltX3N0cmlwX2V4dGNhcF9pZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50OF90ICphZGRuX2llLCB1aW50MTZfdCAqYWRkbl9pZWxlbiwgdWludDhfdCAqZXh0cmFjdGVkX2llKQoreworCXVpbnQ4X3QgKnRlbXBidWYgPSBOVUxMOworCXVpbnQxNl90IHRlbXBsZW4gPSAwOworCWludCBsZWZ0ID0gKmFkZG5faWVsZW47CisJdWludDhfdCAqcHRyID0gYWRkbl9pZTsKKwl1aW50OF90IGVsZW1faWQsIGVsZW1fbGVuOworCisJaWYgKE5VTEwgPT0gYWRkbl9pZSkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsIEZMKCJOVUxMIGFkZG5faWUgcG9pbnRlciIpKTsKKwkJcmV0dXJuIGVTSVJfSUdOT1JFX0lFOworCX0KKworCXRlbXBidWYgPSBjZGZfbWVtX21hbGxvYyhsZWZ0KTsKKwlpZiAoTlVMTCA9PSB0ZW1wYnVmKSB7CisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKSk7CisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJfQorCisJd2hpbGUgKGxlZnQgPj0gMikgeworCQllbGVtX2lkICA9IHB0clswXTsKKwkJZWxlbV9sZW4gPSBwdHJbMV07CisJCWxlZnQgLT0gMjsKKwkJaWYgKGVsZW1fbGVuID4gbGVmdCkgeworCQkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJJbnZhbGlkIElFcyBlaWQgPSAlZCBlbGVtX2xlbj0lZCBsZWZ0PSVkIiksCisJCQkJZWxlbV9pZCwgZWxlbV9sZW4sIGxlZnQpOworCQkJY2RmX21lbV9mcmVlKHRlbXBidWYpOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCQlpZiAoIShET1QxMUZfRUlEX0VYVENBUCA9PSBlbGVtX2lkKSkgeworCQkJY2RmX21lbV9jb3B5KHRlbXBidWYgKyB0ZW1wbGVuLCAmcHRyWzBdLCBlbGVtX2xlbiArIDIpOworCQkJdGVtcGxlbiArPSAoZWxlbV9sZW4gKyAyKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChOVUxMICE9IGV4dHJhY3RlZF9pZSkgeworCQkJCWNkZl9tZW1fc2V0KGV4dHJhY3RlZF9pZSwKKwkJCQkJRE9UMTFGX0lFX0VYVENBUF9NQVhfTEVOICsgMiwgMCk7CisJCQkJaWYgKGVsZW1fbGVuIDw9IERPVDExRl9JRV9FWFRDQVBfTUFYX0xFTikKKwkJCQkJY2RmX21lbV9jb3B5KGV4dHJhY3RlZF9pZSwgJnB0clswXSwKKwkJCQkJCSAgICAgZWxlbV9sZW4gKyAyKTsKKwkJCX0KKwkJfQorCQlsZWZ0IC09IGVsZW1fbGVuOworCQlwdHIgKz0gKGVsZW1fbGVuICsgMik7CisJfQorCWNkZl9tZW1fY29weShhZGRuX2llLCB0ZW1wYnVmLCB0ZW1wbGVuKTsKKworCSphZGRuX2llbGVuID0gdGVtcGxlbjsKKwljZGZfbWVtX2ZyZWUodGVtcGJ1Zik7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKioKKyAqIGxpbV91cGRhdGVfZXh0Y2FwX3N0cnVjdCgpIC0gcG9wdXRsYXRlIHRoZSBkb3QxMWYgc3RydWN0dXJlCisgKiBAbWFjX2N0eDogZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAYnVmOiBleHRyYWN0ZWQgSUUgYnVmZmVyCisgKiBAZHN0OiBleHRlbmRlZCBjYXBhYmlsaXR5IElFIHN0cnVjdHVyZSB0byBiZSB1cGRhdGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgZXh0ZW5kZWQgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUKKyAqIHdpdGggQGJ1Zi4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBsaW1fdXBkYXRlX2V4dGNhcF9zdHJ1Y3QodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwl1aW50OF90ICpidWYsIHREb3QxMWZJRUV4dENhcCAqZHN0KQoreworCXVpbnQ4X3Qgb3V0W0RPVDExRl9JRV9FWFRDQVBfTUFYX0xFTl07CisKKwlpZiAoTlVMTCA9PSBidWYpIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiSW52YWxpZCBCdWZmZXIgQWRkcmVzcyIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChOVUxMID09IGRzdCkgeworCQlsaW1fbG9nKG1hY19jdHgsIExPR0UsIEZMKCJOVUxMIGRzdCBwb2ludGVyIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKERPVDExRl9FSURfRVhUQ0FQICE9IGJ1ZlswXSB8fCBidWZbMV0gPiBET1QxMUZfSUVfRVhUQ0FQX01BWF9MRU4pIHsKKwkJbGltX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiSW52YWxpZCBJRXMgZWlkID0gJWQgZWxlbV9sZW49JWQgIiksCisJCQkJYnVmWzBdLCBidWZbMV0pOworCQlyZXR1cm47CisJfQorCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikmb3V0WzBdLCBET1QxMUZfSUVfRVhUQ0FQX01BWF9MRU4sIDApOworCWNkZl9tZW1fY29weSgmb3V0WzBdLCAmYnVmWzJdLCBET1QxMUZfSUVfRVhUQ0FQX01BWF9MRU4pOworCisJaWYgKERPVDExRl9QQVJTRV9TVUNDRVNTICE9IGRvdDExZl91bnBhY2tfaWVfZXh0X2NhcChtYWNfY3R4LCAmb3V0WzBdLAorCQkJCQlET1QxMUZfSUVfRVhUQ0FQX01BWF9MRU4sIGRzdCkpCisJCWxpbV9sb2cobWFjX2N0eCwgTE9HRSwgRkwoImRvdDExZl91bnBhY2sgUGFyc2UgRXJyb3IgIikpOworfQorCisvKioKKyAqIGxpbV9zdHJpcF9leHRjYXBfdXBkYXRlX3N0cnVjdCAtIHN0cmlwIGV4dGVuZGVkIGNhcGFiaWxpdHkgSUUgYW5kIHBvcHVsYXRlCisgKgkJCQkgIHRoZSBkb3QxMWYgc3RydWN0dXJlCisgKiBAbWFjX2N0eDogZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAYWRkbl9pZTogQWRkaXRpb25hbCBJRSBidWZmZXIKKyAqIEBhZGRuX2llbGVuOiBMZW5ndGggb2YgYWRkaXRpb25hbCBJRQorICogQGRzdDogZXh0ZW5kZWQgY2FwYWJpbGl0eSBJRSBzdHJ1Y3R1cmUgdG8gYmUgdXBkYXRlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdHJpcCBleHRlbmRlZCBjYXBhYmlsaXR5IElFIGZyb20gSUUgYnVmZmVyIGFuZAorICogdXBkYXRlIHRoZSBwYXNzZWQgc3RydWN0dXJlLgorICoKKyAqIFJldHVybjogdFNpclJldFN0YXR1cworICovCit0U2lyUmV0U3RhdHVzIGxpbV9zdHJpcF9leHRjYXBfdXBkYXRlX3N0cnVjdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50OF90ICphZGRuX2llLCB1aW50MTZfdCAqYWRkbl9pZWxlbiwgdERvdDExZklFRXh0Q2FwICpkc3QpCit7CisJdWludDhfdCBleHRyYWN0ZWRfYnVmZltET1QxMUZfSUVfRVhUQ0FQX01BWF9MRU4gKyAyXTsKKwl0U2lyUmV0U3RhdHVzIHN0YXR1czsKKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopJmV4dHJhY3RlZF9idWZmWzBdLCBET1QxMUZfSUVfRVhUQ0FQX01BWF9MRU4gKyAyLAorCQkgICAgIDApOworCXN0YXR1cyA9IGxpbV9zdHJpcF9leHRjYXBfaWUobWFjX2N0eCwgYWRkbl9pZSwgYWRkbl9pZWxlbiwKKwkJCQkgICAgIGV4dHJhY3RlZF9idWZmKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHN0YXR1cykgeworCQlsaW1fbG9nKG1hY19jdHgsIExPRzEsCisJCSAgICAgICBGTCgiRmFpbGVkIHRvIHN0cmlwIGV4dGNhcCBJRSBzdGF0dXMgPSAoJWQpLiIpLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIHVwZGF0ZSB0aGUgZXh0cmFjdGVkIEV4dENhcCB0byBzdHJ1Y3QqLworCWxpbV91cGRhdGVfZXh0Y2FwX3N0cnVjdChtYWNfY3R4LCBleHRyYWN0ZWRfYnVmZiwgZHN0KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGxpbV9tZXJnZV9leHRjYXBfc3RydWN0KCkgLSBtZXJnZSBleHRlbmRlZCBjYXBhYmlsaXRpZXMgaW5mbworICogQGRzdDogZGVzdGluYXRpb24gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzCisgKiBAc3JjOiBzb3VyY2UgZXh0ZW5kZWQgY2FwYWJpbGl0aWVzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRha2UgQHNyYyBpbmZvIGFuZCBtZXJnZSBpdCB3aXRoIEBkc3QKKyAqIGV4dGVuZGVkIGNhcGFiaWxpdGllcyBpbmZvLgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGxpbV9tZXJnZV9leHRjYXBfc3RydWN0KHREb3QxMWZJRUV4dENhcCAqZHN0LAorCQkJICAgICB0RG90MTFmSUVFeHRDYXAgKnNyYykKK3sKKwl1aW50OF90ICp0ZW1wZHN0ID0gKHVpbnQ4X3QgKilkc3QtPmJ5dGVzOworCXVpbnQ4X3QgKnRlbXBzcmMgPSAodWludDhfdCAqKXNyYy0+Ynl0ZXM7CisJdWludDhfdCBzdHJ1Y3RsZW4gPSBtZW1iZXJfc2l6ZSh0RG90MTFmSUVFeHRDYXAsIGJ5dGVzKTsKKworCXdoaWxlICh0ZW1wZHN0ICYmIHRlbXBzcmMgJiYgc3RydWN0bGVuLS0pIHsKKwkJKnRlbXBkc3QgfD0gKnRlbXBzcmM7CisJCXRlbXBkc3QrKzsKKwkJdGVtcHNyYysrOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL2xpbS9saW1fdXRpbHMuaCBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiMDAwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9saW0vbGltX3V0aWxzLmgKQEAgLTAsMCArMSw1OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgbGltX3V0aWxzLmggY29udGFpbnMgdGhlIHV0aWxpdHkgZGVmaW5pdGlvbnMKKyAqIExJTSB1c2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9fTElNX1VUSUxTX0gKKyNkZWZpbmUgX19MSU1fVVRJTFNfSAorCisjaW5jbHVkZSAic2lyX2FwaS5oIgorI2luY2x1ZGUgInNpcl9kZWJ1Zy5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKworI2luY2x1ZGUgImxpbV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV9zY2FuX3Jlc3VsdF91dGlscy5oIgorI2luY2x1ZGUgImxpbV90aW1lcl91dGlscy5oIgorI2luY2x1ZGUgImxpbV90cmFjZS5oIgordHlwZWRlZiBlbnVtIHsKKwlPTkVfQllURSA9IDEsCisJVFdPX0JZVEUgPSAyCit9IGVTaXplT2ZMZW5GaWVsZDsKKworI2RlZmluZSBNSU5fVFhfUFdSX0NBUCAgICA4CisjZGVmaW5lIE1BWF9UWF9QV1JfQ0FQICAgIDIyCisKKyNkZWZpbmUgTElNX1NUQV9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEZGCisjZGVmaW5lIExJTV9BSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBMSU1fU1BFQ1RSVU1fTUFOQUdFTUVOVF9CSVRfTUFTSyAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgTElNX1JSTV9CSVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIExJTV9TSE9SVF9QUkVBTUJMRV9CSVRfTUFTSyAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBMSU1fSU1NRURJQVRFX0JMT0NLX0FDS19NQVNLICAgICAgICAgICAgICAweDgwMDAKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKyNkZWZpbmUgTElNX01BWF9SRUFTU09DX1JFVFJZX0xJTUlUICAgICAgICAgICAgMgorI2VuZGlmCisKKy8qIGNsYXNzaWZpZXIgSUQgaXMgY29kZWQgYXMgMC0zOiB0c2lkLCA0LTU6ZGlyZWN0aW9uICovCisjZGVmaW5lIExJTV9NQUtFX0NMU0lEKHRzaWQsIGRpcikgKCgodHNpZCkgJiAweDBGKSB8ICgoKGRpcikgJiAweDAzKSA8PCA0KSkKKworI2RlZmluZSBWSFRfTUNTXzN4M19NQVNLICAgIDB4MzAKKyNkZWZpbmUgVkhUX01DU18yeDJfTUFTSyAgICAweDBDCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCit0eXBlZGVmIHVuaW9uIHVQbWZTYVF1ZXJ5VGltZXJJZCB7CisJc3RydWN0IHsKKwkJdWludDhfdCBzZXNzaW9uSWQ7CisJCXVpbnQxNl90IHBlZXJJZHg7CisJfSBmaWVsZHM7CisJdWludDMyX3QgdmFsdWU7Cit9IHRQbWZTYVF1ZXJ5VGltZXJJZCwgKnRwUG1mU2FRdWVyeVRpbWVySWQ7CisjZW5kaWYKKworLyogTElNIHV0aWxpdHkgZnVuY3Rpb25zICovCit2b2lkIGxpbUdldEJzc2lkRnJvbVBrdCh0cEFuaVNpckdsb2JhbCwgdWludDhfdCAqLCB1aW50OF90ICosIHVpbnQzMl90ICopOworY2hhciAqbGltX2RvdDExX3JlYXNvbl9zdHIodWludDE2X3QgcmVhc29uQ29kZSk7CitjaGFyICpsaW1fbWxtX3N0YXRlX3N0cih0TGltTWxtU3RhdGVzIHN0YXRlKTsKK2NoYXIgKmxpbV9zbWVfc3RhdGVfc3RyKHRMaW1TbWVTdGF0ZXMgc3RhdGUpOworY2hhciAqbGltX21zZ19zdHIodWludDMyX3QgbXNnVHlwZSk7CitjaGFyICpsaW1fcmVzdWx0X2NvZGVfc3RyKHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlKTsKK2NoYXIgKmxpbV9kb3QxMV9tb2RlX3N0cih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGRvdDExTW9kZSk7Cit2b2lkIGxpbV9wcmludF9tbG1fc3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgbG9nTGV2ZWwsCisJCXRMaW1NbG1TdGF0ZXMgc3RhdGUpOwordm9pZCBsaW1fcHJpbnRfc21lX3N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGxvZ0xldmVsLAorCQl0TGltU21lU3RhdGVzIHN0YXRlKTsKK3ZvaWQgbGltX3ByaW50X21zZ19uYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IGxvZ0xldmVsLCB1aW50MzJfdCBtc2dUeXBlKTsKKworI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0VTRSB8fCBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbV9zZW5kX3NldF9tYXhfdHhfcG93ZXJfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRQb3dlcmRCbSB0eFBvd2VyLAorCQl0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5KTsKK2V4dGVybiB1aW50OF90IGxpbV9nZXRfbWF4X3R4X3Bvd2VyKHRQb3dlcmRCbSByZWdNYXgsIHRQb3dlcmRCbSBhcFR4UG93ZXIsCisJCXVpbnQ4X3QgaW5pVHhQb3dlcik7CisjZW5kaWYKK3VpbnQ4X3QgbGltX2lzX2FkZHJfYmModFNpck1hY0FkZHIpOwordWludDhfdCBsaW1faXNfZ3JvdXBfYWRkcih0U2lyTWFjQWRkcik7CisKKy8qIGNoZWNrIGZvciB0eXBlIG9mIHNjYW4gYWxsb3dlZCAqLwordWludDhfdCBsaW1fYWN0aXZlX3NjYW5fYWxsb3dlZCh0cEFuaVNpckdsb2JhbCwgdWludDhfdCk7CisKKy8qIEFJRCBwb29sIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCit2b2lkIGxpbV9pbml0X3BlZXJfaWR4cG9vbCh0cEFuaVNpckdsb2JhbCwgdHBQRVNlc3Npb24pOwordWludDE2X3QgbGltX2Fzc2lnbl9wZWVyX2lkeCh0cEFuaVNpckdsb2JhbCwgdHBQRVNlc3Npb24pOworCit2b2lkIGxpbV9lbmFibGVfb3ZlcmxhcDExZ19wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsCisJCXRwU2lyTWFjTWdtdEhkciBwTWgsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fdXBkYXRlX292ZXJsYXBfc3RhX3BhcmFtKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIGJzc0lkLAorCQl0cExpbVByb3RTdGFQYXJhbXMgcFN0YVBhcmFtcyk7Cit2b2lkIGxpbV91cGRhdGVfc2hvcnRfcHJlYW1ibGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisJCXRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fdXBkYXRlX3Nob3J0X3Nsb3RfdGltZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwKKwkJdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywKKwkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8qCisgKiBUaGUgYmVsb3cgJ3Byb2R1Y3QnIGNoZWNrIHRvYmUgcmVtb3ZlZCBpZiAnQXNzb2NpYXRpb24nIGlzCisgKiBhbGxvd2VkIGluIElCU1MuCisgKi8KK3ZvaWQgbGltX3JlbGVhc2VfcGVlcl9pZHgodHBBbmlTaXJHbG9iYWwsIHVpbnQxNl90LCB0cFBFU2Vzc2lvbik7CisKK3ZvaWQgbGltX2RlY2lkZV9hcF9wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLAorCQl0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbV9kZWNpZGVfYXBfcHJvdGVjdGlvbl9vbl9kZWxldGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdHBEcGhIYXNoTm9kZSBwU3RhRHMsCisJCXRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1fdXBkYXRlXzExYV9wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3QgZW5hYmxlLAorCQl1aW50OF90IG92ZXJsYXAsCisJCXRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsCisJCXRwUEVTZXNzaW9uKTsKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbV9lbmFibGUxMWdfcHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl1aW50OF90IGVuYWJsZSwKKwkJdWludDhfdCBvdmVybGFwLAorCQl0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbV9lbmFibGVfaHRfcHJvdGVjdGlvbl9mcm9tMTFnKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3QgZW5hYmxlLAorCQl1aW50OF90IG92ZXJsYXAsCisJCXRwVXBkYXRlQmVhY29uUGFyYW1zCisJCXBCZWFjb25QYXJhbXMsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbGltX2VuYWJsZV9odDIwX3Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBlbmFibGUsIHVpbnQ4X3Qgb3ZlcmxhcCwKKwkJdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywKKwkJdHBQRVNlc3Npb24gc2Vzc2lvbkVudHJ5KTsKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbV9lbmFibGVfaHRfbm9uX2dmX3Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBlbmFibGUsIHVpbnQ4X3Qgb3ZlcmxhcCwKKwkJdHBVcGRhdGVCZWFjb25QYXJhbXMKKwkJcEJlYWNvblBhcmFtcywgdHBQRVNlc3Npb24pOworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbGltX2VuYWJsZV9odF9yaWZzX3Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBlbmFibGUsIHVpbnQ4X3Qgb3ZlcmxhcCwKKwkJdHBVcGRhdGVCZWFjb25QYXJhbXMKKwkJcEJlYWNvblBhcmFtcywKKwkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1fZW5hYmxlX2h0X2xzaWdfdHhvcF9wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3QgZW5hYmxlLAorCQl1aW50OF90IG92ZXJsYXAsCisJCXRwVXBkYXRlQmVhY29uUGFyYW1zCisJCXBCZWFjb25QYXJhbXMsIHRwUEVTZXNzaW9uKTsKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbV9lbmFibGVfc2hvcnRfcHJlYW1ibGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBlbmFibGUsCisJCXRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbGltX2VuYWJsZV9odF9vYnNzX3Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBlbmFibGUsIHVpbnQ4X3Qgb3ZlcmxhcCwKKwkJdHBVcGRhdGVCZWFjb25QYXJhbXMKKwkJcEJlYWNvblBhcmFtcywgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fZGVjaWRlX3N0YV9wcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRwU2NoQmVhY29uU3RydWN0IHBCZWFjb25TdHJ1Y3QsCisJCXRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fZGVjaWRlX3N0YV9wcm90ZWN0aW9uX29uX2Fzc29jKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRwU2NoQmVhY29uU3RydWN0IHBCZWFjb25TdHJ1Y3QsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fdXBkYXRlX3N0YV9ydW5fdGltZV9odF9zd2l0Y2hfY2hubF9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdERvdDExZklFSFRJbmZvICpwSFRJbmZvLAorCQl1aW50OF90IGJzc0lkeCwKKwkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisvKiBQcmludCBNQUMgYWRkcmVzcyB1dGlsaXR5IGZ1bmN0aW9uICovCit2b2lkIGxpbV9wcmludF9tYWNfYWRkcih0cEFuaVNpckdsb2JhbCwgdFNpck1hY0FkZHIsIHVpbnQ4X3QpOworCisvKiBEZWZlcnJlZCBNZXNzYWdlIFF1ZXVlIHJlYWQvd3JpdGUgKi8KK3VpbnQ4X3QgbGltX3dyaXRlX2RlZmVycmVkX21zZ19xKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpOwordFNpck1zZ1EgKmxpbV9yZWFkX2RlZmVycmVkX21zZ19xKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBsaW1faGFuZGxlX2RlZmVyX21zZ19lcnJvcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcExpbU1zZyk7CisKKy8qIERlZmVycmVkIE1lc3NhZ2UgUXVldWUgUmVzZXQgKi8KK3ZvaWQgbGltX3Jlc2V0X2RlZmVycmVkX21zZ19xKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCit0U2lyUmV0U3RhdHVzIGxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaSh0cEFuaVNpckdsb2JhbCwgdFNpck1zZ1EgKiwgdWludDhfdCk7CisKK3ZvaWQgbGltX2hhbmRsZV91cGRhdGVfb2xiY19jYWNoZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKwordWludDhfdCBsaW1faXNfbnVsbF9zc2lkKHRTaXJNYWNTU2lkICpwU3NpZCk7CisKKy8qIDExaCBTdXBwb3J0ICovCit2b2lkIGxpbV9zdG9wX3R4X2FuZF9zd2l0Y2hfY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCk7Cit2b2lkIGxpbV9wcm9jZXNzX2NoYW5uZWxfc3dpdGNoX3RpbWVvdXQodHBBbmlTaXJHbG9iYWwpOwordFNpclJldFN0YXR1cyBsaW1fc3RhcnRfY2hhbm5lbF9zd2l0Y2godHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbV91cGRhdGVfY2hhbm5lbF9zd2l0Y2godHBBbmlTaXJHbG9iYWwsIHRwU2lyUHJvYmVSZXNwQmVhY29uLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltX3Byb2Nlc3NfcXVpZXRfdGltZW91dCh0cEFuaVNpckdsb2JhbCk7Cit2b2lkIGxpbV9wcm9jZXNzX3F1aWV0X2Jzc190aW1lb3V0KHRwQW5pU2lyR2xvYmFsKTsKKwordm9pZCBsaW1fc3RhcnRfcXVpZXRfdGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpOwordm9pZCBsaW1fc3dpdGNoX3ByaW1hcnlfY2hhbm5lbCh0cEFuaVNpckdsb2JhbCwgdWludDhfdCwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1fc3dpdGNoX3ByaW1hcnlfc2Vjb25kYXJ5X2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkJdWludDhfdCBuZXdDaGFubmVsLAorCQkJCQl1aW50OF90IGNoX2NlbnRlcl9mcmVxX3NlZzAsCisJCQkJCXVpbnQ4X3QgY2hfY2VudGVyX2ZyZXFfc2VnMSwKKwkJCQkJcGh5X2NoX3dpZHRoIGNoX3dpZHRoKTsKK3ZvaWQgbGltVXBkYXRlU3RhUnVuVGltZUhUU3d0aWNoQ2hubFBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0RG90MTFmSUVIVEluZm8gKnBSY3ZkSFRJbmZvLAorCQl1aW50OF90IGJzc0lkeCk7Cit2b2lkIGxpbV91cGRhdGVfc3RhX3J1bl90aW1lX2h0X2NhcGFiaWxpdHkodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdERvdDExZklFSFRDYXBzICpwSFRDYXBzKTsKK3ZvaWQgbGltX3VwZGF0ZV9zdGFfcnVuX3RpbWVfaHRfaW5mbyhzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywKKwkJdERvdDExZklFSFRJbmZvICpwUmN2ZEhUSW5mbywKKwkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbV9jYW5jZWxfZG90MTFoX2NoYW5uZWxfc3dpdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1fY2FuY2VsX2RvdDExaF9xdWlldCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3RBbmlCb29sIGxpbV9pc19jaGFubmVsX3ZhbGlkX2Zvcl9jaGFubmVsX3N3aXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl1aW50OF90IGNoYW5uZWwpOwordm9pZCBsaW1fZnJhbWVfdHJhbnNtaXNzaW9uX2NvbnRyb2wodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpbVF1aWV0VHhNb2RlIHR5cGUsCisJCXRMaW1Db250cm9sVHggbW9kZSk7Cit0U2lyUmV0U3RhdHVzIGxpbV9yZXN0b3JlX3ByZV9jaGFubmVsX3N3aXRjaF9zdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3RTaXJSZXRTdGF0dXMgbGltX3Jlc3RvcmVfcHJlX3F1aWV0X3N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2b2lkIGxpbV9wcmVwYXJlX2ZvcjExaF9jaGFubmVsX3N3aXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltX3N3aXRjaF9jaGFubmVsX2NiYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIENERl9TVEFUVVMgc3RhdHVzLAorCQl1aW50MzJfdCAqZGF0YSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3N0YXRpYyBpbmxpbmUgdFNpclJGQmFuZCBsaW1fZ2V0X3JmX2JhbmQodWludDhfdCBjaGFubmVsKQoreworCWlmICgoY2hhbm5lbCA+PSBTSVJfMTFBX0NIQU5ORUxfQkVHSU4pICYmCisJCQkoY2hhbm5lbCA8PSBTSVJfMTFBX0NIQU5ORUxfRU5EKSkKKwkJcmV0dXJuIFNJUl9CQU5EXzVfR0haOworCisJaWYgKChjaGFubmVsID49IFNJUl8xMUJfQ0hBTk5FTF9CRUdJTikgJiYKKwkJCShjaGFubmVsIDw9IFNJUl8xMUJfQ0hBTk5FTF9FTkQpKQorCQlyZXR1cm4gU0lSX0JBTkRfMl80X0dIWjsKKworCXJldHVybiBTSVJfQkFORF9VTktOT1dOOworfQorCitzdGF0aWMgaW5saW5lIHRTaXJSZXRTdGF0dXMKK2xpbV9nZXRfbWdtdF9zdGFpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCAqc3RhaWQsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKQorCQkqc3RhaWQgPSAxOworCWVsc2UgaWYgKExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkKKwkJKnN0YWlkID0gMDsKKwllbHNlCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbGltX2lzX3N5c3RlbV9pbl9zZXRfbWltb3BzX3N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJaWYgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfU0VUX01JTU9QU19TVEFURSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QKK2lzX2VudGVyaW5nX21pbW9fcHModFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIGN1clN0YXRlLAorCQl0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUgbmV3U3RhdGUpCit7CisJaWYgKGN1clN0YXRlID09IGVTSVJfSFRfTUlNT19QU19OT19MSU1JVCAmJgorCQkJKG5ld1N0YXRlID09IGVTSVJfSFRfTUlNT19QU19EWU5BTUlDCisJCQkgfHwgbmV3U3RhdGUgPT0gZVNJUl9IVF9NSU1PX1BTX1NUQVRJQykpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGltX3NlbGVjdF9jYl9tb2RlKHREcGhIYXNoTm9kZSAqcFN0YURzLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LCB1aW50OF90IGNoYW5uZWwsCisJCXVpbnQ4X3QgY2hhbl9idykKK3sKKwlpZiAocFN0YURzLT5tbG1TdGFDb250ZXh0LnZodENhcGFiaWxpdHkgJiYgY2hhbl9idykgeworCQlpZiAoY2hhbm5lbCA9PSAzNiB8fCBjaGFubmVsID09IDUyIHx8IGNoYW5uZWwgPT0gMTAwIHx8CisJCQkJY2hhbm5lbCA9PSAxMTYgfHwgY2hhbm5lbCA9PSAxNDkpIHsKKwkJCXJldHVybiBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0xPVyAtIDE7CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSA0MCB8fCBjaGFubmVsID09IDU2IHx8IGNoYW5uZWwgPT0gMTA0IHx8CisJCQkJY2hhbm5lbCA9PSAxMjAgfHwgY2hhbm5lbCA9PSAxNTMpIHsKKwkJCXJldHVybiBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9MT1cgLSAxOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gNDQgfHwgY2hhbm5lbCA9PSA2MCB8fCBjaGFubmVsID09IDEwOCB8fAorCQkJCWNoYW5uZWwgPT0gMTI0IHx8IGNoYW5uZWwgPT0gMTU3KSB7CisJCQlyZXR1cm4gUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9ISUdIIC0gMTsKKwkJfSBlbHNlIGlmIChjaGFubmVsID09IDQ4IHx8IGNoYW5uZWwgPT0gNjQgfHwgY2hhbm5lbCA9PSAxMTIgfHwKKwkJCQljaGFubmVsID09IDEyOCB8fCBjaGFubmVsID09IDE2MSkgeworCQkJcmV0dXJuIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0hJR0ggLSAxOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMTY1KSB7CisJCQlyZXR1cm4gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCQl9CisJfSBlbHNlIGlmIChwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5KSB7CisJCWlmIChjaGFubmVsID09IDQwIHx8IGNoYW5uZWwgPT0gNDggfHwgY2hhbm5lbCA9PSA1NiB8fAorCQkJY2hhbm5lbCA9PSA2NCB8fCBjaGFubmVsID09IDEwNCB8fCBjaGFubmVsID09IDExMiB8fAorCQkJY2hhbm5lbCA9PSAxMjAgfHwgY2hhbm5lbCA9PSAxMjggfHwgY2hhbm5lbCA9PSAxMzYgfHwKKwkJCWNoYW5uZWwgPT0gMTQ0IHx8IGNoYW5uZWwgPT0gMTUzIHx8IGNoYW5uZWwgPT0gMTYxKSB7CisJCQlyZXR1cm4gUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMzYgfHwgY2hhbm5lbCA9PSA0NCB8fCBjaGFubmVsID09IDUyIHx8CisJCQkJY2hhbm5lbCA9PSA2MCB8fCBjaGFubmVsID09IDEwMCB8fAorCQkJCWNoYW5uZWwgPT0gMTA4IHx8IGNoYW5uZWwgPT0gMTE2IHx8CisJCQkJY2hhbm5lbCA9PSAxMjQgfHwgY2hhbm5lbCA9PSAxMzIgfHwKKwkJCQljaGFubmVsID09IDE0MCB8fCBjaGFubmVsID09IDE0OSB8fAorCQkJCWNoYW5uZWwgPT0gMTU3KSB7CisJCQlyZXR1cm4gUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWTsKKwkJfSBlbHNlIGlmIChjaGFubmVsID09IDE2NSkgeworCQkJcmV0dXJuIFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKwkJfQorCX0KKwlyZXR1cm4gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworfQorCisvKiBBTkkgcGVlciBzdGF0aW9uIGNvdW50IG1hbmFnZW1lbnQgYW5kIGFzc29jaWF0ZWQgYWN0aW9ucyAqLwordm9pZCBsaW1fdXRpbF9jb3VudF9zdGFfYWRkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YSwKKwkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbV91dGlsX2NvdW50X3N0YV9kZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordWludDhfdCBsaW1fZ2V0X2h0X2NhcGFiaWxpdHkodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90LCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbV90eF9jb21wbGV0ZSh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnBEYXRhLCBib29sIGZyZWUpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZWdpc3RlcmVkIHdpdGggSEFMIGZvciBjYWxsYmFjayB3aGVuIFRTUEVDIGluYWN0aXZpdHkKKyAqIHRpbWVyIGZpcmVzLgorICovCisKK3ZvaWQgbGltX3Byb2Nlc3NfZGVsX3RzX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKTsKK3RTaXJSZXRTdGF0dXMgbGltX3Byb2Nlc3NfaGFsX2luZF9tZXNzYWdlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBtZXNnSWQsCisJCXZvaWQgKm1lc2dQYXJhbSk7Cit0U2lyUmV0U3RhdHVzIGxpbV92YWxpZGF0ZV9kZWx0c19yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdHBTaXJEZWx0c1JlcSBwRGVsdHNSZXEsCisJCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLyogY2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0cmF0aW9uIHRvIEhBTCBmb3IgYW55IGluZGljYXRpb24uICovCit2b2lkIGxpbV9yZWdpc3Rlcl9oYWxfaW5kX2NhbGxfYmFjayh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltX3BrdF9mcmVlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCWVGcmFtZVR5cGUgZnJtVHlwZSwgdWludDhfdCAqcEJELCB2b2lkICpib2R5KTsKKwordm9pZCBsaW1fZ2V0X2JfZGZyb21fcnhfcGFja2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKmJvZHksIHVpbnQzMl90ICoqcEJEKTsKKworLyoqCisgKiB1dGlsc19wb3dlcl94eSgpIC0gY2FsYyByZXN1bHQgb2YgYmFzZSByYWlzZWQgdG8gcG93ZXIKKyAqIEBiYXNlOiBCYXNlIHZhbHVlCisgKiBAcG93ZXI6IEJhc2UgcmFpc2VkIHRvIHRoaXMgUG93ZXIgdmFsdWUKKyAqCisgKiBHaXZlbiBhIGJhc2UoWCkgYW5kIHBvd2VyKFkpLCB0aGlzIEFQSSB3aWxsIHJldHVybgorICogdGhlIHJlc3VsdCBvZiBiYXNlIHJhaXNlZCB0byBwb3dlciAtIChYIF4gWSkKKyAqCisgKiBSZXR1cm46IFJlc3VsdCBvZiBYXlkKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgdXRpbHNfcG93ZXJfeHkodWludDE2X3QgYmFzZSwgdWludDE2X3QgcG93ZXIpCit7CisJdWludDMyX3QgcmVzdWx0ID0gMSwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3dlcjsgaSsrKQorCQlyZXN1bHQgKj0gYmFzZTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3RTaXJSZXRTdGF0dXMgbGltX3Bvc3Rfc21fc3RhdGVfdXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQxNl90IFN0YUlkeCwKKwkJdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIE1JTU9QU1N0YXRlLAorCQl1aW50OF90ICpwUGVlclN0YU1hYywgdWludDhfdCBzZXNzaW9uSWQpOworCit2b2lkIGxpbV9kZWxldGVfc3RhX2NvbnRleHQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZyk7Cit2b2lkIGxpbV9kZWxldGVfZGlhbG9ndWVfdG9rZW5fbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltX3Jlc3NldF9zY2FuX2NoYW5uZWxfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3VpbnQ4X3QgbGltX2dldF9jaGFubmVsX2Zyb21fYmVhY29uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRwU2NoQmVhY29uU3RydWN0IHBCZWFjb24pOwordFNpck53VHlwZSBsaW1fZ2V0X253X3R5cGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBjaGFubmVsTnVtLAorCQl1aW50MzJfdCB0eXBlLCB0cFNjaEJlYWNvblN0cnVjdCBwQmVhY29uKTsKKwordm9pZCBsaW1fc2V0X3RzcGVjX3VhcHNkX21hc2tfcGVyX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJdFNpck1hY1RTSW5mbyAqcFRzSW5mbywgdWludDMyX3QgYWN0aW9uKTsKKwordm9pZCBsaW1faGFuZGxlX2hlYXJ0X2JlYXRfdGltZW91dF9mb3Jfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordm9pZCBsaW1fcHJvY2Vzc19hZGRfc3RhX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZ1EpOworCit2b2lkIGxpbV91cGRhdGVfYmVhY29uKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCit2b2lkIGxpbV9wcm9jZXNzX2FwX21sbV9hZGRfc3RhX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSwKKwkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbV9wcm9jZXNzX2J0X2FtcF9hcF9tbG1fZGVsX2Jzc19yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdHBTaXJNc2dRIGxpbU1zZ1EsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2b2lkIGxpbV9wcm9jZXNzX2J0X2FtcF9hcF9tbG1fZGVsX3N0YV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdHBTaXJNc2dRIGxpbU1zZ1EsCisJCXRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit0cFBFU2Vzc2lvbiBsaW1faXNfaWJzc19zZXNzaW9uX2FjdGl2ZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3RwUEVTZXNzaW9uIGxpbV9pc19hcF9zZXNzaW9uX2FjdGl2ZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltX2hhbmRsZV9oZWFydF9iZWF0X2ZhaWx1cmVfdGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKwordWludDhfdCAqbGltX2dldF9pZV9wdHJfbmV3KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBJZXMsIGludCBsZW5ndGgsCisJCXVpbnQ4X3QgZWlkLCBlU2l6ZU9mTGVuRmllbGQgc2l6ZV9vZl9sZW5fZmllbGQpOworCisjZGVmaW5lIGxpbUdldFdzY0lFUHRyKHBNYWMsIGllLCBpZV9sZW4pIFwKKwljZmdfZ2V0X3ZlbmRvcl9pZV9wdHJfZnJvbV9vdWkocE1hYywgU0lSX01BQ19XU0NfT1VJLCBcCisJCQlTSVJfTUFDX1dTQ19PVUlfU0laRSwgaWUsIGllX2xlbikKKworI2RlZmluZSBsaW1HZXRQMnBJRVB0cihwTWFjLCBpZSwgaWVfbGVuKSBcCisJY2ZnX2dldF92ZW5kb3JfaWVfcHRyX2Zyb21fb3VpKHBNYWMsIFNJUl9NQUNfUDJQX09VSSwgXAorCQkJU0lSX01BQ19QMlBfT1VJX1NJWkUsIGllLCBpZV9sZW4pCisKK3VpbnQ4X3QgbGltX2dldF9ub2FfYXR0cl9zdHJlYW1faW5fbXVsdF9wMnBfaWVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3QgKm5vYVN0cmVhbSwgdWludDhfdCBub2FMZW4sCisJCXVpbnQ4X3Qgb3ZlckZsb3dMZW4pOwordWludDhfdCBsaW1fZ2V0X25vYV9hdHRyX3N0cmVhbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwTm9hU3RyZWFtLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordWludDhfdCBsaW1fYnVpbGRfcDJwX2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKmllLCB1aW50OF90ICpkYXRhLAorCQl1aW50OF90IGllX2xlbik7Citib29sIGxpbV9pc19ub2FfaW5zZXJ0X3JlcWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Citib29sIGxpbV9pc2Nvbm5lY3RlZF9vbl9kZnNfY2hhbm5lbCh1aW50OF90IGN1cnJlbnRDaGFubmVsKTsKK3VpbnQ4X3QgbGltX2dldF9jdXJyZW50X29wZXJhdGluZ19jaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKK2Jvb2wgbGltX2NoZWNrX3ZodF9vcF9tb2RlX2NoYW5nZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQl1aW50OF90IGNoYW5XaWR0aCwgdWludDhfdCBzdGFJZCwKKwkJdWludDhfdCAqcGVlck1hYyk7Citib29sIGxpbV9zZXRfbnNzX2NoYW5nZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQl1aW50OF90IHJ4TnNzLCB1aW50OF90IHN0YUlkLCB1aW50OF90ICpwZWVyTWFjKTsKK2Jvb2wgbGltX2NoZWNrX21lbWJlcnNoaXBfdXNlcl9wb3NpdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQl1aW50MzJfdCBtZW1iZXJzaGlwLCB1aW50MzJfdCB1c2VyUG9zaXRpb24sCisJCXVpbnQ4X3Qgc3RhSWQpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisKK3R5cGVkZWYgZW51bSB7CisJV0xBTl9QRV9ESUFHX1NDQU5fUkVRX0VWRU5UID0gMCwKKwlXTEFOX1BFX0RJQUdfU0NBTl9BQk9SVF9JTkRfRVZFTlQsCisJV0xBTl9QRV9ESUFHX1NDQU5fUlNQX0VWRU5ULAorCVdMQU5fUEVfRElBR19KT0lOX1JFUV9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfSk9JTl9SU1BfRVZFTlQsCisJV0xBTl9QRV9ESUFHX1NFVENPTlRFWFRfUkVRX0VWRU5ULAorCVdMQU5fUEVfRElBR19TRVRDT05URVhUX1JTUF9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfUkVBU1NPQ19SRVFfRVZFTlQsCisJV0xBTl9QRV9ESUFHX1JFQVNTT0NfUlNQX0VWRU5ULAorCVdMQU5fUEVfRElBR19BVVRIX1JFUV9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfQVVUSF9SU1BfRVZFTlQgPSAxMCwKKwlXTEFOX1BFX0RJQUdfRElTQVNTT0NfUkVRX0VWRU5ULAorCVdMQU5fUEVfRElBR19ESVNBU1NPQ19SU1BfRVZFTlQsCisJV0xBTl9QRV9ESUFHX0RJU0FTU09DX0lORF9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfRElTQVNTT0NfQ05GX0VWRU5ULAorCVdMQU5fUEVfRElBR19ERUFVVEhfUkVRX0VWRU5ULAorCVdMQU5fUEVfRElBR19ERUFVVEhfUlNQX0VWRU5ULAorCVdMQU5fUEVfRElBR19ERUFVVEhfSU5EX0VWRU5ULAorCVdMQU5fUEVfRElBR19TVEFSVF9CU1NfUkVRX0VWRU5ULAorCVdMQU5fUEVfRElBR19TVEFSVF9CU1NfUlNQX0VWRU5ULAorCVdMQU5fUEVfRElBR19BVVRIX0lORF9FVkVOVCA9IDIwLAorCVdMQU5fUEVfRElBR19BU1NPQ19JTkRfRVZFTlQsCisJV0xBTl9QRV9ESUFHX0FTU09DX0NORl9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfUkVBU1NPQ19JTkRfRVZFTlQsCisJV0xBTl9QRV9ESUFHX1NXSVRDSF9DSExfSU5EX0VWRU5ULAorCVdMQU5fUEVfRElBR19TVE9QX0JTU19SRVFfRVZFTlQsCisJV0xBTl9QRV9ESUFHX1NUT1BfQlNTX1JTUF9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfREVBVVRIX0NORl9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfQUREVFNfUkVRX0VWRU5ULAorCVdMQU5fUEVfRElBR19BRERUU19SU1BfRVZFTlQsCisJV0xBTl9QRV9ESUFHX0RFTFRTX1JFUV9FVkVOVCA9IDMwLAorCVdMQU5fUEVfRElBR19ERUxUU19SU1BfRVZFTlQsCisJV0xBTl9QRV9ESUFHX0RFTFRTX0lORF9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfRU5URVJfQk1QU19SRVFfRVZFTlQsCisJV0xBTl9QRV9ESUFHX0VOVEVSX0JNUFNfUlNQX0VWRU5ULAorCVdMQU5fUEVfRElBR19FWElUX0JNUFNfUkVRX0VWRU5ULAorCVdMQU5fUEVfRElBR19FWElUX0JNUFNfUlNQX0VWRU5ULAorCVdMQU5fUEVfRElBR19FWElUX0JNUFNfSU5EX0VWRU5ULAorCVdMQU5fUEVfRElBR19FTlRFUl9VQVBTRF9SRVFfRVZFTlQsCisJV0xBTl9QRV9ESUFHX0VOVEVSX1VBUFNEX1JTUF9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfRVhJVF9VQVBTRF9SRVFfRVZFTlQgPSA0MCwKKwlXTEFOX1BFX0RJQUdfRVhJVF9VQVBTRF9SU1BfRVZFTlQsCisJV0xBTl9QRV9ESUFHX1dPV0xfQUREX0JDQVNUX1BUUk5fRVZFTlQsCisJV0xBTl9QRV9ESUFHX1dPV0xfREVMX0JDQVNUX1BUUk5fRVZFTlQsCisJV0xBTl9QRV9ESUFHX0VOVEVSX1dPV0xfUkVRX0VWRU5ULAorCVdMQU5fUEVfRElBR19FTlRFUl9XT1dMX1JTUF9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfRVhJVF9XT1dMX1JFUV9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfRVhJVF9XT1dMX1JTUF9FVkVOVCwKKwlXTEFOX1BFX0RJQUdfSEJfRkFJTFVSRV9USU1FT1VULAorCVdMQU5fUEVfRElBR19QUkVfQVVUSF9SRVFfRVZFTlQsCisJV0xBTl9QRV9ESUFHX1BSRV9BVVRIX1JTUF9FVkVOVCA9IDUwLAorCVdMQU5fUEVfRElBR19QUkVBVVRIX0RPTkUsCisJV0xBTl9QRV9ESUFHX1JFQVNTT0NJQVRJTkcsCisJV0xBTl9QRV9ESUFHX0NPTk5FQ1RFRCwKKwlXTEFOX1BFX0RJQUdfQVNTT0NfUkVRX0VWRU5ULAorCVdMQU5fUEVfRElBR19BVVRIX0NPTVBfRVZFTlQsCisJV0xBTl9QRV9ESUFHX0FTU09DX0NPTVBfRVZFTlQsCisJV0xBTl9QRV9ESUFHX0FVVEhfU1RBUlRfRVZFTlQsCisJV0xBTl9QRV9ESUFHX0FTU09DX1NUQVJUX0VWRU5ULAorCVdMQU5fUEVfRElBR19SRUFTU09DX1NUQVJUX0VWRU5ULAorCVdMQU5fUEVfRElBR19ST0FNX0FVVEhfU1RBUlRfRVZFTlQgPSA2MCwKKwlXTEFOX1BFX0RJQUdfUk9BTV9BVVRIX0NPTVBfRVZFTlQsCisJV0xBTl9QRV9ESUFHX1JPQU1fQVNTT0NfU1RBUlRfRVZFTlQsCisJV0xBTl9QRV9ESUFHX1JPQU1fQVNTT0NfQ09NUF9FVkVOVCwKKwlSRVNFUlZFRDEsIC8qID0gNjQgZm9yIFNDQU5fQ09NUExFVEUgKi8KKwlSRVNFUlZFRDIsIC8qID0gNjUgZm9yIFNDQU5fUkVTX0ZPVU5EICovCit9IFdMQU5fUEVfRElBR19FVkVOVF9UWVBFOworCit2b2lkIGxpbV9kaWFnX2V2ZW50X3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBldmVudFR5cGUsCisJCXRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnksIHVpbnQxNl90IHN0YXR1cywKKwkJdWludDE2X3QgcmVhc29uQ29kZSk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCit2b2lkIHBlX3NldF9yZXN1bWVfY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBjaGFubmVsLAorCQllUGh5Q2hhbkJvbmRTdGF0ZSBjYlN0YXRlKTsKKwordm9pZCBsaW1fZ2V0X3Nob3J0X3Nsb3RfZnJvbV9waHlfbW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQl1aW50MzJfdCBwaHlNb2RlLCB1aW50OF90ICpwU2hvcnRTbG90RW5hYmxlKTsKKwordm9pZCBsaW1fY2xlYW5fdXBfZGlzYXNzb2NfZGVhdXRoX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpzdGFNYWMsCisJCWJvb2wgY2xlYW5SeFBhdGgpOworCitib29sIGxpbV9jaGVja19kaXNhc3NvY19kZWF1dGhfYWNrX3BlbmRpbmcodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCAqc3RhTWFjKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKK3ZvaWQgbGltX3BtZl9zYV9xdWVyeV90aW1lcl9oYW5kbGVyKHZvaWQgKnBNYWNHbG9iYWwsIHVpbnQzMl90IHBhcmFtKTsKKyNlbmRpZgorCit2b2lkIGxpbV9zZXRfcHJvdGVjdGVkX2JpdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQl0U2lyTWFjQWRkciBwZWVyLCB0cFNpck1hY01nbXRIZHIgcE1hY0hkcik7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCit2b2lkIGxpbV9wbWZfY29tZWJhY2tfdGltZXJfY2FsbGJhY2sodm9pZCAqY29udGV4dCk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExVyAqLworCit2b2lkIGxpbV9zZXRfaHRfY2Fwcyh0cEFuaVNpckdsb2JhbCBwX21hYywKKwkJdHBQRVNlc3Npb24gcF9zZXNzaW9uX250cnksCisJCXVpbnQ4X3QgKnBfaWVfc3RhcnQsCisJCXVpbnQzMl90IG51bV9ieXRlcyk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQwordm9pZCBsaW1fc2V0X3ZodF9jYXBzKHRwQW5pU2lyR2xvYmFsIHBfbWFjLAorCQl0cFBFU2Vzc2lvbiBwX3Nlc3Npb25fZW50cnksCisJCXVpbnQ4X3QgKnBfaWVfc3RhcnQsCisJCXVpbnQzMl90IG51bV9ieXRlcyk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExQUMgKi8KK2Jvb2wgbGltX3ZhbGlkYXRlX3JlY2VpdmVkX2ZyYW1lX2ExX2FkZHIodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdFNpck1hY0FkZHIgYTEsIHRwUEVTZXNzaW9uIHNlc3Npb24pOwordm9pZCBsaW1fc2V0X3N0YWRzX3J0dF9jYXAodHBEcGhIYXNoTm9kZSBzdGFfZHMsIHN0cnVjdCBzX2V4dF9jYXAgKmV4dF9jYXAsCisJCQkgICB0cEFuaVNpckdsb2JhbCBtYWNfY3R4KTsKKwordm9pZCBsaW1fY2hlY2tfYW5kX3Jlc2V0X3Byb3RlY3Rpb25fcGFyYW1zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpOworCitDREZfU1RBVFVTIGxpbV9zZW5kX2V4dF9jYXBfaWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCwKKwkJCSAgICAgICB0RG90MTFmSUVFeHRDYXAgKmV4dHJhY3RlZF9leHRjYXAsIGJvb2wgbWVyZ2UpOworCit0U2lyUmV0U3RhdHVzIGxpbV9zdHJpcF9leHRjYXBfaWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCAqYWRkbl9pZSwKKwkJCSAgdWludDE2X3QgKmFkZG5faWVsZW4sIHVpbnQ4X3QgKmV4dHJhY3RlZF9leHRjYXApOwordm9pZCBsaW1fdXBkYXRlX2V4dGNhcF9zdHJ1Y3QodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCAqYnVmLAorCQkJICAgICAgdERvdDExZklFRXh0Q2FwICpleHRfY2FwKTsKK3RTaXJSZXRTdGF0dXMgbGltX3N0cmlwX2V4dGNhcF91cGRhdGVfc3RydWN0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQ4X3QgKmFkZG5faWUsIHVpbnQxNl90ICphZGRuX2llbGVuLCB0RG90MTFmSUVFeHRDYXAgKmRzdCk7Cit2b2lkIGxpbV9tZXJnZV9leHRjYXBfc3RydWN0KHREb3QxMWZJRUV4dENhcCAqZHN0LCB0RG90MTFmSUVFeHRDYXAgKnNyYyk7CisKKyNlbmRpZiAvKiBfX0xJTV9VVElMU19IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvcnJtL3JybV9hcGkuYyBiL2NvcmUvbWFjL3NyYy9wZS9ycm0vcnJtX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODViZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvcnJtL3JybV9hcGkuYwpAQCAtMCwwICsxLDE0OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIHJybV9hcGkuYworCisgICBcYnJpZWYgaW1wbGVtZW50YXRpb24gZm9yIFBFIFJSTSBBUElzCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBGaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAid25pX2FwaS5oIgorI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgImxpbV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImxpbV9zZW5kX3NtZV9yc3BfbWVzc2FnZXMuaCIKKyNpbmNsdWRlICJwYXJzZXJfYXBpLmgiCisjaW5jbHVkZSAibGltX3NlbmRfbWVzc2FnZXMuaCIKKyNpbmNsdWRlICJycm1fZ2xvYmFsLmgiCisjaW5jbHVkZSAicnJtX2FwaS5oIgorCit1aW50OF90Citycm1fZ2V0X21pbl9vZl9tYXhfdHhfcG93ZXIodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICB0UG93ZXJkQm0gcmVnTWF4LCB0UG93ZXJkQm0gYXBUeFBvd2VyKQoreworCXVpbnQ4X3QgbWF4VHhQb3dlciA9IDA7CisJdWludDhfdCB0eFBvd2VyID0gQ0RGX01JTihyZWdNYXgsIChhcFR4UG93ZXIpKTsKKwlpZiAoKHR4UG93ZXIgPj0gUlJNX01JTl9UWF9QV1JfQ0FQKSAmJiAodHhQb3dlciA8PSBSUk1fTUFYX1RYX1BXUl9DQVApKQorCQltYXhUeFBvd2VyID0gdHhQb3dlcjsKKwllbHNlIGlmICh0eFBvd2VyIDwgUlJNX01JTl9UWF9QV1JfQ0FQKQorCQltYXhUeFBvd2VyID0gUlJNX01JTl9UWF9QV1JfQ0FQOworCWVsc2UKKwkJbWF4VHhQb3dlciA9IFJSTV9NQVhfVFhfUFdSX0NBUDsKKworCWxpbV9sb2cocE1hYywgTE9HMywKKwkJIiVzOiByZWd1bGF0b3J5TWF4ID0gJWQsIGFwVHhQd3IgPSAlZCwgbWF4VHhwd3IgPSAlZCIsCisJCV9fZnVuY19fLCByZWdNYXgsIGFwVHhQb3dlciwgbWF4VHhQb3dlcik7CisJcmV0dXJuIG1heFR4UG93ZXI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHJybV9jYWNoZV9tZ210X3R4X3Bvd2VyCisgKioKKyAqIEZVTkNUSU9OOiAgU3RvcmUgVHggcG93ZXIgZm9yIG1hbmFnZW1lbnQgZnJhbWVzLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBTZXNzaW9uRW50cnkgc2Vzc2lvbiBlbnRyeS4KKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitycm1fY2FjaGVfbWdtdF90eF9wb3dlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0UG93ZXJkQm0gdHhQb3dlciwKKwkJCXRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkpCit7CisJbGltX2xvZyhwTWFjLCBMT0czLCAiQ2FjaGUgTWdtdCBUeCBQb3dlciA9ICVkIiwgdHhQb3dlcik7CisKKwlpZiAocFNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCWxpbV9sb2cocE1hYywgTE9HMywgIiVzOiBwU2Vzc2lvbkVudHJ5IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXBNYWMtPnJybS5ycm1QRUNvbnRleHQudHhNZ210UG93ZXIgPSB0eFBvd2VyOworCX0gZWxzZQorCQlwU2Vzc2lvbkVudHJ5LT50eE1nbXRQb3dlciA9IHR4UG93ZXI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHJybV9nZXRfbWdtdF90eF9wb3dlcgorICoKKyAqIEZVTkNUSU9OOiAgR2V0IHRoZSBUeCBwb3dlciBmb3IgbWFuYWdlbWVudCBmcmFtZXMuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcFNlc3Npb25FbnRyeSBzZXNzaW9uIGVudHJ5LgorICogQHJldHVybiB0eFBvd2VyCisgKi8KK3RQb3dlcmRCbSBycm1fZ2V0X21nbXRfdHhfcG93ZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSkKK3sKKwlsaW1fbG9nKHBNYWMsIExPRzMsICJScm1HZXRNZ210VHhQb3dlciBjYWxsZWQiKTsKKworCWlmIChwU2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0czLCAiJXM6IHR4cG93ZXIgZnJvbSBycm1QRUNvbnRleHQ6ICVkIiwKKwkJCV9fZnVuY19fLCBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnR4TWdtdFBvd2VyKTsKKwkJcmV0dXJuIHBNYWMtPnJybS5ycm1QRUNvbnRleHQudHhNZ210UG93ZXI7CisJfQorCisJcmV0dXJuIHBTZXNzaW9uRW50cnktPnR4TWdtdFBvd2VyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBycm1fc2VuZF9zZXRfbWF4X3R4X3Bvd2VyX3JlcQorICoKKyAqIEZVTkNUSU9OOiAgU2VuZCBXTUFfU0VUX01BWF9UWF9QT1dFUl9SRVEgbWVzc2FnZSB0byBjaGFuZ2UgdGhlIG1heCB0eCBwb3dlci4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSB0eFBvd2VyIHR4UG93ZXIgdG8gYmUgc2V0LgorICogQHBhcmFtIHBTZXNzaW9uRW50cnkgc2Vzc2lvbiBlbnRyeS4KKyAqIEByZXR1cm4gTm9uZQorICovCit0U2lyUmV0U3RhdHVzCitycm1fc2VuZF9zZXRfbWF4X3R4X3Bvd2VyX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0UG93ZXJkQm0gdHhQb3dlciwKKwkJCSAgICAgIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkpCit7CisJdHBNYXhUeFBvd2VyUGFyYW1zIHBNYXhUeFBhcmFtczsKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdFNpck1zZ1EgbXNnUTsKKworCWlmIChwU2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgcGFyYW1ldGVycyIpKTspCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCXBNYXhUeFBhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0TWF4VHhQb3dlclBhcmFtcykpOworCWlmIChOVUxMID09IHBNYXhUeFBhcmFtcykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcE1heFR4UGFyYW1zICIpKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKworCX0KKwkvKiBBbGxvY2F0ZWQgbWVtb3J5IGZvciBwTWF4VHhQYXJhbXMuLi53aWxsIGJlIGZyZWVkIGluIG90aGVyIG1vZHVsZSAqLworCXBNYXhUeFBhcmFtcy0+cG93ZXIgPSB0eFBvd2VyOworCWNkZl9tZW1fY29weShwTWF4VHhQYXJhbXMtPmJzc0lkLCBwU2Vzc2lvbkVudHJ5LT5ic3NJZCwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwljZGZfbWVtX2NvcHkocE1heFR4UGFyYW1zLT5zZWxmU3RhTWFjQWRkciwgcFNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwltc2dRLnR5cGUgPSBXTUFfU0VUX01BWF9UWF9QT1dFUl9SRVE7CisJbXNnUS5yZXNlcnZlZCA9IDA7CisJbXNnUS5ib2R5cHRyID0gcE1heFR4UGFyYW1zOworCW1zZ1EuYm9keXZhbCA9IDA7CisKKwlsaW1fbG9nKHBNYWMsIExPRzMsCisJCUZMKCJTZW5kaW5nIFdNQV9TRVRfTUFYX1RYX1BPV0VSX1JFUSB3aXRoIHBvd2VyKCVkKSB0byBIQUwiKSwKKwkJdHhQb3dlcik7CisKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwU2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbXNnUS50eXBlKSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2dRKSkpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwKKwkJCQkoIlBvc3RpbmcgV01BX1NFVF9NQVhfVFhfUE9XRVJfUkVRIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWCIpLAorCQkJcmV0Q29kZSk7CisJCWNkZl9tZW1fZnJlZShwTWF4VHhQYXJhbXMpOworCQlyZXR1cm4gcmV0Q29kZTsKKwl9CisJcmV0dXJuIHJldENvZGU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHJybV9zZXRfbWF4X3R4X3Bvd2VyX3JzcAorICoKKyAqIEZVTkNUSU9OOiAgUHJvY2VzcyBXTUFfU0VUX01BWF9UWF9QT1dFUl9SU1AgbWVzc2FnZS4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSB0eFBvd2VyIHR4UG93ZXIgdG8gYmUgc2V0LgorICogQHBhcmFtIHBTZXNzaW9uRW50cnkgc2Vzc2lvbiBlbnRyeS4KKyAqIEByZXR1cm4gTm9uZQorICovCit0U2lyUmV0U3RhdHVzIHJybV9zZXRfbWF4X3R4X3Bvd2VyX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSkKK3sKKwl0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdHBNYXhUeFBvd2VyUGFyYW1zIHBNYXhUeFBhcmFtcyA9ICh0cE1heFR4UG93ZXJQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisJdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZCwgaTsKKwl0U2lyTWFjQWRkciBic3NpZCA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworCisJaWYgKGNkZl9tZW1fY29tcGFyZShic3NpZCwgcE1heFR4UGFyYW1zLT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBNYWMtPmxpbS5tYXhCc3NJZDsgaSsrKSB7CisJCQlpZiAoKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgPT0gdHJ1ZSkpIHsKKwkJCQlwU2Vzc2lvbkVudHJ5ID0gJnBNYWMtPmxpbS5ncFNlc3Npb25baV07CisJCQkJcnJtX2NhY2hlX21nbXRfdHhfcG93ZXIocE1hYywgcE1heFR4UGFyYW1zLT5wb3dlciwKKwkJCQkJCQlwU2Vzc2lvbkVudHJ5KTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmICgocFNlc3Npb25FbnRyeSA9CisJCQkgICAgIHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChwTWFjLCBwTWF4VHhQYXJhbXMtPmJzc0lkLAorCQkJCQkJICAgICAgJnNlc3Npb25JZCkpID09IE5VTEwpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgiVW5hYmxlIHRvIGZpbmQgc2Vzc2lvbjoiKSk7CisJCQkgICAgICAgKQorCQkJcmV0Q29kZSA9IGVTSVJfRkFJTFVSRTsKKwkJfSBlbHNlIHsKKwkJCXJybV9jYWNoZV9tZ210X3R4X3Bvd2VyKHBNYWMsIHBNYXhUeFBhcmFtcy0+cG93ZXIsCisJCQkJCQlwU2Vzc2lvbkVudHJ5KTsKKwkJfQorCX0KKworCWNkZl9tZW1fZnJlZShsaW1Nc2dRLT5ib2R5cHRyKTsKKwlsaW1Nc2dRLT5ib2R5cHRyID0gTlVMTDsKKwlyZXR1cm4gcmV0Q29kZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogcnJtX3Byb2Nlc3NfbGlua19tZWFzdXJlbWVudF9yZXF1ZXN0CisgKgorICogRlVOQ1RJT046ICBQcm9jZXNzZXMgdGhlIExpbmsgbWVhc3VyZW1lbnQgcmVxdWVzdCBhbmQgc2VuZCB0aGUgcmVwb3J0LgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBCZCBwb2ludGVyIHRvIEJEIHRvIGV4dHJhY3QgUlNTSSBhbmQgU05SCisgKiBAcGFyYW0gcExpbmtSZXEgcG9pbnRlciB0byB0aGUgTGluayByZXF1ZXN0IGZyYW1lIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBwU2Vzc2lvbkVudHJ5IHNlc3Npb24gZW50cnkuCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordFNpclJldFN0YXR1cworcnJtX3Byb2Nlc3NfbGlua19tZWFzdXJlbWVudF9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICB1aW50OF90ICpwUnhQYWNrZXRJbmZvLAorCQkJCSAgICAgdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcXVlc3QgKnBMaW5rUmVxLAorCQkJCSAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSkKK3sKKwl0U2lyTWFjTGlua1JlcG9ydCBMaW5rUmVwb3J0OworCXRwU2lyTWFjTWdtdEhkciBwSGRyOworCWludDhfdCBjdXJyZW50UlNTSSA9IDA7CisKKwlsaW1fbG9nKHBNYWMsIExPRzMsICJSZWNlaXZlZCBMaW5rIG1lYXN1cmVtZW50IHJlcXVlc3QiKTsKKworCWlmIChwUnhQYWNrZXRJbmZvID09IE5VTEwgfHwgcExpbmtSZXEgPT0gTlVMTCB8fCBwU2Vzc2lvbkVudHJ5ID09IE5VTEwpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSAgICAgICAiJXMgSW52YWxpZCBwYXJhbWV0ZXJzIC0gSWdub3JpbmcgdGhlIHJlcXVlc3QiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJcEhkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKworCUxpbmtSZXBvcnQudHhQb3dlciA9IGxpbV9nZXRfbWF4X3R4X3Bvd2VyKHBMaW5rUmVxLT5NYXhUeFBvd2VyLm1heFR4UG93ZXIsCisJCQkJCQkgIHBMaW5rUmVxLT5NYXhUeFBvd2VyLm1heFR4UG93ZXIsCisJCQkJCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uCisJCQkJCQkgIG5UeFBvd2VyQ2FwKTsKKworCWlmICgoTGlua1JlcG9ydC50eFBvd2VyICE9ICh1aW50OF90KSAocFNlc3Npb25FbnRyeS0+bWF4VHhQb3dlcikpICYmCisJICAgIChlU0lSX1NVQ0NFU1MgPT0gcnJtX3NlbmRfc2V0X21heF90eF9wb3dlcl9yZXEocE1hYywKKwkJCQkJCQkgICAodFBvd2VyZEJtKSAoTGlua1JlcG9ydC4KKwkJCQkJCQkJCXR4UG93ZXIpLAorCQkJCQkJCSAgIHBTZXNzaW9uRW50cnkpKSkgeworCQlQRUxPR1cobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJICAgICAgIEZMKCIgbWF4VHggcG93ZXIgaW4gbGluayByZXBvcnQgaXMgbm90IHNhbWUgYXMgbG9jYWwuLi4iCisJCQkJICAiIExvY2FsID0gJWQgTGluayBSZXF1ZXN0IFR4UG93ZXIgPSAlZCIKKwkJCQkgICIgTGluayBSZXBvcnQgVHhQb3dlciA9ICVkIiksCisJCQkgICAgICAgcFNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciwgTGlua1JlcG9ydC50eFBvd2VyLAorCQkJICAgICAgIHBMaW5rUmVxLT5NYXhUeFBvd2VyLm1heFR4UG93ZXIpOworCQkgICAgICAgKQorCQlwU2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyID0KKwkJCSh0UG93ZXJkQm0pIChMaW5rUmVwb3J0LnR4UG93ZXIpOworCX0KKworCUxpbmtSZXBvcnQuZGlhbG9nVG9rZW4gPSBwTGlua1JlcS0+RGlhbG9nVG9rZW4udG9rZW47CisJTGlua1JlcG9ydC5yeEFudGVubmEgPSAwOworCUxpbmtSZXBvcnQudHhBbnRlbm5hID0gMDsKKwljdXJyZW50UlNTSSA9IFdNQV9HRVRfUlhfUlNTSV9EQihwUnhQYWNrZXRJbmZvKTsKKworCWxpbV9sb2cocE1hYywgTE9HMSwgIlJlY2VpdmVkIExpbmsgcmVwb3J0IGZyYW1lIHdpdGggJWQiLCBjdXJyZW50UlNTSSk7CisKKwkvKiAyMDA4IDExayBzcGVjIHJlZmVyZW5jZTogMTguNC44LjUgUkNQSSBNZWFzdXJlbWVudCAqLworCWlmICgoY3VycmVudFJTU0kpIDw9IFJDUElfTE9XX1JTU0lfVkFMVUUpCisJCUxpbmtSZXBvcnQucmNwaSA9IDA7CisJZWxzZSBpZiAoKGN1cnJlbnRSU1NJID4gUkNQSV9MT1dfUlNTSV9WQUxVRSkgJiYgKGN1cnJlbnRSU1NJIDw9IDApKQorCQlMaW5rUmVwb3J0LnJjcGkgPSBDQUxDVUxBVEVfUkNQSShjdXJyZW50UlNTSSk7CisJZWxzZQorCQlMaW5rUmVwb3J0LnJjcGkgPSBSQ1BJX01BWF9WQUxVRTsKKworCUxpbmtSZXBvcnQucnNuaSA9IFdNQV9HRVRfUlhfU05SKHBSeFBhY2tldEluZm8pOworCisJbGltX2xvZyhwTWFjLCBMT0czLCAiU2VuZGluZyBMaW5rIHJlcG9ydCBmcmFtZSIpOworCisJcmV0dXJuIGxpbV9zZW5kX2xpbmtfcmVwb3J0X2FjdGlvbl9mcmFtZShwTWFjLCAmTGlua1JlcG9ydCwgcEhkci0+c2EsCisJCQkJCQkgcFNlc3Npb25FbnRyeSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHJybV9wcm9jZXNzX25laWdoYm9yX3JlcG9ydF9yZXNwb25zZQorICoKKyAqIEZVTkNUSU9OOiAgUHJvY2Vzc2VzIHRoZSBOZWlnaGJvciBSZXBvcnQgcmVzcG9uc2UgZnJvbSB0aGUgcGVlciBBUC4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTmVpZ2hib3JSZXAgcG9pbnRlciB0byB0aGUgTmVpZ2hib3IgcmVwb3J0IGZyYW1lIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBwU2Vzc2lvbkVudHJ5IHNlc3Npb24gZW50cnkuCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordFNpclJldFN0YXR1cworcnJtX3Byb2Nlc3NfbmVpZ2hib3JfcmVwb3J0X3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICB0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXNwb25zZSAqcE5laWdoYm9yUmVwLAorCQkJCSAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKwl0cFNpck5laWdoYm9yUmVwb3J0SW5kIHBTbWVOZWlnaGJvclJwdCA9IE5VTEw7CisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3QgaTsKKwl0U2lyTXNnUSBtbWhNc2c7CisKKwlpZiAocE5laWdoYm9yUmVwID09IE5VTEwgfHwgcFNlc3Npb25FbnRyeSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCIgSW52YWxpZCBwYXJhbWV0ZXJzIikpOykKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlsaW1fbG9nKHBNYWMsIExPRzMsIEZMKCJOZWlnaGJvciByZXBvcnQgcmVzcG9uc2UgcmVjZWl2ZWQgIikpOworCisJLyogRGlhbG9nIHRva2VuICovCisJaWYgKHBNYWMtPnJybS5ycm1QRUNvbnRleHQuRGlhbG9nVG9rZW4gIT0KKwkgICAgcE5laWdoYm9yUmVwLT5EaWFsb2dUb2tlbi50b2tlbikgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgICJEaWFsb2cgdG9rZW4gbWlzbWF0Y2ggaW4gdGhlIHJlY2VpdmVkIE5laWdoYm9yIHJlcG9ydCIpOworCQkgICAgICAgKQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlpZiAocE5laWdoYm9yUmVwLT5udW1fTmVpZ2hib3JSZXBvcnQgPT0gMCkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgICJObyBuZWlnaGJvciByZXBvcnQgaW4gdGhlIGZyYW1lLi4uRHJvcHBpbmcgaXQiKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJbGVuZ3RoID0gKHNpemVvZih0U2lyTmVpZ2hib3JSZXBvcnRJbmQpKSArCisJCSAoc2l6ZW9mKHRTaXJOZWlnaGJvckJzc0Rlc2NyaXB0aW9uKSAqCisJCSAgKHBOZWlnaGJvclJlcC0+bnVtX05laWdoYm9yUmVwb3J0IC0gMSkpOworCisJLyogUHJlcGFyZSB0aGUgcmVxdWVzdCB0byBzZW5kIHRvIFNNRS4gKi8KKwlwU21lTmVpZ2hib3JScHQgPSBjZGZfbWVtX21hbGxvYyhsZW5ndGgpOworCWlmIChOVUxMID09IHBTbWVOZWlnaGJvclJwdCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTspCisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisKKwl9CisJY2RmX21lbV9zZXQocFNtZU5laWdoYm9yUnB0LCBsZW5ndGgsIDApOworCisJLyogQWxsb2NhdGVkIG1lbW9yeSBmb3IgcFNtZU5laWdoYm9yUnB0Li4ud2lsbCBiZSBmcmVlZCBieSBvdGhlciBtb2R1bGUgKi8KKworCWZvciAoaSA9IDA7IGkgPCBwTmVpZ2hib3JSZXAtPm51bV9OZWlnaGJvclJlcG9ydDsgaSsrKSB7CisJCXBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0ubGVuZ3RoID0gc2l6ZW9mKHRTaXJOZWlnaGJvckJzc0Rlc2NyaXB0aW9uKTsgICAgICAgIC8qKyBhbnkgb3B0aW9uYWwgaWVzICovCisJCWNkZl9tZW1fY29weShwU21lTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc0lkLAorCQkJICAgICBwTmVpZ2hib3JSZXAtPk5laWdoYm9yUmVwb3J0W2ldLmJzc2lkLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcFNtZU5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NpZEluZm8ucnJtSW5mby4KKwkJZkFwUHJlYXV0aFJlYWNoYWJsZSA9CisJCQlwTmVpZ2hib3JSZXAtPk5laWdoYm9yUmVwb3J0W2ldLkFQUmVhY2hhYmlsaXR5OworCQlwU21lTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc2lkSW5mby5ycm1JbmZvLgorCQlmU2FtZVNlY3VyaXR5TW9kZSA9CisJCQlwTmVpZ2hib3JSZXAtPk5laWdoYm9yUmVwb3J0W2ldLlNlY3VyaXR5OworCQlwU21lTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc2lkSW5mby5ycm1JbmZvLgorCQlmU2FtZUF1dGhlbnRpY2F0b3IgPQorCQkJcE5laWdoYm9yUmVwLT5OZWlnaGJvclJlcG9ydFtpXS5LZXlTY29wZTsKKwkJcFNtZU5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NpZEluZm8ucnJtSW5mby4KKwkJZkNhcFNwZWN0cnVtTWVhc3VyZW1lbnQgPQorCQkJcE5laWdoYm9yUmVwLT5OZWlnaGJvclJlcG9ydFtpXS5TcGVjTWdtdENhcDsKKwkJcFNtZU5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NpZEluZm8ucnJtSW5mby4KKwkJZkNhcFFvcyA9IHBOZWlnaGJvclJlcC0+TmVpZ2hib3JSZXBvcnRbaV0uUW9zQ2FwOworCQlwU21lTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc2lkSW5mby5ycm1JbmZvLgorCQlmQ2FwQXBzZCA9IHBOZWlnaGJvclJlcC0+TmVpZ2hib3JSZXBvcnRbaV0uYXBzZDsKKwkJcFNtZU5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NpZEluZm8ucnJtSW5mby4KKwkJZkNhcFJhZGlvTWVhc3VyZW1lbnQgPSBwTmVpZ2hib3JSZXAtPk5laWdoYm9yUmVwb3J0W2ldLnJybTsKKwkJcFNtZU5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NpZEluZm8ucnJtSW5mby4KKwkJZkNhcERlbGF5ZWRCbG9ja0FjayA9CisJCQlwTmVpZ2hib3JSZXAtPk5laWdoYm9yUmVwb3J0W2ldLkRlbGF5ZWRCQTsKKwkJcFNtZU5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NpZEluZm8ucnJtSW5mby4KKwkJZkNhcEltbWVkaWF0ZUJsb2NrQWNrID0KKwkJCXBOZWlnaGJvclJlcC0+TmVpZ2hib3JSZXBvcnRbaV0uSW1tQkE7CisJCXBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0uYnNzaWRJbmZvLnJybUluZm8uCisJCWZNb2JpbGl0eURvbWFpbiA9CisJCQlwTmVpZ2hib3JSZXAtPk5laWdoYm9yUmVwb3J0W2ldLk1vYmlsaXR5RG9tYWluOworCisJCXBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0ucmVnQ2xhc3MgPQorCQkJcE5laWdoYm9yUmVwLT5OZWlnaGJvclJlcG9ydFtpXS5yZWd1bGF0b3J5Q2xhc3M7CisJCXBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0uY2hhbm5lbCA9CisJCQlwTmVpZ2hib3JSZXAtPk5laWdoYm9yUmVwb3J0W2ldLmNoYW5uZWw7CisJCXBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0ucGh5VHlwZSA9CisJCQlwTmVpZ2hib3JSZXAtPk5laWdoYm9yUmVwb3J0W2ldLlBoeVR5cGU7CisJfQorCisJcFNtZU5laWdoYm9yUnB0LT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX05FSUdIQk9SX1JFUE9SVF9JTkQ7CisJcFNtZU5laWdoYm9yUnB0LT5sZW5ndGggPSBsZW5ndGg7CisJcFNtZU5laWdoYm9yUnB0LT5zZXNzaW9uSWQgPSBwU2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisJcFNtZU5laWdoYm9yUnB0LT5udW1OZWlnaGJvclJlcG9ydHMgPSBwTmVpZ2hib3JSZXAtPm51bV9OZWlnaGJvclJlcG9ydDsKKwljZGZfbWVtX2NvcHkocFNtZU5laWdoYm9yUnB0LT5ic3NJZCwgcFNlc3Npb25FbnRyeS0+YnNzSWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkvKiBTZW5kIHJlcXVlc3QgdG8gU01FLiAqLworCW1taE1zZy50eXBlID0gcFNtZU5laWdoYm9yUnB0LT5tZXNzYWdlVHlwZTsKKwltbWhNc2cuYm9keXB0ciA9IHBTbWVOZWlnaGJvclJwdDsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBwU2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgbW1oTXNnLnR5cGUpKTsKKwlzdGF0dXMgPSBsaW1fc3lzX3Byb2Nlc3NfbW1oX21zZ19hcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCisJcmV0dXJuIHN0YXR1czsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBycm1fcHJvY2Vzc19uZWlnaGJvcl9yZXBvcnRfcmVxCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6IENyZWF0ZSBhIE5laWdoYm9yIHJlcG9ydCByZXF1ZXN0IGFuZCBzZW5kIGl0IHRvIHBlZXIuCisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcE5laWdoYm9yUmVxIE5laWdoYm9yIHJlcG9ydCByZXF1ZXN0IHBhcmFtcyAuCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordFNpclJldFN0YXR1cworcnJtX3Byb2Nlc3NfbmVpZ2hib3JfcmVwb3J0X3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXRwU2lyTmVpZ2hib3JSZXBvcnRSZXFJbmQgcE5laWdoYm9yUmVxKQoreworCXRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCXRTaXJNYWNOZWlnaGJvclJlcG9ydFJlcSBOZWlnaGJvclJlcG9ydFJlcTsKKwl0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5OworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCisJaWYgKHBOZWlnaGJvclJlcSA9PSBOVUxMKSB7CisJCVBFTE9HRShsaW1fbG9nKHBNYWMsIExPR0UsICJOZWlnaGJvclJlcSBpcyBOVUxMIik7KQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlpZiAoKHBTZXNzaW9uRW50cnkgPQorCQkgICAgIHBlX2ZpbmRfc2Vzc2lvbl9ieV9ic3NpZChwTWFjLCBwTmVpZ2hib3JSZXEtPmJzc0lkLAorCQkJCQkgICAgICAmc2Vzc2lvbklkKSkgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZCIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJTU0lEIHByZXNlbnQgPSAlZCAiKSwgcE5laWdoYm9yUmVxLT5ub1NTSUQpOworCisJY2RmX21lbV9zZXQoJk5laWdoYm9yUmVwb3J0UmVxLCBzaXplb2YodFNpck1hY05laWdoYm9yUmVwb3J0UmVxKSwgMCk7CisKKwlOZWlnaGJvclJlcG9ydFJlcS5kaWFsb2dUb2tlbiA9ICsrcE1hYy0+cnJtLnJybVBFQ29udGV4dC5EaWFsb2dUb2tlbjsKKwlOZWlnaGJvclJlcG9ydFJlcS5zc2lkX3ByZXNlbnQgPSAhcE5laWdoYm9yUmVxLT5ub1NTSUQ7CisJaWYgKE5laWdoYm9yUmVwb3J0UmVxLnNzaWRfcHJlc2VudCkgeworCQljZGZfbWVtX2NvcHkoJk5laWdoYm9yUmVwb3J0UmVxLnNzaWQsICZwTmVpZ2hib3JSZXEtPnVjU1NJRCwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNTU2lkKSk7CisJCVBFTE9HRShzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPR0UsCisJCQkgICAgICAgKHVpbnQ4X3QgKikgTmVpZ2hib3JSZXBvcnRSZXEuc3NpZC5zc0lkLAorCQkJICAgICAgIE5laWdoYm9yUmVwb3J0UmVxLnNzaWQubGVuZ3RoKTsKKwkJICAgICAgICkKKwl9CisKKwlzdGF0dXMgPQorCQlsaW1fc2VuZF9uZWlnaGJvcl9yZXBvcnRfcmVxdWVzdF9mcmFtZShwTWFjLCAmTmVpZ2hib3JSZXBvcnRSZXEsCisJCQkJCQkgICAgICAgcE5laWdoYm9yUmVxLT5ic3NJZCwKKwkJCQkJCSAgICAgICBwU2Vzc2lvbkVudHJ5KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKyNkZWZpbmUgQUJTKHgpICAgICAgKCh4IDwgMCkgPyAteCA6IHgpCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBycm1fcHJvY2Vzc19iZWFjb25fcmVwb3J0X3JlcQorICoKKyAqIEZVTkNUSU9OOiAgUHJvY2Vzc2VzIHRoZSBCZWFjb24gcmVwb3J0IHJlcXVlc3QgZnJvbSB0aGUgcGVlciBBUC4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwQ3VycmVudFJlcSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IFJlcSBjb210ZXh0LgorICogQHBhcmFtIHBCZWFjb25SZXEgcG9pbnRlciB0byB0aGUgYmVhY29uIHJlcG9ydCByZXF1ZXN0IElFIGZyb20gdGhlIHBlZXIuCisgKiBAcGFyYW0gcFNlc3Npb25FbnRyeSBzZXNzaW9uIGVudHJ5LgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB0UnJtUmV0U3RhdHVzCitycm1fcHJvY2Vzc19iZWFjb25fcmVwb3J0X3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgdHBSUk1SZXEgcEN1cnJlbnRSZXEsCisJCQkgICAgICB0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QgKnBCZWFjb25SZXEsCisJCQkgICAgICB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5KQoreworCXRTaXJNc2dRIG1taE1zZzsKKwl0cFNpckJlYWNvblJlcG9ydFJlcUluZCBwU21lQmNuUmVwb3J0UmVxOworCXVpbnQ4X3QgbnVtX2NoYW5uZWxzID0gMCwgbnVtX0FQQ2hhblJlcG9ydDsKKwl1aW50MTZfdCBtZWFzRHVyYXRpb24sIG1heE1lYXNkdXJhdGlvbjsKKwlpbnQ4X3QgbWF4RHVyYXRpb247CisJdWludDhfdCBzaWduOworCisJaWYgKHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLkJlYWNvblJlcG9ydGluZy5wcmVzZW50ICYmCisJICAgIChwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5CZWFjb25SZXBvcnRpbmcuCisJICAgICByZXBvcnRpbmdDb25kaXRpb24gIT0gMCkpIHsKKwkJLyogUmVwZWF0ZWQgbWVhc3VyZW1lbnQgaXMgbm90IHN1cHBvcnRlZC4gVGhpcyBtZWFucyBudW1iZXIgb2YgcmVwZXRpdGlvbnMgc2hvdWxkIGJlIHplcm8uKEFscmVhZHkgY2hlY2tlZCkgKi8KKwkJLyogQWxsIHRlc3QgY2FzZSBpbiBWb1dpZmkoYXMgb2YgdmVyc2lvbiAwLjM2KSAgdXNlIHplcm8gZm9yIG51bWJlciBvZiByZXBldGl0aW9ucy4gKi8KKwkJLyogQmVhY29uIHJlcG9ydGluZyBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHJlcXVlc3QgaWYgbnVtYmVyIG9mIHJlcGV0aXRvbnMgaXMgemVyby4gKi8KKwkJLyogSUVFRSBTdGQgODAyLjExay0yMDA4IFRhYmxlIDctMjlnIGFuZCBzZWN0aW9uIDExLjEwLjguMSAqLworCisJCVBFTE9HRShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkgICAgICAgIkRyb3BwaW5nIHRoZSByZXF1ZXN0OiBSZXBvcnRpbmcgY29uZGl0aW9uIGluY2x1ZGVkIGluIGJlYWNvbiByZXBvcnQgcmVxdWVzdCBhbmQgaXQgaXMgbm90IHplcm8iKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVSUk1fSU5DQVBBQkxFOworCX0KKworCS8qIFRoZSBsb2dpYyBoZXJlIGlzIHRvIGNoZWNrIHRoZSBtZWFzdXJlbWVudCBkdXJhdGlvbiBwYXNzZWQgaW4gdGhlIGJlYWNvbiByZXF1ZXN0LiBGb2xsb3dpbmcgYXJlIHRoZSBjYXNlcyBoYW5kbGVkLgorCSAgIENhc2UgMTogSWYgbWVhc3VyZW1lbnQgZHVyYXRpb24gcmVjZWl2ZWQgaW4gdGhlIGJlYWNvbiByZXF1ZXN0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IG1lYXN1cmVtZW50IGR1cmF0aW9uIGFkdmVydGlzZWQKKwkgICBpbiB0aGUgUlJNIGNhcGFiaWxpdGllcyhBc3NvYyBSZXEpLCBhbmQgRHVyYXRpb24gTWFuZGF0b3J5IGJpdCBpcyBzZXQgdG8gMSwgUkVGVVNFIHRoZSBiZWFjb24gcmVxdWVzdAorCSAgIENhc2UgMjogSWYgbWVhc3VyZW1lbnQgZHVyYXRpb24gcmVjZWl2ZWQgaW4gdGhlIGJlYWNvbiByZXF1ZXN0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IG1lYXN1cmVtZW50IGR1cmF0aW9uIGFkdmVydGlzZWQKKwkgICBpbiB0aGUgUlJNIGNhcGFiaWxpdGllcyhBc3NvYyBSZXEpLCBhbmQgRHVyYXRpb24gTWFuZGF0b3J5IGJpdCBpcyBzZXQgdG8gMCwgcGVyZm9ybSBtZWFzdXJlbWVudCBmb3IKKwkgICB0aGUgZHVyYXRpb24gYWR2ZXJ0aXNlZCBpbiB0aGUgUlJNIGNhcGFiaWxpdGllcworCisJICAgbWF4TWVhc3VyZW1lbnREdXJhdGlvbiA9IDJeKG5vbk9wZXJhdGluZ0NoYW5NYXggLSA0KSAqIEJlYWNvbkludGVydmFsCisJICovCisJbWF4RHVyYXRpb24gPQorCQlwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnJybUVuYWJsZWRDYXBzLm5vbk9wZXJhdGluZ0NoYW5NYXggLSA0OworCXNpZ24gPSAobWF4RHVyYXRpb24gPCAwKSA/IDEgOiAwOworCW1heER1cmF0aW9uID0gKDFMIDw8IEFCUyhtYXhEdXJhdGlvbikpOworCWlmICghc2lnbikKKwkJbWF4TWVhc2R1cmF0aW9uID0KKwkJCW1heER1cmF0aW9uICogcFNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmJlYWNvbkludGVydmFsOworCWVsc2UKKwkJbWF4TWVhc2R1cmF0aW9uID0KKwkJCXBTZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbCAvIG1heER1cmF0aW9uOworCisJbWVhc0R1cmF0aW9uID0gcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubWVhc19kdXJhdGlvbjsKKworCWxpbV9sb2cocE1hYywgTE9HMywKKwkJIm1heER1cmF0aW9uID0gJWQgc2lnbiA9ICVkIG1heE1lYXNkdXJhdGlvbiA9ICVkIG1lYXNEdXJhdGlvbiA9ICVkIiwKKwkJbWF4RHVyYXRpb24sIHNpZ24sIG1heE1lYXNkdXJhdGlvbiwgbWVhc0R1cmF0aW9uKTsKKworCWlmIChtYXhNZWFzZHVyYXRpb24gPCBtZWFzRHVyYXRpb24pIHsKKwkJaWYgKHBCZWFjb25SZXEtPmR1cmF0aW9uTWFuZGF0b3J5KSB7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgIkRyb3BwaW5nIHRoZSByZXF1ZXN0OiBkdXJhdGlvbiBtYW5kYXRvcnkgYW5kIG1heGR1cmF0aW9uID4gbWVhc2R1cmF0aW9uIik7CisJCQkgICAgICAgKQorCQkJcmV0dXJuIGVSUk1fUkVGVVNFRDsKKwkJfSBlbHNlCisJCQltZWFzRHVyYXRpb24gPSBtYXhNZWFzZHVyYXRpb247CisJfQorCS8qIENhY2hlIHRoZSBkYXRhIHJlcXVpcmVkIGZvciBzZW5kaW5nIHJlcG9ydC4gKi8KKwlwQ3VycmVudFJlcS0+cmVxdWVzdC5CZWFjb24ucmVwb3J0aW5nRGV0YWlsID0KKwkJcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQmNuUmVwb3J0aW5nRGV0YWlsLgorCQlwcmVzZW50ID8gcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQmNuUmVwb3J0aW5nRGV0YWlsLgorCQlyZXBvcnRpbmdEZXRhaWwgOiBCRUFDT05fUkVQT1JUSU5HX0RFVEFJTF9BTExfRkZfSUU7CisKKwlpZiAocEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uUmVxdWVzdGVkSW5mby5wcmVzZW50KSB7CisJCXBDdXJyZW50UmVxLT5yZXF1ZXN0LkJlYWNvbi5yZXFJZXMucEVsZW1lbnRJZHMgPQorCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICoKKwkJCQkgICAgICAgcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uCisJCQkJICAgICAgIFJlcXVlc3RlZEluZm8ubnVtX3JlcXVlc3RlZF9laWRzKTsKKwkJaWYgKE5VTEwgPT0gcEN1cnJlbnRSZXEtPnJlcXVlc3QuQmVhY29uLnJlcUllcy5wRWxlbWVudElkcykgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVxdWVzdCBJRXMgYnVmZmVyIikpOworCQkJcmV0dXJuIGVSUk1fRkFJTFVSRTsKKwkJfQorCQlsaW1fbG9nKHBNYWMsIExPRzMsIEZMKCIgQWxsb2NhdGVkIG1lbW9yeSBmb3IgcEVsZW1lbnRJZHMiKSk7CisKKwkJcEN1cnJlbnRSZXEtPnJlcXVlc3QuQmVhY29uLnJlcUllcy5udW0gPQorCQkJcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uUmVxdWVzdGVkSW5mby4KKwkJCW51bV9yZXF1ZXN0ZWRfZWlkczsKKwkJY2RmX21lbV9jb3B5KHBDdXJyZW50UmVxLT5yZXF1ZXN0LkJlYWNvbi5yZXFJZXMucEVsZW1lbnRJZHMsCisJCQkgICAgIHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLgorCQkJICAgICBSZXF1ZXN0ZWRJbmZvLnJlcXVlc3RlZF9laWRzLAorCQkJICAgICBwQ3VycmVudFJlcS0+cmVxdWVzdC5CZWFjb24ucmVxSWVzLm51bSk7CisJfQorCisJaWYgKHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLm51bV9BUENoYW5uZWxSZXBvcnQpIHsKKwkJZm9yIChudW1fQVBDaGFuUmVwb3J0ID0gMDsKKwkJICAgICBudW1fQVBDaGFuUmVwb3J0IDwKKwkJICAgICBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5udW1fQVBDaGFubmVsUmVwb3J0OworCQkgICAgIG51bV9BUENoYW5SZXBvcnQrKykKKwkJCW51bV9jaGFubmVscyArPQorCQkJCXBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLgorCQkJCUFQQ2hhbm5lbFJlcG9ydFtudW1fQVBDaGFuUmVwb3J0XS5udW1fY2hhbm5lbExpc3Q7CisJfQorCS8qIFByZXBhcmUgdGhlIHJlcXVlc3QgdG8gc2VuZCB0byBTTUUuICovCisJcFNtZUJjblJlcG9ydFJlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyQmVhY29uUmVwb3J0UmVxSW5kKSk7CisJaWYgKE5VTEwgPT0gcFNtZUJjblJlcG9ydFJlcSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgQmVhY29uIFJlcG9ydCBSZXEgSW5kIHRvIFNNRSIpKTsKKworCQlyZXR1cm4gZVJSTV9GQUlMVVJFOworCisJfQorCisJY2RmX21lbV9zZXQocFNtZUJjblJlcG9ydFJlcSwgc2l6ZW9mKHRTaXJCZWFjb25SZXBvcnRSZXFJbmQpLCAwKTsKKworCS8qIEFsbG9jYXRlZCBtZW1vcnkgZm9yIHBTbWVCY25SZXBvcnRSZXEuLi4ud2lsbCBiZSBmcmVlZCBieSBvdGhlciBtb2R1bGVhICovCisJY2RmX21lbV9jb3B5KHBTbWVCY25SZXBvcnRSZXEtPmJzc0lkLCBwU2Vzc2lvbkVudHJ5LT5ic3NJZCwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlwU21lQmNuUmVwb3J0UmVxLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVRX0lORDsKKwlwU21lQmNuUmVwb3J0UmVxLT5sZW5ndGggPSBzaXplb2YodFNpckJlYWNvblJlcG9ydFJlcUluZCk7CisJcFNtZUJjblJlcG9ydFJlcS0+dURpYWxvZ1Rva2VuID0gcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfdG9rZW47CisJcFNtZUJjblJlcG9ydFJlcS0+bXNnU291cmNlID0gZVJSTV9NU0dfU09VUkNFXzExSzsKKwlwU21lQmNuUmVwb3J0UmVxLT5yYW5kb21pemF0aW9uSW50ZXJ2YWwgPQorCQlTWVNfVFVfVE9fTVMocEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ucmFuZG9taXphdGlvbik7CisJcFNtZUJjblJlcG9ydFJlcS0+Y2hhbm5lbEluZm8ucmVndWxhdG9yeUNsYXNzID0KKwkJcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ucmVnQ2xhc3M7CisJcFNtZUJjblJlcG9ydFJlcS0+Y2hhbm5lbEluZm8uY2hhbm5lbE51bSA9CisJCXBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLmNoYW5uZWw7CisJcFNtZUJjblJlcG9ydFJlcS0+bWVhc3VyZW1lbnREdXJhdGlvblswXSA9IFNZU19UVV9UT19NUyhtZWFzRHVyYXRpb24pOworCXBTbWVCY25SZXBvcnRSZXEtPmZNZWFzdXJlbWVudHR5cGVbMF0gPQorCQlwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5tZWFzX21vZGU7CisJY2RmX21lbV9jb3B5KHBTbWVCY25SZXBvcnRSZXEtPm1hY2FkZHJCc3NpZCwKKwkJICAgICBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5CU1NJRCwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWlmIChwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5TU0lELnByZXNlbnQpIHsKKwkJcFNtZUJjblJlcG9ydFJlcS0+c3NJZC5sZW5ndGggPQorCQkJcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uU1NJRC5udW1fc3NpZDsKKwkJY2RmX21lbV9jb3B5KHBTbWVCY25SZXBvcnRSZXEtPnNzSWQuc3NJZCwKKwkJCSAgICAgcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uU1NJRC5zc2lkLAorCQkJICAgICBwU21lQmNuUmVwb3J0UmVxLT5zc0lkLmxlbmd0aCk7CisJfQorCisJcEN1cnJlbnRSZXEtPnRva2VuID0gcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfdG9rZW47CisKKwlwU21lQmNuUmVwb3J0UmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9IG51bV9jaGFubmVsczsKKwlpZiAocEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubnVtX0FQQ2hhbm5lbFJlcG9ydCkgeworCQl1aW50OF90ICpwQ2hhbkxpc3QgPQorCQkJcFNtZUJjblJlcG9ydFJlcS0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlcjsKKwkJZm9yIChudW1fQVBDaGFuUmVwb3J0ID0gMDsKKwkJICAgICBudW1fQVBDaGFuUmVwb3J0IDwKKwkJICAgICBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5udW1fQVBDaGFubmVsUmVwb3J0OworCQkgICAgIG51bV9BUENoYW5SZXBvcnQrKykgeworCQkJY2RmX21lbV9jb3B5KHBDaGFuTGlzdCwKKwkJCQkgICAgIHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLgorCQkJCSAgICAgQVBDaGFubmVsUmVwb3J0W251bV9BUENoYW5SZXBvcnRdLgorCQkJCSAgICAgY2hhbm5lbExpc3QsCisJCQkJICAgICBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi4KKwkJCQkgICAgIEFQQ2hhbm5lbFJlcG9ydFtudW1fQVBDaGFuUmVwb3J0XS4KKwkJCQkgICAgIG51bV9jaGFubmVsTGlzdCk7CisKKwkJCXBDaGFuTGlzdCArPQorCQkJCXBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLgorCQkJCUFQQ2hhbm5lbFJlcG9ydFtudW1fQVBDaGFuUmVwb3J0XS5udW1fY2hhbm5lbExpc3Q7CisJCX0KKwl9CisJLyogU2VuZCByZXF1ZXN0IHRvIFNNRS4gKi8KKwltbWhNc2cudHlwZSA9IGVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVRX0lORDsKKwltbWhNc2cuYm9keXB0ciA9IHBTbWVCY25SZXBvcnRSZXE7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgcFNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIG1taE1zZy50eXBlKSk7CisJcmV0dXJuIGxpbV9zeXNfcHJvY2Vzc19tbWhfbXNnX2FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHJybV9maWxsX2JlYWNvbl9pZXMKKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzogRmlsbHMgRml4ZWQgZmllbGRzIGFuZCBJZXMgaW4gYnNzIGRlc2NyaXB0aW9uIHRvIGFuIGFycmF5IG9mIHVpbnQ4X3QuCisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcEllcyAtIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCBiZSBwb3B1bGF0ZWQgd2l0aCBpZXMuCisgKiBAcGFyYW0gcE51bUllcyAtIHJldHVybnMgdGhlIG51bSBvZiBpZXMgZmlsbGVkIGluIHRoaXMgcGFyYW0uCisgKiBAcGFyYW0gcEllc01heFNpemUgLSBNYXggc2l6ZSBvZiB0aGUgYnVmZmVyIHBJZXMuCisgKiBAcGFyYW0gZWlkcyAtIHBvaW50ZXIgdG8gYXJyYXkgb2YgZWlkcy4gSWYgTlVMTCwgYWxsIGllcyB3aWxsIGJlIHBvcHVsYXRlZC4KKyAqIEBwYXJhbSBudW1FaWRzIC0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFycmF5IGVpZHMuCisgKiBAcGFyYW0gcEJzc0Rlc2MgLSBwb2ludGVyIHRvIEJzcyBEZXNjcmlwdGlvbi4KKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorcnJtX2ZpbGxfYmVhY29uX2llcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgICAgdWludDhfdCAqcEllcywgdWludDhfdCAqcE51bUllcywgdWludDhfdCBwSWVzTWF4U2l6ZSwKKwkJICAgIHVpbnQ4X3QgKmVpZHMsIHVpbnQ4X3QgbnVtRWlkcywgdHBTaXJCc3NEZXNjcmlwdGlvbiBwQnNzRGVzYykKK3sKKwl1aW50OF90IGxlbiwgKnBCY25JZXMsIGNvdW50ID0gMCwgaTsKKwl1aW50OF90IEJjbk51bUllczsKKworCWlmICgocEllcyA9PSBOVUxMKSB8fCAocE51bUllcyA9PSBOVUxMKSB8fCAocEJzc0Rlc2MgPT0gTlVMTCkpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgRkwoIiBJbnZhbGlkIHBhcmFtZXRlcnMiKSk7KQorCQlyZXR1cm47CisJfQorCS8qIE1ha2Ugc3VyZSB0aGF0IGlmIGVpZCBpcyBudWxsLCBudW1FaWRzIGlzIHNldCB0byB6ZXJvLiAqLworCW51bUVpZHMgPSAoZWlkcyA9PSBOVUxMKSA/IDAgOiBudW1FaWRzOworCisJcEJjbkllcyA9ICh1aW50OF90ICopICZwQnNzRGVzYy0+aWVGaWVsZHNbMF07CisJQmNuTnVtSWVzID0gKHVpbnQ4X3QpIEdFVF9JRV9MRU5fSU5fQlNTKHBCc3NEZXNjLT5sZW5ndGgpOworCisJKnBOdW1JZXMgPSAwOworCisJKigodWludDMyX3QgKikgcEllcykgPSBwQnNzRGVzYy0+dGltZVN0YW1wWzBdOworCSpwTnVtSWVzICs9IHNpemVvZih1aW50MzJfdCk7CisJcEllcyArPSBzaXplb2YodWludDMyX3QpOworCSooKHVpbnQzMl90ICopIHBJZXMpID0gcEJzc0Rlc2MtPnRpbWVTdGFtcFsxXTsKKwkqcE51bUllcyArPSBzaXplb2YodWludDMyX3QpOworCXBJZXMgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkqKCh1aW50MTZfdCAqKSBwSWVzKSA9IHBCc3NEZXNjLT5iZWFjb25JbnRlcnZhbDsKKwkqcE51bUllcyArPSBzaXplb2YodWludDE2X3QpOworCXBJZXMgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwkqKCh1aW50MTZfdCAqKSBwSWVzKSA9IHBCc3NEZXNjLT5jYXBhYmlsaXR5SW5mbzsKKwkqcE51bUllcyArPSBzaXplb2YodWludDE2X3QpOworCXBJZXMgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKworCXdoaWxlIChCY25OdW1JZXMgPiAwKSB7CisJCWxlbiA9ICoocEJjbkllcyArIDEpICsgMjsgICAgICAgLyogZWxlbWVudCBpZCArIGxlbmd0aC4gKi8KKwkJbGltX2xvZyhwTWFjLCBMT0czLCAiRUlEID0gJWQsIGxlbiA9ICVkIHRvdGFsID0gJWQiLAorCQkJKnBCY25JZXMsICoocEJjbkllcyArIDEpLCBsZW4pOworCisJCWkgPSAwOworCQlkbyB7CisJCQlpZiAoKChlaWRzID09IE5VTEwpIHx8ICgqcEJjbkllcyA9PSBlaWRzW2ldKSkgJiYKKwkJCSAgICAoKCpwTnVtSWVzKSArIGxlbikgPCBwSWVzTWF4U2l6ZSkgeworCQkJCWxpbV9sb2cocE1hYywgTE9HMywgIkFkZGluZyBFaWQgJWQsIGxlbj0lZCIsCisJCQkJCSpwQmNuSWVzLCBsZW4pOworCisJCQkJY2RmX21lbV9jb3B5KHBJZXMsIHBCY25JZXMsIGxlbik7CisJCQkJcEllcyArPSBsZW47CisJCQkJKnBOdW1JZXMgKz0gbGVuOworCQkJCWNvdW50Kys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpKys7CisJCX0gd2hpbGUgKGkgPCBudW1FaWRzKTsKKworCQlwQmNuSWVzICs9IGxlbjsKKwkJQmNuTnVtSWVzIC09IGxlbjsKKwl9CisJbGltX2xvZyhwTWFjLCBMT0cxLCAiVG90YWwgbGVuZ3RoIG9mIEllcyBhZGRlZCA9ICVkIiwgKnBOdW1JZXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBycm1fcHJvY2Vzc19iZWFjb25fcmVwb3J0X3htaXQKKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzogQ3JlYXRlIGEgUmFkaW8gbWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgc2VuZCBpdCB0byBwZWVyLgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBCY25SZXBvcnQgRGF0YSBmb3IgYmVhY29uIHJlcG9ydCBJRSBmcm9tIFNNRS4KKyAqIEByZXR1cm4gTm9uZQorICovCit0U2lyUmV0U3RhdHVzCitycm1fcHJvY2Vzc19iZWFjb25fcmVwb3J0X3htaXQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgICB0cFNpckJlYWNvblJlcG9ydFhtaXRJbmQgcEJjblJlcG9ydCkKK3sKKwl0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKwl0U2lyTWFjUmFkaW9NZWFzdXJlUmVwb3J0ICpwUmVwb3J0ID0gTlVMTDsKKwl0cFJSTVJlcSBwQ3VycmVudFJlcSA9IHBNYWMtPnJybS5ycm1QRUNvbnRleHQucEN1cnJlbnRSZXE7CisJdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IGZsYWdCU1NQcmVzZW50ID0gZmFsc2UsIGJzc0Rlc2NDbnQgPSAwOworCisJbGltX2xvZyhwTWFjLCBMT0cxLCAiUmVjZWl2ZWQgYmVhY29uIHJlcG9ydCB4bWl0IGluZGljYXRpb24iKTsKKworCWlmIChOVUxMID09IHBCY25SZXBvcnQpIHsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwgIlJlY2VpdmVkIHBCY25SZXBvcnQgaXMgTlVMTCBpbiBQRSIpOykKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlpZiAoTlVMTCA9PSBwQ3VycmVudFJlcSkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgICJSZWNlaXZlZCByZXBvcnQgeG1pdCB3aGlsZSB0aGVyZSBpcyBubyByZXF1ZXN0IHBlbmRpbmcgaW4gUEUiKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlpZiAoKHBCY25SZXBvcnQtPm51bUJzc0Rlc2MpIHx8CisJICAgICghcEJjblJlcG9ydC0+bnVtQnNzRGVzYyAmJiBwQ3VycmVudFJlcS0+c2VuZEVtcHR5QmNuUnB0KSkgeworCQlwQmNuUmVwb3J0LT5udW1Cc3NEZXNjID0KKwkJCShwQmNuUmVwb3J0LT5udW1Cc3NEZXNjID09CisJCQkgUlJNX0JDTl9SUFRfTk9fQlNTX0lORk8pID8gUlJNX0JDTl9SUFRfTUlOX1JQVCA6CisJCQlwQmNuUmVwb3J0LT5udW1Cc3NEZXNjOworCisJCWlmIChOVUxMID09IChwU2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsCisJCQkJCQkJCSAgICAgIHBCY25SZXBvcnQtPgorCQkJCQkJCQkgICAgICBic3NJZCwKKwkJCQkJCQkJICAgICAgJnNlc3Npb25JZCkpKQorCQl7CisJCQlQRUxPR0UobGltX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIGJzc0lkIikpOworCQkJICAgICAgICkKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCX0KKworCQlwUmVwb3J0ID0gY2RmX21lbV9tYWxsb2MocEJjblJlcG9ydC0+bnVtQnNzRGVzYyAqCisJCQkJCSBzaXplb2YodFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCkpOworCisJCWlmIChOVUxMID09IHBSZXBvcnQpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiUlJNIFJlcG9ydCBpcyBOVUxMLCBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJCSAgICAgICApCisJCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQl9CisKKwkJY2RmX21lbV96ZXJvKHBSZXBvcnQsCisJCQkgICAgIHBCY25SZXBvcnQtPm51bUJzc0Rlc2MgKgorCQkJICAgICBzaXplb2YodFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCkpOworCisJCWZvciAoYnNzRGVzY0NudCA9IDA7IGJzc0Rlc2NDbnQgPCBwQmNuUmVwb3J0LT5udW1Cc3NEZXNjOworCQkgICAgIGJzc0Rlc2NDbnQrKykgeworCQkJLyogUHJlcGFyZSB0aGUgYmVhY29uIHJlcG9ydCBhbmQgc2VuZCBpdCB0byB0aGUgcGVlci4gKi8KKwkJCXBSZXBvcnRbYnNzRGVzY0NudF0udG9rZW4gPSBwQmNuUmVwb3J0LT51RGlhbG9nVG9rZW47CisJCQlwUmVwb3J0W2Jzc0Rlc2NDbnRdLnJlZnVzZWQgPSAwOworCQkJcFJlcG9ydFtic3NEZXNjQ250XS5pbmNhcGFibGUgPSAwOworCQkJcFJlcG9ydFtic3NEZXNjQ250XS50eXBlID0gU0lSX01BQ19SUk1fQkVBQ09OX1RZUEU7CisKKwkJCS8qIElmIHRoZSBzY2FuIHJlc3VsdCBpcyBOVUxMIHRoZW4gc2VuZCByZXBvcnQgcmVxdWVzdCB3aXRoICovCisJCQkvKiBvcHRpb24gc3ViZWxlbWVudCBhcyBOVUxMLi4gKi8KKwkJCWlmIChOVUxMICE9IHBCY25SZXBvcnQtPnBCc3NEZXNjcmlwdGlvbltic3NEZXNjQ250XSkgeworCQkJCWZsYWdCU1NQcmVzZW50ID0gdHJ1ZTsKKwkJCX0KKwkJCS8qIFZhbGlkIHJlc3BvbnNlIGlzIGluY2x1ZGVkIGlmIHRoZSBzaXplIG9mIGJlYWNvbiB4bWl0ICovCisJCQkvKiBpcyA9PSBzaXplIG9mIGJlYWNvbiB4bWl0IGluZCArIGllcyAqLworCQkJaWYgKHBCY25SZXBvcnQtPmxlbmd0aCA+PQorCQkJICAgIHNpemVvZih0U2lyQmVhY29uUmVwb3J0WG1pdEluZCkpIHsKKwkJCQlwUmVwb3J0W2Jzc0Rlc2NDbnRdLnJlcG9ydC5iZWFjb25SZXBvcnQuCisJCQkJcmVnQ2xhc3MgPSBwQmNuUmVwb3J0LT5yZWdDbGFzczsKKwkJCQlpZiAoZmxhZ0JTU1ByZXNlbnQpIHsKKwkJCQkJcFJlcG9ydFtic3NEZXNjQ250XS5yZXBvcnQuYmVhY29uUmVwb3J0LgorCQkJCQljaGFubmVsID0KKwkJCQkJCXBCY25SZXBvcnQtPgorCQkJCQkJcEJzc0Rlc2NyaXB0aW9uW2Jzc0Rlc2NDbnRdLT4KKwkJCQkJCWNoYW5uZWxJZDsKKwkJCQkJY2RmX21lbV9jb3B5KHBSZXBvcnRbYnNzRGVzY0NudF0ucmVwb3J0LgorCQkJCQkJICAgICBiZWFjb25SZXBvcnQubWVhc1N0YXJ0VGltZSwKKwkJCQkJCSAgICAgcEJjblJlcG9ydC0+CisJCQkJCQkgICAgIHBCc3NEZXNjcmlwdGlvbgorCQkJCQkJICAgICBbYnNzRGVzY0NudF0tPnN0YXJ0VFNGLAorCQkJCQkJICAgICBzaXplb2YocEJjblJlcG9ydC0+CisJCQkJCQkJICAgIHBCc3NEZXNjcmlwdGlvbgorCQkJCQkJCSAgICBbYnNzRGVzY0NudF0tPgorCQkJCQkJCSAgICBzdGFydFRTRikpOworCQkJCQlwUmVwb3J0W2Jzc0Rlc2NDbnRdLnJlcG9ydC5iZWFjb25SZXBvcnQuCisJCQkJCW1lYXNEdXJhdGlvbiA9CisJCQkJCQlTWVNfTVNfVE9fVFUocEJjblJlcG9ydC0+ZHVyYXRpb24pOworCQkJCQlwUmVwb3J0W2Jzc0Rlc2NDbnRdLnJlcG9ydC5iZWFjb25SZXBvcnQuCisJCQkJCXBoeVR5cGUgPQorCQkJCQkJcEJjblJlcG9ydC0+CisJCQkJCQlwQnNzRGVzY3JpcHRpb25bYnNzRGVzY0NudF0tPm53VHlwZTsKKwkJCQkJcFJlcG9ydFtic3NEZXNjQ250XS5yZXBvcnQuYmVhY29uUmVwb3J0LgorCQkJCQliY25Qcm9iZVJzcCA9IDE7CisJCQkJCXBSZXBvcnRbYnNzRGVzY0NudF0ucmVwb3J0LmJlYWNvblJlcG9ydC4KKwkJCQkJcnNuaSA9CisJCQkJCQlwQmNuUmVwb3J0LT4KKwkJCQkJCXBCc3NEZXNjcmlwdGlvbltic3NEZXNjQ250XS0+c2lucjsKKwkJCQkJcFJlcG9ydFtic3NEZXNjQ250XS5yZXBvcnQuYmVhY29uUmVwb3J0LgorCQkJCQlyY3BpID0KKwkJCQkJCXBCY25SZXBvcnQtPgorCQkJCQkJcEJzc0Rlc2NyaXB0aW9uW2Jzc0Rlc2NDbnRdLT5yc3NpOworCisJCQkJCXBSZXBvcnRbYnNzRGVzY0NudF0ucmVwb3J0LmJlYWNvblJlcG9ydC4KKwkJCQkJYW50ZW5uYUlkID0gMDsKKwkJCQkJcFJlcG9ydFtic3NEZXNjQ250XS5yZXBvcnQuYmVhY29uUmVwb3J0LgorCQkJCQlwYXJlbnRUU0YgPQorCQkJCQkJcEJjblJlcG9ydC0+CisJCQkJCQlwQnNzRGVzY3JpcHRpb25bYnNzRGVzY0NudF0tPgorCQkJCQkJcGFyZW50VFNGOworCQkJCQljZGZfbWVtX2NvcHkocFJlcG9ydFtic3NEZXNjQ250XS5yZXBvcnQuCisJCQkJCQkgICAgIGJlYWNvblJlcG9ydC5ic3NpZCwKKwkJCQkJCSAgICAgcEJjblJlcG9ydC0+CisJCQkJCQkgICAgIHBCc3NEZXNjcmlwdGlvbgorCQkJCQkJICAgICBbYnNzRGVzY0NudF0tPmJzc0lkLAorCQkJCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKHBDdXJyZW50UmVxLT5yZXF1ZXN0LkJlYWNvbi4KKwkJCQkJcmVwb3J0aW5nRGV0YWlsKSB7CisJCQkJY2FzZSBCRUFDT05fUkVQT1JUSU5HX0RFVEFJTF9OT19GRl9JRToKKwkJCQkJLyogMCBObyBuZWVkIHRvIGluY2x1ZGUgYW55IGVsZW1lbnRzLiAqLworCQkJCQlsaW1fbG9nKHBNYWMsIExPRzMsCisJCQkJCQkiTm8gcmVwb3J0aW5nIGRldGFpbCByZXF1ZXN0ZWQiKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCRUFDT05fUkVQT1JUSU5HX0RFVEFJTF9BTExfRkZfUkVRX0lFOgorCQkJCQkvKiAxOiBJbmNsdWRlIGFsbCBGRnMgYW5kIFJlcXVlc3RlZCBJZXMuICovCisJCQkJCWxpbV9sb2cocE1hYywgTE9HMywKKwkJCQkJCSJPbmx5IHJlcXVlc3RlZCBJRXMgaW4gcmVwb3J0aW5nIGRldGFpbCByZXF1ZXN0ZWQiKTsKKworCQkJCQlpZiAoZmxhZ0JTU1ByZXNlbnQpIHsKKwkJCQkJCXJybV9maWxsX2JlYWNvbl9pZXMocE1hYywKKwkJCQkJCQkJICAgICh1aW50OF90ICopICYKKwkJCQkJCQkJICAgIHBSZXBvcnQKKwkJCQkJCQkJICAgIFtic3NEZXNjQ250XS4KKwkJCQkJCQkJICAgIHJlcG9ydC4KKwkJCQkJCQkJICAgIGJlYWNvblJlcG9ydC4KKwkJCQkJCQkJICAgIEllc1swXSwKKwkJCQkJCQkJICAgICh1aW50OF90ICopICYKKwkJCQkJCQkJICAgIHBSZXBvcnQKKwkJCQkJCQkJICAgIFtic3NEZXNjQ250XS4KKwkJCQkJCQkJICAgIHJlcG9ydC4KKwkJCQkJCQkJICAgIGJlYWNvblJlcG9ydC4KKwkJCQkJCQkJICAgIG51bUllcywKKwkJCQkJCQkJICAgIEJFQUNPTl9SRVBPUlRfTUFYX0lFUywKKwkJCQkJCQkJICAgIHBDdXJyZW50UmVxLT4KKwkJCQkJCQkJICAgIHJlcXVlc3QuQmVhY29uLgorCQkJCQkJCQkgICAgcmVxSWVzLgorCQkJCQkJCQkgICAgcEVsZW1lbnRJZHMsCisJCQkJCQkJCSAgICBwQ3VycmVudFJlcS0+CisJCQkJCQkJCSAgICByZXF1ZXN0LkJlYWNvbi4KKwkJCQkJCQkJICAgIHJlcUllcy5udW0sCisJCQkJCQkJCSAgICBwQmNuUmVwb3J0LT4KKwkJCQkJCQkJICAgIHBCc3NEZXNjcmlwdGlvbgorCQkJCQkJCQkgICAgW2Jzc0Rlc2NDbnRdKTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCWNhc2UgQkVBQ09OX1JFUE9SVElOR19ERVRBSUxfQUxMX0ZGX0lFOgorCQkJCS8qIDIgLyBkZWZhdWx0IC0gSW5jbHVkZSBhbGwgRkZzIGFuZCBhbGwgSWVzLiAqLworCQkJCWRlZmF1bHQ6CisJCQkJCWxpbV9sb2cocE1hYywgTE9HMywKKwkJCQkJCSJEZWZhdWx0IGFsbCBJRXMgYW5kIEZGcyIpOworCQkJCQlpZiAoZmxhZ0JTU1ByZXNlbnQpIHsKKwkJCQkJCXJybV9maWxsX2JlYWNvbl9pZXMocE1hYywKKwkJCQkJCQkJICAgICh1aW50OF90ICopICYKKwkJCQkJCQkJICAgIHBSZXBvcnQKKwkJCQkJCQkJICAgIFtic3NEZXNjQ250XS4KKwkJCQkJCQkJICAgIHJlcG9ydC4KKwkJCQkJCQkJICAgIGJlYWNvblJlcG9ydC4KKwkJCQkJCQkJICAgIEllc1swXSwKKwkJCQkJCQkJICAgICh1aW50OF90ICopICYKKwkJCQkJCQkJICAgIHBSZXBvcnQKKwkJCQkJCQkJICAgIFtic3NEZXNjQ250XS4KKwkJCQkJCQkJICAgIHJlcG9ydC4KKwkJCQkJCQkJICAgIGJlYWNvblJlcG9ydC4KKwkJCQkJCQkJICAgIG51bUllcywKKwkJCQkJCQkJICAgIEJFQUNPTl9SRVBPUlRfTUFYX0lFUywKKwkJCQkJCQkJICAgIE5VTEwsIDAsCisJCQkJCQkJCSAgICBwQmNuUmVwb3J0LT4KKwkJCQkJCQkJICAgIHBCc3NEZXNjcmlwdGlvbgorCQkJCQkJCQkgICAgW2Jzc0Rlc2NDbnRdKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlsaW1fbG9nKHBNYWMsIExPRzEsICJTZW5kaW5nIEFjdGlvbiBmcmFtZSB3aXRoICVkIGJzcyBpbmZvIiwKKwkJCWJzc0Rlc2NDbnQpOworCQlsaW1fc2VuZF9yYWRpb19tZWFzdXJlX3JlcG9ydF9hY3Rpb25fZnJhbWUocE1hYywKKwkJCQkJCQkgICBwQ3VycmVudFJlcS0+ZGlhbG9nX3Rva2VuLAorCQkJCQkJCSAgIGJzc0Rlc2NDbnQsIHBSZXBvcnQsCisJCQkJCQkJICAgcEJjblJlcG9ydC0+YnNzSWQsCisJCQkJCQkJICAgcFNlc3Npb25FbnRyeSk7CisKKwkJcEN1cnJlbnRSZXEtPnNlbmRFbXB0eUJjblJwdCA9IGZhbHNlOworCX0KKworCWlmIChwQmNuUmVwb3J0LT5mTWVhc3VyZURvbmUpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0czLCAiTWVhc3VyZW1lbnQgZG9uZS4uLi5jbGVhbnVwIHRoZSBjb250ZXh0Iik7CisKKwkJcnJtX2NsZWFudXAocE1hYyk7CisJfQorCisJaWYgKE5VTEwgIT0gcFJlcG9ydCkKKwkJY2RmX21lbV9mcmVlKHBSZXBvcnQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBycm1fcHJvY2Vzc19iZWFjb25fcmVxdWVzdF9mYWlsdXJlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnksIHRTaXJNYWNBZGRyIHBlZXIsCisJCQkJCXRScm1SZXRTdGF0dXMgc3RhdHVzKQoreworCXRwU2lyTWFjUmFkaW9NZWFzdXJlUmVwb3J0IHBSZXBvcnQgPSBOVUxMOworCXRwUlJNUmVxIHBDdXJyZW50UmVxID0gcE1hYy0+cnJtLnJybVBFQ29udGV4dC5wQ3VycmVudFJlcTsKKworCXBSZXBvcnQgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCkpOworCWlmIChOVUxMID09IHBSZXBvcnQpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwKKwkJCQkoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIFJSTSBSZXEgcHJvY2Vzc2luZyIpKTsKKwkJcmV0dXJuOworCX0KKwljZGZfbWVtX3NldChwUmVwb3J0LCBzaXplb2YodFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCksIDApOworCXBSZXBvcnQtPnRva2VuID0gcEN1cnJlbnRSZXEtPnRva2VuOworCXBSZXBvcnQtPnR5cGUgPSBTSVJfTUFDX1JSTV9CRUFDT05fVFlQRTsKKworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBlUlJNX1JFRlVTRUQ6CisJCXBSZXBvcnQtPnJlZnVzZWQgPSAxOworCQlicmVhazsKKwljYXNlIGVSUk1fSU5DQVBBQkxFOgorCQlwUmVwb3J0LT5pbmNhcGFibGUgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiIEJlYWNvbiByZXF1ZXN0IHByb2Nlc3NpbmcgZmFpbGVkIG5vIHJlcG9ydCBzZW50IHdpdGggc3RhdHVzICVkICIpLAorCQkJICAgICAgIHN0YXR1cyk7CisJCSAgICAgICApOworCQljZGZfbWVtX2ZyZWUocFJlcG9ydCk7CisJCXJldHVybjsKKwl9CisKKwlsaW1fc2VuZF9yYWRpb19tZWFzdXJlX3JlcG9ydF9hY3Rpb25fZnJhbWUocE1hYywgcEN1cnJlbnRSZXEtPmRpYWxvZ190b2tlbiwgMSwKKwkJCQkJCSAgIHBSZXBvcnQsIHBlZXIsIHBTZXNzaW9uRW50cnkpOworCisJY2RmX21lbV9mcmVlKHBSZXBvcnQpOworCWxpbV9sb2cocE1hYywgTE9HMywgRkwoIiBGcmVlIG1lbW9yeSBmb3IgcFJlcG9ydCIpKTsKKwlyZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHJybV9wcm9jZXNzX3JhZGlvX21lYXN1cmVtZW50X3JlcXVlc3QKKyAqCisgKiBGVU5DVElPTjogIFByb2Nlc3NlcyB0aGUgUmFkaW8gUmVzb3VyY2UgTWVhc3VyZW1lbnQgcmVxdWVzdC4KKyAqCisgKiBMT0dJQzoKKworICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBlZXIgTWFjYWRkcmVzcyBvZiB0aGUgcGVlciByZXF1ZXN0aW5nIHRoZSByYWRpbyBtZWFzdXJlbWVudC4KKyAqIEBwYXJhbSBwUlJNUmVxIEFycmF5IG9mIE1lYXN1cmVtZW50IHJlcXVlc3QgSUVzCisgKiBAcGFyYW0gcFNlc3Npb25FbnRyeSBzZXNzaW9uIGVudHJ5LgorICogQHJldHVybiBOb25lCisgKi8KK3RTaXJSZXRTdGF0dXMKK3JybV9wcm9jZXNzX3JhZGlvX21lYXN1cmVtZW50X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICB0U2lyTWFjQWRkciBwZWVyLAorCQkJCSAgICAgIHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCAqcFJSTVJlcSwKKwkJCQkgICAgICB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5KQoreworCXVpbnQ4X3QgaTsKKwl0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKwl0cFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCBwUmVwb3J0ID0gTlVMTDsKKwl1aW50OF90IG51bV9yZXBvcnQgPSAwOworCXRwUlJNUmVxIHBDdXJyZW50UmVxID0gcE1hYy0+cnJtLnJybVBFQ29udGV4dC5wQ3VycmVudFJlcTsKKwl0UnJtUmV0U3RhdHVzIHJybVN0YXR1cyA9IGVSUk1fU1VDQ0VTUzsKKworCWlmICghcFJSTVJlcS0+bnVtX01lYXN1cmVtZW50UmVxdWVzdCkgeworCQkvKiBObyBtZWFzdXJlbWVudCByZXF1ZXN0cy4uLi4gKi8KKwkJLyogKi8KKwkJcFJlcG9ydCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyTWFjUmFkaW9NZWFzdXJlUmVwb3J0KSk7CisJCWlmIChOVUxMID09IHBSZXBvcnQpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTAorCQkJCQkoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIFJSTSBSZXEgcHJvY2Vzc2luZyIpKTsKKwkJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJCX0KKwkJY2RmX21lbV9zZXQocFJlcG9ydCwgc2l6ZW9mKHRTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQpLCAwKTsKKwkJUEVMT0dFKGxpbV9sb2cocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTAorCQkJCSAgICAgICAoIk5vIHJlcXVlc3RJZXMgaW4gdGhlIG1lYXN1cmVtZW50IHJlcXVlc3QsIHNlbmRpbmcgaW5jYXBhYmxlIHJlcG9ydCIpKTsKKwkJICAgICAgICkKKwkJcFJlcG9ydC0+aW5jYXBhYmxlID0gMTsKKwkJbnVtX3JlcG9ydCA9IDE7CisJCWxpbV9zZW5kX3JhZGlvX21lYXN1cmVfcmVwb3J0X2FjdGlvbl9mcmFtZShwTWFjLAorCQkJCQkJCSAgIHBSUk1SZXEtPkRpYWxvZ1Rva2VuLnRva2VuLAorCQkJCQkJCSAgIG51bV9yZXBvcnQsIHBSZXBvcnQsIHBlZXIsCisJCQkJCQkJICAgcFNlc3Npb25FbnRyeSk7CisJCWNkZl9tZW1fZnJlZShwUmVwb3J0KTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJLyogUEYgRml4ICovCisJaWYgKHBSUk1SZXEtPk51bU9mUmVwZXRpdGlvbnMucmVwZXRpdGlvbnMgPiAwKSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCUZMKCIgbnVtYmVyIG9mIHJlcGV0aXRpb25zICVkIiksCisJCQlwUlJNUmVxLT5OdW1PZlJlcGV0aXRpb25zLnJlcGV0aXRpb25zKTsKKworCQkvKiBTZW5kIGEgcmVwb3J0IHdpdGggaW5jYXBhYmxlIGJpdCBzZXQuIE5vdCBzdXBwb3J0aW5nIHJlcGV0aXRpb25zLiAqLworCQlwUmVwb3J0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQpKTsKKwkJaWYgKE5VTEwgPT0gcFJlcG9ydCkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMCisJCQkJCSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgUlJNIFJlcSBwcm9jZXNzaW5nIikpOworCQkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwkJfQorCQljZGZfbWVtX3NldChwUmVwb3J0LCBzaXplb2YodFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCksIDApOworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiIEFsbG9jYXRlZCBtZW1vcnkgZm9yIHBSZXBvcnQiKSk7KQorCQlwUmVwb3J0LT5pbmNhcGFibGUgPSAxOworCQlwUmVwb3J0LT50eXBlID0gcFJSTVJlcS0+TWVhc3VyZW1lbnRSZXF1ZXN0WzBdLm1lYXN1cmVtZW50X3R5cGU7CisJCW51bV9yZXBvcnQgPSAxOworCQlnb3RvIGVuZDsKKworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwUlJNUmVxLT5udW1fTWVhc3VyZW1lbnRSZXF1ZXN0OyBpKyspIHsKKwkJc3dpdGNoIChwUlJNUmVxLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfdHlwZSkgeworCQljYXNlIFNJUl9NQUNfUlJNX0JFQUNPTl9UWVBFOgorCQkJLyogUHJvY2VzcyBiZWFjb24gcmVxdWVzdC4gKi8KKwkJCWlmIChwQ3VycmVudFJlcSkgeworCQkJCWlmIChwUmVwb3J0ID09IE5VTEwpICAgIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBzZW5kIHJlcG9ydHMgZm9yIGFueSBzdWJzZXF1ZW50IHJlcXVlc3RzLiAqLworCQkJCXsKKwkJCQkJcFJlcG9ydCA9CisJCQkJCQljZGZfbWVtX21hbGxvYyhzaXplb2YKKwkJCQkJCQkgICAgICAgKHRTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQpCisJCQkJCQkJICAgICAgICoKKwkJCQkJCQkgICAgICAgKHBSUk1SZXEtPgorCQkJCQkJCQludW1fTWVhc3VyZW1lbnRSZXF1ZXN0CisJCQkJCQkJCS0gaSkpOworCQkJCQlpZiAoTlVMTCA9PSBwUmVwb3J0KSB7CisJCQkJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJCQkJRkwKKwkJCQkJCQkJKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBSUk0gUmVxIHByb2Nlc3NpbmciKSk7CisJCQkJCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQkJCQl9CisJCQkJCWNkZl9tZW1fc2V0KHBSZXBvcnQsCisJCQkJCQkgICAgc2l6ZW9mCisJCQkJCQkgICAgKHRTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQpCisJCQkJCQkgICAgKgorCQkJCQkJICAgIChwUlJNUmVxLT4KKwkJCQkJCSAgICAgbnVtX01lYXN1cmVtZW50UmVxdWVzdCAtCisJCQkJCQkgICAgIGkpLCAwKTsKKwkJCQkJbGltX2xvZyhwTWFjLCBMT0czLAorCQkJCQkJRkwKKwkJCQkJCQkoIiBycm0gYmVhY29uIHR5cGUgcmVmdXNlZCBvZiAlZCByZXBvcnQgaW4gYmVhY29uIHRhYmxlIiksCisJCQkJCQludW1fcmVwb3J0KTsKKworCQkJCX0KKwkJCQlwUmVwb3J0W251bV9yZXBvcnRdLnJlZnVzZWQgPSAxOworCQkJCXBSZXBvcnRbbnVtX3JlcG9ydF0udHlwZSA9CisJCQkJCVNJUl9NQUNfUlJNX0JFQUNPTl9UWVBFOworCQkJCXBSZXBvcnRbbnVtX3JlcG9ydF0udG9rZW4gPQorCQkJCQlwUlJNUmVxLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0uCisJCQkJCW1lYXN1cmVtZW50X3Rva2VuOworCQkJCW51bV9yZXBvcnQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcEN1cnJlbnRSZXEgPQorCQkJCQljZGZfbWVtX21hbGxvYyhzaXplb2YoKnBDdXJyZW50UmVxKSk7CisJCQkJaWYgKE5VTEwgPT0gcEN1cnJlbnRSZXEpIHsKKwkJCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCQkJRkwKKwkJCQkJCQkoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIFJSTSBSZXEgcHJvY2Vzc2luZyIpKTsKKwkJCQkJY2RmX21lbV9mcmVlKHBSZXBvcnQpOworCQkJCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQkJCX0KKwkJCQlsaW1fbG9nKHBNYWMsIExPRzMsCisJCQkJCUZMKCIgUHJvY2Vzc2luZyBCZWFjb24gUmVwb3J0IHJlcXVlc3QiKSk7CisJCQkJY2RmX21lbV9zZXQocEN1cnJlbnRSZXEsIHNpemVvZigqcEN1cnJlbnRSZXEpLAorCQkJCQkgICAgMCk7CisJCQkJcEN1cnJlbnRSZXEtPmRpYWxvZ190b2tlbiA9CisJCQkJCXBSUk1SZXEtPkRpYWxvZ1Rva2VuLnRva2VuOworCQkJCXBDdXJyZW50UmVxLT50b2tlbiA9CisJCQkJCXBSUk1SZXEtPk1lYXN1cmVtZW50UmVxdWVzdFtpXS4KKwkJCQkJbWVhc3VyZW1lbnRfdG9rZW47CisJCQkJcEN1cnJlbnRSZXEtPnNlbmRFbXB0eUJjblJwdCA9IHRydWU7CisJCQkJcE1hYy0+cnJtLnJybVBFQ29udGV4dC5wQ3VycmVudFJlcSA9CisJCQkJCXBDdXJyZW50UmVxOworCQkJCXJybVN0YXR1cyA9CisJCQkJCXJybV9wcm9jZXNzX2JlYWNvbl9yZXBvcnRfcmVxKHBNYWMsIHBDdXJyZW50UmVxLAorCQkJCQkJCQkgICAgICAmcFJSTVJlcS0+CisJCQkJCQkJCSAgICAgIE1lYXN1cmVtZW50UmVxdWVzdAorCQkJCQkJCQkgICAgICBbaV0sCisJCQkJCQkJCSAgICAgIHBTZXNzaW9uRW50cnkpOworCQkJCWlmIChlUlJNX1NVQ0NFU1MgIT0gcnJtU3RhdHVzKSB7CisJCQkJCXJybV9wcm9jZXNzX2JlYWNvbl9yZXF1ZXN0X2ZhaWx1cmUocE1hYywKKwkJCQkJCQkJCSAgIHBTZXNzaW9uRW50cnksCisJCQkJCQkJCQkgICBwZWVyLAorCQkJCQkJCQkJICAgcnJtU3RhdHVzKTsKKwkJCQkJcnJtX2NsZWFudXAocE1hYyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0lSX01BQ19SUk1fTENJX1RZUEU6CisJCWNhc2UgU0lSX01BQ19SUk1fTE9DQVRJT05fQ0lWSUNfVFlQRToKKwkJY2FzZSBTSVJfTUFDX1JSTV9GSU5FX1RJTUVfTUVBU19UWVBFOgorCQkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJICAgIEZMKCJSUk0gd2l0aCB0eXBlOiAlZCBzZW50IHRvIHVzZXJzcGFjZSIpLAorCQkJICAgIHBSUk1SZXEtPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF90eXBlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogU2VuZCBhIHJlcG9ydCB3aXRoIGluY2FwYWJhbGUgYml0IHNldC4gKi8KKwkJCWlmIChwUmVwb3J0ID09IE5VTEwpICAgIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBzZW5kIHJlcG9ydHMgZm9yIGFueSBzdWJzZXF1ZW50IHJlcXVlc3RzLiAqLworCQkJeworCQkJCXBSZXBvcnQgPQorCQkJCQljZGZfbWVtX21hbGxvYyhzaXplb2YKKwkJCQkJCSAgICAgICAodFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCkKKwkJCQkJCSAgICAgICAqCisJCQkJCQkgICAgICAgKHBSUk1SZXEtPgorCQkJCQkJCW51bV9NZWFzdXJlbWVudFJlcXVlc3QgLQorCQkJCQkJCWkpKTsKKwkJCQlpZiAoTlVMTCA9PSBwUmVwb3J0KSB7CisJCQkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQkJCUZMCisJCQkJCQkJKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBSUk0gUmVxIHByb2Nlc3NpbmciKSk7CisJCQkJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJCQkJfQorCQkJCWNkZl9tZW1fc2V0KHBSZXBvcnQsCisJCQkJCSAgICBzaXplb2YodFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCkKKwkJCQkJICAgICogKHBSUk1SZXEtPm51bV9NZWFzdXJlbWVudFJlcXVlc3QgLQorCQkJCQkgICAgICAgaSksIDApOworCQkJCWxpbV9sb2cocE1hYywgTE9HMywKKwkJCQkJRkwKKwkJCQkJCSgicnJtIGJlYWNvbiB0eXBlIGluY2FwYWJsZSBvZiAlZCByZXBvcnQgIiksCisJCQkJCW51bV9yZXBvcnQpOworCQkJfQorCQkJcFJlcG9ydFtudW1fcmVwb3J0XS5pbmNhcGFibGUgPSAxOworCQkJcFJlcG9ydFtudW1fcmVwb3J0XS50eXBlID0KKwkJCQlwUlJNUmVxLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfdHlwZTsKKwkJCXBSZXBvcnRbbnVtX3JlcG9ydF0udG9rZW4gPQorCQkJCXBSUk1SZXEtPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF90b2tlbjsKKwkJCW51bV9yZXBvcnQrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCitlbmQ6CisJaWYgKHBSZXBvcnQpIHsKKwkJbGltX3NlbmRfcmFkaW9fbWVhc3VyZV9yZXBvcnRfYWN0aW9uX2ZyYW1lKHBNYWMsCisJCQkJCQkJICAgcFJSTVJlcS0+RGlhbG9nVG9rZW4udG9rZW4sCisJCQkJCQkJICAgbnVtX3JlcG9ydCwgcFJlcG9ydCwgcGVlciwKKwkJCQkJCQkgICBwU2Vzc2lvbkVudHJ5KTsKKworCQljZGZfbWVtX2ZyZWUocFJlcG9ydCk7CisJCWxpbV9sb2cocE1hYywgTE9HMywgRkwoIiBGcmVlIG1lbW9yeSBmb3IgcFJlcG9ydCIpKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBycm1fdXBkYXRlX3N0YXJ0X3RzZgorICoqCisgKiBGVU5DVElPTjogIFN0b3JlIHN0YXJ0IFRTRiBvZiBtZWFzdXJlbWVudC4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFydFRTRiAtIFRTRiB2YWx1ZSBhdCB0aGUgc3RhcnQgb2YgbWVhc3VyZW1lbnQuCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBycm1fdXBkYXRlX3N0YXJ0X3RzZih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzdGFydFRTRlsyXSkKK3sKKwlwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnN0YXJ0VFNGWzBdID0gc3RhcnRUU0ZbMF07CisJcE1hYy0+cnJtLnJybVBFQ29udGV4dC5zdGFydFRTRlsxXSA9IHN0YXJ0VFNGWzFdOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBycm1fZ2V0X3N0YXJ0X3RzZgorICoKKyAqIEZVTkNUSU9OOiAgR2V0IHRoZSBTdGFydCBUU0YuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gc3RhcnRUU0YgLSBzdG9yZSBzdGFyIFRTRiBpbiB0aGlzIGJ1ZmZlci4KKyAqIEByZXR1cm4gdHhQb3dlcgorICovCit2b2lkIHJybV9nZXRfc3RhcnRfdHNmKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90ICpwU3RhcnRUU0YpCit7CisJcFN0YXJ0VFNGWzBdID0gcE1hYy0+cnJtLnJybVBFQ29udGV4dC5zdGFydFRTRlswXTsKKwlwU3RhcnRUU0ZbMV0gPSBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnN0YXJ0VFNGWzFdOworCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHJybV9nZXRfY2FwYWJpbGl0aWVzCisgKgorICogRlVOQ1RJT046CisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0cFJSTUNhcHMgd2l0aCBhbGwgdGhlIGNhcHMgZW5hYmxlZCBpbiBSUk0KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwU2Vzc2lvbkVudHJ5CisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gdFJSTUNhcHMKKyAqLwordHBSUk1DYXBzIHJybV9nZXRfY2FwYWJpbGl0aWVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkpCit7CisJcmV0dXJuICZwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnJybUVuYWJsZWRDYXBzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBycm1fdXBkYXRlX2NvbmZpZworICoKKyAqIEZVTkNUSU9OOgorICogVXBkYXRlIHRoZSBjb25maWd1cmF0aW9uLiBUaGlzIGlzIGNhbGxlZCBmcm9tIGxpbV91cGRhdGVfY29uZmlnLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBTZXNzaW9uRW50cnkKKyAqIEByZXR1cm4gcG9pbnRlciB0byB0UlJNQ2FwcworICovCit2b2lkIHJybV91cGRhdGVfY29uZmlnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkpCit7CisJdWludDMyX3QgdmFsOworCXRwUlJNQ2FwcyBwUlJNQ2FwcyA9ICZwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnJybUVuYWJsZWRDYXBzOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19SUk1fRU5BQkxFRCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgcnJtIGVuYWJsZWQgZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCXBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlID0gKHZhbCkgPyAxIDogMDsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfUlJNX09QRVJBVElOR19DSEFOX01BWCwgJnZhbCkgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMCisJCQkJKCJjZmcgZ2V0IHJybSBvcGVyYXRpbmcgY2hhbm5lbCBtYXggbWVhc3VyZW1lbnQgZHVyYXRpb24gZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCXBSUk1DYXBzLT5vcGVyYXRpbmdDaGFuTWF4ID0gKHVpbnQ4X3QpIHZhbDsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVgsICZ2YWwpICE9CisJICAgIGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgiY2ZnIGdldCBycm0gbm9uLW9wZXJhdGluZyBjaGFubmVsIG1heCBtZWFzdXJlbWVudCBkdXJhdGlvbiBmYWlsZWQiKSk7CisJCXJldHVybjsKKwl9CisJcFJSTUNhcHMtPm5vbk9wZXJhdGluZ0NoYW5NYXggPSAodWludDhfdCkgdmFsOworCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkiUlJNIGVuYWJsZWQgPSAlZCAgT3BlcmF0aW5nQ2hhbk1heCA9ICVkICBOb25PcGVyYXRpbmdNYXggPSAlZCIsCisJCXBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlLAorCQlwUlJNQ2Fwcy0+b3BlcmF0aW5nQ2hhbk1heCwgcFJSTUNhcHMtPm5vbk9wZXJhdGluZ0NoYW5NYXgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBycm1faW5pdGlhbGl6ZQorICoKKyAqIEZVTkNUSU9OOgorICogSW5pdGlhbGl6ZSBSUk0gbW9kdWxlCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzIHJybV9pbml0aWFsaXplKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdHBSUk1DYXBzIHBSUk1DYXBzID0gJnBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlZENhcHM7CisKKwlwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnBDdXJyZW50UmVxID0gTlVMTDsKKwlwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnR4TWdtdFBvd2VyID0gMDsKKwlwTWFjLT5ycm0ucnJtUEVDb250ZXh0LkRpYWxvZ1Rva2VuID0gMDsKKworCXBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlID0gMDsKKworCWNkZl9tZW1fc2V0KHBSUk1DYXBzLCBzaXplb2YodFJSTUNhcHMpLCAwKTsKKwlwUlJNQ2Fwcy0+TGlua01lYXN1cmVtZW50ID0gMTsKKwlwUlJNQ2Fwcy0+TmVpZ2hib3JScHQgPSAxOworCXBSUk1DYXBzLT5CZWFjb25QYXNzaXZlID0gMTsKKwlwUlJNQ2Fwcy0+QmVhY29uQWN0aXZlID0gMTsKKwlwUlJNQ2Fwcy0+QmVhY29uVGFibGUgPSAxOworCXBSUk1DYXBzLT5BUENoYW5SZXBvcnQgPSAxOworCXBSUk1DYXBzLT5maW5lX3RpbWVfbWVhc19ycHQgPSAxOworCXBSUk1DYXBzLT5sY2lfY2FwYWJpbGl0eSA9IDE7CisKKwlwUlJNQ2Fwcy0+b3BlcmF0aW5nQ2hhbk1heCA9IDM7CisJcFJSTUNhcHMtPm5vbk9wZXJhdGluZ0NoYW5NYXggPSAzOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogcnJtX2NsZWFudXAKKyAqCisgKiBGVU5DVElPTjoKKyAqIGNsZWFudXAgUlJNIG1vZHVsZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIG1vZGUKKyAqIEBwYXJhbSByYXRlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzIHJybV9jbGVhbnVwKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJaWYgKHBNYWMtPnJybS5ycm1QRUNvbnRleHQucEN1cnJlbnRSZXEpIHsKKwkJaWYgKHBNYWMtPnJybS5ycm1QRUNvbnRleHQucEN1cnJlbnRSZXEtPnJlcXVlc3QuQmVhY29uLnJlcUllcy4KKwkJICAgIHBFbGVtZW50SWRzKSB7CisJCQljZGZfbWVtX2ZyZWUocE1hYy0+cnJtLnJybVBFQ29udGV4dC5wQ3VycmVudFJlcS0+CisJCQkJICAgICByZXF1ZXN0LkJlYWNvbi5yZXFJZXMucEVsZW1lbnRJZHMpOworCQkJbGltX2xvZyhwTWFjLCBMT0c0LCBGTCgiIEZyZWUgbWVtb3J5IGZvciBwRWxlbWVudElkcyIpKTsKKwkJfQorCisJCWNkZl9tZW1fZnJlZShwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnBDdXJyZW50UmVxKTsKKwkJbGltX2xvZyhwTWFjLCBMT0c0LCBGTCgiIEZyZWUgbWVtb3J5IGZvciBwQ3VycmVudFJlcSIpKTsKKwl9CisKKwlwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnBDdXJyZW50UmVxID0gTlVMTDsKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBycm1fcHJvY2Vzc19tZXNzYWdlCisgKgorICogRlVOQ1RJT046ICBQcm9jZXNzZXMgdGhlIG5leHQgcmVjZWl2ZWQgUmFkaW8gUmVzb3VyY2UgTWFuYWdlbWVudCBtZXNzYWdlCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gTm9uZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBycm1fcHJvY2Vzc19tZXNzYWdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKQoreworCXN3aXRjaCAocE1zZy0+dHlwZSkgeworCWNhc2UgZVdOSV9TTUVfTkVJR0hCT1JfUkVQT1JUX1JFUV9JTkQ6CisJCXJybV9wcm9jZXNzX25laWdoYm9yX3JlcG9ydF9yZXEocE1hYywgcE1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfQkVBQ09OX1JFUE9SVF9SRVNQX1hNSVRfSU5EOgorCQlycm1fcHJvY2Vzc19iZWFjb25fcmVwb3J0X3htaXQocE1hYywgcE1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCX0KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9zY2gvc2NoX2FwaS5jIGIvY29yZS9tYWMvc3JjL3BlL3NjaC9zY2hfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExMTEwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9zY2gvc2NoX2FwaS5jCkBAIC0wLDAgKzEsNjI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBzY2hfYXBpLmNjIGNvbnRhaW5zIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSBBUEkgZXhwb3NlZAorICogYnkgc2NoZWR1bGVyIG1vZHVsZQorICoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorCisjaW5jbHVkZSAic2lyX21hY19wcm90X2RlZi5oIgorI2luY2x1ZGUgInNpcl9tYWNfcHJvcF9leHRzLmgiCisjaW5jbHVkZSAic2lyX2NvbW1vbi5oIgorCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorCisjaW5jbHVkZSAibGltX2FwaS5oIgorCisjaW5jbHVkZSAic2NoX2FwaS5oIgorI2luY2x1ZGUgInNjaF9kZWJ1Zy5oIgorCisjaW5jbHVkZSAic2NoX3N5c19wYXJhbXMuaCIKKyNpbmNsdWRlICJsaW1fdHJhY2UuaCIKKyNpbmNsdWRlICJsaW1fdHlwZXMuaCIKKworI2luY2x1ZGUgIndtYV90eXBlcy5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWMgVmFyaWFibGVzICovCisvKiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBzY2hfZ2V0X2NmcF9jb3VudAorICoKKyAqIEZVTkNUSU9OOgorICogRnVuY3Rpb24gdXNlZCBieSBvdGhlciBTaXJpdXMgbW9kdWxlcyB0byByZWFkIENGUGNvdW50CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gTm9uZQorICogQHJldHVybiBOb25lCisgKi8KKwordWludDhfdCBzY2hfZ2V0X2NmcF9jb3VudCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXJldHVybiBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hDRlBDb3VudDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogc2NoX2dldF9jZnBfZHVyX3JlbWFpbmluZworICoKKyAqIEZVTkNUSU9OOgorICogRnVuY3Rpb24gdXNlZCBieSBvdGhlciBTaXJpdXMgbW9kdWxlcyB0byByZWFkIENGUER1cmF0aW9uIHJlbWFpbmluZworICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIE5vbmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3VpbnQxNl90IHNjaF9nZXRfY2ZwX2R1cl9yZW1haW5pbmcodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlyZXR1cm4gcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQ0ZQRHVyUmVtYWluaW5nOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBzY2hfaW5pdF9nbG9iYWxzCisgKgorICogRlVOQ1RJT046CisgKiBJbml0aWFsaXplIGdsb2JhbHMKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHNjaF9pbml0X2dsb2JhbHModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlwTWFjLT5zY2guZ1NjaEhjZkVuYWJsZWQgPSBmYWxzZTsKKworCXBNYWMtPnNjaC5nU2NoU2NhblJlcXVlc3RlZCA9IGZhbHNlOworCXBNYWMtPnNjaC5nU2NoU2NhblJlcVJjdmQgPSBmYWxzZTsKKworCXBNYWMtPnNjaC5nU2NoR2VuQmVhY29uID0gMTsKKwlwTWFjLT5zY2guZ1NjaEJlYWNvbnNTZW50ID0gMDsKKwlwTWFjLT5zY2guZ1NjaEJlYWNvbnNXcml0dGVuID0gMDsKKwlwTWFjLT5zY2guZ1NjaEJjblBhcnNlRXJyb3JDbnQgPSAwOworCXBNYWMtPnNjaC5nU2NoQmNuSWdub3JlZCA9IDA7CisJcE1hYy0+c2NoLmdTY2hCQlhwb3J0UmN2Q250ID0gMDsKKwlwTWFjLT5zY2guZ1NjaFVua25vd25SY3ZDbnQgPSAwOworCXBNYWMtPnNjaC5nU2NoQmNuUmN2Q250ID0gMDsKKwlwTWFjLT5zY2guZ1NjaFJSUmN2Q250ID0gMDsKKwlwTWFjLT5zY2gucW9zTnVsbENudCA9IDA7CisJcE1hYy0+c2NoLm51bURhdGEgPSAwOworCXBNYWMtPnNjaC5udW1Qb2xsID0gMDsKKwlwTWFjLT5zY2gubnVtQ29ycnVwdCA9IDA7CisJcE1hYy0+c2NoLm51bUJvZ3VzSW50ID0gMDsKKwlwTWFjLT5zY2gubnVtVHhBY3QwID0gMDsKKwlwTWFjLT5zY2gucnJUaW1lb3V0ID0gU0NIX1JSX1RJTUVPVVQ7CisJcE1hYy0+c2NoLnBvbGxQZXJpb2QgPSBTQ0hfUE9MTF9QRVJJT0Q7CisJcE1hYy0+c2NoLm11bHRpcGxlU2NoZWQgPSAxOworCXBNYWMtPnNjaC5tYXhQb2xsVGltZW91dHMgPSAyMDsKKwlwTWFjLT5zY2guY2hlY2tDZmJGbGFnU3R1Y2sgPSAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBzY2hfcG9zdF9tZXNzYWdlCisgKgorICogRlVOQ1RJT046CisgKiBQb3N0IHRoZSBiZWFjb24gbWVzc2FnZSB0byB0aGUgc2NoZWR1bGVyIG1lc3NhZ2UgcXVldWUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTXNnIHBvaW50ZXIgdG8gbWVzc2FnZQorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cyBzY2hfcG9zdF9tZXNzYWdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKQoreworCXNjaF9wcm9jZXNzX21lc3NhZ2UocE1hYywgcE1zZyk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogc2NoX3NlbmRfc3RhcnRfc2Nhbl9yc3AKKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHNjaF9zZW5kX3N0YXJ0X3NjYW5fcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdFNpck1zZ1EgbXNnUTsKKwl1aW50MzJfdCByZXRDb2RlOworCisJUEVMT0cxKHNjaF9sb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgTElNIG1lc3NhZ2UgdG8gZ28gaW50byBzY2FuIikpOykKKwltc2dRLnR5cGUgPSBTSVJfU0NIX1NUQVJUX1NDQU5fUlNQOworCWlmICgocmV0Q29kZSA9IGxpbV9wb3N0X21zZ19hcGkocE1hYywgJm1zZ1EpKSAhPSBlU0lSX1NVQ0NFU1MpCisJCXNjaF9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJQb3N0aW5nIFNUQVJUX1NDQU5fUlNQIHRvIExJTSBmYWlsZWQsIHJlYXNvbj0lWCIpLAorCQkJcmV0Q29kZSk7Cit9CisKKy8qKgorICogc2NoX3NlbmRfYmVhY29uX3JlcQorICoKKyAqIEZVTkNUSU9OOgorICoKKyAqIExPR0lDOgorICogMSkgU0NIIHJlY2VpdmVkIFNJUl9TQ0hfQkVBQ09OX0dFTl9JTkQKKyAqIDIpIFNDSCB1cGRhdGVzIFRJTSBJRSBhbmQgb3RoZXIgYmVhY29uIHJlbGF0ZWQgSUUncworICogMykgU0NIIHNlbmRzIFdNQV9TRU5EX0JFQUNPTl9SRVEgdG8gSEFMLiBIQUwgdGhlbiBjb3BpZXMgdGhlIGJlYWNvbgorICogICAgdGVtcGxhdGUgdG8gbWVtb3J5CisgKgorICogQVNTVU1QVElPTlM6CisgKiBNZW1vcnkgYWxsb2NhdGlvbiBpcyByZXFkIHRvIHNlbmQgdGhpcyBtZXNzYWdlIGFuZCBTQ0ggYWxsb2NhdGVzIG1lbW9yeS4KKyAqIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgSEFMIHdpbGwgImZyZWUiIHRoaXMgbWVtb3J5LgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgZ2xvYmFsCisgKgorICogQHBhcmFtIGJlYWNvblBheWxvYWQKKyAqCisgKiBAcGFyYW0gc2l6ZSAtIExlbmd0aCBvZiB0aGUgYmVhY29uCisgKgorICogQHJldHVybiBDREZfU1RBVFVTCisgKi8KK3RTaXJSZXRTdGF0dXMgc2NoX3NlbmRfYmVhY29uX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpiZWFjb25QYXlsb2FkLAorCQkJCSAgdWludDE2X3Qgc2l6ZSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyTXNnUSBtc2dROworCXRwU2VuZGJlYWNvblBhcmFtcyBiZWFjb25QYXJhbXMgPSBOVUxMOworCXRTaXJSZXRTdGF0dXMgcmV0Q29kZTsKKworCXNjaF9sb2cocE1hYywgTE9HMiwKKwkJRkwKKwkJCSgiSW5kaWNhdGluZyBIQUwgdG8gY29weSB0aGUgYmVhY29uIHRlbXBsYXRlIFslZCBieXRlc10gdG8gbWVtb3J5IiksCisJCXNpemUpOworCisJYmVhY29uUGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTZW5kYmVhY29uUGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gYmVhY29uUGFyYW1zKQorCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCisJbXNnUS50eXBlID0gV01BX1NFTkRfQkVBQ09OX1JFUTsKKworCS8qIE5vIERpYWxvZyBUb2tlbiByZXFkLCBhcyBhIHJlc3BvbnNlIGlzIG5vdCBzb2xpY2l0ZWQgKi8KKwltc2dRLnJlc2VydmVkID0gMDsKKworCS8qIEZpbGwgaW4gdFNlbmRiZWFjb25QYXJhbXMgbWVtYmVycyAqLworCWNkZl9tZW1fY29weShiZWFjb25QYXJhbXMtPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKwkJICAgICBzaXplb2YocHNlc3Npb25FbnRyeS0+YnNzSWQpKTsKKworCWlmIChMSU1fSVNfSUJTU19ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCWJlYWNvblBhcmFtcy0+dGltSWVPZmZzZXQgPSAwOworCX0gZWxzZSB7CisJCWJlYWNvblBhcmFtcy0+dGltSWVPZmZzZXQgPSBwc2Vzc2lvbkVudHJ5LT5zY2hCZWFjb25PZmZzZXRCZWdpbjsKKwl9CisKKwkvKiBwMnBJZU9mZnNldCBzaG91bGQgYmUgYXRsZWFzdCBncmVhdGVyIHRoYW4gdGltSWVPZmZzZXQgKi8KKwlpZiAoKHBNYWMtPnNjaC5zY2hPYmplY3QucDJwSWVPZmZzZXQgIT0gMCkgJiYKKwkgICAgKHBNYWMtPnNjaC5zY2hPYmplY3QucDJwSWVPZmZzZXQgPAorCSAgICAgcHNlc3Npb25FbnRyeS0+c2NoQmVhY29uT2Zmc2V0QmVnaW4pKSB7CisJCXNjaF9sb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgcDJwSWVPZmZzZXQ6WyVkXSIpLAorCQkJcE1hYy0+c2NoLnNjaE9iamVjdC5wMnBJZU9mZnNldCk7CisJCUNERl9BU1NFUlQoMCk7CisJCWNkZl9tZW1fZnJlZShiZWFjb25QYXJhbXMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwliZWFjb25QYXJhbXMtPnAycEllT2Zmc2V0ID0gcE1hYy0+c2NoLnNjaE9iamVjdC5wMnBJZU9mZnNldDsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GV19CRUFDT05fVFhfUFJOVF9MT0cKKwlzY2hfbG9nKHBNYWMsIExPR0UsIEZMKCJUaW1JZU9mZnNldDpbJWRdIiksIGJlYWNvblBhcmFtcy0+VGltSWVPZmZzZXQpOworI2VuZGlmCisKKwliZWFjb25QYXJhbXMtPmJlYWNvbiA9IGJlYWNvblBheWxvYWQ7CisJYmVhY29uUGFyYW1zLT5iZWFjb25MZW5ndGggPSAodWludDMyX3QpIHNpemU7CisJbXNnUS5ib2R5cHRyID0gYmVhY29uUGFyYW1zOworCW1zZ1EuYm9keXZhbCA9IDA7CisKKwkvKiBLZWVwIGEgY29weSBvZiByZWNlbnQgYmVhY29uIGZyYW1lIHNlbnQgKi8KKworCS8qIGZyZWUgcHJldmlvdXMgY29weSBvZiB0aGUgYmVhY29uICovCisJaWYgKHBzZXNzaW9uRW50cnktPmJlYWNvbikgeworCQljZGZfbWVtX2ZyZWUocHNlc3Npb25FbnRyeS0+YmVhY29uKTsKKwl9CisKKwlwc2Vzc2lvbkVudHJ5LT5iY25MZW4gPSAwOworCXBzZXNzaW9uRW50cnktPmJlYWNvbiA9IE5VTEw7CisKKwlwc2Vzc2lvbkVudHJ5LT5iZWFjb24gPSBjZGZfbWVtX21hbGxvYyhzaXplKTsKKwlpZiAocHNlc3Npb25FbnRyeS0+YmVhY29uICE9IE5VTEwpIHsKKwkJY2RmX21lbV9jb3B5KHBzZXNzaW9uRW50cnktPmJlYWNvbiwgYmVhY29uUGF5bG9hZCwgc2l6ZSk7CisJCXBzZXNzaW9uRW50cnktPmJjbkxlbiA9IHNpemU7CisJfQorCisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIG1zZ1EudHlwZSkpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gKHJldENvZGUgPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnUSkpKSB7CisJCXNjaF9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJQb3N0aW5nIFNFTkRfQkVBQ09OX1JFUSB0byBIQUwgZmFpbGVkLCByZWFzb249JVgiKSwKKwkJCXJldENvZGUpOworCX0gZWxzZSB7CisJCXNjaF9sb2cocE1hYywgTE9HMiwKKwkJCUZMKCJTdWNjZXNzZnVsbHkgcG9zdGVkIFdNQV9TRU5EX0JFQUNPTl9SRVEgdG8gSEFMIikpOworCisJCWlmIChMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSAmJgorCQkgICAocE1hYy0+c2NoLnNjaE9iamVjdC5mQmVhY29uQ2hhbmdlZCkpIHsKKwkJCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkJCSAgICAocmV0Q29kZSA9CisJCQkJICAgICBsaW1fc2VuZF9wcm9iZV9yc3BfdGVtcGxhdGVfdG9faGFsKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQkJCQkJCQkmcHNlc3Npb25FbnRyeS0+CisJCQkJCQkJCQlEZWZQcm9iZVJzcEllQml0bWFwCisJCQkJCQkJCQlbMF0pKSkgeworCQkJCS8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byBmcmVlIGFueSBtZW1vcnkgKi8KKwkJCQlzY2hfbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMCisJCQkJCQkoIkZBSUxFRCB0byBzZW5kIHByb2JlIHJlc3BvbnNlIHRlbXBsYXRlIHdpdGggcmV0Q29kZSAlZCIpLAorCQkJCQlyZXRDb2RlKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXRDb2RlOworfQorCit1aW50MzJfdCBsaW1fcmVtb3ZlX3AycF9pZV9mcm9tX2FkZF9pZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LAorCQkJCQl1aW50OF90ICphZGRJZVdvUDJwSWUsCisJCQkJCXVpbnQzMl90ICphZGRuSUVMZW5Xb1AycEllKQoreworCXVpbnQzMl90IGxlZnQgPSBwc2Vzc2lvbkVudHJ5LT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BEYXRhTGVuOworCXVpbnQ4X3QgKnB0ciA9IHBzZXNzaW9uRW50cnktPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFfYnVmZjsKKwl1aW50OF90IGVsZW1faWQsZWxlbV9sZW47CisJdWludDMyX3Qgb2Zmc2V0ID0gMDsKKwl1aW50OF90IGVpZCA9IDB4REQ7CisKKwljZGZfbWVtX2NvcHkoYWRkSWVXb1AycEllLCBwdHIsIGxlZnQpOworCSphZGRuSUVMZW5Xb1AycEllID0gbGVmdDsKKworCWlmIChhZGRJZVdvUDJwSWUgIT0gTlVMTCkgeworCQl3aGlsZSAobGVmdCA+PSAyKSB7CisJCQllbGVtX2lkICA9IHB0clswXTsKKwkJCWVsZW1fbGVuID0gcHRyWzFdOworCQkJbGVmdCAtPSAyOworCQkJaWYoZWxlbV9sZW4gPiBsZWZ0KSB7CisJCQkJc2NoX2xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBJRXMiKSk7CisJCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJCX0KKwkJCWlmICgoZWxlbV9pZCA9PSBlaWQpICYmCisJCQkJKGNkZl9tZW1fY29tcGFyZSgmcHRyWzJdLAorCQkJCQkiXHg1MFx4NmZceDlhXHgwOSIsIDQpKSkgeworCQkJCWxlZnQgLT0gZWxlbV9sZW47CisJCQkJcHRyICs9IChlbGVtX2xlbiArIDIpOworCQkJCWNkZl9tZW1fY29weSgmYWRkSWVXb1AycEllW29mZnNldF0sIHB0ciwgbGVmdCk7CisJCQkJKmFkZG5JRUxlbldvUDJwSWUgLT0gKDIgKyBlbGVtX2xlbik7CisJCQl9IGVsc2UgeworCQkJCWxlZnQgLT0gZWxlbV9sZW47CisJCQkJcHRyICs9IChlbGVtX2xlbiArIDIpOworCQkJCW9mZnNldCArPSAyICsgZWxlbV9sZW47CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordWludDMyX3QgbGltX3NlbmRfcHJvYmVfcnNwX3RlbXBsYXRlX3RvX2hhbCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkJICAgIHVpbnQzMl90ICpJZUJpdG1hcCkKK3sKKwl0U2lyTXNnUSBtc2dROworCXVpbnQ4X3QgKnBGcmFtZTJIYWwgPSBwc2Vzc2lvbkVudHJ5LT5wU2NoUHJvYmVSc3BUZW1wbGF0ZTsKKwl0cFNlbmRQcm9iZVJlc3BQYXJhbXMgcHByb2JlUmVzcFBhcmFtcyA9IE5VTEw7CisJdWludDMyX3QgcmV0Q29kZSA9IGVTSVJfRkFJTFVSRTsKKwl1aW50MzJfdCBuUGF5bG9hZCwgbkJ5dGVzLCBuU3RhdHVzOworCXRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworCXVpbnQzMl90IGFkZG5JRVByZXNlbnQgPSBmYWxzZTsKKwl1aW50MzJfdCBhZGRuSUVMZW4gPSAwOworCXVpbnQ4X3QgKmFkZElFID0gTlVMTDsKKwl1aW50OF90ICphZGRJZVdvUDJwSWUgPSBOVUxMOworCXVpbnQzMl90IGFkZG5JRUxlbldvUDJwSWUgPSAwOworCXVpbnQzMl90IHJldFN0YXR1czsKKworCW5TdGF0dXMgPQorCQlkb3QxMWZfZ2V0X3BhY2tlZF9wcm9iZV9yZXNwb25zZV9zaXplKHBNYWMsCisJCQkJCQkgICAgICAmcHNlc3Npb25FbnRyeS0+cHJvYmVSZXNwRnJhbWUsCisJCQkJCQkgICAgICAmblBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCXNjaF9sb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisJCQkJICAgICAgICJvciBhIFByb2JlIFJlc3BvbnNlICgweCUwOHgpLiIpLAorCQkJblN0YXR1cyk7CisJCS8qIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzogKi8KKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZlByb2JlUmVzcG9uc2UpOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQlzY2hfbG9nKHBNYWMsIExPR0UsIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIgorCQkJCSAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIFByb2JlIFJlc3BvbnNlICIKKwkJCQkgICAgICAgIigweCUwOHgpLiIpLCBuU3RhdHVzKTsKKwl9CisKKwluQnl0ZXMgPSBuUGF5bG9hZCArIHNpemVvZih0U2lyTWFjTWdtdEhkcik7CisKKwkvKiBDaGVjayBpZiBwcm9iZSByZXNwb25zZSBJRSBpcyBwcmVzZW50IG9yIG5vdCAqLworCWFkZG5JRVByZXNlbnQgPSAocHNlc3Npb25FbnRyeS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwRGF0YUxlbiAhPSAwKTsKKwlpZiAoYWRkbklFUHJlc2VudCkgeworCQkvKgorCQkqIHByb2JlIHJlc3BvbnNlIHRlbXBsYXRlIHNob3VsZCBub3QgaGF2ZSBQMlAgSUUuCisJCSogSW4gY2FzZSBwcm9iZSByZXF1ZXN0IGhhcyBQMlAgSUUgb3IgV1BTIElFLCB0aGUKKwkJKiBwcm9iZSByZXF1ZXN0IHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBIb3N0IGFuZAorCQkqIEhvc3Qgd2lsbCBzZW5kIHRoZSBwcm9iZSByZXNwb25zZS4gSW4gb3RoZXIgY2FzZXMKKwkJKiBGVyB3aWxsIHNlbmQgdGhlIHByb2JlIHJlc3BvbnNlLiBTbywgaWYgdGhlIHRlbXBsYXRlCisJCSogaGFzIFAyUCBJRSwgdGhlIHByb2JlIHJlc3BvbnNlIHNlbnQgdG8gbm9uIFAyUCBkZXZpY2VzCisJCSogYnkgdGhlIEZXLCBtYXkgYWxzbyBoYXZlIFAyUCBJRSB3aGljaCB3aWxsIGZhaWwKKwkJKiBQMlAgY2VydCBjYXNlIDYuMS4zCisJCSovCisJCWFkZEllV29QMnBJZSA9IGNkZl9tZW1fbWFsbG9jKHBzZXNzaW9uRW50cnktPmFkZEllUGFyYW1zLgorCQkJCQkJcHJvYmVSZXNwRGF0YUxlbik7CisJCWlmIChOVUxMID09IGFkZEllV29QMnBJZSkgeworCQkJc2NoX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJGQUlMRUQgdG8gYWxsb2MgbWVtb3J5IHdoZW4gcmVtb3ZpbmcgUDJQIElFIikpOworCQkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwkJfQorCisJCXJldFN0YXR1cyA9IGxpbV9yZW1vdmVfcDJwX2llX2Zyb21fYWRkX2llKHBNYWMsIHBzZXNzaW9uRW50cnksCisJCQkJCWFkZEllV29QMnBJZSwgJmFkZG5JRUxlbldvUDJwSWUpOworCQlpZiAocmV0U3RhdHVzICE9IGVTSVJfU1VDQ0VTUykgeworCQkJY2RmX21lbV9mcmVlKGFkZEllV29QMnBJZSk7CisJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQl9CisKKwkJLyogUHJvYmUgcnNwIElFIGF2YWlsYWJsZSAqLworCQkvKm5lZWQgdG8gY2hlY2sgdGhlIGRhdGEgbGVuZ3RoICovCisJCWFkZElFID0KKwkJCWNkZl9tZW1fbWFsbG9jKGFkZG5JRUxlbldvUDJwSWUpOworCQlpZiAoTlVMTCA9PSBhZGRJRSkgeworCQkJc2NoX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiVW5hYmxlIHRvIGdldCBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTEgbGVuZ3RoIikpOworCQkJY2RmX21lbV9mcmVlKGFkZEllV29QMnBJZSk7CisJCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCQl9CisJCWFkZG5JRUxlbiA9IGFkZG5JRUxlbldvUDJwSWU7CisKKwkJaWYgKGFkZG5JRUxlbiA8PSBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTFfTEVOICYmIGFkZG5JRUxlbgorCQkgICAgJiYgKG5CeXRlcyArIGFkZG5JRUxlbikgPD0gU0lSX01BWF9QQUNLRVRfU0laRSkgeworCisJCQljZGZfbWVtX2NvcHkoYWRkSUUsCisJCQkJICAgICBhZGRJZVdvUDJwSWUsCisJCQkJICAgICBhZGRuSUVMZW5Xb1AycEllKTsKKwkJfQorCQljZGZfbWVtX2ZyZWUoYWRkSWVXb1AycEllKTsKKwl9CisKKwlpZiAoYWRkbklFUHJlc2VudCkgeworCQlpZiAoKG5CeXRlcyArIGFkZG5JRUxlbikgPD0gU0lSX01BWF9QQUNLRVRfU0laRSkKKwkJCW5CeXRlcyArPSBhZGRuSUVMZW47CisJCWVsc2UKKwkJCWFkZG5JRVByZXNlbnQgPSBmYWxzZTsgIC8qIERvbnQgaW5jbHVkZSB0aGUgSUUuICovCisJfQorCS8qIFBhcmFub2lhOiAqLworCWNkZl9tZW1fc2V0KHBGcmFtZTJIYWwsIG5CeXRlcywgMCk7CisKKwkvKiBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6ICovCisJbGltX3BvcHVsYXRlX21hY19oZWFkZXIocE1hYywgcEZyYW1lMkhhbCwgU0lSX01BQ19NR01UX0ZSQU1FLAorCQkJCQkgICAgIFNJUl9NQUNfTUdNVF9QUk9CRV9SU1AsCisJCQkJCSAgICAgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsCisJCQkJCSAgICAgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworCisJcE1hY0hkciA9ICh0cFNpck1hY01nbXRIZHIpIHBGcmFtZTJIYWw7CisKKwlzaXJfY29weV9tYWNfYWRkcihwTWFjSGRyLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisJLyogVGhhdCBkb25lLCBwYWNrIHRoZSBQcm9iZSBSZXNwb25zZTogKi8KKwluU3RhdHVzID0KKwkJZG90MTFmX3BhY2tfcHJvYmVfcmVzcG9uc2UocE1hYywgJnBzZXNzaW9uRW50cnktPnByb2JlUmVzcEZyYW1lLAorCQkJCQkgICBwRnJhbWUySGFsICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKwkJCQkJICAgblBheWxvYWQsICZuUGF5bG9hZCk7CisKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlzY2hfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhY2sgYSBQcm9iZSBSZXNwb25zZSAoMHglMDh4KS4iKSwKKwkJCW5TdGF0dXMpOworCisJCWNkZl9tZW1fZnJlZShhZGRJRSk7CisJCXJldHVybiByZXRDb2RlOyAvKiBhbGxvY2F0ZWQhICovCisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCXNjaF9sb2cocE1hYywgTE9HRSwgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIFAiCisJCQkJICAgICAgICJyb2JlIFJlc3BvbnNlICgweCUwOHgpLiIpLCBuU3RhdHVzKTsKKwl9CisKKwlpZiAoYWRkbklFUHJlc2VudCkgeworCQljZGZfbWVtX2NvcHkoJnBGcmFtZTJIYWxbbkJ5dGVzIC0gYWRkbklFTGVuXSwKKwkJCSAgICAgJmFkZElFWzBdLCBhZGRuSUVMZW4pOworCX0KKworCS8qIGZyZWUgdGhlIGFsbG9jYXRlZCBNZW1vcnkgKi8KKwljZGZfbWVtX2ZyZWUoYWRkSUUpOworCisJcHByb2JlUmVzcFBhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2VuZFByb2JlUmVzcFBhcmFtcykpOworCWlmIChOVUxMID09IHBwcm9iZVJlc3BQYXJhbXMpIHsKKwkJc2NoX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoImxpbV9zZW5kX3Byb2JlX3JzcF90ZW1wbGF0ZV90b19oYWw6IEhBTCBwcm9iZSByZXNwb25zZSBwYXJhbXMgbWFsbG9jIGZhaWxlZCBmb3IgYnl0ZXMgJWQiKSwKKwkJCW5CeXRlcyk7CisJfSBlbHNlIHsKKwkJc2lyX2NvcHlfbWFjX2FkZHIocHByb2JlUmVzcFBhcmFtcy0+YnNzSWQsIHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKwkJcHByb2JlUmVzcFBhcmFtcy0+cFByb2JlUmVzcFRlbXBsYXRlID0gcEZyYW1lMkhhbDsKKwkJcHByb2JlUmVzcFBhcmFtcy0+cHJvYmVSZXNwVGVtcGxhdGVMZW4gPSBuQnl0ZXM7CisJCWNkZl9tZW1fY29weShwcHJvYmVSZXNwUGFyYW1zLT51Y1Byb3h5UHJvYmVSZXFWYWxpZElFQm1hcCwKKwkJCSAgICAgSWVCaXRtYXAsIChzaXplb2YodWludDMyX3QpICogOCkpOworCQltc2dRLnR5cGUgPSBXTUFfU0VORF9QUk9CRV9SU1BfVE1QTDsKKwkJbXNnUS5yZXNlcnZlZCA9IDA7CisJCW1zZ1EuYm9keXB0ciA9IHBwcm9iZVJlc3BQYXJhbXM7CisJCW1zZ1EuYm9keXZhbCA9IDA7CisKKwkJaWYgKGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2dRKSkpIHsKKwkJCS8qIGZyZWUgdGhlIGFsbG9jYXRlZCBNZW1vcnkgKi8KKwkJCXNjaF9sb2cocE1hYywgTE9HRSwKKwkJCQlGTAorCQkJCQkoImxpbV9zZW5kX3Byb2JlX3JzcF90ZW1wbGF0ZV90b19oYWw6IEZBSUwgYnl0ZXMgJWQgcmV0Y29kZVslWF0iKSwKKwkJCQluQnl0ZXMsIHJldENvZGUpOworCQkJY2RmX21lbV9mcmVlKHBwcm9iZVJlc3BQYXJhbXMpOworCQl9IGVsc2UgeworCQkJc2NoX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMCisJCQkJCSgibGltX3NlbmRfcHJvYmVfcnNwX3RlbXBsYXRlX3RvX2hhbDogUHJvYmUgcmVzcG9uc2UgdGVtcGxhdGUgbXNnIHBvc3RlZCB0byBIQUwgb2YgYnl0ZXMgJWQiKSwKKwkJCQluQnl0ZXMpOworCQl9CisJfQorCisJcmV0dXJuIHJldENvZGU7Cit9CisKKy8qKgorICogc2NoX2dlbl90aW1pbmdfYWR2ZXJ0X2ZyYW1lKCkgLSBHZW5lcmF0ZSB0aGUgVEEgZnJhbWUgYW5kIHBvcHVsYXRlIHRoZSBidWZmZXIKKyAqIEBwTWFjOiB0aGUgZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAc2VsZl9hZGRyOiB0aGUgc2VsZiBNQUMgYWRkcmVzcworICogQGJ1ZjogdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgZnJhbWUKKyAqIEB0aW1lc3RhbXBfb2Zmc2V0OiByZXR1cm4gZm9yIHRoZSBvZmZzZXQgb2YgdGhlIHRpbWVzdGFtcCBmaWVsZAorICogQHRpbWVfdmFsdWVfb2Zmc2V0OiByZXR1cm4gZm9yIHRoZSB0aW1lX3ZhbHVlIGZpZWxkIGluIHRoZSBUQSBJRQorICoKKyAqIFJldHVybjogdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLgorICovCitpbnQgc2NoX2dlbl90aW1pbmdfYWR2ZXJ0X2ZyYW1lKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRTaXJNYWNBZGRyIHNlbGZfYWRkciwKKwl1aW50OF90ICoqYnVmLCB1aW50MzJfdCAqdGltZXN0YW1wX29mZnNldCwgdWludDMyX3QgKnRpbWVfdmFsdWVfb2Zmc2V0KQoreworCXREb3QxMWZUaW1pbmdBZHZlcnRpc2VtZW50RnJhbWUgZnJhbWU7CisJdWludDMyX3QgcGF5bG9hZF9zaXplLCBidWZfc2l6ZTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgd2lsZGNhcmRfYnNzaWQgPSB7CisJCXsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfSwKKwl9OworCisJY2RmX21lbV96ZXJvKCh1aW50OF90ICopJmZyYW1lLCBzaXplb2YodERvdDExZlRpbWluZ0FkdmVydGlzZW1lbnRGcmFtZSkpOworCisJLyogUG9wdWxhdGUgdGhlIFRBIGZpZWxkcyAqLworCXN0YXR1cyA9IHBvcHVsYXRlX2RvdDExZl90aW1pbmdfYWR2ZXJ0X2ZyYW1lKG1hY19jdHgsICZmcmFtZSk7CisJaWYgKHN0YXR1cykgeworCQlzY2hfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJFcnJvciBwb3B1bGF0aW5nIFRBIGZyYW1lICV4IiksCisJCQlzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX3RpbWluZ19hZHZlcnRpc2VtZW50X2ZyYW1lX3NpemUobWFjX2N0eCwKKwkJJmZyYW1lLCAmcGF5bG9hZF9zaXplKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCXNjaF9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkVycm9yIGdldHRpbmcgcGFja2VkIGZyYW1lIHNpemUgJXgiKSwKKwkJCXN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJc2NoX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiV2FybmluZyBnZXR0aW5nIHBhY2tlZCBmcmFtZSBzaXplIikpOworCX0KKworCWJ1Zl9zaXplID0gc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArIHBheWxvYWRfc2l6ZTsKKwkqYnVmID0gY2RmX21lbV9tYWxsb2MoYnVmX3NpemUpOworCWlmICgqYnVmID09IE5VTEwpIHsKKwkJc2NoX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJY2RmX21lbV96ZXJvKCpidWYsIGJ1Zl9zaXplKTsKKworCXBheWxvYWRfc2l6ZSA9IDA7CisJc3RhdHVzID0gZG90MTFmX3BhY2tfdGltaW5nX2FkdmVydGlzZW1lbnRfZnJhbWUobWFjX2N0eCwgJmZyYW1lLAorCQkqYnVmICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwgYnVmX3NpemUgLQorCQlzaXplb2YodFNpck1hY01nbXRIZHIpLCAmcGF5bG9hZF9zaXplKTsKKwlzY2hfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJUQSBwYXlsb2FkIHNpemUyID0gJWQiKSwgcGF5bG9hZF9zaXplKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCXNjaF9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkVycm9yIHBhY2tpbmcgZnJhbWUgJXgiKSwgc3RhdHVzKTsKKwkJZ290byBmYWlsOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCXNjaF9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIldhcm5pbmcgcGFja2luZyBmcmFtZSIpKTsKKwl9CisKKwlsaW1fcG9wdWxhdGVfbWFjX2hlYWRlcihtYWNfY3R4LCAqYnVmLCBTSVJfTUFDX01HTVRfRlJBTUUsCisJCVNJUl9NQUNfTUdNVF9USU1FX0FEVkVSVCwgd2lsZGNhcmRfYnNzaWQuYnl0ZXMsIHNlbGZfYWRkcik7CisKKwkvKiBUaGUgdGltZXN0YW1wIGZpZWxkIGlzIHJpZ2h0IGFmdGVyIHRoZSBoZWFkZXIgKi8KKwkqdGltZXN0YW1wX29mZnNldCA9IHNpemVvZih0U2lyTWFjTWdtdEhkcik7CisKKwkqdGltZV92YWx1ZV9vZmZzZXQgPSBzaXplb2YodFNpck1hY01nbXRIZHIpICsKKwkJc2l6ZW9mKHREb3QxMWZGZlRpbWVTdGFtcCkgKyBzaXplb2YodERvdDExZkZmQ2FwYWJpbGl0aWVzKTsKKworCS8qIEFkZCB0aGUgQ291bnRyeSBJRSBsZW5ndGggKi8KKwlkb3QxMWZfZ2V0X3BhY2tlZF9pZV9jb3VudHJ5KG1hY19jdHgsICZmcmFtZS5Db3VudHJ5LAorCQl0aW1lX3ZhbHVlX29mZnNldCk7CisJLyogQWRkIDIgZm9yIENvdW50cnkgSUUgRUlEIGFuZCBMZW5ndGggZmllbGRzICovCisJKnRpbWVfdmFsdWVfb2Zmc2V0ICs9IDI7CisKKwkvKiBBZGQgdGhlIFBvd2VyQ29uc3RyYWludCBJRSBzaXplICovCisJaWYgKGZyYW1lLkNvdW50cnkucHJlc2VudCA9PSAxKQorCQkqdGltZV92YWx1ZV9vZmZzZXQgKz0gMzsKKworCS8qIEFkZCB0aGUgb2Zmc2V0IGluc2lkZSBUQSBJRSAqLworCSp0aW1lX3ZhbHVlX29mZnNldCArPSAzOworCisJcmV0dXJuIHBheWxvYWRfc2l6ZSArIHNpemVvZih0U2lyTWFjTWdtdEhkcik7CisKK2ZhaWw6CisJaWYgKCpidWYpCisJCWNkZl9tZW1fZnJlZSgqYnVmKTsKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL3NjaC9zY2hfYmVhY29uX2dlbi5jIGIvY29yZS9tYWMvc3JjL3BlL3NjaC9zY2hfYmVhY29uX2dlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NWIzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvc2NoL3NjaF9iZWFjb25fZ2VuLmMKQEAgLTAsMCArMSw5MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgc2NoX2JlYWNvbl9nZW4uY2MgY29udGFpbnMgYmVhY29uIGdlbmVyYXRpb24gcmVsYXRlZAorICogZnVuY3Rpb25zCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJzaXJfbWFjX3Byb3RfZGVmLmgiCisKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fYXBpLmgiCisKKyNpbmNsdWRlICJ3bWFfaWYuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAic2NoX2FwaS5oIgorCisjaW5jbHVkZSAicGFyc2VyX2FwaS5oIgorCisjaW5jbHVkZSAic2NoX2RlYnVnLmgiCisKKy8qICovCisvKiBNYXJjaCAxNSwgMjAwNiAqLworLyogVGVtcG9yYXJpbHkgKG1heWJlIGZvciBhbGwgb2YgQWxwaGEtMSksIGFzc3VtaW5nIFRJTSA9IDAgKi8KKy8qICovCisKK2NvbnN0IHVpbnQ4X3QgcDJwX291aVtdID0geyAweDUwLCAweDZGLCAweDlBLCAweDkgfTsKKwordFNpclJldFN0YXR1cyBzY2hfZ2V0X3AycF9pZV9vZmZzZXQodWludDhfdCAqcEV4dHJhSWUsIHVpbnQzMl90IGV4dHJhSWVMZW4sCisJCQkJICAgIHVpbnQxNl90ICpwUDJwSWVPZmZzZXQpCit7CisJdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisJKnBQMnBJZU9mZnNldCA9IDA7CisKKwkvKiBFeHRyYSBJRSBpcyBub3QgcHJlc2VudCAqLworCWlmICgwID09IGV4dHJhSWVMZW4pIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJLyogQ2FsY3VsYXRlIHRoZSBQMlAgSUUgT2Zmc2V0ICovCisJZG8geworCQlpZiAoKnBFeHRyYUllID09IDB4REQpIHsKKwkJCWlmIChjZGZfbWVtX2NvbXBhcmUKKwkJCQkgICAgKCh2b2lkICopKHBFeHRyYUllICsgMiksICZwMnBfb3VpLCBzaXplb2YocDJwX291aSkpKSB7CisJCQkJc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJKCpwUDJwSWVPZmZzZXQpKys7CisJCXBFeHRyYUllKys7CisJfSB3aGlsZSAoLS1leHRyYUllTGVuID4gMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNjaF9hcHBlbmRfYWRkbl9pZSgpIC0gYWRkcyBhZGRpdGlvbmFsIElFcyB0byBmcmFtZQorICogQG1hY19jdHg6ICAgICAgIG1hYyBnbG9iYWwgY29udGV4dAorICogQHNlc3Npb246ICAgICAgIHBlIHNlc3Npb24gcG9pbnRlcgorICogQGZybTogICAgICAgICAgIGZyYW1lIHdoZXJlIGFkZGl0aW9uYWwgSUUgaXMgdG8gYmUgYWRkZWQKKyAqIEBtYXhfYmNuX3NpemU6ICBtYXggYmVhY29uIHNpemUKKyAqIEBudW1fYnl0ZXM6ICAgICBmaW5hbCBzaXplCisgKgorICogUmV0dXJuOiBzdGF0dXMgb2Ygb3BlcmF0aW9uCisgKi8KK3RTaXJSZXRTdGF0dXMKK3NjaF9hcHBlbmRfYWRkbl9pZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0cFBFU2Vzc2lvbiBzZXNzaW9uLAorCQkgICB1aW50OF90ICpmcm0sIHVpbnQzMl90IG1heF9iY25fc2l6ZSwgdWludDMyX3QgKm51bV9ieXRlcykKK3sKKwl0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKwl1aW50MzJfdCBwcmVzZW50LCBsZW47CisJdWludDhfdCBhZGRfaWVbV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBX0xFTl07CisJdWludDhfdCAqcDJwX2llID0gTlVMTDsKKwl1aW50OF90IG5vYV9sZW4gPSAwOworCXVpbnQ4X3Qgbm9hX3N0cm1bU0lSX01BWF9OT0FfQVRUUl9MRU4gKyBTSVJfUDJQX0lFX0hFQURFUl9MRU5dOworCisJcHJlc2VudCA9IChzZXNzaW9uLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BCQ05EYXRhTGVuICE9IDApOworCWlmICghcHJlc2VudCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWxlbiA9IHNlc3Npb24tPmFkZEllUGFyYW1zLnByb2JlUmVzcEJDTkRhdGFMZW47CisJaWYgKCEobGVuIDw9IFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfREFUQV9MRU4gJiYgbGVuICYmCisJICAgICgobGVuICsgKm51bV9ieXRlcykgPD0gbWF4X2Jjbl9zaXplKSkpCisJCXJldHVybiBzdGF0dXM7CisKKwljZGZfbWVtX2NvcHkoJmFkZF9pZVswXSwgc2Vzc2lvbi0+YWRkSWVQYXJhbXMucHJvYmVSZXNwQkNORGF0YV9idWZmLAorCQkgICAgIGxlbik7CisKKwlwMnBfaWUgPSBsaW1HZXRQMnBJRVB0cihtYWNfY3R4LCAmYWRkX2llWzBdLCBsZW4pOworCWlmICgocDJwX2llICE9IE5VTEwpICYmICFtYWNfY3R4LT5iZWFjb25fb2ZmbG9hZCkgeworCQkvKiBnZXQgTm9BIGF0dHJpYnV0ZSBzdHJlYW0gUDJQIElFICovCisJCW5vYV9sZW4gPSBsaW1fZ2V0X25vYV9hdHRyX3N0cmVhbShtYWNfY3R4LCBub2Ffc3RybSwgc2Vzc2lvbik7CisJCWlmIChub2FfbGVuKSB7CisJCQlpZiAoKG5vYV9sZW4gKyBsZW4pIDw9CisJCQkgICAgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBX0xFTikgeworCQkJCWNkZl9tZW1fY29weSgmYWRkX2llW2xlbl0sIG5vYV9zdHJtLCBub2FfbGVuKTsKKwkJCQlsZW4gKz0gbm9hX2xlbjsKKwkJCQlwMnBfaWVbMV0gKz0gbm9hX2xlbjsKKwkJCX0gZWxzZSB7CisJCQkJc2NoX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiTm90IGFibGUgdG8gaW5zZXJ0IE5vQSBiZWNhdXNlIG9mIGxlbmd0aCBjb25zdHJhaW50IikpOworCQkJfQorCQl9CisJfQorCWlmIChsZW4gPD0gV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBX0xFTikgeworCQljZGZfbWVtX2NvcHkoZnJtLCAmYWRkX2llWzBdLCBsZW4pOworCQkqbnVtX2J5dGVzID0gKm51bV9ieXRlcyArIGxlbjsKKwl9IGVsc2UgeworCQlzY2hfbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiTm90IGFibGUgdG8gaW5zZXJ0IGJlY2F1c2Ugb2YgbGVuIGNvbnN0cmFpbnQgJWQiKSwKKwkJCWxlbik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc2NoX3NldF9maXhlZF9iZWFjb25fZmllbGRzKCkgLSBzZXRzIHRoZSBmaXhlZCBwYXJhbXMgaW4gYmVhY29uIGZyYW1lCisgKiBAbWFjX2N0eDogICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAc2Vzc2lvbjogICAgICAgcGUgc2Vzc2lvbiBlbnRyeQorICogQGJhbmQ6ICAgICAgICAgIG91dCBwYXJhbSwgYmFuZCBjYWNsY3VsYXRlZAorICogQG9wcl9jaDogICAgICAgIG9wZXJhdGluZyBjaGFubmVscworICoKKyAqIFJldHVybjogc3RhdHVzIG9mIG9wZXJhdGlvbgorICovCisKK3RTaXJSZXRTdGF0dXMKK3NjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXRwQW5pQmVhY29uU3RydWN0IGJjbl9zdHJ1Y3QgPSAodHBBbmlCZWFjb25TdHJ1Y3QpCisJCQkJCQlzZXNzaW9uLT5wU2NoQmVhY29uRnJhbWVCZWdpbjsKKwl0cFNpck1hY01nbXRIZHIgbWFjOworCXVpbnQxNl90IG9mZnNldDsKKwl1aW50OF90ICpwdHI7CisJdERvdDExZkJlYWNvbjEgKmJjbl8xOworCXREb3QxMWZCZWFjb24yICpiY25fMjsKKwl1aW50MzJfdCBpLCBuX3N0YXR1cywgbl9ieXRlczsKKwl1aW50MzJfdCB3cHNfYXBfZW5hYmxlID0gMCwgdG1wOworCXREb3QxMWZJRVdzY1Byb2JlUmVzICp3c2NfcHJiX3JlczsKKwl1aW50OF90ICpleHRyYV9pZSA9IE5VTEw7CisJdWludDMyX3QgZXh0cmFfaWVfbGVuID0gMDsKKwl1aW50MTZfdCBleHRyYV9pZV9vZmZzZXQgPSAwOworCXVpbnQxNl90IHAycF9pZV9vZmZzZXQgPSAwOworCXRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCWJvb2wgaXNfdmh0X2VuYWJsZWQgPSBmYWxzZTsKKworCWJjbl8xID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHREb3QxMWZCZWFjb24xKSk7CisJaWYgKE5VTEwgPT0gYmNuXzEpIHsKKwkJc2NoX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisKKwliY25fMiA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0RG90MTFmQmVhY29uMikpOworCWlmIChOVUxMID09IGJjbl8yKSB7CisJCXNjaF9sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkiKSk7CisJCWNkZl9tZW1fZnJlZShiY25fMSk7CisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJfQorCisJd3NjX3ByYl9yZXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodERvdDExZklFV3NjUHJvYmVSZXMpKTsKKwlpZiAoTlVMTCA9PSB3c2NfcHJiX3JlcykgeworCQlzY2hfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworCQljZGZfbWVtX2ZyZWUoYmNuXzEpOworCQljZGZfbWVtX2ZyZWUoYmNuXzIpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCXNjaF9sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlNldHRpbmcgZml4ZWQgYmVhY29uIGZpZWxkcyIpKTsKKworCS8qCisJICogRmlyc3Qgc2V0IHRoZSBmaXhlZCBmaWVsZHM6CisJICogc2V0IHRoZSBURlAgaGVhZGVycywgc2V0IHRoZSBtYWMgaGVhZGVyCisJICovCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJmJjbl9zdHJ1Y3QtPm1hY0hkciwgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwgMCk7CisJbWFjID0gKHRwU2lyTWFjTWdtdEhkcikgJmJjbl9zdHJ1Y3QtPm1hY0hkcjsKKwltYWMtPmZjLnR5cGUgPSBTSVJfTUFDX01HTVRfRlJBTUU7CisJbWFjLT5mYy5zdWJUeXBlID0gU0lSX01BQ19NR01UX0JFQUNPTjsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCW1hYy0+ZGFbaV0gPSAweGZmOworCisJY2RmX21lbV9jb3B5KG1hYy0+c2EsIHNlc3Npb24tPnNlbGZNYWNBZGRyLAorCQkgICAgIHNpemVvZihzZXNzaW9uLT5zZWxmTWFjQWRkcikpOworCWNkZl9tZW1fY29weShtYWMtPmJzc0lkLCBzZXNzaW9uLT5ic3NJZCwgc2l6ZW9mKHNlc3Npb24tPmJzc0lkKSk7CisKKwltYWMtPmZjLmZyb21EUyA9IDA7CisJbWFjLT5mYy50b0RTID0gMDsKKworCS8qIE5vdyBzZXQgdGhlIGJlYWNvbiBib2R5ICovCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgYmNuXzEsIHNpemVvZih0RG90MTFmQmVhY29uMSksIDApOworCisJLyogU2tpcCBvdmVyIHRoZSB0aW1lc3RhbXAgKGl0J2xsIGJlIHVwZGF0ZWQgbGF0ZXIpLiAqLworCWJjbl8xLT5CZWFjb25JbnRlcnZhbC5pbnRlcnZhbCA9CisJCW1hY19jdHgtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbkludGVydmFsOworCXBvcHVsYXRlX2RvdDExZl9jYXBhYmlsaXRpZXMobWFjX2N0eCwgJmJjbl8xLT5DYXBhYmlsaXRpZXMsIHNlc3Npb24pOworCWlmIChzZXNzaW9uLT5zc2lkSGlkZGVuKSB7CisJCWJjbl8xLT5TU0lELnByZXNlbnQgPSAxOworCQkvKiByZXN0IG9mIHRoZSBmaWxlZHMgYXJlIDAgZm9yIGhpZGRlbiBzc2lkICovCisJCWlmICgoc2Vzc2lvbi0+c3NJZC5sZW5ndGgpICYmCisJCSAgICAoc2Vzc2lvbi0+c3NpZEhpZGRlbiA9PSBlSElEREVOX1NTSURfWkVST19DT05URU5UUykpCisJCQliY25fMS0+U1NJRC5udW1fc3NpZCA9IHNlc3Npb24tPnNzSWQubGVuZ3RoOworCX0gZWxzZSB7CisJCXBvcHVsYXRlX2RvdDExZl9zc2lkKG1hY19jdHgsICZzZXNzaW9uLT5zc0lkLCAmYmNuXzEtPlNTSUQpOworCX0KKworCXBvcHVsYXRlX2RvdDExZl9zdXBwX3JhdGVzKG1hY19jdHgsIFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwKKwkJCQkgICAmYmNuXzEtPlN1cHBSYXRlcywgc2Vzc2lvbik7CisJcG9wdWxhdGVfZG90MTFmX2RzX3BhcmFtcyhtYWNfY3R4LCAmYmNuXzEtPkRTUGFyYW1zLAorCQkJCSAgc2Vzc2lvbi0+Y3VycmVudE9wZXJDaGFubmVsKTsKKwlwb3B1bGF0ZV9kb3QxMWZfaWJzc19wYXJhbXMobWFjX2N0eCwgJmJjbl8xLT5JQlNTUGFyYW1zLCBzZXNzaW9uKTsKKworCW9mZnNldCA9IHNpemVvZih0QW5pQmVhY29uU3RydWN0KTsKKwlwdHIgPSBzZXNzaW9uLT5wU2NoQmVhY29uRnJhbWVCZWdpbiArIG9mZnNldDsKKworCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uKSkgeworCQkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IElFIGJpdG1hcCB0byB6ZXJvICovCisJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICYoc2Vzc2lvbi0+RGVmUHJvYmVSc3BJZUJpdG1hcCksCisJCQkgICAgKHNpemVvZih1aW50MzJfdCkgKiA4KSwgMCk7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBJRSBiaXRtYXAgdG8gemVybyAqLworCQljZGZfbWVtX3NldCgodWludDhfdCAqKSAmKHNlc3Npb24tPnByb2JlUmVzcEZyYW1lKSwKKwkJCSAgICBzaXplb2Yoc2Vzc2lvbi0+cHJvYmVSZXNwRnJhbWUpLCAwKTsKKworCQkvKgorCQkgKiBDYW4gYmUgZWZmaWNpZW50bHkgdXBkYXRlZCB3aGVuZXZlciBuZXcgSUUgYWRkZWQgaW4gUHJvYmUKKwkJICogcmVzcG9uc2UgaW4gZnV0dXJlCisJCSAqLworCQlpZiAobGltX3VwZGF0ZV9wcm9iZV9yc3BfdGVtcGxhdGVfaWVfYml0bWFwX2JlYWNvbjEobWFjX2N0eCwKKwkJCQkJYmNuXzEsIHNlc3Npb24pICE9IGVTSVJfU1VDQ0VTUykKKwkJCXNjaF9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiRmFpbGVkIHRvIGJ1aWxkIFByb2JlUnNwIHRlbXBsYXRlIikpOworCX0KKworCW5fc3RhdHVzID0gZG90MTFmX3BhY2tfYmVhY29uMShtYWNfY3R4LCBiY25fMSwgcHRyLAorCQkJCSAgICAgIFNDSF9NQVhfQkVBQ09OX1NJWkUgLSBvZmZzZXQsICZuX2J5dGVzKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChuX3N0YXR1cykpIHsKKwkJc2NoX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBwYWNrZWQgYSB0RG90MTFmQmVhY29uMSAoMHglMDh4LikuIiksCisJCQluX3N0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShiY25fMSk7CisJCWNkZl9tZW1fZnJlZShiY25fMik7CisJCWNkZl9tZW1fZnJlZSh3c2NfcHJiX3Jlcyk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5fc3RhdHVzKSkgeworCQlzY2hfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiV2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIHREb3QxMWZCZWFjb24xKDB4JTA4eC4pLiIpLAorCQkJbl9zdGF0dXMpOworCX0KKwkvKmNoYW5nZWQgIHRvIGNvcnJlY3QgYmVhY29uIGNvcnJ1cHRpb24gKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBiY25fMiwgc2l6ZW9mKHREb3QxMWZCZWFjb24yKSwgMCk7CisJc2Vzc2lvbi0+c2NoQmVhY29uT2Zmc2V0QmVnaW4gPSBvZmZzZXQgKyAodWludDE2X3QpIG5fYnl0ZXM7CisJc2NoX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiSW5pdGlhbGl6ZWQgYmVhY29uIGJlZ2luLCBvZmZzZXQgJWQiKSwKKwkJb2Zmc2V0KTsKKworCS8qIEluaXRpYWxpemUgdGhlICduZXcnIGZpZWxkcyBhdCB0aGUgZW5kIG9mIHRoZSBiZWFjb24gKi8KKworCWlmICgoc2Vzc2lvbi0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpICYmCisJCXNlc3Npb24tPmRmc0luY2x1ZGVDaGFuU3dJZSA9PSB0cnVlKQorCQlwb3B1bGF0ZV9kb3RfMTFfZl9leHRfY2hhbm5fc3dpdGNoX2FubihtYWNfY3R4LAorCQkJCSZiY25fMi0+ZXh0X2NoYW5fc3dpdGNoX2FubiwKKwkJCQlzZXNzaW9uKTsKKworCXBvcHVsYXRlX2RvdDExZl9jb3VudHJ5KG1hY19jdHgsICZiY25fMi0+Q291bnRyeSwgc2Vzc2lvbik7CisJaWYgKGJjbl8xLT5DYXBhYmlsaXRpZXMucW9zKQorCQlwb3B1bGF0ZV9kb3QxMWZfZWRjYV9wYXJhbV9zZXQobWFjX2N0eCwgJmJjbl8yLT5FRENBUGFyYW1TZXQsCisJCQkJCSAgICAgICBzZXNzaW9uKTsKKworCWlmIChzZXNzaW9uLT5saW0xMWhFbmFibGUpIHsKKwkJcG9wdWxhdGVfZG90MTFmX3Bvd2VyX2NvbnN0cmFpbnRzKG1hY19jdHgsCisJCQkJCQkgICZiY25fMi0+UG93ZXJDb25zdHJhaW50cyk7CisJCXBvcHVsYXRlX2RvdDExZl90cGNfcmVwb3J0KG1hY19jdHgsICZiY25fMi0+VFBDUmVwb3J0LCBzZXNzaW9uKTsKKwkJLyogTmVlZCB0byBpbnNlcnQgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGhlcmUgKi8KKwkJaWYgKChMSU1fSVNfQVBfUk9MRShzZXNzaW9uKQorCQkgICAgfHwgTElNX0lTX1AyUF9ERVZJQ0VfR08oc2Vzc2lvbikpCisJCQkmJiBzZXNzaW9uLT5kZnNJbmNsdWRlQ2hhblN3SWUgPT0gdHJ1ZSkgeworCQkJLyoKKwkJCSAqIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBvbmx5IGlmIHJhZGFyIGlzIGRldGVjdGVkCisJCQkgKiBhbmQgU0FQIGhhcyBpbnN0cnVjdGVkIHRvIGFubm91bmNlIGNoYW5uZWwgc3dpdGNoIElFcworCQkJICogaW4gYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZXMKKwkJCSAqLworCQkJcG9wdWxhdGVfZG90MTFmX2NoYW5fc3dpdGNoX2FubihtYWNfY3R4LAorCQkJCQkJJmJjbl8yLT5DaGFuU3dpdGNoQW5uLCBzZXNzaW9uKTsKKworCQkJLyoKKwkJCSAqIFRPRE86IGRlcGVuZGluZyB0aGUgQ0IgbW9kZSwgZXh0ZW5kZWQgY2hhbm5lbCBzd2l0Y2gKKwkJCSAqIGFubm91bmNlbWVudCBuZWVkIHRvIGJlIGNhbGxlZAorCQkJICovCisJCQkvKgorCQkJcG9wdWxhdGVfZG90MTFmX2V4dF9jaGFuX3N3aXRjaF9hbm4obWFjX2N0eCwKKwkJCQkJJmJjbl8yLT5FeHRDaGFuU3dpdGNoQW5uLCBzZXNzaW9uKTsKKwkJCSovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJCS8qCisJCQkgKiBUT0RPOiBJZiBpbiAxMUFDIG1vZGUsIHdpZGVyIGJ3IGNoYW5uZWwgc3dpdGNoCisJCQkgKiBhbm5vdW5jZW1lbnQgbmVlZHMgdG8gYmUgY2FsbGVkCisJCQkgKi8KKwkJCS8qCisJCQlwb3B1bGF0ZV9kb3QxMWZfd2lkZXJfYndfY2hhbl9zd2l0Y2hfYW5uKG1hY19jdHgsCisJCQkJCSZiY25fMi0+V2lkZXJCV0NoYW5Td2l0Y2hBbm4sIHNlc3Npb24pOworCQkJKi8KKyNlbmRpZgorCQkJLyoKKwkJCSAqIFBvcHVsYXRlIHRoZSBDaGFubmVsIFN3aXRjaCBXcmFwcGVyIEVsZW1lbnQgaWYKKwkJCSAqIFNBUCBvcGVyYXRlcyBpbiA0MC84MCBNaHogQ2hhbm5lbCBXaWR0aC4KKwkJCSAqLworCQkJaWYgKHRydWUgPT0gc2Vzc2lvbi0+ZGZzSW5jbHVkZUNoYW5XcmFwcGVySWUpCisJCQkJcG9wdWxhdGVfZG90MTFmX2NoYW5fc3dpdGNoX3dyYXBwZXIobWFjX2N0eCwKKwkJCQkJJmJjbl8yLT5DaGFubmVsU3dpdGNoV3JhcHBlciwgc2Vzc2lvbik7CisJCX0KKwl9CisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKwkvKiBwb3B1bGF0ZSBwcm9wcmlldGFyeSBJRSBmb3IgTURNIGRldmljZSBvcGVyYXRpbmcgaW4gQVAtTUNDICovCisJcG9wdWxhdGVfZG90MTFmX2F2b2lkX2NoYW5uZWxfaWUobWFjX2N0eCwgJmJjbl8yLT5RQ29tVmVuZG9ySUUsCisJCQkJCSBzZXNzaW9uKTsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKworCWlmIChzZXNzaW9uLT5kb3QxMW1vZGUgIT0gV05JX0NGR19ET1QxMV9NT0RFXzExQikKKwkJcG9wdWxhdGVfZG90MTFmX2VycF9pbmZvKG1hY19jdHgsICZiY25fMi0+RVJQSW5mbywgc2Vzc2lvbik7CisKKwlpZiAoc2Vzc2lvbi0+aHRDYXBhYmlsaXR5KSB7CisJCXBvcHVsYXRlX2RvdDExZl9odF9jYXBzKG1hY19jdHgsIHNlc3Npb24sICZiY25fMi0+SFRDYXBzKTsKKwkJcG9wdWxhdGVfZG90MTFmX2h0X2luZm8obWFjX2N0eCwgJmJjbl8yLT5IVEluZm8sIHNlc3Npb24pOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmIChzZXNzaW9uLT52aHRDYXBhYmlsaXR5KSB7CisJCXNjaF9sb2cobWFjX2N0eCwgTE9HVywgRkwoIlBvcHVsYXRlIFZIVCBJRXMgaW4gQmVhY29uIikpOworCQlwb3B1bGF0ZV9kb3QxMWZfdmh0X2NhcHMobWFjX2N0eCwgc2Vzc2lvbiwgJmJjbl8yLT5WSFRDYXBzKTsKKwkJcG9wdWxhdGVfZG90MTFmX3ZodF9vcGVyYXRpb24obWFjX2N0eCwgc2Vzc2lvbiwKKwkJCQkJICAgICAgJmJjbl8yLT5WSFRPcGVyYXRpb24pOworCQlpc192aHRfZW5hYmxlZCA9IHRydWU7CisJCS8qIGZvbGxvd2luZyBpcyBmb3IgTVUgTUlNTzogd2UgZG8gbm90IHN1cHBvcnQgaXQgeWV0ICovCisJCS8qCisJCXBvcHVsYXRlX2RvdDExZl92aHRfZXh0X2Jzc19sb2FkKCBtYWNfY3R4LCAmYmNuMi5WSFRFeHRCc3NMb2FkKTsKKwkJKi8KKwkJaWYgKHNlc3Npb24tPmdMaW1PcGVyYXRpbmdNb2RlLnByZXNlbnQpCisJCQlwb3B1bGF0ZV9kb3QxMWZfb3BlcmF0aW5nX21vZGUobWFjX2N0eCwKKwkJCQkJCSZiY25fMi0+T3BlcmF0aW5nTW9kZSwgc2Vzc2lvbik7CisJfQorI2VuZGlmCisJcG9wdWxhdGVfZG90MTFmX2V4dF9jYXAobWFjX2N0eCwgaXNfdmh0X2VuYWJsZWQsICZiY25fMi0+RXh0Q2FwLAorCQkJCXNlc3Npb24pOworCXBvcHVsYXRlX2RvdDExZl9leHRfc3VwcF9yYXRlcyhtYWNfY3R4LAorCQkJCVBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwKKwkJCQkmYmNuXzItPkV4dFN1cHBSYXRlcywgc2Vzc2lvbik7CisKKwlpZiAoc2Vzc2lvbi0+cExpbVN0YXJ0QnNzUmVxICE9IE5VTEwpIHsKKwkJcG9wdWxhdGVfZG90MTFmX3dwYShtYWNfY3R4LCAmc2Vzc2lvbi0+cExpbVN0YXJ0QnNzUmVxLT5yc25JRSwKKwkJCQkgICAgJmJjbl8yLT5XUEEpOworCQlwb3B1bGF0ZV9kb3QxMWZfcnNuX29wYXF1ZShtYWNfY3R4LAorCQkJCQkgICAmc2Vzc2lvbi0+cExpbVN0YXJ0QnNzUmVxLT5yc25JRSwKKwkJCQkJICAgJmJjbl8yLT5SU05PcGFxdWUpOworCX0KKworCWlmIChzZXNzaW9uLT5saW1XbWVFbmFibGVkKQorCQlwb3B1bGF0ZV9kb3QxMWZfd21tKG1hY19jdHgsICZiY25fMi0+V01NSW5mb0FwLAorCQkJCSZiY25fMi0+V01NUGFyYW1zLCAmYmNuXzItPldNTUNhcHMsIHNlc3Npb24pOworCWlmIChMSU1fSVNfQVBfUk9MRShzZXNzaW9uKSkgeworCQlpZiAoc2Vzc2lvbi0+d3BzX3N0YXRlICE9IFNBUF9XUFNfRElTQUJMRUQpIHsKKwkJCXBvcHVsYXRlX2RvdDExZl9iZWFjb25fd3BzaV9lcyhtYWNfY3R4LAorCQkJCQkJJmJjbl8yLT5Xc2NCZWFjb24sIHNlc3Npb24pOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwKKwkJCSh1aW50MTZfdCkgV05JX0NGR19XUFNfRU5BQkxFLCAmdG1wKSAhPSBlU0lSX1NVQ0NFU1MpCisJCQlzY2hfbG9nKG1hY19jdHgsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2ZnIGdldCBpZCAlZCIpLAorCQkJCVdOSV9DRkdfV1BTX0VOQUJMRSk7CisKKwkJd3BzX2FwX2VuYWJsZSA9IHRtcCAmIFdOSV9DRkdfV1BTX0VOQUJMRV9BUDsKKworCQlpZiAod3BzX2FwX2VuYWJsZSkKKwkJCXBvcHVsYXRlX2RvdDExZl93c2MobWFjX2N0eCwgJmJjbl8yLT5Xc2NCZWFjb24pOworCisJCWlmIChtYWNfY3R4LT5saW0ud3NjSWVJbmZvLndzY0Vucm9sbG1lbnRTdGF0ZSA9PQorCQkJCQkJZUxJTV9XU0NfRU5ST0xMX0JFR0lOKSB7CisJCQlwb3B1bGF0ZV9kb3QxMWZfd3NjX3JlZ2lzdHJhcl9pbmZvKG1hY19jdHgsCisJCQkJCQkmYmNuXzItPldzY0JlYWNvbik7CisJCQltYWNfY3R4LT5saW0ud3NjSWVJbmZvLndzY0Vucm9sbG1lbnRTdGF0ZSA9CisJCQkJCQllTElNX1dTQ19FTlJPTExfSU5fUFJPR1JFU1M7CisJCX0KKworCQlpZiAobWFjX2N0eC0+bGltLndzY0llSW5mby53c2NFbnJvbGxtZW50U3RhdGUgPT0KKwkJCQkJCWVMSU1fV1NDX0VOUk9MTF9FTkQpIHsKKwkJCWRlX3BvcHVsYXRlX2RvdDExZl93c2NfcmVnaXN0cmFyX2luZm8obWFjX2N0eCwKKwkJCQkJCQkmYmNuXzItPldzY0JlYWNvbik7CisJCQltYWNfY3R4LT5saW0ud3NjSWVJbmZvLndzY0Vucm9sbG1lbnRTdGF0ZSA9CisJCQkJCQkJZUxJTV9XU0NfRU5ST0xMX05PT1A7CisJCX0KKwl9CisKKwlpZiAoKExJTV9JU19BUF9ST0xFKHNlc3Npb24pKSkgeworCQkvKgorCQkgKiBDYW4gYmUgZWZmaWNpZW50bHkgdXBkYXRlZCB3aGVuZXZlciBuZXcgSUUgYWRkZWQgIGluIFByb2JlCisJCSAqIHJlc3BvbnNlIGluIGZ1dHVyZQorCQkgKi8KKwkJbGltX3VwZGF0ZV9wcm9iZV9yc3BfdGVtcGxhdGVfaWVfYml0bWFwX2JlYWNvbjIobWFjX2N0eCwgYmNuXzIsCisJCQkJCSZzZXNzaW9uLT5EZWZQcm9iZVJzcEllQml0bWFwWzBdLAorCQkJCQkmc2Vzc2lvbi0+cHJvYmVSZXNwRnJhbWUpOworCisJCS8qIHVwZGF0ZSBwcm9iZSByZXNwb25zZSBXUFMgSUUgaW5zdGVhZCBvZiBiZWFjb24gV1BTIElFICovCisJCWlmIChzZXNzaW9uLT53cHNfc3RhdGUgIT0gU0FQX1dQU19ESVNBQkxFRCkgeworCQkJaWYgKHNlc3Npb24tPkFQV1BTSUVzLlNpcldQU1Byb2JlUnNwSUUuRmllbGRQcmVzZW50KQorCQkJCXBvcHVsYXRlX2RvdDExZl9wcm9iZV9yZXNfd3BzaV9lcyhtYWNfY3R4LAorCQkJCQkJCXdzY19wcmJfcmVzLCBzZXNzaW9uKTsKKwkJCWVsc2UKKwkJCQl3c2NfcHJiX3Jlcy0+cHJlc2VudCA9IDA7CisJCQlpZiAod3NjX3ByYl9yZXMtPnByZXNlbnQpIHsKKwkJCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcCgKKwkJCQkJJnNlc3Npb24tPkRlZlByb2JlUnNwSWVCaXRtYXBbMF0sCisJCQkJCVNJUl9NQUNfV1BBX0VJRCk7CisJCQkJY2RmX21lbV9jb3B5KCh2b2lkICopCisJCQkJCSZzZXNzaW9uLT5wcm9iZVJlc3BGcmFtZS5Xc2NQcm9iZVJlcywKKwkJCQkJKHZvaWQgKil3c2NfcHJiX3JlcywKKwkJCQkJc2l6ZW9mKHREb3QxMWZJRVdzY1Byb2JlUmVzKSk7CisJCQl9CisJCX0KKworCX0KKworCW5fc3RhdHVzID0gZG90MTFmX3BhY2tfYmVhY29uMihtYWNfY3R4LCBiY25fMiwKKwkJCQkgICAgICBzZXNzaW9uLT5wU2NoQmVhY29uRnJhbWVFbmQsCisJCQkJICAgICAgU0NIX01BWF9CRUFDT05fU0laRSwgJm5fYnl0ZXMpOworCWlmIChET1QxMUZfRkFJTEVEKG5fc3RhdHVzKSkgeworCQlzY2hfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhY2tlZCBhIHREb3QxMWZCZWFjb24yICgweCUwOHguKS4iKSwKKwkJCW5fc3RhdHVzKTsKKwkJY2RmX21lbV9mcmVlKGJjbl8xKTsKKwkJY2RmX21lbV9mcmVlKGJjbl8yKTsKKwkJY2RmX21lbV9mcmVlKHdzY19wcmJfcmVzKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQobl9zdGF0dXMpKSB7CisJCXNjaF9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJXYXJuaW5ncyB3aGlsZSBwYWNraW5nIGEgdERvdDExZkJlYWNvbjIoMHglMDh4LikuIiksCisJCQluX3N0YXR1cyk7CisJfQorCisJZXh0cmFfaWUgPSBzZXNzaW9uLT5wU2NoQmVhY29uRnJhbWVFbmQgKyBuX2J5dGVzOworCWV4dHJhX2llX29mZnNldCA9IG5fYnl0ZXM7CisJLyogVE9ETzogQXBwZW5kIGFkZGl0aW9uYWwgSUUgaGVyZS4gKi8KKwlzY2hfYXBwZW5kX2FkZG5faWUobWFjX2N0eCwgc2Vzc2lvbiwKKwkJCSAgIHNlc3Npb24tPnBTY2hCZWFjb25GcmFtZUVuZCArIG5fYnl0ZXMsCisJCQkgICBTQ0hfTUFYX0JFQUNPTl9TSVpFLCAmbl9ieXRlcyk7CisJc2Vzc2lvbi0+c2NoQmVhY29uT2Zmc2V0RW5kID0gKHVpbnQxNl90KSBuX2J5dGVzOworCWV4dHJhX2llX2xlbiA9IG5fYnl0ZXMgLSBleHRyYV9pZV9vZmZzZXQ7CisJLyogR2V0IHRoZSBwMnAgSWUgT2Zmc2V0ICovCisJc3RhdHVzID0gc2NoX2dldF9wMnBfaWVfb2Zmc2V0KGV4dHJhX2llLCBleHRyYV9pZV9sZW4sICZwMnBfaWVfb2Zmc2V0KTsKKwlpZiAoZVNJUl9TVUNDRVNTID09IHN0YXR1cykKKwkJLyogVXBkYXRlIHRoZSBQMlAgSWUgT2Zmc2V0ICovCisJCW1hY19jdHgtPnNjaC5zY2hPYmplY3QucDJwSWVPZmZzZXQgPQorCQkJc2Vzc2lvbi0+c2NoQmVhY29uT2Zmc2V0QmVnaW4gKyBUSU1fSUVfU0laRSArCisJCQlleHRyYV9pZV9vZmZzZXQgKyBwMnBfaWVfb2Zmc2V0OworCWVsc2UKKwkJbWFjX2N0eC0+c2NoLnNjaE9iamVjdC5wMnBJZU9mZnNldCA9IDA7CisKKwlzY2hfbG9nKG1hY19jdHgsIExPRzEsIEZMKCJJbml0aWFsaXplZCBiZWFjb24gZW5kLCBvZmZzZXQgJWQiKSwKKwkJc2Vzc2lvbi0+c2NoQmVhY29uT2Zmc2V0RW5kKTsKKwltYWNfY3R4LT5zY2guc2NoT2JqZWN0LmZCZWFjb25DaGFuZ2VkID0gMTsKKwljZGZfbWVtX2ZyZWUoYmNuXzEpOworCWNkZl9tZW1fZnJlZShiY25fMik7CisJY2RmX21lbV9mcmVlKHdzY19wcmJfcmVzKTsKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzIGxpbV91cGRhdGVfcHJvYmVfcnNwX3RlbXBsYXRlX2llX2JpdG1hcF9iZWFjb24xKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgIHREb3QxMWZCZWFjb24xICpiZWFjb24xLAorCQkJCQkJCSAgICAgIHRwUEVTZXNzaW9uCisJCQkJCQkJICAgICAgcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MzJfdCAqRGVmUHJvYmVSc3BJZUJpdG1hcDsKKwl0RG90MTFmUHJvYmVSZXNwb25zZSAqcHJiX3JzcDsKKwlpZiAoIXBzZXNzaW9uRW50cnkpIHsKKwkJc2NoX2xvZyhwTWFjLCBMT0dFLCBGTCgiUEVTZXNzaW9uIGlzIG51bGwhIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwlEZWZQcm9iZVJzcEllQml0bWFwID0gJnBzZXNzaW9uRW50cnktPkRlZlByb2JlUnNwSWVCaXRtYXBbMF07CisJcHJiX3JzcCA9ICZwc2Vzc2lvbkVudHJ5LT5wcm9iZVJlc3BGcmFtZTsKKwlwcmJfcnNwLT5CZWFjb25JbnRlcnZhbCA9IGJlYWNvbjEtPkJlYWNvbkludGVydmFsOworCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5DYXBhYmlsaXRpZXMsCisJCSAgICAgKHZvaWQgKikmYmVhY29uMS0+Q2FwYWJpbGl0aWVzLAorCQkgICAgIHNpemVvZihiZWFjb24xLT5DYXBhYmlsaXRpZXMpKTsKKworCS8qIFNTSUQgKi8KKwlpZiAoYmVhY29uMS0+U1NJRC5wcmVzZW50KSB7CisJCXNldF9wcm9iZV9yc3BfaWVfYml0bWFwKERlZlByb2JlUnNwSWVCaXRtYXAsIFNJUl9NQUNfU1NJRF9FSUQpOworCQkvKiBwb3B1bGF0aW5nIGl0LCBiZWNhdXNlIHByb2JlIHJlc3BvbnNlIGhhcyB0byBnbyB3aXRoIFNTSUQgZXZlbiBpbiBoaWRkZW4gY2FzZSAqLworCQlwb3B1bGF0ZV9kb3QxMWZfc3NpZChwTWFjLCAmcHNlc3Npb25FbnRyeS0+c3NJZCwgJnByYl9yc3AtPlNTSUQpOworCX0KKwkvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KKwlpZiAoYmVhY29uMS0+U3VwcFJhdGVzLnByZXNlbnQpIHsKKwkJc2V0X3Byb2JlX3JzcF9pZV9iaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCwgU0lSX01BQ19SQVRFU0VUX0VJRCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5TdXBwUmF0ZXMsCisJCQkgICAgICh2b2lkICopJmJlYWNvbjEtPlN1cHBSYXRlcywKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjEtPlN1cHBSYXRlcykpOworCisJfQorCS8qIERTIFBhcmFtZXRlciBzZXQgKi8KKwlpZiAoYmVhY29uMS0+RFNQYXJhbXMucHJlc2VudCkgeworCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLAorCQkJCQlTSVJfTUFDX0RTX1BBUkFNX1NFVF9FSUQpOworCQljZGZfbWVtX2NvcHkoKHZvaWQgKikmcHJiX3JzcC0+RFNQYXJhbXMsCisJCQkgICAgICh2b2lkICopJmJlYWNvbjEtPkRTUGFyYW1zLAorCQkJICAgICBzaXplb2YoYmVhY29uMS0+RFNQYXJhbXMpKTsKKworCX0KKworCS8qIElCU1MgcGFyYW1zIHdpbGwgbm90IGJlIHByZXNlbnQgaW4gdGhlIEJlYWNvbnMgdHJhbnNtaXR0ZWQgYnkgQVAgKi8KKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit2b2lkIGxpbV91cGRhdGVfcHJvYmVfcnNwX3RlbXBsYXRlX2llX2JpdG1hcF9iZWFjb24yKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgIHREb3QxMWZCZWFjb24yICpiZWFjb24yLAorCQkJCQkJICAgICB1aW50MzJfdCAqRGVmUHJvYmVSc3BJZUJpdG1hcCwKKwkJCQkJCSAgICAgdERvdDExZlByb2JlUmVzcG9uc2UgKnByYl9yc3ApCit7CisJLyogSUJTUyBwYXJhbWV0ZXIgc2V0IC0gd2lsbCBub3QgYmUgcHJlc2VudCBpbiBwcm9iZSByZXNwb25zZSB0eCBieSBBUCAqLworCS8qIGNvdW50cnkgKi8KKwlpZiAoYmVhY29uMi0+Q291bnRyeS5wcmVzZW50KSB7CisJCXNldF9wcm9iZV9yc3BfaWVfYml0bWFwKERlZlByb2JlUnNwSWVCaXRtYXAsIFNJUl9NQUNfQ09VTlRSWV9FSUQpOworCQljZGZfbWVtX2NvcHkoKHZvaWQgKikmcHJiX3JzcC0+Q291bnRyeSwKKwkJCSAgICAgKHZvaWQgKikmYmVhY29uMi0+Q291bnRyeSwKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjItPkNvdW50cnkpKTsKKworCX0KKwkvKiBQb3dlciBjb25zdHJhaW50ICovCisJaWYgKGJlYWNvbjItPlBvd2VyQ29uc3RyYWludHMucHJlc2VudCkgeworCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLAorCQkJCQlTSVJfTUFDX1BXUl9DT05TVFJBSU5UX0VJRCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5Qb3dlckNvbnN0cmFpbnRzLAorCQkJICAgICAodm9pZCAqKSZiZWFjb24yLT5Qb3dlckNvbnN0cmFpbnRzLAorCQkJICAgICBzaXplb2YoYmVhY29uMi0+UG93ZXJDb25zdHJhaW50cykpOworCisJfQorCS8qIENoYW5uZWwgU3dpdGNoIEFubm9vdW5jZW1lbnQgU0lSX01BQ19DSE5MX1NXSVRDSF9BTk5fRUlEICovCisJaWYgKGJlYWNvbjItPkNoYW5Td2l0Y2hBbm4ucHJlc2VudCkgeworCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLAorCQkJCQlTSVJfTUFDX0NITkxfU1dJVENIX0FOTl9FSUQpOworCQljZGZfbWVtX2NvcHkoKHZvaWQgKikmcHJiX3JzcC0+Q2hhblN3aXRjaEFubiwKKwkJCSAgICAgKHZvaWQgKikmYmVhY29uMi0+Q2hhblN3aXRjaEFubiwKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjItPkNoYW5Td2l0Y2hBbm4pKTsKKworCX0KKworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCWlmIChiZWFjb24yLT5RQ29tVmVuZG9ySUUucHJlc2VudCkgeworCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLAorCQkJCQlTSVJfTUFDX1FDT01fVkVORE9SX0VJRCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5RQ29tVmVuZG9ySUUsCisJCQkgICAgICh2b2lkICopJmJlYWNvbjItPlFDb21WZW5kb3JJRSwKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjItPlFDb21WZW5kb3JJRSkpOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKworCS8qIEVSUCBpbmZvcm1hdGlvbiAqLworCWlmIChiZWFjb24yLT5FUlBJbmZvLnByZXNlbnQpIHsKKwkJc2V0X3Byb2JlX3JzcF9pZV9iaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCwgU0lSX01BQ19FUlBfSU5GT19FSUQpOworCQljZGZfbWVtX2NvcHkoKHZvaWQgKikmcHJiX3JzcC0+RVJQSW5mbywKKwkJCSAgICAgKHZvaWQgKikmYmVhY29uMi0+RVJQSW5mbywKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjItPkVSUEluZm8pKTsKKworCX0KKwkvKiBFeHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KKwlpZiAoYmVhY29uMi0+RXh0U3VwcFJhdGVzLnByZXNlbnQpIHsKKwkJc2V0X3Byb2JlX3JzcF9pZV9iaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCwKKwkJCQkJU0lSX01BQ19FWFRFTkRFRF9SQVRFX0VJRCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5FeHRTdXBwUmF0ZXMsCisJCQkgICAgICh2b2lkICopJmJlYWNvbjItPkV4dFN1cHBSYXRlcywKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjItPkV4dFN1cHBSYXRlcykpOworCisJfQorCisJLyogV1BBICovCisJaWYgKGJlYWNvbjItPldQQS5wcmVzZW50KSB7CisJCXNldF9wcm9iZV9yc3BfaWVfYml0bWFwKERlZlByb2JlUnNwSWVCaXRtYXAsIFNJUl9NQUNfV1BBX0VJRCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5XUEEsICh2b2lkICopJmJlYWNvbjItPldQQSwKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjItPldQQSkpOworCisJfQorCisJLyogUlNOICovCisJaWYgKGJlYWNvbjItPlJTTk9wYXF1ZS5wcmVzZW50KSB7CisJCXNldF9wcm9iZV9yc3BfaWVfYml0bWFwKERlZlByb2JlUnNwSWVCaXRtYXAsIFNJUl9NQUNfUlNOX0VJRCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5SU05PcGFxdWUsCisJCQkgICAgICh2b2lkICopJmJlYWNvbjItPlJTTk9wYXF1ZSwKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjItPlJTTk9wYXF1ZSkpOworCX0KKworCS8qIEVEQ0EgUGFyYW1ldGVyIHNldCAqLworCWlmIChiZWFjb24yLT5FRENBUGFyYW1TZXQucHJlc2VudCkgeworCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLAorCQkJCQlTSVJfTUFDX0VEQ0FfUEFSQU1fU0VUX0VJRCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5FRENBUGFyYW1TZXQsCisJCQkgICAgICh2b2lkICopJmJlYWNvbjItPkVEQ0FQYXJhbVNldCwKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjItPkVEQ0FQYXJhbVNldCkpOworCisJfQorCS8qIFZlbmRvciBzcGVjaWZpYyAtIGN1cnJlbnRseSBubyB2ZW5kb3Igc3BlY2lmaWMgSUVzIGFkZGVkICovCisJLyogUmVxdWVzdGVkIElFcyAtIGN1cnJlbnRseSB3ZSBhcmUgbm90IHByb2Nlc3NpbmcgdGhpcyB3aWxsIGJlIGFkZGVkIGxhdGVyICovCisJLyogSFQgY2FwYWJpbGl0eSBJRSAqLworCWlmIChiZWFjb24yLT5IVENhcHMucHJlc2VudCkgeworCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLAorCQkJCQlTSVJfTUFDX0hUX0NBUEFCSUxJVElFU19FSUQpOworCQljZGZfbWVtX2NvcHkoKHZvaWQgKikmcHJiX3JzcC0+SFRDYXBzLCAodm9pZCAqKSZiZWFjb24yLT5IVENhcHMsCisJCQkgICAgIHNpemVvZihiZWFjb24yLT5IVENhcHMpKTsKKwl9CisJLyogSFQgSW5mbyBJRSAqLworCWlmIChiZWFjb24yLT5IVEluZm8ucHJlc2VudCkgeworCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLCBTSVJfTUFDX0hUX0lORk9fRUlEKTsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJnByYl9yc3AtPkhUSW5mbywgKHZvaWQgKikmYmVhY29uMi0+SFRJbmZvLAorCQkJICAgICBzaXplb2YoYmVhY29uMi0+SFRJbmZvKSk7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKGJlYWNvbjItPlZIVENhcHMucHJlc2VudCkgeworCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLAorCQkJCQlTSVJfTUFDX1ZIVF9DQVBBQklMSVRJRVNfRUlEKTsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJnByYl9yc3AtPlZIVENhcHMsCisJCQkgICAgICh2b2lkICopJmJlYWNvbjItPlZIVENhcHMsCisJCQkgICAgIHNpemVvZihiZWFjb24yLT5WSFRDYXBzKSk7CisJfQorCWlmIChiZWFjb24yLT5WSFRPcGVyYXRpb24ucHJlc2VudCkgeworCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLAorCQkJCQlTSVJfTUFDX1ZIVF9PUEVSQVRJT05fRUlEKTsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJnByYl9yc3AtPlZIVE9wZXJhdGlvbiwKKwkJCSAgICAgKHZvaWQgKikmYmVhY29uMi0+VkhUT3BlcmF0aW9uLAorCQkJICAgICBzaXplb2YoYmVhY29uMi0+VkhUT3BlcmF0aW9uKSk7CisJfQorCWlmIChiZWFjb24yLT5WSFRFeHRCc3NMb2FkLnByZXNlbnQpIHsKKwkJc2V0X3Byb2JlX3JzcF9pZV9iaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCwKKwkJCQkJU0lSX01BQ19WSFRfRVhUX0JTU19MT0FEX0VJRCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5WSFRFeHRCc3NMb2FkLAorCQkJICAgICAodm9pZCAqKSZiZWFjb24yLT5WSFRFeHRCc3NMb2FkLAorCQkJICAgICBzaXplb2YoYmVhY29uMi0+VkhURXh0QnNzTG9hZCkpOworCX0KKyNlbmRpZgorCisJLyogV01NIElFICovCisJaWYgKGJlYWNvbjItPldNTVBhcmFtcy5wcmVzZW50KSB7CisJCXNldF9wcm9iZV9yc3BfaWVfYml0bWFwKERlZlByb2JlUnNwSWVCaXRtYXAsIFNJUl9NQUNfV1BBX0VJRCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5XTU1QYXJhbXMsCisJCQkgICAgICh2b2lkICopJmJlYWNvbjItPldNTVBhcmFtcywKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjItPldNTVBhcmFtcykpOworCX0KKwkvKiBXTU0gY2FwYWJpbGl0eSAtIG1vc3Qgb2YgdGhlIGNhc2Ugd29uJ3QgYmUgcHJlc2VudCAqLworCWlmIChiZWFjb24yLT5XTU1DYXBzLnByZXNlbnQpIHsKKwkJc2V0X3Byb2JlX3JzcF9pZV9iaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCwgU0lSX01BQ19XUEFfRUlEKTsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJnByYl9yc3AtPldNTUNhcHMsCisJCQkgICAgICh2b2lkICopJmJlYWNvbjItPldNTUNhcHMsCisJCQkgICAgIHNpemVvZihiZWFjb24yLT5XTU1DYXBzKSk7CisJfQorCisJLyogRXh0ZW5kZWQgQ2FwYWJpbGl0eSAqLworCWlmIChiZWFjb24yLT5FeHRDYXAucHJlc2VudCkgeworCQlzZXRfcHJvYmVfcnNwX2llX2JpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLCBET1QxMUZfRUlEX0VYVENBUCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwcmJfcnNwLT5FeHRDYXAsCisJCQkgICAgICh2b2lkICopJmJlYWNvbjItPkV4dENhcCwKKwkJCSAgICAgc2l6ZW9mKGJlYWNvbjItPkV4dENhcCkpOworCX0KKworfQorCit2b2lkIHNldF9wcm9iZV9yc3BfaWVfYml0bWFwKHVpbnQzMl90ICpJZUJpdG1hcCwgdWludDMyX3QgcG9zKQoreworCXVpbnQzMl90IGluZGV4LCB0ZW1wOworCisJaW5kZXggPSBwb3MgPj4gNTsKKwlpZiAoaW5kZXggPj0gOCkgeworCQlyZXR1cm47CisJfQorCXRlbXAgPSBJZUJpdG1hcFtpbmRleF07CisKKwl0ZW1wIHw9IDEgPDwgKHBvcyAmIDB4MUYpOworCisJSWVCaXRtYXBbaW5kZXhdID0gdGVtcDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogd3JpdGVfYmVhY29uX3RvX21lbW9yeQorICoKKyAqIEZVTkNUSU9OOgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIE5vbmUKKyAqIEBwYXJhbSBzaXplICAgIFNpemUgb2YgdGhlIGJlYWNvbiB0byB3cml0ZSB0byBtZW1vcnkKKyAqIEBwYXJhbSBsZW5ndGggTGVuZ3RoIGZpZWxkIG9mIHRoZSBiZWFjb24gdG8gd3JpdGUgdG8gbWVtb3J5CisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHdyaXRlX2JlYWNvbl90b19tZW1vcnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3Qgc2l6ZSwgdWludDE2X3QgbGVuZ3RoLAorCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDE2X3QgaTsKKwl0cEFuaUJlYWNvblN0cnVjdCBwQmVhY29uOworCisJLyogY29weSBlbmQgb2YgYmVhY29uIG9ubHkgaWYgbGVuZ3RoID4gMCAqLworCWlmIChsZW5ndGggPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwc2Vzc2lvbkVudHJ5LT5zY2hCZWFjb25PZmZzZXRFbmQ7IGkrKykKKwkJCXBzZXNzaW9uRW50cnktPnBTY2hCZWFjb25GcmFtZUJlZ2luW3NpemUrK10gPQorCQkJCXBzZXNzaW9uRW50cnktPnBTY2hCZWFjb25GcmFtZUVuZFtpXTsKKwl9CisJLyogVXBkYXRlIHRoZSBiZWFjb24gbGVuZ3RoICovCisJcEJlYWNvbiA9ICh0cEFuaUJlYWNvblN0cnVjdCkgcHNlc3Npb25FbnRyeS0+cFNjaEJlYWNvbkZyYW1lQmVnaW47CisJLyogRG8gbm90IGluY2x1ZGUgdGhlIGJlYWNvbkxlbmd0aCBpbmRpY2F0b3IgaXRzZWxmICovCisJaWYgKGxlbmd0aCA9PSAwKSB7CisJCXBCZWFjb24tPmJlYWNvbkxlbmd0aCA9IDA7CisJCS8qIERvbnQgY29weSBlbnRpcmUgYmVhY29uLCBDb3B5IGxlbmd0aCBmaWVsZCBhbG9uZSAqLworCQlzaXplID0gNDsKKwl9IGVsc2UKKwkJcEJlYWNvbi0+YmVhY29uTGVuZ3RoID0gKHVpbnQzMl90KSBzaXplIC0gc2l6ZW9mKHVpbnQzMl90KTsKKworCS8qIHdyaXRlIHNpemUgYnl0ZXMgZnJvbSBwU2NoQmVhY29uRnJhbWVCZWdpbiAqLworCVBFTE9HMihzY2hfbG9nKHBNYWMsIExPRzIsIEZMKCJCZWFjb24gc2l6ZSAtICVkIGJ5dGVzIiksIHNpemUpOykKKwlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCSAgICAgICAocE1hYywgU0lSX1NDSF9NT0RVTEVfSUQsIExPRzIsCisJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5wU2NoQmVhY29uRnJhbWVCZWdpbiwgc2l6ZSk7CisJICAgICAgICkKKworCWlmICghcE1hYy0+c2NoLnNjaE9iamVjdC5mQmVhY29uQ2hhbmdlZCkKKwkJcmV0dXJuOworCisJcE1hYy0+c2NoLmdTY2hHZW5CZWFjb24gPSAxOworCWlmIChwTWFjLT5zY2guZ1NjaEdlbkJlYWNvbikgeworCQlwTWFjLT5zY2guZ1NjaEJlYWNvbnNTZW50Kys7CisKKwkJLyogKi8KKwkJLyogQ29weSBiZWFjb24gZGF0YSB0byBTb2Z0TUFDIHNoYXJlZCBtZW1vcnkuLi4gKi8KKwkJLyogRG8gdGhpcyBieSBzZW5kaW5nIGEgbWVzc2FnZSB0byBIQUwgKi8KKwkJLyogKi8KKworCQlzaXplID0gKHNpemUgKyAzKSAmICh+Myk7CisJCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkJICAgIHNjaF9zZW5kX2JlYWNvbl9yZXEocE1hYywgcHNlc3Npb25FbnRyeS0+cFNjaEJlYWNvbkZyYW1lQmVnaW4sCisJCQkJCXNpemUsIHBzZXNzaW9uRW50cnkpKQorCQkJUEVMT0dFKHNjaF9sb2cKKwkJCQkgICAgICAgKHBNYWMsIExPR0UsCisJCQkJICAgICAgIEZMCisJCQkJCSAgICAgICAoInNjaF9zZW5kX2JlYWNvbl9yZXEoKSByZXR1cm5lZCBhbiBlcnJvciAoenNpemUgJWQpIiksCisJCQkJICAgICAgIHNpemUpOworCQkJICAgICAgICkKKwkJCWVsc2UgeworCQkJCXBNYWMtPnNjaC5nU2NoQmVhY29uc1dyaXR0ZW4rKzsKKwkJCX0KKwl9CisJcE1hYy0+c2NoLnNjaE9iamVjdC5mQmVhY29uQ2hhbmdlZCA9IDA7Cit9CisKKy8qKgorICogc2NoX2dlbmVyYXRlX3RpbQorICoKKyAqIEZVTkNUSU9OOgorICogR2VuZXJhdGUgVElNCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyBwb2ludGVyIHRvIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgKiBAcGFyYW0gKipwUHRyIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciwgd2hlcmUgdGhlIFRJTSBiaXQgaXMgdG8gYmUgd3JpdHRlbi4KKyAqIEBwYXJhbSAqdGltTGVuZ3RoIHBvaW50ZXIgdG8gbGltTGVuZ3RoLCB3aGljaCBuZWVkcyB0byBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIHNjaF9nZW5lcmF0ZV90aW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqKnBQdHIsIHVpbnQxNl90ICp0aW1MZW5ndGgsCisJCSAgICAgIHVpbnQ4X3QgZHRpbVBlcmlvZCkKK3sKKwl1aW50OF90ICpwdHIgPSAqcFB0cjsKKwl1aW50MzJfdCB2YWwgPSAwOworCXVpbnQzMl90IG1pbkFpZCA9IDE7ICAgIC8qIEFsd2F5cyBzdGFydCB3aXRoIEFJRCAxIGFzIG1pbmltdW0gKi8KKwl1aW50MzJfdCBtYXhBaWQgPSBIQUxfTlVNX1NUQTsKKworCS8qIEdlbmVyYXRlIHBhcnRpYWwgdmlydHVhbCBiaXRtYXAgKi8KKwl1aW50OF90IE4xID0gbWluQWlkIC8gODsKKwl1aW50OF90IE4yID0gbWF4QWlkIC8gODsKKwlpZiAoTjEgJiAxKQorCQlOMS0tOworCisJKnRpbUxlbmd0aCA9IE4yIC0gTjEgKyA0OworCXZhbCA9IGR0aW1QZXJpb2Q7CisKKwkvKgorCSAqIFdyaXRlIDB4RkYgdG8gZmlybXdhcmUncyBmaWVsZCB0byBkZXRlY3QgZmlybXdhcmUncyBtYWwtZnVuY3Rpb24KKwkgKiBlYXJseS4gRFRJTSBjb3VudCBhbmQgYml0bWFwIGNvbnRyb2wgdXN1YWxseSBjYW5ub3QgYmUgMHhGRiwgc28gaXQKKwkgKiBpcyBlYXN5IHRvIGtub3cgdGhhdCBmaXJtd2FyZSBuZXZlciB1cGRhdGVkIERUSU0gY291bnQvYml0bWFwIGNvbnRyb2wKKwkgKiBmaWVsZCBhZnRlciBob3N0IGRyaXZlciBkb3dubG9hZGVkIGJlYWNvbiB0ZW1wbGF0ZSBpZiBlbmQtdXNlciBjb21wbGFpbnRzCisJICogdGhhdCBEVElNIGNvdW50IGFuZCBiaXRtYXBDb250cm9sIGlzIDB4RkYuCisJICovCisJKnB0cisrID0gU0lSX01BQ19USU1fRUlEOworCSpwdHIrKyA9ICh1aW50OF90KSAoKnRpbUxlbmd0aCk7CisJLyogbG9jYXRpb24gZm9yIGR0aW1Db3VudC4gd2lsbCBiZSBmaWxsZWQgaW4gYnkgRlcuICovCisJKnB0cisrID0gMHhGRjsKKwkqcHRyKysgPSAodWludDhfdCkgdmFsOworCS8qIGxvY2F0aW9uIGZvciBiaXRtYXAgY29udHJvbC4gd2lsbCBiZSBmaWxsZWQgaW4gYnkgRlcuICovCisJKnB0cisrID0gMHhGRjsKKwlwdHIgKz0gKE4yIC0gTjEgKyAxKTsKKworCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJICAgICAgIChwTWFjLCBTSVJfU0NIX01PRFVMRV9JRCwgTE9HMiwgKnBQdHIsICgqdGltTGVuZ3RoKSArIDIpOworCSAgICAgICApCisJKiBwUHRyID0gcHRyOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogQGZ1bmN0aW9uOiBTY2hQcm9jZXNzUHJlQmVhY29uSW5kCisgKgorICogQGJyaWVmIDogUHJvY2VzcyB0aGUgUHJlQmVhY29uIEluZGljYXRpb24gZnJvbSB0aGUgTGltCisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gOiBwTWFjIC0gdHBBbmlTaXJHbG9iYWwKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHNjaF9wcm9jZXNzX3ByZV9iZWFjb25faW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpCit7CisJdHBCZWFjb25HZW5QYXJhbXMgcE1zZyA9ICh0cEJlYWNvbkdlblBhcmFtcykgbGltTXNnLT5ib2R5cHRyOworCXVpbnQzMl90IGJlYWNvblNpemU7CisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKwl1aW50OF90IHNlc3Npb25JZDsKKworCWlmICgocHNlc3Npb25FbnRyeSA9CisJCSAgICAgcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsIHBNc2ctPmJzc0lkLCAmc2Vzc2lvbklkKSkgPT0gTlVMTCkgeworCQlQRUxPR0Uoc2NoX2xvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbiBsb29rdXAgZmFpbHMiKSk7KQorCQlnb3RvIGVuZDsKKwl9CisKKwliZWFjb25TaXplID0gcHNlc3Npb25FbnRyeS0+c2NoQmVhY29uT2Zmc2V0QmVnaW47CisKKwkvKiBJZiBTTUUgaXMgbm90IGluIG5vcm1hbCBtb2RlLCBubyBuZWVkIHRvIGdlbmVyYXRlIGJlYWNvbiAqLworCWlmIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9OT1JNQUxfU1RBVEUpIHsKKwkJUEVMT0dFKHNjaF9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMSwKKwkJCSAgICAgICBGTCgiUHJlQmVhY29uSW5kIHJlY2VpdmVkIGluIGludmFsaWQgc3RhdGU6ICVkIiksCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworCQkgICAgICAgKQorCQlnb3RvIGVuZDsKKwl9CisKKwlzd2l0Y2ggKEdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKworCWNhc2UgZUxJTV9TVEFfSU5fSUJTU19ST0xFOgorCWNhc2UgZUxJTV9CVF9BTVBfQVBfUk9MRToKKwljYXNlIGVMSU1fQlRfQU1QX1NUQV9ST0xFOgorCQkvKiBnZW5lcmF0ZSBJQlNTIHBhcmFtZXRlciBzZXQgKi8KKwkJaWYgKHBzZXNzaW9uRW50cnktPnN0YXR5cGVGb3JCc3MgPT0gU1RBX0VOVFJZX1NFTEYpCisJCQl3cml0ZV9iZWFjb25fdG9fbWVtb3J5KHBNYWMsICh1aW50MTZfdCkgYmVhY29uU2l6ZSwKKwkJCQkJICAgICAgICh1aW50MTZfdCkgYmVhY29uU2l6ZSwKKwkJCQkJICAgICAgIHBzZXNzaW9uRW50cnkpOworCQllbHNlCisJCQlQRUxPR0Uoc2NoX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgiY2FuIG5vdCBzZW5kIGJlYWNvbiBmb3IgUEVFUiBzZXNzaW9uIGVudHJ5IikpOworCQkJICAgICAgICkKKwkJCWJyZWFrOworCisJY2FzZSBlTElNX0FQX1JPTEU6IHsKKwkJdWludDhfdCAqcHRyID0KKwkJCSZwc2Vzc2lvbkVudHJ5LT5wU2NoQmVhY29uRnJhbWVCZWdpbltwc2Vzc2lvbkVudHJ5LT4KKwkJCQkJCQkgICAgIHNjaEJlYWNvbk9mZnNldEJlZ2luXTsKKwkJdWludDE2X3QgdGltTGVuZ3RoID0gMDsKKwkJaWYgKHBzZXNzaW9uRW50cnktPnN0YXR5cGVGb3JCc3MgPT0gU1RBX0VOVFJZX1NFTEYpIHsKKwkJCXNjaF9nZW5lcmF0ZV90aW0ocE1hYywgJnB0ciwgJnRpbUxlbmd0aCwKKwkJCQkJIHBzZXNzaW9uRW50cnktPmR0aW1QZXJpb2QpOworCQkJYmVhY29uU2l6ZSArPSAyICsgdGltTGVuZ3RoOworCQkJd3JpdGVfYmVhY29uX3RvX21lbW9yeShwTWFjLCAodWludDE2X3QpIGJlYWNvblNpemUsCisJCQkJCSAgICAgICAodWludDE2X3QpIGJlYWNvblNpemUsCisJCQkJCSAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJfSBlbHNlCisJCQlQRUxPR0Uoc2NoX2xvZworCQkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCQkgICAgICAgRkwKKwkJCQkJICAgICAgICgiY2FuIG5vdCBzZW5kIGJlYWNvbiBmb3IgUEVFUiBzZXNzaW9uIGVudHJ5IikpOworCQkJICAgICAgICkKKwkJCX0KKwkJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVMT0dFKHNjaF9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwKKwkJCSAgICAgICBGTAorCQkJCSAgICAgICAoIkVycm9yLVBFIGhhcyBSZWNlaXZlIFByZUJlY29uR2VuSW5kaWNhdGlvbiB3aGVuIFN5c3RlbSBpcyBpbiAlZCByb2xlIiksCisJCQkgICAgICAgR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSk7CisJCSAgICAgICApCisJfQorCitlbmQ6CisJCWNkZl9tZW1fZnJlZShwTXNnKTsKKworCX0KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9wZS9zY2gvc2NoX2JlYWNvbl9wcm9jZXNzLmMgYi9jb3JlL21hYy9zcmMvcGUvc2NoL3NjaF9iZWFjb25fcHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZjJhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvcGUvc2NoL3NjaF9iZWFjb25fcHJvY2Vzcy5jCkBAIC0wLDAgKzEsMTAxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBzY2hfYmVhY29uX3Byb2Nlc3MuY2MgY29udGFpbnMgYmVhY29uIHByb2Nlc3NpbmcgcmVsYXRlZAorICogZnVuY3Rpb25zCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgImxpbV9hcGkuaCIKKyNpbmNsdWRlICJ1dGlsc19hcGkuaCIKKyNpbmNsdWRlICJzY2hfZGVidWcuaCIKKyNpbmNsdWRlICJzY2hfYXBpLmgiCisKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKyNpbmNsdWRlICJsaW1fc2VuZF9tZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbV9zdGFfaGFzaF9hcGkuaCIKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybV9hcGkuaCIKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworLyoqCisgKiBOdW1iZXIgb2YgYnl0ZXMgb2YgdmFyaWF0aW9uIGluIGJlYWNvbiBsZW5ndGggZnJvbSB0aGUgbGFzdCBiZWFjb24KKyAqIHRvIHRyaWdnZXIgcmVwcm9ncmFtbWluZyBvZiByeCBkZWxheSByZWdpc3RlcgorICovCisjZGVmaW5lIFNDSF9CRUFDT05fTEVOX0RFTFRBICAgICAgIDMKKworLyogY2FsY3VsYXRlIDJeY3cgLSAxICovCisjZGVmaW5lIENXX0dFVChjdykgKCgoY3cpID09IDApID8gMSA6ICgoMSA8PCAoY3cpKSAtIDEpKQorCitzdGF0aWMgdm9pZAorYXBfYmVhY29uX3Byb2Nlc3NfNV9naHoodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCAqcnhfcGt0X2luZm8sCisJCQl0cFNjaEJlYWNvblN0cnVjdCBiY25fc3RydWN0LAorCQkJdHBVcGRhdGVCZWFjb25QYXJhbXMgYmNuX3BybSwgdHBQRVNlc3Npb24gc2Vzc2lvbiwKKwkJCXVpbnQzMl90IHBoeV9tb2RlKQoreworCXRwU2lyTWFjTWdtdEhkciBtYWNfaGRyID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKHJ4X3BrdF9pbmZvKTsKKwlpZiAoIXNlc3Npb24tPmh0Q2FwYWJpbGl0eSkKKwkJcmV0dXJuOworCisJaWYgKGJjbl9zdHJ1Y3QtPmNoYW5uZWxOdW1iZXIgIT0gc2Vzc2lvbi0+Y3VycmVudE9wZXJDaGFubmVsKQorCQlyZXR1cm47CisKKwkvKiAxMWEgKG5vbiBIVCkgQVAgIG92ZXJsYXBzIG9yICovCisJLyogSFQgQVAgd2l0aCBIVCBvcCBtb2RlIGFzIG1peGVkIG92ZXJsYXBzLiAqLworCS8qIEhUIEFQIHdpdGggSFQgb3AgbW9kZSBhcyBvdmVybGFwIGxlZ2FjeSBvdmVybGFwcy4gKi8KKwlpZiAoIWJjbl9zdHJ1Y3QtPkhUSW5mby5wcmVzZW50CisJICAgIHx8IChlU0lSX0hUX09QX01PREVfTUlYRUQgPT0gYmNuX3N0cnVjdC0+SFRJbmZvLm9wTW9kZSkKKwkgICAgfHwgKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSA9PSBiY25fc3RydWN0LT5IVEluZm8ub3BNb2RlKSkgeworCQlsaW1fdXBkYXRlX292ZXJsYXBfc3RhX3BhcmFtKG1hY19jdHgsIG1hY19oZHItPmJzc0lkLAorCQkJCQkmKG1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcDExYVBhcmFtcykpOworCisJCWlmIChtYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXAxMWFQYXJhbXMubnVtU3RhCisJCSAgICAmJiAhbWFjX2N0eC0+bGltLmdMaW1PdmVybGFwMTFhUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSB7CisJCQlsaW1fdXBkYXRlXzExYV9wcm90ZWN0aW9uKG1hY19jdHgsIHRydWUsIHRydWUsCisJCQkJCQkgYmNuX3BybSwgc2Vzc2lvbik7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvKiBIVCBBUCB3aXRoIEhUMjAgb3AgbW9kZSBvdmVybGFwcy4gKi8KKwlpZiAoZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVCAhPSBiY25fc3RydWN0LT5IVEluZm8ub3BNb2RlKQorCQlyZXR1cm47CisKKwlsaW1fdXBkYXRlX292ZXJsYXBfc3RhX3BhcmFtKG1hY19jdHgsIG1hY19oZHItPmJzc0lkLAorCQkJCSAgICAgJihtYWNfY3R4LT5saW0uZ0xpbU92ZXJsYXBIdDIwUGFyYW1zKSk7CisKKwlpZiAobWFjX2N0eC0+bGltLmdMaW1PdmVybGFwSHQyMFBhcmFtcy5udW1TdGEKKwkgICAgJiYgIW1hY19jdHgtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisJCWxpbV9lbmFibGVfaHQyMF9wcm90ZWN0aW9uKG1hY19jdHgsIHRydWUsIHRydWUsCisJCQkJCSAgIGJjbl9wcm0sIHNlc3Npb24pOworfQorCitzdGF0aWMgdm9pZAorYXBfYmVhY29uX3Byb2Nlc3NfMjRfZ2h6KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgKnJ4X3BrdF9pbmZvLAorCQkJIHRwU2NoQmVhY29uU3RydWN0IGJjbl9zdHJ1Y3QsCisJCQkgdHBVcGRhdGVCZWFjb25QYXJhbXMgYmNuX3BybSwgdHBQRVNlc3Npb24gc2Vzc2lvbiwKKwkJCSB1aW50MzJfdCBwaHlfbW9kZSkKK3sKKwl0cFNpck1hY01nbXRIZHIgbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisJYm9vbCB0bXBfZXhwID0gZmFsc2U7CisJLyogV2UgYXJlIDExRyBBUC4gKi8KKwlpZiAoKHBoeV9tb2RlID09IFdOSV9DRkdfUEhZX01PREVfMTFHKSAmJgorCSAgICAoZmFsc2UgPT0gc2Vzc2lvbi0+aHRDYXBhYmlsaXR5KSkgeworCQlpZiAoYmNuX3N0cnVjdC0+Y2hhbm5lbE51bWJlciAhPSBzZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwpCisJCQlyZXR1cm47CisKKwkJdG1wX2V4cCA9ICghYmNuX3N0cnVjdC0+ZXJwUHJlc2VudAorCQkJICAgICYmICFiY25fc3RydWN0LT5IVEluZm8ucHJlc2VudCkKKwkJCSAgICAvKiBpZiBlcnAgbm90IHByZXNlbnQgdGhlbiAgMTFCIEFQIG92ZXJsYXBwaW5nICovCisJCQkgICAgfHwgKCFtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmlnbm9yZV9wZWVyX2VycF9pbmZvICYmCisJCQkJCWJjbl9zdHJ1Y3QtPmVycFByZXNlbnQgJiYKKwkJCQkJKGJjbl9zdHJ1Y3QtPmVycElFSW5mby51c2VQcm90ZWN0aW9uCisJCQkJICAgIHx8IGJjbl9zdHJ1Y3QtPmVycElFSW5mby5ub25FcnBQcmVzZW50KSk7CisJCWlmICghdG1wX2V4cCkKKwkJCXJldHVybjsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCWlmIChzZXNzaW9uLT5pc0VTRWNvbm5lY3Rpb24pCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgRkwoIltJTkZPTE9HXUVTRSAxMWcgZXJwUHJlc2VudD0lZCB1c2VQcm90ZWN0aW9uPSVkIG5vbkVycFByZXNlbnQ9JWQiKSwKKwkJCQkgIGJjbl9zdHJ1Y3QtPmVycFByZXNlbnQsCisJCQkJICBiY25fc3RydWN0LT5lcnBJRUluZm8udXNlUHJvdGVjdGlvbiwKKwkJCQkgIGJjbl9zdHJ1Y3QtPmVycElFSW5mby5ub25FcnBQcmVzZW50KTsKKyNlbmRpZgorCQlsaW1fZW5hYmxlX292ZXJsYXAxMWdfcHJvdGVjdGlvbihtYWNfY3R4LCBiY25fcHJtLAorCQkJCQkJIG1hY19oZHIsIHNlc3Npb24pOworCQlyZXR1cm47CisJfQorCS8qIGhhbmRsaW5nIHRoZSBjYXNlIHdoZW4gSFQgQVAgaGFzIG92ZXJsYXBwaW5nIGxlZ2FjeSBCU1MuICovCisJaWYgKCFzZXNzaW9uLT5odENhcGFiaWxpdHkpCisJCXJldHVybjsKKworCWlmIChiY25fc3RydWN0LT5jaGFubmVsTnVtYmVyICE9IHNlc3Npb24tPmN1cnJlbnRPcGVyQ2hhbm5lbCkKKwkJcmV0dXJuOworCisJdG1wX2V4cCA9ICghYmNuX3N0cnVjdC0+ZXJwUHJlc2VudCAmJiAhYmNuX3N0cnVjdC0+SFRJbmZvLnByZXNlbnQpCisJCSAgICAvKiBpZiBlcnAgbm90IHByZXNlbnQgdGhlbiAgMTFCIEFQIG92ZXJsYXBwaW5nICovCisJCSAgICB8fCAoIW1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uaWdub3JlX3BlZXJfZXJwX2luZm8gJiYKKwkJCQliY25fc3RydWN0LT5lcnBQcmVzZW50ICYmCisJCQkJKGJjbl9zdHJ1Y3QtPmVycElFSW5mby51c2VQcm90ZWN0aW9uCisJCQkgICAgfHwgYmNuX3N0cnVjdC0+ZXJwSUVJbmZvLm5vbkVycFByZXNlbnQpKTsKKwlpZiAodG1wX2V4cCkgeworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJaWYgKHNlc3Npb24tPmlzRVNFY29ubmVjdGlvbikgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfUEUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgRkwoIltJTkZPTE9HXUVTRSAxMWcgZXJwUHJlc2VudD0lZCB1c2VQcm90ZWN0aW9uPSVkIG5vbkVycFByZXNlbnQ9JWQiKSwKKwkJCQkgIGJjbl9zdHJ1Y3QtPmVycFByZXNlbnQsCisJCQkJICBiY25fc3RydWN0LT5lcnBJRUluZm8udXNlUHJvdGVjdGlvbiwKKwkJCQkgIGJjbl9zdHJ1Y3QtPmVycElFSW5mby5ub25FcnBQcmVzZW50KTsKKwkJfQorI2VuZGlmCisJCWxpbV9lbmFibGVfb3ZlcmxhcDExZ19wcm90ZWN0aW9uKG1hY19jdHgsIGJjbl9wcm0sCisJCQkJCQkgbWFjX2hkciwgc2Vzc2lvbik7CisJfQorCS8qIDExZyBkZXZpY2Ugb3ZlcmxhcHMgKi8KKwl0bXBfZXhwID0gYmNuX3N0cnVjdC0+ZXJwUHJlc2VudAorCQkmJiAhKGJjbl9zdHJ1Y3QtPmVycElFSW5mby51c2VQcm90ZWN0aW9uCisJCSAgICAgfHwgYmNuX3N0cnVjdC0+ZXJwSUVJbmZvLm5vbkVycFByZXNlbnQpCisJCSYmICEoYmNuX3N0cnVjdC0+SFRJbmZvLnByZXNlbnQpOworCWlmICh0bXBfZXhwKSB7CisJCWxpbV91cGRhdGVfb3ZlcmxhcF9zdGFfcGFyYW0obWFjX2N0eCwgbWFjX2hkci0+YnNzSWQsCisJCQkJCSAgICAgJihzZXNzaW9uLT5nTGltT3ZlcmxhcDExZ1BhcmFtcykpOworCisJCWlmIChzZXNzaW9uLT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5udW1TdGEKKwkJICAgICYmICFzZXNzaW9uLT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKwkJCWxpbV9lbmFibGVfaHRfcHJvdGVjdGlvbl9mcm9tMTFnKG1hY19jdHgsIHRydWUsIHRydWUsCisJCQkJCQkJIGJjbl9wcm0sIHNlc3Npb24pOworCX0KKwkvKiBodCBkZXZpY2Ugb3ZlcmxhcHMuCisJICogaGVyZSB3ZSB3aWxsIGNoZWNrIGZvciBIVCByZWxhdGVkIGRldmljZXMgb25seSB3aGljaCBtaWdodCBuZWVkCisJICogcHJvdGVjdGlvbi4gY2hlY2sgZm9yIDExYiBhbmQgMTFnIGlzIGFscmVhZHkgZG9uZSBpbiB0aGUgcHJldmlvdXMKKwkgKiBibG9ja3MuIHNvIHdlIHdpbGwgbm90IGNoZWNrIGZvciBIVCBvcGVyYXRpbmcgbW9kZSBhcyBNSVhFRC4KKwkgKi8KKwlpZiAoIWJjbl9zdHJ1Y3QtPkhUSW5mby5wcmVzZW50KQorCQlyZXR1cm47CisKKwkvKgorCSAqIGlmIHdlIGFyZSBub3QgYWxyZWFkeSBpbiBtaXhlZCBtb2RlIG9yIGxlZ2FjeSBtb2RlIGFzIEhUIG9wZXJhdGluZworCSAqIG1vZGUgYW5kIHJlY2VpdmVkIGJlYWNvbiBoYXMgSFQgb3BlcmF0aW5nIG1vZGUgYXMgbGVnYWN5IHRoZW4gd2UgbmVlZAorCSAqIHRvIGVuYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFnIHN0YXRpb24uIHdlIGRvbid0IG5lZWQgcHJvdGVjdGlvbiBmcm9tCisJICogMTFiIGJlY2F1c2UgaWYgdGhhdCdzIG5lZWRlZCB0aGVuIG91ciBvcGVyYXRpbmcgbW9kZSB3b3VsZCBoYXZlCisJICogYWxyZWFkeSBiZWVuIHNldCB0byBsZWdhY3kgaW4gdGhlIHByZXZpb3VzIGJsb2Nrcy4KKwkgKi8KKwlpZiAoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZID09IGJjbl9zdHJ1Y3QtPkhUSW5mby5vcE1vZGUpIHsKKwkJaWYgKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSA9PSBtYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUKKwkJICAgIHx8IGVTSVJfSFRfT1BfTU9ERV9NSVhFRCA9PSBtYWNfY3R4LT5saW0uZ0hUT3Blck1vZGUpCisJCQlyZXR1cm47CisJCWxpbV91cGRhdGVfb3ZlcmxhcF9zdGFfcGFyYW0obWFjX2N0eCwgbWFjX2hkci0+YnNzSWQsCisJCQkJCSAgICAgJihzZXNzaW9uLT5nTGltT3ZlcmxhcDExZ1BhcmFtcykpOworCQlpZiAoc2Vzc2lvbi0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMubnVtU3RhCisJCSAgICAmJiAhc2Vzc2lvbi0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisJCQlsaW1fZW5hYmxlX2h0X3Byb3RlY3Rpb25fZnJvbTExZyhtYWNfY3R4LCB0cnVlLCB0cnVlLAorCQkJCQkJCSBiY25fcHJtLCBzZXNzaW9uKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUID09IGJjbl9zdHJ1Y3QtPkhUSW5mby5vcE1vZGUpIHsKKwkJbGltX3VwZGF0ZV9vdmVybGFwX3N0YV9wYXJhbShtYWNfY3R4LCBtYWNfaGRyLT5ic3NJZCwKKwkJCQkJICAgICAmKHNlc3Npb24tPmdMaW1PdmVybGFwSHQyMFBhcmFtcykpOworCQlpZiAoc2Vzc2lvbi0+Z0xpbU92ZXJsYXBIdDIwUGFyYW1zLm51bVN0YQorCQkgICAgJiYgIXNlc3Npb24tPmdMaW1PdmVybGFwSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKwkJCWxpbV9lbmFibGVfaHQyMF9wcm90ZWN0aW9uKG1hY19jdHgsIHRydWUsIHRydWUsCisJCQkJCQkgICBiY25fcHJtLCBzZXNzaW9uKTsKKwl9Cit9CisKKy8qKgorICogYXBfYmVhY29uX3Byb2Nlc3MoKSAtIHByb2Nlc3NlcyBpbmNvbWluZyBiZWFjb25zCisgKgorICogQG1hY19jdHg6ICAgICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAcnhfcGt0X2luZm86ICAgICBpbmNvbWluZyBiZWFjb24gcGFja2V0CisgKiBAYmNuX3N0cnVjdDogICAgICBiZWFjb24gc3RydWN0CisgKiBAYmNuX3BybTogICAgICAgICBiZWFjb24gcGFyYW1zCisgKiBAc2Vzc2lvbjogICAgICAgICBwZSBzZXNzaW9uIGVudHJ5CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCithcF9iZWFjb25fcHJvY2Vzcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50OF90ICpyeF9wa3RfaW5mbywKKwkJICB0cFNjaEJlYWNvblN0cnVjdCBiY25fc3RydWN0LAorCQkgIHRwVXBkYXRlQmVhY29uUGFyYW1zIGJjbl9wcm0sIHRwUEVTZXNzaW9uIHNlc3Npb24pCit7CisJdWludDMyX3QgcGh5X21vZGU7CisJdFNpclJGQmFuZCByZl9iYW5kID0gU0lSX0JBTkRfVU5LTk9XTjsKKwkvKiBHZXQgUkYgYmFuZCBmcm9tIHNlc3Npb24gKi8KKwlyZl9iYW5kID0gc2Vzc2lvbi0+bGltUkZCYW5kOworCisJbGltX2dldF9waHlfbW9kZShtYWNfY3R4LCAmcGh5X21vZGUsIHNlc3Npb24pOworCisJaWYgKFNJUl9CQU5EXzVfR0haID09IHJmX2JhbmQpCisJCWFwX2JlYWNvbl9wcm9jZXNzXzVfZ2h6KG1hY19jdHgsIHJ4X3BrdF9pbmZvLCBiY25fc3RydWN0LAorCQkJCQliY25fcHJtLCBzZXNzaW9uLCBwaHlfbW9kZSk7CisJZWxzZSBpZiAoU0lSX0JBTkRfMl80X0dIWiA9PSByZl9iYW5kKQorCQlhcF9iZWFjb25fcHJvY2Vzc18yNF9naHoobWFjX2N0eCwgcnhfcGt0X2luZm8sIGJjbl9zdHJ1Y3QsCisJCQkJCSBiY25fcHJtLCBzZXNzaW9uLCBwaHlfbW9kZSk7CisJbWFjX2N0eC0+c2NoLmdTY2hCY25JZ25vcmVkKys7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogX19zY2hfYmVhY29uX3Byb2Nlc3Nfbm9fc2Vzc2lvbgorICoKKyAqIEZVTkNUSU9OOgorICogUHJvY2VzcyB0aGUgcmVjZWl2ZWQgYmVhY29uIGZyYW1lIHdoZW4KKyAqICAtLSBTdGF0aW9uIGlzIG5vdCBzY2FubmluZworICogIC0tIE5vIGNvcnJlc3BvbmRpbmcgc2Vzc2lvbiBpcyBmb3VuZAorICoKKyAqIExPR0lDOgorICogICAgICAgIEZvbGxvd2luZyBzY2VuYXJpb3MgZXhpc3Qgd2hlbiBTZXNzaW9uIERvZXMgbm90IGV4aXN0OgorICogICAgICAgICAgICAgKiBJQlNTIEJlYWNvbnMsIHdoZW4gSUJTUyBzZXNzaW9uIGFscmVhZHkgZXhpc3RzIHdpdGggc2FtZSBTU0lELAorICogICAgICAgICAgICAgICAgYnV0IGZyb20gU1RBIHdoaWNoIGhhcyBub3QgeWV0IGpvaW5lZCBhbmQgaGFzIGEgZGlmZmVyZW50IEJTU0lELgorICogICAgICAgICAgICAgICAgLSBpbnZva2UgbGltX2hhbmRsZV9pYnNfc2NvYWxlc2Npbmcgd2l0aCB0aGUgc2Vzc2lvbiBjb250ZXh0IG9mIGV4aXN0aW5nIElCU1Mgc2Vzc2lvbi4KKyAqCisgKiAgICAgICAgICAgICAqIElCU1MgQmVhY29ucyB3aGVuIElCU1Mgc2Vzc2lvbiBkb2VzIG5vdCBleGlzdCwgb25seSBJbmZyYSBvciBCVC1BTVAgc2Vzc2lvbiBleGlzdHMsCisgKiAgICAgICAgICAgICAgICB0aGVuIHNhdmUgdGhlIGJlYWNvbiBpbiB0aGUgc2NhbiByZXN1bHRzIGFuZCB0aHJvdyBpdCBhd2F5LgorICoKKyAqICAgICAgICAgICAgICogSW5mcmEgQmVhY29ucworICogICAgICAgICAgICAgICAgLSBiZWFjb25zIHJlY2VpdmVkIHdoZW4gbm8gc2Vzc2lvbiBhY3RpdmUKKyAqICAgICAgICAgICAgICAgICAgICBzaG91bGQgbm90IGNvbWUgaGVyZSwgaXQgc2hvdWxkIGJlIGhhbmRsZWQgYXMgcGFydCBvZiBzY2FubmluZywKKyAqICAgICAgICAgICAgICAgICAgICBlbHNlIHRoZXkgc2hvdWxkIG5vdCBiZSBnZXR0aW5nIHJlY2VpdmVkLCBzaG91bGQgdXBkYXRlIHNjYW4gcmVzdWx0cyBhbmQgZHJvcCBpdCBpZiB0aGF0IGhhcHBlbnMuCisgKiAgICAgICAgICAgICAgICAtIGJlYWNvbnMgcmVjZWl2ZWQgd2hlbiBJQlNTIHNlc3Npb24gYWN0aXZlOgorICogICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBzY2FuIHJlc3VsdHMgYW5kIGRyb3AgaXQuCisgKiAgICAgICAgICAgICAgICAtIGJlYWNvbnMgcmVjZWl2ZWQgd2hlbiBJbmZyYSBzZXNzaW9uKFNUQSkgaXMgYWN0aXZlOgorICogICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBzY2FuIHJlc3VsdHMgYW5kIGRyb3AgaXQKKyAqICAgICAgICAgICAgICAgIC0gYmVhY29ucyByZWNlaXZlZCB3aGVuIEJULVNUQSBzZXNzaW9uIGlzIGFjdGl2ZToKKyAqICAgICAgICAgICAgICAgICAgICB1cGRhdGUgc2NhbiByZXN1bHRzIGFuZCBkcm9wIGl0LgorICogICAgICAgICAgICAgICAgLSBiZWFjb25zIHJlY2VpdmVkIHdoZW4gSW5mcmEvQlQtU1RBICBvciBJbmZyYS9JQlNTIGlzIGFjdGl2ZS4KKyAqICAgICAgICAgICAgICAgICAgICB1cGRhdGUgc2NhbiByZXN1bHRzIGFuZCBkcm9wIGl0LgorICoKKworICovCitzdGF0aWMgdm9pZCBfX3NjaF9iZWFjb25fcHJvY2Vzc19ub19zZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICB0cFNjaEJlYWNvblN0cnVjdCBwQmVhY29uLAorCQkJCQkgICAgdWludDhfdCAqcFJ4UGFja2V0SW5mbykKK3sKKwl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKworCWlmICgocHNlc3Npb25FbnRyeSA9IGxpbV9pc19pYnNzX3Nlc3Npb25fYWN0aXZlKHBNYWMpKSAhPSBOVUxMKSB7CisJCWxpbV9oYW5kbGVfaWJzc19jb2FsZXNjaW5nKHBNYWMsIHBCZWFjb24sIHBSeFBhY2tldEluZm8sCisJCQkJCSAgIHBzZXNzaW9uRW50cnkpOworCX0KKwkvKiBJZiBzdGF0aW9uKFNUQS9CVC1TVEEvQlQtQVAvSUJTUykgbW9kZSwgQWx3YXlzIHNhdmUgdGhlIGJlYWNvbiBpbiB0aGUgc2NhbiByZXN1bHRzLCBpZiBhdGxlYXN0IG9uZSBzZXNzaW9uIGlzIGFjdGl2ZSAqLworCS8qIHNjaF9iZWFjb25fcHJvY2Vzc05vU2Vzc2lvbiB3aWxsIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlcmUgaXMgYXRsZWFzdCBvbmUgc2Vzc2lvbiBhY3RpdmUsIHNvIG5vdCBjaGVja2luZyAqLworCS8qIGl0IGFnYWluIGhlcmUuICovCisJbGltX2NoZWNrX2FuZF9hZGRfYnNzX2Rlc2NyaXB0aW9uKHBNYWMsIHBCZWFjb24sIHBSeFBhY2tldEluZm8sIGZhbHNlLAorCQkJCQkgIGZhbHNlKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogZ2V0X29wZXJhdGluZ19jaGFubmVsX3dpZHRoKCkgLSBHZXQgb3BlcmF0aW5nIGNoYW5uZWwgd2lkdGgKKyAqIEBwU3RhRHMgLSBzdGF0aW9uIGVudHJ5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgb2VwcmF0aW5nIGNoYW5uZ2wgd2lkdGggYmFzZWQgb24KKyAqIHRoZSBzdXBwb3J0ZWQgY2hhbm5lbCB3aWR0aCBlbnRyeS4KKyAqCisgKiBSZXR1cm46IHRTaXJNYWNIVENoYW5uZWxXaWR0aCBvbiBzdWNjZXNzCisgKi8KK3RTaXJNYWNIVENoYW5uZWxXaWR0aCBnZXRfb3BlcmF0aW5nX2NoYW5uZWxfd2lkdGgodHBEcGhIYXNoTm9kZSBzdGFkcykKK3sKKwl0U2lyTWFjSFRDaGFubmVsV2lkdGggY2hfd2lkdGggPSBlSFRfQ0hBTk5FTF9XSURUSF8yME1IWjsKKworCWlmIChzdGFkcy0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID09CisJCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWikKKwkJY2hfd2lkdGggPSBlSFRfQ0hBTk5FTF9XSURUSF8xNjBNSFo7CisJZWxzZSBpZiAoc3RhZHMtPnZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9PQorCQkJV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF84MF9QTFVTXzgwTUhaKQorCQljaF93aWR0aCA9IGVIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWjsKKwllbHNlIGlmIChzdGFkcy0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID09CisJCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzgwTUhaKQorCQljaF93aWR0aCA9IGVIVF9DSEFOTkVMX1dJRFRIXzgwTUhaOworCWVsc2UgaWYgKHN0YWRzLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkKKwkJY2hfd2lkdGggPSBlSFRfQ0hBTk5FTF9XSURUSF80ME1IWjsKKwllbHNlCisJCWNoX3dpZHRoID0gZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFo7CisKKwlyZXR1cm4gY2hfd2lkdGg7Cit9CisKKy8qCisgKiBzY2hfYmNuX3Byb2Nlc3Nfc3RhX2J0X2FtcF9zdGEoKSAtIFByb2Nlc3MgdGhlIHJlY2VpdmVkIGJlYWNvbiBmcmFtZSBmb3Igc3RhLAorICogYnRfYW1wX3N0YQorICoKKyAqIEBtYWNfY3R4OiAgICAgICAgbWFjX2N0eAorICogQGJjbjogICAgICAgICAgICBiZWFjb24gc3RydWN0CisgKiBAcnhfcGt0X2luZm86ICAgIHJlY2VpdmVkIHBhY2tldCBpbmZvCisgKiBAc2Vzc2lvbjogICAgICAgIHBlIHNlc3Npb24gcG9pbnRlcgorICogQGJzc0lkeDogICAgICAgICBic3MgaW5kZXgKKyAqIEBiZWFjb25QYXJhbXM6ICAgdXBkYXRlIGJlYWNvbiBwYXJhbXMKKyAqIEBzZW5kUHJvYmVSZXE6ICAgb3V0IGZsYWcgdG8gaW5kaWNhdGUgaWYgcHJvYmUgcnNwIGlzIHRvIGJlIHNlbnQKKyAqIEBwTWg6ICAgICAgICAgICAgbWFjIGhlYWRlcgorICoKKyAqIFByb2Nlc3MgdGhlIHJlY2VpdmVkIGJlYWNvbiBmcmFtZSBmb3Igc3RhLCBidF9hbXBfc3RhCisgKgorICogUmV0dXJuOiBzdWNjZXNzIG9mIGZhaWx1cmUgb2Ygb3BlcmF0aW9uCisgKi8KK3N0YXRpYyBib29sCitzY2hfYmNuX3Byb2Nlc3Nfc3RhX2J0X2FtcF9zdGEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCSAgICAgICB0cFNjaEJlYWNvblN0cnVjdCBiY24sCisJCQkgICAgICAgdWludDhfdCAqcnhfcGt0X2luZm8sCisJCQkgICAgICAgdHBQRVNlc3Npb24gc2Vzc2lvbiwgdWludDhfdCAqYnNzSWR4LAorCQkJICAgICAgIHRVcGRhdGVCZWFjb25QYXJhbXMgKmJlYWNvblBhcmFtcywKKwkJCSAgICAgICB1aW50OF90ICpzZW5kUHJvYmVSZXEsIHRwU2lyTWFjTWdtdEhkciBwTWgpCit7CisJdWludDMyX3QgYmk7CisJdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworCS8qCisJICogIFRoaXMgaGFuZGxlcyB0d28gY2FzZXM6CisJICogIC0tIEluZnJhIFNUQSByZWNldmluZyBiZWFjb25zIGZyb20gQVAKKwkgKiAgLS0gQlRBTVBfU1RBIHJlY2V2aW5nIGJlYWNvbnMgZnJvbSBCVEFNUF9BUAorCSAqLworCS8qIEFsd2F5cyBzYXZlIHRoZSBiZWFjb24gaW50byBMSU0ncyBjYWNoZWQgc2NhbiByZXN1bHRzICovCisJbGltX2NoZWNrX2FuZF9hZGRfYnNzX2Rlc2NyaXB0aW9uKG1hY19jdHgsIGJjbiwgcnhfcGt0X2luZm8sCisJCQkJCSAgZmFsc2UsIGZhbHNlKTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIEJlYWNvbiByZWNlaXZlZCBmcm9tIHRoZSBBUCAgd2UncmUgY3VycmVudGx5IGFzc29jaWF0ZWQKKwkgKiB3aXRoLiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgaW4gQVAncyBjYXBhYmlsaXRpZXMKKwkgKi8KKwlpZiAoKHVpbnQ4X3QpIGJjbi0+Y2hhbm5lbE51bWJlciAhPSBzZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwpIHsKKwkJUEVMT0dFKHNjaF9sb2cobWFjX2N0eCwgTE9HRSwKKwkJICAgICAgIEZMKCJDaGFubmVsIENoYW5nZSBmcm9tICVkIC0tPiAlZCAtIElnbm9yaW5nIGJlYWNvbiEiKSwKKwkJICAgICAgIHNlc3Npb24tPmN1cnJlbnRPcGVyQ2hhbm5lbCwKKwkJICAgICAgIGJjbi0+Y2hhbm5lbE51bWJlcik7KQorCQlyZXR1cm4gZmFsc2U7CisJfQorCWxpbV9kZXRlY3RfY2hhbmdlX2luX2FwX2NhcGFiaWxpdGllcyhtYWNfY3R4LCBiY24sIHNlc3Npb24pOworCWlmIChsaW1fZ2V0X3N0YV9oYXNoX2Jzc2lkeChtYWNfY3R4LCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwgYnNzSWR4LAorCQkJCSAgICBzZXNzaW9uKSAhPSBlU0lSX1NVQ0NFU1MpCisJCXJldHVybiBmYWxzZTsKKworCWJlYWNvblBhcmFtcy0+YnNzSWR4ID0gKmJzc0lkeDsKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnNlc3Npb24tPmxhc3RCZWFjb25UaW1lU3RhbXAsCisJCQkodWludDhfdCAqKSBiY24tPnRpbWVTdGFtcCwgc2l6ZW9mKHVpbnQ2NF90KSk7CisJc2Vzc2lvbi0+bGFzdEJlYWNvbkR0aW1Db3VudCA9IGJjbi0+dGltLmR0aW1Db3VudDsKKwlzZXNzaW9uLT5sYXN0QmVhY29uRHRpbVBlcmlvZCA9IGJjbi0+dGltLmR0aW1QZXJpb2Q7CisJc2Vzc2lvbi0+Y3VycmVudEJzc0JlYWNvbkNudCsrOworCisJTVRSQUNFKG1hY190cmFjZShtYWNfY3R4LCBUUkFDRV9DT0RFX1JYX01HTVRfVFNGLAorCSAgICAgICBzZXNzaW9uLT5wZVNlc3Npb25JZCwgYmNuLT50aW1lU3RhbXBbMF0pOykKKwlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsIFRSQUNFX0NPREVfUlhfTUdNVF9UU0YsCisJICAgICAgIHNlc3Npb24tPnBlU2Vzc2lvbklkLCBiY24tPnRpbWVTdGFtcFsxXSk7KQorCisJLyogUmVhZCBiZWFjb24gaW50ZXJ2YWwgc2Vzc2lvbiBFbnRyeSAqLworCWJpID0gc2Vzc2lvbi0+YmVhY29uUGFyYW1zLmJlYWNvbkludGVydmFsOworCWlmIChiaSAhPSBiY24tPmJlYWNvbkludGVydmFsKSB7CisJCVBFTE9HMShzY2hfbG9nKG1hY19jdHgsIExPRzEsCisJCSAgICAgICBGTCgiQmVhY29uIGludGVydmFsIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIpLAorCQkgICAgICAgYmNuLT5iZWFjb25JbnRlcnZhbCwgYmkpOykKKworCQliaSA9IGJjbi0+YmVhY29uSW50ZXJ2YWw7CisJCXNlc3Npb24tPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbCA9ICh1aW50MTZfdCkgYmk7CisJCWJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fQkNOX0lOVEVSVkFMX0NIQU5HRUQ7CisJCWJlYWNvblBhcmFtcy0+YmVhY29uSW50ZXJ2YWwgPSAodWludDE2X3QpIGJpOworCX0KKworCWlmIChiY24tPmNmUHJlc2VudCkgeworCQljZmdfc2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHX0NGUF9QRVJJT0QsCisJCQkgICAgYmNuLT5jZlBhcmFtU2V0LmNmcFBlcmlvZCk7CisJCWxpbV9zZW5kX2NmX3BhcmFtcyhtYWNfY3R4LCAqYnNzSWR4LAorCQkJCSAgIGJjbi0+Y2ZQYXJhbVNldC5jZnBDb3VudCwKKwkJCQkgICBiY24tPmNmUGFyYW1TZXQuY2ZwUGVyaW9kKTsKKwl9CisKKwkvKiBObyBuZWVkIHRvIHNlbmQgRFRJTSBQZXJpb2QgYW5kIENvdW50IHRvIEhBTC9TTUFDICovCisJLyogU01BQyBhbHJlYWR5IHBhcnNlcyBUSU0gYml0LiAqLworCWlmIChiY24tPnRpbVByZXNlbnQpCisJCWNmZ19zZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfRFRJTV9QRVJJT0QsIGJjbi0+dGltLmR0aW1QZXJpb2QpOworCisJaWYgKG1hY19jdHgtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0KKwkJCVdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fRElTQUJMRSkKKwkJbGltX2RlY2lkZV9zdGFfcHJvdGVjdGlvbihtYWNfY3R4LCBiY24sIGJlYWNvblBhcmFtcywgc2Vzc2lvbik7CisKKwlpZiAoYmNuLT5lcnBQcmVzZW50KSB7CisJCWlmIChiY24tPmVycElFSW5mby5iYXJrZXJQcmVhbWJsZU1vZGUpCisJCQlsaW1fZW5hYmxlX3Nob3J0X3ByZWFtYmxlKG1hY19jdHgsIGZhbHNlLAorCQkJCQkJICBiZWFjb25QYXJhbXMsIHNlc3Npb24pOworCQllbHNlCisJCQlsaW1fZW5hYmxlX3Nob3J0X3ByZWFtYmxlKG1hY19jdHgsIHRydWUsCisJCQkJCQkgIGJlYWNvblBhcmFtcywgc2Vzc2lvbik7CisJfQorCWxpbV91cGRhdGVfc2hvcnRfc2xvdChtYWNfY3R4LCBiY24sIGJlYWNvblBhcmFtcywgc2Vzc2lvbik7CisKKwlwU3RhRHMgPSBkcGhfZ2V0X2hhc2hfZW50cnkobWFjX2N0eCwgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsCisJCQkJICAgICZzZXNzaW9uLT5kcGguZHBoSGFzaFRhYmxlKTsKKwlpZiAoKGJjbi0+d21lRWRjYVByZXNlbnQgJiYgKHNlc3Npb24tPmxpbVdtZUVuYWJsZWQpKQorCSAgICB8fCAoYmNuLT5lZGNhUHJlc2VudCAmJiAoc2Vzc2lvbi0+bGltUW9zRW5hYmxlZCkpKSB7CisJCWlmIChiY24tPmVkY2FQYXJhbXMucW9zSW5mby5jb3VudCAhPQorCQkgICAgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbVNldENvdW50KSB7CisJCQlpZiAoc2NoX2JlYWNvbl9lZGNhX3Byb2Nlc3MobWFjX2N0eCwgJmJjbi0+ZWRjYVBhcmFtcywKKwkJCQkJCSAgICBzZXNzaW9uKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCQlQRUxPR0Uoc2NoX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCSAgICAgICBGTCgiRURDQSBwYXJhbWV0ZXIgcHJvY2Vzc2luZyBlcnJvciIpKTspCisJCQl9IGVsc2UgaWYgKHBTdGFEcyAhPSBOVUxMKSB7CisJCQkJLyogSWYgbmVlZGVkLCBkb3duZ3JhZGUgdGhlIEVEQ0EgcGFyYW1ldGVycyAqLworCQkJCWxpbV9zZXRfYWN0aXZlX2VkY2FfcGFyYW1zKG1hY19jdHgsCisJCQkJCXNlc3Npb24tPmdMaW1FZGNhUGFyYW1zLCBzZXNzaW9uKTsKKwkJCQlsaW1fc2VuZF9lZGNhX3BhcmFtcyhtYWNfY3R4LAorCQkJCQlzZXNzaW9uLT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwKKwkJCQkJcFN0YURzLT5ic3NJZCk7CisJCQl9IGVsc2UgeworCQkJCVBFTE9HRShzY2hfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJICAgICAgIEZMKCJTZWxmIEVudHJ5IG1pc3NpbmcgaW4gSGFzaCBUYWJsZSIpKTspCisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJaWYgKChiY24tPnFvc0NhcGFiaWxpdHlQcmVzZW50ICYmIHNlc3Npb24tPmxpbVFvc0VuYWJsZWQpCisJICAgICYmIChiY24tPnFvc0NhcGFiaWxpdHkucW9zSW5mby5jb3VudCAhPQorCQlzZXNzaW9uLT5nTGltRWRjYVBhcmFtU2V0Q291bnQpKQorCQkqc2VuZFByb2JlUmVxID0gdHJ1ZTsKKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIHVwZGF0ZV9uc3MoKSAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSBOU1MKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlCisgKiBAc3RhX2RzOiBwb2ludGVyIHRvIHRwRHBoSGFzaE5vZGUKKyAqIEBiZWFjb246IHBvaW50ZXIgdG8gdHBTY2hCZWFjb25TdHJ1Y3QKKyAqIEBzZXNzaW9uX2VudHJ5OiBwb2ludGVyIHRvIHRwUEVTZXNzaW9uCisgKiBAbWdtdF9oZHI6IHBvaW50ZXIgdG8gdHBTaXJNYWNNZ210SGRyCisgKgorICogZnVuY3Rpb24gdG8gdXBkYXRlIE5TUworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHVwZGF0ZV9uc3ModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdHBEcGhIYXNoTm9kZSBzdGFfZHMsCisJCXRwU2NoQmVhY29uU3RydWN0IGJlYWNvbiwgdHBQRVNlc3Npb24gc2Vzc2lvbl9lbnRyeSwKKwkJdHBTaXJNYWNNZ210SGRyIG1nbXRfaGRyKQoreworCWlmIChzdGFfZHMtPnZodFN1cHBvcnRlZFJ4TnNzICE9IChiZWFjb24tPk9wZXJhdGluZ01vZGUucnhOU1MgKyAxKSkgeworCQlzdGFfZHMtPnZodFN1cHBvcnRlZFJ4TnNzID0KKwkJCWJlYWNvbi0+T3BlcmF0aW5nTW9kZS5yeE5TUyArIDE7CisJCWxpbV9zZXRfbnNzX2NoYW5nZShtYWNfY3R4LCBzZXNzaW9uX2VudHJ5LAorCQkJc3RhX2RzLT52aHRTdXBwb3J0ZWRSeE5zcywgc3RhX2RzLT5zdGFJbmRleCwKKwkJCW1nbXRfaGRyLT5zYSk7CisJfQorfQorCisvKgorICogc2NoX2Jjbl9wcm9jZXNzX3N0YV9idF9hbXBfc3RhX2lic3MoKSAtIFByb2Nlc3MgdGhlIHJlY2VpdmVkIGJlYWNvbiBmcmFtZQorICogZm9yIHN0YSwgYnRfYW1wX3N0YSBhbmQgaWJzcworICoKKyAqIEBtYWNfY3R4OiAgICAgICAgbWFjX2N0eAorICogQGJjbjogICAgICAgICAgICBiZWFjb24gc3RydWN0CisgKiBAcnhfcGt0X2luZm86ICAgIHJlY2VpdmVkIHBhY2tldCBpbmZvCisgKiBAc2Vzc2lvbjogICAgICAgIHBlIHNlc3Npb24gcG9pbnRlcgorICogQGJzc0lkeDogICAgICAgICBic3MgaW5kZXgKKyAqIEBiZWFjb25QYXJhbXM6ICAgdXBkYXRlIGJlYWNvbiBwYXJhbXMKKyAqIEBzZW5kUHJvYmVSZXE6ICAgb3V0IGZsYWcgdG8gaW5kaWNhdGUgaWYgcHJvYmUgcnNwIGlzIHRvIGJlIHNlbnQKKyAqIEBwTWg6ICAgICAgICAgICAgbWFjIGhlYWRlcgorICoKKyAqIFByb2Nlc3MgdGhlIHJlY2VpdmVkIGJlYWNvbiBmcmFtZSBmb3Igc3RhLCBidF9hbXBfc3RhIGFuZCBpYnNzCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitzY2hfYmNuX3Byb2Nlc3Nfc3RhX2J0X2FtcF9zdGFfaWJzcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCSAgICB0cFNjaEJlYWNvblN0cnVjdCBiY24sCisJCQkJICAgIHVpbnQ4X3QgKnJ4X3BrdF9pbmZvLAorCQkJCSAgICB0cFBFU2Vzc2lvbiBzZXNzaW9uLCB1aW50OF90ICpic3NJZHgsCisJCQkJICAgIHRVcGRhdGVCZWFjb25QYXJhbXMgKmJlYWNvblBhcmFtcywKKwkJCQkgICAgdWludDhfdCAqc2VuZFByb2JlUmVxLCB0cFNpck1hY01nbXRIZHIgcE1oKQoreworCXRwRHBoSGFzaE5vZGUgcFN0YURzID0gTlVMTDsKKwl1aW50MTZfdCBhaWQ7CisJdWludDhfdCBvcGVyTW9kZTsKKwl1aW50OF90IGNoV2lkdGggPSAwOworCXVpbnQ4X3QgY2JfbW9kZTsKKworCWlmIChSRl9DSEFOXzE0ID49IHNlc3Npb24tPmN1cnJlbnRPcGVyQ2hhbm5lbCkKKwkJY2JfbW9kZSA9IG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHo7CisJZWxzZQorCQljYl9tb2RlID0gbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGU1R0h6OworCS8qIGNoZWNrIGZvciBWSFQgY2FwYWJpbGl0eSAqLworCXBTdGFEcyA9IGRwaF9sb29rdXBfaGFzaF9lbnRyeShtYWNfY3R4LCBwTWgtPnNhLCAmYWlkLAorCQkJJnNlc3Npb24tPmRwaC5kcGhIYXNoVGFibGUpOworCWlmICgoTlVMTCA9PSBwU3RhRHMpIHx8CisJCQkoV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFID09IGNiX21vZGUpKQorCQlyZXR1cm47CisKKwlpZiAoc2Vzc2lvbi0+dmh0Q2FwYWJpbGl0eSAmJiBiY24tPk9wZXJhdGluZ01vZGUucHJlc2VudCkgeworCQlvcGVyTW9kZSA9IGdldF9vcGVyYXRpbmdfY2hhbm5lbF93aWR0aChwU3RhRHMpOworCQlpZiAob3Blck1vZGUgPT0gYmNuLT5PcGVyYXRpbmdNb2RlLmNoYW5XaWR0aCkKKwkJCXJldHVybjsKKworCQlQRUxPR0Uoc2NoX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkgICAgICAgRkwoInJlY2VpdmVkIE9wTW9kZSBDaGFud2lkdGggJWQsIHN0YUlkeCA9ICVkIiksCisJCSAgICAgICBiY24tPk9wZXJhdGluZ01vZGUuY2hhbldpZHRoLCBwU3RhRHMtPnN0YUluZGV4KTspCisJCVBFTE9HRShzY2hfbG9nKG1hY19jdHgsIExPR0UsCisJCSAgICAgICBGTCgiTUFDIC0gJTB4OiUweDolMHg6JTB4OiUweDolMHgiKSwKKwkJICAgICAgIHBNaC0+c2FbMF0sIHBNaC0+c2FbMV0sCisJCSAgICAgICBwTWgtPnNhWzJdLCBwTWgtPnNhWzNdLAorCQkgICAgICAgcE1oLT5zYVs0XSwgcE1oLT5zYVs1XSk7KQorCisJCWlmIChiY24tPk9wZXJhdGluZ01vZGUuY2hhbldpZHRoID09CisJCQllSFRfQ0hBTk5FTF9XSURUSF8xNjBNSFopIHsKKwkJCVBFTE9HRShzY2hfbG9nKG1hY19jdHgsIExPR0UsCisJCQkgICAgICAgRkwoIlVwZGF0aW5nIHRoZSBDSCBXaWR0aCB0byAxNjBNSHoiKSk7KQorCQkJcFN0YURzLT52aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCVdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfMTYwTUhaOworCQkJcFN0YURzLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFo7CisJCX0gZWxzZSBpZiAoYmNuLT5PcGVyYXRpbmdNb2RlLmNoYW5XaWR0aCA9PQorCQkJZUhUX0NIQU5ORUxfV0lEVEhfODBNSFopIHsKKwkJCVBFTE9HRShzY2hfbG9nKG1hY19jdHgsIExPR0UsCisJCQkgICAgICAgRkwoIlVwZGF0aW5nIHRoZSBDSCBXaWR0aCB0byA4ME1IeiIpKTspCisJCQlwU3RhRHMtPnZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkJV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF84ME1IWjsKKwkJCXBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaOworCQl9IGVsc2UgaWYgKGJjbi0+T3BlcmF0aW5nTW9kZS5jaGFuV2lkdGggPT0KKwkJCWVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaKSB7CisJCQlQRUxPR0Uoc2NoX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJICAgICAgIEZMKCJVcGRhdGluZyB0aGUgQ0ggV2lkdGggdG8gNDBNSHoiKSk7KQorCQkJcFN0YURzLT52aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCVdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfMjBfNDBNSFo7CisJCQlwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQllSFRfQ0hBTk5FTF9XSURUSF80ME1IWjsKKwkJfSBlbHNlIGlmIChiY24tPk9wZXJhdGluZ01vZGUuY2hhbldpZHRoID09CisJCQllSFRfQ0hBTk5FTF9XSURUSF8yME1IWikgeworCQkJUEVMT0dFKHNjaF9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCSAgICAgICBGTCgiVXBkYXRpbmcgdGhlIENIIFdpZHRoIHRvIDIwTUh6IikpOykKKwkJCXBTdGFEcy0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzIwXzQwTUhaOworCQkJcFN0YURzLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQkJZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFo7CisJCX0KKwkJbGltX2NoZWNrX3ZodF9vcF9tb2RlX2NoYW5nZShtYWNfY3R4LCBzZXNzaW9uLAorCQkJCWJjbi0+T3BlcmF0aW5nTW9kZS5jaGFuV2lkdGgsCisJCQkJcFN0YURzLT5zdGFJbmRleCwgcE1oLT5zYSk7CisJCXVwZGF0ZV9uc3MobWFjX2N0eCwgcFN0YURzLCBiY24sIHNlc3Npb24sIHBNaCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShzZXNzaW9uLT52aHRDYXBhYmlsaXR5ICYmIGJjbi0+VkhUT3BlcmF0aW9uLnByZXNlbnQpKQorCQlyZXR1cm47CisKKwlvcGVyTW9kZSA9IHBTdGFEcy0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworCWlmIChvcGVyTW9kZSA9PSBiY24tPlZIVE9wZXJhdGlvbi5jaGFuV2lkdGgpCisJCXJldHVybjsKKworCVBFTE9HRShzY2hfbG9nKG1hY19jdHgsIExPR0UsCisJICAgICAgIEZMKCJyZWNlaXZlZCBWSFRPUCBDSFdpZHRoICVkIHN0YUlkeCA9ICVkIiksCisJICAgICAgIGJjbi0+VkhUT3BlcmF0aW9uLmNoYW5XaWR0aCwgcFN0YURzLT5zdGFJbmRleCk7KQorCVBFTE9HRShzY2hfbG9nKG1hY19jdHgsIExPR0UsCisJICAgICAgIEZMKCIgTUFDIC0gJTB4OiUweDolMHg6JTB4OiUweDolMHgiKSwKKwkgICAgICAgcE1oLT5zYVswXSwgcE1oLT5zYVsxXSwKKwkgICAgICAgcE1oLT5zYVsyXSwgcE1oLT5zYVszXSwKKwkgICAgICAgcE1oLT5zYVs0XSwgcE1oLT5zYVs1XSk7KQorCisJaWYgKGJjbi0+VkhUT3BlcmF0aW9uLmNoYW5XaWR0aCA9PQorCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWikgeworCQlQRUxPR0Uoc2NoX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIlVwZGF0aW5nIHRoZSBDSCBXaWR0aCB0byAxNjBNSHoiKSk7KQorCQlwU3RhRHMtPnZodFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWjsKKwkJcFN0YURzLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9CisJCQllSFRfQ0hBTk5FTF9XSURUSF80ME1IWjsKKwkJY2hXaWR0aCA9IGVIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWjsKKwl9IGVsc2UgaWYgKGJjbi0+VkhUT3BlcmF0aW9uLmNoYW5XaWR0aCA9PQorCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzgwX1BMVVNfODBNSFopIHsKKwkJUEVMT0dFKHNjaF9sb2cobWFjX2N0eCwgTE9HRSwKKwkJICAgICAgIEZMKCJVcGRhdGluZyB0aGUgQ0ggV2lkdGggdG8gMTYwTUh6IikpOykKKwkJcFN0YURzLT52aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF84MF9QTFVTXzgwTUhaOworCQlwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0gZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFo7CisJCWNoV2lkdGggPSBlSFRfQ0hBTk5FTF9XSURUSF8xNjBNSFo7CisJfSBlbHNlIGlmIChiY24tPlZIVE9wZXJhdGlvbi5jaGFuV2lkdGggPT0KKwkJV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF84ME1IWikgeworCQlQRUxPR0Uoc2NoX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkgICAgICAgRkwoIlVwZGF0aW5nIHRoZSBDSCBXaWR0aCB0byA4ME1IeiIpKTspCisJCXBTdGFEcy0+dmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJCVdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfODBNSFo7CisJCXBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPSBlSFRfQ0hBTk5FTF9XSURUSF80ME1IWjsKKwkJY2hXaWR0aCA9IGVIVF9DSEFOTkVMX1dJRFRIXzgwTUhaOworCX0gZWxzZSBpZiAoYmNuLT5WSFRPcGVyYXRpb24uY2hhbldpZHRoID09CisJCVdOSV9DRkdfVkhUX0NIQU5ORUxfV0lEVEhfMjBfNDBNSFopIHsKKwkJcFN0YURzLT52aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF8yMF80ME1IWjsKKwkJaWYgKGJjbi0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgeworCQkJUEVMT0dFKHNjaF9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCSAgICAgICBGTCgiVXBkYXRpbmcgdGhlIENIIFdpZHRoIHRvIDQwTUh6IikpOykKKwkJCXBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaOworCQkJY2hXaWR0aCA9IGVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaOworCQl9IGVsc2UgeworCQkJUEVMT0dFKHNjaF9sb2cobWFjX2N0eCwgTE9HRSwKKwkJCSAgICAgICBGTCgiVXBkYXRpbmcgdGhlIENIIFdpZHRoIHRvIDIwTUh6IikpOykKKwkJCXBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaOworCQkJY2hXaWR0aCA9IGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaOworCQl9CisJfQorCWxpbV9jaGVja192aHRfb3BfbW9kZV9jaGFuZ2UobWFjX2N0eCwgc2Vzc2lvbiwgY2hXaWR0aCwKKwkJCQkJcFN0YURzLT5zdGFJbmRleCwgcE1oLT5zYSk7CisJcmV0dXJuOworfQorCisvKgorICogX19zY2hfYmVhY29uX3Byb2Nlc3NfZm9yX3Nlc3Npb24oKSAtIFByb2Nlc3MgdGhlIHJlY2VpdmVkIGJlYWNvbiBmcmFtZSB3aGVuCisgKiBzdGF0aW9uIGlzIG5vdCBzY2FubmluZyBhbmQgY29ycmVzcG9uZGluZyBzZXNzaW9uIGlzIGZvdW5kCisgKgorICoKKyAqIEBtYWNfY3R4OiAgICAgICAgbWFjX2N0eAorICogQGJjbjogICAgICAgICAgICBiZWFjb24gc3RydWN0CisgKiBAcnhfcGt0X2luZm86ICAgIHJlY2VpdmVkIHBhY2tldCBpbmZvCisgKiBAc2Vzc2lvbjogICAgICAgIHBlIHNlc3Npb24gcG9pbnRlcgorICoKKyAqIEZvbGxvd2luZyBzY2VuYXJpb3MgZXhpc3Qgd2hlbiBTZXNzaW9uIGV4aXN0cworICogICBJQlNTIFNUQSByZWNldmluZyBiZWFjb25zIGZyb20gSUJTUyBQZWVycywgd2hvIGFyZSBwYXJ0IG9mIElCU1MuCisgKiAgICAgLSBjYWxsIGxpbV9oYW5kbGVfaWJzX3Njb2FsZXNjaW5nIHdpdGggdGhhdCBzZXNzaW9uIGNvbnRleHQuCisgKiAgIEluZnJhIFNUQSByZWNldmluZyBiZWFjb25zIGZyb20gQVAgdG8gd2hpY2ggaXQgaXMgY29ubmVjdGVkCisgKiAgICAgLSBjYWxsIHNjaF9iZWFjb25fcHJvY2Vzc0Zyb21BUCB3aXRoIHRoYXQgc2Vzc2lvbidzIGNvbnRleHQuCisgKiAgIEJUQU1QIFNUQSByZWNldmluZyBiZWFjb25zIGZyb20gQlRBTVAgQVAKKyAqICAgICAtIGNhbGwgc2NoX2JlYWNvbl9wcm9jZXNzRnJvbUFQIHdpdGggdGhhdCBzZXNzaW9uJ3MgY29udGV4dC4KKyAqICAgQlRBTVAgQVAgcmVjZWl2aW5nIGJlYWNvbnMgZnJvbSBCVEFNUCBTVEEKKyAqICAgICAoaGVyZSBuZWVkIHRvIG1ha2Ugc3VyZSBCVEFQIGNyZWF0ZXMgc2Vzc2lvbiBlbnRyeSBmb3IgQlQgU1RBKQorICogICAgIC0ganVzdCB1cGRhdGUgdGhlIGJlYWNvbiBjb3VudCBmb3IgaGVhcnQgYmVhdCBwdXJwb3NlcyBmb3Igbm93LAorICogICAgICAgZm9yIG5vdywgZG9uJ3QgcHJvY2VzcyB0aGUgYmVhY29uLgorICogICBJbmZyYS9JQlNTIGJvdGggYWN0aXZlIGFuZCByZWNlaXZlcyBJQlNTIGJlYWNvbjoKKyAqICAgICAtIGNhbGwgbGltX2hhbmRsZV9pYnNfc2NvYWxlc2Npbmcgd2l0aCB0aGF0IHNlc3Npb24gY29udGV4dC4KKyAqICAgSW5mcmEvSUJTUyBib3RoIGFjdGl2ZSBhbmQgcmVjZWl2ZXMgSW5mcmEgYmVhY29uOgorICogICAgIC0gY2FsbCBzY2hfYmVhY29uX3Byb2Nlc3NGcm9tQVAgd2l0aCB0aGF0IHNlc3Npb24ncyBjb250ZXh0LgorICogICAgICAgIGFueSB1cGRhdGVzIHRvIEVEQ0EgcGFyYW1ldGVycyB3aWxsIGJlIGVmZmVjdGl2ZSBmb3IgSUJTUyBhcyB3ZWxsLAorICogICAgICAgIGV2ZW4gdGhvdWdoIG5vIFdNTSBmb3IgSUJTUyA/PyBOZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGhhbmRsZQorICogICAgICAgIHRoaXMgc2NlbmFyaW8uCisgKiAgIEluZnJhL0JUU1RBIGJvdGggYWN0aXZlIGFuZCByZWNlaXZlIEluZnJhIGJlYWNvbi4KKyAqICAgICAtIGNoYW5nZSBpbiBFRENBIHBhcmFtZXRlcnMgb24gSW5mcmEgYWZmZWN0IHRoZSBCVFNUQSBsaW5rLgorICogICAgICAgIFVwZGF0ZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIG9uIEJUIGxpbmsKKyAqICAgSW5mcmEvQlRTVEEgYm90aCBhY3RpdmUgYW5kIHJlY2VpdmUgQlQtQVAgYmVhY29uLgorICogICAgIC0gdXBkYXRlIGJlYWNvbiBjbnQgZm9yIGhlYXJ0YmVhdAorICogICBJbmZyYS9CVEFQIGJvdGggYWN0aXZlIGFuZCByZWNlaXZlIEluZnJhIGJlYWNvbi4KKyAqICAgICAtIEJULUFQIHN0YXJ0cyBhZHZlcnRpc2luZyBCRSBwYXJhbWV0ZXJzIGZyb20gSW5mcmEgQVAsIGlmIHRoZXkgZ2V0CisgKiAgICAgICBjaGFuZ2VkLgorICogICBJbmZyYS9CVEFQIGJvdGggYWN0aXZlIGFuZCByZWNlaXZlIEJUU1RBIGJlYWNvbi4KKyAqICAgICAgIC0gdXBkYXRlIGJlYWNvbiBjbnQgZm9yIGhlYXJ0YmVhdAorICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgdm9pZCBfX3NjaF9iZWFjb25fcHJvY2Vzc19mb3Jfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQkgICAgIHRwU2NoQmVhY29uU3RydWN0IGJjbiwKKwkJCQkJICAgICB1aW50OF90ICpyeF9wa3RfaW5mbywKKwkJCQkJICAgICB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXRQb3dlcmRCbSBsb2NhbFJSTUNvbnN0cmFpbnQgPSAwOworCXVpbnQ4X3QgYnNzSWR4ID0gMDsKKwl0VXBkYXRlQmVhY29uUGFyYW1zIGJlYWNvblBhcmFtczsKKwl1aW50OF90IHNlbmRQcm9iZVJlcSA9IGZhbHNlOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJdHBTaXJNYWNNZ210SGRyIHBNaCA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihyeF9wa3RfaW5mbyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIEZFQVRVUkVfV0xBTl9FU0UgfHwgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJdFBvd2VyZEJtIHJlZ01heCA9IDAsIG1heFR4UG93ZXIgPSAwOworI2VuZGlmCisJY2RmX21lbV96ZXJvKCZiZWFjb25QYXJhbXMsIHNpemVvZih0VXBkYXRlQmVhY29uUGFyYW1zKSk7CisJYmVhY29uUGFyYW1zLnBhcmFtQ2hhbmdlQml0bWFwID0gMDsKKworCWlmIChMSU1fSVNfSUJTU19ST0xFKHNlc3Npb24pKSB7CisJCWxpbV9oYW5kbGVfaWJzc19jb2FsZXNjaW5nKG1hY19jdHgsIGJjbiwgcnhfcGt0X2luZm8sIHNlc3Npb24pOworCX0gZWxzZSBpZiAoTElNX0lTX1NUQV9ST0xFKHNlc3Npb24pCisJICAgIHx8IExJTV9JU19CVF9BTVBfU1RBX1JPTEUoc2Vzc2lvbikpIHsKKwkJaWYgKGZhbHNlID09IHNjaF9iY25fcHJvY2Vzc19zdGFfYnRfYW1wX3N0YShtYWNfY3R4LCBiY24sCisJCQkJcnhfcGt0X2luZm8sIHNlc3Npb24sICZic3NJZHgsCisJCQkJJmJlYWNvblBhcmFtcywgJnNlbmRQcm9iZVJlcSwgcE1oKSkKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoc2Vzc2lvbi0+aHRDYXBhYmlsaXR5ICYmIGJjbi0+SFRJbmZvLnByZXNlbnQpCisJCWxpbV91cGRhdGVfc3RhX3J1bl90aW1lX2h0X3N3aXRjaF9jaG5sX3BhcmFtcyhtYWNfY3R4LAorCQkJCQkJJmJjbi0+SFRJbmZvLCBic3NJZHgsIHNlc3Npb24pOworCisJaWYgKExJTV9JU19TVEFfUk9MRShzZXNzaW9uKQorCSAgICB8fCBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHNlc3Npb24pCisJICAgIHx8IExJTV9JU19JQlNTX1JPTEUoc2Vzc2lvbikpIHsKKwkJLyogQ2hhbm5lbCBTd2l0Y2ggaW5mb3JtYXRpb24gZWxlbWVudCB1cGRhdGVkICovCisJCWlmIChiY24tPmNoYW5uZWxTd2l0Y2hQcmVzZW50KSB7CisJCQlsaW1fdXBkYXRlX2NoYW5uZWxfc3dpdGNoKG1hY19jdHgsIGJjbiwgc2Vzc2lvbik7CisJCX0gZWxzZSBpZiAoc2Vzc2lvbi0+Z0xpbVNwZWNNZ210LmRvdDExaENoYW5Td1N0YXRlID09CisJCQkJZUxJTV8xMUhfQ0hBTlNXX1JVTk5JTkcpIHsKKwkJCWxpbV9jYW5jZWxfZG90MTFoX2NoYW5uZWxfc3dpdGNoKG1hY19jdHgsIHNlc3Npb24pOworCQl9CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKExJTV9JU19TVEFfUk9MRShzZXNzaW9uKQorCSAgICB8fCBMSU1fSVNfQlRfQU1QX1NUQV9ST0xFKHNlc3Npb24pCisJICAgIHx8IExJTV9JU19JQlNTX1JPTEUoc2Vzc2lvbikpCisJCXNjaF9iY25fcHJvY2Vzc19zdGFfYnRfYW1wX3N0YV9pYnNzKG1hY19jdHgsIGJjbiwKKwkJCQkJcnhfcGt0X2luZm8sIHNlc3Npb24sICZic3NJZHgsCisJCQkJCSZiZWFjb25QYXJhbXMsICZzZW5kUHJvYmVSZXEsIHBNaCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRkkpCisJLyogT2J0YWluIHRoZSBNYXggVHggcG93ZXIgZm9yIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgICovCisJcmVnTWF4ID0gY2ZnX2dldF9yZWd1bGF0b3J5X21heF90cmFuc21pdF9wb3dlcihtYWNfY3R4LAorCQkJCQlzZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlpZiAobWFjX2N0eC0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGUKKwkgICAgJiYgYmNuLT5wb3dlckNvbnN0cmFpbnRQcmVzZW50KQorCQlsb2NhbFJSTUNvbnN0cmFpbnQgPQorCQkJYmNuLT5sb2NhbFBvd2VyQ29uc3RyYWludC5sb2NhbFBvd2VyQ29uc3RyYWludHM7CisJZWxzZQorCQlsb2NhbFJSTUNvbnN0cmFpbnQgPSAwOworCW1heFR4UG93ZXIgPSBsaW1fZ2V0X21heF90eF9wb3dlcihyZWdNYXgsIHJlZ01heCAtIGxvY2FsUlJNQ29uc3RyYWludCwKKwkJCQkJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5uVHhQb3dlckNhcCk7CisjZWxpZiBkZWZpbmVkIEZFQVRVUkVfV0xBTl9FU0UKKwltYXhUeFBvd2VyID0gcmVnTWF4OworI2VuZGlmCisKKyNpZiBkZWZpbmVkIEZFQVRVUkVfV0xBTl9FU0UKKwlpZiAoc2Vzc2lvbi0+aXNFU0Vjb25uZWN0aW9uKSB7CisJCXRQb3dlcmRCbSBsb2NhbEVTRUNvbnN0cmFpbnQgPSAwOworCQlpZiAoYmNuLT5lc2VUeFB3ci5wcmVzZW50KSB7CisJCQlsb2NhbEVTRUNvbnN0cmFpbnQgPSBiY24tPmVzZVR4UHdyLnBvd2VyX2xpbWl0OworCQkJbWF4VHhQb3dlciA9IGxpbV9nZXRfbWF4X3R4X3Bvd2VyKG1heFR4UG93ZXIsCisJCQkJCWxvY2FsRVNFQ29uc3RyYWludCwKKwkJCQkJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5uVHhQb3dlckNhcCk7CisJCX0KKwkJc2NoX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIlJlZ01heCA9ICVkLCBsb2NhbEVzZUNvbnMgPSAlZCwgTWF4VHggPSAlZCIpLAorCQkJcmVnTWF4LCBsb2NhbEVTRUNvbnN0cmFpbnQsIG1heFR4UG93ZXIpOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSSkKKwkvKiBJZiBtYXhUeFBvd2VyIGlzIGluY3JlYXNlZCBvciBkZWNyZWFzZWQgKi8KKwlpZiAobWF4VHhQb3dlciAhPSBzZXNzaW9uLT5tYXhUeFBvd2VyKSB7CisJCXNjaF9sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJMb2NhbCBwb3dlciBjb25zdHJhaW50IGNoYW5nZS4udXBkYXRpbmcgbmV3IG1heFR4IHBvd2VyICVkIHRvIEhBTCIpLAorCQkJbWF4VHhQb3dlcik7CisJCWlmIChsaW1fc2VuZF9zZXRfbWF4X3R4X3Bvd2VyX3JlcShtYWNfY3R4LCBtYXhUeFBvd2VyLCBzZXNzaW9uKQorCQkgICAgPT0gZVNJUl9TVUNDRVNTKQorCQkJc2Vzc2lvbi0+bWF4VHhQb3dlciA9IG1heFR4UG93ZXI7CisJfQorI2VuZGlmCisKKwkvKiBJbmRpY2F0ZSB0byBMSU0gdGhhdCBCZWFjb24gaXMgcmVjZWl2ZWQgKi8KKwlpZiAoYmNuLT5IVEluZm8ucHJlc2VudCkKKwkJbGltX3JlY2VpdmVkX2hiX2hhbmRsZXIobWFjX2N0eCwKKwkJCQkodWludDhfdCkgYmNuLT5IVEluZm8ucHJpbWFyeUNoYW5uZWwsIHNlc3Npb24pOworCWVsc2UKKwkJbGltX3JlY2VpdmVkX2hiX2hhbmRsZXIobWFjX2N0eCwgKHVpbnQ4X3QpIGJjbi0+Y2hhbm5lbE51bWJlciwKKwkJCQlzZXNzaW9uKTsKKworCS8qCisJICogSSBkb24ndCBrbm93IGlmIGFueSBhZGRpdGlvbmFsIElFIGlzIHJlcXVpcmVkIGhlcmUuIEN1cnJlbnRseSwgbm90CisJICogaW5jbHVkZSBhZGRJRS4KKwkgKi8KKwlpZiAoc2VuZFByb2JlUmVxKQorCQlsaW1fc2VuZF9wcm9iZV9yZXFfbWdtdF9mcmFtZShtYWNfY3R4LCAmc2Vzc2lvbi0+c3NJZCwKKwkJCXNlc3Npb24tPmJzc0lkLCBzZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWwsCisJCQlzZXNzaW9uLT5zZWxmTWFjQWRkciwgc2Vzc2lvbi0+ZG90MTFtb2RlLCAwLCBOVUxMKTsKKworCWlmICgoZmFsc2UgPT0gbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uaXNfZGZzX2NhY190aW1lcl9ydW5uaW5nKQorCSAgICAmJiBiZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXApIHsKKwkJUEVMT0dXKHNjaF9sb2cobWFjX2N0eCwgTE9HVywKKwkJICAgICAgIEZMKCJCZWFjb24gZm9yIHNlc3Npb25bJWRdIGdvdCBjaGFuZ2VkLiIpLAorCQkgICAgICAgc2Vzc2lvbi0+cGVTZXNzaW9uSWQpOykKKwkJUEVMT0dXKHNjaF9sb2cobWFjX2N0eCwgTE9HVywKKwkJICAgICAgIEZMKCJzZW5kaW5nIGJlYWNvbiBwYXJhbSBjaGFuZ2UgYml0bWFwOiAweCV4ICIpLAorCQkgICAgICAgYmVhY29uUGFyYW1zLnBhcmFtQ2hhbmdlQml0bWFwKTspCisJCWxpbV9zZW5kX2JlYWNvbl9wYXJhbXMobWFjX2N0eCwgJmJlYWNvblBhcmFtcywgc2Vzc2lvbik7CisJfQorfQorCisvKioKKyAqIHNjaF9iZWFjb25fcHJvY2VzcygpIC0gcHJvY2VzcyB0aGUgYmVhY29uIGZyYW1lCisgKgorICogQG1hY19jdHg6ICAgICAgICBtYWMgZ2xvYmFsIGNvbnRleHQKKyAqIEByeF9wa3RfaW5mbzogIHBvaW50ZXIgdG8gYnVmZmVyIGRlc2NyaXB0b3IKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorc2NoX2JlYWNvbl9wcm9jZXNzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgKnJ4X3BrdF9pbmZvLAorCQkgICB0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXN0YXRpYyB0U2NoQmVhY29uU3RydWN0IGJjbjsKKwl0VXBkYXRlQmVhY29uUGFyYW1zIGJjbl9wcm07CisJdHBQRVNlc3Npb24gYXBfc2Vzc2lvbiA9IE5VTEw7CisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCXVpbnQ4X3QgaTsKKyNlbmRpZgorCisJY2RmX21lbV96ZXJvKCZiY25fcHJtLCBzaXplb2YodFVwZGF0ZUJlYWNvblBhcmFtcykpOworCWJjbl9wcm0ucGFyYW1DaGFuZ2VCaXRtYXAgPSAwOworCW1hY19jdHgtPnNjaC5nU2NoQmNuUmN2Q250Kys7CisJLyogQ29udmVydCB0aGUgYmVhY29uIGZyYW1lIGludG8gYSBzdHJ1Y3R1cmUgKi8KKwlpZiAoc2lyX2NvbnZlcnRfYmVhY29uX2ZyYW1lMl9zdHJ1Y3QobWFjX2N0eCwgKHVpbnQ4X3QgKikgcnhfcGt0X2luZm8sCisJCSZiY24pICE9IGVTSVJfU1VDQ0VTUykgeworCQlQRUxPR0Uoc2NoX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiYmVhY29uIHBhcnNpbmcgZmFpbGVkIikpOykKKwkJbWFjX2N0eC0+c2NoLmdTY2hCY25QYXJzZUVycm9yQ250Kys7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYmNuLnNzaWRQcmVzZW50KQorCQliY24uc3NJZC5zc0lkW2Jjbi5zc0lkLmxlbmd0aF0gPSAwOworCS8qCisJICogRmlyc3QgcHJvY2VzcyB0aGUgYmVhY29uIGluIHRoZSBjb250ZXh0IG9mIGFueSBleGlzdGluZyBBUCBvciBCVEFQCisJICogc2Vzc2lvbi4gVGhpcyB0YWtlcyBjYXJlcyBvZiBmb2xsb3dpbmcgdHdvIHNjZW5hcmlvczoKKwkgKiAgLSBzZXNzaW9uID0gTlVMTDoKKwkgKiBlLmcuIGJlYWNvbiByZWNlaXZlZCBmcm9tIGEgbmVpZ2hib3JpbmcgQlNTLCB5b3Ugd2FudCB0byBhcHBseSB0aGUKKwkgKiBwcm90ZWN0aW9uIHNldHRpbmdzIHRvIEJUQVAvSW5mcmFBUCBiZWFjb25zCisJICogIC0gc2Vzc2lvbiBpcyBub24gTlVMTDoKKwkgKiBlLmcuIGJlYWNvbiByZWNlaXZlZCBpcyBmcm9tIHRoZSBJTkZSQSBBUCB0byB3aGljaCB5b3UgYXJlIGNvbm5lY3RlZAorCSAqIG9uIGFub3RoZXIgY29uY3VycmVudCBsaW5rLiBJbiB0aGlzIGNhc2UgYWxzbywgd2Ugd2FudCB0byBhcHBseSB0aGUKKwkgKiBwcm90ZWN0aW9uIHNldHRpbmdzKGFzIGFkdmVydGlzZWQgYnkgSW5mcmEgQVApIHRvIEJUQVAgYmVhY29ucworCSAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwlmb3IgKGkgPSAwOyBpIDwgbWFjX2N0eC0+bGltLm1heEJzc0lkOyBpKyspIHsKKwkJYXBfc2Vzc2lvbiA9IHBlX2ZpbmRfc2Vzc2lvbl9ieV9zZXNzaW9uX2lkKG1hY19jdHgsIGkpOworCQlpZiAoISgoYXBfc2Vzc2lvbiAhPSBOVUxMKSAmJgorCQkJKCEoV01BX0dFVF9PRkZMT0FEU0NBTkxFQVJOKHJ4X3BrdF9pbmZvKSkpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghTElNX0lTX0FQX1JPTEUoYXBfc2Vzc2lvbikpCisJCQljb250aW51ZTsKKworCQliY25fcHJtLmJzc0lkeCA9IGFwX3Nlc3Npb24tPmJzc0lkeDsKKwkJaWYgKGFwX3Nlc3Npb24tPmdMaW1Qcm90ZWN0aW9uQ29udHJvbCAhPQorCQkgICAgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorCQkJYXBfYmVhY29uX3Byb2Nlc3MobWFjX2N0eCwgcnhfcGt0X2luZm8sCisJCQkJCSAgJmJjbiwgJmJjbl9wcm0sIGFwX3Nlc3Npb24pOworCisJCWlmICgoZmFsc2UgPT0gbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uaXNfZGZzX2NhY190aW1lcl9ydW5uaW5nKQorCQkgICAgJiYgYmNuX3BybS5wYXJhbUNoYW5nZUJpdG1hcCkgeworCQkJLyogVXBkYXRlIHRoZSBiY24gYW5kIGFwcGx5IHRoZSBuZXcgc2V0dGluZ3MgdG8gSEFMICovCisJCQlzY2hfc2V0X2ZpeGVkX2JlYWNvbl9maWVsZHMobWFjX2N0eCwgYXBfc2Vzc2lvbik7CisJCQlQRUxPRzEoc2NoX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJICAgICAgIEZMKCJCZWFjb24gZm9yIFBFIHNlc3Npb25bJWRdIGdvdCBjaGFuZ2VkLiIpLAorCQkJICAgICAgIGFwX3Nlc3Npb24tPnBlU2Vzc2lvbklkKTspCisJCQlQRUxPRzEoc2NoX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJICAgICAgIEZMKCJzZW5kaW5nIGJlYWNvbiBwYXJhbSBjaGFuZ2UgYml0bWFwOiAweCV4IiksCisJCQkgICAgICAgYmNuX3BybS5wYXJhbUNoYW5nZUJpdG1hcCk7KQorCQkJbGltX3NlbmRfYmVhY29uX3BhcmFtcyhtYWNfY3R4LCAmYmNuX3BybSwgYXBfc2Vzc2lvbik7CisJCX0KKwl9CisjZWxzZQorCWFwX3Nlc3Npb24gPSBsaW1faXNfYXBfc2Vzc2lvbl9hY3RpdmUobWFjX2N0eCk7CisJaWYgKChhcF9zZXNzaW9uICE9IE5VTEwpCisJICAgICYmICghKFdNQV9HRVRfT0ZGTE9BRFNDQU5MRUFSTihyeF9wa3RfaW5mbykpKSkgeworCQliY25fcHJtLmJzc0lkeCA9IGFwX3Nlc3Npb24tPmJzc0lkeDsKKwkJaWYgKGFwX3Nlc3Npb24tPmdMaW1Qcm90ZWN0aW9uQ29udHJvbCAhPQorCQkgICAgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorCQkJYXBfYmVhY29uX3Byb2Nlc3MobWFjX2N0eCwgcnhfcGt0X2luZm8sICZiY24sCisJCQkJCSAgJmJjbl9wcm0sIGFwX3Nlc3Npb24pOworCisJCWlmICgoZmFsc2UgPT0gbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uaXNfZGZzX2NhY190aW1lcl9ydW5uaW5nKQorCQkgICAgJiYgYmNuX3BybS5wYXJhbUNoYW5nZUJpdG1hcCkgeworCQkJLyogVXBkYXRlIHRoZSBiY24gYW5kIGFwcGx5IHRoZSBuZXcgc2V0dGluZ3MgdG8gSEFMICovCisJCQlzY2hfc2V0X2ZpeGVkX2JlYWNvbl9maWVsZHMobWFjX2N0eCwgYXBfc2Vzc2lvbik7CisJCQlQRUxPRzEoc2NoX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJICAgICAgIEZMKCJCZWFjb24gZm9yIFBFIHNlc3Npb25bJWRdIGdvdCBjaGFuZ2VkLiIpLAorCQkJICAgICAgIGFwX3Nlc3Npb24tPnBlU2Vzc2lvbklkKTspCisJCQlQRUxPRzEoc2NoX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJICAgICAgIEZMKCJzZW5kaW5nIGJlYWNvbiBwYXJhbSBjaGFuZ2UgYml0bWFwOiAweCV4ICIpLAorCQkJICAgICAgIGJjbl9wcm0ucGFyYW1DaGFuZ2VCaXRtYXApOykKKwkJCWxpbV9zZW5kX2JlYWNvbl9wYXJhbXMobWFjX2N0eCwgJmJjbl9wcm0sIGFwX3Nlc3Npb24pOworCQl9CisJfQorI2VuZGlmCisJLyoKKwkgKiBOb3cgcHJvY2VzcyB0aGUgYmVhY29uIGluIHRoZSBjb250ZXh0IG9mIHRoZSBCU1Mgd2hpY2ggaXMKKwkgKiB0cmFuc21pdHRpbmcgdGhlIGJlYWNvbnMsIGlmIG9uZSBpcyBmb3VuZAorCSAqLworCWlmIChzZXNzaW9uID09IE5VTEwpCisJCV9fc2NoX2JlYWNvbl9wcm9jZXNzX25vX3Nlc3Npb24obWFjX2N0eCwgJmJjbiwgcnhfcGt0X2luZm8pOworCWVsc2UKKwkJX19zY2hfYmVhY29uX3Byb2Nlc3NfZm9yX3Nlc3Npb24obWFjX2N0eCwgJmJjbiwgcnhfcGt0X2luZm8sCisJCQkJCQkgc2Vzc2lvbik7Cit9CisKKy8qKgorICogc2NoX2JlYWNvbl9lZGNhX3Byb2Nlc3MoKTogUHJvY2VzcyB0aGUgRURDQSBwYXJhbWV0ZXIgc2V0IGluIHRoZSByZWNlaXZlZAorICogYmVhY29uIGZyYW1lCisgKgorICogQG1hY19jdHg6ICAgIG1hYyBnbG9iYWwgY29udGV4dAorICogQGVkY2E6ICAgICAgIHJlZmVyZW5jZSB0byBlZGNhIHBhcmFtZXRlcnMgaW4gYmVhY29uIHN0cnVjdAorICogQHNlc3Npb24gOiAgIHBlc2Vzc2lvbiBlbnRyeQorICoKKyAqIEByZXR1cm4gc3RhdHVzIG9mIG9wZXJhdGlvbgorICovCit0U2lyUmV0U3RhdHVzCitzY2hfYmVhY29uX2VkY2FfcHJvY2Vzcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjRWRjYVBhcmFtU2V0SUUgKmVkY2EsCisJCQl0cFBFU2Vzc2lvbiBzZXNzaW9uKQoreworCXVpbnQ4X3QgaTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisJaG9zdF9sb2dfcW9zX2VkY2FfcGt0X3R5cGUgKmxvZ19wdHIgPSBOVUxMOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworCVBFTE9HMShzY2hfbG9nKHBNYWMsIExPRzEsCisJCUZMKCJVcGRhdGluZyBwYXJhbWV0ZXIgc2V0IGNvdW50OiBPbGQgJWQgLS0tPiBuZXcgJWQiKSwKKwkJc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbVNldENvdW50LCBlZGNhLT5xb3NJbmZvLmNvdW50KTspCisKKwlzZXNzaW9uLT5nTGltRWRjYVBhcmFtU2V0Q291bnQgPSBlZGNhLT5xb3NJbmZvLmNvdW50OworCXNlc3Npb24tPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfQkVdID0gZWRjYS0+YWNiZTsKKwlzZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX0JLXSA9IGVkY2EtPmFjYms7CisJc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19WSV0gPSBlZGNhLT5hY3ZpOworCXNlc3Npb24tPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfVk9dID0gZWRjYS0+YWN2bzsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisJV0xBTl9IT1NUX0RJQUdfTE9HX0FMTE9DKGxvZ19wdHIsIGhvc3RfbG9nX3Fvc19lZGNhX3BrdF90eXBlLAorCQkJCSBMT0dfV0xBTl9RT1NfRURDQV9DKTsKKwlpZiAobG9nX3B0cikgeworCQlsb2dfcHRyLT5hY2lfYmUgPSBzZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX0JFXS5hY2kuYWNpOworCQlsb2dfcHRyLT5jd19iZSA9CisJCQlzZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX0JFXS5jdy5tYXggPDwgNAorCQkJCXwgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19CRV0uY3cubWluOworCQlsb2dfcHRyLT50eG9wbGltaXRfYmUgPQorCQkJc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19CRV0udHhvcGxpbWl0OworCQlsb2dfcHRyLT5hY2lfYmsgPQorCQkJc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19CS10uYWNpLmFjaTsKKwkJbG9nX3B0ci0+Y3dfYmsgPQorCQkJc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19CS10uY3cubWF4IDw8IDQKKwkJCQl8IHNlc3Npb24tPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfQktdLmN3Lm1pbjsKKwkJbG9nX3B0ci0+dHhvcGxpbWl0X2JrID0KKwkJCXNlc3Npb24tPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfQktdLnR4b3BsaW1pdDsKKwkJbG9nX3B0ci0+YWNpX3ZpID0KKwkJCXNlc3Npb24tPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfVkldLmFjaS5hY2k7CisJCWxvZ19wdHItPmN3X3ZpID0KKwkJCXNlc3Npb24tPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfVkldLmN3Lm1heCA8PCA0CisJCQkJfCBzZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX1ZJXS5jdy5taW47CisJCWxvZ19wdHItPnR4b3BsaW1pdF92aSA9CisJCQlzZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX1ZJXS50eG9wbGltaXQ7CisJCWxvZ19wdHItPmFjaV92byA9CisJCQlzZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX1ZPXS5hY2kuYWNpOworCQlsb2dfcHRyLT5jd192byA9CisJCQlzZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX1ZPXS5jdy5tYXggPDwgNAorCQkJCXwgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19WT10uY3cubWluOworCQlsb2dfcHRyLT50eG9wbGltaXRfdm8gPQorCQkJc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19WT10udHhvcGxpbWl0OworCX0KKwlXTEFOX0hPU1RfRElBR19MT0dfUkVQT1JUKGxvZ19wdHIpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwlQRUxPRzEoc2NoX2xvZyhwTWFjLCBMT0dFLAorCSAgICAgICBGTCgiVXBkYXRpbmcgTG9jYWwgRURDQSBQYXJhbXMoZ0xpbUVkY2FQYXJhbXMpIHRvOiAiKSk7KQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0FDOyBpKyspIHsKKwkJUEVMT0cxKHNjaF9sb2cocE1hYywgTE9HMSwKKwkJICAgICAgIEZMKCJBQ1slZF06ICBBSUZTTjogJWQsIEFDTSAlZCwgQ1dtaW4gJWQsIENXbWF4ICVkLCBUeE9wICVkIiksCisJCSAgICAgICBpLCBzZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tpXS5hY2kuYWlmc24sCisJCSAgICAgICBzZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tpXS5hY2kuYWNtLAorCQkgICAgICAgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbaV0uY3cubWluLAorCQkgICAgICAgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbaV0uY3cubWF4LAorCQkgICAgICAgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbaV0udHhvcGxpbWl0KTspCisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvc2NoL3NjaF9kZWJ1Zy5jIGIvY29yZS9tYWMvc3JjL3BlL3NjaC9zY2hfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2MwNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3BlL3NjaC9zY2hfZGVidWcuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBzY2hfZGVidWcuY2MgY29udGFpbnMgc29tZSBkZWJ1ZyBmdW5jdGlvbnMuCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKyNpbmNsdWRlICJzY2hfZGVidWcuaCIKKyNkZWZpbmUgTE9HX1NJWkUgMjU2CisKK3ZvaWQgc2NoX2xvZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBsb2dsZXZlbCwgY29uc3QgY2hhciAqcFN0cmluZywgLi4uKQoreworCisJQ0RGX1RSQUNFX0xFVkVMIGNkZl9kZWJ1Z19sZXZlbDsKKwljaGFyIGxvZ0J1ZmZlcltMT0dfU0laRV07CisJdmFfbGlzdCBtYXJrZXI7CisKKwkvKiBnZXR0aW5nIHByb3BlciBEZWJ1ZyBsZXZlbCAqLworCWNkZl9kZWJ1Z19sZXZlbCA9IGdldF92b3NfZGVidWdfbGV2ZWwobG9nbGV2ZWwpOworCisJLyogZXh0cmFjdGluZyBhcmd1bWVudHMgZnJvbSBwc3RyaW5nICovCisJdmFfc3RhcnQobWFya2VyLCBwU3RyaW5nKTsKKwl2c25wcmludGYobG9nQnVmZmVyLCBMT0dfU0laRSwgcFN0cmluZywgbWFya2VyKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9QRSwgY2RmX2RlYnVnX2xldmVsLCAiJXMiLCBsb2dCdWZmZXIpOworCXZhX2VuZChtYXJrZXIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3BlL3NjaC9zY2hfZGVidWcuaCBiL2NvcmUvbWFjL3NyYy9wZS9zY2gvc2NoX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3ZjcyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9zY2gvc2NoX2RlYnVnLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGZpbGUgc2NoX2RlYnVnLmggY29udGFpbnMgc29tZSBkZWJ1ZyBtYWNyb3MuCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19TQ0hfREVCVUdfSF9fCisjZGVmaW5lIF9fU0NIX0RFQlVHX0hfXworCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAic2lyX2RlYnVnLmgiCisKKyNpZiAhZGVmaW5lZChfX3ByaW50ZikKKyNkZWZpbmUgX19wcmludGYoYSwgYikKKyNlbmRpZgorCit2b2lkIF9fcHJpbnRmKDMsIDQpIHNjaF9sb2codHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgbG9nbGV2ZWwsCisJCQkgICAgY29uc3QgY2hhciAqcFN0cmluZywgLi4uKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvc2NoL3NjaF9tZXNzYWdlLmMgYi9jb3JlL21hYy9zcmMvcGUvc2NoL3NjaF9tZXNzYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0NmY4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9zY2gvc2NoX21lc3NhZ2UuYwpAQCAtMCwwICsxLDU3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJzaXJfY29tbW9uLmgiCisKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJsaW1fYXBpLmgiCisjaW5jbHVkZSAibGltX3NlbmRfbWVzc2FnZXMuaCIKKworI2luY2x1ZGUgInNjaF9hcGkuaCIKKyNpbmNsdWRlICJzY2hfZGVidWcuaCIKKworLyogLyBNaW5pbXVtIGJlYWNvbiBpbnRlcnZhbCBhbGxvd2VkIChpbiBLdXMpICovCisjZGVmaW5lIFNDSF9CRUFDT05fSU5URVJWQUxfTUlOICAxMAorCisvKiAvIE1heGltdW0gYmVhY29uIGludGVydmFsIGFsbG93ZWQgKGluIEt1cykgKi8KKyNkZWZpbmUgU0NIX0JFQUNPTl9JTlRFUlZBTF9NQVggIDEwMDAwCisKKy8qIC8gY29udmVydCB0aGUgQ1cgdmFsdWVzIGludG8gYSB1aW50MTZfdCAqLworI2RlZmluZSBHRVRfQ1cocEN3KSAoKHVpbnQxNl90KSAoKCoocEN3KSA8PCA4KSArICooKHBDdykgKyAxKSkpCisKKy8qIGxvY2FsIGZ1bmN0aW9ucyAqLworc3RhdGljIHRTaXJSZXRTdGF0dXMgZ2V0X3dtbV9sb2NhbF9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICB1aW50MzJfdAorCQkJCQkgIHBhcmFtc1tdCisJCQkJCSAgW1dOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU5dKTsKK3N0YXRpYyB2b2lkIHNldF9zY2hfZWRjYV9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl1aW50MzJfdCBwYXJhbXNbXVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOXSwKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogc2NoX3NldF9iZWFjb25faW50ZXJ2YWwKKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHNjaF9zZXRfYmVhY29uX2ludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDMyX3QgYmk7CisKKwliaSA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbDsKKworCWlmIChiaSA8IFNDSF9CRUFDT05fSU5URVJWQUxfTUlOIHx8IGJpID4gU0NIX0JFQUNPTl9JTlRFUlZBTF9NQVgpIHsKKwkJc2NoX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkludmFsaWQgYmVhY29uIGludGVydmFsICVkIChzaG91bGQgYmUgWyVkLCVkXSIpLCBiaSwKKwkJCVNDSF9CRUFDT05fSU5URVJWQUxfTUlOLCBTQ0hfQkVBQ09OX0lOVEVSVkFMX01BWCk7CisJCXJldHVybjsKKwl9CisKKwlwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25JbnRlcnZhbCA9ICh1aW50MTZfdCkgYmk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHNjaF9wcm9jZXNzX21lc3NhZ2UKKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHNjaF9wcm9jZXNzX21lc3NhZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBTY2hNc2cpCit7CisJdWludDMyX3QgdmFsOworCisJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9ICZwTWFjLT5saW0uZ3BTZXNzaW9uWzBdOworCVBFTE9HMyhzY2hfbG9nKHBNYWMsIExPRzMsIEZMKCJSZWNlaXZlZCBtZXNzYWdlICgleCkgIiksIHBTY2hNc2ctPnR5cGUpOykKKworCXN3aXRjaCAocFNjaE1zZy0+dHlwZSkgeworCisJY2FzZSBTSVJfU0NIX0NIQU5ORUxfU1dJVENIX1JFUVVFU1Q6CisJCXNjaF9sb2cocE1hYywgTE9HRSwgRkwoIkNoYW5uZWwgc3dpdGNoIHJlcXVlc3Qgbm90IGhhbmRsZWQiKSk7CisJCWJyZWFrOworCisJY2FzZSBTSVJfU0NIX1NUQVJUX1NDQU5fUkVROgorCQlwTWFjLT5zY2guZ1NjaFNjYW5SZXFSY3ZkID0gdHJ1ZTsKKwkJaWYgKHBNYWMtPnNjaC5nU2NoSGNmRW5hYmxlZCkgeworCQkJLyogSW4gSENGIG1vZGUsIHdhaXQgZm9yIFRGUCB0byBzdG9wIGJlZm9yZSBzZW5kaW5nIGEgcmVzcG9uc2UgKi8KKwkJCWlmIChwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hDRkJJbml0aWF0ZWQgfHwKKwkJCSAgICBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hDRlBJbml0aWF0ZWQpIHsKKwkJCQlQRUxPRzEoc2NoX2xvZyhwTWFjLCBMT0cxLAorCQkJCQkgICAgICAgRkwKKwkJCQkJCSAgICAgICAoIldhaXRpbmcgZm9yIFRGUCB0byBoYWx0IGJlZm9yZSBzZW5kaW5nICIKKwkJCQkJCSAgICAgICAic3RhcnQgc2NhbiByZXNwb25zZSIpKTsKKwkJCQkgICAgICAgKQorCQkJfSBlbHNlCisJCQkJc2NoX3NlbmRfc3RhcnRfc2Nhbl9yc3AocE1hYyk7CisJCX0gZWxzZSB7CisJCQkvKiBJbiBlRENGIG1vZGUsIHNlbmQgdGhlIHJlc3BvbnNlIHJpZ2h0IGF3YXkgKi8KKwkJCXNjaF9zZW5kX3N0YXJ0X3NjYW5fcnNwKHBNYWMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTSVJfU0NIX0VORF9TQ0FOX05URjoKKwkJUEVMT0czKHNjaF9sb2cocE1hYywgTE9HMywKKwkJCSAgICAgICBGTCgiUmVjZWl2ZWQgU1RPUF9TQ0FOX05URiBmcm9tIExJTSIpKTsKKwkJICAgICAgICkKKwkJcE1hYy0+c2NoLmdTY2hTY2FuUmVxUmN2ZCA9IGZhbHNlOworCQlicmVhazsKKworCWNhc2UgU0lSX0NGR19QQVJBTV9VUERBVEVfSU5EOgorCisJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsICh1aW50MTZfdCkgcFNjaE1zZy0+Ym9keXZhbCwgJnZhbCkgIT0KKwkJICAgIGVTSVJfU1VDQ0VTUykKKwkJCXNjaF9sb2cocE1hYywgTE9HUCwgRkwoImZhaWxlZCB0byBjZmcgZ2V0IGlkICVkIiksCisJCQkJcFNjaE1zZy0+Ym9keXZhbCk7CisKKwkJc3dpdGNoIChwU2NoTXNnLT5ib2R5dmFsKSB7CisJCWNhc2UgV05JX0NGR19CRUFDT05fSU5URVJWQUw6CisJCQkvKiBXaGF0IHRvIGRvIGZvciBJQlNTID8/IC0gVEJEICovCisJCQlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpCisJCQkJc2NoX3NldF9iZWFjb25faW50ZXJ2YWwocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCQlicmVhazsKKworCQljYXNlIFdOSV9DRkdfRFRJTV9QRVJJT0Q6CisJCQlwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hEVElNQ291bnQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTklfQ0ZHX0NGUF9QRVJJT0Q6CisJCQlwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hDRlBDb3VudCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFdOSV9DRkdfRURDQV9QUk9GSUxFOgorCQkJc2NoX2VkY2FfcHJvZmlsZV91cGRhdGUocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCQlicmVhazsKKworCQljYXNlIFdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTDoKKwkJY2FzZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDQkVfTE9DQUw6CisJCWNhc2UgV05JX0NGR19FRENBX0FOSV9BQ1ZJX0xPQ0FMOgorCQljYXNlIFdOSV9DRkdfRURDQV9BTklfQUNWT19MT0NBTDoKKwkJY2FzZSBXTklfQ0ZHX0VEQ0FfV01FX0FDQktfTE9DQUw6CisJCWNhc2UgV05JX0NGR19FRENBX1dNRV9BQ0JFX0xPQ0FMOgorCQljYXNlIFdOSV9DRkdfRURDQV9XTUVfQUNWSV9MT0NBTDoKKwkJY2FzZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVk9fTE9DQUw6CisJCQlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpCisJCQkJc2NoX3Fvc191cGRhdGVfbG9jYWwocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCQlicmVhazsKKworCQljYXNlIFdOSV9DRkdfRURDQV9BTklfQUNCSzoKKwkJY2FzZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDQkU6CisJCWNhc2UgV05JX0NGR19FRENBX0FOSV9BQ1ZJOgorCQljYXNlIFdOSV9DRkdfRURDQV9BTklfQUNWTzoKKwkJY2FzZSBXTklfQ0ZHX0VEQ0FfV01FX0FDQks6CisJCWNhc2UgV05JX0NGR19FRENBX1dNRV9BQ0JFOgorCQljYXNlIFdOSV9DRkdfRURDQV9XTUVfQUNWSToKKwkJY2FzZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVk86CisJCQlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJCQlwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtU2V0Q291bnQrKzsKKwkJCQlzY2hfcW9zX3VwZGF0ZV9icm9hZGNhc3QocE1hYywgcHNlc3Npb25FbnRyeSk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc2NoX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJDZmcgcGFyYW0gJWQgaW5kaWNhdGlvbiBub3QgaGFuZGxlZCIpLAorCQkJCXBTY2hNc2ctPmJvZHl2YWwpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc2NoX2xvZyhwTWFjLCBMT0dFLCBGTCgiVW5rbm93biBtZXNzYWdlIGluIHNjaE1zZ1EgdHlwZSAlZCIpLAorCQkJcFNjaE1zZy0+dHlwZSk7CisJfQorCit9CisKKy8qIGdldCB0aGUgbG9jYWwgb3IgYnJvYWRjYXN0IHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIHByb2ZpbGUgc2VwY2lmaWVkIGluIHRoZSBjb25maWcgKi8KKy8qIHBhcmFtcyBhcmUgZGVsaXZlcmVkIGluIHRoaXMgb3JkZXI6IEJLLCBCRSwgVkksIFZPICovCit0U2lyUmV0U3RhdHVzCitzY2hfZ2V0X3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCSAgICAgICB1aW50MzJfdCBwYXJhbXNbXVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOXSwgdWludDhfdCBsb2NhbCkKK3sKKwl1aW50MzJfdCB2YWw7CisJdWludDMyX3QgaSwgaWR4OworCXVpbnQzMl90ICpwcmY7CisKKwl1aW50MzJfdCBhbmlfbFtdID0geworCSAgV05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMLCBXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUwsCisJICBXTklfQ0ZHX0VEQ0FfQU5JX0FDVklfTE9DQUwsIFdOSV9DRkdfRURDQV9BTklfQUNWT19MT0NBTH07CisJdWludDMyX3Qgd21lX2xbXSA9IHsKKwkgIFdOSV9DRkdfRURDQV9XTUVfQUNCRV9MT0NBTCwgV05JX0NGR19FRENBX1dNRV9BQ0JLX0xPQ0FMLAorCSAgV05JX0NGR19FRENBX1dNRV9BQ1ZJX0xPQ0FMLCBXTklfQ0ZHX0VEQ0FfV01FX0FDVk9fTE9DQUx9OworCXVpbnQzMl90IGFuaV9iW10gPSB7IFdOSV9DRkdfRURDQV9BTklfQUNCRSwgV05JX0NGR19FRENBX0FOSV9BQ0JLLAorCQkJICAgICBXTklfQ0ZHX0VEQ0FfQU5JX0FDVkksIFdOSV9DRkdfRURDQV9BTklfQUNWT307CisJdWludDMyX3Qgd21lX2JbXSA9IHsgV05JX0NGR19FRENBX1dNRV9BQ0JFLCBXTklfQ0ZHX0VEQ0FfV01FX0FDQkssCisJCQkgICAgIFdOSV9DRkdfRURDQV9XTUVfQUNWSSwgV05JX0NGR19FRENBX1dNRV9BQ1ZPfTsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfRURDQV9QUk9GSUxFLCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJc2NoX2xvZyhwTWFjLCBMT0dQLCBGTCgiZmFpbGVkIHRvIGNmZyBnZXQgRURDQV9QUk9GSUxFIGlkICVkIiksCisJCQlXTklfQ0ZHX0VEQ0FfUFJPRklMRSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJaWYgKHZhbCA+PSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9NQVgpIHsKKwkJc2NoX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkludmFsaWQgRURDQV9QUk9GSUxFICVkLCB1c2luZyAlZCBpbnN0ZWFkIiksIHZhbCwKKwkJCVdOSV9DRkdfRURDQV9QUk9GSUxFX0FOSSk7CisJCXZhbCA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX0FOSTsKKwl9CisKKwlzY2hfbG9nKHBNYWMsIExPR1csIEZMKCJFZGNhUHJvZmlsZTogVXNpbmcgJWQgKCVzKSIpLCB2YWwsCisJCSgodmFsID09IFdOSV9DRkdfRURDQV9QUk9GSUxFX1dNTSkgPyAiV01NIiA6ICJIaVBlcmYiKSk7CisKKwlpZiAobG9jYWwpIHsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9XTU06CisJCQlwcmYgPSAmd21lX2xbMF07CisJCQlicmVhazsKKwkJY2FzZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9BTkk6CisJCWRlZmF1bHQ6CisJCQlwcmYgPSAmYW5pX2xbMF07CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgV05JX0NGR19FRENBX1BST0ZJTEVfV01NOgorCQkJcHJmID0gJndtZV9iWzBdOworCQkJYnJlYWs7CisJCWNhc2UgV05JX0NGR19FRENBX1BST0ZJTEVfQU5JOgorCQlkZWZhdWx0OgorCQkJcHJmID0gJmFuaV9iWzBdOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXVpbnQ4X3QgZGF0YVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTEVOXTsKKwkJdWludDMyX3QgbGVuID0gV05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMX0xFTjsKKwkJaWYgKHdsYW5fY2ZnX2dldF9zdHIKKwkJCSAgICAocE1hYywgKHVpbnQxNl90KSBwcmZbaV0sICh1aW50OF90ICopICZkYXRhWzBdLAorCQkJICAgICZsZW4pICE9IGVTSVJfU1VDQ0VTUykgeworCQkJc2NoX2xvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnR2V0IGZhaWxlZCBmb3IgJWQiKSwgcHJmW2ldKTsKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCX0KKwkJaWYgKGxlbiA+IFdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU4pIHsKKwkJCXNjaF9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiY2ZnR2V0IGZvciAlZDogbGVuZ3RoIGlzICVkIGluc3RlYWQgb2YgJWQiKSwKKwkJCQlwcmZbaV0sIGxlbiwgV05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMX0xFTik7CisJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQl9CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgrKykKKwkJCXBhcmFtc1tpXVtpZHhdID0gKHVpbnQzMl90KSBkYXRhW2lkeF07CisJfQorCVBFTE9HMShzY2hfbG9nCisJCSAgICAgICAocE1hYywgTE9HMSwgRkwoIkdldFBhcmFtczogbG9jYWw9JWQsIHByb2ZpbGUgPSAlZCBEb25lIiksIGxvY2FsLAorCQkgICAgICAgdmFsKTsKKwkgICAgICAgKQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKgorICogYnJvYWRjYXN0X3dtbV9vZl9jb25jdXJyZW50X3N0YV9zZXNzaW9uKCkgLSBicm9hZGNhc3RzIHdtbSBpbmZvCisgKiBAbWFjX2N0eDogICAgICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAc2Vzc2lvbjogICAgICAgcGVzZXNzaW9uIGVudHJ5CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCiticm9hZGNhc3Rfd21tX29mX2NvbmN1cnJlbnRfc3RhX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkJdHBQRVNlc3Npb24gc2Vzc2lvbikKK3sKKwl1aW50OF90IGksIGo7CisJdHBQRVNlc3Npb24gY29uY3VycmVudF9zZXNzaW9uID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBtYWNfY3R4LT5saW0ubWF4QnNzSWQ7IGkrKykgeworCQkvKgorCQkgKiBGaW5kIGFub3RoZXIgSU5GUkEgU1RBIEFQIHNlc3Npb24gb24gc2FtZSBvcGVyYXRpbmcgY2hhbm5lbC4KKwkJICogVGhlIHNlc3Npb24gZW50cnkgcGFzc2VkIHRvIHRoaXMgQVBJIGlzIGZvciBHTy9Tb2Z0QVAgc2Vzc2lvbgorCQkgKiB0aGF0IGlzIGdldHRpbmcgYWRkZWQgY3VycmVudGx5CisJCSAqLworCQlpZiAoISgobWFjX2N0eC0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCA9PSB0cnVlKSAmJgorCQkgICAgKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0ucGVTZXNzaW9uSWQgIT0KKwkJICAgICBzZXNzaW9uLT5wZVNlc3Npb25JZCkKKwkJICAgICYmIChtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldLmN1cnJlbnRPcGVyQ2hhbm5lbCA9PQorCQkJc2Vzc2lvbi0+Y3VycmVudE9wZXJDaGFubmVsKQorCQkgICAgJiYgKG1hY19jdHgtPmxpbS5ncFNlc3Npb25baV0ubGltU3lzdGVtUm9sZQorCQkJPT0gZUxJTV9TVEFfUk9MRSkpKQorCQkJY29udGludWU7CisKKwkJY29uY3VycmVudF9zZXNzaW9uID0gJihtYWNfY3R4LT5saW0uZ3BTZXNzaW9uW2ldKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNvbmN1cnJlbnRfc2Vzc2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisJLyoKKwkgKiBPbmNlIGF0bGVhc3Qgb25lIGNvbmN1cnJlbnQgc2Vzc2lvbiBvbiBzYW1lIGNoYW5uZWwgaXMgZm91bmQgYW5kIFdNTQorCSAqIGJyb2FkY2FzdCBwYXJhbXMgZm9yIGN1cnJlbnQgU29mdEFQL0dPIHNlc3Npb24gdXBkYXRlZCwgcmV0dXJuCisJICovCisJZm9yIChqID0gMDsgaiA8IE1BWF9OVU1fQUM7IGorKykgeworCQlzZXNzaW9uLT5nTGltRWRjYVBhcmFtc0JDW2pdLmFjaS5hY20gPQorCQkJY29uY3VycmVudF9zZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tqXS5hY2kuYWNtOworCQlzZXNzaW9uLT5nTGltRWRjYVBhcmFtc0JDW2pdLmFjaS5haWZzbiA9CisJCQljb25jdXJyZW50X3Nlc3Npb24tPmdMaW1FZGNhUGFyYW1zW2pdLmFjaS5haWZzbjsKKwkJc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNCQ1tqXS5jdy5taW4gPQorCQkJY29uY3VycmVudF9zZXNzaW9uLT5nTGltRWRjYVBhcmFtc1tqXS5jdy5taW47CisJCXNlc3Npb24tPmdMaW1FZGNhUGFyYW1zQkNbal0uY3cubWF4ID0KKwkJCWNvbmN1cnJlbnRfc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNbal0uY3cubWF4OworCQlzZXNzaW9uLT5nTGltRWRjYVBhcmFtc0JDW2pdLnR4b3BsaW1pdCA9CisJCQljb25jdXJyZW50X3Nlc3Npb24tPmdMaW1FZGNhUGFyYW1zW2pdLnR4b3BsaW1pdDsKKwkJUEVMT0cxKHNjaF9sb2cobWFjX2N0eCwgTE9HMSwKKwkJICAgICAgIEZMKCJRb1NVcGRhdGVCQ2FzdCBjaGFuZ2VkIGFnYWluIGR1ZSB0byBjb25jdXJyZW50IElORlJBIFNUQSBzZXNzaW9uOiBBQyA6JWQ6IEFJRlNOOiAlZCwgQUNNICVkLCBDV21pbiAlZCwgQ1dtYXggJWQsIFR4T3AgJWQiKSwKKwkJICAgICAgIGosIHNlc3Npb24tPmdMaW1FZGNhUGFyYW1zQkNbal0uYWNpLmFpZnNuLAorCQkgICAgICAgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNCQ1tqXS5hY2kuYWNtLAorCQkgICAgICAgc2Vzc2lvbi0+Z0xpbUVkY2FQYXJhbXNCQ1tqXS5jdy5taW4sCisJCSAgICAgICBzZXNzaW9uLT5nTGltRWRjYVBhcmFtc0JDW2pdLmN3Lm1heCwKKwkJICAgICAgIHNlc3Npb24tPmdMaW1FZGNhUGFyYW1zQkNbal0udHhvcGxpbWl0KTspCisJfQorfQorCit2b2lkIHNjaF9xb3NfdXBkYXRlX2Jyb2FkY2FzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQzMl90IHBhcmFtc1s0XVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOXTsKKwl1aW50MzJfdCBjd21pbmlkeCwgY3dtYXhpZHgsIHR4b3BpZHg7CisJdWludDMyX3QgcGh5TW9kZTsKKwl1aW50OF90IGk7CisKKwlpZiAoc2NoX2dldF9wYXJhbXMocE1hYywgcGFyYW1zLCBmYWxzZSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVBFTE9HRShzY2hfbG9nKHBNYWMsIExPR0UsIEZMKCJRb3NVcGRhdGVCcm9hZGNhc3Q6IGZhaWxlZCIpKTspCisJCXJldHVybjsKKwl9CisJbGltX2dldF9waHlfbW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKwlQRUxPRzEoc2NoX2xvZyhwTWFjLCBMT0cxLCAiUW9zVXBkQmNhc3Q6IG1vZGUgJWQiLCBwaHlNb2RlKTspCisKKwlpZiAocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykgeworCQljd21pbmlkeCA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUlOR19JRFg7CisJCWN3bWF4aWR4ID0gV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNQVhHX0lEWDsKKwkJdHhvcGlkeCA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX1RYT1BHX0lEWDsKKwl9IGVsc2UgaWYgKHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUIpIHsKKwkJY3dtaW5pZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01JTkJfSURYOworCQljd21heGlkeCA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUFYQl9JRFg7CisJCXR4b3BpZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9UWE9QQl9JRFg7CisJfSBlbHNlIHsKKwkJLyogVGhpcyBjYW4gaGFwcGVuIGlmIG1vZGUgaXMgbm90IHNldCB5ZXQsIGFzc3VtZSAxMWEgbW9kZSAqLworCQljd21pbmlkeCA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUlOQV9JRFg7CisJCWN3bWF4aWR4ID0gV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNQVhBX0lEWDsKKwkJdHhvcGlkeCA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX1RYT1BBX0lEWDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9BQzsgaSsrKSB7CisJCXBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uYWNpLmFjbSA9CisJCQkodWludDhfdCkgcGFyYW1zW2ldW1dOSV9DRkdfRURDQV9QUk9GSUxFX0FDTV9JRFhdOworCQlwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDW2ldLmFjaS5haWZzbiA9CisJCQkodWludDhfdCkgcGFyYW1zW2ldW1dOSV9DRkdfRURDQV9QUk9GSUxFX0FJRlNOX0lEWF07CisJCXBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uY3cubWluID0KKwkJCWNvbnZlcnRfY3coR0VUX0NXKCZwYXJhbXNbaV1bY3dtaW5pZHhdKSk7CisJCXBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uY3cubWF4ID0KKwkJCWNvbnZlcnRfY3coR0VUX0NXKCZwYXJhbXNbaV1bY3dtYXhpZHhdKSk7CisJCXBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0udHhvcGxpbWl0ID0KKwkJCSh1aW50MTZfdCkgcGFyYW1zW2ldW3R4b3BpZHhdOworCisJCVBFTE9HMShzY2hfbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkgICAgICAgIlFvU1VwZGF0ZUJDYXN0OiBBQyA6JWQ6IEFJRlNOOiAlZCwgQUNNICVkLCBDV21pbiAlZCwgQ1dtYXggJWQsIFR4T3AgJWQiLAorCQkJICAgICAgIGksIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uYWNpLmFpZnNuLAorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uYWNpLmFjbSwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDW2ldLmN3Lm1pbiwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDW2ldLmN3Lm1heCwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDW2ldLnR4b3BsaW1pdCk7CisJCSAgICAgICApCisKKwl9CisKKwkvKiBJZiB0aGVyZSBleGlzdHMgYSBjb25jdXJyZW50IFNUQS1BUCBzZXNzaW9uLCB1c2UgaXRzIFdNTSBwYXJhbXMgdG8gYnJvYWRjYXN0IGluIGJlYWNvbnMuIFdGQSBXaWZpIERpcmVjdCB0ZXN0IHBsYW4gNi4xLjE0IHJlcXVpcmVtZW50ICovCisJYnJvYWRjYXN0X3dtbV9vZl9jb25jdXJyZW50X3N0YV9zZXNzaW9uKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCisJaWYgKHNjaF9zZXRfZml4ZWRfYmVhY29uX2ZpZWxkcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisJCVBFTE9HRShzY2hfbG9nKHBNYWMsIExPR0UsICJVbmFibGUgdG8gc2V0IGJlYWNvbiBmaWVsZHMhIik7KQorfQorCit2b2lkIHNjaF9xb3NfdXBkYXRlX2xvY2FsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwl1aW50MzJfdCBwYXJhbXNbNF1bV05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMX0xFTl07CisKKwlpZiAoc2NoX2dldF9wYXJhbXMocE1hYywgcGFyYW1zLCB0cnVlIC8qbG9jYWwgKi8pICE9IGVTSVJfU1VDQ0VTUykgeworCQlQRUxPR0Uoc2NoX2xvZyhwTWFjLCBMT0dFLCBGTCgic2NoX2dldF9wYXJhbXMobG9jYWwpIGZhaWxlZCIpKTspCisJCXJldHVybjsKKwl9CisKKwlzZXRfc2NoX2VkY2FfcGFyYW1zKHBNYWMsIHBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisKKwkvKiBGb3IgQVAsIHRoZSBic3NJRCBpcyBzdG9yZWQgaW4gTElNIEdsb2JhbCBjb250ZXh0LiAqLworCWxpbV9zZW5kX2VkY2FfcGFyYW1zKHBNYWMsIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zLAorCQkJICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZHgpOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuICAgICAgc2NoX3NldF9kZWZhdWx0X2VkY2FfcGFyYW1zCisgICBcYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGdMaW1FZGNhUGFyYW1zIHRvIHRoZSBkZWZhdWx0CisgXCAgICAgICAgbG9jYWwgd21tIHByb2ZpbGUuCisgICBccGFyYW0gICB0cEFuaVNpckdsb2JhbCAgcE1hYworICAgXHJldHVybiAgbm9uZQorIFwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIHNjaF9zZXRfZGVmYXVsdF9lZGNhX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQzMl90IHBhcmFtc1s0XVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOXTsKKworCWlmIChnZXRfd21tX2xvY2FsX3BhcmFtcyhwTWFjLCBwYXJhbXMpICE9IGVTSVJfU1VDQ0VTUykgeworCQlQRUxPR0Uoc2NoX2xvZyhwTWFjLCBMT0dFLCBGTCgiZ2V0X3dtbV9sb2NhbF9wYXJhbXMoKSBmYWlsZWQiKSk7KQorCQlyZXR1cm47CisJfQorCisJc2V0X3NjaF9lZGNhX3BhcmFtcyhwTWFjLCBwYXJhbXMsIHBzZXNzaW9uRW50cnkpOworCXJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiAgICAgIHNldF9zY2hfZWRjYV9wYXJhbXMKKyAgIFxicmllZiAgIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIGdMaW1FZGNhUGFyYW1zIHN0cnVjdHVyZQorIFwgICAgICAgIHdpdGggdGhlIGdpdmVuIGVkY2EgcGFyYW1zLgorICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKKyAgIFxyZXR1cm4gIG5vbmUKKyBcIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQKK3NldF9zY2hfZWRjYV9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgIHVpbnQzMl90IHBhcmFtc1tdW1dOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU5dLAorCQkgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IGN3bWluaWR4LCBjd21heGlkeCwgdHhvcGlkeDsKKwl1aW50MzJfdCBwaHlNb2RlOworCisJbGltX2dldF9waHlfbW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKwlQRUxPRzEoc2NoX2xvZyhwTWFjLCBMT0cxLCBGTCgibGltX2dldF9waHlfbW9kZSgpID0gJWQiKSwgcGh5TW9kZSk7KQorCS8qIGlmIChwTWFjLT5saW0uZ0xpbVBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpICovCisJaWYgKHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpIHsKKwkJY3dtaW5pZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01JTkdfSURYOworCQljd21heGlkeCA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUFYR19JRFg7CisJCXR4b3BpZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9UWE9QR19JRFg7CisJfQorCS8qIGVsc2UgaWYgKHBNYWMtPmxpbS5nTGltUGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExQikgKi8KKwllbHNlIGlmIChwaHlNb2RlID09IFdOSV9DRkdfUEhZX01PREVfMTFCKSB7CisJCWN3bWluaWR4ID0gV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNSU5CX0lEWDsKKwkJY3dtYXhpZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01BWEJfSURYOworCQl0eG9waWR4ID0gV05JX0NGR19FRENBX1BST0ZJTEVfVFhPUEJfSURYOworCX0gZWxzZSB7CisJCS8qIFRoaXMgY2FuIGhhcHBlbiBpZiBtb2RlIGlzIG5vdCBzZXQgeWV0LCBhc3N1bWUgMTFhIG1vZGUgKi8KKwkJY3dtaW5pZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01JTkFfSURYOworCQljd21heGlkeCA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUFYQV9JRFg7CisJCXR4b3BpZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9UWE9QQV9JRFg7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fQUM7IGkrKykgeworCQlwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS5hY2kuYWNtID0KKwkJCSh1aW50OF90KSBwYXJhbXNbaV1bV05JX0NGR19FRENBX1BST0ZJTEVfQUNNX0lEWF07CisJCXBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW2ldLmFjaS5haWZzbiA9CisJCQkodWludDhfdCkgcGFyYW1zW2ldW1dOSV9DRkdfRURDQV9QUk9GSUxFX0FJRlNOX0lEWF07CisJCXBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW2ldLmN3Lm1pbiA9CisJCQljb252ZXJ0X2N3KEdFVF9DVygmcGFyYW1zW2ldW2N3bWluaWR4XSkpOworCQlwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS5jdy5tYXggPQorCQkJY29udmVydF9jdyhHRVRfQ1coJnBhcmFtc1tpXVtjd21heGlkeF0pKTsKKwkJcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0udHhvcGxpbWl0ID0KKwkJCSh1aW50MTZfdCkgcGFyYW1zW2ldW3R4b3BpZHhdOworCisJCVBFTE9HMShzY2hfbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJBQyA6JWQ6IEFJRlNOOiAlZCwgQUNNICVkLCBDV21pbiAlZCwgQ1dtYXggJWQsIFR4T3AgJWQiKSwKKwkJCSAgICAgICBpLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS5hY2kuYWlmc24sCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0uYWNpLmFjbSwKKwkJCSAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS5jdy5taW4sCisJCQkgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0uY3cubWF4LAorCQkJICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW2ldLnR4b3BsaW1pdCk7CisJCSAgICAgICApCisKKwl9CisJcmV0dXJuOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuICAgICAgZ2V0X3dtbV9sb2NhbF9wYXJhbXMKKyAgIFxicmllZiAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgV01NIGxvY2FsIGVkY2EgcGFyYW1ldGVycy4KKyAgIFxwYXJhbSAgIHRwQW5pU2lyR2xvYmFsICBwTWFjCisgICBccGFyYW0gICB1aW50MzJfdCBwYXJhbXNbXVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOXQorICAgXHJldHVybiAgbm9uZQorIFwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdFNpclJldFN0YXR1cworZ2V0X3dtbV9sb2NhbF9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgICB1aW50MzJfdCBwYXJhbXNbXVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOXSkKK3sKKwl1aW50MzJfdCBpLCBpZHg7CisJdWludDMyX3QgKnByZjsKKwl1aW50MzJfdCB3bWVfbFtdID0geworCSAgV05JX0NGR19FRENBX1dNRV9BQ0JFX0xPQ0FMLCBXTklfQ0ZHX0VEQ0FfV01FX0FDQktfTE9DQUwsCisJICBXTklfQ0ZHX0VEQ0FfV01FX0FDVklfTE9DQUwsIFdOSV9DRkdfRURDQV9XTUVfQUNWT19MT0NBTH07CisKKwlwcmYgPSAmd21lX2xbMF07CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl1aW50OF90IGRhdGFbV05JX0NGR19FRENBX0FOSV9BQ0JLX0xFTl07CisJCXVpbnQzMl90IGxlbiA9IFdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU47CisJCWlmICh3bGFuX2NmZ19nZXRfc3RyCisJCQkgICAgKHBNYWMsICh1aW50MTZfdCkgcHJmW2ldLCAodWludDhfdCAqKSAmZGF0YVswXSwKKwkJCSAgICAmbGVuKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCXNjaF9sb2cocE1hYywgTE9HUCwgRkwoImNmZ0dldCBmYWlsZWQgZm9yICVkIiksIHByZltpXSk7CisJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQl9CisJCWlmIChsZW4gPiBXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOKSB7CisJCQlzY2hfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoImNmZ0dldCBmb3IgJWQ6IGxlbmd0aCBpcyAlZCBpbnN0ZWFkIG9mICVkIiksCisJCQkJcHJmW2ldLCBsZW4sIFdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU4pOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsgaWR4KyspCisJCQlwYXJhbXNbaV1baWR4XSA9ICh1aW50MzJfdCkgZGF0YVtpZHhdOworCX0KKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuICAgICAgc2NoX2VkY2FfcHJvZmlsZV91cGRhdGUKKyAgIFxicmllZiAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbG9jYWwgYW5kIGJyb2FkY2FzdAorIFwgICAgICAgIEVEQ0EgcGFyYW1zIGluIHRoZSBnTGltRWRjYVBhcmFtcyBzdHJ1Y3R1cmUuIEl0IGFsc28KKyBcICAgICAgICB1cGRhdGVzIHRoZSBlZGNhUGFyYW1TZXRDb3VudC4KKyAgIFxwYXJhbSAgIHRwQW5pU2lyR2xvYmFsICBwTWFjCisgICBccmV0dXJuICBub25lCisgXCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgc2NoX2VkY2FfcHJvZmlsZV91cGRhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkgfHwKKwkgICAgTElNX0lTX0lCU1NfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQlzY2hfcW9zX3VwZGF0ZV9sb2NhbChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwkJcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbVNldENvdW50Kys7CisJCXNjaF9xb3NfdXBkYXRlX2Jyb2FkY2FzdChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvcGUvc2NoL3NjaF9zeXNfcGFyYW1zLmggYi9jb3JlL21hYy9zcmMvcGUvc2NoL3NjaF9zeXNfcGFyYW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmNWMxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9wZS9zY2gvc2NoX3N5c19wYXJhbXMuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGZpbGUgc2NoX3N5c19wYXJhbXMuaCBjb250YWlucyBzY2hlZHVsZXIgcGFyYW1ldGVyIGRlZmluaXRpb25zCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19TQ0hfU1lTX1BBUkFNU19IX18KKyNkZWZpbmUgX19TQ0hfU1lTX1BBUkFNU19IX18KKworLyogLyBVbnNvbGljaXRlZCBwb2xsIHBlcmlvZCAobXMpICgwIHRvIGRpc2FibGUpICovCisjZGVmaW5lIFNDSF9QT0xMX1BFUklPRCAgICAgICAgICAgICAgICAxMDAwCisKKy8qIC8gUlIgdGltZW91dCB2YWx1ZSAobXMpICgwIHRvIGRpc2FibGUpICovCisjZGVmaW5lIFNDSF9SUl9USU1FT1VUX01TICAgICAgICAgICAgICAgIDQwCisKKy8qIC8gRGVmYXVsdCBDUDpDRlAgcmF0aW8gKi8KKyNkZWZpbmUgU0NIX0RFRkFVTFRfQ1BfVE9fQ0ZQX1JBVElPICAgICAgIDAKKworLyogLyBEZWZhdWx0IG1heGltdW0gQ0ZQIGR1cmF0aW9uICh1cykgKi8KKyNkZWZpbmUgU0NIX0RFRkFVTFRfTUFYX0NGUF9USU1FICAgICAgIDYwMDAwCisKKy8qIC8gRGVmYXVsdCBtaW5pbXVtIENQIGR1cmF0aW9uICh1cykgKi8KKyNkZWZpbmUgU0NIX0RFRkFVTFRfTUlOX0NQX1RJTUUgICAgICAgICAxMDAKKworLyogLyBBbW91bnQgb2YgZGVsYXkgcHJpb3IgdG8gc3RhcnRpbmcgQ0ZQICh1cykgKi8KKyNkZWZpbmUgU0NIX0NGUF9TVEFSVF9ERUxBWSAgICAgICAgICAgICAxMDAKKworLyogLyBVbml0IG9mIFR4b3AgaW4gbWljcm8gc2Vjb25kcyAqLworI2RlZmluZSBUWE9QX1VOSVRfSU5fVVNFQyAgICAgICAgICAgICAgICAzMgorCisvKiAvIE1pbmltdW0gYW1vdW50IG9mIHRpbWUgZ3JhbnRlZCBwZXIgaW5zdHJ1Y3Rpb24gb24gYXZlcmFnZSAodW5pdHMgb2YgdHhvcCkgKi8KKyNkZWZpbmUgTUlOX1RYT1BfUEVSX0lOU1RSVUNUSU9OICAgICAgICAgNTAKKworLyogLyBNYXhpbXVtIGFtb3VudCBvZiB0aW1lIGdyYW50ZWQgcGVyIGluc3RydWN0aW9uICh1bml0cyBvZiB0eG9wKSAqLworI2RlZmluZSBNQVhfVFhPUF9QRVJfSU5TVFJVQ1RJT04gICAgICAgIDMwMCAgICAgLyogSEFDSyAtIDEwMCAqLworCisvKiAvIE1heGltdW0gYW1vdW50IG9mIHRpbWUgZ3JhbnRlZCB0byBvbmUgZW50aXJlIHNjaGVkdWxlICh1bml0cyBvZiB0eG9wKSAqLworI2RlZmluZSBNQVhfVFhPUF9QRVJfU0NIRURVTEUgICAgICAgICAgIDQwMAorCisvKiAvIFNjaGVkdWxpbmcgcXVhbnR1bSAodW5pdHMgb2YgVFhPUCkgKi8KKyNkZWZpbmUgU0NIX1FVQU5UVU1fUVVFVUUgICAgICAgICAgICAgICAgIDQKKworLyogLyBNYXhpbXVtIHVudXNlZCBxdWFudHVtIGFsbG93ZWQgdG8gYmUgYWNjdW11bGF0ZWQgYnkgYSBxdWV1ZSAqLworI2RlZmluZSBNQVhfQUNDVU1VTEFURURfUVVBTlRVTSAgICAgICAgIDUwMAorCisvKiAvIE1pbmltdW0gYWxsb2NhdGVkIHF1YW50dW0gZm9yIGFuIHVwbGluayBmbG93IGJlZm9yZSBhIHBvbGwgaW5zdHJ1Y3Rpb24gaXMgd3JpdHRlbiAqLworI2RlZmluZSBTQ0hfTUlOX1VMX0FMTE9DICAgICAgICAgICAgICAgICAxMgorCisvKiAtLS0tIFNjaGVkdWxpbmcgUG9saWN5IC0tLS0gKi8KKworLyogLyBOdW1iZXIgb2YgUU9TIGNsYXNzZXMgKi8KKyNkZWZpbmUgU0NIX05VTV9RT1NfQ0xBU1NFUyAgICAyCisKKyNkZWZpbmUgU0NIX1BPTElDWV9TVFJJQ1RfUFJJICAwCisjZGVmaW5lIFNDSF9QT0xJQ1lfRFJSICAgICAgICAgMQorCisvKiAvIFNjaGVkdWxpbmcgcXVhbnR1bSBmb3IgZWFjaCBjbGFzcyBpZiB1c2luZyBEUlIgKi8KKyNkZWZpbmUgU0NIX1FVQU5UVU1fQ0xBU1MgICAgICAxMDAKKworLyogLyBUaGUgZGVmYXVsdCBzY2hlZHVsaW5nIHBvbGljeSBiZXR3ZWVuIGNsYXNzZXMgKi8KKyNkZWZpbmUgU0NIX1BPTElDWV9ERUZBVUxUICAgICBTQ0hfUE9MSUNZX1NUUklDVF9QUkkKKworLyogU2NoZWR1bGluZyB3ZWlnaHRzIGZvciBlYWNoIHByaW9yaXR5ICovCisKKyNkZWZpbmUgU0NIX1FVQU5UVU1fMCAgICA0MAorI2RlZmluZSBTQ0hfUVVBTlRVTV8xICAgIDM2CisjZGVmaW5lIFNDSF9RVUFOVFVNXzIgICAgMzIKKyNkZWZpbmUgU0NIX1FVQU5UVU1fMyAgICAyOAorI2RlZmluZSBTQ0hfUVVBTlRVTV80ICAgIDI0CisjZGVmaW5lIFNDSF9RVUFOVFVNXzUgICAgMjAKKyNkZWZpbmUgU0NIX1FVQU5UVU1fNiAgICAxNgorI2RlZmluZSBTQ0hfUVVBTlRVTV83ICAgIDEyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3N5cy9jb21tb24vaW5jL3dsYW5fcWN0X3N5cy5oIGIvY29yZS9tYWMvc3JjL3N5cy9jb21tb24vaW5jL3dsYW5fcWN0X3N5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MGI2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvc3lzL2NvbW1vbi9pbmMvd2xhbl9xY3Rfc3lzLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZCggV0xBTl9RQ1RfU1lTX0hfXyApCisjZGVmaW5lIFdMQU5fUUNUX1NZU19IX18KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICB3bGFuX3FjdF9zeXMuaAorCisgICBcYnJpZWYgU3lzdGVtIG1vZHVsZSBBUEkKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSEVBREVSJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBmaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8Y2RmX3N0YXR1cy5oPgorI2luY2x1ZGUgPGNkc19tcS5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIHN5c1Jlc3BvbnNlQ2JhY2soKSAtIFNZUyBhc3luYyByZXNvbnNlIGNhbGxiYWNrCisKKyAgIFRoaXMgaXMgYSBwcm90eXBlIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBTWVMgbWFrZXMgdG8gdmFyaW91cworICAgbW9kdWxlcyBpbiB0aGUgc3lzdGVtLgorCisgICBccGFyYW0gIHBVc2VyRGF0YSAtIHVzZXIgZGF0YSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgd2hlbiBpdCBpcyBpbnZva2VkLgorCisgICBccmV0dXJuIE5vdGhpbmcKKworICAgXHNhIHN5c01jU3RhcnQoKSwgc3lzTWNUaHJlYWRQcm9iZSgpLCBzeXNUeFRocmVhZFByb2JlKCkKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICgqc3lzUmVzcG9uc2VDYmFjaykodm9pZCAqcFVzZXJEYXRhKTsKKwordHlwZWRlZiBlbnVtIHsKKwlTWVNfTVNHX0lEX01DX1NUQVJULAorCVNZU19NU0dfSURfTUNfVEhSX1BST0JFLAorCVNZU19NU0dfSURfTUNfVElNRVIsCisJU1lTX01TR19JRF9NQ19TVE9QLAorCVNZU19NU0dfSURfRlRNX1JTUCwKKworfSBTWVNfTVNHX0lEOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIHN5c19idWlsZF9tZXNzYWdlX2hlYWRlcigpIC0gQnVpbGQgLyBpbml0aWFsaXplIGEgU1lTIG1lc3NhZ2UgaGVhZGVyCisKKyAgIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIHRoZSBTWVMgbWVzc2FnZSBoZWFkZXIgd2l0aCB0aGUgbWVzc2FnZSB0eXBlCisgICBhbmQgYW55IGludGVybmFsIGZpZWxkcyBuZWVkZWQgZm9yIGEgbmV3IFNZUyBtZXNzYWdlLiAgVGhpcyBmdW5jdGlvbiBzZXRzCisgICBhbGwgYnV0IHRoZSBtZXNzYWdlIGJvZHksIHdoaWNoIGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2V0dXAgYmFzZWQgb24gdGhlCisgICBzcGVjaWZpYyBtZXNzYWdlIGJlaW5nIGJ1aWx0LgorCisgICBcbm90ZSBUaGVyZSBhcmUgaW50ZXJuYWwgLyByZXNlcnZlZCBpdGVtcyBpbiBhIFNZUyBtZXNzYWdlIHRoYXQgbXVzdCBiZQorICAgICAgICBzZXQgY29ycmVjdGx5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZWNvZ25pemVkIGFzIGEgU1lTIG1lc3NhZ2UgYnkKKyAgICAgICAgdGhlIFNZUyBtZXNzYWdlIGhhbmRsZXJzLiAgSXQgaXMgaW1wb3J0YW50IGZvciBldmVyeSBTWVMgbWVzc2FnZSB0bworICAgICAgICBiZSBzZXR1cCAvIGJ1aWx0IC8gaW5pdGlhbGl6ZWQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLgorCisgICBccGFyYW0gc3lzTXNnSWQgLSBhIHZhbGlkIG1lc3NhZ2UgSUQgZm9yIGEgU1lTIG1lc3NhZ2UuICBTZWUgdGhlCisgICAgICAgICBTWVNfTVNHX0lEIGVudW0gZm9yIGFsbCB0aGUgdmFsaWQgU1lTIG1lc3NhZ2UgSURzLgorCisgICBccGFyYW0gcE1zZyAtIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2Ugc3RydWN0dXJlIHRvIGJlIHNldHVwLgorCisgICBccmV0dXJuCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHN5c19idWlsZF9tZXNzYWdlX2hlYWRlcihTWVNfTVNHX0lEIHN5c01zZ0lkLCBjZHNfbXNnX3QgKnBNc2cpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIHN5c01jU3RhcnQoKSAtIHN0YXJ0IHRoZSBzeXN0ZW0gTWFpbiBDb250cm9sbGVyIHRocmVhZC4KKworICAgVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIFNZUyAoTWFpbiBDb250cm9sbGVyKSBtb2R1bGUuICBTdGFydGluZyB0aGlzCisgICBtb2R1bGUgdHJpZ2dlcnMgdGhlIENGRyBkb3dubG9hZCB0byB0aGUgJ2xlZ2FjeScgTUFDIHNvZnR3YXJlLgorCisgICBccGFyYW0gcF9jZHNfY29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIENEUyBDb250ZXh0CisKKyAgIFxwYXJhbSB1c2VyQ2FsbGJhY2sgLSB0aGlzIGlzIGEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgU1lTCisgICAgICAgICBoYXMgY29tcGxldGVkIHRoZSAnc3RhcnQnIGZ1bmNpdG9uLgorCisgICBccGFyYW0gcFVzZXJEYXRhIC0gcG9pbnRlciB0byBzb21lIHVzZXIgZGF0YSBlbnRpdHkgdGhhdCBpcyBwYXNzZWQgdG8KKyAgICAgICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBhcyBhIHBhcmFtZXRlciB3aGVuIGludm9rZWQuCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0KKworICAgXHRvZG86ICBXZSBoYXZlIG5vdCAnc3RhdHVzJyBvbiB0aGUgY2FsbGJhY2suICBIb3cgZG8gd2Ugbm90aWZ5IHRoZQorICAgICAgICAgIGNhbGxiYWNrIHRoYXQgdGhlcmUgaXMgYSBmYWlsdXJlID8KKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc3lzTWNTdGFydCh2X0NPTlRFWFRfdCBwX2Nkc19jb250ZXh0LCBzeXNSZXNwb25zZUNiYWNrIHVzZXJDYWxsYmFjaywKKwkJICAgICAgdm9pZCAqcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBzeXNfc3RvcCgpIC0gU3RvcCB0aGUgU1lTIG1vZHVsZS4KKworICAgVGhpcyBmdW5jdGlvbiBzdG9wcyB0aGUgU1lTIG1vZHVsZS4KKworICAgXHRvZG86IFdoYXQgZWxzZSBkbyB3ZSBuZWVkIHRvIGRvIG9uIHN5c19zdG9wKCk/CisKKyAgIFxwYXJhbSBwX2Nkc19jb250ZXh0IC0gcG9pbnRlciB0byB0aGUgQ0RTIENvbnRleHQKKworICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgU1lTIG1vZHVsZSBpcyBzdG9wcGVkLgorCisgICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgLSB0aGUgU1lTIG1vZHVsZSBvcGVuIGZhaWxlZCB0byBzdG9wLgorCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzeXNfc3RvcCh2X0NPTlRFWFRfdCBwX2Nkc19jb250ZXh0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBzeXNfbWNfcHJvY2Vzc19tc2coKSAtIHByb2Nlc3MgU1lTIG1lc3NhZ2VzIG9uIHRoZSBNYWluIENvbnRyb2xsZXIgdGhyZWFkCisKKyAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIFNZUyBNZXNzYWdlcyBvbiB0aGUgTWFpbiBDb250cm9sbGVyIHRocmVhZC4KKyAgIFNZUyBtZXNzYWdlcyBjb25zaXN0IG9mIGFsbCAnbGVnYWN5JyBtZXNzYWdlcyAobWVzc2FnZXMgYm91bmQgZm9yIGxlZ2FjeQorICAgbW9kdWxlcyBsaWtlIExJTSwgSEFMLCBQRSwgZXRjLikgYXMgd2VsbCBhcyBuZXdseSBkZWZpbmVkIFNZUyBtZXNzYWdlCisgICB0eXBlcy4KKworICAgU1lTIG1lc3NhZ2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIHR5cGUgKGluIHRoZSBTWVNfTUVTU0FHRVMgZW51bSkgYXMKKyAgIHdlbGwgYXMgYSAnY29va2llJyB0aGF0IGlzIGluIHRoZSByZXNlcnZlZCBmaWVsZCBvZiB0aGUgbWVzc2FnZSBzdHJ1Y3R1cmUuCisgICBUaGlzICdjb29raWUnIGlzIGludHJvZHVjZWQgdG8gcHJldmVudCBhbnkgbWVzc2FnZSB0eXBlL0lEIGNvbmZsaWN0cyB3aXRoCisgICB0aGUgJ2xlZ2FjeScgbWVzc2FnZSB0eXBlcy4KKworICAgQW55IG1vZHVsZSBhdHRlbXB0aW5nIHRvIHBvc3QgYSBtZXNzYWdlIHRvIHRoZSBTWVMgbW9kdWxlIG11c3Qgc2V0IHRoZQorICAgbWVzc2FnZSB0eXBlIHRvIG9uZSBvZiB0aGUgdHlwZXMgaW4gdGhlIFNZU19NRVNTQUdFIGVudW0gKmFuZCogbXVzdCBhbHNvCisgICBzZXQgdGhlIFJlc2VydmVkIGZpZWxkIGluIHRoZSBtZXNzYWdlIGJvZHkgdG8gU1lTX01TR19DT09LSUUuCisKKyAgIFxwYXJhbSBwX2Nkc19jb250ZXh0IC0gcG9pbnRlciB0byB0aGUgQ0RTIENvbnRleHQKKworICAgXHBhcmFtIHBNc2cgLSBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZC4KKworICAgXHJldHVybiAtIENERl9TVEFUVVNfU1VDQ0VTUyAtIHRoZSBtZXNzYWdlIHdhcyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LgorCisgICAgICAgICAgICBDREZfU1RBVFVTX0VfQkFETVNHIC0gYSBiYWQgKHVua25vd24gdHlwZSkgbWVzc2FnZSB3YXMgcmVjZWl2ZWQKKyAgICAgICAgICAgIGFuZCBzdWJzZXF1ZW50bHkgbm90IHByb2Nlc3NlZC4KKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHN5c19tY19wcm9jZXNzX21zZyh2X0NPTlRFWFRfdCBwX2Nkc19jb250ZXh0LCBjZHNfbXNnX3QgKnBNc2cpOworCit2b2lkIHdsYW5fc3lzX3Byb2JlKHZvaWQpOworCisjZW5kaWYgLyogV0xBTl9RQ1RfU1lTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3N5cy9jb21tb24vc3JjL3dsYW5fcWN0X3N5cy5jIGIvY29yZS9tYWMvc3JjL3N5cy9jb21tb24vc3JjL3dsYW5fcWN0X3N5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYzM5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvc3lzL2NvbW1vbi9zcmMvd2xhbl9xY3Rfc3lzLmMKQEAgLTAsMCArMSwzNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDx3bGFuX3FjdF9zeXMuaD4KKyNpbmNsdWRlIDxjZHNfYXBpLmg+CisjaW5jbHVkZSA8c2lyX3R5cGVzLmg+ICAgICAgICAgICAvKiBuZWVkZWQgZm9yIHRTaXJSZXRTdGF0dXMgKi8KKyNpbmNsdWRlIDxzaXJfcGFyYW1zLmg+ICAgICAgICAgIC8qIG5lZWRlZCBmb3IgdFNpck1iTXNnICovCisjaW5jbHVkZSA8c2lyX2FwaS5oPiAgICAgICAgICAgICAvKiBuZWVkZWQgZm9yIFNJUl8uLi4gbWVzc2FnZSB0eXBlcyAqLworI2luY2x1ZGUgPHduaV9hcGkuaD4gICAgICAgICAgICAgLyogbmVlZGVkIGZvciBXTklfLi4uIG1lc3NhZ2UgdHlwZXMgKi8KKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAic21lX2FwaS5oIgorI2luY2x1ZGUgIm1hY19pbml0X2FwaS5oIgorCisvKiBDb29raWUgZm9yIFNZUyBtZXNzYWdlcy4gIE5vdGUgdGhhdCBhbnlvbmUgcG9zdGluZyBhIFNZUyBNZXNzYWdlCisgKiBoYXMgdG8gd3JpdGUgdGhlIENPT0tJRSBpbiB0aGUgcmVzZXJ2ZWQgZmllbGQgb2YgdGhlIG1lc3NhZ2UuICBUaGUKKyAqIFNZUyBNb2R1bGUgcmVsaWVzIG9uIHRoaXMgQ09PS0lFCisgKi8KKyNkZWZpbmUgU1lTX01TR19DT09LSUUgICAgICAweEZBQ0UKKworLyogU1lTIHN0b3AgdGltZW91dCAzMCBzZWNvbmRzICovCisjZGVmaW5lIFNZU19TVE9QX1RJTUVPVVQgKDMwMDAwKQorCitzdGF0aWMgY2RmX2V2ZW50X3QgZ19zdG9wX2V2dDsKKworQ0RGX1NUQVRVUyBzeXNfYnVpbGRfbWVzc2FnZV9oZWFkZXIoU1lTX01TR19JRCBzeXNNc2dJZCwgY2RzX21zZ190ICpwTXNnKQoreworCXBNc2ctPnR5cGUgPSBzeXNNc2dJZDsKKwlwTXNnLT5yZXNlcnZlZCA9IFNZU19NU0dfQ09PS0lFOworCisJcmV0dXJuIChDREZfU1RBVFVTX1NVQ0NFU1MpOworfQorCit2b2lkIHN5c19zdG9wX2NvbXBsZXRlX2NiKHZvaWQgKnBVc2VyRGF0YSkgeworCWNkZl9ldmVudF90ICpwU3RvcEV2dCA9IChjZGZfZXZlbnRfdCAqKSBwVXNlckRhdGE7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWNkZl9zdGF0dXMgPSBjZGZfZXZlbnRfc2V0KHBTdG9wRXZ0KTsKKwlDREZfQVNTRVJUKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSk7CisKK30gLyogY2RzX3N5c19zdG9wX2NvbXBsZXRlX2NiYWNrKCkgKi8KKworQ0RGX1NUQVRVUyBzeXNfc3RvcCh2X0NPTlRFWFRfdCBwX2Nkc19jb250ZXh0KQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwljZHNfbXNnX3Qgc3lzTXNnOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc3RvcCBldmVudCAqLworCWNkZl9zdGF0dXMgPSBjZGZfZXZlbnRfaW5pdCgmZ19zdG9wX2V2dCk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlyZXR1cm4gY2RmX3N0YXR1czsKKwl9CisKKwkvKiBwb3N0IGEgbWVzc2FnZSB0byBTWVMgbW9kdWxlIGluIE1DIHRvIHN0b3AgU01FIGFuZCBNQUMgKi8KKwlzeXNfYnVpbGRfbWVzc2FnZV9oZWFkZXIoU1lTX01TR19JRF9NQ19TVE9QLCAmc3lzTXNnKTsKKworCS8qIFNhdmUgdGhlIHVzZXIgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YSAqLworCS8qIGZpbmlzaGVkLiAqLworCXN5c01zZy5jYWxsYmFjayA9IHN5c19zdG9wX2NvbXBsZXRlX2NiOworCXN5c01zZy5ib2R5cHRyID0gKHZvaWQgKikmZ19zdG9wX2V2dDsKKworCS8qIHBvc3QgdGhlIG1lc3NhZ2UuLiAqLworCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9TWVMsICZzeXNNc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfQkFETVNHOworCX0KKworCWNkZl9zdGF0dXMgPSBjZGZfd2FpdF9zaW5nbGVfZXZlbnQoJmdfc3RvcF9ldnQsIFNZU19TVE9QX1RJTUVPVVQpOworCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKTsKKworCWNkZl9zdGF0dXMgPSBjZGZfZXZlbnRfZGVzdHJveSgmZ19zdG9wX2V2dCk7CisJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpOworCisJcmV0dXJuIChjZGZfc3RhdHVzKTsKK30KKworQ0RGX1NUQVRVUyBzeXNfbWNfcHJvY2Vzc19tc2codl9DT05URVhUX3QgcF9jZHNfY29udGV4dCwgY2RzX21zZ190ICpwTXNnKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl2b2lkICpoSGFsOworCisJaWYgKE5VTEwgPT0gcE1zZykgeworCQlDREZfQVNTRVJUKDApOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOVUxMIHBvaW50ZXIgdG8gY2RzX21zZ190IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCS8qIEFsbCAnbmV3JyBTWVMgbWVzc2FnZXMgYXJlIGlkZW50aWZpZWQgYnkgYSBjb29raWUgaW4gdGhlIHJlc2VydmVkCisJICogZmllbGQgb2YgdGhlIG1lc3NhZ2UgYXMgd2VsbCBhcyB0aGUgbWVzc2FnZSB0eXBlLiAgVGhpcyBwcmV2ZW50cworCSAqIHRoZSBwb3NzaWJpbGl0eSBvZiBvdmVybGFwIGluIHRoZSBtZXNzYWdlIHR5cGVzIGRlZmluZWQgZm9yIG5ldworCSAqIFNZUyBtZXNzYWdlcyB3aXRoIHRoZSAnbGVnYWN5JyBtZXNzYWdlIHR5cGVzLiAgVGhlIGxlZ2FjeSBtZXNzYWdlcworCSAqIHdpbGwgbm90IGhhdmUgdGhpcyBjb29raWUgaW4gdGhlIHJlc2VydmVkIGZpZWxkCisJICovCisJaWYgKFNZU19NU0dfQ09PS0lFID09IHBNc2ctPnJlc2VydmVkKSB7CisJCS8qIFByb2Nlc3MgYWxsIHRoZSBuZXcgU1lTIG1lc3NhZ2VzLi4gKi8KKwkJc3dpdGNoIChwTXNnLT50eXBlKSB7CisJCWNhc2UgU1lTX01TR19JRF9NQ19TVEFSVDoKKwkJeworCQkJLyogSGFuZGxpbmcgZm9yIHRoaXMgbWVzc2FnZSBpcyBub3QgbmVlZGVkIG5vdyBzbyBhZGRpbmcKKwkJCSAqZGVidWcgcHJpbnQgYW5kIENERl9BU1NFUlQqLworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiBSZWNlaXZlZCBTWVNfTVNHX0lEX01DX1NUQVJUIG1lc3NhZ2UgbXNnVHlwZT0gJWQgWzB4JTA4eF0iLAorCQkJCSAgcE1zZy0+dHlwZSwgcE1zZy0+dHlwZSk7CisJCQlDREZfQVNTRVJUKDApOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNZU19NU0dfSURfTUNfU1RPUDoKKwkJeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiUHJvY2Vzc2luZyBTWVMgTUMgU1RPUCIpOworCisJCQkvKiBnZXQgdGhlIEhBTCBjb250ZXh0Li4uICovCisJCQloSGFsID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCQkJaWYgKE5VTEwgPT0gaEhhbCkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgIiVzOiBJbnZhbGlkIGhIYWwiLCBfX2Z1bmNfXyk7CisJCQl9IGVsc2UgeworCQkJCWNkZl9zdGF0dXMgPQorCQkJCQlzbWVfc3RvcChoSGFsLAorCQkJCQkJIEhBTF9TVE9QX1RZUEVfU1lTX0RFRVBfU0xFRVApOworCQkJCUNERl9BU1NFUlQoQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCQkJCQkgICAoY2RmX3N0YXR1cykpOworCisJCQkJY2RmX3N0YXR1cyA9CisJCQkJCW1hY19zdG9wKGhIYWwsCisJCQkJCQkgSEFMX1NUT1BfVFlQRV9TWVNfREVFUF9TTEVFUCk7CisJCQkJQ0RGX0FTU0VSVChDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJCQkJCSAgIChjZGZfc3RhdHVzKSk7CisKKwkJCQkoKHN5c1Jlc3BvbnNlQ2JhY2spIHBNc2ctPgorCQkJCSBjYWxsYmFjaykoKHZvaWQgKilwTXNnLT5ib2R5cHRyKTsKKworCQkJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIFByb2Nlc3MgTUMgdGhyZWFkIHByb2JlLiAgSnVzdCBjYWxsYmFjayB0byB0aGUgKi8KKwkJLyogZnVuY3Rpb24gdGhhdCBpcyBpbiB0aGUgbWVzc2FnZS4gKi8KKwkJY2FzZSBTWVNfTVNHX0lEX01DX1RIUl9QUk9CRToKKwkJeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiBSZWNlaXZlZCBTWVNfTVNHX0lEX01DX1RIUl9QUk9CRSBtZXNzYWdlIG1zZ1R5cGUgPSAlZCBbMHglMDh4XSIsCisJCQkJICBwTXNnLT50eXBlLCBwTXNnLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBTWVNfTVNHX0lEX01DX1RJTUVSOgorCQl7CisJCQljZGZfbWNfdGltZXJfY2FsbGJhY2tfdCB0aW1lckNCID0KKwkJCQlwTXNnLT5jYWxsYmFjazsKKworCQkJaWYgKE5VTEwgIT0gdGltZXJDQikgeworCQkJCXRpbWVyQ0IocE1zZy0+Ym9keXB0cik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNZU19NU0dfSURfRlRNX1JTUDoKKwkJeworCQkJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IE5VTEw7CisJCQloSGFsID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCQkJaWYgKE5VTEwgPT0gaEhhbCkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgRkwoIkludmFsaWQgaGFsIikpOworCQkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1hY19jdHggPSBQTUFDX1NUUlVDVChoSGFsKTsKKwkJCWlmIChOVUxMID09IG1hY19jdHgpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgIEZMKCJJbnZhbGlkIG1hYyBjb250ZXh0IikpOworCQkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChOVUxMID09IG1hY19jdHgtPmZ0bV9tc2dfcHJvY2Vzc29yX2NhbGxiYWNrKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTCgiY2FsbGJhY2sgcG9pbnRlciBpcyBOVUxMIikpOworCQkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1hY19jdHgtPmZ0bV9tc2dfcHJvY2Vzc29yX2NhbGxiYWNrKAorCQkJCQkJCSh2b2lkICopcE1zZy0+Ym9keXB0cik7CisJCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJVbmtub3duIG1lc3NhZ2UgdHlwZSBpbiBzeXNfbWNfcHJvY2Vzc19tc2coKSBtc2dUeXBlPSAlZCBbMHglMDh4XSIsCisJCQkJICBwTXNnLT50eXBlLCBwTXNnLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJfSAvKiBlbmQgc3dpdGNoIG9uIG1lc3NhZ2UgdHlwZSAqLworCisJfSAvKiBlbmQgaWYgY29va2llIHNldCAqLworCWVsc2UgeworCQkvKiBQcm9jZXNzIGFsbCAnbGVnYWN5JyBtZXNzYWdlcyAqLworCQlzd2l0Y2ggKHBNc2ctPnR5cGUpIHsKKworCQlkZWZhdWx0OgorCQl7CisJCQlDREZfQVNTRVJUKDApOworCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiUmVjZWl2ZWQgU1lTIG1lc3NhZ2UgY29va2llIHdpdGggdW5pZGVudGlmaWVkICIKKwkJCQkgICJNQyBtZXNzYWdlIHR5cGU9ICVkIFsweCUwOFhdIiwKKwkJCQkgIHBNc2ctPnR5cGUsIHBNc2ctPnR5cGUpOworCisJCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0JBRE1TRzsKKwkJCWlmIChwTXNnLT5ib2R5cHRyKQorCQkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJCWJyZWFrOworCQl9CisJCX0gLyogZW5kIHN3aXRjaCBvbiBwTXNnLT50eXBlICovCisJfSAvKiBlbmQgZWxzZSAqLworCisJcmV0dXJuIChjZGZfc3RhdHVzKTsKK30KKworCit2b2lkIHN5c19wcm9jZXNzX21taF9tc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKnBNc2cpIHsKKwlDRFNfTVFfSUQgdGFyZ2V0TVEgPSBDRFNfTVFfSURfU1lTOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKgorCSoqIFRoZSBib2R5IG9mIHRoaXMgcE1zZyBpcyBhIHRTaXJNYk1zZworCSoqIENvbnRyYXJ5IHRvIEdlbjQsIHdlIGNhbm5vdCBmcmVlIGl0IGhlcmUhCisJKiogSXQgaXMgdXAgdG8gdGhlIGNhbGxlZSB0byBmcmVlIGl0CisJKi8KKworCWlmIChOVUxMID09IHBNc2cpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJOVUxMIE1lc3NhZ2UgUG9pbnRlciIpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChwTXNnLT50eXBlKSB7CisJLyoKKwkqKiBGb2xsb3dpbmcgbWVzc2FnZXMgYXJlIHJvdXRlZCB0byBTWVMKKwkqLworCWNhc2UgV05JX0NGR19ETkxEX1JFUToKKwljYXNlIFdOSV9DRkdfRE5MRF9DTkY6CisJeworCQkvKiBGb3J3YXJkIHRoaXMgbWVzc2FnZSB0byB0aGUgU1lTIG1vZHVsZSAqLworCQl0YXJnZXRNUSA9IENEU19NUV9JRF9TWVM7CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJIYW5kbGluZyBmb3IgdGhlIE1lc3NhZ2UgSUQgJWQgaXMgcmVtb3ZlZCBpbiBTWVNcclxuIiwKKwkJCSAgcE1zZy0+dHlwZSk7CisKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkqKiBGb2xsb3dpbmcgbWVzc2FnZXMgYXJlIHJvdXRlZCB0byBIQUwKKwkqLworCWNhc2UgV05JX0NGR19ETkxEX1JTUDoKKwl7CisJCS8qIEZvcndhcmQgdGhpcyBtZXNzYWdlIHRvIHRoZSBIQUwgbW9kdWxlICovCisJCXRhcmdldE1RID0gQ0RTX01RX0lEX1dNQTsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkhhbmRsaW5nIGZvciB0aGUgTWVzc2FnZSBJRCAlZCBpcyByZW1vdmVkIGFzIHRoZXJlIGlzIG5vIEhBTCBcclxuIiwKKwkJCSAgcE1zZy0+dHlwZSk7CisKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBXTklfQ0ZHX0dFVF9SRVE6CisJY2FzZSBXTklfQ0ZHX1NFVF9SRVE6CisJY2FzZSBXTklfQ0ZHX1NFVF9SRVFfTk9fUlNQOgorCWNhc2UgZVdOSV9TTUVfU1lTX1JFQURZX0lORDoKKwl7CisJCS8qIEZvcndhcmQgdGhpcyBtZXNzYWdlIHRvIHRoZSBQRSBtb2R1bGUgKi8KKwkJdGFyZ2V0TVEgPSBDRFNfTVFfSURfUEU7CisJCWJyZWFrOworCX0KKworCWNhc2UgV05JX0NGR19HRVRfUlNQOgorCWNhc2UgV05JX0NGR19TRVRfQ05GOgorCXsKKwkJLyogRm9yd2FyZCB0aGlzIG1lc3NhZ2UgdG8gdGhlIFNNRSBtb2R1bGUgKi8KKwkJdGFyZ2V0TVEgPSBDRFNfTVFfSURfU01FOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCXsKKworCQlpZiAoKHBNc2ctPnR5cGUgPj0gZVdOSV9TTUVfTVNHX1RZUEVTX0JFR0lOKQorCQkgICAgJiYgKHBNc2ctPnR5cGUgPD0gZVdOSV9TTUVfTVNHX1RZUEVTX0VORCkpIHsKKwkJCXRhcmdldE1RID0gQ0RTX01RX0lEX1NNRTsKKwkJCWJyZWFrOworCQl9CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJNZXNzYWdlIG9mIElEICVkIGlzIG5vdCB5ZXQgaGFuZGxlZCBieSBTWVNcclxuIiwKKwkJCSAgcE1zZy0+dHlwZSk7CisKKwkJQ0RGX0FTU0VSVCgwKTsKKwl9CisKKwl9CisKKwkvKgorCSoqIFBvc3Qgbm93IHRoZSBtZXNzYWdlIHRvIHRoZSBhcHByb3ByaWF0ZSBtb2R1bGUgZm9yIGhhbmRsaW5nCisJKi8KKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJICAgIGNkc19tcV9wb3N0X21lc3NhZ2UodGFyZ2V0TVEsIChjZHNfbXNnX3QgKikgcE1zZykpIHsKKwkJLyogQ2FsbGVyIGRvZXNuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcE1zZy4gSXQgYWxsb2NhdGUgbWVtb3J5IGZvciBib2R5cHRyICovCisJCS8qIGZyZWUgdGhlIG1lbSBhbmQgcmV0dXJuICovCisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisJCX0KKwl9CisKK30gLyogc3lzX3Byb2Nlc3NfbW1oX21zZygpICovCisKK3ZvaWQgd2xhbl9zeXNfcHJvYmUodm9pZCkKK3sKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwljZHNfbWVzc2FnZS5yZXNlcnZlZCA9IFNZU19NU0dfQ09PS0lFOworCWNkc19tZXNzYWdlLnR5cGUgPSBTWVNfTVNHX0lEX01DX1RIUl9QUk9CRTsKKwljZHNfbWVzc2FnZS5ib2R5cHRyID0gTlVMTDsKKworCWNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1NZUywgJmNkc19tZXNzYWdlKTsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy9wbGF0Zm9ybS9pbmMvc3lzX3dyYXBwZXIuaCBiL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy9wbGF0Zm9ybS9pbmMvc3lzX3dyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWViNjM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3BsYXRmb3JtL2luYy9zeXNfd3JhcHBlci5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogQGZpbGUgVm9zc1dyYXBwZXIuaAorICoKKyAqIEBicmllZiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSB2YXJpb3VzIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBhbmQKKyAqIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBSVE9TIGFic3RyYWN0aW9uIGxheWVyLCBpbXBsZW1lbnRlZCBmb3IgVk9TUworICovCisKKyNpZm5kZWYgX19WT1NTX1dSQVBQRVJfSAorI2RlZmluZSBfX1ZPU1NfV1JBUFBFUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgInNpcl90eXBlcy5oIgorI2luY2x1ZGUgInNpcl9wYXJhbXMuaCIKKyNpbmNsdWRlICJzeXNfZGVmLmgiCisjaW5jbHVkZSAiY2RmX21jX3RpbWVyLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RmX21lbW9yeS5oIgorCisvKiBJbnRlcmxvY2tlZCBDb21wYXJlIEV4Y2hhbmdlIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KKworLyogRGVmaW5lIGJhc2ljIGNvbnN0YW50cyBmb3IgdGhlIFRocmVhZFgga2VybmVsLiAgKi8KKworI2RlZmluZSBUWF9OT19XQUlUICAgICAgICAgIDAKKyNkZWZpbmUgVFhfV0FJVF9GT1JFVkVSICAgICAweEZGRkZGRkZGVUwKKyNkZWZpbmUgVFhfQVVUT19BQ1RJVkFURSAgICAxCisjZGVmaW5lIFRYX05PX0FDVElWQVRFICAgICAgMAorCisvKiBBUEkgcmV0dXJuIHZhbHVlcy4gICovCisjZGVmaW5lIFRYX1NVQ0NFU1MgICAgICAgICAgMHgwMAorI2RlZmluZSBUWF9RVUVVRV9GVUxMICAgIDB4MDEKKy8qIC4uLiAqLworI2RlZmluZSBUWF9OT19JTlNUQU5DRSAgICAgIDB4MEQKKy8qIC4uLiAqLworI2RlZmluZSBUWF9USU1FUl9FUlJPUiAgICAgIDB4MTUKKyNkZWZpbmUgVFhfVElDS19FUlJPUiAgICAgICAweDE2CisvKiAuLi4gKi8KKworI2lmbmRlZiB0cnVlCisjZGVmaW5lIHRydWUgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNpZm5kZWYgZmFsc2UKKyNkZWZpbmUgZmFsc2UgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyogRm9sbG93aW5nIG1hY3JvIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB3aGljaCBjb25zdGl0dXRlIDEgVGhyZWFkWCB0aW1lciB0aWNrLiBVc2VkCisgICBmb3IgbWltaWNraW5nIHRoZSBUaHJlYWRYIHRpbWVyIGJlaGF2aW91ciBvbiBWT1NTLiAqLworLyogVXNlIHRoZSBzYW1lIE1BQ1JPIHVzZWQgYnkgZmlybXdhcmUgbW9kdWxlcyB0byBjYWxjdWxhdGUgVElDS3MgZnJvbSBtU2VjICovCisvKiBNaXNtYXRjaCB3b3VsZCBjYXVzZSB3b3JuZyB0aW1lciB2YWx1ZSB0byBiZSBwcm9ncmFtbWVkICovCisjZGVmaW5lIFRYX01TRUNTX0lOXzFfVElDSyAgU1lTX1RJQ0tfRFVSX01TCisKKy8qIFNpZ25hdHVyZSB3aXRoIHdoaWNoIHRoZSBUWF9USU1FUiBzdHJ1Y3QgaXMgaW5pdGlhbGl6ZWQsIHdoZW4gdGhlIHRpbWVyIGlzIGNyZWF0ZWQgKi8KKyNkZWZpbmUgVFhfQUlSR09fVE1SX1NJR05BVFVSRSAgIDB4REVBREJFRUYKKworI2lmZGVmIFRJTUVSX01BTkFHRVIKKyNkZWZpbmUgIHR4X3RpbWVyX2NyZWF0ZShhLCBiLCBjLCBkLCBlLCBmLCBnKSAgIHR4X3RpbWVyX2NyZWF0ZV9pbnRlcm5fZGVidWcoKHZvaWQgKilwTWFjLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZWxzZQorI2RlZmluZSAgdHhfdGltZXJfY3JlYXRlKGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgdHhfdGltZXJfY3JlYXRlX2ludGVybigodm9pZCAqKXBNYWMsIGEsIGIsIGMsIGQsIGUsIGYsIGcpCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBUaW1lciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaW1wbGVtZW50IFRocmVhZFggdGltZXIgZmFjaWxpdHkuICBKdXN0ICAqLworLyogbGlrZSBUaHJlYWRYLCB0aW1lciBleHBpcmF0aW9uIGhhbmRsZXIgZXhlY3V0ZXMgYXQgdGhlIGhpZ2hlc3QgICAgICovCisvKiBwb3NzaWJsZSBwcmlvcml0eSBsZXZlbCwgaS5lLiBESVNQQVRDSF9MRVZFTC4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgVFhfVElNRVJfU1RSVUNUIHsKKyNpZmRlZiBXTEFOX0RFQlVHCisjZGVmaW5lIFRJTUVSX01BWF9OQU1FX0xFTiA1MAorCWNoYXIgdGltZXJOYW1lW1RJTUVSX01BWF9OQU1FX0xFTl07CisjZW5kaWYKKwl1aW50NjRfdCB0bXJTaWduYXR1cmU7CisJdm9pZCAoKnBFeHBpcmVGdW5jKSh2b2lkICosIHVpbnQzMl90KTsKKwl1aW50MzJfdCBleHBpcmVJbnB1dDsKKwl1aW50NjRfdCBpbml0U2NoZWR1bGVUaW1lSW5Nc2VjczsKKwl1aW50NjRfdCByZXNjaGVkdWxlVGltZUluTXNlY3M7CisJY2RmX21jX3RpbWVyX3QgY2RmX3RpbWVyOworCisJLyogUG9pbnRlciB0byB0aGUgTUFDIGdsb2JhbCBzdHJ1Y3R1cmUsIHdoaWNoIHN0b3JlcyB0aGUgY29udGV4dCBmb3IgdGhlIE5JQywgKi8KKwkvKiBmb3Igd2hpY2ggdGhpcyB0aW1lciBpcyBzdXBwb3NlZCB0byBvcGVyYXRlLiAqLworCXZvaWQgKnBNYWM7CisJdWludDhfdCBzZXNzaW9uSWQ7CisKK30gVFhfVElNRVI7CisKKyNkZWZpbmUgVFhfVElNRVJfVkFMSUQodGltZXIpICh0aW1lci5wTWFjICE9IDApCisKK2V4dGVybiB1aW50NjRfdCB0eF90aW1lX2dldCh2b2lkKTsKK2V4dGVybiB1aW50MzJfdCB0eF90aW1lcl9hY3RpdmF0ZShUWF9USU1FUiAqKTsKK2V4dGVybiB1aW50MzJfdCB0eF90aW1lcl9jaGFuZ2UoVFhfVElNRVIgKiwgdWludDY0X3QsIHVpbnQ2NF90KTsKK2V4dGVybiB1aW50MzJfdCB0eF90aW1lcl9jaGFuZ2VfY29udGV4dChUWF9USU1FUiAqLCB1aW50MzJfdCk7CisjaWZkZWYgVElNRVJfTUFOQUdFUgorZXh0ZXJuIHVpbnQzMl90IHR4X3RpbWVyX2NyZWF0ZV9pbnRlcm5fZGVidWcodm9pZCAqLCBUWF9USU1FUiAqLAorCQkJCQkgICAgIGNoYXIgKiwgdm9pZCAoKikodm9pZCAqLAorCQkJCQkJCSAgICAgIHVpbnQzMl90KSwKKwkJCQkJICAgICB1aW50MzJfdCwgdWludDY0X3QsCisJCQkJCSAgICAgdWludDY0X3QsIHVpbnQ2NF90LAorCQkJCQkgICAgIGNoYXIgKmZpbGVOYW1lLAorCQkJCQkgICAgIHVpbnQzMl90IGxpbmVOdW0pOworI2Vsc2UKK2V4dGVybiB1aW50MzJfdCB0eF90aW1lcl9jcmVhdGVfaW50ZXJuKHZvaWQgKiwgVFhfVElNRVIgKiwgY2hhciAqLAorCQkJCSAgICAgICB2b2lkICgqKSh2b2lkICosIHVpbnQzMl90KSwKKwkJCQkgICAgICAgdWludDMyX3QsIHVpbnQ2NF90LCB1aW50NjRfdCwKKwkJCQkgICAgICAgdWludDY0X3QpOworI2VuZGlmCitleHRlcm4gdWludDMyX3QgdHhfdGltZXJfZGVhY3RpdmF0ZShUWF9USU1FUiAqKTsKK2V4dGVybiB1aW50MzJfdCB0eF90aW1lcl9kZWxldGUoVFhfVElNRVIgKik7CitleHRlcm4gYm9vbCB0eF90aW1lcl9ydW5uaW5nKFRYX1RJTUVSICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvcGxhdGZvcm0vc3JjL3N5c193cmFwcGVyLmMgYi9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvcGxhdGZvcm0vc3JjL3N5c193cmFwcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0OTk2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy9wbGF0Zm9ybS9zcmMvc3lzX3dyYXBwZXIuYwpAQCAtMCwwICsxLDUwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEBmaWxlIFZvc3NXcmFwcGVyLmMKKworICAgQGJyaWVmIFRoaXMgc291cmNlIGZpbGUgY29udGFpbnMgdGhlIHZhcmlvdXMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIHRoZQorICAgUlRPUyBhYnN0cmFjdGlvbiBsYXllciwgaW1wbGVtZW50ZWQgZm9yIFZPU1MKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKyAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworICAgJEhlYWRlcjokICREYXRlVGltZTogJCAkQXV0aG9yOiAkCisKKyAgIHdoZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5CisgICAtLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIDAzLzMxLzA5ICAgIHNobyAgICBSZW1vdmUgdGhlIHVzZSBvZiBjZGZfdGltZXJJc0FjdGl2ZSBmbGFnIGFzIGl0IGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLXNhZmUKKyAgIDAyLzE3LzA4ICAgIHNobyAgICBGaXggdGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHdvcmsgd2hlbiBpdCBpcyBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSB0aW1lciBoYXMgc3RvcHBlZCBkdWUgdG8gYSByYWNlIGNvbmRpdGlvbi4KKyAgIDAyLzEwLzA4ICAgIHNobyAgICBSZWZhY3RvciB0aGUgVFggdGltZXIgdG8gdXNlIFZPUyB0aW1lciBkaXJlY3RseSBpbnN0ZWFkCisgICAgICAgICAgICAgICAgICAgICBvZiB1c2luZyBWT1MgdXRpbGl0eSB0aW1lcgorICAgMTIvMTUvMDggICAgc2hvICAgIFJlc29sdmVkIGVycm9ycyBhbmQgd2FybmluZ3MgZnJvbSB0aGUgQU1TUyBjb21waWxlciB3aGVuCisgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHBvcnRlZCBmcm9tIFdNCisgICAxMS8yMC8wOCAgICBzaG8gICAgUmVuYW1lZCB0aGlzIHRvIFZvc1dyYXBwZXIuYzsgcmVtb3ZlIGFsbCBkZXBlbmRlbmNpZXMgb24KKyAgICAgICAgICAgICAgICAgICAgIFdNIHBsYXRmb3JtIGFuZCBhbGxvdyB0aGlzIHRvIHdvcmsgb24gYWxsIFZPU1MgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0KKyAgIDA2LzI0LzA4ICAgIHRiaCAgICBNb2RpZmllZCB0aGUgZmlsZSB0byByZW1vdmUgdGhlIGRlcGVuZGVjeSBvbiBIREQgZmlsZXMgYXMKKyAgICAgICAgICAgICAgICAgICAgIHBhcnQgb2YgR2VuNiBicmluZyB1cCBwcm9jZXNzLgorICAgMTAvMjkvMDIgTmVlbGF5IERhcyBDcmVhdGVkIGZpbGUuCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN5c193cmFwcGVyLmgiCisKKyNpZmRlZiBXTEFOX0RFQlVHCisjZGVmaW5lIFRJTUVSX05BTUUgKHRpbWVyX3B0ci0+dGltZXJOYW1lKQorI2Vsc2UKKyNkZWZpbmUgVElNRVJfTkFNRSAiTi9BIgorI2VuZGlmCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdHhfdGltZV9nZXQoKQorICoKKyAqIEZVTkNUSU9OOgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtCisgKgorICogQHJldHVybiBjdXJyZW50IHN5c3RlbSB0aW1lIGluIHVuaXRzIG9mIG1pbGlzZWNvbmRzCisgKgorICovCit1aW50NjRfdCB0eF90aW1lX2dldCh2b2lkKQoreworCXJldHVybiAoY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKSk7CisKK30gLyogKiB0eF90aW1lX2dldCgpICovCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdHhfdGltZXJfYWN0aXZhdGUoKQorICoKKyAqIEZVTkNUSU9OOgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtCisgKgorICogQHJldHVybiBUWF9TVUNDRVNTLgorICoKKyAqLwordWludDMyX3QgdHhfdGltZXJfYWN0aXZhdGUoVFhfVElNRVIgKnRpbWVyX3B0cikKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCS8qIFVuY29tbWVudCB0aGUgYXNzZXJ0cywgaWYgdGhlIGludGVudGlvbiBpcyB0byBkZWJ1ZyB0aGUgb2NjdXJlbmNlIG9mIHRoZSAqLworCS8qIGZvbGxvd2luZyBhbm9tYWxvdXMgY25kaXRpb25zLiAqLworCisJLyogQXNzZXJ0IHRoYXQgdGhlIHRpbWVyIHN0cnVjdHVyZSBwb2ludGVyIHBhc3NlZCwgaXMgbm90IE5VTEwgKi8KKwkvKiBkYmdBc3NlcnQoTlVMTCAhPSB0aW1lcl9wdHIpOyAqLworCisJLyogSWYgdGhlIE5JQyBpcyBoYWx0aW5nIGp1c3Qgc3Bvb2YgYSBzdWNjZXNzZnVsIHRpbWVyIGFjdGl2YXRpb24sIHNvIHRoYXQgYWxsICovCisJLyogdGhlIHRpbWVycyBjYW4gYmUgY2xlYW5lZCB1cC4gKi8KKworCWlmIChOVUxMID09IHRpbWVyX3B0cikKKwkJcmV0dXJuIFRYX1RJTUVSX0VSUk9SOworCisJLyogUHV0IGEgY2hlY2sgZm9yIHRoZSBmcmVlIGJ1aWxkcyAqLworCWlmIChUWF9BSVJHT19UTVJfU0lHTkFUVVJFICE9IHRpbWVyX3B0ci0+dG1yU2lnbmF0dXJlKSB7CisJCUNERl9BU1NFUlQodGltZXJfcHRyLT50bXJTaWduYXR1cmUgPT0gMCk7CisKKwkJcmV0dXJuIFRYX1RJTUVSX0VSUk9SOworCisJfQorCS8qIENoZWNrIGZvciBhbiB1bmluaXRpYWxpemVkIHRpbWVyICovCisJQ0RGX0FTU0VSVCgwICE9IHN0cmxlbihUSU1FUl9OQU1FKSk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICJUaW1lciAlcyBiZWluZyBhY3RpdmF0ZWRcbiIsIFRJTUVSX05BTUUpOworCisJc3RhdHVzID0gY2RmX21jX3RpbWVyX3N0YXJ0KCZ0aW1lcl9wdHItPmNkZl90aW1lciwKKwkJCQkgICAgdGltZXJfcHRyLT5pbml0U2NoZWR1bGVUaW1lSW5Nc2Vjcyk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiVGltZXIgJXMgbm93IGFjdGl2YXRlZFxuIiwgVElNRVJfTkFNRSk7CisJCXJldHVybiBUWF9TVUNDRVNTOworCX0gZWxzZSBpZiAoQ0RGX1NUQVRVU19FX0FMUkVBRFkgPT0gc3RhdHVzKSB7CisJCS8qIHN0YXJ0aW5nIHRpbWVyIGZhaWxzIGJlY2F1c2UgdGltZXIgaXMgYWxyZWFkeSBzdGFydGVkOyB0aGlzIGlzIG9rYXkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIlRpbWVyICVzIGlzIGFscmVhZHkgcnVubmluZ1xuIiwgVElNRVJfTkFNRSk7CisJCXJldHVybiBUWF9TVUNDRVNTOworCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiVGltZXIgJXMgZmFpbHMgdG8gYWN0aXZhdGVcbiIsIFRJTUVSX05BTUUpOworCQlyZXR1cm4gVFhfVElNRVJfRVJST1I7CisJfQorfSAvKioqIHR4X3RpbWVyX2FjdGl2YXRlKCkgKioqLworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHR4X3RpbWVyX2NoYW5nZSgpCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0KKyAqCisgKiBAcmV0dXJuIFRYX1NVQ0NFU1MuCisgKgorICovCit1aW50MzJfdCB0eF90aW1lcl9jaGFuZ2UoVFhfVElNRVIgKnRpbWVyX3B0ciwKKwkJCSB1aW50NjRfdCBpbml0U2NoZWR1bGVUaW1lSW5UaWNrcywKKwkJCSB1aW50NjRfdCByZXNjaGVkdWxlVGltZUluVGlja3MpCit7CisJLyogUHV0IGEgY2hlY2sgZm9yIHRoZSBmcmVlIGJ1aWxkcyAqLworCWlmIChUWF9BSVJHT19UTVJfU0lHTkFUVVJFICE9IHRpbWVyX3B0ci0+dG1yU2lnbmF0dXJlKSB7CisJCUNERl9BU1NFUlQodGltZXJfcHRyLT50bXJTaWduYXR1cmUgPT0gMCk7CisKKwkJcmV0dXJuIFRYX1RJTUVSX0VSUk9SOworCX0KKwkvKiBjaGFuZ2VzIGNhbm5vdCBiZSBhcHBsaWVkIHVudGlsIHRpbWVyIHN0b3BzIHJ1bm5pbmcgKi8KKwlpZiAoQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQgPT0KKwkgICAgY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKCZ0aW1lcl9wdHItPmNkZl90aW1lcikpIHsKKwkJdGltZXJfcHRyLT5pbml0U2NoZWR1bGVUaW1lSW5Nc2VjcyA9CisJCQlUWF9NU0VDU19JTl8xX1RJQ0sgKiBpbml0U2NoZWR1bGVUaW1lSW5UaWNrczsKKwkJdGltZXJfcHRyLT5yZXNjaGVkdWxlVGltZUluTXNlY3MgPQorCQkJVFhfTVNFQ1NfSU5fMV9USUNLICogcmVzY2hlZHVsZVRpbWVJblRpY2tzOworCQlyZXR1cm4gVFhfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlyZXR1cm4gVFhfVElNRVJfRVJST1I7CisJfQorfSAvKioqIHR4X3RpbWVyX2NoYW5nZSgpICoqKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB0eF90aW1lcl9jaGFuZ2VfY29udGV4dCgpCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0KKyAqCisgKiBAcmV0dXJuIFRYX1NVQ0NFU1MuCisgKgorICovCit1aW50MzJfdCB0eF90aW1lcl9jaGFuZ2VfY29udGV4dChUWF9USU1FUiAqdGltZXJfcHRyLAorCQkJCSB1aW50MzJfdCBleHBpcmF0aW9uX2lucHV0KQoreworCisJLyogUHV0IGEgY2hlY2sgZm9yIHRoZSBmcmVlIGJ1aWxkcyAqLworCWlmIChUWF9BSVJHT19UTVJfU0lHTkFUVVJFICE9IHRpbWVyX3B0ci0+dG1yU2lnbmF0dXJlKSB7CisJCUNERl9BU1NFUlQodGltZXJfcHRyLT50bXJTaWduYXR1cmUgPT0gMCk7CisKKwkJcmV0dXJuIFRYX1RJTUVSX0VSUk9SOworCX0KKwkvKiBjaGFuZ2VzIGNhbm5vdCBiZSBhcHBsaWVkIHVudGlsIHRpbWVyIHN0b3BzIHJ1bm5pbmcgKi8KKwlpZiAoQ0RGX1RJTUVSX1NUQVRFX1NUT1BQRUQgPT0KKwkgICAgY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKCZ0aW1lcl9wdHItPmNkZl90aW1lcikpIHsKKwkJdGltZXJfcHRyLT5leHBpcmVJbnB1dCA9IGV4cGlyYXRpb25faW5wdXQ7CisJCXJldHVybiBUWF9TVUNDRVNTOworCX0gZWxzZSB7CisJCXJldHVybiBUWF9USU1FUl9FUlJPUjsKKwl9Cit9IC8qKiogdHhfdGltZXJfY2hhbmdlKCkgKioqLworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHR4X21haW5fdGltZXJfZnVuYygpCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0KKyAqCisgKiBAcmV0dXJuIE5vbmUuCisgKgorICovCitzdGF0aWMgdm9pZCB0eF9tYWluX3RpbWVyX2Z1bmModm9pZCAqZnVuY3Rpb25Db250ZXh0KQoreworCVRYX1RJTUVSICp0aW1lcl9wdHIgPSAoVFhfVElNRVIgKikgZnVuY3Rpb25Db250ZXh0OworCisJaWYgKE5VTEwgPT0gdGltZXJfcHRyKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTlVMTCA9PSB0aW1lcl9wdHItPnBFeHBpcmVGdW5jKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybjsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICJUaW1lciAlcyB0cmlnZ2VyZWQiLCBUSU1FUl9OQU1FKTsKKworCS8qIE5vdyBjYWxsIHRoZSBhY3R1YWwgdGltZXIgZnVuY3Rpb24sIHRha2luZyB0aGUgZnVuY3Rpb24gcG9pbnRlciwgKi8KKwkvKiBmcm9tIHRoZSB0aW1lciBzdHJ1Y3R1cmUuICovCisJKCp0aW1lcl9wdHItPnBFeHBpcmVGdW5jKSh0aW1lcl9wdHItPnBNYWMsIHRpbWVyX3B0ci0+ZXhwaXJlSW5wdXQpOworCisJLyogY2hlY2sgaWYgdGhpcyBuZWVkcyB0byBiZSByZXNjaGVkdWxlZCAqLworCWlmICgwICE9IHRpbWVyX3B0ci0+cmVzY2hlZHVsZVRpbWVJbk1zZWNzKSB7CisJCUNERl9TVEFUVVMgc3RhdHVzOworCQlzdGF0dXMgPSBjZGZfbWNfdGltZXJfc3RhcnQoJnRpbWVyX3B0ci0+Y2RmX3RpbWVyLAorCQkJCQkgICAgdGltZXJfcHRyLT5yZXNjaGVkdWxlVGltZUluTXNlY3MpOworCQl0aW1lcl9wdHItPnJlc2NoZWR1bGVUaW1lSW5Nc2VjcyA9IDA7CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NZUywgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJICAiVW5hYmxlIHRvIHJlc2NoZWR1bGUgdGltZXIgJXM7IHN0YXR1cz0lZCIsCisJCQkJICBUSU1FUl9OQU1FLCBzdGF0dXMpOworCQl9CisJfQorfSAvKioqIHR4X3RpbWVyX2NoYW5nZSgpICoqKi8KKworI2lmZGVmIFRJTUVSX01BTkFHRVIKK3VpbnQzMl90IHR4X3RpbWVyX2NyZWF0ZV9pbnRlcm5fZGVidWcodm9pZCAqcE1hY0dsb2JhbCwKKwkJCQkgICAgICBUWF9USU1FUiAqdGltZXJfcHRyLCBjaGFyICpuYW1lX3B0ciwKKwkJCQkgICAgICB2b2lkICgqZXhwaXJhdGlvbl9mdW5jdGlvbikodm9pZCAqLAorCQkJCQkJCQkgIHVpbnQzMl90KSwKKwkJCQkgICAgICB1aW50MzJfdCBleHBpcmF0aW9uX2lucHV0LAorCQkJCSAgICAgIHVpbnQ2NF90IGluaXRTY2hlZHVsZVRpbWVJblRpY2tzLAorCQkJCSAgICAgIHVpbnQ2NF90IHJlc2NoZWR1bGVUaW1lSW5UaWNrcywKKwkJCQkgICAgICB1aW50NjRfdCBhdXRvX2FjdGl2YXRlLCBjaGFyICpmaWxlTmFtZSwKKwkJCQkgICAgICB1aW50MzJfdCBsaW5lTnVtKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKE5VTEwgPT0gZXhwaXJhdGlvbl9mdW5jdGlvbikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIk5VTEwgdGltZXIgZXhwaXJhdGlvbiIpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gVFhfVElNRVJfRVJST1I7CisJfQorCisJaWYgKE5VTEwgPT0gbmFtZV9wdHIpIHsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIk5VTEwgbmFtZSBwb2ludGVyIGZvciB0aW1lciIpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gVFhfVElNRVJfRVJST1I7CisJfQorCWlmICghaW5pdFNjaGVkdWxlVGltZUluVGlja3MpCisJCXJldHVybiBUWF9USUNLX0VSUk9SOworCisJaWYgKCF0aW1lcl9wdHIpCisJCXJldHVybiBUWF9USU1FUl9FUlJPUjsKKworCS8qIEluaXRpYWxpemUgdGltZXIgc3RydWN0dXJlICovCisJdGltZXJfcHRyLT5wRXhwaXJlRnVuYyA9IGV4cGlyYXRpb25fZnVuY3Rpb247CisJdGltZXJfcHRyLT5leHBpcmVJbnB1dCA9IGV4cGlyYXRpb25faW5wdXQ7CisJdGltZXJfcHRyLT5pbml0U2NoZWR1bGVUaW1lSW5Nc2VjcyA9CisJCVRYX01TRUNTX0lOXzFfVElDSyAqIGluaXRTY2hlZHVsZVRpbWVJblRpY2tzOworCXRpbWVyX3B0ci0+cmVzY2hlZHVsZVRpbWVJbk1zZWNzID0KKwkJVFhfTVNFQ1NfSU5fMV9USUNLICogcmVzY2hlZHVsZVRpbWVJblRpY2tzOworCXRpbWVyX3B0ci0+cE1hYyA9IHBNYWNHbG9iYWw7CisKKwkvKiBTZXQgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSB0aW1lciB3YXMgY3JlYXRlZCAqLworCXRpbWVyX3B0ci0+dG1yU2lnbmF0dXJlID0gVFhfQUlSR09fVE1SX1NJR05BVFVSRTsKKworI2lmZGVmIFdMQU5fREVCVUcKKwkvKiBTdG9yZSB0aGUgdGltZXIgbmFtZSAqLworCXN0cmxjcHkodGltZXJfcHRyLT50aW1lck5hbWUsIG5hbWVfcHRyLCBzaXplb2YodGltZXJfcHRyLT50aW1lck5hbWUpKTsKKyNlbmRpZiAvKiBTdG9yZSB0aGUgdGltZXIgbmFtZSwgZm9yIERlYnVnIGJ1aWxkIG9ubHkgKi8KKworCXN0YXR1cyA9CisJCWNkZl9tY190aW1lcl9pbml0X2RlYnVnKCZ0aW1lcl9wdHItPmNkZl90aW1lciwgQ0RGX1RJTUVSX1RZUEVfU1csCisJCQkJCXR4X21haW5fdGltZXJfZnVuYywgKHZvaWQgKikgdGltZXJfcHRyLAorCQkJCQlmaWxlTmFtZSwgbGluZU51bSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJDYW5ub3QgY3JlYXRlIHRpbWVyIGZvciAlc1xuIiwgVElNRVJfTkFNRSk7CisJCXJldHVybiBUWF9USU1FUl9FUlJPUjsKKwl9CisKKwlpZiAoMCAhPSByZXNjaGVkdWxlVGltZUluVGlja3MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIkNyZWF0aW5nIHBlcmlvZGljIHRpbWVyIGZvciAlc1xuIiwgVElNRVJfTkFNRSk7CisJfQorCS8qIEFjdGl2YXRlIHRoaXMgdGltZXIgaWYgcmVxdWlyZWQgKi8KKwlpZiAoYXV0b19hY3RpdmF0ZSkgeworCQl0eF90aW1lcl9hY3RpdmF0ZSh0aW1lcl9wdHIpOworCX0KKworCXJldHVybiBUWF9TVUNDRVNTOworCit9IC8qICoqIHR4X3RpbWVyX2NyZWF0ZSgpICoqKiAvICovCisjZWxzZQordWludDMyX3QgdHhfdGltZXJfY3JlYXRlX2ludGVybih2b2lkICpwTWFjR2xvYmFsLCBUWF9USU1FUiAqdGltZXJfcHRyLAorCQkJCWNoYXIgKm5hbWVfcHRyLAorCQkJCXZvaWQgKCpleHBpcmF0aW9uX2Z1bmN0aW9uKSh2b2lkICosCisJCQkJCQkJICAgIHVpbnQzMl90KSwKKwkJCQl1aW50MzJfdCBleHBpcmF0aW9uX2lucHV0LAorCQkJCXVpbnQ2NF90IGluaXRTY2hlZHVsZVRpbWVJblRpY2tzLAorCQkJCXVpbnQ2NF90IHJlc2NoZWR1bGVUaW1lSW5UaWNrcywKKwkJCQl1aW50NjRfdCBhdXRvX2FjdGl2YXRlKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKChOVUxMID09IG5hbWVfcHRyKSB8fCAoTlVMTCA9PSBleHBpcmF0aW9uX2Z1bmN0aW9uKSkKKwkJcmV0dXJuIFRYX1RJTUVSX0VSUk9SOworCisJaWYgKCFpbml0U2NoZWR1bGVUaW1lSW5UaWNrcykKKwkJcmV0dXJuIFRYX1RJQ0tfRVJST1I7CisKKwlpZiAoIXRpbWVyX3B0cikKKwkJcmV0dXJuIFRYX1RJTUVSX0VSUk9SOworCisJLyogSW5pdGlhbGl6ZSB0aW1lciBzdHJ1Y3R1cmUgKi8KKwl0aW1lcl9wdHItPnBFeHBpcmVGdW5jID0gZXhwaXJhdGlvbl9mdW5jdGlvbjsKKwl0aW1lcl9wdHItPmV4cGlyZUlucHV0ID0gZXhwaXJhdGlvbl9pbnB1dDsKKwl0aW1lcl9wdHItPmluaXRTY2hlZHVsZVRpbWVJbk1zZWNzID0KKwkJVFhfTVNFQ1NfSU5fMV9USUNLICogaW5pdFNjaGVkdWxlVGltZUluVGlja3M7CisJdGltZXJfcHRyLT5yZXNjaGVkdWxlVGltZUluTXNlY3MgPQorCQlUWF9NU0VDU19JTl8xX1RJQ0sgKiByZXNjaGVkdWxlVGltZUluVGlja3M7CisJdGltZXJfcHRyLT5wTWFjID0gcE1hY0dsb2JhbDsKKworCS8qIFNldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHRpbWVyIHdhcyBjcmVhdGVkICovCisJdGltZXJfcHRyLT50bXJTaWduYXR1cmUgPSBUWF9BSVJHT19UTVJfU0lHTkFUVVJFOworCisjaWZkZWYgV0xBTl9ERUJVRworCS8qIFN0b3JlIHRoZSB0aW1lciBuYW1lICovCisJc3RybGNweSh0aW1lcl9wdHItPnRpbWVyTmFtZSwgbmFtZV9wdHIsIHNpemVvZih0aW1lcl9wdHItPnRpbWVyTmFtZSkpOworI2VuZGlmIC8qIFN0b3JlIHRoZSB0aW1lciBuYW1lLCBmb3IgRGVidWcgYnVpbGQgb25seSAqLworCisJc3RhdHVzID0gY2RmX21jX3RpbWVyX2luaXQoJnRpbWVyX3B0ci0+Y2RmX3RpbWVyLCBDREZfVElNRVJfVFlQRV9TVywKKwkJCQkgICB0eF9tYWluX3RpbWVyX2Z1bmMsICh2b2lkICopIHRpbWVyX3B0cik7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJDYW5ub3QgY3JlYXRlIHRpbWVyIGZvciAlc1xuIiwgVElNRVJfTkFNRSk7CisJCXJldHVybiBUWF9USU1FUl9FUlJPUjsKKwl9CisKKwlpZiAoMCAhPSByZXNjaGVkdWxlVGltZUluVGlja3MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIkNyZWF0aW5nIHBlcmlvZGljIHRpbWVyIGZvciAlc1xuIiwgVElNRVJfTkFNRSk7CisJfQorCS8qIEFjdGl2YXRlIHRoaXMgdGltZXIgaWYgcmVxdWlyZWQgKi8KKwlpZiAoYXV0b19hY3RpdmF0ZSkgeworCQl0eF90aW1lcl9hY3RpdmF0ZSh0aW1lcl9wdHIpOworCX0KKworCXJldHVybiBUWF9TVUNDRVNTOworCit9IC8qICoqIHR4X3RpbWVyX2NyZWF0ZSgpICoqKiAvICovCisjZW5kaWYKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB0eF90aW1lcl9kZWFjdGl2YXRlKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbQorICoKKyAqIEByZXR1cm4gVFhfU1VDQ0VTUy4KKyAqCisgKi8KK3VpbnQzMl90IHR4X3RpbWVyX2RlYWN0aXZhdGUoVFhfVElNRVIgKnRpbWVyX3B0cikKK3sKKwlDREZfU1RBVFVTIHZTdGF0dXM7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAidHhfdGltZXJfZGVhY3RpdmF0ZSgpIGNhbGxlZCBmb3IgdGltZXIgJXNcbiIsIFRJTUVSX05BTUUpOworCisJLyogUHV0IGEgY2hlY2sgZm9yIHRoZSBmcmVlIGJ1aWxkcyAqLworCWlmIChUWF9BSVJHT19UTVJfU0lHTkFUVVJFICE9IHRpbWVyX3B0ci0+dG1yU2lnbmF0dXJlKSB7CisJCXJldHVybiBUWF9USU1FUl9FUlJPUjsKKwl9CisJLyogaWYgdGhlIHRpbWVyIGlzIG5vdCBydW5uaW5nIHRoZW4gd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZSAqLworCXZTdGF0dXMgPSBjZGZfbWNfdGltZXJfc3RvcCgmdGltZXJfcHRyLT5jZGZfdGltZXIpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gdlN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICJVbmFibGUgdG8gc3RvcCB0aW1lciAlczsgc3RhdHVzID0lZFxuIiwKKwkJCSAgVElNRVJfTkFNRSwgdlN0YXR1cyk7CisJfQorCisJcmV0dXJuIFRYX1NVQ0NFU1M7CisKK30gLyoqKiB0eF90aW1lcl9kZWFjdGl2YXRlKCkgKioqLworCit1aW50MzJfdCB0eF90aW1lcl9kZWxldGUoVFhfVElNRVIgKnRpbWVyX3B0cikKK3sKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICJ0eF90aW1lcl9kZWxldGUoKSBjYWxsZWQgZm9yIHRpbWVyICVzXG4iLCBUSU1FUl9OQU1FKTsKKworCS8qIFB1dCBhIGNoZWNrIGZvciB0aGUgZnJlZSBidWlsZHMgKi8KKwlpZiAoVFhfQUlSR09fVE1SX1NJR05BVFVSRSAhPSB0aW1lcl9wdHItPnRtclNpZ25hdHVyZSkgeworCQlyZXR1cm4gVFhfVElNRVJfRVJST1I7CisJfQorCisJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnRpbWVyX3B0ci0+Y2RmX3RpbWVyKTsKKwlyZXR1cm4gVFhfU1VDQ0VTUzsKK30gLyoqKiB0eF90aW1lcl9kZWxldGUoKSAqKiovCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdHhfdGltZXJfcnVubmluZygpCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0KKyAqCisgKiBAcmV0dXJuIFRYX1NVQ0NFU1MuCisgKgorICovCitib29sIHR4X3RpbWVyX3J1bm5pbmcoVFhfVElNRVIgKnRpbWVyX3B0cikKK3sKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TWVMsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICJ0eF90aW1lcl9ydW5uaW5nKCkgY2FsbGVkIGZvciB0aW1lciAlc1xuIiwgVElNRVJfTkFNRSk7CisKKwkvKiBQdXQgYSBjaGVjayBmb3IgdGhlIGZyZWUgYnVpbGRzICovCisJaWYgKFRYX0FJUkdPX1RNUl9TSUdOQVRVUkUgIT0gdGltZXJfcHRyLT50bXJTaWduYXR1cmUpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChDREZfVElNRVJfU1RBVEVfUlVOTklORyA9PQorCSAgICBjZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoJnRpbWVyX3B0ci0+Y2RmX3RpbWVyKSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworCit9IC8qKiogdHhfdGltZXJfcnVubmluZygpICoqKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy9zeXN0ZW0vaW5jL3N5c19kZWJ1Zy5oIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3N5c3RlbS9pbmMvc3lzX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyNTc4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy9zeXN0ZW0vaW5jL3N5c19kZWJ1Zy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIHN5c19nbG9iYWwuaCBjb250YWlucyB0aGUgbG9nRHVtcCB1dGlsaXR5IGZvciBzeXN0ZW0gbW9kdWxlLgorICogQXV0aG9yOiAgICAgIFYuIEsuIEthbmRhcnBhCisgKiBEYXRlOiAgICAgICAgMDEvMjQvMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9fU1lTX0RFQlVHX0hfXworI2RlZmluZSBfX1NZU19ERUJVR19IX18KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorI2luY2x1ZGUgInNpcl9kZWJ1Zy5oIgorI2luY2x1ZGUgInNpcl9wYXJhbXMuaCIKKwordm9pZCBzeXNfbG9nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IGxvZ2xldmVsLCBjb25zdCBjaGFyICpwU3RyaW5nLCAuLi4pOworCisjZW5kaWYgLyogX19TWVNfREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNfZGVmLmggYi9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNfZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkYWUzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy9zeXN0ZW0vaW5jL3N5c19kZWYuaApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGZpbGUgc3lzX2RlZi5oIGNvbnRhaW5zIHRoZSBjb21tb24gZGVmaW5pdGlvbnMgdXNlZCB0byBicmluZyB1cAorICogU2lyaXVzIHN5c3RlbS4KKyAqIEF1dGhvcjogICAgICBWLiBLLiBLYW5kYXJwYQorICogRGF0ZTogICAgICAgIDA0LzEzLzIwMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fU1lTREVGX0gKKyNkZWZpbmUgX19TWVNERUZfSAorCisvKiAvIFNpcml1cyBzeXN0ZW0gbGV2ZWwgZGVmaW5pdGlvbnMgKi8KKy8qIE5PVEU6IERvIG5vdCBwcm9ncmFtIHN5c3RlbSB0aW1lciB0aWNrIGR1cmF0aW9uIHRvIGxlc3MgdGhhbiAxbXNlYyAqLworCisvKiAvIFN5c3RlbSB0aW1lciB0aWNrIGR1cmF0aW9uIGluIG5hbm9zZWNvbmRzICovCisjZGVmaW5lIFNZU19USUNLX0RVUl9OUyAgICAgMTAwMDAwMDAgICAgLyogMTBtcyAqLworI2RlZmluZSBTWVNfVElDS19UT19NSUNST19TRUNPTkQgICAxMDAwMAorCisvKiAvIFN5c3RlbSB0aW1lciB0aWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBTWVNfVElDS19EVVJfTVMgICAgIChTWVNfVElDS19EVVJfTlMvMTAwMDAwMCkKKworLyogLyBDbG9ja3MgaW4gYSBtaWxsaXNlY29uZCAqLworI2RlZmluZSBTWVNfQ0xPQ0tTX1BFUl9NUyAgIDEyMDAwMCAgICAgIC8qIDEyMCBNSHogKi8KKworLyogLyBTeXN0ZW0gdGltZXIgdGljayBkdXJhdGlvbiBpbiBjbG9ja3MgKi8KKyNkZWZpbmUgU1lTX1RJQ0tfRFVSX0NMSyAgICAoU1lTX1RJQ0tfRFVSX01TICogU1lTX0NMT0NLU19QRVJfTVMpCisKKy8qIC8gTnVtYmVyIG9mIHRpbWVyIHRpY2tzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIFNZU19USUNLU19QRVJfU0VDT05EICgxMDAwL1NZU19USUNLX0RVUl9NUykKKworLyogLyBNYWNybyB0byBjb252ZXJ0IE1TIHRvIFRpY2tzICovCisjZGVmaW5lIFNZU19NU19UT19USUNLUyh4KSAgICgoeCkgLyBTWVNfVElDS19EVVJfTVMpCisKKy8qIC8gTWFjcm8gdG8gY29udmVydCBTZWNvbmRzIHRvIFRpY2tzICovCisjZGVmaW5lIFNZU19TRUNfVE9fVElDS1MoeCkgICgoeCkgKiBTWVNfVElDS1NfUEVSX1NFQ09ORCkKKworLyogLyBNYWNybyB0byBjb252ZXJ0IE1pbnV0ZXMgdG8gVGlja3MgKi8KKyNkZWZpbmUgU1lTX01JTl9UT19USUNLUyh4KSAgKCgoeCkgKiA2MCkgKiBTWVNfVElDS1NfUEVSX1NFQ09ORCkKKworLyogLyBNTlQgdGFzayBwcm9jZXNzaW5nIGludGVydmFsIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgU1lTX01OVF9JTlRFUlZBTCAgICAgNjAKKworLyogLyBNUyB0byBUaW1lIFVuaXRzICovCisjZGVmaW5lIFNZU19NU19UT19UVSh4KSAgICAgICgoeCAqIDEwMDApID4+IDEwKQorCisvKiAvIFRVIHRvIE1TICovCisjZGVmaW5lIFNZU19UVV9UT19NUyh4KSAgICAgICgoeCA8PCAxMCkgLyAxMDAwKQorCisvKiAtLS0tLS0tLS0gIEVuZCBvZiBXaW5kb3dzICYgUlRBSSAtLS0tLS0tLS0tLSAqLworCisvKiAvIE1lc3NhZ2UgcXVldWUgZGVmaW5pdGlvbnMgKi8KKworLyogLyBnSGFsTXNnUSAqLworI2RlZmluZSBTWVNfSEFMX1FfU0laRSAgICAgMjAwICAvKiBIb2xkcyB1cCB0byAyNSBtZXNzYWdlcyAqLworCisvKiAvIGdNTUhoaVByaW9yaXR5TXNnUSAqLworI2RlZmluZSBTWVNfTU1IX0hJX1BSSV9RX1NJWkUgICAgICAyMDAgIC8qIEhvbGRzIHVwIHRvIDI1IG1lc3NhZ2VzICovCisKKy8qIC8gZ01NSHByb3RvY29sTXNnUSAqLworI2RlZmluZSBTWVNfTU1IX1BST1RfUV9TSVpFICAgICA0MDAgICAgIC8qIEhvbGRzIHVwIHRvIDUwIG1lc3NhZ2VzICovCisKKy8qIC8gZ01NSGRlYnVnTXNnUSAqLworI2RlZmluZSBTWVNfTU1IX0RFQlVHX1FfU0laRSAgICA4MDAgICAgIC8qIEhvbGRzIHVwIHRvIDEwMCBtZXNzYWdlcyAqLworCisvKiAvIGdNQUlOVG1zZ1EgKi8KKyNkZWZpbmUgU1lTX01OVF9RX1NJWkUgICAgICAgICAgMjAwICAgICAvKiBIb2xkcyB1cCB0byAyNSBtZXNzYWdlcyAqLworCisvKiAvIExJTSBNZXNzYWdlIFF1ZXVlICovCisjZGVmaW5lIFNZU19MSU1fUV9TSVpFICAgICAgICAgIDQwMCAgICAgLyogSG9sZHMgdXAgdG8gNTAgbWVzc2FnZXMgKi8KKworLyogLyBTY2hlZHVsZXIgTWVzc2FnZSBRdWV1ZSAqLworI2RlZmluZSBTWVNfU0NIX1FfU0laRSAgICAgICAgICA4MDAgICAgIC8qIEhvbGRzIHVwIHRvIDI1IG1lc3NhZ2VzICovCisKKy8qIC8gUE1NIE1lc3NhZ2UgUXVldWUgKi8KKyNkZWZpbmUgU1lTX1BNTV9RX1NJWkUgICAgICAgICAgODAwICAgICAvKiBIb2xkcyB1cCB0byAxMDAgbWVzc2FnZXMgKi8KKworLyogLyBUWCBNZXNzYWdlIFF1ZXVlICovCisjZGVmaW5lIFNZU19UWF9RX1NJWkUgICAgICAgICAgIDIwNDggICAgLyogSG9sZHMgdXAgdG8gNDAwIG1lc3NhZ2VzICovCisKKy8qIC8gUlggTWVzc2FnZSBRdWV1ZSAqLworI2RlZmluZSBTWVNfUlhfUV9TSVpFICAgICAgICAgICAyMDQ4ICAgIC8qIEhvbGRzIHVwIHRvIDQwMCBtZXNzYWdlcyAqLworCisvKiAvIFBUVCAgTWVzc2FnZSBRdWV1ZSAqLworI2RlZmluZSBTWVNfTklNX1BUVF9RX1NJWkUgICAyMDAgICAgICAgIC8qIEhvbGRzIHVwIHRvIDI1IG1lc3NhZ2VzICovCisKKy8qIC8gVGhyZWFkIGRlZmluaXRpb25zICovCisvKiB0SEFMICovCisKKyNkZWZpbmUgU1lTX0hBTF9USFJFQURfRU5UUllfRlVOQ1RJT04gaGFsRW50cnkKKyNkZWZpbmUgU1lTX0hBTF9TVEFDS19TSVpFICAgICAgICAgICAgODE5MgorI2RlZmluZSBTWVNfSEFMX1RIUkVBRF9QUklPUklUWSAgICAgICAyCisKKy8qIHREUEggKi8KKworI2RlZmluZSBTWVNfRFBIX1RIUkVBRF9FTlRSWV9GVU5DVElPTiBkcGhFbnRyeQorI2RlZmluZSBTWVNfRFBIX1NUQUNLX1NJWkUgICAgICAgICAgICA4MTkyCisjZGVmaW5lIFNZU19EUEhfVEhSRUFEX1BSSU9SSVRZICAgICAgIDE1CisKKy8qIHRCQlQgKi8KKworI2RlZmluZSBTWVNfQkJUX1RIUkVBRF9FTlRSWV9GVU5DVElPTiBiYnRFbnRyeQorI2RlZmluZSBTWVNfQkJUX1NUQUNLX1NJWkUgICAgICAgICAgICA4MTkyCisjZGVmaW5lIFNZU19CQlRfVEhSRUFEX1BSSU9SSVRZICAgICAgIDE2CisKKy8qIHRTQ0ggKi8KKworI2RlZmluZSBTWVNfU0NIX1NUQUNLX1NJWkUgICAgICAgICAgICA4MTkyCisjZGVmaW5lIFNZU19TQ0hfVEhSRUFEX1BSSU9SSVRZICAgICAgIDE3CisKKy8qIHRQTU0gKi8KKworI2RlZmluZSBTWVNfUE1NX1NUQUNLX1NJWkUgICAgICAgICAgICA4MTkyCisjZGVmaW5lIFNZU19QTU1fVEhSRUFEX1BSSU9SSVRZICAgICAgIDE3CisKKy8qIHRMSU0gKi8KKworI2RlZmluZSBTWVNfTElNX1RIUkVBRF9FTlRSWV9GVU5DVElPTiBsaW1FbnRyeQorI2RlZmluZSBTWVNfTElNX1NUQUNLX1NJWkUgICAgICAgICAgICA4MTkyCisjZGVmaW5lIFNZU19MSU1fVEhSRUFEX1BSSU9SSVRZICAgICAgIDE4CisKKy8qIHRNQUlOVCAqLworCisjZGVmaW5lIFNZU19NTlRfVEhSRUFEX0VOVFJZX0ZVTkNUSU9OIG1udEVudHJ5CisjZGVmaW5lIFNZU19NTlRfU1RBQ0tfU0laRSAgICAgICAgICAgIDgxOTIKKyNkZWZpbmUgU1lTX01OVF9USFJFQURfUFJJT1JJVFkgICAgICAgMjUKKworLyogdE1NSCAqLworCisjZGVmaW5lIFNZU19NTUhfVEhSRUFEX0VOVFJZX0ZVTkNUSU9OIG1taEVudHJ5CisjZGVmaW5lIFNZU19NTUhfU1RBQ0tfU0laRSAgICAgICAgICAgIDgxOTIKKyNkZWZpbmUgU1lTX01NSF9USFJFQURfUFJJT1JJVFkgICAgICAgIDEwCisKKy8qIHROSU1fTU5UX1BLVF9HRU4gKi8KKworI2RlZmluZSBTWVNfTklNX1BUVF9USFJFQURfU1RBQ0tfU0laRSA4MTkyCisjZGVmaW5lIFNZU19OSU1fUFRUX1RIUkVBRF9QUklPUklUWSAgIDI4CisKKyNlbmRpZiAvKiBfX1NZU0RFRl9IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNfZW50cnlfZnVuYy5oIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3N5c3RlbS9pbmMvc3lzX2VudHJ5X2Z1bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWFmYzhiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3N5c3RlbS9pbmMvc3lzX2VudHJ5X2Z1bmMuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFRoaXMgZmlsZSBzeXNfZW50cnlfZnVuYy5oIGNvbnRhaW5zIG1vZHVsZSBlbnRyeSBmdW5jdGlvbnMgZGVmaW5pdGlvbnMKKyAqIEF1dGhvcjogICAgICBWLiBLLiBLYW5kYXJwYQorICogRGF0ZTogICAgICAgIDA0LzEzLzIwMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfX1NZU19FTlRSWV9GVU5DX0gKKyNkZWZpbmUgX19TWVNfRU5UUllfRlVOQ19ICisKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIHN5c19pbml0X2dsb2JhbHModHBBbmlTaXJHbG9iYWwpOworZXh0ZXJuIHZvaWQgc3lzQmJ0RW50cnkodWludDMyX3QgZHVtbXkpOworZXh0ZXJuIHZvaWQgc3lzU2NoRW50cnkodWludDMyX3QgZHVtbXkpOworZXh0ZXJuIHZvaWQgc3lzUG1tRW50cnkodWludDMyX3QgZHVtbXkpOworZXh0ZXJuIHZvaWQgc3lzRHBoRW50cnkodWludDMyX3QgZHVtbXkpOworZXh0ZXJuIHZvaWQgc3lzTGltRW50cnkodWludDMyX3QgZHVtbXkpOworZXh0ZXJuIHZvaWQgc3lzTW1oRW50cnkodWludDMyX3QgZHVtbXkpOworZXh0ZXJuIHZvaWQgc3lzTW50RW50cnkodWludDMyX3QgZHVtbXkpOworZXh0ZXJuIHZvaWQgc3lzSGFsRW50cnkodWludDMyX3QgZHVtbXkpOworZXh0ZXJuIHZvaWQgc3lzTmltUHR0RW50cnkodWludDMyX3QgZHVtbXkpOworCisjZW5kaWYgLyogX19TWVNfRU5UUllfRlVOQ19IICovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNfc3RhcnR1cC5oIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3N5c3RlbS9pbmMvc3lzX3N0YXJ0dXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTZiZDYxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3N5c3RlbS9pbmMvc3lzX3N0YXJ0dXAuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIHN5c19zdGFydHVwLmg6IFN5c3RlbSBzdGFydHVwIGhlYWRlciBmaWxlLgorICogQXV0aG9yOiAgVi4gSy4gS2FuZGFycGEKKyAqIERhdGU6ICAgIDAxLzI5LzIwMDIKKyAqCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgIE1vZGlmaWVkIGJ5ICAgICAgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaWZuZGVmIF9fU1lTU1RBUlRVUF9ICisjZGVmaW5lIF9fU1lTU1RBUlRVUF9ICisKKyNpbmNsdWRlICJzaXJfcGFyYW1zLmgiCisKKy8qIERlZmluZXMgKi8KKworLyogRnVuY3Rpb24gKi8KKworZXh0ZXJuIHZvaWQgc3lzTUFDQ2xlYW51cCh2b2lkICopOworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgc3lzX2JidF9wcm9jZXNzX21lc3NhZ2VfY29yZShzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqLCB0cFNpck1zZ1EsCisJCQkJCQkgIHVpbnQzMl90LCB1aW50MzJfdCk7CisKKyNlbmRpZiAvKiBfX1NZU1NUQVJUVVBfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3N5c3RlbS9zcmMvbWFjX2luaXRfYXBpLmMgYi9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvc3lzdGVtL3NyYy9tYWNfaW5pdF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzA4NzdhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3N5c3RlbS9zcmMvbWFjX2luaXRfYXBpLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogbWFjX2luaXRfYXBpLmMgLSBUaGlzIGZpbGUgaGFzIGFsbCB0aGUgbWFjIGxldmVsIGluaXQgZnVuY3Rpb25zCisgKiAgICAgICAgICAgICAgICAgICBmb3IgYWxsIHRoZSBkZWZpbmVkIHRocmVhZHMgYXQgc3lzdGVtIGxldmVsLgorICogQXV0aG9yOiAgICBEaW5lc2ggVXBhZGh5YXkKKyAqIERhdGU6ICAgICAgMDQvMjMvMjAwNworICogSGlzdG9yeTotCisgKiBEYXRlOiAwNC8wOC8yMDA4ICAgICAgIE1vZGlmaWVkIGJ5OiBTYW50b3NoIE1hbmRpZ2FuYWwKKyAqIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbjogQ29kZSB0byBhbGxvY2F0ZSBhbmQgZnJlZSB0aGUgIG1lbW9yeSBmb3IgRHVtcFRhYmxlIGVudHJ5LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKy8qIFN0YW5kYXJkIGluY2x1ZGUgZmlsZXMgKi8KKyNpbmNsdWRlICJjZmdfYXBpLmgiICAgICAgICAgICAgIC8qIGNmZ19jbGVhbnVwICovCisjaW5jbHVkZSAibGltX2FwaS5oIiAgICAgICAgICAgICAvKiBsaW1fY2xlYW51cCAqLworI2luY2x1ZGUgInNpcl90eXBlcy5oIgorI2luY2x1ZGUgInN5c19kZWJ1Zy5oIgorI2luY2x1ZGUgInN5c19lbnRyeV9mdW5jLmgiCisjaW5jbHVkZSAibWFjX2luaXRfYXBpLmgiCisKKyNpZmRlZiBUUkFDRV9SRUNPUkQKKyNpbmNsdWRlICJtYWNfdHJhY2UuaCIKKyNlbmRpZgorCitleHRlcm4gdFNpclJldFN0YXR1cyBoYWxEb0NmZ0luaXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitleHRlcm4gdFNpclJldFN0YXR1cyBoYWxQcm9jZXNzU3RhcnRFdmVudCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKwordFNpclJldFN0YXR1cyBtYWNfc3RhcnQodEhhbEhhbmRsZSBoSGFsLCB2b2lkICpwSGFsTWFjU3RhcnRQYXJhbXMpCit7CisJdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgaEhhbDsKKworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJc3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXBNYWMtPmdEcml2ZXJUeXBlID0KKwkJKCh0SGFsTWFjU3RhcnRQYXJhbWV0ZXJzICopIHBIYWxNYWNTdGFydFBhcmFtcyktPmRyaXZlclR5cGU7CisKKwlzeXNfbG9nKHBNYWMsIExPRzIsIEZMKCJjYWxsZWRcbiIpKTsKKworCWlmIChBTklfRFJJVkVSX1RZUEUocE1hYykgIT0gZURSSVZFUl9UWVBFX01GRykgeworCQlzdGF0dXMgPSBwZV9zdGFydChwTWFjKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIG1hY19zdG9wCisgICBcYnJpZWYgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmcm9tIEhERCB0byBzdG9wIE1BQy4gVGhpcyBmdW5jdGlvbiB3aWxsIHN0b3AgYWxsIHRoZSBtYWMgbW9kdWxlcy4KKyBcICAgICAgIG1lbW9yeSB3aXRoIGdsb2JhbCBjb250ZXh0IHdpbGwgb25seSBiZSBpbml0aWFsaXplZCBub3QgZnJlZWQgaGVyZS4KKyAgIFxwYXJhbSAgIHRIYWxIYW5kbGUgaEhhbAorICAgXHBhcmFtIHRIYWxTdG9wVHlwZQorICAgXHJldHVybiB0U2lyUmV0U3RhdHVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBtYWNfc3RvcCh0SGFsSGFuZGxlIGhIYWwsIHRIYWxTdG9wVHlwZSBzdG9wVHlwZSkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSBoSGFsOworCXBlX3N0b3AocE1hYyk7CisJY2ZnX2NsZWFudXAocE1hYyk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIG1hY19vcGVuCisgICBcYnJpZWYgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgaW5pdC4gVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlIHRvIGFsbG9jYXRlIGFsbCB0aGUKKyBcICAgICAgIG1lbW9yeSB3aXRoIHRoZSBnbG9iYWwgY29udGV4dCB3aWxsIGJlIGFsbG9jYXRlZCBoZXJlLgorICAgXHBhcmFtICAgdEhhbEhhbmRsZSBwSGFsSGFuZGxlCisgICBccGFyYW0gICB0SGRkSGFuZGxlIGhIZGQKKyAgIFxwYXJhbSAgIHRIYWxPcGVuUGFyYW1ldGVycyogcEhhbE9wZW5QYXJhbXMKKyAgIFxyZXR1cm4gdFNpclJldFN0YXR1cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgbWFjX29wZW4odEhhbEhhbmRsZSAqcEhhbEhhbmRsZSwgdEhkZEhhbmRsZSBoSGRkLAorCQkgICAgICAgdE1hY09wZW5QYXJhbWV0ZXJzICpwTWFjT3BlblBhcm1zKQoreworCXRwQW5pU2lyR2xvYmFsIHBfbWFjID0gTlVMTDsKKwl0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKworCWlmIChwSGFsSGFuZGxlID09IE5VTEwpCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGlzIGFkYXB0ZXIgaXMgbm90IGFscmVhZHkgb3BlbmVkLiAoQ29tcGFyZSBwQWRhcHRlciBwb2ludGVyIGluIGFscmVhZHkKKwkgKiBhbGxvY2F0ZWQgcF9tYWMgc3RydWN0dXJlcy4pCisJICogSWYgaXQgaXMgb3BlbmVkIGp1c3QgcmV0dXJuIHBvaW50ZXIgdG8gcHJldmlvdXNseSBhbGxvY2F0ZWQgcF9tYWMgcG9pbnRlci4KKwkgKiBPciBzaG91bGQgdGhpcyByZXN1bHQgaW4gZXJyb3I/CisJICovCisKKwkvKiBBbGxvY2F0ZSBwX21hYyAqLworCXBfbWFjID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBbmlTaXJHbG9iYWwpKTsKKwlpZiAoTlVMTCA9PSBwX21hYykKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKworCS8qIEluaXRpYWxpemUgdGhlIHBfbWFjIHN0cnVjdHVyZSAqLworCWNkZl9tZW1fc2V0KHBfbWFjLCBzaXplb2YodEFuaVNpckdsb2JhbCksIDApOworCisJLyoKKwkgKiBTZXQgdmFyaW91cyBnbG9iYWwgZmllbGRzIG9mIHBfbWFjIGhlcmUKKwkgKiAoQ291bGQgYmUgcGxhdGZvcm0gZGVwZW5kYW50IGFzIHNvbWUgdmFyaWFibGVzIGluIHBfbWFjIGFyZSBwbGF0Zm9ybQorCSAqIGRlcGVuZGFudCkKKwkgKi8KKwlwX21hYy0+aEhkZCA9IGhIZGQ7CisJKnBIYWxIYW5kbGUgPSAodEhhbEhhbmRsZSkgcF9tYWM7CisKKwl7CisJCS8qIENhbGwgdmFyaW91cyBQRSAoYW5kIG90aGVyIGxheWVyIGluaXQgaGVyZSkgKi8KKwkJaWYgKGVTSVJfU1VDQ0VTUyAhPSBsb2dfaW5pdChwX21hYykpIHsKKwkJCWNkZl9tZW1fZnJlZShwX21hYyk7CisJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQl9CisKKwkJLyogQ2FsbCByb3V0aW5lIHRvIGluaXRpYWxpemUgQ0ZHIGRhdGEgc3RydWN0dXJlcyAqLworCQlpZiAoZVNJUl9TVUNDRVNTICE9IGNmZ19pbml0KHBfbWFjKSkgeworCQkJY2RmX21lbV9mcmVlKHBfbWFjKTsKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCX0KKworCQlzeXNfaW5pdF9nbG9iYWxzKHBfbWFjKTsKKwl9CisKKwkvKiBGVzogMCB0byAyMDQ3IGFuZCBIb3N0OiAyMDQ4IHRvIDQwOTUgKi8KKwlwX21hYy0+bWdtdFNlcU51bSA9IFdMQU5fSE9TVF9TRVFfTlVNX01JTiAtIDE7CisJcF9tYWMtPmZpcnN0X3NjYW5fZG9uZSA9IGZhbHNlOworCisJc3RhdHVzID0gIHBlX29wZW4ocF9tYWMsIHBNYWNPcGVuUGFybXMpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCXN5c19sb2cocF9tYWMsIExPR0UsIEZMKCJtYWNfb3BlbiBmYWlsdXJlXG4iKSk7CisJCWNkZl9tZW1fZnJlZShwX21hYyk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBtYWNfY2xvc2UKKyAgIFxicmllZiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluIHNodXRkb3duIHNlcXVlbmNlIGZyb20gSERELiBBbGwgdGhlCisgXCAgICAgICBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggZ2xvYmFsIGNvbnRleHQgd2lsbCBiZSBmcmVlZCBoZXJlLgorICAgXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworICAgXHJldHVybiBub25lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBtYWNfY2xvc2UodEhhbEhhbmRsZSBoSGFsKQoreworCisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgaEhhbDsKKworCWlmICghcE1hYykKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworCXBlX2Nsb3NlKHBNYWMpOworCisJLyogQ2FsbCByb3V0aW5lIHRvIGZyZWUtdXAgYWxsIENGRyBkYXRhIHN0cnVjdHVyZXMgKi8KKwljZmdfZGVfaW5pdChwTWFjKTsKKworCWxvZ19kZWluaXQocE1hYyk7CisKKwkvKiBGaW5hbGx5LCBkZS1hbGxvY2F0ZSB0aGUgZ2xvYmFsIE1BQyBkYXRhc3RydWN0dXJlOiAqLworCWNkZl9tZW1fZnJlZShwTWFjKTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvc3lzdGVtL3NyYy9zeXNfZW50cnlfZnVuYy5jIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3N5c3RlbS9zcmMvc3lzX2VudHJ5X2Z1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRhYjNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3N5c3RlbS9zcmMvc3lzX2VudHJ5X2Z1bmMuYwpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIHN5c19lbnRyeV9mdW5jLmNjIC0gVGhpcyBmaWxlIGhhcyBhbGwgdGhlIHN5c3RlbSBsZXZlbCBlbnRyeSBmdW5jdGlvbnMKKyAqICAgICAgICAgICAgICAgICAgIGZvciBhbGwgdGhlIGRlZmluZWQgdGhyZWFkcyBhdCBzeXN0ZW0gbGV2ZWwuCisgKiBBdXRob3I6ICAgIFYuIEsuIEthbmRhcnBhCisgKiBEYXRlOiAgICAgIDAxLzE2LzIwMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICBNb2RpZmllZCBieSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKy8qIFN0YW5kYXJkIGluY2x1ZGUgZmlsZXMgKi8KKworLyogQXBwbGljYXRpb24gU3BlY2lmaWMgaW5jbHVkZSBmaWxlcyAqLworI2luY2x1ZGUgInNpcl9jb21tb24uaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisKKyNpbmNsdWRlICJsaW1fYXBpLmgiCisjaW5jbHVkZSAic2NoX2FwaS5oIgorI2luY2x1ZGUgInV0aWxzX2FwaS5oIgorCisjaW5jbHVkZSAic3lzX2RlYnVnLmgiCisjaW5jbHVkZSAic3lzX2RlZi5oIgorI2luY2x1ZGUgInN5c19lbnRyeV9mdW5jLmgiCisjaW5jbHVkZSAic3lzX3N0YXJ0dXAuaCIKKyNpbmNsdWRlICJsaW1fdHJhY2UuaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKwordFNpclJldFN0YXR1cyBwb3N0UFRUTXNnQXBpKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKTsKKworI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgImNkc19wYWNrZXQuaCIKKworI2RlZmluZSBNQVhfREVBVVRIX0FMTE9XRUQgNQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIHN5c19pbml0X2dsb2JhbHMKKyAqCisgKiBGVU5DVElPTjoKKyAqICAgIEluaXRpYWxpemVzIHN5c3RlbSBsZXZlbCBnbG9iYWwgcGFyYW1ldGVycworICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHRwQW5pU2lyR2xvYmFsIFNpcml1cyBzb2Z0d2FyZSBwYXJhbWV0ZXIgc3RydWN0IHBvaW50ZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3RTaXJSZXRTdGF0dXMgc3lzX2luaXRfZ2xvYmFscyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJnBNYWMtPnN5cywgc2l6ZW9mKHBNYWMtPnN5cyksIDApOworCisJcE1hYy0+c3lzLmdTeXNFbmFibGVTY2FuTW9kZSA9IDE7CisJcE1hYy0+c3lzLmdTeXNFbmFibGVMaW5rTW9uaXRvck1vZGUgPSAwOworCXNjaF9pbml0X2dsb2JhbHMocE1hYyk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKioKKyAqIHN5c19iYnRfcHJvY2Vzc19tZXNzYWdlX2NvcmUoKSAtIHRvIHByb2Nlc3MgQkJUIG1lc3NhZ2VzCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBtYWMgY29udGV4dAorICogQG1zZzogbWVzc2FnZSBwb2ludGVyCisgKiBAdHlwZTogdHlwZSBvZiBwZXJzb25hCisgKiBAc3VidHlwZTogc3VidHlwZSBvZiBwZXJzb25hCisgKgorICogVGhpcyByb3V0aW5lIGlzIHRvIHByb2Nlc3Mgc29tZSBiYnQgbWVzc2FnZXMKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordFNpclJldFN0YXR1cworc3lzX2JidF9wcm9jZXNzX21lc3NhZ2VfY29yZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0cFNpck1zZ1EgbXNnLAorCQl1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzdWJ0eXBlKQoreworCXVpbnQzMl90IGZyYW1lY291bnQ7CisJdFNpclJldFN0YXR1cyByZXQ7CisJdm9pZCAqYmRfcHRyOworCXRNZ210RnJtRHJvcFJlYXNvbiBkcm9wcmVhc29uOworCWNkc19wa3RfdCAqdm9zX3BrdCA9IChjZHNfcGt0X3QgKikgbXNnLT5ib2R5cHRyOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9CisJCXdtYV9kc19wZWVrX3J4X3BhY2tldF9pbmZvKHZvc19wa3QsICZiZF9wdHIsIGZhbHNlKTsKKwl1aW50OF90IHNlc3Npb25pZDsKKwl0cFBFU2Vzc2lvbiBwZV9zZXNzaW9uOworCXRwU2lyTWFjTWdtdEhkciBtYWNfaGRyOworCisJbWFjX2N0eC0+c3lzLmdTeXNCYnRSZWNlaXZlZCsrOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCWdvdG8gZmFpbDsKKworCXN5c19sb2cobWFjX2N0eCwgTE9HMywgRkwoIlJ4IE1nbXQgRnJhbWUgU3VidHlwZTogJWRcbiIpLCBzdWJ0eXBlKTsKKwlzaXJfZHVtcF9idWYobWFjX2N0eCwgU0lSX1NZU19NT0RVTEVfSUQsIExPRzMsCisJCSh1aW50OF90ICopIFdNQV9HRVRfUlhfTUFDX0hFQURFUihiZF9wdHIpLAorCQlXTUFfR0VUX1JYX01QRFVfTEVOKGJkX3B0cikpOworCXNpcl9kdW1wX2J1ZihtYWNfY3R4LCBTSVJfU1lTX01PRFVMRV9JRCwgTE9HMywKKwkJV01BX0dFVF9SWF9NUERVX0RBVEEoYmRfcHRyKSwKKwkJV01BX0dFVF9SWF9QQVlMT0FEX0xFTihiZF9wdHIpKTsKKworCW1hY19jdHgtPnN5cy5nU3lzRnJhbWVDb3VudFt0eXBlXVtzdWJ0eXBlXSsrOworCWZyYW1lY291bnQgPSBtYWNfY3R4LT5zeXMuZ1N5c0ZyYW1lQ291bnRbdHlwZV1bc3VidHlwZV07CisKKwlpZiAodHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpIHsKKwkJaWYgKHRydWUgPT0gbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uaXNfZGZzX2NhY190aW1lcl9ydW5uaW5nKSB7CisJCQltYWNfaGRyID0gV01BX0dFVF9SWF9NQUNfSEVBREVSKGJkX3B0cik7CisJCQlwZV9zZXNzaW9uID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKG1hY19jdHgsCisJCQkJCW1hY19oZHItPmJzc0lkLAorCQkJCQkmc2Vzc2lvbmlkKTsKKwkJCWlmIChwZV9zZXNzaW9uICYmCisJCQkJKHBlX3Nlc3Npb24tPnBlUGVyc29uYSA9PSBDREZfU0FQX01PREUpKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLAorCQkJCQlDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCQlGTCgiQ0FDIHRpbWVyIGlzIHJ1bm5pbmcsIGRyb3BwaW5nIHRoZSBtZ210IGZyYW1lIikpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERyb3AgYmVhY29uIGZyYW1lcyBpbiBkZWZlcnJlZCBzdGF0ZSB0byBhdm9pZCBWT1NTIHJ1biBvdXQgb2YKKwkJICogbWVzc2FnZSB3cmFwcGVycy4KKwkJICovCisJCWlmICgoc3VidHlwZSA9PSBTSVJfTUFDX01HTVRfQkVBQ09OKSAmJgorCQkJKCFsaW1faXNfc3lzdGVtX2luX3NjYW5fc3RhdGUobWFjX2N0eCkpICYmCisJCQkoR0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MobWFjX2N0eCkgIT0gdHJ1ZSkgJiYKKwkJCSFtYWNfY3R4LT5saW0uZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU1lTLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCUZMKCJkcm9wcGluZyByZWNlaXZlZCBiZWFjb24gaW4gZGVmZmVyZWQgc3RhdGUiKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlkcm9wcmVhc29uID0gbGltX2lzX3BrdF9jYW5kaWRhdGVfZm9yX2Ryb3AobWFjX2N0eCwgYmRfcHRyLAorCQkJCXN1YnR5cGUpOworCQlpZiAoZU1HTVRfRFJPUF9OT19EUk9QICE9IGRyb3ByZWFzb24pIHsKKwkJCXN5c19sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQlGTCgiTWdtdCBGcmFtZSAlZCBiZWluZyBkcm9wcGVkLCByZWFzb246ICVkXG4iKSwKKwkJCQlzdWJ0eXBlLCBkcm9wcmVhc29uKTsKKwkJCQlNVFJBQ0UobWFjX3RyYWNlKG1hY19jdHgsCisJCQkJCVRSQUNFX0NPREVfUlhfTUdNVF9EUk9QLCBOT19TRVNTSU9OLAorCQkJCQlkcm9wcmVhc29uKTspCisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlpZiAoc3VidHlwZSA9PSBTSVJfTUFDX01HTVRfREVBVVRIKSB7CisJCQl0cFNpck1hY01nbXRIZHIgbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihiZF9wdHIpOworCQkJc3lzX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJERUFVVEggZnJhbWUgYWxsb3dlZDogIgorCQkJCQkiZGE6ICIgTUFDX0FERFJFU1NfU1RSICIsICIKKwkJCQkJInNhOiAiIE1BQ19BRERSRVNTX1NUUiAiLCAiCisJCQkJCSJic3NpZDogIiBNQUNfQUREUkVTU19TVFIgIiwgIgorCQkJCQkiREVBVVRIIGNvdW50IHNvIGZhcjogJWRcbiIpLAorCQkJCU1BQ19BRERSX0FSUkFZKG1hY19oZHItPmRhKSwKKwkJCQlNQUNfQUREUl9BUlJBWShtYWNfaGRyLT5zYSksCisJCQkJTUFDX0FERFJfQVJSQVkobWFjX2hkci0+YnNzSWQpLAorCQkJCW1hY19jdHgtPnN5cy5nU3lzRnJhbWVDb3VudFt0eXBlXVtzdWJ0eXBlXSk7CisJCX0KKwkJaWYgKHN1YnR5cGUgPT0gU0lSX01BQ19NR01UX0RJU0FTU09DKSB7CisJCQl0cFNpck1hY01nbXRIZHIgbWFjX2hkciA9IFdNQV9HRVRfUlhfTUFDX0hFQURFUihiZF9wdHIpOworCQkJc3lzX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJESVNBU1NPQyBmcmFtZSBhbGxvd2VkOiAiCisJCQkJCSJkYTogIiBNQUNfQUREUkVTU19TVFIgIiwgIgorCQkJCQkic2E6ICIgTUFDX0FERFJFU1NfU1RSICIsICIKKwkJCQkJImJzc2lkOiAiIE1BQ19BRERSRVNTX1NUUiAiLCAiCisJCQkJCSJESVNBU1NPQyBjb3VudCBzbyBmYXI6ICVkXG4iKSwKKwkJCQlNQUNfQUREUl9BUlJBWShtYWNfaGRyLT5kYSksCisJCQkJTUFDX0FERFJfQVJSQVkobWFjX2hkci0+c2EpLAorCQkJCU1BQ19BRERSX0FSUkFZKG1hY19oZHItPmJzc0lkKSwKKwkJCQltYWNfY3R4LT5zeXMuZ1N5c0ZyYW1lQ291bnRbdHlwZV1bc3VidHlwZV0pOworCQl9CisKKwkJLyogUG9zdCB0aGUgbWVzc2FnZSB0byBQRSBRdWV1ZSAqLworCQlyZXQgPSAodFNpclJldFN0YXR1cykgbGltX3Bvc3RfbXNnX2FwaShtYWNfY3R4LCBtc2cpOworCQlpZiAocmV0ICE9IGVTSVJfU1VDQ0VTUykgeworCQkJc3lzX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJwb3N0aW5nIHRvIExJTTIgZmFpbGVkLCByZXQgJWRcbiIpLCByZXQpOworCQkJCWdvdG8gZmFpbDsKKwkJfQorCQltYWNfY3R4LT5zeXMuZ1N5c0JidFBvc3RlZFRvTGltKys7CisJfSBlbHNlIGlmICh0eXBlID09IFNJUl9NQUNfREFUQV9GUkFNRSkgeworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJUEVMT0dXKHN5c19sb2cobWFjX2N0eCwgTE9HVywgRkwoIklBUFAgRnJhbWUuLi5cbiIpKTspOworCQkvKiBQb3N0IHRoZSBtZXNzYWdlIHRvIFBFIFF1ZXVlICovCisJCXJldCA9ICh0U2lyUmV0U3RhdHVzKSBsaW1fcG9zdF9tc2dfYXBpKG1hY19jdHgsIG1zZyk7CisJCWlmIChyZXQgIT0gZVNJUl9TVUNDRVNTKSB7CisJCQlzeXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoInBvc3RpbmcgdG8gTElNMiBmYWlsZWQsIHJldCAlZFxuIiksIHJldCk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJbWFjX2N0eC0+c3lzLmdTeXNCYnRQb3N0ZWRUb0xpbSsrOworI2VuZGlmCisJfSBlbHNlIHsKKwkJc3lzX2xvZyhtYWNfY3R4LCBMT0czLAorCQkJIkJCVCByZWNlaXZlZCBJbnZhbGlkIHR5cGUgJWQgc3VidHlwZSAlZCAiCisJCQkiTElNIHN0YXRlICVYLiBCRCBkdW1wIGlzOlxuIiwgdHlwZSwgc3VidHlwZSwKKwkJCWxpbV9nZXRfc21lX3N0YXRlKG1hY19jdHgpKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworZmFpbDoKKwltYWNfY3R4LT5zeXMuZ1N5c0JidERyb3BwZWQrKzsKKwlyZXR1cm4gZVNJUl9GQUlMVVJFOworfQorCit2b2lkIHN5c19sb2codHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHJpbmcsIC4uLikKK3sKKwkvKiBWZXJpZnkgYWdhaW5zdCBjdXJyZW50IGxvZyBsZXZlbCAqLworCWlmIChsb2dsZXZlbCA+CisJICAgIHBNYWMtPnV0aWxzLmdMb2dEYmdMZXZlbFtMT0dfSU5ERVhfRk9SX01PRFVMRShTSVJfU1lTX01PRFVMRV9JRCldKQorCQlyZXR1cm47CisJZWxzZSB7CisJCXZhX2xpc3QgbWFya2VyOworCisJCXZhX3N0YXJ0KG1hcmtlciwgcFN0cmluZyk7ICAgICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZSBhcmd1bWVudHMuICovCisKKwkJbG9nX2RlYnVnKHBNYWMsIFNJUl9TWVNfTU9EVUxFX0lELCBsb2dsZXZlbCwgcFN0cmluZywgbWFya2VyKTsKKworCQl2YV9lbmQobWFya2VyKTsgLyogUmVzZXQgdmFyaWFibGUgYXJndW1lbnRzLiAgICAgICovCisJfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3V0aWxzL2luYy9kb3QxMWZkZWZzLmggYi9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvdXRpbHMvaW5jL2RvdDExZmRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M0ZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3V0aWxzL2luYy9kb3QxMWZkZWZzLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIERPVDExRkRFRlNfSF84MkE3QjcyRV9DMzZDXzQ2NURfODJBN18xMzlFQTUzMjI1ODIKKyNkZWZpbmUgRE9UMTFGREVGU19IXzgyQTdCNzJFX0MzNkNfNDY1RF84MkE3XzEzOUVBNTMyMjU4MgorLyoqCisgKiBcZmlsZSBkb3QxMWZkZWZzLmgKKyAqCisgKiBcYnJpZWYgQyBkZWZpbmVzIGN1c3RvbWl6aW5nIG91ciBmcmFtZXNjLWdlbmVyYXRlZCBjb2RlCisgKgorICoKKyAqCisgKgorICogJ2ZyYW1lc2MnIGdlbmVyYXRlcyBjb2RlIHdyaXR0ZW4gaW4gdGVybXMgb2YgYSBudW1iZXIgb2YgbWFjcm9zCisgKiBpbnRlbmRlZCBmb3IgY3VzdG9taXphdGlvbi4KKyAqCisgKgorICovCisKKyNpbmNsdWRlICJwYXJzZXJfYXBpLmgiCisKKy8qIFRoaXMgY29udHJvbHMgaG93IHRoZSAiZG90MTFmIiBjb2RlIGNvcGllcyBtZW1vcnkgKi8KKyNkZWZpbmUgRE9UMTFGX01FTUNQWShjdHgsIGRzdCwgc3JjLCBsZW4pIFwKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikoZHN0KSwgKHVpbnQ4X3QgKikoc3JjKSwgKGxlbikpCisKKy8qIFRoaXMgY29udHJvbHMgaG93IHRoZSAiZG90MTFmIiBjb2RlIGNvbXBhcmVzIG1lbW9yeSAqLworI2RlZmluZSBET1QxMUZfTUVNQ01QKGN0eCwgbGhzLCByaHMsIGxlbikgXAorCSghY2RmX21lbV9jb21wYXJlKCh1aW50OF90ICopKGxocyksICh1aW50OF90ICopKHJocyksIChsZW4pKSkKKworI2lmIGRlZmluZWQoREJHKSAmJiAoREJHICE9IDApCisKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmaW5lIERPVDExRl9FTkFCTEVfTE9HR0lORyAqLworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZpbmUgRE9UMTFGX0RVTVBfRlJBTUVTICovCisjZGVmaW5lIERPVDExRl9MT0dfR0FURSAoNCkKKyNkZWZpbmUgRlJBTUVTX1NFVl9GT1JfRlJBTUUoY3R4LCBzaWcpIFwKKwkoRE9UMTFGX0FTU09DUkVRVUVTVCA9PSAoc2lnKSA/IDMgOiA1KQorCisjaWYgZGVmaW5lZChET1QxMUZfRU5BQkxFX0xPR0dJTkcpCisKKyNkZWZpbmUgRE9UMTFGX0hBVkVfTE9HX01BQ1JPUworCisjZGVmaW5lIEZSQU1FU19MT0cwKGN0eCwgc2V2LCBmbXQpIFwKKwlkb3QxMWZfbG9nKChjdHgpLCAoc2V2KSwgKGZtdCkpOworCisjZGVmaW5lIEZSQU1FU19MT0cxKGN0eCwgc2V2LCBmbXQsIHAxKSBcCisJZG90MTFmX2xvZygoY3R4KSwgKHNldiksIChmbXQpLCAocDEpKTsKKworI2RlZmluZSBGUkFNRVNfTE9HMihjdHgsIHNldiwgZm10LCBwMSwgcDIpIFwKKwlkb3QxMWZfbG9nKChjdHgpLCAoc2V2KSwgKGZtdCksIChwMSksIChwMikpOworCisjZGVmaW5lIEZSQU1FU19MT0czKGN0eCwgc2V2LCBmbXQsIHAxLCBwMiwgcDMpIFwKKwlkb3QxMWZfbG9nKChjdHgpLCAoc2V2KSwgKGZtdCksIChwMSksIChwMiksIChwMykpOworCisjZGVmaW5lIEZSQU1FU19EVU1QKGN0eCwgc2V2LCBwLCBuKSBcCisJc2lyX2R1bXBfYnVmKChwQ3R4KSwgU0lSX0RCR19NT0RVTEVfSUQsIChzZXYpLCAocCksIChuKSk7CisKKyNlbmRpZiAvKiAjaWYgZGVmaW5lZCggRE9UMTFGX0VOQUJMRV9MT0dHSU5HICkgKi8KKworI2Vsc2UKKworI3VuZGVmIERPVDExRl9FTkFCTEVfTE9HR0lORworI3VuZGVmIERPVDExRl9EVU1QX0ZSQU1FUworI2RlZmluZSBET1QxMUZfTE9HX0dBVEUgKDEpCisKKyNlbmRpZgorCisvKiAjZGVmaW5lIERPVDExRl9FTkFCTEVfREJHX0JSRUFLICggMSApICovCisKKy8qIExvY2FsIFZhcmlhYmxlczogKi8KKy8qIGZpbGwtY29sdW1uOiA3MiAqLworLyogaW5kZW50LXRhYnMtbW9kZTogbmlsICovCisvKiBzaG93LXRyYWlsaW5nLXdoaXRlc3BhY2U6IHQgKi8KKy8qIEVuZDogKi8KKworI2VuZGlmIC8qIERPVDExRkRFRlNfSF84MkE3QjcyRV9DMzZDXzQ2NURfODJBN18xMzlFQTUzMjI1ODIgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy91dGlscy9pbmMvdXRpbHNfcGFyc2VyLmggYi9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvdXRpbHMvaW5jL3V0aWxzX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjNhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvdXRpbHMvaW5jL3V0aWxzX3BhcnNlci5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKgorICogVGhpcyBmaWxlIHV0aWxzX3BhcnNlci5oIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGZ1bmN0aW9uIHByb3RvcworICogdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBwYXJzZXIKKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzExLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpZm5kZWYgX19VVElMU19QQVJTRV9IX18KKyNkZWZpbmUgX19VVElMU19QQVJTRV9IX18KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJkb3QxMWYuaCIKKyNpbmNsdWRlICJ1dGlsc19hcGkuaCIKKwordm9pZCBjb252ZXJ0X3NzaWQodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNTU2lkICosIHREb3QxMWZJRVNTSUQgKik7Cit2b2lkIGNvbnZlcnRfc3VwcF9yYXRlcyh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1JhdGVTZXQgKiwgdERvdDExZklFU3VwcFJhdGVzICopOwordm9pZCBjb252ZXJ0X2ZoX3BhcmFtcyh0cEFuaVNpckdsb2JhbCwgdFNpck1hY0ZIUGFyYW1TZXQgKiwKKwkJICAgICAgIHREb3QxMWZJRUZIUGFyYW1TZXQgKik7Cit2b2lkIGNvbnZlcnRfZXh0X3N1cHBfcmF0ZXModHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNSYXRlU2V0ICosCisJCQkgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICopOwordm9pZCBjb252ZXJ0X3Fvc19jYXBzKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjUW9zQ2FwYWJpbGl0eUlFICosCisJCSAgICAgIHREb3QxMWZJRVFPU0NhcHNBcCAqKTsKK3ZvaWQgY29udmVydF9xb3NfY2Fwc19zdGF0aW9uKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjUW9zQ2FwYWJpbGl0eVN0YUlFICosCisJCQkgICAgICB0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiAqKTsKK3RTaXJSZXRTdGF0dXMgY29udmVydF93cGEodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNXcGFJbmZvICosIHREb3QxMWZJRVdQQSAqKTsKK3RTaXJSZXRTdGF0dXMgY29udmVydF93cGFfb3BhcXVlKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjV3BhSW5mbyAqLAorCQkJCSB0RG90MTFmSUVXUEFPcGFxdWUgKik7Cit0U2lyUmV0U3RhdHVzIGNvbnZlcnRfd2FwaV9vcGFxdWUodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNXYXBpSW5mbyAqLAorCQkJCSAgdERvdDExZklFV0FQSU9wYXF1ZSAqKTsKK3RTaXJSZXRTdGF0dXMgY29udmVydF9yc24odHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNSc25JbmZvICosIHREb3QxMWZJRVJTTiAqKTsKK3RTaXJSZXRTdGF0dXMgY29udmVydF9yc25fb3BhcXVlKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjUnNuSW5mbyAqLAorCQkJCSB0RG90MTFmSUVSU05PcGFxdWUgKik7Cit2b2lkIGNvbnZlcnRfcG93ZXJfY2Fwcyh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1Bvd2VyQ2FwYWJpbGl0eUlFICosCisJCQl0RG90MTFmSUVQb3dlckNhcHMgKik7Cit2b2lkIGNvbnZlcnRfc3VwcF9jaGFubmVscyh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1N1cHBvcnRlZENoYW5uZWxJRSAqLAorCQkJICAgdERvdDExZklFU3VwcENoYW5uZWxzICopOwordm9pZCBjb252ZXJ0X2NmX3BhcmFtcyh0cEFuaVNpckdsb2JhbCwgdFNpck1hY0NmUGFyYW1TZXQgKiwgdERvdDExZklFQ0ZQYXJhbXMgKik7Cit2b2lkIGNvbnZlcnRfdGltKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjVGltICosIHREb3QxMWZJRVRJTSAqKTsKK3ZvaWQgY29udmVydF9jb3VudHJ5KHRwQW5pU2lyR2xvYmFsLCB0U2lyQ291bnRyeUluZm9ybWF0aW9uICosCisJCSAgICAgdERvdDExZklFQ291bnRyeSAqKTsKK3ZvaWQgY29udmVydF93bW1fcGFyYW1zKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjRWRjYVBhcmFtU2V0SUUgKiwKKwkJCXREb3QxMWZJRVdNTVBhcmFtcyAqKTsKK3ZvaWQgY29udmVydF9lcnBfaW5mbyh0cEFuaVNpckdsb2JhbCwgdFNpck1hY0VycEluZm8gKiwgdERvdDExZklFRVJQSW5mbyAqKTsKK3ZvaWQgY29udmVydF9lZGNhX3BhcmFtKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjRWRjYVBhcmFtU2V0SUUgKiwKKwkJCXREb3QxMWZJRUVEQ0FQYXJhbVNldCAqKTsKK3ZvaWQgY29udmVydF90c3BlYyh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1RzcGVjSUUgKiwgdERvdDExZklFVFNQRUMgKik7Cit0U2lyUmV0U3RhdHVzIGNvbnZlcnRfdGNsYXModHBBbmlTaXJHbG9iYWwsIHRTaXJUY2xhc0luZm8gKiwgdERvdDExZklFVENMQVMgKik7Cit2b2lkIGNvbnZlcnRfd21tdHNwZWModHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNUc3BlY0lFICosIHREb3QxMWZJRVdNTVRTUEVDICopOwordFNpclJldFN0YXR1cyBjb252ZXJ0X3dtbXRjbGFzKHRwQW5pU2lyR2xvYmFsLCB0U2lyVGNsYXNJbmZvICosCisJCQkgICAgICAgdERvdDExZklFV01NVENMQVMgKik7Cit2b2lkIGNvbnZlcnRfdHNfZGVsYXkodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNUc0RlbGF5SUUgKiwgdERvdDExZklFVFNEZWxheSAqKTsKK3ZvaWQgY29udmVydF9zY2hlZHVsZSh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1NjaGVkdWxlSUUgKiwgdERvdDExZklFU2NoZWR1bGUgKik7Cit2b2lkIGNvbnZlcnRfd21tX3NjaGVkdWxlKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjU2NoZWR1bGVJRSAqLAorCQkJICB0RG90MTFmSUVXTU1TY2hlZHVsZSAqKTsKK3RTaXJSZXRTdGF0dXMgY29udmVydF93c2Nfb3BhcXVlKHRwQW5pU2lyR2xvYmFsLCB0U2lyQWRkaWUgKiwKKwkJCQkgdERvdDExZklFV3NjSUVPcGFxdWUgKik7Cit0U2lyUmV0U3RhdHVzIGNvbnZlcnRfcDJwX29wYXF1ZSh0cEFuaVNpckdsb2JhbCwgdFNpckFkZGllICosCisJCQkJICB0RG90MTFmSUVQMlBJRU9wYXF1ZSAqKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfV0ZECit0U2lyUmV0U3RhdHVzIGNvbnZlcnRfd2ZkX29wYXF1ZSh0cEFuaVNpckdsb2JhbCwgdFNpckFkZGllICosCisJCQkJIHREb3QxMWZJRVdGRElFT3BhcXVlICopOworI2VuZGlmCit2b2lkIGNvbnZlcnRfcW9zX21hcHNldF9mcmFtZSh0cEFuaVNpckdsb2JhbCwgdFNpclFvc01hcFNldCAqLAorCQkJICAgICAgdERvdDExZklFUW9zTWFwU2V0ICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy91dGlscy9zcmMvZG90MTFmLmMgYi9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvdXRpbHMvc3JjL2RvdDExZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyODZhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvdXRpbHMvc3JjL2RvdDExZi5jCkBAIC0wLDAgKzEsMjE2ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyAvKgorICogXGZpbGUgZG90MTFmLmMKKyAqCisgKiBcYnJpZWYgU3RydWN0dXJlcywgZnVuY3Rpb25zICYgZGVmaW5pdGlvbnMgZm9yCisgKiB3b3JraW5nIHdpdGggODAyLjExIEZyYW1lcworICoKKyAqCisgKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5ICdmcmFtZXNjJworICogV2VkIE9jdCAxNCAxMDoxNDo0MiAyMDE1IGZyb20gdGhlIGZvbGxvd2luZyBmaWxlKHMpOgorICoKKyAqIGRvdDExZi5mcm1zCisgKgorICogUExFQVNFIERPTidUIEVESVQgVEhJUyBGSUxFIEJZIEhBTkQhCisgKgorICovCisKKyNpZiAhZGVmaW5lZCAgQU5JX09TX1RZUEVfT1NYICYmICFkZWZpbmVkIEFOSV9PU19UWVBFX0xJTlVYICYmICFkZWZpbmVkIEFOSV9PU19UWVBFX0FORFJPSUQKKyNpbmNsdWRlIDxtZW1vcnkuaD4gLyogRm9yIG1lbWNweSAqLworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBGb3IgX3ZzbnByaW50ZiAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPiAvKiBGb3Igb2Zmc2V0b2YgKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8YW5pX2dsb2JhbC5oPgorI2luY2x1ZGUgPHV0aWxzX2FwaS5oPgorI2luY2x1ZGUgImRvdDExZmRlZnMuaCIKKyNpbmNsdWRlICJkb3QxMWYuaCIKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6NDI0NCkKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTo0NTA1KQorI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOjQ3MDIpCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6NDk5NikvKiAuLi4gd2FzIGRlY2xhcmVkIGRlcHJlY2F0ZWQgKi8KKyNlbmRpZiAvKiBNaWNyb3NvZnQgQy9DKysgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRGUkFNRVNfQk9PTDsKK3R5cGVkZWYgdm9pZCAoKnBmbkdlbmVyaWNfdCkodm9pZCk7CisKK3R5cGVkZWYgc3RydWN0IHNGRkRlZm4geworCWNvbnN0IGNoYXIgICpuYW1lOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MTZfdCBzaWc7CisJdWludDhfdCAgc2l6ZTsKK30gdEZGRGVmbjsKKwordHlwZWRlZiBzdHJ1Y3Qgc0lFRGVmbiB7CisJdWludDMyX3QgIG9mZnNldDsKKwl1aW50MzJfdCAgcHJlc2VuY2VPZmZzZXQ7CisJdWludDMyX3QgIGNvdW50T2Zmc2V0OworCWNvbnN0IGNoYXIgICAqbmFtZTsKKwl1aW50MTZfdCAgYXJyYXlib3VuZDsKKwl1aW50MTZfdCAgbWluU2l6ZTsKKwl1aW50MTZfdCAgbWF4U2l6ZTsKKwl1aW50MTZfdCAgc2lnOworCXVuc2lnbmVkIGNoYXIgb3VpWzVdOworCXVuc2lnbmVkIGNoYXIgbm91aTsKKwl1aW50OF90ICAgZWlkOworCXRGUkFNRVNfQk9PTCAgZk1hbmRhdG9yeTsKK30gdElFRGVmbjsKKworI2lmICFkZWZpbmVkKGNvdW50b2YpCisjZGVmaW5lIGNvdW50b2YoeCkgKHNpemVvZigoeCkpIC8gc2l6ZW9mKCh4KVswXSkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKERPVDExRl9NRU1DUFkpCisjZGVmaW5lIERPVDExRl9NRU1DUFkoY3R4LCBkc3QsIHNyYywgbGVuKSBcCisJbWVtY3B5KChkc3QpLCAoc3JjKSwgKGxlbikpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKERPVDExRl9NRU1DTVApCisjZGVmaW5lIERPVDExRl9NRU1DTVAoY3R4LCBsaHMsIHJocywgbGVuKSBcCisJbWVtY21wKChsaHMpLCAocmhzKSwgKGxlbikpCisjZW5kaWYKKworI2lmbmRlZiBET1QxMUZfSEFWRV9MT0dfU0VWRVJJVElFUworI2RlZmluZSBGUkxPR19PRkYgKDApCisjZGVmaW5lIEZSTE9HUCAgICAoMSkKKyNkZWZpbmUgRlJMT0dFICAgICgyKQorI2RlZmluZSBGUkxPR1cgICAgKDMpCisjZGVmaW5lIEZSTE9HMSAgICAoNCkKKyNkZWZpbmUgRlJMT0cyICAgICg1KQorI2RlZmluZSBGUkxPRzMgICAgKDYpCisjZGVmaW5lIEZSTE9HNCAgICAoNykKKyNlbmRpZgorCisjZGVmaW5lIEZSRkwoeCkgeAorCisjZGVmaW5lIEZSQU1FU19MT0cwKGN0eCwgc2V2LCBmbXQpCisjZGVmaW5lIEZSQU1FU19MT0cxKGN0eCwgc2V2LCBmbXQsIHAxKQorI2RlZmluZSBGUkFNRVNfTE9HMihjdHgsIHNldiwgZm10LCBwMSwgcDIpCisjZGVmaW5lIEZSQU1FU19MT0czKGN0eCwgc2V2LCBmbXQsIHAxLCBwMiwgcDMpCisjZGVmaW5lIEZSQU1FU19EVU1QKGN0eCwgc2V2LCBwLCBuKQorI2lmbmRlZiBGUkFNRVNfU0VWX0ZPUl9GUkFNRQorI2RlZmluZSBGUkFNRVNfU0VWX0ZPUl9GUkFNRShjdHgsIHNpZykgRlJMT0czCisjZW5kaWYKKworI2lmIGRlZmluZWQoRE9UMTFGX0VOQUJMRV9EQkdfQlJFQUspICYmIGRlZmluZWQgKFdJTjMyKQorI2RlZmluZSBGUkFNRVNfREJHX0JSRUFLKCkgeyBfYXNtIGludCAzIH0KKyNlbHNlCisjZGVmaW5lIEZSQU1FU19EQkdfQlJFQUsoKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChET1QxMUZfUEFSQU1FVEVSX0NIRUNLKQorI2lmIGRlZmluZWQgKERPVDExRl9IQVZFX1dJTjMyX0FQSSkKKworI2RlZmluZSBET1QxMUZfUEFSQU1FVEVSX0NIRUNLKHBCdWYsIG5CdWYsIHBGcm0sIG5Gcm0pIFwKKwlpZiAoIXBCdWYgfHwgSXNCYWRSZWFkUHRyKHBCdWYsIG5CdWYpKVwKKwkJcmV0dXJuIERPVDExRl9CQURfSU5QVVRfQlVGRkVSOyBcCisJaWYgKCFwRnJtIHx8IElzQmFkV3JpdGVQdHIocEZybSwgbkZybSkpXAorCQlyZXR1cm4gRE9UMTFGX0JBRF9PVVRQVVRfQlVGRkVSIFwKKworI2RlZmluZSBET1QxMUZfUEFSQU1FVEVSX0NIRUNLMihwU3JjLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkKSBcCisJaWYgKCFwU3JjIHx8IElzQmFkUmVhZFB0cihwU3JjLCA0KSlcCisJCWV0dXJuIERPVDExRl9CQURfSU5QVVRfQlVGRkVSOyBcCisJaWYgKCFwQnVmIHx8IElzQmFkV3JpdGVQdHIocEJ1ZiwgbkJ1ZikpXAorCQlyZXR1cm4gRE9UMTFGX0JBRF9PVVRQVVRfQlVGRkVSOyBcCisJaWYgKCFuQnVmKVwKKwkJcmV0dXJuIERPVDExRl9CQURfT1VUUFVUX0JVRkZFUjsgXAorCWlmIChJc0JhZFdyaXRlUHRyKHBuQ29uc3VtZWQsIDQpKVwKKwkJcmV0dXJuIERPVDExRl9CQURfT1VUUFVUX0JVRkZFUiBcCisKKyNlbHNlCisKKyNkZWZpbmUgRE9UMTFGX1BBUkFNRVRFUl9DSEVDSyhwQnVmLCBuQnVmLCBwRnJtLCBuRnJtKSBcCisJaWYgKCFwQnVmKVwKKwkJcmV0dXJuIERPVDExRl9CQURfSU5QVVRfQlVGRkVSOyBcCisJaWYgKCFwRnJtKVwKKwkJcmV0dXJuIERPVDExRl9CQURfT1VUUFVUX0JVRkZFUiBcCisKKyNkZWZpbmUgRE9UMTFGX1BBUkFNRVRFUl9DSEVDSzIocFNyYywgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCkgXAorCWlmICghcFNyYylcCisJCXJldHVybiBET1QxMUZfQkFEX0lOUFVUX0JVRkZFUjsgXAorCWlmICghcEJ1ZilcCisJCXJldHVybiBET1QxMUZfQkFEX09VVFBVVF9CVUZGRVI7IFwKKwlpZiAoIW5CdWYpXAorCQlyZXR1cm4gRE9UMTFGX0JBRF9PVVRQVVRfQlVGRkVSOyBcCisJaWYgKCFwbkNvbnN1bWVkKVwKKwkJcmV0dXJuIERPVDExRl9CQURfT1VUUFVUX0JVRkZFUiBcCisKKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZyYW1lc250b2hzKHRwQW5pU2lyR2xvYmFsICAgIHBDdHgsCisJCQl1aW50MTZfdCAqcE91dCwKKwkJCXVpbnQ4X3QgICpwSW4sCisJCQl0RlJBTUVTX0JPT0wgIGZNc2IpCit7CisJKHZvaWQpcEN0eDsKKyNpZiBkZWZpbmVkIChET1QxMUZfTElUVExFX0VORElBTl9IT1NUKQorCWlmICghZk1zYikKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCAodWludDE2X3QgKilwT3V0LCBwSW4sIDIpOworCWVsc2UKKwkJKnBPdXQgPSAodWludDE2X3QpKCpwSW4gPDwgOCkgfCAqKHBJbiArIDEpOworI2Vsc2UKKwlpZiAoIWZNc2IpCisJCSpwT3V0ID0gKHVpbnQxNl90KSgqcEluIHwgKCoocEluICsgMSkgPDwgOCkpOworCWVsc2UKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCAodWludDE2X3QgKilwT3V0LCBwSW4sIDIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGZyYW1lc250b2hsKHRwQW5pU2lyR2xvYmFsICAgIHBDdHgsCisJCQl1aW50MzJfdCAqcE91dCwKKwkJCXVpbnQ4X3QgICpwSW4sCisJCQl0RlJBTUVTX0JPT0wgIGZNc2IpCit7CisJKHZvaWQpcEN0eDsKKyNpZiBkZWZpbmVkIChET1QxMUZfTElUVExFX0VORElBTl9IT1NUKQorCWlmICghZk1zYikKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCAodWludDMyX3QgKilwT3V0LCBwSW4sIDQpOworCWVsc2UKKwkJKnBPdXQgPSAodWludDMyX3QpKCpwSW4gPDwgMjQpIHwKKwkJCSgqKHBJbiArIDEpIDw8IDE2KSB8CisJCQkoKihwSW4gKyAyKSA8PCAgOCkgfAorCQkJKCoocEluICsgMykpOworI2Vsc2UKKwlpZiAoIWZNc2IpCisJCSpwT3V0ID0gKHVpbnQzMl90KSgqKHBJbiArIDMpIDw8IDI0KSB8CisJCQkoKihwSW4gKyAyKSA8PCAxNikgfAorCQkJKCoocEluICsgMSkgPDwgIDgpIHwKKwkJCSgqKHBJbikpOworZWxzZQorCQkqcE91dCA9ICoodWludDMyX3QgKilwSW47CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZnJhbWVzbnRvaHEodHBBbmlTaXJHbG9iYWwgICAgcEN0eCwKKwkJCXRET1QxMUZfVTY0ICpwT3V0LAorCQkJdWludDhfdCAgKnBJbiwKKwkJCXRGUkFNRVNfQk9PTCAgZk1zYikKK3sKKyNpZiBkZWZpbmVkIChET1QxMUZfTElUVExFX0VORElBTl9IT1NUKQorCWZyYW1lc250b2hsKHBDdHgsICYoKCpwT3V0KVswXSksIHBJbiwgZk1zYik7CisJZnJhbWVzbnRvaGwocEN0eCwgJigoKnBPdXQpWzFdKSwgcEluICsgNCwgZk1zYik7CisjZWxzZQorCWZyYW1lc250b2hsKHBDdHgsICYoKCpwT3V0KVsxXSksIHBJbiwgZk1zYik7CisJZnJhbWVzbnRvaGwocEN0eCwgJigoKnBPdXQpWzBdKSwgcEluICsgNCwgZk1zYik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZnJhbWVzaHRvbnModHBBbmlTaXJHbG9iYWwgICAgcEN0eCwKKwkJCXVpbnQ4X3QgICpwT3V0LAorCQkJdWludDE2X3QgIHBJbiwKKwkJCXRGUkFNRVNfQk9PTCAgZk1zYikKK3sKKwkodm9pZClwQ3R4OworI2lmIGRlZmluZWQgKERPVDExRl9MSVRUTEVfRU5ESUFOX0hPU1QpCisJaWYgKCFmTXNiKSB7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcE91dCwgJnBJbiwgMik7CisJfSBlbHNlIHsKKwkJKnBPdXQgICAgICAgPSAocEluICYgMHhmZjAwKSA+PiA4OworCQkqKHBPdXQgKyAxKSA9IHBJbiAmIDB4ZmY7CisJfQorI2Vsc2UKKwlpZiAoIWZNc2IpIHsKKwkJKnBPdXQgICAgICAgPSBwSW4gJiAweGZmOworCQkqKHBPdXQgKyAxKSA9IChwSW4gJiAweGZmMDApID4+IDg7CisJfSBlbHNlIHsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwT3V0LCAmcEluLCAyKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZnJhbWVzaHRvbmwodHBBbmlTaXJHbG9iYWwgICAgcEN0eCwKKwkJCXVpbnQ4X3QgICpwT3V0LAorCQkJdWludDMyX3QgIHBJbiwKKwkJCXRGUkFNRVNfQk9PTCAgZk1zYikKK3sKKwkodm9pZClwQ3R4OworI2lmIGRlZmluZWQgKERPVDExRl9MSVRUTEVfRU5ESUFOX0hPU1QpCisJaWYgKCFmTXNiKSB7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcE91dCwgJnBJbiwgNCk7CisJfSBlbHNlIHsKKwkJKnBPdXQgICAgICAgPSAocEluICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisJCSoocE91dCArIDEpID0gKHBJbiAmIDB4MDBmZjAwMDApID4+IDE2OworCQkqKHBPdXQgKyAyKSA9IChwSW4gJiAweDAwMDBmZjAwKSA+PiAgODsKKwkJKihwT3V0ICsgMykgPSAocEluICYgMHgwMDAwMDBmZik7CisJfQorI2Vsc2UKKwlpZiAoIWZNc2IpIHsKKwkJKnBPdXQgICAgICAgPSAocEluICYgMHgwMDAwMDBmZik7CisJCSoocE91dCArIDEpID0gKHBJbiAmIDB4MDAwMGZmMDApID4+ICA4OworCQkqKHBPdXQgKyAyKSA9IChwSW4gJiAweDAwZmYwMDAwKSA+PiAxNjsKKwkJKihwT3V0ICsgMykgPSAocEluICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisJfSBlbHNlIHsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwT3V0LCAmcEluLCA0KTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZnJhbWVzaHRvbnEodHBBbmlTaXJHbG9iYWwgICAgcEN0eCwKKwkJCXVpbnQ4X3QgICpwT3V0LAorCQkJdERPVDExRl9VNjQgIHBJbiwKKwkJCXRGUkFNRVNfQk9PTCAgZk1zYikKK3sKKyNpZiBkZWZpbmVkIChET1QxMUZfTElUVExFX0VORElBTl9IT1NUKQorCWZyYW1lc2h0b25sKHBDdHgsIHBPdXQsIHBJblswXSwgZk1zYik7CisJZnJhbWVzaHRvbmwocEN0eCwgcE91dCArIDQsIHBJblsxXSwgZk1zYik7CisjZWxzZQorCWZyYW1lc2h0b25sKHBDdHgsIHBPdXQgKyA0LCBwSW5bMV0sIGZNc2IpOworCWZyYW1lc2h0b25sKHBDdHgsIHBPdXQsIHBJblswXSwgZk1zYik7CisjZW5kaWYKK30KKworc3RhdGljIGNvbnN0IHRJRURlZm4gKmZpbmRfaWVfZGVmbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICBjb25zdCB0SUVEZWZuICBJRXNbXSkKK3sKKwljb25zdCB0SUVEZWZuICpwSWU7CisJKHZvaWQpcEN0eDsKKworCXBJZSA9ICYoSUVzWzBdKTsKKwl3aGlsZSAoMHhmZiAhPSBwSWUtPmVpZCkgeworCQlpZiAoKnBCdWYgPT0gcEllLT5laWQpIHsKKwkJCWlmICgwID09IHBJZS0+bm91aSkKKwkJCQlyZXR1cm4gcEllOworCisJCQlpZiAoKG5CdWYgPiAodWludDMyX3QpKHBJZS0+bm91aSArIDIpKSAmJgorCQkJICAgICghRE9UMTFGX01FTUNNUChwQ3R4LCBwQnVmICsgMiwgcEllLT5vdWksCisJCQkJCSAgICAgIHBJZS0+bm91aSkpKQorCQkJCXJldHVybiBwSWU7CisJCX0KKworCQkrK3BJZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHVpbnQzMl90IGdldF9jb250YWluZXJfaWVzX2xlbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDMyX3QgIG5CdWYsCisJCQkJICAgICAgdWludDhfdCAqcG5Db25zdW1lZCwKKwkJCQkgICAgICBjb25zdCB0SUVEZWZuICBJRXNbXSkKK3sKKwljb25zdCB0SUVEZWZuICpwSWUsICpwSWVGaXJzdDsKKwl1aW50OF90ICpwQnVmUmVtYWluaW5nID0gcEJ1ZjsKKwl1aW50OF90IGxlbiA9IDA7CisJKHZvaWQpcEN0eDsKKworCXBJZUZpcnN0ID0gJihJRXNbMF0pOworCisJaWYgKCpwQnVmUmVtYWluaW5nICE9IHBJZUZpcnN0LT5laWQpCisJCXJldHVybiBET1QxMUZfSU5URVJOQUxfRVJST1I7CisJbGVuICs9ICoocEJ1ZlJlbWFpbmluZysxKTsKKwlwQnVmUmVtYWluaW5nICs9IGxlbiArIDI7CisJbGVuICs9IDI7CisJd2hpbGUgKGxlbiA8IG5CdWYpIHsKKwkJcEllID0gZmluZF9pZV9kZWZuKHBDdHgsIHBCdWZSZW1haW5pbmcsIG5CdWYgKyBsZW4sIElFcyk7CisJCWlmIChOVUxMID09IHBJZSkKKwkJCWJyZWFrOworCQlpZiAocEllLT5laWQgPT0gcEllRmlyc3QtPmVpZCkKKwkJCWJyZWFrOworCQlsZW4gKz0gKihwQnVmUmVtYWluaW5nICsgMSkgKyAyOworCQlwQnVmUmVtYWluaW5nICs9ICoocEJ1ZlJlbWFpbmluZyArIDEpICsgMjsKKwl9CisKKwkqcG5Db25zdW1lZCA9IGxlbjsKKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisKK30KKworCitzdGF0aWMgdWludDMyX3QgdW5wYWNrX2NvcmUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkgICAgY29uc3QgdEZGRGVmbiAgRkZzW10sCisJCQkgICAgY29uc3QgdElFRGVmbiAgSUVzW10sCisJCQkgICAgdWludDhfdCAqcEZybSwKKwkJCSAgICBzaXplX3QgICBuRnJtKTsKK3N0YXRpYyB1aW50MzJfdCBwYWNrX2NvcmUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgdWludDhfdCAqcFNyYywKKwkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgdWludDMyX3QgIG5CdWYsCisJCQkgIHVpbnQzMl90ICpwbkNvbnN1bWVkLAorCQkJICBjb25zdCB0RkZEZWZuICBGRnNbXSwKKwkJCSAgY29uc3QgdElFRGVmbiAgSUVzW10pOworc3RhdGljIHVpbnQzMl90IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICB1aW50OF90ICpwRnJtLAorCQkJCSAgICAgdWludDMyX3QgKnBuTmVlZGVkLAorCQkJCSAgICAgY29uc3QgdElFRGVmbiAgSUVzW10pOworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9jb21tb25fZnVuYyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB1aW50MTZfdCB0bHZsZW4sIHVpbnQ4X3QgKnBEc3RQcmVzZW50LAorCQkJCSAgICAgICB1aW50OF90ICpwRHN0RmllbGQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKwkqcERzdFByZXNlbnQgPSAxOworCSpwRHN0RmllbGQgPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3Rsdl9jb21tb25fZnVuYy4gKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfY29tbW9uX2Z1bmMyKHRwQW5pU2lyR2xvYmFsICBwQ3R4LCB1aW50OF90ICpwQnVmLAorCQkJCQl1aW50MTZfdCB0bHZsZW4sIHVpbnQ4X3QgKnBEc3RQcmVzZW50LAorCQkJCQl1aW50MTZfdCAqcERzdFN0YXRlKQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisJKnBEc3RQcmVzZW50ID0gMTsKKwlmcmFtZXNudG9ocyhwQ3R4LCBwRHN0U3RhdGUsIHBCdWYsIDEpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfY29tbW9uX2Z1bmMyLiAqLworCit2b2lkIGRvdDExZl91bnBhY2tfZmZfY29tbW9uX2Z1bmModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsIHVpbnQxNl90ICpwRHN0RmllbGQpCit7CisJZnJhbWVzbnRvaHMocEN0eCwgcERzdEZpZWxkLCBwQnVmLCAwKTsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3VucGFja19mZl9jb21tb25fZnVuYy4gKi8KKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9jb21tb25fZnVuYyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sIHVpbnQ4X3QgKnBEc3RQcmVzZW50ICwKKwkJCQkgICAgICB1aW50OF90ICpwRHN0RmllbGQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpaWVsZW47CisJKHZvaWQpcEJ1ZjsKKwlpZiAoKCpwRHN0UHJlc2VudCkpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJKnBEc3RQcmVzZW50ID0gMTsKKwkqcERzdEZpZWxkID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKKworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX2NvbW1vbl9mdW5jICovCisKK3R5cGVkZWYgc3RydWN0IHNUTFZEZWZuIHsKKwl1aW50MzJfdCAgIG9mZnNldDsKKwl1aW50MzJfdCAgIHByZXNlbmNlT2Zmc2V0OworCWNvbnN0IGNoYXIgICAgICpuYW1lOworCXVpbnQxNl90ICAgc2lnOworCXVpbnQzMl90ICAgaWQ7CisJdWludDMyX3QgICBwZWM7CisJdWludDMyX3QgICBtaW5TaXplOworCXVpbnQzMl90ICAgbWF4U2l6ZTsKKwl1aW50OF90ICAgIGZNYW5kYXRvcnk7CisJdWludDhfdCAgICBzVHlwZTsKKwl1aW50OF90ICAgIHNMZW47CisJdWludDhfdCAgICBmTXNiOworfSB0VExWRGVmbjsKKworc3RhdGljIGNvbnN0IHRUTFZEZWZuICpmaW5kX3Rsdl9kZWZuKHRwQW5pU2lyR2xvYmFsICAgIHBDdHgsCisJCQkJICAgICB1aW50OF90ICAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQzMl90ICBuQnVmLAorCQkJCSAgICAgY29uc3QgdFRMVkRlZm4gICAgICBUTFZzW10pCit7CisJY29uc3QgdFRMVkRlZm4gKnBUbHY7CisJdWludDMyX3QgICBwZWM7CisJdWludDE2X3QgICBpZDsKKworCXBUbHYgPSAmKFRMVnNbMF0pOworCSh2b2lkKXBDdHg7CisJaWYgKHBUbHYtPnNUeXBlID09IDIpCisJCWZyYW1lc250b2hzKHBDdHgsICZpZCwgcEJ1ZiwgMSk7CisJZWxzZQorCQlpZCA9ICpwQnVmOworCisJd2hpbGUgKDB4ZmZmZiAhPSBwVGx2LT5pZCkgeworCQlpZiAoaWQgPT0gcFRsdi0+aWQpIHsKKwkJCWlmICgwID09IHBUbHYtPnBlYykKKwkJCQlyZXR1cm4gcFRsdjsKKworCQkJaWYgKG5CdWYgPiA1KSB7CisJCQkJcGVjID0gKCgqKHBCdWYgKyA0KSkgPDwgMTYpIHwKKwkJCQkgICAgICAoKCoocEJ1ZiArIDUpKSA8PCAgOCkgfAorCQkJCSAgICAgICoocEJ1ZiArIDYpOworCQkJCWlmIChwZWMgPT0gcFRsdi0+cGVjKQorCQkJCQlyZXR1cm4gcFRsdjsKKwkJCX0KKwkJfQorCisJCSsrcFRsdjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHVpbnQzMl90IHVucGFja190bHZfY29yZSh0cEFuaVNpckdsb2JhbCAgIHBDdHgsCisJCQl1aW50OF90ICpwQnVmLAorCQkJdWludDMyX3QgbkJ1ZiwKKwkJCWNvbnN0IHRUTFZEZWZuIFRMVnNbXSwKKwkJCXVpbnQ4X3QgKnBGcm0sCisJCQlzaXplX3QgICAgICAgbkZybSk7CitzdGF0aWMgdWludDMyX3QgcGFja190bHZfY29yZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgdWludDhfdCAqcFNyYywKKwkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgICB1aW50MzJfdCAgbkJ1ZiwKKwkJCSAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkLAorCQkJICAgICAgY29uc3QgdFRMVkRlZm4gIFRMVnNbXSwKKwkJCSAgICAgIHVpbnQzMl90ICpwaWR4KTsKK3N0YXRpYyB1aW50MzJfdCBnZXRfcGFja2VkX3NpemVfdGx2X2NvcmUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBGcm0sCisJCQkJCSB1aW50MzJfdCAqcG5OZWVkZWQsCisJCQkJCSBjb25zdCB0VExWRGVmbiAgVExWc1tdKTsKKworI2RlZmluZSBTaWdGZkFJRCAoMHgwMDAxKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfYWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgIHREb3QxMWZGZkFjdGlvbiAqcERzdCkKK3sKKwlwRHN0LT5hY3Rpb24gPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3VucGFja19mZl9hY3Rpb24uICovCisKKyNkZWZpbmUgU2lnRmZBY3Rpb24gKDB4MDAwMikKKworI2RlZmluZSBTaWdGZkF1dGhBbGdvICgweDAwMDMpCisKKyNkZWZpbmUgU2lnRmZBdXRoU2VxTm8gKDB4MDAwNCkKKworI2RlZmluZSBTaWdGZkJlYWNvbkludGVydmFsICgweDAwMDUpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9jYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICB1aW50OF90ICpwQnVmLAorCQkJCSAgIHREb3QxMWZGZkNhcGFiaWxpdGllcyAqcERzdCkKK3sKKwl1aW50MTZfdCB0bXAwX187CisJZnJhbWVzbnRvaHMocEN0eCwgJnRtcDBfXywgcEJ1ZiwgMCk7CisJcERzdC0+ZXNzID0gdG1wMF9fID4+IDAgJiAweDE7CisJcERzdC0+aWJzcyA9IHRtcDBfXyA+PiAxICYgMHgxOworCXBEc3QtPmNmUG9sbGFibGUgPSB0bXAwX18gPj4gMiAmIDB4MTsKKwlwRHN0LT5jZlBvbGxSZXEgPSB0bXAwX18gPj4gMyAmIDB4MTsKKwlwRHN0LT5wcml2YWN5ID0gdG1wMF9fID4+IDQgJiAweDE7CisJcERzdC0+c2hvcnRQcmVhbWJsZSA9IHRtcDBfXyA+PiA1ICYgMHgxOworCXBEc3QtPnBiY2MgPSB0bXAwX18gPj4gNiAmIDB4MTsKKwlwRHN0LT5jaGFubmVsQWdpbGl0eSA9IHRtcDBfXyA+PiA3ICYgMHgxOworCXBEc3QtPnNwZWN0cnVtTWd0ID0gdG1wMF9fID4+IDggJiAweDE7CisJcERzdC0+cW9zID0gdG1wMF9fID4+IDkgJiAweDE7CisJcERzdC0+c2hvcnRTbG90VGltZSA9IHRtcDBfXyA+PiAxMCAmIDB4MTsKKwlwRHN0LT5hcHNkID0gdG1wMF9fID4+IDExICYgMHgxOworCXBEc3QtPnJybSA9IHRtcDBfXyA+PiAxMiAmIDB4MTsKKwlwRHN0LT5kc3NzT2ZkbSA9IHRtcDBfXyA+PiAxMyAmIDB4MTsKKwlwRHN0LT5kZWxheWVkQkEgPSB0bXAwX18gPj4gMTQgJiAweDE7CisJcERzdC0+aW1tZWRpYXRlQkEgPSB0bXAwX18gPj4gMTUgJiAweDE7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfY2FwYWJpbGl0aWVzLiAqLworCisjZGVmaW5lIFNpZ0ZmQ2FwYWJpbGl0aWVzICgweDAwMDYpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9jYXRlZ29yeSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgICAgdERvdDExZkZmQ2F0ZWdvcnkgKnBEc3QpCit7CisJcERzdC0+Y2F0ZWdvcnkgPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3VucGFja19mZl9jYXRlZ29yeS4gKi8KKworI2RlZmluZSBTaWdGZkNhdGVnb3J5ICgweDAwMDcpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9jdXJyZW50X2FwX2FkZHJlc3ModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICAgdERvdDExZkZmQ3VycmVudEFQQWRkcmVzcyAqcERzdCkKK3sKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPm1hYywgcEJ1ZiwgNik7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfY3VycmVudF9hcF9hZGRyZXNzLiAqLworCisjZGVmaW5lIFNpZ0ZmQ3VycmVudEFQQWRkcmVzcyAoMHgwMDA4KQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfZGlhbG9nX3Rva2VuKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICB1aW50OF90ICpwQnVmLAorCQkJCSAgdERvdDExZkZmRGlhbG9nVG9rZW4gKnBEc3QpCit7CisJcERzdC0+dG9rZW4gPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3VucGFja19mZl9kaWFsb2dfdG9rZW4uICovCisKKyNkZWZpbmUgU2lnRmZEaWFsb2dUb2tlbiAoMHgwMDA5KQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfbGlua19tYXJnaW4odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkgdERvdDExZkZmTGlua01hcmdpbiAqcERzdCkKK3sKKwlwRHN0LT5saW5rTWFyZ2luID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfbGlua19tYXJnaW4uICovCisKKyNkZWZpbmUgU2lnRmZMaW5rTWFyZ2luICgweDAwMGEpCisKKyNkZWZpbmUgU2lnRmZMaXN0ZW5JbnRlcnZhbCAoMHgwMDBiKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfbWF4X3R4X3Bvd2VyKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJIHREb3QxMWZGZk1heFR4UG93ZXIgKnBEc3QpCit7CisJcERzdC0+bWF4VHhQb3dlciA9ICpwQnVmOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2ZmX21heF90eF9wb3dlci4gKi8KKworI2RlZmluZSBTaWdGZk1heFR4UG93ZXIgKDB4MDAwYykKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX251bV9vZl9yZXBldGl0aW9ucyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB0RG90MTFmRmZOdW1PZlJlcGV0aXRpb25zICpwRHN0KQoreworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5yZXBldGl0aW9ucywgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfbnVtX29mX3JlcGV0aXRpb25zLiAqLworCisjZGVmaW5lIFNpZ0ZmTnVtT2ZSZXBldGl0aW9ucyAoMHgwMDBkKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfb3BlcmF0aW5nX21vZGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdERvdDExZkZmT3BlcmF0aW5nTW9kZSAqcERzdCkKK3sKKwl1aW50OF90IHRtcDFfXzsKKwl0bXAxX18gPSAqcEJ1ZjsKKwlwRHN0LT5jaGFuV2lkdGggPSB0bXAxX18gPj4gMCAmIDB4MzsKKwlwRHN0LT5yZXNlcnZlZCA9IHRtcDFfXyA+PiAyICYgMHgzOworCXBEc3QtPnJ4TlNTID0gdG1wMV9fID4+IDQgJiAweDc7CisJcERzdC0+cnhOU1NUeXBlID0gdG1wMV9fID4+IDcgJiAweDE7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfb3BlcmF0aW5nX21vZGUuICovCisKKyNkZWZpbmUgU2lnRmZPcGVyYXRpbmdNb2RlICgweDAwMGUpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9yY3BpKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICB1aW50OF90ICpwQnVmLAorCQkJICAgdERvdDExZkZmUkNQSSAqcERzdCkKK3sKKwlwRHN0LT5yY3BpID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfcmNwaS4gKi8KKworI2RlZmluZSBTaWdGZlJDUEkgKDB4MDAwZikKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX3JzbmkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICB0RG90MTFmRmZSU05JICpwRHN0KQoreworCXBEc3QtPnJzbmkgPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3VucGFja19mZl9yc25pLiAqLworCisjZGVmaW5lIFNpZ0ZmUlNOSSAoMHgwMDEwKQorCisjZGVmaW5lIFNpZ0ZmUmVhc29uICgweDAwMTEpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9yeF9hbnRlbm5hX2lkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICB1aW50OF90ICpwQnVmLAorCQkJCSAgdERvdDExZkZmUnhBbnRlbm5hSWQgKnBEc3QpCit7CisJcERzdC0+YW50ZW5uYUlkID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfcnhfYW50ZW5uYV9pZC4gKi8KKworI2RlZmluZSBTaWdGZlJ4QW50ZW5uYUlkICgweDAwMTIpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl9zbV9wb3dlcl9tb2RlX3NldCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHREb3QxMWZGZlNNUG93ZXJNb2RlU2V0ICpwRHN0KQoreworCXVpbnQ4X3QgdG1wMl9fOworCXRtcDJfXyA9ICpwQnVmOworCXBEc3QtPlBvd2VyU2F2ZV9FbiA9IHRtcDJfXyA+PiAwICYgMHgxOworCXBEc3QtPk1vZGUgPSB0bXAyX18gPj4gMSAmIDB4MTsKKwlwRHN0LT5yZXNlcnZlZCA9IHRtcDJfXyA+PiAyICYgMHgzZjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3VucGFja19mZl9zbV9wb3dlcl9tb2RlX3NldC4gKi8KKworI2RlZmluZSBTaWdGZlNNUG93ZXJNb2RlU2V0ICgweDAwMTMpCisKKyNkZWZpbmUgU2lnRmZTdGF0dXMgKDB4MDAxNCkKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX3N0YXR1c19jb2RlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJIHREb3QxMWZGZlN0YXR1c0NvZGUgKnBEc3QpCit7CisJcERzdC0+c3RhdHVzQ29kZSA9ICpwQnVmOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2ZmX3N0YXR1c19jb2RlLiAqLworCisjZGVmaW5lIFNpZ0ZmU3RhdHVzQ29kZSAoMHgwMDE1KQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfdHBjX2VsZV9pZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgICAgdERvdDExZkZmVFBDRWxlSUQgKnBEc3QpCit7CisJcERzdC0+VFBDSWQgPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3VucGFja19mZl90cGNfZWxlX2lkLiAqLworCisjZGVmaW5lIFNpZ0ZmVFBDRWxlSUQgKDB4MDAxNikKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX3RwY19lbGVfbGVuKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJIHREb3QxMWZGZlRQQ0VsZUxlbiAqcERzdCkKK3sKKwlwRHN0LT5UUENMZW4gPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3VucGFja19mZl90cGNfZWxlX2xlbi4gKi8KKworI2RlZmluZSBTaWdGZlRQQ0VsZUxlbiAoMHgwMDE3KQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfdHNfaW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICB0RG90MTFmRmZUU0luZm8gKnBEc3QpCit7CisJdWludDMyX3QgdG1wM19fOworCWZyYW1lc250b2hsKHBDdHgsICZ0bXAzX18sIHBCdWYsIDApOworCXBEc3QtPnRyYWZmaWNfdHlwZSA9IHRtcDNfXyA+PiAwICYgMHgxOworCXBEc3QtPnRzaWQgPSB0bXAzX18gPj4gMSAmIDB4ZjsKKwlwRHN0LT5kaXJlY3Rpb24gPSB0bXAzX18gPj4gNSAmIDB4MzsKKwlwRHN0LT5hY2Nlc3NfcG9saWN5ID0gdG1wM19fID4+IDcgJiAweDM7CisJcERzdC0+YWdncmVnYXRpb24gPSB0bXAzX18gPj4gOSAmIDB4MTsKKwlwRHN0LT5wc2IgPSB0bXAzX18gPj4gMTAgJiAweDE7CisJcERzdC0+dXNlcl9wcmlvcml0eSA9IHRtcDNfXyA+PiAxMSAmIDB4NzsKKwlwRHN0LT50c2luZm9fYWNrX3BvbCA9IHRtcDNfXyA+PiAxNCAmIDB4MzsKKwlwRHN0LT5zY2hlZHVsZSA9IHRtcDNfXyA+PiAxNiAmIDB4MTsKKwlwRHN0LT51bnVzZWQgPSB0bXAzX18gPj4gMTcgJiAweDdmZmY7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfdHNfaW5mby4gKi8KKworI2RlZmluZSBTaWdGZlRTSW5mbyAoMHgwMDE4KQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfdGltZV9zdGFtcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCSB0RG90MTFmRmZUaW1lU3RhbXAgKnBEc3QpCit7CisJZnJhbWVzbnRvaHEocEN0eCwgJnBEc3QtPnRpbWVzdGFtcCwgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfdGltZV9zdGFtcC4gKi8KKworI2RlZmluZSBTaWdGZlRpbWVTdGFtcCAoMHgwMDE5KQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfdHJhbnNhY3Rpb25faWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdERvdDExZkZmVHJhbnNhY3Rpb25JZCAqcERzdCkKK3sKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnRyYW5zSWQsIHBCdWYsIDIpOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2ZmX3RyYW5zYWN0aW9uX2lkLiAqLworCisjZGVmaW5lIFNpZ0ZmVHJhbnNhY3Rpb25JZCAoMHgwMDFhKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfdHhfYW50ZW5uYV9pZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgIHREb3QxMWZGZlR4QW50ZW5uYUlkICpwRHN0KQoreworCXBEc3QtPmFudGVubmFJZCA9ICpwQnVmOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2ZmX3R4X2FudGVubmFfaWQuICovCisKKyNkZWZpbmUgU2lnRmZUeEFudGVubmFJZCAoMHgwMDFiKQorCit2b2lkIGRvdDExZl91bnBhY2tfZmZfdHhfcG93ZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgICB0RG90MTFmRmZUeFBvd2VyICpwRHN0KQoreworCXBEc3QtPnR4UG93ZXIgPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3VucGFja19mZl90eF9wb3dlci4gKi8KKworI2RlZmluZSBTaWdGZlR4UG93ZXIgKDB4MDAxYykKKwordm9pZCBkb3QxMWZfdW5wYWNrX2ZmX3ZodF9tZW1iZXJzaGlwX3N0YXR1c19hcnJheSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICAgICAgIHREb3QxMWZGZlZodE1lbWJlcnNoaXBTdGF0dXNBcnJheSAqcERzdCkKK3sKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPm1lbWJlcnNoaXBTdGF0dXNBcnJheSwgcEJ1ZiwgOCk7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfdmh0X21lbWJlcnNoaXBfc3RhdHVzX2FycmF5LiAqLworCisjZGVmaW5lIFNpZ0ZmVmh0TWVtYmVyc2hpcFN0YXR1c0FycmF5ICgweDAwMWQpCisKK3ZvaWQgZG90MTFmX3VucGFja19mZl92aHRfdXNlcl9wb3NpdGlvbl9hcnJheSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICB0RG90MTFmRmZWaHRVc2VyUG9zaXRpb25BcnJheSAqcERzdCkKK3sKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnVzZXJQb3NpdGlvbkFycmF5LCBwQnVmLCAxNik7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZmZfdmh0X3VzZXJfcG9zaXRpb25fYXJyYXkuICovCisKKyNkZWZpbmUgU2lnRmZWaHRVc2VyUG9zaXRpb25BcnJheSAoMHgwMDFlKQorCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9hdXRob3JpemVkX21hX2NzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICB1aW50MTZfdCB0bHZsZW4sCisJCQkJCSAgdERvdDExZlRMVkF1dGhvcml6ZWRNQUNzICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXBEc3QtPnByZXNlbnQgPSAxOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+bWFjLCBwQnVmLCA2KTsKKwlwQnVmICs9IDY7CisJdGx2bGVuIC09ICh1aW50OF90KTY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfYXV0aG9yaXplZF9tYV9jcy4gKi8KKworI2RlZmluZSBTaWdUbHZBdXRob3JpemVkTUFDcyAoMHgwMDAxKQorCisKKyNkZWZpbmUgU2lnVGx2UmVxdWVzdFRvRW5yb2xsICgweDAwMDIpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfdmVyc2lvbjIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDE2X3QgdGx2bGVuLAorCQkJCSAgICB0RG90MTFmVExWVmVyc2lvbjIgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDhfdCB0bXA0X187CisJcERzdC0+cHJlc2VudCA9IDE7CisJdG1wNF9fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCXRsdmxlbiAtPSAxOworCXBEc3QtPm1pbm9yID0gdG1wNF9fID4+IDAgJiAweGY7CisJcERzdC0+bWFqb3IgPSB0bXA0X18gPj4gNCAmIDB4ZjsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3Rsdl92ZXJzaW9uMi4gKi8KKworI2RlZmluZSBTaWdUbHZWZXJzaW9uMiAoMHgwMDAzKQorCisKKyNkZWZpbmUgU2lnVGx2QVBTZXR1cExvY2tlZCAoMHgwMDA0KQorCisKKyNkZWZpbmUgU2lnVGx2QXNzb2NpYXRpb25TdGF0ZSAoMHgwMDA1KQorCisKKyNkZWZpbmUgU2lnVGx2Q29uZmlnTWV0aG9kcyAoMHgwMDA2KQorCisKKyNkZWZpbmUgU2lnVGx2Q29uZmlndXJhdGlvbkVycm9yICgweDAwMDcpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfZGV2aWNlX25hbWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQxNl90IHRsdmxlbiwKKwkJCQkgICAgICB0RG90MTFmVExWRGV2aWNlTmFtZSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5udW1fdGV4dCA9ICh1aW50OF90KSh0bHZsZW4pOworCWlmICh0bHZsZW4gPiAzMikgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnRleHQsIHBCdWYsICh0bHZsZW4pKTsKKwlwQnVmICs9ICh0bHZsZW4pOworCXRsdmxlbiAtPSAodGx2bGVuKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3Rsdl9kZXZpY2VfbmFtZS4gKi8KKworI2RlZmluZSBTaWdUbHZEZXZpY2VOYW1lICgweDAwMDgpCisKKworI2RlZmluZSBTaWdUbHZEZXZpY2VQYXNzd29yZElEICgweDAwMDkpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfZXh0ZW5kZWRfbGlzdGVuX3RpbWluZyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCQkgdWludDE2X3QgdGx2bGVuLAorCQkJCQkJIHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YXZhaWxpYmlsaXR5UGVyaW9kLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJdGx2bGVuIC09ICh1aW50OF90KTI7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmF2YWlsaWJpbGl0eUludGVydmFsLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJdGx2bGVuIC09ICh1aW50OF90KTI7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfZXh0ZW5kZWRfbGlzdGVuX3RpbWluZy4gKi8KKworI2RlZmluZSBTaWdUbHZFeHRlbmRlZExpc3RlblRpbWluZyAoMHgwMDBhKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X2xpc3Rlbl9jaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkgdWludDE2X3QgdGx2bGVuLAorCQkJCQkgdERvdDExZlRMVkxpc3RlbkNoYW5uZWwgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJcERzdC0+cHJlc2VudCA9IDE7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5jb3VudHJ5U3RyaW5nLCBwQnVmLCAzKTsKKwlwQnVmICs9IDM7CisJdGx2bGVuIC09ICh1aW50OF90KTM7CisJcERzdC0+cmVndWxhdG9yeUNsYXNzID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCXRsdmxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmNoYW5uZWwgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJdGx2bGVuIC09ICh1aW50OF90KTE7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfbGlzdGVuX2NoYW5uZWwuICovCisKKyNkZWZpbmUgU2lnVGx2TGlzdGVuQ2hhbm5lbCAoMHgwMDBiKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X21hbnVmYWN0dXJlcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkJIHVpbnQxNl90IHRsdmxlbiwKKwkJCQkJIHREb3QxMWZUTFZNYW51ZmFjdHVyZXIgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bnVtX25hbWUgPSAodWludDhfdCkodGx2bGVuKTsKKwlpZiAodGx2bGVuID4gNjQpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5uYW1lLCBwQnVmLCAodGx2bGVuKSk7CisJcEJ1ZiArPSAodGx2bGVuKTsKKwl0bHZsZW4gLT0gKHRsdmxlbik7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfbWFudWZhY3R1cmVyLiAqLworCisjZGVmaW5lIFNpZ1Rsdk1hbnVmYWN0dXJlciAoMHgwMDBjKQorCisKKyNkZWZpbmUgU2lnVGx2TWlub3JSZWFzb25Db2RlICgweDAwMGQpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfbW9kZWxfbmFtZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQxNl90IHRsdmxlbiwKKwkJCQkgICAgIHREb3QxMWZUTFZNb2RlbE5hbWUgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bnVtX3RleHQgPSAodWludDhfdCkodGx2bGVuKTsKKwlpZiAodGx2bGVuID4gMzIpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT50ZXh0LCBwQnVmLCAodGx2bGVuKSk7CisJcEJ1ZiArPSAodGx2bGVuKTsKKwl0bHZsZW4gLT0gKHRsdmxlbik7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfbW9kZWxfbmFtZS4gKi8KKworI2RlZmluZSBTaWdUbHZNb2RlbE5hbWUgKDB4MDAwZSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9tb2RlbF9udW1iZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICAgdWludDE2X3QgdGx2bGVuLAorCQkJCSAgICAgICB0RG90MTFmVExWTW9kZWxOdW1iZXIgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bnVtX3RleHQgPSAodWludDhfdCkodGx2bGVuKTsKKwlpZiAodGx2bGVuID4gMzIpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT50ZXh0LCBwQnVmLCAodGx2bGVuKSk7CisJcEJ1ZiArPSAodGx2bGVuKTsKKwl0bHZsZW4gLT0gKHRsdmxlbik7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfbW9kZWxfbnVtYmVyLiAqLworCisjZGVmaW5lIFNpZ1Rsdk1vZGVsTnVtYmVyICgweDAwMGYpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfbm90aWNlX29mX2Fic2VuY2UodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICAgdWludDE2X3QgdGx2bGVuLAorCQkJCQkgICB0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPmluZGV4ID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCXRsdmxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPkNUU1dpbmRvd09wcFBTID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCXRsdmxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPm51bV9Ob0FEZXNjID0gKHVpbnQ4X3QpKHRsdmxlbik7CisJaWYgKHRsdmxlbiA+IDM2KSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+Tm9BRGVzYywgcEJ1ZiwgKHRsdmxlbikpOworCXBCdWYgKz0gKHRsdmxlbik7CisJdGx2bGVuIC09ICh0bHZsZW4pOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdGx2X25vdGljZV9vZl9hYnNlbmNlLiAqLworCisjZGVmaW5lIFNpZ1Rsdk5vdGljZU9mQWJzZW5jZSAoMHgwMDEwKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X29wZXJhdGluZ19jaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICAgdWludDE2X3QgdGx2bGVuLAorCQkJCQkgICAgdERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJcERzdC0+cHJlc2VudCA9IDE7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5jb3VudHJ5U3RyaW5nLCBwQnVmLCAzKTsKKwlwQnVmICs9IDM7CisJdGx2bGVuIC09ICh1aW50OF90KTM7CisJcERzdC0+cmVndWxhdG9yeUNsYXNzID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCXRsdmxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmNoYW5uZWwgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJdGx2bGVuIC09ICh1aW50OF90KTE7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfb3BlcmF0aW5nX2NoYW5uZWwuICovCisKKyNkZWZpbmUgU2lnVGx2T3BlcmF0aW5nQ2hhbm5lbCAoMHgwMDExKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3AyX3BfY2FwYWJpbGl0eSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkJIHVpbnQxNl90IHRsdmxlbiwKKwkJCQkJIHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5ICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPmRldmljZUNhcGFiaWxpdHkgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJdGx2bGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+Z3JvdXBDYXBhYmlsaXR5ID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCXRsdmxlbiAtPSAodWludDhfdCkxOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdGx2X3AyX3BfY2FwYWJpbGl0eS4gKi8KKworI2RlZmluZSBTaWdUbHZQMlBDYXBhYmlsaXR5ICgweDAwMTIpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfcDJfcF9kZXZpY2VfaWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICAgdWludDE2X3QgdGx2bGVuLAorCQkJCSAgICAgICB0RG90MTFmVExWUDJQRGV2aWNlSWQgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJcERzdC0+cHJlc2VudCA9IDE7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5QMlBEZXZpY2VBZGRyZXNzLCBwQnVmLCA2KTsKKwlwQnVmICs9IDY7CisJdGx2bGVuIC09ICh1aW50OF90KTY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfcDJfcF9kZXZpY2VfaWQuICovCisKKyNkZWZpbmUgU2lnVGx2UDJQRGV2aWNlSWQgKDB4MDAxMykKKworCitzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBEZXZpY2VJbmZvW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmVExWUDJQRGV2aWNlSW5mbywgRGV2aWNlTmFtZSksCisJb2Zmc2V0b2YodERvdDExZlRMVkRldmljZU5hbWUsIHByZXNlbnQpLCAiRGV2aWNlTmFtZSIsIFNpZ1RsdkRldmljZU5hbWUsCisJRE9UMTFGX1RMVl9ERVZJQ0VOQU1FLCAwLCA0LCAzNiwgMSwgMiwgMiwgMSwgfSwKKwl7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKK307CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3AyX3BfZGV2aWNlX2luZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50MTZfdCB0bHZsZW4sCisJCQkJCSB0RG90MTFmVExWUDJQRGV2aWNlSW5mbyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPlAyUERldmljZUFkZHJlc3MsIHBCdWYsIDYpOworCXBCdWYgKz0gNjsKKwl0bHZsZW4gLT0gKHVpbnQ4X3QpNjsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y29uZmlnTWV0aG9kLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJdGx2bGVuIC09ICh1aW50OF90KTI7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5wcmltYXJ5RGV2aWNlVHlwZSwgcEJ1ZiwgOCk7CisJcEJ1ZiArPSA4OworCXRsdmxlbiAtPSAodWludDhfdCk4OworCSh2b2lkKXBDdHg7CisJc3RhdHVzIHw9IHVucGFja190bHZfY29yZShwQ3R4LAorCQkJCSAgcEJ1ZiwKKwkJCQkgIHRsdmxlbiwKKwkJCQkgIFRMVlNfUDJQRGV2aWNlSW5mbywKKwkJCQkgICh1aW50OF90ICopcERzdCwKKwkJCQkgIHNpemVvZigqcERzdCkpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3Rsdl9wMl9wX2RldmljZV9pbmZvLiAqLworCisjZGVmaW5lIFNpZ1RsdlAyUERldmljZUluZm8gKDB4MDAxNCkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9wMl9wX2dyb3VwX2luZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50MTZfdCB0bHZsZW4sCisJCQkJCSB0RG90MTFmVExWUDJQR3JvdXBJbmZvICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPm51bV9QMlBDbGllbnRJbmZvRGVzYyA9ICh1aW50OF90KSh0bHZsZW4pOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+UDJQQ2xpZW50SW5mb0Rlc2MsIHBCdWYsICh0bHZsZW4pKTsKKwlwQnVmICs9ICh0bHZsZW4pOworCXRsdmxlbiAtPSAodGx2bGVuKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3Rsdl9wMl9wX2dyb3VwX2luZm8uICovCisKKyNkZWZpbmUgU2lnVGx2UDJQR3JvdXBJbmZvICgweDAwMTUpCisKKworI2RlZmluZSBTaWdUbHZQMlBTdGF0dXMgKDB4MDAxNikKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl9wcmltYXJ5X2RldmljZV90eXBlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICAgICB1aW50MTZfdCB0bHZsZW4sCisJCQkJCSAgICAgdERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCXBEc3QtPnByZXNlbnQgPSAxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5wcmltYXJ5X2NhdGVnb3J5LCBwQnVmLCAxKTsKKwlwQnVmICs9IDI7CisJdGx2bGVuIC09ICh1aW50OF90KTI7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5vdWksIHBCdWYsIDQpOworCXBCdWYgKz0gNDsKKwl0bHZsZW4gLT0gKHVpbnQ4X3QpNDsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+c3ViX2NhdGVnb3J5LCBwQnVmLCAxKTsKKwlwQnVmICs9IDI7CisJdGx2bGVuIC09ICh1aW50OF90KTI7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfcHJpbWFyeV9kZXZpY2VfdHlwZS4gKi8KKworI2RlZmluZSBTaWdUbHZQcmltYXJ5RGV2aWNlVHlwZSAoMHgwMDE3KQorCisKKyNkZWZpbmUgU2lnVGx2UkZCYW5kcyAoMHgwMDE4KQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGx2X3JlcXVlc3RfZGV2aWNlX3R5cGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICAgIHVpbnQxNl90IHRsdmxlbiwKKwkJCQkJICAgICB0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJcERzdC0+cHJlc2VudCA9IDE7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnByaW1hcnlfY2F0ZWdvcnksIHBCdWYsIDEpOworCXBCdWYgKz0gMjsKKwl0bHZsZW4gLT0gKHVpbnQ4X3QpMjsKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPm91aSwgcEJ1ZiwgNCk7CisJcEJ1ZiArPSA0OworCXRsdmxlbiAtPSAodWludDhfdCk0OworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5zdWJfY2F0ZWdvcnksIHBCdWYsIDEpOworCXBCdWYgKz0gMjsKKwl0bHZsZW4gLT0gKHVpbnQ4X3QpMjsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3Rsdl9yZXF1ZXN0X2RldmljZV90eXBlLiAqLworCisjZGVmaW5lIFNpZ1RsdlJlcXVlc3REZXZpY2VUeXBlICgweDAwMTkpCisKKworI2RlZmluZSBTaWdUbHZSZXF1ZXN0VHlwZSAoMHgwMDFhKQorCisKKyNkZWZpbmUgU2lnVGx2UmVzcG9uc2VUeXBlICgweDAwMWIpCisKKworI2RlZmluZSBTaWdUbHZTZWxlY3RlZFJlZ2lzdHJhciAoMHgwMDFjKQorCisKKyNkZWZpbmUgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzICgweDAwMWQpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfc2VyaWFsX251bWJlcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkJIHVpbnQxNl90IHRsdmxlbiwKKwkJCQkJIHREb3QxMWZUTFZTZXJpYWxOdW1iZXIgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bnVtX3RleHQgPSAodWludDhfdCkodGx2bGVuKTsKKwlpZiAodGx2bGVuID4gMzIpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT50ZXh0LCBwQnVmLCAodGx2bGVuKSk7CisJcEJ1ZiArPSAodGx2bGVuKTsKKwl0bHZsZW4gLT0gKHRsdmxlbik7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfc2VyaWFsX251bWJlci4gKi8KKworI2RlZmluZSBTaWdUbHZTZXJpYWxOdW1iZXIgKDB4MDAxZSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl91dWlkX2UodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MTZfdCB0bHZsZW4sCisJCQkJICB0RG90MTFmVExWVVVJRF9FICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXBEc3QtPnByZXNlbnQgPSAxOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+dXVpZCwgcEJ1ZiwgMTYpOworCXBCdWYgKz0gMTY7CisJdGx2bGVuIC09ICh1aW50OF90KTE2OworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdGx2X3V1aWRfZS4gKi8KKworI2RlZmluZSBTaWdUbHZVVUlEX0UgKDB4MDAxZikKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl91dWlkX3IodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MTZfdCB0bHZsZW4sCisJCQkJICB0RG90MTFmVExWVVVJRF9SICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXBEc3QtPnByZXNlbnQgPSAxOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+dXVpZCwgcEJ1ZiwgMTYpOworCXBCdWYgKz0gMTY7CisJdGx2bGVuIC09ICh1aW50OF90KTE2OworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdGx2X3V1aWRfci4gKi8KKworI2RlZmluZSBTaWdUbHZVVUlEX1IgKDB4MDAyMCkKKworCitzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19WZW5kb3JFeHRlbnNpb25bXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24sIFZlcnNpb24yKSwKKwlvZmZzZXRvZih0RG90MTFmVExWVmVyc2lvbjIsIHByZXNlbnQpLCAiVmVyc2lvbjIiLCBTaWdUbHZWZXJzaW9uMiwKKwlET1QxMUZfVExWX1ZFUlNJT04yLCAwLCAzLCAzLCAwLCAxLCAxLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiwgQXV0aG9yaXplZE1BQ3MpLAorCW9mZnNldG9mKHREb3QxMWZUTFZBdXRob3JpemVkTUFDcywgcHJlc2VudCksICJBdXRob3JpemVkTUFDcyIsCisJU2lnVGx2QXV0aG9yaXplZE1BQ3MsIERPVDExRl9UTFZfQVVUSE9SSVpFRE1BQ1MsIDAsIDgsIDgsIDAsIDEsIDEsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uLCBSZXF1ZXN0VG9FbnJvbGwpLAorCW9mZnNldG9mKHREb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwsIHByZXNlbnQpLCAiUmVxdWVzdFRvRW5yb2xsIiwKKwlTaWdUbHZSZXF1ZXN0VG9FbnJvbGwsIERPVDExRl9UTFZfUkVRVUVTVFRPRU5ST0xMLAorCTAsIDMsIDMsIDAsIDEsIDEsIDEsIH0sCisJezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCit9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl92ZW5kb3JfZXh0ZW5zaW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgIHVpbnQxNl90IHRsdmxlbiwKKwkJCQkJICAgdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnZlbmRvcklkLCBwQnVmLCAzKTsKKwlwQnVmICs9IDM7CisJdGx2bGVuIC09ICh1aW50OF90KTM7CisJKHZvaWQpcEN0eDsKKwlzdGF0dXMgfD0gdW5wYWNrX3Rsdl9jb3JlKHBDdHgsCisJCQkJICBwQnVmLAorCQkJCSAgdGx2bGVuLAorCQkJCSAgVExWU19WZW5kb3JFeHRlbnNpb24sCisJCQkJICAodWludDhfdCAqKXBEc3QsCisJCQkJICBzaXplb2YoKnBEc3QpKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja190bHZfdmVuZG9yX2V4dGVuc2lvbi4gKi8KKworI2RlZmluZSBTaWdUbHZWZW5kb3JFeHRlbnNpb24gKDB4MDAyMSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Rsdl92ZXJzaW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICB1aW50MTZfdCB0bHZsZW4sCisJCQkJICAgdERvdDExZlRMVlZlcnNpb24gKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDhfdCB0bXA1X187CisJcERzdC0+cHJlc2VudCA9IDE7CisJdG1wNV9fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCXRsdmxlbiAtPSAxOworCXBEc3QtPm1pbm9yID0gdG1wNV9fID4+IDAgJiAweGY7CisJcERzdC0+bWFqb3IgPSB0bXA1X18gPj4gNCAmIDB4ZjsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3Rsdl92ZXJzaW9uLiAqLworCisjZGVmaW5lIFNpZ1RsdlZlcnNpb24gKDB4MDAyMikKKworCisjZGVmaW5lIFNpZ1RsdldQU1N0YXRlICgweDAwMjMpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja190bHZfcDJfcF9pbnRlcmZhY2UodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50MTZfdCB0bHZsZW4sCisJCQkJCSB0RG90MTFmVExWUDJQSW50ZXJmYWNlICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXBEc3QtPnByZXNlbnQgPSAxOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+UDJQRGV2aWNlQWRkcmVzcywgcEJ1ZiwgNik7CisJcEJ1ZiArPSA2OworCXRsdmxlbiAtPSAodWludDhfdCk2OworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdGx2X3AyX3BfaW50ZXJmYWNlLiAqLworCisjZGVmaW5lIFNpZ1RsdlAyUEludGVyZmFjZSAoMHgwMDI0KQorCisKKyNkZWZpbmUgU2lnVGx2UDJQTWFuYWdlYWJpbGl0eSAoMHgwMDI1KQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfY29uZGVuc2VkX2NvdW50cnlfc3RyKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJCSAgICAgIHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5jb3VudHJ5U3RyLCBwQnVmLCAyKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX2NvbmRlbnNlZF9jb3VudHJ5X3N0ci4gKi8KKworI2RlZmluZSBTaWdJZUNvbmRlbnNlZENvdW50cnlTdHIgKDB4MDAwMSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2d0ayh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkgICAgICB0RG90MTFmSUVHVEsgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDE2X3QgdG1wNl9fOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCWZyYW1lc250b2hzKHBDdHgsICZ0bXA2X18sIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAyOworCXBEc3QtPmtleUlkID0gdG1wNl9fID4+IDAgJiAweDM7CisJcERzdC0+cmVzZXJ2ZWQgPSB0bXA2X18gPj4gMiAmIDB4M2ZlYjsKKwlwRHN0LT5rZXlMZW5ndGggPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPlJTQywgcEJ1ZiwgOCk7CisJcEJ1ZiArPSA4OworCWllbGVuIC09ICh1aW50OF90KTg7CisJcERzdC0+bnVtX2tleSA9ICh1aW50OF90KShpZWxlbik7CisJaWYgKGllbGVuID4gMzIpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5rZXksIHBCdWYsIChpZWxlbikpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfZ3RrLiAqLworCisjZGVmaW5lIFNpZ0llR1RLICgweDAwMDIpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9pZ3RrKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgICAgICB1aW50OF90IGllbGVuLAorCQkJICAgICAgIHREb3QxMWZJRUlHVEsgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5rZXlJRCwgcEJ1ZiwgMik7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5JUE4sIHBCdWYsIDYpOworCXBCdWYgKz0gNjsKKwlpZWxlbiAtPSAodWludDhfdCk2OworCXBEc3QtPmtleUxlbmd0aCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+a2V5LCBwQnVmLCAyNCk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9pZ3RrLiAqLworCisjZGVmaW5lIFNpZ0llSUdUSyAoMHgwMDAzKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcjBfa2hfaWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50OF90IGllbGVuLAorCQkJCSAgdERvdDExZklFUjBLSF9JRCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5udW1fUE1LX1IwX0lEID0gKHVpbnQ4X3QpKGllbGVuKTsKKwlpZiAoaWVsZW4gPiA0OCkgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPlBNS19SMF9JRCwgcEJ1ZiwgKGllbGVuKSk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9yMF9raF9pZC4gKi8KKworI2RlZmluZSBTaWdJZVIwS0hfSUQgKDB4MDAwNCkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3IxX2toX2lkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICB1aW50OF90ICpwQnVmLAorCQkJCSAgdWludDhfdCBpZWxlbiwKKwkJCQkgIHREb3QxMWZJRVIxS0hfSUQgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5QTUtfUjFfSUQsIHBCdWYsIDYpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcjFfa2hfaWQuICovCisKKyNkZWZpbmUgU2lnSWVSMUtIX0lEICgweDAwMDUpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV90c2ZfaW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICB0RG90MTFmSUVUU0ZJbmZvICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5Uc2ZPZmZzZXQsIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAodWludDhfdCkyOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5CZWFjb25JbnR2bCwgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV90c2ZfaW5mby4gKi8KKworI2RlZmluZSBTaWdJZVRTRkluZm8gKDB4MDAwNikKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2FwX2NoYW5uZWxfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICB1aW50OF90IGllbGVuLAorCQkJCQkgIHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5yZWd1bGF0b3J5Q2xhc3MgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlwRHN0LT5udW1fY2hhbm5lbExpc3QgPSAodWludDhfdCkoaWVsZW4pOworCWlmIChpZWxlbiA+IDUwKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+Y2hhbm5lbExpc3QsIHBCdWYsIChpZWxlbikpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfYXBfY2hhbm5lbF9yZXBvcnQuICovCisKKyNkZWZpbmUgU2lnSWVBUENoYW5uZWxSZXBvcnQgKDB4MDAwNykKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2Jjbl9yZXBvcnRpbmdfZGV0YWlsKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICAgICB1aW50OF90IGllbGVuLAorCQkJCQkgICAgIHREb3QxMWZJRUJjblJlcG9ydGluZ0RldGFpbCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5yZXBvcnRpbmdEZXRhaWwgPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX2Jjbl9yZXBvcnRpbmdfZGV0YWlsLiAqLworCisjZGVmaW5lIFNpZ0llQmNuUmVwb3J0aW5nRGV0YWlsICgweDAwMDgpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9iZWFjb25fcmVwb3J0X2ZybV9ib2R5KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJCSAgICAgIHREb3QxMWZJRUJlYWNvblJlcG9ydEZybUJvZHkgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bnVtX3JlcG9ydGVkRmllbGRzID0gKHVpbnQ4X3QpKGllbGVuKTsKKwlpZiAoaWVsZW4gPiAyMjQpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5yZXBvcnRlZEZpZWxkcywgcEJ1ZiwgKGllbGVuKSk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9iZWFjb25fcmVwb3J0X2ZybV9ib2R5LiAqLworCisjZGVmaW5lIFNpZ0llQmVhY29uUmVwb3J0RnJtQm9keSAoMHgwMDA5KQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfYmVhY29uX3JlcG9ydGluZyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgdWludDhfdCBpZWxlbiwKKwkJCQkJICB0RG90MTFmSUVCZWFjb25SZXBvcnRpbmcgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+cmVwb3J0aW5nQ29uZGl0aW9uID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+dGhyZXNob2xkID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9iZWFjb25fcmVwb3J0aW5nLiAqLworCisjZGVmaW5lIFNpZ0llQmVhY29uUmVwb3J0aW5nICgweDAwMGEpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9tZWFzdXJlbWVudF9waWxvdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICB1aW50OF90IGllbGVuLAorCQkJCQkgICB0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90ICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPm1lYXN1cmVtZW50UGlsb3QgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlwRHN0LT5udW1fdmVuZG9yU3BlY2lmaWMgPSAodWludDhfdCkoaWVsZW4pOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+dmVuZG9yU3BlY2lmaWMsIHBCdWYsIChpZWxlbikpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfbWVhc3VyZW1lbnRfcGlsb3QuICovCisKKyNkZWZpbmUgU2lnSWVNZWFzdXJlbWVudFBpbG90ICgweDAwMGIpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9tdWx0aV9ic3NpZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICB0RG90MTFmSUVNdWx0aUJzc2lkICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPm1heEJTU0lESW5kaWNhdG9yID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+bnVtX3ZlbmRvclNwZWNpZmljID0gKHVpbnQ4X3QpKGllbGVuKTsKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnZlbmRvclNwZWNpZmljLCBwQnVmLCAoaWVsZW4pKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX211bHRpX2Jzc2lkLiAqLworCisjZGVmaW5lIFNpZ0llTXVsdGlCc3NpZCAoMHgwMDBjKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcmljX2RhdGEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50OF90IGllbGVuLAorCQkJCSAgdERvdDExZklFUklDRGF0YSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5JZGVudGlmaWVyID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+cmVzb3VyY2VEZXNjQ291bnQgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+c3RhdHVzQ29kZSwgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9yaWNfZGF0YS4gKi8KKworI2RlZmluZSBTaWdJZVJJQ0RhdGEgKDB4MDAwZCkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3JpY19kZXNjcmlwdG9yKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkgdWludDhfdCBpZWxlbiwKKwkJCQkJIHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+cmVzb3VyY2VUeXBlID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+bnVtX3ZhcmlhYmxlRGF0YSA9ICh1aW50OF90KShpZWxlbik7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT52YXJpYWJsZURhdGEsIHBCdWYsIChpZWxlbikpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcmljX2Rlc2NyaXB0b3IuICovCisKKyNkZWZpbmUgU2lnSWVSSUNEZXNjcmlwdG9yICgweDAwMGUpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9ycm1fZW5hYmxlZF9jYXAodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50OF90IGllbGVuLAorCQkJCQkgdERvdDExZklFUlJNRW5hYmxlZENhcCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwl1aW50OF90IHRtcDdfXzsKKwl1aW50OF90IHRtcDhfXzsKKwl1aW50OF90IHRtcDlfXzsKKwl1aW50OF90IHRtcDEwX187CisJdWludDhfdCB0bXAxMV9fOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXRtcDdfXyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAxOworCXBEc3QtPkxpbmtNZWFzdXJlbWVudCA9IHRtcDdfXyA+PiAwICYgMHgxOworCXBEc3QtPk5laWdoYm9yUnB0ID0gdG1wN19fID4+IDEgJiAweDE7CisJcERzdC0+cGFyYWxsZWwgPSB0bXA3X18gPj4gMiAmIDB4MTsKKwlwRHN0LT5yZXBlYXRlZCA9IHRtcDdfXyA+PiAzICYgMHgxOworCXBEc3QtPkJlYWNvblBhc3NpdmUgPSB0bXA3X18gPj4gNCAmIDB4MTsKKwlwRHN0LT5CZWFjb25BY3RpdmUgPSB0bXA3X18gPj4gNSAmIDB4MTsKKwlwRHN0LT5CZWFjb25UYWJsZSA9IHRtcDdfXyA+PiA2ICYgMHgxOworCXBEc3QtPkJlYWNvblJlcENvbmQgPSB0bXA3X18gPj4gNyAmIDB4MTsKKwl0bXA4X18gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gMTsKKwlwRHN0LT5GcmFtZU1lYXN1cmVtZW50ID0gdG1wOF9fID4+IDAgJiAweDE7CisJcERzdC0+Q2hhbm5lbExvYWQgPSB0bXA4X18gPj4gMSAmIDB4MTsKKwlwRHN0LT5Ob2lzZUhpc3RvZ3JhbSA9IHRtcDhfXyA+PiAyICYgMHgxOworCXBEc3QtPnN0YXRpc3RpY3MgPSB0bXA4X18gPj4gMyAmIDB4MTsKKwlwRHN0LT5MQ0lNZWFzdXJlbWVudCA9IHRtcDhfXyA+PiA0ICYgMHgxOworCXBEc3QtPkxDSUF6aW11dGggPSB0bXA4X18gPj4gNSAmIDB4MTsKKwlwRHN0LT5UQ01DYXBhYmlsaXR5ID0gdG1wOF9fID4+IDYgJiAweDE7CisJcERzdC0+dHJpZ2dlcmVkVENNID0gdG1wOF9fID4+IDcgJiAweDE7CisJdG1wOV9fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09IDE7CisJcERzdC0+QVBDaGFuUmVwb3J0ID0gdG1wOV9fID4+IDAgJiAweDE7CisJcERzdC0+UlJNTUlCRW5hYmxlZCA9IHRtcDlfXyA+PiAxICYgMHgxOworCXBEc3QtPm9wZXJhdGluZ0NoYW5NYXggPSB0bXA5X18gPj4gMiAmIDB4NzsKKwlwRHN0LT5ub25PcGVyYXRpbkNoYW5NYXggPSB0bXA5X18gPj4gNSAmIDB4NzsKKwl0bXAxMF9fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09IDE7CisJcERzdC0+TWVhc3VyZW1lbnRQaWxvdCA9IHRtcDEwX18gPj4gMCAmIDB4NzsKKwlwRHN0LT5NZWFzdXJlbWVudFBpbG90RW5hYmxlZCA9IHRtcDEwX18gPj4gMyAmIDB4MTsKKwlwRHN0LT5OZWlnaGJvclRTRk9mZnNldCA9IHRtcDEwX18gPj4gNCAmIDB4MTsKKwlwRHN0LT5SQ1BJTWVhc3VyZW1lbnQgPSB0bXAxMF9fID4+IDUgJiAweDE7CisJcERzdC0+UlNOSU1lYXN1cmVtZW50ID0gdG1wMTBfXyA+PiA2ICYgMHgxOworCXBEc3QtPkJzc0F2Z0FjY2Vzc0RlbGF5ID0gdG1wMTBfXyA+PiA3ICYgMHgxOworCXRtcDExX18gPSAqcEJ1ZjsKKwlwRHN0LT5CU1NBdmFpbEFkbWlzc2lvbiA9IHRtcDExX18gPj4gMCAmIDB4MTsKKwlwRHN0LT5BbnRlbm5hSW5mb3JtYXRpb24gPSB0bXAxMV9fID4+IDEgJiAweDE7CisJcERzdC0+ZmluZV90aW1lX21lYXNfcnB0ID0gdG1wMTFfXyA+PiAyICYgMHgxOworCXBEc3QtPmxjaV9jYXBhYmlsaXR5ID0gdG1wMTFfXyA+PiAzICYgMHgxOworCXBEc3QtPnJlc2VydmVkID0gdG1wMTFfXyA+PiA0ICYgMHhmOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcnJtX2VuYWJsZWRfY2FwLiAqLworCisjZGVmaW5lIFNpZ0llUlJNRW5hYmxlZENhcCAoMHgwMDBmKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcmVxdWVzdGVkX2luZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50OF90IGllbGVuLAorCQkJCQkgdERvdDExZklFUmVxdWVzdGVkSW5mbyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5udW1fcmVxdWVzdGVkX2VpZHMgPSAodWludDhfdCkoaWVsZW4pOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+cmVxdWVzdGVkX2VpZHMsIHBCdWYsIChpZWxlbikpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcmVxdWVzdGVkX2luZm8uICovCisKKyNkZWZpbmUgU2lnSWVSZXF1ZXN0ZWRJbmZvICgweDAwMTApCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9zc2lkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgICAgICB1aW50OF90IGllbGVuLAorCQkJICAgICAgIHREb3QxMWZJRVNTSUQgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bnVtX3NzaWQgPSAodWludDhfdCkoaWVsZW4pOworCWlmIChpZWxlbiA+IDMyKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+c3NpZCwgcEJ1ZiwgKGllbGVuKSk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9zc2lkLiAqLworCisjZGVmaW5lIFNpZ0llU1NJRCAoMHgwMDExKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfc2NoZWR1bGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICB1aW50OF90ICpwQnVmLAorCQkJCSAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgdERvdDExZklFU2NoZWR1bGUgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDE2X3QgdG1wMTJfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmdG1wMTJfXywgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09IDI7CisJcERzdC0+YWdncmVnYXRpb24gPSB0bXAxMl9fID4+IDAgJiAweDE7CisJcERzdC0+dHNpZCA9IHRtcDEyX18gPj4gMSAmIDB4ZjsKKwlwRHN0LT5kaXJlY3Rpb24gPSB0bXAxMl9fID4+IDUgJiAweDM7CisJcERzdC0+cmVzZXJ2ZWQgPSB0bXAxMl9fID4+IDcgJiAweDFmZjsKKwlmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+c2VydmljZV9zdGFydF90aW1lLCBwQnVmLCAwKTsKKwlwQnVmICs9IDQ7CisJaWVsZW4gLT0gKHVpbnQ4X3QpNDsKKwlmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+c2VydmljZV9pbnRlcnZhbCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm1heF9zZXJ2aWNlX2R1ciwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnNwZWNfaW50ZXJ2YWwsIHBCdWYsIDApOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfc2NoZWR1bGUuICovCisKKyNkZWZpbmUgU2lnSWVTY2hlZHVsZSAoMHgwMDEyKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdGNsYXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkgdWludDhfdCBpZWxlbiwKKwkJCQkgdERvdDExZklFVENMQVMgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+dXNlcl9wcmlvcml0eSA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmNsYXNzaWZpZXJfdHlwZSA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmNsYXNzaWZpZXJfbWFzayA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXN3aXRjaCAocERzdC0+Y2xhc3NpZmllcl90eXBlKSB7CisJY2FzZSAwOgorCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgcEJ1ZiwgNik7CisJCXBCdWYgKz0gNjsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpNjsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5pbmZvLkV0aFBhcmFtcy5kZXN0LCBwQnVmLCA2KTsKKwkJcEJ1ZiArPSA2OworCQlpZWxlbiAtPSAodWludDhfdCk2OworCQlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+aW5mby5FdGhQYXJhbXMudHlwZSwgcEJ1ZiwgMCk7CisJCXBCdWYgKz0gMjsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwRHN0LT5pbmZvLklwUGFyYW1zLnZlcnNpb24gPSAqcEJ1ZjsKKwkJcEJ1ZiArPSAxOworCQlpZWxlbiAtPSAodWludDhfdCkxOworCQlzd2l0Y2ggKHBEc3QtPmluZm8uSXBQYXJhbXMudmVyc2lvbikgeworCQljYXNlIDQ6CisJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCBwQnVmLCA0KTsKKwkJCXBCdWYgKz0gNDsKKwkJCWllbGVuIC09ICh1aW50OF90KTQ7CisJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgcEJ1ZiwgNCk7CisJCQlwQnVmICs9IDQ7CisJCQlpZWxlbiAtPSAodWludDhfdCk0OworCQkJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQsIHBCdWYsIDApOworCQkJcEJ1ZiArPSAyOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwkJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydCwgcEJ1ZiwgMCk7CisJCQlwQnVmICs9IDI7CisJCQlpZWxlbiAtPSAodWludDhfdCkyOworCQkJcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQID0gKnBCdWY7CisJCQlwQnVmICs9IDE7CisJCQlpZWxlbiAtPSAodWludDhfdCkxOworCQkJcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90byA9ICpwQnVmOworCQkJcEJ1ZiArPSAxOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJCXBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQgPSAqcEJ1ZjsKKwkJCXBCdWYgKz0gMTsKKwkJCWllbGVuIC09ICh1aW50OF90KTE7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgcEJ1ZiwgMTYpOworCQkJcEJ1ZiArPSAxNjsKKwkJCWllbGVuIC09ICh1aW50OF90KTE2OworCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIHBCdWYsIDE2KTsKKwkJCXBCdWYgKz0gMTY7CisJCQlpZWxlbiAtPSAodWludDhfdCkxNjsKKwkJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0LCBwQnVmLCAwKTsKKwkJCXBCdWYgKz0gMjsKKwkJCWllbGVuIC09ICh1aW50OF90KTI7CisJCQlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQsIHBCdWYsIDApOworCQkJcEJ1ZiArPSAyOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwkJCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCBwQnVmLCAzKTsKKwkJCXBCdWYgKz0gMzsKKwkJCWllbGVuIC09ICh1aW50OF90KTM7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIDI6CisJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgcEJ1ZiwgMCk7CisJCXBCdWYgKz0gMjsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfdGNsYXMuICovCisKKyNkZWZpbmUgU2lnSWVUQ0xBUyAoMHgwMDEzKQorCisKKyNkZWZpbmUgU2lnSWVUQ0xBU1NQUk9DICgweDAwMTQpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV90c19kZWxheSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICB0RG90MTFmSUVUU0RlbGF5ICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCWZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5kZWxheSwgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV90c19kZWxheS4gKi8KKworI2RlZmluZSBTaWdJZVRTRGVsYXkgKDB4MDAxNSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3RzcGVjKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJIHVpbnQ4X3QgaWVsZW4sCisJCQkJIHREb3QxMWZJRVRTUEVDICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQxNl90IHRtcDEzX187CisJdWludDhfdCB0bXAxNF9fOworCXVpbnQxNl90IHRtcDE1X187CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJZnJhbWVzbnRvaHMocEN0eCwgJnRtcDEzX18sIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAyOworCXBEc3QtPnRyYWZmaWNfdHlwZSA9IHRtcDEzX18gPj4gMCAmIDB4MTsKKwlwRHN0LT50c2lkID0gdG1wMTNfXyA+PiAxICYgMHhmOworCXBEc3QtPmRpcmVjdGlvbiA9IHRtcDEzX18gPj4gNSAmIDB4MzsKKwlwRHN0LT5hY2Nlc3NfcG9saWN5ID0gdG1wMTNfXyA+PiA3ICYgMHgzOworCXBEc3QtPmFnZ3JlZ2F0aW9uID0gdG1wMTNfXyA+PiA5ICYgMHgxOworCXBEc3QtPnBzYiA9IHRtcDEzX18gPj4gMTAgJiAweDE7CisJcERzdC0+dXNlcl9wcmlvcml0eSA9IHRtcDEzX18gPj4gMTEgJiAweDc7CisJcERzdC0+dHNpbmZvX2Fja19wb2wgPSB0bXAxM19fID4+IDE0ICYgMHgzOworCXRtcDE0X18gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gMTsKKwlwRHN0LT5zY2hlZHVsZSA9IHRtcDE0X18gPj4gMCAmIDB4MTsKKwlwRHN0LT51bnVzZWQgPSB0bXAxNF9fID4+IDEgJiAweDdmOworCWZyYW1lc250b2hzKHBDdHgsICZ0bXAxNV9fLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gMjsKKwlwRHN0LT5zaXplID0gdG1wMTVfXyA+PiAwICYgMHg3ZmZmOworCXBEc3QtPmZpeGVkID0gdG1wMTVfXyA+PiAxNSAmIDB4MTsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWF4X21zZHVfc2l6ZSwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm1pbl9zZXJ2aWNlX2ludCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm1heF9zZXJ2aWNlX2ludCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmluYWN0aXZpdHlfaW50LCBwQnVmLCAwKTsKKwlwQnVmICs9IDQ7CisJaWVsZW4gLT0gKHVpbnQ4X3QpNDsKKwlmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+c3VzcGVuc2lvbl9pbnQsIHBCdWYsIDApOworCXBCdWYgKz0gNDsKKwlpZWxlbiAtPSAodWludDhfdCk0OworCWZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5zZXJ2aWNlX3N0YXJ0X3RpbWUsIHBCdWYsIDApOworCXBCdWYgKz0gNDsKKwlpZWxlbiAtPSAodWludDhfdCk0OworCWZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5taW5fZGF0YV9yYXRlLCBwQnVmLCAwKTsKKwlwQnVmICs9IDQ7CisJaWVsZW4gLT0gKHVpbnQ4X3QpNDsKKwlmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+bWVhbl9kYXRhX3JhdGUsIHBCdWYsIDApOworCXBCdWYgKz0gNDsKKwlpZWxlbiAtPSAodWludDhfdCk0OworCWZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5wZWFrX2RhdGFfcmF0ZSwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmJ1cnN0X3NpemUsIHBCdWYsIDApOworCXBCdWYgKz0gNDsKKwlpZWxlbiAtPSAodWludDhfdCk0OworCWZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5kZWxheV9ib3VuZCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm1pbl9waHlfcmF0ZSwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnN1cnBsdXNfYndfYWxsb3dhbmNlLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWVkaXVtX3RpbWUsIHBCdWYsIDApOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfdHNwZWMuICovCisKKyNkZWZpbmUgU2lnSWVUU1BFQyAoMHgwMDE2KQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdmh0X2NhcHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50OF90IGllbGVuLAorCQkJCSAgdERvdDExZklFVkhUQ2FwcyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwl1aW50MzJfdCB0bXAxNl9fOworCXVpbnQxNl90IHRtcDE3X187CisJdWludDE2X3QgdG1wMThfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlmcmFtZXNudG9obChwQ3R4LCAmdG1wMTZfXywgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09IDQ7CisJcERzdC0+bWF4TVBEVUxlbiA9IHRtcDE2X18gPj4gMCAmIDB4MzsKKwlwRHN0LT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPSB0bXAxNl9fID4+IDIgJiAweDM7CisJcERzdC0+bGRwY0NvZGluZ0NhcCA9IHRtcDE2X18gPj4gNCAmIDB4MTsKKwlwRHN0LT5zaG9ydEdJODBNSHogPSB0bXAxNl9fID4+IDUgJiAweDE7CisJcERzdC0+c2hvcnRHSTE2MGFuZDgwcGx1czgwTUh6ID0gdG1wMTZfXyA+PiA2ICYgMHgxOworCXBEc3QtPnR4U1RCQyA9IHRtcDE2X18gPj4gNyAmIDB4MTsKKwlwRHN0LT5yeFNUQkMgPSB0bXAxNl9fID4+IDggJiAweDc7CisJcERzdC0+c3VCZWFtRm9ybWVyQ2FwID0gdG1wMTZfXyA+PiAxMSAmIDB4MTsKKwlwRHN0LT5zdUJlYW1mb3JtZWVDYXAgPSB0bXAxNl9fID4+IDEyICYgMHgxOworCXBEc3QtPmNzbm9mQmVhbWZvcm1lckFudFN1cCA9IHRtcDE2X18gPj4gMTMgJiAweDc7CisJcERzdC0+bnVtU291bmRpbmdEaW0gPSB0bXAxNl9fID4+IDE2ICYgMHg3OworCXBEc3QtPm11QmVhbWZvcm1lckNhcCA9IHRtcDE2X18gPj4gMTkgJiAweDE7CisJcERzdC0+bXVCZWFtZm9ybWVlQ2FwID0gdG1wMTZfXyA+PiAyMCAmIDB4MTsKKwlwRHN0LT52aHRUWE9QUFMgPSB0bXAxNl9fID4+IDIxICYgMHgxOworCXBEc3QtPmh0Y1ZIVENhcCA9IHRtcDE2X18gPj4gMjIgJiAweDE7CisJcERzdC0+bWF4QU1QRFVMZW5FeHAgPSB0bXAxNl9fID4+IDIzICYgMHg3OworCXBEc3QtPnZodExpbmtBZGFwdENhcCA9IHRtcDE2X18gPj4gMjYgJiAweDM7CisJcERzdC0+cnhBbnRQYXR0ZXJuID0gdG1wMTZfXyA+PiAyOCAmIDB4MTsKKwlwRHN0LT50eEFudFBhdHRlcm4gPSB0bXAxNl9fID4+IDI5ICYgMHgxOworCXBEc3QtPnJlc2VydmVkMSA9IHRtcDE2X18gPj4gMzAgJiAweDM7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnJ4TUNTTWFwLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmdG1wMTdfXywgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09IDI7CisJcERzdC0+cnhIaWdoU3VwRGF0YVJhdGUgPSB0bXAxN19fID4+IDAgJiAweDFmZmY7CisJcERzdC0+cmVzZXJ2ZWQyID0gdG1wMTdfXyA+PiAxMyAmIDB4NzsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+dHhNQ1NNYXAsIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAodWludDhfdCkyOworCWZyYW1lc250b2hzKHBDdHgsICZ0bXAxOF9fLCBwQnVmLCAwKTsKKwlwRHN0LT50eFN1cERhdGFSYXRlID0gdG1wMThfXyA+PiAwICYgMHgxZmZmOworCXBEc3QtPnJlc2VydmVkMyA9IHRtcDE4X18gPj4gMTMgJiAweDc7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV92aHRfY2Fwcy4gKi8KKworI2RlZmluZSBTaWdJZVZIVENhcHMgKDB4MDAxNykKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3ZodF9vcGVyYXRpb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgICAgdERvdDExZklFVkhUT3BlcmF0aW9uICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPmNoYW5XaWR0aCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmNoYW5DZW50ZXJGcmVxU2VnMSA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmNoYW5DZW50ZXJGcmVxU2VnMiA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5iYXNpY01DU1NldCwgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV92aHRfb3BlcmF0aW9uLiAqLworCisjZGVmaW5lIFNpZ0llVkhUT3BlcmF0aW9uICgweDAwMTgpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93bW1fc2NoZWR1bGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICAgdERvdDExZklFV01NU2NoZWR1bGUgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDE2X3QgdG1wMTlfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT52ZXJzaW9uID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJaWYgKHBEc3QtPnZlcnNpb24gIT0gMHgxKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gc3RhdHVzIHwgRE9UMTFGX0JBRF9GSVhFRF9WQUxVRTsKKwl9CisJZnJhbWVzbnRvaHMocEN0eCwgJnRtcDE5X18sIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAyOworCXBEc3QtPmFnZ3JlZ2F0aW9uID0gdG1wMTlfXyA+PiAwICYgMHgxOworCXBEc3QtPnRzaWQgPSB0bXAxOV9fID4+IDEgJiAweGY7CisJcERzdC0+ZGlyZWN0aW9uID0gdG1wMTlfXyA+PiA1ICYgMHgzOworCXBEc3QtPnJlc2VydmVkID0gdG1wMTlfXyA+PiA3ICYgMHgxZmY7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPnNlcnZpY2Vfc3RhcnRfdGltZSwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPnNlcnZpY2VfaW50ZXJ2YWwsIHBCdWYsIDApOworCXBCdWYgKz0gNDsKKwlpZWxlbiAtPSAodWludDhfdCk0OworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5tYXhfc2VydmljZV9kdXIsIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAodWludDhfdCkyOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5zcGVjX2ludGVydmFsLCBwQnVmLCAwKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3dtbV9zY2hlZHVsZS4gKi8KKworI2RlZmluZSBTaWdJZVdNTVNjaGVkdWxlICgweDAwMTkpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93bW10Y2xhcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICB0RG90MTFmSUVXTU1UQ0xBUyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT52ZXJzaW9uID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJaWYgKHBEc3QtPnZlcnNpb24gIT0gMHgxKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gc3RhdHVzIHwgRE9UMTFGX0JBRF9GSVhFRF9WQUxVRTsKKwl9CisJcERzdC0+dXNlcl9wcmlvcml0eSA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmNsYXNzaWZpZXJfdHlwZSA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmNsYXNzaWZpZXJfbWFzayA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXN3aXRjaCAocERzdC0+Y2xhc3NpZmllcl90eXBlKSB7CisJY2FzZSAwOgorCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgcEJ1ZiwgNik7CisJCXBCdWYgKz0gNjsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpNjsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5pbmZvLkV0aFBhcmFtcy5kZXN0LCBwQnVmLCA2KTsKKwkJcEJ1ZiArPSA2OworCQlpZWxlbiAtPSAodWludDhfdCk2OworCQlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+aW5mby5FdGhQYXJhbXMudHlwZSwgcEJ1ZiwgMCk7CisJCXBCdWYgKz0gMjsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwRHN0LT5pbmZvLklwUGFyYW1zLnZlcnNpb24gPSAqcEJ1ZjsKKwkJcEJ1ZiArPSAxOworCQlpZWxlbiAtPSAodWludDhfdCkxOworCQlzd2l0Y2ggKHBEc3QtPmluZm8uSXBQYXJhbXMudmVyc2lvbikgeworCQljYXNlIDQ6CisJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCBwQnVmLCA0KTsKKwkJCXBCdWYgKz0gNDsKKwkJCWllbGVuIC09ICh1aW50OF90KTQ7CisJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgcEJ1ZiwgNCk7CisJCQlwQnVmICs9IDQ7CisJCQlpZWxlbiAtPSAodWludDhfdCk0OworCQkJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQsIHBCdWYsIDApOworCQkJcEJ1ZiArPSAyOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwkJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydCwgcEJ1ZiwgMCk7CisJCQlwQnVmICs9IDI7CisJCQlpZWxlbiAtPSAodWludDhfdCkyOworCQkJcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQID0gKnBCdWY7CisJCQlwQnVmICs9IDE7CisJCQlpZWxlbiAtPSAodWludDhfdCkxOworCQkJcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90byA9ICpwQnVmOworCQkJcEJ1ZiArPSAxOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJCXBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQgPSAqcEJ1ZjsKKwkJCXBCdWYgKz0gMTsKKwkJCWllbGVuIC09ICh1aW50OF90KTE7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgcEJ1ZiwgMTYpOworCQkJcEJ1ZiArPSAxNjsKKwkJCWllbGVuIC09ICh1aW50OF90KTE2OworCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIHBCdWYsIDE2KTsKKwkJCXBCdWYgKz0gMTY7CisJCQlpZWxlbiAtPSAodWludDhfdCkxNjsKKwkJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0LCBwQnVmLCAwKTsKKwkJCXBCdWYgKz0gMjsKKwkJCWllbGVuIC09ICh1aW50OF90KTI7CisJCQlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQsIHBCdWYsIDApOworCQkJcEJ1ZiArPSAyOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwkJCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCBwQnVmLCAzKTsKKwkJCXBCdWYgKz0gMzsKKwkJCWllbGVuIC09ICh1aW50OF90KTM7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIDI6CisJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgcEJ1ZiwgMCk7CisJCXBCdWYgKz0gMjsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfd21tdGNsYXMuICovCisKKyNkZWZpbmUgU2lnSWVXTU1UQ0xBUyAoMHgwMDFhKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd21tdGNsYXNwcm9jKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICAgIHREb3QxMWZJRVdNTVRDTEFTUFJPQyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT52ZXJzaW9uID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJaWYgKHBEc3QtPnZlcnNpb24gIT0gMHgxKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gc3RhdHVzIHwgRE9UMTFGX0JBRF9GSVhFRF9WQUxVRTsKKwl9CisJcERzdC0+cHJvY2Vzc2luZyA9ICpwQnVmOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfd21tdGNsYXNwcm9jLiAqLworCisjZGVmaW5lIFNpZ0llV01NVENMQVNQUk9DICgweDAwMWIpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93bW10c19kZWxheSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICB0RG90MTFmSUVXTU1UU0RlbGF5ICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPnZlcnNpb24gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlpZiAocERzdC0+dmVyc2lvbiAhPSAweDEpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBzdGF0dXMgfCBET1QxMUZfQkFEX0ZJWEVEX1ZBTFVFOworCX0KKwlmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+ZGVsYXksIHBCdWYsIDApOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfd21tdHNfZGVsYXkuICovCisKKyNkZWZpbmUgU2lnSWVXTU1UU0RlbGF5ICgweDAwMWMpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93bW10c3BlYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICB0RG90MTFmSUVXTU1UU1BFQyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwl1aW50MTZfdCB0bXAyMF9fOworCXVpbnQ4X3QgdG1wMjFfXzsKKwl1aW50MTZfdCB0bXAyMl9fOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPnZlcnNpb24gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlpZiAocERzdC0+dmVyc2lvbiAhPSAweDEpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBzdGF0dXMgfCBET1QxMUZfQkFEX0ZJWEVEX1ZBTFVFOworCX0KKwlmcmFtZXNudG9ocyhwQ3R4LCAmdG1wMjBfXywgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09IDI7CisJcERzdC0+dHJhZmZpY190eXBlID0gdG1wMjBfXyA+PiAwICYgMHgxOworCXBEc3QtPnRzaWQgPSB0bXAyMF9fID4+IDEgJiAweGY7CisJcERzdC0+ZGlyZWN0aW9uID0gdG1wMjBfXyA+PiA1ICYgMHgzOworCXBEc3QtPmFjY2Vzc19wb2xpY3kgPSB0bXAyMF9fID4+IDcgJiAweDM7CisJcERzdC0+YWdncmVnYXRpb24gPSB0bXAyMF9fID4+IDkgJiAweDE7CisJcERzdC0+cHNiID0gdG1wMjBfXyA+PiAxMCAmIDB4MTsKKwlwRHN0LT51c2VyX3ByaW9yaXR5ID0gdG1wMjBfXyA+PiAxMSAmIDB4NzsKKwlwRHN0LT50c2luZm9fYWNrX3BvbCA9IHRtcDIwX18gPj4gMTQgJiAweDM7CisJdG1wMjFfXyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAxOworCXBEc3QtPnRzaW5mb19yc3ZkID0gdG1wMjFfXyA+PiAwICYgMHg3ZjsKKwlwRHN0LT5idXJzdF9zaXplX2RlZm4gPSB0bXAyMV9fID4+IDcgJiAweDE7CisJZnJhbWVzbnRvaHMocEN0eCwgJnRtcDIyX18sIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAyOworCXBEc3QtPnNpemUgPSB0bXAyMl9fID4+IDAgJiAweDdmZmY7CisJcERzdC0+Zml4ZWQgPSB0bXAyMl9fID4+IDE1ICYgMHgxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5tYXhfbXNkdV9zaXplLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwlmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+bWluX3NlcnZpY2VfaW50LCBwQnVmLCAwKTsKKwlwQnVmICs9IDQ7CisJaWVsZW4gLT0gKHVpbnQ4X3QpNDsKKwlmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+bWF4X3NlcnZpY2VfaW50LCBwQnVmLCAwKTsKKwlwQnVmICs9IDQ7CisJaWVsZW4gLT0gKHVpbnQ4X3QpNDsKKwlmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+aW5hY3Rpdml0eV9pbnQsIHBCdWYsIDApOworCXBCdWYgKz0gNDsKKwlpZWxlbiAtPSAodWludDhfdCk0OworCWZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5zdXNwZW5zaW9uX2ludCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPnNlcnZpY2Vfc3RhcnRfdGltZSwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm1pbl9kYXRhX3JhdGUsIHBCdWYsIDApOworCXBCdWYgKz0gNDsKKwlpZWxlbiAtPSAodWludDhfdCk0OworCWZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5tZWFuX2RhdGFfcmF0ZSwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPnBlYWtfZGF0YV9yYXRlLCBwQnVmLCAwKTsKKwlwQnVmICs9IDQ7CisJaWVsZW4gLT0gKHVpbnQ4X3QpNDsKKwlmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+YnVyc3Rfc2l6ZSwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmRlbGF5X2JvdW5kLCBwQnVmLCAwKTsKKwlwQnVmICs9IDQ7CisJaWVsZW4gLT0gKHVpbnQ4X3QpNDsKKwlmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+bWluX3BoeV9yYXRlLCBwQnVmLCAwKTsKKwlwQnVmICs9IDQ7CisJaWVsZW4gLT0gKHVpbnQ4X3QpNDsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+c3VycGx1c19id19hbGxvd2FuY2UsIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAodWludDhfdCkyOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5tZWRpdW1fdGltZSwgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93bW10c3BlYy4gKi8KKworI2RlZmluZSBTaWdJZVdNTVRTUEVDICgweDAwMWQpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93aWRlcl9id19jaGFuX3N3aXRjaF9hbm4odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICAgICB1aW50OF90IGllbGVuLAorCQkJCQkgICAgICAgdERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4gKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bmV3Q2hhbldpZHRoID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+bmV3Q2VudGVyQ2hhbkZyZXEwID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+bmV3Q2VudGVyQ2hhbkZyZXExID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93aWRlcl9id19jaGFuX3N3aXRjaF9hbm4uICovCisKKyNkZWZpbmUgU2lnSWVXaWRlckJXQ2hhblN3aXRjaEFubiAoMHgwMDFlKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfYWlkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICAgdWludDhfdCBpZWxlbiwKKwkJCSAgICAgIHREb3QxMWZJRUFJRCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YXNzb2NJZCwgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9haWQuICovCisKKyNkZWZpbmUgU2lnSWVBSUQgKDB4MDAxZikKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2NmX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICB0RG90MTFmSUVDRlBhcmFtcyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5jZnBfY291bnQgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlwRHN0LT5jZnBfcGVyaW9kID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmNmcF9tYXhkdXJhdGlvbiwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmNmcF9kdXJyZW1haW5pbmcsIHBCdWYsIDApOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfY2ZfcGFyYW1zLiAqLworCisjZGVmaW5lIFNpZ0llQ0ZQYXJhbXMgKDB4MDAyMCkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2NoYWxsZW5nZV90ZXh0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkgdWludDhfdCBpZWxlbiwKKwkJCQkJIHREb3QxMWZJRUNoYWxsZW5nZVRleHQgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bnVtX3RleHQgPSAodWludDhfdCkoaWVsZW4pOworCWlmIChpZWxlbiA+IDI1MykgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnRleHQsIHBCdWYsIChpZWxlbikpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfY2hhbGxlbmdlX3RleHQuICovCisKKyNkZWZpbmUgU2lnSWVDaGFsbGVuZ2VUZXh0ICgweDAwMjEpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9jaGFuX3N3aXRjaF9hbm4odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50OF90IGllbGVuLAorCQkJCQkgdERvdDExZklFQ2hhblN3aXRjaEFubiAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5zd2l0Y2hNb2RlID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+bmV3Q2hhbm5lbCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPnN3aXRjaENvdW50ID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9jaGFuX3N3aXRjaF9hbm4uICovCisKKyNkZWZpbmUgU2lnSWVDaGFuU3dpdGNoQW5uICgweDAwMjIpCisKKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0NoYW5uZWxTd2l0Y2hXcmFwcGVyW10gPSB7CisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfQ2hhbm5lbFN3aXRjaFdyYXBwZXJbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRUNoYW5uZWxTd2l0Y2hXcmFwcGVyLCBXaWRlckJXQ2hhblN3aXRjaEFubiksCisJb2Zmc2V0b2YodERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4sIHByZXNlbnQpLCAwLAorCSJXaWRlckJXQ2hhblN3aXRjaEFubiIsIDAsIDUsIDUsIFNpZ0llV2lkZXJCV0NoYW5Td2l0Y2hBbm4sCisJezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1dJREVSQldDSEFOU1dJVENIQU5OLCAwLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sCit9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2NoYW5uZWxfc3dpdGNoX3dyYXBwZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICAgICB1aW50OF90IGllbGVuLAorCQkJCQkgICAgICAgdERvdDExZklFQ2hhbm5lbFN3aXRjaFdyYXBwZXIgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJKHZvaWQpcEN0eDsKKwlzdGF0dXMgfD0gdW5wYWNrX2NvcmUocEN0eCwKKwkJCQlwQnVmLAorCQkJCWllbGVuLAorCQkJCUZGU19DaGFubmVsU3dpdGNoV3JhcHBlciwKKwkJCQlJRVNfQ2hhbm5lbFN3aXRjaFdyYXBwZXIsCisJCQkJKHVpbnQ4X3QgKilwRHN0LAorCQkJCXNpemVvZigqcERzdCkpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX2NoYW5uZWxfc3dpdGNoX3dyYXBwZXIuICovCisKKyNkZWZpbmUgU2lnSWVDaGFubmVsU3dpdGNoV3JhcHBlciAoMHgwMDIzKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfY291bnRyeSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICB0RG90MTFmSUVDb3VudHJ5ICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+Y291bnRyeSwgcEJ1ZiwgMyk7CisJcEJ1ZiArPSAzOworCWllbGVuIC09ICh1aW50OF90KTM7CisJaWYgKCFpZWxlbikgeworCQlwRHN0LT5udW1fdHJpcGxldHMgPSAwVTsKKwkJcmV0dXJuIDBVOworCX0gZWxzZSB7CisJCXBEc3QtPm51bV90cmlwbGV0cyA9ICh1aW50OF90KShpZWxlbiAvIDMpOworCQlpZiAoaWVsZW4gPiA4NCAqIDMpIHsKKwkJCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCQl9CisKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT50cmlwbGV0cywgcEJ1ZiwgKGllbGVuKSk7CisJfQorCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfY291bnRyeS4gKi8KKworI2RlZmluZSBTaWdJZUNvdW50cnkgKDB4MDAyNCkKKworCisjZGVmaW5lIFNpZ0llRFNQYXJhbXMgKDB4MDAyNSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2VkY2FfcGFyYW1fc2V0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICAgIHREb3QxMWZJRUVEQ0FQYXJhbVNldCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwl1aW50OF90IHRtcDIzX187CisJdWludDhfdCB0bXAyNF9fOworCXVpbnQ4X3QgdG1wMjVfXzsKKwl1aW50OF90IHRtcDI2X187CisJdWludDhfdCB0bXAyN19fOworCXVpbnQ4X3QgdG1wMjhfXzsKKwl1aW50OF90IHRtcDI5X187CisJdWludDhfdCB0bXAzMF9fOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPnFvcyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPnJlc2VydmVkID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJdG1wMjNfXyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAxOworCXBEc3QtPmFjYmVfYWlmc24gPSB0bXAyM19fID4+IDAgJiAweGY7CisJcERzdC0+YWNiZV9hY20gPSB0bXAyM19fID4+IDQgJiAweDE7CisJcERzdC0+YWNiZV9hY2kgPSB0bXAyM19fID4+IDUgJiAweDM7CisJcERzdC0+dW51c2VkMSA9IHRtcDIzX18gPj4gNyAmIDB4MTsKKwl0bXAyNF9fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09IDE7CisJcERzdC0+YWNiZV9hY3dtaW4gPSB0bXAyNF9fID4+IDAgJiAweGY7CisJcERzdC0+YWNiZV9hY3dtYXggPSB0bXAyNF9fID4+IDQgJiAweGY7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmFjYmVfdHhvcGxpbWl0LCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwl0bXAyNV9fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09IDE7CisJcERzdC0+YWNia19haWZzbiA9IHRtcDI1X18gPj4gMCAmIDB4ZjsKKwlwRHN0LT5hY2JrX2FjbSA9IHRtcDI1X18gPj4gNCAmIDB4MTsKKwlwRHN0LT5hY2JrX2FjaSA9IHRtcDI1X18gPj4gNSAmIDB4MzsKKwlwRHN0LT51bnVzZWQyID0gdG1wMjVfXyA+PiA3ICYgMHgxOworCXRtcDI2X18gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gMTsKKwlwRHN0LT5hY2JrX2Fjd21pbiA9IHRtcDI2X18gPj4gMCAmIDB4ZjsKKwlwRHN0LT5hY2JrX2Fjd21heCA9IHRtcDI2X18gPj4gNCAmIDB4ZjsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YWNia190eG9wbGltaXQsIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAodWludDhfdCkyOworCXRtcDI3X18gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gMTsKKwlwRHN0LT5hY3ZpX2FpZnNuID0gdG1wMjdfXyA+PiAwICYgMHhmOworCXBEc3QtPmFjdmlfYWNtID0gdG1wMjdfXyA+PiA0ICYgMHgxOworCXBEc3QtPmFjdmlfYWNpID0gdG1wMjdfXyA+PiA1ICYgMHgzOworCXBEc3QtPnVudXNlZDMgPSB0bXAyN19fID4+IDcgJiAweDE7CisJdG1wMjhfXyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAxOworCXBEc3QtPmFjdmlfYWN3bWluID0gdG1wMjhfXyA+PiAwICYgMHhmOworCXBEc3QtPmFjdmlfYWN3bWF4ID0gdG1wMjhfXyA+PiA0ICYgMHhmOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5hY3ZpX3R4b3BsaW1pdCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJdG1wMjlfXyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAxOworCXBEc3QtPmFjdm9fYWlmc24gPSB0bXAyOV9fID4+IDAgJiAweGY7CisJcERzdC0+YWN2b19hY20gPSB0bXAyOV9fID4+IDQgJiAweDE7CisJcERzdC0+YWN2b19hY2kgPSB0bXAyOV9fID4+IDUgJiAweDM7CisJcERzdC0+dW51c2VkNCA9IHRtcDI5X18gPj4gNyAmIDB4MTsKKwl0bXAzMF9fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09IDE7CisJcERzdC0+YWN2b19hY3dtaW4gPSB0bXAzMF9fID4+IDAgJiAweGY7CisJcERzdC0+YWN2b19hY3dtYXggPSB0bXAzMF9fID4+IDQgJiAweGY7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmFjdm9fdHhvcGxpbWl0LCBwQnVmLCAwKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX2VkY2FfcGFyYW1fc2V0LiAqLworCisjZGVmaW5lIFNpZ0llRURDQVBhcmFtU2V0ICgweDAwMjYpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9lcnBfaW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICB0RG90MTFmSUVFUlBJbmZvICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQ4X3QgdG1wMzFfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwl0bXAzMV9fID0gKnBCdWY7CisJcERzdC0+bm9uX2VycF9wcmVzZW50ID0gdG1wMzFfXyA+PiAwICYgMHgxOworCXBEc3QtPnVzZV9wcm90ID0gdG1wMzFfXyA+PiAxICYgMHgxOworCXBEc3QtPmJhcmtlcl9wcmVhbWJsZSA9IHRtcDMxX18gPj4gMiAmIDB4MTsKKwlwRHN0LT51bnVzZWQgPSB0bXAzMV9fID4+IDMgJiAweDFmOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfZXJwX2luZm8uICovCisKKyNkZWZpbmUgU2lnSWVFUlBJbmZvICgweDAwMjcpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9lc2VfY2NrbV9vcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50OF90IGllbGVuLAorCQkJCQkgdERvdDExZklFRVNFQ2NrbU9wYXF1ZSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5udW1fZGF0YSA9ICh1aW50OF90KShpZWxlbik7CisJaWYgKGllbGVuID4gMjApIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5kYXRhLCBwQnVmLCAoaWVsZW4pKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX2VzZV9jY2ttX29wYXF1ZS4gKi8KKworI2RlZmluZSBTaWdJZUVTRUNja21PcGFxdWUgKDB4MDAyOCkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2VzZV9yYWRfbWdtdF9jYXAodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50OF90IGllbGVuLAorCQkJCQkgdERvdDExZklFRVNFUmFkTWdtdENhcCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwl1aW50OF90IHRtcDMyX187CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bWdtdF9zdGF0ZSA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXRtcDMyX18gPSAqcEJ1ZjsKKwlwRHN0LT5tYnNzaWRfbWFzayA9IHRtcDMyX18gPj4gMCAmIDB4NzsKKwlwRHN0LT5yZXNlcnZlZCA9IHRtcDMyX18gPj4gMyAmIDB4MWY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9lc2VfcmFkX21nbXRfY2FwLiAqLworCisjZGVmaW5lIFNpZ0llRVNFUmFkTWdtdENhcCAoMHgwMDI5KQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfZXNlX3RyYWZfc3RybV9tZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50OF90IGllbGVuLAorCQkJCQkgdERvdDExZklFRVNFVHJhZlN0cm1NZXQgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+dHNpZCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPnN0YXRlID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm1zbXRfaW50ZXJ2YWwsIHBCdWYsIDApOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfZXNlX3RyYWZfc3RybV9tZXQuICovCisKKyNkZWZpbmUgU2lnSWVFU0VUcmFmU3RybU1ldCAoMHgwMDJhKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfZXNlX3RyYWZfc3RybV9yYXRlX3NldCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkJICAgICB0RG90MTFmSUVFU0VUcmFmU3RybVJhdGVTZXQgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+dHNpZCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPm51bV90c3JhdGVzID0gKHVpbnQ4X3QpKGllbGVuKTsKKwlpZiAoaWVsZW4gPiA4KSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+dHNyYXRlcywgcEJ1ZiwgKGllbGVuKSk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9lc2VfdHJhZl9zdHJtX3JhdGVfc2V0LiAqLworCisjZGVmaW5lIFNpZ0llRVNFVHJhZlN0cm1SYXRlU2V0ICgweDAwMmIpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9lc2VfdHhtaXRfcG93ZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50OF90IGllbGVuLAorCQkJCQkgdERvdDExZklFRVNFVHhtaXRQb3dlciAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5wb3dlcl9saW1pdCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPnJlc2VydmVkID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9lc2VfdHhtaXRfcG93ZXIuICovCisKKyNkZWZpbmUgU2lnSWVFU0VUeG1pdFBvd2VyICgweDAwMmMpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9lc2VfdmVyc2lvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICB0RG90MTFmSUVFU0VWZXJzaW9uICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPnZlcnNpb24gPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX2VzZV92ZXJzaW9uLiAqLworCisjZGVmaW5lIFNpZ0llRVNFVmVyc2lvbiAoMHgwMDJkKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfZXh0X2NhcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCSB1aW50OF90IGllbGVuLAorCQkJCSB0RG90MTFmSUVFeHRDYXAgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisKKwlpZiAoIWllbGVuKSAvKiBDaGVjayB0byBlbnN1cmUgY29weWluZyBvZiBpZWxlbiBieXRlcyAqLworCQlnb3RvIGVuZFVucGFja0llRXh0Q2FwOworCXBEc3QtPm51bV9ieXRlcyA9ICh1aW50OF90KShpZWxlbik7CisJaWYgKGllbGVuID4gOSkgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmJ5dGVzLCBwQnVmLCAoaWVsZW4pKTsKKworZW5kVW5wYWNrSWVFeHRDYXA6CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9leHRfY2FwLiAqLworCisjZGVmaW5lIFNpZ0llRXh0Q2FwICgweDAwMmUpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9leHRfc3VwcF9yYXRlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB1aW50OF90IGllbGVuLAorCQkJCSAgICAgICB0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKnBEc3QpCit7CisJdWludDhfdCBpOworCXVpbnQ4X3QgcmF0ZV9pbmR4ID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgaWVsZW47IGkrKykgeworCQlpZiAoKERPVDExRl9JU19CR19SQVRFKHBCdWZbaV0gJiAweDdGKSkgJiYKKwkJCShyYXRlX2luZHggPCAxMikpIHsKKwkJCXBEc3QtPnJhdGVzW3JhdGVfaW5keCsrXSA9IHBCdWZbaV07CisJCX0KKwl9CisKKwlpZiAocmF0ZV9pbmR4ID09IDApIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJcERzdC0+bnVtX3JhdGVzID0gcmF0ZV9pbmR4OworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfZXh0X3N1cHBfcmF0ZXMuICovCisKKyNkZWZpbmUgU2lnSWVFeHRTdXBwUmF0ZXMgKDB4MDAyZikKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2ZoX3BhcmFtX3NldCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICB0RG90MTFmSUVGSFBhcmFtU2V0ICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5kd2VsbF90aW1lLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwlwRHN0LT5ob3Bfc2V0ID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+aG9wX3BhdHRlcm4gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlwRHN0LT5ob3BfaW5kZXggPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX2ZoX3BhcmFtX3NldC4gKi8KKworI2RlZmluZSBTaWdJZUZIUGFyYW1TZXQgKDB4MDAzMCkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2ZoX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICB0RG90MTFmSUVGSFBhcmFtcyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5yYWRpeCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPm5jaGFubmVscyA9ICpwQnVmOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfZmhfcGFyYW1zLiAqLworCisjZGVmaW5lIFNpZ0llRkhQYXJhbXMgKDB4MDAzMSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2ZoX3BhdHRfdGFibGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICAgdERvdDExZklFRkhQYXR0VGFibGUgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+ZmxhZyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPm5zZXRzID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+bW9kdWx1cyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPm9mZnNldCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPm51bV9yYW5kdGFibGUgPSAodWludDhfdCkoaWVsZW4pOworCWlmIChpZWxlbiA+IDI1MSkgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnJhbmR0YWJsZSwgcEJ1ZiwgKGllbGVuKSk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9maF9wYXR0X3RhYmxlLiAqLworCisjZGVmaW5lIFNpZ0llRkhQYXR0VGFibGUgKDB4MDAzMikKKworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfRlRJbmZvW10gPSB7CisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfRlRJbmZvW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sIFIxS0hfSUQpLCBvZmZzZXRvZih0RG90MTFmSUVSMUtIX0lELCBwcmVzZW50KSwKKwkwLCAiUjFLSF9JRCIsIDAsIDgsIDgsIFNpZ0llUjFLSF9JRCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUjFLSF9JRCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRUZUSW5mbywgR1RLKSwgb2Zmc2V0b2YodERvdDExZklFR1RLLCBwcmVzZW50KSwgMCwgIkdUSyIsCisJMCwgMTgsIDQ1LCBTaWdJZUdUSywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0dUSywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRUZUSW5mbywgUjBLSF9JRCksIG9mZnNldG9mKHREb3QxMWZJRVIwS0hfSUQsIHByZXNlbnQpLAorCTAsICJSMEtIX0lEIiwgMCwgMywgNTAsIFNpZ0llUjBLSF9JRCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUjBLSF9JRCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRUZUSW5mbywgSUdUSyksIG9mZnNldG9mKHREb3QxMWZJRUlHVEssIHByZXNlbnQpLCAwLAorCSJJR1RLIiwgMCwgMzUsIDM1LCBTaWdJZUlHVEssIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9JR1RLLCAwLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sCit9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2Z0X2luZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkgdWludDhfdCBpZWxlbiwKKwkJCQkgdERvdDExZklFRlRJbmZvICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQxNl90IHRtcDMzX187CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJZnJhbWVzbnRvaHMocEN0eCwgJnRtcDMzX18sIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAyOworCXBEc3QtPnJlc2VydmVkID0gdG1wMzNfXyA+PiAwICYgMHhmZjsKKwlwRHN0LT5JRUNvdW50ID0gdG1wMzNfXyA+PiA4ICYgMHhmZjsKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPk1JQywgcEJ1ZiwgMTYpOworCXBCdWYgKz0gMTY7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTY7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5Bbm9uY2UsIHBCdWYsIDMyKTsKKwlwQnVmICs9IDMyOworCWllbGVuIC09ICh1aW50OF90KTMyOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+U25vbmNlLCBwQnVmLCAzMik7CisJcEJ1ZiArPSAzMjsKKwlpZWxlbiAtPSAodWludDhfdCkzMjsKKwkodm9pZClwQ3R4OworCXN0YXR1cyB8PSB1bnBhY2tfY29yZShwQ3R4LAorCQkJCXBCdWYsCisJCQkJaWVsZW4sCisJCQkJRkZTX0ZUSW5mbywKKwkJCQlJRVNfRlRJbmZvLAorCQkJCSh1aW50OF90ICopcERzdCwKKwkJCQlzaXplb2YoKnBEc3QpKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9mdF9pbmZvLiAqLworCisjZGVmaW5lIFNpZ0llRlRJbmZvICgweDAwMzMpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9odF9jYXBzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJIHVpbnQ4X3QgaWVsZW4sCisJCQkJIHREb3QxMWZJRUhUQ2FwcyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwl1aW50MTZfdCB0bXAzNF9fOworCXVpbnQ4X3QgdG1wMzVfXzsKKwl1aW50MTZfdCB0bXAzNl9fOworCXVpbnQzMl90IHRtcDM3X187CisJdWludDhfdCB0bXAzOF9fOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCWZyYW1lc250b2hzKHBDdHgsICZ0bXAzNF9fLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gMjsKKwlwRHN0LT5hZHZDb2RpbmdDYXAgPSB0bXAzNF9fID4+IDAgJiAweDE7CisJcERzdC0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0gdG1wMzRfXyA+PiAxICYgMHgxOworCXBEc3QtPm1pbW9Qb3dlclNhdmUgPSB0bXAzNF9fID4+IDIgJiAweDM7CisJcERzdC0+Z3JlZW5GaWVsZCA9IHRtcDM0X18gPj4gNCAmIDB4MTsKKwlwRHN0LT5zaG9ydEdJMjBNSHogPSB0bXAzNF9fID4+IDUgJiAweDE7CisJcERzdC0+c2hvcnRHSTQwTUh6ID0gdG1wMzRfXyA+PiA2ICYgMHgxOworCXBEc3QtPnR4U1RCQyA9IHRtcDM0X18gPj4gNyAmIDB4MTsKKwlwRHN0LT5yeFNUQkMgPSB0bXAzNF9fID4+IDggJiAweDM7CisJcERzdC0+ZGVsYXllZEJBID0gdG1wMzRfXyA+PiAxMCAmIDB4MTsKKwlwRHN0LT5tYXhpbWFsQU1TRFVzaXplID0gdG1wMzRfXyA+PiAxMSAmIDB4MTsKKwlwRHN0LT5kc3NzQ2NrTW9kZTQwTUh6ID0gdG1wMzRfXyA+PiAxMiAmIDB4MTsKKwlwRHN0LT5wc21wID0gdG1wMzRfXyA+PiAxMyAmIDB4MTsKKwlwRHN0LT5zdGJjQ29udHJvbEZyYW1lID0gdG1wMzRfXyA+PiAxNCAmIDB4MTsKKwlwRHN0LT5sc2lnVFhPUFByb3RlY3Rpb24gPSB0bXAzNF9fID4+IDE1ICYgMHgxOworCXRtcDM1X18gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gMTsKKwlwRHN0LT5tYXhSeEFNUERVRmFjdG9yID0gdG1wMzVfXyA+PiAwICYgMHgzOworCXBEc3QtPm1wZHVEZW5zaXR5ID0gdG1wMzVfXyA+PiAyICYgMHg3OworCXBEc3QtPnJlc2VydmVkMSA9IHRtcDM1X18gPj4gNSAmIDB4NzsKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnN1cHBvcnRlZE1DU1NldCwgcEJ1ZiwgMTYpOworCXBCdWYgKz0gMTY7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTY7CisJZnJhbWVzbnRvaHMocEN0eCwgJnRtcDM2X18sIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAyOworCXBEc3QtPnBjbyA9IHRtcDM2X18gPj4gMCAmIDB4MTsKKwlwRHN0LT50cmFuc2l0aW9uVGltZSA9IHRtcDM2X18gPj4gMSAmIDB4MzsKKwlwRHN0LT5yZXNlcnZlZDIgPSB0bXAzNl9fID4+IDMgJiAweDFmOworCXBEc3QtPm1jc0ZlZWRiYWNrID0gdG1wMzZfXyA+PiA4ICYgMHgzOworCXBEc3QtPnJlc2VydmVkMyA9IHRtcDM2X18gPj4gMTAgJiAweDNmOworCWZyYW1lc250b2hsKHBDdHgsICZ0bXAzN19fLCBwQnVmLCAwKTsKKwlwQnVmICs9IDQ7CisJaWVsZW4gLT0gNDsKKwlwRHN0LT50eEJGID0gdG1wMzdfXyA+PiAwICYgMHgxOworCXBEc3QtPnJ4U3RhZ2dlcmVkU291bmRpbmcgPSB0bXAzN19fID4+IDEgJiAweDE7CisJcERzdC0+dHhTdGFnZ2VyZWRTb3VuZGluZyA9IHRtcDM3X18gPj4gMiAmIDB4MTsKKwlwRHN0LT5yeFpMRiA9IHRtcDM3X18gPj4gMyAmIDB4MTsKKwlwRHN0LT50eFpMRiA9IHRtcDM3X18gPj4gNCAmIDB4MTsKKwlwRHN0LT5pbXBsaWNpdFR4QkYgPSB0bXAzN19fID4+IDUgJiAweDE7CisJcERzdC0+Y2FsaWJyYXRpb24gPSB0bXAzN19fID4+IDYgJiAweDM7CisJcERzdC0+ZXhwbGljaXRDU0lUeEJGID0gdG1wMzdfXyA+PiA4ICYgMHgxOworCXBEc3QtPmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggPSB0bXAzN19fID4+IDkgJiAweDE7CisJcERzdC0+ZXhwbGljaXRCRkNTSUZlZWRiYWNrID0gdG1wMzdfXyA+PiAxMCAmIDB4NzsKKwlwRHN0LT5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgPSB0bXAzN19fID4+IDEzICYgMHg3OworCXBEc3QtPmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgPSB0bXAzN19fID4+IDE2ICYgMHg3OworCXBEc3QtPmNzaU51bUJGQW50ZW5uYWUgPSB0bXAzN19fID4+IDE5ICYgMHgzOworCXBEc3QtPnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSA9IHRtcDM3X18gPj4gMjEgJiAweDM7CisJcERzdC0+Y29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSA9IHRtcDM3X18gPj4gMjMgJiAweDM7CisJcERzdC0+cmVzZXJ2ZWQ0ID0gdG1wMzdfXyA+PiAyNSAmIDB4N2Y7CisJdG1wMzhfXyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAxOworCXBEc3QtPmFudGVubmFTZWxlY3Rpb24gPSB0bXAzOF9fID4+IDAgJiAweDE7CisJcERzdC0+ZXhwbGljaXRDU0lGZWVkYmFja1R4ID0gdG1wMzhfXyA+PiAxICYgMHgxOworCXBEc3QtPmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCA9IHRtcDM4X18gPj4gMiAmIDB4MTsKKwlwRHN0LT5leHBsaWNpdENTSUZlZWRiYWNrID0gdG1wMzhfXyA+PiAzICYgMHgxOworCXBEc3QtPmFudGVubmFJbmRpY2VzRmVlZGJhY2sgPSB0bXAzOF9fID4+IDQgJiAweDE7CisJcERzdC0+cnhBUyA9IHRtcDM4X18gPj4gNSAmIDB4MTsKKwlwRHN0LT50eFNvdW5kaW5nUFBEVXMgPSB0bXAzOF9fID4+IDYgJiAweDE7CisJcERzdC0+cmVzZXJ2ZWQ1ID0gdG1wMzhfXyA+PiA3ICYgMHgxOworCXBEc3QtPm51bV9yc3ZkID0gKHVpbnQ4X3QpKGllbGVuKTsKKwlpZiAoaWVsZW4gPiAzMikgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnJzdmQsIHBCdWYsIChpZWxlbikpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfaHRfY2Fwcy4gKi8KKworI2RlZmluZSBTaWdJZUhUQ2FwcyAoMHgwMDM0KQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfaHRfaW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCSB1aW50OF90IGllbGVuLAorCQkJCSB0RG90MTFmSUVIVEluZm8gKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDhfdCB0bXAzOV9fOworCXVpbnQxNl90IHRtcDQwX187CisJdWludDE2X3QgdG1wNDFfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5wcmltYXJ5Q2hhbm5lbCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXRtcDM5X18gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gMTsKKwlwRHN0LT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gdG1wMzlfXyA+PiAwICYgMHgzOworCXBEc3QtPnJlY29tbWVuZGVkVHhXaWR0aFNldCA9IHRtcDM5X18gPj4gMiAmIDB4MTsKKwlwRHN0LT5yaWZzTW9kZSA9IHRtcDM5X18gPj4gMyAmIDB4MTsKKwlwRHN0LT5jb250cm9sbGVkQWNjZXNzT25seSA9IHRtcDM5X18gPj4gNCAmIDB4MTsKKwlwRHN0LT5zZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSA9IHRtcDM5X18gPj4gNSAmIDB4NzsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmdG1wNDBfXywgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09IDI7CisJcERzdC0+b3BNb2RlID0gdG1wNDBfXyA+PiAwICYgMHgzOworCXBEc3QtPm5vbkdGRGV2aWNlc1ByZXNlbnQgPSB0bXA0MF9fID4+IDIgJiAweDE7CisJcERzdC0+dHJhbnNtaXRCdXJzdExpbWl0ID0gdG1wNDBfXyA+PiAzICYgMHgxOworCXBEc3QtPm9ic3NOb25IVFN0YVByZXNlbnQgPSB0bXA0MF9fID4+IDQgJiAweDE7CisJcERzdC0+cmVzZXJ2ZWQgPSB0bXA0MF9fID4+IDUgJiAweDdmZjsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmdG1wNDFfXywgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09IDI7CisJcERzdC0+YmFzaWNTVEJDTUNTID0gdG1wNDFfXyA+PiAwICYgMHg3ZjsKKwlwRHN0LT5kdWFsQ1RTUHJvdGVjdGlvbiA9IHRtcDQxX18gPj4gNyAmIDB4MTsKKwlwRHN0LT5zZWNvbmRhcnlCZWFjb24gPSB0bXA0MV9fID4+IDggJiAweDE7CisJcERzdC0+bHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSB0bXA0MV9fID4+IDkgJiAweDE7CisJcERzdC0+cGNvQWN0aXZlID0gdG1wNDFfXyA+PiAxMCAmIDB4MTsKKwlwRHN0LT5wY29QaGFzZSA9IHRtcDQxX18gPj4gMTEgJiAweDE7CisJcERzdC0+cmVzZXJ2ZWQyID0gdG1wNDFfXyA+PiAxMiAmIDB4ZjsKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmJhc2ljTUNTU2V0LCBwQnVmLCAxNik7CisJcEJ1ZiArPSAxNjsKKwlpZWxlbiAtPSAodWludDhfdCkxNjsKKwlwRHN0LT5udW1fcnN2ZCA9ICh1aW50OF90KShpZWxlbik7CisJaWYgKGllbGVuID4gMzIpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5yc3ZkLCBwQnVmLCAoaWVsZW4pKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX2h0X2luZm8uICovCisKKyNkZWZpbmUgU2lnSWVIVEluZm8gKDB4MDAzNSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2lic3NfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgIHREb3QxMWZJRUlCU1NQYXJhbXMgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmF0aW0sIHBCdWYsIDApOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfaWJzc19wYXJhbXMuICovCisKKyNkZWZpbmUgU2lnSWVJQlNTUGFyYW1zICgweDAwMzYpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9saW5rX2lkZW50aWZpZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50OF90IGllbGVuLAorCQkJCQkgdERvdDExZklFTGlua0lkZW50aWZpZXIgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5ic3NpZCwgcEJ1ZiwgNik7CisJcEJ1ZiArPSA2OworCWllbGVuIC09ICh1aW50OF90KTY7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5Jbml0U3RhQWRkciwgcEJ1ZiwgNik7CisJcEJ1ZiArPSA2OworCWllbGVuIC09ICh1aW50OF90KTY7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5SZXNwU3RhQWRkciwgcEJ1ZiwgNik7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9saW5rX2lkZW50aWZpZXIuICovCisKKyNkZWZpbmUgU2lnSWVMaW5rSWRlbnRpZmllciAoMHgwMDM3KQorCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19yZXBvcnRCZWFjb25bXSA9IHsKKwl7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19yZXBvcnRCZWFjb25bXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0LAorCXJlcG9ydC5CZWFjb24uQmVhY29uUmVwb3J0RnJtQm9keSksCisJb2Zmc2V0b2YodERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSwgcHJlc2VudCksIDAsICJCZWFjb25SZXBvcnRGcm1Cb2R5IiwKKwkwLCAyLCAyMjYsIFNpZ0llQmVhY29uUmVwb3J0RnJtQm9keSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfQkVBQ09OUkVQT1JURlJNQk9EWSwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LAorfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9tZWFzdXJlbWVudF9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICB1aW50OF90IGllbGVuLAorCQkJCQkgICAgdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDhfdCB0bXA0Ml9fOworCXVpbnQ4X3QgdG1wNDNfXzsKKwl1aW50OF90IHRtcDQ0X187CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+dG9rZW4gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwl0bXA0Ml9fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09IDE7CisJcERzdC0+bGF0ZSA9IHRtcDQyX18gPj4gMCAmIDB4MTsKKwlwRHN0LT5pbmNhcGFibGUgPSB0bXA0Ml9fID4+IDEgJiAweDE7CisJcERzdC0+cmVmdXNlZCA9IHRtcDQyX18gPj4gMiAmIDB4MTsKKwlwRHN0LT51bnVzZWQgPSB0bXA0Ml9fID4+IDMgJiAweDFmOworCXBEc3QtPnR5cGUgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlpZiAoIWllbGVuKSB7CisJCXJldHVybiAwVTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHBEc3QtPnR5cGUpIHsKKwkJY2FzZSAwOgorCQkJcERzdC0+cmVwb3J0LkJhc2ljLmNoYW5uZWwgPSAqcEJ1ZjsKKwkJCXBCdWYgKz0gMTsKKwkJCWllbGVuIC09ICh1aW50OF90KTE7CisJCQlmcmFtZXNudG9ocShwQ3R4LCAmcERzdC0+cmVwb3J0LkJhc2ljLm1lYXNfc3RhcnRfdGltZSwgcEJ1ZiwgMCk7CisJCQlwQnVmICs9IDg7CisJCQlpZWxlbiAtPSAodWludDhfdCk4OworCQkJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnJlcG9ydC5CYXNpYy5tZWFzX2R1cmF0aW9uLCBwQnVmLCAwKTsKKwkJCXBCdWYgKz0gMjsKKwkJCWllbGVuIC09ICh1aW50OF90KTI7CisJCQl0bXA0M19fID0gKnBCdWY7CisJCQlwQnVmICs9IDE7CisJCQlpZWxlbiAtPSAxOworCQkJcERzdC0+cmVwb3J0LkJhc2ljLmJzcyA9IHRtcDQzX18gPj4gMCAmIDB4MTsKKwkJCXBEc3QtPnJlcG9ydC5CYXNpYy5vZmRtX3ByZWFtYmxlID0gdG1wNDNfXyA+PiAxICYgMHgxOworCQkJcERzdC0+cmVwb3J0LkJhc2ljLnVuaWRfc2lnbmFsID0gdG1wNDNfXyA+PiAyICYgMHgxOworCQkJcERzdC0+cmVwb3J0LkJhc2ljLnJhZGVyID0gdG1wNDNfXyA+PiAzICYgMHgxOworCQkJcERzdC0+cmVwb3J0LkJhc2ljLnVubWVhc3VyZWQgPSB0bXA0M19fID4+IDQgJiAweDE7CisJCQlwRHN0LT5yZXBvcnQuQmFzaWMudW51c2VkID0gdG1wNDNfXyA+PiA1ICYgMHg3OworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXBEc3QtPnJlcG9ydC5DQ0EuY2hhbm5lbCA9ICpwQnVmOworCQkJcEJ1ZiArPSAxOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJCWZyYW1lc250b2hxKHBDdHgsICZwRHN0LT5yZXBvcnQuQ0NBLm1lYXNfc3RhcnRfdGltZSwgcEJ1ZiwgMCk7CisJCQlwQnVmICs9IDg7CisJCQlpZWxlbiAtPSAodWludDhfdCk4OworCQkJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnJlcG9ydC5DQ0EubWVhc19kdXJhdGlvbiwgcEJ1ZiwgMCk7CisJCQlwQnVmICs9IDI7CisJCQlpZWxlbiAtPSAodWludDhfdCkyOworCQkJcERzdC0+cmVwb3J0LkNDQS5jY2FfYnVzeV9mcmFjdGlvbiA9ICpwQnVmOworCQkJcEJ1ZiArPSAxOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwRHN0LT5yZXBvcnQuUlBJSGlzdG9ncmFtLmNoYW5uZWwgPSAqcEJ1ZjsKKwkJCXBCdWYgKz0gMTsKKwkJCWllbGVuIC09ICh1aW50OF90KTE7CisJCQlmcmFtZXNudG9ocShwQ3R4LCAmcERzdC0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5tZWFzX3N0YXJ0X3RpbWUsIHBCdWYsIDApOworCQkJcEJ1ZiArPSA4OworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpODsKKwkJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5yZXBvcnQuUlBJSGlzdG9ncmFtLm1lYXNfZHVyYXRpb24sIHBCdWYsIDApOworCQkJcEJ1ZiArPSAyOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwkJCXBEc3QtPnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpMF9kZW5zaXR5ID0gKnBCdWY7CisJCQlwQnVmICs9IDE7CisJCQlpZWxlbiAtPSAodWludDhfdCkxOworCQkJcERzdC0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkxX2RlbnNpdHkgPSAqcEJ1ZjsKKwkJCXBCdWYgKz0gMTsKKwkJCWllbGVuIC09ICh1aW50OF90KTE7CisJCQlwRHN0LT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTJfZGVuc2l0eSA9ICpwQnVmOworCQkJcEJ1ZiArPSAxOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJCXBEc3QtPnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpM19kZW5zaXR5ID0gKnBCdWY7CisJCQlwQnVmICs9IDE7CisJCQlpZWxlbiAtPSAodWludDhfdCkxOworCQkJcERzdC0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk0X2RlbnNpdHkgPSAqcEJ1ZjsKKwkJCXBCdWYgKz0gMTsKKwkJCWllbGVuIC09ICh1aW50OF90KTE7CisJCQlwRHN0LT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTVfZGVuc2l0eSA9ICpwQnVmOworCQkJcEJ1ZiArPSAxOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJCXBEc3QtPnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpNl9kZW5zaXR5ID0gKnBCdWY7CisJCQlwQnVmICs9IDE7CisJCQlpZWxlbiAtPSAodWludDhfdCkxOworCQkJcERzdC0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk3X2RlbnNpdHkgPSAqcEJ1ZjsKKwkJCXBCdWYgKz0gMTsKKwkJCWllbGVuIC09ICh1aW50OF90KTE7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJcERzdC0+cmVwb3J0LkJlYWNvbi5yZWdDbGFzcyA9ICpwQnVmOworCQkJcEJ1ZiArPSAxOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJCXBEc3QtPnJlcG9ydC5CZWFjb24uY2hhbm5lbCA9ICpwQnVmOworCQkJcEJ1ZiArPSAxOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJCWZyYW1lc250b2hxKHBDdHgsICZwRHN0LT5yZXBvcnQuQmVhY29uLm1lYXNfc3RhcnRfdGltZSwgcEJ1ZiwgMCk7CisJCQlwQnVmICs9IDg7CisJCQlpZWxlbiAtPSAodWludDhfdCk4OworCQkJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnJlcG9ydC5CZWFjb24ubWVhc19kdXJhdGlvbiwgcEJ1ZiwgMCk7CisJCQlwQnVmICs9IDI7CisJCQlpZWxlbiAtPSAodWludDhfdCkyOworCQkJdG1wNDRfXyA9ICpwQnVmOworCQkJcEJ1ZiArPSAxOworCQkJaWVsZW4gLT0gMTsKKwkJCXBEc3QtPnJlcG9ydC5CZWFjb24uY29uZGVuc2VkX1BIWSA9IHRtcDQ0X18gPj4gMCAmIDB4N2Y7CisJCQlwRHN0LT5yZXBvcnQuQmVhY29uLnJlcG9ydGVkX2ZyYW1lX3R5cGUgPSB0bXA0NF9fID4+IDcgJiAweDE7CisJCQlwRHN0LT5yZXBvcnQuQmVhY29uLlJDUEkgPSAqcEJ1ZjsKKwkJCXBCdWYgKz0gMTsKKwkJCWllbGVuIC09ICh1aW50OF90KTE7CisJCQlwRHN0LT5yZXBvcnQuQmVhY29uLlJTTkkgPSAqcEJ1ZjsKKwkJCXBCdWYgKz0gMTsKKwkJCWllbGVuIC09ICh1aW50OF90KTE7CisJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnJlcG9ydC5CZWFjb24uQlNTSUQsIHBCdWYsIDYpOworCQkJcEJ1ZiArPSA2OworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpNjsKKwkJCXBEc3QtPnJlcG9ydC5CZWFjb24uYW50ZW5uYV9pZCA9ICpwQnVmOworCQkJcEJ1ZiArPSAxOworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJCWZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5yZXBvcnQuQmVhY29uLnBhcmVudF9UU0YsIHBCdWYsIDApOworCQkJcEJ1ZiArPSA0OworCQkJaWVsZW4gLT0gKHVpbnQ4X3QpNDsKKwkJCXN0YXR1cyB8PSB1bnBhY2tfY29yZShwQ3R4LAorCQkJCXBCdWYsCisJCQkJaWVsZW4sCisJCQkJRkZTX3JlcG9ydEJlYWNvbiwKKwkJCQlJRVNfcmVwb3J0QmVhY29uLAorCQkJCSh1aW50OF90ICopcERzdCwKKwkJCQlzaXplb2YoKnBEc3QpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfbWVhc3VyZW1lbnRfcmVwb3J0LiAqLworCisjZGVmaW5lIFNpZ0llTWVhc3VyZW1lbnRSZXBvcnQgKDB4MDAzOCkKKworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfbWVhc3VyZW1lbnRfcmVxdWVzdEJlYWNvbltdID0geworCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX21lYXN1cmVtZW50X3JlcXVlc3RCZWFjb25bXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwKKwltZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5TU0lEKSwgb2Zmc2V0b2YodERvdDExZklFU1NJRCwgcHJlc2VudCksIDAsCisJIlNTSUQiLCAwLCAyLCAzNCwgU2lnSWVTU0lELCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfU1NJRCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwKKwltZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5CZWFjb25SZXBvcnRpbmcpLAorCW9mZnNldG9mKHREb3QxMWZJRUJlYWNvblJlcG9ydGluZywgcHJlc2VudCksIDAsICJCZWFjb25SZXBvcnRpbmciLAorCTAsIDQsIDQsIFNpZ0llQmVhY29uUmVwb3J0aW5nLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9CRUFDT05SRVBPUlRJTkcsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QsCisJbWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQmNuUmVwb3J0aW5nRGV0YWlsKSwKKwlvZmZzZXRvZih0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWwsIHByZXNlbnQpLCAwLCAiQmNuUmVwb3J0aW5nRGV0YWlsIiwKKwkwLCAzLCAzLCBTaWdJZUJjblJlcG9ydGluZ0RldGFpbCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfQkNOUkVQT1JUSU5HREVUQUlMLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0LAorCW1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLlJlcXVlc3RlZEluZm8pLAorCW9mZnNldG9mKHREb3QxMWZJRVJlcXVlc3RlZEluZm8sIHByZXNlbnQpLCAwLCAiUmVxdWVzdGVkSW5mbyIsCisJMCwgMiwgMjU3LCBTaWdJZVJlcXVlc3RlZEluZm8sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1JFUVVFU1RFRElORk8sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QsCisJbWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQVBDaGFubmVsUmVwb3J0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQsIHByZXNlbnQpLAorCW9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwgbWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubnVtX0FQQ2hhbm5lbFJlcG9ydCksICJBUENoYW5uZWxSZXBvcnQiLCAyLCAzLCA1MywgU2lnSWVBUENoYW5uZWxSZXBvcnQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9BUENIQU5ORUxSRVBPUlQsIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwKK307CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfbWVhc3VyZW1lbnRfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkJICAgICB0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDhfdCB0bXA0NV9fOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPm1lYXN1cmVtZW50X3Rva2VuID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJdG1wNDVfXyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAxOworCXBEc3QtPnBhcmFsbGVsID0gdG1wNDVfXyA+PiAwICYgMHgxOworCXBEc3QtPmVuYWJsZSA9IHRtcDQ1X18gPj4gMSAmIDB4MTsKKwlwRHN0LT5yZXF1ZXN0ID0gdG1wNDVfXyA+PiAyICYgMHgxOworCXBEc3QtPnJlcG9ydCA9IHRtcDQ1X18gPj4gMyAmIDB4MTsKKwlwRHN0LT5kdXJhdGlvbk1hbmRhdG9yeSA9IHRtcDQ1X18gPj4gNCAmIDB4MTsKKwlwRHN0LT51bnVzZWQgPSB0bXA0NV9fID4+IDUgJiAweDc7CisJcERzdC0+bWVhc3VyZW1lbnRfdHlwZSA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXN3aXRjaCAocERzdC0+bWVhc3VyZW1lbnRfdHlwZSkgeworCWNhc2UgMDoKKwkJcERzdC0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CYXNpYy5jaGFubmVsX25vID0gKnBCdWY7CisJCXBCdWYgKz0gMTsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJhc2ljLm1lYXNfc3RhcnRfdGltZSwgcEJ1ZiwgOCk7CisJCXBCdWYgKz0gODsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpODsKKwkJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmFzaWMubWVhc19kdXJhdGlvbiwgcEJ1ZiwgMCk7CisJCXBCdWYgKz0gMjsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkNDQS5jaGFubmVsX25vID0gKnBCdWY7CisJCXBCdWYgKz0gMTsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkNDQS5tZWFzX3N0YXJ0X3RpbWUsIHBCdWYsIDgpOworCQlwQnVmICs9IDg7CisJCWllbGVuIC09ICh1aW50OF90KTg7CisJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkNDQS5tZWFzX2R1cmF0aW9uLCBwQnVmLCAwKTsKKwkJcEJ1ZiArPSAyOworCQlpZWxlbiAtPSAodWludDhfdCkyOworCQlicmVhazsKKwljYXNlIDI6CisJCXBEc3QtPm1lYXN1cmVtZW50X3JlcXVlc3QuUlBJSGlzdG9ncmFtLmNoYW5uZWxfbm8gPSAqcEJ1ZjsKKwkJcEJ1ZiArPSAxOworCQlpZWxlbiAtPSAodWludDhfdCkxOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPm1lYXN1cmVtZW50X3JlcXVlc3QuUlBJSGlzdG9ncmFtLm1lYXNfc3RhcnRfdGltZSwgcEJ1ZiwgOCk7CisJCXBCdWYgKz0gODsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpODsKKwkJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm1lYXN1cmVtZW50X3JlcXVlc3QuUlBJSGlzdG9ncmFtLm1lYXNfZHVyYXRpb24sIHBCdWYsIDApOworCQlwQnVmICs9IDI7CisJCWllbGVuIC09ICh1aW50OF90KTI7CisJCWJyZWFrOworCWNhc2UgNToKKwkJcERzdC0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ucmVnQ2xhc3MgPSAqcEJ1ZjsKKwkJcEJ1ZiArPSAxOworCQlpZWxlbiAtPSAodWludDhfdCkxOworCQlwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5jaGFubmVsID0gKnBCdWY7CisJCXBCdWYgKz0gMTsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwkJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLnJhbmRvbWl6YXRpb24sIHBCdWYsIDApOworCQlwQnVmICs9IDI7CisJCWllbGVuIC09ICh1aW50OF90KTI7CisJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5tZWFzX2R1cmF0aW9uLCBwQnVmLCAwKTsKKwkJcEJ1ZiArPSAyOworCQlpZWxlbiAtPSAodWludDhfdCkyOworCQlwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5tZWFzX21vZGUgPSAqcEJ1ZjsKKwkJcEJ1ZiArPSAxOworCQlpZWxlbiAtPSAodWludDhfdCkxOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLkJTU0lELCBwQnVmLCA2KTsKKwkJcEJ1ZiArPSA2OworCQlpZWxlbiAtPSAodWludDhfdCk2OworCQlzdGF0dXMgfD0gdW5wYWNrX2NvcmUocEN0eCwKKwkJCQlwQnVmLAorCQkJCWllbGVuLAorCQkJCUZGU19tZWFzdXJlbWVudF9yZXF1ZXN0QmVhY29uLAorCQkJCUlFU19tZWFzdXJlbWVudF9yZXF1ZXN0QmVhY29uLAorCQkJCSh1aW50OF90ICopcERzdCwKKwkJCQlzaXplb2YoKnBEc3QpKTsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfbWVhc3VyZW1lbnRfcmVxdWVzdC4gKi8KKworI2RlZmluZSBTaWdJZU1lYXN1cmVtZW50UmVxdWVzdCAoMHgwMDM5KQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfbW9iaWxpdHlfZG9tYWluKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkgdWludDhfdCBpZWxlbiwKKwkJCQkJIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQ4X3QgdG1wNDZfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+TURJRCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJdG1wNDZfXyA9ICpwQnVmOworCXBEc3QtPm92ZXJEU0NhcCA9IHRtcDQ2X18gPj4gMCAmIDB4MTsKKwlwRHN0LT5yZXNvdXJjZVJlcUNhcCA9IHRtcDQ2X18gPj4gMSAmIDB4MTsKKwlwRHN0LT5yZXNlcnZlZCA9IHRtcDQ2X18gPj4gMiAmIDB4M2Y7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9tb2JpbGl0eV9kb21haW4uICovCisKKyNkZWZpbmUgU2lnSWVNb2JpbGl0eURvbWFpbiAoMHgwMDNhKQorCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19OZWlnaGJvclJlcG9ydFtdID0geworCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX05laWdoYm9yUmVwb3J0W10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmSUVOZWlnaGJvclJlcG9ydCwgVFNGSW5mbyksIG9mZnNldG9mKHREb3QxMWZJRVRTRkluZm8sCisJcHJlc2VudCksIDAsICJUU0ZJbmZvIiwgMCwgNiwgNiwgU2lnSWVUU0ZJbmZvLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9UU0ZJTkZPLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFTmVpZ2hib3JSZXBvcnQsIENvbmRlbnNlZENvdW50cnlTdHIpLAorCW9mZnNldG9mKHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIsIHByZXNlbnQpLCAwLCAiQ29uZGVuc2VkQ291bnRyeVN0ciIsCisJMCwgNCwgNCwgU2lnSWVDb25kZW5zZWRDb3VudHJ5U3RyLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9DT05ERU5TRURDT1VOVFJZU1RSLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFTmVpZ2hib3JSZXBvcnQsIE1lYXN1cmVtZW50UGlsb3QpLAorCW9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QsIHByZXNlbnQpLCAwLCAiTWVhc3VyZW1lbnRQaWxvdCIsCisJMCwgMywgMjU4LCBTaWdJZU1lYXN1cmVtZW50UGlsb3QsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX01FQVNVUkVNRU5UUElMT1QsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVOZWlnaGJvclJlcG9ydCwgUlJNRW5hYmxlZENhcCksCisJb2Zmc2V0b2YodERvdDExZklFUlJNRW5hYmxlZENhcCwgcHJlc2VudCksIDAsICJSUk1FbmFibGVkQ2FwIiwKKwkwLCA3LCA3LCBTaWdJZVJSTUVuYWJsZWRDYXAsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1JSTUVOQUJMRURDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVOZWlnaGJvclJlcG9ydCwgTXVsdGlCc3NpZCksCisJb2Zmc2V0b2YodERvdDExZklFTXVsdGlCc3NpZCwgcHJlc2VudCksIDAsICJNdWx0aUJzc2lkIiwKKwkwLCAzLCAyNTgsIFNpZ0llTXVsdGlCc3NpZCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfTVVMVElCU1NJRCwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LAorfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9uZWlnaGJvcl9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50OF90IGllbGVuLAorCQkJCQkgdERvdDExZklFTmVpZ2hib3JSZXBvcnQgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDhfdCB0bXA0N19fOworCXVpbnQ4X3QgdG1wNDhfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmJzc2lkLCBwQnVmLCA2KTsKKwlwQnVmICs9IDY7CisJaWVsZW4gLT0gKHVpbnQ4X3QpNjsKKwl0bXA0N19fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09IDE7CisJcERzdC0+QVBSZWFjaGFiaWxpdHkgPSB0bXA0N19fID4+IDAgJiAweDM7CisJcERzdC0+U2VjdXJpdHkgPSB0bXA0N19fID4+IDIgJiAweDE7CisJcERzdC0+S2V5U2NvcGUgPSB0bXA0N19fID4+IDMgJiAweDE7CisJcERzdC0+U3BlY01nbXRDYXAgPSB0bXA0N19fID4+IDQgJiAweDE7CisJcERzdC0+UW9zQ2FwID0gdG1wNDdfXyA+PiA1ICYgMHgxOworCXBEc3QtPmFwc2QgPSB0bXA0N19fID4+IDYgJiAweDE7CisJcERzdC0+cnJtID0gdG1wNDdfXyA+PiA3ICYgMHgxOworCXRtcDQ4X18gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gMTsKKwlwRHN0LT5EZWxheWVkQkEgPSB0bXA0OF9fID4+IDAgJiAweDE7CisJcERzdC0+SW1tQkEgPSB0bXA0OF9fID4+IDEgJiAweDE7CisJcERzdC0+TW9iaWxpdHlEb21haW4gPSB0bXA0OF9fID4+IDIgJiAweDE7CisJcERzdC0+cmVzZXJ2ZWQgPSB0bXA0OF9fID4+IDMgJiAweDFmOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5yZXNlcnZlZDEsIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAodWludDhfdCkyOworCXBEc3QtPnJlZ3VsYXRvcnlDbGFzcyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmNoYW5uZWwgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlwRHN0LT5QaHlUeXBlID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJKHZvaWQpcEN0eDsKKwlzdGF0dXMgfD0gdW5wYWNrX2NvcmUocEN0eCwKKwkJCQlwQnVmLAorCQkJCWllbGVuLAorCQkJCUZGU19OZWlnaGJvclJlcG9ydCwKKwkJCQlJRVNfTmVpZ2hib3JSZXBvcnQsCisJCQkJKHVpbnQ4X3QgKilwRHN0LAorCQkJCXNpemVvZigqcERzdCkpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX25laWdoYm9yX3JlcG9ydC4gKi8KKworI2RlZmluZSBTaWdJZU5laWdoYm9yUmVwb3J0ICgweDAwM2IpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9vYnNzX3NjYW5fcGFyYW1ldGVycyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkJICAgICB0RG90MTFmSUVPQlNTU2NhblBhcmFtZXRlcnMgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm9ic3NTY2FuUGFzc2l2ZUR3ZWxsLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+b2Jzc1NjYW5BY3RpdmVEd2VsbCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmJzc0NoYW5uZWxXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwsIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAodWludDhfdCkyOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5vYnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWwsIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAodWludDhfdCkyOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5vYnNzU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmJzc1dpZHRoQ2hhbm5lbFRyYW5zaXRpb25EZWxheUZhY3RvciwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm9ic3NTY2FuQWN0aXZpdHlUaHJlc2hvbGQsIHBCdWYsIDApOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfb2Jzc19zY2FuX3BhcmFtZXRlcnMuICovCisKKyNkZWZpbmUgU2lnSWVPQlNTU2NhblBhcmFtZXRlcnMgKDB4MDAzYykKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX29wZXJhdGluZ19tb2RlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkgdWludDhfdCBpZWxlbiwKKwkJCQkJIHREb3QxMWZJRU9wZXJhdGluZ01vZGUgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDhfdCB0bXA0OV9fOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXRtcDQ5X18gPSAqcEJ1ZjsKKwlwRHN0LT5jaGFuV2lkdGggPSB0bXA0OV9fID4+IDAgJiAweDM7CisJcERzdC0+cmVzZXJ2ZWQgPSB0bXA0OV9fID4+IDIgJiAweDM7CisJcERzdC0+cnhOU1MgPSB0bXA0OV9fID4+IDQgJiAweDc7CisJcERzdC0+cnhOU1NUeXBlID0gdG1wNDlfXyA+PiA3ICYgMHgxOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfb3BlcmF0aW5nX21vZGUuICovCisKKyNkZWZpbmUgU2lnSWVPcGVyYXRpbmdNb2RlICgweDAwM2QpCisKKworc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfUDJQQXNzb2NSZXFbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRVAyUEFzc29jUmVxLCBQMlBDYXBhYmlsaXR5KSwKKwlvZmZzZXRvZih0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSwgcHJlc2VudCksICJQMlBDYXBhYmlsaXR5IiwKKwlTaWdUbHZQMlBDYXBhYmlsaXR5LCBET1QxMUZfVExWX1AyUENBUEFCSUxJVFksIDAsIDUsIDUsIDEsIDEsIDIsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVQMlBBc3NvY1JlcSwgRXh0ZW5kZWRMaXN0ZW5UaW1pbmcpLAorCW9mZnNldG9mKHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZywgcHJlc2VudCksCisJIkV4dGVuZGVkTGlzdGVuVGltaW5nIiwgU2lnVGx2RXh0ZW5kZWRMaXN0ZW5UaW1pbmcsCisJRE9UMTFGX1RMVl9FWFRFTkRFRExJU1RFTlRJTUlORywgMCwgNywgNywgMCwgMSwgMiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVAyUEFzc29jUmVxLCBQMlBEZXZpY2VJbmZvKSwKKwlvZmZzZXRvZih0RG90MTFmVExWUDJQRGV2aWNlSW5mbywgcHJlc2VudCksICJQMlBEZXZpY2VJbmZvIiwKKwlTaWdUbHZQMlBEZXZpY2VJbmZvLCBET1QxMUZfVExWX1AyUERFVklDRUlORk8sIDAsIDE5LCA1NSwgMSwgMSwgMiwgMCwgfSwKKwl7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKK307CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcDJfcF9hc3NvY19yZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICAgdERvdDExZklFUDJQQXNzb2NSZXEgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlzdGF0dXMgPSB1bnBhY2tfdGx2X2NvcmUocEN0eCwgcEJ1ZiwgaWVsZW4sCisJCQlUTFZTX1AyUEFzc29jUmVxLAorCQkJKHVpbnQ4X3QgKilwRHN0LCBzaXplb2YoKnBEc3QpKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9wMl9wX2Fzc29jX3JlcS4gKi8KKworI2RlZmluZSBTaWdJZVAyUEFzc29jUmVxICgweDAwM2UpCisKKworc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfUDJQQXNzb2NSZXNbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRVAyUEFzc29jUmVzLCBQMlBTdGF0dXMpLAorCW9mZnNldG9mKHREb3QxMWZUTFZQMlBTdGF0dXMsIHByZXNlbnQpLCAiUDJQU3RhdHVzIiwgU2lnVGx2UDJQU3RhdHVzLAorCURPVDExRl9UTFZfUDJQU1RBVFVTLCAwLCA0LCA0LCAxLCAxLCAyLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFUDJQQXNzb2NSZXMsIEV4dGVuZGVkTGlzdGVuVGltaW5nKSwKKwlvZmZzZXRvZih0RG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmcsIHByZXNlbnQpLAorCSJFeHRlbmRlZExpc3RlblRpbWluZyIsIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nLAorCURPVDExRl9UTFZfRVhURU5ERURMSVNURU5USU1JTkcsIDAsIDcsIDcsIDAsIDEsIDIsIDAsIH0sCisJezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCit9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3AyX3BfYXNzb2NfcmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICB1aW50OF90IGllbGVuLAorCQkJCSAgICAgIHREb3QxMWZJRVAyUEFzc29jUmVzICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJcERzdC0+cHJlc2VudCA9IDE7CisJc3RhdHVzID0gdW5wYWNrX3Rsdl9jb3JlKHBDdHgsIHBCdWYsIGllbGVuLAorCQkJVExWU19QMlBBc3NvY1JlcywKKwkJCSh1aW50OF90ICopcERzdCwgc2l6ZW9mKCpwRHN0KSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcDJfcF9hc3NvY19yZXMuICovCisKKyNkZWZpbmUgU2lnSWVQMlBBc3NvY1JlcyAoMHgwMDNmKQorCisKK3N0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1AyUEJlYWNvbltdID0geworCXsgb2Zmc2V0b2YodERvdDExZklFUDJQQmVhY29uLCBQMlBDYXBhYmlsaXR5KSwKKwlvZmZzZXRvZih0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSwgcHJlc2VudCksICJQMlBDYXBhYmlsaXR5IiwKKwlTaWdUbHZQMlBDYXBhYmlsaXR5LCBET1QxMUZfVExWX1AyUENBUEFCSUxJVFksIDAsIDUsIDUsIDEsIDEsIDIsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVQMlBCZWFjb24sIFAyUERldmljZUlkKSwKKwlvZmZzZXRvZih0RG90MTFmVExWUDJQRGV2aWNlSWQsIHByZXNlbnQpLCAiUDJQRGV2aWNlSWQiLAorCVNpZ1RsdlAyUERldmljZUlkLCBET1QxMUZfVExWX1AyUERFVklDRUlELCAwLCA5LCA5LCAxLCAxLCAyLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFUDJQQmVhY29uLCBOb3RpY2VPZkFic2VuY2UpLAorCW9mZnNldG9mKHREb3QxMWZUTFZOb3RpY2VPZkFic2VuY2UsIHByZXNlbnQpLCAiTm90aWNlT2ZBYnNlbmNlIiwKKwlTaWdUbHZOb3RpY2VPZkFic2VuY2UsIERPVDExRl9UTFZfTk9USUNFT0ZBQlNFTkNFLAorCTAsIDUsIDQxLCAwLCAxLCAyLCAwLCB9LAorCXswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9wMl9wX2JlYWNvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICB1aW50OF90IGllbGVuLAorCQkJCSAgICB0RG90MTFmSUVQMlBCZWFjb24gKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlzdGF0dXMgPSB1bnBhY2tfdGx2X2NvcmUocEN0eCwgcEJ1ZiwgaWVsZW4sCisJCQlUTFZTX1AyUEJlYWNvbiwKKwkJCSh1aW50OF90ICopcERzdCwgc2l6ZW9mKCpwRHN0KSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcDJfcF9iZWFjb24uICovCisKKyNkZWZpbmUgU2lnSWVQMlBCZWFjb24gKDB4MDA0MCkKKworCitzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBCZWFjb25Qcm9iZVJlc1tdID0geworCXsgb2Zmc2V0b2YodERvdDExZklFUDJQQmVhY29uUHJvYmVSZXMsIFAyUENhcGFiaWxpdHkpLAorCW9mZnNldG9mKHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5LCBwcmVzZW50KSwgIlAyUENhcGFiaWxpdHkiLAorCVNpZ1RsdlAyUENhcGFiaWxpdHksIERPVDExRl9UTFZfUDJQQ0FQQUJJTElUWSwgMCwgNSwgNSwgMCwgMSwgMiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzLCBQMlBEZXZpY2VJZCksCisJb2Zmc2V0b2YodERvdDExZlRMVlAyUERldmljZUlkLCBwcmVzZW50KSwgIlAyUERldmljZUlkIiwKKwlTaWdUbHZQMlBEZXZpY2VJZCwgRE9UMTFGX1RMVl9QMlBERVZJQ0VJRCwgMCwgOSwgOSwgMCwgMSwgMiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzLCBFeHRlbmRlZExpc3RlblRpbWluZyksCisJb2Zmc2V0b2YodERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nLCBwcmVzZW50KSwKKwkiRXh0ZW5kZWRMaXN0ZW5UaW1pbmciLCBTaWdUbHZFeHRlbmRlZExpc3RlblRpbWluZywKKwlET1QxMUZfVExWX0VYVEVOREVETElTVEVOVElNSU5HLCAwLCA3LCA3LCAwLCAxLCAyLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFUDJQQmVhY29uUHJvYmVSZXMsIE5vdGljZU9mQWJzZW5jZSksCisJb2Zmc2V0b2YodERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSwgcHJlc2VudCksICJOb3RpY2VPZkFic2VuY2UiLAorCVNpZ1Rsdk5vdGljZU9mQWJzZW5jZSwgRE9UMTFGX1RMVl9OT1RJQ0VPRkFCU0VOQ0UsCisJMCwgNSwgNDEsIDAsIDEsIDIsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcywgUDJQRGV2aWNlSW5mbyksCisJb2Zmc2V0b2YodERvdDExZlRMVlAyUERldmljZUluZm8sIHByZXNlbnQpLCAiUDJQRGV2aWNlSW5mbyIsCisJU2lnVGx2UDJQRGV2aWNlSW5mbywgRE9UMTFGX1RMVl9QMlBERVZJQ0VJTkZPLCAwLCAxOSwgNTUsIDAsIDEsIDIsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcywgUDJQR3JvdXBJbmZvKSwKKwlvZmZzZXRvZih0RG90MTFmVExWUDJQR3JvdXBJbmZvLCBwcmVzZW50KSwgIlAyUEdyb3VwSW5mbyIsCisJU2lnVGx2UDJQR3JvdXBJbmZvLCBET1QxMUZfVExWX1AyUEdST1VQSU5GTywgMCwgMywgMTAyNywgMCwgMSwgMiwgMCwgfSwKKwl7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKK307CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcDJfcF9iZWFjb25fcHJvYmVfcmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICAgdWludDhfdCBpZWxlbiwKKwkJCQkJICAgIHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJcERzdC0+cHJlc2VudCA9IDE7CisJc3RhdHVzID0gdW5wYWNrX3Rsdl9jb3JlKHBDdHgsIHBCdWYsIGllbGVuLAorCQkJVExWU19QMlBCZWFjb25Qcm9iZVJlcywKKwkJCSh1aW50OF90ICopcERzdCwgc2l6ZW9mKCpwRHN0KSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcDJfcF9iZWFjb25fcHJvYmVfcmVzLiAqLworCisjZGVmaW5lIFNpZ0llUDJQQmVhY29uUHJvYmVSZXMgKDB4MDA0MSkKKworCitzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBEZUF1dGhbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRVAyUERlQXV0aCwgTWlub3JSZWFzb25Db2RlKSwKKwlvZmZzZXRvZih0RG90MTFmVExWTWlub3JSZWFzb25Db2RlLCBwcmVzZW50KSwgIk1pbm9yUmVhc29uQ29kZSIsCisJU2lnVGx2TWlub3JSZWFzb25Db2RlLCBET1QxMUZfVExWX01JTk9SUkVBU09OQ09ERSwKKwkwLCA0LCA0LCAxLCAxLCAyLCAwLCB9LAorCXswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9wMl9wX2RlX2F1dGgodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgdERvdDExZklFUDJQRGVBdXRoICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJcERzdC0+cHJlc2VudCA9IDE7CisJc3RhdHVzID0gdW5wYWNrX3Rsdl9jb3JlKHBDdHgsIHBCdWYsIGllbGVuLAorCQkJVExWU19QMlBEZUF1dGgsCisJCQkodWludDhfdCAqKXBEc3QsIHNpemVvZigqcERzdCkpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3AyX3BfZGVfYXV0aC4gKi8KKworI2RlZmluZSBTaWdJZVAyUERlQXV0aCAoMHgwMDQyKQorCisKK3N0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1AyUERpc0Fzc29jW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmSUVQMlBEaXNBc3NvYywgTWlub3JSZWFzb25Db2RlKSwKKwlvZmZzZXRvZih0RG90MTFmVExWTWlub3JSZWFzb25Db2RlLCBwcmVzZW50KSwgIk1pbm9yUmVhc29uQ29kZSIsCisJU2lnVGx2TWlub3JSZWFzb25Db2RlLCBET1QxMUZfVExWX01JTk9SUkVBU09OQ09ERSwKKwkwLCA0LCA0LCAxLCAxLCAyLCAwLCB9LAorCXswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9wMl9wX2Rpc19hc3NvYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgICB0RG90MTFmSUVQMlBEaXNBc3NvYyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCXBEc3QtPnByZXNlbnQgPSAxOworCXN0YXR1cyA9IHVucGFja190bHZfY29yZShwQ3R4LCBwQnVmLCBpZWxlbiwKKwkJCVRMVlNfUDJQRGlzQXNzb2MsCisJCQkodWludDhfdCAqKXBEc3QsIHNpemVvZigqcERzdCkpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3AyX3BfZGlzX2Fzc29jLiAqLworCisjZGVmaW5lIFNpZ0llUDJQRGlzQXNzb2MgKDB4MDA0MykKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3AyX3BpZV9vcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICAgdERvdDExZklFUDJQSUVPcGFxdWUgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bnVtX2RhdGEgPSAodWludDhfdCkoaWVsZW4pOworCWlmIChpZWxlbiA+IDI0OSkgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmRhdGEsIHBCdWYsIChpZWxlbikpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcDJfcGllX29wYXF1ZS4gKi8KKworI2RlZmluZSBTaWdJZVAyUElFT3BhcXVlICgweDAwNDQpCisKKworc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfUDJQUHJvYmVSZXFbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRVAyUFByb2JlUmVxLCBQMlBDYXBhYmlsaXR5KSwKKwlvZmZzZXRvZih0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSwgcHJlc2VudCksICJQMlBDYXBhYmlsaXR5IiwKKwlTaWdUbHZQMlBDYXBhYmlsaXR5LCBET1QxMUZfVExWX1AyUENBUEFCSUxJVFksIDAsIDUsIDUsIDEsIDEsIDIsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVQMlBQcm9iZVJlcSwgUDJQRGV2aWNlSWQpLAorCW9mZnNldG9mKHREb3QxMWZUTFZQMlBEZXZpY2VJZCwgcHJlc2VudCksICJQMlBEZXZpY2VJZCIsCisJU2lnVGx2UDJQRGV2aWNlSWQsIERPVDExRl9UTFZfUDJQREVWSUNFSUQsIDAsIDksIDksIDAsIDEsIDIsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVQMlBQcm9iZVJlcSwgTGlzdGVuQ2hhbm5lbCksCisJb2Zmc2V0b2YodERvdDExZlRMVkxpc3RlbkNoYW5uZWwsIHByZXNlbnQpLCAiTGlzdGVuQ2hhbm5lbCIsCisJU2lnVGx2TGlzdGVuQ2hhbm5lbCwgRE9UMTFGX1RMVl9MSVNURU5DSEFOTkVMLCAwLCA4LCA4LCAxLCAxLCAyLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFUDJQUHJvYmVSZXEsIEV4dGVuZGVkTGlzdGVuVGltaW5nKSwKKwlvZmZzZXRvZih0RG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmcsIHByZXNlbnQpLAorCSJFeHRlbmRlZExpc3RlblRpbWluZyIsIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nLAorCURPVDExRl9UTFZfRVhURU5ERURMSVNURU5USU1JTkcsIDAsIDcsIDcsIDAsIDEsIDIsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVQMlBQcm9iZVJlcSwgT3BlcmF0aW5nQ2hhbm5lbCksCisJb2Zmc2V0b2YodERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwsIHByZXNlbnQpLCAiT3BlcmF0aW5nQ2hhbm5lbCIsCisJU2lnVGx2T3BlcmF0aW5nQ2hhbm5lbCwgRE9UMTFGX1RMVl9PUEVSQVRJTkdDSEFOTkVMLAorCTAsIDgsIDgsIDAsIDEsIDIsIDAsIH0sCisJezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCit9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3AyX3BfcHJvYmVfcmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICB1aW50OF90IGllbGVuLAorCQkJCSAgICAgIHREb3QxMWZJRVAyUFByb2JlUmVxICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJcERzdC0+cHJlc2VudCA9IDE7CisJc3RhdHVzID0gdW5wYWNrX3Rsdl9jb3JlKHBDdHgsIHBCdWYsIGllbGVuLAorCQkJVExWU19QMlBQcm9iZVJlcSwKKwkJCSh1aW50OF90ICopcERzdCwgc2l6ZW9mKCpwRHN0KSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcDJfcF9wcm9iZV9yZXEuICovCisKKyNkZWZpbmUgU2lnSWVQMlBQcm9iZVJlcSAoMHgwMDQ1KQorCisKK3N0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1AyUFByb2JlUmVzW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmSUVQMlBQcm9iZVJlcywgUDJQQ2FwYWJpbGl0eSksCisJb2Zmc2V0b2YodERvdDExZlRMVlAyUENhcGFiaWxpdHksIHByZXNlbnQpLCAiUDJQQ2FwYWJpbGl0eSIsCisJU2lnVGx2UDJQQ2FwYWJpbGl0eSwgRE9UMTFGX1RMVl9QMlBDQVBBQklMSVRZLCAwLCA1LCA1LCAxLCAxLCAyLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFUDJQUHJvYmVSZXMsIEV4dGVuZGVkTGlzdGVuVGltaW5nKSwKKwlvZmZzZXRvZih0RG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmcsIHByZXNlbnQpLAorCSJFeHRlbmRlZExpc3RlblRpbWluZyIsIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nLAorCURPVDExRl9UTFZfRVhURU5ERURMSVNURU5USU1JTkcsIDAsIDcsIDcsIDAsIDEsIDIsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVQMlBQcm9iZVJlcywgTm90aWNlT2ZBYnNlbmNlKSwKKwlvZmZzZXRvZih0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlLCBwcmVzZW50KSwgIk5vdGljZU9mQWJzZW5jZSIsCisJU2lnVGx2Tm90aWNlT2ZBYnNlbmNlLCBET1QxMUZfVExWX05PVElDRU9GQUJTRU5DRSwKKwkwLCA1LCA0MSwgMCwgMSwgMiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVAyUFByb2JlUmVzLCBQMlBEZXZpY2VJbmZvKSwKKwlvZmZzZXRvZih0RG90MTFmVExWUDJQRGV2aWNlSW5mbywgcHJlc2VudCksICJQMlBEZXZpY2VJbmZvIiwKKwlTaWdUbHZQMlBEZXZpY2VJbmZvLCBET1QxMUZfVExWX1AyUERFVklDRUlORk8sIDAsIDE5LCA1NSwgMSwgMSwgMiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVAyUFByb2JlUmVzLCBQMlBHcm91cEluZm8pLAorCW9mZnNldG9mKHREb3QxMWZUTFZQMlBHcm91cEluZm8sIHByZXNlbnQpLCAiUDJQR3JvdXBJbmZvIiwKKwlTaWdUbHZQMlBHcm91cEluZm8sIERPVDExRl9UTFZfUDJQR1JPVVBJTkZPLCAwLCAzLCAxMDI3LCAwLCAxLCAyLCAwLCB9LAorCXswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9wMl9wX3Byb2JlX3Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgICB0RG90MTFmSUVQMlBQcm9iZVJlcyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCXBEc3QtPnByZXNlbnQgPSAxOworCXN0YXR1cyA9IHVucGFja190bHZfY29yZShwQ3R4LCBwQnVmLCBpZWxlbiwKKwkJCVRMVlNfUDJQUHJvYmVSZXMsCisJCQkodWludDhfdCAqKXBEc3QsIHNpemVvZigqcERzdCkpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3AyX3BfcHJvYmVfcmVzLiAqLworCisjZGVmaW5lIFNpZ0llUDJQUHJvYmVSZXMgKDB4MDA0NikKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3B0aV9jb250cm9sKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgIHREb3QxMWZJRVBUSUNvbnRyb2wgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+dGlkID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnNlcXVlbmNlX2NvbnRyb2wsIHBCdWYsIDApOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcHRpX2NvbnRyb2wuICovCisKKyNkZWZpbmUgU2lnSWVQVElDb250cm9sICgweDAwNDcpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9wdV9idWZmZXJfc3RhdHVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkgdWludDhfdCBpZWxlbiwKKwkJCQkJIHREb3QxMWZJRVBVQnVmZmVyU3RhdHVzICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQ4X3QgdG1wNTBfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwl0bXA1MF9fID0gKnBCdWY7CisJcERzdC0+YWNfYmtfdHJhZmZpY19hdmFsID0gdG1wNTBfXyA+PiAwICYgMHgxOworCXBEc3QtPmFjX2JlX3RyYWZmaWNfYXZhbCA9IHRtcDUwX18gPj4gMSAmIDB4MTsKKwlwRHN0LT5hY192aV90cmFmZmljX2F2YWwgPSB0bXA1MF9fID4+IDIgJiAweDE7CisJcERzdC0+YWNfdm9fdHJhZmZpY19hdmFsID0gdG1wNTBfXyA+PiAzICYgMHgxOworCXBEc3QtPnJlc2VydmVkID0gdG1wNTBfXyA+PiA0ICYgMHhmOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcHVfYnVmZmVyX3N0YXR1cy4gKi8KKworI2RlZmluZSBTaWdJZVBVQnVmZmVyU3RhdHVzICgweDAwNDgpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9wb3dlcl9jYXBzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgIHREb3QxMWZJRVBvd2VyQ2FwcyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5taW5UeFBvd2VyID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+bWF4VHhQb3dlciA9ICpwQnVmOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcG93ZXJfY2Fwcy4gKi8KKworI2RlZmluZSBTaWdJZVBvd2VyQ2FwcyAoMHgwMDQ5KQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcG93ZXJfY29uc3RyYWludHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICAgdWludDhfdCBpZWxlbiwKKwkJCQkJICAgdERvdDExZklFUG93ZXJDb25zdHJhaW50cyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5sb2NhbFBvd2VyQ29uc3RyYWludHMgPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3Bvd2VyX2NvbnN0cmFpbnRzLiAqLworCisjZGVmaW5lIFNpZ0llUG93ZXJDb25zdHJhaW50cyAoMHgwMDRhKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcWJzc19sb2FkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICB1aW50OF90IGllbGVuLAorCQkJCSAgIHREb3QxMWZJRVFCU1NMb2FkICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5zdGFjb3VudCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJcERzdC0+Y2hhdXRpbCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5hdmFpbCwgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9xYnNzX2xvYWQuICovCisKKyNkZWZpbmUgU2lnSWVRQlNTTG9hZCAoMHgwMDRiKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfUUNvbVZlbmRvcklFKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICAgIHREb3QxMWZJRVFDb21WZW5kb3JJRSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT50eXBlID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+Y2hhbm5lbCA9ICpwQnVmOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfUUNvbVZlbmRvcklFLiAqLworCisjZGVmaW5lIFNpZ0llUUNvbVZlbmRvcklFICgweDAwNGMpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9xb3NfY2Fwc19hcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICB1aW50OF90IGllbGVuLAorCQkJCSAgICB0RG90MTFmSUVRT1NDYXBzQXAgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDhfdCB0bXA1MV9fOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXRtcDUxX18gPSAqcEJ1ZjsKKwlwRHN0LT5jb3VudCA9IHRtcDUxX18gPj4gMCAmIDB4ZjsKKwlwRHN0LT5xYWNrID0gdG1wNTFfXyA+PiA0ICYgMHgxOworCXBEc3QtPnFyZXEgPSB0bXA1MV9fID4+IDUgJiAweDE7CisJcERzdC0+dHhvcHJlcSA9IHRtcDUxX18gPj4gNiAmIDB4MTsKKwlwRHN0LT5yZXNlcnZlZCA9IHRtcDUxX18gPj4gNyAmIDB4MTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3Fvc19jYXBzX2FwLiAqLworCisjZGVmaW5lIFNpZ0llUU9TQ2Fwc0FwICgweDAwNGQpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9xb3NfY2Fwc19zdGF0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkgdWludDhfdCBpZWxlbiwKKwkJCQkJIHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQ4X3QgdG1wNTJfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwl0bXA1Ml9fID0gKnBCdWY7CisJcERzdC0+YWN2b191YXBzZCA9IHRtcDUyX18gPj4gMCAmIDB4MTsKKwlwRHN0LT5hY3ZpX3VhcHNkID0gdG1wNTJfXyA+PiAxICYgMHgxOworCXBEc3QtPmFjYmtfdWFwc2QgPSB0bXA1Ml9fID4+IDIgJiAweDE7CisJcERzdC0+YWNiZV91YXBzZCA9IHRtcDUyX18gPj4gMyAmIDB4MTsKKwlwRHN0LT5xYWNrID0gdG1wNTJfXyA+PiA0ICYgMHgxOworCXBEc3QtPm1heF9zcF9sZW5ndGggPSB0bXA1Ml9fID4+IDUgJiAweDM7CisJcERzdC0+bW9yZV9kYXRhX2FjayA9IHRtcDUyX18gPj4gNyAmIDB4MTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3Fvc19jYXBzX3N0YXRpb24uICovCisKKyNkZWZpbmUgU2lnSWVRT1NDYXBzU3RhdGlvbiAoMHgwMDRlKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcW9zX21hcF9zZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgdERvdDExZklFUW9zTWFwU2V0ICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPm51bV9kc2NwX2V4Y2VwdGlvbnMgPSAodWludDhfdCkoaWVsZW4pOworCWlmIChpZWxlbiA+IDYwKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+ZHNjcF9leGNlcHRpb25zLCBwQnVmLCAoaWVsZW4pKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3Fvc19tYXBfc2V0LiAqLworCisjZGVmaW5lIFNpZ0llUW9zTWFwU2V0ICgweDAwNGYpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9xdWlldCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCSB1aW50OF90IGllbGVuLAorCQkJCSB0RG90MTFmSUVRdWlldCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5jb3VudCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPnBlcmlvZCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5kdXJhdGlvbiwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm9mZnNldCwgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9xdWlldC4gKi8KKworI2RlZmluZSBTaWdJZVF1aWV0ICgweDAwNTApCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9yY3BpaWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkgdWludDhfdCBpZWxlbiwKKwkJCQkgdERvdDExZklFUkNQSUlFICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPnJjcGkgPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3JjcGlpZS4gKi8KKworI2RlZmluZSBTaWdJZVJDUElJRSAoMHgwMDUxKQorCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19SSUNEYXRhRGVzY1tdID0geworCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1JJQ0RhdGFEZXNjW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgUklDRGF0YSksIG9mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGEsCisJcHJlc2VudCksIDAsICJSSUNEYXRhIiwgMCwgNiwgNiwgU2lnSWVSSUNEYXRhLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9SSUNEQVRBLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIFJJQ0Rlc2NyaXB0b3IpLAorCW9mZnNldG9mKHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IsIHByZXNlbnQpLCAwLCAiUklDRGVzY3JpcHRvciIsCisJMCwgMywgMjU4LCBTaWdJZVJJQ0Rlc2NyaXB0b3IsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1JJQ0RFU0NSSVBUT1IsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgVFNQRUMpLCBvZmZzZXRvZih0RG90MTFmSUVUU1BFQywKKwlwcmVzZW50KSwgMCwgIlRTUEVDIiwgMCwgNTcsIDU3LCBTaWdJZVRTUEVDLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9UU1BFQywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBUQ0xBUyksIG9mZnNldG9mKHREb3QxMWZJRVRDTEFTLAorCXByZXNlbnQpLCBvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgbnVtX1RDTEFTKSwgIlRDTEFTIiwKKwkyLCA3LCA0NSwgU2lnSWVUQ0xBUywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1RDTEFTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIFRDTEFTU1BST0MpLAorCW9mZnNldG9mKHREb3QxMWZJRVRDTEFTU1BST0MsIHByZXNlbnQpLCAwLCAiVENMQVNTUFJPQyIsCisJMCwgMywgMywgU2lnSWVUQ0xBU1NQUk9DLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9UQ0xBU1NQUk9DLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIFRTRGVsYXkpLCBvZmZzZXRvZih0RG90MTFmSUVUU0RlbGF5LAorCXByZXNlbnQpLCAwLCAiVFNEZWxheSIsIDAsIDYsIDYsIFNpZ0llVFNEZWxheSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVFNERUxBWSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBTY2hlZHVsZSksIG9mZnNldG9mKHREb3QxMWZJRVNjaGVkdWxlLAorCXByZXNlbnQpLCAwLCAiU2NoZWR1bGUiLCAwLCAxNiwgMTYsIFNpZ0llU2NoZWR1bGUsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1NDSEVEVUxFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIFdNTVRTUEVDKSwgb2Zmc2V0b2YodERvdDExZklFV01NVFNQRUMsCisJcHJlc2VudCksIDAsICJXTU1UU1BFQyIsIDAsIDYzLCA2MywgU2lnSWVXTU1UU1BFQywgezAsIDgwLCAyNDIsIDIsIDJ9LAorCTUsIERPVDExRl9FSURfV01NVFNQRUMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgV01NVENMQVMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1UQ0xBUywKKwlwcmVzZW50KSwgb2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIG51bV9XTU1UQ0xBUyksICJXTU1UQ0xBUyIsCisJMiwgMTMsIDUxLCBTaWdJZVdNTVRDTEFTLCB7MCwgODAsIDI0MiwgMiwgNn0sCisJNSwgRE9UMTFGX0VJRF9XTU1UQ0xBUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBXTU1UQ0xBU1BST0MpLAorCW9mZnNldG9mKHREb3QxMWZJRVdNTVRDTEFTUFJPQywgcHJlc2VudCksIDAsICJXTU1UQ0xBU1BST0MiLAorCTAsIDksIDksIFNpZ0llV01NVENMQVNQUk9DLCB7MCwgODAsIDI0MiwgMiwgN30sCisJNSwgRE9UMTFGX0VJRF9XTU1UQ0xBU1BST0MsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgV01NVFNEZWxheSksCisJb2Zmc2V0b2YodERvdDExZklFV01NVFNEZWxheSwgcHJlc2VudCksIDAsICJXTU1UU0RlbGF5IiwKKwkwLCAxMiwgMTIsIFNpZ0llV01NVFNEZWxheSwgezAsIDgwLCAyNDIsIDIsIDh9LAorCTUsIERPVDExRl9FSURfV01NVFNERUxBWSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBXTU1TY2hlZHVsZSksCisJb2Zmc2V0b2YodERvdDExZklFV01NU2NoZWR1bGUsIHByZXNlbnQpLCAwLCAiV01NU2NoZWR1bGUiLAorCTAsIDIyLCAyMiwgU2lnSWVXTU1TY2hlZHVsZSwgezAsIDgwLCAyNDIsIDIsIDl9LAorCTUsIERPVDExRl9FSURfV01NU0NIRURVTEUsIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwKK307CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcmljX2RhdGFfZGVzYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgICB0RG90MTFmSUVSSUNEYXRhRGVzYyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwkodm9pZClwQ3R4OworCXN0YXR1cyB8PSB1bnBhY2tfY29yZShwQ3R4LAorCQkJCXBCdWYsCisJCQkJaWVsZW4sCisJCQkJRkZTX1JJQ0RhdGFEZXNjLAorCQkJCUlFU19SSUNEYXRhRGVzYywKKwkJCQkodWludDhfdCAqKXBEc3QsCisJCQkJc2l6ZW9mKCpwRHN0KSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfcmljX2RhdGFfZGVzYy4gKi8KKworI2RlZmluZSBTaWdJZVJJQ0RhdGFEZXNjICgweDAwNTIpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9yc24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgICB1aW50OF90IGllbGVuLAorCQkJICAgICAgdERvdDExZklFUlNOICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT52ZXJzaW9uLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwlpZiAocERzdC0+dmVyc2lvbiAhPSAweDEpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBzdGF0dXMgfCBET1QxMUZfQkFEX0ZJWEVEX1ZBTFVFOworCX0KKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmdwX2NpcGhlcl9zdWl0ZSwgcEJ1ZiwgNCk7CisJcEJ1ZiArPSA0OworCWllbGVuIC09ICh1aW50OF90KTQ7CisJaWYgKCFpZWxlbikgeworCQlwRHN0LT5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgPSAwVTsKKwkJcERzdC0+YWttX3N1aXRlX2NvdW50ID0gMFU7CisJCXBEc3QtPnBta2lkX2NvdW50ID0gMFU7CisJCXJldHVybiAwVTsKKwl9IGVsc2UgeworCQlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50LCBwQnVmLCAwKTsKKwkJcEJ1ZiArPSAyOworCQlpZWxlbiAtPSAodWludDhfdCkyOworCX0KKwlpZiAocERzdC0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ID4gNCkgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnB3aXNlX2NpcGhlcl9zdWl0ZXMsIHBCdWYsIChwRHN0LT5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKiA0KSk7CisJcEJ1ZiArPSAocERzdC0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ICogNCk7CisJaWVsZW4gLT0gKHBEc3QtPnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQpOworCWlmICghaWVsZW4pIHsKKwkJcERzdC0+YWttX3N1aXRlX2NvdW50ID0gMFU7CisJCXBEc3QtPnBta2lkX2NvdW50ID0gMFU7CisJCXJldHVybiAwVTsKKwl9IGVsc2UgeworCQlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YWttX3N1aXRlX2NvdW50LCBwQnVmLCAwKTsKKwkJcEJ1ZiArPSAyOworCQlpZWxlbiAtPSAodWludDhfdCkyOworCX0KKwlpZiAocERzdC0+YWttX3N1aXRlX2NvdW50ID4gNCkgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmFrbV9zdWl0ZXMsIHBCdWYsIChwRHN0LT5ha21fc3VpdGVfY291bnQgKiA0KSk7CisJcEJ1ZiArPSAocERzdC0+YWttX3N1aXRlX2NvdW50ICogNCk7CisJaWVsZW4gLT0gKHBEc3QtPmFrbV9zdWl0ZV9jb3VudCAqIDQpOworCWlmICghaWVsZW4pIHsKKwkJcERzdC0+cG1raWRfY291bnQgPSAwVTsKKwkJcmV0dXJuIDBVOworCX0gZWxzZSB7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+UlNOX0NhcCwgcEJ1ZiwgMik7CisJCXBCdWYgKz0gMjsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwl9CisJaWYgKCFpZWxlbikgeworCQlwRHN0LT5wbWtpZF9jb3VudCA9IDBVOworCQlyZXR1cm4gMFU7CisJfSBlbHNlIHsKKwkJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnBta2lkX2NvdW50LCBwQnVmLCAwKTsKKwkJcEJ1ZiArPSAyOworCQlpZWxlbiAtPSAodWludDhfdCkyOworCX0KKwlpZiAocERzdC0+cG1raWRfY291bnQgPiA0KSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+cG1raWQsIHBCdWYsIChwRHN0LT5wbWtpZF9jb3VudCAqIDE2KSk7CisJcEJ1ZiArPSAocERzdC0+cG1raWRfY291bnQgKiAxNik7CisJaWVsZW4gLT0gKHBEc3QtPnBta2lkX2NvdW50ICogMTYpOworCWlmICghaWVsZW4pIHsKKwkJcmV0dXJuIDBVOworCX0gZWxzZSB7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+Z3BfbWdtdF9jaXBoZXJfc3VpdGUsIHBCdWYsIDQpOworCX0KKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3Jzbi4gKi8KKworI2RlZmluZSBTaWdJZVJTTiAoMHgwMDUzKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfcnNuaWllKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJIHVpbnQ4X3QgaWVsZW4sCisJCQkJIHREb3QxMWZJRVJTTklJRSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5yc25pID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9yc25paWUuICovCisKKyNkZWZpbmUgU2lnSWVSU05JSUUgKDB4MDA1NCkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3Jzbl9vcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgdERvdDExZklFUlNOT3BhcXVlICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPm51bV9kYXRhID0gKHVpbnQ4X3QpKGllbGVuKTsKKwlpZiAoaWVsZW4gPiAyNTMpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5kYXRhLCBwQnVmLCAoaWVsZW4pKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3Jzbl9vcGFxdWUuICovCisKKyNkZWZpbmUgU2lnSWVSU05PcGFxdWUgKDB4MDA1NSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3N1cHBfY2hhbm5lbHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgICAgdERvdDExZklFU3VwcENoYW5uZWxzICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPm51bV9iYW5kcyA9ICh1aW50OF90KShpZWxlbiAvIDIpOworCWlmIChpZWxlbiA+IDQ4ICogMikgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmJhbmRzLCBwQnVmLCAoaWVsZW4pKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3N1cHBfY2hhbm5lbHMuICovCisKKyNkZWZpbmUgU2lnSWVTdXBwQ2hhbm5lbHMgKDB4MDA1NikKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3N1cHBfb3BlcmF0aW5nX2NsYXNzZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICAgICB1aW50OF90IGllbGVuLAorCQkJCQkgICAgICAgdERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+bnVtX2NsYXNzZXMgPSAodWludDhfdCkoaWVsZW4pOworCWlmIChpZWxlbiA+IDMyKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+Y2xhc3NlcywgcEJ1ZiwgKGllbGVuKSk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9zdXBwX29wZXJhdGluZ19jbGFzc2VzLiAqLworCisjZGVmaW5lIFNpZ0llU3VwcE9wZXJhdGluZ0NsYXNzZXMgKDB4MDA1NykKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3N1cHBfcmF0ZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgdERvdDExZklFU3VwcFJhdGVzICpwRHN0KQoreworCXVpbnQ4X3QgaTsKKwl1aW50OF90IHJhdGVfaW5keCA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJZm9yIChpID0gMDsgaSA8IGllbGVuOyBpKyspIHsKKwkJaWYgKChET1QxMUZfSVNfQkdfUkFURShwQnVmW2ldICYgMHg3RikpICYmCisJCQkocmF0ZV9pbmR4IDwgMTIpKSB7CisJCQlwRHN0LT5yYXRlc1tyYXRlX2luZHgrK10gPSBwQnVmW2ldOworCQl9CisJfQorCisJaWYgKHJhdGVfaW5keCA9PSAwKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCXBEc3QtPm51bV9yYXRlcyA9IHJhdGVfaW5keDsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3N1cHBfcmF0ZXMuICovCisKKyNkZWZpbmUgU2lnSWVTdXBwUmF0ZXMgKDB4MDA1OCkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3RpbSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkgICAgICB0RG90MTFmSUVUSU0gKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+ZHRpbV9jb3VudCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmR0aW1fcGVyaW9kID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+Ym1wY3RsID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+bnVtX3ZibXAgPSAodWludDhfdCkoaWVsZW4pOworCWlmIChpZWxlbiA+IDI1MSkgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnZibXAsIHBCdWYsIChpZWxlbikpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfdGltLiAqLworCisjZGVmaW5lIFNpZ0llVElNICgweDAwNTkpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV90cGNfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgIHREb3QxMWZJRVRQQ1JlcG9ydCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT50eF9wb3dlciA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmxpbmtfbWFyZ2luID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV90cGNfcmVwb3J0LiAqLworCisjZGVmaW5lIFNpZ0llVFBDUmVwb3J0ICgweDAwNWEpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV90cGNfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICB0RG90MTFmSUVUUENSZXF1ZXN0ICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfdHBjX3JlcXVlc3QuICovCisKKyNkZWZpbmUgU2lnSWVUUENSZXF1ZXN0ICgweDAwNWIpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV90aW1lX2FkdmVydGlzZW1lbnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICB1aW50OF90IGllbGVuLAorCQkJCQkgICAgdERvdDExZklFVGltZUFkdmVydGlzZW1lbnQgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+dGltaW5nX2NhcGFiaWxpdGllcyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+dGltZV92YWx1ZSwgcEJ1ZiwgMTApOworCXBCdWYgKz0gMTA7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTA7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT50aW1lX2Vycm9yLCBwQnVmLCA1KTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3RpbWVfYWR2ZXJ0aXNlbWVudC4gKi8KKworI2RlZmluZSBTaWdJZVRpbWVBZHZlcnRpc2VtZW50ICgweDAwNWMpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV90aW1lb3V0X2ludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICB1aW50OF90IGllbGVuLAorCQkJCQkgIHREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT50aW1lb3V0VHlwZSA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCWZyYW1lc250b2hsKHBDdHgsICZwRHN0LT50aW1lb3V0VmFsdWUsIHBCdWYsIDApOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfdGltZW91dF9pbnRlcnZhbC4gKi8KKworI2RlZmluZSBTaWdJZVRpbWVvdXRJbnRlcnZhbCAoMHgwMDVkKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdmh0X2V4dF9ic3NfbG9hZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkJIHVpbnQ4X3QgaWVsZW4sCisJCQkJCSB0RG90MTFmSUVWSFRFeHRCc3NMb2FkICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPm11TUlNT0NhcFN0YUNvdW50ID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+c3NVbmRlclV0aWwgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlwRHN0LT5Gb3J0eU1IelV0aWwgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlwRHN0LT5FaWdodHlNSHpVdGlsID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+T25lU2l4dHlNSHpVdGlsID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV92aHRfZXh0X2Jzc19sb2FkLiAqLworCisjZGVmaW5lIFNpZ0llVkhURXh0QnNzTG9hZCAoMHgwMDVlKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdmVuZG9yMV9pZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICB1aW50OF90IGllbGVuLAorCQkJCSAgICB0RG90MTFmSUVWZW5kb3IxSUUgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV92ZW5kb3IxX2llLiAqLworCisjZGVmaW5lIFNpZ0llVmVuZG9yMUlFICgweDAwNWYpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV92ZW5kb3IzX2llKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgIHREb3QxMWZJRVZlbmRvcjNJRSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3ZlbmRvcjNfaWUuICovCisKKyNkZWZpbmUgU2lnSWVWZW5kb3IzSUUgKDB4MDA2MCkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dhcGkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkgICAgICAgdERvdDExZklFV0FQSSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwl1aW50MTZfdCB0bXA1M19fOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT52ZXJzaW9uLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwlpZiAocERzdC0+dmVyc2lvbiAhPSAweDEpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBzdGF0dXMgfCBET1QxMUZfQkFEX0ZJWEVEX1ZBTFVFOworCX0KKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YWttX3N1aXRlX2NvdW50LCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwlpZiAocERzdC0+YWttX3N1aXRlX2NvdW50ID4gNCkgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmFrbV9zdWl0ZXMsIHBCdWYsIChwRHN0LT5ha21fc3VpdGVfY291bnQgKiA0KSk7CisJcEJ1ZiArPSAocERzdC0+YWttX3N1aXRlX2NvdW50ICogNCk7CisJaWVsZW4gLT0gKHBEc3QtPmFrbV9zdWl0ZV9jb3VudCAqIDQpOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJaWYgKHBEc3QtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50ID4gNCkgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnVuaWNhc3RfY2lwaGVyX3N1aXRlcywgcEJ1ZiwgKHBEc3QtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50ICogNCkpOworCXBCdWYgKz0gKHBEc3QtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50ICogNCk7CisJaWVsZW4gLT0gKHBEc3QtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50ICogNCk7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5tdWx0aWNhc3RfY2lwaGVyX3N1aXRlLCBwQnVmLCA0KTsKKwlwQnVmICs9IDQ7CisJaWVsZW4gLT0gKHVpbnQ4X3QpNDsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmdG1wNTNfXywgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09IDI7CisJcERzdC0+cHJlYXV0aCA9IHRtcDUzX18gPj4gMCAmIDB4MTsKKwlwRHN0LT5yZXNlcnZlZCA9IHRtcDUzX18gPj4gMSAmIDB4N2ZmZjsKKwlpZiAoIWllbGVuKSB7CisJCXBEc3QtPmJraWRfY291bnQgPSAwVTsKKwkJcmV0dXJuIDBVOworCX0gZWxzZSB7CisJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5ia2lkX2NvdW50LCBwQnVmLCAwKTsKKwkJcEJ1ZiArPSAyOworCQlpZWxlbiAtPSAodWludDhfdCkyOworCX0KKwlpZiAocERzdC0+YmtpZF9jb3VudCA+IDQpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5ia2lkLCBwQnVmLCAocERzdC0+YmtpZF9jb3VudCAqIDE2KSk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93YXBpLiAqLworCisjZGVmaW5lIFNpZ0llV0FQSSAoMHgwMDYxKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd2FwaV9vcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICB1aW50OF90IGllbGVuLAorCQkJCSAgICAgdERvdDExZklFV0FQSU9wYXF1ZSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5udW1fZGF0YSA9ICh1aW50OF90KShpZWxlbik7CisJaWYgKGllbGVuID4gMjUzKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+ZGF0YSwgcEJ1ZiwgKGllbGVuKSk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93YXBpX29wYXF1ZS4gKi8KKworI2RlZmluZSBTaWdJZVdBUElPcGFxdWUgKDB4MDA2MikKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dmYXRwYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCSB1aW50OF90IGllbGVuLAorCQkJCSB0RG90MTFmSUVXRkFUUEMgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+dHhQb3dlciA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPmxpbmtNYXJnaW4gPSAqcEJ1ZjsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3dmYXRwYy4gKi8KKworI2RlZmluZSBTaWdJZVdGQVRQQyAoMHgwMDYzKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd2ZkaWVfb3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICB1aW50OF90IGllbGVuLAorCQkJCSAgICAgIHREb3QxMWZJRVdGRElFT3BhcXVlICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPm51bV9kYXRhID0gKHVpbnQ4X3QpKGllbGVuKTsKKwlpZiAoaWVsZW4gPiAyNDkpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5kYXRhLCBwQnVmLCAoaWVsZW4pKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3dmZGllX29wYXF1ZS4gKi8KKworI2RlZmluZSBTaWdJZVdGRElFT3BhcXVlICgweDAwNjQpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93bW1fY2Fwcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICB0RG90MTFmSUVXTU1DYXBzICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQ4X3QgdG1wNTRfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT52ZXJzaW9uID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJaWYgKHBEc3QtPnZlcnNpb24gIT0gMHgxKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gc3RhdHVzIHwgRE9UMTFGX0JBRF9GSVhFRF9WQUxVRTsKKwl9CisJdG1wNTRfXyA9ICpwQnVmOworCXBEc3QtPnJlc2VydmVkID0gdG1wNTRfXyA+PiAwICYgMHhmOworCXBEc3QtPnFhY2sgPSB0bXA1NF9fID4+IDQgJiAweDE7CisJcERzdC0+cXVldWVfcmVxdWVzdCA9IHRtcDU0X18gPj4gNSAmIDB4MTsKKwlwRHN0LT50eG9wX3JlcXVlc3QgPSB0bXA1NF9fID4+IDYgJiAweDE7CisJcERzdC0+bW9yZV9hY2sgPSB0bXA1NF9fID4+IDcgJiAweDE7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93bW1fY2Fwcy4gKi8KKworI2RlZmluZSBTaWdJZVdNTUNhcHMgKDB4MDA2NSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dtbV9pbmZvX2FwKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgIHREb3QxMWZJRVdNTUluZm9BcCAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwl1aW50OF90IHRtcDU1X187CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+dmVyc2lvbiA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXRtcDU1X18gPSAqcEJ1ZjsKKwlwRHN0LT5wYXJhbV9zZXRfY291bnQgPSB0bXA1NV9fID4+IDAgJiAweGY7CisJcERzdC0+cmVzZXJ2ZWQgPSB0bXA1NV9fID4+IDQgJiAweDc7CisJcERzdC0+dWFwc2QgPSB0bXA1NV9fID4+IDcgJiAweDE7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93bW1faW5mb19hcC4gKi8KKworI2RlZmluZSBTaWdJZVdNTUluZm9BcCAoMHgwMDY2KQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd21tX2luZm9fc3RhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkJIHVpbnQ4X3QgaWVsZW4sCisJCQkJCSB0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwl1aW50OF90IHRtcDU2X187CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+dmVyc2lvbiA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXRtcDU2X18gPSAqcEJ1ZjsKKwlwRHN0LT5hY3ZvX3VhcHNkID0gdG1wNTZfXyA+PiAwICYgMHgxOworCXBEc3QtPmFjdmlfdWFwc2QgPSB0bXA1Nl9fID4+IDEgJiAweDE7CisJcERzdC0+YWNia191YXBzZCA9IHRtcDU2X18gPj4gMiAmIDB4MTsKKwlwRHN0LT5hY2JlX3VhcHNkID0gdG1wNTZfXyA+PiAzICYgMHgxOworCXBEc3QtPnJlc2VydmVkMSA9IHRtcDU2X18gPj4gNCAmIDB4MTsKKwlwRHN0LT5tYXhfc3BfbGVuZ3RoID0gdG1wNTZfXyA+PiA1ICYgMHgzOworCXBEc3QtPnJlc2VydmVkMiA9IHRtcDU2X18gPj4gNyAmIDB4MTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3dtbV9pbmZvX3N0YXRpb24uICovCisKKyNkZWZpbmUgU2lnSWVXTU1JbmZvU3RhdGlvbiAoMHgwMDY3KQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd21tX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICB1aW50OF90IGllbGVuLAorCQkJCSAgICB0RG90MTFmSUVXTU1QYXJhbXMgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDhfdCB0bXA1N19fOworCXVpbnQ4X3QgdG1wNThfXzsKKwl1aW50OF90IHRtcDU5X187CisJdWludDhfdCB0bXA2MF9fOworCXVpbnQ4X3QgdG1wNjFfXzsKKwl1aW50OF90IHRtcDYyX187CisJdWludDhfdCB0bXA2M19fOworCXVpbnQ4X3QgdG1wNjRfXzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT52ZXJzaW9uID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJaWYgKHBEc3QtPnZlcnNpb24gIT0gMHgxKSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gc3RhdHVzIHwgRE9UMTFGX0JBRF9GSVhFRF9WQUxVRTsKKwl9CisJcERzdC0+cW9zSW5mbyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPnJlc2VydmVkMiA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXRtcDU3X18gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gMTsKKwlwRHN0LT5hY2JlX2FpZnNuID0gdG1wNTdfXyA+PiAwICYgMHhmOworCXBEc3QtPmFjYmVfYWNtID0gdG1wNTdfXyA+PiA0ICYgMHgxOworCXBEc3QtPmFjYmVfYWNpID0gdG1wNTdfXyA+PiA1ICYgMHgzOworCXBEc3QtPnVudXNlZDEgPSB0bXA1N19fID4+IDcgJiAweDE7CisJdG1wNThfXyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAxOworCXBEc3QtPmFjYmVfYWN3bWluID0gdG1wNThfXyA+PiAwICYgMHhmOworCXBEc3QtPmFjYmVfYWN3bWF4ID0gdG1wNThfXyA+PiA0ICYgMHhmOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5hY2JlX3R4b3BsaW1pdCwgcEJ1ZiwgMCk7CisJcEJ1ZiArPSAyOworCWllbGVuIC09ICh1aW50OF90KTI7CisJdG1wNTlfXyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAxOworCXBEc3QtPmFjYmtfYWlmc24gPSB0bXA1OV9fID4+IDAgJiAweGY7CisJcERzdC0+YWNia19hY20gPSB0bXA1OV9fID4+IDQgJiAweDE7CisJcERzdC0+YWNia19hY2kgPSB0bXA1OV9fID4+IDUgJiAweDM7CisJcERzdC0+dW51c2VkMiA9IHRtcDU5X18gPj4gNyAmIDB4MTsKKwl0bXA2MF9fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09IDE7CisJcERzdC0+YWNia19hY3dtaW4gPSB0bXA2MF9fID4+IDAgJiAweGY7CisJcERzdC0+YWNia19hY3dtYXggPSB0bXA2MF9fID4+IDQgJiAweGY7CisJZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmFjYmtfdHhvcGxpbWl0LCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwl0bXA2MV9fID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09IDE7CisJcERzdC0+YWN2aV9haWZzbiA9IHRtcDYxX18gPj4gMCAmIDB4ZjsKKwlwRHN0LT5hY3ZpX2FjbSA9IHRtcDYxX18gPj4gNCAmIDB4MTsKKwlwRHN0LT5hY3ZpX2FjaSA9IHRtcDYxX18gPj4gNSAmIDB4MzsKKwlwRHN0LT51bnVzZWQzID0gdG1wNjFfXyA+PiA3ICYgMHgxOworCXRtcDYyX18gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gMTsKKwlwRHN0LT5hY3ZpX2Fjd21pbiA9IHRtcDYyX18gPj4gMCAmIDB4ZjsKKwlwRHN0LT5hY3ZpX2Fjd21heCA9IHRtcDYyX18gPj4gNCAmIDB4ZjsKKwlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YWN2aV90eG9wbGltaXQsIHBCdWYsIDApOworCXBCdWYgKz0gMjsKKwlpZWxlbiAtPSAodWludDhfdCkyOworCXRtcDYzX18gPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gMTsKKwlwRHN0LT5hY3ZvX2FpZnNuID0gdG1wNjNfXyA+PiAwICYgMHhmOworCXBEc3QtPmFjdm9fYWNtID0gdG1wNjNfXyA+PiA0ICYgMHgxOworCXBEc3QtPmFjdm9fYWNpID0gdG1wNjNfXyA+PiA1ICYgMHgzOworCXBEc3QtPnVudXNlZDQgPSB0bXA2M19fID4+IDcgJiAweDE7CisJdG1wNjRfXyA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAxOworCXBEc3QtPmFjdm9fYWN3bWluID0gdG1wNjRfXyA+PiAwICYgMHhmOworCXBEc3QtPmFjdm9fYWN3bWF4ID0gdG1wNjRfXyA+PiA0ICYgMHhmOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5hY3ZvX3R4b3BsaW1pdCwgcEJ1ZiwgMCk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93bW1fcGFyYW1zLiAqLworCisjZGVmaW5lIFNpZ0llV01NUGFyYW1zICgweDAwNjgpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93cGEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgICB1aW50OF90IGllbGVuLAorCQkJICAgICAgdERvdDExZklFV1BBICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT52ZXJzaW9uLCBwQnVmLCAwKTsKKwlwQnVmICs9IDI7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwlpZiAocERzdC0+dmVyc2lvbiAhPSAweDEpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBzdGF0dXMgfCBET1QxMUZfQkFEX0ZJWEVEX1ZBTFVFOworCX0KKwlpZiAoIWllbGVuKSB7CisJCXBEc3QtPm11bHRpY2FzdF9jaXBoZXJfcHJlc2VudCA9IDBVOworCQlwRHN0LT51bmljYXN0X2NpcGhlcl9jb3VudCA9IDBVOworCQlwRHN0LT5hdXRoX3N1aXRlX2NvdW50ID0gMFU7CisJCXJldHVybiAwVTsKKwl9IGVsc2UgeworCQlwRHN0LT5tdWx0aWNhc3RfY2lwaGVyX3ByZXNlbnQgPSAxVTsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5tdWx0aWNhc3RfY2lwaGVyLCBwQnVmLCA0KTsKKwkJcEJ1ZiArPSA0OworCQlpZWxlbiAtPSAodWludDhfdCk0OworCX0KKwlpZiAoIWllbGVuKSB7CisJCXBEc3QtPnVuaWNhc3RfY2lwaGVyX2NvdW50ID0gMFU7CisJCXBEc3QtPmF1dGhfc3VpdGVfY291bnQgPSAwVTsKKwkJcmV0dXJuIDBVOworCX0gZWxzZSB7CisJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT51bmljYXN0X2NpcGhlcl9jb3VudCwgcEJ1ZiwgMCk7CisJCXBCdWYgKz0gMjsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwl9CisJaWYgKHBEc3QtPnVuaWNhc3RfY2lwaGVyX2NvdW50ID4gNCkgeworCQlwRHN0LT5wcmVzZW50ID0gMDsKKwkJcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKwl9CisKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnVuaWNhc3RfY2lwaGVycywgcEJ1ZiwgKHBEc3QtPnVuaWNhc3RfY2lwaGVyX2NvdW50ICogNCkpOworCXBCdWYgKz0gKHBEc3QtPnVuaWNhc3RfY2lwaGVyX2NvdW50ICogNCk7CisJaWVsZW4gLT0gKHBEc3QtPnVuaWNhc3RfY2lwaGVyX2NvdW50ICogNCk7CisJaWYgKCFpZWxlbikgeworCQlwRHN0LT5hdXRoX3N1aXRlX2NvdW50ID0gMFU7CisJCXJldHVybiAwVTsKKwl9IGVsc2UgeworCQlmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YXV0aF9zdWl0ZV9jb3VudCwgcEJ1ZiwgMCk7CisJCXBCdWYgKz0gMjsKKwkJaWVsZW4gLT0gKHVpbnQ4X3QpMjsKKwl9CisJaWYgKHBEc3QtPmF1dGhfc3VpdGVfY291bnQgPiA0KSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+YXV0aF9zdWl0ZXMsIHBCdWYsIChwRHN0LT5hdXRoX3N1aXRlX2NvdW50ICogNCkpOworCXBCdWYgKz0gKHBEc3QtPmF1dGhfc3VpdGVfY291bnQgKiA0KTsKKwlpZWxlbiAtPSAocERzdC0+YXV0aF9zdWl0ZV9jb3VudCAqIDQpOworCWlmICghaWVsZW4pIHsKKwkJcmV0dXJuIDBVOworCX0gZWxzZSB7CisJCWZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jYXBzLCBwQnVmLCAwKTsKKwl9CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93cGEuICovCisKKyNkZWZpbmUgU2lnSWVXUEEgKDB4MDA2OSkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dwYV9vcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgdERvdDExZklFV1BBT3BhcXVlICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPm51bV9kYXRhID0gKHVpbnQ4X3QpKGllbGVuKTsKKwlpZiAoaWVsZW4gPiAyNDkpIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5kYXRhLCBwQnVmLCAoaWVsZW4pKTsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3dwYV9vcGFxdWUuICovCisKKyNkZWZpbmUgU2lnSWVXUEFPcGFxdWUgKDB4MDA2YSkKKworCitzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19XU0NbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdTQywgVmVyc2lvbiksIG9mZnNldG9mKHREb3QxMWZUTFZWZXJzaW9uLCBwcmVzZW50KSwKKwkiVmVyc2lvbiIsIFNpZ1RsdlZlcnNpb24sIERPVDExRl9UTFZfVkVSU0lPTiwgMCwgNSwgNSwgMSwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdTQywgV1BTU3RhdGUpLCBvZmZzZXRvZih0RG90MTFmVExWV1BTU3RhdGUsIHByZXNlbnQpLAorCSJXUFNTdGF0ZSIsIFNpZ1RsdldQU1N0YXRlLCBET1QxMUZfVExWX1dQU1NUQVRFLCAwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV1NDLCBBUFNldHVwTG9ja2VkKSwKKwlvZmZzZXRvZih0RG90MTFmVExWQVBTZXR1cExvY2tlZCwgcHJlc2VudCksICJBUFNldHVwTG9ja2VkIiwKKwlTaWdUbHZBUFNldHVwTG9ja2VkLCBET1QxMUZfVExWX0FQU0VUVVBMT0NLRUQsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXU0MsIFNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyksCisJb2Zmc2V0b2YodERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcywgcHJlc2VudCksCisJIlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyIsIFNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcywKKwlET1QxMUZfVExWX1NFTEVDVEVEUkVHSVNUUkFSQ09ORklHTUVUSE9EUywgMCwgNiwgNiwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdTQywgVVVJRF9FKSwgb2Zmc2V0b2YodERvdDExZlRMVlVVSURfRSwgcHJlc2VudCksCisJIlVVSURfRSIsIFNpZ1RsdlVVSURfRSwgRE9UMTFGX1RMVl9VVUlEX0UsIDAsIDIwLCAyMCwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdTQywgVVVJRF9SKSwgb2Zmc2V0b2YodERvdDExZlRMVlVVSURfUiwgcHJlc2VudCksCisJIlVVSURfUiIsIFNpZ1RsdlVVSURfUiwgRE9UMTFGX1RMVl9VVUlEX1IsIDAsIDIwLCAyMCwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdTQywgUkZCYW5kcyksIG9mZnNldG9mKHREb3QxMWZUTFZSRkJhbmRzLCBwcmVzZW50KSwKKwkiUkZCYW5kcyIsIFNpZ1RsdlJGQmFuZHMsIERPVDExRl9UTFZfUkZCQU5EUywgMCwgNSwgNSwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdTQywgU2VsZWN0ZWRSZWdpc3RyYXIpLAorCW9mZnNldG9mKHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhciwgcHJlc2VudCksICJTZWxlY3RlZFJlZ2lzdHJhciIsCisJU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXIsIERPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVIsCisJMCwgNSwgNSwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdTQywgQ29uZmlnTWV0aG9kcyksCisJb2Zmc2V0b2YodERvdDExZlRMVkNvbmZpZ01ldGhvZHMsIHByZXNlbnQpLCAiQ29uZmlnTWV0aG9kcyIsCisJU2lnVGx2Q29uZmlnTWV0aG9kcywgRE9UMTFGX1RMVl9DT05GSUdNRVRIT0RTLCAwLCA2LCA2LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV1NDLCBBc3NvY2lhdGlvblN0YXRlKSwKKwlvZmZzZXRvZih0RG90MTFmVExWQXNzb2NpYXRpb25TdGF0ZSwgcHJlc2VudCksICJBc3NvY2lhdGlvblN0YXRlIiwKKwlTaWdUbHZBc3NvY2lhdGlvblN0YXRlLCBET1QxMUZfVExWX0FTU09DSUFUSU9OU1RBVEUsCisJMCwgNiwgNiwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdTQywgQ29uZmlndXJhdGlvbkVycm9yKSwKKwlvZmZzZXRvZih0RG90MTFmVExWQ29uZmlndXJhdGlvbkVycm9yLCBwcmVzZW50KSwgIkNvbmZpZ3VyYXRpb25FcnJvciIsCisJU2lnVGx2Q29uZmlndXJhdGlvbkVycm9yLCBET1QxMUZfVExWX0NPTkZJR1VSQVRJT05FUlJPUiwKKwkwLCA2LCA2LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV1NDLCBNYW51ZmFjdHVyZXIpLCBvZmZzZXRvZih0RG90MTFmVExWTWFudWZhY3R1cmVyLAorCXByZXNlbnQpLCAiTWFudWZhY3R1cmVyIiwgU2lnVGx2TWFudWZhY3R1cmVyLCBET1QxMUZfVExWX01BTlVGQUNUVVJFUiwKKwkwLCA0LCA2OCwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdTQywgTW9kZWxOYW1lKSwgb2Zmc2V0b2YodERvdDExZlRMVk1vZGVsTmFtZSwKKwlwcmVzZW50KSwgIk1vZGVsTmFtZSIsIFNpZ1Rsdk1vZGVsTmFtZSwgRE9UMTFGX1RMVl9NT0RFTE5BTUUsCisJMCwgNCwgMzYsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXU0MsIE1vZGVsTnVtYmVyKSwgb2Zmc2V0b2YodERvdDExZlRMVk1vZGVsTnVtYmVyLAorCXByZXNlbnQpLCAiTW9kZWxOdW1iZXIiLCBTaWdUbHZNb2RlbE51bWJlciwgRE9UMTFGX1RMVl9NT0RFTE5VTUJFUiwKKwkwLCA0LCAzNiwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdTQywgU2VyaWFsTnVtYmVyKSwgb2Zmc2V0b2YodERvdDExZlRMVlNlcmlhbE51bWJlciwKKwlwcmVzZW50KSwgIlNlcmlhbE51bWJlciIsIFNpZ1RsdlNlcmlhbE51bWJlciwgRE9UMTFGX1RMVl9TRVJJQUxOVU1CRVIsCisJMCwgNCwgMzYsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXU0MsIERldmljZU5hbWUpLCBvZmZzZXRvZih0RG90MTFmVExWRGV2aWNlTmFtZSwKKwlwcmVzZW50KSwgIkRldmljZU5hbWUiLCBTaWdUbHZEZXZpY2VOYW1lLCBET1QxMUZfVExWX0RFVklDRU5BTUUsCisJMCwgNCwgMzYsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXU0MsIERldmljZVBhc3N3b3JkSUQpLAorCW9mZnNldG9mKHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElELCBwcmVzZW50KSwgIkRldmljZVBhc3N3b3JkSUQiLAorCVNpZ1RsdkRldmljZVBhc3N3b3JkSUQsIERPVDExRl9UTFZfREVWSUNFUEFTU1dPUkRJRCwKKwkwLCA2LCA2LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV1NDLCBQcmltYXJ5RGV2aWNlVHlwZSksCisJb2Zmc2V0b2YodERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlLCBwcmVzZW50KSwgIlByaW1hcnlEZXZpY2VUeXBlIiwKKwlTaWdUbHZQcmltYXJ5RGV2aWNlVHlwZSwgRE9UMTFGX1RMVl9QUklNQVJZREVWSUNFVFlQRSwKKwkwLCAxMiwgMTIsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXU0MsIFJlcXVlc3RUeXBlKSwgb2Zmc2V0b2YodERvdDExZlRMVlJlcXVlc3RUeXBlLAorCXByZXNlbnQpLCAiUmVxdWVzdFR5cGUiLCBTaWdUbHZSZXF1ZXN0VHlwZSwgRE9UMTFGX1RMVl9SRVFVRVNUVFlQRSwKKwkwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV1NDLCBSZXNwb25zZVR5cGUpLCBvZmZzZXRvZih0RG90MTFmVExWUmVzcG9uc2VUeXBlLAorCXByZXNlbnQpLCAiUmVzcG9uc2VUeXBlIiwgU2lnVGx2UmVzcG9uc2VUeXBlLCBET1QxMUZfVExWX1JFU1BPTlNFVFlQRSwKKwkwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV1NDLCBWZW5kb3JFeHRlbnNpb24pLAorCW9mZnNldG9mKHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24sIHByZXNlbnQpLCAiVmVuZG9yRXh0ZW5zaW9uIiwKKwlTaWdUbHZWZW5kb3JFeHRlbnNpb24sIERPVDExRl9UTFZfVkVORE9SRVhURU5TSU9OLAorCTAsIDcsIDIxLCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV1NDLCBSZXF1ZXN0RGV2aWNlVHlwZSksCisJb2Zmc2V0b2YodERvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlLCBwcmVzZW50KSwgIlJlcXVlc3REZXZpY2VUeXBlIiwKKwlTaWdUbHZSZXF1ZXN0RGV2aWNlVHlwZSwgRE9UMTFGX1RMVl9SRVFVRVNUREVWSUNFVFlQRSwKKwkwLCAxMiwgMTIsIDAsIDIsIDIsIDEsIH0sCisJezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCit9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dzYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkgICAgICB0RG90MTFmSUVXU0MgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlzdGF0dXMgPSB1bnBhY2tfdGx2X2NvcmUocEN0eCwgcEJ1ZiwgaWVsZW4sCisJCQlUTFZTX1dTQywKKwkJCSh1aW50OF90ICopcERzdCwgc2l6ZW9mKCpwRHN0KSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfd3NjLiAqLworCisjZGVmaW5lIFNpZ0llV1NDICgweDAwNmIpCisKKworc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfV3NjQXNzb2NSZXFbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY0Fzc29jUmVxLCBWZXJzaW9uKSwgb2Zmc2V0b2YodERvdDExZlRMVlZlcnNpb24sCisJcHJlc2VudCksICJWZXJzaW9uIiwgU2lnVGx2VmVyc2lvbiwgRE9UMTFGX1RMVl9WRVJTSU9OLAorCTAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NBc3NvY1JlcSwgUmVxdWVzdFR5cGUpLAorCW9mZnNldG9mKHREb3QxMWZUTFZSZXF1ZXN0VHlwZSwgcHJlc2VudCksICJSZXF1ZXN0VHlwZSIsCisJU2lnVGx2UmVxdWVzdFR5cGUsIERPVDExRl9UTFZfUkVRVUVTVFRZUEUsIDAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NBc3NvY1JlcSwgVmVuZG9yRXh0ZW5zaW9uKSwKKwlvZmZzZXRvZih0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uLCBwcmVzZW50KSwgIlZlbmRvckV4dGVuc2lvbiIsCisJU2lnVGx2VmVuZG9yRXh0ZW5zaW9uLCBET1QxMUZfVExWX1ZFTkRPUkVYVEVOU0lPTiwKKwkwLCA3LCAyMSwgMCwgMiwgMiwgMSwgfSwKKwl7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKK307CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd3NjX2Fzc29jX3JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgICB0RG90MTFmSUVXc2NBc3NvY1JlcSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCXBEc3QtPnByZXNlbnQgPSAxOworCXN0YXR1cyA9IHVucGFja190bHZfY29yZShwQ3R4LCBwQnVmLCBpZWxlbiwKKwkJCVRMVlNfV3NjQXNzb2NSZXEsCisJCQkodWludDhfdCAqKXBEc3QsIHNpemVvZigqcERzdCkpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3dzY19hc3NvY19yZXEuICovCisKKyNkZWZpbmUgU2lnSWVXc2NBc3NvY1JlcSAoMHgwMDZjKQorCisKK3N0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1dzY0Fzc29jUmVzW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NBc3NvY1JlcywgVmVyc2lvbiksIG9mZnNldG9mKHREb3QxMWZUTFZWZXJzaW9uLAorCXByZXNlbnQpLCAiVmVyc2lvbiIsIFNpZ1RsdlZlcnNpb24sIERPVDExRl9UTFZfVkVSU0lPTiwKKwkwLCA1LCA1LCAxLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQXNzb2NSZXMsIFJlc3BvbnNlVHlwZSksCisJb2Zmc2V0b2YodERvdDExZlRMVlJlc3BvbnNlVHlwZSwgcHJlc2VudCksICJSZXNwb25zZVR5cGUiLAorCVNpZ1RsdlJlc3BvbnNlVHlwZSwgRE9UMTFGX1RMVl9SRVNQT05TRVRZUEUsIDAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NBc3NvY1JlcywgVmVuZG9yRXh0ZW5zaW9uKSwKKwlvZmZzZXRvZih0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uLCBwcmVzZW50KSwgIlZlbmRvckV4dGVuc2lvbiIsCisJU2lnVGx2VmVuZG9yRXh0ZW5zaW9uLCBET1QxMUZfVExWX1ZFTkRPUkVYVEVOU0lPTiwKKwkwLCA3LCAyMSwgMCwgMiwgMiwgMSwgfSwKKwl7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKK307CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd3NjX2Fzc29jX3Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgICB0RG90MTFmSUVXc2NBc3NvY1JlcyAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCXBEc3QtPnByZXNlbnQgPSAxOworCXN0YXR1cyA9IHVucGFja190bHZfY29yZShwQ3R4LCBwQnVmLCBpZWxlbiwKKwkJCVRMVlNfV3NjQXNzb2NSZXMsCisJCQkodWludDhfdCAqKXBEc3QsIHNpemVvZigqcERzdCkpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3dzY19hc3NvY19yZXMuICovCisKKyNkZWZpbmUgU2lnSWVXc2NBc3NvY1JlcyAoMHgwMDZkKQorCisKK3N0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1dzY0JlYWNvbltdID0geworCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uLCBWZXJzaW9uKSwgb2Zmc2V0b2YodERvdDExZlRMVlZlcnNpb24sCisJcHJlc2VudCksICJWZXJzaW9uIiwgU2lnVGx2VmVyc2lvbiwgRE9UMTFGX1RMVl9WRVJTSU9OLAorCTAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb24sIFdQU1N0YXRlKSwgb2Zmc2V0b2YodERvdDExZlRMVldQU1N0YXRlLAorCXByZXNlbnQpLCAiV1BTU3RhdGUiLCBTaWdUbHZXUFNTdGF0ZSwgRE9UMTFGX1RMVl9XUFNTVEFURSwKKwkwLCA1LCA1LCAxLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uLCBBUFNldHVwTG9ja2VkKSwKKwlvZmZzZXRvZih0RG90MTFmVExWQVBTZXR1cExvY2tlZCwgcHJlc2VudCksICJBUFNldHVwTG9ja2VkIiwKKwlTaWdUbHZBUFNldHVwTG9ja2VkLCBET1QxMUZfVExWX0FQU0VUVVBMT0NLRUQsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb24sIFNlbGVjdGVkUmVnaXN0cmFyKSwKKwlvZmZzZXRvZih0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIsIHByZXNlbnQpLCAiU2VsZWN0ZWRSZWdpc3RyYXIiLAorCVNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyLCBET1QxMUZfVExWX1NFTEVDVEVEUkVHSVNUUkFSLAorCTAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb24sIERldmljZVBhc3N3b3JkSUQpLAorCW9mZnNldG9mKHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElELCBwcmVzZW50KSwgIkRldmljZVBhc3N3b3JkSUQiLAorCVNpZ1RsdkRldmljZVBhc3N3b3JkSUQsIERPVDExRl9UTFZfREVWSUNFUEFTU1dPUkRJRCwKKwkwLCA2LCA2LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uLCBTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMpLAorCW9mZnNldG9mKHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMsIHByZXNlbnQpLAorCSJTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMiLCBTaWdUbHZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMsCisJRE9UMTFGX1RMVl9TRUxFQ1RFRFJFR0lTVFJBUkNPTkZJR01FVEhPRFMsIDAsIDYsIDYsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb24sIFVVSURfRSksIG9mZnNldG9mKHREb3QxMWZUTFZVVUlEX0UsCisJcHJlc2VudCksICJVVUlEX0UiLCBTaWdUbHZVVUlEX0UsIERPVDExRl9UTFZfVVVJRF9FLAorCTAsIDIwLCAyMCwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvbiwgUkZCYW5kcyksIG9mZnNldG9mKHREb3QxMWZUTFZSRkJhbmRzLAorCXByZXNlbnQpLCAiUkZCYW5kcyIsIFNpZ1RsdlJGQmFuZHMsIERPVDExRl9UTFZfUkZCQU5EUywKKwkwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uLCBWZW5kb3JFeHRlbnNpb24pLAorCW9mZnNldG9mKHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24sIHByZXNlbnQpLCAiVmVuZG9yRXh0ZW5zaW9uIiwKKwlTaWdUbHZWZW5kb3JFeHRlbnNpb24sIERPVDExRl9UTFZfVkVORE9SRVhURU5TSU9OLAorCTAsIDcsIDIxLCAwLCAyLCAyLCAxLCB9LAorCXswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93c2NfYmVhY29uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgIHREb3QxMWZJRVdzY0JlYWNvbiAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCXBEc3QtPnByZXNlbnQgPSAxOworCXN0YXR1cyA9IHVucGFja190bHZfY29yZShwQ3R4LCBwQnVmLCBpZWxlbiwKKwkJCVRMVlNfV3NjQmVhY29uLAorCQkJKHVpbnQ4X3QgKilwRHN0LCBzaXplb2YoKnBEc3QpKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93c2NfYmVhY29uLiAqLworCisjZGVmaW5lIFNpZ0llV3NjQmVhY29uICgweDAwNmUpCisKKworc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfV3NjQmVhY29uUHJvYmVSZXNbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzLCBWZXJzaW9uKSwKKwlvZmZzZXRvZih0RG90MTFmVExWVmVyc2lvbiwgcHJlc2VudCksICJWZXJzaW9uIiwgU2lnVGx2VmVyc2lvbiwKKwlET1QxMUZfVExWX1ZFUlNJT04sIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgV1BTU3RhdGUpLAorCW9mZnNldG9mKHREb3QxMWZUTFZXUFNTdGF0ZSwgcHJlc2VudCksICJXUFNTdGF0ZSIsIFNpZ1RsdldQU1N0YXRlLAorCURPVDExRl9UTFZfV1BTU1RBVEUsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgQVBTZXR1cExvY2tlZCksCisJb2Zmc2V0b2YodERvdDExZlRMVkFQU2V0dXBMb2NrZWQsIHByZXNlbnQpLCAiQVBTZXR1cExvY2tlZCIsCisJU2lnVGx2QVBTZXR1cExvY2tlZCwgRE9UMTFGX1RMVl9BUFNFVFVQTE9DS0VELCAwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIFNlbGVjdGVkUmVnaXN0cmFyKSwKKwlvZmZzZXRvZih0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIsIHByZXNlbnQpLCAiU2VsZWN0ZWRSZWdpc3RyYXIiLAorCVNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyLCBET1QxMUZfVExWX1NFTEVDVEVEUkVHSVNUUkFSLAorCTAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgRGV2aWNlUGFzc3dvcmRJRCksCisJb2Zmc2V0b2YodERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQsIHByZXNlbnQpLCAiRGV2aWNlUGFzc3dvcmRJRCIsCisJU2lnVGx2RGV2aWNlUGFzc3dvcmRJRCwgRE9UMTFGX1RMVl9ERVZJQ0VQQVNTV09SRElELAorCTAsIDYsIDYsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzKSwKKwlvZmZzZXRvZih0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLCBwcmVzZW50KSwKKwkiU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzIiwgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLAorCURPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVJDT05GSUdNRVRIT0RTLCAwLCA2LCA2LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIFJlc3BvbnNlVHlwZSksCisJb2Zmc2V0b2YodERvdDExZlRMVlJlc3BvbnNlVHlwZSwgcHJlc2VudCksICJSZXNwb25zZVR5cGUiLAorCVNpZ1RsdlJlc3BvbnNlVHlwZSwgRE9UMTFGX1RMVl9SRVNQT05TRVRZUEUsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgVVVJRF9FKSwKKwlvZmZzZXRvZih0RG90MTFmVExWVVVJRF9FLCBwcmVzZW50KSwgIlVVSURfRSIsIFNpZ1RsdlVVSURfRSwKKwlET1QxMUZfVExWX1VVSURfRSwgMCwgMjAsIDIwLCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIE1hbnVmYWN0dXJlciksCisJb2Zmc2V0b2YodERvdDExZlRMVk1hbnVmYWN0dXJlciwgcHJlc2VudCksICJNYW51ZmFjdHVyZXIiLAorCVNpZ1Rsdk1hbnVmYWN0dXJlciwgRE9UMTFGX1RMVl9NQU5VRkFDVFVSRVIsIDAsIDQsIDY4LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIE1vZGVsTmFtZSksCisJb2Zmc2V0b2YodERvdDExZlRMVk1vZGVsTmFtZSwgcHJlc2VudCksICJNb2RlbE5hbWUiLCBTaWdUbHZNb2RlbE5hbWUsCisJRE9UMTFGX1RMVl9NT0RFTE5BTUUsIDAsIDQsIDM2LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIE1vZGVsTnVtYmVyKSwKKwlvZmZzZXRvZih0RG90MTFmVExWTW9kZWxOdW1iZXIsIHByZXNlbnQpLCAiTW9kZWxOdW1iZXIiLAorCVNpZ1Rsdk1vZGVsTnVtYmVyLCBET1QxMUZfVExWX01PREVMTlVNQkVSLCAwLCA0LCAzNiwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzLCBTZXJpYWxOdW1iZXIpLAorCW9mZnNldG9mKHREb3QxMWZUTFZTZXJpYWxOdW1iZXIsIHByZXNlbnQpLCAiU2VyaWFsTnVtYmVyIiwKKwlTaWdUbHZTZXJpYWxOdW1iZXIsIERPVDExRl9UTFZfU0VSSUFMTlVNQkVSLCAwLCA0LCAzNiwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzLCBQcmltYXJ5RGV2aWNlVHlwZSksCisJb2Zmc2V0b2YodERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlLCBwcmVzZW50KSwgIlByaW1hcnlEZXZpY2VUeXBlIiwKKwlTaWdUbHZQcmltYXJ5RGV2aWNlVHlwZSwgRE9UMTFGX1RMVl9QUklNQVJZREVWSUNFVFlQRSwKKwkwLCAxMiwgMTIsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgRGV2aWNlTmFtZSksCisJb2Zmc2V0b2YodERvdDExZlRMVkRldmljZU5hbWUsIHByZXNlbnQpLCAiRGV2aWNlTmFtZSIsIFNpZ1RsdkRldmljZU5hbWUsCisJRE9UMTFGX1RMVl9ERVZJQ0VOQU1FLCAwLCA0LCAzNiwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzLCBDb25maWdNZXRob2RzKSwKKwlvZmZzZXRvZih0RG90MTFmVExWQ29uZmlnTWV0aG9kcywgcHJlc2VudCksICJDb25maWdNZXRob2RzIiwKKwlTaWdUbHZDb25maWdNZXRob2RzLCBET1QxMUZfVExWX0NPTkZJR01FVEhPRFMsIDAsIDYsIDYsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgUkZCYW5kcyksCisJb2Zmc2V0b2YodERvdDExZlRMVlJGQmFuZHMsIHByZXNlbnQpLCAiUkZCYW5kcyIsIFNpZ1RsdlJGQmFuZHMsCisJRE9UMTFGX1RMVl9SRkJBTkRTLCAwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIFZlbmRvckV4dGVuc2lvbiksCisJb2Zmc2V0b2YodERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiwgcHJlc2VudCksICJWZW5kb3JFeHRlbnNpb24iLAorCVNpZ1RsdlZlbmRvckV4dGVuc2lvbiwgRE9UMTFGX1RMVl9WRU5ET1JFWFRFTlNJT04sCisJMCwgNywgMjEsIDAsIDIsIDIsIDEsIH0sCisJezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCit9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dzY19iZWFjb25fcHJvYmVfcmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICAgdWludDhfdCBpZWxlbiwKKwkJCQkJICAgIHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJcERzdC0+cHJlc2VudCA9IDE7CisJc3RhdHVzID0gdW5wYWNrX3Rsdl9jb3JlKHBDdHgsIHBCdWYsIGllbGVuLAorCQkJVExWU19Xc2NCZWFjb25Qcm9iZVJlcywKKwkJCSh1aW50OF90ICopcERzdCwgc2l6ZW9mKCpwRHN0KSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfd3NjX2JlYWNvbl9wcm9iZV9yZXMuICovCisKKyNkZWZpbmUgU2lnSWVXc2NCZWFjb25Qcm9iZVJlcyAoMHgwMDZmKQorCisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd3NjX2llX29wYXF1ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkgICAgICB0RG90MTFmSUVXc2NJRU9wYXF1ZSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5udW1fZGF0YSA9ICh1aW50OF90KShpZWxlbik7CisJaWYgKGllbGVuID4gMjQ5KSB7CisJCXBEc3QtPnByZXNlbnQgPSAwOworCQlyZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworCX0KKworCURPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+ZGF0YSwgcEJ1ZiwgKGllbGVuKSk7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93c2NfaWVfb3BhcXVlLiAqLworCisjZGVmaW5lIFNpZ0llV3NjSUVPcGFxdWUgKDB4MDA3MCkKKworCitzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19Xc2NQcm9iZVJlcVtdID0geworCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIFZlcnNpb24pLCBvZmZzZXRvZih0RG90MTFmVExWVmVyc2lvbiwKKwlwcmVzZW50KSwgIlZlcnNpb24iLCBTaWdUbHZWZXJzaW9uLCBET1QxMUZfVExWX1ZFUlNJT04sCisJMCwgNSwgNSwgMSwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBSZXF1ZXN0VHlwZSksCisJb2Zmc2V0b2YodERvdDExZlRMVlJlcXVlc3RUeXBlLCBwcmVzZW50KSwgIlJlcXVlc3RUeXBlIiwKKwlTaWdUbHZSZXF1ZXN0VHlwZSwgRE9UMTFGX1RMVl9SRVFVRVNUVFlQRSwgMCwgNSwgNSwgMSwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBDb25maWdNZXRob2RzKSwKKwlvZmZzZXRvZih0RG90MTFmVExWQ29uZmlnTWV0aG9kcywgcHJlc2VudCksICJDb25maWdNZXRob2RzIiwKKwlTaWdUbHZDb25maWdNZXRob2RzLCBET1QxMUZfVExWX0NPTkZJR01FVEhPRFMsIDAsIDYsIDYsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcSwgVVVJRF9FKSwgb2Zmc2V0b2YodERvdDExZlRMVlVVSURfRSwKKwlwcmVzZW50KSwgIlVVSURfRSIsIFNpZ1RsdlVVSURfRSwgRE9UMTFGX1RMVl9VVUlEX0UsCisJMCwgMjAsIDIwLCAxLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIFByaW1hcnlEZXZpY2VUeXBlKSwKKwlvZmZzZXRvZih0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGUsIHByZXNlbnQpLCAiUHJpbWFyeURldmljZVR5cGUiLAorCVNpZ1RsdlByaW1hcnlEZXZpY2VUeXBlLCBET1QxMUZfVExWX1BSSU1BUllERVZJQ0VUWVBFLAorCTAsIDEyLCAxMiwgMSwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBSRkJhbmRzKSwgb2Zmc2V0b2YodERvdDExZlRMVlJGQmFuZHMsCisJcHJlc2VudCksICJSRkJhbmRzIiwgU2lnVGx2UkZCYW5kcywgRE9UMTFGX1RMVl9SRkJBTkRTLAorCTAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcSwgQXNzb2NpYXRpb25TdGF0ZSksCisJb2Zmc2V0b2YodERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUsIHByZXNlbnQpLCAiQXNzb2NpYXRpb25TdGF0ZSIsCisJU2lnVGx2QXNzb2NpYXRpb25TdGF0ZSwgRE9UMTFGX1RMVl9BU1NPQ0lBVElPTlNUQVRFLAorCTAsIDYsIDYsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcSwgQ29uZmlndXJhdGlvbkVycm9yKSwKKwlvZmZzZXRvZih0RG90MTFmVExWQ29uZmlndXJhdGlvbkVycm9yLCBwcmVzZW50KSwgIkNvbmZpZ3VyYXRpb25FcnJvciIsCisJU2lnVGx2Q29uZmlndXJhdGlvbkVycm9yLCBET1QxMUZfVExWX0NPTkZJR1VSQVRJT05FUlJPUiwKKwkwLCA2LCA2LCAxLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIERldmljZVBhc3N3b3JkSUQpLAorCW9mZnNldG9mKHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElELCBwcmVzZW50KSwgIkRldmljZVBhc3N3b3JkSUQiLAorCVNpZ1RsdkRldmljZVBhc3N3b3JkSUQsIERPVDExRl9UTFZfREVWSUNFUEFTU1dPUkRJRCwKKwkwLCA2LCA2LCAxLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIE1hbnVmYWN0dXJlciksCisJb2Zmc2V0b2YodERvdDExZlRMVk1hbnVmYWN0dXJlciwgcHJlc2VudCksICJNYW51ZmFjdHVyZXIiLAorCVNpZ1Rsdk1hbnVmYWN0dXJlciwgRE9UMTFGX1RMVl9NQU5VRkFDVFVSRVIsIDAsIDQsIDY4LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIE1vZGVsTmFtZSksCisJb2Zmc2V0b2YodERvdDExZlRMVk1vZGVsTmFtZSwgcHJlc2VudCksICJNb2RlbE5hbWUiLCBTaWdUbHZNb2RlbE5hbWUsCisJRE9UMTFGX1RMVl9NT0RFTE5BTUUsIDAsIDQsIDM2LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIE1vZGVsTnVtYmVyKSwKKwlvZmZzZXRvZih0RG90MTFmVExWTW9kZWxOdW1iZXIsIHByZXNlbnQpLCAiTW9kZWxOdW1iZXIiLAorCVNpZ1Rsdk1vZGVsTnVtYmVyLCBET1QxMUZfVExWX01PREVMTlVNQkVSLCAwLCA0LCAzNiwgMCwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBEZXZpY2VOYW1lKSwKKwlvZmZzZXRvZih0RG90MTFmVExWRGV2aWNlTmFtZSwgcHJlc2VudCksICJEZXZpY2VOYW1lIiwgU2lnVGx2RGV2aWNlTmFtZSwKKwlET1QxMUZfVExWX0RFVklDRU5BTUUsIDAsIDQsIDM2LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIFZlbmRvckV4dGVuc2lvbiksCisJb2Zmc2V0b2YodERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiwgcHJlc2VudCksICJWZW5kb3JFeHRlbnNpb24iLAorCVNpZ1RsdlZlbmRvckV4dGVuc2lvbiwgRE9UMTFGX1RMVl9WRU5ET1JFWFRFTlNJT04sCisJMCwgNywgMjEsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcSwgUmVxdWVzdERldmljZVR5cGUpLAorCW9mZnNldG9mKHREb3QxMWZUTFZSZXF1ZXN0RGV2aWNlVHlwZSwgcHJlc2VudCksICJSZXF1ZXN0RGV2aWNlVHlwZSIsCisJU2lnVGx2UmVxdWVzdERldmljZVR5cGUsIERPVDExRl9UTFZfUkVRVUVTVERFVklDRVRZUEUsCisJMCwgMTIsIDEyLCAwLCAyLCAyLCAxLCB9LAorCXswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV93c2NfcHJvYmVfcmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICB1aW50OF90IGllbGVuLAorCQkJCSAgICAgIHREb3QxMWZJRVdzY1Byb2JlUmVxICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJcERzdC0+cHJlc2VudCA9IDE7CisJc3RhdHVzID0gdW5wYWNrX3Rsdl9jb3JlKHBDdHgsIHBCdWYsIGllbGVuLAorCQkJVExWU19Xc2NQcm9iZVJlcSwKKwkJCSh1aW50OF90ICopcERzdCwgc2l6ZW9mKCpwRHN0KSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfd3NjX3Byb2JlX3JlcS4gKi8KKworI2RlZmluZSBTaWdJZVdzY1Byb2JlUmVxICgweDAwNzEpCisKKworc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfV3NjUHJvYmVSZXNbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVzLCBWZXJzaW9uKSwgb2Zmc2V0b2YodERvdDExZlRMVlZlcnNpb24sCisJcHJlc2VudCksICJWZXJzaW9uIiwgU2lnVGx2VmVyc2lvbiwgRE9UMTFGX1RMVl9WRVJTSU9OLAorCTAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgV1BTU3RhdGUpLCBvZmZzZXRvZih0RG90MTFmVExWV1BTU3RhdGUsCisJcHJlc2VudCksICJXUFNTdGF0ZSIsIFNpZ1RsdldQU1N0YXRlLCBET1QxMUZfVExWX1dQU1NUQVRFLAorCTAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgQVBTZXR1cExvY2tlZCksCisJb2Zmc2V0b2YodERvdDExZlRMVkFQU2V0dXBMb2NrZWQsIHByZXNlbnQpLCAiQVBTZXR1cExvY2tlZCIsCisJU2lnVGx2QVBTZXR1cExvY2tlZCwgRE9UMTFGX1RMVl9BUFNFVFVQTE9DS0VELCAwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIFNlbGVjdGVkUmVnaXN0cmFyKSwKKwlvZmZzZXRvZih0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIsIHByZXNlbnQpLCAiU2VsZWN0ZWRSZWdpc3RyYXIiLAorCVNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyLCBET1QxMUZfVExWX1NFTEVDVEVEUkVHSVNUUkFSLAorCTAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgRGV2aWNlUGFzc3dvcmRJRCksCisJb2Zmc2V0b2YodERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQsIHByZXNlbnQpLCAiRGV2aWNlUGFzc3dvcmRJRCIsCisJU2lnVGx2RGV2aWNlUGFzc3dvcmRJRCwgRE9UMTFGX1RMVl9ERVZJQ0VQQVNTV09SRElELAorCTAsIDYsIDYsIDAsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzKSwKKwlvZmZzZXRvZih0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLCBwcmVzZW50KSwKKwkiU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzIiwgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLAorCURPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVJDT05GSUdNRVRIT0RTLCAwLCA2LCA2LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIFJlc3BvbnNlVHlwZSksCisJb2Zmc2V0b2YodERvdDExZlRMVlJlc3BvbnNlVHlwZSwgcHJlc2VudCksICJSZXNwb25zZVR5cGUiLAorCVNpZ1RsdlJlc3BvbnNlVHlwZSwgRE9UMTFGX1RMVl9SRVNQT05TRVRZUEUsIDAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgVVVJRF9FKSwgb2Zmc2V0b2YodERvdDExZlRMVlVVSURfRSwKKwlwcmVzZW50KSwgIlVVSURfRSIsIFNpZ1RsdlVVSURfRSwgRE9UMTFGX1RMVl9VVUlEX0UsCisJMCwgMjAsIDIwLCAxLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIE1hbnVmYWN0dXJlciksCisJb2Zmc2V0b2YodERvdDExZlRMVk1hbnVmYWN0dXJlciwgcHJlc2VudCksICJNYW51ZmFjdHVyZXIiLAorCVNpZ1Rsdk1hbnVmYWN0dXJlciwgRE9UMTFGX1RMVl9NQU5VRkFDVFVSRVIsIDAsIDQsIDY4LCAxLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIE1vZGVsTmFtZSksCisJb2Zmc2V0b2YodERvdDExZlRMVk1vZGVsTmFtZSwgcHJlc2VudCksICJNb2RlbE5hbWUiLCBTaWdUbHZNb2RlbE5hbWUsCisJRE9UMTFGX1RMVl9NT0RFTE5BTUUsIDAsIDQsIDM2LCAxLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIE1vZGVsTnVtYmVyKSwKKwlvZmZzZXRvZih0RG90MTFmVExWTW9kZWxOdW1iZXIsIHByZXNlbnQpLCAiTW9kZWxOdW1iZXIiLAorCVNpZ1Rsdk1vZGVsTnVtYmVyLCBET1QxMUZfVExWX01PREVMTlVNQkVSLCAwLCA0LCAzNiwgMSwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVzLCBTZXJpYWxOdW1iZXIpLAorCW9mZnNldG9mKHREb3QxMWZUTFZTZXJpYWxOdW1iZXIsIHByZXNlbnQpLCAiU2VyaWFsTnVtYmVyIiwKKwlTaWdUbHZTZXJpYWxOdW1iZXIsIERPVDExRl9UTFZfU0VSSUFMTlVNQkVSLCAwLCA0LCAzNiwgMSwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVzLCBQcmltYXJ5RGV2aWNlVHlwZSksCisJb2Zmc2V0b2YodERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlLCBwcmVzZW50KSwgIlByaW1hcnlEZXZpY2VUeXBlIiwKKwlTaWdUbHZQcmltYXJ5RGV2aWNlVHlwZSwgRE9UMTFGX1RMVl9QUklNQVJZREVWSUNFVFlQRSwKKwkwLCAxMiwgMTIsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgRGV2aWNlTmFtZSksCisJb2Zmc2V0b2YodERvdDExZlRMVkRldmljZU5hbWUsIHByZXNlbnQpLCAiRGV2aWNlTmFtZSIsIFNpZ1RsdkRldmljZU5hbWUsCisJRE9UMTFGX1RMVl9ERVZJQ0VOQU1FLCAwLCA0LCAzNiwgMSwgMiwgMiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVzLCBDb25maWdNZXRob2RzKSwKKwlvZmZzZXRvZih0RG90MTFmVExWQ29uZmlnTWV0aG9kcywgcHJlc2VudCksICJDb25maWdNZXRob2RzIiwKKwlTaWdUbHZDb25maWdNZXRob2RzLCBET1QxMUZfVExWX0NPTkZJR01FVEhPRFMsIDAsIDYsIDYsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgUkZCYW5kcyksIG9mZnNldG9mKHREb3QxMWZUTFZSRkJhbmRzLAorCXByZXNlbnQpLCAiUkZCYW5kcyIsIFNpZ1RsdlJGQmFuZHMsIERPVDExRl9UTFZfUkZCQU5EUywKKwkwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIFZlbmRvckV4dGVuc2lvbiksCisJb2Zmc2V0b2YodERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiwgcHJlc2VudCksICJWZW5kb3JFeHRlbnNpb24iLAorCVNpZ1RsdlZlbmRvckV4dGVuc2lvbiwgRE9UMTFGX1RMVl9WRU5ET1JFWFRFTlNJT04sCisJMCwgNywgMjEsIDAsIDIsIDIsIDEsIH0sCisJezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCit9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3dzY19wcm9iZV9yZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICAgdERvdDExZklFV3NjUHJvYmVSZXMgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlzdGF0dXMgPSB1bnBhY2tfdGx2X2NvcmUocEN0eCwgcEJ1ZiwgaWVsZW4sCisJCQlUTFZTX1dzY1Byb2JlUmVzLAorCQkJKHVpbnQ4X3QgKilwRHN0LCBzaXplb2YoKnBEc3QpKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV93c2NfcHJvYmVfcmVzLiAqLworCisjZGVmaW5lIFNpZ0llV3NjUHJvYmVSZXMgKDB4MDA3MikKKworCitzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19Xc2NSZWFzc29jUmVzW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NSZWFzc29jUmVzLCBWZXJzaW9uKSwgb2Zmc2V0b2YodERvdDExZlRMVlZlcnNpb24sCisJcHJlc2VudCksICJWZXJzaW9uIiwgU2lnVGx2VmVyc2lvbiwgRE9UMTFGX1RMVl9WRVJTSU9OLAorCTAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUVXc2NSZWFzc29jUmVzLCBSZXNwb25zZVR5cGUpLAorCW9mZnNldG9mKHREb3QxMWZUTFZSZXNwb25zZVR5cGUsIHByZXNlbnQpLCAiUmVzcG9uc2VUeXBlIiwKKwlTaWdUbHZSZXNwb25zZVR5cGUsIERPVDExRl9UTFZfUkVTUE9OU0VUWVBFLCAwLCA1LCA1LCAxLCAyLCAyLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZklFV3NjUmVhc3NvY1JlcywgVmVuZG9yRXh0ZW5zaW9uKSwKKwlvZmZzZXRvZih0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uLCBwcmVzZW50KSwgIlZlbmRvckV4dGVuc2lvbiIsCisJU2lnVGx2VmVuZG9yRXh0ZW5zaW9uLCBET1QxMUZfVExWX1ZFTkRPUkVYVEVOU0lPTiwKKwkwLCA3LCAyMSwgMCwgMiwgMiwgMSwgfSwKKwl7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKK307CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfd3NjX3JlYXNzb2NfcmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkgdWludDhfdCBpZWxlbiwKKwkJCQkJIHREb3QxMWZJRVdzY1JlYXNzb2NSZXMgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlzdGF0dXMgPSB1bnBhY2tfdGx2X2NvcmUocEN0eCwgcEJ1ZiwgaWVsZW4sCisJCQlUTFZTX1dzY1JlYXNzb2NSZXMsCisJCQkodWludDhfdCAqKXBEc3QsIHNpemVvZigqcERzdCkpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX3dzY19yZWFzc29jX3Jlcy4gKi8KKworI2RlZmluZSBTaWdJZVdzY1JlYXNzb2NSZXMgKDB4MDA3MykKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2V4dF9jaGFuX3N3aXRjaF9hbm4odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkJICAgICAgdERvdDExZklFZXh0X2NoYW5fc3dpdGNoX2FubiAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5zd2l0Y2hfbW9kZSA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPm5ld19yZWdfY2xhc3MgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlwRHN0LT5uZXdfY2hhbm5lbCA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCXBEc3QtPnN3aXRjaF9jb3VudCA9ICpwQnVmOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfZXh0X2NoYW5fc3dpdGNoX2Fubi4gKi8KKworI2RlZmluZSBTaWdJZWV4dF9jaGFuX3N3aXRjaF9hbm4gKDB4MDA3NCkKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX2h0MjA0MF9ic3NfY29leGlzdGVuY2UodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkJIHVpbnQ4X3QgaWVsZW4sCisJCQkJCQkgdERvdDExZklFaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwl1aW50OF90IHRtcDY1X187CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJdG1wNjVfXyA9ICpwQnVmOworCXBEc3QtPmluZm9fcmVxdWVzdCA9IHRtcDY1X18gPj4gMCAmIDB4MTsKKwlwRHN0LT5mb3J0eV9taHpfaW50b2xlcmFudCA9IHRtcDY1X18gPj4gMSAmIDB4MTsKKwlwRHN0LT50d2VudHlfbWh6X2Jzc3dpZHRoX3JlcSA9IHRtcDY1X18gPj4gMiAmIDB4MTsKKwlwRHN0LT5vYnNzX3NjYW5fZXhlbXB0aW9uX3JlcSA9IHRtcDY1X18gPj4gMyAmIDB4MTsKKwlwRHN0LT5vYnNzX3NjYW5fZXhlbXB0aW9uX2dyYW50ID0gdG1wNjVfXyA+PiA0ICYgMHgxOworCXBEc3QtPnVudXNlZCA9IHRtcDY1X18gPj4gNSAmIDB4NzsKKwkodm9pZClwQ3R4OworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2llX2h0MjA0MF9ic3NfY29leGlzdGVuY2UuICovCisKKyNkZWZpbmUgU2lnSWVodDIwNDBfYnNzX2NvZXhpc3RlbmNlICgweDAwNzUpCisKKwordWludDMyX3QgZG90MTFmX3VucGFja19pZV9odDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJCSAgICAgICB1aW50OF90IGllbGVuLAorCQkJCQkJICAgICAgIHREb3QxMWZJRWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQgKnBEc3QpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisJaWYgKHBEc3QtPnByZXNlbnQpCisJCXN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisJcERzdC0+cHJlc2VudCA9IDE7CisJcERzdC0+b3BlcmF0aW5nX2NsYXNzID0gKnBCdWY7CisJcEJ1ZiArPSAxOworCWllbGVuIC09ICh1aW50OF90KTE7CisJcERzdC0+bnVtX2NoYW5uZWxfbGlzdCA9ICh1aW50OF90KShpZWxlbik7CisJaWYgKGllbGVuID4gNTApIHsKKwkJcERzdC0+cHJlc2VudCA9IDA7CisJCXJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisJfQorCisJRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5jaGFubmVsX2xpc3QsIHBCdWYsIChpZWxlbikpOworCSh2b2lkKXBDdHg7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfaHQyMDQwX2Jzc19pbnRvbGVyYW50X3JlcG9ydC4gKi8KKworI2RlZmluZSBTaWdJZWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQgKDB4MDA3NikKKworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2llX3NlY19jaGFuX29mZnNldF9lbGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICAgICAgdWludDhfdCBpZWxlbiwKKwkJCQkJICAgICAgdERvdDExZklFc2VjX2NoYW5fb2Zmc2V0X2VsZSAqcERzdCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwlpZiAocERzdC0+cHJlc2VudCkKKwkJc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKwlwRHN0LT5wcmVzZW50ID0gMTsKKwlwRHN0LT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gKnBCdWY7CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3VucGFja19pZV9zZWNfY2hhbl9vZmZzZXRfZWxlLiAqLworCisjZGVmaW5lIFNpZ0llc2VjX2NoYW5fb2Zmc2V0X2VsZSAoMHgwMDc3KQorCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU192ZW5kb3IyX2llW10gPSB7CisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfdmVuZG9yMl9pZVtdID0geworCXsgb2Zmc2V0b2YodERvdDExZklFdmVuZG9yMl9pZSwgVkhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVZIVENhcHMsCisJcHJlc2VudCksIDAsICJWSFRDYXBzIiwgMCwgMTQsIDE0LCBTaWdJZVZIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1ZIVENBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmSUV2ZW5kb3IyX2llLCBWSFRPcGVyYXRpb24pLAorCW9mZnNldG9mKHREb3QxMWZJRVZIVE9wZXJhdGlvbiwgcHJlc2VudCksIDAsICJWSFRPcGVyYXRpb24iLAorCTAsIDcsIDcsIFNpZ0llVkhUT3BlcmF0aW9uLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9WSFRPUEVSQVRJT04sIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwKK307CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfaWVfdmVuZG9yMl9pZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQ4X3QgaWVsZW4sCisJCQkJICAgICB0RG90MTFmSUV2ZW5kb3IyX2llICpwRHN0KQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCWlmIChwRHN0LT5wcmVzZW50KQorCQlzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworCXBEc3QtPnByZXNlbnQgPSAxOworCXBEc3QtPnR5cGUgPSAqcEJ1ZjsKKwlwQnVmICs9IDE7CisJaWVsZW4gLT0gKHVpbnQ4X3QpMTsKKwlwRHN0LT5zdWJfdHlwZSA9ICpwQnVmOworCXBCdWYgKz0gMTsKKwlpZWxlbiAtPSAodWludDhfdCkxOworCSh2b2lkKXBDdHg7CisJc3RhdHVzIHw9IHVucGFja19jb3JlKHBDdHgsCisJCQkJcEJ1ZiwKKwkJCQlpZWxlbiwKKwkJCQlGRlNfdmVuZG9yMl9pZSwKKwkJCQlJRVNfdmVuZG9yMl9pZSwKKwkJCQkodWludDhfdCAqKXBEc3QsCisJCQkJc2l6ZW9mKCpwRHN0KSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaWVfdmVuZG9yMl9pZS4gKi8KKworI2RlZmluZSBTaWdJZXZlbmRvcjJfaWUgKDB4MDA3OCkKKworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfQWRkVFNSZXF1ZXN0W10gPSB7CisJeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmQWRkVFNSZXF1ZXN0LCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnksCisJRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKwl7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmQWRkVFNSZXF1ZXN0LCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIERpYWxvZ1Rva2VuKSwKKwlTaWdGZkRpYWxvZ1Rva2VuLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0FkZFRTUmVxdWVzdFtdID0geworCXsgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVxdWVzdCwgVFNQRUMpLCBvZmZzZXRvZih0RG90MTFmSUVUU1BFQywgcHJlc2VudCksCisJMCwgIlRTUEVDIiwgMCwgNTcsIDU3LCBTaWdJZVRTUEVDLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9UU1BFQywgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIFRDTEFTKSwgb2Zmc2V0b2YodERvdDExZklFVENMQVMsIHByZXNlbnQpLAorCW9mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIG51bV9UQ0xBUyksICJUQ0xBUyIsIDIsIDcsIDQ1LCBTaWdJZVRDTEFTLAorCXswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9UQ0xBUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIFRDTEFTU1BST0MpLAorCW9mZnNldG9mKHREb3QxMWZJRVRDTEFTU1BST0MsIHByZXNlbnQpLCAwLCAiVENMQVNTUFJPQyIsCisJMCwgMywgMywgU2lnSWVUQ0xBU1NQUk9DLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9UQ0xBU1NQUk9DLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVxdWVzdCwgV01NVFNQRUMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1UU1BFQywKKwlwcmVzZW50KSwgMCwgIldNTVRTUEVDIiwgMCwgNjMsIDYzLCBTaWdJZVdNTVRTUEVDLCB7MCwgODAsIDI0MiwgMiwgMn0sCisJNSwgRE9UMTFGX0VJRF9XTU1UU1BFQywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIFdNTVRDTEFTKSwgb2Zmc2V0b2YodERvdDExZklFV01NVENMQVMsCisJcHJlc2VudCksIG9mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIG51bV9XTU1UQ0xBUyksICJXTU1UQ0xBUyIsCisJMiwgMTMsIDUxLCBTaWdJZVdNTVRDTEFTLCB7MCwgODAsIDI0MiwgMiwgNn0sCisJNSwgRE9UMTFGX0VJRF9XTU1UQ0xBUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIFdNTVRDTEFTUFJPQyksCisJb2Zmc2V0b2YodERvdDExZklFV01NVENMQVNQUk9DLCBwcmVzZW50KSwgMCwgIldNTVRDTEFTUFJPQyIsCisJMCwgOSwgOSwgU2lnSWVXTU1UQ0xBU1BST0MsIHswLCA4MCwgMjQyLCAyLCA3fSwKKwk1LCBET1QxMUZfRUlEX1dNTVRDTEFTUFJPQywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIEVTRVRyYWZTdHJtUmF0ZVNldCksCisJb2Zmc2V0b2YodERvdDExZklFRVNFVHJhZlN0cm1SYXRlU2V0LCBwcmVzZW50KSwgMCwgIkVTRVRyYWZTdHJtUmF0ZVNldCIsCisJMCwgNywgMTUsIFNpZ0llRVNFVHJhZlN0cm1SYXRlU2V0LCB7MCwgNjQsIDE1MCwgOCwgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VUUkFGU1RSTVJBVEVTRVQsIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2FkZF90c19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZBZGRUU1JlcXVlc3QgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfQWRkVFNSZXF1ZXN0LCBJRVNfQWRkVFNSZXF1ZXN0LAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2FkZF90c19yZXF1ZXN0LiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfQWRkVFNSZXNwb25zZVtdID0geworCXsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVzcG9uc2UsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSwKKwlET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorCXsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBEaWFsb2dUb2tlbiksCisJU2lnRmZEaWFsb2dUb2tlbiwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKwl7ICJTdGF0dXMiLCBvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgU3RhdHVzKSwgU2lnRmZTdGF0dXMsCisJRE9UMTFGX0ZGX1NUQVRVU19MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfQWRkVFNSZXNwb25zZVtdID0geworCXsgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVzcG9uc2UsIFRTRGVsYXkpLCBvZmZzZXRvZih0RG90MTFmSUVUU0RlbGF5LAorCXByZXNlbnQpLCAwLCAiVFNEZWxheSIsIDAsIDYsIDYsIFNpZ0llVFNEZWxheSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVFNERUxBWSwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBUU1BFQyksIG9mZnNldG9mKHREb3QxMWZJRVRTUEVDLAorCXByZXNlbnQpLCAwLCAiVFNQRUMiLCAwLCA1NywgNTcsIFNpZ0llVFNQRUMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1RTUEVDLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVzcG9uc2UsIFRDTEFTKSwgb2Zmc2V0b2YodERvdDExZklFVENMQVMsCisJcHJlc2VudCksIG9mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBudW1fVENMQVMpLCAiVENMQVMiLAorCTIsIDcsIDQ1LCBTaWdJZVRDTEFTLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVENMQVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgVENMQVNTUFJPQyksCisJb2Zmc2V0b2YodERvdDExZklFVENMQVNTUFJPQywgcHJlc2VudCksIDAsICJUQ0xBU1NQUk9DIiwKKwkwLCAzLCAzLCBTaWdJZVRDTEFTU1BST0MsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1RDTEFTU1BST0MsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgU2NoZWR1bGUpLCBvZmZzZXRvZih0RG90MTFmSUVTY2hlZHVsZSwKKwlwcmVzZW50KSwgMCwgIlNjaGVkdWxlIiwgMCwgMTYsIDE2LCBTaWdJZVNjaGVkdWxlLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9TQ0hFRFVMRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBXTU1UU0RlbGF5KSwKKwlvZmZzZXRvZih0RG90MTFmSUVXTU1UU0RlbGF5LCBwcmVzZW50KSwgMCwgIldNTVRTRGVsYXkiLAorCTAsIDEyLCAxMiwgU2lnSWVXTU1UU0RlbGF5LCB7MCwgODAsIDI0MiwgMiwgOH0sCisJNSwgRE9UMTFGX0VJRF9XTU1UU0RFTEFZLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVzcG9uc2UsIFdNTVNjaGVkdWxlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXTU1TY2hlZHVsZSwgcHJlc2VudCksIDAsICJXTU1TY2hlZHVsZSIsCisJMCwgMjIsIDIyLCBTaWdJZVdNTVNjaGVkdWxlLCB7MCwgODAsIDI0MiwgMiwgOX0sCisJNSwgRE9UMTFGX0VJRF9XTU1TQ0hFRFVMRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBXTU1UU1BFQyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVRTUEVDLAorCXByZXNlbnQpLCAwLCAiV01NVFNQRUMiLCAwLCA2MywgNjMsIFNpZ0llV01NVFNQRUMsIHswLCA4MCwgMjQyLCAyLCAyfSwKKwk1LCBET1QxMUZfRUlEX1dNTVRTUEVDLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVzcG9uc2UsIFdNTVRDTEFTKSwgb2Zmc2V0b2YodERvdDExZklFV01NVENMQVMsCisJcHJlc2VudCksIG9mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBudW1fV01NVENMQVMpLCAiV01NVENMQVMiLAorCTIsIDEzLCA1MSwgU2lnSWVXTU1UQ0xBUywgezAsIDgwLCAyNDIsIDIsIDZ9LAorCTUsIERPVDExRl9FSURfV01NVENMQVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgV01NVENMQVNQUk9DKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXTU1UQ0xBU1BST0MsIHByZXNlbnQpLCAwLCAiV01NVENMQVNQUk9DIiwKKwkwLCA5LCA5LCBTaWdJZVdNTVRDTEFTUFJPQywgezAsIDgwLCAyNDIsIDIsIDd9LAorCTUsIERPVDExRl9FSURfV01NVENMQVNQUk9DLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVzcG9uc2UsIEVTRVRyYWZTdHJtTWV0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVFU0VUcmFmU3RybU1ldCwgcHJlc2VudCksIDAsICJFU0VUcmFmU3RybU1ldCIsCisJMCwgMTAsIDEwLCBTaWdJZUVTRVRyYWZTdHJtTWV0LCB7MCwgNjQsIDE1MCwgNywgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VUUkFGU1RSTU1FVCwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfYWRkX3RzX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZBZGRUU1Jlc3BvbnNlICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX0FkZFRTUmVzcG9uc2UsIElFU19BZGRUU1Jlc3BvbnNlLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2FkZF90c19yZXNwb25zZS4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0Fzc29jUmVxdWVzdFtdID0geworCXsgIkNhcGFiaWxpdGllcyIsIG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIENhcGFiaWxpdGllcyksCisJU2lnRmZDYXBhYmlsaXRpZXMsIERPVDExRl9GRl9DQVBBQklMSVRJRVNfTEVOLCB9LAorCXsgIkxpc3RlbkludGVydmFsIiwgb2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgTGlzdGVuSW50ZXJ2YWwpLAorCVNpZ0ZmTGlzdGVuSW50ZXJ2YWwsIERPVDExRl9GRl9MSVNURU5JTlRFUlZBTF9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfQXNzb2NSZXF1ZXN0W10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBTU0lEKSwgb2Zmc2V0b2YodERvdDExZklFU1NJRCwgcHJlc2VudCksIDAsCisJIlNTSUQiLCAwLCAyLCAzNCwgU2lnSWVTU0lELCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfU1NJRCwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFN1cHBSYXRlcyksIG9mZnNldG9mKHREb3QxMWZJRVN1cHBSYXRlcywKKwlwcmVzZW50KSwgMCwgIlN1cHBSYXRlcyIsIDAsIDIsIDE0LCBTaWdJZVN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfU1VQUFJBVEVTLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgRXh0U3VwcFJhdGVzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiwKKwkwLCAzLCAxNCwgU2lnSWVFeHRTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFBvd2VyQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVBvd2VyQ2FwcywKKwlwcmVzZW50KSwgMCwgIlBvd2VyQ2FwcyIsIDAsIDQsIDQsIFNpZ0llUG93ZXJDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9QT1dFUkNBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBTdXBwQ2hhbm5lbHMpLAorCW9mZnNldG9mKHREb3QxMWZJRVN1cHBDaGFubmVscywgcHJlc2VudCksIDAsICJTdXBwQ2hhbm5lbHMiLAorCTAsIDQsIDk4LCBTaWdJZVN1cHBDaGFubmVscywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfU1VQUENIQU5ORUxTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgUlNOT3BhcXVlKSwgb2Zmc2V0b2YodERvdDExZklFUlNOT3BhcXVlLAorCXByZXNlbnQpLCAwLCAiUlNOT3BhcXVlIiwgMCwgOCwgMjU1LCBTaWdJZVJTTk9wYXF1ZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUlNOT1BBUVVFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgUU9TQ2Fwc1N0YXRpb24pLAorCW9mZnNldG9mKHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uLCBwcmVzZW50KSwgMCwgIlFPU0NhcHNTdGF0aW9uIiwKKwkwLCAzLCAzLCBTaWdJZVFPU0NhcHNTdGF0aW9uLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9RT1NDQVBTU1RBVElPTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFJSTUVuYWJsZWRDYXApLAorCW9mZnNldG9mKHREb3QxMWZJRVJSTUVuYWJsZWRDYXAsIHByZXNlbnQpLCAwLCAiUlJNRW5hYmxlZENhcCIsCisJMCwgNywgNywgU2lnSWVSUk1FbmFibGVkQ2FwLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9SUk1FTkFCTEVEQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgTW9iaWxpdHlEb21haW4pLAorCW9mZnNldG9mKHREb3QxMWZJRU1vYmlsaXR5RG9tYWluLCBwcmVzZW50KSwgMCwgIk1vYmlsaXR5RG9tYWluIiwKKwkwLCA1LCA1LCBTaWdJZU1vYmlsaXR5RG9tYWluLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9NT0JJTElUWURPTUFJTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFdQQU9wYXF1ZSksIG9mZnNldG9mKHREb3QxMWZJRVdQQU9wYXF1ZSwKKwlwcmVzZW50KSwgMCwgIldQQU9wYXF1ZSIsIDAsIDgsIDI1NSwgU2lnSWVXUEFPcGFxdWUsIHswLCA4MCwgMjQyLCAxLCAwfSwKKwk0LCBET1QxMUZfRUlEX1dQQU9QQVFVRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIEhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRUhUQ2FwcywKKwlwcmVzZW50KSwgMCwgIkhUQ2FwcyIsIDAsIDI4LCA2MCwgU2lnSWVIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0hUQ0FQUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFdNTUNhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1DYXBzLAorCXByZXNlbnQpLCAwLCAiV01NQ2FwcyIsIDAsIDksIDksIFNpZ0llV01NQ2FwcywgezAsIDgwLCAyNDIsIDIsIDV9LAorCTUsIERPVDExRl9FSURfV01NQ0FQUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFdNTUluZm9TdGF0aW9uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiwgcHJlc2VudCksIDAsICJXTU1JbmZvU3RhdGlvbiIsCisJMCwgOSwgOSwgU2lnSWVXTU1JbmZvU3RhdGlvbiwgezAsIDgwLCAyNDIsIDIsIDB9LAorCTUsIERPVDExRl9FSURfV01NSU5GT1NUQVRJT04sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBXc2NJRU9wYXF1ZSksCisJb2Zmc2V0b2YodERvdDExZklFV3NjSUVPcGFxdWUsIHByZXNlbnQpLCAwLCAiV3NjSUVPcGFxdWUiLAorCTAsIDgsIDI1NSwgU2lnSWVXc2NJRU9wYXF1ZSwgezAsIDgwLCAyNDIsIDQsIDB9LAorCTQsIERPVDExRl9FSURfV1NDSUVPUEFRVUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBXQVBJT3BhcXVlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXQVBJT3BhcXVlLCBwcmVzZW50KSwgMCwgIldBUElPcGFxdWUiLAorCTAsIDgsIDI1NSwgU2lnSWVXQVBJT3BhcXVlLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9XQVBJT1BBUVVFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgV0FQSSksIG9mZnNldG9mKHREb3QxMWZJRVdBUEksIHByZXNlbnQpLCAwLAorCSJXQVBJIiwgMCwgMTQsIDExMiwgU2lnSWVXQVBJLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfV0FQSSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIEVTRVJhZE1nbXRDYXApLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRVJhZE1nbXRDYXAsIHByZXNlbnQpLCAwLCAiRVNFUmFkTWdtdENhcCIsCisJMCwgOCwgOCwgU2lnSWVFU0VSYWRNZ210Q2FwLCB7MCwgNjQsIDE1MCwgMSwgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VSQURNR01UQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgRVNFVmVyc2lvbiksCisJb2Zmc2V0b2YodERvdDExZklFRVNFVmVyc2lvbiwgcHJlc2VudCksIDAsICJFU0VWZXJzaW9uIiwKKwkwLCA3LCA3LCBTaWdJZUVTRVZlcnNpb24sIHswLCA2NCwgMTUwLCAzLCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVZFUlNJT04sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBQMlBJRU9wYXF1ZSksCisJb2Zmc2V0b2YodERvdDExZklFUDJQSUVPcGFxdWUsIHByZXNlbnQpLCAwLCAiUDJQSUVPcGFxdWUiLAorCTAsIDgsIDI1NSwgU2lnSWVQMlBJRU9wYXF1ZSwgezgwLCAxMTEsIDE1NCwgOSwgMH0sCisJNCwgRE9UMTFGX0VJRF9QMlBJRU9QQVFVRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFdGRElFT3BhcXVlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXRkRJRU9wYXF1ZSwgcHJlc2VudCksIDAsICJXRkRJRU9wYXF1ZSIsCisJMCwgOCwgMjU1LCBTaWdJZVdGRElFT3BhcXVlLCB7ODAsIDExMSwgMTU0LCAxMCwgMH0sCisJNCwgRE9UMTFGX0VJRF9XRkRJRU9QQVFVRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFZIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVWSFRDYXBzLAorCXByZXNlbnQpLCAwLCAiVkhUQ2FwcyIsIDAsIDE0LCAxNCwgU2lnSWVWSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9WSFRDQVBTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgRXh0Q2FwKSwgb2Zmc2V0b2YodERvdDExZklFRXh0Q2FwLAorCXByZXNlbnQpLCAwLCAiRXh0Q2FwIiwgMCwgMTAsIDExLCBTaWdJZUV4dENhcCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRVhUQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgT3BlcmF0aW5nTW9kZSksCisJb2Zmc2V0b2YodERvdDExZklFT3BlcmF0aW5nTW9kZSwgcHJlc2VudCksIDAsICJPcGVyYXRpbmdNb2RlIiwKKwkwLCAzLCAzLCBTaWdJZU9wZXJhdGluZ01vZGUsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX09QRVJBVElOR01PREUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBRb3NNYXBTZXQpLCBvZmZzZXRvZih0RG90MTFmSUVRb3NNYXBTZXQsCisJcHJlc2VudCksIDAsICJRb3NNYXBTZXQiLCAwLCAyLCA2MiwgU2lnSWVRb3NNYXBTZXQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1FPU01BUFNFVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIHZlbmRvcjJfaWUpLAorCW9mZnNldG9mKHREb3QxMWZJRXZlbmRvcjJfaWUsIHByZXNlbnQpLCAwLCAidmVuZG9yMl9pZSIsCisJMCwgNywgMjgsIFNpZ0lldmVuZG9yMl9pZSwgezAsIDE0NCwgNzYsIDAsIDB9LAorCTMsIERPVDExRl9FSURfVkVORE9SMl9JRSwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfYXNzb2NfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmQXNzb2NSZXF1ZXN0ICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX0Fzc29jUmVxdWVzdCwgSUVTX0Fzc29jUmVxdWVzdCwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19hc3NvY19yZXF1ZXN0LiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfQXNzb2NSZXNwb25zZVtdID0geworCXsgIkNhcGFiaWxpdGllcyIsIG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBDYXBhYmlsaXRpZXMpLAorCVNpZ0ZmQ2FwYWJpbGl0aWVzLCBET1QxMUZfRkZfQ0FQQUJJTElUSUVTX0xFTiwgfSwKKwl7ICJTdGF0dXMiLCBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgU3RhdHVzKSwgU2lnRmZTdGF0dXMsCisJRE9UMTFGX0ZGX1NUQVRVU19MRU4sIH0sCisJeyAiQUlEIiwgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIEFJRCksIFNpZ0ZmQUlELAorCURPVDExRl9GRl9BSURfTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0Fzc29jUmVzcG9uc2VbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVTdXBwUmF0ZXMsCisJcHJlc2VudCksIDAsICJTdXBwUmF0ZXMiLCAwLCAyLCAxNCwgU2lnSWVTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1NVUFBSQVRFUywgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBFeHRTdXBwUmF0ZXMpLAorCW9mZnNldG9mKHREb3QxMWZJRUV4dFN1cHBSYXRlcywgcHJlc2VudCksIDAsICJFeHRTdXBwUmF0ZXMiLAorCTAsIDMsIDE0LCBTaWdJZUV4dFN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRVhUU1VQUFJBVEVTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIEVEQ0FQYXJhbVNldCksCisJb2Zmc2V0b2YodERvdDExZklFRURDQVBhcmFtU2V0LCBwcmVzZW50KSwgMCwgIkVEQ0FQYXJhbVNldCIsCisJMCwgMjAsIDIwLCBTaWdJZUVEQ0FQYXJhbVNldCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRURDQVBBUkFNU0VULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIFJDUElJRSksIG9mZnNldG9mKHREb3QxMWZJRVJDUElJRSwKKwlwcmVzZW50KSwgMCwgIlJDUElJRSIsIDAsIDMsIDMsIFNpZ0llUkNQSUlFLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9SQ1BJSUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgUlNOSUlFKSwgb2Zmc2V0b2YodERvdDExZklFUlNOSUlFLAorCXByZXNlbnQpLCAwLCAiUlNOSUlFIiwgMCwgMywgMywgU2lnSWVSU05JSUUsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1JTTklJRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBSUk1FbmFibGVkQ2FwKSwKKwlvZmZzZXRvZih0RG90MTFmSUVSUk1FbmFibGVkQ2FwLCBwcmVzZW50KSwgMCwgIlJSTUVuYWJsZWRDYXAiLAorCTAsIDcsIDcsIFNpZ0llUlJNRW5hYmxlZENhcCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUlJNRU5BQkxFRENBUCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBNb2JpbGl0eURvbWFpbiksCisJb2Zmc2V0b2YodERvdDExZklFTW9iaWxpdHlEb21haW4sIHByZXNlbnQpLCAwLCAiTW9iaWxpdHlEb21haW4iLAorCTAsIDUsIDUsIFNpZ0llTW9iaWxpdHlEb21haW4sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX01PQklMSVRZRE9NQUlOLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIEZUSW5mbyksIG9mZnNldG9mKHREb3QxMWZJRUZUSW5mbywKKwlwcmVzZW50KSwgMCwgIkZUSW5mbyIsIDAsIDg0LCAyMjIsIFNpZ0llRlRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9GVElORk8sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgUklDRGF0YURlc2MpLAorCW9mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBwcmVzZW50KSwKKwlvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgbnVtX1JJQ0RhdGFEZXNjKSwgIlJJQ0RhdGFEZXNjIiwKKwkyLCAyLCA1NTAsIFNpZ0llUklDRGF0YURlc2MsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1JJQ0RBVEFERVNDLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIFdQQSksIG9mZnNldG9mKHREb3QxMWZJRVdQQSwgcHJlc2VudCksIDAsCisJIldQQSIsIDAsIDgsIDUwLCBTaWdJZVdQQSwgezAsIDgwLCAyNDIsIDEsIDB9LCA0LCBET1QxMUZfRUlEX1dQQSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBUaW1lb3V0SW50ZXJ2YWwpLAorCW9mZnNldG9mKHREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCwgcHJlc2VudCksIDAsICJUaW1lb3V0SW50ZXJ2YWwiLAorCTAsIDcsIDcsIFNpZ0llVGltZW91dEludGVydmFsLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9USU1FT1VUSU5URVJWQUwsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgSFRDYXBzKSwgb2Zmc2V0b2YodERvdDExZklFSFRDYXBzLAorCXByZXNlbnQpLCAwLCAiSFRDYXBzIiwgMCwgMjgsIDYwLCBTaWdJZUhUQ2FwcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfSFRDQVBTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIEhUSW5mbyksIG9mZnNldG9mKHREb3QxMWZJRUhUSW5mbywKKwlwcmVzZW50KSwgMCwgIkhUSW5mbyIsIDAsIDI0LCA1NiwgU2lnSWVIVEluZm8sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0hUSU5GTywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBXTU1QYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1QYXJhbXMsCisJcHJlc2VudCksIDAsICJXTU1QYXJhbXMiLCAwLCAyNiwgMjYsIFNpZ0llV01NUGFyYW1zLCB7MCwgODAsIDI0MiwgMiwgMX0sCisJNSwgRE9UMTFGX0VJRF9XTU1QQVJBTVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgV01NQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVdNTUNhcHMsCisJcHJlc2VudCksIDAsICJXTU1DYXBzIiwgMCwgOSwgOSwgU2lnSWVXTU1DYXBzLCB7MCwgODAsIDI0MiwgMiwgNX0sCisJNSwgRE9UMTFGX0VJRF9XTU1DQVBTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIEVTRVJhZE1nbXRDYXApLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRVJhZE1nbXRDYXAsIHByZXNlbnQpLCAwLCAiRVNFUmFkTWdtdENhcCIsCisJMCwgOCwgOCwgU2lnSWVFU0VSYWRNZ210Q2FwLCB7MCwgNjQsIDE1MCwgMSwgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VSQURNR01UQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIEVTRVRyYWZTdHJtTWV0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVFU0VUcmFmU3RybU1ldCwgcHJlc2VudCksIDAsICJFU0VUcmFmU3RybU1ldCIsCisJMCwgMTAsIDEwLCBTaWdJZUVTRVRyYWZTdHJtTWV0LCB7MCwgNjQsIDE1MCwgNywgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VUUkFGU1RSTU1FVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBFU0VUeG1pdFBvd2VyKSwKKwlvZmZzZXRvZih0RG90MTFmSUVFU0VUeG1pdFBvd2VyLCBwcmVzZW50KSwgMCwgIkVTRVR4bWl0UG93ZXIiLAorCTAsIDgsIDgsIFNpZ0llRVNFVHhtaXRQb3dlciwgezAsIDY0LCAxNTAsIDAsIDB9LAorCTQsIERPVDExRl9FSURfRVNFVFhNSVRQT1dFUiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBXTU1UU1BFQyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVRTUEVDLAorCXByZXNlbnQpLCBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgbnVtX1dNTVRTUEVDKSwgIldNTVRTUEVDIiwKKwk0LCA2MywgNjMsIFNpZ0llV01NVFNQRUMsIHswLCA4MCwgMjQyLCAyLCAyfSwKKwk1LCBET1QxMUZfRUlEX1dNTVRTUEVDLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIFdzY0Fzc29jUmVzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXc2NBc3NvY1JlcywgcHJlc2VudCksIDAsICJXc2NBc3NvY1JlcyIsCisJMCwgNiwgMzcsIFNpZ0llV3NjQXNzb2NSZXMsIHswLCA4MCwgMjQyLCA0LCAwfSwKKwk0LCBET1QxMUZfRUlEX1dTQ0FTU09DUkVTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIFAyUEFzc29jUmVzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVQMlBBc3NvY1JlcywgcHJlc2VudCksIDAsICJQMlBBc3NvY1JlcyIsCisJMCwgNiwgMTcsIFNpZ0llUDJQQXNzb2NSZXMsIHs4MCwgMTExLCAxNTQsIDksIDB9LAorCTQsIERPVDExRl9FSURfUDJQQVNTT0NSRVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgVkhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVZIVENhcHMsCisJcHJlc2VudCksIDAsICJWSFRDYXBzIiwgMCwgMTQsIDE0LCBTaWdJZVZIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1ZIVENBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgVkhUT3BlcmF0aW9uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVWSFRPcGVyYXRpb24sIHByZXNlbnQpLCAwLCAiVkhUT3BlcmF0aW9uIiwKKwkwLCA3LCA3LCBTaWdJZVZIVE9wZXJhdGlvbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVkhUT1BFUkFUSU9OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIEV4dENhcCksIG9mZnNldG9mKHREb3QxMWZJRUV4dENhcCwKKwlwcmVzZW50KSwgMCwgIkV4dENhcCIsIDAsIDEwLCAxMSwgU2lnSWVFeHRDYXAsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VYVENBUCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBPQlNTU2NhblBhcmFtZXRlcnMpLAorCW9mZnNldG9mKHREb3QxMWZJRU9CU1NTY2FuUGFyYW1ldGVycywgcHJlc2VudCksIDAsICJPQlNTU2NhblBhcmFtZXRlcnMiLAorCTAsIDE2LCAxNiwgU2lnSWVPQlNTU2NhblBhcmFtZXRlcnMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX09CU1NTQ0FOUEFSQU1FVEVSUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBRb3NNYXBTZXQpLCBvZmZzZXRvZih0RG90MTFmSUVRb3NNYXBTZXQsCisJcHJlc2VudCksIDAsICJRb3NNYXBTZXQiLCAwLCAyLCA2MiwgU2lnSWVRb3NNYXBTZXQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1FPU01BUFNFVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCB2ZW5kb3IyX2llKSwKKwlvZmZzZXRvZih0RG90MTFmSUV2ZW5kb3IyX2llLCBwcmVzZW50KSwgMCwgInZlbmRvcjJfaWUiLAorCTAsIDcsIDI4LCBTaWdJZXZlbmRvcjJfaWUsIHswLCAxNDQsIDc2LCAwLCAwfSwKKwkzLCBET1QxMUZfRUlEX1ZFTkRPUjJfSUUsIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2Fzc29jX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZBc3NvY1Jlc3BvbnNlICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX0Fzc29jUmVzcG9uc2UsIElFU19Bc3NvY1Jlc3BvbnNlLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2Fzc29jX3Jlc3BvbnNlLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfQXV0aGVudGljYXRpb25bXSA9IHsKKwl7ICJBdXRoQWxnbyIsIG9mZnNldG9mKHREb3QxMWZBdXRoZW50aWNhdGlvbiwgQXV0aEFsZ28pLCBTaWdGZkF1dGhBbGdvLAorCURPVDExRl9GRl9BVVRIQUxHT19MRU4sIH0sCisJeyAiQXV0aFNlcU5vIiwgb2Zmc2V0b2YodERvdDExZkF1dGhlbnRpY2F0aW9uLCBBdXRoU2VxTm8pLCBTaWdGZkF1dGhTZXFObywKKwlET1QxMUZfRkZfQVVUSFNFUU5PX0xFTiwgfSwKKwl7ICJTdGF0dXMiLCBvZmZzZXRvZih0RG90MTFmQXV0aGVudGljYXRpb24sIFN0YXR1cyksIFNpZ0ZmU3RhdHVzLAorCURPVDExRl9GRl9TVEFUVVNfTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0F1dGhlbnRpY2F0aW9uW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmQXV0aGVudGljYXRpb24sIENoYWxsZW5nZVRleHQpLAorCW9mZnNldG9mKHREb3QxMWZJRUNoYWxsZW5nZVRleHQsIHByZXNlbnQpLCAwLCAiQ2hhbGxlbmdlVGV4dCIsCisJMCwgMywgMjU1LCBTaWdJZUNoYWxsZW5nZVRleHQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0NIQUxMRU5HRVRFWFQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXV0aGVudGljYXRpb24sIFJTTk9wYXF1ZSksCisJb2Zmc2V0b2YodERvdDExZklFUlNOT3BhcXVlLCBwcmVzZW50KSwgMCwgIlJTTk9wYXF1ZSIsCisJMCwgOCwgMjU1LCBTaWdJZVJTTk9wYXF1ZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUlNOT1BBUVVFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkF1dGhlbnRpY2F0aW9uLCBNb2JpbGl0eURvbWFpbiksCisJb2Zmc2V0b2YodERvdDExZklFTW9iaWxpdHlEb21haW4sIHByZXNlbnQpLCAwLCAiTW9iaWxpdHlEb21haW4iLAorCTAsIDUsIDUsIFNpZ0llTW9iaWxpdHlEb21haW4sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX01PQklMSVRZRE9NQUlOLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkF1dGhlbnRpY2F0aW9uLCBGVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sCisJcHJlc2VudCksIDAsICJGVEluZm8iLCAwLCA4NCwgMjIyLCBTaWdJZUZUSW5mbywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRlRJTkZPLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkF1dGhlbnRpY2F0aW9uLCBUaW1lb3V0SW50ZXJ2YWwpLAorCW9mZnNldG9mKHREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCwgcHJlc2VudCksIDAsICJUaW1lb3V0SW50ZXJ2YWwiLAorCTAsIDcsIDcsIFNpZ0llVGltZW91dEludGVydmFsLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9USU1FT1VUSU5URVJWQUwsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQXV0aGVudGljYXRpb24sIFJJQ0RhdGFEZXNjKSwKKwlvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgcHJlc2VudCksCisJb2Zmc2V0b2YodERvdDExZkF1dGhlbnRpY2F0aW9uLCBudW1fUklDRGF0YURlc2MpLCAiUklDRGF0YURlc2MiLAorCTIsIDIsIDU1MCwgU2lnSWVSSUNEYXRhRGVzYywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUklDREFUQURFU0MsIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2F1dGhlbnRpY2F0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZBdXRoZW50aWNhdGlvbiAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19BdXRoZW50aWNhdGlvbiwgSUVTX0F1dGhlbnRpY2F0aW9uLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2F1dGhlbnRpY2F0aW9uLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfQmVhY29uW10gPSB7CisJeyAiVGltZVN0YW1wIiwgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgVGltZVN0YW1wKSwgU2lnRmZUaW1lU3RhbXAsCisJRE9UMTFGX0ZGX1RJTUVTVEFNUF9MRU4sIH0sCisJeyAiQmVhY29uSW50ZXJ2YWwiLCBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBCZWFjb25JbnRlcnZhbCksCisJU2lnRmZCZWFjb25JbnRlcnZhbCwgRE9UMTFGX0ZGX0JFQUNPTklOVEVSVkFMX0xFTiwgfSwKKwl7ICJDYXBhYmlsaXRpZXMiLCBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBDYXBhYmlsaXRpZXMpLAorCVNpZ0ZmQ2FwYWJpbGl0aWVzLCBET1QxMUZfRkZfQ0FQQUJJTElUSUVTX0xFTiwgfSwKKwl7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19CZWFjb25bXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIFNTSUQpLCBvZmZzZXRvZih0RG90MTFmSUVTU0lELCBwcmVzZW50KSwgMCwKKwkiU1NJRCIsIDAsIDIsIDM0LCBTaWdJZVNTSUQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TU0lELCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgU3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFU3VwcFJhdGVzLAorCXByZXNlbnQpLCAwLCAiU3VwcFJhdGVzIiwgMCwgMiwgMTQsIFNpZ0llU3VwcFJhdGVzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9TVVBQUkFURVMsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBGSFBhcmFtU2V0KSwgb2Zmc2V0b2YodERvdDExZklFRkhQYXJhbVNldCwKKwlwcmVzZW50KSwgMCwgIkZIUGFyYW1TZXQiLCAwLCA3LCA3LCBTaWdJZUZIUGFyYW1TZXQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0ZIUEFSQU1TRVQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBEU1BhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRURTUGFyYW1zLCBwcmVzZW50KSwKKwkwLCAiRFNQYXJhbXMiLCAwLCAzLCAzLCBTaWdJZURTUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9EU1BBUkFNUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIENGUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFQ0ZQYXJhbXMsIHByZXNlbnQpLAorCTAsICJDRlBhcmFtcyIsIDAsIDgsIDgsIFNpZ0llQ0ZQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0NGUEFSQU1TLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgSUJTU1BhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRUlCU1NQYXJhbXMsCisJcHJlc2VudCksIDAsICJJQlNTUGFyYW1zIiwgMCwgNCwgNCwgU2lnSWVJQlNTUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9JQlNTUEFSQU1TLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgVElNKSwgb2Zmc2V0b2YodERvdDExZklFVElNLCBwcmVzZW50KSwgMCwgIlRJTSIsCisJMCwgNiwgMjU2LCBTaWdJZVRJTSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1RJTSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIENvdW50cnkpLCBvZmZzZXRvZih0RG90MTFmSUVDb3VudHJ5LCBwcmVzZW50KSwgMCwKKwkiQ291bnRyeSIsIDAsIDUsIDI1NywgU2lnSWVDb3VudHJ5LCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9DT1VOVFJZLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgRkhQYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVGSFBhcmFtcywgcHJlc2VudCksCisJMCwgIkZIUGFyYW1zIiwgMCwgNCwgNCwgU2lnSWVGSFBhcmFtcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRkhQQVJBTVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBGSFBhdHRUYWJsZSksIG9mZnNldG9mKHREb3QxMWZJRUZIUGF0dFRhYmxlLAorCXByZXNlbnQpLCAwLCAiRkhQYXR0VGFibGUiLCAwLCA2LCAyNTcsIFNpZ0llRkhQYXR0VGFibGUsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0ZIUEFUVFRBQkxFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgUG93ZXJDb25zdHJhaW50cyksCisJb2Zmc2V0b2YodERvdDExZklFUG93ZXJDb25zdHJhaW50cywgcHJlc2VudCksIDAsICJQb3dlckNvbnN0cmFpbnRzIiwKKwkwLCAzLCAzLCBTaWdJZVBvd2VyQ29uc3RyYWludHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1BPV0VSQ09OU1RSQUlOVFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBDaGFuU3dpdGNoQW5uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVDaGFuU3dpdGNoQW5uLCBwcmVzZW50KSwgMCwgIkNoYW5Td2l0Y2hBbm4iLAorCTAsIDUsIDUsIFNpZ0llQ2hhblN3aXRjaEFubiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfQ0hBTlNXSVRDSEFOTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIGV4dF9jaGFuX3N3aXRjaF9hbm4pLAorCW9mZnNldG9mKHREb3QxMWZJRWV4dF9jaGFuX3N3aXRjaF9hbm4sIHByZXNlbnQpLCAwLCAiZXh0X2NoYW5fc3dpdGNoX2FubiIsCisJMCwgNiwgNiwgU2lnSWVleHRfY2hhbl9zd2l0Y2hfYW5uLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FWFRfQ0hBTl9TV0lUQ0hfQU5OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgUXVpZXQpLCBvZmZzZXRvZih0RG90MTFmSUVRdWlldCwgcHJlc2VudCksIDAsCisJIlF1aWV0IiwgMCwgOCwgOCwgU2lnSWVRdWlldCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1FVSUVULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgVFBDUmVwb3J0KSwgb2Zmc2V0b2YodERvdDExZklFVFBDUmVwb3J0LAorCXByZXNlbnQpLCAwLCAiVFBDUmVwb3J0IiwgMCwgNCwgNCwgU2lnSWVUUENSZXBvcnQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1RQQ1JFUE9SVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIEVSUEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVFUlBJbmZvLCBwcmVzZW50KSwgMCwKKwkiRVJQSW5mbyIsIDAsIDMsIDMsIFNpZ0llRVJQSW5mbywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRVJQSU5GTywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIEV4dFN1cHBSYXRlcyksIG9mZnNldG9mKHREb3QxMWZJRUV4dFN1cHBSYXRlcywKKwlwcmVzZW50KSwgMCwgIkV4dFN1cHBSYXRlcyIsIDAsIDMsIDE0LCBTaWdJZUV4dFN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRVhUU1VQUFJBVEVTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgUlNOKSwgb2Zmc2V0b2YodERvdDExZklFUlNOLCBwcmVzZW50KSwgMCwgIlJTTiIsCisJMCwgOCwgMTE2LCBTaWdJZVJTTiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JTTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIFFCU1NMb2FkKSwgb2Zmc2V0b2YodERvdDExZklFUUJTU0xvYWQsIHByZXNlbnQpLAorCTAsICJRQlNTTG9hZCIsIDAsIDcsIDcsIFNpZ0llUUJTU0xvYWQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1FCU1NMT0FELCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgRURDQVBhcmFtU2V0KSwgb2Zmc2V0b2YodERvdDExZklFRURDQVBhcmFtU2V0LAorCXByZXNlbnQpLCAwLCAiRURDQVBhcmFtU2V0IiwgMCwgMjAsIDIwLCBTaWdJZUVEQ0FQYXJhbVNldCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRURDQVBBUkFNU0VULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgUU9TQ2Fwc0FwKSwgb2Zmc2V0b2YodERvdDExZklFUU9TQ2Fwc0FwLAorCXByZXNlbnQpLCAwLCAiUU9TQ2Fwc0FwIiwgMCwgMywgMywgU2lnSWVRT1NDYXBzQXAsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1FPU0NBUFNBUCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIEFQQ2hhbm5lbFJlcG9ydCksCisJb2Zmc2V0b2YodERvdDExZklFQVBDaGFubmVsUmVwb3J0LCBwcmVzZW50KSwgMCwgIkFQQ2hhbm5lbFJlcG9ydCIsCisJMCwgMywgNTMsIFNpZ0llQVBDaGFubmVsUmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9BUENIQU5ORUxSRVBPUlQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBSUk1FbmFibGVkQ2FwKSwKKwlvZmZzZXRvZih0RG90MTFmSUVSUk1FbmFibGVkQ2FwLCBwcmVzZW50KSwgMCwgIlJSTUVuYWJsZWRDYXAiLAorCTAsIDcsIDcsIFNpZ0llUlJNRW5hYmxlZENhcCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUlJNRU5BQkxFRENBUCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIE1vYmlsaXR5RG9tYWluKSwKKwlvZmZzZXRvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbiwgcHJlc2VudCksIDAsICJNb2JpbGl0eURvbWFpbiIsCisJMCwgNSwgNSwgU2lnSWVNb2JpbGl0eURvbWFpbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfTU9CSUxJVFlET01BSU4sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBXUEEpLCBvZmZzZXRvZih0RG90MTFmSUVXUEEsIHByZXNlbnQpLCAwLCAiV1BBIiwKKwkwLCA4LCA1MCwgU2lnSWVXUEEsIHswLCA4MCwgMjQyLCAxLCAwfSwgNCwgRE9UMTFGX0VJRF9XUEEsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVIVENhcHMsIHByZXNlbnQpLCAwLAorCSJIVENhcHMiLCAwLCAyOCwgNjAsIFNpZ0llSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9IVENBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBIVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVIVEluZm8sIHByZXNlbnQpLCAwLAorCSJIVEluZm8iLCAwLCAyNCwgNTYsIFNpZ0llSFRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9IVElORk8sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBzZWNfY2hhbl9vZmZzZXRfZWxlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVzZWNfY2hhbl9vZmZzZXRfZWxlLCBwcmVzZW50KSwgMCwgInNlY19jaGFuX29mZnNldF9lbGUiLAorCTAsIDMsIDMsIFNpZ0llc2VjX2NoYW5fb2Zmc2V0X2VsZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfU0VDX0NIQU5fT0ZGU0VUX0VMRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIFdNTUluZm9BcCksIG9mZnNldG9mKHREb3QxMWZJRVdNTUluZm9BcCwKKwlwcmVzZW50KSwgMCwgIldNTUluZm9BcCIsIDAsIDksIDksIFNpZ0llV01NSW5mb0FwLCB7MCwgODAsIDI0MiwgMiwgMH0sCisJNSwgRE9UMTFGX0VJRF9XTU1JTkZPQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBXTU1QYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1QYXJhbXMsCisJcHJlc2VudCksIDAsICJXTU1QYXJhbXMiLCAwLCAyNiwgMjYsIFNpZ0llV01NUGFyYW1zLCB7MCwgODAsIDI0MiwgMiwgMX0sCisJNSwgRE9UMTFGX0VJRF9XTU1QQVJBTVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBXTU1DYXBzKSwgb2Zmc2V0b2YodERvdDExZklFV01NQ2FwcywgcHJlc2VudCksIDAsCisJIldNTUNhcHMiLCAwLCA5LCA5LCBTaWdJZVdNTUNhcHMsIHswLCA4MCwgMjQyLCAyLCA1fSwKKwk1LCBET1QxMUZfRUlEX1dNTUNBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBXQVBJKSwgb2Zmc2V0b2YodERvdDExZklFV0FQSSwgcHJlc2VudCksIDAsCisJIldBUEkiLCAwLCAxNCwgMTEyLCBTaWdJZVdBUEksIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9XQVBJLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgRVNFUmFkTWdtdENhcCksCisJb2Zmc2V0b2YodERvdDExZklFRVNFUmFkTWdtdENhcCwgcHJlc2VudCksIDAsICJFU0VSYWRNZ210Q2FwIiwKKwkwLCA4LCA4LCBTaWdJZUVTRVJhZE1nbXRDYXAsIHswLCA2NCwgMTUwLCAxLCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVJBRE1HTVRDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBFU0VUcmFmU3RybU1ldCksCisJb2Zmc2V0b2YodERvdDExZklFRVNFVHJhZlN0cm1NZXQsIHByZXNlbnQpLCAwLCAiRVNFVHJhZlN0cm1NZXQiLAorCTAsIDEwLCAxMCwgU2lnSWVFU0VUcmFmU3RybU1ldCwgezAsIDY0LCAxNTAsIDcsIDB9LAorCTQsIERPVDExRl9FSURfRVNFVFJBRlNUUk1NRVQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBFU0VUeG1pdFBvd2VyKSwKKwlvZmZzZXRvZih0RG90MTFmSUVFU0VUeG1pdFBvd2VyLCBwcmVzZW50KSwgMCwgIkVTRVR4bWl0UG93ZXIiLAorCTAsIDgsIDgsIFNpZ0llRVNFVHhtaXRQb3dlciwgezAsIDY0LCAxNTAsIDAsIDB9LAorCTQsIERPVDExRl9FSURfRVNFVFhNSVRQT1dFUiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIFdzY0JlYWNvbiksIG9mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvbiwKKwlwcmVzZW50KSwgMCwgIldzY0JlYWNvbiIsIDAsIDYsIDg0LCBTaWdJZVdzY0JlYWNvbiwgezAsIDgwLCAyNDIsIDQsIDB9LAorCTQsIERPVDExRl9FSURfV1NDQkVBQ09OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgUDJQQmVhY29uKSwgb2Zmc2V0b2YodERvdDExZklFUDJQQmVhY29uLAorCXByZXNlbnQpLCAwLCAiUDJQQmVhY29uIiwgMCwgNiwgNjEsIFNpZ0llUDJQQmVhY29uLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwKKwk0LCBET1QxMUZfRUlEX1AyUEJFQUNPTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIFZIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVWSFRDYXBzLCBwcmVzZW50KSwgMCwKKwkiVkhUQ2FwcyIsIDAsIDE0LCAxNCwgU2lnSWVWSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9WSFRDQVBTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgVkhUT3BlcmF0aW9uKSwgb2Zmc2V0b2YodERvdDExZklFVkhUT3BlcmF0aW9uLAorCXByZXNlbnQpLCAwLCAiVkhUT3BlcmF0aW9uIiwgMCwgNywgNywgU2lnSWVWSFRPcGVyYXRpb24sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1ZIVE9QRVJBVElPTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIFZIVEV4dEJzc0xvYWQpLAorCW9mZnNldG9mKHREb3QxMWZJRVZIVEV4dEJzc0xvYWQsIHByZXNlbnQpLCAwLCAiVkhURXh0QnNzTG9hZCIsCisJMCwgNywgNywgU2lnSWVWSFRFeHRCc3NMb2FkLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9WSFRFWFRCU1NMT0FELCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgRXh0Q2FwKSwgb2Zmc2V0b2YodERvdDExZklFRXh0Q2FwLCBwcmVzZW50KSwgMCwKKwkiRXh0Q2FwIiwgMCwgMTAsIDExLCBTaWdJZUV4dENhcCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRVhUQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgT3BlcmF0aW5nTW9kZSksCisJb2Zmc2V0b2YodERvdDExZklFT3BlcmF0aW5nTW9kZSwgcHJlc2VudCksIDAsICJPcGVyYXRpbmdNb2RlIiwKKwkwLCAzLCAzLCBTaWdJZU9wZXJhdGluZ01vZGUsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX09QRVJBVElOR01PREUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBXaWRlckJXQ2hhblN3aXRjaEFubiksCisJb2Zmc2V0b2YodERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4sIHByZXNlbnQpLCAwLAorCSJXaWRlckJXQ2hhblN3aXRjaEFubiIsIDAsIDUsIDUsIFNpZ0llV2lkZXJCV0NoYW5Td2l0Y2hBbm4sCisJezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1dJREVSQldDSEFOU1dJVENIQU5OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgT0JTU1NjYW5QYXJhbWV0ZXJzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVPQlNTU2NhblBhcmFtZXRlcnMsIHByZXNlbnQpLCAwLCAiT0JTU1NjYW5QYXJhbWV0ZXJzIiwKKwkwLCAxNiwgMTYsIFNpZ0llT0JTU1NjYW5QYXJhbWV0ZXJzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9PQlNTU0NBTlBBUkFNRVRFUlMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBWZW5kb3IxSUUpLCBvZmZzZXRvZih0RG90MTFmSUVWZW5kb3IxSUUsCisJcHJlc2VudCksIDAsICJWZW5kb3IxSUUiLCAwLCA1LCA1LCBTaWdJZVZlbmRvcjFJRSwgezAsIDE2LCAyNCwgMCwgMH0sCisJMywgRE9UMTFGX0VJRF9WRU5ET1IxSUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uLCB2ZW5kb3IyX2llKSwgb2Zmc2V0b2YodERvdDExZklFdmVuZG9yMl9pZSwKKwlwcmVzZW50KSwgMCwgInZlbmRvcjJfaWUiLCAwLCA3LCAyOCwgU2lnSWV2ZW5kb3IyX2llLCB7MCwgMTQ0LCA3NiwgMCwgMH0sCisJMywgRE9UMTFGX0VJRF9WRU5ET1IyX0lFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgVmVuZG9yM0lFKSwgb2Zmc2V0b2YodERvdDExZklFVmVuZG9yM0lFLAorCXByZXNlbnQpLCAwLCAiVmVuZG9yM0lFIiwgMCwgNSwgNSwgU2lnSWVWZW5kb3IzSUUsIHswLCAyMiwgNTAsIDAsIDB9LAorCTMsIERPVDExRl9FSURfVkVORE9SM0lFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgQ2hhbm5lbFN3aXRjaFdyYXBwZXIpLAorCW9mZnNldG9mKHREb3QxMWZJRUNoYW5uZWxTd2l0Y2hXcmFwcGVyLCBwcmVzZW50KSwgMCwKKwkiQ2hhbm5lbFN3aXRjaFdyYXBwZXIiLCAwLCAyLCA3LCBTaWdJZUNoYW5uZWxTd2l0Y2hXcmFwcGVyLAorCXswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9DSEFOTkVMU1dJVENIV1JBUFBFUiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24sIFFDb21WZW5kb3JJRSksIG9mZnNldG9mKHREb3QxMWZJRVFDb21WZW5kb3JJRSwKKwlwcmVzZW50KSwgMCwgIlFDb21WZW5kb3JJRSIsIDAsIDcsIDcsIFNpZ0llUUNvbVZlbmRvcklFLAorCXswLCAxNjAsIDE5OCwgMCwgMH0sIDMsIERPVDExRl9FSURfUUNPTVZFTkRPUklFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgRVNFVmVyc2lvbiksIG9mZnNldG9mKHREb3QxMWZJRUVTRVZlcnNpb24sCisJcHJlc2VudCksIDAsICJFU0VWZXJzaW9uIiwgMCwgNywgNywgU2lnSWVFU0VWZXJzaW9uLCB7MCwgNjQsIDE1MCwgMywgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VWRVJTSU9OLCAwLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19iZWFjb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZkJlYWNvbiAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19CZWFjb24sIElFU19CZWFjb24sCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfYmVhY29uLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfQmVhY29uMVtdID0geworCXsgIlRpbWVTdGFtcCIsIG9mZnNldG9mKHREb3QxMWZCZWFjb24xLCBUaW1lU3RhbXApLCBTaWdGZlRpbWVTdGFtcCwKKwlET1QxMUZfRkZfVElNRVNUQU1QX0xFTiwgfSwKKwl7ICJCZWFjb25JbnRlcnZhbCIsIG9mZnNldG9mKHREb3QxMWZCZWFjb24xLCBCZWFjb25JbnRlcnZhbCksCisJU2lnRmZCZWFjb25JbnRlcnZhbCwgRE9UMTFGX0ZGX0JFQUNPTklOVEVSVkFMX0xFTiwgfSwKKwl7ICJDYXBhYmlsaXRpZXMiLCBvZmZzZXRvZih0RG90MTFmQmVhY29uMSwgQ2FwYWJpbGl0aWVzKSwKKwlTaWdGZkNhcGFiaWxpdGllcywgRE9UMTFGX0ZGX0NBUEFCSUxJVElFU19MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfQmVhY29uMVtdID0geworCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjEsIFNTSUQpLCBvZmZzZXRvZih0RG90MTFmSUVTU0lELCBwcmVzZW50KSwgMCwKKwkiU1NJRCIsIDAsIDIsIDM0LCBTaWdJZVNTSUQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TU0lELCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjEsIFN1cHBSYXRlcyksIG9mZnNldG9mKHREb3QxMWZJRVN1cHBSYXRlcywKKwlwcmVzZW50KSwgMCwgIlN1cHBSYXRlcyIsIDAsIDIsIDE0LCBTaWdJZVN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfU1VQUFJBVEVTLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjEsIERTUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFRFNQYXJhbXMsCisJcHJlc2VudCksIDAsICJEU1BhcmFtcyIsIDAsIDMsIDMsIFNpZ0llRFNQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0RTUEFSQU1TLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjEsIElCU1NQYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVJQlNTUGFyYW1zLAorCXByZXNlbnQpLCAwLCAiSUJTU1BhcmFtcyIsIDAsIDQsIDQsIFNpZ0llSUJTU1BhcmFtcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfSUJTU1BBUkFNUywgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfYmVhY29uMSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmQmVhY29uMSAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19CZWFjb24xLCBJRVNfQmVhY29uMSwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19iZWFjb24xLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfQmVhY29uMltdID0geworCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0JlYWNvbjJbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBDb3VudHJ5KSwgb2Zmc2V0b2YodERvdDExZklFQ291bnRyeSwgcHJlc2VudCksCisJMCwgIkNvdW50cnkiLCAwLCA1LCAyNTcsIFNpZ0llQ291bnRyeSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfQ09VTlRSWSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBQb3dlckNvbnN0cmFpbnRzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzLCBwcmVzZW50KSwgMCwgIlBvd2VyQ29uc3RyYWludHMiLAorCTAsIDMsIDMsIFNpZ0llUG93ZXJDb25zdHJhaW50cywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUE9XRVJDT05TVFJBSU5UUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBDaGFuU3dpdGNoQW5uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVDaGFuU3dpdGNoQW5uLCBwcmVzZW50KSwgMCwgIkNoYW5Td2l0Y2hBbm4iLAorCTAsIDUsIDUsIFNpZ0llQ2hhblN3aXRjaEFubiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfQ0hBTlNXSVRDSEFOTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBleHRfY2hhbl9zd2l0Y2hfYW5uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVleHRfY2hhbl9zd2l0Y2hfYW5uLCBwcmVzZW50KSwgMCwgImV4dF9jaGFuX3N3aXRjaF9hbm4iLAorCTAsIDYsIDYsIFNpZ0llZXh0X2NoYW5fc3dpdGNoX2FubiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRVhUX0NIQU5fU1dJVENIX0FOTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBRdWlldCksIG9mZnNldG9mKHREb3QxMWZJRVF1aWV0LCBwcmVzZW50KSwgMCwKKwkiUXVpZXQiLCAwLCA4LCA4LCBTaWdJZVF1aWV0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUVVJRVQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgVFBDUmVwb3J0KSwgb2Zmc2V0b2YodERvdDExZklFVFBDUmVwb3J0LAorCXByZXNlbnQpLCAwLCAiVFBDUmVwb3J0IiwgMCwgNCwgNCwgU2lnSWVUUENSZXBvcnQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1RQQ1JFUE9SVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBFUlBJbmZvKSwgb2Zmc2V0b2YodERvdDExZklFRVJQSW5mbywgcHJlc2VudCksCisJMCwgIkVSUEluZm8iLCAwLCAzLCAzLCBTaWdJZUVSUEluZm8sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VSUElORk8sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgRXh0U3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFRXh0U3VwcFJhdGVzLAorCXByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiwgMCwgMywgMTQsIFNpZ0llRXh0U3VwcFJhdGVzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FWFRTVVBQUkFURVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgUlNOT3BhcXVlKSwgb2Zmc2V0b2YodERvdDExZklFUlNOT3BhcXVlLAorCXByZXNlbnQpLCAwLCAiUlNOT3BhcXVlIiwgMCwgOCwgMjU1LCBTaWdJZVJTTk9wYXF1ZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUlNOT1BBUVVFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIEVEQ0FQYXJhbVNldCksIG9mZnNldG9mKHREb3QxMWZJRUVEQ0FQYXJhbVNldCwKKwlwcmVzZW50KSwgMCwgIkVEQ0FQYXJhbVNldCIsIDAsIDIwLCAyMCwgU2lnSWVFRENBUGFyYW1TZXQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VEQ0FQQVJBTVNFVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBBUENoYW5uZWxSZXBvcnQpLAorCW9mZnNldG9mKHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCwgcHJlc2VudCksIDAsICJBUENoYW5uZWxSZXBvcnQiLAorCTAsIDMsIDUzLCBTaWdJZUFQQ2hhbm5lbFJlcG9ydCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfQVBDSEFOTkVMUkVQT1JULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIFJSTUVuYWJsZWRDYXApLAorCW9mZnNldG9mKHREb3QxMWZJRVJSTUVuYWJsZWRDYXAsIHByZXNlbnQpLCAwLCAiUlJNRW5hYmxlZENhcCIsCisJMCwgNywgNywgU2lnSWVSUk1FbmFibGVkQ2FwLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9SUk1FTkFCTEVEQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIE1vYmlsaXR5RG9tYWluKSwKKwlvZmZzZXRvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbiwgcHJlc2VudCksIDAsICJNb2JpbGl0eURvbWFpbiIsCisJMCwgNSwgNSwgU2lnSWVNb2JpbGl0eURvbWFpbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfTU9CSUxJVFlET01BSU4sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgV1BBKSwgb2Zmc2V0b2YodERvdDExZklFV1BBLCBwcmVzZW50KSwgMCwgIldQQSIsCisJMCwgOCwgNTAsIFNpZ0llV1BBLCB7MCwgODAsIDI0MiwgMSwgMH0sIDQsIERPVDExRl9FSURfV1BBLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIEhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRUhUQ2FwcywgcHJlc2VudCksIDAsCisJIkhUQ2FwcyIsIDAsIDI4LCA2MCwgU2lnSWVIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0hUQ0FQUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBIVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVIVEluZm8sIHByZXNlbnQpLCAwLAorCSJIVEluZm8iLCAwLCAyNCwgNTYsIFNpZ0llSFRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9IVElORk8sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgc2VjX2NoYW5fb2Zmc2V0X2VsZSksCisJb2Zmc2V0b2YodERvdDExZklFc2VjX2NoYW5fb2Zmc2V0X2VsZSwgcHJlc2VudCksIDAsICJzZWNfY2hhbl9vZmZzZXRfZWxlIiwKKwkwLCAzLCAzLCBTaWdJZXNlY19jaGFuX29mZnNldF9lbGUsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1NFQ19DSEFOX09GRlNFVF9FTEUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgV01NSW5mb0FwKSwgb2Zmc2V0b2YodERvdDExZklFV01NSW5mb0FwLAorCXByZXNlbnQpLCAwLCAiV01NSW5mb0FwIiwgMCwgOSwgOSwgU2lnSWVXTU1JbmZvQXAsIHswLCA4MCwgMjQyLCAyLCAwfSwKKwk1LCBET1QxMUZfRUlEX1dNTUlORk9BUCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBXTU1QYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1QYXJhbXMsCisJcHJlc2VudCksIDAsICJXTU1QYXJhbXMiLCAwLCAyNiwgMjYsIFNpZ0llV01NUGFyYW1zLCB7MCwgODAsIDI0MiwgMiwgMX0sCisJNSwgRE9UMTFGX0VJRF9XTU1QQVJBTVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgV01NQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVdNTUNhcHMsIHByZXNlbnQpLAorCTAsICJXTU1DYXBzIiwgMCwgOSwgOSwgU2lnSWVXTU1DYXBzLCB7MCwgODAsIDI0MiwgMiwgNX0sCisJNSwgRE9UMTFGX0VJRF9XTU1DQVBTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIFdzY0JlYWNvbiksIG9mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvbiwKKwlwcmVzZW50KSwgMCwgIldzY0JlYWNvbiIsIDAsIDYsIDg0LCBTaWdJZVdzY0JlYWNvbiwgezAsIDgwLCAyNDIsIDQsIDB9LAorCTQsIERPVDExRl9FSURfV1NDQkVBQ09OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIFdBUEkpLCBvZmZzZXRvZih0RG90MTFmSUVXQVBJLCBwcmVzZW50KSwgMCwKKwkiV0FQSSIsIDAsIDE0LCAxMTIsIFNpZ0llV0FQSSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1dBUEksIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgRVNFUmFkTWdtdENhcCksCisJb2Zmc2V0b2YodERvdDExZklFRVNFUmFkTWdtdENhcCwgcHJlc2VudCksIDAsICJFU0VSYWRNZ210Q2FwIiwKKwkwLCA4LCA4LCBTaWdJZUVTRVJhZE1nbXRDYXAsIHswLCA2NCwgMTUwLCAxLCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVJBRE1HTVRDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgRVNFVHJhZlN0cm1NZXQpLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRVRyYWZTdHJtTWV0LCBwcmVzZW50KSwgMCwgIkVTRVRyYWZTdHJtTWV0IiwKKwkwLCAxMCwgMTAsIFNpZ0llRVNFVHJhZlN0cm1NZXQsIHswLCA2NCwgMTUwLCA3LCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVRSQUZTVFJNTUVULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIEVTRVR4bWl0UG93ZXIpLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRVR4bWl0UG93ZXIsIHByZXNlbnQpLCAwLCAiRVNFVHhtaXRQb3dlciIsCisJMCwgOCwgOCwgU2lnSWVFU0VUeG1pdFBvd2VyLCB7MCwgNjQsIDE1MCwgMCwgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VUWE1JVFBPV0VSLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIFAyUEJlYWNvbiksIG9mZnNldG9mKHREb3QxMWZJRVAyUEJlYWNvbiwKKwlwcmVzZW50KSwgMCwgIlAyUEJlYWNvbiIsIDAsIDYsIDYxLCBTaWdJZVAyUEJlYWNvbiwgezgwLCAxMTEsIDE1NCwgOSwgMH0sCisJNCwgRE9UMTFGX0VJRF9QMlBCRUFDT04sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgVkhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVZIVENhcHMsIHByZXNlbnQpLAorCTAsICJWSFRDYXBzIiwgMCwgMTQsIDE0LCBTaWdJZVZIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1ZIVENBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgVkhUT3BlcmF0aW9uKSwgb2Zmc2V0b2YodERvdDExZklFVkhUT3BlcmF0aW9uLAorCXByZXNlbnQpLCAwLCAiVkhUT3BlcmF0aW9uIiwgMCwgNywgNywgU2lnSWVWSFRPcGVyYXRpb24sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1ZIVE9QRVJBVElPTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBWSFRFeHRCc3NMb2FkKSwKKwlvZmZzZXRvZih0RG90MTFmSUVWSFRFeHRCc3NMb2FkLCBwcmVzZW50KSwgMCwgIlZIVEV4dEJzc0xvYWQiLAorCTAsIDcsIDcsIFNpZ0llVkhURXh0QnNzTG9hZCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVkhURVhUQlNTTE9BRCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBFeHRDYXApLCBvZmZzZXRvZih0RG90MTFmSUVFeHRDYXAsIHByZXNlbnQpLCAwLAorCSJFeHRDYXAiLCAwLCAxMCwgMTEsIFNpZ0llRXh0Q2FwLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FWFRDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgT3BlcmF0aW5nTW9kZSksCisJb2Zmc2V0b2YodERvdDExZklFT3BlcmF0aW5nTW9kZSwgcHJlc2VudCksIDAsICJPcGVyYXRpbmdNb2RlIiwKKwkwLCAzLCAzLCBTaWdJZU9wZXJhdGluZ01vZGUsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX09QRVJBVElOR01PREUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgV2lkZXJCV0NoYW5Td2l0Y2hBbm4pLAorCW9mZnNldG9mKHREb3QxMWZJRVdpZGVyQldDaGFuU3dpdGNoQW5uLCBwcmVzZW50KSwgMCwKKwkiV2lkZXJCV0NoYW5Td2l0Y2hBbm4iLCAwLCA1LCA1LCBTaWdJZVdpZGVyQldDaGFuU3dpdGNoQW5uLAorCXswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9XSURFUkJXQ0hBTlNXSVRDSEFOTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBPQlNTU2NhblBhcmFtZXRlcnMpLAorCW9mZnNldG9mKHREb3QxMWZJRU9CU1NTY2FuUGFyYW1ldGVycywgcHJlc2VudCksIDAsICJPQlNTU2NhblBhcmFtZXRlcnMiLAorCTAsIDE2LCAxNiwgU2lnSWVPQlNTU2NhblBhcmFtZXRlcnMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX09CU1NTQ0FOUEFSQU1FVEVSUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBWZW5kb3IxSUUpLCBvZmZzZXRvZih0RG90MTFmSUVWZW5kb3IxSUUsCisJcHJlc2VudCksIDAsICJWZW5kb3IxSUUiLCAwLCA1LCA1LCBTaWdJZVZlbmRvcjFJRSwgezAsIDE2LCAyNCwgMCwgMH0sCisJMywgRE9UMTFGX0VJRF9WRU5ET1IxSUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgdmVuZG9yMl9pZSksIG9mZnNldG9mKHREb3QxMWZJRXZlbmRvcjJfaWUsCisJcHJlc2VudCksIDAsICJ2ZW5kb3IyX2llIiwgMCwgNywgMjgsIFNpZ0lldmVuZG9yMl9pZSwgezAsIDE0NCwgNzYsIDAsIDB9LAorCTMsIERPVDExRl9FSURfVkVORE9SMl9JRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBWZW5kb3IzSUUpLCBvZmZzZXRvZih0RG90MTFmSUVWZW5kb3IzSUUsCisJcHJlc2VudCksIDAsICJWZW5kb3IzSUUiLCAwLCA1LCA1LCBTaWdJZVZlbmRvcjNJRSwgezAsIDIyLCA1MCwgMCwgMH0sCisJMywgRE9UMTFGX0VJRF9WRU5ET1IzSUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgQ2hhbm5lbFN3aXRjaFdyYXBwZXIpLAorCW9mZnNldG9mKHREb3QxMWZJRUNoYW5uZWxTd2l0Y2hXcmFwcGVyLCBwcmVzZW50KSwgMCwKKwkiQ2hhbm5lbFN3aXRjaFdyYXBwZXIiLCAwLCAyLCA3LCBTaWdJZUNoYW5uZWxTd2l0Y2hXcmFwcGVyLAorCXswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9DSEFOTkVMU1dJVENIV1JBUFBFUiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBRQ29tVmVuZG9ySUUpLCBvZmZzZXRvZih0RG90MTFmSUVRQ29tVmVuZG9ySUUsCisJcHJlc2VudCksIDAsICJRQ29tVmVuZG9ySUUiLCAwLCA3LCA3LCBTaWdJZVFDb21WZW5kb3JJRSwKKwl7MCwgMTYwLCAxOTgsIDAsIDB9LCAzLCBET1QxMUZfRUlEX1FDT01WRU5ET1JJRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb24yLCBFU0VWZXJzaW9uKSwgb2Zmc2V0b2YodERvdDExZklFRVNFVmVyc2lvbiwKKwlwcmVzZW50KSwgMCwgIkVTRVZlcnNpb24iLCAwLCA3LCA3LCBTaWdJZUVTRVZlcnNpb24sIHswLCA2NCwgMTUwLCAzLCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVZFUlNJT04sIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2JlYWNvbjIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZkJlYWNvbjIgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfQmVhY29uMiwgSUVTX0JlYWNvbjIsCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfYmVhY29uMi4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0JlYWNvbklFc1tdID0geworCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0JlYWNvbklFc1tdID0geworCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgU1NJRCksIG9mZnNldG9mKHREb3QxMWZJRVNTSUQsIHByZXNlbnQpLCAwLAorCSJTU0lEIiwgMCwgMiwgMzQsIFNpZ0llU1NJRCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NTSUQsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVTdXBwUmF0ZXMsCisJcHJlc2VudCksIDAsICJTdXBwUmF0ZXMiLCAwLCAyLCAxNCwgU2lnSWVTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1NVUFBSQVRFUywgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIEZIUGFyYW1TZXQpLCBvZmZzZXRvZih0RG90MTFmSUVGSFBhcmFtU2V0LAorCXByZXNlbnQpLCAwLCAiRkhQYXJhbVNldCIsIDAsIDcsIDcsIFNpZ0llRkhQYXJhbVNldCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRkhQQVJBTVNFVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIERTUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFRFNQYXJhbXMsCisJcHJlc2VudCksIDAsICJEU1BhcmFtcyIsIDAsIDMsIDMsIFNpZ0llRFNQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0RTUEFSQU1TLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgQ0ZQYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVDRlBhcmFtcywKKwlwcmVzZW50KSwgMCwgIkNGUGFyYW1zIiwgMCwgOCwgOCwgU2lnSWVDRlBhcmFtcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfQ0ZQQVJBTVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBJQlNTUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFSUJTU1BhcmFtcywKKwlwcmVzZW50KSwgMCwgIklCU1NQYXJhbXMiLCAwLCA0LCA0LCBTaWdJZUlCU1NQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0lCU1NQQVJBTVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBUSU0pLCBvZmZzZXRvZih0RG90MTFmSUVUSU0sIHByZXNlbnQpLCAwLAorCSJUSU0iLCAwLCA2LCAyNTYsIFNpZ0llVElNLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVElNLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgQ291bnRyeSksIG9mZnNldG9mKHREb3QxMWZJRUNvdW50cnksCisJcHJlc2VudCksIDAsICJDb3VudHJ5IiwgMCwgNSwgMjU3LCBTaWdJZUNvdW50cnksIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0NPVU5UUlksIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBGSFBhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRUZIUGFyYW1zLAorCXByZXNlbnQpLCAwLCAiRkhQYXJhbXMiLCAwLCA0LCA0LCBTaWdJZUZIUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9GSFBBUkFNUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIEZIUGF0dFRhYmxlKSwgb2Zmc2V0b2YodERvdDExZklFRkhQYXR0VGFibGUsCisJcHJlc2VudCksIDAsICJGSFBhdHRUYWJsZSIsIDAsIDYsIDI1NywgU2lnSWVGSFBhdHRUYWJsZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRkhQQVRUVEFCTEUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBQb3dlckNvbnN0cmFpbnRzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzLCBwcmVzZW50KSwgMCwgIlBvd2VyQ29uc3RyYWludHMiLAorCTAsIDMsIDMsIFNpZ0llUG93ZXJDb25zdHJhaW50cywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUE9XRVJDT05TVFJBSU5UUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIENoYW5Td2l0Y2hBbm4pLAorCW9mZnNldG9mKHREb3QxMWZJRUNoYW5Td2l0Y2hBbm4sIHByZXNlbnQpLCAwLCAiQ2hhblN3aXRjaEFubiIsCisJMCwgNSwgNSwgU2lnSWVDaGFuU3dpdGNoQW5uLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9DSEFOU1dJVENIQU5OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgZXh0X2NoYW5fc3dpdGNoX2FubiksCisJb2Zmc2V0b2YodERvdDExZklFZXh0X2NoYW5fc3dpdGNoX2FubiwgcHJlc2VudCksIDAsICJleHRfY2hhbl9zd2l0Y2hfYW5uIiwKKwkwLCA2LCA2LCBTaWdJZWV4dF9jaGFuX3N3aXRjaF9hbm4sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VYVF9DSEFOX1NXSVRDSF9BTk4sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBRdWlldCksIG9mZnNldG9mKHREb3QxMWZJRVF1aWV0LCBwcmVzZW50KSwgMCwKKwkiUXVpZXQiLCAwLCA4LCA4LCBTaWdJZVF1aWV0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUVVJRVQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBUUENSZXBvcnQpLCBvZmZzZXRvZih0RG90MTFmSUVUUENSZXBvcnQsCisJcHJlc2VudCksIDAsICJUUENSZXBvcnQiLCAwLCA0LCA0LCBTaWdJZVRQQ1JlcG9ydCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVFBDUkVQT1JULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgRVJQSW5mbyksIG9mZnNldG9mKHREb3QxMWZJRUVSUEluZm8sCisJcHJlc2VudCksIDAsICJFUlBJbmZvIiwgMCwgMywgMywgU2lnSWVFUlBJbmZvLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FUlBJTkZPLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgRXh0U3VwcFJhdGVzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiwKKwkwLCAzLCAxNCwgU2lnSWVFeHRTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFJTTiksIG9mZnNldG9mKHREb3QxMWZJRVJTTiwgcHJlc2VudCksIDAsCisJIlJTTiIsIDAsIDgsIDExNiwgU2lnSWVSU04sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SU04sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBRQlNTTG9hZCksIG9mZnNldG9mKHREb3QxMWZJRVFCU1NMb2FkLAorCXByZXNlbnQpLCAwLCAiUUJTU0xvYWQiLCAwLCA3LCA3LCBTaWdJZVFCU1NMb2FkLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9RQlNTTE9BRCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIEVEQ0FQYXJhbVNldCksCisJb2Zmc2V0b2YodERvdDExZklFRURDQVBhcmFtU2V0LCBwcmVzZW50KSwgMCwgIkVEQ0FQYXJhbVNldCIsCisJMCwgMjAsIDIwLCBTaWdJZUVEQ0FQYXJhbVNldCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRURDQVBBUkFNU0VULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgUU9TQ2Fwc0FwKSwgb2Zmc2V0b2YodERvdDExZklFUU9TQ2Fwc0FwLAorCXByZXNlbnQpLCAwLCAiUU9TQ2Fwc0FwIiwgMCwgMywgMywgU2lnSWVRT1NDYXBzQXAsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1FPU0NBUFNBUCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIEFQQ2hhbm5lbFJlcG9ydCksCisJb2Zmc2V0b2YodERvdDExZklFQVBDaGFubmVsUmVwb3J0LCBwcmVzZW50KSwgMCwgIkFQQ2hhbm5lbFJlcG9ydCIsCisJMCwgMywgNTMsIFNpZ0llQVBDaGFubmVsUmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9BUENIQU5ORUxSRVBPUlQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBSUk1FbmFibGVkQ2FwKSwKKwlvZmZzZXRvZih0RG90MTFmSUVSUk1FbmFibGVkQ2FwLCBwcmVzZW50KSwgMCwgIlJSTUVuYWJsZWRDYXAiLAorCTAsIDcsIDcsIFNpZ0llUlJNRW5hYmxlZENhcCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUlJNRU5BQkxFRENBUCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIE1vYmlsaXR5RG9tYWluKSwKKwlvZmZzZXRvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbiwgcHJlc2VudCksIDAsICJNb2JpbGl0eURvbWFpbiIsCisJMCwgNSwgNSwgU2lnSWVNb2JpbGl0eURvbWFpbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfTU9CSUxJVFlET01BSU4sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBXUEEpLCBvZmZzZXRvZih0RG90MTFmSUVXUEEsIHByZXNlbnQpLCAwLAorCSJXUEEiLCAwLCA4LCA1MCwgU2lnSWVXUEEsIHswLCA4MCwgMjQyLCAxLCAwfSwgNCwgRE9UMTFGX0VJRF9XUEEsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVIVENhcHMsIHByZXNlbnQpLAorCTAsICJIVENhcHMiLCAwLCAyOCwgNjAsIFNpZ0llSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9IVENBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBIVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVIVEluZm8sIHByZXNlbnQpLAorCTAsICJIVEluZm8iLCAwLCAyNCwgNTYsIFNpZ0llSFRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9IVElORk8sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBzZWNfY2hhbl9vZmZzZXRfZWxlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVzZWNfY2hhbl9vZmZzZXRfZWxlLCBwcmVzZW50KSwgMCwgInNlY19jaGFuX29mZnNldF9lbGUiLAorCTAsIDMsIDMsIFNpZ0llc2VjX2NoYW5fb2Zmc2V0X2VsZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfU0VDX0NIQU5fT0ZGU0VUX0VMRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFdNTUluZm9BcCksIG9mZnNldG9mKHREb3QxMWZJRVdNTUluZm9BcCwKKwlwcmVzZW50KSwgMCwgIldNTUluZm9BcCIsIDAsIDksIDksIFNpZ0llV01NSW5mb0FwLCB7MCwgODAsIDI0MiwgMiwgMH0sCisJNSwgRE9UMTFGX0VJRF9XTU1JTkZPQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBXTU1QYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1QYXJhbXMsCisJcHJlc2VudCksIDAsICJXTU1QYXJhbXMiLCAwLCAyNiwgMjYsIFNpZ0llV01NUGFyYW1zLCB7MCwgODAsIDI0MiwgMiwgMX0sCisJNSwgRE9UMTFGX0VJRF9XTU1QQVJBTVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBXTU1DYXBzKSwgb2Zmc2V0b2YodERvdDExZklFV01NQ2FwcywKKwlwcmVzZW50KSwgMCwgIldNTUNhcHMiLCAwLCA5LCA5LCBTaWdJZVdNTUNhcHMsIHswLCA4MCwgMjQyLCAyLCA1fSwKKwk1LCBET1QxMUZfRUlEX1dNTUNBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBXQVBJKSwgb2Zmc2V0b2YodERvdDExZklFV0FQSSwgcHJlc2VudCksIDAsCisJIldBUEkiLCAwLCAxNCwgMTEyLCBTaWdJZVdBUEksIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9XQVBJLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgRVNFVmVyc2lvbiksIG9mZnNldG9mKHREb3QxMWZJRUVTRVZlcnNpb24sCisJcHJlc2VudCksIDAsICJFU0VWZXJzaW9uIiwgMCwgNywgNywgU2lnSWVFU0VWZXJzaW9uLCB7MCwgNjQsIDE1MCwgMywgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VWRVJTSU9OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgRVNFUmFkTWdtdENhcCksCisJb2Zmc2V0b2YodERvdDExZklFRVNFUmFkTWdtdENhcCwgcHJlc2VudCksIDAsICJFU0VSYWRNZ210Q2FwIiwKKwkwLCA4LCA4LCBTaWdJZUVTRVJhZE1nbXRDYXAsIHswLCA2NCwgMTUwLCAxLCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVJBRE1HTVRDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBFU0VUcmFmU3RybU1ldCksCisJb2Zmc2V0b2YodERvdDExZklFRVNFVHJhZlN0cm1NZXQsIHByZXNlbnQpLCAwLCAiRVNFVHJhZlN0cm1NZXQiLAorCTAsIDEwLCAxMCwgU2lnSWVFU0VUcmFmU3RybU1ldCwgezAsIDY0LCAxNTAsIDcsIDB9LAorCTQsIERPVDExRl9FSURfRVNFVFJBRlNUUk1NRVQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBFU0VUeG1pdFBvd2VyKSwKKwlvZmZzZXRvZih0RG90MTFmSUVFU0VUeG1pdFBvd2VyLCBwcmVzZW50KSwgMCwgIkVTRVR4bWl0UG93ZXIiLAorCTAsIDgsIDgsIFNpZ0llRVNFVHhtaXRQb3dlciwgezAsIDY0LCAxNTAsIDAsIDB9LAorCTQsIERPVDExRl9FSURfRVNFVFhNSVRQT1dFUiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFdzY0JlYWNvblByb2JlUmVzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgcHJlc2VudCksIDAsICJXc2NCZWFjb25Qcm9iZVJlcyIsCisJMCwgNiwgMzE5LCBTaWdJZVdzY0JlYWNvblByb2JlUmVzLCB7MCwgODAsIDI0MiwgNCwgMH0sCisJNCwgRE9UMTFGX0VJRF9XU0NCRUFDT05QUk9CRVJFUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFAyUEJlYWNvblByb2JlUmVzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcywgcHJlc2VudCksIDAsICJQMlBCZWFjb25Qcm9iZVJlcyIsCisJMCwgNiwgMTE1MCwgU2lnSWVQMlBCZWFjb25Qcm9iZVJlcywgezgwLCAxMTEsIDE1NCwgOSwgMH0sCisJNCwgRE9UMTFGX0VJRF9QMlBCRUFDT05QUk9CRVJFUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFZIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVWSFRDYXBzLAorCXByZXNlbnQpLCAwLCAiVkhUQ2FwcyIsIDAsIDE0LCAxNCwgU2lnSWVWSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9WSFRDQVBTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgVkhUT3BlcmF0aW9uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVWSFRPcGVyYXRpb24sIHByZXNlbnQpLCAwLCAiVkhUT3BlcmF0aW9uIiwKKwkwLCA3LCA3LCBTaWdJZVZIVE9wZXJhdGlvbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVkhUT1BFUkFUSU9OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgVkhURXh0QnNzTG9hZCksCisJb2Zmc2V0b2YodERvdDExZklFVkhURXh0QnNzTG9hZCwgcHJlc2VudCksIDAsICJWSFRFeHRCc3NMb2FkIiwKKwkwLCA3LCA3LCBTaWdJZVZIVEV4dEJzc0xvYWQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1ZIVEVYVEJTU0xPQUQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBFeHRDYXApLCBvZmZzZXRvZih0RG90MTFmSUVFeHRDYXAsIHByZXNlbnQpLAorCTAsICJFeHRDYXAiLCAwLCAxMCwgMTEsIFNpZ0llRXh0Q2FwLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FWFRDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBPcGVyYXRpbmdNb2RlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVPcGVyYXRpbmdNb2RlLCBwcmVzZW50KSwgMCwgIk9wZXJhdGluZ01vZGUiLAorCTAsIDMsIDMsIFNpZ0llT3BlcmF0aW5nTW9kZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfT1BFUkFUSU5HTU9ERSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFdpZGVyQldDaGFuU3dpdGNoQW5uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXaWRlckJXQ2hhblN3aXRjaEFubiwgcHJlc2VudCksIDAsCisJIldpZGVyQldDaGFuU3dpdGNoQW5uIiwgMCwgNSwgNSwgU2lnSWVXaWRlckJXQ2hhblN3aXRjaEFubiwKKwl7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfV0lERVJCV0NIQU5TV0lUQ0hBTk4sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBPQlNTU2NhblBhcmFtZXRlcnMpLAorCW9mZnNldG9mKHREb3QxMWZJRU9CU1NTY2FuUGFyYW1ldGVycywgcHJlc2VudCksIDAsICJPQlNTU2NhblBhcmFtZXRlcnMiLAorCTAsIDE2LCAxNiwgU2lnSWVPQlNTU2NhblBhcmFtZXRlcnMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX09CU1NTQ0FOUEFSQU1FVEVSUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFZlbmRvcjFJRSksIG9mZnNldG9mKHREb3QxMWZJRVZlbmRvcjFJRSwKKwlwcmVzZW50KSwgMCwgIlZlbmRvcjFJRSIsIDAsIDUsIDUsIFNpZ0llVmVuZG9yMUlFLCB7MCwgMTYsIDI0LCAwLCAwfSwKKwkzLCBET1QxMUZfRUlEX1ZFTkRPUjFJRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIHZlbmRvcjJfaWUpLCBvZmZzZXRvZih0RG90MTFmSUV2ZW5kb3IyX2llLAorCXByZXNlbnQpLCAwLCAidmVuZG9yMl9pZSIsIDAsIDcsIDI4LCBTaWdJZXZlbmRvcjJfaWUsIHswLCAxNDQsIDc2LCAwLCAwfSwKKwkzLCBET1QxMUZfRUlEX1ZFTkRPUjJfSUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBWZW5kb3IzSUUpLCBvZmZzZXRvZih0RG90MTFmSUVWZW5kb3IzSUUsCisJcHJlc2VudCksIDAsICJWZW5kb3IzSUUiLCAwLCA1LCA1LCBTaWdJZVZlbmRvcjNJRSwgezAsIDIyLCA1MCwgMCwgMH0sCisJMywgRE9UMTFGX0VJRF9WRU5ET1IzSUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBDaGFubmVsU3dpdGNoV3JhcHBlciksCisJb2Zmc2V0b2YodERvdDExZklFQ2hhbm5lbFN3aXRjaFdyYXBwZXIsIHByZXNlbnQpLCAwLAorCSJDaGFubmVsU3dpdGNoV3JhcHBlciIsIDAsIDIsIDcsIFNpZ0llQ2hhbm5lbFN3aXRjaFdyYXBwZXIsCisJezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0NIQU5ORUxTV0lUQ0hXUkFQUEVSLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgUUNvbVZlbmRvcklFKSwKKwlvZmZzZXRvZih0RG90MTFmSUVRQ29tVmVuZG9ySUUsIHByZXNlbnQpLCAwLCAiUUNvbVZlbmRvcklFIiwKKwkwLCA3LCA3LCBTaWdJZVFDb21WZW5kb3JJRSwgezAsIDE2MCwgMTk4LCAwLCAwfSwKKwkzLCBET1QxMUZfRUlEX1FDT01WRU5ET1JJRSwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfYmVhY29uX2lfZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZkJlYWNvbklFcyAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19CZWFjb25JRXMsIElFU19CZWFjb25JRXMsCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfYmVhY29uX2lfZXMuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19DaGFubmVsU3dpdGNoW10gPSB7CisJeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmQ2hhbm5lbFN3aXRjaCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5LAorCURPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZkNoYW5uZWxTd2l0Y2gsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uLAorCURPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0NoYW5uZWxTd2l0Y2hbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZDaGFubmVsU3dpdGNoLCBDaGFuU3dpdGNoQW5uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVDaGFuU3dpdGNoQW5uLCBwcmVzZW50KSwgMCwgIkNoYW5Td2l0Y2hBbm4iLAorCTAsIDUsIDUsIFNpZ0llQ2hhblN3aXRjaEFubiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfQ0hBTlNXSVRDSEFOTiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZDaGFubmVsU3dpdGNoLCBzZWNfY2hhbl9vZmZzZXRfZWxlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVzZWNfY2hhbl9vZmZzZXRfZWxlLCBwcmVzZW50KSwgMCwgInNlY19jaGFuX29mZnNldF9lbGUiLAorCTAsIDMsIDMsIFNpZ0llc2VjX2NoYW5fb2Zmc2V0X2VsZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfU0VDX0NIQU5fT0ZGU0VUX0VMRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZDaGFubmVsU3dpdGNoLCBXaWRlckJXQ2hhblN3aXRjaEFubiksCisJb2Zmc2V0b2YodERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4sIHByZXNlbnQpLCAwLAorCSJXaWRlckJXQ2hhblN3aXRjaEFubiIsIDAsIDUsIDUsIFNpZ0llV2lkZXJCV0NoYW5Td2l0Y2hBbm4sCisJezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1dJREVSQldDSEFOU1dJVENIQU5OLCAwLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19jaGFubmVsX3N3aXRjaCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmQ2hhbm5lbFN3aXRjaCAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19DaGFubmVsU3dpdGNoLCBJRVNfQ2hhbm5lbFN3aXRjaCwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19jaGFubmVsX3N3aXRjaC4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0RlQXV0aFtdID0geworCXsgIlJlYXNvbiIsIG9mZnNldG9mKHREb3QxMWZEZUF1dGgsIFJlYXNvbiksIFNpZ0ZmUmVhc29uLAorCURPVDExRl9GRl9SRUFTT05fTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0RlQXV0aFtdID0geworCXsgb2Zmc2V0b2YodERvdDExZkRlQXV0aCwgUDJQRGVBdXRoKSwgb2Zmc2V0b2YodERvdDExZklFUDJQRGVBdXRoLAorCXByZXNlbnQpLCAwLCAiUDJQRGVBdXRoIiwgMCwgNiwgMTAsIFNpZ0llUDJQRGVBdXRoLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwKKwk0LCBET1QxMUZfRUlEX1AyUERFQVVUSCwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfZGVfYXV0aCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmRGVBdXRoICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX0RlQXV0aCwgSUVTX0RlQXV0aCwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19kZV9hdXRoLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfRGVsVFNbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZEZWxUUywgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5LAorCURPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZkRlbFRTLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7ICJUU0luZm8iLCBvZmZzZXRvZih0RG90MTFmRGVsVFMsIFRTSW5mbyksIFNpZ0ZmVFNJbmZvLAorCURPVDExRl9GRl9UU0lORk9fTEVOLCB9LAorCXsgIlJlYXNvbiIsIG9mZnNldG9mKHREb3QxMWZEZWxUUywgUmVhc29uKSwgU2lnRmZSZWFzb24sCisJRE9UMTFGX0ZGX1JFQVNPTl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfRGVsVFNbXSA9IHsKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfZGVsX3RzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZEZWxUUyAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19EZWxUUywgSUVTX0RlbFRTLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2RlbF90cy4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0Rpc2Fzc29jaWF0aW9uW10gPSB7CisJeyAiUmVhc29uIiwgb2Zmc2V0b2YodERvdDExZkRpc2Fzc29jaWF0aW9uLCBSZWFzb24pLCBTaWdGZlJlYXNvbiwKKwlET1QxMUZfRkZfUkVBU09OX0xFTiwgfSwKKwl7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19EaXNhc3NvY2lhdGlvbltdID0geworCXsgb2Zmc2V0b2YodERvdDExZkRpc2Fzc29jaWF0aW9uLCBQMlBEaXNBc3NvYyksCisJb2Zmc2V0b2YodERvdDExZklFUDJQRGlzQXNzb2MsIHByZXNlbnQpLCAwLCAiUDJQRGlzQXNzb2MiLAorCTAsIDYsIDEwLCBTaWdJZVAyUERpc0Fzc29jLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwKKwk0LCBET1QxMUZfRUlEX1AyUERJU0FTU09DLCAwLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19kaXNhc3NvY2lhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmRGlzYXNzb2NpYXRpb24gKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfRGlzYXNzb2NpYXRpb24sIElFU19EaXNhc3NvY2lhdGlvbiwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19kaXNhc3NvY2lhdGlvbi4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0xpbmtNZWFzdXJlbWVudFJlcG9ydFtdID0geworCXsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCwgQ2F0ZWdvcnkpLAorCVNpZ0ZmQ2F0ZWdvcnksIERPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24sCisJRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisJeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0LCBEaWFsb2dUb2tlbiksCisJU2lnRmZEaWFsb2dUb2tlbiwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKwl7ICJUUENFbGVJRCIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQsIFRQQ0VsZUlEKSwKKwlTaWdGZlRQQ0VsZUlELCBET1QxMUZfRkZfVFBDRUxFSURfTEVOLCB9LAorCXsgIlRQQ0VsZUxlbiIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQsIFRQQ0VsZUxlbiksCisJU2lnRmZUUENFbGVMZW4sIERPVDExRl9GRl9UUENFTEVMRU5fTEVOLCB9LAorCXsgIlR4UG93ZXIiLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0LCBUeFBvd2VyKSwKKwlTaWdGZlR4UG93ZXIsIERPVDExRl9GRl9UWFBPV0VSX0xFTiwgfSwKKwl7ICJMaW5rTWFyZ2luIiwgb2Zmc2V0b2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCwgTGlua01hcmdpbiksCisJU2lnRmZMaW5rTWFyZ2luLCBET1QxMUZfRkZfTElOS01BUkdJTl9MRU4sIH0sCisJeyAiUnhBbnRlbm5hSWQiLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0LCBSeEFudGVubmFJZCksCisJU2lnRmZSeEFudGVubmFJZCwgRE9UMTFGX0ZGX1JYQU5URU5OQUlEX0xFTiwgfSwKKwl7ICJUeEFudGVubmFJZCIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQsIFR4QW50ZW5uYUlkKSwKKwlTaWdGZlR4QW50ZW5uYUlkLCBET1QxMUZfRkZfVFhBTlRFTk5BSURfTEVOLCB9LAorCXsgIlJDUEkiLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0LCBSQ1BJKSwgU2lnRmZSQ1BJLAorCURPVDExRl9GRl9SQ1BJX0xFTiwgfSwKKwl7ICJSU05JIiwgb2Zmc2V0b2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCwgUlNOSSksIFNpZ0ZmUlNOSSwKKwlET1QxMUZfRkZfUlNOSV9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfTGlua01lYXN1cmVtZW50UmVwb3J0W10gPSB7CisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX2xpbmtfbWVhc3VyZW1lbnRfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfTGlua01lYXN1cmVtZW50UmVwb3J0LCBJRVNfTGlua01lYXN1cmVtZW50UmVwb3J0LAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2xpbmtfbWVhc3VyZW1lbnRfcmVwb3J0LiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfTGlua01lYXN1cmVtZW50UmVxdWVzdFtdID0geworCXsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcXVlc3QsIENhdGVnb3J5KSwKKwlTaWdGZkNhdGVnb3J5LCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorCXsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0LCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0LCBEaWFsb2dUb2tlbiksCisJU2lnRmZEaWFsb2dUb2tlbiwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKwl7ICJUeFBvd2VyIiwgb2Zmc2V0b2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcXVlc3QsIFR4UG93ZXIpLAorCVNpZ0ZmVHhQb3dlciwgRE9UMTFGX0ZGX1RYUE9XRVJfTEVOLCB9LAorCXsgIk1heFR4UG93ZXIiLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCwgTWF4VHhQb3dlciksCisJU2lnRmZNYXhUeFBvd2VyLCBET1QxMUZfRkZfTUFYVFhQT1dFUl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfTGlua01lYXN1cmVtZW50UmVxdWVzdFtdID0geworCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19saW5rX21lYXN1cmVtZW50X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcXVlc3QgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfTGlua01lYXN1cmVtZW50UmVxdWVzdCwgSUVTX0xpbmtNZWFzdXJlbWVudFJlcXVlc3QsCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfbGlua19tZWFzdXJlbWVudF9yZXF1ZXN0LiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfTWVhc3VyZW1lbnRSZXBvcnRbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZNZWFzdXJlbWVudFJlcG9ydCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5LAorCURPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZk1lYXN1cmVtZW50UmVwb3J0LCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZNZWFzdXJlbWVudFJlcG9ydCwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfTWVhc3VyZW1lbnRSZXBvcnRbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZNZWFzdXJlbWVudFJlcG9ydCwgTWVhc3VyZW1lbnRSZXBvcnQpLAorCW9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0LCBwcmVzZW50KSwgMCwgIk1lYXN1cmVtZW50UmVwb3J0IiwKKwkwLCA1LCAzMSwgU2lnSWVNZWFzdXJlbWVudFJlcG9ydCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfTUVBU1VSRU1FTlRSRVBPUlQsIDEsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX21lYXN1cmVtZW50X3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfTWVhc3VyZW1lbnRSZXBvcnQsIElFU19NZWFzdXJlbWVudFJlcG9ydCwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19tZWFzdXJlbWVudF9yZXBvcnQuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19NZWFzdXJlbWVudFJlcXVlc3RbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZNZWFzdXJlbWVudFJlcXVlc3QsIENhdGVnb3J5KSwKKwlTaWdGZkNhdGVnb3J5LCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorCXsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZNZWFzdXJlbWVudFJlcXVlc3QsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uLAorCURPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZk1lYXN1cmVtZW50UmVxdWVzdCwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfTWVhc3VyZW1lbnRSZXF1ZXN0W10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0LCBNZWFzdXJlbWVudFJlcXVlc3QpLAorCW9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwgcHJlc2VudCksCisJb2Zmc2V0b2YodERvdDExZk1lYXN1cmVtZW50UmVxdWVzdCwgbnVtX01lYXN1cmVtZW50UmVxdWVzdCksCisJIk1lYXN1cmVtZW50UmVxdWVzdCIsIDQsIDE2LCAxOCwgU2lnSWVNZWFzdXJlbWVudFJlcXVlc3QsCisJezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX01FQVNVUkVNRU5UUkVRVUVTVCwgMSwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfbWVhc3VyZW1lbnRfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX01lYXN1cmVtZW50UmVxdWVzdCwgSUVTX01lYXN1cmVtZW50UmVxdWVzdCwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19tZWFzdXJlbWVudF9yZXF1ZXN0LiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfTmVpZ2hib3JSZXBvcnRSZXF1ZXN0W10gPSB7CisJeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0LCBDYXRlZ29yeSksCisJU2lnRmZDYXRlZ29yeSwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKwl7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0LCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZOZWlnaGJvclJlcG9ydFJlcXVlc3QsIERpYWxvZ1Rva2VuKSwKKwlTaWdGZkRpYWxvZ1Rva2VuLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX05laWdoYm9yUmVwb3J0UmVxdWVzdFtdID0geworCXsgb2Zmc2V0b2YodERvdDExZk5laWdoYm9yUmVwb3J0UmVxdWVzdCwgU1NJRCksIG9mZnNldG9mKHREb3QxMWZJRVNTSUQsCisJcHJlc2VudCksIDAsICJTU0lEIiwgMCwgMiwgMzQsIFNpZ0llU1NJRCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfU1NJRCwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfbmVpZ2hib3JfcmVwb3J0X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZk5laWdoYm9yUmVwb3J0UmVxdWVzdCAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19OZWlnaGJvclJlcG9ydFJlcXVlc3QsIElFU19OZWlnaGJvclJlcG9ydFJlcXVlc3QsCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfbmVpZ2hib3JfcmVwb3J0X3JlcXVlc3QuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19OZWlnaGJvclJlcG9ydFJlc3BvbnNlW10gPSB7CisJeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXNwb25zZSwgQ2F0ZWdvcnkpLAorCVNpZ0ZmQ2F0ZWdvcnksIERPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2UsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uLAorCURPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2UsIERpYWxvZ1Rva2VuKSwKKwlTaWdGZkRpYWxvZ1Rva2VuLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX05laWdoYm9yUmVwb3J0UmVzcG9uc2VbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlLCBOZWlnaGJvclJlcG9ydCksCisJb2Zmc2V0b2YodERvdDExZklFTmVpZ2hib3JSZXBvcnQsIHByZXNlbnQpLAorCW9mZnNldG9mKHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlLCBudW1fTmVpZ2hib3JSZXBvcnQpLAorCSJOZWlnaGJvclJlcG9ydCIsIDE1LCAxNSwgNTQ4LCBTaWdJZU5laWdoYm9yUmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9ORUlHSEJPUlJFUE9SVCwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfbmVpZ2hib3JfcmVwb3J0X3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX05laWdoYm9yUmVwb3J0UmVzcG9uc2UsIElFU19OZWlnaGJvclJlcG9ydFJlc3BvbnNlLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX25laWdoYm9yX3JlcG9ydF9yZXNwb25zZS4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX09wZXJhdGluZ01vZGVbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZPcGVyYXRpbmdNb2RlLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnksCisJRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKwl7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmT3BlcmF0aW5nTW9kZSwgQWN0aW9uKSwgU2lnRmZBY3Rpb24sCisJRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisJeyAiT3BlcmF0aW5nTW9kZSIsIG9mZnNldG9mKHREb3QxMWZPcGVyYXRpbmdNb2RlLCBPcGVyYXRpbmdNb2RlKSwKKwlTaWdGZk9wZXJhdGluZ01vZGUsIERPVDExRl9GRl9PUEVSQVRJTkdNT0RFX0xFTiwgfSwKKwl7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19PcGVyYXRpbmdNb2RlW10gPSB7CisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX29wZXJhdGluZ19tb2RlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZPcGVyYXRpbmdNb2RlICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX09wZXJhdGluZ01vZGUsIElFU19PcGVyYXRpbmdNb2RlLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX29wZXJhdGluZ19tb2RlLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfUHJvYmVSZXF1ZXN0W10gPSB7CisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfUHJvYmVSZXF1ZXN0W10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXF1ZXN0LCBTU0lEKSwgb2Zmc2V0b2YodERvdDExZklFU1NJRCwgcHJlc2VudCksIDAsCisJIlNTSUQiLCAwLCAyLCAzNCwgU2lnSWVTU0lELCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfU1NJRCwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlcXVlc3QsIFN1cHBSYXRlcyksIG9mZnNldG9mKHREb3QxMWZJRVN1cHBSYXRlcywKKwlwcmVzZW50KSwgMCwgIlN1cHBSYXRlcyIsIDAsIDIsIDE0LCBTaWdJZVN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfU1VQUFJBVEVTLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVxdWVzdCwgUmVxdWVzdGVkSW5mbyksCisJb2Zmc2V0b2YodERvdDExZklFUmVxdWVzdGVkSW5mbywgcHJlc2VudCksIDAsICJSZXF1ZXN0ZWRJbmZvIiwKKwkwLCAyLCAyNTcsIFNpZ0llUmVxdWVzdGVkSW5mbywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUkVRVUVTVEVESU5GTywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlcXVlc3QsIEV4dFN1cHBSYXRlcyksCisJb2Zmc2V0b2YodERvdDExZklFRXh0U3VwcFJhdGVzLCBwcmVzZW50KSwgMCwgIkV4dFN1cHBSYXRlcyIsCisJMCwgMywgMTQsIFNpZ0llRXh0U3VwcFJhdGVzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FWFRTVVBQUkFURVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXF1ZXN0LCBEU1BhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRURTUGFyYW1zLAorCXByZXNlbnQpLCAwLCAiRFNQYXJhbXMiLCAwLCAzLCAzLCBTaWdJZURTUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9EU1BBUkFNUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlcXVlc3QsIEhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRUhUQ2FwcywKKwlwcmVzZW50KSwgMCwgIkhUQ2FwcyIsIDAsIDI4LCA2MCwgU2lnSWVIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0hUQ0FQUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlcXVlc3QsIFdzY1Byb2JlUmVxKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcSwgcHJlc2VudCksIDAsICJXc2NQcm9iZVJlcSIsCisJMCwgNiwgMjg2LCBTaWdJZVdzY1Byb2JlUmVxLCB7MCwgODAsIDI0MiwgNCwgMH0sCisJNCwgRE9UMTFGX0VJRF9XU0NQUk9CRVJFUSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlcXVlc3QsIFdGQVRQQyksIG9mZnNldG9mKHREb3QxMWZJRVdGQVRQQywKKwlwcmVzZW50KSwgMCwgIldGQVRQQyIsIDAsIDksIDksIFNpZ0llV0ZBVFBDLCB7MCwgODAsIDI0MiwgOCwgMH0sCisJNSwgRE9UMTFGX0VJRF9XRkFUUEMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXF1ZXN0LCBQMlBQcm9iZVJlcSksCisJb2Zmc2V0b2YodERvdDExZklFUDJQUHJvYmVSZXEsIHByZXNlbnQpLCAwLCAiUDJQUHJvYmVSZXEiLAorCTAsIDYsIDQzLCBTaWdJZVAyUFByb2JlUmVxLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwKKwk0LCBET1QxMUZfRUlEX1AyUFBST0JFUkVRLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVxdWVzdCwgVkhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVZIVENhcHMsCisJcHJlc2VudCksIDAsICJWSFRDYXBzIiwgMCwgMTQsIDE0LCBTaWdJZVZIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1ZIVENBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXF1ZXN0LCBFeHRDYXApLCBvZmZzZXRvZih0RG90MTFmSUVFeHRDYXAsCisJcHJlc2VudCksIDAsICJFeHRDYXAiLCAwLCAxMCwgMTEsIFNpZ0llRXh0Q2FwLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FWFRDQVAsIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Byb2JlX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZlByb2JlUmVxdWVzdCAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19Qcm9iZVJlcXVlc3QsIElFU19Qcm9iZVJlcXVlc3QsCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfcHJvYmVfcmVxdWVzdC4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1Byb2JlUmVzcG9uc2VbXSA9IHsKKwl7ICJUaW1lU3RhbXAiLCBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgVGltZVN0YW1wKSwgU2lnRmZUaW1lU3RhbXAsCisJRE9UMTFGX0ZGX1RJTUVTVEFNUF9MRU4sIH0sCisJeyAiQmVhY29uSW50ZXJ2YWwiLCBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgQmVhY29uSW50ZXJ2YWwpLAorCVNpZ0ZmQmVhY29uSW50ZXJ2YWwsIERPVDExRl9GRl9CRUFDT05JTlRFUlZBTF9MRU4sIH0sCisJeyAiQ2FwYWJpbGl0aWVzIiwgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIENhcGFiaWxpdGllcyksCisJU2lnRmZDYXBhYmlsaXRpZXMsIERPVDExRl9GRl9DQVBBQklMSVRJRVNfTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1Byb2JlUmVzcG9uc2VbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBTU0lEKSwgb2Zmc2V0b2YodERvdDExZklFU1NJRCwgcHJlc2VudCksCisJMCwgIlNTSUQiLCAwLCAyLCAzNCwgU2lnSWVTU0lELCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfU1NJRCwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVTdXBwUmF0ZXMsCisJcHJlc2VudCksIDAsICJTdXBwUmF0ZXMiLCAwLCAyLCAxNCwgU2lnSWVTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1NVUFBSQVRFUywgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBGSFBhcmFtU2V0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVGSFBhcmFtU2V0LCBwcmVzZW50KSwgMCwgIkZIUGFyYW1TZXQiLAorCTAsIDcsIDcsIFNpZ0llRkhQYXJhbVNldCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRkhQQVJBTVNFVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBEU1BhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRURTUGFyYW1zLAorCXByZXNlbnQpLCAwLCAiRFNQYXJhbXMiLCAwLCAzLCAzLCBTaWdJZURTUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9EU1BBUkFNUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBDRlBhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRUNGUGFyYW1zLAorCXByZXNlbnQpLCAwLCAiQ0ZQYXJhbXMiLCAwLCA4LCA4LCBTaWdJZUNGUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9DRlBBUkFNUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBJQlNTUGFyYW1zKSwKKwlvZmZzZXRvZih0RG90MTFmSUVJQlNTUGFyYW1zLCBwcmVzZW50KSwgMCwgIklCU1NQYXJhbXMiLAorCTAsIDQsIDQsIFNpZ0llSUJTU1BhcmFtcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfSUJTU1BBUkFNUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBDb3VudHJ5KSwgb2Zmc2V0b2YodERvdDExZklFQ291bnRyeSwKKwlwcmVzZW50KSwgMCwgIkNvdW50cnkiLCAwLCA1LCAyNTcsIFNpZ0llQ291bnRyeSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfQ09VTlRSWSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBGSFBhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRUZIUGFyYW1zLAorCXByZXNlbnQpLCAwLCAiRkhQYXJhbXMiLCAwLCA0LCA0LCBTaWdJZUZIUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9GSFBBUkFNUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBGSFBhdHRUYWJsZSksCisJb2Zmc2V0b2YodERvdDExZklFRkhQYXR0VGFibGUsIHByZXNlbnQpLCAwLCAiRkhQYXR0VGFibGUiLAorCTAsIDYsIDI1NywgU2lnSWVGSFBhdHRUYWJsZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRkhQQVRUVEFCTEUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgUG93ZXJDb25zdHJhaW50cyksCisJb2Zmc2V0b2YodERvdDExZklFUG93ZXJDb25zdHJhaW50cywgcHJlc2VudCksIDAsICJQb3dlckNvbnN0cmFpbnRzIiwKKwkwLCAzLCAzLCBTaWdJZVBvd2VyQ29uc3RyYWludHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1BPV0VSQ09OU1RSQUlOVFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgQ2hhblN3aXRjaEFubiksCisJb2Zmc2V0b2YodERvdDExZklFQ2hhblN3aXRjaEFubiwgcHJlc2VudCksIDAsICJDaGFuU3dpdGNoQW5uIiwKKwkwLCA1LCA1LCBTaWdJZUNoYW5Td2l0Y2hBbm4sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0NIQU5TV0lUQ0hBTk4sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgZXh0X2NoYW5fc3dpdGNoX2FubiksCisJb2Zmc2V0b2YodERvdDExZklFZXh0X2NoYW5fc3dpdGNoX2FubiwgcHJlc2VudCksIDAsICJleHRfY2hhbl9zd2l0Y2hfYW5uIiwKKwkwLCA2LCA2LCBTaWdJZWV4dF9jaGFuX3N3aXRjaF9hbm4sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VYVF9DSEFOX1NXSVRDSF9BTk4sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgUXVpZXQpLCBvZmZzZXRvZih0RG90MTFmSUVRdWlldCwKKwlwcmVzZW50KSwgMCwgIlF1aWV0IiwgMCwgOCwgOCwgU2lnSWVRdWlldCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUVVJRVQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgVFBDUmVwb3J0KSwgb2Zmc2V0b2YodERvdDExZklFVFBDUmVwb3J0LAorCXByZXNlbnQpLCAwLCAiVFBDUmVwb3J0IiwgMCwgNCwgNCwgU2lnSWVUUENSZXBvcnQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1RQQ1JFUE9SVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBFUlBJbmZvKSwgb2Zmc2V0b2YodERvdDExZklFRVJQSW5mbywKKwlwcmVzZW50KSwgMCwgIkVSUEluZm8iLCAwLCAzLCAzLCBTaWdJZUVSUEluZm8sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VSUElORk8sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgRXh0U3VwcFJhdGVzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiwKKwkwLCAzLCAxNCwgU2lnSWVFeHRTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBSU05PcGFxdWUpLCBvZmZzZXRvZih0RG90MTFmSUVSU05PcGFxdWUsCisJcHJlc2VudCksIDAsICJSU05PcGFxdWUiLCAwLCA4LCAyNTUsIFNpZ0llUlNOT3BhcXVlLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9SU05PUEFRVUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgUUJTU0xvYWQpLCBvZmZzZXRvZih0RG90MTFmSUVRQlNTTG9hZCwKKwlwcmVzZW50KSwgMCwgIlFCU1NMb2FkIiwgMCwgNywgNywgU2lnSWVRQlNTTG9hZCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUUJTU0xPQUQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgRURDQVBhcmFtU2V0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVFRENBUGFyYW1TZXQsIHByZXNlbnQpLCAwLCAiRURDQVBhcmFtU2V0IiwKKwkwLCAyMCwgMjAsIFNpZ0llRURDQVBhcmFtU2V0LCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FRENBUEFSQU1TRVQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgUlJNRW5hYmxlZENhcCksCisJb2Zmc2V0b2YodERvdDExZklFUlJNRW5hYmxlZENhcCwgcHJlc2VudCksIDAsICJSUk1FbmFibGVkQ2FwIiwKKwkwLCA3LCA3LCBTaWdJZVJSTUVuYWJsZWRDYXAsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1JSTUVOQUJMRURDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgQVBDaGFubmVsUmVwb3J0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQsIHByZXNlbnQpLCAwLCAiQVBDaGFubmVsUmVwb3J0IiwKKwkwLCAzLCA1MywgU2lnSWVBUENoYW5uZWxSZXBvcnQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0FQQ0hBTk5FTFJFUE9SVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBNb2JpbGl0eURvbWFpbiksCisJb2Zmc2V0b2YodERvdDExZklFTW9iaWxpdHlEb21haW4sIHByZXNlbnQpLCAwLCAiTW9iaWxpdHlEb21haW4iLAorCTAsIDUsIDUsIFNpZ0llTW9iaWxpdHlEb21haW4sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX01PQklMSVRZRE9NQUlOLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIFdQQSksIG9mZnNldG9mKHREb3QxMWZJRVdQQSwgcHJlc2VudCksIDAsCisJIldQQSIsIDAsIDgsIDUwLCBTaWdJZVdQQSwgezAsIDgwLCAyNDIsIDEsIDB9LCA0LCBET1QxMUZfRUlEX1dQQSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVIVENhcHMsCisJcHJlc2VudCksIDAsICJIVENhcHMiLCAwLCAyOCwgNjAsIFNpZ0llSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9IVENBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgSFRJbmZvKSwgb2Zmc2V0b2YodERvdDExZklFSFRJbmZvLAorCXByZXNlbnQpLCAwLCAiSFRJbmZvIiwgMCwgMjQsIDU2LCBTaWdJZUhUSW5mbywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfSFRJTkZPLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIHNlY19jaGFuX29mZnNldF9lbGUpLAorCW9mZnNldG9mKHREb3QxMWZJRXNlY19jaGFuX29mZnNldF9lbGUsIHByZXNlbnQpLCAwLCAic2VjX2NoYW5fb2Zmc2V0X2VsZSIsCisJMCwgMywgMywgU2lnSWVzZWNfY2hhbl9vZmZzZXRfZWxlLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9TRUNfQ0hBTl9PRkZTRVRfRUxFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIFdNTUluZm9BcCksIG9mZnNldG9mKHREb3QxMWZJRVdNTUluZm9BcCwKKwlwcmVzZW50KSwgMCwgIldNTUluZm9BcCIsIDAsIDksIDksIFNpZ0llV01NSW5mb0FwLCB7MCwgODAsIDI0MiwgMiwgMH0sCisJNSwgRE9UMTFGX0VJRF9XTU1JTkZPQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgV01NUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFV01NUGFyYW1zLAorCXByZXNlbnQpLCAwLCAiV01NUGFyYW1zIiwgMCwgMjYsIDI2LCBTaWdJZVdNTVBhcmFtcywgezAsIDgwLCAyNDIsIDIsIDF9LAorCTUsIERPVDExRl9FSURfV01NUEFSQU1TLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIFdNTUNhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1DYXBzLAorCXByZXNlbnQpLCAwLCAiV01NQ2FwcyIsIDAsIDksIDksIFNpZ0llV01NQ2FwcywgezAsIDgwLCAyNDIsIDIsIDV9LAorCTUsIERPVDExRl9FSURfV01NQ0FQUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBXQVBJKSwgb2Zmc2V0b2YodERvdDExZklFV0FQSSwgcHJlc2VudCksCisJMCwgIldBUEkiLCAwLCAxNCwgMTEyLCBTaWdJZVdBUEksIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1dBUEksIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgRVNFUmFkTWdtdENhcCksCisJb2Zmc2V0b2YodERvdDExZklFRVNFUmFkTWdtdENhcCwgcHJlc2VudCksIDAsICJFU0VSYWRNZ210Q2FwIiwKKwkwLCA4LCA4LCBTaWdJZUVTRVJhZE1nbXRDYXAsIHswLCA2NCwgMTUwLCAxLCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVJBRE1HTVRDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgRVNFVHJhZlN0cm1NZXQpLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRVRyYWZTdHJtTWV0LCBwcmVzZW50KSwgMCwgIkVTRVRyYWZTdHJtTWV0IiwKKwkwLCAxMCwgMTAsIFNpZ0llRVNFVHJhZlN0cm1NZXQsIHswLCA2NCwgMTUwLCA3LCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVRSQUZTVFJNTUVULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIEVTRVR4bWl0UG93ZXIpLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRVR4bWl0UG93ZXIsIHByZXNlbnQpLCAwLCAiRVNFVHhtaXRQb3dlciIsCisJMCwgOCwgOCwgU2lnSWVFU0VUeG1pdFBvd2VyLCB7MCwgNjQsIDE1MCwgMCwgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VUWE1JVFBPV0VSLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIFdzY1Byb2JlUmVzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgcHJlc2VudCksIDAsICJXc2NQcm9iZVJlcyIsCisJMCwgNiwgMzE5LCBTaWdJZVdzY1Byb2JlUmVzLCB7MCwgODAsIDI0MiwgNCwgMH0sCisJNCwgRE9UMTFGX0VJRF9XU0NQUk9CRVJFUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBQMlBQcm9iZVJlcyksCisJb2Zmc2V0b2YodERvdDExZklFUDJQUHJvYmVSZXMsIHByZXNlbnQpLCAwLCAiUDJQUHJvYmVSZXMiLAorCTAsIDYsIDExNDEsIFNpZ0llUDJQUHJvYmVSZXMsIHs4MCwgMTExLCAxNTQsIDksIDB9LAorCTQsIERPVDExRl9FSURfUDJQUFJPQkVSRVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgVkhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVZIVENhcHMsCisJcHJlc2VudCksIDAsICJWSFRDYXBzIiwgMCwgMTQsIDE0LCBTaWdJZVZIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1ZIVENBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgVkhUT3BlcmF0aW9uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVWSFRPcGVyYXRpb24sIHByZXNlbnQpLCAwLCAiVkhUT3BlcmF0aW9uIiwKKwkwLCA3LCA3LCBTaWdJZVZIVE9wZXJhdGlvbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVkhUT1BFUkFUSU9OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIFZIVEV4dEJzc0xvYWQpLAorCW9mZnNldG9mKHREb3QxMWZJRVZIVEV4dEJzc0xvYWQsIHByZXNlbnQpLCAwLCAiVkhURXh0QnNzTG9hZCIsCisJMCwgNywgNywgU2lnSWVWSFRFeHRCc3NMb2FkLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9WSFRFWFRCU1NMT0FELCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIEV4dENhcCksIG9mZnNldG9mKHREb3QxMWZJRUV4dENhcCwKKwlwcmVzZW50KSwgMCwgIkV4dENhcCIsIDAsIDEwLCAxMSwgU2lnSWVFeHRDYXAsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VYVENBUCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBPQlNTU2NhblBhcmFtZXRlcnMpLAorCW9mZnNldG9mKHREb3QxMWZJRU9CU1NTY2FuUGFyYW1ldGVycywgcHJlc2VudCksIDAsICJPQlNTU2NhblBhcmFtZXRlcnMiLAorCTAsIDE2LCAxNiwgU2lnSWVPQlNTU2NhblBhcmFtZXRlcnMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX09CU1NTQ0FOUEFSQU1FVEVSUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBWZW5kb3IxSUUpLCBvZmZzZXRvZih0RG90MTFmSUVWZW5kb3IxSUUsCisJcHJlc2VudCksIDAsICJWZW5kb3IxSUUiLCAwLCA1LCA1LCBTaWdJZVZlbmRvcjFJRSwgezAsIDE2LCAyNCwgMCwgMH0sCisJMywgRE9UMTFGX0VJRF9WRU5ET1IxSUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgdmVuZG9yMl9pZSksCisJb2Zmc2V0b2YodERvdDExZklFdmVuZG9yMl9pZSwgcHJlc2VudCksIDAsICJ2ZW5kb3IyX2llIiwKKwkwLCA3LCAyOCwgU2lnSWV2ZW5kb3IyX2llLCB7MCwgMTQ0LCA3NiwgMCwgMH0sCisJMywgRE9UMTFGX0VJRF9WRU5ET1IyX0lFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIFZlbmRvcjNJRSksIG9mZnNldG9mKHREb3QxMWZJRVZlbmRvcjNJRSwKKwlwcmVzZW50KSwgMCwgIlZlbmRvcjNJRSIsIDAsIDUsIDUsIFNpZ0llVmVuZG9yM0lFLCB7MCwgMjIsIDUwLCAwLCAwfSwKKwkzLCBET1QxMUZfRUlEX1ZFTkRPUjNJRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBDaGFubmVsU3dpdGNoV3JhcHBlciksCisJb2Zmc2V0b2YodERvdDExZklFQ2hhbm5lbFN3aXRjaFdyYXBwZXIsIHByZXNlbnQpLCAwLAorCSJDaGFubmVsU3dpdGNoV3JhcHBlciIsIDAsIDIsIDcsIFNpZ0llQ2hhbm5lbFN3aXRjaFdyYXBwZXIsCisJezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0NIQU5ORUxTV0lUQ0hXUkFQUEVSLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIFFDb21WZW5kb3JJRSksCisJb2Zmc2V0b2YodERvdDExZklFUUNvbVZlbmRvcklFLCBwcmVzZW50KSwgMCwgIlFDb21WZW5kb3JJRSIsCisJMCwgNywgNywgU2lnSWVRQ29tVmVuZG9ySUUsIHswLCAxNjAsIDE5OCwgMCwgMH0sCisJMywgRE9UMTFGX0VJRF9RQ09NVkVORE9SSUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgRVNFVmVyc2lvbiksCisJb2Zmc2V0b2YodERvdDExZklFRVNFVmVyc2lvbiwgcHJlc2VudCksIDAsICJFU0VWZXJzaW9uIiwKKwkwLCA3LCA3LCBTaWdJZUVTRVZlcnNpb24sIHswLCA2NCwgMTUwLCAzLCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVZFUlNJT04sIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3Byb2JlX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZQcm9iZVJlc3BvbnNlICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX1Byb2JlUmVzcG9uc2UsIElFU19Qcm9iZVJlc3BvbnNlLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3Byb2JlX3Jlc3BvbnNlLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfUW9zTWFwQ29uZmlndXJlW10gPSB7CisJeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmUW9zTWFwQ29uZmlndXJlLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnksCisJRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKwl7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmUW9zTWFwQ29uZmlndXJlLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19Rb3NNYXBDb25maWd1cmVbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZRb3NNYXBDb25maWd1cmUsIFFvc01hcFNldCksCisJb2Zmc2V0b2YodERvdDExZklFUW9zTWFwU2V0LCBwcmVzZW50KSwgMCwgIlFvc01hcFNldCIsCisJMCwgMiwgNjIsIFNpZ0llUW9zTWFwU2V0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUU9TTUFQU0VULCAxLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19xb3NfbWFwX2NvbmZpZ3VyZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmUW9zTWFwQ29uZmlndXJlICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX1Fvc01hcENvbmZpZ3VyZSwgSUVTX1Fvc01hcENvbmZpZ3VyZSwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19xb3NfbWFwX2NvbmZpZ3VyZS4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1JhZGlvTWVhc3VyZW1lbnRSZXBvcnRbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVwb3J0LCBDYXRlZ29yeSksCisJU2lnRmZDYXRlZ29yeSwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKwl7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24sCisJRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisJeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydCwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfUmFkaW9NZWFzdXJlbWVudFJlcG9ydFtdID0geworCXsgb2Zmc2V0b2YodERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXBvcnQsIE1lYXN1cmVtZW50UmVwb3J0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCwgcHJlc2VudCksCisJb2Zmc2V0b2YodERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXBvcnQsIG51bV9NZWFzdXJlbWVudFJlcG9ydCksCisJIk1lYXN1cmVtZW50UmVwb3J0IiwgNCwgNSwgMzEsIFNpZ0llTWVhc3VyZW1lbnRSZXBvcnQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX01FQVNVUkVNRU5UUkVQT1JULCAxLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19yYWRpb19tZWFzdXJlbWVudF9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfUmFkaW9NZWFzdXJlbWVudFJlcG9ydCwgSUVTX1JhZGlvTWVhc3VyZW1lbnRSZXBvcnQsCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfcmFkaW9fbWVhc3VyZW1lbnRfcmVwb3J0LiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfUmFkaW9NZWFzdXJlbWVudFJlcXVlc3RbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCwgQ2F0ZWdvcnkpLAorCVNpZ0ZmQ2F0ZWdvcnksIERPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0LCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyAiTnVtT2ZSZXBldGl0aW9ucyIsIG9mZnNldG9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCwKKwlOdW1PZlJlcGV0aXRpb25zKSwgU2lnRmZOdW1PZlJlcGV0aXRpb25zLAorCURPVDExRl9GRl9OVU1PRlJFUEVUSVRJT05TX0xFTiwgfSwKKwl7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19SYWRpb01lYXN1cmVtZW50UmVxdWVzdFtdID0geworCXsgb2Zmc2V0b2YodERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0LCBNZWFzdXJlbWVudFJlcXVlc3QpLAorCW9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwgcHJlc2VudCksCisJb2Zmc2V0b2YodERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0LCBudW1fTWVhc3VyZW1lbnRSZXF1ZXN0KSwKKwkiTWVhc3VyZW1lbnRSZXF1ZXN0IiwgMiwgMTYsIDE4LCBTaWdJZU1lYXN1cmVtZW50UmVxdWVzdCwKKwl7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfTUVBU1VSRU1FTlRSRVFVRVNULCAxLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19yYWRpb19tZWFzdXJlbWVudF9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19SYWRpb01lYXN1cmVtZW50UmVxdWVzdCwgSUVTX1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0LAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3JhZGlvX21lYXN1cmVtZW50X3JlcXVlc3QuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19SZUFzc29jUmVxdWVzdFtdID0geworCXsgIkNhcGFiaWxpdGllcyIsIG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgQ2FwYWJpbGl0aWVzKSwKKwlTaWdGZkNhcGFiaWxpdGllcywgRE9UMTFGX0ZGX0NBUEFCSUxJVElFU19MRU4sIH0sCisJeyAiTGlzdGVuSW50ZXJ2YWwiLCBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIExpc3RlbkludGVydmFsKSwKKwlTaWdGZkxpc3RlbkludGVydmFsLCBET1QxMUZfRkZfTElTVEVOSU5URVJWQUxfTEVOLCB9LAorCXsgIkN1cnJlbnRBUEFkZHJlc3MiLCBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIEN1cnJlbnRBUEFkZHJlc3MpLAorCVNpZ0ZmQ3VycmVudEFQQWRkcmVzcywgRE9UMTFGX0ZGX0NVUlJFTlRBUEFERFJFU1NfTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1JlQXNzb2NSZXF1ZXN0W10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFNTSUQpLCBvZmZzZXRvZih0RG90MTFmSUVTU0lELCBwcmVzZW50KSwKKwkwLCAiU1NJRCIsIDAsIDIsIDM0LCBTaWdJZVNTSUQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TU0lELCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBTdXBwUmF0ZXMpLAorCW9mZnNldG9mKHREb3QxMWZJRVN1cHBSYXRlcywgcHJlc2VudCksIDAsICJTdXBwUmF0ZXMiLAorCTAsIDIsIDE0LCBTaWdJZVN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NVUFBSQVRFUywgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgRXh0U3VwcFJhdGVzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiwKKwkwLCAzLCAxNCwgU2lnSWVFeHRTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgUG93ZXJDYXBzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVQb3dlckNhcHMsIHByZXNlbnQpLCAwLCAiUG93ZXJDYXBzIiwKKwkwLCA0LCA0LCBTaWdJZVBvd2VyQ2FwcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1BPV0VSQ0FQUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgU3VwcENoYW5uZWxzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVTdXBwQ2hhbm5lbHMsIHByZXNlbnQpLCAwLCAiU3VwcENoYW5uZWxzIiwKKwkwLCA0LCA5OCwgU2lnSWVTdXBwQ2hhbm5lbHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1NVUFBDSEFOTkVMUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgUlNOT3BhcXVlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVSU05PcGFxdWUsIHByZXNlbnQpLCAwLCAiUlNOT3BhcXVlIiwKKwkwLCA4LCAyNTUsIFNpZ0llUlNOT3BhcXVlLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9SU05PUEFRVUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFFPU0NhcHNTdGF0aW9uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiwgcHJlc2VudCksIDAsICJRT1NDYXBzU3RhdGlvbiIsCisJMCwgMywgMywgU2lnSWVRT1NDYXBzU3RhdGlvbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUU9TQ0FQU1NUQVRJT04sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFJSTUVuYWJsZWRDYXApLAorCW9mZnNldG9mKHREb3QxMWZJRVJSTUVuYWJsZWRDYXAsIHByZXNlbnQpLCAwLCAiUlJNRW5hYmxlZENhcCIsCisJMCwgNywgNywgU2lnSWVSUk1FbmFibGVkQ2FwLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9SUk1FTkFCTEVEQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBNb2JpbGl0eURvbWFpbiksCisJb2Zmc2V0b2YodERvdDExZklFTW9iaWxpdHlEb21haW4sIHByZXNlbnQpLCAwLCAiTW9iaWxpdHlEb21haW4iLAorCTAsIDUsIDUsIFNpZ0llTW9iaWxpdHlEb21haW4sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX01PQklMSVRZRE9NQUlOLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBGVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sCisJcHJlc2VudCksIDAsICJGVEluZm8iLCAwLCA4NCwgMjIyLCBTaWdJZUZUSW5mbywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRlRJTkZPLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBSSUNEYXRhRGVzYyksCisJb2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIHByZXNlbnQpLAorCW9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgbnVtX1JJQ0RhdGFEZXNjKSwgIlJJQ0RhdGFEZXNjIiwKKwkyLCAyLCA1NTAsIFNpZ0llUklDRGF0YURlc2MsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1JJQ0RBVEFERVNDLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBXUEFPcGFxdWUpLAorCW9mZnNldG9mKHREb3QxMWZJRVdQQU9wYXF1ZSwgcHJlc2VudCksIDAsICJXUEFPcGFxdWUiLAorCTAsIDgsIDI1NSwgU2lnSWVXUEFPcGFxdWUsIHswLCA4MCwgMjQyLCAxLCAwfSwKKwk0LCBET1QxMUZfRUlEX1dQQU9QQVFVRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgSFRDYXBzKSwgb2Zmc2V0b2YodERvdDExZklFSFRDYXBzLAorCXByZXNlbnQpLCAwLCAiSFRDYXBzIiwgMCwgMjgsIDYwLCBTaWdJZUhUQ2FwcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfSFRDQVBTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBXTU1DYXBzKSwgb2Zmc2V0b2YodERvdDExZklFV01NQ2FwcywKKwlwcmVzZW50KSwgMCwgIldNTUNhcHMiLCAwLCA5LCA5LCBTaWdJZVdNTUNhcHMsIHswLCA4MCwgMjQyLCAyLCA1fSwKKwk1LCBET1QxMUZfRUlEX1dNTUNBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFdNTUluZm9TdGF0aW9uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiwgcHJlc2VudCksIDAsICJXTU1JbmZvU3RhdGlvbiIsCisJMCwgOSwgOSwgU2lnSWVXTU1JbmZvU3RhdGlvbiwgezAsIDgwLCAyNDIsIDIsIDB9LAorCTUsIERPVDExRl9FSURfV01NSU5GT1NUQVRJT04sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFdzY0lFT3BhcXVlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXc2NJRU9wYXF1ZSwgcHJlc2VudCksIDAsICJXc2NJRU9wYXF1ZSIsCisJMCwgOCwgMjU1LCBTaWdJZVdzY0lFT3BhcXVlLCB7MCwgODAsIDI0MiwgNCwgMH0sCisJNCwgRE9UMTFGX0VJRF9XU0NJRU9QQVFVRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgV0FQSU9wYXF1ZSksCisJb2Zmc2V0b2YodERvdDExZklFV0FQSU9wYXF1ZSwgcHJlc2VudCksIDAsICJXQVBJT3BhcXVlIiwKKwkwLCA4LCAyNTUsIFNpZ0llV0FQSU9wYXF1ZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfV0FQSU9QQVFVRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgV0FQSSksIG9mZnNldG9mKHREb3QxMWZJRVdBUEksIHByZXNlbnQpLAorCTAsICJXQVBJIiwgMCwgMTQsIDExMiwgU2lnSWVXQVBJLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9XQVBJLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBFU0VSYWRNZ210Q2FwKSwKKwlvZmZzZXRvZih0RG90MTFmSUVFU0VSYWRNZ210Q2FwLCBwcmVzZW50KSwgMCwgIkVTRVJhZE1nbXRDYXAiLAorCTAsIDgsIDgsIFNpZ0llRVNFUmFkTWdtdENhcCwgezAsIDY0LCAxNTAsIDEsIDB9LAorCTQsIERPVDExRl9FSURfRVNFUkFETUdNVENBUCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgRVNFVmVyc2lvbiksCisJb2Zmc2V0b2YodERvdDExZklFRVNFVmVyc2lvbiwgcHJlc2VudCksIDAsICJFU0VWZXJzaW9uIiwKKwkwLCA3LCA3LCBTaWdJZUVTRVZlcnNpb24sIHswLCA2NCwgMTUwLCAzLCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVZFUlNJT04sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIEVTRUNja21PcGFxdWUpLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRUNja21PcGFxdWUsIHByZXNlbnQpLCAwLCAiRVNFQ2NrbU9wYXF1ZSIsCisJMCwgMTIsIDI2LCBTaWdJZUVTRUNja21PcGFxdWUsIHswLCA2NCwgMTUwLCAwLCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRUNDS01PUEFRVUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFdNTVRTUEVDKSwgb2Zmc2V0b2YodERvdDExZklFV01NVFNQRUMsCisJcHJlc2VudCksIG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgbnVtX1dNTVRTUEVDKSwgIldNTVRTUEVDIiwKKwk0LCA2MywgNjMsIFNpZ0llV01NVFNQRUMsIHswLCA4MCwgMjQyLCAyLCAyfSwKKwk1LCBET1QxMUZfRUlEX1dNTVRTUEVDLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBFU0VUcmFmU3RybVJhdGVTZXQpLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRVRyYWZTdHJtUmF0ZVNldCwgcHJlc2VudCksIDAsICJFU0VUcmFmU3RybVJhdGVTZXQiLAorCTAsIDcsIDE1LCBTaWdJZUVTRVRyYWZTdHJtUmF0ZVNldCwgezAsIDY0LCAxNTAsIDgsIDB9LAorCTQsIERPVDExRl9FSURfRVNFVFJBRlNUUk1SQVRFU0VULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBQMlBJRU9wYXF1ZSksCisJb2Zmc2V0b2YodERvdDExZklFUDJQSUVPcGFxdWUsIHByZXNlbnQpLCAwLCAiUDJQSUVPcGFxdWUiLAorCTAsIDgsIDI1NSwgU2lnSWVQMlBJRU9wYXF1ZSwgezgwLCAxMTEsIDE1NCwgOSwgMH0sCisJNCwgRE9UMTFGX0VJRF9QMlBJRU9QQVFVRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgV0ZESUVPcGFxdWUpLAorCW9mZnNldG9mKHREb3QxMWZJRVdGRElFT3BhcXVlLCBwcmVzZW50KSwgMCwgIldGRElFT3BhcXVlIiwKKwkwLCA4LCAyNTUsIFNpZ0llV0ZESUVPcGFxdWUsIHs4MCwgMTExLCAxNTQsIDEwLCAwfSwKKwk0LCBET1QxMUZfRUlEX1dGRElFT1BBUVVFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBWSFRDYXBzKSwgb2Zmc2V0b2YodERvdDExZklFVkhUQ2FwcywKKwlwcmVzZW50KSwgMCwgIlZIVENhcHMiLCAwLCAxNCwgMTQsIFNpZ0llVkhUQ2FwcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVkhUQ0FQUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgRXh0Q2FwKSwgb2Zmc2V0b2YodERvdDExZklFRXh0Q2FwLAorCXByZXNlbnQpLCAwLCAiRXh0Q2FwIiwgMCwgMTAsIDExLCBTaWdJZUV4dENhcCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRVhUQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBPcGVyYXRpbmdNb2RlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVPcGVyYXRpbmdNb2RlLCBwcmVzZW50KSwgMCwgIk9wZXJhdGluZ01vZGUiLAorCTAsIDMsIDMsIFNpZ0llT3BlcmF0aW5nTW9kZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfT1BFUkFUSU5HTU9ERSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgUW9zTWFwU2V0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVRb3NNYXBTZXQsIHByZXNlbnQpLCAwLCAiUW9zTWFwU2V0IiwKKwkwLCAyLCA2MiwgU2lnSWVRb3NNYXBTZXQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9RT1NNQVBTRVQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIHZlbmRvcjJfaWUpLAorCW9mZnNldG9mKHREb3QxMWZJRXZlbmRvcjJfaWUsIHByZXNlbnQpLCAwLCAidmVuZG9yMl9pZSIsCisJMCwgNywgMjgsIFNpZ0lldmVuZG9yMl9pZSwgezAsIDE0NCwgNzYsIDAsIDB9LAorCTMsIERPVDExRl9FSURfVkVORE9SMl9JRSwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfcmVfYXNzb2NfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmUmVBc3NvY1JlcXVlc3QgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfUmVBc3NvY1JlcXVlc3QsIElFU19SZUFzc29jUmVxdWVzdCwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19yZV9hc3NvY19yZXF1ZXN0LiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfUmVBc3NvY1Jlc3BvbnNlW10gPSB7CisJeyAiQ2FwYWJpbGl0aWVzIiwgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgQ2FwYWJpbGl0aWVzKSwKKwlTaWdGZkNhcGFiaWxpdGllcywgRE9UMTFGX0ZGX0NBUEFCSUxJVElFU19MRU4sIH0sCisJeyAiU3RhdHVzIiwgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgU3RhdHVzKSwgU2lnRmZTdGF0dXMsCisJRE9UMTFGX0ZGX1NUQVRVU19MRU4sIH0sCisJeyAiQUlEIiwgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgQUlEKSwgU2lnRmZBSUQsCisJRE9UMTFGX0ZGX0FJRF9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfUmVBc3NvY1Jlc3BvbnNlW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBTdXBwUmF0ZXMpLAorCW9mZnNldG9mKHREb3QxMWZJRVN1cHBSYXRlcywgcHJlc2VudCksIDAsICJTdXBwUmF0ZXMiLAorCTAsIDIsIDE0LCBTaWdJZVN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NVUFBSQVRFUywgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIEV4dFN1cHBSYXRlcyksCisJb2Zmc2V0b2YodERvdDExZklFRXh0U3VwcFJhdGVzLCBwcmVzZW50KSwgMCwgIkV4dFN1cHBSYXRlcyIsCisJMCwgMywgMTQsIFNpZ0llRXh0U3VwcFJhdGVzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FWFRTVVBQUkFURVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBFRENBUGFyYW1TZXQpLAorCW9mZnNldG9mKHREb3QxMWZJRUVEQ0FQYXJhbVNldCwgcHJlc2VudCksIDAsICJFRENBUGFyYW1TZXQiLAorCTAsIDIwLCAyMCwgU2lnSWVFRENBUGFyYW1TZXQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VEQ0FQQVJBTVNFVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIFJDUElJRSksIG9mZnNldG9mKHREb3QxMWZJRVJDUElJRSwKKwlwcmVzZW50KSwgMCwgIlJDUElJRSIsIDAsIDMsIDMsIFNpZ0llUkNQSUlFLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9SQ1BJSUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBSU05JSUUpLCBvZmZzZXRvZih0RG90MTFmSUVSU05JSUUsCisJcHJlc2VudCksIDAsICJSU05JSUUiLCAwLCAzLCAzLCBTaWdJZVJTTklJRSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUlNOSUlFLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgUlJNRW5hYmxlZENhcCksCisJb2Zmc2V0b2YodERvdDExZklFUlJNRW5hYmxlZENhcCwgcHJlc2VudCksIDAsICJSUk1FbmFibGVkQ2FwIiwKKwkwLCA3LCA3LCBTaWdJZVJSTUVuYWJsZWRDYXAsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1JSTUVOQUJMRURDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBSU05PcGFxdWUpLAorCW9mZnNldG9mKHREb3QxMWZJRVJTTk9wYXF1ZSwgcHJlc2VudCksIDAsICJSU05PcGFxdWUiLAorCTAsIDgsIDI1NSwgU2lnSWVSU05PcGFxdWUsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1JTTk9QQVFVRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIE1vYmlsaXR5RG9tYWluKSwKKwlvZmZzZXRvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbiwgcHJlc2VudCksIDAsICJNb2JpbGl0eURvbWFpbiIsCisJMCwgNSwgNSwgU2lnSWVNb2JpbGl0eURvbWFpbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfTU9CSUxJVFlET01BSU4sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBGVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sCisJcHJlc2VudCksIDAsICJGVEluZm8iLCAwLCA4NCwgMjIyLCBTaWdJZUZUSW5mbywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRlRJTkZPLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgUklDRGF0YURlc2MpLAorCW9mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBwcmVzZW50KSwKKwlvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBudW1fUklDRGF0YURlc2MpLCAiUklDRGF0YURlc2MiLAorCTIsIDIsIDU1MCwgU2lnSWVSSUNEYXRhRGVzYywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUklDREFUQURFU0MsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBXUEEpLCBvZmZzZXRvZih0RG90MTFmSUVXUEEsIHByZXNlbnQpLAorCTAsICJXUEEiLCAwLCA4LCA1MCwgU2lnSWVXUEEsIHswLCA4MCwgMjQyLCAxLCAwfSwgNCwgRE9UMTFGX0VJRF9XUEEsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBUaW1lb3V0SW50ZXJ2YWwpLAorCW9mZnNldG9mKHREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCwgcHJlc2VudCksIDAsICJUaW1lb3V0SW50ZXJ2YWwiLAorCTAsIDcsIDcsIFNpZ0llVGltZW91dEludGVydmFsLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9USU1FT1VUSU5URVJWQUwsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVIVENhcHMsCisJcHJlc2VudCksIDAsICJIVENhcHMiLCAwLCAyOCwgNjAsIFNpZ0llSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9IVENBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBIVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVIVEluZm8sCisJcHJlc2VudCksIDAsICJIVEluZm8iLCAwLCAyNCwgNTYsIFNpZ0llSFRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9IVElORk8sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBXTU1QYXJhbXMpLAorCW9mZnNldG9mKHREb3QxMWZJRVdNTVBhcmFtcywgcHJlc2VudCksIDAsICJXTU1QYXJhbXMiLAorCTAsIDI2LCAyNiwgU2lnSWVXTU1QYXJhbXMsIHswLCA4MCwgMjQyLCAyLCAxfSwKKwk1LCBET1QxMUZfRUlEX1dNTVBBUkFNUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIEVTRVJhZE1nbXRDYXApLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRVJhZE1nbXRDYXAsIHByZXNlbnQpLCAwLCAiRVNFUmFkTWdtdENhcCIsCisJMCwgOCwgOCwgU2lnSWVFU0VSYWRNZ210Q2FwLCB7MCwgNjQsIDE1MCwgMSwgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VSQURNR01UQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgRVNFVHJhZlN0cm1NZXQpLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRVRyYWZTdHJtTWV0LCBwcmVzZW50KSwgMCwgIkVTRVRyYWZTdHJtTWV0IiwKKwkwLCAxMCwgMTAsIFNpZ0llRVNFVHJhZlN0cm1NZXQsIHswLCA2NCwgMTUwLCA3LCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVRSQUZTVFJNTUVULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgRVNFVHhtaXRQb3dlciksCisJb2Zmc2V0b2YodERvdDExZklFRVNFVHhtaXRQb3dlciwgcHJlc2VudCksIDAsICJFU0VUeG1pdFBvd2VyIiwKKwkwLCA4LCA4LCBTaWdJZUVTRVR4bWl0UG93ZXIsIHswLCA2NCwgMTUwLCAwLCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVRYTUlUUE9XRVIsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBXTU1UU1BFQyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVRTUEVDLAorCXByZXNlbnQpLCBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBudW1fV01NVFNQRUMpLCAiV01NVFNQRUMiLAorCTQsIDYzLCA2MywgU2lnSWVXTU1UU1BFQywgezAsIDgwLCAyNDIsIDIsIDJ9LAorCTUsIERPVDExRl9FSURfV01NVFNQRUMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBFU0VUcmFmU3RybVJhdGVTZXQpLAorCW9mZnNldG9mKHREb3QxMWZJRUVTRVRyYWZTdHJtUmF0ZVNldCwgcHJlc2VudCksIDAsICJFU0VUcmFmU3RybVJhdGVTZXQiLAorCTAsIDcsIDE1LCBTaWdJZUVTRVRyYWZTdHJtUmF0ZVNldCwgezAsIDY0LCAxNTAsIDgsIDB9LAorCTQsIERPVDExRl9FSURfRVNFVFJBRlNUUk1SQVRFU0VULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgV3NjUmVhc3NvY1JlcyksCisJb2Zmc2V0b2YodERvdDExZklFV3NjUmVhc3NvY1JlcywgcHJlc2VudCksIDAsICJXc2NSZWFzc29jUmVzIiwKKwkwLCA2LCAzNywgU2lnSWVXc2NSZWFzc29jUmVzLCB7MCwgODAsIDI0MiwgNCwgMH0sCisJNCwgRE9UMTFGX0VJRF9XU0NSRUFTU09DUkVTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgUDJQQXNzb2NSZXMpLAorCW9mZnNldG9mKHREb3QxMWZJRVAyUEFzc29jUmVzLCBwcmVzZW50KSwgMCwgIlAyUEFzc29jUmVzIiwKKwkwLCA2LCAxNywgU2lnSWVQMlBBc3NvY1JlcywgezgwLCAxMTEsIDE1NCwgOSwgMH0sCisJNCwgRE9UMTFGX0VJRF9QMlBBU1NPQ1JFUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIFZIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVWSFRDYXBzLAorCXByZXNlbnQpLCAwLCAiVkhUQ2FwcyIsIDAsIDE0LCAxNCwgU2lnSWVWSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9WSFRDQVBTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgVkhUT3BlcmF0aW9uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVWSFRPcGVyYXRpb24sIHByZXNlbnQpLCAwLCAiVkhUT3BlcmF0aW9uIiwKKwkwLCA3LCA3LCBTaWdJZVZIVE9wZXJhdGlvbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVkhUT1BFUkFUSU9OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgRXh0Q2FwKSwgb2Zmc2V0b2YodERvdDExZklFRXh0Q2FwLAorCXByZXNlbnQpLCAwLCAiRXh0Q2FwIiwgMCwgMTAsIDExLCBTaWdJZUV4dENhcCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRVhUQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgT0JTU1NjYW5QYXJhbWV0ZXJzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVPQlNTU2NhblBhcmFtZXRlcnMsIHByZXNlbnQpLCAwLCAiT0JTU1NjYW5QYXJhbWV0ZXJzIiwKKwkwLCAxNiwgMTYsIFNpZ0llT0JTU1NjYW5QYXJhbWV0ZXJzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9PQlNTU0NBTlBBUkFNRVRFUlMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBRb3NNYXBTZXQpLAorCW9mZnNldG9mKHREb3QxMWZJRVFvc01hcFNldCwgcHJlc2VudCksIDAsICJRb3NNYXBTZXQiLAorCTAsIDIsIDYyLCBTaWdJZVFvc01hcFNldCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1FPU01BUFNFVCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIHZlbmRvcjJfaWUpLAorCW9mZnNldG9mKHREb3QxMWZJRXZlbmRvcjJfaWUsIHByZXNlbnQpLCAwLCAidmVuZG9yMl9pZSIsCisJMCwgNywgMjgsIFNpZ0lldmVuZG9yMl9pZSwgezAsIDE0NCwgNzYsIDAsIDB9LAorCTMsIERPVDExRl9FSURfVkVORE9SMl9JRSwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfcmVfYXNzb2NfcmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZlJlQXNzb2NSZXNwb25zZSAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19SZUFzc29jUmVzcG9uc2UsIElFU19SZUFzc29jUmVzcG9uc2UsCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfcmVfYXNzb2NfcmVzcG9uc2UuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19TTVBvd2VyU2F2ZVtdID0geworCXsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZlNNUG93ZXJTYXZlLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnksCisJRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKwl7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmU01Qb3dlclNhdmUsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uLAorCURPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgIlNNUG93ZXJNb2RlU2V0Iiwgb2Zmc2V0b2YodERvdDExZlNNUG93ZXJTYXZlLCBTTVBvd2VyTW9kZVNldCksCisJU2lnRmZTTVBvd2VyTW9kZVNldCwgRE9UMTFGX0ZGX1NNUE9XRVJNT0RFU0VUX0xFTiwgfSwKKwl7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19TTVBvd2VyU2F2ZVtdID0geworCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19zbV9wb3dlcl9zYXZlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZTTVBvd2VyU2F2ZSAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19TTVBvd2VyU2F2ZSwgSUVTX1NNUG93ZXJTYXZlLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3NtX3Bvd2VyX3NhdmUuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19TYVF1ZXJ5UmVxW10gPSB7CisJeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmU2FRdWVyeVJlcSwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5LAorCURPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZlNhUXVlcnlSZXEsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uLAorCURPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgIlRyYW5zYWN0aW9uSWQiLCBvZmZzZXRvZih0RG90MTFmU2FRdWVyeVJlcSwgVHJhbnNhY3Rpb25JZCksCisJU2lnRmZUcmFuc2FjdGlvbklkLCBET1QxMUZfRkZfVFJBTlNBQ1RJT05JRF9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfU2FRdWVyeVJlcVtdID0geworCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19zYV9xdWVyeV9yZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZlNhUXVlcnlSZXEgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfU2FRdWVyeVJlcSwgSUVTX1NhUXVlcnlSZXEsCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfc2FfcXVlcnlfcmVxLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfU2FRdWVyeVJzcFtdID0geworCXsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZlNhUXVlcnlSc3AsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSwKKwlET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorCXsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZTYVF1ZXJ5UnNwLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7ICJUcmFuc2FjdGlvbklkIiwgb2Zmc2V0b2YodERvdDExZlNhUXVlcnlSc3AsIFRyYW5zYWN0aW9uSWQpLAorCVNpZ0ZmVHJhbnNhY3Rpb25JZCwgRE9UMTFGX0ZGX1RSQU5TQUNUSU9OSURfTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1NhUXVlcnlSc3BbXSA9IHsKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfc2FfcXVlcnlfcnNwKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZTYVF1ZXJ5UnNwICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX1NhUXVlcnlSc3AsIElFU19TYVF1ZXJ5UnNwLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3NhX3F1ZXJ5X3JzcC4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1RETFNEaXNSZXFbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZURExTRGlzUmVxLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnksCisJRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKwl7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmVERMU0Rpc1JlcSwgQWN0aW9uKSwgU2lnRmZBY3Rpb24sCisJRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisJeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmVERMU0Rpc1JlcSwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfVERMU0Rpc1JlcVtdID0geworCXsgb2Zmc2V0b2YodERvdDExZlRETFNEaXNSZXEsIExpbmtJZGVudGlmaWVyKSwKKwlvZmZzZXRvZih0RG90MTFmSUVMaW5rSWRlbnRpZmllciwgcHJlc2VudCksIDAsICJMaW5rSWRlbnRpZmllciIsCisJMCwgMjAsIDIwLCBTaWdJZUxpbmtJZGVudGlmaWVyLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9MSU5LSURFTlRJRklFUiwgMSwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGRsc19kaXNfcmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZURExTRGlzUmVxICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX1RETFNEaXNSZXEsIElFU19URExTRGlzUmVxLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3RkbHNfZGlzX3JlcS4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1RETFNEaXNSc3BbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZURExTRGlzUnNwLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnksCisJRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKwl7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmVERMU0Rpc1JzcCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24sCisJRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisJeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmVERMU0Rpc1JzcCwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyAiQ2FwYWJpbGl0aWVzIiwgb2Zmc2V0b2YodERvdDExZlRETFNEaXNSc3AsIENhcGFiaWxpdGllcyksCisJU2lnRmZDYXBhYmlsaXRpZXMsIERPVDExRl9GRl9DQVBBQklMSVRJRVNfTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1RETFNEaXNSc3BbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZURExTRGlzUnNwLCBTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVTdXBwUmF0ZXMsCisJcHJlc2VudCksIDAsICJTdXBwUmF0ZXMiLCAwLCAyLCAxNCwgU2lnSWVTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1NVUFBSQVRFUywgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTRGlzUnNwLCBFeHRTdXBwUmF0ZXMpLAorCW9mZnNldG9mKHREb3QxMWZJRUV4dFN1cHBSYXRlcywgcHJlc2VudCksIDAsICJFeHRTdXBwUmF0ZXMiLAorCTAsIDMsIDE0LCBTaWdJZUV4dFN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRVhUU1VQUFJBVEVTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNEaXNSc3AsIFN1cHBDaGFubmVscyksCisJb2Zmc2V0b2YodERvdDExZklFU3VwcENoYW5uZWxzLCBwcmVzZW50KSwgMCwgIlN1cHBDaGFubmVscyIsCisJMCwgNCwgOTgsIFNpZ0llU3VwcENoYW5uZWxzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9TVVBQQ0hBTk5FTFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU0Rpc1JzcCwgU3VwcE9wZXJhdGluZ0NsYXNzZXMpLAorCW9mZnNldG9mKHREb3QxMWZJRVN1cHBPcGVyYXRpbmdDbGFzc2VzLCBwcmVzZW50KSwgMCwKKwkiU3VwcE9wZXJhdGluZ0NsYXNzZXMiLCAwLCAzLCAzNCwgU2lnSWVTdXBwT3BlcmF0aW5nQ2xhc3NlcywKKwl7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfU1VQUE9QRVJBVElOR0NMQVNTRVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU0Rpc1JzcCwgUlNOKSwgb2Zmc2V0b2YodERvdDExZklFUlNOLCBwcmVzZW50KSwgMCwKKwkiUlNOIiwgMCwgOCwgMTE2LCBTaWdJZVJTTiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JTTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTRGlzUnNwLCBFeHRDYXApLCBvZmZzZXRvZih0RG90MTFmSUVFeHRDYXAsIHByZXNlbnQpLAorCTAsICJFeHRDYXAiLCAwLCAxMCwgMTEsIFNpZ0llRXh0Q2FwLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FWFRDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU0Rpc1JzcCwgRlRJbmZvKSwgb2Zmc2V0b2YodERvdDExZklFRlRJbmZvLCBwcmVzZW50KSwKKwkwLCAiRlRJbmZvIiwgMCwgODQsIDIyMiwgU2lnSWVGVEluZm8sIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0ZUSU5GTywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTRGlzUnNwLCBUaW1lb3V0SW50ZXJ2YWwpLAorCW9mZnNldG9mKHREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCwgcHJlc2VudCksIDAsICJUaW1lb3V0SW50ZXJ2YWwiLAorCTAsIDcsIDcsIFNpZ0llVGltZW91dEludGVydmFsLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9USU1FT1VUSU5URVJWQUwsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU0Rpc1JzcCwgUklDRGF0YSksIG9mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGEsCisJcHJlc2VudCksIDAsICJSSUNEYXRhIiwgMCwgNiwgNiwgU2lnSWVSSUNEYXRhLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9SSUNEQVRBLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNEaXNSc3AsIEhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRUhUQ2FwcywgcHJlc2VudCksCisJMCwgIkhUQ2FwcyIsIDAsIDI4LCA2MCwgU2lnSWVIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0hUQ0FQUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTRGlzUnNwLCBodDIwNDBfYnNzX2NvZXhpc3RlbmNlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVodDIwNDBfYnNzX2NvZXhpc3RlbmNlLCBwcmVzZW50KSwgMCwKKwkiaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSIsIDAsIDMsIDMsIFNpZ0llaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSwKKwl7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfSFQyMDQwX0JTU19DT0VYSVNURU5DRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTRGlzUnNwLCBMaW5rSWRlbnRpZmllciksCisJb2Zmc2V0b2YodERvdDExZklFTGlua0lkZW50aWZpZXIsIHByZXNlbnQpLCAwLCAiTGlua0lkZW50aWZpZXIiLAorCTAsIDIwLCAyMCwgU2lnSWVMaW5rSWRlbnRpZmllciwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfTElOS0lERU5USUZJRVIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU0Rpc1JzcCwgVkhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVZIVENhcHMsCisJcHJlc2VudCksIDAsICJWSFRDYXBzIiwgMCwgMTQsIDE0LCBTaWdJZVZIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1ZIVENBUFMsIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3RkbHNfZGlzX3JzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmVERMU0Rpc1JzcCAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19URExTRGlzUnNwLCBJRVNfVERMU0Rpc1JzcCwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190ZGxzX2Rpc19yc3AuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19URExTUGVlclRyYWZmaWNJbmRbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZURExTUGVlclRyYWZmaWNJbmQsIENhdGVnb3J5KSwKKwlTaWdGZkNhdGVnb3J5LCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorCXsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZURExTUGVlclRyYWZmaWNJbmQsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uLAorCURPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZlRETFNQZWVyVHJhZmZpY0luZCwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfVERMU1BlZXJUcmFmZmljSW5kW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmVERMU1BlZXJUcmFmZmljSW5kLCBMaW5rSWRlbnRpZmllciksCisJb2Zmc2V0b2YodERvdDExZklFTGlua0lkZW50aWZpZXIsIHByZXNlbnQpLCAwLCAiTGlua0lkZW50aWZpZXIiLAorCTAsIDIwLCAyMCwgU2lnSWVMaW5rSWRlbnRpZmllciwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfTElOS0lERU5USUZJRVIsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1BlZXJUcmFmZmljSW5kLCBQVElDb250cm9sKSwKKwlvZmZzZXRvZih0RG90MTFmSUVQVElDb250cm9sLCBwcmVzZW50KSwgMCwgIlBUSUNvbnRyb2wiLAorCTAsIDUsIDUsIFNpZ0llUFRJQ29udHJvbCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUFRJQ09OVFJPTCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTUGVlclRyYWZmaWNJbmQsIFBVQnVmZmVyU3RhdHVzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVQVUJ1ZmZlclN0YXR1cywgcHJlc2VudCksIDAsICJQVUJ1ZmZlclN0YXR1cyIsCisJMCwgMywgMywgU2lnSWVQVUJ1ZmZlclN0YXR1cywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUFVCVUZGRVJTVEFUVVMsIDEsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3RkbHNfcGVlcl90cmFmZmljX2luZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmVERMU1BlZXJUcmFmZmljSW5kICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX1RETFNQZWVyVHJhZmZpY0luZCwgSUVTX1RETFNQZWVyVHJhZmZpY0luZCwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190ZGxzX3BlZXJfdHJhZmZpY19pbmQuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19URExTUGVlclRyYWZmaWNSc3BbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZURExTUGVlclRyYWZmaWNSc3AsIENhdGVnb3J5KSwKKwlTaWdGZkNhdGVnb3J5LCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorCXsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZURExTUGVlclRyYWZmaWNSc3AsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uLAorCURPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZlRETFNQZWVyVHJhZmZpY1JzcCwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfVERMU1BlZXJUcmFmZmljUnNwW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmVERMU1BlZXJUcmFmZmljUnNwLCBMaW5rSWRlbnRpZmllciksCisJb2Zmc2V0b2YodERvdDExZklFTGlua0lkZW50aWZpZXIsIHByZXNlbnQpLCAwLCAiTGlua0lkZW50aWZpZXIiLAorCTAsIDIwLCAyMCwgU2lnSWVMaW5rSWRlbnRpZmllciwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfTElOS0lERU5USUZJRVIsIDEsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3RkbHNfcGVlcl90cmFmZmljX3JzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmVERMU1BlZXJUcmFmZmljUnNwICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX1RETFNQZWVyVHJhZmZpY1JzcCwgSUVTX1RETFNQZWVyVHJhZmZpY1JzcCwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190ZGxzX3BlZXJfdHJhZmZpY19yc3AuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19URExTU2V0dXBDbmZbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBDbmYsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSwKKwlET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorCXsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBDbmYsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uLAorCURPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgIlN0YXR1cyIsIG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBDbmYsIFN0YXR1cyksIFNpZ0ZmU3RhdHVzLAorCURPVDExRl9GRl9TVEFUVVNfTEVOLCB9LAorCXsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cENuZiwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfVERMU1NldHVwQ25mW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwQ25mLCBSU04pLCBvZmZzZXRvZih0RG90MTFmSUVSU04sIHByZXNlbnQpLCAwLAorCSJSU04iLCAwLCA4LCAxMTYsIFNpZ0llUlNOLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUlNOLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cENuZiwgRURDQVBhcmFtU2V0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVFRENBUGFyYW1TZXQsIHByZXNlbnQpLCAwLCAiRURDQVBhcmFtU2V0IiwKKwkwLCAyMCwgMjAsIFNpZ0llRURDQVBhcmFtU2V0LCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FRENBUEFSQU1TRVQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwQ25mLCBGVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sCisJcHJlc2VudCksIDAsICJGVEluZm8iLCAwLCA4NCwgMjIyLCBTaWdJZUZUSW5mbywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRlRJTkZPLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cENuZiwgVGltZW91dEludGVydmFsKSwKKwlvZmZzZXRvZih0RG90MTFmSUVUaW1lb3V0SW50ZXJ2YWwsIHByZXNlbnQpLCAwLCAiVGltZW91dEludGVydmFsIiwKKwkwLCA3LCA3LCBTaWdJZVRpbWVvdXRJbnRlcnZhbCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVElNRU9VVElOVEVSVkFMLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cENuZiwgSFRJbmZvKSwgb2Zmc2V0b2YodERvdDExZklFSFRJbmZvLAorCXByZXNlbnQpLCAwLCAiSFRJbmZvIiwgMCwgMjQsIDU2LCBTaWdJZUhUSW5mbywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfSFRJTkZPLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cENuZiwgTGlua0lkZW50aWZpZXIpLAorCW9mZnNldG9mKHREb3QxMWZJRUxpbmtJZGVudGlmaWVyLCBwcmVzZW50KSwgMCwgIkxpbmtJZGVudGlmaWVyIiwKKwkwLCAyMCwgMjAsIFNpZ0llTGlua0lkZW50aWZpZXIsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0xJTktJREVOVElGSUVSLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cENuZiwgV01NUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFV01NUGFyYW1zLAorCXByZXNlbnQpLCAwLCAiV01NUGFyYW1zIiwgMCwgMjYsIDI2LCBTaWdJZVdNTVBhcmFtcywgezAsIDgwLCAyNDIsIDIsIDF9LAorCTUsIERPVDExRl9FSURfV01NUEFSQU1TLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cENuZiwgVkhUT3BlcmF0aW9uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVWSFRPcGVyYXRpb24sIHByZXNlbnQpLCAwLCAiVkhUT3BlcmF0aW9uIiwKKwkwLCA3LCA3LCBTaWdJZVZIVE9wZXJhdGlvbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVkhUT1BFUkFUSU9OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cENuZiwgT3BlcmF0aW5nTW9kZSksCisJb2Zmc2V0b2YodERvdDExZklFT3BlcmF0aW5nTW9kZSwgcHJlc2VudCksIDAsICJPcGVyYXRpbmdNb2RlIiwKKwkwLCAzLCAzLCBTaWdJZU9wZXJhdGluZ01vZGUsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX09QRVJBVElOR01PREUsIDAsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3RkbHNfc2V0dXBfY25mKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZURExTU2V0dXBDbmYgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfVERMU1NldHVwQ25mLCBJRVNfVERMU1NldHVwQ25mLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3RkbHNfc2V0dXBfY25mLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfVERMU1NldHVwUmVxW10gPSB7CisJeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUmVxLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnksCisJRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKwl7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUmVxLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSZXEsIERpYWxvZ1Rva2VuKSwKKwlTaWdGZkRpYWxvZ1Rva2VuLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorCXsgIkNhcGFiaWxpdGllcyIsIG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSZXEsIENhcGFiaWxpdGllcyksCisJU2lnRmZDYXBhYmlsaXRpZXMsIERPVDExRl9GRl9DQVBBQklMSVRJRVNfTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1RETFNTZXR1cFJlcVtdID0geworCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJlcSwgU3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFU3VwcFJhdGVzLAorCXByZXNlbnQpLCAwLCAiU3VwcFJhdGVzIiwgMCwgMiwgMTQsIFNpZ0llU3VwcFJhdGVzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9TVVBQUkFURVMsIDEsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUmVxLCBDb3VudHJ5KSwgb2Zmc2V0b2YodERvdDExZklFQ291bnRyeSwKKwlwcmVzZW50KSwgMCwgIkNvdW50cnkiLCAwLCA1LCAyNTcsIFNpZ0llQ291bnRyeSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfQ09VTlRSWSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSZXEsIEV4dFN1cHBSYXRlcyksCisJb2Zmc2V0b2YodERvdDExZklFRXh0U3VwcFJhdGVzLCBwcmVzZW50KSwgMCwgIkV4dFN1cHBSYXRlcyIsCisJMCwgMywgMTQsIFNpZ0llRXh0U3VwcFJhdGVzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FWFRTVVBQUkFURVMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUmVxLCBTdXBwQ2hhbm5lbHMpLAorCW9mZnNldG9mKHREb3QxMWZJRVN1cHBDaGFubmVscywgcHJlc2VudCksIDAsICJTdXBwQ2hhbm5lbHMiLAorCTAsIDQsIDk4LCBTaWdJZVN1cHBDaGFubmVscywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfU1VQUENIQU5ORUxTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJlcSwgUlNOKSwgb2Zmc2V0b2YodERvdDExZklFUlNOLCBwcmVzZW50KSwgMCwKKwkiUlNOIiwgMCwgOCwgMTE2LCBTaWdJZVJTTiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JTTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSZXEsIEV4dENhcCksIG9mZnNldG9mKHREb3QxMWZJRUV4dENhcCwKKwlwcmVzZW50KSwgMCwgIkV4dENhcCIsIDAsIDEwLCAxMSwgU2lnSWVFeHRDYXAsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0VYVENBUCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSZXEsIFN1cHBPcGVyYXRpbmdDbGFzc2VzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVTdXBwT3BlcmF0aW5nQ2xhc3NlcywgcHJlc2VudCksIDAsCisJIlN1cHBPcGVyYXRpbmdDbGFzc2VzIiwgMCwgMywgMzQsIFNpZ0llU3VwcE9wZXJhdGluZ0NsYXNzZXMsCisJezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NVUFBPUEVSQVRJTkdDTEFTU0VTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJlcSwgUU9TQ2Fwc1N0YXRpb24pLAorCW9mZnNldG9mKHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uLCBwcmVzZW50KSwgMCwgIlFPU0NhcHNTdGF0aW9uIiwKKwkwLCAzLCAzLCBTaWdJZVFPU0NhcHNTdGF0aW9uLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9RT1NDQVBTU1RBVElPTiwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSZXEsIEZUSW5mbyksIG9mZnNldG9mKHREb3QxMWZJRUZUSW5mbywKKwlwcmVzZW50KSwgMCwgIkZUSW5mbyIsIDAsIDg0LCAyMjIsIFNpZ0llRlRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9GVElORk8sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUmVxLCBUaW1lb3V0SW50ZXJ2YWwpLAorCW9mZnNldG9mKHREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCwgcHJlc2VudCksIDAsICJUaW1lb3V0SW50ZXJ2YWwiLAorCTAsIDcsIDcsIFNpZ0llVGltZW91dEludGVydmFsLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9USU1FT1VUSU5URVJWQUwsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUmVxLCBSSUNEYXRhKSwgb2Zmc2V0b2YodERvdDExZklFUklDRGF0YSwKKwlwcmVzZW50KSwgMCwgIlJJQ0RhdGEiLCAwLCA2LCA2LCBTaWdJZVJJQ0RhdGEsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1JJQ0RBVEEsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUmVxLCBIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVIVENhcHMsCisJcHJlc2VudCksIDAsICJIVENhcHMiLCAwLCAyOCwgNjAsIFNpZ0llSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9IVENBUFMsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUmVxLCBodDIwNDBfYnNzX2NvZXhpc3RlbmNlKSwKKwlvZmZzZXRvZih0RG90MTFmSUVodDIwNDBfYnNzX2NvZXhpc3RlbmNlLCBwcmVzZW50KSwgMCwKKwkiaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSIsIDAsIDMsIDMsIFNpZ0llaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSwKKwl7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfSFQyMDQwX0JTU19DT0VYSVNURU5DRSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSZXEsIExpbmtJZGVudGlmaWVyKSwKKwlvZmZzZXRvZih0RG90MTFmSUVMaW5rSWRlbnRpZmllciwgcHJlc2VudCksIDAsICJMaW5rSWRlbnRpZmllciIsCisJMCwgMjAsIDIwLCBTaWdJZUxpbmtJZGVudGlmaWVyLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9MSU5LSURFTlRJRklFUiwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSZXEsIFdNTUluZm9TdGF0aW9uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiwgcHJlc2VudCksIDAsICJXTU1JbmZvU3RhdGlvbiIsCisJMCwgOSwgOSwgU2lnSWVXTU1JbmZvU3RhdGlvbiwgezAsIDgwLCAyNDIsIDIsIDB9LAorCTUsIERPVDExRl9FSURfV01NSU5GT1NUQVRJT04sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUmVxLCBBSUQpLCBvZmZzZXRvZih0RG90MTFmSUVBSUQsIHByZXNlbnQpLCAwLAorCSJBSUQiLCAwLCA0LCA0LCBTaWdJZUFJRCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0FJRCwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSZXEsIFZIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVWSFRDYXBzLAorCXByZXNlbnQpLCAwLCAiVkhUQ2FwcyIsIDAsIDE0LCAxNCwgU2lnSWVWSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9WSFRDQVBTLCAwLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja190ZGxzX3NldHVwX3JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmVERMU1NldHVwUmVxICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX1RETFNTZXR1cFJlcSwgSUVTX1RETFNTZXR1cFJlcSwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190ZGxzX3NldHVwX3JlcS4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1RETFNTZXR1cFJzcFtdID0geworCXsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJzcCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5LAorCURPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJzcCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24sCisJRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisJeyAiU3RhdHVzIiwgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJzcCwgU3RhdHVzKSwgU2lnRmZTdGF0dXMsCisJRE9UMTFGX0ZGX1NUQVRVU19MRU4sIH0sCisJeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUnNwLCBEaWFsb2dUb2tlbiksCisJU2lnRmZEaWFsb2dUb2tlbiwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKwl7ICJDYXBhYmlsaXRpZXMiLCBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUnNwLCBDYXBhYmlsaXRpZXMpLAorCVNpZ0ZmQ2FwYWJpbGl0aWVzLCBET1QxMUZfRkZfQ0FQQUJJTElUSUVTX0xFTiwgfSwKKwl7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19URExTU2V0dXBSc3BbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSc3AsIFN1cHBSYXRlcyksIG9mZnNldG9mKHREb3QxMWZJRVN1cHBSYXRlcywKKwlwcmVzZW50KSwgMCwgIlN1cHBSYXRlcyIsIDAsIDIsIDE0LCBTaWdJZVN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfU1VQUFJBVEVTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJzcCwgQ291bnRyeSksIG9mZnNldG9mKHREb3QxMWZJRUNvdW50cnksCisJcHJlc2VudCksIDAsICJDb3VudHJ5IiwgMCwgNSwgMjU3LCBTaWdJZUNvdW50cnksIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0NPVU5UUlksIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUnNwLCBFeHRTdXBwUmF0ZXMpLAorCW9mZnNldG9mKHREb3QxMWZJRUV4dFN1cHBSYXRlcywgcHJlc2VudCksIDAsICJFeHRTdXBwUmF0ZXMiLAorCTAsIDMsIDE0LCBTaWdJZUV4dFN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRVhUU1VQUFJBVEVTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJzcCwgU3VwcENoYW5uZWxzKSwKKwlvZmZzZXRvZih0RG90MTFmSUVTdXBwQ2hhbm5lbHMsIHByZXNlbnQpLCAwLCAiU3VwcENoYW5uZWxzIiwKKwkwLCA0LCA5OCwgU2lnSWVTdXBwQ2hhbm5lbHMsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1NVUFBDSEFOTkVMUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSc3AsIFJTTiksIG9mZnNldG9mKHREb3QxMWZJRVJTTiwgcHJlc2VudCksIDAsCisJIlJTTiIsIDAsIDgsIDExNiwgU2lnSWVSU04sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SU04sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUnNwLCBFeHRDYXApLCBvZmZzZXRvZih0RG90MTFmSUVFeHRDYXAsCisJcHJlc2VudCksIDAsICJFeHRDYXAiLCAwLCAxMCwgMTEsIFNpZ0llRXh0Q2FwLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9FWFRDQVAsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUnNwLCBTdXBwT3BlcmF0aW5nQ2xhc3NlcyksCisJb2Zmc2V0b2YodERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMsIHByZXNlbnQpLCAwLAorCSJTdXBwT3BlcmF0aW5nQ2xhc3NlcyIsIDAsIDMsIDM0LCBTaWdJZVN1cHBPcGVyYXRpbmdDbGFzc2VzLAorCXswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TVVBQT1BFUkFUSU5HQ0xBU1NFUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSc3AsIFFPU0NhcHNTdGF0aW9uKSwKKwlvZmZzZXRvZih0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiwgcHJlc2VudCksIDAsICJRT1NDYXBzU3RhdGlvbiIsCisJMCwgMywgMywgU2lnSWVRT1NDYXBzU3RhdGlvbiwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfUU9TQ0FQU1NUQVRJT04sIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUnNwLCBGVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sCisJcHJlc2VudCksIDAsICJGVEluZm8iLCAwLCA4NCwgMjIyLCBTaWdJZUZUSW5mbywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRlRJTkZPLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJzcCwgVGltZW91dEludGVydmFsKSwKKwlvZmZzZXRvZih0RG90MTFmSUVUaW1lb3V0SW50ZXJ2YWwsIHByZXNlbnQpLCAwLCAiVGltZW91dEludGVydmFsIiwKKwkwLCA3LCA3LCBTaWdJZVRpbWVvdXRJbnRlcnZhbCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVElNRU9VVElOVEVSVkFMLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJzcCwgUklDRGF0YSksIG9mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGEsCisJcHJlc2VudCksIDAsICJSSUNEYXRhIiwgMCwgNiwgNiwgU2lnSWVSSUNEYXRhLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9SSUNEQVRBLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJzcCwgSFRDYXBzKSwgb2Zmc2V0b2YodERvdDExZklFSFRDYXBzLAorCXByZXNlbnQpLCAwLCAiSFRDYXBzIiwgMCwgMjgsIDYwLCBTaWdJZUhUQ2FwcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfSFRDQVBTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJzcCwgaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSksCisJb2Zmc2V0b2YodERvdDExZklFaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSwgcHJlc2VudCksIDAsCisJImh0MjA0MF9ic3NfY29leGlzdGVuY2UiLCAwLCAzLCAzLCBTaWdJZWh0MjA0MF9ic3NfY29leGlzdGVuY2UsCisJezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0hUMjA0MF9CU1NfQ09FWElTVEVOQ0UsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUnNwLCBMaW5rSWRlbnRpZmllciksCisJb2Zmc2V0b2YodERvdDExZklFTGlua0lkZW50aWZpZXIsIHByZXNlbnQpLCAwLCAiTGlua0lkZW50aWZpZXIiLAorCTAsIDIwLCAyMCwgU2lnSWVMaW5rSWRlbnRpZmllciwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfTElOS0lERU5USUZJRVIsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUnNwLCBXTU1JbmZvU3RhdGlvbiksCisJb2Zmc2V0b2YodERvdDExZklFV01NSW5mb1N0YXRpb24sIHByZXNlbnQpLCAwLCAiV01NSW5mb1N0YXRpb24iLAorCTAsIDksIDksIFNpZ0llV01NSW5mb1N0YXRpb24sIHswLCA4MCwgMjQyLCAyLCAwfSwKKwk1LCBET1QxMUZfRUlEX1dNTUlORk9TVEFUSU9OLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNTZXR1cFJzcCwgQUlEKSwgb2Zmc2V0b2YodERvdDExZklFQUlELCBwcmVzZW50KSwgMCwKKwkiQUlEIiwgMCwgNCwgNCwgU2lnSWVBSUQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9BSUQsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVERMU1NldHVwUnNwLCBWSFRDYXBzKSwgb2Zmc2V0b2YodERvdDExZklFVkhUQ2FwcywKKwlwcmVzZW50KSwgMCwgIlZIVENhcHMiLCAwLCAxNCwgMTQsIFNpZ0llVkhUQ2FwcywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVkhUQ0FQUywgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZURExTU2V0dXBSc3AsIE9wZXJhdGluZ01vZGUpLAorCW9mZnNldG9mKHREb3QxMWZJRU9wZXJhdGluZ01vZGUsIHByZXNlbnQpLCAwLCAiT3BlcmF0aW5nTW9kZSIsCisJMCwgMywgMywgU2lnSWVPcGVyYXRpbmdNb2RlLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9PUEVSQVRJTkdNT0RFLCAwLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja190ZGxzX3NldHVwX3JzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmVERMU1NldHVwUnNwICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX1RETFNTZXR1cFJzcCwgSUVTX1RETFNTZXR1cFJzcCwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190ZGxzX3NldHVwX3JzcC4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1RETFNUZWFyZG93bltdID0geworCXsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZlRETFNUZWFyZG93biwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5LAorCURPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZlRETFNUZWFyZG93biwgQWN0aW9uKSwgU2lnRmZBY3Rpb24sCisJRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisJeyAiUmVhc29uIiwgb2Zmc2V0b2YodERvdDExZlRETFNUZWFyZG93biwgUmVhc29uKSwgU2lnRmZSZWFzb24sCisJRE9UMTFGX0ZGX1JFQVNPTl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfVERMU1RlYXJkb3duW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmVERMU1RlYXJkb3duLCBGVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sCisJcHJlc2VudCksIDAsICJGVEluZm8iLCAwLCA4NCwgMjIyLCBTaWdJZUZUSW5mbywgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfRlRJTkZPLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRETFNUZWFyZG93biwgTGlua0lkZW50aWZpZXIpLAorCW9mZnNldG9mKHREb3QxMWZJRUxpbmtJZGVudGlmaWVyLCBwcmVzZW50KSwgMCwgIkxpbmtJZGVudGlmaWVyIiwKKwkwLCAyMCwgMjAsIFNpZ0llTGlua0lkZW50aWZpZXIsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX0xJTktJREVOVElGSUVSLCAxLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja190ZGxzX3RlYXJkb3duKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZURExTVGVhcmRvd24gKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfVERMU1RlYXJkb3duLCBJRVNfVERMU1RlYXJkb3duLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3RkbHNfdGVhcmRvd24uICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19UUENSZXBvcnRbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZUUENSZXBvcnQsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSwKKwlET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorCXsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZUUENSZXBvcnQsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uLAorCURPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZlRQQ1JlcG9ydCwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfVFBDUmVwb3J0W10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmVFBDUmVwb3J0LCBUUENSZXBvcnQpLCBvZmZzZXRvZih0RG90MTFmSUVUUENSZXBvcnQsCisJcHJlc2VudCksIDAsICJUUENSZXBvcnQiLCAwLCA0LCA0LCBTaWdJZVRQQ1JlcG9ydCwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfVFBDUkVQT1JULCAxLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja190cGNfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZUUENSZXBvcnQgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfVFBDUmVwb3J0LCBJRVNfVFBDUmVwb3J0LAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3RwY19yZXBvcnQuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19UUENSZXF1ZXN0W10gPSB7CisJeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmVFBDUmVxdWVzdCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5LAorCURPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZlRQQ1JlcXVlc3QsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uLAorCURPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZlRQQ1JlcXVlc3QsIERpYWxvZ1Rva2VuKSwKKwlTaWdGZkRpYWxvZ1Rva2VuLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorCXsgTlVMTCwgMCwgMCwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1RQQ1JlcXVlc3RbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZUUENSZXF1ZXN0LCBUUENSZXF1ZXN0KSwgb2Zmc2V0b2YodERvdDExZklFVFBDUmVxdWVzdCwKKwlwcmVzZW50KSwgMCwgIlRQQ1JlcXVlc3QiLCAwLCAyLCAyLCBTaWdJZVRQQ1JlcXVlc3QsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1RQQ1JFUVVFU1QsIDEsIH0sCisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3RwY19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZUUENSZXF1ZXN0ICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX1RQQ1JlcXVlc3QsIElFU19UUENSZXF1ZXN0LAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3RwY19yZXF1ZXN0LiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lW10gPSB7CisJeyAiVGltZVN0YW1wIiwgb2Zmc2V0b2YodERvdDExZlRpbWluZ0FkdmVydGlzZW1lbnRGcmFtZSwgVGltZVN0YW1wKSwKKwlTaWdGZlRpbWVTdGFtcCwgRE9UMTFGX0ZGX1RJTUVTVEFNUF9MRU4sIH0sCisJeyAiQ2FwYWJpbGl0aWVzIiwgb2Zmc2V0b2YodERvdDExZlRpbWluZ0FkdmVydGlzZW1lbnRGcmFtZSwKKwlDYXBhYmlsaXRpZXMpLCBTaWdGZkNhcGFiaWxpdGllcywgRE9UMTFGX0ZGX0NBUEFCSUxJVElFU19MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lLCBDb3VudHJ5KSwKKwlvZmZzZXRvZih0RG90MTFmSUVDb3VudHJ5LCBwcmVzZW50KSwgMCwgIkNvdW50cnkiLCAwLCA1LCAyNTcsIFNpZ0llQ291bnRyeSwKKwl7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQ09VTlRSWSwgMCwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZUaW1pbmdBZHZlcnRpc2VtZW50RnJhbWUsIFBvd2VyQ29uc3RyYWludHMpLAorCW9mZnNldG9mKHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMsIHByZXNlbnQpLCAwLCAiUG93ZXJDb25zdHJhaW50cyIsCisJMCwgMywgMywgU2lnSWVQb3dlckNvbnN0cmFpbnRzLCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9QT1dFUkNPTlNUUkFJTlRTLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRpbWluZ0FkdmVydGlzZW1lbnRGcmFtZSwgVGltZUFkdmVydGlzZW1lbnQpLAorCW9mZnNldG9mKHREb3QxMWZJRVRpbWVBZHZlcnRpc2VtZW50LCBwcmVzZW50KSwgMCwgIlRpbWVBZHZlcnRpc2VtZW50IiwKKwkwLCAxOCwgMTgsIFNpZ0llVGltZUFkdmVydGlzZW1lbnQsIHswLCAwLCAwLCAwLCAwfSwKKwkwLCBET1QxMUZfRUlEX1RJTUVBRFZFUlRJU0VNRU5ULCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRpbWluZ0FkdmVydGlzZW1lbnRGcmFtZSwgRXh0Q2FwKSwKKwlvZmZzZXRvZih0RG90MTFmSUVFeHRDYXAsIHByZXNlbnQpLCAwLCAiRXh0Q2FwIiwgMCwgMTAsIDExLCBTaWdJZUV4dENhcCwKKwl7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRVhUQ0FQLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZlRpbWluZ0FkdmVydGlzZW1lbnRGcmFtZSwgVmVuZG9yMUlFKSwKKwlvZmZzZXRvZih0RG90MTFmSUVWZW5kb3IxSUUsIHByZXNlbnQpLCAwLCAiVmVuZG9yMUlFIiwKKwkwLCA1LCA1LCBTaWdJZVZlbmRvcjFJRSwgezAsIDE2LCAyNCwgMCwgMH0sCisJMywgRE9UMTFGX0VJRF9WRU5ET1IxSUUsIDAsIH0sCisJeyBvZmZzZXRvZih0RG90MTFmVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lLCBWZW5kb3IzSUUpLAorCW9mZnNldG9mKHREb3QxMWZJRVZlbmRvcjNJRSwgcHJlc2VudCksIDAsICJWZW5kb3IzSUUiLAorCTAsIDUsIDUsIFNpZ0llVmVuZG9yM0lFLCB7MCwgMjIsIDUwLCAwLCAwfSwKKwkzLCBET1QxMUZfRUlEX1ZFTkRPUjNJRSwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfdGltaW5nX2FkdmVydGlzZW1lbnRfZnJhbWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZlRpbWluZ0FkdmVydGlzZW1lbnRGcmFtZSAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19UaW1pbmdBZHZlcnRpc2VtZW50RnJhbWUsIElFU19UaW1pbmdBZHZlcnRpc2VtZW50RnJhbWUsCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdGltaW5nX2FkdmVydGlzZW1lbnRfZnJhbWUuICovCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19WSFRHaWRNYW5hZ2VtZW50QWN0aW9uRnJhbWVbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZWSFRHaWRNYW5hZ2VtZW50QWN0aW9uRnJhbWUsIENhdGVnb3J5KSwKKwlTaWdGZkNhdGVnb3J5LCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorCXsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZWSFRHaWRNYW5hZ2VtZW50QWN0aW9uRnJhbWUsIEFjdGlvbiksCisJU2lnRmZBY3Rpb24sIERPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorCXsgIlZodE1lbWJlcnNoaXBTdGF0dXNBcnJheSIsCisJb2Zmc2V0b2YodERvdDExZlZIVEdpZE1hbmFnZW1lbnRBY3Rpb25GcmFtZSwgVmh0TWVtYmVyc2hpcFN0YXR1c0FycmF5KSwKKwlTaWdGZlZodE1lbWJlcnNoaXBTdGF0dXNBcnJheSwKKwlET1QxMUZfRkZfVkhUTUVNQkVSU0hJUFNUQVRVU0FSUkFZX0xFTiwgfSwKKwl7ICJWaHRVc2VyUG9zaXRpb25BcnJheSIsIG9mZnNldG9mKHREb3QxMWZWSFRHaWRNYW5hZ2VtZW50QWN0aW9uRnJhbWUsCisJVmh0VXNlclBvc2l0aW9uQXJyYXkpLCBTaWdGZlZodFVzZXJQb3NpdGlvbkFycmF5LAorCURPVDExRl9GRl9WSFRVU0VSUE9TSVRJT05BUlJBWV9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfVkhUR2lkTWFuYWdlbWVudEFjdGlvbkZyYW1lW10gPSB7CisJezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSx9OworCit1aW50MzJfdCBkb3QxMWZfdW5wYWNrX3ZodF9naWRfbWFuYWdlbWVudF9hY3Rpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwKKwkJdERvdDExZlZIVEdpZE1hbmFnZW1lbnRBY3Rpb25GcmFtZSAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19WSFRHaWRNYW5hZ2VtZW50QWN0aW9uRnJhbWUsIElFU19WSFRHaWRNYW5hZ2VtZW50QWN0aW9uRnJhbWUsCisJCSAgICAgICh1aW50OF90ICopcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKwkodm9pZClpOworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdmh0X2dpZF9tYW5hZ2VtZW50X2FjdGlvbl9mcmFtZS4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1dNTUFkZFRTUmVxdWVzdFtdID0geworCXsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZldNTUFkZFRTUmVxdWVzdCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5LAorCURPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZldNTUFkZFRTUmVxdWVzdCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24sCisJRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisJeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmV01NQWRkVFNSZXF1ZXN0LCBEaWFsb2dUb2tlbiksCisJU2lnRmZEaWFsb2dUb2tlbiwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKwl7ICJTdGF0dXNDb2RlIiwgb2Zmc2V0b2YodERvdDExZldNTUFkZFRTUmVxdWVzdCwgU3RhdHVzQ29kZSksCisJU2lnRmZTdGF0dXNDb2RlLCBET1QxMUZfRkZfU1RBVFVTQ09ERV9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfV01NQWRkVFNSZXF1ZXN0W10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmV01NQWRkVFNSZXF1ZXN0LCBXTU1UU1BFQyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVRTUEVDLAorCXByZXNlbnQpLCAwLCAiV01NVFNQRUMiLCAwLCA2MywgNjMsIFNpZ0llV01NVFNQRUMsIHswLCA4MCwgMjQyLCAyLCAyfSwKKwk1LCBET1QxMUZfRUlEX1dNTVRTUEVDLCAxLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZldNTUFkZFRTUmVxdWVzdCwgRVNFVHJhZlN0cm1SYXRlU2V0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVFU0VUcmFmU3RybVJhdGVTZXQsIHByZXNlbnQpLCAwLCAiRVNFVHJhZlN0cm1SYXRlU2V0IiwKKwkwLCA3LCAxNSwgU2lnSWVFU0VUcmFmU3RybVJhdGVTZXQsIHswLCA2NCwgMTUwLCA4LCAwfSwKKwk0LCBET1QxMUZfRUlEX0VTRVRSQUZTVFJNUkFURVNFVCwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfd21tX2FkZF90c19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZXTU1BZGRUU1JlcXVlc3QgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfV01NQWRkVFNSZXF1ZXN0LCBJRVNfV01NQWRkVFNSZXF1ZXN0LAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3dtbV9hZGRfdHNfcmVxdWVzdC4gKi8KKworc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1dNTUFkZFRTUmVzcG9uc2VbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZXTU1BZGRUU1Jlc3BvbnNlLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnksCisJRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKwl7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmV01NQWRkVFNSZXNwb25zZSwgQWN0aW9uKSwgU2lnRmZBY3Rpb24sCisJRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisJeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmV01NQWRkVFNSZXNwb25zZSwgRGlhbG9nVG9rZW4pLAorCVNpZ0ZmRGlhbG9nVG9rZW4sIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyAiU3RhdHVzQ29kZSIsIG9mZnNldG9mKHREb3QxMWZXTU1BZGRUU1Jlc3BvbnNlLCBTdGF0dXNDb2RlKSwKKwlTaWdGZlN0YXR1c0NvZGUsIERPVDExRl9GRl9TVEFUVVNDT0RFX0xFTiwgfSwKKwl7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19XTU1BZGRUU1Jlc3BvbnNlW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmV01NQWRkVFNSZXNwb25zZSwgV01NVFNQRUMpLAorCW9mZnNldG9mKHREb3QxMWZJRVdNTVRTUEVDLCBwcmVzZW50KSwgMCwgIldNTVRTUEVDIiwKKwkwLCA2MywgNjMsIFNpZ0llV01NVFNQRUMsIHswLCA4MCwgMjQyLCAyLCAyfSwKKwk1LCBET1QxMUZfRUlEX1dNTVRTUEVDLCAwLCB9LAorCXsgb2Zmc2V0b2YodERvdDExZldNTUFkZFRTUmVzcG9uc2UsIEVTRVRyYWZTdHJtTWV0KSwKKwlvZmZzZXRvZih0RG90MTFmSUVFU0VUcmFmU3RybU1ldCwgcHJlc2VudCksIDAsICJFU0VUcmFmU3RybU1ldCIsCisJMCwgMTAsIDEwLCBTaWdJZUVTRVRyYWZTdHJtTWV0LCB7MCwgNjQsIDE1MCwgNywgMH0sCisJNCwgRE9UMTFGX0VJRF9FU0VUUkFGU1RSTU1FVCwgMCwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfd21tX2FkZF90c19yZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmV01NQWRkVFNSZXNwb25zZSAqcEZybSkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCXN0YXR1cyA9IHVucGFja19jb3JlKHBDdHgsIHBCdWYsIG5CdWYsCisJCSAgICAgIEZGU19XTU1BZGRUU1Jlc3BvbnNlLCBJRVNfV01NQWRkVFNSZXNwb25zZSwKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja193bW1fYWRkX3RzX3Jlc3BvbnNlLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfV01NRGVsVFNbXSA9IHsKKwl7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZXTU1EZWxUUywgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5LAorCURPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisJeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZldNTURlbFRTLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiwKKwlET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZXTU1EZWxUUywgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuLAorCURPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisJeyAiU3RhdHVzQ29kZSIsIG9mZnNldG9mKHREb3QxMWZXTU1EZWxUUywgU3RhdHVzQ29kZSksIFNpZ0ZmU3RhdHVzQ29kZSwKKwlET1QxMUZfRkZfU1RBVFVTQ09ERV9MRU4sIH0sCisJeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfV01NRGVsVFNbXSA9IHsKKwl7IG9mZnNldG9mKHREb3QxMWZXTU1EZWxUUywgV01NVFNQRUMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1UU1BFQywKKwlwcmVzZW50KSwgMCwgIldNTVRTUEVDIiwgMCwgNjMsIDYzLCBTaWdJZVdNTVRTUEVDLCB7MCwgODAsIDI0MiwgMiwgMn0sCisJNSwgRE9UMTFGX0VJRF9XTU1UU1BFQywgMSwgfSwKKwl7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LH07CisKK3VpbnQzMl90IGRvdDExZl91bnBhY2tfd21tX2RlbF90cyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLAorCQl0RG90MTFmV01NRGVsVFMgKnBGcm0pCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSB1bnBhY2tfY29yZShwQ3R4LCBwQnVmLCBuQnVmLAorCQkgICAgICBGRlNfV01NRGVsVFMsIElFU19XTU1EZWxUUywKKwkJICAgICAgKHVpbnQ4X3QgKilwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworCSh2b2lkKWk7CisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja193bW1fZGVsX3RzLiAqLworCitzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZV9tZ210X2FjdGlvbl9mcmFtZVtdID0geworCXsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZmh0MjA0MF9ic3NfY29leGlzdGVuY2VfbWdtdF9hY3Rpb25fZnJhbWUsCisJQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5LCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorCXsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZodDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lLAorCUFjdGlvbiksIFNpZ0ZmQWN0aW9uLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKwl7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19odDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lW10gPSB7CisJeyBvZmZzZXRvZih0RG90MTFmaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZV9tZ210X2FjdGlvbl9mcmFtZSwKKwlodDIwNDBfYnNzX2NvZXhpc3RlbmNlKSwgb2Zmc2V0b2YodERvdDExZklFaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSwKKwlwcmVzZW50KSwgMCwgImh0MjA0MF9ic3NfY29leGlzdGVuY2UiLAorCTAsIDMsIDMsIFNpZ0llaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSwgezAsIDAsIDAsIDAsIDB9LAorCTAsIERPVDExRl9FSURfSFQyMDQwX0JTU19DT0VYSVNURU5DRSwgMSwgfSwKKwl7IG9mZnNldG9mKHREb3QxMWZodDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lLAorCWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQpLAorCW9mZnNldG9mKHREb3QxMWZJRWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQsIHByZXNlbnQpLCAwLAorCSJodDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0IiwKKwkwLCAzLCA1MywgU2lnSWVodDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sCisJMCwgRE9UMTFGX0VJRF9IVDIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JULCAxLCB9LAorCXswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sfTsKKwordWludDMyX3QgZG90MTFmX3VucGFja19odDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsCisJCXREb3QxMWZodDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lICpwRnJtKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gdW5wYWNrX2NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwKKwkJICAgICAgRkZTX2h0MjA0MF9ic3NfY29leGlzdGVuY2VfbWdtdF9hY3Rpb25fZnJhbWUsIElFU19odDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lLAorCQkgICAgICAodWludDhfdCAqKXBGcm0sIHNpemVvZigqcEZybSkpOworCisJKHZvaWQpaTsKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2h0MjA0MF9ic3NfY29leGlzdGVuY2VfbWdtdF9hY3Rpb25fZnJhbWUuICovCisKK3N0YXRpYyB1aW50MzJfdCB1bnBhY2tfY29yZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCSAgICBjb25zdCB0RkZEZWZuICBGRnNbXSwKKwkJCSAgICBjb25zdCB0SUVEZWZuICBJRXNbXSwKKwkJCSAgICB1aW50OF90ICpwRnJtLAorCQkJICAgIHNpemVfdCAgIG5Gcm0pCit7CisJY29uc3QgdEZGRGVmbiAqcEZmOworCWNvbnN0IHRJRURlZm4gKnBJZTsKKwl1aW50OF90ICAgKnBCdWZSZW1haW5pbmc7CisJdWludDMyX3QgIG5CdWZSZW1haW5pbmcsIHN0YXR1czsKKwl1aW50OF90ICAgZWlkLCBsZW47CisJdEZSQU1FU19CT09MICAqcGZGb3VuZDsKKwl1aW50MzJfdCAgY291bnRPZmZzZXQgPSAwOworCisJRE9UMTFGX1BBUkFNRVRFUl9DSEVDSyhwQnVmLCBuQnVmLCBwRnJtLCBuRnJtKTsKKwkodm9pZCluRnJtOworCisJKHZvaWQpcEN0eDsKKwlzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwlwQnVmUmVtYWluaW5nID0gcEJ1ZjsKKwluQnVmUmVtYWluaW5nID0gbkJ1ZjsKKworCXBJZSA9ICZJRXNbMF07CisJd2hpbGUgKDB4ZmYgIT0gcEllLT5laWQpIHsKKwkJcGZGb3VuZCA9ICh0RlJBTUVTX0JPT0wgKikocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkgICBwSWUtPnByZXNlbmNlT2Zmc2V0KTsKKwkJKnBmRm91bmQgPSAwVTsKKwkJaWYgKHBJZS0+Y291bnRPZmZzZXQpCisJCQkqKHVpbnQxNl90ICopKHBGcm0gKyBwSWUtPmNvdW50T2Zmc2V0KSA9IDBVOworCQkrK3BJZTsKKwl9CisKKwlwRmYgPSAmRkZzWzBdOworCXdoaWxlIChwRmYtPnNpemUpIHsKKwkJaWYgKHBGZi0+c2l6ZSA+IG5CdWZSZW1haW5pbmcpIHsKKwkJCUZSQU1FU19MT0czKHBDdHgsIEZSTE9HRSwgRlJGTCgiRml4ZWQgZmllbGQgJXMgaXMgJWQiCisJCQkJCSAgImJ5dGVzIGluIHNpemUsIGJ1dCB0aGVyZSBhcmUgb25seSAlZCBieXRlcyBsZWZ0IGkiCisJCQkJCSAgIm4gdGhpcyBmcmFtZS5cbiIpLCBwRmYtPm5hbWUsIHBGZi0+c2l6ZSwKKwkJCQkJICBuQnVmUmVtYWluaW5nKTsKKwkJCUZSQU1FU19EQkdfQlJFQUsoKTsKKwkJCXJldHVybiBET1QxMUZfTUlTU0lOR19GSVhFRF9GSUVMRDsKKwkJfQorCisJCXN3aXRjaCAocEZmLT5zaWcpIHsKKworCQljYXNlIFNpZ0ZmQUlEOgorCQkJZG90MTFmX3VucGFja19mZl9jb21tb25fZnVuYyhwQ3R4LAorCQkJICAgIHBCdWZSZW1haW5pbmcsICh1aW50MTZfdCAqKSYoKCh0RG90MTFmRmZBSUQgKikKKwkJCSAgICAocEZybSArIHBGZi0+b2Zmc2V0KSktPmFzc29jaWQpKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmQWN0aW9uOgorCQkJZG90MTFmX3VucGFja19mZl9hY3Rpb24ocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmQWN0aW9uICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZBdXRoQWxnbzoKKwkJCWRvdDExZl91bnBhY2tfZmZfY29tbW9uX2Z1bmMocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodWludDE2X3QgKikmKCgodERvdDExZkZmQXV0aEFsZ28gKikKKwkJCSAgICAocEZybSArIHBGZi0+b2Zmc2V0KSktPmFsZ28pKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmQXV0aFNlcU5vOgorCQkJZG90MTFmX3VucGFja19mZl9jb21tb25fZnVuYyhwQ3R4LAorCQkJICAgIHBCdWZSZW1haW5pbmcsICh1aW50MTZfdCAqKSYoKCh0RG90MTFmRmZBdXRoU2VxTm8gKikKKwkJCSAgICAocEZybSArIHBGZi0+b2Zmc2V0KSktPm5vKSk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZkJlYWNvbkludGVydmFsOgorCQkJZG90MTFmX3VucGFja19mZl9jb21tb25fZnVuYyhwQ3R4LAorCQkJICAgIHBCdWZSZW1haW5pbmcsICh1aW50MTZfdCAqKSYoKCh0RG90MTFmRmZCZWFjb25JbnRlcnZhbCAqKQorCQkJICAgIChwRnJtICsgcEZmLT5vZmZzZXQpKS0+aW50ZXJ2YWwpKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmQ2FwYWJpbGl0aWVzOgorCQkJZG90MTFmX3VucGFja19mZl9jYXBhYmlsaXRpZXMocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmQ2FwYWJpbGl0aWVzICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZDYXRlZ29yeToKKwkJCWRvdDExZl91bnBhY2tfZmZfY2F0ZWdvcnkocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmQ2F0ZWdvcnkgKikKKwkJCSAgICAocEZybSArIHBGZi0+b2Zmc2V0KSk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZkN1cnJlbnRBUEFkZHJlc3M6CisJCQlkb3QxMWZfdW5wYWNrX2ZmX2N1cnJlbnRfYXBfYWRkcmVzcyhwQ3R4LAorCQkJICAgIHBCdWZSZW1haW5pbmcsICh0RG90MTFmRmZDdXJyZW50QVBBZGRyZXNzICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZEaWFsb2dUb2tlbjoKKwkJCWRvdDExZl91bnBhY2tfZmZfZGlhbG9nX3Rva2VuKHBDdHgsCisJCQkgICAgcEJ1ZlJlbWFpbmluZywgKHREb3QxMWZGZkRpYWxvZ1Rva2VuICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZMaW5rTWFyZ2luOgorCQkJZG90MTFmX3VucGFja19mZl9saW5rX21hcmdpbihwQ3R4LAorCQkJICAgIHBCdWZSZW1haW5pbmcsICh0RG90MTFmRmZMaW5rTWFyZ2luICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZMaXN0ZW5JbnRlcnZhbDoKKwkJCWRvdDExZl91bnBhY2tfZmZfY29tbW9uX2Z1bmMocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodWludDE2X3QgKikmKCgodERvdDExZkZmTGlzdGVuSW50ZXJ2YWwgKikKKwkJCSAgICAocEZybSArIHBGZi0+b2Zmc2V0KSktPmludGVydmFsKSk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZk1heFR4UG93ZXI6CisJCQlkb3QxMWZfdW5wYWNrX2ZmX21heF90eF9wb3dlcihwQ3R4LAorCQkJICAgIHBCdWZSZW1haW5pbmcsICh0RG90MTFmRmZNYXhUeFBvd2VyICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZOdW1PZlJlcGV0aXRpb25zOgorCQkJZG90MTFmX3VucGFja19mZl9udW1fb2ZfcmVwZXRpdGlvbnMocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmTnVtT2ZSZXBldGl0aW9ucyAqKQorCQkJICAgIChwRnJtICsgcEZmLT5vZmZzZXQpKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmT3BlcmF0aW5nTW9kZToKKwkJCWRvdDExZl91bnBhY2tfZmZfb3BlcmF0aW5nX21vZGUocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmT3BlcmF0aW5nTW9kZSAqKQorCQkJICAgIChwRnJtICsgcEZmLT5vZmZzZXQpKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmUkNQSToKKwkJCWRvdDExZl91bnBhY2tfZmZfcmNwaShwQ3R4LAorCQkJICAgIHBCdWZSZW1haW5pbmcsICh0RG90MTFmRmZSQ1BJICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZSU05JOgorCQkJZG90MTFmX3VucGFja19mZl9yc25pKHBDdHgsCisJCQkgICAgcEJ1ZlJlbWFpbmluZywgKHREb3QxMWZGZlJTTkkgKikKKwkJCSAgICAocEZybSArIHBGZi0+b2Zmc2V0KSk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZlJlYXNvbjoKKwkJCWRvdDExZl91bnBhY2tfZmZfY29tbW9uX2Z1bmMocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodWludDE2X3QgKikmKCgodERvdDExZkZmUmVhc29uICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpLT5jb2RlKSk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZlJ4QW50ZW5uYUlkOgorCQkJZG90MTFmX3VucGFja19mZl9yeF9hbnRlbm5hX2lkKHBDdHgsCisJCQkgICAgcEJ1ZlJlbWFpbmluZywgKHREb3QxMWZGZlJ4QW50ZW5uYUlkICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZTTVBvd2VyTW9kZVNldDoKKwkJCWRvdDExZl91bnBhY2tfZmZfc21fcG93ZXJfbW9kZV9zZXQocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmU01Qb3dlck1vZGVTZXQgKikKKwkJCSAgICAocEZybSArIHBGZi0+b2Zmc2V0KSk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZlN0YXR1czoKKwkJCWRvdDExZl91bnBhY2tfZmZfY29tbW9uX2Z1bmMocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodWludDE2X3QgKikmKCgodERvdDExZkZmU3RhdHVzICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpLT5zdGF0dXMpKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmU3RhdHVzQ29kZToKKwkJCWRvdDExZl91bnBhY2tfZmZfc3RhdHVzX2NvZGUocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmU3RhdHVzQ29kZSAqKQorCQkJICAgIChwRnJtICsgcEZmLT5vZmZzZXQpKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmVFBDRWxlSUQ6CisJCQlkb3QxMWZfdW5wYWNrX2ZmX3RwY19lbGVfaWQocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmVFBDRWxlSUQgKikKKwkJCSAgICAocEZybSArIHBGZi0+b2Zmc2V0KSk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZlRQQ0VsZUxlbjoKKwkJCWRvdDExZl91bnBhY2tfZmZfdHBjX2VsZV9sZW4ocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmVFBDRWxlTGVuICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZUU0luZm86CisJCQlkb3QxMWZfdW5wYWNrX2ZmX3RzX2luZm8ocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmVFNJbmZvICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZUaW1lU3RhbXA6CisJCQlkb3QxMWZfdW5wYWNrX2ZmX3RpbWVfc3RhbXAocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmVGltZVN0YW1wICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZUcmFuc2FjdGlvbklkOgorCQkJZG90MTFmX3VucGFja19mZl90cmFuc2FjdGlvbl9pZChwQ3R4LAorCQkJICAgIHBCdWZSZW1haW5pbmcsICh0RG90MTFmRmZUcmFuc2FjdGlvbklkICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZUeEFudGVubmFJZDoKKwkJCWRvdDExZl91bnBhY2tfZmZfdHhfYW50ZW5uYV9pZChwQ3R4LAorCQkJICAgIHBCdWZSZW1haW5pbmcsICh0RG90MTFmRmZUeEFudGVubmFJZCAqKQorCQkJICAgIChwRnJtICsgcEZmLT5vZmZzZXQpKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmVHhQb3dlcjoKKwkJCWRvdDExZl91bnBhY2tfZmZfdHhfcG93ZXIocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmVHhQb3dlciAqKQorCQkJICAgIChwRnJtICsgcEZmLT5vZmZzZXQpKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmVmh0TWVtYmVyc2hpcFN0YXR1c0FycmF5OgorCQkJZG90MTFmX3VucGFja19mZl92aHRfbWVtYmVyc2hpcF9zdGF0dXNfYXJyYXkocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmVmh0TWVtYmVyc2hpcFN0YXR1c0FycmF5ICopCisJCQkgICAgKHBGcm0gKyBwRmYtPm9mZnNldCkpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZWaHRVc2VyUG9zaXRpb25BcnJheToKKwkJCWRvdDExZl91bnBhY2tfZmZfdmh0X3VzZXJfcG9zaXRpb25fYXJyYXkocEN0eCwKKwkJCSAgICBwQnVmUmVtYWluaW5nLCAodERvdDExZkZmVmh0VXNlclBvc2l0aW9uQXJyYXkgKikKKwkJCSAgICAocEZybSArIHBGZi0+b2Zmc2V0KSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUZSQU1FU19MT0cxKHBDdHgsIEZSTE9HRSwgRlJGTCgiSU5URVJOQUwgRVJST1I6IEkgZG9uJyIKKwkJCQkgICAidCBrbm93IGFib3V0IHRoZSBGRiBzaWduYXR1cmUgJWQtLSB0aGlzIGlzIG1vc3QgIgorCQkJCSAgICJsaWtlbHkgYSAnZnJhbWVzYycgYnVnLlxuIiksIHBGZi0+c2lnKTsKKwkJCXJldHVybiBET1QxMUZfSU5URVJOQUxfRVJST1I7CisJCX0KKworCQlwQnVmUmVtYWluaW5nICs9IHBGZi0+c2l6ZTsKKwkJbkJ1ZlJlbWFpbmluZyAtPSBwRmYtPnNpemU7CisJCSsrcEZmOworCX0KKworCXdoaWxlIChuQnVmUmVtYWluaW5nKSB7CisJCWlmICgxID09IG5CdWZSZW1haW5pbmcpIHsKKwkJCUZSQU1FU19MT0cwKHBDdHgsIEZSTE9HRSwgRlJGTCgiVGhpcyBmcmFtZSByZXBvcnRzICIKKwkJCQkgICAgIm9ubHkgb25lIGJ5dGUgcmVtYWluaW5nIGFmdGVyIGl0J3MgZml4ZWQgZmllbGRzLlxuIikpOworCQkJc3RhdHVzIHw9IERPVDExRl9JTkNPTVBMRVRFX0lFOworCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJZ290byBNYW5kYXRvcnlDaGVjazsKKwkJfQorCisJCXBJZSA9IGZpbmRfaWVfZGVmbihwQ3R4LCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCBJRXMpOworCisJCWVpZCA9ICpwQnVmUmVtYWluaW5nKys7IC0tbkJ1ZlJlbWFpbmluZzsKKwkJbGVuID0gKnBCdWZSZW1haW5pbmcrKzsgLS1uQnVmUmVtYWluaW5nOworCisJCWlmIChwSWUgJiYgcEllLT5ub3VpKSB7CisJCQlpZiAocEllLT5ub3VpID4gbkJ1ZlJlbWFpbmluZykgeworCQkJCUZSQU1FU19MT0czKHBDdHgsIEZSTE9HVywgRlJGTCgiSUUgJWQgcmVwb3J0cyAiCisJCQkJCSJsZW5ndGggJWQsIGJ1dCBpdCBoYXMgYW4gT1VJIG9mICVkIGJ5dGVzLlxuIiksCisJCQkJCWVpZCwgbGVuLCBwSWUtPm5vdWkpOworCQkJCUZSQU1FU19EVU1QKHBDdHgsIEZSTE9HMSwgcEJ1ZiwgbkJ1Zik7CisJCQkJRlJBTUVTX0xPRzIocEN0eCwgRlJMT0cxLCBGUkZMKCJXZSd2ZSBwYXJzZWQgJWQgYnkiCisJCQkJCSJ0ZXMgb2YgdGhpcyBidWZmZXIsIGFuZCBzaG93ICVkIGxlZnQuXG4iKSwKKwkJCQkJcEJ1ZlJlbWFpbmluZyAtIHBCdWYsIG5CdWZSZW1haW5pbmcpOworCQkJCXN0YXR1cyB8PSBET1QxMUZfSU5DT01QTEVURV9JRTsKKwkJCQlGUkFNRVNfREJHX0JSRUFLKCk7CisJCQkJZ290byBNYW5kYXRvcnlDaGVjazsKKwkJCX0KKwkJCXBCdWZSZW1haW5pbmcgKz0gcEllLT5ub3VpOworCQkJbkJ1ZlJlbWFpbmluZyAtPSBwSWUtPm5vdWk7CisJCQlsZW4gICAgICAgICAgIC09IHBJZS0+bm91aTsKKwkJfQorCisJCWlmIChsZW4gPiBuQnVmUmVtYWluaW5nKSB7CisJCQlGUkFNRVNfTE9HMyhwQ3R4LCBGUkxPR1csIEZSRkwoIklFICVkIHJlcG9ydHMgbGVuZ3RoICUiCisJCQkJImQsIGJ1dCB0aGVyZSBhcmUgb25seSAlZCBieXRlcyByZW1haW5pbmcgaW4gdGhpcyIKKwkJCQkiIGZyYW1lLlxuIiksIGVpZCwgbGVuLCBuQnVmUmVtYWluaW5nKTsKKwkJCUZSQU1FU19EVU1QKHBDdHgsIEZSTE9HMSwgcEJ1ZiwgbkJ1Zik7CisJCQlGUkFNRVNfTE9HMihwQ3R4LCBGUkxPRzEsIEZSRkwoIldlJ3ZlIHBhcnNlZCAlZCBieSIKKwkJCQkidGVzIG9mIHRoaXMgYnVmZmVyLCBhbmQgc2hvdyAlZCBsZWZ0LlxuIiksCisJCQkJcEJ1ZlJlbWFpbmluZyAtIHBCdWYsIG5CdWZSZW1haW5pbmcpOworCQkJc3RhdHVzIHw9IERPVDExRl9JTkNPTVBMRVRFX0lFOworCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJZ290byBNYW5kYXRvcnlDaGVjazsKKwkJfQorCisJCWlmIChwSWUpIHsKKwkJCWlmIChuQnVmUmVtYWluaW5nIDwgcEllLT5taW5TaXplIC0gcEllLT5ub3VpIC0gMlUpIHsKKwkJCQlGUkFNRVNfTE9HMyhwQ3R4LCBGUkxPR1csIEZSRkwoIlRoZSBJRSAlcyBtdXN0IGJlICIKKwkJCQkJImF0IGxlYXN0ICVkIGJ5dGVzIGluIHNpemUsIGJ1dCB0aGVyZSBhcmUgb25sIgorCQkJCQkieSAlZCBieXRlcyByZW1haW5pbmcgaW4gdGhpcyBmcmFtZS5cbiIpLAorCQkJCQlwSWUtPm5hbWUsIHBJZS0+bWluU2l6ZSwgbkJ1ZlJlbWFpbmluZyk7CisJCQkJRlJBTUVTX0RVTVAocEN0eCwgRlJMT0cxLCBwQnVmLCBuQnVmKTsKKwkJCQlzdGF0dXMgfD0gRE9UMTFGX0lOQ09NUExFVEVfSUU7CisJCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJCWdvdG8gTWFuZGF0b3J5Q2hlY2s7CisJCQl9IGVsc2UgeworCQkJCWlmIChsZW4gPiBwSWUtPm1heFNpemUgLSBwSWUtPm5vdWkgLSAyVSkgeworCQkJCUZSQU1FU19MT0cxKHBDdHgsIEZSTE9HVywgRlJGTCgiVGhlIElFICVzIHJlcG9ydHMgIgorCQkJCQkiYW4gdW5leHBlY3RlZGx5IGxhcmdlIHNpemU7IGl0IGlzIHByZXN1bWFibHkgIgorCQkJCQkibW9yZSB1cC10by1kYXRlIHRoYW4gdGhpcyBwYXJzZXIsIGJ1dCB0aGlzIHdhIgorCQkJCQkicm5pbmcgbWF5IGFsc28gaW5kaWNhdGUgYSBjb3JydXB0IGZyYW1lLlxuIiksCisJCQkJCXBJZS0+bmFtZSk7CisJCQkJCUZSQU1FU19EVU1QKHBDdHgsIEZSTE9HMSwgcEJ1ZiwgbkJ1Zik7CisJCQkJfQorCisJCQkJY291bnRPZmZzZXQgPSAoKDAgIT0gcEllLT5hcnJheWJvdW5kKSAqCisJCQkJCQkoKih1aW50MTZfdCAqKShwRnJtICsgcEllLT5jb3VudE9mZnNldCkpKTsKKwkJCQlzd2l0Y2ggKHBJZS0+c2lnKSB7CisJCQkJY2FzZSBTaWdJZUNvbmRlbnNlZENvdW50cnlTdHI6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9jb25kZW5zZWRfY291bnRyeV9zdHIoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llR1RLOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfZ3RrKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFR1RLICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRUdUSykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVJR1RLOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfaWd0aygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUlHVEsgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFSUdUSykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVSMEtIX0lEOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfcjBfa2hfaWQoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVSMEtIX0lEICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVIwS0hfSUQpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUjFLSF9JRDoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3IxX2toX2lkKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFUjFLSF9JRCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVSMUtIX0lEKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVRTRkluZm86CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV90c2ZfaW5mbygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVRTRkluZm8gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFVFNGSW5mbykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVBUENoYW5uZWxSZXBvcnQ6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9hcF9jaGFubmVsX3JlcG9ydCgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llQmNuUmVwb3J0aW5nRGV0YWlsOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfYmNuX3JlcG9ydGluZ19kZXRhaWwoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWwgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUJlYWNvblJlcG9ydEZybUJvZHk6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9iZWFjb25fcmVwb3J0X2ZybV9ib2R5KAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5KSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUJlYWNvblJlcG9ydGluZzoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX2JlYWNvbl9yZXBvcnRpbmcoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVCZWFjb25SZXBvcnRpbmcgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFQmVhY29uUmVwb3J0aW5nKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZU1lYXN1cmVtZW50UGlsb3Q6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9tZWFzdXJlbWVudF9waWxvdCgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFTWVhc3VyZW1lbnRQaWxvdCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVNdWx0aUJzc2lkOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfbXVsdGlfYnNzaWQoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVNdWx0aUJzc2lkICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRU11bHRpQnNzaWQpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUklDRGF0YToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3JpY19kYXRhKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFUklDRGF0YSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVSSUNEYXRhKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVJJQ0Rlc2NyaXB0b3I6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9yaWNfZGVzY3JpcHRvcigKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFUklDRGVzY3JpcHRvcikgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVSUk1FbmFibGVkQ2FwOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfcnJtX2VuYWJsZWRfY2FwKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFUlJNRW5hYmxlZENhcCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVSUk1FbmFibGVkQ2FwKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVJlcXVlc3RlZEluZm86CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9yZXF1ZXN0ZWRfaW5mbygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVJlcXVlc3RlZEluZm8gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFUmVxdWVzdGVkSW5mbykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVTU0lEOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfc3NpZCgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVNTSUQgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFU1NJRCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVTY2hlZHVsZToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3NjaGVkdWxlKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFU2NoZWR1bGUgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFU2NoZWR1bGUpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVENMQVM6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV90Y2xhcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVRDTEFTICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVRDTEFTKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVRDTEFTU1BST0M6CisJCQkJCXN0YXR1cyB8PSBkb3QxMWZfdW5wYWNrX2llX2NvbW1vbl9mdW5jKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCQkJCQkodWludDhfdCAqKSAmKCgodERvdDExZklFVENMQVNTUFJPQyAqKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVENMQVNTUFJPQykqY291bnRPZmZzZXQpKS0+cHJlc2VudCksCisJCQkJCQkJCQkJKHVpbnQ4X3QgKikgJigoKHREb3QxMWZJRVRDTEFTU1BST0MgKikocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVRDTEFTU1BST0MpKmNvdW50T2Zmc2V0KSktPnByb2Nlc3NpbmcpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVRTRGVsYXk6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV90c19kZWxheSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVRTRGVsYXkgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFVFNEZWxheSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVUU1BFQzoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3RzcGVjKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFVFNQRUMgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFVFNQRUMpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVkhUQ2FwczoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3ZodF9jYXBzKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFVkhUQ2FwcyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVWSFRDYXBzKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVZIVE9wZXJhdGlvbjoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3ZodF9vcGVyYXRpb24oCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVWSFRPcGVyYXRpb24gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFVkhUT3BlcmF0aW9uKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdNTVNjaGVkdWxlOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd21tX3NjaGVkdWxlKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFV01NU2NoZWR1bGUgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFV01NU2NoZWR1bGUpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV01NVENMQVM6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV93bW10Y2xhcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVdNTVRDTEFTICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVdNTVRDTEFTKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdNTVRDTEFTUFJPQzoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3dtbXRjbGFzcHJvYygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVdNTVRDTEFTUFJPQyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVXTU1UQ0xBU1BST0MpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV01NVFNEZWxheToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3dtbXRzX2RlbGF5KAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFV01NVFNEZWxheSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVXTU1UU0RlbGF5KSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdNTVRTUEVDOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd21tdHNwZWMoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVXTU1UU1BFQyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVXTU1UU1BFQykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXaWRlckJXQ2hhblN3aXRjaEFubjoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3dpZGVyX2J3X2NoYW5fc3dpdGNoX2FubigKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVdpZGVyQldDaGFuU3dpdGNoQW5uICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVdpZGVyQldDaGFuU3dpdGNoQW5uKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUFJRDoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX2FpZCgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUFJRCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVBSUQpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llQ0ZQYXJhbXM6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9jZl9wYXJhbXMoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVDRlBhcmFtcyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVDRlBhcmFtcykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVDaGFsbGVuZ2VUZXh0OgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfY2hhbGxlbmdlX3RleHQoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVDaGFsbGVuZ2VUZXh0ICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRUNoYWxsZW5nZVRleHQpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llQ2hhblN3aXRjaEFubjoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX2NoYW5fc3dpdGNoX2FubigKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUNoYW5Td2l0Y2hBbm4gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFQ2hhblN3aXRjaEFubikgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVDaGFubmVsU3dpdGNoV3JhcHBlcjoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX2NoYW5uZWxfc3dpdGNoX3dyYXBwZXIoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVDaGFubmVsU3dpdGNoV3JhcHBlciAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVDaGFubmVsU3dpdGNoV3JhcHBlcikgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVDb3VudHJ5OgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfY291bnRyeSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUNvdW50cnkgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFQ291bnRyeSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVEU1BhcmFtczoKKwkJCQkJc3RhdHVzIHw9IGRvdDExZl91bnBhY2tfaWVfY29tbW9uX2Z1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJCQkJCSh1aW50OF90ICopICYoKCh0RG90MTFmSUVEU1BhcmFtcyAqKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFRFNQYXJhbXMpKmNvdW50T2Zmc2V0KSktPnByZXNlbnQpLAorCQkJCQkJCQkJCSh1aW50OF90ICopICYoKCh0RG90MTFmSUVEU1BhcmFtcyAqKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFRFNQYXJhbXMpKmNvdW50T2Zmc2V0KSktPmN1cnJfY2hhbm5lbCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llRURDQVBhcmFtU2V0OgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfZWRjYV9wYXJhbV9zZXQoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVFRENBUGFyYW1TZXQgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFRURDQVBhcmFtU2V0KSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUVSUEluZm86CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9lcnBfaW5mbygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUVSUEluZm8gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFRVJQSW5mbykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVFU0VDY2ttT3BhcXVlOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfZXNlX2Nja21fb3BhcXVlKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFRVNFQ2NrbU9wYXF1ZSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVFU0VDY2ttT3BhcXVlKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUVTRVJhZE1nbXRDYXA6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9lc2VfcmFkX21nbXRfY2FwKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFRVNFUmFkTWdtdENhcCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVFU0VSYWRNZ210Q2FwKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUVTRVRyYWZTdHJtTWV0OgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfZXNlX3RyYWZfc3RybV9tZXQoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVFU0VUcmFmU3RybU1ldCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVFU0VUcmFmU3RybU1ldCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVFU0VUcmFmU3RybVJhdGVTZXQ6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9lc2VfdHJhZl9zdHJtX3JhdGVfc2V0KAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFRVNFVHJhZlN0cm1SYXRlU2V0ICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRUVTRVRyYWZTdHJtUmF0ZVNldCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVFU0VUeG1pdFBvd2VyOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfZXNlX3R4bWl0X3Bvd2VyKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFRVNFVHhtaXRQb3dlciAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVFU0VUeG1pdFBvd2VyKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUVTRVZlcnNpb246CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9lc2VfdmVyc2lvbigKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUVTRVZlcnNpb24gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFRVNFVmVyc2lvbikgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVFeHRDYXA6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9leHRfY2FwKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFRXh0Q2FwICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRUV4dENhcCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVFeHRTdXBwUmF0ZXM6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9leHRfc3VwcF9yYXRlcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUV4dFN1cHBSYXRlcyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llRkhQYXJhbVNldDoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX2ZoX3BhcmFtX3NldCgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUZIUGFyYW1TZXQgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFRkhQYXJhbVNldCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVGSFBhcmFtczoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX2ZoX3BhcmFtcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUZIUGFyYW1zICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRUZIUGFyYW1zKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUZIUGF0dFRhYmxlOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfZmhfcGF0dF90YWJsZSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUZIUGF0dFRhYmxlICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRUZIUGF0dFRhYmxlKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUZUSW5mbzoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX2Z0X2luZm8oCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVGVEluZm8gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFRlRJbmZvKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUhUQ2FwczoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX2h0X2NhcHMoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVIVENhcHMgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFSFRDYXBzKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUhUSW5mbzoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX2h0X2luZm8oCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVIVEluZm8gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFSFRJbmZvKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUlCU1NQYXJhbXM6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9pYnNzX3BhcmFtcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUlCU1NQYXJhbXMgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFSUJTU1BhcmFtcykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVMaW5rSWRlbnRpZmllcjoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX2xpbmtfaWRlbnRpZmllcigKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRUxpbmtJZGVudGlmaWVyICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRUxpbmtJZGVudGlmaWVyKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZU1lYXN1cmVtZW50UmVwb3J0OgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfbWVhc3VyZW1lbnRfcmVwb3J0KAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llTWVhc3VyZW1lbnRSZXF1ZXN0OgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfbWVhc3VyZW1lbnRfcmVxdWVzdCgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llTW9iaWxpdHlEb21haW46CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9tb2JpbGl0eV9kb21haW4oCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVNb2JpbGl0eURvbWFpbiAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbikgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVOZWlnaGJvclJlcG9ydDoKKwkJCQkJaWYgKGNvdW50T2Zmc2V0IDwgTUFYX1NVUFBPUlRFRF9ORUlHSEJPUl9SUFQpIHsKKwkJCQkJCXN0YXR1cyB8PQorCQkJCQkJCWRvdDExZl91bnBhY2tfaWVfbmVpZ2hib3JfcmVwb3J0KAorCQkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkJICAgICh0RG90MTFmSUVOZWlnaGJvclJlcG9ydCAqKQorCQkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRU5laWdoYm9yUmVwb3J0KSAqCisJCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlzdGF0dXMgfD0gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llT0JTU1NjYW5QYXJhbWV0ZXJzOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfb2Jzc19zY2FuX3BhcmFtZXRlcnMoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVPQlNTU2NhblBhcmFtZXRlcnMgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFT0JTU1NjYW5QYXJhbWV0ZXJzKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZU9wZXJhdGluZ01vZGU6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9vcGVyYXRpbmdfbW9kZSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRU9wZXJhdGluZ01vZGUgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFT3BlcmF0aW5nTW9kZSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVQMlBBc3NvY1JlcToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3AyX3BfYXNzb2NfcmVxKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFUDJQQXNzb2NSZXEgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFUDJQQXNzb2NSZXEpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUDJQQXNzb2NSZXM6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9wMl9wX2Fzc29jX3JlcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVAyUEFzc29jUmVzICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVAyUEFzc29jUmVzKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVAyUEJlYWNvbjoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3AyX3BfYmVhY29uKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFUDJQQmVhY29uICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVAyUEJlYWNvbikgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVQMlBCZWFjb25Qcm9iZVJlczoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3AyX3BfYmVhY29uX3Byb2JlX3JlcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVAyUERlQXV0aDoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3AyX3BfZGVfYXV0aCgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVAyUERlQXV0aCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVQMlBEZUF1dGgpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUDJQRGlzQXNzb2M6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9wMl9wX2Rpc19hc3NvYygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVAyUERpc0Fzc29jICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVAyUERpc0Fzc29jKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVAyUElFT3BhcXVlOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfcDJfcGllX29wYXF1ZSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVAyUElFT3BhcXVlICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVAyUElFT3BhcXVlKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVAyUFByb2JlUmVxOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfcDJfcF9wcm9iZV9yZXEoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVQMlBQcm9iZVJlcSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVQMlBQcm9iZVJlcSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVQMlBQcm9iZVJlczoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3AyX3BfcHJvYmVfcmVzKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFUDJQUHJvYmVSZXMgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFUDJQUHJvYmVSZXMpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUFRJQ29udHJvbDoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3B0aV9jb250cm9sKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFUFRJQ29udHJvbCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVQVElDb250cm9sKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVBVQnVmZmVyU3RhdHVzOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfcHVfYnVmZmVyX3N0YXR1cygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVBVQnVmZmVyU3RhdHVzICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVBVQnVmZmVyU3RhdHVzKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVBvd2VyQ2FwczoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3Bvd2VyX2NhcHMoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVQb3dlckNhcHMgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFUG93ZXJDYXBzKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVBvd2VyQ29uc3RyYWludHM6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9wb3dlcl9jb25zdHJhaW50cygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFUG93ZXJDb25zdHJhaW50cykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVRQlNTTG9hZDoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3Fic3NfbG9hZCgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVFCU1NMb2FkICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVFCU1NMb2FkKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVFDb21WZW5kb3JJRToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX1FDb21WZW5kb3JJRSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVFDb21WZW5kb3JJRSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVRQ29tVmVuZG9ySUUpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUU9TQ2Fwc0FwOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfcW9zX2NhcHNfYXAoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVRT1NDYXBzQXAgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFUU9TQ2Fwc0FwKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVFPU0NhcHNTdGF0aW9uOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfcW9zX2NhcHNfc3RhdGlvbigKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVFvc01hcFNldDoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3Fvc19tYXBfc2V0KAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFUW9zTWFwU2V0ICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVFvc01hcFNldCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVRdWlldDoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3F1aWV0KAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFUXVpZXQgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFUXVpZXQpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUkNQSUlFOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfcmNwaWllKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFUkNQSUlFICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVJDUElJRSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVSSUNEYXRhRGVzYzoKKwkJCQkJLyogcmVzZXQgdGhlIHBvaW50ZXJzIGJhY2sgc2luY2UgdGhpcyBpcyBhIGNvbnRhaW5lciBJRSBhbmQgaXQgZG9lc250IGhhdmUgaXRzIG93biBFSUQgYW5kIExlbi4gKi8KKwkJCQkJcEJ1ZlJlbWFpbmluZyAtPSAyOworCQkJCQluQnVmUmVtYWluaW5nICs9IDI7CisJCQkJCWlmIChwSWUgJiYgcEllLT5ub3VpKSB7CisJCQkJCQlwQnVmUmVtYWluaW5nIC09IHBJZS0+bm91aTsKKwkJCQkJCW5CdWZSZW1haW5pbmcgKz0gcEllLT5ub3VpOworCQkJCQkJbGVuICs9IHBJZS0+bm91aTsKKwkJCQkJfQorCQkJCQlzdGF0dXMgfD0gZ2V0X2NvbnRhaW5lcl9pZXNfbGVuKHBDdHgsIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4sIElFU19SSUNEYXRhRGVzYyk7CisJCQkJCWlmIChzdGF0dXMgIT0gRE9UMTFGX1BBUlNFX1NVQ0NFU1MgJiYgc3RhdHVzICE9IERPVDExRl9VTktOT1dOX0lFUykKKwkJCQkJCSBicmVhazsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3JpY19kYXRhX2Rlc2MoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVSSUNEYXRhRGVzYyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVSSUNEYXRhRGVzYykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVSU046CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9yc24oCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVSU04gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFUlNOKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVJTTklJRToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3JzbmlpZSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVJTTklJRSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVSU05JSUUpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUlNOT3BhcXVlOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfcnNuX29wYXF1ZSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVJTTk9wYXF1ZSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVSU05PcGFxdWUpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llU3VwcENoYW5uZWxzOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfc3VwcF9jaGFubmVscygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVN1cHBDaGFubmVscyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVTdXBwQ2hhbm5lbHMpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llU3VwcE9wZXJhdGluZ0NsYXNzZXM6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9zdXBwX29wZXJhdGluZ19jbGFzc2VzKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llU3VwcFJhdGVzOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfc3VwcF9yYXRlcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVN1cHBSYXRlcyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVTdXBwUmF0ZXMpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVElNOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfdGltKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFVElNICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVRJTSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVUUENSZXBvcnQ6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV90cGNfcmVwb3J0KAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFVFBDUmVwb3J0ICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVRQQ1JlcG9ydCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVUUENSZXF1ZXN0OgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfdHBjX3JlcXVlc3QoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVUUENSZXF1ZXN0ICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVRQQ1JlcXVlc3QpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVGltZUFkdmVydGlzZW1lbnQ6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV90aW1lX2FkdmVydGlzZW1lbnQoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVUaW1lQWR2ZXJ0aXNlbWVudCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVUaW1lQWR2ZXJ0aXNlbWVudCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVUaW1lb3V0SW50ZXJ2YWw6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV90aW1lb3V0X2ludGVydmFsKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFVGltZW91dEludGVydmFsICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVWSFRFeHRCc3NMb2FkOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfdmh0X2V4dF9ic3NfbG9hZCgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVZIVEV4dEJzc0xvYWQgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFVkhURXh0QnNzTG9hZCkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVWZW5kb3IxSUU6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV92ZW5kb3IxX2llKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFVmVuZG9yMUlFICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVZlbmRvcjFJRSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVWZW5kb3IzSUU6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV92ZW5kb3IzX2llKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFVmVuZG9yM0lFICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVZlbmRvcjNJRSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXQVBJOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd2FwaSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVdBUEkgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFV0FQSSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXQVBJT3BhcXVlOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd2FwaV9vcGFxdWUoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVXQVBJT3BhcXVlICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVdBUElPcGFxdWUpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV0ZBVFBDOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd2ZhdHBjKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFV0ZBVFBDICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVdGQVRQQykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXRkRJRU9wYXF1ZToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3dmZGllX29wYXF1ZSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVdGRElFT3BhcXVlICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVdGRElFT3BhcXVlKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdNTUNhcHM6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV93bW1fY2FwcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVdNTUNhcHMgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFV01NQ2FwcykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXTU1JbmZvQXA6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV93bW1faW5mb19hcCgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVdNTUluZm9BcCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVXTU1JbmZvQXApICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV01NSW5mb1N0YXRpb246CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV93bW1faW5mb19zdGF0aW9uKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFV01NSW5mb1N0YXRpb24gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFV01NSW5mb1N0YXRpb24pICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV01NUGFyYW1zOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd21tX3BhcmFtcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVdNTVBhcmFtcyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVXTU1QYXJhbXMpICoKKwkJCQkJCSAgICBjb3VudE9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV1BBOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd3BhKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFV1BBICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVdQQSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXUEFPcGFxdWU6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV93cGFfb3BhcXVlKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFV1BBT3BhcXVlICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVdQQU9wYXF1ZSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXU0M6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV93c2MoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVXU0MgKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFV1NDKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdzY0Fzc29jUmVxOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd3NjX2Fzc29jX3JlcSgKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVdzY0Fzc29jUmVxICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVdzY0Fzc29jUmVxKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdzY0Fzc29jUmVzOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd3NjX2Fzc29jX3JlcygKKwkJCQkJCSAgICBwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICAgKHREb3QxMWZJRVdzY0Fzc29jUmVzICopCisJCQkJCQkgICAgKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgc2l6ZW9mKHREb3QxMWZJRVdzY0Fzc29jUmVzKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdzY0JlYWNvbjoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3dzY19iZWFjb24oCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVXc2NCZWFjb24gKikKKwkJCQkJCSAgICAocEZybSArIHBJZS0+b2Zmc2V0ICsKKwkJCQkJCSAgICBzaXplb2YodERvdDExZklFV3NjQmVhY29uKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdzY0JlYWNvblByb2JlUmVzOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd3NjX2JlYWNvbl9wcm9iZV9yZXMoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXc2NJRU9wYXF1ZToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3dzY19pZV9vcGFxdWUoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVXc2NJRU9wYXF1ZSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVXc2NJRU9wYXF1ZSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXc2NQcm9iZVJlcToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3dzY19wcm9iZV9yZXEoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVXc2NQcm9iZVJlcSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVXc2NQcm9iZVJlcSkgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXc2NQcm9iZVJlczoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX2llX3dzY19wcm9iZV9yZXMoCisJCQkJCQkgICAgcEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAgICh0RG90MTFmSUVXc2NQcm9iZVJlcyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVXc2NQcm9iZVJlcykgKgorCQkJCQkJICAgIGNvdW50T2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXc2NSZWFzc29jUmVzOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfaWVfd3NjX3JlYXNzb2NfcmVzKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFV3NjUmVhc3NvY1JlcyAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVXc2NSZWFzc29jUmVzKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZWV4dF9jaGFuX3N3aXRjaF9hbm46CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9leHRfY2hhbl9zd2l0Y2hfYW5uKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFZXh0X2NoYW5fc3dpdGNoX2FubiAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVleHRfY2hhbl9zd2l0Y2hfYW5uKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZWh0MjA0MF9ic3NfY29leGlzdGVuY2U6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9odDIwNDBfYnNzX2NvZXhpc3RlbmNlKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVodDIwNDBfYnNzX2NvZXhpc3RlbmNlKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQ6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9odDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0KAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFaHQyMDQwX2Jzc19pbnRvbGVyYW50X3JlcG9ydCAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVodDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0KSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZXNlY19jaGFuX29mZnNldF9lbGU6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV9zZWNfY2hhbl9vZmZzZXRfZWxlKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFc2VjX2NoYW5fb2Zmc2V0X2VsZSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUVzZWNfY2hhbl9vZmZzZXRfZWxlKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZXZlbmRvcjJfaWU6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja19pZV92ZW5kb3IyX2llKAorCQkJCQkJICAgIHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgICAodERvdDExZklFdmVuZG9yMl9pZSAqKQorCQkJCQkJICAgIChwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkJICAgIHNpemVvZih0RG90MTFmSUV2ZW5kb3IyX2llKSAqCisJCQkJCQkgICAgY291bnRPZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJRlJBTUVTX0xPRzEocEN0eCwgRlJMT0dFLCBGUkZMKCJJTlRFUk5BTCBFUlJPUiIKKwkJCQkJCSAgICAgIjogSSBkb24ndCBrbm93IGFib3V0IHRoZSBJRSBzaWduYXR1cmUgJWQiCisJCQkJCQkgICAgICItLSB0aGlzIGlzIG1vc3QgbGlrZWx5IGEgJ2ZyYW1lc2MnIGJ1Zy5cbiIpLAorCQkJCQkJICAgICBwSWUtPnNpZyk7CisJCQkJCUZSQU1FU19EQkdfQlJFQUsoKTsKKwkJCQkJcmV0dXJuIERPVDExRl9JTlRFUk5BTF9FUlJPUjsKKwkJCQl9CisJCQkJaWYgKHBJZS0+YXJyYXlib3VuZCkKKwkJCQkJKCsrKCoodWludDE2X3QgKikocEZybSArIHBJZS0+Y291bnRPZmZzZXQpKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlGUkFNRVNfTE9HMihwQ3R4LCBGUkxPRzMsIEZSRkwoIlNraXBwaW5nIHVua25vd24gSUUgJWQiCisJCQkJICAgICAiIChsZW5ndGggJWQpXG4iKSwgZWlkLCBsZW4pOworCQkJRlJBTUVTX0RVTVAocEN0eCwgRlJMT0czLCBwQnVmUmVtYWluaW5nIC0gMiwgbGVuKTsKKwkJCXN0YXR1cyB8PSBET1QxMUZfVU5LTk9XTl9JRVM7CisJCX0KKworCQlwQnVmUmVtYWluaW5nICs9IGxlbjsKKworCQlpZiAobGVuID4gbkJ1ZlJlbWFpbmluZykgeworCQkJRlJBTUVTX0xPRzAocEN0eCwgRlJMT0dXLCBGUkZMKCJUaGlzIElFIGV4dGVuZHMgcGFzdCAiCisJCQkJICAgICAidGhlIGJ1ZmZlciBhcyBpdCB3YXMgZGVmaW5lZCB0byB1cy4gIFRoaXMgY291bGQiCisJCQkJICAgICAibWVhbiBhIGNvcnJ1cHQgZnJhbWUsIG9yIGp1c3QgYW4gaW5jb3JyZWN0IGxlbmciCisJCQkJICAgICAidGggcGFyYW1ldGVyLlxuIikpOworCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJc3RhdHVzIHw9IERPVDExRl9MQVNUX0lFX1RPT19MT05HOworCQkJZ290byBNYW5kYXRvcnlDaGVjazsKKwkJfQorCisJCW5CdWZSZW1haW5pbmcgLT0gbGVuOworCisJfQorCitNYW5kYXRvcnlDaGVjazoKKwlwSWUgPSAmSUVzWzBdOworCXdoaWxlICgweGZmICE9IHBJZS0+ZWlkKSB7CisJCWlmIChwSWUtPmZNYW5kYXRvcnkpIHsKKwkJCXBmRm91bmQgPSAodEZSQU1FU19CT09MICopKHBGcm0gKyBwSWUtPm9mZnNldCArCisJCQkJCQkgICAgIHBJZS0+cHJlc2VuY2VPZmZzZXQpOworCQkJaWYgKCEqcGZGb3VuZCkgeworCQkJCUZSQU1FU19MT0cxKHBDdHgsIEZSTE9HVywgRlJGTCgiRVJST1I6IFRoZSBtYW5kYXRvIgorCQkJCQkgICAgICJyeSBJRSAlcyB3YXNuJ3Qgc2Vlbi5cbiIpLAorCQkJCQkgICAgIHBJZS0+bmFtZSk7CisJCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJCXN0YXR1cyB8PSBET1QxMUZfTUFOREFUT1JZX0lFX01JU1NJTkc7CisJCQl9CisJCX0KKwkJKytwSWU7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIHVucGFja19jb3JlLiAqLworCitzdGF0aWMgdWludDMyX3QgdW5wYWNrX3Rsdl9jb3JlKHRwQW5pU2lyR2xvYmFsICAgcEN0eCwKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgY29uc3QgdFRMVkRlZm4gVExWc1tdLAorCQkJCSAgdWludDhfdCAqcEZybSwKKwkJCQkgIHNpemVfdCAgICAgICBuRnJtKQoreworCWNvbnN0IHRUTFZEZWZuICpwVGx2OworCXVpbnQzMl90ICAgICAgbkJ1ZlJlbWFpbmluZywgc3RhdHVzLCBucGVjOworCXVpbnQxNl90ICAgICAgaWQsIGxlbjsKKwl1aW50OF90ICAgICAgKnBCdWZSZW1haW5pbmcsICpwZkZvdW5kOworCisJKHZvaWQpcEN0eDsgICAgICAgICAgICAgICAgIC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKwkodm9pZCluRnJtOworCXN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXBCdWZSZW1haW5pbmcgPSBwQnVmOworCW5CdWZSZW1haW5pbmcgPSBuQnVmOworCisJLyogV2hpbGUgd2UgaGF2ZSBkYXRhLi4uICovCisJd2hpbGUgKG5CdWZSZW1haW5pbmcpIHsKKwkJaWYgKDMgPiBuQnVmUmVtYWluaW5nKSB7CisJCQlGUkFNRVNfTE9HMChwQ3R4LCBGUkxPR0UsIEZSRkwoIlRoaXMgZnJhbWUgcmVwb3J0cyAiCisJCQkJICAgICAiZmV3ZXIgdGhyZWUgYnl0ZShzKSByZW1haW5pbmcuXG4iKSk7CisJCQlzdGF0dXMgfD0gRE9UMTFGX0lOQ09NUExFVEVfVExWOworCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJZ290byBNYW5kYXRvcnlDaGVjazsKKwkJfQorCisJCW5wZWMgPSAwVTsKKworCQkvKiBMb29rIGZvciBhIG1hdGNoaW5nIFRMViBkZWZpbml0aW9uLCAqLworCQlwVGx2ID0gZmluZF90bHZfZGVmbihwQ3R4LCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCBUTFZzKTsKKwkJLyogY29uc3VtZSB0aGUgdHlwZSwgKi8KKwkJaWYgKHBUbHYpIHsKKwkJCWlmIChwVGx2LT5zVHlwZSA9PSAyKSB7CisJCQkJZnJhbWVzbnRvaHMocEN0eCwgJmlkLCBwQnVmUmVtYWluaW5nLCBwVGx2LT5mTXNiKTsKKwkJCQlwQnVmUmVtYWluaW5nICs9IDI7CisJCQkJbkJ1ZlJlbWFpbmluZyAtPSAyOworCQkJfSBlbHNlIHsKKwkJCQlpZCA9ICpwQnVmUmVtYWluaW5nOworCQkJCXBCdWZSZW1haW5pbmcgKz0gMTsKKwkJCQluQnVmUmVtYWluaW5nIC09IDE7CisJCQl9CisJCQkvKiAmIGxlbmd0aCwgKi8KKwkJCWlmIChwVGx2LT5zTGVuID09IDIpIHsKKwkJCQlmcmFtZXNudG9ocyhwQ3R4LCAmbGVuLCBwQnVmUmVtYWluaW5nLCBwVGx2LT5mTXNiKTsKKwkJCQlpZiAoMiA+IG5CdWZSZW1haW5pbmcpIHsKKwkJCQkJRlJBTUVTX0xPRzAocEN0eCwgRlJMT0dFLCBGUkZMKCJUaGlzIGZyYW1lIHJlcG9ydHMgIgorCQkJCQkJCSJmZXdlciB0d28gYnl0ZShzKSByZW1haW5pbmcuXG4iKSk7CisJCQkJCXN0YXR1cyB8PSBET1QxMUZfSU5DT01QTEVURV9UTFY7CisJCQkJCUZSQU1FU19EQkdfQlJFQUsoKTsKKwkJCQkJZ290byBNYW5kYXRvcnlDaGVjazsKKwkJCX0KKwkJCXBCdWZSZW1haW5pbmcgKz0gMjsKKwkJCW5CdWZSZW1haW5pbmcgLT0gMjsKKwkJCX0gZWxzZSB7CisJCQkJbGVuID0gKnBCdWZSZW1haW5pbmc7CisJCQkJcEJ1ZlJlbWFpbmluZyArPSAxOworCQkJCW5CdWZSZW1haW5pbmcgLT0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBCdWZSZW1haW5pbmcgKz0gVExWc1swXS5zVHlwZTsKKwkJCW5CdWZSZW1haW5pbmcgLT0gVExWc1swXS5zVHlwZTsKKwkJCWZyYW1lc250b2hzKHBDdHgsICZsZW4sIHBCdWZSZW1haW5pbmcsIChUTFZzWzBdLnNUeXBlID09IDIpKTsKKwkJCWlmICgyID4gbkJ1ZlJlbWFpbmluZykgeworCQkJCUZSQU1FU19MT0cwKHBDdHgsIEZSTE9HRSwgRlJGTCgiVGhpcyBmcmFtZSByZXBvcnRzICIKKwkJCQkJICAgICAiZmV3ZXIgdHdvIGJ5dGUocykgcmVtYWluaW5nLlxuIikpOworCQkJCXN0YXR1cyB8PSBET1QxMUZfSU5DT01QTEVURV9UTFY7CisJCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJCWdvdG8gTWFuZGF0b3J5Q2hlY2s7CisJCQl9CisJCQlwQnVmUmVtYWluaW5nICs9IDI7CisJCQluQnVmUmVtYWluaW5nIC09IDI7CisJCX0KKworCQlpZiAocFRsdiAmJiBwVGx2LT5wZWMpIHsKKwkJbnBlYyA9IDNVOworCQkJaWYgKDMgPiBuQnVmUmVtYWluaW5nKSB7CisJCQkJRlJBTUVTX0xPRzIocEN0eCwgRlJMT0dXLCBGUkZMKCJUTFYgJWQgcmVwb3J0cyBsZW5ndGgiCisJCQkJICAgICIlZCwgYnV0IGl0IGhhcyBhIFByaXZhdGUgRW50ZXJwcmlzZSBDb2RlICgzIGJ5dGUiCisJCQkJICAgICJzLlxuIiksIGlkLCBsZW4pOworCQkJCUZSQU1FU19EVU1QKHBDdHgsIEZSTE9HMSwgcEJ1ZiwgbkJ1Zik7CisJCQkJRlJBTUVTX0xPRzIocEN0eCwgRlJMT0cxLCBGUkZMKCJXZSd2ZSBwYXJzZWQgJWQgYnl0ZXMiCisJCQkJICAgICJvZiB0aGlzIGJ1ZmZlciwgYW5kIHNob3cgJWQgbGVmdC5cbiIpLAorCQkJCXBCdWZSZW1haW5pbmcgLSBwQnVmLCBuQnVmUmVtYWluaW5nKTsKKwkJCQlzdGF0dXMgfD0gRE9UMTFGX0lOQ09NUExFVEVfVExWOworCQkJCUZSQU1FU19EQkdfQlJFQUsoKTsKKwkJCQlnb3RvIE1hbmRhdG9yeUNoZWNrOworCQkJfQorCQlwQnVmUmVtYWluaW5nICs9IDM7CisJCW5CdWZSZW1haW5pbmcgLT0gMzsKKwkJbGVuICAgICAgICAgICAtPSAzOworCQl9CisKKwkJLyogV2hldGhlciB3ZSBmb3VuZCBhIGhpdCBvciBub3QsIHdlIGNhbiB2YWxpZGF0ZSB0aGUgcmVwb3J0ZWQgKi8KKwkJLyogbGVuZ3RoIG9mIHRoaXMgVExWOiAqLworCQlpZiAobGVuID4gbkJ1ZlJlbWFpbmluZykgeworCQkJRlJBTUVTX0xPRzMocEN0eCwgRlJMT0dXLCBGUkZMKCJUTFYgJWQgcmVwb3J0cyBsZW5ndGggJSIKKwkJCSAgICAiZCwgYnV0IHRoZXJlIGFyZSBvbmx5ICVkIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGlzIGYiCisJCQkgICAgInJhbWUuXG4iKSwgaWQsIGxlbiwgbkJ1ZlJlbWFpbmluZyk7CisJCQlGUkFNRVNfRFVNUChwQ3R4LCBGUkxPRzEsIHBCdWYsIG5CdWYpOworCQkJRlJBTUVTX0xPRzIocEN0eCwgRlJMT0cxLCBGUkZMKCJXZSd2ZSBwYXJzZWQgJWQgYnl0ZXMiCisJCQkgICAgIiBvZiB0aGlzIGJ1ZmZlciwgYW5kIHNob3cgJWQgbGVmdC5cbiIpLAorCQkJICAgIHBCdWZSZW1haW5pbmcgLSBwQnVmLCBuQnVmUmVtYWluaW5nKTsKKwkJCXN0YXR1cyB8PSBET1QxMUZfSU5DT01QTEVURV9UTFY7CisJCQlGUkFNRVNfREJHX0JSRUFLKCk7CisJCQlnb3RvIE1hbmRhdG9yeUNoZWNrOworCQl9CisKKwkJLyogTm93LCAqaWYqIHdlIGZvdW5kIGEgaGl0Li4uICovCisJCWlmIChwVGx2KSB7CisJCQlpZiAobGVuIDwgcFRsdi0+bWluU2l6ZSAtIG5wZWMpIHsKKwkJCQlGUkFNRVNfTE9HMyhwQ3R4LCBGUkxPR1csIEZSRkwoIlRoZSBJRSAlcyBtdXN0IGJlICIKKwkJCQkgICAgImF0IGxlYXN0ICVkIGJ5dGVzIGluIHNpemUsIGJ1dCB0aGUgc2l6ZSBpcyBvbmx5ICIKKwkJCQkgICAgIiVkIGJ5dGVzLlxuIiksCisJCQkJICAgICBwVGx2LT5uYW1lLCBwVGx2LT5taW5TaXplLCBsZW4pOworCQkJCUZSQU1FU19EVU1QKHBDdHgsIEZSTE9HMSwgcEJ1ZiwgbkJ1Zik7CisJCQkJc3RhdHVzIHw9IERPVDExRl9JTkNPTVBMRVRFX1RMVjsKKwkJCQlGUkFNRVNfREJHX0JSRUFLKCk7CisJCQkJZ290byBNYW5kYXRvcnlDaGVjazsKKwkJCX0KKwkJCWlmIChuQnVmUmVtYWluaW5nIDwgcFRsdi0+bWluU2l6ZSAtIG5wZWMgLSAocFRsdi0+c1R5cGUgKyBwVGx2LT5zTGVuKSkgeworCQkJCUZSQU1FU19MT0czKHBDdHgsIEZSTE9HVywgRlJGTCgiVGhlIElFICVzIG11c3QgYmUgIgorCQkJCSAgICAiYXQgbGVhc3QgJWQgYnl0ZXMgaW4gc2l6ZSwgYnV0IHRoZXJlIGFyZSBvbmx5ICIKKwkJCQkgICAgIiVkIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGlzIGZyYW1lLlxuIiksCisJCQkJICAgICBwVGx2LT5uYW1lLCBwVGx2LT5taW5TaXplLCBuQnVmUmVtYWluaW5nKTsKKwkJCQlGUkFNRVNfRFVNUChwQ3R4LCBGUkxPRzEsIHBCdWYsIG5CdWYpOworCQkJCXN0YXR1cyB8PSBET1QxMUZfSU5DT01QTEVURV9UTFY7CisJCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJCWdvdG8gTWFuZGF0b3J5Q2hlY2s7CisJCQl9IGVsc2UgaWYgKGxlbiA+IHBUbHYtPm1heFNpemUgLSBucGVjIC0gKHBUbHYtPnNUeXBlICsgcFRsdi0+c0xlbikpIHsKKwkJCQlGUkFNRVNfTE9HMShwQ3R4LCBGUkxPR1csIEZSRkwoIlRoZSBUTFYgJXMgcmVwb3J0cyAiCisJCQkJICAgICJhbiBpbGxlZ2FsbHkgbGFyZ2Ugc2l6ZTsgdGhpcyBUTFYgaXMgcHJlc3VtYWJseSIKKwkJCQkgICAgImNvcnJ1cHQgb3Igb3RoZXJ3aXNlIGludmFsaWQgJiB3aWxsIGJlIHNraXBwZWQgIgorCQkJCSAgICAiaXBwZWQuXG4iKSwgcFRsdi0+bmFtZSk7CisJCQkJRlJBTUVTX0RVTVAocEN0eCwgRlJMT0cxLCBwQnVmLCBuQnVmKTsKKwkJCQlGUkFNRVNfTE9HMihwQ3R4LCBGUkxPRzEsIEZSRkwoIldlJ3ZlIHBhcnNlZCAlZCBieSIKKwkJCQkgICAgInRlcyBvZiB0aGlzIGJ1ZmZlciwgYW5kIHNob3cgJWQgbGVmdC5cbiIpLAorCQkJCSAgICBwQnVmUmVtYWluaW5nIC0gcEJ1ZiwgbkJ1ZlJlbWFpbmluZyk7CisJCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJCXN0YXR1cyB8PSBET1QxMUZfU0tJUFBFRF9CQURfVExWOworCQkJfSBlbHNlIHsKKwkJCQlzd2l0Y2ggKHBUbHYtPnNpZykgeworCQkJCWNhc2UgU2lnVGx2QXV0aG9yaXplZE1BQ3M6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfYXV0aG9yaXplZF9tYV9jcyhwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdUbHZSZXF1ZXN0VG9FbnJvbGw6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfY29tbW9uX2Z1bmMocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodWludDhfdCAqKSYoKCh0RG90MTFmVExWUmVxdWVzdFRvRW5yb2xsICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQpLAorCQkJCQkJICAodWludDhfdCAqKSYoKCh0RG90MTFmVExWUmVxdWVzdFRvRW5yb2xsICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnJlcSkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdlZlcnNpb24yOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X3ZlcnNpb24yKHBDdHgsCisJCQkJCQkgIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgKHREb3QxMWZUTFZWZXJzaW9uMiAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdkFQU2V0dXBMb2NrZWQ6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfY29tbW9uX2Z1bmMocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodWludDhfdCAqKSYoKCh0RG90MTFmVExWQVBTZXR1cExvY2tlZCAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50KSwKKwkJCQkJCSAgKHVpbnQ4X3QgKikmKCgodERvdDExZlRMVkFQU2V0dXBMb2NrZWQgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+ZkxvY2tlZCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdkFzc29jaWF0aW9uU3RhdGU6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfY29tbW9uX2Z1bmMyKHBDdHgsCisJCQkJCQkgIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgKHVpbnQ4X3QgKikmKCgodERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudCksCisJCQkJCQkgICh1aW50MTZfdCAqKSYoKCh0RG90MTFmVExWQXNzb2NpYXRpb25TdGF0ZSAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5zdGF0ZSkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdkNvbmZpZ01ldGhvZHM6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfY29tbW9uX2Z1bmMyKHBDdHgsCisJCQkJCQkgIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgKHVpbnQ4X3QgKikmKCgodERvdDExZlRMVkNvbmZpZ01ldGhvZHMgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudCksCisJCQkJCQkgICh1aW50MTZfdCAqKSYoKCh0RG90MTFmVExWQ29uZmlnTWV0aG9kcyAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5tZXRob2RzKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnVGx2Q29uZmlndXJhdGlvbkVycm9yOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X2NvbW1vbl9mdW5jMihwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh1aW50OF90ICopJigoKHREb3QxMWZUTFZDb25maWd1cmF0aW9uRXJyb3IgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudCksCisJCQkJCQkgICh1aW50MTZfdCAqKSYoKCh0RG90MTFmVExWQ29uZmlndXJhdGlvbkVycm9yICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPmVycm9yKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnVGx2RGV2aWNlTmFtZToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX3Rsdl9kZXZpY2VfbmFtZShwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWRGV2aWNlTmFtZSAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdkRldmljZVBhc3N3b3JkSUQ6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfY29tbW9uX2Z1bmMyKHBDdHgsCisJCQkJCQkgIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgKHVpbnQ4X3QgKikmKCgodERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudCksCisJCQkJCQkgICh1aW50MTZfdCAqKSYoKCh0RG90MTFmVExWRGV2aWNlUGFzc3dvcmRJRCAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5pZCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X2V4dGVuZGVkX2xpc3Rlbl90aW1pbmcocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnVGx2TGlzdGVuQ2hhbm5lbDoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX3Rsdl9saXN0ZW5fY2hhbm5lbChwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWTGlzdGVuQ2hhbm5lbCAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1Rsdk1hbnVmYWN0dXJlcjoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX3Rsdl9tYW51ZmFjdHVyZXIocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodERvdDExZlRMVk1hbnVmYWN0dXJlciAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1Rsdk1pbm9yUmVhc29uQ29kZToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX3Rsdl9jb21tb25fZnVuYyhwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh1aW50OF90ICopJigoKHREb3QxMWZUTFZNaW5vclJlYXNvbkNvZGUgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudCksCisJCQkJCQkgICh1aW50OF90ICopJigoKHREb3QxMWZUTFZNaW5vclJlYXNvbkNvZGUgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+bWlub3JSZWFzb25Db2RlKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnVGx2TW9kZWxOYW1lOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X21vZGVsX25hbWUocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodERvdDExZlRMVk1vZGVsTmFtZSAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1Rsdk1vZGVsTnVtYmVyOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X21vZGVsX251bWJlcihwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWTW9kZWxOdW1iZXIgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdUbHZOb3RpY2VPZkFic2VuY2U6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfbm90aWNlX29mX2Fic2VuY2UocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1Rsdk9wZXJhdGluZ0NoYW5uZWw6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfb3BlcmF0aW5nX2NoYW5uZWwocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdUbHZQMlBDYXBhYmlsaXR5OgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X3AyX3BfY2FwYWJpbGl0eShwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdlAyUERldmljZUlkOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X3AyX3BfZGV2aWNlX2lkKHBDdHgsCisJCQkJCQkgIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgKHREb3QxMWZUTFZQMlBEZXZpY2VJZCAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdlAyUERldmljZUluZm86CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfcDJfcF9kZXZpY2VfaW5mbyhwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWUDJQRGV2aWNlSW5mbyAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdlAyUEdyb3VwSW5mbzoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX3Rsdl9wMl9wX2dyb3VwX2luZm8ocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodERvdDExZlRMVlAyUEdyb3VwSW5mbyAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdlAyUFN0YXR1czoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX3Rsdl9jb21tb25fZnVuYyhwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh1aW50OF90ICopJigoKHREb3QxMWZUTFZQMlBTdGF0dXMgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudCksCisJCQkJCQkgICh1aW50OF90ICopJigoKHREb3QxMWZUTFZQMlBTdGF0dXMgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+c3RhdHVzKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnVGx2UHJpbWFyeURldmljZVR5cGU6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfcHJpbWFyeV9kZXZpY2VfdHlwZShwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGUgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdUbHZSRkJhbmRzOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X2NvbW1vbl9mdW5jKHBDdHgsCisJCQkJCQkgIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgKHVpbnQ4X3QgKikmKCgodERvdDExZlRMVlJGQmFuZHMgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudCksCisJCQkJCQkgICh1aW50OF90ICopJigoKHREb3QxMWZUTFZSRkJhbmRzICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPmJhbmRzKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnVGx2UmVxdWVzdERldmljZVR5cGU6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfcmVxdWVzdF9kZXZpY2VfdHlwZShwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdUbHZSZXF1ZXN0VHlwZToKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX3Rsdl9jb21tb25fZnVuYyhwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh1aW50OF90ICopJigoKHREb3QxMWZUTFZSZXF1ZXN0VHlwZSAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50KSwKKwkJCQkJCSAgKHVpbnQ4X3QgKikmKCgodERvdDExZlRMVlJlcXVlc3RUeXBlICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnJlcVR5cGUpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdUbHZSZXNwb25zZVR5cGU6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfY29tbW9uX2Z1bmMocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodWludDhfdCAqKSYoKCh0RG90MTFmVExWUmVzcG9uc2VUeXBlICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQpLAorCQkJCQkJICAodWludDhfdCAqKSYoKCh0RG90MTFmVExWUmVzcG9uc2VUeXBlICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnJlc1R5cGUpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdUbHZTZWxlY3RlZFJlZ2lzdHJhcjoKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfdW5wYWNrX3Rsdl9jb21tb25fZnVuYyhwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh1aW50OF90ICopJigoKHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhciAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50KSwKKwkJCQkJCSAgKHVpbnQ4X3QgKikmKCgodERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnNlbGVjdGVkKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X2NvbW1vbl9mdW5jMihwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh1aW50OF90ICopJigoKHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudCksCisJCQkJCQkgICh1aW50MTZfdCAqKSYoKCh0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPm1ldGhvZHMpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdUbHZTZXJpYWxOdW1iZXI6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfc2VyaWFsX251bWJlcihwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWU2VyaWFsTnVtYmVyICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnVGx2VVVJRF9FOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X3V1aWRfZShwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWVVVJRF9FICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnVGx2VVVJRF9SOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X3V1aWRfcihwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWVVVJRF9SICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnVGx2VmVuZG9yRXh0ZW5zaW9uOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X3ZlbmRvcl9leHRlbnNpb24ocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdlZlcnNpb246CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfdmVyc2lvbihwQ3R4LAorCQkJCQkJICBwQnVmUmVtYWluaW5nLCBsZW4sCisJCQkJCQkgICh0RG90MTFmVExWVmVyc2lvbiAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdldQU1N0YXRlOgorCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl91bnBhY2tfdGx2X2NvbW1vbl9mdW5jKHBDdHgsCisJCQkJCQkgIHBCdWZSZW1haW5pbmcsIGxlbiwKKwkJCQkJCSAgKHVpbnQ4X3QgKikmKCgodERvdDExZlRMVldQU1N0YXRlICopCisJCQkJCQkgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQpLAorCQkJCQkJICAodWludDhfdCAqKSYoKCh0RG90MTFmVExWV1BTU3RhdGUgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+c3RhdGUpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdUbHZQMlBJbnRlcmZhY2U6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfcDJfcF9pbnRlcmZhY2UocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodERvdDExZlRMVlAyUEludGVyZmFjZSAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ1RsdlAyUE1hbmFnZWFiaWxpdHk6CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX3VucGFja190bHZfY29tbW9uX2Z1bmMocEN0eCwKKwkJCQkJCSAgcEJ1ZlJlbWFpbmluZywgbGVuLAorCQkJCQkJICAodWludDhfdCAqKSYoKCh0RG90MTFmVExWUDJQTWFuYWdlYWJpbGl0eSAqKQorCQkJCQkJICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50KSwKKwkJCQkJCSAgKHVpbnQ4X3QgKikmKCgodERvdDExZlRMVlAyUE1hbmFnZWFiaWxpdHkgKikKKwkJCQkJCSAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+bWFuYWdlYWJpbGl0eSkpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlGUkFNRVNfTE9HMShwQ3R4LCBGUkxPR0UsIEZSRkwoIklOVEVSTkFMIEVSUk9SOiBJIgorCQkJCQkgICAgIiBkb24ndCBrbm93IGFib3V0IHRoZSBUTFYgc2lnbmF0dXJlICVkLS0gdGhpIgorCQkJCQkgICAgInMgaXMgbW9zdCBsaWtlbHkgYSAnZnJhbWVzYycgYnVnLlxuIiksCisJCQkJCSAgICBwVGx2LT5zaWcpOworCQkJCQlGUkFNRVNfREJHX0JSRUFLKCk7CisJCQkJCXJldHVybiBET1QxMUZfSU5URVJOQUxfRVJST1I7CisJCQkJfSAvKiBFbmQgc3dpdGNoIG9uIHNpZy4gKi8KKwkJCX0gLyogRW5kIGlmIG9uIGxlbmd0aCBjaGVjay4gKi8KKworCQl9IGVsc2UgeworCQkJRlJBTUVTX0xPRzIocEN0eCwgRlJMT0czLCBGUkZMKCJTa2lwcGluZyB1bmtub3duIFRMViAlZCAoIgorCQkJICAgICJsZW5ndGggJWQpXG4iKSwgaWQsIGxlbik7CisJCQlGUkFNRVNfRFVNUChwQ3R4LCBGUkxPRzMsIHBCdWZSZW1haW5pbmcgLSAocFRsdi0+c1R5cGUgKyBwVGx2LT5zTGVuKSwgbGVuKTsKKwkJCXN0YXR1cyB8PSBET1QxMUZfVU5LTk9XTl9UTFZTOworCQl9CisKKwkJLyogQWR2YW5jZSB0byB0aGUgbmV4dCBUTFYgKi8KKwkJcEJ1ZlJlbWFpbmluZyArPSBsZW47CisKKwkJaWYgKGxlbiA+IG5CdWZSZW1haW5pbmcpIHsKKwkJCUZSQU1FU19MT0cwKHBDdHgsIEZSTE9HVywgRlJGTCgiVGhpcyBUTFYgZXh0ZW5kcyBwYXN0IHRoIgorCQkJICAgICJlIGJ1ZmZlciBhcyBpdCB3YXMgZGVmaW5lZCB0byB1cy4gIFRoaXMgY291bGQgbWVhbiAiCisJCQkgICAgImEgY29ycnVwdCBmcmFtZSwgb3IganVzdCBhbiBpbmNvcnJlY3QgbGVuZ3RoIHBhcmFtZSIKKwkJCSAgICAidGVyLlxuIikpOworCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJc3RhdHVzIHw9IERPVDExRl9MQVNUX1RMVl9UT09fTE9ORzsKKwkJCWdvdG8gTWFuZGF0b3J5Q2hlY2s7CisJCX0KKworCQluQnVmUmVtYWluaW5nIC09IGxlbjsKKworCX0gLyogRW5kIGl0ZXJhdGlvbiBvdmVyIFRMVnMuKi8KKworTWFuZGF0b3J5Q2hlY2s6CisJcFRsdiA9ICZUTFZzWzBdOworCXdoaWxlICgweGZmZmYgIT0gcFRsdi0+aWQpIHsKKwkJaWYgKHBUbHYtPmZNYW5kYXRvcnkpIHsKKwkJCXBmRm91bmQgPSAodWludDhfdCAqKShwRnJtICsgcFRsdi0+b2Zmc2V0ICsKKwkJCQkJICAgICBwVGx2LT5wcmVzZW5jZU9mZnNldCk7CisJCQlpZiAoISpwZkZvdW5kKSB7CisJCQkJRlJBTUVTX0xPRzEocEN0eCwgRlJMT0dXLCBGUkZMKCJFUlJPUjogVGhlIG1hbmRhdG9yeSAiCisJCQkJICAgICJUTFYgJXMgd2Fzbid0IHNlZW4uXG4iKSwKKwkJCQkgICAgcFRsdi0+bmFtZSk7CisJCQkJRlJBTUVTX0RCR19CUkVBSygpOworCQkJCXN0YXR1cyB8PSBET1QxMUZfTUFOREFUT1JZX1RMVl9NSVNTSU5HOworCQkJfQorCisJCX0KKwkJKytwVGx2OworCX0KKworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBVbnBhY1RsdmtDb3JlLiAqLwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWV0Y2xhcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRVRDTEFTICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJKnBuTmVlZGVkICs9IDE7CisJCSpwbk5lZWRlZCArPSAxOworCQkqcG5OZWVkZWQgKz0gMTsKKwkJc3dpdGNoIChwSWUtPmNsYXNzaWZpZXJfdHlwZSkgeworCQljYXNlIDA6CisJCQkqcG5OZWVkZWQgKz0gNjsKKwkJCSpwbk5lZWRlZCArPSA2OworCQkJKnBuTmVlZGVkICs9IDI7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJKnBuTmVlZGVkICs9IDE7CisJCQlzd2l0Y2ggKHBJZS0+aW5mby5JcFBhcmFtcy52ZXJzaW9uKSB7CisJCQljYXNlIDQ6CisJCQkJKnBuTmVlZGVkICs9IDQ7CisJCQkJKnBuTmVlZGVkICs9IDQ7CisJCQkJKnBuTmVlZGVkICs9IDI7CisJCQkJKnBuTmVlZGVkICs9IDI7CisJCQkJKnBuTmVlZGVkICs9IDE7CisJCQkJKnBuTmVlZGVkICs9IDE7CisJCQkJKnBuTmVlZGVkICs9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJKnBuTmVlZGVkICs9IDE2OworCQkJCSpwbk5lZWRlZCArPSAxNjsKKwkJCQkqcG5OZWVkZWQgKz0gMjsKKwkJCQkqcG5OZWVkZWQgKz0gMjsKKwkJCQkqcG5OZWVkZWQgKz0gMzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkqcG5OZWVkZWQgKz0gMjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWV0Y2xhcy4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWV3bW10Y2xhcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRVdNTVRDTEFTICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJKnBuTmVlZGVkICs9IDE7CisJCSpwbk5lZWRlZCArPSAxOworCQkqcG5OZWVkZWQgKz0gMTsKKwkJKnBuTmVlZGVkICs9IDE7CisJCXN3aXRjaCAocEllLT5jbGFzc2lmaWVyX3R5cGUpIHsKKwkJY2FzZSAwOgorCQkJKnBuTmVlZGVkICs9IDY7CisJCQkqcG5OZWVkZWQgKz0gNjsKKwkJCSpwbk5lZWRlZCArPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCSpwbk5lZWRlZCArPSAxOworCQkJc3dpdGNoIChwSWUtPmluZm8uSXBQYXJhbXMudmVyc2lvbikgeworCQkJY2FzZSA0OgorCQkJCSpwbk5lZWRlZCArPSA0OworCQkJCSpwbk5lZWRlZCArPSA0OworCQkJCSpwbk5lZWRlZCArPSAyOworCQkJCSpwbk5lZWRlZCArPSAyOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCSpwbk5lZWRlZCArPSAxNjsKKwkJCQkqcG5OZWVkZWQgKz0gMTY7CisJCQkJKnBuTmVlZGVkICs9IDI7CisJCQkJKnBuTmVlZGVkICs9IDI7CisJCQkJKnBuTmVlZGVkICs9IDM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJKnBuTmVlZGVkICs9IDI7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2lld21tdGNsYXMuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX2NoYW5uZWxfc3dpdGNoX3dyYXBwZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVDaGFubmVsU3dpdGNoV3JhcHBlciAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlJRVNfQ2hhbm5lbFN3aXRjaFdyYXBwZXIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2llX2NoYW5uZWxfc3dpdGNoX3dyYXBwZXIuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX2NvdW50cnkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVDb3VudHJ5ICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJKnBuTmVlZGVkICs9IDM7CisJCWlmIChwSWUtPm51bV90cmlwbGV0cykgeworCQkJKnBuTmVlZGVkICs9IChwSWUtPm51bV90cmlwbGV0cyAqIDMpOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9jb3VudHJ5LiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZWZ0X2luZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVGVEluZm8gKnBJZSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBDdHg7CisJd2hpbGUgKHBJZS0+cHJlc2VudCkgeworCQkqcG5OZWVkZWQgKz0gMjsKKwkJKnBuTmVlZGVkICs9IDE2OworCQkqcG5OZWVkZWQgKz0gMzI7CisJCSpwbk5lZWRlZCArPSAzMjsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwSWUsIHBuTmVlZGVkLAorCQkJCUlFU19GVEluZm8pOworCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2llZnRfaW5mby4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfbWVhc3VyZW1lbnRfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgKnBJZSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBDdHg7CisJd2hpbGUgKHBJZS0+cHJlc2VudCkgeworCQkqcG5OZWVkZWQgKz0gMTsKKwkJKnBuTmVlZGVkICs9IDE7CisJCSpwbk5lZWRlZCArPSAxOworCQlpZiAocEllLT50eXBlKSB7CisJCQlzd2l0Y2ggKHBJZS0+dHlwZSkgeworCQkJY2FzZSAwOgorCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSA4OworCQkJCSpwbk5lZWRlZCArPSAyOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSA4OworCQkJCSpwbk5lZWRlZCArPSAyOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSA4OworCQkJCSpwbk5lZWRlZCArPSAyOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSA4OworCQkJCSpwbk5lZWRlZCArPSAyOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSA2OworCQkJCSpwbk5lZWRlZCArPSAxOworCQkJCSpwbk5lZWRlZCArPSA0OworCQkJCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwgSUVTX3JlcG9ydEJlYWNvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2llX21lYXN1cmVtZW50X3JlcG9ydC4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfbWVhc3VyZW1lbnRfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCSpwbk5lZWRlZCArPSAxOworCQkqcG5OZWVkZWQgKz0gMTsKKwkJKnBuTmVlZGVkICs9IDE7CisJCXN3aXRjaCAocEllLT5tZWFzdXJlbWVudF90eXBlKSB7CisJCWNhc2UgMDoKKwkJCSpwbk5lZWRlZCArPSAxOworCQkJKnBuTmVlZGVkICs9IDg7CisJCQkqcG5OZWVkZWQgKz0gMjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkqcG5OZWVkZWQgKz0gMTsKKwkJCSpwbk5lZWRlZCArPSA4OworCQkJKnBuTmVlZGVkICs9IDI7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJKnBuTmVlZGVkICs9IDE7CisJCQkqcG5OZWVkZWQgKz0gODsKKwkJCSpwbk5lZWRlZCArPSAyOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCSpwbk5lZWRlZCArPSAxOworCQkJKnBuTmVlZGVkICs9IDE7CisJCQkqcG5OZWVkZWQgKz0gMjsKKwkJCSpwbk5lZWRlZCArPSAyOworCQkJKnBuTmVlZGVkICs9IDE7CisJCQkqcG5OZWVkZWQgKz0gNjsKKwkJCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwgSUVTX21lYXN1cmVtZW50X3JlcXVlc3RCZWFjb24pOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9tZWFzdXJlbWVudF9yZXF1ZXN0LiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9uZWlnaGJvcl9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVOZWlnaGJvclJlcG9ydCAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCSpwbk5lZWRlZCArPSA2OworCQkqcG5OZWVkZWQgKz0gMTsKKwkJKnBuTmVlZGVkICs9IDE7CisJCSpwbk5lZWRlZCArPSAyOworCQkqcG5OZWVkZWQgKz0gMTsKKwkJKnBuTmVlZGVkICs9IDE7CisJCSpwbk5lZWRlZCArPSAxOworCQlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBJZSwgcG5OZWVkZWQsCisJCQkJSUVTX05laWdoYm9yUmVwb3J0KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9uZWlnaGJvcl9yZXBvcnQuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9hc3NvY19yZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVQMlBBc3NvY1JlcSAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV90bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBJZSwgcG5OZWVkZWQsCisJCQkJVExWU19QMlBBc3NvY1JlcSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX2Fzc29jX3JlcS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX2Fzc29jX3Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRVAyUEFzc29jUmVzICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlUTFZTX1AyUEFzc29jUmVzKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfYXNzb2NfcmVzLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfYmVhY29uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZklFUDJQQmVhY29uICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlUTFZTX1AyUEJlYWNvbik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX2JlYWNvbi4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX2JlYWNvbl9wcm9iZV9yZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcyAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV90bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBJZSwgcG5OZWVkZWQsCisJCQkJVExWU19QMlBCZWFjb25Qcm9iZVJlcyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX2JlYWNvbl9wcm9iZV9yZXMuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9kZV9hdXRoKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZklFUDJQRGVBdXRoICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlUTFZTX1AyUERlQXV0aCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX2RlX2F1dGguICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9kaXNfYXNzb2ModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVQMlBEaXNBc3NvYyAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV90bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBJZSwgcG5OZWVkZWQsCisJCQkJVExWU19QMlBEaXNBc3NvYyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX2Rpc19hc3NvYy4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVwMl9wX3Byb2JlX3JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRVAyUFByb2JlUmVxICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlUTFZTX1AyUFByb2JlUmVxKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfcHJvYmVfcmVxLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfcHJvYmVfcmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZklFUDJQUHJvYmVSZXMgKnBJZSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBDdHg7CisJd2hpbGUgKHBJZS0+cHJlc2VudCkgeworCQlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfdGx2X2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwSWUsIHBuTmVlZGVkLAorCQkJCVRMVlNfUDJQUHJvYmVSZXMpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9wcm9iZV9yZXMuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llcmljX2RhdGFfZGVzYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRVJJQ0RhdGFEZXNjICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwSWUsIHBuTmVlZGVkLAorCQkJCUlFU19SSUNEYXRhRGVzYyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVyaWNfZGF0YV9kZXNjLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXJzbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRVJTTiAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCSpwbk5lZWRlZCArPSAyOworCQkqcG5OZWVkZWQgKz0gNDsKKwkJaWYgKHBJZS0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50KSB7CisJCQkqcG5OZWVkZWQgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCSpwbk5lZWRlZCArPSAocEllLT5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKiA0KTsKKwkJaWYgKHBJZS0+YWttX3N1aXRlX2NvdW50KSB7CisJCQkqcG5OZWVkZWQgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCSpwbk5lZWRlZCArPSAocEllLT5ha21fc3VpdGVfY291bnQgKiA0KTsKKwkJaWYgKHBJZS0+UlNOX0NhcCkgeworCQkJKnBuTmVlZGVkICs9IDI7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAocEllLT5wbWtpZF9jb3VudCkgeworCQkJKnBuTmVlZGVkICs9IDI7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQkqcG5OZWVkZWQgKz0gKHBJZS0+cG1raWRfY291bnQgKiAxNik7CisJCWlmIChwSWUtPmdwX21nbXRfY2lwaGVyX3N1aXRlKSB7CisJCQkqcG5OZWVkZWQgKz0gNDsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVyc24uICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2lld2FwaSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRVdBUEkgKnBJZSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBDdHg7CisJd2hpbGUgKHBJZS0+cHJlc2VudCkgeworCQkqcG5OZWVkZWQgKz0gMjsKKwkJKnBuTmVlZGVkICs9IDI7CisJCSpwbk5lZWRlZCArPSAocEllLT5ha21fc3VpdGVfY291bnQgKiA0KTsKKwkJKnBuTmVlZGVkICs9IDI7CisJCSpwbk5lZWRlZCArPSAocEllLT51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQpOworCQkqcG5OZWVkZWQgKz0gNDsKKwkJKnBuTmVlZGVkICs9IDI7CisJCWlmIChwSWUtPmJraWRfY291bnQpIHsKKwkJCSpwbk5lZWRlZCArPSAyOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwkJKnBuTmVlZGVkICs9IChwSWUtPmJraWRfY291bnQgKiAxNik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWV3YXBpLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZXdwYSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRVdQQSAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCSpwbk5lZWRlZCArPSAyOworCQlpZiAocEllLT5tdWx0aWNhc3RfY2lwaGVyX3ByZXNlbnQpIHsKKworCQkJKnBuTmVlZGVkICs9IDQ7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAocEllLT51bmljYXN0X2NpcGhlcl9jb3VudCkgeworCQkJKnBuTmVlZGVkICs9IDI7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQkqcG5OZWVkZWQgKz0gKHBJZS0+dW5pY2FzdF9jaXBoZXJfY291bnQgKiA0KTsKKwkJaWYgKHBJZS0+YXV0aF9zdWl0ZV9jb3VudCkgeworCQkJKnBuTmVlZGVkICs9IDI7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQkqcG5OZWVkZWQgKz0gKHBJZS0+YXV0aF9zdWl0ZV9jb3VudCAqIDQpOworCQlpZiAocEllLT5jYXBzKSB7CisJCQkqcG5OZWVkZWQgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWV3cGEuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2lld3NjKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZklFV1NDICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlUTFZTX1dTQyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWV3c2MuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX3dzY19hc3NvY19yZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVXc2NBc3NvY1JlcSAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV90bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBJZSwgcG5OZWVkZWQsCisJCQkJVExWU19Xc2NBc3NvY1JlcSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX2Fzc29jX3JlcS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX2Fzc29jX3Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRVdzY0Fzc29jUmVzICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlUTFZTX1dzY0Fzc29jUmVzKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV93c2NfYXNzb2NfcmVzLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV93c2NfYmVhY29uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZklFV3NjQmVhY29uICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlUTFZTX1dzY0JlYWNvbik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX2JlYWNvbi4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX2JlYWNvbl9wcm9iZV9yZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcyAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV90bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBJZSwgcG5OZWVkZWQsCisJCQkJVExWU19Xc2NCZWFjb25Qcm9iZVJlcyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX2JlYWNvbl9wcm9iZV9yZXMuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2llX3dzY19wcm9iZV9yZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVXc2NQcm9iZVJlcSAqcEllLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJKHZvaWQpcEN0eDsKKwl3aGlsZSAocEllLT5wcmVzZW50KSB7CisJCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV90bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBJZSwgcG5OZWVkZWQsCisJCQkJVExWU19Xc2NQcm9iZVJlcSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX3Byb2JlX3JlcS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX3Byb2JlX3Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRVdzY1Byb2JlUmVzICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlUTFZTX1dzY1Byb2JlUmVzKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV93c2NfcHJvYmVfcmVzLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9pZV93c2NfcmVhc3NvY19yZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmSUVXc2NSZWFzc29jUmVzICpwSWUsIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwkodm9pZClwQ3R4OworCXdoaWxlIChwSWUtPnByZXNlbnQpIHsKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlUTFZTX1dzY1JlYXNzb2NSZXMpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2llX3dzY19yZWFzc29jX3Jlcy4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfaWVfdmVuZG9yMl9pZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZJRXZlbmRvcjJfaWUgKnBJZSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCSh2b2lkKXBDdHg7CisJd2hpbGUgKHBJZS0+cHJlc2VudCkgeworCQkqcG5OZWVkZWQgKz0gMTsKKwkJKnBuTmVlZGVkICs9IDE7CisJCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEllLCBwbk5lZWRlZCwKKwkJCQlJRVNfdmVuZG9yMl9pZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfaWVfdmVuZG9yMl9pZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfYWRkX3RzX3JlcXVlc3Rfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZBZGRUU1JlcXVlc3QgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDM7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfQWRkVFNSZXF1ZXN0KTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfYWRkX3RzX3JlcXVlc3Rfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfYWRkX3RzX3Jlc3BvbnNlX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmQWRkVFNSZXNwb25zZSAqcEZybSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKnBuTmVlZGVkID0gNTsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19BZGRUU1Jlc3BvbnNlKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfYWRkX3RzX3Jlc3BvbnNlX3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2Fzc29jX3JlcXVlc3Rfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZBc3NvY1JlcXVlc3QgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDQ7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfQXNzb2NSZXF1ZXN0KTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfYXNzb2NfcmVxdWVzdF9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9hc3NvY19yZXNwb25zZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkFzc29jUmVzcG9uc2UgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDY7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfQXNzb2NSZXNwb25zZSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2Fzc29jX3Jlc3BvbnNlX3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2F1dGhlbnRpY2F0aW9uX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmQXV0aGVudGljYXRpb24gKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDY7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfQXV0aGVudGljYXRpb24pOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9hdXRoZW50aWNhdGlvbl9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9iZWFjb25fc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZCZWFjb24gKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDEyOworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX0JlYWNvbik7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2JlYWNvbl9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9iZWFjb24xX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmQmVhY29uMSAqcEZybSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKnBuTmVlZGVkID0gMTI7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfQmVhY29uMSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2JlYWNvbjFfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfYmVhY29uMl9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkJlYWNvbjIgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDA7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfQmVhY29uMik7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2JlYWNvbjJfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfYmVhY29uX2lfZXNfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZCZWFjb25JRXMgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDA7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfQmVhY29uSUVzKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfYmVhY29uX2lfZXNfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfY2hhbm5lbF9zd2l0Y2hfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZDaGFubmVsU3dpdGNoICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSAyOworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX0NoYW5uZWxTd2l0Y2gpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9jaGFubmVsX3N3aXRjaF9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9kZV9hdXRoX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmRGVBdXRoICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSAyOworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX0RlQXV0aCk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2RlX2F1dGhfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfZGVsX3RzX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmRGVsVFMgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDc7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfRGVsVFMpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9kZWxfdHNfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfZGlzYXNzb2NpYXRpb25fc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZEaXNhc3NvY2lhdGlvbiAqcEZybSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKnBuTmVlZGVkID0gMjsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19EaXNhc3NvY2lhdGlvbik7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX2Rpc2Fzc29jaWF0aW9uX3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX2xpbmtfbWVhc3VyZW1lbnRfcmVwb3J0X3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0ICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSAxMTsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19MaW5rTWVhc3VyZW1lbnRSZXBvcnQpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9saW5rX21lYXN1cmVtZW50X3JlcG9ydF9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9saW5rX21lYXN1cmVtZW50X3JlcXVlc3Rfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSA1OworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX0xpbmtNZWFzdXJlbWVudFJlcXVlc3QpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9saW5rX21lYXN1cmVtZW50X3JlcXVlc3Rfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfbWVhc3VyZW1lbnRfcmVwb3J0X3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDM7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfTWVhc3VyZW1lbnRSZXBvcnQpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9tZWFzdXJlbWVudF9yZXBvcnRfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfbWVhc3VyZW1lbnRfcmVxdWVzdF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZk1lYXN1cmVtZW50UmVxdWVzdCAqcEZybSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKnBuTmVlZGVkID0gMzsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19NZWFzdXJlbWVudFJlcXVlc3QpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9tZWFzdXJlbWVudF9yZXF1ZXN0X3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX25laWdoYm9yX3JlcG9ydF9yZXF1ZXN0X3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0ICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSAzOworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX05laWdoYm9yUmVwb3J0UmVxdWVzdCk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX25laWdoYm9yX3JlcG9ydF9yZXF1ZXN0X3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX25laWdoYm9yX3JlcG9ydF9yZXNwb25zZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2UgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDM7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfTmVpZ2hib3JSZXBvcnRSZXNwb25zZSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX25laWdoYm9yX3JlcG9ydF9yZXNwb25zZV9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9vcGVyYXRpbmdfbW9kZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZk9wZXJhdGluZ01vZGUgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDM7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfT3BlcmF0aW5nTW9kZSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX29wZXJhdGluZ19tb2RlX3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3Byb2JlX3JlcXVlc3Rfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZQcm9iZVJlcXVlc3QgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDA7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfUHJvYmVSZXF1ZXN0KTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfcHJvYmVfcmVxdWVzdF9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9wcm9iZV9yZXNwb25zZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlByb2JlUmVzcG9uc2UgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDEyOworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX1Byb2JlUmVzcG9uc2UpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9wcm9iZV9yZXNwb25zZV9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9xb3NfbWFwX2NvbmZpZ3VyZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlFvc01hcENvbmZpZ3VyZSAqcEZybSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKnBuTmVlZGVkID0gMjsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19Rb3NNYXBDb25maWd1cmUpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9xb3NfbWFwX2NvbmZpZ3VyZV9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9yYWRpb19tZWFzdXJlbWVudF9yZXBvcnRfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVwb3J0ICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSAzOworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX1JhZGlvTWVhc3VyZW1lbnRSZXBvcnQpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9yYWRpb19tZWFzdXJlbWVudF9yZXBvcnRfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfcmFkaW9fbWVhc3VyZW1lbnRfcmVxdWVzdF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSA1OworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0KTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfcmFkaW9fbWVhc3VyZW1lbnRfcmVxdWVzdF9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9yZV9hc3NvY19yZXF1ZXN0X3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmUmVBc3NvY1JlcXVlc3QgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDEwOworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX1JlQXNzb2NSZXF1ZXN0KTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfcmVfYXNzb2NfcmVxdWVzdF9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9yZV9hc3NvY19yZXNwb25zZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlJlQXNzb2NSZXNwb25zZSAqcEZybSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKnBuTmVlZGVkID0gNjsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19SZUFzc29jUmVzcG9uc2UpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9yZV9hc3NvY19yZXNwb25zZV9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9zbV9wb3dlcl9zYXZlX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmU01Qb3dlclNhdmUgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDM7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfU01Qb3dlclNhdmUpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9zbV9wb3dlcl9zYXZlX3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3NhX3F1ZXJ5X3JlcV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlNhUXVlcnlSZXEgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDQ7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfU2FRdWVyeVJlcSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX3NhX3F1ZXJ5X3JlcV9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9zYV9xdWVyeV9yc3Bfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZTYVF1ZXJ5UnNwICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSA0OworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX1NhUXVlcnlSc3ApOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9zYV9xdWVyeV9yc3Bfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGRsc19kaXNfcmVxX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVERMU0Rpc1JlcSAqcEZybSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKnBuTmVlZGVkID0gMzsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19URExTRGlzUmVxKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfdGRsc19kaXNfcmVxX3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3RkbHNfZGlzX3JzcF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNEaXNSc3AgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDU7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfVERMU0Rpc1JzcCk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX3RkbHNfZGlzX3JzcF9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90ZGxzX3BlZXJfdHJhZmZpY19pbmRfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTUGVlclRyYWZmaWNJbmQgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDM7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfVERMU1BlZXJUcmFmZmljSW5kKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfdGRsc19wZWVyX3RyYWZmaWNfaW5kX3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3RkbHNfcGVlcl90cmFmZmljX3JzcF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNQZWVyVHJhZmZpY1JzcCAqcEZybSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKnBuTmVlZGVkID0gMzsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19URExTUGVlclRyYWZmaWNSc3ApOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF90ZGxzX3BlZXJfdHJhZmZpY19yc3Bfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGRsc19zZXR1cF9jbmZfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTU2V0dXBDbmYgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDU7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfVERMU1NldHVwQ25mKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfdGRsc19zZXR1cF9jbmZfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGRsc19zZXR1cF9yZXFfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTU2V0dXBSZXEgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDU7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfVERMU1NldHVwUmVxKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfdGRsc19zZXR1cF9yZXFfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGRsc19zZXR1cF9yc3Bfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTU2V0dXBSc3AgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDc7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfVERMU1NldHVwUnNwKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfdGRsc19zZXR1cF9yc3Bfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfdGRsc190ZWFyZG93bl9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNUZWFyZG93biAqcEZybSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKnBuTmVlZGVkID0gNDsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19URExTVGVhcmRvd24pOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF90ZGxzX3RlYXJkb3duX3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3RwY19yZXBvcnRfc2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZUUENSZXBvcnQgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDM7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfVFBDUmVwb3J0KTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfdHBjX3JlcG9ydF9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF90cGNfcmVxdWVzdF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRQQ1JlcXVlc3QgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDM7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfVFBDUmVxdWVzdCk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX3RwY19yZXF1ZXN0X3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3RpbWluZ19hZHZlcnRpc2VtZW50X2ZyYW1lX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSAxMDsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19UaW1pbmdBZHZlcnRpc2VtZW50RnJhbWUpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF90aW1pbmdfYWR2ZXJ0aXNlbWVudF9mcmFtZV9zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF92aHRfZ2lkX21hbmFnZW1lbnRfYWN0aW9uX2ZyYW1lX3NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVkhUR2lkTWFuYWdlbWVudEFjdGlvbkZyYW1lICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSAyNjsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19WSFRHaWRNYW5hZ2VtZW50QWN0aW9uRnJhbWUpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF92aHRfZ2lkX21hbmFnZW1lbnRfYWN0aW9uX2ZyYW1lX3NpemUuICovCisKK3VpbnQzMl90IGRvdDExZl9nZXRfcGFja2VkX3dtbV9hZGRfdHNfcmVxdWVzdF9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZldNTUFkZFRTUmVxdWVzdCAqcEZybSwgdWludDMyX3QgKnBuTmVlZGVkKQoreworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKnBuTmVlZGVkID0gNDsKKwlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBuTmVlZGVkLAorCQkJCSAgICAgIElFU19XTU1BZGRUU1JlcXVlc3QpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF93bW1fYWRkX3RzX3JlcXVlc3Rfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfd21tX2FkZF90c19yZXNwb25zZV9zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZldNTUFkZFRTUmVzcG9uc2UgKnBGcm0sIHVpbnQzMl90ICpwbk5lZWRlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSpwbk5lZWRlZCA9IDQ7CisJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwbk5lZWRlZCwKKwkJCQkgICAgICBJRVNfV01NQWRkVFNSZXNwb25zZSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9nZXRfcGFja2VkX3dtbV9hZGRfdHNfcmVzcG9uc2Vfc2l6ZS4gKi8KKwordWludDMyX3QgZG90MTFmX2dldF9wYWNrZWRfd21tX2RlbF90c19zaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZldNTURlbFRTICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSA0OworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX1dNTURlbFRTKTsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX2dldF9wYWNrZWRfd21tX2RlbF90c19zaXplLiAqLworCit1aW50MzJfdCBkb3QxMWZfZ2V0X3BhY2tlZF9odDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZodDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lICpwRnJtLCB1aW50MzJfdCAqcG5OZWVkZWQpCit7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkqcG5OZWVkZWQgPSAyOworCXN0YXR1cyA9IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcG5OZWVkZWQsCisJCQkJICAgICAgSUVTX2h0MjA0MF9ic3NfY29leGlzdGVuY2VfbWdtdF9hY3Rpb25fZnJhbWUpOworCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfZ2V0X3BhY2tlZF9odDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lU2l6ZS4gKi8KKworc3RhdGljIHVpbnQzMl90IGdldF9wYWNrZWRfc2l6ZV9jb3JlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgdWludDhfdCAqcEZybSwKKwkJCQkgICAgICB1aW50MzJfdCAqcG5OZWVkZWQsCisJCQkJICAgICAgY29uc3QgdElFRGVmbiAgSUVzW10pCit7CisJY29uc3QgdElFRGVmbiAqcEllOworCXVpbnQxNl90ICBpLCBuOworCXVpbnQzMl90ICBzdGF0dXM7CisJdEZSQU1FU19CT09MICpwZkZvdW5kOworCXVpbnQzMl90IGNvdW50T2Zmc2V0ID0gMDsKKwl1aW50MzJfdCBieXRlQ291bnQgPSAwOworCXVpbnQ4X3QgIHBJZVByZXNlbnQgPSAwOworCXVpbnQzMl90IG9mZnNldCA9IDA7CisKKwlzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKworCSh2b2lkKXBDdHg7IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgaWYgd2UgaGF2ZSBubyBGRnMgbm9yIElFcy4uLiAqLworCWkgPSAwOworCW4gPSAwOworCXBJZSA9ICYoSUVzWzBdKTsKKwl3aGlsZSAoMHhmZiAhPSBwSWUtPmVpZCkgeworCQlwZkZvdW5kID0gKHRGUkFNRVNfQk9PTCAqKShwRnJtICsgcEllLT5vZmZzZXQgKworCQkJCQkgIHBJZS0+cHJlc2VuY2VPZmZzZXQpOworCQlpZiAoKnBmRm91bmQpIHsKKwkJCWNvdW50T2Zmc2V0ID0gKCgwID09IHBJZS0+YXJyYXlib3VuZCkgPyAxIDogKCoodWludDE2X3QgKikocEZybSArIHBJZS0+Y291bnRPZmZzZXQpKSk7CisJCQlmb3IgKGkgPSAwVTsgaSA8IGNvdW50T2Zmc2V0OyArK2kpIHsKKwkJCQkqcG5OZWVkZWQgKz0gMlUgKyBwSWUtPm5vdWk7CisJCQkJYnl0ZUNvdW50ID0gMDsKKwkJCQlzd2l0Y2ggKHBJZS0+c2lnKSB7CisJCQkJY2FzZSBTaWdJZUNvbmRlbnNlZENvdW50cnlTdHI6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyKTsKKwkJCQkJYnl0ZUNvdW50ID0gMjsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFQ29uZGVuc2VkQ291bnRyeVN0ciAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVHVEs6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVHVEspOworCQkJCQlieXRlQ291bnQgPSAoKHREb3QxMWZJRUdUSyAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIG51bV9rZXkgKyAxMTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFR1RLICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUlHVEs6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVJR1RLKTsKKwkJCQkJYnl0ZUNvdW50ID0gMzM7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRUlHVEsgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUjBLSF9JRDoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVIwS0hfSUQpOworCQkJCQlieXRlQ291bnQgPSAoKHREb3QxMWZJRVIwS0hfSUQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fUE1LX1IwX0lEOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVSMEtIX0lEICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVIxS0hfSUQ6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVSMUtIX0lEKTsKKwkJCQkJYnl0ZUNvdW50ID0gNjsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUjFLSF9JRCAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVUU0ZJbmZvOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFVFNGSW5mbyk7CisJCQkJCWJ5dGVDb3VudCA9IDQ7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVRTRkluZm8gKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llQVBDaGFubmVsUmVwb3J0OgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFQVBDaGFubmVsUmVwb3J0KTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fY2hhbm5lbExpc3QgKyAxOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llQmNuUmVwb3J0aW5nRGV0YWlsOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsKTsKKwkJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUJlYWNvblJlcG9ydEZybUJvZHk6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5KTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5ICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgbnVtX3JlcG9ydGVkRmllbGRzOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5ICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUJlYWNvblJlcG9ydGluZzoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUJlYWNvblJlcG9ydGluZyk7CisJCQkJCWJ5dGVDb3VudCA9IDI7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRUJlYWNvblJlcG9ydGluZyAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVNZWFzdXJlbWVudFBpbG90OgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFTWVhc3VyZW1lbnRQaWxvdCk7CisJCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZklFTWVhc3VyZW1lbnRQaWxvdCAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIG51bV92ZW5kb3JTcGVjaWZpYyArIDE7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llTXVsdGlCc3NpZDoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRU11bHRpQnNzaWQpOworCQkJCQlieXRlQ291bnQgPSAoKHREb3QxMWZJRU11bHRpQnNzaWQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fdmVuZG9yU3BlY2lmaWMgKyAxOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVNdWx0aUJzc2lkICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVJJQ0RhdGE6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVSSUNEYXRhKTsKKwkJCQkJYnl0ZUNvdW50ID0gNDsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUklDRGF0YSAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVSSUNEZXNjcmlwdG9yOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUklDRGVzY3JpcHRvcik7CisJCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZklFUklDRGVzY3JpcHRvciAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIG51bV92YXJpYWJsZURhdGEgKyAxOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVSSUNEZXNjcmlwdG9yICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVJSTUVuYWJsZWRDYXA6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVSUk1FbmFibGVkQ2FwKTsKKwkJCQkJYnl0ZUNvdW50ID0gNTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUlJNRW5hYmxlZENhcCAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVSZXF1ZXN0ZWRJbmZvOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUmVxdWVzdGVkSW5mbyk7CisJCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZklFUmVxdWVzdGVkSW5mbyAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIG51bV9yZXF1ZXN0ZWRfZWlkczsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUmVxdWVzdGVkSW5mbyAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVTU0lEOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFU1NJRCk7CisJCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZklFU1NJRCAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIG51bV9zc2lkOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVTU0lEICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVNjaGVkdWxlOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFU2NoZWR1bGUpOworCQkJCQlieXRlQ291bnQgPSAxNDsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFU2NoZWR1bGUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVENMQVM6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVUQ0xBUyk7CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX2dldF9wYWNrZWRfaWV0Y2xhcygKKwkJCQkJCXBDdHgsICh0RG90MTFmSUVUQ0xBUyAqKQorCQkJCQkJKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpLAorCQkJCQkJcG5OZWVkZWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVENMQVNTUFJPQzoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVRDTEFTU1BST0MpOworCQkJCQlieXRlQ291bnQgPSAxOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVUQ0xBU1NQUk9DICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVRTRGVsYXk6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVUU0RlbGF5KTsKKwkJCQkJYnl0ZUNvdW50ID0gNDsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFVFNEZWxheSAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVUU1BFQzoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVRTUEVDKTsKKwkJCQkJYnl0ZUNvdW50ID0gNTU7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVRTUEVDICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVZIVENhcHM6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVWSFRDYXBzKTsKKwkJCQkJYnl0ZUNvdW50ID0gMTI7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVZIVENhcHMgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVkhUT3BlcmF0aW9uOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFVkhUT3BlcmF0aW9uKTsKKwkJCQkJYnl0ZUNvdW50ID0gNTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFVkhUT3BlcmF0aW9uICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdNTVNjaGVkdWxlOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFV01NU2NoZWR1bGUpOworCQkJCQlieXRlQ291bnQgPSAxNTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFV01NU2NoZWR1bGUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV01NVENMQVM6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXTU1UQ0xBUyk7CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX2dldF9wYWNrZWRfaWV3bW10Y2xhcygKKwkJCQkJCXBDdHgsICh0RG90MTFmSUVXTU1UQ0xBUyAqKQorCQkJCQkJKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpLAorCQkJCQkJcG5OZWVkZWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV01NVENMQVNQUk9DOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFV01NVENMQVNQUk9DKTsKKwkJCQkJYnl0ZUNvdW50ID0gMjsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFV01NVENMQVNQUk9DICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdNTVRTRGVsYXk6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXTU1UU0RlbGF5KTsKKwkJCQkJYnl0ZUNvdW50ID0gNTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFV01NVFNEZWxheSAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXTU1UU1BFQzoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdNTVRTUEVDKTsKKwkJCQkJYnl0ZUNvdW50ID0gNTY7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVdNTVRTUEVDICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdpZGVyQldDaGFuU3dpdGNoQW5uOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4pOworCQkJCQlieXRlQ291bnQgPSAzOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVXaWRlckJXQ2hhblN3aXRjaEFubiAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVBSUQ6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVBSUQpOworCQkJCQlieXRlQ291bnQgPSAyOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVBSUQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llQ0ZQYXJhbXM6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVDRlBhcmFtcyk7CisJCQkJCWJ5dGVDb3VudCA9IDY7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRUNGUGFyYW1zICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUNoYWxsZW5nZVRleHQ6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVDaGFsbGVuZ2VUZXh0KTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVDaGFsbGVuZ2VUZXh0ICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgbnVtX3RleHQ7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRUNoYWxsZW5nZVRleHQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llQ2hhblN3aXRjaEFubjoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUNoYW5Td2l0Y2hBbm4pOworCQkJCQlieXRlQ291bnQgPSAzOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVDaGFuU3dpdGNoQW5uICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUNoYW5uZWxTd2l0Y2hXcmFwcGVyOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFQ2hhbm5lbFN3aXRjaFdyYXBwZXIpOworCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl9nZXRfcGFja2VkX2llX2NoYW5uZWxfc3dpdGNoX3dyYXBwZXIoCisJCQkJCQlwQ3R4LCAodERvdDExZklFQ2hhbm5lbFN3aXRjaFdyYXBwZXIgKikKKwkJCQkJCShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSwKKwkJCQkJCXBuTmVlZGVkKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUNvdW50cnk6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVDb3VudHJ5KTsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZV9jb3VudHJ5KAorCQkJCQkJcEN0eCwgKHREb3QxMWZJRUNvdW50cnkgKikKKwkJCQkJCShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSwKKwkJCQkJCXBuTmVlZGVkKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZURTUGFyYW1zOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFRFNQYXJhbXMpOworCQkJCQlieXRlQ291bnQgPSAxOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVEU1BhcmFtcyAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVFRENBUGFyYW1TZXQ6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVFRENBUGFyYW1TZXQpOworCQkJCQlieXRlQ291bnQgPSAxODsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFRURDQVBhcmFtU2V0ICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUVSUEluZm86CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVFUlBJbmZvKTsKKwkJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFRVJQSW5mbyAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVFU0VDY2ttT3BhcXVlOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFRVNFQ2NrbU9wYXF1ZSk7CisJCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZklFRVNFQ2NrbU9wYXF1ZSAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIG51bV9kYXRhOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVFU0VDY2ttT3BhcXVlICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUVTRVJhZE1nbXRDYXA6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVFU0VSYWRNZ210Q2FwKTsKKwkJCQkJYnl0ZUNvdW50ID0gMjsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFRVNFUmFkTWdtdENhcCAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVFU0VUcmFmU3RybU1ldDoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUVTRVRyYWZTdHJtTWV0KTsKKwkJCQkJYnl0ZUNvdW50ID0gNDsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFRVNFVHJhZlN0cm1NZXQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llRVNFVHJhZlN0cm1SYXRlU2V0OgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFRVNFVHJhZlN0cm1SYXRlU2V0KTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVFU0VUcmFmU3RybVJhdGVTZXQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fdHNyYXRlcyArIDE7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRUVTRVRyYWZTdHJtUmF0ZVNldCAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVFU0VUeG1pdFBvd2VyOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFRVNFVHhtaXRQb3dlcik7CisJCQkJCWJ5dGVDb3VudCA9IDI7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRUVTRVR4bWl0UG93ZXIgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llRVNFVmVyc2lvbjoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUVTRVZlcnNpb24pOworCQkJCQlieXRlQ291bnQgPSAxOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVFU0VWZXJzaW9uICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUV4dENhcDoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUV4dENhcCk7CisJCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZklFRXh0Q2FwICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgbnVtX2J5dGVzOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVFeHRDYXAgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llRXh0U3VwcFJhdGVzOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFRXh0U3VwcFJhdGVzKTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fcmF0ZXM7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRUV4dFN1cHBSYXRlcyAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVGSFBhcmFtU2V0OgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFRkhQYXJhbVNldCk7CisJCQkJCWJ5dGVDb3VudCA9IDU7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRUZIUGFyYW1TZXQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llRkhQYXJhbXM6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVGSFBhcmFtcyk7CisJCQkJCWJ5dGVDb3VudCA9IDI7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRUZIUGFyYW1zICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUZIUGF0dFRhYmxlOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFRkhQYXR0VGFibGUpOworCQkJCQlieXRlQ291bnQgPSAoKHREb3QxMWZJRUZIUGF0dFRhYmxlICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgbnVtX3JhbmR0YWJsZSArIDQ7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRUZIUGF0dFRhYmxlICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUZUSW5mbzoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUZUSW5mbyk7CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX2dldF9wYWNrZWRfaWVmdF9pbmZvKAorCQkJCQkJcEN0eCwgKHREb3QxMWZJRUZUSW5mbyAqKQorCQkJCQkJKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpLAorCQkJCQkJcG5OZWVkZWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llSFRDYXBzOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFSFRDYXBzKTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVIVENhcHMgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fcnN2ZCArIDI2OworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVIVENhcHMgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llSFRJbmZvOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFSFRJbmZvKTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVIVEluZm8gKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fcnN2ZCArIDIyOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVIVEluZm8gKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llSUJTU1BhcmFtczoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUlCU1NQYXJhbXMpOworCQkJCQlieXRlQ291bnQgPSAyOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVJQlNTUGFyYW1zICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZUxpbmtJZGVudGlmaWVyOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFTGlua0lkZW50aWZpZXIpOworCQkJCQlieXRlQ291bnQgPSAxODsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFTGlua0lkZW50aWZpZXIgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llTWVhc3VyZW1lbnRSZXBvcnQ6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCk7CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX2dldF9wYWNrZWRfaWVfbWVhc3VyZW1lbnRfcmVwb3J0KAorCQkJCQkJcEN0eCwgKHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVNZWFzdXJlbWVudFJlcXVlc3Q6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QpOworCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl9nZXRfcGFja2VkX2llX21lYXN1cmVtZW50X3JlcXVlc3QoCisJCQkJCQlwQ3R4LCAodERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0ICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVNb2JpbGl0eURvbWFpbjoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRU1vYmlsaXR5RG9tYWluKTsKKwkJCQkJYnl0ZUNvdW50ID0gMzsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFTW9iaWxpdHlEb21haW4gKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llTmVpZ2hib3JSZXBvcnQ6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVOZWlnaGJvclJlcG9ydCk7CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX2dldF9wYWNrZWRfaWVfbmVpZ2hib3JfcmVwb3J0KAorCQkJCQkJcEN0eCwgKHREb3QxMWZJRU5laWdoYm9yUmVwb3J0ICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVPQlNTU2NhblBhcmFtZXRlcnM6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVPQlNTU2NhblBhcmFtZXRlcnMpOworCQkJCQlieXRlQ291bnQgPSAxNDsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFT0JTU1NjYW5QYXJhbWV0ZXJzICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZU9wZXJhdGluZ01vZGU6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVPcGVyYXRpbmdNb2RlKTsKKwkJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFT3BlcmF0aW5nTW9kZSAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVQMlBBc3NvY1JlcToKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVAyUEFzc29jUmVxKTsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfYXNzb2NfcmVxKAorCQkJCQkJcEN0eCwgKHREb3QxMWZJRVAyUEFzc29jUmVxICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVQMlBBc3NvY1JlczoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVAyUEFzc29jUmVzKTsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfYXNzb2NfcmVzKAorCQkJCQkJcEN0eCwgKHREb3QxMWZJRVAyUEFzc29jUmVzICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVQMlBCZWFjb246CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBCZWFjb24pOworCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9iZWFjb24oCisJCQkJCQlwQ3R4LCAodERvdDExZklFUDJQQmVhY29uICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVQMlBCZWFjb25Qcm9iZVJlczoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzKTsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfYmVhY29uX3Byb2JlX3JlcygKKwkJCQkJCXBDdHgsICh0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcyAqKQorCQkJCQkJKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpLAorCQkJCQkJcG5OZWVkZWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUDJQRGVBdXRoOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQRGVBdXRoKTsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfZGVfYXV0aCgKKwkJCQkJCXBDdHgsICh0RG90MTFmSUVQMlBEZUF1dGggKikKKwkJCQkJCShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSwKKwkJCQkJCXBuTmVlZGVkKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVAyUERpc0Fzc29jOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQRGlzQXNzb2MpOworCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9kaXNfYXNzb2MoCisJCQkJCQlwQ3R4LCAodERvdDExZklFUDJQRGlzQXNzb2MgKikKKwkJCQkJCShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSwKKwkJCQkJCXBuTmVlZGVkKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVAyUElFT3BhcXVlOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQSUVPcGFxdWUpOworCQkJCQlieXRlQ291bnQgPSAoKHREb3QxMWZJRVAyUElFT3BhcXVlICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgbnVtX2RhdGE7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVAyUElFT3BhcXVlICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVAyUFByb2JlUmVxOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQUHJvYmVSZXEpOworCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9wcm9iZV9yZXEoCisJCQkJCQlwQ3R4LCAodERvdDExZklFUDJQUHJvYmVSZXEgKikKKwkJCQkJCShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSwKKwkJCQkJCXBuTmVlZGVkKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVAyUFByb2JlUmVzOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQUHJvYmVSZXMpOworCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9wcm9iZV9yZXMoCisJCQkJCQlwQ3R4LCAodERvdDExZklFUDJQUHJvYmVSZXMgKikKKwkJCQkJCShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSwKKwkJCQkJCXBuTmVlZGVkKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVBUSUNvbnRyb2w6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQVElDb250cm9sKTsKKwkJCQkJYnl0ZUNvdW50ID0gMzsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUFRJQ29udHJvbCAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVQVUJ1ZmZlclN0YXR1czoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVBVQnVmZmVyU3RhdHVzKTsKKwkJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUFVCdWZmZXJTdGF0dXMgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUG93ZXJDYXBzOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUG93ZXJDYXBzKTsKKwkJCQkJYnl0ZUNvdW50ID0gMjsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUG93ZXJDYXBzICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVBvd2VyQ29uc3RyYWludHM6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzKTsKKwkJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUG93ZXJDb25zdHJhaW50cyAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVRQlNTTG9hZDoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVFCU1NMb2FkKTsKKwkJCQkJYnl0ZUNvdW50ID0gNTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUUJTU0xvYWQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUUNvbVZlbmRvcklFOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUUNvbVZlbmRvcklFKTsKKwkJCQkJYnl0ZUNvdW50ID0gMjsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUUNvbVZlbmRvcklFICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVFPU0NhcHNBcDoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVFPU0NhcHNBcCk7CisJCQkJCWJ5dGVDb3VudCA9IDE7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVFPU0NhcHNBcCAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVRT1NDYXBzU3RhdGlvbjoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uKTsKKwkJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUU9TQ2Fwc1N0YXRpb24gKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUW9zTWFwU2V0OgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUW9zTWFwU2V0KTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVRb3NNYXBTZXQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fZHNjcF9leGNlcHRpb25zOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVRb3NNYXBTZXQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUXVpZXQ6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVRdWlldCk7CisJCQkJCWJ5dGVDb3VudCA9IDY7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVF1aWV0ICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVJDUElJRToKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVJDUElJRSk7CisJCQkJCWJ5dGVDb3VudCA9IDE7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVJDUElJRSAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVSSUNEYXRhRGVzYzoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjKTsKKwkJCQkJcG5OZWVkZWQgLT0gMiAgOyAvKiBTdWJ0cmFjdCB0aGUgbGVuZ3RoIGFuZCBPdWkgYXMgdGhpcyBpcyBvdXIgY29udGFpbmVyIElFIHRvIGdyb3VwIEllcyBhbmQgaXQgZG9lc250IGhhdmUgaXRzIG93biBsZW5ndGggYW5kIE9VSS4gKi8KKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZXJpY19kYXRhX2Rlc2MoCisJCQkJCQlwQ3R4LCAodERvdDExZklFUklDRGF0YURlc2MgKikKKwkJCQkJCShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSwKKwkJCQkJCXBuTmVlZGVkKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVJTTjoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVJTTik7CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX2dldF9wYWNrZWRfaWVyc24oCisJCQkJCQlwQ3R4LCAodERvdDExZklFUlNOICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVSU05JSUU6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVSU05JSUUpOworCQkJCQlieXRlQ291bnQgPSAxOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVSU05JSUUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llUlNOT3BhcXVlOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFUlNOT3BhcXVlKTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVSU05PcGFxdWUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fZGF0YTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFUlNOT3BhcXVlICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVN1cHBDaGFubmVsczoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVN1cHBDaGFubmVscyk7CisJCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZklFU3VwcENoYW5uZWxzICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgbnVtX2JhbmRzICogMjsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFU3VwcENoYW5uZWxzICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVN1cHBPcGVyYXRpbmdDbGFzc2VzOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMpOworCQkJCQlieXRlQ291bnQgPSAoKHREb3QxMWZJRVN1cHBPcGVyYXRpbmdDbGFzc2VzICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgbnVtX2NsYXNzZXM7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVN1cHBPcGVyYXRpbmdDbGFzc2VzICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVN1cHBSYXRlczoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVN1cHBSYXRlcyk7CisJCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZklFU3VwcFJhdGVzICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgbnVtX3JhdGVzOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVTdXBwUmF0ZXMgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVElNOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFVElNKTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVUSU0gKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fdmJtcCArIDM7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVRJTSAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVUUENSZXBvcnQ6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVUUENSZXBvcnQpOworCQkJCQlieXRlQ291bnQgPSAyOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVUUENSZXBvcnQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVFBDUmVxdWVzdDoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVRQQ1JlcXVlc3QpOworCQkJCQlieXRlQ291bnQgPSAwOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVUUENSZXF1ZXN0ICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVRpbWVBZHZlcnRpc2VtZW50OgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFVGltZUFkdmVydGlzZW1lbnQpOworCQkJCQlieXRlQ291bnQgPSAxNjsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFVGltZUFkdmVydGlzZW1lbnQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVGltZW91dEludGVydmFsOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFVGltZW91dEludGVydmFsKTsKKwkJCQkJYnl0ZUNvdW50ID0gNTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFVGltZW91dEludGVydmFsICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVZIVEV4dEJzc0xvYWQ6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVWSFRFeHRCc3NMb2FkKTsKKwkJCQkJYnl0ZUNvdW50ID0gNTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFVkhURXh0QnNzTG9hZCAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVWZW5kb3IxSUU6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVWZW5kb3IxSUUpOworCQkJCQlieXRlQ291bnQgPSAwOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVWZW5kb3IxSUUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llVmVuZG9yM0lFOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFVmVuZG9yM0lFKTsKKwkJCQkJYnl0ZUNvdW50ID0gMDsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFVmVuZG9yM0lFICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdBUEk6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXQVBJKTsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZXdhcGkoCisJCQkJCQlwQ3R4LCAodERvdDExZklFV0FQSSAqKQorCQkJCQkJKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpLAorCQkJCQkJcG5OZWVkZWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV0FQSU9wYXF1ZToKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdBUElPcGFxdWUpOworCQkJCQlieXRlQ291bnQgPSAoKHREb3QxMWZJRVdBUElPcGFxdWUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fZGF0YTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFV0FQSU9wYXF1ZSAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXRkFUUEM6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXRkFUUEMpOworCQkJCQlieXRlQ291bnQgPSAyOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVXRkFUUEMgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV0ZESUVPcGFxdWU6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXRkRJRU9wYXF1ZSk7CisJCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZklFV0ZESUVPcGFxdWUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fZGF0YTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFV0ZESUVPcGFxdWUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV01NQ2FwczoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdNTUNhcHMpOworCQkJCQlieXRlQ291bnQgPSAyOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVXTU1DYXBzICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdNTUluZm9BcDoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdNTUluZm9BcCk7CisJCQkJCWJ5dGVDb3VudCA9IDI7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVdNTUluZm9BcCAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXTU1JbmZvU3RhdGlvbjoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdNTUluZm9TdGF0aW9uKTsKKwkJCQkJYnl0ZUNvdW50ID0gMjsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFV01NSW5mb1N0YXRpb24gKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV01NUGFyYW1zOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFV01NUGFyYW1zKTsKKwkJCQkJYnl0ZUNvdW50ID0gMTk7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRVdNTVBhcmFtcyAqKQorCQkJCQkgIChwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSktPgorCQkJCQkgIHByZXNlbnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXUEE6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXUEEpOworCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl9nZXRfcGFja2VkX2lld3BhKAorCQkJCQkJcEN0eCwgKHREb3QxMWZJRVdQQSAqKQorCQkJCQkJKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpLAorCQkJCQkJcG5OZWVkZWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV1BBT3BhcXVlOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFV1BBT3BhcXVlKTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVXUEFPcGFxdWUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fZGF0YTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFV1BBT3BhcXVlICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZVdTQzoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdTQyk7CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX2dldF9wYWNrZWRfaWV3c2MoCisJCQkJCQlwQ3R4LCAodERvdDExZklFV1NDICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXc2NBc3NvY1JlcToKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdzY0Fzc29jUmVxKTsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZV93c2NfYXNzb2NfcmVxKAorCQkJCQkJcEN0eCwgKHREb3QxMWZJRVdzY0Fzc29jUmVxICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXc2NBc3NvY1JlczoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdzY0Fzc29jUmVzKTsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZV93c2NfYXNzb2NfcmVzKAorCQkJCQkJcEN0eCwgKHREb3QxMWZJRVdzY0Fzc29jUmVzICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXc2NCZWFjb246CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXc2NCZWFjb24pOworCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl9nZXRfcGFja2VkX2llX3dzY19iZWFjb24oCisJCQkJCQlwQ3R4LCAodERvdDExZklFV3NjQmVhY29uICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVXc2NCZWFjb25Qcm9iZVJlczoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzKTsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZV93c2NfYmVhY29uX3Byb2JlX3JlcygKKwkJCQkJCXBDdHgsICh0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcyAqKQorCQkJCQkJKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpLAorCQkJCQkJcG5OZWVkZWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV3NjSUVPcGFxdWU6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXc2NJRU9wYXF1ZSk7CisJCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZklFV3NjSUVPcGFxdWUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBudW1fZGF0YTsKKwkJCQkJcEllUHJlc2VudCA9ICgodERvdDExZklFV3NjSUVPcGFxdWUgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV3NjUHJvYmVSZXE6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXc2NQcm9iZVJlcSk7CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX3Byb2JlX3JlcSgKKwkJCQkJCXBDdHgsICh0RG90MTFmSUVXc2NQcm9iZVJlcSAqKQorCQkJCQkJKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpLAorCQkJCQkJcG5OZWVkZWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV3NjUHJvYmVSZXM6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXc2NQcm9iZVJlcyk7CisJCQkJCXN0YXR1cyB8PQorCQkJCQkJZG90MTFmX2dldF9wYWNrZWRfaWVfd3NjX3Byb2JlX3JlcygKKwkJCQkJCXBDdHgsICh0RG90MTFmSUVXc2NQcm9iZVJlcyAqKQorCQkJCQkJKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpLAorCQkJCQkJcG5OZWVkZWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llV3NjUmVhc3NvY1JlczoKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdzY1JlYXNzb2NSZXMpOworCQkJCQlzdGF0dXMgfD0KKwkJCQkJCWRvdDExZl9nZXRfcGFja2VkX2llX3dzY19yZWFzc29jX3JlcygKKwkJCQkJCXBDdHgsICh0RG90MTFmSUVXc2NSZWFzc29jUmVzICopCisJCQkJCQkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSksCisJCQkJCQlwbk5lZWRlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnSWVleHRfY2hhbl9zd2l0Y2hfYW5uOgorCQkJCQlvZmZzZXQgPSBzaXplb2YodERvdDExZklFZXh0X2NoYW5fc3dpdGNoX2Fubik7CisJCQkJCWJ5dGVDb3VudCA9IDQ7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRWV4dF9jaGFuX3N3aXRjaF9hbm4gKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZToKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRWh0MjA0MF9ic3NfY29leGlzdGVuY2UpOworCQkJCQlieXRlQ291bnQgPSAxOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVodDIwNDBfYnNzX2NvZXhpc3RlbmNlICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQ6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUVodDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0KTsKKwkJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVodDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0ICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgbnVtX2NoYW5uZWxfbGlzdCArIDE7CisJCQkJCXBJZVByZXNlbnQgPSAoKHREb3QxMWZJRWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQgKikKKwkJCQkJICAocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSkpLT4KKwkJCQkJICBwcmVzZW50OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ0llc2VjX2NoYW5fb2Zmc2V0X2VsZToKKwkJCQkJb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRXNlY19jaGFuX29mZnNldF9lbGUpOworCQkJCQlieXRlQ291bnQgPSAxOworCQkJCQlwSWVQcmVzZW50ID0gKCh0RG90MTFmSUVzZWNfY2hhbl9vZmZzZXRfZWxlICopCisJCQkJCSAgKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkpKS0+CisJCQkJCSAgcHJlc2VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWdJZXZlbmRvcjJfaWU6CisJCQkJCW9mZnNldCA9IHNpemVvZih0RG90MTFmSUV2ZW5kb3IyX2llKTsKKwkJCQkJc3RhdHVzIHw9CisJCQkJCQlkb3QxMWZfZ2V0X3BhY2tlZF9pZV92ZW5kb3IyX2llKAorCQkJCQkJcEN0eCwgKHREb3QxMWZJRXZlbmRvcjJfaWUgKikKKwkJCQkJCShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpKSwKKwkJCQkJCXBuTmVlZGVkKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJRlJBTUVTX0xPRzEocEN0eCwgRlJMT0dFLCBGUkZMKCJJTlRFUk5BTCBFUlJPUi0tIEkgZG9uIgorCQkJCQkJIid0IGtub3cgYWJvdXQgdGhlIElFIHNpZ25hdHVyZSAlZDsgdGhpcyBpcyBtb3N0IGwiCisJCQkJCQkiaWtlbHkgYSBidWcgaW4gJ2ZyYW1lc2MnLlxuIiksIHBJZS0+c2lnKTsKKwkJCQkJcmV0dXJuIERPVDExRl9JTlRFUk5BTF9FUlJPUjsKKwkJCQl9IC8qRW5kIG9mIHN3aXRjaCBDYXNlKi8KKworCQkJCWlmIChieXRlQ291bnQgJiYgcEllUHJlc2VudCkKKwkJCQkJKnBuTmVlZGVkICs9IGJ5dGVDb3VudDsKKwkJCX0gLypFbmQgb2YgZm9yIGxvb3AqLworCQl9CisJCSsrcEllOworCX0KKwlyZXR1cm4gc3RhdHVzOworCit9CisKK3N0YXRpYyB1aW50MzJfdCBnZXRfcGFja2VkX3NpemVfdGx2X2NvcmUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQl1aW50OF90ICpwRnJtLAorCQkJCXVpbnQzMl90ICpwbk5lZWRlZCwKKwkJCQljb25zdCB0VExWRGVmbiAgVExWc1tdKQoreworCWNvbnN0IHRUTFZEZWZuICpwVGx2OworCXVpbnQzMl90ICAgc3RhdHVzOworCXRGUkFNRVNfQk9PTCAgICpwZkZvdW5kOworCXVpbnQzMl90ICAgYnl0ZUNvdW50ID0gMDsKKwl1aW50OF90ICAgIHBUbHZQcmVzZW50ID0gMDsKKworCXN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCisJcFRsdiA9ICYoVExWc1swXSk7CisJd2hpbGUgKDB4ZmZmZiAhPSBwVGx2LT5pZCkgeworCQlwZkZvdW5kID0gKHRGUkFNRVNfQk9PTCAqKShwRnJtICsgcFRsdi0+b2Zmc2V0ICsKKwkJCQlwVGx2LT5wcmVzZW5jZU9mZnNldCk7CisJCWlmICgqcGZGb3VuZCkgeworCQkJKnBuTmVlZGVkICs9IChwVGx2LT5zVHlwZSArIHBUbHYtPnNMZW4pOworCQkJaWYgKHBUbHYtPnBlYykKKwkJCQkqcG5OZWVkZWQgKz0gM1U7CisJCQlzd2l0Y2ggKHBUbHYtPnNpZykgeworCQkJY2FzZSBTaWdUbHZBdXRob3JpemVkTUFDczoKKwkJCQlieXRlQ291bnQgPSA2OworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UmVxdWVzdFRvRW5yb2xsOgorCQkJCWJ5dGVDb3VudCA9IDE7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2VmVyc2lvbjI6CisJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVlZlcnNpb24yICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdkFQU2V0dXBMb2NrZWQ6CisJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVkFQU2V0dXBMb2NrZWQgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2QXNzb2NpYXRpb25TdGF0ZToKKwkJCQlieXRlQ291bnQgPSAyOworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWQXNzb2NpYXRpb25TdGF0ZSAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZDb25maWdNZXRob2RzOgorCQkJCWJ5dGVDb3VudCA9IDI7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZDb25maWdNZXRob2RzICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdkNvbmZpZ3VyYXRpb25FcnJvcjoKKwkJCQlieXRlQ291bnQgPSAyOworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWQ29uZmlndXJhdGlvbkVycm9yICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdkRldmljZU5hbWU6CisJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmVExWRGV2aWNlTmFtZSAqKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPm51bV90ZXh0OworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWRGV2aWNlTmFtZSAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZEZXZpY2VQYXNzd29yZElEOgorCQkJCWJ5dGVDb3VudCA9IDI7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElEICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nOgorCQkJCWJ5dGVDb3VudCA9IDQ7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZyAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZMaXN0ZW5DaGFubmVsOgorCQkJCWJ5dGVDb3VudCA9IDU7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZMaXN0ZW5DaGFubmVsICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1Rsdk1hbnVmYWN0dXJlcjoKKwkJCQlieXRlQ291bnQgPSAoKHREb3QxMWZUTFZNYW51ZmFjdHVyZXIgKikocEZybSArIHBUbHYtPm9mZnNldCkpLT5udW1fbmFtZTsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVk1hbnVmYWN0dXJlciAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZNaW5vclJlYXNvbkNvZGU6CisJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVk1pbm9yUmVhc29uQ29kZSAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZNb2RlbE5hbWU6CisJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmVExWTW9kZWxOYW1lICopKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+bnVtX3RleHQ7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZNb2RlbE5hbWUgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2TW9kZWxOdW1iZXI6CisJCQkJYnl0ZUNvdW50ID0gKCh0RG90MTFmVExWTW9kZWxOdW1iZXIgKikocEZybSArIHBUbHYtPm9mZnNldCkpLT5udW1fdGV4dDsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVk1vZGVsTnVtYmVyICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1Rsdk5vdGljZU9mQWJzZW5jZToKKwkJCQlieXRlQ291bnQgPSAoKHREb3QxMWZUTFZOb3RpY2VPZkFic2VuY2UgKikocEZybSArIHBUbHYtPm9mZnNldCkpLT5udW1fTm9BRGVzYysyOworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1Rsdk9wZXJhdGluZ0NoYW5uZWw6CisJCQkJYnl0ZUNvdW50ID0gNTsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UDJQQ2FwYWJpbGl0eToKKwkJCQlieXRlQ291bnQgPSAyOworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZQMlBEZXZpY2VJZDoKKwkJCQlieXRlQ291bnQgPSA2OworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWUDJQRGV2aWNlSWQgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UDJQRGV2aWNlSW5mbzoKKwkJc3RhdHVzID0gZ2V0X3BhY2tlZF9zaXplX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSArIHBUbHYtPm9mZnNldCwgcG5OZWVkZWQsIFRMVlNfUDJQRGV2aWNlSW5mbyk7CisJCQkJYnl0ZUNvdW50ID0gMTY7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlAyUEdyb3VwSW5mbzoKKwkJCQlieXRlQ291bnQgPSAoKHREb3QxMWZUTFZQMlBHcm91cEluZm8gKikocEZybSArIHBUbHYtPm9mZnNldCkpLT5udW1fUDJQQ2xpZW50SW5mb0Rlc2M7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZQMlBHcm91cEluZm8gKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UDJQU3RhdHVzOgorCQkJCWJ5dGVDb3VudCA9IDE7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZQMlBTdGF0dXMgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UHJpbWFyeURldmljZVR5cGU6CisJCQkJYnl0ZUNvdW50ID0gODsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlJGQmFuZHM6CisJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVlJGQmFuZHMgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UmVxdWVzdERldmljZVR5cGU6CisJCQkJYnl0ZUNvdW50ID0gODsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlJlcXVlc3RUeXBlOgorCQkJCWJ5dGVDb3VudCA9IDE7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZSZXF1ZXN0VHlwZSAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZSZXNwb25zZVR5cGU6CisJCQkJYnl0ZUNvdW50ID0gMTsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVlJlc3BvbnNlVHlwZSAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZTZWxlY3RlZFJlZ2lzdHJhcjoKKwkJCQlieXRlQ291bnQgPSAxOworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOgorCQkJCWJ5dGVDb3VudCA9IDI7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2U2VyaWFsTnVtYmVyOgorCQkJCWJ5dGVDb3VudCA9ICgodERvdDExZlRMVlNlcmlhbE51bWJlciAqKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPm51bV90ZXh0OworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWU2VyaWFsTnVtYmVyICopCisJCQkJCSAgICAgIChwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlVVSURfRToKKwkJCQlieXRlQ291bnQgPSAxNjsKKwkJCQlwVGx2UHJlc2VudCA9ICgodERvdDExZlRMVlVVSURfRSAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZVVUlEX1I6CisJCQkJYnl0ZUNvdW50ID0gMTY7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZVVUlEX1IgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2VmVuZG9yRXh0ZW5zaW9uOgorCQlzdGF0dXMgPSBnZXRfcGFja2VkX3NpemVfdGx2X2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtICsgcFRsdi0+b2Zmc2V0LCBwbk5lZWRlZCwgVExWU19WZW5kb3JFeHRlbnNpb24pOworCQkJCWJ5dGVDb3VudCA9IDM7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24gKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2VmVyc2lvbjoKKwkJCQlieXRlQ291bnQgPSAxOworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWVmVyc2lvbiAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZXUFNTdGF0ZToKKwkJCQlieXRlQ291bnQgPSAxOworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWV1BTU3RhdGUgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UDJQSW50ZXJmYWNlOgorCQkJCWJ5dGVDb3VudCA9IDY7CisJCQkJcFRsdlByZXNlbnQgPSAoKHREb3QxMWZUTFZQMlBJbnRlcmZhY2UgKikKKwkJCQkJICAgICAgKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UDJQTWFuYWdlYWJpbGl0eToKKwkJCQlieXRlQ291bnQgPSAxOworCQkJCXBUbHZQcmVzZW50ID0gKCh0RG90MTFmVExWUDJQTWFuYWdlYWJpbGl0eSAqKQorCQkJCQkgICAgICAocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlGUkFNRVNfTE9HMShwQ3R4LCBGUkxPR0UsIEZSRkwoIklOVEVSTkFMIEVSUk9SLS0gSSBkb24iCisJCQkJICAgICIndCBrbm93IGFib3V0IHRoZSBUTFYgc2lnbmF0dXJlICVkOyB0aGlzIGlzIG1vc3QgbCIKKwkJCQkgICAgImlrZWx5IGEgYnVnIGluICdmcmFtZXNjJy5cbiIpLCBwVGx2LT5zaWcpOworCQkJCXJldHVybiBET1QxMUZfSU5URVJOQUxfRVJST1I7CisJCQl9CisJCQlpZiAocFRsdlByZXNlbnQpIHsKKwkJCQkqcG5OZWVkZWQgKz0gYnl0ZUNvdW50OworCQkJfQorCQl9CisJCSsrcFRsdjsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KK3ZvaWQgZG90MTFmX3BhY2tfZmZfYWlkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQl0RG90MTFmRmZBSUQgKnBTcmMsCisJCQl1aW50OF90ICpwQnVmKQoreworCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmFzc29jaWQsIDApOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl9haWQuICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfYWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICB0RG90MTFmRmZBY3Rpb24gKnBTcmMsCisJCQkgICB1aW50OF90ICpwQnVmKQoreworCSpwQnVmID0gcFNyYy0+YWN0aW9uOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl9hY3Rpb24uICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfYXV0aF9hbGdvKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgIHREb3QxMWZGZkF1dGhBbGdvICpwU3JjLAorCQkJICAgICB1aW50OF90ICpwQnVmKQoreworCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmFsZ28sIDApOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl9hdXRoX2FsZ28uICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfYXV0aF9zZXFfbm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgIHREb3QxMWZGZkF1dGhTZXFObyAqcFNyYywKKwkJCSAgICAgIHVpbnQ4X3QgKnBCdWYpCit7CisJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bm8sIDApOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl9hdXRoX3NlcV9uby4gKi8KKwordm9pZCBkb3QxMWZfcGFja19mZl9iZWFjb25faW50ZXJ2YWwodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICB0RG90MTFmRmZCZWFjb25JbnRlcnZhbCAqcFNyYywKKwkJCQkgICB1aW50OF90ICpwQnVmKQoreworCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmludGVydmFsLCAwKTsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3BhY2tfZmZfYmVhY29uX2ludGVydmFsLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX2NhcGFiaWxpdGllcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSB0RG90MTFmRmZDYXBhYmlsaXRpZXMgKnBTcmMsCisJCQkJIHVpbnQ4X3QgKnBCdWYpCit7CisJdWludDE2X3QgdG1wNjZfXzsKKwl0bXA2Nl9fID0gMFU7CisJdG1wNjZfXyB8PSAocFNyYy0+ZXNzIDw8IDApOworCXRtcDY2X18gfD0gKHBTcmMtPmlic3MgPDwgMSk7CisJdG1wNjZfXyB8PSAocFNyYy0+Y2ZQb2xsYWJsZSA8PCAyKTsKKwl0bXA2Nl9fIHw9IChwU3JjLT5jZlBvbGxSZXEgPDwgMyk7CisJdG1wNjZfXyB8PSAocFNyYy0+cHJpdmFjeSA8PCA0KTsKKwl0bXA2Nl9fIHw9IChwU3JjLT5zaG9ydFByZWFtYmxlIDw8IDUpOworCXRtcDY2X18gfD0gKHBTcmMtPnBiY2MgPDwgNik7CisJdG1wNjZfXyB8PSAocFNyYy0+Y2hhbm5lbEFnaWxpdHkgPDwgNyk7CisJdG1wNjZfXyB8PSAocFNyYy0+c3BlY3RydW1NZ3QgPDwgOCk7CisJdG1wNjZfXyB8PSAocFNyYy0+cW9zIDw8IDkpOworCXRtcDY2X18gfD0gKHBTcmMtPnNob3J0U2xvdFRpbWUgPDwgMTApOworCXRtcDY2X18gfD0gKHBTcmMtPmFwc2QgPDwgMTEpOworCXRtcDY2X18gfD0gKHBTcmMtPnJybSA8PCAxMik7CisJdG1wNjZfXyB8PSAocFNyYy0+ZHNzc09mZG0gPDwgMTMpOworCXRtcDY2X18gfD0gKHBTcmMtPmRlbGF5ZWRCQSA8PCAxNCk7CisJdG1wNjZfXyB8PSAocFNyYy0+aW1tZWRpYXRlQkEgPDwgMTUpOworCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDY2X18sIDApOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl9jYXBhYmlsaXRpZXMuICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfY2F0ZWdvcnkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgdERvdDExZkZmQ2F0ZWdvcnkgKnBTcmMsCisJCQkgICAgIHVpbnQ4X3QgKnBCdWYpCit7CisJKnBCdWYgPSBwU3JjLT5jYXRlZ29yeTsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3BhY2tfZmZfY2F0ZWdvcnkuICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfY3VycmVudF9hcF9hZGRyZXNzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICB0RG90MTFmRmZDdXJyZW50QVBBZGRyZXNzICpwU3JjLAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZikKK3sKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPm1hYywgNik7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl9wYWNrX2ZmX2N1cnJlbnRfYXBfYWRkcmVzcy4gKi8KKwordm9pZCBkb3QxMWZfcGFja19mZl9kaWFsb2dfdG9rZW4odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQl0RG90MTFmRmZEaWFsb2dUb2tlbiAqcFNyYywKKwkJCQl1aW50OF90ICpwQnVmKQoreworCSpwQnVmID0gcFNyYy0+dG9rZW47CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl9wYWNrX2ZmX2RpYWxvZ190b2tlbi4gKi8KKwordm9pZCBkb3QxMWZfcGFja19mZl9saW5rX21hcmdpbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgIHREb3QxMWZGZkxpbmtNYXJnaW4gKnBTcmMsCisJCQkgICAgICAgdWludDhfdCAqcEJ1ZikKK3sKKwkqcEJ1ZiA9IHBTcmMtPmxpbmtNYXJnaW47CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl9wYWNrX2ZmX2xpbmtfbWFyZ2luLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX2xpc3Rlbl9pbnRlcnZhbCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHREb3QxMWZGZkxpc3RlbkludGVydmFsICpwU3JjLAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYpCit7CisJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW50ZXJ2YWwsIDApOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl9saXN0ZW5faW50ZXJ2YWwuICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfbWF4X3R4X3Bvd2VyKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgICAgdERvdDExZkZmTWF4VHhQb3dlciAqcFNyYywKKwkJCSAgICAgICB1aW50OF90ICpwQnVmKQoreworCSpwQnVmID0gcFNyYy0+bWF4VHhQb3dlcjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3BhY2tfZmZfbWF4X3R4X3Bvd2VyLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX251bV9vZl9yZXBldGl0aW9ucyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdERvdDExZkZmTnVtT2ZSZXBldGl0aW9ucyAqcFNyYywKKwkJCQkgICAgIHVpbnQ4X3QgKnBCdWYpCit7CisJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+cmVwZXRpdGlvbnMsIDApOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl9udW1fb2ZfcmVwZXRpdGlvbnMuICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfb3BlcmF0aW5nX21vZGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZGZk9wZXJhdGluZ01vZGUgKnBTcmMsCisJCQkJICB1aW50OF90ICpwQnVmKQoreworCXVpbnQ4X3QgdG1wNjdfXzsKKwl0bXA2N19fID0gMFU7CisJdG1wNjdfXyB8PSAocFNyYy0+Y2hhbldpZHRoIDw8IDApOworCXRtcDY3X18gfD0gKHBTcmMtPnJlc2VydmVkIDw8IDIpOworCXRtcDY3X18gfD0gKHBTcmMtPnJ4TlNTIDw8IDQpOworCXRtcDY3X18gfD0gKHBTcmMtPnJ4TlNTVHlwZSA8PCA3KTsKKwkqcEJ1ZiA9IHRtcDY3X187CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl9wYWNrX2ZmX29wZXJhdGluZ19tb2RlLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3JjcGkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSB0RG90MTFmRmZSQ1BJICpwU3JjLAorCQkJIHVpbnQ4X3QgKnBCdWYpCit7CisJKnBCdWYgPSBwU3JjLT5yY3BpOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl9yY3BpLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3JzbmkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSB0RG90MTFmRmZSU05JICpwU3JjLAorCQkJIHVpbnQ4X3QgKnBCdWYpCit7CisJKnBCdWYgPSBwU3JjLT5yc25pOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl9yc25pLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3JlYXNvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgdERvdDExZkZmUmVhc29uICpwU3JjLAorCQkJICAgdWludDhfdCAqcEJ1ZikKK3sKKwlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jb2RlLCAwKTsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3BhY2tfZmZfcmVhc29uLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3J4X2FudGVubmFfaWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQl0RG90MTFmRmZSeEFudGVubmFJZCAqcFNyYywKKwkJCQl1aW50OF90ICpwQnVmKQoreworCSpwQnVmID0gcFNyYy0+YW50ZW5uYUlkOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl9yeF9hbnRlbm5hX2lkLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3NtX3Bvd2VyX21vZGVfc2V0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgdERvdDExZkZmU01Qb3dlck1vZGVTZXQgKnBTcmMsCisJCQkJICAgdWludDhfdCAqcEJ1ZikKK3sKKwl1aW50OF90IHRtcDY4X187CisJdG1wNjhfXyA9IDBVOworCXRtcDY4X18gfD0gKHBTcmMtPlBvd2VyU2F2ZV9FbiA8PCAwKTsKKwl0bXA2OF9fIHw9IChwU3JjLT5Nb2RlIDw8IDEpOworCXRtcDY4X18gfD0gKHBTcmMtPnJlc2VydmVkIDw8IDIpOworCSpwQnVmID0gdG1wNjhfXzsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3BhY2tfZmZfc21fcG93ZXJfbW9kZV9zZXQuICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfc3RhdHVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICB0RG90MTFmRmZTdGF0dXMgKnBTcmMsCisJCQkgICB1aW50OF90ICpwQnVmKQoreworCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnN0YXR1cywgMCk7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl9wYWNrX2ZmX3N0YXR1cy4gKi8KKwordm9pZCBkb3QxMWZfcGFja19mZl9zdGF0dXNfY29kZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgIHREb3QxMWZGZlN0YXR1c0NvZGUgKnBTcmMsCisJCQkgICAgICAgdWludDhfdCAqcEJ1ZikKK3sKKwkqcEJ1ZiA9IHBTcmMtPnN0YXR1c0NvZGU7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl9wYWNrX2ZmX3N0YXR1c19jb2RlLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3RwY19lbGVfaWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgdERvdDExZkZmVFBDRWxlSUQgKnBTcmMsCisJCQkgICAgIHVpbnQ4X3QgKnBCdWYpCit7CisJKnBCdWYgPSBwU3JjLT5UUENJZDsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3BhY2tfZmZfdHBjX2VsZV9pZC4gKi8KKwordm9pZCBkb3QxMWZfcGFja19mZl90cGNfZWxlX2xlbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgdERvdDExZkZmVFBDRWxlTGVuICpwU3JjLAorCQkJICAgICAgdWludDhfdCAqcEJ1ZikKK3sKKwkqcEJ1ZiA9IHBTcmMtPlRQQ0xlbjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3BhY2tfZmZfdHBjX2VsZV9sZW4uICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfdHNfaW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgdERvdDExZkZmVFNJbmZvICpwU3JjLAorCQkJICAgdWludDhfdCAqcEJ1ZikKK3sKKwl1aW50MzJfdCB0bXA2OV9fOworCXRtcDY5X18gPSAwVTsKKwl0bXA2OV9fIHw9IChwU3JjLT50cmFmZmljX3R5cGUgPDwgMCk7CisJdG1wNjlfXyB8PSAocFNyYy0+dHNpZCA8PCAxKTsKKwl0bXA2OV9fIHw9IChwU3JjLT5kaXJlY3Rpb24gPDwgNSk7CisJdG1wNjlfXyB8PSAocFNyYy0+YWNjZXNzX3BvbGljeSA8PCA3KTsKKwl0bXA2OV9fIHw9IChwU3JjLT5hZ2dyZWdhdGlvbiA8PCA5KTsKKwl0bXA2OV9fIHw9IChwU3JjLT5wc2IgPDwgMTApOworCXRtcDY5X18gfD0gKHBTcmMtPnVzZXJfcHJpb3JpdHkgPDwgMTEpOworCXRtcDY5X18gfD0gKHBTcmMtPnRzaW5mb19hY2tfcG9sIDw8IDE0KTsKKwl0bXA2OV9fIHw9IChwU3JjLT5zY2hlZHVsZSA8PCAxNik7CisJdG1wNjlfXyB8PSAocFNyYy0+dW51c2VkIDw8IDE3KTsKKwlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCB0bXA2OV9fLCAwKTsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3BhY2tfZmZfdHNfaW5mby4gKi8KKwordm9pZCBkb3QxMWZfcGFja19mZl90aW1lX3N0YW1wKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgICB0RG90MTFmRmZUaW1lU3RhbXAgKnBTcmMsCisJCQkgICAgICB1aW50OF90ICpwQnVmKQoreworCWZyYW1lc2h0b25xKHBDdHgsIHBCdWYsIHBTcmMtPnRpbWVzdGFtcCwgMCk7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl9wYWNrX2ZmX3RpbWVfc3RhbXAuICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfdHJhbnNhY3Rpb25faWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZGZlRyYW5zYWN0aW9uSWQgKnBTcmMsCisJCQkJICB1aW50OF90ICpwQnVmKQoreworCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+dHJhbnNJZCwgMik7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl9wYWNrX2ZmX3RyYW5zYWN0aW9uX2lkLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3R4X2FudGVubmFfaWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQl0RG90MTFmRmZUeEFudGVubmFJZCAqcFNyYywKKwkJCQl1aW50OF90ICpwQnVmKQoreworCSpwQnVmID0gcFNyYy0+YW50ZW5uYUlkOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl90eF9hbnRlbm5hX2lkLiAqLworCit2b2lkIGRvdDExZl9wYWNrX2ZmX3R4X3Bvd2VyKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgdERvdDExZkZmVHhQb3dlciAqcFNyYywKKwkJCSAgICB1aW50OF90ICpwQnVmKQoreworCSpwQnVmID0gcFNyYy0+dHhQb3dlcjsKKwkodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmX3BhY2tfZmZfdHhfcG93ZXIuICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfdmh0X21lbWJlcnNoaXBfc3RhdHVzX2FycmF5KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgICAgdERvdDExZkZmVmh0TWVtYmVyc2hpcFN0YXR1c0FycmF5ICpwU3JjLAorCQkJCQkgICAgIHVpbnQ4X3QgKnBCdWYpCit7CisJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5tZW1iZXJzaGlwU3RhdHVzQXJyYXksIDgpOworCSh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19mZl92aHRfbWVtYmVyc2hpcF9zdGF0dXNfYXJyYXkuICovCisKK3ZvaWQgZG90MTFmX3BhY2tfZmZfdmh0X3VzZXJfcG9zaXRpb25fYXJyYXkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHREb3QxMWZGZlZodFVzZXJQb3NpdGlvbkFycmF5ICpwU3JjLAorCQkJCQkgdWludDhfdCAqcEJ1ZikKK3sKKwlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPnVzZXJQb3NpdGlvbkFycmF5LCAxNik7CisJKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZl9wYWNrX2ZmX3ZodF91c2VyX3Bvc2l0aW9uX2FycmF5LiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfYXV0aG9yaXplZF9tYV9jcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQl0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MgKnBTcmMsCisJCQkJCXVpbnQ4X3QgKnBCdWYsCisJCQkJCXVpbnQzMl90IG5CdWYsCisJCQkJCXVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSA4OworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJKnBCdWYgPSAxOworCQlwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+bWFjLCA2KTsKKwkJKnBuQ29uc3VtZWQgKz0gNjsKKwkJcEJ1ZiArPSA2OworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQkqcFRsdkxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9hdXRob3JpemVkX21hX2NzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcmVxdWVzdF90b19lbnJvbGwodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHREb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwgKnBTcmMsCisJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkgdWludDMyX3QgbkJ1ZiwKKwkJCQkJIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSAzOworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJKnBCdWYgPSAzOworCQlwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisJCSpwQnVmID0gcFNyYy0+cmVxOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCSpwVGx2TGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X3JlcXVlc3RfdG9fZW5yb2xsLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfdmVyc2lvbjIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZUTFZWZXJzaW9uMiAqcFNyYywKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcFRsdkxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwl1aW50OF90IHRtcDcwX187CisJbk5lZWRlZCArPSAzOworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJKnBCdWYgPSAwOworCQlwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisJCXRtcDcwX18gPSAwVTsKKwkJdG1wNzBfXyB8PSAocFNyYy0+bWlub3IgPDwgMCk7CisJCXRtcDcwX18gfD0gKHBTcmMtPm1ham9yIDw8IDQpOworCQkqcEJ1ZiA9IHRtcDcwX187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCSpwVGx2TGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X3ZlcnNpb24yLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfYXBfc2V0dXBfbG9ja2VkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHREb3QxMWZUTFZBUFNldHVwTG9ja2VkICpwU3JjLAorCQkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gNTsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxODMsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCSpwQnVmID0gcFNyYy0+ZkxvY2tlZDsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X2FwX3NldHVwX2xvY2tlZC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X2Fzc29jaWF0aW9uX3N0YXRlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgdERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUgKnBTcmMsCisJCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCQkgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSA2OworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgNDA5OCwgMSk7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJcFRsdkxlbiA9IHBCdWY7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+c3RhdGUsIDEpOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja190bHZfYXNzb2NpYXRpb25fc3RhdGUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9jb25maWdfbWV0aG9kcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgICB0RG90MTFmVExWQ29uZmlnTWV0aG9kcyAqcFNyYywKKwkJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcFRsdkxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICs9IDY7CisJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCA0MTA0LCAxKTsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tZXRob2RzLCAxKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X2NvbmZpZ19tZXRob2RzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfY29uZmlndXJhdGlvbl9lcnJvcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICAgdERvdDExZlRMVkNvbmZpZ3VyYXRpb25FcnJvciAqcFNyYywKKwkJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICB1aW50MzJfdCBuQnVmLAorCQkJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcFRsdkxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICs9IDY7CisJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCA0MTA1LCAxKTsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5lcnJvciwgMSk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9jb25maWd1cmF0aW9uX2Vycm9yLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfZGV2aWNlX25hbWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdERvdDExZlRMVkRldmljZU5hbWUgKnBTcmMsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSAocFNyYy0+bnVtX3RleHQgKyA0KSA7CisKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxMTMsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT50ZXh0KSwgcFNyYy0+bnVtX3RleHQpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fdGV4dDsKKwkJcEJ1ZiArPSBwU3JjLT5udW1fdGV4dDsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9kZXZpY2VfbmFtZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X2RldmljZV9wYXNzd29yZF9pZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgIHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElEICpwU3JjLAorCQkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgdWludDMyX3QgbkJ1ZiwKKwkJCQkJICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gNjsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxMTQsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmlkLCAxKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X2RldmljZV9wYXNzd29yZF9pZC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X2V4dGVuZGVkX2xpc3Rlbl90aW1pbmcodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgICAgdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nICpwU3JjLAorCQkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCQkgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gNzsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCSpwQnVmID0gODsKKwkJcEJ1ZiArPSAxOyAqcG5Db25zdW1lZCArPSAxOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hdmFpbGliaWxpdHlQZXJpb2QsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmF2YWlsaWJpbGl0eUludGVydmFsLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X2V4dGVuZGVkX2xpc3Rlbl90aW1pbmcuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9saXN0ZW5fY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgICB0RG90MTFmVExWTGlzdGVuQ2hhbm5lbCAqcFNyYywKKwkJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcFRsdkxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICs9IDg7CisJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQkqcEJ1ZiA9IDY7CisJCXBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKwkJcFRsdkxlbiA9IHBCdWY7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5jb3VudHJ5U3RyaW5nLCAzKTsKKwkJKnBuQ29uc3VtZWQgKz0gMzsKKwkJcEJ1ZiArPSAzOworCQkqcEJ1ZiA9IHBTcmMtPnJlZ3VsYXRvcnlDbGFzczsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPmNoYW5uZWw7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMywgMCk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9saXN0ZW5fY2hhbm5lbC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X21hbnVmYWN0dXJlcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHREb3QxMWZUTFZNYW51ZmFjdHVyZXIgKnBTcmMsCisJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSAocFNyYy0+bnVtX25hbWUgKyA0KSA7CisKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxMjksIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5uYW1lKSwgcFNyYy0+bnVtX25hbWUpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fbmFtZTsKKwkJcEJ1ZiArPSBwU3JjLT5udW1fbmFtZTsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9tYW51ZmFjdHVyZXIuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9taW5vcl9yZWFzb25fY29kZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgdERvdDExZlRMVk1pbm9yUmVhc29uQ29kZSAqcFNyYywKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50MzJfdCBuQnVmLAorCQkJCQkgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcFRsdkxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICs9IDQ7CisJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQkqcEJ1ZiA9IDE7CisJCXBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKwkJcFRsdkxlbiA9IHBCdWY7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJKnBCdWYgPSBwU3JjLT5taW5vclJlYXNvbkNvZGU7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMywgMCk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9taW5vcl9yZWFzb25fY29kZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X21vZGVsX25hbWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICB0RG90MTFmVExWTW9kZWxOYW1lICpwU3JjLAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gKHBTcmMtPm51bV90ZXh0ICsgNCkgOworCisJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCA0MTMxLCAxKTsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+dGV4dCksIHBTcmMtPm51bV90ZXh0KTsKKwkJKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3RleHQ7CisJCXBCdWYgKz0gcFNyYy0+bnVtX3RleHQ7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja190bHZfbW9kZWxfbmFtZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X21vZGVsX251bWJlcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdERvdDExZlRMVk1vZGVsTnVtYmVyICpwU3JjLAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gKHBTcmMtPm51bV90ZXh0ICsgNCkgOworCisJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCA0MTMyLCAxKTsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+dGV4dCksIHBTcmMtPm51bV90ZXh0KTsKKwkJKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3RleHQ7CisJCXBCdWYgKz0gcFNyYy0+bnVtX3RleHQ7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja190bHZfbW9kZWxfbnVtYmVyLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfbm90aWNlX29mX2Fic2VuY2UodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJIHREb3QxMWZUTFZOb3RpY2VPZkFic2VuY2UgKnBTcmMsCisJCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCQkgdWludDMyX3QgbkJ1ZiwKKwkJCQkJIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSAocFNyYy0+bnVtX05vQURlc2MgKyA1KSA7CisKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCSpwQnVmID0gMTI7CisJCXBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKwkJcFRsdkxlbiA9IHBCdWY7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJKnBCdWYgPSBwU3JjLT5pbmRleDsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPkNUU1dpbmRvd09wcFBTOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5Ob0FEZXNjKSwgcFNyYy0+bnVtX05vQURlc2MpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fTm9BRGVzYzsKKwkJcEJ1ZiArPSBwU3JjLT5udW1fTm9BRGVzYzsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMywgMCk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9ub3RpY2Vfb2ZfYWJzZW5jZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X29wZXJhdGluZ19jaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgdERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwgKnBTcmMsCisJCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCQkgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSA4OworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJKnBCdWYgPSAxNzsKKwkJcEJ1ZiArPSAxOyAqcG5Db25zdW1lZCArPSAxOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmNvdW50cnlTdHJpbmcsIDMpOworCQkqcG5Db25zdW1lZCArPSAzOworCQlwQnVmICs9IDM7CisJCSpwQnVmID0gcFNyYy0+cmVndWxhdG9yeUNsYXNzOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+Y2hhbm5lbDsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X29wZXJhdGluZ19jaGFubmVsLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcDJfcF9jYXBhYmlsaXR5KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5ICpwU3JjLAorCQkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gNTsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCSpwQnVmID0gMjsKKwkJcEJ1ZiArPSAxOyAqcG5Db25zdW1lZCArPSAxOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQkqcEJ1ZiA9IHBTcmMtPmRldmljZUNhcGFiaWxpdHk7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5ncm91cENhcGFiaWxpdHk7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMywgMCk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9wMl9wX2NhcGFiaWxpdHkuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9wMl9wX2RldmljZV9pZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdERvdDExZlRMVlAyUERldmljZUlkICpwU3JjLAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gOTsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCSpwQnVmID0gMzsKKwkJcEJ1ZiArPSAxOyAqcG5Db25zdW1lZCArPSAxOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPlAyUERldmljZUFkZHJlc3MsIDYpOworCQkqcG5Db25zdW1lZCArPSA2OworCQlwQnVmICs9IDY7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDMsIDApOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja190bHZfcDJfcF9kZXZpY2VfaWQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9wMl9wX2RldmljZV9pbmZvKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvICpwU3JjLAorCQkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQzMl90IGlkeCA9IDA7CisJbk5lZWRlZCArPSAxOTsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCSpwQnVmID0gMTM7CisJCXBCdWYgKz0gMTsgbkJ1ZiAtPSAxOyAqcG5Db25zdW1lZCArPSAxOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyBuQnVmIC09IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+UDJQRGV2aWNlQWRkcmVzcywgNik7CisJCSpwbkNvbnN1bWVkICs9IDY7CisJCXBCdWYgKz0gNjsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y29uZmlnTWV0aG9kLCAxKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPnByaW1hcnlEZXZpY2VUeXBlLCA4KTsKKwkJKnBuQ29uc3VtZWQgKz0gODsKKwkJcEJ1ZiArPSA4OworCQlzdGF0dXMgfD0gcGFja190bHZfY29yZShwQ3R4LAorCQkJCSh1aW50OF90ICopcFNyYywKKwkJCQlwQnVmLAorCQkJCW5CdWYsCisJCQkJcG5Db25zdW1lZCwKKwkJCQlUTFZTX1AyUERldmljZUluZm8sICZpZHgpOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9wMl9wX2RldmljZV9pbmZvLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcDJfcF9ncm91cF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgdERvdDExZlRMVlAyUEdyb3VwSW5mbyAqcFNyYywKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcFRsdkxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICs9IChwU3JjLT5udW1fUDJQQ2xpZW50SW5mb0Rlc2MgKyAzKSA7CisKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCSpwQnVmID0gMTQ7CisJCXBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKwkJcFRsdkxlbiA9IHBCdWY7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKHBTcmMtPlAyUENsaWVudEluZm9EZXNjKSwgcFNyYy0+bnVtX1AyUENsaWVudEluZm9EZXNjKTsKKwkJKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX1AyUENsaWVudEluZm9EZXNjOworCQlwQnVmICs9IHBTcmMtPm51bV9QMlBDbGllbnRJbmZvRGVzYzsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMywgMCk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9wMl9wX2dyb3VwX2luZm8uICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9wMl9wX3N0YXR1cyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHREb3QxMWZUTFZQMlBTdGF0dXMgKnBTcmMsCisJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSA0OworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJKnBCdWYgPSAwOworCQlwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCSpwQnVmID0gcFNyYy0+c3RhdHVzOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDMsIDApOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja190bHZfcDJfcF9zdGF0dXMuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9wcmltYXJ5X2RldmljZV90eXBlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgIHREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSAqcFNyYywKKwkJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkJICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcFRsdkxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICs9IDEyOworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgNDE4MCwgMSk7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJcFRsdkxlbiA9IHBCdWY7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+cHJpbWFyeV9jYXRlZ29yeSwgMSk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5vdWksIDQpOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnN1Yl9jYXRlZ29yeSwgMSk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9wcmltYXJ5X2RldmljZV90eXBlLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcmZfYmFuZHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgdERvdDExZlRMVlJGQmFuZHMgKnBTcmMsCisJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJIHVpbnQzMl90IG5CdWYsCisJCQkJIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSA1OworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgNDE1NiwgMSk7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJcFRsdkxlbiA9IHBCdWY7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJKnBCdWYgPSBwU3JjLT5iYW5kczsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X3JmX2JhbmRzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfcmVxdWVzdF9kZXZpY2VfdHlwZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICB0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUgKnBTcmMsCisJCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgIHVpbnQzMl90IG5CdWYsCisJCQkJCSAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSAxMjsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQyMDIsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnByaW1hcnlfY2F0ZWdvcnksIDEpOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+b3VpLCA0KTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5zdWJfY2F0ZWdvcnksIDEpOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja190bHZfcmVxdWVzdF9kZXZpY2VfdHlwZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3JlcXVlc3RfdHlwZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdERvdDExZlRMVlJlcXVlc3RUeXBlICpwU3JjLAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gNTsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxNTQsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCSpwQnVmID0gcFNyYy0+cmVxVHlwZTsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X3JlcXVlc3RfdHlwZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3Jlc3BvbnNlX3R5cGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB0RG90MTFmVExWUmVzcG9uc2VUeXBlICpwU3JjLAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gNTsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxNTUsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCSpwQnVmID0gcFNyYy0+cmVzVHlwZTsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X3Jlc3BvbnNlX3R5cGUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9zZWxlY3RlZF9yZWdpc3RyYXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgdERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyICpwU3JjLAorCQkJCQkgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICB1aW50MzJfdCBuQnVmLAorCQkJCQkgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gNTsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxNjEsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCSpwQnVmID0gcFNyYy0+c2VsZWN0ZWQ7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9zZWxlY3RlZF9yZWdpc3RyYXIuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9zZWxlY3RlZF9yZWdpc3RyYXJfY29uZmlnX21ldGhvZHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJCQl0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzICpwU3JjLAorCQkJCQkJCXVpbnQ4X3QgKnBCdWYsCisJCQkJCQkJdWludDMyX3QgbkJ1ZiwKKwkJCQkJCQl1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gNjsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxNzksIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm1ldGhvZHMsIDEpOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja190bHZfc2VsZWN0ZWRfcmVnaXN0cmFyX2NvbmZpZ19tZXRob2RzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfc2VyaWFsX251bWJlcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHREb3QxMWZUTFZTZXJpYWxOdW1iZXIgKnBTcmMsCisJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSAocFNyYy0+bnVtX3RleHQgKyA0KSA7CisKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxNjIsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT50ZXh0KSwgcFNyYy0+bnVtX3RleHQpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fdGV4dDsKKwkJcEJ1ZiArPSBwU3JjLT5udW1fdGV4dDsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl9zZXJpYWxfbnVtYmVyLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190bHZfdXVpZF9lKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJdERvdDExZlRMVlVVSURfRSAqcFNyYywKKwkJCQl1aW50OF90ICpwQnVmLAorCQkJCXVpbnQzMl90IG5CdWYsCisJCQkJdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcFRsdkxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICs9IDIwOworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgNDE2NywgMSk7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJcFRsdkxlbiA9IHBCdWY7CisJCXBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT51dWlkLCAxNik7CisJCSpwbkNvbnN1bWVkICs9IDE2OworCQlwQnVmICs9IDE2OworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X3V1aWRfZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3V1aWRfcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCXREb3QxMWZUTFZVVUlEX1IgKnBTcmMsCisJCQkJdWludDhfdCAqcEJ1ZiwKKwkJCQl1aW50MzJfdCBuQnVmLAorCQkJCXVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSAyMDsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxNjgsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+dXVpZCwgMTYpOworCQkqcG5Db25zdW1lZCArPSAxNjsKKwkJcEJ1ZiArPSAxNjsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl91dWlkX3IuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl92ZW5kb3JfZXh0ZW5zaW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSB0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uICpwU3JjLAorCQkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkJIHVpbnQzMl90IG5CdWYsCisJCQkJCSB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQzMl90IGlkeCA9IDA7CisJbk5lZWRlZCArPSA3OworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgNDE2OSwgMSk7CisJCXBCdWYgKz0gMjsgbkJ1ZiAtPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyBuQnVmIC09IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+dmVuZG9ySWQsIDMpOworCQkqcG5Db25zdW1lZCArPSAzOworCQlwQnVmICs9IDM7CisJCXN0YXR1cyB8PSBwYWNrX3Rsdl9jb3JlKHBDdHgsCisJCQkJKHVpbnQ4X3QgKilwU3JjLAorCQkJCXBCdWYsCisJCQkJbkJ1ZiwKKwkJCQlwbkNvbnN1bWVkLAorCQkJCVRMVlNfVmVuZG9yRXh0ZW5zaW9uLCAmaWR4KTsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja190bHZfdmVuZG9yX2V4dGVuc2lvbi4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3ZlcnNpb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgdERvdDExZlRMVlZlcnNpb24gKnBTcmMsCisJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJIHVpbnQzMl90IG5CdWYsCisJCQkJIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDhfdCB0bXA3MV9fOworCW5OZWVkZWQgKz0gNTsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxNzAsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXRtcDcxX18gPSAwVTsKKwkJdG1wNzFfXyB8PSAocFNyYy0+bWlub3IgPDwgMCk7CisJCXRtcDcxX18gfD0gKHBTcmMtPm1ham9yIDw8IDQpOworCQkqcEJ1ZiA9IHRtcDcxX187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja190bHZfdmVyc2lvbi4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGx2X3dwc19zdGF0ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgdERvdDExZlRMVldQU1N0YXRlICpwU3JjLAorCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgIHVpbnQzMl90IG5CdWYsCisJCQkJICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwVGx2TGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgKz0gNTsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDQxNjQsIDEpOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCSpwQnVmID0gcFNyYy0+c3RhdGU7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBUbHZMZW4pIHsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX3Rsdl93cHNfc3RhdGUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9wMl9wX2ludGVyZmFjZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHREb3QxMWZUTFZQMlBJbnRlcmZhY2UgKnBTcmMsCisJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBUbHZMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCArPSA5OworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJKnBCdWYgPSAxNjsKKwkJcEJ1ZiArPSAxOyAqcG5Db25zdW1lZCArPSAxOworCQlwVGx2TGVuID0gcEJ1ZjsKKwkJcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPlAyUERldmljZUFkZHJlc3MsIDYpOworCQkqcG5Db25zdW1lZCArPSA2OworCQlwQnVmICs9IDY7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwVGx2TGVuKSB7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDMsIDApOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja190bHZfcDJfcF9pbnRlcmZhY2UuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Rsdl9wMl9wX21hbmFnZWFiaWxpdHkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICB0RG90MTFmVExWUDJQTWFuYWdlYWJpbGl0eSAqcFNyYywKKwkJCQkJICB1aW50OF90ICpwQnVmLAorCQkJCQkgIHVpbnQzMl90IG5CdWYsCisJCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcFRsdkxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICs9IDQ7CisJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQkqcEJ1ZiA9IDEwOworCQlwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisJCXBUbHZMZW4gPSBwQnVmOworCQlwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisJCSpwQnVmID0gcFNyYy0+bWFuYWdlYWJpbGl0eTsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocFRsdkxlbikgeworCQlmcmFtZXNodG9ucyhwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfdGx2X3AyX3BfbWFuYWdlYWJpbGl0eS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfY29uZGVuc2VkX2NvdW50cnlfc3RyKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgICB0RG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyICpwU3JjLAorCQkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkJCSAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMjsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+Y291bnRyeVN0ciwgMik7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX2NvbmRlbnNlZF9jb3VudHJ5X3N0ci4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZ3RrKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgdERvdDExZklFR1RLICpwU3JjLAorCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCSAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDE2X3QgdG1wNzJfXzsKKwluTmVlZGVkICArPSAgKHBTcmMtPm51bV9rZXkgKyAxMSk7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQl0bXA3Ml9fID0gMFU7CisJCXRtcDcyX18gfD0gKHBTcmMtPmtleUlkIDw8IDApOworCQl0bXA3Ml9fIHw9IChwU3JjLT5yZXNlcnZlZCA8PCAyKTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgdG1wNzJfXywgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJbkJ1ZiAtPSAgMiA7CisJCSpwQnVmID0gcFNyYy0+a2V5TGVuZ3RoOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+UlNDLCA4KTsKKwkJKnBuQ29uc3VtZWQgKz0gODsKKwkJcEJ1ZiArPSA4OworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+a2V5KSwgcFNyYy0+bnVtX2tleSk7CisJCSpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9rZXk7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX2d0ay4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfaWd0ayh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICB0RG90MTFmSUVJR1RLICpwU3JjLAorCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICB1aW50MzJfdCBuQnVmLAorCQkJICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMzM7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmtleUlELCAyKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPklQTiwgNik7CisJCSpwbkNvbnN1bWVkICs9IDY7CisJCXBCdWYgKz0gNjsKKwkJKnBCdWYgPSBwU3JjLT5rZXlMZW5ndGg7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5rZXksIDI0KTsKKwkJKnBuQ29uc3VtZWQgKz0gMjQ7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX2lndGsuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3IwX2toX2lkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJdERvdDExZklFUjBLSF9JRCAqcFNyYywKKwkJCQl1aW50OF90ICpwQnVmLAorCQkJCXVpbnQzMl90IG5CdWYsCisJCQkJdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICBwU3JjLT5udW1fUE1LX1IwX0lEOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDM7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKHBTcmMtPlBNS19SMF9JRCksIHBTcmMtPm51bV9QTUtfUjBfSUQpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fUE1LX1IwX0lEOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9yMF9raF9pZC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcjFfa2hfaWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQl0RG90MTFmSUVSMUtIX0lEICpwU3JjLAorCQkJCXVpbnQ4X3QgKnBCdWYsCisJCQkJdWludDMyX3QgbkJ1ZiwKKwkJCQl1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gNjsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+UE1LX1IxX0lELCA2KTsKKwkJKnBuQ29uc3VtZWQgKz0gNjsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfcjFfa2hfaWQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3RzZl9pbmZvKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJdERvdDExZklFVFNGSW5mbyAqcFNyYywKKwkJCQl1aW50OF90ICpwQnVmLAorCQkJCXVpbnQzMl90IG5CdWYsCisJCQkJdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDQ7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5Uc2ZPZmZzZXQsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPkJlYWNvbkludHZsLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfdHNmX2luZm8uICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2FwX2NoYW5uZWxfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCXREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCAqcFNyYywKKwkJCQkJdWludDhfdCAqcEJ1ZiwKKwkJCQkJdWludDMyX3QgbkJ1ZiwKKwkJCQkJdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICAocFNyYy0+bnVtX2NoYW5uZWxMaXN0ICsgMSk7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNTE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT5yZWd1bGF0b3J5Q2xhc3M7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKHBTcmMtPmNoYW5uZWxMaXN0KSwgcFNyYy0+bnVtX2NoYW5uZWxMaXN0KTsKKwkJKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX2NoYW5uZWxMaXN0OworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9hcF9jaGFubmVsX3JlcG9ydC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfYmNuX3JlcG9ydGluZ19kZXRhaWwodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgdERvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsICpwU3JjLAorCQkJCQkgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICB1aW50MzJfdCBuQnVmLAorCQkJCQkgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+cmVwb3J0aW5nRGV0YWlsOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9iY25fcmVwb3J0aW5nX2RldGFpbC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfYmVhY29uX3JlcG9ydF9mcm1fYm9keSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICAgdERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSAqcFNyYywKKwkJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICB1aW50MzJfdCBuQnVmLAorCQkJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICBwU3JjLT5udW1fcmVwb3J0ZWRGaWVsZHM7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+cmVwb3J0ZWRGaWVsZHMpLCBwU3JjLT5udW1fcmVwb3J0ZWRGaWVsZHMpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fcmVwb3J0ZWRGaWVsZHM7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX2JlYWNvbl9yZXBvcnRfZnJtX2JvZHkuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2JlYWNvbl9yZXBvcnRpbmcodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJdERvdDExZklFQmVhY29uUmVwb3J0aW5nICpwU3JjLAorCQkJCQl1aW50OF90ICpwQnVmLAorCQkJCQl1aW50MzJfdCBuQnVmLAorCQkJCQl1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMjsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+cmVwb3J0aW5nQ29uZGl0aW9uOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+dGhyZXNob2xkOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9iZWFjb25fcmVwb3J0aW5nLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9tZWFzdXJlbWVudF9waWxvdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgdERvdDExZklFTWVhc3VyZW1lbnRQaWxvdCAqcFNyYywKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50MzJfdCBuQnVmLAorCQkJCQkgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICAocFNyYy0+bnVtX3ZlbmRvclNwZWNpZmljICsgMSk7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNjY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT5tZWFzdXJlbWVudFBpbG90OworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT52ZW5kb3JTcGVjaWZpYyksIHBTcmMtPm51bV92ZW5kb3JTcGVjaWZpYyk7CisJCSpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV92ZW5kb3JTcGVjaWZpYzsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfbWVhc3VyZW1lbnRfcGlsb3QuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX211bHRpX2Jzc2lkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgdERvdDExZklFTXVsdGlCc3NpZCAqcFNyYywKKwkJCQkgICB1aW50OF90ICpwQnVmLAorCQkJCSAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICAocFNyYy0+bnVtX3ZlbmRvclNwZWNpZmljICsgMSk7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNzE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT5tYXhCU1NJREluZGljYXRvcjsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+dmVuZG9yU3BlY2lmaWMpLCBwU3JjLT5udW1fdmVuZG9yU3BlY2lmaWMpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fdmVuZG9yU3BlY2lmaWM7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX211bHRpX2Jzc2lkLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9yaWNfZGF0YSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCXREb3QxMWZJRVJJQ0RhdGEgKnBTcmMsCisJCQkJdWludDhfdCAqcEJ1ZiwKKwkJCQl1aW50MzJfdCBuQnVmLAorCQkJCXVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSA0OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDU3OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+SWRlbnRpZmllcjsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPnJlc291cmNlRGVzY0NvdW50OworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnN0YXR1c0NvZGUsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9yaWNfZGF0YS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcmljX2Rlc2NyaXB0b3IodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB0RG90MTFmSUVSSUNEZXNjcmlwdG9yICpwU3JjLAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gIChwU3JjLT5udW1fdmFyaWFibGVEYXRhICsgMSk7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNzU7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT5yZXNvdXJjZVR5cGU7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKHBTcmMtPnZhcmlhYmxlRGF0YSksIHBTcmMtPm51bV92YXJpYWJsZURhdGEpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fdmFyaWFibGVEYXRhOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9yaWNfZGVzY3JpcHRvci4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcnJtX2VuYWJsZWRfY2FwKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgdERvdDExZklFUlJNRW5hYmxlZENhcCAqcFNyYywKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQ4X3QgdG1wNzNfXzsKKwl1aW50OF90IHRtcDc0X187CisJdWludDhfdCB0bXA3NV9fOworCXVpbnQ4X3QgdG1wNzZfXzsKKwl1aW50OF90IHRtcDc3X187CisJbk5lZWRlZCAgKz0gNTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA3MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQl0bXA3M19fID0gMFU7CisJCXRtcDczX18gfD0gKHBTcmMtPkxpbmtNZWFzdXJlbWVudCA8PCAwKTsKKwkJdG1wNzNfXyB8PSAocFNyYy0+TmVpZ2hib3JScHQgPDwgMSk7CisJCXRtcDczX18gfD0gKHBTcmMtPnBhcmFsbGVsIDw8IDIpOworCQl0bXA3M19fIHw9IChwU3JjLT5yZXBlYXRlZCA8PCAzKTsKKwkJdG1wNzNfXyB8PSAocFNyYy0+QmVhY29uUGFzc2l2ZSA8PCA0KTsKKwkJdG1wNzNfXyB8PSAocFNyYy0+QmVhY29uQWN0aXZlIDw8IDUpOworCQl0bXA3M19fIHw9IChwU3JjLT5CZWFjb25UYWJsZSA8PCA2KTsKKwkJdG1wNzNfXyB8PSAocFNyYy0+QmVhY29uUmVwQ29uZCA8PCA3KTsKKwkJKnBCdWYgPSB0bXA3M19fOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCW5CdWYgLT0gIDEgOworCQl0bXA3NF9fID0gMFU7CisJCXRtcDc0X18gfD0gKHBTcmMtPkZyYW1lTWVhc3VyZW1lbnQgPDwgMCk7CisJCXRtcDc0X18gfD0gKHBTcmMtPkNoYW5uZWxMb2FkIDw8IDEpOworCQl0bXA3NF9fIHw9IChwU3JjLT5Ob2lzZUhpc3RvZ3JhbSA8PCAyKTsKKwkJdG1wNzRfXyB8PSAocFNyYy0+c3RhdGlzdGljcyA8PCAzKTsKKwkJdG1wNzRfXyB8PSAocFNyYy0+TENJTWVhc3VyZW1lbnQgPDwgNCk7CisJCXRtcDc0X18gfD0gKHBTcmMtPkxDSUF6aW11dGggPDwgNSk7CisJCXRtcDc0X18gfD0gKHBTcmMtPlRDTUNhcGFiaWxpdHkgPDwgNik7CisJCXRtcDc0X18gfD0gKHBTcmMtPnRyaWdnZXJlZFRDTSA8PCA3KTsKKwkJKnBCdWYgPSB0bXA3NF9fOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCW5CdWYgLT0gIDEgOworCQl0bXA3NV9fID0gMFU7CisJCXRtcDc1X18gfD0gKHBTcmMtPkFQQ2hhblJlcG9ydCA8PCAwKTsKKwkJdG1wNzVfXyB8PSAocFNyYy0+UlJNTUlCRW5hYmxlZCA8PCAxKTsKKwkJdG1wNzVfXyB8PSAocFNyYy0+b3BlcmF0aW5nQ2hhbk1heCA8PCAyKTsKKwkJdG1wNzVfXyB8PSAocFNyYy0+bm9uT3BlcmF0aW5DaGFuTWF4IDw8IDUpOworCQkqcEJ1ZiA9IHRtcDc1X187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCXRtcDc2X18gPSAwVTsKKwkJdG1wNzZfXyB8PSAocFNyYy0+TWVhc3VyZW1lbnRQaWxvdCA8PCAwKTsKKwkJdG1wNzZfXyB8PSAocFNyYy0+TWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQgPDwgMyk7CisJCXRtcDc2X18gfD0gKHBTcmMtPk5laWdoYm9yVFNGT2Zmc2V0IDw8IDQpOworCQl0bXA3Nl9fIHw9IChwU3JjLT5SQ1BJTWVhc3VyZW1lbnQgPDwgNSk7CisJCXRtcDc2X18gfD0gKHBTcmMtPlJTTklNZWFzdXJlbWVudCA8PCA2KTsKKwkJdG1wNzZfXyB8PSAocFNyYy0+QnNzQXZnQWNjZXNzRGVsYXkgPDwgNyk7CisJCSpwQnVmID0gdG1wNzZfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQluQnVmIC09ICAxIDsKKwkJdG1wNzdfXyA9IDBVOworCQl0bXA3N19fIHw9IChwU3JjLT5CU1NBdmFpbEFkbWlzc2lvbiA8PCAwKTsKKwkJdG1wNzdfXyB8PSAocFNyYy0+QW50ZW5uYUluZm9ybWF0aW9uIDw8IDEpOworCQl0bXA3N19fIHw9IChwU3JjLT5maW5lX3RpbWVfbWVhc19ycHQgPDwgMik7CisJCXRtcDc3X18gfD0gKHBTcmMtPmxjaV9jYXBhYmlsaXR5IDw8IDMpOworCQl0bXA3N19fIHw9IChwU3JjLT5yZXNlcnZlZCA8PCA0KTsKKwkJKnBCdWYgPSB0bXA3N19fOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnICA9IDEgKi8KKwkJbkJ1ZiAtPSAgMSA7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3JybV9lbmFibGVkX2NhcC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcmVxdWVzdGVkX2luZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB0RG90MTFmSUVSZXF1ZXN0ZWRJbmZvICpwU3JjLAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9yZXF1ZXN0ZWRfZWlkczsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAxMDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+cmVxdWVzdGVkX2VpZHMpLCBwU3JjLT5udW1fcmVxdWVzdGVkX2VpZHMpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fcmVxdWVzdGVkX2VpZHM7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3JlcXVlc3RlZF9pbmZvLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9zc2lkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgIHREb3QxMWZJRVNTSUQgKnBTcmMsCisJCQkgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgIHVpbnQzMl90IG5CdWYsCisJCQkgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAgcFNyYy0+bnVtX3NzaWQ7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+c3NpZCksIHBTcmMtPm51bV9zc2lkKTsKKwkJKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3NzaWQ7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3NzaWQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3NjaGVkdWxlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHREb3QxMWZJRVNjaGVkdWxlICpwU3JjLAorCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCSB1aW50MzJfdCBuQnVmLAorCQkJCSB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDE2X3QgdG1wNzhfXzsKKwluTmVlZGVkICArPSAxNDsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAxNTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQl0bXA3OF9fID0gMFU7CisJCXRtcDc4X18gfD0gKHBTcmMtPmFnZ3JlZ2F0aW9uIDw8IDApOworCQl0bXA3OF9fIHw9IChwU3JjLT50c2lkIDw8IDEpOworCQl0bXA3OF9fIHw9IChwU3JjLT5kaXJlY3Rpb24gPDwgNSk7CisJCXRtcDc4X18gfD0gKHBTcmMtPnJlc2VydmVkIDw8IDcpOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXA3OF9fLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQluQnVmIC09ICAyIDsKKwkJZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+c2VydmljZV9zdGFydF90aW1lLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5zZXJ2aWNlX2ludGVydmFsLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tYXhfc2VydmljZV9kdXIsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnNwZWNfaW50ZXJ2YWwsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9zY2hlZHVsZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfdGNsYXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgIHREb3QxMWZJRVRDTEFTICpwU3JjLAorCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfaWV0Y2xhcyhwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisJaWYgKCFET1QxMUZfU1VDQ0VFREVEKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMTQ7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT51c2VyX3ByaW9yaXR5OworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+Y2xhc3NpZmllcl90eXBlOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+Y2xhc3NpZmllcl9tYXNrOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCXN3aXRjaCAocFNyYy0+Y2xhc3NpZmllcl90eXBlKSB7CisJCWNhc2UgMDoKKwkJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKwkJCSpwbkNvbnN1bWVkICs9IDY7CisJCQlwQnVmICs9IDY7CisJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uRXRoUGFyYW1zLmRlc3QsIDYpOworCQkJKnBuQ29uc3VtZWQgKz0gNjsKKwkJCXBCdWYgKz0gNjsKKwkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uRXRoUGFyYW1zLnR5cGUsIDApOworCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJKnBCdWYgPSBwU3JjLT5pbmZvLklwUGFyYW1zLnZlcnNpb247CisJCQkqcG5Db25zdW1lZCArPSAxOworCQkJcEJ1ZiArPSAxOworCQkJc3dpdGNoIChwU3JjLT5pbmZvLklwUGFyYW1zLnZlcnNpb24pIHsKKwkJCWNhc2UgNDoKKwkJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKwkJCQkqcG5Db25zdW1lZCArPSA0OworCQkJCXBCdWYgKz0gNDsKKwkJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgNCk7CisJCQkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJCQlwQnVmICs9IDQ7CisJCQkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCwgMCk7CisJCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCQlwQnVmICs9IDI7CisJCQkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDApOworCQkJCSpwbkNvbnN1bWVkICs9IDI7CisJCQkJcEJ1ZiArPSAyOworCQkJCSpwQnVmID0gcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQOworCQkJCSpwbkNvbnN1bWVkICs9IDE7CisJCQkJcEJ1ZiArPSAxOworCQkJCSpwQnVmID0gcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bzsKKwkJCQkqcG5Db25zdW1lZCArPSAxOworCQkJCXBCdWYgKz0gMTsKKwkJCQkqcEJ1ZiA9IHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQ7CisJCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2KTsKKwkJCQkqcG5Db25zdW1lZCArPSAxNjsKKwkJCQlwQnVmICs9IDE2OworCQkJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisJCQkJKnBuQ29uc3VtZWQgKz0gMTY7CisJCQkJcEJ1ZiArPSAxNjsKKwkJCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0LCAwKTsKKwkJCQkqcG5Db25zdW1lZCArPSAyOworCQkJCXBCdWYgKz0gMjsKKwkJCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgMCk7CisJCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCQlwQnVmICs9IDI7CisJCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmZsb3dfbGFiZWwsIDMpOworCQkJCSpwbkNvbnN1bWVkICs9IDM7CisJCQkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMCk7CisJCQkqcG5Db25zdW1lZCArPSAyOworCQkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV90Y2xhcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfdGNsYXNzcHJvYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHREb3QxMWZJRVRDTEFTU1BST0MgKnBTcmMsCisJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAxOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDQ0OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+cHJvY2Vzc2luZzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfdGNsYXNzcHJvYy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfdHNfZGVsYXkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQl0RG90MTFmSUVUU0RlbGF5ICpwU3JjLAorCQkJCXVpbnQ4X3QgKnBCdWYsCisJCQkJdWludDMyX3QgbkJ1ZiwKKwkJCQl1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gNDsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA0MzsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5kZWxheSwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDQ7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3RzX2RlbGF5LiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV90c3BlYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgdERvdDExZklFVFNQRUMgKnBTcmMsCisJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCSAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwl1aW50MTZfdCB0bXA3OV9fOworCXVpbnQ4X3QgdG1wODBfXzsKKwl1aW50MTZfdCB0bXA4MV9fOworCW5OZWVkZWQgICs9IDU1OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDEzOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXRtcDc5X18gPSAwVTsKKwkJdG1wNzlfXyB8PSAocFNyYy0+dHJhZmZpY190eXBlIDw8IDApOworCQl0bXA3OV9fIHw9IChwU3JjLT50c2lkIDw8IDEpOworCQl0bXA3OV9fIHw9IChwU3JjLT5kaXJlY3Rpb24gPDwgNSk7CisJCXRtcDc5X18gfD0gKHBTcmMtPmFjY2Vzc19wb2xpY3kgPDwgNyk7CisJCXRtcDc5X18gfD0gKHBTcmMtPmFnZ3JlZ2F0aW9uIDw8IDkpOworCQl0bXA3OV9fIHw9IChwU3JjLT5wc2IgPDwgMTApOworCQl0bXA3OV9fIHw9IChwU3JjLT51c2VyX3ByaW9yaXR5IDw8IDExKTsKKwkJdG1wNzlfXyB8PSAocFNyYy0+dHNpbmZvX2Fja19wb2wgPDwgMTQpOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXA3OV9fLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQluQnVmIC09ICAyIDsKKwkJdG1wODBfXyA9IDBVOworCQl0bXA4MF9fIHw9IChwU3JjLT5zY2hlZHVsZSA8PCAwKTsKKwkJdG1wODBfXyB8PSAocFNyYy0+dW51c2VkIDw8IDEpOworCQkqcEJ1ZiA9IHRtcDgwX187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCXRtcDgxX18gPSAwVTsKKwkJdG1wODFfXyB8PSAocFNyYy0+c2l6ZSA8PCAwKTsKKwkJdG1wODFfXyB8PSAocFNyYy0+Zml4ZWQgPDwgMTUpOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXA4MV9fLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQluQnVmIC09ICAyIDsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bWF4X21zZHVfc2l6ZSwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+bWluX3NlcnZpY2VfaW50LCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5tYXhfc2VydmljZV9pbnQsIDApOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCWZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmluYWN0aXZpdHlfaW50LCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5zdXNwZW5zaW9uX2ludCwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDQ7CisJCXBCdWYgKz0gNDsKKwkJZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+c2VydmljZV9zdGFydF90aW1lLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5taW5fZGF0YV9yYXRlLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5tZWFuX2RhdGFfcmF0ZSwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDQ7CisJCXBCdWYgKz0gNDsKKwkJZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+cGVha19kYXRhX3JhdGUsIDApOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCWZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmJ1cnN0X3NpemUsIDApOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCWZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmRlbGF5X2JvdW5kLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5taW5fcGh5X3JhdGUsIDApOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnN1cnBsdXNfYndfYWxsb3dhbmNlLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tZWRpdW1fdGltZSwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3RzcGVjLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV92aHRfY2Fwcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCXREb3QxMWZJRVZIVENhcHMgKnBTcmMsCisJCQkJdWludDhfdCAqcEJ1ZiwKKwkJCQl1aW50MzJfdCBuQnVmLAorCQkJCXVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwl1aW50MzJfdCB0bXA4Ml9fOworCXVpbnQxNl90IHRtcDgzX187CisJdWludDE2X3QgdG1wODRfXzsKKwluTmVlZGVkICArPSAxMjsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAxOTE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJdG1wODJfXyA9IDBVOworCQl0bXA4Ml9fIHw9IChwU3JjLT5tYXhNUERVTGVuIDw8IDApOworCQl0bXA4Ml9fIHw9IChwU3JjLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPDwgMik7CisJCXRtcDgyX18gfD0gKHBTcmMtPmxkcGNDb2RpbmdDYXAgPDwgNCk7CisJCXRtcDgyX18gfD0gKHBTcmMtPnNob3J0R0k4ME1IeiA8PCA1KTsKKwkJdG1wODJfXyB8PSAocFNyYy0+c2hvcnRHSTE2MGFuZDgwcGx1czgwTUh6IDw8IDYpOworCQl0bXA4Ml9fIHw9IChwU3JjLT50eFNUQkMgPDwgNyk7CisJCXRtcDgyX18gfD0gKHBTcmMtPnJ4U1RCQyA8PCA4KTsKKwkJdG1wODJfXyB8PSAocFNyYy0+c3VCZWFtRm9ybWVyQ2FwIDw8IDExKTsKKwkJdG1wODJfXyB8PSAocFNyYy0+c3VCZWFtZm9ybWVlQ2FwIDw8IDEyKTsKKwkJdG1wODJfXyB8PSAocFNyYy0+Y3Nub2ZCZWFtZm9ybWVyQW50U3VwIDw8IDEzKTsKKwkJdG1wODJfXyB8PSAocFNyYy0+bnVtU291bmRpbmdEaW0gPDwgMTYpOworCQl0bXA4Ml9fIHw9IChwU3JjLT5tdUJlYW1mb3JtZXJDYXAgPDwgMTkpOworCQl0bXA4Ml9fIHw9IChwU3JjLT5tdUJlYW1mb3JtZWVDYXAgPDwgMjApOworCQl0bXA4Ml9fIHw9IChwU3JjLT52aHRUWE9QUFMgPDwgMjEpOworCQl0bXA4Ml9fIHw9IChwU3JjLT5odGNWSFRDYXAgPDwgMjIpOworCQl0bXA4Ml9fIHw9IChwU3JjLT5tYXhBTVBEVUxlbkV4cCA8PCAyMyk7CisJCXRtcDgyX18gfD0gKHBTcmMtPnZodExpbmtBZGFwdENhcCA8PCAyNik7CisJCXRtcDgyX18gfD0gKHBTcmMtPnJ4QW50UGF0dGVybiA8PCAyOCk7CisJCXRtcDgyX18gfD0gKHBTcmMtPnR4QW50UGF0dGVybiA8PCAyOSk7CisJCXRtcDgyX18gfD0gKHBTcmMtPnJlc2VydmVkMSA8PCAzMCk7CisJCWZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHRtcDgyX18sIDApOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCW5CdWYgLT0gIDQgOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5yeE1DU01hcCwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJdG1wODNfXyA9IDBVOworCQl0bXA4M19fIHw9IChwU3JjLT5yeEhpZ2hTdXBEYXRhUmF0ZSA8PCAwKTsKKwkJdG1wODNfXyB8PSAocFNyYy0+cmVzZXJ2ZWQyIDw8IDEzKTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgdG1wODNfXywgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJbkJ1ZiAtPSAgMiA7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnR4TUNTTWFwLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQl0bXA4NF9fID0gMFU7CisJCXRtcDg0X18gfD0gKHBTcmMtPnR4U3VwRGF0YVJhdGUgPDwgMCk7CisJCXRtcDg0X18gfD0gKHBTcmMtPnJlc2VydmVkMyA8PCAxMyk7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDg0X18sIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQkvKiBmaWVsZHNFbmRGbGFnICA9IDEgKi8KKwkJbkJ1ZiAtPSAgMiA7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3ZodF9jYXBzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV92aHRfb3BlcmF0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICB0RG90MTFmSUVWSFRPcGVyYXRpb24gKnBTcmMsCisJCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSA1OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDE5MjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPmNoYW5XaWR0aDsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPmNoYW5DZW50ZXJGcmVxU2VnMTsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPmNoYW5DZW50ZXJGcmVxU2VnMjsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5iYXNpY01DU1NldCwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3ZodF9vcGVyYXRpb24uICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dtbV9zY2hlZHVsZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB0RG90MTFmSUVXTU1TY2hlZHVsZSAqcFNyYywKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQxNl90IHRtcDg1X187CisJbk5lZWRlZCAgKz0gMTU7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMjIxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDUwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweGYyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4OTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+dmVyc2lvbjsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQl0bXA4NV9fID0gMFU7CisJCXRtcDg1X18gfD0gKHBTcmMtPmFnZ3JlZ2F0aW9uIDw8IDApOworCQl0bXA4NV9fIHw9IChwU3JjLT50c2lkIDw8IDEpOworCQl0bXA4NV9fIHw9IChwU3JjLT5kaXJlY3Rpb24gPDwgNSk7CisJCXRtcDg1X18gfD0gKHBTcmMtPnJlc2VydmVkIDw8IDcpOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXA4NV9fLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQluQnVmIC09ICAyIDsKKwkJZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+c2VydmljZV9zdGFydF90aW1lLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5zZXJ2aWNlX2ludGVydmFsLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tYXhfc2VydmljZV9kdXIsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnNwZWNfaW50ZXJ2YWwsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV93bW1fc2NoZWR1bGUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dtbXRjbGFzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHREb3QxMWZJRVdNTVRDTEFTICpwU3JjLAorCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCSB1aW50MzJfdCBuQnVmLAorCQkJCSB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfaWV3bW10Y2xhcyhwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisJaWYgKCFET1QxMUZfU1VDQ0VFREVEKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMjIxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDUwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweGYyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+dmVyc2lvbjsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPnVzZXJfcHJpb3JpdHk7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5jbGFzc2lmaWVyX3R5cGU7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5jbGFzc2lmaWVyX21hc2s7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJc3dpdGNoIChwU3JjLT5jbGFzc2lmaWVyX3R5cGUpIHsKKwkJY2FzZSAwOgorCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYpOworCQkJKnBuQ29uc3VtZWQgKz0gNjsKKwkJCXBCdWYgKz0gNjsKKwkJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5FdGhQYXJhbXMuZGVzdCwgNik7CisJCQkqcG5Db25zdW1lZCArPSA2OworCQkJcEJ1ZiArPSA2OworCQkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5FdGhQYXJhbXMudHlwZSwgMCk7CisJCQkqcG5Db25zdW1lZCArPSAyOworCQkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkqcEJ1ZiA9IHBTcmMtPmluZm8uSXBQYXJhbXMudmVyc2lvbjsKKwkJCSpwbkNvbnN1bWVkICs9IDE7CisJCQlwQnVmICs9IDE7CisJCQlzd2l0Y2ggKHBTcmMtPmluZm8uSXBQYXJhbXMudmVyc2lvbikgeworCQkJY2FzZSA0OgorCQkJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworCQkJCSpwbkNvbnN1bWVkICs9IDQ7CisJCQkJcEJ1ZiArPSA0OworCQkJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCA0KTsKKwkJCQkqcG5Db25zdW1lZCArPSA0OworCQkJCXBCdWYgKz0gNDsKKwkJCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAwKTsKKwkJCQkqcG5Db25zdW1lZCArPSAyOworCQkJCXBCdWYgKz0gMjsKKwkJCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydCwgMCk7CisJCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCQlwQnVmICs9IDI7CisJCQkJKnBCdWYgPSBwU3JjLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1A7CisJCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCQlwQnVmICs9IDE7CisJCQkJKnBCdWYgPSBwU3JjLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvOworCQkJCSpwbkNvbnN1bWVkICs9IDE7CisJCQkJcEJ1ZiArPSAxOworCQkJCSpwQnVmID0gcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZDsKKwkJCQkqcG5Db25zdW1lZCArPSAxOworCQkJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTApOworCQkJCSpwbkNvbnN1bWVkICs9IDEwOworCQkJCXBCdWYgKz0gMTA7CisJCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDEwKTsKKwkJCQkqcG5Db25zdW1lZCArPSAxMDsKKwkJCQlwQnVmICs9IDEwOworCQkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDApOworCQkJCSpwbkNvbnN1bWVkICs9IDI7CisJCQkJcEJ1ZiArPSAyOworCQkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCAwKTsKKwkJCQkqcG5Db25zdW1lZCArPSAyOworCQkJCXBCdWYgKz0gMjsKKwkJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisJCQkJKnBuQ29uc3VtZWQgKz0gMzsKKwkJCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAwKTsKKwkJCSpwbkNvbnN1bWVkICs9IDI7CisJCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dtbXRjbGFzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93bW10Y2xhc3Byb2ModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgIHREb3QxMWZJRVdNTVRDTEFTUFJPQyAqcFNyYywKKwkJCQkgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDI7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMjIxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDUwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweGYyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NzsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+dmVyc2lvbjsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPnByb2Nlc3Npbmc7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dtbXRjbGFzcHJvYy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd21tdHNfZGVsYXkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICB0RG90MTFmSUVXTU1UU0RlbGF5ICpwU3JjLAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gNTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyMjE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NTA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4ZjI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg4OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT52ZXJzaW9uOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCWZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmRlbGF5LCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfd21tdHNfZGVsYXkuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dtbXRzcGVjKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHREb3QxMWZJRVdNTVRTUEVDICpwU3JjLAorCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCSB1aW50MzJfdCBuQnVmLAorCQkJCSB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDE2X3QgdG1wODZfXzsKKwl1aW50OF90IHRtcDg3X187CisJdWludDE2X3QgdG1wODhfXzsKKwluTmVlZGVkICArPSAzODsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyMjE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NTA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4ZjI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT52ZXJzaW9uOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCXRtcDg2X18gPSAwVTsKKwkJdG1wODZfXyB8PSAocFNyYy0+dHJhZmZpY190eXBlIDw8IDApOworCQl0bXA4Nl9fIHw9IChwU3JjLT50c2lkIDw8IDEpOworCQl0bXA4Nl9fIHw9IChwU3JjLT5kaXJlY3Rpb24gPDwgNSk7CisJCXRtcDg2X18gfD0gKHBTcmMtPmFjY2Vzc19wb2xpY3kgPDwgNyk7CisJCXRtcDg2X18gfD0gKHBTcmMtPmFnZ3JlZ2F0aW9uIDw8IDkpOworCQl0bXA4Nl9fIHw9IChwU3JjLT5wc2IgPDwgMTApOworCQl0bXA4Nl9fIHw9IChwU3JjLT51c2VyX3ByaW9yaXR5IDw8IDExKTsKKwkJdG1wODZfXyB8PSAocFNyYy0+dHNpbmZvX2Fja19wb2wgPDwgMTQpOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXA4Nl9fLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQluQnVmIC09ICAyIDsKKwkJdG1wODdfXyA9IDBVOworCQl0bXA4N19fIHw9IChwU3JjLT50c2luZm9fcnN2ZCA8PCAwKTsKKwkJdG1wODdfXyB8PSAocFNyYy0+YnVyc3Rfc2l6ZV9kZWZuIDw8IDcpOworCQkqcEJ1ZiA9IHRtcDg3X187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCXRtcDg4X18gPSAwVTsKKwkJdG1wODhfXyB8PSAocFNyYy0+c2l6ZSA8PCAwKTsKKwkJdG1wODhfXyB8PSAocFNyYy0+Zml4ZWQgPDwgMTUpOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXA4OF9fLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQluQnVmIC09ICAyIDsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bWF4X21zZHVfc2l6ZSwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+bWluX3NlcnZpY2VfaW50LCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5tYXhfc2VydmljZV9pbnQsIDApOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCWZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmluYWN0aXZpdHlfaW50LCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5zdXNwZW5zaW9uX2ludCwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDQ7CisJCXBCdWYgKz0gNDsKKwkJZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+c2VydmljZV9zdGFydF90aW1lLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5taW5fZGF0YV9yYXRlLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5tZWFuX2RhdGFfcmF0ZSwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDQ7CisJCXBCdWYgKz0gNDsKKwkJZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+cGVha19kYXRhX3JhdGUsIDApOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCWZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmJ1cnN0X3NpemUsIDApOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCWZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmRlbGF5X2JvdW5kLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5taW5fcGh5X3JhdGUsIDApOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnN1cnBsdXNfYndfYWxsb3dhbmNlLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tZWRpdW1fdGltZSwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dtbXRzcGVjLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93aWRlcl9id19jaGFuX3N3aXRjaF9hbm4odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgICB0RG90MTFmSUVXaWRlckJXQ2hhblN3aXRjaEFubiAqcFNyYywKKwkJCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJCSAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDM7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMTk0OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+bmV3Q2hhbldpZHRoOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+bmV3Q2VudGVyQ2hhbkZyZXEwOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+bmV3Q2VudGVyQ2hhbkZyZXExOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV93aWRlcl9id19jaGFuX3N3aXRjaF9hbm4uICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2FpZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgIHREb3QxMWZJRUFJRCAqcFNyYywKKwkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDI7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMTk3OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmFzc29jSWQsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9haWQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2NmX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSB0RG90MTFmSUVDRlBhcmFtcyAqcFNyYywKKwkJCQkgdWludDhfdCAqcEJ1ZiwKKwkJCQkgdWludDMyX3QgbkJ1ZiwKKwkJCQkgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDY7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPmNmcF9jb3VudDsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPmNmcF9wZXJpb2Q7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y2ZwX21heGR1cmF0aW9uLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jZnBfZHVycmVtYWluaW5nLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfY2ZfcGFyYW1zLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9jaGFsbGVuZ2VfdGV4dCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHREb3QxMWZJRUNoYWxsZW5nZVRleHQgKnBTcmMsCisJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAgcFNyYy0+bnVtX3RleHQ7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMTY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKHBTcmMtPnRleHQpLCBwU3JjLT5udW1fdGV4dCk7CisJCSpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV90ZXh0OworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9jaGFsbGVuZ2VfdGV4dC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfY2hhbl9zd2l0Y2hfYW5uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgdERvdDExZklFQ2hhblN3aXRjaEFubiAqcFNyYywKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDM7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMzc7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT5zd2l0Y2hNb2RlOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+bmV3Q2hhbm5lbDsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPnN3aXRjaENvdW50OworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9jaGFuX3N3aXRjaF9hbm4uICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2NoYW5uZWxfc3dpdGNoX3dyYXBwZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgICB0RG90MTFmSUVDaGFubmVsU3dpdGNoV3JhcHBlciAqcFNyYywKKwkJCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJCSAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2llX2NoYW5uZWxfc3dpdGNoX3dyYXBwZXIocEN0eCwgcFNyYywgJm5OZWVkZWQpOworCWlmICghRE9UMTFGX1NVQ0NFRURFRChzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDE5NjsKKwkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsCisJCQkJKHVpbnQ4X3QgKilwU3JjLAorCQkJCXBCdWYsCisJCQkJbkJ1ZiwKKwkJCQlwbkNvbnN1bWVkLAorCQkJCUZGU19DaGFubmVsU3dpdGNoV3JhcHBlciwKKwkJCQlJRVNfQ2hhbm5lbFN3aXRjaFdyYXBwZXIpOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfY2hhbm5lbF9zd2l0Y2hfd3JhcHBlci4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfY291bnRyeSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCXREb3QxMWZJRUNvdW50cnkgKnBTcmMsCisJCQkJdWludDhfdCAqcEJ1ZiwKKwkJCQl1aW50MzJfdCBuQnVmLAorCQkJCXVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZV9jb3VudHJ5KHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA3OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+Y291bnRyeSwgMyk7CisJCSpwbkNvbnN1bWVkICs9IDM7CisJCXBCdWYgKz0gMzsKKwkJaWYgKHBTcmMtPm51bV90cmlwbGV0cykgeworCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKHBTcmMtPnRyaXBsZXRzKSwgKHBTcmMtPm51bV90cmlwbGV0cyAqIDMpKTsKKwkJCSpwbkNvbnN1bWVkICs9IChwU3JjLT5udW1fdHJpcGxldHMgKiAzKTsKKwkJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfY291bnRyeS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZHNfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHREb3QxMWZJRURTUGFyYW1zICpwU3JjLAorCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCSB1aW50MzJfdCBuQnVmLAorCQkJCSB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAzOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+Y3Vycl9jaGFubmVsOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9kc19wYXJhbXMuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2VkY2FfcGFyYW1fc2V0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICB0RG90MTFmSUVFRENBUGFyYW1TZXQgKnBTcmMsCisJCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwl1aW50OF90IHRtcDg5X187CisJdWludDhfdCB0bXA5MF9fOworCXVpbnQ4X3QgdG1wOTFfXzsKKwl1aW50OF90IHRtcDkyX187CisJdWludDhfdCB0bXA5M19fOworCXVpbnQ4X3QgdG1wOTRfXzsKKwl1aW50OF90IHRtcDk1X187CisJdWludDhfdCB0bXA5Nl9fOworCW5OZWVkZWQgICs9IDE4OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDEyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+cW9zOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+cmVzZXJ2ZWQ7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJdG1wODlfXyA9IDBVOworCQl0bXA4OV9fIHw9IChwU3JjLT5hY2JlX2FpZnNuIDw8IDApOworCQl0bXA4OV9fIHw9IChwU3JjLT5hY2JlX2FjbSA8PCA0KTsKKwkJdG1wODlfXyB8PSAocFNyYy0+YWNiZV9hY2kgPDwgNSk7CisJCXRtcDg5X18gfD0gKHBTcmMtPnVudXNlZDEgPDwgNyk7CisJCSpwQnVmID0gdG1wODlfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQluQnVmIC09ICAxIDsKKwkJdG1wOTBfXyA9IDBVOworCQl0bXA5MF9fIHw9IChwU3JjLT5hY2JlX2Fjd21pbiA8PCAwKTsKKwkJdG1wOTBfXyB8PSAocFNyYy0+YWNiZV9hY3dtYXggPDwgNCk7CisJCSpwQnVmID0gdG1wOTBfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQluQnVmIC09ICAxIDsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YWNiZV90eG9wbGltaXQsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCXRtcDkxX18gPSAwVTsKKwkJdG1wOTFfXyB8PSAocFNyYy0+YWNia19haWZzbiA8PCAwKTsKKwkJdG1wOTFfXyB8PSAocFNyYy0+YWNia19hY20gPDwgNCk7CisJCXRtcDkxX18gfD0gKHBTcmMtPmFjYmtfYWNpIDw8IDUpOworCQl0bXA5MV9fIHw9IChwU3JjLT51bnVzZWQyIDw8IDcpOworCQkqcEJ1ZiA9IHRtcDkxX187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCXRtcDkyX18gPSAwVTsKKwkJdG1wOTJfXyB8PSAocFNyYy0+YWNia19hY3dtaW4gPDwgMCk7CisJCXRtcDkyX18gfD0gKHBTcmMtPmFjYmtfYWN3bWF4IDw8IDQpOworCQkqcEJ1ZiA9IHRtcDkyX187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmFjYmtfdHhvcGxpbWl0LCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQl0bXA5M19fID0gMFU7CisJCXRtcDkzX18gfD0gKHBTcmMtPmFjdmlfYWlmc24gPDwgMCk7CisJCXRtcDkzX18gfD0gKHBTcmMtPmFjdmlfYWNtIDw8IDQpOworCQl0bXA5M19fIHw9IChwU3JjLT5hY3ZpX2FjaSA8PCA1KTsKKwkJdG1wOTNfXyB8PSAocFNyYy0+dW51c2VkMyA8PCA3KTsKKwkJKnBCdWYgPSB0bXA5M19fOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCW5CdWYgLT0gIDEgOworCQl0bXA5NF9fID0gMFU7CisJCXRtcDk0X18gfD0gKHBTcmMtPmFjdmlfYWN3bWluIDw8IDApOworCQl0bXA5NF9fIHw9IChwU3JjLT5hY3ZpX2Fjd21heCA8PCA0KTsKKwkJKnBCdWYgPSB0bXA5NF9fOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCW5CdWYgLT0gIDEgOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hY3ZpX3R4b3BsaW1pdCwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJdG1wOTVfXyA9IDBVOworCQl0bXA5NV9fIHw9IChwU3JjLT5hY3ZvX2FpZnNuIDw8IDApOworCQl0bXA5NV9fIHw9IChwU3JjLT5hY3ZvX2FjbSA8PCA0KTsKKwkJdG1wOTVfXyB8PSAocFNyYy0+YWN2b19hY2kgPDwgNSk7CisJCXRtcDk1X18gfD0gKHBTcmMtPnVudXNlZDQgPDwgNyk7CisJCSpwQnVmID0gdG1wOTVfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQluQnVmIC09ICAxIDsKKwkJdG1wOTZfXyA9IDBVOworCQl0bXA5Nl9fIHw9IChwU3JjLT5hY3ZvX2Fjd21pbiA8PCAwKTsKKwkJdG1wOTZfXyB8PSAocFNyYy0+YWN2b19hY3dtYXggPDwgNCk7CisJCSpwQnVmID0gdG1wOTZfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQluQnVmIC09ICAxIDsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YWN2b190eG9wbGltaXQsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9lZGNhX3BhcmFtX3NldC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZXJwX2luZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQl0RG90MTFmSUVFUlBJbmZvICpwU3JjLAorCQkJCXVpbnQ4X3QgKnBCdWYsCisJCQkJdWludDMyX3QgbkJ1ZiwKKwkJCQl1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDhfdCB0bXA5N19fOworCW5OZWVkZWQgICs9IDE7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNDI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJdG1wOTdfXyA9IDBVOworCQl0bXA5N19fIHw9IChwU3JjLT5ub25fZXJwX3ByZXNlbnQgPDwgMCk7CisJCXRtcDk3X18gfD0gKHBTcmMtPnVzZV9wcm90IDw8IDEpOworCQl0bXA5N19fIHw9IChwU3JjLT5iYXJrZXJfcHJlYW1ibGUgPDwgMik7CisJCXRtcDk3X18gfD0gKHBTcmMtPnVudXNlZCA8PCAzKTsKKwkJKnBCdWYgPSB0bXA5N19fOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnICA9IDEgKi8KKwkJbkJ1ZiAtPSAgMSA7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX2VycF9pbmZvLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9lc2VfY2NrbV9vcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB0RG90MTFmSUVFU0VDY2ttT3BhcXVlICpwU3JjLAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9kYXRhOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDE1NjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg0MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg5NjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKHBTcmMtPmRhdGEpLCBwU3JjLT5udW1fZGF0YSk7CisJCSpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9kYXRhOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9lc2VfY2NrbV9vcGFxdWUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2VzZV9yYWRfbWdtdF9jYXAodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB0RG90MTFmSUVFU0VSYWRNZ210Q2FwICpwU3JjLAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDhfdCB0bXA5OF9fOworCW5OZWVkZWQgICs9IDI7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMjIxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDQwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDk2OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPm1nbXRfc3RhdGU7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJdG1wOThfXyA9IDBVOworCQl0bXA5OF9fIHw9IChwU3JjLT5tYnNzaWRfbWFzayA8PCAwKTsKKwkJdG1wOThfXyB8PSAocFNyYy0+cmVzZXJ2ZWQgPDwgMyk7CisJCSpwQnVmID0gdG1wOThfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJLyogZmllbGRzRW5kRmxhZyAgPSAxICovCisJCW5CdWYgLT0gIDEgOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9lc2VfcmFkX21nbXRfY2FwLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9lc2VfdHJhZl9zdHJtX21ldCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgICB0RG90MTFmSUVFU0VUcmFmU3RybU1ldCAqcFNyYywKKwkJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDQ7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMjIxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDQwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDk2OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDc7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPnRzaWQ7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5zdGF0ZTsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tc210X2ludGVydmFsLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfZXNlX3RyYWZfc3RybV9tZXQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2VzZV90cmFmX3N0cm1fcmF0ZV9zZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgdERvdDExZklFRVNFVHJhZlN0cm1SYXRlU2V0ICpwU3JjLAorCQkJCQkgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICB1aW50MzJfdCBuQnVmLAorCQkJCQkgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gIChwU3JjLT5udW1fdHNyYXRlcyArIDEpOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDIyMTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg0MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg5NjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg4OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT50c2lkOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT50c3JhdGVzKSwgcFNyYy0+bnVtX3RzcmF0ZXMpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fdHNyYXRlczsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfZXNlX3RyYWZfc3RybV9yYXRlX3NldC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZXNlX3R4bWl0X3Bvd2VyKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgdERvdDExZklFRVNFVHhtaXRQb3dlciAqcFNyYywKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDI7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMTUwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDQwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDk2OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPnBvd2VyX2xpbWl0OworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+cmVzZXJ2ZWQ7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX2VzZV90eG1pdF9wb3dlci4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZXNlX3ZlcnNpb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICB0RG90MTFmSUVFU0VWZXJzaW9uICpwU3JjLAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyMjE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4OTY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MzsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+dmVyc2lvbjsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfZXNlX3ZlcnNpb24uICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2V4dF9jYXAodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgICB0RG90MTFmSUVFeHRDYXAgKnBTcmMsCisJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJICAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAgcFNyYy0+bnVtX2J5dGVzOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDEyNzsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+Ynl0ZXMpLCBwU3JjLT5udW1fYnl0ZXMpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fYnl0ZXM7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX2V4dF9jYXAuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2V4dF9zdXBwX3JhdGVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICB0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKnBTcmMsCisJCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAgcFNyYy0+bnVtX3JhdGVzOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDUwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5yYXRlcyksIHBTcmMtPm51bV9yYXRlcyk7CisJCSpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9yYXRlczsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfZXh0X3N1cHBfcmF0ZXMuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX2ZoX3BhcmFtX3NldCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHREb3QxMWZJRUZIUGFyYW1TZXQgKnBTcmMsCisJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSA1OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+ZHdlbGxfdGltZSwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJKnBCdWYgPSBwU3JjLT5ob3Bfc2V0OworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+aG9wX3BhdHRlcm47CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5ob3BfaW5kZXg7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX2ZoX3BhcmFtX3NldC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZmhfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJIHREb3QxMWZJRUZIUGFyYW1zICpwU3JjLAorCQkJCSB1aW50OF90ICpwQnVmLAorCQkJCSB1aW50MzJfdCBuQnVmLAorCQkJCSB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMjsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA4OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+cmFkaXg7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5uY2hhbm5lbHM7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX2ZoX3BhcmFtcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZmhfcGF0dF90YWJsZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB0RG90MTFmSUVGSFBhdHRUYWJsZSAqcFNyYywKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICAocFNyYy0+bnVtX3JhbmR0YWJsZSArIDQpOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDk7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT5mbGFnOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+bnNldHM7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5tb2R1bHVzOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+b2Zmc2V0OworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5yYW5kdGFibGUpLCBwU3JjLT5udW1fcmFuZHRhYmxlKTsKKwkJKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3JhbmR0YWJsZTsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfZmhfcGF0dF90YWJsZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZnRfaW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgIHREb3QxMWZJRUZUSW5mbyAqcFNyYywKKwkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkgICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQxNl90IHRtcDk5X187CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfaWVmdF9pbmZvKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA1NTsKKwkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJdG1wOTlfXyA9IDBVOworCQl0bXA5OV9fIHw9IChwU3JjLT5yZXNlcnZlZCA8PCAwKTsKKwkJdG1wOTlfXyB8PSAocFNyYy0+SUVDb3VudCA8PCA4KTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgdG1wOTlfXywgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJbkJ1ZiAtPSAgMiA7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+TUlDLCAxNik7CisJCSpwbkNvbnN1bWVkICs9IDE2OworCQlwQnVmICs9IDE2OworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPkFub25jZSwgMzIpOworCQkqcG5Db25zdW1lZCArPSAzMjsKKwkJcEJ1ZiArPSAzMjsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5Tbm9uY2UsIDMyKTsKKwkJKnBuQ29uc3VtZWQgKz0gMzI7CisJCXBCdWYgKz0gMzI7CisJCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LAorCQkJCSh1aW50OF90ICopcFNyYywKKwkJCQlwQnVmLAorCQkJCW5CdWYsCisJCQkJcG5Db25zdW1lZCwKKwkJCQlGRlNfRlRJbmZvLAorCQkJCUlFU19GVEluZm8pOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfZnRfaW5mby4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfaHRfY2Fwcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgIHREb3QxMWZJRUhUQ2FwcyAqcFNyYywKKwkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkgICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQxNl90IHRtcDEwMF9fOworCXVpbnQ4X3QgdG1wMTAxX187CisJdWludDE2X3QgdG1wMTAyX187CisJdWludDMyX3QgdG1wMTAzX187CisJdWludDhfdCB0bXAxMDRfXzsKKwluTmVlZGVkICArPSAgKHBTcmMtPm51bV9yc3ZkICsgMjYpOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDQ1OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXRtcDEwMF9fID0gMFU7CisJCXRtcDEwMF9fIHw9IChwU3JjLT5hZHZDb2RpbmdDYXAgPDwgMCk7CisJCXRtcDEwMF9fIHw9IChwU3JjLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPDwgMSk7CisJCXRtcDEwMF9fIHw9IChwU3JjLT5taW1vUG93ZXJTYXZlIDw8IDIpOworCQl0bXAxMDBfXyB8PSAocFNyYy0+Z3JlZW5GaWVsZCA8PCA0KTsKKwkJdG1wMTAwX18gfD0gKHBTcmMtPnNob3J0R0kyME1IeiA8PCA1KTsKKwkJdG1wMTAwX18gfD0gKHBTcmMtPnNob3J0R0k0ME1IeiA8PCA2KTsKKwkJdG1wMTAwX18gfD0gKHBTcmMtPnR4U1RCQyA8PCA3KTsKKwkJdG1wMTAwX18gfD0gKHBTcmMtPnJ4U1RCQyA8PCA4KTsKKwkJdG1wMTAwX18gfD0gKHBTcmMtPmRlbGF5ZWRCQSA8PCAxMCk7CisJCXRtcDEwMF9fIHw9IChwU3JjLT5tYXhpbWFsQU1TRFVzaXplIDw8IDExKTsKKwkJdG1wMTAwX18gfD0gKHBTcmMtPmRzc3NDY2tNb2RlNDBNSHogPDwgMTIpOworCQl0bXAxMDBfXyB8PSAocFNyYy0+cHNtcCA8PCAxMyk7CisJCXRtcDEwMF9fIHw9IChwU3JjLT5zdGJjQ29udHJvbEZyYW1lIDw8IDE0KTsKKwkJdG1wMTAwX18gfD0gKHBTcmMtPmxzaWdUWE9QUHJvdGVjdGlvbiA8PCAxNSk7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDEwMF9fLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQluQnVmIC09ICAyIDsKKwkJdG1wMTAxX18gPSAwVTsKKwkJdG1wMTAxX18gfD0gKHBTcmMtPm1heFJ4QU1QRFVGYWN0b3IgPDwgMCk7CisJCXRtcDEwMV9fIHw9IChwU3JjLT5tcGR1RGVuc2l0eSA8PCAyKTsKKwkJdG1wMTAxX18gfD0gKHBTcmMtPnJlc2VydmVkMSA8PCA1KTsKKwkJKnBCdWYgPSB0bXAxMDFfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQluQnVmIC09ICAxIDsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5zdXBwb3J0ZWRNQ1NTZXQsIDE2KTsKKwkJKnBuQ29uc3VtZWQgKz0gMTY7CisJCXBCdWYgKz0gMTY7CisJCXRtcDEwMl9fID0gMFU7CisJCXRtcDEwMl9fIHw9IChwU3JjLT5wY28gPDwgMCk7CisJCXRtcDEwMl9fIHw9IChwU3JjLT50cmFuc2l0aW9uVGltZSA8PCAxKTsKKwkJdG1wMTAyX18gfD0gKHBTcmMtPnJlc2VydmVkMiA8PCAzKTsKKwkJdG1wMTAyX18gfD0gKHBTcmMtPm1jc0ZlZWRiYWNrIDw8IDgpOworCQl0bXAxMDJfXyB8PSAocFNyYy0+cmVzZXJ2ZWQzIDw8IDEwKTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgdG1wMTAyX18sIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCW5CdWYgLT0gIDIgOworCQl0bXAxMDNfXyA9IDBVOworCQl0bXAxMDNfXyB8PSAocFNyYy0+dHhCRiA8PCAwKTsKKwkJdG1wMTAzX18gfD0gKHBTcmMtPnJ4U3RhZ2dlcmVkU291bmRpbmcgPDwgMSk7CisJCXRtcDEwM19fIHw9IChwU3JjLT50eFN0YWdnZXJlZFNvdW5kaW5nIDw8IDIpOworCQl0bXAxMDNfXyB8PSAocFNyYy0+cnhaTEYgPDwgMyk7CisJCXRtcDEwM19fIHw9IChwU3JjLT50eFpMRiA8PCA0KTsKKwkJdG1wMTAzX18gfD0gKHBTcmMtPmltcGxpY2l0VHhCRiA8PCA1KTsKKwkJdG1wMTAzX18gfD0gKHBTcmMtPmNhbGlicmF0aW9uIDw8IDYpOworCQl0bXAxMDNfXyB8PSAocFNyYy0+ZXhwbGljaXRDU0lUeEJGIDw8IDgpOworCQl0bXAxMDNfXyB8PSAocFNyYy0+ZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCA8PCA5KTsKKwkJdG1wMTAzX18gfD0gKHBTcmMtPmV4cGxpY2l0QkZDU0lGZWVkYmFjayA8PCAxMCk7CisJCXRtcDEwM19fIHw9IChwU3JjLT5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgPDwgMTMpOworCQl0bXAxMDNfXyB8PSAocFNyYy0+ZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayA8PCAxNik7CisJCXRtcDEwM19fIHw9IChwU3JjLT5jc2lOdW1CRkFudGVubmFlIDw8IDE5KTsKKwkJdG1wMTAzX18gfD0gKHBTcmMtPnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSA8PCAyMSk7CisJCXRtcDEwM19fIHw9IChwU3JjLT5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlIDw8IDIzKTsKKwkJdG1wMTAzX18gfD0gKHBTcmMtPnJlc2VydmVkNCA8PCAyNSk7CisJCWZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHRtcDEwM19fLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQluQnVmIC09ICA0IDsKKwkJdG1wMTA0X18gPSAwVTsKKwkJdG1wMTA0X18gfD0gKHBTcmMtPmFudGVubmFTZWxlY3Rpb24gPDwgMCk7CisJCXRtcDEwNF9fIHw9IChwU3JjLT5leHBsaWNpdENTSUZlZWRiYWNrVHggPDwgMSk7CisJCXRtcDEwNF9fIHw9IChwU3JjLT5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHggPDwgMik7CisJCXRtcDEwNF9fIHw9IChwU3JjLT5leHBsaWNpdENTSUZlZWRiYWNrIDw8IDMpOworCQl0bXAxMDRfXyB8PSAocFNyYy0+YW50ZW5uYUluZGljZXNGZWVkYmFjayA8PCA0KTsKKwkJdG1wMTA0X18gfD0gKHBTcmMtPnJ4QVMgPDwgNSk7CisJCXRtcDEwNF9fIHw9IChwU3JjLT50eFNvdW5kaW5nUFBEVXMgPDwgNik7CisJCXRtcDEwNF9fIHw9IChwU3JjLT5yZXNlcnZlZDUgPDwgNyk7CisJCSpwQnVmID0gdG1wMTA0X187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5yc3ZkKSwgcFNyYy0+bnVtX3JzdmQpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fcnN2ZDsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfaHRfY2Fwcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfaHRfaW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgIHREb3QxMWZJRUhUSW5mbyAqcFNyYywKKwkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkgICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQ4X3QgdG1wMTA1X187CisJdWludDE2X3QgdG1wMTA2X187CisJdWludDE2X3QgdG1wMTA3X187CisJbk5lZWRlZCAgKz0gIChwU3JjLT5udW1fcnN2ZCArIDIyKTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA2MTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPnByaW1hcnlDaGFubmVsOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCXRtcDEwNV9fID0gMFU7CisJCXRtcDEwNV9fIHw9IChwU3JjLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0IDw8IDApOworCQl0bXAxMDVfXyB8PSAocFNyYy0+cmVjb21tZW5kZWRUeFdpZHRoU2V0IDw8IDIpOworCQl0bXAxMDVfXyB8PSAocFNyYy0+cmlmc01vZGUgPDwgMyk7CisJCXRtcDEwNV9fIHw9IChwU3JjLT5jb250cm9sbGVkQWNjZXNzT25seSA8PCA0KTsKKwkJdG1wMTA1X18gfD0gKHBTcmMtPnNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5IDw8IDUpOworCQkqcEJ1ZiA9IHRtcDEwNV9fOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCW5CdWYgLT0gIDEgOworCQl0bXAxMDZfXyA9IDBVOworCQl0bXAxMDZfXyB8PSAocFNyYy0+b3BNb2RlIDw8IDApOworCQl0bXAxMDZfXyB8PSAocFNyYy0+bm9uR0ZEZXZpY2VzUHJlc2VudCA8PCAyKTsKKwkJdG1wMTA2X18gfD0gKHBTcmMtPnRyYW5zbWl0QnVyc3RMaW1pdCA8PCAzKTsKKwkJdG1wMTA2X18gfD0gKHBTcmMtPm9ic3NOb25IVFN0YVByZXNlbnQgPDwgNCk7CisJCXRtcDEwNl9fIHw9IChwU3JjLT5yZXNlcnZlZCA8PCA1KTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgdG1wMTA2X18sIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCW5CdWYgLT0gIDIgOworCQl0bXAxMDdfXyA9IDBVOworCQl0bXAxMDdfXyB8PSAocFNyYy0+YmFzaWNTVEJDTUNTIDw8IDApOworCQl0bXAxMDdfXyB8PSAocFNyYy0+ZHVhbENUU1Byb3RlY3Rpb24gPDwgNyk7CisJCXRtcDEwN19fIHw9IChwU3JjLT5zZWNvbmRhcnlCZWFjb24gPDwgOCk7CisJCXRtcDEwN19fIHw9IChwU3JjLT5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA8PCA5KTsKKwkJdG1wMTA3X18gfD0gKHBTcmMtPnBjb0FjdGl2ZSA8PCAxMCk7CisJCXRtcDEwN19fIHw9IChwU3JjLT5wY29QaGFzZSA8PCAxMSk7CisJCXRtcDEwN19fIHw9IChwU3JjLT5yZXNlcnZlZDIgPDwgMTIpOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXAxMDdfXywgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJbkJ1ZiAtPSAgMiA7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+YmFzaWNNQ1NTZXQsIDE2KTsKKwkJKnBuQ29uc3VtZWQgKz0gMTY7CisJCXBCdWYgKz0gMTY7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5yc3ZkKSwgcFNyYy0+bnVtX3JzdmQpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fcnN2ZDsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfaHRfaW5mby4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfaWJzc19wYXJhbXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICB0RG90MTFmSUVJQlNTUGFyYW1zICpwU3JjLAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMjsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA2OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmF0aW0sIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9pYnNzX3BhcmFtcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfbGlua19pZGVudGlmaWVyKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHREb3QxMWZJRUxpbmtJZGVudGlmaWVyICpwU3JjLAorCQkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMTg7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMTAxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+YnNzaWQsIDYpOworCQkqcG5Db25zdW1lZCArPSA2OworCQlwQnVmICs9IDY7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+SW5pdFN0YUFkZHIsIDYpOworCQkqcG5Db25zdW1lZCArPSA2OworCQlwQnVmICs9IDY7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+UmVzcFN0YUFkZHIsIDYpOworCQkqcG5Db25zdW1lZCArPSA2OworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9saW5rX2lkZW50aWZpZXIuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX21lYXN1cmVtZW50X3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICpwU3JjLAorCQkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgdWludDMyX3QgbkJ1ZiwKKwkJCQkJICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDhfdCB0bXAxMDhfXzsKKwl1aW50OF90IHRtcDEwOV9fOworCXVpbnQ4X3QgdG1wMTEwX187CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfaWVfbWVhc3VyZW1lbnRfcmVwb3J0KHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAzOTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPnRva2VuOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCXRtcDEwOF9fID0gMFU7CisJCXRtcDEwOF9fIHw9IChwU3JjLT5sYXRlIDw8IDApOworCQl0bXAxMDhfXyB8PSAocFNyYy0+aW5jYXBhYmxlIDw8IDEpOworCQl0bXAxMDhfXyB8PSAocFNyYy0+cmVmdXNlZCA8PCAyKTsKKwkJdG1wMTA4X18gfD0gKHBTcmMtPnVudXNlZCA8PCAzKTsKKwkJKnBCdWYgPSB0bXAxMDhfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQluQnVmIC09ICAxIDsKKwkJKnBCdWYgPSBwU3JjLT50eXBlOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCWlmIChwU3JjLT50eXBlKSB7CisJCQlzd2l0Y2ggKHBTcmMtPnR5cGUpIHsKKwkJCWNhc2UgMDoKKwkJCQkqcEJ1ZiA9IHBTcmMtPnJlcG9ydC5CYXNpYy5jaGFubmVsOworCQkJCSpwbkNvbnN1bWVkICs9IDE7CisJCQkJcEJ1ZiArPSAxOworCQkJCWZyYW1lc2h0b25xKHBDdHgsIHBCdWYsIHBTcmMtPnJlcG9ydC5CYXNpYy5tZWFzX3N0YXJ0X3RpbWUsIDApOworCQkJCSpwbkNvbnN1bWVkICs9IDg7CisJCQkJcEJ1ZiArPSA4OworCQkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnJlcG9ydC5CYXNpYy5tZWFzX2R1cmF0aW9uLCAwKTsKKwkJCQkqcG5Db25zdW1lZCArPSAyOworCQkJCXBCdWYgKz0gMjsKKwkJCQl0bXAxMDlfXyA9IDBVOworCQkJCXRtcDEwOV9fIHw9IChwU3JjLT5yZXBvcnQuQmFzaWMuYnNzIDw8IDApOworCQkJCXRtcDEwOV9fIHw9IChwU3JjLT5yZXBvcnQuQmFzaWMub2ZkbV9wcmVhbWJsZSA8PCAxKTsKKwkJCQl0bXAxMDlfXyB8PSAocFNyYy0+cmVwb3J0LkJhc2ljLnVuaWRfc2lnbmFsIDw8IDIpOworCQkJCXRtcDEwOV9fIHw9IChwU3JjLT5yZXBvcnQuQmFzaWMucmFkZXIgPDwgMyk7CisJCQkJdG1wMTA5X18gfD0gKHBTcmMtPnJlcG9ydC5CYXNpYy51bm1lYXN1cmVkIDw8IDQpOworCQkJCXRtcDEwOV9fIHw9IChwU3JjLT5yZXBvcnQuQmFzaWMudW51c2VkIDw8IDUpOworCQkJCSpwQnVmID0gdG1wMTA5X187CisJCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCQkvKiBmaWVsZHNFbmRGbGFnICA9IDEgKi8KKwkJCQluQnVmIC09ICAxIDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQkqcEJ1ZiA9IHBTcmMtPnJlcG9ydC5DQ0EuY2hhbm5lbDsKKwkJCQkqcG5Db25zdW1lZCArPSAxOworCQkJCXBCdWYgKz0gMTsKKwkJCQlmcmFtZXNodG9ucShwQ3R4LCBwQnVmLCBwU3JjLT5yZXBvcnQuQ0NBLm1lYXNfc3RhcnRfdGltZSwgMCk7CisJCQkJKnBuQ29uc3VtZWQgKz0gODsKKwkJCQlwQnVmICs9IDg7CisJCQkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+cmVwb3J0LkNDQS5tZWFzX2R1cmF0aW9uLCAwKTsKKwkJCQkqcG5Db25zdW1lZCArPSAyOworCQkJCXBCdWYgKz0gMjsKKwkJCQkqcEJ1ZiA9IHBTcmMtPnJlcG9ydC5DQ0EuY2NhX2J1c3lfZnJhY3Rpb247CisJCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCSpwQnVmID0gcFNyYy0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5jaGFubmVsOworCQkJCSpwbkNvbnN1bWVkICs9IDE7CisJCQkJcEJ1ZiArPSAxOworCQkJCWZyYW1lc2h0b25xKHBDdHgsIHBCdWYsIHBTcmMtPnJlcG9ydC5SUElIaXN0b2dyYW0ubWVhc19zdGFydF90aW1lLCAwKTsKKwkJCQkqcG5Db25zdW1lZCArPSA4OworCQkJCXBCdWYgKz0gODsKKwkJCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5yZXBvcnQuUlBJSGlzdG9ncmFtLm1lYXNfZHVyYXRpb24sIDApOworCQkJCSpwbkNvbnN1bWVkICs9IDI7CisJCQkJcEJ1ZiArPSAyOworCQkJCSpwQnVmID0gcFNyYy0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkwX2RlbnNpdHk7CisJCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCQlwQnVmICs9IDE7CisJCQkJKnBCdWYgPSBwU3JjLT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTFfZGVuc2l0eTsKKwkJCQkqcG5Db25zdW1lZCArPSAxOworCQkJCXBCdWYgKz0gMTsKKwkJCQkqcEJ1ZiA9IHBTcmMtPnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpMl9kZW5zaXR5OworCQkJCSpwbkNvbnN1bWVkICs9IDE7CisJCQkJcEJ1ZiArPSAxOworCQkJCSpwQnVmID0gcFNyYy0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkzX2RlbnNpdHk7CisJCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCQlwQnVmICs9IDE7CisJCQkJKnBCdWYgPSBwU3JjLT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTRfZGVuc2l0eTsKKwkJCQkqcG5Db25zdW1lZCArPSAxOworCQkJCXBCdWYgKz0gMTsKKwkJCQkqcEJ1ZiA9IHBTcmMtPnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpNV9kZW5zaXR5OworCQkJCSpwbkNvbnN1bWVkICs9IDE7CisJCQkJcEJ1ZiArPSAxOworCQkJCSpwQnVmID0gcFNyYy0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk2X2RlbnNpdHk7CisJCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCQlwQnVmICs9IDE7CisJCQkJKnBCdWYgPSBwU3JjLT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTdfZGVuc2l0eTsKKwkJCQkqcG5Db25zdW1lZCArPSAxOworCQkJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJKnBCdWYgPSBwU3JjLT5yZXBvcnQuQmVhY29uLnJlZ0NsYXNzOworCQkJCSpwbkNvbnN1bWVkICs9IDE7CisJCQkJcEJ1ZiArPSAxOworCQkJCSpwQnVmID0gcFNyYy0+cmVwb3J0LkJlYWNvbi5jaGFubmVsOworCQkJCSpwbkNvbnN1bWVkICs9IDE7CisJCQkJcEJ1ZiArPSAxOworCQkJCWZyYW1lc2h0b25xKHBDdHgsIHBCdWYsIHBTcmMtPnJlcG9ydC5CZWFjb24ubWVhc19zdGFydF90aW1lLCAwKTsKKwkJCQkqcG5Db25zdW1lZCArPSA4OworCQkJCXBCdWYgKz0gODsKKwkJCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5yZXBvcnQuQmVhY29uLm1lYXNfZHVyYXRpb24sIDApOworCQkJCSpwbkNvbnN1bWVkICs9IDI7CisJCQkJcEJ1ZiArPSAyOworCQkJCXRtcDExMF9fID0gMFU7CisJCQkJdG1wMTEwX18gfD0gKHBTcmMtPnJlcG9ydC5CZWFjb24uY29uZGVuc2VkX1BIWSA8PCAwKTsKKwkJCQl0bXAxMTBfXyB8PSAocFNyYy0+cmVwb3J0LkJlYWNvbi5yZXBvcnRlZF9mcmFtZV90eXBlIDw8IDcpOworCQkJCSpwQnVmID0gdG1wMTEwX187CisJCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCQlwQnVmICs9IDE7CisJCQkJbkJ1ZiAtPSAgMSA7CisJCQkJKnBCdWYgPSBwU3JjLT5yZXBvcnQuQmVhY29uLlJDUEk7CisJCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCQlwQnVmICs9IDE7CisJCQkJKnBCdWYgPSBwU3JjLT5yZXBvcnQuQmVhY29uLlJTTkk7CisJCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCQlwQnVmICs9IDE7CisJCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5yZXBvcnQuQmVhY29uLkJTU0lELCA2KTsKKwkJCQkqcG5Db25zdW1lZCArPSA2OworCQkJCXBCdWYgKz0gNjsKKwkJCQkqcEJ1ZiA9IHBTcmMtPnJlcG9ydC5CZWFjb24uYW50ZW5uYV9pZDsKKwkJCQkqcG5Db25zdW1lZCArPSAxOworCQkJCXBCdWYgKz0gMTsKKwkJCQlmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5yZXBvcnQuQmVhY29uLnBhcmVudF9UU0YsIDApOworCQkJCSpwbkNvbnN1bWVkICs9IDQ7CisJCQkJcEJ1ZiArPSA0OworCQkJCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LAorCQkJCQkgKHVpbnQ4X3QgKilwU3JjLAorCQkJCQkgcEJ1ZiwKKwkJCQkJIG5CdWYsCisJCQkJCSBwbkNvbnN1bWVkLAorCQkJCQkgRkZTX3JlcG9ydEJlYWNvbiwKKwkJCQkJIElFU19yZXBvcnRCZWFjb24pOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX21lYXN1cmVtZW50X3JlcG9ydC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfbWVhc3VyZW1lbnRfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICB0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QgKnBTcmMsCisJCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgIHVpbnQzMl90IG5CdWYsCisJCQkJCSAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwl1aW50OF90IHRtcDExMV9fOworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2llX21lYXN1cmVtZW50X3JlcXVlc3QocEN0eCwgcFNyYywgJm5OZWVkZWQpOworCWlmICghRE9UMTFGX1NVQ0NFRURFRChzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDM4OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+bWVhc3VyZW1lbnRfdG9rZW47CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJdG1wMTExX18gPSAwVTsKKwkJdG1wMTExX18gfD0gKHBTcmMtPnBhcmFsbGVsIDw8IDApOworCQl0bXAxMTFfXyB8PSAocFNyYy0+ZW5hYmxlIDw8IDEpOworCQl0bXAxMTFfXyB8PSAocFNyYy0+cmVxdWVzdCA8PCAyKTsKKwkJdG1wMTExX18gfD0gKHBTcmMtPnJlcG9ydCA8PCAzKTsKKwkJdG1wMTExX18gfD0gKHBTcmMtPmR1cmF0aW9uTWFuZGF0b3J5IDw8IDQpOworCQl0bXAxMTFfXyB8PSAocFNyYy0+dW51c2VkIDw8IDUpOworCQkqcEJ1ZiA9IHRtcDExMV9fOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCW5CdWYgLT0gIDEgOworCQkqcEJ1ZiA9IHBTcmMtPm1lYXN1cmVtZW50X3R5cGU7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJc3dpdGNoIChwU3JjLT5tZWFzdXJlbWVudF90eXBlKSB7CisJCWNhc2UgMDoKKwkJCSpwQnVmID0gcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CYXNpYy5jaGFubmVsX25vOworCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCXBCdWYgKz0gMTsKKwkJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CYXNpYy5tZWFzX3N0YXJ0X3RpbWUsIDgpOworCQkJKnBuQ29uc3VtZWQgKz0gODsKKwkJCXBCdWYgKz0gODsKKwkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmFzaWMubWVhc19kdXJhdGlvbiwgMCk7CisJCQkqcG5Db25zdW1lZCArPSAyOworCQkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkqcEJ1ZiA9IHBTcmMtPm1lYXN1cmVtZW50X3JlcXVlc3QuQ0NBLmNoYW5uZWxfbm87CisJCQkqcG5Db25zdW1lZCArPSAxOworCQkJcEJ1ZiArPSAxOworCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkNDQS5tZWFzX3N0YXJ0X3RpbWUsIDgpOworCQkJKnBuQ29uc3VtZWQgKz0gODsKKwkJCXBCdWYgKz0gODsKKwkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm1lYXN1cmVtZW50X3JlcXVlc3QuQ0NBLm1lYXNfZHVyYXRpb24sIDApOworCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJKnBCdWYgPSBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LlJQSUhpc3RvZ3JhbS5jaGFubmVsX25vOworCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCXBCdWYgKz0gMTsKKwkJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0ubWVhc19zdGFydF90aW1lLCA4KTsKKwkJCSpwbkNvbnN1bWVkICs9IDg7CisJCQlwQnVmICs9IDg7CisJCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LlJQSUhpc3RvZ3JhbS5tZWFzX2R1cmF0aW9uLCAwKTsKKwkJCSpwbkNvbnN1bWVkICs9IDI7CisJCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCSpwQnVmID0gcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ucmVnQ2xhc3M7CisJCQkqcG5Db25zdW1lZCArPSAxOworCQkJcEJ1ZiArPSAxOworCQkJKnBCdWYgPSBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5jaGFubmVsOworCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCXBCdWYgKz0gMTsKKwkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLnJhbmRvbWl6YXRpb24sIDApOworCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCXBCdWYgKz0gMjsKKwkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLm1lYXNfZHVyYXRpb24sIDApOworCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCXBCdWYgKz0gMjsKKwkJCSpwQnVmID0gcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubWVhc19tb2RlOworCQkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJCXBCdWYgKz0gMTsKKwkJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQlNTSUQsIDYpOworCQkJKnBuQ29uc3VtZWQgKz0gNjsKKwkJCXBCdWYgKz0gNjsKKwkJCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LAorCQkJCSAodWludDhfdCAqKXBTcmMsCisJCQkJIHBCdWYsCisJCQkJIG5CdWYsCisJCQkJIHBuQ29uc3VtZWQsCisJCQkJIEZGU19tZWFzdXJlbWVudF9yZXF1ZXN0QmVhY29uLAorCQkJCSBJRVNfbWVhc3VyZW1lbnRfcmVxdWVzdEJlYWNvbik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfbWVhc3VyZW1lbnRfcmVxdWVzdC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfbW9iaWxpdHlfZG9tYWluKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluICpwU3JjLAorCQkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDhfdCB0bXAxMTJfXzsKKwluTmVlZGVkICArPSAzOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDU0OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPk1ESUQsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCXRtcDExMl9fID0gMFU7CisJCXRtcDExMl9fIHw9IChwU3JjLT5vdmVyRFNDYXAgPDwgMCk7CisJCXRtcDExMl9fIHw9IChwU3JjLT5yZXNvdXJjZVJlcUNhcCA8PCAxKTsKKwkJdG1wMTEyX18gfD0gKHBTcmMtPnJlc2VydmVkIDw8IDIpOworCQkqcEJ1ZiA9IHRtcDExMl9fOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnICA9IDEgKi8KKwkJbkJ1ZiAtPSAgMSA7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX21vYmlsaXR5X2RvbWFpbi4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfbmVpZ2hib3JfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHREb3QxMWZJRU5laWdoYm9yUmVwb3J0ICpwU3JjLAorCQkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDhfdCB0bXAxMTNfXzsKKwl1aW50OF90IHRtcDExNF9fOworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2llX25laWdoYm9yX3JlcG9ydChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisJaWYgKCFET1QxMUZfU1VDQ0VFREVEKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNTI7CisJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+YnNzaWQsIDYpOworCQkqcG5Db25zdW1lZCArPSA2OworCQlwQnVmICs9IDY7CisJCXRtcDExM19fID0gMFU7CisJCXRtcDExM19fIHw9IChwU3JjLT5BUFJlYWNoYWJpbGl0eSA8PCAwKTsKKwkJdG1wMTEzX18gfD0gKHBTcmMtPlNlY3VyaXR5IDw8IDIpOworCQl0bXAxMTNfXyB8PSAocFNyYy0+S2V5U2NvcGUgPDwgMyk7CisJCXRtcDExM19fIHw9IChwU3JjLT5TcGVjTWdtdENhcCA8PCA0KTsKKwkJdG1wMTEzX18gfD0gKHBTcmMtPlFvc0NhcCA8PCA1KTsKKwkJdG1wMTEzX18gfD0gKHBTcmMtPmFwc2QgPDwgNik7CisJCXRtcDExM19fIHw9IChwU3JjLT5ycm0gPDwgNyk7CisJCSpwQnVmID0gdG1wMTEzX187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCXRtcDExNF9fID0gMFU7CisJCXRtcDExNF9fIHw9IChwU3JjLT5EZWxheWVkQkEgPDwgMCk7CisJCXRtcDExNF9fIHw9IChwU3JjLT5JbW1CQSA8PCAxKTsKKwkJdG1wMTE0X18gfD0gKHBTcmMtPk1vYmlsaXR5RG9tYWluIDw8IDIpOworCQl0bXAxMTRfXyB8PSAocFNyYy0+cmVzZXJ2ZWQgPDwgMyk7CisJCSpwQnVmID0gdG1wMTE0X187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnJlc2VydmVkMSwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJKnBCdWYgPSBwU3JjLT5yZWd1bGF0b3J5Q2xhc3M7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5jaGFubmVsOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+UGh5VHlwZTsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwKKwkJCQkodWludDhfdCAqKXBTcmMsCisJCQkJcEJ1ZiwKKwkJCQluQnVmLAorCQkJCXBuQ29uc3VtZWQsCisJCQkJRkZTX05laWdoYm9yUmVwb3J0LAorCQkJCUlFU19OZWlnaGJvclJlcG9ydCk7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9uZWlnaGJvcl9yZXBvcnQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX29ic3Nfc2Nhbl9wYXJhbWV0ZXJzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgIHREb3QxMWZJRU9CU1NTY2FuUGFyYW1ldGVycyAqcFNyYywKKwkJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkJICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDE0OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDc0OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm9ic3NTY2FuUGFzc2l2ZUR3ZWxsLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5vYnNzU2NhbkFjdGl2ZUR3ZWxsLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5ic3NDaGFubmVsV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5vYnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWwsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm9ic3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5ic3NXaWR0aENoYW5uZWxUcmFuc2l0aW9uRGVsYXlGYWN0b3IsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm9ic3NTY2FuQWN0aXZpdHlUaHJlc2hvbGQsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9vYnNzX3NjYW5fcGFyYW1ldGVycy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfb3BlcmF0aW5nX21vZGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICB0RG90MTFmSUVPcGVyYXRpbmdNb2RlICpwU3JjLAorCQkJCSAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDhfdCB0bXAxMTVfXzsKKwluTmVlZGVkICArPSAxOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDE5OTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQl0bXAxMTVfXyA9IDBVOworCQl0bXAxMTVfXyB8PSAocFNyYy0+Y2hhbldpZHRoIDw8IDApOworCQl0bXAxMTVfXyB8PSAocFNyYy0+cmVzZXJ2ZWQgPDwgMik7CisJCXRtcDExNV9fIHw9IChwU3JjLT5yeE5TUyA8PCA0KTsKKwkJdG1wMTE1X18gfD0gKHBTcmMtPnJ4TlNTVHlwZSA8PCA3KTsKKwkJKnBCdWYgPSB0bXAxMTVfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJLyogZmllbGRzRW5kRmxhZyAgPSAxICovCisJCW5CdWYgLT0gIDEgOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9vcGVyYXRpbmdfbW9kZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcDJfcF9hc3NvY19yZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdERvdDExZklFUDJQQXNzb2NSZXEgKnBTcmMsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbiwgaWR4ID0gMCwgaWR4bGFzdDsKKwl1aW50MzJfdCBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfYXNzb2NfcmVxKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCSh2b2lkKXBDdHg7CisJaWYgKHBTcmMtPnByZXNlbnQpIHsKKwkJZG8geworCQkJbkNvbnN1bWVkU29GYXIgPSAqcG5Db25zdW1lZDsKKwkJCSpwQnVmID0gMjIxOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCXBJZUxlbiA9IHBCdWY7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDUwOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg2ZjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4OWE7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDk7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJbiA9ICgyNTUgLSA0KSA8IG5CdWYgPyAoMjU1IC0gNCkgOiBuQnVmOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQ7CisJCQlpZHhsYXN0ID0gaWR4OworCQkJc3RhdHVzID0gcGFja190bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBTcmMsIHBCdWYsIG4sCisJCQkJCSAgICAgICBwbkNvbnN1bWVkLAorCQkJCQkgICAgICAgVExWU19QMlBBc3NvY1JlcSArCisJCQkJCSAgICAgICBpZHgsICZpZHgpOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWROb3c7CisJCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisJCQlwQnVmICs9IG5Db25zdW1lZE5vdzsKKwkJCW5CdWYgLT0gbkNvbnN1bWVkTm93OworCQl9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9wMl9wX2Fzc29jX3JlcS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcDJfcF9hc3NvY19yZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdERvdDExZklFUDJQQXNzb2NSZXMgKnBTcmMsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbiwgaWR4ID0gMCwgaWR4bGFzdDsKKwl1aW50MzJfdCBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfYXNzb2NfcmVzKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCSh2b2lkKXBDdHg7CisJaWYgKHBTcmMtPnByZXNlbnQpIHsKKwkJZG8geworCQkJbkNvbnN1bWVkU29GYXIgPSAqcG5Db25zdW1lZDsKKwkJCSpwQnVmID0gMjIxOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCXBJZUxlbiA9IHBCdWY7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDUwOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg2ZjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4OWE7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDk7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJbiA9ICgyNTUgLSA0KSA8IG5CdWYgPyAoMjU1IC0gNCkgOiBuQnVmOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQ7CisJCQlpZHhsYXN0ID0gaWR4OworCQkJc3RhdHVzID0gcGFja190bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBTcmMsIHBCdWYsIG4sCisJCQkJCSAgICAgICBwbkNvbnN1bWVkLAorCQkJCQkgICAgICAgVExWU19QMlBBc3NvY1JlcyArCisJCQkJCSAgICAgICBpZHgsICZpZHgpOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWROb3c7CisJCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisJCQlwQnVmICs9IG5Db25zdW1lZE5vdzsKKwkJCW5CdWYgLT0gbkNvbnN1bWVkTm93OworCQl9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9wMl9wX2Fzc29jX3Jlcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcDJfcF9iZWFjb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZJRVAyUEJlYWNvbiAqcFNyYywKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuLCBpZHggPSAwLCBpZHhsYXN0OworCXVpbnQzMl90IG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9iZWFjb24ocEN0eCwgcFNyYywgJm5OZWVkZWQpOworCWlmICghRE9UMTFGX1NVQ0NFRURFRChzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJKHZvaWQpcEN0eDsKKwlpZiAocFNyYy0+cHJlc2VudCkgeworCQlkbyB7CisJCQluQ29uc3VtZWRTb0ZhciA9ICpwbkNvbnN1bWVkOworCQkJKnBCdWYgPSAyMjE7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJcEllTGVuID0gcEJ1ZjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4NTA7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDZmOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg5YTsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4OTsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQluID0gKDI1NSAtIDQpIDwgbkJ1ZiA/ICgyNTUgLSA0KSA6IG5CdWY7CisJCQluQ29uc3VtZWROb3cgPSAqcG5Db25zdW1lZDsKKwkJCWlkeGxhc3QgPSBpZHg7CisJCQlzdGF0dXMgPSBwYWNrX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcFNyYywgcEJ1ZiwgbiwKKwkJCQkJICAgICAgIHBuQ29uc3VtZWQsCisJCQkJCSAgICAgICBUTFZTX1AyUEJlYWNvbiArCisJCQkJCSAgICAgICBpZHgsICZpZHgpOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWROb3c7CisJCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisJCQlwQnVmICs9IG5Db25zdW1lZE5vdzsKKwkJCW5CdWYgLT0gbkNvbnN1bWVkTm93OworCQl9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9wMl9wX2JlYWNvbi4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcDJfcF9iZWFjb25fcHJvYmVfcmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgdERvdDExZklFUDJQQmVhY29uUHJvYmVSZXMgKnBTcmMsCisJCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCQkgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbiwgaWR4ID0gMCwgaWR4bGFzdDsKKwl1aW50MzJfdCBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfYmVhY29uX3Byb2JlX3JlcyhwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisJaWYgKCFET1QxMUZfU1VDQ0VFREVEKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkodm9pZClwQ3R4OworCWlmIChwU3JjLT5wcmVzZW50KSB7CisJCWRvIHsKKwkJCW5Db25zdW1lZFNvRmFyID0gKnBuQ29uc3VtZWQ7CisJCQkqcEJ1ZiA9IDIyMTsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQlwSWVMZW4gPSBwQnVmOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg1MDsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4NmY7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDlhOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg5OworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCW4gPSAoMjU1IC0gNCkgPCBuQnVmID8gKDI1NSAtIDQpIDogbkJ1ZjsKKwkJCW5Db25zdW1lZE5vdyA9ICpwbkNvbnN1bWVkOworCQkJaWR4bGFzdCA9IGlkeDsKKwkJCXN0YXR1cyA9IHBhY2tfdGx2X2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwU3JjLCBwQnVmLCBuLAorCQkJCQkgICAgICAgcG5Db25zdW1lZCwKKwkJCQkJICAgICAgIFRMVlNfUDJQQmVhY29uUHJvYmVSZXMgKworCQkJCQkgICAgICAgaWR4LCAmaWR4KTsKKwkJCW5Db25zdW1lZE5vdyA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkTm93OworCQkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworCQkJcEJ1ZiArPSBuQ29uc3VtZWROb3c7CisJCQluQnVmIC09IG5Db25zdW1lZE5vdzsKKwkJfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfcDJfcF9iZWFjb25fcHJvYmVfcmVzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9wMl9wX2RlX2F1dGgodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZJRVAyUERlQXV0aCAqcFNyYywKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuLCBpZHggPSAwLCBpZHhsYXN0OworCXVpbnQzMl90IG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9kZV9hdXRoKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCSh2b2lkKXBDdHg7CisJaWYgKHBTcmMtPnByZXNlbnQpIHsKKwkJZG8geworCQkJbkNvbnN1bWVkU29GYXIgPSAqcG5Db25zdW1lZDsKKwkJCSpwQnVmID0gMjIxOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCXBJZUxlbiA9IHBCdWY7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDUwOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg2ZjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4OWE7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDk7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJbiA9ICgyNTUgLSA0KSA8IG5CdWYgPyAoMjU1IC0gNCkgOiBuQnVmOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQ7CisJCQlpZHhsYXN0ID0gaWR4OworCQkJc3RhdHVzID0gcGFja190bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBTcmMsIHBCdWYsIG4sCisJCQkJCSAgICAgICBwbkNvbnN1bWVkLAorCQkJCQkgICAgICAgVExWU19QMlBEZUF1dGggKworCQkJCQkgICAgICAgaWR4LCAmaWR4KTsKKwkJCW5Db25zdW1lZE5vdyA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkTm93OworCQkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworCQkJcEJ1ZiArPSBuQ29uc3VtZWROb3c7CisJCQluQnVmIC09IG5Db25zdW1lZE5vdzsKKwkJfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfcDJfcF9kZV9hdXRoLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9wMl9wX2Rpc19hc3NvYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB0RG90MTFmSUVQMlBEaXNBc3NvYyAqcFNyYywKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuLCBpZHggPSAwLCBpZHhsYXN0OworCXVpbnQzMl90IG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2llcDJfcF9kaXNfYXNzb2MocEN0eCwgcFNyYywgJm5OZWVkZWQpOworCWlmICghRE9UMTFGX1NVQ0NFRURFRChzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJKHZvaWQpcEN0eDsKKwlpZiAocFNyYy0+cHJlc2VudCkgeworCQlkbyB7CisJCQluQ29uc3VtZWRTb0ZhciA9ICpwbkNvbnN1bWVkOworCQkJKnBCdWYgPSAyMjE7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJcEllTGVuID0gcEJ1ZjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4NTA7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDZmOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg5YTsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4OTsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQluID0gKDI1NSAtIDQpIDwgbkJ1ZiA/ICgyNTUgLSA0KSA6IG5CdWY7CisJCQluQ29uc3VtZWROb3cgPSAqcG5Db25zdW1lZDsKKwkJCWlkeGxhc3QgPSBpZHg7CisJCQlzdGF0dXMgPSBwYWNrX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcFNyYywgcEJ1ZiwgbiwKKwkJCQkJICAgICAgIHBuQ29uc3VtZWQsCisJCQkJCSAgICAgICBUTFZTX1AyUERpc0Fzc29jICsKKwkJCQkJICAgICAgIGlkeCwgJmlkeCk7CisJCQluQ29uc3VtZWROb3cgPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE5vdzsKKwkJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKwkJCXBCdWYgKz0gbkNvbnN1bWVkTm93OworCQkJbkJ1ZiAtPSBuQ29uc3VtZWROb3c7CisJCX0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3AyX3BfZGlzX2Fzc29jLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9wMl9waWVfb3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgIHREb3QxMWZJRVAyUElFT3BhcXVlICpwU3JjLAorCQkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9kYXRhOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDIyMTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NTA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NmY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4OWE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4OTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5kYXRhKSwgcFNyYy0+bnVtX2RhdGEpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fZGF0YTsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfcDJfcGllX29wYXF1ZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcDJfcF9wcm9iZV9yZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdERvdDExZklFUDJQUHJvYmVSZXEgKnBTcmMsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbiwgaWR4ID0gMCwgaWR4bGFzdDsKKwl1aW50MzJfdCBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfcHJvYmVfcmVxKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCSh2b2lkKXBDdHg7CisJaWYgKHBTcmMtPnByZXNlbnQpIHsKKwkJZG8geworCQkJbkNvbnN1bWVkU29GYXIgPSAqcG5Db25zdW1lZDsKKwkJCSpwQnVmID0gMjIxOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCXBJZUxlbiA9IHBCdWY7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDUwOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg2ZjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4OWE7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDk7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJbiA9ICgyNTUgLSA0KSA8IG5CdWYgPyAoMjU1IC0gNCkgOiBuQnVmOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQ7CisJCQlpZHhsYXN0ID0gaWR4OworCQkJc3RhdHVzID0gcGFja190bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBTcmMsIHBCdWYsIG4sCisJCQkJCSAgICAgICBwbkNvbnN1bWVkLAorCQkJCQkgICAgICAgVExWU19QMlBQcm9iZVJlcSArCisJCQkJCSAgICAgICBpZHgsICZpZHgpOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWROb3c7CisJCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisJCQlwQnVmICs9IG5Db25zdW1lZE5vdzsKKwkJCW5CdWYgLT0gbkNvbnN1bWVkTm93OworCQl9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9wMl9wX3Byb2JlX3JlcS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcDJfcF9wcm9iZV9yZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdERvdDExZklFUDJQUHJvYmVSZXMgKnBTcmMsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbiwgaWR4ID0gMCwgaWR4bGFzdDsKKwl1aW50MzJfdCBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZXAyX3BfcHJvYmVfcmVzKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCSh2b2lkKXBDdHg7CisJaWYgKHBTcmMtPnByZXNlbnQpIHsKKwkJZG8geworCQkJbkNvbnN1bWVkU29GYXIgPSAqcG5Db25zdW1lZDsKKwkJCSpwQnVmID0gMjIxOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCXBJZUxlbiA9IHBCdWY7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDUwOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg2ZjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4OWE7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDk7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJbiA9ICgyNTUgLSA0KSA8IG5CdWYgPyAoMjU1IC0gNCkgOiBuQnVmOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQ7CisJCQlpZHhsYXN0ID0gaWR4OworCQkJc3RhdHVzID0gcGFja190bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBTcmMsIHBCdWYsIG4sCisJCQkJCSAgICAgICBwbkNvbnN1bWVkLAorCQkJCQkgICAgICAgVExWU19QMlBQcm9iZVJlcyArCisJCQkJCSAgICAgICBpZHgsICZpZHgpOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWROb3c7CisJCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisJCQlwQnVmICs9IG5Db25zdW1lZE5vdzsKKwkJCW5CdWYgLT0gbkNvbnN1bWVkTm93OworCQl9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9wMl9wX3Byb2JlX3Jlcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcHRpX2NvbnRyb2wodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICB0RG90MTFmSUVQVElDb250cm9sICpwU3JjLAorCQkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMzsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAxMDU7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT50aWQ7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+c2VxdWVuY2VfY29udHJvbCwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3B0aV9jb250cm9sLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9wdV9idWZmZXJfc3RhdHVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHREb3QxMWZJRVBVQnVmZmVyU3RhdHVzICpwU3JjLAorCQkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDhfdCB0bXAxMTZfXzsKKwluTmVlZGVkICArPSAxOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDEwNjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQl0bXAxMTZfXyA9IDBVOworCQl0bXAxMTZfXyB8PSAocFNyYy0+YWNfYmtfdHJhZmZpY19hdmFsIDw8IDApOworCQl0bXAxMTZfXyB8PSAocFNyYy0+YWNfYmVfdHJhZmZpY19hdmFsIDw8IDEpOworCQl0bXAxMTZfXyB8PSAocFNyYy0+YWNfdmlfdHJhZmZpY19hdmFsIDw8IDIpOworCQl0bXAxMTZfXyB8PSAocFNyYy0+YWNfdm9fdHJhZmZpY19hdmFsIDw8IDMpOworCQl0bXAxMTZfXyB8PSAocFNyYy0+cmVzZXJ2ZWQgPDwgNCk7CisJCSpwQnVmID0gdG1wMTE2X187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCS8qIGZpZWxkc0VuZEZsYWcgID0gMSAqLworCQluQnVmIC09ICAxIDsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfcHVfYnVmZmVyX3N0YXR1cy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcG93ZXJfY2Fwcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgdERvdDExZklFUG93ZXJDYXBzICpwU3JjLAorCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgIHVpbnQzMl90IG5CdWYsCisJCQkJICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMjsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAzMzsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPm1pblR4UG93ZXI7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5tYXhUeFBvd2VyOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9wb3dlcl9jYXBzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9wb3dlcl9jb25zdHJhaW50cyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgdERvdDExZklFUG93ZXJDb25zdHJhaW50cyAqcFNyYywKKwkJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSB1aW50MzJfdCBuQnVmLAorCQkJCQkgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDE7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMzI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT5sb2NhbFBvd2VyQ29uc3RyYWludHM7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3Bvd2VyX2NvbnN0cmFpbnRzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9xYnNzX2xvYWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgdERvdDExZklFUUJTU0xvYWQgKnBTcmMsCisJCQkJIHVpbnQ4X3QgKnBCdWYsCisJCQkJIHVpbnQzMl90IG5CdWYsCisJCQkJIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSA1OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDExOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnN0YWNvdW50LCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQkqcEJ1ZiA9IHBTcmMtPmNoYXV0aWw7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YXZhaWwsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9xYnNzX2xvYWQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX1FDb21WZW5kb3JJRSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgdERvdDExZklFUUNvbVZlbmRvcklFICpwU3JjLAorCQkJCSAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gMjsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyMjE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4YTA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4YzY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPnR5cGU7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5jaGFubmVsOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9RQ29tVmVuZG9ySUUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3Fvc19jYXBzX2FwKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICB0RG90MTFmSUVRT1NDYXBzQXAgKnBTcmMsCisJCQkJICB1aW50OF90ICpwQnVmLAorCQkJCSAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwl1aW50OF90IHRtcDExN19fOworCW5OZWVkZWQgICs9IDE7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNDY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJdG1wMTE3X18gPSAwVTsKKwkJdG1wMTE3X18gfD0gKHBTcmMtPmNvdW50IDw8IDApOworCQl0bXAxMTdfXyB8PSAocFNyYy0+cWFjayA8PCA0KTsKKwkJdG1wMTE3X18gfD0gKHBTcmMtPnFyZXEgPDwgNSk7CisJCXRtcDExN19fIHw9IChwU3JjLT50eG9wcmVxIDw8IDYpOworCQl0bXAxMTdfXyB8PSAocFNyYy0+cmVzZXJ2ZWQgPDwgNyk7CisJCSpwQnVmID0gdG1wMTE3X187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCS8qIGZpZWxkc0VuZEZsYWcgID0gMSAqLworCQluQnVmIC09ICAxIDsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfcW9zX2NhcHNfYXAuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3Fvc19jYXBzX3N0YXRpb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgICAgdERvdDExZklFUU9TQ2Fwc1N0YXRpb24gKnBTcmMsCisJCQkJICAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwl1aW50OF90IHRtcDExOF9fOworCW5OZWVkZWQgICs9IDE7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNDY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJdG1wMTE4X18gPSAwVTsKKwkJdG1wMTE4X18gfD0gKHBTcmMtPmFjdm9fdWFwc2QgPDwgMCk7CisJCXRtcDExOF9fIHw9IChwU3JjLT5hY3ZpX3VhcHNkIDw8IDEpOworCQl0bXAxMThfXyB8PSAocFNyYy0+YWNia191YXBzZCA8PCAyKTsKKwkJdG1wMTE4X18gfD0gKHBTcmMtPmFjYmVfdWFwc2QgPDwgMyk7CisJCXRtcDExOF9fIHw9IChwU3JjLT5xYWNrIDw8IDQpOworCQl0bXAxMThfXyB8PSAocFNyYy0+bWF4X3NwX2xlbmd0aCA8PCA1KTsKKwkJdG1wMTE4X18gfD0gKHBTcmMtPm1vcmVfZGF0YV9hY2sgPDwgNyk7CisJCSpwQnVmID0gdG1wMTE4X187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCS8qIGZpZWxkc0VuZEZsYWcgID0gMSAqLworCQluQnVmIC09ICAxIDsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfcW9zX2NhcHNfc3RhdGlvbi4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcW9zX21hcF9zZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZJRVFvc01hcFNldCAqcFNyYywKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICBwU3JjLT5udW1fZHNjcF9leGNlcHRpb25zOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDExMDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+ZHNjcF9leGNlcHRpb25zKSwgcFNyYy0+bnVtX2RzY3BfZXhjZXB0aW9ucyk7CisJCSpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9kc2NwX2V4Y2VwdGlvbnM7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3Fvc19tYXBfc2V0LiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9xdWlldCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgdERvdDExZklFUXVpZXQgKnBTcmMsCisJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCSAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSA2OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDQwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+Y291bnQ7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5wZXJpb2Q7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+ZHVyYXRpb24sIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm9mZnNldCwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3F1aWV0LiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9yY3BpaWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgICB0RG90MTFmSUVSQ1BJSUUgKnBTcmMsCisJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJICAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAxOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDUzOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+cmNwaTsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfcmNwaWllLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9yaWNfZGF0YV9kZXNjKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgIHREb3QxMWZJRVJJQ0RhdGFEZXNjICpwU3JjLAorCQkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfaWVyaWNfZGF0YV9kZXNjKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsCisJCQkJKHVpbnQ4X3QgKilwU3JjLAorCQkJCXBCdWYsCisJCQkJbkJ1ZiwKKwkJCQlwbkNvbnN1bWVkLAorCQkJCUZGU19SSUNEYXRhRGVzYywKKwkJCQlJRVNfUklDRGF0YURlc2MpOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfcmljX2RhdGFfZGVzYy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfcnNuKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgdERvdDExZklFUlNOICpwU3JjLAorCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCSAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfaWVyc24ocEN0eCwgcFNyYywgJm5OZWVkZWQpOworCWlmICghRE9UMTFGX1NVQ0NFRURFRChzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDQ4OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnZlcnNpb24sIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+Z3BfY2lwaGVyX3N1aXRlLCA0KTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJcEJ1ZiArPSA0OworCQlpZiAocFNyYy0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50KSB7CisJCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQsIDApOworCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCXBCdWYgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5wd2lzZV9jaXBoZXJfc3VpdGVzKSwgKHBTcmMtPnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQpKTsKKwkJKnBuQ29uc3VtZWQgKz0gKHBTcmMtPnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQpOworCQlwQnVmICs9IChwU3JjLT5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKiA0KTsKKwkJaWYgKHBTcmMtPmFrbV9zdWl0ZV9jb3VudCkgeworCQkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YWttX3N1aXRlX2NvdW50LCAwKTsKKwkJCSpwbkNvbnN1bWVkICs9IDI7CisJCQlwQnVmICs9IDI7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+YWttX3N1aXRlcyksIChwU3JjLT5ha21fc3VpdGVfY291bnQgKiA0KSk7CisJCSpwbkNvbnN1bWVkICs9IChwU3JjLT5ha21fc3VpdGVfY291bnQgKiA0KTsKKwkJcEJ1ZiArPSAocFNyYy0+YWttX3N1aXRlX2NvdW50ICogNCk7CisJCWlmIChwU3JjLT5SU05fQ2FwKSB7CisJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPlJTTl9DYXAsIDIpOworCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCXBCdWYgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChwU3JjLT5wbWtpZF9jb3VudCkgeworCQkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+cG1raWRfY291bnQsIDApOworCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCXBCdWYgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5wbWtpZCksIChwU3JjLT5wbWtpZF9jb3VudCAqIDE2KSk7CisJCSpwbkNvbnN1bWVkICs9IChwU3JjLT5wbWtpZF9jb3VudCAqIDE2KTsKKwkJcEJ1ZiArPSAocFNyYy0+cG1raWRfY291bnQgKiAxNik7CisJCWlmIChwU3JjLT5ncF9tZ210X2NpcGhlcl9zdWl0ZSkgeworCQkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5ncF9tZ210X2NpcGhlcl9zdWl0ZSwgNCk7CisJCQkqcG5Db25zdW1lZCArPSA0OworCQkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9yc24uICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3JzbmlpZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICAgIHREb3QxMWZJRVJTTklJRSAqcFNyYywKKwkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkgICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDE7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNjU7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT5yc25pOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9yc25paWUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3Jzbl9vcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZJRVJTTk9wYXF1ZSAqcFNyYywKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICBwU3JjLT5udW1fZGF0YTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA0ODsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+ZGF0YSksIHBTcmMtPm51bV9kYXRhKTsKKwkJKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX2RhdGE7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3Jzbl9vcGFxdWUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3N1cHBfY2hhbm5lbHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgIHREb3QxMWZJRVN1cHBDaGFubmVscyAqcFNyYywKKwkJCQkgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICBwU3JjLT5udW1fYmFuZHMgKiAyOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDM2OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5iYW5kcyksIChwU3JjLT5udW1fYmFuZHMgKiAyKSk7CisJCSpwbkNvbnN1bWVkICs9IChwU3JjLT5udW1fYmFuZHMgKiAyKTsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfc3VwcF9jaGFubmVscy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfc3VwcF9vcGVyYXRpbmdfY2xhc3Nlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICAgIHREb3QxMWZJRVN1cHBPcGVyYXRpbmdDbGFzc2VzICpwU3JjLAorCQkJCQkgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkJICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9jbGFzc2VzOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDU5OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5jbGFzc2VzKSwgcFNyYy0+bnVtX2NsYXNzZXMpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fY2xhc3NlczsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfc3VwcF9vcGVyYXRpbmdfY2xhc3Nlcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfc3VwcF9yYXRlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgdERvdDExZklFU3VwcFJhdGVzICpwU3JjLAorCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgIHVpbnQzMl90IG5CdWYsCisJCQkJICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9yYXRlczsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5yYXRlcyksIHBTcmMtPm51bV9yYXRlcyk7CisJCSpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9yYXRlczsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfc3VwcF9yYXRlcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfdGltKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkgICAgdERvdDExZklFVElNICpwU3JjLAorCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCSAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJbk5lZWRlZCAgKz0gIChwU3JjLT5udW1fdmJtcCArIDMpOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDU7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT5kdGltX2NvdW50OworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+ZHRpbV9wZXJpb2Q7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5ibXBjdGw7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKHBTcmMtPnZibXApLCBwU3JjLT5udW1fdmJtcCk7CisJCSpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV92Ym1wOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV90aW0uICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3RwY19yZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZJRVRQQ1JlcG9ydCAqcFNyYywKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDI7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMzU7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT50eF9wb3dlcjsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPmxpbmtfbWFyZ2luOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV90cGNfcmVwb3J0LiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV90cGNfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHREb3QxMWZJRVRQQ1JlcXVlc3QgKnBTcmMsCisJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAwOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDM0OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3RwY19yZXF1ZXN0LiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV90aW1lX2FkdmVydGlzZW1lbnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICB0RG90MTFmSUVUaW1lQWR2ZXJ0aXNlbWVudCAqcFNyYywKKwkJCQkJICB1aW50OF90ICpwQnVmLAorCQkJCQkgIHVpbnQzMl90IG5CdWYsCisJCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDE2OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDY5OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+dGltaW5nX2NhcGFiaWxpdGllczsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPnRpbWVfdmFsdWUsIDEwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMTA7CisJCXBCdWYgKz0gMTA7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+dGltZV9lcnJvciwgNSk7CisJCSpwbkNvbnN1bWVkICs9IDU7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3RpbWVfYWR2ZXJ0aXNlbWVudC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfdGltZW91dF9pbnRlcnZhbCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQl0RG90MTFmSUVUaW1lb3V0SW50ZXJ2YWwgKnBTcmMsCisJCQkJCXVpbnQ4X3QgKnBCdWYsCisJCQkJCXVpbnQzMl90IG5CdWYsCisJCQkJCXVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSA1OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDU2OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+dGltZW91dFR5cGU7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+dGltZW91dFZhbHVlLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfdGltZW91dF9pbnRlcnZhbC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfdmh0X2V4dF9ic3NfbG9hZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICAgIHREb3QxMWZJRVZIVEV4dEJzc0xvYWQgKnBTcmMsCisJCQkJICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSA1OworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDE5MzsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPm11TUlNT0NhcFN0YUNvdW50OworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+c3NVbmRlclV0aWw7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5Gb3J0eU1IelV0aWw7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5FaWdodHlNSHpVdGlsOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+T25lU2l4dHlNSHpVdGlsOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV92aHRfZXh0X2Jzc19sb2FkLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV92ZW5kb3IxX2llKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICB0RG90MTFmSUVWZW5kb3IxSUUgKnBTcmMsCisJCQkJICB1aW50OF90ICpwQnVmLAorCQkJCSAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAwOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDIyMTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgxMDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgxODsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3ZlbmRvcjFfaWUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3ZlbmRvcjNfaWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZJRVZlbmRvcjNJRSAqcFNyYywKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDA7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMjIxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDE2OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDMyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfdmVuZG9yM19pZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd2FwaSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgICB0RG90MTFmSUVXQVBJICpwU3JjLAorCQkJICAgICB1aW50OF90ICpwQnVmLAorCQkJICAgICB1aW50MzJfdCBuQnVmLAorCQkJICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDE2X3QgdG1wMTE5X187CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfaWV3YXBpKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA2ODsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT52ZXJzaW9uLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5ha21fc3VpdGVfY291bnQsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5ha21fc3VpdGVzKSwgKHBTcmMtPmFrbV9zdWl0ZV9jb3VudCAqIDQpKTsKKwkJKnBuQ29uc3VtZWQgKz0gKHBTcmMtPmFrbV9zdWl0ZV9jb3VudCAqIDQpOworCQlwQnVmICs9IChwU3JjLT5ha21fc3VpdGVfY291bnQgKiA0KTsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+dW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT51bmljYXN0X2NpcGhlcl9zdWl0ZXMpLCAocFNyYy0+dW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQgKiA0KSk7CisJCSpwbkNvbnN1bWVkICs9IChwU3JjLT51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQpOworCQlwQnVmICs9IChwU3JjLT51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPm11bHRpY2FzdF9jaXBoZXJfc3VpdGUsIDQpOworCQkqcG5Db25zdW1lZCArPSA0OworCQlwQnVmICs9IDQ7CisJCXRtcDExOV9fID0gMFU7CisJCXRtcDExOV9fIHw9IChwU3JjLT5wcmVhdXRoIDw8IDApOworCQl0bXAxMTlfXyB8PSAocFNyYy0+cmVzZXJ2ZWQgPDwgMSk7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDExOV9fLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQluQnVmIC09ICAyIDsKKwkJaWYgKHBTcmMtPmJraWRfY291bnQpIHsKKwkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmJraWRfY291bnQsIDApOworCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCXBCdWYgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5ia2lkKSwgKHBTcmMtPmJraWRfY291bnQgKiAxNikpOworCQkqcG5Db25zdW1lZCArPSAocFNyYy0+YmtpZF9jb3VudCAqIDE2KTsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dhcGkuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dhcGlfb3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgdERvdDExZklFV0FQSU9wYXF1ZSAqcFNyYywKKwkJCQkgICB1aW50OF90ICpwQnVmLAorCQkJCSAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICBwU3JjLT5udW1fZGF0YTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA2ODsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+ZGF0YSksIHBTcmMtPm51bV9kYXRhKTsKKwkJKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX2RhdGE7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dhcGlfb3BhcXVlLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93ZmF0cGModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICAgICB0RG90MTFmSUVXRkFUUEMgKnBTcmMsCisJCQkgICAgICAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJICAgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAyOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDIyMTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg1MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHhmMjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg4OworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPnR4UG93ZXI7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5saW5rTWFyZ2luOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV93ZmF0cGMuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dmZGllX29wYXF1ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB0RG90MTFmSUVXRkRJRU9wYXF1ZSAqcFNyYywKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICBwU3JjLT5udW1fZGF0YTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyMjE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDUwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDZmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDlhOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweGE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+ZGF0YSksIHBTcmMtPm51bV9kYXRhKTsKKwkJKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX2RhdGE7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dmZGllX29wYXF1ZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd21tX2NhcHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQl0RG90MTFmSUVXTU1DYXBzICpwU3JjLAorCQkJCXVpbnQ4X3QgKnBCdWYsCisJCQkJdWludDMyX3QgbkJ1ZiwKKwkJCQl1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDhfdCB0bXAxMjBfXzsKKwluTmVlZGVkICArPSAyOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDIyMTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg1MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHhmMjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDU7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPnZlcnNpb247CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJdG1wMTIwX18gPSAwVTsKKwkJdG1wMTIwX18gfD0gKHBTcmMtPnJlc2VydmVkIDw8IDApOworCQl0bXAxMjBfXyB8PSAocFNyYy0+cWFjayA8PCA0KTsKKwkJdG1wMTIwX18gfD0gKHBTcmMtPnF1ZXVlX3JlcXVlc3QgPDwgNSk7CisJCXRtcDEyMF9fIHw9IChwU3JjLT50eG9wX3JlcXVlc3QgPDwgNik7CisJCXRtcDEyMF9fIHw9IChwU3JjLT5tb3JlX2FjayA8PCA3KTsKKwkJKnBCdWYgPSB0bXAxMjBfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJLyogZmllbGRzRW5kRmxhZyAgPSAxICovCisJCW5CdWYgLT0gIDEgOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV93bW1fY2Fwcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd21tX2luZm9fYXAodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZJRVdNTUluZm9BcCAqcFNyYywKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQ4X3QgdG1wMTIxX187CisJbk5lZWRlZCAgKz0gMjsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyMjE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NTA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4ZjI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT52ZXJzaW9uOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCXRtcDEyMV9fID0gMFU7CisJCXRtcDEyMV9fIHw9IChwU3JjLT5wYXJhbV9zZXRfY291bnQgPDwgMCk7CisJCXRtcDEyMV9fIHw9IChwU3JjLT5yZXNlcnZlZCA8PCA0KTsKKwkJdG1wMTIxX18gfD0gKHBTcmMtPnVhcHNkIDw8IDcpOworCQkqcEJ1ZiA9IHRtcDEyMV9fOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnICA9IDEgKi8KKwkJbkJ1ZiAtPSAgMSA7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dtbV9pbmZvX2FwLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93bW1faW5mb19zdGF0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgIHREb3QxMWZJRVdNTUluZm9TdGF0aW9uICpwU3JjLAorCQkJCSAgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgICAgICB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50OF90ICpwSWVMZW4gPSAwOworCXVpbnQzMl90IG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKwl1aW50MzJfdCBuTmVlZGVkID0gMFU7CisJdWludDhfdCB0bXAxMjJfXzsKKwluTmVlZGVkICArPSAyOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDIyMTsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg1MDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHhmMjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPnZlcnNpb247CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJdG1wMTIyX18gPSAwVTsKKwkJdG1wMTIyX18gfD0gKHBTcmMtPmFjdm9fdWFwc2QgPDwgMCk7CisJCXRtcDEyMl9fIHw9IChwU3JjLT5hY3ZpX3VhcHNkIDw8IDEpOworCQl0bXAxMjJfXyB8PSAocFNyYy0+YWNia191YXBzZCA8PCAyKTsKKwkJdG1wMTIyX18gfD0gKHBTcmMtPmFjYmVfdWFwc2QgPDwgMyk7CisJCXRtcDEyMl9fIHw9IChwU3JjLT5yZXNlcnZlZDEgPDwgNCk7CisJCXRtcDEyMl9fIHw9IChwU3JjLT5tYXhfc3BfbGVuZ3RoIDw8IDUpOworCQl0bXAxMjJfXyB8PSAocFNyYy0+cmVzZXJ2ZWQyIDw8IDcpOworCQkqcEJ1ZiA9IHRtcDEyMl9fOworCQkqcG5Db25zdW1lZCArPSAxOworCQkvKiBmaWVsZHNFbmRGbGFnICA9IDEgKi8KKwkJbkJ1ZiAtPSAgMSA7CisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dtbV9pbmZvX3N0YXRpb24uICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dtbV9wYXJhbXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZJRVdNTVBhcmFtcyAqcFNyYywKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQ4X3QgdG1wMTIzX187CisJdWludDhfdCB0bXAxMjRfXzsKKwl1aW50OF90IHRtcDEyNV9fOworCXVpbnQ4X3QgdG1wMTI2X187CisJdWludDhfdCB0bXAxMjdfXzsKKwl1aW50OF90IHRtcDEyOF9fOworCXVpbnQ4X3QgdG1wMTI5X187CisJdWludDhfdCB0bXAxMzBfXzsKKwluTmVlZGVkICArPSAxOTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyMjE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NTA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4ZjI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4MjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT52ZXJzaW9uOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+cW9zSW5mbzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPnJlc2VydmVkMjsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQl0bXAxMjNfXyA9IDBVOworCQl0bXAxMjNfXyB8PSAocFNyYy0+YWNiZV9haWZzbiA8PCAwKTsKKwkJdG1wMTIzX18gfD0gKHBTcmMtPmFjYmVfYWNtIDw8IDQpOworCQl0bXAxMjNfXyB8PSAocFNyYy0+YWNiZV9hY2kgPDwgNSk7CisJCXRtcDEyM19fIHw9IChwU3JjLT51bnVzZWQxIDw8IDcpOworCQkqcEJ1ZiA9IHRtcDEyM19fOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCW5CdWYgLT0gIDEgOworCQl0bXAxMjRfXyA9IDBVOworCQl0bXAxMjRfXyB8PSAocFNyYy0+YWNiZV9hY3dtaW4gPDwgMCk7CisJCXRtcDEyNF9fIHw9IChwU3JjLT5hY2JlX2Fjd21heCA8PCA0KTsKKwkJKnBCdWYgPSB0bXAxMjRfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQluQnVmIC09ICAxIDsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YWNiZV90eG9wbGltaXQsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQlwQnVmICs9IDI7CisJCXRtcDEyNV9fID0gMFU7CisJCXRtcDEyNV9fIHw9IChwU3JjLT5hY2JrX2FpZnNuIDw8IDApOworCQl0bXAxMjVfXyB8PSAocFNyYy0+YWNia19hY20gPDwgNCk7CisJCXRtcDEyNV9fIHw9IChwU3JjLT5hY2JrX2FjaSA8PCA1KTsKKwkJdG1wMTI1X18gfD0gKHBTcmMtPnVudXNlZDIgPDwgNyk7CisJCSpwQnVmID0gdG1wMTI1X187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCXRtcDEyNl9fID0gMFU7CisJCXRtcDEyNl9fIHw9IChwU3JjLT5hY2JrX2Fjd21pbiA8PCAwKTsKKwkJdG1wMTI2X18gfD0gKHBTcmMtPmFjYmtfYWN3bWF4IDw8IDQpOworCQkqcEJ1ZiA9IHRtcDEyNl9fOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCW5CdWYgLT0gIDEgOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hY2JrX3R4b3BsaW1pdCwgMCk7CisJCSpwbkNvbnN1bWVkICs9IDI7CisJCXBCdWYgKz0gMjsKKwkJdG1wMTI3X18gPSAwVTsKKwkJdG1wMTI3X18gfD0gKHBTcmMtPmFjdmlfYWlmc24gPDwgMCk7CisJCXRtcDEyN19fIHw9IChwU3JjLT5hY3ZpX2FjbSA8PCA0KTsKKwkJdG1wMTI3X18gfD0gKHBTcmMtPmFjdmlfYWNpIDw8IDUpOworCQl0bXAxMjdfXyB8PSAocFNyYy0+dW51c2VkMyA8PCA3KTsKKwkJKnBCdWYgPSB0bXAxMjdfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQluQnVmIC09ICAxIDsKKwkJdG1wMTI4X18gPSAwVTsKKwkJdG1wMTI4X18gfD0gKHBTcmMtPmFjdmlfYWN3bWluIDw8IDApOworCQl0bXAxMjhfXyB8PSAocFNyYy0+YWN2aV9hY3dtYXggPDwgNCk7CisJCSpwQnVmID0gdG1wMTI4X187CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJbkJ1ZiAtPSAgMSA7CisJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmFjdmlfdHhvcGxpbWl0LCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQl0bXAxMjlfXyA9IDBVOworCQl0bXAxMjlfXyB8PSAocFNyYy0+YWN2b19haWZzbiA8PCAwKTsKKwkJdG1wMTI5X18gfD0gKHBTcmMtPmFjdm9fYWNtIDw8IDQpOworCQl0bXAxMjlfXyB8PSAocFNyYy0+YWN2b19hY2kgPDwgNSk7CisJCXRtcDEyOV9fIHw9IChwU3JjLT51bnVzZWQ0IDw8IDcpOworCQkqcEJ1ZiA9IHRtcDEyOV9fOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCW5CdWYgLT0gIDEgOworCQl0bXAxMzBfXyA9IDBVOworCQl0bXAxMzBfXyB8PSAocFNyYy0+YWN2b19hY3dtaW4gPDwgMCk7CisJCXRtcDEzMF9fIHw9IChwU3JjLT5hY3ZvX2Fjd21heCA8PCA0KTsKKwkJKnBCdWYgPSB0bXAxMzBfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQluQnVmIC09ICAxIDsKKwkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YWN2b190eG9wbGltaXQsIDApOworCQkqcG5Db25zdW1lZCArPSAyOworCQkvKiBmaWVsZHNFbmRGbGFnID0gMSAqLworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV93bW1fcGFyYW1zLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93cGEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCSAgICB0RG90MTFmSUVXUEEgKnBTcmMsCisJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCSAgICB1aW50MzJfdCBuQnVmLAorCQkJICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZXdwYShwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisJaWYgKCFET1QxMUZfU1VDQ0VFREVEKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMjIxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDUwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweGYyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT52ZXJzaW9uLCAwKTsKKwkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJcEJ1ZiArPSAyOworCQlpZiAocFNyYy0+bXVsdGljYXN0X2NpcGhlcl9wcmVzZW50KSB7CisJCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPm11bHRpY2FzdF9jaXBoZXIsIDQpOworCQkJKnBuQ29uc3VtZWQgKz0gNDsKKwkJCXBCdWYgKz0gNDsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChwU3JjLT51bmljYXN0X2NpcGhlcl9jb3VudCkgeworCQkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+dW5pY2FzdF9jaXBoZXJfY291bnQsIDApOworCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCXBCdWYgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT51bmljYXN0X2NpcGhlcnMpLCAocFNyYy0+dW5pY2FzdF9jaXBoZXJfY291bnQgKiA0KSk7CisJCSpwbkNvbnN1bWVkICs9IChwU3JjLT51bmljYXN0X2NpcGhlcl9jb3VudCAqIDQpOworCQlwQnVmICs9IChwU3JjLT51bmljYXN0X2NpcGhlcl9jb3VudCAqIDQpOworCQlpZiAocFNyYy0+YXV0aF9zdWl0ZV9jb3VudCkgeworCQkJZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YXV0aF9zdWl0ZV9jb3VudCwgMCk7CisJCQkqcG5Db25zdW1lZCArPSAyOworCQkJcEJ1ZiArPSAyOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwkJRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKHBTcmMtPmF1dGhfc3VpdGVzKSwgKHBTcmMtPmF1dGhfc3VpdGVfY291bnQgKiA0KSk7CisJCSpwbkNvbnN1bWVkICs9IChwU3JjLT5hdXRoX3N1aXRlX2NvdW50ICogNCk7CisJCXBCdWYgKz0gKHBTcmMtPmF1dGhfc3VpdGVfY291bnQgKiA0KTsKKwkJaWYgKHBTcmMtPmNhcHMpIHsKKwkJCWZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNhcHMsIDApOworCQkJKnBuQ29uc3VtZWQgKz0gMjsKKwkJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfd3BhLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV93cGFfb3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICB0RG90MTFmSUVXUEFPcGFxdWUgKnBTcmMsCisJCQkJICB1aW50OF90ICpwQnVmLAorCQkJCSAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAgcFNyYy0+bnVtX2RhdGE7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gMjIxOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDUwOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweGYyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+ZGF0YSksIHBTcmMtPm51bV9kYXRhKTsKKwkJKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX2RhdGE7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dwYV9vcGFxdWUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dzYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgIHREb3QxMWZJRVdTQyAqcFNyYywKKwkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuLCBpZHggPSAwLCBpZHhsYXN0OworCXVpbnQzMl90IG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2lld3NjKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCSh2b2lkKXBDdHg7CisJaWYgKHBTcmMtPnByZXNlbnQpIHsKKwkJZG8geworCQkJbkNvbnN1bWVkU29GYXIgPSAqcG5Db25zdW1lZDsKKwkJCSpwQnVmID0gMjIxOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCXBJZUxlbiA9IHBCdWY7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDA7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDUwOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHhmMjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4NDsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQluID0gKDI1NSAtIDQpIDwgbkJ1ZiA/ICgyNTUgLSA0KSA6IG5CdWY7CisJCQluQ29uc3VtZWROb3cgPSAqcG5Db25zdW1lZDsKKwkJCWlkeGxhc3QgPSBpZHg7CisJCQlzdGF0dXMgPSBwYWNrX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcFNyYywgcEJ1ZiwgbiwKKwkJCQkJICAgICAgIHBuQ29uc3VtZWQsCisJCQkJCSAgICAgICBUTFZTX1dTQyArCisJCQkJCSAgICAgICBpZHgsICZpZHgpOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWROb3c7CisJCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisJCQlwQnVmICs9IG5Db25zdW1lZE5vdzsKKwkJCW5CdWYgLT0gbkNvbnN1bWVkTm93OworCQl9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV93c2MuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dzY19hc3NvY19yZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdERvdDExZklFV3NjQXNzb2NSZXEgKnBTcmMsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbiwgaWR4ID0gMCwgaWR4bGFzdDsKKwl1aW50MzJfdCBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZV93c2NfYXNzb2NfcmVxKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCSh2b2lkKXBDdHg7CisJaWYgKHBTcmMtPnByZXNlbnQpIHsKKwkJZG8geworCQkJbkNvbnN1bWVkU29GYXIgPSAqcG5Db25zdW1lZDsKKwkJCSpwQnVmID0gMjIxOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCXBJZUxlbiA9IHBCdWY7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDA7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDUwOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHhmMjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4NDsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQluID0gKDI1NSAtIDQpIDwgbkJ1ZiA/ICgyNTUgLSA0KSA6IG5CdWY7CisJCQluQ29uc3VtZWROb3cgPSAqcG5Db25zdW1lZDsKKwkJCWlkeGxhc3QgPSBpZHg7CisJCQlzdGF0dXMgPSBwYWNrX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcFNyYywgcEJ1ZiwgbiwKKwkJCQkJICAgICAgIHBuQ29uc3VtZWQsCisJCQkJCSAgICAgICBUTFZTX1dzY0Fzc29jUmVxICsKKwkJCQkJICAgICAgIGlkeCwgJmlkeCk7CisJCQluQ29uc3VtZWROb3cgPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE5vdzsKKwkJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKwkJCXBCdWYgKz0gbkNvbnN1bWVkTm93OworCQkJbkJ1ZiAtPSBuQ29uc3VtZWROb3c7CisJCX0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dzY19hc3NvY19yZXEuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dzY19hc3NvY19yZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgICAgdERvdDExZklFV3NjQXNzb2NSZXMgKnBTcmMsCisJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbiwgaWR4ID0gMCwgaWR4bGFzdDsKKwl1aW50MzJfdCBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZV93c2NfYXNzb2NfcmVzKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAobk5lZWRlZCA+IG5CdWYpCisJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCSh2b2lkKXBDdHg7CisJaWYgKHBTcmMtPnByZXNlbnQpIHsKKwkJZG8geworCQkJbkNvbnN1bWVkU29GYXIgPSAqcG5Db25zdW1lZDsKKwkJCSpwQnVmID0gMjIxOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCXBJZUxlbiA9IHBCdWY7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDA7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDUwOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHhmMjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4NDsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQluID0gKDI1NSAtIDQpIDwgbkJ1ZiA/ICgyNTUgLSA0KSA6IG5CdWY7CisJCQluQ29uc3VtZWROb3cgPSAqcG5Db25zdW1lZDsKKwkJCWlkeGxhc3QgPSBpZHg7CisJCQlzdGF0dXMgPSBwYWNrX3Rsdl9jb3JlKHBDdHgsICh1aW50OF90ICopcFNyYywgcEJ1ZiwgbiwKKwkJCQkJICAgICAgIHBuQ29uc3VtZWQsCisJCQkJCSAgICAgICBUTFZTX1dzY0Fzc29jUmVzICsKKwkJCQkJICAgICAgIGlkeCwgJmlkeCk7CisJCQluQ29uc3VtZWROb3cgPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE5vdzsKKwkJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKwkJCXBCdWYgKz0gbkNvbnN1bWVkTm93OworCQkJbkJ1ZiAtPSBuQ29uc3VtZWROb3c7CisJCX0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dzY19hc3NvY19yZXMuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dzY19iZWFjb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkgIHREb3QxMWZJRVdzY0JlYWNvbiAqcFNyYywKKwkJCQkgIHVpbnQ4X3QgKnBCdWYsCisJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCSAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuLCBpZHggPSAwLCBpZHhsYXN0OworCXVpbnQzMl90IG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2llX3dzY19iZWFjb24ocEN0eCwgcFNyYywgJm5OZWVkZWQpOworCWlmICghRE9UMTFGX1NVQ0NFRURFRChzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJKHZvaWQpcEN0eDsKKwlpZiAocFNyYy0+cHJlc2VudCkgeworCQlkbyB7CisJCQluQ29uc3VtZWRTb0ZhciA9ICpwbkNvbnN1bWVkOworCQkJKnBCdWYgPSAyMjE7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJcEllTGVuID0gcEJ1ZjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4MDsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4NTA7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweGYyOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg0OworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCW4gPSAoMjU1IC0gNCkgPCBuQnVmID8gKDI1NSAtIDQpIDogbkJ1ZjsKKwkJCW5Db25zdW1lZE5vdyA9ICpwbkNvbnN1bWVkOworCQkJaWR4bGFzdCA9IGlkeDsKKwkJCXN0YXR1cyA9IHBhY2tfdGx2X2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwU3JjLCBwQnVmLCBuLAorCQkJCQkgICAgICAgcG5Db25zdW1lZCwKKwkJCQkJICAgICAgIFRMVlNfV3NjQmVhY29uICsKKwkJCQkJICAgICAgIGlkeCwgJmlkeCk7CisJCQluQ29uc3VtZWROb3cgPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE5vdzsKKwkJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKwkJCXBCdWYgKz0gbkNvbnN1bWVkTm93OworCQkJbkJ1ZiAtPSBuQ29uc3VtZWROb3c7CisJCX0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dzY19iZWFjb24uICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3dzY19iZWFjb25fcHJvYmVfcmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCSAgdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMgKnBTcmMsCisJCQkJCSAgdWludDhfdCAqcEJ1ZiwKKwkJCQkJICB1aW50MzJfdCBuQnVmLAorCQkJCQkgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbiwgaWR4ID0gMCwgaWR4bGFzdDsKKwl1aW50MzJfdCBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworCXVpbnQzMl90IHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZV93c2NfYmVhY29uX3Byb2JlX3JlcyhwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisJaWYgKCFET1QxMUZfU1VDQ0VFREVEKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkodm9pZClwQ3R4OworCWlmIChwU3JjLT5wcmVzZW50KSB7CisJCWRvIHsKKwkJCW5Db25zdW1lZFNvRmFyID0gKnBuQ29uc3VtZWQ7CisJCQkqcEJ1ZiA9IDIyMTsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQlwSWVMZW4gPSBwQnVmOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHgwOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg1MDsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4ZjI7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDQ7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJbiA9ICgyNTUgLSA0KSA8IG5CdWYgPyAoMjU1IC0gNCkgOiBuQnVmOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQ7CisJCQlpZHhsYXN0ID0gaWR4OworCQkJc3RhdHVzID0gcGFja190bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBTcmMsIHBCdWYsIG4sCisJCQkJCSAgICAgICBwbkNvbnN1bWVkLAorCQkJCQkgICAgICAgVExWU19Xc2NCZWFjb25Qcm9iZVJlcyArCisJCQkJCSAgICAgICBpZHgsICZpZHgpOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWROb3c7CisJCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisJCQlwQnVmICs9IG5Db25zdW1lZE5vdzsKKwkJCW5CdWYgLT0gbkNvbnN1bWVkTm93OworCQl9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV93c2NfYmVhY29uX3Byb2JlX3Jlcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd3NjX2llX29wYXF1ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB0RG90MTFmSUVXc2NJRU9wYXF1ZSAqcFNyYywKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9ICBwU3JjLT5udW1fZGF0YTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyMjE7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSAweDA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NTA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4ZjI7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4NDsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCURPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJihwU3JjLT5kYXRhKSwgcFNyYy0+bnVtX2RhdGEpOworCQkqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fZGF0YTsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfd3NjX2llX29wYXF1ZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd3NjX3Byb2JlX3JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB0RG90MTFmSUVXc2NQcm9iZVJlcSAqcFNyYywKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuLCBpZHggPSAwLCBpZHhsYXN0OworCXVpbnQzMl90IG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2llX3dzY19wcm9iZV9yZXEocEN0eCwgcFNyYywgJm5OZWVkZWQpOworCWlmICghRE9UMTFGX1NVQ0NFRURFRChzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJKHZvaWQpcEN0eDsKKwlpZiAocFNyYy0+cHJlc2VudCkgeworCQlkbyB7CisJCQluQ29uc3VtZWRTb0ZhciA9ICpwbkNvbnN1bWVkOworCQkJKnBCdWYgPSAyMjE7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJcEllTGVuID0gcEJ1ZjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4MDsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4NTA7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweGYyOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg0OworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCW4gPSAoMjU1IC0gNCkgPCBuQnVmID8gKDI1NSAtIDQpIDogbkJ1ZjsKKwkJCW5Db25zdW1lZE5vdyA9ICpwbkNvbnN1bWVkOworCQkJaWR4bGFzdCA9IGlkeDsKKwkJCXN0YXR1cyA9IHBhY2tfdGx2X2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwU3JjLCBwQnVmLCBuLAorCQkJCQkgICAgICAgcG5Db25zdW1lZCwKKwkJCQkJICAgICAgIFRMVlNfV3NjUHJvYmVSZXEgKworCQkJCQkgICAgICAgaWR4LCAmaWR4KTsKKwkJCW5Db25zdW1lZE5vdyA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkTm93OworCQkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworCQkJcEJ1ZiArPSBuQ29uc3VtZWROb3c7CisJCQluQnVmIC09IG5Db25zdW1lZE5vdzsKKwkJfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfd3NjX3Byb2JlX3JlcS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd3NjX3Byb2JlX3Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgICB0RG90MTFmSUVXc2NQcm9iZVJlcyAqcFNyYywKKwkJCQkgICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuLCBpZHggPSAwLCBpZHhsYXN0OworCXVpbnQzMl90IG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2llX3dzY19wcm9iZV9yZXMocEN0eCwgcFNyYywgJm5OZWVkZWQpOworCWlmICghRE9UMTFGX1NVQ0NFRURFRChzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJKHZvaWQpcEN0eDsKKwlpZiAocFNyYy0+cHJlc2VudCkgeworCQlkbyB7CisJCQluQ29uc3VtZWRTb0ZhciA9ICpwbkNvbnN1bWVkOworCQkJKnBCdWYgPSAyMjE7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJcEllTGVuID0gcEJ1ZjsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4MDsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4NTA7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweGYyOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg0OworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCW4gPSAoMjU1IC0gNCkgPCBuQnVmID8gKDI1NSAtIDQpIDogbkJ1ZjsKKwkJCW5Db25zdW1lZE5vdyA9ICpwbkNvbnN1bWVkOworCQkJaWR4bGFzdCA9IGlkeDsKKwkJCXN0YXR1cyA9IHBhY2tfdGx2X2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwU3JjLCBwQnVmLCBuLAorCQkJCQkgICAgICAgcG5Db25zdW1lZCwKKwkJCQkJICAgICAgIFRMVlNfV3NjUHJvYmVSZXMgKworCQkJCQkgICAgICAgaWR4LCAmaWR4KTsKKwkJCW5Db25zdW1lZE5vdyA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkTm93OworCQkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworCQkJcEJ1ZiArPSBuQ29uc3VtZWROb3c7CisJCQluQnVmIC09IG5Db25zdW1lZE5vdzsKKwkJfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfd3NjX3Byb2JlX3Jlcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfd3NjX3JlYXNzb2NfcmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJICAgICAgdERvdDExZklFV3NjUmVhc3NvY1JlcyAqcFNyYywKKwkJCQkgICAgICB1aW50OF90ICpwQnVmLAorCQkJCSAgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuLCBpZHggPSAwLCBpZHhsYXN0OworCXVpbnQzMl90IG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisJdWludDMyX3Qgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX2llX3dzY19yZWFzc29jX3JlcyhwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisJaWYgKCFET1QxMUZfU1VDQ0VFREVEKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkodm9pZClwQ3R4OworCWlmIChwU3JjLT5wcmVzZW50KSB7CisJCWRvIHsKKwkJCW5Db25zdW1lZFNvRmFyID0gKnBuQ29uc3VtZWQ7CisJCQkqcEJ1ZiA9IDIyMTsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQlwSWVMZW4gPSBwQnVmOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHgwOworCQkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJCSpwQnVmID0gMHg1MDsKKwkJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCQkqcEJ1ZiA9IDB4ZjI7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJKnBCdWYgPSAweDQ7CisJCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkJbiA9ICgyNTUgLSA0KSA8IG5CdWYgPyAoMjU1IC0gNCkgOiBuQnVmOworCQkJbkNvbnN1bWVkTm93ID0gKnBuQ29uc3VtZWQ7CisJCQlpZHhsYXN0ID0gaWR4OworCQkJc3RhdHVzID0gcGFja190bHZfY29yZShwQ3R4LCAodWludDhfdCAqKXBTcmMsIHBCdWYsIG4sCisJCQkJCSAgICAgICBwbkNvbnN1bWVkLAorCQkJCQkgICAgICAgVExWU19Xc2NSZWFzc29jUmVzICsKKwkJCQkJICAgICAgIGlkeCwgJmlkeCk7CisJCQluQ29uc3VtZWROb3cgPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE5vdzsKKwkJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKwkJCXBCdWYgKz0gbkNvbnN1bWVkTm93OworCQkJbkJ1ZiAtPSBuQ29uc3VtZWROb3c7CisJCX0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3dzY19yZWFzc29jX3Jlcy4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfZXh0X2NoYW5fc3dpdGNoX2Fubih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICAgdERvdDExZklFZXh0X2NoYW5fc3dpdGNoX2FubiAqcFNyYywKKwkJCQkJICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICB1aW50MzJfdCBuQnVmLAorCQkJCQkgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCW5OZWVkZWQgICs9IDQ7CisJd2hpbGUgKHBTcmMtPnByZXNlbnQpIHsKKwkJaWYgKG5OZWVkZWQgPiBuQnVmKQorCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCSpwQnVmID0gNjA7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQlwSWVMZW4gPSBwQnVmOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT5zd2l0Y2hfbW9kZTsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPm5ld19yZWdfY2xhc3M7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJKnBCdWYgPSBwU3JjLT5uZXdfY2hhbm5lbDsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQkqcEJ1ZiA9IHBTcmMtPnN3aXRjaF9jb3VudDsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfZXh0X2NoYW5fc3dpdGNoX2Fubi4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCQkgICAgICAgdERvdDExZklFaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSAqcFNyYywKKwkJCQkJICAgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgICAgICB1aW50MzJfdCBuQnVmLAorCQkJCQkgICAgICAgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDhfdCAqcEllTGVuID0gMDsKKwl1aW50MzJfdCBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisJdWludDMyX3Qgbk5lZWRlZCA9IDBVOworCXVpbnQ4X3QgdG1wMTMxX187CisJbk5lZWRlZCAgKz0gMTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA3MjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQl0bXAxMzFfXyA9IDBVOworCQl0bXAxMzFfXyB8PSAocFNyYy0+aW5mb19yZXF1ZXN0IDw8IDApOworCQl0bXAxMzFfXyB8PSAocFNyYy0+Zm9ydHlfbWh6X2ludG9sZXJhbnQgPDwgMSk7CisJCXRtcDEzMV9fIHw9IChwU3JjLT50d2VudHlfbWh6X2Jzc3dpZHRoX3JlcSA8PCAyKTsKKwkJdG1wMTMxX18gfD0gKHBTcmMtPm9ic3Nfc2Nhbl9leGVtcHRpb25fcmVxIDw8IDMpOworCQl0bXAxMzFfXyB8PSAocFNyYy0+b2Jzc19zY2FuX2V4ZW1wdGlvbl9ncmFudCA8PCA0KTsKKwkJdG1wMTMxX18gfD0gKHBTcmMtPnVudXNlZCA8PCA1KTsKKwkJKnBCdWYgPSB0bXAxMzFfXzsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJLyogZmllbGRzRW5kRmxhZyAgPSAxICovCisJCW5CdWYgLT0gIDEgOworCQlicmVhazsKKwl9CisJKHZvaWQpcEN0eDsKKwlpZiAocEllTGVuKSB7CisJCSpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworCX0KKwlyZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZfcGFja19pZV9odDIwNDBfYnNzX2NvZXhpc3RlbmNlLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19pZV9odDIwNDBfYnNzX2ludG9sZXJhbnRfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJCQkJCQkgICAgIHREb3QxMWZJRWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQgKnBTcmMsCisJCQkJCQkgICAgIHVpbnQ4X3QgKnBCdWYsCisJCQkJCQkgICAgIHVpbnQzMl90IG5CdWYsCisJCQkJCQkgICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAgKHBTcmMtPm51bV9jaGFubmVsX2xpc3QgKyAxKTsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSA3MzsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IHBTcmMtPm9wZXJhdGluZ19jbGFzczsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJcEJ1ZiArPSAxOworCQlET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYocFNyYy0+Y2hhbm5lbF9saXN0KSwgcFNyYy0+bnVtX2NoYW5uZWxfbGlzdCk7CisJCSpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9jaGFubmVsX2xpc3Q7CisJCS8qIGZpZWxkc0VuZEZsYWcgPSAxICovCisJCWJyZWFrOworCX0KKwkodm9pZClwQ3R4OworCWlmIChwSWVMZW4pIHsKKwkJKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisJfQorCXJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX2h0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2llX3NlY19jaGFuX29mZnNldF9lbGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwkJCQkJICAgIHREb3QxMWZJRXNlY19jaGFuX29mZnNldF9lbGUgKnBTcmMsCisJCQkJCSAgICB1aW50OF90ICpwQnVmLAorCQkJCQkgICAgdWludDMyX3QgbkJ1ZiwKKwkJCQkJICAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwluTmVlZGVkICArPSAxOworCXdoaWxlIChwU3JjLT5wcmVzZW50KSB7CisJCWlmIChuTmVlZGVkID4gbkJ1ZikKKwkJCXJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworCQkqcEJ1ZiA9IDYyOworCQkrK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJcEllTGVuID0gcEJ1ZjsKKwkJKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gcFNyYy0+c2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwkJKnBuQ29uc3VtZWQgKz0gMTsKKwkJLyogZmllbGRzRW5kRmxhZyA9IDEgKi8KKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmX3BhY2tfaWVfc2VjX2NoYW5fb2Zmc2V0X2VsZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfaWVfdmVuZG9yMl9pZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCSAgIHREb3QxMWZJRXZlbmRvcjJfaWUgKnBTcmMsCisJCQkJICAgdWludDhfdCAqcEJ1ZiwKKwkJCQkgICB1aW50MzJfdCBuQnVmLAorCQkJCSAgIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQ4X3QgKnBJZUxlbiA9IDA7CisJdWludDMyX3QgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCXVpbnQzMl90IG5OZWVkZWQgPSAwVTsKKwl1aW50MzJfdCBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwlzdGF0dXMgPSBkb3QxMWZfZ2V0X3BhY2tlZF9pZV92ZW5kb3IyX2llKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKwlpZiAoIURPVDExRl9TVUNDRUVERUQoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwl3aGlsZSAocFNyYy0+cHJlc2VudCkgeworCQlpZiAobk5lZWRlZCA+IG5CdWYpCisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJKnBCdWYgPSAyMjE7CisJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCXBJZUxlbiA9IHBCdWY7CisJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHgwOworCQkrK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworCQkqcEJ1ZiA9IDB4OTA7CisJCSsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisJCSpwQnVmID0gMHg0YzsKKwkJKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKwkJKnBCdWYgPSBwU3JjLT50eXBlOworCQkqcG5Db25zdW1lZCArPSAxOworCQlwQnVmICs9IDE7CisJCSpwQnVmID0gcFNyYy0+c3ViX3R5cGU7CisJCSpwbkNvbnN1bWVkICs9IDE7CisJCXBCdWYgKz0gMTsKKwkJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsCisJCQkJKHVpbnQ4X3QgKilwU3JjLAorCQkJCXBCdWYsCisJCQkJbkJ1ZiwKKwkJCQlwbkNvbnN1bWVkLAorCQkJCUZGU192ZW5kb3IyX2llLAorCQkJCUlFU192ZW5kb3IyX2llKTsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXBDdHg7CisJaWYgKHBJZUxlbikgeworCQkqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZl9wYWNrX2llX3ZlbmRvcjJfaWUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2FkZF90c19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkFkZFRTUmVxdWVzdCAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX0FkZFRTUmVxdWVzdCwgSUVTX0FkZFRTUmVxdWVzdCk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2FkZF90c19yZXF1ZXN0LiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19hZGRfdHNfcmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmQWRkVFNSZXNwb25zZSAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX0FkZFRTUmVzcG9uc2UsIElFU19BZGRUU1Jlc3BvbnNlKTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfYWRkX3RzX3Jlc3BvbnNlLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19hc3NvY19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkFzc29jUmVxdWVzdCAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX0Fzc29jUmVxdWVzdCwgSUVTX0Fzc29jUmVxdWVzdCk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2Fzc29jX3JlcXVlc3QuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2Fzc29jX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkFzc29jUmVzcG9uc2UgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19Bc3NvY1Jlc3BvbnNlLCBJRVNfQXNzb2NSZXNwb25zZSk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2Fzc29jX3Jlc3BvbnNlLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19hdXRoZW50aWNhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZBdXRoZW50aWNhdGlvbiAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX0F1dGhlbnRpY2F0aW9uLCBJRVNfQXV0aGVudGljYXRpb24pOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19hdXRoZW50aWNhdGlvbi4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfYmVhY29uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkJlYWNvbiAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX0JlYWNvbiwgSUVTX0JlYWNvbik7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2JlYWNvbi4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfYmVhY29uMSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZCZWFjb24xICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfQmVhY29uMSwgSUVTX0JlYWNvbjEpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19iZWFjb24xLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19iZWFjb24yKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkJlYWNvbjIgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19CZWFjb24yLCBJRVNfQmVhY29uMik7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2JlYWNvbjIuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2JlYWNvbl9pX2VzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZkJlYWNvbklFcyAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX0JlYWNvbklFcywgSUVTX0JlYWNvbklFcyk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX2JlYWNvbl9pX2VzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19jaGFubmVsX3N3aXRjaCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZDaGFubmVsU3dpdGNoICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfQ2hhbm5lbFN3aXRjaCwgSUVTX0NoYW5uZWxTd2l0Y2gpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19jaGFubmVsX3N3aXRjaC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfZGVfYXV0aCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZEZUF1dGggKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19EZUF1dGgsIElFU19EZUF1dGgpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19kZV9hdXRoLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19kZWxfdHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmRGVsVFMgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19EZWxUUywgSUVTX0RlbFRTKTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfZGVsX3RzLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19kaXNhc3NvY2lhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZEaXNhc3NvY2lhdGlvbiAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX0Rpc2Fzc29jaWF0aW9uLCBJRVNfRGlzYXNzb2NpYXRpb24pOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19kaXNhc3NvY2lhdGlvbi4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfbGlua19tZWFzdXJlbWVudF9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0ICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfTGlua01lYXN1cmVtZW50UmVwb3J0LCBJRVNfTGlua01lYXN1cmVtZW50UmVwb3J0KTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfbGlua19tZWFzdXJlbWVudF9yZXBvcnQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2xpbmtfbWVhc3VyZW1lbnRfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfTGlua01lYXN1cmVtZW50UmVxdWVzdCwgSUVTX0xpbmtNZWFzdXJlbWVudFJlcXVlc3QpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19saW5rX21lYXN1cmVtZW50X3JlcXVlc3QuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX21lYXN1cmVtZW50X3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZNZWFzdXJlbWVudFJlcG9ydCAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX01lYXN1cmVtZW50UmVwb3J0LCBJRVNfTWVhc3VyZW1lbnRSZXBvcnQpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19tZWFzdXJlbWVudF9yZXBvcnQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX21lYXN1cmVtZW50X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfTWVhc3VyZW1lbnRSZXF1ZXN0LCBJRVNfTWVhc3VyZW1lbnRSZXF1ZXN0KTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfbWVhc3VyZW1lbnRfcmVxdWVzdC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfbmVpZ2hib3JfcmVwb3J0X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0ICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfTmVpZ2hib3JSZXBvcnRSZXF1ZXN0LCBJRVNfTmVpZ2hib3JSZXBvcnRSZXF1ZXN0KTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfbmVpZ2hib3JfcmVwb3J0X3JlcXVlc3QuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX25laWdoYm9yX3JlcG9ydF9yZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfTmVpZ2hib3JSZXBvcnRSZXNwb25zZSwgSUVTX05laWdoYm9yUmVwb3J0UmVzcG9uc2UpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19uZWlnaGJvcl9yZXBvcnRfcmVzcG9uc2UuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX29wZXJhdGluZ19tb2RlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZk9wZXJhdGluZ01vZGUgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19PcGVyYXRpbmdNb2RlLCBJRVNfT3BlcmF0aW5nTW9kZSk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX29wZXJhdGluZ19tb2RlLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19wcm9iZV9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlByb2JlUmVxdWVzdCAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX1Byb2JlUmVxdWVzdCwgSUVTX1Byb2JlUmVxdWVzdCk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3Byb2JlX3JlcXVlc3QuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3Byb2JlX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlByb2JlUmVzcG9uc2UgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19Qcm9iZVJlc3BvbnNlLCBJRVNfUHJvYmVSZXNwb25zZSk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3Byb2JlX3Jlc3BvbnNlLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19xb3NfbWFwX2NvbmZpZ3VyZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZRb3NNYXBDb25maWd1cmUgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19Rb3NNYXBDb25maWd1cmUsIElFU19Rb3NNYXBDb25maWd1cmUpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19xb3NfbWFwX2NvbmZpZ3VyZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfcmFkaW9fbWVhc3VyZW1lbnRfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19SYWRpb01lYXN1cmVtZW50UmVwb3J0LCBJRVNfUmFkaW9NZWFzdXJlbWVudFJlcG9ydCk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3JhZGlvX21lYXN1cmVtZW50X3JlcG9ydC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfcmFkaW9fbWVhc3VyZW1lbnRfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0LCBJRVNfUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19yYWRpb19tZWFzdXJlbWVudF9yZXF1ZXN0LiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19yZV9hc3NvY19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlJlQXNzb2NSZXF1ZXN0ICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfUmVBc3NvY1JlcXVlc3QsIElFU19SZUFzc29jUmVxdWVzdCk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3JlX2Fzc29jX3JlcXVlc3QuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3JlX2Fzc29jX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlJlQXNzb2NSZXNwb25zZSAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX1JlQXNzb2NSZXNwb25zZSwgSUVTX1JlQXNzb2NSZXNwb25zZSk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3JlX2Fzc29jX3Jlc3BvbnNlLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja19zbV9wb3dlcl9zYXZlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlNNUG93ZXJTYXZlICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfU01Qb3dlclNhdmUsIElFU19TTVBvd2VyU2F2ZSk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3NtX3Bvd2VyX3NhdmUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3NhX3F1ZXJ5X3JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZTYVF1ZXJ5UmVxICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfU2FRdWVyeVJlcSwgSUVTX1NhUXVlcnlSZXEpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19zYV9xdWVyeV9yZXEuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3NhX3F1ZXJ5X3JzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZTYVF1ZXJ5UnNwICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfU2FRdWVyeVJzcCwgSUVTX1NhUXVlcnlSc3ApOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja19zYV9xdWVyeV9yc3AuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3RkbHNfZGlzX3JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTRGlzUmVxICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfVERMU0Rpc1JlcSwgSUVTX1RETFNEaXNSZXEpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190ZGxzX2Rpc19yZXEuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3RkbHNfZGlzX3JzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTRGlzUnNwICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfVERMU0Rpc1JzcCwgSUVTX1RETFNEaXNSc3ApOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190ZGxzX2Rpc19yc3AuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3RkbHNfcGVlcl90cmFmZmljX2luZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTUGVlclRyYWZmaWNJbmQgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19URExTUGVlclRyYWZmaWNJbmQsIElFU19URExTUGVlclRyYWZmaWNJbmQpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190ZGxzX3BlZXJfdHJhZmZpY19pbmQuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3RkbHNfcGVlcl90cmFmZmljX3JzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTUGVlclRyYWZmaWNSc3AgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19URExTUGVlclRyYWZmaWNSc3AsIElFU19URExTUGVlclRyYWZmaWNSc3ApOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190ZGxzX3BlZXJfdHJhZmZpY19yc3AuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3RkbHNfc2V0dXBfY25mKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZlRETFNTZXR1cENuZiAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX1RETFNTZXR1cENuZiwgSUVTX1RETFNTZXR1cENuZik7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3RkbHNfc2V0dXBfY25mLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190ZGxzX3NldHVwX3JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZURExTU2V0dXBSZXEgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19URExTU2V0dXBSZXEsIElFU19URExTU2V0dXBSZXEpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190ZGxzX3NldHVwX3JlcS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGRsc19zZXR1cF9yc3AodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVERMU1NldHVwUnNwICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfVERMU1NldHVwUnNwLCBJRVNfVERMU1NldHVwUnNwKTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdGRsc19zZXR1cF9yc3AuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3RkbHNfdGVhcmRvd24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVERMU1RlYXJkb3duICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfVERMU1RlYXJkb3duLCBJRVNfVERMU1RlYXJkb3duKTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdGRsc190ZWFyZG93bi4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdHBjX3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZUUENSZXBvcnQgKnBGcm0sCisJdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbkJ1ZiwgdWludDMyX3QgKnBuQ29uc3VtZWQpCit7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKwkodm9pZClpOworCSpwbkNvbnN1bWVkID0gMFU7CisJc3RhdHVzID0gcGFja19jb3JlKHBDdHgsICh1aW50OF90ICopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwKKwkJCSAgIEZGU19UUENSZXBvcnQsIElFU19UUENSZXBvcnQpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190cGNfcmVwb3J0LiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja190cGNfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZUUENSZXF1ZXN0ICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfVFBDUmVxdWVzdCwgSUVTX1RQQ1JlcXVlc3QpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja190cGNfcmVxdWVzdC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfdGltaW5nX2FkdmVydGlzZW1lbnRfZnJhbWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lLCBJRVNfVGltaW5nQWR2ZXJ0aXNlbWVudEZyYW1lKTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdGltaW5nX2FkdmVydGlzZW1lbnRfZnJhbWUuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX3ZodF9naWRfbWFuYWdlbWVudF9hY3Rpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmVkhUR2lkTWFuYWdlbWVudEFjdGlvbkZyYW1lICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfVkhUR2lkTWFuYWdlbWVudEFjdGlvbkZyYW1lLCBJRVNfVkhUR2lkTWFuYWdlbWVudEFjdGlvbkZyYW1lKTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfdmh0X2dpZF9tYW5hZ2VtZW50X2FjdGlvbl9mcmFtZS4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfd21tX2FkZF90c19yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZldNTUFkZFRTUmVxdWVzdCAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX1dNTUFkZFRTUmVxdWVzdCwgSUVTX1dNTUFkZFRTUmVxdWVzdCk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3dtbV9hZGRfdHNfcmVxdWVzdC4gKi8KKwordWludDMyX3QgZG90MTFmX3BhY2tfd21tX2FkZF90c19yZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCXREb3QxMWZXTU1BZGRUU1Jlc3BvbnNlICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfV01NQWRkVFNSZXNwb25zZSwgSUVTX1dNTUFkZFRTUmVzcG9uc2UpOworCisJcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmX3VucGFja193bW1fYWRkX3RzX3Jlc3BvbnNlLiAqLworCit1aW50MzJfdCBkb3QxMWZfcGFja193bW1fZGVsX3RzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisJdERvdDExZldNTURlbFRTICpwRnJtLAorCXVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IG5CdWYsIHVpbnQzMl90ICpwbkNvbnN1bWVkKQoreworCXVpbnQzMl90IGkgPSAwOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CisJKHZvaWQpaTsKKwkqcG5Db25zdW1lZCA9IDBVOworCXN0YXR1cyA9IHBhY2tfY29yZShwQ3R4LCAodWludDhfdCAqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsCisJCQkgICBGRlNfV01NRGVsVFMsIElFU19XTU1EZWxUUyk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZfdW5wYWNrX3dtbV9kZWxfdHMuICovCisKK3VpbnQzMl90IGRvdDExZl9wYWNrX2h0MjA0MF9ic3NfY29leGlzdGVuY2VfbWdtdF9hY3Rpb25fZnJhbWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKwl0RG90MTFmaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZV9tZ210X2FjdGlvbl9mcmFtZSAqcEZybSwKKwl1aW50OF90ICpwQnVmLCB1aW50MzJfdCBuQnVmLCB1aW50MzJfdCAqcG5Db25zdW1lZCkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBzdGF0dXMgPSAwOworCSh2b2lkKWk7CisJKnBuQ29uc3VtZWQgPSAwVTsKKwlzdGF0dXMgPSBwYWNrX2NvcmUocEN0eCwgKHVpbnQ4X3QgKilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLAorCQkJICAgRkZTX2h0MjA0MF9ic3NfY29leGlzdGVuY2VfbWdtdF9hY3Rpb25fZnJhbWUsIElFU19odDIwNDBfYnNzX2NvZXhpc3RlbmNlX21nbXRfYWN0aW9uX2ZyYW1lKTsKKworCXJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZl91bnBhY2tfaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZV9tZ210X2FjdGlvbl9mcmFtZS4gKi8KKworc3RhdGljIHVpbnQzMl90IHBhY2tfY29yZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJICAgdWludDhfdCAqcFNyYywKKwkJCSAgIHVpbnQ4X3QgKnBCdWYsCisJCQkgICB1aW50MzJfdCAgbkJ1ZiwKKwkJCSAgIHVpbnQzMl90ICpwbkNvbnN1bWVkLAorCQkJICAgY29uc3QgdEZGRGVmbiAgRkZzW10sCisJCQkgICBjb25zdCB0SUVEZWZuICBJRXNbXSkKK3sKKwljb25zdCB0RkZEZWZuICpwRmY7CisJY29uc3QgdElFRGVmbiAqcEllOworCXRGUkFNRVNfQk9PTCAgKnBmRm91bmQ7CisJdWludDhfdCAgICpwQnVmUmVtYWluaW5nOworCXVpbnQxNl90ICBpOworCXVpbnQzMl90ICBuQnVmUmVtYWluaW5nLCBzdGF0dXMsIGxlbjsKKwl1aW50MzJfdCAgY291bnRPZmZzZXQgPSAwOworCisJKHZvaWQpcEN0eDsgLyogU2h1dHVwIHRoZSBjb21waWxlciBpZiB3ZSBoYXZlIG5vIEZGcyBub3IgSUVzLi4uICovCisJaSA9IDA7CisKKwlET1QxMUZfUEFSQU1FVEVSX0NIRUNLMihwU3JjLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkKTsKKworCXN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworCXBCdWZSZW1haW5pbmcgPSBwQnVmOworCW5CdWZSZW1haW5pbmcgPSBuQnVmOworCisJcEZmID0gJihGRnNbMF0pOworCXdoaWxlIChwRmYtPnNpemUpIHsKKwkJaWYgKHBGZi0+c2l6ZSA+IG5CdWZSZW1haW5pbmcpIHsKKwkJCUZSQU1FU19MT0czKHBDdHgsIEZSTE9HRSwgRlJGTCgiVGhlIEZpeGVkIEZpZWxkICVzIHJlcSIKKwkJCQkidWlyZXMgJWQgYnl0ZXMsIGJ1dCB0aGVyZSBhcmUgb25seSAlZCByZW1haW5pbmcuXG4iKSwKKwkJCQlwRmYtPm5hbWUsIHBGZi0+c2l6ZSwgbkJ1ZlJlbWFpbmluZyk7CisJCQlyZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKwkJfQorCisJCXN3aXRjaCAocEZmLT5zaWcpIHsKKwkJY2FzZSBTaWdGZkFJRDoKKwkJCWRvdDExZl9wYWNrX2ZmX2FpZCgKKwkJCQlwQ3R4LCAodERvdDExZkZmQUlEICopCisJCQkJKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZBY3Rpb246CisJCQlkb3QxMWZfcGFja19mZl9hY3Rpb24oCisJCQkJcEN0eCwgKHREb3QxMWZGZkFjdGlvbiAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmQXV0aEFsZ286CisJCQlkb3QxMWZfcGFja19mZl9hdXRoX2FsZ28oCisJCQkJcEN0eCwgKHREb3QxMWZGZkF1dGhBbGdvICopCisJCQkJKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZBdXRoU2VxTm86CisJCQlkb3QxMWZfcGFja19mZl9hdXRoX3NlcV9ubygKKwkJCQlwQ3R4LCAodERvdDExZkZmQXV0aFNlcU5vICopCisJCQkJKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZCZWFjb25JbnRlcnZhbDoKKwkJCWRvdDExZl9wYWNrX2ZmX2JlYWNvbl9pbnRlcnZhbCgKKwkJCQlwQ3R4LCAodERvdDExZkZmQmVhY29uSW50ZXJ2YWwgKikKKwkJCQkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZkNhcGFiaWxpdGllczoKKwkJCWRvdDExZl9wYWNrX2ZmX2NhcGFiaWxpdGllcygKKwkJCQlwQ3R4LCAodERvdDExZkZmQ2FwYWJpbGl0aWVzICopCisJCQkJKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZDYXRlZ29yeToKKwkJCWRvdDExZl9wYWNrX2ZmX2NhdGVnb3J5KAorCQkJCXBDdHgsICh0RG90MTFmRmZDYXRlZ29yeSAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmQ3VycmVudEFQQWRkcmVzczoKKwkJCWRvdDExZl9wYWNrX2ZmX2N1cnJlbnRfYXBfYWRkcmVzcygKKwkJCQlwQ3R4LCAodERvdDExZkZmQ3VycmVudEFQQWRkcmVzcyAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmRGlhbG9nVG9rZW46CisJCQlkb3QxMWZfcGFja19mZl9kaWFsb2dfdG9rZW4oCisJCQkJcEN0eCwgKHREb3QxMWZGZkRpYWxvZ1Rva2VuICopCisJCQkJKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZMaW5rTWFyZ2luOgorCQkJZG90MTFmX3BhY2tfZmZfbGlua19tYXJnaW4oCisJCQkJcEN0eCwgKHREb3QxMWZGZkxpbmtNYXJnaW4gKikKKwkJCQkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZkxpc3RlbkludGVydmFsOgorCQkJZG90MTFmX3BhY2tfZmZfbGlzdGVuX2ludGVydmFsKAorCQkJCXBDdHgsICh0RG90MTFmRmZMaXN0ZW5JbnRlcnZhbCAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmTWF4VHhQb3dlcjoKKwkJCWRvdDExZl9wYWNrX2ZmX21heF90eF9wb3dlcigKKwkJCQlwQ3R4LCAodERvdDExZkZmTWF4VHhQb3dlciAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmTnVtT2ZSZXBldGl0aW9uczoKKwkJCWRvdDExZl9wYWNrX2ZmX251bV9vZl9yZXBldGl0aW9ucygKKwkJCQlwQ3R4LCAodERvdDExZkZmTnVtT2ZSZXBldGl0aW9ucyAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmT3BlcmF0aW5nTW9kZToKKwkJCWRvdDExZl9wYWNrX2ZmX29wZXJhdGluZ19tb2RlKAorCQkJCXBDdHgsICh0RG90MTFmRmZPcGVyYXRpbmdNb2RlICopCisJCQkJKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZSQ1BJOgorCQkJZG90MTFmX3BhY2tfZmZfcmNwaSgKKwkJCQlwQ3R4LCAodERvdDExZkZmUkNQSSAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmUlNOSToKKwkJCWRvdDExZl9wYWNrX2ZmX3JzbmkoCisJCQkJcEN0eCwgKHREb3QxMWZGZlJTTkkgKikKKwkJCQkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZlJlYXNvbjoKKwkJCWRvdDExZl9wYWNrX2ZmX3JlYXNvbigKKwkJCQlwQ3R4LCAodERvdDExZkZmUmVhc29uICopCisJCQkJKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZSeEFudGVubmFJZDoKKwkJCWRvdDExZl9wYWNrX2ZmX3J4X2FudGVubmFfaWQoCisJCQkJcEN0eCwgKHREb3QxMWZGZlJ4QW50ZW5uYUlkICopCisJCQkJKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZTTVBvd2VyTW9kZVNldDoKKwkJCWRvdDExZl9wYWNrX2ZmX3NtX3Bvd2VyX21vZGVfc2V0KAorCQkJCXBDdHgsICh0RG90MTFmRmZTTVBvd2VyTW9kZVNldCAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmU3RhdHVzOgorCQkJZG90MTFmX3BhY2tfZmZfc3RhdHVzKAorCQkJCXBDdHgsICh0RG90MTFmRmZTdGF0dXMgKikKKwkJCQkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZlN0YXR1c0NvZGU6CisJCQlkb3QxMWZfcGFja19mZl9zdGF0dXNfY29kZSgKKwkJCQlwQ3R4LCAodERvdDExZkZmU3RhdHVzQ29kZSAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmVFBDRWxlSUQ6CisJCQlkb3QxMWZfcGFja19mZl90cGNfZWxlX2lkKAorCQkJCXBDdHgsICh0RG90MTFmRmZUUENFbGVJRCAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmVFBDRWxlTGVuOgorCQkJZG90MTFmX3BhY2tfZmZfdHBjX2VsZV9sZW4oCisJCQkJcEN0eCwgKHREb3QxMWZGZlRQQ0VsZUxlbiAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmVFNJbmZvOgorCQkJZG90MTFmX3BhY2tfZmZfdHNfaW5mbygKKwkJCQlwQ3R4LCAodERvdDExZkZmVFNJbmZvICopCisJCQkJKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZUaW1lU3RhbXA6CisJCQlkb3QxMWZfcGFja19mZl90aW1lX3N0YW1wKAorCQkJCXBDdHgsICh0RG90MTFmRmZUaW1lU3RhbXAgKikKKwkJCQkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisJCQlicmVhazsKKwkJY2FzZSBTaWdGZlRyYW5zYWN0aW9uSWQ6CisJCQlkb3QxMWZfcGFja19mZl90cmFuc2FjdGlvbl9pZCgKKwkJCQlwQ3R4LCAodERvdDExZkZmVHJhbnNhY3Rpb25JZCAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmVHhBbnRlbm5hSWQ6CisJCQlkb3QxMWZfcGFja19mZl90eF9hbnRlbm5hX2lkKAorCQkJCXBDdHgsICh0RG90MTFmRmZUeEFudGVubmFJZCAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmVHhQb3dlcjoKKwkJCWRvdDExZl9wYWNrX2ZmX3R4X3Bvd2VyKAorCQkJCXBDdHgsICh0RG90MTFmRmZUeFBvd2VyICopCisJCQkJKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworCQkJYnJlYWs7CisJCWNhc2UgU2lnRmZWaHRNZW1iZXJzaGlwU3RhdHVzQXJyYXk6CisJCQlkb3QxMWZfcGFja19mZl92aHRfbWVtYmVyc2hpcF9zdGF0dXNfYXJyYXkoCisJCQkJcEN0eCwgKHREb3QxMWZGZlZodE1lbWJlcnNoaXBTdGF0dXNBcnJheSAqKQorCQkJCShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFNpZ0ZmVmh0VXNlclBvc2l0aW9uQXJyYXk6CisJCQlkb3QxMWZfcGFja19mZl92aHRfdXNlcl9wb3NpdGlvbl9hcnJheSgKKwkJCQlwQ3R4LCAodERvdDExZkZmVmh0VXNlclBvc2l0aW9uQXJyYXkgKikKKwkJCQkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUZSQU1FU19MT0cxKHBDdHgsIEZSTE9HRSwgRlJGTCgiSU5URVJOQUwgRVJST1ItLSBJIGRvbiIKKwkJCQkiJ3Qga25vdyBhYm91dCB0aGUgRml4ZWQgRmllbGQgJWQ7IHRoaXMgaXMgbW9zdCBsIgorCQkJCSJpa2VseSBhIGJ1ZyBpbiAnZnJhbWVzZycuXG4iKSwgcEZmLT5zaWcpOworCQkJcmV0dXJuIERPVDExRl9JTlRFUk5BTF9FUlJPUjsKKwkJfQorCisJCXBCdWZSZW1haW5pbmcgKz0gcEZmLT5zaXplOworCQluQnVmUmVtYWluaW5nIC09IHBGZi0+c2l6ZTsKKwkJKnBuQ29uc3VtZWQgICArPSBwRmYtPnNpemU7CisJCSsrcEZmOworCisJfQorCisJcEllID0gJihJRXNbMF0pOworCXdoaWxlICgweGZmICE9IHBJZS0+ZWlkKSB7CisJCXBmRm91bmQgPSAodEZSQU1FU19CT09MICopKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJcEllLT5wcmVzZW5jZU9mZnNldCk7CisJCWlmICgqcGZGb3VuZCAmJiBwSWUtPm1pblNpemUgPiBuQnVmUmVtYWluaW5nKSB7CisJCQlGUkFNRVNfTE9HMyhwQ3R4LCBGUkxPR0UsIEZSRkwoIlRoZSBJRSAlcyB0YWtlcyBhdCBsZSIKKwkJCQkiYXN0ICVkIGJ5dGVzLCBidXQgdGhlcmUgYXJlIG9ubHkgJWQgbGVmdCBpbiB0aGUgYiIKKwkJCQkidWZmZXIuXG4iKSwgcEllLT5uYW1lLCBwSWUtPm1pblNpemUsIG5CdWZSZW1haW5pbmcpOworCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCX0KKworCisJCWNvdW50T2Zmc2V0ID0gKCgwID09IHBJZS0+YXJyYXlib3VuZCkgPyAgMSA6ICoodWludDE2X3QgKikocFNyYyArIHBJZS0+Y291bnRPZmZzZXQpKTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50T2Zmc2V0OyArK2kpIHsKKwkJCWxlbiA9IDBVOworCQkJc3dpdGNoIChwSWUtPnNpZykgeworCQkJY2FzZSBTaWdJZUNvbmRlbnNlZENvdW50cnlTdHI6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9jb25kZW5zZWRfY291bnRyeV9zdHIoCisJCQkJcEN0eCwgKHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFQ29uZGVuc2VkQ291bnRyeVN0cikgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUdUSzoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2d0aygKKwkJCQlwQ3R4LCAodERvdDExZklFR1RLICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUdUSykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUlHVEs6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9pZ3RrKAorCQkJCXBDdHgsICh0RG90MTFmSUVJR1RLICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUlHVEspICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVSMEtIX0lEOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfcjBfa2hfaWQoCisJCQkJcEN0eCwgKHREb3QxMWZJRVIwS0hfSUQgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFUjBLSF9JRCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVIxS0hfSUQ6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9yMV9raF9pZCgKKwkJCQlwQ3R4LCAodERvdDExZklFUjFLSF9JRCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVSMUtIX0lEKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llVFNGSW5mbzoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3RzZl9pbmZvKAorCQkJCXBDdHgsICh0RG90MTFmSUVUU0ZJbmZvICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVRTRkluZm8pICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVBUENoYW5uZWxSZXBvcnQ6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9hcF9jaGFubmVsX3JlcG9ydCgKKwkJCQlwQ3R4LCAodERvdDExZklFQVBDaGFubmVsUmVwb3J0ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUJjblJlcG9ydGluZ0RldGFpbDoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2Jjbl9yZXBvcnRpbmdfZGV0YWlsKAorCQkJCXBDdHgsICh0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWwgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llQmVhY29uUmVwb3J0RnJtQm9keToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2JlYWNvbl9yZXBvcnRfZnJtX2JvZHkoCisJCQkJcEN0eCwgKHREb3QxMWZJRUJlYWNvblJlcG9ydEZybUJvZHkgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUJlYWNvblJlcG9ydGluZzoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2JlYWNvbl9yZXBvcnRpbmcoCisJCQkJcEN0eCwgKHREb3QxMWZJRUJlYWNvblJlcG9ydGluZyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVCZWFjb25SZXBvcnRpbmcpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVNZWFzdXJlbWVudFBpbG90OgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfbWVhc3VyZW1lbnRfcGlsb3QoCisJCQkJcEN0eCwgKHREb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFTWVhc3VyZW1lbnRQaWxvdCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZU11bHRpQnNzaWQ6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9tdWx0aV9ic3NpZCgKKwkJCQlwQ3R4LCAodERvdDExZklFTXVsdGlCc3NpZCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVNdWx0aUJzc2lkKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llUklDRGF0YToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3JpY19kYXRhKAorCQkJCXBDdHgsICh0RG90MTFmSUVSSUNEYXRhICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVJJQ0RhdGEpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVSSUNEZXNjcmlwdG9yOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfcmljX2Rlc2NyaXB0b3IoCisJCQkJcEN0eCwgKHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFUklDRGVzY3JpcHRvcikgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVJSTUVuYWJsZWRDYXA6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9ycm1fZW5hYmxlZF9jYXAoCisJCQkJcEN0eCwgKHREb3QxMWZJRVJSTUVuYWJsZWRDYXAgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFUlJNRW5hYmxlZENhcCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVJlcXVlc3RlZEluZm86CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9yZXF1ZXN0ZWRfaW5mbygKKwkJCQlwQ3R4LCAodERvdDExZklFUmVxdWVzdGVkSW5mbyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVSZXF1ZXN0ZWRJbmZvKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llU1NJRDoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3NzaWQoCisJCQkJcEN0eCwgKHREb3QxMWZJRVNTSUQgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFU1NJRCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVNjaGVkdWxlOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfc2NoZWR1bGUoCisJCQkJcEN0eCwgKHREb3QxMWZJRVNjaGVkdWxlICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVNjaGVkdWxlKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llVENMQVM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV90Y2xhcygKKwkJCQlwQ3R4LCAodERvdDExZklFVENMQVMgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFVENMQVMpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVUQ0xBU1NQUk9DOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfdGNsYXNzcHJvYygKKwkJCQlwQ3R4LCAodERvdDExZklFVENMQVNTUFJPQyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVUQ0xBU1NQUk9DKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llVFNEZWxheToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3RzX2RlbGF5KAorCQkJCXBDdHgsICh0RG90MTFmSUVUU0RlbGF5ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVRTRGVsYXkpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVUU1BFQzoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3RzcGVjKAorCQkJCXBDdHgsICh0RG90MTFmSUVUU1BFQyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVUU1BFQykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVZIVENhcHM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV92aHRfY2FwcygKKwkJCQlwQ3R4LCAodERvdDExZklFVkhUQ2FwcyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVWSFRDYXBzKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llVkhUT3BlcmF0aW9uOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfdmh0X29wZXJhdGlvbigKKwkJCQlwQ3R4LCAodERvdDExZklFVkhUT3BlcmF0aW9uICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVZIVE9wZXJhdGlvbikgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdNTVNjaGVkdWxlOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfd21tX3NjaGVkdWxlKAorCQkJCXBDdHgsICh0RG90MTFmSUVXTU1TY2hlZHVsZSAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXTU1TY2hlZHVsZSkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdNTVRDTEFTOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfd21tdGNsYXMoCisJCQkJcEN0eCwgKHREb3QxMWZJRVdNTVRDTEFTICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVdNTVRDTEFTKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llV01NVENMQVNQUk9DOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfd21tdGNsYXNwcm9jKAorCQkJCXBDdHgsICh0RG90MTFmSUVXTU1UQ0xBU1BST0MgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFV01NVENMQVNQUk9DKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llV01NVFNEZWxheToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3dtbXRzX2RlbGF5KAorCQkJCXBDdHgsICh0RG90MTFmSUVXTU1UU0RlbGF5ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVdNTVRTRGVsYXkpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVXTU1UU1BFQzoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3dtbXRzcGVjKAorCQkJCXBDdHgsICh0RG90MTFmSUVXTU1UU1BFQyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXTU1UU1BFQykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdpZGVyQldDaGFuU3dpdGNoQW5uOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfd2lkZXJfYndfY2hhbl9zd2l0Y2hfYW5uKAorCQkJCXBDdHgsICh0RG90MTFmSUVXaWRlckJXQ2hhblN3aXRjaEFubiAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXaWRlckJXQ2hhblN3aXRjaEFubikgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUFJRDoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2FpZCgKKwkJCQlwQ3R4LCAodERvdDExZklFQUlEICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUFJRCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUNGUGFyYW1zOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfY2ZfcGFyYW1zKAorCQkJCXBDdHgsICh0RG90MTFmSUVDRlBhcmFtcyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVDRlBhcmFtcykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUNoYWxsZW5nZVRleHQ6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9jaGFsbGVuZ2VfdGV4dCgKKwkJCQlwQ3R4LCAodERvdDExZklFQ2hhbGxlbmdlVGV4dCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVDaGFsbGVuZ2VUZXh0KSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llQ2hhblN3aXRjaEFubjoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2NoYW5fc3dpdGNoX2FubigKKwkJCQlwQ3R4LCAodERvdDExZklFQ2hhblN3aXRjaEFubiAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVDaGFuU3dpdGNoQW5uKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llQ2hhbm5lbFN3aXRjaFdyYXBwZXI6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9jaGFubmVsX3N3aXRjaF93cmFwcGVyKAorCQkJCXBDdHgsICh0RG90MTFmSUVDaGFubmVsU3dpdGNoV3JhcHBlciAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVDaGFubmVsU3dpdGNoV3JhcHBlcikgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUNvdW50cnk6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9jb3VudHJ5KAorCQkJCXBDdHgsICh0RG90MTFmSUVDb3VudHJ5ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUNvdW50cnkpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVEU1BhcmFtczoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2RzX3BhcmFtcygKKwkJCQlwQ3R4LCAodERvdDExZklFRFNQYXJhbXMgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFRFNQYXJhbXMpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVFRENBUGFyYW1TZXQ6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9lZGNhX3BhcmFtX3NldCgKKwkJCQlwQ3R4LCAodERvdDExZklFRURDQVBhcmFtU2V0ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUVEQ0FQYXJhbVNldCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUVSUEluZm86CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9lcnBfaW5mbygKKwkJCQlwQ3R4LCAodERvdDExZklFRVJQSW5mbyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVFUlBJbmZvKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llRVNFQ2NrbU9wYXF1ZToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2VzZV9jY2ttX29wYXF1ZSgKKwkJCQlwQ3R4LCAodERvdDExZklFRVNFQ2NrbU9wYXF1ZSAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVFU0VDY2ttT3BhcXVlKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llRVNFUmFkTWdtdENhcDoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2VzZV9yYWRfbWdtdF9jYXAoCisJCQkJcEN0eCwgKHREb3QxMWZJRUVTRVJhZE1nbXRDYXAgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFRVNFUmFkTWdtdENhcCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUVTRVRyYWZTdHJtTWV0OgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfZXNlX3RyYWZfc3RybV9tZXQoCisJCQkJcEN0eCwgKHREb3QxMWZJRUVTRVRyYWZTdHJtTWV0ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUVTRVRyYWZTdHJtTWV0KSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llRVNFVHJhZlN0cm1SYXRlU2V0OgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfZXNlX3RyYWZfc3RybV9yYXRlX3NldCgKKwkJCQlwQ3R4LCAodERvdDExZklFRVNFVHJhZlN0cm1SYXRlU2V0ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUVTRVRyYWZTdHJtUmF0ZVNldCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUVTRVR4bWl0UG93ZXI6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9lc2VfdHhtaXRfcG93ZXIoCisJCQkJcEN0eCwgKHREb3QxMWZJRUVTRVR4bWl0UG93ZXIgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFRVNFVHhtaXRQb3dlcikgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUVTRVZlcnNpb246CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9lc2VfdmVyc2lvbigKKwkJCQlwQ3R4LCAodERvdDExZklFRVNFVmVyc2lvbiAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVFU0VWZXJzaW9uKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llRXh0Q2FwOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfZXh0X2NhcCgKKwkJCQlwQ3R4LCAodERvdDExZklFRXh0Q2FwICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUV4dENhcCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUV4dFN1cHBSYXRlczoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2V4dF9zdXBwX3JhdGVzKAorCQkJCXBDdHgsICh0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFRXh0U3VwcFJhdGVzKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llRkhQYXJhbVNldDoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2ZoX3BhcmFtX3NldCgKKwkJCQlwQ3R4LCAodERvdDExZklFRkhQYXJhbVNldCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVGSFBhcmFtU2V0KSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llRkhQYXJhbXM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9maF9wYXJhbXMoCisJCQkJcEN0eCwgKHREb3QxMWZJRUZIUGFyYW1zICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUZIUGFyYW1zKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llRkhQYXR0VGFibGU6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9maF9wYXR0X3RhYmxlKAorCQkJCXBDdHgsICh0RG90MTFmSUVGSFBhdHRUYWJsZSAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVGSFBhdHRUYWJsZSkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUZUSW5mbzoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2Z0X2luZm8oCisJCQkJcEN0eCwgKHREb3QxMWZJRUZUSW5mbyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVGVEluZm8pICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVIVENhcHM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9odF9jYXBzKAorCQkJCXBDdHgsICh0RG90MTFmSUVIVENhcHMgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFSFRDYXBzKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llSFRJbmZvOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfaHRfaW5mbygKKwkJCQlwQ3R4LCAodERvdDExZklFSFRJbmZvICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUhUSW5mbykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZUlCU1NQYXJhbXM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9pYnNzX3BhcmFtcygKKwkJCQlwQ3R4LCAodERvdDExZklFSUJTU1BhcmFtcyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVJQlNTUGFyYW1zKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llTGlua0lkZW50aWZpZXI6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9saW5rX2lkZW50aWZpZXIoCisJCQkJcEN0eCwgKHREb3QxMWZJRUxpbmtJZGVudGlmaWVyICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRUxpbmtJZGVudGlmaWVyKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llTWVhc3VyZW1lbnRSZXBvcnQ6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9tZWFzdXJlbWVudF9yZXBvcnQoCisJCQkJcEN0eCwgKHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0KSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llTWVhc3VyZW1lbnRSZXF1ZXN0OgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfbWVhc3VyZW1lbnRfcmVxdWVzdCgKKwkJCQlwQ3R4LCAodERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZU1vYmlsaXR5RG9tYWluOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfbW9iaWxpdHlfZG9tYWluKAorCQkJCXBDdHgsICh0RG90MTFmSUVNb2JpbGl0eURvbWFpbiAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbikgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZU5laWdoYm9yUmVwb3J0OgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfbmVpZ2hib3JfcmVwb3J0KAorCQkJCXBDdHgsICh0RG90MTFmSUVOZWlnaGJvclJlcG9ydCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVOZWlnaGJvclJlcG9ydCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZU9CU1NTY2FuUGFyYW1ldGVyczoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX29ic3Nfc2Nhbl9wYXJhbWV0ZXJzKAorCQkJCXBDdHgsICh0RG90MTFmSUVPQlNTU2NhblBhcmFtZXRlcnMgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFT0JTU1NjYW5QYXJhbWV0ZXJzKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llT3BlcmF0aW5nTW9kZToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX29wZXJhdGluZ19tb2RlKAorCQkJCXBDdHgsICh0RG90MTFmSUVPcGVyYXRpbmdNb2RlICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRU9wZXJhdGluZ01vZGUpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVQMlBBc3NvY1JlcToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3AyX3BfYXNzb2NfcmVxKAorCQkJCXBDdHgsICh0RG90MTFmSUVQMlBBc3NvY1JlcSAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVQMlBBc3NvY1JlcSkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVAyUEFzc29jUmVzOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfcDJfcF9hc3NvY19yZXMoCisJCQkJcEN0eCwgKHREb3QxMWZJRVAyUEFzc29jUmVzICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVAyUEFzc29jUmVzKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llUDJQQmVhY29uOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfcDJfcF9iZWFjb24oCisJCQkJcEN0eCwgKHREb3QxMWZJRVAyUEJlYWNvbiAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVQMlBCZWFjb24pICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVQMlBCZWFjb25Qcm9iZVJlczoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3AyX3BfYmVhY29uX3Byb2JlX3JlcygKKwkJCQlwQ3R4LCAodERvdDExZklFUDJQQmVhY29uUHJvYmVSZXMgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFUDJQQmVhY29uUHJvYmVSZXMpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVQMlBEZUF1dGg6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9wMl9wX2RlX2F1dGgoCisJCQkJcEN0eCwgKHREb3QxMWZJRVAyUERlQXV0aCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVQMlBEZUF1dGgpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVQMlBEaXNBc3NvYzoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3AyX3BfZGlzX2Fzc29jKAorCQkJCXBDdHgsICh0RG90MTFmSUVQMlBEaXNBc3NvYyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVQMlBEaXNBc3NvYykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVAyUElFT3BhcXVlOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfcDJfcGllX29wYXF1ZSgKKwkJCQlwQ3R4LCAodERvdDExZklFUDJQSUVPcGFxdWUgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFUDJQSUVPcGFxdWUpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVQMlBQcm9iZVJlcToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3AyX3BfcHJvYmVfcmVxKAorCQkJCXBDdHgsICh0RG90MTFmSUVQMlBQcm9iZVJlcSAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVQMlBQcm9iZVJlcSkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVAyUFByb2JlUmVzOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfcDJfcF9wcm9iZV9yZXMoCisJCQkJcEN0eCwgKHREb3QxMWZJRVAyUFByb2JlUmVzICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVAyUFByb2JlUmVzKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llUFRJQ29udHJvbDoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3B0aV9jb250cm9sKAorCQkJCXBDdHgsICh0RG90MTFmSUVQVElDb250cm9sICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVBUSUNvbnRyb2wpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVQVUJ1ZmZlclN0YXR1czoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3B1X2J1ZmZlcl9zdGF0dXMoCisJCQkJcEN0eCwgKHREb3QxMWZJRVBVQnVmZmVyU3RhdHVzICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVBVQnVmZmVyU3RhdHVzKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llUG93ZXJDYXBzOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfcG93ZXJfY2FwcygKKwkJCQlwQ3R4LCAodERvdDExZklFUG93ZXJDYXBzICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVBvd2VyQ2FwcykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVBvd2VyQ29uc3RyYWludHM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9wb3dlcl9jb25zdHJhaW50cygKKwkJCQlwQ3R4LCAodERvdDExZklFUG93ZXJDb25zdHJhaW50cyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llUUJTU0xvYWQ6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9xYnNzX2xvYWQoCisJCQkJcEN0eCwgKHREb3QxMWZJRVFCU1NMb2FkICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVFCU1NMb2FkKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llUUNvbVZlbmRvcklFOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfUUNvbVZlbmRvcklFKAorCQkJCXBDdHgsICh0RG90MTFmSUVRQ29tVmVuZG9ySUUgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFUUNvbVZlbmRvcklFKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llUU9TQ2Fwc0FwOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfcW9zX2NhcHNfYXAoCisJCQkJcEN0eCwgKHREb3QxMWZJRVFPU0NhcHNBcCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVRT1NDYXBzQXApICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVRT1NDYXBzU3RhdGlvbjoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3Fvc19jYXBzX3N0YXRpb24oCisJCQkJcEN0eCwgKHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llUW9zTWFwU2V0OgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfcW9zX21hcF9zZXQoCisJCQkJcEN0eCwgKHREb3QxMWZJRVFvc01hcFNldCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVRb3NNYXBTZXQpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVRdWlldDoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3F1aWV0KAorCQkJCXBDdHgsICh0RG90MTFmSUVRdWlldCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVRdWlldCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVJDUElJRToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3JjcGlpZSgKKwkJCQlwQ3R4LCAodERvdDExZklFUkNQSUlFICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVJDUElJRSkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVJJQ0RhdGFEZXNjOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfcmljX2RhdGFfZGVzYygKKwkJCQlwQ3R4LCAodERvdDExZklFUklDRGF0YURlc2MgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFUklDRGF0YURlc2MpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVSU046CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9yc24oCisJCQkJcEN0eCwgKHREb3QxMWZJRVJTTiAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVSU04pICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVSU05JSUU6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9yc25paWUoCisJCQkJcEN0eCwgKHREb3QxMWZJRVJTTklJRSAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVSU05JSUUpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVSU05PcGFxdWU6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9yc25fb3BhcXVlKAorCQkJCXBDdHgsICh0RG90MTFmSUVSU05PcGFxdWUgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFUlNOT3BhcXVlKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llU3VwcENoYW5uZWxzOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfc3VwcF9jaGFubmVscygKKwkJCQlwQ3R4LCAodERvdDExZklFU3VwcENoYW5uZWxzICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVN1cHBDaGFubmVscykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVN1cHBPcGVyYXRpbmdDbGFzc2VzOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfc3VwcF9vcGVyYXRpbmdfY2xhc3NlcygKKwkJCQlwQ3R4LCAodERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFU3VwcE9wZXJhdGluZ0NsYXNzZXMpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVTdXBwUmF0ZXM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9zdXBwX3JhdGVzKAorCQkJCXBDdHgsICh0RG90MTFmSUVTdXBwUmF0ZXMgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFU3VwcFJhdGVzKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llVElNOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfdGltKAorCQkJCXBDdHgsICh0RG90MTFmSUVUSU0gKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFVElNKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llVFBDUmVwb3J0OgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfdHBjX3JlcG9ydCgKKwkJCQlwQ3R4LCAodERvdDExZklFVFBDUmVwb3J0ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVRQQ1JlcG9ydCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVRQQ1JlcXVlc3Q6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV90cGNfcmVxdWVzdCgKKwkJCQlwQ3R4LCAodERvdDExZklFVFBDUmVxdWVzdCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVUUENSZXF1ZXN0KSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llVGltZUFkdmVydGlzZW1lbnQ6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV90aW1lX2FkdmVydGlzZW1lbnQoCisJCQkJcEN0eCwgKHREb3QxMWZJRVRpbWVBZHZlcnRpc2VtZW50ICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVRpbWVBZHZlcnRpc2VtZW50KSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llVGltZW91dEludGVydmFsOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfdGltZW91dF9pbnRlcnZhbCgKKwkJCQlwQ3R4LCAodERvdDExZklFVGltZW91dEludGVydmFsICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVZIVEV4dEJzc0xvYWQ6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV92aHRfZXh0X2Jzc19sb2FkKAorCQkJCXBDdHgsICh0RG90MTFmSUVWSFRFeHRCc3NMb2FkICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVZIVEV4dEJzc0xvYWQpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVWZW5kb3IxSUU6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV92ZW5kb3IxX2llKAorCQkJCXBDdHgsICh0RG90MTFmSUVWZW5kb3IxSUUgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFVmVuZG9yMUlFKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llVmVuZG9yM0lFOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfdmVuZG9yM19pZSgKKwkJCQlwQ3R4LCAodERvdDExZklFVmVuZG9yM0lFICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVZlbmRvcjNJRSkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdBUEk6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV93YXBpKAorCQkJCXBDdHgsICh0RG90MTFmSUVXQVBJICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVdBUEkpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVXQVBJT3BhcXVlOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfd2FwaV9vcGFxdWUoCisJCQkJcEN0eCwgKHREb3QxMWZJRVdBUElPcGFxdWUgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFV0FQSU9wYXF1ZSkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdGQVRQQzoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3dmYXRwYygKKwkJCQlwQ3R4LCAodERvdDExZklFV0ZBVFBDICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVdGQVRQQykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdGRElFT3BhcXVlOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfd2ZkaWVfb3BhcXVlKAorCQkJCXBDdHgsICh0RG90MTFmSUVXRkRJRU9wYXF1ZSAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXRkRJRU9wYXF1ZSkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdNTUNhcHM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV93bW1fY2FwcygKKwkJCQlwQ3R4LCAodERvdDExZklFV01NQ2FwcyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXTU1DYXBzKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llV01NSW5mb0FwOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfd21tX2luZm9fYXAoCisJCQkJcEN0eCwgKHREb3QxMWZJRVdNTUluZm9BcCAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXTU1JbmZvQXApICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVXTU1JbmZvU3RhdGlvbjoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3dtbV9pbmZvX3N0YXRpb24oCisJCQkJcEN0eCwgKHREb3QxMWZJRVdNTUluZm9TdGF0aW9uICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVdNTUluZm9TdGF0aW9uKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llV01NUGFyYW1zOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfd21tX3BhcmFtcygKKwkJCQlwQ3R4LCAodERvdDExZklFV01NUGFyYW1zICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVdNTVBhcmFtcykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdQQToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3dwYSgKKwkJCQlwQ3R4LCAodERvdDExZklFV1BBICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVdQQSkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdQQU9wYXF1ZToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3dwYV9vcGFxdWUoCisJCQkJcEN0eCwgKHREb3QxMWZJRVdQQU9wYXF1ZSAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXUEFPcGFxdWUpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVXU0M6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV93c2MoCisJCQkJcEN0eCwgKHREb3QxMWZJRVdTQyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXU0MpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVXc2NBc3NvY1JlcToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3dzY19hc3NvY19yZXEoCisJCQkJcEN0eCwgKHREb3QxMWZJRVdzY0Fzc29jUmVxICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVdzY0Fzc29jUmVxKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llV3NjQXNzb2NSZXM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV93c2NfYXNzb2NfcmVzKAorCQkJCXBDdHgsICh0RG90MTFmSUVXc2NBc3NvY1JlcyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXc2NBc3NvY1JlcykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdzY0JlYWNvbjoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3dzY19iZWFjb24oCisJCQkJcEN0eCwgKHREb3QxMWZJRVdzY0JlYWNvbiAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXc2NCZWFjb24pICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVXc2NCZWFjb25Qcm9iZVJlczoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3dzY19iZWFjb25fcHJvYmVfcmVzKAorCQkJCXBDdHgsICh0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdzY0lFT3BhcXVlOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfd3NjX2llX29wYXF1ZSgKKwkJCQlwQ3R4LCAodERvdDExZklFV3NjSUVPcGFxdWUgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFV3NjSUVPcGFxdWUpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVXc2NQcm9iZVJlcToKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX3dzY19wcm9iZV9yZXEoCisJCQkJcEN0eCwgKHREb3QxMWZJRVdzY1Byb2JlUmVxICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRVdzY1Byb2JlUmVxKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llV3NjUHJvYmVSZXM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV93c2NfcHJvYmVfcmVzKAorCQkJCXBDdHgsICh0RG90MTFmSUVXc2NQcm9iZVJlcyAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVXc2NQcm9iZVJlcykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZVdzY1JlYXNzb2NSZXM6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV93c2NfcmVhc3NvY19yZXMoCisJCQkJcEN0eCwgKHREb3QxMWZJRVdzY1JlYXNzb2NSZXMgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFV3NjUmVhc3NvY1JlcykgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZWV4dF9jaGFuX3N3aXRjaF9hbm46CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9leHRfY2hhbl9zd2l0Y2hfYW5uKAorCQkJCXBDdHgsICh0RG90MTFmSUVleHRfY2hhbl9zd2l0Y2hfYW5uICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRWV4dF9jaGFuX3N3aXRjaF9hbm4pICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWVodDIwNDBfYnNzX2NvZXhpc3RlbmNlOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSgKKwkJCQlwQ3R4LCAodERvdDExZklFaHQyMDQwX2Jzc19jb2V4aXN0ZW5jZSAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUVodDIwNDBfYnNzX2NvZXhpc3RlbmNlKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQljYXNlIFNpZ0llaHQyMDQwX2Jzc19pbnRvbGVyYW50X3JlcG9ydDoKKwkJCXN0YXR1cyB8PQorCQkJCWRvdDExZl9wYWNrX2llX2h0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQoCisJCQkJcEN0eCwgKHREb3QxMWZJRWh0MjA0MF9ic3NfaW50b2xlcmFudF9yZXBvcnQgKikKKwkJCQkocFNyYyArIHBJZS0+b2Zmc2V0ICsKKwkJCQlzaXplb2YodERvdDExZklFaHQyMDQwX2Jzc19pbnRvbGVyYW50X3JlcG9ydCkgKiBpKSwKKwkJCQlwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCWJyZWFrOworCQkJY2FzZSBTaWdJZXNlY19jaGFuX29mZnNldF9lbGU6CisJCQlzdGF0dXMgfD0KKwkJCQlkb3QxMWZfcGFja19pZV9zZWNfY2hhbl9vZmZzZXRfZWxlKAorCQkJCXBDdHgsICh0RG90MTFmSUVzZWNfY2hhbl9vZmZzZXRfZWxlICopCisJCQkJKHBTcmMgKyBwSWUtPm9mZnNldCArCisJCQkJc2l6ZW9mKHREb3QxMWZJRXNlY19jaGFuX29mZnNldF9lbGUpICogaSksCisJCQkJcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQlicmVhazsKKwkJCWNhc2UgU2lnSWV2ZW5kb3IyX2llOgorCQkJc3RhdHVzIHw9CisJCQkJZG90MTFmX3BhY2tfaWVfdmVuZG9yMl9pZSgKKwkJCQlwQ3R4LCAodERvdDExZklFdmVuZG9yMl9pZSAqKQorCQkJCShwU3JjICsgcEllLT5vZmZzZXQgKworCQkJCXNpemVvZih0RG90MTFmSUV2ZW5kb3IyX2llKSAqIGkpLAorCQkJCXBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUZSQU1FU19MT0cxKHBDdHgsIEZSTE9HRSwgRlJGTCgiSU5URVJOQUwgRVJST1ItLSBJIGRvbiIKKwkJCQkiJ3Qga25vdyBhYm91dCB0aGUgSUUgJWQ7IHRoaXMgaXMgbW9zdCBsaWtlbHkgYSBiIgorCQkJCSJ1ZyBpbiAnZnJhbWVzYycuXG4iKSwgcEZmLT5zaWcpOworCQkJCXJldHVybiBET1QxMUZfSU5URVJOQUxfRVJST1I7CisJCQl9CisKKwkJCXBCdWZSZW1haW5pbmcgKz0gbGVuOworCQkJbkJ1ZlJlbWFpbmluZyAtPSBsZW47CisJCQkqcG5Db25zdW1lZCAgICs9IGxlbjsKKwkJfQorCisJCSsrcEllOworCisJfQorCisJcmV0dXJuIHN0YXR1czsKKworfQorCitzdGF0aWMgdWludDMyX3QgcGFja190bHZfY29yZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorCQkJCXVpbnQ4X3QgKnBTcmMsCisJCQkJdWludDhfdCAqcEJ1ZiwKKwkJCQl1aW50MzJfdCAgbkJ1ZiwKKwkJCQl1aW50MzJfdCAqcG5Db25zdW1lZCwKKwkJCQljb25zdCB0VExWRGVmbiAgVExWc1tdLAorCQkJCXVpbnQzMl90ICpwaWR4KQoreworCWNvbnN0IHRUTFZEZWZuICpwVGx2OworCXRGUkFNRVNfQk9PTCAgICpwZkZvdW5kOworCXVpbnQ4X3QgICAgKnBCdWZSZW1haW5pbmc7CisJdWludDMyX3QgICBuQnVmUmVtYWluaW5nLCBzdGF0dXMsIGxlbjsKKworCURPVDExRl9QQVJBTUVURVJfQ0hFQ0syKHBTcmMsIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQpOworCisJKHZvaWQpcEN0eDsKKwlzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKwlwQnVmUmVtYWluaW5nID0gcEJ1ZjsKKwluQnVmUmVtYWluaW5nID0gbkJ1ZjsKKworCXBUbHYgPSAmKFRMVnNbMF0pOworCXdoaWxlICgweGZmZmYgIT0gcFRsdi0+aWQpIHsKKwkJcGZGb3VuZCA9ICh0RlJBTUVTX0JPT0wgKikocFNyYyArIHBUbHYtPm9mZnNldCArCisJCQkJCXBUbHYtPnByZXNlbmNlT2Zmc2V0KTsKKwkJaWYgKCpwZkZvdW5kICYmIHBUbHYtPm1pblNpemUgPiBuQnVmUmVtYWluaW5nKSB7CisJCQlGUkFNRVNfTE9HMyhwQ3R4LCBGUkxPR0UsIEZSRkwoIlRoZSBUTFYgJXMgdGFrZXMgYXQgbGVhc3QiCisJCQkgICAgIiAlZCBieXRlcywgYnV0IHRoZXJlIGFyZSBvbmx5ICVkIGxlZnQgaW4gdGhlIGJ1ZmZlci4iCisJCQkgICAgIlxuIiksIHBUbHYtPm5hbWUsIHBUbHYtPm1pblNpemUsIG5CdWZSZW1haW5pbmcpOworCQkJcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisJCX0KKworCQlsZW4gPSAwVTsKKworCQlpZiAoKnBmRm91bmQpIHsKKwkJCXN3aXRjaCAocFRsdi0+c2lnKSB7CisJCQljYXNlIFNpZ1RsdkF1dGhvcml6ZWRNQUNzOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfYXV0aG9yaXplZF9tYV9jcygKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZBdXRob3JpemVkTUFDcyAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZSZXF1ZXN0VG9FbnJvbGw6CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl9yZXF1ZXN0X3RvX2Vucm9sbCgKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2VmVyc2lvbjI6CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl92ZXJzaW9uMigKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZWZXJzaW9uMiAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZBUFNldHVwTG9ja2VkOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfYXBfc2V0dXBfbG9ja2VkKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVkFQU2V0dXBMb2NrZWQgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2QXNzb2NpYXRpb25TdGF0ZToKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X2Fzc29jaWF0aW9uX3N0YXRlKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2Q29uZmlnTWV0aG9kczoKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X2NvbmZpZ19tZXRob2RzKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVkNvbmZpZ01ldGhvZHMgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2Q29uZmlndXJhdGlvbkVycm9yOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfY29uZmlndXJhdGlvbl9lcnJvcigKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZDb25maWd1cmF0aW9uRXJyb3IgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2RGV2aWNlTmFtZToKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X2RldmljZV9uYW1lKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVkRldmljZU5hbWUgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2RGV2aWNlUGFzc3dvcmRJRDoKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X2RldmljZV9wYXNzd29yZF9pZCgKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElEICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfZXh0ZW5kZWRfbGlzdGVuX3RpbWluZygKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZyAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZMaXN0ZW5DaGFubmVsOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfbGlzdGVuX2NoYW5uZWwoCisJCQkJCXBDdHgsICh0RG90MTFmVExWTGlzdGVuQ2hhbm5lbCAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZNYW51ZmFjdHVyZXI6CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl9tYW51ZmFjdHVyZXIoCisJCQkJCXBDdHgsICh0RG90MTFmVExWTWFudWZhY3R1cmVyICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1Rsdk1pbm9yUmVhc29uQ29kZToKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X21pbm9yX3JlYXNvbl9jb2RlKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVk1pbm9yUmVhc29uQ29kZSAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZNb2RlbE5hbWU6CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl9tb2RlbF9uYW1lKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVk1vZGVsTmFtZSAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZNb2RlbE51bWJlcjoKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X21vZGVsX251bWJlcigKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZNb2RlbE51bWJlciAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZOb3RpY2VPZkFic2VuY2U6CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl9ub3RpY2Vfb2ZfYWJzZW5jZSgKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZOb3RpY2VPZkFic2VuY2UgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2T3BlcmF0aW5nQ2hhbm5lbDoKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X29wZXJhdGluZ19jaGFubmVsKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UDJQQ2FwYWJpbGl0eToKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X3AyX3BfY2FwYWJpbGl0eSgKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5ICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlAyUERldmljZUlkOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfcDJfcF9kZXZpY2VfaWQoCisJCQkJCXBDdHgsICh0RG90MTFmVExWUDJQRGV2aWNlSWQgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UDJQRGV2aWNlSW5mbzoKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X3AyX3BfZGV2aWNlX2luZm8oCisJCQkJCXBDdHgsICh0RG90MTFmVExWUDJQRGV2aWNlSW5mbyAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZQMlBHcm91cEluZm86CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl9wMl9wX2dyb3VwX2luZm8oCisJCQkJCXBDdHgsICh0RG90MTFmVExWUDJQR3JvdXBJbmZvICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlAyUFN0YXR1czoKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X3AyX3Bfc3RhdHVzKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVlAyUFN0YXR1cyAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZQcmltYXJ5RGV2aWNlVHlwZToKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X3ByaW1hcnlfZGV2aWNlX3R5cGUoCisJCQkJCXBDdHgsICh0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGUgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UkZCYW5kczoKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X3JmX2JhbmRzKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVlJGQmFuZHMgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UmVxdWVzdERldmljZVR5cGU6CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl9yZXF1ZXN0X2RldmljZV90eXBlKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlJlcXVlc3RUeXBlOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfcmVxdWVzdF90eXBlKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVlJlcXVlc3RUeXBlICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlJlc3BvbnNlVHlwZToKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X3Jlc3BvbnNlX3R5cGUoCisJCQkJCXBDdHgsICh0RG90MTFmVExWUmVzcG9uc2VUeXBlICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfc2VsZWN0ZWRfcmVnaXN0cmFyKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczoKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X3NlbGVjdGVkX3JlZ2lzdHJhcl9jb25maWdfbWV0aG9kcygKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2U2VyaWFsTnVtYmVyOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfc2VyaWFsX251bWJlcigKKwkJCQkJcEN0eCwgKHREb3QxMWZUTFZTZXJpYWxOdW1iZXIgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2VVVJRF9FOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfdXVpZF9lKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVlVVSURfRSAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBTaWdUbHZVVUlEX1I6CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl91dWlkX3IoCisJCQkJCXBDdHgsICh0RG90MTFmVExWVVVJRF9SICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlZlbmRvckV4dGVuc2lvbjoKKwkJCQlzdGF0dXMgfD0KKwkJCQkJZG90MTFmX3BhY2tfdGx2X3ZlbmRvcl9leHRlbnNpb24oCisJCQkJCXBDdHgsICh0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlZlcnNpb246CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl92ZXJzaW9uKAorCQkJCQlwQ3R4LCAodERvdDExZlRMVlZlcnNpb24gKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2V1BTU3RhdGU6CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl93cHNfc3RhdGUoCisJCQkJCXBDdHgsICh0RG90MTFmVExWV1BTU3RhdGUgKikKKwkJCQkJKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLAorCQkJCQluQnVmUmVtYWluaW5nLCAmbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnVGx2UDJQSW50ZXJmYWNlOgorCQkJCXN0YXR1cyB8PQorCQkJCQlkb3QxMWZfcGFja190bHZfcDJfcF9pbnRlcmZhY2UoCisJCQkJCXBDdHgsICh0RG90MTFmVExWUDJQSW50ZXJmYWNlICopCisJCQkJCShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywKKwkJCQkJbkJ1ZlJlbWFpbmluZywgJmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ1RsdlAyUE1hbmFnZWFiaWxpdHk6CisJCQkJc3RhdHVzIHw9CisJCQkJCWRvdDExZl9wYWNrX3Rsdl9wMl9wX21hbmFnZWFiaWxpdHkoCisJCQkJCXBDdHgsICh0RG90MTFmVExWUDJQTWFuYWdlYWJpbGl0eSAqKQorCQkJCQkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsCisJCQkJCW5CdWZSZW1haW5pbmcsICZsZW4pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlGUkFNRVNfTE9HMShwQ3R4LCBGUkxPR0UsIEZSRkwoIklOVEVSTkFMIEVSUk9SLS0gSSBkb24ndCAiCisJCQkJICAgICJrbm93IGFib3V0IHRoZSBUTFYgJWQ7IHRoaXMgaXMgbW9zdCBsaWtlbHkgYSBidWcgaW4gIgorCQkJCSAgICAiJ2ZyYW1lc2MnLlxuIiksIHBUbHYtPnNpZyk7CisJCQkJcmV0dXJuIERPVDExRl9JTlRFUk5BTF9FUlJPUjsKKwkJCX0KKworCQl9IC8qIEVuZCBpZiBvbiAqcGZGb3VuZCAqLworCQlwQnVmUmVtYWluaW5nICs9IGxlbjsKKwkJbkJ1ZlJlbWFpbmluZyAtPSBsZW47CisJCSpwbkNvbnN1bWVkICAgKz0gbGVuOworCQkrK3BUbHY7CisJCWlmIChsZW4pCisJCQkrKypwaWR4OworCX0KKworCXJldHVybiBzdGF0dXM7CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy91dGlscy9zcmMvbG9nX2FwaS5jIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3V0aWxzL3NyYy9sb2dfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjN2I4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy91dGlscy9zcmMvbG9nX2FwaS5jCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogbG9nX2FwaS5jYyAtIEhhbmRsZXMgbG9nIG1lc3NhZ2VzIGZvciBhbGwgdGhlIG1vZHVsZXMuCisgKiBBdXRob3I6ICAgICAgICBLZXZpbiBOZ3V5ZW4KKyAqIERhdGU6ICAgICAgICAgIDAyLzI3LzAyCisgKiBIaXN0b3J5Oi0KKyAqIDAyLzExLzAyICAgICAgIENyZWF0ZWQuCisgKiAwMy8xMi8wMiAgICAgICBSZWFycmFuZ2UgbG9nX2RlYnVnIHBhcmFtZXRlciBsaXN0IGFuZCBhZGQgbW9yZSBwYXJhbXMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSA8c2lyX2NvbW1vbi5oPgorI2luY2x1ZGUgPHNpcl9kZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzX2FwaS5oPgorI2luY2x1ZGUgPHdtYV90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAidXRpbHNfZ2xvYmFsLmgiCisjaW5jbHVkZSAibWFjX2luaXRfYXBpLmgiCisKKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKworI2lmZGVmIEFOSV9PU19UWVBFX0FORFJPSUQKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogbG9nX2luaXQoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJlcGFyZSB0aGUgbG9nZ2luZyB1dGlsaXR5LgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSB0cEFuaVNpckdsb2JhbCBTaXJpdXMgc29mdHdhcmUgcGFyYW1ldGVyIHN0cnVjdXRyZSBwb2ludGVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordFNpclJldFN0YXR1cyBsb2dfaW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQzMl90IGk7CisKKwkvKiBBZGQgY29kZSB0byBpbml0aWFsaXplIGRlYnVnIGxldmVsIGZyb20gQ0ZHIG1vZHVsZSAqLworCS8qIEZvciBub3csIGVuYWJsZSBhbGwgbG9nZ2luZyAqLworCWZvciAoaSA9IDA7IGkgPCBMT0dfRU5UUllfTlVNOyBpKyspIHsKKyNpZmRlZiBTSVJfREVCVUcKKwkJcE1hYy0+dXRpbHMuZ0xvZ0V2dExldmVsW2ldID0gcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW2ldID0KKwkJCQkJCSAgICAgIExPRzE7CisjZWxzZQorCQlwTWFjLT51dGlscy5nTG9nRXZ0TGV2ZWxbaV0gPSBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbaV0gPQorCQkJCQkJICAgICAgTE9HVzsKKyNlbmRpZgorCX0KKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qKiogbG9nX2luaXQoKSAqKiovCisKK3ZvaWQgbG9nX2RlaW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXJldHVybjsKK30KKworLyoqCisgKiBsb2dfZGJnKCkKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBsb2cgYSBkZWJ1ZyBtZXNzYWdlLgorICoKKyAqKipQQVJBTVM6CisgKgorICoqKkxPR0lDOgorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtIHRwQW5pU2lyR2xvYmFsIFNpcml1cyBzb2Z0d2FyZSBwYXJhbWV0ZXIgc3RydWN1dHJlIHBvaW50ZXIKKyAqIEBwYXJhbSBNb2RJZCAgICAgICAgOC1iaXQgbW9kSUQKKyAqIEBwYXJhbSBkZWJ1Z0xldmVsICAgZGVidWdnaW5nIGxldmVsIGZvciB0aGlzIG1lc3NhZ2UKKyAqIEBwYXJhbSBwU3RyICAgICAgICAgc3RyaW5nIHBhcmFtZXRlciBwb2ludGVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxvZ19kYmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBtb2RJZCwgdWludDMyX3QgZGVidWdMZXZlbCwKKwkgICAgIGNvbnN0IGNoYXIgKnBTdHIsIC4uLikKK3sKKyNpZmRlZiBXTEFOX0RFQlVHCisJaWYgKGRlYnVnTGV2ZWwgPiBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbTE9HX0lOREVYX0ZPUl9NT0RVTEUobW9kSWQpXSkKKwkJcmV0dXJuOworCWVsc2UgeworCQl2YV9saXN0IG1hcmtlcjsKKworCQl2YV9zdGFydChtYXJrZXIsIHBTdHIpOyAvKiBJbml0aWFsaXplIHZhcmlhYmxlIGFyZ3VtZW50cy4gKi8KKworCQlsb2dfZGVidWcocE1hYywgbW9kSWQsIGRlYnVnTGV2ZWwsIHBTdHIsIG1hcmtlcik7CisKKwkJdmFfZW5kKG1hcmtlcik7IC8qIFJlc2V0IHZhcmlhYmxlIGFyZ3VtZW50cy4gICAgICAqLworCX0KKyNlbmRpZgorfQorCitDREZfVFJBQ0VfTEVWRUwgZ2V0X3Zvc19kZWJ1Z19sZXZlbCh1aW50MzJfdCBkZWJ1Z0xldmVsKQoreworCXN3aXRjaCAoZGVidWdMZXZlbCkgeworCWNhc2UgTE9HUDoKKwkJcmV0dXJuIENERl9UUkFDRV9MRVZFTF9GQVRBTDsKKwljYXNlIExPR0U6CisJCXJldHVybiBDREZfVFJBQ0VfTEVWRUxfRVJST1I7CisJY2FzZSBMT0dXOgorCQlyZXR1cm4gQ0RGX1RSQUNFX0xFVkVMX1dBUk47CisJY2FzZSBMT0cxOgorCQlyZXR1cm4gQ0RGX1RSQUNFX0xFVkVMX0lORk87CisJY2FzZSBMT0cyOgorCQlyZXR1cm4gQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSDsKKwljYXNlIExPRzM6CisJCXJldHVybiBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQ7CisJY2FzZSBMT0c0OgorCQlyZXR1cm4gQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XOworCWRlZmF1bHQ6CisJCXJldHVybiBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1c7CisJfQorfQorCitzdGF0aWMgaW5saW5lIENERl9NT0RVTEVfSUQgZ2V0X3Zvc19tb2R1bGVfaWQodWludDhfdCBtb2RJZCkKK3sKKwlzd2l0Y2ggKG1vZElkKSB7CisJY2FzZSBTSVJfSEFMX01PRFVMRV9JRDoKKwkJcmV0dXJuIENERl9NT0RVTEVfSURfV01BOworCisJY2FzZSBTSVJfTElNX01PRFVMRV9JRDoKKwljYXNlIFNJUl9TQ0hfTU9EVUxFX0lEOgorCWNhc2UgU0lSX0NGR19NT0RVTEVfSUQ6CisJY2FzZSBTSVJfTU5UX01PRFVMRV9JRDoKKwljYXNlIFNJUl9EUEhfTU9EVUxFX0lEOgorCWNhc2UgU0lSX0RCR19NT0RVTEVfSUQ6CisJCXJldHVybiBDREZfTU9EVUxFX0lEX1BFOworCisJY2FzZSBTSVJfU1lTX01PRFVMRV9JRDoKKwkJcmV0dXJuIENERl9NT0RVTEVfSURfU1lTOworCisJY2FzZSBTSVJfU01TX01PRFVMRV9JRDoKKwkJcmV0dXJuIENERl9NT0RVTEVfSURfU01FOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIENERl9NT0RVTEVfSURfU1lTOworCX0KK30KKworI2RlZmluZSBMT0dfU0laRSAyNTYKK3ZvaWQgbG9nX2RlYnVnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgbW9kSWQsIHVpbnQzMl90IGRlYnVnTGV2ZWwsCisJICAgICAgIGNvbnN0IGNoYXIgKnBTdHIsIHZhX2xpc3QgbWFya2VyKQoreworCUNERl9UUkFDRV9MRVZFTCBjZGZfZGVidWdfbGV2ZWw7CisJQ0RGX01PRFVMRV9JRCBjZGZfbW9kdWxlX2lkOworCWNoYXIgbG9nQnVmZmVyW0xPR19TSVpFXTsKKworCWNkZl9kZWJ1Z19sZXZlbCA9IGdldF92b3NfZGVidWdfbGV2ZWwoZGVidWdMZXZlbCk7CisJY2RmX21vZHVsZV9pZCA9IGdldF92b3NfbW9kdWxlX2lkKG1vZElkKTsKKworCXZzbnByaW50Zihsb2dCdWZmZXIsIExPR19TSVpFIC0gMSwgcFN0ciwgbWFya2VyKTsKKwlDREZfVFJBQ0UoY2RmX21vZHVsZV9pZCwgY2RmX2RlYnVnX2xldmVsLCAiJXMiLCBsb2dCdWZmZXIpOworCisJLyogVGhlIGNhbGxlciBtdXN0IGNoZWNrIGxvZ2xldmVsICovCisJQ0RGX0FTU0VSVCgoZGVidWdMZXZlbCA8PQorCQkgICAgcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW0xPR19JTkRFWF9GT1JfTU9EVUxFKG1vZElkKV0pCisJCSAgICYmIChMT0dQICE9IGRlYnVnTGV2ZWwpKTsKK30gLyoqKiBlbmQgbG9nX2RlYnVnKCkgKioqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3V0aWxzL3NyYy9tYWNfdHJhY2UuYyBiL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy91dGlscy9zcmMvbWFjX3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwZDlhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy91dGlscy9zcmMvbWFjX3RyYWNlLmMKQEAgLTAsMCArMSw3NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIG1hY190cmFjZS5jCisKKyAgIFxicmllZiBpbXBsZW1lbnRhdGlvbiBmb3IgdHJhY2UgcmVsYXRlZCBBUElzCisKKyAgIFxhdXRob3IgU3VuaXQgQmhhdGlhCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJtYWNfdHJhY2UuaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJjc3JfbmVpZ2hib3Jfcm9hbS5oIgorI2luY2x1ZGUgImNzcl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpbV9nbG9iYWwuaCIKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAid21hX2lmLmgiCisKKyNpZmRlZiBUUkFDRV9SRUNPUkQKKy8qKgorICogbWFjX3RyYWNlX2dldF9uZWlnaGJvdXJfcm9hbV9zdGF0ZSgpIC0gR2V0IHRoZSBuZWlnaGJvciByb2FtIHN0YXRlCisgKiBAbmVpZ2hib3Vycm9hbXN0YXRlOiBTdGF0ZSBpbiBudW1lcmljIGZvcm0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgc3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIHN0YXRlLgorICoKKyAqIFJldHVybjogU3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIHN0YXRlLgorICoqLwordWludDhfdCAqbWFjX3RyYWNlX2dldF9uZWlnaGJvdXJfcm9hbV9zdGF0ZSh1aW50MTZfdCBuZWlnaGJvdXJyb2Ftc3RhdGUpCit7CisJc3dpdGNoIChuZWlnaGJvdXJyb2Ftc3RhdGUpIHsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DTE9TRUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NPTk5FQ1RFRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVBU1NPQ0lBVElORyk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9QUkVBVVRIRU5USUNBVElORyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUFJFQVVUSF9ET05FKTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZU5FSUdIQk9SX1NUQVRFX01BWCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHVpbnQ4X3QgKikgIlVOS05PV04iOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogbWFjX3RyYWNlX2dldGNzcl9yb2FtX3N0YXRlKCkgLSBHZXQgdGhlIGNzciByb2FtIHN0YXRlCisgKiBAY3NyX3JvYW1fc3RhdGU6IFN0YXRlIGluIG51bWVyaWMgZm9ybQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBzdHJpbmcgZXF1aXZhbGVudCBvZiB0aGUgc3RhdGUuCisgKgorICogUmV0dXJuOiBTdHJpbmcgZXF1aXZhbGVudCBvZiB0aGUgc3RhdGUuCisgKiovCit1aW50OF90ICptYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3RhdGUodWludDE2X3QgY3NyX3JvYW1fc3RhdGUpCit7CisJc3dpdGNoIChjc3Jfcm9hbV9zdGF0ZSkgeworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ST0FNSU5HX1NUQVRFX1NUT1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ST0FNSU5HX1NUQVRFX0lETEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5JTkcpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5FRCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHVpbnQ4X3QgKikgIlVOS05PV04iOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogbWFjX3RyYWNlX2dldGNzcl9yb2FtX3N1Yl9zdGF0ZSgpIC0gR2V0IHRoZSBjc3Igcm9hbSBzdWIgc3RhdGUKKyAqIEBjc3Jfcm9hbV9zdWJfc3RhdGU6IFN0YXRlIGluIG51bWVyaWMgZm9ybQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBzdHJpbmcgZXF1aXZhbGVudCBvZiB0aGUgc3RhdGUuCisgKgorICogUmV0dXJuOiBTdHJpbmcgZXF1aXZhbGVudCBvZiB0aGUgc3RhdGUuCisgKiovCit1aW50OF90ICptYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3ViX3N0YXRlKHVpbnQxNl90IGNzcl9yb2FtX3N1Yl9zdGF0ZSkKK3sKKwlzd2l0Y2ggKGNzcl9yb2FtX3N1Yl9zdGF0ZSkgeworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ST0FNX1NVQlNUQVRFX05PTkUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ST0FNX1NVQlNUQVRFX1NUQVJUX0JTU19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5fUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDU1JfUk9BTV9TVUJTVEFURV9SRUFTU09DX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDU1JfUk9BTV9TVUJTVEFURV9TVE9QX0JTU19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcKKwkJCShlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQ09OTkVDVF9DT05USU5VRV9ST0FNSU5HKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDU1JfUk9BTV9TVUJTVEFURV9BVVRIX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ1NSX1JPQU1fU1VCU1RBVEVfQ09ORklHKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDU1JfUk9BTV9TVUJTVEFURV9ERUFVVEhfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19OT1RISU5HX1RPX0pPSU4pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX1JFQVNTT0NfRkFJTFVSRSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfRk9SQ0VEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDU1JfUk9BTV9TVUJTVEFURV9XQUlUX0ZPUl9LRVkpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hBTkRPRkYpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5FRF9OT19UUkFGRklDKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HCisJCQkoZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5FRF9OT05fUkVBTFRJTUVfVFJBRkZJQyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ1NSX1JPQU1fU1VCU1RBVEVfSk9JTkVEX1JFQUxUSU1FX1RSQUZGSUMpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuICh1aW50OF90ICopICJVTktOT1dOIjsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIG1hY190cmFjZV9nZXRfbGltX3NtZV9zdGF0ZSgpIC0gR2V0IHRoZSBsaW0gc21lIHN0YXRlCisgKiBAbGltX3N0YXRlOiBTdGF0ZSBpbiBudW1lcmljIGZvcm0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgc3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIHN0YXRlLgorICoKKyAqIFJldHVybjogU3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIHN0YXRlLgorICoqLwordWludDhfdCAqbWFjX3RyYWNlX2dldF9saW1fc21lX3N0YXRlKHVpbnQxNl90IGxpbV9zdGF0ZSkKK3sKKwlzd2l0Y2ggKGxpbV9zdGF0ZSkgeworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfT0ZGTElORV9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9JRExFX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1NVU1BFTkRfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfV1RfU0NBTl9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9KT0lOX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX0FVVEhfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfV1RfQVNTT0NfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9SRUFTU09DX0xJTktfRkFJTF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfQVNTT0NJQVRFRF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9SRUFTU09DSUFURURfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfTElOS19FU1RfV1RfU0NBTl9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9QUkVfQVVUSF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9ESVNBU1NPQ19TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9ERUFVVEhfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfV1RfU1RBUlRfQlNTX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX1NUT1BfQlNTX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX05PUk1BTF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9DSEFOTkVMX1NDQU5fU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfTk9STUFMX0NIQU5ORUxfU0NBTl9TVEFURSk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHVpbnQ4X3QgKikgIlVOS05PV04iOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogbWFjX3RyYWNlX2dldF9saW1fbWxtX3N0YXRlKCkgLSBHZXQgdGhlIGxpbSBtbG0gc3RhdGUKKyAqIEBtbG1zdGF0ZTogU3RhdGUgaW4gbnVtZXJpYyBmb3JtCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHN0cmluZyBlcXVpdmFsZW50IG9mIHRoZSBzdGF0ZS4KKyAqCisgKiBSZXR1cm46IFN0cmluZyBlcXVpdmFsZW50IG9mIHRoZSBzdGF0ZS4KKyAqKi8KK3VpbnQ4X3QgKm1hY190cmFjZV9nZXRfbGltX21sbV9zdGF0ZSh1aW50MTZfdCBtbG1fc3RhdGUpCit7CisJc3dpdGNoIChtbG1fc3RhdGUpIHsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX09GRkxJTkVfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fSURMRV9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9QUk9CRV9SRVNQX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1BBU1NJVkVfU0NBTl9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9KT0lOX0JFQUNPTl9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9KT0lORURfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fQlNTX1NUQVJURURfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTJfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTNfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTRfU1RBVEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NTE1fQVVUSF9SU1BfVElNRU9VVF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9BVVRIRU5USUNBVEVEX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9SRUFTU09DX1JTUF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9BU1NPQ0lBVEVEX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1JFQVNTT0NJQVRFRF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1dUX0FTU09DX0NORl9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9MRUFSTl9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9BRERfQlNTX1JTUF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9ERUxfQlNTX1JTUF9TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9BRERfQlNTX1JTUF9BU1NPQ19TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlTElNX01MTV9XVF9BRERfQlNTX1JTUF9SRUFTU09DX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1BSRUFTU09DX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1dUX0FERF9TVEFfUlNQX1NUQVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAodWludDhfdCAqKSAiVU5LTk9XTiI7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBtYWNfdHJhY2VfZ2V0X3NtZV9tc2dfc3RyaW5nKCkgLSBHZXQgdGhlIG1zZworICogQHNtZV9tc2c6IG1lc3NhZ2UgdHlwZSBpbiBudW1lcmljIGZvcm0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgc3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIG1lc3NhZ2UuCisgKgorICogUmV0dXJuOiBTdHJpbmcgZXF1aXZhbGVudCBvZiB0aGUgbWVzc2FnZSB0eXBlLgorICoqLwordWludDhfdCAqbWFjX3RyYWNlX2dldF9zbWVfbXNnX3N0cmluZyh1aW50MTZfdCBzbWVfbXNnKQoreworCXN3aXRjaCAoc21lX21zZykgeworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU1lTX1JFQURZX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TQ0FOX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TQ0FOX0FCT1JUX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TQ0FOX1JTUCk7CisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9PRU1fREFUQV9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfT0VNX0RBVEFfUlNQKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfSk9JTl9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfSk9JTl9SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU0VUQ09OVEVYVF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU0VUQ09OVEVYVF9SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfUkVBU1NPQ19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfUkVBU1NPQ19SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfRElTQVNTT0NfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0RJU0FTU09DX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9ESVNBU1NPQ19JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfRElTQVNTT0NfQ05GKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0RFQVVUSF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfREVBVVRIX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9ERUFVVEhfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1dNX1NUQVRVU19DSEFOR0VfTlRGKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0lCU1NfTkVXX1BFRVJfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0lCU1NfUEVFUl9ERVBBUlRFRF9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU1RBUlRfQlNTX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TVEFSVF9CU1NfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0FTU09DX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9BU1NPQ19DTkYpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU1dJVENIX0NITF9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU1RPUF9CU1NfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NUT1BfQlNTX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9ORUlHSEJPUl9CU1NfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0RFQVVUSF9DTkYpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfTUlDX0ZBSUxVUkVfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0FERFRTX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9BRERUU19SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfREVMVFNfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0RFTFRTX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9ERUxUU19JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0dFVF9TVEFUSVNUSUNTX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9HRVRfUlNTSV9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfR0VUX0FTU09DX1NUQVNfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1RLSVBfQ05UUl9NRUFTX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9VUERBVEVfQVBXUFNJRV9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfR0VUX1dQU1BCQ19TRVNTSU9OX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9XUFNfUEJDX1BST0JFX1JFUV9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU0VUX0FQV1BBUlNOSUVzX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9VUFBFUl9MQVlFUl9BU1NPQ19DTkYpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfSElERV9TU0lEX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9SRU1BSU5fT05fQ0hBTk5FTF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfUkVNQUlOX09OX0NITl9SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfTUdNVF9GUk1fSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1JFTUFJTl9PTl9DSE5fUkRZX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TRU5EX0FDVElPTl9GUkFNRV9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfQUNUSU9OX0ZSQU1FX1NFTkRfQ05GKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0FCT1JUX1JFTUFJTl9PTl9DSEFOX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9VUERBVEVfTk9BKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0NMRUFSX0RGU19DSEFOTkVMX0xJU1QpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfR0VUX1NOUl9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfTElOS19TVEFUVVNfSU5EKTsKKworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9QTUNfTVNHX1RZUEVTX0JFR0lOKTsKKworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9QTUNfU01QU19TVEFURV9JTkQpOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfUlJNX01TR19UWVBFX0JFR0lOKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX05FSUdIQk9SX1JFUE9SVF9SRVFfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX05FSUdIQk9SX1JFUE9SVF9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfQkVBQ09OX1JFUE9SVF9SRVFfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVTUF9YTUlUX0lORCk7CisjZW5kaWYKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0FERF9TVEFfU0VMRl9SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfREVMX1NUQV9TRUxGX1JTUCk7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfRlRfUFJFX0FVVEhfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0ZUX1BSRV9BVVRIX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9GVF9VUERBVEVfS0VZKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0ZUX0FHR1JfUU9TX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9GVF9BR0dSX1FPU19SU1ApOworI2VuZGlmCisjaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fRVNFCisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9FU0VfQURKQUNFTlRfQVBfUkVQT1JUKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfUkVHSVNURVJfTUdNVF9GUkFNRV9SRVEpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfUFJFRl9ORVRXT1JLX0ZPVU5EX0lORCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1NDQU5fUE5PICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9DSEFOR0VfQ09VTlRSWV9DT0RFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0dFTkVSSUNfQ0hBTkdFX0NPVU5UUllfQ09ERSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9NQVhfQVNTT0NfRVhDRUVERUQpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9QTUNfR1RLX09GRkxPQURfR0VUSU5GT19SU1ApOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRCAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfTVNHX1RZUEVTX0VORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9HRVRfVFNNX1NUQVRTX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9HRVRfVFNNX1NUQVRTX1JTUCk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfUk9BTV9PRkZMT0FEX1NZTkNIX0lORCk7CisjZW5kaWYKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NFVF9IV19NT0RFX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TRVRfSFdfTU9ERV9SRVNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0hXX01PREVfVFJBTlNfSU5EKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHVpbnQ4X3QgKikgIlVOS05PV04iOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogbWFjX3RyYWNlX2dldF93bWFfbXNnX3N0cmluZygpIC0gR2V0IHRoZSBtc2cKKyAqIEB3bWFfbXNnOiBtZXNzYWdlIHR5cGUgaW4gbnVtZXJpYyBmb3JtCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHN0cmluZyBlcXVpdmFsZW50IG9mIHRoZSBtZXNzYWdlLgorICoKKyAqIFJldHVybjogU3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIG1lc3NhZ2UgdHlwZS4KKyAqKi8KK3VpbnQ4X3QgKm1hY190cmFjZV9nZXRfd21hX21zZ19zdHJpbmcodWludDE2X3Qgd21hX21zZykKK3sKKwlzd2l0Y2ggKHdtYV9tc2cpIHsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9BRERfU1RBX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfQUREX1NUQV9SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0FERF9TVEFfU0VMRl9SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0RFTEVURV9TVEFfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9ERUxFVEVfU1RBX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfQUREX0JTU19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0FERF9CU1NfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9ERUxFVEVfQlNTX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfREVMRVRFX0JTU19SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NFTkRfQkVBQ09OX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX0JTU0tFWV9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NFVF9CU1NLRVlfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfU1RBS0VZX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX1NUQUtFWV9SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1VQREFURV9FRENBX1BST0ZJTEVfSU5EKTsKKworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1VQREFURV9CRUFDT05fSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9VUERBVEVfQ0ZfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9DSE5MX1NXSVRDSF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0FERF9UU19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0RFTF9UU19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0VYSVRfUFNfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9FTlRFUl9QU19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX01JU1NFRF9CRUFDT05fSU5EKTsKKworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0NGR19SWFBfRklMVEVSX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU1dJVENIX0NIQU5ORUxfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9QMlBfTk9BX0FUVFJfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9QMlBfTk9BX1NUQVJUX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfUFdSX1NBVkVfQ0ZHKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9SRUdJU1RFUl9QRV9DQUxMQkFDSyk7CisKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9JQlNTX1NUQV9BREQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1RJTUVSX0FESlVTVF9BREFQVElWRV9USFJFU0hPTERfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfTElOS19TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX0xJTktfU1RBVEVfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfU1RBX0JDQVNUS0VZX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX1NUQV9CQ0FTVEtFWV9SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0FERF9UU19SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0RQVV9NSUNfRVJST1IpOworCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfVElNRVJfQ0hJUF9NT05JVE9SX1RJTUVPVVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1RJTUVSX1RSQUZGSUNfQUNUSVZJVFlfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9USU1FUl9BRENfUlNTSV9TVEFUUyk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1RTTV9TVEFUU19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1RTTV9TVEFUU19SU1ApOworI2VuZGlmCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX01JTU9QU19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NFVF9NSU1PUFNfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TWVNfUkVBRFlfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfVFhfUE9XRVJfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfVFhfUE9XRVJfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9HRVRfVFhfUE9XRVJfUkVRKTsKKworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1RSQU5TTUlTU0lPTl9DT05UUk9MX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfRU5BQkxFX1VBUFNEX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfRElTQUJMRV9VQVBTRF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0JFQUNPTl9GSUxURVJfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9XT1dfQUREX1BUUk4pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1dPV19ERUxfUFRSTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfV09XTF9FTlRFUl9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1dPV0xfRVhJVF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0dFVF9TVEFUSVNUSUNTX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfR0VUX1NUQVRJU1RJQ1NfUlNQKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfS0VZX0RPTkUpOworCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfQlRDX1NFVF9DRkcpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0hBTkRMRV9GV19NQk9YX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VORF9QUk9CRV9SU1BfVE1QTCk7CisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU1RBUlRfT0VNX0RBVEFfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TVEFSVF9PRU1fREFUQV9SU1ApOworI2VuZGlmIC8qIFNVUFBPUlRfQkVBQ09OX0ZJTFRFUiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NFVF9NQVhfVFhfUE9XRVJfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfSE9TVF9PRkZMT0FEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfS0VFUF9BTElWRSk7CisjaWZkZWYgV0xBTl9OU19PRkZMT0FECisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX05TX09GRkxPQUQpOworI2VuZGlmIC8qIFdMQU5fTlNfT0ZGTE9BRCAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0FERF9TVEFfU0VMRl9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0RFTF9TVEFfU0VMRl9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NFVF9QMlBfR09fTk9BX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfV0xBTl9TVVNQRU5EX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfV0xBTl9SRVNVTUVfUkVRKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRVhUV09XX1NVUFBPUlQKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9XTEFOX0VYVF9XT1cpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1dMQU5fU0VUX0FQUF9UWVBFMV9QQVJBTVMpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1dMQU5fU0VUX0FQUF9UWVBFMl9QQVJBTVMpOworI2VuZGlmCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfTVNHX1RZUEVTX0VORCk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9BR0dSX1FPU19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0FHR1JfUU9TX1JTUCk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9GVE1fQ01EX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfRlRNX0NNRF9SU1ApOworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NFVF9QTk9fUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TTUVfU0NBTl9DQUNIRV9VUERBVEVEKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9ST0FNX1NDQU5fT0ZGTE9BRF9SRVEpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfODAyM19NVUxUSUNBU1RfTElTVF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1JFQ0VJVkVfRklMVEVSX1NFVF9GSUxURVJfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HCisJCQkoV01BX1BBQ0tFVF9DT0FMRVNDSU5HX0ZJTFRFUl9NQVRDSF9DT1VOVF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcKKwkJCShXTUFfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfUkVDRUlWRV9GSUxURVJfQ0xFQVJfRklMVEVSX1JFUSk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9HVEtfT0ZGTE9BRF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0dUS19PRkZMT0FEX0dFVElORk9fUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JTUCk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FEICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX1RNX0xFVkVMX1JFUSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9VUERBVEVfT1BfTU9ERSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfVVBEQVRFX01FTUJFUlNISVApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1VQREFURV9VU0VSUE9TKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NUQVJUX1NDQU5fT0ZGTE9BRF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NUT1BfU0NBTl9PRkZMT0FEX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfVVBEQVRFX0NIQU5fTElTVF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0NMSV9TRVRfQ01EKTsKKyNpZm5kZWYgUkVNT1ZFX1BLVF9MT0cKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9QS1RMT0dfRU5BQkxFX1JFUSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX1BMTV9SRVEpOworI2VuZGlmCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfQ09ORklHX1BBUkFNX1VQREFURV9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1JBVEVfVVBEQVRFX0lORCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9VUERBVEVfRldfVERMU19TVEFURSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfVVBEQVRFX1RETFNfUEVFUl9TVEFURSk7CisjZW5kaWYKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9BRERfUEVSSU9ESUNfVFhfUFRSTl9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1RYX1BPV0VSX0xJTUlUKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTFBIQgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0xQSEJfQ09ORl9SRVEpOworI2VuZGlmCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfREhDUF9TVEFSVF9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0RIQ1BfU1RPUF9JTkQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAorCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0NIX0FWT0lEX1VQREFURV9SRVEpOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfQVVUT19TSFVURE9XTl9USU1FUl9SRVEpOworI2VuZGlmCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfSU5JVF9USEVSTUFMX0lORk9fQ01EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfVEhFUk1BTF9MRVZFTCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX1NBUF9JTlRSQUJTU19ESVMpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9ST0FNX09GRkxPQURfU1lOQ0hfQ05GKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9ST0FNX09GRkxPQURfU1lOQ0hfRkFJTCk7CisjZW5kaWYKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfU0VUX0JBU0VfTUFDQUREUl9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0xJTktfU1RBVFVTX0dFVF9SRVEpOworI2lmZGVmIERIQ1BfU0VSVkVSX09GRkxPQUQKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfREhDUF9TRVJWRVJfT0ZGTE9BRF9DTUQpOworI2VuZGlmCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfT0NCX1NFVF9DT05GSUdfQ01EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9PQ0JfU0VUX1VUQ19USU1FX0NNRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfQ01EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9PQ0JfU1RPUF9USU1JTkdfQURWRVJUX0NNRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfT0NCX0dFVF9UU0ZfVElNRVJfQ01EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9EQ0NfR0VUX1NUQVRTX0NNRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfRENDX0NMRUFSX1NUQVRTX0NNRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfRENDX1VQREFURV9ORExfQ01EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfSUVfSU5GTyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTklfQ0ZHX0ROTERfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfVU5JVF9URVNUX0NNRCk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9ST0FNX0lOVk9LRSk7CisjZW5kaWYKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfU0VUX01BUyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NFVF9NSVJBQ0FTVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0NPTkZJR19TVEFUU19GQUNUT1IpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9DT05GSUdfR1VBUkRfVElNRSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NUQVJUX1NUT1BfTE9HR0lORyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0ZMVVNIX0xPR19UT19GVyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NPQ19TRVRfUENMX1RPX0ZXKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfU09DX1NFVF9IV19NT0RFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfU09DX0RVQUxfTUFDX0NGR19SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1JBREFSX0RFVEVDVEVEX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfVElNRVJfVFJBRkZJQ19TVEFUU19JTkQpOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9FWENMVURFX1VORU5DUllQVEVEX0lORCk7CisjZW5kaWYKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9XT1dMX0VOVEVSX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfV09XTF9FWElUX1JTUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX01BWF9UWF9QT1dFUl9SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NFVF9NQVhfVFhfUE9XRVJfUEVSX0JBTkRfUkVRKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NFVF9URExTX0xJTktfRVNUQUJMSVNIX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX1RETFNfTElOS19FU1RBQkxJU0hfUkVRX1JTUCk7CisjZW5kaWYKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9DU0FfT0ZGTE9BRF9FVkVOVCk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1JPQU1fT0ZGTE9BRF9TWU5DSF9JTkQpOworI2VuZGlmCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfSElEREVOX1NTSURfVkRFVl9SRVNUQVJUKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1VQREFURV9SWF9OU1MpOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX05BTl9SRVFVRVNUKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1JYX1NDQU5fRVZFTlQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0lCU1NfUEVFUl9JTkFDVElWSVRZX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfREVMX1BFUklPRElDX1RYX1BUUk5fSU5EKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1RETFNfU0hPVUxEX0RJU0NPVkVSX0NNRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfVERMU19TSE9VTERfVEVBUkRPV05fQ01EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9URExTX1BFRVJfRElTQ09OTkVDVEVEX0NNRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfVERMU19TRVRfT0ZGQ0hBTl9NT0RFKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0RGU19SQURBUl9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0RGU19CRUFDT05fVFhfU1VDQ0VTU19JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0RJU0FTU09DX1RYX0NPTVApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0RFQVVUSF9UWF9DT01QKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9HRVRfTElOS19TUEVFRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfTU9ERU1fUE9XRVJfU1RBVEVfSU5EKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU1RBVFNfRVhUX1JFUVVFU1QpOworI2VuZGlmCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfSVBBX09GRkxPQURfRU5BQkxFX0RJU0FCTEUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0dFVF9URU1QRVJBVFVSRV9SRVEpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfRVhUU0NBTl9TVEFSVF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0VYVFNDQU5fU1RPUF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0VYVFNDQU5fU0VUX0JTU0lEX0hPVExJU1RfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9FWFRTQ0FOX1JFU0VUX0JTU0lEX0hPVExJU1RfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9FWFRTQ0FOX1NFVF9TSUdORl9DSEFOR0VfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9FWFRTQ0FOX1JFU0VUX1NJR05GX0NIQU5HRV9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0VYVFNDQU5fR0VUX0NBQ0hFRF9SRVNVTFRTX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX0VQTk9fTElTVF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1NFVF9QQVNTUE9JTlRfTElTVF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX1JFU0VUX1BBU1NQT0lOVF9MSVNUX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfRVhUU0NBTl9TRVRfU1NJRF9IT1RMSVNUX1JFUSk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VYVFNDQU4gKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0xJTktfTEFZRVJfU1RBVFNfQ0xFQVJfUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9MSU5LX0xBWUVSX1NUQVRTX1NFVF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0xJTktfTEFZRVJfU1RBVFNfR0VUX1JFUSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfTElOS19MQVlFUl9TVEFUU19SRVNVTFRTX1JTUCk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9TRVRfU0NBTl9NQUNfT1VJX1JFUSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0dQSU9fTEVEX0ZMQVNISU5HCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfTEVEX0ZMQVNISU5HX1JFUSk7CisjZW5kaWYKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9QUk9DRVNTX0ZXX0VWRU5UKTsKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNQV9VUERBVEVfUTJRX0lFX0lORCk7CisjZW5kaWYgLyogRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUFfU0VUX1JTU0lfTU9OSVRPUl9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01BX0ZXX01FTV9EVU1QX1JFUSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICh1aW50OF90ICopICJVTktOT1dOIjsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIG1hY190cmFjZV9nZXRfbGltX21zZ19zdHJpbmcoKSAtIEdldCB0aGUgbXNnCisgKiBAbGltX21zZzogbWVzc2FnZSB0eXBlIGluIG51bWVyaWMgZm9ybQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBzdHJpbmcgZXF1aXZhbGVudCBvZiB0aGUgbWVzc2FnZS4KKyAqCisgKiBSZXR1cm46IFN0cmluZyBlcXVpdmFsZW50IG9mIHRoZSBtZXNzYWdlIHR5cGUuCisgKiovCit1aW50OF90ICptYWNfdHJhY2VfZ2V0X2xpbV9tc2dfc3RyaW5nKHVpbnQxNl90IGxpbV9tc2cpCit7CisJc3dpdGNoIChsaW1fbXNnKSB7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX1JFVFJZX0lOVEVSUlVQVF9NU0cpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0JCX1hQT1JUX01HTVRfTVNHKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fSU5WX0tFWV9JTlRFUlJVUFRfTVNHKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fS0VZX0lEX0lOVEVSUlVQVF9NU0cpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9SRVBMQVlfVEhSRVNfSU5URVJSVVBUX01TRyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX1REX0RVTU1ZX0NBTExCQUNLX01TRyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX1NDSF9DTEVBTl9NU0cpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9SQURBUl9ERVRFQ1RfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fREVMX1RTX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0RFTEVURV9TVEFfQ09OVEVYVF9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9VUERBVEVfQkVBQ09OKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fSk9JTl9GQUlMX1RJTUVPVVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9BVVRIX0ZBSUxfVElNRU9VVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0FVVEhfUlNQX1RJTUVPVVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9BU1NPQ19GQUlMX1RJTUVPVVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9SRUFTU09DX0ZBSUxfVElNRU9VVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0hFQVJUX0JFQVRfVElNRU9VVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX1BST0JFX0hCX0ZBSUxVUkVfVElNRU9VVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0FERFRTX1JTUF9USU1FT1VUKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fTElOS19URVNUX0RVUkFUSU9OX1RJTUVPVVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9IQVNIX01JU1NfVEhSRVNfVElNRU9VVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0NORl9XQUlUX1RJTUVPVVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9VUERBVEVfT0xCQ19DQUNIRUxfVElNRU9VVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0NIQU5ORUxfU1dJVENIX1RJTUVPVVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9RVUlFVF9USU1FT1VUKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fUVVJRVRfQlNTX1RJTUVPVVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9XUFNfT1ZFUkxBUF9USU1FT1VUKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9GVF9QUkVBVVRIX1JTUF9USU1FT1VUKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9SRU1BSU5fQ0hOX1RJTUVPVVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9JTlNFUlRfU0lOR0xFU0hPVF9OT0FfVElNRU9VVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0NPTlZFUlRfQUNUSVZFX0NIQU5ORUxfVE9fUEFTU0lWRSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0JFQUNPTl9HRU5fSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fUEVSSU9ESUNfUFJPQkVfUkVRX1RJTUVPVVQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fRVNFX1RTTV9USU1FT1VUKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9ESVNBU1NPQ19BQ0tfVElNRU9VVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0RFQVVUSF9BQ0tfVElNRU9VVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX1BFUklPRElDX0pPSU5fUFJPQkVfUkVRX1RJTUVPVVQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9NU0dfVFlQRVNfRU5EKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAodWludDhfdCAqKSAiVU5LTk9XTiI7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBtYWNfdHJhY2VfZ2V0X2NmZ19tc2dfc3RyaW5nKCkgLSBHZXQgdGhlIG1zZworICogQGNmZ19tc2c6IG1lc3NhZ2UgdHlwZSBpbiBudW1lcmljIGZvcm0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgc3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIG1lc3NhZ2UuCisgKgorICogUmV0dXJuOiBTdHJpbmcgZXF1aXZhbGVudCBvZiB0aGUgbWVzc2FnZSB0eXBlLgorICoqLwordWludDhfdCAqbWFjX3RyYWNlX2dldF9jZmdfbXNnX3N0cmluZyh1aW50MTZfdCBjZmdfbXNnKQoreworCXN3aXRjaCAoY2ZnX21zZykgeworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV05JX0NGR19QQVJBTV9VUERBVEVfSU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdOSV9DRkdfRE5MRF9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV05JX0NGR19ETkxEX0NORik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTklfQ0ZHX0dFVF9SU1ApOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV05JX0NGR19TRVRfQ05GKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9DRkdfUEFSQU1fVVBEQVRFX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhTSVJfQ0ZHX0RPV05MT0FEX0NPTVBMRVRFX0lORCk7CisKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdOSV9DRkdfU0VUX1JFUV9OT19SU1ApOworCWRlZmF1bHQ6CisJCXJldHVybiAodWludDhfdCAqKSAiVU5LTk9XTiI7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBtYWNfdHJhY2VfZ2V0X2luZm9fbG9nX3N0cmluZygpIC0gR2V0IHRoZSBsb2cgaW5mbworICogQGluZm9fbG9nOiBtZXNzYWdlIHR5cGUgaW4gbnVtZXJpYyBmb3JtCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHN0cmluZyBlcXVpdmFsZW50IG9mIHRoZSBtZXNzYWdlLgorICoKKyAqIFJldHVybjogU3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIG1lc3NhZ2UgdHlwZS4KKyAqKi8KK3VpbnQ4X3QgKm1hY190cmFjZV9nZXRfaW5mb19sb2dfc3RyaW5nKHVpbnQxNl90IGluZm9fbG9nKQoreworCXN3aXRjaCAoaW5mb19sb2cpIHsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVMT0dfTk9EUk9QX01JU1NFRF9CRUFDT05fU0NFTkFSSU8pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUxPR19QUk9DX0RFQVVUSF9GUkFNRV9TQ0VOQVJJTyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICh1aW50OF90ICopICJVTktOT1dOIjsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIG1hY190cmFjZSgpIC0gTWFpbiBmdW5jdGlvbiB1c2VkIGZvciBNQUMgVHJhY2UKKyAqIEBtYWNfY3R4OiAgICAgICBHbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBjb2RlOiAgICAgICAgICBjb2RlCisgKiBAc2Vzc2lvbjogICAgICAgc2Vzc2lvbiBpZAorICogQGRhdGE6ICAgICAgICAgIGRhdGEgdG8gYmUgdHJhY2VkLgorICoKKyAqIFJldHVybjogTm9uZQorICoqLwordm9pZCBtYWNfdHJhY2UodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCBjb2RlLAorCQl1aW50MTZfdCBzZXNzaW9uLCB1aW50MzJfdCBkYXRhKQoreworCS8qCisJICogVG9kYXkgbWFjX3RyYWNlIGlzIGJlaW5nIGludm9rZWQgYnkgUEUgb25seSwgbmVlZCB0byByZW1vdmUgdGhpcworCSAqIGZ1bmN0aW9uIG9uY2UgUEUgaXMgbWlncmF0ZWQgdG8gdXNpbmcgbmV3IHRyYWNlIEFQSS4KKwkgKi8KKwltYWNfdHJhY2VfbmV3KG1hY19jdHgsIENERl9NT0RVTEVfSURfUEUsIGNvZGUsIHNlc3Npb24sIGRhdGEpOworfQorCisvKioKKyAqIG1hY190cmFjZV9uZXcoKSAtIE5ldyBmdW5jdGlvbiB1c2VkIGZvciBNQUMgVHJhY2UKKyAqIEBtYWNfY3R4OiAgICAgICBHbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBjb2RlOiAgICAgICAgICBjb2RlCisgKiBAc2Vzc2lvbjogICAgICAgc2Vzc2lvbiBpZAorICogQGRhdGE6ICAgICAgICAgIGRhdGEgdG8gYmUgdHJhY2VkLgorICoKKyAqIFJldHVybjogTm9uZQorICoqLwordm9pZCBtYWNfdHJhY2VfbmV3KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgbW9kdWxlLCB1aW50OF90IGNvZGUsCisJCSAgIHVpbnQxNl90IHNlc3Npb24sIHVpbnQzMl90IGRhdGEpCit7CisJY2RmX3RyYWNlKG1vZHVsZSwgY29kZSwgc2Vzc2lvbiwgZGF0YSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3V0aWxzL3NyYy9wYXJzZXJfYXBpLmMgYi9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvdXRpbHMvc3JjL3BhcnNlcl9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGVhNDJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3V0aWxzL3NyYy9wYXJzZXJfYXBpLmMKQEAgLTAsMCArMSw1NjU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHBhcnNlcl9hcGkuY2MgY29udGFpbnMgdGhlIGNvZGUgZm9yIHBhcnNpbmcKKyAqIDgwMi4xMSBtZXNzYWdlcy4KKyAqIEF1dGhvcjogICAgICAgIFBpZXJyZSBWYW5kd2FsbGUKKyAqIERhdGU6ICAgICAgICAgIDAzLzE4LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAicGFyc2VyX2FwaS5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJsaW1fdXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlsc19wYXJzZXIuaCIKKyNpbmNsdWRlICJsaW1fc2VyX2Rlc191dGlscy5oIgorI2luY2x1ZGUgInNjaF9hcGkuaCIKKyNpbmNsdWRlICJ3bW1fYXBzZC5oIgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybV9hcGkuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiY2RzX3JlZ2RvbWFpbl9jb21tb24uaCIKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwordm9pZCBkb3QxMWZfbG9nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGludCBsb2dsZXZlbCwgY29uc3QgY2hhciAqcFN0cmluZywgLi4uKQoreworI2lmZGVmIFdMQU5fREVCVUcKKwlpZiAoKHVpbnQzMl90KSBsb2dsZXZlbCA+CisJICAgIHBNYWMtPnV0aWxzLmdMb2dEYmdMZXZlbFtMT0dfSU5ERVhfRk9SX01PRFVMRShTSVJfREJHX01PRFVMRV9JRCldKSB7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQl2YV9saXN0IG1hcmtlcjsKKworCQl2YV9zdGFydChtYXJrZXIsIHBTdHJpbmcpOyAgICAgIC8qIEluaXRpYWxpemUgdmFyaWFibGUgYXJndW1lbnRzLiAqLworCisJCWxvZ19kZWJ1ZyhwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgbG9nbGV2ZWwsIHBTdHJpbmcsIG1hcmtlcik7CisKKwkJdmFfZW5kKG1hcmtlcik7IC8qIFJlc2V0IHZhcmlhYmxlIGFyZ3VtZW50cy4gICAgICAqLworCX0KKyNlbmRpZgorfQorCit2b2lkIHN3YXBfYml0X2ZpZWxkMTYodWludDE2X3QgaW4sIHVpbnQxNl90ICpvdXQpCit7CisjaWZkZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJKm91dCA9IGluOworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaWctRW5kaWFuLi4uICovCisJKm91dCA9ICgoaW4gJiAweDgwMDApID4+IDE1KSB8CisJICAgICAgICgoaW4gJiAweDQwMDApID4+IDEzKSB8CisJICAgICAgICgoaW4gJiAweDIwMDApID4+IDExKSB8CisJICAgICAgICgoaW4gJiAweDEwMDApID4+IDkpIHwKKwkgICAgICAgKChpbiAmIDB4MDgwMCkgPj4gNykgfAorCSAgICAgICAoKGluICYgMHgwNDAwKSA+PiA1KSB8CisJICAgICAgICgoaW4gJiAweDAyMDApID4+IDMpIHwKKwkgICAgICAgKChpbiAmIDB4MDEwMCkgPj4gMSkgfAorCSAgICAgICAoKGluICYgMHgwMDgwKSA8PCAxKSB8CisJICAgICAgICgoaW4gJiAweDAwNDApIDw8IDMpIHwKKwkgICAgICAgKChpbiAmIDB4MDAyMCkgPDwgNSkgfAorCSAgICAgICAoKGluICYgMHgwMDEwKSA8PCA3KSB8CisJICAgICAgICgoaW4gJiAweDAwMDgpIDw8IDkpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwNCkgPDwgMTEpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMikgPDwgMTMpIHwgKChpbiAmIDB4MDAwMSkgPDwgMTUpOworI2VuZGlmIC8qIEFOSV9MSVRUTEVfQklUX0VORElBTiAqLworfQorCit2b2lkIHN3YXBfYml0X2ZpZWxkMzIodWludDMyX3QgaW4sIHVpbnQzMl90ICpvdXQpCit7CisjaWZkZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisJKm91dCA9IGluOworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaWctRW5kaWFuLi4uICovCisJKm91dCA9ICgoaW4gJiAweDgwMDAwMDAwKSA+PiAzMSkgfAorCSAgICAgICAoKGluICYgMHg0MDAwMDAwMCkgPj4gMjkpIHwKKwkgICAgICAgKChpbiAmIDB4MjAwMDAwMDApID4+IDI3KSB8CisJICAgICAgICgoaW4gJiAweDEwMDAwMDAwKSA+PiAyNSkgfAorCSAgICAgICAoKGluICYgMHgwODAwMDAwMCkgPj4gMjMpIHwKKwkgICAgICAgKChpbiAmIDB4MDQwMDAwMDApID4+IDIxKSB8CisJICAgICAgICgoaW4gJiAweDAyMDAwMDAwKSA+PiAxOSkgfAorCSAgICAgICAoKGluICYgMHgwMTAwMDAwMCkgPj4gMTcpIHwKKwkgICAgICAgKChpbiAmIDB4MDA4MDAwMDApID4+IDE1KSB8CisJICAgICAgICgoaW4gJiAweDAwNDAwMDAwKSA+PiAxMykgfAorCSAgICAgICAoKGluICYgMHgwMDIwMDAwMCkgPj4gMTEpIHwKKwkgICAgICAgKChpbiAmIDB4MDAxMDAwMDApID4+IDkpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwODAwMDApID4+IDcpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwNDAwMDApID4+IDUpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMjAwMDApID4+IDMpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMTAwMDApID4+IDEpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMDgwMDApIDw8IDEpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMDQwMDApIDw8IDMpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMDIwMDApIDw8IDUpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMDEwMDApIDw8IDcpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMDA4MDApIDw8IDkpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMDA0MDApIDw8IDExKSB8CisJICAgICAgICgoaW4gJiAweDAwMDAwMjAwKSA8PCAxMykgfAorCSAgICAgICAoKGluICYgMHgwMDAwMDEwMCkgPDwgMTUpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMDAwODApIDw8IDE3KSB8CisJICAgICAgICgoaW4gJiAweDAwMDAwMDQwKSA8PCAxOSkgfAorCSAgICAgICAoKGluICYgMHgwMDAwMDAyMCkgPDwgMjEpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMDAwMTApIDw8IDIzKSB8CisJICAgICAgICgoaW4gJiAweDAwMDAwMDA4KSA8PCAyNSkgfAorCSAgICAgICAoKGluICYgMHgwMDAwMDAwNCkgPDwgMjcpIHwKKwkgICAgICAgKChpbiAmIDB4MDAwMDAwMDIpIDw8IDI5KSB8ICgoaW4gJiAweDAwMDAwMDAxKSA8PCAzMSk7CisjZW5kaWYgLyogQU5JX0xJVFRMRV9CSVRfRU5ESUFOICovCit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBfX3ByaW50X3dtbV9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICB0RG90MTFmSUVXTU1QYXJhbXMgKnBXbW0pCit7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiV01NIFBhcmFtZXRlcnMgUmVjZWl2ZWQ6IFxuIikpOworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwKKwkJCSgiQkU6IGFpZnNuICVkLCBhY20gJWQsIGFjaSAlZCwgY3dtaW4gJWQsIGN3bWF4ICVkLCB0eG9wICVkIFxuIiksCisJCXBXbW0tPmFjYmVfYWlmc24sIHBXbW0tPmFjYmVfYWNtLCBwV21tLT5hY2JlX2FjaSwKKwkJcFdtbS0+YWNiZV9hY3dtaW4sIHBXbW0tPmFjYmVfYWN3bWF4LCBwV21tLT5hY2JlX3R4b3BsaW1pdCk7CisKKwlsaW1fbG9nKHBNYWMsIExPRzEsCisJCUZMCisJCQkoIkJLOiBhaWZzbiAlZCwgYWNtICVkLCBhY2kgJWQsIGN3bWluICVkLCBjd21heCAlZCwgdHhvcCAlZCBcbiIpLAorCQlwV21tLT5hY2JrX2FpZnNuLCBwV21tLT5hY2JrX2FjbSwgcFdtbS0+YWNia19hY2ksCisJCXBXbW0tPmFjYmtfYWN3bWluLCBwV21tLT5hY2JrX2Fjd21heCwgcFdtbS0+YWNia190eG9wbGltaXQpOworCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTAorCQkJKCJWSTogYWlmc24gJWQsIGFjbSAlZCwgYWNpICVkLCBjd21pbiAlZCwgY3dtYXggJWQsIHR4b3AgJWQgXG4iKSwKKwkJcFdtbS0+YWN2aV9haWZzbiwgcFdtbS0+YWN2aV9hY20sIHBXbW0tPmFjdmlfYWNpLAorCQlwV21tLT5hY3ZpX2Fjd21pbiwgcFdtbS0+YWN2aV9hY3dtYXgsIHBXbW0tPmFjdmlfdHhvcGxpbWl0KTsKKworCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwKKwkJCSgiVk86IGFpZnNuICVkLCBhY20gJWQsIGFjaSAlZCwgY3dtaW4gJWQsIGN3bWF4ICVkLCB0eG9wICVkIFxuIiksCisJCXBXbW0tPmFjdm9fYWlmc24sIHBXbW0tPmFjdm9fYWNtLCBwV21tLT5hY3ZvX2FjaSwKKwkJcFdtbS0+YWN2b19hY3dtaW4sIHBXbW0tPmFjdm9fYWN3bWF4LCBwV21tLT5hY3ZvX3R4b3BsaW1pdCk7CisKKwlyZXR1cm47Cit9CisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIEZ1bmN0aW9ucyBmb3IgcG9wdWxhdGluZyAiZG90MTFmIiBzdHlsZSBJRXMgKi8KKworLyogcmV0dXJuOiA+PSAwLCB0aGUgc3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIElFIGluIHJzbklFZGF0YSBpbnNpZGUgdFNpclJTTmllICovCisvKiAgICAgICAgIDwgMCwgY2Fubm90IGZpbmQgKi8KK2ludCBmaW5kX2llX2xvY2F0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyUlNOaWUgcFJzbkllLCB1aW50OF90IEVJRCkKK3sKKwlpbnQgaWR4LCBpZUxlbiwgYnl0ZXNMZWZ0OworCWludCByZXRfdmFsID0gLTE7CisKKwkvKiBIZXJlJ3Mgd2hhdCdzIGdvaW5nIG9uOiAncnNuSWUnIGxvb2tzIGxpa2UgdGhpczogKi8KKworCS8qICAgICB0eXBlZGVmIHN0cnVjdCBzU2lyUlNOaWUgKi8KKwkvKiAgICAgeyAqLworCS8qICAgICAgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAqLworCS8qICAgICAgICAgdWludDhfdCAgICAgICAgcnNuSUVkYXRhW1NJUl9NQUNfTUFYX0lFX0xFTkdUSCsyXTsgKi8KKwkvKiAgICAgfSB0U2lyUlNOaWUsICp0cFNpclJTTmllOyAqLworCisJLyogb3RoZXIgY29kZSByZWNvcmRzIGJvdGggdGhlIFdQQSAmIFJTTiBJRXMgKGluY2x1ZGluZyB0aGVpciBFSURzICYgKi8KKwkvKiBsZW5ndGhzKSBpbnRvIHRoZSBhcnJheSAncnNuSUVkYXRhJy4gIFdlIG1heSBoYXZlOiAqLworCisJLyogICAgIFdpdGggV0FQSSBzdXBwb3J0LCB0aGVyZSBtYXkgYmUgMyBJRXMgaGVyZSAqLworCS8qICAgICBJdCBjYW4gYmUgb25seSBXUEEgSUUsIG9yIG9ubHkgUlNOIElFIG9yIG9ubHkgV0FQSSBJRSAqLworCS8qICAgICBPciB0d28gb3IgYWxsIHRocmVlIG9mIHRoZW0gd2l0aCBubyBwYXJ0aWN1bGFyIG9yZGVyaW5nICovCisKKwkvKiBUaGUgaWYvdGhlbi9lbHNlIHN0YXRlbWVudHMgdGhhdCBmb2xsb3cgYXJlIGhlcmUgdG8gZmlndXJlIG91dCAqLworCS8qIHdoZXRoZXIgd2UgaGF2ZSB0aGUgV1BBIElFLCBhbmQgd2hlcmUgaXQgaXMgaWYgd2UgKmRvKiBoYXZlIGl0LiAqLworCisJLyogU2F2ZSB0aGUgZmlyc3QgSUUgbGVuZ3RoICovCisJaWVMZW4gPSBwUnNuSWUtPnJzbklFZGF0YVsxXSArIDI7CisJaWR4ID0gMDsKKwlieXRlc0xlZnQgPSBwUnNuSWUtPmxlbmd0aDsKKworCXdoaWxlICgxKSB7CisJCWlmIChFSUQgPT0gcFJzbkllLT5yc25JRWRhdGFbaWR4XSkgeworCQkJLyogRm91bmQgaXQgKi8KKwkJCXJldHVybiAoaWR4KTsKKwkJfSBlbHNlIGlmIChFSUQgIT0gcFJzbkllLT5yc25JRWRhdGFbaWR4XSAmJgorCQkgICAgICAgICAgIC8qICYgaWYgbm8gbW9yZSBJRSwgKi8KKwkJCSAgIGJ5dGVzTGVmdCA8PSAodWludDE2X3QpIChpZUxlbikpIHsKKwkJCWRvdDExZl9sb2cocE1hYywgTE9HMywKKwkJCQkgICBGTCgiTm8gSUUgKCVkKSBpbiBmaW5kX2llX2xvY2F0aW9uLlxuIiksIEVJRCk7CisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQorCQlieXRlc0xlZnQgLT0gaWVMZW47CisJCWllTGVuID0gcFJzbkllLT5yc25JRWRhdGFbaWR4ICsgMV0gKyAyOworCQlpZHggKz0gaWVMZW47CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9jYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgdERvdDExZkZmQ2FwYWJpbGl0aWVzICpwRG90MTFmLAorCQkJICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQxNl90IGNmZzsKKwl0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisKKwluU2lyU3RhdHVzID0gY2ZnX2dldF9jYXBhYmlsaXR5X2luZm8ocE1hYywgJmNmZywgcHNlc3Npb25FbnRyeSk7CisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzKSB7CisJCWRvdDExZl9sb2cocE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byByZXRyaWV2ZSB0aGUgQ2FwYWJpbGl0aWVzIGIiCisJCQkJCSAgIml0ZmllbGQgZnJvbSBDRkcgKCVkKS5cbiIpLAorCQkJICAgblNpclN0YXR1cyk7CisJCXJldHVybiBuU2lyU3RhdHVzOworCX0KKworCXN3YXBfYml0X2ZpZWxkMTYoY2ZnLCAodWludDE2X3QgKikgcERvdDExZik7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKiBFbmQgcG9wdWxhdGVfZG90MTFmX2NhcGFiaWxpdGllcy4gKi8KKworLyoqCisgKiBwb3B1bGF0ZV9kb3RfMTFfZl9leHRfY2hhbm5fc3dpdGNoX2FubigpIC0gRnVuY3Rpb24gdG8gcG9wdWxhdGUgRUNTCisgKiBAbWFjX3B0cjogICAgICAgICAgICBQb2ludGVyIHRvIFBNQUMgc3RydWN0dXJlCisgKiBAZG90XzExX3B0cjogICAgICAgICBFQ1MgZWxlbWVudAorICogQHNlc3Npb25fZW50cnk6ICAgICAgUEUgc2Vzc2lvbiBlbnRyeQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgZXh0ZW5kZWQgY2hhbm5lbCBzd2l0Y2ggZWxlbWVudAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIHBvcHVsYXRlX2RvdF8xMV9mX2V4dF9jaGFubl9zd2l0Y2hfYW5uKHRwQW5pU2lyR2xvYmFsIG1hY19wdHIsCisJCXREb3QxMWZJRWV4dF9jaGFuX3N3aXRjaF9hbm4gKmRvdF8xMV9wdHIsCisJCXRwUEVTZXNzaW9uIHNlc3Npb25fZW50cnkpCit7CisJZG90XzExX3B0ci0+c3dpdGNoX21vZGUgPSBzZXNzaW9uX2VudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hNb2RlOworCWRvdF8xMV9wdHItPm5ld19yZWdfY2xhc3MgPSBjZHNfcmVnZG1fZ2V0X29wY2xhc3NfZnJvbV9jaGFubmVsKAorCQkJbWFjX3B0ci0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnQsCisJCQlzZXNzaW9uX2VudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5wcmltYXJ5Q2hhbm5lbCwKKwkJCXNlc3Npb25fZW50cnktPmdMaW1DaGFubmVsU3dpdGNoLmNoX3dpZHRoKTsKKwlkb3RfMTFfcHRyLT5uZXdfY2hhbm5lbCA9CisJCXNlc3Npb25fZW50cnktPmdMaW1DaGFubmVsU3dpdGNoLnByaW1hcnlDaGFubmVsOworCWRvdF8xMV9wdHItPnN3aXRjaF9jb3VudCA9CisJCXNlc3Npb25fZW50cnktPmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaENvdW50OworCWRvdF8xMV9wdHItPnByZXNlbnQgPSAxOworfQorCit2b2lkCitwb3B1bGF0ZV9kb3QxMWZfY2hhbl9zd2l0Y2hfYW5uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdERvdDExZklFQ2hhblN3aXRjaEFubiAqcERvdDExZiwKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXBEb3QxMWYtPnN3aXRjaE1vZGUgPSBwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hNb2RlOworCXBEb3QxMWYtPm5ld0NoYW5uZWwgPSBwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5wcmltYXJ5Q2hhbm5lbDsKKwlwRG90MTFmLT5zd2l0Y2hDb3VudCA9CisJCSh1aW50OF90KSBwc2Vzc2lvbkVudHJ5LT5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hDb3VudDsKKworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworfQorCit2b2lkCitwb3B1bGF0ZV9kb3QxMWZfY2hhbl9zd2l0Y2hfd3JhcHBlcih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICB0RG90MTFmSUVDaGFubmVsU3dpdGNoV3JhcHBlciAqcERvdDExZiwKKwkJCQkgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwkvKgorCSAqIFRoZSBuZXcgY291bnRyeSBzdWJlbGVtZW50IGlzIHByZXNlbnQgb25seSB3aGVuCisJICogMS4gQVAgcGVyZm9ybXMgRXh0ZW5kZWQgQ2hhbm5lbCBzd2l0Y2hpbmcgdG8gbmV3IGNvdW50cnkuCisJICogMi4gTmV3IE9wZXJhdGluZyBDbGFzcyB0YWJsZSBvciBhIGNoYW5nZWQgc2V0IG9mIG9wZXJhdGluZworCSAqIGNsYXNzZXMgcmVsYXRpdmUgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBjb3VudHJ5IGVsZW1lbnQgc2VudAorCSAqIGluIHRoZSBiZWFjb25zLgorCSAqCisJICogSW4gdGhlIGN1cnJlbnQgc2NlbmFyaW8gQ2hhbm5lbCBTd2l0Y2ggd3JhcHBlciBJRSBpcyBpbmNsdWRlZAorCSAqIHdoZW4gd2UgYSByYWRhciBpcyBmb3VuZCBhbmQgdGhlIEFQIGRvZXMgYSBjaGFubmVsIGNoYW5nZSBpbgorCSAqIHRoZSBzYW1lIHJlZ3VsYXRvcnkgZG9tYWluKE5vIGNvdW50cnkgY2hhbmdlIG9yIE9wZXJhdGluZyBjbGFzcworCSAqIHRhYmxlKS4gU28sIHdlIGRvIG5vdCBuZWVkIHRvIGluY2x1ZGUgdGhlIE5ldyBDb3VudHJ5IElFLgorCSAqCisJICogVHJhbnNtaXQgUG93ZXIgRW52bG9wZSBTdWJlbGVtZW50IGlzIG9wdGlvbmFsCisJICogaW4gQ2hhbm5lbCBTd2l0Y2ggV3JhcHBlciBJRS4gU28sIG5vdCBzZXR0aW5nCisJICogdGhlIFRQRSBzdWJlbGVtZW50LiBXZSBpbmNsdWRlIG9ubHkgV2lkZXJCV0NoYW5Td2l0Y2hBbm4uCisJICovCisJcERvdDExZi0+cHJlc2VudCA9IDE7CisKKwkvKgorCSAqIEFkZCB0aGUgV2lkZSBDaGFubmVsIEJhbmR3aWR0aCBTdWJsZW1lbnQuCisJICovCisJcERvdDExZi0+V2lkZXJCV0NoYW5Td2l0Y2hBbm4ubmV3Q2hhbldpZHRoID0KKwkJcHNlc3Npb25FbnRyeS0+Z0xpbVdpZGVyQldDaGFubmVsU3dpdGNoLm5ld0NoYW5XaWR0aDsKKwlwRG90MTFmLT5XaWRlckJXQ2hhblN3aXRjaEFubi5uZXdDZW50ZXJDaGFuRnJlcTAgPQorCQlwc2Vzc2lvbkVudHJ5LT5nTGltV2lkZXJCV0NoYW5uZWxTd2l0Y2gubmV3Q2VudGVyQ2hhbkZyZXEwOworCXBEb3QxMWYtPldpZGVyQldDaGFuU3dpdGNoQW5uLm5ld0NlbnRlckNoYW5GcmVxMSA9CisJCXBzZXNzaW9uRW50cnktPmdMaW1XaWRlckJXQ2hhbm5lbFN3aXRjaC5uZXdDZW50ZXJDaGFuRnJlcTE7CisJcERvdDExZi0+V2lkZXJCV0NoYW5Td2l0Y2hBbm4ucHJlc2VudCA9IDE7CisKK30KKworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQordm9pZAorcG9wdWxhdGVfZG90MTFmX2F2b2lkX2NoYW5uZWxfaWUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgdERvdDExZklFUUNvbVZlbmRvcklFICpkb3QxMWYsCisJCQkJIHRwUEVTZXNzaW9uIHBlX3Nlc3Npb24pCit7CisJaWYgKCFwZV9zZXNzaW9uLT5zYXBfYWR2ZXJ0aXNlX2F2b2lkX2NoX2llKQorCQlyZXR1cm47CisKKwlkb3QxMWYtPnByZXNlbnQgPSB0cnVlOworCWRvdDExZi0+dHlwZSA9IFFDT01fVkVORE9SX0lFX01DQ19BVk9JRF9DSDsKKwlkb3QxMWYtPmNoYW5uZWwgPSBwZV9zZXNzaW9uLT5jdXJyZW50T3BlckNoYW5uZWw7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQwordm9pZAorcG9wdWxhdGVfZG90MTFmX3dpZGVyX2J3X2NoYW5fc3dpdGNoX2Fubih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgdERvdDExZklFV2lkZXJCV0NoYW5Td2l0Y2hBbm4gKnBEb3QxMWYsCisJCQkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCXBEb3QxMWYtPm5ld0NoYW5XaWR0aCA9CisJCXBzZXNzaW9uRW50cnktPmdMaW1XaWRlckJXQ2hhbm5lbFN3aXRjaC5uZXdDaGFuV2lkdGg7CisJcERvdDExZi0+bmV3Q2VudGVyQ2hhbkZyZXEwID0KKwkJcHNlc3Npb25FbnRyeS0+Z0xpbVdpZGVyQldDaGFubmVsU3dpdGNoLm5ld0NlbnRlckNoYW5GcmVxMDsKKwlwRG90MTFmLT5uZXdDZW50ZXJDaGFuRnJlcTEgPQorCQlwc2Vzc2lvbkVudHJ5LT5nTGltV2lkZXJCV0NoYW5uZWxTd2l0Y2gubmV3Q2VudGVyQ2hhbkZyZXExOworfQorI2VuZGlmCisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9jb3VudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQl0RG90MTFmSUVDb3VudHJ5ICpwRG90MTFmLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXVpbnQzMl90IGxlbiwgbWF4bGVuLCBjb2RlbGVuOworCXVpbnQxNl90IGl0ZW07CisJdFNpclJldFN0YXR1cyBuU2lyU3RhdHVzOworCXRTaXJSRkJhbmQgcmZCYW5kOworCXVpbnQ4X3QgdGVtcFtDRkdfTUFYX1NUUl9MRU5dLCBjb2RlWzNdOworCisJaWYgKHBzZXNzaW9uRW50cnktPmxpbTExZEVuYWJsZWQpIHsKKwkJbGltX2dldF9yZl9iYW5kX25ldyhwTWFjLCAmcmZCYW5kLCBwc2Vzc2lvbkVudHJ5KTsKKwkJaWYgKHJmQmFuZCA9PSBTSVJfQkFORF81X0dIWikgeworCQkJaXRlbSA9IFdOSV9DRkdfTUFYX1RYX1BPV0VSXzU7CisJCQltYXhsZW4gPSBXTklfQ0ZHX01BWF9UWF9QT1dFUl81X0xFTjsKKwkJfSBlbHNlIHsKKwkJCWl0ZW0gPSBXTklfQ0ZHX01BWF9UWF9QT1dFUl8yXzQ7CisJCQltYXhsZW4gPSBXTklfQ0ZHX01BWF9UWF9QT1dFUl8yXzRfTEVOOworCQl9CisKKwkJQ0ZHX0dFVF9TVFIoblNpclN0YXR1cywgcE1hYywgaXRlbSwgdGVtcCwgbGVuLCBtYXhsZW4pOworCisJCWlmICgzID4gbGVuKSB7CisJCQkvKiBubyBsaW1pdCBvbiB0eCBwb3dlciwgY2Fubm90IGluY2x1ZGUgdGhlIElFIGJlY2F1c2UgYXQgbGVhc3QgKi8KKwkJCS8qIG9uZSAoY2hhbm5lbCxudW0sdHggcG93ZXIpIG11c3QgYmUgcHJlc2VudCAqLworCQkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwkJfQorCisJCUNGR19HRVRfU1RSKG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfQ09VTlRSWV9DT0RFLAorCQkJICAgIGNvZGUsIGNvZGVsZW4sIDMpOworCisJCWNkZl9tZW1fY29weShwRG90MTFmLT5jb3VudHJ5LCBjb2RlLCBjb2RlbGVuKTsKKworCQlpZiAobGVuID4gTUFYX1NJWkVfT0ZfVFJJUExFVFNfSU5fQ09VTlRSWV9JRSkgeworCQkJZG90MTFmX2xvZyhwTWFjLCBMT0dFLAorCQkJCSAgIEZMKCJsZW46JWQgaXMgb3V0IG9mIGJvdW5kcywgcmVzZXR0aW5nLlxuIiksCisJCQkJICAgbGVuKTsKKwkJCWxlbiA9IE1BWF9TSVpFX09GX1RSSVBMRVRTX0lOX0NPVU5UUllfSUU7CisJCX0KKworCQlwRG90MTFmLT5udW1fdHJpcGxldHMgPSAodWludDhfdCkgKGxlbiAvIDMpOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcERvdDExZi0+dHJpcGxldHMsIHRlbXAsIGxlbik7CisKKwkJcERvdDExZi0+cHJlc2VudCA9IDE7CisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl9jb3VudHJ5LiAqLworCisjaWZkZWYgUUNBX1dJRklfM18wX0VNVQorLyoqCisgKiBwb3B1bGF0ZV9kb3QxMWZfZHNfcGFyYW1zKCkgLSBUbyBwb3B1bGF0ZSBEUyBJRSBwYXJhbXMKKyAqIG1hY19jdHg6IFBvaW50ZXIgdG8gZ2xvYmFsIG1hYyBjb250ZXh0CisgKiBkb3QxMWZfcGFyYW06IHBvaW50ZXIgdG8gRFMgcGFyYW1zIElFCisgKiBjaGFubmVsOiBjaGFubmVsIG51bWJlcgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHBvcHVsYXRlIERTIHBhcmFtIGluIG1hbmFnZW1lbnQgZnJhbWUgbGlrZQorICogYmVhY29uLCBwcm9iZSByZXNwb25zZSwgYW5kIGV0Yy4KKyAqCisgKiBSZXR1cm46IE92ZXJhbGwgc3VjZXNzCisgKi8KK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9kc19wYXJhbXModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCSAgdERvdDExZklFRFNQYXJhbXMgKmRvdDExZl9wYXJhbSwgdWludDhfdCBjaGFubmVsKQoreworCS8qIC4xMWEvMTFiL2cgbW9kZSBQSFkgPT4gSW5jbHVkZSB0aGUgRFMgUGFyYW1ldGVyIFNldCBJRTogKi8KKwlkb3QxMWZfcGFyYW0tPmN1cnJfY2hhbm5lbCA9IGNoYW5uZWw7CisJZG90MTFmX3BhcmFtLT5wcmVzZW50ID0gMTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qIEVuZCBwb3B1bGF0ZV9kb3QxMWZfZHNfcGFyYW1zLiAqLworI2Vsc2UKKy8qKgorICogcG9wdWxhdGVfZG90MTFmX2RzX3BhcmFtcygpIC0gVG8gcG9wdWxhdGUgRFMgSUUgcGFyYW1zCisgKiBtYWNfY3R4OiBQb2ludGVyIHRvIGdsb2JhbCBtYWMgY29udGV4dAorICogZG90MTFmX3BhcmFtOiBwb2ludGVyIHRvIERTIHBhcmFtcyBJRQorICogY2hhbm5lbDogY2hhbm5lbCBudW1iZXIKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBwb3B1bGF0ZSBEUyBwYXJhbSBpbiBtYW5hZ2VtZW50IGZyYW1lIGxpa2UKKyAqIGJlYWNvbiwgcHJvYmUgcmVzcG9uc2UsIGFuZCBldGMuCisgKgorICogUmV0dXJuOiBPdmVyYWxsIHN1Y2VzcworICovCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfZHNfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkgIHREb3QxMWZJRURTUGFyYW1zICpkb3QxMWZfcGFyYW0sIHVpbnQ4X3QgY2hhbm5lbCkKK3sKKwlpZiAoSVNfMjRHX0NIKGNoYW5uZWwpKSB7CisJCS8qIC4xMWIvZyBtb2RlIFBIWSA9PiBJbmNsdWRlIHRoZSBEUyBQYXJhbWV0ZXIgU2V0IElFOiAqLworCQlkb3QxMWZfcGFyYW0tPmN1cnJfY2hhbm5lbCA9IGNoYW5uZWw7CisJCWRvdDExZl9wYXJhbS0+cHJlc2VudCA9IDE7CisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisjZGVmaW5lIFNFVF9BSUZTTihhaWZzbikgKCgoYWlmc24pIDwgMikgPyAyIDogKGFpZnNuKSkKKwordm9pZAorcG9wdWxhdGVfZG90MTFmX2VkY2FfcGFyYW1fc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgICAgdERvdDExZklFRURDQVBhcmFtU2V0ICpwRG90MTFmLAorCQkJICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwlpZiAocHNlc3Npb25FbnRyeS0+bGltUW9zRW5hYmxlZCkgeworCQkvKiBjaGFuZ2UgdG8gYml0d2lzZSBvcGVyYXRpb24sIGFmdGVyIHRoaXMgaXMgZml4ZWQgaW4gZnJhbWVzLiAqLworCQlwRG90MTFmLT5xb3MgPQorCQkJKHVpbnQ4X3QpICgweGYwICYKKwkJCQkgICAocHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbVNldENvdW50IDw8IDQpKTsKKworCQkvKiBGaWxsIGVhY2ggRURDQSBwYXJhbWV0ZXIgc2V0IGluIG9yZGVyOiBiZSwgYmssIHZpLCB2byAqLworCQlwRG90MTFmLT5hY2JlX2FpZnNuID0KKwkJCSgweGYgJgorCQkJIFNFVF9BSUZTTihwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzBdLmFjaS5haWZzbikpOworCQlwRG90MTFmLT5hY2JlX2FjbSA9CisJCQkoMHgxICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1swXS5hY2kuYWNtKTsKKwkJcERvdDExZi0+YWNiZV9hY2kgPSAoMHgzICYgU0lSX01BQ19FRENBQUNJX0JFU1RFRkZPUlQpOworCQlwRG90MTFmLT5hY2JlX2Fjd21pbiA9CisJCQkoMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1swXS5jdy5taW4pOworCQlwRG90MTFmLT5hY2JlX2Fjd21heCA9CisJCQkoMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1swXS5jdy5tYXgpOworCQlwRG90MTFmLT5hY2JlX3R4b3BsaW1pdCA9CisJCQlwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzBdLnR4b3BsaW1pdDsKKworCQlwRG90MTFmLT5hY2JrX2FpZnNuID0KKwkJCSgweGYgJgorCQkJIFNFVF9BSUZTTihwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzFdLmFjaS5haWZzbikpOworCQlwRG90MTFmLT5hY2JrX2FjbSA9CisJCQkoMHgxICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS5hY2kuYWNtKTsKKwkJcERvdDExZi0+YWNia19hY2kgPSAoMHgzICYgU0lSX01BQ19FRENBQUNJX0JBQ0tHUk9VTkQpOworCQlwRG90MTFmLT5hY2JrX2Fjd21pbiA9CisJCQkoMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS5jdy5taW4pOworCQlwRG90MTFmLT5hY2JrX2Fjd21heCA9CisJCQkoMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS5jdy5tYXgpOworCQlwRG90MTFmLT5hY2JrX3R4b3BsaW1pdCA9CisJCQlwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzFdLnR4b3BsaW1pdDsKKworCQlwRG90MTFmLT5hY3ZpX2FpZnNuID0KKwkJCSgweGYgJgorCQkJIFNFVF9BSUZTTihwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzJdLmFjaS5haWZzbikpOworCQlwRG90MTFmLT5hY3ZpX2FjbSA9CisJCQkoMHgxICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1syXS5hY2kuYWNtKTsKKwkJcERvdDExZi0+YWN2aV9hY2kgPSAoMHgzICYgU0lSX01BQ19FRENBQUNJX1ZJREVPKTsKKwkJcERvdDExZi0+YWN2aV9hY3dtaW4gPQorCQkJKDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMl0uY3cubWluKTsKKwkJcERvdDExZi0+YWN2aV9hY3dtYXggPQorCQkJKDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMl0uY3cubWF4KTsKKwkJcERvdDExZi0+YWN2aV90eG9wbGltaXQgPQorCQkJcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1syXS50eG9wbGltaXQ7CisKKwkJcERvdDExZi0+YWN2b19haWZzbiA9CisJCQkoMHhmICYKKwkJCSBTRVRfQUlGU04ocHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1szXS5hY2kuYWlmc24pKTsKKwkJcERvdDExZi0+YWN2b19hY20gPQorCQkJKDB4MSAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbM10uYWNpLmFjbSk7CisJCXBEb3QxMWYtPmFjdm9fYWNpID0gKDB4MyAmIFNJUl9NQUNfRURDQUFDSV9WT0lDRSk7CisJCXBEb3QxMWYtPmFjdm9fYWN3bWluID0KKwkJCSgweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzNdLmN3Lm1pbik7CisJCXBEb3QxMWYtPmFjdm9fYWN3bWF4ID0KKwkJCSgweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzNdLmN3Lm1heCk7CisJCXBEb3QxMWYtPmFjdm9fdHhvcGxpbWl0ID0KKwkJCXBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbM10udHhvcGxpbWl0OworCisJCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCX0KKworfSAvKiBFbmQgUG9wbHVhdGVEb3QxMWZFRENBUGFyYW1TZXQuICovCisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9lcnBfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJIHREb3QxMWZJRUVSUEluZm8gKnBEb3QxMWYsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdFNpclJldFN0YXR1cyBuU2lyU3RhdHVzOworCXVpbnQzMl90IHZhbDsKKwl0U2lyUkZCYW5kIHJmQmFuZCA9IFNJUl9CQU5EX1VOS05PV047CisKKwlsaW1fZ2V0X3JmX2JhbmRfbmV3KHBNYWMsICZyZkJhbmQsIHBzZXNzaW9uRW50cnkpOworCWlmIChTSVJfQkFORF8yXzRfR0haID09IHJmQmFuZCkgeworCQlwRG90MTFmLT5wcmVzZW50ID0gMTsKKworCQl2YWwgPSBwc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLmZyb21sbGI7CisJCWlmICghdmFsKSB7CisJCQlkb3QxMWZfbG9nKHBNYWMsIExPR0UsCisJCQkJICAgRkwKKwkJCQkJICAgKCIxMUIgcHJvdGVjdGlvbiBub3QgZW5hYmxlZC4gTm90IHBvcHVsYXRpbmcgRVJQIElFICVkXG4iKSwKKwkJCQkgICB2YWwpOworCQkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKwkJfQorCisJCWlmIChwc2Vzc2lvbkVudHJ5LT5nTGltMTFiUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSB7CisJCQlwRG90MTFmLT5ub25fZXJwX3ByZXNlbnQgPSAxOworCQkJcERvdDExZi0+dXNlX3Byb3QgPSAxOworCQl9CisKKwkJaWYgKHBzZXNzaW9uRW50cnktPmdMaW1PbGJjUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSB7CisJCQkvKiBGSVhNRV9QUk9URUNUSU9OOiB3ZSBzaG91bGQgYmUgc2V0dGluZyBub25fZXJwIHByZXNlbnQgYWxzby4gKi8KKwkJCS8qIGNoZWNrIHRoZSB0ZXN0IHBsYW4gZmlyc3QuICovCisJCQlwRG90MTFmLT51c2VfcHJvdCA9IDE7CisJCX0KKworCQlpZiAoKHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLm51bU5vblNob3J0UHJlYW1ibGVTdGEpCisJCSAgICB8fCAhcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZTaG9ydFByZWFtYmxlKSB7CisJCQlwRG90MTFmLT5iYXJrZXJfcHJlYW1ibGUgPSAxOworCisJCX0KKwkJLyogaWYgcHJvdGVjdGlvbiBhbHdheXMgZmxhZyBpcyBzZXQsIGFkdmVydGlzZSBwcm90ZWN0aW9uIGVuYWJsZWQgKi8KKwkJLyogcmVnYXJkbGVzcyBvZiBsZWdhY3kgc3RhdGlvbnMgcHJlc2VuY2UgKi8KKwkJQ0ZHX0dFVF9JTlQoblNpclN0YXR1cywgcE1hYywgV05JX0NGR18xMUdfUFJPVEVDVElPTl9BTFdBWVMsCisJCQkgICAgdmFsKTsKKworCQlpZiAodmFsKSB7CisJCQlwRG90MTFmLT51c2VfcHJvdCA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKiBFbmQgcG9wdWxhdGVfZG90MTFmX2VycF9pbmZvLiAqLworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfZXh0X3N1cHBfcmF0ZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBuQ2hhbm5lbE51bSwKKwkJCSAgICAgICB0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKnBEb3QxMWYsCisJCQkgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisJdWludDMyX3QgblJhdGVzID0gMDsKKwl1aW50OF90IHJhdGVzW1dOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOXTsKKworCS8qIFVzZSB0aGUgZXh0IHJhdGVzIHByZXNlbnQgaW4gc2Vzc2lvbiBlbnRyeSB3aGVuZXZlciBuQ2hhbm5lbE51bSBpcyBzZXQgdG8gT1BFUkFUSU9OQUwKKwkgICBlbHNlIHVzZSB0aGUgZXh0IHN1cHBvcnRlZCByYXRlIHNldCBmcm9tIENGRywgd2hpY2ggaXMgZml4ZWQgYW5kIGRvZXMgbm90IGNoYW5nZSBkeW5hbWljYWxseSBhbmQgaXMgdXNlZCBmb3IKKwkgICBzZW5kaW5nIG1nbXQgZnJhbWVzIChsaWxlIHByb2JlIHJlcSkgd2hpY2ggbmVlZCB0byBnbyBvdXQgYmVmb3JlIGFueSBzZXNzaW9uIGlzIHByZXNlbnQuCisJICovCisJaWYgKFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCA9PSBuQ2hhbm5lbE51bSkgeworCQlpZiAocHNlc3Npb25FbnRyeSAhPSBOVUxMKSB7CisJCQluUmF0ZXMgPSBwc2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0Lm51bVJhdGVzOworCQkJY2RmX21lbV9jb3B5KHJhdGVzLCBwc2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0LnJhdGUsCisJCQkJICAgICBuUmF0ZXMpOworCQl9IGVsc2UgeworCQkJZG90MTFmX2xvZyhwTWFjLCBMT0dFLAorCQkJCSAgIEZMKCJubyBzZXNzaW9uIGNvbnRleHQgZXhpc3RzIHdoaWxlIgorCQkJCSAgICAgICIgcG9wdWxhdGluZyBPcGVyYXRpb25hbCBSYXRlIFNldFxuIikpOworCQl9CisJfSBlbHNlIGlmIChISUdIRVNUXzI0R0haX0NIQU5ORUxfTlVNID49IG5DaGFubmVsTnVtKSB7CisJCUNGR19HRVRfU1RSKG5TaXJTdGF0dXMsIHBNYWMsCisJCQkgICAgV05JX0NGR19FWFRFTkRFRF9PUEVSQVRJT05BTF9SQVRFX1NFVCwgcmF0ZXMsCisJCQkgICAgblJhdGVzLCBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VUX0xFTik7CisJfQorCisJaWYgKDAgIT0gblJhdGVzKSB7CisJCXBEb3QxMWYtPm51bV9yYXRlcyA9ICh1aW50OF90KSBuUmF0ZXM7CisJCWNkZl9tZW1fY29weShwRG90MTFmLT5yYXRlcywgcmF0ZXMsIG5SYXRlcyk7CisJCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl9leHRfc3VwcF9yYXRlcy4gKi8KKwordFNpclJldFN0YXR1cworcG9wdWxhdGVfZG90MTFmX2V4dF9zdXBwX3JhdGVzMSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXVpbnQ4X3QgbkNoYW5uZWxOdW0sCisJCQkJdERvdDExZklFRXh0U3VwcFJhdGVzICpwRG90MTFmKQoreworCXVpbnQzMl90IG5SYXRlczsKKwl0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisJdWludDhfdCByYXRlc1tTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVNdOworCisJaWYgKDE0IDwgbkNoYW5uZWxOdW0pIHsKKwkJcERvdDExZi0+cHJlc2VudCA9IDA7CisJCXJldHVybiBlU0lSX1NVQ0NFU1M7CisJfQorCS8qIE4uQi4gSSBoYXZlICpubyogaWRlYSB3aHkgd2UncmUgY2FsbGluZyAnd2xhbl9jZmdfZ2V0X3N0cicgd2l0aCBhbiBhcmd1bWVudCAqLworCS8qIG9mIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQSBoZXJlLCBidXQgdGhhdCdzIHdoYXQgd2FzIGRvbmUgKi8KKwkvKiBwcmV2aW91c2x5ICYgSSdtIGFmcmFpZCB0byBjaGFuZ2UgaXQhICovCisJQ0ZHX0dFVF9TVFIoblNpclN0YXR1cywgcE1hYywgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBLAorCQkgICAgcmF0ZXMsIG5SYXRlcywgU0lSX01BQ19NQVhfTlVNQkVSX09GX1JBVEVTKTsKKworCWlmICgwICE9IG5SYXRlcykgeworCQlwRG90MTFmLT5udW1fcmF0ZXMgPSAodWludDhfdCkgblJhdGVzOworCQljZGZfbWVtX2NvcHkocERvdDExZi0+cmF0ZXMsIHJhdGVzLCBuUmF0ZXMpOworCQlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKiBwb3B1bGF0ZV9kb3QxMWZfZXh0X3N1cHBfcmF0ZXMxLiAqLworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfaHRfY2Fwcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwgdERvdDExZklFSFRDYXBzICpwRG90MTFmKQoreworCXVpbnQzMl90IG5DZmdWYWx1ZSwgbkNmZ0xlbjsKKwl1aW50OF90IG5DZmdWYWx1ZTg7CisJdFNpclJldFN0YXR1cyBuU2lyU3RhdHVzOworCXRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvICpwSFRQYXJhbWV0ZXJzSW5mbzsKKwl1bmlvbiB7CisJCXVpbnQxNl90IG5DZmdWYWx1ZTE2OworCQl0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyBodENhcEluZm87CisJCXRTaXJNYWNFeHRlbmRlZEhUQ2FwYWJpbGl0eUluZm8gZXh0SHRDYXBJbmZvOworCX0gdUhUQ2FwYWJpbGl0eUluZm87CisKKwl0U2lyTWFjVHhCRkNhcGFiaWxpdHlJbmZvICpwVHhCRkNhcGFiaWxpdHlJbmZvOworCXRTaXJNYWNBU0NhcGFiaWxpdHlJbmZvICpwQVNDYXBhYmlsaXR5SW5mbzsKKworCUNGR19HRVRfSU5UKG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sIG5DZmdWYWx1ZSk7CisKKwl1SFRDYXBhYmlsaXR5SW5mby5uQ2ZnVmFsdWUxNiA9IG5DZmdWYWx1ZSAmIDB4RkZGRjsKKworCXBEb3QxMWYtPm1pbW9Qb3dlclNhdmUgPSB1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8ubWltb1Bvd2VyU2F2ZTsKKwlwRG90MTFmLT5ncmVlbkZpZWxkID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLmdyZWVuRmllbGQ7CisJcERvdDExZi0+ZGVsYXllZEJBID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLmRlbGF5ZWRCQTsKKwlwRG90MTFmLT5tYXhpbWFsQU1TRFVzaXplID0KKwkJdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLm1heGltYWxBTVNEVXNpemU7CisJcERvdDExZi0+ZHNzc0Nja01vZGU0ME1IeiA9CisJCXVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby5kc3NzQ2NrTW9kZTQwTUh6OworCXBEb3QxMWYtPnBzbXAgPSB1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8ucHNtcDsKKwlwRG90MTFmLT5zdGJjQ29udHJvbEZyYW1lID0KKwkJdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnN0YmNDb250cm9sRnJhbWU7CisJcERvdDExZi0+bHNpZ1RYT1BQcm90ZWN0aW9uID0KKwkJdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLmxzaWdUWE9QUHJvdGVjdGlvbjsKKworCS8qIEFsbCBzZXNzaW9uaXplZCBlbnRyaWVzIHdpbGwgbmVlZCB0aGUgY2hlY2sgYmVsb3cgKi8KKwlpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKSAgICAgIC8qIE9ubHkgaW4gY2FzZSBvZiBOTyBzZXNzaW9uICovCisJeworCQlwRG90MTFmLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKwkJcERvdDExZi0+YWR2Q29kaW5nQ2FwID0KKwkJCXVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby5hZHZDb2RpbmdDYXA7CisJCXBEb3QxMWYtPnR4U1RCQyA9IHVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby50eFNUQkM7CisJCXBEb3QxMWYtPnJ4U1RCQyA9IHVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby5yeFNUQkM7CisJCXBEb3QxMWYtPnNob3J0R0kyME1IeiA9CisJCQl1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8uc2hvcnRHSTIwTUh6OworCQlwRG90MTFmLT5zaG9ydEdJNDBNSHogPQorCQkJdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnNob3J0R0k0ME1IejsKKwl9IGVsc2UgeworCQlwRG90MTFmLT5hZHZDb2RpbmdDYXAgPSBwc2Vzc2lvbkVudHJ5LT5odENvbmZpZy5odF9yeF9sZHBjOworCQlwRG90MTFmLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPQorCQkJcHNlc3Npb25FbnRyeS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJCXBEb3QxMWYtPnR4U1RCQyA9IHBzZXNzaW9uRW50cnktPmh0Q29uZmlnLmh0X3R4X3N0YmM7CisJCXBEb3QxMWYtPnJ4U1RCQyA9IHBzZXNzaW9uRW50cnktPmh0Q29uZmlnLmh0X3J4X3N0YmM7CisJCWlmIChwc2Vzc2lvbkVudHJ5LT5odENvbmZpZy5odF9zZ2kpIHsKKwkJCXBEb3QxMWYtPnNob3J0R0kyME1IeiA9CisJCQkJdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnNob3J0R0kyME1IejsKKwkJCXBEb3QxMWYtPnNob3J0R0k0ME1IeiA9CisJCQkJdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnNob3J0R0k0ME1IejsKKwkJfQorCX0KKworCS8qIEVuc3VyZSB0aGF0IHNob3J0R0k0ME1IeiBpcyBEaXNhYmxlZCBpZiBzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgaXMKKwkgICBlSFRfQ0hBTk5FTF9XSURUSF8yME1IWiAqLworCWlmIChwRG90MTFmLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPT0gZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFopIHsKKwkJcERvdDExZi0+c2hvcnRHSTQwTUh6ID0gMDsKKwl9CisKKwlkb3QxMWZfbG9nKHBNYWMsIExPRzIsCisJCSAgIEZMCisJCQkgICAoIlN1cHBvcnRlZENobmxXaWR0aDogJWQsIG1pbW9QUzogJWQsIEdGOiAlZCwgc2hvcnRHSTIwOiVkLCBzaG9ydEdJNDA6ICVkLCBkc3NzQ2NrOiAlZFxuIiksCisJCSAgIHBEb3QxMWYtPnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCwgcERvdDExZi0+bWltb1Bvd2VyU2F2ZSwKKwkJICAgcERvdDExZi0+Z3JlZW5GaWVsZCwgcERvdDExZi0+c2hvcnRHSTIwTUh6LAorCQkgICBwRG90MTFmLT5zaG9ydEdJNDBNSHosIHBEb3QxMWYtPmRzc3NDY2tNb2RlNDBNSHopOworCisJQ0ZHX0dFVF9JTlQoblNpclN0YXR1cywgcE1hYywgV05JX0NGR19IVF9BTVBEVV9QQVJBTVMsIG5DZmdWYWx1ZSk7CisKKwluQ2ZnVmFsdWU4ID0gKHVpbnQ4X3QpIG5DZmdWYWx1ZTsKKwlwSFRQYXJhbWV0ZXJzSW5mbyA9ICh0U2lyTWFjSFRQYXJhbWV0ZXJzSW5mbyAqKSAmbkNmZ1ZhbHVlODsKKworCXBEb3QxMWYtPm1heFJ4QU1QRFVGYWN0b3IgPSBwSFRQYXJhbWV0ZXJzSW5mby0+bWF4UnhBTVBEVUZhY3RvcjsKKwlwRG90MTFmLT5tcGR1RGVuc2l0eSA9IHBIVFBhcmFtZXRlcnNJbmZvLT5tcGR1RGVuc2l0eTsKKwlwRG90MTFmLT5yZXNlcnZlZDEgPSBwSFRQYXJhbWV0ZXJzSW5mby0+cmVzZXJ2ZWQ7CisKKwlkb3QxMWZfbG9nKHBNYWMsIExPRzIsIEZMKCJBTVBEVSBQYXJhbTogJXhcbiIpLCBuQ2ZnVmFsdWUpOworCisJQ0ZHX0dFVF9TVFIoblNpclN0YXR1cywgcE1hYywgV05JX0NGR19TVVBQT1JURURfTUNTX1NFVCwKKwkJICAgIHBEb3QxMWYtPnN1cHBvcnRlZE1DU1NldCwgbkNmZ0xlbiwKKwkJICAgIFNJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVQpOworCisJaWYgKHBzZXNzaW9uRW50cnkpIHsKKwkJaWYgKHBNYWMtPmx0ZUNvZXhBbnRTaGFyZQorCQkgICAgJiYgKElTXzI0R19DSChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKSkgeworCQkJaWYgKCEoSVNfMlgyX0NIQUlOKHBzZXNzaW9uRW50cnktPmNoYWluTWFzaykpKSB7CisJCQkJcERvdDExZi0+c3VwcG9ydGVkTUNTU2V0WzFdID0gMDsKKwkJCQlpZiAoTElNX0lTX1NUQV9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQkJCXBEb3QxMWYtPm1pbW9Qb3dlclNhdmUgPQorCQkJCQkJcHNlc3Npb25FbnRyeS0+c21wc01vZGU7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChwc2Vzc2lvbkVudHJ5LT5uc3MgPT0gMSkKKwkJCXBEb3QxMWYtPnN1cHBvcnRlZE1DU1NldFsxXSA9IDA7CisJfQorCisJQ0ZHX0dFVF9JTlQoblNpclN0YXR1cywgcE1hYywgV05JX0NGR19FWFRfSFRfQ0FQX0lORk8sIG5DZmdWYWx1ZSk7CisKKwl1SFRDYXBhYmlsaXR5SW5mby5uQ2ZnVmFsdWUxNiA9IG5DZmdWYWx1ZSAmIDB4RkZGRjsKKworCXBEb3QxMWYtPnBjbyA9IHVIVENhcGFiaWxpdHlJbmZvLmV4dEh0Q2FwSW5mby5wY287CisJcERvdDExZi0+dHJhbnNpdGlvblRpbWUgPSB1SFRDYXBhYmlsaXR5SW5mby5leHRIdENhcEluZm8udHJhbnNpdGlvblRpbWU7CisJcERvdDExZi0+bWNzRmVlZGJhY2sgPSB1SFRDYXBhYmlsaXR5SW5mby5leHRIdENhcEluZm8ubWNzRmVlZGJhY2s7CisKKwlDRkdfR0VUX0lOVChuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1RYX0JGX0NBUCwgbkNmZ1ZhbHVlKTsKKworCXBUeEJGQ2FwYWJpbGl0eUluZm8gPSAodFNpck1hY1R4QkZDYXBhYmlsaXR5SW5mbyAqKSAmbkNmZ1ZhbHVlOworCXBEb3QxMWYtPnR4QkYgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT50eEJGOworCXBEb3QxMWYtPnJ4U3RhZ2dlcmVkU291bmRpbmcgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT5yeFN0YWdnZXJlZFNvdW5kaW5nOworCXBEb3QxMWYtPnR4U3RhZ2dlcmVkU291bmRpbmcgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT50eFN0YWdnZXJlZFNvdW5kaW5nOworCXBEb3QxMWYtPnJ4WkxGID0gcFR4QkZDYXBhYmlsaXR5SW5mby0+cnhaTEY7CisJcERvdDExZi0+dHhaTEYgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT50eFpMRjsKKwlwRG90MTFmLT5pbXBsaWNpdFR4QkYgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT5pbXBsaWNpdFR4QkY7CisJcERvdDExZi0+Y2FsaWJyYXRpb24gPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT5jYWxpYnJhdGlvbjsKKwlwRG90MTFmLT5leHBsaWNpdENTSVR4QkYgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT5leHBsaWNpdENTSVR4QkY7CisJcERvdDExZi0+ZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCA9CisJCXBUeEJGQ2FwYWJpbGl0eUluZm8tPmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXg7CisJcERvdDExZi0+ZXhwbGljaXRCRkNTSUZlZWRiYWNrID0KKwkJcFR4QkZDYXBhYmlsaXR5SW5mby0+ZXhwbGljaXRCRkNTSUZlZWRiYWNrOworCXBEb3QxMWYtPmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayA9CisJCXBUeEJGQ2FwYWJpbGl0eUluZm8tPmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjazsKKwlwRG90MTFmLT5leHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrID0KKwkJcFR4QkZDYXBhYmlsaXR5SW5mby0+ZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjazsKKwlwRG90MTFmLT5jc2lOdW1CRkFudGVubmFlID0gcFR4QkZDYXBhYmlsaXR5SW5mby0+Y3NpTnVtQkZBbnRlbm5hZTsKKwlwRG90MTFmLT51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgPQorCQlwVHhCRkNhcGFiaWxpdHlJbmZvLT51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU7CisJcERvdDExZi0+Y29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSA9CisJCXBUeEJGQ2FwYWJpbGl0eUluZm8tPmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU7CisKKwlDRkdfR0VUX0lOVChuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0FTX0NBUCwgbkNmZ1ZhbHVlKTsKKworCW5DZmdWYWx1ZTggPSAodWludDhfdCkgbkNmZ1ZhbHVlOworCisJcEFTQ2FwYWJpbGl0eUluZm8gPSAodFNpck1hY0FTQ2FwYWJpbGl0eUluZm8gKikgJm5DZmdWYWx1ZTg7CisJcERvdDExZi0+YW50ZW5uYVNlbGVjdGlvbiA9IHBBU0NhcGFiaWxpdHlJbmZvLT5hbnRlbm5hU2VsZWN0aW9uOworCXBEb3QxMWYtPmV4cGxpY2l0Q1NJRmVlZGJhY2tUeCA9CisJCXBBU0NhcGFiaWxpdHlJbmZvLT5leHBsaWNpdENTSUZlZWRiYWNrVHg7CisJcERvdDExZi0+YW50ZW5uYUluZGljZXNGZWVkYmFja1R4ID0KKwkJcEFTQ2FwYWJpbGl0eUluZm8tPmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeDsKKwlwRG90MTFmLT5leHBsaWNpdENTSUZlZWRiYWNrID0gcEFTQ2FwYWJpbGl0eUluZm8tPmV4cGxpY2l0Q1NJRmVlZGJhY2s7CisJcERvdDExZi0+YW50ZW5uYUluZGljZXNGZWVkYmFjayA9CisJCXBBU0NhcGFiaWxpdHlJbmZvLT5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrOworCXBEb3QxMWYtPnJ4QVMgPSBwQVNDYXBhYmlsaXR5SW5mby0+cnhBUzsKKwlwRG90MTFmLT50eFNvdW5kaW5nUFBEVXMgPSBwQVNDYXBhYmlsaXR5SW5mby0+dHhTb3VuZGluZ1BQRFVzOworCisJcERvdDExZi0+cHJlc2VudCA9IDE7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qIEVuZCBwb3B1bGF0ZV9kb3QxMWZfaHRfY2Fwcy4gKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisKK3ZvaWQgbGltX2xvZ192aHRfY2FwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRVZIVENhcHMgKnBEb3QxMWYpCit7CisjaWZkZWYgRFVNUF9NR01UX0NOVE5UUworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIm1heE1QRFVMZW4gKDIpOiAlZFxuIiksIHBEb3QxMWYtPm1heE1QRFVMZW4pOworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoInN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCAoMik6ICVkXG4iKSwKKwkJcERvdDExZi0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJsZHBjQ29kaW5nQ2FwICgxKTogJWRcbiIpLAorCQlwRG90MTFmLT5sZHBjQ29kaW5nQ2FwKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJzaG9ydEdJODBNSHogKDEpOiAlZFxuIiksIHBEb3QxMWYtPnNob3J0R0k4ME1Ieik7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgic2hvcnRHSTE2MGFuZDgwcGx1czgwTUh6ICgxKTogJWRcbiIpLAorCQlwRG90MTFmLT5zaG9ydEdJMTYwYW5kODBwbHVzODBNSHopOworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoInR4U1RCQyAoMSk6ICVkXG4iKSwgcERvdDExZi0+dHhTVEJDKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJyeFNUQkMgKDMpOiAlZFxuIiksIHBEb3QxMWYtPnJ4U1RCQyk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgic3VCZWFtRm9ybWVyQ2FwICgxKTogJWRcbiIpLAorCQlwRG90MTFmLT5zdUJlYW1Gb3JtZXJDYXApOworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoInN1QmVhbWZvcm1lZUNhcCAoMSk6ICVkXG4iKSwKKwkJcERvdDExZi0+c3VCZWFtZm9ybWVlQ2FwKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJjc25vZkJlYW1mb3JtZXJBbnRTdXAgKDMpOiAlZFxuIiksCisJCXBEb3QxMWYtPmNzbm9mQmVhbWZvcm1lckFudFN1cCk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgibnVtU291bmRpbmdEaW0gKDMpOiAlZFxuIiksCisJCXBEb3QxMWYtPm51bVNvdW5kaW5nRGltKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJtdUJlYW1mb3JtZXJDYXAgKDEpOiAlZFxuIiksCisJCXBEb3QxMWYtPm11QmVhbWZvcm1lckNhcCk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgibXVCZWFtZm9ybWVlQ2FwICgxKTogJWRcbiIpLAorCQlwRG90MTFmLT5tdUJlYW1mb3JtZWVDYXApOworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoInZodFRYT1BQUyAoMSk6ICVkXG4iKSwgcERvdDExZi0+dmh0VFhPUFBTKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJodGNWSFRDYXAgKDEpOiAlZFxuIiksIHBEb3QxMWYtPmh0Y1ZIVENhcCk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgibWF4QU1QRFVMZW5FeHAgKDMpOiAlZFxuIiksCisJCXBEb3QxMWYtPm1heEFNUERVTGVuRXhwKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJ2aHRMaW5rQWRhcHRDYXAgKDIpOiAlZFxuIiksCisJCXBEb3QxMWYtPnZodExpbmtBZGFwdENhcCk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgicnhBbnRQYXR0ZXJuICgxKTogJWRcbiIpLAorCQlwRG90MTFmLT52aHRMaW5rQWRhcHRDYXApOworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoInR4QW50UGF0dGVybiAoMSk6ICVkXG4iKSwKKwkJcERvdDExZi0+dmh0TGlua0FkYXB0Q2FwKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJyZXNlcnZlZDEgKDIpOiAlZFxuIiksIHBEb3QxMWYtPnJlc2VydmVkMSk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgicnhNQ1NNYXAgKDE2KTogJWRcbiIpLCBwRG90MTFmLT5yeE1DU01hcCk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgicnhIaWdoU3VwRGF0YVJhdGUgKDEzKTogJWRcbiIpLAorCQlwRG90MTFmLT5yeEhpZ2hTdXBEYXRhUmF0ZSk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgicmVzZXJ2ZSAoMyk6ICVkXG4iKSwgcERvdDExZi0+cmVzZXJ2ZWQyKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJ0eE1DU01hcCAoMTYpOiAlZFxuIiksIHBEb3QxMWYtPnR4TUNTTWFwKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJ0eFN1cERhdGFSYXRlICgxMyk6ICVkXG4iKSwKKwkJcERvdDExZi0+dHhTdXBEYXRhUmF0ZSk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgicmVzZXJ2ICgzKTogJWRcbiIpLCBwRG90MTFmLT5yZXNlcnZlZDMpOworI2VuZGlmIC8qIERVTVBfTUdNVF9DTlROVFMgKi8KK30KKwordm9pZCBsaW1fbG9nX3ZodF9vcGVyYXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdERvdDExZklFVkhUT3BlcmF0aW9uICpwRG90MTFmKQoreworI2lmZGVmIERVTVBfTUdNVF9DTlROVFMKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJjaGFuV2lkdGggOiAlZFxuIiksIHBEb3QxMWYtPmNoYW5XaWR0aCk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiY2hhbkNlbnRlckZyZXFTZWcxOiAlZFxuIiksCisJCXBEb3QxMWYtPmNoYW5DZW50ZXJGcmVxU2VnMSk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiY2hhbkNlbnRlckZyZXFTZWcyOiAlZFxuIiksCisJCXBEb3QxMWYtPmNoYW5DZW50ZXJGcmVxU2VnMik7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiYmFzaWNNQ1NTZXQ6ICVkXG4iKSwgcERvdDExZi0+YmFzaWNNQ1NTZXQpOworI2VuZGlmIC8qIERVTVBfTUdNVF9DTlROVFMgKi8KK30KKwordm9pZCBsaW1fbG9nX3ZodF9leHRfYnNzX2xvYWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdERvdDExZklFVkhURXh0QnNzTG9hZCAqcERvdDExZikKK3sKKyNpZmRlZiBEVU1QX01HTVRfQ05UTlRTCisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgibXVNSU1PQ2FwU3RhQ291bnQgOiAlZFxuIiksCisJCXBEb3QxMWYtPm11TUlNT0NhcFN0YUNvdW50KTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJzc1VuZGVyVXRpbDogJWRcbiIpLCBwRG90MTFmLT5zc1VuZGVyVXRpbCk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiRm9ydHlNSHpVdGlsOiAlZFxuIiksIHBEb3QxMWYtPkZvcnR5TUh6VXRpbCk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiRWlnaHR5TUh6VXRpbDogJWRcbiIpLCBwRG90MTFmLT5FaWdodHlNSHpVdGlsKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJPbmVTaXh0eU1IelV0aWw6ICVkXG4iKSwKKwkJcERvdDExZi0+T25lU2l4dHlNSHpVdGlsKTsKKyNlbmRpZiAvKiBEVU1QX01HTVRfQ05UTlRTICovCit9CisKK3ZvaWQgbGltX2xvZ19vcGVyYXRpbmdfbW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVPcGVyYXRpbmdNb2RlICpwRG90MTFmKQoreworI2lmZGVmIERVTVBfTUdNVF9DTlROVFMKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJDaGFuV2lkdGggOiAlZFxuIiksIHBEb3QxMWYtPmNoYW5XaWR0aCk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgicmVzZXJ2ZWQ6ICVkXG4iKSwgcERvdDExZi0+cmVzZXJ2ZWQpOworCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoInJ4TlNTOiAlZFxuIiksIHBEb3QxMWYtPnJ4TlNTKTsKKwlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJyeE5TUyBUeXBlOiAlZFxuIiksIHBEb3QxMWYtPnJ4TlNTVHlwZSk7CisjZW5kaWYgLyogRFVNUF9NR01UX0NOVE5UUyAqLworfQorCit2b2lkIGxpbV9sb2dfcW9zX21hcF9zZXQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclFvc01hcFNldCAqcFFvc01hcFNldCkKK3sKKwl1aW50OF90IGk7CisJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgibnVtIG9mIGRzY3AgZXhjZXB0aW9ucyA6ICVkIiksCisJCXBRb3NNYXBTZXQtPm51bV9kc2NwX2V4Y2VwdGlvbnMpOworCWZvciAoaSA9IDA7IGkgPCBwUW9zTWFwU2V0LT5udW1fZHNjcF9leGNlcHRpb25zOyBpKyspIHsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiZHNjcCB2YWx1ZTogJWQiKSwKKwkJCXBRb3NNYXBTZXQtPmRzY3BfZXhjZXB0aW9uc1tpXVswXSk7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlVzZXIgcHJpb3JpdHkgdmFsdWU6ICVkIiksCisJCQlwUW9zTWFwU2V0LT5kc2NwX2V4Y2VwdGlvbnNbaV1bMV0pOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoImRzY3AgbG93IGZvciB1cCAlZDogJWQiKSwgaSwKKwkJCXBRb3NNYXBTZXQtPmRzY3BfcmFuZ2VbaV1bMF0pOworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJkc2NwIGhpZ2ggZm9yIHVwICVkOiAlZCIpLCBpLAorCQkJcFFvc01hcFNldC0+ZHNjcF9yYW5nZVtpXVsxXSk7CisJfQorfQorCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfdmh0X2NhcHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LCB0RG90MTFmSUVWSFRDYXBzICpwRG90MTFmKQoreworCXRTaXJSZXRTdGF0dXMgblN0YXR1czsKKwl1aW50MzJfdCBuQ2ZnVmFsdWUgPSAwOworCisJcERvdDExZi0+cHJlc2VudCA9IDE7CisKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9NQVhfTVBEVV9MRU5HVEgsIG5DZmdWYWx1ZSk7CisJcERvdDExZi0+bWF4TVBEVUxlbiA9IChuQ2ZnVmFsdWUgJiAweDAwMDMpOworCisJbkNmZ1ZhbHVlID0gMDsKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9TVVBQT1JURURfQ0hBTl9XSURUSF9TRVQsCisJCSAgICBuQ2ZnVmFsdWUpOworCXBEb3QxMWYtPnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9IChuQ2ZnVmFsdWUgJiAweDAwMDMpOworCisJbkNmZ1ZhbHVlID0gMDsKKwkvKiBXaXRoIFZIVCBpdCBzdWZmaWNlcyBpZiB3ZSBqdXN0IGV4YW1pbmUgSFQgKi8KKwlpZiAocHNlc3Npb25FbnRyeSkgeworCQlpZiAocHNlc3Npb25FbnRyeS0+aHRDb25maWcuaHRfcnhfbGRwYykKKwkJCUNGR19HRVRfSU5UKG5TdGF0dXMsIHBNYWMsIFdOSV9DRkdfVkhUX0xEUENfQ09ESU5HX0NBUCwKKwkJCQkgICAgbkNmZ1ZhbHVlKTsKKworCQlwRG90MTFmLT5sZHBjQ29kaW5nQ2FwID0gKG5DZmdWYWx1ZSAmIDB4MDAwMSk7CisKKwkJbkNmZ1ZhbHVlID0gMDsKKwkJaWYgKHBzZXNzaW9uRW50cnktPmh0Q29uZmlnLmh0X3NnaSkKKwkJCUNGR19HRVRfSU5UKG5TdGF0dXMsIHBNYWMsIFdOSV9DRkdfVkhUX1NIT1JUX0dJXzgwTUhaLAorCQkJCSAgICBuQ2ZnVmFsdWUpOworCisJCXBEb3QxMWYtPnNob3J0R0k4ME1IeiA9IChuQ2ZnVmFsdWUgJiAweDAwMDEpOworCisJCW5DZmdWYWx1ZSA9IDA7CisJCWlmIChwc2Vzc2lvbkVudHJ5LT5odENvbmZpZy5odF9zZ2kpCisJCQlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLAorCQkJCSAgICBXTklfQ0ZHX1ZIVF9TSE9SVF9HSV8xNjBfQU5EXzgwX1BMVVNfODBNSFosCisJCQkJICAgIG5DZmdWYWx1ZSk7CisKKwkJcERvdDExZi0+c2hvcnRHSTE2MGFuZDgwcGx1czgwTUh6ID0gKG5DZmdWYWx1ZSAmIDB4MDAwMSk7CisKKwkJbkNmZ1ZhbHVlID0gMDsKKwkJaWYgKHBzZXNzaW9uRW50cnktPmh0Q29uZmlnLmh0X3R4X3N0YmMpCisJCQlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9UWFNUQkMsCisJCQkJICAgIG5DZmdWYWx1ZSk7CisKKwkJcERvdDExZi0+dHhTVEJDID0gKG5DZmdWYWx1ZSAmIDB4MDAwMSk7CisKKwkJbkNmZ1ZhbHVlID0gMDsKKwkJaWYgKHBzZXNzaW9uRW50cnktPmh0Q29uZmlnLmh0X3J4X3N0YmMpCisJCQlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9SWFNUQkMsCisJCQkJICAgIG5DZmdWYWx1ZSk7CisKKwkJcERvdDExZi0+cnhTVEJDID0gKG5DZmdWYWx1ZSAmIDB4MDAwNyk7CisKKwkJcERvdDExZi0+c3VCZWFtZm9ybWVlQ2FwID0gcHNlc3Npb25FbnRyeS0+dHhCRkluaUZlYXR1cmVFbmFibGVkOworCQlpZiAocHNlc3Npb25FbnRyeS0+dHhCRkluaUZlYXR1cmVFbmFibGVkKSB7CisJCQluQ2ZnVmFsdWUgPSAwOworCQkJQ0ZHX0dFVF9JTlQoblN0YXR1cywgcE1hYywKKwkJCQkgICAgV05JX0NGR19WSFRfTVVfQkVBTUZPUk1FRV9DQVAsIG5DZmdWYWx1ZSk7CisJCQlwRG90MTFmLT5tdUJlYW1mb3JtZWVDYXAgPSAobkNmZ1ZhbHVlICYgMHgwMDAxKTsKKwkJfSBlbHNlIHsKKwkJCXBEb3QxMWYtPm11QmVhbWZvcm1lZUNhcCA9IDA7CisJCX0KKwkJcERvdDExZi0+c3VCZWFtRm9ybWVyQ2FwID0gcHNlc3Npb25FbnRyeS0+ZW5hYmxlX3N1X3R4X2Jmb3JtZXI7CisJfSBlbHNlIHsKKwkJQ0ZHX0dFVF9JTlQoblN0YXR1cywgcE1hYywgV05JX0NGR19WSFRfTERQQ19DT0RJTkdfQ0FQLAorCQkJICAgIG5DZmdWYWx1ZSk7CisJCXBEb3QxMWYtPmxkcGNDb2RpbmdDYXAgPSAobkNmZ1ZhbHVlICYgMHgwMDAxKTsKKworCQluQ2ZnVmFsdWUgPSAwOworCQlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9TSE9SVF9HSV84ME1IWiwKKwkJCSAgICBuQ2ZnVmFsdWUpOworCQlwRG90MTFmLT5zaG9ydEdJODBNSHogPSAobkNmZ1ZhbHVlICYgMHgwMDAxKTsKKworCQluQ2ZnVmFsdWUgPSAwOworCQlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLAorCQkJICAgIFdOSV9DRkdfVkhUX1NIT1JUX0dJXzE2MF9BTkRfODBfUExVU184ME1IWiwKKwkJCSAgICBuQ2ZnVmFsdWUpOworCQlwRG90MTFmLT5zaG9ydEdJMTYwYW5kODBwbHVzODBNSHogPSAobkNmZ1ZhbHVlICYgMHgwMDAxKTsKKworCQluQ2ZnVmFsdWUgPSAwOworCQlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9UWFNUQkMsIG5DZmdWYWx1ZSk7CisJCXBEb3QxMWYtPnR4U1RCQyA9IChuQ2ZnVmFsdWUgJiAweDAwMDEpOworCisJCW5DZmdWYWx1ZSA9IDA7CisJCUNGR19HRVRfSU5UKG5TdGF0dXMsIHBNYWMsIFdOSV9DRkdfVkhUX1JYU1RCQywgbkNmZ1ZhbHVlKTsKKwkJcERvdDExZi0+cnhTVEJDID0gKG5DZmdWYWx1ZSAmIDB4MDAwNyk7CisKKwkJcERvdDExZi0+c3VCZWFtZm9ybWVlQ2FwID0gMDsKKwkJcERvdDExZi0+bXVCZWFtZm9ybWVlQ2FwID0gMDsKKworCQluQ2ZnVmFsdWUgPSAwOworCQlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9TVV9CRUFNRk9STUVSX0NBUCwKKwkJCQluQ2ZnVmFsdWUpOworCQlwRG90MTFmLT5zdUJlYW1Gb3JtZXJDYXAgPSAobkNmZ1ZhbHVlICYgMHgwMDAxKTsKKwl9CisJbkNmZ1ZhbHVlID0gMDsKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9DU05fQkVBTUZPUk1FRV9BTlRfU1VQUE9SVEVELAorCQkgICAgbkNmZ1ZhbHVlKTsKKwlwRG90MTFmLT5jc25vZkJlYW1mb3JtZXJBbnRTdXAgPSAobkNmZ1ZhbHVlICYgMHgwMDA3KTsKKworCW5DZmdWYWx1ZSA9IDA7CisJQ0ZHX0dFVF9JTlQoblN0YXR1cywgcE1hYywgV05JX0NGR19WSFRfTlVNX1NPVU5ESU5HX0RJTUVOU0lPTlMsCisJCSAgICBuQ2ZnVmFsdWUpOworCXBEb3QxMWYtPm51bVNvdW5kaW5nRGltID0gKG5DZmdWYWx1ZSAmIDB4MDAwNyk7CisKKwluQ2ZnVmFsdWUgPSAwOworCUNGR19HRVRfSU5UKG5TdGF0dXMsIHBNYWMsIFdOSV9DRkdfVkhUX01VX0JFQU1GT1JNRVJfQ0FQLCBuQ2ZnVmFsdWUpOworCXBEb3QxMWYtPm11QmVhbWZvcm1lckNhcCA9IChuQ2ZnVmFsdWUgJiAweDAwMDEpOworCisJbkNmZ1ZhbHVlID0gMDsKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9UWE9QX1BTLCBuQ2ZnVmFsdWUpOworCXBEb3QxMWYtPnZodFRYT1BQUyA9IChuQ2ZnVmFsdWUgJiAweDAwMDEpOworCisJbkNmZ1ZhbHVlID0gMDsKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9IVENfVkhUQ19DQVAsIG5DZmdWYWx1ZSk7CisJcERvdDExZi0+aHRjVkhUQ2FwID0gKG5DZmdWYWx1ZSAmIDB4MDAwMSk7CisKKwluQ2ZnVmFsdWUgPSAwOworCUNGR19HRVRfSU5UKG5TdGF0dXMsIHBNYWMsIFdOSV9DRkdfVkhUX0FNUERVX0xFTl9FWFBPTkVOVCwgbkNmZ1ZhbHVlKTsKKwlwRG90MTFmLT5tYXhBTVBEVUxlbkV4cCA9IChuQ2ZnVmFsdWUgJiAweDAwMDcpOworCisJbkNmZ1ZhbHVlID0gMDsKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9MSU5LX0FEQVBUQVRJT05fQ0FQLCBuQ2ZnVmFsdWUpOworCXBEb3QxMWYtPnZodExpbmtBZGFwdENhcCA9IChuQ2ZnVmFsdWUgJiAweDAwMDMpOworCisJbkNmZ1ZhbHVlID0gMDsKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9SWF9BTlRfUEFUVEVSTiwgbkNmZ1ZhbHVlKTsKKwlwRG90MTFmLT5yeEFudFBhdHRlcm4gPSBuQ2ZnVmFsdWU7CisKKwluQ2ZnVmFsdWUgPSAwOworCUNGR19HRVRfSU5UKG5TdGF0dXMsIHBNYWMsIFdOSV9DRkdfVkhUX1RYX0FOVF9QQVRURVJOLCBuQ2ZnVmFsdWUpOworCXBEb3QxMWYtPnR4QW50UGF0dGVybiA9IG5DZmdWYWx1ZTsKKworCXBEb3QxMWYtPnJlc2VydmVkMSA9IDA7CisKKwluQ2ZnVmFsdWUgPSAwOworCUNGR19HRVRfSU5UKG5TdGF0dXMsIHBNYWMsIFdOSV9DRkdfVkhUX1JYX01DU19NQVAsIG5DZmdWYWx1ZSk7CisJcERvdDExZi0+cnhNQ1NNYXAgPSAobkNmZ1ZhbHVlICYgMHgwMDAwRkZGRik7CisKKwluQ2ZnVmFsdWUgPSAwOworCUNGR19HRVRfSU5UKG5TdGF0dXMsIHBNYWMsIFdOSV9DRkdfVkhUX1JYX0hJR0hFU1RfU1VQUE9SVEVEX0RBVEFfUkFURSwKKwkJICAgIG5DZmdWYWx1ZSk7CisJcERvdDExZi0+cnhIaWdoU3VwRGF0YVJhdGUgPSAobkNmZ1ZhbHVlICYgMHgwMDAwMUZGRik7CisKKwlwRG90MTFmLT5yZXNlcnZlZDIgPSAwOworCisJbkNmZ1ZhbHVlID0gMDsKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9UWF9NQ1NfTUFQLCBuQ2ZnVmFsdWUpOworCXBEb3QxMWYtPnR4TUNTTWFwID0gKG5DZmdWYWx1ZSAmIDB4MDAwMEZGRkYpOworCWlmIChwc2Vzc2lvbkVudHJ5KSB7CisJCWlmIChwTWFjLT5sdGVDb2V4QW50U2hhcmUKKwkJICAgICYmIChJU18yNEdfQ0gocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkpIHsKKwkJCWlmICghKElTXzJYMl9DSEFJTihwc2Vzc2lvbkVudHJ5LT5jaGFpbk1hc2spKSkgeworCQkJCXBEb3QxMWYtPnR4TUNTTWFwIHw9IERJU0FCTEVfTlNTMl9NQ1M7CisJCQkJcERvdDExZi0+cnhNQ1NNYXAgfD0gRElTQUJMRV9OU1MyX01DUzsKKwkJCX0KKwkJfQorCQlpZiAocHNlc3Npb25FbnRyeS0+bnNzID09IDEpIHsKKwkJCXBEb3QxMWYtPnR4TUNTTWFwIHw9IERJU0FCTEVfTlNTMl9NQ1M7CisJCQlwRG90MTFmLT5yeE1DU01hcCB8PSBESVNBQkxFX05TUzJfTUNTOworCQl9CisJfQorCisJbkNmZ1ZhbHVlID0gMDsKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9UWF9ISUdIRVNUX1NVUFBPUlRFRF9EQVRBX1JBVEUsCisJCSAgICBuQ2ZnVmFsdWUpOworCXBEb3QxMWYtPnR4U3VwRGF0YVJhdGUgPSAobkNmZ1ZhbHVlICYgMHgwMDAwMUZGRik7CisKKwlwRG90MTFmLT5yZXNlcnZlZDMgPSAwOworCisJbGltX2xvZ192aHRfY2FwKHBNYWMsIHBEb3QxMWYpOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfQorCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfdmh0X29wZXJhdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCSAgICAgIHREb3QxMWZJRVZIVE9wZXJhdGlvbiAqcERvdDExZikKK3sKKwl0U2lyUmV0U3RhdHVzIG5TdGF0dXM7CisJdWludDMyX3QgbkNmZ1ZhbHVlID0gMDsKKworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCisJaWYgKHBzZXNzaW9uRW50cnktPmNoX3dpZHRoID4gQ0hfV0lEVEhfNDBNSFopIHsKKwkJcERvdDExZi0+Y2hhbldpZHRoID0gcHNlc3Npb25FbnRyeS0+Y2hfd2lkdGggLSAxOworCQlwRG90MTFmLT5jaGFuQ2VudGVyRnJlcVNlZzEgPQorCQkJcHNlc3Npb25FbnRyeS0+Y2hfY2VudGVyX2ZyZXFfc2VnMDsKKwkJaWYgKHBzZXNzaW9uRW50cnktPmNoX3dpZHRoID09IENIX1dJRFRIXzgwUDgwTUhaKQorCQkJcERvdDExZi0+Y2hhbkNlbnRlckZyZXFTZWcyID0KKwkJCQlwc2Vzc2lvbkVudHJ5LT5jaF9jZW50ZXJfZnJlcV9zZWcxOworCQllbHNlCisJCQlwRG90MTFmLT5jaGFuQ2VudGVyRnJlcVNlZzIgPSAwOworCX0gZWxzZSB7CisJCXBEb3QxMWYtPmNoYW5XaWR0aCA9IDA7CisJCXBEb3QxMWYtPmNoYW5DZW50ZXJGcmVxU2VnMSA9IDA7CisJCXBEb3QxMWYtPmNoYW5DZW50ZXJGcmVxU2VnMiA9IDA7CisJfQorCisJbkNmZ1ZhbHVlID0gMDsKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9CQVNJQ19NQ1NfU0VULCBuQ2ZnVmFsdWUpOworCXBEb3QxMWYtPmJhc2ljTUNTU2V0ID0gKHVpbnQxNl90KSBuQ2ZnVmFsdWU7CisKKwlsaW1fbG9nX3ZodF9vcGVyYXRpb24ocE1hYywgcERvdDExZik7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl92aHRfZXh0X2Jzc19sb2FkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIHREb3QxMWZJRVZIVEV4dEJzc0xvYWQgKnBEb3QxMWYpCit7CisJdFNpclJldFN0YXR1cyBuU3RhdHVzOworCXVpbnQzMl90IG5DZmdWYWx1ZSA9IDA7CisKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKworCUNGR19HRVRfSU5UKG5TdGF0dXMsIHBNYWMsIFdOSV9DRkdfVkhUX01VX01JTU9fQ0FQX1NUQV9DT1VOVCwKKwkJICAgIG5DZmdWYWx1ZSk7CisJcERvdDExZi0+bXVNSU1PQ2FwU3RhQ291bnQgPSAodWludDhfdCkgbkNmZ1ZhbHVlOworCisJbkNmZ1ZhbHVlID0gMDsKKwlDRkdfR0VUX0lOVChuU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1ZIVF9TU19VTkRFUl9VVElMLCBuQ2ZnVmFsdWUpOworCXBEb3QxMWYtPnNzVW5kZXJVdGlsID0gKHVpbnQ4X3QpIG5DZmdWYWx1ZTsKKworCW5DZmdWYWx1ZSA9IDA7CisJQ0ZHX0dFVF9JTlQoblN0YXR1cywgcE1hYywgV05JX0NGR19WSFRfNDBNSFpfVVRJTElaQVRJT04sIG5DZmdWYWx1ZSk7CisJcERvdDExZi0+Rm9ydHlNSHpVdGlsID0gKHVpbnQ4X3QpIG5DZmdWYWx1ZTsKKworCW5DZmdWYWx1ZSA9IDA7CisJQ0ZHX0dFVF9JTlQoblN0YXR1cywgcE1hYywgV05JX0NGR19WSFRfODBNSFpfVVRJTElaQVRJT04sIG5DZmdWYWx1ZSk7CisJcERvdDExZi0+RWlnaHR5TUh6VXRpbCA9ICh1aW50OF90KSBuQ2ZnVmFsdWU7CisKKwluQ2ZnVmFsdWUgPSAwOworCUNGR19HRVRfSU5UKG5TdGF0dXMsIHBNYWMsIFdOSV9DRkdfVkhUXzE2ME1IWl9VVElMSVpBVElPTiwgbkNmZ1ZhbHVlKTsKKwlwRG90MTFmLT5FaWdodHlNSHpVdGlsID0gKHVpbnQ4X3QpIG5DZmdWYWx1ZTsKKworCWxpbV9sb2dfdmh0X2V4dF9ic3NfbG9hZChwTWFjLCBwRG90MTFmKTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9leHRfY2FwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQlib29sIGlzVkhURW5hYmxlZCwgdERvdDExZklFRXh0Q2FwICpwRG90MTFmLAorCQkJdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50MzJfdCB2YWwgPSAwOworCXN0cnVjdCBzX2V4dF9jYXAgKnBfZXh0X2NhcDsKKworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCisJaWYgKCFwc2Vzc2lvbkVudHJ5KSB7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIjExTUMgLSBlbmFibGVkIGZvciBub24tU0FQIGNhc2VzIikpOworCQlwRG90MTFmLT5udW1fYnl0ZXMgPSBET1QxMUZfSUVfRVhUQ0FQX01BWF9MRU47CisJfSBlbHNlIGlmIChwc2Vzc2lvbkVudHJ5LT5zYXBfZG90MTFtYykgeworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCIxMU1DIHN1cHBvcnQgZW5hYmxlZCIpKTsKKwkJcERvdDExZi0+bnVtX2J5dGVzID0gRE9UMTFGX0lFX0VYVENBUF9NQVhfTEVOOworCX0gZWxzZSB7CisJCWlmIChlTElNX0FQX1JPTEUgIT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiMTFNQyBzdXBwb3J0IGVuYWJsZWQiKSk7CisJCQlwRG90MTFmLT5udW1fYnl0ZXMgPSBET1QxMUZfSUVfRVhUQ0FQX01BWF9MRU47CisJCX0gZWxzZSAgeworCQkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiMTFNQyBzdXBwb3J0IGRpc2FibGVkIikpOworCQkJcERvdDExZi0+bnVtX2J5dGVzID0gRE9UMTFGX0lFX0VYVENBUF9NSU5fTEVOOworCQl9CisJfQorCisJcF9leHRfY2FwID0gKHN0cnVjdCBzX2V4dF9jYXAgKilwRG90MTFmLT5ieXRlczsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmIChpc1ZIVEVuYWJsZWQgPT0gdHJ1ZSkKKwkJcF9leHRfY2FwLT5vcGVyX21vZGVfbm90aWZpY2F0aW9uID0gMTsKKyNlbmRpZgorCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19SVFQzX0VOQUJMRSwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgUlRUMyBWYXJpYWJsZSBmcm9tIERBVCBGaWxlIFxuIikpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWlmICh2YWwpIHsgLyogSWYgc2V0IHRvIHRydWUgdGhlbiBzZXQgUlRUdjMgKi8KKwkJaWYgKCFwc2Vzc2lvbkVudHJ5IHx8IExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJcF9leHRfY2FwLT5maW5lX3RpbWVfbWVhc19pbml0aWF0b3IgPQorCQkJCShwTWFjLT5maW5lX3RpbWVfbWVhc19jYXAgJgorCQkJCSBGSU5FX1RJTUVfTUVBU19TVEFfSU5JVElBVE9SKSA/IDEgOiAwOworCQkJcF9leHRfY2FwLT5maW5lX3RpbWVfbWVhc19yZXNwb25kZXIgPQorCQkJCShwTWFjLT5maW5lX3RpbWVfbWVhc19jYXAgJgorCQkJCSBGSU5FX1RJTUVfTUVBU19TVEFfUkVTUE9OREVSKSA/IDEgOiAwOworCQl9IGVsc2UgaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQlwX2V4dF9jYXAtPmZpbmVfdGltZV9tZWFzX2luaXRpYXRvciA9CisJCQkJKHBNYWMtPmZpbmVfdGltZV9tZWFzX2NhcCAmCisJCQkJIEZJTkVfVElNRV9NRUFTX1NBUF9JTklUSUFUT1IpID8gMSA6IDA7CisJCQlwX2V4dF9jYXAtPmZpbmVfdGltZV9tZWFzX3Jlc3BvbmRlciA9CisJCQkJKHBNYWMtPmZpbmVfdGltZV9tZWFzX2NhcCAmCisJCQkJIEZJTkVfVElNRV9NRUFTX1NBUF9SRVNQT05ERVIpID8gMSA6IDA7CisJCX0KKwl9CisjaWZkZWYgUUNBX0hUXzIwNDBfQ09FWAorCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm9ic3NFbmFibGVkKQorCQlwX2V4dF9jYXAtPmJzc19jb2V4aXN0X21nbXRfc3VwcG9ydCA9IDE7CisjZW5kaWYKKwlwX2V4dF9jYXAtPmV4dF9jaGFuX3N3aXRjaCA9IDE7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfb3BlcmF0aW5nX21vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgICB0RG90MTFmSUVPcGVyYXRpbmdNb2RlICpwRG90MTFmLAorCQkJICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJcERvdDExZi0+cHJlc2VudCA9IDE7CisKKwlwRG90MTFmLT5jaGFuV2lkdGggPSBwc2Vzc2lvbkVudHJ5LT5nTGltT3BlcmF0aW5nTW9kZS5jaGFuV2lkdGg7CisJcERvdDExZi0+cnhOU1MgPSBwc2Vzc2lvbkVudHJ5LT5nTGltT3BlcmF0aW5nTW9kZS5yeE5TUzsKKwlwRG90MTFmLT5yeE5TU1R5cGUgPSBwc2Vzc2lvbkVudHJ5LT5nTGltT3BlcmF0aW5nTW9kZS5yeE5TU1R5cGU7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisjZW5kaWYKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9odF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQl0RG90MTFmSUVIVEluZm8gKnBEb3QxMWYsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDMyX3QgbkNmZ1ZhbHVlLCBuQ2ZnTGVuOworCXVpbnQ4X3QgaHRJbmZvRmllbGQxOworCXVpbnQxNl90IGh0SW5mb0ZpZWxkMjsKKwl0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisJdFNpck1hY0hUSW5mb0ZpZWxkMSAqcEhUSW5mb0ZpZWxkMTsKKwl0U2lyTWFjSFRJbmZvRmllbGQyICpwSFRJbmZvRmllbGQyOworCXVuaW9uIHsKKwkJdWludDE2X3QgbkNmZ1ZhbHVlMTY7CisJCXRTaXJNYWNIVEluZm9GaWVsZDMgaW5mb0ZpZWxkMzsKKwl9IHVIVEluZm9GaWVsZDsKKwl1bmlvbiB7CisJCXVpbnQxNl90IG5DZmdWYWx1ZTE2OworCQl0U2lyTWFjSFRJbmZvRmllbGQyIGluZm9GaWVsZDI7CisJfSB1SFRJbmZvRmllbGQyID0geworCQkwCisJfTsKKworI2lmIDAKKwlDRkdfR0VUX0lOVChuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTCwgbkNmZ1ZhbHVlKTsKKyNlbmRpZiAvKiBUTyBTVVBQT1JUIEJULUFNUCAqLworCisJaWYgKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0cxLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiSW52YWxpZCBzZXNzaW9uIGVudHJ5IGluIHBvcHVsYXRlX2RvdDExZl9odF9pbmZvKClcbiIpKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlwRG90MTFmLT5wcmltYXJ5Q2hhbm5lbCA9IHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbDsKKworCUNGR19HRVRfSU5UKG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfSFRfSU5GT19GSUVMRDEsIG5DZmdWYWx1ZSk7CisKKwlodEluZm9GaWVsZDEgPSAodWludDhfdCkgbkNmZ1ZhbHVlOworCisJcEhUSW5mb0ZpZWxkMSA9ICh0U2lyTWFjSFRJbmZvRmllbGQxICopICZodEluZm9GaWVsZDE7CisJcEhUSW5mb0ZpZWxkMS0+cmlmc01vZGUgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlOworCXBIVEluZm9GaWVsZDEtPnNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ID0KKwkJcE1hYy0+bGltLmdIVFNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5OworCisJaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworCQlQRUxPR0UobGltX2xvZyhwTWFjLCBMT0cxLAorCQkJICAgICAgIEZMCisJCQkJICAgICAgICgiS2VlcCB0aGUgdmFsdWUgcmV0cmlldmVkIGZyb20gY2ZnIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBvZmZzZXQgYW5kIHJlY29tbWVuZGVkIFR4IFdpZHRoIHNldFxuIikpOworCQkgICAgICAgKQorCX0gZWxzZSB7CisJCXBIVEluZm9GaWVsZDEtPnNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPQorCQkJcHNlc3Npb25FbnRyeS0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworCQlwSFRJbmZvRmllbGQxLT5yZWNvbW1lbmRlZFR4V2lkdGhTZXQgPQorCQkJcHNlc3Npb25FbnRyeS0+aHRSZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisJfQorCisJaWYgKChwc2Vzc2lvbkVudHJ5KSAmJiBMSU1fSVNfQVBfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQlDRkdfR0VUX0lOVChuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0hUX0lORk9fRklFTEQyLAorCQkJICAgIG5DZmdWYWx1ZSk7CisKKwkJdUhUSW5mb0ZpZWxkMi5uQ2ZnVmFsdWUxNiA9IG5DZmdWYWx1ZSAmIDB4RkZGRjsgLyogdGhpcyBpcyBhZGRlZCBmb3IgZml4aW5nIENScyBvbiBNRE05SyBwbGF0Zm9ybSAtIDI1Nzk1MSwgMjU5NTc3ICovCisKKwkJdUhUSW5mb0ZpZWxkMi5pbmZvRmllbGQyLm9wTW9kZSA9IHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGU7CisJCXVIVEluZm9GaWVsZDIuaW5mb0ZpZWxkMi5ub25HRkRldmljZXNQcmVzZW50ID0KKwkJCXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3Q7CisJCXVIVEluZm9GaWVsZDIuaW5mb0ZpZWxkMi5vYnNzTm9uSFRTdGFQcmVzZW50ID0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmdIVE9ic3NNb2RlOyAvKmFkZGVkIGZvciBPYnNzICAqLworCisJCXVIVEluZm9GaWVsZDIuaW5mb0ZpZWxkMi5yZXNlcnZlZCA9IDA7CisKKwl9IGVsc2UgeworCQlDRkdfR0VUX0lOVChuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0hUX0lORk9fRklFTEQyLAorCQkJICAgIG5DZmdWYWx1ZSk7CisKKwkJaHRJbmZvRmllbGQyID0gKHVpbnQxNl90KSBuQ2ZnVmFsdWU7CisKKwkJcEhUSW5mb0ZpZWxkMiA9ICh0U2lyTWFjSFRJbmZvRmllbGQyICopICZodEluZm9GaWVsZDI7CisJCXBIVEluZm9GaWVsZDItPm9wTW9kZSA9IHBNYWMtPmxpbS5nSFRPcGVyTW9kZTsKKwkJcEhUSW5mb0ZpZWxkMi0+bm9uR0ZEZXZpY2VzUHJlc2VudCA9CisJCQlwTWFjLT5saW0uZ0hUTm9uR0ZEZXZpY2VzUHJlc2VudDsKKwkJcEhUSW5mb0ZpZWxkMi0+b2Jzc05vbkhUU3RhUHJlc2VudCA9IHBNYWMtPmxpbS5nSFRPYnNzTW9kZTsgICAgIC8qYWRkZWQgZm9yIE9ic3MgICovCisKKwkJcEhUSW5mb0ZpZWxkMi0+cmVzZXJ2ZWQgPSAwOworCX0KKworCUNGR19HRVRfSU5UKG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfSFRfSU5GT19GSUVMRDMsIG5DZmdWYWx1ZSk7CisKKwl1SFRJbmZvRmllbGQubkNmZ1ZhbHVlMTYgPSBuQ2ZnVmFsdWUgJiAweEZGRkY7CisKKwl1SFRJbmZvRmllbGQuaW5mb0ZpZWxkMy5iYXNpY1NUQkNNQ1MgPSBwTWFjLT5saW0uZ0hUU1RCQ0Jhc2ljTUNTOworCXVIVEluZm9GaWVsZC5pbmZvRmllbGQzLmR1YWxDVFNQcm90ZWN0aW9uID0KKwkJcE1hYy0+bGltLmdIVER1YWxDVFNQcm90ZWN0aW9uOworCXVIVEluZm9GaWVsZC5pbmZvRmllbGQzLnNlY29uZGFyeUJlYWNvbiA9IHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlCZWFjb247CisJdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMubHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPQorCQlwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OworCXVIVEluZm9GaWVsZC5pbmZvRmllbGQzLnBjb0FjdGl2ZSA9IHBNYWMtPmxpbS5nSFRQQ09BY3RpdmU7CisJdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMucGNvUGhhc2UgPSBwTWFjLT5saW0uZ0hUUENPUGhhc2U7CisJdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMucmVzZXJ2ZWQgPSAwOworCisJcERvdDExZi0+c2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IHBIVEluZm9GaWVsZDEtPnNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisJcERvdDExZi0+cmVjb21tZW5kZWRUeFdpZHRoU2V0ID0gcEhUSW5mb0ZpZWxkMS0+cmVjb21tZW5kZWRUeFdpZHRoU2V0OworCXBEb3QxMWYtPnJpZnNNb2RlID0gcEhUSW5mb0ZpZWxkMS0+cmlmc01vZGU7CisJcERvdDExZi0+Y29udHJvbGxlZEFjY2Vzc09ubHkgPSBwSFRJbmZvRmllbGQxLT5jb250cm9sbGVkQWNjZXNzT25seTsKKwlwRG90MTFmLT5zZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSA9CisJCXBIVEluZm9GaWVsZDEtPnNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5OworCisJcERvdDExZi0+b3BNb2RlID0gdUhUSW5mb0ZpZWxkMi5pbmZvRmllbGQyLm9wTW9kZTsKKwlwRG90MTFmLT5ub25HRkRldmljZXNQcmVzZW50ID0KKwkJdUhUSW5mb0ZpZWxkMi5pbmZvRmllbGQyLm5vbkdGRGV2aWNlc1ByZXNlbnQ7CisJcERvdDExZi0+b2Jzc05vbkhUU3RhUHJlc2VudCA9CisJCXVIVEluZm9GaWVsZDIuaW5mb0ZpZWxkMi5vYnNzTm9uSFRTdGFQcmVzZW50OworCXBEb3QxMWYtPnJlc2VydmVkID0gdUhUSW5mb0ZpZWxkMi5pbmZvRmllbGQyLnJlc2VydmVkOworCisJcERvdDExZi0+YmFzaWNTVEJDTUNTID0gdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMuYmFzaWNTVEJDTUNTOworCXBEb3QxMWYtPmR1YWxDVFNQcm90ZWN0aW9uID0gdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMuZHVhbENUU1Byb3RlY3Rpb247CisJcERvdDExZi0+c2Vjb25kYXJ5QmVhY29uID0gdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMuc2Vjb25kYXJ5QmVhY29uOworCXBEb3QxMWYtPmxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0KKwkJdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMubHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisJcERvdDExZi0+cGNvQWN0aXZlID0gdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMucGNvQWN0aXZlOworCXBEb3QxMWYtPnBjb1BoYXNlID0gdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMucGNvUGhhc2U7CisJcERvdDExZi0+cmVzZXJ2ZWQyID0gdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMucmVzZXJ2ZWQ7CisJQ0ZHX0dFVF9TVFIoblNpclN0YXR1cywgcE1hYywgV05JX0NGR19CQVNJQ19NQ1NfU0VULAorCQkgICAgcERvdDExZi0+YmFzaWNNQ1NTZXQsIG5DZmdMZW4sIFNJWkVfT0ZfQkFTSUNfTUNTX1NFVCk7CisKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl9odF9pbmZvLiAqLworCit2b2lkCitwb3B1bGF0ZV9kb3QxMWZfaWJzc19wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICB0RG90MTFmSUVJQlNTUGFyYW1zICpwRG90MTFmLAorCQkJICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDMyX3QgdmFsID0gMDsKKwlpZiAoTElNX0lTX0lCU1NfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLAorCQkJCSAgICAgV05JX0NGR19JQlNTX0FUSU1fV0lOX1NJWkUsCisJCQkJICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCVBFTE9HRShsaW1fbG9nCisJCQkJICAgICAgIChwTWFjLCBMT0dFLAorCQkJCSAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIElCU1MgQVRJTSBXSU4gc2l6ZSIpKTsKKwkJCSAgICAgICApCisJCX0KKwkJcERvdDExZi0+cHJlc2VudCA9IDE7CisJCS8qIEFUSU0gZHVyYXRpb24gaXMgYWx3YXlzIHNldCB0byAwICovCisJCXBEb3QxMWYtPmF0aW0gPSB2YWw7CisJfQorCit9IC8qIEVuZCBwb3B1bGF0ZV9kb3QxMWZfaWJzc19wYXJhbXMuICovCisKKyNpZmRlZiBBTklfU1VQUE9SVF8xMUgKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9tZWFzdXJlbWVudF9yZXBvcnQwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgIHRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lIHBSZXEsCisJCQkJICAgIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICpwRG90MTFmKQoreworCXBEb3QxMWYtPnRva2VuID0gcFJlcS0+bWVhc1JlcUlFLm1lYXNUb2tlbjsKKwlwRG90MTFmLT5sYXRlID0gMDsKKwlwRG90MTFmLT5pbmNhcGFibGUgPSAwOworCXBEb3QxMWYtPnJlZnVzZWQgPSAxOworCXBEb3QxMWYtPnR5cGUgPSBTSVJfTUFDX0JBU0lDX01FQVNVUkVNRU5UX1RZUEU7CisKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIFBvcHVsYXRlZERvdDExZk1lYXN1cmVtZW50UmVwb3J0MC4gKi8KK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9tZWFzdXJlbWVudF9yZXBvcnQxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgIHRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lIHBSZXEsCisJCQkJICAgIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICpwRG90MTFmKQoreworCXBEb3QxMWYtPnRva2VuID0gcFJlcS0+bWVhc1JlcUlFLm1lYXNUb2tlbjsKKwlwRG90MTFmLT5sYXRlID0gMDsKKwlwRG90MTFmLT5pbmNhcGFibGUgPSAwOworCXBEb3QxMWYtPnJlZnVzZWQgPSAxOworCXBEb3QxMWYtPnR5cGUgPSBTSVJfTUFDX0NDQV9NRUFTVVJFTUVOVF9UWVBFOworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qIEVuZCBQb3B1bGF0ZWREb3QxMWZNZWFzdXJlbWVudFJlcG9ydDEuICovCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfbWVhc3VyZW1lbnRfcmVwb3J0Mih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICB0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSBwUmVxLAorCQkJCSAgICB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCAqcERvdDExZikKK3sKKwlwRG90MTFmLT50b2tlbiA9IHBSZXEtPm1lYXNSZXFJRS5tZWFzVG9rZW47CisJcERvdDExZi0+bGF0ZSA9IDA7CisJcERvdDExZi0+aW5jYXBhYmxlID0gMDsKKwlwRG90MTFmLT5yZWZ1c2VkID0gMTsKKwlwRG90MTFmLT50eXBlID0gU0lSX01BQ19SUElfTUVBU1VSRU1FTlRfVFlQRTsKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKiBFbmQgUG9wdWxhdGVkRG90MTFmTWVhc3VyZW1lbnRSZXBvcnQyLiAqLworI2VuZGlmCisKK3ZvaWQKK3BvcHVsYXRlX2RvdDExZl9wb3dlcl9jYXBzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICB0RG90MTFmSUVQb3dlckNhcHMgKnBDYXBzLAorCQkJICAgdWludDhfdCBuQXNzb2NUeXBlLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCWlmIChuQXNzb2NUeXBlID09IExJTV9SRUFTU09DKSB7CisJCXBDYXBzLT5taW5UeFBvd2VyID0KKwkJCXBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5wb3dlckNhcC5taW5UeFBvd2VyOworCQlwQ2Fwcy0+bWF4VHhQb3dlciA9CisJCQlwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+cG93ZXJDYXAubWF4VHhQb3dlcjsKKwl9IGVsc2UgeworCQlwQ2Fwcy0+bWluVHhQb3dlciA9CisJCQlwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+cG93ZXJDYXAubWluVHhQb3dlcjsKKwkJcENhcHMtPm1heFR4UG93ZXIgPQorCQkJcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPnBvd2VyQ2FwLm1heFR4UG93ZXI7CisKKwl9CisKKwlwQ2Fwcy0+cHJlc2VudCA9IDE7Cit9IC8qIEVuZCBwb3B1bGF0ZV9kb3QxMWZfcG93ZXJfY2Fwcy4gKi8KKwordFNpclJldFN0YXR1cworcG9wdWxhdGVfZG90MTFmX3Bvd2VyX2NvbnN0cmFpbnRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICB0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzICpwRG90MTFmKQoreworCXVpbnQzMl90IGNmZzsKKwl0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisKKwlDRkdfR0VUX0lOVChuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlQsIGNmZyk7CisKKwlwRG90MTFmLT5sb2NhbFBvd2VyQ29uc3RyYWludHMgPSAodWludDhfdCkgY2ZnOworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl9wb3dlcl9jb25zdHJhaW50cy4gKi8KKwordm9pZAorcG9wdWxhdGVfZG90MTFmX3Fvc19jYXBzX2FwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgdERvdDExZklFUU9TQ2Fwc0FwICpwRG90MTFmLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXBEb3QxMWYtPmNvdW50ID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbVNldENvdW50OworCXBEb3QxMWYtPnJlc2VydmVkID0gMDsKKwlwRG90MTFmLT50eG9wcmVxID0gMDsKKwlwRG90MTFmLT5xcmVxID0gMDsKKwlwRG90MTFmLT5xYWNrID0gMDsKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKK30gLyogRW5kIFBvcHVsYXRlZERvdDExZlFPU0NhcHMuICovCisKK3ZvaWQKK3BvcHVsYXRlX2RvdDExZl9xb3NfY2Fwc19zdGF0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uICpwRG90MTFmKQoreworCXVpbnQzMl90IHZhbCA9IDA7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX01BWF9TUF9MRU5HVEgsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKwkJUEVMT0dFKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBNYXggU1AgTGVuZ3RoIFxuIikpOworCQkgICAgICAgKQorCisJCXBEb3QxMWYtPm1vcmVfZGF0YV9hY2sgPSAwOworCXBEb3QxMWYtPm1heF9zcF9sZW5ndGggPSAodWludDhfdCkgdmFsOworCXBEb3QxMWYtPnFhY2sgPSAwOworCisJaWYgKHBNYWMtPmxpbS5nVWFwc2RFbmFibGUpIHsKKwkJcERvdDExZi0+YWNiZV91YXBzZCA9CisJCQlMSU1fVUFQU0RfR0VUKEFDQkUsIHBNYWMtPmxpbS5nVWFwc2RQZXJBY0JpdG1hc2spOworCQlwRG90MTFmLT5hY2JrX3VhcHNkID0KKwkJCUxJTV9VQVBTRF9HRVQoQUNCSywgcE1hYy0+bGltLmdVYXBzZFBlckFjQml0bWFzayk7CisJCXBEb3QxMWYtPmFjdmlfdWFwc2QgPQorCQkJTElNX1VBUFNEX0dFVChBQ1ZJLCBwTWFjLT5saW0uZ1VhcHNkUGVyQWNCaXRtYXNrKTsKKwkJcERvdDExZi0+YWN2b191YXBzZCA9CisJCQlMSU1fVUFQU0RfR0VUKEFDVk8sIHBNYWMtPmxpbS5nVWFwc2RQZXJBY0JpdG1hc2spOworCX0KKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKK30gLyogRW5kIFBvcHVsYXRlZERvdDExZlFPU0NhcHMuICovCisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9yc24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgIHRwU2lyUlNOaWUgcFJzbkllLCB0RG90MTFmSUVSU04gKnBEb3QxMWYpCit7CisJdWludDMyX3Qgc3RhdHVzOworCWludCBpZHg7CisKKwlpZiAocFJzbkllLT5sZW5ndGgpIHsKKwkJaWYgKDAgPD0gKGlkeCA9IGZpbmRfaWVfbG9jYXRpb24ocE1hYywgcFJzbkllLCBET1QxMUZfRUlEX1JTTikpKSB7CisJCQlzdGF0dXMgPSBkb3QxMWZfdW5wYWNrX2llX3JzbihwTWFjLCBwUnNuSWUtPnJzbklFZGF0YSArIGlkeCArIDIsICAgLyogRUlELCBsZW5ndGggKi8KKwkJCQkJCSAgICAgIHBSc25JZS0+cnNuSUVkYXRhW2lkeCArIDFdLAorCQkJCQkJICAgICAgcERvdDExZik7CisJCQlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCQkJZG90MTFmX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkgICBGTCgiUGFyc2UgZmFpbHVyZSBpbiBQb3B1bGF0ZURvdDExZlJTIgorCQkJCQkgICAgICAiTiAoMHglMDh4KS5cbiIpLCBzdGF0dXMpOworCQkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCQl9CisJCQlkb3QxMWZfbG9nKHBNYWMsIExPRzIsCisJCQkJICAgRkwoImRvdDExZl91bnBhY2tfaWVfcnNuIHJldHVybmVkIDB4JTA4eCBpbiAiCisJCQkJICAgICAgInBvcHVsYXRlX2RvdDExZl9yc24uXG4iKSwgc3RhdHVzKTsKKwkJfQorCisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl9yc24uICovCisKK3RTaXJSZXRTdGF0dXMgcG9wdWxhdGVfZG90MTFmX3Jzbl9vcGFxdWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJIHRwU2lyUlNOaWUgcFJzbkllLAorCQkJCQkgdERvdDExZklFUlNOT3BhcXVlICpwRG90MTFmKQoreworCWludCBpZHg7CisKKwlpZiAocFJzbkllLT5sZW5ndGgpIHsKKwkJaWYgKDAgPD0gKGlkeCA9IGZpbmRfaWVfbG9jYXRpb24ocE1hYywgcFJzbkllLCBET1QxMUZfRUlEX1JTTikpKSB7CisJCQlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwkJCXBEb3QxMWYtPm51bV9kYXRhID0gcFJzbkllLT5yc25JRWRhdGFbaWR4ICsgMV07CisJCQljZGZfbWVtX2NvcHkocERvdDExZi0+ZGF0YSwgcFJzbkllLT5yc25JRWRhdGEgKyBpZHggKyAyLCAgICAgICAgLyogRUlELCBsZW4gKi8KKwkJCQkgICAgIHBSc25JZS0+cnNuSUVkYXRhW2lkeCArIDFdKTsKKwkJfQorCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl9yc25fb3BhcXVlLiAqLworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKwordFNpclJldFN0YXR1cworcG9wdWxhdGVfZG90MTFmX3dhcGkodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgICB0cFNpclJTTmllIHBSc25JZSwgdERvdDExZklFV0FQSSAqcERvdDExZikKK3sKKwl1aW50MzJfdCBzdGF0dXM7CisJaW50IGlkeDsKKworCWlmIChwUnNuSWUtPmxlbmd0aCkgeworCQlpZiAoMCA8PSAoaWR4ID0gZmluZF9pZV9sb2NhdGlvbihwTWFjLCBwUnNuSWUsIERPVDExRl9FSURfV0FQSSkpKSB7CisJCQlzdGF0dXMgPSBkb3QxMWZfdW5wYWNrX2llX3dhcGkocE1hYywgcFJzbkllLT5yc25JRWRhdGEgKyBpZHggKyAyLCAgLyogRUlELCBsZW5ndGggKi8KKwkJCQkJCSAgICAgICBwUnNuSWUtPnJzbklFZGF0YVtpZHggKyAxXSwKKwkJCQkJCSAgICAgICBwRG90MTFmKTsKKwkJCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJCQlkb3QxMWZfbG9nKHBNYWMsIExPR0UsCisJCQkJCSAgIEZMCisJCQkJCQkgICAoIlBhcnNlIGZhaWx1cmUgaW4gcG9wdWxhdGVfZG90MTFmX3dhcGkgKDB4JTA4eCkuXG4iKSwKKwkJCQkJICAgc3RhdHVzKTsKKwkJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQkJfQorCQkJZG90MTFmX2xvZyhwTWFjLCBMT0cyLAorCQkJCSAgIEZMKCJkb3QxMWZfdW5wYWNrX2llX3JzbiByZXR1cm5lZCAweCUwOHggaW4gIgorCQkJCSAgICAgICJwb3B1bGF0ZV9kb3QxMWZfd2FwaS5cbiIpLCBzdGF0dXMpOworCQl9CisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl93YXBpLiAqLworCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl93YXBpX29wYXF1ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgIHRwU2lyUlNOaWUgcFJzbkllLAorCQkJCQkgIHREb3QxMWZJRVdBUElPcGFxdWUgKnBEb3QxMWYpCit7CisJaW50IGlkeDsKKworCWlmIChwUnNuSWUtPmxlbmd0aCkgeworCQlpZiAoMCA8PSAoaWR4ID0gZmluZF9pZV9sb2NhdGlvbihwTWFjLCBwUnNuSWUsIERPVDExRl9FSURfV0FQSSkpKSB7CisJCQlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwkJCXBEb3QxMWYtPm51bV9kYXRhID0gcFJzbkllLT5yc25JRWRhdGFbaWR4ICsgMV07CisJCQljZGZfbWVtX2NvcHkocERvdDExZi0+ZGF0YSwgcFJzbkllLT5yc25JRWRhdGEgKyBpZHggKyAyLCAgICAgICAgLyogRUlELCBsZW4gKi8KKwkJCQkgICAgIHBSc25JZS0+cnNuSUVkYXRhW2lkeCArIDFdKTsKKwkJfQorCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl93YXBpX29wYXF1ZS4gKi8KKworI2VuZGlmIC8qIGRlZmluZWQoRkVBVFVSRV9XTEFOX1dBUEkpICovCisKK3ZvaWQKK3BvcHVsYXRlX2RvdDExZl9zc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgdFNpck1hY1NTaWQgKnBJbnRlcm5hbCwgdERvdDExZklFU1NJRCAqcERvdDExZikKK3sKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwlwRG90MTFmLT5udW1fc3NpZCA9IHBJbnRlcm5hbC0+bGVuZ3RoOworCWlmIChwSW50ZXJuYWwtPmxlbmd0aCkgeworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcERvdDExZi0+c3NpZCwKKwkJCSAgICAgKHVpbnQ4X3QgKikgJnBJbnRlcm5hbC0+c3NJZCwgcEludGVybmFsLT5sZW5ndGgpOworCX0KK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl9zc2lkLiAqLworCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl9zc2lkMih0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVTU0lEICpwRG90MTFmKQoreworCXVpbnQzMl90IG5DZmc7CisJdFNpclJldFN0YXR1cyBuU2lyU3RhdHVzOworCisJQ0ZHX0dFVF9TVFIoblNpclN0YXR1cywgcE1hYywgV05JX0NGR19TU0lELCBwRG90MTFmLT5zc2lkLCBuQ2ZnLCAzMik7CisJcERvdDExZi0+bnVtX3NzaWQgPSAodWludDhfdCkgbkNmZzsKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKiBFbmQgcG9wdWxhdGVfZG90MTFmX3NzaWQyLiAqLworCit2b2lkCitwb3B1bGF0ZV9kb3QxMWZfc2NoZWR1bGUodFNpck1hY1NjaGVkdWxlSUUgKnBTY2hlZHVsZSwKKwkJCSB0RG90MTFmSUVTY2hlZHVsZSAqcERvdDExZikKK3sKKwlwRG90MTFmLT5hZ2dyZWdhdGlvbiA9IHBTY2hlZHVsZS0+aW5mby5hZ2dyZWdhdGlvbjsKKwlwRG90MTFmLT50c2lkID0gcFNjaGVkdWxlLT5pbmZvLnRzaWQ7CisJcERvdDExZi0+ZGlyZWN0aW9uID0gcFNjaGVkdWxlLT5pbmZvLmRpcmVjdGlvbjsKKwlwRG90MTFmLT5yZXNlcnZlZCA9IHBTY2hlZHVsZS0+aW5mby5yc3ZkOworCXBEb3QxMWYtPnNlcnZpY2Vfc3RhcnRfdGltZSA9IHBTY2hlZHVsZS0+c3ZjU3RhcnRUaW1lOworCXBEb3QxMWYtPnNlcnZpY2VfaW50ZXJ2YWwgPSBwU2NoZWR1bGUtPnN2Y0ludGVydmFsOworCXBEb3QxMWYtPm1heF9zZXJ2aWNlX2R1ciA9IHBTY2hlZHVsZS0+bWF4U3ZjRHVyYXRpb247CisJcERvdDExZi0+c3BlY19pbnRlcnZhbCA9IHBTY2hlZHVsZS0+c3BlY0ludGVydmFsOworCisJcERvdDExZi0+cHJlc2VudCA9IDE7Cit9IC8qIEVuZCBwb3B1bGF0ZV9kb3QxMWZfc2NoZWR1bGUuICovCisKK3ZvaWQKK3BvcHVsYXRlX2RvdDExZl9zdXBwX2NoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgICB0RG90MTFmSUVTdXBwQ2hhbm5lbHMgKnBEb3QxMWYsCisJCQkgICAgICB1aW50OF90IG5Bc3NvY1R5cGUsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDhfdCBpOworCXVpbnQ4X3QgKnA7CisKKwlpZiAobkFzc29jVHlwZSA9PSBMSU1fUkVBU1NPQykgeworCQlwID0gKHVpbnQ4X3QgKikgcHNlc3Npb25FbnRyeS0+cExpbVJlQXNzb2NSZXEtPgorCQkgICAgc3VwcG9ydGVkQ2hhbm5lbHMuY2hhbm5lbExpc3Q7CisJCXBEb3QxMWYtPm51bV9iYW5kcyA9CisJCQlwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubDsKKwl9IGVsc2UgeworCQlwID0gKHVpbnQ4X3QgKikgcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPnN1cHBvcnRlZENoYW5uZWxzLgorCQkgICAgY2hhbm5lbExpc3Q7CisJCXBEb3QxMWYtPm51bV9iYW5kcyA9CisJCQlwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubDsKKwl9CisJZm9yIChpID0gMFU7IGkgPCBwRG90MTFmLT5udW1fYmFuZHM7ICsraSwgKytwKSB7CisJCXBEb3QxMWYtPmJhbmRzW2ldWzBdID0gKnA7CisJCXBEb3QxMWYtPmJhbmRzW2ldWzFdID0gMTsKKwl9CisKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKworfSAvKiBFbmQgcG9wdWxhdGVfZG90MTFmX3N1cHBfY2hhbm5lbHMuICovCisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9zdXBwX3JhdGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICB1aW50OF90IG5DaGFubmVsTnVtLAorCQkJICAgdERvdDExZklFU3VwcFJhdGVzICpwRG90MTFmLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJSZXRTdGF0dXMgblNpclN0YXR1czsKKwl1aW50MzJfdCBuUmF0ZXM7CisJdWludDhfdCByYXRlc1tTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVNdOworCisJLyogVXNlIHRoZSBvcGVyYXRpb25hbCByYXRlcyBwcmVzZW50IGluIHNlc3Npb24gZW50cnkgd2hlbmV2ZXIgbkNoYW5uZWxOdW0gaXMgc2V0IHRvIE9QRVJBVElPTkFMCisJICAgZWxzZSB1c2UgdGhlIHN1cHBvcnRlZCByYXRlIHNldCBmcm9tIENGRywgd2hpY2ggaXMgZml4ZWQgYW5kIGRvZXMgbm90IGNoYW5nZSBkeW5hbWljYWxseSBhbmQgaXMgdXNlZCBmb3IKKwkgICBzZW5kaW5nIG1nbXQgZnJhbWVzIChsaWxlIHByb2JlIHJlcSkgd2hpY2ggbmVlZCB0byBnbyBvdXQgYmVmb3JlIGFueSBzZXNzaW9uIGlzIHByZXNlbnQuCisJICovCisJaWYgKFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCA9PSBuQ2hhbm5lbE51bSkgeworI2lmIDAKKwkJQ0ZHX0dFVF9TVFIoblNpclN0YXR1cywgcE1hYywgV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVCwKKwkJCSAgICByYXRlcywgblJhdGVzLCBTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVMpOworI2VuZGlmIC8qIFRPIFNVUFBPUlQgQlQtQU1QICovCisJCWlmIChwc2Vzc2lvbkVudHJ5ICE9IE5VTEwpIHsKKwkJCW5SYXRlcyA9IHBzZXNzaW9uRW50cnktPnJhdGVTZXQubnVtUmF0ZXM7CisJCQljZGZfbWVtX2NvcHkocmF0ZXMsIHBzZXNzaW9uRW50cnktPnJhdGVTZXQucmF0ZSwKKwkJCQkgICAgIG5SYXRlcyk7CisJCX0gZWxzZSB7CisJCQlkb3QxMWZfbG9nKHBNYWMsIExPR0UsCisJCQkJICAgRkwKKwkJCQkJICAgKCJubyBzZXNzaW9uIGNvbnRleHQgZXhpc3RzIHdoaWxlIHBvcHVsYXRpbmcgT3BlcmF0aW9uYWwgUmF0ZSBTZXRcbiIpKTsKKwkJCW5SYXRlcyA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKDE0ID49IG5DaGFubmVsTnVtKSB7CisJCUNGR19HRVRfU1RSKG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQiwKKwkJCSAgICByYXRlcywgblJhdGVzLCBTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVMpOworCX0gZWxzZSB7CisJCUNGR19HRVRfU1RSKG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQSwKKwkJCSAgICByYXRlcywgblJhdGVzLCBTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVMpOworCX0KKworCWlmICgwICE9IG5SYXRlcykgeworCQlwRG90MTFmLT5udW1fcmF0ZXMgPSAodWludDhfdCkgblJhdGVzOworCQljZGZfbWVtX2NvcHkocERvdDExZi0+cmF0ZXMsIHJhdGVzLCBuUmF0ZXMpOworCQlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qIEVuZCBwb3B1bGF0ZV9kb3QxMWZfc3VwcF9yYXRlcy4gKi8KKworLyoqCisgKiBwb3B1bGF0ZV9kb3QxMWZfcmF0ZXNfdGRscygpIC0gcG9wdWxhdGUgc3VwcG9ydGVkIHJhdGVzIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlcyBJRS4KKyAqIEBwX21hYyBnbG9hYmwgLSBoZWFkZXIuCisgKiBAcF9zdXBwX3JhdGVzIC0gcG9pbnRlciB0byBzdXBwb3J0ZWQgcmF0ZXMgSUUKKyAqIEBwX2V4dF9zdXBwX3JhdGVzIC0gcG9pbnRlciB0byBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgSUUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBvcHVsYXRlcyB0aGUgc3VwcG9ydGVkIHJhdGVzIGFuZCBleHRlbmRlZCBzdXBwb3J0ZWQKKyAqIHJhdGVzIElFIGJhc2VkIGluIHRoZSBTVEEgY2FwYWJpbGl0eS4gSWYgdGhlIG51bWJlciBvZiByYXRlcworICogc3VwcG9ydGVkIGlzIGxlc3MgdGhhbiBNQVhfTlVNX1NVUFBPUlRFRF9SQVRFUywgb25seSBzdXBwb3J0ZWQgcmF0ZXMKKyAqIElFIGlzIHBvcHVsYXRlZC4KKyAqCisgKiBSZXR1cm46IHRTaXJSZXRTdGF0dXMgZVNJUl9TVUNDRVNTIG9uIFN1Y2Nlc3MgYW5kIGVTSVJfRkFJTFVSRQorICogICAgICAgICBvbiBmYWlsdXJlLgorICovCisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl9yYXRlc190ZGxzKHRwQW5pU2lyR2xvYmFsIHBfbWFjLAorCQkJICAgdERvdDExZklFU3VwcFJhdGVzICpwX3N1cHBfcmF0ZXMsCisJCQkgICB0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKnBfZXh0X3N1cHBfcmF0ZXMpCit7CisJdFNpck1hY1JhdGVTZXQgdGVtcF9yYXRlc2V0OworCXRTaXJNYWNSYXRlU2V0IHRlbXBfcmF0ZXNldDI7CisJdWludDMyX3QgdmFsLCBpOworCXVpbnQzMl90IHNlbGZfZG90MTFtb2RlID0gMDsKKworCXdsYW5fY2ZnX2dldF9pbnQocF9tYWMsIFdOSV9DRkdfRE9UMTFfTU9ERSwgJnNlbGZfZG90MTFtb2RlKTsKKworCS8qKgorICAgICAgICAgKiBJbmNsdWRlIDExYiByYXRlcyBvbmx5IHdoZW4gdGhlIGRldmljZSBjb25maWd1cmVkIGluCisJICogYXV0bywgMTFhL2IvZyBvciAxMWJfb25seQorICAgICAgICAgKi8KKwlpZiAoKHNlbGZfZG90MTFtb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV9BTEwpIHx8CisJICAgIChzZWxmX2RvdDExbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFBKSB8fAorCSAgICAoc2VsZl9kb3QxMW1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExQUMpIHx8CisJICAgIChzZWxmX2RvdDExbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFOKSB8fAorCSAgICAoc2VsZl9kb3QxMW1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExRykgfHwKKwkgICAgKHNlbGZfZG90MTFtb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUIpICkgeworCQl2YWwgPSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUJfTEVOOworCQl3bGFuX2NmZ19nZXRfc3RyKHBfbWFjLCBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUIsCisJCQkJKHVpbnQ4X3QgKikmdGVtcF9yYXRlc2V0LnJhdGUsICZ2YWwpOworCQl0ZW1wX3JhdGVzZXQubnVtUmF0ZXMgPSAodWludDhfdCkgdmFsOworCX0KKwllbHNlIHsKKwkgICAgdGVtcF9yYXRlc2V0Lm51bVJhdGVzID0gMDsKKwl9CisKKwkvKiBJbmNsdWRlIDExYSByYXRlcyB3aGVuIHRoZSBkZXZpY2UgY29uZmlndXJlZCBpbiBub24tMTFiIG1vZGUgKi8KKwlpZiAoIUlTX0RPVDExX01PREVfMTFCKHNlbGZfZG90MTFtb2RlKSkgeworCQl2YWwgPSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUFfTEVOOworCQl3bGFuX2NmZ19nZXRfc3RyKHBfbWFjLCBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUEsCisJCQkodWludDhfdCAqKSZ0ZW1wX3JhdGVzZXQyLnJhdGUsICZ2YWwpOworCQl0ZW1wX3JhdGVzZXQyLm51bVJhdGVzID0gKHVpbnQ4X3QpIHZhbDsKKwl9IGVsc2UgeworCQl0ZW1wX3JhdGVzZXQyLm51bVJhdGVzID0gMDsKKwl9CisKKwlpZiAoKHRlbXBfcmF0ZXNldC5udW1SYXRlcyArIHRlbXBfcmF0ZXNldDIubnVtUmF0ZXMpID4KKwkJCQkJU0lSX01BQ19NQVhfTlVNQkVSX09GX1JBVEVTKSB7CisJCWxpbV9sb2cocF9tYWMsIExPR1AsIEZMKCJtb3JlIHRoYW4gJWQgcmF0ZXMgaW4gQ0ZHIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCS8qKgorICAgICAgICAgKiBjb3B5IGFsbCByYXRlcyBpbiB0ZW1wX3JhdGVzZXQsCisgICAgICAgICAqIHRoZXJlIGFyZSBTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVMgcmF0ZXMgbWF4CisgICAgICAgICAqLworCWZvciAoaSA9IDA7IGkgPCB0ZW1wX3JhdGVzZXQyLm51bVJhdGVzOyBpKyspCisJCXRlbXBfcmF0ZXNldC5yYXRlW2kgKyB0ZW1wX3JhdGVzZXQubnVtUmF0ZXNdID0KKwkJCQkJCXRlbXBfcmF0ZXNldDIucmF0ZVtpXTsKKworCXRlbXBfcmF0ZXNldC5udW1SYXRlcyArPSB0ZW1wX3JhdGVzZXQyLm51bVJhdGVzOworCisJaWYgKHRlbXBfcmF0ZXNldC5udW1SYXRlcyA8PSBNQVhfTlVNX1NVUFBPUlRFRF9SQVRFUykgeworCQlwX3N1cHBfcmF0ZXMtPm51bV9yYXRlcyA9IHRlbXBfcmF0ZXNldC5udW1SYXRlczsKKwkJY2RmX21lbV9jb3B5KHBfc3VwcF9yYXRlcy0+cmF0ZXMsIHRlbXBfcmF0ZXNldC5yYXRlLAorCQkJICAgICBwX3N1cHBfcmF0ZXMtPm51bV9yYXRlcyk7CisJCXBfc3VwcF9yYXRlcy0+cHJlc2VudCA9IDE7CisJfSAgZWxzZSB7IC8qIFBvcHVsYXRlIGV4dGVuZGVkIGNhcGFiaWxpdHkgYXMgd2VsbCAqLworCQlwX3N1cHBfcmF0ZXMtPm51bV9yYXRlcyA9IE1BWF9OVU1fU1VQUE9SVEVEX1JBVEVTOworCQljZGZfbWVtX2NvcHkocF9zdXBwX3JhdGVzLT5yYXRlcywgdGVtcF9yYXRlc2V0LnJhdGUsCisJCQkgICAgIHBfc3VwcF9yYXRlcy0+bnVtX3JhdGVzKTsKKwkJcF9zdXBwX3JhdGVzLT5wcmVzZW50ID0gMTsKKworCQlwX2V4dF9zdXBwX3JhdGVzLT5udW1fcmF0ZXMgPSB0ZW1wX3JhdGVzZXQubnVtUmF0ZXMgLQorCQkJCSAgICAgTUFYX05VTV9TVVBQT1JURURfUkFURVM7CisJCWNkZl9tZW1fY29weShwX2V4dF9zdXBwX3JhdGVzLT5yYXRlcywKKwkJCSAgICAgKHVpbnQ4X3QgKil0ZW1wX3JhdGVzZXQucmF0ZSArCisJCQkgICAgIE1BWF9OVU1fU1VQUE9SVEVEX1JBVEVTLAorCQkJICAgICBwX2V4dF9zdXBwX3JhdGVzLT5udW1fcmF0ZXMpOworCQlwX2V4dF9zdXBwX3JhdGVzLT5wcmVzZW50ID0gMTsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qIEVuZCBwb3B1bGF0ZV9kb3QxMWZfcmF0ZXNfdGRscyAqLworCisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl90cGNfcmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICB0RG90MTFmSUVUUENSZXBvcnQgKnBEb3QxMWYsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdWludDE2X3Qgc3RhaWQsIHR4UG93ZXI7CisJdFNpclJldFN0YXR1cyBuU2lyU3RhdHVzOworCisJblNpclN0YXR1cyA9IGxpbV9nZXRfbWdtdF9zdGFpZChwTWFjLCAmc3RhaWQsIHBzZXNzaW9uRW50cnkpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gblNpclN0YXR1cykgeworCQlkb3QxMWZfbG9nKHBNYWMsIExPRzEsIEZMKCJGYWlsZWQgdG8gZ2V0IHRoZSBTVEFJRCBpbiBQb3B1bGF0IgorCQkJCQkgICJlRG90MTFmVFBDUmVwb3J0OyBsaW1fZ2V0X21nbXRfc3RhaWQgIgorCQkJCQkgICJyZXR1cm5lZCBzdGF0dXMgJWQuXG4iKSwgblNpclN0YXR1cyk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIEZyYW1lc1RvRG86IFRoaXMgZnVuY3Rpb24gd2FzICJtaXNwbGFjZWQiIGluIHRoZSBtb3ZlIHRvIEdlbjRfVFZNLi4uICovCisJLyogdHhQb3dlciA9IGhhbEdldFJhdGVUb1B3clZhbHVlKCBwTWFjLCBzdGFpZCwgcE1hYy0+bGltLmdMaW1DdXJyZW50Q2hhbm5lbElkLCBpc0JlYWNvbiApOyAqLworCXR4UG93ZXIgPSAwOworCXBEb3QxMWYtPnR4X3Bvd2VyID0gKHVpbnQ4X3QpIHR4UG93ZXI7CisJcERvdDExZi0+bGlua19tYXJnaW4gPSAwOworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl90cGNfcmVwb3J0LiAqLworCit2b2lkIHBvcHVsYXRlX2RvdDExZl90c19pbmZvKHRTaXJNYWNUU0luZm8gKnBJbmZvLCB0RG90MTFmRmZUU0luZm8gKnBEb3QxMWYpCit7CisJcERvdDExZi0+dHJhZmZpY190eXBlID0gcEluZm8tPnRyYWZmaWMudHJhZmZpY1R5cGU7CisJcERvdDExZi0+dHNpZCA9IHBJbmZvLT50cmFmZmljLnRzaWQ7CisJcERvdDExZi0+ZGlyZWN0aW9uID0gcEluZm8tPnRyYWZmaWMuZGlyZWN0aW9uOworCXBEb3QxMWYtPmFjY2Vzc19wb2xpY3kgPSBwSW5mby0+dHJhZmZpYy5hY2Nlc3NQb2xpY3k7CisJcERvdDExZi0+YWdncmVnYXRpb24gPSBwSW5mby0+dHJhZmZpYy5hZ2dyZWdhdGlvbjsKKwlwRG90MTFmLT5wc2IgPSBwSW5mby0+dHJhZmZpYy5wc2I7CisJcERvdDExZi0+dXNlcl9wcmlvcml0eSA9IHBJbmZvLT50cmFmZmljLnVzZXJQcmlvOworCXBEb3QxMWYtPnRzaW5mb19hY2tfcG9sID0gcEluZm8tPnRyYWZmaWMuYWNrUG9saWN5OworCXBEb3QxMWYtPnNjaGVkdWxlID0gcEluZm8tPnNjaGVkdWxlLnNjaGVkdWxlOworfSAvKiBFbmQgUG9wdWxhdGVkRG90MTFmVFNJbmZvLiAqLworCit2b2lkIHBvcHVsYXRlX2RvdDExZl93bW0odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSB0RG90MTFmSUVXTU1JbmZvQXAgKnBJbmZvLAorCQkJIHREb3QxMWZJRVdNTVBhcmFtcyAqcFBhcmFtcywKKwkJCSB0RG90MTFmSUVXTU1DYXBzICpwQ2FwcywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlpZiAocHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCkgeworCQlpZiAoTElNX0lTX0lCU1NfUk9MRShwc2Vzc2lvbkVudHJ5KSkgeworCQkJLyogaWYgKCAhIHNpcklzUHJvcENhcGFiaWxpdHlFbmFibGVkKCBwTWFjLCBTSVJfTUFDX1BST1BfQ0FQQUJJTElUWV9XTUUgKSApICovCisJCQl7CisJCQkJcG9wdWxhdGVfZG90MTFmX3dtbV9pbmZvX2FwKHBNYWMsIHBJbmZvLAorCQkJCQkJCSAgICBwc2Vzc2lvbkVudHJ5KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXsKKwkJCQlwb3B1bGF0ZV9kb3QxMWZfd21tX3BhcmFtcyhwTWFjLCBwUGFyYW1zLAorCQkJCQkJCSAgIHBzZXNzaW9uRW50cnkpOworCQkJfQorCisJCQlpZiAocHNlc3Npb25FbnRyeS0+bGltV3NtRW5hYmxlZCkgeworCQkJCXBvcHVsYXRlX2RvdDExZl93bW1fY2FwcyhwQ2Fwcyk7CisJCQl9CisJCX0KKwl9Cit9IC8qIEVuZCBwb3B1bGF0ZV9kb3QxMWZfd21tLiAqLworCit2b2lkIHBvcHVsYXRlX2RvdDExZl93bW1fY2Fwcyh0RG90MTFmSUVXTU1DYXBzICpwQ2FwcykKK3sKKwlwQ2Fwcy0+dmVyc2lvbiA9IFNJUl9NQUNfT1VJX1ZFUlNJT05fMTsKKwlwQ2Fwcy0+cWFjayA9IDA7CisJcENhcHMtPnF1ZXVlX3JlcXVlc3QgPSAxOworCXBDYXBzLT50eG9wX3JlcXVlc3QgPSAwOworCXBDYXBzLT5tb3JlX2FjayA9IDA7CisJcENhcHMtPnByZXNlbnQgPSAxOworfSAvKiBFbmQgUG9wdWxhdGVEb3QxMWZXbW1DYXBzLiAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQordm9pZCBwb3B1bGF0ZV9kb3QxMWZfcmVfYXNzb2NfdHNwZWModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgdERvdDExZlJlQXNzb2NSZXF1ZXN0ICpwUmVhc3NvYywKKwkJCQkgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwl1aW50OF90IG51bVRzcGVjcyA9IDAsIGlkeDsKKwl0VHNwZWNJbmZvICpwVHNwZWMgPSBOVUxMOworCisJbnVtVHNwZWNzID0gcHNlc3Npb25FbnRyeS0+cExpbVJlQXNzb2NSZXEtPmVzZVRzcGVjSW5mby5udW1Uc3BlY3M7CisJcFRzcGVjID0gJnBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5lc2VUc3BlY0luZm8udHNwZWNbMF07CisJcFJlYXNzb2MtPm51bV9XTU1UU1BFQyA9IG51bVRzcGVjczsKKwlpZiAobnVtVHNwZWNzKSB7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgbnVtVHNwZWNzOyBpZHgrKykgeworCQkJcG9wdWxhdGVfZG90MTFmX3dtbXRzcGVjKCZwVHNwZWMtPnRzcGVjLAorCQkJCQkJICZwUmVhc3NvYy0+V01NVFNQRUNbaWR4XSk7CisJCQlwVHNwZWMtPnRzcGVjLm1lZGl1bVRpbWUgPSAwOworCQkJcFRzcGVjKys7CisJCX0KKwl9Cit9CisjZW5kaWYKKwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfd21tX2luZm9fYXAodHBBbmlTaXJHbG9iYWwgcE1hYywgdERvdDExZklFV01NSW5mb0FwICpwSW5mbywKKwkJCQkgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKwlwSW5mby0+dmVyc2lvbiA9IFNJUl9NQUNfT1VJX1ZFUlNJT05fMTsKKworCS8qIFdNTSBTcGVjaWZpY2F0aW9uIDMuMS4zLCAzLjIuMworCSAqIEFuIElCU1Mgc3RhaW9uIHNoYWxsIGFsd2F5cyB1c2UgaXRzIGRlZmF1bHQgV01NIHBhcmFtZXRlcnMuCisJICovCisJaWYgKExJTV9JU19JQlNTX1JPTEUocHNlc3Npb25FbnRyeSkpIHsKKwkJcEluZm8tPnBhcmFtX3NldF9jb3VudCA9IDA7CisJCXBJbmZvLT51YXBzZCA9IDA7CisJfSBlbHNlIHsKKwkJcEluZm8tPnBhcmFtX3NldF9jb3VudCA9CisJCQkoMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbVNldENvdW50KTsKKwkJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKSB7CisJCQlwSW5mby0+dWFwc2QgPSAoMHgxICYgcHNlc3Npb25FbnRyeS0+YXBVYXBzZEVuYWJsZSk7CisJCX0gZWxzZQorCQkJcEluZm8tPnVhcHNkID0gKDB4MSAmIHBNYWMtPmxpbS5nVWFwc2RFbmFibGUpOworCX0KKwlwSW5mby0+cHJlc2VudCA9IDE7Cit9CisKK3ZvaWQgcG9wdWxhdGVfZG90MTFmX3dtbV9pbmZvX3N0YXRpb25fcGVyX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKwkJCQkJCSAgdERvdDExZklFV01NSW5mb1N0YXRpb24gKnBJbmZvKQoreworCXVpbnQzMl90IHZhbCA9IDA7CisKKwlwSW5mby0+dmVyc2lvbiA9IFNJUl9NQUNfT1VJX1ZFUlNJT05fMTsKKwlwSW5mby0+YWN2b191YXBzZCA9CisJCUxJTV9VQVBTRF9HRVQoQUNWTywgcHNlc3Npb25FbnRyeS0+Z1VhcHNkUGVyQWNCaXRtYXNrKTsKKwlwSW5mby0+YWN2aV91YXBzZCA9CisJCUxJTV9VQVBTRF9HRVQoQUNWSSwgcHNlc3Npb25FbnRyeS0+Z1VhcHNkUGVyQWNCaXRtYXNrKTsKKwlwSW5mby0+YWNia191YXBzZCA9CisJCUxJTV9VQVBTRF9HRVQoQUNCSywgcHNlc3Npb25FbnRyeS0+Z1VhcHNkUGVyQWNCaXRtYXNrKTsKKwlwSW5mby0+YWNiZV91YXBzZCA9CisJCUxJTV9VQVBTRF9HRVQoQUNCRSwgcHNlc3Npb25FbnRyeS0+Z1VhcHNkUGVyQWNCaXRtYXNrKTsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfTUFYX1NQX0xFTkdUSCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorCQlQRUxPR0UobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIE1heCBTUCBMZW5ndGggXG4iKSk7CisJCSAgICAgICApCisKKwkJcEluZm8tPm1heF9zcF9sZW5ndGggPSAodWludDhfdCkgdmFsOworCXBJbmZvLT5wcmVzZW50ID0gMTsKK30KKwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfd21tX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXREb3QxMWZJRVdNTVBhcmFtcyAqcFBhcmFtcywKKwkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXBQYXJhbXMtPnZlcnNpb24gPSBTSVJfTUFDX09VSV9WRVJTSU9OXzE7CisKKwlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpCisJCXBQYXJhbXMtPnFvc0luZm8gPQorCQkJKHBzZXNzaW9uRW50cnktPgorCQkJIGFwVWFwc2RFbmFibGUgPDwgNykgfCAoKHVpbnQ4X3QpICgweDBmICYgcHNlc3Npb25FbnRyeS0+CisJCQkJCQkJICAgZ0xpbUVkY2FQYXJhbVNldENvdW50KSk7CisJZWxzZQorCQlwUGFyYW1zLT5xb3NJbmZvID0KKwkJCShwTWFjLT5saW0uCisJCQkgZ1VhcHNkRW5hYmxlIDw8IDcpIHwgKCh1aW50OF90KSAoMHgwZiAmIHBzZXNzaW9uRW50cnktPgorCQkJCQkJCSAgZ0xpbUVkY2FQYXJhbVNldENvdW50KSk7CisKKwkvKiBGaWxsIGVhY2ggRURDQSBwYXJhbWV0ZXIgc2V0IGluIG9yZGVyOiBiZSwgYmssIHZpLCB2byAqLworCXBQYXJhbXMtPmFjYmVfYWlmc24gPQorCQkoMHhmICYgU0VUX0FJRlNOKHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMF0uYWNpLmFpZnNuKSk7CisJcFBhcmFtcy0+YWNiZV9hY20gPSAoMHgxICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1swXS5hY2kuYWNtKTsKKwlwUGFyYW1zLT5hY2JlX2FjaSA9ICgweDMgJiBTSVJfTUFDX0VEQ0FBQ0lfQkVTVEVGRk9SVCk7CisJcFBhcmFtcy0+YWNiZV9hY3dtaW4gPQorCQkoMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1swXS5jdy5taW4pOworCXBQYXJhbXMtPmFjYmVfYWN3bWF4ID0KKwkJKDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMF0uY3cubWF4KTsKKwlwUGFyYW1zLT5hY2JlX3R4b3BsaW1pdCA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMF0udHhvcGxpbWl0OworCisJcFBhcmFtcy0+YWNia19haWZzbiA9CisJCSgweGYgJiBTRVRfQUlGU04ocHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS5hY2kuYWlmc24pKTsKKwlwUGFyYW1zLT5hY2JrX2FjbSA9ICgweDEgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzFdLmFjaS5hY20pOworCXBQYXJhbXMtPmFjYmtfYWNpID0gKDB4MyAmIFNJUl9NQUNfRURDQUFDSV9CQUNLR1JPVU5EKTsKKwlwUGFyYW1zLT5hY2JrX2Fjd21pbiA9CisJCSgweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzFdLmN3Lm1pbik7CisJcFBhcmFtcy0+YWNia19hY3dtYXggPQorCQkoMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS5jdy5tYXgpOworCXBQYXJhbXMtPmFjYmtfdHhvcGxpbWl0ID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS50eG9wbGltaXQ7CisKKwlpZiAoTElNX0lTX0FQX1JPTEUocHNlc3Npb25FbnRyeSkpCisJCXBQYXJhbXMtPmFjdmlfYWlmc24gPQorCQkJKDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMl0uYWNpLmFpZnNuKTsKKwllbHNlCisJCXBQYXJhbXMtPmFjdmlfYWlmc24gPQorCQkJKDB4ZiAmCisJCQkgU0VUX0FJRlNOKHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMl0uYWNpLmFpZnNuKSk7CisKKwlwUGFyYW1zLT5hY3ZpX2FjbSA9ICgweDEgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzJdLmFjaS5hY20pOworCXBQYXJhbXMtPmFjdmlfYWNpID0gKDB4MyAmIFNJUl9NQUNfRURDQUFDSV9WSURFTyk7CisJcFBhcmFtcy0+YWN2aV9hY3dtaW4gPQorCQkoMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1syXS5jdy5taW4pOworCXBQYXJhbXMtPmFjdmlfYWN3bWF4ID0KKwkJKDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMl0uY3cubWF4KTsKKwlwUGFyYW1zLT5hY3ZpX3R4b3BsaW1pdCA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMl0udHhvcGxpbWl0OworCisJaWYgKExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpKQorCQlwUGFyYW1zLT5hY3ZvX2FpZnNuID0KKwkJCSgweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzNdLmFjaS5haWZzbik7CisJZWxzZQorCQlwUGFyYW1zLT5hY3ZvX2FpZnNuID0KKwkJCSgweGYgJgorCQkJIFNFVF9BSUZTTihwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzNdLmFjaS5haWZzbikpOworCisJcFBhcmFtcy0+YWN2b19hY20gPSAoMHgxICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1szXS5hY2kuYWNtKTsKKwlwUGFyYW1zLT5hY3ZvX2FjaSA9ICgweDMgJiBTSVJfTUFDX0VEQ0FBQ0lfVk9JQ0UpOworCXBQYXJhbXMtPmFjdm9fYWN3bWluID0KKwkJKDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbM10uY3cubWluKTsKKwlwUGFyYW1zLT5hY3ZvX2Fjd21heCA9CisJCSgweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzNdLmN3Lm1heCk7CisJcFBhcmFtcy0+YWN2b190eG9wbGltaXQgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzNdLnR4b3BsaW1pdDsKKworCXBQYXJhbXMtPnByZXNlbnQgPSAxOworCit9IC8qIEVuZCBwb3B1bGF0ZV9kb3QxMWZfd21tX3BhcmFtcy4gKi8KKwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfd21tX3NjaGVkdWxlKHRTaXJNYWNTY2hlZHVsZUlFICpwU2NoZWR1bGUsCisJCQkJICB0RG90MTFmSUVXTU1TY2hlZHVsZSAqcERvdDExZikKK3sKKwlwRG90MTFmLT52ZXJzaW9uID0gMTsKKwlwRG90MTFmLT5hZ2dyZWdhdGlvbiA9IHBTY2hlZHVsZS0+aW5mby5hZ2dyZWdhdGlvbjsKKwlwRG90MTFmLT50c2lkID0gcFNjaGVkdWxlLT5pbmZvLnRzaWQ7CisJcERvdDExZi0+ZGlyZWN0aW9uID0gcFNjaGVkdWxlLT5pbmZvLmRpcmVjdGlvbjsKKwlwRG90MTFmLT5yZXNlcnZlZCA9IHBTY2hlZHVsZS0+aW5mby5yc3ZkOworCXBEb3QxMWYtPnNlcnZpY2Vfc3RhcnRfdGltZSA9IHBTY2hlZHVsZS0+c3ZjU3RhcnRUaW1lOworCXBEb3QxMWYtPnNlcnZpY2VfaW50ZXJ2YWwgPSBwU2NoZWR1bGUtPnN2Y0ludGVydmFsOworCXBEb3QxMWYtPm1heF9zZXJ2aWNlX2R1ciA9IHBTY2hlZHVsZS0+bWF4U3ZjRHVyYXRpb247CisJcERvdDExZi0+c3BlY19pbnRlcnZhbCA9IHBTY2hlZHVsZS0+c3BlY0ludGVydmFsOworCisJcERvdDExZi0+cHJlc2VudCA9IDE7Cit9IC8qIEVuZCBwb3B1bGF0ZV9kb3QxMWZfd21tX3NjaGVkdWxlLiAqLworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfd3BhKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICB0cFNpclJTTmllIHBSc25JZSwgdERvdDExZklFV1BBICpwRG90MTFmKQoreworCXVpbnQzMl90IHN0YXR1czsKKwlpbnQgaWR4OworCisJaWYgKHBSc25JZS0+bGVuZ3RoKSB7CisJCWlmICgwIDw9IChpZHggPSBmaW5kX2llX2xvY2F0aW9uKHBNYWMsIHBSc25JZSwgRE9UMTFGX0VJRF9XUEEpKSkgeworCQkJc3RhdHVzID0gZG90MTFmX3VucGFja19pZV93cGEocE1hYywgcFJzbkllLT5yc25JRWRhdGEgKyBpZHggKyAyICsgNCwgICAgICAgLyogRUlELCBsZW5ndGgsIE9VSSAqLworCQkJCQkJICAgICAgcFJzbkllLT5yc25JRWRhdGFbaWR4ICsgMV0gLSA0LCAgIC8qIE9VSSAqLworCQkJCQkJICAgICAgcERvdDExZik7CisJCQlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCQkJZG90MTFmX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkgICBGTCgiUGFyc2UgZmFpbHVyZSBpbiBQb3B1bGF0ZURvdDExZldQIgorCQkJCQkgICAgICAiQSAoMHglMDh4KS5cbiIpLCBzdGF0dXMpOworCQkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKiBFbmQgcG9wdWxhdGVfZG90MTFmX3dwYS4gKi8KKwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfd3BhX29wYXF1ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgdHBTaXJSU05pZSBwUnNuSWUsCisJCQkJCSB0RG90MTFmSUVXUEFPcGFxdWUgKnBEb3QxMWYpCit7CisJaW50IGlkeDsKKworCWlmIChwUnNuSWUtPmxlbmd0aCkgeworCQlpZiAoMCA8PSAoaWR4ID0gZmluZF9pZV9sb2NhdGlvbihwTWFjLCBwUnNuSWUsIERPVDExRl9FSURfV1BBKSkpIHsKKwkJCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCQkJcERvdDExZi0+bnVtX2RhdGEgPSBwUnNuSWUtPnJzbklFZGF0YVtpZHggKyAxXSAtIDQ7CisJCQljZGZfbWVtX2NvcHkocERvdDExZi0+ZGF0YSwgcFJzbkllLT5yc25JRWRhdGEgKyBpZHggKyAyICsgNCwgICAgLyogRUlELCBsZW4sIE9VSSAqLworCQkJCSAgICAgcFJzbkllLT5yc25JRWRhdGFbaWR4ICsgMV0gLSA0KTsgICAvKiBPVUkgKi8KKwkJfQorCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl93cGFfb3BhcXVlLiAqLworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKK3RTaXJSZXRTdGF0dXMKK3Npcl9jb252ZXJ0X3Byb2JlX3JlcV9mcmFtZTJfc3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgIHVpbnQ4X3QgKnBGcmFtZSwKKwkJCQkgICAgdWludDMyX3QgbkZyYW1lLCB0cFNpclByb2JlUmVxIHBQcm9iZVJlcSkKK3sKKwl1aW50MzJfdCBzdGF0dXM7CisJdERvdDExZlByb2JlUmVxdWVzdCBwcjsKKworCS8qIE9rLCB6ZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBwUHJvYmVSZXEsIHNpemVvZih0U2lyUHJvYmVSZXEpLCAwKTsKKworCS8qIGRlbGVnYXRlIHRvIHRoZSBmcmFtZXNjLWdlbmVyYXRlZCBjb2RlLCAqLworCXN0YXR1cyA9IGRvdDExZl91bnBhY2tfcHJvYmVfcmVxdWVzdChwTWFjLCBwRnJhbWUsIG5GcmFtZSwgJnByKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJGYWlsZWQgdG8gcGFyc2UgYSBQcm9iZSBSZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGEgUHJvYmUgUmVxdWVzdCAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKwkJCXN0YXR1cywgbkZyYW1lKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOworCQkgICAgICAgKQorCX0KKwkvKiAmICJ0cmFuc2xpdGVyYXRlIiBmcm9tIGEgJ3REb3QxMWZQcm9iZVJlcXVlc3R0bycgYSAndFNpclByb2JlUmVxJy4uLiAqLworCWlmICghcHIuU1NJRC5wcmVzZW50KSB7CisJCVBFTE9HVyhsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR1csIEZMKCJNYW5kYXRvcnkgSUUgU1NJRCBub3QgcHJlc2VudCFcbiIpKTsKKwkJICAgICAgICkKKwl9IGVsc2UgeworCQlwUHJvYmVSZXEtPnNzaWRQcmVzZW50ID0gMTsKKwkJY29udmVydF9zc2lkKHBNYWMsICZwUHJvYmVSZXEtPnNzSWQsICZwci5TU0lEKTsKKwl9CisKKwlpZiAoIXByLlN1cHBSYXRlcy5wcmVzZW50KSB7CisJCVBFTE9HVyhsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR1csCisJCQkgICAgICAgRkwoIk1hbmRhdG9yeSBJRSBTdXBwb3J0ZWQgUmF0ZXMgbm90IHByZXNlbnQhXG4iKSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIHsKKwkJcFByb2JlUmVxLT5zdXBwUmF0ZXNQcmVzZW50ID0gMTsKKwkJY29udmVydF9zdXBwX3JhdGVzKHBNYWMsICZwUHJvYmVSZXEtPnN1cHBvcnRlZFJhdGVzLAorCQkJCSAgICZwci5TdXBwUmF0ZXMpOworCX0KKworCWlmIChwci5FeHRTdXBwUmF0ZXMucHJlc2VudCkgeworCQlwUHJvYmVSZXEtPmV4dGVuZGVkUmF0ZXNQcmVzZW50ID0gMTsKKwkJY29udmVydF9leHRfc3VwcF9yYXRlcyhwTWFjLCAmcFByb2JlUmVxLT5leHRlbmRlZFJhdGVzLAorCQkJCSAgICAgICAmcHIuRXh0U3VwcFJhdGVzKTsKKwl9CisKKwlpZiAocHIuSFRDYXBzLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwUHJvYmVSZXEtPkhUQ2FwcywgJnByLkhUQ2FwcywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRUhUQ2FwcykpOworCX0KKworCWlmIChwci5Xc2NQcm9iZVJlcS5wcmVzZW50KSB7CisJCXBQcm9iZVJlcS0+d3NjSWVQcmVzZW50ID0gMTsKKwkJbWVtY3B5KCZwUHJvYmVSZXEtPnByb2JlUmVxV3NjSWVJbmZvLCAmcHIuV3NjUHJvYmVSZXEsCisJCSAgICAgICBzaXplb2YodERvdDExZklFV3NjUHJvYmVSZXEpKTsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlpZiAocHIuVkhUQ2Fwcy5wcmVzZW50KSB7CisJCWNkZl9tZW1fY29weSgmcFByb2JlUmVxLT5WSFRDYXBzLCAmcHIuVkhUQ2FwcywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRVZIVENhcHMpKTsKKwl9CisjZW5kaWYKKworCWlmIChwci5QMlBQcm9iZVJlcS5wcmVzZW50KSB7CisJCXBQcm9iZVJlcS0+cDJwSWVQcmVzZW50ID0gMTsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qIEVuZCBzaXJfY29udmVydF9wcm9iZV9yZXFfZnJhbWUyX3N0cnVjdC4gKi8KKwordFNpclJldFN0YXR1cyBzaXJfY29udmVydF9wcm9iZV9mcmFtZTJfc3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHVpbnQ4X3QgKnBGcmFtZSwKKwkJCQkJICAgICAgdWludDMyX3QgbkZyYW1lLAorCQkJCQkgICAgICB0cFNpclByb2JlUmVzcEJlYWNvbiBwUHJvYmVSZXNwKQoreworCXVpbnQzMl90IHN0YXR1czsKKwl0RG90MTFmUHJvYmVSZXNwb25zZSAqcHI7CisKKwkvKiBPaywgemVyby1pbml0IG91ciBbb3V0XSBwYXJhbWV0ZXIsICovCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcFByb2JlUmVzcCwgc2l6ZW9mKHRTaXJQcm9iZVJlc3BCZWFjb24pLCAwKTsKKworCXByID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHREb3QxMWZQcm9iZVJlc3BvbnNlKSk7CisJaWYgKE5VTEwgPT0gcHIpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHByLCBzaXplb2YodERvdDExZlByb2JlUmVzcG9uc2UpLCAwKTsKKworCS8qIGRlbGVnYXRlIHRvIHRoZSBmcmFtZXNjLWdlbmVyYXRlZCBjb2RlLCAqLworCXN0YXR1cyA9IGRvdDExZl91bnBhY2tfcHJvYmVfcmVzcG9uc2UocE1hYywgcEZyYW1lLCBuRnJhbWUsIHByKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJGYWlsZWQgdG8gcGFyc2UgYSBQcm9iZSBSZXNwb25zZSAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKwkJCXN0YXR1cywgbkZyYW1lKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOworCQkgICAgICAgKQorCQljZGZfbWVtX2ZyZWUocHIpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMCisJCQkJKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHVucGFja2luZyBhIFByb2JlIFJlc3BvbnNlICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJfQorCS8qICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZlByb2JlUmVzcG9uc2UnIHRvIGEgJ3RTaXJQcm9iZVJlc3BCZWFjb24nLi4uICovCisKKwkvKiBUaW1lc3RhbXAgKi8KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcFByb2JlUmVzcC0+dGltZVN0YW1wLAorCQkgICAgICh1aW50OF90ICopICZwci0+VGltZVN0YW1wLCBzaXplb2YodFNpck1hY1RpbWVTdGFtcCkpOworCisJLyogQmVhY29uIEludGVydmFsICovCisJcFByb2JlUmVzcC0+YmVhY29uSW50ZXJ2YWwgPSBwci0+QmVhY29uSW50ZXJ2YWwuaW50ZXJ2YWw7CisKKwkvKiBDYXBhYmlsaXRpZXMgKi8KKwlwUHJvYmVSZXNwLT5jYXBhYmlsaXR5SW5mby5lc3MgPSBwci0+Q2FwYWJpbGl0aWVzLmVzczsKKwlwUHJvYmVSZXNwLT5jYXBhYmlsaXR5SW5mby5pYnNzID0gcHItPkNhcGFiaWxpdGllcy5pYnNzOworCXBQcm9iZVJlc3AtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbGFibGUgPSBwci0+Q2FwYWJpbGl0aWVzLmNmUG9sbGFibGU7CisJcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8uY2ZQb2xsUmVxID0gcHItPkNhcGFiaWxpdGllcy5jZlBvbGxSZXE7CisJcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8ucHJpdmFjeSA9IHByLT5DYXBhYmlsaXRpZXMucHJpdmFjeTsKKwlwUHJvYmVSZXNwLT5jYXBhYmlsaXR5SW5mby5zaG9ydFByZWFtYmxlID0KKwkJcHItPkNhcGFiaWxpdGllcy5zaG9ydFByZWFtYmxlOworCXBQcm9iZVJlc3AtPmNhcGFiaWxpdHlJbmZvLnBiY2MgPSBwci0+Q2FwYWJpbGl0aWVzLnBiY2M7CisJcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8uY2hhbm5lbEFnaWxpdHkgPQorCQlwci0+Q2FwYWJpbGl0aWVzLmNoYW5uZWxBZ2lsaXR5OworCXBQcm9iZVJlc3AtPmNhcGFiaWxpdHlJbmZvLnNwZWN0cnVtTWd0ID0gcHItPkNhcGFiaWxpdGllcy5zcGVjdHJ1bU1ndDsKKwlwUHJvYmVSZXNwLT5jYXBhYmlsaXR5SW5mby5xb3MgPSBwci0+Q2FwYWJpbGl0aWVzLnFvczsKKwlwUHJvYmVSZXNwLT5jYXBhYmlsaXR5SW5mby5zaG9ydFNsb3RUaW1lID0KKwkJcHItPkNhcGFiaWxpdGllcy5zaG9ydFNsb3RUaW1lOworCXBQcm9iZVJlc3AtPmNhcGFiaWxpdHlJbmZvLmFwc2QgPSBwci0+Q2FwYWJpbGl0aWVzLmFwc2Q7CisJcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8ucnJtID0gcHItPkNhcGFiaWxpdGllcy5ycm07CisJcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8uZHNzc09mZG0gPSBwci0+Q2FwYWJpbGl0aWVzLmRzc3NPZmRtOworCXBQcm9iZVJlc3AtPmNhcGFiaWxpdHlJbmZvLmRlbGF5ZWRCQSA9IHByLT5DYXBhYmlsaXRpZXMuZGVsYXllZEJBOworCXBQcm9iZVJlc3AtPmNhcGFiaWxpdHlJbmZvLmltbWVkaWF0ZUJBID0gcHItPkNhcGFiaWxpdGllcy5pbW1lZGlhdGVCQTsKKworCWlmICghcHItPlNTSUQucHJlc2VudCkgeworCQlQRUxPR1cobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dXLCBGTCgiTWFuZGF0b3J5IElFIFNTSUQgbm90IHByZXNlbnQhXG4iKSk7CisJCSAgICAgICApCisJfSBlbHNlIHsKKwkJcFByb2JlUmVzcC0+c3NpZFByZXNlbnQgPSAxOworCQljb252ZXJ0X3NzaWQocE1hYywgJnBQcm9iZVJlc3AtPnNzSWQsICZwci0+U1NJRCk7CisJfQorCisJaWYgKCFwci0+U3VwcFJhdGVzLnByZXNlbnQpIHsKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywKKwkJCSAgICAgICBGTCgiTWFuZGF0b3J5IElFIFN1cHBvcnRlZCBSYXRlcyBub3QgcHJlc2VudCFcbiIpKTsKKwkJICAgICAgICkKKwl9IGVsc2UgeworCQlwUHJvYmVSZXNwLT5zdXBwUmF0ZXNQcmVzZW50ID0gMTsKKwkJY29udmVydF9zdXBwX3JhdGVzKHBNYWMsICZwUHJvYmVSZXNwLT5zdXBwb3J0ZWRSYXRlcywKKwkJCQkgICAmcHItPlN1cHBSYXRlcyk7CisJfQorCisJaWYgKHByLT5FeHRTdXBwUmF0ZXMucHJlc2VudCkgeworCQlwUHJvYmVSZXNwLT5leHRlbmRlZFJhdGVzUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfZXh0X3N1cHBfcmF0ZXMocE1hYywgJnBQcm9iZVJlc3AtPmV4dGVuZGVkUmF0ZXMsCisJCQkJICAgICAgICZwci0+RXh0U3VwcFJhdGVzKTsKKwl9CisKKwlpZiAocHItPkNGUGFyYW1zLnByZXNlbnQpIHsKKwkJcFByb2JlUmVzcC0+Y2ZQcmVzZW50ID0gMTsKKwkJY29udmVydF9jZl9wYXJhbXMocE1hYywgJnBQcm9iZVJlc3AtPmNmUGFyYW1TZXQsICZwci0+Q0ZQYXJhbXMpOworCX0KKworCWlmIChwci0+Q291bnRyeS5wcmVzZW50KSB7CisJCXBQcm9iZVJlc3AtPmNvdW50cnlJbmZvUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfY291bnRyeShwTWFjLCAmcFByb2JlUmVzcC0+Y291bnRyeUluZm9QYXJhbSwKKwkJCQkmcHItPkNvdW50cnkpOworCX0KKworCWlmIChwci0+RURDQVBhcmFtU2V0LnByZXNlbnQpIHsKKwkJcFByb2JlUmVzcC0+ZWRjYVByZXNlbnQgPSAxOworCQljb252ZXJ0X2VkY2FfcGFyYW0ocE1hYywgJnBQcm9iZVJlc3AtPmVkY2FQYXJhbXMsCisJCQkJICAgJnByLT5FRENBUGFyYW1TZXQpOworCX0KKworCWlmIChwci0+Q2hhblN3aXRjaEFubi5wcmVzZW50KSB7CisJCXBQcm9iZVJlc3AtPmNoYW5uZWxTd2l0Y2hQcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZwUHJvYmVSZXNwLT5jaGFubmVsU3dpdGNoSUUsICZwci0+Q2hhblN3aXRjaEFubiwKKwkJCSAgICAgc2l6ZW9mKHBQcm9iZVJlc3AtPmNoYW5uZWxTd2l0Y2hJRSkpOworCX0KKworCWlmIChwci0+ZXh0X2NoYW5fc3dpdGNoX2Fubi5wcmVzZW50KSB7CisJCXBQcm9iZVJlc3AtPmV4dF9jaGFuX3N3aXRjaF9wcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZwUHJvYmVSZXNwLT5leHRfY2hhbl9zd2l0Y2gsCisJCQkgICAgICZwci0+ZXh0X2NoYW5fc3dpdGNoX2FubiwKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRWV4dF9jaGFuX3N3aXRjaF9hbm4pKTsKKwl9CisKKwlpZiAocHItPnNlY19jaGFuX29mZnNldF9lbGUucHJlc2VudCkgeworCQlwUHJvYmVSZXNwLT5zZWNfY2hhbl9vZmZzZXRfcHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcFByb2JlUmVzcC0+c2VjX2NoYW5fb2Zmc2V0LAorCQkJICAgICAmcHItPnNlY19jaGFuX29mZnNldF9lbGUsCisJCQkgICAgIHNpemVvZihwUHJvYmVSZXNwLT5zZWNfY2hhbl9vZmZzZXQpKTsKKwl9CisKKwlpZiAocHItPlRQQ1JlcG9ydC5wcmVzZW50KSB7CisJCXBQcm9iZVJlc3AtPnRwY1JlcG9ydFByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoJnBQcm9iZVJlc3AtPnRwY1JlcG9ydCwgJnByLT5UUENSZXBvcnQsCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVUUENSZXBvcnQpKTsKKwl9CisKKwlpZiAocHItPlBvd2VyQ29uc3RyYWludHMucHJlc2VudCkgeworCQlwUHJvYmVSZXNwLT5wb3dlckNvbnN0cmFpbnRQcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZwUHJvYmVSZXNwLT5sb2NhbFBvd2VyQ29uc3RyYWludCwKKwkJCSAgICAgJnByLT5Qb3dlckNvbnN0cmFpbnRzLAorCQkJICAgICBzaXplb2YodERvdDExZklFUG93ZXJDb25zdHJhaW50cykpOworCX0KKworCWlmIChwci0+UXVpZXQucHJlc2VudCkgeworCQlwUHJvYmVSZXNwLT5xdWlldElFUHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcFByb2JlUmVzcC0+cXVpZXRJRSwgJnByLT5RdWlldCwKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRVF1aWV0KSk7CisJfQorCisJaWYgKHByLT5IVENhcHMucHJlc2VudCkgeworCQljZGZfbWVtX2NvcHkoJnBQcm9iZVJlc3AtPkhUQ2FwcywgJnByLT5IVENhcHMsCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVIVENhcHMpKTsKKwl9CisKKwlpZiAocHItPkhUSW5mby5wcmVzZW50KSB7CisJCWNkZl9tZW1fY29weSgmcFByb2JlUmVzcC0+SFRJbmZvLCAmcHItPkhUSW5mbywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRUhUSW5mbykpOworCX0KKworCWlmIChwci0+RFNQYXJhbXMucHJlc2VudCkgeworCQlwUHJvYmVSZXNwLT5kc1BhcmFtc1ByZXNlbnQgPSAxOworCQlwUHJvYmVSZXNwLT5jaGFubmVsTnVtYmVyID0gcHItPkRTUGFyYW1zLmN1cnJfY2hhbm5lbDsKKwl9IGVsc2UgaWYgKHByLT5IVEluZm8ucHJlc2VudCkgeworCQlwUHJvYmVSZXNwLT5jaGFubmVsTnVtYmVyID0gcHItPkhUSW5mby5wcmltYXJ5Q2hhbm5lbDsKKwl9CisKKwlpZiAocHItPlJTTk9wYXF1ZS5wcmVzZW50KSB7CisJCXBQcm9iZVJlc3AtPnJzblByZXNlbnQgPSAxOworCQljb252ZXJ0X3Jzbl9vcGFxdWUocE1hYywgJnBQcm9iZVJlc3AtPnJzbiwgJnByLT5SU05PcGFxdWUpOworCX0KKworCWlmIChwci0+V1BBLnByZXNlbnQpIHsKKwkJcFByb2JlUmVzcC0+d3BhUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfd3BhKHBNYWMsICZwUHJvYmVSZXNwLT53cGEsICZwci0+V1BBKTsKKwl9CisKKwlpZiAocHItPldNTVBhcmFtcy5wcmVzZW50KSB7CisJCXBQcm9iZVJlc3AtPndtZUVkY2FQcmVzZW50ID0gMTsKKwkJY29udmVydF93bW1fcGFyYW1zKHBNYWMsICZwUHJvYmVSZXNwLT5lZGNhUGFyYW1zLCAmcHItPldNTVBhcmFtcyk7CisJCVBFTE9HMShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkgICAgICAgRkwoIldNTSBQYXJhbWV0ZXIgcHJlc2VudCBpbiBQcm9iZSBSZXNwb25zZSBGcmFtZSFcbiIpKTsKKwkJICAgICAgIF9fcHJpbnRfd21tX3BhcmFtcyhwTWFjLCAmcHItPldNTVBhcmFtcyk7CisJCSAgICAgICApCisJfQorCisJaWYgKHByLT5XTU1JbmZvQXAucHJlc2VudCkgeworCQlwUHJvYmVSZXNwLT53bWVJbmZvUHJlc2VudCA9IDE7CisJCVBFTE9HMShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzEsCisJCQkgICAgICAgRkwKKwkJCQkgICAgICAgKCJXTU0gSW5mb3JtYXRpb24gRWxlbWVudCBwcmVzZW50IGluIFByb2JlIFJlc3BvbnNlIEZyYW1lIVxuIikpOworCQkgICAgICAgKQorCX0KKworCWlmIChwci0+V01NQ2Fwcy5wcmVzZW50KSB7CisJCXBQcm9iZVJlc3AtPndzbUNhcGFibGVQcmVzZW50ID0gMTsKKwl9CisKKwlpZiAocHItPkVSUEluZm8ucHJlc2VudCkgeworCQlwUHJvYmVSZXNwLT5lcnBQcmVzZW50ID0gMTsKKwkJY29udmVydF9lcnBfaW5mbyhwTWFjLCAmcFByb2JlUmVzcC0+ZXJwSUVJbmZvLCAmcHItPkVSUEluZm8pOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWlmIChwci0+TW9iaWxpdHlEb21haW4ucHJlc2VudCkgeworCQkvKiBNb2JpbGl0eURvbWFpbiAqLworCQlwUHJvYmVSZXNwLT5tZGllUHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmKHBQcm9iZVJlc3AtPm1kaWVbMF0pLAorCQkJICAgICAodWludDhfdCAqKSAmKHByLT5Nb2JpbGl0eURvbWFpbi5NRElEKSwKKwkJCSAgICAgc2l6ZW9mKHVpbnQxNl90KSk7CisJCXBQcm9iZVJlc3AtPm1kaWVbMl0gPQorCQkJKChwci0+TW9iaWxpdHlEb21haW4ub3ZlckRTQ2FwIDw8IDApIHwgKHByLT5Nb2JpbGl0eURvbWFpbi4KKwkJCQkJCQkJcmVzb3VyY2VSZXFDYXAgPDwKKwkJCQkJCQkJMSkpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCWxpbV9sb2cocE1hYywgTE9HMiwgRkwoIm1kaWU9JTAyeCUwMnglMDJ4XG4iKSwKKwkJCSh1bnNpZ25lZCBpbnQpcFByb2JlUmVzcC0+bWRpZVswXSwKKwkJCSh1bnNpZ25lZCBpbnQpcFByb2JlUmVzcC0+bWRpZVsxXSwKKwkJCSh1bnNpZ25lZCBpbnQpcFByb2JlUmVzcC0+bWRpZVsyXSk7CisjZW5kaWYKKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0VTRQorCWlmIChwci0+RVNFVmVyc2lvbi5wcmVzZW50KQorCQlwUHJvYmVSZXNwLT5pc19lc2VfdmVyX2llX3ByZXNlbnQgPSAxOworCWlmIChwci0+UUJTU0xvYWQucHJlc2VudCkgeworCQljZGZfbWVtX2NvcHkoJnBQcm9iZVJlc3AtPlFCU1NMb2FkLCAmcHItPlFCU1NMb2FkLAorCQkJICAgICBzaXplb2YodERvdDExZklFUUJTU0xvYWQpKTsKKwl9CisjZW5kaWYKKwlpZiAocHItPlAyUFByb2JlUmVzLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwUHJvYmVSZXNwLT5QMlBQcm9iZVJlcywgJnByLT5QMlBQcm9iZVJlcywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRVAyUFByb2JlUmVzKSk7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKHByLT5WSFRDYXBzLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwUHJvYmVSZXNwLT5WSFRDYXBzLCAmcHItPlZIVENhcHMsCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVWSFRDYXBzKSk7CisJfQorCWlmIChwci0+VkhUT3BlcmF0aW9uLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwUHJvYmVSZXNwLT5WSFRPcGVyYXRpb24sICZwci0+VkhUT3BlcmF0aW9uLAorCQkJICAgICBzaXplb2YodERvdDExZklFVkhUT3BlcmF0aW9uKSk7CisJfQorCWlmIChwci0+VkhURXh0QnNzTG9hZC5wcmVzZW50KSB7CisJCWNkZl9tZW1fY29weSgmcFByb2JlUmVzcC0+VkhURXh0QnNzTG9hZCwgJnByLT5WSFRFeHRCc3NMb2FkLAorCQkJICAgICBzaXplb2YodERvdDExZklFVkhURXh0QnNzTG9hZCkpOworCX0KKyNlbmRpZgorCXBQcm9iZVJlc3AtPlZlbmRvcjFJRVByZXNlbnQgPSBwci0+VmVuZG9yMUlFLnByZXNlbnQ7CisJcFByb2JlUmVzcC0+VmVuZG9yM0lFUHJlc2VudCA9IHByLT5WZW5kb3IzSUUucHJlc2VudDsKKworCXBQcm9iZVJlc3AtPnZlbmRvcjJfaWUucHJlc2VudCA9IHByLT52ZW5kb3IyX2llLnByZXNlbnQ7CisJaWYgKHByLT52ZW5kb3IyX2llLnByZXNlbnQpIHsKKwkJcFByb2JlUmVzcC0+dmVuZG9yMl9pZS50eXBlID0gcHItPnZlbmRvcjJfaWUudHlwZTsKKwkJcFByb2JlUmVzcC0+dmVuZG9yMl9pZS5zdWJfdHlwZSA9IHByLT52ZW5kb3IyX2llLnN1Yl90eXBlOworCX0KKwlpZiAocHItPnZlbmRvcjJfaWUuVkhUQ2Fwcy5wcmVzZW50KSB7CisJCWNkZl9tZW1fY29weSgmcFByb2JlUmVzcC0+dmVuZG9yMl9pZS5WSFRDYXBzLAorCQkJCSZwci0+dmVuZG9yMl9pZS5WSFRDYXBzLAorCQkJCXNpemVvZih0RG90MTFmSUVWSFRDYXBzKSk7CisJfQorCWlmIChwci0+dmVuZG9yMl9pZS5WSFRPcGVyYXRpb24ucHJlc2VudCkgeworCQljZGZfbWVtX2NvcHkoJnBQcm9iZVJlc3AtPnZlbmRvcjJfaWUuVkhUT3BlcmF0aW9uLAorCQkJCSZwci0+dmVuZG9yMl9pZS5WSFRPcGVyYXRpb24sCisJCQkJc2l6ZW9mKHREb3QxMWZJRVZIVE9wZXJhdGlvbikpOworCX0KKwljZGZfbWVtX2ZyZWUocHIpOworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHNpcl9jb252ZXJ0X3Byb2JlX2ZyYW1lMl9zdHJ1Y3QuICovCisKK3RTaXJSZXRTdGF0dXMKK3Npcl9jb252ZXJ0X2Fzc29jX3JlcV9mcmFtZTJfc3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgIHVpbnQ4X3QgKnBGcmFtZSwKKwkJCQkgICAgdWludDMyX3QgbkZyYW1lLCB0cFNpckFzc29jUmVxIHBBc3NvY1JlcSkKK3sKKwl0RG90MTFmQXNzb2NSZXF1ZXN0ICphcjsKKwl1aW50MzJfdCBzdGF0dXM7CisKKwlhciA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0RG90MTFmQXNzb2NSZXF1ZXN0KSk7CisJaWYgKE5VTEwgPT0gYXIpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikpOworCQlyZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCX0KKwkvKiBaZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBwQXNzb2NSZXEsIHNpemVvZih0U2lyQXNzb2NSZXEpLCAwKTsKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBhciwgc2l6ZW9mKHREb3QxMWZBc3NvY1JlcXVlc3QpLCAwKTsKKworCS8qIGRlbGVnYXRlIHRvIHRoZSBmcmFtZXNjLWdlbmVyYXRlZCBjb2RlLCAqLworCXN0YXR1cyA9IGRvdDExZl91bnBhY2tfYXNzb2NfcmVxdWVzdChwTWFjLCBwRnJhbWUsIG5GcmFtZSwgYXIpOworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIkZhaWxlZCB0byBwYXJzZSBhbiBBc3NvY2lhdGlvbiBSZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJCWNkZl9tZW1fZnJlZShhcik7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGFuIEFzc29pY2F0aW9uIFJlcXVlc3QgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisJCQlzdGF0dXMsIG5GcmFtZSk7CisJCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTsKKwkJICAgICAgICkKKwl9CisJLyogJiAidHJhbnNsaXRlcmF0ZSIgZnJvbSBhICd0RG90MTFmQXNzb2NSZXF1ZXN0JyB0byBhICd0U2lyQXNzb2NSZXEnLi4uICovCisKKwkvKiBtYWtlIHN1cmUgdGhpcyBpcyBzZWVuIGFzIGFuIGFzc29jIHJlcXVlc3QgKi8KKwlwQXNzb2NSZXEtPnJlYXNzb2NSZXF1ZXN0ID0gMDsKKworCS8qIENhcGFiaWxpdGllcyAqLworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uZXNzID0gYXItPkNhcGFiaWxpdGllcy5lc3M7CisJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5pYnNzID0gYXItPkNhcGFiaWxpdGllcy5pYnNzOworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uY2ZQb2xsYWJsZSA9IGFyLT5DYXBhYmlsaXRpZXMuY2ZQb2xsYWJsZTsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbFJlcSA9IGFyLT5DYXBhYmlsaXRpZXMuY2ZQb2xsUmVxOworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8ucHJpdmFjeSA9IGFyLT5DYXBhYmlsaXRpZXMucHJpdmFjeTsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnNob3J0UHJlYW1ibGUgPQorCQlhci0+Q2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGU7CisJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5wYmNjID0gYXItPkNhcGFiaWxpdGllcy5wYmNjOworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uY2hhbm5lbEFnaWxpdHkgPQorCQlhci0+Q2FwYWJpbGl0aWVzLmNoYW5uZWxBZ2lsaXR5OworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uc3BlY3RydW1NZ3QgPSBhci0+Q2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0OworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8ucW9zID0gYXItPkNhcGFiaWxpdGllcy5xb3M7CisJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5zaG9ydFNsb3RUaW1lID0KKwkJYXItPkNhcGFiaWxpdGllcy5zaG9ydFNsb3RUaW1lOworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uYXBzZCA9IGFyLT5DYXBhYmlsaXRpZXMuYXBzZDsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnJybSA9IGFyLT5DYXBhYmlsaXRpZXMucnJtOworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uZHNzc09mZG0gPSBhci0+Q2FwYWJpbGl0aWVzLmRzc3NPZmRtOworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uZGVsYXllZEJBID0gYXItPkNhcGFiaWxpdGllcy5kZWxheWVkQkE7CisJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5pbW1lZGlhdGVCQSA9IGFyLT5DYXBhYmlsaXRpZXMuaW1tZWRpYXRlQkE7CisKKwkvKiBMaXN0ZW4gSW50ZXJ2YWwgKi8KKwlwQXNzb2NSZXEtPmxpc3RlbkludGVydmFsID0gYXItPkxpc3RlbkludGVydmFsLmludGVydmFsOworCisJLyogU1NJRCAqLworCWlmIChhci0+U1NJRC5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+c3NpZFByZXNlbnQgPSAxOworCQljb252ZXJ0X3NzaWQocE1hYywgJnBBc3NvY1JlcS0+c3NJZCwgJmFyLT5TU0lEKTsKKwl9CisJLyogU3VwcG9ydGVkIFJhdGVzICovCisJaWYgKGFyLT5TdXBwUmF0ZXMucHJlc2VudCkgeworCQlwQXNzb2NSZXEtPnN1cHBSYXRlc1ByZXNlbnQgPSAxOworCQljb252ZXJ0X3N1cHBfcmF0ZXMocE1hYywgJnBBc3NvY1JlcS0+c3VwcG9ydGVkUmF0ZXMsCisJCQkJICAgJmFyLT5TdXBwUmF0ZXMpOworCX0KKwkvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KKwlpZiAoYXItPkV4dFN1cHBSYXRlcy5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+ZXh0ZW5kZWRSYXRlc1ByZXNlbnQgPSAxOworCQljb252ZXJ0X2V4dF9zdXBwX3JhdGVzKHBNYWMsICZwQXNzb2NSZXEtPmV4dGVuZGVkUmF0ZXMsCisJCQkJICAgICAgICZhci0+RXh0U3VwcFJhdGVzKTsKKwl9CisJLyogUU9TIENhcGFiaWxpdGllczogKi8KKwlpZiAoYXItPlFPU0NhcHNTdGF0aW9uLnByZXNlbnQpIHsKKwkJcEFzc29jUmVxLT5xb3NDYXBhYmlsaXR5UHJlc2VudCA9IDE7CisJCWNvbnZlcnRfcW9zX2NhcHNfc3RhdGlvbihwTWFjLCAmcEFzc29jUmVxLT5xb3NDYXBhYmlsaXR5LAorCQkJCQkgJmFyLT5RT1NDYXBzU3RhdGlvbik7CisJfQorCS8qIFdQQSAqLworCWlmIChhci0+V1BBT3BhcXVlLnByZXNlbnQpIHsKKwkJcEFzc29jUmVxLT53cGFQcmVzZW50ID0gMTsKKwkJY29udmVydF93cGFfb3BhcXVlKHBNYWMsICZwQXNzb2NSZXEtPndwYSwgJmFyLT5XUEFPcGFxdWUpOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCWlmIChhci0+V0FQSU9wYXF1ZS5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+d2FwaVByZXNlbnQgPSAxOworCQljb252ZXJ0X3dhcGlfb3BhcXVlKHBNYWMsICZwQXNzb2NSZXEtPndhcGksICZhci0+V0FQSU9wYXF1ZSk7CisJfQorI2VuZGlmCisJLyogUlNOICovCisJaWYgKGFyLT5SU05PcGFxdWUucHJlc2VudCkgeworCQlwQXNzb2NSZXEtPnJzblByZXNlbnQgPSAxOworCQljb252ZXJ0X3Jzbl9vcGFxdWUocE1hYywgJnBBc3NvY1JlcS0+cnNuLCAmYXItPlJTTk9wYXF1ZSk7CisJfQorCS8qIFdTQyBJRSAqLworCWlmIChhci0+V3NjSUVPcGFxdWUucHJlc2VudCkgeworCQlwQXNzb2NSZXEtPmFkZElFUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfd3NjX29wYXF1ZShwTWFjLCAmcEFzc29jUmVxLT5hZGRJRSwgJmFyLT5Xc2NJRU9wYXF1ZSk7CisJfQorCisJaWYgKGFyLT5QMlBJRU9wYXF1ZS5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+YWRkSUVQcmVzZW50ID0gMTsKKwkJY29udmVydF9wMnBfb3BhcXVlKHBNYWMsICZwQXNzb2NSZXEtPmFkZElFLCAmYXItPlAyUElFT3BhcXVlKTsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1dGRAorCWlmIChhci0+V0ZESUVPcGFxdWUucHJlc2VudCkgeworCQlwQXNzb2NSZXEtPmFkZElFUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfd2ZkX29wYXF1ZShwTWFjLCAmcEFzc29jUmVxLT5hZGRJRSwgJmFyLT5XRkRJRU9wYXF1ZSk7CisJfQorI2VuZGlmCisKKwkvKiBQb3dlciBDYXBhYmlsaXRpZXMgKi8KKwlpZiAoYXItPlBvd2VyQ2Fwcy5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+cG93ZXJDYXBhYmlsaXR5UHJlc2VudCA9IDE7CisJCWNvbnZlcnRfcG93ZXJfY2FwcyhwTWFjLCAmcEFzc29jUmVxLT5wb3dlckNhcGFiaWxpdHksCisJCQkJICAgJmFyLT5Qb3dlckNhcHMpOworCX0KKwkvKiBTdXBwb3J0ZWQgQ2hhbm5lbHMgKi8KKwlpZiAoYXItPlN1cHBDaGFubmVscy5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+c3VwcG9ydGVkQ2hhbm5lbHNQcmVzZW50ID0gMTsKKwkJY29udmVydF9zdXBwX2NoYW5uZWxzKHBNYWMsICZwQXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzLAorCQkJCSAgICAgICZhci0+U3VwcENoYW5uZWxzKTsKKwl9CisKKwlpZiAoYXItPkhUQ2Fwcy5wcmVzZW50KSB7CisJCWNkZl9tZW1fY29weSgmcEFzc29jUmVxLT5IVENhcHMsICZhci0+SFRDYXBzLAorCQkJICAgICBzaXplb2YodERvdDExZklFSFRDYXBzKSk7CisJfQorCisJaWYgKGFyLT5XTU1JbmZvU3RhdGlvbi5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+d21lSW5mb1ByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoJnBBc3NvY1JlcS0+V01NSW5mb1N0YXRpb24sICZhci0+V01NSW5mb1N0YXRpb24sCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVXTU1JbmZvU3RhdGlvbikpOworCisJfQorCisJaWYgKGFyLT5XTU1DYXBzLnByZXNlbnQpCisJCXBBc3NvY1JlcS0+d3NtQ2FwYWJsZVByZXNlbnQgPSAxOworCisJaWYgKCFwQXNzb2NSZXEtPnNzaWRQcmVzZW50KSB7CisJCVBFTE9HMihsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzIsIEZMKCJSZWNlaXZlZCBBc3NvYyB3aXRob3V0IFNTSUQgSUUuXG4iKSk7CisJCSAgICAgICApCisJCWNkZl9tZW1fZnJlZShhcik7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJaWYgKCFwQXNzb2NSZXEtPnN1cHBSYXRlc1ByZXNlbnQgJiYgIXBBc3NvY1JlcS0+ZXh0ZW5kZWRSYXRlc1ByZXNlbnQpIHsKKwkJUEVMT0cyKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HMiwKKwkJCSAgICAgICBGTCgiUmVjZWl2ZWQgQXNzb2Mgd2l0aG91dCBzdXBwIHJhdGUgSUUuXG4iKSk7CisJCSAgICAgICApCisJCWNkZl9tZW1fZnJlZShhcik7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKGFyLT5WSFRDYXBzLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSZXEtPlZIVENhcHMsICZhci0+VkhUQ2FwcywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRVZIVENhcHMpKTsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiUmVjZWl2ZWQgQXNzb2MgUmVxIHdpdGggVkhUIENhcFxuIikpOworCQlsaW1fbG9nX3ZodF9jYXAocE1hYywgJnBBc3NvY1JlcS0+VkhUQ2Fwcyk7CisJfQorCWlmIChhci0+T3BlcmF0aW5nTW9kZS5wcmVzZW50KSB7CisJCWNkZl9tZW1fY29weSgmcEFzc29jUmVxLT5vcGVyTW9kZSwgJmFyLT5PcGVyYXRpbmdNb2RlLAorCQkJICAgICBzaXplb2YodERvdDExZklFT3BlcmF0aW5nTW9kZSkpOworCQlsaW1fbG9nKHBNYWMsIExPR1csCisJCQlGTCgiUmVjZWl2ZWQgQXNzb2MgUmVxIHdpdGggT3BlcmF0aW5nIE1vZGUgSUVcbiIpKTsKKwkJbGltX2xvZ19vcGVyYXRpbmdfbW9kZShwTWFjLCAmcEFzc29jUmVxLT5vcGVyTW9kZSk7CisJfQorI2VuZGlmCisJaWYgKGFyLT5FeHRDYXAucHJlc2VudCkgeworCQlzdHJ1Y3Qgc19leHRfY2FwICpleHRfY2FwOworCQljZGZfbWVtX2NvcHkoJnBBc3NvY1JlcS0+RXh0Q2FwLmJ5dGVzLCAmYXItPkV4dENhcC5ieXRlcywKKwkJCSAgICAgYXItPkV4dENhcC5udW1fYnl0ZXMpOworCisJCWV4dF9jYXAgPSAoc3RydWN0IHNfZXh0X2NhcCAqKSZwQXNzb2NSZXEtPkV4dENhcC5ieXRlczsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoInRpbWluZ01lYXM6ICVkLCBmaW5ldGltaW5nTWVhcyBJbml0OiAlZCwgUmVzcDogJWQiKSwKKwkJCWV4dF9jYXAtPnRpbWluZ19tZWFzLCBleHRfY2FwLT5maW5lX3RpbWVfbWVhc19pbml0aWF0b3IsCisJCQlleHRfY2FwLT5maW5lX3RpbWVfbWVhc19yZXNwb25kZXIpOworCX0KKwljZGZfbWVtX2ZyZWUoYXIpOworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHNpcl9jb252ZXJ0X2Fzc29jX3JlcV9mcmFtZTJfc3RydWN0LiAqLworCit0U2lyUmV0U3RhdHVzCitzaXJfY29udmVydF9hc3NvY19yZXNwX2ZyYW1lMl9zdHJ1Y3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgIHVpbnQ4X3QgKnBGcmFtZSwKKwkJCQkgICAgIHVpbnQzMl90IG5GcmFtZSwgdHBTaXJBc3NvY1JzcCBwQXNzb2NSc3ApCit7CisJc3RhdGljIHREb3QxMWZBc3NvY1Jlc3BvbnNlIGFyOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50OF90IGNudCA9IDA7CisKKwkvKiBaZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBwQXNzb2NSc3AsIHNpemVvZih0U2lyQXNzb2NSc3ApLCAwKTsKKworCS8qIGRlbGVnYXRlIHRvIHRoZSBmcmFtZXNjLWdlbmVyYXRlZCBjb2RlLCAqLworCXN0YXR1cyA9IGRvdDExZl91bnBhY2tfYXNzb2NfcmVzcG9uc2UocE1hYywgcEZyYW1lLCBuRnJhbWUsICZhcik7CisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkJCSgiRmFpbGVkIHRvIHBhcnNlIGFuIEFzc29jaWF0aW9uIFJlc3BvbnNlICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGFuIEFzc29jaWF0aW9uIFJlc3BvbnNlICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJfQorCS8qICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZkFzc29jUmVzcG9uc2UnIGEgJ3RTaXJBc3NvY1JzcCcuLi4gKi8KKworCS8qIENhcGFiaWxpdGllcyAqLworCXBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8uZXNzID0gYXIuQ2FwYWJpbGl0aWVzLmVzczsKKwlwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLmlic3MgPSBhci5DYXBhYmlsaXRpZXMuaWJzczsKKwlwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbGFibGUgPSBhci5DYXBhYmlsaXRpZXMuY2ZQb2xsYWJsZTsKKwlwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbFJlcSA9IGFyLkNhcGFiaWxpdGllcy5jZlBvbGxSZXE7CisJcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5wcml2YWN5ID0gYXIuQ2FwYWJpbGl0aWVzLnByaXZhY3k7CisJcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5zaG9ydFByZWFtYmxlID0gYXIuQ2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGU7CisJcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5wYmNjID0gYXIuQ2FwYWJpbGl0aWVzLnBiY2M7CisJcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5jaGFubmVsQWdpbGl0eSA9CisJCWFyLkNhcGFiaWxpdGllcy5jaGFubmVsQWdpbGl0eTsKKwlwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLnNwZWN0cnVtTWd0ID0gYXIuQ2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0OworCXBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8ucW9zID0gYXIuQ2FwYWJpbGl0aWVzLnFvczsKKwlwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWUgPSBhci5DYXBhYmlsaXRpZXMuc2hvcnRTbG90VGltZTsKKwlwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLmFwc2QgPSBhci5DYXBhYmlsaXRpZXMuYXBzZDsKKwlwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLnJybSA9IGFyLkNhcGFiaWxpdGllcy5ycm07CisJcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5kc3NzT2ZkbSA9IGFyLkNhcGFiaWxpdGllcy5kc3NzT2ZkbTsKKwlwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLmRlbGF5ZWRCQSA9IGFyLkNhcGFiaWxpdGllcy5kZWxheWVkQkE7CisJcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5pbW1lZGlhdGVCQSA9IGFyLkNhcGFiaWxpdGllcy5pbW1lZGlhdGVCQTsKKworCXBBc3NvY1JzcC0+c3RhdHVzQ29kZSA9IGFyLlN0YXR1cy5zdGF0dXM7CisJcEFzc29jUnNwLT5haWQgPSBhci5BSUQuYXNzb2NpZDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJaWYgKGFyLlRpbWVvdXRJbnRlcnZhbC5wcmVzZW50KSB7CisJCXBBc3NvY1JzcC0+VGltZW91dEludGVydmFsLnByZXNlbnQgPSAxOworCQlwQXNzb2NSc3AtPlRpbWVvdXRJbnRlcnZhbC50aW1lb3V0VHlwZSA9CisJCQlhci5UaW1lb3V0SW50ZXJ2YWwudGltZW91dFR5cGU7CisJCXBBc3NvY1JzcC0+VGltZW91dEludGVydmFsLnRpbWVvdXRWYWx1ZSA9CisJCQlhci5UaW1lb3V0SW50ZXJ2YWwudGltZW91dFZhbHVlOworCX0KKyNlbmRpZgorCisJaWYgKCFhci5TdXBwUmF0ZXMucHJlc2VudCkgeworCQlwQXNzb2NSc3AtPnN1cHBSYXRlc1ByZXNlbnQgPSAwOworCQlQRUxPR1cobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJICAgICAgIEZMKCJNYW5kYXRvcnkgSUUgU3VwcG9ydGVkIFJhdGVzIG5vdCBwcmVzZW50IVxuIikpOworCQkgICAgICAgKQorCX0gZWxzZSB7CisJCXBBc3NvY1JzcC0+c3VwcFJhdGVzUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfc3VwcF9yYXRlcyhwTWFjLCAmcEFzc29jUnNwLT5zdXBwb3J0ZWRSYXRlcywKKwkJCQkgICAmYXIuU3VwcFJhdGVzKTsKKwl9CisKKwlpZiAoYXIuRXh0U3VwcFJhdGVzLnByZXNlbnQpIHsKKwkJcEFzc29jUnNwLT5leHRlbmRlZFJhdGVzUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfZXh0X3N1cHBfcmF0ZXMocE1hYywgJnBBc3NvY1JzcC0+ZXh0ZW5kZWRSYXRlcywKKwkJCQkgICAgICAgJmFyLkV4dFN1cHBSYXRlcyk7CisJfQorCisJaWYgKGFyLkVEQ0FQYXJhbVNldC5wcmVzZW50KSB7CisJCXBBc3NvY1JzcC0+ZWRjYVByZXNlbnQgPSAxOworCQljb252ZXJ0X2VkY2FfcGFyYW0ocE1hYywgJnBBc3NvY1JzcC0+ZWRjYSwgJmFyLkVEQ0FQYXJhbVNldCk7CisJfQorCisJaWYgKGFyLldNTVBhcmFtcy5wcmVzZW50KSB7CisJCXBBc3NvY1JzcC0+d21lRWRjYVByZXNlbnQgPSAxOworCQljb252ZXJ0X3dtbV9wYXJhbXMocE1hYywgJnBBc3NvY1JzcC0+ZWRjYSwgJmFyLldNTVBhcmFtcyk7CisJCWxpbV9sb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIEFzc29jIFJlc3Agd2l0aCBXTU0gUGFyYW0iKSk7CisJCV9fcHJpbnRfd21tX3BhcmFtcyhwTWFjLCAmYXIuV01NUGFyYW1zKTsKKwl9CisKKwlpZiAoYXIuSFRDYXBzLnByZXNlbnQpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiUmVjZWl2ZWQgQXNzb2MgUmVzcCB3aXRoIEhUIENhcCIpKTsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSc3AtPkhUQ2FwcywgJmFyLkhUQ2FwcywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRUhUQ2FwcykpOworCX0KKworCWlmIChhci5IVEluZm8ucHJlc2VudCkgeworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBBc3NvYyBSZXNwIHdpdGggSFQgSW5mbyIpKTsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSc3AtPkhUSW5mbywgJmFyLkhUSW5mbywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRUhUSW5mbykpOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWlmIChhci5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KSB7CisJCS8qIE1vYmlsaXR5RG9tYWluICovCisJCXBBc3NvY1JzcC0+bWRpZVByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJihwQXNzb2NSc3AtPm1kaWVbMF0pLAorCQkJICAgICAodWludDhfdCAqKSAmKGFyLk1vYmlsaXR5RG9tYWluLk1ESUQpLAorCQkJICAgICBzaXplb2YodWludDE2X3QpKTsKKwkJcEFzc29jUnNwLT5tZGllWzJdID0KKwkJCSgoYXIuTW9iaWxpdHlEb21haW4ub3ZlckRTQ2FwIDw8IDApIHwgKGFyLk1vYmlsaXR5RG9tYWluLgorCQkJCQkJCSAgICAgICByZXNvdXJjZVJlcUNhcCA8PAorCQkJCQkJCSAgICAgICAxKSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgibmV3IG1kaWU9JTAyeCUwMnglMDJ4IiksCisJCQkodW5zaWduZWQgaW50KXBBc3NvY1JzcC0+bWRpZVswXSwKKwkJCSh1bnNpZ25lZCBpbnQpcEFzc29jUnNwLT5tZGllWzFdLAorCQkJKHVuc2lnbmVkIGludClwQXNzb2NSc3AtPm1kaWVbMl0pOworI2VuZGlmCisJfQorCisJaWYgKGFyLkZUSW5mby5wcmVzZW50KSB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwkJbGltX2xvZyhwTWFjLCBMT0cxLCBGTCgiRlQgSW5mbyBwcmVzZW50ICVkICVkICVkIiksCisJCQlhci5GVEluZm8uUjBLSF9JRC5udW1fUE1LX1IwX0lELAorCQkJYXIuRlRJbmZvLlIwS0hfSUQucHJlc2VudCwgYXIuRlRJbmZvLlIxS0hfSUQucHJlc2VudCk7CisjZW5kaWYKKwkJcEFzc29jUnNwLT5mdGluZm9QcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSc3AtPkZUSW5mbywgJmFyLkZUSW5mbywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRUZUSW5mbykpOworCX0KKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAoYXIubnVtX1JJQ0RhdGFEZXNjKSB7CisJCWZvciAoY250ID0gMDsgY250IDwgYXIubnVtX1JJQ0RhdGFEZXNjOyBjbnQrKykgeworCQkJaWYgKGFyLlJJQ0RhdGFEZXNjW2NudF0ucHJlc2VudCkgeworCQkJCWNkZl9tZW1fY29weSgmcEFzc29jUnNwLT5SSUNEYXRhW2NudF0sCisJCQkJCSAgICAgJmFyLlJJQ0RhdGFEZXNjW2NudF0sCisJCQkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjKSk7CisJCQl9CisJCX0KKwkJcEFzc29jUnNwLT5udW1fUklDRGF0YSA9IGFyLm51bV9SSUNEYXRhRGVzYzsKKwkJcEFzc29jUnNwLT5yaWNQcmVzZW50ID0gdHJ1ZTsKKwl9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwlpZiAoYXIubnVtX1dNTVRTUEVDKSB7CisJCXBBc3NvY1JzcC0+bnVtX3RzcGVjcyA9IGFyLm51bV9XTU1UU1BFQzsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBhci5udW1fV01NVFNQRUM7IGNudCsrKSB7CisJCQljZGZfbWVtX2NvcHkoJnBBc3NvY1JzcC0+VFNQRUNJbmZvW2NudF0sCisJCQkJICAgICAmYXIuV01NVFNQRUNbY250XSwKKwkJCQkgICAgIChzaXplb2YodERvdDExZklFV01NVFNQRUMpICoKKwkJCQkgICAgICBhci5udW1fV01NVFNQRUMpKTsKKwkJfQorCQlwQXNzb2NSc3AtPnRzcGVjUHJlc2VudCA9IHRydWU7CisJfQorCisJaWYgKGFyLkVTRVRyYWZTdHJtTWV0LnByZXNlbnQpIHsKKwkJcEFzc29jUnNwLT50c21QcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSc3AtPnRzbUlFLnRzaWQsCisJCQkgICAgICZhci5FU0VUcmFmU3RybU1ldC50c2lkLCBzaXplb2YodFNpck1hY0VTRVRTTUlFKSk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmIChhci5WSFRDYXBzLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSc3AtPlZIVENhcHMsICZhci5WSFRDYXBzLAorCQkJICAgICBzaXplb2YodERvdDExZklFVkhUQ2FwcykpOworCQlsaW1fbG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBBc3NvYyBSZXNwb25zZSB3aXRoIFZIVCBDYXAiKSk7CisJCWxpbV9sb2dfdmh0X2NhcChwTWFjLCAmcEFzc29jUnNwLT5WSFRDYXBzKTsKKwl9CisJaWYgKGFyLlZIVE9wZXJhdGlvbi5wcmVzZW50KSB7CisJCWNkZl9tZW1fY29weSgmcEFzc29jUnNwLT5WSFRPcGVyYXRpb24sICZhci5WSFRPcGVyYXRpb24sCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVWSFRPcGVyYXRpb24pKTsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIlJlY2VpdmVkIEFzc29jIFJlc3BvbnNlIHdpdGggVkhUIE9wZXJhdGlvbiIpKTsKKwkJbGltX2xvZ192aHRfb3BlcmF0aW9uKHBNYWMsICZwQXNzb2NSc3AtPlZIVE9wZXJhdGlvbik7CisJfQorI2VuZGlmCisKKwlpZiAoYXIuRXh0Q2FwLnByZXNlbnQpIHsKKwkJc3RydWN0IHNfZXh0X2NhcCAqZXh0X2NhcDsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSc3AtPkV4dENhcC5ieXRlcywgJmFyLkV4dENhcC5ieXRlcywKKwkJCSAgICAgYXIuRXh0Q2FwLm51bV9ieXRlcyk7CisKKwkJZXh0X2NhcCA9IChzdHJ1Y3Qgc19leHRfY2FwICopJnBBc3NvY1JzcC0+RXh0Q2FwLmJ5dGVzOworCQlsaW1fbG9nKHBNYWMsIExPRzEsCisJCQlGTCgidGltaW5nTWVhczogJWQsIGZpbmV0aW1pbmdNZWFzIEluaXQ6ICVkLCBSZXNwOiAlZCIpLAorCQkJZXh0X2NhcC0+dGltaW5nX21lYXMsIGV4dF9jYXAtPmZpbmVfdGltZV9tZWFzX2luaXRpYXRvciwKKwkJCWV4dF9jYXAtPmZpbmVfdGltZV9tZWFzX3Jlc3BvbmRlcik7CisJfQorCisJaWYgKGFyLlFvc01hcFNldC5wcmVzZW50KSB7CisJCXBBc3NvY1JzcC0+UW9zTWFwU2V0LnByZXNlbnQgPSAxOworCQljb252ZXJ0X3Fvc19tYXBzZXRfZnJhbWUocE1hYywgJnBBc3NvY1JzcC0+UW9zTWFwU2V0LAorCQkJCQkgJmFyLlFvc01hcFNldCk7CisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCUZMKCJSZWNlaXZlZCBBc3NvYyBSZXNwb25zZSB3aXRoIFFvcyBNYXAgU2V0IikpOworCQlsaW1fbG9nX3Fvc19tYXBfc2V0KHBNYWMsICZwQXNzb2NSc3AtPlFvc01hcFNldCk7CisJfQorCisJcEFzc29jUnNwLT52ZW5kb3IyX2llLnByZXNlbnQgPSBhci52ZW5kb3IyX2llLnByZXNlbnQ7CisJaWYgKGFyLnZlbmRvcjJfaWUucHJlc2VudCkgeworCQlwQXNzb2NSc3AtPnZlbmRvcjJfaWUudHlwZSA9IGFyLnZlbmRvcjJfaWUudHlwZTsKKwkJcEFzc29jUnNwLT52ZW5kb3IyX2llLnN1Yl90eXBlID0gYXIudmVuZG9yMl9pZS5zdWJfdHlwZTsKKwl9CisKKwlpZiAoYXIudmVuZG9yMl9pZS5WSFRDYXBzLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSc3AtPnZlbmRvcjJfaWUuVkhUQ2FwcywKKwkJCQkmYXIudmVuZG9yMl9pZS5WSFRDYXBzLAorCQkJCXNpemVvZih0RG90MTFmSUVWSFRDYXBzKSk7CisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIlJlY2VpdmVkIEFzc29jIFJlc3BvbnNlIHdpdGggVmVuZG9yIHNwZWNpZmljIFZIVCBDYXAiKSk7CisJCWxpbV9sb2dfdmh0X2NhcChwTWFjLCAmcEFzc29jUnNwLT5WSFRDYXBzKTsKKwl9CisJaWYgKGFyLnZlbmRvcjJfaWUuVkhUT3BlcmF0aW9uLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSc3AtPnZlbmRvcjJfaWUuVkhUT3BlcmF0aW9uLAorCQkJCSZhci52ZW5kb3IyX2llLlZIVE9wZXJhdGlvbiwKKwkJCQlzaXplb2YodERvdDExZklFVkhUT3BlcmF0aW9uKSk7CisJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJRkwoIlJlY2VpdmVkIEFzc29jIFJlc3BvbnNlIHdpdGggVmVuZG9yIHNwZWNpZmljIFZIVCBPcGVyIikpOworCQlsaW1fbG9nX3ZodF9vcGVyYXRpb24ocE1hYywgJnBBc3NvY1JzcC0+VkhUT3BlcmF0aW9uKTsKKwl9CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvKiBFbmQgc2lyX2NvbnZlcnRfYXNzb2NfcmVzcF9mcmFtZTJfc3RydWN0LiAqLworCit0U2lyUmV0U3RhdHVzCitzaXJfY29udmVydF9yZWFzc29jX3JlcV9mcmFtZTJfc3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICAgdWludDhfdCAqcEZyYW1lLAorCQkJCSAgICAgIHVpbnQzMl90IG5GcmFtZSwgdHBTaXJBc3NvY1JlcSBwQXNzb2NSZXEpCit7CisJc3RhdGljIHREb3QxMWZSZUFzc29jUmVxdWVzdCBhcjsKKwl1aW50MzJfdCBzdGF0dXM7CisKKwkvKiBaZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBwQXNzb2NSZXEsIHNpemVvZih0U2lyQXNzb2NSZXEpLCAwKTsKKworCS8qIGRlbGVnYXRlIHRvIHRoZSBmcmFtZXNjLWdlbmVyYXRlZCBjb2RlLCAqLworCXN0YXR1cyA9IGRvdDExZl91bnBhY2tfcmVfYXNzb2NfcmVxdWVzdChwTWFjLCBwRnJhbWUsIG5GcmFtZSwgJmFyKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJGYWlsZWQgdG8gcGFyc2UgYSBSZS1hc3NvY2lhdGlvbiBSZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGEgUmUtYXNzb2NpYXRpb24gUmVxdWVzdCAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKwkJCXN0YXR1cywgbkZyYW1lKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOworCQkgICAgICAgKQorCX0KKwkvKiAmICJ0cmFuc2xpdGVyYXRlIiBmcm9tIGEgJ3REb3QxMWZSZUFzc29jUmVxdWVzdCcgdG8gYSAndFNpckFzc29jUmVxJy4uLiAqLworCisJLyogbWFrZSBzdXJlIHRoaXMgaXMgc2VlbiBhcyBhIHJlLWFzc29jIHJlcXVlc3QgKi8KKwlwQXNzb2NSZXEtPnJlYXNzb2NSZXF1ZXN0ID0gMTsKKworCS8qIENhcGFiaWxpdGllcyAqLworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uZXNzID0gYXIuQ2FwYWJpbGl0aWVzLmVzczsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmlic3MgPSBhci5DYXBhYmlsaXRpZXMuaWJzczsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbGFibGUgPSBhci5DYXBhYmlsaXRpZXMuY2ZQb2xsYWJsZTsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbFJlcSA9IGFyLkNhcGFiaWxpdGllcy5jZlBvbGxSZXE7CisJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5wcml2YWN5ID0gYXIuQ2FwYWJpbGl0aWVzLnByaXZhY3k7CisJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5zaG9ydFByZWFtYmxlID0gYXIuQ2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGU7CisJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5wYmNjID0gYXIuQ2FwYWJpbGl0aWVzLnBiY2M7CisJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5jaGFubmVsQWdpbGl0eSA9CisJCWFyLkNhcGFiaWxpdGllcy5jaGFubmVsQWdpbGl0eTsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnNwZWN0cnVtTWd0ID0gYXIuQ2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0OworCXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8ucW9zID0gYXIuQ2FwYWJpbGl0aWVzLnFvczsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWUgPSBhci5DYXBhYmlsaXRpZXMuc2hvcnRTbG90VGltZTsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmFwc2QgPSBhci5DYXBhYmlsaXRpZXMuYXBzZDsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnJybSA9IGFyLkNhcGFiaWxpdGllcy5ycm07CisJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5kc3NzT2ZkbSA9IGFyLkNhcGFiaWxpdGllcy5kc3NzT2ZkbTsKKwlwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmRlbGF5ZWRCQSA9IGFyLkNhcGFiaWxpdGllcy5kZWxheWVkQkE7CisJcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5pbW1lZGlhdGVCQSA9IGFyLkNhcGFiaWxpdGllcy5pbW1lZGlhdGVCQTsKKworCS8qIExpc3RlbiBJbnRlcnZhbCAqLworCXBBc3NvY1JlcS0+bGlzdGVuSW50ZXJ2YWwgPSBhci5MaXN0ZW5JbnRlcnZhbC5pbnRlcnZhbDsKKworCS8qIFNTSUQgKi8KKwlpZiAoYXIuU1NJRC5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+c3NpZFByZXNlbnQgPSAxOworCQljb252ZXJ0X3NzaWQocE1hYywgJnBBc3NvY1JlcS0+c3NJZCwgJmFyLlNTSUQpOworCX0KKwkvKiBTdXBwb3J0ZWQgUmF0ZXMgKi8KKwlpZiAoYXIuU3VwcFJhdGVzLnByZXNlbnQpIHsKKwkJcEFzc29jUmVxLT5zdXBwUmF0ZXNQcmVzZW50ID0gMTsKKwkJY29udmVydF9zdXBwX3JhdGVzKHBNYWMsICZwQXNzb2NSZXEtPnN1cHBvcnRlZFJhdGVzLAorCQkJCSAgICZhci5TdXBwUmF0ZXMpOworCX0KKwkvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KKwlpZiAoYXIuRXh0U3VwcFJhdGVzLnByZXNlbnQpIHsKKwkJcEFzc29jUmVxLT5leHRlbmRlZFJhdGVzUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfZXh0X3N1cHBfcmF0ZXMocE1hYywgJnBBc3NvY1JlcS0+ZXh0ZW5kZWRSYXRlcywKKwkJCQkgICAgICAgJmFyLkV4dFN1cHBSYXRlcyk7CisJfQorCS8qIFFPUyBDYXBhYmlsaXRpZXM6ICovCisJaWYgKGFyLlFPU0NhcHNTdGF0aW9uLnByZXNlbnQpIHsKKwkJcEFzc29jUmVxLT5xb3NDYXBhYmlsaXR5UHJlc2VudCA9IDE7CisJCWNvbnZlcnRfcW9zX2NhcHNfc3RhdGlvbihwTWFjLCAmcEFzc29jUmVxLT5xb3NDYXBhYmlsaXR5LAorCQkJCQkgJmFyLlFPU0NhcHNTdGF0aW9uKTsKKwl9CisJLyogV1BBICovCisJaWYgKGFyLldQQU9wYXF1ZS5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+d3BhUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfd3BhX29wYXF1ZShwTWFjLCAmcEFzc29jUmVxLT53cGEsICZhci5XUEFPcGFxdWUpOworCX0KKwkvKiBSU04gKi8KKwlpZiAoYXIuUlNOT3BhcXVlLnByZXNlbnQpIHsKKwkJcEFzc29jUmVxLT5yc25QcmVzZW50ID0gMTsKKwkJY29udmVydF9yc25fb3BhcXVlKHBNYWMsICZwQXNzb2NSZXEtPnJzbiwgJmFyLlJTTk9wYXF1ZSk7CisJfQorCisJLyogUG93ZXIgQ2FwYWJpbGl0aWVzICovCisJaWYgKGFyLlBvd2VyQ2Fwcy5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+cG93ZXJDYXBhYmlsaXR5UHJlc2VudCA9IDE7CisJCWNvbnZlcnRfcG93ZXJfY2FwcyhwTWFjLCAmcEFzc29jUmVxLT5wb3dlckNhcGFiaWxpdHksCisJCQkJICAgJmFyLlBvd2VyQ2Fwcyk7CisJfQorCS8qIFN1cHBvcnRlZCBDaGFubmVscyAqLworCWlmIChhci5TdXBwQ2hhbm5lbHMucHJlc2VudCkgeworCQlwQXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfc3VwcF9jaGFubmVscyhwTWFjLCAmcEFzc29jUmVxLT5zdXBwb3J0ZWRDaGFubmVscywKKwkJCQkgICAgICAmYXIuU3VwcENoYW5uZWxzKTsKKwl9CisKKwlpZiAoYXIuSFRDYXBzLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSZXEtPkhUQ2FwcywgJmFyLkhUQ2FwcywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRUhUQ2FwcykpOworCX0KKworCWlmIChhci5XTU1JbmZvU3RhdGlvbi5wcmVzZW50KSB7CisJCXBBc3NvY1JlcS0+d21lSW5mb1ByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoJnBBc3NvY1JlcS0+V01NSW5mb1N0YXRpb24sICZhci5XTU1JbmZvU3RhdGlvbiwKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRVdNTUluZm9TdGF0aW9uKSk7CisKKwl9CisKKwlpZiAoYXIuV01NQ2Fwcy5wcmVzZW50KQorCQlwQXNzb2NSZXEtPndzbUNhcGFibGVQcmVzZW50ID0gMTsKKworCWlmICghcEFzc29jUmVxLT5zc2lkUHJlc2VudCkgeworCQlQRUxPRzIobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cyLCBGTCgiUmVjZWl2ZWQgQXNzb2Mgd2l0aG91dCBTU0lEIElFLlxuIikpOworCQkgICAgICAgKQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWlmICghcEFzc29jUmVxLT5zdXBwUmF0ZXNQcmVzZW50ICYmICFwQXNzb2NSZXEtPmV4dGVuZGVkUmF0ZXNQcmVzZW50KSB7CisJCVBFTE9HMihsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzIsCisJCQkgICAgICAgRkwoIlJlY2VpdmVkIEFzc29jIHdpdGhvdXQgc3VwcCByYXRlIElFLlxuIikpOworCQkgICAgICAgKQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwkvKiBXaHkgbm8gY2FsbCB0byAndXBkYXRlQXNzb2NSZXFGcm9tUHJvcENhcGFiaWxpdHknIGhlcmUsIGxpa2UgKi8KKwkvKiB0aGVyZSBpcyBpbiAnc2lyX2NvbnZlcnRfYXNzb2NfcmVxX2ZyYW1lMl9zdHJ1Y3QnPyAqLworCisJLyogV1NDIElFICovCisJaWYgKGFyLldzY0lFT3BhcXVlLnByZXNlbnQpIHsKKwkJcEFzc29jUmVxLT5hZGRJRVByZXNlbnQgPSAxOworCQljb252ZXJ0X3dzY19vcGFxdWUocE1hYywgJnBBc3NvY1JlcS0+YWRkSUUsICZhci5Xc2NJRU9wYXF1ZSk7CisJfQorCisJaWYgKGFyLlAyUElFT3BhcXVlLnByZXNlbnQpIHsKKwkJcEFzc29jUmVxLT5hZGRJRVByZXNlbnQgPSAxOworCQljb252ZXJ0X3AycF9vcGFxdWUocE1hYywgJnBBc3NvY1JlcS0+YWRkSUUsICZhci5QMlBJRU9wYXF1ZSk7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9XRkQKKwlpZiAoYXIuV0ZESUVPcGFxdWUucHJlc2VudCkgeworCQlwQXNzb2NSZXEtPmFkZElFUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfd2ZkX29wYXF1ZShwTWFjLCAmcEFzc29jUmVxLT5hZGRJRSwgJmFyLldGRElFT3BhcXVlKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKGFyLlZIVENhcHMucHJlc2VudCkgeworCQljZGZfbWVtX2NvcHkoJnBBc3NvY1JlcS0+VkhUQ2FwcywgJmFyLlZIVENhcHMsCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVWSFRDYXBzKSk7CisJfQorCWlmIChhci5PcGVyYXRpbmdNb2RlLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQXNzb2NSZXEtPm9wZXJNb2RlLCAmYXIuT3BlcmF0aW5nTW9kZSwKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRU9wZXJhdGluZ01vZGUpKTsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIlJlY2VpdmVkIEFzc29jIFJlcSB3aXRoIE9wZXJhdGluZyBNb2RlIElFXG4iKSk7CisJCWxpbV9sb2dfb3BlcmF0aW5nX21vZGUocE1hYywgJnBBc3NvY1JlcS0+b3Blck1vZGUpOworCX0KKyNlbmRpZgorCisJaWYgKGFyLkV4dENhcC5wcmVzZW50KSB7CisJCXN0cnVjdCBzX2V4dF9jYXAgKmV4dF9jYXA7CisJCWNkZl9tZW1fY29weSgmcEFzc29jUmVxLT5FeHRDYXAuYnl0ZXMsICZhci5FeHRDYXAuYnl0ZXMsCisJCQkgICAgIGFyLkV4dENhcC5udW1fYnl0ZXMpOworCisJCWV4dF9jYXAgPSAoc3RydWN0IHNfZXh0X2NhcCAqKSZwQXNzb2NSZXEtPkV4dENhcC5ieXRlczsKKwkJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoInRpbWluZ01lYXM6ICVkLCBmaW5ldGltaW5nTWVhcyBJbml0OiAlZCwgUmVzcDogJWQiKSwKKwkJCWV4dF9jYXAtPnRpbWluZ19tZWFzLCBleHRfY2FwLT5maW5lX3RpbWVfbWVhc19pbml0aWF0b3IsCisJCQlleHRfY2FwLT5maW5lX3RpbWVfbWVhc19yZXNwb25kZXIpOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHNpcl9jb252ZXJ0X3JlYXNzb2NfcmVxX2ZyYW1lMl9zdHJ1Y3QuICovCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQordFNpclJldFN0YXR1cworc2lyX2JlYWNvbl9pZV9lc2VfYmNuX3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCXVpbnQ4X3QgKnBQYXlsb2FkLCBjb25zdCB1aW50MzJfdCBuUGF5bG9hZCwKKwl1aW50OF90ICoqb3V0SWVCdWYsIHVpbnQzMl90ICpwT3V0SWVMZW4pCit7CisJdERvdDExZkJlYWNvbklFcyAqcEJpZXMgPSBOVUxMOworCXVpbnQzMl90IHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U2lyUmV0U3RhdHVzIHJldFN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKwl0U2lyRXNlQmNuUmVwb3J0TWFuZGF0b3J5SWUgZXNlQmNuUmVwb3J0TWFuZGF0b3J5SWU7CisKKwkvKiBUbyBzdG9yZSBob3cgbWFueSBieXRlcyBhcmUgcmVxdWlyZWQgdG8gYmUgYWxsb2NhdGVkCisJICAgZm9yIEJjbiByZXBvcnQgbWFuZGF0b3J5IEllcyAqLworCXVpbnQxNl90IG51bUJ5dGVzID0gMCwgZnJlZUJ5dGVzID0gMDsKKwl1aW50OF90ICpwb3MgPSBOVUxMOworCisJLyogWmVyby1pbml0IG91ciBbb3V0XSBwYXJhbWV0ZXIsICovCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJmVzZUJjblJlcG9ydE1hbmRhdG9yeUllLAorCQkgICAgc2l6ZW9mKGVzZUJjblJlcG9ydE1hbmRhdG9yeUllKSwgMCk7CisJcEJpZXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodERvdDExZkJlYWNvbklFcykpOworCWlmIChOVUxMID09IHBCaWVzKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisJLyogZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsICovCisJc3RhdHVzID0gZG90MTFmX3VucGFja19iZWFjb25faV9lcyhwTWFjLCBwUGF5bG9hZCwgblBheWxvYWQsIHBCaWVzKTsKKworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBwYXJzZSBCZWFjb24gSUVzICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuUGF5bG9hZCk7CisJCWNkZl9tZW1fZnJlZShwQmllcyk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIEJlYWNvbiBJRXMgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisJCQlzdGF0dXMsIG5QYXlsb2FkKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcFBheWxvYWQsIG5QYXlsb2FkKTsKKwkJICAgICAgICkKKwl9CisJLyogJiAidHJhbnNsaXRlcmF0ZSIgZnJvbSBhICd0RG90MTFmQmVhY29uSUVzJyB0byBhICdlc2VCY25SZXBvcnRNYW5kYXRvcnlJZScuLi4gKi8KKwlpZiAoIXBCaWVzLT5TU0lELnByZXNlbnQpIHsKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywgRkwoIk1hbmRhdG9yeSBJRSBTU0lEIG5vdCBwcmVzZW50IVxuIikpOworCQkgICAgICAgKQorCX0gZWxzZSB7CisJCWVzZUJjblJlcG9ydE1hbmRhdG9yeUllLnNzaWRQcmVzZW50ID0gMTsKKwkJY29udmVydF9zc2lkKHBNYWMsICZlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zc0lkLCAmcEJpZXMtPlNTSUQpOworCQkvKiAxIGZvciBFSUQsIDEgZm9yIGxlbmd0aCBhbmQgbGVuZ3RoIGJ5dGVzICovCisJCW51bUJ5dGVzICs9IDEgKyAxICsgZXNlQmNuUmVwb3J0TWFuZGF0b3J5SWUuc3NJZC5sZW5ndGg7CisJfQorCisJaWYgKCFwQmllcy0+U3VwcFJhdGVzLnByZXNlbnQpIHsKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywKKwkJCSAgICAgICBGTCgiTWFuZGF0b3J5IElFIFN1cHBvcnRlZCBSYXRlcyBub3QgcHJlc2VudCFcbiIpKTsKKwkJICAgICAgICkKKwl9IGVsc2UgeworCQllc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zdXBwUmF0ZXNQcmVzZW50ID0gMTsKKwkJY29udmVydF9zdXBwX3JhdGVzKHBNYWMsICZlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zdXBwb3J0ZWRSYXRlcywKKwkJCQkgICAmcEJpZXMtPlN1cHBSYXRlcyk7CisJCW51bUJ5dGVzICs9CisJCQkxICsgMSArIGVzZUJjblJlcG9ydE1hbmRhdG9yeUllLnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzOworCX0KKworCWlmIChwQmllcy0+RkhQYXJhbVNldC5wcmVzZW50KSB7CisJCWVzZUJjblJlcG9ydE1hbmRhdG9yeUllLmZoUGFyYW1QcmVzZW50ID0gMTsKKwkJY29udmVydF9maF9wYXJhbXMocE1hYywgJmVzZUJjblJlcG9ydE1hbmRhdG9yeUllLmZoUGFyYW1TZXQsCisJCQkJICAmcEJpZXMtPkZIUGFyYW1TZXQpOworCQludW1CeXRlcyArPSAxICsgMSArIFNJUl9NQUNfRkhfUEFSQU1fU0VUX0VJRF9NQVg7CisJfQorCisJaWYgKHBCaWVzLT5EU1BhcmFtcy5wcmVzZW50KSB7CisJCWVzZUJjblJlcG9ydE1hbmRhdG9yeUllLmRzUGFyYW1zUHJlc2VudCA9IDE7CisJCWVzZUJjblJlcG9ydE1hbmRhdG9yeUllLmRzUGFyYW1TZXQuY2hhbm5lbE51bWJlciA9CisJCQlwQmllcy0+RFNQYXJhbXMuY3Vycl9jaGFubmVsOworCQludW1CeXRlcyArPSAxICsgMSArIFNJUl9NQUNfRFNfUEFSQU1fU0VUX0VJRF9NQVg7CisJfQorCisJaWYgKHBCaWVzLT5DRlBhcmFtcy5wcmVzZW50KSB7CisJCWVzZUJjblJlcG9ydE1hbmRhdG9yeUllLmNmUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfY2ZfcGFyYW1zKHBNYWMsICZlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5jZlBhcmFtU2V0LAorCQkJCSAgJnBCaWVzLT5DRlBhcmFtcyk7CisJCW51bUJ5dGVzICs9IDEgKyAxICsgU0lSX01BQ19DRl9QQVJBTV9TRVRfRUlEX01BWDsKKwl9CisKKwlpZiAocEJpZXMtPklCU1NQYXJhbXMucHJlc2VudCkgeworCQllc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5pYnNzUGFyYW1QcmVzZW50ID0gMTsKKwkJZXNlQmNuUmVwb3J0TWFuZGF0b3J5SWUuaWJzc1BhcmFtU2V0LmF0aW0gPQorCQkJcEJpZXMtPklCU1NQYXJhbXMuYXRpbTsKKwkJbnVtQnl0ZXMgKz0gMSArIDEgKyBTSVJfTUFDX0lCU1NfUEFSQU1fU0VUX0VJRF9NQVg7CisJfQorCisJaWYgKHBCaWVzLT5USU0ucHJlc2VudCkgeworCQllc2VCY25SZXBvcnRNYW5kYXRvcnlJZS50aW1QcmVzZW50ID0gMTsKKwkJZXNlQmNuUmVwb3J0TWFuZGF0b3J5SWUudGltLmR0aW1Db3VudCA9IHBCaWVzLT5USU0uZHRpbV9jb3VudDsKKwkJZXNlQmNuUmVwb3J0TWFuZGF0b3J5SWUudGltLmR0aW1QZXJpb2QgPSBwQmllcy0+VElNLmR0aW1fcGVyaW9kOworCQllc2VCY25SZXBvcnRNYW5kYXRvcnlJZS50aW0uYml0bWFwQ29udHJvbCA9IHBCaWVzLT5USU0uYm1wY3RsOworCQkvKiBBcyBwZXIgdGhlIEVTRSBzcGVjLCBNYXkgdHJ1bmNhdGUgYW5kIHJlcG9ydCBmaXJzdCA0IG9jdGV0cyBvbmx5ICovCisJCW51bUJ5dGVzICs9IDEgKyAxICsgU0lSX01BQ19USU1fRUlEX01JTjsKKwl9CisKKwlpZiAocEJpZXMtPlJSTUVuYWJsZWRDYXAucHJlc2VudCkgeworCQllc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5ycm1QcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5ybUVuYWJsZWRDYXBhYmlsaXRpZXMsCisJCQkgICAgICZwQmllcy0+UlJNRW5hYmxlZENhcCwKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRVJSTUVuYWJsZWRDYXApKTsKKwkJbnVtQnl0ZXMgKz0gMSArIDEgKyBTSVJfTUFDX1JNX0VOQUJMRURfQ0FQQUJJTElUWV9FSURfTUFYOworCX0KKworCSpvdXRJZUJ1ZiA9IGNkZl9tZW1fbWFsbG9jKG51bUJ5dGVzKTsKKwlpZiAoTlVMTCA9PSAqb3V0SWVCdWYpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiTWVtb3J5IEFsbG9jYXRpb24gZmFpbHVyZSIpKTsKKwkJY2RmX21lbV9mcmVlKHBCaWVzKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisJcG9zID0gKm91dEllQnVmOworCSpwT3V0SWVMZW4gPSBudW1CeXRlczsKKwlmcmVlQnl0ZXMgPSBudW1CeXRlczsKKworCS8qIFN0YXJ0IGZpbGxpbmcgdGhlIG91dHB1dCBJZSB3aXRoIE1hbmRhdG9yeSBJRSBpbmZvcm1hdGlvbiAqLworCS8qIEZpbGwgU1NJRCBJRSAqLworCWlmIChlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zc2lkUHJlc2VudCkgeworCQlpZiAoZnJlZUJ5dGVzIDwgKDEgKyAxICsgZXNlQmNuUmVwb3J0TWFuZGF0b3J5SWUuc3NJZC5sZW5ndGgpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIkluc3VmZmljaWVudCBtZW1vcnkgdG8gY29weSBTU0lEIikpOworCQkJcmV0U3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQkJZ290byBlcnJfYmNucmVwOworCQl9CisJCSpwb3MgPSBTSVJfTUFDX1NTSURfRUlEOworCQlwb3MrKzsKKwkJKnBvcyA9IGVzZUJjblJlcG9ydE1hbmRhdG9yeUllLnNzSWQubGVuZ3RoOworCQlwb3MrKzsKKwkJY2RmX21lbV9jb3B5KHBvcywKKwkJCSAgICAgKHVpbnQ4X3QgKikgZXNlQmNuUmVwb3J0TWFuZGF0b3J5SWUuc3NJZC5zc0lkLAorCQkJICAgICBlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zc0lkLmxlbmd0aCk7CisJCXBvcyArPSBlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zc0lkLmxlbmd0aDsKKwkJZnJlZUJ5dGVzIC09ICgxICsgMSArIGVzZUJjblJlcG9ydE1hbmRhdG9yeUllLnNzSWQubGVuZ3RoKTsKKwl9CisKKwkvKiBGaWxsIFN1cHBvcnRlZCBSYXRlcyBJRSAqLworCWlmIChlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zdXBwUmF0ZXNQcmVzZW50KSB7CisJCWlmIChmcmVlQnl0ZXMgPAorCQkgICAgKDEgKyAxICsgZXNlQmNuUmVwb3J0TWFuZGF0b3J5SWUuc3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXMpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIkluc3VmZmljaWVudCBtZW1vcnkgdG8gY29weSBSYXRlcyBJRSIpKTsKKwkJCXJldFN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKwkJCWdvdG8gZXJyX2JjbnJlcDsKKwkJfQorCQkqcG9zID0gU0lSX01BQ19SQVRFU0VUX0VJRDsKKwkJcG9zKys7CisJCSpwb3MgPSBlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlczsKKwkJcG9zKys7CisJCWNkZl9tZW1fY29weShwb3MsCisJCQkgICAgICh1aW50OF90ICopIGVzZUJjblJlcG9ydE1hbmRhdG9yeUllLnN1cHBvcnRlZFJhdGVzLgorCQkJICAgICByYXRlLAorCQkJICAgICBlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlcyk7CisJCXBvcyArPSBlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlczsKKwkJZnJlZUJ5dGVzIC09CisJCQkoMSArIDEgKyBlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlcyk7CisJfQorCisJLyogRmlsbCBGSCBQYXJhbWV0ZXIgc2V0IElFICovCisJaWYgKGVzZUJjblJlcG9ydE1hbmRhdG9yeUllLmZoUGFyYW1QcmVzZW50KSB7CisJCWlmIChmcmVlQnl0ZXMgPCAoMSArIDEgKyBTSVJfTUFDX0ZIX1BBUkFNX1NFVF9FSURfTUFYKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMKCJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGNvcHkgRkhJRSIpKTsKKwkJCXJldFN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKwkJCWdvdG8gZXJyX2JjbnJlcDsKKwkJfQorCQkqcG9zID0gU0lSX01BQ19GSF9QQVJBTV9TRVRfRUlEOworCQlwb3MrKzsKKwkJKnBvcyA9IFNJUl9NQUNfRkhfUEFSQU1fU0VUX0VJRF9NQVg7CisJCXBvcysrOworCQljZGZfbWVtX2NvcHkocG9zLAorCQkJICAgICAodWludDhfdCAqKSAmZXNlQmNuUmVwb3J0TWFuZGF0b3J5SWUuZmhQYXJhbVNldCwKKwkJCSAgICAgU0lSX01BQ19GSF9QQVJBTV9TRVRfRUlEX01BWCk7CisJCXBvcyArPSBTSVJfTUFDX0ZIX1BBUkFNX1NFVF9FSURfTUFYOworCQlmcmVlQnl0ZXMgLT0gKDEgKyAxICsgU0lSX01BQ19GSF9QQVJBTV9TRVRfRUlEX01BWCk7CisJfQorCisJLyogRmlsbCBEUyBQYXJhbWV0ZXIgc2V0IElFICovCisJaWYgKGVzZUJjblJlcG9ydE1hbmRhdG9yeUllLmRzUGFyYW1zUHJlc2VudCkgeworCQlpZiAoZnJlZUJ5dGVzIDwgKDEgKyAxICsgU0lSX01BQ19EU19QQVJBTV9TRVRfRUlEX01BWCkpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBjb3B5IERTIElFIikpOworCQkJcmV0U3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQkJZ290byBlcnJfYmNucmVwOworCQl9CisJCSpwb3MgPSBTSVJfTUFDX0RTX1BBUkFNX1NFVF9FSUQ7CisJCXBvcysrOworCQkqcG9zID0gU0lSX01BQ19EU19QQVJBTV9TRVRfRUlEX01BWDsKKwkJcG9zKys7CisJCSpwb3MgPSBlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5kc1BhcmFtU2V0LmNoYW5uZWxOdW1iZXI7CisJCXBvcyArPSBTSVJfTUFDX0RTX1BBUkFNX1NFVF9FSURfTUFYOworCQlmcmVlQnl0ZXMgLT0gKDEgKyAxICsgU0lSX01BQ19EU19QQVJBTV9TRVRfRUlEX01BWCk7CisJfQorCisJLyogRmlsbCBDRiBQYXJhbWV0ZXIgc2V0ICovCisJaWYgKGVzZUJjblJlcG9ydE1hbmRhdG9yeUllLmNmUHJlc2VudCkgeworCQlpZiAoZnJlZUJ5dGVzIDwgKDEgKyAxICsgU0lSX01BQ19DRl9QQVJBTV9TRVRfRUlEX01BWCkpIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCQlGTCgiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBjb3B5IENGIElFIikpOworCQkJcmV0U3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQkJZ290byBlcnJfYmNucmVwOworCQl9CisJCSpwb3MgPSBTSVJfTUFDX0NGX1BBUkFNX1NFVF9FSUQ7CisJCXBvcysrOworCQkqcG9zID0gU0lSX01BQ19DRl9QQVJBTV9TRVRfRUlEX01BWDsKKwkJcG9zKys7CisJCWNkZl9tZW1fY29weShwb3MsCisJCQkgICAgICh1aW50OF90ICopICZlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5jZlBhcmFtU2V0LAorCQkJICAgICBTSVJfTUFDX0NGX1BBUkFNX1NFVF9FSURfTUFYKTsKKwkJcG9zICs9IFNJUl9NQUNfQ0ZfUEFSQU1fU0VUX0VJRF9NQVg7CisJCWZyZWVCeXRlcyAtPSAoMSArIDEgKyBTSVJfTUFDX0NGX1BBUkFNX1NFVF9FSURfTUFYKTsKKwl9CisKKwkvKiBGaWxsIElCU1MgUGFyYW1ldGVyIHNldCBJRSAqLworCWlmIChlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5pYnNzUGFyYW1QcmVzZW50KSB7CisJCWlmIChmcmVlQnl0ZXMgPCAoMSArIDEgKyBTSVJfTUFDX0lCU1NfUEFSQU1fU0VUX0VJRF9NQVgpKSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQkJRkwoIkluc3VmZmljaWVudCBtZW1vcnkgdG8gY29weSBJQlNTIElFIikpOworCQkJcmV0U3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQkJZ290byBlcnJfYmNucmVwOworCQl9CisJCSpwb3MgPSBTSVJfTUFDX0lCU1NfUEFSQU1fU0VUX0VJRDsKKwkJcG9zKys7CisJCSpwb3MgPSBTSVJfTUFDX0lCU1NfUEFSQU1fU0VUX0VJRF9NQVg7CisJCXBvcysrOworCQljZGZfbWVtX2NvcHkocG9zLAorCQkJICAgICAodWludDhfdCAqKSAmZXNlQmNuUmVwb3J0TWFuZGF0b3J5SWUuaWJzc1BhcmFtU2V0LgorCQkJICAgICBhdGltLCBTSVJfTUFDX0lCU1NfUEFSQU1fU0VUX0VJRF9NQVgpOworCQlwb3MgKz0gU0lSX01BQ19JQlNTX1BBUkFNX1NFVF9FSURfTUFYOworCQlmcmVlQnl0ZXMgLT0gKDEgKyAxICsgU0lSX01BQ19JQlNTX1BBUkFNX1NFVF9FSURfTUFYKTsKKwl9CisKKwkvKiBGaWxsIFRJTSBJRSAqLworCWlmIChlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS50aW1QcmVzZW50KSB7CisJCWlmIChmcmVlQnl0ZXMgPCAoMSArIDEgKyBTSVJfTUFDX1RJTV9FSURfTUlOKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMKCJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGNvcHkgVElNIElFIikpOworCQkJcmV0U3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQkJZ290byBlcnJfYmNucmVwOworCQl9CisJCSpwb3MgPSBTSVJfTUFDX1RJTV9FSUQ7CisJCXBvcysrOworCQkqcG9zID0gU0lSX01BQ19USU1fRUlEX01JTjsKKwkJcG9zKys7CisJCWNkZl9tZW1fY29weShwb3MsCisJCQkgICAgICh1aW50OF90ICopICZlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS50aW0sCisJCQkgICAgIFNJUl9NQUNfVElNX0VJRF9NSU4pOworCQlwb3MgKz0gU0lSX01BQ19USU1fRUlEX01JTjsKKwkJZnJlZUJ5dGVzIC09ICgxICsgMSArIFNJUl9NQUNfVElNX0VJRF9NSU4pOworCX0KKworCS8qIEZpbGwgUk0gQ2FwYWJpbGl0eSBJRSAqLworCWlmIChlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS5ycm1QcmVzZW50KSB7CisJCWlmIChmcmVlQnl0ZXMgPCAoMSArIDEgKyBTSVJfTUFDX1JNX0VOQUJMRURfQ0FQQUJJTElUWV9FSURfTUFYKSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dQLAorCQkJCUZMKCJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGNvcHkgUlJNIElFIikpOworCQkJcmV0U3RhdHVzID0gZVNJUl9GQUlMVVJFOworCQkJZ290byBlcnJfYmNucmVwOworCQl9CisJCSpwb3MgPSBTSVJfTUFDX1JNX0VOQUJMRURfQ0FQQUJJTElUWV9FSUQ7CisJCXBvcysrOworCQkqcG9zID0gU0lSX01BQ19STV9FTkFCTEVEX0NBUEFCSUxJVFlfRUlEX01BWDsKKwkJcG9zKys7CisJCWNkZl9tZW1fY29weShwb3MsCisJCQkgICAgICh1aW50OF90ICopICZlc2VCY25SZXBvcnRNYW5kYXRvcnlJZS4KKwkJCSAgICAgcm1FbmFibGVkQ2FwYWJpbGl0aWVzLAorCQkJICAgICBTSVJfTUFDX1JNX0VOQUJMRURfQ0FQQUJJTElUWV9FSURfTUFYKTsKKwkJZnJlZUJ5dGVzIC09ICgxICsgMSArIFNJUl9NQUNfUk1fRU5BQkxFRF9DQVBBQklMSVRZX0VJRF9NQVgpOworCX0KKworCWlmIChmcmVlQnl0ZXMgIT0gMCkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTAorCQkJCSgiTWlzbWF0Y2ggaW4gYWxsb2NhdGlvbiBhbmQgY29weWluZyBvZiBJRSBpbiBCY24gUmVwIikpOworCQlyZXRTdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisJfQorCitlcnJfYmNucmVwOgorCS8qIFRoZSBtZXNzYWdlIGNvdW50ZXIgd291bGQgbm90IGJlIGluY3JlbWVudGVkIGluIGNhc2Ugb2YKKwkgKiByZXR1cm5pbmcgZmFpbHVyZSBhbmQgaGVuY2UgbmV4dCB0aW1lLCB0aGlzIGZ1bmN0aW9uIGdldHMKKwkgKiBjYWxsZWQsIGl0IHdvdWxkIGJlIHVzaW5nIHRoZSBzYW1lIG1zZyBjdHIgZm9yIGEgZGlmZmVyZW50CisJICogQlNTLlNvLCBpdCBpcyBnb29kIHRvIGNsZWFyIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBhIEJTUworCSAqIHRoYXQgaXMgcmV0dXJuaW5nIGZhaWx1cmUuT24gc3VjY2VzcywgdGhlIGNhbGxlciB3b3VsZCB0YWtlCisJICogY2FyZSBvZiBmcmVlaW5nIHVwIHRoZSBtZW1vcnkqLworCWlmIChyZXRTdGF0dXMgPT0gZVNJUl9GQUlMVVJFKSB7CisJCWNkZl9tZW1fZnJlZSgqb3V0SWVCdWYpOworCQkqb3V0SWVCdWYgPSBOVUxMOworCX0KKworCWNkZl9tZW1fZnJlZShwQmllcyk7CisJcmV0dXJuIHJldFN0YXR1czsKK30KKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisKK3RTaXJSZXRTdGF0dXMKK3Npcl9wYXJzZV9iZWFjb25faWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uIHBCZWFjb25TdHJ1Y3QsCisJCSAgICB1aW50OF90ICpwUGF5bG9hZCwgdWludDMyX3QgblBheWxvYWQpCit7CisJdERvdDExZkJlYWNvbklFcyAqcEJpZXM7CisJdWludDMyX3Qgc3RhdHVzOworCisJLyogWmVyby1pbml0IG91ciBbb3V0XSBwYXJhbWV0ZXIsICovCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcEJlYWNvblN0cnVjdCwgc2l6ZW9mKHRTaXJQcm9iZVJlc3BCZWFjb24pLCAwKTsKKworCXBCaWVzID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHREb3QxMWZCZWFjb25JRXMpKTsKKwlpZiAoTlVMTCA9PSBwQmllcykgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKSk7CisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJfQorCS8qIGRlbGVnYXRlIHRvIHRoZSBmcmFtZXNjLWdlbmVyYXRlZCBjb2RlLCAqLworCXN0YXR1cyA9IGRvdDExZl91bnBhY2tfYmVhY29uX2lfZXMocE1hYywgcFBheWxvYWQsIG5QYXlsb2FkLCBwQmllcyk7CisKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gcGFyc2UgQmVhY29uIElFcyAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKwkJCXN0YXR1cywgblBheWxvYWQpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwUGF5bG9hZCwgblBheWxvYWQpOworCQkgICAgICAgKQorCQljZGZfbWVtX2ZyZWUocEJpZXMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMCisJCQkJKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHVucGFja2luZyBCZWFjb24gSUVzICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuUGF5bG9hZCk7CisJCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBQYXlsb2FkLCBuUGF5bG9hZCk7CisJCSAgICAgICApCisJfQorCS8qICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZkJlYWNvbklFcycgdG8gYSAndFNpclByb2JlUmVzcEJlYWNvbicuLi4gKi8KKwlpZiAoIXBCaWVzLT5TU0lELnByZXNlbnQpIHsKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywgRkwoIk1hbmRhdG9yeSBJRSBTU0lEIG5vdCBwcmVzZW50IVxuIikpOworCQkgICAgICAgKQorCX0gZWxzZSB7CisJCXBCZWFjb25TdHJ1Y3QtPnNzaWRQcmVzZW50ID0gMTsKKwkJY29udmVydF9zc2lkKHBNYWMsICZwQmVhY29uU3RydWN0LT5zc0lkLCAmcEJpZXMtPlNTSUQpOworCX0KKworCWlmICghcEJpZXMtPlN1cHBSYXRlcy5wcmVzZW50KSB7CisJCVBFTE9HVyhsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPR1csCisJCQkgICAgICAgRkwoIk1hbmRhdG9yeSBJRSBTdXBwb3J0ZWQgUmF0ZXMgbm90IHByZXNlbnQhXG4iKSk7CisJCSAgICAgICApCisJfSBlbHNlIHsKKwkJcEJlYWNvblN0cnVjdC0+c3VwcFJhdGVzUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfc3VwcF9yYXRlcyhwTWFjLCAmcEJlYWNvblN0cnVjdC0+c3VwcG9ydGVkUmF0ZXMsCisJCQkJICAgJnBCaWVzLT5TdXBwUmF0ZXMpOworCX0KKworCWlmIChwQmllcy0+RXh0U3VwcFJhdGVzLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+ZXh0ZW5kZWRSYXRlc1ByZXNlbnQgPSAxOworCQljb252ZXJ0X2V4dF9zdXBwX3JhdGVzKHBNYWMsICZwQmVhY29uU3RydWN0LT5leHRlbmRlZFJhdGVzLAorCQkJCSAgICAgICAmcEJpZXMtPkV4dFN1cHBSYXRlcyk7CisJfQorCisJaWYgKHBCaWVzLT5DRlBhcmFtcy5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPmNmUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfY2ZfcGFyYW1zKHBNYWMsICZwQmVhY29uU3RydWN0LT5jZlBhcmFtU2V0LAorCQkJCSAgJnBCaWVzLT5DRlBhcmFtcyk7CisJfQorCisJaWYgKHBCaWVzLT5USU0ucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT50aW1QcmVzZW50ID0gMTsKKwkJY29udmVydF90aW0ocE1hYywgJnBCZWFjb25TdHJ1Y3QtPnRpbSwgJnBCaWVzLT5USU0pOworCX0KKworCWlmIChwQmllcy0+Q291bnRyeS5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPmNvdW50cnlJbmZvUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfY291bnRyeShwTWFjLCAmcEJlYWNvblN0cnVjdC0+Y291bnRyeUluZm9QYXJhbSwKKwkJCQkmcEJpZXMtPkNvdW50cnkpOworCX0KKwkvKiAxMWggSUVzICovCisJaWYgKHBCaWVzLT5UUENSZXBvcnQucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT50cGNSZXBvcnRQcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT50cGNSZXBvcnQsCisJCQkgICAgICZwQmllcy0+VFBDUmVwb3J0LCBzaXplb2YodERvdDExZklFVFBDUmVwb3J0KSk7CisJfQorCisJaWYgKHBCaWVzLT5Qb3dlckNvbnN0cmFpbnRzLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+cG93ZXJDb25zdHJhaW50UHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+bG9jYWxQb3dlckNvbnN0cmFpbnQsCisJCQkgICAgICZwQmllcy0+UG93ZXJDb25zdHJhaW50cywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMpKTsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCWlmIChwQmllcy0+RVNFVmVyc2lvbi5wcmVzZW50KQorCQlwQmVhY29uU3RydWN0LT5pc19lc2VfdmVyX2llX3ByZXNlbnQgPSAxOworCWlmIChwQmllcy0+RVNFVHhtaXRQb3dlci5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPmVzZVR4UHdyLnByZXNlbnQgPSAxOworCQlwQmVhY29uU3RydWN0LT5lc2VUeFB3ci5wb3dlcl9saW1pdCA9CisJCQlwQmllcy0+RVNFVHhtaXRQb3dlci5wb3dlcl9saW1pdDsKKwl9CisJaWYgKHBCaWVzLT5RQlNTTG9hZC5wcmVzZW50KSB7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+UUJTU0xvYWQsICZwQmllcy0+UUJTU0xvYWQsCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVRQlNTTG9hZCkpOworCX0KKyNlbmRpZgorCisJaWYgKHBCaWVzLT5FRENBUGFyYW1TZXQucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT5lZGNhUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfZWRjYV9wYXJhbShwTWFjLCAmcEJlYWNvblN0cnVjdC0+ZWRjYVBhcmFtcywKKwkJCQkgICAmcEJpZXMtPkVEQ0FQYXJhbVNldCk7CisJfQorCS8qIFFPUyBDYXBhYmlsaXRpZXM6ICovCisJaWYgKHBCaWVzLT5RT1NDYXBzQXAucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT5xb3NDYXBhYmlsaXR5UHJlc2VudCA9IDE7CisJCWNvbnZlcnRfcW9zX2NhcHMocE1hYywgJnBCZWFjb25TdHJ1Y3QtPnFvc0NhcGFiaWxpdHksCisJCQkJICZwQmllcy0+UU9TQ2Fwc0FwKTsKKwl9CisKKwlpZiAocEJpZXMtPkNoYW5Td2l0Y2hBbm4ucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT5jaGFubmVsU3dpdGNoUHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+Y2hhbm5lbFN3aXRjaElFLAorCQkJICAgICAmcEJpZXMtPkNoYW5Td2l0Y2hBbm4sCisJCQkgICAgIHNpemVvZihwQmVhY29uU3RydWN0LT5jaGFubmVsU3dpdGNoSUUpKTsKKwl9CisKKwlpZiAocEJpZXMtPmV4dF9jaGFuX3N3aXRjaF9hbm4ucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT5leHRfY2hhbl9zd2l0Y2hfcHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+ZXh0X2NoYW5fc3dpdGNoLAorCQkJICAgICAmcEJpZXMtPmV4dF9jaGFuX3N3aXRjaF9hbm4sCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVleHRfY2hhbl9zd2l0Y2hfYW5uKSk7CisJfQorCisJaWYgKHBCaWVzLT5zZWNfY2hhbl9vZmZzZXRfZWxlLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+c2VjX2NoYW5fb2Zmc2V0X3ByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoJnBCZWFjb25TdHJ1Y3QtPnNlY19jaGFuX29mZnNldCwKKwkJCSAgICAgJnBCaWVzLT5zZWNfY2hhbl9vZmZzZXRfZWxlLAorCQkJICAgICBzaXplb2YocEJlYWNvblN0cnVjdC0+c2VjX2NoYW5fb2Zmc2V0KSk7CisJfQorCisJaWYgKHBCaWVzLT5RdWlldC5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPnF1aWV0SUVQcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT5xdWlldElFLCAmcEJpZXMtPlF1aWV0LAorCQkJICAgICBzaXplb2YodERvdDExZklFUXVpZXQpKTsKKwl9CisKKwlpZiAocEJpZXMtPkhUQ2Fwcy5wcmVzZW50KSB7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+SFRDYXBzLCAmcEJpZXMtPkhUQ2FwcywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRUhUQ2FwcykpOworCX0KKworCWlmIChwQmllcy0+SFRJbmZvLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT5IVEluZm8sICZwQmllcy0+SFRJbmZvLAorCQkJICAgICBzaXplb2YodERvdDExZklFSFRJbmZvKSk7CisJfQorCisJaWYgKHBCaWVzLT5EU1BhcmFtcy5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPmRzUGFyYW1zUHJlc2VudCA9IDE7CisJCXBCZWFjb25TdHJ1Y3QtPmNoYW5uZWxOdW1iZXIgPSBwQmllcy0+RFNQYXJhbXMuY3Vycl9jaGFubmVsOworCX0gZWxzZSBpZiAocEJpZXMtPkhUSW5mby5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPmNoYW5uZWxOdW1iZXIgPSBwQmllcy0+SFRJbmZvLnByaW1hcnlDaGFubmVsOworCX0KKworCWlmIChwQmllcy0+UlNOLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+cnNuUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfcnNuKHBNYWMsICZwQmVhY29uU3RydWN0LT5yc24sICZwQmllcy0+UlNOKTsKKwl9CisKKwlpZiAocEJpZXMtPldQQS5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPndwYVByZXNlbnQgPSAxOworCQljb252ZXJ0X3dwYShwTWFjLCAmcEJlYWNvblN0cnVjdC0+d3BhLCAmcEJpZXMtPldQQSk7CisJfQorCisJaWYgKHBCaWVzLT5XTU1QYXJhbXMucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT53bWVFZGNhUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfd21tX3BhcmFtcyhwTWFjLCAmcEJlYWNvblN0cnVjdC0+ZWRjYVBhcmFtcywKKwkJCQkgICAmcEJpZXMtPldNTVBhcmFtcyk7CisJfQorCisJaWYgKHBCaWVzLT5XTU1JbmZvQXAucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT53bWVJbmZvUHJlc2VudCA9IDE7CisJfQorCisJaWYgKHBCaWVzLT5XTU1DYXBzLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+d3NtQ2FwYWJsZVByZXNlbnQgPSAxOworCX0KKworCWlmIChwQmllcy0+RVJQSW5mby5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPmVycFByZXNlbnQgPSAxOworCQljb252ZXJ0X2VycF9pbmZvKHBNYWMsICZwQmVhY29uU3RydWN0LT5lcnBJRUluZm8sCisJCQkJICZwQmllcy0+RVJQSW5mbyk7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKHBCaWVzLT5WSFRDYXBzLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+VkhUQ2Fwcy5wcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT5WSFRDYXBzLCAmcEJpZXMtPlZIVENhcHMsCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVWSFRDYXBzKSk7CisJfQorCWlmIChwQmllcy0+VkhUT3BlcmF0aW9uLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+VkhUT3BlcmF0aW9uLnByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoJnBCZWFjb25TdHJ1Y3QtPlZIVE9wZXJhdGlvbiwgJnBCaWVzLT5WSFRPcGVyYXRpb24sCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVWSFRPcGVyYXRpb24pKTsKKwl9CisJaWYgKHBCaWVzLT5WSFRFeHRCc3NMb2FkLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+VkhURXh0QnNzTG9hZC5wcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT5WSFRFeHRCc3NMb2FkLAorCQkJICAgICAmcEJpZXMtPlZIVEV4dEJzc0xvYWQsCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVWSFRFeHRCc3NMb2FkKSk7CisJfQorCWlmIChwQmllcy0+T3BlcmF0aW5nTW9kZS5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPk9wZXJhdGluZ01vZGUucHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+T3BlcmF0aW5nTW9kZSwKKwkJCSAgICAgJnBCaWVzLT5PcGVyYXRpbmdNb2RlLAorCQkJICAgICBzaXplb2YodERvdDExZklFT3BlcmF0aW5nTW9kZSkpOworCX0KKyNlbmRpZgorCisJaWYgKHBCaWVzLT5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPm1kaWVQcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KHBCZWFjb25TdHJ1Y3QtPm1kaWUsICZwQmllcy0+TW9iaWxpdHlEb21haW4uTURJRCwKKwkJCSAgICAgU0lSX01ESUVfU0laRSk7CisJfQorCisJcEJlYWNvblN0cnVjdC0+VmVuZG9yMUlFUHJlc2VudCA9IHBCaWVzLT5WZW5kb3IxSUUucHJlc2VudDsKKwlwQmVhY29uU3RydWN0LT5WZW5kb3IzSUVQcmVzZW50ID0gcEJpZXMtPlZlbmRvcjNJRS5wcmVzZW50OworCXBCZWFjb25TdHJ1Y3QtPnZlbmRvcjJfaWUucHJlc2VudCA9IHBCaWVzLT52ZW5kb3IyX2llLnByZXNlbnQ7CisJaWYgKHBCaWVzLT52ZW5kb3IyX2llLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+dmVuZG9yMl9pZS50eXBlID0gcEJpZXMtPnZlbmRvcjJfaWUudHlwZTsKKwkJcEJlYWNvblN0cnVjdC0+dmVuZG9yMl9pZS5zdWJfdHlwZSA9IHBCaWVzLT52ZW5kb3IyX2llLnN1Yl90eXBlOworCX0KKworCWlmIChwQmllcy0+dmVuZG9yMl9pZS5WSFRDYXBzLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+dmVuZG9yMl9pZS5WSFRDYXBzLnByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoJnBCZWFjb25TdHJ1Y3QtPnZlbmRvcjJfaWUuVkhUQ2FwcywKKwkJCQkmcEJpZXMtPnZlbmRvcjJfaWUuVkhUQ2FwcywKKwkJCQlzaXplb2YodERvdDExZklFVkhUQ2FwcykpOworCX0KKwlpZiAocEJpZXMtPnZlbmRvcjJfaWUuVkhUT3BlcmF0aW9uLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+dmVuZG9yMl9pZS5WSFRPcGVyYXRpb24ucHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+dmVuZG9yMl9pZS5WSFRPcGVyYXRpb24sCisJCQkJJnBCaWVzLT52ZW5kb3IyX2llLlZIVE9wZXJhdGlvbiwKKwkJCQlzaXplb2YodERvdDExZklFVkhUT3BlcmF0aW9uKSk7CisJfQorCWNkZl9tZW1fZnJlZShwQmllcyk7CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyogRW5kIHNpcl9wYXJzZV9iZWFjb25faWUuICovCisKK3RTaXJSZXRTdGF0dXMKK3Npcl9jb252ZXJ0X2JlYWNvbl9mcmFtZTJfc3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIHVpbnQ4X3QgKnBGcmFtZSwKKwkJCQkgdHBTaXJQcm9iZVJlc3BCZWFjb24gcEJlYWNvblN0cnVjdCkKK3sKKwl0RG90MTFmQmVhY29uICpwQmVhY29uOworCXVpbnQzMl90IHN0YXR1cywgblBheWxvYWQ7CisJdWludDhfdCAqcFBheWxvYWQ7CisJdHBTaXJNYWNNZ210SGRyIHBIZHI7CisJdWludDhfdCBtYXBwZWRSWENoOworCXVpbnQ4X3QgcmZCYW5kOworCisJcFBheWxvYWQgPSBXTUFfR0VUX1JYX01QRFVfREFUQShwRnJhbWUpOworCW5QYXlsb2FkID0gV01BX0dFVF9SWF9QQVlMT0FEX0xFTihwRnJhbWUpOworCXBIZHIgPSBXTUFfR0VUX1JYX01BQ19IRUFERVIocEZyYW1lKTsKKwltYXBwZWRSWENoID0gV01BX0dFVF9SWF9DSChwRnJhbWUpOworCXJmQmFuZCA9IFdNQV9HRVRfUlhfUkZCQU5EKHBGcmFtZSk7CisKKwkvKiBaZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBwQmVhY29uU3RydWN0LCBzaXplb2YodFNpclByb2JlUmVzcEJlYWNvbiksIDApOworCisJcEJlYWNvbiA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0RG90MTFmQmVhY29uKSk7CisJaWYgKE5VTEwgPT0gcEJlYWNvbikgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKSk7CisJCXJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisJfQorCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcEJlYWNvbiwgc2l6ZW9mKHREb3QxMWZCZWFjb24pLCAwKTsKKworCS8qIGdldCB0aGUgTUFDIGFkZHJlc3Mgb3V0IG9mIHRoZSBCRCwgKi8KKwljZGZfbWVtX2NvcHkocEJlYWNvblN0cnVjdC0+YnNzaWQsIHBIZHItPnNhLCA2KTsKKworCS8qIGRlbGVnYXRlIHRvIHRoZSBmcmFtZXNjLWdlbmVyYXRlZCBjb2RlLCAqLworCXN0YXR1cyA9IGRvdDExZl91bnBhY2tfYmVhY29uKHBNYWMsIHBQYXlsb2FkLCBuUGF5bG9hZCwgcEJlYWNvbik7CisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIHBhcnNlIEJlYWNvbiBJRXMgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisJCQlzdGF0dXMsIG5QYXlsb2FkKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcFBheWxvYWQsIG5QYXlsb2FkKTsKKwkJICAgICAgICkKKwkJY2RmX21lbV9mcmVlKHBCZWFjb24pOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMCisJCQkJKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHVucGFja2luZyBCZWFjb24gSUVzICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuUGF5bG9hZCk7CisJCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBQYXlsb2FkLCBuUGF5bG9hZCk7CisJCSAgICAgICApCisJfQorCS8qICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZkJlYWNvbicgdG8gYSAndFNpclByb2JlUmVzcEJlYWNvbicuLi4gKi8KKwkvKiBUaW1lc3RhbXAgKi8KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcEJlYWNvblN0cnVjdC0+dGltZVN0YW1wLAorCQkgICAgICh1aW50OF90ICopICZwQmVhY29uLT5UaW1lU3RhbXAsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNUaW1lU3RhbXApKTsKKworCS8qIEJlYWNvbiBJbnRlcnZhbCAqLworCXBCZWFjb25TdHJ1Y3QtPmJlYWNvbkludGVydmFsID0gcEJlYWNvbi0+QmVhY29uSW50ZXJ2YWwuaW50ZXJ2YWw7CisKKwkvKiBDYXBhYmlsaXRpZXMgKi8KKwlwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5lc3MgPSBwQmVhY29uLT5DYXBhYmlsaXRpZXMuZXNzOworCXBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLmlic3MgPSBwQmVhY29uLT5DYXBhYmlsaXRpZXMuaWJzczsKKwlwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5jZlBvbGxhYmxlID0KKwkJcEJlYWNvbi0+Q2FwYWJpbGl0aWVzLmNmUG9sbGFibGU7CisJcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8uY2ZQb2xsUmVxID0KKwkJcEJlYWNvbi0+Q2FwYWJpbGl0aWVzLmNmUG9sbFJlcTsKKwlwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5wcml2YWN5ID0gcEJlYWNvbi0+Q2FwYWJpbGl0aWVzLnByaXZhY3k7CisJcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZSA9CisJCXBCZWFjb24tPkNhcGFiaWxpdGllcy5zaG9ydFByZWFtYmxlOworCXBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLnBiY2MgPSBwQmVhY29uLT5DYXBhYmlsaXRpZXMucGJjYzsKKwlwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5jaGFubmVsQWdpbGl0eSA9CisJCXBCZWFjb24tPkNhcGFiaWxpdGllcy5jaGFubmVsQWdpbGl0eTsKKwlwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5zcGVjdHJ1bU1ndCA9CisJCXBCZWFjb24tPkNhcGFiaWxpdGllcy5zcGVjdHJ1bU1ndDsKKwlwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5xb3MgPSBwQmVhY29uLT5DYXBhYmlsaXRpZXMucW9zOworCXBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWUgPQorCQlwQmVhY29uLT5DYXBhYmlsaXRpZXMuc2hvcnRTbG90VGltZTsKKwlwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5hcHNkID0gcEJlYWNvbi0+Q2FwYWJpbGl0aWVzLmFwc2Q7CisJcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8ucnJtID0gcEJlYWNvbi0+Q2FwYWJpbGl0aWVzLnJybTsKKwlwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5kc3NzT2ZkbSA9IHBCZWFjb24tPkNhcGFiaWxpdGllcy5kc3NzT2ZkbTsKKwlwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5kZWxheWVkQkEgPQorCQlwQmVhY29uLT5DYXBhYmlsaXRpZXMuZGVsYXllZEJBOworCXBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLmltbWVkaWF0ZUJBID0KKwkJcEJlYWNvbi0+Q2FwYWJpbGl0aWVzLmltbWVkaWF0ZUJBOworCisJaWYgKCFwQmVhY29uLT5TU0lELnByZXNlbnQpIHsKKwkJUEVMT0dXKGxpbV9sb2cKKwkJCSAgICAgICAocE1hYywgTE9HVywgRkwoIk1hbmRhdG9yeSBJRSBTU0lEIG5vdCBwcmVzZW50IVxuIikpOworCQkgICAgICAgKQorCX0gZWxzZSB7CisJCXBCZWFjb25TdHJ1Y3QtPnNzaWRQcmVzZW50ID0gMTsKKwkJY29udmVydF9zc2lkKHBNYWMsICZwQmVhY29uU3RydWN0LT5zc0lkLCAmcEJlYWNvbi0+U1NJRCk7CisJfQorCisJaWYgKCFwQmVhY29uLT5TdXBwUmF0ZXMucHJlc2VudCkgeworCQlQRUxPR1cobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0dXLAorCQkJICAgICAgIEZMKCJNYW5kYXRvcnkgSUUgU3VwcG9ydGVkIFJhdGVzIG5vdCBwcmVzZW50IVxuIikpOworCQkgICAgICAgKQorCX0gZWxzZSB7CisJCXBCZWFjb25TdHJ1Y3QtPnN1cHBSYXRlc1ByZXNlbnQgPSAxOworCQljb252ZXJ0X3N1cHBfcmF0ZXMocE1hYywgJnBCZWFjb25TdHJ1Y3QtPnN1cHBvcnRlZFJhdGVzLAorCQkJCSAgICZwQmVhY29uLT5TdXBwUmF0ZXMpOworCX0KKworCWlmIChwQmVhY29uLT5FeHRTdXBwUmF0ZXMucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT5leHRlbmRlZFJhdGVzUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfZXh0X3N1cHBfcmF0ZXMocE1hYywgJnBCZWFjb25TdHJ1Y3QtPmV4dGVuZGVkUmF0ZXMsCisJCQkJICAgICAgICZwQmVhY29uLT5FeHRTdXBwUmF0ZXMpOworCX0KKworCWlmIChwQmVhY29uLT5DRlBhcmFtcy5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPmNmUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfY2ZfcGFyYW1zKHBNYWMsICZwQmVhY29uU3RydWN0LT5jZlBhcmFtU2V0LAorCQkJCSAgJnBCZWFjb24tPkNGUGFyYW1zKTsKKwl9CisKKwlpZiAocEJlYWNvbi0+VElNLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+dGltUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfdGltKHBNYWMsICZwQmVhY29uU3RydWN0LT50aW0sICZwQmVhY29uLT5USU0pOworCX0KKworCWlmIChwQmVhY29uLT5Db3VudHJ5LnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+Y291bnRyeUluZm9QcmVzZW50ID0gMTsKKwkJY29udmVydF9jb3VudHJ5KHBNYWMsICZwQmVhY29uU3RydWN0LT5jb3VudHJ5SW5mb1BhcmFtLAorCQkJCSZwQmVhY29uLT5Db3VudHJ5KTsKKwl9CisJLyogUU9TIENhcGFiaWxpdGllczogKi8KKwlpZiAocEJlYWNvbi0+UU9TQ2Fwc0FwLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+cW9zQ2FwYWJpbGl0eVByZXNlbnQgPSAxOworCQljb252ZXJ0X3Fvc19jYXBzKHBNYWMsICZwQmVhY29uU3RydWN0LT5xb3NDYXBhYmlsaXR5LAorCQkJCSAmcEJlYWNvbi0+UU9TQ2Fwc0FwKTsKKwl9CisKKwlpZiAocEJlYWNvbi0+RURDQVBhcmFtU2V0LnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+ZWRjYVByZXNlbnQgPSAxOworCQljb252ZXJ0X2VkY2FfcGFyYW0ocE1hYywgJnBCZWFjb25TdHJ1Y3QtPmVkY2FQYXJhbXMsCisJCQkJICAgJnBCZWFjb24tPkVEQ0FQYXJhbVNldCk7CisJfQorCisJaWYgKHBCZWFjb24tPkNoYW5Td2l0Y2hBbm4ucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT5jaGFubmVsU3dpdGNoUHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+Y2hhbm5lbFN3aXRjaElFLAorCQkJICAgICAmcEJlYWNvbi0+Q2hhblN3aXRjaEFubiwKKwkJCSAgICAgc2l6ZW9mKHBCZWFjb25TdHJ1Y3QtPmNoYW5uZWxTd2l0Y2hJRSkpOworCX0KKworCWlmIChwQmVhY29uLT5leHRfY2hhbl9zd2l0Y2hfYW5uLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+ZXh0X2NoYW5fc3dpdGNoX3ByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoJnBCZWFjb25TdHJ1Y3QtPmV4dF9jaGFuX3N3aXRjaCwKKwkJCSAgICAgJnBCZWFjb24tPmV4dF9jaGFuX3N3aXRjaF9hbm4sCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVleHRfY2hhbl9zd2l0Y2hfYW5uKSk7CisJfQorCisJaWYgKHBCZWFjb24tPnNlY19jaGFuX29mZnNldF9lbGUucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT5zZWNfY2hhbl9vZmZzZXRfcHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+c2VjX2NoYW5fb2Zmc2V0LAorCQkJICAgICAmcEJlYWNvbi0+c2VjX2NoYW5fb2Zmc2V0X2VsZSwKKwkJCSAgICAgc2l6ZW9mKHBCZWFjb25TdHJ1Y3QtPnNlY19jaGFuX29mZnNldCkpOworCX0KKworCWlmIChwQmVhY29uLT5UUENSZXBvcnQucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT50cGNSZXBvcnRQcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT50cGNSZXBvcnQsICZwQmVhY29uLT5UUENSZXBvcnQsCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVUUENSZXBvcnQpKTsKKwl9CisKKwlpZiAocEJlYWNvbi0+UG93ZXJDb25zdHJhaW50cy5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPnBvd2VyQ29uc3RyYWludFByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoJnBCZWFjb25TdHJ1Y3QtPmxvY2FsUG93ZXJDb25zdHJhaW50LAorCQkJICAgICAmcEJlYWNvbi0+UG93ZXJDb25zdHJhaW50cywKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMpKTsKKwl9CisKKwlpZiAocEJlYWNvbi0+UXVpZXQucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT5xdWlldElFUHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+cXVpZXRJRSwgJnBCZWFjb24tPlF1aWV0LAorCQkJICAgICBzaXplb2YodERvdDExZklFUXVpZXQpKTsKKwl9CisKKwlpZiAocEJlYWNvbi0+SFRDYXBzLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT5IVENhcHMsICZwQmVhY29uLT5IVENhcHMsCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVIVENhcHMpKTsKKwl9CisKKwlpZiAocEJlYWNvbi0+SFRJbmZvLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT5IVEluZm8sICZwQmVhY29uLT5IVEluZm8sCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVIVEluZm8pKTsKKworCX0KKworCWlmIChwQmVhY29uLT5EU1BhcmFtcy5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPmRzUGFyYW1zUHJlc2VudCA9IDE7CisJCXBCZWFjb25TdHJ1Y3QtPmNoYW5uZWxOdW1iZXIgPSBwQmVhY29uLT5EU1BhcmFtcy5jdXJyX2NoYW5uZWw7CisJfSBlbHNlIGlmIChwQmVhY29uLT5IVEluZm8ucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT5jaGFubmVsTnVtYmVyID0gcEJlYWNvbi0+SFRJbmZvLnByaW1hcnlDaGFubmVsOworCX0gZWxzZSB7CisJCQlwQmVhY29uU3RydWN0LT5jaGFubmVsTnVtYmVyID0gbWFwcGVkUlhDaDsKKwkJCWxpbV9sb2cocE1hYywgTE9HMSwKKwkJCQlGTCgiQ2hhbm5lbCBpbmZvIGlzIG5vdCBwcmVzZW50IGluIEJlYWNvbiIpKTsKKwl9CisKKwlpZiAocEJlYWNvbi0+UlNOLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+cnNuUHJlc2VudCA9IDE7CisJCWNvbnZlcnRfcnNuKHBNYWMsICZwQmVhY29uU3RydWN0LT5yc24sICZwQmVhY29uLT5SU04pOworCX0KKworCWlmIChwQmVhY29uLT5XUEEucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT53cGFQcmVzZW50ID0gMTsKKwkJY29udmVydF93cGEocE1hYywgJnBCZWFjb25TdHJ1Y3QtPndwYSwgJnBCZWFjb24tPldQQSk7CisJfQorCisJaWYgKHBCZWFjb24tPldNTVBhcmFtcy5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPndtZUVkY2FQcmVzZW50ID0gMTsKKwkJY29udmVydF93bW1fcGFyYW1zKHBNYWMsICZwQmVhY29uU3RydWN0LT5lZGNhUGFyYW1zLAorCQkJCSAgICZwQmVhY29uLT5XTU1QYXJhbXMpOworCQlQRUxPRzEobGltX2xvZworCQkJICAgICAgIChwTWFjLCBMT0cxLAorCQkJICAgICAgIEZMKCJXTU0gUGFyYW1ldGVyIHByZXNlbnQgaW4gQmVhY29uIEZyYW1lIVxuIikpOworCQkgICAgICAgX19wcmludF93bW1fcGFyYW1zKHBNYWMsICZwQmVhY29uLT5XTU1QYXJhbXMpOworCQkgICAgICAgKQorCX0KKworCWlmIChwQmVhY29uLT5XTU1JbmZvQXAucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT53bWVJbmZvUHJlc2VudCA9IDE7CisJCVBFTE9HMShsaW1fbG9nCisJCQkgICAgICAgKHBNYWMsIExPRzEsIEZMKCJXTU0gSW5mbyBwcmVzZW50IGluIEJlYWNvbiBGcmFtZSFcbiIpKTsKKwkJICAgICAgICkKKwl9CisKKwlpZiAocEJlYWNvbi0+V01NQ2Fwcy5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPndzbUNhcGFibGVQcmVzZW50ID0gMTsKKwl9CisKKwlpZiAocEJlYWNvbi0+RVJQSW5mby5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPmVycFByZXNlbnQgPSAxOworCQljb252ZXJ0X2VycF9pbmZvKHBNYWMsICZwQmVhY29uU3RydWN0LT5lcnBJRUluZm8sCisJCQkJICZwQmVhY29uLT5FUlBJbmZvKTsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAocEJlYWNvbi0+TW9iaWxpdHlEb21haW4ucHJlc2VudCkgeworCQkvKiBNb2JpbGl0eURvbWFpbiAqLworCQlwQmVhY29uU3RydWN0LT5tZGllUHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmKHBCZWFjb25TdHJ1Y3QtPm1kaWVbMF0pLAorCQkJICAgICAodWludDhfdCAqKSAmKHBCZWFjb24tPk1vYmlsaXR5RG9tYWluLk1ESUQpLAorCQkJICAgICBzaXplb2YodWludDE2X3QpKTsKKwkJcEJlYWNvblN0cnVjdC0+bWRpZVsyXSA9CisJCQkoKHBCZWFjb24tPk1vYmlsaXR5RG9tYWluLm92ZXJEU0NhcCA8PCAwKSB8IChwQmVhY29uLT4KKwkJCQkJCQkJICAgICBNb2JpbGl0eURvbWFpbi4KKwkJCQkJCQkJICAgICByZXNvdXJjZVJlcUNhcAorCQkJCQkJCQkgICAgIDw8IDEpKTsKKworCX0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCWlmIChwQmVhY29uLT5FU0VWZXJzaW9uLnByZXNlbnQpCisJCXBCZWFjb25TdHJ1Y3QtPmlzX2VzZV92ZXJfaWVfcHJlc2VudCA9IDE7CisJaWYgKHBCZWFjb24tPkVTRVR4bWl0UG93ZXIucHJlc2VudCkgeworCQkvKiBjb3B5IEVTRSBUUEMgaW5mbyBlbGVtZW50ICovCisJCXBCZWFjb25TdHJ1Y3QtPmVzZVR4UHdyLnByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoJnBCZWFjb25TdHJ1Y3QtPmVzZVR4UHdyLAorCQkJICAgICAmcEJlYWNvbi0+RVNFVHhtaXRQb3dlciwKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRUVTRVR4bWl0UG93ZXIpKTsKKwl9CisJaWYgKHBCZWFjb24tPlFCU1NMb2FkLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT5RQlNTTG9hZCwKKwkJCSAgICAgJnBCZWFjb24tPlFCU1NMb2FkLCBzaXplb2YodERvdDExZklFUUJTU0xvYWQpKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKHBCZWFjb24tPlZIVENhcHMucHJlc2VudCkgeworCQljZGZfbWVtX2NvcHkoJnBCZWFjb25TdHJ1Y3QtPlZIVENhcHMsICZwQmVhY29uLT5WSFRDYXBzLAorCQkJICAgICBzaXplb2YodERvdDExZklFVkhUQ2FwcykpOworCX0KKwlpZiAocEJlYWNvbi0+VkhUT3BlcmF0aW9uLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT5WSFRPcGVyYXRpb24sCisJCQkgICAgICZwQmVhY29uLT5WSFRPcGVyYXRpb24sCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVWSFRPcGVyYXRpb24pKTsKKwl9CisJaWYgKHBCZWFjb24tPlZIVEV4dEJzc0xvYWQucHJlc2VudCkgeworCQljZGZfbWVtX2NvcHkoJnBCZWFjb25TdHJ1Y3QtPlZIVEV4dEJzc0xvYWQsCisJCQkgICAgICZwQmVhY29uLT5WSFRFeHRCc3NMb2FkLAorCQkJICAgICBzaXplb2YodERvdDExZklFVkhURXh0QnNzTG9hZCkpOworCX0KKwlpZiAocEJlYWNvbi0+T3BlcmF0aW5nTW9kZS5wcmVzZW50KSB7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+T3BlcmF0aW5nTW9kZSwKKwkJCSAgICAgJnBCZWFjb24tPk9wZXJhdGluZ01vZGUsCisJCQkgICAgIHNpemVvZih0RG90MTFmSUVPcGVyYXRpbmdNb2RlKSk7CisJfQorCWlmIChwQmVhY29uLT5XaWRlckJXQ2hhblN3aXRjaEFubi5wcmVzZW50KSB7CisJCXBCZWFjb25TdHJ1Y3QtPldpZGVyQldDaGFuU3dpdGNoQW5uUHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weSgmcEJlYWNvblN0cnVjdC0+V2lkZXJCV0NoYW5Td2l0Y2hBbm4sCisJCQkgICAgICZwQmVhY29uLT5XaWRlckJXQ2hhblN3aXRjaEFubiwKKwkJCSAgICAgc2l6ZW9mKHREb3QxMWZJRVdpZGVyQldDaGFuU3dpdGNoQW5uKSk7CisJfQorI2VuZGlmCisKKwkvKiBJQlNTIFBlZXIgUGFyYW1zICovCisJaWYgKHBCZWFjb24tPklCU1NQYXJhbXMucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT5JQlNTUGFyYW1zLnByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkoJnBCZWFjb25TdHJ1Y3QtPklCU1NQYXJhbXMsICZwQmVhY29uLT5JQlNTUGFyYW1zLAorCQkJICAgICBzaXplb2YodERvdDExZklFSUJTU1BhcmFtcykpOworCX0KKworCXBCZWFjb25TdHJ1Y3QtPlZlbmRvcjFJRVByZXNlbnQgPSBwQmVhY29uLT5WZW5kb3IxSUUucHJlc2VudDsKKwlwQmVhY29uU3RydWN0LT5WZW5kb3IzSUVQcmVzZW50ID0gcEJlYWNvbi0+VmVuZG9yM0lFLnByZXNlbnQ7CisKKwlwQmVhY29uU3RydWN0LT52ZW5kb3IyX2llLnByZXNlbnQgPSBwQmVhY29uLT52ZW5kb3IyX2llLnByZXNlbnQ7CisJaWYgKHBCZWFjb24tPnZlbmRvcjJfaWUucHJlc2VudCkgeworCQlwQmVhY29uU3RydWN0LT52ZW5kb3IyX2llLnR5cGUgPSBwQmVhY29uLT52ZW5kb3IyX2llLnR5cGU7CisJCXBCZWFjb25TdHJ1Y3QtPnZlbmRvcjJfaWUuc3ViX3R5cGUgPQorCQkJcEJlYWNvbi0+dmVuZG9yMl9pZS5zdWJfdHlwZTsKKwl9CisJaWYgKHBCZWFjb24tPnZlbmRvcjJfaWUucHJlc2VudCkgeworCQlQRUxPRzEobGltX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgiVmVuZG9yIFNwZWNpZmljIFZIVCBjYXBzIHByZXNlbnQgaW4gQmVhY29uIEZyYW1lISIpKTsKKwkJICAgICAgKQorCX0KKwlpZiAocEJlYWNvbi0+dmVuZG9yMl9pZS5WSFRDYXBzLnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQmVhY29uU3RydWN0LT52ZW5kb3IyX2llLlZIVENhcHMsCisJCQkJJnBCZWFjb24tPnZlbmRvcjJfaWUuVkhUQ2FwcywKKwkJCQlzaXplb2YodERvdDExZklFVkhUQ2FwcykpOworCX0KKwlpZiAocEJlYWNvbi0+dmVuZG9yMl9pZS5WSFRPcGVyYXRpb24ucHJlc2VudCkgeworCQljZGZfbWVtX2NvcHkoJnBCZWFjb25TdHJ1Y3QtPnZlbmRvcjJfaWUuVkhUT3BlcmF0aW9uLAorCQkJCSZwQmVhY29uLT5WSFRPcGVyYXRpb24sCisJCQkJc2l6ZW9mKHREb3QxMWZJRVZIVE9wZXJhdGlvbikpOworCX0KKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKwlpZiAocEJlYWNvbi0+UUNvbVZlbmRvcklFLnByZXNlbnQpIHsKKwkJcEJlYWNvblN0cnVjdC0+QXZvaWRDaGFubmVsSUUucHJlc2VudCA9CisJCQlwQmVhY29uLT5RQ29tVmVuZG9ySUUucHJlc2VudDsKKwkJcEJlYWNvblN0cnVjdC0+QXZvaWRDaGFubmVsSUUudHlwZSA9CisJCQlwQmVhY29uLT5RQ29tVmVuZG9ySUUudHlwZTsKKwkJcEJlYWNvblN0cnVjdC0+QXZvaWRDaGFubmVsSUUuY2hhbm5lbCA9CisJCQlwQmVhY29uLT5RQ29tVmVuZG9ySUUuY2hhbm5lbDsKKwl9CisjZW5kaWYgLyogRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFICovCisKKworCWNkZl9tZW1fZnJlZShwQmVhY29uKTsKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qIEVuZCBzaXJfY29udmVydF9iZWFjb25fZnJhbWUyX3N0cnVjdC4gKi8KKwordFNpclJldFN0YXR1cworc2lyX2NvbnZlcnRfYXV0aF9mcmFtZTJfc3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgICAgdWludDhfdCAqcEZyYW1lLAorCQkJICAgICAgIHVpbnQzMl90IG5GcmFtZSwgdHBTaXJNYWNBdXRoRnJhbWVCb2R5IHBBdXRoKQoreworCXN0YXRpYyB0RG90MTFmQXV0aGVudGljYXRpb24gYXV0aDsKKwl1aW50MzJfdCBzdGF0dXM7CisKKwkvKiBaZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBwQXV0aCwgc2l6ZW9mKHRTaXJNYWNBdXRoRnJhbWVCb2R5KSwgMCk7CisKKwkvKiBkZWxlZ2F0ZSB0byB0aGUgZnJhbWVzYy1nZW5lcmF0ZWQgY29kZSwgKi8KKwlzdGF0dXMgPSBkb3QxMWZfdW5wYWNrX2F1dGhlbnRpY2F0aW9uKHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmYXV0aCk7CisJaWYgKERPVDExRl9GQUlMRUQoc3RhdHVzKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkJCSgiRmFpbGVkIHRvIHBhcnNlIGFuIEF1dGhlbnRpY2F0aW9uIGZyYW1lICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGFuIEF1dGhlbnRpY2F0aW9uIGZyYW1lICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJfQorCS8qICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZkF1dGhlbnRpY2F0aW9uJyB0byBhICd0U2lyTWFjQXV0aEZyYW1lQm9keScuLi4gKi8KKwlwQXV0aC0+YXV0aEFsZ29OdW1iZXIgPSBhdXRoLkF1dGhBbGdvLmFsZ287CisJcEF1dGgtPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9IGF1dGguQXV0aFNlcU5vLm5vOworCXBBdXRoLT5hdXRoU3RhdHVzQ29kZSA9IGF1dGguU3RhdHVzLnN0YXR1czsKKworCWlmIChhdXRoLkNoYWxsZW5nZVRleHQucHJlc2VudCkgeworCQlwQXV0aC0+dHlwZSA9IFNJUl9NQUNfQ0hBTExFTkdFX1RFWFRfRUlEOworCQlwQXV0aC0+bGVuZ3RoID0gYXV0aC5DaGFsbGVuZ2VUZXh0Lm51bV90ZXh0OworCQljZGZfbWVtX2NvcHkocEF1dGgtPmNoYWxsZW5nZVRleHQsIGF1dGguQ2hhbGxlbmdlVGV4dC50ZXh0LAorCQkJICAgICBhdXRoLkNoYWxsZW5nZVRleHQubnVtX3RleHQpOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHNpcl9jb252ZXJ0X2F1dGhfZnJhbWUyX3N0cnVjdC4gKi8KKwordFNpclJldFN0YXR1cworc2lyX2NvbnZlcnRfYWRkdHNfcmVxMl9zdHJ1Y3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgIHVpbnQ4X3QgKnBGcmFtZSwKKwkJCSAgICAgIHVpbnQzMl90IG5GcmFtZSwgdFNpckFkZHRzUmVxSW5mbyAqcEFkZFRzKQoreworCXREb3QxMWZBZGRUU1JlcXVlc3QgYWRkdHMgPSB7IHswfX07CisJdERvdDExZldNTUFkZFRTUmVxdWVzdCB3bW1hZGR0cyA9IHsgezB9fTsKKwl1aW50OF90IGo7CisJdWludDE2X3QgaTsKKwl1aW50MzJfdCBzdGF0dXM7CisKKwlpZiAoU0lSX01BQ19RT1NfQUREX1RTX1JFUSAhPSAqKHBGcmFtZSArIDEpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoInNpcl9jb252ZXJ0X2FkZHRzX3JlcTJfc3RydWN0IGludm9rZWQgIgorCQkJCSAgICAgICAid2l0aCBhbiBBY3Rpb24gb2YgJWQ7IHRoaXMgaXMgbm90ICIKKwkJCQkgICAgICAgInN1cHBvcnRlZCAmIGlzIHByb2JhYmx5IGFuIGVycm9yLiIpLAorCQkJKihwRnJhbWUgKyAxKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIFplcm8taW5pdCBvdXIgW291dF0gcGFyYW1ldGVyLCAqLworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBBZGRUcywgc2l6ZW9mKHRTaXJBZGR0c1JlcUluZm8pLCAwKTsKKworCS8qIGRlbGVnYXRlIHRvIHRoZSBmcmFtZXNjLWdlbmVyYXRlZCBjb2RlLCAqLworCXN3aXRjaCAoKnBGcmFtZSkgeworCWNhc2UgU0lSX01BQ19BQ1RJT05fUU9TX01HTVQ6CisJCXN0YXR1cyA9IGRvdDExZl91bnBhY2tfYWRkX3RzX3JlcXVlc3QocE1hYywgcEZyYW1lLCBuRnJhbWUsICZhZGR0cyk7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19BQ1RJT05fV01FOgorCQlzdGF0dXMgPQorCQkJZG90MTFmX3VucGFja193bW1fYWRkX3RzX3JlcXVlc3QocE1hYywgcEZyYW1lLCBuRnJhbWUsCisJCQkJCQkJICZ3bW1hZGR0cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoInNpcl9jb252ZXJ0X2FkZHRzX3JlcTJfc3RydWN0IGludm9rZWQgIgorCQkJCSAgICAgICAid2l0aCBhIENhdGVnb3J5IG9mICVkOyB0aGlzIGlzIG5vdCIKKwkJCQkgICAgICAgIiBzdXBwb3J0ZWQgJiBpcyBwcm9iYWJseSBhbiBlcnJvci4iKSwKKwkJCSpwRnJhbWUpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhcnNlIGFuIEFkZCBUUyBSZXF1ZXN0IGYiCisJCQkJICAgICAgICJyYW1lICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbiIKKwkJCQkgICAgICAgImcgYW4gQWRkIFRTIFJlcXVlc3QgZnJhbWUgKDB4JTA4eCwiCisJCQkJICAgICAgICIlZCBieXRlcyk6XG4iKSwgc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJfQorCS8qICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZkFkZFRTUmVxdWVzdCcgb3IgYSAqLworCS8qICd0RG90MTFXTU1BZGRUU1JlcXVlc3QnIHRvIGEgJ3RTaXJNYWNBZGR0c1JlcUluZm8nLi4uICovCisJaWYgKFNJUl9NQUNfQUNUSU9OX1FPU19NR01UID09ICpwRnJhbWUpIHsKKwkJcEFkZFRzLT5kaWFsb2dUb2tlbiA9IGFkZHRzLkRpYWxvZ1Rva2VuLnRva2VuOworCisJCWlmIChhZGR0cy5UU1BFQy5wcmVzZW50KSB7CisJCQljb252ZXJ0X3RzcGVjKHBNYWMsICZwQWRkVHMtPnRzcGVjLCAmYWRkdHMuVFNQRUMpOworCQl9IGVsc2UgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiTWFuZGF0b3J5IFRTUEVDIGVsZW1lbnQgbWlzc2luZyBpbiBBZGQgVFMgUmVxdWVzdC5cbiIpKTsKKwkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCX0KKworCQlpZiAoYWRkdHMubnVtX1RDTEFTKSB7CisJCQlwQWRkVHMtPm51bVRjbGFzID0gKHVpbnQ4X3QpIGFkZHRzLm51bV9UQ0xBUzsKKworCQkJZm9yIChpID0gMFU7IGkgPCBhZGR0cy5udW1fVENMQVM7ICsraSkgeworCQkJCWlmIChlU0lSX1NVQ0NFU1MgIT0KKwkJCQkgICAgY29udmVydF90Y2xhcyhwTWFjLCAmKHBBZGRUcy0+dGNsYXNJbmZvW2ldKSwKKwkJCQkJCSAgJihhZGR0cy5UQ0xBU1tpXSkpKSB7CisJCQkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQkJCUZMCisJCQkJCQkJKCJGYWlsZWQgdG8gY29udmVydCBhIFRDTEFTIElFLlxuIikpOworCQkJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChhZGR0cy5UQ0xBU1NQUk9DLnByZXNlbnQpIHsKKwkJCXBBZGRUcy0+dGNsYXNQcm9jUHJlc2VudCA9IDE7CisJCQlwQWRkVHMtPnRjbGFzUHJvYyA9IGFkZHRzLlRDTEFTU1BST0MucHJvY2Vzc2luZzsKKwkJfQorCisJCWlmIChhZGR0cy5XTU1UU1BFQy5wcmVzZW50KSB7CisJCQlwQWRkVHMtPndzbVRzcGVjUHJlc2VudCA9IDE7CisJCQljb252ZXJ0X3dtbXRzcGVjKHBNYWMsICZwQWRkVHMtPnRzcGVjLCAmYWRkdHMuV01NVFNQRUMpOworCQl9CisKKwkJaWYgKGFkZHRzLm51bV9XTU1UQ0xBUykgeworCQkJaiA9ICh1aW50OF90KSAocEFkZFRzLT5udW1UY2xhcyArIGFkZHRzLm51bV9XTU1UQ0xBUyk7CisJCQlpZiAoU0lSX01BQ19UQ0xBU0lFX01BWE5VTSA+IGopCisJCQkJaiA9IFNJUl9NQUNfVENMQVNJRV9NQVhOVU07CisKKwkJCWZvciAoaSA9IHBBZGRUcy0+bnVtVGNsYXM7IGkgPCBqOyArK2kpIHsKKwkJCQlpZiAoZVNJUl9TVUNDRVNTICE9CisJCQkJICAgIGNvbnZlcnRfd21tdGNsYXMocE1hYywKKwkJCQkJCSAgICAgJihwQWRkVHMtPnRjbGFzSW5mb1tpXSksCisJCQkJCQkgICAgICYoYWRkdHMuV01NVENMQVNbaV0pKSkgeworCQkJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCQlGTAorCQkJCQkJCSgiRmFpbGVkIHRvIGNvbnZlcnQgYSBUQ0xBUyBJRS5cbiIpKTsKKwkJCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoYWRkdHMuV01NVENMQVNQUk9DLnByZXNlbnQpIHsKKwkJCXBBZGRUcy0+dGNsYXNQcm9jUHJlc2VudCA9IDE7CisJCQlwQWRkVHMtPnRjbGFzUHJvYyA9IGFkZHRzLldNTVRDTEFTUFJPQy5wcm9jZXNzaW5nOworCQl9CisKKwkJaWYgKDEgPCBwQWRkVHMtPm51bVRjbGFzICYmICghcEFkZFRzLT50Y2xhc1Byb2NQcmVzZW50KSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCIlZCBUQ0xBUyBJRSBidXQgbm90IFRDTEFTUFJPQyBJRS5cbiIpLAorCQkJCXBBZGRUcy0+bnVtVGNsYXMpOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCX0gZWxzZSB7CisJCXBBZGRUcy0+ZGlhbG9nVG9rZW4gPSB3bW1hZGR0cy5EaWFsb2dUb2tlbi50b2tlbjsKKworCQlpZiAod21tYWRkdHMuV01NVFNQRUMucHJlc2VudCkgeworCQkJcEFkZFRzLT53bWVUc3BlY1ByZXNlbnQgPSAxOworCQkJY29udmVydF93bW10c3BlYyhwTWFjLCAmcEFkZFRzLT50c3BlYywKKwkJCQkJICZ3bW1hZGR0cy5XTU1UU1BFQyk7CisJCX0gZWxzZSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIk1hbmRhdG9yeSBXTUUgVFNQRUMgZWxlbWVudCBtaXNzaW5nIVxuIikpOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHNpcl9jb252ZXJ0X2FkZHRzX3JlcTJfc3RydWN0LiAqLworCit0U2lyUmV0U3RhdHVzCitzaXJfY29udmVydF9hZGR0c19yc3AyX3N0cnVjdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgdWludDhfdCAqcEZyYW1lLAorCQkJICAgICAgdWludDMyX3QgbkZyYW1lLCB0U2lyQWRkdHNSc3BJbmZvICpwQWRkVHMpCit7CisJdERvdDExZkFkZFRTUmVzcG9uc2UgYWRkdHMgPSB7IHswfX07CisJdERvdDExZldNTUFkZFRTUmVzcG9uc2Ugd21tYWRkdHMgPSB7IHswfX07CisJdWludDhfdCBqOworCXVpbnQxNl90IGk7CisJdWludDMyX3Qgc3RhdHVzOworCisJaWYgKFNJUl9NQUNfUU9TX0FERF9UU19SU1AgIT0gKihwRnJhbWUgKyAxKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJzaXJfY29udmVydF9hZGR0c19yc3AyX3N0cnVjdCBpbnZva2VkICIKKwkJCQkgICAgICAgIndpdGggYW4gQWN0aW9uIG9mICVkOyB0aGlzIGlzIG5vdCAiCisJCQkJICAgICAgICJzdXBwb3J0ZWQgJiBpcyBwcm9iYWJseSBhbiBlcnJvci4iKSwKKwkJCSoocEZyYW1lICsgMSkpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKwkvKiBaZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSBwQWRkVHMsIHNpemVvZih0U2lyQWRkdHNSc3BJbmZvKSwgMCk7CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgJmFkZHRzLCBzaXplb2YodERvdDExZkFkZFRTUmVzcG9uc2UpLCAwKTsKKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmd21tYWRkdHMsIHNpemVvZih0RG90MTFmV01NQWRkVFNSZXNwb25zZSksIDApOworCisJLyogZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsICovCisJc3dpdGNoICgqcEZyYW1lKSB7CisJY2FzZSBTSVJfTUFDX0FDVElPTl9RT1NfTUdNVDoKKwkJc3RhdHVzID0KKwkJCWRvdDExZl91bnBhY2tfYWRkX3RzX3Jlc3BvbnNlKHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmYWRkdHMpOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfQUNUSU9OX1dNRToKKwkJc3RhdHVzID0KKwkJCWRvdDExZl91bnBhY2tfd21tX2FkZF90c19yZXNwb25zZShwTWFjLCBwRnJhbWUsIG5GcmFtZSwKKwkJCQkJCQkgICZ3bW1hZGR0cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbV9sb2cocE1hYywgTE9HRSwgRkwoInNpcl9jb252ZXJ0X2FkZHRzX3JzcDJfc3RydWN0IGludm9rZWQgIgorCQkJCSAgICAgICAid2l0aCBhIENhdGVnb3J5IG9mICVkOyB0aGlzIGlzIG5vdCIKKwkJCQkgICAgICAgIiBzdXBwb3J0ZWQgJiBpcyBwcm9iYWJseSBhbiBlcnJvci4iKSwKKwkJCSpwRnJhbWUpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhcnNlIGFuIEFkZCBUUyBSZXNwb25zZSBmIgorCQkJCSAgICAgICAicmFtZSAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKwkJCXN0YXR1cywgbkZyYW1lKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOworCQkgICAgICAgKQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW4iCisJCQkJICAgICAgICJnIGFuIEFkZCBUUyBSZXNwb25zZSBmcmFtZSAoMHglMDh4LCIKKwkJCQkgICAgICAgIiVkIGJ5dGVzKTpcbiIpLCBzdGF0dXMsIG5GcmFtZSk7CisJCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTsKKwkJICAgICAgICkKKwl9CisJLyogJiAidHJhbnNsaXRlcmF0ZSIgZnJvbSBhICd0RG90MTFmQWRkVFNSZXNwb25zZScgb3IgYSAqLworCS8qICd0RG90MTFXTU1BZGRUU1Jlc3BvbnNlJyB0byBhICd0U2lyTWFjQWRkdHNSc3BJbmZvJy4uLiAqLworCWlmIChTSVJfTUFDX0FDVElPTl9RT1NfTUdNVCA9PSAqcEZyYW1lKSB7CisJCXBBZGRUcy0+ZGlhbG9nVG9rZW4gPSBhZGR0cy5EaWFsb2dUb2tlbi50b2tlbjsKKwkJcEFkZFRzLT5zdGF0dXMgPSAodFNpck1hY1N0YXR1c0NvZGVzKSBhZGR0cy5TdGF0dXMuc3RhdHVzOworCisJCWlmIChhZGR0cy5UU0RlbGF5LnByZXNlbnQpIHsKKwkJCWNvbnZlcnRfdHNfZGVsYXkocE1hYywgJnBBZGRUcy0+ZGVsYXksICZhZGR0cy5UU0RlbGF5KTsKKwkJfQorCQkvKiBUUyBEZWxheSBpcyBwcmVzZW50IGlmZiBzdGF0dXMgaW5kaWNhdGVzIGl0cyBwcmVzZW5jZSAqLworCQlpZiAoZVNJUl9NQUNfVFNfTk9UX0NSRUFURURfU1RBVFVTID09IHBBZGRUcy0+c3RhdHVzCisJCSAgICAmJiAhYWRkdHMuVFNEZWxheS5wcmVzZW50KSB7CisJCQlsaW1fbG9nKHBNYWMsIExPR1csIEZMKCJNaXNzaW5nIFRTRGVsYXkgSUUuXG4iKSk7CisJCX0KKworCQlpZiAoYWRkdHMuVFNQRUMucHJlc2VudCkgeworCQkJY29udmVydF90c3BlYyhwTWFjLCAmcEFkZFRzLT50c3BlYywgJmFkZHRzLlRTUEVDKTsKKwkJfSBlbHNlIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTAorCQkJCQkoIk1hbmRhdG9yeSBUU1BFQyBlbGVtZW50IG1pc3NpbmcgaW4gQWRkIFRTIFJlc3BvbnNlLlxuIikpOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCisJCWlmIChhZGR0cy5udW1fVENMQVMpIHsKKwkJCXBBZGRUcy0+bnVtVGNsYXMgPSAodWludDhfdCkgYWRkdHMubnVtX1RDTEFTOworCisJCQlmb3IgKGkgPSAwVTsgaSA8IGFkZHRzLm51bV9UQ0xBUzsgKytpKSB7CisJCQkJaWYgKGVTSVJfU1VDQ0VTUyAhPQorCQkJCSAgICBjb252ZXJ0X3RjbGFzKHBNYWMsICYocEFkZFRzLT50Y2xhc0luZm9baV0pLAorCQkJCQkJICAmKGFkZHRzLlRDTEFTW2ldKSkpIHsKKwkJCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkJRkwKKwkJCQkJCQkoIkZhaWxlZCB0byBjb252ZXJ0IGEgVENMQVMgSUUuXG4iKSk7CisJCQkJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGFkZHRzLlRDTEFTU1BST0MucHJlc2VudCkgeworCQkJcEFkZFRzLT50Y2xhc1Byb2NQcmVzZW50ID0gMTsKKwkJCXBBZGRUcy0+dGNsYXNQcm9jID0gYWRkdHMuVENMQVNTUFJPQy5wcm9jZXNzaW5nOworCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQlpZiAoYWRkdHMuRVNFVHJhZlN0cm1NZXQucHJlc2VudCkgeworCQkJcEFkZFRzLT50c21QcmVzZW50ID0gMTsKKwkJCWNkZl9tZW1fY29weSgmcEFkZFRzLT50c21JRS50c2lkLAorCQkJCSAgICAgJmFkZHRzLkVTRVRyYWZTdHJtTWV0LnRzaWQsCisJCQkJICAgICBzaXplb2YodFNpck1hY0VTRVRTTUlFKSk7CisJCX0KKyNlbmRpZgorCQlpZiAoYWRkdHMuU2NoZWR1bGUucHJlc2VudCkgeworCQkJcEFkZFRzLT5zY2hlZHVsZVByZXNlbnQgPSAxOworCQkJY29udmVydF9zY2hlZHVsZShwTWFjLCAmcEFkZFRzLT5zY2hlZHVsZSwKKwkJCQkJICZhZGR0cy5TY2hlZHVsZSk7CisJCX0KKworCQlpZiAoYWRkdHMuV01NU2NoZWR1bGUucHJlc2VudCkgeworCQkJcEFkZFRzLT5zY2hlZHVsZVByZXNlbnQgPSAxOworCQkJY29udmVydF93bW1fc2NoZWR1bGUocE1hYywgJnBBZGRUcy0+c2NoZWR1bGUsCisJCQkJCSAgICAgJmFkZHRzLldNTVNjaGVkdWxlKTsKKwkJfQorCisJCWlmIChhZGR0cy5XTU1UU1BFQy5wcmVzZW50KSB7CisJCQlwQWRkVHMtPndzbVRzcGVjUHJlc2VudCA9IDE7CisJCQljb252ZXJ0X3dtbXRzcGVjKHBNYWMsICZwQWRkVHMtPnRzcGVjLCAmYWRkdHMuV01NVFNQRUMpOworCQl9CisKKwkJaWYgKGFkZHRzLm51bV9XTU1UQ0xBUykgeworCQkJaiA9ICh1aW50OF90KSAocEFkZFRzLT5udW1UY2xhcyArIGFkZHRzLm51bV9XTU1UQ0xBUyk7CisJCQlpZiAoU0lSX01BQ19UQ0xBU0lFX01BWE5VTSA+IGopCisJCQkJaiA9IFNJUl9NQUNfVENMQVNJRV9NQVhOVU07CisKKwkJCWZvciAoaSA9IHBBZGRUcy0+bnVtVGNsYXM7IGkgPCBqOyArK2kpIHsKKwkJCQlpZiAoZVNJUl9TVUNDRVNTICE9CisJCQkJICAgIGNvbnZlcnRfd21tdGNsYXMocE1hYywKKwkJCQkJCSAgICAgJihwQWRkVHMtPnRjbGFzSW5mb1tpXSksCisJCQkJCQkgICAgICYoYWRkdHMuV01NVENMQVNbaV0pKSkgeworCQkJCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQkJCQlGTAorCQkJCQkJCSgiRmFpbGVkIHRvIGNvbnZlcnQgYSBUQ0xBUyBJRS5cbiIpKTsKKwkJCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoYWRkdHMuV01NVENMQVNQUk9DLnByZXNlbnQpIHsKKwkJCXBBZGRUcy0+dGNsYXNQcm9jUHJlc2VudCA9IDE7CisJCQlwQWRkVHMtPnRjbGFzUHJvYyA9IGFkZHRzLldNTVRDTEFTUFJPQy5wcm9jZXNzaW5nOworCQl9CisKKwkJaWYgKDEgPCBwQWRkVHMtPm51bVRjbGFzICYmICghcEFkZFRzLT50Y2xhc1Byb2NQcmVzZW50KSkgeworCQkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCIlZCBUQ0xBUyBJRSBidXQgbm90IFRDTEFTUFJPQyBJRS5cbiIpLAorCQkJCXBBZGRUcy0+bnVtVGNsYXMpOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCX0gZWxzZSB7CisJCXBBZGRUcy0+ZGlhbG9nVG9rZW4gPSB3bW1hZGR0cy5EaWFsb2dUb2tlbi50b2tlbjsKKwkJcEFkZFRzLT5zdGF0dXMgPQorCQkJKHRTaXJNYWNTdGF0dXNDb2Rlcykgd21tYWRkdHMuU3RhdHVzQ29kZS5zdGF0dXNDb2RlOworCisJCWlmICh3bW1hZGR0cy5XTU1UU1BFQy5wcmVzZW50KSB7CisJCQlwQWRkVHMtPndtZVRzcGVjUHJlc2VudCA9IDE7CisJCQljb252ZXJ0X3dtbXRzcGVjKHBNYWMsICZwQWRkVHMtPnRzcGVjLAorCQkJCQkgJndtbWFkZHRzLldNTVRTUEVDKTsKKwkJfSBlbHNlIHsKKwkJCWxpbV9sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiTWFuZGF0b3J5IFdNRSBUU1BFQyBlbGVtZW50IG1pc3NpbmchXG4iKSk7CisJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQl9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCWlmICh3bW1hZGR0cy5FU0VUcmFmU3RybU1ldC5wcmVzZW50KSB7CisJCQlwQWRkVHMtPnRzbVByZXNlbnQgPSAxOworCQkJY2RmX21lbV9jb3B5KCZwQWRkVHMtPnRzbUlFLnRzaWQsCisJCQkJICAgICAmd21tYWRkdHMuRVNFVHJhZlN0cm1NZXQudHNpZCwKKwkJCQkgICAgIHNpemVvZih0U2lyTWFjRVNFVFNNSUUpKTsKKwkJfQorI2VuZGlmCisKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qIEVuZCBzaXJfY29udmVydF9hZGR0c19yc3AyX3N0cnVjdC4gKi8KKwordFNpclJldFN0YXR1cworc2lyX2NvbnZlcnRfZGVsdHNfcmVxMl9zdHJ1Y3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgIHVpbnQ4X3QgKnBGcmFtZSwKKwkJCSAgICAgIHVpbnQzMl90IG5GcmFtZSwgdFNpckRlbHRzUmVxSW5mbyAqcERlbFRzKQoreworCXREb3QxMWZEZWxUUyBkZWx0cyA9IHsgezB9fTsKKwl0RG90MTFmV01NRGVsVFMgd21tZGVsdHMgPSB7IHswfX07CisJdWludDMyX3Qgc3RhdHVzOworCisJaWYgKFNJUl9NQUNfUU9TX0RFTF9UU19SRVEgIT0gKihwRnJhbWUgKyAxKSkgeworCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJzaXJDb252ZXJ0RGVsdHNSc3AyU3RydWN0IGludm9rZWQgIgorCQkJCSAgICAgICAid2l0aCBhbiBBY3Rpb24gb2YgJWQ7IHRoaXMgaXMgbm90ICIKKwkJCQkgICAgICAgInN1cHBvcnRlZCAmIGlzIHByb2JhYmx5IGFuIGVycm9yLiIpLAorCQkJKihwRnJhbWUgKyAxKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCS8qIFplcm8taW5pdCBvdXIgW291dF0gcGFyYW1ldGVyLCAqLworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBEZWxUcywgc2l6ZW9mKHRTaXJEZWx0c1JlcUluZm8pLCAwKTsKKworCS8qIGRlbGVnYXRlIHRvIHRoZSBmcmFtZXNjLWdlbmVyYXRlZCBjb2RlLCAqLworCXN3aXRjaCAoKnBGcmFtZSkgeworCWNhc2UgU0lSX01BQ19BQ1RJT05fUU9TX01HTVQ6CisJCXN0YXR1cyA9IGRvdDExZl91bnBhY2tfZGVsX3RzKHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmZGVsdHMpOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfQUNUSU9OX1dNRToKKwkJc3RhdHVzID0gZG90MTFmX3VucGFja193bW1fZGVsX3RzKHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmd21tZGVsdHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsaW1fbG9nKHBNYWMsIExPR0UsIEZMKCJzaXJDb252ZXJ0RGVsdHNSc3AyU3RydWN0IGludm9rZWQgIgorCQkJCSAgICAgICAid2l0aCBhIENhdGVnb3J5IG9mICVkOyB0aGlzIGlzIG5vdCIKKwkJCQkgICAgICAgIiBzdXBwb3J0ZWQgJiBpcyBwcm9iYWJseSBhbiBlcnJvci4iKSwKKwkJCSpwRnJhbWUpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhcnNlIGFuIERlbCBUUyBSZXF1ZXN0IGYiCisJCQkJICAgICAgICJyYW1lICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJZG90MTFmX2xvZyhwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbiIKKwkJCQkJICAiZyBhbiBEZWwgVFMgUmVxdWVzdCBmcmFtZSAoMHglMDh4LCIKKwkJCQkJICAiJWQgYnl0ZXMpOlxuIiksIHN0YXR1cywgbkZyYW1lKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOworCQkgICAgICAgKQorCX0KKwkvKiAmICJ0cmFuc2xpdGVyYXRlIiBmcm9tIGEgJ3REb3QxMWZEZWxUU1Jlc3BvbnNlJyBvciBhICovCisJLyogJ3REb3QxMVdNTURlbFRTUmVzcG9uc2UnIHRvIGEgJ3RTaXJNYWNEZWx0c1JlcUluZm8nLi4uICovCisJaWYgKFNJUl9NQUNfQUNUSU9OX1FPU19NR01UID09ICpwRnJhbWUpIHsKKwkJcERlbFRzLT50c2luZm8udHJhZmZpYy50cmFmZmljVHlwZSA9CisJCQkodWludDE2X3QpIGRlbHRzLlRTSW5mby50cmFmZmljX3R5cGU7CisJCXBEZWxUcy0+dHNpbmZvLnRyYWZmaWMudHNpZCA9ICh1aW50MTZfdCkgZGVsdHMuVFNJbmZvLnRzaWQ7CisJCXBEZWxUcy0+dHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID0KKwkJCSh1aW50MTZfdCkgZGVsdHMuVFNJbmZvLmRpcmVjdGlvbjsKKwkJcERlbFRzLT50c2luZm8udHJhZmZpYy5hY2Nlc3NQb2xpY3kgPQorCQkJKHVpbnQxNl90KSBkZWx0cy5UU0luZm8uYWNjZXNzX3BvbGljeTsKKwkJcERlbFRzLT50c2luZm8udHJhZmZpYy5hZ2dyZWdhdGlvbiA9CisJCQkodWludDE2X3QpIGRlbHRzLlRTSW5mby5hZ2dyZWdhdGlvbjsKKwkJcERlbFRzLT50c2luZm8udHJhZmZpYy5wc2IgPSAodWludDE2X3QpIGRlbHRzLlRTSW5mby5wc2I7CisJCXBEZWxUcy0+dHNpbmZvLnRyYWZmaWMudXNlclByaW8gPQorCQkJKHVpbnQxNl90KSBkZWx0cy5UU0luZm8udXNlcl9wcmlvcml0eTsKKwkJcERlbFRzLT50c2luZm8udHJhZmZpYy5hY2tQb2xpY3kgPQorCQkJKHVpbnQxNl90KSBkZWx0cy5UU0luZm8udHNpbmZvX2Fja19wb2w7CisKKwkJcERlbFRzLT50c2luZm8uc2NoZWR1bGUuc2NoZWR1bGUgPQorCQkJKHVpbnQ4X3QpIGRlbHRzLlRTSW5mby5zY2hlZHVsZTsKKwl9IGVsc2UgeworCQlpZiAod21tZGVsdHMuV01NVFNQRUMucHJlc2VudCkgeworCQkJcERlbFRzLT53bWVUc3BlY1ByZXNlbnQgPSAxOworCQkJY29udmVydF93bW10c3BlYyhwTWFjLCAmcERlbFRzLT50c3BlYywKKwkJCQkJICZ3bW1kZWx0cy5XTU1UU1BFQyk7CisJCX0gZWxzZSB7CisJCQlkb3QxMWZfbG9nKHBNYWMsIExPR0UsCisJCQkJICAgRkwoIk1hbmRhdG9yeSBXTUUgVFNQRUMgZWxlbWVudCBtaXNzaW5nIVxuIikpOworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHNpcl9jb252ZXJ0X2RlbHRzX3JlcTJfc3RydWN0LiAqLworCit0U2lyUmV0U3RhdHVzCitzaXJfY29udmVydF9xb3NfbWFwX2NvbmZpZ3VyZV9mcmFtZTJfc3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICB1aW50OF90ICpwRnJhbWUsCisJCQkJCSAgICB1aW50MzJfdCBuRnJhbWUsCisJCQkJCSAgICB0U2lyUW9zTWFwU2V0ICpwUW9zTWFwU2V0KQoreworCXREb3QxMWZRb3NNYXBDb25maWd1cmUgbWFwQ29uZmlndXJlOworCXVpbnQzMl90IHN0YXR1czsKKwlzdGF0dXMgPQorCQlkb3QxMWZfdW5wYWNrX3Fvc19tYXBfY29uZmlndXJlKHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmbWFwQ29uZmlndXJlKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWRvdDExZl9sb2cocE1hYywgTE9HRSwKKwkJCSAgIEZMCisJCQkJICAgKCJGYWlsZWQgdG8gcGFyc2UgUW9zIE1hcCBDb25maWd1cmUgZnJhbWUgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisJCQkgICBzdGF0dXMsIG5GcmFtZSk7CisJCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlkb3QxMWZfbG9nKHBNYWMsIExPR1csCisJCQkgICBGTAorCQkJCSAgICgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbmcgUW9zIE1hcCBDb25maWd1cmUgZnJhbWUgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisJCQkgICBzdGF0dXMsIG5GcmFtZSk7CisJCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTsKKwkJICAgICAgICkKKwl9CisJcFFvc01hcFNldC0+cHJlc2VudCA9IG1hcENvbmZpZ3VyZS5Rb3NNYXBTZXQucHJlc2VudDsKKwljb252ZXJ0X3Fvc19tYXBzZXRfZnJhbWUocE1hYy0+aEhkZCwgcFFvc01hcFNldCwgJm1hcENvbmZpZ3VyZS5Rb3NNYXBTZXQpOworCWxpbV9sb2dfcW9zX21hcF9zZXQocE1hYywgcFFvc01hcFNldCk7CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworI2lmZGVmIEFOSV9TVVBQT1JUXzExSAordFNpclJldFN0YXR1cworc2lyX2NvbnZlcnRfdHBjX3JlcV9mcmFtZTJfc3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICB1aW50OF90ICpwRnJhbWUsCisJCQkJICB0cFNpck1hY1RwY1JlcUFjdGlvbkZyYW1lIHBUcGNSZXFGcmFtZSwKKwkJCQkgIHVpbnQzMl90IG5GcmFtZSkKK3sKKwl0RG90MTFmVFBDUmVxdWVzdCByZXE7CisJdWludDMyX3Qgc3RhdHVzOworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBUcGNSZXFGcmFtZSwgc2l6ZW9mKHRTaXJNYWNUcGNSZXFBY3Rpb25GcmFtZSksCisJCSAgICAwKTsKKwlzdGF0dXMgPSBkb3QxMWZfdW5wYWNrX3RwY19yZXF1ZXN0KHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmcmVxKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWRvdDExZl9sb2cocE1hYywgTE9HRSwKKwkJCSAgIEZMCisJCQkJICAgKCJGYWlsZWQgdG8gcGFyc2UgYSBUUEMgUmVxdWVzdCBmcmFtZSAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKwkJCSAgIHN0YXR1cywgbkZyYW1lKTsKKwkJUEVMT0cyKHNpcl9kdW1wX2J1ZgorCQkJICAgICAgIChwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOworCQkgICAgICAgKQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChzdGF0dXMpKSB7CisJCWRvdDExZl9sb2cocE1hYywgTE9HVywKKwkJCSAgIEZMCisJCQkJICAgKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHVucGFja2luZyBhIFRQQyBSZXF1ZXN0IGZyYW1lICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJICAgc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJfQorCS8qICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZlRQQ1JlcXVlc3QnIHRvIGEgKi8KKwkvKiAndFNpck1hY1RwY1JlcUFjdGlvbkZyYW1lJy4uLiAqLworCXBUcGNSZXFGcmFtZS0+YWN0aW9uSGVhZGVyLmNhdGVnb3J5ID0gcmVxLkNhdGVnb3J5LmNhdGVnb3J5OworCXBUcGNSZXFGcmFtZS0+YWN0aW9uSGVhZGVyLmFjdGlvbklEID0gcmVxLkFjdGlvbi5hY3Rpb247CisJcFRwY1JlcUZyYW1lLT5hY3Rpb25IZWFkZXIuZGlhbG9nVG9rZW4gPSByZXEuRGlhbG9nVG9rZW4udG9rZW47CisJaWYgKHJlcS5UUENSZXF1ZXN0LnByZXNlbnQpIHsKKwkJcFRwY1JlcUZyYW1lLT50eXBlID0gRE9UMTFGX0VJRF9UUENSRVFVRVNUOworCQlwVHBjUmVxRnJhbWUtPmxlbmd0aCA9IDA7CisJfSBlbHNlIHsKKwkJZG90MTFmX2xvZyhwTWFjLCBMT0dXLCBGTCgiISEhUmN2IFRQQyBSZXEgb2YgaW5hbGlkIHR5cGUhXG4iKSk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qIEVuZCBzaXJfY29udmVydF90cGNfcmVxX2ZyYW1lMl9zdHJ1Y3QuICovCit0U2lyUmV0U3RhdHVzCitzaXJfY29udmVydF9tZWFzX3JlcV9mcmFtZTJfc3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgdWludDhfdCAqcEZyYW1lLAorCQkJCSAgIHRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lIHBNZWFzUmVxRnJhbWUsCisJCQkJICAgdWludDMyX3QgbkZyYW1lKQoreworCXREb3QxMWZNZWFzdXJlbWVudFJlcXVlc3QgbXI7CisJdWludDMyX3Qgc3RhdHVzOworCisJLyogWmVyby1pbml0IG91ciBbb3V0XSBwYXJhbWV0ZXIsICovCisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgcE1lYXNSZXFGcmFtZSwKKwkJICAgIHNpemVvZih0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSksIDApOworCisJLyogZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsICovCisJc3RhdHVzID0gZG90MTFmX3VucGFja19tZWFzdXJlbWVudF9yZXF1ZXN0KHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmbXIpOworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJZG90MTFmX2xvZyhwTWFjLCBMT0dFLAorCQkJICAgRkwKKwkJCQkgICAoIkZhaWxlZCB0byBwYXJzZSBhIE1lYXN1cmVtZW50IFJlcXVlc3QgZnJhbWUgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisJCQkgICBzdGF0dXMsIG5GcmFtZSk7CisJCVBFTE9HMihzaXJfZHVtcF9idWYKKwkJCSAgICAgICAocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTsKKwkJICAgICAgICkKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlkb3QxMWZfbG9nKHBNYWMsIExPR1csCisJCQkgICBGTAorCQkJCSAgICgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbmcgYSBNZWFzdXJlbWVudCBSZXF1ZXN0IGZyYW1lICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorCQkJICAgc3RhdHVzLCBuRnJhbWUpOworCQlQRUxPRzIoc2lyX2R1bXBfYnVmCisJCQkgICAgICAgKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7CisJCSAgICAgICApCisJfQorCS8qICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZk1lYXN1cmVtZW50UmVxdWVzdCcgdG8gYSAqLworCS8qICd0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZScuLi4gKi8KKwlwTWVhc1JlcUZyYW1lLT5hY3Rpb25IZWFkZXIuY2F0ZWdvcnkgPSBtci5DYXRlZ29yeS5jYXRlZ29yeTsKKwlwTWVhc1JlcUZyYW1lLT5hY3Rpb25IZWFkZXIuYWN0aW9uSUQgPSBtci5BY3Rpb24uYWN0aW9uOworCXBNZWFzUmVxRnJhbWUtPmFjdGlvbkhlYWRlci5kaWFsb2dUb2tlbiA9IG1yLkRpYWxvZ1Rva2VuLnRva2VuOworCisJaWYgKDAgPT0gbXIubnVtX01lYXN1cmVtZW50UmVxdWVzdCkgeworCQlkb3QxMWZfbG9nKHBNYWMsIExPR0UsCisJCQkgICBGTAorCQkJCSAgICgiTWlzc2luZyBtYW5kYXRvcnkgSUUgaW4gTWVhc3VyZW1lbnQgUmVxdWVzdCBGcmFtZS5cbiIpKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9IGVsc2UgaWYgKDEgPCBtci5udW1fTWVhc3VyZW1lbnRSZXF1ZXN0KSB7CisJCWxpbV9sb2cocE1hYywgTE9HVywKKwkJCUZMKCJXYXJuaW5nOiBkcm9wcGluZyBleHRyYSBNZWFzdXJlbWVudCBSZXF1ZXN0IElFcyEiKSk7CisJfQorCisJcE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLnR5cGUgPSBET1QxMUZfRUlEX01FQVNVUkVNRU5UUkVRVUVTVDsKKwlwTWVhc1JlcUZyYW1lLT5tZWFzUmVxSUUubGVuZ3RoID0gRE9UMTFGX0lFX01FQVNVUkVNRU5UUkVRVUVTVF9NSU5fTEVOOworCXBNZWFzUmVxRnJhbWUtPm1lYXNSZXFJRS5tZWFzVG9rZW4gPQorCQltci5NZWFzdXJlbWVudFJlcXVlc3RbMF0ubWVhc3VyZW1lbnRfdG9rZW47CisJcE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLm1lYXNSZXFNb2RlID0KKwkJKG1yLk1lYXN1cmVtZW50UmVxdWVzdFswXS5yZXNlcnZlZCA8PCAzKSB8IChtci4KKwkJCQkJCQkgICAgTWVhc3VyZW1lbnRSZXF1ZXN0WzBdLgorCQkJCQkJCSAgICBlbmFibGUgPDwgMikgfCAobXIuCisJCQkJCQkJCQkgICAgTWVhc3VyZW1lbnRSZXF1ZXN0CisJCQkJCQkJCQkgICAgWzBdLgorCQkJCQkJCQkJICAgIHJlcXVlc3QKKwkJCQkJCQkJCSAgICA8PCAxKSB8CisJCShtci5NZWFzdXJlbWVudFJlcXVlc3RbMF0ucmVwb3J0IC8qPDwgMCAqLyApOworCXBNZWFzUmVxRnJhbWUtPm1lYXNSZXFJRS5tZWFzVHlwZSA9CisJCW1yLk1lYXN1cmVtZW50UmVxdWVzdFswXS5tZWFzdXJlbWVudF90eXBlOworCisJcE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLm1lYXNSZXFGaWVsZC5jaGFubmVsTnVtYmVyID0KKwkJbXIuTWVhc3VyZW1lbnRSZXF1ZXN0WzBdLmNoYW5uZWxfbm87CisKKwljZGZfbWVtX2NvcHkocE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLm1lYXNSZXFGaWVsZC5tZWFzU3RhcnRUaW1lLAorCQkgICAgIG1yLk1lYXN1cmVtZW50UmVxdWVzdFswXS5tZWFzX3N0YXJ0X3RpbWUsIDgpOworCisJcE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLm1lYXNSZXFGaWVsZC5tZWFzRHVyYXRpb24gPQorCQltci5NZWFzdXJlbWVudFJlcXVlc3RbMF0ubWVhc19kdXJhdGlvbjsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHNpcl9jb252ZXJ0X21lYXNfcmVxX2ZyYW1lMl9zdHJ1Y3QuICovCisjZW5kaWYKKwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfdHNwZWModFNpck1hY1RzcGVjSUUgKnBPbGQsIHREb3QxMWZJRVRTUEVDICpwRG90MTFmKQoreworCXBEb3QxMWYtPnRyYWZmaWNfdHlwZSA9IHBPbGQtPnRzaW5mby50cmFmZmljLnRyYWZmaWNUeXBlOworCXBEb3QxMWYtPnRzaWQgPSBwT2xkLT50c2luZm8udHJhZmZpYy50c2lkOworCXBEb3QxMWYtPmRpcmVjdGlvbiA9IHBPbGQtPnRzaW5mby50cmFmZmljLmRpcmVjdGlvbjsKKwlwRG90MTFmLT5hY2Nlc3NfcG9saWN5ID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5OworCXBEb3QxMWYtPmFnZ3JlZ2F0aW9uID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMuYWdncmVnYXRpb247CisJcERvdDExZi0+cHNiID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMucHNiOworCXBEb3QxMWYtPnVzZXJfcHJpb3JpdHkgPSBwT2xkLT50c2luZm8udHJhZmZpYy51c2VyUHJpbzsKKwlwRG90MTFmLT50c2luZm9fYWNrX3BvbCA9IHBPbGQtPnRzaW5mby50cmFmZmljLmFja1BvbGljeTsKKwlwRG90MTFmLT5zY2hlZHVsZSA9IHBPbGQtPnRzaW5mby5zY2hlZHVsZS5zY2hlZHVsZTsKKwkvKiBBcyBkZWZpbmVkIGluIElFRUUgODAyLjExLTIwMDcsIHNlY3Rpb24gNy4zLjIuMzAKKwkgKiBOb21pbmFsIE1TRFUgc2l6ZTogQml0WzA6MTRdPVNpemUsIEJpdFsxNV09Rml4ZWQKKwkgKi8KKwlwRG90MTFmLT5zaXplID0gKHBPbGQtPm5vbU1zZHVTeiAmIDB4N2ZmZik7CisJcERvdDExZi0+Zml4ZWQgPSAocE9sZC0+bm9tTXNkdVN6ICYgMHg4MDAwKSA/IDEgOiAwOworCXBEb3QxMWYtPm1heF9tc2R1X3NpemUgPSBwT2xkLT5tYXhNc2R1U3o7CisJcERvdDExZi0+bWluX3NlcnZpY2VfaW50ID0gcE9sZC0+bWluU3ZjSW50ZXJ2YWw7CisJcERvdDExZi0+bWF4X3NlcnZpY2VfaW50ID0gcE9sZC0+bWF4U3ZjSW50ZXJ2YWw7CisJcERvdDExZi0+aW5hY3Rpdml0eV9pbnQgPSBwT2xkLT5pbmFjdEludGVydmFsOworCXBEb3QxMWYtPnN1c3BlbnNpb25faW50ID0gcE9sZC0+c3VzcGVuZEludGVydmFsOworCXBEb3QxMWYtPnNlcnZpY2Vfc3RhcnRfdGltZSA9IHBPbGQtPnN2Y1N0YXJ0VGltZTsKKwlwRG90MTFmLT5taW5fZGF0YV9yYXRlID0gcE9sZC0+bWluRGF0YVJhdGU7CisJcERvdDExZi0+bWVhbl9kYXRhX3JhdGUgPSBwT2xkLT5tZWFuRGF0YVJhdGU7CisJcERvdDExZi0+cGVha19kYXRhX3JhdGUgPSBwT2xkLT5wZWFrRGF0YVJhdGU7CisJcERvdDExZi0+YnVyc3Rfc2l6ZSA9IHBPbGQtPm1heEJ1cnN0U3o7CisJcERvdDExZi0+ZGVsYXlfYm91bmQgPSBwT2xkLT5kZWxheUJvdW5kOworCXBEb3QxMWYtPm1pbl9waHlfcmF0ZSA9IHBPbGQtPm1pblBoeVJhdGU7CisJcERvdDExZi0+c3VycGx1c19id19hbGxvd2FuY2UgPSBwT2xkLT5zdXJwbHVzQnc7CisJcERvdDExZi0+bWVkaXVtX3RpbWUgPSBwT2xkLT5tZWRpdW1UaW1lOworCisJcERvdDExZi0+cHJlc2VudCA9IDE7CisKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl90c3BlYy4gKi8KKwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfd21tdHNwZWModFNpck1hY1RzcGVjSUUgKnBPbGQsIHREb3QxMWZJRVdNTVRTUEVDICpwRG90MTFmKQoreworCXBEb3QxMWYtPnRyYWZmaWNfdHlwZSA9IHBPbGQtPnRzaW5mby50cmFmZmljLnRyYWZmaWNUeXBlOworCXBEb3QxMWYtPnRzaWQgPSBwT2xkLT50c2luZm8udHJhZmZpYy50c2lkOworCXBEb3QxMWYtPmRpcmVjdGlvbiA9IHBPbGQtPnRzaW5mby50cmFmZmljLmRpcmVjdGlvbjsKKwlwRG90MTFmLT5hY2Nlc3NfcG9saWN5ID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5OworCXBEb3QxMWYtPmFnZ3JlZ2F0aW9uID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMuYWdncmVnYXRpb247CisJcERvdDExZi0+cHNiID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMucHNiOworCXBEb3QxMWYtPnVzZXJfcHJpb3JpdHkgPSBwT2xkLT50c2luZm8udHJhZmZpYy51c2VyUHJpbzsKKwlwRG90MTFmLT50c2luZm9fYWNrX3BvbCA9IHBPbGQtPnRzaW5mby50cmFmZmljLmFja1BvbGljeTsKKwlwRG90MTFmLT5idXJzdF9zaXplX2RlZm4gPSBwT2xkLT50c2luZm8udHJhZmZpYy5idXJzdFNpemVEZWZuOworCS8qIEFzIGRlZmluZWQgaW4gSUVFRSA4MDIuMTEtMjAwNywgc2VjdGlvbiA3LjMuMi4zMAorCSAqIE5vbWluYWwgTVNEVSBzaXplOiBCaXRbMDoxNF09U2l6ZSwgQml0WzE1XT1GaXhlZAorCSAqLworCXBEb3QxMWYtPnNpemUgPSAocE9sZC0+bm9tTXNkdVN6ICYgMHg3ZmZmKTsKKwlwRG90MTFmLT5maXhlZCA9IChwT2xkLT5ub21Nc2R1U3ogJiAweDgwMDApID8gMSA6IDA7CisJcERvdDExZi0+bWF4X21zZHVfc2l6ZSA9IHBPbGQtPm1heE1zZHVTejsKKwlwRG90MTFmLT5taW5fc2VydmljZV9pbnQgPSBwT2xkLT5taW5TdmNJbnRlcnZhbDsKKwlwRG90MTFmLT5tYXhfc2VydmljZV9pbnQgPSBwT2xkLT5tYXhTdmNJbnRlcnZhbDsKKwlwRG90MTFmLT5pbmFjdGl2aXR5X2ludCA9IHBPbGQtPmluYWN0SW50ZXJ2YWw7CisJcERvdDExZi0+c3VzcGVuc2lvbl9pbnQgPSBwT2xkLT5zdXNwZW5kSW50ZXJ2YWw7CisJcERvdDExZi0+c2VydmljZV9zdGFydF90aW1lID0gcE9sZC0+c3ZjU3RhcnRUaW1lOworCXBEb3QxMWYtPm1pbl9kYXRhX3JhdGUgPSBwT2xkLT5taW5EYXRhUmF0ZTsKKwlwRG90MTFmLT5tZWFuX2RhdGFfcmF0ZSA9IHBPbGQtPm1lYW5EYXRhUmF0ZTsKKwlwRG90MTFmLT5wZWFrX2RhdGFfcmF0ZSA9IHBPbGQtPnBlYWtEYXRhUmF0ZTsKKwlwRG90MTFmLT5idXJzdF9zaXplID0gcE9sZC0+bWF4QnVyc3RTejsKKwlwRG90MTFmLT5kZWxheV9ib3VuZCA9IHBPbGQtPmRlbGF5Qm91bmQ7CisJcERvdDExZi0+bWluX3BoeV9yYXRlID0gcE9sZC0+bWluUGh5UmF0ZTsKKwlwRG90MTFmLT5zdXJwbHVzX2J3X2FsbG93YW5jZSA9IHBPbGQtPnN1cnBsdXNCdzsKKwlwRG90MTFmLT5tZWRpdW1fdGltZSA9IHBPbGQtPm1lZGl1bVRpbWU7CisKKwlwRG90MTFmLT52ZXJzaW9uID0gMTsKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKworfSAvKiBFbmQgcG9wdWxhdGVfZG90MTFmX3dtbXRzcGVjLiAqLworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKQorLyogRmlsbCB0aGUgRVNFIHZlcnNpb24gY3VycmVudGx5IHN1cHBvcnRlZCAqLwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfZXNlX3ZlcnNpb24odERvdDExZklFRVNFVmVyc2lvbiAqcEVTRVZlcnNpb24pCit7CisJcEVTRVZlcnNpb24tPnByZXNlbnQgPSAxOworCXBFU0VWZXJzaW9uLT52ZXJzaW9uID0gRVNFX1ZFUlNJT05fU1VQUE9SVEVEOworfQorCisvKiBGaWxsIHRoZSBFU0UgaWUgZm9yIHRoZSBzdGF0aW9uLiAqLworLyogVGhlIFN0YXRlIGlzIE5vcm1hbCAoMSkgKi8KKy8qIFRoZSBNQlNTSUQgZm9yIHN0YXRpb24gaXMgc2V0IHRvIDAuICovCit2b2lkIHBvcHVsYXRlX2RvdDExZl9lc2VfcmFkX21nbXRfY2FwKHREb3QxMWZJRUVTRVJhZE1nbXRDYXAgKnBFU0VSYWRNZ210Q2FwKQoreworCXBFU0VSYWRNZ210Q2FwLT5wcmVzZW50ID0gMTsKKwlwRVNFUmFkTWdtdENhcC0+bWdtdF9zdGF0ZSA9IFJNX1NUQVRFX05PUk1BTDsKKwlwRVNFUmFkTWdtdENhcC0+bWJzc2lkX21hc2sgPSAwOworCXBFU0VSYWRNZ210Q2FwLT5yZXNlcnZlZCA9IDA7Cit9CisKK3RTaXJSZXRTdGF0dXMgcG9wdWxhdGVfZG90MTFmX2VzZV9jY2ttX29wYXF1ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICB0cFNpckNDS01pZSBwQ0NLTWllLAorCQkJCQkgICAgICB0RG90MTFmSUVFU0VDY2ttT3BhcXVlICpwRG90MTFmKQoreworCWludCBpZHg7CisJaWYgKHBDQ0tNaWUtPmxlbmd0aCkgeworCQlpZiAoMCA8PSAoaWR4ID0gZmluZF9pZV9sb2NhdGlvbihwTWFjLCAodHBTaXJSU05pZSkgcENDS01pZSwKKwkJCQkJCSBET1QxMUZfRUlEX0VTRUNDS01PUEFRVUUpKSkgeworCQkJcERvdDExZi0+cHJlc2VudCA9IDE7CisJCQkvKiBEb250IGluY2x1ZGUgT1VJICovCisJCQlwRG90MTFmLT5udW1fZGF0YSA9IHBDQ0tNaWUtPmNja21JRWRhdGFbaWR4ICsgMV0gLSA0OworCQkJY2RmX21lbV9jb3B5KHBEb3QxMWYtPmRhdGEsIHBDQ0tNaWUtPmNja21JRWRhdGEgKyBpZHggKyAyICsgNCwgIC8qIEVJRCxsZW4sT1VJICovCisJCQkJICAgICBwQ0NLTWllLT5jY2ttSUVkYXRhW2lkeCArIDFdIC0gNCk7IC8qIFNraXAgT1VJICovCisJCX0KKwl9CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl9lc2VfY2NrbV9vcGFxdWUuICovCisKK3ZvaWQgcG9wdWxhdGVfZG90MTFfdHNyc2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICB0U2lyTWFjRVNFVFNSU0lFICpwT2xkLAorCQkJICAgdERvdDExZklFRVNFVHJhZlN0cm1SYXRlU2V0ICpwRG90MTFmLAorCQkJICAgdWludDhfdCByYXRlX2xlbmd0aCkKK3sKKwlwRG90MTFmLT50c2lkID0gcE9sZC0+dHNpZDsKKwljZGZfbWVtX2NvcHkocERvdDExZi0+dHNyYXRlcywgcE9sZC0+cmF0ZXMsIHJhdGVfbGVuZ3RoKTsKKwlwRG90MTFmLT5udW1fdHNyYXRlcyA9IHJhdGVfbGVuZ3RoOworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworfQorI2VuZGlmCisKK3RTaXJSZXRTdGF0dXMKK3BvcHVsYXRlX2RvdDExZl90Y2xhcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgICAgICB0U2lyVGNsYXNJbmZvICpwT2xkLCB0RG90MTFmSUVUQ0xBUyAqcERvdDExZikKK3sKKwlwRG90MTFmLT51c2VyX3ByaW9yaXR5ID0gcE9sZC0+dGNsYXMudXNlclByaW87CisJcERvdDExZi0+Y2xhc3NpZmllcl90eXBlID0gcE9sZC0+dGNsYXMuY2xhc3NpZmllclR5cGU7CisJcERvdDExZi0+Y2xhc3NpZmllcl9tYXNrID0gcE9sZC0+dGNsYXMuY2xhc3NpZmllck1hc2s7CisKKwlzd2l0Y2ggKHBEb3QxMWYtPmNsYXNzaWZpZXJfdHlwZSkgeworCWNhc2UgU0lSX01BQ19UQ0xBU1RZUEVfRVRIRVJORVQ6CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcERvdDExZi0+aW5mby5FdGhQYXJhbXMuc291cmNlLAorCQkJICAgICAodWludDhfdCAqKSAmcE9sZC0+dGNsYXNQYXJhbXMuZXRoLnNyY0FkZHIsIDYpOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBEb3QxMWYtPmluZm8uRXRoUGFyYW1zLmRlc3QsCisJCQkgICAgICh1aW50OF90ICopICZwT2xkLT50Y2xhc1BhcmFtcy5ldGguZHN0QWRkciwgNik7CisJCXBEb3QxMWYtPmluZm8uRXRoUGFyYW1zLnR5cGUgPSBwT2xkLT50Y2xhc1BhcmFtcy5ldGgudHlwZTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1RDTEFTVFlQRV9UQ1BVRFBJUDoKKwkJcERvdDExZi0+aW5mby5JcFBhcmFtcy52ZXJzaW9uID0gcE9sZC0+dmVyc2lvbjsKKwkJaWYgKFNJUl9NQUNfVENMQVNfSVBWNCA9PSBwRG90MTFmLT5pbmZvLklwUGFyYW1zLnZlcnNpb24pIHsKKwkJCWNkZl9tZW1fY29weShwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLgorCQkJCSAgICAgc291cmNlLCBwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnNyY0lwQWRkciwKKwkJCQkgICAgIDQpOworCQkJY2RmX21lbV9jb3B5KHBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuCisJCQkJICAgICBkZXN0LCBwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LmRzdElwQWRkciwgNCk7CisJCQlwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0ID0KKwkJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnNyY1BvcnQ7CisJCQlwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydCA9CisJCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5kc3RQb3J0OworCQkJcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQID0KKwkJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LmRzY3A7CisJCQlwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvID0KKwkJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnByb3RvY29sOworCQkJcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCA9CisJCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5yc3ZkOworCQl9IGVsc2UgeworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwRG90MTFmLT5pbmZvLklwUGFyYW1zLgorCQkJCSAgICAgcGFyYW1zLklwVjZQYXJhbXMuc291cmNlLAorCQkJCSAgICAgKHVpbnQ4X3QgKikgcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni4KKwkJCQkgICAgIHNyY0lwQWRkciwgMTYpOworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwRG90MTFmLT5pbmZvLklwUGFyYW1zLgorCQkJCSAgICAgcGFyYW1zLklwVjZQYXJhbXMuZGVzdCwKKwkJCQkgICAgICh1aW50OF90ICopIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuCisJCQkJICAgICBkc3RJcEFkZHIsIDE2KTsKKwkJCXBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQgPQorCQkJCXBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuc3JjUG9ydDsKKwkJCXBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0ID0KKwkJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LmRzdFBvcnQ7CisJCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBEb3QxMWYtPmluZm8uSXBQYXJhbXMuCisJCQkJICAgICBwYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLAorCQkJCSAgICAgKHVpbnQ4X3QgKikgcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni4KKwkJCQkgICAgIGZsb3dMYWJlbCwgMyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1RDTEFTVFlQRV84MDIxRFE6CisJCXBEb3QxMWYtPmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlID0KKwkJCXBPbGQtPnRjbGFzUGFyYW1zLnQ4MDIxZHEudGFnOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsaW1fbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiQmFkIFRDTEFTIHR5cGUgJWQgaW4gcG9wdWxhdGVfZG90MTFmX3RjbGFzLlxuIiksCisJCQlwRG90MTFmLT5jbGFzc2lmaWVyX3R5cGUpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvKiBFbmQgcG9wdWxhdGVfZG90MTFmX3RjbGFzLiAqLworCit0U2lyUmV0U3RhdHVzCitwb3B1bGF0ZV9kb3QxMWZfd21tdGNsYXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSB0U2lyVGNsYXNJbmZvICpwT2xkLCB0RG90MTFmSUVXTU1UQ0xBUyAqcERvdDExZikKK3sKKwlwRG90MTFmLT52ZXJzaW9uID0gMTsKKwlwRG90MTFmLT51c2VyX3ByaW9yaXR5ID0gcE9sZC0+dGNsYXMudXNlclByaW87CisJcERvdDExZi0+Y2xhc3NpZmllcl90eXBlID0gcE9sZC0+dGNsYXMuY2xhc3NpZmllclR5cGU7CisJcERvdDExZi0+Y2xhc3NpZmllcl9tYXNrID0gcE9sZC0+dGNsYXMuY2xhc3NpZmllck1hc2s7CisKKwlzd2l0Y2ggKHBEb3QxMWYtPmNsYXNzaWZpZXJfdHlwZSkgeworCWNhc2UgU0lSX01BQ19UQ0xBU1RZUEVfRVRIRVJORVQ6CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcERvdDExZi0+aW5mby5FdGhQYXJhbXMuc291cmNlLAorCQkJICAgICAodWludDhfdCAqKSAmcE9sZC0+dGNsYXNQYXJhbXMuZXRoLnNyY0FkZHIsIDYpOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBEb3QxMWYtPmluZm8uRXRoUGFyYW1zLmRlc3QsCisJCQkgICAgICh1aW50OF90ICopICZwT2xkLT50Y2xhc1BhcmFtcy5ldGguZHN0QWRkciwgNik7CisJCXBEb3QxMWYtPmluZm8uRXRoUGFyYW1zLnR5cGUgPSBwT2xkLT50Y2xhc1BhcmFtcy5ldGgudHlwZTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1RDTEFTVFlQRV9UQ1BVRFBJUDoKKwkJcERvdDExZi0+aW5mby5JcFBhcmFtcy52ZXJzaW9uID0gcE9sZC0+dmVyc2lvbjsKKwkJaWYgKFNJUl9NQUNfVENMQVNfSVBWNCA9PSBwRG90MTFmLT5pbmZvLklwUGFyYW1zLnZlcnNpb24pIHsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcERvdDExZi0+aW5mby5JcFBhcmFtcy4KKwkJCQkgICAgIHBhcmFtcy5JcFY0UGFyYW1zLnNvdXJjZSwKKwkJCQkgICAgICh1aW50OF90ICopIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuCisJCQkJICAgICBzcmNJcEFkZHIsIDQpOworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwRG90MTFmLT5pbmZvLklwUGFyYW1zLgorCQkJCSAgICAgcGFyYW1zLklwVjRQYXJhbXMuZGVzdCwKKwkJCQkgICAgICh1aW50OF90ICopIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuCisJCQkJICAgICBkc3RJcEFkZHIsIDQpOworCQkJcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCA9CisJCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5zcmNQb3J0OworCQkJcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQgPQorCQkJCXBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuZHN0UG9ydDsKKwkJCXBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuRFNDUCA9CisJCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5kc2NwOworCQkJcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90byA9CisJCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5wcm90b2NvbDsKKwkJCXBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQgPQorCQkJCXBPbGQtPnRjbGFzUGFyYW1zLmlwdjQucnN2ZDsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcERvdDExZi0+aW5mby5JcFBhcmFtcy4KKwkJCQkgICAgIHBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwKKwkJCQkgICAgICh1aW50OF90ICopIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuCisJCQkJICAgICBzcmNJcEFkZHIsIDE2KTsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcERvdDExZi0+aW5mby5JcFBhcmFtcy4KKwkJCQkgICAgIHBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsCisJCQkJICAgICAodWludDhfdCAqKSBwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LgorCQkJCSAgICAgZHN0SXBBZGRyLCAxNik7CisJCQlwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0ID0KKwkJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LnNyY1BvcnQ7CisJCQlwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCA9CisJCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni5kc3RQb3J0OworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwRG90MTFmLT5pbmZvLklwUGFyYW1zLgorCQkJCSAgICAgcGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwKKwkJCQkgICAgICh1aW50OF90ICopIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuCisJCQkJICAgICBmbG93TGFiZWwsIDMpOworCQl9CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19UQ0xBU1RZUEVfODAyMURROgorCQlwRG90MTFmLT5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSA9CisJCQlwT2xkLT50Y2xhc1BhcmFtcy50ODAyMWRxLnRhZzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGltX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkJhZCBUQ0xBUyB0eXBlICVkIGluIHBvcHVsYXRlX2RvdDExZl90Y2xhcy5cbiIpLAorCQkJcERvdDExZi0+Y2xhc3NpZmllcl90eXBlKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyogRW5kIHBvcHVsYXRlX2RvdDExZl93bW10Y2xhcy4gKi8KKwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfd3NjKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICB0RG90MTFmSUVXc2NCZWFjb24gKnBEb3QxMWYpCit7CisKKwl1aW50MzJfdCB3cHNTdGF0ZTsKKworCXBEb3QxMWYtPlZlcnNpb24ucHJlc2VudCA9IDE7CisJcERvdDExZi0+VmVyc2lvbi5tYWpvciA9IDB4MDE7CisJcERvdDExZi0+VmVyc2lvbi5taW5vciA9IDB4MDA7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCAodWludDE2X3QpIFdOSV9DRkdfV1BTX1NUQVRFLCAmd3BzU3RhdGUpICE9CisJICAgIGVTSVJfU1VDQ0VTUykKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCAiRmFpbGVkIHRvIGNmZyBnZXQgaWQgJWRcbiIsCisJCQlXTklfQ0ZHX1dQU19TVEFURSk7CisKKwlwRG90MTFmLT5XUFNTdGF0ZS5wcmVzZW50ID0gMTsKKwlwRG90MTFmLT5XUFNTdGF0ZS5zdGF0ZSA9ICh1aW50OF90KSB3cHNTdGF0ZTsKKworCXBEb3QxMWYtPkFQU2V0dXBMb2NrZWQucHJlc2VudCA9IDA7CisKKwlwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhci5wcmVzZW50ID0gMDsKKworCXBEb3QxMWYtPkRldmljZVBhc3N3b3JkSUQucHJlc2VudCA9IDA7CisKKwlwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCA9IDA7CisKKwlwRG90MTFmLT5VVUlEX0UucHJlc2VudCA9IDA7CisKKwlwRG90MTFmLT5SRkJhbmRzLnByZXNlbnQgPSAwOworCisJcERvdDExZi0+cHJlc2VudCA9IDE7CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfd3NjX3JlZ2lzdHJhcl9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgdERvdDExZklFV3NjQmVhY29uICpwRG90MTFmKQoreworCWNvbnN0IHN0cnVjdCBzTGltV3NjSWVJbmZvICpjb25zdCBwV3NjSWVJbmZvID0gJihwTWFjLT5saW0ud3NjSWVJbmZvKTsKKwl1aW50MzJfdCBkZXZpY2VwYXNzd2RJZDsKKworCXBEb3QxMWYtPkFQU2V0dXBMb2NrZWQucHJlc2VudCA9IDE7CisJcERvdDExZi0+QVBTZXR1cExvY2tlZC5mTG9ja2VkID0gcFdzY0llSW5mby0+YXBTZXR1cExvY2tlZDsKKworCXBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyLnByZXNlbnQgPSAxOworCXBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyLnNlbGVjdGVkID0gcFdzY0llSW5mby0+c2VsZWN0ZWRSZWdpc3RyYXI7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludAorCQkgICAgKHBNYWMsICh1aW50MTZfdCkgV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lELAorCQkgICAgJmRldmljZXBhc3N3ZElkKSAhPSBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HUCwgIkZhaWxlZCB0byBjZmcgZ2V0IGlkICVkXG4iLAorCQkJV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEKTsKKworCXBEb3QxMWYtPkRldmljZVBhc3N3b3JkSUQucHJlc2VudCA9IDE7CisJcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5pZCA9ICh1aW50MTZfdCkgZGV2aWNlcGFzc3dkSWQ7CisKKwlwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCA9IDE7CisJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLm1ldGhvZHMgPQorCQlwV3NjSWVJbmZvLT5zZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHM7CisKKwkvKiBVVUlEX0UgYW5kIFJGIEJhbmRzIGFyZSBhcHBsaWNhYmxlIG9ubHkgZm9yIGR1YWwgYmFuZCBBUCAqLworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordFNpclJldFN0YXR1cyBkZV9wb3B1bGF0ZV9kb3QxMWZfd3NjX3JlZ2lzdHJhcl9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgdERvdDExZklFV3NjQmVhY29uICpwRG90MTFmKQoreworCXBEb3QxMWYtPkFQU2V0dXBMb2NrZWQucHJlc2VudCA9IDA7CisJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCA9IDA7CisJcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50ID0gMDsKKwlwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCA9IDA7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl9wcm9iZV9yZXNfd3BzaV9lcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdERvdDExZklFV3NjUHJvYmVSZXMgKnBEb3QxMWYsCisJCQkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCisJdFNpcldQU1Byb2JlUnNwSUUgKnBTaXJXUFNQcm9iZVJzcElFOworCisJcFNpcldQU1Byb2JlUnNwSUUgPSAmcHNlc3Npb25FbnRyeS0+QVBXUFNJRXMuU2lyV1BTUHJvYmVSc3BJRTsKKworCWlmIChwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX1ZFUl9QUkVTRU5UKSB7CisJCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCQlwRG90MTFmLT5WZXJzaW9uLnByZXNlbnQgPSAxOworCQlwRG90MTFmLT5WZXJzaW9uLm1ham9yID0KKwkJCSh1aW50OF90KSAoKHBTaXJXUFNQcm9iZVJzcElFLT5WZXJzaW9uICYgMHhGMCkgPj4gNCk7CisJCXBEb3QxMWYtPlZlcnNpb24ubWlub3IgPQorCQkJKHVpbnQ4X3QpIChwU2lyV1BTUHJvYmVSc3BJRS0+VmVyc2lvbiAmIDB4MEYpOworCX0gZWxzZSB7CisJCXBEb3QxMWYtPnByZXNlbnQgPSAwOworCQlwRG90MTFmLT5WZXJzaW9uLnByZXNlbnQgPSAwOworCX0KKworCWlmIChwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX1NUQVRFX1BSRVNFTlQpIHsKKworCQlwRG90MTFmLT5XUFNTdGF0ZS5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+V1BTU3RhdGUuc3RhdGUgPSAodWludDhfdCkgcFNpcldQU1Byb2JlUnNwSUUtPndwc1N0YXRlOworCX0gZWxzZQorCQlwRG90MTFmLT5XUFNTdGF0ZS5wcmVzZW50ID0gMDsKKworCWlmIChwU2lyV1BTUHJvYmVSc3BJRS0+CisJICAgIEZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9BUFNFVFVQTE9DS19QUkVTRU5UKSB7CisJCXBEb3QxMWYtPkFQU2V0dXBMb2NrZWQucHJlc2VudCA9IDE7CisJCXBEb3QxMWYtPkFQU2V0dXBMb2NrZWQuZkxvY2tlZCA9CisJCQlwU2lyV1BTUHJvYmVSc3BJRS0+QVBTZXR1cExvY2tlZDsKKwl9IGVsc2UKKwkJcERvdDExZi0+QVBTZXR1cExvY2tlZC5wcmVzZW50ID0gMDsKKworCWlmIChwU2lyV1BTUHJvYmVSc3BJRS0+CisJICAgIEZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9TRUxFQ1RFRFJFR0lTVFJBX1BSRVNFTlQpIHsKKwkJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCA9IDE7CisJCXBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyLnNlbGVjdGVkID0KKwkJCXBTaXJXUFNQcm9iZVJzcElFLT5TZWxlY3RlZFJlZ2lzdHJhOworCX0gZWxzZQorCQlwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhci5wcmVzZW50ID0gMDsKKworCWlmIChwU2lyV1BTUHJvYmVSc3BJRS0+CisJICAgIEZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9ERVZJQ0VQQVNTV09SRElEX1BSRVNFTlQpIHsKKwkJcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5pZCA9CisJCQlwU2lyV1BTUHJvYmVSc3BJRS0+RGV2aWNlUGFzc3dvcmRJRDsKKwl9IGVsc2UKKwkJcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50ID0gMDsKKworCWlmIChwU2lyV1BTUHJvYmVSc3BJRS0+CisJICAgIEZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9TRUxFQ1RFRFJFR0lTVFJBQ0ZHTUVUSE9EX1BSRVNFTlQpIHsKKwkJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQgPSAxOworCQlwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMubWV0aG9kcyA9CisJCQlwU2lyV1BTUHJvYmVSc3BJRS0+U2VsZWN0ZWRSZWdpc3RyYUNmZ01ldGhvZDsKKwl9IGVsc2UKKwkJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQgPSAwOworCisJaWYgKHBTaXJXUFNQcm9iZVJzcElFLT4KKwkgICAgRmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX1JFU1BPTlNFVFlQRV9QUkVTRU5UKSB7CisJCXBEb3QxMWYtPlJlc3BvbnNlVHlwZS5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+UmVzcG9uc2VUeXBlLnJlc1R5cGUgPSBwU2lyV1BTUHJvYmVSc3BJRS0+UmVzcG9uc2VUeXBlOworCX0gZWxzZQorCQlwRG90MTFmLT5SZXNwb25zZVR5cGUucHJlc2VudCA9IDA7CisKKwlpZiAocFNpcldQU1Byb2JlUnNwSUUtPkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9VVUlERV9QUkVTRU5UKSB7CisJCXBEb3QxMWYtPlVVSURfRS5wcmVzZW50ID0gMTsKKwkJY2RmX21lbV9jb3B5KHBEb3QxMWYtPlVVSURfRS51dWlkLCBwU2lyV1BTUHJvYmVSc3BJRS0+VVVJRF9FLAorCQkJICAgICBXTklfQ0ZHX1dQU19VVUlEX0xFTik7CisJfSBlbHNlCisJCXBEb3QxMWYtPlVVSURfRS5wcmVzZW50ID0gMDsKKworCWlmIChwU2lyV1BTUHJvYmVSc3BJRS0+CisJICAgIEZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9NQU5VRkFDVFVSRV9QUkVTRU5UKSB7CisJCXBEb3QxMWYtPk1hbnVmYWN0dXJlci5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+TWFudWZhY3R1cmVyLm51bV9uYW1lID0KKwkJCXBTaXJXUFNQcm9iZVJzcElFLT5NYW51ZmFjdHVyZS5udW1fbmFtZTsKKwkJY2RmX21lbV9jb3B5KHBEb3QxMWYtPk1hbnVmYWN0dXJlci5uYW1lLAorCQkJICAgICBwU2lyV1BTUHJvYmVSc3BJRS0+TWFudWZhY3R1cmUubmFtZSwKKwkJCSAgICAgcFNpcldQU1Byb2JlUnNwSUUtPk1hbnVmYWN0dXJlLm51bV9uYW1lKTsKKwl9IGVsc2UKKwkJcERvdDExZi0+TWFudWZhY3R1cmVyLnByZXNlbnQgPSAwOworCisJaWYgKHBTaXJXUFNQcm9iZVJzcElFLT4KKwkgICAgRmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX01PREVMTlVNQkVSX1BSRVNFTlQpIHsKKwkJcERvdDExZi0+TW9kZWxOYW1lLnByZXNlbnQgPSAxOworCQlwRG90MTFmLT5Nb2RlbE5hbWUubnVtX3RleHQgPQorCQkJcFNpcldQU1Byb2JlUnNwSUUtPk1vZGVsTmFtZS5udW1fdGV4dDsKKwkJY2RmX21lbV9jb3B5KHBEb3QxMWYtPk1vZGVsTmFtZS50ZXh0LAorCQkJICAgICBwU2lyV1BTUHJvYmVSc3BJRS0+TW9kZWxOYW1lLnRleHQsCisJCQkgICAgIHBEb3QxMWYtPk1vZGVsTmFtZS5udW1fdGV4dCk7CisJfSBlbHNlCisJCXBEb3QxMWYtPk1vZGVsTmFtZS5wcmVzZW50ID0gMDsKKworCWlmIChwU2lyV1BTUHJvYmVSc3BJRS0+CisJICAgIEZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9NT0RFTE5VTUJFUl9QUkVTRU5UKSB7CisJCXBEb3QxMWYtPk1vZGVsTnVtYmVyLnByZXNlbnQgPSAxOworCQlwRG90MTFmLT5Nb2RlbE51bWJlci5udW1fdGV4dCA9CisJCQlwU2lyV1BTUHJvYmVSc3BJRS0+TW9kZWxOdW1iZXIubnVtX3RleHQ7CisJCWNkZl9tZW1fY29weShwRG90MTFmLT5Nb2RlbE51bWJlci50ZXh0LAorCQkJICAgICBwU2lyV1BTUHJvYmVSc3BJRS0+TW9kZWxOdW1iZXIudGV4dCwKKwkJCSAgICAgcERvdDExZi0+TW9kZWxOdW1iZXIubnVtX3RleHQpOworCX0gZWxzZQorCQlwRG90MTFmLT5Nb2RlbE51bWJlci5wcmVzZW50ID0gMDsKKworCWlmIChwU2lyV1BTUHJvYmVSc3BJRS0+CisJICAgIEZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9TRVJJQUxOVU1CRVJfUFJFU0VOVCkgeworCQlwRG90MTFmLT5TZXJpYWxOdW1iZXIucHJlc2VudCA9IDE7CisJCXBEb3QxMWYtPlNlcmlhbE51bWJlci5udW1fdGV4dCA9CisJCQlwU2lyV1BTUHJvYmVSc3BJRS0+U2VyaWFsTnVtYmVyLm51bV90ZXh0OworCQljZGZfbWVtX2NvcHkocERvdDExZi0+U2VyaWFsTnVtYmVyLnRleHQsCisJCQkgICAgIHBTaXJXUFNQcm9iZVJzcElFLT5TZXJpYWxOdW1iZXIudGV4dCwKKwkJCSAgICAgcERvdDExZi0+U2VyaWFsTnVtYmVyLm51bV90ZXh0KTsKKwl9IGVsc2UKKwkJcERvdDExZi0+U2VyaWFsTnVtYmVyLnByZXNlbnQgPSAwOworCisJaWYgKHBTaXJXUFNQcm9iZVJzcElFLT4KKwkgICAgRmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX1BSSU1BUllERVZJQ0VUWVBFX1BSRVNFTlQpIHsKKwkJcERvdDExZi0+UHJpbWFyeURldmljZVR5cGUucHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weShwRG90MTFmLT5QcmltYXJ5RGV2aWNlVHlwZS5vdWksCisJCQkgICAgIHBTaXJXUFNQcm9iZVJzcElFLT5QcmltYXJ5RGV2aWNlT1VJLAorCQkJICAgICBzaXplb2YocFNpcldQU1Byb2JlUnNwSUUtPlByaW1hcnlEZXZpY2VPVUkpKTsKKwkJcERvdDExZi0+UHJpbWFyeURldmljZVR5cGUucHJpbWFyeV9jYXRlZ29yeSA9CisJCQkodWludDE2X3QpIHBTaXJXUFNQcm9iZVJzcElFLT5QcmltYXJ5RGV2aWNlQ2F0ZWdvcnk7CisJCXBEb3QxMWYtPlByaW1hcnlEZXZpY2VUeXBlLnN1Yl9jYXRlZ29yeSA9CisJCQkodWludDE2X3QpIHBTaXJXUFNQcm9iZVJzcElFLT5EZXZpY2VTdWJDYXRlZ29yeTsKKwl9IGVsc2UKKwkJcERvdDExZi0+UHJpbWFyeURldmljZVR5cGUucHJlc2VudCA9IDA7CisKKwlpZiAocFNpcldQU1Byb2JlUnNwSUUtPgorCSAgICBGaWVsZFByZXNlbnQgJiBTSVJfV1BTX1BST0JSU1BfREVWSUNFTkFNRV9QUkVTRU5UKSB7CisJCXBEb3QxMWYtPkRldmljZU5hbWUucHJlc2VudCA9IDE7CisJCXBEb3QxMWYtPkRldmljZU5hbWUubnVtX3RleHQgPQorCQkJcFNpcldQU1Byb2JlUnNwSUUtPkRldmljZU5hbWUubnVtX3RleHQ7CisJCWNkZl9tZW1fY29weShwRG90MTFmLT5EZXZpY2VOYW1lLnRleHQsCisJCQkgICAgIHBTaXJXUFNQcm9iZVJzcElFLT5EZXZpY2VOYW1lLnRleHQsCisJCQkgICAgIHBEb3QxMWYtPkRldmljZU5hbWUubnVtX3RleHQpOworCX0gZWxzZQorCQlwRG90MTFmLT5EZXZpY2VOYW1lLnByZXNlbnQgPSAwOworCisJaWYgKHBTaXJXUFNQcm9iZVJzcElFLT4KKwkgICAgRmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX0NPTkZJR01FVEhPRFNfUFJFU0VOVCkgeworCQlwRG90MTFmLT5Db25maWdNZXRob2RzLnByZXNlbnQgPSAxOworCQlwRG90MTFmLT5Db25maWdNZXRob2RzLm1ldGhvZHMgPQorCQkJcFNpcldQU1Byb2JlUnNwSUUtPkNvbmZpZ01ldGhvZDsKKwl9IGVsc2UKKwkJcERvdDExZi0+Q29uZmlnTWV0aG9kcy5wcmVzZW50ID0gMDsKKworCWlmIChwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX1JGX0JBTkRTX1BSRVNFTlQpIHsKKwkJcERvdDExZi0+UkZCYW5kcy5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+UkZCYW5kcy5iYW5kcyA9IHBTaXJXUFNQcm9iZVJzcElFLT5SRkJhbmQ7CisJfSBlbHNlCisJCXBEb3QxMWYtPlJGQmFuZHMucHJlc2VudCA9IDA7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl9hc3NvY19yZXNfd3BzaV9lcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdERvdDExZklFV3NjQXNzb2NSZXMgKnBEb3QxMWYsCisJCQkJCQl0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCXRTaXJXUFNQcm9iZVJzcElFICpwU2lyV1BTUHJvYmVSc3BJRTsKKworCXBTaXJXUFNQcm9iZVJzcElFID0gJnBzZXNzaW9uRW50cnktPkFQV1BTSUVzLlNpcldQU1Byb2JlUnNwSUU7CisKKwlpZiAocFNpcldQU1Byb2JlUnNwSUUtPkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9WRVJfUFJFU0VOVCkgeworCQlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+VmVyc2lvbi5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+VmVyc2lvbi5tYWpvciA9CisJCQkodWludDhfdCkgKChwU2lyV1BTUHJvYmVSc3BJRS0+VmVyc2lvbiAmIDB4RjApID4+IDQpOworCQlwRG90MTFmLT5WZXJzaW9uLm1pbm9yID0KKwkJCSh1aW50OF90KSAocFNpcldQU1Byb2JlUnNwSUUtPlZlcnNpb24gJiAweDBGKTsKKwl9IGVsc2UgeworCQlwRG90MTFmLT5wcmVzZW50ID0gMDsKKwkJcERvdDExZi0+VmVyc2lvbi5wcmVzZW50ID0gMDsKKwl9CisKKwlpZiAocFNpcldQU1Byb2JlUnNwSUUtPgorCSAgICBGaWVsZFByZXNlbnQgJiBTSVJfV1BTX1BST0JSU1BfUkVTUE9OU0VUWVBFX1BSRVNFTlQpIHsKKwkJcERvdDExZi0+UmVzcG9uc2VUeXBlLnByZXNlbnQgPSAxOworCQlwRG90MTFmLT5SZXNwb25zZVR5cGUucmVzVHlwZSA9IHBTaXJXUFNQcm9iZVJzcElFLT5SZXNwb25zZVR5cGU7CisJfSBlbHNlCisJCXBEb3QxMWYtPlJlc3BvbnNlVHlwZS5wcmVzZW50ID0gMDsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3RTaXJSZXRTdGF0dXMgcG9wdWxhdGVfZG90MTFmX2JlYWNvbl93cHNpX2VzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgdERvdDExZklFV3NjQmVhY29uICpwRG90MTFmLAorCQkJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKwl0U2lyV1BTQmVhY29uSUUgKnBTaXJXUFNCZWFjb25JRTsKKworCXBTaXJXUFNCZWFjb25JRSA9ICZwc2Vzc2lvbkVudHJ5LT5BUFdQU0lFcy5TaXJXUFNCZWFjb25JRTsKKworCWlmIChwU2lyV1BTQmVhY29uSUUtPkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9WRVJfUFJFU0VOVCkgeworCQlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+VmVyc2lvbi5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+VmVyc2lvbi5tYWpvciA9CisJCQkodWludDhfdCkgKChwU2lyV1BTQmVhY29uSUUtPlZlcnNpb24gJiAweEYwKSA+PiA0KTsKKwkJcERvdDExZi0+VmVyc2lvbi5taW5vciA9CisJCQkodWludDhfdCkgKHBTaXJXUFNCZWFjb25JRS0+VmVyc2lvbiAmIDB4MEYpOworCX0gZWxzZSB7CisJCXBEb3QxMWYtPnByZXNlbnQgPSAwOworCQlwRG90MTFmLT5WZXJzaW9uLnByZXNlbnQgPSAwOworCX0KKworCWlmIChwU2lyV1BTQmVhY29uSUUtPkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfQkVBQ09OX1NUQVRFX1BSRVNFTlQpIHsKKworCQlwRG90MTFmLT5XUFNTdGF0ZS5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+V1BTU3RhdGUuc3RhdGUgPSAodWludDhfdCkgcFNpcldQU0JlYWNvbklFLT53cHNTdGF0ZTsKKwl9IGVsc2UKKwkJcERvdDExZi0+V1BTU3RhdGUucHJlc2VudCA9IDA7CisKKwlpZiAocFNpcldQU0JlYWNvbklFLT5GaWVsZFByZXNlbnQgJiBTSVJfV1BTX0JFQUNPTl9BUFNFVFVQTE9DS19QUkVTRU5UKSB7CisJCXBEb3QxMWYtPkFQU2V0dXBMb2NrZWQucHJlc2VudCA9IDE7CisJCXBEb3QxMWYtPkFQU2V0dXBMb2NrZWQuZkxvY2tlZCA9IHBTaXJXUFNCZWFjb25JRS0+QVBTZXR1cExvY2tlZDsKKwl9IGVsc2UKKwkJcERvdDExZi0+QVBTZXR1cExvY2tlZC5wcmVzZW50ID0gMDsKKworCWlmIChwU2lyV1BTQmVhY29uSUUtPgorCSAgICBGaWVsZFByZXNlbnQgJiBTSVJfV1BTX0JFQUNPTl9TRUxFQ1RFRFJFR0lTVFJBX1BSRVNFTlQpIHsKKwkJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCA9IDE7CisJCXBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyLnNlbGVjdGVkID0KKwkJCXBTaXJXUFNCZWFjb25JRS0+U2VsZWN0ZWRSZWdpc3RyYTsKKwl9IGVsc2UKKwkJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCA9IDA7CisKKwlpZiAocFNpcldQU0JlYWNvbklFLT4KKwkgICAgRmllbGRQcmVzZW50ICYgU0lSX1dQU19CRUFDT05fREVWSUNFUEFTU1dPUkRJRF9QUkVTRU5UKSB7CisJCXBEb3QxMWYtPkRldmljZVBhc3N3b3JkSUQucHJlc2VudCA9IDE7CisJCXBEb3QxMWYtPkRldmljZVBhc3N3b3JkSUQuaWQgPQorCQkJcFNpcldQU0JlYWNvbklFLT5EZXZpY2VQYXNzd29yZElEOworCX0gZWxzZQorCQlwRG90MTFmLT5EZXZpY2VQYXNzd29yZElELnByZXNlbnQgPSAwOworCisJaWYgKHBTaXJXUFNCZWFjb25JRS0+CisJICAgIEZpZWxkUHJlc2VudCAmIFNJUl9XUFNfQkVBQ09OX1NFTEVDVEVEUkVHSVNUUkFDRkdNRVRIT0RfUFJFU0VOVCkgeworCQlwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCA9IDE7CisJCXBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5tZXRob2RzID0KKwkJCXBTaXJXUFNCZWFjb25JRS0+U2VsZWN0ZWRSZWdpc3RyYUNmZ01ldGhvZDsKKwl9IGVsc2UKKwkJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQgPSAwOworCisJaWYgKHBTaXJXUFNCZWFjb25JRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19CRUFDT05fVVVJREVfUFJFU0VOVCkgeworCQlwRG90MTFmLT5VVUlEX0UucHJlc2VudCA9IDE7CisJCWNkZl9tZW1fY29weShwRG90MTFmLT5VVUlEX0UudXVpZCwgcFNpcldQU0JlYWNvbklFLT5VVUlEX0UsCisJCQkgICAgIFdOSV9DRkdfV1BTX1VVSURfTEVOKTsKKwl9IGVsc2UKKwkJcERvdDExZi0+VVVJRF9FLnByZXNlbnQgPSAwOworCisJaWYgKHBTaXJXUFNCZWFjb25JRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19CRUFDT05fUkZfQkFORFNfUFJFU0VOVCkgeworCQlwRG90MTFmLT5SRkJhbmRzLnByZXNlbnQgPSAxOworCQlwRG90MTFmLT5SRkJhbmRzLmJhbmRzID0gcFNpcldQU0JlYWNvbklFLT5SRkJhbmQ7CisJfSBlbHNlCisJCXBEb3QxMWYtPlJGQmFuZHMucHJlc2VudCA9IDA7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl93c2NfaW5fcHJvYmVfcmVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB0RG90MTFmSUVXc2NQcm9iZVJlcyAqcERvdDExZikKK3sKKwl1aW50MzJfdCBjZmdNZXRob2RzOworCXVpbnQzMl90IGNmZ1N0ckxlbjsKKwl1aW50MzJfdCB2YWw7CisJdWludDMyX3Qgd3BzVmVyc2lvbiwgd3BzU3RhdGU7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCAodWludDE2X3QpIFdOSV9DRkdfV1BTX1ZFUlNJT04sICZ3cHNWZXJzaW9uKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HUCwgIkZhaWxlZCB0byBjZmcgZ2V0IGlkICVkXG4iLAorCQkJV05JX0NGR19XUFNfVkVSU0lPTik7CisKKwlwRG90MTFmLT5WZXJzaW9uLnByZXNlbnQgPSAxOworCXBEb3QxMWYtPlZlcnNpb24ubWFqb3IgPSAodWludDhfdCkgKCh3cHNWZXJzaW9uICYgMHhGMCkgPj4gNCk7CisJcERvdDExZi0+VmVyc2lvbi5taW5vciA9ICh1aW50OF90KSAod3BzVmVyc2lvbiAmIDB4MEYpOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgKHVpbnQxNl90KSBXTklfQ0ZHX1dQU19TVEFURSwgJndwc1N0YXRlKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpCisJCWxpbV9sb2cocE1hYywgTE9HUCwgIkZhaWxlZCB0byBjZmcgZ2V0IGlkICVkXG4iLAorCQkJV05JX0NGR19XUFNfU1RBVEUpOworCisJcERvdDExZi0+V1BTU3RhdGUucHJlc2VudCA9IDE7CisJcERvdDExZi0+V1BTU3RhdGUuc3RhdGUgPSAodWludDhfdCkgd3BzU3RhdGU7CisKKwlwRG90MTFmLT5BUFNldHVwTG9ja2VkLnByZXNlbnQgPSAwOworCisJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCA9IDA7CisKKwlwRG90MTFmLT5EZXZpY2VQYXNzd29yZElELnByZXNlbnQgPSAwOworCisJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQgPSAwOworCisJcERvdDExZi0+UmVzcG9uc2VUeXBlLnByZXNlbnQgPSAxOworCWlmICgocE1hYy0+bGltLndzY0llSW5mby5yZXFUeXBlID09IFJFUV9UWVBFX1JFR0lTVFJBUikgfHwKKwkgICAgKHBNYWMtPmxpbS53c2NJZUluZm8ucmVxVHlwZSA9PSBSRVFfVFlQRV9XTEFOX01BTkFHRVJfUkVHSVNUUkFSKSkgeworCQlwRG90MTFmLT5SZXNwb25zZVR5cGUucmVzVHlwZSA9IFJFU1BfVFlQRV9FTlJPTExFRV9PUEVOXzgwMjFYOworCX0gZWxzZSB7CisJCXBEb3QxMWYtPlJlc3BvbnNlVHlwZS5yZXNUeXBlID0gUkVTUF9UWVBFX0FQOworCX0KKworCS8qIFVVSUQgaXMgYSAxNiBieXRlIGxvbmcgYmluYXJ5LiBTdGlsbCB1c2Ugd2xhbl9jZmdfZ2V0X3N0ciB0byBnZXQgaXQuICovCisJcERvdDExZi0+VVVJRF9FLnByZXNlbnQgPSAxOworCWNmZ1N0ckxlbiA9IFdOSV9DRkdfV1BTX1VVSURfTEVOOworCWlmICh3bGFuX2NmZ19nZXRfc3RyKHBNYWMsCisJCQkgICAgIFdOSV9DRkdfV1BTX1VVSUQsCisJCQkgICAgIHBEb3QxMWYtPlVVSURfRS51dWlkLCAmY2ZnU3RyTGVuKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJKihwRG90MTFmLT5VVUlEX0UudXVpZCkgPSAnXDAnOworCX0KKworCXBEb3QxMWYtPk1hbnVmYWN0dXJlci5wcmVzZW50ID0gMTsKKwljZmdTdHJMZW4gPSBXTklfQ0ZHX01BTlVGQUNUVVJFUl9OQU1FX0xFTjsKKwlpZiAod2xhbl9jZmdfZ2V0X3N0cihwTWFjLAorCQkJICAgICBXTklfQ0ZHX01BTlVGQUNUVVJFUl9OQU1FLAorCQkJICAgICBwRG90MTFmLT5NYW51ZmFjdHVyZXIubmFtZSwKKwkJCSAgICAgJmNmZ1N0ckxlbikgIT0gZVNJUl9TVUNDRVNTKSB7CisJCXBEb3QxMWYtPk1hbnVmYWN0dXJlci5udW1fbmFtZSA9IDA7CisJfSBlbHNlIHsKKwkJcERvdDExZi0+TWFudWZhY3R1cmVyLm51bV9uYW1lID0KKwkJCSh1aW50OF90KSAoY2ZnU3RyTGVuICYgMHgwMDAwMDBGRik7CisJfQorCisJcERvdDExZi0+TW9kZWxOYW1lLnByZXNlbnQgPSAxOworCWNmZ1N0ckxlbiA9IFdOSV9DRkdfTU9ERUxfTkFNRV9MRU47CisJaWYgKHdsYW5fY2ZnX2dldF9zdHIocE1hYywKKwkJCSAgICAgV05JX0NGR19NT0RFTF9OQU1FLAorCQkJICAgICBwRG90MTFmLT5Nb2RlbE5hbWUudGV4dCwKKwkJCSAgICAgJmNmZ1N0ckxlbikgIT0gZVNJUl9TVUNDRVNTKSB7CisJCXBEb3QxMWYtPk1vZGVsTmFtZS5udW1fdGV4dCA9IDA7CisJfSBlbHNlIHsKKwkJcERvdDExZi0+TW9kZWxOYW1lLm51bV90ZXh0ID0KKwkJCSh1aW50OF90KSAoY2ZnU3RyTGVuICYgMHgwMDAwMDBGRik7CisJfQorCisJcERvdDExZi0+TW9kZWxOdW1iZXIucHJlc2VudCA9IDE7CisJY2ZnU3RyTGVuID0gV05JX0NGR19NT0RFTF9OVU1CRVJfTEVOOworCWlmICh3bGFuX2NmZ19nZXRfc3RyKHBNYWMsCisJCQkgICAgIFdOSV9DRkdfTU9ERUxfTlVNQkVSLAorCQkJICAgICBwRG90MTFmLT5Nb2RlbE51bWJlci50ZXh0LAorCQkJICAgICAmY2ZnU3RyTGVuKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJcERvdDExZi0+TW9kZWxOdW1iZXIubnVtX3RleHQgPSAwOworCX0gZWxzZSB7CisJCXBEb3QxMWYtPk1vZGVsTnVtYmVyLm51bV90ZXh0ID0KKwkJCSh1aW50OF90KSAoY2ZnU3RyTGVuICYgMHgwMDAwMDBGRik7CisJfQorCisJcERvdDExZi0+U2VyaWFsTnVtYmVyLnByZXNlbnQgPSAxOworCWNmZ1N0ckxlbiA9IFdOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfVkVSU0lPTl9MRU47CisJaWYgKHdsYW5fY2ZnX2dldF9zdHIocE1hYywKKwkJCSAgICAgV05JX0NGR19NQU5VRkFDVFVSRVJfUFJPRFVDVF9WRVJTSU9OLAorCQkJICAgICBwRG90MTFmLT5TZXJpYWxOdW1iZXIudGV4dCwKKwkJCSAgICAgJmNmZ1N0ckxlbikgIT0gZVNJUl9TVUNDRVNTKSB7CisJCXBEb3QxMWYtPlNlcmlhbE51bWJlci5udW1fdGV4dCA9IDA7CisJfSBlbHNlIHsKKwkJcERvdDExZi0+U2VyaWFsTnVtYmVyLm51bV90ZXh0ID0KKwkJCSh1aW50OF90KSAoY2ZnU3RyTGVuICYgMHgwMDAwMDBGRik7CisJfQorCisJcERvdDExZi0+UHJpbWFyeURldmljZVR5cGUucHJlc2VudCA9IDE7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1dQU19QUklNQVJZX0RFVklDRV9DQVRFR09SWSwgJnZhbCkgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgcHJpbSBkZXZpY2UgY2F0ZWdvcnkgZmFpbGVkXG4iKSk7CisJfSBlbHNlCisJCXBEb3QxMWYtPlByaW1hcnlEZXZpY2VUeXBlLnByaW1hcnlfY2F0ZWdvcnkgPSAodWludDE2X3QpIHZhbDsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfV1BTX1BJTUFSWV9ERVZJQ0VfT1VJLCAmdmFsKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBwcmltIGRldmljZSBPVUkgZmFpbGVkXG4iKSk7CisJfSBlbHNlIHsKKwkJKihwRG90MTFmLT5QcmltYXJ5RGV2aWNlVHlwZS5vdWkpID0KKwkJCSh1aW50OF90KSAoKHZhbCA+PiAyNCkgJiAweGZmKTsKKwkJKihwRG90MTFmLT5QcmltYXJ5RGV2aWNlVHlwZS5vdWkgKyAxKSA9CisJCQkodWludDhfdCkgKCh2YWwgPj4gMTYpICYgMHhmZik7CisJCSoocERvdDExZi0+UHJpbWFyeURldmljZVR5cGUub3VpICsgMikgPQorCQkJKHVpbnQ4X3QpICgodmFsID4+IDgpICYgMHhmZik7CisJCSoocERvdDExZi0+UHJpbWFyeURldmljZVR5cGUub3VpICsgMykgPQorCQkJKHVpbnQ4X3QpICgodmFsICYgMHhmZikpOworCX0KKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfV1BTX0RFVklDRV9TVUJfQ0FURUdPUlksICZ2YWwpICE9CisJICAgIGVTSVJfU1VDQ0VTUykgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiY2ZnIGdldCBwcmltIGRldmljZSBzdWIgY2F0ZWdvcnkgZmFpbGVkXG4iKSk7CisJfSBlbHNlCisJCXBEb3QxMWYtPlByaW1hcnlEZXZpY2VUeXBlLnN1Yl9jYXRlZ29yeSA9ICh1aW50MTZfdCkgdmFsOworCisJcERvdDExZi0+RGV2aWNlTmFtZS5wcmVzZW50ID0gMTsKKwljZmdTdHJMZW4gPSBXTklfQ0ZHX01BTlVGQUNUVVJFUl9QUk9EVUNUX05BTUVfTEVOOworCWlmICh3bGFuX2NmZ19nZXRfc3RyKHBNYWMsCisJCQkgICAgIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfTkFNRSwKKwkJCSAgICAgcERvdDExZi0+RGV2aWNlTmFtZS50ZXh0LAorCQkJICAgICAmY2ZnU3RyTGVuKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJcERvdDExZi0+RGV2aWNlTmFtZS5udW1fdGV4dCA9IDA7CisJfSBlbHNlIHsKKwkJcERvdDExZi0+RGV2aWNlTmFtZS5udW1fdGV4dCA9CisJCQkodWludDhfdCkgKGNmZ1N0ckxlbiAmIDB4MDAwMDAwRkYpOworCX0KKworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsCisJCQkgICAgIFdOSV9DRkdfV1BTX0NGR19NRVRIT0QsCisJCQkgICAgICZjZmdNZXRob2RzKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJcERvdDExZi0+Q29uZmlnTWV0aG9kcy5wcmVzZW50ID0gMDsKKwkJcERvdDExZi0+Q29uZmlnTWV0aG9kcy5tZXRob2RzID0gMDsKKwl9IGVsc2UgeworCQlwRG90MTFmLT5Db25maWdNZXRob2RzLnByZXNlbnQgPSAxOworCQlwRG90MTFmLT5Db25maWdNZXRob2RzLm1ldGhvZHMgPQorCQkJKHVpbnQxNl90KSAoY2ZnTWV0aG9kcyAmIDB4MDAwMEZGRkYpOworCX0KKworCXBEb3QxMWYtPlJGQmFuZHMucHJlc2VudCA9IDA7CisKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl93c2NfcmVnaXN0cmFyX2luZm9faW5fcHJvYmVfcmVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJICAgICAgdERvdDExZklFV3NjUHJvYmVSZXMgKgorCQkJCQkJCSAgICAgIHBEb3QxMWYpCit7CisJY29uc3Qgc3RydWN0IHNMaW1Xc2NJZUluZm8gKmNvbnN0IHBXc2NJZUluZm8gPSAmKHBNYWMtPmxpbS53c2NJZUluZm8pOworCXVpbnQzMl90IGRldmljZXBhc3N3ZElkOworCisJcERvdDExZi0+QVBTZXR1cExvY2tlZC5wcmVzZW50ID0gMTsKKwlwRG90MTFmLT5BUFNldHVwTG9ja2VkLmZMb2NrZWQgPSBwV3NjSWVJbmZvLT5hcFNldHVwTG9ja2VkOworCisJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCA9IDE7CisJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIuc2VsZWN0ZWQgPSBwV3NjSWVJbmZvLT5zZWxlY3RlZFJlZ2lzdHJhcjsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50CisJCSAgICAocE1hYywgKHVpbnQxNl90KSBXTklfQ0ZHX1dQU19ERVZJQ0VfUEFTU1dPUkRfSUQsCisJCSAgICAmZGV2aWNlcGFzc3dkSWQpICE9IGVTSVJfU1VDQ0VTUykKKwkJbGltX2xvZyhwTWFjLCBMT0dQLCAiRmFpbGVkIHRvIGNmZyBnZXQgaWQgJWRcbiIsCisJCQlXTklfQ0ZHX1dQU19ERVZJQ0VfUEFTU1dPUkRfSUQpOworCisJcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50ID0gMTsKKwlwRG90MTFmLT5EZXZpY2VQYXNzd29yZElELmlkID0gKHVpbnQxNl90KSBkZXZpY2VwYXNzd2RJZDsKKworCXBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5wcmVzZW50ID0gMTsKKwlwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMubWV0aG9kcyA9CisJCXBXc2NJZUluZm8tPnNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczsKKworCS8qIFVVSURfRSBhbmQgUkYgQmFuZHMgYXJlIGFwcGxpY2FibGUgb25seSBmb3IgZHVhbCBiYW5kIEFQICovCisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzIGRlX3BvcHVsYXRlX2RvdDExZl93c2NfcmVnaXN0cmFyX2luZm9faW5fcHJvYmVfcmVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJCSB0RG90MTFmSUVXc2NQcm9iZVJlcyAqCisJCQkJCQkJCSBwRG90MTFmKQoreworCXBEb3QxMWYtPkFQU2V0dXBMb2NrZWQucHJlc2VudCA9IDA7CisJcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCA9IDA7CisJcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50ID0gMDsKKwlwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCA9IDA7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl9hc3NvY19yZXNfd3NjX2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB0RG90MTFmSUVXc2NBc3NvY1JlcyAqcERvdDExZiwKKwkJCQkJICAgICAgIHRwU2lyQXNzb2NSZXEgcFJjdmRBc3NvY1JlcSkKK3sKKwl0RG90MTFmSUVXc2NBc3NvY1JlcSBwYXJzZWRXc2NBc3NvY1JlcSA9IHsgMCwgfTsKKwl1aW50OF90ICp3c2NJZTsKKworCXdzY0llID0KKwkJbGltR2V0V3NjSUVQdHIocE1hYywgcFJjdmRBc3NvY1JlcS0+YWRkSUUuYWRkSUVkYXRhLAorCQkJICAgICAgIHBSY3ZkQXNzb2NSZXEtPmFkZElFLmxlbmd0aCk7CisJaWYgKHdzY0llICE9IE5VTEwpIHsKKwkJLyogcmV0cmVpdmUgV1NDIElFIGZyb20gZ2l2ZW4gQXNzb2NSZXEgKi8KKwkJZG90MTFmX3VucGFja19pZV93c2NfYXNzb2NfcmVxKHBNYWMsIHdzY0llICsgMiArIDQsICAgICAvKiBFSUQsIGxlbmd0aCwgT1VJICovCisJCQkJCSAgICAgICB3c2NJZVsxXSAtIDQsIC8qIGxlbmd0aCB3aXRob3V0IE9VSSAqLworCQkJCQkgICAgICAgJnBhcnNlZFdzY0Fzc29jUmVxKTsKKwkJcERvdDExZi0+cHJlc2VudCA9IDE7CisJCS8qIHZlcnNpb24gaGFzIHRvIGJlIDB4MTAgKi8KKwkJcERvdDExZi0+VmVyc2lvbi5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+VmVyc2lvbi5tYWpvciA9IDB4MTsKKwkJcERvdDExZi0+VmVyc2lvbi5taW5vciA9IDB4MDsKKworCQlwRG90MTFmLT5SZXNwb25zZVR5cGUucHJlc2VudCA9IDE7CisKKwkJaWYgKChwYXJzZWRXc2NBc3NvY1JlcS5SZXF1ZXN0VHlwZS5yZXFUeXBlID09CisJCSAgICAgUkVRX1RZUEVfUkVHSVNUUkFSKQorCQkgICAgfHwgKHBhcnNlZFdzY0Fzc29jUmVxLlJlcXVlc3RUeXBlLnJlcVR5cGUgPT0KKwkJCVJFUV9UWVBFX1dMQU5fTUFOQUdFUl9SRUdJU1RSQVIpKSB7CisJCQlwRG90MTFmLT5SZXNwb25zZVR5cGUucmVzVHlwZSA9CisJCQkJUkVTUF9UWVBFX0VOUk9MTEVFX09QRU5fODAyMVg7CisJCX0gZWxzZSB7CisJCQlwRG90MTFmLT5SZXNwb25zZVR5cGUucmVzVHlwZSA9IFJFU1BfVFlQRV9BUDsKKwkJfQorCQkvKiBWZXJzaW9uIGluZm9tcmF0aW9uIHNob3VsZCBiZSB0YWtlbiBmcm9tIG91ciBjYXBhYmlsaXR5IGFzIHdlbGwgYXMgcGVlcnMgKi8KKwkJLyogVE9ETzogY3VycmVudGx5IGl0IHRha2VzIGZyb20gcGVlcnMgb25seSAqLworCQlpZiAocGFyc2VkV3NjQXNzb2NSZXEuVmVuZG9yRXh0ZW5zaW9uLnByZXNlbnQgJiYKKwkJICAgIHBhcnNlZFdzY0Fzc29jUmVxLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5wcmVzZW50KSB7CisJCQlwRG90MTFmLT5WZW5kb3JFeHRlbnNpb24ucHJlc2VudCA9IDE7CisJCQlwRG90MTFmLT5WZW5kb3JFeHRlbnNpb24udmVuZG9ySWRbMF0gPSAweDAwOworCQkJcERvdDExZi0+VmVuZG9yRXh0ZW5zaW9uLnZlbmRvcklkWzFdID0gMHgzNzsKKwkJCXBEb3QxMWYtPlZlbmRvckV4dGVuc2lvbi52ZW5kb3JJZFsyXSA9IDB4MkE7CisJCQlwRG90MTFmLT5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIucHJlc2VudCA9IDE7CisJCQlwRG90MTFmLT5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWFqb3IgPQorCQkJCXBhcnNlZFdzY0Fzc29jUmVxLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5tYWpvcjsKKwkJCXBEb3QxMWYtPlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5taW5vciA9CisJCQkJcGFyc2VkV3NjQXNzb2NSZXEuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1pbm9yOworCQl9CisJfQorCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3RTaXJSZXRTdGF0dXMgcG9wdWxhdGVfZG90MTFfYXNzb2NfcmVzX3AycF9pZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICB0RG90MTFmSUVQMlBBc3NvY1JlcyAqcERvdDExZiwKKwkJCQkJICAgICAgdHBTaXJBc3NvY1JlcSBwUmN2ZEFzc29jUmVxKQoreworCXVpbnQ4X3QgKnAycEllOworCisJcDJwSWUgPQorCQlsaW1HZXRQMnBJRVB0cihwTWFjLCBwUmN2ZEFzc29jUmVxLT5hZGRJRS5hZGRJRWRhdGEsCisJCQkgICAgICAgcFJjdmRBc3NvY1JlcS0+YWRkSUUubGVuZ3RoKTsKKwlpZiAocDJwSWUgIT0gTlVMTCkgeworCQlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwkJcERvdDExZi0+UDJQU3RhdHVzLnByZXNlbnQgPSAxOworCQlwRG90MTFmLT5QMlBTdGF0dXMuc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCQlwRG90MTFmLT5FeHRlbmRlZExpc3RlblRpbWluZy5wcmVzZW50ID0gMDsKKwl9CisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCit0U2lyUmV0U3RhdHVzIHBvcHVsYXRlX2RvdDExZl93ZmF0cGModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgIHREb3QxMWZJRVdGQVRQQyAqcERvdDExZiwgdWludDhfdCB0eFBvd2VyLAorCQkJCSAgICAgdWludDhfdCBsaW5rTWFyZ2luKQoreworCXBEb3QxMWYtPnR4UG93ZXIgPSB0eFBvd2VyOworCXBEb3QxMWYtPmxpbmtNYXJnaW4gPSBsaW5rTWFyZ2luOworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfYmVhY29uX3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgKnBEb3QxMWYsCisJCQkJCSAgICB0U2lyTWFjQmVhY29uUmVwb3J0ICpwQmVhY29uUmVwb3J0KQoreworCisJcERvdDExZi0+cmVwb3J0LkJlYWNvbi5yZWdDbGFzcyA9IHBCZWFjb25SZXBvcnQtPnJlZ0NsYXNzOworCXBEb3QxMWYtPnJlcG9ydC5CZWFjb24uY2hhbm5lbCA9IHBCZWFjb25SZXBvcnQtPmNoYW5uZWw7CisJY2RmX21lbV9jb3B5KHBEb3QxMWYtPnJlcG9ydC5CZWFjb24ubWVhc19zdGFydF90aW1lLAorCQkgICAgIHBCZWFjb25SZXBvcnQtPm1lYXNTdGFydFRpbWUsCisJCSAgICAgc2l6ZW9mKHBEb3QxMWYtPnJlcG9ydC5CZWFjb24ubWVhc19zdGFydF90aW1lKSk7CisJcERvdDExZi0+cmVwb3J0LkJlYWNvbi5tZWFzX2R1cmF0aW9uID0gcEJlYWNvblJlcG9ydC0+bWVhc0R1cmF0aW9uOworCXBEb3QxMWYtPnJlcG9ydC5CZWFjb24uY29uZGVuc2VkX1BIWSA9IHBCZWFjb25SZXBvcnQtPnBoeVR5cGU7CisJcERvdDExZi0+cmVwb3J0LkJlYWNvbi5yZXBvcnRlZF9mcmFtZV90eXBlID0KKwkJIXBCZWFjb25SZXBvcnQtPmJjblByb2JlUnNwOworCXBEb3QxMWYtPnJlcG9ydC5CZWFjb24uUkNQSSA9IHBCZWFjb25SZXBvcnQtPnJjcGk7CisJcERvdDExZi0+cmVwb3J0LkJlYWNvbi5SU05JID0gcEJlYWNvblJlcG9ydC0+cnNuaTsKKwljZGZfbWVtX2NvcHkocERvdDExZi0+cmVwb3J0LkJlYWNvbi5CU1NJRCwgcEJlYWNvblJlcG9ydC0+YnNzaWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJcERvdDExZi0+cmVwb3J0LkJlYWNvbi5hbnRlbm5hX2lkID0gcEJlYWNvblJlcG9ydC0+YW50ZW5uYUlkOworCXBEb3QxMWYtPnJlcG9ydC5CZWFjb24ucGFyZW50X1RTRiA9IHBCZWFjb25SZXBvcnQtPnBhcmVudFRTRjsKKworCWlmIChwQmVhY29uUmVwb3J0LT5udW1JZXMpIHsKKwkJcERvdDExZi0+cmVwb3J0LkJlYWNvbi5CZWFjb25SZXBvcnRGcm1Cb2R5LnByZXNlbnQgPSAxOworCQljZGZfbWVtX2NvcHkocERvdDExZi0+cmVwb3J0LkJlYWNvbi5CZWFjb25SZXBvcnRGcm1Cb2R5LgorCQkJICAgICByZXBvcnRlZEZpZWxkcywgcEJlYWNvblJlcG9ydC0+SWVzLAorCQkJICAgICBwQmVhY29uUmVwb3J0LT5udW1JZXMpOworCQlwRG90MTFmLT5yZXBvcnQuQmVhY29uLkJlYWNvblJlcG9ydEZybUJvZHkubnVtX3JlcG9ydGVkRmllbGRzID0KKwkJCXBCZWFjb25SZXBvcnQtPm51bUllczsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9CisKK3RTaXJSZXRTdGF0dXMgcG9wdWxhdGVfZG90MTFmX3JybV9pZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgdERvdDExZklFUlJNRW5hYmxlZENhcCAqcERvdDExZiwKKwkJCQkgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisJdHBSUk1DYXBzIHBScm1DYXBzOworCisJcFJybUNhcHMgPSBycm1fZ2V0X2NhcGFiaWxpdGllcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworCXBEb3QxMWYtPkxpbmtNZWFzdXJlbWVudCA9IHBScm1DYXBzLT5MaW5rTWVhc3VyZW1lbnQ7CisJcERvdDExZi0+TmVpZ2hib3JScHQgPSBwUnJtQ2Fwcy0+TmVpZ2hib3JScHQ7CisJcERvdDExZi0+cGFyYWxsZWwgPSBwUnJtQ2Fwcy0+cGFyYWxsZWw7CisJcERvdDExZi0+cmVwZWF0ZWQgPSBwUnJtQ2Fwcy0+cmVwZWF0ZWQ7CisJcERvdDExZi0+QmVhY29uUGFzc2l2ZSA9IHBScm1DYXBzLT5CZWFjb25QYXNzaXZlOworCXBEb3QxMWYtPkJlYWNvbkFjdGl2ZSA9IHBScm1DYXBzLT5CZWFjb25BY3RpdmU7CisJcERvdDExZi0+QmVhY29uVGFibGUgPSBwUnJtQ2Fwcy0+QmVhY29uVGFibGU7CisJcERvdDExZi0+QmVhY29uUmVwQ29uZCA9IHBScm1DYXBzLT5CZWFjb25SZXBDb25kOworCXBEb3QxMWYtPkZyYW1lTWVhc3VyZW1lbnQgPSBwUnJtQ2Fwcy0+RnJhbWVNZWFzdXJlbWVudDsKKwlwRG90MTFmLT5DaGFubmVsTG9hZCA9IHBScm1DYXBzLT5DaGFubmVsTG9hZDsKKwlwRG90MTFmLT5Ob2lzZUhpc3RvZ3JhbSA9IHBScm1DYXBzLT5Ob2lzZUhpc3RvZ3JhbTsKKwlwRG90MTFmLT5zdGF0aXN0aWNzID0gcFJybUNhcHMtPnN0YXRpc3RpY3M7CisJcERvdDExZi0+TENJTWVhc3VyZW1lbnQgPSBwUnJtQ2Fwcy0+TENJTWVhc3VyZW1lbnQ7CisJcERvdDExZi0+TENJQXppbXV0aCA9IHBScm1DYXBzLT5MQ0lBemltdXRoOworCXBEb3QxMWYtPlRDTUNhcGFiaWxpdHkgPSBwUnJtQ2Fwcy0+VENNQ2FwYWJpbGl0eTsKKwlwRG90MTFmLT50cmlnZ2VyZWRUQ00gPSBwUnJtQ2Fwcy0+dHJpZ2dlcmVkVENNOworCXBEb3QxMWYtPkFQQ2hhblJlcG9ydCA9IHBScm1DYXBzLT5BUENoYW5SZXBvcnQ7CisJcERvdDExZi0+UlJNTUlCRW5hYmxlZCA9IHBScm1DYXBzLT5SUk1NSUJFbmFibGVkOworCXBEb3QxMWYtPm9wZXJhdGluZ0NoYW5NYXggPSBwUnJtQ2Fwcy0+b3BlcmF0aW5nQ2hhbk1heDsKKwlwRG90MTFmLT5ub25PcGVyYXRpbkNoYW5NYXggPSBwUnJtQ2Fwcy0+bm9uT3BlcmF0aW5nQ2hhbk1heDsKKwlwRG90MTFmLT5NZWFzdXJlbWVudFBpbG90ID0gcFJybUNhcHMtPk1lYXN1cmVtZW50UGlsb3Q7CisJcERvdDExZi0+TWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQgPSBwUnJtQ2Fwcy0+TWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQ7CisJcERvdDExZi0+TmVpZ2hib3JUU0ZPZmZzZXQgPSBwUnJtQ2Fwcy0+TmVpZ2hib3JUU0ZPZmZzZXQ7CisJcERvdDExZi0+UkNQSU1lYXN1cmVtZW50ID0gcFJybUNhcHMtPlJDUElNZWFzdXJlbWVudDsKKwlwRG90MTFmLT5SU05JTWVhc3VyZW1lbnQgPSBwUnJtQ2Fwcy0+UlNOSU1lYXN1cmVtZW50OworCXBEb3QxMWYtPkJzc0F2Z0FjY2Vzc0RlbGF5ID0gcFJybUNhcHMtPkJzc0F2Z0FjY2Vzc0RlbGF5OworCXBEb3QxMWYtPkJTU0F2YWlsQWRtaXNzaW9uID0gcFJybUNhcHMtPkJTU0F2YWlsQWRtaXNzaW9uOworCXBEb3QxMWYtPkFudGVubmFJbmZvcm1hdGlvbiA9IHBScm1DYXBzLT5BbnRlbm5hSW5mb3JtYXRpb247CisJcERvdDExZi0+ZmluZV90aW1lX21lYXNfcnB0ID0gcFJybUNhcHMtPmZpbmVfdGltZV9tZWFzX3JwdDsKKwlwRG90MTFmLT5sY2lfY2FwYWJpbGl0eSA9IHBScm1DYXBzLT5sY2lfY2FwYWJpbGl0eTsKKwlwRG90MTFmLT5yZXNlcnZlZCA9IHBScm1DYXBzLT5yZXNlcnZlZDsKKworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK3ZvaWQgcG9wdWxhdGVfbWRpZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgICB0RG90MTFmSUVNb2JpbGl0eURvbWFpbiAqcERvdDExZiwKKwkJICAgdWludDhfdCBtZGllW1NJUl9NRElFX1NJWkVdKQoreworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCXBEb3QxMWYtPk1ESUQgPSAodWludDE2X3QpICgobWRpZVsxXSA8PCA4KSB8IChtZGllWzBdKSk7CisKKwkvKiBQbHVnZmVzdCBmaXggKi8KKwlwRG90MTFmLT5vdmVyRFNDYXAgPSAobWRpZVsyXSAmIDB4MDEpOworCXBEb3QxMWYtPnJlc291cmNlUmVxQ2FwID0gKChtZGllWzJdID4+IDEpICYgMHgwMSk7CisKK30KKwordm9pZCBwb3B1bGF0ZV9mdF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRUZUSW5mbyAqcERvdDExZikKK3sKKwlwRG90MTFmLT5wcmVzZW50ID0gMTsKKwlwRG90MTFmLT5JRUNvdW50ID0gMDsgICAvKiBUT0RPOiBwdXQgdmFsaWQgZGF0YSBkdXJpbmcgcmVhc3NvYy4gKi8KKwkvKiBBbGwgb3RoZXIgaW5mbyBpcyB6ZXJvLiAqLworCit9CisjZW5kaWYKKwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfYXNzb2NfcnNwX3JhdGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICB0RG90MTFmSUVTdXBwUmF0ZXMgKnBTdXBwLAorCQkJCSAgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICpwRXh0LAorCQkJCSAgICAgdWludDE2X3QgKl8xMWJSYXRlcywgdWludDE2X3QgKl8xMWFSYXRlcykKK3sKKwl1aW50OF90IG51bV9zdXBwID0gMCwgbnVtX2V4dCA9IDA7CisJdWludDhfdCBpLCBqOworCisJZm9yIChpID0gMDsgKGkgPCBTSVJfTlVNXzExQl9SQVRFUyAmJiBfMTFiUmF0ZXNbaV0pOyBpKyssIG51bV9zdXBwKyspIHsKKwkJcFN1cHAtPnJhdGVzW251bV9zdXBwXSA9ICh1aW50OF90KSBfMTFiUmF0ZXNbaV07CisJfQorCWZvciAoaiA9IDA7IChqIDwgU0lSX05VTV8xMUFfUkFURVMgJiYgXzExYVJhdGVzW2pdKTsgaisrKSB7CisJCWlmIChudW1fc3VwcCA8IDgpCisJCQlwU3VwcC0+cmF0ZXNbbnVtX3N1cHArK10gPSAodWludDhfdCkgXzExYVJhdGVzW2pdOworCQllbHNlCisJCQlwRXh0LT5yYXRlc1tudW1fZXh0KytdID0gKHVpbnQ4X3QpIF8xMWFSYXRlc1tqXTsKKwl9CisKKwlpZiAobnVtX3N1cHApIHsKKwkJcFN1cHAtPm51bV9yYXRlcyA9IG51bV9zdXBwOworCQlwU3VwcC0+cHJlc2VudCA9IDE7CisJfQorCWlmIChudW1fZXh0KSB7CisJCXBFeHQtPm51bV9yYXRlcyA9IG51bV9leHQ7CisJCXBFeHQtPnByZXNlbnQgPSAxOworCX0KK30KKwordm9pZCBwb3B1bGF0ZV9kb3QxMWZfdGltZW91dF9pbnRlcnZhbCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgIHREb3QxMWZJRVRpbWVvdXRJbnRlcnZhbCAqcERvdDExZiwKKwkJCQkgICAgICB1aW50OF90IHR5cGUsIHVpbnQzMl90IHZhbHVlKQoreworCXBEb3QxMWYtPnByZXNlbnQgPSAxOworCXBEb3QxMWYtPnRpbWVvdXRUeXBlID0gdHlwZTsKKwlwRG90MTFmLT50aW1lb3V0VmFsdWUgPSB2YWx1ZTsKK30KKworLyoqCisgKiBwb3B1bGF0ZV9kb3QxMWZfdGltaW5nX2FkdmVydF9mcmFtZSgpIC0gUG9wdWxhdGUgdGhlIFRBIG1nbXQgZnJhbWUgZmllbGRzCisgKiBAcE1hYzogdGhlIE1BQyBjb250ZXh0CisgKiBAZnJhbWU6IHBvaW50ZXIgdG8gdGhlIFRBIGZyYW1lCisgKgorICogUmV0dXJuOiBUaGUgU0lSIHN0YXR1cy4KKyAqLwordFNpclJldFN0YXR1cyBwb3B1bGF0ZV9kb3QxMWZfdGltaW5nX2FkdmVydF9mcmFtZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCXREb3QxMWZUaW1pbmdBZHZlcnRpc2VtZW50RnJhbWUgKmZyYW1lKQoreworCXVpbnQzMl90IHZhbCwgY29kZWxlbiwgbGVuOworCXVpbnQxNl90IGl0ZW07CisJdWludDhfdCB0ZW1wW0NGR19NQVhfU1RSX0xFTl0sIGNvZGVbM107CisJdFNpclJldFN0YXR1cyBuU2lyU3RhdHVzOworCisJLyogQ2FwYWJpbGl0aWVzICovCisJd2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRCwgJnZhbCk7CisJaWYgKHZhbCkKKwkJZnJhbWUtPkNhcGFiaWxpdGllcy5wcml2YWN5ID0gMTsKKworCXdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19TSE9SVF9QUkVBTUJMRSwgJnZhbCk7CisJaWYgKHZhbCkKKwkJZnJhbWUtPkNhcGFiaWxpdGllcy5zaG9ydFByZWFtYmxlID0gMTsKKworCXdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR18xMUhfRU5BQkxFRCwgJnZhbCk7CisJaWYgKHZhbCkKKwkJZnJhbWUtPkNhcGFiaWxpdGllcy5zcGVjdHJ1bU1ndCA9IDE7CisKKwl3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfUU9TX0VOQUJMRUQsICZ2YWwpOworCWlmICh2YWwpCisJCWZyYW1lLT5DYXBhYmlsaXRpZXMucW9zID0gMTsKKworCXdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19BUFNEX0VOQUJMRUQsICZ2YWwpOworCWlmICh2YWwpCisJCWZyYW1lLT5DYXBhYmlsaXRpZXMuYXBzZCA9IDE7CisKKwl3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRUQsICZ2YWwpOworCWZyYW1lLT5DYXBhYmlsaXRpZXMuZGVsYXllZEJBID0KKwkJKHVpbnQxNl90KSgodmFsID4+IFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRURfREVMQVlFRCkgJiAxKTsKKwlmcmFtZS0+Q2FwYWJpbGl0aWVzLmltbWVkaWF0ZUJBID0KKwkJKHVpbnQxNl90KSgodmFsID4+IFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRURfSU1NRURJQVRFKSAmIDEpOworCisJLyogQ291bnRyeSAqLworCWl0ZW0gPSBXTklfQ0ZHX01BWF9UWF9QT1dFUl81OworCUNGR19HRVRfU1RSKG5TaXJTdGF0dXMsIG1hY19jdHgsIGl0ZW0sIHRlbXAsIGxlbiwKKwkJV05JX0NGR19NQVhfVFhfUE9XRVJfNV9MRU4pOworCWl0ZW0gPSBXTklfQ0ZHX0NPVU5UUllfQ09ERTsKKwlDRkdfR0VUX1NUUihuU2lyU3RhdHVzLCBtYWNfY3R4LCBpdGVtLCBjb2RlLCBjb2RlbGVuLCAzKTsKKwljZGZfbWVtX2NvcHkoJmZyYW1lLT5Db3VudHJ5LCBjb2RlLCBjb2RlbGVuKTsKKwlpZiAobGVuID4gTUFYX1NJWkVfT0ZfVFJJUExFVFNfSU5fQ09VTlRSWV9JRSkKKwkJbGVuID0gTUFYX1NJWkVfT0ZfVFJJUExFVFNfSU5fQ09VTlRSWV9JRTsKKworCWZyYW1lLT5Db3VudHJ5Lm51bV90cmlwbGV0cyA9ICh1aW50OF90KShsZW4gLyAzKTsKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikmZnJhbWUtPkNvdW50cnkudHJpcGxldHMsIHRlbXAsIGxlbik7CisJZnJhbWUtPkNvdW50cnkucHJlc2VudCA9IDE7CisKKwkvKiBQb3dlckNvbnN0cmFpbnRzICovCisJd2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlQsICZ2YWwpOworCWZyYW1lLT5Qb3dlckNvbnN0cmFpbnRzLmxvY2FsUG93ZXJDb25zdHJhaW50cyA9ICh1aW50OF90KXZhbDsKKwlmcmFtZS0+UG93ZXJDb25zdHJhaW50cy5wcmVzZW50ID0gMTsKKworCS8qIFRpbWVBZHZlcnRpc2VtZW50ICovCisJZnJhbWUtPlRpbWVBZHZlcnRpc2VtZW50LnByZXNlbnQgPSAxOworCWZyYW1lLT5UaW1lQWR2ZXJ0aXNlbWVudC50aW1pbmdfY2FwYWJpbGl0aWVzID0gMTsKKworCXJldHVybiBuU2lyU3RhdHVzOworfQorCisvKiBwYXJzZXJfYXBpLmMgZW5kcyBoZXJlLiAqLwpkaWZmIC0tZ2l0IGEvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3V0aWxzL3NyYy91dGlsc19hcGkuYyBiL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy91dGlscy9zcmMvdXRpbHNfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0YmJkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjL3NyYy9zeXMvbGVnYWN5L3NyYy91dGlscy9zcmMvdXRpbHNfYXBpLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAqLworLyogIEZpbGU6ICAgICAgICAgdXRpbHNfYXBpLmNjICovCisvKiAqLworLyogIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50aW9uIG9mIGEgZmV3IHV0aWxpdHkgcm91dGluZXMuICovCisvKiAqLworLyogIEF1dGhvcjogICAgICAgTmVlbGF5IERhcyAqLworLyogKi8KKy8qIC8vICovCisvKiAgQ2hhbmdlIGdIaXN0b3J5OiAqLworLyogIDEyLzE1LzIwMDMgLSBOREEgLSBJbml0aWFsIHZlcnNpb24uICovCisvKiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogc2lyX2R1bXBfYnVmKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGR1bXAgYSBidWZmZXIgd2l0aCBhIGNlcnRhaW4gbGV2ZWwKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcEJ1ZjogYnVmZmVyIHBvaW50ZXIKKyAqIEByZXR1cm4gTm9uZS4KKyAqLwordm9pZAorc2lyX2R1bXBfYnVmKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgbW9kSWQsIHVpbnQzMl90IGxldmVsLCB1aW50OF90ICpidWYsCisJICAgICB1aW50MzJfdCBzaXplKQoreworCXVpbnQzMl90IGk7CisKKwlpZiAobGV2ZWwgPiBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbTE9HX0lOREVYX0ZPUl9NT0RVTEUobW9kSWQpXSkKKwkJcmV0dXJuOworCisJbG9nX2RiZyhwTWFjLCBtb2RJZCwgbGV2ZWwsIEZMKCJEdW1waW5nICVkIGJ5dGVzIGluIGhvc3Qgb3JkZXJcbiIpLAorCQlzaXplKTsKKworCWZvciAoaSA9IDA7IChpICsgNykgPCBzaXplOyBpICs9IDgpIHsKKwkJbG9nX2RiZyhwTWFjLCBtb2RJZCwgbGV2ZWwsCisJCQkiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwKKwkJCWJ1ZltpXSwKKwkJCWJ1ZltpICsgMV0sCisJCQlidWZbaSArIDJdLAorCQkJYnVmW2kgKyAzXSwKKwkJCWJ1ZltpICsgNF0sIGJ1ZltpICsgNV0sIGJ1ZltpICsgNl0sIGJ1ZltpICsgN10pOworCX0KKworCS8qIER1bXAgdGhlIGJ5dGVzIGluIHRoZSBsYXN0IGxpbmUgKi8KKwlmb3IgKDsgaSA8IHNpemU7IGkrKykgeworCQlsb2dfZGJnKHBNYWMsIG1vZElkLCBsZXZlbCwgIiUwMnggIiwgYnVmW2ldKTsKKworCQlpZiAoKGkgKyAxKSA9PSBzaXplKQorCQkJbG9nX2RiZyhwTWFjLCBtb2RJZCwgbGV2ZWwsICJcbiIpOworCX0KKworfSAvKioqIGVuZCBzaXJfZHVtcF9idWYoKSAqKiovCmRpZmYgLS1naXQgYS9jb3JlL21hYy9zcmMvc3lzL2xlZ2FjeS9zcmMvdXRpbHMvc3JjL3V0aWxzX3BhcnNlci5jIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3V0aWxzL3NyYy91dGlsc19wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjkxOTAyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9tYWMvc3JjL3N5cy9sZWdhY3kvc3JjL3V0aWxzL3NyYy91dGlsc19wYXJzZXIuYwpAQCAtMCwwICsxLDgyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCisgKiBUaGlzIGZpbGUgdXRpbHNfcGFyc2VyLmNjIGNvbnRhaW5zIHRoZSBjb2RlIGZvciBwYXJzaW5nCisgKiA4MDIuMTEgbWVzc2FnZXMuCisgKiBBdXRob3I6ICAgICAgICBQaWVycmUgVmFuZHdhbGxlCisgKiBEYXRlOiAgICAgICAgICAwMy8xOC8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAidXRpbHNfcGFyc2VyLmgiCisjaW5jbHVkZSAibGltX3Nlcl9kZXNfdXRpbHMuaCIKKwordm9pZCBjb252ZXJ0X3NzaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY1NTaWQgKnBPbGQsIHREb3QxMWZJRVNTSUQgKnBOZXcpCit7CisJcE9sZC0+bGVuZ3RoID0gcE5ldy0+bnVtX3NzaWQ7CisJY2RmX21lbV9jb3B5KHBPbGQtPnNzSWQsIHBOZXctPnNzaWQsIHBOZXctPm51bV9zc2lkKTsKK30KKwordm9pZCBjb252ZXJ0X3N1cHBfcmF0ZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXRTaXJNYWNSYXRlU2V0ICpwT2xkLCB0RG90MTFmSUVTdXBwUmF0ZXMgKnBOZXcpCit7CisJcE9sZC0+bnVtUmF0ZXMgPSBwTmV3LT5udW1fcmF0ZXM7CisJY2RmX21lbV9jb3B5KHBPbGQtPnJhdGUsIHBOZXctPnJhdGVzLCBwTmV3LT5udW1fcmF0ZXMpOworfQorCit2b2lkIGNvbnZlcnRfZXh0X3N1cHBfcmF0ZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICB0U2lyTWFjUmF0ZVNldCAqcE9sZCwgdERvdDExZklFRXh0U3VwcFJhdGVzICpwTmV3KQoreworCXBPbGQtPm51bVJhdGVzID0gcE5ldy0+bnVtX3JhdGVzOworCWNkZl9tZW1fY29weShwT2xkLT5yYXRlLCBwTmV3LT5yYXRlcywgcE5ldy0+bnVtX3JhdGVzKTsKK30KKwordm9pZCBjb252ZXJ0X3Fvc19jYXBzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgIHRTaXJNYWNRb3NDYXBhYmlsaXR5SUUgKnBPbGQsIHREb3QxMWZJRVFPU0NhcHNBcCAqcE5ldykKK3sKKwlwT2xkLT50eXBlID0gNDY7CisJcE9sZC0+bGVuZ3RoID0gMTsKKworCXBPbGQtPnFvc0luZm8uY291bnQgPSBwTmV3LT5jb3VudDsKK30KKwordm9pZCBjb252ZXJ0X3Fvc19jYXBzX3N0YXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgIHRTaXJNYWNRb3NDYXBhYmlsaXR5U3RhSUUgKnBPbGQsCisJCQkgICAgICB0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiAqcE5ldykKK3sKKwlwT2xkLT50eXBlID0gNDY7CisJcE9sZC0+bGVuZ3RoID0gMTsKKworCXBPbGQtPnFvc0luZm8ubW9yZURhdGFBY2sgPSBwTmV3LT5tb3JlX2RhdGFfYWNrOworCXBPbGQtPnFvc0luZm8ubWF4U3BMZW4gPSBwTmV3LT5tYXhfc3BfbGVuZ3RoOworCXBPbGQtPnFvc0luZm8ucWFjayA9IHBOZXctPnFhY2s7CisJcE9sZC0+cW9zSW5mby5hY2JlX3VhcHNkID0gcE5ldy0+YWNiZV91YXBzZDsKKwlwT2xkLT5xb3NJbmZvLmFjYmtfdWFwc2QgPSBwTmV3LT5hY2JrX3VhcHNkOworCXBPbGQtPnFvc0luZm8uYWN2aV91YXBzZCA9IHBOZXctPmFjdmlfdWFwc2Q7CisJcE9sZC0+cW9zSW5mby5hY3ZvX3VhcHNkID0gcE5ldy0+YWN2b191YXBzZDsKK30KKwordFNpclJldFN0YXR1cyBjb252ZXJ0X3dwYSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICB0U2lyTWFjV3BhSW5mbyAqcE9sZCwgdERvdDExZklFV1BBICpwTmV3KQoreworCS8qIFRoaXMgaXMgYXdmdWwsIEkga25vdywgYnV0IHRoZSBvbGQgY29kZSBqdXN0IHJhbW1lZCB0aGUgSUUgaW50byBhbiAqLworCS8qIGFycmF5Li4uICovCisJdWludDhfdCBidWZmZXJbMjU3XTsKKwl1aW50MzJfdCBzdGF0dXMsIHdyaXR0ZW4gPSAwLCBuYnVmZmVyID0gMjU3OworCXN0YXR1cyA9IGRvdDExZl9wYWNrX2llX3dwYShwTWFjLCBwTmV3LCBidWZmZXIsIG5idWZmZXIsICZ3cml0dGVuKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWRvdDExZl9sb2cocE1hYywgTE9HMiwgRkwoIkZhaWxlZCB0byByZS1wYWNrIHRoZSBXUEEgSUUgKDB4JTB4IgorCQkJCQkgICI4KS5cbiIpLCBzdGF0dXMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXBPbGQtPmxlbmd0aCA9ICh1aW50OF90KSB3cml0dGVuIC0gMjsKKwljZGZfbWVtX2NvcHkocE9sZC0+aW5mbywgYnVmZmVyICsgMiwgcE9sZC0+bGVuZ3RoKTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3RTaXJSZXRTdGF0dXMgY29udmVydF93cGFfb3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIHRTaXJNYWNXcGFJbmZvICpwT2xkLCB0RG90MTFmSUVXUEFPcGFxdWUgKnBOZXcpCit7CisJLyogVGhpcyBpcyBhd2Z1bCwgSSBrbm93LCBidXQgdGhlIG9sZCBjb2RlIGp1c3QgcmFtbWVkIHRoZSBJRSBpbnRvICovCisJLyogYW4gb3BhcXVlIGFycmF5LiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gZXhwbGljaXRseSBhZGQgdGhlIE9VSSEgKi8KKwlwT2xkLT5sZW5ndGggPSBwTmV3LT5udW1fZGF0YSArIDQ7CisJcE9sZC0+aW5mb1swXSA9IDB4MDA7CisJcE9sZC0+aW5mb1sxXSA9IDB4NTA7CisJcE9sZC0+aW5mb1syXSA9IDB4ZjI7CisJcE9sZC0+aW5mb1szXSA9IDB4MDE7CisJY2RmX21lbV9jb3B5KHBPbGQtPmluZm8gKyA0LCBwTmV3LT5kYXRhLCBwTmV3LT5udW1fZGF0YSk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKK3RTaXJSZXRTdGF0dXMgY29udmVydF93YXBpX29wYXF1ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgdFNpck1hY1dhcGlJbmZvICpwT2xkLAorCQkJCSAgdERvdDExZklFV0FQSU9wYXF1ZSAqcE5ldykKK3sKKwkvKiBUaGlzIGlzIGF3ZnVsLCBJIGtub3csIGJ1dCB0aGUgb2xkIGNvZGUganVzdCByYW1tZWQgdGhlIElFIGludG8gKi8KKwkvKiBhbiBvcGFxdWUgYXJyYXkuICBOb3RlIHRoYXQgd2UgbmVlZCB0byBleHBsaWNpdGx5IGFkZCB0aGUgT1VJISAqLworCXBPbGQtPmxlbmd0aCA9IHBOZXctPm51bV9kYXRhOworCWNkZl9tZW1fY29weShwT2xkLT5pbmZvLCBwTmV3LT5kYXRhLCBwTmV3LT5udW1fZGF0YSk7CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorI2VuZGlmCisKK3RTaXJSZXRTdGF0dXMgY29udmVydF93c2Nfb3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIHRTaXJBZGRpZSAqcE9sZCwgdERvdDExZklFV3NjSUVPcGFxdWUgKnBOZXcpCit7CisJLyogVGhpcyBpcyBhd2Z1bCwgSSBrbm93LCBidXQgdGhlIG9sZCBjb2RlIGp1c3QgcmFtbWVkIHRoZSBJRSBpbnRvICovCisJLyogYW4gb3BhcXVlIGFycmF5LiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gZXhwbGljaXRseSBhZGQgdGhlIHZlbmRvcklFIGFuZCBPVUkgISAqLworCXVpbnQ4X3QgY3VyQWRkSUVMZW4gPSBwT2xkLT5sZW5ndGg7CisKKwlwT2xkLT5sZW5ndGggPSBjdXJBZGRJRUxlbiArIHBOZXctPm51bV9kYXRhICsgNjsKKwlwT2xkLT5hZGRJRWRhdGFbY3VyQWRkSUVMZW4rK10gPSAweGRkOworCXBPbGQtPmFkZElFZGF0YVtjdXJBZGRJRUxlbisrXSA9IHBOZXctPm51bV9kYXRhICsgNDsKKwlwT2xkLT5hZGRJRWRhdGFbY3VyQWRkSUVMZW4rK10gPSAweDAwOworCXBPbGQtPmFkZElFZGF0YVtjdXJBZGRJRUxlbisrXSA9IDB4NTA7CisJcE9sZC0+YWRkSUVkYXRhW2N1ckFkZElFTGVuKytdID0gMHhmMjsKKwlwT2xkLT5hZGRJRWRhdGFbY3VyQWRkSUVMZW4rK10gPSAweDA0OworCWNkZl9tZW1fY29weShwT2xkLT5hZGRJRWRhdGEgKyBjdXJBZGRJRUxlbiwgcE5ldy0+ZGF0YSwgcE5ldy0+bnVtX2RhdGEpOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordFNpclJldFN0YXR1cyBjb252ZXJ0X3AycF9vcGFxdWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgIHRTaXJBZGRpZSAqcE9sZCwgdERvdDExZklFUDJQSUVPcGFxdWUgKnBOZXcpCit7CisJLyogVGhpcyBpcyBhd2Z1bCwgSSBrbm93LCBidXQgdGhlIG9sZCBjb2RlIGp1c3QgcmFtbWVkIHRoZSBJRSBpbnRvICovCisJLyogYW4gb3BhcXVlIGFycmF5LiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gZXhwbGljaXRseSBhZGQgdGhlIHZlbmRvcklFIGFuZCBPVUkgISAqLworCXVpbnQ4X3QgY3VyQWRkSUVMZW4gPSBwT2xkLT5sZW5ndGg7CisKKwlwT2xkLT5sZW5ndGggPSBjdXJBZGRJRUxlbiArIHBOZXctPm51bV9kYXRhICsgNjsKKwlwT2xkLT5hZGRJRWRhdGFbY3VyQWRkSUVMZW4rK10gPSAweGRkOworCXBPbGQtPmFkZElFZGF0YVtjdXJBZGRJRUxlbisrXSA9IHBOZXctPm51bV9kYXRhICsgNDsKKwlwT2xkLT5hZGRJRWRhdGFbY3VyQWRkSUVMZW4rK10gPSAweDUwOworCXBPbGQtPmFkZElFZGF0YVtjdXJBZGRJRUxlbisrXSA9IDB4NmY7CisJcE9sZC0+YWRkSUVkYXRhW2N1ckFkZElFTGVuKytdID0gMHg5QTsKKwlwT2xkLT5hZGRJRWRhdGFbY3VyQWRkSUVMZW4rK10gPSAweDA5OworCWNkZl9tZW1fY29weShwT2xkLT5hZGRJRWRhdGEgKyBjdXJBZGRJRUxlbiwgcE5ldy0+ZGF0YSwgcE5ldy0+bnVtX2RhdGEpOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9XRkQKK3RTaXJSZXRTdGF0dXMgY29udmVydF93ZmRfb3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIHRTaXJBZGRpZSAqcE9sZCwgdERvdDExZklFV0ZESUVPcGFxdWUgKnBOZXcpCit7CisJLyogVGhpcyBpcyBhd2Z1bCwgSSBrbm93LCBidXQgdGhlIG9sZCBjb2RlIGp1c3QgcmFtbWVkIHRoZSBJRSBpbnRvICovCisJLyogYW4gb3BhcXVlIGFycmF5LiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gZXhwbGljaXRseSBhZGQgdGhlIHZlbmRvcklFIGFuZCBPVUkgISAqLworCXVpbnQ4X3QgY3VyQWRkSUVMZW4gPSBwT2xkLT5sZW5ndGg7CisKKwlwT2xkLT5sZW5ndGggPSBjdXJBZGRJRUxlbiArIHBOZXctPm51bV9kYXRhICsgNjsKKwlwT2xkLT5hZGRJRWRhdGFbY3VyQWRkSUVMZW4rK10gPSAweGRkOworCXBPbGQtPmFkZElFZGF0YVtjdXJBZGRJRUxlbisrXSA9IHBOZXctPm51bV9kYXRhICsgNDsKKwlwT2xkLT5hZGRJRWRhdGFbY3VyQWRkSUVMZW4rK10gPSAweDUwOworCXBPbGQtPmFkZElFZGF0YVtjdXJBZGRJRUxlbisrXSA9IDB4NmY7CisJcE9sZC0+YWRkSUVkYXRhW2N1ckFkZElFTGVuKytdID0gMHg5QTsKKwlwT2xkLT5hZGRJRWRhdGFbY3VyQWRkSUVMZW4rK10gPSAweDBhOworCWNkZl9tZW1fY29weShwT2xkLT5hZGRJRWRhdGEgKyBjdXJBZGRJRUxlbiwgcE5ldy0+ZGF0YSwgcE5ldy0+bnVtX2RhdGEpOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKyNlbmRpZgorCit0U2lyUmV0U3RhdHVzIGNvbnZlcnRfcnNuKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgIHRTaXJNYWNSc25JbmZvICpwT2xkLCB0RG90MTFmSUVSU04gKnBOZXcpCit7CisJdWludDhfdCBidWZmZXJbMjU3XTsKKwl1aW50MzJfdCBzdGF0dXMsIHdyaXR0ZW4gPSAwLCBuYnVmZmVyID0gMjU3OworCXN0YXR1cyA9IGRvdDExZl9wYWNrX2llX3JzbihwTWFjLCBwTmV3LCBidWZmZXIsIG5idWZmZXIsICZ3cml0dGVuKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCWRvdDExZl9sb2cocE1hYywgTE9HMiwgRkwoIkZhaWxlZCB0byByZS1wYWNrIHRoZSBSU04gSUUgKDB4JTB4IgorCQkJCQkgICI4KS5cbiIpLCBzdGF0dXMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXBPbGQtPmxlbmd0aCA9ICh1aW50OF90KSB3cml0dGVuIC0gMjsKKwljZGZfbWVtX2NvcHkocE9sZC0+aW5mbywgYnVmZmVyICsgMiwgcE9sZC0+bGVuZ3RoKTsKKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3RTaXJSZXRTdGF0dXMgY29udmVydF9yc25fb3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIHRTaXJNYWNSc25JbmZvICpwT2xkLCB0RG90MTFmSUVSU05PcGFxdWUgKnBOZXcpCit7CisJLyogVGhpcyBpcyBhd2Z1bCwgSSBrbm93LCBidXQgdGhlIG9sZCBjb2RlIGp1c3QgcmFtbWVkIHRoZSBJRSBpbnRvICovCisJLyogYW4gb3BhcXVlIGFycmF5LiAqLworCXBPbGQtPmxlbmd0aCA9IHBOZXctPm51bV9kYXRhOworCWNkZl9tZW1fY29weShwT2xkLT5pbmZvLCBwTmV3LT5kYXRhLCBwT2xkLT5sZW5ndGgpOworCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordm9pZCBjb252ZXJ0X3Bvd2VyX2NhcHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXRTaXJNYWNQb3dlckNhcGFiaWxpdHlJRSAqcE9sZCwKKwkJCXREb3QxMWZJRVBvd2VyQ2FwcyAqcE5ldykKK3sKKwlwT2xkLT50eXBlID0gMzM7CisJcE9sZC0+bGVuZ3RoID0gMjsKKwlwT2xkLT5taW5UeFBvd2VyID0gcE5ldy0+bWluVHhQb3dlcjsKKwlwT2xkLT5tYXhUeFBvd2VyID0gcE5ldy0+bWF4VHhQb3dlcjsKK30KKwordm9pZCBjb252ZXJ0X3N1cHBfY2hhbm5lbHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgIHRTaXJNYWNTdXBwb3J0ZWRDaGFubmVsSUUgKnBPbGQsCisJCQkgICB0RG90MTFmSUVTdXBwQ2hhbm5lbHMgKnBOZXcpCit7CisJcE9sZC0+dHlwZSA9IDM2OworCXBPbGQtPmxlbmd0aCA9IChwTmV3LT5udW1fYmFuZHMgKiAyKTsKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcE9sZC0+c3VwcG9ydGVkQ2hhbm5lbHMsCisJCSAgICAgKHVpbnQ4X3QgKikgcE5ldy0+YmFuZHMsIHBPbGQtPmxlbmd0aCk7Cit9CisKK3ZvaWQgY29udmVydF9jZl9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgICAgIHRTaXJNYWNDZlBhcmFtU2V0ICpwT2xkLCB0RG90MTFmSUVDRlBhcmFtcyAqcE5ldykKK3sKKwlwT2xkLT5jZnBDb3VudCA9IHBOZXctPmNmcF9jb3VudDsKKwlwT2xkLT5jZnBQZXJpb2QgPSBwTmV3LT5jZnBfcGVyaW9kOworCXBPbGQtPmNmcE1heER1cmF0aW9uID0gcE5ldy0+Y2ZwX21heGR1cmF0aW9uOworCXBPbGQtPmNmcER1clJlbWFpbmluZyA9IHBOZXctPmNmcF9kdXJyZW1haW5pbmc7Cit9CisKK3ZvaWQgY29udmVydF9maF9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgICAgIHRTaXJNYWNGSFBhcmFtU2V0ICpwT2xkLCB0RG90MTFmSUVGSFBhcmFtU2V0ICpwTmV3KQoreworCXBPbGQtPmR3ZWxsVGltZSA9IHBOZXctPmR3ZWxsX3RpbWU7CisJcE9sZC0+aG9wU2V0ID0gcE5ldy0+aG9wX3NldDsKKwlwT2xkLT5ob3BQYXR0ZXJuID0gcE5ldy0+aG9wX3BhdHRlcm47CisJcE9sZC0+aG9wSW5kZXggPSBwTmV3LT5ob3BfaW5kZXg7Cit9CisKK3ZvaWQgY29udmVydF90aW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY1RpbSAqcE9sZCwgdERvdDExZklFVElNICpwTmV3KQoreworCXBPbGQtPmR0aW1Db3VudCA9IHBOZXctPmR0aW1fY291bnQ7CisJcE9sZC0+ZHRpbVBlcmlvZCA9IHBOZXctPmR0aW1fcGVyaW9kOworCXBPbGQtPmJpdG1hcENvbnRyb2wgPSBwTmV3LT5ibXBjdGw7CisJcE9sZC0+Yml0bWFwTGVuZ3RoID0gcE5ldy0+bnVtX3ZibXA7CisKKwljZGZfbWVtX2NvcHkocE9sZC0+Yml0bWFwLCBwTmV3LT52Ym1wLCBwTmV3LT5udW1fdmJtcCk7Cit9CisKK3ZvaWQgY29udmVydF9jb3VudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgdFNpckNvdW50cnlJbmZvcm1hdGlvbiAqcE9sZCwgdERvdDExZklFQ291bnRyeSAqcE5ldykKK3sKKwlpbnQgaTsKKworCWNkZl9tZW1fY29weShwT2xkLT5jb3VudHJ5U3RyaW5nLCBwTmV3LT5jb3VudHJ5LCBDT1VOVFJZX1NUUklOR19MRU5HVEgpOworCisJcE9sZC0+bnVtSW50ZXJ2YWxzID0gcE5ldy0+bnVtX3RyaXBsZXRzOworCisJZm9yIChpID0gMDsgaSA8IHBOZXctPm51bV90cmlwbGV0czsgKytpKSB7CisJCXBPbGQtPmNoYW5uZWxUcmFuc21pdFBvd2VyW2ldLmNoYW5uZWxOdW1iZXIgPQorCQkJcE5ldy0+dHJpcGxldHNbaV1bMF07CisJCXBPbGQtPmNoYW5uZWxUcmFuc21pdFBvd2VyW2ldLm51bUNoYW5uZWwgPSBwTmV3LT50cmlwbGV0c1tpXVsxXTsKKwkJcE9sZC0+Y2hhbm5lbFRyYW5zbWl0UG93ZXJbaV0ubWF4VHJhbnNtaXRQb3dlciA9CisJCQlwTmV3LT50cmlwbGV0c1tpXVsyXTsKKwl9Cit9CisKK3ZvaWQgY29udmVydF93bW1fcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQl0U2lyTWFjRWRjYVBhcmFtU2V0SUUgKnBPbGQsIHREb3QxMWZJRVdNTVBhcmFtcyAqcE5ldykKK3sKKwlwT2xkLT50eXBlID0gMjIxOworCXBPbGQtPmxlbmd0aCA9IDI0OworCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZwT2xkLT5xb3NJbmZvLCAodWludDhfdCAqKSAmcE5ldy0+cW9zSW5mbywKKwkJICAgICAxKTsKKworCXBPbGQtPmFjYmUuYWNpLmFpZnNuID0gcE5ldy0+YWNiZV9haWZzbjsKKwlwT2xkLT5hY2JlLmFjaS5hY20gPSBwTmV3LT5hY2JlX2FjbTsKKwlwT2xkLT5hY2JlLmFjaS5hY2kgPSBwTmV3LT5hY2JlX2FjaTsKKwlwT2xkLT5hY2JlLmN3Lm1pbiA9IHBOZXctPmFjYmVfYWN3bWluOworCXBPbGQtPmFjYmUuY3cubWF4ID0gcE5ldy0+YWNiZV9hY3dtYXg7CisJcE9sZC0+YWNiZS50eG9wbGltaXQgPSBwTmV3LT5hY2JlX3R4b3BsaW1pdDsKKworCXBPbGQtPmFjYmsuYWNpLmFpZnNuID0gcE5ldy0+YWNia19haWZzbjsKKwlwT2xkLT5hY2JrLmFjaS5hY20gPSBwTmV3LT5hY2JrX2FjbTsKKwlwT2xkLT5hY2JrLmFjaS5hY2kgPSBwTmV3LT5hY2JrX2FjaTsKKwlwT2xkLT5hY2JrLmN3Lm1pbiA9IHBOZXctPmFjYmtfYWN3bWluOworCXBPbGQtPmFjYmsuY3cubWF4ID0gcE5ldy0+YWNia19hY3dtYXg7CisJcE9sZC0+YWNiay50eG9wbGltaXQgPSBwTmV3LT5hY2JrX3R4b3BsaW1pdDsKKworCXBPbGQtPmFjdmkuYWNpLmFpZnNuID0gcE5ldy0+YWN2aV9haWZzbjsKKwlwT2xkLT5hY3ZpLmFjaS5hY20gPSBwTmV3LT5hY3ZpX2FjbTsKKwlwT2xkLT5hY3ZpLmFjaS5hY2kgPSBwTmV3LT5hY3ZpX2FjaTsKKwlwT2xkLT5hY3ZpLmN3Lm1pbiA9IHBOZXctPmFjdmlfYWN3bWluOworCXBPbGQtPmFjdmkuY3cubWF4ID0gcE5ldy0+YWN2aV9hY3dtYXg7CisJcE9sZC0+YWN2aS50eG9wbGltaXQgPSBwTmV3LT5hY3ZpX3R4b3BsaW1pdDsKKworCXBPbGQtPmFjdm8uYWNpLmFpZnNuID0gcE5ldy0+YWN2b19haWZzbjsKKwlwT2xkLT5hY3ZvLmFjaS5hY20gPSBwTmV3LT5hY3ZvX2FjbTsKKwlwT2xkLT5hY3ZvLmFjaS5hY2kgPSBwTmV3LT5hY3ZvX2FjaTsKKwlwT2xkLT5hY3ZvLmN3Lm1pbiA9IHBOZXctPmFjdm9fYWN3bWluOworCXBPbGQtPmFjdm8uY3cubWF4ID0gcE5ldy0+YWN2b19hY3dtYXg7CisJcE9sZC0+YWN2by50eG9wbGltaXQgPSBwTmV3LT5hY3ZvX3R4b3BsaW1pdDsKK30KKwordm9pZCBjb252ZXJ0X2VycF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgIHRTaXJNYWNFcnBJbmZvICpwT2xkLCB0RG90MTFmSUVFUlBJbmZvICpwTmV3KQoreworCXBPbGQtPm5vbkVycFByZXNlbnQgPSBwTmV3LT5ub25fZXJwX3ByZXNlbnQ7CisJcE9sZC0+dXNlUHJvdGVjdGlvbiA9IHBOZXctPnVzZV9wcm90OworCXBPbGQtPmJhcmtlclByZWFtYmxlTW9kZSA9IHBOZXctPmJhcmtlcl9wcmVhbWJsZTsKK30KKwordm9pZCBjb252ZXJ0X2VkY2FfcGFyYW0odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXRTaXJNYWNFZGNhUGFyYW1TZXRJRSAqcE9sZCwKKwkJCXREb3QxMWZJRUVEQ0FQYXJhbVNldCAqcE5ldykKK3sKKwlwT2xkLT50eXBlID0gMTI7CisJcE9sZC0+bGVuZ3RoID0gMjA7CisKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBPbGQtPnFvc0luZm8sICh1aW50OF90ICopICZwTmV3LT5xb3MsIDEpOworCisJcE9sZC0+YWNiZS5hY2kuYWlmc24gPSBwTmV3LT5hY2JlX2FpZnNuOworCXBPbGQtPmFjYmUuYWNpLmFjbSA9IHBOZXctPmFjYmVfYWNtOworCXBPbGQtPmFjYmUuYWNpLmFjaSA9IHBOZXctPmFjYmVfYWNpOworCXBPbGQtPmFjYmUuY3cubWluID0gcE5ldy0+YWNiZV9hY3dtaW47CisJcE9sZC0+YWNiZS5jdy5tYXggPSBwTmV3LT5hY2JlX2Fjd21heDsKKwlwT2xkLT5hY2JlLnR4b3BsaW1pdCA9IHBOZXctPmFjYmVfdHhvcGxpbWl0OworCisJcE9sZC0+YWNiay5hY2kuYWlmc24gPSBwTmV3LT5hY2JrX2FpZnNuOworCXBPbGQtPmFjYmsuYWNpLmFjbSA9IHBOZXctPmFjYmtfYWNtOworCXBPbGQtPmFjYmsuYWNpLmFjaSA9IHBOZXctPmFjYmtfYWNpOworCXBPbGQtPmFjYmsuY3cubWluID0gcE5ldy0+YWNia19hY3dtaW47CisJcE9sZC0+YWNiay5jdy5tYXggPSBwTmV3LT5hY2JrX2Fjd21heDsKKwlwT2xkLT5hY2JrLnR4b3BsaW1pdCA9IHBOZXctPmFjYmtfdHhvcGxpbWl0OworCisJcE9sZC0+YWN2aS5hY2kuYWlmc24gPSBwTmV3LT5hY3ZpX2FpZnNuOworCXBPbGQtPmFjdmkuYWNpLmFjbSA9IHBOZXctPmFjdmlfYWNtOworCXBPbGQtPmFjdmkuYWNpLmFjaSA9IHBOZXctPmFjdmlfYWNpOworCXBPbGQtPmFjdmkuY3cubWluID0gcE5ldy0+YWN2aV9hY3dtaW47CisJcE9sZC0+YWN2aS5jdy5tYXggPSBwTmV3LT5hY3ZpX2Fjd21heDsKKwlwT2xkLT5hY3ZpLnR4b3BsaW1pdCA9IHBOZXctPmFjdmlfdHhvcGxpbWl0OworCisJcE9sZC0+YWN2by5hY2kuYWlmc24gPSBwTmV3LT5hY3ZvX2FpZnNuOworCXBPbGQtPmFjdm8uYWNpLmFjbSA9IHBOZXctPmFjdm9fYWNtOworCXBPbGQtPmFjdm8uYWNpLmFjaSA9IHBOZXctPmFjdm9fYWNpOworCXBPbGQtPmFjdm8uY3cubWluID0gcE5ldy0+YWN2b19hY3dtaW47CisJcE9sZC0+YWN2by5jdy5tYXggPSBwTmV3LT5hY3ZvX2Fjd21heDsKKwlwT2xkLT5hY3ZvLnR4b3BsaW1pdCA9IHBOZXctPmFjdm9fdHhvcGxpbWl0OworCit9CisKK3ZvaWQgY29udmVydF90c3BlYyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgICB0U2lyTWFjVHNwZWNJRSAqcE9sZCwgdERvdDExZklFVFNQRUMgKnBOZXcpCit7CisJcE9sZC0+dHNpbmZvLnRyYWZmaWMudHJhZmZpY1R5cGUgPSAodWludDE2X3QpIHBOZXctPnRyYWZmaWNfdHlwZTsKKwlwT2xkLT50c2luZm8udHJhZmZpYy50c2lkID0gKHVpbnQxNl90KSBwTmV3LT50c2lkOworCXBPbGQtPnRzaW5mby50cmFmZmljLmRpcmVjdGlvbiA9ICh1aW50MTZfdCkgcE5ldy0+ZGlyZWN0aW9uOworCXBPbGQtPnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSA9ICh1aW50MTZfdCkgcE5ldy0+YWNjZXNzX3BvbGljeTsKKwlwT2xkLT50c2luZm8udHJhZmZpYy5hZ2dyZWdhdGlvbiA9ICh1aW50MTZfdCkgcE5ldy0+YWdncmVnYXRpb247CisJcE9sZC0+dHNpbmZvLnRyYWZmaWMucHNiID0gKHVpbnQxNl90KSBwTmV3LT5wc2I7CisJcE9sZC0+dHNpbmZvLnRyYWZmaWMudXNlclByaW8gPSAodWludDE2X3QpIHBOZXctPnVzZXJfcHJpb3JpdHk7CisJcE9sZC0+dHNpbmZvLnRyYWZmaWMuYWNrUG9saWN5ID0gKHVpbnQxNl90KSBwTmV3LT50c2luZm9fYWNrX3BvbDsKKworCXBPbGQtPnRzaW5mby5zY2hlZHVsZS5zY2hlZHVsZSA9ICh1aW50OF90KSBwTmV3LT5zY2hlZHVsZTsKKworCXBPbGQtPm5vbU1zZHVTeiA9IHBOZXctPnNpemU7CisJcE9sZC0+bWF4TXNkdVN6ID0gcE5ldy0+bWF4X21zZHVfc2l6ZTsKKwlwT2xkLT5taW5TdmNJbnRlcnZhbCA9IHBOZXctPm1pbl9zZXJ2aWNlX2ludDsKKwlwT2xkLT5tYXhTdmNJbnRlcnZhbCA9IHBOZXctPm1heF9zZXJ2aWNlX2ludDsKKwlwT2xkLT5pbmFjdEludGVydmFsID0gcE5ldy0+aW5hY3Rpdml0eV9pbnQ7CisJcE9sZC0+c3VzcGVuZEludGVydmFsID0gcE5ldy0+c3VzcGVuc2lvbl9pbnQ7CisJcE9sZC0+c3ZjU3RhcnRUaW1lID0gcE5ldy0+c2VydmljZV9zdGFydF90aW1lOworCXBPbGQtPm1pbkRhdGFSYXRlID0gcE5ldy0+bWluX2RhdGFfcmF0ZTsKKwlwT2xkLT5tZWFuRGF0YVJhdGUgPSBwTmV3LT5tZWFuX2RhdGFfcmF0ZTsKKwlwT2xkLT5wZWFrRGF0YVJhdGUgPSBwTmV3LT5wZWFrX2RhdGFfcmF0ZTsKKwlwT2xkLT5tYXhCdXJzdFN6ID0gcE5ldy0+YnVyc3Rfc2l6ZTsKKwlwT2xkLT5kZWxheUJvdW5kID0gcE5ldy0+ZGVsYXlfYm91bmQ7CisJcE9sZC0+bWluUGh5UmF0ZSA9IHBOZXctPm1pbl9waHlfcmF0ZTsKKwlwT2xkLT5zdXJwbHVzQncgPSBwTmV3LT5zdXJwbHVzX2J3X2FsbG93YW5jZTsKKwlwT2xkLT5tZWRpdW1UaW1lID0gcE5ldy0+bWVkaXVtX3RpbWU7Cit9CisKK3RTaXJSZXRTdGF0dXMgY29udmVydF90Y2xhcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgIHRTaXJUY2xhc0luZm8gKnBPbGQsIHREb3QxMWZJRVRDTEFTICpwTmV3KQoreworCXVpbnQzMl90IGxlbmd0aCA9IDA7CisKKwlpZiAoRE9UMTFGX0ZBSUxFRChkb3QxMWZfZ2V0X3BhY2tlZF9pZXRjbGFzKHBNYWMsIHBOZXcsICZsZW5ndGgpKSkgeworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXBPbGQtPnRjbGFzLnR5cGUgPSBET1QxMUZfRUlEX1RDTEFTOworCXBPbGQtPnRjbGFzLmxlbmd0aCA9ICh1aW50OF90KSBsZW5ndGg7CisJcE9sZC0+dGNsYXMudXNlclByaW8gPSBwTmV3LT51c2VyX3ByaW9yaXR5OworCXBPbGQtPnRjbGFzLmNsYXNzaWZpZXJUeXBlID0gcE5ldy0+Y2xhc3NpZmllcl90eXBlOworCXBPbGQtPnRjbGFzLmNsYXNzaWZpZXJNYXNrID0gcE5ldy0+Y2xhc3NpZmllcl9tYXNrOworCisJc3dpdGNoIChwTmV3LT5jbGFzc2lmaWVyX3R5cGUpIHsKKwljYXNlIDA6CisJCWNkZl9tZW1fY29weShwT2xkLT50Y2xhc1BhcmFtcy5ldGguc3JjQWRkciwKKwkJCSAgICAgcE5ldy0+aW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKwkJY2RmX21lbV9jb3B5KHBPbGQtPnRjbGFzUGFyYW1zLmV0aC5kc3RBZGRyLAorCQkJICAgICBwTmV3LT5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKwkJcE9sZC0+dGNsYXNQYXJhbXMuZXRoLnR5cGUgPSBwTmV3LT5pbmZvLkV0aFBhcmFtcy50eXBlOworCQlicmVhazsKKwljYXNlIDE6CisJCXBPbGQtPnZlcnNpb24gPSBwTmV3LT5pbmZvLklwUGFyYW1zLnZlcnNpb247CisJCWlmICg0ID09IHBOZXctPmluZm8uSXBQYXJhbXMudmVyc2lvbikgeworCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC52ZXJzaW9uID0gNDsKKwkJCWNkZl9tZW1fY29weShwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnNyY0lwQWRkciwKKwkJCQkgICAgIHBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuCisJCQkJICAgICBzb3VyY2UsIDQpOworCQkJY2RmX21lbV9jb3B5KHBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuZHN0SXBBZGRyLAorCQkJCSAgICAgcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LAorCQkJCSAgICAgNCk7CisJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnNyY1BvcnQgPQorCQkJCXBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQ7CisJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LmRzdFBvcnQgPQorCQkJCXBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0OworCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5kc2NwID0KKwkJCQlwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1A7CisJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnByb3RvY29sID0KKwkJCQlwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvOworCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5yc3ZkID0KKwkJCQlwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnJlc2VydmVkOworCQl9IGVsc2UgaWYgKDYgPT0gcE5ldy0+aW5mby5JcFBhcmFtcy52ZXJzaW9uKSB7CisJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LnZlcnNpb24gPSA2OworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuCisJCQkJICAgICBzcmNJcEFkZHIsCisJCQkJICAgICAodWludDhfdCAqKSBwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy4KKwkJCQkgICAgIElwVjZQYXJhbXMuc291cmNlLCAxNik7CisJCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni4KKwkJCQkgICAgIGRzdElwQWRkciwKKwkJCQkgICAgICh1aW50OF90ICopIHBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLgorCQkJCSAgICAgSXBWNlBhcmFtcy5kZXN0LCAxNik7CisJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LnNyY1BvcnQgPQorCQkJCXBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQ7CisJCQlwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LmRzdFBvcnQgPQorCQkJCXBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0OworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuCisJCQkJICAgICBmbG93TGFiZWwsCisJCQkJICAgICAodWludDhfdCAqKSBwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy4KKwkJCQkgICAgIElwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCQl9CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcE9sZC0+dGNsYXNQYXJhbXMudDgwMjFkcS50YWcgPQorCQkJcE5ldy0+aW5mby5QYXJhbXM4MDIxZHEudGFnX3R5cGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordm9pZCBjb252ZXJ0X3dtbXRzcGVjKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgIHRTaXJNYWNUc3BlY0lFICpwT2xkLCB0RG90MTFmSUVXTU1UU1BFQyAqcE5ldykKK3sKKwlwT2xkLT50c2luZm8udHJhZmZpYy50cmFmZmljVHlwZSA9ICh1aW50MTZfdCkgcE5ldy0+dHJhZmZpY190eXBlOworCXBPbGQtPnRzaW5mby50cmFmZmljLnRzaWQgPSAodWludDE2X3QpIHBOZXctPnRzaWQ7CisJcE9sZC0+dHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID0gKHVpbnQxNl90KSBwTmV3LT5kaXJlY3Rpb247CisJcE9sZC0+dHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID0gKHVpbnQxNl90KSBwTmV3LT5hY2Nlc3NfcG9saWN5OworCXBPbGQtPnRzaW5mby50cmFmZmljLmFnZ3JlZ2F0aW9uID0gKHVpbnQxNl90KSBwTmV3LT5hZ2dyZWdhdGlvbjsKKwlwT2xkLT50c2luZm8udHJhZmZpYy5wc2IgPSAodWludDE2X3QpIHBOZXctPnBzYjsKKwlwT2xkLT50c2luZm8udHJhZmZpYy51c2VyUHJpbyA9ICh1aW50MTZfdCkgcE5ldy0+dXNlcl9wcmlvcml0eTsKKwlwT2xkLT50c2luZm8udHJhZmZpYy5hY2tQb2xpY3kgPSAodWludDE2X3QpIHBOZXctPnRzaW5mb19hY2tfcG9sOworCXBPbGQtPm5vbU1zZHVTeiA9IChwTmV3LT5maXhlZCA8PCAxNSkgfCBwTmV3LT5zaXplOworCXBPbGQtPm1heE1zZHVTeiA9IHBOZXctPm1heF9tc2R1X3NpemU7CisJcE9sZC0+bWluU3ZjSW50ZXJ2YWwgPSBwTmV3LT5taW5fc2VydmljZV9pbnQ7CisJcE9sZC0+bWF4U3ZjSW50ZXJ2YWwgPSBwTmV3LT5tYXhfc2VydmljZV9pbnQ7CisJcE9sZC0+aW5hY3RJbnRlcnZhbCA9IHBOZXctPmluYWN0aXZpdHlfaW50OworCXBPbGQtPnN1c3BlbmRJbnRlcnZhbCA9IHBOZXctPnN1c3BlbnNpb25faW50OworCXBPbGQtPnN2Y1N0YXJ0VGltZSA9IHBOZXctPnNlcnZpY2Vfc3RhcnRfdGltZTsKKwlwT2xkLT5taW5EYXRhUmF0ZSA9IHBOZXctPm1pbl9kYXRhX3JhdGU7CisJcE9sZC0+bWVhbkRhdGFSYXRlID0gcE5ldy0+bWVhbl9kYXRhX3JhdGU7CisJcE9sZC0+cGVha0RhdGFSYXRlID0gcE5ldy0+cGVha19kYXRhX3JhdGU7CisJcE9sZC0+bWF4QnVyc3RTeiA9IHBOZXctPmJ1cnN0X3NpemU7CisJcE9sZC0+ZGVsYXlCb3VuZCA9IHBOZXctPmRlbGF5X2JvdW5kOworCXBPbGQtPm1pblBoeVJhdGUgPSBwTmV3LT5taW5fcGh5X3JhdGU7CisJcE9sZC0+c3VycGx1c0J3ID0gcE5ldy0+c3VycGx1c19id19hbGxvd2FuY2U7CisJcE9sZC0+bWVkaXVtVGltZSA9IHBOZXctPm1lZGl1bV90aW1lOworfQorCit0U2lyUmV0U3RhdHVzIGNvbnZlcnRfd21tdGNsYXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgICB0U2lyVGNsYXNJbmZvICpwT2xkLCB0RG90MTFmSUVXTU1UQ0xBUyAqcE5ldykKK3sKKwl1aW50MzJfdCBsZW5ndGggPSAwOworCisJaWYgKERPVDExRl9GQUlMRUQoZG90MTFmX2dldF9wYWNrZWRfaWV3bW10Y2xhcyhwTWFjLCBwTmV3LCAmbGVuZ3RoKSkpIHsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlwT2xkLT50Y2xhcy50eXBlID0gRE9UMTFGX0VJRF9XTU1UQ0xBUzsKKwlwT2xkLT50Y2xhcy5sZW5ndGggPSAodWludDhfdCkgbGVuZ3RoOworCXBPbGQtPnRjbGFzLnVzZXJQcmlvID0gcE5ldy0+dXNlcl9wcmlvcml0eTsKKwlwT2xkLT50Y2xhcy5jbGFzc2lmaWVyVHlwZSA9IHBOZXctPmNsYXNzaWZpZXJfdHlwZTsKKwlwT2xkLT50Y2xhcy5jbGFzc2lmaWVyTWFzayA9IHBOZXctPmNsYXNzaWZpZXJfbWFzazsKKworCXN3aXRjaCAocE5ldy0+Y2xhc3NpZmllcl90eXBlKSB7CisJY2FzZSAwOgorCQljZGZfbWVtX2NvcHkocE9sZC0+dGNsYXNQYXJhbXMuZXRoLnNyY0FkZHIsCisJCQkgICAgIHBOZXctPmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgNik7CisJCWNkZl9tZW1fY29weShwT2xkLT50Y2xhc1BhcmFtcy5ldGguZHN0QWRkciwKKwkJCSAgICAgcE5ldy0+aW5mby5FdGhQYXJhbXMuZGVzdCwgNik7CisJCXBPbGQtPnRjbGFzUGFyYW1zLmV0aC50eXBlID0gcE5ldy0+aW5mby5FdGhQYXJhbXMudHlwZTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwT2xkLT52ZXJzaW9uID0gcE5ldy0+aW5mby5JcFBhcmFtcy52ZXJzaW9uOworCQlpZiAoNCA9PSBwTmV3LT5pbmZvLklwUGFyYW1zLnZlcnNpb24pIHsKKwkJCXBPbGQtPnRjbGFzUGFyYW1zLmlwdjQudmVyc2lvbiA9IDQ7CisJCQljZGZfbWVtX2NvcHkocE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5zcmNJcEFkZHIsCisJCQkJICAgICBwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLgorCQkJCSAgICAgc291cmNlLCA0KTsKKwkJCWNkZl9tZW1fY29weShwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LmRzdElwQWRkciwKKwkJCQkgICAgIHBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwKKwkJCQkgICAgIDQpOworCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5zcmNQb3J0ID0KKwkJCQlwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0OworCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5kc3RQb3J0ID0KKwkJCQlwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydDsKKwkJCXBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuZHNjcCA9CisJCQkJcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQOworCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5wcm90b2NvbCA9CisJCQkJcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bzsKKwkJCXBPbGQtPnRjbGFzUGFyYW1zLmlwdjQucnN2ZCA9CisJCQkJcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZDsKKwkJfSBlbHNlIGlmICg2ID09IHBOZXctPmluZm8uSXBQYXJhbXMudmVyc2lvbikgeworCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni52ZXJzaW9uID0gNjsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LgorCQkJCSAgICAgc3JjSXBBZGRyLAorCQkJCSAgICAgKHVpbnQ4X3QgKikgcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuCisJCQkJICAgICBJcFY2UGFyYW1zLnNvdXJjZSwgMTYpOworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuCisJCQkJICAgICBkc3RJcEFkZHIsCisJCQkJICAgICAodWludDhfdCAqKSBwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy4KKwkJCQkgICAgIElwVjZQYXJhbXMuZGVzdCwgMTYpOworCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni5zcmNQb3J0ID0KKwkJCQlwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0OworCQkJcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni5kc3RQb3J0ID0KKwkJCQlwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydDsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LgorCQkJCSAgICAgZmxvd0xhYmVsLAorCQkJCSAgICAgKHVpbnQ4X3QgKikgcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuCisJCQkJICAgICBJcFY2UGFyYW1zLmZsb3dfbGFiZWwsIDMpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwkJfQorCQlicmVhazsKKwljYXNlIDI6CisJCXBPbGQtPnRjbGFzUGFyYW1zLnQ4MDIxZHEudGFnID0KKwkJCXBOZXctPmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0KKworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3ZvaWQgY29udmVydF90c19kZWxheSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgICAgICB0U2lyTWFjVHNEZWxheUlFICpwT2xkLCB0RG90MTFmSUVUU0RlbGF5ICpwTmV3KQoreworCXBPbGQtPnR5cGUgPSBET1QxMUZfRUlEX1RTREVMQVk7CisJcE9sZC0+bGVuZ3RoID0gNFU7CisJcE9sZC0+ZGVsYXkgPSBwTmV3LT5kZWxheTsKK30KKwordm9pZCBjb252ZXJ0X3NjaGVkdWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgIHRTaXJNYWNTY2hlZHVsZUlFICpwT2xkLCB0RG90MTFmSUVTY2hlZHVsZSAqcE5ldykKK3sKKwlwT2xkLT50eXBlID0gRE9UMTFGX0VJRF9TQ0hFRFVMRTsKKwlwT2xkLT5sZW5ndGggPSBET1QxMUZfSUVfU0NIRURVTEVfTUlOX0xFTjsKKworCXBPbGQtPmluZm8uYWdncmVnYXRpb24gPSBwTmV3LT5hZ2dyZWdhdGlvbjsKKwlwT2xkLT5pbmZvLnRzaWQgPSBwTmV3LT50c2lkOworCXBPbGQtPmluZm8uZGlyZWN0aW9uID0gcE5ldy0+ZGlyZWN0aW9uOworCisJcE9sZC0+c3ZjU3RhcnRUaW1lID0gcE5ldy0+c2VydmljZV9zdGFydF90aW1lOworCXBPbGQtPnN2Y0ludGVydmFsID0gcE5ldy0+c2VydmljZV9pbnRlcnZhbDsKKwlwT2xkLT5zcGVjSW50ZXJ2YWwgPSBwTmV3LT5zcGVjX2ludGVydmFsOworfQorCit2b2lkIGNvbnZlcnRfd21tX3NjaGVkdWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgIHRTaXJNYWNTY2hlZHVsZUlFICpwT2xkLCB0RG90MTFmSUVXTU1TY2hlZHVsZSAqcE5ldykKK3sKKwlwT2xkLT50eXBlID0gRE9UMTFGX0VJRF9XTU1TQ0hFRFVMRTsKKwlwT2xkLT5sZW5ndGggPSBET1QxMUZfSUVfV01NU0NIRURVTEVfTUlOX0xFTjsKKworCXBPbGQtPmluZm8uYWdncmVnYXRpb24gPSBwTmV3LT5hZ2dyZWdhdGlvbjsKKwlwT2xkLT5pbmZvLnRzaWQgPSBwTmV3LT50c2lkOworCXBPbGQtPmluZm8uZGlyZWN0aW9uID0gcE5ldy0+ZGlyZWN0aW9uOworCisJcE9sZC0+c3ZjU3RhcnRUaW1lID0gcE5ldy0+c2VydmljZV9zdGFydF90aW1lOworCXBPbGQtPnN2Y0ludGVydmFsID0gcE5ldy0+c2VydmljZV9pbnRlcnZhbDsKKwlwT2xkLT5zcGVjSW50ZXJ2YWwgPSBwTmV3LT5zcGVjX2ludGVydmFsOworfQorCisvKioKKyAgICBAYnJpZWYgICA6ICAgIFRoaXMgZnVuY3Rpb25zIGNvbnZlcnRzIHRoZSBnaXZlbiBidWZmZXIgdGlsbCBnaXZlbiBzaXplIHRvIEJpZyBlbmRpYW4gZm9ybWF0IGFzc3VtaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgYnVzIGlzIDMyIGJpdC4gVGhlIHNpemUgc2hvdWxkIGJlIGZvdXIgYnl0ZSBhbGlnbmVkLgorICAgIEBwYXJhbSA6ICAgIHB0ciB0byBiZSBjb252ZXJ0ZWQsIHNpemUKKyAgICBAcmV0dXJuICA6ICAgIHZvaWQKKyAqLworCit2b2lkIGNvbnZlcnR0b19iaWdfZW5kaWFuKHZvaWQgKnB0ciwgdWludDE2X3Qgc2l6ZSkKK3sKKwl1aW50OF90ICp0ZW1wX3B0cjsKKwl1aW50MzJfdCAqZGVzdF9wdHI7CisKKwlkZXN0X3B0ciA9ICh1aW50MzJfdCAqKSBwdHI7CisJd2hpbGUgKHNpemUpIHsKKwkJdGVtcF9wdHIgPSAodWludDhfdCAqKSBkZXN0X3B0cjsKKwkJKmRlc3RfcHRyID0KKwkJCSh0ZW1wX3B0clswXSA8PCAyNCkgfCAodGVtcF9wdHJbMV0gPDwgMTYpIHwgKHRlbXBfcHRyWzJdIDw8CisJCQkJCQkJCSAgICAgOCkgfAorCQkJdGVtcF9wdHJbM107CisJCWRlc3RfcHRyKys7CisJCXNpemUgLT0gNDsKKwl9Cit9CisKK3ZvaWQgY3JlYXRlX3NjYW5fZGF0YV9udWxsX2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNNZ210SGRyICptYWNNZ210SGRyLAorCQkJCSB1aW50OF90IHB3ck1nbXQsIHRTaXJNYWNBZGRyIGJzc2lkLAorCQkJCSB0U2lyTWFjQWRkciBzZWxmTWFjQWRkcikKK3sKKworCW1hY01nbXRIZHItPmZjLnR5cGUgPSBTSVJfTUFDX0RBVEFfRlJBTUU7CisJbWFjTWdtdEhkci0+ZmMuc3ViVHlwZSA9IFNJUl9NQUNfREFUQV9OVUxMOworCW1hY01nbXRIZHItPmZjLnByb3RWZXIgPSBTSVJfTUFDX1BST1RPQ09MX1ZFUlNJT047CisJbWFjTWdtdEhkci0+ZmMub3JkZXIgPSAwOworCW1hY01nbXRIZHItPmZjLndlcCA9IDA7CisJbWFjTWdtdEhkci0+ZmMubW9yZURhdGEgPSAwOworCW1hY01nbXRIZHItPmZjLnBvd2VyTWdtdCA9IHB3ck1nbXQ7CisJbWFjTWdtdEhkci0+ZmMucmV0cnkgPSAwOworCW1hY01nbXRIZHItPmZjLm1vcmVGcmFnID0gMDsKKwltYWNNZ210SGRyLT5mYy5mcm9tRFMgPSAwOworCW1hY01nbXRIZHItPmZjLnRvRFMgPSAwOworCW1hY01nbXRIZHItPmR1cmF0aW9uTG8gPQorCQkodWludDhfdCkgKFNJUl9NQUNfTUFYX0RVUkFUSU9OX01JQ1JPX1NFQ09ORFMgJiAweGZmKTsKKwltYWNNZ210SGRyLT5kdXJhdGlvbkhpID0KKwkJKHVpbnQ4X3QpICgoU0lSX01BQ19NQVhfRFVSQVRJT05fTUlDUk9fU0VDT05EUyAmIDB4ZmYwMCkgPj4gOCk7CisJbWFjTWdtdEhkci0+c2VxQ29udHJvbC5mcmFnTnVtID0gMDsKKwltYWNNZ210SGRyLT5zZXFDb250cm9sLnNlcU51bUxvID0gMDsKKwltYWNNZ210SGRyLT5zZXFDb250cm9sLnNlcU51bUhpID0gMjsKKwljZGZfbWVtX2NvcHkoKHZvaWQgKikmbWFjTWdtdEhkci0+ZGEsCisJCSAgICAgKHZvaWQgKilic3NpZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJY2RmX21lbV9jb3B5KCh2b2lkICopJm1hY01nbXRIZHItPnNhLAorCQkgICAgICh2b2lkICopc2VsZk1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCWNkZl9tZW1fY29weSgodm9pZCAqKSZtYWNNZ210SGRyLT5ic3NJZCwKKwkJICAgICAodm9pZCAqKWJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCXJldHVybjsKK30KKwordm9pZCBjcmVhdGVfc2Nhbl9jdHNfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY01nbXRIZHIgKm1hY01nbXRIZHIsCisJCQkgICB0U2lyTWFjQWRkciBzZWxmTWFjKQoreworCW1hY01nbXRIZHItPmZjLnR5cGUgPSBTSVJfTUFDX0NUUkxfRlJBTUU7CisJbWFjTWdtdEhkci0+ZmMuc3ViVHlwZSA9IFNJUl9NQUNfQ1RSTF9DVFM7CisJbWFjTWdtdEhkci0+ZmMub3JkZXIgPSAwOworCW1hY01nbXRIZHItPmZjLndlcCA9IDA7CisJbWFjTWdtdEhkci0+ZmMubW9yZURhdGEgPSAwOworCW1hY01nbXRIZHItPmZjLnBvd2VyTWdtdCA9IDA7CisJbWFjTWdtdEhkci0+ZmMucmV0cnkgPSAwOworCW1hY01nbXRIZHItPmZjLm1vcmVGcmFnID0gMDsKKwltYWNNZ210SGRyLT5mYy5mcm9tRFMgPSAwOworCW1hY01nbXRIZHItPmZjLnRvRFMgPSAwOworCW1hY01nbXRIZHItPmR1cmF0aW9uTG8gPQorCQkodWludDhfdCkgKFNJUl9NQUNfTUFYX0RVUkFUSU9OX01JQ1JPX1NFQ09ORFMgJiAweGZmKTsKKwltYWNNZ210SGRyLT5kdXJhdGlvbkhpID0KKwkJKHVpbnQ4X3QpICgoU0lSX01BQ19NQVhfRFVSQVRJT05fTUlDUk9fU0VDT05EUyAmIDB4ZmYwMCkgPj4gOCk7CisJY2RmX21lbV9jb3B5KCh2b2lkICopbWFjTWdtdEhkci0+ZGEsICh2b2lkICopc2VsZk1hYywKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCXJldHVybjsKK30KKwordm9pZCBjb252ZXJ0X3Fvc19tYXBzZXRfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclFvc01hcFNldCAqUW9zLAorCQkJICAgICAgdERvdDExZklFUW9zTWFwU2V0ICpkb3QxMWZJRSkKK3sKKwl1aW50OF90IGksIGogPSAwOworCVFvcy0+bnVtX2RzY3BfZXhjZXB0aW9ucyA9IChkb3QxMWZJRS0+bnVtX2RzY3BfZXhjZXB0aW9ucyAtIDE2KSAvIDI7CisJZm9yIChpID0gMDsgaSA8IFFvcy0+bnVtX2RzY3BfZXhjZXB0aW9uczsgaSsrKSB7CisJCVFvcy0+ZHNjcF9leGNlcHRpb25zW2ldWzBdID0gZG90MTFmSUUtPmRzY3BfZXhjZXB0aW9uc1tqXTsKKwkJaisrOworCQlRb3MtPmRzY3BfZXhjZXB0aW9uc1tpXVsxXSA9IGRvdDExZklFLT5kc2NwX2V4Y2VwdGlvbnNbal07CisJCWorKzsKKwl9CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlRb3MtPmRzY3BfcmFuZ2VbaV1bMF0gPSBkb3QxMWZJRS0+ZHNjcF9leGNlcHRpb25zW2pdOworCQlqKys7CisJCVFvcy0+ZHNjcF9yYW5nZVtpXVsxXSA9IGRvdDExZklFLT5kc2NwX2V4Y2VwdGlvbnNbal07CisJCWorKzsKKwl9Cit9CisKKy8qKgorICAgIEBicmllZiAgICA6ICAgIFRoaXMgZnVuY3Rpb25zIGNyZWF0ZXMgYSBEQVRBX05VTEwvQ1RTMlNFTEYgZnJhbWUgaW4gQmlnIGVuZGlhbiBmb3JtYXQKKyAgICBAcGFyYW0gICAgOiAgICBHbG9iYWwgTUFDIHN0cnVjdHVyZSwgcG9pbnRlciB0byByZXR1cm4gdGhlIGNyZWF0ZWQgcGFja2V0LCByb2xlIHdoaWNoIGlzIFN0YXRpb24vQVAKKyAgICBAcmV0dXJuICAgIDogICAgdm9pZAorICovCisKK3ZvaWQgY3JlYXRlX2luaXRfc2Nhbl9yYXdfZnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY01nbXRIZHIgKm1hY01nbXRIZHIsCisJCQkJdEJzc1N5c3RlbVJvbGUgcm9sZSkKK3sKKyNpZiAwCisJdHBTdGFTdHJ1Y3QgcFN0YSA9ICh0cFN0YVN0cnVjdCkgcE1hYy0+aGFsLmhhbE1hYy5zdGFUYWJsZTsKKworCWlmIChyb2xlID09IGVTWVNURU1fU1RBX1JPTEUpIHsKKwkJbWFjTWdtdEhkci0+ZmMudHlwZSA9IFNJUl9NQUNfREFUQV9GUkFNRTsKKwkJbWFjTWdtdEhkci0+ZmMuc3ViVHlwZSA9IFNJUl9NQUNfREFUQV9OVUxMOworCQltYWNNZ210SGRyLT5mYy5wcm90VmVyID0gU0lSX01BQ19QUk9UT0NPTF9WRVJTSU9OOworCQltYWNNZ210SGRyLT5mYy5vcmRlciA9IDA7CisJCW1hY01nbXRIZHItPmZjLndlcCA9IDA7CisJCW1hY01nbXRIZHItPmZjLm1vcmVEYXRhID0gMDsKKwkJbWFjTWdtdEhkci0+ZmMucG93ZXJNZ210ID0gMTsgICAvKiBOZWVkZWQgZm9yIHN0YXRpb24gKi8KKwkJbWFjTWdtdEhkci0+ZmMucmV0cnkgPSAwOworCQltYWNNZ210SGRyLT5mYy5tb3JlRnJhZyA9IDA7CisJCW1hY01nbXRIZHItPmZjLmZyb21EUyA9IDA7CisJCW1hY01nbXRIZHItPmZjLnRvRFMgPSAxOworCQltYWNNZ210SGRyLT5kdXJhdGlvbkxvID0KKwkJCSh1aW50OF90KSAoU0lSX01BQ19NQVhfRFVSQVRJT05fTUlDUk9fU0VDT05EUyAmIDB4ZmYpOworCQltYWNNZ210SGRyLT5kdXJhdGlvbkhpID0KKwkJCSh1aW50OF90KSAoKFNJUl9NQUNfTUFYX0RVUkFUSU9OX01JQ1JPX1NFQ09ORFMgJiAweGZmMDApID4+CisJCQkJICAgOCk7CisJCW1hY01nbXRIZHItPnNlcUNvbnRyb2wuZnJhZ051bSA9IDA7CisJCW1hY01nbXRIZHItPnNlcUNvbnRyb2wuc2VxTnVtTG8gPSAwOworCQltYWNNZ210SGRyLT5zZXFDb250cm9sLnNlcU51bUhpID0gMjsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJm1hY01nbXRIZHItPmRhLCAodm9pZCAqKXBTdGFbMF0uYnNzSWQsIDYpOworCQljZGZfbWVtX2NvcHkoJm1hY01nbXRIZHItPnNhLCBwU3RhWzBdLnN0YUFkZHIsIDYpOworCQljZGZfbWVtX2NvcHkoKHZvaWQgKikmbWFjTWdtdEhkci0+YnNzSWQsICh2b2lkICopcFN0YVswXS5ic3NJZCwKKwkJCSAgICAgNik7CisJfSBlbHNlIGlmIChyb2xlID09IGVTWVNURU1fQVBfUk9MRSB8fCByb2xlID09IGVTWVNURU1fU1RBX0lOX0lCU1NfUk9MRSkgeworCQltYWNNZ210SGRyLT5mYy50eXBlID0gU0lSX01BQ19DVFJMX0ZSQU1FOworCQltYWNNZ210SGRyLT5mYy5zdWJUeXBlID0gU0lSX01BQ19DVFJMX0NUUzsKKwkJbWFjTWdtdEhkci0+ZmMub3JkZXIgPSAwOworCQltYWNNZ210SGRyLT5mYy53ZXAgPSAwOworCQltYWNNZ210SGRyLT5mYy5tb3JlRGF0YSA9IDA7CisJCW1hY01nbXRIZHItPmZjLnBvd2VyTWdtdCA9IDA7ICAgLyogTmVlZGVkIGZvciBzdGF0aW9uICovCisJCW1hY01nbXRIZHItPmZjLnJldHJ5ID0gMDsKKwkJbWFjTWdtdEhkci0+ZmMubW9yZUZyYWcgPSAwOworCQltYWNNZ210SGRyLT5mYy5mcm9tRFMgPSAwOworCQltYWNNZ210SGRyLT5mYy50b0RTID0gMDsKKwkJbWFjTWdtdEhkci0+ZHVyYXRpb25MbyA9CisJCQkodWludDhfdCkgKFNJUl9NQUNfTUFYX0RVUkFUSU9OX01JQ1JPX1NFQ09ORFMgJiAweGZmKTsKKwkJbWFjTWdtdEhkci0+ZHVyYXRpb25IaSA9CisJCQkodWludDhfdCkgKChTSVJfTUFDX01BWF9EVVJBVElPTl9NSUNST19TRUNPTkRTICYgMHhmZjAwKSA+PgorCQkJCSAgIDgpOworCQljZGZfbWVtX2NvcHkoKHZvaWQgKiltYWNNZ210SGRyLT5kYSwgKHZvaWQgKilwU3RhWzBdLnN0YUFkZHIsCisJCQkgICAgIDYpOworCX0KKwlyZXR1cm47CisjZW5kaWYKK30KKworLyoqCisgICAgQGJyaWVmICAgIDogICAgVGhpcyBmdW5jdGlvbnMgY3JlYXRlcyBhIERBVEFfTlVMTCBmcmFtZSBpbiBCaWcgZW5kaWFuIGZvcm1hdAorICAgIEBwYXJhbSAgICA6ICAgIEdsb2JhbCBNQUMgc3RydWN0dXJlLCBwb2ludGVyIHRvIHJldHVybiB0aGUgY3JlYXRlZCBwYWNrZXQsIHJvbGUgd2hpY2ggaXMgU3RhdGlvbi9BUAorICAgIEByZXR1cm4gICAgOiAgICB2b2lkCisgKi8KKwordm9pZCBjcmVhdGVfZmluaXNoX3NjYW5fcmF3X2ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNNZ210SGRyICptYWNNZ210SGRyLAorCQkJCSAgdEJzc1N5c3RlbVJvbGUgcm9sZSkKK3sKKyNpZiAwCisJdHBTdGFTdHJ1Y3QgcFN0YSA9ICh0cFN0YVN0cnVjdCkgcE1hYy0+aGFsLmhhbE1hYy5zdGFUYWJsZTsKKworCWlmIChyb2xlID09IGVTWVNURU1fU1RBX1JPTEUpIHsKKwkJbWFjTWdtdEhkci0+ZmMudHlwZSA9IFNJUl9NQUNfREFUQV9GUkFNRTsKKwkJbWFjTWdtdEhkci0+ZmMuc3ViVHlwZSA9IFNJUl9NQUNfREFUQV9OVUxMOworCQltYWNNZ210SGRyLT5mYy5wcm90VmVyID0gU0lSX01BQ19QUk9UT0NPTF9WRVJTSU9OOworCQltYWNNZ210SGRyLT5mYy5vcmRlciA9IDA7CisJCW1hY01nbXRIZHItPmZjLndlcCA9IDA7CisJCW1hY01nbXRIZHItPmZjLm1vcmVEYXRhID0gMDsKKwkJbWFjTWdtdEhkci0+ZmMucG93ZXJNZ210ID0gMDsgICAvKiBOZWVkZWQgZm9yIHN0YXRpb24gKi8KKwkJbWFjTWdtdEhkci0+ZmMucmV0cnkgPSAwOworCQltYWNNZ210SGRyLT5mYy5tb3JlRnJhZyA9IDA7CisJCW1hY01nbXRIZHItPmZjLmZyb21EUyA9IDA7CisJCW1hY01nbXRIZHItPmZjLnRvRFMgPSAxOworCQltYWNNZ210SGRyLT5kdXJhdGlvbkxvID0KKwkJCSh1aW50OF90KSAoU0lSX01BQ19NQVhfRFVSQVRJT05fTUlDUk9fU0VDT05EUyAmIDB4ZmYpOworCQltYWNNZ210SGRyLT5kdXJhdGlvbkhpID0KKwkJCSh1aW50OF90KSAoKFNJUl9NQUNfTUFYX0RVUkFUSU9OX01JQ1JPX1NFQ09ORFMgJiAweGZmMDApID4+CisJCQkJICAgOCk7CisJCW1hY01nbXRIZHItPnNlcUNvbnRyb2wuZnJhZ051bSA9IDA7CisJCW1hY01nbXRIZHItPnNlcUNvbnRyb2wuc2VxTnVtTG8gPSAwOworCQltYWNNZ210SGRyLT5zZXFDb250cm9sLnNlcU51bUhpID0gMjsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopbWFjTWdtdEhkci0+ZGEsICh2b2lkICopcFN0YVswXS5ic3NJZCwgNik7CisJCWNkZl9tZW1fY29weShtYWNNZ210SGRyLT5zYSwgcFN0YVswXS5zdGFBZGRyLCA2KTsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopbWFjTWdtdEhkci0+YnNzSWQsICh2b2lkICopcFN0YVswXS5ic3NJZCwKKwkJCSAgICAgNik7CisKKwl9CisKKwlyZXR1cm47CisjZW5kaWYKK30KKworLyogdXRpbHNfcGFyc2VyLmMgZW5kcyBoZXJlLiAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zYXAvZGZzL2luYy9hdGhfZGZzX3N0cnVjdHMuaCBiL2NvcmUvc2FwL2Rmcy9pbmMvYXRoX2Rmc19zdHJ1Y3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzZThmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2FwL2Rmcy9pbmMvYXRoX2Rmc19zdHJ1Y3RzLmgKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJCWF0aF9kZnNfc3RydWN0cy5oCisKKyAgIE9WRVJWSUVXOgorCisgICBTb3VyY2UgY29kZSBib3Jyb3dlZCBmcm9tIFFDQV9NQUlOIERGUyBtb2R1bGUKKworICAgREVQRU5ERU5DSUVTOgorCisgICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkJRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKyAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworICAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CisgICAtLS0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZuZGVmIF9ERlNfX1NUUlVDVFNfSF8KKyNkZWZpbmUgX0RGU19fU1RSVUNUU19IXworI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4KKworI2lmZGVmIEFORFJPSUQKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNlbmRpZgorCisvKgorICogRm9yIHRoZSBkZnNfbm9sX2NsaXN0X3VwZGF0ZSgpIG1ldGhvZCAtIHRoaXMgaXMgdGhlCisgKiB1cGRhdGUgY29tbWFuZC4KKyAqLworZW51bSB7CisJREZTX05PTF9DTElTVF9DTURfTk9ORSA9IDB4MCwKKwlERlNfTk9MX0NMSVNUX0NNRF9VUERBVEUgPSAweDEsCit9OworCitzdHJ1Y3QgYXRoX2Rmc19jYXBzIHsKKwl1aW50MzJfdCBhdGhfZGZzX2V4dF9jaGFuX29rOjEsCisJCSAvKiBDYW4gcmFkYXIgYmUgZGV0ZWN0ZWQgb24gdGhlIGV4dGVuc2lvbiBjaGFuPyAqLworCQkgYXRoX2Rmc19jb21iaW5lZF9yc3NpX29rOjEsCisJCSAvKiBDYW4gdXNlIGNvbWJpbmVkIHJhZGFyIFJTU0k/CisJCSAgKiB0aGUgZm9sbG93aW5nIGZsYWcgaXMgdXNlZCB0byBpbmRpY2F0ZSBpZiByYWRhciBkZXRlY3Rpb24KKwkJICAqIHNjaGVtZSBzaG91bGQgdXNlIGVuaGFuY2VkIGNoaXJwaW5nIGRldGVjdGlvbiBhbGdvcml0aG0uCisJCSAgKiBUaGlzIGZsYWcgYWxzbyBkZXRlcm1pbmVzIGlmIGNlcnRhaW4gcmFkYXIgZGF0YSBzaG91bGQgYmUKKwkJICAqIGRpc2NhcmRlZCB0byBtaW5pbWl6ZSBmYWxzZSBkZXRlY3Rpb24gb2YgcmFkYXIuCisJCSAgKi8KKwkJIGF0aF9kZnNfdXNlX2VuaGFuY2VtZW50OjEsCisJCSBhdGhfc3Ryb25nX3NpZ25hbF9kaXZlcnNpcnk6MSwKKwkJIGF0aF9jaGlwX2lzX2JiX3RsdjoxOworCisJLyoKKwkgKiBnb2VzIHdpdGggYXRoX3N0cm9uZ19zaWduYWxfZGl2ZXJzaXJ5OgorCSAqIElmIHdlIGhhdmUgZmFzdCBkaXZlcnNpdHkgY2FwYWJpbGl0eSwgcmVhZCBvZmYKKwkgKiBTdHJvbmcgU2lnbmFsIGZhc3QgZGl2ZXJzaXR5IGNvdW50IHNldCBpbiB0aGUgaW5pCisJICogZmlsZSwgYW5kIHN0b3JlIHNvIHdlIGNhbiByZXN0b3JlIHRoZSB2YWx1ZSB3aGVuCisJICogcmFkYXIgaXMgZGlzYWJsZWQKKwkgKi8KKwl1aW50MzJfdCBhdGhfZmFzdGRpdl92YWw7Cit9OworCisvKgorICogVGhlc2UgYXJlIGRlZmluZWQgaW4gdGhlIEhBTCBmb3Igbm93LCBhbmQgbXVzdCBiZSBtaWdyYXRlZCBvdXRzaWRlCisgKiBvZiB0aGVyZSBpbiBvcmRlciB0byBiZSB1c2VkIGJ5IHRoZSBuZXcgcGFydGlhbCBvZmZsb2FkIGRhdGEgcGF0aC4KKyAqLworCitzdHJ1Y3QgZGZzX3B1bHNlIHsKKwl1aW50MzJfdCBycF9udW1wdWxzZXM7ICAvKiBOdW0gb2YgcHVsc2VzIGluIHJhZGFyIGJ1cnN0ICovCisJdWludDMyX3QgcnBfcHVsc2VkdXI7ICAgLyogRHVyYXRpb24gb2YgZWFjaCBwdWxzZSBpbiB1c2VjcyAqLworCXVpbnQzMl90IHJwX3B1bHNlZnJlcTsgIC8qIEZyZXF1ZW5jeSBvZiBwdWxzZXMgaW4gYnVyc3QgKi8KKwl1aW50MzJfdCBycF9tYXhfcHVsc2VmcmVxOyAgICAgIC8qIEZyZXF1ZW5jeSBvZiBwdWxzZXMgaW4gYnVyc3QgKi8KKwl1aW50MzJfdCBycF9wYXR0ZXJudHlwZTsgICAgICAgIC8qIGZpeGVkIG9yIHZhcmlhYmxlIHBhdHRlcm4gdHlwZSAqLworCXVpbnQzMl90IHJwX3B1bHNldmFyOyAgIC8qIFRpbWUgdmFyaWF0aW9uIG9mIHB1bHNlIGR1cmF0aW9uIGZvcgorCQkJCSAgIG1hdGNoZWQgZmlsdGVyIChzaW5nbGUtc2lkZWQpIGluIHVzZWNzICovCisJdWludDMyX3QgcnBfdGhyZXNob2xkOyAgLyogVGhyZXNob2xkIGZvciBNRiBvdXRwdXQgdG8gaW5kaWNhdGVDCisJCQkJICAgcmFkYXIgbWF0Y2ggKi8KKwl1aW50MzJfdCBycF9taW5kdXI7ICAgICAvKiBNaW4gcHVsc2UgZHVyYXRpb24gdG8gYmUgY29uc2lkZXJlZCBmb3IKKwkJCQkgICB0aGlzIHB1bHNlIHR5cGUgKi8KKwl1aW50MzJfdCBycF9tYXhkdXI7ICAgICAvKiBNYXggcHVzbGUgZHVyYXRpb24gdG8gYmUgY29uc2lkZXJlZCBmb3IKKwkJCQkgICB0aGlzIHB1bHNlIHR5cGUgKi8KKwl1aW50MzJfdCBycF9yc3NpdGhyZXNoOyAvKiBNaW4gcnNzaSB0byBiZSBjb25zaWRlcmVkIGEgcmFkYXIgcHVsc2UgKi8KKwl1aW50MzJfdCBycF9tZWFub2Zmc2V0OyAvKiBPZmZzZXQgZm9yIHRpbWluZyBhZGp1c3RtZW50ICovCisJaW50MzJfdCBycF9yc3NpbWFyZ2luOyAgLyogcnNzaSB0aHJlc2hvbGQgbWFyZ2luLiBJbiBUdXJibyBNb2RlIEhXCisJCQkJICogcmVwb3J0cyByc3NpIDNkQm0gbG93ZXIgdGhhbiBpbiBub24gVFVSQk8KKwkJCQkgKiBtb2RlLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBvZmZzZXQgdGhhdAorCQkJCSAqIGRpZmYuCisJCQkJICovCisJdWludDMyX3QgcnBfaWdub3JlX3ByaV93aW5kb3c7CisJdWludDMyX3QgcnBfcHVsc2VpZDsgICAgLyogVW5pcXVlIElEIGZvciBpZGVudGlmeWluZyBmaWx0ZXIgKi8KK307CisKK3N0cnVjdCBkZnNfc3RhZ2dlcmVkX3B1bHNlIHsKKwl1aW50MzJfdCBycF9udW1wdWxzZXM7ICAvKiBOdW0gb2YgcHVsc2VzIGluIHJhZGFyIGJ1cnN0ICovCisJdWludDMyX3QgcnBfcHVsc2VkdXI7ICAgLyogRHVyYXRpb24gb2YgZWFjaCBwdWxzZSBpbiB1c2VjcyAqLworCXVpbnQzMl90IHJwX21pbl9wdWxzZWZyZXE7ICAgICAgLyogRnJlcXVlbmN5IG9mIHB1bHNlcyBpbiBidXJzdCAqLworCXVpbnQzMl90IHJwX21heF9wdWxzZWZyZXE7ICAgICAgLyogRnJlcXVlbmN5IG9mIHB1bHNlcyBpbiBidXJzdCAqLworCXVpbnQzMl90IHJwX3BhdHRlcm50eXBlOyAgICAgICAgLyogZml4ZWQgb3IgdmFyaWFibGUgcGF0dGVybiB0eXBlICovCisJdWludDMyX3QgcnBfcHVsc2V2YXI7ICAgLyogVGltZSB2YXJpYXRpb24gb2YgcHVsc2UgZHVyYXRpb24gZm9yCisJCQkJICAgbWF0Y2hlZCBmaWx0ZXIgKHNpbmdsZS1zaWRlZCkgaW4gdXNlY3MgKi8KKwl1aW50MzJfdCBycF90aHJlc2hvbGQ7ICAvKiBUaGVyc2hvbGQgZm9yIE1GIG91dHB1dCB0byBpbmRpY2F0ZUMKKwkJCQkgICByYWRhciBtYXRjaCAqLworCXVpbnQzMl90IHJwX21pbmR1cjsgICAgIC8qIE1pbiBwdWxzZSBkdXJhdGlvbiB0byBiZSBjb25zaWRlcmVkIGZvcgorCQkJCSAgIHRoaXMgcHVsc2UgdHlwZSAqLworCXVpbnQzMl90IHJwX21heGR1cjsgICAgIC8qIE1heCBwdXNsZSBkdXJhdGlvbiB0byBiZSBjb25zaWRlcmVkIGZvcgorCQkJCSAgIHRoaXMgcHVsc2UgdHlwZSAqLworCXVpbnQzMl90IHJwX3Jzc2l0aHJlc2g7IC8qIE1pbiByc3NpIHRvIGJlIGNvbnNpZGVyZWQgYSByYWRhciBwdWxzZSAqLworCXVpbnQzMl90IHJwX21lYW5vZmZzZXQ7IC8qIE9mZnNldCBmb3IgdGltaW5nIGFkanVzdG1lbnQgKi8KKwlpbnQzMl90IHJwX3Jzc2ltYXJnaW47ICAvKiByc3NpIHRocmVzaG9sZCBtYXJnaW4uIEluIFR1cmJvIE1vZGUgSFcKKwkJCQkgICByZXBvcnRzIHJzc2kgM2RCbSBsb3dlciB0aGFuIGluIG5vbiBUVVJCTworCQkJCSAgIG1vZGUuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIG9mZnNldCB0aGF0CisJCQkJICAgZGlmZi4gKi8KKwl1aW50MzJfdCBycF9wdWxzZWlkOyAgICAvKiBVbmlxdWUgSUQgZm9yIGlkZW50aWZ5aW5nIGZpbHRlciAqLworfTsKKworc3RydWN0IGRmc19iaW41cHVsc2UgeworCXVpbnQzMl90IGI1X3RocmVzaG9sZDsgIC8qIE51bSBvZiBiaW41IHB1bHNlcyB0byBpbmRpY2F0ZSBkZXRlY3Rpb24gKi8KKwl1aW50MzJfdCBiNV9taW5kdXI7ICAgICAvKiBNaW4gZHVyYXRpb24gZm9yIGEgYmluNSBwdWxzZSAqLworCXVpbnQzMl90IGI1X21heGR1cjsgICAgIC8qIE1heCBkdXJhdGlvbiBmb3IgYSBiaW41IHB1bHNlICovCisJdWludDMyX3QgYjVfdGltZXdpbmRvdzsgLyogV2luZG93IG92ZXIgd2hpY2ggdG8gY291bnQgYmluNSBwdWxzZXMgKi8KKwl1aW50MzJfdCBiNV9yc3NpdGhyZXNoOyAvKiBNaW4gcnNzaSB0byBiZSBjb25zaWRlcmVkIGEgcHVsc2UgKi8KKwl1aW50MzJfdCBiNV9yc3NpbWFyZ2luOyAvKiByc3NpIHRocmVzaG9sZCBtYXJnaW4uIEluIFR1cmJvIE1vZGUgSFcKKwkJCQkgKiByZXBvcnRzIHJzc2kgM2RCCisJCQkJICovCit9OworCisvKgorICogREZTIE5PTCByZXByZXNlbnRhdGlvbi4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBERlMgTk9MIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlCisgKiBOT0wgY29kZSBpbiBsbWFjL2Rmcy9kZnNfbm9sLmMgYW5kIGFueSBkcml2ZXIgbGF5ZXIgd2lzaGluZworICogdG8gdXNlIGl0LgorICovCitzdHJ1Y3QgZGZzX25vbF9jaGFuX2VudHJ5IHsKKwl1aW50MzJfdCBub2xfY2hmcmVxOyAgICAvKiBDZW50cmUgZnJlcXVlbmN5LCBNSHogKi8KKwl1aW50MzJfdCBub2xfY2h3aWR0aDsgICAvKiBXaWR0aCwgTUh6ICovCisJdW5zaWduZWQgbG9uZyBub2xfc3RhcnRfdGlja3M7ICAvKiBzdGFydCB0aWNrcywgT1Mgc3BlY2lmaWMgKi8KKwl1aW50MzJfdCBub2xfdGltZW91dF9tczsgICAgICAgIC8qIHRpbWVvdXQsIG1TICovCit9OworCisvKiBIQUxfUEhZRVJSX1BBUkFNOyAqLworCisvKgorICogVGhpcyByZXByZXNlbnRzIHRoZSBnZW5lcmFsIGNhc2Ugb2YgdGhlIHJhZGFyIFBIWSBjb25maWd1cmF0aW9uLAorICogYWNyb3NzIGFsbCBjaGlwcy4KKyAqCisgKiBJdCdzIHRoZW4gdXAgdG8gZWFjaCBjaGlwIGxheWVyIHRvIHRyYW5zbGF0ZSB0by9mcm9tIHRoaXMKKyAqIChlZyB0byBIQUxfUEhZRVJSX1BBUkFNIGZvciB0aGUgSEFMIGNhc2UuKQorICovCisKKyNkZWZpbmUgIEFUSF9ERlNfUEhZRVJSX1BBUkFNX05PVkFMIDB4RkZGRgorI2RlZmluZSAgQVRIX0RGU19QSFlFUlJfUEFSQU1fRU5BQkxFICAgMHg4MDAwCisKK3N0cnVjdCBhdGhfZGZzX3BoeWVycl9wYXJhbSB7CisJaW50MzJfdCBwZV9maXJwd3I7ICAgICAgLyogRklSIHB3ciBvdXQgdGhyZXNob2xkICovCisJaW50MzJfdCBwZV9ycnNzaTsgICAgICAgLyogUmFkYXIgcnNzaSB0aHJlc2ggKi8KKwlpbnQzMl90IHBlX2hlaWdodDsgICAgICAvKiBQdWxzZSBoZWlnaHQgdGhyZXNoICovCisJaW50MzJfdCBwZV9wcnNzaTsgICAgICAgLyogUHVsc2UgcnNzaSB0aHJlc2ggKi8KKwlpbnQzMl90IHBlX2luYmFuZDsgICAgICAvKiBJbmJhbmQgdGhyZXNoICovCisKKwkvKiBUaGUgZm9sbG93aW5nIHBhcmFtcyBhcmUgb25seSBmb3IgQVI1NDEzIGFuZCBsYXRlciAqLworCS8qCisJICogUmVsYXRpdmUgcG93ZXIgdGhyZXNob2xkIGluIDAuNWRCIHN0ZXBzCisJICovCisJdWludDMyX3QgcGVfcmVscHdyOworCisJLyoKKwkgKiBQdWxzZSBSZWxhdGl2ZSBzdGVwIHRocmVzaG9sZCBpbiAwLjVkQiBzdGVwcworCSAqLworCXVpbnQzMl90IHBlX3JlbHN0ZXA7CisKKwkvKgorCSAqIE1heCBsZW5ndGggb2YgcmFkYXIgc2lnbiBpbiAwLjh1cyB1bml0cworCSAqLworCXVpbnQzMl90IHBlX21heGxlbjsKKworCS8qCisJICogVXNlIHRoZSBhdmVyYWdlIGluLWJhbmQgcG93ZXIgbWVhc3VyZWQgb3ZlciAxMjggY3ljbGVzCisJICovCisJYm9vbCBwZV91c2VmaXIxMjg7CisKKwkvKgorCSAqIEVuYWJsZSB0byBibG9jayByYWRhciBjaGVjayBpZiBwa3QgZGV0ZWN0IGlzIGRvbmUgdmlhIE9GRE0KKwkgKiB3ZWFrIHNpZ25hbCBkZXRlY3Qgb3IgcGt0IGlzIGRldGVjdGVkIGltbWVkaWF0ZWx5IGFmdGVyIHR4CisJICogdG8gcnggdHJhbnNpdGlvbgorCSAqLworCWJvb2wgcGVfYmxvY2tyYWRhcjsKKworCS8qCisJICogRW5hYmxlIHRvIHVzZSB0aGUgbWF4IHJzc2kgaW5zdGVhZCBvZiB0aGUgbGFzdCByc3NpIGR1cmluZworCSAqIGZpbmUgZ2FpbiBjaGFuZ2VzIGZvciByYWRhciBkZXRlY3Rpb24KKwkgKi8KKwlib29sIHBlX2VubWF4cnNzaTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGhfZGZzX3BoeWVycl9wYXJhbV9jb3B5KHN0cnVjdCBhdGhfZGZzX3BoeWVycl9wYXJhbSAqZHN0LAorCQkJCQkgICAgIHN0cnVjdCBhdGhfZGZzX3BoeWVycl9wYXJhbSAqc3JjKQoreworCWNkZl9tZW1fY29weShkc3QsIHNyYywgc2l6ZW9mKCpkc3QpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0aF9kZnNfcGh5ZXJyX2luaXRfbm92YWwoc3RydWN0IGF0aF9kZnNfcGh5ZXJyX3BhcmFtICpwZSkKK3sKKwlwZS0+cGVfZmlycHdyID0gQVRIX0RGU19QSFlFUlJfUEFSQU1fTk9WQUw7CisJcGUtPnBlX3Jyc3NpID0gQVRIX0RGU19QSFlFUlJfUEFSQU1fTk9WQUw7CisJcGUtPnBlX2hlaWdodCA9IEFUSF9ERlNfUEhZRVJSX1BBUkFNX05PVkFMOworCXBlLT5wZV9wcnNzaSA9IEFUSF9ERlNfUEhZRVJSX1BBUkFNX05PVkFMOworCXBlLT5wZV9pbmJhbmQgPSBBVEhfREZTX1BIWUVSUl9QQVJBTV9OT1ZBTDsKKwlwZS0+cGVfcmVscHdyID0gQVRIX0RGU19QSFlFUlJfUEFSQU1fTk9WQUw7CisJcGUtPnBlX3JlbHN0ZXAgPSBBVEhfREZTX1BIWUVSUl9QQVJBTV9OT1ZBTDsKKwlwZS0+cGVfbWF4bGVuID0gQVRIX0RGU19QSFlFUlJfUEFSQU1fTk9WQUw7CisKKwkvKiBYWFggd2hhdCBhYm91dCB1c2VmaXIxMjgsIGJsb2NrcmFkYXIsIGVubWF4cnNzaT8gKi8KK30KKworc3RydWN0IGF0aF9kZnNfcmFkYXJfdGFiX2luZm8geworCXVpbnQzMl90IGRmc2RvbWFpbjsKKwlpbnQgbnVtcmFkYXJzOworCXN0cnVjdCBkZnNfcHVsc2UgKmRmc19yYWRhcnM7CisJaW50IG51bWI1cmFkYXJzOworCXN0cnVjdCBkZnNfYmluNXB1bHNlICpiNXB1bHNlczsKKwlzdHJ1Y3QgYXRoX2Rmc19waHllcnJfcGFyYW0gZGZzX2RlZmF1bHRwYXJhbXM7CisJaW50IGRmc19wcmlfbXVsdGlwbGllcjsKK307CisjZW5kaWYgLyogX0RGU19fU1RSVUNUU19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zYXAvZGZzL2luYy9kZnMuaCBiL2NvcmUvc2FwL2Rmcy9pbmMvZGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwODcyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2FwL2Rmcy9pbmMvZGZzLmgKQEAgLTAsMCArMSw4MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJCQlkZnMuaAorCisgICBPVkVSVklFVzoKKworICAgU291cmNlIGNvZGUgYm9ycm93ZWQgZnJvbSBRQ0FfTUFJTiBERlMgbW9kdWxlCisKKyAgIERFUEVOREVOQ0lFUzoKKworICAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZm5kZWYgX0RGU19IXworI2RlZmluZSBfREZTX0hfCisKKy8qCisgICAqVE8gRE8gREZTLSBOZWVkIHRvIGluY2x1ZGUgdGhpcyBmaWxlIGxhdGVyIG9uCisgICAqI2luY2x1ZGUgImF0aF9pbnRlcm5hbC5oIgorICovCisvKkRGUyBOZXcgSW5jbHVkZSBTdGFydCovCisKKyNpbmNsdWRlIDxjZGZfbmV0X3R5cGVzLmg+ICAgICAgLyogQ0RGX05CVUZfRVhFTVBUX05PX0VYRU1QVElPTiwgZXRjLiAqLworI2luY2x1ZGUgPGNkZl9uYnVmLmg+ICAgICAgICAgICAvKiBjZGZfbmJ1Zl90LCBldGMuICovCisjaW5jbHVkZSA8Y2RmX3V0aWwuaD4gICAgICAgICAgIC8qIGNkZl9hc3NlcnQgKi8KKyNpbmNsdWRlIDxjZGZfbG9jay5oPiAgICAgICAgICAgLyogY2RmX3NwaW5sb2NrICovCisjaW5jbHVkZSA8Y2RzX3F1ZXVlLmg+ICAgICAgICAgIC8qIFRBSUxRICovCisjaW5jbHVkZSA8Y2RmX3RpbWUuaD4KKyNpbmNsdWRlIDxjZGZfc29mdGlycV90aW1lci5oPgorI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4KKyNpbmNsdWRlIDxvc2RlcC5oPgorLypERlMgVXRpbGl0eSBJbmNsdWRlIEVORCovCisKKy8qIEZyb20gd2xhbl9tb2R1bGVzL2luY2x1ZGUvICovCisjaW5jbHVkZSAiYXRoX2Rmc19zdHJ1Y3RzLmgiCisvKkRGUyAtIE5ld2x5IGFkZGVkIEZpbGUgdG8gaW50ZXJmYWNlIGNsZCBVTUFDIGFuZCBkZnMgZGF0YSBzdHJ1Y3R1cmVzKi8KKyNpbmNsdWRlIDx3bWFfZGZzX2ludGVyZmFjZS5oPgorLyoKKyAgICpUTyBETyBERlMtIE5lZWQgdG8gaW5jbHVkZSB0aGlzIGZpbGUgbGF0ZXIgb24KKyAgICNpbmNsdWRlICJhaC5oIgorICovCisvKiAjaW5jbHVkZSAiYWhfZGVzYy5oIiAqLworI2luY2x1ZGUgImRmc19pb2N0bC5oIgorI2luY2x1ZGUgImRmc19pb2N0bF9wcml2YXRlLmgiCisjaW5jbHVkZSAiZGZzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNkc19pZWVlODAyMTFfY29tbW9uLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorCisjZGVmaW5lIEFUSF9TVVBQT1JUX0RGUyAgIDEKKyNkZWZpbmUgQ0hBTk5FTF9UVVJCTyAgICAgMHgwMDAxMAorI2RlZmluZSBERlNfUFJJTlRLKF9mbXQsIC4uLikgcHJpbnRrKChfZm10KSwgX19WQV9BUkdTX18pCisjZGVmaW5lIERGU19EUFJJTlRLKGRmcywgX20sIF9mbXQsIC4uLikgZG8gewkJIFwKKwkJaWYgKCgoZGZzKSA9PSBOVUxMKSB8fAkJCQkgICAgIFwKKwkJICAgICgoZGZzKSAhPSBOVUxMICYmCQkJCSAgICAgICBcCisJCSAgICAgKChfbSkgJiAoZGZzKS0+ZGZzX2RlYnVnX21hc2spKSkgewkJICAgICAgIFwKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBcCisJCQkJIF9mbXQsIF9fVkFfQVJHU19fKTsJXAorCQl9CQkJCQkJICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERGU19NSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgREZTX01BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBERlNfRElGRihhLCBiKSAoREZTX01BWChhLCBiKSAtIERGU19NSU4oYSwgYikpCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgcmFkYXIgZXZlbnRzIHRvIGJlIHByb2Nlc3NlZCBpbiBhIHNpbmdsZSBpdGVyYXRpb24uCisgKiBBbGxvd3Mgc29mdCB3YXRjaGRvZyB0byBydW4uCisgKi8KKyNkZWZpbmUgTUFYX0VWRU5UUyAxMDAKKworI2RlZmluZSBERlNfU1RBVFVTX1NVQ0NFU1MgMAorI2RlZmluZSBERlNfU1RBVFVTX0ZBSUwgMQorCisvKgorICogQ29uc3RhbnRzIHRvIHVzZSBmb3IgY2hpcnBpbmcgZGV0ZWN0aW9uLgorICoKKyAqIEFsbCBhcmUgdW5jb252ZXJ0ZWQgYXMgSFcgcmVwb3J0cyB0aGVtLgorICoKKyAqIFhYWCBBcmUgdGhlc2UgY29uc3RhbnRzIHdpdGggb3Igd2l0aG91dCBmYXN0IGNsb2NrIDVHSHogb3BlcmF0aW9uPworICogWFhYIFBlcmVncmluZSByZXBvcnRzIHB1bHNlcyBpbiBtaWNyb3NlY29uZHMsIG5vdCBoYXJkd2FyZSBjbG9ja3MhCisgKi8KKyNkZWZpbmUgTUlOX0JJTjVfRFVSICA2MyAgICAgICAgLyogNTAgKiAxLjI1ICovCisjZGVmaW5lIE1JTl9CSU41X0RVUl9NSUNST1NFQyA1MAorI2RlZmluZSBNQVlCRV9CSU41X0RVUiAzNSAgICAgICAvKiAyOCAqIDEuMjUgKi8KKyNkZWZpbmUgTUFZQkVfQklONV9EVVJfTUlDUk9TRUMgMjgKKy8qICNkZWZpbmUgTUFYX0JJTjVfRFVSICAxMzEgLyAqIDEwNSAqIDEuMjUqIC8gKi8KKy8qIHVzZSAxNDUgZm9yIG9zcHJleSBjb252ZXJzaW9uIGlzIGFscmVhZHkgZG9uZSB1c2luZyBkZnMtPmR1cl9tdWx0aXBsaWVyICovCisjZGVmaW5lIE1BWF9CSU41X0RVUiAgMTQ1CisjZGVmaW5lIE1BWF9CSU41X0RVUl9NSUNST1NFQyAxMDUKKworI2RlZmluZSBERlNfTUFSR0lOX0VRVUFMKGEsIGIsIG1hcmdpbikgKChERlNfRElGRihhLCBiKSkgPD0gbWFyZ2luKQorI2RlZmluZSBERlNfTUFYX1NUQUdHRVJFRF9CVVJTVFMgMworCisvKgorICogQWxsIGZpbHRlciB0aHJlc2hvbGRzIGluIHRoZSByYWRhciBmaWx0ZXIgdGFibGVzCisgKiBhcmUgZWZmZWN0aXZlIGF0IGEgNTAlIGNoYW5uZWwgbG9hZGluZworICovCisjZGVmaW5lIERGU19DSEFOX0xPQURJTkdfVEhSRVNIICAgICAgICAgNTAKKyNkZWZpbmUgREZTX0VYVF9DSEFOX0xPQURJTkdfVEhSRVNIICAgICAzMAorI2RlZmluZSBERlNfREVGQVVMVF9QUklfTUFSR0lOICAgICAgICAgIDYKKyNkZWZpbmUgREZTX0RFRkFVTFRfRklYRURQQVRURVJOX1BSSV9NQVJHSU4gICAgICAgNAorI2RlZmluZSBBVEhfREZTUV9MT0NLKF9kZnMpICAgICAgICBjZGZfc3Bpbl9sb2NrX2JoKCgmKF9kZnMpLT5kZnNfcmFkYXJxbG9jaykpCisjZGVmaW5lIEFUSF9ERlNRX1VOTE9DSyhfZGZzKSAgICAgIGNkZl9zcGluX3VubG9ja19iaCgoJihfZGZzKS0+ZGZzX3JhZGFycWxvY2spKQorI2RlZmluZSBBVEhfREZTUV9MT0NLX0lOSVQoX2RmcykgICBjZGZfc3BpbmxvY2tfaW5pdCgmKF9kZnMpLT5kZnNfcmFkYXJxbG9jaykKKworI2RlZmluZSBBVEhfQVJRX0xPQ0soX2RmcykgICAgICAgICBjZGZfc3Bpbl9sb2NrX2JoKCgmKF9kZnMpLT5kZnNfYXJxbG9jaykpCisjZGVmaW5lIEFUSF9BUlFfVU5MT0NLKF9kZnMpICAgICAgIGNkZl9zcGluX3VubG9ja19iaCgoJihfZGZzKS0+ZGZzX2FycWxvY2spKQorI2RlZmluZSBBVEhfQVJRX0xPQ0tfSU5JVChfZGZzKSAgICBjZGZfc3BpbmxvY2tfaW5pdCgmKF9kZnMpLT5kZnNfYXJxbG9jaykKKworI2RlZmluZSBBVEhfREZTRVZFTlRRX0xPQ0soX2RmcykgICBjZGZfc3Bpbl9sb2NrX2JoKCgmKF9kZnMpLT5kZnNfZXZlbnRxbG9jaykpCisjZGVmaW5lIEFUSF9ERlNFVkVOVFFfVU5MT0NLKF9kZnMpIGNkZl9zcGluX3VubG9ja19iaCgoJihfZGZzKS0+ZGZzX2V2ZW50cWxvY2spKQorI2RlZmluZSBBVEhfREZTRVZFTlRRX0xPQ0tfSU5JVChfZGZzKSBcCisJCQkJICAgY2RmX3NwaW5sb2NrX2luaXQoKCYoX2RmcyktPmRmc19ldmVudHFsb2NrKSkKKy8qIE1hc2sgZm9yIHRpbWUgc3RhbXAgZnJvbSBkZXNjcmlwdG9yICovCisjZGVmaW5lIERGU19UU01BU0sgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKy8qIFNoaWZ0IGZvciB0aW1lIHN0YW1wIGZyb20gZGVzY3JpcHRvciAqLworI2RlZmluZSBERlNfVFNTSElGVCAgICAgICAgICAgICAzMgorLyogNjQgYml0IFRTRiB3cmFwIHZhbHVlICovCisjZGVmaW5lICBERlNfVFNGX1dSQVAgICAgICAweEZGRkZGRkZGRkZGRkZGRkZVTEwKKy8qIFRTIG1hc2sgZm9yIDY0IGJpdCB2YWx1ZSAqLworI2RlZmluZSAgREZTXzY0QklUX1RTRk1BU0sgMHgwMDAwMDAwMDAwMDA3RkZGVUxMCisKKyNkZWZpbmUgIERGU19BUl9SQURBUl9SU1NJX1RIUiAgICAgIDUgICAvKiBpbiBkQiAqLworI2RlZmluZSAgREZTX0FSX1JBREFSX1JFU0VUX0lOVCAgICAgMSAgIC8qIGluIHNlY3MgKi8KKyNkZWZpbmUgIERGU19BUl9SQURBUl9NQVhfSElTVE9SWSAgIDUwMAorI2RlZmluZSAgREZTX0FSX1JFR0lPTl9XSURUSCAgICAgMTI4CisjZGVmaW5lICBERlNfQVJfUlNTSV9USFJFU0hfU1RST05HX1BLVFMgICAxNyAgICAvKiBpbiBkQiAqLworI2RlZmluZSAgREZTX0FSX1JTU0lfRE9VQkxFX1RIUkVTSE9MRCAgMTUgICAgICAgLyogaW4gZEIgKi8KKyNkZWZpbmUgIERGU19BUl9NQVhfTlVNX0FDS19SRUdJT05TIDkKKyNkZWZpbmUgIERGU19BUl9BQ0tfREVURUNUX1BBUl9USFJFU0ggIDIwCisjZGVmaW5lICBERlNfQVJfUEtUX0NPVU5UX1RIUkVTSCAgICAyMAorCisjZGVmaW5lICBERlNfTUFYX0RMX1NJWkUgICAgICAgICA2NAorI2RlZmluZSAgREZTX01BWF9ETF9NQVNLICAgICAgICAgMHgzRgorCisjZGVmaW5lIERGU19OT0xfVElNRSAgICAgICBERlNfTk9MX1RJTUVPVVRfVVMKKy8qIDMwIG1pbnV0ZXMgaW4gdXNlY3MgKi8KKworI2RlZmluZSBERlNfV0FJVF9USU1FICAgICAgICAoNjAgKiAxMDAwMDAwKSAgICAgICAgLyogMSBtaW51dGUgaW4gdXNlY3MgKi8KKworI2RlZmluZSAgREZTX0RJU0FCTEVfVElNRSAgICAgKDMgKiA2MCAqIDEwMDAwMDApICAgIC8qIDMgbWludXRlcyBpbiB1c2VjcyAqLworCisjZGVmaW5lICBERlNfTUFYX0I1X1NJWkUgICAgICAgICAxMjgKKyNkZWZpbmUgIERGU19NQVhfQjVfTUFTSyAgICAgICAgIDB4MDAwMDAwN0YgICAgIC8qIDEyOCAqLworCisjZGVmaW5lICBERlNfTUFYX1JBREFSX09WRVJMQVAgICAgICAxNiAgLyogTWF4IG51bWJlciBvZiBvdmVybGFwcGluZyBmaWx0ZXJzICovCisvKiBNYXggbnVtYmVyIG9mIGRmcyBldmVudHMgd2hpY2ggY2FuIGJlIHEnZCAqLworI2RlZmluZSAgREZTX01BWF9FVkVOVFMgICAgICAgMTAyNAorCisjZGVmaW5lIERGU19SQURBUl9FTiAgICAweDgwMDAwMDAwICAgICAgLyogUmFkYXIgZGV0ZWN0IGlzIGNhcGFibGUgKi8KKyNkZWZpbmUgREZTX0FSX0VOICAgIDB4NDAwMDAwMDAgLyogQVIgZGV0ZWN0IGlzIGNhcGFibGUgKi8KKyNkZWZpbmUgIERGU19NQVhfUlNTSV9WQUxVRSAgIDB4N2ZmZmZmZmYgICAgICAgIC8qIE1heCByc3NpIHZhbHVlICovCisvKiBtYXggbnVtIG9mIHB1bHNlcyBpbiBhIGJ1cnN0ICovCisjZGVmaW5lIERGU19CSU5fTUFYX1BVTFNFUyAgICAgICAgICAgICAgNjAKKyNkZWZpbmUgREZTX0JJTjVfUFJJX0xPV0VSX0xJTUlUIDk5MCAgICAvKiB1cyAqLworCisvKiB0byBjb3ZlciB0aGUgc2luZ2xlIHB1c2xlIGJ1cnN0IGNhc2UsIGNoYW5nZSBmcm9tIDIwMTAgdXMgdG8gMjAxMDAwMCB1cyAqLworCisvKgorICogdGhpcyBpcyByZXZlcnRlZCBiYWNrIHRvIDIwMTAgYXMgbGFyZ2VyIHZhbHVlIGNhdXNlcyBmYWxzZQorICogYmluNSBkZXRlY3QgKEVWNzY0MzIsIEVWNzYzMjApCisgKi8KKyNkZWZpbmUgREZTX0JJTjVfUFJJX0hJR0hFUl9MSU1JVCAgICAgMjAxMCAgICAgIC8qIHVzICovCisKKyNkZWZpbmUgREZTX0JJTjVfV0lEVEhfTUFSR0lOICAgICAgIDQgICAvKiB1cyAqLworI2RlZmluZSBERlNfQklONV9SU1NJX01BUkdJTiAgICAgICAgNSAgIC8qIGRCbSAqLworLypGb2xsb3dpbmcgdGhyZXNob2xkIGlzIG5vdCBzcGVjaWZpZWQgYnV0IHNob3VsZCBiZSBva2F5IHN0YXRpc3RpY2FsbHkqLworI2RlZmluZSBERlNfQklONV9CUklfTE9XRVJfTElNSVQgMzAwMDAwIC8qIHVzICovCisjZGVmaW5lIERGU19CSU41X0JSSV9VUFBFUl9MSU1JVCAxMjAwMDAwMCAgICAgICAvKiB1cyAqLworLyogTWF4IG51bWJlciBvZiBwdWxzZXMga2VwdCBpbiBidWZmZXIgKi8KKyNkZWZpbmUgREZTX01BWF9QVUxTRV9CVUZGRVJfU0laRSAxMDI0CisjZGVmaW5lIERGU19NQVhfUFVMU0VfQlVGRkVSX01BU0sgMHgzZmYKKworI2RlZmluZSBERlNfRkFTVF9DTE9DS19NVUxUSVBMSUVSICAgICAgICg4MDAvMTEpCisjZGVmaW5lIERGU19OT19GQVNUX0NMT0NLX01VTFRJUExJRVIgICAgKDgwKQorCisjZGVmaW5lIERGU19XQVJfUExVU18zMF9NSFpfU0VQQVJBVElPTiAgIDMwCisjZGVmaW5lIERGU19XQVJfTUlOVVNfMzBfTUhaX1NFUEFSQVRJT04gLTMwCisjZGVmaW5lIERGU19XQVJfUEVBS19JTkRFWF9aRVJPIDAKKyNkZWZpbmUgREZTX1RZUEU0X1dBUl9QVUxTRV9EVVJBVElPTl9MT1dFUl9MSU1JVCAxMQorI2RlZmluZSBERlNfVFlQRTRfV0FSX1BVTFNFX0RVUkFUSU9OX1VQUEVSX0xJTUlUIDMzCisjZGVmaW5lIERGU19UWVBFNF9XQVJfUFJJX0xPV0VSX0xJTUlUIDIwMAorI2RlZmluZSBERlNfVFlQRTRfV0FSX1BSSV9VUFBFUl9MSU1JVCA1MDAKKyNkZWZpbmUgREZTX1RZUEU0X1dBUl9WQUxJRF9QVUxTRV9EVVJBVElPTiAxMgorI2RlZmluZSBERlNfRVRTSV9UWVBFMl9UWVBFM19XQVJfUFVMU0VfRFVSX0xPV0VSX0xJTUlUIDE1CisjZGVmaW5lIERGU19FVFNJX1RZUEUyX1RZUEUzX1dBUl9QVUxTRV9EVVJfVVBQRVJfTElNSVQgMzMKKyNkZWZpbmUgREZTX0VUU0lfVFlQRTJfV0FSX1BSSV9MT1dFUl9MSU1JVCA2MjUKKyNkZWZpbmUgREZTX0VUU0lfVFlQRTJfV0FSX1BSSV9VUFBFUl9MSU1JVCA1MDAwCisjZGVmaW5lIERGU19FVFNJX1RZUEUzX1dBUl9QUklfTE9XRVJfTElNSVQgMjUwCisjZGVmaW5lIERGU19FVFNJX1RZUEUzX1dBUl9QUklfVVBQRVJfTElNSVQgNDM1CisjZGVmaW5lIERGU19FVFNJX1dBUl9WQUxJRF9QVUxTRV9EVVJBVElPTiAxNQorCit0eXBlZGVmIGNkZl9zcGlubG9ja190IGRmc3FfbG9ja190OworCisjaWZkZWYgV0lOMzIKKyNwcmFnbWEgcGFjayhwdXNoLCBkZnNfcHVsc2VwYXJhbXMsIDEpCisjZW5kaWYKK3N0cnVjdCBkZnNfcHVsc2VwYXJhbXMgeworCXVpbnQ2NF90IHBfdGltZTsgICAgICAgIC8qIHRpbWUgZm9yIHN0YXJ0IG9mIHB1bHNlIGluIHVzZWNzICovCisJdWludDhfdCBwX2R1cjsgICAgICAgICAgLyogRHVyYXRpb24gb2YgcHVsc2UgaW4gdXNlY3MgKi8KKwl1aW50OF90IHBfcnNzaTsgICAgICAgICAvKiBEdXJhdGlvbiBvZiBwdWxzZSBpbiB1c2VjcyAqLworfSBjZGZfcGFja2VkOworI2lmZGVmIFdJTjMyCisjcHJhZ21hIHBhY2socG9wLCBkZnNfcHVsc2VwYXJhbXMpCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjcHJhZ21hIHBhY2socHVzaCwgZGZzX3B1bHNlbGluZSwgMSkKKyNlbmRpZgorc3RydWN0IGRmc19wdWxzZWxpbmUgeworCS8qIHBsX2VsZW1zIC0gYXJyYXkgb2YgcHVsc2VzIGluIGRlbGF5IGxpbmUgKi8KKwlzdHJ1Y3QgZGZzX3B1bHNlcGFyYW1zIHBsX2VsZW1zW0RGU19NQVhfUFVMU0VfQlVGRkVSX1NJWkVdOworCXVpbnQzMl90IHBsX2ZpcnN0ZWxlbTsgIC8qIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50ICovCisJdWludDMyX3QgcGxfbGFzdGVsZW07ICAgLyogSW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCAqLworCXVpbnQzMl90IHBsX251bWVsZW1zOyAgIC8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZGVsYXkgbGluZSAqLworfSBjZGZfcGFja2VkOworI2lmZGVmIFdJTjMyCisjcHJhZ21hIHBhY2socG9wLCBkZnNfcHVsc2VsaW5lKQorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorI3ByYWdtYSBwYWNrKHB1c2gsIGRmc19ldmVudCwgMSkKKyNlbmRpZgorCisjZGVmaW5lICBERlNfRVZFTlRfQ0hFQ0tDSElSUCAweDAxICAgICAgLyogV2hldGhlciB0byBjaGVjayB0aGUgY2hpcnAgZmxhZyAqLworI2RlZmluZSAgREZTX0VWRU5UX0hXX0NISVJQICAgMHgwMiAgICAgIC8qIGhhcmR3YXJlIGNoaXJwICovCisjZGVmaW5lICBERlNfRVZFTlRfU1dfQ0hJUlAgICAweDA0ICAgICAgLyogc29mdHdhcmUgY2hpcnAgKi8KKworLyoKKyAqIFVzZSB0aGlzIG9ubHkgaWYgdGhlIGV2ZW50IGhhcyBDSEVDS0NISVJQIHNldC4KKyAqLworI2RlZmluZSAgREZTX0VWRU5UX0lTQ0hJUlAoZSkJICAgICAgIFwKKwkoKGUpLT5yZV9mbGFncyAmIChERlNfRVZFTlRfSFdfQ0hJUlAgfCBERlNfRVZFTlRfU1dfQ0hJUlApKQorCisvKgorICogQ2hlY2sgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIHRvIGJlIHJlamVjdGVkIGFzIG5vdCBwb3NzaWJseQorICogYSBjaGlycC4gIFRoaXMgbWVhbnM6CisgKiAgIChhKSBpdCdzIGEgaGFyZHdhcmUgb3Igc29mdHdhcmUgY2hlY2tlZCBjaGlycCwgYW5kCisgKiAgIChiKSB0aGUgSFcvU1cgY2hpcnAgYml0cyBhcmUgYm90aCAwLgorICovCisjZGVmaW5lICBERlNfRVZFTlRfTk9UQ0hJUlAoZSkJICAgICAgIFwKKwkoKChlKS0+cmVfZmxhZ3MgJiAoREZTX0VWRU5UX0NIRUNLQ0hJUlApKSAmJiBcCisJICghREZTX0VWRU5UX0lTQ0hJUlAoKGUpKSkpCisKK3N0cnVjdCBkZnNfZXZlbnQgeworCXVpbnQ2NF90IHJlX2Z1bGxfdHM7ICAgIC8qIDY0LWJpdCBmdWxsIHRpbWVzdGFtcCBmcm9tIGludGVycnVwdCB0aW1lICovCisJdWludDMyX3QgcmVfdHM7ICAgICAgICAgLyogT3JpZ2luYWwgMTUgYml0IHJlY3YgdGltZXN0YW1wICovCisJdWludDhfdCByZV9yc3NpOyAgICAgICAgLyogcnNzaSBvZiByYWRhciBldmVudCAqLworCXVpbnQ4X3QgcmVfZHVyOyAgICAgICAgIC8qIGR1cmF0aW9uIG9mIHJhZGFyIHB1bHNlICovCisJdWludDhfdCByZV9jaGFuaW5kZXg7ICAgLyogQ2hhbm5lbCBvZiBldmVudCAqLworCXVpbnQ4X3QgcmVfZmxhZ3M7ICAgICAgIC8qIEV2ZW50IGZsYWdzICovCisJdWludDMyX3QgcmVfZnJlcTsgICAgICAgLyogQ2VudHJlIGZyZXF1ZW5jeSBvZiBldmVudCwgS0h6ICovCisJdWludDMyX3QgcmVfZnJlcV9sbzsgICAgLyogTG93ZXIgYm91bmRzIG9mIGZyZXF1ZW5jeSwgS0h6ICovCisJdWludDMyX3QgcmVfZnJlcV9oaTsgICAgLyogVXBwZXIgYm91bmRzIG9mIGZyZXF1ZW5jeSwgS0h6ICovCisJaW50IHNpZHg7ICAgICAgICAgICAgICAgLyogUHVsc2UgSW5kZXggYXMgaW4gcmFkYXIgc3VtbWFyeSByZXBvcnQgKi8KKwlTVEFJTFFfRU5UUlkoZGZzX2V2ZW50KSByZV9saXN0OyAgICAgICAgLyogTGlzdCBvZiByYWRhciBldmVudHMgKi8KK30gY2RmX3BhY2tlZDsKKyNpZmRlZiBXSU4zMgorI3ByYWdtYSBwYWNrKHBvcCwgZGZzX2V2ZW50KQorI2VuZGlmCisKKyNkZWZpbmUgREZTX0FSX01BWF9BQ0tfUkFEQVJfRFVSIDUxMQorI2RlZmluZSBERlNfQVJfTUFYX05VTV9QRUFLUyAgICAgMworI2RlZmluZSBERlNfQVJfQVJRX1NJWkUgICAgICAgMjA0OCAgICAgIC8qIDhLIEFSIGV2ZW50cyBmb3IgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgREZTX0FSX0FSUV9TRVFTSVpFICAgIDIwNDkgICAgICAvKiBTZXF1ZW5jZSBjb3VudGVyIHdyYXAgZm9yIEFSICovCisKKyNkZWZpbmUgREZTX1JBREFSUV9TSVpFICAgIDUxMiAgLyogMUsgcmFkYXIgZXZlbnRzIGZvciBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBERlNfUkFEQVJRX1NFUVNJWkUgNTEzICAvKiBTZXF1ZW5jZSBjb3VudGVyIHdyYXAgZm9yIHJhZGFyICovCisvKiBOdW1iZXIgb2YgcmFkYXIgY2hhbm5lbHMgd2Uga2VlcCBzdGF0ZSBmb3IgKi8KKyNkZWZpbmUgREZTX05VTV9SQURBUl9TVEFURVMgIDY0CisvKiBNYXggbnVtYmVyIHJhZGFyIGZpbHRlcnMgZm9yIGVhY2ggdHlwZSAqLworI2RlZmluZSBERlNfTUFYX05VTV9SQURBUl9GSUxURVJTIDEwCisvKiBOdW1iZXIgb2YgZGlmZmVyZW50IHJhZGFyIHR5cGVzICovCisjZGVmaW5lIERGU19NQVhfUkFEQVJfVFlQRVMgICAzMgorCitzdHJ1Y3QgZGZzX2FyX3N0YXRlIHsKKwl1aW50MzJfdCBhcl9wcmV2d2lkdGg7CisJdWludDMyX3QgYXJfcGh5ZXJyY291bnRbREZTX0FSX01BWF9BQ0tfUkFEQVJfRFVSXTsKKwl1aW50MzJfdCBhcl9hY2tzdW07CisJdWludDMyX3QgYXJfcGFja2V0dGhyZXNob2xkOyAgICAvKiBUaHJlc2ggdG8gZGV0ZXJtaW5lIHRyYWZmaWMgbG9hZCAqLworCXVpbnQzMl90IGFyX3BhcnRocmVzaG9sZDsgICAgICAgLyogVGhyZXNoIHRvIGRldGVybWluZSBwZWFrICovCisJdWludDMyX3QgYXJfcmFkYXJyc3NpOyAgLyogUnNzaSB0aHJlc2hvbGQgZm9yIEFSIGV2ZW50ICovCisJdWludDE2X3QgYXJfcHJldnRpbWVzdGFtcDsKKwl1aW50MTZfdCBhcl9wZWFrbGlzdFtERlNfQVJfTUFYX05VTV9QRUFLU107Cit9OworCisjaWZkZWYgV0lOMzIKKyNwcmFnbWEgcGFjayhwdXNoLCBkZnNfZGVsYXllbGVtLCAxKQorI2VuZGlmCitzdHJ1Y3QgZGZzX2RlbGF5ZWxlbSB7CisJLyogQ3VycmVudCAiZmlsdGVyIiB0aW1lIGZvciBzdGFydCBvZiBwdWxzZSBpbiB1c2VjcyAqLworCXVpbnQzMl90IGRlX3RpbWU7CisJLyogRHVyYXRpb24gb2YgcHVsc2UgaW4gdXNlY3MgKi8KKwl1aW50OF90IGRlX2R1cjsKKwkvKiByc3NpIG9mIHB1bHNlIGluIGRCICovCisJdWludDhfdCBkZV9yc3NpOworCS8qIHRpbWUgc3RhbXAgZm9yIHRoaXMgZGVsYXkgZWxlbWVudCAqLworCXVpbnQ2NF90IGRlX3RzOworfSBjZGZfcGFja2VkOworI2lmZGVmIFdJTjMyCisjcHJhZ21hIHBhY2socG9wLCBkZnNfZGVsYXllbGVtKQorI2VuZGlmCisKKy8qIE5COiBUaGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY2lyY3VsYXIgYnVmZmVyIGlzIHRoZSBvbGRlc3QgZWxlbWVudCAqLworCisjaWZkZWYgV0lOMzIKKyNwcmFnbWEgcGFjayhwdXNoLCBkZnNfZGVsYXlsaW5lLCAxKQorI2VuZGlmCitzdHJ1Y3QgZGZzX2RlbGF5bGluZSB7CisJLyogQXJyYXkgb2YgcHVsc2VzIGluIGRlbGF5IGxpbmUgKi8KKwlzdHJ1Y3QgZGZzX2RlbGF5ZWxlbSBkbF9lbGVtc1tERlNfTUFYX0RMX1NJWkVdOworCS8qIExhc3QgdGltZXN0YW1wIHRoZSBkZWxheSBsaW5lIHdhcyB1c2VkIChpbiB1c2VjcykgKi8KKwl1aW50NjRfdCBkbF9sYXN0X3RzOworCS8qIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50ICovCisJdWludDMyX3QgZGxfZmlyc3RlbGVtOworCS8qIEluZGV4IG9mIHRoZSBsYXN0IGVsZW1lbnQgKi8KKwl1aW50MzJfdCBkbF9sYXN0ZWxlbTsKKwkvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGRlbGF5IGxpbmUgKi8KKwl1aW50MzJfdCBkbF9udW1lbGVtczsKK30gY2RmX3BhY2tlZDsKKyNpZmRlZiBXSU4zMgorI3ByYWdtYSBwYWNrKHBvcCwgZGZzX2RlbGF5bGluZSkKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNwcmFnbWEgcGFjayhwdXNoLCBkZnNfZmlsdGVyLCAxKQorI2VuZGlmCitzdHJ1Y3QgZGZzX2ZpbHRlciB7CisJLyogRGVsYXkgbGluZSBvZiBwdWxzZXMgZm9yIHRoaXMgZmlsdGVyICovCisJc3RydWN0IGRmc19kZWxheWxpbmUgcmZfZGw7CisJLyogTnVtYmVyIG9mIHB1bHNlcyBpbiB0aGUgZmlsdGVyICovCisJdWludDMyX3QgcmZfbnVtcHVsc2VzOworCS8qIG1pbiBwcmkgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhpcyBmaWx0ZXIgKi8KKwl1aW50MzJfdCByZl9taW5wcmk7CisJLyogbWF4IHByaSB0byBiZSBjb25zaWRlcmVkIGZvciB0aGlzIGZpbHRlciAqLworCXVpbnQzMl90IHJmX21heHByaTsKKwkvKiBtYXRjaCBmaWx0ZXIgb3V0cHV0IHRocmVzaG9sZCBmb3IgcmFkYXIgZGV0ZWN0ICovCisJdWludDMyX3QgcmZfdGhyZXNob2xkOworCS8qIExlbmd0aCAoaW4gdXNlY3MpIG9mIHRoZSBmaWx0ZXIgKi8KKwl1aW50MzJfdCByZl9maWx0ZXJsZW47CisJLyogZml4ZWQgb3IgdmFyaWFibGUgcGF0dGVybiB0eXBlICovCisJdWludDMyX3QgcmZfcGF0dGVybnR5cGU7CisJLyogaW5kaWNhdGVzIGlmIGl0IGlzIGEgZml4ZWQgcHJpIHB1bHNlICovCisJdWludDMyX3QgcmZfZml4ZWRfcHJpX3JhZGFyX3B1bHNlOworCS8qIE1pbiBkdXJhdGlvbiBmb3IgdGhpcyByYWRhciBmaWx0ZXIgKi8KKwl1aW50MzJfdCByZl9taW5kdXI7CisJLyogTWF4IGR1cmF0aW9uIGZvciB0aGlzIHJhZGFyIGZpbHRlciAqLworCXVpbnQzMl90IHJmX21heGR1cjsKKwl1aW50MzJfdCByZl9pZ25vcmVfcHJpX3dpbmRvdzsKKwkvKiBVbmlxdWUgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JpZ2luYWwgZmlsdGVyIElEICovCisJdWludDMyX3QgcmZfcHVsc2VpZDsKK30gY2RmX3BhY2tlZDsKKyNpZmRlZiBXSU4zMgorI3ByYWdtYSBwYWNrKHBvcCwgZGZzX2ZpbHRlcikKKyNlbmRpZgorCitzdHJ1Y3QgZGZzX2ZpbHRlcnR5cGUgeworCXN0cnVjdCBkZnNfZmlsdGVyIGZ0X2ZpbHRlcnNbREZTX01BWF9OVU1fUkFEQVJfRklMVEVSU107CisJLyogRHVyYXRpb24gb2YgcHVsc2Ugd2hpY2ggc3BlY2lmaWVzIGZpbHRlciB0eXBlICovCisJdWludDMyX3QgZnRfZmlsdGVyZHVyOworCS8qIE51bSBmaWx0ZXJzIG9mIHRoaXMgdHlwZSAqLworCXVpbnQzMl90IGZ0X251bWZpbHRlcnM7CisJLyogTGFzdCB0aW1lc3RhbXAgdGhpcyBmaWx0ZXJ0eXBlIHdhcyB1c2VkKGluIHVzZWNzKSAqLworCXVpbnQ2NF90IGZ0X2xhc3RfdHM7CisJLyogbWluIHB1bHNlIGR1cmF0aW9uIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHRoaXMgZmlsdGVyIHR5cGUgKi8KKwl1aW50MzJfdCBmdF9taW5kdXI7CisJLyogbWF4IHB1bHNlIGR1cmF0aW9uIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHRoaXMgZmlsdGVyIHR5cGUgKi8KKwl1aW50MzJfdCBmdF9tYXhkdXI7CisJLyogbWluIHJzc2kgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhpcyBmaWx0ZXIgdHlwZSAqLworCXVpbnQzMl90IGZ0X3Jzc2l0aHJlc2g7CisJLyogTnVtIHB1bHNlcyBpbiBlYWNoIGZpbHRlciBvZiB0aGlzIHR5cGUgKi8KKwl1aW50MzJfdCBmdF9udW1wdWxzZXM7CisJLyogZml4ZWQgb3IgdmFyaWFibGUgcGF0dGVybiB0eXBlICovCisJdWludDMyX3QgZnRfcGF0dGVybnR5cGU7CisJLyogbWluIHByaSB0byBiZSBjb25zaWRlcmVkIGZvciB0aGlzIHR5cGUgKi8KKwl1aW50MzJfdCBmdF9taW5wcmk7CisJLyogcnNzaSB0aHJlc2hvbGQgbWFyZ2luLiBJbiBUdXJibyBNb2RlIEhXCisJICogcmVwb3J0cyByc3NpIDNkQiBsb3dlciB0aGFuIGluIG5vbiBUVVJCTworCSAqIG1vZGUuIFRoaXMgd2lsbCBvZmZzZXQgdGhhdCBkaWZmLgorCSAqLworCXVpbnQzMl90IGZ0X3Jzc2ltYXJnaW47Cit9OworCitzdHJ1Y3QgZGZzX3N0YXRlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgcnNfY2hhbjsgICAgICAgLyogQ2hhbm5lbCBpbmZvICovCisJdWludDhfdCByc19jaGFuaW5kZXg7ICAgLyogQ2hhbm5lbCBpbmRleCBpbiByYWRhciBzdHJ1Y3R1cmUgKi8KKwl1aW50MzJfdCByc19udW1yYWRhcmV2ZW50czsgICAgIC8qIE51bWJlciBvZiByYWRhciBldmVudHMgKi8KKworCXN0cnVjdCBhdGhfZGZzX3BoeWVycl9wYXJhbSByc19wYXJhbTsKK307CisKKy8qIDMwIG1pbnV0ZXMgaW4gc2Vjb25kcyAqLworI2RlZmluZSBERlNfTk9MX1RJTUVPVVRfUyAgKDMwKjYwKQorLyogNSBtaW51dGVzIGluIHNlY29uZHMgLSBkZWJ1Z2dpbmcgKi8KKy8qICNkZWZpbmUgREZTX05PTF9USU1FT1VUX1MgICg1KjYwKSAgICAgKi8KKyNkZWZpbmUgREZTX05PTF9USU1FT1VUX01TIChERlNfTk9MX1RJTUVPVVRfUyAqIDEwMDApCisjZGVmaW5lIERGU19OT0xfVElNRU9VVF9VUyAoREZTX05PTF9USU1FT1VUX01TICogMTAwMCkKKworI2lmZGVmIFdJTjMyCisjcHJhZ21hIHBhY2socHVzaCwgZGZzX25vbGVsZW0sIDEpCisjZW5kaWYKK3N0cnVjdCBkZnNfbm9sZWxlbSB7CisJdWludDMyX3Qgbm9sX2ZyZXE7ICAgICAgLyogY2VudHJlIGZyZXF1ZW5jeSAqLworCXVpbnQzMl90IG5vbF9jaHdpZHRoOyAgIC8qIGV2ZW50IHdpZHRoIChNSHopICovCisJdW5zaWduZWQgbG9uZyBub2xfc3RhcnRfdGlja3M7ICAvKiBOT0wgc3RhcnQgdGltZSBpbiBPUyB0aWNrcyAqLworCXVpbnQzMl90IG5vbF90aW1lb3V0X21zOyAgICAgICAgLyogTk9MIHRpbWVvdXQgdmFsdWUgaW4gbXNlYyAqLworCW9zX3RpbWVyX3Qgbm9sX3RpbWVyOyAgIC8qIHBlciBlbGVtZW50IE5PTCB0aW1lciAqLworCXN0cnVjdCBkZnNfbm9sZWxlbSAqbm9sX25leHQ7ICAgLyogbmV4dCBlbGVtZW50IHBvaW50ZXIgKi8KK30gY2RmX3BhY2tlZDsKKyNpZmRlZiBXSU4zMgorI3ByYWdtYSBwYWNrKHBvcCwgZGZzX25vbGVsZW0pCisjZW5kaWYKKworLyogUGFzcyBzdHJ1Y3R1cmUgdG8gREZTIE5PTCB0aW1lciAqLworc3RydWN0IGRmc19ub2xfdGltZXJfYXJnIHsKKwlzdHJ1Y3QgYXRoX2RmcyAqZGZzOworCXVpbnQxNl90IGRlbGZyZXE7CisJdWludDE2X3QgZGVsY2h3aWR0aDsKK307CisKKyNpZmRlZiBXSU4zMgorI3ByYWdtYSBwYWNrKHB1c2gsIGRmc19pbmZvLCAxKQorI2VuZGlmCitzdHJ1Y3QgZGZzX2luZm8geworCS8qIFVzZSB0aGUgTk9MIHdoZW4gcmFkYXIgZm91bmQgKGRlZmF1bHQ6IHRydWUpICovCisJaW50IHJuX3VzZV9ub2w7CisJLyogTnVtYmVyIG9mIGRpZmZlcmVudCB0eXBlcyBvZiByYWRhcnMgKi8KKwl1aW50MzJfdCBybl9udW1yYWRhcnM7CisJLyogTGFzdCA2NCBiaXQgdGltc3RhbXAgZnJvbSByZWN2IGludGVycnVwdCAqLworCXVpbnQ2NF90IHJuX2xhc3RmdWxsX3RzOworCS8qIGxhc3QgMTUgYml0IHRzIGZyb20gcmVjdiBkZXNjcmlwdG9yICovCisJdWludDE2X3Qgcm5fbGFzdF90czsKKwkvKiBsYXN0IHVuaXF1ZSAzMiBiaXQgdHMgZnJvbSByZWN2IGRlc2NyaXB0b3IgKi8KKwl1aW50MzJfdCBybl9sYXN0X3VuaXF1ZV90czsKKwkvKiBQcmVmaXggdG8gcHJlcGVuZCB0byAxNSBiaXQgcmVjdiB0cyAqLworCXVpbnQ2NF90IHJuX3RzX3ByZWZpeDsKKwkvKiBOdW1iZXIgb2YgYmluNSByYWRhciBwdWxzZXMgdG8gc2VhcmNoIGZvciAqLworCXVpbnQzMl90IHJuX251bWJpbjVyYWRhcnM7CisJLyogVmFsdWUgb2YgZmFzdCBkaXZlcnNpdHkgZ2MgbGltaXQgZnJvbSBpbml0IGZpbGUgKi8KKwl1aW50MzJfdCBybl9mYXN0ZGl2R0N2YWw7CisJLyogTWluIHJzc2kgZm9yIGFsbCByYWRhciB0eXBlcyAqLworCWludDMyX3Qgcm5fbWlucnNzaXRocmVzaDsKKwkvKiBNYXggcHVsc2Ugd2lkdGggaW4gVFNGIHRpY2tzICovCisJdWludDMyX3Qgcm5fbWF4cHVsc2VkdXI7CisKKwl1aW50OF90IGRmc19leHRfY2hhbl9idXN5OworCXVpbnQ2NF90IGV4dF9jaGFuX2J1c3lfdHM7CisKKwl1aW50NjRfdCBkZnNfYmluNV9jaGlycF90czsKKwl1aW50OF90IGRmc19sYXN0X2JpbjVfZHVyOworfSBjZGZfcGFja2VkOworI2lmZGVmIFdJTjMyCisjcHJhZ21hIHBhY2socG9wLCBkZnNfaW5mbykKKyNlbmRpZgorCitzdHJ1Y3QgZGZzX2JpbjVlbGVtIHsKKwl1aW50NjRfdCBiZV90czsgICAgICAgICAvKiBUaW1lc3RhbXAgZm9yIHRoZSBiaW41IGVsZW1lbnQgKi8KKwl1aW50MzJfdCBiZV9yc3NpOyAgICAgICAvKiBSc3NpIGZvciB0aGUgYmluNSBlbGVtZW50ICovCisJdWludDMyX3QgYmVfZHVyOyAgICAgICAgLyogRHVyYXRpb24gb2YgYmluNSBlbGVtZW50ICovCit9OworCitzdHJ1Y3QgZGZzX2JpbjVyYWRhcnMgeworCS8qIExpc3Qgb2YgYmluNSBlbGVtcyB0aGF0IGZhbGwgd2l0aGluIHRoZSB0aW1lIHdpbmRvdyAqLworCXN0cnVjdCBkZnNfYmluNWVsZW0gYnJfZWxlbXNbREZTX01BWF9CNV9TSVpFXTsKKwkvKiBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCAqLworCXVpbnQzMl90IGJyX2ZpcnN0ZWxlbTsKKwkvKiBJbmRleCBvZiB0aGUgbGFzdCBlbGVtZW50ICovCisJdWludDMyX3QgYnJfbGFzdGVsZW07CisJLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkZWxheSBsaW5lICovCisJdWludDMyX3QgYnJfbnVtZWxlbXM7CisJLyogT3JpZ2luYWwgaW5mbyBhYm91dCBiaW41IHB1bHNlICovCisJc3RydWN0IGRmc19iaW41cHVsc2UgYnJfcHVsc2U7Cit9OworCitzdHJ1Y3QgZGZzX3N0YXRzIHsKKwl1aW50MzJfdCBudW1fcmFkYXJfZGV0ZWN0czsgICAgIC8qIHRvdGFsIG51bS4gb2YgcmFkYXIgZGV0ZWN0cyAqLworCXVpbnQzMl90IHRvdGFsX3BoeV9lcnJvcnM7CisJdWludDMyX3Qgb3dsX3BoeV9lcnJvcnM7CisJdWludDMyX3QgcHJpX3BoeV9lcnJvcnM7CisJdWludDMyX3QgZXh0X3BoeV9lcnJvcnM7CisJdWludDMyX3QgZGNfcGh5X2Vycm9yczsKKwl1aW50MzJfdCBlYXJseV9leHRfcGh5X2Vycm9yczsKKwl1aW50MzJfdCBid2luZm9fZXJyb3JzOworCXVpbnQzMl90IGRhdGFsZW5fZGlzY2FyZHM7CisJdWludDMyX3QgcnNzaV9kaXNjYXJkczsKKwl1aW50NjRfdCBsYXN0X3Jlc2V0X3RzdGFtcDsKK307CisKKy8qCisgKiBUaGlzIGlzIGZvciBkZWJ1Z2dpbiBERlMgYXMgY29uc29sZSBsb2cgaW50ZXJmZXJlcyB3aXRoIChoZWxwcykKKyAqIHJhZGFyIGRldGVjdGlvbgorICovCisKKyNkZWZpbmUgREZTX0VWRU5UX0xPR19TSVpFICAgICAgMjU2CitzdHJ1Y3QgZGZzX2V2ZW50X2xvZyB7CisJdWludDY0X3QgdHM7ICAgICAgICAgICAgLyogNjQtYml0IGZ1bGwgdGltZXN0YW1wIGZyb20gaW50ZXJydXB0IHRpbWUgKi8KKwl1aW50MzJfdCBkaWZmX3RzOyAgICAgICAvKiBkaWZmIHRpbWVzdGFtcCAqLworCXVpbnQ4X3QgcnNzaTsgICAgICAgICAgIC8qIHJzc2kgb2YgcmFkYXIgZXZlbnQgKi8KKwl1aW50OF90IGR1cjsgICAgICAgICAgICAvKiBkdXJhdGlvbiBvZiByYWRhciBwdWxzZSAqLworfTsKKworI2RlZmluZSBBVEhfREZTX1JFU0VUX1RJTUVfUyA3CisjZGVmaW5lIEFUSF9ERlNfV0FJVCAoNjAgKyBBVEhfREZTX1JFU0VUX1RJTUVfUykgICAgICAgIC8qIDYwIHNlY29uZHMgKi8KKyNkZWZpbmUgQVRIX0RGU19XQUlUX01TICgoQVRIX0RGU19XQUlUKSAqIDEwMDApIC8qaW4gTVMgKi8KKworI2RlZmluZSBBVEhfREZTX1dFQVRIRVJfQ0hBTk5FTF9XQUlUX01JTiAxMCAgICAgLyoxMCBtaW51dGVzICovCisjZGVmaW5lIEFUSF9ERlNfV0VBVEhFUl9DSEFOTkVMX1dBSVRfUyAoQVRIX0RGU19XRUFUSEVSX0NIQU5ORUxfV0FJVF9NSU4gKiA2MCkKKyNkZWZpbmUgQVRIX0RGU19XRUFUSEVSX0NIQU5ORUxfV0FJVF9NUyBcCisJKChBVEhfREZTX1dFQVRIRVJfQ0hBTk5FTF9XQUlUX1MpICogMTAwMCkgICAgICAgLyppbiBNUyAqLworCisjZGVmaW5lIEFUSF9ERlNfV0FJVF9QT0xMX1BFUklPRCAyICAgICAgLyogMiBzZWNvbmRzICovCisvKmluIE1TICovCisjZGVmaW5lIEFUSF9ERlNfV0FJVF9QT0xMX1BFUklPRF9NUyAoKEFUSF9ERlNfV0FJVF9QT0xMX1BFUklPRCkgKiAxMDAwKQorI2RlZmluZSAgQVRIX0RGU19URVNUX1JFVFVSTl9QRVJJT0QgMiAgIC8qIDIgc2Vjb25kcyAqLworLyogbiBNUyAqLworI2RlZmluZSAgQVRIX0RGU19URVNUX1JFVFVSTl9QRVJJT0RfTVMgKChBVEhfREZTX1RFU1RfUkVUVVJOX1BFUklPRCkgKiAxMDAwKQorI2RlZmluZSBJU19DSEFOTkVMX1dFQVRIRVJfUkFEQVIoY2hhbikgKChjaGFuLT5pY19mcmVxID49IDU2MDApICYmIFwKKwkgKGNoYW4tPmljX2ZyZXEgPD0gNTY1MCkpCisKKyNkZWZpbmUgREZTX0RFQlVHX1RJTUVPVVRfUyAgICAgMzAgICAgICAvKiBkZWJ1ZyB0aW1lb3V0IGlzIDMwIHNlY29uZHMgKi8KKyNkZWZpbmUgREZTX0RFQlVHX1RJTUVPVVRfTVMgICAgKERGU19ERUJVR19USU1FT1VUX1MgKiAxMDAwKQorCisjZGVmaW5lIFJTU0lfUE9TU0lCTFlfRkFMU0UgICAgICAgICAgICAgIDUwCisjZGVmaW5lIFNFQVJDSF9GRlRfUkVQT1JUX1BFQUtfTUFHX1RIUlNIIDQwCisKK3N0cnVjdCBhdGhfZGZzIHsKKwl1aW50MzJfdCBkZnNfZGVidWdfbWFzazsgICAgICAgIC8qIGN1cnJlbnQgZGVidWcgYml0bWFzayAqLworCWludDE2X3QgZGZzX2N1cmNoYW5fcmFkaW5kZXg7ICAgLyogY3VyLiBjaGFubmVsIHJhZGFyIGluZGV4ICovCisJaW50MTZfdCBkZnNfZXh0Y2hhbl9yYWRpbmRleDsgICAvKiBleHRlbnNpb24gY2hhbm5lbCByYWRhciBpbmRleCAqLworCXVpbnQzMl90IGRmc2RvbWFpbjsgICAgIC8qIGN1ci4gREZTIGRvbWFpbiAqLworCXVpbnQzMl90IGRmc19wcm9jX3BoeWVycjsgICAgICAgLyogRmxhZ3MgZm9yIFBoeSBFcnJzIHRvIHByb2Nlc3MgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExY29tICppYzsKKwlTVEFJTFFfSEVBRCgsIGRmc19ldmVudCkgZGZzX2V2ZW50cTsgICAvKiBRIG9mIGZyZWUgZGZzIGV2ZW50IG9iamVjdHMgKi8KKwlkZnNxX2xvY2tfdCBkZnNfZXZlbnRxbG9jazsgICAgIC8qIExvY2sgZm9yIGZyZWUgZGZzIGV2ZW50IGxpc3QgKi8KKwlTVEFJTFFfSEVBRCgsIGRmc19ldmVudCkgZGZzX3JhZGFycTsgICAgLyogUSBvZiByYWRhciBldmVudHMgKi8KKwlkZnNxX2xvY2tfdCBkZnNfcmFkYXJxbG9jazsgICAgIC8qIExvY2sgZm9yIGRmcyBxICovCisJU1RBSUxRX0hFQUQoLCBkZnNfZXZlbnQpIGRmc19hcnE7ICAgICAgIC8qIFEgb2YgQVIgZXZlbnRzICovCisJZGZzcV9sb2NrX3QgZGZzX2FycWxvY2s7ICAgICAgICAvKiBMb2NrIGZvciBBUiBxICovCisKKwlzdHJ1Y3QgZGZzX2FyX3N0YXRlIGRmc19hcl9zdGF0ZTsgICAgICAgLyogQVIgc3RhdGUgKi8KKworCS8qIGRmc19yYWRhciAtIFBlci1DaGFubmVsIFJhZGFyIGRldGVjdG9yIHN0YXRlICovCisJc3RydWN0IGRmc19zdGF0ZSBkZnNfcmFkYXJbREZTX05VTV9SQURBUl9TVEFURVNdOworCisJLyogZGZzX3JhZGFyZiAtIE9uZSBmaWx0ZXIgZm9yIGVhY2ggcmFkYXIgcHVsc2UgdHlwZSAqLworCXN0cnVjdCBkZnNfZmlsdGVydHlwZSAqZGZzX3JhZGFyZltERlNfTUFYX1JBREFSX1RZUEVTXTsKKworCXN0cnVjdCBkZnNfaW5mbyBkZnNfcmluZm87ICAgICAgLyogU3RhdGUgdmFycyBmb3IgcmFkYXIgcHJvY2Vzc2luZyAqLworCXN0cnVjdCBkZnNfYmluNXJhZGFycyAqZGZzX2I1cmFkYXJzOyAgICAvKiBhcnJheSBvZiBiaW41IHJhZGFyIGV2ZW50cyAqLworCWludDhfdCAqKmRmc19yYWRhcnRhYmxlOyAgICAgICAgLyogbWFwIG9mIHJhZGFyIGR1cnMgdG8gZmlsdGVyIHR5cGVzICovCisjaWZuZGVmIEFUSF9ERlNfUkFEQVJfREVURUNUSU9OX09OTFkKKwlzdHJ1Y3QgZGZzX25vbGVsZW0gKmRmc19ub2w7ICAgIC8qIE5vbiBvY2N1cGFuY3kgbGlzdCBmb3IgcmFkYXIgKi8KKwlpbnQgZGZzX25vbF9jb3VudDsgICAgICAvKiBIb3cgbWFueSBpdGVtcz8gKi8KKyNlbmRpZgorCS8qIERlZmF1bHQgcGh5IHBhcmFtcyBwZXIgcmFkYXIgc3RhdGUgKi8KKwlzdHJ1Y3QgYXRoX2Rmc19waHllcnJfcGFyYW0gZGZzX2RlZmF1bHRwYXJhbXM7CisJc3RydWN0IGRmc19zdGF0cyBhdGhfZGZzX3N0YXRzOyAvKiBERlMgcmVsYXRlZCBzdGF0cyAqLworCXN0cnVjdCBkZnNfcHVsc2VsaW5lICpwdWxzZXM7ICAgLyogcHVsc2UgaGlzdG9yeSAqLworCXN0cnVjdCBkZnNfZXZlbnQgKmV2ZW50czsgICAgICAgLyogRXZlbnRzIHN0cnVjdHVyZSAqLworCisJdWludDMyX3QgYXRoX3JhZGFyX3Rhc2tzY2hlZDoxLCAgICAgICAvKiByYWRhciB0YXNrIGlzIHNjaGVkdWxlZCAqLworCQkgYXRoX2Rmc3dhaXQ6MSwgLyogd2FpdGluZyBvbiBjaGFubmVsIGZvciByYWRhciBkZXRlY3QgKi8KKwkJIGF0aF9kZnN0ZXN0OjE7IC8qIFRlc3QgdGltZXIgaW4gcHJvZ3Jlc3MgKi8KKwlzdHJ1Y3QgYXRoX2Rmc19jYXBzIGRmc19jYXBzOworCS8qIElFRUUgY2hhbiBudW0gdG8gcmV0dXJuIHRvIGFmdGVyCisJICogYSBkZnMgbXV0ZSB0ZXN0CisJICovCisJdWludDhfdCBhdGhfZGZzdGVzdF9pZWVlY2hhbjsKKyNpZm5kZWYgQVRIX0RGU19SQURBUl9ERVRFQ1RJT05fT05MWQorCXVpbnQzMl90IGF0aF9kZnNfY2FjX3RpbWU7IC8qIENBQyBwZXJpb2QgKi8KKwl1aW50MzJfdCBhdGhfZGZzdGVzdHRpbWU7IC8qIFRpbWUgdG8gc3RheSBvZmYgY2hhbiBkdXJpbmcgZGZzIHRlc3QgKi8KKwlvc190aW1lcl90IGF0aF9kZnN3YWl0dGltZXI7IC8qIGRmcyB3YWl0IHRpbWVyICovCisJb3NfdGltZXJfdCBhdGhfZGZzdGVzdHRpbWVyOyAvKiBkZnMgbXV0ZSB0ZXN0IHRpbWVyICovCisJb3NfdGltZXJfdCBhdGhfZGZzX2RlYnVnX3RpbWVyOyAvKiBkZnMgZGVidWcgdGltZXIgKi8KKwl1aW50OF90IGRmc19iYW5ncmFkYXI7CisjZW5kaWYKKwlvc190aW1lcl90IGF0aF9kZnNfdGFza190aW1lcjsgLyogZGZzIHdhaXQgdGltZXIgKi8KKwlpbnQgZHVyX211bHRpcGxpZXI7CisKKwl1aW50MTZfdCBhdGhfZGZzX2lzZGZzcmVnZG9tYWluOyAvKiB0cnVlIHdoZW4gd2UgYXJlIERGUyBkb21haW4gKi8KKwlpbnQgYXRoX2Rmc19mYWxzZV9yc3NpX3RocmVzOworCWludCBhdGhfZGZzX3BlYWtfbWFnOworCisJc3RydWN0IGRmc19ldmVudF9sb2cgcmFkYXJfbG9nW0RGU19FVkVOVF9MT0dfU0laRV07CisJaW50IGRmc19ldmVudF9sb2dfY291bnQ7CisJaW50IGRmc19ldmVudF9sb2dfb247CisJaW50IGRmc19waHllcnJfY291bnQ7ICAgLyogc2FtZSBhcyBudW1iZXIgb2YgUEhZIHJhZGFyIGludGVycnVwdHMgKi8KKwkvKgorCSAqIHdoZW4gVExWIGlzIHN1cHBvcnRlZCwgIyBvZiByYWRhciBldmVudHMgaWdub3JlZCBhZnRlciBUTFYgaXMgcGFyc2VkCisJICovCisJaW50IGRmc19waHllcnJfcmVqZWN0X2NvdW50OworCS8qIG51bWJlciBvZiByYWRhciBldmVudHMgcXVldWVkIGZvciBtYXRjaGluZyB0aGUgZmlsdGVycyAqLworCWludCBkZnNfcGh5ZXJyX3F1ZXVlZF9jb3VudDsKKwlpbnQgZGZzX3BoeWVycl9mcmVxX21pbjsKKwlpbnQgZGZzX3BoeWVycl9mcmVxX21heDsKKwlpbnQgZGZzX3BoeWVycl93NTNfY291bnRlcjsKKwkvKiBhbGxvdyBwdWxzZSBpZiB0aGV5IGFyZSB3aXRoaW4gbXVsdGlwbGUgb2YgUFJJIGZvciB0aGUgcmFkYXIgdHlwZSAqLworCWludCBkZnNfcHJpX211bHRpcGxpZXI7CisJaW50IGF0aF9kZnNfbm9sX3RpbWVvdXQ7CisJaW50IGRmc19wcmlfbXVsdGlwbGllcl9pbmk7ICAgICAvKiBkZnMgcHJpIGNvbmZpZ3VyYXRpb24gZnJvbSBpbmkgKi8KKwkvKgorCSAqIEZsYWcgdG8gaW5kaWNhdGUgaWYgREZTIHRlc3QgbW9kZSBpcyBlbmFibGVkIGFuZAorCSAqIGNoYW5uZWwgc3dpdGNoIGlzIGRpc2FibGVkLgorCSAqLworCWludDhfdCAgICAgZGlzYWJsZV9kZnNfY2hfc3dpdGNoOworfTsKKworLyogVGhpcyBzaG91bGQgbWF0Y2ggdGhlIHRhYmxlIGZyb20gaWZfYXRoLmMgKi8KK2VudW0geworCUFUSF9ERUJVR19ERlMgPSAweDAwMDAwMTAwLCAgICAgLyogTWluaW1hbCBERlMgZGVidWcgKi8KKwlBVEhfREVCVUdfREZTMSA9IDB4MDAwMDAyMDAsICAgIC8qIE5vcm1hbCBERlMgZGVidWcgKi8KKwlBVEhfREVCVUdfREZTMiA9IDB4MDAwMDA0MDAsICAgIC8qIE1heGltYWwgREZTIGRlYnVnICovCisJQVRIX0RFQlVHX0RGUzMgPSAweDAwMDAwODAwLCAgICAvKiBtYXRjaGVkIGZpbHRlcklEIGRpc3BsYXkgKi8KKworCUFUSF9ERUJVR19ERlNfUEhZRVJSID0gMHgwMDAwMTAwMCwgICAgICAvKiBwaHkgZXJyb3IgcGFyc2luZyAqLworCUFUSF9ERUJVR19ERlNfTk9MID0gMHgwMDAwMjAwMCwgLyogTk9MIHJlbGF0ZWQgZW50cmllcyAqLworCUFUSF9ERUJVR19ERlNfUEhZRVJSX1NVTSA9IDB4MDAwMDQwMDAsICAvKiBQSFkgZXJyb3Igc3VtbWFyeSAqLworCUFUSF9ERUJVR19ERlNfUEhZRVJSX1BLVCA9IDB4MDAwMDgwMDAsICAvKiBQSFkgZXJyb3IgcGF5bG9hZCAqLworCisJQVRIX0RFQlVHX0RGU19CSU41ID0gMHgwMDAxMDAwMCwgICAgICAgIC8qIGJpbjUgY2hlY2tzICovCisJQVRIX0RFQlVHX0RGU19CSU41X0ZGVCA9IDB4MDAwMjAwMDAsICAgIC8qIGJpbjUgRkZUIGNoZWNrICovCisJQVRIX0RFQlVHX0RGU19CSU41X1BVTFNFID0gMHgwMDA0MDAwMCwgIC8qIGJpbjUgcHVsc2UgY2hlY2sgKi8KK307CisKKyNkZWZpbmUgSVNfQ0hBTl9IVDQwKF9jKSAgICAgICAgSUVFRTgwMjExX0lTX0NIQU5fMTFOX0hUNDAoX2MpCisjZGVmaW5lIElTX0NIQU5fSFQ0MF9QTFVTKF9jKSAgIElFRUU4MDIxMV9JU19DSEFOXzExTl9IVDQwUExVUyhfYykKKyNkZWZpbmUgSVNfQ0hBTl9IVDQwX01JTlVTKF9jKSAgSUVFRTgwMjExX0lTX0NIQU5fMTFOX0hUNDBNSU5VUyhfYykKKworLyoKKyAqIGNoaXJwIG5vdGVzIQorICoKKyAqIFByZS1Tb3dsIGNoaXBzIGRvbid0IGRvIEZGVCByZXBvcnRzLCBzbyBjaGlycCBwdWxzZXMgc2ltcGx5IHNob3cgdXAKKyAqIGFzIGxvbmcgZHVyYXRpb24gcHVsc2VzLgorICoKKyAqIFRoZSBiaW41IGNoZWNraW5nIGNvZGUgd291bGQgc2ltcGx5IGxvb2sgZm9yIGEgY2hpcnAgcHVsc2Ugb2YgdGhlIGNvcnJlY3QKKyAqIGR1cmF0aW9uICh3aXRoaW4gTUlOX0JJTjVfRFVSIGFuZCBNQVhfQklONV9EVVIpIGFuZCBhZGQgaXQgdG8gdGhlICJjaGlycCIKKyAqIHBhdHRlcm4uCisgKgorICogRm9yIFNvd2wgYW5kIGxhdGVyLCBhbiBGRlQgd2FzIGRvbmUgb24gbG9uZ2VyIGR1cmF0aW9uIGZyYW1lcy4gIElmIHRob3NlCisgKiBmcmFtZXMgbG9va2VkIGxpa2UgYSBjaGlycCwgdGhlaXIgZHVyYXRpb24gd2FzIGFkanVzdGVkIHRvIGZhbGwgd2l0aGluCisgKiB0aGUgY2hpcnAgZHVyYXRpb24gbGltaXRzLiAgSWYgdGhlIHB1bHNlIGZhaWxlZCB0aGUgY2hpcnAgdGVzdCAoaXQgaGFkCisgKiBubyBGRlQgZGF0YSBvciB0aGUgRkZUIGRpZG4ndCBtZWV0IHRoZSBjaGlycGluZyByZXF1aXJlbWVudHMpIHRoZW4gdGhlCisgKiBwdWxzZSBkdXJhdGlvbiB3YXMgYWRqdXN0ZWQgdG8gYmUgZ3JlYXRlciB0aGFuIE1BWF9CSU41X0RVUiwgc28gaXQKKyAqIHdvdWxkIGFsd2F5cyBmYWlsIGNoaXJwIGRldGVjdGlvbi4KKyAqCisgKiBUaGlzIGlzIHByZXR0eSBob3JyaWJsZS4KKyAqCisgKiBUaGUgZXZlbnR1YWwgZ29hbCBmb3IgY2hpcnAgaGFuZGxpbmcgaXMgdGh1czoKKyAqCisgKiArIEluIGNhc2Ugc29tZW9uZSBldmVyIHdhbnRzIHRvIGRvIGNoaXJwIGRldGVjdGlvbiB3aXRoIHRoaXMgY29kZSBvbgorICogICBjaGlwcyB0aGF0IGRvbid0IHN1cHBvcnQgY2hpcnAgZGV0ZWN0aW9uLCB5b3UgY2FuIHN0aWxsIGRvIGl0IGJhc2VkCisgKiAgIG9uIHB1bHNlIGR1cmF0aW9uLiAgVGhhdCdzIHlvdXIgcHJvYmxlbSB0byBzb2x2ZS4KKyAqCisgKiArIEZvciBjaGlwcyB0aGF0IGRvIGhhcmR3YXJlIGNoaXJwIGRldGVjdGlvbiBvciBGRlQsIHRoZSAiZG9fY2hlY2tfY2hpcnAiCisgKiAgIGJpdCBzaG91bGQgYmUgc2V0LgorICoKKyAqICsgVGhlbiwgZWl0aGVyIGlzX2h3X2NoaXJwIG9yIGlzX3N3X2NoaXJwIGlzIHNldCwgaW5kaWNhdGluZyB0aGF0CisgKiAgIHRoZSBoYXJkd2FyZSBvciBzb2Z0d2FyZSBwb3N0LXByb2Nlc3Npbmcgb2YgdGhlIGNoaXJwIGV2ZW50IGZvdW5kCisgKiAgIHRoYXQgaW5kZWVkIGl0IHdhcyBhIGNoaXJwLgorICoKKyAqICsgRmluYWxseSwgdGhlIGJpbjUgY29kZSBzaG91bGQganVzdCBjaGVjayB3aGV0aGVyIHRoZSBjaGlycCBiaXRzIGFyZQorICogICBzZXQgYW5kIGJlaGF2ZSBhcHByb3ByaWF0ZWx5LCBmYWxsaW5nIGJhY2sgb250byB0aGUgZHVyYXRpb24gY2hlY2tzCisgKiAgIGlmIHNvbWVvbmUgd2lzaGVzIHRvIHVzZSB0aGlzIG9uIG9sZGVyIGhhcmR3YXJlIChvciB3aXRoIGRpc2FibGVkCisgKiAgIEZGVHMsIGZvciB3aGF0ZXZlciByZWFzb24uKQorICovCisvKgorICogWFhYIFRPRE86CisgKgorICogKyBhZGQgZHVyYXRpb24gaW4gdVMgYW5kIHJhdyBkdXJhdGlvbiwgc28gdGhlIFBIWSBlcnJvciBwYXJzaW5nCisgKiAgIGNvZGUgaXMgcmVzcG9uc2libGUgZm9yIGRvaW5nIHRoZSBkdXJhdGlvbiBjYWxjdWxhdGlvbjsKKyAqICsgYWRkIHRzIGluIHJhdyBhbmQgY29ycmVjdGVkLCBzbyB0aGUgUEhZIGVycm9yIHBhcnNpbmcKKyAqICAgY29kZSBpcyByZXNwb25zaWJsZSBmb3IgZG9pbmcgdGhlIG9mZnNldHRpbmcsIG5vdCB0aGUgcmFkYXIKKyAqICAgZXZlbnQgY29kZS4KKyAqLworc3RydWN0IGRmc19waHlfZXJyIHsKKwl1aW50NjRfdCBmdWxsdHNmOyAgICAgICAvKiA2NC1iaXQgVFNGIGFzIHJlYWQgZnJvbSBNQUMgKi8KKworCXVpbnQzMl90IGlzX3ByaToxLCAgICAgIC8qIGRldGVjdGVkIG9uIHByaW1hcnkgY2hhbm5lbCAqLworCQkgaXNfZXh0OjEsICAgIC8qIGRldGVjdGVkIG9uIGV4dGVuc2lvbiBjaGFubmVsICovCisJCSBpc19kYzoxLCAgICAgLyogZGV0ZWN0ZWQgYXQgREMgKi8KKwkJIGlzX2Vhcmx5OjEsICAvKiBlYXJseSBkZXRlY3QgKi8KKwkJIGRvX2NoZWNrX2NoaXJwOjEsIC8qIHdoZXRoZXIgdG8gY2hlY2sgaHdfY2hpcnAvc3dfY2hpcnAgKi8KKwkJIGlzX2h3X2NoaXJwOjEsIC8qIGhhcmR3YXJlLWRldGVjdGVkIGNoaXJwICovCisJCSBpc19zd19jaGlycDoxOyAvKiBzb2Z0d2FyZSBkZXRlY3RlZCBjaGlycCAqLworCisJdWludDMyX3QgcnNfdHN0YW1wOyAgICAgLyogMzIgYml0IFRTRiBmcm9tIFJYIGRlc2NyaXB0b3IgKGV2ZW50KSAqLworCXVpbnQzMl90IGZyZXE7ICAgICAgICAgIC8qIENlbnRyZSBmcmVxdWVuY3kgb2YgZXZlbnQgLSBLSHogKi8KKwl1aW50MzJfdCBmcmVxX2xvOyAgICAgICAvKiBMb3dlciBib3VuZHMgb2YgZnJlcXVlbmN5IC0gS0h6ICovCisJdWludDMyX3QgZnJlcV9oaTsgICAgICAgLyogVXBwZXIgYm91bmRzIG9mIGZyZXF1ZW5jeSAtIEtIeiAqLworCisJdWludDhfdCByc3NpOyAgICAgICAgICAgLyogcHVsc2UgUlNTSSAqLworCXVpbnQ4X3QgZHVyOyAgICAgICAgICAgIC8qIHB1bHNlIGR1cmF0aW9uLCByYXcgKG5vdCB1UykgKi8KKwlpbnQgc2lkeDsgICAgICAgICAgICAgICAvKiBQdWxzZSBJbmRleCBhcyBpbiByYWRhciBzdW1tYXJ5IHJlcG9ydCAqLworfTsKKworLyogQXR0YWNoLCBkZXRhY2gsIGhhbmRsZSBpb2N0bCBwcm90b3R5cGVzICovCisKK2ludCBkZnNfZ2V0X3RocmVzaG9sZHMoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsCisJCSAgICAgICBzdHJ1Y3QgYXRoX2Rmc19waHllcnJfcGFyYW0gKnBhcmFtKTsKK2ludCBkZnNfc2V0X3RocmVzaG9sZHMoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsCisJCSAgICAgICBjb25zdCB1aW50MzJfdCB0aHJlc2h0eXBlLCBjb25zdCB1aW50MzJfdCB2YWx1ZSk7CisKKy8qIFBIWSBlcnJvciBhbmQgcmFkYXIgZXZlbnQgaGFuZGxpbmcgKi8KK2ludCBkZnNfcHJvY2Vzc19yYWRhcmV2ZW50KHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbik7CisKKy8qIE5vbiBvY2N1cGFuY3kgKE5PTCkgaGFuZGxpbmcgcHJvdG90eXBlcyAqLwordm9pZCBkZnNfbm9sX2FkZGNoYW4oc3RydWN0IGF0aF9kZnMgKmRmcywgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAorCQkgICAgIHVpbnQzMl90IGRmc19ub2xfdGltZW91dCk7Cit2b2lkIGRmc19nZXRfbm9sKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCBkZnNyZXFfbm9sZWxlbSAqZGZzX25vbCwKKwkJIGludCAqbmNoYW4pOwordm9pZCBkZnNfc2V0X25vbChzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzcmVxX25vbGVsZW0gKmRmc19ub2wsCisJCSBpbnQgbmNoYW4pOwordm9pZCBkZnNfbm9sX3VwZGF0ZShzdHJ1Y3QgYXRoX2RmcyAqZGZzKTsKK3ZvaWQgZGZzX25vbF90aW1lcl9jbGVhbnVwKHN0cnVjdCBhdGhfZGZzICpkZnMpOworCisvKiBGQ0MgQmluNSBkZXRlY3Rpb24gcHJvdG90eXBlcyAqLworaW50IGRmc19iaW41X2NoZWNrX3B1bHNlKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCBkZnNfZXZlbnQgKnJlLAorCQkJIHN0cnVjdCBkZnNfYmluNXJhZGFycyAqYnIpOworaW50IGRmc19iaW41X2FkZHB1bHNlKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCBkZnNfYmluNXJhZGFycyAqYnIsCisJCSAgICAgIHN0cnVjdCBkZnNfZXZlbnQgKnJlLCB1aW50NjRfdCB0aGlzdHMpOworaW50IGRmc19iaW41X2NoZWNrKHN0cnVjdCBhdGhfZGZzICpkZnMpOworaW50IGRmc19jaGVja19jaGlycGluZyhzdHJ1Y3QgYXRoX2RmcyAqZGZzLCB2b2lkICpidWYsCisJCSAgICAgICB1aW50MTZfdCBkYXRhbGVuLCBpbnQgaXNfY3RsLAorCQkgICAgICAgaW50IGlzX2V4dCwgaW50ICpzbG9wZSwgaW50ICppc19kYyk7Cit1aW50OF90IGRmc19yZXRhaW5fYmluNV9idXJzdF9wYXR0ZXJuKHN0cnVjdCBhdGhfZGZzICpkZnMsIHVpbnQzMl90IGRpZmZfdHMsCisJCQkJICAgICAgdWludDhfdCBvbGRfZHVyKTsKK3VpbnQ4X3QgZGZzX3JldGFpbl9iaW41X2J1cnN0X3BhdHRlcm4oc3RydWN0IGF0aF9kZnMgKmRmcywgdWludDMyX3QgZGlmZl90cywKKwkJCQkgICAgICB1aW50OF90IG9sZF9kdXIpOworaW50IGRmc19nZXRfcmFuZG9tX2JpbjVfZHVyKHN0cnVjdCBhdGhfZGZzICpkZnMsIHVpbnQ2NF90IHRzdGFtcCk7CisKKy8qIERlYnVnIHByb3RvdHlwZXMgKi8KK3ZvaWQgZGZzX3ByaW50X2RlbGF5bGluZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzX2RlbGF5bGluZSAqZGwpOwordm9pZCBkZnNfcHJpbnRfbm9sKHN0cnVjdCBhdGhfZGZzICpkZnMpOwordm9pZCBkZnNfcHJpbnRfZmlsdGVycyhzdHJ1Y3QgYXRoX2RmcyAqZGZzKTsKK3ZvaWQgZGZzX3ByaW50X2FjdGl2aXR5KHN0cnVjdCBhdGhfZGZzICpkZnMpOworb3NfdGltZXJfZnVuYyhkZnNfZGVidWdfdGltZW91dCk7Cit2b2lkIGRmc19wcmludF9maWx0ZXIoc3RydWN0IGF0aF9kZnMgKmRmcywgc3RydWN0IGRmc19maWx0ZXIgKnJmKTsKKworLyogTWlzYyBwcm90b3R5cGVzICovCit1aW50MzJfdCBkZnNfcm91bmQoaW50MzJfdCB2YWwpOworc3RydWN0IGRmc19zdGF0ZSAqZGZzX2dldGNoYW5zdGF0ZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCB1aW50OF90ICppbmRleCwKKwkJCQkgICBpbnQgZXh0X2NoX2ZsYWcpOworCisvKiBSZXNldCBhbmQgaW5pdCBkYXRhIHN0cnVjdHVyZXMgKi8KKworaW50IGRmc19pbml0X3JhZGFyX2ZpbHRlcnMoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsCisJCQkgICBzdHJ1Y3QgYXRoX2Rmc19yYWRhcl90YWJfaW5mbyAqcmFkYXJfaW5mbyk7Cit2b2lkIGRmc19yZXNldF9hbGxkZWxheWxpbmVzKHN0cnVjdCBhdGhfZGZzICpkZnMpOwordm9pZCBkZnNfcmVzZXRfZGVsYXlsaW5lKHN0cnVjdCBkZnNfZGVsYXlsaW5lICpkbCk7Cit2b2lkIGRmc19yZXNldF9maWx0ZXJfZGVsYXlsaW5lcyhzdHJ1Y3QgZGZzX2ZpbHRlcnR5cGUgKmRmdCk7Cit2b2lkIGRmc19yZXNldF9yYWRhcnEoc3RydWN0IGF0aF9kZnMgKmRmcyk7CisKKy8qIERldGVjdGlvbiBhbGdvcml0aG0gcHJvdG90eXBlcyAqLwordm9pZCBkZnNfYWRkX3B1bHNlKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCBkZnNfZmlsdGVyICpyZiwKKwkJICAgc3RydWN0IGRmc19ldmVudCAqcmUsIHVpbnQzMl90IGRlbHRhVCwgdWludDY0X3QgdGhpc190cyk7CisKK2ludCBkZnNfYmluX2ZpeGVkcGF0dGVybl9jaGVjayhzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzX2ZpbHRlciAqcmYsCisJCQkgICAgICAgdWludDMyX3QgZHVyLCBpbnQgZXh0X2NoYW5fZmxhZyk7CitpbnQgZGZzX2Jpbl9jaGVjayhzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzX2ZpbHRlciAqcmYsCisJCSAgdWludDMyX3QgZGVsdGFULCB1aW50MzJfdCBkdXIsIGludCBleHRfY2hhbl9mbGFnKTsKKworaW50IGRmc19iaW5fcHJpX2NoZWNrKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCBkZnNfZmlsdGVyICpyZiwKKwkJICAgICAgc3RydWN0IGRmc19kZWxheWxpbmUgKmRsLCB1aW50MzJfdCBzY29yZSwKKwkJICAgICAgdWludDMyX3QgcmVmcHJpLCB1aW50MzJfdCByZWZkdXIsIGludCBleHRfY2hhbl9mbGFnLAorCQkgICAgICBpbnQgZnVuZGFtZW50YWxwcmkpOworaW50IGRmc19zdGFnZ2VyZWRfY2hlY2soc3RydWN0IGF0aF9kZnMgKmRmcywgc3RydWN0IGRmc19maWx0ZXIgKnJmLAorCQkJdWludDMyX3QgZGVsdGFULCB1aW50MzJfdCB3aWR0aCk7CisvKiBGYWxzZSBkZXRlY3Rpb24gcmVkdWN0aW9uICovCitpbnQgZGZzX2dldF9wcmlfbWFyZ2luKHN0cnVjdCBhdGhfZGZzICpkZnMsIGludCBpc19leHRjaGFuX2RldGVjdCwKKwkJICAgICAgIGludCBpc19maXhlZF9wYXR0ZXJuKTsKK2ludCBkZnNfZ2V0X2ZpbHRlcl90aHJlc2hvbGQoc3RydWN0IGF0aF9kZnMgKmRmcywgc3RydWN0IGRmc19maWx0ZXIgKnJmLAorCQkJICAgICBpbnQgaXNfZXh0Y2hhbl9kZXRlY3QpOworCisvKiBBUiByZWxhdGVkIHByb3RvdHlwZXMgKi8KKworLyogQ29tbWVudGluZyBvdXQgc2luY2UgYWxsIHRoZSBhciBmdW5jdGlvbnMgYXJlIG9ic29sZXRlIGFuZAorICogdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhcyBwYXJ0IG9mIGRmc19hci5jCisgKiB2b2lkIGRmc19wcm9jZXNzX2FyX2V2ZW50KHN0cnVjdCBhdGhfZGZzICpkZnMsCisgKglzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4pOworICovCisvKiBDb21tZW50aW5nIG91dCBzaW5jZSBhbGwgdGhlIGFyIGZ1bmN0aW9ucyBhcmUgb2Jzb2xldGUgYW5kCisgKiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFzIHBhcnQgb2YgZGZzX2FyLmMKKyAqIHZvaWQgICAgICAgIGF0aF9hcl9kaXNhYmxlKHN0cnVjdCBhdGhfZGZzICpkZnMpOworICovCisvKiBDb21tZW50aW5nIG91dCBzaW5jZSBhbGwgdGhlIGFyIGZ1bmN0aW9ucyBhcmUgb2Jzb2xldGUgYW5kCisgKiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFzIHBhcnQgb2YgZGZzX2FyLmMKKyAqIHZvaWQgICAgICAgIGF0aF9hcl9lbmFibGUoc3RydWN0IGF0aF9kZnMgKmRmcyk7CisgKi8KK3ZvaWQgZGZzX3Jlc2V0X2FyKHN0cnVjdCBhdGhfZGZzICpkZnMpOworLyogQ29tbWVudGluZyBvdXQgc2luY2UgYWxsIHRoZSBhciBmdW5jdGlvbnMgYXJlIG9ic29sZXRlIGFuZAorICogdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhcyBwYXJ0IG9mIGRmc19hci5jCisgKiB2b2lkICAgICAgICBkZnNfcmVzZXRfYXJxKHN0cnVjdCBhdGhfZGZzICpkZnMpOworICovCisKK3N0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqaWVlZTgwMjExX2dldF9leHRjaGFuKHN0cnVjdCBpZWVlODAyMTFjb20gKmljKTsKKworI2VuZGlmIC8qIF9ERlNfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvc2FwL2Rmcy9pbmMvZGZzX2ludGVyZmFjZS5oIGIvY29yZS9zYXAvZGZzL2luYy9kZnNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwYTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2FwL2Rmcy9pbmMvZGZzX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCQkJZGZzX2ludGVyZmFjZS5oCisKKyAgIE9WRVJWSUVXOgorCisgICBTb3VyY2UgY29kZSBib3Jyb3dlZCBmcm9tIFFDQV9NQUlOIERGUyBtb2R1bGUKKworICAgREVQRU5ERU5DSUVTOgorCisgICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBfREZTX19JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgX0RGU19fSU5URVJGQUNFX0hfCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIG9ubHkgZnVuY3Rpb25zIGV4cG9ydGVkIHRvIHRoZSB1cHBlciAoZGV2aWNlKSBsYXllci4KKyAqLworCisvKgorICogRVhQT1JUX1NZTUJPTChkZnNfYXR0YWNoKTsKKyAqIEVYUE9SVF9TWU1CT0woZGZzX2RldGFjaCk7CisgKiBFWFBPUlRfU1lNQk9MKGRmc19yYWRhcl9lbmFibGUpOworICogRVhQT1JUX1NZTUJPTChkZnNfcHJvY2Vzc19waHllcnIpOworICogRVhQT1JUX1NZTUJPTChkZnNfY29udHJvbCk7CisgKiBFWFBPUlRfU1lNQk9MKGRmc19jbGVhcl9zdGF0cyk7CisgKiBFWFBPUlRfU1lNQk9MKGRmc191c2Vub2wpOworICogRVhQT1JUX1NZTUJPTChkZnNfaXNkZnNyZWdkb21haW4pOworICovCisKKy8qCisgKiBUaGVzZSBhcmUgZXhwb3J0ZWQgYnV0IG5vdCBjdXJyZW50bHkgZGVmaW5lZCBoZXJlOyB0aGVzZSBzaG91bGQgYmUKKyAqIGV2YWx1YXRlZC4KKyAqCisgKiBFWFBPUlRfU1lNQk9MKGRmc19wcm9jZXNzX2FyX2V2ZW50KTsgLS0gbGVnYWN5IGFkYXB0aXZlIHJhZGlvIHByb2Nlc3NpbmcKKyAqIEVYUE9SVF9TWU1CT0woYXRoX2FyX2Rpc2FibGUpOworICogRVhQT1JUX1NZTUJPTChhdGhfYXJfZW5hYmxlKTsKKyAqIEVYUE9SVF9TWU1CT0woZGZzX2dldF90aHJlc2hvbGRzKTsKKyAqIEVYUE9SVF9TWU1CT0woZGZzX2luaXRfcmFkYXJfZmlsdGVycyk7CisgKiBFWFBPUlRfU1lNQk9MKGRmc19nZXRjaGFuc3RhdGUpOworICovCisKK3VpbnQxNl90IGRmc19pc2Rmc3JlZ2RvbWFpbihzdHJ1Y3QgaWVlZTgwMjExY29tICppYyk7CitpbnQgZGZzX2F0dGFjaChzdHJ1Y3QgaWVlZTgwMjExY29tICppYyk7Cit2b2lkIGRmc19kZXRhY2goc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpOworaW50IGRmc19yYWRhcl9lbmFibGUoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsCisJCSAgICAgc3RydWN0IGF0aF9kZnNfcmFkYXJfdGFiX2luZm8gKnJpKTsKK2ludCBkZnNfcmFkYXJfZGlzYWJsZShzdHJ1Y3QgaWVlZTgwMjExY29tICppYyk7CitleHRlcm4gdm9pZCBkZnNfcHJvY2Vzc19waHllcnIoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgICB1aW50MTZfdCBkYXRhbGVuLCB1aW50OF90IHJzc2ksIHVpbnQ4X3QgZXh0X3Jzc2ksCisJCQkgICAgICAgdWludDMyX3QgcnNfdHN0YW1wLCB1aW50NjRfdCBmdWxsdHNmLAorCQkJICAgICAgIGJvb2wgZW5hYmxlX2xvZyk7CitpbnQgZGZzX2NvbnRyb2woc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsIHVfaW50IGlkLCB2b2lkICppbmRhdGEsCisJCXVpbnQzMl90IGluc2l6ZSwgdm9pZCAqb3V0ZGF0YSwgdWludDMyX3QgKm91dHNpemUpOwordm9pZCBkZnNfY2xlYXJfc3RhdHMoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpOworI2lmIDAKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGZvciBGQ0MgQmluIDEtNCBwdWxzZXMgKi8KK3N0cnVjdCBkZnNfcHVsc2UgZGZzX2ZjY19yYWRhcnNbXSA9IHsKKwkvKiBGQ0MgVFlQRSAxICovCisJLyogezE4LCAgMSwgIDMyNSwgMTkzMCwgMCwgIDYsICA3LCAgMCwgIDEsIDE4LCAgMCwgMywgIDB9LCAvLyA1MTggdG8gMzA2NiAqLworCXsxOCwgMSwgNzAwLCA3MDAsIDAsIDYsIDUsIDAsIDEsIDE4LCAwLCAzLCAxLCAwfSwKKwl7MTgsIDEsIDM1MCwgMzUwLCAwLCA2LCA1LCAwLCAxLCAxOCwgMCwgMywgMCwgMH0sCisKKwkvKiBGQ0MgVFlQRSA2ICovCisJLyogezksICAgMSwgMzAwMywgMzAwMywgMSwgIDcsICA1LCAgMCwgIDEsIDE4LCAgMCwgMCwgIDF9LCAvLyAzMzMgKy8tIDcgdXMgKi8KKwl7OSwgMSwgMzAwMywgMzAwMywgMSwgNywgNSwgMCwgMSwgMTgsIDAsIDAsIDEsIDF9LAorCisJLyogRkNDIFRZUEUgMiAqLworCXsyMywgNSwgNDM0NywgNjY2NiwgMCwgMTgsIDExLCAwLCA3LCAyMiwgMCwgMywgMCwgMn0sCisKKwkvKiBGQ0MgVFlQRSAzICovCisJezE4LCAxMCwgMjAwMCwgNTAwMCwgMCwgMjMsIDgsIDYsIDEzLCAyMiwgMCwgMywgMCwgNX0sCisKKwkvKiBGQ0MgVFlQRSA0ICovCisJezE2LCAxNSwgMjAwMCwgNTAwMCwgMCwgMjUsIDcsIDExLCAyMywgMjIsIDAsIDMsIDAsIDExfSwKK307CisKK3N0cnVjdCBkZnNfcHVsc2UgZGZzX21razRfcmFkYXJzW10gPSB7CisJLyogZm9sbG93aW5nIHR3byBmaWx0ZXJzIGFyZSBzcGVjaWZpYyB0byBKYXBhbi9NS0s0ICovCisvKiAgICB7MTgsICAxLCAgNzIwLCAgNzIwLCAxLCAgNiwgIDYsICAwLCAgMSwgMTgsICAwLCAzLCAxN30sIC8vIDEzODkgKy8tIDYgdXMgKi8KKy8qICAgIHsxOCwgIDQsICAyNTAsICAyNTAsIDEsIDEwLCAgNSwgIDEsICA2LCAxOCwgIDAsIDMsIDE4fSwgLy8gNDAwMCArLy0gNiB1cyAqLworLyogICAgezE4LCAgNSwgIDI2MCwgIDI2MCwgMSwgMTAsICA2LCAgMSwgIDYsIDE4LCAgMCwgMywgMTl9LCAvLyAzODQ2ICsvLSA3IHVzICovCisJezE4LCAxLCA3MjAsIDcyMCwgMCwgNiwgNiwgMCwgMSwgMTgsIDAsIDMsIDAsIDE3fSwgICAgICAvKiAxMzg5ICsvLSA2IHVzICovCisJezE4LCA0LCAyNTAsIDI1MCwgMCwgMTAsIDUsIDEsIDYsIDE4LCAwLCAzLCAwLCAxOH0sICAgICAvKiA0MDAwICsvLSA2IHVzICovCisJezE4LCA1LCAyNjAsIDI2MCwgMCwgMTAsIDYsIDEsIDYsIDE4LCAwLCAzLCAxLCAxOX0sICAgICAvKiAzODQ2ICsvLSA3IHVzICovCisKKwkvKiBmb2xsb3dpbmcgZmlsdGVycyBhcmUgY29tbW9uIHRvIGJvdGggRkNDIGFuZCBKQVBBTiAqLworCisJLyogRkNDIFRZUEUgMSAqLworCS8qIHsxOCwgIDEsICAzMjUsIDE5MzAsIDAsICA2LCAgNywgIDAsICAxLCAxOCwgIDAsIDMsICAwfSwgLy8gNTE4IHRvIDMwNjYgKi8KKwl7MTgsIDEsIDcwMCwgNzAwLCAwLCA2LCA1LCAwLCAxLCAxOCwgMCwgMywgMSwgMH0sCisJezE4LCAxLCAzNTAsIDM1MCwgMCwgNiwgNSwgMCwgMSwgMTgsIDAsIDMsIDAsIDB9LAorCisJLyogRkNDIFRZUEUgNiAqLworCS8qIHs5LCAgIDEsIDMwMDMsIDMwMDMsIDEsICA3LCAgNSwgIDAsICAxLCAxOCwgIDAsIDAsICAxfSwgLy8gMzMzICsvLSA3IHVzICovCisJezksIDEsIDMwMDMsIDMwMDMsIDEsIDcsIDUsIDAsIDEsIDE4LCAwLCAwLCAxLCAxfSwKKworCS8qIEZDQyBUWVBFIDIgKi8KKwl7MjMsIDUsIDQzNDcsIDY2NjYsIDAsIDE4LCAxMSwgMCwgNywgMjIsIDAsIDMsIDAsIDJ9LAorCisJLyogRkNDIFRZUEUgMyAqLworCXsxOCwgMTAsIDIwMDAsIDUwMDAsIDAsIDIzLCA4LCA2LCAxMywgMjIsIDAsIDMsIDAsIDV9LAorCisJLyogRkNDIFRZUEUgNCAqLworCXsxNiwgMTUsIDIwMDAsIDUwMDAsIDAsIDI1LCA3LCAxMSwgMjMsIDIyLCAwLCAzLCAwLCAxMX0sCit9OworCitzdHJ1Y3QgZGZzX2JpbjVwdWxzZSBkZnNfZmNjX2JpbjVwdWxzZXNbXSA9IHsKKwl7NCwgMjgsIDEwNSwgMTIsIDIyLCA1fSwKK307CisKK3N0cnVjdCBkZnNfYmluNXB1bHNlIGRmc19qcG5fYmluNXB1bHNlc1tdID0geworCXs1LCAyOCwgMTA1LCAxMiwgMjIsIDV9LAorfTsKKworc3RydWN0IGRmc19wdWxzZSBkZnNfZXRzaV9yYWRhcnNbXSA9IHsKKworCS8qIFRZUEUgc3RhZ2dlcmVkIHB1bHNlICovCisJLyogMC44LTJ1cywgMi0zIGJ1cnN0cywzMDAtNDAwIFBSRiwgMTAgcHVsc2VzIGVhY2ggKi8KKwl7MzAsIDIsIDMwMCwgNDAwLCAyLCAzMCwgMywgMCwgNSwgMTUsIDAsIDAsIDEsIDMxfSwgICAgIC8qIFR5cGUgNSAqLworCS8qIDAuOC0ydXMsIDItMyBidXJzdHMsIDQwMC0xMjAwIFBSRiwgMTUgcHVsc2VzIGVhY2ggKi8KKwl7MzAsIDIsIDQwMCwgMTIwMCwgMiwgMzAsIDcsIDAsIDUsIDE1LCAwLCAwLCAwLCAzMn0sICAgIC8qIFR5cGUgNiAqLworCisJLyogY29uc3RhbnQgUFJGIGJhc2VkICovCisJLyogMC44LTV1cywgMjAwICAzMDAgUFJGLCAxMCBwdWxzZXMgKi8KKwl7MTAsIDUsIDIwMCwgNDAwLCAwLCAyNCwgNSwgMCwgOCwgMTUsIDAsIDAsIDIsIDMzfSwgICAgIC8qIFR5cGUgMSAqLworCXsxMCwgNSwgNDAwLCA2MDAsIDAsIDI0LCA1LCAwLCA4LCAxNSwgMCwgMCwgMiwgMzd9LCAgICAgLyogVHlwZSAxICovCisJezEwLCA1LCA2MDAsIDgwMCwgMCwgMjQsIDUsIDAsIDgsIDE1LCAwLCAwLCAyLCAzOH0sICAgICAvKiBUeXBlIDEgKi8KKwl7MTAsIDUsIDgwMCwgMTAwMCwgMCwgMjQsIDUsIDAsIDgsIDE1LCAwLCAwLCAyLCAzOX0sICAgIC8qIFR5cGUgMSAqLworLyogIHsxMCwgNSwgICAyMDAsIDEwMDAsIDAsIDI0LCAgNSwgIDAsICA4LCAxNSwgMCwgICAwLCAyLCAzM30sICovCisKKwkvKiAwLjgtMTV1cywgMjAwLTE2MDAgUFJGLCAxNSBwdWxzZXMgKi8KKwl7MTUsIDE1LCAyMDAsIDE2MDAsIDAsIDI0LCA4LCAwLCAxOCwgMjQsIDAsIDAsIDAsIDM0fSwgIC8qIFR5cGUgMiAqLworCisJLyogMC44LTE1dXMsIDIzMDAtNDAwMCBQUkYsIDI1IHB1bHNlcyAqLworCXsyNSwgMTUsIDIzMDAsIDQwMDAsIDAsIDI0LCAxMCwgMCwgMTgsIDI0LCAwLCAwLCAwLCAzNX0sICAgICAgICAvKiBUeXBlIDMgKi8KKworCS8qIDIwLTMwdXMsIDIwMDAtNDAwMCBQUkYsIDIwIHB1bHNlcyAqLworCXsyMCwgMzAsIDIwMDAsIDQwMDAsIDAsIDI0LCA2LCAxOSwgMzMsIDI0LCAwLCAwLCAwLCAzNn0sICAgICAgICAvKiBUeXBlIDQgKi8KK307CisjZW5kaWYKKyNlbmRpZiAvKiBfREZTX19JTlRFUkZBQ0VfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvc2FwL2Rmcy9pbmMvcmFkYXJfZmlsdGVycy5oIGIvY29yZS9zYXAvZGZzL2luYy9yYWRhcl9maWx0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzN2QwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2FwL2Rmcy9pbmMvcmFkYXJfZmlsdGVycy5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCQkJcmFkYXJfZmlsdGVycy5oCisKKyAgIE9WRVJWSUVXOgorCisgICBTb3VyY2UgY29kZSBib3Jyb3dlZCBmcm9tIFFDQV9NQUlOIERGUyBtb2R1bGUKKworICAgREVQRU5ERU5DSUVTOgorCisgICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RydWN0IGRmc19wdWxzZSBkZnNfZmNjX3JhZGFyc1tdID0geworCS8qIEZDQyBORVcgVFlQRSAwICovCisJLyogezE4LCAgMSwgIDMyNSwgMTkzMCwgMCwgIDYsICA3LCAgMCwgIDEsIDE4LCAgMCwgMywgIDB9LCAvLyA1MTggdG8gMzA2NiAqLworCXsxOCwgMSwgNzAwLCA3MDAsIDAsIDYsIDUsIDAsIDEsIDE4LCAwLCAzLCAxLCAwfSwKKwl7MTgsIDEsIDM1MCwgMzUwLCAwLCA2LCA1LCAwLCAxLCAxOCwgMCwgMywgMCwgMH0sCisKKwkvKiBGQ0MgVFlQRSA2ICovCisJLyogezksICAgMSwgMzAwMywgMzAwMywgMSwgIDcsICA1LCAgMCwgIDEsIDE4LCAgMCwgMCwgIDF9LCAvLyAzMzMgKy8tIDcgdXMgKi8KKwl7OSwgMSwgMzAwMywgMzAwMywgMSwgNywgNSwgMCwgMSwgMTgsIDAsIDAsIDEsIDF9LAorCisJLyogRkNDIFRZUEUgMiAqLworCXsyMywgNSwgNDM0NywgNjY2NiwgMCwgMTgsIDgsIDAsIDcsIDIyLCAwLCAzLCAwLCAyfSwKKworCS8qIEZDQyBUWVBFIDMgKi8KKwl7MTgsIDEwLCAyMDAwLCA1MDAwLCAwLCAyMywgNiwgNiwgMTMsIDIyLCAwLCAzLCAwLCA1fSwKKworCS8qIEZDQyBUWVBFIDQgKi8KKwl7MTYsIDE1LCAyMDAwLCA1MDAwLCAwLCAyNSwgNSwgMTEsIDIzLCAyMiwgMCwgMywgMCwgMTF9LAorCisJLyoKKwkgKiBGQ0MgTkVXIFRZUEUgMQorCSAqIDUxOHVzIHRvIDkzOHVzIHB1bHNlcyAobWluIDU2IHB1bHNlcykKKwkgKi8KKwl7NTcsIDEsIDEwNjYsIDE5MzAsIDAsIDYsIDIwLCAgMCwgIDEsIDIyLCAgMCwgMywgIDAsIDIxfSwKKworCS8qCisJICogRkNDIE5FVyBUWVBFIDEKKwkgKiA5Mzh1cyB0byAyMDAwIHB1bHNlcyAobWluIDI2IHB1bHNlcykKKwkgKi8KKwl7MjcsIDEsICA1MDAsIDEwNjYsIDAsIDYsIDEzLCAgMCwgIDEsIDIyLCAgMCwgMywgIDAsIDIyfSwKKworCS8qCisJICogRkNDIE5FVyBUWVBFIDEKKwkgKiAyMDAwIHRvIDMwNjd1cyBwdWxzZXMgKG1pbiAxNyBwdWxzZXMpCisJICovCisJezE4LCAxLCAgMzI1LCAgNTAwLCAwLCA2LCAgOSwgIDAsICAxLCAyMiwgIDAsIDMsICAwLCAyM30sCit9OworCitzdHJ1Y3QgZGZzX3B1bHNlIGRmc19ta2s0X3JhZGFyc1tdID0geworCS8qIGZvbGxvd2luZyB0d28gZmlsdGVycyBhcmUgc3BlY2lmaWMgdG8gSmFwYW4vTUtLNCAqLworLyogICAgezE4LCAgMSwgIDcyMCwgIDcyMCwgMSwgIDYsICA2LCAgMCwgIDEsIDE4LCAgMCwgMywgMTd9LCAvLyAxMzg5ICsvLSA2IHVzICovCisvKiAgICB7MTgsICA0LCAgMjUwLCAgMjUwLCAxLCAxMCwgIDUsICAxLCAgNiwgMTgsICAwLCAzLCAxOH0sIC8vIDQwMDAgKy8tIDYgdXMgKi8KKy8qICAgIHsxOCwgIDUsICAyNjAsICAyNjAsIDEsIDEwLCAgNiwgIDEsICA2LCAxOCwgIDAsIDMsIDE5fSwgLy8gMzg0NiArLy0gNyB1cyAqLworCXsxOCwgMSwgNzIwLCA3MjAsIDAsIDYsIDYsIDAsIDEsIDE4LCAwLCAzLCAwLCAxN30sICAgICAgLyogMTM4OSArLy0gNiB1cyAqLworCXsxOCwgNCwgMjUwLCAyNTAsIDAsIDEwLCA1LCAxLCA2LCAxOCwgMCwgMywgMCwgMTh9LCAgICAgLyogNDAwMCArLy0gNiB1cyAqLworCXsxOCwgNSwgMjYwLCAyNjAsIDAsIDEwLCA2LCAxLCA2LCAxOCwgMCwgMywgMSwgMTl9LCAgICAgLyogMzg0NiArLy0gNyB1cyAqLworCisJLyogZm9sbG93aW5nIGZpbHRlcnMgYXJlIGNvbW1vbiB0byBib3RoIEZDQyBhbmQgSkFQQU4gKi8KKworCS8qIEZDQyBUWVBFIDEgKi8KKwkvKiB7MTgsICAxLCAgMzI1LCAxOTMwLCAwLCAgNiwgIDcsICAwLCAgMSwgMTgsICAwLCAzLCAgMH0sIC8vIDUxOCB0byAzMDY2ICovCisJezE4LCAxLCA3MDAsIDcwMCwgMCwgNiwgNSwgMCwgMSwgMTgsIDAsIDMsIDEsIDB9LAorCXsxOCwgMSwgMzUwLCAzNTAsIDAsIDYsIDUsIDAsIDEsIDE4LCAwLCAzLCAwLCAwfSwKKworCS8qIEZDQyBUWVBFIDYgKi8KKwkvKiB7OSwgICAxLCAzMDAzLCAzMDAzLCAxLCAgNywgIDUsICAwLCAgMSwgMTgsICAwLCAwLCAgMX0sIC8vIDMzMyArLy0gNyB1cyAqLworCXs5LCAxLCAzMDAzLCAzMDAzLCAxLCA3LCA1LCAwLCAxLCAxOCwgMCwgMCwgMSwgMX0sCisKKwkvKiBGQ0MgVFlQRSAyICovCisJezIzLCA1LCA0MzQ3LCA2NjY2LCAwLCAxOCwgOCwgMCwgNywgMjIsIDAsIDMsIDAsIDJ9LAorCisJLyogRkNDIFRZUEUgMyAqLworCXsxOCwgMTAsIDIwMDAsIDUwMDAsIDAsIDIzLCA2LCA2LCAxMywgMjIsIDAsIDMsIDAsIDV9LAorCisJLyogRkNDIFRZUEUgNCAqLworCXsxNiwgMTUsIDIwMDAsIDUwMDAsIDAsIDI1LCA1LCAxMSwgMjMsIDIyLCAwLCAzLCAwLCAxMX0sCit9OworCitzdHJ1Y3QgZGZzX2JpbjVwdWxzZSBkZnNfZmNjX2JpbjVwdWxzZXNbXSA9IHsKKwl7NCwgMjgsIDEwNSwgMTIsIDE3LCA1fSwKK307CisKK3N0cnVjdCBkZnNfYmluNXB1bHNlIGRmc19qcG5fYmluNXB1bHNlc1tdID0geworCXs1LCAyOCwgMTA1LCAxMiwgMjIsIDV9LAorfTsKKworc3RydWN0IGRmc19wdWxzZSBkZnNfZXRzaV9yYWRhcnNbXSA9IHsKKworCS8qIFRZUEUgc3RhZ2dlcmVkIHB1bHNlICovCisJLyogMC44LTJ1cywgMi0zIGJ1cnN0cywzMDAtNDAwIFBSRiwgMTAgcHVsc2VzIGVhY2ggKi8KKwl7MzAsIDIsIDMwMCwgNDAwLCAyLCAzMCwgMywgMCwgNSwgMTUsIDAsIDAsIDEsIDMxfSwgICAgIC8qIFR5cGUgNSAqLworCS8qIDAuOC0ydXMsIDItMyBidXJzdHMsIDQwMC0xMjAwIFBSRiwgMTUgcHVsc2VzIGVhY2ggKi8KKwl7MzAsIDIsIDQwMCwgMTIwMCwgMiwgMzAsIDcsIDAsIDUsIDE1LCAwLCAwLCAwLCAzMn0sICAgIC8qIFR5cGUgNiAqLworCisJLyogY29uc3RhbnQgUFJGIGJhc2VkICovCisJLyogMC44LTV1cywgMjAwICAzMDAgUFJGLCAxMCBwdWxzZXMgKi8KKwl7MTAsIDUsIDIwMCwgNDAwLCAwLCAyNCwgNSwgMCwgOCwgMTUsIDAsIDAsIDIsIDMzfSwgICAgIC8qIFR5cGUgMSAqLworCXsxMCwgNSwgNDAwLCA2MDAsIDAsIDI0LCA1LCAwLCA4LCAxNSwgMCwgMCwgMiwgMzd9LCAgICAgLyogVHlwZSAxICovCisJezEwLCA1LCA2MDAsIDgwMCwgMCwgMjQsIDUsIDAsIDgsIDE1LCAwLCAwLCAyLCAzOH0sICAgICAvKiBUeXBlIDEgKi8KKwl7MTAsIDUsIDgwMCwgMTAwMCwgMCwgMjQsIDUsIDAsIDgsIDE1LCAwLCAwLCAyLCAzOX0sICAgIC8qIFR5cGUgMSAqLworLyogIHsxMCwgNSwgICAyMDAsIDEwMDAsIDAsIDI0LCAgNSwgIDAsICA4LCAxNSwgMCwgICAwLCAyLCAzM30sICovCisKKwkvKiAwLjgtMTV1cywgMjAwLTE2MDAgUFJGLCAxNSBwdWxzZXMgKi8KKwl7MTUsIDE1LCAyMDAsIDE2MDAsIDAsIDI0LCA4LCAwLCAxOCwgMjIsIDAsIDAsIDAsIDM0fSwgIC8qIFR5cGUgMiAqLworCisJLyogMC44LTE1dXMsIDIzMDAtNDAwMCBQUkYsIDI1IHB1bHNlcyAqLworCXsyNSwgMTUsIDIzMDAsIDQwMDAsIDAsIDI0LCAxMCwgMCwgMTgsIDIyLCAwLCAwLCAwLCAzNX0sICAgICAgICAvKiBUeXBlIDMgKi8KKworCS8qIDIwLTMwdXMsIDIwMDAtNDAwMCBQUkYsIDIwIHB1bHNlcyAqLworCXsyMCwgMzAsIDIwMDAsIDQwMDAsIDAsIDI0LCA2LCAxOSwgMzMsIDI0LCAwLCAwLCAwLCAzNn0sICAgICAgICAvKiBUeXBlIDQgKi8KK307CmRpZmYgLS1naXQgYS9jb3JlL3NhcC9kZnMvc291cmNlcyBiL2NvcmUvc2FwL2Rmcy9zb3VyY2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OTlmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NhcC9kZnMvc291cmNlcwpAQCAtMCwwICsxLDYyIEBACisjCisjICBzb3VyY2VzIGZpbGUgZm9yIERGUyBtb2R1bGUKKyMKK0xNQUM9Li4KK1RPUD0kKExNQUMpXC4uCitJTkM9JChUT1ApXGluY2x1ZGUKK0hBTD0kKFRPUClcaGFsCitBVEg9JChMTUFDKVxhdGhfZGV2CisKKyFJRkRFRiBCVUlMRF9VTUFDCitNUD0kKFRPUClcb3Ncd2luX253ZgorSU5DX01QPSQoTVApXGluY2x1ZGUKK0lGX0FUSD0kKFRPUClcdW1hY1xpZl9sbWFjCishRUxTRQorTVA9JChUT1ApXHdpbnZpc3RhCitJTkNfTVA9JChJTkMpXHdpbnZpc3RhCitJRl9BVEg9JChUT1ApXGlmX2F0aF9uZXQ4MDIxMQorIUVORElGCisKKyFpbmNsdWRlICQoSU5DX01QKVxzb3VyY2VzLmluYworCitUQVJHRVROQU1FPWF0aF9kZnMKK1RBUkdFVFBBVEg9JChUT1ApXGxpYgorVEFSR0VUVFlQRT1MSUJSQVJZCisKKyFJRkRFRiBCVUlMRF9IVEMKKyMgUHV0IGh0YyBpbmNsdWRlIGRpcnMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisjIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBodGMvY2RmIGhlYWRlciBmaWxlcyB3aWxsIHByZWVtcHQgYW55CisjIGhlYWRlciBmaWxlcyBvZiB0aGUgc2FtZSBuYW1lcyBmcm9tIHRoZSByZWd1bGFyIGNkZiBkaXJlY3Rvcmllcy4KK0lOQ0xVREVTPSAkKElOQ0xVREVTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgJChUT1ApXGh0Y1xpbmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICQoVE9QKVxodGNcYWRmXGluY2x1ZGU7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAkKFRPUClcaHRjXGFkZlx3aW52aXN0YVxuYnVmOyAgICAgICAgICAgICAgICBcCisgICAgJChUT1ApXGh0Y1xhZGZcd2ludmlzdGFcaW5jbHVkZTsKKyFFTkRJRgorCitJTkNMVURFUz0gJChJTkNMVURFUykgICAgICAgXAorICAgICQoVE9QKTsgICAgICAgICAgICAgICAgIFwKKyAgICAkKEFUSCk7ICAgICAgICAgICAgICAgICBcCisgICAgJChBVEhfREZTKTsgICAgICAgICAgICAgXAorICAgICQoVE9QKVxhdGhcd2ludmlzdGE7ICAgIFwKKyAgICAkKFRPUClcYXRoXHdpbnZpc3RhOyAgICBcCisgICAgJChIQUwpOyAgICAgICAgICAgICAgICAgXAorICAgICQoSEFMKVx3aW52aXN0YTsgICAgICAgIFwKKyAgICAkKElGX0FUSCk7ICAgICAgICAgICAgICBcCisgICAgJChJTkMpOyAgICAgICAgICAgICAgICAgXAorICAgICQoSU5DX01QKTsgICAgICAgICAgICAgICBcCisgICAgJChTRFhST09UKVxuZXRcaW5jOyAgICAgXAorICAgICQoRERLX0lOQ19QQVRIKQorCitTT1VSQ0VTPSQoU09VUkNFUykgICAgICAgICAgXAorICAgICAgICBkZnNfc3RhZ2dlcmVkLmMgICAgICBcCisgICAgICAgIGRmc19iaW5kZXRlY3RzLmMgICAgICBcCisgICAgICAgIGRmc19taXNjLmMgICAgICAgICAgICBcCisgICAgICAgIGRmc19kZWJ1Zy5jICAgICAgICAgICAgXAorICAgICAgICBkZnNfcHJvY2Vzc19yYWRhcmV2ZW50LmMgXAorICAgICAgICBkZnNfcHJvY2Vzc19waHllcnIuYyBcCisgICAgICAgIGRmc19ub2wuYyAgICAgICAgIFwKKyAgICAgICAgZGZzX2FyLmMgICAgICAgICAgICBcCisgICAgICAgIGRmc19mY2NfYmluNS5jICAgICAgIFwKKyAgICAgICAgZGZzX2luaXQuYyAgICAgICAgICAgIFwKKyAgICAgICAgZGZzLmMKZGlmZiAtLWdpdCBhL2NvcmUvc2FwL2Rmcy9zcmMvZGZzLmMgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTkxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmcy5jCkBAIC0wLDAgKzEsOTkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZnMuYworCisgICBPVkVSVklFVzoKKworICAgU291cmNlIGNvZGUgYm9ycm93ZWQgZnJvbSBRQ0FfTUFJTiBERlMgbW9kdWxlCisKKyAgIERFUEVOREVOQ0lFUzoKKworICAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisgICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKyAgIC0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxvc2RlcC5oPgorCisjaWZuZGVmIEFUSF9TVVBQT1JUX0RGUworI2RlZmluZSBBVEhfU1VQUE9SVF9ERlMgMQorCisvKiAjaW5jbHVkZSAiaWZfYXRoaW9jdGwuaCIgKi8KKy8qICNpbmNsdWRlICJpZl9hdGh2YXIuaCIgKi8KKyNpbmNsdWRlICJkZnNfaW9jdGwuaCIKKyNpbmNsdWRlICJkZnMuaCIKKworaW50IGRvbWFpbm92ZXJyaWRlID0gREZTX1VOSU5JVF9ET01BSU47CisKKy8qCisqKiBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgKENTQSkKKyoqIHVzZW5vbD0xIChkZWZhdWx0KSBtYWtlIENTQSBhbmQgc3dpdGNoIHRvIGEgbmV3IGNoYW5uZWwgb24gcmFkYXIgZGV0ZWN0CisqKiB1c2Vub2w9MCwgbWFrZSBDU0Egd2l0aCBuZXh0IGNoYW5uZWwgc2FtZSBhcyBjdXJyZW50IG9uIHJhZGFyIGRldGVjdAorKiogdXNlbm9sPTIsIG5vIENTQSBhbmQgc3RheSBvbiB0aGUgc2FtZSBjaGFubmVsIG9uIHJhZGFyIGRldGVjdAorKiovCisKK2ludCB1c2Vub2wgPSAxOwordWludDMyX3QgZGZzX2RlYnVnX2xldmVsID0gQVRIX0RFQlVHX0RGUzsKKworI2lmIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgY29kZSB0byBjYWxsIHRoaXMgaXMgY3VyZW50bHkgY29tbWVudGVkLW91dCBiZWxvdyAqLworLyoKKyAqIE1hcmsgYSBjaGFubmVsIGFzIGhhdmluZyBpbnRlcmZlcmVuY2UgZGV0ZWN0ZWQgdXBvbiBpdC4KKyAqCisgKiBUaGlzIGFkZHMgdGhlIGludGVyZmVyZW5jZSBtYXJrZXIgdG8gYm90aCB0aGUgcHJpbWFyeSBhbmQKKyAqIGV4dGVuc2lvbiBjaGFubmVsLgorICoKKyAqIFhYWCBUT0RPOiBtYWtlIHRoZSBOT0wgYW5kIGNoYW5uZWwgaW50ZXJmZXJlbmNlIGxvZ2ljIGEgYml0IHNtYXJ0ZXIKKyAqIHNvIG9ubHkgdGhlIGNoYW5uZWwgd2l0aCB0aGUgcmFkYXIgZXZlbnQgaXMgbWFya2VkLCByYXRoZXIgdGhhbgorICogYm90aCB0aGUgcHJpbWFyeSBhbmQgZXh0ZW5zaW9uLgorICovCitzdGF0aWMgdm9pZAorZGZzX2NoYW5uZWxfbWFya19yYWRhcihzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX2xpc3QgY2hhbl9pbmZvOworCWludCBpOworCisJLyogY2hhbi0+aWNfZmxhZ2V4dCB8PSBDSEFOTkVMX0lOVEVSRkVSRU5DRTsgKi8KKworCS8qCisJICogSWYgcmFkYXIgaXMgZGV0ZWN0ZWQgaW4gNDBNSHogbW9kZSwgYWRkIGJvdGggdGhlIHByaW1hcnkgYW5kIHRoZQorCSAqIGV4dGVuc2lvbiBjaGFubmVscyB0byB0aGUgTk9MLiBjaGFuIGlzIHRoZSBjaGFubmVsIGRhdGEgd2UgcmV0dXJuCisJICogdG8gdGhlIGF0aF9kZXYgbGF5ZXIgd2hpY2ggcGFzc2VzIGl0IG9uIHRvIHRoZSA4MDIxMSBsYXllci4KKwkgKiBBcyB3ZSB3YW50IHRoZSBBUCB0byBjaGFuZ2UgY2hhbm5lbHMgYW5kIHNlbmQgb3V0IGEgQ1NBLAorCSAqIHdlIGFsd2F5cyBwYXNzIGJhY2sgdGhlIHByaW1hcnkgY2hhbm5lbCBkYXRhIHRvIHRoZSBhdGhfZGV2IGxheWVyLgorCSAqLworCWlmICgoZGZzLT5kZnNfcmluZm8ucm5fdXNlX25vbCA9PSAxKSAmJgorCSAgICAoZGZzLT5pYy0+aWNfb3Btb2RlID09IElFRUU4MDIxMV9NX0hPU1RBUCB8fAorCSAgICAgZGZzLT5pYy0+aWNfb3Btb2RlID09IElFRUU4MDIxMV9NX0lCU1MpKSB7CisJCWNoYW5faW5mby5jbF9uY2hhbnMgPSAwOworCQlkZnMtPmljLT5pY19nZXRfZXh0X2NoYW5faW5mbyhkZnMtPmljLCAmY2hhbl9pbmZvKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY2hhbl9pbmZvLmNsX25jaGFuczsgaSsrKSB7CisJCQlpZiAoY2hhbl9pbmZvLmNsX2NoYW5uZWxzW2ldID09IE5VTEwpIHsKKwkJCQlERlNfUFJJTlRLKCIlczogTlVMTCBjaGFubmVsXG4iLCBfX2Z1bmNfXyk7CisJCQl9IGVsc2UgeworCQkJCWNoYW5faW5mby5jbF9jaGFubmVsc1tpXS0+aWNfZmxhZ2V4dCB8PQorCQkJCQlDSEFOTkVMX0lOVEVSRkVSRU5DRTsKKwkJCQlkZnNfbm9sX2FkZGNoYW4oZGZzLCBjaGFuX2luZm8uY2xfY2hhbm5lbHNbaV0sCisJCQkJCQlkZnMtPmF0aF9kZnNfbm9sX3RpbWVvdXQpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSB1bWFjL2RyaXZlciBjaGFubmVscyB3aXRoIHRoZSBuZXcgTk9MIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJZGZzX25vbF91cGRhdGUoZGZzKTsKKwl9Cit9CisjZW5kaWYgLyogI2lmIDAgKi8KKworc3RhdGljIG9zX3RpbWVyX2Z1bmMoZGZzX3Rhc2spCit7CisJc3RydWN0IGllZWU4MDIxMWNvbSAqaWM7CisJc3RydWN0IGF0aF9kZnMgKmRmcyA9IE5VTEw7CisKKwlPU19HRVRfVElNRVJfQVJHKGljLCBzdHJ1Y3QgaWVlZTgwMjExY29tICopOworCWRmcyA9IChzdHJ1Y3QgYXRoX2RmcyAqKWljLT5pY19kZnM7CisJLyoKKwkgKiBYWFggbm8gbG9ja2luZz8hCisJICovCisJaWYgKGRmc19wcm9jZXNzX3JhZGFyZXZlbnQoZGZzLCBpYy0+aWNfY3VyY2hhbikpIHsKKyNpZm5kZWYgQVRIX0RGU19SQURBUl9ERVRFQ1RJT05fT05MWQorCisJCS8qCisJCSAqIFRoaXMgbWFya3MgdGhlIGNoYW5uZWwgKGFuZCB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwsIGlmIEhUNDApIGFzCisJCSAqIGhhdmluZyBzZWVuIGEgcmFkYXIgZXZlbnQuICBJdCBtYXJrcyBDSEFOX0lOVEVSRkVSRU5DRSBhbmQKKwkJICogd2lsbCBhZGQgaXQgdG8gdGhlIGxvY2FsIE5PTCBpbXBsZW1lbnRhdGlvbi4KKwkJICoKKwkJICogVGhpcyBpcyBvbmx5IGRvbmUgZm9yICd1c2Vub2w9MScsIGFzIHRoZSBvdGhlciB0d28gbW9kZXMKKwkJICogZG9uJ3QgZG8gcmFkYXIgbm90aWZpY2F0aW9uIG9yIENBQy9DU0EvTk9MOyBpdCBqdXN0IG5vdGVzCisJCSAqIHRoZXJlIHdhcyBhIHJhZGFyLgorCQkgKi8KKworCQlpZiAoZGZzLT5kZnNfcmluZm8ucm5fdXNlX25vbCA9PSAxKSB7CisJCQkvKiBkZnNfY2hhbm5lbF9tYXJrX3JhZGFyKGRmcywgaWMtPmljX2N1cmNoYW4pOyAqLworCQl9CisjZW5kaWYgLyogQVRIX0RGU19SQURBUl9ERVRFQ1RJT05fT05MWSAqLworCisJCS8qCisJCSAqIFRoaXMgY2FsbHMgaW50byB0aGUgdW1hYyBERlMgY29kZSwgd2hpY2ggc2V0cyB0aGUgdW1hYyByZWxhdGVkCisJCSAqIHJhZGFyIGZsYWdzIGFuZCBiZWdpbnMgdGhlIGNoYW5uZWwgY2hhbmdlIG1hY2hpbmVyeS4KKwkJICoKKwkJICogWFhYIFRPRE86IHRoZSB1bWFjIE5PTCBjb2RlIGlzbid0IHVzZWQsIGJ1dCBJRUVFODAyMTFfQ0hBTl9SQURBUgorCQkgKiBzdGlsbCBnZXRzIHNldC4gIFNpbmNlIHRoZSB1bWFjIE5PTCBjb2RlIGlzbid0IHVzZWQsIHRoYXQgZmxhZworCQkgKiBpcyBuZXZlciBjbGVhcmVkLiAgVGhpcyBuZWVkcyB0byBiZSBmaXhlZC4gU2VlIEVWIDEwNTc3Ni4KKwkJICovCisJCWlmIChkZnMtPmRmc19yaW5mby5ybl91c2Vfbm9sID09IDEpIHsKKwkJCWljLT5pY19kZnNfbm90aWZ5X3JhZGFyKGljLCBpYy0+aWNfY3VyY2hhbik7CisJCX0gZWxzZSBpZiAoZGZzLT5kZnNfcmluZm8ucm5fdXNlX25vbCA9PSAwKSB7CisJCQkvKgorCQkJICogRm9yIHRoZSB0ZXN0IG1vZGUsIGRvbid0IGRvIGEgQ1NBIGhlcmU7IGJ1dCBzZXR1cCB0aGUKKwkJCSAqIHRlc3QgdGltZXIgc28gd2UgZ2V0IGEgQ1NBIF9iYWNrXyB0byB0aGUgb3JpZ2luYWwgY2hhbm5lbC4KKwkJCSAqLworCQkJT1NfQ0FOQ0VMX1RJTUVSKCZkZnMtPmF0aF9kZnN0ZXN0dGltZXIpOworCQkJZGZzLT5hdGhfZGZzdGVzdCA9IDE7CisJCQlkZnMtPmF0aF9kZnN0ZXN0X2llZWVjaGFuID0gaWMtPmljX2N1cmNoYW4tPmljX2llZWU7CisJCQlkZnMtPmF0aF9kZnN0ZXN0dGltZSA9IDE7ICAgICAgIC8qIDFtcyAqLworCQkJT1NfU0VUX1RJTUVSKCZkZnMtPmF0aF9kZnN0ZXN0dGltZXIsCisJCQkJICAgICBkZnMtPmF0aF9kZnN0ZXN0dGltZSk7CisJCX0KKwl9CisJZGZzLT5hdGhfcmFkYXJfdGFza3NjaGVkID0gMDsKK30KKworc3RhdGljIG9zX3RpbWVyX2Z1bmMoZGZzX3Rlc3R0aW1lcl90YXNrKQoreworCXN0cnVjdCBpZWVlODAyMTFjb20gKmljOworCXN0cnVjdCBhdGhfZGZzICpkZnMgPSBOVUxMOworCisJT1NfR0VUX1RJTUVSX0FSRyhpYywgc3RydWN0IGllZWU4MDIxMWNvbSAqKTsKKwlkZnMgPSAoc3RydWN0IGF0aF9kZnMgKilpYy0+aWNfZGZzOworCisJLyogWFhYIG5vIGxvY2tpbmc/ICovCisJZGZzLT5hdGhfZGZzdGVzdCA9IDA7CisKKwkvKgorCSAqIEZsaXAgdGhlIGNoYW5uZWwgYmFjayB0byB0aGUgb3JpZ2luYWwgY2hhbm5lbC4KKwkgKiBNYWtlIHN1cmUgdGhpcyBpcyBkb25lIHByb3Blcmx5IHdpdGggYSBDU0EuCisJICovCisJREZTX1BSSU5USygiJXM6IGdvIGJhY2sgdG8gY2hhbm5lbCAlZFxuIiwKKwkJICAgX19mdW5jX18sIGRmcy0+YXRoX2Rmc3Rlc3RfaWVlZWNoYW4pOworCisJLyoKKwkgKiBYWFggVGhlIG1lcmUgZXhpc3RlbmNlIG9mIHRoaXMgbWV0aG9kIGluZGlyZWN0aW9uCisJICogICAgIHRvIGEgdW1hYyBmdW5jdGlvbiBtZWFucyB0aGlzIGNvZGUgYmVsb25ncyBpbgorCSAqICAgICB0aGUgZHJpdmVyLCBfbm90XyBoZXJlLiAgUGxlYXNlIGZpeCB0aGlzIQorCSAqLworCWljLT5pY19zdGFydF9jc2EoaWMsIGRmcy0+YXRoX2Rmc3Rlc3RfaWVlZWNoYW4pOworfQorCitzdGF0aWMgaW50IGRmc19nZXRfZGVidWdfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExY29tICppYywgaW50IHR5cGUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGF0aF9kZnMgKmRmcyA9IChzdHJ1Y3QgYXRoX2RmcyAqKWljLT5pY19kZnM7CisJaWYgKGRhdGEpIHsKKwkJKih1aW50MzJfdCAqKSBkYXRhID0gZGZzLT5kZnNfcHJvY19waHllcnI7CisJfQorCXJldHVybiAoaW50KWRmcy0+ZGZzX3Byb2NfcGh5ZXJyOworfQorCitpbnQgZGZzX2F0dGFjaChzdHJ1Y3QgaWVlZTgwMjExY29tICppYykKK3sKKwlpbnQgaSwgbjsKKwlzdHJ1Y3QgYXRoX2RmcyAqZGZzID0gKHN0cnVjdCBhdGhfZGZzICopaWMtPmljX2RmczsKKwlzdHJ1Y3QgYXRoX2Rmc19yYWRhcl90YWJfaW5mbyByYWRhcl9pbmZvOworCisJaWYgKGRmcyAhPSBOVUxMKSB7CisJCS8qREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMSwKKwkJICAgIiVzOiBpY19kZnMgd2FzIG5vdCBOVUxMXG4iLAorCQkgICBfX2Z1bmNfXyk7CisJCSAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlkZnMgPQorCQkoc3RydWN0IGF0aF9kZnMgKilvc19tYWxsb2MoTlVMTCwgc2l6ZW9mKHN0cnVjdCBhdGhfZGZzKSwKKwkJCQkJICAgIEdGUF9BVE9NSUMpOworCisJaWYgKGRmcyA9PSBOVUxMKSB7CisJCS8qREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMSwKKwkJICAgIiVzOiBhdGhfZGZzIGFsbG9jYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7ICovCisJCXJldHVybiAxOworCX0KKworCU9TX01FTVpFUk8oZGZzLCBzaXplb2Yoc3RydWN0IGF0aF9kZnMpKTsKKworCWljLT5pY19kZnMgPSAodm9pZCAqKWRmczsKKworCWRmcy0+aWMgPSBpYzsKKworCWljLT5pY19kZnNfZGVidWcgPSBkZnNfZ2V0X2RlYnVnX2luZm87CisjaWZuZGVmIEFUSF9ERlNfUkFEQVJfREVURUNUSU9OX09OTFkKKwlkZnMtPmRmc19ub2wgPSBOVUxMOworI2VuZGlmCisKKwkvKgorCSAqIFplcm8gb3V0IHJhZGFyX2luZm8uICBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGF0dGFjaCBmdW5jdGlvbiB3b24ndAorCSAqIGZldGNoIGFuIGluaXRpYWwgcmVndWxhdG9yeSBjb25maWd1cmF0aW9uOyB5b3UgcmVhbGx5IGRvIHdhbnQgdG8KKwkgKiBlbnN1cmUgdGhhdCB0aGUgY29udGVudHMgaW5kaWNhdGVzIHRoZXJlIGFyZW4ndCBhbnkgZmlsdGVycy4KKwkgKi8KKwlPU19NRU1aRVJPKCZyYWRhcl9pbmZvLCBzaXplb2YocmFkYXJfaW5mbykpOworCWljLT5pY19kZnNfYXR0YWNoKGljLCAmZGZzLT5kZnNfY2FwcywgJnJhZGFyX2luZm8pOworCWRmc19jbGVhcl9zdGF0cyhpYyk7CisJZGZzLT5kZnNfZXZlbnRfbG9nX29uID0gMDsKKwlPU19JTklUX1RJTUVSKE5VTEwsICYoZGZzLT5hdGhfZGZzX3Rhc2tfdGltZXIpLCBkZnNfdGFzaywgKHZvaWQgKikoaWMpLAorCQlDREZfVElNRVJfVFlQRV9TVyk7CisjaWZuZGVmIEFUSF9ERlNfUkFEQVJfREVURUNUSU9OX09OTFkKKwlPU19JTklUX1RJTUVSKE5VTEwsICYoZGZzLT5hdGhfZGZzdGVzdHRpbWVyKSwgZGZzX3Rlc3R0aW1lcl90YXNrLAorCQkgICAgICAodm9pZCAqKWljLCBDREZfVElNRVJfVFlQRV9TVyk7CisJZGZzLT5hdGhfZGZzX2NhY190aW1lID0gQVRIX0RGU19XQUlUX01TOworCWRmcy0+YXRoX2Rmc3Rlc3R0aW1lID0gQVRIX0RGU19URVNUX1JFVFVSTl9QRVJJT0RfTVM7CisjZW5kaWYKKwlBVEhfREZTUV9MT0NLX0lOSVQoZGZzKTsKKwlTVEFJTFFfSU5JVCgmZGZzLT5kZnNfcmFkYXJxKTsKKwlBVEhfQVJRX0xPQ0tfSU5JVChkZnMpOworCVNUQUlMUV9JTklUKCZkZnMtPmRmc19hcnEpOworCVNUQUlMUV9JTklUKCYoZGZzLT5kZnNfZXZlbnRxKSk7CisJQVRIX0RGU0VWRU5UUV9MT0NLX0lOSVQoZGZzKTsKKwlkZnMtPmV2ZW50cyA9IChzdHJ1Y3QgZGZzX2V2ZW50ICopb3NfbWFsbG9jKE5VTEwsCisJCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBkZnNfZXZlbnQpICoKKwkJCQkJCSAgICBERlNfTUFYX0VWRU5UUywgR0ZQX0FUT01JQyk7CisJaWYgKGRmcy0+ZXZlbnRzID09IE5VTEwpIHsKKwkJT1NfRlJFRShkZnMpOworCQlpYy0+aWNfZGZzID0gTlVMTDsKKwkJREZTX1BSSU5USygiJXM6IGV2ZW50cyBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IERGU19NQVhfRVZFTlRTOyBpKyspIHsKKwkJU1RBSUxRX0lOU0VSVF9UQUlMKCYoZGZzLT5kZnNfZXZlbnRxKSwgJmRmcy0+ZXZlbnRzW2ldLAorCQkJCSAgIHJlX2xpc3QpOworCX0KKworCWRmcy0+cHVsc2VzID0KKwkJKHN0cnVjdCBkZnNfcHVsc2VsaW5lICopb3NfbWFsbG9jKE5VTEwsCisJCQkJCQkgIHNpemVvZihzdHJ1Y3QgZGZzX3B1bHNlbGluZSksCisJCQkJCQkgIEdGUF9BVE9NSUMpOworCWlmIChkZnMtPnB1bHNlcyA9PSBOVUxMKSB7CisJCU9TX0ZSRUUoZGZzLT5ldmVudHMpOworCQlkZnMtPmV2ZW50cyA9IE5VTEw7CisJCU9TX0ZSRUUoZGZzKTsKKwkJaWMtPmljX2RmcyA9IE5VTEw7CisJCURGU19QUklOVEsoIiVzOiBwdWxzZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGZzLT5wdWxzZXMtPnBsX2xhc3RlbGVtID0gREZTX01BWF9QVUxTRV9CVUZGRVJfTUFTSzsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmFkYXIgZmlsdGVycyAqLworCWZvciAobiA9IDA7IG4gPCBERlNfTUFYX1JBREFSX1RZUEVTOyBuKyspIHsKKwkJZGZzLT5kZnNfcmFkYXJmW25dID0KKwkJCShzdHJ1Y3QgZGZzX2ZpbHRlcnR5cGUgKilvc19tYWxsb2MoTlVMTCwKKwkJCQkJCQkgICBzaXplb2Yoc3RydWN0CisJCQkJCQkJCSAgZGZzX2ZpbHRlcnR5cGUpLAorCQkJCQkJCSAgIEdGUF9BVE9NSUMpOworCQlpZiAoZGZzLT5kZnNfcmFkYXJmW25dID09IE5VTEwpIHsKKwkJCURGU19QUklOVEsKKwkJCQkoIiVzOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByYWRhciBmaWx0ZXIgdHlwZXNcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBiYWQxOworCQl9CisJCU9TX01FTVpFUk8oZGZzLT5kZnNfcmFkYXJmW25dLCBzaXplb2Yoc3RydWN0IGRmc19maWx0ZXJ0eXBlKSk7CisJfQorCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmFkYXIgdGFibGUgKi8KKwlkZnMtPmRmc19yYWRhcnRhYmxlID0KKwkJKGludDhfdCAqICopIG9zX21hbGxvYyhOVUxMLCAyNTYgKiBzaXplb2YoaW50OF90ICopLCBHRlBfQVRPTUlDKTsKKwlpZiAoZGZzLT5kZnNfcmFkYXJ0YWJsZSA9PSBOVUxMKSB7CisJCURGU19QUklOVEsoIiVzOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByYWRhciB0YWJsZVxuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJZ290byBiYWQxOworCX0KKwlmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspIHsKKwkJZGZzLT5kZnNfcmFkYXJ0YWJsZVtuXSA9CisJCQlvc19tYWxsb2MoTlVMTCwgREZTX01BWF9SQURBUl9PVkVSTEFQICogc2l6ZW9mKGludDhfdCksCisJCQkJICBHRlBfQVRPTUlDKTsKKwkJaWYgKGRmcy0+ZGZzX3JhZGFydGFibGVbbl0gPT0gTlVMTCkgeworCQkJREZTX1BSSU5USworCQkJCSgiJXM6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJhZGFyIHRhYmxlIGVudHJ5XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gYmFkMjsKKwkJfQorCX0KKworCWlmICh1c2Vub2wgPT0gMCkKKwkJREZTX1BSSU5USygiJXM6IE5PTCBkaXNhYmxlZFxuIiwgX19mdW5jX18pOworCWVsc2UgaWYgKHVzZW5vbCA9PSAyKQorCQlERlNfUFJJTlRLKCIlczogTk9MIGRpc2FibGVkOyBubyBDU0FcbiIsIF9fZnVuY19fKTsKKworCWRmcy0+ZGZzX3JpbmZvLnJuX3VzZV9ub2wgPSB1c2Vub2w7CisKKwkvKiBJbml0IHRoZSBjYWNoZWQgZXh0ZW5zaW9uIGNoYW5uZWwgYnVzeSBmb3IgZmFsc2UgYWxhcm0gcmVkdWN0aW9uICovCisJZGZzLT5kZnNfcmluZm8uZXh0X2NoYW5fYnVzeV90cyA9IGljLT5pY19nZXRfVFNGNjQoaWMpOworCWRmcy0+ZGZzX3JpbmZvLmRmc19leHRfY2hhbl9idXN5ID0gMDsKKwkvKiBJbml0IHRoZSBCaW41IGNoaXJwaW5nIHJlbGF0ZWQgZGF0YSAqLworCWRmcy0+ZGZzX3JpbmZvLmRmc19iaW41X2NoaXJwX3RzID0gZGZzLT5kZnNfcmluZm8uZXh0X2NoYW5fYnVzeV90czsKKwlkZnMtPmRmc19yaW5mby5kZnNfbGFzdF9iaW41X2R1ciA9IE1BWF9CSU41X0RVUjsKKwlkZnMtPmRmc19iNXJhZGFycyA9IE5VTEw7CisKKwkvKgorCSAqIElmIGRmc19pbml0X3JhZGFyX2ZpbHRlcnMoKSBmYWlscywgd2UgY2FuIGFib3J0IGhlcmUgYW5kCisJICogcmVjb25maWd1cmUgd2hlbiB0aGUgZmlyc3QgdmFsaWQgY2hhbm5lbCArIHJhZGFyIGNvbmZpZworCSAqIGlzIGF2YWlsYWJsZS4KKwkgKi8KKwlpZiAoZGZzX2luaXRfcmFkYXJfZmlsdGVycyhpYywgJnJhZGFyX2luZm8pKSB7CisJCURGU19QUklOVEsoIiAlczogUmFkYXIgRmlsdGVyIEludGlhbGl6YXRpb24gRmFpbGVkIFxuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGZzLT5hdGhfZGZzX2ZhbHNlX3Jzc2lfdGhyZXMgPSBSU1NJX1BPU1NJQkxZX0ZBTFNFOworCWRmcy0+YXRoX2Rmc19wZWFrX21hZyA9IFNFQVJDSF9GRlRfUkVQT1JUX1BFQUtfTUFHX1RIUlNIOworCWRmcy0+ZGZzX3BoeWVycl9mcmVxX21pbiA9IDB4N2ZmZmZmZmY7CisJZGZzLT5kZnNfcGh5ZXJyX2ZyZXFfbWF4ID0gMDsKKwlkZnMtPmRmc19waHllcnJfcXVldWVkX2NvdW50ID0gMDsKKwlkZnMtPmRmc19waHllcnJfdzUzX2NvdW50ZXIgPSAwOworCWRmcy0+ZGZzX3ByaV9tdWx0aXBsaWVyID0gMjsKKworCWRmcy0+YXRoX2Rmc19ub2xfdGltZW91dCA9IERGU19OT0xfVElNRU9VVF9TOworCXJldHVybiAwOworCitiYWQyOgorCU9TX0ZSRUUoZGZzLT5kZnNfcmFkYXJ0YWJsZSk7CisJZGZzLT5kZnNfcmFkYXJ0YWJsZSA9IE5VTEw7CitiYWQxOgorCWZvciAobiA9IDA7IG4gPCBERlNfTUFYX1JBREFSX1RZUEVTOyBuKyspIHsKKwkJaWYgKGRmcy0+ZGZzX3JhZGFyZltuXSAhPSBOVUxMKSB7CisJCQlPU19GUkVFKGRmcy0+ZGZzX3JhZGFyZltuXSk7CisJCQlkZnMtPmRmc19yYWRhcmZbbl0gPSBOVUxMOworCQl9CisJfQorCWlmIChkZnMtPnB1bHNlcykgeworCQlPU19GUkVFKGRmcy0+cHVsc2VzKTsKKwkJZGZzLT5wdWxzZXMgPSBOVUxMOworCX0KKwlpZiAoZGZzLT5ldmVudHMpIHsKKwkJT1NfRlJFRShkZnMtPmV2ZW50cyk7CisJCWRmcy0+ZXZlbnRzID0gTlVMTDsKKwl9CisKKwlpZiAoaWMtPmljX2RmcykgeworCQlPU19GUkVFKGljLT5pY19kZnMpOworCQlpYy0+aWNfZGZzID0gTlVMTDsKKwl9CisJcmV0dXJuIDE7CisjdW5kZWYgTgorfQorCit2b2lkIGRmc19kZXRhY2goc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpCit7CisJc3RydWN0IGF0aF9kZnMgKmRmcyA9IChzdHJ1Y3QgYXRoX2RmcyAqKWljLT5pY19kZnM7CisJaW50IG4sIGVtcHR5OworCisJaWYgKGRmcyA9PSBOVUxMKSB7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzEsICIlczogaWNfZGZzIGlzIE5VTExcbiIsCisJCQkgICAgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyogQnVnIDI5MDk5IG1ha2Ugc3VyZSBhbGwgb3V0c3RhbmRpbmcgdGltZXJzIGFyZSBjYW5jZWxsZWQgKi8KKworCWlmIChkZnMtPmF0aF9yYWRhcl90YXNrc2NoZWQpIHsKKwkJT1NfQ0FOQ0VMX1RJTUVSKCZkZnMtPmF0aF9kZnNfdGFza190aW1lcik7CisJCWRmcy0+YXRoX3JhZGFyX3Rhc2tzY2hlZCA9IDA7CisJfQorCisJaWYgKGRmcy0+YXRoX2Rmc3Rlc3QpIHsKKwkJT1NfQ0FOQ0VMX1RJTUVSKCZkZnMtPmF0aF9kZnN0ZXN0dGltZXIpOworCQlkZnMtPmF0aF9kZnN0ZXN0ID0gMDsKKwl9CisjaWYgMAorI2lmbmRlZiBBVEhfREZTX1JBREFSX0RFVEVDVElPTl9PTkxZCisJaWYgKGRmcy0+aWNfZGZzd2FpdCkgeworCQlPU19DQU5DRUxfVElNRVIoJmRmcy0+aWNfZGZzd2FpdHRpbWVyKTsKKwkJZGZzLT5hdGhfZGZzd2FpdCA9IDA7CisJfQorCisJT1NfQ0FOQ0VMX1RJTUVSKCZkZnMtPnNjX2Rmc193YXJfdGltZXIpOworCWlmIChkZnMtPmRmc19ub2wgIT0gTlVMTCkgeworCQlzdHJ1Y3QgZGZzX25vbGVsZW0gKm5vbCwgKm5leHQ7CisJCW5vbCA9IGRmcy0+ZGZzX25vbDsKKwkJLyogQnVnIDI5MDk5IC0gZWFjaCBOT0wgZWxlbWVudCBoYXMgaXRzIG93biB0aW1lciwgY2FuY2VsIGl0IGFuZAorCQkgICBmcmVlIHRoZSBlbGVtZW50ICovCisJCXdoaWxlIChub2wgIT0gTlVMTCkgeworCQkJT1NfQ0FOQ0VMX1RJTUVSKCZub2wtPm5vbF90aW1lcik7CisJCQluZXh0ID0gbm9sLT5ub2xfbmV4dDsKKwkJCU9TX0ZSRUUobm9sKTsKKwkJCW5vbCA9IG5leHQ7CisJCX0KKwkJZGZzLT5kZnNfbm9sID0gTlVMTDsKKwl9CisjZW5kaWYKKyNlbmRpZgorCS8qIFJldHVybiByYWRhciBldmVudHMgdG8gZnJlZSBxICovCisJZGZzX3Jlc2V0X3JhZGFycShkZnMpOworCWRmc19yZXNldF9hbGxkZWxheWxpbmVzKGRmcyk7CisKKwkvKiBGcmVlIHVwIHB1bHNlIGxvZyAqLworCWlmIChkZnMtPnB1bHNlcyAhPSBOVUxMKSB7CisJCU9TX0ZSRUUoZGZzLT5wdWxzZXMpOworCQlkZnMtPnB1bHNlcyA9IE5VTEw7CisJfQorCisJZm9yIChuID0gMDsgbiA8IERGU19NQVhfUkFEQVJfVFlQRVM7IG4rKykgeworCQlpZiAoZGZzLT5kZnNfcmFkYXJmW25dICE9IE5VTEwpIHsKKwkJCU9TX0ZSRUUoZGZzLT5kZnNfcmFkYXJmW25dKTsKKwkJCWRmcy0+ZGZzX3JhZGFyZltuXSA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAoZGZzLT5kZnNfcmFkYXJ0YWJsZSAhPSBOVUxMKSB7CisJCWZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgeworCQkJaWYgKGRmcy0+ZGZzX3JhZGFydGFibGVbbl0gIT0gTlVMTCkgeworCQkJCU9TX0ZSRUUoZGZzLT5kZnNfcmFkYXJ0YWJsZVtuXSk7CisJCQkJZGZzLT5kZnNfcmFkYXJ0YWJsZVtuXSA9IE5VTEw7CisJCQl9CisJCX0KKwkJT1NfRlJFRShkZnMtPmRmc19yYWRhcnRhYmxlKTsKKwkJZGZzLT5kZnNfcmFkYXJ0YWJsZSA9IE5VTEw7CisjaWZuZGVmIEFUSF9ERlNfUkFEQVJfREVURUNUSU9OX09OTFkKKwkJZGZzLT5hdGhfZGZzX2lzZGZzcmVnZG9tYWluID0gMDsKKyNlbmRpZgorCX0KKworCWlmIChkZnMtPmRmc19iNXJhZGFycyAhPSBOVUxMKSB7CisJCU9TX0ZSRUUoZGZzLT5kZnNfYjVyYWRhcnMpOworCQlkZnMtPmRmc19iNXJhZGFycyA9IE5VTEw7CisJfQorCisvKiAgICAgIENvbW1lbnRpbmcgb3V0IHNpbmNlIGFsbCB0aGUgYXIgZnVuY3Rpb25zIGFyZSBvYnNvbGV0ZSBhbmQKKyAqICAgICAgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhcyBwYXJ0IG9mIGRmc19hci5jCisgKiBkZnNfcmVzZXRfYXIoZGZzKTsKKyAqLworCUFUSF9BUlFfTE9DSyhkZnMpOworCWVtcHR5ID0gU1RBSUxRX0VNUFRZKCYoZGZzLT5kZnNfYXJxKSk7CisJQVRIX0FSUV9VTkxPQ0soZGZzKTsKKwlpZiAoIWVtcHR5KSB7CisvKgorICogICAgICBDb21tZW50aW5nIG91dCBzaW5jZSBhbGwgdGhlIGFyIGZ1bmN0aW9ucyBhcmUgb2Jzb2xldGUgYW5kCisgKiAgICAgIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYXMgcGFydCBvZiBkZnNfYXIuYworICoKKyAqICAgIGRmc19yZXNldF9hcnEoZGZzKTsKKyAqLworCX0KKwlpZiAoZGZzLT5ldmVudHMgIT0gTlVMTCkgeworCQlPU19GUkVFKGRmcy0+ZXZlbnRzKTsKKwkJZGZzLT5ldmVudHMgPSBOVUxMOworCX0KKwlkZnNfbm9sX3RpbWVyX2NsZWFudXAoZGZzKTsKKwlPU19GUkVFKGRmcyk7CisKKwkvKiBYWFg/ICovCisJaWMtPmljX2RmcyA9IE5VTEw7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBlYWNoIHRpbWUgYSBjaGFubmVsIGNoYW5nZSBvY2N1cnMsIHRvIChwb3RlbnRpYWxseSkgZW5hYmxlCisgKiB0aGUgcmFkYXIgY29kZS4KKyAqLworaW50IGRmc19yYWRhcl9kaXNhYmxlKHN0cnVjdCBpZWVlODAyMTFjb20gKmljKQoreworCXN0cnVjdCBhdGhfZGZzICpkZnMgPSAoc3RydWN0IGF0aF9kZnMgKilpYy0+aWNfZGZzOworI2lmZGVmIEFUSF9FTkFCTEVfQVIKKwlkZnMtPmRmc19wcm9jX3BoeWVyciAmPSB+REZTX0FSX0VOOworI2VuZGlmCisJZGZzLT5kZnNfcHJvY19waHllcnIgJj0gfkRGU19SQURBUl9FTjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGVhY2ggdGltZSBhIGNoYW5uZWwgY2hhbmdlIG9jY3VycywgdG8gKHBvdGVudGlhbGx5KSBlbmFibGUKKyAqIHRoZSByYWRhciBjb2RlLgorICovCitpbnQgZGZzX3JhZGFyX2VuYWJsZShzdHJ1Y3QgaWVlZTgwMjExY29tICppYywKKwkJICAgICBzdHJ1Y3QgYXRoX2Rmc19yYWRhcl90YWJfaW5mbyAqcmFkYXJfaW5mbykKK3sKKwlpbnQgaXNfZXh0X2NoOworCWludCBpc19mYXN0Y2xrID0gMDsKKwlpbnQgcmFkYXJfZmlsdGVyc19pbml0X3N0YXR1cyA9IDA7CisJLyogdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICByZmlsdDsgKi8KKwlzdHJ1Y3QgYXRoX2RmcyAqZGZzOworCXN0cnVjdCBkZnNfc3RhdGUgKnJzX3ByaSwgKnJzX2V4dDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4gPSBpYy0+aWNfY3VyY2hhbiwgKmV4dF9jaCA9IE5VTEw7CisJaXNfZXh0X2NoID0gSUVFRTgwMjExX0lTX0NIQU5fMTFOX0hUNDAoaWMtPmljX2N1cmNoYW4pOworCWRmcyA9IChzdHJ1Y3QgYXRoX2RmcyAqKWljLT5pY19kZnM7CisJcnNfcHJpID0gTlVMTDsKKwlyc19leHQgPSBOVUxMOworI2lmIDAKKwlpbnQgaTsKKyNlbmRpZgorCWlmIChkZnMgPT0gTlVMTCkgeworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsICIlczogaWNfZGZzIGlzIE5VTExcbiIsCisJCQkgICAgX19mdW5jX18pOworCisJCXJldHVybiAtRUlPOworCX0KKwlpYy0+aWNfZGZzX2Rpc2FibGUoaWMpOworCisJLyoKKwkgKiBTZXR0aW5nIGNvdW50cnkgY29kZSBtaWdodCBjaGFuZ2UgdGhlIERGUyBkb21haW4KKwkgKiBzbyBpbml0aWFsaXplIHRoZSBERlMgUmFkYXIgZmlsdGVycworCSAqLworCXJhZGFyX2ZpbHRlcnNfaW5pdF9zdGF0dXMgPSBkZnNfaW5pdF9yYWRhcl9maWx0ZXJzKGljLCByYWRhcl9pbmZvKTsKKworCS8qCisJICogZGZzX2luaXRfcmFkYXJfZmlsdGVycygpIHJldHVybnMgMSBvbiBmYWlsdXJlIGFuZAorCSAqIDAgb24gc3VjY2Vzcy4KKwkgKi8KKwlpZiAoREZTX1NUQVRVU19GQUlMID09IHJhZGFyX2ZpbHRlcnNfaW5pdF9zdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlc1slZF06IERGUyBSYWRhciBGaWx0ZXJzIEluaXRpYWxpemF0aW9uIEZhaWxlZCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICgoaWMtPmljX29wbW9kZSA9PSBJRUVFODAyMTFfTV9IT1NUQVAKKwkgICAgIHx8IGljLT5pY19vcG1vZGUgPT0gSUVFRTgwMjExX01fSUJTUykpIHsKKworCQlpZiAoSUVFRTgwMjExX0lTX0NIQU5fREZTKGNoYW4pKSB7CisKKwkJCXVpbnQ4X3QgaW5kZXhfcHJpLCBpbmRleF9leHQ7CisjaWZkZWYgQVRIX0VOQUJMRV9BUgorCQkJZGZzLT5kZnNfcHJvY19waHllcnIgfD0gREZTX0FSX0VOOworI2VuZGlmCisJCQlkZnMtPmRmc19wcm9jX3BoeWVyciB8PSBERlNfUkFEQVJfRU47CisKKwkJCWlmIChpc19leHRfY2gpIHsKKwkJCQlleHRfY2ggPSBpZWVlODAyMTFfZ2V0X2V4dGNoYW4oaWMpOworCQkJfQorCQkJZGZzX3Jlc2V0X2FsbGRlbGF5bGluZXMoZGZzKTsKKworCQkJcnNfcHJpID0gZGZzX2dldGNoYW5zdGF0ZShkZnMsICZpbmRleF9wcmksIDApOworCQkJaWYgKGV4dF9jaCkgeworCQkJCXJzX2V4dCA9IGRmc19nZXRjaGFuc3RhdGUoZGZzLCAmaW5kZXhfZXh0LCAxKTsKKwkJCX0KKwkJCWlmIChyc19wcmkgIT0gTlVMTAorCQkJICAgICYmICgoZXh0X2NoID09IE5VTEwpIHx8IChyc19leHQgIT0gTlVMTCkpKSB7CisJCQkJc3RydWN0IGF0aF9kZnNfcGh5ZXJyX3BhcmFtIHBlOworCisJCQkJT1NfTUVNU0VUKCZwZSwgJ1wwJywgc2l6ZW9mKHBlKSk7CisKKwkJCQlpZiAoaW5kZXhfcHJpICE9IGRmcy0+ZGZzX2N1cmNoYW5fcmFkaW5kZXgpCisJCQkJCWRmc19yZXNldF9hbGxkZWxheWxpbmVzKGRmcyk7CisKKwkJCQlkZnMtPmRmc19jdXJjaGFuX3JhZGluZGV4ID0gKGludDE2X3QpIGluZGV4X3ByaTsKKwkJCQlkZnMtPmRmc19wcmlfbXVsdGlwbGllcl9pbmkgPQorCQkJCQlyYWRhcl9pbmZvLT5kZnNfcHJpX211bHRpcGxpZXI7CisKKwkJCQlpZiAocnNfZXh0KQorCQkJCQlkZnMtPmRmc19leHRjaGFuX3JhZGluZGV4ID0KKwkJCQkJCShpbnQxNl90KSBpbmRleF9leHQ7CisKKwkJCQlhdGhfZGZzX3BoeWVycl9wYXJhbV9jb3B5KCZwZSwKKwkJCQkJCQkgICZyc19wcmktPnJzX3BhcmFtKTsKKwkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMzLAorCQkJCQkgICAgIiVzOiBmaXJwd3I9JWQsIHJzc2k9JWQsIGhlaWdodD0lZCwgIgorCQkJCQkgICAgInByc3NpPSVkLCBpbmJhbmQ9JWQsIHJlbHB3cj0lZCwgIgorCQkJCQkgICAgInJlbHN0ZXA9JWQsIG1heGxlbj0lZFxuIiwKKwkJCQkJICAgIF9fZnVuY19fLAorCQkJCQkgICAgcGUucGVfZmlycHdyLAorCQkJCQkgICAgcGUucGVfcnJzc2ksCisJCQkJCSAgICBwZS5wZV9oZWlnaHQsCisJCQkJCSAgICBwZS5wZV9wcnNzaSwKKwkJCQkJICAgIHBlLnBlX2luYmFuZCwKKwkJCQkJICAgIHBlLnBlX3JlbHB3ciwKKwkJCQkJICAgIHBlLnBlX3JlbHN0ZXAsIHBlLnBlX21heGxlbik7CisKKwkJCQlpYy0+aWNfZGZzX2VuYWJsZShpYywgJmlzX2Zhc3RjbGssICZwZSk7CisJCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTLAorCQkJCQkgICAgIkVuYWJsZWQgcmFkYXIgZGV0ZWN0aW9uIG9uIGNoYW5uZWwgJWRcbiIsCisJCQkJCSAgICBjaGFuLT5pY19mcmVxKTsKKwkJCQlkZnMtPmR1cl9tdWx0aXBsaWVyID0KKwkJCQkJaXNfZmFzdGNsayA/IERGU19GQVNUX0NMT0NLX01VTFRJUExJRVIgOgorCQkJCQlERlNfTk9fRkFTVF9DTE9DS19NVUxUSVBMSUVSOworCQkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzMsCisJCQkJCSAgICAiJXM6IGR1cmF0aW9uIG11bHRpcGxpZXIgaXMgJWRcbiIsCisJCQkJCSAgICBfX2Z1bmNfXywgZGZzLT5kdXJfbXVsdGlwbGllcik7CisJCQl9IGVsc2UKKwkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsCisJCQkJCSAgICAiJXM6IE5vIG1vcmUgcmFkYXIgc3RhdGVzIGxlZnRcbiIsCisJCQkJCSAgICBfX2Z1bmNfXyk7CisJCX0KKwl9CisKKwlyZXR1cm4gREZTX1NUQVRVU19TVUNDRVNTOworfQorCitpbnQKK2Rmc19jb250cm9sKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLCB1X2ludCBpZCwKKwkgICAgdm9pZCAqaW5kYXRhLCB1aW50MzJfdCBpbnNpemUsIHZvaWQgKm91dGRhdGEsIHVpbnQzMl90ICpvdXRzaXplKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGF0aF9kZnNfcGh5ZXJyX3BhcmFtIHBlb3V0OworCXN0cnVjdCBhdGhfZGZzICpkZnMgPSAoc3RydWN0IGF0aF9kZnMgKilpYy0+aWNfZGZzOworCXN0cnVjdCBkZnNfaW9jdGxfcGFyYW1zICpkZnNwYXJhbXM7CisJdWludDMyX3QgdmFsID0gMDsKKyNpZm5kZWYgQVRIX0RGU19SQURBUl9ERVRFQ1RJT05fT05MWQorCXN0cnVjdCBkZnNyZXFfbm9saW5mbyAqbm9sOworCXVpbnQzMl90ICpkYXRhID0gTlVMTDsKKyNlbmRpZiAvKiBBVEhfREZTX1JBREFSX0RFVEVDVElPTl9PTkxZICovCisJaW50IGk7CisKKwlpZiAoZGZzID09IE5VTEwpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMxLCAiJXMgREZTIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJZ290byBiYWQ7CisJfQorCisJc3dpdGNoIChpZCkgeworCWNhc2UgREZTX1NFVF9USFJFU0g6CisJCWlmIChpbnNpemUgPCBzaXplb2Yoc3RydWN0IGRmc19pb2N0bF9wYXJhbXMpIHx8ICFpbmRhdGEpIHsKKwkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzEsCisJCQkJICAgICIlczogaW5zaXplPSVkLCBleHBlY3RlZD0lenUgYnl0ZXMsIGluZGF0YT0lcFxuIiwKKwkJCQkgICAgX19mdW5jX18sIGluc2l6ZSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBkZnNfaW9jdGxfcGFyYW1zKSwgaW5kYXRhKTsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWRmc3BhcmFtcyA9IChzdHJ1Y3QgZGZzX2lvY3RsX3BhcmFtcyAqKWluZGF0YTsKKwkJaWYgKCFkZnNfc2V0X3RocmVzaG9sZHMKKwkJCSAgICAoaWMsIERGU19QQVJBTV9GSVJQV1IsIGRmc3BhcmFtcy0+ZGZzX2ZpcnB3cikpCisJCQllcnJvciA9IC1FSU5WQUw7CisJCWlmICghZGZzX3NldF90aHJlc2hvbGRzCisJCQkgICAgKGljLCBERlNfUEFSQU1fUlJTU0ksIGRmc3BhcmFtcy0+ZGZzX3Jyc3NpKSkKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJaWYgKCFkZnNfc2V0X3RocmVzaG9sZHMKKwkJCSAgICAoaWMsIERGU19QQVJBTV9IRUlHSFQsIGRmc3BhcmFtcy0+ZGZzX2hlaWdodCkpCisJCQllcnJvciA9IC1FSU5WQUw7CisJCWlmICghZGZzX3NldF90aHJlc2hvbGRzCisJCQkgICAgKGljLCBERlNfUEFSQU1fUFJTU0ksIGRmc3BhcmFtcy0+ZGZzX3Byc3NpKSkKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJaWYgKCFkZnNfc2V0X3RocmVzaG9sZHMKKwkJCSAgICAoaWMsIERGU19QQVJBTV9JTkJBTkQsIGRmc3BhcmFtcy0+ZGZzX2luYmFuZCkpCisJCQllcnJvciA9IC1FSU5WQUw7CisJCS8qIDU0MTMgc3BlaWNmaWMgKi8KKwkJaWYgKCFkZnNfc2V0X3RocmVzaG9sZHMKKwkJCSAgICAoaWMsIERGU19QQVJBTV9SRUxQV1IsIGRmc3BhcmFtcy0+ZGZzX3JlbHB3cikpCisJCQllcnJvciA9IC1FSU5WQUw7CisJCWlmICghZGZzX3NldF90aHJlc2hvbGRzCisJCQkgICAgKGljLCBERlNfUEFSQU1fUkVMU1RFUCwgZGZzcGFyYW1zLT5kZnNfcmVsc3RlcCkpCisJCQllcnJvciA9IC1FSU5WQUw7CisJCWlmICghZGZzX3NldF90aHJlc2hvbGRzCisJCQkgICAgKGljLCBERlNfUEFSQU1fTUFYTEVOLCBkZnNwYXJhbXMtPmRmc19tYXhsZW4pKQorCQkJZXJyb3IgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIERGU19HRVRfVEhSRVNIOgorCQlpZiAoIW91dGRhdGEgfHwgIW91dHNpemUKKwkJICAgIHx8ICpvdXRzaXplIDwgc2l6ZW9mKHN0cnVjdCBkZnNfaW9jdGxfcGFyYW1zKSkgeworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJKm91dHNpemUgPSBzaXplb2Yoc3RydWN0IGRmc19pb2N0bF9wYXJhbXMpOworCQlkZnNwYXJhbXMgPSAoc3RydWN0IGRmc19pb2N0bF9wYXJhbXMgKilvdXRkYXRhOworCisJCS8qCisJCSAqIEZldGNoIHRoZSBERlMgdGhyZXNob2xkcyB1c2luZyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCisJCSAqLworCQkodm9pZClkZnNfZ2V0X3RocmVzaG9sZHMoaWMsICZwZW91dCk7CisKKwkJLyoKKwkJICogQ29udmVydCB0aGVtIHRvIHRoZSBkZnMgSU9DVEwgcmVwcmVzZW50YXRpb24uCisJCSAqLworCQlhdGhfZGZzX2Rmc3BhcmFtX3RvX2lvY3RscGFyYW0oJnBlb3V0LCBkZnNwYXJhbXMpOworCQlicmVhazsKKwljYXNlIERGU19SQURBUkRFVEVDVFM6CisJCWlmICghb3V0ZGF0YSB8fCAhb3V0c2l6ZSB8fCAqb3V0c2l6ZSA8IHNpemVvZih1aW50MzJfdCkpIHsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCSpvdXRzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJKigodWludDMyX3QgKikgb3V0ZGF0YSkgPSBkZnMtPmF0aF9kZnNfc3RhdHMubnVtX3JhZGFyX2RldGVjdHM7CisJCWJyZWFrOworCWNhc2UgREZTX0RJU0FCTEVfREVURUNUOgorCQlkZnMtPmRmc19wcm9jX3BoeWVyciAmPSB+REZTX1JBREFSX0VOOworCQlkZnMtPmljLT5pY19kZnNfc3RhdGUuaWdub3JlX2RmcyA9IDE7CisJCURGU19QUklOVEsoIiVzIGVuYWJsZSBkZXRlY3RzLCBpZ25vcmVfZGZzICVkXG4iLAorCQkJICAgX19mdW5jX18sIGRmcy0+aWMtPmljX2Rmc19zdGF0ZS5pZ25vcmVfZGZzKTsKKwkJYnJlYWs7CisJY2FzZSBERlNfRU5BQkxFX0RFVEVDVDoKKwkJZGZzLT5kZnNfcHJvY19waHllcnIgfD0gREZTX1JBREFSX0VOOworCQlkZnMtPmljLT5pY19kZnNfc3RhdGUuaWdub3JlX2RmcyA9IDA7CisJCURGU19QUklOVEsoIiVzIGVuYWJsZSBkZXRlY3RzLCBpZ25vcmVfZGZzICVkXG4iLAorCQkJICAgX19mdW5jX18sIGRmcy0+aWMtPmljX2Rmc19zdGF0ZS5pZ25vcmVfZGZzKTsKKwkJYnJlYWs7CisJY2FzZSBERlNfRElTQUJMRV9GRlQ6CisJCS8qIFVNQUNERlM6IFRPRE86IHZhbCA9IGF0aF9oYWxfZGZzX2NvbmZpZ19mZnQoc2MtPnNjX2FoLCBmYWxzZSk7ICovCisJCURGU19QUklOVEsoIiVzIFRPRE8gZGlzYWJsZSBGRlQgdmFsPTB4JXggXG4iLCBfX2Z1bmNfXywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBERlNfRU5BQkxFX0ZGVDoKKwkJLyogVU1BQ0RGUyBUT0RPOiB2YWwgPSBhdGhfaGFsX2Rmc19jb25maWdfZmZ0KHNjLT5zY19haCwgdHJ1ZSk7ICovCisJCURGU19QUklOVEsoIiVzIFRPRE8gZW5hYmxlIEZGVCB2YWw9MHgleCBcbiIsIF9fZnVuY19fLCB2YWwpOworCQlicmVhazsKKwljYXNlIERGU19TRVRfREVCVUdfTEVWRUw6CisJCWlmIChpbnNpemUgPCBzaXplb2YodWludDMyX3QpIHx8ICFpbmRhdGEpIHsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWRmcy0+ZGZzX2RlYnVnX21hc2sgPSAqKHVpbnQzMl90ICopIGluZGF0YTsKKwkJREZTX1BSSU5USygiJXMgZGVidWcgbGV2ZWwgbm93ID0gMHgleCBcbiIsCisJCQkgICBfX2Z1bmNfXywgZGZzLT5kZnNfZGVidWdfbWFzayk7CisJCWlmIChkZnMtPmRmc19kZWJ1Z19tYXNrICYgQVRIX0RFQlVHX0RGUzMpIHsKKwkJCS8qIEVuYWJsZSBkZWJ1ZyBSYWRhciBFdmVudCAqLworCQkJZGZzLT5kZnNfZXZlbnRfbG9nX29uID0gMTsKKwkJfSBlbHNlIHsKKwkJCWRmcy0+ZGZzX2V2ZW50X2xvZ19vbiA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBERlNfU0VUX0ZBTFNFX1JTU0lfVEhSRVM6CisJCWlmIChpbnNpemUgPCBzaXplb2YodWludDMyX3QpIHx8ICFpbmRhdGEpIHsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWRmcy0+YXRoX2Rmc19mYWxzZV9yc3NpX3RocmVzID0gKih1aW50MzJfdCAqKSBpbmRhdGE7CisJCURGU19QUklOVEsoIiVzIGZhbHNlIFJTU0kgdGhyZXNob2xkIG5vdyA9IDB4JXggXG4iLAorCQkJICAgX19mdW5jX18sIGRmcy0+YXRoX2Rmc19mYWxzZV9yc3NpX3RocmVzKTsKKwkJYnJlYWs7CisJY2FzZSBERlNfU0VUX1BFQUtfTUFHOgorCQlpZiAoaW5zaXplIDwgc2l6ZW9mKHVpbnQzMl90KSB8fCAhaW5kYXRhKSB7CisJCQllcnJvciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlkZnMtPmF0aF9kZnNfcGVha19tYWcgPSAqKHVpbnQzMl90ICopIGluZGF0YTsKKwkJREZTX1BSSU5USygiJXMgcGVha19tYWcgbm93ID0gMHgleCBcbiIsCisJCQkgICBfX2Z1bmNfXywgZGZzLT5hdGhfZGZzX3BlYWtfbWFnKTsKKwkJYnJlYWs7CisJY2FzZSBERlNfSUdOT1JFX0NBQzoKKwkJaWYgKGluc2l6ZSA8IHNpemVvZih1aW50MzJfdCkgfHwgIWluZGF0YSkgeworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCoodWludDMyX3QgKikgaW5kYXRhKSB7CisJCQlkZnMtPmljLT5pY19kZnNfc3RhdGUuaWdub3JlX2NhYyA9IDE7CisJCX0gZWxzZSB7CisJCQlkZnMtPmljLT5pY19kZnNfc3RhdGUuaWdub3JlX2NhYyA9IDA7CisJCX0KKwkJREZTX1BSSU5USygiJXMgaWdub3JlIGNhYyA9IDB4JXggXG4iLAorCQkJICAgX19mdW5jX18sIGRmcy0+aWMtPmljX2Rmc19zdGF0ZS5pZ25vcmVfY2FjKTsKKwkJYnJlYWs7CisJY2FzZSBERlNfU0VUX05PTF9USU1FT1VUOgorCQlpZiAoaW5zaXplIDwgc2l6ZW9mKHVpbnQzMl90KSB8fCAhaW5kYXRhKSB7CisJCQllcnJvciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKihpbnQgKilpbmRhdGEpIHsKKwkJCWRmcy0+YXRoX2Rmc19ub2xfdGltZW91dCA9ICooaW50ICopaW5kYXRhOworCQl9IGVsc2UgeworCQkJZGZzLT5hdGhfZGZzX25vbF90aW1lb3V0ID0gREZTX05PTF9USU1FT1VUX1M7CisJCX0KKwkJREZTX1BSSU5USygiJXMgbm9sIHRpbWVvdXQgPSAlZCBzZWMgXG4iLAorCQkJICAgX19mdW5jX18sIGRmcy0+YXRoX2Rmc19ub2xfdGltZW91dCk7CisJCWJyZWFrOworI2lmbmRlZiBBVEhfREZTX1JBREFSX0RFVEVDVElPTl9PTkxZCisJY2FzZSBERlNfTVVURV9USU1FOgorCQlpZiAoaW5zaXplIDwgc2l6ZW9mKHVpbnQzMl90KSB8fCAhaW5kYXRhKSB7CisJCQllcnJvciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlkYXRhID0gKHVpbnQzMl90ICopIGluZGF0YTsKKwkJZGZzLT5hdGhfZGZzdGVzdHRpbWUgPSAqZGF0YTsKKwkJZGZzLT5hdGhfZGZzdGVzdHRpbWUgKj0gKDEwMDApOyAvKiBjb252ZXJ0IHNlYyBpbnRvIG1zICovCisJCWJyZWFrOworCWNhc2UgREZTX0dFVF9VU0VOT0w6CisJCWlmICghb3V0ZGF0YSB8fCAhb3V0c2l6ZSB8fCAqb3V0c2l6ZSA8IHNpemVvZih1aW50MzJfdCkpIHsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCSpvdXRzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJKigodWludDMyX3QgKikgb3V0ZGF0YSkgPSBkZnMtPmRmc19yaW5mby5ybl91c2Vfbm9sOworCisJCWZvciAoaSA9IDA7CisJCSAgICAgKGkgPCBERlNfRVZFTlRfTE9HX1NJWkUpICYmIChpIDwgZGZzLT5kZnNfZXZlbnRfbG9nX2NvdW50KTsKKwkJICAgICBpKyspIHsKKwkJCS8qIERGU19EUFJJTlRLKHNjLCBBVEhfREVCVUdfREZTLCJ0cz0lbGx1IGRpZmZfdHM9JXUgcnNzaT0ldSBkdXI9JXVcbiIsIGRmcy0+cmFkYXJfbG9nW2ldLnRzLCBkZnMtPnJhZGFyX2xvZ1tpXS5kaWZmX3RzLCBkZnMtPnJhZGFyX2xvZ1tpXS5yc3NpLCBkZnMtPnJhZGFyX2xvZ1tpXS5kdXIpOyAqLworCisJCX0KKwkJZGZzLT5kZnNfZXZlbnRfbG9nX2NvdW50ID0gMDsKKwkJZGZzLT5kZnNfcGh5ZXJyX2NvdW50ID0gMDsKKwkJZGZzLT5kZnNfcGh5ZXJyX3JlamVjdF9jb3VudCA9IDA7CisJCWRmcy0+ZGZzX3BoeWVycl9xdWV1ZWRfY291bnQgPSAwOworCQlkZnMtPmRmc19waHllcnJfZnJlcV9taW4gPSAweDdmZmZmZmZmOworCQlkZnMtPmRmc19waHllcnJfZnJlcV9tYXggPSAwOworCQlicmVhazsKKwljYXNlIERGU19TRVRfVVNFTk9MOgorCQlpZiAoaW5zaXplIDwgc2l6ZW9mKHVpbnQzMl90KSB8fCAhaW5kYXRhKSB7CisJCQllcnJvciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlkZnMtPmRmc19yaW5mby5ybl91c2Vfbm9sID0gKih1aW50MzJfdCAqKSBpbmRhdGE7CisJCS8qIGl3cHJpdiBtYXJrZGZzIGluIGxpbnV4IGNhbiBkbyB0aGUgc2FtZSB0aGluZy4uLiAqLworCQlicmVhazsKKwljYXNlIERGU19HRVRfTk9MOgorCQlpZiAoIW91dGRhdGEgfHwgIW91dHNpemUKKwkJICAgIHx8ICpvdXRzaXplIDwgc2l6ZW9mKHN0cnVjdCBkZnNyZXFfbm9saW5mbykpIHsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCSpvdXRzaXplID0gc2l6ZW9mKHN0cnVjdCBkZnNyZXFfbm9saW5mbyk7CisJCW5vbCA9IChzdHJ1Y3QgZGZzcmVxX25vbGluZm8gKilvdXRkYXRhOworCQlkZnNfZ2V0X25vbChkZnMsIChzdHJ1Y3QgZGZzcmVxX25vbGVsZW0gKilub2wtPmRmc19ub2wsCisJCQkgICAgJm5vbC0+aWNfbmNoYW5zKTsKKwkJZGZzX3ByaW50X25vbChkZnMpOworCQlicmVhazsKKwljYXNlIERGU19TRVRfTk9MOgorCQlpZiAoaW5zaXplIDwgc2l6ZW9mKHN0cnVjdCBkZnNyZXFfbm9saW5mbykgfHwgIWluZGF0YSkgeworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJbm9sID0gKHN0cnVjdCBkZnNyZXFfbm9saW5mbyAqKWluZGF0YTsKKwkJZGZzX3NldF9ub2woZGZzLCAoc3RydWN0IGRmc3JlcV9ub2xlbGVtICopbm9sLT5kZnNfbm9sLAorCQkJICAgIG5vbC0+aWNfbmNoYW5zKTsKKwkJYnJlYWs7CisKKwljYXNlIERGU19TSE9XX05PTDoKKwkJZGZzX3ByaW50X25vbChkZnMpOworCQlicmVhazsKKwljYXNlIERGU19CQU5HUkFEQVI6CisjaWYgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1FUkdFX1RCRCAqLworCQlpZiAoc2MtPnNjX25vc3RhYmVhY29ucykgeworCQkJcHJpbnRrKCJObyByYWRhciBkZXRlY3Rpb24gRW5hYmxlZCBcbiIpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQlkZnMtPmRmc19iYW5ncmFkYXIgPSAxOworCQlkZnMtPmF0aF9yYWRhcl90YXNrc2NoZWQgPSAxOworCQlPU19TRVRfVElNRVIoJmRmcy0+YXRoX2Rmc190YXNrX3RpbWVyLCAwKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogQVRIX0RGU19SQURBUl9ERVRFQ1RJT05fT05MWSAqLworCWRlZmF1bHQ6CisJCWVycm9yID0gLUVJTlZBTDsKKwl9CitiYWQ6CisJcmV0dXJuIGVycm9yOworfQorCitpbnQKK2Rmc19zZXRfdGhyZXNob2xkcyhzdHJ1Y3QgaWVlZTgwMjExY29tICppYywgY29uc3QgdWludDMyX3QgdGhyZXNodHlwZSwKKwkJICAgY29uc3QgdWludDMyX3QgdmFsdWUpCit7CisJc3RydWN0IGF0aF9kZnMgKmRmcyA9IChzdHJ1Y3QgYXRoX2RmcyAqKWljLT5pY19kZnM7CisJaW50MTZfdCBjaGFuaW5kZXg7CisJc3RydWN0IGRmc19zdGF0ZSAqcnM7CisJc3RydWN0IGF0aF9kZnNfcGh5ZXJyX3BhcmFtIHBlOworCWludCBpc19mYXN0Y2xrID0gMDsgICAgIC8qIFhYWCB0aHJvdy1hd2F5ICovCisKKwlpZiAoZGZzID09IE5VTEwpIHsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMSwgIiVzOiBpY19kZnMgaXMgTlVMTFxuIiwKKwkJCSAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCWNoYW5pbmRleCA9IGRmcy0+ZGZzX2N1cmNoYW5fcmFkaW5kZXg7CisJaWYgKChjaGFuaW5kZXggPCAwKSB8fCAoY2hhbmluZGV4ID49IERGU19OVU1fUkFEQVJfU1RBVEVTKSkgeworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMxLAorCQkJICAgICIlczogY2hhbmluZGV4ID0gJWQsIERGU19OVU1fUkFEQVJfU1RBVEVTPSVkXG4iLAorCQkJICAgIF9fZnVuY19fLCBjaGFuaW5kZXgsIERGU19OVU1fUkFEQVJfU1RBVEVTKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTLAorCQkgICAgIiVzOiB0aHJlc2h0eXBlPSVkLCB2YWx1ZT0lZFxuIiwgX19mdW5jX18sIHRocmVzaHR5cGUsCisJCSAgICB2YWx1ZSk7CisKKwlhdGhfZGZzX3BoeWVycl9pbml0X25vdmFsKCZwZSk7CisKKwlycyA9ICYoZGZzLT5kZnNfcmFkYXJbY2hhbmluZGV4XSk7CisJc3dpdGNoICh0aHJlc2h0eXBlKSB7CisJY2FzZSBERlNfUEFSQU1fRklSUFdSOgorCQlycy0+cnNfcGFyYW0ucGVfZmlycHdyID0gKGludDMyX3QpIHZhbHVlOworCQlwZS5wZV9maXJwd3IgPSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBERlNfUEFSQU1fUlJTU0k6CisJCXJzLT5yc19wYXJhbS5wZV9ycnNzaSA9IHZhbHVlOworCQlwZS5wZV9ycnNzaSA9IHZhbHVlOworCQlicmVhazsKKwljYXNlIERGU19QQVJBTV9IRUlHSFQ6CisJCXJzLT5yc19wYXJhbS5wZV9oZWlnaHQgPSB2YWx1ZTsKKwkJcGUucGVfaGVpZ2h0ID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgREZTX1BBUkFNX1BSU1NJOgorCQlycy0+cnNfcGFyYW0ucGVfcHJzc2kgPSB2YWx1ZTsKKwkJcGUucGVfcHJzc2kgPSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBERlNfUEFSQU1fSU5CQU5EOgorCQlycy0+cnNfcGFyYW0ucGVfaW5iYW5kID0gdmFsdWU7CisJCXBlLnBlX2luYmFuZCA9IHZhbHVlOworCQlicmVhazsKKwkvKiA1NDEzIHNwZWNpZmljICovCisJY2FzZSBERlNfUEFSQU1fUkVMUFdSOgorCQlycy0+cnNfcGFyYW0ucGVfcmVscHdyID0gdmFsdWU7CisJCXBlLnBlX3JlbHB3ciA9IHZhbHVlOworCQlicmVhazsKKwljYXNlIERGU19QQVJBTV9SRUxTVEVQOgorCQlycy0+cnNfcGFyYW0ucGVfcmVsc3RlcCA9IHZhbHVlOworCQlwZS5wZV9yZWxzdGVwID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgREZTX1BBUkFNX01BWExFTjoKKwkJcnMtPnJzX3BhcmFtLnBlX21heGxlbiA9IHZhbHVlOworCQlwZS5wZV9tYXhsZW4gPSB2YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMSwKKwkJCSAgICAiJXM6IHVua25vd24gdGhyZXNodHlwZSAoJWQpXG4iLAorCQkJICAgIF9fZnVuY19fLCB0aHJlc2h0eXBlKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBUaGUgZHJpdmVyIGxheWVyIGRmc19lbmFibGUgcm91dGluZSBpcyB0YXNrZWQgd2l0aCB0cmFuc2xhdGluZworCSAqIHZhbHVlcyBmcm9tIHRoZSBnbG9iYWwgZm9ybWF0IHRvIHRoZSBwZXItZGV2aWNlIChIQUwsIG9mZmxvYWQpCisJICogZm9ybWF0LgorCSAqLworCWljLT5pY19kZnNfZW5hYmxlKGljLCAmaXNfZmFzdGNsaywgJnBlKTsKKwlyZXR1cm4gMTsKK30KKworaW50CitkZnNfZ2V0X3RocmVzaG9sZHMoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsIHN0cnVjdCBhdGhfZGZzX3BoeWVycl9wYXJhbSAqcGFyYW0pCit7CisJLyogVU1BQ0RGUyA6IFRPRE86YXRoX2hhbF9nZXRkZnN0aHJlc2goc2MtPnNjX2FoLCBwYXJhbSk7ICovCisKKwlPU19NRU1aRVJPKHBhcmFtLCBzaXplb2YoKnBhcmFtKSk7CisKKwkodm9pZClpYy0+aWNfZGZzX2dldF90aHJlc2hvbGRzKGljLCBwYXJhbSk7CisKKwlyZXR1cm4gMTsKK30KKwordWludDE2X3QgZGZzX3VzZW5vbChzdHJ1Y3QgaWVlZTgwMjExY29tICppYykKK3sKKwlzdHJ1Y3QgYXRoX2RmcyAqZGZzID0gKHN0cnVjdCBhdGhfZGZzICopaWMtPmljX2RmczsKKwlyZXR1cm4gZGZzID8gKHVpbnQxNl90KSBkZnMtPmRmc19yaW5mby5ybl91c2Vfbm9sIDogMDsKK30KKwordWludDE2X3QgZGZzX2lzZGZzcmVnZG9tYWluKHN0cnVjdCBpZWVlODAyMTFjb20gKmljKQoreworCXN0cnVjdCBhdGhfZGZzICpkZnMgPSAoc3RydWN0IGF0aF9kZnMgKilpYy0+aWNfZGZzOworCXJldHVybiBkZnMgPyBkZnMtPmRmc2RvbWFpbiA6IDA7Cit9CisKKyNlbmRpZiAvKiBBVEhfVVBQT1JUX0RGUyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zYXAvZGZzL3NyYy9kZnNfYmluZGV0ZWN0cy5jIGIvY29yZS9zYXAvZGZzL3NyYy9kZnNfYmluZGV0ZWN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDgzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19iaW5kZXRlY3RzLmMKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgIGRmc19iaW5kZXRlY3RzLmMKKworICAgT1ZFUlZJRVc6CisKKyAgIFNvdXJjZSBjb2RlIGJvcnJvd2VkIGZyb20gUUNBX01BSU4gREZTIG1vZHVsZQorCisgICBERVBFTkRFTkNJRVM6CisKKyAgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKyAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworICAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CisgICAtLS0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAiZGZzLmgiCisvKlRPIERPIERGUyByZW1vdmluZworICAgI2luY2x1ZGUgPGllZWU4MDIxMV92YXIuaD4KKyAqLworI2lmZGVmIEFUSF9TVVBQT1JUX0RGUworCitpbnQKK2Rmc19iaW5fZml4ZWRwYXR0ZXJuX2NoZWNrKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCBkZnNfZmlsdGVyICpyZiwKKwkJCSAgIHVpbnQzMl90IGR1ciwgaW50IGV4dF9jaGFuX2ZsYWcpCit7CisJc3RydWN0IGRmc19wdWxzZWxpbmUgKnBsID0gZGZzLT5wdWxzZXM7CisJaW50IGksIG4sIHJlZnByaSwgcHJpbWFyZ2luLCBudW1wdWxzZXMgPSAwOworCXVpbnQ2NF90IHN0YXJ0X3RzLCBlbmRfdHMsIGV2ZW50X3RzLCBwcmV2X2V2ZW50X3RzLCBuZXh0X2V2ZW50X3RzLAorCQkgd2luZG93X3N0YXJ0LCB3aW5kb3dfZW5kOworCXVpbnQzMl90IGluZGV4LCBuZXh0X2luZGV4LCBkZWx0YWR1cjsKKworCS8qIEZvciBmaXhlZCBwYXR0ZXJuIHR5cGVzLCByZi0+cmZfcGF0dGVybnR5cGU9MSAqLworCXByaW1hcmdpbiA9CisJCWRmc19nZXRfcHJpX21hcmdpbihkZnMsIGV4dF9jaGFuX2ZsYWcsIChyZi0+cmZfcGF0dGVybnR5cGUgPT0gMSkpOworCisJcmVmcHJpID0gKHJmLT5yZl9taW5wcmkgKyByZi0+cmZfbWF4cHJpKSAvIDI7CisJaW5kZXggPSBwbC0+cGxfbGFzdGVsZW07CisJZW5kX3RzID0gcGwtPnBsX2VsZW1zW2luZGV4XS5wX3RpbWU7CisJc3RhcnRfdHMgPSBlbmRfdHMgLSAocmVmcHJpICogcmYtPnJmX251bXB1bHNlcyk7CisKKwlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMzLAorCQkgICAgImxhc3RlbGVtIHRzPSVsbHUgc3RhcnRfdHM9JWxsdSwgZW5kX3RzPSVsbHVcbiIsCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXBsLT5wbF9lbGVtc1tpbmRleF0ucF90aW1lLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydF90cywgKHVuc2lnbmVkIGxvbmcgbG9uZyllbmRfdHMpOworCisJLyogZmluZCB0aGUgaW5kZXggb2YgZmlyc3QgZWxlbWVudCBpbiBvdXIgd2luZG93IG9mIGludGVyZXN0ICovCisJZm9yIChpID0gMDsgaSA8IHBsLT5wbF9udW1lbGVtczsgaSsrKSB7CisJCWluZGV4ID0gKGluZGV4IC0gMSkgJiBERlNfTUFYX1BVTFNFX0JVRkZFUl9NQVNLOworCQlpZiAocGwtPnBsX2VsZW1zW2luZGV4XS5wX3RpbWUgPj0gc3RhcnRfdHMpCisJCQljb250aW51ZTsKKwkJZWxzZSB7CisJCQlpbmRleCA9IChpbmRleCkgJiBERlNfTUFYX1BVTFNFX0JVRkZFUl9NQVNLOworCQkJYnJlYWs7CisJCX0KKwl9CisJZm9yIChuID0gMDsgbiA8PSByZi0+cmZfbnVtcHVsc2VzOyBuKyspIHsKKwkJd2luZG93X3N0YXJ0ID0gKHN0YXJ0X3RzICsgKHJlZnByaSAqIG4pKSAtIChwcmltYXJnaW4gKyBuKTsKKwkJd2luZG93X2VuZCA9IHdpbmRvd19zdGFydCArIDIgKiAocHJpbWFyZ2luICsgbik7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzIsCisJCQkgICAgIndpbmRvd19zdGFydCAldSB3aW5kb3dfZW5kICV1IFxuIiwKKwkJCSAgICAodWludDMyX3QpIHdpbmRvd19zdGFydCwgKHVpbnQzMl90KSB3aW5kb3dfZW5kKTsKKwkJZm9yIChpID0gMDsgaSA8IHBsLT5wbF9udW1lbGVtczsgaSsrKSB7CisJCQlwcmV2X2V2ZW50X3RzID0gcGwtPnBsX2VsZW1zW2luZGV4XS5wX3RpbWU7CisJCQlpbmRleCA9IChpbmRleCArIDEpICYgREZTX01BWF9QVUxTRV9CVUZGRVJfTUFTSzsKKwkJCWV2ZW50X3RzID0gcGwtPnBsX2VsZW1zW2luZGV4XS5wX3RpbWU7CisJCQluZXh0X2luZGV4ID0gKGluZGV4ICsgMSkgJiBERlNfTUFYX1BVTFNFX0JVRkZFUl9NQVNLOworCQkJbmV4dF9ldmVudF90cyA9IHBsLT5wbF9lbGVtc1tuZXh0X2luZGV4XS5wX3RpbWU7CisJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMyLAorCQkJCSAgICAidHMgJXUgXG4iLCAodWludDMyX3QpIGV2ZW50X3RzKTsKKwkJCWlmICgoZXZlbnRfdHMgPD0gd2luZG93X2VuZCkKKwkJCSAgICAmJiAoZXZlbnRfdHMgPj0gd2luZG93X3N0YXJ0KSkgeworCQkJCWRlbHRhZHVyID0KKwkJCQkJREZTX0RJRkYocGwtPnBsX2VsZW1zW2luZGV4XS5wX2R1ciwgZHVyKTsKKwkJCQlpZiAoKHBsLT5wbF9lbGVtc1tpbmRleF0ucF9kdXIgPT0gMSkKKwkJCQkgICAgfHwgKChkdXIgIT0gMSkgJiYgKGRlbHRhZHVyIDw9IDIpKSkgeworCQkJCQludW1wdWxzZXMrKzsKKwkJCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJCQkJCSAgICAibnVtcHVsc2VzICV1IFxuIiwKKwkJCQkJCSAgICBudW1wdWxzZXMpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGV2ZW50X3RzID4gd2luZG93X2VuZCkgeworCQkJCWluZGV4ID0gKGluZGV4IC0gMSkgJiBERlNfTUFYX1BVTFNFX0JVRkZFUl9NQVNLOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChldmVudF90cyA9PSBwcmV2X2V2ZW50X3RzKSB7CisJCQkJaWYgKCgobmV4dF9ldmVudF90cyAtIGV2ZW50X3RzKSA+IHJlZnByaSkgfHwKKwkJCQkgICAgKChuZXh0X2V2ZW50X3RzIC0gZXZlbnRfdHMpID09IDApKSB7CisJCQkJCWRlbHRhZHVyID0KKwkJCQkJCURGU19ESUZGKHBsLT5wbF9lbGVtc1tpbmRleF0ucF9kdXIsCisJCQkJCQkJIGR1cik7CisJCQkJCWlmICgocGwtPnBsX2VsZW1zW2luZGV4XS5wX2R1ciA9PSAxKQorCQkJCQkgICAgfHwgKChwbC0+cGxfZWxlbXNbaW5kZXhdLnBfZHVyICE9IDEpCisJCQkJCQkmJiAoZGVsdGFkdXIgPD0gMikpKSB7CisJCQkJCQludW1wdWxzZXMrKzsKKwkJCQkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzIsCisJCQkJCQkJICAgICJ6ZXJvIFBSSTogbnVtcHVsc2VzICV1IFxuIiwKKwkJCQkJCQkgICAgbnVtcHVsc2VzKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChudW1wdWxzZXMgPj0gZGZzX2dldF9maWx0ZXJfdGhyZXNob2xkKGRmcywgcmYsIGV4dF9jaGFuX2ZsYWcpKSB7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzEsCisJCQkgICAgIiVzIEZPVU5EIGZpbHRlcklEPSV1IG51bXB1bHNlcz0lZCB1bmFkaiB0aHJlc2g9JWRcbiIsCisJCQkgICAgX19mdW5jX18sIHJmLT5yZl9wdWxzZWlkLCBudW1wdWxzZXMsCisJCQkgICAgcmYtPnJmX3RocmVzaG9sZCk7CisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKwordm9pZAorZGZzX2FkZF9wdWxzZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzX2ZpbHRlciAqcmYsIHN0cnVjdCBkZnNfZXZlbnQgKnJlLAorCSAgICAgIHVpbnQzMl90IGRlbHRhVCwgdWludDY0X3QgdGhpc190cykKK3sKKwl1aW50MzJfdCBpbmRleCwgbiwgd2luZG93OworCXN0cnVjdCBkZnNfZGVsYXlsaW5lICpkbDsKKworCWRsID0gJnJmLT5yZl9kbDsKKwkvKiBDaXJjdWxhciBidWZmZXIgb2Ygc2l6ZSAyXm4gKi8KKwlpbmRleCA9IChkbC0+ZGxfbGFzdGVsZW0gKyAxKSAmIERGU19NQVhfRExfTUFTSzsKKwkvKiBpZiAoKGRsLT5kbF9udW1lbGVtcysxKSA9PSBERlNfTUFYX0RMX1NJWkUpICovCisJaWYgKChkbC0+ZGxfbnVtZWxlbXMpID09IERGU19NQVhfRExfU0laRSkKKwkJZGwtPmRsX2ZpcnN0ZWxlbSA9IChkbC0+ZGxfZmlyc3RlbGVtICsgMSkgJiBERlNfTUFYX0RMX01BU0s7CisJZWxzZQorCQlkbC0+ZGxfbnVtZWxlbXMrKzsKKwlkbC0+ZGxfbGFzdGVsZW0gPSBpbmRleDsKKwlkbC0+ZGxfZWxlbXNbaW5kZXhdLmRlX3RpbWUgPSBkZWx0YVQ7CisJZGwtPmRsX2VsZW1zW2luZGV4XS5kZV90cyA9IHRoaXNfdHM7CisJd2luZG93ID0gZGVsdGFUOworCWRsLT5kbF9lbGVtc1tpbmRleF0uZGVfZHVyID0gcmUtPnJlX2R1cjsKKwlkbC0+ZGxfZWxlbXNbaW5kZXhdLmRlX3Jzc2kgPSByZS0+cmVfcnNzaTsKKworCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzIsCisJCSAgICAiJXM6IGFkZGluZzogZmlsdGVyIGlkICVkLCBkdXI9JWQsIHJzc2k9JWQsIHRzPSVsbHVcbiIsCisJCSAgICBfX2Z1bmNfXywKKwkJICAgIHJmLT5yZl9wdWxzZWlkLAorCQkgICAgcmUtPnJlX2R1ciwgcmUtPnJlX3Jzc2ksICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KXRoaXNfdHMpOworCisJZm9yIChuID0gMDsgbiA8IGRsLT5kbF9udW1lbGVtcyAtIDE7IG4rKykgeworCQlpbmRleCA9IChpbmRleCAtIDEpICYgREZTX01BWF9ETF9NQVNLOworCQkvKgorCQkgKiBjYWxjdWxhdGUgd2luZG93IGJhc2VkIG9uIGZ1bGwgdGltZSBzdGFtcCBpbnN0ZWFkIG9mIGRlbHRhVAorCQkgKiBkZWx0YVQgKGRlX3RpbWUpIG1heSByZXN1bHQgaW4gaW5jb3JyZWN0IHdpbmRvdyB2YWx1ZQorCQkgKi8KKwkJd2luZG93ID0gKHVpbnQzMl90KSAodGhpc190cyAtIGRsLT5kbF9lbGVtc1tpbmRleF0uZGVfdHMpOworCisJCWlmICh3aW5kb3cgPiByZi0+cmZfZmlsdGVybGVuKSB7CisJCQlkbC0+ZGxfZmlyc3RlbGVtID0gKGluZGV4ICsgMSkgJiBERlNfTUFYX0RMX01BU0s7CisJCQlkbC0+ZGxfbnVtZWxlbXMgPSBuICsgMTsKKwkJfQorCX0KKwlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMyLAorCQkgICAgImRsIGZpcnN0RWxlbSA9ICVkICBsYXN0RWxlbSA9ICVkXG4iLCBkbC0+ZGxfZmlyc3RlbGVtLAorCQkgICAgZGwtPmRsX2xhc3RlbGVtKTsKK30KKworaW50CitkZnNfYmluX2NoZWNrKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCBkZnNfZmlsdGVyICpyZiwgdWludDMyX3QgZGVsdGFULAorCSAgICAgIHVpbnQzMl90IHdpZHRoLCBpbnQgZXh0X2NoYW5fZmxhZykKK3sKKwl1aW50MzJfdCByZWZwcmksIHJlZmR1ciwgc2VhcmNocHJpLCBkZWx0YXByaSwgZGVsdGFwcmlfMiwgZGVsdGFwcmlfMywKKwkJIGF2ZXJhZ2VyZWZwcmk7CisJdWludDMyX3QgbiwgaSwgcHJpbWFyZ2luLCBkdXJtYXJnaW4sIGhpZ2hzY29yZSwgaGlnaHNjb3JlaW5kZXg7CisJaW50IHNjb3JlW0RGU19NQVhfRExfU0laRV0sIGRlbGF5aW5kZXgsIGRpbmRleCwgZm91bmQgPSAwOworCXN0cnVjdCBkZnNfZGVsYXlsaW5lICpkbDsKKwl1aW50MzJfdCBzY29yZWluZGV4LCBsb3dwcmlpbmRleCA9IDAsIGxvd3ByaSA9IDB4ZmZmZjsKKwlpbnQgbnVtcHVsc2VzID0gMDsKKwlpbnQgbG93cHJpY2hrID0gMywgcHJpX21hdGNoID0gMDsKKworCWRsID0gJnJmLT5yZl9kbDsKKwlpZiAoZGwtPmRsX251bWVsZW1zIDwgKHJmLT5yZl90aHJlc2hvbGQgLSAxKSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGRlbHRhVCA+IHJmLT5yZl9maWx0ZXJsZW4pCisJCXJldHVybiAwOworCisJcHJpbWFyZ2luID0KKwkJZGZzX2dldF9wcmlfbWFyZ2luKGRmcywgZXh0X2NoYW5fZmxhZywgKHJmLT5yZl9wYXR0ZXJudHlwZSA9PSAxKSk7CisKKwlpZiAocmYtPnJmX21heGR1ciA8IDEwKSB7CisJCWR1cm1hcmdpbiA9IDQ7CisJfSBlbHNlIHsKKwkJZHVybWFyZ2luID0gNjsKKwl9CisKKwlpZiAocmYtPnJmX3BhdHRlcm50eXBlID09IDEpIHsKKwkJZm91bmQgPQorCQkJZGZzX2Jpbl9maXhlZHBhdHRlcm5fY2hlY2soZGZzLCByZiwgd2lkdGgsIGV4dF9jaGFuX2ZsYWcpOworCQlpZiAoZm91bmQpIHsKKwkJCWRsLT5kbF9udW1lbGVtcyA9IDA7CisJCX0KKwkJcmV0dXJuIGZvdW5kOworCX0KKworCU9TX01FTVpFUk8oc2NvcmUsIHNpemVvZihpbnQpICogREZTX01BWF9ETF9TSVpFKTsKKwkvKiBmaW5kIG91dCB0aGUgbG93ZXN0IHByaSAqLworCWZvciAobiA9IDA7IG4gPCBkbC0+ZGxfbnVtZWxlbXM7IG4rKykgeworCQlkZWxheWluZGV4ID0gKGRsLT5kbF9maXJzdGVsZW0gKyBuKSAmIERGU19NQVhfRExfTUFTSzsKKwkJcmVmcHJpID0gZGwtPmRsX2VsZW1zW2RlbGF5aW5kZXhdLmRlX3RpbWU7CisJCWlmIChyZWZwcmkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChyZWZwcmkgPCBsb3dwcmkpIHsKKwkJCWxvd3ByaSA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV90aW1lOworCQkJbG93cHJpaW5kZXggPSBuOworCQl9CisJfQorCS8qIGZpbmQgb3V0IHRoZSBlYWNoIGRlbGF5IGVsZW1lbnQncyBwcmkgc2NvcmUgKi8KKwlmb3IgKG4gPSAwOyBuIDwgZGwtPmRsX251bWVsZW1zOyBuKyspIHsKKwkJZGVsYXlpbmRleCA9IChkbC0+ZGxfZmlyc3RlbGVtICsgbikgJiBERlNfTUFYX0RMX01BU0s7CisJCXJlZnByaSA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV90aW1lOworCQlpZiAocmVmcHJpID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKHJlZnByaSA8IHJmLT5yZl9tYXhwcmkpIHsgICAvKiB1c2Ugb25seSB2YWxpZCBQUkkgcmFuZ2UgZm9yIGhpZ2ggc2NvcmUgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBkbC0+ZGxfbnVtZWxlbXM7IGkrKykgeworCQkJCWRpbmRleCA9CisJCQkJCShkbC0+ZGxfZmlyc3RlbGVtICsgaSkgJiBERlNfTUFYX0RMX01BU0s7CisJCQkJc2VhcmNocHJpID0gZGwtPmRsX2VsZW1zW2RpbmRleF0uZGVfdGltZTsKKwkJCQlkZWx0YXByaSA9IERGU19ESUZGKHNlYXJjaHByaSwgcmVmcHJpKTsKKwkJCQlkZWx0YXByaV8yID0gREZTX0RJRkYoc2VhcmNocHJpLCAyICogcmVmcHJpKTsKKwkJCQlkZWx0YXByaV8zID0gREZTX0RJRkYoc2VhcmNocHJpLCAzICogcmVmcHJpKTsKKwkJCQlpZiAocmYtPnJmX2lnbm9yZV9wcmlfd2luZG93ID09IDIpIHsKKwkJCQkJcHJpX21hdGNoID0gKChkZWx0YXByaSA8IHByaW1hcmdpbikKKwkJCQkJCSAgICAgfHwgKGRlbHRhcHJpXzIgPCBwcmltYXJnaW4pCisJCQkJCQkgICAgIHx8IChkZWx0YXByaV8zIDwKKwkJCQkJCQkgcHJpbWFyZ2luKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpX21hdGNoID0gKGRlbHRhcHJpIDwgcHJpbWFyZ2luKTsKKwkJCQl9CisKKwkJCQlpZiAocHJpX21hdGNoKQorCQkJCQlzY29yZVtuXSsrOworCQkJfQorCQl9IGVsc2UgeworCQkJc2NvcmVbbl0gPSAwOworCQl9CisJCWlmIChzY29yZVtuXSA+IHJmLT5yZl90aHJlc2hvbGQpIHsKKwkJCS8qIHdlIGdvdCB0aGUgbW9zdCBwb3NzaWJsZSBjYW5kaWRhdGUsCisJCQkgKiBubyBuZWVkIHRvIGNvbnRpbnVlIGZ1cnRoZXIgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCS8qIGZpbmQgb3V0IHRoZSBoaWdoIHNjb3JlciAqLworCWhpZ2hzY29yZSA9IDA7CisJaGlnaHNjb3JlaW5kZXggPSAwOworCWZvciAobiA9IDA7IG4gPCBkbC0+ZGxfbnVtZWxlbXM7IG4rKykgeworCQlpZiAoc2NvcmVbbl0gPiBoaWdoc2NvcmUpIHsKKwkJCWhpZ2hzY29yZSA9IHNjb3JlW25dOworCQkJaGlnaHNjb3JlaW5kZXggPSBuOworCQl9IGVsc2UgaWYgKHNjb3JlW25dID09IGhpZ2hzY29yZSkgeworCQkJLyptb3JlIHRoYW4gb25lIHByaSBoYXMgaGlnaHNjb3JlIHRha2UgdGhlIGxlYXN0IHByaSAqLworCQkJZGVsYXlpbmRleCA9CisJCQkJKGRsLT5kbF9maXJzdGVsZW0gKworCQkJCSBoaWdoc2NvcmVpbmRleCkgJiBERlNfTUFYX0RMX01BU0s7CisJCQlkaW5kZXggPSAoZGwtPmRsX2ZpcnN0ZWxlbSArIG4pICYgREZTX01BWF9ETF9NQVNLOworCQkJaWYgKGRsLT5kbF9lbGVtc1tkaW5kZXhdLmRlX3RpbWUgPD0KKwkJCSAgICBkbC0+ZGxfZWxlbXNbZGVsYXlpbmRleF0uZGVfdGltZSkgeworCQkJCWhpZ2hzY29yZWluZGV4ID0gbjsKKwkJCX0KKwkJfQorCX0KKwkvKiBmaW5kIHRoZSBhdmVyYWdlIHByaSBvZiBwdWxzZXMgYXJvdW5kIHRoZSBwcmkgb2YgaGlnaHNjb3JlIG9yCisJICogdGhlIHB1bHNlcyBhcm91bmQgdGhlIGxvd2VzdCBwcmkgKi8KKwlpZiAocmYtPnJmX2lnbm9yZV9wcmlfd2luZG93ID4gMCkgeworCQlsb3dwcmljaGsgPSAocmYtPnJmX3RocmVzaG9sZCA+PiAxKSArIDE7CisJfSBlbHNlIHsKKwkJbG93cHJpY2hrID0gMzsKKwl9CisKKwlpZiAoaGlnaHNjb3JlIDwgbG93cHJpY2hrKSB7CisJCXNjb3JlaW5kZXggPSBsb3dwcmlpbmRleDsKKwl9IGVsc2UgeworCQlzY29yZWluZGV4ID0gaGlnaHNjb3JlaW5kZXg7CisJfQorCS8qIFdlIGdvdCB0aGUgcG9zc2libGUgcHJpLCBzYXZlIGl0cyBwYXJhbWV0ZXJzIGFzIHJlZmVyZW5jZSAqLworCWRlbGF5aW5kZXggPSAoZGwtPmRsX2ZpcnN0ZWxlbSArIHNjb3JlaW5kZXgpICYgREZTX01BWF9ETF9NQVNLOworCXJlZmR1ciA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV9kdXI7CisJcmVmcHJpID0gZGwtPmRsX2VsZW1zW2RlbGF5aW5kZXhdLmRlX3RpbWU7CisJYXZlcmFnZXJlZnByaSA9IDA7CisKKwlpZiAocmYtPnJmX2ZpeGVkX3ByaV9yYWRhcl9wdWxzZSkgeworCQlyZWZwcmkgPSAocmYtPnJmX21pbnByaSArIHJmLT5yZl9tYXhwcmkpIC8gMjsKKwl9CisKKwludW1wdWxzZXMgPSBkZnNfYmluX3ByaV9jaGVjayhkZnMsIHJmLCBkbCwgc2NvcmVbc2NvcmVpbmRleF0sIHJlZnByaSwKKwkJCQkgICAgICByZWZkdXIsIGV4dF9jaGFuX2ZsYWcsIHJlZnByaSk7CisJaWYgKG51bXB1bHNlcyA+PSBkZnNfZ2V0X2ZpbHRlcl90aHJlc2hvbGQoZGZzLCByZiwgZXh0X2NoYW5fZmxhZykpIHsKKwkJZm91bmQgPSAxOworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMxLAorCQkJICAgICJleHRfZmxhZz0lZCBNQVRDSCBmaWx0ZXI9JXUgbnVtcHVsc2VzPSV1IHRocmVzaD0ldSByZWZkdXI9JWQgcmVmcHJpPSVkIHByaW1hcmdpbj0lZFxuIiwKKwkJCSAgICBleHRfY2hhbl9mbGFnLCByZi0+cmZfcHVsc2VpZCwgbnVtcHVsc2VzLAorCQkJICAgIHJmLT5yZl90aHJlc2hvbGQsIHJlZmR1ciwgcmVmcHJpLCBwcmltYXJnaW4pOworCQlkZnNfcHJpbnRfZGVsYXlsaW5lKGRmcywgJnJmLT5yZl9kbCk7CisJCWRmc19wcmludF9maWx0ZXIoZGZzLCByZik7CisJfQorCXJldHVybiBmb3VuZDsKK30KKworaW50CitkZnNfYmluX3ByaV9jaGVjayhzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzX2ZpbHRlciAqcmYsCisJCSAgc3RydWN0IGRmc19kZWxheWxpbmUgKmRsLCB1aW50MzJfdCBzY29yZSwgdWludDMyX3QgcmVmcHJpLAorCQkgIHVpbnQzMl90IHJlZmR1ciwgaW50IGV4dF9jaGFuX2ZsYWcsIGludCBmdW5kYW1lbnRhbHByaSkKK3sKKwl1aW50MzJfdCBzZWFyY2hwcmksIHNlYXJjaGR1ciwgc2VhcmNocnNzaSwgZGVsdGFwcmkgPSAwLCBkZWx0YXByaTEgPQorCQkwLCBkZWx0YXByaTIgPSAwLCBkZWx0YWR1ciwgYXZlcmFnZXJlZnByaSA9IDAsIE1hdGNoQ291bnQgPSAwOworCXVpbnQzMl90IGRlbHRhX3RzX3ZhcmlhbmNlLCBkZWx0YV90aW1lX3N0YW1wcywgcHJldl9nb29kX3RpbWVzdGFtcCA9IDA7CisJaW50IGRlbGF5aW5kZXgsIGRpbmRleDsKKwl1aW50MzJfdCBpLCBqID0gMCwgcHJpbWFyZ2luLCBkdXJtYXJnaW4sIGhpZ2hzY29yZSA9CisJCXNjb3JlLCBoaWdoc2NvcmVpbmRleCA9IDA7CisJaW50IG51bXB1bHNlcyA9IDE7ICAgICAgLyogZmlyc3QgcHVsc2UgaW4gdGhlIGJ1cnN0IGlzIG1vc3QgbGlrZWx5IGJlaW5nIGZpbHRlcmVkIG91dCBiYXNlZCBvbiBtYXhmaWx0ZXJsZW4gKi8KKwlpbnQgcHJpc2NvcmVjaGsgPSAxLCBudW1wdWxzZXRvY2hrID0gMiwgcHJpbWF0Y2ggPSAwOworCisJLyogVXNlIHRoZSBhZGp1c3RlZCBQUkkgbWFyZ2luIHRvIHJlZHVjZSBmYWxzZSBhbGFybXMgKi8KKwkvKiBGb3Igbm9uIGZpeGVkIHBhdHRlcm4gdHlwZXMsIHJmLT5yZl9wYXR0ZXJudHlwZT0wICovCisJcHJpbWFyZ2luID0KKwkJZGZzX2dldF9wcmlfbWFyZ2luKGRmcywgZXh0X2NoYW5fZmxhZywgKHJmLT5yZl9wYXR0ZXJudHlwZSA9PSAxKSk7CisKKwlpZiAoKHJlZnByaSA+IHJmLT5yZl9tYXhwcmkpIHx8IChyZWZwcmkgPCByZi0+cmZfbWlucHJpKSkgeworCQludW1wdWxzZXMgPSAwOworCQlyZXR1cm4gbnVtcHVsc2VzOworCX0KKworCWlmIChyZi0+cmZfbWF4ZHVyIDwgMTApIHsKKwkJZHVybWFyZ2luID0gNDsKKwl9IGVsc2UgeworCQlkdXJtYXJnaW4gPSA2OworCX0KKworCWlmICgoIXJmLT5yZl9maXhlZF9wcmlfcmFkYXJfcHVsc2UpKSB7CisJCWlmIChyZi0+cmZfaWdub3JlX3ByaV93aW5kb3cgPT0gMSkgeworCQkJcHJpc2NvcmVjaGsgPSAocmYtPnJmX3RocmVzaG9sZCA+PiAxKTsKKwkJfSBlbHNlIHsKKwkJCXByaXNjb3JlY2hrID0gMTsKKwkJfQorCisJCU1hdGNoQ291bnQgPSAwOworCQlpZiAoc2NvcmUgPiBwcmlzY29yZWNoaykgeworCQkJZm9yIChpID0gMDsgaSA8IGRsLT5kbF9udW1lbGVtczsgaSsrKSB7CisJCQkJZGluZGV4ID0KKwkJCQkJKGRsLT5kbF9maXJzdGVsZW0gKyBpKSAmIERGU19NQVhfRExfTUFTSzsKKwkJCQlzZWFyY2hwcmkgPSBkbC0+ZGxfZWxlbXNbZGluZGV4XS5kZV90aW1lOworCQkJCWRlbHRhcHJpID0gREZTX0RJRkYoc2VhcmNocHJpLCByZWZwcmkpOworCQkJCWlmIChkZWx0YXByaSA8IHByaW1hcmdpbikgeworCQkJCQlhdmVyYWdlcmVmcHJpICs9IHNlYXJjaHByaTsKKwkJCQkJTWF0Y2hDb3VudCsrOworCQkJCX0KKwkJCX0KKwkJCWlmIChyZi0+cmZfcGF0dGVybnR5cGUgIT0gMikgeworCQkJCWlmIChNYXRjaENvdW50ID4gMCkKKwkJCQkJcmVmcHJpID0gKGF2ZXJhZ2VyZWZwcmkgLyBNYXRjaENvdW50KTsgIC8qIGF2ZXJhZ2UgKi8KKwkJCX0gZWxzZSB7CisJCQkJcmVmcHJpID0gKGF2ZXJhZ2VyZWZwcmkgLyBzY29yZSk7CisJCQl9CisJCX0KKwl9CisJLyogTm90ZTogRm9sbG93aW5nIHByaW11bHRpcGxlIGNhbGN1bGF0aW9uIHNob3VsZCBiZSBkb25lIG9uY2UgcGVyIGZpbHRlcgorCSAqIGR1cmluZyBpbml0aWFsaXphdGlvbiBzdGFnZSAoZGZzX2F0dGFjaCkgYW5kIHN0b3JlZCBpbiBpdHMgYXJyYXkKKwkgKiBhdGxlYXN0IGZvciBmaXhlZCBmcmVxdWVuY3kgdHlwZXMgbGlrZSBGQ0MgQmluMSB0byBzYXZlIHNvbWUgQ1BVIGN5Y2xlcy4KKwkgKiBtdWx0aXBsaWNhdGlvbiwgZGV2aWRlIG9wZXJhdG9ycyBpbiB0aGUgZm9sbG93aW5nIGNvZGUgYXJlIGxlZnQgYXMgaXQgaXMKKwkgKiBmb3IgcmVhZGFiaWxpdHkgaG9waW5nIHRoZSBjb21wbGllciB3aWxsIHVzZSBsZWZ0L3JpZ2h0IHNoaWZ0cyB3aGVyZXZlciBwb3NzaWJsZQorCSAqLworCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzIsCisJCSAgICAicmVmcHJpID0gJWQgaGlnaCBzY29yZSA9ICVkIGluZGV4ID0gJWQgbnVtcHVsc2VzID0gJWRcbiIsCisJCSAgICByZWZwcmksIGhpZ2hzY29yZSwgaGlnaHNjb3JlaW5kZXgsIG51bXB1bHNlcyk7CisJLyogQ291bnQgdGhlIG90aGVyIGRlbGF5IGVsZW1lbnRzIHRoYXQgaGF2ZSAgcHJpIGFuZCBkdXIgd2l0aCBpbiB0aGUKKwkgKiBhY2NlcHRhYmxlIHJhbmdlIGZyb20gdGhlIHJlZmVyZW5jZSBvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGwtPmRsX251bWVsZW1zOyBpKyspIHsKKwkJZGVsYXlpbmRleCA9IChkbC0+ZGxfZmlyc3RlbGVtICsgaSkgJiBERlNfTUFYX0RMX01BU0s7CisJCXNlYXJjaHByaSA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV90aW1lOworCQlpZiAoc2VhcmNocHJpID09IDApIHsKKwkJCS8qIFRoaXMgZXZlbnRzIFBSSSBpcyB6ZXJvLCB0YWtlIGl0IGFzIGEKKwkJCSAqIHZhbGlkIHB1bHNlIGJ1dCBkZWNyZW1lbnQgbmV4dCBldmVudCdzIFBSSSBieSByZWZwcmkKKwkJCSAqLworCQkJZGluZGV4ID0gKGRlbGF5aW5kZXggKyAxKSAmIERGU19NQVhfRExfTUFTSzsKKwkJCWRsLT5kbF9lbGVtc1tkaW5kZXhdLmRlX3RpbWUgLT0gcmVmcHJpOworCQkJc2VhcmNocHJpID0gcmVmcHJpOworCQl9CisJCXNlYXJjaGR1ciA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV9kdXI7CisJCXNlYXJjaHJzc2kgPSBkbC0+ZGxfZWxlbXNbZGVsYXlpbmRleF0uZGVfcnNzaTsKKwkJZGVsdGFkdXIgPSBERlNfRElGRihzZWFyY2hkdXIsIHJlZmR1cik7CisJCWRlbHRhcHJpID0gREZTX0RJRkYoc2VhcmNocHJpLCByZWZwcmkpOworCisJCS8qIGRlbHRhcHJpMyA9IERGU19ESUZGKHNlYXJjaHByaSwgMyAqIHJlZnByaSk7ICovCisJCXByaW1hdGNoID0gMDsKKworCQlpZiAoKHJmLT5yZl9pZ25vcmVfcHJpX3dpbmRvdyA+IDApICYmIChyZi0+cmZfcGF0dGVybnR5cGUgIT0gMikpIHsKKwkJCWZvciAoaiA9IDA7IGogPCByZi0+cmZfbnVtcHVsc2VzOyBqKyspIHsKKwkJCQlkZWx0YXByaTEgPQorCQkJCQlERlNfRElGRihzZWFyY2hwcmksIChqICsgMSkgKiByZWZwcmkpOworCQkJCWlmIChkZWx0YXByaTEgPCAoMiAqIHByaW1hcmdpbikpIHsKKwkJCQkJcHJpbWF0Y2ggPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKGRlbHRhcHJpMSA8IHByaW1hcmdpbikgfHwgKGRlbHRhcHJpMiA8IHByaW1hcmdpbikpIHsKKwkJCQlwcmltYXRjaCA9IDE7CisJCQl9CisJCX0KKworCQlpZiAocHJpbWF0Y2ggJiYgKGRlbHRhZHVyIDwgZHVybWFyZ2luKSkgeworCQkJaWYgKChudW1wdWxzZXMgPT0gMSkpIHsKKwkJCQludW1wdWxzZXMrKzsKKwkJCX0gZWxzZSB7CisJCQkJZGVsdGFfdGltZV9zdGFtcHMgPQorCQkJCQlkbC0+ZGxfZWxlbXNbZGVsYXlpbmRleF0uZGVfdHMgLQorCQkJCQlwcmV2X2dvb2RfdGltZXN0YW1wOworCQkJCWlmICgocmYtPnJmX2lnbm9yZV9wcmlfd2luZG93ID4gMCkpIHsKKwkJCQkJbnVtcHVsc2V0b2NoayA9IHJmLT5yZl9udW1wdWxzZXM7CisKKwkJCQkJaWYgKChyZi0+cmZfcGF0dGVybnR5cGUgPT0gMikKKwkJCQkJICAgICYmIChmdW5kYW1lbnRhbHByaSA8CisJCQkJCQlyZWZwcmkgKyAxMDApKSB7CisJCQkJCQludW1wdWxzZXRvY2hrID0gNDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCW51bXB1bHNldG9jaGsgPSA0OworCQkJCX0KKwkJCQlmb3IgKGogPSAwOyBqIDwgbnVtcHVsc2V0b2NoazsgaisrKSB7CisJCQkJCWRlbHRhX3RzX3ZhcmlhbmNlID0KKwkJCQkJCURGU19ESUZGKGRlbHRhX3RpbWVfc3RhbXBzLAorCQkJCQkJCSAoKGogKworCQkJCQkJCSAgIDEpICogZnVuZGFtZW50YWxwcmkpKTsKKwkJCQkJaWYgKGRlbHRhX3RzX3ZhcmlhbmNlIDwKKwkJCQkJICAgICgyICogKGogKyAxKSAqIHByaW1hcmdpbikpIHsKKwkJCQkJCW51bXB1bHNlcysrOworCQkJCQkJaWYgKHJmLT5yZl9pZ25vcmVfcHJpX3dpbmRvdyA+CisJCQkJCQkgICAgMCkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcHJldl9nb29kX3RpbWVzdGFtcCA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV90czsKKworCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJCQkgICAgInJmLT5taW5wcmk9JWQgcmYtPm1heHByaT0lZCBzZWFyY2hwcmkgPSAlZCBpbmRleCA9ICVkIG51bXB1bHNlcyA9ICVkIGRlbHRhcHJpPSVkIGo9JWRcbiIsCisJCQkJICAgIHJmLT5yZl9taW5wcmksIHJmLT5yZl9tYXhwcmksIHNlYXJjaHByaSwgaSwKKwkJCQkgICAgbnVtcHVsc2VzLCBkZWx0YXByaSwgaik7CisJCX0KKworCX0KKwlyZXR1cm4gbnVtcHVsc2VzOworfQorI2VuZGlmIC8qIEFUSF9TVVBQT1JUX0RGUyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zYXAvZGZzL3NyYy9kZnNfZGVidWcuYyBiL2NvcmUvc2FwL2Rmcy9zcmMvZGZzX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmOTE3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2FwL2Rmcy9zcmMvZGZzX2RlYnVnLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmc19kZWJ1Zy5jCisKKyAgIE9WRVJWSUVXOgorCisgICBTb3VyY2UgY29kZSBib3Jyb3dlZCBmcm9tIFFDQV9NQUlOIERGUyBtb2R1bGUKKworICAgREVQRU5ERU5DSUVTOgorCisgICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKyAgIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorICAgLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgImRmcy5oIgorLyogVE8gRE8gREZTCisgICAjaW5jbHVkZSA8aWVlZTgwMjExX3Zhci5oPgorICovCisjaWZkZWYgQVRIX1NVUFBPUlRfREZTCisKK3ZvaWQgZGZzX3ByaW50X2RlbGF5bGluZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzX2RlbGF5bGluZSAqZGwpCit7CisJaW50IGkgPSAwLCBpbmRleDsKKwlzdHJ1Y3QgZGZzX2RlbGF5ZWxlbSAqZGU7CisKKwlpbmRleCA9IGRsLT5kbF9sYXN0ZWxlbTsKKwlmb3IgKGkgPSAwOyBpIDwgZGwtPmRsX251bWVsZW1zOyBpKyspIHsKKwkJZGUgPSAmZGwtPmRsX2VsZW1zW2luZGV4XTsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJCSAgICAiRWxlbSAlZDogdHMgPSAldSAoMHgleCkgZHVyPSV1XG4iLCBpLAorCQkJICAgIGRlLT5kZV90aW1lLCBkZS0+ZGVfdGltZSwgZGUtPmRlX2R1cik7CisJCWluZGV4ID0gKGluZGV4IC0gMSkgJiBERlNfTUFYX0RMX01BU0s7CisJfQorfQorCit2b2lkIGRmc19wcmludF9maWx0ZXIoc3RydWN0IGF0aF9kZnMgKmRmcywgc3RydWN0IGRmc19maWx0ZXIgKnJmKQoreworCisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMSwKKwkJICAgICJmaWx0ZXJJRFslZF0gcmZfbnVtcHVsc2VzPSV1OyByZi0+cmZfbWlucHJpPSV1OyAiCisJCSAgICAicmYtPnJmX21heHByaT0ldTsgcmYtPnJmX3RocmVzaG9sZD0ldTsgcmYtPnJmX2ZpbHRlcmxlbj0ldTsgIgorCQkgICAgInJmLT5yZl9taW5kdXI9JXU7IHJmLT5yZl9tYXhkdXI9JXVcbiIsCisJCSAgICByZi0+cmZfcHVsc2VpZCwKKwkJICAgIHJmLT5yZl9udW1wdWxzZXMsCisJCSAgICByZi0+cmZfbWlucHJpLAorCQkgICAgcmYtPnJmX21heHByaSwKKwkJICAgIHJmLT5yZl90aHJlc2hvbGQsCisJCSAgICByZi0+cmZfZmlsdGVybGVuLCByZi0+cmZfbWluZHVyLCByZi0+cmZfbWF4ZHVyKTsKK30KKwordm9pZCBkZnNfcHJpbnRfZmlsdGVycyhzdHJ1Y3QgYXRoX2RmcyAqZGZzKQoreworCXN0cnVjdCBkZnNfZmlsdGVydHlwZSAqZnQgPSBOVUxMOworCXN0cnVjdCBkZnNfZmlsdGVyICpyZjsKKwlpbnQgaSwgajsKKworCWlmIChkZnMgPT0gTlVMTCkgeworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsICIlczogc2NfZGZzIGlzIE5VTExcbiIsCisJCQkgICAgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IDA7IGkgPCBERlNfTUFYX1JBREFSX1RZUEVTOyBpKyspIHsKKwkJaWYgKGRmcy0+ZGZzX3JhZGFyZltpXSAhPSBOVUxMKSB7CisJCQlmdCA9IGRmcy0+ZGZzX3JhZGFyZltpXTsKKwkJCWlmICgoZnQtPmZ0X251bWZpbHRlcnMgPiBERlNfTUFYX05VTV9SQURBUl9GSUxURVJTKQorCQkJICAgIHx8ICghZnQtPmZ0X251bWZpbHRlcnMpKQorCQkJCWNvbnRpbnVlOworCQkJREZTX1BSSU5USworCQkJCSgiPT09PT09PT09PT1mdC0+ZnRfbnVtZmlsdGVycz0ldT09PT09PT09PT09XG4iLAorCQkJCWZ0LT5mdF9udW1maWx0ZXJzKTsKKwkJCWZvciAoaiA9IDA7IGogPCBmdC0+ZnRfbnVtZmlsdGVyczsgaisrKSB7CisJCQkJcmYgPSAmKGZ0LT5mdF9maWx0ZXJzW2pdKTsKKwkJCQlERlNfUFJJTlRLCisJCQkJCSgiZmlsdGVyWyVkXSBmaWx0ZXJJRCA9ICVkIHJmX251bXB1bHNlcz0ldTsgcmYtPnJmX21pbnByaT0ldTsgcmYtPnJmX21heHByaT0ldTsgcmYtPnJmX3RocmVzaG9sZD0ldTsgcmYtPnJmX2ZpbHRlcmxlbj0ldTsgcmYtPnJmX21pbmR1cj0ldTsgcmYtPnJmX21heGR1cj0ldVxuIiwKKwkJCQkJaiwgcmYtPnJmX3B1bHNlaWQsIHJmLT5yZl9udW1wdWxzZXMsCisJCQkJCXJmLT5yZl9taW5wcmksIHJmLT5yZl9tYXhwcmksCisJCQkJCXJmLT5yZl90aHJlc2hvbGQsIHJmLT5yZl9maWx0ZXJsZW4sCisJCQkJCXJmLT5yZl9taW5kdXIsIHJmLT5yZl9tYXhkdXIpOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIGRmc19wcmludF9hY3Rpdml0eShzdHJ1Y3QgYXRoX2RmcyAqZGZzKQoreworCWludCBjaGFuX2J1c3kgPSAwLCBleHRfY2hhbl9idXN5ID0gMDsKKwl1aW50MzJfdCByeGNsZWFyID0gMCwgcnhmcmFtZSA9IDAsIHR4ZnJhbWUgPSAwLCBjeWNsZXMgPSAwOworCisJY3ljbGVzID0KKwkJZGZzLT5pYy0+aWNfZ2V0X21pYl9jeWNsZV9jb3VudHNfcGN0KGRmcy0+aWMsICZyeGNsZWFyLCAmcnhmcmFtZSwKKwkJCQkJCSAgICAgJnR4ZnJhbWUpOworCWNoYW5fYnVzeSA9IGN5Y2xlczsKKworCWV4dF9jaGFuX2J1c3kgPSBkZnMtPmljLT5pY19nZXRfZXh0X2J1c3koZGZzLT5pYyk7CisKKwlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsICJjeWNsZXM9JWQgcnhjbGVhcj0lZCByeGZyYW1lPSVkIgorCQkgICAgIiB0eGZyYW1lPSVkIGV4dGNoYW5idXN5PSVkXG4iLCBjeWNsZXMsIHJ4Y2xlYXIsCisJCSAgICByeGZyYW1lLCB0eGZyYW1lLCBleHRfY2hhbl9idXN5KTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBYWFggbWlncmF0ZSB0aGlzIHRvIHVzZSBhdGhfZGZzIGFzIHRoZSBhcmcsIG5vdCBpZWVlODAyMTFjb20hCisgKi8KKyNpZm5kZWYgQVRIX0RGU19SQURBUl9ERVRFQ1RJT05fT05MWQorb3NfdGltZXJfZnVuYyhkZnNfZGVidWdfdGltZW91dCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExY29tICppYzsKKwlzdHJ1Y3QgYXRoX2RmcyAqZGZzOworCisJT1NfR0VUX1RJTUVSX0FSRyhpYywgc3RydWN0IGllZWU4MDIxMWNvbSAqKTsKKworCWRmcyA9IChzdHJ1Y3QgYXRoX2RmcyAqKWljLT5pY19kZnM7CisKKwlkZnNfcHJpbnRfYWN0aXZpdHkoZGZzKTsKKworCU9TX1NFVF9USU1FUigmZGZzLT5hdGhfZGZzX2RlYnVnX3RpbWVyLCBERlNfREVCVUdfVElNRU9VVF9NUyk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFUSF9TVVBQT1JUX0RGUyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zYXAvZGZzL3NyYy9kZnNfZmNjX2JpbjUuYyBiL2NvcmUvc2FwL2Rmcy9zcmMvZGZzX2ZjY19iaW41LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NjOWZlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2FwL2Rmcy9zcmMvZGZzX2ZjY19iaW41LmMKQEAgLTAsMCArMSw4NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmc19mY2NfYmluNS5jCisKKyAgIE9WRVJWSUVXOgorCisgICBTb3VyY2UgY29kZSBib3Jyb3dlZCBmcm9tIFFDQV9NQUlOIERGUyBtb2R1bGUKKworICAgREVQRU5ERU5DSUVTOgorCisgICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKyAgIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorICAgLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgImRmcy5oIgorLyogVE8gRE8gREZTCisgICAjaW5jbHVkZSA8aWVlZTgwMjExX3Zhci5oPgorICovCisjaWZkZWYgQVRIX1NVUFBPUlRfREZTCisKKy8qCisgKiBSZWplY3QgdGhlIHB1bHNlIGlmOgorICogKyBJdCdzIG91dHNpZGUgdGhlIFJTU0kgdGhyZXNob2xkOworICogKyBJdCdzIG91dHNpZGUgdGhlIHB1bHNlIGR1cmF0aW9uOworICogKyBJdCdzIGJlZW4gdmVyaWZpZWQgYnkgSFcvU1cgY2hpcnAgY2hlY2tpbmcKKyAqICAgYW5kIG5laXRoZXIgb2YgdGhvc2UgZm91bmQgYSBjaGlycC4KKyAqLworaW50CitkZnNfYmluNV9jaGVja19wdWxzZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzX2V2ZW50ICpyZSwKKwkJICAgICBzdHJ1Y3QgZGZzX2JpbjVyYWRhcnMgKmJyKQoreworCWludCBiNV9yc3NpdGhyZXNoID0gYnItPmJyX3B1bHNlLmI1X3Jzc2l0aHJlc2g7CisKKwlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONV9QVUxTRSwKKwkJICAgICIlczogcmVfZHVyPSVkLCByc3NpPSVkLCBjaGVja19jaGlycD0lZCwgIgorCQkgICAgImh3X2NoaXJwPSVkLCBzd19jaGlycD0lZFxuIiwKKwkJICAgIF9fZnVuY19fLAorCQkgICAgKGludClyZS0+cmVfZHVyLAorCQkgICAgKGludClyZS0+cmVfcnNzaSwKKwkJICAgICEhKHJlLT5yZV9mbGFncyAmIERGU19FVkVOVF9DSEVDS0NISVJQKSwKKwkJICAgICEhKHJlLT5yZV9mbGFncyAmIERGU19FVkVOVF9IV19DSElSUCksCisJCSAgICAhIShyZS0+cmVfZmxhZ3MgJiBERlNfRVZFTlRfU1dfQ0hJUlApKTsKKworCS8qCisJICogSWYgdGhlIHN3L2h3IGNoaXJwIGRldGVjdGlvbiBzYXlzIHRvIGZhaWwgdGhlIHB1bHNlLAorCSAqIGRvIHNvLgorCSAqLworCWlmIChERlNfRVZFTlRfTk9UQ0hJUlAocmUpKSB7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19CSU41LAorCQkJICAgICIlczogcmVqZWN0aW5nIGNoaXJwOiB0cz0lbGx1LCBkdXI9JWQsIHJzc2k9JWQgIgorCQkJICAgICJjaGVja2NoaXJwPSVkLCBod2NoaXJwPSVkLCBzd2NoaXJwPSVkXG4iLAorCQkJICAgIF9fZnVuY19fLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmUtPnJlX2Z1bGxfdHMsCisJCQkgICAgKGludClyZS0+cmVfZHVyLAorCQkJICAgIChpbnQpcmUtPnJlX3Jzc2ksCisJCQkgICAgISEocmUtPnJlX2ZsYWdzICYgREZTX0VWRU5UX0NIRUNLQ0hJUlApLAorCQkJICAgICEhKHJlLT5yZV9mbGFncyAmIERGU19FVkVOVF9IV19DSElSUCksCisJCQkgICAgISEocmUtPnJlX2ZsYWdzICYgREZTX0VWRU5UX1NXX0NISVJQKSk7CisJCXJldHVybiAoMCk7CisJfQorCisJLyogQWRqdXN0IHRoZSBmaWx0ZXIgdGhyZXNob2xkIGZvciByc3NpIGluIG5vbiBUVVJCTyBtb2RlICovCisJaWYgKCEoZGZzLT5pYy0+aWNfY3VyY2hhbi0+aWNfZmxhZ3MgJiBDSEFOTkVMX1RVUkJPKSkKKwkJYjVfcnNzaXRocmVzaCArPSBici0+YnJfcHVsc2UuYjVfcnNzaW1hcmdpbjsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIHB1bHNlIGlzIHdpdGhpbiBkdXJhdGlvbiBhbmQgcnNzaQorCSAqIHRocmVzaG9sZHMuCisJICovCisJaWYgKChyZS0+cmVfZHVyID49IGJyLT5icl9wdWxzZS5iNV9taW5kdXIpICYmCisJICAgIChyZS0+cmVfZHVyIDw9IGJyLT5icl9wdWxzZS5iNV9tYXhkdXIpICYmCisJICAgIChyZS0+cmVfcnNzaSA+PSBiNV9yc3NpdGhyZXNoKSkgeworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONSwKKwkJCSAgICAiJXM6IGR1cj0lZCwgcnNzaT0lZCAtIGFkZGluZyFcbiIsCisJCQkgICAgX19mdW5jX18sIChpbnQpcmUtPnJlX2R1ciwgKGludClyZS0+cmVfcnNzaSk7CisJCXJldHVybiAoMSk7CisJfQorCisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX0JJTjUsCisJCSAgICAiJXM6IHRvbyBsb3cgdG8gYmUgQmluNSBwdWxzZSB0c2Y9JWxsdSwgZHVyPSVkLCByc3NpPSVkXG4iLAorCQkgICAgX19mdW5jX18sCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlLT5yZV9mdWxsX3RzLAorCQkgICAgKGludClyZS0+cmVfZHVyLCAoaW50KXJlLT5yZV9yc3NpKTsKKworCXJldHVybiAoMCk7Cit9CisKK2ludCBkZnNfYmluNV9hZGRwdWxzZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzX2JpbjVyYWRhcnMgKmJyLAorCQkgICAgICBzdHJ1Y3QgZGZzX2V2ZW50ICpyZSwgdWludDY0X3QgdGhpc3RzKQoreworCXVpbnQzMl90IGluZGV4LCBzdG9wOworCXVpbnQ2NF90IHRzRGVsdGE7CisKKwkvKiBDaGVjayBpZiB0aGlzIHB1bHNlIGlzIGEgdmFsaWQgcHVsc2UgaW4gdGVybXMgb2YgcmVwZXRpdGlvbiwKKwkgKiBpZiBub3QsIHJldHVybiB3aXRob3V0IGFkZGluZyBpdCB0byB0aGUgcXVldWUuCisJICogUFJJIDogUHVsc2UgUmVwaXRldGlvbiBJbnRlcnZhbAorCSAqIEJSSSA6IEJ1cnN0IFJlcGl0ZXRpb24gSW50ZXJ2YWwgKi8KKwlpZiAoYnItPmJyX251bWVsZW1zICE9IDApIHsKKwkJaW5kZXggPSBici0+YnJfbGFzdGVsZW07CisJCXRzRGVsdGEgPSB0aGlzdHMgLSBici0+YnJfZWxlbXNbaW5kZXhdLmJlX3RzOworCQlpZiAoKHRzRGVsdGEgPCBERlNfQklONV9QUklfTE9XRVJfTElNSVQpIHx8CisJCSAgICAoKHRzRGVsdGEgPiBERlNfQklONV9QUklfSElHSEVSX0xJTUlUKSAmJgorCQkgICAgICh0c0RlbHRhIDwgREZTX0JJTjVfQlJJX0xPV0VSX0xJTUlUKSkpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qIENpcmN1bGFyIGJ1ZmZlciBvZiBzaXplIDJebiAqLworCWluZGV4ID0gKGJyLT5icl9sYXN0ZWxlbSArIDEpICYgREZTX01BWF9CNV9NQVNLOworCWJyLT5icl9sYXN0ZWxlbSA9IGluZGV4OworCWlmIChici0+YnJfbnVtZWxlbXMgPT0gREZTX01BWF9CNV9TSVpFKQorCQlici0+YnJfZmlyc3RlbGVtID0gKGJyLT5icl9maXJzdGVsZW0gKyAxKSAmIERGU19NQVhfQjVfTUFTSzsKKwllbHNlCisJCWJyLT5icl9udW1lbGVtcysrOworCWJyLT5icl9lbGVtc1tpbmRleF0uYmVfdHMgPSB0aGlzdHM7CisJYnItPmJyX2VsZW1zW2luZGV4XS5iZV9yc3NpID0gcmUtPnJlX3Jzc2k7CisJYnItPmJyX2VsZW1zW2luZGV4XS5iZV9kdXIgPSByZS0+cmVfZHVyOyAgICAgICAgLyogcGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGluIHUtc2VjICovCisJc3RvcCA9IDA7CisJaW5kZXggPSBici0+YnJfZmlyc3RlbGVtOworCXdoaWxlICgoIXN0b3ApICYmIChici0+YnJfbnVtZWxlbXMgLSAxKSA+IDApIHsKKwkJaWYgKCh0aGlzdHMgLSBici0+YnJfZWxlbXNbaW5kZXhdLmJlX3RzKSA+CisJCSAgICAoKHVpbnQ2NF90KSBici0+YnJfcHVsc2UuYjVfdGltZXdpbmRvdykpIHsKKwkJCWJyLT5icl9udW1lbGVtcy0tOworCQkJYnItPmJyX2ZpcnN0ZWxlbSA9CisJCQkJKGJyLT5icl9maXJzdGVsZW0gKyAxKSAmIERGU19NQVhfQjVfTUFTSzsKKwkJCWluZGV4ID0gYnItPmJyX2ZpcnN0ZWxlbTsKKwkJfSBlbHNlCisJCQlzdG9wID0gMTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBJZiB0aGUgZGZzIHN0cnVjdHVyZSBpcyBOVUxMICh3aGljaCBzaG91bGQgYmUgaWxsZWdhbCBpZiBldmVyeXRpbmcgaXMgd29ya2luZworICogcHJvcGVybHksIHRoZW4gc2lnbmlmeSB0aGF0IGEgYmluNSByYWRhciB3YXMgZm91bmQKKyAqLworCitpbnQgZGZzX2JpbjVfY2hlY2soc3RydWN0IGF0aF9kZnMgKmRmcykKK3sKKwlzdHJ1Y3QgZGZzX2JpbjVyYWRhcnMgKmJyOworCWludCBpbmRleFtERlNfTUFYX0I1X1NJWkVdOworCXVpbnQzMl90IG4gPSAwLCBpID0gMCwgaTEgPSAwLCB0aGlzID0gMCwgcHJldiA9IDAsIHJzc2lfZGlmZiA9CisJCTAsIHdpZHRoX2RpZmYgPSAwLCBidXJzdHMgPSAwOworCXVpbnQzMl90IHRvdGFsX2RpZmYgPSAwLCBhdmVyYWdlX2RpZmYgPSAwLCB0b3RhbF93aWR0aCA9CisJCTAsIGF2ZXJhZ2Vfd2lkdGggPSAwLCBudW1ldmVudHMgPSAwOworCXVpbnQ2NF90IHByaTsKKworCWlmIChkZnMgPT0gTlVMTCkgeworCQlERlNfUFJJTlRLKCIlczogaWNfZGZzIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDE7CisJfQorCWZvciAobiA9IDA7IG4gPCBkZnMtPmRmc19yaW5mby5ybl9udW1iaW41cmFkYXJzOyBuKyspIHsKKwkJYnIgPSAmKGRmcy0+ZGZzX2I1cmFkYXJzW25dKTsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX0JJTjUsCisJCQkgICAgIk51bSBlbGVtcyA9ICVkXG4iLCBici0+YnJfbnVtZWxlbXMpOworCisJCS8qIGZpbmQgYSB2YWxpZCBiaW4gNSBwdWxzZSBhbmQgdXNlIGl0IGFzIHJlZmVyZW5jZSAqLworCQlmb3IgKGkxID0gMDsgaTEgPCBici0+YnJfbnVtZWxlbXM7IGkxKyspIHsKKwkJCXRoaXMgPSAoKGJyLT5icl9maXJzdGVsZW0gKyBpMSkgJiBERlNfTUFYX0I1X01BU0spOworCQkJaWYgKChici0+YnJfZWxlbXNbdGhpc10uYmVfZHVyID49IE1JTl9CSU41X0RVUl9NSUNST1NFQykKKwkJCSAgICAmJiAoYnItPmJyX2VsZW1zW3RoaXNdLmJlX2R1ciA8PQorCQkJCU1BWF9CSU41X0RVUl9NSUNST1NFQykpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXByZXYgPSB0aGlzOworCQlmb3IgKGkgPSBpMSArIDE7IGkgPCBici0+YnJfbnVtZWxlbXM7IGkrKykgeworCQkJdGhpcyA9ICgoYnItPmJyX2ZpcnN0ZWxlbSArIGkpICYgREZTX01BWF9CNV9NQVNLKTsKKworCQkJLyogZmlyc3QgbWFrZSBzdXJlIGl0IGlzIGEgYmluIDUgcHVsc2UgYnkgY2hlY2tpbmcgdGhlIGR1cmF0aW9uICovCisJCQlpZiAoKGJyLT5icl9lbGVtc1t0aGlzXS5iZV9kdXIgPCBNSU5fQklONV9EVVJfTUlDUk9TRUMpCisJCQkgICAgfHwgKGJyLT5icl9lbGVtc1t0aGlzXS5iZV9kdXIgPgorCQkJCU1BWF9CSU41X0RVUl9NSUNST1NFQykpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogUnVsZSAxOiAxMDAwIDw9IFBSSSA8PSAyMDAwICsgc29tZSBtYXJnaW4gKi8KKwkJCWlmIChici0+YnJfZWxlbXNbdGhpc10uYmVfdHMgPj0KKwkJCSAgICBici0+YnJfZWxlbXNbcHJldl0uYmVfdHMpIHsKKwkJCQlwcmkgPQorCQkJCQlici0+YnJfZWxlbXNbdGhpc10uYmVfdHMgLQorCQkJCQlici0+YnJfZWxlbXNbcHJldl0uYmVfdHM7CisJCQl9IGVsc2UgeyAgICAgICAgLyogcm9sbCBvdmVyIGNhc2UgKi8KKwkJCQkvKiBwcmkgPSAoMHhmZmZmZmZmZmZmZmZmZmZmIC0gYnItPmJyX2VsZW1zW3ByZXZdLmJlX3RzKSArIGJyLT5icl9lbGVtc1t0aGlzXS5iZV90czsgKi8KKwkJCQlwcmkgPSBici0+YnJfZWxlbXNbdGhpc10uYmVfdHM7CisJCQl9CisJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONSwKKwkJCQkgICAgIiBwcmk9JWxsdSB0aGlzLnRzPSVsbHUgdGhpcy5kdXI9JWQgdGhpcy5yc3NpPSVkIHByZXYudHM9JWxsdVxuIiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwcmksCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnItPmJyX2VsZW1zW3RoaXNdLgorCQkJCSAgICBiZV90cywgKGludClici0+YnJfZWxlbXNbdGhpc10uYmVfZHVyLAorCQkJCSAgICAoaW50KWJyLT5icl9lbGVtc1t0aGlzXS5iZV9yc3NpLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJyLT5icl9lbGVtc1twcmV2XS4KKwkJCQkgICAgYmVfdHMpOworCQkJaWYgKCgocHJpID49IERGU19CSU41X1BSSV9MT1dFUl9MSU1JVCkgJiYgKHByaSA8PSBERlNfQklONV9QUklfSElHSEVSX0xJTUlUKSkpIHsgICAgICAgIC8qIHByaTogcHVsc2UgcmVwaXRpdGlvbiBpbnRlcnZhbCBpbiB1cyAqLworCQkJCS8qIFJ1bGUgMjogcHVsc2Ugd2lkdGggb2YgdGhlIHB1bHNlcyBpbiB0aGUgYnVyc3Qgc2hvdWxkIGJlIHNhbWUgKCsvLSBtYXJnaW4pICovCisJCQkJaWYgKGJyLT5icl9lbGVtc1t0aGlzXS5iZV9kdXIgPj0KKwkJCQkgICAgYnItPmJyX2VsZW1zW3ByZXZdLmJlX2R1cikgeworCQkJCQl3aWR0aF9kaWZmID0KKwkJCQkJCWJyLT5icl9lbGVtc1t0aGlzXS5iZV9kdXIgLQorCQkJCQkJYnItPmJyX2VsZW1zW3ByZXZdLmJlX2R1cjsKKwkJCQl9IGVsc2UgeworCQkJCQl3aWR0aF9kaWZmID0KKwkJCQkJCWJyLT5icl9lbGVtc1twcmV2XS5iZV9kdXIgLQorCQkJCQkJYnItPmJyX2VsZW1zW3RoaXNdLmJlX2R1cjsKKwkJCQl9CisJCQkJaWYgKHdpZHRoX2RpZmYgPD0gREZTX0JJTjVfV0lEVEhfTUFSR0lOKSB7CisJCQkJCS8qIFJ1bGUgMzogUlNTSSBvZiB0aGUgcHVsc2VzIGluIHRoZSBidXJzdCBzaG91bGQgYmUgc2FtZSAoKy8tIG1hcmdpbikgKi8KKwkJCQkJaWYgKGJyLT5icl9lbGVtc1t0aGlzXS5iZV9yc3NpID49CisJCQkJCSAgICBici0+YnJfZWxlbXNbcHJldl0uYmVfcnNzaSkgeworCQkJCQkJcnNzaV9kaWZmID0KKwkJCQkJCQlici0+YnJfZWxlbXNbdGhpc10uYmVfcnNzaSAtCisJCQkJCQkJYnItPmJyX2VsZW1zW3ByZXZdLmJlX3Jzc2k7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyc3NpX2RpZmYgPQorCQkJCQkJCWJyLT5icl9lbGVtc1twcmV2XS5iZV9yc3NpIC0KKwkJCQkJCQlici0+YnJfZWxlbXNbdGhpc10uYmVfcnNzaTsKKwkJCQkJfQorCQkJCQlpZiAocnNzaV9kaWZmIDw9IERGU19CSU41X1JTU0lfTUFSR0lOKSB7CisJCQkJCQlidXJzdHMrKzsKKwkJCQkJCS8qIFNhdmUgdGhlIGluZGV4ZXMgb2YgdGhpcyBwYWlyIGZvciBsYXRlciB3aWR0aCB2YXJpYW5jZSBjaGVjayAqLworCQkJCQkJaWYgKG51bWV2ZW50cyA+PSAyKSB7CisJCQkJCQkJLyogbWFrZSBzdXJlIHRoZSBldmVudCBpcyBub3QgZHVwbGljYXRlZCwKKwkJCQkJCQkgKiBwb3NzaWJsZSBpbiBhIDMgcHVsc2UgYnVyc3QgKi8KKwkJCQkJCQlpZiAoaW5kZXhbbnVtZXZlbnRzIC0gMV0KKwkJCQkJCQkgICAgIT0gcHJldikgeworCQkJCQkJCQlpbmRleAorCQkJCQkJCQlbbnVtZXZlbnRzKytdCisJCQkJCQkJCQk9IHByZXY7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpbmRleFtudW1ldmVudHMrK10gPQorCQkJCQkJCQlwcmV2OworCQkJCQkJfQorCQkJCQkJaW5kZXhbbnVtZXZlbnRzKytdID0gdGhpczsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCURGU19EUFJJTlRLKGRmcywKKwkJCQkJCQkgICAgQVRIX0RFQlVHX0RGU19CSU41LAorCQkJCQkJCSAgICAiJXMgJWQgQmluNSByc3NpX2RpZmY9JWRcbiIsCisJCQkJCQkJICAgIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkJCQkgICAgcnNzaV9kaWZmKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCURGU19EUFJJTlRLKGRmcywKKwkJCQkJCSAgICBBVEhfREVCVUdfREZTX0JJTjUsCisJCQkJCQkgICAgIiVzICVkIEJpbjUgd2lkdGhfZGlmZj0lZFxuIiwKKwkJCQkJCSAgICBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJCQkgICAgd2lkdGhfZGlmZik7CisJCQkJfQorCQkJfSBlbHNlIGlmICgocHJpID49IERGU19CSU41X0JSSV9MT1dFUl9MSU1JVCkgJiYKKwkJCQkgICAocHJpIDw9IERGU19CSU41X0JSSV9VUFBFUl9MSU1JVCkpIHsKKwkJCQkvKiBjaGVjayBwdWxzZSB3aWR0aCB0byBtYWtlIHN1cmUgaXQgaXMgaW4gcmFuZ2Ugb2YgYmluIDUgKi8KKwkJCQkvKiBpZiAoKGJyLT5icl9lbGVtc1t0aGlzXS5iZV9kdXIgPj0gTUlOX0JJTjVfRFVSX01JQ1JPU0VDKSAmJiAoYnItPmJyX2VsZW1zW3RoaXNdLmJlX2R1ciA8PSBNQVhfQklONV9EVVJfTUlDUk9TRUMpKSB7ICovCisJCQkJYnVyc3RzKys7CisJCQkJLyogfSAqLworCQkJfSBlbHNlIHsKKwkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONSwKKwkJCQkJICAgICIlcyAlZCBCaW41IFBSSSBjaGVjayBmYWlsIHByaT0lbGx1XG4iLAorCQkJCQkgICAgX19mdW5jX18sIF9fTElORV9fLAorCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwcmkpOworCQkJfQorCQkJcHJldiA9IHRoaXM7CisJCX0KKworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONSwgImJ1cnN0cz0ldSBudW1ldmVudHM9JXVcbiIsCisJCQkgICAgYnVyc3RzLCBudW1ldmVudHMpOworCQlpZiAoYnVyc3RzID49IGJyLT5icl9wdWxzZS5iNV90aHJlc2hvbGQpIHsKKwkJCWlmICgoYnItPmJyX2VsZW1zW2JyLT5icl9sYXN0ZWxlbV0uYmVfdHMgLQorCQkJICAgICBici0+YnJfZWxlbXNbYnItPmJyX2ZpcnN0ZWxlbV0uYmVfdHMpIDwgMzAwMDAwMCkgeworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIGRvbid0IGRvIHRoaXMgY2hlY2sgc2luY2Ugbm90IGFsbCB0aGUgY2FzZXMgaGF2ZSB0aGlzIGtpbmQgb2YgYnVyc3Qgd2lkdGggdmFyaWF0aW9uLgorCQkJCSAqCisJCQkJICAgZm9yIChpPTA7IGk8YnVyc3RzOyBpKyspeworCQkJCSAgIHRvdGFsX3dpZHRoICs9IGJyLT5icl9lbGVtc1tpbmRleFtpXV0uYmVfZHVyOworCQkJCSAgIH0KKwkJCQkgICBhdmVyYWdlX3dpZHRoID0gdG90YWxfd2lkdGgvYnVyc3RzOworCQkJCSAgIGZvciAoaT0wOyBpPGJ1cnN0czsgaSsrKXsKKwkJCQkgICB0b3RhbF9kaWZmICs9IERGU19ESUZGKGJyLT5icl9lbGVtc1tpbmRleFtpXV0uYmVfZHVyLCBhdmVyYWdlX3dpZHRoKTsKKwkJCQkgICB9CisJCQkJICAgYXZlcmFnZV9kaWZmID0gdG90YWxfZGlmZi9idXJzdHM7CisJCQkJICAgaWYoIGF2ZXJhZ2VfZGlmZiA+IERGU19CSU41X1dJRFRIX01BUkdJTiApIHsKKwkJCQkgICByZXR1cm4gMTsKKwkJCQkgICB9IGVsc2UgeworCisJCQkJICAgREZTX0RQUklOVEsoaWMsIEFUSF9ERUJVR19ERlNfQklONSwgImJ1cnN0cz0ldSBudW1ldmVudHM9JXUgdG90YWxfd2lkdGg9JWQgYXZlcmFnZV93aWR0aD0lZCB0b3RhbF9kaWZmPSVkIGF2ZXJhZ2VfZGlmZj0lZFxuIiwgYnVyc3RzLCBudW1ldmVudHMsIHRvdGFsX3dpZHRoLCBhdmVyYWdlX3dpZHRoLCB0b3RhbF9kaWZmLCBhdmVyYWdlX2RpZmYpOworCisJCQkJICAgfQorCQkJCSAqLworCQkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19CSU41LAorCQkJCQkgICAgImJ1cnN0cz0ldSBudW1ldmVudHM9JXUgdG90YWxfd2lkdGg9JWQgYXZlcmFnZV93aWR0aD0lZCB0b3RhbF9kaWZmPSVkIGF2ZXJhZ2VfZGlmZj0lZFxuIiwKKwkJCQkJICAgIGJ1cnN0cywgbnVtZXZlbnRzLCB0b3RhbF93aWR0aCwKKwkJCQkJICAgIGF2ZXJhZ2Vfd2lkdGgsIHRvdGFsX2RpZmYsCisJCQkJCSAgICBhdmVyYWdlX2RpZmYpOworCQkJCURGU19QUklOVEsoImJpbiA1IHJhZGFyIGRldGVjdGVkLCBidXJzdHM9JWRcbiIsCisJCQkJCSAgIGJ1cnN0cyk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRydWUgaWYgY2hpcnBpbmcgcHVsc2UsIGZhbHNlIGlmIG5vdC4KKyAgIERlY2lzaW9uIGlzIG1hZGUgYmFzZWQgb24gcHJvY2Vzc2luZyB0aGUgRkZUIGRhdGEgaW5jbHVkZWQgd2l0aCB0aGUgUEhZIGVycm9yLgorICAgQ2FsY3VsYXRlIHRoZSBzbG9wZSB1c2luZyB0aGUgbWF4aW11bSBiaW4gaW5kZXggcmVwb3J0ZWQgaW4gdGhlIEZGVCBkYXRhLgorICAgQ2FsY3VsYXRlIHNsb3BlIGJldHdlZW4gRkZUIHBhY2tldCAwIGFuZCBwYWNrZXQgbi0xLiBBbHNvIGNhbGN1bGF0ZSBzbG9wZSBiZXR3ZWVuCisgICBwYWNrZXQgMSBhbmQgcGFja2V0IG4uCisgICBJZiBhIHB1bHNlIGlzIGNoaXJwaW5nLCBhIHNsb3BlIG9mIDUgYW5kIGdyZWF0ZXIgaXMgc2Vlbi4KKyAgIE5vbi1jaGlycGluZyBwdWxzZXMgaGF2ZSBzbG9wZXMgb2YgMCwgMSwgMiBvciAzLgorICovCisKKy8qCisgKiBDaGlycCBkZXRlY3Rpb24gZm9yIFNvd2wvSG93bC4KKyAqLworc3RhdGljIGludAorZGZzX2NoZWNrX2NoaXJwaW5nX3Nvd2woc3RydWN0IGF0aF9kZnMgKmRmcywgdm9pZCAqYnVmLAorCQkJdWludDE2X3QgZGF0YWxlbiwgaW50IGlzX2N0bCwgaW50IGlzX2V4dCwgaW50ICpzbG9wZSwKKwkJCWludCAqaXNfZGMpCit7CisjZGVmaW5lIEZGVF9MRU4gNzAKKyNkZWZpbmUgRkZUX0xPV0VSX0JJTl9NQVhfSU5ERVhfQllURSA2NgorI2RlZmluZSBGRlRfVVBQRVJfQklOX01BWF9JTkRFWF9CWVRFIDY5CisjZGVmaW5lIE1JTl9DSElSUElOR19TTE9QRSA0CisJaW50IGlzX2NoaXJwID0gMDsKKwlpbnQgcCwgbnVtX2ZmdF9wYWNrZXRzID0gMDsKKwlpbnQgY3RsX3Nsb3BlID0gMCwgZXh0X3Nsb3BlID0gMDsKKwlpbnQgY3RsX2hpZ2gwLCBjdGxfbG93MCwgY3RsX3Nsb3BlMCA9CisJCTAsIGV4dF9oaWdoMCwgZXh0X2xvdzAsIGV4dF9zbG9wZTAgPSAwOworCWludCBjdGxfaGlnaDEsIGN0bF9sb3cxLCBjdGxfc2xvcGUxID0KKwkJMCwgZXh0X2hpZ2gxLCBleHRfbG93MSwgZXh0X3Nsb3BlMSA9IDA7CisJdWludDhfdCAqZmZ0X2RhdGFfcHRyOworCisJKnNsb3BlID0gMDsKKwkqaXNfZGMgPSAwOworCisJbnVtX2ZmdF9wYWNrZXRzID0gZGF0YWxlbiAvIEZGVF9MRU47CisJZmZ0X2RhdGFfcHRyID0gKCh1aW50OF90ICopIGJ1Zik7CisKKwkvKiBERUJVRyAtIFByaW50IHJlbGV2YW50IHBvcnRpb25zIG9mIHRoZSBGRlQgZGF0YSAqLworCWZvciAocCA9IDA7IHAgPCBudW1fZmZ0X3BhY2tldHM7IHArKykgeworCisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19CSU41X0ZGVCwgImZmdF9kYXRhX3B0cj0weCVwXHQiLAorCQkJICAgIGZmdF9kYXRhX3B0cik7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19CSU41X0ZGVCwgIls2Nl09JWQgWzY5XT0lZFxuIiwKKwkJCSAgICAqKGZmdF9kYXRhX3B0ciArIEZGVF9MT1dFUl9CSU5fTUFYX0lOREVYX0JZVEUpID4+IDIsCisJCQkgICAgKihmZnRfZGF0YV9wdHIgKworCQkJICAgICAgRkZUX1VQUEVSX0JJTl9NQVhfSU5ERVhfQllURSkgPj4gMik7CisKKwkJZmZ0X2RhdGFfcHRyICs9IEZGVF9MRU47CisJfQorCisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX0JJTjVfRkZULAorCQkgICAgImRhdGFsZW49JWQgbnVtX2ZmdF9wYWNrZXRzPSVkXG4iLCBkYXRhbGVuLAorCQkgICAgbnVtX2ZmdF9wYWNrZXRzKTsKKworCS8qIFRoZXJlIGlzIG5vdCBlbm91Z2ggRkZUIGRhdGEgdG8gZmlndXJlIG91dCB3aGV0aGVyIHRoZSBwdWxzZSBpcyBjaGlycGluZyBvciBub3QgKi8KKwlpZiAobnVtX2ZmdF9wYWNrZXRzIDwgNCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlmZnRfZGF0YV9wdHIgPSAoKHVpbnQ4X3QgKikgYnVmKTsKKworCWlmIChpc19jdGwpIHsKKworCQlmZnRfZGF0YV9wdHIgPSAoKHVpbnQ4X3QgKikgYnVmKTsKKwkJY3RsX2xvdzAgPSAqKGZmdF9kYXRhX3B0ciArIEZGVF9MT1dFUl9CSU5fTUFYX0lOREVYX0JZVEUpID4+IDI7CisJCWZmdF9kYXRhX3B0ciArPSBGRlRfTEVOOworCQljdGxfbG93MSA9ICooZmZ0X2RhdGFfcHRyICsgRkZUX0xPV0VSX0JJTl9NQVhfSU5ERVhfQllURSkgPj4gMjsKKworCQkvKiBsYXN0IHBhY2tldCB3aXRoIGZpcnN0IHBhY2tldCAqLworCQlmZnRfZGF0YV9wdHIgPQorCQkJKCh1aW50OF90ICopIGJ1ZikgKyAoRkZUX0xFTiAqIChudW1fZmZ0X3BhY2tldHMgLSAxKSk7CisJCWN0bF9oaWdoMSA9ICooZmZ0X2RhdGFfcHRyICsgRkZUX0xPV0VSX0JJTl9NQVhfSU5ERVhfQllURSkgPj4gMjsKKworCQkvKiBzZWNvbmQgbGFzdCBwYWNrZXQgd2l0aCAwdGggcGFja2V0ICovCisJCWZmdF9kYXRhX3B0ciA9CisJCQkoKHVpbnQ4X3QgKikgYnVmKSArIChGRlRfTEVOICogKG51bV9mZnRfcGFja2V0cyAtIDIpKTsKKwkJY3RsX2hpZ2gwID0gKihmZnRfZGF0YV9wdHIgKyBGRlRfTE9XRVJfQklOX01BWF9JTkRFWF9CWVRFKSA+PiAyOworCisJCWN0bF9zbG9wZTAgPSBjdGxfaGlnaDAgLSBjdGxfbG93MDsKKwkJaWYgKGN0bF9zbG9wZTAgPCAwKQorCQkJY3RsX3Nsb3BlMCAqPSAoLTEpOworCisJCWN0bF9zbG9wZTEgPSBjdGxfaGlnaDEgLSBjdGxfbG93MTsKKwkJaWYgKGN0bF9zbG9wZTEgPCAwKQorCQkJY3RsX3Nsb3BlMSAqPSAoLTEpOworCisJCWN0bF9zbG9wZSA9CisJCQkoKGN0bF9zbG9wZTAgPiBjdGxfc2xvcGUxKSA/IGN0bF9zbG9wZTAgOiBjdGxfc2xvcGUxKTsKKwkJKnNsb3BlID0gY3RsX3Nsb3BlOworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONV9GRlQsCisJCQkgICAgImN0bF9zbG9wZTA9JWQgY3RsX3Nsb3BlMT0lZCBjdGxfc2xvcGU9JWRcbiIsCisJCQkgICAgY3RsX3Nsb3BlMCwgY3RsX3Nsb3BlMSwgY3RsX3Nsb3BlKTsKKworCX0gZWxzZSBpZiAoaXNfZXh0KSB7CisKKwkJZmZ0X2RhdGFfcHRyID0gKCh1aW50OF90ICopIGJ1Zik7CisJCWV4dF9sb3cwID0gKihmZnRfZGF0YV9wdHIgKyBGRlRfVVBQRVJfQklOX01BWF9JTkRFWF9CWVRFKSA+PiAyOworCisJCWZmdF9kYXRhX3B0ciArPSBGRlRfTEVOOworCQlleHRfbG93MSA9ICooZmZ0X2RhdGFfcHRyICsgRkZUX1VQUEVSX0JJTl9NQVhfSU5ERVhfQllURSkgPj4gMjsKKworCQlmZnRfZGF0YV9wdHIgPQorCQkJKCh1aW50OF90ICopIGJ1ZikgKyAoRkZUX0xFTiAqIChudW1fZmZ0X3BhY2tldHMgLSAxKSk7CisJCWV4dF9oaWdoMSA9ICooZmZ0X2RhdGFfcHRyICsgRkZUX1VQUEVSX0JJTl9NQVhfSU5ERVhfQllURSkgPj4gMjsKKwkJZmZ0X2RhdGFfcHRyID0KKwkJCSgodWludDhfdCAqKSBidWYpICsgKEZGVF9MRU4gKiAobnVtX2ZmdF9wYWNrZXRzIC0gMikpOworCQlleHRfaGlnaDAgPSAqKGZmdF9kYXRhX3B0ciArIEZGVF9VUFBFUl9CSU5fTUFYX0lOREVYX0JZVEUpID4+IDI7CisKKwkJZXh0X3Nsb3BlMCA9IGV4dF9oaWdoMCAtIGV4dF9sb3cwOworCQlpZiAoZXh0X3Nsb3BlMCA8IDApCisJCQlleHRfc2xvcGUwICo9ICgtMSk7CisKKwkJZXh0X3Nsb3BlMSA9IGV4dF9oaWdoMSAtIGV4dF9sb3cxOworCQlpZiAoZXh0X3Nsb3BlMSA8IDApCisJCQlleHRfc2xvcGUxICo9ICgtMSk7CisKKwkJZXh0X3Nsb3BlID0KKwkJCSgoZXh0X3Nsb3BlMCA+IGV4dF9zbG9wZTEpID8gZXh0X3Nsb3BlMCA6IGV4dF9zbG9wZTEpOworCQkqc2xvcGUgPSBleHRfc2xvcGU7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19CSU41X0ZGVCB8IEFUSF9ERUJVR19ERlNfQklONSwKKwkJCSAgICAiZXh0X3Nsb3BlMD0lZCBleHRfc2xvcGUxPSVkIGV4dF9zbG9wZT0lZFxuIiwKKwkJCSAgICBleHRfc2xvcGUwLCBleHRfc2xvcGUxLCBleHRfc2xvcGUpOworCX0gZWxzZQorCQlyZXR1cm4gMDsKKworCWlmICgoY3RsX3Nsb3BlID49IE1JTl9DSElSUElOR19TTE9QRSkKKwkgICAgfHwgKGV4dF9zbG9wZSA+PSBNSU5fQ0hJUlBJTkdfU0xPUEUpKSB7CisJCWlzX2NoaXJwID0gMTsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX0JJTjUgfCBBVEhfREVCVUdfREZTX0JJTjVfRkZUIHwKKwkJCSAgICBBVEhfREVCVUdfREZTX1BIWUVSUl9TVU0sCisJCQkgICAgImlzX2NoaXJwPSVkIGlzX2RjPSVkXG4iLCBpc19jaGlycCwgKmlzX2RjKTsKKwl9CisJcmV0dXJuIGlzX2NoaXJwOworCisjdW5kZWYgRkZUX0xFTgorI3VuZGVmIEZGVF9MT1dFUl9CSU5fTUFYX0lOREVYX0JZVEUKKyN1bmRlZiBGRlRfVVBQRVJfQklOX01BWF9JTkRFWF9CWVRFCisjdW5kZWYgTUlOX0NISVJQSU5HX1NMT1BFCit9CisKKy8qCisgKiBNZXJsaW4gKGFuZCBPc3ByZXksIGV0YykgY2hpcnAgcmFkYXIgY2hpcnAgZGV0ZWN0aW9uLgorICovCitzdGF0aWMgaW50CitkZnNfY2hlY2tfY2hpcnBpbmdfbWVybGluKHN0cnVjdCBhdGhfZGZzICpkZnMsIHZvaWQgKmJ1ZiwgdWludDE2X3QgZGF0YWxlbiwKKwkJCSAgaW50IGlzX2N0bCwgaW50IGlzX2V4dCwgaW50ICpzbG9wZSwgaW50ICppc19kYykKK3sKKyNkZWZpbmUgQUJTX0RJRkYoX3gsIF95KSAoKGludClfeCA+IChpbnQpX3kgPyAoaW50KV94IC0gKGludClfeSA6IChpbnQpX3kgLSAoaW50KV94KQorI2RlZmluZSBBQlMoX3gpICgoaW50KV94ID4gMCA/IChpbnQpX3ggOiAtKGludClfeCkKKworI2RlZmluZSBERUxUQV9TVEVQICAgICAgICAgICAgICAxICAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMy4gRGVmYXVsdCBpcyAxLiAgKi8KKyNkZWZpbmUgTlVNX0RJRkZTICAgICAgICAgICAgICAgMyAgICAgICAvKiBOdW1iZXIgb2YgRGlmZnMgdG8gY29tcHV0ZS4gdmFsaWQgcmFuZ2UgaXMgMi00ICovCisjZGVmaW5lIE1BWF9ESUZGICAgICAgICAgICAgICAgIDIgICAgICAgLyogVGhyZXNob2xkIGZvciBkaWZmZXJlbmNlIG9mIGRlbHRhIHBlYWtzICAgICAgICAqLworI2RlZmluZSBCSU5fQ09VTlRfTUFYICAgICAgICAgICA2ICAgICAgIC8qIE1heC4gbnVtYmVyIG9mIHN0cm9uZyBiaW5zIGZvciBuYXJyb3cgYmFuZCAgICAgKi8KKworLyoKKyAqIER5bmFtaWMgMjAvNDAgbW9kZSBGRlQgcGFja2V0IGZvcm1hdCByZWxhdGVkIGRlZmluaXRpb24KKyAqLworCisjZGVmaW5lIE5VTV9GRlRfQllURVNfSFQ0MCAgICAgIDcwCisjZGVmaW5lIE5VTV9CSU5fQllURVNfSFQ0MCAgICAgIDY0CisjZGVmaW5lIE5VTV9TVUJDSEFOX0JJTlNfSFQ0MCAgIDY0CisjZGVmaW5lIExPV0VSX0lOREVYX0JZVEVfSFQ0MCAgIDY2CisjZGVmaW5lIFVQUEVSX0lOREVYX0JZVEVfSFQ0MCAgIDY5CisjZGVmaW5lIExPV0VSX1dFSUdIVF9CWVRFX0hUNDAgIDY0CisjZGVmaW5lIFVQUEVSX1dFSUdIVF9CWVRFX0hUNDAgIDY3CisjZGVmaW5lIExPV0VSX01BR19CWVRFX0hUNDAgICAgIDY1CisjZGVmaW5lIFVQUEVSX01BR19CWVRFX0hUNDAgICAgIDY4CisKKy8qCisgKiBTdGF0aWMgMjAgbW9kZSBGRlQgcGFja2V0IGZvcm1hdCByZWxhdGVkIGRlZmluaXRpb24KKyAqLworCisjZGVmaW5lIE5VTV9GRlRfQllURVNfSFQyMCAgICAgIDMxCisjZGVmaW5lIE5VTV9CSU5fQllURVNfSFQyMCAgICAgIDI4CisjZGVmaW5lIE5VTV9TVUJDSEFOX0JJTlNfSFQyMCAgIDU2CisjZGVmaW5lIExPV0VSX0lOREVYX0JZVEVfSFQyMCAgIDMwCisjZGVmaW5lIFVQUEVSX0lOREVYX0JZVEVfSFQyMCAgIDMwCisjZGVmaW5lIExPV0VSX1dFSUdIVF9CWVRFX0hUMjAgIDI4CisjZGVmaW5lIFVQUEVSX1dFSUdIVF9CWVRFX0hUMjAgIDI4CisjZGVmaW5lIExPV0VSX01BR19CWVRFX0hUMjAgICAgIDI5CisjZGVmaW5lIFVQUEVSX01BR19CWVRFX0hUMjAgICAgIDI5CisKKwlpbnQgbnVtX2ZmdF9wYWNrZXRzOyAgICAvKiBudW1iZXIgb2YgRkZUIHBhY2tldHMgcmVwb3J0ZWQgdG8gc29mdHdhcmUgKi8KKwlpbnQgbnVtX2ZmdF9ieXRlczsKKwlpbnQgbnVtX2Jpbl9ieXRlczsKKwlpbnQgbnVtX3N1YmNoYW5fYmluczsKKwlpbnQgbG93ZXJfaW5kZXhfYnl0ZTsKKwlpbnQgdXBwZXJfaW5kZXhfYnl0ZTsKKwlpbnQgbG93ZXJfd2VpZ2h0X2J5dGU7CisJaW50IHVwcGVyX3dlaWdodF9ieXRlOworCWludCBsb3dlcl9tYWdfYnl0ZTsKKwlpbnQgdXBwZXJfbWFnX2J5dGU7CisKKwlpbnQgbWF4X2luZGV4X2xvd2VyW0RFTFRBX1NURVAgKyBOVU1fRElGRlNdOworCWludCBtYXhfaW5kZXhfdXBwZXJbREVMVEFfU1RFUCArIE5VTV9ESUZGU107CisJaW50IG1heF9tYWdfbG93ZXJbREVMVEFfU1RFUCArIE5VTV9ESUZGU107CisJaW50IG1heF9tYWdfdXBwZXJbREVMVEFfU1RFUCArIE5VTV9ESUZGU107CisJaW50IGJpbl93dF9sb3dlcltERUxUQV9TVEVQICsgTlVNX0RJRkZTXTsKKwlpbnQgYmluX3d0X3VwcGVyW0RFTFRBX1NURVAgKyBOVU1fRElGRlNdOworCWludCBtYXhfbWFnX3NlbFtERUxUQV9TVEVQICsgTlVNX0RJRkZTXTsKKwlpbnQgbWF4X21hZ1tERUxUQV9TVEVQICsgTlVNX0RJRkZTXTsKKwlpbnQgbWF4X2luZGV4W0RFTFRBX1NURVAgKyBOVU1fRElGRlNdOworCisJaW50IG1heF9kW10gPSB7IDEwLCAxOSwgMjggfTsKKwlpbnQgbWluX2RbXSA9IHsgMSwgMiwgMyB9OworCisJdWludDhfdCAqcHRyOyAgICAgICAgICAgLyogcG9pbnRlciB0byBGRlQgZGF0YSAqLworCWludCBpOworCWludCBmZnRfc3RhcnQ7CisJaW50IGNoaXJwX2ZvdW5kOworCWludCBkZWx0YV9wZWFrW05VTV9ESUZGU107CisJaW50IGo7CisJaW50IGJpbl9jb3VudDsKKwlpbnQgYndfbWFzazsKKwlpbnQgZGVsdGFfZGlmZjsKKwlpbnQgc2FtZV9zaWduOworCWludCB0ZW1wOworCisJaWYgKElTX0NIQU5fSFQ0MChkZnMtPmljLT5pY19jdXJjaGFuKSkgeworCQludW1fZmZ0X2J5dGVzID0gTlVNX0ZGVF9CWVRFU19IVDQwOworCQludW1fYmluX2J5dGVzID0gTlVNX0JJTl9CWVRFU19IVDQwOworCQludW1fc3ViY2hhbl9iaW5zID0gTlVNX1NVQkNIQU5fQklOU19IVDQwOworCQlsb3dlcl9pbmRleF9ieXRlID0gTE9XRVJfSU5ERVhfQllURV9IVDQwOworCQl1cHBlcl9pbmRleF9ieXRlID0gVVBQRVJfSU5ERVhfQllURV9IVDQwOworCQlsb3dlcl93ZWlnaHRfYnl0ZSA9IExPV0VSX1dFSUdIVF9CWVRFX0hUNDA7CisJCXVwcGVyX3dlaWdodF9ieXRlID0gVVBQRVJfV0VJR0hUX0JZVEVfSFQ0MDsKKwkJbG93ZXJfbWFnX2J5dGUgPSBMT1dFUl9NQUdfQllURV9IVDQwOworCQl1cHBlcl9tYWdfYnl0ZSA9IFVQUEVSX01BR19CWVRFX0hUNDA7CisKKwkJLyogaWYgd2UgYXJlIGluIEhUNDBNSU5VUyB0aGVuIHN3YXAgcHJpbWFyeSBhbmQgZXh0ZW5zaW9uICovCisJCWlmIChJU19DSEFOX0hUNDBfTUlOVVMoZGZzLT5pYy0+aWNfY3VyY2hhbikpIHsKKwkJCXRlbXAgPSBpc19jdGw7CisJCQlpc19jdGwgPSBpc19leHQ7CisJCQlpc19leHQgPSB0ZW1wOworCQl9CisKKwl9IGVsc2UgeworCQludW1fZmZ0X2J5dGVzID0gTlVNX0ZGVF9CWVRFU19IVDIwOworCQludW1fYmluX2J5dGVzID0gTlVNX0JJTl9CWVRFU19IVDIwOworCQludW1fc3ViY2hhbl9iaW5zID0gTlVNX1NVQkNIQU5fQklOU19IVDIwOworCQlsb3dlcl9pbmRleF9ieXRlID0gTE9XRVJfSU5ERVhfQllURV9IVDIwOworCQl1cHBlcl9pbmRleF9ieXRlID0gVVBQRVJfSU5ERVhfQllURV9IVDIwOworCQlsb3dlcl93ZWlnaHRfYnl0ZSA9IExPV0VSX1dFSUdIVF9CWVRFX0hUMjA7CisJCXVwcGVyX3dlaWdodF9ieXRlID0gVVBQRVJfV0VJR0hUX0JZVEVfSFQyMDsKKwkJbG93ZXJfbWFnX2J5dGUgPSBMT1dFUl9NQUdfQllURV9IVDIwOworCQl1cHBlcl9tYWdfYnl0ZSA9IFVQUEVSX01BR19CWVRFX0hUMjA7CisJfQorCisJcHRyID0gKHVpbnQ4X3QgKikgYnVmOworCS8qCisJICogc2FuaXR5IGNoZWNrIGZvciBGRlQgYnVmZmVyCisJICovCisKKwlpZiAoKHB0ciA9PSBOVUxMKSB8fCAoZGF0YWxlbiA9PSAwKSkgeworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONV9GRlQsCisJCQkgICAgIiVzOiBGRlQgYnVmZmVyIHBvaW50ZXIgaXMgbnVsbCBvciBzaXplIGlzIDBcbiIsCisJCQkgICAgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwludW1fZmZ0X3BhY2tldHMgPSAoZGF0YWxlbiAtIDMpIC8gbnVtX2ZmdF9ieXRlczsKKwlpZiAobnVtX2ZmdF9wYWNrZXRzIDwgKE5VTV9ESUZGUyArIERFTFRBX1NURVApKSB7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19CSU41X0ZGVCwKKwkJCSAgICAiZGF0YWxlbiA9ICVkLCBudW1fZmZ0X3BhY2tldHMgPSAlZCwgdG9vIGZldyBwYWNrZXRzLi4uIChleGl0aW5nKVxuIiwKKwkJCSAgICBkYXRhbGVuLCBudW1fZmZ0X3BhY2tldHMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKCgoZGF0YWxlbiAtIDMpICUgbnVtX2ZmdF9ieXRlcykgPT0gMikgJiYgKGRhdGFsZW4gPiBudW1fZmZ0X2J5dGVzKSkgeworCQkvKiBGSVhNRSAhISEgKi8KKwkJcHRyICs9IDI7CisJCWRhdGFsZW4gLT0gMjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgKE5VTV9ESUZGUyArIERFTFRBX1NURVApOyBpKyspIHsKKwkJZmZ0X3N0YXJ0ID0gaSAqIG51bV9mZnRfYnl0ZXM7CisJCWJpbl93dF9sb3dlcltpXSA9IHB0cltmZnRfc3RhcnQgKyBsb3dlcl93ZWlnaHRfYnl0ZV0gJiAweDNmOworCQliaW5fd3RfdXBwZXJbaV0gPSBwdHJbZmZ0X3N0YXJ0ICsgdXBwZXJfd2VpZ2h0X2J5dGVdICYgMHgzZjsKKworCQltYXhfaW5kZXhfbG93ZXJbaV0gPSBwdHJbZmZ0X3N0YXJ0ICsgbG93ZXJfaW5kZXhfYnl0ZV0gPj4gMjsKKwkJbWF4X2luZGV4X3VwcGVyW2ldID0KKwkJCShwdHJbZmZ0X3N0YXJ0ICsgdXBwZXJfaW5kZXhfYnl0ZV0gPj4gMikgKyBudW1fc3ViY2hhbl9iaW5zOworCisJCWlmICghSVNfQ0hBTl9IVDQwKGRmcy0+aWMtPmljX2N1cmNoYW4pKSB7CisJCQkvKgorCQkJICogZm9yIEhUMjAgbW9kZSBpbmRpY2VzIGFyZSA2IGJpdCBzaWduZWQgbnVtYmVyCisJCQkgKi8KKwkJCW1heF9pbmRleF9sb3dlcltpXSBePSAweDIwOworCQkJbWF4X2luZGV4X3VwcGVyW2ldID0gMDsKKwkJfQorCQkvKgorCQkgKiBSZWNvbnN0cnVjdCB0aGUgbWF4aW11bSBtYWduaXR1ZGUgZm9yIGVhY2ggc3ViLWNoYW5uZWwuIEFsc28gc2VsZWN0CisJCSAqIGFuZCBmbGFnIHRoZSBtYXggb3ZlcmFsbCBtYWduaXR1ZGUgYmV0d2VlbiB0aGUgdHdvIHN1Yi1jaGFubmVscy4KKwkJICovCisKKwkJbWF4X21hZ19sb3dlcltpXSA9CisJCQkoKHB0cltmZnRfc3RhcnQgKyBsb3dlcl9pbmRleF9ieXRlXSAmIDB4MDMpIDw8IDgpICsKKwkJCXB0cltmZnRfc3RhcnQgKyBsb3dlcl9tYWdfYnl0ZV07CisJCW1heF9tYWdfdXBwZXJbaV0gPQorCQkJKChwdHJbZmZ0X3N0YXJ0ICsgdXBwZXJfaW5kZXhfYnl0ZV0gJiAweDAzKSA8PCA4KSArCisJCQlwdHJbZmZ0X3N0YXJ0ICsgdXBwZXJfbWFnX2J5dGVdOworCQlid19tYXNrID0KKwkJCSgoYmluX3d0X2xvd2VyW2ldID09CisJCQkgIDApID8gMCA6IGlzX2N0bCkgKyAoKChiaW5fd3RfdXBwZXJbaV0gPT0KKwkJCQkJCTApID8gMCA6IGlzX2V4dCkgPDwgMSk7CisKKwkJLyoKKwkJICogTGltaXQgdGhlIG1heCBiaW4gYmFzZWQgb24gY2hhbm5lbCBiYW5kd2lkdGgKKwkJICogSWYgdGhlIHVwcGVyIHN1Yi1jaGFubmVsIG1heCBpbmRleCBpcyBzdHVjayBhdCAnMScsIHRoZSBzaWduYWwgaXMgZG9taW5hdGVkCisJCSAqIGJ5IHJlc2lkdWFsIERDIChvciBjYXJyaWVyIGxlYWspIGFuZCBzaG91bGQgYmUgaWdub3JlZC4KKwkJICovCisKKwkJaWYgKGJ3X21hc2sgPT0gMSkgeworCQkJbWF4X21hZ19zZWxbaV0gPSAwOworCQkJbWF4X21hZ1tpXSA9IG1heF9tYWdfbG93ZXJbaV07CisJCQltYXhfaW5kZXhbaV0gPSBtYXhfaW5kZXhfbG93ZXJbaV07CisJCX0gZWxzZSBpZiAoYndfbWFzayA9PSAyKSB7CisJCQltYXhfbWFnX3NlbFtpXSA9IDE7CisJCQltYXhfbWFnW2ldID0gbWF4X21hZ191cHBlcltpXTsKKwkJCW1heF9pbmRleFtpXSA9IG1heF9pbmRleF91cHBlcltpXTsKKwkJfSBlbHNlIGlmIChtYXhfaW5kZXhfdXBwZXJbaV0gPT0gbnVtX3N1YmNoYW5fYmlucykgeworCQkJbWF4X21hZ19zZWxbaV0gPSAwOyAgICAgLyogSWdub3JlIERDIGJpbi4gKi8KKwkJCW1heF9tYWdbaV0gPSBtYXhfbWFnX2xvd2VyW2ldOworCQkJbWF4X2luZGV4W2ldID0gbWF4X2luZGV4X2xvd2VyW2ldOworCQl9IGVsc2UgeworCQkJaWYgKG1heF9tYWdfdXBwZXJbaV0gPiBtYXhfbWFnX2xvd2VyW2ldKSB7CisJCQkJbWF4X21hZ19zZWxbaV0gPSAxOworCQkJCW1heF9tYWdbaV0gPSBtYXhfbWFnX3VwcGVyW2ldOworCQkJCW1heF9pbmRleFtpXSA9IG1heF9pbmRleF91cHBlcltpXTsKKwkJCX0gZWxzZSB7CisJCQkJbWF4X21hZ19zZWxbaV0gPSAwOworCQkJCW1heF9tYWdbaV0gPSBtYXhfbWFnX2xvd2VyW2ldOworCQkJCW1heF9pbmRleFtpXSA9IG1heF9pbmRleF9sb3dlcltpXTsKKwkJCX0KKwkJfQorCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONV9GRlQsCisJCQkgICAgImk9JWQsIG1heF9pbmRleFtpXT0lZCwgbWF4X2luZGV4X2xvd2VyW2ldPSVkLCAiCisJCQkgICAgIm1heF9pbmRleF91cHBlcltpXT0lZFxuIiwKKwkJCSAgICBpLCBtYXhfaW5kZXhbaV0sIG1heF9pbmRleF9sb3dlcltpXSwKKwkJCSAgICBtYXhfaW5kZXhfdXBwZXJbaV0pOworCX0KKworCWNoaXJwX2ZvdW5kID0gMTsKKwlkZWx0YV9kaWZmID0gMDsKKwlzYW1lX3NpZ24gPSAxOworCisJLyoKKwkgICBkZWx0YV9kaWZmIGNvbXB1dGF0aW9uIC0tIGxvb2sgZm9yIG1vdmVtZW50IGluIHBlYWsuCisJICAgbWFrZSBzdXJlIHRoYXQgdGhlIGNoaXJwIGRpcmVjdGlvbiAoaS5lLiBzaWduKSBpcyBhbHdheXMgdGhlIHNhbWUsCisJICAgaS5lLiBzaWduIG9mIHRoZSB0d28gcGVha3Mgc2hvdWxkIGJlIHNhbWUuCisJICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9ESUZGUzsgaSsrKSB7CisJCWRlbHRhX3BlYWtbaV0gPSBtYXhfaW5kZXhbaSArIERFTFRBX1NURVBdIC0gbWF4X2luZGV4W2ldOworCQlpZiAoaSA+IDApIHsKKwkJCWRlbHRhX2RpZmYgPSBkZWx0YV9wZWFrW2ldIC0gZGVsdGFfcGVha1tpIC0gMV07CisJCQlzYW1lX3NpZ24gPQorCQkJCSEoKGRlbHRhX3BlYWtbaV0gJiAweDgwKSBeCisJCQkJICAoZGVsdGFfcGVha1tpIC0gMV0gJiAweDgwKSk7CisJCX0KKwkJY2hpcnBfZm91bmQgJj0gKEFCUyhkZWx0YV9wZWFrW2ldKSA+PSBtaW5fZFtERUxUQV9TVEVQIC0gMV0pICYmCisJCQkgICAgICAgKEFCUyhkZWx0YV9wZWFrW2ldKSA8PSBtYXhfZFtERUxUQV9TVEVQIC0gMV0pICYmCisJCQkgICAgICAgc2FtZV9zaWduICYmIChBQlMoZGVsdGFfZGlmZikgPD0gTUFYX0RJRkYpOworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONV9GRlQsCisJCQkgICAgImk9JWQsIGRlbHRhX3BlYWtbaV09JWQsIGRlbHRhX2RpZmY9JWRcbiIsCisJCQkgICAgaSwgZGVsdGFfcGVha1tpXSwgZGVsdGFfZGlmZik7CisJfQorCisJaWYgKGNoaXJwX2ZvdW5kKSB7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19CSU41X0ZGVCwKKwkJCSAgICAiJXM6IENISVJQSU5HX0JFRk9SRV9TVFJPTkdCSU5fWUVTXG4iLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX0JJTjVfRkZULAorCQkJICAgICIlczogQ0hJUlBJTkdfQkVGT1JFX1NUUk9OR0JJTl9OT1xuIiwgX19mdW5jX18pOworCX0KKworCS8qCisJICAgV29yayBhcm91bmQgZm9yIHBvdGVudGlhbCBoYXJkd2FyZSBkYXRhIGNvcnJ1cHRpb24gYnVnLiBDaGVjayBmb3IKKwkgICB3aWRlIGJhbmQgc2lnbmFsIGJ5IGNvdW50aW5nIHN0cm9uZyBiaW5zIGluZGljYXRlZCBieSBiaXRtYXAgZmxhZ3MuCisJICAgVGhpcyBjaGVjayBpcyBkb25lIGlmIGNoaXJwX2ZvdW5kIGlzIHRydWUuIFdlIGRvIHRoaXMgYXMgYSBmaW5hbCBjaGVjaworCSAgIHRvIHdlZWQgb3V0IGNvcnJ1cHQgRkZUcyBieXRlcy4gVGhpcyBsb29rcyBleHBlbnNpdmUgYnV0IGluIG1vc3QgY2FzZXMgaXQKKwkgICB3aWxsIGV4aXQgZWFybHkuCisJICovCisKKwlmb3IgKGkgPSAwOyAoaSA8IChOVU1fRElGRlMgKyBERUxUQV9TVEVQKSkgJiYgKGNoaXJwX2ZvdW5kID09IDEpOyBpKyspIHsKKwkJYmluX2NvdW50ID0gMDsKKwkJLyogcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSAxc3QgYnl0ZSBvZiB0aGUgc2VsZWN0ZWQgc3ViLWNoYW5uZWwuICovCisJCWZmdF9zdGFydCA9CisJCQkoaSAqIG51bV9mZnRfYnl0ZXMpICsKKwkJCShtYXhfbWFnX3NlbFtpXSA/IChudW1fc3ViY2hhbl9iaW5zID4+IDEpIDogMCk7CisJCWZvciAoaiA9IDA7IGogPCAobnVtX3N1YmNoYW5fYmlucyA+PiAxKTsgaisrKSB7CisJCQkvKgorCQkJICogSWYgZWl0aGVyIGJpbiBpcyBmbGFnZ2VkICJzdHJvbmciLCBhY2N1bXVsYXRlIHRoZSBiaW5fY291bnQuCisJCQkgKiBJdCdzIG5vdCBhY2N1cmF0ZSwgYnV0IGdvb2QgZW5vdWdoLi4uCisJCQkgKi8KKwkJCWJpbl9jb3VudCArPSAocHRyW2ZmdF9zdGFydCArIGpdICYgMHg4OCkgPyAxIDogMDsKKwkJfQorCQljaGlycF9mb3VuZCAmPSAoYmluX2NvdW50ID4gQklOX0NPVU5UX01BWCkgPyAwIDogMTsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX0JJTjVfRkZULAorCQkJICAgICJpPSVkLCBjb21wdXRlZCBiaW5fY291bnQ9JWRcbiIsIGksIGJpbl9jb3VudCk7CisJfQorCisJaWYgKGNoaXJwX2ZvdW5kKSB7CisJCURGU19EUFJJTlRLKGRmcywKKwkJCSAgICBBVEhfREVCVUdfREZTX0JJTjVfRkZUIHwgQVRIX0RFQlVHX0RGU19QSFlFUlJfU1VNLAorCQkJICAgICIlczogQ0hJUlBJTkdfWUVTXG4iLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJREZTX0RQUklOVEsoZGZzLAorCQkJICAgIEFUSF9ERUJVR19ERlNfQklONV9GRlQgfCBBVEhfREVCVUdfREZTX1BIWUVSUl9TVU0sCisJCQkgICAgIiVzOiBDSElSUElOR19OT1xuIiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gY2hpcnBfZm91bmQ7CisKKyN1bmRlZiBBQlNfRElGRgorI3VuZGVmIEFCUworI3VuZGVmIERFTFRBX1NURVAKKyN1bmRlZiBOVU1fRElGRlMKKyN1bmRlZiBNQVhfRElGRgorI3VuZGVmIEJJTl9DT1VOVF9NQVgKKworI3VuZGVmIE5VTV9GRlRfQllURVNfSFQ0MAorI3VuZGVmIE5VTV9CSU5fQllURVNfSFQ0MAorI3VuZGVmIE5VTV9TVUJDSEFOX0JJTlNfSFQ0MAorI3VuZGVmIExPV0VSX0lOREVYX0JZVEVfSFQ0MAorI3VuZGVmIFVQUEVSX0lOREVYX0JZVEVfSFQ0MAorI3VuZGVmIExPV0VSX1dFSUdIVF9CWVRFX0hUNDAKKyN1bmRlZiBVUFBFUl9XRUlHSFRfQllURV9IVDQwCisjdW5kZWYgTE9XRVJfTUFHX0JZVEVfSFQ0MAorI3VuZGVmIFVQUEVSX01BR19CWVRFX0hUNDAKKworI3VuZGVmIE5VTV9GRlRfQllURVNfSFQ0MAorI3VuZGVmIE5VTV9CSU5fQllURVNfSFQ0MAorI3VuZGVmIE5VTV9TVUJDSEFOX0JJTlNfSFQ0MAorI3VuZGVmIExPV0VSX0lOREVYX0JZVEVfSFQ0MAorI3VuZGVmIFVQUEVSX0lOREVYX0JZVEVfSFQ0MAorI3VuZGVmIExPV0VSX1dFSUdIVF9CWVRFX0hUNDAKKyN1bmRlZiBVUFBFUl9XRUlHSFRfQllURV9IVDQwCisjdW5kZWYgTE9XRVJfTUFHX0JZVEVfSFQ0MAorI3VuZGVmIFVQUEVSX01BR19CWVRFX0hUNDAKK30KKworaW50CitkZnNfY2hlY2tfY2hpcnBpbmcoc3RydWN0IGF0aF9kZnMgKmRmcywgdm9pZCAqYnVmLAorCQkgICB1aW50MTZfdCBkYXRhbGVuLCBpbnQgaXNfY3RsLCBpbnQgaXNfZXh0LCBpbnQgKnNsb3BlLAorCQkgICBpbnQgKmlzX2RjKQoreworCisJaWYgKGRmcy0+ZGZzX2NhcHMuYXRoX2Rmc191c2VfZW5oYW5jZW1lbnQpCisJCXJldHVybiBkZnNfY2hlY2tfY2hpcnBpbmdfbWVybGluKGRmcywgYnVmLCBkYXRhbGVuLCBpc19jdGwsCisJCQkJCQkgaXNfZXh0LCBzbG9wZSwgaXNfZGMpOworCWVsc2UKKwkJcmV0dXJuIGRmc19jaGVja19jaGlycGluZ19zb3dsKGRmcywgYnVmLCBkYXRhbGVuLCBpc19jdGwsCisJCQkJCSAgICAgICBpc19leHQsIHNsb3BlLCBpc19kYyk7Cit9CisKK3VpbnQ4X3QKK2Rmc19yZXRhaW5fYmluNV9idXJzdF9wYXR0ZXJuKHN0cnVjdCBhdGhfZGZzICpkZnMsIHVpbnQzMl90IGRpZmZfdHMsCisJCQkgICAgICB1aW50OF90IG9sZF9kdXIpCit7CisKKwkvKgorCSAqIFB1bHNlcyBtYXkgZ2V0IHNwbGl0IGludG8gMiBkdXJpbmcgY2hpcnBpbmcsIHRoaXMgcHJpbnQgaXMgb25seQorCSAqIHRvIHNob3cgdGhhdCBpdCBoYXBwZW5lZCwgd2UgZG8gbm90IGhhbmRsZSB0aGlzIGNvbmRpdGlvbiBpZiB3ZQorCSAqIGNhbm5vdCBkZXRlY3QgdGhlIGNoaXJwaW5nLgorCSAqLworCS8qCisJICogU1BMSVQgcHVsc2VzIHdpbGwgaGF2ZSBhIHRpbWUgc3RhbXAgZGlmZmVyZW5jZSBvZiA8IDUwCisJICovCisJaWYgKGRpZmZfdHMgPCA1MCkgeworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONSwKKwkJCSAgICAiJXMgU1BMSVQgcHVsc2UgZGlmZlRzPSV1IGR1cj0lZCAob2xkX2R1cj0lZClcbiIsCisJCQkgICAgX19mdW5jX18sIGRpZmZfdHMsCisJCQkgICAgZGZzLT5kZnNfcmluZm8uZGZzX2xhc3RfYmluNV9kdXIsIG9sZF9kdXIpOworCX0KKwkvKgorCSAqIENoZWNrIGlmIHRoaXMgaXMgdGhlIDJuZCBvciAzcmQgcHVsc2UgaW4gdGhlIHNhbWUgYnVyc3QsCisJICogUFJJIHdpbGwgYmUgYmV0d2VlbiAxMDAwIGFuZCAyMDAwIHVzCisJICovCisJaWYgKCgoZGlmZl90cyA+PSBERlNfQklONV9QUklfTE9XRVJfTElNSVQpICYmCisJICAgICAoZGlmZl90cyA8PSBERlNfQklONV9QUklfSElHSEVSX0xJTUlUKSkpIHsKKwkJLyoKKwkJICogVGhpcyBwdWxzZSBiZWxvbmdzIHRvIHRoZSBzYW1lIGJ1cnN0IGFzIHRoZSBwdWxzZSBiZWZvcmUsCisJCSAqIHNvIHJldHVybiB0aGUgc2FtZSByYW5kb20gZHVyYXRpb24gZm9yIGl0CisJCSAqLworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfQklONSwKKwkJCSAgICAiJXMgdGhpcyBwdWxzZSBiZWxvbmdzIHRvIHRoZSBzYW1lIGJ1cnN0IGFzIGJlZm9yZSwgZ2l2ZSAiCisJCQkgICAgIml0IHNhbWUgZHVyPSVkIChvbGRfZHVyPSVkKVxuIiwKKwkJCSAgICBfX2Z1bmNfXywgZGZzLT5kZnNfcmluZm8uZGZzX2xhc3RfYmluNV9kdXIsCisJCQkgICAgb2xkX2R1cik7CisKKwkJcmV0dXJuIChkZnMtPmRmc19yaW5mby5kZnNfbGFzdF9iaW41X2R1cik7CisJfQorCS8qCisJICogVGhpcyBwdWxzZSBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBidXJzdCwgcmV0dXJuIHVuY2hhbmdlZAorCSAqIGR1cmF0aW9uLgorCSAqLworCXJldHVybiBvbGRfZHVyOworfQorCisvKgorICogQ2hpcnBpbmcgcHVsc2VzIG1heSBnZXQgY3V0IG9mZiBhdCBEQyBhbmQgcmVwb3J0IGxvd2VyIGR1cmF0aW9ucy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSBhIHN1aXRhYmxlIHJhbmRvbSBkdXJhdGlvbiBmb3IgZWFjaCBwdWxzZS4KKyAqIER1cmF0aW9uIG11c3QgYmUgYmV0d2VlbiA1MCBhbmQgMTAwIHVzLCBidXQgcmVtZW1iZXIgdGhhdCBpbgorICogYXRoX3Byb2Nlc3NfcGh5ZXJyKCkgd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbiwgd2UgYXJlIGRlYWxpbmcgd2l0aCB0aGUKKyAqIEhXIHJlcG9ydGVkIGR1cmF0aW9uICh1bmNvbnZlcnRlZCkuIGRmc19wcm9jZXNzX3JhZGFyZXZlbnQoKSB3aWxsCisgKiBhY3R1YWxseSBjb252ZXJ0IHRoZSBkdXJhdGlvbiBpbnRvIHRoZSBjb3JyZWN0IHZhbHVlLgorICoKKyAqIFhYWCBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgd2hldGhlciB0aGUgaGFyZHdhcmUKKyAqIGlzIG9wZXJhdGluZyBpbiA1R0h6IGZhc3QgY2xvY2sgbW9kZSBvciBub3QuCisgKgorICogWFhYIEFuZCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgd2hldGhlciB0aGUgaGFyZHdhcmUKKyAqIGlzIHBlcmVncmluZSBvciBub3QuICBHcnIuCisgKi8KK2ludCBkZnNfZ2V0X3JhbmRvbV9iaW41X2R1cihzdHJ1Y3QgYXRoX2RmcyAqZGZzLCB1aW50NjRfdCB0c3RhbXApCit7CisJdWludDhfdCBuZXdfZHVyID0gTUlOX0JJTjVfRFVSOworCWludCByYW5nZTsKKworCWdldF9yYW5kb21fYnl0ZXMoJm5ld19kdXIsIHNpemVvZih1aW50OF90KSk7CisKKwlyYW5nZSA9IChNQVhfQklONV9EVVIgLSBNSU5fQklONV9EVVIgKyAxKTsKKworCW5ld19kdXIgJT0gcmFuZ2U7CisKKwluZXdfZHVyICs9IE1JTl9CSU41X0RVUjsKKworCXJldHVybiBuZXdfZHVyOworfQorCisjZW5kaWYgLyogQVRIX1NVUFBPUlRfREZTICovCmRpZmYgLS1naXQgYS9jb3JlL3NhcC9kZnMvc3JjL2Rmc19pbml0LmMgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyNTljNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2FwL2Rmcy9zcmMvZGZzX2luaXQuYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZzX2luaXQuYworCisgICBPVkVSVklFVzoKKworICAgU291cmNlIGNvZGUgYm9ycm93ZWQgZnJvbSBRQ0FfTUFJTiBERlMgbW9kdWxlCisKKyAgIERFUEVOREVOQ0lFUzoKKworICAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisgICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKyAgIC0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJkZnMuaCIKKy8qIFRPIERPIERGUworICAgI2luY2x1ZGUgPGllZWU4MDIxMV92YXIuaD4KKyAqLworI2lmZGVmIEFUSF9TVVBQT1JUX0RGUworCitleHRlcm4gaW50IGRvbWFpbm92ZXJyaWRlOworCisvKgorICogQ2xlYXIgYWxsIGRlbGF5IGxpbmVzIGZvciBhbGwgZmlsdGVyIHR5cGVzCisgKgorICogVGhpcyBtYXkgYmUgY2FsbGVkIGJlZm9yZSBhbnkgcmFkYXIgcHVsc2VzIGFyZSBjb25maWd1cmVkCisgKiAoZWcgb24gYSBub24tREZTIGNoYW5uZWwsIHdpdGggcmFkYXIgUEhZIGVycm9ycyBzdGlsbCBzaG93aW5nIHVwLikKKyAqIEluIHRoYXQgY2FzZSwganVzdCBkcm9wIG91dCBlYXJseS4KKyAqLwordm9pZCBkZnNfcmVzZXRfYWxsZGVsYXlsaW5lcyhzdHJ1Y3QgYXRoX2RmcyAqZGZzKQoreworCXN0cnVjdCBkZnNfZmlsdGVydHlwZSAqZnQgPSBOVUxMOworCXN0cnVjdCBkZnNfZmlsdGVyICpyZjsKKwlzdHJ1Y3QgZGZzX2RlbGF5bGluZSAqZGw7CisJc3RydWN0IGRmc19wdWxzZWxpbmUgKnBsOworCWludCBpLCBqOworCisJaWYgKGRmcyA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXNbJWRdOiBzY19kZnMgaXMgTlVMTCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisJcGwgPSBkZnMtPnB1bHNlczsKKworCWlmIChwbCA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXNbJWRdOiAgcGw9PU5VTEwsIGRmcz0lcCIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGZzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkZnMtPmRmc19iNXJhZGFycyA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXNbJWRdOiBwbD09TlVMTCwgYjVyYWRhcnM9JXAiLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkgIGRmcy0+ZGZzX2I1cmFkYXJzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHJlc2V0IHRoZSBwdWxzZSBsb2cgKi8KKwlwbC0+cGxfZmlyc3RlbGVtID0gcGwtPnBsX251bWVsZW1zID0gMDsKKwlwbC0+cGxfbGFzdGVsZW0gPSBERlNfTUFYX1BVTFNFX0JVRkZFUl9NQVNLOworCisJZm9yIChpID0gMDsgaSA8IERGU19NQVhfUkFEQVJfVFlQRVM7IGkrKykgeworCQlpZiAoZGZzLT5kZnNfcmFkYXJmW2ldICE9IE5VTEwpIHsKKwkJCWZ0ID0gZGZzLT5kZnNfcmFkYXJmW2ldOworCQkJaWYgKE5VTEwgIT0gZnQpIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgZnQtPmZ0X251bWZpbHRlcnM7IGorKykgeworCQkJCQlyZiA9ICYoZnQtPmZ0X2ZpbHRlcnNbal0pOworCQkJCQlkbCA9ICYocmYtPnJmX2RsKTsKKwkJCQkJaWYgKGRsICE9IE5VTEwpIHsKKwkJCQkJCU9TX01FTVpFUk8oZGwsCisJCQkJCQkJICAgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCQkgIGRmc19kZWxheWxpbmUpKTsKKwkJCQkJCWRsLT5kbF9sYXN0ZWxlbSA9CisJCQkJCQkJKDB4RkZGRkZGRkYpICYKKwkJCQkJCQlERlNfTUFYX0RMX01BU0s7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IGRmcy0+ZGZzX3JpbmZvLnJuX251bWJpbjVyYWRhcnM7IGkrKykgeworCQlPU19NRU1aRVJPKCYoZGZzLT5kZnNfYjVyYWRhcnNbaV0uYnJfZWxlbXNbMF0pLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBkZnNfYmluNWVsZW0pICogREZTX01BWF9CNV9TSVpFKTsKKwkJZGZzLT5kZnNfYjVyYWRhcnNbaV0uYnJfZmlyc3RlbGVtID0gMDsKKwkJZGZzLT5kZnNfYjVyYWRhcnNbaV0uYnJfbnVtZWxlbXMgPSAwOworCQlkZnMtPmRmc19iNXJhZGFyc1tpXS5icl9sYXN0ZWxlbSA9CisJCQkoMHhGRkZGRkZGRikgJiBERlNfTUFYX0I1X01BU0s7CisJfQorfQorCisvKgorICogQ2xlYXIgb25seSBhIHNpbmdsZSBkZWxheSBsaW5lCisgKi8KKwordm9pZCBkZnNfcmVzZXRfZGVsYXlsaW5lKHN0cnVjdCBkZnNfZGVsYXlsaW5lICpkbCkKK3sKKwlPU19NRU1aRVJPKCYoZGwtPmRsX2VsZW1zWzBdKSwgc2l6ZW9mKGRsLT5kbF9lbGVtcykpOworCWRsLT5kbF9sYXN0ZWxlbSA9ICgweEZGRkZGRkZGKSAmIERGU19NQVhfRExfTUFTSzsKK30KKwordm9pZCBkZnNfcmVzZXRfZmlsdGVyX2RlbGF5bGluZXMoc3RydWN0IGRmc19maWx0ZXJ0eXBlICpkZnQpCit7CisJaW50IGk7CisJc3RydWN0IGRmc19maWx0ZXIgKmRmOworCWZvciAoaSA9IDA7IGkgPCBERlNfTUFYX05VTV9SQURBUl9GSUxURVJTOyBpKyspIHsKKwkJZGYgPSAmZGZ0LT5mdF9maWx0ZXJzW2ldOworCQlkZnNfcmVzZXRfZGVsYXlsaW5lKCYoZGYtPnJmX2RsKSk7CisJfQorfQorCit2b2lkIGRmc19yZXNldF9yYWRhcnEoc3RydWN0IGF0aF9kZnMgKmRmcykKK3sKKwlzdHJ1Y3QgZGZzX2V2ZW50ICpldmVudDsKKwlpZiAoZGZzID09IE5VTEwpIHsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTLCAiJXM6IHNjX2RmcyBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCUFUSF9ERlNRX0xPQ0soZGZzKTsKKwlBVEhfREZTRVZFTlRRX0xPQ0soZGZzKTsKKwl3aGlsZSAoIVNUQUlMUV9FTVBUWSgmKGRmcy0+ZGZzX3JhZGFycSkpKSB7CisJCWV2ZW50ID0gU1RBSUxRX0ZJUlNUKCYoZGZzLT5kZnNfcmFkYXJxKSk7CisJCVNUQUlMUV9SRU1PVkVfSEVBRCgmKGRmcy0+ZGZzX3JhZGFycSksIHJlX2xpc3QpOworCQlPU19NRU1aRVJPKGV2ZW50LCBzaXplb2Yoc3RydWN0IGRmc19ldmVudCkpOworCQlTVEFJTFFfSU5TRVJUX1RBSUwoJihkZnMtPmRmc19ldmVudHEpLCBldmVudCwgcmVfbGlzdCk7CisJfQorCUFUSF9ERlNFVkVOVFFfVU5MT0NLKGRmcyk7CisJQVRIX0RGU1FfVU5MT0NLKGRmcyk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gSW5pdGlhbGl6ZSB0aGUgcmFkYXIgZmlsdGVyIHRhYmxlcworICogaWYgdGhlIGF0aCBkZnMgZG9tYWluIGlzIHVuaW5pdGFsaXplZCBvcgorICogICAgYXRoIGRmcyBkb21haW4gaXMgZGlmZmVyZW50IGZyb20gaGFsIGRmcyBkb21haW4KKyAqLworaW50IGRmc19pbml0X3JhZGFyX2ZpbHRlcnMoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsCisJCQkgICBzdHJ1Y3QgYXRoX2Rmc19yYWRhcl90YWJfaW5mbyAqcmFkYXJfaW5mbykKK3sKKwl1aW50MzJfdCBULCBUbWF4OworCWludCBudW1wdWxzZXMsIHAsIG4sIGk7CisJaW50IG51bXJhZGFycyA9IDAsIG51bWI1cmFkYXJzID0gMDsKKwlzdHJ1Y3QgYXRoX2RmcyAqZGZzID0gKHN0cnVjdCBhdGhfZGZzICopaWMtPmljX2RmczsKKwlzdHJ1Y3QgZGZzX2ZpbHRlcnR5cGUgKmZ0ID0gTlVMTDsKKwlzdHJ1Y3QgZGZzX2ZpbHRlciAqcmYgPSBOVUxMOworCXN0cnVjdCBkZnNfcHVsc2UgKmRmc19yYWRhcnM7CisJc3RydWN0IGRmc19iaW41cHVsc2UgKmI1cHVsc2VzID0gTlVMTDsKKwlpbnQzMl90IG1pbl9yc3NpdGhyZXNoID0gREZTX01BWF9SU1NJX1ZBTFVFOworCXVpbnQzMl90IG1heF9wdWxzZWR1ciA9IDA7CisKKwlpZiAoZGZzID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlc1slZF06IGRmcyBpcyBOVUxMIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIERGU19TVEFUVVNfRkFJTDsKKwl9CisJLyogY2xlYXIgdXAgdGhlIGRmcyBkb21haW4gZmxhZyBmaXJzdCAqLworI2lmbmRlZiBBVEhfREZTX1JBREFSX0RFVEVDVElPTl9PTkxZCisJZGZzLT5hdGhfZGZzX2lzZGZzcmVnZG9tYWluID0gMDsKKyNlbmRpZgorCisJLyoKKwkgKiBJZiByYWRhcl9pbmZvIGlzIE5VTEwgb3IgZGZzZG9tYWluIGlzIE5VTEwsIHRyZWF0CisJICogdGhlIHJlc3Qgb2YgdGhlIHJhZGFyIGNvbmZpZ3VyYXRpb24gYXMgc3VzcGVjdC4KKwkgKi8KKwlpZiAocmFkYXJfaW5mbyA9PSBOVUxMIHx8IHJhZGFyX2luZm8tPmRmc2RvbWFpbiA9PSAwKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXNbJWRdOiBVbmtub3duIGRmcyBkb21haW4gJWQgIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBkZnMtPmRmc2RvbWFpbik7CisJCS8qIERpc2FibGUgcmFkYXIgZGV0ZWN0aW9uIHNpbmNlIHdlIGRvbid0IGhhdmUgYSByYWRhciBkb21haW4gKi8KKwkJZGZzLT5kZnNfcHJvY19waHllcnIgJj0gfkRGU19SQURBUl9FTjsKKwkJLyogUmV0dXJuaW5nIHN1Y2Nlc3MgdGhvdWdoIHdlIGFyZSBub3QgY29tcGxldGluZyBpbml0LiBBIGZhaWx1cmUKKwkJICogd2lsbCBmYWlsIGRmc19hdHRhY2ggYWxzby4KKwkJICovCisJCXJldHVybiBERlNfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXNbJWRdOmRmc2RvbWFpbj0lZCwgbnVtcmFkYXJzPSVkLCBudW1iNXJhZGFycz0lZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCByYWRhcl9pbmZvLT5kZnNkb21haW4sCisJCSAgcmFkYXJfaW5mby0+bnVtcmFkYXJzLCByYWRhcl9pbmZvLT5udW1iNXJhZGFycyk7CisJZGZzLT5kZnNkb21haW4gPSByYWRhcl9pbmZvLT5kZnNkb21haW47CisJZGZzX3JhZGFycyA9IHJhZGFyX2luZm8tPmRmc19yYWRhcnM7CisJbnVtcmFkYXJzID0gcmFkYXJfaW5mby0+bnVtcmFkYXJzOworCWI1cHVsc2VzID0gcmFkYXJfaW5mby0+YjVwdWxzZXM7CisJbnVtYjVyYWRhcnMgPSByYWRhcl9pbmZvLT5udW1iNXJhZGFyczsKKworCS8qIFhYWCB0aGlzIHNob3VsZCBiZSBhbiBleHBsaWNpdCBjb3B5IG9mIHNvbWUgc29ydCEgKi8KKwlkZnMtPmRmc19kZWZhdWx0cGFyYW1zID0gcmFkYXJfaW5mby0+ZGZzX2RlZmF1bHRwYXJhbXM7CisKKyNpZm5kZWYgQVRIX0RGU19SQURBUl9ERVRFQ1RJT05fT05MWQorCWRmcy0+YXRoX2Rmc19pc2Rmc3JlZ2RvbWFpbiA9IDE7CisjZW5kaWYKKworCWRmcy0+ZGZzX3JpbmZvLnJuX251bXJhZGFycyA9IDA7CisJLyogQ2xlYXIgZmlsdGVyIHR5cGUgdGFibGUgKi8KKwlmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IERGU19NQVhfUkFEQVJfT1ZFUkxBUDsgaSsrKQorCQkJKGRmcy0+ZGZzX3JhZGFydGFibGVbbl0pW2ldID0gLTE7CisJfQorCS8qIE5vdywgaW5pdGlhbGl6ZSB0aGUgcmFkYXIgZmlsdGVycyAqLworCWZvciAocCA9IDA7IHAgPCBudW1yYWRhcnM7IHArKykgeworCQlmdCA9IE5VTEw7CisJCWZvciAobiA9IDA7IG4gPCBkZnMtPmRmc19yaW5mby5ybl9udW1yYWRhcnM7IG4rKykgeworCQkJaWYgKChkZnNfcmFkYXJzW3BdLnJwX3B1bHNlZHVyID09CisJCQkgICAgIGRmcy0+ZGZzX3JhZGFyZltuXS0+ZnRfZmlsdGVyZHVyKQorCQkJICAgICYmIChkZnNfcmFkYXJzW3BdLnJwX251bXB1bHNlcyA9PQorCQkJCWRmcy0+ZGZzX3JhZGFyZltuXS0+ZnRfbnVtcHVsc2VzKQorCQkJICAgICYmIChkZnNfcmFkYXJzW3BdLnJwX21pbmR1ciA9PQorCQkJCWRmcy0+ZGZzX3JhZGFyZltuXS0+ZnRfbWluZHVyKQorCQkJICAgICYmIChkZnNfcmFkYXJzW3BdLnJwX21heGR1ciA9PQorCQkJCWRmcy0+ZGZzX3JhZGFyZltuXS0+ZnRfbWF4ZHVyKSkgeworCQkJCWZ0ID0gZGZzLT5kZnNfcmFkYXJmW25dOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmdCA9PSBOVUxMKSB7CisJCQkvKiBObyBmaWx0ZXIgb2YgdGhlIGFwcHJvcHJpYXRlIGR1ciB3YXMgZm91bmQgKi8KKwkJCWlmICgoZGZzLT5kZnNfcmluZm8ucm5fbnVtcmFkYXJzICsgMSkgPgorCQkJICAgIERGU19NQVhfUkFEQVJfVFlQRVMpIHsKKwkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsCisJCQkJCSAgICAiJXM6IFRvbyBtYW55IGZpbHRlciB0eXBlcyIsCisJCQkJCSAgICBfX2Z1bmNfXyk7CisJCQkJZ290byBiYWQ0OworCQkJfQorCQkJZnQgPSBkZnMtPmRmc19yYWRhcmZbZGZzLT5kZnNfcmluZm8ucm5fbnVtcmFkYXJzXTsKKwkJCWZ0LT5mdF9udW1maWx0ZXJzID0gMDsKKwkJCWZ0LT5mdF9udW1wdWxzZXMgPSBkZnNfcmFkYXJzW3BdLnJwX251bXB1bHNlczsKKwkJCWZ0LT5mdF9wYXR0ZXJudHlwZSA9IGRmc19yYWRhcnNbcF0ucnBfcGF0dGVybnR5cGU7CisJCQlmdC0+ZnRfbWluZHVyID0gZGZzX3JhZGFyc1twXS5ycF9taW5kdXI7CisJCQlmdC0+ZnRfbWF4ZHVyID0gZGZzX3JhZGFyc1twXS5ycF9tYXhkdXI7CisJCQlmdC0+ZnRfZmlsdGVyZHVyID0gZGZzX3JhZGFyc1twXS5ycF9wdWxzZWR1cjsKKwkJCWZ0LT5mdF9yc3NpdGhyZXNoID0gZGZzX3JhZGFyc1twXS5ycF9yc3NpdGhyZXNoOworCQkJZnQtPmZ0X3Jzc2ltYXJnaW4gPSBkZnNfcmFkYXJzW3BdLnJwX3Jzc2ltYXJnaW47CisJCQlmdC0+ZnRfbWlucHJpID0gMTAwMDAwMDsKKworCQkJaWYgKGZ0LT5mdF9yc3NpdGhyZXNoIDwgbWluX3Jzc2l0aHJlc2gpCisJCQkJbWluX3Jzc2l0aHJlc2ggPSBmdC0+ZnRfcnNzaXRocmVzaDsKKwkJCWlmIChmdC0+ZnRfbWF4ZHVyID4gbWF4X3B1bHNlZHVyKQorCQkJCW1heF9wdWxzZWR1ciA9IGZ0LT5mdF9tYXhkdXI7CisJCQlmb3IgKGkgPSBmdC0+ZnRfbWluZHVyOyBpIDw9IGZ0LT5mdF9tYXhkdXI7IGkrKykgeworCQkJCXVpbnQzMl90IHN0b3AgPSAwLCB0YWJsZWluZGV4ID0gMDsKKwkJCQl3aGlsZSAoKHRhYmxlaW5kZXggPCBERlNfTUFYX1JBREFSX09WRVJMQVApCisJCQkJICAgICAgICYmICghc3RvcCkpIHsKKwkJCQkJaWYgKChkZnMtPgorCQkJCQkgICAgIGRmc19yYWRhcnRhYmxlW2ldKVt0YWJsZWluZGV4XSA9PQorCQkJCQkgICAgLTEpCisJCQkJCQlzdG9wID0gMTsKKwkJCQkJZWxzZQorCQkJCQkJdGFibGVpbmRleCsrOworCQkJCX0KKwkJCQlpZiAoc3RvcCkgeworCQkJCQkoZGZzLT5kZnNfcmFkYXJ0YWJsZVtpXSlbdGFibGVpbmRleF0gPQorCQkJCQkJKGludDhfdCkgKGRmcy0+ZGZzX3JpbmZvLgorCQkJCQkJCSAgcm5fbnVtcmFkYXJzKTsKKwkJCQl9IGVsc2UgeworCQkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsCisJCQkJCQkgICAgIiVzOiBUb28gbWFueSBvdmVybGFwcGluZyByYWRhciBmaWx0ZXJzIiwKKwkJCQkJCSAgICBfX2Z1bmNfXyk7CisJCQkJCWdvdG8gYmFkNDsKKwkJCQl9CisJCQl9CisJCQlkZnMtPmRmc19yaW5mby5ybl9udW1yYWRhcnMrKzsKKwkJfQorCQlyZiA9ICYoZnQtPmZ0X2ZpbHRlcnNbZnQtPmZ0X251bWZpbHRlcnMrK10pOworCQlkZnNfcmVzZXRfZGVsYXlsaW5lKCZyZi0+cmZfZGwpOworCQludW1wdWxzZXMgPSBkZnNfcmFkYXJzW3BdLnJwX251bXB1bHNlczsKKworCQlyZi0+cmZfbnVtcHVsc2VzID0gbnVtcHVsc2VzOworCQlyZi0+cmZfcGF0dGVybnR5cGUgPSBkZnNfcmFkYXJzW3BdLnJwX3BhdHRlcm50eXBlOworCQlyZi0+cmZfcHVsc2VpZCA9IGRmc19yYWRhcnNbcF0ucnBfcHVsc2VpZDsKKwkJcmYtPnJmX21pbmR1ciA9IGRmc19yYWRhcnNbcF0ucnBfbWluZHVyOworCQlyZi0+cmZfbWF4ZHVyID0gZGZzX3JhZGFyc1twXS5ycF9tYXhkdXI7CisJCXJmLT5yZl9udW1wdWxzZXMgPSBkZnNfcmFkYXJzW3BdLnJwX251bXB1bHNlczsKKwkJcmYtPnJmX2lnbm9yZV9wcmlfd2luZG93ID0gZGZzX3JhZGFyc1twXS5ycF9pZ25vcmVfcHJpX3dpbmRvdzsKKwkJVCA9ICgxMDAwMDAwMDAgLyBkZnNfcmFkYXJzW3BdLnJwX21heF9wdWxzZWZyZXEpIC0KKwkJICAgIDEwMCAqIChkZnNfcmFkYXJzW3BdLnJwX21lYW5vZmZzZXQpOworCQlyZi0+cmZfbWlucHJpID0KKwkJCWRmc19yb3VuZCgoaW50MzJfdCkgVCAtCisJCQkJICAoMTAwICogKGRmc19yYWRhcnNbcF0ucnBfcHVsc2V2YXIpKSk7CisJCVRtYXggPQorCQkJKDEwMDAwMDAwMCAvIGRmc19yYWRhcnNbcF0ucnBfcHVsc2VmcmVxKSAtCisJCQkxMDAgKiAoZGZzX3JhZGFyc1twXS5ycF9tZWFub2Zmc2V0KTsKKwkJcmYtPnJmX21heHByaSA9CisJCQlkZnNfcm91bmQoKGludDMyX3QpIFRtYXggKworCQkJCSAgKDEwMCAqIChkZnNfcmFkYXJzW3BdLnJwX3B1bHNldmFyKSkpOworCisJCWlmIChyZi0+cmZfbWlucHJpIDwgZnQtPmZ0X21pbnByaSkKKwkJCWZ0LT5mdF9taW5wcmkgPSByZi0+cmZfbWlucHJpOworCisJCXJmLT5yZl9maXhlZF9wcmlfcmFkYXJfcHVsc2UgPQorCQkJKGRmc19yYWRhcnNbcF0ucnBfbWF4X3B1bHNlZnJlcSA9PQorCQkJIGRmc19yYWRhcnNbcF0ucnBfcHVsc2VmcmVxKSA/IDEgOiAwOworCQlyZi0+cmZfdGhyZXNob2xkID0gZGZzX3JhZGFyc1twXS5ycF90aHJlc2hvbGQ7CisJCXJmLT5yZl9maWx0ZXJsZW4gPSByZi0+cmZfbWF4cHJpICogcmYtPnJmX251bXB1bHNlczsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXNbJWRdOiBtaW5wcmYgPSAlZCBtYXhwcmYgPSAlZCBwdWxzZXZhciA9ICVkIHRocmVzaD0lZCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgZGZzX3JhZGFyc1twXS5ycF9wdWxzZWZyZXEsCisJCQkgIGRmc19yYWRhcnNbcF0ucnBfbWF4X3B1bHNlZnJlcSwKKwkJCSAgZGZzX3JhZGFyc1twXS5ycF9wdWxzZXZhciwgcmYtPnJmX3RocmVzaG9sZCk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlc1slZF06bWlucHJpID0gJWQgbWF4cHJpID0gJWQgZmlsdGVybGVuID0gJWQgZmlsdGVySUQgPSAlZCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgcmYtPnJmX21pbnByaSwgcmYtPnJmX21heHByaSwKKwkJCSAgcmYtPnJmX2ZpbHRlcmxlbiwgcmYtPnJmX3B1bHNlaWQpOworCisJfQorCisjaWZkZWYgREZTX0RFQlVHCisJZGZzX3ByaW50X2ZpbHRlcnMoaWMpOworI2VuZGlmCisJZGZzLT5kZnNfcmluZm8ucm5fbnVtYmluNXJhZGFycyA9IG51bWI1cmFkYXJzOworCWlmIChkZnMtPmRmc19iNXJhZGFycyAhPSBOVUxMKQorCQlPU19GUkVFKGRmcy0+ZGZzX2I1cmFkYXJzKTsKKworCWRmcy0+ZGZzX2I1cmFkYXJzID0gKHN0cnVjdCBkZnNfYmluNXJhZGFycyAqKW9zX21hbGxvYyhOVUxMLAorCQkJCQkJCSAgICAgICBudW1iNXJhZGFycyAqCisJCQkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkJICAgICAgZGZzX2JpbjVyYWRhcnMpLAorCQkJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoZGZzLT5kZnNfYjVyYWRhcnMgPT0gTlVMTCkgeworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsCisJCQkgICAgIiVzOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBiaW41IHJhZGFycyIsCisJCQkgICAgX19mdW5jX18pOworCQlnb3RvIGJhZDQ7CisJfQorCWZvciAobiA9IDA7IG4gPCBudW1iNXJhZGFyczsgbisrKSB7CisJCWRmcy0+ZGZzX2I1cmFkYXJzW25dLmJyX3B1bHNlID0gYjVwdWxzZXNbbl07CisJCWRmcy0+ZGZzX2I1cmFkYXJzW25dLmJyX3B1bHNlLmI1X3RpbWV3aW5kb3cgKj0gMTAwMDAwMDsKKwkJaWYgKGRmcy0+ZGZzX2I1cmFkYXJzW25dLmJyX3B1bHNlLmI1X3Jzc2l0aHJlc2ggPAorCQkgICAgbWluX3Jzc2l0aHJlc2gpCisJCQltaW5fcnNzaXRocmVzaCA9CisJCQkJZGZzLT5kZnNfYjVyYWRhcnNbbl0uYnJfcHVsc2UuYjVfcnNzaXRocmVzaDsKKwkJaWYgKGRmcy0+ZGZzX2I1cmFkYXJzW25dLmJyX3B1bHNlLmI1X21heGR1ciA+IG1heF9wdWxzZWR1cikKKwkJCW1heF9wdWxzZWR1ciA9IGRmcy0+ZGZzX2I1cmFkYXJzW25dLmJyX3B1bHNlLmI1X21heGR1cjsKKwl9CisJZGZzX3Jlc2V0X2FsbGRlbGF5bGluZXMoZGZzKTsKKwlkZnNfcmVzZXRfcmFkYXJxKGRmcyk7CisJZGZzLT5kZnNfY3VyY2hhbl9yYWRpbmRleCA9IC0xOworCWRmcy0+ZGZzX2V4dGNoYW5fcmFkaW5kZXggPSAtMTsKKwlkZnMtPmRmc19yaW5mby5ybl9taW5yc3NpdGhyZXNoID0gbWluX3Jzc2l0aHJlc2g7CisJLyogQ29udmVydCBkdXJhdGlvbnMgdG8gVFNGIHRpY2tzICovCisJZGZzLT5kZnNfcmluZm8ucm5fbWF4cHVsc2VkdXIgPQorCQlkZnNfcm91bmQoKGludDMyX3QpICgobWF4X3B1bHNlZHVyICogMTAwIC8gODApICogMTAwKSk7CisJLyogcmVsYXggdGhlIG1heCBwdWxzZSBkdXJhdGlvbiBhIGxpdHRsZSBiaXQgZHVlIHRvIGluYWNjdXJhY3kgY2F1c2VkIGJ5IGNoaXJwaW5nLiAqLworCWRmcy0+ZGZzX3JpbmZvLnJuX21heHB1bHNlZHVyID0gZGZzLT5kZnNfcmluZm8ucm5fbWF4cHVsc2VkdXIgKyAyMDsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlc1slZF06IERGUyBtaW4gZmlsdGVyIHJzc2lUaHJlc2ggPSAlZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCBtaW5fcnNzaXRocmVzaCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXNbJWRdOkRGUyBtYXggcHVsc2UgZHVyID0gJWQgdGlja3MiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgZGZzLT5kZnNfcmluZm8ucm5fbWF4cHVsc2VkdXIpOworCXJldHVybiBERlNfU1RBVFVTX1NVQ0NFU1M7CisKK2JhZDQ6CisJcmV0dXJuIERGU19TVEFUVVNfRkFJTDsKK30KKwordm9pZCBkZnNfY2xlYXJfc3RhdHMoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpCit7CisJc3RydWN0IGF0aF9kZnMgKmRmcyA9IChzdHJ1Y3QgYXRoX2RmcyAqKWljLT5pY19kZnM7CisJaWYgKGRmcyA9PSBOVUxMKQorCQlyZXR1cm47CisJT1NfTUVNWkVSTygmZGZzLT5hdGhfZGZzX3N0YXRzLCBzaXplb2Yoc3RydWN0IGRmc19zdGF0cykpOworCWRmcy0+YXRoX2Rmc19zdGF0cy5sYXN0X3Jlc2V0X3RzdGFtcCA9IGljLT5pY19nZXRfVFNGNjQoaWMpOworfQorCisjZW5kaWYgLyogQVRIX1NVUFBPUlRfREZTICovCmRpZmYgLS1naXQgYS9jb3JlL3NhcC9kZnMvc3JjL2Rmc19pb2N0bC5oIGIvY29yZS9zYXAvZGZzL3NyYy9kZnNfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU2YzBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zYXAvZGZzL3NyYy9kZnNfaW9jdGwuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkJCWRmc19pb2N0bC5oCisKKyAgIE9WRVJWSUVXOgorCisgICBTb3VyY2UgY29kZSBib3Jyb3dlZCBmcm9tIFFDQV9NQUlOIERGUyBtb2R1bGUKKworICAgREVQRU5ERU5DSUVTOgorCisgICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIGlvY3RsIGRlZmluZXMKKyAqLworCisjaWZuZGVmIF9ERlNfSU9DVExfSF8KKyNkZWZpbmUgX0RGU19JT0NUTF9IXworCisjZGVmaW5lICBERlNfTVVURV9USU1FICAgICAxCisjZGVmaW5lICBERlNfU0VUX1RIUkVTSCAgICAyCisjZGVmaW5lICBERlNfR0VUX1RIUkVTSCAgICAzCisjZGVmaW5lICBERlNfR0VUX1VTRU5PTCAgICA0CisjZGVmaW5lIERGU19TRVRfVVNFTk9MICAgICA1CisjZGVmaW5lIERGU19SQURBUkRFVEVDVFMgICA2CisjZGVmaW5lICBERlNfQkFOR1JBREFSICAgICA3CisjZGVmaW5lICBERlNfU0hPV19OT0wgICAgICA4CisjZGVmaW5lICBERlNfRElTQUJMRV9ERVRFQ1QgICA5CisjZGVmaW5lICBERlNfRU5BQkxFX0RFVEVDVCAxMAorI2RlZmluZSAgREZTX0RJU0FCTEVfRkZUICAgICAgICAgICAxMQorI2RlZmluZSAgREZTX0VOQUJMRV9GRlQgICAgMTIKKyNkZWZpbmUgIERGU19TRVRfREVCVUdfTEVWRUwgICAgIDEzCisjZGVmaW5lIERGU19HRVRfTk9MICAgICAxNAorI2RlZmluZSBERlNfU0VUX05PTCAgICAgMTUKKworI2RlZmluZSBERlNfU0VUX0ZBTFNFX1JTU0lfVEhSRVMgMTYKKyNkZWZpbmUgREZTX1NFVF9QRUFLX01BRyAgICAgICAgIDE3CisjZGVmaW5lIERGU19JR05PUkVfQ0FDICAgICAxOAorI2RlZmluZSBERlNfU0VUX05PTF9USU1FT1VUICAgICAgMTkKKyNkZWZpbmUgIERGU19MQVNUX0lPQ1RMICAgIDIwCisjaWZuZGVmIElFRUU4MDIxMV9DSEFOX01BWAorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9NQVggMjU1CisjZW5kaWYKKworc3RydWN0IGRmc3JlcV9ub2xlbGVtIHsKKwl1aW50MTZfdCBub2xfZnJlcTsgICAgICAvKiBOT0wgY2hhbm5lbCBmcmVxdWVuY3kgKi8KKwl1aW50MTZfdCBub2xfY2h3aWR0aDsKKwl1bnNpZ25lZCBsb25nIG5vbF9zdGFydF90aWNrczsgIC8qIE9TIHRpY2tzIHdoZW4gdGhlIE5PTCB0aW1lciBzdGFydGVkICovCisJdWludDMyX3Qgbm9sX3RpbWVvdXRfbXM7ICAgICAgICAvKiBOb2wgdGltZW91dCB2YWx1ZSBpbiBtc2VjICovCit9OworCitzdHJ1Y3QgZGZzcmVxX25vbGluZm8geworCXVpbnQzMl90IGljX25jaGFuczsKKwlzdHJ1Y3QgZGZzcmVxX25vbGVsZW0gZGZzX25vbFtJRUVFODAyMTFfQ0hBTl9NQVhdOworfTsKKworLyoKKyAqIGlvY3RsIHBhcmFtZXRlciB0eXBlcworICovCisKKyNkZWZpbmUgIERGU19QQVJBTV9GSVJQV1IgIDEKKyNkZWZpbmUgIERGU19QQVJBTV9SUlNTSSAgICAgIDIKKyNkZWZpbmUgIERGU19QQVJBTV9IRUlHSFQgIDMKKyNkZWZpbmUgIERGU19QQVJBTV9QUlNTSSAgICAgIDQKKyNkZWZpbmUgIERGU19QQVJBTV9JTkJBTkQgIDUKKy8qIDU0MTMgc3BlY2lmaWMgcGFyYW1ldGVycyAqLworI2RlZmluZSBERlNfUEFSQU1fUkVMUFdSICAgICAgICA3CisjZGVmaW5lIERGU19QQVJBTV9SRUxTVEVQICAgICAgIDgKKyNkZWZpbmUgREZTX1BBUkFNX01BWExFTiAgICAgICAgOQorCitzdHJ1Y3QgZGZzX2lvY3RsX3BhcmFtcyB7CisJaW50MzJfdCBkZnNfZmlycHdyOyAgICAgLyogRklSIHB3ciBvdXQgdGhyZXNob2xkICovCisJaW50MzJfdCBkZnNfcnJzc2k7ICAgICAgLyogUmFkYXIgcnNzaSB0aHJlc2ggKi8KKwlpbnQzMl90IGRmc19oZWlnaHQ7ICAgICAvKiBQdWxzZSBoZWlnaHQgdGhyZXNoICovCisJaW50MzJfdCBkZnNfcHJzc2k7ICAgICAgLyogUHVsc2UgcnNzaSB0aHJlc2ggKi8KKwlpbnQzMl90IGRmc19pbmJhbmQ7ICAgICAvKiBJbmJhbmQgdGhyZXNoICovCisJaW50MzJfdCBkZnNfcmVscHdyOyAgICAgLyogcHVsc2UgcmVsYXRpdmUgcHdyIHRocmVzaCAqLworCWludDMyX3QgZGZzX3JlbHN0ZXA7ICAgIC8qIHB1bHNlIHJlbGF0aXZlIHN0ZXAgdGhyZXNoICovCisJaW50MzJfdCBkZnNfbWF4bGVuOyAgICAgLyogcHVsc2UgbWF4IGR1cmF0aW9uICovCit9OworCisvKgorICogWFhYIGtlZXAgdGhlc2UgaW4gc3luYyB3aXRoIGF0aF9kZnNfcGh5ZXJyX3BhcmFtIQorICovCisjZGVmaW5lICBERlNfSU9DVExfUEFSQU1fTk9WQUwgICA2NTUzNQorI2RlZmluZSAgREZTX0lPQ1RMX1BBUkFNX0VOQUJMRSAgMHg4MDAwCisKKyNlbmRpZiAvKiBfREZTX0lPQ1RMX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL3NhcC9kZnMvc3JjL2Rmc19pb2N0bF9wcml2YXRlLmggYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19pb2N0bF9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyNjhiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2FwL2Rmcy9zcmMvZGZzX2lvY3RsX3ByaXZhdGUuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkJCWRmc19pb2N0bF9wcml2YXRlLmgKKworICAgT1ZFUlZJRVc6CisKKyAgIFNvdXJjZSBjb2RlIGJvcnJvd2VkIGZyb20gUUNBX01BSU4gREZTIG1vZHVsZQorCisgICBERVBFTkRFTkNJRVM6CisKKyAgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogaW9jdGwgZGVmaW5lcworICovCisKKyNpZm5kZWYgX0RGU19JT0NUTF9QUklWQVRFX0hfCisjZGVmaW5lIF9ERlNfSU9DVExfUFJJVkFURV9IXworCisvKgorICogQXNzZXJ0IHRoYXQgdGhlIE5PVkFMIHZhbHVlcyBtYXRjaC4KKyAqLworI2lmIChBVEhfREZTX1BIWUVSUl9QQVJBTV9OT1ZBTCAhPSBERlNfSU9DVExfUEFSQU1fTk9WQUwpCisjZXJyb3IgIkFUSF9ERlNfUEhZRVJSX1BBUkFNX05PVkFMICE9IERGU19JT0NUTF9QQVJBTV9OT1ZBTCIKKyNlbmRpZgorCisvKgorICogQXNzZXJ0IHRoYXQgdGhlIEVOQUJMRSB2YWx1ZXMgbWF0Y2guCisgKi8KKyNpZiAoQVRIX0RGU19QSFlFUlJfUEFSQU1fRU5BQkxFICE9IERGU19JT0NUTF9QQVJBTV9FTkFCTEUpCisjZXJyb3IgIkFUSF9ERlNfUEhZRVJSX1BBUkFNX0VOQUJMRSAhPSBERlNfSU9DVExfUEFSQU1fRU5BQkxFIgorI2VuZGlmCisKKy8qCisgKiBUaGVzZSB0d28gbWV0aG9kcyBhcmUgdXNlZCBieSB0aGUgbG1hYyBnbHVlIHRvIGNvcHkgYmV0d2VlbgorICogdGhlIERGUyBhbmQgSEFMIFBIWSBjb25maWd1cmF0aW9uLgorICoKKyAqIEknbSAiY2hlYXRpbmciIGhlcmUgYW5kIGFzc3VtaW5nIHRoYXQgdGhlIEVOQUJMRSBhbmQgTk9WQUwKKyAqIHZhbHVlcyBtYXRjaCAtIHNlZSB0aGUgYWJvdmUgbWFjcm9zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2F0aF9kZnNfaW9jdGxwYXJhbV90b19kZnNwYXJhbShjb25zdCBzdHJ1Y3QgZGZzX2lvY3RsX3BhcmFtcyAqc3JjLAorCQkJICAgICAgIHN0cnVjdCBhdGhfZGZzX3BoeWVycl9wYXJhbSAqZHN0KQoreworCisJZHN0LT5wZV9maXJwd3IgPSBzcmMtPmRmc19maXJwd3I7CisJZHN0LT5wZV9ycnNzaSA9IHNyYy0+ZGZzX3Jyc3NpOworCWRzdC0+cGVfaGVpZ2h0ID0gc3JjLT5kZnNfaGVpZ2h0OworCWRzdC0+cGVfcHJzc2kgPSBzcmMtPmRmc19wcnNzaTsKKwlkc3QtPnBlX2luYmFuZCA9IHNyYy0+ZGZzX2luYmFuZDsKKwlkc3QtPnBlX3JlbHB3ciA9IHNyYy0+ZGZzX3JlbHB3cjsKKwlkc3QtPnBlX3JlbHN0ZXAgPSBzcmMtPmRmc19yZWxzdGVwOworCWRzdC0+cGVfbWF4bGVuID0gc3JjLT5kZnNfbWF4bGVuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2F0aF9kZnNfZGZzcGFyYW1fdG9faW9jdGxwYXJhbShzdHJ1Y3QgYXRoX2Rmc19waHllcnJfcGFyYW0gKnNyYywKKwkJCSAgICAgICBzdHJ1Y3QgZGZzX2lvY3RsX3BhcmFtcyAqZHN0KQoreworCisJZHN0LT5kZnNfZmlycHdyID0gc3JjLT5wZV9maXJwd3I7CisJZHN0LT5kZnNfcnJzc2kgPSBzcmMtPnBlX3Jyc3NpOworCWRzdC0+ZGZzX2hlaWdodCA9IHNyYy0+cGVfaGVpZ2h0OworCWRzdC0+ZGZzX3Byc3NpID0gc3JjLT5wZV9wcnNzaTsKKwlkc3QtPmRmc19pbmJhbmQgPSBzcmMtPnBlX2luYmFuZDsKKwlkc3QtPmRmc19yZWxwd3IgPSBzcmMtPnBlX3JlbHB3cjsKKwlkc3QtPmRmc19yZWxzdGVwID0gc3JjLT5wZV9yZWxzdGVwOworCWRzdC0+ZGZzX21heGxlbiA9IHNyYy0+cGVfbWF4bGVuOworfQorCisjZW5kaWYgLyogX0RGU19JT0NUTF9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL3NhcC9kZnMvc3JjL2Rmc19taXNjLmMgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmNGEyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2FwL2Rmcy9zcmMvZGZzX21pc2MuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgZGZzX21pc2MuYworCisgICBPVkVSVklFVzoKKworICAgU291cmNlIGNvZGUgYm9ycm93ZWQgZnJvbSBRQ0FfTUFJTiBERlMgbW9kdWxlCisKKyAgIERFUEVOREVOQ0lFUzoKKworICAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisgICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKyAgIC0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJkZnMuaCIKKy8qIFRPIERPIERGUworICAgI2luY2x1ZGUgPGllZWU4MDIxMV92YXIuaD4KKyAqLworI2lmbmRlZiBVTklORVQKKy8qIFRPIERPIERGUworICAgI2luY2x1ZGUgPGllZWU4MDIxMV9jaGFubmVsLmg+CisgKi8KKyNlbmRpZgorI2lmZGVmIEFUSF9TVVBQT1JUX0RGUworCitzdGF0aWMgaW50IGFkanVzdF9wcmlfcGVyX2NoYW5fYnVzeShpbnQgZXh0X2NoYW5fYnVzeSwgaW50IHByaV9tYXJnaW4pCit7CisJaW50IGFkanVzdF9wcmkgPSAwOworCisJaWYgKGV4dF9jaGFuX2J1c3kgPiBERlNfRVhUX0NIQU5fTE9BRElOR19USFJFU0gpIHsKKworCQlhZGp1c3RfcHJpID0KKwkJCShleHRfY2hhbl9idXN5IC0KKwkJCSBERlNfRVhUX0NIQU5fTE9BRElOR19USFJFU0gpICogKHByaV9tYXJnaW4pOworCQlhZGp1c3RfcHJpIC89IDEwMDsKKworCX0KKwlyZXR1cm4gYWRqdXN0X3ByaTsKK30KKworc3RhdGljIGludCBhZGp1c3RfdGhyZXNoX3Blcl9jaGFuX2J1c3koaW50IGV4dF9jaGFuX2J1c3ksIGludCB0aHJlc2gpCit7CisJaW50IGFkanVzdF90aHJlc2ggPSAwOworCisJaWYgKGV4dF9jaGFuX2J1c3kgPiBERlNfRVhUX0NIQU5fTE9BRElOR19USFJFU0gpIHsKKworCQlhZGp1c3RfdGhyZXNoID0KKwkJCShleHRfY2hhbl9idXN5IC0gREZTX0VYVF9DSEFOX0xPQURJTkdfVEhSRVNIKSAqIHRocmVzaDsKKwkJYWRqdXN0X3RocmVzaCAvPSAxMDA7CisKKwl9CisJcmV0dXJuIGFkanVzdF90aHJlc2g7Cit9CisKKy8qIEZvciB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwsIGlmIGxlZ2FjeSB0cmFmZmljIGlzIHByZXNlbnQsIHdlIHNlZSBhIGxvdCBvZiBmYWxzZSBhbGFybXMsCisgICBzbyBtYWtlIHRoZSBQUkkgbWFyZ2luIG5hcnJvd2VyIGRlcGVuZGluZyBvbiB0aGUgYnVzeSAlIGZvciB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwuKi8KKworaW50CitkZnNfZ2V0X3ByaV9tYXJnaW4oc3RydWN0IGF0aF9kZnMgKmRmcywgaW50IGlzX2V4dGNoYW5fZGV0ZWN0LAorCQkgICBpbnQgaXNfZml4ZWRfcGF0dGVybikKK3sKKworCWludCBhZGp1c3RfcHJpID0gMCwgZXh0X2NoYW5fYnVzeSA9IDA7CisJaW50IHByaV9tYXJnaW47CisKKwlpZiAoaXNfZml4ZWRfcGF0dGVybikKKwkJcHJpX21hcmdpbiA9IERGU19ERUZBVUxUX0ZJWEVEUEFUVEVSTl9QUklfTUFSR0lOOworCWVsc2UKKwkJcHJpX21hcmdpbiA9IERGU19ERUZBVUxUX1BSSV9NQVJHSU47CisKKwlpZiAoSVNfQ0hBTl9IVDQwKGRmcy0+aWMtPmljX2N1cmNoYW4pKSB7CisJCWV4dF9jaGFuX2J1c3kgPSBkZnMtPmljLT5pY19nZXRfZXh0X2J1c3koZGZzLT5pYyk7CisJCWlmIChleHRfY2hhbl9idXN5ID49IDApIHsKKwkJCWRmcy0+ZGZzX3JpbmZvLmV4dF9jaGFuX2J1c3lfdHMgPQorCQkJCWRmcy0+aWMtPmljX2dldF9UU0Y2NChkZnMtPmljKTsKKwkJCWRmcy0+ZGZzX3JpbmZvLmRmc19leHRfY2hhbl9idXN5ID0gZXh0X2NoYW5fYnVzeTsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgY2FjaGVkIHZhbHVlIG9mIGV4dF9jaGFuX2J1c3kgY2FuIGJlIHVzZWQgKi8KKwkJCWV4dF9jaGFuX2J1c3kgPSAwOworCQkJaWYgKGRmcy0+ZGZzX3JpbmZvLmRmc19leHRfY2hhbl9idXN5KSB7CisJCQkJaWYgKGRmcy0+ZGZzX3JpbmZvLnJuX2xhc3RmdWxsX3RzIDwKKwkJCQkgICAgZGZzLT5kZnNfcmluZm8uZXh0X2NoYW5fYnVzeV90cykgeworCQkJCQlleHRfY2hhbl9idXN5ID0KKwkJCQkJCWRmcy0+ZGZzX3JpbmZvLmRmc19leHRfY2hhbl9idXN5OworCQkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMyLAorCQkJCQkJICAgICIgUFJJIFVzZSBjYWNoZWQgY29weSBvZiBleHRfY2hhbl9idXN5IGV4dGNoYW5idXN5PSVkIFxuIiwKKwkJCQkJCSAgICBleHRfY2hhbl9idXN5KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYWRqdXN0X3ByaSA9CisJCQlhZGp1c3RfcHJpX3Blcl9jaGFuX2J1c3koZXh0X2NoYW5fYnVzeSwgcHJpX21hcmdpbik7CisKKwkJcHJpX21hcmdpbiAtPSBhZGp1c3RfcHJpOworCX0KKwlyZXR1cm4gcHJpX21hcmdpbjsKK30KKworLyogRm9yIHRoZSBleHRlbnNpb24gY2hhbm5lbCwgaWYgbGVnYWN5IHRyYWZmaWMgaXMgcHJlc2VudCwgd2Ugc2VlIGEgbG90IG9mIGZhbHNlIGFsYXJtcywKKyAgIHNvIG1ha2UgdGhlIHRocmVzaG9sZHMgaGlnaGVyIGRlcGVuZGluZyBvbiB0aGUgYnVzeSAlIGZvciB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwuKi8KKworaW50IGRmc19nZXRfZmlsdGVyX3RocmVzaG9sZChzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzX2ZpbHRlciAqcmYsCisJCQkgICAgIGludCBpc19leHRjaGFuX2RldGVjdCkKK3sKKwlpbnQgZXh0X2NoYW5fYnVzeSA9IDA7CisJaW50IHRocmVzaCwgYWRqdXN0X3RocmVzaCA9IDA7CisKKwl0aHJlc2ggPSByZi0+cmZfdGhyZXNob2xkOworCisJaWYgKElTX0NIQU5fSFQ0MChkZnMtPmljLT5pY19jdXJjaGFuKSkgeworCQlleHRfY2hhbl9idXN5ID0gZGZzLT5pYy0+aWNfZ2V0X2V4dF9idXN5KGRmcy0+aWMpOworCQlpZiAoZXh0X2NoYW5fYnVzeSA+PSAwKSB7CisJCQlkZnMtPmRmc19yaW5mby5leHRfY2hhbl9idXN5X3RzID0KKwkJCQlkZnMtPmljLT5pY19nZXRfVFNGNjQoZGZzLT5pYyk7CisJCQlkZnMtPmRmc19yaW5mby5kZnNfZXh0X2NoYW5fYnVzeSA9IGV4dF9jaGFuX2J1c3k7CisJCX0gZWxzZSB7CisJCQkvKiBDaGVjayB0byBzZWUgaWYgdGhlIGNhY2hlZCB2YWx1ZSBvZiBleHRfY2hhbl9idXN5IGNhbiBiZSB1c2VkICovCisJCQlleHRfY2hhbl9idXN5ID0gMDsKKwkJCWlmIChkZnMtPmRmc19yaW5mby5kZnNfZXh0X2NoYW5fYnVzeSkgeworCQkJCWlmIChkZnMtPmRmc19yaW5mby5ybl9sYXN0ZnVsbF90cyA8CisJCQkJICAgIGRmcy0+ZGZzX3JpbmZvLmV4dF9jaGFuX2J1c3lfdHMpIHsKKwkJCQkJZXh0X2NoYW5fYnVzeSA9CisJCQkJCQlkZnMtPmRmc19yaW5mby5kZnNfZXh0X2NoYW5fYnVzeTsKKwkJCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJCQkJCSAgICAiIFRIUkVTSCBVc2UgY2FjaGVkIGNvcHkgb2YgZXh0X2NoYW5fYnVzeSBleHRjaGFuYnVzeT0lZCBybl9sYXN0ZnVsbF90cz0lbGx1IGV4dF9jaGFuX2J1c3lfdHM9JWxsdVxuIiwKKwkJCQkJCSAgICBleHRfY2hhbl9idXN5LAorCQkJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGZzLT4KKwkJCQkJCSAgICBkZnNfcmluZm8ucm5fbGFzdGZ1bGxfdHMsCisJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZnMtPgorCQkJCQkJICAgIGRmc19yaW5mby5leHRfY2hhbl9idXN5X3RzKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlhZGp1c3RfdGhyZXNoID0KKwkJCWFkanVzdF90aHJlc2hfcGVyX2NoYW5fYnVzeShleHRfY2hhbl9idXN5LCB0aHJlc2gpOworCisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzIsCisJCQkgICAgIiBmaWx0ZXJJRD0lZCBleHRjaGFuYnVzeT0lZCBhZGp1c3RfdGhyZXNoPSVkXG4iLAorCQkJICAgIHJmLT5yZl9wdWxzZWlkLCBleHRfY2hhbl9idXN5LCBhZGp1c3RfdGhyZXNoKTsKKworCQl0aHJlc2ggKz0gYWRqdXN0X3RocmVzaDsKKwl9CisJcmV0dXJuIHRocmVzaDsKK30KKwordWludDMyX3QgZGZzX3JvdW5kKGludDMyX3QgdmFsKQoreworCXVpbnQzMl90IGl2YWwsIHJlbTsKKworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gMDsKKwlpdmFsID0gdmFsIC8gMTAwOworCXJlbSA9IHZhbCAtIChpdmFsICogMTAwKTsKKwlpZiAocmVtIDwgNTApCisJCXJldHVybiBpdmFsOworCWVsc2UKKwkJcmV0dXJuIChpdmFsICsgMSk7Cit9CisKK3N0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqaWVlZTgwMjExX2dldF9leHRjaGFuKHN0cnVjdCBpZWVlODAyMTFjb20gKmljKQoreworCWludCBjaGFuX29mZnNldCA9IDA7CisJaWYgKElFRUU4MDIxMV9JU19DSEFOX0hUNDBQTFVTX0NBUEFCTEUoaWMtPmljX2N1cmNoYW4pKSB7CisJCWNoYW5fb2Zmc2V0ID0gMjA7CisJfSBlbHNlIGlmIChJRUVFODAyMTFfSVNfQ0hBTl9IVDQwTUlOVVNfQ0FQQUJMRShpYy0+aWNfY3VyY2hhbikpIHsKKwkJY2hhbl9vZmZzZXQgPSAtMjA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAoaWMtPgorCQlpY19maW5kX2NoYW5uZWwoaWMsIGljLT5pY19jdXJjaGFuLT5pY19mcmVxICsgY2hhbl9vZmZzZXQsCisJCQkJSUVFRTgwMjExX0NIQU5fMTFOQV9IVDIwKSk7Cit9CisKKy8qCisgKiBGaW5kcyB0aGUgcmFkYXIgc3RhdGUgZW50cnkgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IGNoYW5uZWwKKyAqLworc3RydWN0IGRmc19zdGF0ZSAqZGZzX2dldGNoYW5zdGF0ZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCB1aW50OF90ICppbmRleCwKKwkJCQkgICBpbnQgZXh0X2NoYW5fZmxhZykKK3sKKwlzdHJ1Y3QgZGZzX3N0YXRlICpycyA9IE5VTEw7CisJaW50IGk7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjbXBfY2g7CisKKwlpZiAoZGZzID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlc1slZF06IHNjX2RmcyBpcyBOVUxMXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQkvKiBERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsIiVzOiBzY19kZnMgaXMgTlVMTFxuIixfX2Z1bmNfXyk7ICovCisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChleHRfY2hhbl9mbGFnKSB7CisJCWNtcF9jaCA9IGllZWU4MDIxMV9nZXRfZXh0Y2hhbihkZnMtPmljKTsKKwkJaWYgKGNtcF9jaCkgeworCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJCQkgICAgIkV4dGVuc2lvbiBjaGFubmVsIGZyZXEgPSAldSBmbGFncz0weCV4XG4iLAorCQkJCSAgICBjbXBfY2gtPmljX2ZyZXEsIGNtcF9jaC0+aWNfZmxhZ2V4dCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJfSBlbHNlIHsKKwkJY21wX2NoID0gZGZzLT5pYy0+aWNfY3VyY2hhbjsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJCSAgICAiUHJpbWFyeSBjaGFubmVsIGZyZXEgPSAldSBmbGFncz0weCV4XG4iLAorCQkJICAgIGNtcF9jaC0+aWNfZnJlcSwgY21wX2NoLT5pY19mbGFnZXh0KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IERGU19OVU1fUkFEQVJfU1RBVEVTOyBpKyspIHsKKwkJaWYgKChkZnMtPmRmc19yYWRhcltpXS5yc19jaGFuLmljX2ZyZXEgPT0gY21wX2NoLT5pY19mcmVxKSAmJgorCQkgICAgKGRmcy0+ZGZzX3JhZGFyW2ldLnJzX2NoYW4uaWNfZmxhZ3MgPT0gY21wX2NoLT5pY19mbGFncykpIHsKKwkJCWlmIChpbmRleCAhPSBOVUxMKQorCQkJCSppbmRleCA9ICh1aW50OF90KSBpOworCQkJcmV0dXJuICYoZGZzLT5kZnNfcmFkYXJbaV0pOworCQl9CisJfQorCS8qIE5vIGV4aXN0aW5nIGNoYW5uZWwgZm91bmQsIGxvb2sgZm9yIGZpcnN0IGZyZWUgY2hhbm5lbCBzdGF0ZSBlbnRyeSAqLworCWZvciAoaSA9IDA7IGkgPCBERlNfTlVNX1JBREFSX1NUQVRFUzsgaSsrKSB7CisJCWlmIChkZnMtPmRmc19yYWRhcltpXS5yc19jaGFuLmljX2ZyZXEgPT0gMCkgeworCQkJcnMgPSAmKGRmcy0+ZGZzX3JhZGFyW2ldKTsKKwkJCS8qIEZvdW5kIG9uZSwgc2V0IGNoYW5uZWwgaW5mbyBhbmQgZGVmYXVsdCB0aHJlc2hvbGRzICovCisJCQlycy0+cnNfY2hhbiA9ICpjbXBfY2g7CisKKwkJCS8qIENvcHkgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgZGVmYXVsdCBzZXQgKi8KKwkJCWF0aF9kZnNfcGh5ZXJyX3BhcmFtX2NvcHkoJnJzLT5yc19wYXJhbSwKKwkJCQkJCSAgJmRmcy0+ZGZzX2RlZmF1bHRwYXJhbXMpOworCisJCQlpZiAoaW5kZXggIT0gTlVMTCkKKwkJCQkqaW5kZXggPSAodWludDhfdCkgaTsKKwkJCXJldHVybiAocnMpOworCQl9CisJfQorCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzIsICIlczogTm8gbW9yZSByYWRhciBzdGF0ZXMgbGVmdC5cbiIsCisJCSAgICBfX2Z1bmNfXyk7CisJcmV0dXJuIChOVUxMKTsKK30KKworI2VuZGlmIC8qIEFUSF9TVVBQT1JUX0RGUyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zYXAvZGZzL3NyYy9kZnNfbm9sLmMgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19ub2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTVlYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zYXAvZGZzL3NyYy9kZnNfbm9sLmMKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgIGRmc19ub2wuYworCisgICBPVkVSVklFVzoKKworICAgU291cmNlIGNvZGUgYm9ycm93ZWQgZnJvbSBRQ0FfTUFJTiBERlMgbW9kdWxlCisKKyAgIERFUEVOREVOQ0lFUzoKKworICAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisgICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKyAgIC0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJkZnMuaCIKKy8qIFRPIERPIERGUworICAgI2luY2x1ZGUgPGllZWU4MDIxMV92YXIuaD4KKyAqLworI2lmbmRlZiBVTklORVQKKy8qVE8gRE8gREZTCisgICAjaW5jbHVkZSA8aWVlZTgwMjExX2NoYW5uZWwuaD4KKyAqLworI2VuZGlmCisjaWYgZGVmaW5lZChBVEhfU1VQUE9SVF9ERlMpICYmICFkZWZpbmVkKEFUSF9ERlNfUkFEQVJfREVURUNUSU9OX09OTFkpCisjaW5jbHVkZSAiZGZzX2lvY3RsLmgiCisjaW5jbHVkZSAiZGZzX2lvY3RsX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjZGZfdGltZS5oIiAgICAgICAgICAgLyogY2RmX3RpbWVfdCwgY2RmX3N5c3RlbV90aW1lX2FmdGVyICovCisKK3N0YXRpYyB2b2lkCitkZnNfbm9sX2RlbGV0ZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCB1aW50MTZfdCBkZWxmcmVxLCB1aW50MTZfdCBkZWxjaHdpZHRoKTsKKworc3RhdGljIG9zX3RpbWVyX2Z1bmMoZGZzX3JlbW92ZV9mcm9tX25vbCkKK3sKKwlzdHJ1Y3QgZGZzX25vbF90aW1lcl9hcmcgKm5vbF9hcmc7CisJc3RydWN0IGF0aF9kZnMgKmRmczsKKwlzdHJ1Y3QgaWVlZTgwMjExY29tICppYzsKKwl1aW50MTZfdCBkZWxmcmVxOworCXVpbnQxNl90IGRlbGNod2lkdGg7CisKKwlPU19HRVRfVElNRVJfQVJHKG5vbF9hcmcsIHN0cnVjdCBkZnNfbm9sX3RpbWVyX2FyZyAqKTsKKworCWRmcyA9IG5vbF9hcmctPmRmczsKKwlpYyA9IGRmcy0+aWM7CisJZGVsZnJlcSA9IG5vbF9hcmctPmRlbGZyZXE7CisJZGVsY2h3aWR0aCA9IG5vbF9hcmctPmRlbGNod2lkdGg7CisKKwkvKiBPbmx5IG9wZXJhdGUgaW4gSE9TVEFQL0lCU1MgKi8KKwlpZiAoaWMtPmljX29wbW9kZSAhPSBJRUVFODAyMTFfTV9IT1NUQVAgJiYKKwkgICAgaWMtPmljX29wbW9kZSAhPSBJRUVFODAyMTFfTV9JQlNTKQorCQlnb3RvIGRvbmU7CisKKwkvKiBEZWxldGUgdGhlIGdpdmVuIE5PTCBlbnRyeSAqLworCWRmc19ub2xfZGVsZXRlKGRmcywgZGVsZnJlcSwgZGVsY2h3aWR0aCk7CisKKwkvKiBVcGRhdGUgdGhlIHdpcmVsZXNzIHN0YWNrIHdpdGggdGhlIG5ldyBOT0wgKi8KKwlkZnNfbm9sX3VwZGF0ZShkZnMpOworCitkb25lOgorCU9TX0ZSRUUobm9sX2FyZyk7CisJcmV0dXJuOworfQorCit2b2lkIGRmc19wcmludF9ub2woc3RydWN0IGF0aF9kZnMgKmRmcykKK3sKKwlzdHJ1Y3QgZGZzX25vbGVsZW0gKm5vbDsKKwl1aW50MzJfdCBkaWZmX21zLCByZW1haW5pbmdfc2VjOworCisJaWYgKGRmcyA9PSBOVUxMKSB7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19OT0wsICIlczogc2NfZGZzIGlzIE5VTEwiLAorCQkJICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlub2wgPSBkZnMtPmRmc19ub2w7CisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX05PTCwgIiVzOiBOT0wiLCBfX2Z1bmNfXyk7CisJd2hpbGUgKG5vbCAhPSBOVUxMKSB7CisJCWRpZmZfbXMgPQorCQkJY2RmX3N5c3RlbV90aWNrc190b19tc2VjcyhjZGZfc3lzdGVtX3RpY2tzKCkgLQorCQkJCQkJICBub2wtPm5vbF9zdGFydF90aWNrcyk7CisJCWRpZmZfbXMgPSAobm9sLT5ub2xfdGltZW91dF9tcyAtIGRpZmZfbXMpOworCQlyZW1haW5pbmdfc2VjID0gZGlmZl9tcyAvIDEwMDA7IC8qIGNvbnZlcnQgdG8gc2Vjb25kcyAqLworCQlub2wgPSBub2wtPm5vbF9uZXh0OworCX0KK30KKwordm9pZAorZGZzX2dldF9ub2woc3RydWN0IGF0aF9kZnMgKmRmcywgc3RydWN0IGRmc3JlcV9ub2xlbGVtICpkZnNfbm9sLCBpbnQgKm5jaGFuKQoreworCXN0cnVjdCBkZnNfbm9sZWxlbSAqbm9sOworCisJKm5jaGFuID0gMDsKKworCWlmIChkZnMgPT0gTlVMTCkgeworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfTk9MLCAiJXM6IHNjX2RmcyBpcyBOVUxMIiwKKwkJCSAgICBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlub2wgPSBkZnMtPmRmc19ub2w7CisJd2hpbGUgKG5vbCAhPSBOVUxMKSB7CisJCWRmc19ub2xbKm5jaGFuXS5ub2xfZnJlcSA9IG5vbC0+bm9sX2ZyZXE7CisJCWRmc19ub2xbKm5jaGFuXS5ub2xfY2h3aWR0aCA9IG5vbC0+bm9sX2Nod2lkdGg7CisJCWRmc19ub2xbKm5jaGFuXS5ub2xfc3RhcnRfdGlja3MgPSBub2wtPm5vbF9zdGFydF90aWNrczsKKwkJZGZzX25vbFsqbmNoYW5dLm5vbF90aW1lb3V0X21zID0gbm9sLT5ub2xfdGltZW91dF9tczsKKwkJKysoKm5jaGFuKTsKKwkJbm9sID0gbm9sLT5ub2xfbmV4dDsKKwl9Cit9CisKK3ZvaWQgZGZzX3NldF9ub2woc3RydWN0IGF0aF9kZnMgKmRmcywgc3RydWN0IGRmc3JlcV9ub2xlbGVtICpkZnNfbm9sLCBpbnQgbmNoYW4pCit7CisjZGVmaW5lIFRJTUVfSU5fTVMgMTAwMAorCXVpbnQzMl90IG5vbF90aW1lX2xlZnRfbXM7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGNoYW47CisJaW50IGk7CisKKwlpZiAoZGZzID09IE5VTEwpIHsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX05PTCwgIiVzOiBzY19kZnMgaXMgTlVMTCIsCisJCQkgICAgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5jaGFuOyBpKyspIHsKKwkJbm9sX3RpbWVfbGVmdF9tcyA9CisJCQljZGZfc3lzdGVtX3RpY2tzX3RvX21zZWNzKGNkZl9zeXN0ZW1fdGlja3MoKSAtCisJCQkJCQkgIGRmc19ub2xbaV0ubm9sX3N0YXJ0X3RpY2tzKTsKKwkJaWYgKG5vbF90aW1lX2xlZnRfbXMgPCBkZnNfbm9sW2ldLm5vbF90aW1lb3V0X21zKSB7CisJCQljaGFuLmljX2ZyZXEgPSBkZnNfbm9sW2ldLm5vbF9mcmVxOworCQkJY2hhbi5pY19mbGFncyA9IDA7CisJCQljaGFuLmljX2ZsYWdleHQgPSAwOworCQkJbm9sX3RpbWVfbGVmdF9tcyA9CisJCQkJKGRmc19ub2xbaV0ubm9sX3RpbWVvdXRfbXMgLSBub2xfdGltZV9sZWZ0X21zKTsKKwkJCWRmc19ub2xfYWRkY2hhbihkZnMsICZjaGFuLAorCQkJCQkobm9sX3RpbWVfbGVmdF9tcyAvIFRJTUVfSU5fTVMpKTsKKwkJfQorCX0KKyN1bmRlZiBUSU1FX0lOX01TCisJZGZzX25vbF91cGRhdGUoZGZzKTsKK30KKwordm9pZAorZGZzX25vbF9hZGRjaGFuKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKKwkJdWludDMyX3QgZGZzX25vbF90aW1lb3V0KQoreworI2RlZmluZSBUSU1FX0lOX01TIDEwMDAKKyNkZWZpbmUgVElNRV9JTl9VUyAoVElNRV9JTl9NUyAqIDEwMDApCisJc3RydWN0IGRmc19ub2xlbGVtICpub2wsICplbGVtLCAqcHJldjsKKwlzdHJ1Y3QgZGZzX25vbF90aW1lcl9hcmcgKmRmc19ub2xfYXJnOworCS8qIFhYWCBmb3Igbm93LCBhc3N1bWUgYWxsIGV2ZW50cyBhcmUgMjBNSHogd2lkZSAqLworCWludCBjaF93aWR0aCA9IDIwOworCisJaWYgKGRmcyA9PSBOVUxMKSB7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19OT0wsICIlczogc2NfZGZzIGlzIE5VTEwiLAorCQkJICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlub2wgPSBkZnMtPmRmc19ub2w7CisJcHJldiA9IGRmcy0+ZGZzX25vbDsKKwllbGVtID0gTlVMTDsKKwl3aGlsZSAobm9sICE9IE5VTEwpIHsKKwkJaWYgKChub2wtPm5vbF9mcmVxID09IGNoYW4tPmljX2ZyZXEpICYmCisJCSAgICAobm9sLT5ub2xfY2h3aWR0aCA9PSBjaF93aWR0aCkpIHsKKwkJCW5vbC0+bm9sX3N0YXJ0X3RpY2tzID0gY2RmX3N5c3RlbV90aWNrcygpOworCQkJbm9sLT5ub2xfdGltZW91dF9tcyA9IGRmc19ub2xfdGltZW91dCAqIFRJTUVfSU5fTVM7CisJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfTk9MLAorCQkJCSAgICAiJXM6IFVwZGF0ZSBPUyBUaWNrcyBmb3IgTk9MICVkIE1IeiAvICVkIE1IeiIsCisJCQkJICAgIF9fZnVuY19fLCBub2wtPm5vbF9mcmVxLCBub2wtPm5vbF9jaHdpZHRoKTsKKwkJCU9TX0NBTkNFTF9USU1FUigmbm9sLT5ub2xfdGltZXIpOworCQkJT1NfU0VUX1RJTUVSKCZub2wtPm5vbF90aW1lciwKKwkJCQkgICAgIGRmc19ub2xfdGltZW91dCAqIFRJTUVfSU5fTVMpOworCQkJcmV0dXJuOworCQl9CisJCXByZXYgPSBub2w7CisJCW5vbCA9IG5vbC0+bm9sX25leHQ7CisJfQorCS8qIEFkZCBhIG5ldyBlbGVtZW50IHRvIHRoZSBOT0wgKi8KKwllbGVtID0KKwkJKHN0cnVjdCBkZnNfbm9sZWxlbSAqKW9zX21hbGxvYyhOVUxMLCBzaXplb2Yoc3RydWN0IGRmc19ub2xlbGVtKSwKKwkJCQkJCUdGUF9BVE9NSUMpOworCWlmIChlbGVtID09IE5VTEwpIHsKKwkJZ290byBiYWQ7CisJfQorCWRmc19ub2xfYXJnID0gKHN0cnVjdCBkZnNfbm9sX3RpbWVyX2FyZyAqKW9zX21hbGxvYyhOVUxMLAorCQkJCQkJCSAgICBzaXplb2Yoc3RydWN0CisJCQkJCQkJCSAgIGRmc19ub2xfdGltZXJfYXJnKSwKKwkJCQkJCQkgICAgR0ZQX0FUT01JQyk7CisJaWYgKGRmc19ub2xfYXJnID09IE5VTEwpIHsKKwkJT1NfRlJFRShlbGVtKTsKKwkJZ290byBiYWQ7CisJfQorCWVsZW0tPm5vbF9mcmVxID0gY2hhbi0+aWNfZnJlcTsKKwllbGVtLT5ub2xfY2h3aWR0aCA9IGNoX3dpZHRoOworCWVsZW0tPm5vbF9zdGFydF90aWNrcyA9IGNkZl9zeXN0ZW1fdGlja3MoKTsKKwllbGVtLT5ub2xfdGltZW91dF9tcyA9IGRmc19ub2xfdGltZW91dCAqIFRJTUVfSU5fTVM7CisJZWxlbS0+bm9sX25leHQgPSBOVUxMOworCWlmIChwcmV2KSB7CisJCXByZXYtPm5vbF9uZXh0ID0gZWxlbTsKKwl9IGVsc2UgeworCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBOT0wgKi8KKwkJZGZzLT5kZnNfbm9sID0gZWxlbTsKKwl9CisJZGZzX25vbF9hcmctPmRmcyA9IGRmczsKKwlkZnNfbm9sX2FyZy0+ZGVsZnJlcSA9IGVsZW0tPm5vbF9mcmVxOworCWRmc19ub2xfYXJnLT5kZWxjaHdpZHRoID0gZWxlbS0+bm9sX2Nod2lkdGg7CisKKwlPU19JTklUX1RJTUVSKE5VTEwsICZlbGVtLT5ub2xfdGltZXIsIGRmc19yZW1vdmVfZnJvbV9ub2wsCisJCWRmc19ub2xfYXJnLCBDREZfVElNRVJfVFlQRV9TVyk7CisJT1NfU0VUX1RJTUVSKCZlbGVtLT5ub2xfdGltZXIsIGRmc19ub2xfdGltZW91dCAqIFRJTUVfSU5fTVMpOworCisJLyogVXBkYXRlIHRoZSBOT0wgY291bnRlciAqLworCWRmcy0+ZGZzX25vbF9jb3VudCsrOworCisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX05PTCwKKwkJICAgICIlczogbmV3IE5PTCBjaGFubmVsICVkIE1IeiAvICVkIE1IeiIsCisJCSAgICBfX2Z1bmNfXywgZWxlbS0+bm9sX2ZyZXEsIGVsZW0tPm5vbF9jaHdpZHRoKTsKKwlyZXR1cm47CisKK2JhZDoKKwlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfTk9MIHwgQVRIX0RFQlVHX0RGUywKKwkJICAgICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igbm9sIGVudHJ5IiwgX19mdW5jX18pOworCisjdW5kZWYgVElNRV9JTl9NUworI3VuZGVmIFRJTUVfSU5fVVMKK30KKworLyoKKyAqIERlbGV0ZSB0aGUgZ2l2ZW4gZnJlcXVlbmN5L2Nod2lkdGggZnJvbSB0aGUgTk9MLgorICovCitzdGF0aWMgdm9pZAorZGZzX25vbF9kZWxldGUoc3RydWN0IGF0aF9kZnMgKmRmcywgdWludDE2X3QgZGVsZnJlcSwgdWludDE2X3QgZGVsY2h3aWR0aCkKK3sKKwlzdHJ1Y3QgZGZzX25vbGVsZW0gKm5vbCwgKipwcmV2X25leHQ7CisKKwlpZiAoZGZzID09IE5VTEwpIHsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTLCAiJXM6IHNjX2RmcyBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX05PTCwKKwkJICAgICIlczogcmVtb3ZlIGNoYW5uZWw9JWQvJWQgTUh6IGZyb20gTk9MIiwKKwkJICAgIF9fZnVuY19fLCBkZWxmcmVxLCBkZWxjaHdpZHRoKTsKKwlwcmV2X25leHQgPSAmKGRmcy0+ZGZzX25vbCk7CisJbm9sID0gZGZzLT5kZnNfbm9sOworCXdoaWxlIChub2wgIT0gTlVMTCkgeworCQlpZiAobm9sLT5ub2xfZnJlcSA9PSBkZWxmcmVxICYmIG5vbC0+bm9sX2Nod2lkdGggPT0gZGVsY2h3aWR0aCkgeworCQkJKnByZXZfbmV4dCA9IG5vbC0+bm9sX25leHQ7CisJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfTk9MLAorCQkJCSAgICAiJXMgcmVtb3ZpbmcgY2hhbm5lbCAlZC8lZE1IeiBmcm9tIE5PTCB0c3RhbXA9JWQiLAorCQkJCSAgICBfX2Z1bmNfXywgbm9sLT5ub2xfZnJlcSwgbm9sLT5ub2xfY2h3aWR0aCwKKwkJCQkgICAgKGNkZl9zeXN0ZW1fdGlja3NfdG9fbXNlY3MKKwkJCQkJICAgICAoY2RmX3N5c3RlbV90aWNrcygpKSAvIDEwMDApKTsKKwkJCU9TX0NBTkNFTF9USU1FUigmbm9sLT5ub2xfdGltZXIpOworCQkJT1NfRlJFRShub2wpOworCQkJbm9sID0gTlVMTDsKKwkJCW5vbCA9ICpwcmV2X25leHQ7CisKKwkJCS8qIFVwZGF0ZSB0aGUgTk9MIGNvdW50ZXIgKi8KKwkJCWRmcy0+ZGZzX25vbF9jb3VudC0tOworCisJCQkvKiBCZSBwYXJhbm9pZCEgKi8KKwkJCWlmIChkZnMtPmRmc19ub2xfY291bnQgPCAwKSB7CisJCQkJREZTX1BSSU5USygiJXM6IGRmc19ub2xfY291bnQgPCAwOyBlZWshIiwKKwkJCQkJICAgX19mdW5jX18pOworCQkJCWRmcy0+ZGZzX25vbF9jb3VudCA9IDA7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCXByZXZfbmV4dCA9ICYobm9sLT5ub2xfbmV4dCk7CisJCQlub2wgPSBub2wtPm5vbF9uZXh0OworCQl9CisJfQorfQorCisvKgorICogbm90aWZ5IHRoZSBkcml2ZXIvdW1hYyB0aGF0IGl0IHNob3VsZCB1cGRhdGUgdGhlIGNoYW5uZWwgcmFkYXIvTk9MCisgKiBmbGFncyBiYXNlZCBvbiB0aGUgY3VycmVudCBOT0wgbGlzdC4KKyAqLwordm9pZCBkZnNfbm9sX3VwZGF0ZShzdHJ1Y3QgYXRoX2RmcyAqZGZzKQoreworCXN0cnVjdCBpZWVlODAyMTFjb20gKmljID0gZGZzLT5pYzsKKwlzdHJ1Y3QgZGZzX25vbF9jaGFuX2VudHJ5ICpkZnNfbm9sOworCXN0cnVjdCBkZnNfbm9sZWxlbSAqbm9sOworCWludCBubGVuOworCisJLyoKKwkgKiBBbGxvY2F0ZSBlbm91Z2ggZW50cmllcyB0byBzdG9yZSB0aGUgTk9MLgorCSAqCisJICogQXQgbGVhc3Qgb24gTGludXggKGRvbid0IGFzayB3aHkpLCBpZiB5b3UgYWxsb2NhdGUgYSAwIGVudHJ5CisJICogYXJyYXksIHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIDB4MTAuICBNYWtlIHN1cmUgeW91J3JlCisJICogYXdhcmUgb2YgdGhpcyB3aGVuIHlvdSBzdGFydCBkZWJ1Z2dpbmcuCisJICovCisJZGZzX25vbCA9IChzdHJ1Y3QgZGZzX25vbF9jaGFuX2VudHJ5ICopb3NfbWFsbG9jKE5VTEwsCisJCQkJCQkJIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkJZGZzX25vbF9jaGFuX2VudHJ5KQorCQkJCQkJCSAqIGRmcy0+ZGZzX25vbF9jb3VudCwKKwkJCQkJCQkgR0ZQX0FUT01JQyk7CisKKwlpZiAoZGZzX25vbCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFhYWCBUT0RPOiBpZiB0aGlzIGZhaWxzLCBqdXN0IHNjaGVkdWxlIGEgdGFzayB0byByZXRyeQorCQkgKiB1cGRhdGluZyB0aGUgTk9MIGF0IGEgbGF0ZXIgc3RhZ2UuICBUaGF0IHdheSB0aGUgTk9MCisJCSAqIHVwZGF0ZSBfRE9FU18gaGFwcGVuIC0gaG9wZWZ1bGx5IHRoZSBmYWlsdXJlIHdhcyBqdXN0CisJCSAqIHRlbXBvcmFyeS4KKwkJICovCisJCURGU19QUklOVEsoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgTk9MIHVwZGF0ZSBtZW1vcnkhIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHBvcHVsYXRlIHRoZSBub2wgYXJyYXkgKi8KKwlubGVuID0gMDsKKworCW5vbCA9IGRmcy0+ZGZzX25vbDsKKwl3aGlsZSAobm9sICE9IE5VTEwgJiYgbmxlbiA8IGRmcy0+ZGZzX25vbF9jb3VudCkgeworCQlkZnNfbm9sW25sZW5dLm5vbF9jaGZyZXEgPSBub2wtPm5vbF9mcmVxOworCQlkZnNfbm9sW25sZW5dLm5vbF9jaHdpZHRoID0gbm9sLT5ub2xfY2h3aWR0aDsKKwkJZGZzX25vbFtubGVuXS5ub2xfc3RhcnRfdGlja3MgPSBub2wtPm5vbF9zdGFydF90aWNrczsKKwkJZGZzX25vbFtubGVuXS5ub2xfdGltZW91dF9tcyA9IG5vbC0+bm9sX3RpbWVvdXRfbXM7CisJCW5sZW4rKzsKKwkJbm9sID0gbm9sLT5ub2xfbmV4dDsKKwl9CisKKwkvKiBCZSBzdWl0YWJseSBwYXJhbm9pZCBmb3Igbm93ICovCisJaWYgKG5sZW4gIT0gZGZzLT5kZnNfbm9sX2NvdW50KQorCQlERlNfUFJJTlRLKCIlczogbmxlbiAoJWQpICE9IGRmcy0+ZGZzX25vbF9jb3VudCAoJWQpISIsCisJCQkgICBfX2Z1bmNfXywgbmxlbiwgZGZzLT5kZnNfbm9sX2NvdW50KTsKKworCS8qCisJICogQ2FsbCB0aGUgZHJpdmVyIGxheWVyIHRvIGhhdmUgaXQgcmVjYWxjdWxhdGUgdGhlIE5PTCBmbGFncyBmb3IKKwkgKiBlYWNoIGRyaXZlci91bWFjIGNoYW5uZWwuCisJICoKKwkgKiBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgcGFzcyBOVUxMIGluc3RlYWQgb2YgZGZzX25vbC4KKwkgKgorCSAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtIG1heSBoYXZlIHNvbWUgc3BlY2lhbCByZXByZXNlbnRhdGlvbiBmb3IKKwkgKiAibWFsbG9jIGEgMCBieXRlIG1lbW9yeSByZWdpb24iIC0gZm9yIGV4YW1wbGUsCisJICogTGludXggMi42LjM4LTEzICh1YnVudHUpIHJldHVybnMgMHgxMCByYXRoZXIgdGhhbiBhIHZhbGlkCisJICogYWxsb2NhdGlvbiAoYW5kIGlzIGxpa2VseSBub3QgTlVMTCBzbyB0aGUgcG9pbnRlciBkb2Vzbid0CisJICogbWF0Y2ggTlVMTCBjaGVja3MgaW4gYW55IGxhdGVyIGNvZGUuCisJICovCisJaWMtPmljX2Rmc19jbGlzdF91cGRhdGUoaWMsIERGU19OT0xfQ0xJU1RfQ01EX1VQREFURSwKKwkJCQkobmxlbiA+IDApID8gZGZzX25vbCA6IE5VTEwsIG5sZW4pOworCisJLyoKKwkgKiAuLiBhbmQgd2UncmUgZG9uZS4KKwkgKi8KKwlPU19GUkVFKGRmc19ub2wpOworfQorCit2b2lkIGRmc19ub2xfdGltZXJfY2xlYW51cChzdHJ1Y3QgYXRoX2RmcyAqZGZzKQoreworCXN0cnVjdCBkZnNfbm9sZWxlbSAqbm9sID0gZGZzLT5kZnNfbm9sLCAqcHJldjsKKworCS8qIEZpcnN0IENhbmNlbCB0aW1lciAqLworCXdoaWxlIChub2wpIHsKKwkJT1NfQ0FOQ0VMX1RJTUVSKCZub2wtPm5vbF90aW1lcik7CisJCW5vbCA9IG5vbC0+bm9sX25leHQ7CisJfQorCS8qIEZyZWUgTk9MIGVsZW0sIGRvbid0IG1peCB0aGlzIHdoaWxlIGxvb3Agd2l0aCBhYm92ZSBsb29wICovCisJbm9sID0gZGZzLT5kZnNfbm9sOworCXdoaWxlIChub2wpIHsKKwkJcHJldiA9IG5vbDsKKwkJbm9sID0gbm9sLT5ub2xfbmV4dDsKKwkJT1NfRlJFRShwcmV2KTsKKwl9CisJcmV0dXJuOworfQorI2VuZGlmIC8qIGRlZmluZWQoQVRIX1NVUFBPUlRfREZTKSAmJiAhZGVmaW5lZChBVEhfREZTX1JBREFSX0RFVEVDVElPTl9PTkxZKSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zYXAvZGZzL3NyYy9kZnNfcGh5ZXJyLmggYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19waHllcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmE5MDBmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zYXAvZGZzL3NyYy9kZnNfcGh5ZXJyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqCQkJCWRmc19waHllcnIuaAorICoKKyAqIE9WRVJWSUVXOgorICoKKyAqIFNvdXJjZSBjb2RlIGJvcnJvd2VkIGZyb20gUUNBX01BSU4gREZTIG1vZHVsZQorICoKKyAqIERFUEVOREVOQ0lFUzoKKyAqCisgKiBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKyAqLworCisKKyNpZm5kZWYgX19ERlNfUEhZRVJSX0hfXworI2RlZmluZSBfX0RGU19QSFlFUlJfSF9fCisKK2V4dGVybiBpbnQgZGZzX3Byb2Nlc3NfcGh5ZXJyX2JiX3RsdihzdHJ1Y3QgYXRoX2RmcyAqZGZzLCB2b2lkICpidWYsCisJCQkJICAgICB1aW50MTZfdCBkYXRhbGVuLCB1aW50OF90IHJzc2ksCisJCQkJICAgICB1aW50OF90IGV4dF9yc3NpLCB1aW50MzJfdCByc190c3RhbXAsCisJCQkJICAgICB1aW50NjRfdCBmdWxsdHNmLCBzdHJ1Y3QgZGZzX3BoeV9lcnIgKmUsCisJCQkJICAgICBib29sIGVuYWJsZV9sb2cpOworCisjZW5kaWYgLyogX19ERlNfUEhZRVJSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zYXAvZGZzL3NyYy9kZnNfcGh5ZXJyX3Rsdi5jIGIvY29yZS9zYXAvZGZzL3NyYy9kZnNfcGh5ZXJyX3Rsdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNWMxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19waHllcnJfdGx2LmMKQEAgLTAsMCArMSw3MjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlICJkZnMuaCIKKy8qIFRPIERPIERGUworICAgI2luY2x1ZGUgPGllZWU4MDIxMV92YXIuaD4KKyAqLworLyogVE8gRE8gREZTCisgICAjaW5jbHVkZSA8aWVlZTgwMjExX2NoYW5uZWwuaD4KKyAqLworI2luY2x1ZGUgImRmc19waHllcnIuaCIKKyNpbmNsdWRlICJkZnNfcGh5ZXJyX3Rsdi5oIgorCisvKgorICogUGFyc2VkIHJhZGFyIHN0YXR1cworICovCitzdHJ1Y3QgcnhfcmFkYXJfc3RhdHVzIHsKKwl1aW50MzJfdCByYXdfdHNmOworCXVpbnQzMl90IHRzZl9vZmZzZXQ7CisJaW50IHJzc2k7CisJaW50IHB1bHNlX2R1cmF0aW9uOworCWludCBpc19jaGlycDoxOworCWludCBkZWx0YV9wZWFrOworCWludCBkZWx0YV9kaWZmOworCWludCBzaWR4OworCWludCBmcmVxX29mZnNldDsgICAgICAgIC8qIGluIEtIeiAqLworfTsKKworc3RydWN0IHJ4X3NlYXJjaF9mZnRfcmVwb3J0IHsKKwl1aW50MzJfdCB0b3RhbF9nYWluX2RiOworCXVpbnQzMl90IGJhc2VfcHdyX2RiOworCWludCBmZnRfY2huX2lkeDsKKwlpbnQgcGVha19zaWR4OworCWludCByZWxwd3JfZGI7CisJaW50IGF2Z3B3cl9kYjsKKwlpbnQgcGVha19tYWc7CisJaW50IG51bV9zdHJfYmluc19pYjsKK307CisKKy8qCisgKiBYWFggdW50aWwgImZhc3RjbGsiIGlzIHN0b3JlZCBpbiB0aGUgREZTIGNvbmZpZ3VyYXRpb24uLgorICovCisjZGVmaW5lICBQRVJFX0lTX09WRVJTQU1QTElORyhfZGZzKSAoMSkKKworLyoKKyAqIFhYWCB0aGVyZSBfaGFzXyB0byBiZSBhIGJldHRlciB3YXkgb2YgZG9pbmcgdGhpcyEKKyAqIC1hZHJpYW4KKyAqLworc3RhdGljIGludDMyX3Qgc2lnbl9leHRlbmRfMzIodWludDMyX3QgdiwgaW50IG5iKQoreworCXVpbnQzMl90IG0gPSAxVSA8PCAobmIgLSAxKTsKKworCS8qIENob3Agb2ZmIGhpZ2ggYml0cywganVzdCBpbiBjYXNlICovCisJdiAmPSB2ICYgKCgxVSA8PCBuYikgLSAxKTsKKworCS8qIEV4dGVuZCAqLworCXJldHVybiAodiBeIG0pIC0gbTsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IG9mZnNldCBmcm9tIHRoZSBnaXZlbiBzaWduZWQgYmluIGluZGV4CisgKiBmcm9tIHRoZSByYWRhciBzdW1tYXJ5IHJlcG9ydC4KKyAqCisgKiBUaGlzIHRha2VzIHRoZSBvdmVyc2FtcGxpbmcgbW9kZSBpbnRvIGFjY291bnQuCisgKgorICogRm9yIG92ZXJzYW1wbGluZywgZWFjaCBiaW4gaGFzIHJlc29sdXRpb24gNDRNSHovMTI4LgorICogRm9yIG5vbi1vdmVyc2FtcGxpbmcsIGVhY2ggYmluIGhhcyByZXNvbHV0aW9uIDQwTUh6LzEyOC4KKyAqCisgKiBJdCByZXR1cm5zIGtIeiAtIGllLCAxMDAwdGgncyBvZiBNSHouCisgKi8KK3N0YXRpYyBpbnQgY2FsY19mcmVxX29mZnNldChpbnQgc2luZGV4LCBpbnQgaXNfb3ZlcnNhbXBsaW5nKQoreworCisJaWYgKGlzX292ZXJzYW1wbGluZykKKwkJcmV0dXJuIHNpbmRleCAqICg0NDAwMCAvIDEyOCk7CisJZWxzZQorCQlyZXR1cm4gc2luZGV4ICogKDQwMDAwIC8gMTI4KTsKK30KKworc3RhdGljIHZvaWQKK3JhZGFyX3N1bW1hcnlfcHJpbnQoc3RydWN0IGF0aF9kZnMgKmRmcywKKwkJICAgIHN0cnVjdCByeF9yYWRhcl9zdGF0dXMgKnJzdSwKKwkJICAgIGJvb2wgZW5hYmxlX2xvZykKK3sKKwlpZiAoIWVuYWJsZV9sb2cpCisJCXJldHVybjsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIlxuICMjIyMjIyMjIyMjIyBSYWRhciBTdW1tYXJ5ICMjIyMjIyMjIyMjI1xuIik7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmFkYXIgU3VtbWFyeSAtIHB1bHNlZHVyID0gJWQgbWljcm8gc2Vjb25kc1xuIiwgX19mdW5jX18sCisJCSAgcnN1LT5wdWxzZV9kdXJhdGlvbik7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmFkYXIgU3VtbWFyeSAtIHJzc2kgPSAlZCBkYm1cbiIsIF9fZnVuY19fLAorCQkgIHJzdS0+cnNzaSk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmFkYXIgU3VtbWFyeSAtIGlzY2hpcnAgPSAlZFxuIiwgX19mdW5jX18sCisJCSAgcnN1LT5pc19jaGlycCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmFkYXIgU3VtbWFyeSAtIHNpZHggPSAlZFxuIiwgX19mdW5jX18sCisJCSAgcnN1LT5zaWR4KTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSYWRhciBTdW1tYXJ5IC0gZGVsdGFfcGVhayA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJICByc3UtPmRlbHRhX3BlYWspOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFJhZGFyIFN1bW1hcnkgLSBkZWx0YV9kaWZmID0gJWRcbiIsIF9fZnVuY19fLAorCQkgIHJzdS0+ZGVsdGFfZGlmZik7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmFkYXIgU3VtbWFyeSAtIHJhdyB0c2YgPSAlZFxuIiwgX19mdW5jX18sCisJCSAgcnN1LT5yYXdfdHNmKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBSYWRhciBTdW1tYXJ5IC0gdHNmX29mZnNldCA9ICVkIG1pY3JvIHNlY29uZHNcbiIsCisJCSAgX19mdW5jX18sIHJzdS0+dHNmX29mZnNldCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogUmFkYXIgU3VtbWFyeSAtIGNvb2tlZCB0c2YgPSAlZFxuIiwgX19mdW5jX18sCisJCSAgKHJzdS0+cmF3X3RzZiAtIHJzdS0+dHNmX29mZnNldCkpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IGZyZXF1ZW5jeSBvZmZzZXQgPSAlZC4lZCBNSHogKG92ZXJzYW1wbGluZyA9ICVkKVxuIiwKKwkJICBfX2Z1bmNfXywgKGludCkgKHJzdS0+ZnJlcV9vZmZzZXQgLyAxMDAwKSwKKwkJICAoaW50KSBhYnMocnN1LT5mcmVxX29mZnNldCAlIDEwMDApLAorCQkgIFBFUkVfSVNfT1ZFUlNBTVBMSU5HKGRmcykpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiXG4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIpOworfQorCisvKgorICogUGFyc2UgdGhlIHJhZGFyIHN1bW1hcnkgZnJhbWUuCisgKgorICogVGhlIGZyYW1lIGNvbnRlbnRzIF9taW51c18gdGhlIFRMViBhcmUgcGFzc2VkIGluLgorICovCitzdGF0aWMgdm9pZAorcmFkYXJfc3VtbWFyeV9wYXJzZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCisJCSAgICBzdHJ1Y3QgcnhfcmFkYXJfc3RhdHVzICpyc3UpCit7CisJdWludDMyX3QgcnNbMl07CisJaW50IGZyZXFfY2VudHJlLCBmcmVxOworCisJLyogRHJvcCBvdXQgaWYgd2UgaGF2ZSA8IDIgRFdPUkRzIGF2YWlsYWJsZSAqLworCWlmIChsZW4gPCBzaXplb2YocnMpKSB7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19QSFlFUlIgfAorCQkJICAgIEFUSF9ERUJVR19ERlNfUEhZRVJSX1NVTSwKKwkJCSAgICAiJXM6IGxlbiAoJXp1KSA8IGV4cGVjdGVkICglenUpISIsCisJCQkgICAgX19mdW5jX18sIGxlbiwgc2l6ZW9mKHJzKSk7CisJfQorCisJLyoKKwkgKiBTaW5jZSB0aGUgVExWcyBtYXkgYmUgdW5hbGlnbmVkIGZvciBzb21lIHJlYXNvbgorCSAqIHdlIHRha2UgYSBwcml2YXRlIGNvcHkgaW50byBhbGlnbmVkIG1lbW9yeS4KKwkgKiBUaGlzIGVuYWJsZXMgdXMgdG8gdXNlIHRoZSBIQUwtbGlrZSBhY2Nlc3NvciBtYWNyb3MKKwkgKiBpbnRvIHRoZSBEV09SRHMgdG8gYWNjZXNzIHN1Yi1EV09SRCBmaWVsZHMuCisJICovCisJT1NfTUVNQ1BZKHJzLCBidWYsIHNpemVvZihycykpOworCisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwKKwkJICAgICIlczogdHdvIDMyIGJpdCB2YWx1ZXMgYXJlOiAlMDh4ICUwOHgiLCBfX2Z1bmNfXywgcnNbMF0sCisJCSAgICByc1sxXSk7CisvKiBERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfUEhZRVJSLCAiJXMgKHA9JXApOiIsIF9fZnVuY19fLCBidWYpOyAqLworCisJLyogUG9wdWxhdGUgdGhlIGZpZWxkcyBmcm9tIHRoZSBzdW1tYXJ5IHJlcG9ydCAqLworCXJzdS0+dHNmX29mZnNldCA9CisJCU1TKHJzW1JBREFSX1JFUE9SVF9QVUxTRV9SRUdfMl0sIFJBREFSX1JFUE9SVF9QVUxTRV9UU0ZfT0ZGU0VUKTsKKwlyc3UtPnB1bHNlX2R1cmF0aW9uID0KKwkJTVMocnNbUkFEQVJfUkVQT1JUX1BVTFNFX1JFR18yXSwgUkFEQVJfUkVQT1JUX1BVTFNFX0RVUik7CisJcnN1LT5pc19jaGlycCA9CisJCU1TKHJzW1JBREFSX1JFUE9SVF9QVUxTRV9SRUdfMV0sIFJBREFSX1JFUE9SVF9QVUxTRV9JU19DSElSUCk7CisJcnN1LT5zaWR4ID0KKwkJc2lnbl9leHRlbmRfMzIoTVMKKwkJCQkgICAgICAgKHJzW1JBREFSX1JFUE9SVF9QVUxTRV9SRUdfMV0sCisJCQkJICAgICAgIFJBREFSX1JFUE9SVF9QVUxTRV9TSURYKSwgMTApOworCXJzdS0+ZnJlcV9vZmZzZXQgPQorCQljYWxjX2ZyZXFfb2Zmc2V0KHJzdS0+c2lkeCwgUEVSRV9JU19PVkVSU0FNUExJTkcoZGZzKSk7CisKKwkvKiBUaGVzZSBhcmUgb25seSByZWxldmFudCBpZiB0aGUgcHVsc2UgaXMgYSBjaGlycCAqLworCXJzdS0+ZGVsdGFfcGVhayA9CisJCXNpZ25fZXh0ZW5kXzMyKE1TCisJCQkJICAgICAgIChyc1tSQURBUl9SRVBPUlRfUFVMU0VfUkVHXzFdLAorCQkJCSAgICAgICBSQURBUl9SRVBPUlRfUFVMU0VfREVMVEFfUEVBSyksIDYpOworCXJzdS0+ZGVsdGFfZGlmZiA9CisJCU1TKHJzW1JBREFSX1JFUE9SVF9QVUxTRV9SRUdfMV0sIFJBREFSX1JFUE9SVF9QVUxTRV9ERUxUQV9ESUZGKTsKKworCS8qIFdBUiBmb3IgRkNDIFR5cGUgNCAqLworCS8qCisJICogSFcgaXMgZ2l2aW5nIGxvbmdlciBwdWxzZSBkdXJhdGlvbiAoaW4gY2FzZSBvZiBWSFQ4MCwgd2l0aCB0cmFmZmljKQorCSAqIHdoaWNoIGZhaWxzIHRvIGRldGVjdCBGQ0MgdHlwZTQgcmFkYXIgcHVsc2VzLiBBZGRlZCBhIHdvcmsgYXJvdW5kIHRvCisJICogZml4IHRoZSBwdWxzZSBkdXJhdGlvbiBhbmQgZHVyYXRpb24gZGVsdGEuCisJICoKKwkgKiBJRiBWSFQ4MAorCSAqICAgJiYgKHByaW1hcnlfY2hhbm5lbD09MzBNSHogfHwgcHJpbWFyeV9jaGFubmVsPT0gLTMwTUh6KQorCSAqICAgJiYgLTQgPD0gcHVsc2VfaW5kZXggPD0gNAorCSAqICAgJiYgIWNoaXJwCisJICogICAmJiBwdWxzZSBkdXJhdGlvbiA+IDIwIHVzCisJICogVEhFTgorCSAqICAgU2V0IHB1bHNlIGR1cmF0aW9uIHRvIDIwIHVzCisJICovCisKKwlmcmVxID0gaWVlZTgwMjExX2NoYW4yZnJlcShkZnMtPmljLCBkZnMtPmljLT5pY19jdXJjaGFuKTsKKwlmcmVxX2NlbnRyZSA9IGRmcy0+aWMtPmljX2N1cmNoYW4tPmljX3ZodG9wX2NoX2ZyZXFfc2VnMTsKKworCWlmICgoSUVFRTgwMjExX0lTX0NIQU5fMTFBQ19WSFQ4MChkZnMtPmljLT5pY19jdXJjaGFuKSAmJgorCSAgICAgKGFicyhmcmVxIC0gZnJlcV9jZW50cmUpID09IDMwKSAmJgorCSAgICAgIXJzdS0+aXNfY2hpcnAgJiYKKwkgICAgIGFicyhyc3UtPnNpZHgpIDw9IDQgJiYgcnN1LT5wdWxzZV9kdXJhdGlvbiA+IDIwKSkgeworCQlyc3UtPnB1bHNlX2R1cmF0aW9uID0gMjA7CisJfQorCit9CisKK3N0YXRpYyB2b2lkCityYWRhcl9mZnRfc2VhcmNoX3JlcG9ydF9wYXJzZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCisJCQkgICAgICBzdHJ1Y3Qgcnhfc2VhcmNoX2ZmdF9yZXBvcnQgKnJzZnIpCit7CisJdWludDMyX3QgcnNbMl07CisKKwkvKiBEcm9wIG91dCBpZiB3ZSBoYXZlIDwgMiBEV09SRHMgYXZhaWxhYmxlICovCisJaWYgKGxlbiA8IHNpemVvZihycykpIHsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiB8CisJCQkgICAgQVRIX0RFQlVHX0RGU19QSFlFUlJfU1VNLAorCQkJICAgICIlczogbGVuICglenUpIDwgZXhwZWN0ZWQgKCV6dSkhIiwKKwkJCSAgICBfX2Z1bmNfXywgbGVuLCBzaXplb2YocnMpKTsKKwl9CisKKwkvKgorCSAqIFNpbmNlIHRoZSBUTFZzIG1heSBiZSB1bmFsaWduZWQgZm9yIHNvbWUgcmVhc29uCisJICogd2UgdGFrZSBhIHByaXZhdGUgY29weSBpbnRvIGFsaWduZWQgbWVtb3J5LgorCSAqIFRoaXMgZW5hYmxlcyB1cyB0byB1c2UgdGhlIEhBTC1saWtlIGFjY2Vzc29yIG1hY3JvcworCSAqIGludG8gdGhlIERXT1JEcyB0byBhY2Nlc3Mgc3ViLURXT1JEIGZpZWxkcy4KKwkgKi8KKwlPU19NRU1DUFkocnMsIGJ1Ziwgc2l6ZW9mKHJzKSk7CisJcnNmci0+dG90YWxfZ2Fpbl9kYiA9CisJCU1TKHJzW1NFQVJDSF9GRlRfUkVQT1JUX1JFR18xXSwKKwkJCVNFQVJDSF9GRlRfUkVQT1JUX1RPVEFMX0dBSU5fREIpOworCXJzZnItPmJhc2VfcHdyX2RiID0KKwkJTVMocnNbU0VBUkNIX0ZGVF9SRVBPUlRfUkVHXzFdLCBTRUFSQ0hfRkZUX1JFUE9SVF9CQVNFX1BXUl9EQik7CisJcnNmci0+ZmZ0X2Nobl9pZHggPQorCQlNUyhyc1tTRUFSQ0hfRkZUX1JFUE9SVF9SRUdfMV0sIFNFQVJDSF9GRlRfUkVQT1JUX0ZGVF9DSE5fSURYKTsKKwlyc2ZyLT5wZWFrX3NpZHggPQorCQlzaWduX2V4dGVuZF8zMihNUworCQkJCSAgICAgICAocnNbU0VBUkNIX0ZGVF9SRVBPUlRfUkVHXzFdLAorCQkJCSAgICAgICBTRUFSQ0hfRkZUX1JFUE9SVF9QRUFLX1NJRFgpLCAxMik7CisJcnNmci0+cmVscHdyX2RiID0KKwkJTVMocnNbU0VBUkNIX0ZGVF9SRVBPUlRfUkVHXzJdLCBTRUFSQ0hfRkZUX1JFUE9SVF9SRUxQV1JfREIpOworCXJzZnItPmF2Z3B3cl9kYiA9CisJCU1TKHJzW1NFQVJDSF9GRlRfUkVQT1JUX1JFR18yXSwgU0VBUkNIX0ZGVF9SRVBPUlRfQVZHUFdSX0RCKTsKKwlyc2ZyLT5wZWFrX21hZyA9CisJCU1TKHJzW1NFQVJDSF9GRlRfUkVQT1JUX1JFR18yXSwgU0VBUkNIX0ZGVF9SRVBPUlRfUEVBS19NQUcpOworCXJzZnItPm51bV9zdHJfYmluc19pYiA9CisJCU1TKHJzW1NFQVJDSF9GRlRfUkVQT1JUX1JFR18yXSwKKwkJCVNFQVJDSF9GRlRfUkVQT1JUX05VTV9TVFJfQklOU19JQik7CisKKwlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfUEhZRVJSLAorCQkgICAgIiVzOiB0d28gMzIgYml0IHZhbHVlcyBhcmU6ICUwOHggJTA4eCIsIF9fZnVuY19fLCByc1swXSwKKwkJICAgIHJzWzFdKTsKKwlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfUEhZRVJSLCAiJXM6IHJzZnItPnRvdGFsX2dhaW5fZGIgPSAlZCIsCisJCSAgICBfX2Z1bmNfXywgcnNmci0+dG90YWxfZ2Fpbl9kYik7CisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwgIiVzOiByc2ZyLT5iYXNlX3B3cl9kYiA9ICVkIiwKKwkJICAgIF9fZnVuY19fLCByc2ZyLT5iYXNlX3B3cl9kYik7CisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwgIiVzOiByc2ZyLT5mZnRfY2huX2lkeCA9ICVkIiwKKwkJICAgIF9fZnVuY19fLCByc2ZyLT5mZnRfY2huX2lkeCk7CisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwgIiVzOiByc2ZyLT5wZWFrX3NpZHggPSAlZCIsCisJCSAgICBfX2Z1bmNfXywgcnNmci0+cGVha19zaWR4KTsKKwlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfUEhZRVJSLCAiJXM6IHJzZnItPnJlbHB3cl9kYiA9ICVkIiwKKwkJICAgIF9fZnVuY19fLCByc2ZyLT5yZWxwd3JfZGIpOworCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19QSFlFUlIsICIlczogcnNmci0+YXZncHdyX2RiID0gJWQiLAorCQkgICAgX19mdW5jX18sIHJzZnItPmF2Z3B3cl9kYik7CisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwgIiVzOiByc2ZyLT5wZWFrX21hZyA9ICVkIiwKKwkJICAgIF9fZnVuY19fLCByc2ZyLT5wZWFrX21hZyk7CisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwgIiVzOiByc2ZyLT5udW1fc3RyX2JpbnNfaWIgPSAlZCIsCisJCSAgICBfX2Z1bmNfXywgcnNmci0+bnVtX3N0cl9iaW5zX2liKTsKK30KKworLyoKKyAqIFBhcnNlIGEgUGVyZWdyaW5lIEJCIFRMViBmcmFtZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcGFyc2VzIGVhY2ggVExWLCBwcmludHMgb3V0IHdoYXQncyBnb2luZyBvbiBhbmQKKyAqIGNhbGxzIGFuIGFwcHJvcHJpYXRlIHN1Yi1mdW5jdGlvbi4KKyAqCisgKiBTaW5jZSB0aGUgVExWIGZvcm1hdCBkb2Vzbid0IF9zcGVjaWZ5XyBhbGwgVExWIGNvbXBvbmVudHMgYXJlCisgKiBEV09SRCBhbGlnbmVkLCB3ZSBtdXN0IHRyZWF0IHRoZW0gYXMgbm90IGFuZCBhY2Nlc3MgdGhlIGZpZWxkcworICogYXBwcm9wcmlhdGVseS4KKyAqLworc3RhdGljIGludAordGx2X3BhcnNlX2ZyYW1lKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCByeF9yYWRhcl9zdGF0dXMgKnJzLAorCQlzdHJ1Y3Qgcnhfc2VhcmNoX2ZmdF9yZXBvcnQgKnJzZnIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJdWludDhfdCByc3NpKQoreworCWludCBpID0gMDsKKwl1aW50MzJfdCB0bHZfaGRyWzFdOworCWJvb2wgZmlyc3RfdGx2ID0gdHJ1ZTsKKwlib29sIGZhbHNlX2RldGVjdCA9IGZhbHNlOworCisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwKKwkJICAgICIlczogdG90YWwgbGVuZ3RoID0gJXp1IGJ5dGVzIiwgX19mdW5jX18sIGxlbik7CisJd2hpbGUgKChpIDwgbGVuKSAmJiAoZmFsc2VfZGV0ZWN0ID09IGZhbHNlKSkgeworCQkvKiBFbnN1cmUgd2UgYXQgbGVhc3QgaGF2ZSBmb3VyIGJ5dGVzICovCisJCWlmICgobGVuIC0gaSkgPCBzaXplb2YodGx2X2hkcikpIHsKKwkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19QSFlFUlIgfAorCQkJCSAgICBBVEhfREVCVUdfREZTX1BIWUVSUl9TVU0sCisJCQkJICAgICIlczogcmFuIG91dCBvZiBieXRlcywgbGVuPSV6dSwgaT0lZCIsCisJCQkJICAgIF9fZnVuY19fLCBsZW4sIGkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKgorCQkgKiBDb3B5IHRoZSBvZmZzZXQgaW50byB0aGUgaGVhZGVyLAorCQkgKiBzbyB0aGUgRFdPUkQgc3R5bGUgYWNjZXNzIG1hY3JvcworCQkgKiBjYW4gYmUgdXNlZC4KKwkJICovCisJCU9TX01FTUNQWSgmdGx2X2hkciwgYnVmICsgaSwgc2l6ZW9mKHRsdl9oZHIpKTsKKworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfUEhZRVJSLAorCQkJICAgICIlczogSERSOiBUTFYgU0lHPTB4JXgsIFRBRz0weCV4LCBMRU49JWQgYnl0ZXMiLAorCQkJICAgIF9fZnVuY19fLAorCQkJICAgIE1TKHRsdl9oZHJbVExWX1JFR10sIFRMVl9TSUcpLAorCQkJICAgIE1TKHRsdl9oZHJbVExWX1JFR10sIFRMVl9UQUcpLAorCQkJICAgIE1TKHRsdl9oZHJbVExWX1JFR10sIFRMVl9MRU4pKTsKKworCQkvKgorCQkgKiBTYW5pdHkgY2hlY2sgdGhlIGxlbmd0aCBmaWVsZCBpcyBhdmFpbGFibGUgaW4KKwkJICogdGhlIHJlbWFpbmluZyBmcmFtZS4gIERyb3Agb3V0IGlmIHRoaXMgaXNuJ3QKKwkJICogdGhlIGNhc2UgLSB3ZSBjYW4ndCB0cnVzdCB0aGUgcmVzdCBvZiB0aGUgVExWCisJCSAqIGVudHJpZXMuCisJCSAqLworCQlpZiAoTVModGx2X2hkcltUTFZfUkVHXSwgVExWX0xFTikgKyBpID49IGxlbikgeworCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwKKwkJCQkgICAgIiVzOiBUTFYgb3ZlcnNpemU6IExFTj0lZCwgYXZhaWw9JXp1LCBpPSVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIE1TKHRsdl9oZHJbVExWX1JFR10sIFRMVl9MRU4pLCBsZW4sIGkpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBTa2lwIHRoZSBUTFYgaGVhZGVyIC0gb25lIERXT1JEICovCisJCWkgKz0gc2l6ZW9mKHRsdl9oZHIpOworCisJCS8qIEhhbmRsZSB0aGUgcGF5bG9hZCAqLworCQkvKiBYWFggVE9ETyEgKi8KKwkJc3dpdGNoIChNUyh0bHZfaGRyW1RMVl9SRUddLCBUTFZfU0lHKSkgeworCQljYXNlIFRBR19JRF9SQURBUl9QVUxTRV9TVU1NQVJZOiAgICAvKiBSYWRhciBwdWxzZSBzdW1tYXJ5ICovCisJCQkvKiBYWFggVE9ETyB2ZXJpZnkgcmV0dXJuIHZhbHVlICovCisJCQkvKiBYWFggVE9ETyB2YWxpZGF0ZSBvbmx5IHNlZWluZyBvbmUgb2YgdGhlc2UgKi8KKwkJCXJhZGFyX3N1bW1hcnlfcGFyc2UoZGZzLCBidWYgKyBpLAorCQkJCQkgICAgTVModGx2X2hkcltUTFZfUkVHXSwgVExWX0xFTiksIHJzKTsKKwkJCWJyZWFrOworCQljYXNlIFRBR19JRF9TRUFSQ0hfRkZUX1JFUE9SVDoKKwkJCXJhZGFyX2ZmdF9zZWFyY2hfcmVwb3J0X3BhcnNlKGRmcywgYnVmICsgaSwKKwkJCQkJCSAgICAgIE1TKHRsdl9oZHJbVExWX1JFR10sCisJCQkJCQkJIFRMVl9MRU4pLCByc2ZyKTsKKwkJCS8qCisJCQkgKiB3ZSBleGFtaW5lIHNlYXJjaCBGRlQgcmVwb3J0IGFuZCBtYWtlIHRoZSBmb2xsb3dpbmcKKwkJCSAqIGFzc3VtcHRpb24gYXMgcGVyIGFsZ29yaXRobXMgZ3JvdXAncyBpbnB1dDoKKwkJCSAqICgxKSBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgVExWCisJCQkgKiAoMikgV2UgbWFrZSBmYWxzZSBkZXRlY3Rpb24gZGVjaXNvbiBzb2xlbHkgYmFzZWQgb24KKwkJCSAqIHRoZSBmaXJzdCBUTFYKKwkJCSAqICgzKSBJZiB0aGUgZmlyc3QgVExWIGlzIGEgc2VyY2ggRkZUIHJlcG9ydCB0aGVuIHdlCisJCQkgKiBjaGVjayB0aGUgcGVha19tYWcgdmFsdWUuIFdoZW4gUlNTSSBpcyBlcXVhbCB0bworCQkJICogZGZzLT5hdGhfZGZzX2ZhbHNlX3Jzc0lfdGhyZXMgKGRlZmF1bHQgNTApIGFuZAorCQkJICogcGVha19tYWcgaXMgbGVzcyB0aGFuIDIgKiBkZnMtPmF0aF9kZnNfcGVha19tYWcKKwkJCSAqIChkZWZhdWx0IDQwKSB3ZSB0cmVhdCBpdCBhcyBmYWxzZSBkZXRlY3QuCisJCQkgKiBQbGVhc2Ugbm90ZSB0aGF0IDUwIGlzIG5vdCBhIHRydWUgUlNTSSBlc3RpbWF0ZSwKKwkJCSAqIGJ1dCB2YWx1ZSBpbmRpY2F0ZWQgYnkgSFcgZm9yIFJGIHNhdHVyYXRpb24gZXZlbnQuCisJCQkgKi8KKworCQkJaWYgKChmaXJzdF90bHYgPT0gdHJ1ZSkgJiYKKwkJCSAgICAocnNzaSA9PSBkZnMtPmF0aF9kZnNfZmFsc2VfcnNzaV90aHJlcykgJiYKKwkJCSAgICAocnNmci0+cGVha19tYWcgPCAoMiAqIGRmcy0+YXRoX2Rmc19wZWFrX21hZykpKSB7CisJCQkJZmFsc2VfZGV0ZWN0ID0gdHJ1ZTsKKwkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfUEhZRVJSLAorCQkJCQkgICAgIiVzOiBzZXR0aW5nIGZhbHNlX2RldGVjdCB0byB0cnVlIiwKKwkJCQkJICAgIF9fZnVuY19fKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfUEhZRVJSLAorCQkJCSAgICAiJXM6IHVua25vd24gZW50cnksIFNJRz0weCUwMngiLAorCQkJCSAgICBfX2Z1bmNfXywgTVModGx2X2hkcltUTFZfUkVHXSwgVExWX1NJRykpOworCQl9CisKKwkJLyogU2tpcCB0aGUgcGF5bG9hZCAqLworCQlpICs9IE1TKHRsdl9oZHJbVExWX1JFR10sIFRMVl9MRU4pOworCQlmaXJzdF90bHYgPSBmYWxzZTsKKwl9CisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwgIiVzOiBkb25lIiwgX19mdW5jX18pOworCisJcmV0dXJuIGZhbHNlX2RldGVjdCA/IDAgOiAxOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBjaGFubmVsIGNlbnRyZSBpbiBNSHouCisgKi8KK3N0YXRpYyBpbnQgdGx2X2NhbGNfZnJlcV9pbmZvKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCByeF9yYWRhcl9zdGF0dXMgKnJzKQoreworCXVpbnQzMl90IGNoYW5fY2VudHJlOworCXVpbnQzMl90IGNoYW5fd2lkdGg7CisJaW50IGNoYW5fb2Zmc2V0OworCisJLyoKKwkgKiBGb3Igbm93LCBqdXN0IGhhbmRsZSB1cCB0byBWSFQ4MCBjb3JyZWN0bHkuCisJICovCisJaWYgKGRmcy0+aWMgPT0gTlVMTCB8fCBkZnMtPmljLT5pY19jdXJjaGFuID09IE5VTEwpIHsKKwkJREZTX1BSSU5USygiJXM6IGRmcy0+aWM9JXAsIHRoYXQgb3IgY3VyY2hhbiBpcyBudWxsPyIsCisJCQkgICBfX2Z1bmNfXywgZGZzLT5pYyk7CisJCXJldHVybiAwOworCQkvKgorCQkgKiBGb3Igbm93LCB0aGUgb25seSAxMWFjIGNoYW5uZWwgd2l0aCBmcmVxMS9mcmVxMiBzZXR1cCBpcworCQkgKiBWSFQ4MC4KKwkJICoKKwkJICogWFhYIHNob3VsZCBoYXZlIGEgZmxhZyBtYWNybyB0byBjaGVjayB0aGlzIQorCQkgKi8KKwl9IGVsc2UgaWYgKElFRUU4MDIxMV9JU19DSEFOXzExQUNfVkhUODAoZGZzLT5pYy0+aWNfY3VyY2hhbikpIHsKKwkJLyogMTFBQywgc28gY2ZyZXExL2NmcmVxMiBhcmUgc2V0dXAgKi8KKworCQkvKgorCQkgKiBYWFggaWYgaXQncyA4MCs4MCB0aGlzIHdvbid0IHdvcmsgLSBuZWVkIHRvIHVzZSBzZWcKKwkJICogYXBwcm9wcmlhdGVseSEKKwkJICovCisKKwkJY2hhbl9jZW50cmUgPSBkZnMtPmljLT5pY19jdXJjaGFuLT5pY192aHRvcF9jaF9mcmVxX3NlZzE7CisJfSBlbHNlIHsKKwkJLyogSFQyMC9IVDQwICovCisKKwkJLyoKKwkJICogWFhYIHRoaXMgaXMgaGFyZC1jb2RlZCAtIGl0IHNob3VsZCBiZSA1IG9yIDEwIGZvcgorCQkgKiBoYWxmL3F1YXJ0ZXIgYXBwcm9wcmlhdGVseS4KKwkJICovCisJCWNoYW5fd2lkdGggPSAyMDsKKworCQkvKiBHcmFiIGRlZmF1bHQgY2hhbm5lbCBjZW50cmUgKi8KKwkJY2hhbl9jZW50cmUgPSBpZWVlODAyMTFfY2hhbjJmcmVxKGRmcy0+aWMsIGRmcy0+aWMtPmljX2N1cmNoYW4pOworCisJCS8qIENhbGN1bGF0ZSBvZmZzZXQgYmFzZWQgb24gSFQ0MFUvSFQ0MEQgYW5kIFZIVDQwVS9WSFQ0MEQgKi8KKwkJaWYgKElFRUU4MDIxMV9JU19DSEFOXzExTl9IVDQwUExVUyhkZnMtPmljLT5pY19jdXJjaGFuKSB8fAorCQkgICAgZGZzLT5pYy0+aWNfY3VyY2hhbi0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9WSFQ0MFBMVVMpCisJCQljaGFuX29mZnNldCA9IGNoYW5fd2lkdGg7CisJCWVsc2UgaWYgKElFRUU4MDIxMV9JU19DSEFOXzExTl9IVDQwTUlOVVMoZGZzLT5pYy0+aWNfY3VyY2hhbikgfHwKKwkJCSBkZnMtPmljLT5pY19jdXJjaGFuLT4KKwkJCSBpY19mbGFncyAmIElFRUU4MDIxMV9DSEFOX1ZIVDQwTUlOVVMpCisJCQljaGFuX29mZnNldCA9IC1jaGFuX3dpZHRoOworCQllbHNlCisJCQljaGFuX29mZnNldCA9IDA7CisKKwkJLyogQ2FsY3VsYXRlIG5ldyBfcmVhbF8gY2hhbm5lbCBjZW50cmUgKi8KKwkJY2hhbl9jZW50cmUgKz0gKGNoYW5fb2Zmc2V0IC8gMik7CisJfQorCisJLyoKKwkgKiBYWFggaGFsZi9xdWFydGVyIHJhdGUgc3VwcG9ydCEKKwkgKi8KKworCS8qIFJldHVybiBldl9jaGFuX2NlbnRyZSBpbiBNSHogKi8KKwlyZXR1cm4gY2hhbl9jZW50cmU7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGNlbnRyZSBmcmVxdWVuY3kgYW5kIGxvdy9oaWdoIHJhbmdlIGZvciBhIHJhZGFyIHB1bHNlIGV2ZW50LgorICoKKyAqIFhYWCBUT0RPOiBIYW5kbGUgaGFsZi9xdWFydGVyIHJhdGVzIGNvcnJlY3RseSEKKyAqIFhYWCBUT0RPOiBoYW5kbGUgVkhUMTYwIGNvcnJlY3RseSEKKyAqIFhYWCBUT0RPOiBoYW5kbGUgVkhUODArODAgY29ycmVjdGx5IQorICovCitzdGF0aWMgaW50Cit0bHZfY2FsY19ldmVudF9mcmVxX3B1bHNlKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCByeF9yYWRhcl9zdGF0dXMgKnJzLAorCQkJICB1aW50MzJfdCAqZnJlcV9jZW50cmUsIHVpbnQzMl90ICpmcmVxX2xvLAorCQkJICB1aW50MzJfdCAqZnJlcV9oaSkKK3sKKwlpbnQgY2hhbl93aWR0aDsKKwlpbnQgY2hhbl9jZW50cmU7CisKKwkvKiBGZXRjaCB0aGUgY2hhbm5lbCBjZW50cmUgZnJlcXVlbmN5IGluIE1IeiAqLworCWNoYW5fY2VudHJlID0gdGx2X2NhbGNfZnJlcV9pbmZvKGRmcywgcnMpOworCisJLyogQ29udmVydCB0byBLSHogKi8KKwljaGFuX2NlbnRyZSAqPSAxMDAwOworCisJLyoKKwkgKiBYWFggaGFyZC1jb2RlIGV2ZW50IHdpZHRoIHRvIGJlIDIgKiBiaW4gc2l6ZSBmb3Igbm93OworCSAqIFhYWCB0aGlzIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBjb3JlIGNsb2NrIHNwZWVkCisJICogWFhYIGZvciBoYWxmL3F1YXJ0ZXIgcmF0ZSBtb2RlLgorCSAqLworCWlmIChQRVJFX0lTX09WRVJTQU1QTElORyhkZnMpKQorCQljaGFuX3dpZHRoID0gKDQ0MDAwICogMiAvIDEyOCk7CisJZWxzZQorCQljaGFuX3dpZHRoID0gKDQwMDAwICogMiAvIDEyOCk7CisKKwkvKiBYWFggYWRqdXN0IGNoYW5fd2lkdGggZm9yIGhhbGYvcXVhcnRlciByYXRlISAqLworCisJLyoKKwkgKiBOb3cgd2UgY2FuIGRvIHRoZSBtYXRoIHRvIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgY2hhbm5lbCByYW5nZS4KKwkgKi8KKwkoKmZyZXFfY2VudHJlKSA9ICh1aW50MzJfdCkgKGNoYW5fY2VudHJlICsgcnMtPmZyZXFfb2Zmc2V0KTsKKwkoKmZyZXFfbG8pID0gKHVpbnQzMl90KSAoKGNoYW5fY2VudHJlICsgcnMtPmZyZXFfb2Zmc2V0KQorCQkJCSAtIGNoYW5fd2lkdGgpOworCSgqZnJlcV9oaSkgPSAodWludDMyX3QpICgoY2hhbl9jZW50cmUgKyBycy0+ZnJlcV9vZmZzZXQpCisJCQkJICsgY2hhbl93aWR0aCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoZSBjaGlycCBiYW5kd2lkdGggaW4gS0h6IGlzIGRlZmluZWQgYXM6CisgKgorICogdG90YWxCVyhLSHopID0gZGVsdGFfcGVhayhtZWFuKQorICogICAgKiBbIChiaW4gcmVzb2x1dGlvbiBpbiBLSHopIC8gKHJhZGFyX2ZmdF9sb25nX3BlcmlvZCBpbiB1UykgXQorICogICAgKiBwdWxzZV9kdXJhdGlvbiAodXMpCisgKgorICogVGhlIGJpbiByZXNvbHV0aW9uIGRlcGVuZHMgdXBvbiBvdmVyc2FtcGxpbmcuCisgKgorICogRm9yIG5vdywgd2UgdHJlYXQgdGhlIHJhZGFyX2ZmdF9sb25nX3BlcmlvZCBhcyBhIGhhcmQtY29kZWQgOHVTLgorICovCitzdGF0aWMgaW50Cit0bHZfY2FsY19ldmVudF9mcmVxX2NoaXJwKHN0cnVjdCBhdGhfZGZzICpkZnMsIHN0cnVjdCByeF9yYWRhcl9zdGF0dXMgKnJzLAorCQkJICB1aW50MzJfdCAqZnJlcV9jZW50cmUsIHVpbnQzMl90ICpmcmVxX2xvLAorCQkJICB1aW50MzJfdCAqZnJlcV9oaSkKK3sKKwlpbnQzMl90IGJpbl9yZXNvbHV0aW9uOyAvKiBLSHogKiAxMDAgKi8KKwlpbnQzMl90IHJhZGFyX2ZmdF9sb25nX3BlcmlvZCA9IDg7ICAgICAgLyogbWljcm9zZWNvbmRzICovCisJaW50MzJfdCBkZWx0YV9wZWFrOworCWludDMyX3QgcHVsc2VfZHVyYXRpb247CisJaW50MzJfdCB0b3RhbF9idzsKKwlpbnQzMl90IGNoYW5fY2VudHJlOworCWludDMyX3QgZnJlcV8xLCBmcmVxXzI7CisKKwkvKgorCSAqIEtIeiBpc24ndCBlbm91Z2ggcmVzb2x1dGlvbiBoZXJlIQorCSAqIFNvIHRyZWF0IGl0IGFzIGRlY2ktaGVydHogKDEwSHopIGFuZCBjb252ZXJ0IGJhY2sgdG8gS0h6CisJICogbGF0ZXIuCisJICovCisJaWYgKFBFUkVfSVNfT1ZFUlNBTVBMSU5HKGRmcykpCisJCWJpbl9yZXNvbHV0aW9uID0gKDQ0MDAwICogMTAwKSAvIDEyODsKKwllbHNlCisJCWJpbl9yZXNvbHV0aW9uID0gKDQwMDAwICogMTAwKSAvIDEyODsKKworCWRlbHRhX3BlYWsgPSBycy0+ZGVsdGFfcGVhazsKKwlwdWxzZV9kdXJhdGlvbiA9IHJzLT5wdWxzZV9kdXJhdGlvbjsKKworCXRvdGFsX2J3ID0gZGVsdGFfcGVhayAqIChiaW5fcmVzb2x1dGlvbiAvIHJhZGFyX2ZmdF9sb25nX3BlcmlvZCkgKgorCQkgICBwdWxzZV9kdXJhdGlvbjsKKworCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19QSFlFUlIgfCBBVEhfREVCVUdfREZTX1BIWUVSUl9TVU0sCisJCSAgICAiJXM6IGRlbHRhX3BlYWs9JWQsIHB1bHNlX2R1cmF0aW9uPSVkLCBiaW5fcmVzb2x1dGlvbj0lZC4lZEtIeiwgIgorCQkgICAgInJhZGFyX2ZmdF9sb25nX3BlcmlvZD0lZCwgdG90YWxfYnc9JWQuJWxkS0h6IiwKKwkJICAgIF9fZnVuY19fLAorCQkgICAgZGVsdGFfcGVhaywKKwkJICAgIHB1bHNlX2R1cmF0aW9uLAorCQkgICAgYmluX3Jlc29sdXRpb24gLyAxMDAwLAorCQkgICAgYmluX3Jlc29sdXRpb24gJSAxMDAwLAorCQkgICAgcmFkYXJfZmZ0X2xvbmdfcGVyaW9kLCB0b3RhbF9idyAvIDEwMCwgYWJzKHRvdGFsX2J3ICUgMTAwKSk7CisKKwl0b3RhbF9idyAvPSAxMDA7ICAgICAgICAvKiBiYWNrIHRvIEtIeiAqLworCisJLyogR3JhYiB0aGUgY2hhbm5lbCBjZW50cmUgZnJlcXVlbmN5IGluIE1IeiAqLworCWNoYW5fY2VudHJlID0gdGx2X2NhbGNfZnJlcV9pbmZvKGRmcywgcnMpOworCisJLyogRWFybHkgYWJvcnQhICovCisJaWYgKGNoYW5fY2VudHJlID09IDApIHsKKwkJKCpmcmVxX2NlbnRyZSkgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDb252ZXJ0IHRvIEtIeiAqLworCWNoYW5fY2VudHJlICo9IDEwMDA7CisKKwkvKgorCSAqIHNpZHggaXMgdGhlIHN0YXJ0aW5nIGZyZXF1ZW5jeTsgdG90YWxfYncgaXMgYSBzaWduZWQgdmFsdWUgYW5kCisJICogZm9yIG5lZ2F0aXZlIGNoaXJwcyAoaWUsIG1vdmluZyBkb3duIGluIGZyZXF1ZW5jeSByYXRoZXIgdGhhbiB1cCkKKwkgKiB0aGUgZW5kIGZyZXF1ZW5jeSBtYXkgYmUgbGVzcyB0aGFuIHRoZSBzdGFydCBmcmVxdWVuY3kuCisJICovCisJaWYgKHRvdGFsX2J3ID4gMCkgeworCQlmcmVxXzEgPSBjaGFuX2NlbnRyZSArIHJzLT5mcmVxX29mZnNldDsKKwkJZnJlcV8yID0gY2hhbl9jZW50cmUgKyBycy0+ZnJlcV9vZmZzZXQgKyB0b3RhbF9idzsKKwl9IGVsc2UgeworCQlmcmVxXzEgPSBjaGFuX2NlbnRyZSArIHJzLT5mcmVxX29mZnNldCArIHRvdGFsX2J3OworCQlmcmVxXzIgPSBjaGFuX2NlbnRyZSArIHJzLT5mcmVxX29mZnNldDsKKwl9CisKKwkoKmZyZXFfbG8pID0gKHVpbnQzMl90KSAoZnJlcV8xKTsKKwkoKmZyZXFfaGkpID0gKHVpbnQzMl90KSAoZnJlcV8yKTsKKwkoKmZyZXFfY2VudHJlKSA9ICh1aW50MzJfdCkgKGZyZXFfMSArIChhYnModG90YWxfYncpIC8gMikpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGNlbnRyZSBhbmQgYmFuZCBlZGdlIGZyZXF1ZW5jaWVzIG9mIHRoZSBnaXZlbiByYWRhcgorICogZXZlbnQuCisgKi8KK3N0YXRpYyBpbnQKK3Rsdl9jYWxjX2V2ZW50X2ZyZXEoc3RydWN0IGF0aF9kZnMgKmRmcywgc3RydWN0IHJ4X3JhZGFyX3N0YXR1cyAqcnMsCisJCSAgICB1aW50MzJfdCAqZnJlcV9jZW50cmUsIHVpbnQzMl90ICpmcmVxX2xvLAorCQkgICAgdWludDMyX3QgKmZyZXFfaGkpCit7CisJaWYgKHJzLT5pc19jaGlycCkKKwkJcmV0dXJuIHRsdl9jYWxjX2V2ZW50X2ZyZXFfY2hpcnAoZGZzLCBycywgZnJlcV9jZW50cmUsCisJCQkJCQkgZnJlcV9sbywgZnJlcV9oaSk7CisJZWxzZQorCQlyZXR1cm4gdGx2X2NhbGNfZXZlbnRfZnJlcV9wdWxzZShkZnMsIHJzLCBmcmVxX2NlbnRyZSwKKwkJCQkJCSBmcmVxX2xvLCBmcmVxX2hpKTsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIHB1YmxpYyBmYWNpbmcgZnVuY3Rpb24gd2hpY2ggcGFyc2VzIHRoZSBQSFkgZXJyb3IKKyAqIGFuZCBwb3B1bGF0ZXMgdGhlIGRmc19waHlfZXJyIHN0cnVjdC4KKyAqLworaW50CitkZnNfcHJvY2Vzc19waHllcnJfYmJfdGx2KHN0cnVjdCBhdGhfZGZzICpkZnMsIHZvaWQgKmJ1ZiwgdWludDE2X3QgZGF0YWxlbiwKKwkJCSAgdWludDhfdCByc3NpLCB1aW50OF90IGV4dF9yc3NpLCB1aW50MzJfdCByc190c3RhbXAsCisJCQkgIHVpbnQ2NF90IGZ1bGx0c2YsIHN0cnVjdCBkZnNfcGh5X2VyciAqZSwKKwkJCSAgYm9vbCBlbmFibGVfbG9nKQoreworCXN0cnVjdCByeF9yYWRhcl9zdGF0dXMgcnM7CisJc3RydWN0IHJ4X3NlYXJjaF9mZnRfcmVwb3J0IHJzZnI7CisJc3RhdGljIGludCBpbnZhbGlkX3BoeWVycl9jb3VudDsKKworCU9TX01FTVpFUk8oJnJzLCBzaXplb2YocnMpKTsKKworCS8qCisJICogQWRkIHRoZSBwcGR1X3N0YXJ0L3BwZHVfZW5kIGZpZWxkcyBnaXZlbiB0byB1cyBieSB0aGUgdXBwZXIKKwkgKiBsYXllcnMuICBUaGUgZmlybXdhcmUgZ2l2ZXMgdXMgYSBzdW1tYXJ5IHNldCBvZiBwYXJhbWV0ZXJzIHJhdGhlcgorCSAqIHRoYW4gdGhlIHdob2xlIFBQRFVfU1RBUlQvUFBEVV9FTkQgZGVzY3JpcHRvciBjb250ZW5zdC4KKwkgKi8KKwlycy5yc3NpID0gcnNzaTsKKwlycy5yYXdfdHNmID0gcnNfdHN0YW1wOworCS8qCisJICogVHJ5IHBhcnNpbmcgdGhlIFRMViBzZXQuCisJICovCisJaWYgKCF0bHZfcGFyc2VfZnJhbWUoZGZzLCAmcnMsICZyc2ZyLCBidWYsIGRhdGFsZW4sIHJzc2kpKSB7CisJCWludmFsaWRfcGh5ZXJyX2NvdW50Kys7CisJCS8qCisJCSAqIFByaW50IG9ubHkgYXQgZXZlcnkgMiBwb3dlciB0aW1lcworCQkgKiB0byBhdm9pZCBmbHVzaGluZyBvZiB0aGUga2VybmVsCisJCSAqIGxvZ3MsIHNpbmNlIHRoZSBmcmVxdWVuY3kgb2YKKwkJICogaW52YWxpZCBwaHllcnJvcnMgaXMgdmVyeSBoaWdoCisJCSAqIGluIG5vaXN5IGVudmlyb25tZW50cy4KKwkJICovCisJCWlmICghKGludmFsaWRfcGh5ZXJyX2NvdW50ICYgMHhGRikpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCSIlc1slZF06cGFyc2UgZmFpbGVkIGludmFsaWQgcGh5ZXJyb3IgY250ID0gJWQiLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgaW52YWxpZF9waHllcnJfY291bnQpOworCQl9CisJCXJldHVybiAwOworCX0KKwkvKiBGb3IgZGVidWdnaW5nLCBwcmludCB3aGF0IHdlIGhhdmUgcGFyc2VkICovCisJcmFkYXJfc3VtbWFyeV9wcmludChkZnMsICZycywgZW5hYmxlX2xvZyk7CisKKwkvKiBQb3B1bGF0ZSBkZnNfcGh5X2VyciBmcm9tIHJzICovCisJT1NfTUVNU0VUKGUsIDAsIHNpemVvZigqZSkpOworCWUtPnJzc2kgPSBycy5yc3NpOworCWUtPmR1ciA9IHJzLnB1bHNlX2R1cmF0aW9uOworCWUtPnNpZHggPSBycy5zaWR4OworCWUtPmlzX3ByaSA9IDE7ICAgICAgICAgIC8qIFhYWCBhbHdheXMgUFJJIGZvciBub3cgKi8KKwllLT5pc19leHQgPSAwOworCWUtPmlzX2RjID0gMDsKKwllLT5pc19lYXJseSA9IDA7CisJLyoKKwkgKiBYWFggVE9ETzogYWRkIGEgImNoaXJwIGRldGVjdGlvbiBlbmFibGVkIiBjYXBhYmlsaXR5IG9yIGNvbmZpZworCSAqIGJpdCBzb21ld2hlcmUsIGluIGNhc2UgZm9yIHNvbWUgcmVhc29uIHRoZSBoYXJkd2FyZSBjaGlycAorCSAqIGRldGVjdGlvbiBBTkQgRkZUcyBhcmUgZGlzYWJsZWQuCisJICovCisJLyogRm9yIG5vdywgYXNzdW1lIHRoaXMgaGFyZHdhcmUgYWx3YXlzIGRvZXMgY2hpcnAgZGV0ZWN0aW9uICovCisJZS0+ZG9fY2hlY2tfY2hpcnAgPSAxOworCWUtPmlzX2h3X2NoaXJwID0gISEocnMuaXNfY2hpcnApOworCWUtPmlzX3N3X2NoaXJwID0gMDsgICAgIC8qIFdlIGRvbid0IHlldCBkbyBzb2Z0d2FyZSBjaGlycCBjaGVja2luZyAqLworCisJZS0+ZnVsbHRzZiA9IGZ1bGx0c2Y7CisJZS0+cnNfdHN0YW1wID0gcnMucmF3X3RzZiAtIHJzLnRzZl9vZmZzZXQ7CisKKwkvKiBYWFggZXJyb3IgY2hlY2sgKi8KKwkodm9pZCl0bHZfY2FsY19ldmVudF9mcmVxKGRmcywgJnJzLCAmZS0+ZnJlcSwgJmUtPmZyZXFfbG8sICZlLT5mcmVxX2hpKTsKKworCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19QSFlFUlJfU1VNLAorCQkgICAgIiVzOiBmYmluPSVkLCBmcmVxPSVkLiVkIE1IeiwgcmF3IHRzZj0ldSwgb2Zmc2V0PSVkLCAiCisJCSAgICAiY29va2VkIHRzZj0ldSwgcnNzaT0lZCwgZHVyPSVkLCBpc19jaGlycD0lZCwgZnVsbHRzZj0lbGx1LCAiCisJCSAgICAiZnJlcT0lZC4lZCBNSHosIGZyZXFfbG89JWQuJWRNSHosIGZyZXFfaGk9JWQuJWQgTUh6IiwKKwkJICAgIF9fZnVuY19fLAorCQkgICAgcnMuc2lkeCwKKwkJICAgIChpbnQpKHJzLmZyZXFfb2Zmc2V0IC8gMTAwMCksCisJCSAgICAoaW50KWFicyhycy5mcmVxX29mZnNldCAlIDEwMDApLAorCQkgICAgcnMucmF3X3RzZiwKKwkJICAgIHJzLnRzZl9vZmZzZXQsCisJCSAgICBlLT5yc190c3RhbXAsCisJCSAgICBycy5yc3NpLAorCQkgICAgcnMucHVsc2VfZHVyYXRpb24sCisJCSAgICAoaW50KXJzLmlzX2NoaXJwLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmdWxsdHNmLAorCQkgICAgKGludCllLT5mcmVxIC8gMTAwMCwKKwkJICAgIChpbnQpYWJzKGUtPmZyZXEpICUgMTAwMCwKKwkJICAgIChpbnQpZS0+ZnJlcV9sbyAvIDEwMDAsCisJCSAgICAoaW50KWFicyhlLT5mcmVxX2xvKSAlIDEwMDAsCisJCSAgICAoaW50KWUtPmZyZXFfaGkgLyAxMDAwLCAoaW50KWFicyhlLT5mcmVxX2hpKSAlIDEwMDApOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NhcC9kZnMvc3JjL2Rmc19waHllcnJfdGx2LmggYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19waHllcnJfdGx2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1Mzc1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2FwL2Rmcy9zcmMvZGZzX3BoeWVycl90bHYuaApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkJCWRmc19waHllcnJfdGx2LmgKKworICAgT1ZFUlZJRVc6CisKKyAgIFNvdXJjZSBjb2RlIGJvcnJvd2VkIGZyb20gUUNBX01BSU4gREZTIG1vZHVsZQorCisgICBERVBFTkRFTkNJRVM6CisKKyAgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZuZGVmIF9fREZTX1BIWUVSUl9QRVJFR1JJTkVfSF9fCisjZGVmaW5lIF9fREZTX1BIWUVSUl9QRVJFR1JJTkVfSF9fCisKKy8qCisgKiBSZWdpc3RlciBtYW5pcHVsYXRpb24gbWFjcm9zIHRoYXQgZXhwZWN0IGJpdCBmaWVsZCBkZWZpbmVzCisgKiB0byBmb2xsb3cgdGhlIGNvbnZlbnRpb24gdGhhdCBhbiBfUyBzdWZmaXggaXMgYXBwZW5kZWQgZm9yCisgKiBhIHNoaWZ0IGNvdW50LCB3aGlsZSB0aGUgZmllbGQgbWFzayBoYXMgbm8gc3VmZml4LgorICovCisjZGVmaW5lIFNNKF92LCBfZikgICAgICAoKChfdikgPDwgX2YgIyMgX1MpICYgX2YpCisjZGVmaW5lIE1TKF92LCBfZikgICAgICAoKChfdikgJiBfZikgPj4gX2YgIyMgX1MpCisKKy8qCisgKiBUaGUgVExWIGR3b3JkIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBUTFYgc2VjdGlvbi4KKyAqLworI2RlZmluZSBUTFZfUkVHICAgICAgICAgMHgwMAorCisjZGVmaW5lIFRMVl9MRU4gICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIFRMVl9MRU5fUyAgICAgICAwCisKKyNkZWZpbmUgVExWX1NJRyAgICAgICAgIDB4MDBGRjAwMDAKKyNkZWZpbmUgVExWX1NJR19TICAgICAgIDE2CisKKyNkZWZpbmUgVExWX1RBRyAgICAgICAgIDB4RkYwMDAwMDAKKyNkZWZpbmUgVExWX1RBR19TICAgICAgIDI0CisKKyNkZWZpbmUgVEFHX0lEX1NFQVJDSF9GRlRfUkVQT1JUICAgICAgICAweEZCCisjZGVmaW5lIFRBR19JRF9SQURBUl9QVUxTRV9TVU1NQVJZICAgICAgMHhGOAorLyoKKyAqIFJhZGFyIHB1bHNlIHN1bW1hcnkKKyAqCisgKiArIFRZUEU9MHhGOCAoUmFkYXIgcHVsc2Ugc3VtbWFyeSByZXByb3QpCisgKiArIFNJRz0weEJCIChiYXNlYmFuZCBQSFkgZ2VuZXJhdGVkIFRMViBjb21wb25lbnRzKQorICovCisKKyNkZWZpbmUgUkFEQVJfUkVQT1JUX1BVTFNFX1JFR18xICAgICAgICAweDAwCisKKyNkZWZpbmUgICAgICAgICBSQURBUl9SRVBPUlRfUFVMU0VfSVNfQ0hJUlAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSAgICAgICAgIFJBREFSX1JFUE9SVF9QVUxTRV9JU19DSElSUF9TICAgICAgICAgICAzMQorCisjZGVmaW5lICAgICAgICAgUkFEQVJfUkVQT1JUX1BVTFNFX0lTX01BWF9XSURUSCAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgICAgICAgICBSQURBUl9SRVBPUlRfUFVMU0VfSVNfTUFYX1dJRFRIX1MgICAgICAgMzAKKworI2RlZmluZSAgICAgICAgIFJBREFSX1JFUE9SVF9BR0NfVE9UQUxfR0FJTiAgICAgICAgICAgICAweDNGRjAwMDAwCisjZGVmaW5lICAgICAgICAgUkFEQVJfUkVQT1JUX0FHQ19UT1RBTF9HQUlOX1MgICAgICAgICAgIDIwCisKKyNkZWZpbmUgICAgICAgICBSQURBUl9SRVBPUlRfUFVMU0VfREVMVEFfRElGRiAgICAgICAgICAgMHgwMDBGMDAwMAorI2RlZmluZSAgICAgICAgIFJBREFSX1JFUE9SVF9QVUxTRV9ERUxUQV9ESUZGX1MgICAgICAgICAxNgorCisjZGVmaW5lICAgICAgICAgUkFEQVJfUkVQT1JUX1BVTFNFX0RFTFRBX1BFQUsgICAgICAgICAgIDB4MDAwMEZDMDAKKyNkZWZpbmUgICAgICAgICBSQURBUl9SRVBPUlRfUFVMU0VfREVMVEFfUEVBS19TICAgICAgICAgMTAKKworI2RlZmluZSAgICAgICAgIFJBREFSX1JFUE9SVF9QVUxTRV9TSURYICAgICAgICAgICAgICAgICAweDAwMDAwM0ZGCisjZGVmaW5lICAgICAgICAgUkFEQVJfUkVQT1JUX1BVTFNFX1NJRFhfUyAgICAgICAgICAgICAgIDB4MAorCisjZGVmaW5lIFJBREFSX1JFUE9SVF9QVUxTRV9SRUdfMiAgICAgICAgMHgwMQorCisjZGVmaW5lICAgICAgICAgUkFEQVJfUkVQT1JUX1BVTFNFX1NSQ0hfRkZUX0FfVkFMSUQgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgICAgICAgICBSQURBUl9SRVBPUlRfUFVMU0VfU1JDSF9GRlRfQV9WQUxJRF9TICAgMzEKKworI2RlZmluZSAgICAgICAgIFJBREFSX1JFUE9SVF9QVUxTRV9BR0NfTUJfR0FJTiAgICAgICAgICAweDdGMDAwMDAwCisjZGVmaW5lICAgICAgICAgUkFEQVJfUkVQT1JUX1BVTFNFX0FHQ19NQl9HQUlOX1MgICAgICAgIDI0CisKKyNkZWZpbmUgICAgICAgICBSQURBUl9SRVBPUlRfUFVMU0VfU1VCQ0hBTl9NQVNLICAgICAgICAgMHgwMEZGMDAwMAorI2RlZmluZSAgICAgICAgIFJBREFSX1JFUE9SVF9QVUxTRV9TVUJDSEFOX01BU0tfUyAgICAgICAxNgorCisjZGVmaW5lICAgICAgICAgUkFEQVJfUkVQT1JUX1BVTFNFX1RTRl9PRkZTRVQgICAgICAgICAgIDB4MDAwMEZGMDAKKyNkZWZpbmUgICAgICAgICBSQURBUl9SRVBPUlRfUFVMU0VfVFNGX09GRlNFVF9TICAgICAgICAgOAorCisjZGVmaW5lICAgICAgICAgUkFEQVJfUkVQT1JUX1BVTFNFX0RVUiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgICAgICAgICBSQURBUl9SRVBPUlRfUFVMU0VfRFVSX1MgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIFNFQVJDSF9GRlRfUkVQT1JUX1JFR18xICAgICAweDAwCisKKyNkZWZpbmUgICAgICAgICBTRUFSQ0hfRkZUX1JFUE9SVF9UT1RBTF9HQUlOX0RCICAgICAweEZGODAwMDAwCisjZGVmaW5lICAgICAgICAgU0VBUkNIX0ZGVF9SRVBPUlRfVE9UQUxfR0FJTl9EQl9TICAgMjMKKworI2RlZmluZSAgICAgICAgIFNFQVJDSF9GRlRfUkVQT1JUX0JBU0VfUFdSX0RCICAgICAgIDB4MDA3RkMwMDAKKyNkZWZpbmUgICAgICAgICBTRUFSQ0hfRkZUX1JFUE9SVF9CQVNFX1BXUl9EQl9TICAgICAxNAorCisjZGVmaW5lICAgICAgICAgU0VBUkNIX0ZGVF9SRVBPUlRfRkZUX0NITl9JRFggICAgICAgMHgwMDAwMzAwMAorI2RlZmluZSAgICAgICAgIFNFQVJDSF9GRlRfUkVQT1JUX0ZGVF9DSE5fSURYX1MgICAgIDEyCisKKyNkZWZpbmUgICAgICAgICBTRUFSQ0hfRkZUX1JFUE9SVF9QRUFLX1NJRFggICAgICAgICAweDAwMDAwRkZGCisjZGVmaW5lICAgICAgICAgU0VBUkNIX0ZGVF9SRVBPUlRfUEVBS19TSURYX1MgICAgICAgMAorCisjZGVmaW5lIFNFQVJDSF9GRlRfUkVQT1JUX1JFR18yICAgICAweDAxCisKKyNkZWZpbmUgICAgICAgICBTRUFSQ0hfRkZUX1JFUE9SVF9SRUxQV1JfREIgICAgICAgICAweEZDMDAwMDAwCisjZGVmaW5lICAgICAgICAgU0VBUkNIX0ZGVF9SRVBPUlRfUkVMUFdSX0RCX1MgICAgICAgMjYKKworI2RlZmluZSAgICAgICAgIFNFQVJDSF9GRlRfUkVQT1JUX0FWR1BXUl9EQiAgICAgICAgIDB4MDNGQzAwMDAKKyNkZWZpbmUgICAgICAgICBTRUFSQ0hfRkZUX1JFUE9SVF9BVkdQV1JfREJfUyAgICAgICAxOAorCisjZGVmaW5lICAgICAgICAgU0VBUkNIX0ZGVF9SRVBPUlRfUEVBS19NQUcgICAgICAgICAgMHgwMDAzRkYwMAorI2RlZmluZSAgICAgICAgIFNFQVJDSF9GRlRfUkVQT1JUX1BFQUtfTUFHX1MgICAgICAgIDgKKworI2RlZmluZSAgICAgICAgIFNFQVJDSF9GRlRfUkVQT1JUX05VTV9TVFJfQklOU19JQiAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgICAgICAgICBTRUFSQ0hfRkZUX1JFUE9SVF9OVU1fU1RSX0JJTlNfSUJfUyAwCisKKy8qCisgKiBBbHRob3VnaCB0aGlzIGNvZGUgaXMgbm93IG5vdCBwYXJzaW5nIHRoZSB3aG9sZSBmcmFtZSAoZGVzY3JpcHRvcgorICogYW5kIGFsbCksIHRoZSByZWxldmFudCBmaWVsZHMgYXJlIHN0aWxsIHVzZWZ1bCBpbmZvcm1hdGlvbgorICogZm9yIGFueW9uZSB3aG8gaXMgd29ya2luZyBvbiB0aGUgUEhZIGVycm9yIHBhcnQgb2YgREZTIHBhdHRlcm4KKyAqIG1hdGNoaW5nLgorICoKKyAqIEhvd2V2ZXIsIHRvIHVuZGVyc3RhbmQgX3doZXJlXyB0aGVzZSBkZXNjcmlwdG9ycyBzdGFydCwgeW91CisgKiBzaG91bGQgZG8gc29tZSBkaWdnaW5nIGludG8gdGhlIHBlcmVncmluZSBkZXNjcmlwdG9yIGZvcm1hdC4KKyAqIFRoZSAzMCBzZWNvbmQgdmVyc2lvbjogZWFjaCBSWCByaW5nIGhhcyBhIGJpdG1hcCBsaXN0aW5nIHdoaWNoCisgKiBkZXNjcmlwdG9ycyBhcmUgdG8gYmUgaW5jbHVkZWQsIGFuZCB0aGVuIGEgc2V0IG9mIG9mZnNldHMKKyAqIGludG8gdGhlIFJYIGJ1ZmZlciBmb3Igd2hlcmUgZWFjaCBkZXNjcmlwdG9yIHdpbGwgYmUgd3JpdHRlbi4KKyAqIEl0J3Mgbm90IGxpa2UgdGhlIDgwMi4xMW4gZ2VuZXJhdGlvbiBoYXJkd2FyZSB3aGljaCBoYXMKKyAqIGEgZml4ZWQgZGVzY3JpcHRvciBmb3JtYXQuCisgKi8KKworLyoKKyAqIFJYX1BQRFVfU1RBUlQKKyAqLworI2RlZmluZSBSWF9QUERVX1NUQVJUX0xFTiAgICAgICAgICAgICAgICgxMCo0KQorCisjZGVmaW5lIFJYX1BQRFVfU1RBUlRfUkVHXzQgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lICAgICAgICAgUlhfUFBEVV9TVEFSVF9SU1NJX0NPTUIgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgICAgICAgICBSWF9QUERVX1NUQVJUX1JTU0lfQ09NQl9TICAgICAgICAgICAgICAgMAorCisvKgorICogUlhfUFBEVV9FTkQKKyAqLworI2RlZmluZSBSWF9QUERVX0VORF9MRU4gICAgICAgICAgICAgICAgICgyMSo0KQorCisjZGVmaW5lIFJYX1BQRFVfRU5EX1JFR18xNiAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgICAgICAgICBSWF9QUERVX0VORF9UU0ZfVElNRVNUQU1QICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSAgICAgICAgIFJYX1BQRFVfRU5EX1RTRl9USU1FU1RBTVBfUyAgICAgICAgICAgICAwCisKKyNkZWZpbmUgUlhfUFBEVV9FTkRfUkVHXzE4ICAgICAgICAgICAgICAxOAorI2RlZmluZSAgICAgICAgIFJYX1BQRFVfRU5EX1BIWV9FUlJfQ09ERSAgICAgICAgICAgICAgICAweDAwMDBGRjAwCisjZGVmaW5lICAgICAgICAgUlhfUFBEVV9FTkRfUEhZX0VSUl9DT0RFX1MgICAgICAgICAgICAgIDgKKyNkZWZpbmUgICAgICAgICBSWF9QUERVX0VORF9QSFlfRVJSICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSAgICAgICAgIFJYX1BQRFVfRU5EX1BIWV9FUlJfUyAgICAgICAgICAgICAgICAgICAxNgorCisvKgorICogVGhlIFJTU0kgdmFsdWVzIGNhbiBoYXZlICJzcGVjaWFsIG1lYW5pbmdzIi4KKyAqCisgKiBJZiByc3NpPTUwLCBpdCBtZWFucyB0aGF0IHRoZSBwZWFrIGRldGVjdG9yIHRyaWdnZXJlZC4KKyAqLworI2RlZmluZSBSU1NJX1BFQUtfREVURUNUT1JfU0FUICAgICAgICAgIDUwCisKKy8qCisgKgorICogSWYgcnNzaT0yNSwgaXQgbWVhbnMgdGhhdCB0aGUgQURDIHdhcyBzYXR1cmF0ZWQsIGJ1dCB0aGF0IG9ubHkgaXMKKyAqIHZhbGlkIHdoZW4gdGhlcmUgaXMgb25lIEFEQyBnYWluIGNoYW5nZS4gIEZvciBzaG9ydCBwdWxzZXMgdGhpcworICogaXMgdHJ1ZSAtIHlvdSB3b24ndCBoYXZlIHRpbWUgdG8gZG8gYSBnYWluIGNoYW5nZSBiZWZvcmUgdGhlIHB1bHNlCisgKiBnb2VzIGF3YXkuICBCdXQgZm9yIGxvbmdlciBwdWxzZXMsIEFEQyBnYWluIGNoYW5nZXMgY2FuIG9jY3VyLCBzbworICogeW91J2xsIGdldCBhIG1vcmUgYWNjdXJhdGUgUlNTSSBmaWd1cmUuCisgKgorICogRm9yIHNob3J0IHB1bHNlcyAoYW5kIHRoZSBkZWZpbml0aW9uIG9mICJzaG9ydCIgc3RpbGwgaXNuJ3QgY2xlYXIKKyAqIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcpIHRoZXJlIGlzbid0IGFueSByZWFsIHRpbWUgdG8gZG8gYSBnYWluIGNoYW5nZQorICogKG9yIHR3bywgb3IgdGhyZWUuLikgaW4gb3JkZXIgdG8gZ2V0IGFuIGFjY3VyYXRlIGVzdGltYXRpb24gb2Ygc2lnbmFsCisgKiBzaXppbmcuICBUaHVzLCBSU1NJIHdpbGwgbm90IGJlIHZlcnkgYWNjdXJhdGUgZm9yIHNob3J0IGR1cmF0aW9uIHB1bHNlcy4KKyAqIEFsbCB5b3UgY2FuIHJlYWxseSBzYXkgZm9yIGNlcnRhaW4gaXMgdGhhdCB5ZXMsIHRoZXJlJ3MgYSBwdWxzZSB0aGF0CisgKiBtZXQgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgcHVsc2UgZGV0ZWN0b3IuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgODAyLjExYWMgTWljcm9hcmNoaXRlY3R1cmUgZ3VpZGUuCisgKiAoVE9ETzogYWRkIGEgdHdpa2kgcmVmZXJlbmNlLikKKyAqLworCisjZW5kaWYgLyogX19ERlNfUEhZRVJSX1BFUkVHUklORV9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvc2FwL2Rmcy9zcmMvZGZzX3Byb2Nlc3NfcGh5ZXJyLmMgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19wcm9jZXNzX3BoeWVyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYWJmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19wcm9jZXNzX3BoeWVyci5jCkBAIC0wLDAgKzEsODU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAiZGZzLmgiCisjaW5jbHVkZSAiZGZzX3BoeWVyci5oIiAgICAgICAgIC8qIEZvciBjaGlwLXNwZWNpZmljIHBoeWVyciBmdW5jIGRlY2xhcmF0aW9ucyAqLworLyogVE8gRE8gREZTCisgICAjaW5jbHVkZSA8aWVlZTgwMjExX3Zhci5oPgorICovCisjaWZuZGVmIFVOSU5FVAorLyogVE8gRE8gREZTCisgICAjaW5jbHVkZSA8aWVlZTgwMjExX2NoYW5uZWwuaD4KKyAqLworI2VuZGlmCisjaWZkZWYgQVRIX1NVUFBPUlRfREZTCisKKy8qCisgKiBSZXR1cm4gdGhlIGZyZXF1ZW5jeSB3aWR0aCBmb3IgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwuCisgKgorICogVGhpcyBpc24ndCB0aGUgY2hhbm5lbCB3aWR0aCAtIGl0J3MgaG93IHdpZGUgdGhlIHJlcG9ydGVkIGV2ZW50CisgKiBtYXkgYmUuICBGb3IgSFQyMCB0aGlzIGlzIDIwTUh6LiBGb3IgSFQ0MCBvbiBIb3dsIGFuZCBsYXRlciBpdCdsbAorICogc3RpbGwgYmUgMjBNSHogLSB0aGUgaGFyZHdhcmUgcmV0dXJucyBlaXRoZXIgcHJpIG9yIGV4dCBjaGFubmVsLgorICovCitzdGF0aWMgaW5saW5lIGludCBkZnNfZ2V0X2V2ZW50X2ZyZXF3aWR0aChzdHJ1Y3QgYXRoX2RmcyAqZGZzKQoreworCisJLyogSGFuZGxlIGVkZ2UgY2FzZXMgZHVyaW5nIHN0YXJ0dXAvdHJhbnNpdGlvbiwgc2hvdWxkbid0IGhhcHBlbiEgKi8KKwlpZiAoZGZzID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChkZnMtPmljID09IE5VTEwgfHwgZGZzLT5pYy0+aWNfY3VyY2hhbiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogWFhYIEZvciBub3csIGFzc3VtZSAyME1IeiB3aWRlIC0gYnV0IHRoaXMgaXMgaW5jb3JyZWN0IHdoZW4KKwkgKiBvcGVyYXRpbmcgaW4gaGFsZi9xdWFydGVyIG1vZGUhCisJICovCisJcmV0dXJuIDIwOworfQorCisvKgorICogUmV0dXJuIHRoZSBjZW50cmUgZnJlcXVlbmN5IGZvciB0aGUgY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbCBhbmQKKyAqIGV2ZW50LgorICoKKyAqIFRoaXMgaXMgZm9yIHBvc3QtT3dsIDExbiBjaGlwcyB3aGljaCByZXBvcnQgcHJpL2V4dGVuc2lvbiBjaGFubmVsCisgKiBldmVudHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QKK2Rmc19nZXRfZXZlbnRfZnJlcWNlbnRyZShzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBpbnQgaXNfcHJpLCBpbnQgaXNfZXh0LCBpbnQgaXNfZGMpCit7CisJc3RydWN0IGllZWU4MDIxMWNvbSAqaWM7CisJaW50IGNoYW5fb2Zmc2V0ID0gMCwgY2hhbl93aWR0aDsKKworCS8qIEhhbmRsZSBlZGdlIGNhc2VzIGR1cmluZyBzdGFydHVwL3RyYW5zaXRpb24sIHNob3VsZG4ndCBoYXBwZW4hICovCisJaWYgKGRmcyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoZGZzLT5pYyA9PSBOVUxMIHx8IGRmcy0+aWMtPmljX2N1cmNoYW4gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpYyA9IGRmcy0+aWM7CisKKwkvKgorCSAqCisJICogRm9yIHdpZGUgY2hhbm5lbHMsIERDIGFuZCBleHQgZnJlcXVlbmNpZXMgbmVlZCBhIGJpdCBvZiBoYW5kLWhvbGRpbmcKKwkgKiBiYXNlZCBvbiB3aGV0aGVyIGl0J3MgYW4gdXBwZXIgb3IgbG93ZXIgY2hhbm5lbC4KKwkgKi8KKwljaGFuX3dpZHRoID0gZGZzX2dldF9ldmVudF9mcmVxd2lkdGgoZGZzKTsKKworCWlmIChJRUVFODAyMTFfSVNfQ0hBTl8xMU5fSFQ0MFBMVVMoaWMtPmljX2N1cmNoYW4pKQorCQljaGFuX29mZnNldCA9IGNoYW5fd2lkdGg7CisJZWxzZSBpZiAoSUVFRTgwMjExX0lTX0NIQU5fMTFOX0hUNDBNSU5VUyhpYy0+aWNfY3VyY2hhbikpCisJCWNoYW5fb2Zmc2V0ID0gLWNoYW5fd2lkdGg7CisJZWxzZQorCQljaGFuX29mZnNldCA9IDA7CisKKwkvKgorCSAqIENoZWNrIGZvciBEQyBldmVudHMgZmlyc3QgLSB0aGUgc293bCBjb2RlIG1heSBqdXN0IHNldCBhbGwKKwkgKiB0aGUgYml0cyB0b2dldGhlci4uCisJICovCisJaWYgKGlzX2RjKSB7CisJCS8qCisJCSAqIFhYWCBUT0RPOiBTaG91bGQgREMgZXZlbnRzIGJlIGNvbnNpZGVyZWQgNDBNSHogd2lkZSBoZXJlPworCQkgKi8KKwkJcmV0dXJuIGllZWU4MDIxMV9jaGFuMmZyZXEoaWMsIGljLT5pY19jdXJjaGFuKSArCisJCQkoY2hhbl9vZmZzZXQgLyAyKTsKKwl9CisKKwkvKgorCSAqIEZvciBub24td2lkZSBjaGFubmVscywgdGhlIGNlbnRyZSBmcmVxdWVuY3kgaXMganVzdCBpY19mcmVxLgorCSAqIFRoZSBjZW50cmUgZnJlcXVlbmN5IGZvciBwcmkgZXZlbnRzIGlzIHN0aWxsIGljX2ZyZXEuCisJICovCisJaWYgKGlzX3ByaSkKKwkJcmV0dXJuIGllZWU4MDIxMV9jaGFuMmZyZXEoaWMsIGljLT5pY19jdXJjaGFuKTsKKworCWlmIChpc19leHQpCisJCXJldHVybiBpZWVlODAyMTFfY2hhbjJmcmVxKGljLCBpYy0+aWNfY3VyY2hhbikgKyBjaGFuX3dpZHRoOworCisJLyogWFhYIHNob3VsZG4ndCBnZXQgaGVyZSAqLworCXJldHVybiBpZWVlODAyMTFfY2hhbjJmcmVxKGljLCBpYy0+aWNfY3VyY2hhbik7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIE93bC1zdHlsZSBwaHkgZXJyb3IuCisgKgorICogUmV0dXJuIDEgb24gc3VjY2VzcyBvciAwIG9uIGZhaWx1cmUuCisgKi8KK2ludAorZGZzX3Byb2Nlc3NfcGh5ZXJyX293bChzdHJ1Y3QgYXRoX2RmcyAqZGZzLCB2b2lkICpidWYsIHVpbnQxNl90IGRhdGFsZW4sCisJCSAgICAgICB1aW50OF90IHJzc2ksIHVpbnQ4X3QgZXh0X3Jzc2ksIHVpbnQzMl90IHJzX3RzdGFtcCwKKwkJICAgICAgIHVpbnQ2NF90IGZ1bGx0c2YsIHN0cnVjdCBkZnNfcGh5X2VyciAqZSkKK3sKKwljb25zdCBjaGFyICpjYnVmID0gKGNvbnN0IGNoYXIgKilidWY7CisJdWludDhfdCBkdXI7CisJaW50IGV2ZW50X3dpZHRoOworCisJLyogWFhYIHRoaXMgc2hvdWxkbid0IGJlIGtlcHQgY291bnQgaGVyZSAqLworCWRmcy0+YXRoX2Rmc19zdGF0cy5vd2xfcGh5X2Vycm9ycysrOworCisJLyoKKwkgKiBIVyBjYW5ub3QgZGV0ZWN0IGV4dGVuc2lvbiBjaGFubmVsIHJhZGFyIHNvIGl0IG9ubHkgcGFzc2VzIHVzCisJICogcHJpbWFyeSBjaGFubmVsIHJhZGFyIGRhdGEKKwkgKi8KKwlpZiAoZGF0YWxlbiA9PSAwKQorCQlkdXIgPSAwOworCWVsc2UKKwkJZHVyID0gKCh1aW50OF90ICopIGNidWYpWzBdOworCisJLyoKKwkgKiBUaGlzIGlzIGEgc3B1cmlvdXMgZXZlbnQ7IHRvc3MuCisJICovCisJaWYgKHJzc2kgPT0gMCAmJiBkdXIgPT0gMCkKKwkJZGZzLT5hdGhfZGZzX3N0YXRzLmRhdGFsZW5fZGlzY2FyZHMrKzsKKwlyZXR1cm4gMDsKKworCS8qCisJICogRmlsbCBvdXQgZGZzX3BoeV9lcnIgd2l0aCB0aGUgaW5mb3JtYXRpb24gd2UgaGF2ZQorCSAqIGF0IGhhbmQuCisJICovCisJT1NfTUVNU0VUKGUsIDAsIHNpemVvZigqZSkpOworCWUtPnJzc2kgPSByc3NpOworCWUtPmR1ciA9IGR1cjsKKwllLT5pc19wcmkgPSAxOworCWUtPmlzX2V4dCA9IDA7CisJZS0+aXNfZGMgPSAwOworCWUtPmlzX2Vhcmx5ID0gMTsKKwllLT5mdWxsdHNmID0gZnVsbHRzZjsKKwllLT5yc190c3RhbXAgPSByc190c3RhbXA7CisKKwkvKgorCSAqIE93bCBvbmx5IGV2ZXIgcmVwb3J0cyBldmVudHMgb24gdGhlIHByaW1hcnkgY2hhbm5lbDsKKwkgKiBpdCBkb2Vzbid0IGV2ZW4gc2VlIGV2ZW50cyBvbiB0aGUgc2Vjb25kYXJ5IGNoYW5uZWwuCisJICovCisJZXZlbnRfd2lkdGggPSBkZnNfZ2V0X2V2ZW50X2ZyZXF3aWR0aChkZnMpOworCWUtPmZyZXEgPSBkZnNfZ2V0X2V2ZW50X2ZyZXFjZW50cmUoZGZzLCAxLCAwLCAwKSAqIDEwMDA7CisJZS0+ZnJlcV9sbyA9IGUtPmZyZXEgLSAoZXZlbnRfd2lkdGggLyAyKSAqIDEwMDA7CisJZS0+ZnJlcV9oaSA9IGUtPmZyZXEgKyAoZXZlbnRfd2lkdGggLyAyKSAqIDEwMDA7CisKKwlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfUEhZRVJSX1NVTSwKKwkJIiVzOiByc3NpPSV1IGR1cj0ldSxmcmVxPSVkTUh6LCBmcmVxX2xvPSVkTUh6LCBmcmVxX2hpPSVkTUh6XG4iLAorCQlfX2Z1bmNfXywgcnNzaSwgZHVyLCBlLT5mcmVxIC8gMTAwMCwgZS0+ZnJlcV9sbyAvIDEwMDAsCisJCWUtPmZyZXFfaGkgLyAxMDAwKTsKKworCXJldHVybiAxOworfQorCisvKgorICogUHJvY2VzcyBhIFNvd2wvSG93bCBzdHlsZSBwaHkgZXJyb3IuCisgKi8KK2ludAorZGZzX3Byb2Nlc3NfcGh5ZXJyX3Nvd2woc3RydWN0IGF0aF9kZnMgKmRmcywgdm9pZCAqYnVmLCB1aW50MTZfdCBkYXRhbGVuLAorCQkJdWludDhfdCByc3NpLCB1aW50OF90IGV4dF9yc3NpLCB1aW50MzJfdCByc190c3RhbXAsCisJCQl1aW50NjRfdCBmdWxsdHNmLCBzdHJ1Y3QgZGZzX3BoeV9lcnIgKmUpCit7CisjZGVmaW5lIEVYVF9DSF9SQURBUl9GT1VORCAweDAyCisjZGVmaW5lIFBSSV9DSF9SQURBUl9GT1VORCAweDAxCisjZGVmaW5lIEVYVF9DSF9SQURBUl9FQVJMWV9GT1VORCAweDA0CisJY29uc3QgY2hhciAqY2J1ZiA9IChjb25zdCBjaGFyICopYnVmOworCXVpbnQ4X3QgZHVyID0gMDsKKwl1aW50OF90IHB1bHNlX2J3X2luZm8sIHB1bHNlX2xlbmd0aF9leHQsIHB1bHNlX2xlbmd0aF9wcmk7CisJaW50IHByaV9mb3VuZCA9IDAsIGV4dF9mb3VuZCA9IDA7CisJaW50IGVhcmx5X2V4dCA9IDA7CisJaW50IGV2ZW50X3dpZHRoOworCisJLyoKKwkgKiBJZiByYWRhciBjYW4gYmUgZGV0ZWN0ZWQgb24gdGhlIGV4dGVuc2lvbiBjaGFubmVsLCBkYXRhbGVuIHplcm8KKwkgKiBwdWxzZXMgYXJlIGJvZ3VzLCBkaXNjYXJkIHRoZW0uCisJICovCisJaWYgKCFkYXRhbGVuKSB7CisJCWRmcy0+YXRoX2Rmc19zdGF0cy5kYXRhbGVuX2Rpc2NhcmRzKys7CisJCXJldHVybiAwOworCX0KKworCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3QgdGhyZWUgYnl0ZXMgb2YgcGF5bG9hZCAqLworCWlmIChkYXRhbGVuIDwgMykgeworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsCisJCQkgICAgIiVzOiBzaG9ydCBlcnJvciBmcmFtZSAoJWQgYnl0ZXMpXG4iLAorCQkJICAgIF9fZnVuY19fLCBkYXRhbGVuKTsKKwkJZGZzLT5hdGhfZGZzX3N0YXRzLmRhdGFsZW5fZGlzY2FyZHMrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGZXRjaCB0aGUgcGF5bG9hZCBkaXJlY3RseSAtIHRoZSBjb21waWxlciB3aWxsIGhhcHBpbHkgZ2VuZXJhdGUKKwkgKiBieXRlLXJlYWQgaW5zdHJ1Y3Rpb25zIHdpdGggYSBjb25zdCBjaGFyICogY2J1ZiBwb2ludGVyLgorCSAqLworCXB1bHNlX2xlbmd0aF9wcmkgPSBjYnVmW2RhdGFsZW4gLSAzXTsKKwlwdWxzZV9sZW5ndGhfZXh0ID0gY2J1ZltkYXRhbGVuIC0gMl07CisJcHVsc2VfYndfaW5mbyA9IGNidWZbZGF0YWxlbiAtIDFdOworCisJLyoKKwkgKiBPbmx5IHRoZSBsYXN0IDMgYml0cyBvZiB0aGUgQlcgaW5mbyBhcmUgcmVsZXZhbnQsIHRoZXkgaW5kaWNhdGUKKwkgKiB3aGljaCBjaGFubmVsIHRoZSByYWRhciB3YXMgZGV0ZWN0ZWQgaW4uCisJICovCisJcHVsc2VfYndfaW5mbyAmPSAweDA3OworCisJLyoKKwkgKiBJZiBwdWxzZSBvbiBEQywgYm90aCBwcmltYXJ5IGFuZCBleHRlbnNpb24gZmxhZ3Mgd2lsbCBiZSBzZXQKKwkgKi8KKwlpZiAoKChwdWxzZV9id19pbmZvICYgRVhUX0NIX1JBREFSX0ZPVU5EKSAmJgorCSAgICAgKHB1bHNlX2J3X2luZm8gJiBQUklfQ0hfUkFEQVJfRk9VTkQpKSkgeworCQkvKgorCQkgKiBDb25kdWN0ZWQgdGVzdGluZywgd2hlbiBwdWxzZSBpcyBvbiBEQywgYm90aAorCQkgKiBwcmkgYW5kIGV4dCBkdXJhdGlvbnMgYXJlIHJlcG9ydGVkIHRvIGJlIHNhbWUuCisJCSAqCisJCSAqIFJhZGlhdGVkIHRlc3RpbmcsIHdoZW4gcHVsc2UgaXMgb24gREMsIGRpZmZlcmVudAorCQkgKiBwcmkgYW5kIGV4dCBkdXJhdGlvbnMgYXJlIHJlcG9ydGVkLCBzbyB0YWtlIHRoZQorCQkgKiBsYXJnZXIgb2YgdGhlIHR3bworCQkgKi8KKwkJaWYgKHB1bHNlX2xlbmd0aF9leHQgPj0gcHVsc2VfbGVuZ3RoX3ByaSkgeworCQkJZHVyID0gcHVsc2VfbGVuZ3RoX2V4dDsKKwkJCWV4dF9mb3VuZCA9IDE7CisJCX0gZWxzZSB7CisJCQlkdXIgPSBwdWxzZV9sZW5ndGhfcHJpOworCQkJcHJpX2ZvdW5kID0gMTsKKwkJfQorCQlkZnMtPmF0aF9kZnNfc3RhdHMuZGNfcGh5X2Vycm9ycysrOworCX0gZWxzZSB7CisJCWlmIChwdWxzZV9id19pbmZvICYgRVhUX0NIX1JBREFSX0ZPVU5EKSB7CisJCQlkdXIgPSBwdWxzZV9sZW5ndGhfZXh0OworCQkJcHJpX2ZvdW5kID0gMDsKKwkJCWV4dF9mb3VuZCA9IDE7CisJCQlkZnMtPmF0aF9kZnNfc3RhdHMuZXh0X3BoeV9lcnJvcnMrKzsKKwkJfQorCQlpZiAocHVsc2VfYndfaW5mbyAmIFBSSV9DSF9SQURBUl9GT1VORCkgeworCQkJZHVyID0gcHVsc2VfbGVuZ3RoX3ByaTsKKwkJCXByaV9mb3VuZCA9IDE7CisJCQlleHRfZm91bmQgPSAwOworCQkJZGZzLT5hdGhfZGZzX3N0YXRzLnByaV9waHlfZXJyb3JzKys7CisJCX0KKwkJaWYgKHB1bHNlX2J3X2luZm8gJiBFWFRfQ0hfUkFEQVJfRUFSTFlfRk9VTkQpIHsKKwkJCWR1ciA9IHB1bHNlX2xlbmd0aF9leHQ7CisJCQlwcmlfZm91bmQgPSAwOworCQkJZXh0X2ZvdW5kID0gMTsKKwkJCWVhcmx5X2V4dCA9IDE7CisJCQlkZnMtPmF0aF9kZnNfc3RhdHMuZWFybHlfZXh0X3BoeV9lcnJvcnMrKzsKKwkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19QSFlFUlIsCisJCQkJICAgICJFQVJMWSBleHQgY2hhbm5lbCBkdXI9JXUgcnNzaT0ldSBkYXRhbGVuPSVkXG4iLAorCQkJCSAgICBkdXIsIHJzc2ksIGRhdGFsZW4pOworCQl9CisJCWlmICghcHVsc2VfYndfaW5mbykgeworCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwKKwkJCQkiZHVyPSV1IHJzc2k9JXUgYndfaW5mbz0weCV4IGRhdGFsZW4gPSAlZFxuIiwKKwkJCQlkdXIsIHJzc2ksIHB1bHNlX2J3X2luZm8sIChkYXRhbGVuICYgMHgzKSk7CisJCQkvKgorCQkJICogQm9ndXMgYmFuZHdpZHRoIGluZm8gcmVjZWl2ZWQgaW4gZGVzY3JpcHRvciwKKwkJCSAqIHNvIGlnbm9yZSB0aGlzIFBIWSBlcnJvcgorCQkJICovCisJCQlkZnMtPmF0aF9kZnNfc3RhdHMuYndpbmZvX2Vycm9ycysrOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKgorCSAqIEFsd2F5cyB1c2UgY29tYmluZWQgUlNTSSByZXBvcnRlZCwgdW5sZXNzIFJTU0kgcmVwb3J0ZWQgb24KKwkgKiBleHRlbnNpb24gaXMgc3Ryb25nZXIKKwkgKi8KKwlpZiAoKGV4dF9yc3NpID4gcnNzaSkgJiYgKGV4dF9yc3NpIDwgMTI4KSkKKwkJcnNzaSA9IGV4dF9yc3NpOworCisJLyoKKwkgKiBGaWxsIG91dCB0aGUgcnNzaS9kdXJhdGlvbiBmaWVsZHMgZnJvbSBhYm92ZS4KKwkgKi8KKwlPU19NRU1TRVQoZSwgMCwgc2l6ZW9mKCplKSk7CisJZS0+cnNzaSA9IHJzc2k7CisJZS0+ZHVyID0gZHVyOworCWUtPmlzX3ByaSA9IHByaV9mb3VuZDsKKwllLT5pc19leHQgPSBleHRfZm91bmQ7CisJZS0+aXNfZGMgPSAhISgoKHB1bHNlX2J3X2luZm8gJiBFWFRfQ0hfUkFEQVJfRk9VTkQpICYmCisJCSAgICAgICAocHVsc2VfYndfaW5mbyAmIFBSSV9DSF9SQURBUl9GT1VORCkpKTsKKwllLT5pc19lYXJseSA9IGVhcmx5X2V4dDsKKwllLT5mdWxsdHNmID0gZnVsbHRzZjsKKwllLT5yc190c3RhbXAgPSByc190c3RhbXA7CisKKwkvKgorCSAqIFNvd2wgYW5kIGxhdGVyIGNhbiByZXBvcnQgcHJpL2V4dCBldmVudHMuCisJICovCisJZXZlbnRfd2lkdGggPSBkZnNfZ2V0X2V2ZW50X2ZyZXF3aWR0aChkZnMpOworCWUtPmZyZXEgPSBkZnNfZ2V0X2V2ZW50X2ZyZXFjZW50cmUoZGZzLCBlLT5pc19wcmksIGUtPmlzX2V4dCwgZS0+aXNfZGMpCisJCSAgKiAxMDAwOworCWUtPmZyZXFfbG8gPSBlLT5mcmVxIC0gKGV2ZW50X3dpZHRoIC8gMikgKiAxMDAwOworCWUtPmZyZXFfaGkgPSBlLT5mcmVxICsgKGV2ZW50X3dpZHRoIC8gMikgKiAxMDAwOworCisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUl9TVU0sCisJCSAgICAiJXM6IHB1bHNlX2J3X2luZm89MHgleCBwdWxzZV9sZW5ndGhfZXh0PSV1IHB1bHNlX2xlbmd0aF9wcmk9JXUgIgorCQkgICAgInJzc2k9JXUgZXh0X3Jzc2k9JXUsIGZyZXE9JWQgTUh6LCBmcmVxX2xvPSVkIE1IeiwgIgorCQkgICAgImZyZXFfaGk9JWQgTUh6XG4iLAorCQkgICAgX19mdW5jX18sCisJCSAgICBwdWxzZV9id19pbmZvLAorCQkgICAgcHVsc2VfbGVuZ3RoX2V4dCwKKwkJICAgIHB1bHNlX2xlbmd0aF9wcmksCisJCSAgICByc3NpLAorCQkgICAgZXh0X3Jzc2ksCisJCSAgICBlLT5mcmVxIC8gMTAwMCwgZS0+ZnJlcV9sbyAvIDEwMDAsIGUtPmZyZXFfaGkgLyAxMDAwKTsKKworCXJldHVybiAxOworfQorCisvKgorICogUHJvY2VzcyBhIE1lcmxpbi9Pc3ByZXkgc3R5bGUgcGh5IGVycm9yLgorICovCitpbnQKK2Rmc19wcm9jZXNzX3BoeWVycl9tZXJsaW4oc3RydWN0IGF0aF9kZnMgKmRmcywgdm9pZCAqYnVmLAorCQkJICB1aW50MTZfdCBkYXRhbGVuLCB1aW50OF90IHJzc2ksIHVpbnQ4X3QgZXh0X3Jzc2ksCisJCQkgIHVpbnQzMl90IHJzX3RzdGFtcCwgdWludDY0X3QgZnVsbHRzZiwKKwkJCSAgc3RydWN0IGRmc19waHlfZXJyICplKQoreworCWNvbnN0IGNoYXIgKmNidWYgPSAoY29uc3QgY2hhciAqKWJ1ZjsKKwl1aW50OF90IHB1bHNlX2J3X2luZm8gPSAwOworCisJLyoKKwkgKiBQcm9jZXNzIHVzaW5nIHRoZSBzb3dsIGNvZGUKKwkgKi8KKwlpZiAoIWRmc19wcm9jZXNzX3BoeWVycl9zb3dsKGRmcywgYnVmLCBkYXRhbGVuLCByc3NpLCBleHRfcnNzaSwKKwkJCQkgICAgIHJzX3RzdGFtcCwgZnVsbHRzZiwgZSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGb3Igb3NwcmV5IChhbmQgTWVybGluKSBid19pbmZvIGhhcyBpbXBsaWNhdGlvbiBmb3Igc2VsZWN0aW5nCisJICogUlNTSSB2YWx1ZS4gIFNvIHJlLWZldGNoIHRoZSBid19pbmZvIGZpZWxkIHNvIHRoZSBSU1NJIHZhbHVlcworCSAqIGNhbiBiZSBhcHByb3ByaWF0ZWx5IG92ZXJyaWRkZW4uCisJICovCisJcHVsc2VfYndfaW5mbyA9IGNidWZbZGF0YWxlbiAtIDFdOworCisJc3dpdGNoIChwdWxzZV9id19pbmZvICYgMHgwMykgeworCWNhc2UgMHgwMDoKKwkJLyogTm8gcmFkYXIgaW4gY3RybCBvciBleHQgY2hhbm5lbCAqLworCQlyc3NpID0gMDsKKwkJYnJlYWs7CisJY2FzZSAweDAxOgorCQkvKiByYWRhciBpbiBjdHJsIGNoYW5uZWwgKi8KKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwKKwkJCSAgICAiUkFXIFJTU0k6IHJzc2k9JXUgZXh0X3Jzc2k9JXVcbiIsIHJzc2ksIGV4dF9yc3NpKTsKKwkJaWYgKGV4dF9yc3NpID49IChyc3NpICsgMykpIHsKKwkJCS8qCisJCQkgKiBjYW5ub3QgdXNlIGN0cmwgY2hhbm5lbCBSU1NJIGlmCisJCQkgKiBleHRlbnNpb24gY2hhbm5lbCBpcyBzdHJvbmdlcgorCQkJICovCisJCQlyc3NpID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4MDI6CisJCS8qIHJhZGFyIGluIGV4dGVuc2lvbiBjaGFubmVsICovCisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19QSFlFUlIsCisJCQkgICAgIlJBVyBSU1NJOiByc3NpPSV1IGV4dF9yc3NpPSV1XG4iLCByc3NpLCBleHRfcnNzaSk7CisJCWlmIChyc3NpID49IChleHRfcnNzaSArIDEyKSkgeworCQkJLyoKKwkJCSAqIGNhbm5vdCB1c2UgZXh0ZW5zaW9uIGNoYW5uZWwgUlNTSSBpZiBjb250cm9sIGNoYW5uZWwKKwkJCSAqIGlzIHN0cm9uZ2VyCisJCQkgKi8KKwkJCXJzc2kgPSAwOworCQl9IGVsc2UgeworCQkJcnNzaSA9IGV4dF9yc3NpOworCQl9CisJCWJyZWFrOworCWNhc2UgMHgwMzoKKwkJLyogd2hlbiBib3RoIGFyZSBwcmVzZW50IHVzZSBzdHJvbmdlciBvbmUgKi8KKwkJaWYgKHJzc2kgPCBleHRfcnNzaSkKKwkJCXJzc2kgPSBleHRfcnNzaTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBPdmVycmlkZSB0aGUgcnNzaSBkZWNpc2lvbiBtYWRlIGJ5IHRoZSBzb3dsIGNvZGUuCisJICogVGhlIHJlc3Qgb2YgdGhlIGZpZWxkcyAoZHVyYXRpb24sIHRpbWVzdGFtcCwgZXRjKQorCSAqIGFyZSBsZWZ0IHVudG91Y2hlZC4KKwkgKi8KKwllLT5yc3NpID0gcnNzaTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3BoeWVycl9jb250ZW50cyhjb25zdCBjaGFyICpkLCBpbnQgbGVuKQoreworI2lmZGVmIENPTkZJR19FTkFCTEVfRFVNUF9QSFlFUlJfQ09OVEVOVFMKKwlpbnQgaSwgbiwgYnVmc2l6ZSA9IDY0OworCisJLyoKKwkgKiBUaGlzIGlzIHN0YXRpY2FsbHkgc2l6ZWQgZm9yIGEgNC1kaWdpdCBhZGRyZXNzICsgMTYgKiAyIGRpZ2l0CisJICogZGF0YSBzdHJpbmcuCisJICoKKwkgKiBJdCdzIGRvbmUgc28gdGhlIHByaW50aygpIHBhc3NlZCB0byB0aGUga2VybmVsIGlzIGFuIGVudGlyZQorCSAqIGxpbmUsIHNvIHRoZSBrZXJuZWwgbG9nZ2luZyBjb2RlIHdpbGwgYXRvbWljYWxseSBwcmludCBpdC4KKwkgKiBPdGhlcndpc2Ugd2UnbGwgZW5kIHVwIHdpdGggaW50ZXJsZWF2ZWQgbGluZXMgd2l0aCBvdXRwdXQKKwkgKiBmcm9tIG90aGVyIGtlcm5lbCB0aHJlYWRzLgorCSAqLworCWNoYXIgYnVmWzY0XTsKKworCS8qIEluaXRpYWwgY29uZGl0aW9ucyAqLworCWJ1ZlswXSA9ICdcbic7CisJbiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGkgJSAxNiA9PSAwKQorCQkJbiArPSBzbnByaW50ZihidWYgKyBuLCBidWZzaXplIC0gbiwgIiUwNHg6ICIsIGkpOworCQluICs9IHNucHJpbnRmKGJ1ZiArIG4sIGJ1ZnNpemUgLSBuLCAiJTAyeCAiLCBkW2ldICYgMHhmZik7CisJCWlmIChpICUgMTYgPT0gMTUpIHsKKwkJCW4gPSAwOworCQkJYnVmWzBdID0gJ1wwJzsKKwkJfQorCX0KKworCS8qCisJICogUHJpbnQgdGhlIGZpbmFsIGxpbmUgaWYgd2UgZGlkbid0IHByaW50IGl0IGFib3ZlLgorCSAqLworCWlmIChuICE9IDApCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogJXNcbiIsCisJCQkgIF9fZnVuY19fLCBidWYpOworI2VuZGlmIC8qIGRlZiBDT05GSUdfRU5BQkxFX0RVTVBfUEhZRVJSX0NPTlRFTlRTICovCit9CisKK3ZvaWQKK2Rmc19wcm9jZXNzX3BoeWVycihzdHJ1Y3QgaWVlZTgwMjExY29tICppYywgdm9pZCAqYnVmLCB1aW50MTZfdCBkYXRhbGVuLAorCQkgICB1aW50OF90IHJfcnNzaSwgdWludDhfdCByX2V4dF9yc3NpLCB1aW50MzJfdCByX3JzX3RzdGFtcCwKKwkJICAgdWludDY0X3Qgcl9mdWxsdHNmLCBib29sIGVuYWJsZV9sb2cpCit7CisJc3RydWN0IGF0aF9kZnMgKmRmcyA9IChzdHJ1Y3QgYXRoX2RmcyAqKWljLT5pY19kZnM7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuID0gaWMtPmljX2N1cmNoYW47CisJc3RydWN0IGRmc19ldmVudCAqZXZlbnQ7CisJc3RydWN0IGRmc19waHlfZXJyIGU7CisJaW50IGVtcHR5OworCisJaWYgKGRmcyA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHNjX2RmcyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlkZnMtPmRmc19waHllcnJfY291bnQrKzsKKwlkdW1wX3BoeWVycl9jb250ZW50cyhidWYsIGRhdGFsZW4pOworCS8qCisJICogWFhYIFRoZSBjb21iaW5lZF9yc3NpX29rIHN1cHBvcnQgaGFzIGJlZW4gcmVtb3ZlZC4KKwkgKiBUaGlzIHdhcyBvbmx5IGNsZWFyIGZvciBPd2wuCisJICoKKwkgKiBYWFggVE9ETzogcmUtYWRkIHRoaXM7IGl0IHJlcXVpcmVzIHBhc3NpbmcgaW4gdGhlIGN0bC9leHQKKwkgKiBSU1NJIHNldCBmcm9tIHRoZSBSWCBzdGF0dXMgZGVzY3JpcHRvci4KKwkgKgorCSAqIFhYWCBUT0RPIFRPRE86IHRoaXMgbWF5IGJlIGRvbmUgZm9yIHVzIGZyb20gdGhlIGxlZ2FjeQorCSAqIHBoeSBlcnJvciBwYXRoIGluIGF0aF9kZXY7IHBsZWFzZSByZXZpZXcgdGhhdCBjb2RlLgorCSAqLworCisJLyoKKwkgKiBBdCB0aGlzIHRpbWUgd2UgaGF2ZSBhIHJhZGFyIHB1bHNlIHRoYXQgd2UgbmVlZCB0byBleGFtaW5lIGFuZAorCSAqIHF1ZXVlLiBCdXQgaWYgZGZzX3Byb2Nlc3NfcmFkYXJldmVudCBhbHJlYWR5IGRldGVjdGVkIHJhZGFyIGFuZCBzZXQKKwkgKiBDSEFOTkVMX0lOVEVSRkVSRU5DRSBmbGFnIHRoZW4gZG8gbm90IHF1ZXVlIGFueSBtb3JlIHJhZGFyIGRhdGEuCisJICogV2hlbiB3ZSBhcmUgaW4gYSBuZXcgY2hhbm5lbCB0aGlzIGZsYWcgd2lsbCBiZSBjbGVhciBhbmQgd2Ugd2lsbAorCSAqIHN0YXJ0IHF1ZXVlaW5nIGRhdGEgZm9yIG5ldyBjaGFubmVsLiAoRVY3NDE2MikKKwkgKi8KKwlpZiAoZGZzLT5kZnNfZGVidWdfbWFzayAmIEFUSF9ERUJVR19ERlNfUEhZRVJSX1BLVCkKKwkJZHVtcF9waHllcnJfY29udGVudHMoYnVmLCBkYXRhbGVuKTsKKworCWlmIChjaGFuID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogY2hhbiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoSUVFRTgwMjExX0lTX0NIQU5fUkFEQVIoY2hhbikpIHsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMSwKKwkJCSAgICAiJXM6IFJhZGFyIGFscmVhZHkgZm91bmQgaW4gdGhlIGNoYW5uZWwsICIKKwkJCSAgICAiIGRvIG5vdCBxdWV1ZSByYWRhciBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlkZnMtPmF0aF9kZnNfc3RhdHMudG90YWxfcGh5X2Vycm9ycysrOworCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzIsCisJCSAgICAiJXNbJWRdIHBoeWVyciAlZCBsZW4gJWRcbiIsCisJCSAgICBfX2Z1bmNfXywgX19MSU5FX18sCisJCSAgICBkZnMtPmF0aF9kZnNfc3RhdHMudG90YWxfcGh5X2Vycm9ycywgZGF0YWxlbik7CisKKwkvKgorCSAqIGhhcmR3YXJlIHN0b3JlcyB0aGlzIGFzIDggYml0IHNpZ25lZCB2YWx1ZS4KKwkgKiB3ZSB3aWxsIGNhcCBpdCBhdCAwIGlmIGl0IGlzIGEgbmVnYXRpdmUgbnVtYmVyCisJICovCisJaWYgKHJfcnNzaSAmIDB4ODApCisJCXJfcnNzaSA9IDA7CisKKwlpZiAocl9leHRfcnNzaSAmIDB4ODApCisJCXJfZXh0X3Jzc2kgPSAwOworCisJT1NfTUVNU0VUKCZlLCAwLCBzaXplb2YoZSkpOworCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IGV2aWwgLSBpbnN0ZWFkIG9mIGp1c3QgcGFzc2luZyBpbgorCSAqIHRoZSBjaGlwIHZlcnNpb24sIHRoZSBleGlzdGluZyBjb2RlIHVzZXMgYSBzZXQKKwkgKiBvZiBIQUwgY2FwYWJpbGl0eSBiaXRzIHRvIGRldGVybWluZSB3aGF0IGlzCisJICogcG9zc2libGUuCisJICoKKwkgKiBUaGUgd2F5IEknbSBkZWNvZGluZyBpdCBpcyB0aHVzOgorCSAqCisJICogKyBERlMgZW5oYW5jZW1lbnQ/IE1lcmxpbiBvciBsYXRlcgorCSAqICsgREZTIGV4dGVuc2lvbiBjaGFubmVsPyBTb3dsIG9yIGxhdGVyLiAoSG93bD8pCisJICogKyBvdGhlcndpc2UsIE93bCAoYW5kIGxlZ2FjeS4pCisJICovCisJaWYgKGRmcy0+ZGZzX2NhcHMuYXRoX2NoaXBfaXNfYmJfdGx2KSB7CisJCWlmIChkZnNfcHJvY2Vzc19waHllcnJfYmJfdGx2KGRmcywgYnVmLCBkYXRhbGVuLCByX3Jzc2ksCisJCQkJCSAgICAgIHJfZXh0X3Jzc2ksIHJfcnNfdHN0YW1wLAorCQkJCQkgICAgICByX2Z1bGx0c2YsICZlLAorCQkJCQkgICAgICBlbmFibGVfbG9nKSA9PSAwKSB7CisJCQlkZnMtPmRmc19waHllcnJfcmVqZWN0X2NvdW50Kys7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlpZiAoZGZzLT5kZnNfcGh5ZXJyX2ZyZXFfbWluID4gZS5mcmVxKQorCQkJCWRmcy0+ZGZzX3BoeWVycl9mcmVxX21pbiA9IGUuZnJlcTsKKworCQkJaWYgKGRmcy0+ZGZzX3BoeWVycl9mcmVxX21heCA8IGUuZnJlcSkKKwkJCQlkZnMtPmRmc19waHllcnJfZnJlcV9tYXggPSBlLmZyZXE7CisJCX0KKwl9IGVsc2UgaWYgKGRmcy0+ZGZzX2NhcHMuYXRoX2Rmc191c2VfZW5oYW5jZW1lbnQpIHsKKwkJaWYgKGRmc19wcm9jZXNzX3BoeWVycl9tZXJsaW4oZGZzLCBidWYsIGRhdGFsZW4sIHJfcnNzaSwKKwkJCQkJICAgICAgcl9leHRfcnNzaSwgcl9yc190c3RhbXAsCisJCQkJCSAgICAgIHJfZnVsbHRzZiwgJmUpID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSBpZiAoZGZzLT5kZnNfY2Fwcy5hdGhfZGZzX2V4dF9jaGFuX29rKSB7CisJCWlmIChkZnNfcHJvY2Vzc19waHllcnJfc293bChkZnMsIGJ1ZiwgZGF0YWxlbiwgcl9yc3NpLAorCQkJCQkgICAgcl9leHRfcnNzaSwgcl9yc190c3RhbXAsIHJfZnVsbHRzZiwKKwkJCQkJICAgICZlKSA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZGZzX3Byb2Nlc3NfcGh5ZXJyX293bChkZnMsIGJ1ZiwgZGF0YWxlbiwgcl9yc3NpLAorCQkJCQkgICByX2V4dF9yc3NpLCByX3JzX3RzdGFtcCwgcl9mdWxsdHNmLAorCQkJCQkgICAmZSkgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiXG4gJXM6IEZyZXF1ZW5jeSBhdCB3aGljaCB0aGUgcGh5ZXJyb3Igd2FzIGluamVjdGVkID0gJWQiLAorCQkgIF9fZnVuY19fLCBlLmZyZXEpOworCS8qCisJICogSWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIHJhZGFyIHJlcG9ydGluZyBvbiB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwKKwkgKiBpdCB3aWxsIHN1cHBseSBGRlQgZGF0YSBmb3IgbG9uZ2VyIHJhZGFyIHB1bHNlcy4KKwkgKgorCSAqIFRMViBjaGlwcyBkb24ndCBnbyB0aHJvdWdoIHRoaXMgc29mdHdhcmUgY2hlY2sgLSB0aGUgaGFyZHdhcmUKKwkgKiBjaGVjayBzaG91bGQgYmUgZW5vdWdoLiAgSWYgd2Ugd2FudCB0byBkbyBzb2Z0d2FyZSBjaGVja2luZworCSAqIGxhdGVyIG9uIHRoZW4gc29tZW9uZSB3aWxsIGhhdmUgdG8gY3JhZnQgYW4gRkZUIHBhcnNlcgorCSAqIHN1aXRhYmxlIGZvciB0aGUgVExWIEZGVCBkYXRhIGZvcm1hdC4KKwkgKi8KKwlpZiAoKCFkZnMtPmRmc19jYXBzLmF0aF9jaGlwX2lzX2JiX3RsdikgJiYKKwkgICAgZGZzLT5kZnNfY2Fwcy5hdGhfZGZzX2V4dF9jaGFuX29rKSB7CisJCS8qCisJCSAqIEhXIGhhcyBhIGtub3duIGlzc3VlIHdpdGggY2hpcnBpbmcgcHVsc2VzIGluamVjdGVkIGF0IG9yCisJCSAqIGFyb3VuZCBEQyBpbiA0ME1IeiBtb2RlLiBTdWNoIHB1bHNlcyBhcmUgcmVwb3J0ZWQgd2l0aAorCQkgKiBtdWNoIGxvd2VyIGR1cmF0aW9ucyBhbmQgU1cgdGhlbiBkaXNjYXJkcyB0aGVtIGJlY2F1c2UKKwkJICogdGhleSBkbyBub3QgZml0IHRoZSBtaW5pbXVtIGJpbjUgcHVsc2UgZHVyYXRpb24uCisJCSAqCisJCSAqIFRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUsIGlmIGEgcHVsc2UgaXMgd2l0aGluIGEgMTB1cworCQkgKiByYW5nZSBvZiB0aGUgYmluNSBtaW4gZHVyYXRpb24sIGNoZWNrIGlmIHRoZSBwdWxzZSBpcworCQkgKiBjaGlycGluZy4gSWYgdGhlIHB1bHNlIGlzIGNoaXJwaW5nLCBidW1wIHVwIHRoZSBkdXJhdGlvbgorCQkgKiB0byB0aGUgbWluaW11bSBiaW41IGR1cmF0aW9uLgorCQkgKgorCQkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBhIHZhbGlkIGNoaXJwaW5nIHB1bHNlIHdpbGwgbm90IGJlCisJCSAqIGRpc2NhcmRlZCBiZWNhdXNlIG9mIGluY29ycmVjdCBsb3cgZHVyYXRpb24uCisJCSAqCisJCSAqIFRCRCAtIElzIGl0IHBvc3NpYmxlIHRvIGNhbGN1bGF0ZSB0aGUgJ3JlYWwnIGR1cmF0aW9uIG9mCisJCSAqIHRoZSBwdWxzZSB1c2luZyB0aGUgc2xvcGUgb2YgdGhlIEZGVCBkYXRhPworCQkgKgorCQkgKiBUQkQgLSBVc2UgRkZUIGRhdGEgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHJhZGFyIHB1bHNlcworCQkgKiBhbmQgZmFsc2UgUEhZIGVycm9ycy4KKwkJICogVGhpcyB3aWxsIGxldCB1cyByZWR1Y2UgdGhlIG51bWJlciBvZiBmYWxzZSBhbGFybXMgc2Vlbi4KKwkJICoKKwkJICogQklOIDUgY2hpcnBpbmcgcHVsc2VzIGFyZSBvbmx5IGZvciBGQ0Mgb3IgSmFwYW4gTU1LNCBkb21haW4KKwkJICovCisJCWlmICgoKGRmcy0+ZGZzZG9tYWluID09IERGU19GQ0NfRE9NQUlOKSB8fAorCQkgICAgIChkZnMtPmRmc2RvbWFpbiA9PSBERlNfTUtLNF9ET01BSU4pKSAmJgorCQkgICAgKGUuZHVyID49IE1BWUJFX0JJTjVfRFVSKSAmJiAoZS5kdXIgPCBNQVhfQklONV9EVVIpKSB7CisJCQlpbnQgYWRkX2R1cjsKKwkJCWludCBzbG9wZSA9IDAsIGRjX2ZvdW5kID0gMDsKKworCQkJLyoKKwkJCSAqIFNldCB0aGUgZXZlbnQgY2hpcnBpbmcgZmxhZ3M7IGFzIHdlJ3JlIGRvaW5nCisJCQkgKiBhbiBhY3R1YWwgY2hpcnAgY2hlY2suCisJCQkgKi8KKwkJCWUuZG9fY2hlY2tfY2hpcnAgPSAxOworCQkJZS5pc19od19jaGlycCA9IDA7CisJCQllLmlzX3N3X2NoaXJwID0gMDsKKworCQkJLyoKKwkJCSAqIGRmc19jaGVja19jaGlycGluZygpIGV4cGVjdHMgaXNfcHJpIGFuZCBpc19leHQKKwkJCSAqIHRvIGJlICcxJyBmb3IgdHJ1ZSBhbmQgJzAnIGZvciBmYWxzZSBmb3Igbm93LAorCQkJICogYXMgdGhlIGZ1bmN0aW9uIGl0c2VsZiB1c2VzIHRoZXNlIHZhbHVlcyBpbgorCQkJICogY29uc3RydWN0aW5nIHRoaW5ncyByYXRoZXIgdGhhbiB0ZXN0aW5nIHRoZW0KKwkJCSAqIGZvciAndHJ1ZScgb3IgJ2ZhbHNlJy4KKwkJCSAqLworCQkJYWRkX2R1ciA9IGRmc19jaGVja19jaGlycGluZyhkZnMsIGJ1ZiwgZGF0YWxlbiwKKwkJCQkJCSAgICAgKGUuaXNfcHJpID8gMSA6IDApLAorCQkJCQkJICAgICAoZS5pc19leHQgPyAxIDogMCksCisJCQkJCQkgICAgICZzbG9wZSwgJmRjX2ZvdW5kKTsKKwkJCWlmIChhZGRfZHVyKSB7CisJCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTX1BIWUVSUiwKKwkJCQkJICAgICJvbGQgZHVyICVkIHNsb3BlID0lZFxuIiwgZS5kdXIsCisJCQkJCSAgICBzbG9wZSk7CisJCQkJZS5pc19zd19jaGlycCA9IDE7CisJCQkJLyogYnVtcCB1cCB0byBhIHJhbmRvbSBiaW41IHB1bHNlIGR1cmF0aW9uICovCisJCQkJaWYgKGUuZHVyIDwgTUlOX0JJTjVfRFVSKSB7CisJCQkJCWUuZHVyID0gZGZzX2dldF9yYW5kb21fYmluNV9kdXIoZGZzLAorCQkJCQkJCWUuZnVsbHRzZik7CisJCQkJfQorCQkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19QSFlFUlIsCisJCQkJCSAgICAibmV3IGR1ciAlZFxuIiwgZS5kdXIpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBzZXQgdGhlIGR1cmF0aW9uIHNvIHRoYXQgaXQgaXMgcmVqZWN0ZWQgKi8KKwkJCQllLmlzX3N3X2NoaXJwID0gMDsKKwkJCQllLmR1ciA9IE1BWF9CSU41X0RVUiArIDEwMDsKKwkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfUEhZRVJSLAorCQkJCQkJImlzX2NoaXJwaW5nID0gJWQgZHVyPSVkXG4iLAorCQkJCQkJYWRkX2R1ciwgZS5kdXIpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIGhhdmUgYSBwdWxzZSB0aGF0IGlzIGVpdGhlciBiaWdnZXIgdGhhbgorCQkJICogTUFYX0JJTjVfRFVSIG9yICogbGVzcyB0aGFuIE1BWUJFX0JJTjVfRFVSCisJCQkgKi8KKwkJCWlmICgoZGZzLT5kZnNkb21haW4gPT0gREZTX0ZDQ19ET01BSU4pIHx8CisJCQkgICAgKGRmcy0+ZGZzZG9tYWluID09IERGU19NS0s0X0RPTUFJTikpIHsKKwkJCQkvKgorCQkJCSAqIFhYWCBXb3VsZCB0aGlzIHJlc3VsdCBpbiB2ZXJ5IGxhcmdlIHB1bHNlcworCQkJCSAqICAgICB3cmFwcGluZyBhcm91bmQgdG8gYmVjb21lIHNob3J0IHB1bHNlcz8KKwkJCQkgKi8KKwkJCQlpZiAoZS5kdXIgPj0gTUFYX0JJTjVfRFVSKSB7CisJCQkJCS8qCisJCQkJCSAqIHNldCB0aGUgZHVyYXRpb24gc28gdGhhdCBpdCBpcworCQkJCQkgKiByZWplY3RlZAorCQkJCQkgKi8KKwkJCQkJZS5kdXIgPSBNQVhfQklONV9EVVIgKyA1MDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEFkZCB0aGUgcGFyc2VkLCBjaGVja2VkIGFuZCBmaWx0ZXJlZCBlbnRyeSB0byB0aGUgcmFkYXIgcHVsc2UKKwkgKiBldmVudCBsaXN0LiAgVGhpcyBpcyB0aGVuIGNoZWNrZWQgYnkgZGZzX3JhZGFyX3Byb2Nlc3NldmVudCgpLgorCSAqCisJICogWFhYIFRPRE86IHNvbWUgZmlsdGVyaW5nIGlzIHN0aWxsIGRvbmUgYmVsb3cgdGhpcyBwb2ludCAtIGZpeAorCSAqIFhYWCB0aGlzIQorCSAqLworCUFUSF9ERlNFVkVOVFFfTE9DSyhkZnMpOworCWVtcHR5ID0gU1RBSUxRX0VNUFRZKCYoZGZzLT5kZnNfZXZlbnRxKSk7CisJQVRIX0RGU0VWRU5UUV9VTkxPQ0soZGZzKTsKKwlpZiAoZW1wdHkpIHsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgdGhlIGNoYW5uZWwgaXMgYSB0dXJibyBHIGNoYW5uZWwsIHRoZW4gdGhlIGV2ZW50IGlzCisJICogZm9yIHRoZSBhZGFwdGl2ZSByYWRpbyAoQVIpIHBhdHRlcm4gbWF0Y2hpbmcgcmF0aGVyIHRoYW4KKwkgKiByYWRhciBkZXRlY3Rpb24uCisJICovCisJaWYgKChjaGFuLT5pY19mbGFncyAmIENIQU5ORUxfMTA4RykgPT0gQ0hBTk5FTF8xMDhHKSB7CisJCWlmICghKGRmcy0+ZGZzX3Byb2NfcGh5ZXJyICYgREZTX0FSX0VOKSkgeworCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJCQkgICAgIiVzOiBERlNfQVJfRU4gbm90IGVuYWJsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCQlBVEhfREZTRVZFTlRRX0xPQ0soZGZzKTsKKwkJZXZlbnQgPSBTVEFJTFFfRklSU1QoJihkZnMtPmRmc19ldmVudHEpKTsKKwkJaWYgKGV2ZW50ID09IE5VTEwpIHsKKwkJCUFUSF9ERlNFVkVOVFFfVU5MT0NLKGRmcyk7CisJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsCisJCQkJICAgICIlczogbm8gbW9yZSBldmVudHMgc3BhY2UgbGVmdFxuIiwKKwkJCQkgICAgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisJCVNUQUlMUV9SRU1PVkVfSEVBRCgmKGRmcy0+ZGZzX2V2ZW50cSksIHJlX2xpc3QpOworCQlBVEhfREZTRVZFTlRRX1VOTE9DSyhkZnMpOworCQlldmVudC0+cmVfcnNzaSA9IGUucnNzaTsKKwkJZXZlbnQtPnJlX2R1ciA9IGUuZHVyOworCQlldmVudC0+cmVfZnVsbF90cyA9IGUuZnVsbHRzZjsKKwkJZXZlbnQtPnJlX3RzID0gKGUucnNfdHN0YW1wKSAmIERGU19UU01BU0s7CisJCWV2ZW50LT5yZV9jaGFuaW5kZXggPSBkZnMtPmRmc19jdXJjaGFuX3JhZGluZGV4OworCQlldmVudC0+cmVfZmxhZ3MgPSAwOworCQlldmVudC0+c2lkeCA9IGUuc2lkeDsKKworCQkvKgorCQkgKiBIYW5kbGUgY2hpcnAgZmxhZ3MuCisJCSAqLworCQlpZiAoZS5kb19jaGVja19jaGlycCkgeworCQkJZXZlbnQtPnJlX2ZsYWdzIHw9IERGU19FVkVOVF9DSEVDS0NISVJQOworCQkJaWYgKGUuaXNfaHdfY2hpcnApCisJCQkJZXZlbnQtPnJlX2ZsYWdzIHw9IERGU19FVkVOVF9IV19DSElSUDsKKwkJCWlmIChlLmlzX3N3X2NoaXJwKQorCQkJCWV2ZW50LT5yZV9mbGFncyB8PSBERlNfRVZFTlRfU1dfQ0hJUlA7CisJCX0KKworCQlBVEhfQVJRX0xPQ0soZGZzKTsKKwkJU1RBSUxRX0lOU0VSVF9UQUlMKCYoZGZzLT5kZnNfYXJxKSwgZXZlbnQsIHJlX2xpc3QpOworCQlBVEhfQVJRX1VOTE9DSyhkZnMpOworCX0gZWxzZSB7CisJCWlmIChJRUVFODAyMTFfSVNfQ0hBTl9ERlMoY2hhbikpIHsKKwkJCWlmICghKGRmcy0+ZGZzX3Byb2NfcGh5ZXJyICYgREZTX1JBREFSX0VOKSkgeworCQkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzMsCisJCQkJCSAgICAiJXM6IERGU19SQURBUl9FTiBub3QgZW5hYmxlZFxuIiwKKwkJCQkJICAgIF9fZnVuY19fKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvKgorCQkJICogcnNzaSBpcyBub3QgYWNjdXJhdGUgZm9yIHNob3J0IHB1bHNlcywgc28gZG8KKwkJCSAqIG5vdCBmaWx0ZXIgYmFzZWQgb24gdGhhdCBmb3Igc2hvcnQgZHVyYXRpb24gcHVsc2VzCisJCQkgKgorCQkJICogWFhYIGRvIHRoaXMgZmlsdGVyaW5nIGFib3ZlPworCQkJICovCisJCQlpZiAoZGZzLT5kZnNfY2Fwcy5hdGhfZGZzX2V4dF9jaGFuX29rKSB7CisJCQkJaWYgKChlLnJzc2kgPCBkZnMtPmRmc19yaW5mby5ybl9taW5yc3NpdGhyZXNoICYmCisJCQkJICAgICAoZS5kdXIgPiA0KSkgfHwKKwkJCQkgICAgZS5kdXIgPiAoZGZzLT5kZnNfcmluZm8ucm5fbWF4cHVsc2VkdXIpKSB7CisJCQkJCWRmcy0+YXRoX2Rmc19zdGF0cy5yc3NpX2Rpc2NhcmRzKys7CisJCQkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzEsCisJCQkJCQkgICAgIkV4dGVuc2lvbiBjaGFubmVsIHB1bHNlIGlzICIKKwkJCQkJCSAgICAiZGlzY2FyZGVkOiBkdXI9JWQsICIKKwkJCQkJCSAgICAibWF4cHVsc2VkdXI9JWQsIHJzc2k9JWQsICIKKwkJCQkJCSAgICAibWlucnNzaT0lZFxuIiwKKwkJCQkJCSAgICBlLmR1ciwKKwkJCQkJCSAgICBkZnMtPmRmc19yaW5mby4KKwkJCQkJCSAgICBybl9tYXhwdWxzZWR1ciwgZS5yc3NpLAorCQkJCQkJICAgIGRmcy0+ZGZzX3JpbmZvLgorCQkJCQkJICAgIHJuX21pbnJzc2l0aHJlc2gpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZS5yc3NpIDwgZGZzLT5kZnNfcmluZm8ucm5fbWlucnNzaXRocmVzaCB8fAorCQkJCSAgICBlLmR1ciA+IGRmcy0+ZGZzX3JpbmZvLnJuX21heHB1bHNlZHVyKSB7CisJCQkJCS8qIFhYWCBUT0RPIGFkZCBhIGRlYnVnIHN0YXRlbWVudD8gKi8KKwkJCQkJZGZzLT5hdGhfZGZzX3N0YXRzLnJzc2lfZGlzY2FyZHMrKzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIEFkZCB0aGUgZXZlbnQgdG8gdGhlIGxpc3QsIGlmIHRoZXJlJ3Mgc3BhY2UuCisJCQkgKi8KKwkJCUFUSF9ERlNFVkVOVFFfTE9DSyhkZnMpOworCQkJZXZlbnQgPSBTVEFJTFFfRklSU1QoJihkZnMtPmRmc19ldmVudHEpKTsKKwkJCWlmIChldmVudCA9PSBOVUxMKSB7CisJCQkJQVRIX0RGU0VWRU5UUV9VTkxPQ0soZGZzKTsKKwkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMsCisJCQkJCSAgICAiJXM6IG5vIG1vcmUgZXZlbnRzIHNwYWNlIGxlZnRcbiIsCisJCQkJCSAgICBfX2Z1bmNfXyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJU1RBSUxRX1JFTU9WRV9IRUFEKCYoZGZzLT5kZnNfZXZlbnRxKSwgcmVfbGlzdCk7CisJCQlBVEhfREZTRVZFTlRRX1VOTE9DSyhkZnMpOworCisJCQlkZnMtPmRmc19waHllcnJfcXVldWVkX2NvdW50Kys7CisJCQlkZnMtPmRmc19waHllcnJfdzUzX2NvdW50ZXIrKzsKKworCQkJZXZlbnQtPnJlX2R1ciA9IGUuZHVyOworCQkJZXZlbnQtPnJlX2Z1bGxfdHMgPSBlLmZ1bGx0c2Y7CisJCQlldmVudC0+cmVfdHMgPSAoZS5yc190c3RhbXApICYgREZTX1RTTUFTSzsKKwkJCWV2ZW50LT5yZV9yc3NpID0gZS5yc3NpOworCQkJZXZlbnQtPnNpZHggPSBlLnNpZHg7CisKKwkJCS8qCisJCQkgKiBIYW5kbGUgY2hpcnAgZmxhZ3MuCisJCQkgKi8KKwkJCWlmIChlLmRvX2NoZWNrX2NoaXJwKSB7CisJCQkJZXZlbnQtPnJlX2ZsYWdzIHw9IERGU19FVkVOVF9DSEVDS0NISVJQOworCQkJCWlmIChlLmlzX2h3X2NoaXJwKQorCQkJCQlldmVudC0+cmVfZmxhZ3MgfD0gREZTX0VWRU5UX0hXX0NISVJQOworCQkJCWlmIChlLmlzX3N3X2NoaXJwKQorCQkJCQlldmVudC0+cmVfZmxhZ3MgfD0gREZTX0VWRU5UX1NXX0NISVJQOworCQkJfQorCisJCQkvKgorCQkJICogQ29ycmVjdGx5IHNldCB3aGljaCBjaGFubmVsIGlzIGJlaW5nIHJlcG9ydGVkIG9uCisJCQkgKi8KKwkJCWlmIChlLmlzX3ByaSkgeworCQkJCWV2ZW50LT5yZV9jaGFuaW5kZXggPSBkZnMtPmRmc19jdXJjaGFuX3JhZGluZGV4OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGZzLT5kZnNfZXh0Y2hhbl9yYWRpbmRleCA9PSAtMSkgeworCQkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlNfUEhZRVJSLAorCQkJCQkJICAgICIlcyAtIHBoeWVyciBvbiBleHQgY2hhbm5lbFxuIiwKKwkJCQkJCSAgICBfX2Z1bmNfXyk7CisJCQkJfQorCQkJCWV2ZW50LT5yZV9jaGFuaW5kZXggPSBkZnMtPmRmc19leHRjaGFuX3JhZGluZGV4OworCQkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGU19QSFlFUlIsCisJCQkJCSAgICAiJXMgTmV3IGV4dGVuc2lvbiBjaGFubmVsIGV2ZW50IGlzIGFkZGVkICIKKwkJCQkJICAgICJ0byBxdWV1ZVxuIiwgX19mdW5jX18pOworCQkJfQorCQkJQVRIX0RGU1FfTE9DSyhkZnMpOworCQkJU1RBSUxRX0lOU0VSVF9UQUlMKCYoZGZzLT5kZnNfcmFkYXJxKSwgZXZlbnQsIHJlX2xpc3QpOworCQkJQVRIX0RGU1FfVU5MT0NLKGRmcyk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNjaGVkdWxlIHRoZSByYWRhci9BUiB0YXNrIGFzIGFwcHJvcHJpYXRlLgorCSAqCisJICogWFhYIGlzbid0IGEgbG9jayBuZWVkZWQgZm9yIGF0aF9yYWRhcl90YXNrc2NoZWQ/CisJICovCisKKy8qCisgKiAgQ29tbWVudGluZyBvdXQgdGhlIGRmc19wcm9jZXNzX2FyX2V2ZW50KCkgc2luY2UgdGhlIGZ1bmN0aW9uIGlzIG5ldmVyCisgKiAgY2FsbGVkIGF0IHJ1biB0aW1lIGFzIGRmc19hcnEgd2lsbCBiZSBlbXB0eSBhbmQgdGhlIGZ1bmN0aW9uCisgKiAgZGZzX3Byb2Nlc3NfYXJfZXZlbnQgaXMgb2Jzb2xldGUgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgcmVtb3ZlZAorICogIGFzIHBhcnQgb2YgZGZzX2FyLmMgZmlsZQorICoKKyAqICBpZiAoIVNUQUlMUV9FTVBUWSgmZGZzLT5kZnNfYXJxKSkKKyAqICAgICAvLyBYWFggc2hvdWxkbid0IHRoaXMgYmUgYSB0YXNrL3RpbWVyIHRvbz8KKyAqICAgICBkZnNfcHJvY2Vzc19hcl9ldmVudChkZnMsIGljLT5pY19jdXJjaGFuKTsKKyAqLworCisJaWYgKCFTVEFJTFFfRU1QVFkoJmRmcy0+ZGZzX3JhZGFycSkgJiYgIWRmcy0+YXRoX3JhZGFyX3Rhc2tzY2hlZCkgeworCQlkZnMtPmF0aF9yYWRhcl90YXNrc2NoZWQgPSAxOworCQlPU19TRVRfVElNRVIoJmRmcy0+YXRoX2Rmc190YXNrX3RpbWVyLCAwKTsKKwl9CisjdW5kZWYgICBFWFRfQ0hfUkFEQVJfRk9VTkQKKyN1bmRlZiAgIFBSSV9DSF9SQURBUl9GT1VORAorI3VuZGVmICAgRVhUX0NIX1JBREFSX0VBUkxZX0ZPVU5ECit9CisjZW5kaWYgLyogQVRIX1NVUFBPUlRfREZTICovCmRpZmYgLS1naXQgYS9jb3JlL3NhcC9kZnMvc3JjL2Rmc19wcm9jZXNzX3JhZGFyZXZlbnQuYyBiL2NvcmUvc2FwL2Rmcy9zcmMvZGZzX3Byb2Nlc3NfcmFkYXJldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTM2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19wcm9jZXNzX3JhZGFyZXZlbnQuYwpAQCAtMCwwICsxLDc5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgZGZzX3JhZGFyZXZlbnQuYworCisgICBPVkVSVklFVzoKKworICAgU291cmNlIGNvZGUgYm9ycm93ZWQgZnJvbSBRQ0FfTUFJTiBERlMgbW9kdWxlCisKKyAgIERFUEVOREVOQ0lFUzoKKworICAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisgICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKyAgIC0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJkZnMuaCIKKy8qIFRPIERPIERGUworICAgI2luY2x1ZGUgPGllZWU4MDIxMV92YXIuaD4KKyAqLworI2lmZGVmIEFUSF9TVVBQT1JUX0RGUworCisjZGVmaW5lIEZSRVFfNTUwMF9NSFogIDU1MDAKKyNkZWZpbmUgRlJFUV81NTAwX01IWiAgICAgICA1NTAwCisKKyNkZWZpbmUgREZTX01BWF9GUkVRX1NQUkVBRCAgICAgICAgICAgIDEzNzUgKiAxCisKK3N0YXRpYyBjaGFyIGRlYnVnX2R1cFszM107CitzdGF0aWMgaW50IGRlYnVnX2R1cF9jbnQ7CisKKy8qCisgKiBDb252ZXJ0IHRoZSBoYXJkd2FyZSBwcm92aWRlZCBkdXJhdGlvbiB0byBUU0YgdGlja3MgKHVzZWNzKQorICogdGFraW5nIHRoZSBjbG9jayAoZmFzdCBvciBub3JtYWwpIGludG8gYWNjb3VudC4KKyAqCisgKiBMZWdhY3kgKHByZS0xMW4sIE93bCwgU293bCwgSG93bCkgb3BlcmF0ZSA1R0h6IHVzaW5nIGEgNDBNSHoKKyAqIGNsb2NrLiAgTGF0ZXIgMTFuIGNoaXBzIChNZXJsaW4sIE9zcHJleSwgZXRjKSBvcGVyYXRlIDVHSHogdXNpbmcKKyAqIGEgNDRNSHogY2xvY2ssIHNvIHRoZSByZXBvcnRlZCBwdWxzZSBkdXJhdGlvbnMgYXJlIGRpZmZlcmVudC4KKyAqCisgKiBQZXJlZ3JpbmUgcmVwb3J0cyB0aGUgcHVsc2UgZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzIHJlZ2FyZGxlc3MKKyAqIG9mIHRoZSBvcGVyYXRpbmcgbW9kZS4gKFhYWCBUT0RPOiB2ZXJpZnkgdGhpcywgb2J2aW91c2x5LikKKyAqLworc3RhdGljIGlubGluZSB1aW50OF90IGRmc19wcm9jZXNzX3B1bHNlX2R1cihzdHJ1Y3QgYXRoX2RmcyAqZGZzLCB1aW50OF90IHJlX2R1cikKK3sKKwkvKgorCSAqIFNob3J0IHB1bHNlcyBhcmUgc29tZXRpbWVzIHJldHVybmVkIGFzIGhhdmluZyBhIGR1cmF0aW9uIG9mIDAsCisJICogc28gcm91bmQgdGhvc2UgdXAgdG8gMS4KKwkgKgorCSAqIFhYWCBUaGlzIGhvbGRzIHRydWUgZm9yIEJCIFRMViBjaGlwcyB0b28sIHJpZ2h0PworCSAqLworCWlmIChyZV9kdXIgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIEZvciBCQiBUTFYgY2hpcHMsIHRoZSBoYXJkd2FyZSBhbHdheXMgcmV0dXJucyBtaWNyb3NlY29uZAorCSAqIHB1bHNlIGR1cmF0aW9ucy4KKwkgKi8KKwlpZiAoZGZzLT5kZnNfY2Fwcy5hdGhfY2hpcF9pc19iYl90bHYpCisJCXJldHVybiByZV9kdXI7CisKKwkvKgorCSAqIFRoaXMgaXMgZm9yIDExbiBhbmQgbGVnYWN5IGNoaXBzLCB3aGljaCBtYXkgb3IgbWF5IG5vdAorCSAqIHVzZSB0aGUgNUdIeiBmYXN0IGNsb2NrIG1vZGUuCisJICovCisJLyogQ29udmVydCAwLjh1cyBkdXJhdGlvbnMgdG8gVFNGIHRpY2tzICh1c2VjcykgKi8KKwlyZXR1cm4gKHVpbnQ4X3QpIGRmc19yb3VuZCgoaW50MzJfdCkgKChkZnMtPmR1cl9tdWx0aXBsaWVyKSAqIHJlX2R1cikpOworfQorCisvKgorICogUHJvY2VzcyBhIHJhZGFyIGV2ZW50LgorICoKKyAqIElmIGEgcmFkYXIgZXZlbnQgaXMgZm91bmQsIHJldHVybiAxLiAgT3RoZXJ3aXNlLCByZXR1cm4gMC4KKyAqCisgKiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIHNwZWNpZnkgdGhhdCBhIHJhZGFyIGV2ZW50IGhhcyBvY2N1cmVkIG9uCisgKiBhIHNwZWNpZmljIGNoYW5uZWwsIHNvIHRoZSBjdXJyZW50IG1ldGhvZG9sb2d5IGlzIHRvIG1hcmsgYm90aCB0aGUgcHJpCisgKiBhbmQgZXh0IGNoYW5uZWxzIGFzIGJlaW5nIHVuYXZhaWxhYmxlLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQgZm9yIDgwMi4xMWFjCisgKiBvciB3ZSdsbCBxdWlja2x5IHJ1biBvdXQgb2YgdmFsaWQgY2hhbm5lbHMgdG8gdXNlLgorICovCitpbnQgZGZzX3Byb2Nlc3NfcmFkYXJldmVudChzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4pCit7CisvKiBjb21tZW50aW5nIGZvciBub3cgdG8gdmFsaWRhdGUgcmFkYXIgaW5kaWNhdGlvbiBtc2cgdG8gU0FQICovCisvKiAjaWYgMCAqLworCXN0cnVjdCBkZnNfZXZlbnQgcmUsICpldmVudDsKKwlzdHJ1Y3QgZGZzX3N0YXRlICpycyA9IE5VTEw7CisJc3RydWN0IGRmc19maWx0ZXJ0eXBlICpmdDsKKwlzdHJ1Y3QgZGZzX2ZpbHRlciAqcmY7CisJaW50IGZvdW5kLCByZXR2YWwgPSAwLCBwLCBlbXB0eTsKKwlpbnQgZXZlbnRzX3Byb2Nlc3NlZCA9IDA7CisJdWludDMyX3QgdGFibGVkZXB0aCwgaW5kZXg7CisJdWludDY0X3QgZGVsdGFmdWxsX3RzID0gMCwgdGhpc190cywgZGVsdGFUOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqdGhpc2NoYW47CisJc3RydWN0IGRmc19wdWxzZWxpbmUgKnBsOworCXN0YXRpYyB1aW50MzJfdCB0ZXN0X3RzID0gMDsKKwlzdGF0aWMgdWludDMyX3QgZGlmZl90cyA9IDA7CisJaW50IGV4dF9jaGFuX2V2ZW50X2ZsYWcgPSAwOworI2lmIDAKKwlpbnQgcHJpX211bHRpcGxpZXIgPSAyOworI2VuZGlmCisJaW50IGk7CisKKwlpZiAoZGZzID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlc1slZF06IGRmcyBpcyBOVUxMIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIDA7CisJfQorCXBsID0gZGZzLT5wdWxzZXM7CisJaWYgKCEoSUVFRTgwMjExX0lTX0NIQU5fREZTKGRmcy0+aWMtPmljX2N1cmNoYW4pKSkgeworCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMyLAorCQkJICAgICIlczogcmFkYXIgZXZlbnQgb24gbm9uLURGUyBjaGFuIiwgX19mdW5jX18pOworCQlkZnNfcmVzZXRfcmFkYXJxKGRmcyk7CisJCWRmc19yZXNldF9hbGxkZWxheWxpbmVzKGRmcyk7CisJCXJldHVybiAwOworCX0KKyNpZm5kZWYgQVRIX0RGU19SQURBUl9ERVRFQ1RJT05fT05MWQorCS8qIFRFU1QgOiBTaW11bGF0ZSByYWRhciBiYW5nLCBtYWtlIHN1cmUgd2UgYWRkIHRoZSBjaGFubmVsIHRvIE5PTCAoYnVnIDI5OTY4KSAqLworCWlmIChkZnMtPmRmc19iYW5ncmFkYXIpIHsKKwkJLyogYmFuZ3JhZGFyIHdpbGwgYWx3YXlzIHNpbXVsYXRlIHJhZGFyIGZvdW5kIG9uIHRoZSBwcmltYXJ5IGNoYW5uZWwgKi8KKwkJcnMgPSAmZGZzLT5kZnNfcmFkYXJbZGZzLT5kZnNfY3VyY2hhbl9yYWRpbmRleF07CisJCWRmcy0+ZGZzX2JhbmdyYWRhciA9IDA7IC8qIHJlc2V0ICovCisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUywgIiVzOiBiYW5ncmFkYXIiLCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IDE7CisJCWdvdG8gZGZzZm91bmQ7CisJfQorI2VuZGlmCisKKwkvKgorCSAgIFRoZSBIVyBtYXkgbWlzcyBzb21lIHB1bHNlcyBlc3BlY2lhbGx5IHdpdGggaGlnaCBjaGFubmVsIGxvYWRpbmcuCisJICAgVGhpcyBpcyB0cnVlIGZvciBKYXBhbiBXNTMgd2hlcmUgY2hhbm5lbCBsb2FvZGluZyBpcyA1MCUuIEFsc28KKwkgICBmb3IgRVRTSSB3aGVyZSBjaGFubmVsIGxvYWRpbmcgaXMgMzAlIHRoaXMgY2FuIGJlIGFuIGlzc3VlIHRvby4KKwkgICBUbyB0YWtlIGNhcmUgb2YgbWlzc2luZyBwdWxzZXMsIHdlIGludHJvZHVjZSBwcmlfbWFyZ2luIG11bHRpcGxpZS4KKwkgICBUaGlzIGlzIG5vcm1hbGx5IDIgYnV0IGNhbiBiZSBoaWdoZXIgZm9yIFc1My4KKwkgKi8KKworCWlmICgoZGZzLT5kZnNkb21haW4gPT0gREZTX01LSzRfRE9NQUlOKSAmJgorCSAgICAoZGZzLT5kZnNfY2Fwcy5hdGhfY2hpcF9pc19iYl90bHYpICYmCisJICAgIChjaGFuLT5pY19mcmVxIDwgRlJFUV81NTAwX01IWikpIHsKKworCQlkZnMtPmRmc19wcmlfbXVsdGlwbGllciA9IGRmcy0+ZGZzX3ByaV9tdWx0aXBsaWVyX2luaTsKKworCQkvKiBkbyBub3QgcHJvY2VzcyBXNTMgcHVsc2VzLAorCQkgICB1bmxlc3Mgd2UgaGF2ZSBhIG1pbmltdW0gbnVtYmVyIG9mIHRoZW0KKwkJICovCisJCWlmIChkZnMtPmRmc19waHllcnJfdzUzX2NvdW50ZXIgPj0gNSkgeworCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMSwKKwkJCQkgICAgIiVzOiB3NTNfY291bnRlcj0lZCwgZnJlcV9tYXg9JWQsICIKKwkJCQkgICAgImZyZXFfbWluPSVkLCBwcmlfbXVsdGlwbGllcj0lZCIsCisJCQkJICAgIF9fZnVuY19fLAorCQkJCSAgICBkZnMtPmRmc19waHllcnJfdzUzX2NvdW50ZXIsCisJCQkJICAgIGRmcy0+ZGZzX3BoeWVycl9mcmVxX21heCwKKwkJCQkgICAgZGZzLT5kZnNfcGh5ZXJyX2ZyZXFfbWluLAorCQkJCSAgICBkZnMtPmRmc19wcmlfbXVsdGlwbGllcik7CisJCQlkZnMtPmRmc19waHllcnJfZnJlcV9taW4gPSAweDdmZmZmZmZmOworCQkJZGZzLT5kZnNfcGh5ZXJyX2ZyZXFfbWF4ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzEsCisJCSAgICAiJXM6IHByaV9tdWx0aXBsaWVyPSVkIiwgX19mdW5jX18sIGRmcy0+ZGZzX3ByaV9tdWx0aXBsaWVyKTsKKworCUFUSF9ERlNRX0xPQ0soZGZzKTsKKwllbXB0eSA9IFNUQUlMUV9FTVBUWSgmKGRmcy0+ZGZzX3JhZGFycSkpOworCUFUSF9ERlNRX1VOTE9DSyhkZnMpOworCisJd2hpbGUgKCghZW1wdHkpICYmICghcmV0dmFsKSAmJiAoZXZlbnRzX3Byb2Nlc3NlZCA8IE1BWF9FVkVOVFMpKSB7CisJCUFUSF9ERlNRX0xPQ0soZGZzKTsKKwkJZXZlbnQgPSBTVEFJTFFfRklSU1QoJihkZnMtPmRmc19yYWRhcnEpKTsKKwkJaWYgKGV2ZW50ICE9IE5VTEwpCisJCQlTVEFJTFFfUkVNT1ZFX0hFQUQoJihkZnMtPmRmc19yYWRhcnEpLCByZV9saXN0KTsKKwkJQVRIX0RGU1FfVU5MT0NLKGRmcyk7CisKKwkJaWYgKGV2ZW50ID09IE5VTEwpIHsKKwkJCWVtcHR5ID0gMTsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzWyVkXTogZXZlbnQgaXMgTlVMTCAiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJYnJlYWs7CisJCX0KKwkJZXZlbnRzX3Byb2Nlc3NlZCsrOworCQlyZSA9ICpldmVudDsKKworCQlPU19NRU1aRVJPKGV2ZW50LCBzaXplb2Yoc3RydWN0IGRmc19ldmVudCkpOworCQlBVEhfREZTRVZFTlRRX0xPQ0soZGZzKTsKKwkJU1RBSUxRX0lOU0VSVF9UQUlMKCYoZGZzLT5kZnNfZXZlbnRxKSwgZXZlbnQsIHJlX2xpc3QpOworCQlBVEhfREZTRVZFTlRRX1VOTE9DSyhkZnMpOworCisJCWZvdW5kID0gMDsKKwkJaWYgKHJlLnJlX2NoYW5pbmRleCA8IERGU19OVU1fUkFEQVJfU1RBVEVTKQorCQkJcnMgPSAmZGZzLT5kZnNfcmFkYXJbcmUucmVfY2hhbmluZGV4XTsKKwkJZWxzZSB7CisJCQlBVEhfREZTUV9MT0NLKGRmcyk7CisJCQllbXB0eSA9IFNUQUlMUV9FTVBUWSgmKGRmcy0+ZGZzX3JhZGFycSkpOworCQkJQVRIX0RGU1FfVU5MT0NLKGRmcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocnMtPnJzX2NoYW4uaWNfZmxhZ2V4dCAmIENIQU5ORUxfSU5URVJGRVJFTkNFKSB7CisJCQlBVEhfREZTUV9MT0NLKGRmcyk7CisJCQllbXB0eSA9IFNUQUlMUV9FTVBUWSgmKGRmcy0+ZGZzX3JhZGFycSkpOworCQkJQVRIX0RGU1FfVU5MT0NLKGRmcyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChkZnMtPmRmc19yaW5mby5ybl9sYXN0ZnVsbF90cyA9PSAwKSB7CisJCQkvKgorCQkJICogRWl0aGVyIG5vdCBzdGFydGVkLCBvciA2NC1iaXQgcm9sbG92ZXIgZXhhY3RseSB0byB6ZXJvCisJCQkgKiBKdXN0IHByZXBlbmQgemVyb3MgdG8gdGhlIDE1LWJpdCB0cworCQkJICovCisJCQlkZnMtPmRmc19yaW5mby5ybl90c19wcmVmaXggPSAwOworCQl9IGVsc2UgeworCQkJLyogV0FSIDIzMDMxLSBwYXRjaCBkdXBsaWNhdGUgdHMgb24gdmVyeSBzaG9ydCBwdWxzZXMgKi8KKwkJCS8qIFRoaXMgcGFjdGggaGFzIHR3byBwcm9ibGVtcyBpbiBsaW51eCBlbnZpcm9ubWVudC4KKwkJCSAqIDEpVGhlIHRpbWUgc3RhbXAgY3JlYXRlZCBhbmQgaGVuY2UgUFJJIGRlcGVuZHMgZW50aXJlbHkgb24gdGhlIGxhdGVuY3kuCisJCQkgKiAgIElmIHRoZSBsYXRlbmN5IGlzIGhpZ2gsIGl0IHBvc3NpYmx5IGNhbiBzcGxpdCB0d28gY29uc2VjdXRpdmUKKwkJCSAqICAgcHVsc2VzIGluIHRoZSBzYW1lIGJ1cnN0IHNvIGZhciBhd2F5ICh0aGUgc2FtZSBhbW91bnQgb2YgbGF0ZW5jeSkKKwkJCSAqICAgdGhhdCBtYWtlIHRoZW0gbG9vayBsaWtlIHRoZXkgYXJlIGZyb20gZGlmZmVyZW5jdCBidXJzdHMuIEl0IGlzCisJCQkgKiAgIG9ic2VydmVkIHRvIGhhcHBlbiB0b28gb2Z0ZW4uIEl0IHN1cmUgbWFrZXMgdGhlIGRldGVjdGlvbiBmYWlsLgorCQkJICogMilFdmVuIGlmIHRoZSBsYXRlbmN5IGlzIG5vdCB0aGF0IGJhZCwgaXQgc2ltcGx5IHNoaWZ0cyB0aGUgZHVwbGljYXRlCisJCQkgKiAgIHRpbWVzdGFtcHMgdG8gYSBuZXcgZHVwbGljYXRlIHRpbWVzdGFtcCBiYXNlZCBvbiBob3cgdGhleSBhcmUgcHJvY2Vzc2VkLgorCQkJICogICBUaGlzIGlzIG5vdCB3b3JzZSBidXQgbm90IGdvb2QgZWl0aGVyLgorCQkJICoKKwkJCSAqICAgVGFrZSB0aGlzIHB1bHNlIGFzIGEgZ29vZCBvbmUgYW5kIGNyZWF0ZSBhIHByb2JhYmxlIFBSSSBsYXRlcgorCQkJICovCisJCQlpZiAocmUucmVfZHVyID09IDAKKwkJCSAgICAmJiByZS5yZV90cyA9PSBkZnMtPmRmc19yaW5mby5ybl9sYXN0X3VuaXF1ZV90cykgeworCQkJCWRlYnVnX2R1cFtkZWJ1Z19kdXBfY250KytdID0gJzEnOworCQkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzEsCisJCQkJCSAgICAiICVzIGRlbHRhVCBpcyAwICIsIF9fZnVuY19fKTsKKwkJCX0gZWxzZSB7CisJCQkJZGZzLT5kZnNfcmluZm8ucm5fbGFzdF91bmlxdWVfdHMgPSByZS5yZV90czsKKwkJCQlkZWJ1Z19kdXBbZGVidWdfZHVwX2NudCsrXSA9ICcwJzsKKwkJCX0KKwkJCWlmIChkZWJ1Z19kdXBfY250ID49IDMyKSB7CisJCQkJZGVidWdfZHVwX2NudCA9IDA7CisJCQl9CisKKwkJCWlmIChyZS5yZV90cyA8PSBkZnMtPmRmc19yaW5mby5ybl9sYXN0X3RzKSB7CisJCQkJZGZzLT5kZnNfcmluZm8ucm5fdHNfcHJlZml4ICs9CisJCQkJCSgoKHVpbnQ2NF90KSAxKSA8PCBERlNfVFNTSElGVCk7CisJCQkJLyogTm93LCBzZWUgaWYgaXQncyBiZWVuIG1vcmUgdGhhbiAxIHdyYXAgKi8KKwkJCQlkZWx0YWZ1bGxfdHMgPQorCQkJCQlyZS5yZV9mdWxsX3RzIC0KKwkJCQkJZGZzLT5kZnNfcmluZm8ucm5fbGFzdGZ1bGxfdHM7CisJCQkJaWYgKGRlbHRhZnVsbF90cyA+CisJCQkJICAgICgodWludDY0X3QpCisJCQkJICAgICAoKERGU19UU01BU0sgLSBkZnMtPmRmc19yaW5mby5ybl9sYXN0X3RzKSArCisJCQkJICAgICAgMSArIHJlLnJlX3RzKSkpCisJCQkJCWRlbHRhZnVsbF90cyAtPQorCQkJCQkJKERGU19UU01BU0sgLQorCQkJCQkJIGRmcy0+ZGZzX3JpbmZvLnJuX2xhc3RfdHMpICsgMSArCisJCQkJCQlyZS5yZV90czsKKwkJCQlkZWx0YWZ1bGxfdHMgPSBkZWx0YWZ1bGxfdHMgPj4gREZTX1RTU0hJRlQ7CisJCQkJaWYgKGRlbHRhZnVsbF90cyA+IDEpIHsKKwkJCQkJZGZzLT5kZnNfcmluZm8ucm5fdHNfcHJlZml4ICs9CisJCQkJCQkoKGRlbHRhZnVsbF90cyAtIDEpIDw8IERGU19UU1NISUZUKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWRlbHRhZnVsbF90cyA9CisJCQkJCXJlLnJlX2Z1bGxfdHMgLQorCQkJCQlkZnMtPmRmc19yaW5mby5ybl9sYXN0ZnVsbF90czsKKwkJCQlpZiAoZGVsdGFmdWxsX3RzID4gKHVpbnQ2NF90KSBERlNfVFNNQVNLKSB7CisJCQkJCWRlbHRhZnVsbF90cyA9CisJCQkJCQlkZWx0YWZ1bGxfdHMgPj4gREZTX1RTU0hJRlQ7CisJCQkJCWRmcy0+ZGZzX3JpbmZvLnJuX3RzX3ByZWZpeCArPQorCQkJCQkJKChkZWx0YWZ1bGxfdHMgLSAxKSA8PCBERlNfVFNTSElGVCk7CisJCQkJfQorCQkJfQorCQl9CisJCS8qCisJCSAqIEF0IHRoaXMgc3RhZ2Ugcm5fdHNfcHJlZml4IGhhcyBlaXRoZXIgYmVlbiBibGFua2VkIG9yCisJCSAqIGNhbGN1bGF0ZWQsIHNvIGl0J3Mgc2FmZSB0byB1c2UuCisJCSAqLworCQl0aGlzX3RzID0gZGZzLT5kZnNfcmluZm8ucm5fdHNfcHJlZml4IHwgKCh1aW50NjRfdCkgcmUucmVfdHMpOworCQlkZnMtPmRmc19yaW5mby5ybl9sYXN0ZnVsbF90cyA9IHJlLnJlX2Z1bGxfdHM7CisJCWRmcy0+ZGZzX3JpbmZvLnJuX2xhc3RfdHMgPSByZS5yZV90czsKKworCQkvKgorCQkgKiBUaGUgaGFyZHdhcmUgcmV0dXJucyB0aGUgZHVyYXRpb24gaW4gYSB2YXJpZXR5IG9mIGZvcm1hdHMsCisJCSAqIHNvIGl0J3MgY29udmVydGVkIGZyb20gdGhlIGhhcmR3YXJlIGZvcm1hdCB0byBUU0YgKHVzZWMpCisJCSAqIHZhbHVlcyBoZXJlLgorCQkgKgorCQkgKiBYWFggVE9ETzogdGhpcyBzaG91bGQgcmVhbGx5IGJlIGRvbmUgd2hlbiB0aGUgUEhZIGVycm9yCisJCSAqIGlzIHByb2Nlc3NlZCwgcmF0aGVyIHRoYW4gd2F5IG91dCBoZXJlLi4KKwkJICovCisJCXJlLnJlX2R1ciA9IGRmc19wcm9jZXNzX3B1bHNlX2R1cihkZnMsIHJlLnJlX2R1cik7CisKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBzdGFydCBvZiB0aGUgcmFkYXIgcHVsc2UuCisJCSAqCisJCSAqIFRoZSBUU0YgaXMgc3RhbXBlZCBieSB0aGUgTUFDIHVwb24gcmVjZXB0aW9uIG9mIHRoZQorCQkgKiBldmVudCwgd2hpY2ggaXMgKHR5cGljYWxseT8pIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50LgorCQkgKiBCdXQgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgY29kZSBleHBlY3RzIHRoZSBldmVudCB0aW1lc3RhbXBzCisJCSAqIHRvIGJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZXZlbnQuICBTbyB0byBmYWtlIGl0LCB3ZQorCQkgKiBzdWJ0cmFjdCB0aGUgcHVsc2UgZHVyYXRpb24gZnJvbSB0aGUgZ2l2ZW4gVFNGLgorCQkgKgorCQkgKiBUaGlzIGlzIGRvbmUgYWZ0ZXIgdGhlIDY0LWJpdCB0aW1lc3RhbXAgaGFzIGJlZW4gY2FsY3VsYXRlZAorCQkgKiBzbyBsb25nIHB1bHNlcyBjb3JyZWN0bHkgdW5kZXItd3JhcCB0aGUgY291bnRlci4gIEllLCBpZgorCQkgKiB0aGlzIHdhcyBkb25lIG9uIHRoZSAzMiAob3IgMTUhKSBiaXQgVFNGIHdoZW4gdGhlIFRTRgorCQkgKiB2YWx1ZSBpcyBjbG9zZWQgdG8gMCwgaXQgd2lsbCB1bmRlcmZsb3cgdG8gMHhmZmZmZlhYLCB3aGljaAorCQkgKiB3b3VsZCBtZXNzIHVwIHRoZSBsb2dpY2FsICJPUiIgb3BlcmF0aW9uIGRvbmUgYWJvdmUuCisJCSAqCisJCSAqIFRoaXMgaXNuJ3QgdmFsaWQgZm9yIFBlcmVncmluZSBhcyB0aGUgaGFyZHdhcmUgZ2l2ZXMgdXMKKwkJICogdGhlIGFjdHVhbCBUU0Ygb2Zmc2V0IG9mIHRoZSByYWRhciBldmVudCwgbm90IGp1c3QgdGhlIE1BQworCQkgKiBUU0Ygb2YgdGhlIGNvbXBsZXRlZCByZWNlaXZlLgorCQkgKgorCQkgKiBYWFggVE9ETzogZW5zdXJlIHRoYXQgdGhlIFRMViBQSFkgZXJyb3IgcHJvY2Vzc2luZworCQkgKiBjb2RlIHdpbGwgY29ycmVjdGx5IGNhbGN1bGF0ZSB0aGUgVFNGIHRvIGJlIHRoZSBzdGFydAorCQkgKiBvZiB0aGUgcmFkYXIgcHVsc2UuCisJCSAqCisJCSAqIFhYWCBUT0RPIFRPRE86IG1vZGlmeSB0aGUgVExWIHBhcnNpbmcgY29kZSB0byBzdWJ0cmFjdAorCQkgKiB0aGUgZHVyYXRpb24gZnJvbSB0aGUgVFNGLCBiYXNlZCBvbiB0aGUgY3VycmVudCBmYXN0IGNsb2NrCisJCSAqIHZhbHVlLgorCQkgKi8KKwkJaWYgKCghZGZzLT5kZnNfY2Fwcy5hdGhfY2hpcF9pc19iYl90bHYpICYmIHJlLnJlX2R1ciAhPSAxKSB7CisJCQl0aGlzX3RzIC09IHJlLnJlX2R1cjsKKwkJfQorCisJCS8qIFNhdmUgdGhlIHB1bHNlIHBhcmFtZXRlcnMgaW4gdGhlIHB1bHNlIGJ1ZmZlcihwdWxzZSBsaW5lKSAqLworCQlpbmRleCA9IChwbC0+cGxfbGFzdGVsZW0gKyAxKSAmIERGU19NQVhfUFVMU0VfQlVGRkVSX01BU0s7CisJCWlmIChwbC0+cGxfbnVtZWxlbXMgPT0gREZTX01BWF9QVUxTRV9CVUZGRVJfU0laRSkKKwkJCXBsLT5wbF9maXJzdGVsZW0gPQorCQkJCShwbC0+cGxfZmlyc3RlbGVtICsgMSkgJiBERlNfTUFYX1BVTFNFX0JVRkZFUl9NQVNLOworCQllbHNlCisJCQlwbC0+cGxfbnVtZWxlbXMrKzsKKwkJcGwtPnBsX2xhc3RlbGVtID0gaW5kZXg7CisJCXBsLT5wbF9lbGVtc1tpbmRleF0ucF90aW1lID0gdGhpc190czsKKwkJcGwtPnBsX2VsZW1zW2luZGV4XS5wX2R1ciA9IHJlLnJlX2R1cjsKKwkJcGwtPnBsX2VsZW1zW2luZGV4XS5wX3Jzc2kgPSByZS5yZV9yc3NpOworCQlkaWZmX3RzID0gKHVpbnQzMl90KSB0aGlzX3RzIC0gdGVzdF90czsKKwkJdGVzdF90cyA9ICh1aW50MzJfdCkgdGhpc190czsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMSwKKwkJCSAgICAidHMldSAldSAldSBkaWZmICV1IHBsLT5wbF9sYXN0ZWxlbS5wX3RpbWU9JWxsdSIsCisJCQkgICAgKHVpbnQzMl90KSB0aGlzX3RzLCByZS5yZV9kdXIsIHJlLnJlX3Jzc2ksIGRpZmZfdHMsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwbC0+cGxfZWxlbXNbaW5kZXhdLnBfdGltZSk7CisJCWlmIChkZnMtPmRmc19ldmVudF9sb2dfb24pIHsKKwkJCWkgPSBkZnMtPmRmc19ldmVudF9sb2dfY291bnQgJSBERlNfRVZFTlRfTE9HX1NJWkU7CisJCQlkZnMtPnJhZGFyX2xvZ1tpXS50cyA9IHRoaXNfdHM7CisJCQlkZnMtPnJhZGFyX2xvZ1tpXS5kaWZmX3RzID0gZGlmZl90czsKKwkJCWRmcy0+cmFkYXJfbG9nW2ldLnJzc2kgPSByZS5yZV9yc3NpOworCQkJZGZzLT5yYWRhcl9sb2dbaV0uZHVyID0gcmUucmVfZHVyOworCQkJZGZzLT5kZnNfZXZlbnRfbG9nX2NvdW50Kys7CisJCX0KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzWyVkXTp4eHh4eCB0cyA9JXUgcmUucmVfZHVyPSV1IHJlLnJlX3Jzc2kgPSV1IGRpZmYgPSV1IHBsLT5wbF9sYXN0ZWxlbS5wX3RpbWU9JWxsdSB4eHh4eCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgKHVpbnQzMl90KSB0aGlzX3RzLCByZS5yZV9kdXIsCisJCQkgIHJlLnJlX3Jzc2ksIGRpZmZfdHMsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpcGwtPnBsX2VsZW1zW2luZGV4XS5wX3RpbWUpOworCisJCS8qIElmIGRpZmZfdHMgaXMgdmVyeSBzbWFsbCwgd2UgbWlnaHQgYmUgZ2V0dGluZyBmYWxzZSBwdWxzZSBkZXRlY3RzCisJCSAqIGR1ZSB0byBoZWF2eSBpbnRlcmZlcmVuY2UuIFdlIG1pZ2h0IGJlIGdldHRpbmcgc3BlY3RyYWwgc3BsYXR0ZXIKKwkJICogZnJvbSBhZGphY2VudCBjaGFubmVsLiBJbiBvcmRlciB0byBwcmV2ZW50IGZhbHNlIGFsYXJtcyB3ZQorCQkgKiBjbGVhciB0aGUgZGVsYXktbGluZXMuIFRoaXMgbWlnaHQgaW1wYWN0IHBvc2l0aXZlIGRldGVjdGlvbnMgdW5kZXIKKwkJICogaGFyc2ggZW52aXJvbm1lbnRzLCBidXQgaGVscHMgd2l0aCBmYWxzZSBkZXRlY3RzLiAqLworCisJCWlmIChkaWZmX3RzIDwgMTAwKSB7CisJCQlkZnNfcmVzZXRfYWxsZGVsYXlsaW5lcyhkZnMpOworCQkJZGZzX3Jlc2V0X3JhZGFycShkZnMpOworCQl9CisJCWZvdW5kID0gMDsKKworCQkvKgorCQkgKiBVc2UgdGhpcyBmaXggb25seSB3aGVuIGRldmljZSBpcyBub3QgaW4gdGVzdCBtb2RlLCBhcworCQkgKiBpdCBkcm9wcyBzb21lIHZhbGlkIHBoeWVycm9ycy4KKwkJICogSW4gRkNDIG9yIEpBUEFOIGRvbWFpbixpZiB0aGUgZm9sbHdpbmcgc2lnbmF0dXJlIG1hdGNoZXMKKwkJICogaXRzIGxpa2VseSB0aGF0IHRoaXMgaXMgYSBmYWxzZSByYWRhciBwdWxzZSBwYXR0ZXJuCisJCSAqIHNvIHByb2Nlc3MgdGhlIG5leHQgcHVsc2UgaW4gdGhlIHF1ZXVlLgorCQkgKi8KKwkJaWYgKChkZnMtPmRpc2FibGVfZGZzX2NoX3N3aXRjaCA9PSBmYWxzZSkgJiYKKwkJCSAoREZTX0ZDQ19ET01BSU4gPT0gZGZzLT5kZnNkb21haW4gfHwKKwkJCSAgREZTX01LSzRfRE9NQUlOID09IGRmcy0+ZGZzZG9tYWluKSAmJgorCQkJIChyZS5yZV9kdXIgPj0gMTEgJiYgcmUucmVfZHVyIDw9IDIwKSAmJgorCQkJIChkaWZmX3RzID4gNTAwIHx8IGRpZmZfdHMgPD0gMzA1KSAmJgorCQkJIChyZS5zaWR4ID09IC00KSkgeworCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJIlxuJXM6IFJlamVjdGluZyBvbiBQZWFrIEluZGV4ID0gJWQscmUucmVfZHVyID0gJWQsZGlmZl90cyA9ICVkXG4iLAorCQkJX19mdW5jX18scmUuc2lkeCwgcmUucmVfZHVyLCBkaWZmX3RzKTsKKworCQkJQVRIX0RGU1FfTE9DSyhkZnMpOworCQkJZW1wdHkgPSBTVEFJTFFfRU1QVFkoJihkZnMtPmRmc19yYWRhcnEpKTsKKwkJCUFUSF9ERlNRX1VOTE9DSyhkZnMpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBNb2RpZnlpbmcgdGhlIHB1bHNlIGR1cmF0aW9uIGZvciBGQ0MgVHlwZSA0CisJCSAqIG9yIEpBUEFOIFc1NiBUeXBlIDYgcmFkYXIgcHVsc2VzIHdoZW4gdGhlCisJCSAqIGZvbGxvd2luZyBjb25kaXRpb24gaXMgcmVwb3J0ZWQgaW4gcmFkYXIKKwkJICogc3VtbWFyeSByZXBvcnQuCisJCSAqLworCQlpZiAoKERGU19GQ0NfRE9NQUlOID09IGRmcy0+ZGZzZG9tYWluIHx8CisJCQlERlNfTUtLNF9ET01BSU4gPT0gZGZzLT5kZnNkb21haW4pICYmCisJCSAgICAoKGNoYW4tPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fVkhUODApID09CisJCQlJRUVFODAyMTFfQ0hBTl9WSFQ4MCkgJiYKKwkJICAgIChjaGFuLT5pY19wcmlfZnJlcV9jZW50ZXJfZnJlcV9taHpfc2VwYXJhdGlvbiA9PQorCQkJREZTX1dBUl9QTFVTXzMwX01IWl9TRVBBUkFUSU9OIHx8CisJCSAgICAgY2hhbi0+aWNfcHJpX2ZyZXFfY2VudGVyX2ZyZXFfbWh6X3NlcGFyYXRpb24gPT0KKwkJCURGU19XQVJfTUlOVVNfMzBfTUhaX1NFUEFSQVRJT04pICYmCisJCSAgICAocmUuc2lkeCA9PSBERlNfV0FSX1BFQUtfSU5ERVhfWkVSTykgJiYKKwkJICAgIChyZS5yZV9kdXIgPiBERlNfVFlQRTRfV0FSX1BVTFNFX0RVUkFUSU9OX0xPV0VSX0xJTUlUICYmCisJCSAgICAgcmUucmVfZHVyIDwgREZTX1RZUEU0X1dBUl9QVUxTRV9EVVJBVElPTl9VUFBFUl9MSU1JVCkgJiYKKwkJICAgIChkaWZmX3RzID4gREZTX1RZUEU0X1dBUl9QUklfTE9XRVJfTElNSVQgJiYKKwkJICAgICBkaWZmX3RzIDwgREZTX1RZUEU0X1dBUl9QUklfVVBQRVJfTElNSVQpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSIlczpjaGFuLT5pY19mbGFncz0weCV4LCBNSHogc2VwYXJhdGlvbj0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgY2hhbi0+aWNfZmxhZ3MsCisJCQkJY2hhbi0+aWNfcHJpX2ZyZXFfY2VudGVyX2ZyZXFfbWh6X3NlcGFyYXRpb24pOworCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSIlczogUGVhayBJZHggPSVkLHJlLnJlX2R1ciA9JWQsZGlmZl90cyA9JWRcbiIsCisJCQkJX19mdW5jX18sIHJlLnNpZHgsIHJlLnJlX2R1ciwgZGlmZl90cyk7CisKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJIlxuJXM6IE1vZGlmeSBwdWxzZSBkdXIgdG8gZml0IHZhbGlkIHJhbmdlIFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisKKwkJCXJlLnJlX2R1ciA9IERGU19UWVBFNF9XQVJfVkFMSURfUFVMU0VfRFVSQVRJT047CisJCX0KKworCQkvKgorCQkgKiBNb2RpZnlpbmcgdGhlIHB1bHNlIGR1cmF0aW9uIGZvciBFVFNJIFR5cGUgMgorCQkgKiBhbmQgRVRTSSB0eXBlIDMgcmFkYXIgcHVsc2VzIHdoZW4gdGhlIGZvbGxvd2luZworCQkgKiBjb25kaXRpb24gaXMgcmVwb3J0ZWQgaW4gcmFkYXIgc3VtbWFyeSByZXBvcnQuCisJCSAqLworCQlpZiAoKERGU19FVFNJX0RPTUFJTiA9PSBkZnMtPmRmc2RvbWFpbikgJiYKKwkJICAgICgoY2hhbi0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9WSFQ4MCkgPT0KKwkJCUlFRUU4MDIxMV9DSEFOX1ZIVDgwKSAmJgorCQkgICAgKGNoYW4tPmljX3ByaV9mcmVxX2NlbnRlcl9mcmVxX21oel9zZXBhcmF0aW9uID09CisJCQlERlNfV0FSX1BMVVNfMzBfTUhaX1NFUEFSQVRJT04gfHwKKwkJICAgICBjaGFuLT5pY19wcmlfZnJlcV9jZW50ZXJfZnJlcV9taHpfc2VwYXJhdGlvbiA9PQorCQkJREZTX1dBUl9NSU5VU18zMF9NSFpfU0VQQVJBVElPTikgJiYKKwkJICAgIChyZS5zaWR4ID09IERGU19XQVJfUEVBS19JTkRFWF9aRVJPKSAmJgorCQkgICAgKHJlLnJlX2R1ciA+CisJCQlERlNfRVRTSV9UWVBFMl9UWVBFM19XQVJfUFVMU0VfRFVSX0xPV0VSX0xJTUlUICYmCisJCSAgICAgcmUucmVfZHVyIDwKKwkJCURGU19FVFNJX1RZUEUyX1RZUEUzX1dBUl9QVUxTRV9EVVJfVVBQRVJfTElNSVQpICYmCisJCSAgICAoKGRpZmZfdHMgPiBERlNfRVRTSV9UWVBFMl9XQVJfUFJJX0xPV0VSX0xJTUlUICYmCisJCQlkaWZmX3RzIDwgREZTX0VUU0lfVFlQRTJfV0FSX1BSSV9VUFBFUl9MSU1JVCkgfHwKKwkJICAgICAoZGlmZl90cyA+IERGU19FVFNJX1RZUEUzX1dBUl9QUklfTE9XRVJfTElNSVQgJiYKKwkJCWRpZmZfdHMgPCBERlNfRVRTSV9UWVBFM19XQVJfUFJJX1VQUEVSX0xJTUlUKSkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJIlxuJXM6Y2hhbi0+aWNfZmxhZ3M9MHgleCxNSHogU2VwYXJhdGlvbj0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgY2hhbi0+aWNfZmxhZ3MsCisJCQkJY2hhbi0+aWNfcHJpX2ZyZXFfY2VudGVyX2ZyZXFfbWh6X3NlcGFyYXRpb24pOworCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSIlczpQZWFrIEluZGV4ID0lZCxyZS5yZV9kdXIgPSVkLGRpZmZfdHMgPSVkXG4iLAorCQkJCV9fZnVuY19fLCByZS5zaWR4LCByZS5yZV9kdXIsIGRpZmZfdHMpOworCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSIlczpNb2RpZnkgRVRTSSBwdWxzZSBkdXIgdG8gdmFsaWQgcmFuZ2UgXG4iLAorCQkJCV9fZnVuY19fKTsKKworCQkJcmUucmVfZHVyICA9IERGU19FVFNJX1dBUl9WQUxJRF9QVUxTRV9EVVJBVElPTjsKKwkJfQorCisJCS8qIEJJTjUgcHVsc2VzIGFyZSBGQ0MgYW5kIEphcGFuIHNwZWNpZmljICovCisKKwkJaWYgKChkZnMtPmRmc2RvbWFpbiA9PSBERlNfRkNDX0RPTUFJTikKKwkJICAgIHx8IChkZnMtPmRmc2RvbWFpbiA9PSBERlNfTUtLNF9ET01BSU4pKSB7CisJCQlmb3IgKHAgPSAwOworCQkJICAgICAocCA8IGRmcy0+ZGZzX3JpbmZvLnJuX251bWJpbjVyYWRhcnMpICYmICghZm91bmQpOworCQkJICAgICBwKyspIHsKKwkJCQlzdHJ1Y3QgZGZzX2JpbjVyYWRhcnMgKmJyOworCisJCQkJYnIgPSAmKGRmcy0+ZGZzX2I1cmFkYXJzW3BdKTsKKwkJCQlpZiAoZGZzX2JpbjVfY2hlY2tfcHVsc2UoZGZzLCAmcmUsIGJyKSkgeworCQkJCQkvKiBUaGlzIGlzIGEgdmFsaWQgQmluNSBwdWxzZSwgY2hlY2sgaWYgaXQgYmVsb25ncyB0byBhIGJ1cnN0ICovCisJCQkJCXJlLnJlX2R1ciA9CisJCQkJCQlkZnNfcmV0YWluX2JpbjVfYnVyc3RfcGF0dGVybihkZnMsCisJCQkJCQkJCQkgICAgICBkaWZmX3RzLAorCQkJCQkJCQkJICAgICAgcmUuCisJCQkJCQkJCQkgICAgICByZV9kdXIpOworCQkJCQkvKiBSZW1lbWJlciBvdXIgY29tcHV0ZWQgZHVyYXRpb24gZm9yIHRoZSBuZXh0IHB1bHNlIGluIHRoZSBidXJzdCAoaWYgbmVlZGVkKSAqLworCQkJCQlkZnMtPmRmc19yaW5mby5kZnNfYmluNV9jaGlycF90cyA9CisJCQkJCQl0aGlzX3RzOworCQkJCQlkZnMtPmRmc19yaW5mby5kZnNfbGFzdF9iaW41X2R1ciA9CisJCQkJCQlyZS5yZV9kdXI7CisKKwkJCQkJaWYgKGRmc19iaW41X2FkZHB1bHNlCisJCQkJCQkgICAgKGRmcywgYnIsICZyZSwgdGhpc190cykpIHsKKwkJCQkJCWZvdW5kIHw9IGRmc19iaW41X2NoZWNrKGRmcyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlERlNfRFBSSU5USyhkZnMsCisJCQkJCQkgICAgQVRIX0RFQlVHX0RGU19CSU41X1BVTFNFLAorCQkJCQkJICAgICIlcyBub3QgYSBCSU41IHB1bHNlIChkdXI9JWQpIiwKKwkJCQkJCSAgICBfX2Z1bmNfXywgcmUucmVfZHVyKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZm91bmQpIHsKKwkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUywgIiVzOiBGb3VuZCBiaW41IHJhZGFyIiwKKwkJCQkgICAgX19mdW5jX18pOworCQkJcmV0dmFsIHw9IGZvdW5kOworCQkJZ290byBkZnNmb3VuZDsKKwkJfQorCisJCXRhYmxlZGVwdGggPSAwOworCQlyZiA9IE5VTEw7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzEsCisJCQkgICAgIiAgKioqIGNoYW4gZnJlcSAoJWQpOiB0cyAlbGx1IGR1ciAldSByc3NpICV1IiwKKwkJCSAgICBycy0+cnNfY2hhbi5pY19mcmVxLCAodW5zaWduZWQgbG9uZyBsb25nKXRoaXNfdHMsCisJCQkgICAgcmUucmVfZHVyLCByZS5yZV9yc3NpKTsKKworCQl3aGlsZSAoKHRhYmxlZGVwdGggPCBERlNfTUFYX1JBREFSX09WRVJMQVApICYmCisJCSAgICAgICAoKGRmcy0+ZGZzX3JhZGFydGFibGVbcmUucmVfZHVyXSlbdGFibGVkZXB0aF0gIT0gLTEpICYmCisJCSAgICAgICAoIXJldHZhbCkpIHsKKwkJCWZ0ID0gZGZzLT4KKwkJCSAgICAgZGZzX3JhZGFyZlsoKGRmcy0+CisJCQkJCSAgZGZzX3JhZGFydGFibGVbcmUuCisJCQkJCQkJIHJlX2R1cl0pW3RhYmxlZGVwdGhdKV07CisJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMyLAorCQkJCSAgICAiICAqKiBSRCAoJWQpOiB0cyAleCBkdXIgJXUgcnNzaSAldSIsCisJCQkJICAgIHJzLT5yc19jaGFuLmljX2ZyZXEsIHJlLnJlX3RzLCByZS5yZV9kdXIsCisJCQkJICAgIHJlLnJlX3Jzc2kpOworCisJCQlpZiAocmUucmVfcnNzaSA8IGZ0LT5mdF9yc3NpdGhyZXNoICYmIHJlLnJlX2R1ciA+IDQpIHsKKwkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMyLAorCQkJCQkgICAgIiVzIDogUmVqZWN0aW5nIG9uIHJzc2kgcnNzaT0ldSB0aHJlc2g9JXUiLAorCQkJCQkgICAgX19mdW5jX18sIHJlLnJlX3Jzc2ksCisJCQkJCSAgICBmdC0+ZnRfcnNzaXRocmVzaCk7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICIlc1slZF06IFJlamVjdGluZyBvbiByc3NpIHJzc2k9JXUgdGhyZXNoPSV1IiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHJlLnJlX3Jzc2ksCisJCQkJCSAgZnQtPmZ0X3Jzc2l0aHJlc2gpOworCQkJCXRhYmxlZGVwdGgrKzsKKwkJCQlBVEhfREZTUV9MT0NLKGRmcyk7CisJCQkJZW1wdHkgPSBTVEFJTFFfRU1QVFkoJihkZnMtPmRmc19yYWRhcnEpKTsKKwkJCQlBVEhfREZTUV9VTkxPQ0soZGZzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRlbHRhVCA9IHRoaXNfdHMgLSBmdC0+ZnRfbGFzdF90czsKKwkJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzIsCisJCQkJICAgICJkZWx0YVQgPSAlbGxkICh0czogMHglbGx4KSAobGFzdCB0czogMHglbGx4KSIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGVsdGFULAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXRoaXNfdHMsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnQtPmZ0X2xhc3RfdHMpOworCQkJaWYgKChkZWx0YVQgPCBmdC0+ZnRfbWlucHJpKSAmJiAoZGVsdGFUICE9IDApKSB7CisJCQkJLyogVGhpcyBjaGVjayBpcyBmb3IgdGhlIHdob2xlIGZpbHRlciB0eXBlLiBJbmRpdmlkdWFsIGZpbHRlcnMKKwkJCQkgICB3aWxsIGNoZWNrIHRoaXMgYWdhaW4uIFRoaXMgaXMgZmlyc3QgbGluZSBvZiBmaWx0ZXJpbmcuICovCisJCQkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJCQkJICAgICIlczogUmVqZWN0aW5nIG9uIHByaSBwcmk9JWxsZCBtaW5wcmk9JXUiLAorCQkJCQkgICAgX19mdW5jX18sCisJCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWRlbHRhVCwKKwkJCQkJICAgIGZ0LT5mdF9taW5wcmkpOworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICAiJXNbJWRdOlJlamVjdGluZyBvbiBwcmkgcHJpPSVsbGQgbWlucHJpPSV1IiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZWx0YVQsCisJCQkJCSAgZnQtPmZ0X21pbnByaSk7CisJCQkJdGFibGVkZXB0aCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZm9yIChwID0gMCwgZm91bmQgPSAwOworCQkJICAgICAocCA8IGZ0LT5mdF9udW1maWx0ZXJzKSAmJiAoIWZvdW5kKTsgcCsrKSB7CisJCQkJcmYgPSAmKGZ0LT5mdF9maWx0ZXJzW3BdKTsKKwkJCQlpZiAoKHJlLnJlX2R1ciA+PSByZi0+cmZfbWluZHVyKQorCQkJCSAgICAmJiAocmUucmVfZHVyIDw9IHJmLT5yZl9tYXhkdXIpKSB7CisJCQkJCS8qIFRoZSBhYm92ZSBjaGVjayBpcyBwcm9iYWJseSBub3QgbmVjZXNzYXJ5ICovCisJCQkJCWRlbHRhVCA9CisJCQkJCQkodGhpc190cyA8CisJCQkJCQkgcmYtPnJmX2RsLgorCQkJCQkJIGRsX2xhc3RfdHMpCisJCQkJCQk/IChpbnQ2NF90KSAoKERGU19UU0ZfV1JBUCAtCisJCQkJCQkJICAgICAgcmYtPnJmX2RsLgorCQkJCQkJCSAgICAgIGRsX2xhc3RfdHMpICsKKwkJCQkJCQkgICAgIHRoaXNfdHMgKworCQkJCQkJCSAgICAgMSkgOiB0aGlzX3RzIC0KKwkJCQkJCXJmLT5yZl9kbC5kbF9sYXN0X3RzOworCisJCQkJCWlmICgoZGVsdGFUIDwgcmYtPnJmX21pbnByaSkKKwkJCQkJICAgICYmIChkZWx0YVQgIT0gMCkpIHsKKwkJCQkJCS8qIFNlY29uZCBsaW5lIG9mIFBSSSBmaWx0ZXJpbmcuICovCisJCQkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMyLAorCQkJCQkJCSAgICAiZmlsdGVySUQgJWQgOiBSZWplY3Rpbmcgb24gaW5kaXZpZHVhbCBmaWx0ZXIgbWluIFBSSSBkZWx0YVQ9JWxsZCByZi0+cmZfbWlucHJpPSV1IiwKKwkJCQkJCQkgICAgcmYtPnJmX3B1bHNlaWQsCisJCQkJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJICAgIGRlbHRhVCwKKwkJCQkJCQkgICAgcmYtPnJmX21pbnByaSk7CisJCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJCQkgICIlc1slZF06ZmlsdGVySUQ9ICVkOjpSZWplY3Rpbmcgb24gaW5kaXZpZHVhbCBmaWx0ZXIgbWluIFBSSSBkZWx0YVQ9JWxsZCByZi0+cmZfbWlucHJpPSV1IiwKKwkJCQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkJCQkgIHJmLT5yZl9wdWxzZWlkLAorCQkJCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQkgIGRlbHRhVCwKKwkJCQkJCQkgIHJmLT5yZl9taW5wcmkpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQlpZiAocmYtPnJmX2lnbm9yZV9wcmlfd2luZG93ID4gMCkgeworCQkJCQkJaWYgKGRlbHRhVCA8IHJmLT5yZl9taW5wcmkpIHsKKwkJCQkJCQlERlNfRFBSSU5USyhkZnMsCisJCQkJCQkJCSAgICBBVEhfREVCVUdfREZTMiwKKwkJCQkJCQkJICAgICJmaWx0ZXJJRCAlZCA6IFJlamVjdGluZyBvbiBpbmRpdmlkdWFsIGZpbHRlciBtYXggUFJJIGRlbHRhVD0lbGxkIHJmLT5yZl9taW5wcmk9JXUiLAorCQkJCQkJCQkgICAgcmYtPgorCQkJCQkJCQkgICAgcmZfcHVsc2VpZCwKKwkJCQkJCQkJICAgICh1bnNpZ25lZAorCQkJCQkJCQkgICAgIGxvbmcgbG9uZykKKwkJCQkJCQkJICAgIGRlbHRhVCwKKwkJCQkJCQkJICAgIHJmLT4KKwkJCQkJCQkJICAgIHJmX21pbnByaSk7CisJCQkJCQkJQ0RGX1RSQUNFCisJCQkJCQkJCShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCQkJCSIlc1slZF06ZmlsdGVySUQ9ICVkIDo6IFJlamVjdGluZyBvbiBpbmRpdmlkdWFsIGZpbHRlciBtYXggUFJJIGRlbHRhVD0lbGxkIHJmLT5yZl9taW5wcmk9JXUiLAorCQkJCQkJCQlfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJCQkJCXJmLT5yZl9wdWxzZWlkLAorCQkJCQkJCQkodW5zaWduZWQgbG9uZworCQkJCQkJCQkgbG9uZylkZWx0YVQsCisJCQkJCQkJCXJmLT5yZl9taW5wcmkpOworCQkJCQkJCS8qIEJ1dCB1cGRhdGUgdGhlIGxhc3QgdGltZSBzdGFtcCAqLworCQkJCQkJCXJmLT5yZl9kbC5kbF9sYXN0X3RzID0KKwkJCQkJCQkJdGhpc190czsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJLyoKKwkJCQkJCSAgIFRoZSBIVyBtYXkgbWlzcyBzb21lIHB1bHNlcyBlc3BlY2lhbGx5IHdpdGggaGlnaCBjaGFubmVsIGxvYWRpbmcuCisJCQkJCQkgICBUaGlzIGlzIHRydWUgZm9yIEphcGFuIFc1MyB3aGVyZSBjaGFubmVsIGxvYW9kaW5nIGlzIDUwJS4gQWxzbworCQkJCQkJICAgZm9yIEVUU0kgd2hlcmUgY2hhbm5lbCBsb2FkaW5nIGlzIDMwJSB0aGlzIGNhbiBiZSBhbiBpc3N1ZSB0b28uCisJCQkJCQkgICBUbyB0YWtlIGNhcmUgb2YgbWlzc2luZyBwdWxzZXMsIHdlIGludHJvZHVjZSBwcmlfbWFyZ2luIG11bHRpcGxpZS4KKwkJCQkJCSAgIFRoaXMgaXMgbm9ybWFsbHkgMiBidXQgY2FuIGJlIGhpZ2hlciBmb3IgVzUzLgorCQkJCQkJICovCisKKwkJCQkJCWlmICgoZGVsdGFUID4KKwkJCQkJCSAgICAgKGRmcy0+ZGZzX3ByaV9tdWx0aXBsaWVyICoKKwkJCQkJCSAgICAgIHJmLT5yZl9tYXhwcmkpKQorCQkJCQkJICAgIHx8IChkZWx0YVQgPAorCQkJCQkJCXJmLT5yZl9taW5wcmkpKSB7CisJCQkJCQkJREZTX0RQUklOVEsoZGZzLAorCQkJCQkJCQkgICAgQVRIX0RFQlVHX0RGUzIsCisJCQkJCQkJCSAgICAiZmlsdGVySUQgJWQgOiBSZWplY3Rpbmcgb24gaW5kaXZpZHVhbCBmaWx0ZXIgbWF4IFBSSSBkZWx0YVQ9JWxsZCByZi0+cmZfbWlucHJpPSV1IiwKKwkJCQkJCQkJICAgIHJmLT4KKwkJCQkJCQkJICAgIHJmX3B1bHNlaWQsCisJCQkJCQkJCSAgICAodW5zaWduZWQKKwkJCQkJCQkJICAgICBsb25nIGxvbmcpCisJCQkJCQkJCSAgICBkZWx0YVQsCisJCQkJCQkJCSAgICByZi0+CisJCQkJCQkJCSAgICByZl9taW5wcmkpOworCQkJCQkJCUNERl9UUkFDRQorCQkJCQkJCQkoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCQkJCUNERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkJCQkiJXNbJWRdOmZpbHRlcklEPSAlZCA6OiBSZWplY3Rpbmcgb24gaW5kaXZpZHVhbCBmaWx0ZXIgbWF4IFBSSSBkZWx0YVQ9JWxsZCByZi0+cmZfbWlucHJpPSV1IiwKKwkJCQkJCQkJX19mdW5jX18sIF9fTElORV9fLAorCQkJCQkJCQlyZi0+cmZfcHVsc2VpZCwKKwkJCQkJCQkJKHVuc2lnbmVkIGxvbmcKKwkJCQkJCQkJIGxvbmcpZGVsdGFULAorCQkJCQkJCQlyZi0+cmZfbWlucHJpKTsKKwkJCQkJCQkvKiBCdXQgdXBkYXRlIHRoZSBsYXN0IHRpbWUgc3RhbXAgKi8KKwkJCQkJCQlyZi0+cmZfZGwuZGxfbGFzdF90cyA9CisJCQkJCQkJCXRoaXNfdHM7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZGZzX2FkZF9wdWxzZShkZnMsIHJmLCAmcmUsIGRlbHRhVCwKKwkJCQkJCSAgICAgIHRoaXNfdHMpOworCisJCQkJCS8qIElmIHRoaXMgaXMgYW4gZXh0ZW5zaW9uIGNoYW5uZWwgZXZlbnQsIGZsYWcgaXQgZm9yIGZhbHNlIGFsYXJtIHJlZHVjdGlvbiAqLworCQkJCQlpZiAocmUucmVfY2hhbmluZGV4ID09CisJCQkJCSAgICBkZnMtPmRmc19leHRjaGFuX3JhZGluZGV4KSB7CisJCQkJCQlleHRfY2hhbl9ldmVudF9mbGFnID0gMTsKKwkJCQkJfQorCQkJCQlpZiAocmYtPnJmX3BhdHRlcm50eXBlID09IDIpIHsKKwkJCQkJCWZvdW5kID0KKwkJCQkJCQlkZnNfc3RhZ2dlcmVkX2NoZWNrKGRmcywgcmYsCisJCQkJCQkJCQkgICAgKHVpbnQzMl90KQorCQkJCQkJCQkJICAgIGRlbHRhVCwKKwkJCQkJCQkJCSAgICByZS4KKwkJCQkJCQkJCSAgICByZV9kdXIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZm91bmQgPQorCQkJCQkJCWRmc19iaW5fY2hlY2soZGZzLCByZiwKKwkJCQkJCQkJICAgICAgKHVpbnQzMl90KQorCQkJCQkJCQkgICAgICBkZWx0YVQsCisJCQkJCQkJCSAgICAgIHJlLnJlX2R1ciwKKwkJCQkJCQkJICAgICAgZXh0X2NoYW5fZXZlbnRfZmxhZyk7CisJCQkJCX0KKwkJCQkJaWYgKGRmcy0+CisJCQkJCSAgICBkZnNfZGVidWdfbWFzayAmIEFUSF9ERUJVR19ERlMyKSB7CisJCQkJCQlkZnNfcHJpbnRfZGVsYXlsaW5lKGRmcywKKwkJCQkJCQkJICAgICZyZi0+cmZfZGwpOworCQkJCQl9CisJCQkJCXJmLT5yZl9kbC5kbF9sYXN0X3RzID0gdGhpc190czsKKwkJCQl9CisJCQl9CisJCQlmdC0+ZnRfbGFzdF90cyA9IHRoaXNfdHM7CisJCQlyZXR2YWwgfD0gZm91bmQ7CisJCQlpZiAoZm91bmQpIHsKKwkJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMzLAorCQkJCQkgICAgIkZvdW5kIG9uIGNoYW5uZWwgbWluRHVyID0gJWQsIGZpbHRlcklkID0gJWQiLAorCQkJCQkgICAgZnQtPmZ0X21pbmR1ciwKKwkJCQkJICAgIHJmICE9IE5VTEwgPyByZi0+cmZfcHVsc2VpZCA6IC0xKTsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkiJXNbJWRdOiMjIyBGb3VuZCBvbiBjaGFubmVsIG1pbkR1ciA9ICVkLGZpbHRlcklkID0gJWQgIyMjIiwKKwkJCQkJX19mdW5jX18sX19MSU5FX18sZnQtPmZ0X21pbmR1ciwKKwkJCQkJcmYgIT0gTlVMTCA/IHJmLT5yZl9wdWxzZWlkIDogLTEpOworCQkJfQorCQkJdGFibGVkZXB0aCsrOworCQl9CisJCUFUSF9ERlNRX0xPQ0soZGZzKTsKKwkJZW1wdHkgPSBTVEFJTFFfRU1QVFkoJihkZnMtPmRmc19yYWRhcnEpKTsKKwkJQVRIX0RGU1FfVU5MT0NLKGRmcyk7CisJfQorZGZzZm91bmQ6CisJaWYgKHJldHZhbCkgeworCQkvKiBDb2xsZWN0IHN0YXRzICovCisJCWRmcy0+YXRoX2Rmc19zdGF0cy5udW1fcmFkYXJfZGV0ZWN0cysrOworCQl0aGlzY2hhbiA9ICZycy0+cnNfY2hhbjsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlc1slZF06ICMjIyBSQURBUiBGT1VORCBPTiBDSEFOTkVMICVkICglZCBNSHopICMjIyIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgdGhpc2NoYW4tPmljX2llZWUsCisJCQkgIHRoaXNjaGFuLT5pY19mcmVxKTsKKwkJREZTX1BSSU5USygiUmFkYXIgZm91bmQgb24gY2hhbm5lbCAlZCAoJWQgTUh6KSIsCisJCQkgICB0aGlzY2hhbi0+aWNfaWVlZSwgdGhpc2NoYW4tPmljX2ZyZXEpOworCisjaWYgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVNQUNERlMgOiBUT0RPICovCisJCS8qIERpc2FibGUgcmFkYXIgZm9yIG5vdyAqLworCQlyZmlsdCA9IGF0aF9oYWxfZ2V0cnhmaWx0ZXIoYWgpOworCQlyZmlsdCAmPSB+SEFMX1JYX0ZJTFRFUl9QSFlSQURBUjsKKwkJYXRoX2hhbF9zZXRyeGZpbHRlcihhaCwgcmZpbHQpOworI2VuZGlmCisJCWRmc19yZXNldF9yYWRhcnEoZGZzKTsKKwkJZGZzX3Jlc2V0X2FsbGRlbGF5bGluZXMoZGZzKTsKKwkJLyogWFhYIFNob3VsZCB3ZSByZWFsbHkgZW5hYmxlIGFnYWluPyBNYXliZSBub3QuLi4gKi8KKy8qIE5vIHJlYXNvbiB0byByZS1lbmFibGUgc28gZmFyIC0gQWpheSovCisjaWYgMAorCQlwZS5wZV9maXJwd3IgPSBycy0+cnNfZmlycHdyOworCQlwZS5wZV9ycnNzaSA9IHJzLT5yc19yYWRhcnJzc2k7CisJCXBlLnBlX2hlaWdodCA9IHJzLT5yc19oZWlnaHQ7CisJCXBlLnBlX3Byc3NpID0gcnMtPnJzX3B1bHNlcnNzaTsKKwkJcGUucGVfaW5iYW5kID0gcnMtPnJzX2luYmFuZDsKKwkJLyogNTQxMyBzcGVjaWZpYyAqLworCQlwZS5wZV9yZWxwd3IgPSBycy0+cnNfcmVscHdyOworCQlwZS5wZV9yZWxzdGVwID0gcnMtPnJzX3JlbHN0ZXA7CisJCXBlLnBlX21heGxlbiA9IHJzLT5yc19tYXhsZW47CisKKwkJYXRoX2hhbF9lbmFibGVkZnMoYWgsICZwZSk7CisJCXJmaWx0IHw9IEhBTF9SWF9GSUxURVJfUEhZUkFEQVI7CisJCWF0aF9oYWxfc2V0cnhmaWx0ZXIoYWgsIHJmaWx0KTsKKyNlbmRpZgorCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMxLAorCQkJICAgICJQcmltYXJ5IGNoYW5uZWwgZnJlcSA9ICV1IGZsYWdzPTB4JXgiLAorCQkJICAgIGNoYW4tPmljX2ZyZXEsIGNoYW4tPmljX2ZsYWdleHQpOworCQlpZiAoKGRmcy0+aWMtPmljX2N1cmNoYW4tPmljX2ZyZXEgIT0gdGhpc2NoYW4tPmljX2ZyZXEpKSB7CisJCQlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMxLAorCQkJCSAgICAiRXh0IGNoYW5uZWwgZnJlcSA9ICV1IGZsYWdzPTB4JXgiLAorCQkJCSAgICB0aGlzY2hhbi0+aWNfZnJlcSwgdGhpc2NoYW4tPmljX2ZsYWdleHQpOworCQl9CisJCWRmcy0+ZGZzX3BoeWVycl9mcmVxX21pbiA9IDB4N2ZmZmZmZmY7CisJCWRmcy0+ZGZzX3BoeWVycl9mcmVxX21heCA9IDA7CisJCWRmcy0+ZGZzX3BoeWVycl93NTNfY291bnRlciA9IDA7CisJfQorCS8qIENERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sICJJTiBGVU5DICVzWyVkXTogcmV0dmFsID0gJWQgIixfX2Z1bmNfXyxfX0xJTkVfXyxyZXR2YWwpOyAqLworCXJldHVybiByZXR2YWw7CisvKiAjZW5kaWYgKi8KKy8qICAgICAgICByZXR1cm4gMTsgKi8KK30KKworI2VuZGlmIC8qIEFUSF9TVVBQT1JUX0RGUyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zYXAvZGZzL3NyYy9kZnNfc3RhZ2dlcmVkLmMgYi9jb3JlL3NhcC9kZnMvc3JjL2Rmc19zdGFnZ2VyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWMwNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zYXAvZGZzL3NyYy9kZnNfc3RhZ2dlcmVkLmMKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgIGRmc19zdGFnZ2VyZWQuYworCisgICBPVkVSVklFVzoKKworICAgU291cmNlIGNvZGUgYm9ycm93ZWQgZnJvbSBRQ0FfTUFJTiBERlMgbW9kdWxlCisKKyAgIERFUEVOREVOQ0lFUzoKKworICAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisgICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKyAgIC0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJkZnMuaCIKKy8qIFRPIERPIERGUworICAgI2luY2x1ZGUgPGllZWU4MDIxMV92YXIuaD4KKyAqLworI2lmZGVmIEFUSF9TVVBQT1JUX0RGUworCitzdGF0aWMgaW50IGlzX3ByaV9tdWx0aXBsZSh1aW50MzJfdCBzYW1wbGVfcHJpLCB1aW50MzJfdCByZWZwcmkpCit7CisjZGVmaW5lIE1BWF9BTExPV0VEX01JU1NFRCAzCisJaW50IGk7CisKKwlpZiAoc2FtcGxlX3ByaSA8IHJlZnByaSB8fCAoIXJlZnByaSkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMTsgaSA8PSBNQVhfQUxMT1dFRF9NSVNTRUQ7IGkrKykgeworCQlpZiAoKHNhbXBsZV9wcmkgJSAoaSAqIHJlZnByaSkgPD0gNSkpIHsKKwkJCS8qIHByaW50aygic2FtcGxlX3ByaT0lZCBpcyBhIG11bHRpcGxlIG9mIHJlZnByaT0lZFxuIiwgc2FtcGxlX3ByaSwgcmVmcHJpKTsgKi8KKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworI3VuZGVmIE1BWF9BTExPV0VEX01JU1NFRAorfQorCitzdGF0aWMgaW50IGlzX3VuaXF1ZV9wcmkodWludDMyX3QgaGlnaGVzdHByaSwgdWludDMyX3QgbWlkcHJpLAorCQkJIHVpbnQzMl90IGxvd2VzdHByaSwgdWludDMyX3QgcmVmcHJpKQoreworI2RlZmluZSBERlNfU1RBR0dFUkVEX1BSSV9NQVJHSU5fTUlOICAyMAorI2RlZmluZSBERlNfU1RBR0dFUkVEX1BSSV9NQVJHSU5fTUFYICA0MDAKKwlpZiAoKERGU19ESUZGKGxvd2VzdHByaSwgcmVmcHJpKSA+PSBERlNfU1RBR0dFUkVEX1BSSV9NQVJHSU5fTUlOKSAmJgorCSAgICAoREZTX0RJRkYobWlkcHJpLCByZWZwcmkpID49IERGU19TVEFHR0VSRURfUFJJX01BUkdJTl9NSU4pICYmCisJICAgIChERlNfRElGRihoaWdoZXN0cHJpLCByZWZwcmkpID49IERGU19TVEFHR0VSRURfUFJJX01BUkdJTl9NSU4pKSB7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWlmICgoaXNfcHJpX211bHRpcGxlKHJlZnByaSwgaGlnaGVzdHByaSkpCisJCSAgICB8fCAoaXNfcHJpX211bHRpcGxlKHJlZnByaSwgbG93ZXN0cHJpKSkKKwkJICAgIHx8IChpc19wcmlfbXVsdGlwbGUocmVmcHJpLCBtaWRwcmkpKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKKyN1bmRlZiBERlNfU1RBR0dFUkVEX1BSSV9NQVJHSU5fTUlOCisjdW5kZWYgREZTX1NUQUdHRVJFRF9QUklfTUFSR0lOX01BWAorfQorCitpbnQgZGZzX3N0YWdnZXJlZF9jaGVjayhzdHJ1Y3QgYXRoX2RmcyAqZGZzLCBzdHJ1Y3QgZGZzX2ZpbHRlciAqcmYsCisJCQl1aW50MzJfdCBkZWx0YVQsIHVpbnQzMl90IHdpZHRoKQoreworCXVpbnQzMl90IHJlZnByaSwgcmVmZHVyLCBzZWFyY2hwcmkgPSAwLCBkZWx0YXByaTsgICAgICAgLyogLCBhdmVyYWdlcmVmcHJpOyAqLworCXVpbnQzMl90IG4sIGksIHByaW1hcmdpbiwgZHVybWFyZ2luOworCWludCBzY29yZVtERlNfTUFYX0RMX1NJWkVdLCBkZWxheWluZGV4LCBkaW5kZXgsIGZvdW5kID0gMDsKKwlzdHJ1Y3QgZGZzX2RlbGF5bGluZSAqZGw7CisJdWludDMyX3Qgc2NvcmVpbmRleCwgbG93cHJpaW5kZXggPSAwLCBsb3dwcmkgPSAweGZmZmY7CisjaWYgMAorCWludCBudW1wdWxzZXMgPSAwOworI2VuZGlmCisJaW50IGhpZ2hlcnRoYW4sIGxvd2VydGhhbiwgbnVtc2NvcmVzOworCWludCBudW1wdWxzZXNoaWdoID0gMCwgbnVtcHVsc2VzbWlkID0gMCwgbnVtcHVsc2VzdGVtcCA9IDA7CisJdWludDMyX3QgbG93ZXN0c2NvcmUgPSAwLCBsb3dlc3RzY29yZWluZGV4ID0gMCwgbG93ZXN0cHJpID0gMDsKKwl1aW50MzJfdCBtaWRzY29yZSA9IDAsIG1pZHNjb3JlaW5kZXggPSAwLCBtaWRwcmkgPSAwOworCXVpbnQzMl90IGhpZ2hlc3RzY29yZSA9IDAsIGhpZ2hlc3RzY29yZWluZGV4ID0gMCwgaGlnaGVzdHByaSA9IDA7CisKKwlkbCA9ICZyZi0+cmZfZGw7CisJaWYgKGRsLT5kbF9udW1lbGVtcyA8IChyZi0+cmZfdGhyZXNob2xkIC0gMSkpIHsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJCSAgICAibnVtZWxlbXMgJWQgPCB0aHJlc2hvbGQgZm9yIGZpbHRlciAlZFxuIiwKKwkJCSAgICBkbC0+ZGxfbnVtZWxlbXMsIHJmLT5yZl9wdWxzZWlkKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChkZWx0YVQgPiByZi0+cmZfZmlsdGVybGVuKSB7CisJCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzIsCisJCQkgICAgIm51bWVsZW1zICVkIDwgdGhyZXNob2xkIGZvciBmaWx0ZXIgJWRcbiIsCisJCQkgICAgZGwtPmRsX251bWVsZW1zLCByZi0+cmZfcHVsc2VpZCk7CisJCXJldHVybiAwOworCX0KKwlwcmltYXJnaW4gPSA2OworCWlmIChyZi0+cmZfbWF4ZHVyIDwgMTApIHsKKwkJZHVybWFyZ2luID0gNDsKKwl9IGVsc2UgeworCQlkdXJtYXJnaW4gPSA2OworCX0KKworCU9TX01FTVpFUk8oc2NvcmUsIHNpemVvZihpbnQpICogREZTX01BWF9ETF9TSVpFKTsKKwkvKiBmaW5kIG91dCB0aGUgbG93ZXN0IHByaSAqLworCWZvciAobiA9IDA7IG4gPCBkbC0+ZGxfbnVtZWxlbXM7IG4rKykgeworCQlkZWxheWluZGV4ID0gKGRsLT5kbF9maXJzdGVsZW0gKyBuKSAmIERGU19NQVhfRExfTUFTSzsKKwkJcmVmcHJpID0gZGwtPmRsX2VsZW1zW2RlbGF5aW5kZXhdLmRlX3RpbWU7CisJCWlmIChyZWZwcmkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChyZWZwcmkgPCBsb3dwcmkpIHsKKwkJCWxvd3ByaSA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV90aW1lOworCQkJbG93cHJpaW5kZXggPSBuOworCQl9CisJfQorCS8qIGZpbmQgb3V0IHRoZSBlYWNoIGRlbGF5IGVsZW1lbnQncyBwcmkgc2NvcmUgKi8KKwlmb3IgKG4gPSAwOyBuIDwgZGwtPmRsX251bWVsZW1zOyBuKyspIHsKKwkJZGVsYXlpbmRleCA9IChkbC0+ZGxfZmlyc3RlbGVtICsgbikgJiBERlNfTUFYX0RMX01BU0s7CisJCXJlZnByaSA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV90aW1lOworCQlpZiAocmVmcHJpID09IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChyZWZwcmkgPiByZi0+cmZfbWF4cHJpKSB8fCAocmVmcHJpIDwgcmYtPnJmX21pbnByaSkpIHsKKwkJCXNjb3JlW25dID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGRsLT5kbF9udW1lbGVtczsgaSsrKSB7CisJCQlkaW5kZXggPSAoZGwtPmRsX2ZpcnN0ZWxlbSArIGkpICYgREZTX01BWF9ETF9NQVNLOworCQkJc2VhcmNocHJpID0gZGwtPmRsX2VsZW1zW2RpbmRleF0uZGVfdGltZTsKKwkJCWRlbHRhcHJpID0gREZTX0RJRkYoc2VhcmNocHJpLCByZWZwcmkpOworCQkJaWYgKGRlbHRhcHJpIDwgcHJpbWFyZ2luKQorCQkJCXNjb3JlW25dKys7CisJCX0KKwl9CisJZm9yIChuID0gMDsgbiA8IGRsLT5kbF9udW1lbGVtczsgbisrKSB7CisJCWRlbGF5aW5kZXggPSAoZGwtPmRsX2ZpcnN0ZWxlbSArIG4pICYgREZTX01BWF9ETF9NQVNLOworCQlyZWZkdXIgPSBkbC0+ZGxfZWxlbXNbZGVsYXlpbmRleF0uZGVfdGltZTsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwgInNjb3JlWyVkXT0lZCBwcmk9JWRcbiIsIG4sCisJCQkgICAgc2NvcmVbbl0sIHJlZmR1cik7CisJfQorCisJLyogZmluZCBvdXQgdGhlIDIgb3IgMyBoaWdoZXN0IHNjb3JlcnMgKi8KKwlzY29yZWluZGV4ID0gMDsKKwloaWdoZXN0c2NvcmUgPSAwOworCWhpZ2hlc3RzY29yZWluZGV4ID0gMDsKKwloaWdoZXN0cHJpID0gMDsKKwludW1zY29yZXMgPSAwOworCWxvd2VzdHNjb3JlID0gMDsKKworCWZvciAobiA9IDA7IG4gPCBkbC0+ZGxfbnVtZWxlbXM7IG4rKykgeworCQloaWdoZXJ0aGFuID0gMDsKKwkJbG93ZXJ0aGFuID0gMDsKKwkJZGVsYXlpbmRleCA9IChkbC0+ZGxfZmlyc3RlbGVtICsgbikgJiBERlNfTUFYX0RMX01BU0s7CisJCXJlZnByaSA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV90aW1lOworCisJCWlmICgoc2NvcmVbbl0gPj0gaGlnaGVzdHNjb3JlKSAmJgorCQkgICAgKGlzX3VuaXF1ZV9wcmkoaGlnaGVzdHByaSwgbWlkcHJpLCBsb3dlc3RwcmksIHJlZnByaSkpKSB7CisJCQlsb3dlc3RzY29yZSA9IG1pZHNjb3JlOworCQkJbG93ZXN0cHJpID0gbWlkcHJpOworCQkJbG93ZXN0c2NvcmVpbmRleCA9IG1pZHNjb3JlaW5kZXg7CisJCQltaWRzY29yZSA9IGhpZ2hlc3RzY29yZTsKKwkJCW1pZHByaSA9IGhpZ2hlc3Rwcmk7CisJCQltaWRzY29yZWluZGV4ID0gaGlnaGVzdHNjb3JlaW5kZXg7CisJCQloaWdoZXN0c2NvcmUgPSBzY29yZVtuXTsKKwkJCWhpZ2hlc3RwcmkgPSByZWZwcmk7CisJCQloaWdoZXN0c2NvcmVpbmRleCA9IG47CisJCX0gZWxzZSB7CisJCQlpZiAoKHNjb3JlW25dID49IG1pZHNjb3JlKSAmJgorCQkJICAgIChpc191bmlxdWVfcHJpCisJCQkJICAgICAoaGlnaGVzdHByaSwgbWlkcHJpLCBsb3dlc3RwcmksIHJlZnByaSkpKSB7CisJCQkJbG93ZXN0c2NvcmUgPSBtaWRzY29yZTsKKwkJCQlsb3dlc3RwcmkgPSBtaWRwcmk7CisJCQkJbG93ZXN0c2NvcmVpbmRleCA9IG1pZHNjb3JlaW5kZXg7CisJCQkJbWlkc2NvcmUgPSBzY29yZVtuXTsKKwkJCQltaWRwcmkgPSByZWZwcmk7CisJCQkJbWlkc2NvcmVpbmRleCA9IG47CisJCQl9IGVsc2UgaWYgKChzY29yZVtuXSA+PSBsb3dlc3RzY29yZSkgJiYKKwkJCQkgICAoaXNfdW5pcXVlX3ByaQorCQkJCQkgICAgKGhpZ2hlc3RwcmksIG1pZHByaSwgbG93ZXN0cHJpLCByZWZwcmkpKSkgeworCQkJCWxvd2VzdHNjb3JlID0gc2NvcmVbbl07CisJCQkJbG93ZXN0cHJpID0gcmVmcHJpOworCQkJCWxvd2VzdHNjb3JlaW5kZXggPSBuOworCQkJfQorCQl9CisKKwl9CisKKwlpZiAobWlkc2NvcmUgPT0gMCkgeworCQkvKiBUaGlzIG1lYW5zIHdlIGhhdmUgb25seSAxIHB1bHNlIHR5cGUuIEl0IGNhbiBub3QgYmUgc3RhZ2dlcmVkISAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlERlNfRFBSSU5USyhkZnMsIEFUSF9ERUJVR19ERlMxLAorCQkgICAgIkZJTkFMIGhpZ2hlc3RzY29yZT0lZCBoaWdoZXN0c2NvcmVpbmRleD0lZCBoaWdoZXN0cHJpPSVkXG4iLAorCQkgICAgaGlnaGVzdHNjb3JlLCBoaWdoZXN0c2NvcmVpbmRleCwgaGlnaGVzdHByaSk7CisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMSwKKwkJICAgICJGSU5BTCBsb3dlc3RzY29yZT0lZCBsb3dlc3RzY29yZWluZGV4PSVkIGxvd3ByaT0lZFxuIiwKKwkJICAgIGxvd2VzdHNjb3JlLCBsb3dlc3RzY29yZWluZGV4LCBsb3dlc3RwcmkpOworCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzEsCisJCSAgICAiRklOQUwgbWlkc2NvcmU9JWQgbWlkc2NvcmVpbmRleD0lZCBtaWRwcmk9JWRcbiIsCisJCSAgICBtaWRzY29yZSwgbWlkc2NvcmVpbmRleCwgbWlkcHJpKTsKKworCWRlbGF5aW5kZXggPSAoZGwtPmRsX2ZpcnN0ZWxlbSArIGhpZ2hlc3RzY29yZWluZGV4KSAmIERGU19NQVhfRExfTUFTSzsKKwlyZWZkdXIgPSBkbC0+ZGxfZWxlbXNbZGVsYXlpbmRleF0uZGVfZHVyOworCXJlZnByaSA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV90aW1lOworCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzEsCisJCSAgICAiaGlnaHNjb3JlaW5kZXg9JWQgcmVmZHVyPSVkIHJlZnByaT0lZFxuIiwKKwkJICAgIGhpZ2hlc3RzY29yZWluZGV4LCByZWZkdXIsIHJlZnByaSk7CisKKwludW1wdWxzZXN0ZW1wID0KKwkJZGZzX2Jpbl9wcmlfY2hlY2soZGZzLCByZiwgZGwsIGhpZ2hlc3RzY29yZSwgcmVmcHJpLCByZWZkdXIsIDAsCisJCQkJICBoaWdoZXN0cHJpKTsKKwludW1wdWxzZXNoaWdoID0gbnVtcHVsc2VzdGVtcDsKKwludW1wdWxzZXN0ZW1wID0KKwkJZGZzX2Jpbl9wcmlfY2hlY2soZGZzLCByZiwgZGwsIGhpZ2hlc3RzY29yZSwgcmVmcHJpLCByZWZkdXIsIDAsCisJCQkJICBoaWdoZXN0cHJpICsgbWlkcHJpKTsKKwlpZiAobnVtcHVsc2VzdGVtcCA+IG51bXB1bHNlc2hpZ2gpIHsKKwkJbnVtcHVsc2VzaGlnaCA9IG51bXB1bHNlc3RlbXA7CisJfQorCW51bXB1bHNlc3RlbXAgPQorCQlkZnNfYmluX3ByaV9jaGVjayhkZnMsIHJmLCBkbCwgaGlnaGVzdHNjb3JlLCByZWZwcmksIHJlZmR1ciwgMCwKKwkJCQkgIGhpZ2hlc3RwcmkgKyBtaWRwcmkgKyBsb3dlc3RwcmkpOworCWlmIChudW1wdWxzZXN0ZW1wID4gbnVtcHVsc2VzaGlnaCkgeworCQludW1wdWxzZXNoaWdoID0gbnVtcHVsc2VzdGVtcDsKKwl9CisKKwlkZWxheWluZGV4ID0gKGRsLT5kbF9maXJzdGVsZW0gKyBtaWRzY29yZWluZGV4KSAmIERGU19NQVhfRExfTUFTSzsKKwlyZWZkdXIgPSBkbC0+ZGxfZWxlbXNbZGVsYXlpbmRleF0uZGVfZHVyOworCXJlZnByaSA9IGRsLT5kbF9lbGVtc1tkZWxheWluZGV4XS5kZV90aW1lOworCURGU19EUFJJTlRLKGRmcywgQVRIX0RFQlVHX0RGUzEsCisJCSAgICAibWlkc2NvcmVpbmRleD0lZCByZWZkdXI9JWQgcmVmcHJpPSVkXG4iLAorCQkgICAgbWlkc2NvcmVpbmRleCwgcmVmZHVyLCByZWZwcmkpOworCisJLyogbnVtcHVsc2VzbWlkID0gZGZzX2Jpbl9wcmlfY2hlY2soZGZzLCByZiwgZGwsIG1pZHNjb3JlLCByZWZwcmksIHJlZmR1ciwwLCAxKTsgKi8KKwludW1wdWxzZXN0ZW1wID0KKwkJZGZzX2Jpbl9wcmlfY2hlY2soZGZzLCByZiwgZGwsIG1pZHNjb3JlLCByZWZwcmksIHJlZmR1ciwgMCwgbWlkcHJpKTsKKwludW1wdWxzZXNtaWQgPSBudW1wdWxzZXN0ZW1wOworCW51bXB1bHNlc3RlbXAgPQorCQlkZnNfYmluX3ByaV9jaGVjayhkZnMsIHJmLCBkbCwgbWlkc2NvcmUsIHJlZnByaSwgcmVmZHVyLCAwLAorCQkJCSAgaGlnaGVzdHByaSArIG1pZHByaSk7CisJaWYgKG51bXB1bHNlc3RlbXAgPiBudW1wdWxzZXNtaWQpIHsKKwkJbnVtcHVsc2VzbWlkID0gbnVtcHVsc2VzdGVtcDsKKwl9CisJbnVtcHVsc2VzdGVtcCA9CisJCWRmc19iaW5fcHJpX2NoZWNrKGRmcywgcmYsIGRsLCBtaWRzY29yZSwgcmVmcHJpLCByZWZkdXIsIDAsCisJCQkJICBoaWdoZXN0cHJpICsgbWlkcHJpICsgbG93ZXN0cHJpKTsKKwlpZiAobnVtcHVsc2VzdGVtcCA+IG51bXB1bHNlc21pZCkgeworCQludW1wdWxzZXNtaWQgPSBudW1wdWxzZXN0ZW1wOworCX0KKworCS8qZGVsYXlpbmRleCA9IChkbC0+ZGxfZmlyc3RlbGVtICsgbG93ZXN0c2NvcmVpbmRleCkgJiBERlNfTUFYX0RMX01BU0s7CisJICAgcmVmZHVyID0gZGwtPmRsX2VsZW1zW2RlbGF5aW5kZXhdLmRlX2R1cjsKKwkgICByZWZwcmkgPSBkbC0+ZGxfZWxlbXNbZGVsYXlpbmRleF0uZGVfdGltZTsKKwkgICBERlNfRFBSSU5USyhpYywgQVRIX0RFQlVHX0RGUzEsICJsb3dlc3RzY29yZWluZGV4PSVkIHJlZmR1cj0lZCByZWZwcmk9JWRcbiIsIGxvd2VzdHNjb3JlaW5kZXgsIHJlZmR1ciwgcmVmcHJpKTsKKworCSAgIG51bXB1bHNlc2xvdyA9IGRmc19iaW5fcHJpX2NoZWNrKGRmcywgcmYsIGRsLCBsb3dlc3RzY29yZSwgcmVmcHJpLCByZWZkdXIsMCwgMSk7CisJICovCisJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJICAgICJudW1wdWxzZXNoaWdoPSVkLCBudW1wdWxzZXNtaWQ9JWRcbiIsCisJCSAgICBudW1wdWxzZXNoaWdoLCBudW1wdWxzZXNtaWQpOworLyogICAgICAgICAgICBwcmludGYoIm51bXB1bHNlc2hpZ2g9JWQsIG51bXB1bHNlc21pZD0lZCwgbnVtcHVsc2VzbG93ICVkXG4iLG51bXB1bHNlc2hpZ2gsIG51bXB1bHNlc21pZCwgbnVtcHVsc2VzbG93KTsgKi8KKworCWlmICgobnVtcHVsc2VzaGlnaCA+PSByZi0+cmZfdGhyZXNob2xkKQorCSAgICAmJiAobnVtcHVsc2VzbWlkID49IHJmLT5yZl90aHJlc2hvbGQpKSB7CisJCS8qaWYgKG51bXB1bHNlcyA+PSByZi0+cmZfdGhyZXNob2xkKSB7ICovCisJCWZvdW5kID0gMTsKKwkJREZTX0RQUklOVEsoZGZzLCBBVEhfREVCVUdfREZTMiwKKwkJCSAgICAiTUFUQ0ggZmlsdGVyPSV1IG51bXB1bHNlc2hpZ2g9JXUgbnVtcHVsc2VzbWlkPSAldSB0aHJlc2g9JXVcbiIsCisJCQkgICAgcmYtPnJmX3B1bHNlaWQsIG51bXB1bHNlc2hpZ2gsIG51bXB1bHNlc21pZCwKKwkJCSAgICByZi0+cmZfdGhyZXNob2xkKTsKKwl9CisJcmV0dXJuIGZvdW5kOworfQorCisjZW5kaWYgLyogQVRIX1NVUFBPUlRfREZTICovCmRpZmYgLS1naXQgYS9jb3JlL3NhcC9pbmMvc2FwX2FwaS5oIGIvY29yZS9zYXAvaW5jL3NhcF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQ1MGUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zYXAvaW5jL3NhcF9hcGkuaApAQCAtMCwwICsxLDkyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBXTEFOX1FDVF9XTEFOU0FQX0gKKyNkZWZpbmUgV0xBTl9RQ1RfV0xBTlNBUF9ICisKKy8qKgorICogVyBMIEEgTiAgIFMgTyBGIFQgQSBQICBQIEEgTCAgIEwgQSBZIEUgUgorICogRSBYIFQgRSBSIE4gQSBMICBBIFAgSQorICoKKyAqIERFU0NSSVBUSU9OCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSSBleHBvc2VkIGJ5IHRoZSB3bGFuIFNBUCBQQUwgbGF5ZXIKKyAqICBtb2R1bGUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAiY2RzX3BhY2tldC5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorCisjaW5jbHVkZSAicDJwX2FwaS5oIgorI2luY2x1ZGUgInNtZV9hcGkuaCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZGVmaW5lcyBhbmQgZW51bQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lICAgICAgIE1BWF9TU0lEX0xFTiAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgICAgICAgTUFYX0FDTF9NQUNfQUREUkVTUyAgICAgICAgICAzMgorI2RlZmluZSAgICAgICBBVVRPX0NIQU5ORUxfU0VMRUNUICAgICAgICAgIDAKKyNkZWZpbmUgICAgICAgTUFYX0FTU09DX0lORF9JRV9MRU4gICAgICAgICAyNTUKKworLyogZGVmaW5lcyBmb3IgV1BTIGNvbmZpZyBzdGF0ZXMgKi8KKyNkZWZpbmUgICAgICAgU0FQX1dQU19ESVNBQkxFRCAgICAgICAgICAgICAwCisjZGVmaW5lICAgICAgIFNBUF9XUFNfRU5BQkxFRF9VTkNPTkZJR1VSRUQgMQorI2RlZmluZSAgICAgICBTQVBfV1BTX0VOQUJMRURfQ09ORklHVVJFRCAgIDIKKyNkZWZpbmUgICAgICAgTUFYX05BTUVfU0laRSAgICAgICAgICAgICAgICA2NAorI2RlZmluZSAgICAgICBNQVhfVEVYVF9TSVpFICAgICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgICAgICAgTUFYX0NIQU5ORUxfTElTVF9MRU4gICAgICAgICAyNTYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisjZGVmaW5lICAgICAgIENERl9NQVhfTk9fT0ZfU0FQX01PREUgICAgICAgMiAgICAvKiBtYXggIyBvZiBTQVAgKi8KKyNlbHNlCisjZGVmaW5lICAgICAgIENERl9NQVhfTk9fT0ZfU0FQX01PREUgICAgICAgMSAgICAvKiBtYXggIyBvZiBTQVAgKi8KKyNlbmRpZgorI2RlZmluZSAgICAgICBTQVBfTUFYX05VTV9TRVNTSU9OICAgICAgICAgIDUKKyNkZWZpbmUgICAgICAgU0FQX01BWF9PQlNTX1NUQV9DTlQgICAgICAgICAxICAgIC8qIG1heCAjIG9mIE9CU1MgU1RBICovCisjZGVmaW5lICAgICAgIFNBUF9BQ1NfV0VJR0hUX01BWCAgICAgICAgICAgKDQ0NDQpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlYXNvbkNvZGUgdGFrZW4gZnJvbSA4MDIuMTEgc3RhbmRhcmQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworCWVTQVBfUkNfUkVTRVJWRUQwLCAgICAgICAgICAgICAgLyowICovCisJZVNBUF9SQ19VTlNQRUNJRklFRCwgICAgICAgICAgICAvKjEgKi8KKwllU0FQX1JDX1BSRVZfQVVUSF9JTlZBTElELCAgICAgIC8qMiAqLworCWVTQVBfUkNfU1RBX0xFRlRfREVBVVRILCAgICAgICAgLyozICovCisJZVNBUF9SQ19JTkFDVElWSVRZX0RJU0FTU09DLCAgICAvKjQgKi8KKwllU0FQX1JDX0FQX0NBUEFDSVRZX0ZVTEwsICAgICAgIC8qNSAqLworCWVTQVBfUkNfQ0xTMl9GUk9NX05PTl9BVVRIX1NUQSwgLyo2ICovCisJZVNBUF9SQ19DTFMzX0ZST01fTk9OX0FVVEhfU1RBLCAvKjcgKi8KKwllU0FQX1JDX1NUQV9MRUZUX0RJU0FTU09DLCAgICAgIC8qOCAqLworCWVTQVBfUkNfU1RBX05PVF9BVVRILCAgICAgICAgICAgLyo5ICovCisJZVNBUF9SQ19QQ19VTkFDQ0VQVEFCTEUsICAgICAgICAvKjEwICovCisJZVNBUF9SQ19TQ19VTkFDQ0VQVEFCTEUsICAgICAgICAvKjExICovCisJZVNBUF9SQ19SRVNFUlZFRDEsICAgICAgICAgICAgICAvKjEyICovCisJZVNBUF9SQ19JTlZBTElEX0lFLCAgICAgICAgICAgICAvKjEzICovCisJZVNBUF9SQ19NSUNfRkFJTCwgICAgICAgICAgICAgICAvKjE0ICovCisJZVNBUF9SQ180X1dBWV9IQU5EU0hBS0VfVE8sICAgICAvKjE1ICovCisJZVNBUF9SQ19HT19LRVlfSEFORFNIQUtFX1RPLCAgICAvKjE2ICovCisJZVNBUF9SQ19JRV9NSVNNQVRDSCwgICAgICAgICAgICAvKjE3ICovCisJZVNBUF9SQ19JTlZBTElEX0dSUF9DSElQSEVSLCAgICAvKjE4ICovCisJZVNBUF9SQ19JTlZBTElEX1BBSVJfQ0hJUEhFUiwgICAvKjE5ICovCisJZVNBUF9SQ19JTlZBTElEX0FLTVAsICAgICAgICAgICAvKjIwICovCisJZVNBUF9SQ19VTlNVUFBPUlRFRF9SU04sICAgICAgICAvKjIxICovCisJZVNBUF9SQ19JTlZBTElEX1JTTiwgICAgICAgICAgICAvKjIyICovCisJZVNBUF9SQ18xWF9BVVRIX0ZBSUxFRCwgICAgICAgICAvKjIzICovCisJZVNBUF9SQ19DSElQRVJfU1VJVEVfUkVKRUNURUQsICAvKjI0ICovCit9IGVTYXBSZWFzb25Db2RlOworCit0eXBlZGVmIGVudW0geworCWVTQVBfQUNDRVBUX1VOTEVTU19ERU5JRUQgPSAwLAorCWVTQVBfREVOWV9VTkxFU1NfQUNDRVBURUQgPSAxLAorCS8qIHRoaXMgdHlwZSBpcyBhZGRlZCB0byBzdXBwb3J0IGFjY2VwdCAmIGRlbnkgbGlzdCBhdCB0aGUgc2FtZSB0aW1lICovCisJZVNBUF9TVVBQT1JUX0FDQ0VQVF9BTkRfREVOWSA9IDIsCisJLypJbiB0aGlzIG1vZGUgYWxsIE1BQyBhZGRyZXNzZXMgYXJlIGFsbG93ZWQgdG8gY29ubmVjdCAqLworCWVTQVBfQUxMT1dfQUxMID0gMywKK30gZVNhcE1hY0FkZHJBQ0w7CisKK3R5cGVkZWYgZW51bSB7CisJZVNBUF9CTEFDS19MSVNUID0gMCwgICAvKiBMaXN0IG9mIG1hYyBhZGRyZXNzZXMgTk9UIGFsbG93ZWQgdG8gYXNzb2MgKi8KKwllU0FQX1dISVRFX0xJU1QgPSAxLCAgIC8qIExpc3Qgb2YgbWFjIGFkZHJlc3NlcyBhbGxvd2VkIHRvIGFzc29jICovCit9IGVTYXBBQ0xUeXBlOworCit0eXBlZGVmIGVudW0geworCUFERF9TVEFfVE9fQUNMID0gMCwgICAgICAgLyogY21kIHRvIGFkZCBTVEEgdG8gYWNjZXNzIGNvbnRyb2wgbGlzdCAqLworCURFTEVURV9TVEFfRlJPTV9BQ0wgPSAxLCAgLyogY21kIHRvIGRlbCBTVEEgZnJvbSBhY2Nlc3MgY29udHJvbCBsaXN0ICovCit9IGVTYXBBQ0xDbWRUeXBlOworCit0eXBlZGVmIGVudW0geworCWVTQVBfU1RBUlRfQlNTX0VWRU5UID0gMCwgICAgIC8qIEV2ZW50IHNlbnQgd2hlbiBCU1MgaXMgc3RhcnRlZCAqLworCWVTQVBfU1RPUF9CU1NfRVZFTlQsICAgICAgICAgIC8qIEV2ZW50IHNlbnQgd2hlbiBCU1MgaXMgc3RvcHBlZCAqLworCWVTQVBfU1RBX0FTU09DX0lORCwgICAgICAgICAgIC8qIEluZGljYXRlIGFzc29jIHJlcSB0byB1cHBlciBsYXllcnMgKi8KKwkvKgorCSAqIEV2ZW50IHNlbnQgd2hlbiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkIGEgc3RhdGlvbiBhbmQKKwkgKiB1cHBlciBsYXllciBuZWVlZHMgdG8gYWxsb2NhdGUgYSBjb250ZXh0CisJICovCisJZVNBUF9TVEFfQVNTT0NfRVZFTlQsCisJLyoKKwkgKiBFdmVudCBzZW50IHdoZW4gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgcmVhc3NvY2lhdGVkIGEgc3RhdGlvbiBhbmQKKwkgKiB1cHBlciBsYXllciBuZWVlZHMgdG8gYWxsb2NhdGUgYSBjb250ZXh0CisJICovCisJZVNBUF9TVEFfUkVBU1NPQ19FVkVOVCwKKwkvKgorCSAqIEV2ZW50IHNlbnQgd2hlbiBhc3NvY2lhdGVkIGEgc3RhdGlvbiBoYXMgZGlzYXNzb2NpYXRlZCBhcyBhCisJICogcmVzdWx0IG9mIHZhcmlvdXMgY29uZGl0aW9ucworCSAqLworCWVTQVBfU1RBX0RJU0FTU09DX0VWRU5ULAorCS8qIEV2ZW50IHNlbnQgd2hlbiB1c2VyIGNhbGxlZCB3bGFuc2FwX3NldF9rZXlfc3RhICovCisJZVNBUF9TVEFfU0VUX0tFWV9FVkVOVCwKKwkvKiBFdmVudCBzZW50IHdoZW5ldmVyIHRoZXJlIGlzIE1JQyBmYWlsdXJlIGRldGVjdGVkICovCisJZVNBUF9TVEFfTUlDX0ZBSUxVUkVfRVZFTlQsCisJLyogRXZlbnQgc2VudCB3aGVuIHVzZXIgY2FsbGVkIHdsYW5zYXBfZ2V0X2Fzc29jX3N0YXRpb25zICovCisJZVNBUF9BU1NPQ19TVEFfQ0FMTEJBQ0tfRVZFTlQsCisJLyogRXZlbnQgc2VuZCB3aGVuIHVzZXIgY2FsbCAgd2xhbnNhcF9nZXRfd3BzX3Nlc3Npb25fb3ZlcmxhcCAqLworCWVTQVBfR0VUX1dQU1BCQ19TRVNTSU9OX0VWRU5ULAorCS8qIEV2ZW50IHNlbmQgb24gV1BTIFBCQyBwcm9iZSByZXF1ZXN0IGlzIHJlY2VpdmVkICovCisJZVNBUF9XUFNfUEJDX1BST0JFX1JFUV9FVkVOVCwKKwllU0FQX0lORElDQVRFX01HTVRfRlJBTUUsCisJZVNBUF9SRU1BSU5fQ0hBTl9SRUFEWSwKKwllU0FQX1NFTkRfQUNUSU9OX0NORiwKKwllU0FQX0RJU0NPTk5FQ1RfQUxMX1AyUF9DTElFTlQsCisJZVNBUF9NQUNfVFJJR19TVE9QX0JTU19FVkVOVCwKKwkvKgorCSAqIEV2ZW50IHNlbmQgd2hlbiBhIFNUQSBpbiBuZWl0aGVyIHdoaXRlIGxpc3Qgb3IgYmxhY2sgbGlzdCB0cmllcyB0bworCSAqIGFzc29jaWF0ZSBpbiBzb2Z0YXAgbW9kZQorCSAqLworCWVTQVBfVU5LTk9XTl9TVEFfSk9JTiwKKwkvKiBFdmVudCBzZW5kIHdoZW4gYSBuZXcgU1RBIGlzIHJlamVjdGVkIGFzc29jaWF0aW9uIHNpbmNlIHNvZnRBUAorCSAqIG1heCBhc3NvYyBsaW1pdCBoYXMgcmVhY2hlZAorCSAqLworCWVTQVBfTUFYX0FTU09DX0VYQ0VFREVELAorCWVTQVBfQ0hBTk5FTF9DSEFOR0VfRVZFTlQsCisJZVNBUF9ERlNfQ0FDX1NUQVJULAorCWVTQVBfREZTX0NBQ19JTlRFUlJVUFRFRCwKKwllU0FQX0RGU19DQUNfRU5ELAorCWVTQVBfREZTX1JBREFSX0RFVEVDVCwKKwkvKiBFdmVudCBzZW50IHdoZW4gdXNlciBuZWVkIHRvIGdldCB0aGUgREZTIE5PTCBmcm9tIENOU1MgKi8KKwllU0FQX0RGU19OT0xfR0VULAorCS8qIEV2ZW50IHNlbnQgd2hlbiB1c2VyIG5lZWQgdG8gc2V0IHRoZSBERlMgTk9MIHRvIENOU1MgKi8KKwllU0FQX0RGU19OT0xfU0VULAorCS8qIE5vIGNoIGF2YWlsYWJsZSBhZnRlciBERlMgUkFEQVIgZGV0ZWN0ICovCisJZVNBUF9ERlNfTk9fQVZBSUxBQkxFX0NIQU5ORUwsCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FQX0FQX0FDU19PUFRJTUlaRQorCWVTQVBfQUNTX1NDQU5fU1VDQ0VTU19FVkVOVCwKKyNlbmRpZgorCWVTQVBfQUNTX0NIQU5ORUxfU0VMRUNURUQsCit9IGVTYXBIZGRFdmVudDsKKwordHlwZWRlZiBlbnVtIHsKKwllU0FQX09QRU5fU1lTVEVNLAorCWVTQVBfU0hBUkVEX0tFWSwKKwllU0FQX0FVVE9fU1dJVENICit9IGVTYXBBdXRoVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwkvKiBEaXNhc3NvY2lhdGlvbiB3YXMgaW50ZXJuYWxseSBpbml0YXRlZCBmcm9tIENPUkUgc3RhY2sgKi8KKwllU0FQX01BQ19JTklUQVRFRF9ESVNBU1NPQyA9IDB4MTAwMDAsCisJLyoKKwkgKiBEaXNhc3NvY2lhdGlvbiB3YXMgaW50ZXJuYWxseSBpbml0YXRlZCBmcm9tIGhvc3QgYnkKKwkgKiBpbnZva2luZyB3bGFuc2FwX2Rpc2Fzc29jX3N0YSBjYWxsCisJICovCisJZVNBUF9VU1JfSU5JVEFURURfRElTQVNTT0MKK30gZVNhcERpc2Fzc29jUmVhc29uOworCisvKkhhbmRsZSBib29sIG92ZXIgaGVyZSovCit0eXBlZGVmIGVudW0geworCWVTQVBfRkFMU0UsCisJZVNBUF9UUlVFLAorfSBlU2FwQm9vbDsKKwordHlwZWRlZiBlbnVtIHsKKwllU0FQX0RGU19OT0xfQ0xFQVIsCisJZVNBUF9ERlNfTk9MX1JBTkRPTUlaRSwKK30gZVNhcERmc05vbFR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFNBUCBQQUwgInN0YXR1cyIgYW5kICJyZWFzb24iIGVycm9yIGNvZGUgZGVmaW5lcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKwllU0FQX1NUQVRVU19TVUNDRVNTLCAgICAgICAgICAgIC8qIFN1Y2Nlc3MuICAqLworCWVTQVBfU1RBVFVTX0ZBSUxVUkUsICAgICAgICAgICAgLyogR2VuZXJhbCBGYWlsdXJlLiAgKi8KKwkvKiBDaGFubmVsIG5vdCBzZWxlY3RlZCBkdXJpbmcgaW50aWFsIHNjYW4uICAqLworCWVTQVBfU1RBUlRfQlNTX0NIQU5ORUxfTk9UX1NFTEVDVEVELAorCWVTQVBfRVJST1JfTUFDX1NUQVJUX0ZBSUwsICAgICAvKiBGYWlsZWQgdG8gc3RhcnQgSW5mcmEgQlNTICovCit9IGVTYXBTdGF0dXM7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFNBUCBQQUwgInN0YXR1cyIgYW5kICJyZWFzb24iIGVycm9yIGNvZGUgZGVmaW5lcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKwllU0FQX1dQU1BCQ19PVkVSTEFQX0lOMTIwUywgIC8qIE92ZXJsYXAgKi8KKwkvKiBubyBXUFMgcHJvYmUgcmVxdWVzdCBpbiAxMjAgc2Vjb25kICovCisJZVNBUF9XUFNQQkNfTk9fV1BTUEJDX1BST0JFX1JFUV9JTjEyMFMsCisJLyogT25lIFdQUyBwcm9iZSByZXF1ZXN0IGluIDEyMCBzZWNvbmQgICovCisJZVNBUF9XUFNQQkNfT05FX1dQU1BCQ19QUk9CRV9SRVFfSU4xMjBTLAorfSBlV1BTUEJDT3ZlcmxhcDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVHlwZWRlZnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1N0YXJ0QnNzQ29tcGxldGVFdmVudF9zIHsKKwl1aW50OF90IHN0YXR1czsKKwl1aW50OF90IG9wZXJhdGluZ0NoYW5uZWw7CisJdWludDE2X3Qgc3RhSWQ7ICAgICAgICAgLyogc2VsZiBTdGFJRCAqLworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNvZnRBUCBTTUUgc2Vzc2lvbiBJRCAqLworfSB0U2FwX1N0YXJ0QnNzQ29tcGxldGVFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1N0b3BCc3NDb21wbGV0ZUV2ZW50X3MgeworCXVpbnQ4X3Qgc3RhdHVzOworfSB0U2FwX1N0b3BCc3NDb21wbGV0ZUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBzYXBfU3RhdGlvbkFzc29jSW5kaWNhdGlvbl9zIHsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIHN0YU1hYzsKKwl1aW50OF90IGFzc29JZDsKKwl1aW50OF90IHN0YUlkOworCXVpbnQ4X3Qgc3RhdHVzOworCS8qIFJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZXMgdG8gdXBwZXIgbGF5ZXIgKi8KKwl1aW50MzJfdCBiZWFjb25MZW5ndGg7CisJdWludDhfdCAqYmVhY29uUHRyOworCXVpbnQzMl90IGFzc29jUmVxTGVuZ3RoOworCXVpbnQ4X3QgKmFzc29jUmVxUHRyOworCWJvb2wgZldtbUVuYWJsZWQ7CisJZUNzckF1dGhUeXBlIG5lZ290aWF0ZWRBdXRoVHlwZTsKKwllQ3NyRW5jcnlwdGlvblR5cGUgbmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGU7CisJZUNzckVuY3J5cHRpb25UeXBlIG5lZ290aWF0ZWRNQ0VuY3J5cHRpb25UeXBlOworCWJvb2wgZkF1dGhSZXF1aXJlZDsKK30gdFNhcF9TdGF0aW9uQXNzb2NJbmRpY2F0aW9uOworCit0eXBlZGVmIHN0cnVjdCBzYXBfU3RhdGlvbkFzc29jUmVhc3NvY0NvbXBsZXRlRXZlbnRfcyB7CisJc3RydWN0IGNkZl9tYWNfYWRkciBzdGFNYWM7CisJdWludDhfdCBzdGFJZDsKKwl1aW50OF90IHN0YXR1czsKKwl1aW50OF90IGllc1tNQVhfQVNTT0NfSU5EX0lFX0xFTl07CisJdWludDE2X3QgaWVzTGVuOworCXVpbnQzMl90IHN0YXR1c0NvZGU7CisJZVNhcEF1dGhUeXBlIFNhcEF1dGhUeXBlOworCWJvb2wgd21tRW5hYmxlZDsKKwkvKiBSZXF1aXJlZCBmb3IgaW5kaWNhdGluZyB0aGUgZnJhbWVzIHRvIHVwcGVyIGxheWVyICovCisJdWludDMyX3QgYmVhY29uTGVuZ3RoOworCXVpbnQ4X3QgKmJlYWNvblB0cjsKKwl1aW50MzJfdCBhc3NvY1JlcUxlbmd0aDsKKwl1aW50OF90ICphc3NvY1JlcVB0cjsKKwl1aW50MzJfdCBhc3NvY1Jlc3BMZW5ndGg7CisJdWludDhfdCAqYXNzb2NSZXNwUHRyOworCXVpbnQ4X3QgdGltaW5nTWVhc0NhcDsKKwl0U2lyU21lQ2hhbkluZm8gY2hhbl9pbmZvOworfSB0U2FwX1N0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBzYXBfU3RhdGlvbkRpc2Fzc29jQ29tcGxldGVFdmVudF9zIHsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIHN0YU1hYzsKKwl1aW50OF90IHN0YUlkOyAgICAgICAgICAvKiBTVEFJRCBzaG91bGQgbm90IGJlIHVzZWQgKi8KKwl1aW50OF90IHN0YXR1czsKKwl1aW50MzJfdCBzdGF0dXNDb2RlOworCWVTYXBEaXNhc3NvY1JlYXNvbiByZWFzb247Cit9IHRTYXBfU3RhdGlvbkRpc2Fzc29jQ29tcGxldGVFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1N0YXRpb25TZXRLZXlDb21wbGV0ZUV2ZW50X3MgeworCXVpbnQ4X3Qgc3RhdHVzOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgcGVlck1hY0FkZHI7Cit9IHRTYXBfU3RhdGlvblNldEtleUNvbXBsZXRlRXZlbnQ7CisKKy8qc3RydWN0IGNvcnJlc3BvbmRpbmcgdG8gU0FQX1NUQV9NSUNfRkFJTFVSRV9FVkVOVCAqLwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1N0YXRpb25NSUNGYWlsdXJlRXZlbnRfcyB7CisJc3RydWN0IGNkZl9tYWNfYWRkciBzcmNNYWNBZGRyOyAgICAvKiBhZGRyZXNzIHVzZWQgdG8gY29tcHV0ZSBNSUMgKi8KKwlzdHJ1Y3QgY2RmX21hY19hZGRyIHN0YU1hYzsgICAgICAgIC8qIHRhTWFjQWRkciB0cmFuc21pdHRlciBhZGRyZXNzICovCisJc3RydWN0IGNkZl9tYWNfYWRkciBkc3RNYWNBZGRyOworCWVTYXBCb29sIG11bHRpY2FzdDsKKwl1aW50OF90IElWMTsgICAgICAgICAgICAvKiBmaXJzdCBieXRlIG9mIElWICovCisJdWludDhfdCBrZXlJZDsgICAgICAgICAgLyogc2Vjb25kIGJ5dGUgb2YgSVYgKi8KKwl1aW50OF90IFRTQ1tTSVJfQ0lQSEVSX1NFUV9DVFJfU0laRV07ICAgICAgICAgICAvKiBzZXF1ZW5jZSBudW1iZXIgKi8KKworfSB0U2FwX1N0YXRpb25NSUNGYWlsdXJlRXZlbnQ7CisvKlN0cnVjdHVyZSB0byByZXR1cm4gTUFDIGFkZHJlc3Mgb2YgYXNzb2NpYXRlZCBzdGF0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2FwX0Fzc29jTWFjQWRkcl9zIHsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIHN0YU1hYzsgLyogQXNzb2NpYXRlZCBzdGF0aW9uJ3MgTUFDIGFkZHJlc3MgKi8KKwl1aW50OF90IGFzc29jSWQ7ICAgICAgICAgICAgLyogQXNzb2NpYXRlZCBzdGF0aW9uJ3MgQXNzb2NpYXRpb24gSUQgKi8KKwl1aW50OF90IHN0YUlkOyAgICAgICAgICAgICAgLyogQWxsb2NhdGVkIHN0YXRpb24gSWQgKi8KKwl1aW50OF90IFNob3J0R0k0ME1oejsKKwl1aW50OF90IFNob3J0R0kyME1oejsKKwl1aW50OF90IFN1cHBvcnQ0ME1oejsKKwl1aW50MzJfdCByZXF1ZXN0ZWRNQ1JhdGU7CisJdFNpclN1cHBvcnRlZFJhdGVzIHN1cHBvcnRlZFJhdGVzOworfSB0U2FwX0Fzc29jTWFjQWRkciwgKnRwU2FwX0Fzc29jTWFjQWRkcjsKKworLypzdHJ1Y3QgY29ycmVzcG9uZGluZyB0byBTQVBfQVNTT0NfU1RBX0NBTExCQUNLX0VWRU5UICovCit0eXBlZGVmIHN0cnVjdCBzYXBfQXNzb2NTdGFMaXN0RXZlbnRfcyB7CisJQ0RGX01PRFVMRV9JRCBtb2R1bGU7CisJLyogbW9kdWxlIGlkIHRoYXQgd2FzIHBhc3NlZCBpbiB3bGFuc2FwX2dldF9hc3NvY19zdGF0aW9ucyBBUEkgKi8KKwl1aW50OF90IG5vT2ZBc3NvY1N0YTsgICAgICAgICAgIC8qIE51bWJlciBvZiBhc3NvY2lhdGVkIHN0YXRpb25zICovCisJdHBTYXBfQXNzb2NNYWNBZGRyIHBBc3NvY1N0YXM7CisJLyoKKwkgKiBQb2ludGVyIHRvIHByZSBhbGxvY2F0ZWQgbWVtb3J5IHRvIG9idGFpbiBsaXN0IG9mCisJICogYXNzb2NpYXRlZCBzdGF0aW9ucyBwYXNzZWQgaW4gd2xhbnNhcF9nZXRfYXNzb2Nfc3RhdGlvbnMgQVBJCisJICovCit9IHRTYXBfQXNzb2NTdGFMaXN0RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNhcF9HZXRXUFNQQkNTZXNzaW9uRXZlbnRfcyB7CisJdWludDhfdCBzdGF0dXM7CisJLyogbW9kdWxlIGlkIHRoYXQgd2FzIHBhc3NlZCBpbiB3bGFuc2FwX2dldF9hc3NvY19zdGF0aW9ucyBBUEkgKi8KKwlDREZfTU9EVUxFX0lEIG1vZHVsZTsKKwl1aW50OF90IFVVSURfRVsxNl07ICAgICAgICAgICAgIC8qIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBBUC4gKi8KKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGFkZHI7CisJZVdQU1BCQ092ZXJsYXAgd3BzUEJDT3ZlcmxhcDsKK30gdFNhcF9HZXRXUFNQQkNTZXNzaW9uRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNhcF9XUFNQQkNQcm9iZVJlcUV2ZW50X3MgeworCXVpbnQ4X3Qgc3RhdHVzOworCS8qIG1vZHVsZSBpZCB0aGF0IHdhcyBwYXNzZWQgaW4gd2xhbnNhcF9nZXRfYXNzb2Nfc3RhdGlvbnMgQVBJICovCisJQ0RGX01PRFVMRV9JRCBtb2R1bGU7CisJdFNpcldQU1BCQ1Byb2JlUmVxIFdQU1BCQ1Byb2JlUmVxOworfSB0U2FwX1dQU1BCQ1Byb2JlUmVxRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNhcF9NYW5hZ2VtZW50RnJhbWVJbmZvX3MgeworCXVpbnQzMl90IG5GcmFtZUxlbmd0aDsKKwl1aW50OF90IGZyYW1lVHlwZTsKKwl1aW50MzJfdCByeENoYW47ICAgICAgICAgICAvKiBDaGFubmVsIG9mIHdoZXJlIHBhY2tldCBpcyByZWNlaXZlZCAqLworCS8qCisJICogUG9pbnQgdG8gYSBidWZmZXIgY29udGFpbiB0aGUgYmVhY29uLCBhc3NvYyByZXEsIGFzc29jIHJzcCBmcmFtZSwKKwkgKiBpbiB0aGF0IG9yZGVyIHVzZXIgbmVlZHMgdG8gdXNlIG5CZWFjb25MZW5ndGgsIG5Bc3NvY1JlcUxlbmd0aCwKKwkgKiBuQXNzb2NSc3BMZW5ndGggdG8gZGVzaWNlIHdoZXJlIGVhY2ggZnJhbWUgc3RhcnRzIGFuZCBlbmRzLgorCSAqLworCXVpbnQ4X3QgKnBiRnJhbWVzOworfSB0U2FwX01hbmFnZW1lbnRGcmFtZUluZm87CisKK3R5cGVkZWYgc3RydWN0IHNhcF9TZW5kQWN0aW9uQ25mX3MgeworCWVTYXBTdGF0dXMgYWN0aW9uU2VuZFN1Y2Nlc3M7Cit9IHRTYXBfU2VuZEFjdGlvbkNuZjsKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1Vua25vd25TVEFKb2luRXZlbnRfcyB7CisJc3RydWN0IGNkZl9tYWNfYWRkciBtYWNhZGRyOworfSB0U2FwX1Vua25vd25TVEFKb2luRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNhcF9NYXhBc3NvY0V4Y2VlZGVkRXZlbnRfcyB7CisJc3RydWN0IGNkZl9tYWNfYWRkciBtYWNhZGRyOworfSB0U2FwX01heEFzc29jRXhjZWVkZWRFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX0Rmc05vbEluZm9fcyB7CisJdWludDE2X3Qgc0Rmc0xpc3Q7ICAgICAgICAgICAgICAvKiBzaXplIG9mIHBEZnNMaXN0IGluIGJ5dGUgKi8KKwl2b2lkICpwRGZzTGlzdDsgICAgICAgICAgICAgLyogcG9pbnRlciB0byBwRGZzTGlzdCBidWZmZXIgKi8KK30gdFNhcF9EZnNOb2xJbmZvOworCisvKioKKyAqIHNhcF9hY3NfY2hfc2VsZWN0ZWRfcyAtIHRoZSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgc2VsZWN0ZWQgY2hhbm5lbHMKKyAqIEBwcmlfY2hhbm5lbDoJICAgSG9sZHMgdGhlIEFDUyBzZWxlY3RlZCBwcmltYXJ5IGNoYW5uZWwKKyAqIEBzZWNfY2hhbm5lbDoJICAgSG9sZHMgdGhlIEFDUyBzZWxlY3RlZCBzZWNvbmRhcnkgY2hhbm5lbAorICoKKyAqIEhvbGRzIHRoZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgY2hhbm5lbCBzZWxlY3RlZCBieSBBQ1MgYW5kIGlzCisgKiB1c2VkIHRvIHNlbmQgaXQgdG8gdGhlIEhERC4KKyAqLworc3RydWN0IHNhcF9jaF9zZWxlY3RlZF9zIHsKKwl1aW50MTZfdCBwcmlfY2g7CisJdWludDE2X3QgaHRfc2VjX2NoOworCXVpbnQxNl90IHZodF9zZWcwX2NlbnRlcl9jaDsKKwl1aW50MTZfdCB2aHRfc2VnMV9jZW50ZXJfY2g7CisJdWludDE2X3QgY2hfd2lkdGg7Cit9OworCisvKioKKyAqIHNhcF9yb2NfcmVhZHlfaW5kX3MgLSB0aGUgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHNjYW4gaWQKKyAqIEBzY2FuX2lkOiBzY2FuIGlkZW50aWZpZXIKKyAqCisgKiBIb2xkcyBzY2FuIGlkZW50aWZpZXIKKyAqLworc3RydWN0IHNhcF9yb2NfcmVhZHlfaW5kX3MgeworCXVpbnQzMl90IHNjYW5faWQ7Cit9OworLyoKKyAqIFRoaXMgc3RydWN0IHdpbGwgYmUgZmlsbGVkIGluIGFuZCBwYXNzZWQgdG8gdHBXTEFOX1NBUEV2ZW50Q0IgdGhhdCBpcworICogcHJvdmlkZWQgZHVyaW5nIHdsYW5zYXBfc3RhcnRfYnNzIGNhbGwgVGhlIGV2ZW50IGlkIGNvcnJlc3BvbmRpbmcgdG8KKyAqIHN0cnVjdHVyZSAgaW4gdGhlIHVuaW9uIGlzIGRlZmluZWQgaW4gY29tbWVudCBuZXh0IHRvIHRoZSBzdHJ1Y3R1cmUKKyAqLworCit0eXBlZGVmIHN0cnVjdCBzYXBfRXZlbnRfcyB7CisJZVNhcEhkZEV2ZW50IHNhcEhkZEV2ZW50Q29kZTsKKwl1bmlvbiB7CisJCS8qU0FQX1NUQVJUX0JTU19FVkVOVCAqLworCQl0U2FwX1N0YXJ0QnNzQ29tcGxldGVFdmVudCBzYXBTdGFydEJzc0NvbXBsZXRlRXZlbnQ7CisJCS8qU0FQX1NUT1BfQlNTX0VWRU5UICovCisJCXRTYXBfU3RvcEJzc0NvbXBsZXRlRXZlbnQgc2FwU3RvcEJzc0NvbXBsZXRlRXZlbnQ7CisJCS8qU0FQX0FTU09DX0lORElDQVRJT04gKi8KKwkJdFNhcF9TdGF0aW9uQXNzb2NJbmRpY2F0aW9uIHNhcEFzc29jSW5kaWNhdGlvbjsKKwkJLypTQVBfU1RBX0FTU09DX0VWRU5ULCBTQVBfU1RBX1JFQVNTT0NfRVZFTlQgKi8KKwkJdFNhcF9TdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudAorCQkJCXNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50OworCQkvKlNBUF9TVEFfRElTQVNTT0NfRVZFTlQgKi8KKwkJdFNhcF9TdGF0aW9uRGlzYXNzb2NDb21wbGV0ZUV2ZW50CisJCQkJc2FwU3RhdGlvbkRpc2Fzc29jQ29tcGxldGVFdmVudDsKKwkJLypTQVBfU1RBX1NFVF9LRVlfRVZFTlQgKi8KKwkJdFNhcF9TdGF0aW9uU2V0S2V5Q29tcGxldGVFdmVudCBzYXBTdGF0aW9uU2V0S2V5Q29tcGxldGVFdmVudDsKKwkJLypTQVBfU1RBX01JQ19GQUlMVVJFX0VWRU5UICovCisJCXRTYXBfU3RhdGlvbk1JQ0ZhaWx1cmVFdmVudCBzYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50OworCQkvKlNBUF9BU1NPQ19TVEFfQ0FMTEJBQ0tfRVZFTlQgKi8KKwkJdFNhcF9Bc3NvY1N0YUxpc3RFdmVudCBzYXBBc3NvY1N0YUxpc3RFdmVudDsKKwkJLypTQVBfR0VUX1dQU1BCQ19TRVNTSU9OX0VWRU5UICovCisJCXRTYXBfR2V0V1BTUEJDU2Vzc2lvbkV2ZW50IHNhcEdldFdQU1BCQ1Nlc3Npb25FdmVudDsKKwkJLyplU0FQX1dQU19QQkNfUFJPQkVfUkVRX0VWRU5UICovCisJCXRTYXBfV1BTUEJDUHJvYmVSZXFFdmVudCBzYXBQQkNQcm9iZVJlcUV2ZW50OworCQkvKmVTQVBfSU5ESUNBVEVfTUdNVF9GUkFNRSAqLworCQl0U2FwX01hbmFnZW1lbnRGcmFtZUluZm8gc2FwTWFuYWdlbWVudEZyYW1lSW5mbzsKKwkJLyogZVNBUF9TRU5EX0FDVElPTl9DTkYgKi8KKwkJdFNhcF9TZW5kQWN0aW9uQ25mIHNhcEFjdGlvbkNuZjsKKwkJLyogZVNBUF9VTktOT1dOX1NUQV9KT0lOICovCisJCXRTYXBfVW5rbm93blNUQUpvaW5FdmVudCBzYXBVbmtub3duU1RBSm9pbjsKKwkJLyogZVNBUF9NQVhfQVNTT0NfRVhDRUVERUQgKi8KKwkJdFNhcF9NYXhBc3NvY0V4Y2VlZGVkRXZlbnQgc2FwTWF4QXNzb2NFeGNlZWRlZDsKKwkJLyplU0FQX0RGU19OT0xfWFhYICovCisJCXRTYXBfRGZzTm9sSW5mbyBzYXBEZnNOb2xJbmZvOworCQlzdHJ1Y3Qgc2FwX2NoX3NlbGVjdGVkX3Mgc2FwX2NoX3NlbGVjdGVkOworCQlzdHJ1Y3Qgc2FwX3JvY19yZWFkeV9pbmRfcyBzYXBfcm9jX2luZDsKKworCX0gc2FwZXZ0OworfSB0U2FwX0V2ZW50LCAqdHBTYXBfRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNhcF9TU0lEIHsKKwl1aW50OF90IGxlbmd0aDsKKwl1aW50OF90IHNzSWRbTUFYX1NTSURfTEVOXTsKK30gY2RmX3BhY2tlZCB0U2FwX1NTSURfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1NTSURJbmZvIHsKKwl0U2FwX1NTSURfdCBzc2lkOyAgICAgLyogU1NJRCBvZiB0aGUgQVAgKi8KKwkvKiBTU0lEIHNob3VsZC9zaG91bGRuJ3QgYmUgYmNhc3QgaW4gcHJvYmUgUlNQICYgYmVhY29uICovCisJdWludDhfdCBzc2lkSGlkZGVuOworfSBjZGZfcGFja2VkIHRTYXBfU1NJREluZm9fdDsKKworc3RydWN0IHNhcF9hY3NfY2ZnIHsKKwkvKiBBQ1MgQWxnbyBJbnB1dCAqLworCXVpbnQ4X3QgICAgYWNzX21vZGU7CisJdWludDMyX3QgICAgaHdfbW9kZTsKKwl1aW50OF90ICAgIHN0YXJ0X2NoOworCXVpbnQ4X3QgICAgZW5kX2NoOworCXVpbnQ4X3QgICAgKmNoX2xpc3Q7CisJdWludDhfdCAgICBjaF9saXN0X2NvdW50OworI2lmZGVmIEZFQVRVUkVfV0xBTl9BUF9BUF9BQ1NfT1BUSU1JWkUKKwl1aW50OF90ICAgIHNraXBfc2Nhbl9zdGF0dXM7CisJdWludDhfdCAgICBza2lwX3NjYW5fcmFuZ2UxX3N0Y2g7CisJdWludDhfdCAgICBza2lwX3NjYW5fcmFuZ2UxX2VuZGNoOworCXVpbnQ4X3QgICAgc2tpcF9zY2FuX3JhbmdlMl9zdGNoOworCXVpbnQ4X3QgICAgc2tpcF9zY2FuX3JhbmdlMl9lbmRjaDsKKyNlbmRpZgorCisJdWludDE2X3QgICBjaF93aWR0aDsKKwl1aW50OF90ICAgIHBjbF9jaGFubmVsc1tOVU1fUkZfQ0hBTk5FTFNdOworCXVpbnQzMl90ICAgcGNsX2NoX2NvdW50OworCS8qIEFDUyBBbGdvIE91dHB1dCAqLworCXVpbnQ4X3QgICAgcHJpX2NoOworCXVpbnQ4X3QgICAgaHRfc2VjX2NoOworCXVpbnQ4X3QgICAgdmh0X3NlZzBfY2VudGVyX2NoOworCXVpbnQ4X3QgICAgdmh0X3NlZzFfY2VudGVyX2NoOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX0NvbmZpZyB7CisJdFNhcF9TU0lESW5mb190IFNTSURpbmZvOworCWVDc3JQaHlNb2RlIFNhcEh3X21vZGU7ICAgICAgICAgLyogV2lyZWxlc3MgTW9kZSAqLworCWVTYXBNYWNBZGRyQUNMIFNhcE1hY2FkZHJfYWNsOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgYWNjZXB0X21hY1tNQVhfQUNMX01BQ19BRERSRVNTXTsgLyogTUFDIGZpbHRlcmluZyAqLworCWJvb2wgaWVlZTgwMjExZDsgICAgICAvKiBTcGVjaWZ5IGlmIDExRCBpcyBlbmFibGVkIG9yIGRpc2FibGVkICovCisJYm9vbCBwcm90RW5hYmxlZDsgICAgIC8qIFNwZWNpZnkgaWYgcHJvdGVjdGlvbiBpcyBlbmFibGVkIG9yIGRpc2FibGVkICovCisJLyogU3BlY2lmeSBpZiBPQlNTIHByb3RlY3Rpb24gaXMgZW5hYmxlZCBvciBkaXNhYmxlZCAqLworCWJvb2wgb2Jzc1Byb3RFbmFibGVkOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgZGVueV9tYWNbTUFYX0FDTF9NQUNfQUREUkVTU107ICAvKiBNQUMgZmlsdGVyaW5nICovCisJc3RydWN0IGNkZl9tYWNfYWRkciBzZWxmX21hY2FkZHI7ICAgICAgIC8qIHNlbGYgbWFjYWRkcmVzcyBvciBCU1NJRCAqLworCXVpbnQ4X3QgY2hhbm5lbDsgICAgICAgICAgLyogT3BlcmF0aW9uIGNoYW5uZWwgKi8KKwl1aW50OF90IHNlY19jaDsKKwljaGFuX3BhcmFtc190IGNoX3BhcmFtczsKKwl1aW50MzJfdCBjaF93aWR0aF9vcmlnOworCXVpbnQ4X3QgbWF4X251bV9zdGE7ICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgU1RBcyBpbiBzdGF0aW9uIHRhYmxlICovCisJdWludDhfdCBkdGltX3BlcmlvZDsgICAgICAvKiBkdGltIGludGVydmFsICovCisJdWludDhfdCBudW1fYWNjZXB0X21hYzsKKwl1aW50OF90IG51bV9kZW55X21hYzsKKwkvKiBNYXggaWUgbGVuZ3RoIDI1NSAqIDIoV1BBK1JTTikgKyAyIGJ5dGVzKHZlbmRvciBzcGVjaWZpYyBJRCkgKiAyICovCisJdWludDhfdCBSU05XUEFSZXFJRVsoU0lSX01BQ19NQVhfSUVfTEVOR1RIICogMikgKyA0XTsKKwkvKiBpdCBpcyBpZ25vcmVkIGlmIFswXSBpcyAwLiAqLworCXVpbnQ4X3QgY291bnRyeUNvZGVbV05JX0NGR19DT1VOVFJZX0NPREVfTEVOXTsKKwl1aW50OF90IFJTTkF1dGhUeXBlOworCXVpbnQ4X3QgUlNORW5jcnlwdFR5cGU7CisJdWludDhfdCBtY1JTTkVuY3J5cHRUeXBlOworCWVTYXBBdXRoVHlwZSBhdXRoVHlwZTsKKwlib29sIHByaXZhY3k7CisJYm9vbCBVYXBzZEVuYWJsZTsKKwlib29sIGZ3ZFdQU1BCQ1Byb2JlUmVxOworCS8qIDAgLSBkaXNhYmxlZCwgMSAtIG5vdCBjb25maWd1cmVkICwgMiAtIGNvbmZpZ3VyZWQgKi8KKwl1aW50OF90IHdwc19zdGF0ZTsKKwl1aW50MTZfdCBodF9jYXBhYjsKKwl1aW50MTZfdCBSU05XUEFSZXFJRUxlbmd0aDsgICAgIC8qIFRoZSBieXRlIGNvdW50IGluIHRoZSBwV1BBUmVxSUUgKi8KKwl1aW50MzJfdCBiZWFjb25faW50OyAgICAgICAgICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworCXVpbnQzMl90IGFwX3RhYmxlX21heF9zaXplOworCXVpbnQzMl90IGFwX3RhYmxlX2V4cGlyYXRpb25fdGltZTsKKwl1aW50MzJfdCBodF9vcF9tb2RlX2ZpeGVkOworCXRDREZfQ09OX01PREUgcGVyc29uYTsgLyogVGVsbHMgdXMgd2hpY2ggcGVyc29uYSBpdHMgR08gb3IgQVAgZm9yIG5vdyAqLworCXVpbnQ4X3QgZGlzYWJsZURGU0NoU3dpdGNoOworCWJvb2wgZW5PdmVyTGFwQ2g7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWJvb2wgbWZwUmVxdWlyZWQ7CisJYm9vbCBtZnBDYXBhYmxlOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisJdWludDhfdCBjY19zd2l0Y2hfbW9kZTsKKyNlbmRpZgorCXN0cnVjdCBzYXBfYWNzX2NmZyBhY3NfY2ZnOworCXVpbnQxNl90IHByb2JlUmVzcElFc0J1ZmZlckxlbjsKKwkvKiBidWZmZXIgZm9yIGFkZG4gaWVzIGNvbWVzIGZyb20gaG9zdGFwZCAqLworCXZvaWQgKnBQcm9iZVJlc3BJRXNCdWZmZXI7CisJdWludDE2X3QgYXNzb2NSZXNwSUVzTGVuOworCS8qIGJ1ZmZlciBmb3IgYWRkbiBpZXMgY29tZXMgZnJvbSBob3N0YXBkICovCisJdm9pZCAqcEFzc29jUmVzcElFc0J1ZmZlcjsKKwl1aW50MTZfdCBwcm9iZVJlc3BCY25JRXNMZW47CisJLyogYnVmZmVyIGZvciBhZGRuIGllcyBjb21lcyBmcm9tIGhvc3RhcGQgKi8KKwl2b2lkICpwUHJvYmVSZXNwQmNuSUVzQnVmZmVyOworCXVpbnQ4X3Qgc2FwX2RvdDExbWM7IC8qIFNwZWNpZnkgaWYgMTFNQyBpcyBlbmFibGVkIG9yIGRpc2FibGVkKi8KK30gdHNhcF9Db25maWdfdDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9BUF9BUF9BQ1NfT1BUSU1JWkUKK3R5cGVkZWYgZW51bSB7CisJZVNBUF9ET19ORVdfQUNTX1NDQU4sCisJZVNBUF9ET19QQVJfQUNTX1NDQU4sCisJZVNBUF9TS0lQX0FDU19TQ0FOCit9IHRTYXBfc2tpcF9hY3Nfc2NhbjsKKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworCWVTQVBfV1BTX1BST0JFX1JTUF9JRSwKKwllU0FQX1dQU19CRUFDT05fSUUsCisJZVNBUF9XUFNfQVNTT0NfUlNQX0lFCit9IGVTYXBXUFNJRV9DT0RFOworCit0eXBlZGVmIHN0cnVjdCBzU2FwTmFtZSB7CisJdWludDhfdCBudW1fbmFtZTsKKwl1aW50OF90IG5hbWVbTUFYX05BTUVfU0laRV07Cit9IHRTYXBOYW1lOworCit0eXBlZGVmIHN0cnVjdCBzU2FwVGV4dCB7CisJdWludDhfdCBudW1fdGV4dDsKKwl1aW50OF90IHRleHRbTUFYX1RFWFRfU0laRV07Cit9IHRTYXBUZXh0OworCit0eXBlZGVmIGVudW0geworCWVTQVBfREZTX0RPX05PVF9TS0lQX0NBQywKKwllU0FQX0RGU19TS0lQX0NBQworfSBlU2FwRGZzQ0FDU3RhdGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwllU0FQX0RGU19DSEFOTkVMX1VTQUJMRSwKKwllU0FQX0RGU19DSEFOTkVMX0FWQUlMQUJMRSwKKwllU0FQX0RGU19DSEFOTkVMX1VOQVZBSUxBQkxFCit9IGVTYXBEZnNDaGFuU3RhdHVzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNTYXBEZnNOb2xJbmZvIHsKKwl1aW50OF90IGRmc19jaGFubmVsX251bWJlcjsKKwllU2FwRGZzQ2hhblN0YXR1c190IHJhZGFyX3N0YXR1c19mbGFnOworCXVpbnQ2NF90IHJhZGFyX2ZvdW5kX3RpbWVzdGFtcDsKK30gdFNhcERmc05vbEluZm87CisKK3R5cGVkZWYgc3RydWN0IHNTYXBEZnNJbmZvIHsKKwljZGZfbWNfdGltZXJfdCBzYXBfZGZzX2NhY190aW1lcjsKKwl1aW50OF90IHNhcF9yYWRhcl9mb3VuZF9zdGF0dXM7CisJLyoKKwkgKiBOZXcgY2hhbm5lbCB0byBtb3ZlIHRvIHdoZW4gYSAgUmFkYXIgaXMKKwkgKiBkZXRlY3RlZCBvbiBjdXJyZW50IENoYW5uZWwKKwkgKi8KKwl1aW50OF90IHRhcmdldF9jaGFubmVsOworCXVpbnQ4X3QgbGFzdF9yYWRhcl9mb3VuZF9jaGFubmVsOworCXVpbnQ4X3QgaWdub3JlX2NhYzsKKwllU2FwRGZzQ0FDU3RhdGVfdCBjYWNfc3RhdGU7CisJdWludDhfdCB1c2VyX3Byb3ZpZGVkX3RhcmdldF9jaGFubmVsOworCisJLyoKKwkgKiBSZXF1ZXN0cyBmb3IgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFCisJICogZ2VuZXJhdGlvbiBhbmQgdHJhbnNtaXNzaW9uCisJICovCisJdWludDhfdCBjc2FJRVJlcXVpcmVkOworCXVpbnQ4X3QgbnVtQ3VycmVudFJlZ0RvbWFpbkRmc0NoYW5uZWxzOworCXRTYXBEZnNOb2xJbmZvIHNhcERmc0NoYW5uZWxOb2xMaXN0W05VTV81R0haX0NIQU5ORUxTXTsKKwl1aW50OF90IGlzX2Rmc19jYWNfdGltZXJfcnVubmluZzsKKwkvKgorCSAqIE5ldyBjaGFubmVsIHdpZHRoIGFuZCBuZXcgY2hhbm5lbCBib25kaW5nIG1vZGUKKwkgKiB3aWxsIG9ubHkgYmUgdXBkYXRlZCB2aWEgY2hhbm5lbCBmYWxsYmFjayBtZWNoYW5pc20KKwkgKi8KKwl1aW50OF90IG9yaWdfY2JNb2RlOworCXVpbnQ4X3Qgb3JpZ19jaGFuV2lkdGg7CisJdWludDhfdCBuZXdfY2hhbldpZHRoOworCXVpbnQ4X3QgbmV3X2NiTW9kZTsKKworCS8qCisJICogSU5JIHBhcmFtIHRvIGVuYWJsZS9kaXNhYmxlIFNBUCBXNTMKKwkgKiBjaGFubmVsIG9wZXJhdGlvbi4KKwkgKi8KKwl1aW50OF90IGlzX2Rmc193NTNfZGlzYWJsZWQ7CisKKwkvKgorCSAqIHNhcF9vcGVyYXRpbmdfY2hhbm5lbF9sb2NhdGlvbiBob2xkcyBTQVAgaW5kb29yLAorCSAqIG91dGRvb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIEN1cnJlbnRseSwgaWYgdGhpcworCSAqIHBhcmFtIGlzICBzZXQgdGhpcyBJbmRvb3Ivb3V0ZG9vciBjaGFubmVsIGludGVyb3AKKwkgKiByZXN0cmljdGlvbiB3aWxsIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIEpBUEFOCisJICogcmVndWxhdG9yeSBkb21haW4uCisJICoKKwkgKiAwIC0gSW5kaWNhdGVzIHRoYXQgbG9jYXRpb24gdW5rbm93bgorCSAqIChvcikgU0FQIEluZG9vci9vdXRkb29yIGludGVyb3AgaXMgYWxsb3dlZAorCSAqCisJICogMSAtIEluZGljYXRlcyBkZXZpY2UgaXMgb3BlcmF0aW5nIG9uIEluZG9vciBjaGFubmVscworCSAqIGFuZCBTQVAgY2Fubm90IHBpY2sgbmV4dCByYW5kb20gY2hhbm5lbCBmcm9tIG91dGRvb3IKKwkgKiBsaXN0IG9mIGNoYW5uZWxzIHdoZW4gYSByYWRhciBpcyBmb3VuZCBvbiBjdXJyZW50IG9wZXJhdGluZworCSAqIERGUyBjaGFubmVsLgorCSAqCisJICogMiAtIEluZGljYXRlcyBkZXZpY2UgaXMgb3BlcmF0aW5nIG9uIE91dGRvb3IgQ2hhbm5lbHMKKwkgKiBhbmQgU0FQIGNhbm5vdCBwaWNrIG5leHQgcmFuZG9tIGNoYW5uZWwgZnJvbSBpbmRvb3IKKwkgKiBsaXN0IG9mIGNoYW5uZWxzIHdoZW4gYSByYWRhciBpcyBmb3VuZCBvbiBjdXJyZW50CisJICogb3BlcmF0aW5nIERGUyBjaGFubmVsLgorCSAqLworCXVpbnQ4X3Qgc2FwX29wZXJhdGluZ19jaGFuX3ByZWZlcnJlZF9sb2NhdGlvbjsKKworCS8qCisJICogRmxhZyB0byBpbmRpY2F0ZSBpZiBERlMgdGVzdCBtb2RlIGlzIGVuYWJsZWQgYW5kCisJICogY2hhbm5lbCBzd2l0Y2ggaXMgZGlzYWJsZWQuCisJICovCisJdWludDhfdCBkaXNhYmxlX2Rmc19jaF9zd2l0Y2g7Cit9IHRTYXBEZnNJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdTYXBDdHhMaXN0IHsKKwl1aW50OF90IHNlc3Npb25JRDsKKwl2b2lkICpwU2FwQ29udGV4dDsKKwl0Q0RGX0NPTl9NT0RFIHNhcFBlcnNvbmE7Cit9IHRTYXBDdHhMaXN0LCB0cFNhcEN0eExpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1NhcFN0cnVjdCB7CisJLyogSW5mb3JtYXRpb24gUmVxdWlyZWQgZm9yIFNBUCBERlMgTWFzdGVyIG1vZGUgKi8KKwl0U2FwRGZzSW5mbyBTYXBEZnNJbmZvOworCXRTYXBDdHhMaXN0IHNhcEN0eExpc3RbU0FQX01BWF9OVU1fU0VTU0lPTl07CisjaWZkZWYgRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFCisJYm9vbCBzYXBfY2hhbm5lbF9hdm9pZGFuY2U7CisjZW5kaWYgLyogRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFICovCisJYm9vbCBlbmFibGVfZGZzX3BoeV9lcnJvcl9sb2dzOworfSB0U2FwU3RydWN0LCAqdHBTYXBTdHJ1Y3Q7CisKKyNkZWZpbmUgV1BTX1BST0JSU1BfVkVSX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgV1BTX1BST0JSU1BfU1RBVEVfUFJFU0VOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgV1BTX1BST0JSU1BfQVBTRVRVUExPQ0tfUFJFU0VOVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgV1BTX1BST0JSU1BfU0VMRUNURURSRUdJU1RSQV9QUkVTRU5UICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgV1BTX1BST0JSU1BfREVWSUNFUEFTU1dPUkRJRF9QUkVTRU5UICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgV1BTX1BST0JSU1BfU0VMRUNURURSRUdJU1RSQUNGR01FVEhPRF9QUkVTRU5UICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgV1BTX1BST0JSU1BfUkVTUE9OU0VUWVBFX1BSRVNFTlQgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgV1BTX1BST0JSU1BfVVVJREVfUFJFU0VOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgV1BTX1BST0JSU1BfTUFOVUZBQ1RVUkVfUFJFU0VOVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgV1BTX1BST0JSU1BfTU9ERUxOQU1FX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgV1BTX1BST0JSU1BfTU9ERUxOVU1CRVJfUFJFU0VOVCAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgV1BTX1BST0JSU1BfU0VSSUFMTlVNQkVSX1BSRVNFTlQgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgV1BTX1BST0JSU1BfUFJJTUFSWURFVklDRVRZUEVfUFJFU0VOVCAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgV1BTX1BST0JSU1BfREVWSUNFTkFNRV9QUkVTRU5UICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgV1BTX1BST0JSU1BfQ09ORklHTUVUSE9EU19QUkVTRU5UICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgV1BTX1BST0JSU1BfUkZfQkFORFNfUFJFU0VOVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1dQU1Byb2JlUnNwSUVfcyB7CisJdWludDMyX3QgRmllbGRQcmVzZW50OworCXVpbnQzMl90IFZlcnNpb247ICAgICAgICAgLyogVmVyc2lvbi4gMHgxMCA9IHZlcnNpb24gMS4wLCAweDExID0gZXRjLiAqLworCXVpbnQzMl90IHdwc1N0YXRlOyAgICAgICAgLyogMSA9IHVuY29uZmlndXJlZCwgMiA9IGNvbmZpZ3VyZWQuICovCisJYm9vbCBBUFNldHVwTG9ja2VkOyAgICAgICAvKiBNdXN0IGJlIGluY2x1ZGVkIGlmIHZhbHVlIGlzIHRydWUgKi8KKwkvKiBpbmRpY2F0ZXMgaWYgdXNlciBoYXMgcmVjZW50bHkgYWN0aXZhdGVkIGEgcmVnIHRvIGFkZCBhbiBFbnJvbGxlZS4gKi8KKwlib29sIFNlbGVjdGVkUmVnaXN0cmE7CisJdWludDE2X3QgRGV2aWNlUGFzc3dvcmRJRDsgICAgICAgICAgICAgIC8qIERldmljZSBQYXNzd29yZCBJRCAqLworCS8qIFNlbGVjdGVkIFJlZ2lzdHJhciBjb25maWcgbWV0aG9kICovCisJdWludDE2X3QgU2VsZWN0ZWRSZWdpc3RyYUNmZ01ldGhvZDsKKwl1aW50OF90IFJlc3BvbnNlVHlwZTsgICAgICAgICAgIC8qIFJlc3BvbnNlIHR5cGUgKi8KKwl1aW50OF90IFVVSURfRVsxNl07ICAgICAgICAgICAgIC8qIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBBUC4gKi8KKwl0U2FwTmFtZSBNYW51ZmFjdHVyZTsKKwl0U2FwVGV4dCBNb2RlbE5hbWU7CisJdFNhcFRleHQgTW9kZWxOdW1iZXI7CisJdFNhcFRleHQgU2VyaWFsTnVtYmVyOworCS8qIERldmljZSBDYXRlZ29yeSBJRDogMUNvbXB1dGVyLCAySW5wdXQgRGV2aWNlLCAuLi4gKi8KKwl1aW50MzJfdCBQcmltYXJ5RGV2aWNlQ2F0ZWdvcnk7CisJLyogVmVuZG9yIHNwZWNpZmljIE9VSSBmb3IgRGV2aWNlIFN1YiBDYXRlZ29yeSAqLworCXVpbnQ4X3QgUHJpbWFyeURldmljZU9VSVs0XTsKKwkvKgorCSAqIERldmljZSBTdWIgQ2F0ZWdvcnkgSUQ6IDEtUEMsCisJICogMi1TZXJ2ZXIgaWYgRGV2aWNlIENhdGVnb3J5IGlzIGNvbXB1dGVyCisJICovCisJdWludDMyX3QgRGV2aWNlU3ViQ2F0ZWdvcnk7CisJdFNhcFRleHQgRGV2aWNlTmFtZTsKKwl1aW50MTZfdCBDb25maWdNZXRob2Q7ICAvKiBDb25maWd1YXJhdGlvbiBtZXRob2QgKi8KKwl1aW50OF90IFJGQmFuZDsgICAgICAgICAvKiBSRiBiYW5kcyBhdmFpbGFibGUgb24gdGhlIEFQICovCit9IHRTYXBfV1BTUHJvYmVSc3BJRTsKKworI2RlZmluZSBXUFNfQkVBQ09OX1ZFUl9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgV1BTX0JFQUNPTl9TVEFURV9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFdQU19CRUFDT05fQVBTRVRVUExPQ0tfUFJFU0VOVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBXUFNfQkVBQ09OX1NFTEVDVEVEUkVHSVNUUkFfUFJFU0VOVCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgV1BTX0JFQUNPTl9ERVZJQ0VQQVNTV09SRElEX1BSRVNFTlQgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFdQU19CRUFDT05fU0VMRUNURURSRUdJU1RSQUNGR01FVEhPRF9QUkVTRU5UICAgMHgwMDAwMDAyMAorI2RlZmluZSBXUFNfQkVBQ09OX1VVSURFX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgV1BTX0JFQUNPTl9SRl9CQU5EU19QUkVTRU5UICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisKK3R5cGVkZWYgc3RydWN0IHNhcF9XUFNCZWFjb25JRV9zIHsKKwl1aW50MzJfdCBGaWVsZFByZXNlbnQ7CisJdWludDMyX3QgVmVyc2lvbjsgICAgICAgICAvKiBWZXJzaW9uLiAweDEwID0gdmVyc2lvbiAxLjAsIDB4MTEgPSBldGMuICovCisJdWludDMyX3Qgd3BzU3RhdGU7ICAgICAgICAvKiAxID0gdW5jb25maWd1cmVkLCAyID0gY29uZmlndXJlZC4gKi8KKwlib29sIEFQU2V0dXBMb2NrZWQ7ICAgICAgIC8qIE11c3QgYmUgaW5jbHVkZWQgaWYgdmFsdWUgaXMgdHJ1ZSAqLworCS8qIGluZGljYXRlcyBpZiB1c2VyIGhhcyByZWNlbnRseSBhY3RpdmF0ZWQgYSByZWcgdG8gYWRkIGFuIEVucm9sbGVlLiAqLworCWJvb2wgU2VsZWN0ZWRSZWdpc3RyYTsKKwl1aW50MTZfdCBEZXZpY2VQYXNzd29yZElEOyAgICAgICAgICAgICAgLyogRGV2aWNlIFBhc3N3b3JkIElEICovCisJdWludDE2X3QgU2VsZWN0ZWRSZWdpc3RyYUNmZ01ldGhvZDsgICAgIC8qIFNlbGVjdGVkIHJlZyBjb25maWcgbWV0aG9kICovCisJdWludDhfdCBVVUlEX0VbMTZdOyAgICAgLyogVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIEFQLiAqLworCXVpbnQ4X3QgUkZCYW5kOyAgICAgICAgIC8qIFJGIGJhbmRzIGF2YWlsYWJsZSBvbiB0aGUgQVAgKi8KK30gdFNhcF9XUFNCZWFjb25JRTsKKworI2RlZmluZSBXUFNfQVNTT0NSU1BfVkVSX1BSRVNFTlQgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBXUFNfQVNTT0NSU1BfUkVTUE9OU0VUWVBFX1BSRVNFTlQgICAgMHgwMDAwMDAwMgorCit0eXBlZGVmIHN0cnVjdCBzYXBfV1BTQXNzb2NSc3BJRV9zIHsKKwl1aW50MzJfdCBGaWVsZFByZXNlbnQ7CisJdWludDMyX3QgVmVyc2lvbjsKKwl1aW50OF90IFJlc3Bvc2VUeXBlOworfSB0U2FwX1dQU0Fzc29jUnNwSUU7CisKK3R5cGVkZWYgc3RydWN0IHNhcF9XUFNJRV9zIHsKKwllU2FwV1BTSUVfQ09ERSBzYXBXUFNJRUNvZGU7CisJdW5pb24geworCQl0U2FwX1dQU1Byb2JlUnNwSUUgc2FwV1BTUHJvYmVSc3BJRTsgLyogV1BTIFNldCBQcm9iZSBSZXNwIElFICovCisJCXRTYXBfV1BTQmVhY29uSUUgc2FwV1BTQmVhY29uSUU7ICAgICAvKiBXUFMgU2V0IEJlYWNvbiBJRSAqLworCQl0U2FwX1dQU0Fzc29jUnNwSUUgc2FwV1BTQXNzb2NSc3BJRTsgLyogV1BTIFNldCBBc3NvYyBSZXNwIElFICovCisJfSBzYXB3cHNpZTsKK30gdFNhcF9XUFNJRSwgKnRwU2FwX1dQU0lFOworCisjaWZkZWYgV0xBTlRMX0RFQlVHCisjZGVmaW5lIE1BWF9SQVRFX0lOREVYICAgICAgMTM2CisjZGVmaW5lIE1BWF9OVU1fUlNTSSAgICAgICAgMTAwCisjZGVmaW5lIE1BWF9SU1NJX0lOVEVSVkFMICAgICA1CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1NvZnRhcFN0YXRzX3MgeworCXVpbnQzMl90IHR4VUNGY250OworCXVpbnQzMl90IHR4TUNGY250OworCXVpbnQzMl90IHR4QkNGY250OworCXVpbnQzMl90IHR4VUNCY250OworCXVpbnQzMl90IHR4TUNCY250OworCXVpbnQzMl90IHR4QkNCY250OworCXVpbnQzMl90IHJ4VUNGY250OworCXVpbnQzMl90IHJ4TUNGY250OworCXVpbnQzMl90IHJ4QkNGY250OworCXVpbnQzMl90IHJ4VUNCY250OworCXVpbnQzMl90IHJ4TUNCY250OworCXVpbnQzMl90IHJ4QkNCY250OworCXVpbnQzMl90IHJ4QmNudDsKKwl1aW50MzJfdCByeEJjbnRDUkNvazsKKwl1aW50MzJfdCByeFJhdGU7CisjaWZkZWYgV0xBTlRMX0RFQlVHCisJdWludDMyX3QgcGt0Q291bnRlclJhdGVJZHhbTUFYX1JBVEVfSU5ERVhdOworCXVpbnQzMl90IHBrdENvdW50ZXJSc3NpW01BWF9OVU1fUlNTSV07CisjZW5kaWYKK30gdFNhcF9Tb2Z0YXBTdGF0cywgKnRwU2FwX1NvZnRhcFN0YXRzOworLyogQ2hhbm5lbC9GcmVxdWVuY3kgdGFibGUgKi8KK2V4dGVybiBjb25zdCB0UmZDaGFubmVsUHJvcHMgcmZfY2hhbm5lbHNbTlVNX1JGX0NIQU5ORUxTXTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQKKy8qIFN0b3JlIGNoYW5uZWwgc2FmZXR5IGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgY2hhbm5lbE51bWJlcjsKKwlib29sIGlzU2FmZTsKK30gc2FwU2FmZUNoYW5uZWxUeXBlOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DSF9BVk9JRCAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKK3ZvaWQgc2FwX2NsZWFudXBfY2hhbm5lbF9saXN0KHZvaWQgKnNhcENvbnRleHQpOworI2Vsc2UKK3ZvaWQgc2FwX2NsZWFudXBfY2hhbm5lbF9saXN0KHZvaWQpOworI2VuZGlmCit2b2lkIHNhcENsZWFudXBBbGxDaGFubmVsTGlzdCh2b2lkKTsKK0NERl9TVEFUVVMgd2xhbnNhcF9zZXRfd3BzX2llKHZvaWQgKnBfY2RzX2djdHgsIHRTYXBfV1BTSUUgKnBXUFNJZSk7CitDREZfU1RBVFVTIHdsYW5zYXBfdXBkYXRlX3dwc19pZSh2b2lkICpwX2Nkc19nY3R4KTsKK0NERl9TVEFUVVMgd2xhbnNhcF9zdG9wX1dwcyh2b2lkICpwX2Nkc19nY3R4KTsKK0NERl9TVEFUVVMgd2xhbnNhcF9nZXRfd3BzX3N0YXRlKHZvaWQgKnBfY2RzX2djdHgsIGJvb2wgKnBiV1BTU3RhdGUpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAordm9pZCAqCisjZWxzZQorQ0RGX1NUQVRVUworI2VuZGlmCit3bGFuc2FwX29wZW4odm9pZCAqcF9jZHNfZ2N0eCk7CitDREZfU1RBVFVTIHdsYW5zYXBfc3RhcnQodm9pZCAqcF9jZHNfZ2N0eCk7CitDREZfU1RBVFVTIHdsYW5zYXBfc3RvcCh2b2lkICpwX2Nkc19nY3R4KTsKK0NERl9TVEFUVVMgd2xhbnNhcF9jbG9zZSh2b2lkICpwX2Nkc19nY3R4KTsKK3R5cGVkZWYgQ0RGX1NUQVRVUyAoKnRwV0xBTl9TQVBFdmVudENCKSh0cFNhcF9FdmVudCBwU2FwRXZlbnQsCisJCXZvaWQgKnBVc3JDb250ZXh0KTsKK3VpbnQ4X3Qgd2xhbnNhcF9nZXRfc3RhdGUodm9pZCAqcF9jZHNfZ2N0eCk7CisKK0NERl9TVEFUVVMgd2xhbnNhcF9zdGFydF9ic3Modm9pZCAqcF9jZHNfZ2N0eCwKKwkgdHBXTEFOX1NBUEV2ZW50Q0IgcFNhcEV2ZW50Q2FsbGJhY2ssCisJIHRzYXBfQ29uZmlnX3QgKnBDb25maWcsIHZvaWQgKnBVc3JDb250ZXh0KTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAordWludDE2X3Qgd2xhbnNhcF9jaGVja19jY19pbnRmKHZvaWQgKkN0eCk7CisjZW5kaWYKK0NERl9TVEFUVVMgd2xhbnNhcF9zZXRfbWFjX2FjbCh2b2lkICpwX2Nkc19nY3R4LCB0c2FwX0NvbmZpZ190ICpwQ29uZmlnKTsKK0NERl9TVEFUVVMgd2xhbnNhcF9zdG9wX2Jzcyh2b2lkICpwX2Nkc19nY3R4KTsKK0NERl9TVEFUVVMgd2xhbnNhcF9kaXNhc3NvY19zdGEodm9pZCAqcF9jZHNfZ2N0eCwKKwkJCQljb25zdCB1aW50OF90ICpwUGVlclN0YU1hYyk7CitDREZfU1RBVFVTIHdsYW5zYXBfZGVhdXRoX3N0YSh2b2lkICpwX2Nkc19nY3R4LAorCQkJc3RydWN0IHRhZ0NzckRlbFN0YVBhcmFtcyAqcERlbFN0YVBhcmFtcyk7CitDREZfU1RBVFVTIHdsYW5zYXBfc2V0X2NoYW5uZWxfY2hhbmdlX3dpdGhfY3NhKHZvaWQgKnBfY2RzX2djdHgsCisJCQl1aW50MzJfdCB0YXJnZXRDaGFubmVsKTsKK0NERl9TVEFUVVMgd2xhbnNhcF9zZXRfa2V5X3N0YSh2b2lkICpwX2Nkc19nY3R4LAorCXRDc3JSb2FtU2V0S2V5ICpwU2V0S2V5SW5mbyk7CitDREZfU1RBVFVTIHdsYW5zYXBfZ2V0X2Fzc29jX3N0YXRpb25zKHZvaWQgKnBfY2RzX2djdHgsCisJIENERl9NT0RVTEVfSUQgbW9kdWxlLCB0cFNhcF9Bc3NvY01hY0FkZHIgcEFzc29jU3Rhcyk7CitDREZfU1RBVFVTIHdsYW5zYXBfcmVtb3ZlX3dwc19zZXNzaW9uX292ZXJsYXAodm9pZCAqcF9jZHNfZ2N0eCwKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIHBSZW1vdmVNYWMpOworQ0RGX1NUQVRVUyB3bGFuc2FwX2dldF93cHNfc2Vzc2lvbl9vdmVybGFwKHZvaWQgKnBfY2RzX2djdHgpOworQ0RGX1NUQVRVUyB3bGFuc2FwX3NldF9jb3VudGVyX21lYXN1cmUodm9pZCAqcF9jZHNfZ2N0eCwgYm9vbCBiRW5hYmxlKTsKK0NERl9TVEFUVVMgd2xhbl9zYXBfZ2V0c3RhdGlvbl9pZV9pbmZvcm1hdGlvbih2b2lkICpwX2Nkc19nY3R4LAorCXVpbnQzMl90ICpwTGVuLCB1aW50OF90ICpwQnVmKTsKK0NERl9TVEFUVVMgd2xhbnNhcF9jbGVhcl9hY2wodm9pZCAqcF9jZHNfZ2N0eCk7CitDREZfU1RBVFVTIHdsYW5zYXBfZ2V0X2FjbF9hY2NlcHRfbGlzdCh2b2lkICpwX2Nkc19nY3R4LAorCSBzdHJ1Y3QgY2RmX21hY19hZGRyICpwQWNjZXB0TGlzdCwgdWludDhfdCAqbkFjY2VwdExpc3QpOworQ0RGX1NUQVRVUyB3bGFuc2FwX2dldF9hY2xfZGVueV9saXN0KHZvaWQgKnBDdHgsCisJc3RydWN0IGNkZl9tYWNfYWRkciAqcERlbnlMaXN0LCB1aW50OF90ICpuRGVueUxpc3QpOworQ0RGX1NUQVRVUyB3bGFuc2FwX3NldF9tb2RlKHZvaWQgKnBfY2RzX2djdHgsIHVpbnQzMl90IG1vZGUpOworQ0RGX1NUQVRVUyB3bGFuc2FwX2dldF9hY2xfbW9kZSh2b2lkICpwX2Nkc19nY3R4LCBlU2FwTWFjQWRkckFDTCAqbW9kZSk7CitDREZfU1RBVFVTIHdsYW5zYXBfbW9kaWZ5X2FjbCh2b2lkICpwX2Nkc19nY3R4LAorCSB1aW50OF90ICpwUGVlclN0YU1hYywgZVNhcEFDTFR5cGUgbGlzdFR5cGUsIGVTYXBBQ0xDbWRUeXBlIGNtZCk7CitDREZfU1RBVFVTIHdsYW5zYXBfc2V0X3dwYXJzbl9pZXMKKwkodm9pZCAqcF9jZHNfZ2N0eCwgdWludDhfdCAqcFdQQVJTTklFcywgdWludDMyX3QgV1BBUlNOSUVzTGVuKTsKK0NERl9TVEFUVVMgd2xhbnNhcF9zZW5kX2FjdGlvbgorCSh2b2lkICpwX2Nkc19nY3R4LAorCSBjb25zdCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4sIHVpbnQxNl90IHdhaXQsIHVpbnQxNl90IGNoYW5uZWxfZnJlcSk7CitDREZfU1RBVFVTIHdsYW5zYXBfcmVtYWluX29uX2NoYW5uZWwKKwkodm9pZCAqcF9jZHNfZ2N0eCwKKwkgdWludDhfdCBjaGFubmVsLAorCSB1aW50MzJfdCBkdXJhdGlvbiwgcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKnBDb250ZXh0LAorCSB1aW50MzJfdCAqc2Nhbl9pZCk7CitDREZfU1RBVFVTIHdsYW5zYXBfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKHZvaWQgKnBfY2RzX2djdHgsCisJCXVpbnQzMl90IHNjYW5faWQpOworQ0RGX1NUQVRVUyB3bGFuc2FwX3JlZ2lzdGVyX21nbXRfZnJhbWUKKwkodm9pZCAqcF9jZHNfZ2N0eCwKKwkgdWludDE2X3QgZnJhbWVUeXBlLCB1aW50OF90ICptYXRjaERhdGEsIHVpbnQxNl90IG1hdGNoTGVuKTsKK0NERl9TVEFUVVMgd2xhbnNhcF9kZV9yZWdpc3Rlcl9tZ210X2ZyYW1lCisJKHZvaWQgKnBfY2RzX2djdHgsCisJIHVpbnQxNl90IGZyYW1lVHlwZSwgdWludDhfdCAqbWF0Y2hEYXRhLCB1aW50MTZfdCBtYXRjaExlbik7CitDREZfU1RBVFVTIHdsYW5zYXBfY2hhbm5lbF9jaGFuZ2VfcmVxdWVzdCh2b2lkICpwX2Nkc19nY3R4LAorCQl1aW50OF90IHRBcmdldENoYW5uZWwpOworQ0RGX1NUQVRVUyB3bGFuc2FwX3N0YXJ0X2JlYWNvbl9yZXEodm9pZCAqcFNhcEN0eCk7CitDREZfU1RBVFVTIHdsYW5zYXBfZGZzX3NlbmRfY3NhX2llX3JlcXVlc3Qodm9pZCAqcFNhcEN0eCk7CitDREZfU1RBVFVTIHdsYW5zYXBfZ2V0X2Rmc19pZ25vcmVfY2FjKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCAqcElnbm9yZV9jYWMpOworQ0RGX1NUQVRVUyB3bGFuc2FwX3NldF9kZnNfaWdub3JlX2NhYyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgaWdub3JlX2NhYyk7CitDREZfU1RBVFVTIHdsYW5zYXBfc2V0X2Rmc19yZXN0cmljdF9qYXBhbl93NTModEhhbEhhbmRsZSBoSGFsLAorCQkJdWludDhfdCBkaXNhYmxlX0Rmc19KYXBhblczKTsKKworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorQ0RGX1NUQVRVUword2xhbl9zYXBfc2V0X2NoYW5uZWxfYXZvaWRhbmNlKHRIYWxIYW5kbGUgaGFsLCBib29sIHNhcF9jaGFubmVsX2F2b2lkYW5jZSk7CisjZW5kaWYKKworQ0RGX1NUQVRVUyB3bGFuc2FwX3NldF9kZnNfcHJlZmVycmVkX2NoYW5uZWxfbG9jYXRpb24odEhhbEhhbmRsZSBoSGFsLAorCQl1aW50OF90IGRmc19QcmVmZXJyZWRfQ2hhbm5lbHNfbG9jYXRpb24pOworQ0RGX1NUQVRVUyB3bGFuc2FwX3NldF9kZnNfdGFyZ2V0X2NobmwodEhhbEhhbmRsZSBoSGFsLAorCQkJdWludDhfdCB0YXJnZXRfY2hhbm5lbCk7Cit1aW50MzJfdCB3bGFuX3NhcF9nZXRfdmh0X2NoX3dpZHRoKHZvaWQgKmN0eCk7Cit2b2lkIHdsYW5fc2FwX3NldF92aHRfY2hfd2lkdGgodm9pZCAqY3R4LCB1aW50MzJfdCB2aHRfY2hhbm5lbF93aWR0aCk7CitDREZfU1RBVFVTIHdsYW5zYXBfdXBkYXRlX3NhcF9jb25maWdfYWRkX2llKHRzYXBfQ29uZmlnX3QgKnBDb25maWcsCisJCWNvbnN0IHVpbnQ4X3QgKgorCQlwQWRkaXRpb25JRUJ1ZmZlciwKKwkJdWludDE2X3QgYWRkaXRpb25JRUxlbmd0aCwKKwkJZVVwZGF0ZUlFc1R5cGUgdXBkYXRlVHlwZSk7CitDREZfU1RBVFVTIHdsYW5zYXBfcmVzZXRfc2FwX2NvbmZpZ19hZGRfaWUodHNhcF9Db25maWdfdCAqcENvbmZpZywKKwkJCWVVcGRhdGVJRXNUeXBlIHVwZGF0ZVR5cGUpOwordm9pZCB3bGFuc2FwX2V4dGVuZF90b19hY3NfcmFuZ2UodWludDhfdCAqc3RhcnRDaGFubmVsTnVtLAorCQl1aW50OF90ICplbmRDaGFubmVsTnVtLAorCQl1aW50OF90ICpiYW5kU3RhcnRDaGFubmVsLAorCQl1aW50OF90ICpiYW5kRW5kQ2hhbm5lbCk7CitDREZfU1RBVFVTIHdsYW5zYXBfZ2V0X2Rmc19ub2wodm9pZCAqcFNhcEN0eCk7CitDREZfU1RBVFVTIHdsYW5zYXBfc2V0X2Rmc19ub2wodm9pZCAqcFNhcEN0eCwgZVNhcERmc05vbFR5cGUgY29uZik7Cit2b2lkIHdsYW5zYXBfcG9wdWxhdGVfZGVsX3N0YV9wYXJhbXMoY29uc3QgdWludDhfdCAqbWFjLAorCQl1aW50MTZfdCByZWFzb25fY29kZSwKKwkJdWludDhfdCBzdWJ0eXBlLAorCQlzdHJ1Y3QgdGFnQ3NyRGVsU3RhUGFyYW1zICpwRGVsU3RhUGFyYW1zKTsKK0NERl9TVEFUVVMgd2xhbnNhcF9hY3NfY2hzZWxlY3Qodm9pZCAqcHZvc19nY3R4LAorCQl0cFdMQU5fU0FQRXZlbnRDQiBwYWNzX2V2ZW50X2NhbGxiYWNrLAorCQl0c2FwX0NvbmZpZ190ICpwY29uZmlnLAorCQl2b2lkICpwdXNyX2NvbnRleHQpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAjaWZuZGVmIFdMQU5fUUNUX1dMQU5TQVBfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zYXAvc3JjL3NhcF9hcGlfbGlua19jbnRsLmMgYi9jb3JlL3NhcC9zcmMvc2FwX2FwaV9saW5rX2NudGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE2NWRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zYXAvc3JjL3NhcF9hcGlfbGlua19jbnRsLmMKQEAgLTAsMCArMSwxMjA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgcyBhIHAgQSBwIGkgTCBpIG4gayBDIG4gdCBsIC4gQworCisgICBPVkVSVklFVzoKKworICAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBTQVAgbW9kdWxlcworICAgTGluayBDb250cm9sIGZ1bmN0aW9ucy4KKworICAgVGhlIGZ1bmN0aW9ucyBleHRlcm5hbGl6ZWQgYnkgdGhpcyBtb2R1bGUgYXJlIHRvIGJlIGNhbGxlZCBPTkxZIGJ5IG90aGVyCisgICBXTEFOIG1vZHVsZXMgKEhERCkKKworICAgREVQRU5ERU5DSUVTOgorCisgICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisvKiBQaWNrIHVwIHRoZSBDU1IgY2FsbGJhY2sgZGVmaW5pdGlvbiAqLworI2luY2x1ZGUgImNzcl9hcGkuaCIKKyNpbmNsdWRlICJzbWVfYXBpLmgiCisvKiBTQVAgSW50ZXJuYWwgQVBJIGhlYWRlciBmaWxlICovCisjaW5jbHVkZSAic2FwX2ludGVybmFsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTQVBfREVCVUcKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsaXplZCBGdW5jdGlvbiBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEb2N1bWVudGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIHdsYW5zYXBfc2Nhbl9jYWxsYmFjaygpIC0gQ2FsbGJhY2sgZm9yIFNjYW4gKHNjYW4gcmVzdWx0cykgRXZlbnRzCisgKgorICogQGhhbF9oYW5kbGUgIDogdEhhbEhhbmRsZSBwYXNzZWQgaW4gd2l0aCB0aGUgc2NhbiByZXF1ZXN0CisgKiBAY3R4ICAgOiBUaGUgc2Vjb25kIGNvbnRleHQgcGFzcyBpbiBmb3IgdGhlIGNhbGxlciAoc2FwQ29udGV4dCkKKyAqIEBzY2FuSUQgICAgICA6IHNjYW5JRCBnb3QgYWZ0ZXIgdGhlIHNjYW4KKyAqCisgKiAgQ2FsbGJhY2sgZm9yIFNjYW4gKHNjYW4gcmVzdWx0cykgRXZlbnRzCisgKgorICogUmV0dXJuOiBTdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bGFuc2FwX3NjYW5fY2FsbGJhY2sodEhhbEhhbmRsZSBoYWxfaGFuZGxlLAorCQkJCSB2b2lkICpjdHgsICAgLyogT3BhcXVlIFNBUCBoYW5kbGUgKi8KKwkJCQkgdWludDhfdCBzZXNzaW9uX2lkLAorCQkJCSB1aW50MzJfdCBzY2FuX2lkLCBlQ3NyU2NhblN0YXR1cyBzY2FuX3N0YXR1cykgeworCXRTY2FuUmVzdWx0SGFuZGxlIHJlc3VsdCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBnZXRfcmVzdWx0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXB0U2FwQ29udGV4dCBzYXBfY3R4ID0gKHB0U2FwQ29udGV4dCkgY3R4OworCXRXTEFOX1NBUEV2ZW50IHNhcEV2ZW50OyAgICAgICAgLyogU3RhdGUgbWFjaGluZSBldmVudCAqLworCXVpbnQ4X3Qgb3BlckNoYW5uZWwgPSAwOworCUNERl9TVEFUVVMgc2FwX3NtX3N0YXR1czsKKworI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCisJdWludDMyX3QgZXZlbnQ7CisjZW5kaWYKKworCWlmIChOVUxMID09IGhhbF9oYW5kbGUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSJJbiAlcyBpbnZhbGlkIGhIYWwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJaWYgKHNhcF9jdHgtPnNhcHNNYWNoaW5lID09IGVTQVBfRElTQ09OTkVDVEVEKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJIkluICVzIEJTUyBhbHJlYWR5IHN0b3BwZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlzd2l0Y2ggKHNjYW5fc3RhdHVzKSB7CisJY2FzZSBlQ1NSX1NDQU5fU1VDQ0VTUzoKKwkJLyogc2FwU2NhbkNvbXBsZXRlQ2FsbGJhY2sgd2l0aCBlQ1NSX1NDQU5fU1VDQ0VTUyAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICJJbiAlcywgQ1NSIHNjYW5TdGF0dXMgPSAlcyAoJWQpIiwgX19mdW5jX18sCisJCQkgICJlQ1NSX1NDQU5fU1VDQ0VTUyIsIHNjYW5fc3RhdHVzKTsKKworCQkvKioKKwkJICogR2V0IHNjYW4gcmVzdWx0cywgUnVuIGNoYW5uZWwgc2VsZWN0aW9uIGFsZ29yaXRobSwKKwkJICogc2VsZWN0IGNoYW5uZWwgYW5kIGtlZXAgaW4gc2FwX2N0eC0+Q2hhbm5lbAorCQkgKi8KKwkJZ2V0X3Jlc3VsdF9zdGF0dXMgPQorCQkJc21lX3NjYW5fZ2V0X3Jlc3VsdChoYWxfaGFuZGxlLCBzYXBfY3R4LT5zZXNzaW9uSWQsIE5VTEwsCisJCQkJCSAgICAmcmVzdWx0KTsKKworCQlldmVudCA9IGVTQVBfTUFDX1NDQU5fQ09NUExFVEU7CisKKwkJaWYgKChnZXRfcmVzdWx0X3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCSAgICAmJiAoZ2V0X3Jlc3VsdF9zdGF0dXMgIT0gQ0RGX1NUQVRVU19FX05VTExfVkFMVUUpKSB7CisJCQkvKiBObyBzY2FuIHJlc3VsdHMgKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIkluICVzLCBHZXQgc2NhbiByZXN1bHQgZmFpbGVkISByZXQgPSAlZCIsCisJCQkJICBfX2Z1bmNfXywgZ2V0X3Jlc3VsdF9zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVBfQVBfQUNTX09QVElNSVpFCisJCWlmIChzY2FuX2lkICE9IDApIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgICIlczogU2VuZGluZyBBQ1MgU2NhbiBza2lwIGV2ZW50IiwgX19mdW5jX18pOworCQkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgTlVMTCwKKwkJCQkJICBlU0FQX0FDU19TQ0FOX1NVQ0NFU1NfRVZFTlQsCisJCQkJCSAgKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCX0gZWxzZQorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgIiVzOiBBQ1Mgc2NhbiBpZDogJWQgKHNraXBwZWQgQUNTIFNDQU4pIiwKKwkJCQkgIF9fZnVuY19fLCBzY2FuX2lkKTsKKyNlbmRpZgorCQlvcGVyQ2hhbm5lbCA9IHNhcF9zZWxlY3RfY2hhbm5lbChoYWxfaGFuZGxlLCBzYXBfY3R4LCByZXN1bHQpOworCisJCXNtZV9zY2FuX3Jlc3VsdF9wdXJnZShoYWxfaGFuZGxlLCByZXN1bHQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWV2ZW50ID0gZVNBUF9DSEFOTkVMX1NFTEVDVElPTl9GQUlMRUQ7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIkluICVzLCBDU1Igc2NhblN0YXR1cyA9ICVzICglZCkiLCBfX2Z1bmNfXywKKwkJCSAgImVDU1JfU0NBTl9BQk9SVC9GQUlMVVJFIiwgc2Nhbl9zdGF0dXMpOworCX0KKworCWlmIChvcGVyQ2hhbm5lbCA9PSBTQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQpCisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKwl7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSIlczogTm8gc3VpdGFibGUgY2hhbm5lbCBzZWxlY3RlZCBkdWUgdG8gREZTLCBMVEUiCisJCQkiQ09FWCBhbmQgY29uY3VycmVudCBtb2RlIHJlc3RyaWN0aW9ucyIsIF9fZnVuY19fKTsKKworCQlzYXBfY3R4LT5zYXBzTWFjaGluZSA9IGVTQVBfQ0hfU0VMRUNUOworCQlldmVudCA9IGVTQVBfQ0hBTk5FTF9TRUxFQ1RJT05fRkFJTEVEOworCX0KKyNlbHNlCisJCXNhcF9jdHgtPmNoYW5uZWwgPSBTQVBfREVGQVVMVF8yNEdIWl9DSEFOTkVMOworI2VuZGlmCisJZWxzZSB7CisJCXNhcF9jdHgtPmNoYW5uZWwgPSBvcGVyQ2hhbm5lbDsKKwl9CisKKwlzYXBfY3R4LT5jaF9wYXJhbXMuY2hfd2lkdGggPSBzYXBfY3R4LT5hY3NfY2ZnLT5jaF93aWR0aDsKKwlzbWVfc2V0X2NoX3BhcmFtcyhoYWxfaGFuZGxlLAorCQkJc2FwX2N0eC0+Y3NyX3JvYW1Qcm9maWxlLnBoeU1vZGUsCisJCQlzYXBfY3R4LT5jaGFubmVsLAorCQkJc2FwX2N0eC0+c2Vjb25kYXJ5X2NoLAorCQkJJnNhcF9jdHgtPmNoX3BhcmFtcyk7CisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKwlpZiAoc2FwX2N0eC0+Y2hhbm5lbExpc3QgIT0gTlVMTCkgeworCQkvKiBBbHdheXMgZnJlZSB1cCB0aGUgbWVtb3J5IGZvciBjaGFubmVsIHNlbGVjdGlvbiB3aGF0ZXZlcgorCQkgKiB0aGUgcmVzdWx0ICovCisJCWNkZl9tZW1fZnJlZShzYXBfY3R4LT5jaGFubmVsTGlzdCk7CisJCXNhcF9jdHgtPmNoYW5uZWxMaXN0ID0gTlVMTDsKKwl9CisjZW5kaWYKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiSW4gJXMsIENoYW5uZWwgc2VsZWN0ZWQgPSAlZCIsIF9fZnVuY19fLAorCQkgIHNhcF9jdHgtPmNoYW5uZWwpOworCisJLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisJc2FwRXZlbnQuZXZlbnQgPSBldmVudDsKKwkvKiBwQ3NyUm9hbUluZm87ICovCisJc2FwRXZlbnQucGFyYW1zID0gMDsKKwkvKiByb2Ftc3RhdHVzICovCisJc2FwRXZlbnQudTEgPSBzY2FuX3N0YXR1czsKKwkvKiByb2FtUmVzdWx0ICovCisJc2FwRXZlbnQudTIgPSAwOworCisJLyogSGFuZGxlIGV2ZW50ICovCisJc2FwX3NtX3N0YXR1cyA9IHNhcF9mc20oc2FwX2N0eCwgJnNhcEV2ZW50KTsKKworCXJldHVybiBzYXBfc21fc3RhdHVzOworfSAvKiB3bGFuc2FwX3NjYW5fY2FsbGJhY2sgKi8KKworCisvKioKKyAqIHNhcF9jb25maWdfYWNzX3Jlc3VsdCA6IEdlbmVyYXRlIEFDUyByZXN1bHQgcGFyYW1zIGJhc2VkIG9uIGNoIGNvbnN0cmFpbnRzCisgKiBAc2FwX2N0eDogcG9pbnRlciB0byBTQVAgY29udGV4dCBkYXRhIHN0cnVjdAorICogQGhhbDogSEFMIEhhbmRsZSBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBBQ1MgcmVzdWx0IHBhcmFtczogaHQgc2VjIGNoYW5uZWwsIHZodCBjaGFubmVsCisgKiBpbmZvcm1hdGlvbiBhbmQgY2hhbm5lbCBib25kaW5nIGJhc2VkIG9uIHNlbGVjdGVkIEFDUyBjaGFubmVsLgorICoKKyAqIFJldHVybjogTm9uZQorICovCisKK3ZvaWQgc2FwX2NvbmZpZ19hY3NfcmVzdWx0KHRIYWxIYW5kbGUgaGFsLCBwdFNhcENvbnRleHQgc2FwX2N0eCwKKwkJCQkJCQl1aW50MzJfdCBzZWNfY2gpCit7CisJdWludDMyX3QgY2hhbm5lbCA9IHNhcF9jdHgtPmFjc19jZmctPnByaV9jaDsKKwljaGFuX3BhcmFtc190IGNoX3BhcmFtcyA9IHswfTsKKworCWNoX3BhcmFtcy5jaF93aWR0aCA9IHNhcF9jdHgtPmFjc19jZmctPmNoX3dpZHRoOworCXNtZV9zZXRfY2hfcGFyYW1zKGhhbCwgc2FwX2N0eC0+Y3NyX3JvYW1Qcm9maWxlLnBoeU1vZGUsIGNoYW5uZWwsCisJCQkJc2VjX2NoLCAmY2hfcGFyYW1zKTsKKworCXNhcF9jdHgtPmFjc19jZmctPmNoX3dpZHRoID0gY2hfcGFyYW1zLmNoX3dpZHRoOworCWlmIChzYXBfY3R4LT5hY3NfY2ZnLT5jaF93aWR0aCA+IENIX1dJRFRIXzQwTUhaKQorCQlzYXBfY3R4LT5hY3NfY2ZnLT52aHRfc2VnMF9jZW50ZXJfY2ggPQorCQkJCQkJY2hfcGFyYW1zLmNlbnRlcl9mcmVxX3NlZzA7CisJZWxzZQorCQlzYXBfY3R4LT5hY3NfY2ZnLT52aHRfc2VnMF9jZW50ZXJfY2ggPSAwOworCisJaWYgKHNhcF9jdHgtPmFjc19jZmctPmNoX3dpZHRoID09IENIX1dJRFRIXzgwUDgwTUhaKQorCQlzYXBfY3R4LT5hY3NfY2ZnLT52aHRfc2VnMV9jZW50ZXJfY2ggPQorCQkJCQkJY2hfcGFyYW1zLmNlbnRlcl9mcmVxX3NlZzE7CisJZWxzZQorCQlzYXBfY3R4LT5hY3NfY2ZnLT52aHRfc2VnMV9jZW50ZXJfY2ggPSAwOworCisJaWYgKGNoX3BhcmFtcy5zZWNfY2hfb2Zmc2V0ID09IFBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlkpCisJCXNhcF9jdHgtPmFjc19jZmctPmh0X3NlY19jaCA9IHNhcF9jdHgtPmFjc19jZmctPnByaV9jaCAtIDQ7CisJZWxzZSBpZiAoY2hfcGFyYW1zLnNlY19jaF9vZmZzZXQgPT0gUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZKQorCQlzYXBfY3R4LT5hY3NfY2ZnLT5odF9zZWNfY2ggPSBzYXBfY3R4LT5hY3NfY2ZnLT5wcmlfY2ggKyA0OworCWVsc2UKKwkJc2FwX2N0eC0+YWNzX2NmZy0+aHRfc2VjX2NoID0gMDsKK30KKworLyoqCisgKiBzYXBfaGRkX3NpZ25hbF9ldmVudF9oYW5kbGVyKCkgLSByb3V0aW5lIHRvIGluZm9ybSBob3N0YXBkIHZpYSBjYWxsYmFjaworICoKKyAqIGN0eDogcG9pbnRlciB0byBzYXAgY29udGV4dCB3aGljaCB3YXMgcGFzc2VkIHRvIGNhbGxiYWNrCisgKgorICogdGhpcyByb3V0aW5lIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyBjYWxsYmFjayB0byBzbWVfY2xvc2Vfc2Vzc2lvbiwgc28gdXBvbgorICogY2xvc3VyZSBvZiBzYXAgc2Vzc2lvbiBpdCBub3RpZmllcyB0aGUgaG9zdGFwZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitzdGF0aWMgQ0RGX1NUQVRVUyBzYXBfaGRkX3NpZ25hbF9ldmVudF9oYW5kbGVyKHZvaWQgKmN0eCkKK3sKKwlwdFNhcENvbnRleHQgc2FwX2N0eCA9IChzdHJ1Y3Qgc1NhcENvbnRleHQgKiljdHg7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaWYgKE5VTEwgPT0gc2FwX2N0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgic2FwIGNvbnRleHQgaXMgbm90IHZhbGlkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXN0YXR1cyA9IHNhcF9zaWduYWxfaGRkX2V2ZW50KHNhcF9jdHgsIE5VTEwsCisJCQlzYXBfY3R4LT5zYXBfc3RhdGUsCisJCQkodm9pZCAqKSBzYXBfY3R4LT5zYXBfc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqCisgKiB3bGFuc2FwX3ByZV9zdGFydF9ic3NfYWNzX3NjYW5fY2FsbGJhY2soKSAtIGNhbGxiYWNrIGZvciBzY2FuIHJlc3VsdHMKKyAqCisgKiBoYWxfaGFuZGxlOiAgICB0aGUgaGFsX2hhbmRsZSBwYXNzZWQgaW4gd2l0aCB0aGUgc2NhbiByZXF1ZXN0CisgKiBwY29udGV4dDogICAgICB0aGUgc2Vjb25kIGNvbnRleHQgcGFzcyBpbiBmb3IgdGhlIGNhbGxlciwgb3BhcXVlIHNhcCBIYW5kbGUuCisgKiBzY2FuaWQ6ICAgICAgICBzY2FuIGlkIHBhc3NlZAorICogc2Vzc2lvbmlkOiAgICAgc2Vzc2lvbiBpZGVudGlmaWVyCisgKiBzdGF0dXM6ICAgICAgICBzdGF0dXMgb2Ygc2NhbiAtc3VjY2VzcywgZmFpbHVyZSBvciBhYm9ydAorICoKKyAqIEFwaSBmb3Igc2NhbiBjYWxsYmFjay4gVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGFzIGEgcmVzdWx0IG9mIHNjYW4KKyAqIGNvbXBsZXRpb24gYW5kIHJlcG9ydHMgdGhlIHNjYW4gcmVzdWx0cy4KKyAqCisgKiBSZXR1cm46IFRoZSBDREZfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorICovCitDREZfU1RBVFVTCit3bGFuc2FwX3ByZV9zdGFydF9ic3NfYWNzX3NjYW5fY2FsbGJhY2sodEhhbEhhbmRsZSBoYWxfaGFuZGxlLCB2b2lkICpwY29udGV4dCwKKwkJCQkJdWludDhfdCBzZXNzaW9uaWQsIHVpbnQzMl90IHNjYW5pZCwKKwkJCQkJZUNzclNjYW5TdGF0dXMgc2Nhbl9zdGF0dXMpCit7CisJdFNjYW5SZXN1bHRIYW5kbGUgcHJlc3VsdCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzY2FuX2dldF9yZXN1bHRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJcHRTYXBDb250ZXh0IHNhcF9jdHggPSAocHRTYXBDb250ZXh0KXBjb250ZXh0OworCXVpbnQ4X3Qgb3Blcl9jaGFubmVsID0gMDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKGVDU1JfU0NBTl9TVUNDRVNTICE9IHNjYW5fc3RhdHVzKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIkNTUiBzY2FuX3N0YXR1cyA9IGVDU1JfU0NBTl9BQk9SVC9GQUlMVVJFICglZCksIGNob29zZSBkZWZhdWx0IGNoYW5uZWwiKSwKKwkJCXNjYW5fc3RhdHVzKTsKKyNpZmRlZiBTT0ZUQVBfQ0hBTk5FTF9SQU5HRQorCQlpZiAoc2FwX2N0eC0+YWNzX2NmZy0+aHdfbW9kZSA9PSBlQ1NSX0RPVDExX01PREVfMTFhKQorCQkJc2FwX2N0eC0+Y2hhbm5lbCA9IFNBUF9ERUZBVUxUXzVHSFpfQ0hBTk5FTDsKKwkJZWxzZQorCQkJc2FwX2N0eC0+Y2hhbm5lbCA9IFNBUF9ERUZBVUxUXzI0R0haX0NIQU5ORUw7CisjZWxzZQorCQlzYXBfY3R4LT5jaGFubmVsID0gU0FQX0RFRkFVTFRfMjRHSFpfQ0hBTk5FTDsKKyNlbmRpZgorCQlzYXBfY3R4LT5zYXBfc3RhdGUgPSBlU0FQX0FDU19DSEFOTkVMX1NFTEVDVEVEOworCQlzYXBfY3R4LT5zYXBfc3RhdHVzID0gZVNBUF9TVEFUVVNfU1VDQ0VTUzsKKwkJZ290byBjbG9zZV9zZXNzaW9uOworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCUZMKCJDU1Igc2Nhbl9zdGF0dXMgPSBlQ1NSX1NDQU5fU1VDQ0VTUyAoJWQpIiksIHNjYW5fc3RhdHVzKTsKKwkvKgorCSogTm93IGRvCisJKiAxLiBHZXQgc2NhbiByZXN1bHRzCisJKiAyLiBSdW4gY2hhbm5lbCBzZWxlY3Rpb24gYWxnb3JpdGhtCisJKiBzZWxlY3QgY2hhbm5lbCBhbmQgc3RvcmUgaW4gcFNhcENvbnRleHQtPkNoYW5uZWwKKwkqLworCXNjYW5fZ2V0X3Jlc3VsdF9zdGF0dXMgPSBzbWVfc2Nhbl9nZXRfcmVzdWx0KGhhbF9oYW5kbGUsCisJCQkJCXNhcF9jdHgtPnNlc3Npb25JZCwKKwkJCQkJTlVMTCwgJnByZXN1bHQpOworCWlmICgoc2Nhbl9nZXRfcmVzdWx0X3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpICYmCisJCShzY2FuX2dldF9yZXN1bHRfc3RhdHVzICE9IENERl9TVEFUVVNfRV9OVUxMX1ZBTFVFKSkgeworCQkvKgorCQkqIE5vIHNjYW4gcmVzdWx0cyBTbywgc2V0IHRoZSBvcGVyYXRpb24gY2hhbm5lbCBub3Qgc2VsZWN0ZWQKKwkJKiB0byBhbGxvdyB0aGUgZGVmYXVsdCBjaGFubmVsIHRvIGJlIHNldCB3aGVuIHJlcG9ydGluZyB0byBIREQKKwkJKi8KKwkJb3Blcl9jaGFubmVsID0gU0FQX0NIQU5ORUxfTk9UX1NFTEVDVEVEOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCUZMKCJHZXQgc2NhbiByZXN1bHQgZmFpbGVkISByZXQgPSAlZCIpLAorCQlzY2FuX2dldF9yZXN1bHRfc3RhdHVzKTsKKwl9IGVsc2UgeworI2lmZGVmIEZFQVRVUkVfV0xBTl9BUF9BUF9BQ1NfT1BUSU1JWkUKKwkJaWYgKHNjYW5pZCAhPSAwKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJICBGTCgiU2VuZGluZyBBQ1MgU2NhbiBza2lwIGV2ZW50IikpOworCQkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgTlVMTCwKKwkJCQkJICAgICBlU0FQX0FDU19TQ0FOX1NVQ0NFU1NfRVZFTlQsCisJCQkJCSAgICAgKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCX0gZWxzZSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJICBGTCgiQUNTIHNjYW5pZDogJWQgKHNraXBwZWQgQUNTIFNDQU4pIiksCisJCQkJICBzY2FuaWQpOworCQl9CisjZW5kaWYKKwkJb3Blcl9jaGFubmVsID0gc2FwX3NlbGVjdF9jaGFubmVsKGhhbF9oYW5kbGUsIHNhcF9jdHgsIHByZXN1bHQpOworCQlzbWVfc2Nhbl9yZXN1bHRfcHVyZ2UoaGFsX2hhbmRsZSwgcHJlc3VsdCk7CisJfQorCisJaWYgKG9wZXJfY2hhbm5lbCA9PSBTQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQpIHsKKyNpZmRlZiBTT0ZUQVBfQ0hBTk5FTF9SQU5HRQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICBGTCgiTm8gc3VpdGFibGUgY2hhbm5lbCBzZWxlY3RlZCIpKTsKKworCQlzYXBfY3R4LT5zYXBfc3RhdGUgPSBlU0FQX0FDU19DSEFOTkVMX1NFTEVDVEVEOworCQlzYXBfY3R4LT5zYXBfc3RhdHVzID0gZVNBUF9TVEFUVVNfRkFJTFVSRTsKKwkJZ290byBjbG9zZV9zZXNzaW9uOworCX0gZWxzZSB7CisjZWxzZQorCQlzYXBfY3R4LT5jaGFubmVsID0gU0FQX0RFRkFVTFRfMjRHSFpfQ0hBTk5FTDsKKwl9IGVsc2UgeworI2VuZGlmCisJCS8qIFZhbGlkIENoYW5uZWwgRm91bmQgZnJvbSBzY2FuIHJlc3VsdHMuICovCisJCXNhcF9jdHgtPmFjc19jZmctPnByaV9jaCA9IG9wZXJfY2hhbm5lbDsKKwkJc2FwX2N0eC0+Y2hhbm5lbCA9IG9wZXJfY2hhbm5lbDsKKwl9CisJc2FwX2NvbmZpZ19hY3NfcmVzdWx0KGhhbF9oYW5kbGUsIHNhcF9jdHgsCisJCQlzYXBfY3R4LT5hY3NfY2ZnLT5odF9zZWNfY2gpOworCisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKwlpZiAoc2FwX2N0eC0+Y2hhbm5lbExpc3QgIT0gTlVMTCkgeworCQkvKgorCQkqIEFsd2F5cyBmcmVlIHVwIHRoZSBtZW1vcnkgZm9yCisJCSogY2hhbm5lbCBzZWxlY3Rpb24gd2hhdGV2ZXIKKwkJKiB0aGUgcmVzdWx0CisJCSovCisJCWNkZl9tZW1fZnJlZShzYXBfY3R4LT5jaGFubmVsTGlzdCk7CisJCXNhcF9jdHgtPmNoYW5uZWxMaXN0ID0gTlVMTDsKKwl9CisjZW5kaWYKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgRkwoIkNoYW5uZWwgc2VsZWN0ZWQgPSAlZCIpLCBzYXBfY3R4LT5jaGFubmVsKTsKKwlzYXBfY3R4LT5zYXBfc3RhdGUgPSBlU0FQX0FDU19DSEFOTkVMX1NFTEVDVEVEOworCXNhcF9jdHgtPnNhcF9zdGF0dXMgPSBlU0FQX1NUQVRVU19TVUNDRVNTOworY2xvc2Vfc2Vzc2lvbjoKKwlzdGF0dXMgPSBzbWVfY2xvc2Vfc2Vzc2lvbihoYWxfaGFuZGxlLAorCQkJc2FwX2N0eC0+c2Vzc2lvbklkLCBzYXBfaGRkX3NpZ25hbF9ldmVudF9oYW5kbGVyLAorCQkJc2FwX2N0eCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiQ2xvc2VTZXNzaW9uIGZhaWxlZCIpKTsKKwllbHNlCisJCXNhcF9jdHgtPmlzU2NhblNlc3Npb25PcGVuID0gZVNBUF9GQUxTRTsKKwlzYXBfY3R4LT5zZXNzaW9uSWQgPSAweGZmOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogd2xhbnNhcF9yb2FtX3Byb2Nlc3NfY2hfY2hhbmdlX3N1Y2Nlc3MoKSAtIGhhbmRsZXMgdGhlIGNhc2UgZm9yCisgKiBlQ1NSX1JPQU1fUkVTVUxUX0NIQU5ORUxfQ0hBTkdFX1NVQ0NFU1MgaW4gZnVuY3Rpb24gd2xhbnNhcF9yb2FtX2NhbGxiYWNrKCkKKyAqCisgKiBAbWFjX2N0eDogICAgICAgIG1hYyBnbG9iYWwgY29udGV4dAorICogQHNhcF9jdHg6ICAgICAgICBzYXAgY29udGV4dAorICogQGNzcl9yb2FtX2luZm86ICByYW9tIGluZm8gc3RydWN0CisgKiBAcmV0X3N0YXR1czogICAgIHVwZGF0ZSByZXR1cm4gc3RhdHVzCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCit3bGFuc2FwX3JvYW1fcHJvY2Vzc19jaF9jaGFuZ2Vfc3VjY2Vzcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCSAgICAgIHB0U2FwQ29udGV4dCBzYXBfY3R4LAorCQkJCSAgICAgIHRDc3JSb2FtSW5mbyAqY3NyX3JvYW1faW5mbywKKwkJCQkgICAgICBDREZfU1RBVFVTICpyZXRfc3RhdHVzKQoreworCXRXTEFOX1NBUEV2ZW50IHNhcF9ldmVudDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJLyoKKwkgKiBDaGFubmVsIGNoYW5nZSBpcyBzdWNjZXNzZnVsLiBJZiB0aGUgbmV3IGNoYW5uZWwgaXMgYSBERlMgY2hhbm5lbCwKKwkgKiB0aGVuIHdlIHdpbGwgdG8gcGVyZm9ybSBjaGFubmVsIGF2YWlsYWJpbGl0eSBjaGVjayBmb3IgNjAgc2Vjb25kcworCSAqLworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkgIEZMKCJzYXBkZnM6IGNoYW5naW5nIHRhcmdldCBjaGFubmVsIHRvIFslZF0iKSwKKwkJICBtYWNfY3R4LT5zYXAuU2FwRGZzSW5mby50YXJnZXRfY2hhbm5lbCk7CisJc2FwX2N0eC0+Y2hhbm5lbCA9IG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLnRhcmdldF9jaGFubmVsOworCS8qIElkZW50aWZ5IGlmIHRoaXMgaXMgY2hhbm5lbCBjaGFuZ2UgaW4gcmFkYXIgZGV0ZWN0ZWQgc3RhdGUgKi8KKwlpZiAoZVNBUF9ESVNDT05ORUNUSU5HICE9IHNhcF9jdHgtPnNhcHNNYWNoaW5lKQorCQlyZXR1cm47CisKKwkvKiBjaGVjayBpZiBjdXJyZW50bHkgc2VsZWN0ZWQgY2hhbm5lbCBpcyBhIERGUyBjaGFubmVsICovCisJaWYgKENIQU5ORUxfU1RBVEVfREZTID09IGNkc19nZXRfY2hhbm5lbF9zdGF0ZShzYXBfY3R4LT5jaGFubmVsKSkgeworCQlpZiAoKGZhbHNlID09IG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLmlnbm9yZV9jYWMpCisJCSAgICAmJiAoZVNBUF9ERlNfRE9fTk9UX1NLSVBfQ0FDID09CisJCQltYWNfY3R4LT5zYXAuU2FwRGZzSW5mby5jYWNfc3RhdGUpKSB7CisJCQlzYXBfY3R4LT5zYXBzTWFjaGluZSA9IGVTQVBfRElTQ09OTkVDVEVEOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkJICBGTCgic2FwZGZzOiBmcm9tIHN0YXRlIGVTQVBfRElTQ09OTkVDVElORyA9PiBESVNDT05ORUNURUQgd2l0aCBpZ25vcmUgY2FjIGZhbHNlIG9uIHNhcGN0eFslcF0iKSwKKwkJCQkgIHNhcF9jdHgpOworCQkJLyogREZTIENoYW5uZWwgKi8KKwkJCXNhcF9ldmVudC5ldmVudCA9IGVTQVBfREZTX0NIQU5ORUxfQ0FDX1NUQVJUOworCQkJc2FwX2V2ZW50LnBhcmFtcyA9IGNzcl9yb2FtX2luZm87CisJCQlzYXBfZXZlbnQudTEgPSAwOworCQkJc2FwX2V2ZW50LnUyID0gMDsKKwkJfSBlbHNlIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCQkgIEZMKCJzYXBkZnM6IGZyb20gc3RhdGUgZVNBUF9ESVNDT05ORUNUSU5HID0+IGVTQVBfU1RBUlRJTkcgd2l0aCBpZ25vcmUgY2FjIHRydWUgb24gc2FwY3R4WyVwXSIpLAorCQkJCSAgc2FwX2N0eCk7CisKKwkJCS8qIFN0YXJ0IGJlYWNvbmluZyBvbiB0aGUgbmV3IGNoYW5uZWwgKi8KKwkJCXdsYW5zYXBfc3RhcnRfYmVhY29uX3JlcShzYXBfY3R4KTsKKwkJCXNhcF9jdHgtPnNhcHNNYWNoaW5lID0gZVNBUF9TVEFSVElORzsKKwkJCW1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLnNhcF9yYWRhcl9mb3VuZF9zdGF0dXMgPSBmYWxzZTsKKwkJCXNhcF9ldmVudC5ldmVudCA9IGVTQVBfTUFDX1NUQVJUX0JTU19TVUNDRVNTOworCQkJc2FwX2V2ZW50LnBhcmFtcyA9IGNzcl9yb2FtX2luZm87CisJCQlzYXBfZXZlbnQudTEgPSBlQ1NSX1JPQU1fSU5GUkFfSU5EOworCQkJc2FwX2V2ZW50LnUyID0gZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9TVEFSVEVEOworCQl9CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkgIEZMKCJzYXBkZnM6IGZyb20gc3RhdGUgZVNBUF9ESVNDT05ORUNUSU5HID0+IGVTQVBfU1RBUlRJTkcgb24gc2FwY3R4WyVwXSIpLAorCQkJICBzYXBfY3R4KTsKKwkJLyogbm9uLURGUyBjaGFubmVsICovCisJCXNhcF9jdHgtPnNhcHNNYWNoaW5lID0gZVNBUF9TVEFSVElORzsKKwkJbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uc2FwX3JhZGFyX2ZvdW5kX3N0YXR1cyA9IGZhbHNlOworCQlzYXBfZXZlbnQuZXZlbnQgPSBlU0FQX01BQ19TVEFSVF9CU1NfU1VDQ0VTUzsKKwkJc2FwX2V2ZW50LnBhcmFtcyA9IGNzcl9yb2FtX2luZm87CisJCXNhcF9ldmVudC51MSA9IGVDU1JfUk9BTV9JTkZSQV9JTkQ7CisJCXNhcF9ldmVudC51MiA9IGVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfU1RBUlRFRDsKKwl9CisKKwkvKiBIYW5kbGUgdGhlIGV2ZW50ICovCisJY2RmX3N0YXR1cyA9IHNhcF9mc20oc2FwX2N0eCwgJnNhcF9ldmVudCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCSpyZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKy8qKgorICogd2xhbnNhcF9yb2FtX3Byb2Nlc3NfZGZzX2NoYW5zd191cGRhdGVfZmFpbCgpIC0gaGFuZGxlcyB0aGUgY2FzZSBmb3IKKyAqIGVDU1JfUk9BTV9SRVNVTFRfREZTX0NIQU5TV19VUERBVEVfRkFJTFVSRSBpbiB3bGFuc2FwX3JvYW1fY2FsbGJhY2soKQorICoKKyAqIEBoYWw6ICAgICAgICAgICBoYWwgZ2xvYmFsIGNvbnRleHQKKyAqIEBzYXBfY3R4OiAgICAgICBzYXAgY29udGV4dAorICogQHJldF9zdGF0dXM6ICAgIHVwZGF0ZSByZXR1cm4gc3RhdHVzCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCit3bGFuc2FwX3JvYW1fcHJvY2Vzc19kZnNfY2hhbnN3X3VwZGF0ZV9mYWlsKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJICAgIHB0U2FwQ29udGV4dCBzYXBfY3R4LAorCQkJCQkgICAgQ0RGX1NUQVRVUyAqcmV0X3N0YXR1cykKK3sKKwl0V0xBTl9TQVBFdmVudCBzYXBfZXZlbnQ7CisJdWludDhfdCBpbnRmOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJZUNzclBoeU1vZGUgcGh5X21vZGUgPSBzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUucGh5TW9kZTsKKwl1aW50OF90IGRmc19iZWFjb25fc3RhcnRfcmVxID0gMDsKKworCWlmIChzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUuZGlzYWJsZURGU0NoU3dpdGNoKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgic2FwZGZzOiBERlMgY2hhbm5lbCBzd2l0Y2ggZGlzYWJsZWQiKSk7CisJCS8qCisJCSAqIFNlbmQgYSBiZWFjb24gc3RhcnQgcmVxdWVzdCB0byBQRS4gQ1NBIElFIHJlcXVpcmVkIGZsYWcgZnJvbQorCQkgKiBiZWFjb24gdGVtcGxhdGUgd2lsbCBiZSBjbGVhcmVkIGJ5IG5vdy4gQSBuZXcgYmVhY29uIHRlbXBsYXRlCisJCSAqIHdpdGggbm8gQ1NBIElFIHdpbGwgYmUgc2VudCB0byBmaXJtd2FyZS4KKwkJICovCisJCWRmc19iZWFjb25fc3RhcnRfcmVxID0gZVNBUF9UUlVFOworCQkqcmV0X3N0YXR1cyA9IHNtZV9yb2FtX3N0YXJ0X2JlYWNvbl9yZXEoaEhhbCwgc2FwX2N0eC0+YnNzaWQsCisJCQkJCQkJZGZzX2JlYWNvbl9zdGFydF9yZXEpOworCQlyZXR1cm47CisJfQorCS8qCisJICogQm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlIGNhc2VzIGFyZSBoYW5kbGVkIGludGVudGlvbmFsbHkgaGFuZGxlZAorCSAqIHRvZ2V0aGVyLiBJcnJlc3BlY3RpdmUgb2Ygd2hldGhlciB0aGUgY2hhbm5lbCBzd2l0Y2ggSUUgd2FzIHNlbnQgb3V0CisJICogc3VjY2Vzc2Z1bGx5IG9yIG5vdCwgU0FQIHNob3VsZCBzdGlsbCB2YWNhdGUgdGhlIGNoYW5uZWwgaW1tZWRpYXRlbHkKKwkgKi8KKwlpZiAoZVNBUF9TVEFSVEVEICE9IHNhcF9jdHgtPnNhcHNNYWNoaW5lKSB7CisJCS8qIEZ1cnRoZXIgYWN0aW9ucyB0byBiZSB0YWtlbiBoZXJlICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkgIEZMKCJlQ1NSX1JPQU1fUkVTVUxUX0RGU19SQURBUl9GT1VORF9JTkQgcmVjZWl2ZWQgaW4gKCVkKSBzdGF0ZVxuIiksCisJCQkgIHNhcF9jdHgtPnNhcHNNYWNoaW5lKTsKKwkJcmV0dXJuOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkgIEZMKCJzYXBkZnM6IGZyb20gc3RhdGUgZVNBUF9TVEFSVEVEID0+IGVTQVBfRElTQ09OTkVDVElORyIpKTsKKwkvKiBTQVAgdG8gYmUgbW92ZWQgdG8gRElTQ09OTkVDVElORyBzdGF0ZSAqLworCXNhcF9jdHgtPnNhcHNNYWNoaW5lID0gZVNBUF9ESVNDT05ORUNUSU5HOworCS8qCisJICogVGhlIGFzc29jaWF0ZWQgc3RhdGlvbnMgaGF2ZSBiZWVuIGluZm9ybWVkIHRvIG1vdmUgdG8gYSBkaWZmZXJlbnQKKwkgKiBjaGFubmVsLiBIb3dldmVyLCB0aGUgQVAgbWF5IG5vdCBhbHdheXMgc2VsZWN0IHRoZSBhZHZlcnRpc2VkIGNoYW5uZWwKKwkgKiBmb3Igb3BlcmF0aW9uIGlmIHRoZSByYWRhciBpcyBzZWVuLiBJbiB0aGF0IGNhc2UsIHRoZSBzdGF0aW9ucyB3aWxsCisJICogZXhwZXJpZW5jZSBsaW5rLWxvc3MgYW5kIHJldHVybiBiYWNrIHRocm91Z2ggc2Nhbm5pbmcgaWYgdGhleSB3aXNoIHRvCisJICovCisKKwkvKgorCSAqIFNlbmQgY2hhbm5lbCBjaGFuZ2UgcmVxdWVzdC4gRnJvbSBzcGVjIGl0IGlzIHJlcXVpcmVkIHRoYXQgdGhlIEFQCisJICogc2hvdWxkIGNvbnRpbnVlIHRvIG9wZXJhdGUgaW4gdGhlIHNhbWUgbW9kZSBhcyBpdCBpcyBvcGVyYXRpbmcKKwkgKiBjdXJyZW50bHkuIEZvciBlLmcuIDIwLzQwLzgwIE1IeiBvcGVyYXRpb24KKwkgKi8KKwlpZiAobWFjX2N0eC0+c2FwLlNhcERmc0luZm8udGFyZ2V0X2NoYW5uZWwpCisJCXNtZV9zZXRfY2hfcGFyYW1zKGhIYWwsIHBoeV9tb2RlLAorCQkJCSAgbWFjX2N0eC0+c2FwLlNhcERmc0luZm8udGFyZ2V0X2NoYW5uZWwsIDAsCisJCQkJICAmc2FwX2N0eC0+Y2hfcGFyYW1zKTsKKwkvKgorCSAqIEZldGNoIHRoZSBudW1iZXIgb2YgU0FQIGludGVyZmFjZXMuIElmIHRoZSBudW1iZXIgb2Ygc2FwIEludGVyZmFjZQorCSAqIG1vcmUgdGhhbiBvbmUgdGhlbiB3ZSB3aWxsIG1ha2UgaXNfc2FwX3JlYWR5X2Zvcl9jaG5sX2NobmcgdG8gdHJ1ZQorCSAqIGZvciB0aGF0IHNhcGN0eC4gSWYgdGhlcmUgaXMgb25seSBvbmUgU0FQIGludGVyZmFjZSB0aGVuIHByb2Nlc3MKKwkgKiBpbW1lZGlhdGVseQorCSAqLworCWlmIChzYXBfZ2V0X3RvdGFsX251bWJlcl9zYXBfaW50ZihoSGFsKSA8PSAxKSB7CisJCS8qIFNlbmQgY2hhbm5lbCBzd2l0Y2ggcmVxdWVzdCAqLworCQlzYXBfZXZlbnQuZXZlbnQgPSBlV05JX1NNRV9DSEFOTkVMX0NIQU5HRV9SRVE7CisJCXNhcF9ldmVudC5wYXJhbXMgPSAwOworCQlzYXBfZXZlbnQudTEgPSAwOworCQlzYXBfZXZlbnQudTIgPSAwOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgRkwoInNhcGRmczogUG9zdGluZyBldmVudCBlV05JX1NNRV9DSEFOTkVMX0NIQU5HRV9SRVEgdG8gc2FwRlNNIikpOworCQkvKiBIYW5kbGUgZXZlbnQgKi8KKwkJY2RmX3N0YXR1cyA9IHNhcF9mc20oc2FwX2N0eCwgJnNhcF9ldmVudCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJKnJldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJcmV0dXJuOworCX0KKworCXNhcF9jdHgtPmlzX3NhcF9yZWFkeV9mb3JfY2hubF9jaG5nID0gdHJ1ZTsKKwkvKgorCSAqIG5vdyBjaGVjayBpZiB0aGUgY29uLWN1cnJlbnQgc2FwIGludGVyZmFjZSBpcyByZWFkeQorCSAqIGZvciBjaGFubmVsIGNoYW5nZS4gSWYgeWVzIHRoZW4gd2UgaXNzdWUgY2hhbm5lbCBjaGFuZ2UgZm9yCisJICogYm90aCB0aGUgU0FQcy4gSWYgbm8gdGhlbiBzaW1wbHkgcmV0dXJuIHN1Y2Nlc3MgJiB3ZSB3aWxsCisJICogaXNzdWUgY2hhbm5lbCBjaGFuZ2Ugd2hlbiBzZWNvbmQgQVAncyA1IENTQSBiZWFjb24gVHggaXMKKwkgKiBjb21wbGV0ZWQuCisJICovCisJaWYgKGZhbHNlID09CisJICAgIGlzX2NvbmN1cnJlbnRfc2FwX3JlYWR5X2Zvcl9jaGFubmVsX2NoYW5nZShoSGFsLCBzYXBfY3R4KSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgRkwoInNhcGRmczogc2FwY3R4WyVwXSByZWFkeSBidXQgbm90IGNvbmN1cnJlbnQgc2FwIiksCisJCQkgIHNhcF9jdHgpOworCQkqcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJcmV0dXJuOworCX0KKworCS8qIElzc3VlIGNoYW5uZWwgY2hhbmdlIHJlcSBmb3IgZWFjaCBzYXBjdHggKi8KKwlmb3IgKGludGYgPSAwOyBpbnRmIDwgU0FQX01BWF9OVU1fU0VTU0lPTjsgaW50ZisrKSB7CisJCXB0U2FwQ29udGV4dCBwU2FwQ29udGV4dDsKKwkJaWYgKCEoKENERl9TQVBfTU9ERSA9PSBtYWNfY3R4LT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5zYXBQZXJzb25hKQorCQkgICAgJiYgKG1hY19jdHgtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnBTYXBDb250ZXh0ICE9IE5VTEwpKSkKKwkJCWNvbnRpbnVlOworCisJCXBTYXBDb250ZXh0ID0gbWFjX2N0eC0+c2FwLnNhcEN0eExpc3RbaW50Zl0ucFNhcENvbnRleHQ7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJICBGTCgic2FwZGZzOmlzc3VlIGNobmwgY2hhbmdlIGZvciBzYXBjdHhbJXBdIiksCisJCQkgIHBTYXBDb250ZXh0KTsKKwkJLyogU2VuZCBjaGFubmVsIHN3aXRjaCByZXF1ZXN0ICovCisJCXNhcF9ldmVudC5ldmVudCA9IGVXTklfU01FX0NIQU5ORUxfQ0hBTkdFX1JFUTsKKwkJc2FwX2V2ZW50LnBhcmFtcyA9IDA7CisJCXNhcF9ldmVudC51MSA9IDA7CisJCXNhcF9ldmVudC51MiA9IDA7CisJCS8qIEhhbmRsZSBldmVudCAqLworCQljZGZfc3RhdHVzID0gc2FwX2ZzbShwU2FwQ29udGV4dCwgJnNhcF9ldmVudCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgIEZMKCJwb3N0IGNobmwgY2huZyByZXEgZmFpbGVkLCBzYXBbJXBdIiksCisJCQkJICBzYXBfY3R4KTsKKwkJCSpyZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0gZWxzZSB7CisJCQlwU2FwQ29udGV4dC0+aXNfc2FwX3JlYWR5X2Zvcl9jaG5sX2NobmcgPSBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogd2xhbnNhcF9yb2FtX3Byb2Nlc3NfZGZzX3JhZGFyX2ZvdW5kKCkgLSBoYW5kbGVzIHRoZSBjYXNlIGZvcgorICogZUNTUl9ST0FNX1JFU1VMVF9ERlNfUkFEQVJfRk9VTkRfSU5EIGluIHdsYW5zYXBfcm9hbV9jYWxsYmFjaygpCisgKgorICogQG1hY19jdHg6ICAgICAgIG1hYyBnbG9iYWwgY29udGV4dAorICogQHNhcF9jdHg6ICAgICAgIHNhcCBjb250ZXh0CisgKiBAcmV0X3N0YXR1czogICAgdXBkYXRlIHJldHVybiBzdGF0dXMKKyAqCisgKiBSZXR1cm46IHJlc3VsdCBvZiBvcGVyYXRpb24KKyAqLworc3RhdGljIHZvaWQKK3dsYW5zYXBfcm9hbV9wcm9jZXNzX2Rmc19yYWRhcl9mb3VuZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCSAgICAgcHRTYXBDb250ZXh0IHNhcF9jdHgsCisJCQkJICAgICBDREZfU1RBVFVTICpyZXRfc3RhdHVzKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl0V0xBTl9TQVBFdmVudCBzYXBfZXZlbnQ7CisJaWYgKGVTQVBfREZTX0NBQ19XQUlUID09IHNhcF9jdHgtPnNhcHNNYWNoaW5lKSB7CisJCWlmIChzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUuZGlzYWJsZURGU0NoU3dpdGNoKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSJzYXBkZnM6IERGUyBjaGFubmVsIHN3aXRjaCBkaXNhYmxlZCIpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChmYWxzZSA9PSBtYWNfY3R4LT5zYXAuU2FwRGZzSW5mby5zYXBfcmFkYXJfZm91bmRfc3RhdHVzKQorCQkJcmV0dXJuOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgRkwoInNhcGRmczpQb3N0aW5nIGV2ZW50IGVTQVBfREZTX0NIQU5ORUxfQ0FDX1JBREFSX0ZPVU5EIikpOworCQkvKgorCQkgKiBJZiBSYWRhciBpcyBmb3VuZCwgd2hpbGUgaW4gREZTIENBQyBXQUlUIFN0YXRlIHRoZW4gcG9zdCBzdG9wCisJCSAqIGFuZCBkZXN0cm95IHRoZSBDQUMgdGltZXIgYW5kIHBvc3QgYQorCQkgKiBlU0FQX0RGU19DSEFOTkVMX0NBQ19SQURBUl9GT1VORCAgdG8gc2FwRnNtLgorCQkgKi8KKwkJY2RmX21jX3RpbWVyX3N0b3AoJm1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLnNhcF9kZnNfY2FjX3RpbWVyKTsKKwkJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJm1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLnNhcF9kZnNfY2FjX3RpbWVyKTsKKworCQkvKgorCQkgKiBVc2VyIHNwYWNlIGlzIGFscmVhZHkgaW5kaWNhdGVkIHRoZSBDQUMgc3RhcnQgYW5kIGlmCisJCSAqIENBQyBlbmQgb24gdGhpcyBjaGFubmVsIGlzIG5vdCBpbmRpY2F0ZWQsIHRoZSB1c2VyCisJCSAqIHNwYWNlIHdpbGwgYmUgaW4gc29tZSB1bmRlZmluZWQgc3RhdGUgKGUuZy4sIFVJIGZyb3plbikKKwkJICovCisJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBOVUxMLAorCQkJCWVTQVBfREZTX0NBQ19JTlRFUlJVUFRFRCwKKwkJCQkodm9pZCAqKSBlU0FQX1NUQVRVU19TVUNDRVNTKTsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfc3RhdHVzKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgiRmFpbGVkIHRvIHNlbmQgQ0FDIGVuZCIpKTsKKwkJCS8qIFdhbnQgdG8gc3RpbGwgcHJvY2VlZCBhbmQgdHJ5IHRvIHN3aXRjaCBjaGFubmVsLgorCQkJICogTGV0cyB0cnkgbm90IHRvIGJlIG9uIHRoZSBERlMgY2hhbm5lbAorCQkJICovCisJCX0KKworCQltYWNfY3R4LT5zYXAuU2FwRGZzSW5mby5pc19kZnNfY2FjX3RpbWVyX3J1bm5pbmcgPSAwOworCQlzYXBfZXZlbnQuZXZlbnQgPSBlU0FQX0RGU19DSEFOTkVMX0NBQ19SQURBUl9GT1VORDsKKwkJc2FwX2V2ZW50LnBhcmFtcyA9IDA7CisJCXNhcF9ldmVudC51MSA9IDA7CisJCXNhcF9ldmVudC51MiA9IDA7CisJCWNkZl9zdGF0dXMgPSBzYXBfZnNtKHNhcF9jdHgsICZzYXBfZXZlbnQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCSpyZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCXJldHVybjsKKwl9CisJaWYgKGVTQVBfU1RBUlRFRCA9PSBzYXBfY3R4LT5zYXBzTWFjaGluZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgRkwoInNhcGRmczpQb3N0aW5nIGV2ZW50IGVTQVBfREZTX0NITkxfU1dJVENIX0FOTk9VTkNFTUVOVF9TVEFSVCIpKTsKKworCQkvKgorCQkgKiBSYWRhciBmb3VuZCBvbiB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgaW4gU1RBUlRFRCBzdGF0ZSwKKwkJICogbmV3IG9wZXJhdGluZyBjaGFubmVsIGhhcyBhbHJlYWR5IGJlZW4gc2VsZWN0ZWQuIFNlbmQKKwkJICogcmVxdWVzdCB0byBTTUUtLT5QRSBmb3Igc2VuZGluZyBDU0EgSUUKKwkJICovCisJCXNhcF9ldmVudC5ldmVudCA9IGVTQVBfREZTX0NITkxfU1dJVENIX0FOTk9VTkNFTUVOVF9TVEFSVDsKKwkJc2FwX2V2ZW50LnBhcmFtcyA9IDA7CisJCXNhcF9ldmVudC51MSA9IDA7CisJCXNhcF9ldmVudC51MiA9IDA7CisJCWNkZl9zdGF0dXMgPSBzYXBfZnNtKHNhcF9jdHgsICZzYXBfZXZlbnQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCSpyZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCXJldHVybjsKKwl9CisJLyogRnVydGhlciBhY3Rpb25zIHRvIGJlIHRha2VuIGhlcmUgKi8KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICBGTCgiZUNTUl9ST0FNX1JFU1VMVF9ERlNfUkFEQVJfRk9VTkRfSU5EIHJlY2VpdmVkIGluICglZCkgc3RhdGVcbiIpLAorCQkgIHNhcF9jdHgtPnNhcHNNYWNoaW5lKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiB3bGFuc2FwX3JvYW1fcHJvY2Vzc19pbmZyYV9hc3NvY19pbmQoKSAtIGhhbmRsZXMgdGhlIGNhc2UgZm9yCisgKiBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0FTU09DSUFUSU9OX0lORCBpbiB3bGFuc2FwX3JvYW1fY2FsbGJhY2soKQorICoKKyAqIEBzYXBfY3R4OiAgICAgICBzYXAgY29udGV4dAorICogQHJvYW1fcmVzdWx0OiAgIHJvYW0gcmVzdWx0CisgKiBAY3NyX3JvYW1faW5mbzogcm9hbSBpbmZvIHN0cnVjdAorICogQHJldF9zdGF0dXM6ICAgIHVwZGF0ZSByZXR1cm4gc3RhdHVzCisgKgorICogUmV0dXJuOiByZXN1bHQgb2Ygb3BlcmF0aW9uCisgKi8KK3N0YXRpYyB2b2lkCit3bGFuc2FwX3JvYW1fcHJvY2Vzc19pbmZyYV9hc3NvY19pbmQocHRTYXBDb250ZXh0IHNhcF9jdHgsCisJCQkJICAgICBlQ3NyUm9hbVJlc3VsdCByb2FtX3Jlc3VsdCwKKwkJCQkgICAgIHRDc3JSb2FtSW5mbyAqY3NyX3JvYW1faW5mbywKKwkJCQkgICAgIENERl9TVEFUVVMgKnJldF9zdGF0dXMpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICBGTCgiQ1NSIHJvYW1fcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9BU1NPQ0lBVElPTl9JTkQgKCVkKVxuIiksCisJCSAgcm9hbV9yZXN1bHQpOworCXNhcF9jdHgtPm5TdGFXUEFSU25SZXFJZUxlbmd0aCA9IGNzcl9yb2FtX2luZm8tPnJzbklFTGVuOworCWlmIChzYXBfY3R4LT5uU3RhV1BBUlNuUmVxSWVMZW5ndGgpCisJCWNkZl9tZW1fY29weShzYXBfY3R4LT5wU3RhV3BhUnNuUmVxSUUsIGNzcl9yb2FtX2luZm8tPnByc25JRSwKKwkJCSAgICAgc2FwX2N0eC0+blN0YVdQQVJTblJlcUllTGVuZ3RoKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCXNhcF9jdHgtPm5TdGFXQVBJUmVxSWVMZW5ndGggPSBjc3Jfcm9hbV9pbmZvLT53YXBpSUVMZW47CisJaWYgKHNhcF9jdHgtPm5TdGFXQVBJUmVxSWVMZW5ndGgpCisJCWNkZl9tZW1fY29weShzYXBfY3R4LT5wU3RhV2FwaVJlcUlFLCBjc3Jfcm9hbV9pbmZvLT5wd2FwaUlFLAorCQkJICAgICBzYXBfY3R4LT5uU3RhV0FQSVJlcUllTGVuZ3RoKTsKKyNlbmRpZgorCXNhcF9jdHgtPm5TdGFBZGRJZUxlbmd0aCA9IGNzcl9yb2FtX2luZm8tPmFkZElFTGVuOworCWlmIChzYXBfY3R4LT5uU3RhQWRkSWVMZW5ndGgpCisJCWNkZl9tZW1fY29weShzYXBfY3R4LT5wU3RhQWRkSUUsIGNzcl9yb2FtX2luZm8tPnBhZGRJRSwKKwkJCSAgICAgc2FwX2N0eC0+blN0YUFkZEllTGVuZ3RoKTsKKwlzYXBfY3R4LT5TYXBRb3NDZmcuV21tSXNFbmFibGVkID0gY3NyX3JvYW1faW5mby0+d21tRW5hYmxlZFN0YTsKKwkvKiBNQUMgZmlsdGVyaW5nICovCisJY2RmX3N0YXR1cyA9IHNhcF9pc19wZWVyX21hY19hbGxvd2VkKHNhcF9jdHgsCisJCQkJICAgICAodWludDhfdCAqKSBjc3Jfcm9hbV9pbmZvLT5wZWVyTWFjLmJ5dGVzKTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gY2RmX3N0YXR1cykgeworCQljZGZfc3RhdHVzID0gc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwKKwkJCQljc3Jfcm9hbV9pbmZvLCBlU0FQX1NUQV9BU1NPQ19JTkQsCisJCQkJKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgIEZMKCJDU1Igcm9hbV9yZXN1bHQgPSAoJWQpIE1BQyAoIk1BQ19BRERSRVNTX1NUUiIpIGZhaWwiKSwKKwkJCQkgIHJvYW1fcmVzdWx0LCBNQUNfQUREUl9BUlJBWSgKKwkJCQkJY3NyX3JvYW1faW5mby0+cGVlck1hYy5ieXRlcykpOworCQkqcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSAgRkwoIkNTUiByb2FtX3Jlc3VsdCA9ICglZCkgTUFDICgiTUFDX0FERFJFU1NfU1RSIikgbm90IGFsbG93ZWQiKSwKKwkJCSAgcm9hbV9yZXN1bHQsCisJCQkgIE1BQ19BRERSX0FSUkFZKGNzcl9yb2FtX2luZm8tPnBlZXJNYWMuYnl0ZXMpKTsKKwkJKnJldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIHdsYW5zYXBfcm9hbV9jYWxsYmFjaygpIC0gQ2FsbGJhY2sgZm9yIFJvYW0gKGNvbm5lY3Rpb24gc3RhdHVzKSBFdmVudHMKKyAqIEBjdHggICAgICAgICAgICAgOiBwQ29udGV4dCBwYXNzZWQgaW4gd2l0aCB0aGUgcm9hbSByZXF1ZXN0CisgKiBAY3NyX3JvYW1faW5mbyAgIDogUG9pbnRlciB0byBhIHRDc3JSb2FtSW5mbworICogQHJvYW1JZCAgICAgICAgICA6IHRvIGlkZW50aWZ5IHRoZSBjYWxsYmFjayByZWxhdGVkIHJvYW0gcmVxdWVzdC4KKyAqICAgICAgICAgICAgICAgICAgICAwIG1lYW5zIHVuc29saWNpdAorICogQHJvYW1fc3RhdHVzICAgICA6IEZsYWcgaW5kaWNhdGluZyB0aGUgc3RhdHVzIG9mIHRoZSBjYWxsYmFjaworICogQHJvYW1fcmVzdWx0ICAgICA6IFJlc3VsdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZmluZHMgZG90MTEgbW9kZSBiYXNlZCBvbiBjdXJyZW50IG1vZGUsIG9wZXJhdGluZyBjaGFubmVsIGFuZAorICogZncgc3VwcG9ydGVkIG1vZGVzLgorICoKKyAqIFJldHVybjogU3RhdHVzIG9mIG9wZXJhdGlvbgorICovCitDREZfU1RBVFVTCit3bGFuc2FwX3JvYW1fY2FsbGJhY2sodm9pZCAqY3R4LCB0Q3NyUm9hbUluZm8gKmNzcl9yb2FtX2luZm8sIHVpbnQzMl90IHJvYW1JZCwKKwkJICAgICAgZVJvYW1DbWRTdGF0dXMgcm9hbV9zdGF0dXMsIGVDc3JSb2FtUmVzdWx0IHJvYW1fcmVzdWx0KQoreworCS8qIHNhcF9jdHggdmFsdWUgKi8KKwlwdFNhcENvbnRleHQgc2FwX2N0eCA9IChwdFNhcENvbnRleHQpIGN0eDsKKwkvKiBTdGF0ZSBtYWNoaW5lIGV2ZW50ICovCisJdFdMQU5fU0FQRXZlbnQgc2FwX2V2ZW50OworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRIYWxIYW5kbGUgaGFsID0gQ0RTX0dFVF9IQUxfQ0Ioc2FwX2N0eC0+cF9jZHNfZ2N0eCk7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IE5VTEw7CisJdWludDhfdCBpbnRmOworCisJaWYgKE5VTEwgPT0gaGFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiSW52YWxpZCBoYWwiKSk7CisJCWNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQlyZXR1cm4gY2RmX3JldF9zdGF0dXM7CisJfQorCisJbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgIEZMKCJCZWZvcmUgc3dpdGNoIG9uIHJvYW1fc3RhdHVzID0gJWRcbiIpLCByb2FtX3N0YXR1cyk7CisJc3dpdGNoIChyb2FtX3N0YXR1cykgeworCWNhc2UgZUNTUl9ST0FNX1NFU1NJT05fT1BFTkVEOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJDYWxsaW5nIHNtZV9yb2FtX2Nvbm5lY3Qgd2l0aCBlQ1NSX0JTU19UWVBFX0lORlJBX0FQIikpOworCQlzYXBfY3R4LT5pc1NhcFNlc3Npb25PcGVuID0gZVNBUF9UUlVFOworCQljZGZfcmV0X3N0YXR1cyA9IHNtZV9yb2FtX2Nvbm5lY3QoaGFsLCBzYXBfY3R4LT5zZXNzaW9uSWQsCisJCQkJCQkgICZzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUsCisJCQkJCQkgICZzYXBfY3R4LT5jc3Jfcm9hbUlkKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fSU5GUkFfSU5EOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJDU1Igcm9hbV9zdGF0dXMgPSBlQ1NSX1JPQU1fSU5GUkFfSU5EICglZClcbiIpLAorCQkJICByb2FtX3N0YXR1cyk7CisJCWlmIChyb2FtX3Jlc3VsdCA9PSBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX1NUQVJUX0ZBSUxFRCkgeworCQkJLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisJCQlzYXBfZXZlbnQuZXZlbnQgPSBlU0FQX01BQ19TVEFSVF9GQUlMUzsKKwkJCXNhcF9ldmVudC5wYXJhbXMgPSBjc3Jfcm9hbV9pbmZvOworCQkJc2FwX2V2ZW50LnUxID0gcm9hbV9zdGF0dXM7CisJCQlzYXBfZXZlbnQudTIgPSByb2FtX3Jlc3VsdDsKKwkJCS8qIEhhbmRsZSBldmVudCAqLworCQkJY2RmX3N0YXR1cyA9IHNhcF9mc20oc2FwX2N0eCwgJnNhcF9ldmVudCk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCQljZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCWJyZWFrOworCWNhc2UgZUNTUl9ST0FNX0xPU1RMSU5LOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJDU1Igcm9hbV9zdGF0dXMgPSBlQ1NSX1JPQU1fTE9TVExJTksgKCVkKVxuIiksCisJCQkgIHJvYW1fc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fTUlDX0VSUk9SX0lORDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiQ1NSIHJvYW1fc3RhdHVzID0gZUNTUl9ST0FNX01JQ19FUlJPUl9JTkQgKCVkKVxuIiksCisJCQkgIHJvYW1fc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fU0VUX0tFWV9DT01QTEVURToKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiQ1NSIHJvYW1fc3RhdHVzID0gZUNTUl9ST0FNX1NFVF9LRVlfQ09NUExFVEUgKCVkKVxuIiksCisJCQkgIHJvYW1fc3RhdHVzKTsKKwkJaWYgKHJvYW1fcmVzdWx0ID09IGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSkKKwkJCXNhcF9zaWduYWxfaGRkX2V2ZW50KHNhcF9jdHgsIGNzcl9yb2FtX2luZm8sCisJCQkJCSAgICAgZVNBUF9TVEFfU0VUX0tFWV9FVkVOVCwKKwkJCQkJICAgICAodm9pZCAqKSBlU0FQX1NUQVRVU19GQUlMVVJFKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fQ09NUExFVElPTjoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiQ1NSIHJvYW1fc3RhdHVzID0gZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04gKCVkKVxuIiksCisJCQkgIHJvYW1fc3RhdHVzKTsKKwkJaWYgKHJvYW1fcmVzdWx0ID09IGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSkKKwkJCXNhcF9zaWduYWxfaGRkX2V2ZW50KHNhcF9jdHgsIGNzcl9yb2FtX2luZm8sCisJCQkJCSAgICAgZVNBUF9TVEFfUkVBU1NPQ19FVkVOVCwKKwkJCQkJICAgICAodm9pZCAqKSBlU0FQX1NUQVRVU19GQUlMVVJFKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fRElTQVNTT0NJQVRFRDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiQ1NSIHJvYW1fc3RhdHVzID0gZUNTUl9ST0FNX0RJU0FTU09DSUFURUQgKCVkKVxuIiksCisJCQkgIHJvYW1fc3RhdHVzKTsKKwkJaWYgKHJvYW1fcmVzdWx0ID09IGVDU1JfUk9BTV9SRVNVTFRfTUlDX0ZBSUxVUkUpCisJCQlzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBjc3Jfcm9hbV9pbmZvLAorCQkJCQkgICAgIGVTQVBfU1RBX01JQ19GQUlMVVJFX0VWRU5ULAorCQkJCQkgICAgICh2b2lkICopIGVTQVBfU1RBVFVTX0ZBSUxVUkUpOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9XUFNfUEJDX1BST0JFX1JFUV9JTkQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoIkNTUiByb2FtX3N0YXR1cyA9IGVDU1JfUk9BTV9XUFNfUEJDX1BST0JFX1JFUV9JTkQgKCVkKVxuIiksCisJCQkgIHJvYW1fc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fSU5ESUNBVEVfTUdNVF9GUkFNRToKKwkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgY3NyX3JvYW1faW5mbywKKwkJCQkgICAgIGVTQVBfSU5ESUNBVEVfTUdNVF9GUkFNRSwKKwkJCQkgICAgICh2b2lkICopIGVTQVBfU1RBVFVTX1NVQ0NFU1MpOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9SRU1BSU5fQ0hBTl9SRUFEWToKKwkJLyogcm9hbUlkIGNvbnRhaW5zIHNjYW4gaWRlbnRpZmllciAqLworCQlzYXBfY3R4LT5yb2NfaW5kX3NjYW5faWQgPSBjc3Jfcm9hbV9pbmZvLT5yb2Nfc2Nhbl9pZDsKKwkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgY3NyX3JvYW1faW5mbywKKwkJCQkgICAgIGVTQVBfUkVNQUlOX0NIQU5fUkVBRFksCisJCQkJICAgICAodm9pZCAqKSBlU0FQX1NUQVRVU19TVUNDRVNTKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fU0VORF9BQ1RJT05fQ05GOgorCQlzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBjc3Jfcm9hbV9pbmZvLAorCQkJZVNBUF9TRU5EX0FDVElPTl9DTkYsCisJCQkodm9pZCAqKSAoKGVTYXBTdGF0dXMpCisJCQkoKHJvYW1fcmVzdWx0ID09IGVDU1JfUk9BTV9SRVNVTFRfTk9ORSkgPworCQkJZVNBUF9TVEFUVVNfU1VDQ0VTUyA6IGVTQVBfU1RBVFVTX0ZBSUxVUkUpKSk7CisJCWJyZWFrOworCWNhc2UgZUNTUl9ST0FNX0RJU0NPTk5FQ1RfQUxMX1AyUF9DTElFTlRTOgorCQlzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBjc3Jfcm9hbV9pbmZvLAorCQkJCSAgICAgZVNBUF9ESVNDT05ORUNUX0FMTF9QMlBfQ0xJRU5ULAorCQkJCSAgICAgKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCWJyZWFrOworCWNhc2UgZUNTUl9ST0FNX1NFTkRfUDJQX1NUT1BfQlNTOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJSZWNlaXZlZCBzdG9wYnNzIikpOworCQlzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBjc3Jfcm9hbV9pbmZvLAorCQkJCSAgICAgZVNBUF9NQUNfVFJJR19TVE9QX0JTU19FVkVOVCwKKwkJCQkgICAgICh2b2lkICopIGVTQVBfU1RBVFVTX1NVQ0NFU1MpOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9ERlNfUkFEQVJfSU5EOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJSZWNlaXZlZCBSYWRhciBJbmRpY2F0aW9uIikpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgRkwoInNhcGRmczogSW5kaWNhdGUgZVNBUF9ERlNfUkFEQVJfREVURUNUIHRvIEhERCIpKTsKKwkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgTlVMTCwgZVNBUF9ERlNfUkFEQVJfREVURUNULAorCQkJCSAgICAgKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCS8qIHN5bmMgdG8gbGF0ZXN0IERGUy1OT0wgKi8KKwkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgTlVMTCwgZVNBUF9ERlNfTk9MX0dFVCwKKwkJCQkgICAgKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCW1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLnRhcmdldF9jaGFubmVsID0KKwkJICAgIHNhcF9pbmRpY2F0ZV9yYWRhcihzYXBfY3R4LCAmY3NyX3JvYW1faW5mby0+ZGZzX2V2ZW50KTsKKwkJLyogaWYgdGhlcmUgaXMgYW4gYXNzaWduZWQgbmV4dCBjaGFubmVsIGhvcHBpbmcgKi8KKwkJaWYgKDAgPCBtYWNfY3R4LT5zYXAuU2FwRGZzSW5mby51c2VyX3Byb3ZpZGVkX3RhcmdldF9jaGFubmVsKSB7CisJCQltYWNfY3R4LT5zYXAuU2FwRGZzSW5mby50YXJnZXRfY2hhbm5lbCA9CisJCQkgICBtYWNfY3R4LT5zYXAuU2FwRGZzSW5mby51c2VyX3Byb3ZpZGVkX3RhcmdldF9jaGFubmVsOworCQkJbWFjX2N0eC0+c2FwLlNhcERmc0luZm8udXNlcl9wcm92aWRlZF90YXJnZXRfY2hhbm5lbCA9CisJCQkgICAwOworCQl9CisJCWlmIChtYWNfY3R4LT5zYXAuU2FwRGZzSW5mby50YXJnZXRfY2hhbm5lbCAhPSAwKSB7CisJCQltYWNfY3R4LT5zYXAuU2FwRGZzSW5mby5jYWNfc3RhdGUgPQorCQkJCWVTQVBfREZTX0RPX05PVF9TS0lQX0NBQzsKKwkJCXNhcF9jYWNfcmVzZXRfbm90aWZ5KGhhbCk7CisJCQkvKiBzZXQgREZTLU5PTCBiYWNrIHRvIGtlZXAgaXQgdXBkYXRlLXRvLWRhdGUgaW4gQ05TUyAqLworCQkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgTlVMTCwgZVNBUF9ERlNfTk9MX1NFVCwKKwkJCQkJICAgICAodm9pZCAqKSBlU0FQX1NUQVRVU19TVUNDRVNTKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIElzc3VlIHN0b3Bic3MgZm9yIGVhY2ggc2FwY3R4ICovCisJCWZvciAoaW50ZiA9IDA7IGludGYgPCBTQVBfTUFYX05VTV9TRVNTSU9OOyBpbnRmKyspIHsKKwkJCXB0U2FwQ29udGV4dCBwU2FwQ29udGV4dDsKKwkJCWlmICgoKENERl9TQVBfTU9ERSA9PQorCQkJICAgIG1hY19jdHgtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnNhcFBlcnNvbmEpIHx8CisJCQkgICAgKENERl9QMlBfR09fTU9ERSA9PQorCQkJICAgIG1hY19jdHgtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnNhcFBlcnNvbmEpKSAmJgorCQkJICAgIG1hY19jdHgtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnBTYXBDb250ZXh0ICE9CisJCQkgICAgTlVMTCkgeworCQkJCXBTYXBDb250ZXh0ID0KKwkJCQkgICAgbWFjX2N0eC0+c2FwLnNhcEN0eExpc3RbaW50Zl0ucFNhcENvbnRleHQ7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTCgic2FwZGZzOiBubyBhdmFpbGFibGUgY2hhbm5lbCBmb3Igc2FwY3R4WyVwXSwgU3RvcEJzcyIpLAorCQkJCQkgIHBTYXBDb250ZXh0KTsKKwkJCQl3bGFuc2FwX3N0b3BfYnNzKHBTYXBDb250ZXh0KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9ERlNfQ0hBTl9TV19OT1RJRlk6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoIlJlY2VpdmVkIENoYW4gU3cgVXBkYXRlIE5vdGlmaWNhdGlvbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fU0VUX0NIQU5ORUxfUlNQOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJSZWNlaXZlZCBzZXQgY2hhbm5lbCByZXNwb25zZSIpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJDU1Igcm9hbV9zdGF0dXMgbm90IGhhbmRsZWQgcm9hbV9zdGF0dXMgPSAlcyAoJWQpXG4iKSwKKwkJCSAgZ2V0X2Vfcm9hbV9jbWRfc3RhdHVzX3N0cihyb2FtX3N0YXR1cyksCisJCQkgIHJvYW1fc3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgIEZMKCJCZWZvcmUgc3dpdGNoIG9uIHJvYW1fcmVzdWx0ID0gJWRcbiIpLCByb2FtX3Jlc3VsdCk7CisKKwlzd2l0Y2ggKHJvYW1fcmVzdWx0KSB7CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0FTU09DSUFUSU9OX0lORDoKKwkJd2xhbnNhcF9yb2FtX3Byb2Nlc3NfaW5mcmFfYXNzb2NfaW5kKHNhcF9jdHgsIHJvYW1fcmVzdWx0LAorCQkJCQkJY3NyX3JvYW1faW5mbywgJmNkZl9yZXRfc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0FTU09DSUFUSU9OX0NORjoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiQ1NSIHJvYW1fcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9BU1NPQ0lBVElPTl9DTkYgKCVkKVxuIiksCisJCQkgIHJvYW1fcmVzdWx0KTsKKwkJc2FwX2N0eC0+blN0YVdQQVJTblJlcUllTGVuZ3RoID0gY3NyX3JvYW1faW5mby0+cnNuSUVMZW47CisJCWlmIChzYXBfY3R4LT5uU3RhV1BBUlNuUmVxSWVMZW5ndGgpCisJCQljZGZfbWVtX2NvcHkoc2FwX2N0eC0+cFN0YVdwYVJzblJlcUlFLAorCQkJCSAgICAgY3NyX3JvYW1faW5mby0+cHJzbklFLAorCQkJCSAgICAgc2FwX2N0eC0+blN0YVdQQVJTblJlcUllTGVuZ3RoKTsKKworCQlzYXBfY3R4LT5uU3RhQWRkSWVMZW5ndGggPSBjc3Jfcm9hbV9pbmZvLT5hZGRJRUxlbjsKKwkJaWYgKHNhcF9jdHgtPm5TdGFBZGRJZUxlbmd0aCkKKwkJCWNkZl9tZW1fY29weShzYXBfY3R4LT5wU3RhQWRkSUUsCisJCQkJICAgICBjc3Jfcm9hbV9pbmZvLT5wYWRkSUUsCisJCQkJICAgICBzYXBfY3R4LT5uU3RhQWRkSWVMZW5ndGgpOworCisJCXNhcF9jdHgtPlNhcFFvc0NmZy5XbW1Jc0VuYWJsZWQgPQorCQkJY3NyX3JvYW1faW5mby0+d21tRW5hYmxlZFN0YTsKKwkJLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBjc3Jfcm9hbV9pbmZvLAorCQkJCQllU0FQX1NUQV9BU1NPQ19FVkVOVCwKKwkJCQkJKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0RJU0FTU09DX0lORDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiQ1NSIHJvYW1fcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9ESVNBU1NPQ19JTkQgKCVkKVxuIiksCisJCQkgIHJvYW1fcmVzdWx0KTsKKwkJLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBjc3Jfcm9hbV9pbmZvLAorCQkJCQllU0FQX1NUQV9ESVNBU1NPQ19FVkVOVCwKKwkJCQkJKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0RFQVVUSF9JTkQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoIkNTUiByb2FtX3Jlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfREVBVVRIX0lORCAoJWQpXG4iKSwKKwkJCSAgcm9hbV9yZXN1bHQpOworCQkvKgorCQkgKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUKKwkJICogd2UgdXNlIHRoZSBzYW1lIGV2ZW50IGlub3JkZXIgdG8gaW5mb3JtIEhERCB0byBkaXNhc3NvY2lhdGUKKwkJICogdGhlIHN0YXRpb24KKwkJICovCisJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBjc3Jfcm9hbV9pbmZvLAorCQkJCQllU0FQX1NUQV9ESVNBU1NPQ19FVkVOVCwKKwkJCQkJKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9HUk9VUDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiQ1NSIHJvYW1fcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfR1JPVVAgKCVkKVxuIiksCisJCQkgIHJvYW1fcmVzdWx0KTsKKwkJLyoKKwkJICogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlCisJCSAqIFRPRE86IHN1cHBvcnQgZm9yIGdyb3VwIGtleSBNSUMgZmFpbHVyZSBldmVudCB0byBiZSBoYW5kbGVkCisJCSAqLworCQljZGZfc3RhdHVzID0gc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgY3NyX3JvYW1faW5mbywKKwkJCQkJCWVTQVBfU1RBX01JQ19GQUlMVVJFX0VWRU5ULAorCQkJCQkJKHZvaWQgKikgTlVMTCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9VTklDQVNUOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJDU1Igcm9hbV9yZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9VTklDQVNUICglZClcbiIpLAorCQkJICByb2FtX3Jlc3VsdCk7CisJCS8qCisJCSAqIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZQorCQkgKiBUT0RPOiBzdXBwb3J0IGZvciB1bmljYXN0IGtleSBNSUMgZmFpbHVyZSBldmVudCB0byBiZSBoYW5kbGVkCisJCSAqLworCQljZGZfc3RhdHVzID0KKwkJCXNhcF9zaWduYWxfaGRkX2V2ZW50KHNhcF9jdHgsIGNzcl9yb2FtX2luZm8sCisJCQkJCSAgZVNBUF9TVEFfTUlDX0ZBSUxVUkVfRVZFTlQsCisJCQkJCSAgKHZvaWQgKikgTlVMTCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQljZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCWJyZWFrOworCWNhc2UgZUNTUl9ST0FNX1JFU1VMVF9BVVRIRU5USUNBVEVEOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJDU1Igcm9hbV9yZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0FVVEhFTlRJQ0FURUQgKCVkKVxuIiksCisJCQkgIHJvYW1fcmVzdWx0KTsKKwkJLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisJCXNhcF9zaWduYWxfaGRkX2V2ZW50KHNhcF9jdHgsIGNzcl9yb2FtX2luZm8sCisJCQkJICBlU0FQX1NUQV9TRVRfS0VZX0VWRU5ULAorCQkJCSAgKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoIkNTUiByb2FtX3Jlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfQVNTT0NJQVRFRCAoJWQpXG4iKSwKKwkJCSAgcm9hbV9yZXN1bHQpOworCQkvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8KKwkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgY3NyX3JvYW1faW5mbywKKwkJCQkgICAgIGVTQVBfU1RBX1JFQVNTT0NfRVZFTlQsCisJCQkJICAgICAodm9pZCAqKSBlU0FQX1NUQVRVU19TVUNDRVNTKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX1NUQVJURUQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoIkNTUiByb2FtX3Jlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfU1RBUlRFRCAoJWQpXG4iKSwKKwkJCSAgcm9hbV9yZXN1bHQpOworCQkvKgorCQkgKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgaG9zdGFwZCBpcyBub3QgYXdhcmUgdGhhdAorCQkgKiBkcml2ZSB3aWxsIHN1cHBvcnQgREZTLiBIZW5jZSwgZHJpdmVyIHNob3VsZCBpbmZvcm0KKwkJICogZVNBUF9NQUNfU1RBUlRfQlNTX1NVQ0NFU1MgdG8gdXBwZXIgbGF5ZXJzIGFuZCB0aGVuIHBlcmZvcm0KKwkJICogQ0FDIHVuZGVybmVhdGgKKwkJICovCisJCXNhcF9ldmVudC5ldmVudCA9IGVTQVBfTUFDX1NUQVJUX0JTU19TVUNDRVNTOworCQlzYXBfZXZlbnQucGFyYW1zID0gY3NyX3JvYW1faW5mbzsKKwkJc2FwX2V2ZW50LnUxID0gcm9hbV9zdGF0dXM7CisJCXNhcF9ldmVudC51MiA9IHJvYW1fcmVzdWx0OworCQljZGZfc3RhdHVzID0gc2FwX2ZzbShzYXBfY3R4LCAmc2FwX2V2ZW50KTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCQljZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfU1RPUFBFRDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiQ1NSIHJvYW1fcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9TVE9QUEVEICglZClcbiIpLAorCQkJICByb2FtX3Jlc3VsdCk7CisJCS8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLworCQlzYXBfZXZlbnQuZXZlbnQgPSBlU0FQX01BQ19SRUFEWV9GT1JfQ09OTkVDVElPTlM7CisJCXNhcF9ldmVudC5wYXJhbXMgPSBjc3Jfcm9hbV9pbmZvOworCQlzYXBfZXZlbnQudTEgPSByb2FtX3N0YXR1czsKKwkJc2FwX2V2ZW50LnUyID0gcm9hbV9yZXN1bHQ7CisJCS8qIEhhbmRsZSBldmVudCAqLworCQljZGZfc3RhdHVzID0gc2FwX2ZzbShzYXBfY3R4LCAmc2FwX2V2ZW50KTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCQljZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfV1BTX1BCQ19QUk9CRV9SRVFfSU5EOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJDU1Igcm9hbV9yZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX1dQU19QQkNfUFJPQkVfUkVRX0lORCAoJWQpXG4iKSwKKwkJCSAgcm9hbV9yZXN1bHQpOworCQkvKgorCQkgKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUKKwkJICogVE9ETzogc3VwcG9ydCBmb3IgZ3JvdXAga2V5IE1JQyBmYWlsdXJlIGV2ZW50IHRvIGJlIGhhbmRsZWQKKwkJICovCisJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBjc3Jfcm9hbV9pbmZvLAorCQkJCQkJZVNBUF9XUFNfUEJDX1BST0JFX1JFUV9FVkVOVCwKKwkJCQkJCSh2b2lkICopIE5VTEwpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCWNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWJyZWFrOworCWNhc2UgZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoIkNTUiByb2FtX3Jlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfRk9SQ0VEICglZClcbiIpLAorCQkJICByb2FtX3Jlc3VsdCk7CisJCS8qCisJCSAqIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGhkZCBhYm91dCB1c2VyIHRyaWdnZXJlZAorCQkgKiBkaXNhc3NvYyBldmVudAorCQkgKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUKKwkJICovCisJCXNhcF9zaWduYWxfaGRkX2V2ZW50KHNhcF9jdHgsIGNzcl9yb2FtX2luZm8sCisJCQkJICAgICBlU0FQX1NUQV9ESVNBU1NPQ19FVkVOVCwKKwkJCQkgICAgICh2b2lkICopIGVTQVBfU1RBVFVTX1NVQ0NFU1MpOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfTk9ORToKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiQ1NSIHJvYW1fcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9OT05FICglZClcbiIpLAorCQkJICByb2FtX3Jlc3VsdCk7CisJCS8qCisJCSAqIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGhkZCBhYm91dCB1c2VyIHRyaWdnZXJlZAorCQkgKiBkaXNhc3NvYyBldmVudAorCQkgKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUKKwkJICovCisJCWlmIChyb2FtX3N0YXR1cyA9PSBlQ1NSX1JPQU1fU0VUX0tFWV9DT01QTEVURSkKKwkJCXNhcF9zaWduYWxfaGRkX2V2ZW50KHNhcF9jdHgsIGNzcl9yb2FtX2luZm8sCisJCQkJCSAgICAgZVNBUF9TVEFfU0VUX0tFWV9FVkVOVCwKKwkJCQkJICAgICAodm9pZCAqKSBlU0FQX1NUQVRVU19TVUNDRVNTKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX01BWF9BU1NPQ19FWENFRURFRDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiQ1NSIHJvYW1fcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9NQVhfQVNTT0NfRVhDRUVERUQgKCVkKVxuIiksCisJCQkgIHJvYW1fcmVzdWx0KTsKKwkJLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBjc3Jfcm9hbV9pbmZvLAorCQkJCQkJICBlU0FQX01BWF9BU1NPQ19FWENFRURFRCwKKwkJCQkJCSAgTlVMTCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfREZTX1JBREFSX0ZPVU5EX0lORDoKKwkJd2xhbnNhcF9yb2FtX3Byb2Nlc3NfZGZzX3JhZGFyX2ZvdW5kKG1hY19jdHgsIHNhcF9jdHgsCisJCQkJCQkmY2RmX3JldF9zdGF0dXMpOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfREZTX0NIQU5TV19VUERBVEVfU1VDQ0VTUzoKKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfREZTX0NIQU5TV19VUERBVEVfRkFJTFVSRToKKwkJd2xhbnNhcF9yb2FtX3Byb2Nlc3NfZGZzX2NoYW5zd191cGRhdGVfZmFpbChoYWwsIHNhcF9jdHgsCisJCQkJCQkmY2RmX3JldF9zdGF0dXMpOworCQlicmVhazsKKwljYXNlIGVDU1JfUk9BTV9SRVNVTFRfQ0hBTk5FTF9DSEFOR0VfU1VDQ0VTUzoKKwkJd2xhbnNhcF9yb2FtX3Byb2Nlc3NfY2hfY2hhbmdlX3N1Y2Nlc3MobWFjX2N0eCwgc2FwX2N0eCwKKwkJCQkJCWNzcl9yb2FtX2luZm8sICZjZGZfcmV0X3N0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgZUNTUl9ST0FNX1JFU1VMVF9DSEFOTkVMX0NIQU5HRV9GQUlMVVJFOgorCQkvKgorCQkgKiBUaGlzIGlzIG11Y2ggbW9yZSBzZXJpb3VzIGlzc3VlLCB3ZSBoYXZlIHRvIHZhY2F0ZSB0aGUKKwkJICogY2hhbm5lbCBkdWUgdG8gdGhlIHByZXNlbmNlIG9mIHJhZGFyIGJ1dCBvdXIgY2hhbm5lbCBjaGFuZ2UKKwkJICogZmFpbGVkLCBzdG9wIHRoZSBCU1Mgb3BlcmF0aW9uIGNvbXBsZXRlbHkgYW5kIGluZm9ybSBob3N0YXBkCisJCSAqLworCQlzYXBfY3R4LT5zYXBzTWFjaGluZSA9IGVTQVBfRElTQ09OTkVDVEVEOworCQkvKiBJbmZvcm0gY2ZnODAyMTEgYW5kIGhvc3RhcGQgdGhhdCBCU1MgaXMgbm90IGFsaXZlIGFueW1vcmUgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJDU1Igcm9hbV9yZXN1bHQgPSAlcyAoJWQpIG5vdCBoYW5kbGVkXG4iKSwKKwkJCSAgZ2V0X2VfY3NyX3JvYW1fcmVzdWx0X3N0cihyb2FtX3Jlc3VsdCksCisJCQkgIHJvYW1fcmVzdWx0KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjZGZfcmV0X3N0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc2FwL3NyYy9zYXBfY2hfc2VsZWN0LmMgYi9jb3JlL3NhcC9zcmMvc2FwX2NoX3NlbGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOGU4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NhcC9zcmMvc2FwX2NoX3NlbGVjdC5jCkBAIC0wLDAgKzEsMjAzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIHMgYSBwIEMgaCBTIGUgbCBlIGMgdCAuIEMKKyAgIE9WRVJWSUVXOgorCisgICBUaGlzIHNvZnR3YXJlIHVuaXQgaG9sZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXTEFOIFNBUCBtb2R1bGVzCisgICBmdW5jdGlvbnMgZm9yIGNoYW5uZWwgc2VsZWN0aW9uLgorCisgICBERVBFTkRFTkNJRVM6CisKKyAgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBGaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKyNpbmNsdWRlICJjc3JfYXBpLmgiCisjaW5jbHVkZSAic21lX2FwaS5oIgorI2luY2x1ZGUgInNhcF9jaF9zZWxlY3QuaCIKKyNpbmNsdWRlICJzYXBfaW50ZXJuYWwuaCIKKyNpZmRlZiBBTklfT1NfVFlQRV9RTlgKKyNpbmNsdWRlICJzdGRpby5oIgorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFCisjaW5jbHVkZSAibGltX3V0aWxzLmgiCisjaW5jbHVkZSAicGFyc2VyX2FwaS5oIgorI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCisjaWZkZWYgQ09ORklHX0NOU1MKKyNpbmNsdWRlIDxuZXQvY25zcy5oPgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEZ1bmN0aW9uIGRlZmluaXRpb25zCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIERlZmluZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU0FQX0RFQlVHCisKKyNkZWZpbmUgSVNfUlNTSV9WQUxJRChleHRSc3NpLCByc3NpKSBcCisJKCBcCisJCSgoZXh0UnNzaSA8IHJzc2kpID8gdHJ1ZSA6IGZhbHNlKSBcCisJKQorCisjZGVmaW5lIFNFVF9BQ1NfQkFORChhY3NfYmFuZCwgcFNhcEN0eCkgXAoreyBcCisJaWYgKHBTYXBDdHgtPmFjc19jZmctPnN0YXJ0X2NoIDw9IDE0ICYmIFwKKwkJcFNhcEN0eC0+YWNzX2NmZy0+ZW5kX2NoIDw9IDE0KSBcCisJCWFjc19iYW5kID0gZUNTUl9ET1QxMV9NT0RFXzExZzsgXAorCWVsc2UgaWYgKHBTYXBDdHgtPmFjc19jZmctPnN0YXJ0X2NoID49IDE0KVwKKwkJYWNzX2JhbmQgPSBlQ1NSX0RPVDExX01PREVfMTFhOyBcCisJZWxzZSBcCisJCWFjc19iYW5kID0gZUNTUl9ET1QxMV9NT0RFX2FiZzsgXAorfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NIX0FWT0lECitzYXBTYWZlQ2hhbm5lbFR5cGUgc2FmZV9jaGFubmVsc1tOVU1fMjBNSFpfUkZfQ0hBTk5FTFNdID0geworCS8qQ0ggICwgU0FGRSwgZGVmYXVsdCBzYWZlICovCisJezEsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl8xLCAqLworCXsyLCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMiwgKi8KKwl7MywgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzMsICovCisJezQsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl80LCAqLworCXs1LCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fNSwgKi8KKwl7NiwgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzYsICovCisJezcsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl83LCAqLworCXs4LCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fOCwgKi8KKwl7OSwgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzksICovCisJezEwLCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTAsICovCisJezExLCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTEsICovCisJezEyLCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTIsICovCisJezEzLCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTMsICovCisJezE0LCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTQsICovCisJezI0MCwgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzI0MCwgKi8KKwl7MjQ0LCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMjQ0LCAqLworCXsyNDgsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl8yNDgsICovCisJezI1MiwgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzI1MiwgKi8KKwl7MjA4LCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMjA4LCAqLworCXsyMTIsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl8yMTIsICovCisJezIxNiwgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzIxNiwgKi8KKwl7MzYsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl8zNiwgKi8KKwl7NDAsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl80MCwgKi8KKwl7NDQsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl80NCwgKi8KKwl7NDgsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl80OCwgKi8KKwl7NTIsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl81MiwgKi8KKwl7NTYsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl81NiwgKi8KKwl7NjAsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl82MCwgKi8KKwl7NjQsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl82NCwgKi8KKwl7MTAwLCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTAwLCAqLworCXsxMDQsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl8xMDQsICovCisJezEwOCwgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzEwOCwgKi8KKwl7MTEyLCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTEyLCAqLworCXsxMTYsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl8xMTYsICovCisJezEyMCwgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzEyMCwgKi8KKwl7MTI0LCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTI0LCAqLworCXsxMjgsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl8xMjgsICovCisJezEzMiwgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzEzMiwgKi8KKwl7MTM2LCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTM2LCAqLworCXsxNDAsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl8xNDAsICovCisJezE0NCwgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzE0NCwgKi8KKwl7MTQ5LCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTQ5LCAqLworCXsxNTMsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl8xNTMsICovCisJezE1NywgdHJ1ZX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBSRl9DSEFOXzE1NywgKi8KKwl7MTYxLCB0cnVlfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGX0NIQU5fMTYxLCAqLworCXsxNjUsIHRydWV9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUkZfQ0hBTl8xNjUsICovCit9OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBjaFN0YXJ0TnVtOworCXVpbnQzMl90IHdlaWdodDsKK30gc2FwQWNzQ2hhbm5lbEluZm87CisKK3NhcEFjc0NoYW5uZWxJbmZvIGFjc19odDQwX2NoYW5uZWxzNV9nW10gPSB7CisJezM2LCBTQVBfQUNTX1dFSUdIVF9NQVh9LAorCXs0NCwgU0FQX0FDU19XRUlHSFRfTUFYfSwKKwl7NTIsIFNBUF9BQ1NfV0VJR0hUX01BWH0sCisJezYwLCBTQVBfQUNTX1dFSUdIVF9NQVh9LAorCXsxMDAsIFNBUF9BQ1NfV0VJR0hUX01BWH0sCisJezEwOCwgU0FQX0FDU19XRUlHSFRfTUFYfSwKKwl7MTE2LCBTQVBfQUNTX1dFSUdIVF9NQVh9LAorCXsxMjQsIFNBUF9BQ1NfV0VJR0hUX01BWH0sCisJezEzMiwgU0FQX0FDU19XRUlHSFRfTUFYfSwKKwl7MTQwLCBTQVBfQUNTX1dFSUdIVF9NQVh9LAorCXsxNDksIFNBUF9BQ1NfV0VJR0hUX01BWH0sCisJezE1NywgU0FQX0FDU19XRUlHSFRfTUFYfSwKK307CisKK3NhcEFjc0NoYW5uZWxJbmZvIGFjc19odDgwX2NoYW5uZWxzW10gPSB7CisJezM2LCBTQVBfQUNTX1dFSUdIVF9NQVh9LAorCXs1MiwgU0FQX0FDU19XRUlHSFRfTUFYfSwKKwl7MTAwLCBTQVBfQUNTX1dFSUdIVF9NQVh9LAorCXsxMTYsIFNBUF9BQ1NfV0VJR0hUX01BWH0sCisJezEzMiwgU0FQX0FDU19XRUlHSFRfTUFYfSwKKwl7MTQ5LCBTQVBfQUNTX1dFSUdIVF9NQVh9LAorfTsKKworc2FwQWNzQ2hhbm5lbEluZm8gYWNzX2h0NDBfY2hhbm5lbHMyNF9nW10gPSB7CisJezEsIFNBUF9BQ1NfV0VJR0hUX01BWH0sCisJezIsIFNBUF9BQ1NfV0VJR0hUX01BWH0sCisJezMsIFNBUF9BQ1NfV0VJR0hUX01BWH0sCisJezQsIFNBUF9BQ1NfV0VJR0hUX01BWH0sCisJezksIFNBUF9BQ1NfV0VJR0hUX01BWH0sCit9OworCisjZGVmaW5lIENIQU5ORUxfMTY1ICAxNjUKKworLyogcnNzaSBkaXNjb3VudCBmb3IgY2hhbm5lbHMgaW4gUENMICovCisjZGVmaW5lIFBDTF9SU1NJX0RJU0NPVU5UIDEwCisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKy8qKgorICogc2FwX2NoZWNrX25fYWRkX2NoYW5uZWwoKSAtIGNoZWNrcyBhbmQgYWRkIGdpdmVuIGNoYW5uZWwgaW4gc2FwIGNvbnRleHQncworICogYXZvaWRfY2hhbm5lbHNfaW5mbyBzdHJ1Y3QKKyAqIEBzYXBfY3R4OiAgICAgICAgICAgc2FwIGNvbnRleHQuCisgKiBAbmV3X2NoYW5uZWw6ICAgICAgIGNoYW5uZWwgdG8gYmUgYWRkZWQgdG8gc2FwX2N0eCdzIGF2b2lkIGNoIGluZm8KKyAqCisgKiBzYXBfY3R4IGNvbnRhaW5zIHNhcF9hdm9pZF9jaF9pbmZvIHN0cmN1dCBjb250YWluaW5nIHRoZSBsaXN0IG9mIGNoYW5uZWxzIG9uCisgKiB3aGljaCBNRE0gZGV2aWNlJ3MgQVAgd2l0aCBNQ0Mgd2FzIGRldGVjdGVkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWRkIGNoYW5uZWxzCisgKiB0byB0aGF0IGxpc3QgYWZ0ZXIgY2hlY2tpbmcgZm9yIGR1cGxpY2F0ZXMuCisgKgorICogUmV0dXJuOiB0cnVlOiBpZiBjaGFubmVsIHdhcyBhZGRlZCBvciBhbHJlYWR5IHByZXNlbnQKKyAqICAgZWxzZSBmYWxzZTogaWYgY2hhbm5lbCBsaXN0IHdhcyBhbHJlYWR5IGZ1bGwuCisgKi8KK2Jvb2wKK3NhcF9jaGVja19uX2FkZF9jaGFubmVsKHB0U2FwQ29udGV4dCBzYXBfY3R4LAorCQkJdWludDhfdCBuZXdfY2hhbm5lbCkKK3sKKwl1aW50OF90IGkgPSAwOworCXN0cnVjdCBzYXBfYXZvaWRfY2hhbm5lbHNfaW5mbyAqaWVfaW5mbyA9CisJCSZzYXBfY3R4LT5zYXBfZGV0ZWN0ZWRfYXZvaWRfY2hfaWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGllX2luZm8tPmNoYW5uZWxzKTsgaSsrKSB7CisJCWlmIChpZV9pbmZvLT5jaGFubmVsc1tpXSA9PSBuZXdfY2hhbm5lbCkKKwkJCWJyZWFrOworCisJCWlmIChpZV9pbmZvLT5jaGFubmVsc1tpXSA9PSAwKSB7CisJCQlpZV9pbmZvLT5jaGFubmVsc1tpXSA9IG5ld19jaGFubmVsOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gc2l6ZW9mKGllX2luZm8tPmNoYW5uZWxzKSkKKwkJcmV0dXJuIGZhbHNlOworCWVsc2UKKwkJcmV0dXJuIHRydWU7Cit9CisvKioKKyAqIHNhcF9jaGVja19uX2FkZF9vdmVybGFwcGVkX2NobmxzKCkgLSBjaGVja3MgJiBhZGQgb3ZlcmxhcHBlZCBjaGFubmVscworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHByaW1hcnkgY2hhbm5lbCBpbiAyLjRHaHogYmFuZC4KKyAqIEBzYXBfY3R4OiAgICAgICAgICAgc2FwIGNvbnRleHQuCisgKiBAcHJpbWFyeV9jaG5sOiAgICAgIHByaW1hcnkgY2hhbm5lbCB0byBiZSBhdm9pZGVkLgorICoKKyAqIHNhcF9jdHggY29udGFpbnMgc2FwX2F2b2lkX2NoX2luZm8gc3RydWN0IGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgY2hhbm5lbHMgb24KKyAqIHdoaWNoIE1ETSBkZXZpY2UncyBBUCB3aXRoIE1DQyB3YXMgZGV0ZWN0ZWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBhZGQgY2hhbm5lbHMKKyAqIHRvIHRoYXQgbGlzdCBhZnRlciBjaGVja2luZyBmb3IgZHVwbGljYXRlcy4KKyAqCisgKiBSZXR1cm46IHRydWU6IGlmIGNoYW5uZWwgd2FzIGFkZGVkIG9yIGFscmVhZHkgcHJlc2VudAorICogICBlbHNlIGZhbHNlOiBpZiBjaGFubmVsIGxpc3Qgd2FzIGFscmVhZHkgZnVsbC4KKyAqLworc3RhdGljIGJvb2wKK3NhcF9jaGVja19uX2FkZF9vdmVybGFwcGVkX2NobmxzKHB0U2FwQ29udGV4dCBzYXBfY3R4LCB1aW50OF90IHByaW1hcnlfY2hhbm5lbCkKK3sKKwl1aW50OF90IGkgPSAwLCBqID0gMCwgdXBwZXJfY2hubCA9IDAsIGxvd2VyX2NobmwgPSAwOworCXN0cnVjdCBzYXBfYXZvaWRfY2hhbm5lbHNfaW5mbyAqaWVfaW5mbyA9CisJCSZzYXBfY3R4LT5zYXBfZGV0ZWN0ZWRfYXZvaWRfY2hfaWU7CisJLyoKKwkgKiBpZiBwcmltYXJ5IGNoYW5uZWwgbGVzcyB0aGFuIGNoYW5uZWwgMSBvciBvdXQgb2YgMmcgYmFuZCB0aGVuCisJICogbm8gZnVydGhlciBwcm9jZXNzIGlzIHJlcXVpcmVkLiByZXR1cm4gdHJ1ZSBpbiB0aGlzIGNhc2UuCisJICovCisJaWYgKHByaW1hcnlfY2hhbm5lbCA8IENIQU5ORUxfMSB8fCBwcmltYXJ5X2NoYW5uZWwgPiBDSEFOTkVMXzE0KQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIGxvd2VyIGNoYW5uZWwgaXMgb25lIGNoYW5uZWwgcmlnaHQgYmVmb3JlIHByaW1hcnkgY2hhbm5lbCAqLworCWxvd2VyX2NobmwgPSBwcmltYXJ5X2NoYW5uZWwgLSAxOworCS8qIHVwcGVyIGNoYW5uZWwgaXMgb25lIGNoYW5uZWwgcmlnaHQgYWZ0ZXIgcHJpbWFyeSBjaGFubmVsICovCisJdXBwZXJfY2hubCA9IHByaW1hcnlfY2hhbm5lbCArIDE7CisKKwkvKiBsb3dlciBjaGFubmVsIG5lZWRzIHRvIGJlIG5vbi16ZXJvLCB6ZXJvIGlzIG5vdCB2YWxpZCBjaGFubmVsICovCisJaWYgKGxvd2VyX2NobmwgPiAoQ0hBTk5FTF8xIC0gMSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihpZV9pbmZvLT5jaGFubmVscyk7IGkrKykgeworCQkJaWYgKGllX2luZm8tPmNoYW5uZWxzW2ldID09IGxvd2VyX2NobmwpCisJCQkJYnJlYWs7CisJCQlpZiAoaWVfaW5mby0+Y2hhbm5lbHNbaV0gPT0gMCkgeworCQkJCWllX2luZm8tPmNoYW5uZWxzW2ldID0gbG93ZXJfY2hubDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvKiB1cHBlciBjaGFubmVsIG5lZWRzIHRvIGJlIGF0bGVhc3QgbGFzdCBjaGFubmVsIGluIDIuNEdoeiBiYW5kICovCisJaWYgKHVwcGVyX2NobmwgPCAoQ0hBTk5FTF8xNCArIDEpKSB7CisJCWZvciAoaiA9IDA7IGogPCBzaXplb2YoaWVfaW5mby0+Y2hhbm5lbHMpOyBqKyspIHsKKwkJCWlmIChpZV9pbmZvLT5jaGFubmVsc1tqXSA9PSB1cHBlcl9jaG5sKQorCQkJCWJyZWFrOworCQkJaWYgKGllX2luZm8tPmNoYW5uZWxzW2pdID09IDApIHsKKwkJCQlpZV9pbmZvLT5jaGFubmVsc1tqXSA9IHVwcGVyX2Nobmw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKGkgPT0gc2l6ZW9mKGllX2luZm8tPmNoYW5uZWxzKSB8fCBqID09IHNpemVvZihpZV9pbmZvLT5jaGFubmVscykpCisJCXJldHVybiBmYWxzZTsKKwllbHNlCisJCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIHNhcF9wcm9jZXNzX2F2b2lkX2llKCkgLSBwcm9jZXNzZXMgdGhlIGRldGVjdGVkIFEyUSBJRQorICogY29udGV4dCdzIGF2b2lkX2NoYW5uZWxzX2luZm8gc3RydWN0CisgKiBAaGFsOiAgICAgICAgICAgICAgICBoYWwgaGFuZGxlCisgKiBAc2FwX2N0eDogICAgICAgICAgICBzYXAgY29udGV4dC4KKyAqIEBzY2FuX3Jlc3VsdDogICAgICAgIHNjYW4gcmVzdWx0cyBmb3IgQUNTIHNjYW4uCisgKiBAc3BlY3RfaW5mbzogICAgICAgICBzcGVjdHJ1bSB3ZWlnaHRzIGFycmF5IHRvIHVwZGF0ZQorICoKKyAqIERldGVjdGlvbiBvZiBRMlEgSUUgaW5kaWNhdGVzIHByZXNlbmNlIG9mIGFub3RoZXIgTURNIGRldmljZSB3aXRoIGl0cyBBUAorICogb3BlcmF0aW5nIGluIE1DQyBtb2RlLiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgc2NhbiByZXN1bHRzIGFuZCBwcm9jZXNzZXMKKyAqIHRoZSBRMlEgSUUgaWYgZm91bmQuIEl0IHRoZW4gZXh0cmFjdHMgdGhlIGNoYW5uZWxzIGFuZCBwb3B1bGF0ZXMgdGhlbSBpbgorICogc2FwX2N0eCBzdHJ1Y3QuIEl0IGFsc28gaW5jcmVhc2VzIHRoZSB3ZWlnaHRzIG9mIHRob3NlIGNoYW5uZWxzIHNvIHRoYXQKKyAqIEFDUyBsb2dpYyB3aWxsIGF2b2lkIHRob3NlIGNoYW5uZWxzIGluIGl0cyBzZWxlY3Rpb24gYWxnb3JpdGhtLgorICoKKyAqIFJldHVybjogdm9pZAorICovCit2b2lkIHNhcF9wcm9jZXNzX2F2b2lkX2llKHRIYWxIYW5kbGUgaGFsLAorCQkJICBwdFNhcENvbnRleHQgc2FwX2N0eCwKKwkJCSAgdFNjYW5SZXN1bHRIYW5kbGUgc2Nhbl9yZXN1bHQsCisJCQkgIHRTYXBDaFNlbFNwZWN0SW5mbyAqc3BlY3RfaW5mbykKK3sKKwl1aW50MzJfdCB0b3RhbF9pZV9sZW4gPSAwOworCXVpbnQ4X3QgKnRlbXBfcHRyID0gTlVMTDsKKwl1aW50OF90IGkgPSAwOworCXN0cnVjdCBzQXZvaWRDaGFubmVsSUUgKmF2b2lkX2NoX2llOworCXRDc3JTY2FuUmVzdWx0SW5mbyAqbm9kZSA9IE5VTEw7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IE5VTEw7CisJdFNhcFNwZWN0Q2hJbmZvICpzcGVjdF9jaCA9IE5VTEw7CisKKwltYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsKTsKKwlzcGVjdF9jaCA9IHNwZWN0X2luZm8tPnBTcGVjdENoOworCW5vZGUgPSBzbWVfc2Nhbl9yZXN1bHRfZ2V0X2ZpcnN0KGhhbCwgc2Nhbl9yZXN1bHQpOworCisJd2hpbGUgKG5vZGUpIHsKKwkJdG90YWxfaWVfbGVuID0gKG5vZGUtPkJzc0Rlc2NyaXB0b3IubGVuZ3RoICsKKwkJCXNpemVvZih1aW50MTZfdCkgKyBzaXplb2YodWludDMyX3QpIC0KKwkJCXNpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pKTsKKwkJdGVtcF9wdHIgPSBjZmdfZ2V0X3ZlbmRvcl9pZV9wdHJfZnJvbV9vdWkobWFjX2N0eCwKKwkJCQlTSVJfTUFDX1FDT01fVkVORE9SX09VSSwKKwkJCQlTSVJfTUFDX1FDT01fVkVORE9SX1NJWkUsCisJCQkJKCh1aW50OF90ICopJm5vZGUtPkJzc0Rlc2NyaXB0b3IuaWVGaWVsZHMpLAorCQkJCXRvdGFsX2llX2xlbik7CisKKwkJaWYgKHRlbXBfcHRyKSB7CisJCQlhdm9pZF9jaF9pZSA9IChzdHJ1Y3Qgc0F2b2lkQ2hhbm5lbElFICopdGVtcF9wdHI7CisJCQlpZiAoYXZvaWRfY2hfaWUtPnR5cGUgIT0gUUNPTV9WRU5ET1JfSUVfTUNDX0FWT0lEX0NIKQorCQkJCWNvbnRpbnVlOworCisJCQlzYXBfY3R4LT5zYXBfZGV0ZWN0ZWRfYXZvaWRfY2hfaWUucHJlc2VudCA9IDE7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJICAiUTJRIElFIC0gYXZvaWQgY2ggJWQiLAorCQkJCSAgYXZvaWRfY2hfaWUtPmNoYW5uZWwpOworCQkJLyogYWRkIHRoaXMgY2hhbm5lbCB0byB0b19hdm9pZCBjaGFubmVsIGxpc3QgKi8KKwkJCXNhcF9jaGVja19uX2FkZF9jaGFubmVsKHNhcF9jdHgsCisJCQkJCWF2b2lkX2NoX2llLT5jaGFubmVsKTsKKwkJCXNhcF9jaGVja19uX2FkZF9vdmVybGFwcGVkX2NobmxzKHNhcF9jdHgsCisJCQkJCWF2b2lkX2NoX2llLT5jaGFubmVsKTsKKwkJCS8qCisJCQkgKiBNYXJrIHdlaWdodCBvZiB0aGVzZSBjaGFubmVsIHByZXNlbnQgaW4gSUUgdG8gTUFYCisJCQkgKiBzbyB0aGF0IEFDUyBsb2dpYyB3aWxsIHRvIGF2b2lkIHRoc2UgY2hhbm5lbHMKKwkJCSAqLworCQkJZm9yIChpID0gMDsgaSA8IHNwZWN0X2luZm8tPm51bVNwZWN0Q2hhbnM7IGkrKykKKwkJCQlpZiAoc3BlY3RfY2hbaV0uY2hOdW0gPT0gYXZvaWRfY2hfaWUtPmNoYW5uZWwpIHsKKwkJCQkJLyoKKwkJCQkJICogd2VpZ2h0IGlzIHNldCBtb3JlIHRoYW4gbWF4IHNvIHRoYXQsCisJCQkJCSAqIGluIHRoZSBjYXNlIG9mIG90aGVyIGNoYW5uZWxzIGJlaW5nCisJCQkJCSAqIGFzc2lnbmVkIG1heCB3ZWlnaHQgZHVlIHRvIG5vaXNlLAorCQkJCQkgKiB0aGV5IG1heSBiZSBwcmVmZXJyZWQgb3ZlciBjaGFubmVscworCQkJCQkgKiB3aXRoIFEyUSBJRS4KKwkJCQkJICovCisJCQkJCXNwZWN0X2NoW2ldLndlaWdodCA9IFNBUF9BQ1NfV0VJR0hUX01BWCArIDE7CisJCQkJCXNwZWN0X2NoW2ldLndlaWdodF9jb3B5ID0KKwkJCQkJCVNBUF9BQ1NfV0VJR0hUX01BWCArIDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfSAvKiBpZiAodGVtcF9wdHIpICovCisJCW5vZGUgPSBzbWVfc2Nhbl9yZXN1bHRfZ2V0X25leHQoaGFsLCBzY2FuX3Jlc3VsdCk7CisJfQorfQorI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NIX0FWT0lECisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBzYXBfdXBkYXRlX3Vuc2FmZV9jaGFubmVsX2xpc3QKKworICAgREVTQ1JJUFRJT04KKyAgICBGdW5jdGlvbiAgVW5kYXRlIHVuc2FmZSBjaGFubmVsIGxpc3QgdGFibGUKKworICAgREVQRU5ERU5DSUVTCisgICAgTkEuCisKKyAgIElOCisgICAgU2FwQ29udGV4dCBwb2ludGVyCisKKyAgIFJFVFVSTiBWQUxVRQorICAgIE5VTEwKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENPTkZJR19DTlNTCit2b2lkIHNhcF91cGRhdGVfdW5zYWZlX2NoYW5uZWxfbGlzdChwdFNhcENvbnRleHQgcFNhcEN0eCkKK3sKKwl1aW50MTZfdCBpLCBqOworCXVpbnQxNl90IHVuc2FmZV9jaGFubmVsX2xpc3RbTlVNXzIwTUhaX1JGX0NIQU5ORUxTXTsKKwl1aW50MTZfdCB1bnNhZmVfY2hhbm5lbF9jb3VudCA9IDA7CisKKwkvKiBGbHVzaCwgZGVmYXVsdCBzZXQgYWxsIGNoYW5uZWwgc2FmZSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fMjBNSFpfUkZfQ0hBTk5FTFM7IGkrKykgeworCQlzYWZlX2NoYW5uZWxzW2ldLmlzU2FmZSA9IHRydWU7CisJfQorCisJLyogVHJ5IHRvIGZpbmQgdW5zYWZlIGNoYW5uZWwgKi8KKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9TVEFfQVBfTU9ERV9ERlNfRElTQUJMRSkgfHwgXAorCWRlZmluZWQoV0xBTl9GRUFUVVJFX01CU1NJRCkKKwlmb3IgKGkgPSAwOyBpIDwgTlVNXzIwTUhaX1JGX0NIQU5ORUxTOyBpKyspIHsKKwkJaWYgKHBTYXBDdHgtPmRmc19jaF9kaXNhYmxlID09IHRydWUpIHsKKwkJCWlmIChDRFNfSVNfREZTX0NIKHNhZmVfY2hhbm5lbHNbaV0uY2hhbm5lbE51bWJlcikpIHsKKwkJCQlzYWZlX2NoYW5uZWxzW2ldLmlzU2FmZSA9IGZhbHNlOworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkJIiVzOiBERlMgQ2ggJWQgaXMgbm90IHNhZmUgaW4iCisJCQkJCSIgQ29uY3VycmVudCBtb2RlIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCXNhZmVfY2hhbm5lbHNbaV0uY2hhbm5lbE51bWJlcik7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCWNuc3NfZ2V0X3dsYW5fdW5zYWZlX2NoYW5uZWwodW5zYWZlX2NoYW5uZWxfbGlzdCwKKwkJCQkgICAgICZ1bnNhZmVfY2hhbm5lbF9jb3VudCwKKwkJCQkgICAgIHNpemVvZih1bnNhZmVfY2hhbm5lbF9saXN0KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdW5zYWZlX2NoYW5uZWxfY291bnQ7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgTlVNXzIwTUhaX1JGX0NIQU5ORUxTOyBqKyspIHsKKwkJCWlmIChzYWZlX2NoYW5uZWxzW2pdLmNoYW5uZWxOdW1iZXIgPT0KKwkJCSAgICB1bnNhZmVfY2hhbm5lbF9saXN0W2ldKSB7CisJCQkJLyogRm91bmQgdW5zYWZlIGNoYW5uZWwsIHVwZGF0ZSBpdCAqLworCQkJCXNhZmVfY2hhbm5lbHNbal0uaXNTYWZlID0gZmFsc2U7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTCgiQ0ggJWQgaXMgbm90IHNhZmUiKSwKKwkJCQkJICB1bnNhZmVfY2hhbm5lbF9saXN0W2ldKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybjsKK30KKyNlbHNlCit2b2lkIHNhcF91cGRhdGVfdW5zYWZlX2NoYW5uZWxfbGlzdChwdFNhcENvbnRleHQgcFNhcEN0eCkKK3sKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOb3QgaW1wbGVtZW50ZWQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgc2FwX2NsZWFudXBfY2hhbm5lbF9saXN0CisKKyAgIERFU0NSSVBUSU9OCisgICAgRnVuY3Rpb24gc2FwX2NsZWFudXBfY2hhbm5lbF9saXN0IGZyZWVzIHVwIHRoZSBtZW1vcnkgYWxsb2NhdGVkIHRvIHRoZSBjaGFubmVsIGxpc3QuCisKKyAgIERFUEVOREVOQ0lFUworICAgIE5BLgorCisgICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIE5VTEwKKworICAgUkVUVVJOIFZBTFVFCisgICAgTlVMTAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgc2FwX2NsZWFudXBfY2hhbm5lbF9saXN0KAorI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwl2b2lkICpwX2Nkc19nY3R4CisjZWxzZQorCXZvaWQKKyNlbmRpZgorCSkgeworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJdm9pZCAqcF9jZHNfZ2N0eCA9IGNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKTsKKyNlbmRpZgorCXB0U2FwQ29udGV4dCBwU2FwQ3R4OworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiQ2xlYW5pbmcgdXAgdGhlIGNoYW5uZWwgbGlzdCBzdHJ1Y3R1cmUiKTsKKworCWlmIChOVUxMID09IHBfY2RzX2djdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICJTQVAgR2xvYmFsIENvbnRleHQgaXMgTlVMTCIpOworCQlyZXR1cm47CisJfQorCisJcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBfY2RzX2djdHgpOworCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICJTQVAgQ29udGV4dCBpcyBOVUxMIik7CisJCXJldHVybjsKKwl9CisKKwlwU2FwQ3R4LT5TYXBDaG5sTGlzdC5udW1DaGFubmVsID0gMDsKKwlpZiAocFNhcEN0eC0+U2FwQ2hubExpc3QuY2hhbm5lbExpc3QpIHsKKwkJY2RmX21lbV9mcmVlKHBTYXBDdHgtPlNhcENobmxMaXN0LmNoYW5uZWxMaXN0KTsKKwkJcFNhcEN0eC0+U2FwQ2hubExpc3QuY2hhbm5lbExpc3QgPSBOVUxMOworCX0KKworCXBTYXBDdHgtPlNhcEFsbENobmxMaXN0Lm51bUNoYW5uZWwgPSAwOworCWlmIChwU2FwQ3R4LT5TYXBBbGxDaG5sTGlzdC5jaGFubmVsTGlzdCkgeworCQljZGZfbWVtX2ZyZWUocFNhcEN0eC0+U2FwQWxsQ2hubExpc3QuY2hhbm5lbExpc3QpOworCQlwU2FwQ3R4LT5TYXBBbGxDaG5sTGlzdC5jaGFubmVsTGlzdCA9IE5VTEw7CisJfQorfQorCisvKioKKyAqIHNhcF9zZWxlY3RfcHJlZmVycmVkX2NoYW5uZWxfZnJvbV9jaGFubmVsX2xpc3QoKSAtIHRvIGNhbGMgYmVzdCBjYWhubmVsCisgKiBAYmVzdF9jaG5sOiBiZXN0IGNoYW5uZWwgYWxyZWFkeSBjYWxjdWxhdGVkIGFtb25nIGFsbCB0aGUgY2hhbmVscworICogQHNhcF9jdHg6IHNhcCBjb250ZXh0CisgKiBAc3BlY3RpbmZvX3BhcmFtOiBQb2ludGVyIHRvIHRTYXBDaFNlbFNwZWN0SW5mbyBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGJlc3QgY2hhbm5lbCBhbW9uZyB0aGUgY29uZmlndXJlZCBjaGFubmVsIGxpc3QuCisgKiBJZiBjaGFubmVsIGxpc3Qgbm90IGNvbmZpZ3VyZWQgdGhlbiByZXR1cm5zIHRoZSBiZXN0IGNoYW5uZWwgY2FsY3VsYXRlZAorICogYW1vbmcgYWxsIHRoZSBjaGFubmVsIGxpc3QuCisgKgorICogUmV0dXJuOiB1aW50OF90IGJlc3QgY2hhbm5lbAorICovCit1aW50OF90IHNhcF9zZWxlY3RfcHJlZmVycmVkX2NoYW5uZWxfZnJvbV9jaGFubmVsX2xpc3QodWludDhfdCBiZXN0X2NobmwsCisJCQkJcHRTYXBDb250ZXh0IHNhcF9jdHgsCisJCQkJdFNhcENoU2VsU3BlY3RJbmZvICpzcGVjdGluZm9fcGFyYW0pCit7CisJdWludDhfdCBpID0gMDsKKworCS8qCisJICogSWYgQ2hhbm5lbCBMaXN0IGlzIG5vdCBDb25maWd1cmVkIGRvbid0IGRvIGFueXRoaW5nCisJICogRWxzZSByZXR1cm4gdGhlIEJlc3QgQ2hhbm5lbCBmcm9tIHRoZSBDaGFubmVsIExpc3QKKwkgKi8KKwlpZiAoKE5VTEwgPT0gc2FwX2N0eC0+YWNzX2NmZy0+Y2hfbGlzdCkgfHwKKwkJKE5VTEwgPT0gc3BlY3RpbmZvX3BhcmFtKSB8fAorCQkoMCA9PSBzYXBfY3R4LT5hY3NfY2ZnLT5jaF9saXN0X2NvdW50KSkKKwkJcmV0dXJuIGJlc3RfY2hubDsKKworCWlmIChiZXN0X2NobmwgPD0gMCB8fCBiZXN0X2NobmwgPiAyNTIpCisJCXJldHVybiBTQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQ7CisKKwkvKiBTZWxlY3QgdGhlIGJlc3QgY2hhbm5lbCBmcm9tIGFsbG93ZWQgbGlzdCAqLworCWZvciAoaSA9IDA7IGkgPCBzYXBfY3R4LT5hY3NfY2ZnLT5jaF9saXN0X2NvdW50OyBpKyspIHsKKwkJaWYgKHNhcF9jdHgtPmFjc19jZmctPmNoX2xpc3RbaV0gPT0gYmVzdF9jaG5sKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkiQmVzdCBjaGFubmVsIGlzOiAlZCIsCisJCQkJYmVzdF9jaG5sKTsKKwkJCXJldHVybiBiZXN0X2Nobmw7CisJCX0KKwl9CisKKwlyZXR1cm4gU0FQX0NIQU5ORUxfTk9UX1NFTEVDVEVEOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBzYXBfY2hhbl9zZWxfaW5pdAorCisgICBERVNDUklQVElPTgorICAgIEZ1bmN0aW9uIHNhcF9jaGFuX3NlbF9pbml0IGFsbG9jYXRlcyB0aGUgbWVtb3J5LCBpbnRpYWxpemVzIHRoZQorICAgICAgICAgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBjaGFubmVsIHNlbGVjdGlvbiBhbGdvcml0aG0KKworICAgREVQRU5ERU5DSUVTCisgICAgTkEuCisKKyAgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgaGFsSGFuZGxlICAgICAgICAgIDogUG9pbnRlciB0byB0SGFsSGFuZGxlCisgICAqcFNwZWN0SW5mb1BhcmFtcyAgOiBQb2ludGVyIHRvIHRTYXBDaFNlbFNwZWN0SW5mbyBzdHJ1Y3R1cmUKKyAgICAgcFNhcEN0eCAgICAgICAgICAgOiBQb2ludGVyIHRvIFNBUCBDb250ZXh0CisKKyAgIFJFVFVSTiBWQUxVRQorICAgIGJvb2w6ICBTdWNjZXNzIG9yIEZBSUwKKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgc2FwX2NoYW5fc2VsX2luaXQodEhhbEhhbmRsZSBoYWxIYW5kbGUsCisJCSAgICAgICB0U2FwQ2hTZWxTcGVjdEluZm8gKnBTcGVjdEluZm9QYXJhbXMsIHB0U2FwQ29udGV4dCBwU2FwQ3R4KQoreworCXRTYXBTcGVjdENoSW5mbyAqcFNwZWN0Q2ggPSBOVUxMOworCXVpbnQ4X3QgKnBDaGFucyA9IE5VTEw7CisJdWludDE2X3QgY2hhbm5lbG51bSA9IDA7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhhbEhhbmRsZSk7CisJYm9vbCBjaFNhZmUgPSB0cnVlOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAorCXVpbnQxNl90IGk7CisjZW5kaWYKKwl1aW50MzJfdCBkZnNfbWFzdGVyX2NhcF9lbmFibGVkOworCWJvb2wgaW5jbHVkZV9kZnNfY2ggPSB0cnVlOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMiLAorCQkgIF9fZnVuY19fKTsKKworCXBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnMgPQorCQlwTWFjLT5zY2FuLmJhc2VfY2hhbm5lbHMubnVtQ2hhbm5lbHM7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHdlaWdodCBjb21wdXRhdGlvbiBvZiAyLjRHSHogKi8KKwlwU3BlY3RDaCA9CisJCSh0U2FwU3BlY3RDaEluZm8gKikgY2RmX21lbV9tYWxsb2MoKHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnMpCisJCQkJCQkgICAqIHNpemVvZigqcFNwZWN0Q2gpKTsKKworCWlmIChwU3BlY3RDaCA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW4gJXMsIENERl9NQUxMT0NfRVJSIiwgX19mdW5jX18pOworCQlyZXR1cm4gZVNBUF9GQUxTRTsKKwl9CisKKwljZGZfbWVtX3plcm8ocFNwZWN0Q2gsCisJCSAgICAgKHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnMpICogc2l6ZW9mKCpwU3BlY3RDaCkpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgaW4gdGhlIERmc1BhcmFtcyB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeSAqLworCXBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoID0gcFNwZWN0Q2g7CisKKwlwQ2hhbnMgPSBwTWFjLT5zY2FuLmJhc2VfY2hhbm5lbHMuY2hhbm5lbExpc3Q7CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9TVEFfQVBfTU9ERV9ERlNfRElTQUJMRSkgfHwgZGVmaW5lZChXTEFOX0ZFQVRVUkVfTUJTU0lEKQorCWlmIChwU2FwQ3R4LT5kZnNfY2hfZGlzYWJsZSA9PSB0cnVlKQorCQlpbmNsdWRlX2Rmc19jaCA9IGZhbHNlOworI2VuZGlmCisJc21lX2NmZ19nZXRfaW50KGhhbEhhbmRsZSwgV05JX0NGR19ERlNfTUFTVEVSX0VOQUJMRUQsCisJCQkmZGZzX21hc3Rlcl9jYXBfZW5hYmxlZCk7CisJaWYgKGRmc19tYXN0ZXJfY2FwX2VuYWJsZWQgPT0gMCkKKwkJaW5jbHVkZV9kZnNfY2ggPSBmYWxzZTsKKworCS8qIEZpbGwgdGhlIGNoYW5uZWwgbnVtYmVyIGluIHRoZSBzcGVjdHJ1bSBpbiB0aGUgb3BlcmF0aW5nIGZyZXEgYmFuZCAqLworCWZvciAoY2hhbm5lbG51bSA9IDA7CisJICAgICBjaGFubmVsbnVtIDwgcFNwZWN0SW5mb1BhcmFtcy0+bnVtU3BlY3RDaGFuczsKKwkgICAgIGNoYW5uZWxudW0rKywgcENoYW5zKyspIHsKKwkJY2hTYWZlID0gdHJ1ZTsKKworCQkvKiBjaGVjayBpZiB0aGUgY2hhbm5lbCBpcyBpbiBOT0wgYmxhY2tsaXN0ICovCisJCWlmIChzYXBfZGZzX2lzX2NoYW5uZWxfaW5fbm9sX2xpc3QocFNhcEN0eCwgKnBDaGFucywKKwkJCQkJCSAgIFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgICJJbiAlcywgQ2ggJWQgaXMgaW4gTk9MIGxpc3QiLCBfX2Z1bmNfXywKKwkJCQkgICpwQ2hhbnMpOworCQkJY2hTYWZlID0gZmFsc2U7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpbmNsdWRlX2Rmc19jaCA9PSBmYWxzZSkgeworCQkJaWYgKENEU19JU19ERlNfQ0goKnBDaGFucykpIHsKKwkJCQljaFNhZmUgPSBmYWxzZTsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkJICAiSW4gJXMsIERGUyBDaCAlZCBub3QgY29uc2lkZXJlZCBmb3IgQUNTIiwKKwkJCQkJICBfX2Z1bmNfXywgKnBDaGFucyk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAorCQlmb3IgKGkgPSAwOyBpIDwgTlVNXzIwTUhaX1JGX0NIQU5ORUxTOyBpKyspIHsKKwkJCWlmICgoc2FmZV9jaGFubmVsc1tpXS5jaGFubmVsTnVtYmVyID09ICpwQ2hhbnMpICYmCisJCQkgICAgKGZhbHNlID09IHNhZmVfY2hhbm5lbHNbaV0uaXNTYWZlKSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCQkgICJJbiAlcywgQ2ggJWQgaXMgbm90IHNhZmUiLCBfX2Z1bmNfXywKKwkJCQkJICAqcENoYW5zKTsKKwkJCQljaFNhZmUgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DSF9BVk9JRCAqLworCisJCS8qIE9GRE0gcmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gY2hhbm5lbCAxNCAqLworCQlpZiAoKnBDaGFucyA9PSAxNCAmJgorCQkgICAgZUNTUl9ET1QxMV9NT0RFXzExYiAhPSBwU2FwQ3R4LT5jc3Jfcm9hbVByb2ZpbGUucGh5TW9kZSkgeworCQkJcFNwZWN0Q2grKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHRydWUgPT0gY2hTYWZlKSB7CisJCQlwU3BlY3RDaC0+Y2hOdW0gPSAqcENoYW5zOworCQkJcFNwZWN0Q2gtPnZhbGlkID0gZVNBUF9UUlVFOworCQkJcFNwZWN0Q2gtPnJzc2lBZ3IgPSBTT0ZUQVBfTUlOX1JTU0k7ICAgIC8qIEluaXRpYWxpc2UgZm9yIGFsbCBjaGFubmVscyAqLworCQkJcFNwZWN0Q2gtPmNoYW5uZWxXaWR0aCA9IFNPRlRBUF9IVDIwX0NIQU5ORUxXSURUSDsgICAgICAvKiBJbml0aWFsaXNlIDIwTUh6IGZvciBhbGwgdGhlIENoYW5uZWxzICovCisJCX0KKwkJcFNwZWN0Q2grKzsKKwl9CisJcmV0dXJuIGVTQVBfVFJVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgc2Fwd2VpZ2h0X3Jzc2lfY291bnQKKworICAgREVTQ1JJUFRJT04KKyAgICBGdW5jdGlvbiB3ZWlnaHRSc3NpQ291bnQgY2FsY3VsYXRlcyB0aGUgY2hhbm5lbCB3ZWlnaHQgZHVlIHRvIHJzc2kKKyAgICAgICAgIGFuZCBkYXRhIGNvdW50KGhlcmUgbnVtYmVyIG9mIEJTUyBvYnNlcnZlZCkKKworICAgREVQRU5ERU5DSUVTCisgICAgTkEuCisKKyAgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcnNzaSAgICAgICAgOiBNYXggc2lnbmFsIHN0cmVuZ3RoIHJlY2VpZXZlZCBmcm9tIGEgQlNTIGZvciB0aGUgY2hhbm5lbAorICAgIGNvdW50ICAgICAgIDogTnVtYmVyIG9mIEJTUyBvYnNlcnZlZCBpbiB0aGUgY2hhbm5lbAorCisgICBSRVRVUk4gVkFMVUUKKyAgICB1aW50MzJfdCAgICAgOiBDYWxjdWxhdGVkIGNoYW5uZWwgd2VpZ2h0IGJhc2VkIG9uIGFib3ZlIHR3bworCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3Qgc2Fwd2VpZ2h0X3Jzc2lfY291bnQoaW50OF90IHJzc2ksIHVpbnQxNl90IGNvdW50KQoreworCWludDMyX3QgcnNzaVdlaWdodCA9IDA7CisJaW50MzJfdCBjb3VudFdlaWdodCA9IDA7CisJdWludDMyX3QgcnNzaWNvdW50V2VpZ2h0ID0gMDsKKworCS8qIFdlaWdodCBmcm9tIFJTU0kgKi8KKwlyc3NpV2VpZ2h0ID0gU09GVEFQX1JTU0lfV0VJR0hUICogKHJzc2kgLSBTT0ZUQVBfTUlOX1JTU0kpCisJCSAgICAgLyAoU09GVEFQX01BWF9SU1NJIC0gU09GVEFQX01JTl9SU1NJKTsKKworCWlmIChyc3NpV2VpZ2h0ID4gU09GVEFQX1JTU0lfV0VJR0hUKQorCQlyc3NpV2VpZ2h0ID0gU09GVEFQX1JTU0lfV0VJR0hUOworCWVsc2UgaWYgKHJzc2lXZWlnaHQgPCAwKQorCQlyc3NpV2VpZ2h0ID0gMDsKKworCS8qIFdlaWdodCBmcm9tIGRhdGEgY291bnQgKi8KKwljb3VudFdlaWdodCA9IFNPRlRBUF9DT1VOVF9XRUlHSFQgKiAoY291bnQgLSBTT0ZUQVBfTUlOX0NPVU5UKQorCQkgICAgICAvIChTT0ZUQVBfTUFYX0NPVU5UIC0gU09GVEFQX01JTl9DT1VOVCk7CisKKwlpZiAoY291bnRXZWlnaHQgPiBTT0ZUQVBfQ09VTlRfV0VJR0hUKQorCQljb3VudFdlaWdodCA9IFNPRlRBUF9DT1VOVF9XRUlHSFQ7CisKKwlyc3NpY291bnRXZWlnaHQgPSByc3NpV2VpZ2h0ICsgY291bnRXZWlnaHQ7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIkluICVzLCByc3NpV2VpZ2h0PSVkLCBjb3VudFdlaWdodD0lZCwgcnNzaWNvdW50V2VpZ2h0PSVkIiwKKwkJICBfX2Z1bmNfXywgcnNzaVdlaWdodCwgY291bnRXZWlnaHQsIHJzc2ljb3VudFdlaWdodCk7CisKKwlyZXR1cm4gcnNzaWNvdW50V2VpZ2h0OworfQorCisvKioKKyAqIHNhcF91cGRhdGVfcnNzaV9ic3Njb3VudCgpIC0gdXBkYXRlcyBic3MgY291bnQgYW5kIHJzc2kgZWZmZWN0LgorICoKKyAqIEBwU3BlY3RDaDogICAgIENoYW5uZWwgSW5mb3JtYXRpb24KKyAqIEBvZmZzZXQ6ICAgICAgIENoYW5uZWwgT2Zmc2V0CisgKiBAc2FwXzI0ZzogICAgICBDaGFubmVsIGlzIGluIDIuNEcgb3IgNUcKKyAqCisgKiBzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQgdXBkYXRlcyBic3MgY291bnQgYW5kIHJzc2kgZWZmZWN0IGJhc2VkCisgKiBvbiB0aGUgY2hhbm5lbCBvZmZzZXQuCisgKgorICogUmV0dXJuOiBOb25lLgorICovCisKK3ZvaWQgc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHRTYXBTcGVjdENoSW5mbyAqcFNwZWN0Q2gsIGludDMyX3Qgb2Zmc2V0LAorCQkJICAgICAgYm9vbCBzYXBfMjRnKQoreworCXRTYXBTcGVjdENoSW5mbyAqcEV4dFNwZWN0Q2ggPSBOVUxMOworCWludDMyX3QgcnNzaSwgcnNzc2lfZWZmZWN0OworCisJcEV4dFNwZWN0Q2ggPSAocFNwZWN0Q2ggKyBvZmZzZXQpOworCWlmIChwRXh0U3BlY3RDaCAhPSBOVUxMKSB7CisJCSsrcEV4dFNwZWN0Q2gtPmJzc0NvdW50OworCQlzd2l0Y2ggKG9mZnNldCkgeworCQljYXNlIC0xOgorCQljYXNlIDE6CisJCQlyc3NzaV9lZmZlY3QgPSBzYXBfMjRnID8KKwkJCSAgICBTQVBfMjRHSFpfRklSU1RfT1ZFUkxBUF9DSEFOX1JTU0lfRUZGRUNUX1BSSU1BUlkgOgorCQkJICAgIFNBUF9TVUJCQU5EMV9SU1NJX0VGRkVDVF9QUklNQVJZOworCQkJYnJlYWs7CisJCWNhc2UgLTI6CisJCWNhc2UgMjoKKwkJCXJzc3NpX2VmZmVjdCA9IHNhcF8yNGcgPworCQkJICAgIFNBUF8yNEdIWl9TRUNfT1ZFUkxBUF9DSEFOX1JTU0lfRUZGRUNUX1BSSU1BUlkgOgorCQkJICAgIFNBUF9TVUJCQU5EMl9SU1NJX0VGRkVDVF9QUklNQVJZOworCQkJYnJlYWs7CisJCWNhc2UgLTM6CisJCWNhc2UgMzoKKwkJCXJzc3NpX2VmZmVjdCA9IHNhcF8yNGcgPworCQkJICAgIFNBUF8yNEdIWl9USElSRF9PVkVSTEFQX0NIQU5fUlNTSV9FRkZFQ1RfUFJJTUFSWSA6CisJCQkgICAgU0FQX1NVQkJBTkQzX1JTU0lfRUZGRUNUX1BSSU1BUlk7CisJCQlicmVhazsKKwkJY2FzZSAtNDoKKwkJY2FzZSA0OgorCQkJcnNzc2lfZWZmZWN0ID0KKwkJCSAgICBTQVBfMjRHSFpfRk9VUlRIX09WRVJMQVBfQ0hBTl9SU1NJX0VGRkVDVF9QUklNQVJZOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyc3NzaV9lZmZlY3QgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlyc3NpID0gcFNwZWN0Q2gtPnJzc2lBZ3IgKyByc3NzaV9lZmZlY3Q7CisJCWlmIChJU19SU1NJX1ZBTElEKHBFeHRTcGVjdENoLT5yc3NpQWdyLCByc3NpKSkKKwkJCXBFeHRTcGVjdENoLT5yc3NpQWdyID0gcnNzaTsKKwkJaWYgKHBFeHRTcGVjdENoLT5yc3NpQWdyIDwgU09GVEFQX01JTl9SU1NJKQorCQkJcEV4dFNwZWN0Q2gtPnJzc2lBZ3IgPSBTT0ZUQVBfTUlOX1JTU0k7CisJfQorfQorCisvKioKKyAqIHNhcF91cGRfY2hhbl9zcGVjX3BhcmFtcygpIC0gc2FwX3VwZF9jaGFuX3NwZWNfcGFyYW1zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMgY2hhbm5lbCBwYXJhbWV0ZXJzIG9idGFpbmVkIGZyb20gQmVhY29uCisgKiBAcEJlYWNvblN0cnVjdCBCZWFjb24gc3RydWN1dHJlIHBvcHVsYXRlZCBieSBwYXJzZV9iZWFjb24gZnVuY3Rpb24KKyAqIEBjaGFubmVsV2lkdGggQ2hhbm5lbCB3aWR0aAorICogQHNlY29uZGFyeUNoYW5uZWxPZmZzZXQgU2Vjb25kYXJ5IENoYW5uZWwgT2Zmc2V0CisgKiBAdmh0U3VwcG9ydCBJZiBjaGFubmVsIHN1cHBvcnRzIFZIVAorICogQGNlbnRlckZyZXEgQ2VudHJhbCBmcmVxdWVuY3kgZm9yIHRoZSBnaXZlbiBjaGFubmVsLgorICoKKyAqIHNhcF91cGRfY2hhbl9zcGVjX3BhcmFtcyB1cGRhdGVzIHRoZSBzcGVjdHJ1bSBjaGFubmVscyBiYXNlZCBvbiB0aGUKKyAqIHBCZWFjb25TdHJ1Y3Qgb2J0YWluZWQgZnJvbSBCZWFjb24gSUUKKyAqCisgKiBSZXR1cm46IE5BLgorICovCisKK3ZvaWQgc2FwX3VwZF9jaGFuX3NwZWNfcGFyYW1zKHRTaXJQcm9iZVJlc3BCZWFjb24gKnBCZWFjb25TdHJ1Y3QsCisJCQkgICAgICB1aW50MTZfdCAqY2hhbm5lbFdpZHRoLAorCQkJICAgICAgdWludDE2X3QgKnNlY29uZGFyeUNoYW5uZWxPZmZzZXQsCisJCQkgICAgICB1aW50MTZfdCAqdmh0U3VwcG9ydCwKKwkJCSAgICAgIHVpbnQxNl90ICpjZW50ZXJGcmVxKQoreworCWlmIChOVUxMID09IHBCZWFjb25TdHJ1Y3QpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJwQmVhY29uU3RydWN0IGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEJlYWNvblN0cnVjdC0+SFRDYXBzLnByZXNlbnQgJiYgcEJlYWNvblN0cnVjdC0+SFRJbmZvLnByZXNlbnQpIHsKKwkJKmNoYW5uZWxXaWR0aCA9IHBCZWFjb25TdHJ1Y3QtPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJCSpzZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gcEJlYWNvblN0cnVjdC0+SFRJbmZvLgorCQkJCQkJc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKworCQlpZiAocEJlYWNvblN0cnVjdC0+VkhUT3BlcmF0aW9uLnByZXNlbnQpIHsKKwkJCSp2aHRTdXBwb3J0ID0gcEJlYWNvblN0cnVjdC0+VkhUT3BlcmF0aW9uLnByZXNlbnQ7CisJCQlpZiAocEJlYWNvblN0cnVjdC0+VkhUT3BlcmF0aW9uLmNoYW5XaWR0aCA+CisJCQkgICAgV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF8yMF80ME1IWikgeworCQkJCSpjaGFubmVsV2lkdGggPSBlSFRfQ0hBTk5FTF9XSURUSF84ME1IWjsKKwkJCQkqY2VudGVyRnJlcSA9IHBCZWFjb25TdHJ1Y3QtPlZIVE9wZXJhdGlvbi4KKwkJCQkJCQljaGFuQ2VudGVyRnJlcVNlZzE7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogc2FwX2ludGVyZmVyZW5jZV9yc3NpX2NvdW50XzVHKCkgLSBzYXBfaW50ZXJmZXJlbmNlX3Jzc2lfY291bnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2lkZXJzIHRoZSBBZGphY2VudCBjaGFubmVsIHJzc2kgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgY291bnQoaGVyZSBudW1iZXIgb2YgQlNTIG9ic2VydmVkKQorICogQHNwZWN0X2NoOiAgICAgICAgQ2hhbm5lbCBJbmZvcm1hdGlvbgorICogQGNoYW5fd2lkdGg6ICAgICAgQ2hhbm5lbCB3aWR0aCBwYXJzZWQgZnJvbSBiZWFjb24gSUUKKyAqIEBzZWNfY2hhbl9vZmZzZXQ6IFNlY29uZGFyeSBDaGFubmVsIE9mZnNldAorICogQGNlbnRlcl9mcmVxOiAgICAgQ2VudHJhbCBmcmVxdWVuY3kgZm9yIHRoZSBnaXZlbiBjaGFubmVsLgorICogQGNoYW5uZWxfaWQ6ICAgICAgY2hhbm5lbF9pZAorICoKKyAqIHNhcF9pbnRlcmZlcmVuY2VfcnNzaV9jb3VudF81RyBjb25zaWRlcnMgdGhlIEFkamFjZW50IGNoYW5uZWwgcnNzaQorICogYW5kIGRhdGEgY291bnQoaGVyZSBudW1iZXIgb2YgQlNTIG9ic2VydmVkKQorICoKKyAqIFJldHVybjogTkEuCisgKi8KKwordm9pZCBzYXBfaW50ZXJmZXJlbmNlX3Jzc2lfY291bnRfNUcodFNhcFNwZWN0Q2hJbmZvICpzcGVjdF9jaCwKKwkJCQkgdWludDE2X3QgY2hhbl93aWR0aCwKKwkJCQkgdWludDE2X3Qgc2VjX2NoYW5fb2Zmc2V0LAorCQkJCSB1aW50MTZfdCBjZW50ZXJfZnJlcSwgdWludDhfdCBjaGFubmVsX2lkKQoreworCWlmIChOVUxMID09IHNwZWN0X2NoKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgic3BlY3RfY2ggaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFVwZGF0aW5nIHRoZSByZWNlaXZlZCBDaGFubmVsV2lkdGggKi8KKwlpZiAoc3BlY3RfY2gtPmNoYW5uZWxXaWR0aCAhPSBjaGFuX3dpZHRoKQorCQlzcGVjdF9jaC0+Y2hhbm5lbFdpZHRoID0gY2hhbl93aWR0aDsKKwkvKiBJZiByZWNlaXZlZCBDaGFubmVsV2lkdGggaXMgb3RoZXIgdGhhbiBIVDIwLAorCSAqIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBleHRlbnNpb24gY2hhbm5lbCBQYXJhbXMgYXMgd2VsbAorCSAqIGNoYW5fd2lkdGggPT0gMCwgSFQyMAorCSAqIGNoYW5fd2lkdGggPT0gMSwgSFQ0MAorCSAqIGNoYW5fd2lkdGggPT0gMiwgVkhUODAKKwkgKi8KKworCXN3aXRjaCAoc3BlY3RfY2gtPmNoYW5uZWxXaWR0aCkgeworCWNhc2UgZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFo6ICAgLyogSFQ0MCAqLworCQlzd2l0Y2ggKHNlY19jaGFuX29mZnNldCkgeworCQkvKiBBYm92ZSB0aGUgUHJpbWFyeSBDaGFubmVsICovCisJCWNhc2UgUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZOgorCQkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAxLCBmYWxzZSk7CisJCQlicmVhazsKKworCQkvKiBCZWxvdyB0aGUgUHJpbWFyeSBjaGFubmVsICovCisJCWNhc2UgUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWToKKwkJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgLTEsIGZhbHNlKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgZUhUX0NIQU5ORUxfV0lEVEhfODBNSFo6ICAgLyogVkhUODAgKi8KKwkJaWYgKChjZW50ZXJfZnJlcSAtIGNoYW5uZWxfaWQpID09IDYpIHsKKwkJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgMSwgZmFsc2UpOworCQkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAyLCBmYWxzZSk7CisJCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIDMsIGZhbHNlKTsKKwkJfSBlbHNlIGlmICgoY2VudGVyX2ZyZXEgLSBjaGFubmVsX2lkKSA9PSAyKSB7CisJCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0xLCBmYWxzZSk7CisJCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIDEsIGZhbHNlKTsKKwkJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgMiwgZmFsc2UpOworCQl9IGVsc2UgaWYgKChjZW50ZXJfZnJlcSAtIGNoYW5uZWxfaWQpID09IC0yKSB7CisJCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0yLCBmYWxzZSk7CisJCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0xLCBmYWxzZSk7CisJCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIDEsIGZhbHNlKTsKKwkJfSBlbHNlIGlmICgoY2VudGVyX2ZyZXEgLSBjaGFubmVsX2lkKSA9PSAtNikgeworCQkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAtMSwgZmFsc2UpOworCQkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAtMiwgZmFsc2UpOworCQkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAtMywgZmFsc2UpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBzYXBfaW50ZXJmZXJlbmNlX3Jzc2lfY291bnQoKSAtIHNhcF9pbnRlcmZlcmVuY2VfcnNzaV9jb3VudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zaWRlcnMgdGhlIEFkamFjZW50IGNoYW5uZWwgcnNzaQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZGF0YSBjb3VudChoZXJlIG51bWJlciBvZiBCU1Mgb2JzZXJ2ZWQpCisgKiBAc3BlY3RfY2ggICAgQ2hhbm5lbCBJbmZvcm1hdGlvbgorICoKKyAqIHNhcF9pbnRlcmZlcmVuY2VfcnNzaV9jb3VudCBjb25zaWRlcnMgdGhlIEFkamFjZW50IGNoYW5uZWwgcnNzaQorICogYW5kIGRhdGEgY291bnQoaGVyZSBudW1iZXIgb2YgQlNTIG9ic2VydmVkKQorICoKKyAqIFJldHVybjogTm9uZS4KKyAqLworCit2b2lkIHNhcF9pbnRlcmZlcmVuY2VfcnNzaV9jb3VudCh0U2FwU3BlY3RDaEluZm8gKnNwZWN0X2NoKQoreworCWlmIChOVUxMID09IHNwZWN0X2NoKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHNwZWN0X2NoIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHNwZWN0X2NoLT5jaE51bSkgeworCWNhc2UgQ0hBTk5FTF8xOgorCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIDEsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIDIsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIDMsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIDQsIHRydWUpOworCQlicmVhazsKKworCWNhc2UgQ0hBTk5FTF8yOgorCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0xLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAxLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAyLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAzLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCA0LCB0cnVlKTsKKwkJYnJlYWs7CisJY2FzZSBDSEFOTkVMXzM6CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgLTIsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0xLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAxLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAyLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAzLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCA0LCB0cnVlKTsKKwkJYnJlYWs7CisJY2FzZSBDSEFOTkVMXzQ6CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgLTMsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0yLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAtMSwgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgMSwgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgMiwgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgMywgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgNCwgdHJ1ZSk7CisJCWJyZWFrOworCisJY2FzZSBDSEFOTkVMXzU6CisJY2FzZSBDSEFOTkVMXzY6CisJY2FzZSBDSEFOTkVMXzc6CisJY2FzZSBDSEFOTkVMXzg6CisJY2FzZSBDSEFOTkVMXzk6CisJY2FzZSBDSEFOTkVMXzEwOgorCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC00LCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAtMywgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgLTIsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0xLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAxLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAyLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAzLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCA0LCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIENIQU5ORUxfMTE6CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgLTQsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0zLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAtMiwgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgLTEsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIDEsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIDIsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIDMsIHRydWUpOworCQlicmVhazsKKworCWNhc2UgQ0hBTk5FTF8xMjoKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAtNCwgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgLTMsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0yLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAtMSwgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgMSwgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgMiwgdHJ1ZSk7CisJCWJyZWFrOworCisJY2FzZSBDSEFOTkVMXzEzOgorCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC00LCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAtMywgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgLTIsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0xLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAxLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIENIQU5ORUxfMTQ6CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgLTQsIHRydWUpOworCQlzYXBfdXBkYXRlX3Jzc2lfYnNzY291bnQoc3BlY3RfY2gsIC0zLCB0cnVlKTsKKwkJc2FwX3VwZGF0ZV9yc3NpX2Jzc2NvdW50KHNwZWN0X2NoLCAtMiwgdHJ1ZSk7CisJCXNhcF91cGRhdGVfcnNzaV9ic3Njb3VudChzcGVjdF9jaCwgLTEsIHRydWUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGdW5jdGlvbiAgICBjaF9pbl9wY2wKKworICBEZXNjcmlwdGlvbgorICAgQ2hlY2sgaWYgYSBjaGFubmVsIGlzIGluIHRoZSBwcmVmZXJyZWQgY2hhbm5lbCBsaXN0CisKKyAgUGFyYW1ldGVycworICAgc2FwX2N0eCAgIFNBUCBjb250ZXh0IHBvaW50ZXIKKyAgIGNoYW5uZWwgICBpbnB1dCBjaGFubmVsIG51bWJlcgorCisgIFJldHVybiBWYWx1ZQorICAgdHJ1ZTogICAgY2hhbm5lbCBpcyBpbiBQQ0wKKyAgIGZhbHNlOiAgIGNoYW5uZWwgaXMgbm90IGluIFBDTAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgY2hfaW5fcGNsKHB0U2FwQ29udGV4dCBzYXBfY3R4LCB1aW50OF90IGNoYW5uZWwpCit7CisJdWludDMyX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzYXBfY3R4LT5hY3NfY2ZnLT5wY2xfY2hfY291bnQ7IGkrKykgeworCQlpZiAoY2hhbm5lbCA9PSBzYXBfY3R4LT5hY3NfY2ZnLT5wY2xfY2hhbm5lbHNbaV0pCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICAgIHNhcF9jb21wdXRlX3NwZWN0X3dlaWdodAorCisgICBERVNDUklQVElPTgorICAgIE1haW4gZnVuY3Rpb24gZm9yIGNvbXB1dGluZyB0aGUgd2VpZ2h0IG9mIGVhY2ggY2hhbm5lbCBpbiB0aGUKKyAgICBzcGVjdHJ1bSBiYXNlZCBvbiB0aGUgUlNTSSB2YWx1ZSBvZiB0aGUgQlNTZXMgb24gdGhlIGNoYW5uZWwKKyAgICBhbmQgbnVtYmVyIG9mIEJTUworCisgICBERVBFTkRFTkNJRVMKKyAgICBOQS4KKworICAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwU3BlY3RJbmZvUGFyYW1zICAgICAgIDogUG9pbnRlciB0byB0aGUgdFNwZWN0SW5mb1BhcmFtcyBzdHJ1Y3R1cmUKKyAgICBoYWxIYW5kbGUgICAgICAgICAgICAgIDogUG9pbnRlciB0byBIQUwgaGFuZGxlCisgICAgcFJlc3VsdCAgICAgICAgICAgICAgICA6IFBvaW50ZXIgdG8gdFNjYW5SZXN1bHRIYW5kbGUKKworICAgUkVUVVJOIFZBTFVFCisgICAgdm9pZCAgICAgOiBOVUxMCisKKyAgIFNJREUgRUZGRUNUUworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIHNhcF9jb21wdXRlX3NwZWN0X3dlaWdodCh0U2FwQ2hTZWxTcGVjdEluZm8gKnBTcGVjdEluZm9QYXJhbXMsCisJCQkgICAgICB0SGFsSGFuZGxlIGhhbEhhbmRsZSwgdFNjYW5SZXN1bHRIYW5kbGUgcFJlc3VsdCwKKwkJCQlwdFNhcENvbnRleHQgc2FwX2N0eCkKK3sKKwlpbnQ4X3QgcnNzaSA9IDA7CisJdWludDhfdCBjaG5fbnVtID0gMDsKKwl1aW50OF90IGNoYW5uZWxfaWQgPSAwOworCisJdENzclNjYW5SZXN1bHRJbmZvICpwU2NhblJlc3VsdDsKKwl0U2FwU3BlY3RDaEluZm8gKnBTcGVjdENoID0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2g7CisJdWludDMyX3Qgb3BlcmF0aW5nQmFuZDsKKwl1aW50MTZfdCBjaGFubmVsV2lkdGg7CisJdWludDE2X3Qgc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwl1aW50MTZfdCBjZW50ZXJGcmVxOworCXVpbnQxNl90IHZodFN1cHBvcnQ7CisJdWludDMyX3QgaWVMZW4gPSAwOworCXRTaXJQcm9iZVJlc3BCZWFjb24gKnBCZWFjb25TdHJ1Y3Q7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgaGFsSGFuZGxlOworCisJcEJlYWNvblN0cnVjdCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyUHJvYmVSZXNwQmVhY29uKSk7CisJaWYgKE5VTEwgPT0gcEJlYWNvblN0cnVjdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGluIHNhcF9jb21wdXRlX3NwZWN0X3dlaWdodFxuIik7CisJCXJldHVybjsKKwl9CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJJbiAlcywgQ29tcHV0aW5nIHNwZWN0cmFsIHdlaWdodCIsIF9fZnVuY19fKTsKKworCS8qKgorCSAqIFNvZnQgQVAgc3BlY2lmaWMgY2hhbm5lbCB3ZWlnaHQgY2FsY3VsYXRpb24gdXNpbmcgREZTIGZvcm11bGEKKwkgKi8KKwlTRVRfQUNTX0JBTkQob3BlcmF0aW5nQmFuZCwgc2FwX2N0eCk7CisKKwlwU2NhblJlc3VsdCA9IHNtZV9zY2FuX3Jlc3VsdF9nZXRfZmlyc3QoaGFsSGFuZGxlLCBwUmVzdWx0KTsKKworCXdoaWxlIChwU2NhblJlc3VsdCkgeworCQlwU3BlY3RDaCA9IHBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoOworCQkvKiBEZWZpbmluZyB0aGUgZGVmYXVsdCB2YWx1ZXMsIHNvIHRoYXQgYW55IHZhbHVlIHdpbGwgaG9sZCB0aGUgZGVmYXVsdCB2YWx1ZXMgKi8KKwkJY2hhbm5lbFdpZHRoID0gZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFo7CisJCXNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSBQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQ7CisJCXZodFN1cHBvcnQgPSAwOworCQljZW50ZXJGcmVxID0gMDsKKworCQlpZiAocFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuaWVGaWVsZHMgIT0gTlVMTCkgeworCQkJaWVMZW4gPQorCQkJCShwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5sZW5ndGggKworCQkJCSBzaXplb2YodWludDE2X3QpICsgc2l6ZW9mKHVpbnQzMl90KSAtCisJCQkJIHNpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pKTsKKwkJCWNkZl9tZW1fc2V0KCh1aW50OF90ICopIHBCZWFjb25TdHJ1Y3QsCisJCQkJICAgIHNpemVvZih0U2lyUHJvYmVSZXNwQmVhY29uKSwgMCk7CisKKwkJCWlmICgoc2lyX3BhcnNlX2JlYWNvbl9pZQorCQkJCSAgICAgKHBNYWMsIHBCZWFjb25TdHJ1Y3QsCisJCQkJICAgICAodWludDhfdCAqKSAocFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuaWVGaWVsZHMpLAorCQkJCSAgICAgaWVMZW4pKSA9PSBlU0lSX1NVQ0NFU1MpIHsKKwkJCQlzYXBfdXBkX2NoYW5fc3BlY19wYXJhbXMocEJlYWNvblN0cnVjdCwKKwkJCQkJJmNoYW5uZWxXaWR0aCwgJnNlY29uZGFyeUNoYW5uZWxPZmZzZXQsCisJCQkJCSZ2aHRTdXBwb3J0LCAmY2VudGVyRnJlcSk7CisJCQl9CisJCX0KKwkJLyogUHJvY2Vzc2luZyBmb3IgZWFjaCB0Q3NyU2NhblJlc3VsdEluZm8gaW4gdGhlIHRDc3JTY2FuUmVzdWx0IERMaW5rIGxpc3QgKi8KKwkJZm9yIChjaG5fbnVtID0gMDsgY2huX251bSA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7CisJCSAgICAgY2huX251bSsrKSB7CisKKwkJCS8qCisJCQkgKiAgaWYgdGhlIEJlYWNvbiBoYXMgY2hhbm5lbCBJRCwgdXNlIGl0IG90aGVyIHdpc2Ugd2Ugd2lsbAorCQkJICogIHJlbHkgb24gdGhlIGNoYW5uZWxJZFNlbGYKKwkJCSAqLworCQkJaWYgKHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCA9PSAwKQorCQkJCWNoYW5uZWxfaWQgPQorCQkJCQlwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5jaGFubmVsSWRTZWxmOworCQkJZWxzZQorCQkJCWNoYW5uZWxfaWQgPQorCQkJCQlwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5jaGFubmVsSWQ7CisKKwkJCWlmIChwU3BlY3RDaCAmJiAoY2hhbm5lbF9pZCA9PSBwU3BlY3RDaC0+Y2hOdW0pKSB7CisJCQkJaWYgKHBTcGVjdENoLT5yc3NpQWdyIDwKKwkJCQkgICAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IucnNzaSkKKwkJCQkJcFNwZWN0Q2gtPnJzc2lBZ3IgPQorCQkJCQkJcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IucnNzaTsKKworCQkJCSsrcFNwZWN0Q2gtPmJzc0NvdW50OyAgIC8qIEluY3JlbWVudCB0aGUgY291bnQgb2YgQlNTICovCisKKwkJCQkvKgorCQkJCSAqIENvbm5zaWRlcmluZyB0aGUgRXh0ZW5zaW9uIENoYW5uZWwKKwkJCQkgKiBvbmx5IGluIGEgY2hhbm5lbHMKKwkJCQkgKi8KKwkJCQlzd2l0Y2ggKG9wZXJhdGluZ0JhbmQpIHsKKwkJCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWE6CisJCQkJCXNhcF9pbnRlcmZlcmVuY2VfcnNzaV9jb3VudF81RygKKwkJCQkJICAgIHBTcGVjdENoLCBjaGFubmVsV2lkdGgsCisJCQkJCSAgICBzZWNvbmRhcnlDaGFubmVsT2Zmc2V0LCBjZW50ZXJGcmVxLAorCQkJCQkgICAgY2hhbm5lbF9pZCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFnOgorCQkJCQlzYXBfaW50ZXJmZXJlbmNlX3Jzc2lfY291bnQocFNwZWN0Q2gpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgZUNTUl9ET1QxMV9NT0RFX2FiZzoKKwkJCQkJc2FwX2ludGVyZmVyZW5jZV9yc3NpX2NvdW50XzVHKAorCQkJCQkgICAgcFNwZWN0Q2gsIGNoYW5uZWxXaWR0aCwKKwkJCQkJICAgIHNlY29uZGFyeUNoYW5uZWxPZmZzZXQsIGNlbnRlckZyZXEsCisJCQkJCSAgICBjaGFubmVsX2lkKTsKKwkJCQkJc2FwX2ludGVyZmVyZW5jZV9yc3NpX2NvdW50KHBTcGVjdENoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJCSAgIkluICVzLCBic3NkZXMuY2hfc2VsZj0lZCwgYnNzZGVzLmNoX0lEPSVkLCBic3NkZXMucnNzaT0lZCwgU3BlY3RDaC5ic3NDb3VudD0lZCwgcFNjYW5SZXN1bHQ9JXAsIENoYW5uZWxXaWR0aCAlZCwgc2Vjb25kYXJ5Q2hhbk9mZnNldCAlZCwgY2VudGVyIGZyZXF1ZW5jeSAlZCBcbiIsCisJCQkJCSAgX19mdW5jX18sCisJCQkJCSAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuCisJCQkJCSAgY2hhbm5lbElkU2VsZiwKKwkJCQkJICBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5jaGFubmVsSWQsCisJCQkJCSAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IucnNzaSwKKwkJCQkJICBwU3BlY3RDaC0+YnNzQ291bnQsIHBTY2FuUmVzdWx0LAorCQkJCQkgIHBTcGVjdENoLT5jaGFubmVsV2lkdGgsCisJCQkJCSAgc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCwgY2VudGVyRnJlcSk7CisJCQkJcFNwZWN0Q2grKzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJcFNwZWN0Q2grKzsKKwkJCX0KKwkJfQorCisJCXBTY2FuUmVzdWx0ID0gc21lX3NjYW5fcmVzdWx0X2dldF9uZXh0KGhhbEhhbmRsZSwgcFJlc3VsdCk7CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSB3ZWlnaHRzIGZvciBhbGwgY2hhbm5lbHMgaW4gdGhlIHNwZWN0cnVtIHBTcGVjdENoICovCisJcFNwZWN0Q2ggPSBwU3BlY3RJbmZvUGFyYW1zLT5wU3BlY3RDaDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiSW4gJXMsIFNwZWN0cnVtIENoYW5uZWxzIFdlaWdodCIsIF9fZnVuY19fKTsKKworCWZvciAoY2huX251bSA9IDA7IGNobl9udW0gPCAocFNwZWN0SW5mb1BhcmFtcy0+bnVtU3BlY3RDaGFucyk7CisJICAgICBjaG5fbnVtKyspIHsKKworCQkvKgorCQkgICByc3NpIDogTWF4aW11bSByZWNlaXZlZCBzaWduYWwgc3RyZW5ndGggYW1vbmcgYWxsIEJTUyBvbiB0aGF0IGNoYW5uZWwKKwkJICAgYnNzQ291bnQgOiBOdW1iZXIgb2YgQlNTIG9uIHRoYXQgY2hhbm5lbAorCQkgKi8KKworCQlyc3NpID0gKGludDhfdCkgcFNwZWN0Q2gtPnJzc2lBZ3I7CisJCWlmIChjaF9pbl9wY2woc2FwX2N0eCwgY2huX251bSkpCisJCQlyc3NpIC09IFBDTF9SU1NJX0RJU0NPVU5UOworCisJCXBTcGVjdENoLT53ZWlnaHQgPQorCQkJU0FQREZTX05PUk1BTElTRV8xMDAwICogc2Fwd2VpZ2h0X3Jzc2lfY291bnQocnNzaSwKKwkJCQkJCQkJICAgICBwU3BlY3RDaC0+CisJCQkJCQkJCSAgICAgYnNzQ291bnQpOworCQlwU3BlY3RDaC0+d2VpZ2h0X2NvcHkgPSBwU3BlY3RDaC0+d2VpZ2h0OworCisJCS8qIC0tLS0tLSBEZWJ1ZyBJbmZvIC0tLS0tLSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICJJbiAlcywgQ2hhbj0lZCBXZWlnaHQ9ICVkIHJzc2lBZ3I9JWQgYnNzQ291bnQ9JWQiLAorCQkJICBfX2Z1bmNfXywgcFNwZWN0Q2gtPmNoTnVtLCBwU3BlY3RDaC0+d2VpZ2h0LAorCQkJICBwU3BlY3RDaC0+cnNzaUFnciwgcFNwZWN0Q2gtPmJzc0NvdW50KTsKKwkJLyogLS0tLS0tIERlYnVnIEluZm8gLS0tLS0tICovCisJCXBTcGVjdENoKys7CisJfQorCWNkZl9tZW1fZnJlZShwQmVhY29uU3RydWN0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgc2FwX2NoYW5fc2VsX2V4aXQKKworICAgREVTQ1JJUFRJT04KKyAgICBFeGl0IGZ1bmN0aW9uIGZvciBmcmVlIG91dCB0aGUgYWxsb2NhdGVkIG1lbW9yeSwgdG8gYmUgY2FsbGVkCisgICAgYXQgdGhlIGVuZCBvZiB0aGUgZGZzU2VsZWN0Q2hhbm5lbCBmdW5jdGlvbgorCisgICBERVBFTkRFTkNJRVMKKyAgICBOQS4KKworICAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwU3BlY3RJbmZvUGFyYW1zICAgICAgIDogUG9pbnRlciB0byB0aGUgdFNhcENoU2VsU3BlY3RJbmZvIHN0cnVjdHVyZQorCisgICBSRVRVUk4gVkFMVUUKKyAgICB2b2lkICAgICA6IE5VTEwKKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgc2FwX2NoYW5fc2VsX2V4aXQodFNhcENoU2VsU3BlY3RJbmZvICpwU3BlY3RJbmZvUGFyYW1zKQoreworCS8qIEZyZWUgYWxsIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisJY2RmX21lbV9mcmVlKHBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgc2FwX3NvcnRfY2hsX3dlaWdodAorCisgICBERVNDUklQVElPTgorICAgIEZ1bnRpb24gdG8gc29ydCB0aGUgY2hhbm5lbHMgd2l0aCB0aGUgbGVhc3Qgd2VpZ2h0IGZpcnN0IGZvciAyME1IeiBjaGFubmVscworCisgICBERVBFTkRFTkNJRVMKKyAgICBOQS4KKworICAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwU3BlY3RJbmZvUGFyYW1zICAgICAgIDogUG9pbnRlciB0byB0aGUgdFNhcENoU2VsU3BlY3RJbmZvIHN0cnVjdHVyZQorCisgICBSRVRVUk4gVkFMVUUKKyAgICB2b2lkICAgICA6IE5VTEwKKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgc2FwX3NvcnRfY2hsX3dlaWdodCh0U2FwQ2hTZWxTcGVjdEluZm8gKnBTcGVjdEluZm9QYXJhbXMpCit7CisJdFNhcFNwZWN0Q2hJbmZvIHRlbXA7CisKKwl0U2FwU3BlY3RDaEluZm8gKnBTcGVjdENoID0gTlVMTDsKKwl1aW50MzJfdCBpID0gMCwgaiA9IDAsIG1pbldlaWdodEluZGV4ID0gMDsKKworCXBTcGVjdENoID0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2g7CisJZm9yIChpID0gMDsgaSA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7IGkrKykgeworCQltaW5XZWlnaHRJbmRleCA9IGk7CisJCWZvciAoaiA9IGkgKyAxOyBqIDwgcFNwZWN0SW5mb1BhcmFtcy0+bnVtU3BlY3RDaGFuczsgaisrKSB7CisJCQlpZiAocFNwZWN0Q2hbal0ud2VpZ2h0IDwKKwkJCSAgICBwU3BlY3RDaFttaW5XZWlnaHRJbmRleF0ud2VpZ2h0KSB7CisJCQkJbWluV2VpZ2h0SW5kZXggPSBqOworCQkJfQorCQl9CisJCWlmIChtaW5XZWlnaHRJbmRleCAhPSBpKSB7CisJCQljZGZfbWVtX2NvcHkoJnRlbXAsICZwU3BlY3RDaFttaW5XZWlnaHRJbmRleF0sCisJCQkJICAgICBzaXplb2YoKnBTcGVjdENoKSk7CisJCQljZGZfbWVtX2NvcHkoJnBTcGVjdENoW21pbldlaWdodEluZGV4XSwgJnBTcGVjdENoW2ldLAorCQkJCSAgICAgc2l6ZW9mKCpwU3BlY3RDaCkpOworCQkJY2RmX21lbV9jb3B5KCZwU3BlY3RDaFtpXSwgJnRlbXAsIHNpemVvZigqcFNwZWN0Q2gpKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBzYXBfc29ydF9jaGxfd2VpZ2h0X2h0ODAoKSAtIHRvIHNvcnQgdGhlIGNoYW5uZWxzIHdpdGggdGhlIGxlYXN0IHdlaWdodAorICogQHBTcGVjdEluZm9QYXJhbXM6IFBvaW50ZXIgdG8gdGhlIHRTYXBDaFNlbFNwZWN0SW5mbyBzdHJ1Y3R1cmUKKyAqCisgKiBGdW50aW9uIHRvIHNvcnQgdGhlIGNoYW5uZWxzIHdpdGggdGhlIGxlYXN0IHdlaWdodCBmaXJzdCBmb3IgSFQ4MCBjaGFubmVscworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHNhcF9zb3J0X2NobF93ZWlnaHRfaHQ4MCh0U2FwQ2hTZWxTcGVjdEluZm8gKnBTcGVjdEluZm9QYXJhbXMpCit7CisJdWludDhfdCBpLCBqLCBuOworCXRTYXBTcGVjdENoSW5mbyAqcFNwZWN0SW5mbzsKKwl1aW50OF90IG1pbklkeDsKKworCXBTcGVjdEluZm8gPSBwU3BlY3RJbmZvUGFyYW1zLT5wU3BlY3RDaDsKKwkvKiBmb3IgZWFjaCBIVDgwIGNoYW5uZWwsIGNhbGN1bGF0ZSB0aGUgY29tYmluZWQgd2VpZ2h0IG9mIHRoZQorCSAgIGZvdXIgMjBNSHogd2VpZ2h0ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWNzX2h0ODBfY2hhbm5lbHMpOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7IGorKykgeworCQkJaWYgKHBTcGVjdEluZm9bal0uY2hOdW0gPT0KKwkJCQkJYWNzX2h0ODBfY2hhbm5lbHNbaV0uY2hTdGFydE51bSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA9PSBwU3BlY3RJbmZvUGFyYW1zLT5udW1TcGVjdENoYW5zKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoKChwU3BlY3RJbmZvW2pdLmNoTnVtICsgNCkgPT0gcFNwZWN0SW5mb1tqICsgMV0uY2hOdW0pICYmCisJCQkoKHBTcGVjdEluZm9bal0uY2hOdW0gKyA4KSA9PQorCQkJCSBwU3BlY3RJbmZvW2ogKyAyXS5jaE51bSkgJiYKKwkJCSgocFNwZWN0SW5mb1tqXS5jaE51bSArIDEyKSA9PQorCQkJCSBwU3BlY3RJbmZvW2ogKyAzXS5jaE51bSkpKSB7CisJCQkvKgorCQkJICogc29tZSBjaGFubmVscyBkb2VzIG5vdCBleGlzdCBpbiBwU2VjdEluZm8gYXJyYXksCisJCQkgKiBza2lwIHRoaXMgY2hhbm5lbCBhbmQgdGhvc2UgaW4gdGhlIHNhbWUgSFQ4MCB3aWR0aAorCQkJICovCisJCQlwU3BlY3RJbmZvW2pdLndlaWdodCA9IFNBUF9BQ1NfV0VJR0hUX01BWCAqIDQ7CisJCQlpZiAoKHBTcGVjdEluZm9bal0uY2hOdW0gKyA0KSA9PQorCQkJCQlwU3BlY3RJbmZvW2ogKyAxXS5jaE51bSkKKwkJCQlwU3BlY3RJbmZvW2ogKyAxXS53ZWlnaHQgPQorCQkJCQlTQVBfQUNTX1dFSUdIVF9NQVggKiA0OworCQkJaWYgKChwU3BlY3RJbmZvW2pdLmNoTnVtICsgOCkgPT0KKwkJCQkJcFNwZWN0SW5mb1tqICsgMl0uY2hOdW0pCisJCQkJcFNwZWN0SW5mb1tqICsgMl0ud2VpZ2h0ID0KKwkJCQkJU0FQX0FDU19XRUlHSFRfTUFYICogNDsKKwkJCWlmICgocFNwZWN0SW5mb1tqXS5jaE51bSArIDEyKSA9PQorCQkJCQlwU3BlY3RJbmZvW2ogKyAzXS5jaE51bSkKKwkJCQlwU3BlY3RJbmZvW2ogKyAzXS53ZWlnaHQgPQorCQkJCQlTQVBfQUNTX1dFSUdIVF9NQVggKiA0OworCQkJY29udGludWU7CisJCX0KKwkJLypmb3VuZCB0aGUgY2hhbm5lbCwgYWRkIHRoZSA0IGFkamFjZW50IGNoYW5uZWxzJyB3ZWlnaHQgKi8KKwkJYWNzX2h0ODBfY2hhbm5lbHNbaV0ud2VpZ2h0ID0gcFNwZWN0SW5mb1tqXS53ZWlnaHQgKworCQkJcFNwZWN0SW5mb1tqICsgMV0ud2VpZ2h0ICsgcFNwZWN0SW5mb1tqICsgMl0ud2VpZ2h0ICsKKwkJCXBTcGVjdEluZm9baiArIDNdLndlaWdodDsKKwkJLyogZmluZCBiZXN0IGNoYW5uZWwgYW1vbmcgNCBjaGFubmVscyBhcyB0aGUgcHJpbWFyeSBjaGFubmVsICovCisJCWlmICgocFNwZWN0SW5mb1tqXS53ZWlnaHQgKyBwU3BlY3RJbmZvW2ogKyAxXS53ZWlnaHQpIDwKKwkJCShwU3BlY3RJbmZvW2ogKyAyXS53ZWlnaHQgKyBwU3BlY3RJbmZvW2ogKyAzXS53ZWlnaHQpKSB7CisJCQkvKiBsb3dlciAyIGNoYW5uZWxzIGFyZSBiZXR0ZXIgY2hvaWNlICovCisJCQlpZiAocFNwZWN0SW5mb1tqXS53ZWlnaHQgPCBwU3BlY3RJbmZvW2ogKyAxXS53ZWlnaHQpCisJCQkJbWluSWR4ID0gMDsKKwkJCWVsc2UKKwkJCQltaW5JZHggPSAxOworCQl9IGVsc2UgaWYgKHBTcGVjdEluZm9baiArIDJdLndlaWdodCA8PQorCQkJCXBTcGVjdEluZm9baiArIDNdLndlaWdodCkgeworCQkJLyogdXBwZXIgMiBjaGFubmVscyBhcmUgYmV0dGVyIGNob2ljZSAqLworCQkJbWluSWR4ID0gMjsKKwkJfSBlbHNlIHsKKwkJCW1pbklkeCA9IDM7CisJCX0KKworCQkvKgorCQkgKiBzZXQgYWxsIDQgY2hhbm5lbHMgdG8gbWF4IHZhbHVlIGZpcnN0LCB0aGVuIHJlc2V0IHRoZQorCQkgKiBiZXN0IGNoYW5uZWwgYXMgdGhlIHNlbGVjdGVkIHByaW1hcnkgY2hhbm5lbCwgdXBkYXRlIGl0cworCQkgKiB3ZWlnaHRhZ2Ugd2l0aCB0aGUgY29tYmluZWQgd2VpZ2h0IHZhbHVlCisJCSAqLworCQlmb3IgKG4gPSAwOyBuIDwgNDsgbisrKQorCQkJcFNwZWN0SW5mb1tqICsgbl0ud2VpZ2h0ID0gU0FQX0FDU19XRUlHSFRfTUFYICogNDsKKworCQlwU3BlY3RJbmZvW2ogKyBtaW5JZHhdLndlaWdodCA9IGFjc19odDgwX2NoYW5uZWxzW2ldLndlaWdodDsKKwl9CisKKwlwU3BlY3RJbmZvID0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2g7CisJZm9yIChqID0gMDsgaiA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7IGorKykgeworCQlpZiAoQ0hBTk5FTF8xNjUgPT0gcFNwZWN0SW5mb1tqXS5jaE51bSkgeworCQkJcFNwZWN0SW5mb1tqXS53ZWlnaHQgPSBTQVBfQUNTX1dFSUdIVF9NQVggKiA0OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwU3BlY3RJbmZvID0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2g7CisJZm9yIChqID0gMDsgaiA8IChwU3BlY3RJbmZvUGFyYW1zLT5udW1TcGVjdENoYW5zKTsgaisrKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCUZMKCJDaGFubmVsPSVkIFdlaWdodD0gJWQgcnNzaT0lZCBic3NDb3VudD0lZCIpLAorCQkJcFNwZWN0SW5mby0+Y2hOdW0sIHBTcGVjdEluZm8tPndlaWdodCwKKwkJCXBTcGVjdEluZm8tPnJzc2lBZ3IsIHBTcGVjdEluZm8tPmJzc0NvdW50KTsKKwkJcFNwZWN0SW5mbysrOworCX0KK30KKworLyoqCisgKiBzYXBfc29ydF9jaGxfd2VpZ2h0X2h0NDBfMjRfZygpIC0gdG8gc29ydCBjaGFubmVsIHdpdGggdGhlIGxlYXN0IHdlaWdodAorICogQHBTcGVjdEluZm9QYXJhbXM6IFBvaW50ZXIgdG8gdGhlIHRTYXBDaFNlbFNwZWN0SW5mbyBzdHJ1Y3R1cmUKKyAqCisgKiBGdW50aW9uIHRvIHNvcnQgdGhlIGNoYW5uZWxzIHdpdGggdGhlIGxlYXN0IHdlaWdodCBmaXJzdCBmb3IgSFQ0MCBjaGFubmVscworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHNhcF9zb3J0X2NobF93ZWlnaHRfaHQ0MF8yNF9nKHRTYXBDaFNlbFNwZWN0SW5mbyAqcFNwZWN0SW5mb1BhcmFtcykKK3sKKwl1aW50OF90IGksIGo7CisJdFNhcFNwZWN0Q2hJbmZvICpwU3BlY3RJbmZvOworCXVpbnQzMl90IHRtcFdlaWdodDEsIHRtcFdlaWdodDI7CisKKwlwU3BlY3RJbmZvID0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2g7CisJLyoKKwkgKiBmb3IgZWFjaCBIVDQwIGNoYW5uZWwsIGNhbGN1bGF0ZSB0aGUgY29tYmluZWQgd2VpZ2h0IG9mIHRoZQorCSAqIHR3byAyME1IeiB3ZWlnaHQKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhY3NfaHQ0MF9jaGFubmVsczI0X2cpOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7IGorKykgeworCQkJaWYgKHBTcGVjdEluZm9bal0uY2hOdW0gPT0KKwkJCQlhY3NfaHQ0MF9jaGFubmVsczI0X2dbaV0uY2hTdGFydE51bSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA9PSBwU3BlY3RJbmZvUGFyYW1zLT5udW1TcGVjdENoYW5zKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoKHBTcGVjdEluZm9bal0uY2hOdW0gKyA0KSA9PSBwU3BlY3RJbmZvW2ogKyA0XS5jaE51bSkpIHsKKwkJCXBTcGVjdEluZm9bal0ud2VpZ2h0ID0gU0FQX0FDU19XRUlHSFRfTUFYICogMjsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIGNoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgY2hhbm5lbCBjb21iaW5hdGlvbiBwb3NzaWJsaXR5CisJCSAqIGUuZy4sIHsxLCA1fSAmIHs1LCA5fQorCQkgKi8KKwkJaWYgKChwU3BlY3RJbmZvW2ogKyA0XS5jaE51bSArIDQpID09IHBTcGVjdEluZm9baiArIDhdLmNoTnVtKSB7CisJCQkvKiBuZWVkIHRvIGNvbXBhcmUgdHdvIGNoYW5uZWwgcGFpcnMgKi8KKwkJCXRtcFdlaWdodDEgPSBwU3BlY3RJbmZvW2pdLndlaWdodCArCisJCQkJCQlwU3BlY3RJbmZvW2ogKyA0XS53ZWlnaHQ7CisJCQl0bXBXZWlnaHQyID0gcFNwZWN0SW5mb1tqICsgNF0ud2VpZ2h0ICsKKwkJCQkJCXBTcGVjdEluZm9baiArIDhdLndlaWdodDsKKwkJCWlmICh0bXBXZWlnaHQxIDw9IHRtcFdlaWdodDIpIHsKKwkJCQlpZiAocFNwZWN0SW5mb1tqXS53ZWlnaHQgPD0KKwkJCQkJCXBTcGVjdEluZm9baiArIDRdLndlaWdodCkgeworCQkJCQlwU3BlY3RJbmZvW2pdLndlaWdodCA9CisJCQkJCQl0bXBXZWlnaHQxOworCQkJCQlwU3BlY3RJbmZvW2ogKyA0XS53ZWlnaHQgPQorCQkJCQkJU0FQX0FDU19XRUlHSFRfTUFYICogMjsKKwkJCQkJcFNwZWN0SW5mb1tqICsgOF0ud2VpZ2h0ID0KKwkJCQkJCVNBUF9BQ1NfV0VJR0hUX01BWCAqIDI7CisJCQkJfSBlbHNlIHsKKwkJCQkJcFNwZWN0SW5mb1tqICsgNF0ud2VpZ2h0ID0KKwkJCQkJCXRtcFdlaWdodDE7CisJCQkJCS8qIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBzZWxlY3Rpb24gKi8KKwkJCQkJcFNwZWN0SW5mb1tqXS53ZWlnaHQgPQorCQkJCQkJU0FQX0FDU19XRUlHSFRfTUFYICogMgorCQkJCQkJLSAxOworCQkJCQlwU3BlY3RJbmZvW2ogKyA4XS53ZWlnaHQgPQorCQkJCQkJU0FQX0FDU19XRUlHSFRfTUFYICogMjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChwU3BlY3RJbmZvW2ogKyA0XS53ZWlnaHQgPD0KKwkJCQkJCXBTcGVjdEluZm9baiArIDhdLndlaWdodCkgeworCQkJCQlwU3BlY3RJbmZvW2ogKyA0XS53ZWlnaHQgPQorCQkJCQkJdG1wV2VpZ2h0MjsKKwkJCQkJcFNwZWN0SW5mb1tqXS53ZWlnaHQgPQorCQkJCQkJU0FQX0FDU19XRUlHSFRfTUFYICogMjsKKwkJCQkJLyogZm9yIHNlY29uZGFyeSBjaGFubmVsIHNlbGVjdGlvbiAqLworCQkJCQlwU3BlY3RJbmZvW2ogKyA4XS53ZWlnaHQgPQorCQkJCQkJU0FQX0FDU19XRUlHSFRfTUFYICogMgorCQkJCQkJLSAxOworCQkJCX0gZWxzZSB7CisJCQkJCXBTcGVjdEluZm9baiArIDhdLndlaWdodCA9CisJCQkJCQl0bXBXZWlnaHQyOworCQkJCQlwU3BlY3RJbmZvW2pdLndlaWdodCA9CisJCQkJCQlTQVBfQUNTX1dFSUdIVF9NQVggKiAyOworCQkJCQlwU3BlY3RJbmZvW2ogKyA0XS53ZWlnaHQgPQorCQkJCQkJU0FQX0FDU19XRUlHSFRfTUFYICogMjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQl0bXBXZWlnaHQxID0gcFNwZWN0SW5mb1tqXS53ZWlnaHQgKworCQkJCQkJcFNwZWN0SW5mb1tqICsgNF0ud2VpZ2h0OworCQkJaWYgKHBTcGVjdEluZm9bal0ud2VpZ2h0IDw9CisJCQkJCXBTcGVjdEluZm9baiArIDRdLndlaWdodCkgeworCQkJCXBTcGVjdEluZm9bal0ud2VpZ2h0ID0gdG1wV2VpZ2h0MTsKKwkJCQlwU3BlY3RJbmZvW2ogKyA0XS53ZWlnaHQgPQorCQkJCQlTQVBfQUNTX1dFSUdIVF9NQVggKiAyOworCQkJfSBlbHNlIHsKKwkJCQlwU3BlY3RJbmZvW2ogKyA0XS53ZWlnaHQgPSB0bXBXZWlnaHQxOworCQkJCXBTcGVjdEluZm9bal0ud2VpZ2h0ID0KKwkJCQkJU0FQX0FDU19XRUlHSFRfTUFYICogMjsKKwkJCX0KKwkJfQorCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgc2FwX3NvcnRfY2hsX3dlaWdodF9odDQwXzVfZworCisgICBERVNDUklQVElPTgorICAgIEZ1bnRpb24gdG8gc29ydCB0aGUgY2hhbm5lbHMgd2l0aCB0aGUgbGVhc3Qgd2VpZ2h0IGZpcnN0IGZvciBIVDQwIGNoYW5uZWxzCisKKyAgIERFUEVOREVOQ0lFUworICAgIE5BLgorCisgICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHBTcGVjdEluZm9QYXJhbXMgICAgICAgOiBQb2ludGVyIHRvIHRoZSB0U2FwQ2hTZWxTcGVjdEluZm8gc3RydWN0dXJlCisKKyAgIFJFVFVSTiBWQUxVRQorICAgIHZvaWQgICAgIDogTlVMTAorCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBzYXBfc29ydF9jaGxfd2VpZ2h0X2h0NDBfNV9nKHRTYXBDaFNlbFNwZWN0SW5mbyAqcFNwZWN0SW5mb1BhcmFtcykKK3sKKwl1aW50OF90IGksIGo7CisJdFNhcFNwZWN0Q2hJbmZvICpwU3BlY3RJbmZvOworCisJcFNwZWN0SW5mbyA9IHBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoOworCS8qZm9yIGVhY2ggSFQ0MCBjaGFubmVsLCBjYWxjdWxhdGUgdGhlIGNvbWJpbmVkIHdlaWdodCBvZiB0aGUKKwkgICB0d28gMjBNSHogd2VpZ2h0ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWNzX2h0NDBfY2hhbm5lbHM1X2cpOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7IGorKykgeworCQkJaWYgKHBTcGVjdEluZm9bal0uY2hOdW0gPT0KKwkJCSAgICBhY3NfaHQ0MF9jaGFubmVsczVfZ1tpXS5jaFN0YXJ0TnVtKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChqID09IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnMpCisJCQljb250aW51ZTsKKworCQkvKiBmb3VuZCB0aGUgY2hhbm5lbCwgYWRkIHRoZSB0d28gYWRqYWNlbnQgY2hhbm5lbHMnIHdlaWdodCAqLworCQlpZiAoKHBTcGVjdEluZm9bal0uY2hOdW0gKyA0KSA9PSBwU3BlY3RJbmZvW2ogKyAxXS5jaE51bSkgeworCQkJYWNzX2h0NDBfY2hhbm5lbHM1X2dbaV0ud2VpZ2h0ID0gcFNwZWN0SW5mb1tqXS53ZWlnaHQgKworCQkJCQkJICAgICAgcFNwZWN0SW5mb1tqICsgMV0ud2VpZ2h0OworCQkJLyogc2VsZWN0IGJldHRlciBvZiB0aGUgYWRqYWN0IGNoYW5uZWwgYXMgdGhlIHByaW1hcnkgY2hhbm5lbCAqLworCQkJaWYgKHBTcGVjdEluZm9bal0ud2VpZ2h0IDw9IHBTcGVjdEluZm9baiArIDFdLndlaWdodCkgeworCQkJCXBTcGVjdEluZm9bal0ud2VpZ2h0ID0KKwkJCQkJYWNzX2h0NDBfY2hhbm5lbHM1X2dbaV0ud2VpZ2h0OworCQkJCS8qIG1hcmsgdGhlIGFkamFjZW50IGNoYW5uZWwncyB3ZWlnaHQgYXMgbWF4IHZhbHVlIHNvCisJCQkJICAgdGhhdCBpdCB3aWxsIGJlIHNvcnRlZCB0byB0aGUgYm90dG9tICovCisJCQkJcFNwZWN0SW5mb1tqICsgMV0ud2VpZ2h0ID0KKwkJCQkJU0FQX0FDU19XRUlHSFRfTUFYICogMjsKKwkJCX0gZWxzZSB7CisJCQkJcFNwZWN0SW5mb1tqICsgMV0ud2VpZ2h0ID0KKwkJCQkJYWNzX2h0NDBfY2hhbm5lbHM1X2dbaV0ud2VpZ2h0OworCQkJCS8qIG1hcmsgdGhlIGFkamFjZW50IGNoYW5uZWwncyB3ZWlnaHQgYXMgbWF4IHZhbHVlIHNvCisJCQkJICAgdGhhdCBpdCB3aWxsIGJlIHNvcnRlZCB0byB0aGUgYm90dG9tICovCisJCQkJcFNwZWN0SW5mb1tqXS53ZWlnaHQgPSBTQVBfQUNTX1dFSUdIVF9NQVggKiAyOworCQkJfQorCisJCX0gZWxzZQorCQkJcFNwZWN0SW5mb1tqXS53ZWlnaHQgPSBTQVBfQUNTX1dFSUdIVF9NQVggKiAyOworCX0KKworCS8qIGF2b2lkIGNoYW5uZWwgMTY1IGJ5IHNldHRpbmcgaXRzIHdlaWdodCB0byBtYXggKi8KKwlwU3BlY3RJbmZvID0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2g7CisJZm9yIChqID0gMDsgaiA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7IGorKykgeworCQlpZiAoQ0hBTk5FTF8xNjUgPT0gcFNwZWN0SW5mb1tqXS5jaE51bSkgeworCQkJcFNwZWN0SW5mb1tqXS53ZWlnaHQgPSBTQVBfQUNTX1dFSUdIVF9NQVggKiAyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwU3BlY3RJbmZvID0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2g7CisJZm9yIChqID0gMDsgaiA8IChwU3BlY3RJbmZvUGFyYW1zLT5udW1TcGVjdENoYW5zKTsgaisrKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIkluICVzLCBDaGFubmVsPSVkIFdlaWdodD0gJWQgcnNzaT0lZCBic3NDb3VudD0lZCIsCisJCQkgIF9fZnVuY19fLCBwU3BlY3RJbmZvLT5jaE51bSwgcFNwZWN0SW5mby0+d2VpZ2h0LAorCQkJICBwU3BlY3RJbmZvLT5yc3NpQWdyLCBwU3BlY3RJbmZvLT5ic3NDb3VudCk7CisJCXBTcGVjdEluZm8rKzsKKwl9CisKKwlzYXBfc29ydF9jaGxfd2VpZ2h0KHBTcGVjdEluZm9QYXJhbXMpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBzYXBfc29ydF9jaGxfd2VpZ2h0X2FsbAorCisgICBERVNDUklQVElPTgorICAgIEZ1bnRpb24gdG8gc29ydCB0aGUgY2hhbm5lbHMgd2l0aCB0aGUgbGVhc3Qgd2VpZ2h0IGZpcnN0CisKKyAgIERFUEVOREVOQ0lFUworICAgIE5BLgorCisgICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB0U2FwQ29udGV4dCAgICAgICAgICAgOiBQb2ludGVyIHRvIHRoZSBwdFNhcENvbnRleHQgc3RydWN0dXJlCisgICAgcFNwZWN0SW5mb1BhcmFtcyAgICAgICA6IFBvaW50ZXIgdG8gdGhlIHRTYXBDaFNlbFNwZWN0SW5mbyBzdHJ1Y3R1cmUKKworICAgUkVUVVJOIFZBTFVFCisgICAgdm9pZCAgICAgOiBOVUxMCisKKyAgIFNJREUgRUZGRUNUUworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIHNhcF9zb3J0X2NobF93ZWlnaHRfYWxsKHB0U2FwQ29udGV4dCBwU2FwQ3R4LAorCQkJICAgICB0U2FwQ2hTZWxTcGVjdEluZm8gKnBTcGVjdEluZm9QYXJhbXMsCisJCQkgICAgIHVpbnQzMl90IG9wZXJhdGluZ0JhbmQpCit7CisJdFNhcFNwZWN0Q2hJbmZvICpwU3BlY3RDaCA9IE5VTEw7CisJdWludDMyX3QgaiA9IDA7CisjaWZuZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCisJdWludDMyX3QgaSA9IDA7CisjZW5kaWYKKworCXBTcGVjdENoID0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2g7CisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKworCXN3aXRjaCAocFNhcEN0eC0+YWNzX2NmZy0+Y2hfd2lkdGgpIHsKKwljYXNlIENIX1dJRFRIXzQwTUhaOgorCQlpZiAoZUNTUl9ET1QxMV9NT0RFXzExZyA9PSBvcGVyYXRpbmdCYW5kKQorCQkJc2FwX3NvcnRfY2hsX3dlaWdodF9odDQwXzI0X2cocFNwZWN0SW5mb1BhcmFtcyk7CisJCWVsc2UgaWYgKGVDU1JfRE9UMTFfTU9ERV8xMWEgPT0gb3BlcmF0aW5nQmFuZCkKKwkJCXNhcF9zb3J0X2NobF93ZWlnaHRfaHQ0MF81X2cocFNwZWN0SW5mb1BhcmFtcyk7CisJCWVsc2UgeworCQkJc2FwX3NvcnRfY2hsX3dlaWdodF9odDQwXzI0X2cocFNwZWN0SW5mb1BhcmFtcyk7CisJCQlzYXBfc29ydF9jaGxfd2VpZ2h0X2h0NDBfNV9nKHBTcGVjdEluZm9QYXJhbXMpOworCQl9CisJCXNhcF9zb3J0X2NobF93ZWlnaHQocFNwZWN0SW5mb1BhcmFtcyk7CisJCWJyZWFrOworCisJY2FzZSBDSF9XSURUSF84ME1IWjoKKwkJc2FwX3NvcnRfY2hsX3dlaWdodF9odDgwKHBTcGVjdEluZm9QYXJhbXMpOworCQlicmVhazsKKworCWNhc2UgQ0hfV0lEVEhfMjBNSFo6CisJZGVmYXVsdDoKKwkJLyogU29ydGluZyB0aGUgY2hhbm5lbHMgYXMgcGVyIHdlaWdodHMgYXMgMjBNSHogY2hhbm5lbHMgKi8KKwkJc2FwX3NvcnRfY2hsX3dlaWdodChwU3BlY3RJbmZvUGFyYW1zKTsKKwl9CisKKyNlbHNlCisJLyogU29ydGluZyB0aGUgY2hhbm5lbHMgYXMgcGVyIHdlaWdodHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU1BFQ1RfMjRHSFpfQ0hfQ09VTlQ7IGkrKykgeworCQltaW5XZWlnaHRJbmRleCA9IGk7CisJCWZvciAoaiA9IGkgKyAxOyBqIDwgU1BFQ1RfMjRHSFpfQ0hfQ09VTlQ7IGorKykgeworCQkJaWYgKHBTcGVjdENoW2pdLndlaWdodCA8CisJCQkgICAgcFNwZWN0Q2hbbWluV2VpZ2h0SW5kZXhdLndlaWdodCkgeworCQkJCW1pbldlaWdodEluZGV4ID0gajsKKwkJCX0KKwkJfQorCQlpZiAobWluV2VpZ2h0SW5kZXggIT0gaSkgeworCQkJY2RmX21lbV9jb3B5KCZ0ZW1wLCAmcFNwZWN0Q2hbbWluV2VpZ2h0SW5kZXhdLAorCQkJCSAgICAgc2l6ZW9mKCpwU3BlY3RDaCkpOworCQkJY2RmX21lbV9jb3B5KCZwU3BlY3RDaFttaW5XZWlnaHRJbmRleF0sICZwU3BlY3RDaFtpXSwKKwkJCQkgICAgIHNpemVvZigqcFNwZWN0Q2gpKTsKKwkJCWNkZl9tZW1fY29weSgmcFNwZWN0Q2hbaV0sICZ0ZW1wLCBzaXplb2YoKnBTcGVjdENoKSk7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIEZvciB0ZXN0aW5nICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJJbiAlcywgU29ydGVkIFNwZWN0cnVtIENoYW5uZWxzIFdlaWdodCIsIF9fZnVuY19fKTsKKwlwU3BlY3RDaCA9IHBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoOworCWZvciAoaiA9IDA7IGogPCAocFNwZWN0SW5mb1BhcmFtcy0+bnVtU3BlY3RDaGFucyk7IGorKykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICJJbiAlcywgQ2hhbm5lbD0lZCBXZWlnaHQ9ICVkIHJzc2k9JWQgYnNzQ291bnQ9JWQiLAorCQkJICBfX2Z1bmNfXywgcFNwZWN0Q2gtPmNoTnVtLCBwU3BlY3RDaC0+d2VpZ2h0LAorCQkJICBwU3BlY3RDaC0+cnNzaUFnciwgcFNwZWN0Q2gtPmJzc0NvdW50KTsKKwkJcFNwZWN0Q2grKzsKKwl9CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgc2FwX2ZpbHRlcl9vdmVyX2xhcF9jaAorCisgICBERVNDUklQVElPTgorICAgIHJldHVybiB0cnVlIGlmIGNoIGlzIGFjY2VwdGFibGUuCisgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGRlY2lkZSBpZiB3ZSB3aWxsIGZpbHRlciBvdmVyIGxhcCBjaGFubmVsIG9yIG5vdC4KKworICAgREVQRU5ERU5DSUVTCisgICAgc2hhbGwgY2FsbGVkIGFmdGVyIGFwIHN0YXJ0LgorCisgICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgcFNhcEN0eCAgICAgICAgICA6IFBvaW50ZXIgdG8gcHRTYXBDb250ZXh0LgorICAgIGNoTnVtICAgICAgICAgICAgIDogRmlsdGVyIGNoYW5uZWwgbnVtYmVyLgorCisgICBSRVRVUk4gVkFMVUUKKyAgICBib29sICAgICAgICAgIDogdHJ1ZSBpZiBjaGFubmVsIGlzIGFjY2VwdGVkLgorCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBzYXBfZmlsdGVyX292ZXJfbGFwX2NoKHB0U2FwQ29udGV4dCBwU2FwQ3R4LCB1aW50MTZfdCBjaE51bSkKK3sKKwlpZiAocFNhcEN0eC0+ZW5hYmxlT3ZlckxhcENoKQorCQlyZXR1cm4gZVNBUF9UUlVFOworCWVsc2UgaWYgKChjaE51bSA9PSBDSEFOTkVMXzEpIHx8CisJCSAoY2hOdW0gPT0gQ0hBTk5FTF82KSB8fCAoY2hOdW0gPT0gQ0hBTk5FTF8xMSkpCisJCXJldHVybiBlU0FQX1RSVUU7CisKKwlyZXR1cm4gZVNBUF9GQUxTRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgc2FwX3NlbGVjdF9jaGFubmVsCisKKyAgIERFU0NSSVBUSU9OCisgICAgUnVucyBhIGFsZ29yaXRobSB0byBzZWxlY3QgdGhlIGJlc3QgY2hhbm5lbCB0byBvcGVyYXRlIGluIGJhc2VkIG9uIEJTUworICAgIHJzc2kgYW5kIGJzcyBjb3VudCBvbiBlYWNoIGNoYW5uZWwKKworICAgREVQRU5ERU5DSUVTCisgICAgTkEuCisKKyAgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgaGFsSGFuZGxlICAgICAgIDogUG9pbnRlciB0byBIQUwgaGFuZGxlCisgICAgcFJlc3VsdCAgICAgICAgIDogUG9pbnRlciB0byB0U2NhblJlc3VsdEhhbmRsZQorCisgICBSRVRVUk4gVkFMVUUKKyAgICB1aW50OF90ICAgICAgICAgIDogU3VjY2VzcyAtIGNoYW5uZWwgbnVtYmVyLCBGYWlsIC0gemVybworCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDhfdCBzYXBfc2VsZWN0X2NoYW5uZWwodEhhbEhhbmRsZSBoYWxIYW5kbGUsIHB0U2FwQ29udGV4dCBwU2FwQ3R4LAorCQkJICAgdFNjYW5SZXN1bHRIYW5kbGUgcFNjYW5SZXN1bHQpCit7CisJLyogREZTIHBhcmFtIG9iamVjdCBob2xkaW5nIGFsbCB0aGUgZGF0YSByZXEgYnkgdGhlIGFsZ28gKi8KKwl0U2FwQ2hTZWxTcGVjdEluZm8gb1NwZWN0SW5mb1BhcmFtcyA9IHsgTlVMTCwgMCB9OworCXRTYXBDaFNlbFNwZWN0SW5mbyAqcFNwZWN0SW5mb1BhcmFtcyA9ICZvU3BlY3RJbmZvUGFyYW1zOyAgICAgICAvKiBNZW1vcnk/IE5CICovCisJdWludDhfdCBiZXN0Q2hOdW0gPSBTQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NIX0FWT0lECisJdWludDhfdCBpOworCXVpbnQ4X3QgZmlyc3RTYWZlQ2hhbm5lbEluUmFuZ2UgPSBTQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQ7CisjZW5kaWYKKyNpZmRlZiBTT0ZUQVBfQ0hBTk5FTF9SQU5HRQorCXVpbnQzMl90IHN0YXJ0Q2hhbm5lbE51bTsKKwl1aW50MzJfdCBlbmRDaGFubmVsTnVtOworCXVpbnQzMl90IG9wZXJhdGluZ0JhbmQgPSAwOworCXVpbnQzMl90IHRtcENoTnVtOworCXVpbnQ4X3QgY291bnQ7CisjZW5kaWYKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIkluICVzLCBSdW5uaW5nIFNBUCBDaCBTZWxlY3QiLCBfX2Z1bmNfXyk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQKKwlzYXBfdXBkYXRlX3Vuc2FmZV9jaGFubmVsX2xpc3QocFNhcEN0eCk7CisjZW5kaWYKKworCWlmIChOVUxMID09IHBTY2FuUmVzdWx0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIiVzOiBObyBleHRlcm5hbCBBUCBwcmVzZW50XG4iLCBfX2Z1bmNfXyk7CisKKyNpZm5kZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKwkJcmV0dXJuIGJlc3RDaE51bTsKKyNlbHNlCisJCXN0YXJ0Q2hhbm5lbE51bSA9IHBTYXBDdHgtPmFjc19jZmctPnN0YXJ0X2NoOworCQllbmRDaGFubmVsTnVtID0gcFNhcEN0eC0+YWNzX2NmZy0+ZW5kX2NoOworCisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiJXM6IHN0YXJ0IC0gZW5kOiAlZCAtICVkXG4iLCBfX2Z1bmNfXywKKwkJCSAgc3RhcnRDaGFubmVsTnVtLCBlbmRDaGFubmVsTnVtKTsKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgICAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgTk9UIGRlZmluZWQgY2FzZSAqLworCQlwU2FwQ3R4LT5hY3NfY2ZnLT5wcmlfY2ggPSBzdGFydENoYW5uZWxOdW07CisJCXBTYXBDdHgtPmFjc19jZmctPmh0X3NlY19jaCA9IDA7CisJCS8qIHBpY2sgdGhlIGZpcnN0IGNoYW5uZWwgaW4gY29uZmlndXJlZCByYW5nZSAqLworCQlyZXR1cm4gc3RhcnRDaGFubmVsTnVtOworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgZGVmaW5lZCAqLworCisJCS8qIGdldCBhIGNoYW5uZWwgaW4gUENMIGFuZCB3aXRoaW4gdGhlIHJhbmdlICovCisJCWZvciAoaSA9IDA7IGkgPCBwU2FwQ3R4LT5hY3NfY2ZnLT5wY2xfY2hfY291bnQ7IGkrKykgeworCQkJaWYgKChwU2FwQ3R4LT5hY3NfY2ZnLT5wY2xfY2hhbm5lbHNbaV0gPj0KKwkJCQkJCQlzdGFydENoYW5uZWxOdW0pCisJCQkJJiYgKHBTYXBDdHgtPmFjc19jZmctPnBjbF9jaGFubmVsc1tpXSA8PQorCQkJCQkJCWVuZENoYW5uZWxOdW0pKSB7CisJCQkJZmlyc3RTYWZlQ2hhbm5lbEluUmFuZ2UgPQorCQkJCQlwU2FwQ3R4LT5hY3NfY2ZnLT5wY2xfY2hhbm5lbHNbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKFNBUF9DSEFOTkVMX05PVF9TRUxFQ1RFRCAhPSBmaXJzdFNhZmVDaGFubmVsSW5SYW5nZSkKKwkJCXJldHVybiBmaXJzdFNhZmVDaGFubmVsSW5SYW5nZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlVNXzIwTUhaX1JGX0NIQU5ORUxTOyBpKyspIHsKKwkJCWlmICgoc2FmZV9jaGFubmVsc1tpXS5jaGFubmVsTnVtYmVyID49IHN0YXJ0Q2hhbm5lbE51bSkKKwkJCSAgICAmJiAoc2FmZV9jaGFubmVsc1tpXS5jaGFubmVsTnVtYmVyIDw9CisJCQkJZW5kQ2hhbm5lbE51bSkpIHsKKwkJCQlDSEFOTkVMX1NUQVRFIGNoYW5uZWxfdHlwZSA9CisJCQkJCWNkc19nZXRfY2hhbm5lbF9zdGF0ZShzYWZlX2NoYW5uZWxzW2ldLgorCQkJCQkJY2hhbm5lbE51bWJlcik7CisKKwkJCQlpZiAoKGNoYW5uZWxfdHlwZSA9PSBDSEFOTkVMX1NUQVRFX0RJU0FCTEUpIHx8CisJCQkJCShjaGFubmVsX3R5cGUgPT0gQ0hBTk5FTF9TVEFURV9JTlZBTElEKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAoc2FmZV9jaGFubmVsc1tpXS5pc1NhZmUgPT0gdHJ1ZSkgeworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJCQkgICIlczogY2hhbm5lbCAlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBpcyBzYWZlXG4iLAorCQkJCQkJICBfX2Z1bmNfXywKKwkJCQkJCSAgc2FmZV9jaGFubmVsc1tpXS4KKwkJCQkJCSAgY2hhbm5lbE51bWJlcik7CisJCQkJCWZpcnN0U2FmZUNoYW5uZWxJblJhbmdlID0KKwkJCQkJCXNhZmVfY2hhbm5lbHNbaV0uY2hhbm5lbE51bWJlcjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJCSAgIiVzOiBjaGFubmVsICVkIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIHVuc2FmZVxuIiwKKwkJCQkJICBfX2Z1bmNfXywKKwkJCQkJICBzYWZlX2NoYW5uZWxzW2ldLmNoYW5uZWxOdW1iZXIpOworCQkJfQorCQl9CisKKwkJLyogaWYgbm8gY2hhbm5lbCBzZWxlY3RlZCByZXR1cm4gU0FQX0NIQU5ORUxfTk9UX1NFTEVDVEVEICovCisJCXJldHVybiBmaXJzdFNhZmVDaGFubmVsSW5SYW5nZTsKKyNlbmRpZiAvKiAhRkVBVFVSRV9XTEFOX0NIX0FWT0lEICovCisjZW5kaWYgLyogU09GVEFQX0NIQU5ORUxfUkFOR0UgKi8KKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgcG9pbnRlZCBieSBwU3BlY3RJbmZvUGFyYW1zICovCisJaWYgKHNhcF9jaGFuX3NlbF9pbml0KGhhbEhhbmRsZSwgcFNwZWN0SW5mb1BhcmFtcywgcFNhcEN0eCkgIT0gZVNBUF9UUlVFKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW4gJXMsIENoIFNlbGVjdCBpbml0aWFsaXphdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBTQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQ7CisJfQorCS8qIENvbXB1dGUgdGhlIHdlaWdodCBvZiB0aGUgZW50aXJlIHNwZWN0cnVtIGluIHRoZSBvcGVyYXRpbmcgYmFuZCAqLworCXNhcF9jb21wdXRlX3NwZWN0X3dlaWdodChwU3BlY3RJbmZvUGFyYW1zLCBoYWxIYW5kbGUsIHBTY2FuUmVzdWx0LAorCQkJCQkJCQlwU2FwQ3R4KTsKKworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCS8qIHByb2Nlc3MgYXZvaWQgY2hhbm5lbCBJRSB0byBjb2xsZWN0IGFsbCBjaGFubmVscyB0byBhdm9pZCAqLworCXNhcF9wcm9jZXNzX2F2b2lkX2llKGhhbEhhbmRsZSwgcFNhcEN0eCwgcFNjYW5SZXN1bHQsIHBTcGVjdEluZm9QYXJhbXMpOworI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKwlzdGFydENoYW5uZWxOdW0gPSBwU2FwQ3R4LT5hY3NfY2ZnLT5zdGFydF9jaDsKKwllbmRDaGFubmVsTnVtID0gcFNhcEN0eC0+YWNzX2NmZy0+ZW5kX2NoOworCVNFVF9BQ1NfQkFORChvcGVyYXRpbmdCYW5kLCBwU2FwQ3R4KTsKKworCXBTYXBDdHgtPmFjc0Jlc3RDaGFubmVsSW5mby5jaGFubmVsTnVtID0gMDsKKwlwU2FwQ3R4LT5hY3NCZXN0Q2hhbm5lbEluZm8ud2VpZ2h0ID0gU0FQX0FDU19XRUlHSFRfTUFYOworCisJLyogU29ydCB0aGUgY2hhbm5lbCBsaXN0IGFzIHBlciB0aGUgY29tcHV0ZWQgd2VpZ2h0cywgbGVzc2VyIHdlaWdodCBmaXJzdC4gKi8KKwlzYXBfc29ydF9jaGxfd2VpZ2h0X2FsbChwU2FwQ3R4LCBwU3BlY3RJbmZvUGFyYW1zLCBvcGVyYXRpbmdCYW5kKTsKKworCS8qTG9vcCB0aWxsIGdldCB0aGUgYmVzdCBjaGFubmVsIGluIHRoZSBnaXZlbiByYW5nZSAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7IGNvdW50KyspIHsKKwkJaWYgKChzdGFydENoYW5uZWxOdW0gPD0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2hbY291bnRdLmNoTnVtKQorCQkgICAgJiYgKGVuZENoYW5uZWxOdW0gPj0KKwkJCXBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoW2NvdW50XS5jaE51bSkpIHsKKwkJCWlmIChiZXN0Q2hOdW0gPT0gU0FQX0NIQU5ORUxfTk9UX1NFTEVDVEVEKSB7CisJCQkJYmVzdENoTnVtID0KKwkJCQkJcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2hbY291bnRdLmNoTnVtOworCQkJCS8qIGNoZWNrIGlmIGJlc3RDaE51bSBpcyBpbiBwcmVmZXJyZWQgY2hhbm5lbCBsaXN0ICovCisJCQkJYmVzdENoTnVtID0KKwkJCQkJc2FwX3NlbGVjdF9wcmVmZXJyZWRfY2hhbm5lbF9mcm9tX2NoYW5uZWxfbGlzdAorCQkJCQkJKGJlc3RDaE51bSwgcFNhcEN0eCwgcFNwZWN0SW5mb1BhcmFtcyk7CisJCQkJaWYgKGJlc3RDaE51bSA9PSBTQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQpIHsKKwkJCQkJLyogbm90IGluIHByZWZlcnJlZCBjaGFubmVsIGxpc3QsIGdvIHRvIG5leHQgYmVzdCBjaGFubmVsICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCQkJCS8qIFdlaWdodCBvZiB0aGUgY2hhbm5lbHMoZGV2aWNlJ3MgQVAgaXMKKwkJCQkgKiBvcGVyYXRpbmcpIGluY3JlYXNlZCB0byBNQVgrMSBzbyB0aGF0IHRoZXkKKwkJCQkgKiB3aWxsIGJlIGNob29zZW4gb25seSB3aGVuIHRoZXJlIGlzIG5vIG90aGVyCisJCQkJICogYmVzdCBjaGFubmVsIHRvIGNob29zZQorCQkJCSAqLworCQkJCWlmIChzYXBfY2hlY2tfaW5fYXZvaWRfY2hfbGlzdChwU2FwQ3R4LAorCQkJCQkJCQliZXN0Q2hOdW0pKSB7CisJCQkJCWJlc3RDaE51bSA9IFNBUF9DSEFOTkVMX05PVF9TRUxFQ1RFRDsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisKKwkJCQlwU2FwQ3R4LT5hY3NCZXN0Q2hhbm5lbEluZm8uY2hhbm5lbE51bSA9CisJCQkJCQkJCWJlc3RDaE51bTsKKwkJCQlwU2FwQ3R4LT5hY3NCZXN0Q2hhbm5lbEluZm8ud2VpZ2h0ID0KKwkJCQkJCQlwU3BlY3RJbmZvUGFyYW1zLT4KKwkJCQkJCQlwU3BlY3RDaFtjb3VudF0uCisJCQkJCQkJd2VpZ2h0X2NvcHk7CisJCQl9CisKKwkJCWlmIChiZXN0Q2hOdW0gIT0gU0FQX0NIQU5ORUxfTk9UX1NFTEVDVEVEKSB7CisJCQkJaWYgKG9wZXJhdGluZ0JhbmQgPT0gZUNTUl9ET1QxMV9NT0RFXzExZykgeworCQkJCQkvKiBHaXZlIHByZWZlcmVuY2UgdG8gTm9uLW92ZXJsYXAgY2hhbm5lbHMgKi8KKwkJCQkJaWYgKHNhcF9maWx0ZXJfb3Zlcl9sYXBfY2gocFNhcEN0eCwKKwkJCQkJCQkJICAgcFNwZWN0SW5mb1BhcmFtcy0+CisJCQkJCQkJCSAgIHBTcGVjdENoW2NvdW50XS4KKwkJCQkJCQkJICAgY2hOdW0pKSB7CisJCQkJCQl0bXBDaE51bSA9CisJCQkJCQkJcFNwZWN0SW5mb1BhcmFtcy0+CisJCQkJCQkJcFNwZWN0Q2hbY291bnRdLmNoTnVtOworCQkJCQkJdG1wQ2hOdW0gPQorCQkJCQkJCXNhcF9zZWxlY3RfcHJlZmVycmVkX2NoYW5uZWxfZnJvbV9jaGFubmVsX2xpc3QKKwkJCQkJCQkJKHRtcENoTnVtLCBwU2FwQ3R4LAorCQkJCQkJCQlwU3BlY3RJbmZvUGFyYW1zKTsKKwkJCQkJCWlmICh0bXBDaE51bSAhPQorCQkJCQkJICAgIFNBUF9DSEFOTkVMX05PVF9TRUxFQ1RFRCkgeworCQkJCQkJCWJlc3RDaE51bSA9IHRtcENoTnVtOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorI2Vsc2UKKwkvKiBTb3J0IHRoZSBjaGFubmVsIGxpc3QgYXMgcGVyIHRoZSBjb21wdXRlZCB3ZWlnaHRzLCBsZXNzZXIgd2VpZ2h0IGZpcnN0LiAqLworCXNhcF9zb3J0X2NobF93ZWlnaHRfYWxsKHBTYXBDdHgsIGhhbEhhbmRsZSwgcFNwZWN0SW5mb1BhcmFtcyk7CisJLyogR2V0IHRoZSBmaXJzdCBjaGFubmVsIGluIHNvcnRlZCBhcnJheSBhcyBiZXN0IDIwTSBDaGFubmVsICovCisJYmVzdENoTnVtID0gKHVpbnQ4X3QpIHBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoWzBdLmNoTnVtOworCS8qIFNlbGVjdCBCZXN0IENoYW5uZWwgZnJvbSBDaGFubmVsIExpc3QgaWYgQ29uZmlndXJlZCAqLworCWJlc3RDaE51bSA9IHNhcF9zZWxlY3RfcHJlZmVycmVkX2NoYW5uZWxfZnJvbV9jaGFubmVsX2xpc3QoYmVzdENoTnVtLAorCQkJCQkJCQkgICBwU2FwQ3R4LAorCQkJCQkJCQkgICBwU3BlY3RJbmZvUGFyYW1zKTsKKyNlbmRpZgorCisJLyoqIGluIGNhc2UgdGhlIGJlc3QgY2hhbm5lbCBzZWxldGVkIGlzIG5vdCBpbiBQQ0wgYW5kIHRoZXJlIGlzIGFub3RoZXIKKwkgKiBjaGFubmVsIHdoaWNoIGhhcyBzYW1lIHdlaWdodGFnZSBhbmQgaXMgaW4gUENMLCBjaG9vc2UgdGhlIG9uZSBpbgorCSAqIFBDTAorCSAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7IGNvdW50KyspIHsKKwkJLyoqIGNoZWNrIGlmIGEgcGNsIGNoYW5uZWwgaGFzIHRoZSBzYW1lIHdlaWdodGFnZQorCQkgKiBhcyB0aGUgYmVzdCBjaGFubmVsCisJCSAqLworCQlpZiAoY2hfaW5fcGNsKHBTYXBDdHgsIHBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoW2NvdW50XS5jaE51bSkKKwkJCSYmIChwU3BlY3RJbmZvUGFyYW1zLT5wU3BlY3RDaFtjb3VudF0ud2VpZ2h0ID09CisJCQlwU2FwQ3R4LT5hY3NCZXN0Q2hhbm5lbEluZm8ud2VpZ2h0KSkgeworCQkJaWYgKHNhcF9zZWxlY3RfcHJlZmVycmVkX2NoYW5uZWxfZnJvbV9jaGFubmVsX2xpc3QoCisJCQkJcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2hbY291bnRdLmNoTnVtLAorCQkJCXBTYXBDdHgsIHBTcGVjdEluZm9QYXJhbXMpID09CisJCQkJCQlTQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQpCisJCQkJY29udGludWU7CisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKwkJCWlmIChzYXBfY2hlY2tfaW5fYXZvaWRfY2hfbGlzdChwU2FwQ3R4LCBiZXN0Q2hOdW0pKQorCQkJCWNvbnRpbnVlOworI2VuZGlmCisJCQliZXN0Q2hOdW0gPSBwU3BlY3RJbmZvUGFyYW1zLT5wU3BlY3RDaFtjb3VudF0uY2hOdW07CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJCSJjaGFuZ2UgYmVzdCBjaGFubmVsIHRvICVkIGluIFBDTCIsCisJCQkJCWJlc3RDaE51bSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXBTYXBDdHgtPmFjc19jZmctPnByaV9jaCA9IGJlc3RDaE51bTsKKwkvKiBkZXRlcm1pbmUgc2Vjb25kYXJ5IGNoYW5uZWwgZm9yIDIuNEcgY2hhbm5lbCA1LCA2LCA3IGluIEhUNDAgKi8KKwlpZiAoKG9wZXJhdGluZ0JhbmQgPT0gZUNTUl9ET1QxMV9NT0RFXzExZykgJiYKKwkJCShwU2FwQ3R4LT5hY3NfY2ZnLT5jaF93aWR0aCA9PSBDSF9XSURUSF80ME1IWikpIHsKKwkJaWYgKChiZXN0Q2hOdW0gPj0gNSkgJiYgKGJlc3RDaE51bSA8PSA3KSkgeworCQkJaW50IHdlaWdodF9iZWxvdywgd2VpZ2h0X2Fib3ZlLCBpOworCQkJdFNhcFNwZWN0Q2hJbmZvICpwc3BlY3RfaW5mbzsKKworCQkJd2VpZ2h0X2JlbG93ID0gd2VpZ2h0X2Fib3ZlID0gU0FQX0FDU19XRUlHSFRfTUFYOworCQkJcHNwZWN0X2luZm8gPSBwU3BlY3RJbmZvUGFyYW1zLT5wU3BlY3RDaDsKKwkJCWZvciAoaSA9IDA7IGkgPCBwU3BlY3RJbmZvUGFyYW1zLT5udW1TcGVjdENoYW5zOworCQkJCQkJCQkJaSsrKSB7CisJCQkJaWYgKHBzcGVjdF9pbmZvW2ldLmNoTnVtID09IChiZXN0Q2hOdW0gLSA0KSkKKwkJCQkJd2VpZ2h0X2JlbG93ID0gcHNwZWN0X2luZm9baV0ud2VpZ2h0OworCisJCQkJaWYgKHBzcGVjdF9pbmZvW2ldLmNoTnVtID09IChiZXN0Q2hOdW0gKyA0KSkKKwkJCQkJd2VpZ2h0X2Fib3ZlID0gcHNwZWN0X2luZm9baV0ud2VpZ2h0OworCQkJfQorCisJCQlpZiAod2VpZ2h0X2JlbG93IDwgd2VpZ2h0X2Fib3ZlKQorCQkJCXBTYXBDdHgtPmFjc19jZmctPmh0X3NlY19jaCA9CisJCQkJCQlwU2FwQ3R4LT5hY3NfY2ZnLT5wcmlfY2ggLSA0OworCQkJZWxzZQorCQkJCXBTYXBDdHgtPmFjc19jZmctPmh0X3NlY19jaCA9CisJCQkJCQlwU2FwQ3R4LT5hY3NfY2ZnLT5wcmlfY2ggKyA0OworCQl9IGVsc2UgaWYgKGJlc3RDaE51bSA+PSAxICYmIGJlc3RDaE51bSA8PSA0KSB7CisJCQlwU2FwQ3R4LT5hY3NfY2ZnLT5odF9zZWNfY2ggPQorCQkJCQkJcFNhcEN0eC0+YWNzX2NmZy0+cHJpX2NoICsgNDsKKwkJfSBlbHNlIGlmIChiZXN0Q2hOdW0gPj0gOCAmJiBiZXN0Q2hOdW0gPD0gMTMpIHsKKwkJCXBTYXBDdHgtPmFjc19jZmctPmh0X3NlY19jaCA9CisJCQkJCQlwU2FwQ3R4LT5hY3NfY2ZnLT5wcmlfY2ggLSA0OworCQl9IGVsc2UgaWYgKGJlc3RDaE51bSA9PSAxNCkgeworCQkJcFNhcEN0eC0+YWNzX2NmZy0+aHRfc2VjX2NoID0gMDsKKwkJfQorCQlwU2FwQ3R4LT5zZWNvbmRhcnlfY2ggPSBwU2FwQ3R4LT5hY3NfY2ZnLT5odF9zZWNfY2g7CisJfQorCS8qIEZyZWUgYWxsIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisJc2FwX2NoYW5fc2VsX2V4aXQocFNwZWN0SW5mb1BhcmFtcyk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSJJbiAlcywgUnVubmluZyBTQVAgQ2ggc2VsZWN0IENvbXBsZXRlZCwgQ2g9JWQiLCBfX2Z1bmNfXywKKwkJYmVzdENoTnVtKTsKKwlpZiAoYmVzdENoTnVtID4gMCAmJiBiZXN0Q2hOdW0gPD0gMjUyKQorCQlyZXR1cm4gYmVzdENoTnVtOworCWVsc2UKKwkJcmV0dXJuIFNBUF9DSEFOTkVMX05PVF9TRUxFQ1RFRDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc2FwL3NyYy9zYXBfY2hfc2VsZWN0LmggYi9jb3JlL3NhcC9zcmMvc2FwX2NoX3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZWZkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NhcC9zcmMvc2FwX2NoX3NlbGVjdC5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoX19TQVBfQ0hfU0VMRUNUX0gpCisjZGVmaW5lIF9fU0FQX0NIX1NFTEVDVF9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJCQlzYXBDaFNlbGVjdC5oCisKKyAgIE9WRVJWSUVXOgorCisgICBUaGlzIHNvZnR3YXJlIHVuaXQgaG9sZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXTEFOIFNBUCBtb2R1bGVzCisgICBmdW5jdGlvbnMgZm9yIGNoYW5uZWwgc2VsZWN0aW9uLgorCisgICBERVBFTkRFTkNJRVM6CisKKyAgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBGaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBkZWZpbmVzIGFuZCBlbnVtCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgU1BFQ1RfMjRHSFpfQ0hfQ09VTlQgICAgKDExKSAgICAvKiBVU0EgcmVndWxhdG9yeSBkb21haW4gKi8KKyNkZWZpbmUgU0FQREZTX05PUk1BTElTRV8xMDAwICAgICAgKDEwMDAvOSkgICAgIC8qIENhc2Ugb2Ygc3BlYzIwIHdpdGggY2hhbm5lbCBkaWZmID0gMCAqLworLyogR2VuIDUgdmFsdWVzCisgICAjZGVmaW5lIFNPRlRBUF9NSU5fUlNTSSAgICAgICAgICgtODUpCisgICAjZGVmaW5lIFNPRlRBUF9NQVhfUlNTSSAgICAgICAgICgtNDUpCisgKi8KKyNkZWZpbmUgU09GVEFQX01JTl9SU1NJICAgICAgICAgKC0xMDApCisjZGVmaW5lIFNPRlRBUF9NQVhfUlNTSSAgICAgICAgICgwKQorI2RlZmluZSBTT0ZUQVBfTUlOX0NPVU5UICAgICAgICAoMCkKKyNkZWZpbmUgU09GVEFQX01BWF9DT1VOVCAgICAgICAgKDYwKQorI2RlZmluZSBTT0ZUQVBfUlNTSV9XRUlHSFQgICAgICAoMjApCisjZGVmaW5lIFNPRlRBUF9DT1VOVF9XRUlHSFQgICAgICgyMCkKKworI2RlZmluZSBTQVBfREVGQVVMVF8yNEdIWl9DSEFOTkVMICAgICAoNikKKyNkZWZpbmUgU0FQX0RFRkFVTFRfNUdIWl9DSEFOTkVMICAgICAgKDQwKQorI2RlZmluZSBTQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQgKDApCisKKyNkZWZpbmUgU09GVEFQX0hUMjBfQ0hBTk5FTFdJRFRIIDAKKyNkZWZpbmUgU0FQX1NVQkJBTkQxX1JTU0lfRUZGRUNUX1BSSU1BUlkgICgtMjApIC8qIEluIEhUNDAvVkhUODAsIEVmZmVjdCBvZiBwcmltYXJ5IENoYW5uZWwgUlNTaSBvbiBTdWJiYW5kMSAqLworI2RlZmluZSBTQVBfU1VCQkFORDJfUlNTSV9FRkZFQ1RfUFJJTUFSWSAgKC0zMCkgLyogSW4gVkhUODAsIEVmZmVjdCBvZiBwcmltYXJ5IENoYW5uZWwgUlNTSSBvbiBTdWJiYW5kMiAqLworI2RlZmluZSBTQVBfU1VCQkFORDNfUlNTSV9FRkZFQ1RfUFJJTUFSWSAgKC00MCkgLyogSW4gVkhUODAsIEVmZmVjdCBvZiBQcmltYXJ5IENoYW5uZWwgUlNTSSBvbiBTdWJiYW5kMyAqLworCisjZGVmaW5lIFNBUF8yNEdIWl9GSVJTVF9PVkVSTEFQX0NIQU5fUlNTSV9FRkZFQ1RfUFJJTUFSWSAgICAgICgtMTApICAgICAvKiBJbiAyLjRHSFosIEVmZmVjdCBvZiBQcmltYXJ5ICBDaGFubmVsIFJTU0kgb24gRmlyc3QgT3ZlcmxhcHBpbmcgQ2hhbm5lbCAqLworI2RlZmluZSBTQVBfMjRHSFpfU0VDX09WRVJMQVBfQ0hBTl9SU1NJX0VGRkVDVF9QUklNQVJZICAgICAgICAoLTIwKSAgICAgLyogSW4gMi40R0haLCBFZmZlY3Qgb2YgUHJpbWFyeSAgQ2hhbm5lbCBSU1NJIG9uIFNlY29uZCBPdmVybGFwcGluZyBDaGFubmVsICovCisjZGVmaW5lIFNBUF8yNEdIWl9USElSRF9PVkVSTEFQX0NIQU5fUlNTSV9FRkZFQ1RfUFJJTUFSWSAgICAgICgtMzApICAgICAvKiBJbiAyLjRHSFosIEVmZmVjdCBvZiBQcmltYXJ5ICBDaGFubmVsIFJTU0kgb24gVGhpcmQgT3ZlcmxhcHBpbmcgQ2hhbm5lbCAqLworI2RlZmluZSBTQVBfMjRHSFpfRk9VUlRIX09WRVJMQVBfQ0hBTl9SU1NJX0VGRkVDVF9QUklNQVJZICAgICAoLTQwKSAgICAgLyogSW4gMi40R0haLCBFZmZlY3Qgb2YgUHJpbWFyeSAgQ2hhbm5lbCBSU1NJIG9uIEZvdXJ0aCBPdmVybGFwcGluZyBDaGFubmVsICovCisKK3R5cGVkZWYgZW51bSB7CisJQ0hBTk5FTF8xID0gMSwKKwlDSEFOTkVMXzIsCisJQ0hBTk5FTF8zLAorCUNIQU5ORUxfNCwKKwlDSEFOTkVMXzUsCisJQ0hBTk5FTF82LAorCUNIQU5ORUxfNywKKwlDSEFOTkVMXzgsCisJQ0hBTk5FTF85LAorCUNIQU5ORUxfMTAsCisJQ0hBTk5FTF8xMSwKKwlDSEFOTkVMXzEyLAorCUNIQU5ORUxfMTMsCisJQ0hBTk5FTF8xNAorfSB0U2FwQ2hhbm5lbDsKKworI2RlZmluZSBNQVhfODBNSFpfQkFORFMgNgorI2RlZmluZSBTQVBfODBNSFpfTUFTSyAgICAgMHgwRgorI2RlZmluZSBTQVBfNDBNSFpfTUFTS19MICAgMHgwMworI2RlZmluZSBTQVBfNDBNSFpfTUFTS19IICAgMHgwQworCisvKgorICogc3RydWN0cyBmb3IgaG9sZGluZyBjaGFubmVsIGJvbmRpbmcgYml0bWFwCisgKiB1c2VkIGZvciBmaW5kaW5nIG5ldyBjaGFubmVsIHdoZW4gU0FQIGlzIG9uCisgKiBERlMgY2hhbm5lbCBhbmQgcmFkYXIgaXMgZGV0ZWN0ZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHNDaGFubmVsQm9uZGluZ0luZm8geworCXVpbnQ4X3QgY2hhbm5lbE1hcDo0OworCXVpbnQ4X3QgcnN2ZDo0OworCXVpbnQ4X3Qgc3RhcnRDaGFubmVsOworfSB0Q2hhbm5lbEJvbmRpbmdJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfX2NoYW5fYm9uZGluZ19iaXRtYXAgeworCXRDaGFubmVsQm9uZGluZ0luZm8gY2hhbkJvbmRpbmdTZXRbTUFYXzgwTUhaX0JBTkRTXTsKK30gY2hhbl9ib25kaW5nX2JpdG1hcDsKKworLyoqCisgKiBTdHJ1Y3R1cmUgaG9sZGluZyBpbmZvcm1hdGlvbiBvZiBlYWNoIGNoYW5uZWwgaW4gdGhlIHNwZWN0cnVtLAorICogaXQgY29udGFpbnMgdGhlIGNoYW5uZWwgbnVtYmVyLCB0aGUgY29tcHV0ZWQgd2VpZ2h0CisgKi8KK3R5cGVkZWYgc3RydWN0IHNDaGFubmVsSW5mbyB7CisJdWludDhfdCBjaGFubmVsOworCWJvb2wgdmFsaWQ7ICAgICAgICAgICAgIC8qIGlmIHRoZSBjaGFubmVsIGlzIHZhbGlkIHRvIGJlIHBpY2tlZCBhcyBuZXcgY2hhbm5lbCAqLworfSB0Q2hhbm5lbEluZm87CisKK3R5cGVkZWYgc3RydWN0IHNBbGw1R0NoYW5uZWxMaXN0IHsKKwl1aW50OF90IG51bUNoYW5uZWw7CisJdENoYW5uZWxJbmZvICpjaGFubmVsTGlzdDsKK30gdEFsbDVHQ2hhbm5lbExpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHNTYXBDaGFubmVsTGlzdEluZm8geworCXVpbnQ4X3QgbnVtQ2hhbm5lbDsKKwl1aW50OF90ICpjaGFubmVsTGlzdDsKK30gdFNhcENoYW5uZWxMaXN0SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IGNoTnVtOyAgICAgICAgIC8qIENoYW5uZWwgTnVtYmVyICovCisJdWludDE2X3QgY2hhbm5lbFdpZHRoOyAgLyogQ2hhbm5lbCBXaWR0aCAqLworCXVpbnQxNl90IGJzc0NvdW50OyAgICAgIC8qIGJzcyBmb3VuZCBpbiBzY2FucmVzdWx0IGZvciB0aGlzIGNoYW5uZWwgKi8KKwlpbnQzMl90IHJzc2lBZ3I7ICAgICAgICAvKiBNYXggdmFsdWUgb2YgcnNzaSBhbW9uZyBhbGwgQlNTKGVzKSBmcm9tIHNjYW5yZXN1bHQgZm9yIHRoaXMgY2hhbm5lbCAqLworCXVpbnQzMl90IHdlaWdodDsgICAgICAgIC8qIFdlaWdodGFnZSBvZiB0aGlzIGNoYW5uZWwgKi8KKwl1aW50MzJfdCB3ZWlnaHRfY29weTsgICAvKiBjb3B5IG9mIHRoZSBvcmlnbmFsIHdlaWdodCAqLworCWJvb2wgdmFsaWQ7ICAgICAgICAgICAgIC8qIElzIHRoaXMgYSB2YWxpZCBjZW50ZXIgZnJlcXVlbmN5IGZvciByZWd1bGF0b3J5IGRvbWFpbiAqLworfSB0U2FwU3BlY3RDaEluZm87ICAgICAgICAgICAgICAvKiB0RGZzU3BlY3RDaEluZm87ICovCisKKy8qKgorICogU3RydWN0dXJlIGhvbGRpbmcgYWxsIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBtYWtlIGEKKyAqIGRlY2lzaW9uIGZvciB0aGUgYmVzdCBvcGVyYXRpbmcgY2hhbm5lbCBiYXNlZCBvbiBkZnMgZm9ybXVsYQorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0U2FwU3BlY3RDaEluZm8gKnBTcGVjdENoOyAgICAgIC8qIHREZnNTcGVjdENoSW5mbyAqcFNwZWN0Q2g7ICAvLyBQdHIgdG8gdGhlIGNoYW5uZWxzIGluIHRoZSBlbnRpcmUgc3BlY3RydW0gYmFuZCAqLworCXVpbnQ4X3QgbnVtU3BlY3RDaGFuczsgIC8qIFRvdGFsIG51bSBvZiBjaGFubmVscyBpbiB0aGUgc3BlY3RydW0gKi8KK30gdFNhcENoU2VsU3BlY3RJbmZvOyAgICAgICAgICAgLyogdERmc0NoU2VsUGFyYW1zOyAqLworCisvKioKKyAqIFN0cnVjdHVyZSBmb3IgY2hhbm5lbCB3ZWlnaHQgY2FsY3VsYXRpb24gcGFyYW1ldGVycworICovCit0eXBlZGVmIHN0cnVjdCBzU2FwQ2hTZWxQYXJhbXMgeworCXZvaWQgKnBTcGVjdEluZm9QYXJhbXM7IC8qKnBEZnNQYXJhbXM7ICAgLy8gRmlsbGVkIHdpdGggdFNhcENoU2VsU3BlY3RJbmZvICovCisJdWludDE2X3QgbnVtQ2hhbm5lbHM7Cit9IHRTYXBDaFNlbFBhcmFtczsKKworI2RlZmluZSBTQVBfVFhfTEVBS0FHRV9USFJFUyAzMTAKKyNkZWZpbmUgU0FQX1RYX0xFQUtBR0VfTUFYICAxMDAwCisjZGVmaW5lIFNBUF9UWF9MRUFLQUdFX01JTiAgMjAwCisKKy8qCisgKiBUaGlzIGRlZmluZSBpcyB1c2VkIHRvIGJsb2NrIGFkZGl0aW9uYWwgY2hhbm5lbHMKKyAqIGJhc2VkIG9uIHRoZSBuZXcgZGF0YSBnYXRoZXJlZCBvbiBhdXRvIHBsYXRmb3JtcworICogYW5kIHRvIGRpZmZlcmVudGlhdGUgdGhlIGxlYWthZ2UgZGF0YSBhbW9uZyBkaWZmZXJlbnQKKyAqIHBsYXRmb3Jtcy4KKyAqLworCisjZGVmaW5lIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOICAyMTAKKwordHlwZWRlZiBzdHJ1Y3Qgc1NhcFR4TGVha0luZm8geworCXVpbnQ4X3QgbGVha19jaGFuOyAgICAgIC8qIGxlYWsgY2hhbm5lbCAqLworCXVpbnQzMl90IGxlYWtfbHZsOyAgICAgIC8qIHR4IGxlYWthZ2UgbHZsICovCit9IHRTYXBUeExlYWtJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzU2FwQ2hhbk1hdHJpeEluZm8geworCXVpbnQ4X3QgY2hhbm5lbDsgICAgICAgIC8qIGNoYW5uZWwgdG8gc3dpdGNoIGZyb20gKi8KKwl0U2FwVHhMZWFrSW5mbyBjaGFuX21hdHJpeFtSRl9DSEFOXzE0NCAtIFJGX0NIQU5fMzYgKyAxXTsKK30gdFNhcENoYW5NYXRyaXhJbmZvOworCisjZW5kaWYgLyogaWYgIWRlZmluZWQgX19TQVBfQ0hfU0VMRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvc2FwL3NyYy9zYXBfZnNtLmMgYi9jb3JlL3NhcC9zcmMvc2FwX2ZzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjAyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NhcC9zcmMvc2FwX2ZzbS5jCkBAIC0wLDAgKzEsNDc1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIHMgYSBwIEYgcyBtIC4gQworCisgICBPVkVSVklFVzoKKworICAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBTQVAgRmluaXRlCisgICBTdGF0ZSBNYWNoaW5lIG1vZHVsZXMKKworICAgREVQRU5ERU5DSUVTOgorCisgICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic2FwX2ludGVybmFsLmgiCisvKiBQaWNrIHVwIHRoZSBTTUUgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAic21lX2FwaS5oIgorLyogUGljayB1cCB0aGUgUE1DIEFQSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImNkc191dGlscy5oIgorI2luY2x1ZGUgImNkc19pZWVlODAyMTFfY29tbW9uX2kuaCIKKyNpbmNsdWRlICJjZHNfcmVnX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJjZGZfdXRpbC5oIgorI2luY2x1ZGUgImNkc19jb25jdXJyZW5jeS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBFeHRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIGdsb2JhbCBjb250ZXh0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQKK2V4dGVybiBzYXBTYWZlQ2hhbm5lbFR5cGUgc2FmZV9jaGFubmVsc1tdOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DSF9BVk9JRCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBXTEFOX0VOQUJMRV9DSE5MX01BVFJJWF9SRVNUUklDVElPTgorLyoKKyAqIFRPRE86IEF0IHByZXNlbnQgU0FQIENoYW5uZWwgbGVha2FnZSBtYXRyaXggZm9yIGNoIDE0NAorICogaXMgbm90IGF2YWlsYWJsZSBmcm9tIHN5c3RlbSdzIHRlYW0uIFNvIHRvIHBsYXkgaXQgc2FmZQorICogYW5kIGF2b2lkIGNyYXNoIGlmIGNoYW5uZWwgMTQ0IGlzIHJlcXVlc3QsIGluIGZvbGxvd2luZworICogbWF0aXggY2hhbm5lbCAxNDQgaXMgYWRkZWQgc3VjaCB0aGF0IGl0IHdpbGwgY2F1c2UgY29kZQorICogdG8gYXZvaWQgc2VsZWN0aW5nIGNoYW5uZWwgMTQ0LgorICoKKyAqIFRIRVNFIEVOVFJJRVMgU0hPVUxEIEJFIFJFUExBQ0VEIFdJVEggQ09SUkVDVCBWQUxVRVMgQVMKKyAqIFBST1ZJREVEIEJZIFNZU1RFTSdTIFRFQU0uCisgKi8KKworLyogY2hhbm5lbCB0eCBsZWFrYWdlIHRhYmxlIC0gaHQ4MCAqLwordFNhcENoYW5NYXRyaXhJbmZvIGh0ODBfY2hhbltdID0geworCXs1MiwKKwkge3szNiwgMTQ4fSwgezQwLCAxOTl9LAorCSAgezQ0LCAxOTN9LCB7NDgsIDE5N30sCisJICB7NTIsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHs1NiwgMTUzfSwKKwkgIHs2MCwgMTM3fSwgezY0LCAxMzR9LAorCSAgezEwMCwgMzU4fSwgezEwNCwgMzUwfSwKKwkgIHsxMDgsIDQwNH0sIHsxMTIsIDM0NH0sCisJICB7MTE2LCA0MjR9LCB7MTIwLCA0Mjl9LAorCSAgezEyNCwgNDM3fSwgezEyOCwgNDM1fSwKKwkgIHsxMzIsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMzYsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTQwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfQorCSAgfSB9LAorCisKKwl7NTYsCisJIHt7MzYsIDE3MX0sIHs0MCwgMTc4fSwKKwkgIHs0NCwgMTcxfSwgezQ4LCAxNzh9LAorCSAgezUyLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NTYsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7NjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHs2NCwgMjgwfSwKKwkgIHsxMDAsIDM1MX0sIHsxMDQsIDM3Nn0sCisJICB7MTA4LCAzNjJ9LCB7MTEyLCAzNjJ9LAorCSAgezExNiwgNDAzfSwgezEyMCwgMzk3fSwKKwkgIHsxMjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMjgsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTMyLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTM2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezE0MCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxNDQsIFNBUF9UWF9MRUFLQUdFX01JTn0KKwkgIH0gfSwKKworCXs2MCwKKwkge3szNiwgMTU2fSwgezQwLCAxNDZ9LAorCSAgezQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NDgsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7NTIsIDE4MH0sIHs1NiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHs2MCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezY0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEwMCwgMzc2fSwgezEwNCwgMzYwfSwKKwkgIHsxMDgsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMTIsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTE2LCAzOTV9LCB7MTIwLCAzOTl9LAorCSAgezEyNCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEyOCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMzIsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMzYsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTQwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfQorCSAgfSB9LAorCisJezY0LAorCSB7ezM2LCAyMTd9LCB7NDAsIDIyMX0sCisJICB7NDQsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHs0OCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHs1MiwgMTc2fSwgezU2LCAxNzZ9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTAwLCAzODR9LCB7MTA0LCAzOTB9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMTYsIDM3NX0sIHsxMjAsIDM3NH0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTAwLAorCSB7ezM2LCAzNTd9LCB7NDAsIDMyNn0sCisJICB7NDQsIDMyMX0sIHs0OCwgMzI2fSwKKwkgIHs1MiwgMzc4fSwgezU2LCAzOTZ9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEwOCwgMTk2fSwgezExMiwgMTE2fSwKKwkgIHsxMTYsIDE2Nn0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTA0LAorCSB7ezM2LCAzMjV9LCB7NDAsIDMyNX0sCisJICB7NDQsIDMwNX0sIHs0OCwgMzUyfSwKKwkgIHs1MiwgNDExfSwgezU2LCA0MTF9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgNDYwfSwKKwkgIHsxMTYsIDE5OH0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTA4LAorCSB7ezM2LCAzMDR9LCB7NDAsIDMzMn0sCisJICB7NDQsIDMxMH0sIHs0OCwgMzM1fSwKKwkgIHs1MiwgNDMxfSwgezU2LCAzOTF9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCAyODB9LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIDE4NX0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTEyLAorCSB7ezM2LCAzMjd9LCB7NDAsIDMzNX0sCisJICB7NDQsIDMzMX0sIHs0OCwgMzQ1fSwKKwkgIHs1MiwgMzY3fSwgezU2LCA0MDF9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCAxMzF9LCB7MTA0LCAxMzJ9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIDE4OX0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTE2LAorCSB7ezM2LCAzODR9LCB7NDAsIDM3Mn0sCisJICB7NDQsIDM4OX0sIHs0OCwgMzk2fSwKKwkgIHs1MiwgMzQ4fSwgezU2LCAzMzZ9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCAxNzJ9LCB7MTA0LCAxNjl9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTIwLAorCSB7ezM2LCAzOTV9LCB7NDAsIDQxOX0sCisJICB7NDQsIDQzOX0sIHs0OCwgNDA3fSwKKwkgIHs1MiwgMzIxfSwgezU2LCAzMzR9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCAxMzR9LCB7MTA0LCAxODZ9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCAxNTl9LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTI0LAorCSB7ezM2LCA0Njl9LCB7NDAsIDQzM30sCisJICB7NDQsIDQzNH0sIHs0OCwgNDM1fSwKKwkgIHs1MiwgMzMyfSwgezU2LCAzNDV9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCAxNDZ9LCB7MTA0LCAxNzd9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIDM1MH0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCAxMzh9LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTI4LAorCSB7ezM2LCA0MDh9LCB7NDAsIDQzNH0sCisJICB7NDQsIDQ0OX0sIHs0OCwgNDQ0fSwKKwkgIHs1MiwgMzQxfSwgezU2LCAzNzR9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCAyMDV9LCB7MTA0LCAyMDh9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIDE0Mn0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTMyLAorCSB7ezM2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NDAsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7NDQsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHs0OCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHs1MiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezU2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTM2LAorCSB7ezM2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NDAsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7NDQsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHs0OCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHs1MiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezU2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTQwLAorCSB7ezM2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NDAsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7NDQsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHs0OCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHs1MiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezU2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDQsIFNBUF9UWF9MRUFLQUdFX01JTn0KKwkgIH0gfSwKK307CisKKy8qIGNoYW5uZWwgdHggbGVha2FnZSB0YWJsZSAtIGh0NDAgKi8KK3RTYXBDaGFuTWF0cml4SW5mbyBodDQwX2NoYW5bXSA9IHsKKwl7NTIsCisJIHt7MzYsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezQwLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7NDQsIDIzMH0sIHs0OCwgMjMwfSwKKwkgIHs1MiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezU2LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHs2NCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezEwMCwgNjI1fSwgezEwNCwgMzIzfSwKKwkgIHsxMDgsIDY0Nn0sIHsxMTIsIDY0Nn0sCisJICB7MTE2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTIwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezEyNCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEyOCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMzIsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMzYsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTQwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfQorCSAgfSB9LAorCisJezU2LAorCSB7ezM2LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHs0MCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezQ0LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHs0OCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezUyLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NTYsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7NjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHs2NCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMDAsIDYxMX0sIHsxMDQsIDYxMX0sCisJICB7MTA4LCA2MTd9LCB7MTEyLCA2MTd9LAorCSAgezExNiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEyMCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMjgsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTMyLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTM2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezE0MCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxNDQsIFNBUF9UWF9MRUFLQUdFX01JTn0KKwkgIH0gfSwKKworCXs2MCwKKwkge3szNiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7NDAsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHs0NCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7NDgsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHs1MiwgMTkwfSwgezU2LCAxOTB9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTAwLCA2MDh9LCB7MTA0LCA2MDh9LAorCSAgezEwOCwgNjIzfSwgezExMiwgNjIzfSwKKwkgIHsxMTYsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7NjQsCisJIHt7MzYsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezQwLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7NDQsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezQ4LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7NTIsIDI5NX0sIHs1NiwgMjk1fSwKKwkgIHs2MCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezY0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEwMCwgNTk0fSwgezEwNCwgNTk0fSwKKwkgIHsxMDgsIDYyNX0sIHsxMTIsIDYyNX0sCisJICB7MTE2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTIwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezEyNCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEyOCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMzIsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMzYsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTQwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfQorCSAgfSB9LAorCisJezEwMCwKKwkge3szNiwgNjE4fSwgezQwLCA2MTh9LAorCSAgezQ0LCA2MDR9LCB7NDgsIDYwNH0sCisJICB7NTIsIDU5Nn0sIHs1NiwgNTk2fSwKKwkgIHs2MCwgNTg0fSwgezY0LCA1ODR9LAorCSAgezEwMCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEwNCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMDgsIDI5OX0sIHsxMTIsIDI5OX0sCisJICB7MTE2LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHsxMjQsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezEyOCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezEzMiwgNTM4fSwgezEzNiwgNTM4fSwKKwkgIHsxNDAsIDU5OH0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTA0LAorCSB7ezM2LCA2MzZ9LCB7NDAsIDYzNn0sCisJICB7NDQsIDYwMX0sIHs0OCwgNjAxfSwKKwkgIHs1MiwgNjE2fSwgezU2LCA2MTZ9LAorCSAgezYwLCA1ODR9LCB7NjQsIDU4NH0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezEyMCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezEyNCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTMyLCA1NTN9LCB7MTM2LCA1NTN9LAorCSAgezE0MCwgNTY4fSwKKwkgIHsxNDQsIFNBUF9UWF9MRUFLQUdFX01JTn0KKwkgIH0gfSwKKworCXsxMDgsCisJIHt7MzYsIDYwMH0sIHs0MCwgNjAwfSwKKwkgIHs0NCwgNjI3fSwgezQ4LCA2Mjd9LAorCSAgezUyLCA2MTF9LCB7NTYsIDYxMX0sCisJICB7NjAsIDYxMX0sIHs2NCwgNjExfSwKKwkgIHsxMDAsIDIxNH0sIHsxMDQsIDIxNH0sCisJICB7MTA4LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTEyLCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezExNiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTIwLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHsxMjgsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHsxMzIsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezE0MCwgNTM0fSwKKwkgIHsxNDQsIFNBUF9UWF9MRUFLQUdFX01JTn0KKwkgIH0gfSwKKworCXsxMTIsCisJIHt7MzYsIDY0NX0sIHs0MCwgNjQ1fSwKKwkgIHs0NCwgNjQxfSwgezQ4LCA2NDF9LAorCSAgezUyLCA2MTh9LCB7NTYsIDYxOH0sCisJICB7NjAsIDYxMn0sIHs2NCwgNjEyfSwKKwkgIHsxMDAsIDI5M30sIHsxMDQsIDI5M30sCisJICB7MTA4LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTEyLCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezExNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEyMCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMjQsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezEyOCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTM2LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTQwLCA1MjF9LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfQorCSAgfSB9LAorCisJezExNiwKKwkge3szNiwgNjYxfSwgezQwLCA2NjF9LAorCSAgezQ0LCA2MjR9LCB7NDgsIDYyNH0sCisJICB7NTIsIDYzNH0sIHs1NiwgNjM0fSwKKwkgIHs2MCwgNjExfSwgezY0LCA2MTF9LAorCSAgezEwMCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTA4LCAyMTd9LCB7MTEyLCAyMTd9LAorCSAgezExNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEyMCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMjQsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezEyOCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTM2LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTQwLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTIwLAorCSB7ezM2LCA2Njd9LCB7NDAsIDY2N30sCisJICB7NDQsIDY0NX0sIHs0OCwgNjQ1fSwKKwkgIHs1MiwgNjMzfSwgezU2LCA2MzN9LAorCSAgezYwLCA2MTl9LCB7NjQsIDYxOX0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHsxMDQsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHsxMDgsIDI5MX0sIHsxMTIsIDI5MX0sCisJICB7MTE2LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTIwLCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEyNCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEyOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMzIsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezE0MCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfQorCSAgfSB9LAorCisJezEyNCwKKwkge3szNiwgNjc2fSwgezQwLCA2NzZ9LAorCSAgezQ0LCA2Njh9LCB7NDgsIDY2OH0sCisJICB7NTIsIDU5NX0sIHs1NiwgNTk1fSwKKwkgIHs2MCwgNjIyfSwgezY0LCA2MjJ9LAorCSAgezEwMCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTA4LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHsxMTIsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHsxMTYsIDIyNX0sIHsxMjAsIDIyNX0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTM2LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTQwLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTI4LAorCSB7ezM2LCA2Nzh9LCB7NDAsIDY3OH0sCisJICB7NDQsIDY2NH0sIHs0OCwgNjY0fSwKKwkgIHs1MiwgNjUxfSwgezU2LCA2NTF9LAorCSAgezYwLCA2NDN9LCB7NjQsIDY0M30sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHsxMDQsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHsxMDgsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezExNiwgMjkzfSwgezEyMCwgMjkzfSwKKwkgIHsxMjQsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHsxMjgsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTMyLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTM2LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezE0MCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfQorCSAgfSB9LAorCisJezEzMiwKKwkge3szNiwgNjg5fSwgezQwLCA2ODl9LAorCSAgezQ0LCA2Njl9LCB7NDgsIDY2OX0sCisJICB7NTIsIDY2Mn0sIHs1NiwgNjYyfSwKKwkgIHs2MCwgNjA5fSwgezY0LCA2MDl9LAorCSAgezEwMCwgNTM4fSwgezEwNCwgNTM4fSwKKwkgIHsxMDgsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezExNiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTIwLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTI0LCAyNDd9LCB7MTI4LCAyNDd9LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTM2LAorCSB7ezM2LCA3MDN9LCB7NDAsIDcwM30sCisJICB7NDQsIDY4OH0sIHs0OCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHs1MiwgNjcxfSwgezU2LCA2NzF9LAorCSAgezYwLCA2NTh9LCB7NjQsIDY1OH0sCisJICB7MTAwLCA1MDR9LCB7MTA0LCA1MDR9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTEyLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTE2LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHsxMjQsIDI4OX0sIHsxMjgsIDI4OX0sCisJICB7MTMyLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTM2LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezE0MCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDQsIFNBUF9UWF9MRUFLQUdFX01JTn0KKwkgIH0gfSwKKworCXsxNDAsCisJIHt7MzYsIDY5NX0sIHs0MCwgNjk1fSwKKwkgIHs0NCwgNjg0fSwgezQ4LCA2ODR9LAorCSAgezUyLCA2NjR9LCB7NTYsIDY2NH0sCisJICB7NjAsIDY1OH0sIHs2NCwgNjU4fSwKKwkgIHsxMDAsIDYwMX0sIHsxMDQsIDYwMX0sCisJICB7MTA4LCA1NDV9LCB7MTEyLCA1NDV9LAorCSAgezExNiwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTIwLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHsxMjgsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHsxMzIsIDI2Mn0sIHsxMzYsIDI2Mn0sCisJICB7MTQwLCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfQorCSAgfSB9LAorCit9OworCisvKiBjaGFubmVsIHR4IGxlYWthZ2UgdGFibGUgLSBodDIwICovCit0U2FwQ2hhbk1hdHJpeEluZm8gaHQyMF9jaGFuW10gPSB7CisJezUyLAorCSB7ezM2LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHs0MCwgMjg2fSwKKwkgIHs0NCwgMjI1fSwgezQ4LCAxMjF9LAorCSAgezUyLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NTYsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7NjAsIDMwMH0sIHs2NCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LAorCSAgezEwMCwgNjM3fSwgezEwNCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMDgsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMTIsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTE2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTIwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezEyNCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEyOCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMzIsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMzYsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTQwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfQorCSAgfSB9LAorCisJezU2LAorCSB7ezM2LCA0Njh9LCB7NDAsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHs0NCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7NDgsIDIwNn0sCisJICB7NTIsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHs1NiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHs2MCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezY0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEwMCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEwNCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMDgsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMTIsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTE2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTIwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezEyNCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEyOCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMzIsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMzYsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTQwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfQorCSAgfSB9LAorCisJezYwLAorCSB7ezM2LCA1MDd9LCB7NDAsIDQ0MH0sCisJICB7NDQsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwgezQ4LCAzMTN9LAorCSAgezUyLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NTYsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7NjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHs2NCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMDAsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMDQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTA4LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTEyLCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezExNiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEyMCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMjgsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTMyLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTM2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezE0MCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxNDQsIFNBUF9UWF9MRUFLQUdFX01JTn0KKwkgIH0gfSwKKworCXs2NCwKKwkge3szNiwgNTE2fSwgezQwLCA1MjB9LAorCSAgezQ0LCA1MDZ9LCB7NDgsIFNBUF9UWF9MRUFLQUdFX0FVVE9fTUlOfSwKKwkgIHs1MiwgMzAxfSwgezU2LCAyNTh9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTAwLCA2MjB9LCB7MTA0LCA2MTd9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMTYsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTAwLAorCSB7ezM2LCA2MTZ9LCB7NDAsIDYwMX0sCisJICB7NDQsIDYwNH0sIHs0OCwgNTg5fSwKKwkgIHs1MiwgNjEyfSwgezU2LCA1OTJ9LAorCSAgezYwLCA1OTB9LCB7NjQsIDU4Mn0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTA0LCAxMzF9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfQVVUT19NSU59LCB7MTEyLCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sCisJICB7MTE2LCBTQVBfVFhfTEVBS0FHRV9BVVRPX01JTn0sIHsxMjAsIDUyMn0sCisJICB7MTI0LCA1NzF9LCB7MTI4LCA1ODl9LAorCSAgezEzMiwgNTkzfSwgezEzNiwgNTk4fSwKKwkgIHsxNDAsIDU5NH0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgfSB9LAorCisJezEwNCwKKwkge3szNiwgNjIyfSwgezQwLCA2MjR9LAorCSAgezQ0LCA2MTh9LCB7NDgsIDYxMH0sCisJICB7NTIsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHs1NiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHs2MCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezY0LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezEwMCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEwNCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMDgsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHsxMTIsIDQ2M30sCisJICB7MTE2LCA0ODN9LCB7MTIwLCA1MDN9LAorCSAgezEyNCwgNTIzfSwgezEyOCwgNTY1fSwKKwkgIHsxMzIsIDU3MH0sIHsxMzYsIDU4OH0sCisJICB7MTQwLCA1ODV9LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIH0gfSwKKworCXsxMDgsCisJIHt7MzYsIDYyMH0sIHs0MCwgNjM4fSwKKwkgIHs0NCwgNjExfSwgezQ4LCA2MTR9LAorCSAgezUyLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NTYsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7NjAsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHs2NCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMDAsIDQ3N30sIHsxMDQsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTA4LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTEyLCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezExNiwgNDc3fSwgezEyMCwgNDk3fSwKKwkgIHsxMjQsIDUxN30sIHsxMjgsIDUzN30sCisJICB7MTMyLCA1NTd9LCB7MTM2LCA1Nzd9LAorCSAgezE0MCwgNjAzfSwKKwkgIHsxNDQsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB9IH0sCisKKwl7MTEyLAorCSB7ezM2LCA2MzZ9LCB7NDAsIDYyM30sCisJICB7NDQsIDYzOH0sIHs0OCwgNjI4fSwKKwkgIHs1MiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezU2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIDYwNn0sCisJICB7MTAwLCA1MDF9LCB7MTA0LCA0ODF9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezExMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMTYsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHsxMjAsIDQ4MX0sCisJICB7MTI0LCA1MDF9LCB7MTI4LCA0MjF9LAorCSAgezEzMiwgNTQxfSwgezEzNiwgNTYxfSwKKwkgIHsxNDAsIDU4M30sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgfSB9LAorCisJezExNiwKKwkge3szNiwgNjQ2fSwgezQwLCA2NDh9LAorCSAgezQ0LCA2MzN9LCB7NDgsIDYzNH0sCisJICB7NTIsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHs1NiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHs2MCwgNjE1fSwgezY0LCA1OTR9LAorCSAgezEwMCwgNTc1fSwgezEwNCwgNTU0fSwKKwkgIHsxMDgsIDUzNH0sIHsxMTIsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTE2LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTIwLCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEyNCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEyOCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMzIsIDUzNH0sIHsxMzYsIDU1NH0sCisJICB7MTQwLCA1NzR9LAorCSAgezE0NCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIH0gfSwKKworCXsxMjAsCisJIHt7MzYsIDY0M30sIHs0MCwgNjQ5fSwKKwkgIHs0NCwgNjU0fSwgezQ4LCA2Mjl9LAorCSAgezUyLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NTYsIDYyMX0sCisJICB7NjAsIFNBUF9UWF9MRUFLQUdFX01BWH0sIHs2NCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwKKwkgIHsxMDAsIDU2NX0sIHsxMDQsIDU0NX0sCisJICB7MTA4LCA1MjV9LCB7MTEyLCA1MDV9LAorCSAgezExNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEyMCwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxMjQsIFNBUF9UWF9MRUFLQUdFX01JTn0sIHsxMjgsIDUwNX0sCisJICB7MTMyLCA1MjV9LCB7MTM2LCA1NDV9LAorCSAgezE0MCwgNTY1fSwKKwkgIHsxNDQsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB9IH0sCisKKwl7MTI0LAorCSB7ezM2LCA2Mzh9LCB7NDAsIDY1N30sCisJICB7NDQsIDY2M30sIHs0OCwgNjQ5fSwKKwkgIHs1MiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezU2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCA1ODF9LCB7MTA0LCA1NjF9LAorCSAgezEwOCwgNTQxfSwgezExMiwgNTIxfSwKKwkgIHsxMTYsIDQ5OX0sIHsxMjAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgNDk5fSwgezEzNiwgNTE5fSwKKwkgIHsxNDAsIDUzOX0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTI4LAorCSB7ezM2LCA2NTF9LCB7NDAsIDY1MX0sCisJICB7NDQsIDY3NH0sIHs0OCwgNjQwfSwKKwkgIHs1MiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezU2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCA2MDN9LCB7MTA0LCA1NjB9LAorCSAgezEwOCwgNTQwfSwgezExMiwgNTIwfSwKKwkgIHsxMTYsIDQ5OX0sIHsxMjAsIDQ3OX0sCisJICB7MTI0LCBTQVBfVFhfTEVBS0FHRV9NSU59LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgNDc5fSwKKwkgIHsxNDAsIDQ5OX0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTMyLAorCSB7ezM2LCA2NDN9LCB7NDAsIDY2OH0sCisJICB7NDQsIDY1MX0sIHs0OCwgNjU3fSwKKwkgIHs1MiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezU2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTA0LCA2MDJ9LAorCSAgezEwOCwgNTc4fSwgezExMiwgNTcwfSwKKwkgIHsxMTYsIDU1MH0sIHsxMjAsIDUzMH0sCisJICB7MTI0LCA1MTB9LCB7MTI4LCBTQVBfVFhfTEVBS0FHRV9NSU59LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIDQ5MH0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTM2LAorCSB7ezM2LCA2NTR9LCB7NDAsIDY2N30sCisJICB7NDQsIDY2Nn0sIHs0OCwgNjQyfSwKKwkgIHs1MiwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezU2LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezYwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7NjQsIFNBUF9UWF9MRUFLQUdFX01BWH0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezExMiwgNTk2fSwKKwkgIHsxMTYsIDU1NX0sIHsxMjAsIDUzNX0sCisJICB7MTI0LCA1MTV9LCB7MTI4LCA0OTV9LAorCSAgezEzMiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCisKKwl7MTQwLAorCSB7ezM2LCA2Nzl9LCB7NDAsIDY3M30sCisJICB7NDQsIDY2N30sIHs0OCwgNjU2fSwKKwkgIHs1MiwgNjM0fSwgezU2LCA2NjN9LAorCSAgezYwLCA2NjJ9LCB7NjQsIDY2MH0sCisJICB7MTAwLCBTQVBfVFhfTEVBS0FHRV9NQVh9LCB7MTA0LCBTQVBfVFhfTEVBS0FHRV9NQVh9LAorCSAgezEwOCwgU0FQX1RYX0xFQUtBR0VfTUFYfSwgezExMiwgNTkwfSwKKwkgIHsxMTYsIDU3M30sIHsxMjAsIDU1M30sCisJICB7MTI0LCA1MzN9LCB7MTI4LCA1MTN9LAorCSAgezEzMiwgNDkwfSwgezEzNiwgU0FQX1RYX0xFQUtBR0VfTUlOfSwKKwkgIHsxNDAsIFNBUF9UWF9MRUFLQUdFX01JTn0sCisJICB7MTQ0LCBTQVBfVFhfTEVBS0FHRV9NSU59CisJICB9IH0sCit9OworI2VuZGlmIC8qIFdMQU5fRU5BQkxFX0NITkxfTUFUUklYX1JFU1RSSUNUSU9OICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCitzdGF0aWMgQ0RGX1NUQVRVUyBzYXBfZ2V0X2NoYW5uZWxfbGlzdChwdFNhcENvbnRleHQgc2FwQ29udGV4dCwKKwkJCQkgICAgdWludDhfdCAqKmNoYW5uZWxMaXN0LAorCQkJCSAgICB1aW50OF90ICpudW1iZXJPZkNoYW5uZWxzKTsKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBzYXBHZXQ1R0h6Q2hhbm5lbExpc3QKKworICAgREVTQ1JJUFRJT04KKyAgICBGdW5jdGlvbiBmb3IgaW5pdGlhbGl6aW5nIGxpc3Qgb2YgIDIuNC81IEdoeiBbTk9OLURGUy9ERlNdIGF2YWlsYWJsZQorICAgIGNoYW5uZWxzIGluIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorCisgICBERVBFTkRFTkNJRVMKKyAgICBOQS4KKworICAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBzYXBDb250ZXh0OiBTQVAgQ29udGV4dAorCisgICBSRVRVUk4gVkFMVUUKKyAgICBOQQorCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIENERl9TVEFUVVMgc2FwX2dldDVfZ19oel9jaGFubmVsX2xpc3QocHRTYXBDb250ZXh0IHNhcENvbnRleHQpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBzYXBTdG9wRGZzQ2FjVGltZXIKKworICAgREVTQ1JJUFRJT04KKyAgICBGdW5jdGlvbiB0byBzdHRvcCB0aGUgREZTIENBQyB0aW1lciB3aGVuIFNBUCBpcyBzdG9wcGVkCisgICBERVBFTkRFTkNJRVMKKyAgICBOQS4KKworICAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBzYXBDb250ZXh0OiBTQVAgQ29udGV4dAorICAgUkVUVVJOIFZBTFVFCisgICAgREZTIFRpbWVyIHN0YXJ0IHN0YXR1cworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBzYXBfc3RvcF9kZnNfY2FjX3RpbWVyKHB0U2FwQ29udGV4dCBzYXBDb250ZXh0KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgc2FwU3RhcnREZnNDYWNUaW1lcgorCisgICBERVNDUklQVElPTgorICAgIEZ1bmN0aW9uIHRvIHN0YXJ0IHRoZSBERlMgQ0FDIHRpbWVyIHdoZW4gU0FQIGlzIHN0YXJ0ZWQgb24gREZTIENoYW5uZWwKKyAgIERFUEVOREVOQ0lFUworICAgIE5BLgorCisgICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHNhcENvbnRleHQ6IFNBUCBDb250ZXh0CisgICBSRVRVUk4gVkFMVUUKKyAgICBERlMgVGltZXIgc3RhcnQgc3RhdHVzCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQgc2FwX3N0YXJ0X2Rmc19jYWNfdGltZXIocHRTYXBDb250ZXh0IHNhcENvbnRleHQpOworCisvKiogc2FwX2hkZF9ldmVudF90b19zdHJpbmcoKSAtIGNvbnZlcnQgaGRkIGV2ZW50IHRvIHN0cmluZworICogQGV2ZW50OiBlU2FwSGRkRXZlbnQgZXZlbnQgdHlwZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgZVNhcEhkZEV2ZW50IGludG8gc3RyaW5nCisgKgorICogUmV0dXJuOiBzdHJpbmcgZm9yIHRoZSBAZXZlbnQuCisgKi8KK3N0YXRpYyB1aW50OF90ICpzYXBfaGRkX2V2ZW50X3RvX3N0cmluZyhlU2FwSGRkRXZlbnQgZXZlbnQpCit7CisJc3dpdGNoIChldmVudCkgeworCUNBU0VfUkVUVVJOX1NUUklORyhlU0FQX1NUQVJUX0JTU19FVkVOVCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfU1RPUF9CU1NfRVZFTlQpOworCUNBU0VfUkVUVVJOX1NUUklORyhlU0FQX1NUQV9BU1NPQ19JTkQpOworCUNBU0VfUkVUVVJOX1NUUklORyhlU0FQX1NUQV9BU1NPQ19FVkVOVCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfU1RBX1JFQVNTT0NfRVZFTlQpOworCUNBU0VfUkVUVVJOX1NUUklORyhlU0FQX1NUQV9ESVNBU1NPQ19FVkVOVCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfU1RBX1NFVF9LRVlfRVZFTlQpOworCUNBU0VfUkVUVVJOX1NUUklORyhlU0FQX1NUQV9NSUNfRkFJTFVSRV9FVkVOVCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfQVNTT0NfU1RBX0NBTExCQUNLX0VWRU5UKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoZVNBUF9HRVRfV1BTUEJDX1NFU1NJT05fRVZFTlQpOworCUNBU0VfUkVUVVJOX1NUUklORyhlU0FQX1dQU19QQkNfUFJPQkVfUkVRX0VWRU5UKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoZVNBUF9JTkRJQ0FURV9NR01UX0ZSQU1FKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoZVNBUF9SRU1BSU5fQ0hBTl9SRUFEWSk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfU0VORF9BQ1RJT05fQ05GKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoZVNBUF9ESVNDT05ORUNUX0FMTF9QMlBfQ0xJRU5UKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoZVNBUF9NQUNfVFJJR19TVE9QX0JTU19FVkVOVCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfVU5LTk9XTl9TVEFfSk9JTik7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfTUFYX0FTU09DX0VYQ0VFREVEKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoZVNBUF9DSEFOTkVMX0NIQU5HRV9FVkVOVCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfREZTX0NBQ19TVEFSVCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfREZTX0NBQ19FTkQpOworCUNBU0VfUkVUVVJOX1NUUklORyhlU0FQX0RGU19SQURBUl9ERVRFQ1QpOworCUNBU0VfUkVUVVJOX1NUUklORyhlU0FQX0RGU19OT0xfR0VUKTsKKwlDQVNFX1JFVFVSTl9TVFJJTkcoZVNBUF9ERlNfTk9MX1NFVCk7CisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfREZTX05PX0FWQUlMQUJMRV9DSEFOTkVMKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVBfQVBfQUNTX09QVElNSVpFCisJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTQVBfQUNTX1NDQU5fU1VDQ0VTU19FVkVOVCk7CisjZW5kaWYKKwlDQVNFX1JFVFVSTl9TVFJJTkcoZVNBUF9BQ1NfQ0hBTk5FTF9TRUxFQ1RFRCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJlU0FQX0hERF9FVkVOVF9VTktOT1dOIjsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRXh0ZXJuYWxpemVkIEZ1bmN0aW9uIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBzYXBfZXZlbnRfaW5pdAorCisgICBERVNDUklQVElPTgorICAgIEZ1bmN0aW9uIGZvciBpbml0aWFsaXppbmcgc1dMQU5fU0FQRXZlbnQgc3RydWN0dXJlCisKKyAgIERFUEVOREVOQ0lFUworICAgIE5BLgorCisgICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHNhcEV2ZW50ICAgIDogU3RhdGUgbWFjaGluZSBldmVudAorCisgICBSRVRVUk4gVkFMVUUKKworICAgIE5vbmUKKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXBfZXZlbnRfaW5pdChwdFdMQU5fU0FQRXZlbnQgc2FwRXZlbnQpCit7CisJc2FwRXZlbnQtPmV2ZW50ID0gZVNBUF9NQUNfU0NBTl9DT01QTEVURTsKKwlzYXBFdmVudC0+cGFyYW1zID0gMDsKKwlzYXBFdmVudC0+dTEgPSAwOworCXNhcEV2ZW50LT51MiA9IDA7Cit9CisKKyNpZmRlZiBXTEFOX0VOQUJMRV9DSE5MX01BVFJJWF9SRVNUUklDVElPTgorLyoKKyAqIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgdGhlIGxlYWthZ2UgbWF0cml4IGZvciBnaXZlbiBOT0wgY2hhbm5lbCBhbmQgY2JNb2RlCisgKgorICogUEFSQU1FVEVSUworICogSU4KKyAqIHNhcENvbnRleHQgICAgICAgIDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisgKiBjYk1vZGUgICAgICAgICAgICA6IHRhcmdldCBjaGFubmVsIGJvbmRpbmcgbW9kZQorICogTk9MX2NoYW5uZWwgICAgICAgOiB0aGUgTk9MIGNoYW5uZWwgd2hvc2UgbGVha2FnZSBtYXRyaXggaXMgcmVxdWlyZWQKKyAqIHBUYXJnZXRfY2hubF9tdHJ4IDogcG9pbnRlciB0byB0YXJnZXQgY2hhbm5lbCBtYXRyaXggcmV0dXJuZWQuCisgKgorICogUkVUVVJOIFZBTFVFCisgKiBCT09MRUFOCisgKiBUUlVFOiAgbGVha2FnZSBtYXRyaXggd2FzIGZvdW5kCisgKiBGQUxTRTogbGVha2FnZSBtYXRyaXggd2FzIG5vdCBmb3VuZAorICovCitib29sCitzYXBfZmluZF90YXJnZXRfY2hhbm5lbF9pbl9jaGFubmVsX21hdHJpeChwdFNhcENvbnRleHQgc2FwQ29udGV4dCwKKwkJCQkJICBlUGh5Q2hhbkJvbmRTdGF0ZSBjYk1vZGUsCisJCQkJCSAgdWludDhfdCBOT0xfY2hhbm5lbCwKKwkJCQkJICB0U2FwVHhMZWFrSW5mbyAqKnBUYXJnZXRfY2hubF9tdHJ4KQoreworCXRTYXBUeExlYWtJbmZvICp0YXJnZXRfY2hhbl9tYXRyaXggPSBOVUxMOworCXRTYXBDaGFuTWF0cml4SW5mbyAqcGNoYW5fbWF0cml4ID0gTlVMTDsKKwl1aW50MzJfdCBuY2hhbl9tYXRyaXg7CisJaW50IGkgPSAwOworCisJc3dpdGNoIChjYk1vZGUpIHsKKwljYXNlIFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDoKKwkJLyogSFQyMCAqLworCQlwY2hhbl9tYXRyaXggPSBodDIwX2NoYW47CisJCW5jaGFuX21hdHJpeCA9IENERl9BUlJBWV9TSVpFKGh0MjBfY2hhbik7CisJCWJyZWFrOworCWNhc2UgUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWToKKwljYXNlIFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWToKKwkJLyogSFQ0MCAqLworCQlwY2hhbl9tYXRyaXggPSBodDQwX2NoYW47CisJCW5jaGFuX21hdHJpeCA9IENERl9BUlJBWV9TSVpFKGh0NDBfY2hhbik7CisJCWJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0xPVzoKKwljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0xPVzoKKwljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfSElHSDoKKwljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0hJR0g6CisJCS8qIEhUODAgKi8KKwkJcGNoYW5fbWF0cml4ID0gaHQ4MF9jaGFuOworCQluY2hhbl9tYXRyaXggPSBDREZfQVJSQVlfU0laRShodDgwX2NoYW4pOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCS8qIGhhbmRsZSBleGNlcHRpb24gYW5kIGZhbGwgYmFjayB0byBIVDIwIHRhYmxlICovCisJCXBjaGFuX21hdHJpeCA9IGh0MjBfY2hhbjsKKwkJbmNoYW5fbWF0cml4ID0gQ0RGX0FSUkFZX1NJWkUoaHQyMF9jaGFuKTsKKwkJYnJlYWs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5jaGFuX21hdHJpeDsgaSsrKSB7CisJCS8qIGZpbmQgdGhlIFNBUCBjaGFubmVsIHRvIG1hcCB0aGUgbGVha2FnZSBtYXRyaXggKi8KKwkJaWYgKE5PTF9jaGFubmVsID09IHBjaGFuX21hdHJpeFtpXS5jaGFubmVsKSB7CisJCQl0YXJnZXRfY2hhbl9tYXRyaXggPSBwY2hhbl9tYXRyaXhbaV0uY2hhbl9tYXRyaXg7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChOVUxMID09IHRhcmdldF9jaGFuX21hdHJpeCkgeworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJKnBUYXJnZXRfY2hubF9tdHJ4ID0gdGFyZ2V0X2NoYW5fbWF0cml4OworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogc2FwX21hcmtfY2hhbm5lbHNfbGVha2luZ19pbnRvX25vbCgpIC0gdG8gbWFyayBjaGFubmVsIGxlYWtpbmcgaW4gdG8gbm9sCisgKiBAc2FwX2N0eDogcG9pbnRlciB0byBTQVAgY29udGV4dAorICogQGNiX21vZGU6IGNoYW5uZWwgYm9uZGluZyBtb2RlCisgKiBAbm9sOiBub2wgaW5mbworICogQHRlbXBfY2hfbHN0X3N6OiB0aGUgdGFyZ2V0IGNoYW5uZWwgbGlzdAorICogQHRlbXBfY2hfbHN0OiB0aGUgdGFyZ2V0IGNoYW5uZWwgbGlzdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgY2hhbm5lbHMgZnJvbSB0ZW1wIGNoYW5uZWwgbGlzdCB0aGF0CisgKiAoaWYgc2VsZWN0ZWQgYXMgdGFyZ2V0IGNoYW5uZWwpIHdpbGwgY2F1c2UgbGVha2FnZSBpbiBvbmUgb2YKKyAqIHRoZSBOT0wgY2hhbm5lbHMKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworCitDREZfU1RBVFVTCitzYXBfbWFya19jaGFubmVsc19sZWFraW5nX2ludG9fbm9sKHB0U2FwQ29udGV4dCBzYXBfY3R4LAorCQllUGh5Q2hhbkJvbmRTdGF0ZSBjYl9tb2RlLAorCQl0U2FwRGZzTm9sSW5mbyAqbm9sLAorCQl1aW50OF90IHRlbXBfY2hfbHN0X3N6LAorCQl1aW50OF90ICp0ZW1wX2NoX2xzdCkKK3sKKwl0U2FwVHhMZWFrSW5mbyAqdGFyZ2V0X2NoYW5fbWF0cml4ID0gTlVMTDsKKwl1aW50MzJfdCAgICAgICAgIG51bV9jaGFubmVsID0gKFJGX0NIQU5fMTQ0IC0gUkZfQ0hBTl8zNikgKyAxOworCXVpbnQzMl90ICAgICAgICAgaSA9IDA7CisJdWludDMyX3QgICAgICAgICBqID0gMDsKKwl1aW50MzJfdCAgICAgICAgIGsgPSAwOworCXVpbnQ4X3QgICAgICAgICAgZGZzX25vbF9jaGFubmVsOworCisKKwkvKiB0cmF2ZXJzZSB0YXJnZXRfY2hhbl9tYXRyaXggYW5kICovCisJZm9yIChpID0gMDsgaSA8IE5VTV81R0haX0NIQU5ORUxTIDsgaSsrKSB7CisJCWRmc19ub2xfY2hhbm5lbCA9IG5vbFtpXS5kZnNfY2hhbm5lbF9udW1iZXI7CisJCWlmIChub2xbaV0ucmFkYXJfc3RhdHVzX2ZsYWcgPT0gZVNBUF9ERlNfQ0hBTk5FTF9VU0FCTEUgfHwKKwkJICAgIG5vbFtpXS5yYWRhcl9zdGF0dXNfZmxhZyA9PSBlU0FQX0RGU19DSEFOTkVMX0FWQUlMQUJMRSkgeworCQkJLyogbm90IHByZXNlbnQgaW4gTk9MICovCisJCQljb250aW51ZTsKKwkJfQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCUZMKCJzYXBkZnM6IHByb2Nlc3NpbmcgTk9MIGNoYW5uZWw6ICVkIiksCisJCQlkZnNfbm9sX2NoYW5uZWwpOworCQlpZiAoZmFsc2UgPT0gc2FwX2ZpbmRfdGFyZ2V0X2NoYW5uZWxfaW5fY2hhbm5lbF9tYXRyaXgoCisJCQkJCXNhcF9jdHgsIGNiX21vZGUsIGRmc19ub2xfY2hhbm5lbCwKKwkJCQkJJnRhcmdldF9jaGFuX21hdHJpeCkpIHsKKwkJCS8qCisJCQkgKiBzaG91bGQgbmV2ZXIgaGFwcGVuLCB3ZSBzaG91bGQgYWx3YXlzIGZpbmQgYSB0YWJsZQorCQkJICogaGVyZSwgaWYgd2UgZG9uJ3QsIG5lZWQgYSBmaXggaGVyZSEKKwkJCSAqLworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTCgiQ291bGRuJ3QgZmluZCB0YXJnZXQgY2hhbm5lbCBtYXRyaXghIikpOworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQkvKgorCQkgKiBmb2xsb3dpbmcgaXMgYmFzZWQgb24gYXNzdW1wdGlvbiB0aGF0IGJvdGggdGVtcF9jaF9sc3QKKwkJICogYW5kIHRhcmdldCBjaGFubmVsIG1hdHJpeCBhcmUgaW4gaW5jcmVhc2luZyBvcmRlciBvZgorCQkgKiBjaGFubmVsSUQKKwkJICovCisJCWZvciAoaiA9IDAsIGsgPSAwOyBqIDwgdGVtcF9jaF9sc3Rfc3ogJiYgayA8IG51bV9jaGFubmVsOykgeworCQkJaWYgKHRlbXBfY2hfbHN0W2pdID09IDApIHsKKwkJCQlqKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAodGFyZ2V0X2NoYW5fbWF0cml4W2tdLmxlYWtfY2hhbiAhPSB0ZW1wX2NoX2xzdFtqXSkgeworCQkJCWsrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBjaGVjayBsZWFrYWdlIGZyb20gY2FuZGlkYXRlIGNoYW5uZWwKKwkJCSAqIHRvIE5PTCBjaGFubmVsCisJCQkgKi8KKwkJCWlmICh0YXJnZXRfY2hhbl9tYXRyaXhba10ubGVha19sdmwgPD0KKwkJCQkJU0FQX1RYX0xFQUtBR0VfVEhSRVMpIHsKKwkJCQkvKgorCQkJCSAqIGNhbmRpZGF0ZSBjaGFubmVsIHdpbGwgaGF2ZQorCQkJCSAqIGJhZCBsZWFrYWdlIGluIE5PTCBjaGFubmVsLAorCQkJCSAqIHJlbW92ZSBmcm9tIHRlbXAgbGlzdAorCQkJCSAqLworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCQlGTCgic2FwZGZzOiBjaGFubmVsOiAlZCB3aWxsIGhhdmUgYmFkIGxlYWthZ2UgZHVlIHRvIGNoYW5uZWw6ICVkXG4iKSwKKwkJCQkJZGZzX25vbF9jaGFubmVsLCB0ZW1wX2NoX2xzdFtqXSk7CisJCQkJdGVtcF9jaF9sc3Rbal0gPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaisrOworCQkJaysrOworCQl9CisJfSAvKiBlbmQgb2YgbG9vcCB0aGF0IHNlbGVjdHMgZWFjaCBOT0wgKi8KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8qIGVuZCBvZiBXTEFOX0VOQUJMRV9DSE5MX01BVFJJWF9SRVNUUklDVElPTiAqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBhZGRzIGF2YWlsYWJlIGNoYW5uZWwgdG8gYml0bWFwCisgKgorICogUEFSQU1FVEVSUworICogSU4KKyAqIHBCaXRtYXA6IGJpdG1hcCB0byBwb3B1bGF0ZQorICogY2hhbm5lbDogY2hhbm5lbCB0byBzZXQgaW4gYml0bWFwCisgKi8KK3N0YXRpYyB2b2lkIHNhcF9zZXRfYml0bWFwKGNoYW5fYm9uZGluZ19iaXRtYXAgKnBCaXRtYXAsIHVpbnQ4X3QgY2hhbm5lbCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IHN0YXJ0X2NoYW5uZWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfODBNSFpfQkFORFM7IGkrKykgeworCQlzdGFydF9jaGFubmVsID0gcEJpdG1hcC0+Y2hhbkJvbmRpbmdTZXRbaV0uc3RhcnRDaGFubmVsOworCQlpZiAoY2hhbm5lbCA+PSBzdGFydF9jaGFubmVsICYmIGNoYW5uZWwgPD0gc3RhcnRfY2hhbm5lbCArIDEyKSB7CisJCQlwQml0bWFwLT5jaGFuQm9uZGluZ1NldFtpXS5jaGFubmVsTWFwIHw9CisJCQkJMSA8PCAoKGNoYW5uZWwgLSBzdGFydF9jaGFubmVsKSAvIDQpOworCQkJcmV0dXJuOworCQl9CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgIEZMKCJDaGFubmVsPSVkIGlzIG5vdCBpbiB0aGUgYml0bWFwIiksIGNoYW5uZWwpOworfQorCisvKioKKyAqIHNhcF9wb3B1bGF0ZV9hdmFpbGFibGVfY2hhbm5lbHMgLSBUbyBwb3B1bGF0ZSBhdmFpbGFibGUgY2hhbm5lbAorICogQGJpdG1hcDogYml0bWFwIHRvIHBvcHVsYXRlCisgKiBAY3VycmVudF9jYm1vZGU6IGNiIG1vZGUgdG8gY2hlY2sgZm9yIGNoYW5uZWwgYXZhaWxhYmlsaXR5CisgKiBAYXZhaWxfY2hubDogYXZhaWxhYmxlIGNoYW5uZWwgbGlzdCB0byBwb3B1bGF0ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGJpdG1hcCBhbmQgcG9wdWxhdGVzIGF2YWlsYWJsZSBjaGFubmVsCisgKiBsaXN0IGFjY29yZGluZyB0byBjaGFubmVsIGJvbmRpbmcgbW9kZS4gVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3IKKyAqIDgwIE1IeiBhbmQgNDAgTWh6IG9ubHkuIEZvciAyMCBNSHogbm8gbmVlZCBmb3IgYml0bWFwIGhlbmNlIGxpc3QKKyAqIGlzIGRpcmVjdGx5IGNyZWF0ZWQgd2hpbGUgcGFyc2luZyB0aGUgbWFpbiBsaXN0CisgKgorICogUmV0dXJuOiBudW1iZXIgb2YgY2hhbm5lbHMgZm91bmQKKyAqLworc3RhdGljIHVpbnQ4X3Qgc2FwX3BvcHVsYXRlX2F2YWlsYWJsZV9jaGFubmVscyhjaGFuX2JvbmRpbmdfYml0bWFwICpiaXRtYXAsCisJCWVQaHlDaGFuQm9uZFN0YXRlIGN1cnJlbnRfY2Jtb2RlLAorCQl1aW50OF90ICphdmFpbF9jaG5sKQoreworCXVpbnQ4X3QgaSA9IDA7CisJdWludDhfdCBjaG5sX2NvdW50ID0gMDsKKwl1aW50OF90IHN0YXJ0X2NoYW5uZWwgPSAwOworCisJc3dpdGNoIChjdXJyZW50X2NibW9kZSkgeworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJLyogSFQ4MCAqLworCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9MT1c6CisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9MT1c6CisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0hJR0g6CisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9ISUdIOgorCQlmb3IgKGkgPSAwOyBpIDwgTUFYXzgwTUhaX0JBTkRTOyBpKyspIHsKKwkJCXN0YXJ0X2NoYW5uZWwgPSBiaXRtYXAtPmNoYW5Cb25kaW5nU2V0W2ldLnN0YXJ0Q2hhbm5lbDsKKwkJCWlmIChiaXRtYXAtPmNoYW5Cb25kaW5nU2V0W2ldLmNoYW5uZWxNYXAgPT0KKwkJCQlTQVBfODBNSFpfTUFTSykgeworCQkJCWF2YWlsX2NobmxbY2hubF9jb3VudCsrXSA9IHN0YXJ0X2NoYW5uZWw7CisJCQkJYXZhaWxfY2hubFtjaG5sX2NvdW50KytdID0gc3RhcnRfY2hhbm5lbCArIDQ7CisJCQkJYXZhaWxfY2hubFtjaG5sX2NvdW50KytdID0gc3RhcnRfY2hhbm5lbCArIDg7CisJCQkJYXZhaWxfY2hubFtjaG5sX2NvdW50KytdID0gc3RhcnRfY2hhbm5lbCArIDEyOworCQkJfQorCQl9CisJCWJyZWFrOworI2VuZGlmCisJLyogSFQ0MCAqLworCWNhc2UgUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWToKKwljYXNlIFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWToKKwkJZm9yIChpID0gMDsgaSA8IE1BWF84ME1IWl9CQU5EUzsgaSsrKSB7CisJCQlzdGFydF9jaGFubmVsID0gYml0bWFwLT5jaGFuQm9uZGluZ1NldFtpXS5zdGFydENoYW5uZWw7CisJCQlpZiAoKGJpdG1hcC0+Y2hhbkJvbmRpbmdTZXRbaV0uY2hhbm5lbE1hcCAmCisJCQkJU0FQXzQwTUhaX01BU0tfTCkgPT0gU0FQXzQwTUhaX01BU0tfTCkgeworCQkJCWF2YWlsX2NobmxbY2hubF9jb3VudCsrXSA9IHN0YXJ0X2NoYW5uZWw7CisJCQkJYXZhaWxfY2hubFtjaG5sX2NvdW50KytdID0gc3RhcnRfY2hhbm5lbCArIDQ7CisJCQl9IGVsc2UgaWYgKChiaXRtYXAtPmNoYW5Cb25kaW5nU2V0W2ldLmNoYW5uZWxNYXAgJgorCQkJCVNBUF80ME1IWl9NQVNLX0gpID09IFNBUF80ME1IWl9NQVNLX0gpIHsKKwkJCQlhdmFpbF9jaG5sW2NobmxfY291bnQrK10gPSBzdGFydF9jaGFubmVsICsgODsKKwkJCQlhdmFpbF9jaG5sW2NobmxfY291bnQrK10gPSBzdGFydF9jaGFubmVsICsgMTI7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiSW52YWxpZCBjYXNlLiIpKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGNobmxfY291bnQ7Cit9CisKKy8qCisgKiBGVU5DVElPTiAgc2FwX2Rmc19pc193NTNfaW52YWxpZAorICoKKyAqIERFU0NSSVBUSU9OIENoZWNrcyBpZiB0aGUgcGFzc2VkIGNoYW5uZWwgaXMgVzUzIGFuZCByZXR1cm5zIGlmCisgKiAgICAgICAgICAgICBTQVAgVzUzIG9wZWFyYXRpb24gaXMgYWxsb3dlZC4KKyAqCisgKiBERVBFTkRFTkNJRVMgUEFSQU1FVEVSUworICogSU4gaEhBTCA6IEhBTCBwb2ludGVyCisgKiBjaGFubmVsSUQ6IENoYW5uZWwgTnVtYmVyIHRvIGJlIHZlcmlmaWVkCisgKgorICogUkVUVVJOIFZBTFVFICA6IGJvb2wKKyAqICAgICAgICAgICAgICAgICB0cnVlOiBJZiBXNTMgb3BlcmF0aW9uIGlzIGRpc2FibGVkCisgKiAgICAgICAgICAgICAgICAgZmFsc2U6IElmIFc1MyBvcGVyYXRpb24gaXMgZW5hYmxlZAorICoKKyAqIFNJREUgRUZGRUNUUworICovCitib29sIHNhcF9kZnNfaXNfdzUzX2ludmFsaWQodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IGNoYW5uZWxJRCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjOworCisJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJpbnZhbGlkIHBNYWMiKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBKQVBBTiBXNTMgQ2hhbm5lbCBvcGVyYXRpb24gY2FwYWJpbGl0eQorCSAqLworCWlmICh0cnVlID09IHBNYWMtPnNhcC5TYXBEZnNJbmZvLmlzX2Rmc193NTNfZGlzYWJsZWQgJiYKKwkgICAgdHJ1ZSA9PSBJU19DSEFOX0pBUEFOX1c1MyhjaGFubmVsSUQpKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEZVTkNUSU9OICBzYXBfZGZzX2lzX2NoYW5uZWxfaW5fcHJlZmVycmVkX2xvY2F0aW9uCisgKgorICogREVTQ1JJUFRJT04gQ2hlY2tzIGlmIHRoZSBwYXNzZWQgY2hhbm5lbCBpcyBpbiBhY2NvcmRhbmNlIHdpdGggcHJlZmVycmVkCisgKiAgICAgICAgICBDaGFubmVsIGxvY2F0aW9uIHNldHRpbmdzLgorICoKKyAqIERFUEVOREVOQ0lFUyBQQVJBTUVURVJTCisgKiBJTiBoSEFMIDogSEFMIHBvaW50ZXIKKyAqIGNoYW5uZWxJRDogQ2hhbm5lbCBOdW1iZXIgdG8gYmUgdmVyaWZpZWQKKyAqCisgKiBSRVRVUk4gVkFMVUUgIDpib29sCisgKiAgICAgICAgdHJ1ZTpJZiBDaGFubmVsIGxvY2F0aW9uIGlzIHNhbWUgYXMgdGhlIHByZWZlcnJlZCBsb2NhdGlvbgorICogICAgICAgIGZhbHNlOklmIENoYW5uZWwgbG9jYXRpb24gaXMgbm90IHNhbWUgYXMgdGhlIHByZWZlcnJlZCBsb2NhdGlvbgorICoKKyAqIFNJREUgRUZGRUNUUworICovCitib29sIHNhcF9kZnNfaXNfY2hhbm5lbF9pbl9wcmVmZXJyZWRfbG9jYXRpb24odEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IGNoYW5uZWxJRCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjOworCisJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJpbnZhbGlkIHBNYWMiKSk7CisJCXJldHVybiB0cnVlOworCX0KKwlpZiAoKFNBUF9DSEFOX1BSRUZFUlJFRF9JTkRPT1IgPT0KKwkgICAgIHBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcF9vcGVyYXRpbmdfY2hhbl9wcmVmZXJyZWRfbG9jYXRpb24pICYmCisJICAgICh0cnVlID09IElTX0NIQU5fSkFQQU5fT1VURE9PUihjaGFubmVsSUQpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCSAgRkwKKwkJCQkgICgiQ0hBTj0lZCBpcyBPdXRkb29yIHNvIGludmFsaWQscHJlZmVycmVkIEluZG9vciBvbmx5IiksCisJCQkgIGNoYW5uZWxJRCk7CisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgaWYgKChTQVBfQ0hBTl9QUkVGRVJSRURfT1VURE9PUiA9PQorCQkgICAgcE1hYy0+c2FwLlNhcERmc0luZm8uc2FwX29wZXJhdGluZ19jaGFuX3ByZWZlcnJlZF9sb2NhdGlvbikKKwkJICAgJiYgKHRydWUgPT0gSVNfQ0hBTl9KQVBBTl9JTkRPT1IoY2hhbm5lbElEKSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkgIEZMCisJCQkJICAoIkNIQU49JWQgaXMgSW5kb29yIHNvIGludmFsaWQscHJlZmVycmVkIE91dGRvb3Igb25seSIpLAorCQkJICBjaGFubmVsSUQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKy8qKgorICogc2FwX2NoZWNrX2luX2F2b2lkX2NoX2xpc3QoKSAtIGNoZWNrcyBpZiBnaXZlbiBjaGFubmVsIHByZXNlbnQgaXMgY2hhbm5lbAorICogYXZvaWRhbmNlIGxpc3QKKyAqCisgKiBAc2FwX2N0eDogICAgICAgIHNhcCBjb250ZXh0LgorICogQGNoYW5uZWw6ICAgICAgICBjaGFubmVsIHRvIGJlIGNoZWNrZWQgaW4gc2FwX2N0eCdzIGF2b2lkIGNoIGxpc3QKKyAqCisgKiBzYXBfY3R4IGNvbnRhaW5zIHNhcF9hdm9pZF9jaF9pbmZvIHN0cmN1dCBjb250YWluaW5nIHRoZSBsaXN0IG9mIGNoYW5uZWxzIG9uCisgKiB3aGljaCBNRE0gZGV2aWNlJ3MgQVAgd2l0aCBNQ0Mgd2FzIGRldGVjdGVkLiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBnaXZlbgorICogY2hhbm5lbCBpcyBwcmVzZW50IGluIHRoYXQgbGlzdC4KKyAqCisgKiBSZXR1cm46IHRydWUsIGlmIGNoYW5uZWwgd2FzIHByZXNlbnQsIGZhbHNlIG90aGVyc2llLgorICovCitib29sIHNhcF9jaGVja19pbl9hdm9pZF9jaF9saXN0KHB0U2FwQ29udGV4dCBzYXBfY3R4LCB1aW50OF90IGNoYW5uZWwpCit7CisJdWludDhfdCBpID0gMDsKKwlzdHJ1Y3Qgc2FwX2F2b2lkX2NoYW5uZWxzX2luZm8gKmllX2luZm8gPQorCQkmc2FwX2N0eC0+c2FwX2RldGVjdGVkX2F2b2lkX2NoX2llOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaWVfaW5mby0+Y2hhbm5lbHMpOyBpKyspCisJCWlmIChpZV9pbmZvLT5jaGFubmVsc1tpXSA9PSBjaGFubmVsKQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCisvKgorICogVGhpcyBmdW5jdGlvbiByYW5kb21seSBwaWNrIHVwIGFuIEFWQUlMQUJMRSBjaGFubmVsCisgKi8KK3N0YXRpYyB1aW50OF90IHNhcF9yYW5kb21fY2hhbm5lbF9zZWwocHRTYXBDb250ZXh0IHNhcENvbnRleHQpCit7CisJdWludDMyX3QgcmFuZG9tX2J5dGUgPSAwOworCXVpbnQ4X3QgYXZhaWxhYmxlX2NoX2NudCA9IDA7CisJdWludDhfdCAgYXZhaWxfZGZzX2NoYW5fY291bnQgPSAwOworCXVpbnQ4X3QgIGF2YWlsX25vbl9kZnNfY2hhbl9jb3VudCA9IDA7CisJdWludDhfdCB2YWxpZF9jaG5sX2NvdW50ID0gMDsKKwl1aW50OF90IGF2YWlsYWJsZUNoYW5uZWxzW1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl0gPSB7IDAsIH07CisJdWludDhfdCAgYXZhaWxfZGZzX2NoYW5fbGlzdFtXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dID0gezAsfTsKKwl1aW50OF90ICBhdmFpbF9ub25fZGZzX2NoYW5fbGlzdFtXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dID0gezAsfTsKKwl1aW50OF90IHRhcmdldF9jaGFubmVsID0gMDsKKwlib29sIGlzQ2hhbm5lbE5vbCA9IGZhbHNlOworCWJvb2wgaXNPdXRPZlJhbmdlID0gZmFsc2U7CisJY2hhbl9ib25kaW5nX2JpdG1hcCBjaGFubmVsQml0bWFwOworCXVpbnQ4X3QgaSA9IDA7CisJdWludDhfdCBjaGFubmVsSUQ7CisJdEhhbEhhbmRsZSBoSGFsID0gQ0RTX0dFVF9IQUxfQ0Ioc2FwQ29udGV4dC0+cF9jZHNfZ2N0eCk7CisJdHBBbmlTaXJHbG9iYWwgcE1hYzsKKwl1aW50MzJfdCBjaGFuV2lkdGg7CisJZVBoeUNoYW5Cb25kU3RhdGUgY2JNb2RlQ3VycmVudDsKKwl1aW50OF90ICAgKnRtcF9jaF9sc3QgPSBOVUxMOworCXVpbnQ4X3QgICBkZnNfcmVnaW9uOworCisJaWYgKE5VTEwgPT0gaEhhbCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImludmFsaWQgaEhhbCIpKTsKKwkJcmV0dXJuIHRhcmdldF9jaGFubmVsOworCX0KKworCXBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiaW52YWxpZCBwTWFjIikpOworCQlyZXR1cm4gdGFyZ2V0X2NoYW5uZWw7CisJfQorCisJLyoKKwkgKiBSZXRyaWV2ZSB0aGUgb3JpZ2luYWwgb25lIGFuZCBzdG9yZSBpdC4KKwkgKiB1c2UgdGhlIHN0b3JlZCBvcmlnaW5hbCB2YWx1ZSB3aGVuIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24gbmV4dCB0aW1lCisJICogc28gZmFsbCBiYWNrIG1lY2hhbmlzbSBhbHdheXMgc3RhcnRzIHdpdGggb3JpZ2luYWwgaW5pIHZhbHVlLgorCSAqLworCWlmIChwTWFjLT5zYXAuU2FwRGZzSW5mby5vcmlnX2NiTW9kZSA9PSAwKSB7CisJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLm9yaWdfY2JNb2RlID0KKwkJCShzYXBDb250ZXh0LT5jaF93aWR0aF9vcmlnID4gQ0hfV0lEVEhfMjBNSFogPyAxIDogMCk7CisJCWNiTW9kZUN1cnJlbnQgPSBwTWFjLT5zYXAuU2FwRGZzSW5mby5vcmlnX2NiTW9kZTsKKwl9IGVsc2UgeworCQljYk1vZGVDdXJyZW50ID0gcE1hYy0+c2FwLlNhcERmc0luZm8ub3JpZ19jYk1vZGU7CisJfQorCisJLyoKKwkgKiBSZXRyaWV2ZSB0aGUgb3JpZ2luYWwgb25lIGFuZCBzdG9yZSBpdC4KKwkgKiB1c2UgdGhlIHN0b3JlZCBvcmlnaW5hbCB2YWx1ZSB3aGVuIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24gbmV4dCB0aW1lCisJICogc28gZmFsbCBiYWNrIG1lY2hhbmlzbSBhbHdheXMgc3RhcnRzIHdpdGggb3JpZ2luYWwgaW5pIHZhbHVlLgorCSAqLworCWlmIChwTWFjLT5zYXAuU2FwRGZzSW5mby5vcmlnX2NoYW5XaWR0aCA9PSAwKSB7CisJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLm9yaWdfY2hhbldpZHRoID0KKwkJCQkJc2FwQ29udGV4dC0+Y2hfd2lkdGhfb3JpZzsKKwkJY2hhbldpZHRoID0gcE1hYy0+c2FwLlNhcERmc0luZm8ub3JpZ19jaGFuV2lkdGg7CisJfSBlbHNlIHsKKwkJY2hhbldpZHRoID0gcE1hYy0+c2FwLlNhcERmc0luZm8ub3JpZ19jaGFuV2lkdGg7CisJfQorCisJaWYgKHNhcF9nZXQ1X2dfaHpfY2hhbm5lbF9saXN0KHNhcENvbnRleHQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJICBGTCgiR2V0dGluZyA1R2h6IGNoYW5uZWwgbGlzdCBmYWlsZWQiKSk7CisJCXJldHVybiB0YXJnZXRfY2hhbm5lbDsKKwl9CisKKwljZHNfZ2V0X2Rmc19yZWdpb24oJmRmc19yZWdpb24pOworCisJLyoKKwkgKiB2YWxpZF9jaG5sX2NvdW50IHdpbGwgYmUgdXNlZCB0byBmaW5kIG51bWJlciBvZiB2YWxpZCBjaGFubmVscworCSAqIGFmdGVyIGZvbGxvd2luZyBmb3IgbG9vcCBlbmRzCisJICovCisJdmFsaWRfY2hubF9jb3VudCA9IHNhcENvbnRleHQtPlNhcEFsbENobmxMaXN0Lm51bUNoYW5uZWw7CisJLyogbG9vcCB0byBjaGVjayBBQ1MgcmFuZ2Ugb3IgTk9MIGNoYW5uZWxzICovCisJZm9yIChpID0gMDsgaSA8IHNhcENvbnRleHQtPlNhcEFsbENobmxMaXN0Lm51bUNoYW5uZWw7IGkrKykgeworCQljaGFubmVsSUQgPSBzYXBDb250ZXh0LT5TYXBBbGxDaG5sTGlzdC5jaGFubmVsTGlzdFtpXS5jaGFubmVsOworCisJCS8qCisJCSAqIElOIEpBUEFOIFJFR1VMQVRPUlkgRE9NQUlOIENIRUNLIElGIFRIRSBGT0xMT1dJTkcgVFdPCisJCSAqIFRXTyBSVUxFUyBBUFBMWSBBTkQgRklMVEVSIFRIRSBBVkFJTEFCTEUgQ0hBTk5FTFMKKwkJICogQUNDT1JESU5HTFkuCisJCSAqCisJCSAqIDEuIElmIHdlIGFyZSBvcGVyYXRpbmcgaW4gSmFwYW4gcmVndWxhdG9yeSBkb21haW4KKwkJICogQ2hlY2sgaWYgSmFwYW4gVzUzIENoYW5uZWwgb3BlcmF0aW9uIGlzIE5PVAorCQkgKiBhbGxvd2VkIGFuZCBpZiBpdHMgbm90IGFsbG93ZWQgdGhlbiBtYXJrIGFsbCB0aGUKKwkJICogVzUzIGNoYW5uZWxzIGFzIEludmFsaWQuCisJCSAqCisJCSAqIDIuIElmIHdlIGFyZSBvcGVyYXRpbmcgaW4gSmFwYW4gcmVndWxhdG9yeSBkb21haW4KKwkJICogQ2hlY2sgaWYgY2hhbm5lbCBzd2l0Y2ggYmV0d2VlbiBJbmRvb3IvT3V0ZG9vcgorCQkgKiBpcyBhbGxvd2VkLiBJZiBpdCBpcyBub3QgYWxsb3dlZCB0aGVuIGxpbWl0CisJCSAqIHRoZSBhdmFpYWJsZSBjaGFubmVscyB0byBJbmRvb3Igb3IgT3V0ZG9vcgorCQkgKiBjaGFubmVscyBvbmx5IGJhc2VkIHVwIG9uIHRoZSBTQVAgQ2hhbm5lbCBsb2NhdGlvbgorCQkgKiBpbmRpY2F0ZWQgYnkgInNhcF9vcGVyYXRpbmdfY2hhbm5lbF9sb2NhdGlvbiIgcGFyYW0uCisJCSAqLworCQlpZiAoREZTX01LSzRfRE9NQUlOID09IGRmc19yZWdpb24pIHsKKwkJCS8qCisJCQkgKiBDaGVjayBmb3IgSkFQQU4gVzUzIENoYW5uZWwgb3BlcmF0aW9uIGNhcGFiaWxpdHkKKwkJCSAqLworCQkJaWYgKHRydWUgPT0gc2FwX2Rmc19pc193NTNfaW52YWxpZChoSGFsLCBjaGFubmVsSUQpKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCQkJICBGTAorCQkJCQkgICgiaW5kZXg6JWQsIENoYW5uZWw9JWQgSW52YWxpZCxKYXBhbiBXNTMgRGlzYWJsZWQiKSwKKwkJCQkJICBpLCBjaGFubmVsSUQpOworCQkJCXNhcENvbnRleHQtPlNhcEFsbENobmxMaXN0LmNoYW5uZWxMaXN0W2ldLgorCQkJCQl2YWxpZCA9IGZhbHNlOworCQkJCXZhbGlkX2NobmxfY291bnQtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIFNBUCdzIHByZWZlcnJlZCBjaGFubmVsIGxvY2F0aW9uIGlzIEluZG9vcgorCQkJICogdGhlbiBzZXQgYWxsIHRoZSBvdXRkb29yIGNoYW5uZWxzIGluIHRoZSBkb21haW4KKwkJCSAqIHRvIGludmFsaWQuSWYgdGhlIHByZWZlcnJlZCBjaGFubmVsIGxvY2F0aW9uIGlzCisJCQkgKiBvdXRkb29yIHRoZW4gc2V0IGFsbCB0aGUgSW5kb29yIGNoYW5uZWxzIGluIHRoZQorCQkJICogZG9tYWluIHRvIEludmFsaWQuCisJCQkgKi8KKwkJCWlmIChmYWxzZSA9PQorCQkJICAgIHNhcF9kZnNfaXNfY2hhbm5lbF9pbl9wcmVmZXJyZWRfbG9jYXRpb24oaEhhbCwKKwkJCQkJCQkJY2hhbm5lbElEKSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkJCSAgRkwKKwkJCQkJICAoIkNIQU49JWQgaXMgaW52YWxpZCxwcmVmZXJyZWQgQ2hhbm5lbCBMb2NhdGlvbiAlZCBPbmx5IiksCisJCQkJCSAgY2hhbm5lbElELAorCQkJCQkgIHBNYWMtPnNhcC5TYXBEZnNJbmZvLgorCQkJCQkgIHNhcF9vcGVyYXRpbmdfY2hhbl9wcmVmZXJyZWRfbG9jYXRpb24pOworCQkJCXNhcENvbnRleHQtPlNhcEFsbENobmxMaXN0LmNoYW5uZWxMaXN0W2ldLgorCQkJCQl2YWxpZCA9IGZhbHNlOworCQkJCXZhbGlkX2NobmxfY291bnQtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWlmIChjZHNfZ2V0X2NoYW5uZWxfc3RhdGUoY2hhbm5lbElEKSA9PQorCQkgICAgQ0hBTk5FTF9TVEFURV9ERlMpIHsKKwkJCWlzQ2hhbm5lbE5vbCA9CisJCQkJc2FwX2Rmc19pc19jaGFubmVsX2luX25vbF9saXN0KHNhcENvbnRleHQsCisJCQkJCQljaGFubmVsSUQsCisJCQkJCQlQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQpOworCQkJaWYgKHRydWUgPT0gaXNDaGFubmVsTm9sKSB7CisJCQkJLyoKKwkJCQkgKiBNYXJrIHRoaXMgY2hhbm5lbCBpbnZhbGlkIHNpbmNlIGl0IGlzIHN0aWxsCisJCQkJICogaW4gREZTIE5vbi1PY2N1cGFuY3ktUGVyaW9kIHdoaWNoIGlzIDMwIG1pbnMuCisJCQkJICovCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCQkJICBGTAorCQkJCQkgICgiaW5kZXg6ICVkLCBDaGFubmVsID0gJWQgUHJlc2VudCBpbiBOT0wgTElTVCIpLAorCQkJCQkgIGksIGNoYW5uZWxJRCk7CisJCQkJc2FwQ29udGV4dC0+U2FwQWxsQ2hubExpc3QuY2hhbm5lbExpc3RbaV0uCisJCQkJCXZhbGlkID0gZmFsc2U7CisJCQkJdmFsaWRfY2hubF9jb3VudC0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKwkJLyogYXZvaWQgY2ggb24gd2hpY2ggYW5vdGhlciBNRE0gQVAgaW4gTUNDIG1vZGUgaXMgZGV0ZWN0ZWQgKi8KKwkJaWYgKHBNYWMtPnNhcC5zYXBfY2hhbm5lbF9hdm9pZGFuY2UKKwkJICAgICYmIHNhcENvbnRleHQtPnNhcF9kZXRlY3RlZF9hdm9pZF9jaF9pZS5wcmVzZW50KSB7CisJCQlpZiAoc2FwX2NoZWNrX2luX2F2b2lkX2NoX2xpc3Qoc2FwQ29udGV4dCwgY2hhbm5lbElEKSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkJCSAgRkwoImluZGV4OiAlZCwgQ2hhbm5lbCA9ICVkLCBhdm9pZGVkIGR1ZSB0byBwcmVzZW5jZSBvZiBhbm90aGVyIEFQK0FQIE1DQyBkZXZpY2UgaW4gc2FtZSBjaGFubmVsLiIpLAorCQkJCQkgIGksIGNoYW5uZWxJRCk7CisJCQkJc2FwQ29udGV4dC0+U2FwQWxsQ2hubExpc3QuY2hhbm5lbExpc3RbaV0udmFsaWQKKwkJCQkJPSBmYWxzZTsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCisJCS8qIGNoZWNrIGlmIHRoZSBjaGFubmVsIGlzIHdpdGhpbiBBQ1MgY2hhbm5lbCByYW5nZSAqLworCQlpc091dE9mUmFuZ2UgPSBzYXBfYWNzX2NoYW5uZWxfY2hlY2soc2FwQ29udGV4dCwgY2hhbm5lbElEKTsKKwkJaWYgKHRydWUgPT0gaXNPdXRPZlJhbmdlKSB7CisJCQkvKgorCQkJICogbWFyayB0aGlzIGNoYW5uZWwgaW52YWxpZCBzaW5jZSBpdCBpcyBvdXQgb2YgQUNTCisJCQkgKiBjaGFubmVsIHJhbmdlCisJCQkgKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCSAgRkwKKwkJCQkgICgiaW5kZXg6ICVkLCBDaGFubmVsID0gJWQgb3V0IG9mIEFDUyBjaGFubmVsIHJhbmdlIiksCisJCQkJICBpLCBjaGFubmVsSUQpOworCQkJc2FwQ29udGV4dC0+U2FwQWxsQ2hubExpc3QuY2hhbm5lbExpc3RbaV0udmFsaWQgPSBmYWxzZTsKKwkJCXZhbGlkX2NobmxfY291bnQtLTsKKwkJCWNvbnRpbnVlOworCQl9CisJfSAvKiBlbmQgb2YgY2hlY2sgZm9yIE5PTCBvciBBQ1MgY2hhbm5lbHMgKi8KKworCS8qIHZhbGlkX2NobmxfY291bnQgbm93IGhhdmUgbnVtYmVyIG9mIHZhbGlkIGNoYW5uZWxzICovCisJdG1wX2NoX2xzdCA9IGNkZl9tZW1fbWFsbG9jKHZhbGlkX2NobmxfY291bnQpOworCWlmICh0bXBfY2hfbHN0ID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTCgic2FwZGZzOiBtZW1vcnkgYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gdGFyZ2V0X2NoYW5uZWw7CisJfQorCisJZG8geworCQl1aW50OF90ICAgaiA9IDA7CisjaWZkZWYgV0xBTl9FTkFCTEVfQ0hOTF9NQVRSSVhfUkVTVFJJQ1RJT04KKwkJdFNhcERmc05vbEluZm8gKm5vbCA9IHBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcERmc0NoYW5uZWxOb2xMaXN0OworI2VuZGlmCisKKwkJLyogcHJlcGFyZSB0ZW1wIGxpc3Qgb2YganVzdCB0aGUgdmFsaWQgY2hhbm5lbHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNhcENvbnRleHQtPlNhcEFsbENobmxMaXN0Lm51bUNoYW5uZWw7IGkrKykgeworCQkJaWYgKHNhcENvbnRleHQtPlNhcEFsbENobmxMaXN0LmNoYW5uZWxMaXN0W2ldLnZhbGlkKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTAorCQkJCQkgICgic2FwZGZzOiBBZGRpbmcgQ2hhbm5lbCA9ICVkIHRvIHRlbXAgTGlzdCIpLAorCQkJCQkgIHNhcENvbnRleHQtPlNhcEFsbENobmxMaXN0LgorCQkJCQkJY2hhbm5lbExpc3RbaV0uY2hhbm5lbCk7CisJCQkJdG1wX2NoX2xzdFtqKytdID0gc2FwQ29udGV4dC0+U2FwQWxsQ2hubExpc3QuCisJCQkJCQkJY2hhbm5lbExpc3RbaV0uY2hhbm5lbDsKKwkJCX0KKwkJfQorCisjaWZkZWYgV0xBTl9FTkFCTEVfQ0hOTF9NQVRSSVhfUkVTVFJJQ1RJT04KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMCisJCQkgICgic2FwZGZzOiBQcm9jZXNzaW5nIHRlbXAgY2hhbm5lbCBsaXN0IGFnYWluc3QgTk9MLiIpCisJCQkgICk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJCXNhcF9tYXJrX2NoYW5uZWxzX2xlYWtpbmdfaW50b19ub2woc2FwQ29udGV4dCwKKwkJCQkJCQkgICBjYk1vZGVDdXJyZW50LAorCQkJCQkJCSAgIG5vbCwKKwkJCQkJCQkgICB2YWxpZF9jaG5sX2NvdW50LAorCQkJCQkJCSAgIHRtcF9jaF9sc3QpKSB7CisJCQljZGZfbWVtX2ZyZWUodG1wX2NoX2xzdCk7CisJCQlyZXR1cm4gdGFyZ2V0X2NoYW5uZWw7CisJCX0KKyNlbmRpZgorCQljZGZfbWVtX3plcm8oYXZhaWxhYmxlQ2hhbm5lbHMsIHNpemVvZihhdmFpbGFibGVDaGFubmVscykpOworCQljZGZfbWVtX3plcm8oJmNoYW5uZWxCaXRtYXAsIHNpemVvZihjaGFubmVsQml0bWFwKSk7CisJCWNoYW5uZWxCaXRtYXAuY2hhbkJvbmRpbmdTZXRbMF0uc3RhcnRDaGFubmVsID0gMzY7CisJCWNoYW5uZWxCaXRtYXAuY2hhbkJvbmRpbmdTZXRbMV0uc3RhcnRDaGFubmVsID0gNTI7CisJCWNoYW5uZWxCaXRtYXAuY2hhbkJvbmRpbmdTZXRbMl0uc3RhcnRDaGFubmVsID0gMTAwOworCQljaGFubmVsQml0bWFwLmNoYW5Cb25kaW5nU2V0WzNdLnN0YXJ0Q2hhbm5lbCA9IDExNjsKKwkJY2hhbm5lbEJpdG1hcC5jaGFuQm9uZGluZ1NldFszXS5zdGFydENoYW5uZWwgPSAxMzI7CisJCWNoYW5uZWxCaXRtYXAuY2hhbkJvbmRpbmdTZXRbNF0uc3RhcnRDaGFubmVsID0gMTQ5OworCQkvKiBub3cgbG9vcCB0aHJvdWdoIHdoYXRldmVyIGlzIGxlZnQgb2YgY2hhbm5lbCBsaXN0ICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgic2FwZGZzOiBNb3ZpbmcgdGVtcCBjaGFubmVsIGxpc3QgdG8gZmluYWwuIikpOworCQlmb3IgKGkgPSAwOyBpIDwgdmFsaWRfY2hubF9jb3VudDsgaSsrKSB7CisJCQkvKgorCQkJICogYWRkIGNoYW5uZWwgZnJvbSB0ZW1wIGNoYW5uZWwgbGlzdCB0byBiaXRtYXAgb3IgZmlhbmwKKwkJCSAqIGNoYW5uZWwgbGlzdCAoaW4gY2FzZSBvZiAyME1IeiB3aWR0aCkKKwkJCSAqLworCQkJaWYgKHRtcF9jaF9sc3RbaV0gIT0gMCkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJCSAgRkwoInNhcGRmczogcHJvY2Vzc2luZyBjaGFubmVsOiAlZCAiKSwKKwkJCQkJICB0bXBfY2hfbHN0W2ldKTsKKwkJCQkvKgorCQkJCSAqIGZvciAyME1IeiwgZGlyZWN0bHkgY3JlYXRlIGF2YWlsYWJsZQorCQkJCSAqIGNoYW5uZWwgbGlzdAorCQkJCSAqLworCQkJCWlmIChjYk1vZGVDdXJyZW50ID09CisJCQkJCVBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRCkgeworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkJCSAgRkwKKwkJCQkJCSAgKCJzYXBkZnM6IENoYW5uZWw9JWQgYWRkZWQgdG8gYXZhaWxhYmxlIGxpc3QiKSwKKwkJCQkJCSAgdG1wX2NoX2xzdFtpXSk7CisJCQkJCWF2YWlsYWJsZUNoYW5uZWxzW2F2YWlsYWJsZV9jaF9jbnQrK10gPQorCQkJCQkJdG1wX2NoX2xzdFtpXTsKKwkJCQl9IGVsc2UgeworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkJCSAgRkwoInNhcGRmczogQ2hhbm5lbD0lZCBhZGRlZCB0byBiaXRtYXAiKSwKKwkJCQkJCSAgdG1wX2NoX2xzdFtpXSk7CisJCQkJCXNhcF9zZXRfYml0bWFwKCZjaGFubmVsQml0bWFwLAorCQkJCQkJICAgICAgIHRtcF9jaF9sc3RbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIGlmIDQwIE1IeiBvciA4MCBNSHosIHBvcHVsYXRlIGF2YWlsYWJsZQorCQkgKiBjaGFubmVsIGxpc3QgZnJvbSBiaXRtYXAKKwkJICovCisJCWlmIChjYk1vZGVDdXJyZW50ICE9IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRCkgeworCQkJYXZhaWxhYmxlX2NoX2NudCA9CisJCQkJc2FwX3BvcHVsYXRlX2F2YWlsYWJsZV9jaGFubmVscygmY2hhbm5lbEJpdG1hcCwKKwkJCQkJCQljYk1vZGVDdXJyZW50LAorCQkJCQkJCWF2YWlsYWJsZUNoYW5uZWxzKTsKKwkJCS8qCisJCQkgKiBpZiBubyB2YWxpZCBjaGFubmVsIGJvbmRpbmcgZm91bmQsCisJCQkgKiBmYWxsYmFjayB0byBsb3dlciBiYW5kd2lkdGgKKwkJCSAqLworCQkJaWYgKGF2YWlsYWJsZV9jaF9jbnQgPT0gMCkgeworCQkJCWlmIChjYk1vZGVDdXJyZW50ID49CisJCQkJICAgIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfQ0VOVEVSRUQpIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJCSAgRkwKKwkJCQkJCSAgKCJzYXBkZnM6Tm8gODBNSHogY2IgZm91bmQsIGZhbGxpbmcgdG8gNDBNSHoiKSk7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJCQkgIEZMCisJCQkJCQkgICgic2FwZGZzOkNoYW5naW5nIGNoYW5XaWR0aCBmcm9tIFslZF0gdG8gWyVkXSIpLAorCQkJCQkJICBjaGFuV2lkdGgsCisJCQkJCQkgIENIX1dJRFRIXzQwTUhaKTsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJCSAgRkwKKwkJCQkJCSAgKCJzYXBkZnM6Q2hhbmdpbmcgQ0IgbW9kZSBmcm9tIFslZF0gdG8gWyVkXSIpLAorCQkJCQkJICBjYk1vZGVDdXJyZW50LAorCQkJCQkJICBQSFlfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlkKKwkJCQkJCSAgKTsKKwkJCQkJY2JNb2RlQ3VycmVudCA9CisJCQkJCQlQSFlfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlk7CisJCQkJCWNoYW5XaWR0aCA9IENIX1dJRFRIXzQwTUhaOworCQkJCQkvKiBjb250aW51ZSB0byBzdGFydCBvZiBkbyBsb29wICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSBpZiAoY2JNb2RlQ3VycmVudCA+PQorCQkJCQkgICBQSFlfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlkpIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJCSAgRkwKKwkJCQkJCSAgKCJzYXBkZnM6Tm8gNDBNSHogY2IgZm91bmQsIGZhbGxpbmcgdG8gMjBNSHoiKSk7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJCQkgIEZMCisJCQkJCQkgICgic2FwZGZzOkNoYW5naW5nIGNoYW5XaWR0aCBmcm9tIFslZF0gdG8gWyVkXSIpLAorCQkJCQkJICBjaGFuV2lkdGgsCisJCQkJCQkgIENIX1dJRFRIXzIwTUhaKTsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJCSAgRkwKKwkJCQkJCSAgKCJzYXBkZnM6Q2hhbmdpbmcgQ0IgbW9kZSBmcm9tIFslZF0gdG8gWyVkXSIpLAorCQkJCQkJICBjYk1vZGVDdXJyZW50LAorCQkJCQkJICBQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQpOworCQkJCQljYk1vZGVDdXJyZW50ID0KKwkJCQkJCVBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKwkJCQkJY2hhbldpZHRoID0gQ0hfV0lEVEhfMjBNSFo7CisJCQkJCS8qIGNvbnRpbnVlIHRvIHN0YXJ0IG9mIGRvIGxvb3AgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJICogYnkgbm93LCBhdmFpbGFibGUgY2hhbm5lbHMgbGlzdCB3aWxsIGJlIHBvcHVsYXRlZCBvcgorCQkgKiBubyBjaGFubmVscyBhcmUgYXZhaWFsYmUKKwkJICovCisJCWlmIChhdmFpbGFibGVfY2hfY250KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlX2NoX2NudDsgaSsrKSB7CisJCQkJaWYgKENEU19JU19ERlNfQ0goYXZhaWxhYmxlQ2hhbm5lbHNbaV0pKSB7CisJCQkJCWF2YWlsX2Rmc19jaGFuX2xpc3RbCisJCQkJCQlhdmFpbF9kZnNfY2hhbl9jb3VudCsrXSA9CisJCQkJCQkJYXZhaWxhYmxlQ2hhbm5lbHNbaV07CisJCQkJfSBlbHNlIHsKKwkJCQkJYXZhaWxfbm9uX2Rmc19jaGFuX2xpc3RbCisJCQkJCQlhdmFpbF9ub25fZGZzX2NoYW5fY291bnQrK10gPQorCQkJCQkJCWF2YWlsYWJsZUNoYW5uZWxzW2ldOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCQlGTCgiTm8gdGFyZ2V0IGNoYW5uZWwgZm91bmQiKSk7CisJCX0KKworCQljZHNfcmFuZF9nZXRfYnl0ZXMoMCwgKHVpbnQ4X3QgKikmcmFuZG9tX2J5dGUsIDEpOworCisJCS8qIEdpdmUgcHJlZmVyZW5jZSB0byBub24tREZTIGNoYW5uZWwgKi8KKwkJaWYgKCFwTWFjLT5mX3ByZWZlcl9ub25fZGZzX29uX3JhZGFyKSB7CisJCQlpID0gKHJhbmRvbV9ieXRlICsgY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKSkgJQorCQkJCWF2YWlsYWJsZV9jaF9jbnQ7CisJCQl0YXJnZXRfY2hhbm5lbCA9IGF2YWlsYWJsZUNoYW5uZWxzW2ldOworCQl9IGVsc2UgaWYgKGF2YWlsX25vbl9kZnNfY2hhbl9jb3VudCkgeworCQkJaSA9IChyYW5kb21fYnl0ZSArIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCkpICUKKwkJCQlhdmFpbF9ub25fZGZzX2NoYW5fY291bnQ7CisJCQl0YXJnZXRfY2hhbm5lbCA9IGF2YWlsX25vbl9kZnNfY2hhbl9saXN0W2ldOworCQl9IGVsc2UgeworCQkJaSA9IChyYW5kb21fYnl0ZSArIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCkpICUKKwkJCQlhdmFpbF9kZnNfY2hhbl9jb3VudDsKKwkJCXRhcmdldF9jaGFubmVsID0gYXZhaWxfZGZzX2NoYW5fbGlzdFtpXTsKKwkJfQorCisJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLm5ld19jaGFuV2lkdGggPSBjaGFuV2lkdGg7CisJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLm5ld19jYk1vZGUgPSBjYk1vZGVDdXJyZW50OworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCUZMKCJzYXBkZnM6IE5ldyBDQiBtb2RlID0gJWQiKSwKKwkJCQlwTWFjLT5zYXAuU2FwRGZzSW5mby5uZXdfY2JNb2RlKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCUNERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCQlGTCgic2FwZGZzOiBOZXcgQ2hhbm5lbCB3aWR0aCA9ICVkIiksCisJCQkJcE1hYy0+c2FwLlNhcERmc0luZm8ubmV3X2NoYW5XaWR0aCk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQlDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkJRkwoInNhcGRmczogdGFyZ2V0X2NoYW5uZWwgPSAlZCIpLAorCQkJCXRhcmdldF9jaGFubmVsKTsKKwkJYnJlYWs7CisJLyogdGhpcyBsb29wIHdpbGwgaXRlcmF0ZSBhdCBtYXggMyB0aW1lcyAqLworCX0gd2hpbGUgKDEpOworCWNkZl9tZW1fZnJlZSh0bXBfY2hfbHN0KTsKKwlyZXR1cm4gdGFyZ2V0X2NoYW5uZWw7Cit9CisKK2Jvb2wgc2FwX2Fjc19jaGFubmVsX2NoZWNrKHB0U2FwQ29udGV4dCBzYXBDb250ZXh0LCB1aW50OF90IGNoYW5uZWxOdW1iZXIpCit7CisJaW50IGkgPSAwOworCWlmICghc2FwQ29udGV4dC0+YWNzX2NmZy0+YWNzX21vZGUpCisJCXJldHVybiBmYWxzZTsKKworCWlmICgoY2hhbm5lbE51bWJlciA+PSBzYXBDb250ZXh0LT5hY3NfY2ZnLT5zdGFydF9jaCkgfHwKKwkJKGNoYW5uZWxOdW1iZXIgPD0gc2FwQ29udGV4dC0+YWNzX2NmZy0+ZW5kX2NoKSkgeworCQlpZiAoIXNhcENvbnRleHQtPmFjc19jZmctPmNoX2xpc3QpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzYXBDb250ZXh0LT5hY3NfY2ZnLT5jaF9saXN0X2NvdW50OyBpKyspCisJCQkJaWYgKGNoYW5uZWxOdW1iZXIgPT0KKwkJCQkJCXNhcENvbnRleHQtPmFjc19jZmctPmNoX2xpc3RbaV0pCisJCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBzYXBfbWFya19kZnNfY2hhbm5lbHMoKSAtIHRvIG1hcmsgZGZzIGNoYW5uZWwKKyAqIEBzYXBDb250ZXh0OiBwb2ludGVyIHNhcCBjb250ZXh0CisgKiBAY2hhbm5lbHM6IGxpc3Qgb2YgY2hhbm5lbHMKKyAqIEBudW1DaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzCisgKiBAdGltZTogdGltZQorICoKKyAqIE1hcmsgdGhlIGNoYW5uZWxzIGluIE5PTCB3aXRoIHRpbWUgYW5kIGVTQVBfREZTX0NIQU5ORUxfVU5BVkFJTEFCTEUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBzYXBfbWFya19kZnNfY2hhbm5lbHMocHRTYXBDb250ZXh0IHNhcENvbnRleHQsIHVpbnQ4X3QgKmNoYW5uZWxzLAorCQkJICAgdWludDhfdCBudW1DaGFubmVscywgdWludDY0X3QgdGltZSkKK3sKKwlpbnQgaSwgajsKKwl0U2FwRGZzTm9sSW5mbyAqcHNhcERmc0NoYW5uZWxOb2xMaXN0ID0gTlVMTDsKKwl1aW50OF90IG5SZWdEb21haW5EZnNDaGFubmVsczsKKwl0SGFsSGFuZGxlIGhIYWw7CisJdHBBbmlTaXJHbG9iYWwgcE1hYzsKKworCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihzYXBDb250ZXh0LT5wX2Nkc19nY3R4KTsKKwlpZiAoTlVMTCA9PSBjaGFubmVscykKKwkJcmV0dXJuOworCWlmIChOVUxMID09IGhIYWwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJpbnZhbGlkIGhIYWwiKSk7CisJCXJldHVybjsKKwl9CisJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJpbnZhbGlkIHBNYWMiKSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIE1hcmsgdGhlIGN1cnJlbnQgY2hhbm5lbCBvbiB3aGljaCBSYWRhciBpcyBmb3VuZAorCSAqIGluIHRoZSBOT0wgbGlzdCBhcyBlU0FQX0RGU19DSEFOTkVMX1VOQVZBSUxBQkxFLgorCSAqLworCXBzYXBEZnNDaGFubmVsTm9sTGlzdCA9IHBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcERmc0NoYW5uZWxOb2xMaXN0OworCW5SZWdEb21haW5EZnNDaGFubmVscyA9CisJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLm51bUN1cnJlbnRSZWdEb21haW5EZnNDaGFubmVsczsKKworCWZvciAoaSA9IDA7IGkgPCBudW1DaGFubmVsczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPD0gblJlZ0RvbWFpbkRmc0NoYW5uZWxzOyBqKyspIHsKKwkJCWlmICghKHBzYXBEZnNDaGFubmVsTm9sTGlzdFtqXS5kZnNfY2hhbm5lbF9udW1iZXIgPT0KKwkJCQkJY2hhbm5lbHNbaV0pKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIElmIGNoYW5uZWwgaXMgYWxyZWFkeSBpbiBOT0wsIGRvbid0IHVwZGF0ZSBpdCBhZ2Fpbi4KKwkJCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gbWFya2luZyBib25kaW5nIGNoYW5uZWxzIHdoaWNoCisJCQkgKiBhcmUgYWxyZWFkeSB1bmF2YWlsYWJsZS4KKwkJCSAqLworCQkJaWYgKHBzYXBEZnNDaGFubmVsTm9sTGlzdFtqXS5yYWRhcl9zdGF0dXNfZmxhZyA9PQorCQkJCQllU0FQX0RGU19DSEFOTkVMX1VOQVZBSUxBQkxFKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkJCUZMKCJDaGFubmVsPSVkIGFscmVhZHkgaW4gTk9MIiksCisJCQkJCQljaGFubmVsc1tpXSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogQ2FwdHVyZSB0aGUgUmFkYXIgRm91bmQgdGltZXN0YW1wIG9uIHRoZQorCQkJICogQ3VycmVudCBDaGFubmVsIGluIG1zLgorCQkJICovCisJCQlwc2FwRGZzQ2hhbm5lbE5vbExpc3Rbal0ucmFkYXJfZm91bmRfdGltZXN0YW1wID0gdGltZTsKKwkJCS8qIE1hcmsgdGhlIENoYW5uZWwgdG8gYmUgdW5hdmFpbGJsZSBmb3IgbmV4dCAzMCBtaW5zICovCisJCQlwc2FwRGZzQ2hhbm5lbE5vbExpc3Rbal0ucmFkYXJfc3RhdHVzX2ZsYWcgPQorCQkJCWVTQVBfREZTX0NIQU5ORUxfVU5BVkFJTEFCTEU7CisKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQlDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCUZMKCJDaGFubmVsPSVkIEFkZGVkIHRvIE5PTCBMSVNUIiksCisJCQkJY2hhbm5lbHNbaV0pOworCQl9CisJfQorfQorCisvKgorICogVGhpcyBGdW5jdGlvbiBpcyB0byBnZXQgYm9uZGluZyBjaGFubmVscyBmcm9tIHByaW1hcnkgY2hhbm5lbC4KKyAqCisgKi8KK3VpbnQ4X3Qgc2FwX2dldF9ib25kaW5nX2NoYW5uZWxzKHB0U2FwQ29udGV4dCBzYXBDb250ZXh0LCB1aW50OF90IGNoYW5uZWwsCisJCQkJIHVpbnQ4X3QgKmNoYW5uZWxzLCB1aW50OF90IHNpemUsCisJCQkJIGVQaHlDaGFuQm9uZFN0YXRlIGNoYW5Cb25kU3RhdGUpCit7CisJdEhhbEhhbmRsZSBoSGFsID0gQ0RTX0dFVF9IQUxfQ0Ioc2FwQ29udGV4dC0+cF9jZHNfZ2N0eCk7CisJdHBBbmlTaXJHbG9iYWwgcE1hYzsKKwl1aW50OF90IG51bUNoYW5uZWw7CisKKwlpZiAoY2hhbm5lbHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2l6ZSA8IE1BWF9CT05ERURfQ0hBTk5FTFMpCisJCXJldHVybiAwOworCisJaWYgKE5VTEwgIT0gaEhhbCkgeworCQlwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJfSBlbHNlCisJCXJldHVybiAwOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICBGTCgiY2Jtb2RlOiAlZCwgY2hhbm5lbDogJWQiKSwgY2hhbkJvbmRTdGF0ZSwgY2hhbm5lbCk7CisKKwlzd2l0Y2ggKGNoYW5Cb25kU3RhdGUpIHsKKwljYXNlIFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDoKKwkJbnVtQ2hhbm5lbCA9IDE7CisJCWNoYW5uZWxzWzBdID0gY2hhbm5lbDsKKwkJYnJlYWs7CisJY2FzZSBQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOgorCQludW1DaGFubmVsID0gMjsKKwkJY2hhbm5lbHNbMF0gPSBjaGFubmVsIC0gNDsKKwkJY2hhbm5lbHNbMV0gPSBjaGFubmVsOworCQlicmVhazsKKwljYXNlIFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWToKKwkJbnVtQ2hhbm5lbCA9IDI7CisJCWNoYW5uZWxzWzBdID0gY2hhbm5lbDsKKwkJY2hhbm5lbHNbMV0gPSBjaGFubmVsICsgNDsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfTE9XOgorCQludW1DaGFubmVsID0gNDsKKwkJY2hhbm5lbHNbMF0gPSBjaGFubmVsOworCQljaGFubmVsc1sxXSA9IGNoYW5uZWwgKyA0OworCQljaGFubmVsc1syXSA9IGNoYW5uZWwgKyA4OworCQljaGFubmVsc1szXSA9IGNoYW5uZWwgKyAxMjsKKwkJYnJlYWs7CisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9MT1c6CisJCW51bUNoYW5uZWwgPSA0OworCQljaGFubmVsc1swXSA9IGNoYW5uZWwgLSA0OworCQljaGFubmVsc1sxXSA9IGNoYW5uZWw7CisJCWNoYW5uZWxzWzJdID0gY2hhbm5lbCArIDQ7CisJCWNoYW5uZWxzWzNdID0gY2hhbm5lbCArIDg7CisJCWJyZWFrOworCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9ISUdIOgorCQludW1DaGFubmVsID0gNDsKKwkJY2hhbm5lbHNbMF0gPSBjaGFubmVsIC0gODsKKwkJY2hhbm5lbHNbMV0gPSBjaGFubmVsIC0gNDsKKwkJY2hhbm5lbHNbMl0gPSBjaGFubmVsOworCQljaGFubmVsc1szXSA9IGNoYW5uZWwgKyA0OworCQlicmVhazsKKwljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0hJR0g6CisJCW51bUNoYW5uZWwgPSA0OworCQljaGFubmVsc1swXSA9IGNoYW5uZWwgLSAxMjsKKwkJY2hhbm5lbHNbMV0gPSBjaGFubmVsIC0gODsKKwkJY2hhbm5lbHNbMl0gPSBjaGFubmVsIC0gNDsKKwkJY2hhbm5lbHNbM10gPSBjaGFubmVsOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCW51bUNoYW5uZWwgPSAxOworCQljaGFubmVsc1swXSA9IGNoYW5uZWw7CisJCWJyZWFrOworCX0KKworCXJldHVybiBudW1DaGFubmVsOworfQorCisvKioKKyAqIHNhcF9kZnNfY2hlY2tfaWZfY2hhbm5lbF9hdmFpYWxhYmxlKCkgLSBDaGVjayBpZiBhIGNoYW5uZWwgaXMgb3V0IG9mIE5PTAorICogQG5vbDogUG9pbnRlciB0byB0aGUgTm9uLU9jY3VwYW5jeSBMaXN0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gQ2hlY2tzIGlmIGEgZ2l2ZW4gY2hhbm5lbCBpcyBhdmFpbGFibGUgb3IKKyAqIHVzYWJsZSBvciB1bmF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgdGltZSBsYXBzZSBzaW5jZSB0aGUKKyAqIGxhc3QgcmFkYXIgdGltZSBzdGFtcC4KKyAqCisgKiBSZXR1cm46IHRydWUgaWYgY2hhbm5lbCBhdmFpbGFibGUgb3IgdXNhYmxlLCBmYWxzZSBpZiB1bmF2YWlsYWJsZS4KKyAqLworc3RhdGljIGJvb2wgc2FwX2Rmc19jaGVja19pZl9jaGFubmVsX2F2YWlhbGFibGUodFNhcERmc05vbEluZm8gKm5vbCkKK3sKKwl1aW50NjRfdCB0aW1lX3NpbmNlX2xhc3RfcmFkYXIsIHRpbWVfd2hlbl9yYWRhcl9mb3VuZCwgY3VycmVudF90aW1lID0gMDsKKwl1aW50NjRfdCBtYXhfamlmZmllczsKKworCWlmICgobm9sLT5yYWRhcl9zdGF0dXNfZmxhZyA9PSBlU0FQX0RGU19DSEFOTkVMX1VTQUJMRSkgfHwKKwkgICAgKG5vbC0+cmFkYXJfc3RhdHVzX2ZsYWcgPT0gZVNBUF9ERlNfQ0hBTk5FTF9BVkFJTEFCTEUpKSB7CisJCS8qCisJCSAqIEFsbG93IFNBUCBvcGVyYXRpb24gb24gdGhpcyBjaGFubmVsCisJCSAqIGVpdGhlciB0aGUgREZTIGNoYW5uZWwgaGFzIG5vdCBiZWVuIHVzZWQKKwkJICogZm9yIFNBUCBvcGVyYXRpb24gb3IgaXQgaXMgYXZhaWxhYmxlIGZvcgorCQkgKiBTQVAgb3BlcmF0aW9uIHNpbmNlIGl0IGlzIHBhc3QKKwkJICogTm9uLU9jY3VwYW5jeS1QZXJpb2Qgc28sIHJldHVybiBmYWxzZS4KKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJICBGTCgiQ2hhbj0lZCBub3QgaW4gTk9MLENIQU4gQVZBSUxBQkxFIiksCisJCQkgIG5vbC0+ZGZzX2NoYW5uZWxfbnVtYmVyKTsKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIGlmIChub2wtPnJhZGFyX3N0YXR1c19mbGFnID09IGVTQVBfREZTX0NIQU5ORUxfVU5BVkFJTEFCTEUpIHsKKwkJLyoKKwkJICogSWYgYSBERlMgQ2hhbm5lbCBpcyBVTkFWQUlMQUJMRSB0aGVuCisJCSAqIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBwYXN0CisJCSAqIE5vbi1vY2N1cGFuY3ktcGVyaW9kCisJCSAqIG9mIDMwIG1pbnV0ZXMuIElmIGl0IGlzIHBhc3QgMzAgbWlucyB0aGVuCisJCSAqIG1hcmsgdGhlIGNoYW5uZWwgYXMgQVZBSUxBQkxFIGFuZCByZXR1cm4KKwkJICogZmFsc2UgYXMgdGhlIGNoYW5uZWwgaXMgbm90IGFueW1vcmUgaW4KKwkJICogTk9OLU9jY3VwYW5jeS1QZXJpb2QuCisJCSAqLworCQl0aW1lX3doZW5fcmFkYXJfZm91bmQgPSBub2wtPnJhZGFyX2ZvdW5kX3RpbWVzdGFtcDsKKwkJY3VycmVudF90aW1lID0gY2RzX2dldF9tb25vdG9uaWNfYm9vdHRpbWUoKTsKKwkJaWYgKGN1cnJlbnRfdGltZSA8IHRpbWVfd2hlbl9yYWRhcl9mb3VuZCkgeworCQkJLyogY2RzX2dldF9tb25vdG9uaWNfYm9vdHRpbWUoKSBjYW4gb3ZlcmZsb3cuCisJCQkgKiBKaWZmaWVzIGlzIGluaXRpYWxpemVkIHN1Y2ggdGhhdCAzMiBiaXQgamlmZmllcworCQkJICogdmFsdWUgd3JhcCA1IG1pbnV0ZXMgYWZ0ZXIgYm9vdCBzbyBqaWZmaWVzIHdyYXAgYnVncworCQkJICogc2hvdyB1cCBlYXJsaWVyCisJCQkgKi8KKwkJCW1heF9qaWZmaWVzID0gKHVpbnQ2NF90KVVJTlRfTUFYICogMTAwMDsKKwkJCXRpbWVfc2luY2VfbGFzdF9yYWRhciA9IChtYXhfamlmZmllcyAtCisJCQkJdGltZV93aGVuX3JhZGFyX2ZvdW5kKSArIChjdXJyZW50X3RpbWUpOworCQl9IGVsc2UgeworCQkJdGltZV9zaW5jZV9sYXN0X3JhZGFyID0gY3VycmVudF90aW1lIC0KKwkJCQkJCQl0aW1lX3doZW5fcmFkYXJfZm91bmQ7CisJCX0KKwkJaWYgKHRpbWVfc2luY2VfbGFzdF9yYWRhciA+PSBTQVBfREZTX05PTl9PQ0NVUEFOQ1lfUEVSSU9EKSB7CisJCQlub2wtPnJhZGFyX3N0YXR1c19mbGFnID0gZVNBUF9ERlNfQ0hBTk5FTF9BVkFJTEFCTEU7CisJCQlub2wtPnJhZGFyX2ZvdW5kX3RpbWVzdGFtcCA9IDA7CisKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCSAgRkwoIkNoYW49JWQgbm90IGluIE5PTCwgQ2hhbm5lbCBBVkFJTEFCTEUiKSwKKwkJCQkgIG5vbC0+ZGZzX2NoYW5uZWxfbnVtYmVyKTsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIENoYW5uZWwgaXMgbm90IHN0aWxsIGF2YWlsYWJsZSBmb3IKKwkJCSAqIFNBUCBvcGVyYXRpb24gc28gcmV0dXJuIHRydWU7IEFzIHRoZQorCQkJICogQ2hhbm5lbCBpcyBzdGlsbCBpbgorCQkJICogTm9uLW9jY3VwYW5jeS1QZXJpb2QuCisJCQkgKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCSAgRkwoIkNoYW49JWQgaW4gTk9MLCBDaGFubmVsIFVOQVZBSUxCTEUiKSwKKwkJCQkgIG5vbC0+ZGZzX2NoYW5uZWxfbnVtYmVyKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiSW52YWxpZCBSYWRhciBTdGF0dXMgRmxhZyIpKTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogc2FwX2Rmc19pc19jaGFubmVsX2luX25vbF9saXN0KCkgLSBnaXZlbiBib25kZWQgY2hhbm5lbCBpcyBhdmFpbGFibGUKKyAqIEBzYXBfY29udGV4dDogSGFuZGxlIHRvIFNBUCBjb250ZXh0LgorICogQGNoYW5uZWxfbnVtYmVyOiBDaGFubmVsIG9uIHdoaWNoIGF2YWlsYWJpbGl0eSBzaG91bGQgYmUgY2hlY2tlZC4KKyAqIEBjaGFuX2JvbmRTdGF0ZTogVGhlIGNoYW5uZWwgYm9uZGluZyBtb2RlIG9mIHRoZSBwYXNzZWQgY2hhbm5lbC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIENoZWNrcyBpZiBhIGdpdmVuIGJvbmRlZCBjaGFubmVsIGlzIGF2YWlsYWJsZSBvcgorICogdXNhYmxlIGZvciBERlMgb3BlcmF0aW9uLgorICoKKyAqIFJldHVybjogZmFsc2UgaWYgY2hhbm5lbCBpcyBhdmFpbGFibGUsIHRydWUgaWYgY2hhbm5lbCBpcyBpbiBOT0wuCisgKi8KK2Jvb2wKK3NhcF9kZnNfaXNfY2hhbm5lbF9pbl9ub2xfbGlzdChwdFNhcENvbnRleHQgc2FwX2NvbnRleHQsCisJCQkgICAgICAgdWludDhfdCBjaGFubmVsX251bWJlciwKKwkJCSAgICAgICBlUGh5Q2hhbkJvbmRTdGF0ZSBjaGFuX2JvbmRTdGF0ZSkKK3sKKwlpbnQgaSwgajsKKwl0SGFsSGFuZGxlIGhfaGFsID0gQ0RTX0dFVF9IQUxfQ0Ioc2FwX2NvbnRleHQtPnBfY2RzX2djdHgpOworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHg7CisJdWludDhfdCBjaGFubmVsc1tNQVhfQk9OREVEX0NIQU5ORUxTXTsKKwl1aW50OF90IG51bV9jaGFubmVsczsKKwl0U2FwRGZzTm9sSW5mbyAqbm9sOworCXRTYXBEZnNJbmZvICpkZnNfaW5mbzsKKwlib29sIGNoYW5uZWxfYXZhaWxhYmxlOworCisJaWYgKE5VTEwgPT0gaF9oYWwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJpbnZhbGlkIGhfaGFsIikpOworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhfaGFsKTsKKwl9CisKKwlkZnNfaW5mbyA9ICZtYWNfY3R4LT5zYXAuU2FwRGZzSW5mbzsKKwlpZiAoKGRmc19pbmZvLT5udW1DdXJyZW50UmVnRG9tYWluRGZzQ2hhbm5lbHMgPT0gMCkgfHwKKwkgICAgKGRmc19pbmZvLT5udW1DdXJyZW50UmVnRG9tYWluRGZzQ2hhbm5lbHMgPgorCSAgICAgTlVNXzVHSFpfQ0hBTk5FTFMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJICBGTCgiaW52YWxpZCBkZnMgY2hhbm5lbCBjb3VudCAlZCIpLAorCQkJICBkZnNfaW5mby0+bnVtQ3VycmVudFJlZ0RvbWFpbkRmc0NoYW5uZWxzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIGdldCB0aGUgYm9uZGVkIGNoYW5uZWxzICovCisJbnVtX2NoYW5uZWxzID0gc2FwX2dldF9ib25kaW5nX2NoYW5uZWxzKHNhcF9jb250ZXh0LCBjaGFubmVsX251bWJlciwKKwkJCQljaGFubmVscywgTUFYX0JPTkRFRF9DSEFOTkVMUywgY2hhbl9ib25kU3RhdGUpOworCisJLyogY2hlY2sgZm9yIE5PTCwgZmlyc3Qgb24gd2lsbCBicmVhayB0aGUgbG9vcCAqLworCWZvciAoaiA9IDA7IGogPCBudW1fY2hhbm5lbHM7IGorKykgeworCQlmb3IgKGkgPSAwOyBpIDwgZGZzX2luZm8tPm51bUN1cnJlbnRSZWdEb21haW5EZnNDaGFubmVsczsgaSsrKSB7CisJCQlub2wgPSAmZGZzX2luZm8tPnNhcERmc0NoYW5uZWxOb2xMaXN0W2ldOworCQkJaWYgKG5vbC0+ZGZzX2NoYW5uZWxfbnVtYmVyICE9IGNoYW5uZWxzW2pdKQorCQkJCWNvbnRpbnVlOworCisJCQljaGFubmVsX2F2YWlsYWJsZSA9CisJCQkJc2FwX2Rmc19jaGVja19pZl9jaGFubmVsX2F2YWlhbGFibGUobm9sKTsKKworCQkJaWYgKGNoYW5uZWxfYXZhaWxhYmxlID09IGZhbHNlKQorCQkJCWJyZWFrOworCisJCX0gLyogbG9vcCBmb3IgZGZzIGNoYW5uZWxzICovCisKKwkJaWYgKGkgPCBkZnNfaW5mby0+bnVtQ3VycmVudFJlZ0RvbWFpbkRmc0NoYW5uZWxzKQorCQkJYnJlYWs7CisKKwl9IC8qIGxvb3AgZm9yIGJvbmRlZCBjaGFubmVscyAqLworCisJLyoKKwkgKiBpZiBhbnkgb2YgdGhlIGNoYW5uZWwgaXMgbm90IGF2YWlsYWJsZSwgbWFyayBhbGwgYXZhaWxhYmxlIGNoYW5uZWxzCisJICogYXMgdW5hdmFpbGFibGUgd2l0aCBzYW1lIHRpbWUgc3RhbXAuCisJICovCisJaWYgKGogPCBudW1fY2hhbm5lbHMgJiYKKwkgICAgaSA8IGRmc19pbmZvLT5udW1DdXJyZW50UmVnRG9tYWluRGZzQ2hhbm5lbHMpIHsKKwkJaWYgKG51bV9jaGFubmVscyA+IE1BWF9CT05ERURfQ0hBTk5FTFMpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJICBGTCgibnVtX2NoYW5uZWw+TUFYX0JPTkRFRF9DSEFOTkVMLCByZXNldCIpKTsKKwkJCW51bV9jaGFubmVscyA9IE1BWF9CT05ERURfQ0hBTk5FTFM7CisJCX0KKwkJbm9sID0gJmRmc19pbmZvLT5zYXBEZnNDaGFubmVsTm9sTGlzdFtpXTsKKwkJc2FwX21hcmtfZGZzX2NoYW5uZWxzKHNhcF9jb250ZXh0LCBjaGFubmVscywgbnVtX2NoYW5uZWxzLAorCQkJCW5vbC0+cmFkYXJfZm91bmRfdGltZXN0YW1wKTsKKworCQkvKiBzZXQgREZTLU5PTCBiYWNrIHRvIGtlZXAgaXQgdXBkYXRlLXRvLWRhdGUgaW4gQ05TUyAqLworCQlzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY29udGV4dCwgTlVMTCwgZVNBUF9ERlNfTk9MX1NFVCwKKwkJCQkgICh2b2lkICopIGVTQVBfU1RBVFVTX1NVQ0NFU1MpOworCisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBzYXBfZ290b19jaGFubmVsX3NlbCAtIEZ1bmN0aW9uIGZvciBpbml0aWF0aW5nIHNjYW4gcmVxdWVzdCBmb3IgU01FCisgKiBAc2FwX2NvbnRleHQ6IFNhcCBDb250ZXh0IHZhbHVlLgorICogQHNhcF9ldmVudDogU3RhdGUgbWFjaGluZSBldmVudAorICogQHNhcF9kb19hY3NfcHJlX3N0YXJ0X2JzczogdHJ1ZSwgaWYgQUNTIHNjYW4gaXMgaXNzdWVkIHByZSBzdGFydCBCU1MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBpZiBBQ1Mgc2NhbiBpcyBpc3N1ZWQgcG9zdCBzdGFydCBCU1MuCisgKgorICogSW5pdGlhdGVzIHNtZSBzY2FuIGZvciBBQ1MgdG8gcGljayBhIGNoYW5uZWwuCisgKgorICogUmV0dXJuOiBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCisgKi8KK0NERl9TVEFUVVMgc2FwX2dvdG9fY2hhbm5lbF9zZWwocHRTYXBDb250ZXh0IHNhcF9jb250ZXh0LAorCXB0V0xBTl9TQVBFdmVudCBzYXBfZXZlbnQsCisJYm9vbCBzYXBfZG9fYWNzX3ByZV9zdGFydF9ic3MpCit7CisKKwkvKiBJbml0aWF0ZSBhIFNDQU4gcmVxdWVzdCAqLworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXM7CisJLyogVG8gYmUgaW5pdGlhbGlzZWQgaWYgc2NhbiBpcyByZXF1aXJlZCAqLworCXRDc3JTY2FuUmVxdWVzdCBzY2FuX3JlcXVlc3Q7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKwl1aW50OF90ICpjaGFubmVsX2xpc3QgPSBOVUxMOworCXVpbnQ4X3QgbnVtX29mX2NoYW5uZWxzID0gMDsKKyNlbmRpZgorCXRIYWxIYW5kbGUgaF9oYWw7CisJdWludDhfdCBjb25fY2g7CisKKwloX2hhbCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1NNRSk7CisJaWYgKE5VTEwgPT0gaF9oYWwpIHsKKwkJLyogd2UgaGF2ZSBhIHNlcmlvdXMgcHJvYmxlbSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgRkwoImludmFsaWQgaF9oYWwiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwlpZiAoY2RzX2NvbmN1cnJlbnRfYmVhY29uaW5nX3Nlc3Npb25zX3J1bm5pbmcoKSkgeworCQljb25fY2ggPQorCQkJc21lX2dldF9jb25jdXJyZW50X29wZXJhdGlvbl9jaGFubmVsKGhfaGFsKTsKKworCQlpZiAoY29uX2NoICYmIHNhcF9jb250ZXh0LT5jaGFubmVsID09IEFVVE9fQ0hBTk5FTF9TRUxFQ1QpIHsKKwkJCXNhcF9jb250ZXh0LT5kZnNfY2hfZGlzYWJsZSA9IHRydWU7CisJCX0gZWxzZSBpZiAoY29uX2NoICYmIHNhcF9jb250ZXh0LT5jaGFubmVsICE9IGNvbl9jaCAmJgorCQkJICAgQ0RTX0lTX0RGU19DSChzYXBfY29udGV4dC0+Y2hhbm5lbCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJICBGTCgiTUNDIERGUyBub3Qgc3VwcG9ydGVkIGluIEFQX0FQIE1vZGUiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0FCT1JURUQ7CisJCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwkJaWYgKHNhcF9jb250ZXh0LT5jY19zd2l0Y2hfbW9kZSAhPQorCQkJCQkJQ0RGX01DQ19UT19TQ0NfU1dJVENIX0RJU0FCTEUpIHsKKwkJCWNvbl9jaCA9IHNtZV9jaGVja19jb25jdXJyZW50X2NoYW5uZWxfb3ZlcmxhcChoX2hhbCwKKwkJCQkJc2FwX2NvbnRleHQtPmNoYW5uZWwsCisJCQkJCXNhcF9jb250ZXh0LT5jc3Jfcm9hbVByb2ZpbGUucGh5TW9kZSwKKwkJCQkJc2FwX2NvbnRleHQtPmNjX3N3aXRjaF9tb2RlKTsKKwkJCWlmIChjb25fY2gpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJIiVzOiBPdmVycmlkZSBjaCAlZCB0byAlZCBkdWUgdG8gQ0MgSW50ZiIsCisJCQkJCV9fZnVuY19fLCBzYXBfY29udGV4dC0+Y2hhbm5lbCwgY29uX2NoKTsKKwkJCQlzYXBfY29udGV4dC0+Y2hhbm5lbCA9IGNvbl9jaDsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorI2VuZGlmCisKKwlpZiAoY2RzX2dldF9jb25jdXJyZW5jeV9tb2RlKCkgPT0gKENERl9TVEFfTUFTSyB8IENERl9TQVBfTUFTSykpIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU1RBX0FQX01PREVfREZTX0RJU0FCTEUKKwkJaWYgKHNhcF9jb250ZXh0LT5jaGFubmVsID09IEFVVE9fQ0hBTk5FTF9TRUxFQ1QpCisJCQlzYXBfY29udGV4dC0+ZGZzX2NoX2Rpc2FibGUgPSB0cnVlOworCQllbHNlIGlmIChDRFNfSVNfREZTX0NIKHNhcF9jb250ZXh0LT5jaGFubmVsKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkgIEZMKCJERlMgbm90IHN1cHBvcnRlZCBpbiBTVEFfQVAgTW9kZSIpKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfQUJPUlRFRDsKKwkJfQorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisJCWlmIChzYXBfY29udGV4dC0+Y2Nfc3dpdGNoX21vZGUgIT0KKwkJCQkJCUNERl9NQ0NfVE9fU0NDX1NXSVRDSF9ESVNBQkxFKSB7CisJCQljb25fY2ggPSBzbWVfY2hlY2tfY29uY3VycmVudF9jaGFubmVsX292ZXJsYXAoaF9oYWwsCisJCQkJCXNhcF9jb250ZXh0LT5jaGFubmVsLAorCQkJCQlzYXBfY29udGV4dC0+Y3NyX3JvYW1Qcm9maWxlLnBoeU1vZGUsCisJCQkJCXNhcF9jb250ZXh0LT5jY19zd2l0Y2hfbW9kZSk7CisJCQlpZiAoY29uX2NoICYmICFDRFNfSVNfREZTX0NIKGNvbl9jaCkpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJIiVzOiBPdmVycmlkZSBjaCAlZCB0byAlZCBkdWUgdG8gQ0MgSW50ZiIsCisJCQkJCV9fZnVuY19fLCBzYXBfY29udGV4dC0+Y2hhbm5lbCwgY29uX2NoKTsKKwkJCQlzYXBfY29udGV4dC0+Y2hhbm5lbCA9IGNvbl9jaDsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorCisJaWYgKHNhcF9jb250ZXh0LT5jaGFubmVsID09IEFVVE9fQ0hBTk5FTF9TRUxFQ1QpIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVBfQVBfQUNTX09QVElNSVpFCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoIiVzIHNraXBfYWNzX3N0YXR1cyA9ICVkICIpLCBfX2Z1bmNfXywKKwkJCSAgc2FwX2NvbnRleHQtPmFjc19jZmctPnNraXBfc2Nhbl9zdGF0dXMpOworCQlpZiAoc2FwX2NvbnRleHQtPmFjc19jZmctPnNraXBfc2Nhbl9zdGF0dXMgIT0KKwkJCQkJCWVTQVBfU0tJUF9BQ1NfU0NBTikgeworI2VuZGlmCisJCWNkZl9tZW1femVybygmc2Nhbl9yZXF1ZXN0LCBzaXplb2Yoc2Nhbl9yZXF1ZXN0KSk7CisKKwkJLyoKKwkJICogU2V0IHNjYW5UeXBlIHRvIEFjdGl2ZSBzY2FuLiBGVyB0YWtlcyBjYXJlIG9mIHVzaW5nIHBhc3NpdmUKKwkJICogc2NhbiBmb3IgREZTIGFuZCBhY3RpdmUgZm9yIG5vbiBERlMgY2hhbm5lbHMuCisJCSAqLworCQlzY2FuX3JlcXVlc3Quc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworCisJCS8qIFNldCBtaW4gYW5kIG1heCBjaGFubmVsIHRpbWUgdG8gemVybyAqLworCQlzY2FuX3JlcXVlc3QubWluQ2huVGltZSA9IDA7CisJCXNjYW5fcmVxdWVzdC5tYXhDaG5UaW1lID0gMDsKKworCQkvKiBTZXQgQlNTVHlwZSB0byBkZWZhdWx0IHR5cGUgKi8KKwkJc2Nhbl9yZXF1ZXN0LkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0FOWTsKKworI2lmbmRlZiBTT0ZUQVBfQ0hBTk5FTF9SQU5HRQorCQkvKlNjYW4gYWxsIHRoZSBjaGFubmVscyAqLworCQlzY2FuX3JlcXVlc3QuQ2hhbm5lbEluZm8ubnVtX29mX2NoYW5uZWxzID0gMDsKKworCQlzY2FuX3JlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworCisJCXNjYW5fcmVxdWVzdC5yZXF1ZXN0VHlwZSA9IGVDU1JfU0NBTl9SRVFVRVNUX0ZVTExfU0NBTjsKKwkJLyogZUNTUl9TQ0FOX1JFUVVFU1RfMTFEX1NDQU47ICovCisKKyNlbHNlCisKKwkJc2FwX2dldF9jaGFubmVsX2xpc3Qoc2FwX2NvbnRleHQsICZjaGFubmVsX2xpc3QsCisJCQkJICAmbnVtX29mX2NoYW5uZWxzKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVBfQVBfQUNTX09QVElNSVpFCisJCWlmIChudW1fb2ZfY2hhbm5lbHMgIT0gMCkgeworI2VuZGlmCisJCS8qU2NhbiB0aGUgY2hhbm5lbHMgaW4gdGhlIGxpc3QgKi8KKwkJc2Nhbl9yZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPQorCQkJbnVtX29mX2NoYW5uZWxzOworCisJCXNjYW5fcmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9CisJCQljaGFubmVsX2xpc3Q7CisKKwkJc2Nhbl9yZXF1ZXN0LnJlcXVlc3RUeXBlID0KKwkJCWVDU1JfU0NBTl9TT0ZUQVBfQ0hBTk5FTF9SQU5HRTsKKworCQlzYXBfY29udGV4dC0+Y2hhbm5lbExpc3QgPSBjaGFubmVsX2xpc3Q7CisKKyNlbmRpZgorCQkvKiBTZXQgcmVxdWVzdFR5cGUgdG8gRnVsbCBzY2FuICovCisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiY2FsbGluZyBzbWVfc2Nhbl9yZXF1ZXN0IikpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9BUF9BUF9BQ1NfT1BUSU1JWkUKKwkJaWYgKHNhcF9jb250ZXh0LT5hY3NfY2ZnLT5za2lwX3NjYW5fc3RhdHVzID09CisJCQllU0FQX0RPX05FV19BQ1NfU0NBTikKKyNlbmRpZgorCQkJc21lX3NjYW5fZmx1c2hfcmVzdWx0KGhfaGFsKTsKKwkJaWYgKHRydWUgPT0gc2FwX2RvX2Fjc19wcmVfc3RhcnRfYnNzKSB7CisJCQkvKgorCQkJICogd2hlbiBJRCA9PSAwIDExRCBzY2FuL2FjdGl2ZSBzY2FuIHdpdGggY2FsbGJhY2ssCisJCQkgKiBtaW4tbWF4Q2hudGltZSBzZXQgaW4gY3NyU2NhblJlcXVlc3QoKT8KKwkJCSAqIGNzclNjYW5Db21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrCisJCQkgKiBwQ29udGV4dCBzY2FuX3JlcXVlc3RfaWQgZmlsbGVkIHVwCisJCQkgKi8KKwkJCWNkZl9yZXRfc3RhdHVzID0gc21lX3NjYW5fcmVxdWVzdChoX2hhbCwKKwkJCQlzYXBfY29udGV4dC0+c2Vzc2lvbklkLAorCQkJCSZzY2FuX3JlcXVlc3QsCisJCQkJJndsYW5zYXBfcHJlX3N0YXJ0X2Jzc19hY3Nfc2Nhbl9jYWxsYmFjaywKKwkJCQlzYXBfY29udGV4dCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogd2hlbiBJRCA9PSAwIDExRCBzY2FuL2FjdGl2ZSBzY2FuIHdpdGggY2FsbGJhY2ssCisJCQkgKiBtaW4tbWF4Q2hudGltZSBzZXQgaW4gY3NyU2NhblJlcXVlc3QoKT8KKwkJCSAqIGNzclNjYW5Db21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLAorCQkJICogcENvbnRleHQgc2Nhbl9yZXF1ZXN0X2lkIGZpbGxlZCB1cAorCQkJICovCisJCQljZGZfcmV0X3N0YXR1cyA9IHNtZV9zY2FuX3JlcXVlc3QoaF9oYWwsCisJCQkJc2FwX2NvbnRleHQtPnNlc3Npb25JZCwKKwkJCQkmc2Nhbl9yZXF1ZXN0LAorCQkJCSZ3bGFuc2FwX3NjYW5fY2FsbGJhY2ssCisJCQkJc2FwX2NvbnRleHQpOworCQl9CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RmX3JldF9zdGF0dXMpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgRkwoInNtZV9zY2FuX3JlcXVlc3QgIGZhaWwgJWQhISEiKSwKKwkJCQkgIGNkZl9yZXRfc3RhdHVzKTsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgIEZMKCJTQVAgQ29uZmlndXJpbmcgZGVmYXVsdCBjaGFubmVsLCBDaD0lZCIpLAorCQkJCSAgc2FwX2NvbnRleHQtPmNoYW5uZWwpOworCQkJLyogSW4gY2FzZSBvZiBlcnJvciwgc3dpdGNoIHRvIGRlZmF1bHQgY2hhbm5lbCAqLworCQkJc2FwX2NvbnRleHQtPmNoYW5uZWwgPSBTQVBfREVGQVVMVF8yNEdIWl9DSEFOTkVMOworCisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKwkJCWlmIChzYXBfY29udGV4dC0+Y2hhbm5lbExpc3QgIT0gTlVMTCkgeworCQkJCXNhcF9jb250ZXh0LT5jaGFubmVsID0KKwkJCQkJc2FwX2NvbnRleHQtPmNoYW5uZWxMaXN0WzBdOworCQkJCWNkZl9tZW1fZnJlZShzYXBfY29udGV4dC0+CisJCQkJCWNoYW5uZWxMaXN0KTsKKwkJCQlzYXBfY29udGV4dC0+Y2hhbm5lbExpc3QgPSBOVUxMOworCQkJfQorI2VuZGlmCisJCQlpZiAodHJ1ZSA9PSBzYXBfZG9fYWNzX3ByZV9zdGFydF9ic3MpIHsKKwkJCQkvKgorCQkJCSogSW4gY2FzZSBvZiBBQ1MgcmVxIGJlZm9yZSBzdGFydCBCc3MsCisJCQkJKiByZXR1cm4gZmFpbHVyZSBzbyB0aGF0IHRoZSBjYWxsaW5nCisJCQkJKiBmdWNudGlvbiBjYW4gdXNlIHRoZSBkZWZhdWx0IGNoYW5uZWwuCisJCQkJKi8KKwkJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQl9IGVsc2UgeworCQkJCS8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLworCQkJCXNhcF9ldmVudF9pbml0KHNhcF9ldmVudCk7CisJCQkJLyogSGFuZGxlIGV2ZW50ICovCisJCQkJY2RmX3N0YXR1cyA9IHNhcF9mc20oc2FwX2NvbnRleHQsIHNhcF9ldmVudCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJIEZMKCJyZXR1cm4gc21lX1NjYW5SZXEsIHNjYW5JRD0lZCwgQ2g9JWQiKSwKKwkJCQkgc2Nhbl9yZXF1ZXN0LnNjYW5faWQsIHNhcF9jb250ZXh0LT5jaGFubmVsKTsKKwkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9BUF9BUF9BQ1NfT1BUSU1JWkUKKwkJfQorCX0gZWxzZSB7CisJCXNhcF9jb250ZXh0LT5hY3NfY2ZnLT5za2lwX3NjYW5fc3RhdHVzID0gZVNBUF9TS0lQX0FDU19TQ0FOOworCX0KKworCWlmIChzYXBfY29udGV4dC0+YWNzX2NmZy0+c2tpcF9zY2FuX3N0YXR1cyA9PSBlU0FQX1NLSVBfQUNTX1NDQU4pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCIjIyAlcyBTS0lQUEVEIEFDUyBTQ0FOIiksIF9fZnVuY19fKTsKKwkJd2xhbnNhcF9zY2FuX2NhbGxiYWNrKGhfaGFsLCBzYXBfY29udGV4dCwKKwkJCXNhcF9jb250ZXh0LT5zZXNzaW9uSWQsIDAsIGVDU1JfU0NBTl9TVUNDRVNTKTsKKwl9CisjZW5kaWYKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJmb3IgY29uZmlndXJlZCBjaGFubmVsLCBDaD0gJWQiKSwKKwkJCSAgc2FwX2NvbnRleHQtPmNoYW5uZWwpOworCQlpZiAoc2FwX2RvX2Fjc19wcmVfc3RhcnRfYnNzID09IHRydWUpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJRkwoIkFDUyBlbmQgZHVlIHRvIENoIG92ZXJyaWRlLiBTZWwgQ2ggPSAlZCIpLAorCQkJCQkJCXNhcF9jb250ZXh0LT5jaGFubmVsKTsKKwkJCXNhcF9jb250ZXh0LT5hY3NfY2ZnLT5wcmlfY2ggPSBzYXBfY29udGV4dC0+Y2hhbm5lbDsKKwkJCXNhcF9jb250ZXh0LT5hY3NfY2ZnLT5jaF93aWR0aCA9CisJCQkJCQkgc2FwX2NvbnRleHQtPmNoX3dpZHRoX29yaWc7CisJCQlzYXBfY29uZmlnX2Fjc19yZXN1bHQoaF9oYWwsIHNhcF9jb250ZXh0LCAwKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfQ0FOQ0VMRUQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlCisJCQkgKiBFdmVudGhvdWdoIHNjYW4gd2FzIG5vdCBkb25lLAorCQkJICogbWVhbnMgYSB1c2VyIHNldCBjaGFubmVsIHdhcyBjaG9zZW4KKwkJCSAqLworCQkJc2FwX2V2ZW50X2luaXQoc2FwX2V2ZW50KTsKKwkJCS8qIEhhbmRsZSBldmVudCAqLworCQkJY2RmX3N0YXR1cyA9IHNhcF9mc20oc2FwX2NvbnRleHQsIHNhcF9ldmVudCk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHNjYW4gZmFpbGVkLCBnZXQgZGVmYXVsdCBjaGFubmVsIGFuZCBhZHZhbmNlIHN0YXRlCisJICogbWFjaGluZSBhcyBzdWNjZXNzIHdpdGggZGVmYXVsdCBjaGFubmVsCisJICoKKwkgKiBIYXZlIHRvIHdhaXQgZm9yIHRoZSBjYWxsIGJhY2sgdG8gYmUgY2FsbGVkIHRvIGdldCB0aGUKKwkgKiBjaGFubmVsIGNhbm5vdCBhZHZhbmNlIHN0YXRlIG1hY2hpbmUgaGVyZSBhcyBzYWlkIGFib3ZlCisJICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgIEZMKCJiZWZvcmUgZXhpdGluZyBzYXBfZ290b19jaGFubmVsX3NlbCBjaGFubmVsPSVkIiksCisJCSAgc2FwX2NvbnRleHQtPmNoYW5uZWwpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgc2FwX09wZW5TZXNzaW9uCisKKyAgIERFU0NSSVBUSU9OCisgICAgRnVuY3Rpb24gZm9yIG9wZW5pbmcgU01FIGFuZCBTQVAgc2Vzc2lvbnMgd2hlbiBzeXN0ZW0gaXMgaW4gU29mdEFQIHJvbGUKKworICAgREVQRU5ERU5DSUVTCisgICAgTkEuCisKKyAgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgaEhhbCAgICAgICAgOiBIYWwgaGFuZGxlCisgICAgc2FwQ29udGV4dCAgOiBTYXAgQ29udGV4dCB2YWx1ZQorCisgICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIENERl9TVEFUVVNfU1VDQ0VTUzogU3VjY2VzcworCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworQ0RGX1NUQVRVUyBzYXBfb3Blbl9zZXNzaW9uKHRIYWxIYW5kbGUgaEhhbCwgcHRTYXBDb250ZXh0IHNhcENvbnRleHQpCit7CisJdWludDMyX3QgdHlwZSwgc3ViVHlwZTsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKHNhcENvbnRleHQtPmNzcl9yb2FtUHJvZmlsZS5jc3JQZXJzb25hID09IENERl9QMlBfR09fTU9ERSkKKwkJc3RhdHVzID0gY2RzX2dldF92ZGV2X3R5cGVzKENERl9QMlBfR09fTU9ERSwgJnR5cGUsICZzdWJUeXBlKTsKKwllbHNlCisJCXN0YXR1cyA9IGNkc19nZXRfdmRldl90eXBlcyhDREZfU0FQX01PREUsICZ0eXBlLCAmc3ViVHlwZSk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgImZhaWxlZCB0byBnZXQgdmRldiB0eXBlIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyogT3BlbiBTTUUgU2Vzc2lvbiBmb3IgU29mdGFwICovCisJY2RmX3JldF9zdGF0dXMgPSBzbWVfb3Blbl9zZXNzaW9uKGhIYWwsCisJCQkJCSAgJndsYW5zYXBfcm9hbV9jYWxsYmFjaywKKwkJCQkJICBzYXBDb250ZXh0LAorCQkJCQkgIHNhcENvbnRleHQtPnNlbGZfbWFjX2FkZHIsCisJCQkJCSAgJnNhcENvbnRleHQtPnNlc3Npb25JZCwgdHlwZSwgc3ViVHlwZSk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9yZXRfc3RhdHVzKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiRXJyb3I6IEluICVzIGNhbGxpbmcgc21lX3JvYW1fY29ubmVjdCBzdGF0dXMgPSAlZCIsCisJCQkgIF9fZnVuY19fLCBjZGZfcmV0X3N0YXR1cyk7CisKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBNYWMtPnNhcC5zYXBDdHhMaXN0W3NhcENvbnRleHQtPnNlc3Npb25JZF0uc2Vzc2lvbklEID0KKwkJc2FwQ29udGV4dC0+c2Vzc2lvbklkOworCXBNYWMtPnNhcC5zYXBDdHhMaXN0W3NhcENvbnRleHQtPnNlc3Npb25JZF0ucFNhcENvbnRleHQgPSBzYXBDb250ZXh0OworCXBNYWMtPnNhcC5zYXBDdHhMaXN0W3NhcENvbnRleHQtPnNlc3Npb25JZF0uc2FwUGVyc29uYSA9CisJCXNhcENvbnRleHQtPmNzcl9yb2FtUHJvZmlsZS5jc3JQZXJzb25hOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICAgIHNhcEdvdG9TdGFydGluZworCisgICBERVNDUklQVElPTgorICAgIEZ1bmN0aW9uIGZvciBpbml0aWF0aW5nIHN0YXJ0IGJzcyByZXF1ZXN0IGZvciBTTUUKKworICAgREVQRU5ERU5DSUVTCisgICAgTkEuCisKKyAgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgc2FwQ29udGV4dCAgOiBTYXAgQ29udGV4dCB2YWx1ZQorICAgIHNhcEV2ZW50ICAgIDogU3RhdGUgbWFjaGluZSBldmVudAorICAgIGJzc1R5cGUgICAgIDogVHlwZSBvZiBic3MgdG8gc3RhcnQsIElOUkEgQVAKKyAgICBzdGF0dXMgICAgICA6IFJldHVybiB0aGUgU0FQIHN0YXR1cyBoZXJlCisKKyAgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBDREZfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiBTdWNjZXNzCisKKyAgIFNJREUgRUZGRUNUUworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDREZfU1RBVFVTCitzYXBfZ290b19zdGFydGluZworCShwdFNhcENvbnRleHQgc2FwQ29udGV4dCwKKwlwdFdMQU5fU0FQRXZlbnQgc2FwRXZlbnQsIGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlKSB7CisJLyogdEhhbEhhbmRsZSAqLworCXRIYWxIYW5kbGUgaEhhbCA9IENEU19HRVRfSEFMX0NCKHNhcENvbnRleHQtPnBfY2RzX2djdHgpOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXM7CisKKwkvKi0gLSAtIC0gLSAtIC0gLSBUT0RPOm9uY2UgY29uZmlncyBmcm9tIGhkZCBhdmFpbGFibGUgLSAtIC0gLSAtIC0gLSAtIC0qLworCWNoYXIga2V5X21hdGVyaWFsWzMyXSA9IHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgMiwgMywKKwkJNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgfTsKKwlzYXBDb250ZXh0LT5rZXlfdHlwZSA9IDB4MDU7CisJc2FwQ29udGV4dC0+a2V5X2xlbmd0aCA9IDMyOworCWNkZl9tZW1fY29weShzYXBDb250ZXh0LT5rZXlfbWF0ZXJpYWwsIGtleV9tYXRlcmlhbCwgc2l6ZW9mKGtleV9tYXRlcmlhbCkpOyAgICAgLyogTmVlZCBhIGtleSBzaXplIGRlZmluZSAqLworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMiLAorCQkgIF9fZnVuY19fKTsKKworCWlmIChOVUxMID09IGhIYWwpIHsKKwkJLyogd2UgaGF2ZSBhIHNlcmlvdXMgcHJvYmxlbSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIkluICVzLCBpbnZhbGlkIGhIYWwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJY2RmX3JldF9zdGF0dXMgPSBzYXBfb3Blbl9zZXNzaW9uKGhIYWwsIHNhcENvbnRleHQpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfcmV0X3N0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkVycm9yOiBJbiAlcyBjYWxsaW5nIHNhcF9vcGVuX3Nlc3Npb24gc3RhdHVzID0gJWQiLAorCQkJICBfX2Z1bmNfXywgY2RmX3JldF9zdGF0dXMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30gLyogc2FwR290b1N0YXJ0aW5nICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICAgIHNhcEdvdG9EaXNjb25uZWN0aW5nCisKKyAgIERFU0NSSVBUSU9OCisgICAgUHJvY2Vzc2luZyBvZiBTQVAgRlNNIERpc2Nvbm5lY3Rpbmcgc3RhdGUKKworICAgREVQRU5ERU5DSUVTCisgICAgTkEuCisKKyAgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgc2FwQ29udGV4dCAgOiBTYXAgQ29udGV4dCB2YWx1ZQorICAgIHN0YXR1cyAgICAgIDogUmV0dXJuIHRoZSBTQVAgc3RhdHVzIGhlcmUKKworICAgUkVUVVJOIFZBTFVFCisgICAgVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBDREZfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0NERl9TVEFUVVMgc2FwX2dvdG9fZGlzY29ubmVjdGluZyhwdFNhcENvbnRleHQgc2FwQ29udGV4dCkKK3sKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzOworCXRIYWxIYW5kbGUgaEhhbDsKKworCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihzYXBDb250ZXh0LT5wX2Nkc19nY3R4KTsKKwlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCS8qIHdlIGhhdmUgYSBzZXJpb3VzIHByb2JsZW0gKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJJbiAlcywgaW52YWxpZCBoSGFsIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXNhcF9mcmVlX3JvYW1fcHJvZmlsZSgmc2FwQ29udGV4dC0+Y3NyX3JvYW1Qcm9maWxlKTsKKwljZGZfcmV0X3N0YXR1cyA9IHNtZV9yb2FtX3N0b3BfYnNzKGhIYWwsIHNhcENvbnRleHQtPnNlc3Npb25JZCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfcmV0X3N0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkVycm9yOiBJbiAlcyBjYWxsaW5nIHNtZV9yb2FtX3N0b3BfYnNzIHN0YXR1cyA9ICVkIiwKKwkJCSAgX19mdW5jX18sIGNkZl9yZXRfc3RhdHVzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTIHNhcF9yb2FtX3Nlc3Npb25fY2xvc2VfY2FsbGJhY2sodm9pZCAqcENvbnRleHQpCit7CisJcHRTYXBDb250ZXh0IHNhcENvbnRleHQgPSAocHRTYXBDb250ZXh0KSBwQ29udGV4dDsKKwlyZXR1cm4gc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwQ29udGV4dCwgTlVMTCwKKwkJCQkgZVNBUF9TVE9QX0JTU19FVkVOVCwKKwkJCQkgKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICAgIHNhcEdvdG9EaXNjb25uZWN0ZWQKKworICAgREVTQ1JJUFRJT04KKyAgICBGdW5jdGlvbiBmb3Igc2V0dGluZyB0aGUgU0FQIEZTTSB0byBEaXNjb25uZWN0aW9uIHN0YXRlCisKKyAgIERFUEVOREVOQ0lFUworICAgIE5BLgorCisgICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHNhcENvbnRleHQgIDogU2FwIENvbnRleHQgdmFsdWUKKyAgICBzYXBFdmVudCAgICA6IFN0YXRlIG1hY2hpbmUgZXZlbnQKKyAgICBzdGF0dXMgICAgICA6IFJldHVybiB0aGUgU0FQIHN0YXR1cyBoZXJlCisKKyAgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBDREZfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiBTdWNjZXNzCisKKyAgIFNJREUgRUZGRUNUUworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDREZfU1RBVFVTIHNhcF9nb3RvX2Rpc2Nvbm5lY3RlZChwdFNhcENvbnRleHQgc2FwQ29udGV4dCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0V0xBTl9TQVBFdmVudCBzYXBFdmVudDsKKwkvKiBQcm9jZXNzaW5nIGhhcyB0byBiZSBjb2RlZCAqLworCS8qIENsZWFuIHVwIHN0YXRpb25zIGZyb20gVEwgZXRjIGFzIEFQIEJTUyBpcyBzaHV0IGRvd24gdGhlbiBzZXQgZXZlbnQgKi8KKwlzYXBFdmVudC5ldmVudCA9IGVTQVBfTUFDX1JFQURZX0ZPUl9DT05ORUNUSU9OUzsgICAgICAgIC8qIGhhcmRjb2RlZCAqLworCXNhcEV2ZW50LnBhcmFtcyA9IDA7CisJc2FwRXZlbnQudTEgPSAwOworCXNhcEV2ZW50LnUyID0gMDsKKwkvKiBIYW5kbGUgZXZlbnQgKi8KKwljZGZfc3RhdHVzID0gc2FwX2ZzbShzYXBDb250ZXh0LCAmc2FwRXZlbnQpOworCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogc2FwX3NpZ25hbF9oZGRfZXZlbnQoKSAtIHNlbmQgZXZlbnQgbm90aWZpY2F0aW9uCisgKiBAc2FwX2N0eDogU2FwIENvbnRleHQKKyAqIEBjc3Jfcm9hbWluZm86IFBvaW50ZXIgdG8gQ1NSIHJvYW0gaW5mb3JtYXRpb24KKyAqIEBzYXBfaGRkZXZlbnQ6IFNBUCBIREQgZXZlbnQKKyAqIEBjb250ZXh0OiB0byBwYXNzIHRoZSBlbGVtZW50IGZvciBmdXR1cmUgc3VwcG9ydAorICoKKyAqIEZ1bmN0aW9uIGZvciBIREQgdG8gc2VuZCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uIHVzaW5nIGNhbGxiYWNrCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc2FwX3NpZ25hbF9oZGRfZXZlbnQocHRTYXBDb250ZXh0IHNhcF9jdHgsCisJCXRDc3JSb2FtSW5mbyAqY3NyX3JvYW1pbmZvLCBlU2FwSGRkRXZlbnQgc2FwX2hkZGV2ZW50LAorCQl2b2lkICpjb250ZXh0KQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U2FwX0V2ZW50IHNhcF9hcF9ldmVudDsgICAgICAgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKwl0SGFsSGFuZGxlIGhhbCA9IENEU19HRVRfSEFMX0NCKHNhcF9jdHgtPnBfY2RzX2djdHgpOworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHg7CisJdFNpclNtZUNoYW5JbmZvICpjaGFuaW5mbzsKKwl0U2FwX1N0YXRpb25Bc3NvY0luZGljYXRpb24gKmFzc29jX2luZDsKKwl0U2FwX1N0YXJ0QnNzQ29tcGxldGVFdmVudCAqYnNzX2NvbXBsZXRlOworCXN0cnVjdCBzYXBfY2hfc2VsZWN0ZWRfcyAqYWNzX3NlbGVjdGVkOworCXRTYXBfU3RhdGlvbkFzc29jUmVhc3NvY0NvbXBsZXRlRXZlbnQgKnJlYXNzb2NfY29tcGxldGU7CisJdFNhcF9TdGF0aW9uRGlzYXNzb2NDb21wbGV0ZUV2ZW50ICpkaXNhc3NvY19jb21wOworCXRTYXBfU3RhdGlvblNldEtleUNvbXBsZXRlRXZlbnQgKmtleV9jb21wbGV0ZTsKKwl0U2FwX1N0YXRpb25NSUNGYWlsdXJlRXZlbnQgKm1pY19mYWlsdXJlOworCXRTYXBfTWFuYWdlbWVudEZyYW1lSW5mbyAqbWdtdF9mcmFtZTsKKworCS8qIEZvcm1hdCB0aGUgU3RhcnQgQlNTIENvbXBsZXRlIGV2ZW50IHRvIHJldHVybi4uLiAqLworCWlmIChOVUxMID09IHNhcF9jdHgtPnBmblNhcEV2ZW50Q2FsbGJhY2spIHsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlpZiAoTlVMTCA9PSBoYWwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJJbnZhbGlkIGhhbCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwltYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsKTsKKwlpZiAoTlVMTCA9PSBtYWNfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiSW52YWxpZCBNQUMgY29udGV4dCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICBGTCgiU0FQIGV2ZW50IGNhbGxiYWNrIGV2ZW50ID0gJXMiKSwKKwkJICBzYXBfaGRkX2V2ZW50X3RvX3N0cmluZyhzYXBfaGRkZXZlbnQpKTsKKworCXN3aXRjaCAoc2FwX2hkZGV2ZW50KSB7CisJY2FzZSBlU0FQX1NUQV9BU1NPQ19JTkQ6CisJCS8qICBUT0RPIC0gSW5kaWNhdGUgdGhlIGFzc29jIHJlcXVlc3QgaW5kaWNhdGlvbiB0byBPUyAqLworCQlzYXBfYXBfZXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9TVEFfQVNTT0NfSU5EOworCQlhc3NvY19pbmQgPSAmc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBBc3NvY0luZGljYXRpb247CisKKwkJY2RmX2NvcHlfbWFjYWRkcigmYXNzb2NfaW5kLT5zdGFNYWMsICZjc3Jfcm9hbWluZm8tPnBlZXJNYWMpOworCQlhc3NvY19pbmQtPnN0YUlkID0gY3NyX3JvYW1pbmZvLT5zdGFJZDsKKwkJYXNzb2NfaW5kLT5zdGF0dXMgPSAwOworCQkvKiBSZXF1aXJlZCBmb3IgaW5kaWNhdGluZyB0aGUgZnJhbWVzIHRvIHVwcGVyIGxheWVyICovCisJCWFzc29jX2luZC0+YmVhY29uTGVuZ3RoID0gY3NyX3JvYW1pbmZvLT5iZWFjb25MZW5ndGg7CisJCWFzc29jX2luZC0+YmVhY29uUHRyID0gY3NyX3JvYW1pbmZvLT5iZWFjb25QdHI7CisJCWFzc29jX2luZC0+YXNzb2NSZXFMZW5ndGggPSBjc3Jfcm9hbWluZm8tPmFzc29jUmVxTGVuZ3RoOworCQlhc3NvY19pbmQtPmFzc29jUmVxUHRyID0gY3NyX3JvYW1pbmZvLT5hc3NvY1JlcVB0cjsKKwkJYXNzb2NfaW5kLT5mV21tRW5hYmxlZCA9IGNzcl9yb2FtaW5mby0+d21tRW5hYmxlZFN0YTsKKwkJaWYgKGNzcl9yb2FtaW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZSAhPSBOVUxMKSB7CisJCQlhc3NvY19pbmQtPm5lZ290aWF0ZWRBdXRoVHlwZSA9CisJCQkJY3NyX3JvYW1pbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5BdXRoVHlwZTsKKwkJCWFzc29jX2luZC0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgPQorCQkJICAgIGNzcl9yb2FtaW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZS0+RW5jcnlwdGlvblR5cGU7CisJCQlhc3NvY19pbmQtPm5lZ290aWF0ZWRNQ0VuY3J5cHRpb25UeXBlID0KKwkJCSAgICBjc3Jfcm9hbWluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGU7CisJCQlhc3NvY19pbmQtPmZBdXRoUmVxdWlyZWQgPSBjc3Jfcm9hbWluZm8tPmZBdXRoUmVxdWlyZWQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlU0FQX1NUQVJUX0JTU19FVkVOVDoKKwkJc2FwX2FwX2V2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfU1RBUlRfQlNTX0VWRU5UOworCQlic3NfY29tcGxldGUgPSAmc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBTdGFydEJzc0NvbXBsZXRlRXZlbnQ7CisKKwkJYnNzX2NvbXBsZXRlLT5zdGF0dXMgPSAoZVNhcFN0YXR1cykgY29udGV4dDsKKwkJaWYgKGNzcl9yb2FtaW5mbyAhPSBOVUxMKQorCQkJYnNzX2NvbXBsZXRlLT5zdGFJZCA9IGNzcl9yb2FtaW5mby0+c3RhSWQ7CisJCWVsc2UKKwkJCWJzc19jb21wbGV0ZS0+c3RhSWQgPSAwOworCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoIihlU0FQX1NUQVJUX0JTU19FVkVOVCk6IHN0YUlkID0gJWQiKSwKKwkJCSAgYnNzX2NvbXBsZXRlLT5zdGFJZCk7CisKKwkJYnNzX2NvbXBsZXRlLT5vcGVyYXRpbmdDaGFubmVsID0gKHVpbnQ4X3QpIHNhcF9jdHgtPmNoYW5uZWw7CisJCWJzc19jb21wbGV0ZS0+c2Vzc2lvbklkID0gc2FwX2N0eC0+c2Vzc2lvbklkOworCQlicmVhazsKKwljYXNlIGVTQVBfREZTX0NBQ19TVEFSVDoKKwljYXNlIGVTQVBfREZTX0NBQ19JTlRFUlJVUFRFRDoKKwljYXNlIGVTQVBfREZTX0NBQ19FTkQ6CisJY2FzZSBlU0FQX0RGU19SQURBUl9ERVRFQ1Q6CisJY2FzZSBlU0FQX0RGU19OT19BVkFJTEFCTEVfQ0hBTk5FTDoKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVBfQVBfQUNTX09QVElNSVpFCisJY2FzZSBlU0FQX0FDU19TQ0FOX1NVQ0NFU1NfRVZFTlQ6CisjZW5kaWYKKwkJc2FwX2FwX2V2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IHNhcF9oZGRldmVudDsKKwkJc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBTdG9wQnNzQ29tcGxldGVFdmVudC5zdGF0dXMgPQorCQkJKGVTYXBTdGF0dXMpIGNvbnRleHQ7CisJCWJyZWFrOworCisJY2FzZSBlU0FQX0FDU19DSEFOTkVMX1NFTEVDVEVEOgorCQlzYXBfYXBfZXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gc2FwX2hkZGV2ZW50OworCQlhY3Nfc2VsZWN0ZWQgPSAmc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBfY2hfc2VsZWN0ZWQ7CisJCWlmIChlU0FQX1NUQVRVU19TVUNDRVNTID09IChlU2FwU3RhdHVzKWNvbnRleHQpIHsKKwkJCWFjc19zZWxlY3RlZC0+cHJpX2NoID0gc2FwX2N0eC0+YWNzX2NmZy0+cHJpX2NoOworCQkJYWNzX3NlbGVjdGVkLT5odF9zZWNfY2ggPSBzYXBfY3R4LT5hY3NfY2ZnLT5odF9zZWNfY2g7CisJCQlhY3Nfc2VsZWN0ZWQtPmNoX3dpZHRoID0gc2FwX2N0eC0+YWNzX2NmZy0+Y2hfd2lkdGg7CisJCQlhY3Nfc2VsZWN0ZWQtPnZodF9zZWcwX2NlbnRlcl9jaCA9CisJCQkJc2FwX2N0eC0+YWNzX2NmZy0+dmh0X3NlZzBfY2VudGVyX2NoOworCQkJYWNzX3NlbGVjdGVkLT52aHRfc2VnMV9jZW50ZXJfY2ggPQorCQkJCXNhcF9jdHgtPmFjc19jZmctPnZodF9zZWcxX2NlbnRlcl9jaDsKKwkJfSBlbHNlIGlmIChlU0FQX1NUQVRVU19GQUlMVVJFID09IChlU2FwU3RhdHVzKWNvbnRleHQpIHsKKwkJCWFjc19zZWxlY3RlZC0+cHJpX2NoID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgZVNBUF9TVE9QX0JTU19FVkVOVDoKKwkJc2FwX2FwX2V2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfU1RPUF9CU1NfRVZFTlQ7CisJCXNhcF9hcF9ldmVudC5zYXBldnQuc2FwU3RvcEJzc0NvbXBsZXRlRXZlbnQuc3RhdHVzID0KKwkJCShlU2FwU3RhdHVzKSBjb250ZXh0OworCQlicmVhazsKKworCWNhc2UgZVNBUF9TVEFfQVNTT0NfRVZFTlQ6CisJY2FzZSBlU0FQX1NUQV9SRUFTU09DX0VWRU5UOgorCQlyZWFzc29jX2NvbXBsZXRlID0KKwkJICAgICZzYXBfYXBfZXZlbnQuc2FwZXZ0LnNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50OworCisJCWlmIChjc3Jfcm9hbWluZm8tPmZSZWFzc29jUmVxKQorCQkJc2FwX2FwX2V2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfU1RBX1JFQVNTT0NfRVZFTlQ7CisJCWVsc2UKKwkJCXNhcF9hcF9ldmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX1NUQV9BU1NPQ19FVkVOVDsKKworCQljZGZfY29weV9tYWNhZGRyKCZyZWFzc29jX2NvbXBsZXRlLT5zdGFNYWMsCisJCQkJICZjc3Jfcm9hbWluZm8tPnBlZXJNYWMpOworCQlyZWFzc29jX2NvbXBsZXRlLT5zdGFJZCA9IGNzcl9yb2FtaW5mby0+c3RhSWQ7CisJCXJlYXNzb2NfY29tcGxldGUtPnN0YXR1c0NvZGUgPSBjc3Jfcm9hbWluZm8tPnN0YXR1c0NvZGU7CisJCXJlYXNzb2NfY29tcGxldGUtPmllc0xlbiA9IGNzcl9yb2FtaW5mby0+cnNuSUVMZW47CisJCWNkZl9tZW1fY29weShyZWFzc29jX2NvbXBsZXRlLT5pZXMsIGNzcl9yb2FtaW5mby0+cHJzbklFLAorCQkJICAgICBjc3Jfcm9hbWluZm8tPnJzbklFTGVuKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJCWlmIChjc3Jfcm9hbWluZm8tPndhcGlJRUxlbikgeworCQkJdWludDhfdCBsZW4gPSByZWFzc29jX2NvbXBsZXRlLT5pZXNMZW47CisJCQlyZWFzc29jX2NvbXBsZXRlLT5pZXNMZW4gKz0gY3NyX3JvYW1pbmZvLT53YXBpSUVMZW47CisJCQljZGZfbWVtX2NvcHkoJnJlYXNzb2NfY29tcGxldGUtPmllc1tsZW5dLAorCQkJCSAgICAgY3NyX3JvYW1pbmZvLT5wd2FwaUlFLAorCQkJCSAgICAgY3NyX3JvYW1pbmZvLT53YXBpSUVMZW4pOworCQl9CisjZW5kaWYKKwkJaWYgKGNzcl9yb2FtaW5mby0+YWRkSUVMZW4pIHsKKwkJCXVpbnQ4X3QgbGVuID0gcmVhc3NvY19jb21wbGV0ZS0+aWVzTGVuOworCQkJcmVhc3NvY19jb21wbGV0ZS0+aWVzTGVuICs9IGNzcl9yb2FtaW5mby0+YWRkSUVMZW47CisJCQljZGZfbWVtX2NvcHkoJnJlYXNzb2NfY29tcGxldGUtPmllc1tsZW5dLAorCQkJCSAgICAgY3NyX3JvYW1pbmZvLT5wYWRkSUUsCisJCQkJICAgICBjc3Jfcm9hbWluZm8tPmFkZElFTGVuKTsKKwkJfQorCisJCS8qIGFsc28gZmlsbCB1cCB0aGUgY2hhbm5lbCBpbmZvIGZyb20gdGhlIGNzcl9yb2FtSW5mbyAqLworCQljaGFuaW5mbyA9ICZyZWFzc29jX2NvbXBsZXRlLT5jaGFuX2luZm87CisKKwkJY2hhbmluZm8tPmNoYW5faWQgPSBjc3Jfcm9hbWluZm8tPmNoYW5faW5mby5jaGFuX2lkOworCQljaGFuaW5mby0+bWh6ID0gY3NyX3JvYW1pbmZvLT5jaGFuX2luZm8ubWh6OworCQljaGFuaW5mby0+aW5mbyA9IGNzcl9yb2FtaW5mby0+Y2hhbl9pbmZvLmluZm87CisJCWNoYW5pbmZvLT5iYW5kX2NlbnRlcl9mcmVxMSA9CisJCQljc3Jfcm9hbWluZm8tPmNoYW5faW5mby5iYW5kX2NlbnRlcl9mcmVxMTsKKwkJY2hhbmluZm8tPmJhbmRfY2VudGVyX2ZyZXEyID0KKwkJCWNzcl9yb2FtaW5mby0+Y2hhbl9pbmZvLmJhbmRfY2VudGVyX2ZyZXEyOworCQljaGFuaW5mby0+cmVnX2luZm9fMSA9CisJCQljc3Jfcm9hbWluZm8tPmNoYW5faW5mby5yZWdfaW5mb18xOworCQljaGFuaW5mby0+cmVnX2luZm9fMiA9CisJCQljc3Jfcm9hbWluZm8tPmNoYW5faW5mby5yZWdfaW5mb18yOworCisJCXJlYXNzb2NfY29tcGxldGUtPndtbUVuYWJsZWQgPSBjc3Jfcm9hbWluZm8tPndtbUVuYWJsZWRTdGE7CisJCXJlYXNzb2NfY29tcGxldGUtPnN0YXR1cyA9IChlU2FwU3RhdHVzKSBjb250ZXh0OworCQlyZWFzc29jX2NvbXBsZXRlLT50aW1pbmdNZWFzQ2FwID0gY3NyX3JvYW1pbmZvLT50aW1pbmdNZWFzQ2FwOworCQlicmVhazsKKworCWNhc2UgZVNBUF9TVEFfRElTQVNTT0NfRVZFTlQ6CisJCXNhcF9hcF9ldmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX1NUQV9ESVNBU1NPQ19FVkVOVDsKKwkJZGlzYXNzb2NfY29tcCA9CisJCQkmc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBTdGF0aW9uRGlzYXNzb2NDb21wbGV0ZUV2ZW50OworCisJCWNkZl9jb3B5X21hY2FkZHIoJmRpc2Fzc29jX2NvbXAtPnN0YU1hYywKKwkJCQkgJmNzcl9yb2FtaW5mby0+cGVlck1hYyk7CisJCWRpc2Fzc29jX2NvbXAtPnN0YUlkID0gY3NyX3JvYW1pbmZvLT5zdGFJZDsKKwkJaWYgKGNzcl9yb2FtaW5mby0+cmVhc29uQ29kZSA9PSBlQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCkKKwkJCWRpc2Fzc29jX2NvbXAtPnJlYXNvbiA9IGVTQVBfVVNSX0lOSVRBVEVEX0RJU0FTU09DOworCQllbHNlCisJCQlkaXNhc3NvY19jb21wLT5yZWFzb24gPSBlU0FQX01BQ19JTklUQVRFRF9ESVNBU1NPQzsKKworCQlkaXNhc3NvY19jb21wLT5zdGF0dXNDb2RlID0gY3NyX3JvYW1pbmZvLT5zdGF0dXNDb2RlOworCQlkaXNhc3NvY19jb21wLT5zdGF0dXMgPSAoZVNhcFN0YXR1cykgY29udGV4dDsKKwkJYnJlYWs7CisKKwljYXNlIGVTQVBfU1RBX1NFVF9LRVlfRVZFTlQ6CisJCXNhcF9hcF9ldmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX1NUQV9TRVRfS0VZX0VWRU5UOworCQlrZXlfY29tcGxldGUgPQorCQkJJnNhcF9hcF9ldmVudC5zYXBldnQuc2FwU3RhdGlvblNldEtleUNvbXBsZXRlRXZlbnQ7CisJCWtleV9jb21wbGV0ZS0+c3RhdHVzID0gKGVTYXBTdGF0dXMpIGNvbnRleHQ7CisJCWNkZl9jb3B5X21hY2FkZHIoJmtleV9jb21wbGV0ZS0+cGVlck1hY0FkZHIsCisJCQkJICZjc3Jfcm9hbWluZm8tPnBlZXJNYWMpOworCQlicmVhazsKKworCWNhc2UgZVNBUF9TVEFfTUlDX0ZBSUxVUkVfRVZFTlQ6CisJCXNhcF9hcF9ldmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX1NUQV9NSUNfRkFJTFVSRV9FVkVOVDsKKwkJbWljX2ZhaWx1cmUgPSAmc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50OworCisJCWNkZl9tZW1fY29weSgmbWljX2ZhaWx1cmUtPnNyY01hY0FkZHIsCisJCQkgICAgIGNzcl9yb2FtaW5mby0+dS5wTUlDRmFpbHVyZUluZm8tPnNyY01hY0FkZHIsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQljZGZfbWVtX2NvcHkoJm1pY19mYWlsdXJlLT5zdGFNYWMuYnl0ZXMsCisJCQkgICAgIGNzcl9yb2FtaW5mby0+dS5wTUlDRmFpbHVyZUluZm8tPnRhTWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCWNkZl9tZW1fY29weSgmbWljX2ZhaWx1cmUtPmRzdE1hY0FkZHIuYnl0ZXMsCisJCQkgICAgIGNzcl9yb2FtaW5mby0+dS5wTUlDRmFpbHVyZUluZm8tPmRzdE1hY0FkZHIsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQltaWNfZmFpbHVyZS0+bXVsdGljYXN0ID0KKwkJCWNzcl9yb2FtaW5mby0+dS5wTUlDRmFpbHVyZUluZm8tPm11bHRpY2FzdDsKKwkJbWljX2ZhaWx1cmUtPklWMSA9IGNzcl9yb2FtaW5mby0+dS5wTUlDRmFpbHVyZUluZm8tPklWMTsKKwkJbWljX2ZhaWx1cmUtPmtleUlkID0gY3NyX3JvYW1pbmZvLT51LnBNSUNGYWlsdXJlSW5mby0+a2V5SWQ7CisJCWNkZl9tZW1fY29weShtaWNfZmFpbHVyZS0+VFNDLAorCQkJICAgICBjc3Jfcm9hbWluZm8tPnUucE1JQ0ZhaWx1cmVJbmZvLT5UU0MsCisJCQkgICAgIFNJUl9DSVBIRVJfU0VRX0NUUl9TSVpFKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTQVBfQVNTT0NfU1RBX0NBTExCQUNLX0VWRU5UOgorCQlicmVhazsKKworCWNhc2UgZVNBUF9XUFNfUEJDX1BST0JFX1JFUV9FVkVOVDoKKwkJc2FwX2FwX2V2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfV1BTX1BCQ19QUk9CRV9SRVFfRVZFTlQ7CisKKwkJY2RmX21lbV9jb3B5KCZzYXBfYXBfZXZlbnQuc2FwZXZ0LnNhcFBCQ1Byb2JlUmVxRXZlbnQuCisJCQkgICAgIFdQU1BCQ1Byb2JlUmVxLCBjc3Jfcm9hbWluZm8tPnUucFdQU1BCQ1Byb2JlUmVxLAorCQkJICAgICBzaXplb2YodFNpcldQU1BCQ1Byb2JlUmVxKSk7CisJCWJyZWFrOworCisJY2FzZSBlU0FQX0lORElDQVRFX01HTVRfRlJBTUU6CisJCXNhcF9hcF9ldmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX0lORElDQVRFX01HTVRfRlJBTUU7CisJCW1nbXRfZnJhbWUgPSAmc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBNYW5hZ2VtZW50RnJhbWVJbmZvOworCisJCW1nbXRfZnJhbWUtPm5GcmFtZUxlbmd0aCA9IGNzcl9yb2FtaW5mby0+bkZyYW1lTGVuZ3RoOworCQltZ210X2ZyYW1lLT5wYkZyYW1lcyA9IGNzcl9yb2FtaW5mby0+cGJGcmFtZXM7CisJCW1nbXRfZnJhbWUtPmZyYW1lVHlwZSA9IGNzcl9yb2FtaW5mby0+ZnJhbWVUeXBlOworCQltZ210X2ZyYW1lLT5yeENoYW4gPSBjc3Jfcm9hbWluZm8tPnJ4Q2hhbjsKKwkJYnJlYWs7CisKKwljYXNlIGVTQVBfUkVNQUlOX0NIQU5fUkVBRFk6CisJCXNhcF9hcF9ldmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX1JFTUFJTl9DSEFOX1JFQURZOworCQlzYXBfYXBfZXZlbnQuc2FwZXZ0LnNhcF9yb2NfaW5kLnNjYW5faWQgPQorCQkJCXNhcF9jdHgtPnJvY19pbmRfc2Nhbl9pZDsKKwkJYnJlYWs7CisJY2FzZSBlU0FQX1NFTkRfQUNUSU9OX0NORjoKKwkJc2FwX2FwX2V2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfU0VORF9BQ1RJT05fQ05GOworCQlzYXBfYXBfZXZlbnQuc2FwZXZ0LnNhcEFjdGlvbkNuZi5hY3Rpb25TZW5kU3VjY2VzcyA9CisJCQkoZVNhcFN0YXR1cykgY29udGV4dDsKKwkJYnJlYWs7CisKKwljYXNlIGVTQVBfRElTQ09OTkVDVF9BTExfUDJQX0NMSUVOVDoKKwkJc2FwX2FwX2V2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfRElTQ09OTkVDVF9BTExfUDJQX0NMSUVOVDsKKwkJc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBBY3Rpb25DbmYuYWN0aW9uU2VuZFN1Y2Nlc3MgPQorCQkJKGVTYXBTdGF0dXMpIGNvbnRleHQ7CisJCWJyZWFrOworCisJY2FzZSBlU0FQX01BQ19UUklHX1NUT1BfQlNTX0VWRU5UOgorCQlzYXBfYXBfZXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9NQUNfVFJJR19TVE9QX0JTU19FVkVOVDsKKwkJc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBBY3Rpb25DbmYuYWN0aW9uU2VuZFN1Y2Nlc3MgPQorCQkJKGVTYXBTdGF0dXMpIGNvbnRleHQ7CisJCWJyZWFrOworCisJY2FzZSBlU0FQX1VOS05PV05fU1RBX0pPSU46CisJCXNhcF9hcF9ldmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX1VOS05PV05fU1RBX0pPSU47CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSBzYXBfYXBfZXZlbnQuc2FwZXZ0LnNhcFVua25vd25TVEFKb2luLgorCQkJICAgICBtYWNhZGRyLmJ5dGVzLCAodm9pZCAqKSBjb250ZXh0LAorCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJCWJyZWFrOworCisJY2FzZSBlU0FQX01BWF9BU1NPQ19FWENFRURFRDoKKwkJc2FwX2FwX2V2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfTUFYX0FTU09DX0VYQ0VFREVEOworCQljZGZfY29weV9tYWNhZGRyKCZzYXBfYXBfZXZlbnQuc2FwZXZ0LgorCQkJCSBzYXBNYXhBc3NvY0V4Y2VlZGVkLm1hY2FkZHIsCisJCQkJICZjc3Jfcm9hbWluZm8tPnBlZXJNYWMpOworCQlicmVhazsKKworCWNhc2UgZVNBUF9DSEFOTkVMX0NIQU5HRV9FVkVOVDoKKwkJLyoKKwkJICogUmVjb25maWcgQUNTIHJlc3VsdCBpbmZvLiBGb3IgREZTIEFQLUFQIE1vZGUgU2VjIEFQIEFDUworCQkgKiBmb2xsb3dzIHByaSBBUAorCQkgKi8KKwkJc2FwX2N0eC0+YWNzX2NmZy0+cHJpX2NoID0gc2FwX2N0eC0+Y2hhbm5lbDsKKwkJc2FwX2N0eC0+YWNzX2NmZy0+Y2hfd2lkdGggPSBzYXBfY3R4LT5jaF9wYXJhbXMuY2hfd2lkdGg7CisJCXNhcF9jb25maWdfYWNzX3Jlc3VsdChoYWwsIHNhcF9jdHgsIHNhcF9jdHgtPnNlY29uZGFyeV9jaCk7CisKKwkJc2FwX2FwX2V2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfQ0hBTk5FTF9DSEFOR0VfRVZFTlQ7CisKKwkJYWNzX3NlbGVjdGVkID0gJnNhcF9hcF9ldmVudC5zYXBldnQuc2FwX2NoX3NlbGVjdGVkOworCQlhY3Nfc2VsZWN0ZWQtPnByaV9jaCA9IHNhcF9jdHgtPmFjc19jZmctPnByaV9jaDsKKwkJYWNzX3NlbGVjdGVkLT5odF9zZWNfY2ggPSBzYXBfY3R4LT5hY3NfY2ZnLT5odF9zZWNfY2g7CisJCWFjc19zZWxlY3RlZC0+Y2hfd2lkdGggPSBzYXBfY3R4LT5hY3NfY2ZnLT5jaF93aWR0aDsKKwkJYWNzX3NlbGVjdGVkLT52aHRfc2VnMF9jZW50ZXJfY2ggPQorCQkJc2FwX2N0eC0+YWNzX2NmZy0+dmh0X3NlZzBfY2VudGVyX2NoOworCQlhY3Nfc2VsZWN0ZWQtPnZodF9zZWcxX2NlbnRlcl9jaCA9CisJCQlzYXBfY3R4LT5hY3NfY2ZnLT52aHRfc2VnMV9jZW50ZXJfY2g7CisJCWJyZWFrOworCisJY2FzZSBlU0FQX0RGU19OT0xfR0VUOgorCQlzYXBfYXBfZXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9ERlNfTk9MX0dFVDsKKwkJc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBEZnNOb2xJbmZvLnNEZnNMaXN0ID0KKwkJCU5VTV81R0haX0NIQU5ORUxTICogc2l6ZW9mKHRTYXBEZnNOb2xJbmZvKTsKKwkJc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBEZnNOb2xJbmZvLnBEZnNMaXN0ID0gKHZvaWQgKikKKwkJCSgmbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uc2FwRGZzQ2hhbm5lbE5vbExpc3RbMF0pOworCQlicmVhazsKKworCWNhc2UgZVNBUF9ERlNfTk9MX1NFVDoKKwkJc2FwX2FwX2V2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfREZTX05PTF9TRVQ7CisJCXNhcF9hcF9ldmVudC5zYXBldnQuc2FwRGZzTm9sSW5mby5zRGZzTGlzdCA9CisJCQltYWNfY3R4LT5zYXAuU2FwRGZzSW5mby5udW1DdXJyZW50UmVnRG9tYWluRGZzQ2hhbm5lbHMgKgorCQkJc2l6ZW9mKHRTYXBEZnNOb2xJbmZvKTsKKwkJc2FwX2FwX2V2ZW50LnNhcGV2dC5zYXBEZnNOb2xJbmZvLnBEZnNMaXN0ID0gKHZvaWQgKikKKwkJCSgmbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uc2FwRGZzQ2hhbm5lbE5vbExpc3RbMF0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiU0FQIFVua25vd24gY2FsbGJhY2sgZXZlbnQgPSAlZCIpLAorCQkJICBzYXBfaGRkZXZlbnQpOworCQlicmVhazsKKwl9CisJY2RmX3N0YXR1cyA9ICgqc2FwX2N0eC0+cGZuU2FwRXZlbnRDYWxsYmFjaykKKwkJCSgmc2FwX2FwX2V2ZW50LCBzYXBfY3R4LT5wVXNyQ29udGV4dCk7CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgc2FwX2ZpbmRfdmFsaWRfY29uY3VycmVudF9zZXNzaW9uCisKKyAgIERFU0NSSVBUSU9OCisgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBzYXBjb250ZXh0IG9mIGFueSB2YWxpZCBzYXAgc2Vzc2lvbi4KKworICAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBoSGFsICAgICAgICA6IEhBTCBwb2ludGVyCisKKyAgIFJFVFVSTiBWQUxVRQorICAgIHB0U2FwQ29udGV4dCA6IHZhbGlkIHNhcCBjb250ZXh0CisKKyAgIFNJREUgRUZGRUNUUworICAgIE5BCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3B0U2FwQ29udGV4dCBzYXBfZmluZF92YWxpZF9jb25jdXJyZW50X3Nlc3Npb24odEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl1aW50OF90IGludGYgPSAwOworCisJZm9yIChpbnRmID0gMDsgaW50ZiA8IFNBUF9NQVhfTlVNX1NFU1NJT047IGludGYrKykgeworCQlpZiAoKChDREZfU0FQX01PREUgPT0gcE1hYy0+c2FwLnNhcEN0eExpc3RbaW50Zl0uc2FwUGVyc29uYSkKKwkJICAgIHx8CisJCSAgICAoQ0RGX1AyUF9HT19NT0RFID09IHBNYWMtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnNhcFBlcnNvbmEpKSAmJgorCQkgICAgcE1hYy0+c2FwLnNhcEN0eExpc3RbaW50Zl0ucFNhcENvbnRleHQgIT0gTlVMTCkgeworCQkJcmV0dXJuIHBNYWMtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnBTYXBDb250ZXh0OworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICAgc2FwX2Nsb3NlX3Nlc3Npb24KKworICAgREVTQ1JJUFRJT04KKyAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgY2xvc2UgYWxsIHRoZSBzbWUgc2Vzc2lvbnMgYXMgd2VsbCBhcyB6ZXJvLW91dCB0aGUKKyAgICBzYXAgZ2xvYmFsIHN0cnVjdHVyZQorCisgICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIGhIYWwgICAgICAgIDogSEFMIHBvaW50ZXIKKyAgICBzYXBDb250ZXh0ICA6IFNhcCBDb250ZXh0IHZhbHVlCisgICAgY2FsbGJhY2sgICAgOiBSb2FtIFNlc3Npb24gY2xvc2UgY2FsbGJhY2sKKyAgICB2YWxpZCAgICAgICA6IFNhcCBjb250ZXh0IGlzIHZhbGlkIG9yIG5vCisKKyAgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBDREZfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorICAgIENERl9TVEFUVVNfU1VDQ0VTUzogU3VjY2VzcworCisgICBTSURFIEVGRkVDVFMKKyAgICBOQQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDREZfU1RBVFVTIHNhcF9jbG9zZV9zZXNzaW9uKHRIYWxIYW5kbGUgaEhhbCwKKwkJCSAgICAgcHRTYXBDb250ZXh0IHNhcENvbnRleHQsCisJCQkgICAgIGNzcl9yb2FtU2Vzc2lvbkNsb3NlQ2FsbGJhY2sgY2FsbGJhY2ssIGJvb2wgdmFsaWQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCWlmIChmYWxzZSA9PSB2YWxpZCkgeworCQljZGZfc3RhdHVzID0gc21lX2Nsb3NlX3Nlc3Npb24oaEhhbCwKKwkJCQkJICAgICAgIHNhcENvbnRleHQtPnNlc3Npb25JZCwKKwkJCQkJICAgICAgIGNhbGxiYWNrLCBOVUxMKTsKKwl9IGVsc2UgeworCQljZGZfc3RhdHVzID0gc21lX2Nsb3NlX3Nlc3Npb24oaEhhbCwKKwkJCQkJICAgICAgIHNhcENvbnRleHQtPnNlc3Npb25JZCwKKwkJCQkJICAgICAgIGNhbGxiYWNrLCBzYXBDb250ZXh0KTsKKwl9CisKKwlzYXBDb250ZXh0LT5pc0NhY1N0YXJ0Tm90aWZpZWQgPSBmYWxzZTsKKwlzYXBDb250ZXh0LT5pc0NhY0VuZE5vdGlmaWVkID0gZmFsc2U7CisJcE1hYy0+c2FwLnNhcEN0eExpc3Rbc2FwQ29udGV4dC0+c2Vzc2lvbklkXS5wU2FwQ29udGV4dCA9IE5VTEw7CisKKwlpZiAoTlVMTCA9PSBzYXBfZmluZF92YWxpZF9jb25jdXJyZW50X3Nlc3Npb24oaEhhbCkpIHsKKwkJLyogSWYgdGltZXIgaXMgcnVubmluZyB0aGVuIHN0b3AgdGhlIHRpbWVyIGFuZCBkZXN0b3J5IGl0ICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJICAic2FwZGZzOiBubyBzZXNzaW9uIGFyZSB2YWxpZCwgc28gY2xlYXJpbmcgZGZzIGdsb2JhbCBzdHJ1Y3R1cmUiKTsKKwkJLyoKKwkJICogQ0FDIHRpbWVyIHdpbGwgYmUgaW5pdGlhdGVkIGFuZCBzdGFydGVkIG9ubHkgd2hlbiBTQVAgc3RhcnRzCisJCSAqIG9uIERGUyBjaGFubmVsIGFuZCBpdCB3aWxsIGJlIHN0b3BwZWQgYW5kIGRlc3Ryb3llZAorCQkgKiBpbW1lZGlhdGVseSBvbmNlIHRoZSByYWRhciBkZXRlY3RlZCBvciB0aW1lZG91dC4gU28KKwkJICogYXMgcGVyIGRlc2lnbiBDQUMgdGltZXIgc2hvdWxkIGJlIGRlc3Ryb3llZCBhZnRlciBzdG9wCisJCSAqLworCQlpZiAocE1hYy0+c2FwLlNhcERmc0luZm8uaXNfZGZzX2NhY190aW1lcl9ydW5uaW5nKSB7CisJCQljZGZfbWNfdGltZXJfc3RvcCgmcE1hYy0+c2FwLlNhcERmc0luZm8uCisJCQkJCSAgc2FwX2Rmc19jYWNfdGltZXIpOworCQkJcE1hYy0+c2FwLlNhcERmc0luZm8uaXNfZGZzX2NhY190aW1lcl9ydW5uaW5nID0gMDsKKwkJCWNkZl9tY190aW1lcl9kZXN0cm95KAorCQkJCSZwTWFjLT5zYXAuU2FwRGZzSW5mby5zYXBfZGZzX2NhY190aW1lcik7CisJCX0KKwkJcE1hYy0+c2FwLlNhcERmc0luZm8uY2FjX3N0YXRlID0gZVNBUF9ERlNfRE9fTk9UX1NLSVBfQ0FDOworCQlzYXBfY2FjX3Jlc2V0X25vdGlmeShoSGFsKTsKKwkJY2RmX21lbV96ZXJvKCZwTWFjLT5zYXAsIHNpemVvZihwTWFjLT5zYXApKTsKKwl9CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gIHNhcF9jYWNfcmVzZXRfbm90aWZ5CisKKyAgIERFU0NSSVBUSU9OIEZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHVwIG9uIHN0b3AgYnNzIGluZGljYXRpb24gdG8gY2xlYW4gdXAKKyAgICAgICAgICAgICAgREZTIGdsb2JhbCBzdHJ1Y3R1cmUuCisKKyAgIERFUEVOREVOQ0lFUyBQQVJBTUVURVJTCisgICAgIElOIGhIQUwgOiBIQUwgcG9pbnRlcgorCisgICBSRVRVUk4gVkFMVUUgIDogdm9pZC4KKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgc2FwX2NhY19yZXNldF9ub3RpZnkodEhhbEhhbmRsZSBoSGFsKQoreworCXVpbnQ4X3QgaW50ZiA9IDA7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJZm9yIChpbnRmID0gMDsgaW50ZiA8IFNBUF9NQVhfTlVNX1NFU1NJT047IGludGYrKykgeworCQlwdFNhcENvbnRleHQgcFNhcENvbnRleHQgPQorCQkJKHB0U2FwQ29udGV4dCkgcE1hYy0+c2FwLnNhcEN0eExpc3RbaW50Zl0ucFNhcENvbnRleHQ7CisJCWlmICgoKENERl9TQVBfTU9ERSA9PSBwTWFjLT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5zYXBQZXJzb25hKQorCQkgICAgfHwKKwkJICAgIChDREZfUDJQX0dPX01PREUgPT0gcE1hYy0+c2FwLnNhcEN0eExpc3RbaW50Zl0uc2FwUGVyc29uYSkpCisJCSAgICAmJiBwTWFjLT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5wU2FwQ29udGV4dCAhPSBOVUxMKSB7CisJCQlwU2FwQ29udGV4dC0+aXNDYWNTdGFydE5vdGlmaWVkID0gZmFsc2U7CisJCQlwU2FwQ29udGV4dC0+aXNDYWNFbmROb3RpZmllZCA9IGZhbHNlOworCQl9CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgc2FwX2NhY19zdGFydF9ub3RpZnkKKworICAgREVTQ1JJUFRJT04gRnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gbm90aWZ5IGVTQVBfREZTX0NBQ19TVEFSVCBldmVudAorICAgICAgICAgICAgICB0byBIREQKKworICAgREVQRU5ERU5DSUVTIFBBUkFNRVRFUlMKKyAgICAgSU4gaEhBTCA6IEhBTCBwb2ludGVyCisKKyAgIFJFVFVSTiBWQUxVRSAgOiBDREZfU1RBVFVTLgorCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworQ0RGX1NUQVRVUyBzYXBfY2FjX3N0YXJ0X25vdGlmeSh0SGFsSGFuZGxlIGhIYWwpCit7CisJdWludDhfdCBpbnRmID0gMDsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlmb3IgKGludGYgPSAwOyBpbnRmIDwgU0FQX01BWF9OVU1fU0VTU0lPTjsgaW50ZisrKSB7CisJCXB0U2FwQ29udGV4dCBwU2FwQ29udGV4dCA9CisJCQkocHRTYXBDb250ZXh0KSBwTWFjLT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5wU2FwQ29udGV4dDsKKwkJaWYgKCgoQ0RGX1NBUF9NT0RFID09IHBNYWMtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnNhcFBlcnNvbmEpCisJCSAgICB8fAorCQkgICAgKENERl9QMlBfR09fTU9ERSA9PSBwTWFjLT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5zYXBQZXJzb25hKSkKKwkJICAgICYmIHBNYWMtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnBTYXBDb250ZXh0ICE9IE5VTEwgJiYKKwkJICAgIChmYWxzZSA9PSBwU2FwQ29udGV4dC0+aXNDYWNTdGFydE5vdGlmaWVkKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkJICAic2FwZGZzOiBTaWduYWxpbmcgZVNBUF9ERlNfQ0FDX1NUQVJUIHRvIEhERCBmb3Igc2FwY3R4WyVwXSIsCisJCQkJICBwU2FwQ29udGV4dCk7CisKKwkJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChwU2FwQ29udGV4dCwgTlVMTCwKKwkJCQkJCQkgIGVTQVBfREZTX0NBQ19TVEFSVCwKKwkJCQkJCQkgICh2b2lkICopCisJCQkJCQkJICBlU0FQX1NUQVRVU19TVUNDRVNTKTsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RmX3N0YXR1cykgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgIkluICVzLCBmYWlsZWQgc2V0dGluZyBpc0NhY1N0YXJ0Tm90aWZpZWQgb24gaW50ZXJmYWNlWyVkXSIsCisJCQkJCSAgX19mdW5jX18sIGludGYpOworCQkJCXJldHVybiBjZGZfc3RhdHVzOworCQkJfQorCQkJcFNhcENvbnRleHQtPmlzQ2FjU3RhcnROb3RpZmllZCA9IHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICBzYXBfY2FjX2VuZF9ub3RpZnkKKworICAgREVTQ1JJUFRJT04gRnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gbm90aWZ5IGVTQVBfREZTX0NBQ19FTkQgZXZlbnQKKyAgICAgICAgICAgICAgdG8gSERECisKKyAgIERFUEVOREVOQ0lFUyBQQVJBTUVURVJTCisgICAgIElOIGhIQUwgOiBIQUwgcG9pbnRlcgorCisgICBSRVRVUk4gVkFMVUUgIDogQ0RGX1NUQVRVUy4KKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0NERl9TVEFUVVMgc2FwX2NhY19lbmRfbm90aWZ5KHRIYWxIYW5kbGUgaEhhbCwgdENzclJvYW1JbmZvICpyb2FtSW5mbykKK3sKKwl1aW50OF90IGludGY7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJLyoKKwkgKiBlU0FQX0RGU19DSEFOTkVMX0NBQ19FTkQ6CisJICogQ0FDIFBlcmlvZCBlbGFwc2VkIGFuZCB0aGVyZSB3YXMgbm8gcmFkYXIKKwkgKiBmb3VuZCBzbywgU0FQIGNhbiBjb250aW51ZSBiZWFjb25pbmcuCisJICogc2FwX3JhZGFyX2ZvdW5kX3N0YXR1cyBpcyBzZXQgdG8gMAorCSAqLworCWZvciAoaW50ZiA9IDA7IGludGYgPCBTQVBfTUFYX05VTV9TRVNTSU9OOyBpbnRmKyspIHsKKwkJcHRTYXBDb250ZXh0IHBTYXBDb250ZXh0ID0KKwkJCShwdFNhcENvbnRleHQpIHBNYWMtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnBTYXBDb250ZXh0OworCQlpZiAoKChDREZfU0FQX01PREUgPT0gcE1hYy0+c2FwLnNhcEN0eExpc3RbaW50Zl0uc2FwUGVyc29uYSkKKwkJICAgIHx8CisJCSAgICAoQ0RGX1AyUF9HT19NT0RFID09IHBNYWMtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnNhcFBlcnNvbmEpKQorCQkgICAgJiYgcE1hYy0+c2FwLnNhcEN0eExpc3RbaW50Zl0ucFNhcENvbnRleHQgIT0gTlVMTCAmJgorCQkgICAgKGZhbHNlID09IHBTYXBDb250ZXh0LT5pc0NhY0VuZE5vdGlmaWVkKSkgeworCQkJcFNhcENvbnRleHQgPSBwTWFjLT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5wU2FwQ29udGV4dDsKKwkJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChwU2FwQ29udGV4dCwgTlVMTCwKKwkJCQkJCQkgIGVTQVBfREZTX0NBQ19FTkQsCisJCQkJCQkJICAodm9pZCAqKQorCQkJCQkJCSAgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICJJbiAlcywgZmFpbGVkIHNldHRpbmcgaXNDYWNFbmROb3RpZmllZCBvbiBpbnRlcmZhY2VbJWRdIiwKKwkJCQkJICBfX2Z1bmNfXywgaW50Zik7CisJCQkJcmV0dXJuIGNkZl9zdGF0dXM7CisJCQl9CisJCQlwU2FwQ29udGV4dC0+aXNDYWNFbmROb3RpZmllZCA9IHRydWU7CisJCQlwTWFjLT5zYXAuU2FwRGZzSW5mby5zYXBfcmFkYXJfZm91bmRfc3RhdHVzID0gZmFsc2U7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCQkgICJzYXBkZnM6IFN0YXJ0IGJlYWNvbiByZXF1ZXN0IG9uIHNhcGN0eFslcF0iLAorCQkJCSAgcFNhcENvbnRleHQpOworCisJCQkvKiBTdGFydCBiZWFjb25pbmcgb24gdGhlIG5ldyBjaGFubmVsICovCisJCQl3bGFuc2FwX3N0YXJ0X2JlYWNvbl9yZXEocFNhcENvbnRleHQpOworCisJCQkvKiBUcmFuc2l0aW9uIGZyb20gZVNBUF9TVEFSVElORyB0byBlU0FQX1NUQVJURUQKKwkJCSAqIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKQorCQkJICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCQkgICJzYXBkZnM6IGNoYW5uZWxbJWRdIGZyb20gc3RhdGUgJXMgPT4gJXMiLAorCQkJCSAgcFNhcENvbnRleHQtPmNoYW5uZWwsICJlU0FQX1NUQVJUSU5HIiwKKwkJCQkgICJlU0FQX1NUQVJURUQiKTsKKworCQkJcFNhcENvbnRleHQtPnNhcHNNYWNoaW5lID0gZVNBUF9TVEFSVEVEOworCisJCQkvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisJCQljZGZfc3RhdHVzID0gc2FwX3NpZ25hbF9oZGRfZXZlbnQocFNhcENvbnRleHQsIHJvYW1JbmZvLAorCQkJCQkJCSAgZVNBUF9TVEFSVF9CU1NfRVZFTlQsCisJCQkJCQkJICAodm9pZCAqKQorCQkJCQkJCSAgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICJJbiAlcywgZmFpbGVkIHNldHRpbmcgaXNDYWNFbmROb3RpZmllZCBvbiBpbnRlcmZhY2VbJWRdIiwKKwkJCQkJICBfX2Z1bmNfXywgaW50Zik7CisJCQkJcmV0dXJuIGNkZl9zdGF0dXM7CisJCQl9CisKKwkJCS8qIFRyYW5zaXRpb24gZnJvbSBlU0FQX1NUQVJUSU5HIHRvIGVTQVBfU1RBUlRFRAorCQkJICogKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpCisJCQkgKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsCisJCQkJICBfX2Z1bmNfXywgImVTQVBfREZTX0NBQ19XQUlUIiwKKwkJCQkgICJlU0FQX1NUQVJURUQiKTsKKwkJfQorCX0KKwkvKgorCSAqIEFsbCBBUHMgYXJlIGRvbmUgd2l0aCBDQUMgdGltZXIsIGFsbCBBUHMgc2hvdWxkIHN0YXJ0IGJlYWNvbmluZy4KKwkgKiBMZXRzIGFzc3VtZSBBUDEgYW5kIEFQMiBzdGFydGVkIGJlYWNvbmluZyBvbiBERlMgY2hhbm5lbCwgTm93IGxldHMKKwkgKiBzYXkgQVAxIGdvZXMgZG93biBhbmQgY29tZXMgYmFjayBvbiBzYW1lIERGUyBjaGFubmVsLiBJbiB0aGlzIGNhc2UKKwkgKiBBUDEgc2hvdWxkbid0IHN0YXJ0IENBQyB0aW1lciBhbmQgc3RhcnQgYmVhY29uIGltbWVkaWF0ZWx5IGJlYWNhdXNlCisJICogQVAyIGlzIGFscmVhZHkgYmVhY29uaW5nIG9uIHRoaXMgY2hhbm5lbC4gVGhpcyBjYXNlIHdpbGwgYmUgaGFuZGxlZAorCSAqIGJ5IGNoZWNraW5nIGFnYWluc3QgZVNBUF9ERlNfU0tJUF9DQUMgd2hpbGUgc3RhcnRpbmcgdGhlIHRpbWVyLgorCSAqLworCXBNYWMtPnNhcC5TYXBEZnNJbmZvLmNhY19zdGF0ZSA9IGVTQVBfREZTX1NLSVBfQ0FDOworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHNhcF9mc21fc3RhdGVfZGlzY29ubmVjdGVkKCkgLSB1dGlsaXR5IGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHNhcCBmc20KKyAqIEBzYXBfY3R4OiBTQVAgY29udGV4dAorICogQHNhcF9ldmVudDogU0FQIGV2ZW50IGJ1ZmZlcgorICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dAorICogQGhhbDogSEFMIGhhbmRsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBzdGF0ZSB0cmFuc2l0aW9uIGZyb20gImVTQVBfRElTQ09OTkVDVEVEIgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitzdGF0aWMgQ0RGX1NUQVRVUyBzYXBfZnNtX3N0YXRlX2Rpc2Nvbm5lY3RlZChwdFNhcENvbnRleHQgc2FwX2N0eCwKKwkJCXB0V0xBTl9TQVBFdmVudCBzYXBfZXZlbnQsIHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQl0SGFsSGFuZGxlIGhhbCkKK3sKKwl1aW50MzJfdCBtc2cgPSBzYXBfZXZlbnQtPmV2ZW50OworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKG1zZyA9PSBlU0FQX0hERF9TVEFSVF9JTkZSQV9CU1MpIHsKKwkJLyoKKwkJICogVHJhbnNpdGlvbiBmcm9tIGVTQVBfRElTQ09OTkVDVEVEIHRvIGVTQVBfQ0hfU0VMRUNUCisJCSAqIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKQorCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgibmV3IGZyb20gc3RhdGUgJXMgPT4gJXMiKSwKKwkJCSAgImVTQVBfRElTQ09OTkVDVEVEIiwgImVTQVBfQ0hfU0VMRUNUIik7CisKKwkJLyogVGhlcmUgY2FuIGJlIG9uZSBTQVAgU2Vzc2lvbiBmb3Igc29mdGFwICovCisJCWlmIChzYXBfY3R4LT5pc1NhcFNlc3Npb25PcGVuID09IGVTQVBfVFJVRSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkJICBGTCgiU01FIFNlc3Npb24gaXMgYWxyZWFkeSBvcGVuZWQiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0VYSVNUUzsKKwkJfQorCisJCXNhcF9jdHgtPnNlc3Npb25JZCA9IDB4ZmY7CisKKwkJaWYgKChzYXBfY3R4LT5jaGFubmVsID09IEFVVE9fQ0hBTk5FTF9TRUxFQ1QpICYmCisJCSAgICAoc2FwX2N0eC0+aXNTY2FuU2Vzc2lvbk9wZW4gPT0gZVNBUF9GQUxTRSkpIHsKKwkJCXVpbnQzMl90IHR5cGUsIHN1YnR5cGU7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IGNkc19nZXRfdmRldl90eXBlcygKKwkJCQkJQ0RGX1NUQV9NT0RFLCAmdHlwZSwgJnN1YnR5cGUpKSB7CisJCQkJLyogT3BlbiBTTUUgU2Vzc2lvbiBmb3Igc2NhbiAqLworCQkJCWNkZl9zdGF0dXMgPSBzbWVfb3Blbl9zZXNzaW9uKGhhbCwgTlVMTCwKKwkJCQkJICAgIHNhcF9jdHgsIHNhcF9jdHgtPnNlbGZfbWFjX2FkZHIsCisJCQkJCSAgICAmc2FwX2N0eC0+c2Vzc2lvbklkLCB0eXBlLCBzdWJ0eXBlKTsKKwkJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkgIEZMKCJFcnJvcjogY2FsbGluZyBzbWVfb3Blbl9zZXNzaW9uIikpOworCQkJCX0gZWxzZSB7CisJCQkJCXNhcF9jdHgtPmlzU2NhblNlc3Npb25PcGVuID0gZVNBUF9UUlVFOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBpbml0IGRmcyBjaGFubmVsIG5vbCAqLworCQlzYXBfaW5pdF9kZnNfY2hhbm5lbF9ub2xfbGlzdChzYXBfY3R4KTsKKworCQkvKiBTZXQgU0FQIGRldmljZSByb2xlICovCisJCXNhcF9jdHgtPnNhcHNNYWNoaW5lID0gZVNBUF9DSF9TRUxFQ1Q7CisKKwkJLyoKKwkJICogUGVyZm9ybSBzbWVfU2NhblJlcXVlc3QuIFRoaXMgc2NhbiByZXF1ZXN0IGlzIHBvc3Qgc3RhcnQgYnNzCisJCSAqIHJlcXVlc3Qgc28sIHNldCB0aGUgdGhpcmQgdG8gZmFsc2UuCisJCSAqLworCQljZGZfc3RhdHVzID0gc2FwX2dvdG9fY2hhbm5lbF9zZWwoc2FwX2N0eCwgc2FwX2V2ZW50LCBmYWxzZSk7CisKKwkJLyoKKwkJICogVHJhbnNpdGlvbiBmcm9tIGVTQVBfRElTQ09OTkVDVEVEIHRvIGVTQVBfQ0hfU0VMRUNUCisJCSAqIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKQorCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiZnJvbSBzdGF0ZSAlcyA9PiAlcyIpLAorCQkJICAiZVNBUF9ESVNDT05ORUNURUQiLCAiZVNBUF9DSF9TRUxFQ1QiKTsKKwl9IGVsc2UgaWYgKG1zZyA9PSBlU0FQX0RGU19DSEFOTkVMX0NBQ19TVEFSVCkgeworCQkvKgorCQkgKiBObyBuZWVkIG9mIHN0YXRlIGNoZWNrIGhlcmUsIGNhbGxlciBpcyBleHBlY3RlZCB0byBwZXJmb3JtCisJCSAqIHRoZSBjaGVja3MgYmVmb3JlIHNlbmRpbmcgdGhlIGV2ZW50CisJCSAqLworCQlzYXBfY3R4LT5zYXBzTWFjaGluZSA9IGVTQVBfREZTX0NBQ19XQUlUOworCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJRkwoImZyb20gc3RhdGUgZVNBUF9ESVNDT05ORUNURUQgPT4gU0FQX0RGU19DQUNfV0FJVCIpKTsKKwkJaWYgKG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLmlzX2Rmc19jYWNfdGltZXJfcnVubmluZyAhPSB0cnVlKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgICBGTCgic2FwZGZzOiBzdGFydGluZyBkZnMgY2FjIHRpbWVyIG9uIHNhcGN0eFslcF0iKSwKKwkJCSAgICBzYXBfY3R4KTsKKwkJCXNhcF9zdGFydF9kZnNfY2FjX3RpbWVyKHNhcF9jdHgpOworCQl9CisKKwkJY2RmX3N0YXR1cyA9IHNhcF9jYWNfc3RhcnRfbm90aWZ5KGhhbCk7CisJfSBlbHNlIGlmIChtc2cgPT0gZVNBUF9DSEFOTkVMX1NFTEVDVElPTl9SRVRSWSkgeworCQkvKiBTZXQgU0FQIGRldmljZSByb2xlICovCisJCXNhcF9jdHgtPnNhcHNNYWNoaW5lID0gZVNBUF9DSF9TRUxFQ1Q7CisKKwkJLyoKKwkJICogUGVyZm9ybSBzbWVfU2NhblJlcXVlc3QuIFRoaXMgc2NhbiByZXF1ZXN0IGlzIHBvc3Qgc3RhcnQgYnNzCisJCSAqIHJlcXVlc3Qgc28sIHNldCB0aGUgdGhpcmQgdG8gZmFsc2UuCisJCSAqLworCQljZGZfc3RhdHVzID0gc2FwX2dvdG9fY2hhbm5lbF9zZWwoc2FwX2N0eCwgc2FwX2V2ZW50LCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJpbiBzdGF0ZSAlcywgZXZlbnQgbXNnICVkIiksCisJCQkgICJlU0FQX0RJU0NPTk5FQ1RFRCIsIG1zZyk7CisJfQorCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogc2FwX2ZzbV9zdGF0ZV9jaF9zZWxlY3QoKSAtIHV0aWxpdHkgZnVuY3Rpb24gY2FsbGVkIGZyb20gc2FwIGZzbQorICogQHNhcF9jdHg6IFNBUCBjb250ZXh0CisgKiBAc2FwX2V2ZW50OiBTQVAgZXZlbnQgYnVmZmVyCisgKiBAbWFjX2N0eDogZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAaGFsOiBIQUwgaGFuZGxlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHN0YXRlIHRyYW5zaXRpb24gZnJvbSAiZVNBUF9DSF9TRUxFQ1QiCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHNhcF9mc21fc3RhdGVfY2hfc2VsZWN0KHB0U2FwQ29udGV4dCBzYXBfY3R4LAorCQkJcHRXTEFOX1NBUEV2ZW50IHNhcF9ldmVudCwgdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCXRIYWxIYW5kbGUgaGFsKQoreworCXVpbnQzMl90IG1zZyA9IHNhcF9ldmVudC0+ZXZlbnQ7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdWludDMyX3QgY2Jtb2RlOworCWJvb2wgYl9sZWFrX2NoYW4gPSBmYWxzZTsKKyNpZmRlZiBXTEFOX0VOQUJMRV9DSE5MX01BVFJJWF9SRVNUUklDVElPTgorCXVpbnQ4X3QgdGVtcF9jaGFuOworCXRTYXBEZnNOb2xJbmZvICpwX25vbDsKKyNlbmRpZgorCisJaWYgKHNhcF9jdHgtPmlzU2NhblNlc3Npb25PcGVuID09IGVTQVBfVFJVRSkgeworCQkvKiBzY2FuIGNvbXBsZXRlZCwgc28gY2xvc2UgdGhlIHNlc3Npb24gKi8KKwkJY2RmX3N0YXR1cyA9IHNtZV9jbG9zZV9zZXNzaW9uKGhhbCwgc2FwX2N0eC0+c2Vzc2lvbklkLAorCQkJCU5VTEwsIE5VTEwpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgiQ2xvc2VTZXNzaW9uIGVycm9yIGV2ZW50IG1zZyAlZCIpLCBtc2cpOworCQllbHNlCisJCQlzYXBfY3R4LT5pc1NjYW5TZXNzaW9uT3BlbiA9IGVTQVBfRkFMU0U7CisJCXNhcF9jdHgtPnNlc3Npb25JZCA9IDB4ZmY7CisJfQorCisJaWYgKG1zZyA9PSBlU0FQX01BQ19TQ0FOX0NPTVBMRVRFKSB7CisJCS8qIGdldCB0aGUgYm9uZGluZyBtb2RlICovCisJCWlmIChzYXBfY3R4LT5jaGFubmVsIDw9IDE0KQorCQkJY2Jtb2RlID0gc21lX2dldF9jYl9waHlfc3RhdGVfZnJvbV9jYl9pbmlfdmFsdWUoCisJCQkJCXNtZV9nZXRfY2hhbm5lbF9ib25kaW5nX21vZGUyNF9nKGhhbCkpOworCQllbHNlCisJCQljYm1vZGUgPSBzbWVfZ2V0X2NiX3BoeV9zdGF0ZV9mcm9tX2NiX2luaV92YWx1ZSgKKwkJCQkJc21lX2dldF9jaGFubmVsX2JvbmRpbmdfbW9kZTVfZyhoYWwpKTsKKworI2lmZGVmIFdMQU5fRU5BQkxFX0NITkxfTUFUUklYX1JFU1RSSUNUSU9OCisJCXRlbXBfY2hhbiA9IHNhcF9jdHgtPmNoYW5uZWw7CisJCXBfbm9sID0gbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uc2FwRGZzQ2hhbm5lbE5vbExpc3Q7CisKKwkJc2FwX21hcmtfY2hhbm5lbHNfbGVha2luZ19pbnRvX25vbChzYXBfY3R4LAorCQkJY2Jtb2RlLCBwX25vbCwgMSwgJnRlbXBfY2hhbik7CisKKwkJLyoKKwkJICogaWYgc2VsZWxjdGVkIGNoYW5uZWwgaGFzIGxlYWthZ2UgdG8gY2hhbm5lbHMKKwkJICogaW4gTk9MLCB0aGUgdGVtcF9jaGFuIHdpbGwgYmUgcmVzZXQKKwkJICovCisJCWJfbGVha19jaGFuID0gKHRlbXBfY2hhbiAhPSBzYXBfY3R4LT5jaGFubmVsKTsKKyNlbmRpZgorCQkvKgorCQkgKiBjaGVjayBpZiBjaGFubmVsIGlzIGluIERGU19OT0wgb3IgaWYgdGhlIGNoYW5uZWwKKwkJICogaGFzIGxlYWthZ2UgdG8gdGhlIGNoYW5uZWxzIGluIE5PTAorCQkgKi8KKwkJaWYgKHNhcF9kZnNfaXNfY2hhbm5lbF9pbl9ub2xfbGlzdChzYXBfY3R4LCBzYXBfY3R4LT5jaGFubmVsLAorCQkJY2Jtb2RlKSB8fCBiX2xlYWtfY2hhbikgeworCQkJdWludDhfdCBjaDsKKworCQkJLyogZmluZCBhIG5ldyBhdmFpbGFibGUgY2hhbm5lbCAqLworCQkJY2ggPSBzYXBfcmFuZG9tX2NoYW5uZWxfc2VsKHNhcF9jdHgpOworCQkJaWYgKGNoID09IDApIHsKKwkJCQkvKiBObyBhdmFpbGFibGUgY2hhbm5lbCBmb3VuZCAqLworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQlGTCgiTm8gYXZhaWxhYmxlIGNoYW5uZWwgZm91bmQhISEiKSk7CisJCQkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgTlVMTCwKKwkJCQkJZVNBUF9ERlNfTk9fQVZBSUxBQkxFX0NIQU5ORUwsCisJCQkJCSh2b2lkICopZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJCX0KKworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgRkwoImNoYW5uZWwgJWQgaXMgaW4gTk9MLCBTdGFydEJzcyBvbiBuZXcgY2hhbm5lbCAlZCIpLAorCQkJCSAgc2FwX2N0eC0+Y2hhbm5lbCwgY2gpOworCisJCQlzYXBfY3R4LT5jaGFubmVsID0gY2g7CisJCQlzbWVfc2V0X2NoX3BhcmFtcyhoYWwsIHNhcF9jdHgtPmNzcl9yb2FtUHJvZmlsZS5waHlNb2RlLAorCQkJCXNhcF9jdHgtPmNoYW5uZWwsIHNhcF9jdHgtPnNlY29uZGFyeV9jaCwKKwkJCQkmc2FwX2N0eC0+Y2hfcGFyYW1zKTsKKwkJfQorCQlpZiAoc2FwX2N0eC0+Y2hhbm5lbCA+IDE0ICYmCisJCSAgICAoc2FwX2N0eC0+Y3NyX3JvYW1Qcm9maWxlLnBoeU1vZGUgPT0gZUNTUl9ET1QxMV9NT0RFXzExZyB8fAorCQkgICAgIHNhcF9jdHgtPmNzcl9yb2FtUHJvZmlsZS5waHlNb2RlID09CisJCQkJCQllQ1NSX0RPVDExX01PREVfMTFnX09OTFkpKQorCQkJc2FwX2N0eC0+Y3NyX3JvYW1Qcm9maWxlLnBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFhOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQkvKgorCQkgKiB3aGVuIEFQMiBpcyBzdGFydGVkIHdoaWxlIEFQMSBpcyBwZXJmb3JtaW5nIEFDUywgd2UgbWF5IG5vdAorCQkgKiBoYXZlIHRoZSBBUDEgY2hhbm5lbCB5ZXQuU28gaGVyZSBhZnRlciB0aGUgY29tcGxldGlvbiBvZiBBUDIKKwkJICogQUNTIGNoZWNrIGlmIEFQMSBBQ1MgcmVzdWx0aW5nIGNoYW5uZWwgaXMgREZTIGFuZCBpZiB5ZXMKKwkJICogb3ZlcnJpZGUgQVAyIEFDUyBzY2FuIHJlc3VsdCB3aXRoIEFQMSBERlMgY2hhbm5lbAorCQkgKi8KKwkJaWYgKGNkc19jb25jdXJyZW50X2JlYWNvbmluZ19zZXNzaW9uc19ydW5uaW5nKCkpIHsKKwkJCXVpbnQxNl90IGNvbl9jaDsKKworCQkJY29uX2NoID0gc21lX2dldF9jb25jdXJyZW50X29wZXJhdGlvbl9jaGFubmVsKGhhbCk7CisJCQlpZiAoY29uX2NoICYmIENEU19JU19ERlNfQ0goY29uX2NoKSkKKwkJCQlzYXBfY3R4LT5jaGFubmVsID0gY29uX2NoOworCQl9CisjZW5kaWYKKwkJLyoKKwkJICogVHJhbnNpdGlvbiBmcm9tIGVTQVBfQ0hfU0VMRUNUIHRvIGVTQVBfU1RBUlRJTkcKKwkJICogKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJmcm9tIHN0YXRlICVzID0+ICVzIiksCisJCQkgICJlU0FQX0NIX1NFTEVDVCIsICJlU0FQX1NUQVJUSU5HIik7CisJCS8qIENoYW5uZWwgc2VsZWN0ZWQuIE5vdyBjYW4gc2FwX2dvdG9fc3RhcnRpbmcgKi8KKwkJc2FwX2N0eC0+c2Fwc01hY2hpbmUgPSBlU0FQX1NUQVJUSU5HOworCQkvKiBTcGVjaWZ5IHRoZSBjaGFubmVsICovCisJCXNhcF9jdHgtPmNzcl9yb2FtUHJvZmlsZS5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0KKwkJCQkJCTE7CisJCXNhcF9jdHgtPmNzcl9yb2FtUHJvZmlsZS5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9CisJCQkmc2FwX2N0eC0+Y3NyX3JvYW1Qcm9maWxlLm9wZXJhdGlvbkNoYW5uZWw7CisJCXNhcF9jdHgtPmNzcl9yb2FtUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsID0KKwkJCSh1aW50OF90KSBzYXBfY3R4LT5jaGFubmVsOworCQlzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUuY2hfcGFyYW1zLmNoX3dpZHRoID0KKwkJCQkJc2FwX2N0eC0+Y2hfcGFyYW1zLmNoX3dpZHRoOworCQlzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUuY2hfcGFyYW1zLmNlbnRlcl9mcmVxX3NlZzAgPQorCQkJCXNhcF9jdHgtPmNoX3BhcmFtcy5jZW50ZXJfZnJlcV9zZWcwOworCQlzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUuY2hfcGFyYW1zLmNlbnRlcl9mcmVxX3NlZzEgPQorCQkJCXNhcF9jdHgtPmNoX3BhcmFtcy5jZW50ZXJfZnJlcV9zZWcxOworCQlzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUuY2hfcGFyYW1zLnNlY19jaF9vZmZzZXQgPQorCQkJCXNhcF9jdHgtPmNoX3BhcmFtcy5zZWNfY2hfb2Zmc2V0OworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgICBGTCgibm90aWZ5IGhvc3RhcGQgYWJvdXQgY2hhbm5lbCBzZWxlY3Rpb246ICVkIiksCisJCSAgICBzYXBfY3R4LT5jaGFubmVsKTsKKwkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgTlVMTCwKKwkJCQkJZVNBUF9DSEFOTkVMX0NIQU5HRV9FVkVOVCwKKwkJCQkJKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCWNkZl9zdGF0dXMgPSBzYXBfZ290b19zdGFydGluZyhzYXBfY3R4LCBzYXBfZXZlbnQsCisJCQkJCSAgZUNTUl9CU1NfVFlQRV9JTkZSQV9BUCk7CisJfSBlbHNlIGlmIChtc2cgPT0gZVNBUF9DSEFOTkVMX1NFTEVDVElPTl9GQUlMRUQpIHsKKwkJc2FwX2N0eC0+c2Fwc01hY2hpbmUgPSBlU0FQX0RJU0NPTk5FQ1RFRDsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCUZMKCJDYW5ub3Qgc3RhcnQgQlNTLCBBQ1MgRmFpbCIpKTsKKwl9IGVsc2UgaWYgKG1zZyA9PSBlU0FQX0hERF9TVE9QX0lORlJBX0JTUykgeworCQlzYXBfY3R4LT5zYXBzTWFjaGluZSA9IGVTQVBfRElTQ09OTkVDVEVEOworCQlzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBOVUxMLCBlU0FQX1NUQVJUX0JTU19FVkVOVCwKKwkJCQkJKHZvaWQgKillU0FQX1NUQVRVU19GQUlMVVJFKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSIlczogQlNTIHN0b3BwZWQgd2hlbiBDaCBzZWxlY3QgaW4gUHJvZ3Jlc3MiLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJpbiBzdGF0ZSAlcywgaW52YWxpZCBldmVudCBtc2cgJWQiKSwKKwkJCSAgImVTQVBfQ0hfU0VMRUNUIiwgbXNnKTsKKwl9CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiBzYXBfZnNtX3N0YXRlX2Rmc19jYWNfd2FpdCgpIC0gdXRpbGl0eSBmdW5jdGlvbiBjYWxsZWQgZnJvbSBzYXAgZnNtCisgKiBAc2FwX2N0eDogU0FQIGNvbnRleHQKKyAqIEBzYXBfZXZlbnQ6IFNBUCBldmVudCBidWZmZXIKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBoYWw6IEhBTCBoYW5kbGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3Igc3RhdGUgdHJhbnNpdGlvbiBmcm9tICJlU0FQX0RGU19DQUNfV0FJVCIKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworc3RhdGljIENERl9TVEFUVVMgc2FwX2ZzbV9zdGF0ZV9kZnNfY2FjX3dhaXQocHRTYXBDb250ZXh0IHNhcF9jdHgsCisJCQlwdFdMQU5fU0FQRXZlbnQgc2FwX2V2ZW50LCB0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJdEhhbEhhbmRsZSBoYWwpCit7CisJdWludDMyX3QgbXNnID0gc2FwX2V2ZW50LT5ldmVudDsKKwl0Q3NyUm9hbUluZm8gKnJvYW1faW5mbyA9ICh0Q3NyUm9hbUluZm8gKikgKHNhcF9ldmVudC0+cGFyYW1zKTsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWlmIChtc2cgPT0gZVNBUF9ERlNfQ0hBTk5FTF9DQUNfU1RBUlQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiZnJvbSBzdGF0ZSAlcyA9PiAlcyIpLAorCQkJICAiZVNBUF9DSF9TRUxFQ1QiLCAiZVNBUF9ERlNfQ0FDX1dBSVQiKTsKKwkJaWYgKG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLmlzX2Rmc19jYWNfdGltZXJfcnVubmluZyAhPSB0cnVlKQorCQkJc2FwX3N0YXJ0X2Rmc19jYWNfdGltZXIoc2FwX2N0eCk7CisJCWNkZl9zdGF0dXMgPSBzYXBfY2FjX3N0YXJ0X25vdGlmeShoYWwpOworCX0gZWxzZSBpZiAobXNnID09IGVTQVBfREZTX0NIQU5ORUxfQ0FDX1JBREFSX0ZPVU5EKSB7CisJCXVpbnQ4X3QgaW50ZjsKKwkJLyoKKwkJICogUmFkYXIgZm91bmQgd2hpbGUgcGVyZm9ybWluZyBjaGFubmVsIGF2YWlsYWJpbGl0eQorCQkgKiBjaGVjaywgbmVlZCB0byBzd2l0Y2ggdGhlIGNoYW5uZWwgYWdhaW4KKwkJICovCisJCWVDc3JQaHlNb2RlIHBoeW1vZGUgPSBzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUucGh5TW9kZTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIkVOVEVSVFJFRCBDQUMgV0FJVCBTVEFURS0tPmVTQVBfRElTQ09OTkVDVElOR1xuIik7CisJCWlmIChtYWNfY3R4LT5zYXAuU2FwRGZzSW5mby50YXJnZXRfY2hhbm5lbCkgeworCQkJc21lX3NldF9jaF9wYXJhbXMoaGFsLCBwaHltb2RlLAorCQkJCSAgIG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLnRhcmdldF9jaGFubmVsLCAwLAorCQkJCSAgICZzYXBfY3R4LT5jaF9wYXJhbXMpOworCQl9CisKKwkJZm9yIChpbnRmID0gMDsgaW50ZiA8IFNBUF9NQVhfTlVNX1NFU1NJT047IGludGYrKykgeworCQkJcHRTYXBDb250ZXh0IHRfc2FwX2N0eDsKKwkJCWlmICgoKENERl9TQVBfTU9ERSA9PQorCQkJCSBtYWNfY3R4LT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5zYXBQZXJzb25hKSB8fAorCQkJICAgICAoQ0RGX1AyUF9HT19NT0RFID09CisJCQkJbWFjX2N0eC0+c2FwLnNhcEN0eExpc3RbaW50Zl0uc2FwUGVyc29uYSkpICYmCisJCQkgICAgbWFjX2N0eC0+c2FwLnNhcEN0eExpc3RbaW50Zl0ucFNhcENvbnRleHQgIT0gTlVMTCkgeworCQkJCXRfc2FwX2N0eCA9CisJCQkJICAgIG1hY19jdHgtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnBTYXBDb250ZXh0OworCQkJCS8qIFNBUCB0byBiZSBtb3ZlZCB0byBESVNDT05ORUNUSU5HIHN0YXRlICovCisJCQkJc2FwX2N0eC0+c2Fwc01hY2hpbmUgPSBlU0FQX0RJU0NPTk5FQ1RJTkc7CisJCQkJLyoKKwkJCQkgKiBlU0FQX0RGU19DSEFOTkVMX0NBQ19SQURBUl9GT1VORDoKKwkJCQkgKiBBIFJhZGFyIGlzIGZvdW5kIG9uIGN1cnJlbnQgREZTIENoYW5uZWwKKwkJCQkgKiB3aGlsZSBpbiBDQUMgV0FJVCBwZXJpb2QgU28sIGRvIGEgY2hhbm5lbAorCQkJCSAqIHN3aXRjaCB0byByYW5kb21seSBzZWxlY3RlZCAgdGFyZ2V0IGNoYW5uZWwuCisJCQkJICogU2VuZCB0aGUgQ2hhbm5lbCBjaGFuZ2UgbWVzc2FnZSB0byBTTUUvUEUuCisJCQkJICogc2FwX3JhZGFyX2ZvdW5kX3N0YXR1cyBpcyBzZXQgdG8gMQorCQkJCSAqLworCQkJCXNhcF9zaWduYWxfaGRkX2V2ZW50KHRfc2FwX2N0eCwgTlVMTCwKKwkJCQkJZVNBUF9ERlNfUkFEQVJfREVURUNULAorCQkJCQkodm9pZCAqKWVTQVBfU1RBVFVTX1NVQ0NFU1MpOworCisJCQkJd2xhbnNhcF9jaGFubmVsX2NoYW5nZV9yZXF1ZXN0KAorCQkJCQkodm9pZCAqKXRfc2FwX2N0eCwKKwkJCQkJbWFjX2N0eC0+c2FwLlNhcERmc0luZm8udGFyZ2V0X2NoYW5uZWwpOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChtc2cgPT0gZVNBUF9ERlNfQ0hBTk5FTF9DQUNfRU5EKSB7CisJCWNkZl9zdGF0dXMgPSBzYXBfY2FjX2VuZF9ub3RpZnkoaGFsLCByb2FtX2luZm8pOworCX0gZWxzZSBpZiAobXNnID09IGVTQVBfSEREX1NUT1BfSU5GUkFfQlNTKSB7CisJCS8qIFRyYW5zaXRpb24gZnJvbSBlU0FQX0RGU19DQUNfV0FJVCB0byBlU0FQX0RJU0NPTk5FQ1RJTkcgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiZnJvbSBzdGF0ZSAlcyA9PiAlcyIpLAorCQkJICAiZVNBUF9ERlNfQ0FDX1dBSVQiLCAiZVNBUF9ESVNDT05ORUNUSU5HIik7CisKKwkJLyoKKwkJICogU3RvcCB0aGUgQ0FDIHRpbWVyIG9ubHkgaW4gZm9sbG93aW5nIGNvbmRpdGlvbnMKKwkJICogc2luZ2xlIEFQOiBpZiB0aGVyZSBpcyBhIHNpbmdsZSBBUCB0aGVuIHN0b3AgdGhlIHRpbWVyCisJCSAqIG11bGl0cGxlIEFQczogaW5jYXNlIG9mIG11bHRpcGxlIEFQcywgbWFrZSBzdXJlIHRoYXQKKwkJICogICAgICAgICAgICAgICBhbGwgQVBzIGFyZSBkb3duLgorCQkgKi8KKwkJaWYgKE5VTEwgPT0gc2FwX2ZpbmRfdmFsaWRfY29uY3VycmVudF9zZXNzaW9uKGhhbCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCQkgIEZMKCJzYXBkZnM6IG5vIHNlc3Npb25zIGFyZSB2YWxpZCwgc3RvcHBpbmcgdGltZXIiKSk7CisJCQlzYXBfc3RvcF9kZnNfY2FjX3RpbWVyKHNhcF9jdHgpOworCQl9CisKKwkJc2FwX2N0eC0+c2Fwc01hY2hpbmUgPSBlU0FQX0RJU0NPTk5FQ1RJTkc7CisJCWNkZl9zdGF0dXMgPSBzYXBfZ290b19kaXNjb25uZWN0aW5nKHNhcF9jdHgpOworCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiaW4gc3RhdGUgJXMsIGludmFsaWQgZXZlbnQgbXNnICVkIiksCisJCQkgICJlU0FQX0RGU19DQUNfV0FJVCIsIG1zZyk7CisJfQorCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogc2FwX2ZzbV9zdGF0ZV9zdGFydGluZygpIC0gdXRpbGl0eSBmdW5jdGlvbiBjYWxsZWQgZnJvbSBzYXAgZnNtCisgKiBAc2FwX2N0eDogU0FQIGNvbnRleHQKKyAqIEBzYXBfZXZlbnQ6IFNBUCBldmVudCBidWZmZXIKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBoYWw6IEhBTCBoYW5kbGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3Igc3RhdGUgdHJhbnNpdGlvbiBmcm9tICJlU0FQX1NUQVJUSU5HIgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitzdGF0aWMgQ0RGX1NUQVRVUyBzYXBfZnNtX3N0YXRlX3N0YXJ0aW5nKHB0U2FwQ29udGV4dCBzYXBfY3R4LAorCQkJcHRXTEFOX1NBUEV2ZW50IHNhcF9ldmVudCwgdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCXRIYWxIYW5kbGUgaGFsKQoreworCXVpbnQzMl90IG1zZyA9IHNhcF9ldmVudC0+ZXZlbnQ7CisJdENzclJvYW1JbmZvICpyb2FtX2luZm8gPSAodENzclJvYW1JbmZvICopIChzYXBfZXZlbnQtPnBhcmFtcyk7CisJdFNhcERmc0luZm8gKnNhcF9kZnNfaW5mbzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWlmIChtc2cgPT0gZVNBUF9NQUNfU1RBUlRfQlNTX1NVQ0NFU1MpIHsKKwkJLyoKKwkJICogVHJhbnNpdGlvbiBmcm9tIGVTQVBfU1RBUlRJTkcgdG8gZVNBUF9TVEFSVEVECisJCSAqIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKQorCQkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICBGTCgiZnJvbSBzdGF0ZSBjaGFubmVsID0gJWQgJXMgPT4gJXMiKSwKKwkJCSAgc2FwX2N0eC0+Y2hhbm5lbCwgImVTQVBfU1RBUlRJTkciLCAiZVNBUF9TVEFSVEVEIik7CisJCXNhcF9jdHgtPnNhcHNNYWNoaW5lID0gZVNBUF9TVEFSVEVEOworCisJCS8qIEFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCByb2FtX2luZm8sCisJCQkJZVNBUF9TVEFSVF9CU1NfRVZFTlQsCisJCQkJKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisKKwkJLyoKKwkJICogVGhlIHVwcGVyIGxheWVycyBoYXZlIGJlZW4gaW5mb3JtZWQgdGhhdCBBUCBpcyB1cCBhbmQKKwkJICogcnVubmluZywgaG93ZXZlciwgdGhlIEFQIGlzIHN0aWxsIG5vdCBiZWFjb25pbmcsIHVudGlsCisJCSAqIENBQyBpcyBkb25lIGlmIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBpcyBERlMKKwkJICovCisJCWlmIChDSEFOTkVMX1NUQVRFX0RGUyA9PQorCQkJY2RzX2dldF9jaGFubmVsX3N0YXRlKHNhcF9jdHgtPmNoYW5uZWwpKSB7CisJCQlzYXBfZGZzX2luZm8gPSAmbWFjX2N0eC0+c2FwLlNhcERmc0luZm87CisJCQlpZiAoKGZhbHNlID09IHNhcF9kZnNfaW5mby0+aWdub3JlX2NhYykgJiYKKwkJCSAgICAoZVNBUF9ERlNfRE9fTk9UX1NLSVBfQ0FDID09CisJCQkJCXNhcF9kZnNfaW5mby0+Y2FjX3N0YXRlKSkgeworCQkJCS8qIE1vdmUgdGhlIGRldmljZSBpbiBDQUNfV0FJVF9TVEFURSAqLworCQkJCXNhcF9jdHgtPnNhcHNNYWNoaW5lID0gZVNBUF9ERlNfQ0FDX1dBSVQ7CisKKwkJCQkvKgorCQkJCSAqIE5lZWQgdG8gc3RvcCB0aGUgT1MgdHJhbnNtaXQgcXVldWVzLAorCQkJCSAqIHNvIHRoYXQgbm8gdHJhZmZpYyBjYW4gZmxvdyBkb3duIHRoZSBzdGFjaworCQkJCSAqLworCisJCQkJLyogU3RhcnQgQ0FDIHdhaXQgdGltZXIgKi8KKwkJCQlpZiAoc2FwX2Rmc19pbmZvLT5pc19kZnNfY2FjX3RpbWVyX3J1bm5pbmcgIT0KKwkJCQkJCQkJCXRydWUpCisJCQkJCXNhcF9zdGFydF9kZnNfY2FjX3RpbWVyKHNhcF9jdHgpOworCQkJCWNkZl9zdGF0dXMgPSBzYXBfY2FjX3N0YXJ0X25vdGlmeShoYWwpOworCisJCQl9IGVsc2UgeworCQkJCXdsYW5zYXBfc3RhcnRfYmVhY29uX3JlcShzYXBfY3R4KTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAobXNnID09IGVTQVBfTUFDX1NUQVJUX0ZBSUxTKSB7CisJCS8qCisJCSAqIFRyYW5zaXRpb24gZnJvbSBTVEFSVElORyB0byBESVNDT05ORUNURUQKKwkJICogKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImZyb20gc3RhdGUgJXMgPT4gJXMiKSwKKwkJCSAgImVTQVBfU1RBUlRJTkciLCAiZVNBUF9ESVNDT05ORUNURUQiKTsKKworCQkvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBOVUxMLAorCQkJCWVTQVBfU1RBUlRfQlNTX0VWRU5ULAorCQkJCSh2b2lkICopIGVTQVBfU1RBVFVTX0ZBSUxVUkUpOworCQljZGZfc3RhdHVzID0gc2FwX2dvdG9fZGlzY29ubmVjdGVkKHNhcF9jdHgpOworCQkvKiBBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisJCXNhcF9jdHgtPnNhcHNNYWNoaW5lID0gZVNBUF9ESVNDT05ORUNURUQ7CisJfSBlbHNlIGlmIChtc2cgPT0gZVNBUF9IRERfU1RPUF9JTkZSQV9CU1MpIHsKKwkJLyoKKwkJICogVHJhbnNpdGlvbiBmcm9tIGVTQVBfU1RBUlRJTkcgdG8gZVNBUF9ESVNDT05ORUNURUQKKwkJICogKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJmcm9tIHN0YXRlICVzID0+ICVzIiksCisJCQkgICJlU0FQX1NUQVJUSU5HIiwgImVTQVBfRElTQ09OTkVDVEVEIik7CisKKwkJLyogQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworCQlzYXBfY3R4LT5zYXBzTWFjaGluZSA9IGVTQVBfRElTQ09OTkVDVEVEOworCQljZGZfc3RhdHVzID0gc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2N0eCwgTlVMTCwKKwkJCQllU0FQX1NUQVJUX0JTU19FVkVOVCwKKwkJCQkodm9pZCAqKSBlU0FQX1NUQVRVU19GQUlMVVJFKTsKKwkJY2RmX3N0YXR1cyA9IHNhcF9nb3RvX2Rpc2Nvbm5lY3RlZChzYXBfY3R4KTsKKwkJLyogQ2xvc2UgdGhlIFNNRSBzZXNzaW9uICovCisKKwkJaWYgKGVTQVBfVFJVRSA9PSBzYXBfY3R4LT5pc1NhcFNlc3Npb25PcGVuKSB7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHNhcF9jbG9zZV9zZXNzaW9uKGhhbCwKKwkJCQkJCXNhcF9jdHgsIE5VTEwsIGZhbHNlKSkKKwkJCQlzYXBfY3R4LT5pc1NhcFNlc3Npb25PcGVuID0gZVNBUF9GQUxTRTsKKwkJfQorCX0gZWxzZSBpZiAobXNnID09IGVTQVBfT1BFUkFUSU5HX0NIQU5ORUxfQ0hBTkdFRCkgeworCQkvKiBUaGUgb3BlcmF0aW5nIGNoYW5uZWwgaGFzIGNoYW5nZWQsIHVwZGF0ZSBob3N0YXBkICovCisJCXNhcF9jdHgtPmNoYW5uZWwgPQorCQkJKHVpbnQ4X3QpIG1hY19jdHgtPnNhcC5TYXBEZnNJbmZvLnRhcmdldF9jaGFubmVsOworCisJCXNhcF9jdHgtPnNhcHNNYWNoaW5lID0gZVNBUF9TVEFSVEVEOworCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoImZyb20gc3RhdGUgJXMgPT4gJXMiKSwKKwkJCSAgImVTQVBfU1RBUlRJTkciLCAiZVNBUF9TVEFSVEVEIik7CisKKwkJLyogSW5kaWNhdGUgY2hhbmdlIGluIHRoZSBzdGF0ZSB0byB1cHBlciBsYXllcnMgKi8KKwkJY2RmX3N0YXR1cyA9IHNhcF9zaWduYWxfaGRkX2V2ZW50KHNhcF9jdHgsIHJvYW1faW5mbywKKwkJCQkgIGVTQVBfU1RBUlRfQlNTX0VWRU5ULAorCQkJCSAgKHZvaWQgKillU0FQX1NUQVRVU19TVUNDRVNTKTsKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImluIHN0YXRlICVzLCBpbnZhbGlkIGV2ZW50IG1zZyAlZCIpLAorCQkJICAiZVNBUF9TVEFSVElORyIsIG1zZyk7CisJfQorCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogc2FwX2ZzbV9zdGF0ZV9zdGFydGVkKCkgLSB1dGlsaXR5IGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHNhcCBmc20KKyAqIEBzYXBfY3R4OiBTQVAgY29udGV4dAorICogQHNhcF9ldmVudDogU0FQIGV2ZW50IGJ1ZmZlcgorICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBzdGF0ZSB0cmFuc2l0aW9uIGZyb20gImVTQVBfU1RBUlRFRCIKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworc3RhdGljIENERl9TVEFUVVMgc2FwX2ZzbV9zdGF0ZV9zdGFydGVkKHB0U2FwQ29udGV4dCBzYXBfY3R4LAorCQkJcHRXTEFOX1NBUEV2ZW50IHNhcF9ldmVudCwgdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCkKK3sKKwl1aW50MzJfdCBtc2cgPSBzYXBfZXZlbnQtPmV2ZW50OworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKG1zZyA9PSBlU0FQX0hERF9TVE9QX0lORlJBX0JTUykgeworCQkvKgorCQkgKiBUcmFuc2l0aW9uIGZyb20gZVNBUF9TVEFSVEVEIHRvIGVTQVBfRElTQ09OTkVDVElORworCQkgKiAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoImZyb20gc3RhdGUgJXMgPT4gJXMiKSwKKwkJCSAgImVTQVBfU1RBUlRFRCIsICJlU0FQX0RJU0NPTk5FQ1RJTkciKTsKKwkJc2FwX2N0eC0+c2Fwc01hY2hpbmUgPSBlU0FQX0RJU0NPTk5FQ1RJTkc7CisJCWNkZl9zdGF0dXMgPSBzYXBfZ290b19kaXNjb25uZWN0aW5nKHNhcF9jdHgpOworCX0gZWxzZSBpZiAoZVNBUF9ERlNfQ0hOTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX1NUQVJUID09IG1zZykgeworCQl1aW50OF90IGludGY7CisJCS8qCisJCSAqIFJhZGFyIGlzIHNlZW4gb24gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwKKwkJICogc2VuZCBDU0EgSUUgZm9yIGFsbCBhc3NvY2lhdGVkIHN0YXRpb25zCisJCSAqIFJlcXVlc3QgZm9yIENTQSBJRSB0cmFuc21pc3Npb24KKwkJICovCisJCWZvciAoaW50ZiA9IDA7IGludGYgPCBTQVBfTUFYX05VTV9TRVNTSU9OOyBpbnRmKyspIHsKKwkJCXB0U2FwQ29udGV4dCB0ZW1wX3NhcF9jdHg7CisJCQlpZiAoKChDREZfU0FQX01PREUgPT0KKwkJCQltYWNfY3R4LT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5zYXBQZXJzb25hKSB8fAorCQkJICAgIChDREZfUDJQX0dPX01PREUgPT0KKwkJCQltYWNfY3R4LT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5zYXBQZXJzb25hKSkgJiYKKwkJCSAgICBtYWNfY3R4LT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5wU2FwQ29udGV4dCAhPSBOVUxMKSB7CisJCQkJdGVtcF9zYXBfY3R4ID0KKwkJCQkgICAgbWFjX2N0eC0+c2FwLnNhcEN0eExpc3RbaW50Zl0ucFNhcENvbnRleHQ7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCQkJICBGTCgic2FwZGZzOiBTZW5kaW5nIENTQUlFIGZvciBzYXBjdHhbJXBdIiksCisJCQkJCSAgdGVtcF9zYXBfY3R4KTsKKworCQkJCWNkZl9zdGF0dXMgPSB3bGFuc2FwX2Rmc19zZW5kX2NzYV9pZV9yZXF1ZXN0KAorCQkJCQkJKHZvaWQgKikgdGVtcF9zYXBfY3R4KTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiaW4gc3RhdGUgJXMsIGludmFsaWQgZXZlbnQgbXNnICVkIiksCisJCQkgICJlU0FQX1NUQVJURUQiLCBtc2cpOworCX0KKworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHNhcF9mc21fc3RhdGVfZGlzY29ubmVjdGluZygpIC0gdXRpbGl0eSBmdW5jdGlvbiBjYWxsZWQgZnJvbSBzYXAgZnNtCisgKiBAc2FwX2N0eDogU0FQIGNvbnRleHQKKyAqIEBzYXBfZXZlbnQ6IFNBUCBldmVudCBidWZmZXIKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3Igc3RhdGUgdHJhbnNpdGlvbiBmcm9tICJlU0FQX0RJU0NPTk5FQ1RJTkciCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHNhcF9mc21fc3RhdGVfZGlzY29ubmVjdGluZyhwdFNhcENvbnRleHQgc2FwX2N0eCwKKwkJCXB0V0xBTl9TQVBFdmVudCBzYXBfZXZlbnQsIHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQl0SGFsSGFuZGxlIGhhbCkKK3sKKwl1aW50MzJfdCBtc2cgPSBzYXBfZXZlbnQtPmV2ZW50OworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKG1zZyA9PSBlU0FQX01BQ19SRUFEWV9GT1JfQ09OTkVDVElPTlMpIHsKKwkJLyoKKwkJICogVHJhbnNpdGlvbiBmcm9tIGVTQVBfRElTQ09OTkVDVElORyB0byBlU0FQX0RJU0NPTk5FQ1RFRAorCQkgKiAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykKKwkJICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoImZyb20gc3RhdGUgJXMgPT4gJXMiKSwKKwkJCSAgImVTQVBfRElTQ09OTkVDVElORyIsICJlU0FQX0RJU0NPTk5FQ1RFRCIpOworCQlzYXBfY3R4LT5zYXBzTWFjaGluZSA9IGVTQVBfRElTQ09OTkVDVEVEOworCisJCS8qIENsb3NlIHRoZSBTTUUgc2Vzc2lvbiAqLworCQlpZiAoZVNBUF9UUlVFID09IHNhcF9jdHgtPmlzU2FwU2Vzc2lvbk9wZW4pIHsKKwkJCXNhcF9jdHgtPmlzU2FwU2Vzc2lvbk9wZW4gPSBlU0FQX0ZBTFNFOworCQkJY2RmX3N0YXR1cyA9IHNhcF9jbG9zZV9zZXNzaW9uKGhhbCwgc2FwX2N0eCwKKwkJCQkJc2FwX3JvYW1fc2Vzc2lvbl9jbG9zZV9jYWxsYmFjaywgdHJ1ZSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJCWNkZl9zdGF0dXMgPSBzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBfY3R4LCBOVUxMLAorCQkJCQkJZVNBUF9TVE9QX0JTU19FVkVOVCwKKwkJCQkJCSh2b2lkICopZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKG1zZyA9PSBlV05JX1NNRV9DSEFOTkVMX0NIQU5HRV9SRVEpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkgIEZMKCJzYXBkZnM6IFNlbmQgY2hhbm5lbCBjaGFuZ2UgcmVxdWVzdCBvbiBzYXBjdHhbJXBdIiksCisJCQkgIHNhcF9jdHgpOworCQkvKgorCQkgKiBNb3N0IGxpa2VseSwgcmFkYXIgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIFNBUCB3YW50cyB0bworCQkgKiBjaGFuZ2UgdGhlIGNoYW5uZWwKKwkJICovCisJCWNkZl9zdGF0dXMgPSB3bGFuc2FwX2NoYW5uZWxfY2hhbmdlX3JlcXVlc3QoKHZvaWQgKikgc2FwX2N0eCwKKwkJCQltYWNfY3R4LT5zYXAuU2FwRGZzSW5mby50YXJnZXRfY2hhbm5lbCk7CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoIlNlbmRpbmcgREZTIGVXTklfU01FX0NIQU5ORUxfQ0hBTkdFX1JFUSIpKTsKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImluIHN0YXRlICVzLCBpbnZhbGlkIGV2ZW50IG1zZyAlZCIpLAorCQkJICAiZVNBUF9ESVNDT05ORUNUSU5HIiwgbXNnKTsKKwl9CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiBzYXBfZnNtKCkgLSBTQVAgc3RhdGVtIG1hY2hpbmUgZW50cnkgZnVuY3Rpb24KKyAqIEBzYXBfY3R4OiBTQVAgY29udGV4dAorICogQHNhcF9ldmVudDogU0FQIGV2ZW50CisgKgorICogU0FQIHN0YXRlbSBtYWNoaW5lIGVudHJ5IGZ1bmN0aW9uCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc2FwX2ZzbShwdFNhcENvbnRleHQgc2FwX2N0eCwgcHRXTEFOX1NBUEV2ZW50IHNhcF9ldmVudCkKK3sKKwkvKgorCSAqIFJldHJpZXZlIHRoZSBwaHkgbGluayBzdGF0ZSBtYWNoaW5lIHN0cnVjdHVyZQorCSAqIGZyb20gdGhlIHNhcF9jdHggdmFsdWUKKwkgKiBzdGF0ZSB2YXIgdGhhdCBrZWVwcyB0cmFjayBvZiBzdGF0ZSBtYWNoaW5lCisJICovCisJZVNhcEZzbVN0YXRlc190IHN0YXRlX3ZhciA9IHNhcF9jdHgtPnNhcHNNYWNoaW5lOworCXVpbnQzMl90IG1zZyA9IHNhcF9ldmVudC0+ZXZlbnQ7IC8qIFN0YXRlIG1hY2hpbmUgaW5wdXQgZXZlbnQgbWVzc2FnZSAqLworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRIYWxIYW5kbGUgaGFsID0gQ0RTX0dFVF9IQUxfQ0Ioc2FwX2N0eC0+cF9jZHNfZ2N0eCk7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eDsKKworCWlmIChOVUxMID09IGhhbCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIkludmFsaWQgaGFsIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbCk7CisJaWYgKE5VTEwgPT0gbWFjX2N0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIkludmFsaWQgTUFDIGNvbnRleHQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJICBGTCgic2FwX2N0eD0lcCwgc3RhdGVfdmFyPSVkLCBtc2c9MHgleCIpLAorCQkgIHNhcF9jdHgsIHN0YXRlX3ZhciwgbXNnKTsKKworCXN3aXRjaCAoc3RhdGVfdmFyKSB7CisJY2FzZSBlU0FQX0RJU0NPTk5FQ1RFRDoKKwkJY2RmX3N0YXR1cyA9IHNhcF9mc21fc3RhdGVfZGlzY29ubmVjdGVkKHNhcF9jdHgsIHNhcF9ldmVudCwKKwkJCQltYWNfY3R4LCBoYWwpOworCQlicmVhazsKKworCWNhc2UgZVNBUF9DSF9TRUxFQ1Q6CisJCWNkZl9zdGF0dXMgPSBzYXBfZnNtX3N0YXRlX2NoX3NlbGVjdChzYXBfY3R4LCBzYXBfZXZlbnQsCisJCQkJbWFjX2N0eCwgaGFsKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTQVBfREZTX0NBQ19XQUlUOgorCQljZGZfc3RhdHVzID0gc2FwX2ZzbV9zdGF0ZV9kZnNfY2FjX3dhaXQoc2FwX2N0eCwgc2FwX2V2ZW50LAorCQkJCW1hY19jdHgsIGhhbCk7CisJCWJyZWFrOworCisJY2FzZSBlU0FQX1NUQVJUSU5HOgorCQljZGZfc3RhdHVzID0gc2FwX2ZzbV9zdGF0ZV9zdGFydGluZyhzYXBfY3R4LCBzYXBfZXZlbnQsCisJCQkJbWFjX2N0eCwgaGFsKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTQVBfU1RBUlRFRDoKKwkJY2RmX3N0YXR1cyA9IHNhcF9mc21fc3RhdGVfc3RhcnRlZChzYXBfY3R4LCBzYXBfZXZlbnQsCisJCQkJbWFjX2N0eCk7CisJCWJyZWFrOworCisJY2FzZSBlU0FQX0RJU0NPTk5FQ1RJTkc6CisJCWNkZl9zdGF0dXMgPSBzYXBfZnNtX3N0YXRlX2Rpc2Nvbm5lY3Rpbmcoc2FwX2N0eCwgc2FwX2V2ZW50LAorCQkJCW1hY19jdHgsIGhhbCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworZVNhcFN0YXR1cworc2FwY29udmVydF90b19jc3JfcHJvZmlsZSh0c2FwX0NvbmZpZ190ICpwY29uZmlnX3BhcmFtcywgZUNzclJvYW1Cc3NUeXBlIGJzc1R5cGUsCisJCQkgIHRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSkKK3sKKwkvKiBDcmVhdGUgUm9hbSBwcm9maWxlIGZvciBTb2Z0QVAgdG8gY29ubmVjdCAqLworCXByb2ZpbGUtPkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0lORlJBX0FQOworCXByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMgPSAxOworCXByb2ZpbGUtPmNzclBlcnNvbmEgPSBwY29uZmlnX3BhcmFtcy0+cGVyc29uYTsKKwlwcm9maWxlLT5kaXNhYmxlREZTQ2hTd2l0Y2ggPSBwY29uZmlnX3BhcmFtcy0+ZGlzYWJsZURGU0NoU3dpdGNoOworCisJY2RmX21lbV96ZXJvKHByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzBdLlNTSUQuc3NJZCwKKwkJICAgICBzaXplb2YocHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uU1NJRC5zc0lkKSk7CisKKwkvKiBGbGFnIHRvIG5vdCBicm9hZGNhc3QgdGhlIFNTSUQgaW5mb3JtYXRpb24gKi8KKwlwcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5zc2lkSGlkZGVuID0KKwkJcGNvbmZpZ19wYXJhbXMtPlNTSURpbmZvLnNzaWRIaWRkZW47CisKKwlwcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5TU0lELmxlbmd0aCA9CisJCXBjb25maWdfcGFyYW1zLT5TU0lEaW5mby5zc2lkLmxlbmd0aDsKKwljZGZfbWVtX2NvcHkoJnByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzBdLlNTSUQuc3NJZCwKKwkJICAgICBwY29uZmlnX3BhcmFtcy0+U1NJRGluZm8uc3NpZC5zc0lkLAorCQkgICAgIHNpemVvZihwY29uZmlnX3BhcmFtcy0+U1NJRGluZm8uc3NpZC5zc0lkKSk7CisKKwlwcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKworCWlmIChwY29uZmlnX3BhcmFtcy0+YXV0aFR5cGUgPT0gZVNBUF9PUEVOX1NZU1RFTSkgeworCQlwcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKwl9IGVsc2UgaWYgKHBjb25maWdfcGFyYW1zLT5hdXRoVHlwZSA9PSBlU0FQX1NIQVJFRF9LRVkpIHsKKwkJcHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfU0hBUkVEX0tFWTsKKwl9IGVsc2UgeworCQlwcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9BVVRPU1dJVENIOworCX0KKworCXByb2ZpbGUtPkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworCXByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07CisKKwkvKiBBbHdheXMgc2V0IHRoZSBFbmNyeXB0aW9uIFR5cGUgKi8KKwlwcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKwlwcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCXBjb25maWdfcGFyYW1zLT5SU05FbmNyeXB0VHlwZTsKKworCXByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisJcHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCXBjb25maWdfcGFyYW1zLT5tY1JTTkVuY3J5cHRUeXBlOworCisJaWYgKHBjb25maWdfcGFyYW1zLT5wcml2YWN5ICYgZVNBUF9TSEFSRURfS0VZKSB7CisJCXByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gZUNTUl9BVVRIX1RZUEVfU0hBUkVEX0tFWTsKKwl9CisKKwlwcm9maWxlLT5wcml2YWN5ID0gcGNvbmZpZ19wYXJhbXMtPnByaXZhY3k7CisJcHJvZmlsZS0+ZndkV1BTUEJDUHJvYmVSZXEgPSBwY29uZmlnX3BhcmFtcy0+ZndkV1BTUEJDUHJvYmVSZXE7CisKKwlpZiAocGNvbmZpZ19wYXJhbXMtPmF1dGhUeXBlID09IGVTQVBfU0hBUkVEX0tFWSkgeworCQlwcm9maWxlLT5jc3I4MDIxMUF1dGhUeXBlID0gZVNJUl9TSEFSRURfS0VZOworCX0gZWxzZSBpZiAocGNvbmZpZ19wYXJhbXMtPmF1dGhUeXBlID09IGVTQVBfT1BFTl9TWVNURU0pIHsKKwkJcHJvZmlsZS0+Y3NyODAyMTFBdXRoVHlwZSA9IGVTSVJfT1BFTl9TWVNURU07CisJfSBlbHNlIHsKKwkJcHJvZmlsZS0+Y3NyODAyMTFBdXRoVHlwZSA9IGVTSVJfQVVUT19TV0lUQ0g7CisJfQorCisJLyogSW5pdGlhbGl6ZSB3ZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBpdCAqLworCXByb2ZpbGUtPnBXUEFSZXFJRSA9IE5VTEw7CisJcHJvZmlsZS0+bldQQVJlcUlFTGVuZ3RoID0gMDsKKworCS8qIHNldCB0aGUgUlNOL1dQQSBJRSAqLworCXByb2ZpbGUtPnBSU05SZXFJRSA9IE5VTEw7CisJcHJvZmlsZS0+blJTTlJlcUlFTGVuZ3RoID0gcGNvbmZpZ19wYXJhbXMtPlJTTldQQVJlcUlFTGVuZ3RoOworCWlmIChwY29uZmlnX3BhcmFtcy0+UlNOV1BBUmVxSUVMZW5ndGgpIHsKKwkJcHJvZmlsZS0+cFJTTlJlcUlFID0KKwkJCWNkZl9tZW1fbWFsbG9jKHBjb25maWdfcGFyYW1zLT5SU05XUEFSZXFJRUxlbmd0aCk7CisJCWlmIChOVUxMID09IHByb2ZpbGUtPnBSU05SZXFJRSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiICVzIEZhaWwgdG8gYWxsb2MgbWVtb3J5IiwgX19mdW5jX18pOworCQkJcmV0dXJuIGVTQVBfU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwkJY2RmX21lbV9jb3B5KHByb2ZpbGUtPnBSU05SZXFJRSwgcGNvbmZpZ19wYXJhbXMtPlJTTldQQVJlcUlFLAorCQkJICAgICBwY29uZmlnX3BhcmFtcy0+UlNOV1BBUmVxSUVMZW5ndGgpOworCQlwcm9maWxlLT5uUlNOUmVxSUVMZW5ndGggPSBwY29uZmlnX3BhcmFtcy0+UlNOV1BBUmVxSUVMZW5ndGg7CisJfQorCS8qIFR1cm4gb2ZmIENCIG1vZGUgKi8KKwlwcm9maWxlLT5DQk1vZGUgPSBlQ1NSX0NCX09GRjsKKworCS8qIHNldCB0aGUgcGh5TW9kZSB0byBhY2NlcHQgYW55dGhpbmcgKi8KKwkvKiBCZXN0IG1lYW5zIGV2ZXJ5dGhpbmcgYmVjYXVzZSBpdCBjb3ZlcnMgYWxsIHRoZSB0aGluZ3Mgd2Ugc3VwcG9ydCAqLworCS8qIGVDU1JfRE9UMTFfTU9ERV9CRVNUICovCisJcHJvZmlsZS0+cGh5TW9kZSA9IHBjb25maWdfcGFyYW1zLT5TYXBId19tb2RlOworCisJLyogQ29uZmlndXJlIGJlYWNvbkludGVydmFsICovCisJcHJvZmlsZS0+YmVhY29uSW50ZXJ2YWwgPSAodWludDE2X3QpIHBjb25maWdfcGFyYW1zLT5iZWFjb25faW50OworCisJLyogc2V0IERUSU0gcGVyaW9kICovCisJcHJvZmlsZS0+ZHRpbVBlcmlvZCA9IHBjb25maWdfcGFyYW1zLT5kdGltX3BlcmlvZDsKKworCS8qIHNldCBVYXBzZCBlbmFibGUgYml0ICovCisJcHJvZmlsZS0+QXBVYXBzZEVuYWJsZSA9IHBjb25maWdfcGFyYW1zLT5VYXBzZEVuYWJsZTsKKworCS8qIEVuYWJsZSBwcm90ZWN0aW9uIHBhcmFtZXRlcnMgKi8KKwlwcm9maWxlLT5wcm90RW5hYmxlZCA9IHBjb25maWdfcGFyYW1zLT5wcm90RW5hYmxlZDsKKwlwcm9maWxlLT5vYnNzUHJvdEVuYWJsZWQgPSBwY29uZmlnX3BhcmFtcy0+b2Jzc1Byb3RFbmFibGVkOworCXByb2ZpbGUtPmNmZ19wcm90ZWN0aW9uID0gcGNvbmZpZ19wYXJhbXMtPmh0X2NhcGFiOworCisJLyogY291bnRyeSBjb2RlICovCisJaWYgKHBjb25maWdfcGFyYW1zLT5jb3VudHJ5Q29kZVswXSkKKwkJY2RmX21lbV9jb3B5KHByb2ZpbGUtPmNvdW50cnlDb2RlLCBwY29uZmlnX3BhcmFtcy0+Y291bnRyeUNvZGUsCisJCQkgICAgIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTik7CisJcHJvZmlsZS0+aWVlZTgwMjExZCA9IHBjb25maWdfcGFyYW1zLT5pZWVlODAyMTFkOworCS8qIHdwcyBjb25maWcgaW5mbyAqLworCXByb2ZpbGUtPndwc19zdGF0ZSA9IHBjb25maWdfcGFyYW1zLT53cHNfc3RhdGU7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJLyogTUZQIGNhcGFibGUvcmVxdWlyZWQgKi8KKwlwcm9maWxlLT5NRlBDYXBhYmxlID0gcGNvbmZpZ19wYXJhbXMtPm1mcENhcGFibGUgPyAxIDogMDsKKwlwcm9maWxlLT5NRlBSZXF1aXJlZCA9IHBjb25maWdfcGFyYW1zLT5tZnBSZXF1aXJlZCA/IDEgOiAwOworI2VuZGlmCisKKwlpZiAocGNvbmZpZ19wYXJhbXMtPnByb2JlUmVzcElFc0J1ZmZlckxlbiA+IDAgJiYKKwkgICAgcGNvbmZpZ19wYXJhbXMtPnBQcm9iZVJlc3BJRXNCdWZmZXIgIT0gTlVMTCkgeworCQlwcm9maWxlLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BEYXRhTGVuID0KKwkJCXBjb25maWdfcGFyYW1zLT5wcm9iZVJlc3BJRXNCdWZmZXJMZW47CisJCXByb2ZpbGUtPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFfYnVmZiA9CisJCQlwY29uZmlnX3BhcmFtcy0+cFByb2JlUmVzcElFc0J1ZmZlcjsKKwl9IGVsc2UgeworCQlwcm9maWxlLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BEYXRhTGVuID0gMDsKKwkJcHJvZmlsZS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwRGF0YV9idWZmID0gTlVMTDsKKwl9CisJLyphc3NvYyByZXNwIElFICovCisJaWYgKHBjb25maWdfcGFyYW1zLT5hc3NvY1Jlc3BJRXNMZW4gPiAwICYmCisJICAgIHBjb25maWdfcGFyYW1zLT5wQXNzb2NSZXNwSUVzQnVmZmVyICE9IE5VTEwpIHsKKwkJcHJvZmlsZS0+YWRkSWVQYXJhbXMuYXNzb2NSZXNwRGF0YUxlbiA9CisJCQlwY29uZmlnX3BhcmFtcy0+YXNzb2NSZXNwSUVzTGVuOworCQlwcm9maWxlLT5hZGRJZVBhcmFtcy5hc3NvY1Jlc3BEYXRhX2J1ZmYgPQorCQkJcGNvbmZpZ19wYXJhbXMtPnBBc3NvY1Jlc3BJRXNCdWZmZXI7CisJfSBlbHNlIHsKKwkJcHJvZmlsZS0+YWRkSWVQYXJhbXMuYXNzb2NSZXNwRGF0YUxlbiA9IDA7CisJCXByb2ZpbGUtPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFfYnVmZiA9IE5VTEw7CisJfQorCisJaWYgKHBjb25maWdfcGFyYW1zLT5wcm9iZVJlc3BCY25JRXNMZW4gPiAwICYmCisJICAgIHBjb25maWdfcGFyYW1zLT5wUHJvYmVSZXNwQmNuSUVzQnVmZmVyICE9IE5VTEwpIHsKKwkJcHJvZmlsZS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwQkNORGF0YUxlbiA9CisJCQlwY29uZmlnX3BhcmFtcy0+cHJvYmVSZXNwQmNuSUVzTGVuOworCQlwcm9maWxlLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BCQ05EYXRhX2J1ZmYgPQorCQkJcGNvbmZpZ19wYXJhbXMtPnBQcm9iZVJlc3BCY25JRXNCdWZmZXI7CisJfSBlbHNlIHsKKwkJcHJvZmlsZS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwQkNORGF0YUxlbiA9IDA7CisJCXByb2ZpbGUtPmFkZEllUGFyYW1zLnByb2JlUmVzcEJDTkRhdGFfYnVmZiA9IE5VTEw7CisJfQorCXByb2ZpbGUtPnNhcF9kb3QxMW1jID0gcGNvbmZpZ19wYXJhbXMtPnNhcF9kb3QxMW1jOworCisJcmV0dXJuIGVTQVBfU1RBVFVTX1NVQ0NFU1M7ICAgICAvKiBTdWNjZXNzLiAqLworfQorCit2b2lkIHNhcF9mcmVlX3JvYW1fcHJvZmlsZSh0Q3NyUm9hbVByb2ZpbGUgKnByb2ZpbGUpCit7CisJaWYgKHByb2ZpbGUtPnBSU05SZXFJRSkgeworCQljZGZfbWVtX2ZyZWUocHJvZmlsZS0+cFJTTlJlcUlFKTsKKwkJcHJvZmlsZS0+cFJTTlJlcUlFID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgc2FwX3NvcnRfbWFjX2xpc3Qoc3RydWN0IGNkZl9tYWNfYWRkciAqbWFjTGlzdCwgdWludDhfdCBzaXplKQoreworCXVpbnQ4X3Qgb3V0ZXIsIGlubmVyOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgdGVtcDsKKwlpbnQzMl90IG5SZXMgPSAtMTsKKworCWlmICgoTlVMTCA9PSBtYWNMaXN0KSB8fCAoc2l6ZSA+IE1BWF9BQ0xfTUFDX0FERFJFU1MpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCUZMKCJlaXRoZXIgYnVmZmVyIGlzIE5VTEwgb3Igc2l6ZSA9ICVkIGlzIG1vcmUiKSwgc2l6ZSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKG91dGVyID0gMDsgb3V0ZXIgPCBzaXplOyBvdXRlcisrKSB7CisJCWZvciAoaW5uZXIgPSAwOyBpbm5lciA8IHNpemUgLSAxOyBpbm5lcisrKSB7CisJCQluUmVzID0KKwkJCQljZGZfbWVtX2NvbXBhcmUyKChtYWNMaXN0ICsgaW5uZXIpLT5ieXRlcywKKwkJCQkJCSAobWFjTGlzdCArIGlubmVyICsgMSktPmJ5dGVzLAorCQkJCQkJIENERl9NQUNfQUREUl9TSVpFKTsKKwkJCWlmIChuUmVzID4gMCkgeworCQkJCWNkZl9tZW1fY29weSh0ZW1wLmJ5dGVzLAorCQkJCQkgICAgIChtYWNMaXN0ICsgaW5uZXIgKyAxKS0+Ynl0ZXMsCisJCQkJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCQkJCWNkZl9tZW1fY29weSgobWFjTGlzdCArIGlubmVyICsgMSktPmJ5dGVzLAorCQkJCQkgICAgIChtYWNMaXN0ICsgaW5uZXIpLT5ieXRlcywKKwkJCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJCQkJY2RmX21lbV9jb3B5KChtYWNMaXN0ICsgaW5uZXIpLT5ieXRlcywKKwkJCQkJICAgICB0ZW1wLmJ5dGVzLCBDREZfTUFDX0FERFJfU0laRSk7CisJCQl9CisJCX0KKwl9Cit9CisKK2VTYXBCb29sCitzYXBfc2VhcmNoX21hY19saXN0KHN0cnVjdCBjZGZfbWFjX2FkZHIgKm1hY0xpc3QsCisJCSAgICB1aW50OF90IG51bV9tYWMsIHVpbnQ4X3QgKnBlZXJNYWMsCisJCSAgICB1aW50OF90ICppbmRleCkKK3sKKwlpbnQzMl90IG5SZXMgPSAtMTsKKwlpbnQ4X3QgblN0YXJ0ID0gMCwgbkVuZCwgbk1pZGRsZTsKKwluRW5kID0gbnVtX21hYyAtIDE7CisKKwlpZiAoKE5VTEwgPT0gbWFjTGlzdCkgfHwgKG51bV9tYWMgPiBNQVhfQUNMX01BQ19BRERSRVNTKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgICBGTCgiZWl0aGVyIGJ1ZmZlciBpcyBOVUxMIG9yIHNpemUgPSAlZCBpcyBtb3JlLiIpLCBudW1fbWFjKTsKKwkJcmV0dXJuIGVTQVBfRkFMU0U7CisJfQorCisJd2hpbGUgKG5TdGFydCA8PSBuRW5kKSB7CisJCW5NaWRkbGUgPSAoblN0YXJ0ICsgbkVuZCkgLyAyOworCQluUmVzID0KKwkJCWNkZl9tZW1fY29tcGFyZTIoJm1hY0xpc3Rbbk1pZGRsZV0sIHBlZXJNYWMsCisJCQkJCSBDREZfTUFDX0FERFJfU0laRSk7CisKKwkJaWYgKDAgPT0gblJlcykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgInNlYXJjaCBTVUNDIik7CisJCQkvKiAiaW5kZXggZXF1YWxzIE5VTEwiIG1lYW5zIHRoZSBjYWxsZXIgZG9lcyBub3QgbmVlZCB0aGUgKi8KKwkJCS8qIGluZGV4IHZhbHVlIG9mIHRoZSBwZWVyTWFjIGJlaW5nIHNlYXJjaGVkICovCisJCQlpZiAoaW5kZXggIT0gTlVMTCkgeworCQkJCSppbmRleCA9ICh1aW50OF90KSBuTWlkZGxlOworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiaW5kZXggJWQiLAorCQkJCQkgICppbmRleCk7CisJCQl9CisJCQlyZXR1cm4gZVNBUF9UUlVFOworCQl9CisJCWlmIChuUmVzIDwgMCkKKwkJCW5TdGFydCA9IG5NaWRkbGUgKyAxOworCQllbHNlCisJCQluRW5kID0gbk1pZGRsZSAtIDE7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJzZWFyY2ggbm90IHN1Y2MiKTsKKwlyZXR1cm4gZVNBUF9GQUxTRTsKK30KKwordm9pZCBzYXBfYWRkX21hY190b19hY2woc3RydWN0IGNkZl9tYWNfYWRkciAqbWFjTGlzdCwKKwkJCXVpbnQ4X3QgKnNpemUsIHVpbnQ4X3QgKnBlZXJNYWMpCit7CisJaW50MzJfdCBuUmVzID0gLTE7CisJaW50IGk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgImFkZCBhY2wgZW50ZXJlZCIpOworCisJaWYgKE5VTEwgPT0gbWFjTGlzdCB8fCAqc2l6ZSA9PSAwIHx8ICpzaXplID4gTUFYX0FDTF9NQUNfQUREUkVTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQlGTCgiZWl0aGVyIGJ1ZmZlciBpcyBOVUxMIG9yIHNpemUgPSAlZCBpcyBpbmNvcnJlY3QuIiksCisJCQkqc2l6ZSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAoKCpzaXplKSAtIDEpOyBpID49IDA7IGktLSkgeworCQluUmVzID0KKwkJCWNkZl9tZW1fY29tcGFyZTIoJm1hY0xpc3RbaV0sIHBlZXJNYWMsIENERl9NQUNfQUREUl9TSVpFKTsKKwkJaWYgKG5SZXMgPiAwKSB7CisJCQkvKiBNb3ZlIGFscGhhYmV0aWNhbGx5IGdyZWF0ZXIgbWFjIGFkZHJlc3NlcyBvbmUgaW5kZXggZG93biB0byBhbGxvdyBmb3IgaW5zZXJ0aW9uCisJCQkgICBvZiBuZXcgbWFjIGluIHNvcnRlZCBvcmRlciAqLworCQkJY2RmX21lbV9jb3B5KChtYWNMaXN0ICsgaSArIDEpLT5ieXRlcywKKwkJCQkgICAgIChtYWNMaXN0ICsgaSktPmJ5dGVzLCBDREZfTUFDX0FERFJfU0laRSk7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBUaGlzIHNob3VsZCBhbHNvIHRha2UgY2FyZSBvZiBpZiB0aGUgZWxlbWVudCBpcyB0aGUgZmlyc3QgdG8gYmUgYWRkZWQgaW4gdGhlIGxpc3QgKi8KKwljZGZfbWVtX2NvcHkoKG1hY0xpc3QgKyBpICsgMSktPmJ5dGVzLCBwZWVyTWFjLCBDREZfTUFDX0FERFJfU0laRSk7CisJLyogaW5jcmVtZW50IHRoZSBsaXN0IHNpemUgKi8KKwkoKnNpemUpKys7Cit9CisKK3ZvaWQgc2FwX3JlbW92ZV9tYWNfZnJvbV9hY2woc3RydWN0IGNkZl9tYWNfYWRkciAqbWFjTGlzdCwKKwkJCSAgICAgdWludDhfdCAqc2l6ZSwgdWludDhfdCBpbmRleCkKK3sKKwlpbnQgaTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAicmVtb3ZlIGFjbCBlbnRlcmVkIik7CisJLyoKKwkgKiBSZXR1cm4gaWYgdGhlIGxpc3QgcGFzc2VkIGlzIGVtcHR5LiBJZGVhbGx5IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorCSAqIHNpbmNlIHRoaXMgZnVuY24gaXMgYWx3YXlzIGNhbGxlZCBhZnRlciBzYXBfc2VhcmNoX21hY19saXN0IHRvIGdldAorCSAqIHRoZSBpbmRleCBvZiB0aGUgbWFjIGFkZHIgdG8gYmUgcmVtb3ZlZCBhbmQgdGhpcyB3aWxsIG9ubHkgZ2V0CisJICogY2FsbGVkIGlmIHRoZSBzZWFyY2ggaXMgc3VjY2Vzc2Z1bC4gU3RpbGwgbm8gaGFybSBpbiBoYXZpbmcgdGhlIGNoZWNrCisJICovCisJaWYgKChtYWNMaXN0ID09IE5VTEwpIHx8ICgqc2l6ZSA9PSAwKSB8fAorCQkJCQkoKnNpemUgPiBNQVhfQUNMX01BQ19BRERSRVNTKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQlGTCgiZWl0aGVyIGJ1ZmZlciBpcyBOVUxMIG9yIHNpemUgJWQgaXMgaW5jb3JyZWN0LiIpLAorCQkJKnNpemUpOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IGluZGV4OyBpIDwgKCgqc2l6ZSkgLSAxKTsgaSsrKSB7CisJCS8qIE1vdmUgbWFjIGFkZHJlc3NlcyBzdGFydGluZyBmcm9tICJpbmRleCIgcGFzc2VkIG9uZSBpbmRleCB1cCB0byBkZWxldGUgdGhlIHZvaWQKKwkJICAgY3JlYXRlZCBieSBkZWxldGlvbiBvZiBhIG1hYyBhZGRyZXNzIGluIEFDTCAqLworCQljZGZfbWVtX2NvcHkoKG1hY0xpc3QgKyBpKS0+Ynl0ZXMsIChtYWNMaXN0ICsgaSArIDEpLT5ieXRlcywKKwkJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCX0KKwkvKiBUaGUgbGFzdCBzcGFjZSBzaG91bGQgYmUgbWFkZSBlbXB0eSBzaW5jZSBhbGwgbWFjIGFkZGVzc2VzIG1vdmVkIG9uZSBzdGVwIHVwICovCisJY2RmX21lbV96ZXJvKChtYWNMaXN0ICsgKCpzaXplKSAtIDEpLT5ieXRlcywgQ0RGX01BQ19BRERSX1NJWkUpOworCS8qIHJlZHVjZSB0aGUgbGlzdCBzaXplIGJ5IDEgKi8KKwkoKnNpemUpLS07Cit9CisKK3ZvaWQgc2FwX3ByaW50X2FjbChzdHJ1Y3QgY2RmX21hY19hZGRyICptYWNMaXN0LCB1aW50OF90IHNpemUpCit7CisJaW50IGk7CisJdWludDhfdCAqbWFjQXJyYXk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJwcmludCBhY2wgZW50ZXJlZCIpOworCisJaWYgKChOVUxMID09IG1hY0xpc3QpIHx8IChzaXplID09IDApIHx8IChzaXplID49IE1BWF9BQ0xfTUFDX0FERFJFU1MpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIkluICVzLCBlaXRoZXIgYnVmZmVyIGlzIE5VTEwgb3Igc2l6ZSAlZCBpcyBpbmNvcnJlY3QuIiwKKwkJCSAgX19mdW5jX18sIHNpemUpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQltYWNBcnJheSA9IChtYWNMaXN0ICsgaSktPmJ5dGVzOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIqKiBBQ0wgZW50cnkgJWkgLSAiIE1BQ19BRERSRVNTX1NUUiwgaSwKKwkJCSAgTUFDX0FERFJfQVJSQVkobWFjQXJyYXkpKTsKKwl9CisJcmV0dXJuOworfQorCitDREZfU1RBVFVTIHNhcF9pc19wZWVyX21hY19hbGxvd2VkKHB0U2FwQ29udGV4dCBzYXBDb250ZXh0LCB1aW50OF90ICpwZWVyTWFjKQoreworCWlmIChlU0FQX0FMTE9XX0FMTCA9PSBzYXBDb250ZXh0LT5lU2FwTWFjQWRkckFjbE1vZGUpCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlpZiAoc2FwX3NlYXJjaF9tYWNfbGlzdAorCQkgICAgKHNhcENvbnRleHQtPmFjY2VwdE1hY0xpc3QsIHNhcENvbnRleHQtPm5BY2NlcHRNYWMsIHBlZXJNYWMsIE5VTEwpKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKHNhcF9zZWFyY2hfbWFjX2xpc3QKKwkJICAgIChzYXBDb250ZXh0LT5kZW55TWFjTGlzdCwgc2FwQ29udGV4dC0+bkRlbnlNYWMsIHBlZXJNYWMsIE5VTEwpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIkluICVzLCBQZWVyICIgTUFDX0FERFJFU1NfU1RSICIgaW4gZGVueSBsaXN0IiwKKwkJCSAgX19mdW5jX18sIE1BQ19BRERSX0FSUkFZKHBlZXJNYWMpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwkvKiBBIG5ldyBzdGF0aW9uIENBTiBhc3NvY2lhdGUsIHVubGVzcyBpbiBkZW55IGxpc3QuIExlc3Mgc3RyaW5nZW50IG1vZGUgKi8KKwlpZiAoZVNBUF9BQ0NFUFRfVU5MRVNTX0RFTklFRCA9PSBzYXBDb250ZXh0LT5lU2FwTWFjQWRkckFjbE1vZGUpCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkvKiBBIG5ldyBzdGF0aW9uIENBTk5PVCBhc3NvY2lhdGUsIHVubGVzcyBpbiBhY2NlcHQgbGlzdC4gTW9yZSBzdHJpbmdlbnQgbW9kZSAqLworCWlmIChlU0FQX0RFTllfVU5MRVNTX0FDQ0VQVEVEID09IHNhcENvbnRleHQtPmVTYXBNYWNBZGRyQWNsTW9kZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICJJbiAlcywgUGVlciAiIE1BQ19BRERSRVNTX1NUUgorCQkJICAiIGRlbmllZCwgTWFjIGZpbHRlciBtb2RlIGlzIGVTQVBfREVOWV9VTkxFU1NfQUNDRVBURUQiLAorCQkJICBfX2Z1bmNfXywgTUFDX0FERFJfQVJSQVkocGVlck1hYykpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyogVGhlIG5ldyBTVEEgaXMgbmVpdGhlciBpbiBhY2NlcHQgbGlzdCBub3IgaW4gZGVueSBsaXN0LiBJbiB0aGlzIGNhc2UsIGRlbnkgdGhlIGFzc29jaWF0aW9uCisJICogYnV0IHNlbmQgYSB3aWZpIGV2ZW50IG5vdGlmaWNhdGlvbiBpbmRpY2F0aW5nIHRoZSBtYWMgYWRkcmVzcyBiZWluZyBkZW5pZWQKKwkgKi8KKwlpZiAoZVNBUF9TVVBQT1JUX0FDQ0VQVF9BTkRfREVOWSA9PSBzYXBDb250ZXh0LT5lU2FwTWFjQWRkckFjbE1vZGUpIHsKKwkJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwQ29udGV4dCwgTlVMTCwgZVNBUF9VTktOT1dOX1NUQV9KT0lOLAorCQkJCSAgICAgKHZvaWQgKikgcGVlck1hYyk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIkluICVzLCBQZWVyICIgTUFDX0FERFJFU1NfU1RSCisJCQkgICIgZGVuaWVkLCBNYWMgZmlsdGVyIG1vZGUgaXMgZVNBUF9TVVBQT1JUX0FDQ0VQVF9BTkRfREVOWSIsCisJCQkgIF9fZnVuY19fLCBNQUNfQUREUl9BUlJBWShwZWVyTWFjKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCisvKioKKyAqIHNhcF9nZXRfY2hhbm5lbF9saXN0KCkgLSBnZXQgdGhlIGxpc3Qgb2YgY2hhbm5lbHMKKyAqIEBzYXBfY3R4OiBzYXAgY29udGV4dAorICogQGNoX2xpc3Q6IHBvaW50ZXIgdG8gY2hhbm5lbCBsaXN0IGFycmF5CisgKiBAbnVtX2NoOiBwb2ludGVyIHRvIG51bWJlciBvZiBjaGFubmVscy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBvcHVsYXRlcyB0aGUgbGlzdCBvZiBjaGFubmVscyBmb3Igc2Nhbm5pbmcuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHNhcF9nZXRfY2hhbm5lbF9saXN0KHB0U2FwQ29udGV4dCBzYXBfY3R4LAorCQkJCSAgICAgICB1aW50OF90ICoqY2hfbGlzdCwKKwkJCQkgICAgICAgdWludDhfdCAqbnVtX2NoKQoreworCXVpbnQ4X3QgbG9vcF9jb3VudDsKKwl1aW50OF90ICpsaXN0OworCXVpbnQ4X3QgY2hfY291bnQ7CisJdWludDhfdCBzdGFydF9jaF9udW0sIGJhbmRfc3RhcnRfY2g7CisJdWludDhfdCBlbmRfY2hfbnVtLCBiYW5kX2VuZF9jaDsKKwl1aW50MzJfdCBlbl9sdGVfY29leDsKKwl0SGFsSGFuZGxlIGhhbCA9IENEU19HRVRfSEFMX0NCKHNhcF9jdHgtPnBfY2RzX2djdHgpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAorCXVpbnQ4X3QgaTsKKyNlbmRpZgorCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWwpOworCisJaWYgKE5VTEwgPT0gaGFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIkludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwX2Nkc19nY3R4IikpOworCQkqbnVtX2NoID0gMDsKKwkJKmNoX2xpc3QgPSBOVUxMOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXN0YXJ0X2NoX251bSA9IHNhcF9jdHgtPmFjc19jZmctPnN0YXJ0X2NoOworCWVuZF9jaF9udW0gPSBzYXBfY3R4LT5hY3NfY2ZnLT5lbmRfY2g7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCUZMKCJzdGFydENoYW5uZWwgJWQsIEVuZENoYW5uZWwgJWQsIEhXOiVkIiksCisJCQlzdGFydF9jaF9udW0sIGVuZF9jaF9udW0sCisJCQlzYXBfY3R4LT5hY3NfY2ZnLT5od19tb2RlKTsKKworCXdsYW5zYXBfZXh0ZW5kX3RvX2Fjc19yYW5nZSgmc3RhcnRfY2hfbnVtLCAmZW5kX2NoX251bSwKKwkJCQkJICAgICZiYW5kX3N0YXJ0X2NoLCAmYmFuZF9lbmRfY2gpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoImV4cGFuZGVkIHN0YXJ0Q2hhbm5lbCAlZCxFbmRDaGFubmVsICVkIiksCisJCQkgIHN0YXJ0X2NoX251bSwgZW5kX2NoX251bSk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICBGTCgiYmFuZF9zdGFydF9jaCAlZCwgYmFuZF9lbmRfY2ggJWQiKSwKKwkJCSAgYmFuZF9zdGFydF9jaCwgYmFuZF9lbmRfY2gpOworCisJc21lX2NmZ19nZXRfaW50KGhhbCwgV05JX0NGR19FTkFCTEVfTFRFX0NPRVgsICZlbl9sdGVfY29leCk7CisKKwkvKiBDaGVjayBpZiBMVEUgY29leCBpcyBlbmFibGVkIGFuZCAyLjRHSHogaXMgc2VsZWN0ZWQgKi8KKwlpZiAoZW5fbHRlX2NvZXggJiYgKGJhbmRfc3RhcnRfY2ggPT0gUkZfQ0hBTl8xKSAmJgorCSAgICAoYmFuZF9lbmRfY2ggPT0gUkZfQ0hBTl8xNCkpIHsKKwkJLyogU2V0IDIuNEdIeiB1cHBlciBsaW1pdCB0byBjaGFubmVsIDkgZm9yIExURSBDT0VYICovCisJCWJhbmRfZW5kX2NoID0gUkZfQ0hBTl85OworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBtYXggbnVtYmVyIG9mIGNoYW5uZWwgc3VwcG9ydGVkICovCisJbGlzdCA9ICh1aW50OF90ICopIGNkZl9tZW1fbWFsbG9jKE5VTV81R0haX0NIQU5ORUxTICsKKwkJCQkJCU5VTV8yNEdIWl9DSEFOTkVMUyk7CisJaWYgKE5VTEwgPT0gbGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBjaGFubmVsIGxpc3QiKSk7CisJCSpudW1fY2ggPSAwOworCQkqY2hfbGlzdCA9IE5VTEw7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJLyogU2VhcmNoIGZvciB0aGUgQWN0aXZlIGNoYW5uZWxzIGluIHRoZSBnaXZlbiByYW5nZSAqLworCWNoX2NvdW50ID0gMDsKKwlmb3IgKGxvb3BfY291bnQgPSBiYW5kX3N0YXJ0X2NoOyBsb29wX2NvdW50IDw9IGJhbmRfZW5kX2NoOworCSAgICAgbG9vcF9jb3VudCsrKSB7CisJCS8qIGdvIHRvIG5leHQgY2hhbm5lbCBpZiByZl9jaGFubmVsIGlzIG91dCBvZiByYW5nZSAqLworCQlpZiAoKHN0YXJ0X2NoX251bSA+IHJmX2NoYW5uZWxzW2xvb3BfY291bnRdLmNoYW5uZWxOdW0pIHx8CisJCSAgICAoZW5kX2NoX251bSA8IHJmX2NoYW5uZWxzW2xvb3BfY291bnRdLmNoYW5uZWxOdW0pKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIGdvIHRvIG5leHQgY2hhbm5lbCBpZiBub25lIG9mIHRoZXNlIGNvbmRpdGlvbiBwYXNzCisJCSAqIC0gREZTIHNjYW4gZW5hYmxlZCBhbmQgY2hhbiBub3QgaW4gQ0hBTk5FTF9TVEFURV9ESVNBQkxFCisJCSAqIC0gREZTIHNjYW4gZGlzYWJsZSBidXQgY2hhbiBpbiBDSEFOTkVMX1NUQVRFX0VOQUJMRQorCQkgKi8KKwkJaWYgKCEoKChlU0FQX1RSVUUgPT0gbWFjX2N0eC0+c2Nhbi5mRW5hYmxlREZTQ2hubFNjYW4pICYmCisJCSAgICAgKHJlZ19jaGFubmVsc1tsb29wX2NvdW50XS5lbmFibGVkKSkgfHwKKwkJICAgICgoZVNBUF9GQUxTRSA9PSBtYWNfY3R4LT5zY2FuLmZFbmFibGVERlNDaG5sU2NhbikgJiYKKwkJICAgICAoQ0hBTk5FTF9TVEFURV9FTkFCTEUgPT0KKwkJICAgICAgcmVnX2NoYW5uZWxzW2xvb3BfY291bnRdLmVuYWJsZWQpKSkpCisJCQljb250aW51ZTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAorCQlmb3IgKGkgPSAwOyBpIDwgTlVNXzIwTUhaX1JGX0NIQU5ORUxTOyBpKyspIHsKKwkJCWlmICgoc2FmZV9jaGFubmVsc1tpXS5jaGFubmVsTnVtYmVyID09CisJCQkgICAgIHJmX2NoYW5uZWxzW2xvb3BfY291bnRdLmNoYW5uZWxOdW0pKSB7CisJCQkJLyogQ2hlY2sgaWYgY2hhbm5lbCBpcyBzYWZlICovCisJCQkJaWYgKHRydWUgPT0gc2FmZV9jaGFubmVsc1tpXS5pc1NhZmUpIHsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9BUF9BUF9BQ1NfT1BUSU1JWkUKKwkJdWludDhfdCBjaDsKKwkJY2ggPSByZl9jaGFubmVsc1tsb29wX2NvdW50XS5jaGFubmVsTnVtOworCQlpZiAoKHNhcF9jdHgtPmFjc19jZmctPnNraXBfc2Nhbl9zdGF0dXMgPT0KKwkJCWVTQVBfRE9fUEFSX0FDU19TQ0FOKSkgeworCQkgICAgaWYgKChjaCA+PSBzYXBfY3R4LT5hY3NfY2ZnLT5za2lwX3NjYW5fcmFuZ2UxX3N0Y2ggJiYKKwkJCSBjaCA8PSBzYXBfY3R4LT5hY3NfY2ZnLT5za2lwX3NjYW5fcmFuZ2UxX2VuZGNoKSB8fAorCQkJKGNoID49IHNhcF9jdHgtPmFjc19jZmctPnNraXBfc2Nhbl9yYW5nZTJfc3RjaCAmJgorCQkJIGNoIDw9IHNhcF9jdHgtPmFjc19jZmctPnNraXBfc2Nhbl9yYW5nZTJfZW5kY2gpKSB7CisJCQlsaXN0W2NoX2NvdW50XSA9CisJCQkJcmZfY2hhbm5lbHNbbG9vcF9jb3VudF0uY2hhbm5lbE51bTsKKwkJCWNoX2NvdW50Kys7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJRkwoIiVkICVkIGFkZGVkIHRvIEFDUyBjaCByYW5nZSIpLAorCQkJCWNoX2NvdW50LCBjaCk7CisJCSAgICB9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCUNERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJRkwoIiVkICVkIHNraXBwZWQgZnJvbSBBQ1MgY2ggcmFuZ2UiKSwKKwkJCQljaF9jb3VudCwgY2gpOworCQkgICAgfQorCQl9IGVsc2UgeworCQkJbGlzdFtjaF9jb3VudF0gPQorCQkJCXJmX2NoYW5uZWxzW2xvb3BfY291bnRdLmNoYW5uZWxOdW07CisJCQljaF9jb3VudCsrOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCUNERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCUZMKCIlZCAlZCBhZGRlZCB0byBBQ1MgY2ggcmFuZ2UiKSwKKwkJCQljaF9jb3VudCwgY2gpOworCQl9CisjZWxzZQorCQlsaXN0W2NoX2NvdW50XSA9IHJmX2NoYW5uZWxzW2xvb3BfY291bnRdLmNoYW5uZWxOdW07CisJCWNoX2NvdW50Kys7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKwlpZiAoMCA9PSBjaF9jb3VudCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgIEZMKCJObyBhY3RpdmUgY2hhbm5lbHMgcHJlc2VudCBmb3IgdGhlIGN1cnJlbnQgcmVnaW9uIikpOworCQkvKgorCQkgKiBMVEUgQ09FWDogY2hhbm5lbCByYW5nZSBvdXRzaWRlIHRoZSByZXN0cmljdGVkIDIuNEdIegorCQkgKiBiYW5kIGxpbWl0cworCQkgKi8KKwkJaWYgKGVuX2x0ZV9jb2V4ICYmIChzdGFydF9jaF9udW0gPiBiYW5kX2VuZF9jaCkpCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCQlGTCgiU0FQIGNhbid0IGJlIHN0YXJ0ZWQgYXMgZHVlIHRvIExURSBDT0VYIikpOworCX0KKworCS8qIHJldHVybiB0aGUgY2hhbm5lbCBsaXN0IGFuZCBudW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbiAqLworCSpudW1fY2ggPSBjaF9jb3VudDsKKwlpZiAoY2hfY291bnQgIT0gMCkgeworCQkqY2hfbGlzdCA9IGxpc3Q7CisJfSBlbHNlIHsKKwkJKmNoX2xpc3QgPSBOVUxMOworCQljZGZfbWVtX2ZyZWUobGlzdCk7CisJfQorCisJZm9yIChsb29wX2NvdW50ID0gMDsgbG9vcF9jb3VudCA8IGNoX2NvdW50OyBsb29wX2NvdW50KyspIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQlGTCgiY2hhbm5lbCBudW1iZXI6ICVkIiksIGxpc3RbbG9vcF9jb3VudF0pOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBmb3IgaW5pdGlhbGl6aW5nIGxpc3Qgb2YgIDIuNC81IEdoeiBbTk9OLURGUy9ERlNdCisgKiBhdmFpbGFibGUgY2hhbm5lbHMgaW4gdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHNhcF9nZXQ1X2dfaHpfY2hhbm5lbF9saXN0KHB0U2FwQ29udGV4dCBzYXBDb250ZXh0KQoreworCXVpbnQ4X3QgY291bnQgPSAwOworCWludCBpOworCWlmIChOVUxMID09IHNhcENvbnRleHQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJJbnZhbGlkIHNhcENvbnRleHQgcG9pbnRlciBvbiBzYXBfZ2V0X2NoYW5uZWxfbGlzdCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCWlmIChzYXBDb250ZXh0LT5TYXBBbGxDaG5sTGlzdC5jaGFubmVsTGlzdCkgeworCQljZGZfbWVtX2ZyZWUoc2FwQ29udGV4dC0+U2FwQWxsQ2hubExpc3QuY2hhbm5lbExpc3QpOworCQlzYXBDb250ZXh0LT5TYXBBbGxDaG5sTGlzdC5jaGFubmVsTGlzdCA9IE5VTEw7CisJfQorCisJc2FwQ29udGV4dC0+U2FwQWxsQ2hubExpc3QuY2hhbm5lbExpc3QgPQorCQkodENoYW5uZWxJbmZvICopIGNkZl9tZW1fbWFsbG9jKFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTiAqCisJCQkJCQlzaXplb2YodENoYW5uZWxJbmZvKSk7CisJaWYgKE5VTEwgPT0gc2FwQ29udGV4dC0+U2FwQWxsQ2hubExpc3QuY2hhbm5lbExpc3QpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIgTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIHNhcF9nZXRfY2hhbm5lbF9saXN0Iik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJZm9yIChpID0gUkZfQ0hBTl8zNjsgaSA8PSBSRl9DSEFOXzE2NTsgaSsrKSB7CisJCWlmIChyZWdfY2hhbm5lbHNbaV0uZW5hYmxlZCA9PSBDSEFOTkVMX1NUQVRFX0VOQUJMRSB8fAorCQkgICAgcmVnX2NoYW5uZWxzW2ldLmVuYWJsZWQgPT0gQ0hBTk5FTF9TVEFURV9ERlMpIHsKKwkJCXNhcENvbnRleHQtPlNhcEFsbENobmxMaXN0LmNoYW5uZWxMaXN0W2NvdW50XS5jaGFubmVsID0KKwkJCQlyZl9jaGFubmVsc1tpXS5jaGFubmVsTnVtOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCQkJICAiJXNbJWRdIENIQU5ORUwgPSAlZCIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkgIHNhcENvbnRleHQtPlNhcEFsbENobmxMaXN0LmNoYW5uZWxMaXN0W2NvdW50XS4KKwkJCQkgIGNoYW5uZWwpOworCQkJc2FwQ29udGV4dC0+U2FwQWxsQ2hubExpc3QuY2hhbm5lbExpc3RbY291bnRdLnZhbGlkID0KKwkJCQl0cnVlOworCQkJY291bnQrKzsKKwkJfQorCX0KKworCXNhcENvbnRleHQtPlNhcEFsbENobmxMaXN0Lm51bUNoYW5uZWwgPSBjb3VudDsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXNbJWRdIE5VTUJFUiBPRiBDSEFOTkVMUyBjb3VudCA9ICVkIgorCQkgICJzYXBDb250ZXh0LT5TYXBBbGxDaG5sTGlzdC5udW1DaGFubmVsID0gJWQiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgY291bnQsCisJCSAgc2FwQ29udGV4dC0+U2FwQWxsQ2hubExpc3QubnVtQ2hhbm5lbCk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmFuZG9tbHkgc2VsZWN0cyB0aGUgY2hhbm5lbCB0byBzd2l0Y2ggYWZ0ZXIgdGhlIGRldGVjdGlvbgorICogb2YgcmFkYXIKKyAqIHBhcmFtIHNhcENvbnRleHQgLSBzYXAgY29udGV4dAorICogZGZzX2V2ZW50IC0gRGZzIGluZm9ybWF0aW9uIGZyb20gREZTCisgKiByZXR1cm4gLSBjaGFubmVsIHRvIHdoaWNoIEFQIHdpc2hlcyB0byBzd2l0Y2gKKyAqLwordWludDhfdCBzYXBfaW5kaWNhdGVfcmFkYXIocHRTYXBDb250ZXh0IHNhcENvbnRleHQsCisJCQkgICB0U2lyU21lRGZzRXZlbnRJbmQgKmRmc19ldmVudCkKK3sKKwl1aW50OF90IHRhcmdldF9jaGFubmVsID0gMDsKKwl0SGFsSGFuZGxlIGhIYWw7CisJdHBBbmlTaXJHbG9iYWwgcE1hYzsKKworCWlmIChOVUxMID09IHNhcENvbnRleHQgfHwgTlVMTCA9PSBkZnNfZXZlbnQpIHsKKwkJLyogSW52YWxpZCBzYXAgY29udGV4dCBvZiBkZnMgZXZlbnQgcGFzc2VkICovCisJCXJldHVybiAwOworCX0KKwloSGFsID0gQ0RTX0dFVF9IQUxfQ0Ioc2FwQ29udGV4dC0+cF9jZHNfZ2N0eCk7CisKKwlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW4gJXMgaW52YWxpZCBoSGFsIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKCFkZnNfZXZlbnQtPmRmc19yYWRhcl9zdGF0dXMpIHsKKwkJLypkZnMgc3RhdHVzIGRvZXMgbm90IGluZGljYXRlIGEgcmFkYXIgb24gdGhlIGNoYW5uZWwtLSBGYWxzZSBBbGFybSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFNBUCBuZWVkcyB0byBnZW5lcmF0ZSBDaGFubmVsIFN3aXRjaCBJRQorCSAqIGlmIHRoZSByYWRhciBpcyBmb3VuZCBpbiB0aGUgU1RBUlRFRCBzdGF0ZQorCSAqLworCWlmIChlU0FQX1NUQVJURUQgPT0gc2FwQ29udGV4dC0+c2Fwc01hY2hpbmUpCisJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLmNzYUlFUmVxdWlyZWQgPSBlU0FQX1RSVUU7CisKKwlpZiAoc2FwQ29udGV4dC0+Y3NyX3JvYW1Qcm9maWxlLmRpc2FibGVERlNDaFN3aXRjaCkgeworCQlyZXR1cm4gc2FwQ29udGV4dC0+Y2hhbm5lbDsKKwl9CisKKwkvKiBzZXQgdGhlIFJhZGFyIEZvdW5kIGZsYWcgaW4gU2FwRGZzSW5mbyAqLworCXBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcF9yYWRhcl9mb3VuZF9zdGF0dXMgPSB0cnVlOworCisJc2FwX2dldDVfZ19oel9jaGFubmVsX2xpc3Qoc2FwQ29udGV4dCk7CisKKwlpZiAoZGZzX2V2ZW50LT5jaGFuX2xpc3QubmNoYW5uZWxzID4gU0lSX0RGU19NQVhfMjBNX1NVQl9DSCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICBGTCgibmNoYW5uZWxzID5TSVJfREZTX01BWF8yME1fU1VCX0NIIHNvIHJlc2V0dGluZyIpKTsKKwkJZGZzX2V2ZW50LT5jaGFuX2xpc3QubmNoYW5uZWxzID0gU0lSX0RGU19NQVhfMjBNX1NVQl9DSDsKKwl9CisKKwlzYXBfbWFya19kZnNfY2hhbm5lbHMoc2FwQ29udGV4dCwgZGZzX2V2ZW50LT5jaGFuX2xpc3QuY2hhbm5lbHMsCisJCQkgICAgICBkZnNfZXZlbnQtPmNoYW5fbGlzdC5uY2hhbm5lbHMsCisJCQkgICAgICBjZHNfZ2V0X21vbm90b25pY19ib290dGltZSgpKTsKKworCS8qCisJICogKDEpIHNraXAgc3RhdGljIHR1cmJvIGNoYW5uZWwgYXMgaXQgd2lsbCByZXF1aXJlIFNUQSB0byBiZSBpbgorCSAqIHN0YXRpYyB0dXJibyB0byB3b3JrLgorCSAqICgyKSBza2lwIGNoYW5uZWwgd2hpY2gncyBtYXJrZWQgd2l0aCByYWRhciBkZXRjdGlvbgorCSAqICgzKSBXQVI6IHdlIGFsbG93IHVzZXIgdG8gY29uZmlnIG5vdCB0byB1c2UgYW55IERGUyBjaGFubmVsCisJICogKDQpIFdoZW4gd2UgcGljayBhIGNoYW5uZWwsIHNraXAgZXhjbHVkZWQgMTFEIGNoYW5uZWxzCisJICogKDUpIENyZWF0ZSB0aGUgYXZhaWxhYmxlIGNoYW5uZWwgbGlzdCB3aXRoIHRoZSBhYm92ZSBydWxlcworCSAqLworCisJdGFyZ2V0X2NoYW5uZWwgPSBzYXBfcmFuZG9tX2NoYW5uZWxfc2VsKHNhcENvbnRleHQpOworCWlmICgwID09IHRhcmdldF9jaGFubmVsKSB7CisJCXNhcF9zaWduYWxfaGRkX2V2ZW50KHNhcENvbnRleHQsIE5VTEwsCisJCQkJICAgICBlU0FQX0RGU19OT19BVkFJTEFCTEVfQ0hBTk5FTCwKKwkJCQkgICAgICh2b2lkICopIGVTQVBfU1RBVFVTX1NVQ0NFU1MpOworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkgIEZMKCJzYXBkZnM6IE5ldyBzZWxlY3RlZCB0YXJnZXQgY2hhbm5lbCBpcyBbJWRdIiksCisJCSAgdGFyZ2V0X2NoYW5uZWwpOworCXJldHVybiB0YXJnZXRfY2hhbm5lbDsKK30KKworLyoKKyAqIENBQyB0aW1lciBjYWxsYmFjayBmdW5jdGlvbi4KKyAqIFBvc3QgZVNBUF9ERlNfQ0hBTk5FTF9DQUNfRU5EIGV2ZW50IHRvIHNhcF9mc20oKS4KKyAqLwordm9pZCBzYXBfZGZzX2NhY190aW1lcl9jYWxsYmFjayh2b2lkICpkYXRhKQoreworCXB0U2FwQ29udGV4dCBzYXBDb250ZXh0OworCXRXTEFOX1NBUEV2ZW50IHNhcEV2ZW50OworCXRIYWxIYW5kbGUgaEhhbCA9ICh0SGFsSGFuZGxlKSBkYXRhOworCXRwQW5pU2lyR2xvYmFsIHBNYWM7CisKKwlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW4gJXMgaW52YWxpZCBoSGFsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlzYXBDb250ZXh0ID0gc2FwX2ZpbmRfdmFsaWRfY29uY3VycmVudF9zZXNzaW9uKGhIYWwpOworCisJaWYgKE5VTEwgPT0gc2FwQ29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkluICVzIG5vIFNBUCBjb250ZXh0cyBhcmUgZm91bmQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayB0byBlbnN1cmUgdGhhdCBTQVAgaXMgaW4gREZTIFdBSVQgc3RhdGUgKi8KKwlpZiAoc2FwQ29udGV4dC0+c2Fwc01hY2hpbmUgPT0gZVNBUF9ERlNfQ0FDX1dBSVQpIHsKKwkJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcF9kZnNfY2FjX3RpbWVyKTsKKwkJcE1hYy0+c2FwLlNhcERmc0luZm8uaXNfZGZzX2NhY190aW1lcl9ydW5uaW5nID0gZmFsc2U7CisKKwkJLyoKKwkJICogQ0FDIENvbXBsZXRlLCBwb3N0IGVTQVBfREZTX0NIQU5ORUxfQ0FDX0VORCB0byBzYXBfZnNtCisJCSAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgInNhcGRmczogU2VuZGluZyBlU0FQX0RGU19DSEFOTkVMX0NBQ19FTkQgZm9yIHRhcmdldF9jaGFubmVsID0gJWQgb24gc2FwY3R4WyVwXSIsCisJCQkgIHNhcENvbnRleHQtPmNoYW5uZWwsIHNhcENvbnRleHQpOworCisJCXNhcEV2ZW50LmV2ZW50ID0gZVNBUF9ERlNfQ0hBTk5FTF9DQUNfRU5EOworCQlzYXBFdmVudC5wYXJhbXMgPSAwOworCQlzYXBFdmVudC51MSA9IDA7CisJCXNhcEV2ZW50LnUyID0gMDsKKworCQlzYXBfZnNtKHNhcENvbnRleHQsICZzYXBFdmVudCk7CisJfQorCit9CisKKy8qCisgKiBGdW5jdGlvbiB0byBzdG9wIHRoZSBERlMgQ0FDIFRpbWVyCisgKi8KK3N0YXRpYyBpbnQgc2FwX3N0b3BfZGZzX2NhY190aW1lcihwdFNhcENvbnRleHQgc2FwQ29udGV4dCkKK3sKKwl0SGFsSGFuZGxlIGhIYWw7CisJdHBBbmlTaXJHbG9iYWwgcE1hYzsKKwlpZiAoc2FwQ29udGV4dCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihzYXBDb250ZXh0LT5wX2Nkc19nY3R4KTsKKwlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW4gJXMgaW52YWxpZCBoSGFsIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKENERl9USU1FUl9TVEFURV9SVU5OSU5HICE9CisJICAgIGNkZl9tY190aW1lcl9nZXRfY3VycmVudF9zdGF0ZSgmcE1hYy0+c2FwLlNhcERmc0luZm8uCisJCQkJCSAgIHNhcF9kZnNfY2FjX3RpbWVyKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwljZGZfbWNfdGltZXJfc3RvcCgmcE1hYy0+c2FwLlNhcERmc0luZm8uc2FwX2Rmc19jYWNfdGltZXIpOworCXBNYWMtPnNhcC5TYXBEZnNJbmZvLmlzX2Rmc19jYWNfdGltZXJfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIHNhcF9pc19jaGFubmVsX2JvbmRpbmdfZXRzaV93ZWF0aGVyX2NoYW5uZWwoKSAtIGNoZWNrIHdlYXRoZXIgY2hhbiBib25kaW5nLgorICogQHNhcF9jb250ZXh0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FQIGNvbnRleHQKKyAqCisgKiBDaGVjayBpZiB0aGUgY3VycmVudCBTQVAgb3BlcmF0aW5nIGNoYW5uZWwgaXMgYm9uZGVkIHRvIHdlYXRoZXIgcmFkYXIKKyAqIGNoYW5uZWwgaW4gRVRTSSBkb21haW4uCisgKgorICogUmV0dXJuOiBUcnVlIGlmIGJvbmRlZCB0byB3ZWF0aGVyIGNoYW5uZWwgaW4gRVRTSQorICovCitzdGF0aWMgYm9vbAorc2FwX2lzX2NoYW5uZWxfYm9uZGluZ19ldHNpX3dlYXRoZXJfY2hhbm5lbChwdFNhcENvbnRleHQgc2FwX2NvbnRleHQpCit7CisJaWYgKElTX0NIX0JPTkRJTkdfV0lUSF9XRUFUSEVSX0NIKHNhcF9jb250ZXh0LT5jaGFubmVsKSAmJgorCSAgKHNhcF9jb250ZXh0LT5jaF9wYXJhbXMuY2hfd2lkdGggIT0gQ0hfV0lEVEhfMjBNSFopKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRvIHN0YXJ0IHRoZSBERlMgQ0FDIFRpbWVyCisgKiB3aGVuIFNBUCBpcyBzdGFydGVkIG9uIGEgREZTIGNoYW5uZWwKKyAqLworaW50IHNhcF9zdGFydF9kZnNfY2FjX3RpbWVyKHB0U2FwQ29udGV4dCBzYXBDb250ZXh0KQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQzMl90IGNhY1RpbWVPdXQ7CisJdEhhbEhhbmRsZSBoSGFsID0gTlVMTDsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gTlVMTDsKKwl1aW50OF90IGRmc19yZWdpb247CisKKwlpZiAoc2FwQ29udGV4dCA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKwloSGFsID0gQ0RTX0dFVF9IQUxfQ0Ioc2FwQ29udGV4dC0+cF9jZHNfZ2N0eCk7CisKKwlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiSW4gJXMgaW52YWxpZCBoSGFsIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKHBNYWMtPnNhcC5TYXBEZnNJbmZvLmlnbm9yZV9jYWMpIHsKKwkJLyoKKwkJICogSWYgVXNlciBoYXMgc2V0IHRvIGlnbm9yZSB0aGUgQ0FDCisJCSAqIHNvLCBjb250aW51ZSB3aXRob3V0IENBQyBUaW1lci4KKwkJICovCisJCXJldHVybiAyOworCX0KKwljYWNUaW1lT3V0ID0gREVGQVVMVF9DQUNfVElNRU9VVDsKKworCWNkc19nZXRfZGZzX3JlZ2lvbigmZGZzX3JlZ2lvbik7CisKKwlpZiAoKGRmc19yZWdpb24gPT0gREZTX0VUU0lfRE9NQUlOKQorCSAgICAmJiAoKElTX0VUU0lfV0VBVEhFUl9DSChzYXBDb250ZXh0LT5jaGFubmVsKSkgfHwKKwkJKHNhcF9pc19jaGFubmVsX2JvbmRpbmdfZXRzaV93ZWF0aGVyX2NoYW5uZWwoc2FwQ29udGV4dCkpKSkgeworCQljYWNUaW1lT3V0ID0gRVRTSV9XRUFUSEVSX0NIX0NBQ19USU1FT1VUOworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJICAic2FwZGZzOiBTQVBfREZTX0NIQU5ORUxfQ0FDX1NUQVJUIG9uIENIIC0gJWQsIENBQyBUSU1FT1VUIC0gJWQgc2VjIiwKKwkJICBzYXBDb250ZXh0LT5jaGFubmVsLCBjYWNUaW1lT3V0IC8gMTAwMCk7CisKKwljZGZfbWNfdGltZXJfaW5pdCgmcE1hYy0+c2FwLlNhcERmc0luZm8uc2FwX2Rmc19jYWNfdGltZXIsCisJCQkgIENERl9USU1FUl9UWVBFX1NXLAorCQkJICBzYXBfZGZzX2NhY190aW1lcl9jYWxsYmFjaywgKHZvaWQgKikgaEhhbCk7CisKKwkvKlN0YXJ0IHRoZSBDQUMgdGltZXIgKi8KKwlzdGF0dXMgPQorCQljZGZfbWNfdGltZXJfc3RhcnQoJnBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcF9kZnNfY2FjX3RpbWVyLAorCQkJCSAgIGNhY1RpbWVPdXQpOworCWlmIChzdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLmlzX2Rmc19jYWNfdGltZXJfcnVubmluZyA9IHRydWU7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIE5PTCBsaXN0CisgKiBwYXJhbWV0ZXJzIHJlcXVpcmVkIHRvIHRyYWNrIHRoZSByYWRhcgorICogZm91bmQgREZTIGNoYW5uZWxzIGluIHRoZSBjdXJyZW50IFJlZy4gRG9tYWluIC4KKyAqLworQ0RGX1NUQVRVUyBzYXBfaW5pdF9kZnNfY2hhbm5lbF9ub2xfbGlzdChwdFNhcENvbnRleHQgc2FwQ29udGV4dCkKK3sKKwl1aW50OF90IGNvdW50ID0gMDsKKwlpbnQgaTsKKwlib29sIGJGb3VuZCA9IGZhbHNlOworCXRIYWxIYW5kbGUgaEhhbDsKKwl0cEFuaVNpckdsb2JhbCBwTWFjOworCisJaWYgKE5VTEwgPT0gc2FwQ29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkludmFsaWQgc2FwQ29udGV4dCBwb2ludGVyIG9uIHNhcF9pbml0X2Rmc19jaGFubmVsX25vbF9saXN0Iik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihzYXBDb250ZXh0LT5wX2Nkc19nY3R4KTsKKworCWlmIChOVUxMID09IGhIYWwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJJbiAlcyBpbnZhbGlkIGhIYWwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCXBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCS8qIHRvIGluZGljYXRlIGhkZCB0byBnZXQgY25zcyBkZnMgbm9sICovCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBDb250ZXh0LCBOVUxMLAorCQkJCQkJICAgICAgIGVTQVBfREZTX05PTF9HRVQsCisJCQkJCQkgICAgICAgKHZvaWQgKikKKwkJCQkJCSAgICAgICBlU0FQX1NUQVRVU19TVUNDRVNTKSkgeworCQliRm91bmQgPSB0cnVlOworCX0KKworCWZvciAoaSA9IFJGX0NIQU5fMzY7IGkgPD0gUkZfQ0hBTl8xNjU7IGkrKykgeworCQlpZiAocmVnX2NoYW5uZWxzW2ldLmVuYWJsZWQgPT0gQ0hBTk5FTF9TVEFURV9ERlMpIHsKKwkJCS8qIGlmIGRmcyBub2wgaXMgbm90IGZvdW5kLCBpbml0aWFsaXplIGl0ICovCisJCQlpZiAoIWJGb3VuZCkgeworCQkJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcERmc0NoYW5uZWxOb2xMaXN0W2NvdW50XQorCQkJCS5kZnNfY2hhbm5lbF9udW1iZXIgPQorCQkJCQlyZl9jaGFubmVsc1tpXS5jaGFubmVsTnVtOworCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCQkJICAiJXM6IENIQU5ORUwgPSAlZCIsIF9fZnVuY19fLAorCQkJCQkgIHBNYWMtPnNhcC5TYXBEZnNJbmZvLgorCQkJCQkgIHNhcERmc0NoYW5uZWxOb2xMaXN0W2NvdW50XS4KKwkJCQkJICBkZnNfY2hhbm5lbF9udW1iZXIpOworCisJCQkJcE1hYy0+c2FwLlNhcERmc0luZm8uc2FwRGZzQ2hhbm5lbE5vbExpc3RbY291bnRdCisJCQkJLnJhZGFyX3N0YXR1c19mbGFnID0KKwkJCQkJZVNBUF9ERlNfQ0hBTk5FTF9VU0FCTEU7CisJCQkJcE1hYy0+c2FwLlNhcERmc0luZm8uc2FwRGZzQ2hhbm5lbE5vbExpc3RbY291bnRdCisJCQkJLnJhZGFyX2ZvdW5kX3RpbWVzdGFtcCA9IDA7CisJCQl9CisJCQljb3VudCsrOworCQl9CisJfQorCisJcE1hYy0+c2FwLlNhcERmc0luZm8ubnVtQ3VycmVudFJlZ0RvbWFpbkRmc0NoYW5uZWxzID0gY291bnQ7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJICAiJXNbJWRdIE5VTUJFUiBPRiBERlMgQ0hBTk5FTFMgPSAlZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLAorCQkgIHBNYWMtPnNhcC5TYXBEZnNJbmZvLm51bUN1cnJlbnRSZWdEb21haW5EZnNDaGFubmVscyk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBob3cgbWFueSBpbnRlcmZhY2VzCisgKiBoYXZlIHNhcCBwZXJzb25hIGFuZCByZXR1cm5zIHRvdGFsIG51bWJlciBvZiBzYXAgcGVyc29uYS4KKyAqLwordWludDhfdCBzYXBfZ2V0X3RvdGFsX251bWJlcl9zYXBfaW50Zih0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXVpbnQ4X3QgaW50ZiA9IDA7CisJdWludDhfdCBpbnRmX2NvdW50ID0gMDsKKworCWZvciAoaW50ZiA9IDA7IGludGYgPCBTQVBfTUFYX05VTV9TRVNTSU9OOyBpbnRmKyspIHsKKwkJaWYgKCgoQ0RGX1NBUF9NT0RFID09IHBNYWMtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnNhcFBlcnNvbmEpCisJCSAgICB8fAorCQkgICAgKENERl9QMlBfR09fTU9ERSA9PSBwTWFjLT5zYXAuc2FwQ3R4TGlzdFtpbnRmXS5zYXBQZXJzb25hKSkKKwkJICAgICYmIHBNYWMtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnBTYXBDb250ZXh0ICE9IE5VTEwpIHsKKwkJCWludGZfY291bnQrKzsKKwkJfQorCX0KKwlyZXR1cm4gaW50Zl9jb3VudDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBmaW5kIHRoZSBjb25jdXJyZW50IHNhcCBjb250ZXh0IGFwYXJ0IGZyb20KKyAqIHBhc3NlZCBzYXAgY29udGV4dCBhbmQgcmV0dXJuIGl0cyBjaGFubmVsIGNoYW5nZSByZWFkeSBzdGF0dXMKKyAqLworYm9vbCBpc19jb25jdXJyZW50X3NhcF9yZWFkeV9mb3JfY2hhbm5lbF9jaGFuZ2UodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkJcHRTYXBDb250ZXh0IHNhcENvbnRleHQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXB0U2FwQ29udGV4dCBwU2FwQ29udGV4dDsKKwl1aW50OF90IGludGYgPSAwOworCisJZm9yIChpbnRmID0gMDsgaW50ZiA8IFNBUF9NQVhfTlVNX1NFU1NJT047IGludGYrKykgeworCQlpZiAoKChDREZfU0FQX01PREUgPT0gcE1hYy0+c2FwLnNhcEN0eExpc3RbaW50Zl0uc2FwUGVyc29uYSkKKwkJICAgIHx8CisJCSAgICAoQ0RGX1AyUF9HT19NT0RFID09IHBNYWMtPnNhcC5zYXBDdHhMaXN0W2ludGZdLnNhcFBlcnNvbmEpKQorCQkgICAgJiYgcE1hYy0+c2FwLnNhcEN0eExpc3RbaW50Zl0ucFNhcENvbnRleHQgIT0gTlVMTCkgeworCQkJcFNhcENvbnRleHQgPQorCQkJCShwdFNhcENvbnRleHQpIHBNYWMtPnNhcC5zYXBDdHhMaXN0W2ludGZdLgorCQkJCXBTYXBDb250ZXh0OworCQkJaWYgKHBTYXBDb250ZXh0ID09IHNhcENvbnRleHQpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgIEZMKCJzYXBDdHggbWF0Y2hlZCBbJXBdIiksCisJCQkJCSAgc2FwQ29udGV4dCk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgRkwKKwkJCQkJCSAgKCJjb25jdXJyZW50IHNhcEN0eFslcF0gZGlkbid0IG1hdGNoZSB3aXRoIFslcF0iKSwKKwkJCQkJICBwU2FwQ29udGV4dCwgc2FwQ29udGV4dCk7CisJCQkJcmV0dXJuIHBTYXBDb250ZXh0LT5pc19zYXBfcmVhZHlfZm9yX2NobmxfY2huZzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NhcC9zcmMvc2FwX2ZzbV9leHQuaCBiL2NvcmUvc2FwL3NyYy9zYXBfZnNtX2V4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOTg0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NhcC9zcmMvc2FwX2ZzbV9leHQuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGJ0YW1wRnNtLmNkZCAtIGRvIG5vdCBlZGl0IG1hbnVhbGx5Ki8KKy8qIEdlbmVyYXRlZCBvbjogVGh1IE9jdCAxNiAxNTo0MDozOSBQRFQgMjAwOCAqLworCisjaWZuZGVmIF9fU0FQRlNNX0VYVF9IX18KKyNkZWZpbmUgX19TQVBGU01fRVhUX0hfXworCisvKiBFdmVudHMgdGhhdCBjYW4gYmUgc2VudCB0byB0aGUgU0FQIHN0YXRlLW1hY2hpbmUgKi8KK3R5cGVkZWYgZW51bSB7CisJZVNBUF9USU1FUl9DT05ORUNUX0FDQ0VQVF9USU1FT1VUID0gMFUsCisJZVNBUF9NQUNfQ09OTkVDVF9DT01QTEVURUQsCisJZVNBUF9DSEFOTkVMX1NFTEVDVElPTl9GQUlMRUQsCisJZVNBUF9NQUNfQ09OTkVDVF9JTkRJQ0FUSU9OLAorCWVTQVBfTUFDX0tFWV9TRVRfU1VDQ0VTUywKKwllU0FQX1JTTl9GQUlMVVJFLAorCWVTQVBfTUFDX1NDQU5fQ09NUExFVEUsCisJZVNBUF9IRERfU1RBUlRfSU5GUkFfQlNTLAorCWVTQVBfTUFDX1JFQURZX0ZPUl9DT05ORUNUSU9OUywKKwllU0FQX01BQ19TVEFSVF9CU1NfU1VDQ0VTUywKKwllU0FQX01BQ19TVEFSVF9CU1NfRkFJTFVSRSwKKwllU0FQX1JTTl9TVUNDRVNTLAorCWVTQVBfTUFDX1NUQVJUX0ZBSUxTLAorCWVTQVBfSEREX1NUT1BfSU5GUkFfQlNTLAorCWVTQVBfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQywKKwllU0FQX0RGU19DSEFOTkVMX0NBQ19TVEFSVCwKKwllU0FQX0RGU19DSEFOTkVMX0NBQ19SQURBUl9GT1VORCwKKwllU0FQX0RGU19DSEFOTkVMX0NBQ19FTkQsCisJZVNBUF9ERlNfQ0hOTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX1NUQVJULAorCWVTQVBfT1BFUkFUSU5HX0NIQU5ORUxfQ0hBTkdFRCwKKwllU0FQX0NIQU5ORUxfU0VMRUNUSU9OX1JFVFJZLAorCisJZVNBUF9OT19NU0cKK30gZVNhcE1zZ190OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc2FwL3NyYy9zYXBfaW50ZXJuYWwuaCBiL2NvcmUvc2FwL3NyYy9zYXBfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTRjMjUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zYXAvc3JjL3NhcF9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNDMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFdMQU5fUUNUX1dMQU5TQVBfSU5URVJOQUxfSAorI2RlZmluZSBXTEFOX1FDVF9XTEFOU0FQX0lOVEVSTkFMX0gKKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW50ZXJuYWwgQVBJIGV4cG9zZWQgYnkgdGhlIHdsYW4gU0FQIFBBTCBsYXllcgorICogbW9kdWxlLgorICovCisKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAiY2RzX3BhY2tldC5oIgorCisvKiBQaWNrIHVwIHRoZSBDU1IgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiY3NyX2FwaS5oIgorI2luY2x1ZGUgInNhcF9hcGkuaCIKKyNpbmNsdWRlICJzYXBfZnNtX2V4dC5oIgorI2luY2x1ZGUgInNhcF9jaF9zZWxlY3QuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIERlZmluZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogREZTIE5vbiBPY2N1cGFuY3kgUGVyaW9kID0zMCBtaW51dGVzLCBpbiBtaWNyb3NlY29uZHMgKi8KKyNkZWZpbmUgU0FQX0RGU19OT05fT0NDVVBBTkNZX1BFUklPRCAgICAgICgzMCAqIDYwICogMTAwMCAqIDEwMDApCisKKyNkZWZpbmUgU0FQX0RFQlVHCisvKiBVc2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIHNlY3VyaXR5IG9uIHRoZSBCVC1BTVAgbGluayAqLworI2RlZmluZSBXTEFOU0FQX1NFQ1VSSVRZX0VOQUJMRURfU1RBVEUgdHJ1ZQorI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKy8qIFdoZW4gTUJTU0lEIGZlYXR1cmUgaXMgZW5hYmxlZCwgU0FQIGNvbnRleHQgaXMgZGlyZWN0bHkgcGFzc2VkIHRvIFNBUCBBUElzICovCisjZGVmaW5lIENEU19HRVRfU0FQX0NCKGN0eCkgKHB0U2FwQ29udGV4dCkoY3R4KQorI2Vsc2UKKy8qIEhvdyBkbyBJIGdldCBTQVAgY29udGV4dCBmcm9tIGNkcyBjb250ZXh0PyAqLworI2RlZmluZSBDRFNfR0VUX1NBUF9DQihjdHgpIGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1NBUCkKKyNlbmRpZgorCisjZGVmaW5lIENEU19HRVRfSEFMX0NCKGN0eCkgY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpCisvKiBNQUMgQWRkcmVzcyBsZW5ndGggKi8KKyNkZWZpbmUgQU5JX0VBUE9MX0tFWV9SU05fTk9OQ0VfU0laRSAgICAgIDMyCisKKyNkZWZpbmUgSVNfRVRTSV9XRUFUSEVSX0NIKF9jaCkgICAoKF9jaCA+PSAxMjApICYmIChfY2ggPD0gMTMwKSkKKyNkZWZpbmUgSVNfQ0hfQk9ORElOR19XSVRIX1dFQVRIRVJfQ0goX2NoKSAgIChfY2ggPT0gMTE2KQorI2RlZmluZSBJU19DSEFOX0pBUEFOX1c1MyhfY2gpICAgICgoX2NoID49IDUyKSAgJiYgKF9jaCA8PSA2NCkpCisjZGVmaW5lIElTX0NIQU5fSkFQQU5fSU5ET09SKF9jaCkgKChfY2ggPj0gMzYpICAmJiAoX2NoIDw9IDY0KSkKKyNkZWZpbmUgSVNfQ0hBTl9KQVBBTl9PVVRET09SKF9jaCkoKF9jaCA+PSAxMDApICYmIChfY2ggPD0gMTQwKSkKKyNkZWZpbmUgREVGQVVMVF9DQUNfVElNRU9VVCAoNjAgKiAxMDAwKSAvKiBtc2VjcyAtIDEgbWluICovCisjZGVmaW5lIEVUU0lfV0VBVEhFUl9DSF9DQUNfVElNRU9VVCAoMTAgKiA2MCAqIDEwMDApICAgIC8qIG1zZWNzIC0gMTAgbWluICovCisjZGVmaW5lIFNBUF9DSEFOX1BSRUZFUlJFRF9JTkRPT1IgIDEKKyNkZWZpbmUgU0FQX0NIQU5fUFJFRkVSUkVEX09VVERPT1IgMgorCitleHRlcm4gY29uc3Qgc1JlZ3VsYXRvcnlDaGFubmVsICpyZWdfY2hhbm5lbHM7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFR5cGVkZWZzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNTYXBDb250ZXh0IHRTYXBDb250ZXh0OworLyogdFNhcENvbnRleHQsICpwdFNhcENvbnRleHQ7ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUeXBlIERlY2xhcmF0aW9ucyAtIEZvciBpbnRlcm5hbCBTQVAgY29udGV4dCBpbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPcGFxdWUgU0FQIGNvbnRleHQgVHlwZSBEZWNsYXJhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBXZSB3ZXJlIG9ubHkgdXNpbmcgdGhpcyBzeW50YXgsIHdoZW4gdGhpcyB3YXMgdHJ1bHkgb3BhcXVlLiAqLworLyogKEkuRS4sIGl0IHdhcyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IGZpbGUuKSAqLworCisvKiBTQVAgRlNNIHN0YXRlcyBmb3IgQWNjZXNzIFBvaW50IHJvbGUgKi8KK3R5cGVkZWYgZW51bSB7CisJZVNBUF9ESVNDT05ORUNURUQsCisJZVNBUF9DSF9TRUxFQ1QsCisJZVNBUF9ERlNfQ0FDX1dBSVQsCisJZVNBUF9TVEFSVElORywKKwllU0FQX1NUQVJURUQsCisJZVNBUF9ESVNDT05ORUNUSU5HCit9IGVTYXBGc21TdGF0ZXNfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgU0FQIGNvbnRleHQgRGF0YSBUeXBlIERlY2xhcmF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFR5cGUgRGVjbGFyYXRpb25zIC0gUU9TIHJlbGF0ZWQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU0FQIFFPUyBjb25maWcgKi8KK3R5cGVkZWYgc3RydWN0IHNTYXBRb3NDZmcgeworCXVpbnQ4X3QgV21tSXNFbmFibGVkOworfSB0U2FwUW9zQ2ZnOworCit0eXBlZGVmIHN0cnVjdCBzU2FwQWNzQ2hhbm5lbEluZm8geworCXVpbnQzMl90IGNoYW5uZWxOdW07CisJdWludDMyX3Qgd2VpZ2h0OworfSB0U2FwQWNzQ2hhbm5lbEluZm87CisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKy8qCisgKiBJbiBhIHNldHVwIGhhdmluZyB0d28gTURNIGJvdGggb3BlcmF0aW5nIGluIEFQK0FQIE1DQyBzY2VuYXJpbworICogaWYgYm90aCB0aGUgQVAgZGVjaWRlcyB0byB1c2Ugc2FtZSBvciBjbG9zZSBjaGFubmVsIHNldCwgQ1RTIHRvCisgKiBzZWxmLCBtZWNoYW5pc20gaXMgY2F1c2luZyBpc3N1ZXMgd2l0aCBjb25uZWN0aXZpdHkuIEZvciB0aGlzLCBpdHMKKyAqIHByb3Bvc2VkIHRoYXQgMm5kIE1ETSBkZXZpY2VzIHdoaWNoIGNvbWVzIHVwIGxhdGVyIHNob3VsZCBkZXRlY3QKKyAqIHByZXNlbmNlIG9mIGZpcnN0IE1ETSBkZXZpY2UgdmlhIHNwZWNpYWwgUTJRIElFIHByZXNlbnQgaW4gYmVjb24KKyAqIGFuZCBhdm9pZCB0aG9zZSBjaGFubmVscyBtZW50aW9uZWQgaW4gSUUuCisgKgorICogRm9sbG93aW5nIHN0cnVjdCB3aWxsIGtlZXAgdGhpcyBpbmZvIGluIHNhcEN0eCBzdHJ1Y3QsIGFuZCB3aWxsIGJlIHVzZWQKKyAqIHRvIGF2b2lkIHN1Y2ggY2hhbm5lbHMgaW4gUmFuZG9tIENoYW5uZWwgU2VsZWN0IGluIGNhc2Ugb2YgcmFkYXIgaW5kLgorICovCitzdHJ1Y3Qgc2FwX2F2b2lkX2NoYW5uZWxzX2luZm8geworCWJvb2wgICAgICAgcHJlc2VudDsKKwl1aW50OF90ICAgIGNoYW5uZWxzW1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07Cit9OworI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCit0eXBlZGVmIHN0cnVjdCBzU2FwQ29udGV4dCB7CisKKwljZGZfbXV0ZXhfdCBTYXBHbG9iYWxMb2NrOworCisJLyogSW5jbHVkZSB0aGUgY3VycmVudCBjaGFubmVsIG9mIEFQICovCisJdWludDMyX3QgY2hhbm5lbDsKKwl1aW50MzJfdCBzZWNvbmRhcnlfY2g7CisKKwkvKiBJbmNsdWRlIHRoZSBTTUUoQ1NSKSBzZXNzaW9uSWQgaGVyZSAqLworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCisJLyogSW5jbHVkZSB0aGUga2V5IG1hdGVyaWFsIGZvciB0aGlzIHBoeXNpY2FsIGxpbmsgKi8KKwl1aW50OF90IGtleV90eXBlOworCXVpbnQ4X3Qga2V5X2xlbmd0aDsKKwl1aW50OF90IGtleV9tYXRlcmlhbFszMl07CisKKwkvKiBJbmNsdWRlIHRoZSBhc3NvY2lhdGlvbnMgTUFDIGFkZHJlc3NlcyAqLworCXVpbnQ4X3Qgc2VsZl9tYWNfYWRkcltDRFNfTUFDX0FERFJFU1NfTEVOXTsKKworCS8qIE93biBTU0lEICovCisJdWludDhfdCBvd25Tc2lkW01BWF9TU0lEX0xFTl07CisJdWludDMyX3Qgb3duU3NpZExlbjsKKworCS8qIEZsYWcgZm9yIHNpZ25hbGluZyBpZiBzZWN1cml0eSBpcyBlbmFibGVkICovCisJdWludDhfdCB1Y1NlY0VuYWJsZWQ7CisKKwkvKiBJbmNsdWRlIHRoZSBTTUUoQ1NSKSBjb250ZXh0IGhlcmUgKi8KKwl0Q3NyUm9hbVByb2ZpbGUgY3NyX3JvYW1Qcm9maWxlOworCXVpbnQzMl90IGNzcl9yb2FtSWQ7CisKKwkvKiBTYXAgc2Vzc2lvbiAqLworCWJvb2wgaXNTYXBTZXNzaW9uT3BlbjsKKworCS8qIFNBUCBldmVudCBDYWxsYmFjayB0byBoZGQgKi8KKwl0cFdMQU5fU0FQRXZlbnRDQiBwZm5TYXBFdmVudENhbGxiYWNrOworCisJLyogSW5jbHVkZSB0aGUgZW5jbG9zaW5nIENEUyBjb250ZXh0IGhlcmUgKi8KKwl2b2lkICpwX2Nkc19nY3R4OworCisJLyoKKwkgKiBJbmNsdWRlIHRoZSBzdGF0ZSBtYWNoaW5lIHN0cnVjdHVyZSBoZXJlLCBzdGF0ZSB2YXIgdGhhdCBrZWVwcworCSAqIHRyYWNrIG9mIHN0YXRlIG1hY2hpbmUKKwkgKi8KKwllU2FwRnNtU3RhdGVzX3Qgc2Fwc01hY2hpbmU7CisKKwkvKiBBY3R1YWwgc3RvcmFnZSBmb3IgQVAgYW5kIHNlbGYgKFNUQSkgU1NJRCAqLworCXRDc3JTU0lESW5mbyBTU0lETGlzdFsyXTsKKworCS8qIEFjdHVhbCBzdG9yYWdlIGZvciBBUCBic3NpZCAqLworCXN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzaWQ7CisKKwkvKiBNYWMgZmlsdGVyaW5nIHNldHRpbmdzICovCisJZVNhcE1hY0FkZHJBQ0wgZVNhcE1hY0FkZHJBY2xNb2RlOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgYWNjZXB0TWFjTGlzdFtNQVhfQUNMX01BQ19BRERSRVNTXTsKKwl1aW50OF90IG5BY2NlcHRNYWM7CisJc3RydWN0IGNkZl9tYWNfYWRkciBkZW55TWFjTGlzdFtNQVhfQUNMX01BQ19BRERSRVNTXTsKKwl1aW50OF90IG5EZW55TWFjOworCisJLyogUU9TIGNvbmZpZyAqLworCXRTYXBRb3NDZmcgU2FwUW9zQ2ZnOworCisJdm9pZCAqcFVzckNvbnRleHQ7CisKKwl1aW50MzJfdCBuU3RhV1BBUlNuUmVxSWVMZW5ndGg7CisJdWludDhfdCBwU3RhV3BhUnNuUmVxSUVbTUFYX0FTU09DX0lORF9JRV9MRU5dOworCXRTaXJBUFdQU0lFcyBBUFdQU0lFczsKKwl0U2lyUlNOaWUgQVBXUEFSU05JRXM7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCXVpbnQzMl90IG5TdGFXQVBJUmVxSWVMZW5ndGg7CisJdWludDhfdCBwU3RhV2FwaVJlcUlFW01BWF9BU1NPQ19JTkRfSUVfTEVOXTsKKyNlbmRpZgorCisJdWludDMyX3QgblN0YUFkZEllTGVuZ3RoOworCXVpbnQ4X3QgcFN0YUFkZElFW01BWF9BU1NPQ19JTkRfSUVfTEVOXTsKKwl1aW50OF90ICpjaGFubmVsTGlzdDsKKwl0U2FwQ2hhbm5lbExpc3RJbmZvIFNhcENobmxMaXN0OworCXVpbnQxNl90IGNoX3dpZHRoX29yaWc7CisJY2hhbl9wYXJhbXNfdCBjaF9wYXJhbXM7CisKKwkvKiBzZXNzaW9uIHRvIHNjYW4gKi8KKwlib29sIGlzU2NhblNlc3Npb25PcGVuOworCS8qCisJICogVGhpcyBsaXN0IG9mIGNoYW5uZWxzIHdpbGwgaG9sZCA1R2h6IGVuYWJsZWQsREZTIGluIHRoZQorCSAqIEN1cnJlbnQgUmVnRG9tYWluLlRoaXMgbGlzdCB3aWxsIGJlIHVzZWQgdG8gc2VsZWN0IGEgY2hhbm5lbCwKKwkgKiBmb3IgU0FQIHRvIHN0YXJ0IGluY2x1ZGluZyBhbnkgREZTIGNoYW5uZWwgYW5kIGFsc28gdG8gc2VsZWN0CisJICogYW55IHJhbmRvbSBjaGFubmVsWzVHaHotKE5PTi1ERlMvREZTKV0saWYgU0FQIGlzIG9wZXJhdGluZworCSAqIG9uIGEgREZTIGNoYW5uZWwgYW5kIGEgUkFEQVIgaXMgZGV0ZWN0ZWQgb24gdGhlIGNoYW5uZWwuCisJICovCisJdEFsbDVHQ2hhbm5lbExpc3QgU2FwQWxsQ2hubExpc3Q7CisKKwl0U2FwQWNzQ2hhbm5lbEluZm8gYWNzQmVzdENoYW5uZWxJbmZvOworCWJvb2wgZW5hYmxlT3ZlckxhcENoOworCXN0cnVjdCBzYXBfYWNzX2NmZyAqYWNzX2NmZzsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCXVpbnQ4X3QgY2Nfc3dpdGNoX21vZGU7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX1NUQV9BUF9NT0RFX0RGU19ESVNBQkxFKSB8fCBcCisJZGVmaW5lZChXTEFOX0ZFQVRVUkVfTUJTU0lEKQorCWJvb2wgZGZzX2NoX2Rpc2FibGU7CisjZW5kaWYKKwlib29sIGlzQ2FjRW5kTm90aWZpZWQ7CisJYm9vbCBpc0NhY1N0YXJ0Tm90aWZpZWQ7CisJYm9vbCBpc19zYXBfcmVhZHlfZm9yX2NobmxfY2huZzsKKworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCS8qCisJICogSW4gYSBzZXR1cCBoYXZpbmcgdHdvIE1ETSBib3RoIG9wZXJhdGluZyBpbiBBUCtBUCBNQ0Mgc2NlbmFyaW8KKwkgKiBpZiBib3RoIHRoZSBBUCBkZWNpZGVzIHRvIHVzZSBzYW1lIG9yIGNsb3NlIGNoYW5uZWwgc2V0LCBDVFMgdG8KKwkgKiBzZWxmLCBtZWNoYW5pc20gaXMgY2F1c2luZyBpc3N1ZXMgd2l0aCBjb25uZWN0aXZpdHkuIEZvciB0aGlzLCBpdHMKKwkgKiBwcm9wb3NlZCB0aGF0IDJuZCBNRE0gZGV2aWNlcyB3aGljaCBjb21lcyB1cCBsYXRlciBzaG91bGQgZGV0ZWN0CisJICogcHJlc2VuY2Ugb2YgZmlyc3QgTURNIGRldmljZSB2aWEgc3BlY2lhbCBRMlEgSUUgcHJlc2VudCBpbiBiZWNvbgorCSAqIGFuZCBhdm9pZCB0aG9zZSBjaGFubmVscyBtZW50aW9uZWQgaW4gSUUuCisJICoKKwkgKiB0aGlzIHN0cnVjdCBjb250YWlucyB0aGUgbGlzdCBvZiBjaGFubmVscyBvbiB3aGljaCBhbm90aGVyIE1ETSBBUAorCSAqIGluIE1DQyBtb2RlIHdlcmUgZGV0ZWN0ZWQuCisJICovCisJc3RydWN0IHNhcF9hdm9pZF9jaGFubmVsc19pbmZvIHNhcF9kZXRlY3RlZF9hdm9pZF9jaF9pZTsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKwkvKgorCSAqIHNhcF9zdGF0ZSwgc2FwX3N0YXR1cyBhcmUgY3JlYXRlZAorCSAqIHRvIGluZm9ybSB1cHBlciBsYXllcnMgYWJvdXQgQUNTIHNjYW4gc3RhdHVzLgorCSAqIERvbid0IHVzZSB0aGVzZSBtZW1iZXJzIGZvciBhbnlvdGhlciBwdXJwb3Nlcy4KKwkgKi8KKwllU2FwSGRkRXZlbnQgc2FwX3N0YXRlOworCWVTYXBTdGF0dXMgc2FwX3N0YXR1czsKKwl1aW50MzJfdCByb2NfaW5kX3NjYW5faWQ7Cit9ICpwdFNhcENvbnRleHQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEV4dGVybmFsIGRlY2xhcmF0aW9ucyBmb3IgZ2xvYmFsIGNvbnRleHQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogIFRoZSBtYWluIHBlci1QaHlzaWNhbCBMaW5rIChwZXIgV0xBTiBhc3NvY2lhdGlvbikgY29udGV4dC4gKi8KK2V4dGVybiBwdFNhcENvbnRleHQgZ3Bfc2FwX2N0eDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgU0FQIHN0YXRlIG1hY2hpbmUgZXZlbnQgZGVmaW5pdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBUaGUgZXZlbnQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBzV0xBTl9TQVBFdmVudCB7CisJLyogQSBWT0lEIHBvaW50ZXIgdHlwZSBmb3IgYWxsIHBvc3NpYmxlIGlucHV0cyAqLworCXZvaWQgKnBhcmFtczsKKwkvKiBTdGF0ZSBtYWNoaW5lIGlucHV0IGV2ZW50IG1lc3NhZ2UgKi8KKwl1aW50MzJfdCBldmVudDsKKwkvKiBpbnRyb2R1Y2VkIHRvIGhhbmRsZSBjc3Jfcm9hbV9jb21wbGV0ZUNhbGxiYWNrIHJvYW1TdGF0dXMgKi8KKwl1aW50MzJfdCB1MTsKKwkvKiBpbnRyb2R1Y2VkIHRvIGhhbmRsZSBjc3Jfcm9hbV9jb21wbGV0ZUNhbGxiYWNrIHJvYW1SZXN1bHQgKi8KKwl1aW50MzJfdCB1MjsKK30gdFdMQU5fU0FQRXZlbnQsICpwdFdMQU5fU0FQRXZlbnQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEb2N1bWVudGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUword2xhbnNhcF9zY2FuX2NhbGxiYWNrCisJKHRIYWxIYW5kbGUgaGFsSGFuZGxlLAorCXZvaWQgKnBDb250ZXh0LAorCXVpbnQ4X3Qgc2Vzc2lvbklkLCB1aW50MzJfdCBzY2FuSUQsIGVDc3JTY2FuU3RhdHVzIHNjYW5TdGF0dXMpOworCitDREZfU1RBVFVTCit3bGFuc2FwX3ByZV9zdGFydF9ic3NfYWNzX3NjYW5fY2FsbGJhY2soCisJdEhhbEhhbmRsZSBoYWxfaGFuZGxlLAorCXZvaWQgKnBjb250ZXh0LAorCXVpbnQ4X3Qgc2Vzc2lvbmlkLAorCXVpbnQzMl90IHNjYW5pZCwKKwllQ3NyU2NhblN0YXR1cyBzY2FuX3N0YXR1cworKTsKKworQ0RGX1NUQVRVUword2xhbnNhcF9yb2FtX2NhbGxiYWNrCisJKHZvaWQgKnBDb250ZXh0LAorCXRDc3JSb2FtSW5mbyAqcENzclJvYW1JbmZvLAorCXVpbnQzMl90IHJvYW1JZCwKKwllUm9hbUNtZFN0YXR1cyByb2FtU3RhdHVzLCBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0KTsKKworQ0RGX1NUQVRVUyB3bGFuc2FwX2NsZWFuX2NiKHB0U2FwQ29udGV4dCBwU2FwQ3R4LCB1aW50MzJfdCBmcmVlRmxhZyk7CitDREZfU1RBVFVTIFNhcEZzbShwdFNhcENvbnRleHQgc2FwQ29udGV4dCwgcHRXTEFOX1NBUEV2ZW50IHNhcEV2ZW50LAorCQkJIHVpbnQ4X3QgKnN0YXR1cyk7CisKK3ZvaWQKK3dsYW5zYXBfcG1jX2Z1bGxfcHdyX3JlcV9jYih2b2lkICpjYWxsYmFja0NvbnRleHQsIENERl9TVEFUVVMgc3RhdHVzKTsKKwordWludDhfdCBzYXBfc2VsZWN0X2NoYW5uZWwodEhhbEhhbmRsZSBoYWxIYW5kbGUsIHB0U2FwQ29udGV4dCBwU2FwQ3R4LAorCQkJICAgdFNjYW5SZXN1bHRIYW5kbGUgcFNjYW5SZXN1bHQpOworCitDREZfU1RBVFVTCitzYXBfc2lnbmFsX2hkZF9ldmVudChwdFNhcENvbnRleHQgc2FwQ29udGV4dCwKKwkJICB0Q3NyUm9hbUluZm8gKnBDc3JSb2FtSW5mbywKKwkJICBlU2FwSGRkRXZlbnQgc2FwSGRkZXZlbnQsIHZvaWQgKik7CisKK0NERl9TVEFUVVMgc2FwX2ZzbShwdFNhcENvbnRleHQgc2FwQ29udGV4dCwgcHRXTEFOX1NBUEV2ZW50IHNhcEV2ZW50KTsKKworZVNhcFN0YXR1cworc2FwY29udmVydF90b19jc3JfcHJvZmlsZSh0c2FwX0NvbmZpZ190ICpwY29uZmlnX3BhcmFtcywKKwkJICAgICAgIGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlLAorCQkgICAgICAgdENzclJvYW1Qcm9maWxlICpwcm9maWxlKTsKKwordm9pZCBzYXBfZnJlZV9yb2FtX3Byb2ZpbGUodENzclJvYW1Qcm9maWxlICpwcm9maWxlKTsKKworQ0RGX1NUQVRVUworc2FwX2lzX3BlZXJfbWFjX2FsbG93ZWQocHRTYXBDb250ZXh0IHNhcENvbnRleHQsIHVpbnQ4X3QgKnBlZXJNYWMpOworCit2b2lkCitzYXBfc29ydF9tYWNfbGlzdChzdHJ1Y3QgY2RmX21hY19hZGRyICptYWNMaXN0LCB1aW50OF90IHNpemUpOworCit2b2lkCitzYXBfYWRkX21hY190b19hY2woc3RydWN0IGNkZl9tYWNfYWRkciAqbWFjTGlzdCwgdWludDhfdCAqc2l6ZSwKKwkgICAgICAgdWludDhfdCAqcGVlck1hYyk7CisKK3ZvaWQKK3NhcF9yZW1vdmVfbWFjX2Zyb21fYWNsKHN0cnVjdCBjZGZfbWFjX2FkZHIgKm1hY0xpc3QsIHVpbnQ4X3QgKnNpemUsCisJCSAgICB1aW50OF90IGluZGV4KTsKKwordm9pZAorc2FwX3ByaW50X2FjbChzdHJ1Y3QgY2RmX21hY19hZGRyICptYWNMaXN0LCB1aW50OF90IHNpemUpOworCitlU2FwQm9vbAorc2FwX3NlYXJjaF9tYWNfbGlzdChzdHJ1Y3QgY2RmX21hY19hZGRyICptYWNMaXN0LCB1aW50OF90IG51bV9tYWMsCisJCSB1aW50OF90ICpwZWVyTWFjLCB1aW50OF90ICppbmRleCk7CisKK0NERl9TVEFUVVMgc2FwX2FjcXVpcmVfZ2xvYmFsX2xvY2socHRTYXBDb250ZXh0IHBTYXBDdHgpOworCitDREZfU1RBVFVTIHNhcF9yZWxlYXNlX2dsb2JhbF9sb2NrKHB0U2FwQ29udGV4dCBwU2FwQ3R4KTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAordm9pZCBzYXBfdXBkYXRlX3Vuc2FmZV9jaGFubmVsX2xpc3QocHRTYXBDb250ZXh0IHBTYXBDdHgpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DSF9BVk9JRCAqLworCit1aW50OF90CitzYXBfaW5kaWNhdGVfcmFkYXIocHRTYXBDb250ZXh0IHNhcENvbnRleHQsCisJCSB0U2lyU21lRGZzRXZlbnRJbmQgKmRmc19ldmVudCk7CisKK0NERl9TVEFUVVMgc2FwX2luaXRfZGZzX2NoYW5uZWxfbm9sX2xpc3QocHRTYXBDb250ZXh0IHNhcENvbnRleHQpOworCitib29sIHNhcF9kZnNfaXNfY2hhbm5lbF9pbl9ub2xfbGlzdChwdFNhcENvbnRleHQgc2FwQ29udGV4dCwKKwkJCQkgICAgdWludDhfdCBjaGFubmVsTnVtYmVyLAorCQkJCSAgICBlUGh5Q2hhbkJvbmRTdGF0ZSBjaGFuQm9uZFN0YXRlKTsKK3ZvaWQgc2FwX2Rmc19jYWNfdGltZXJfY2FsbGJhY2sodm9pZCAqZGF0YSk7CisKK3ZvaWQgc2FwX2NhY19yZXNldF9ub3RpZnkodEhhbEhhbmRsZSBoSGFsKTsKKworYm9vbCBzYXBfYWNzX2NoYW5uZWxfY2hlY2socHRTYXBDb250ZXh0IHNhcENvbnRleHQsIHVpbnQ4X3QgY2hhbm5lbE51bWJlcik7CisKK2Jvb2wKK3NhcF9jaGFubmVsX21hdHJpeF9jaGVjayhwdFNhcENvbnRleHQgc2FwQ29udGV4dCwKKwkJCSBlUGh5Q2hhbkJvbmRTdGF0ZSBjYk1vZGUsCisJCQkgdWludDhfdCB0YXJnZXRfY2hhbm5lbCk7CisKK2Jvb2wgaXNfY29uY3VycmVudF9zYXBfcmVhZHlfZm9yX2NoYW5uZWxfY2hhbmdlKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJCXB0U2FwQ29udGV4dAorCQkJCQkJc2FwQ29udGV4dCk7CisKK3VpbnQ4X3Qgc2FwX2dldF90b3RhbF9udW1iZXJfc2FwX2ludGYodEhhbEhhbmRsZSBoSGFsKTsKKworYm9vbCBzYXBfZGZzX2lzX3c1M19pbnZhbGlkKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBjaGFubmVsSUQpOworCitib29sIHNhcF9kZnNfaXNfY2hhbm5lbF9pbl9wcmVmZXJyZWRfbG9jYXRpb24odEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgICAgICB1aW50OF90IGNoYW5uZWxJRCk7CisKK0NERl9TVEFUVVMgc2FwX2dvdG9fY2hhbm5lbF9zZWwoCisJcHRTYXBDb250ZXh0IHNhcENvbnRleHQsCisJcHRXTEFOX1NBUEV2ZW50IHNhcEV2ZW50LAorCWJvb2wgc2FwX2RvX2Fjc19wcmVfc3RhcnRfYnNzKTsKKwordm9pZCBzYXBfY29uZmlnX2Fjc19yZXN1bHQodEhhbEhhbmRsZSBoYWwsIHB0U2FwQ29udGV4dCBzYXBfY3R4LAorCQkJCQkJCXVpbnQzMl90IHNlY19jaCk7CisvKioKKyAqIHNhcF9jaGVja19pbl9hdm9pZF9jaF9saXN0KCkgLSBjaGVja3MgaWYgZ2l2ZW4gY2hhbm5lbCBwcmVzZW50IGlzIGNoYW5uZWwKKyAqIGF2b2lkYW5jZSBsaXN0CisgKiBhdm9pZF9jaGFubmVsc19pbmZvIHN0cnVjdAorICogQHNhcF9jdHg6ICAgICAgICBzYXAgY29udGV4dC4KKyAqIEBjaGFubmVsOiAgICAgICAgY2hhbm5lbCB0byBiZSBjaGVja2VkIGluIHNhcF9jdHgncyBhdm9pZCBjaCBsaXN0CisgKgorICogc2FwX2N0eCBjb250YWlucyBzYXBfYXZvaWRfY2hfaW5mbyBzdHJjdXQgY29udGFpbmluZyB0aGUgbGlzdCBvZiBjaGFubmVscyBvbgorICogd2hpY2ggTURNIGRldmljZSdzIEFQIHdpdGggTUNDIHdhcyBkZXRlY3RlZC4gVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgZ2l2ZW4KKyAqIGNoYW5uZWwgaXMgcHJlc2VudCBpbiB0aGF0IGxpc3QuCisgKgorICogUmV0dXJuOiB0cnVlLCBpZiBjaGFubmVsIHdhcyBwcmVzZW50LCBmYWxzZSBvdGhlcnNpZS4KKyAqLworYm9vbAorc2FwX2NoZWNrX2luX2F2b2lkX2NoX2xpc3QocHRTYXBDb250ZXh0IHNhcF9jdHgsIHVpbnQ4X3QgY2hhbm5lbCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NhcC9zcmMvc2FwX21vZHVsZS5jIGIvY29yZS9zYXAvc3JjL3NhcF9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBlMjhiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zYXAvc3JjL3NhcF9tb2R1bGUuYwpAQCAtMCwwICsxLDMyNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgICAgICAgICAgIHNhcE1vZHVsZS5DCisgKiAgT1ZFUlZJRVc6CisgKiAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBTQVAgbW9kdWxlcworICogIGZ1bmN0aW9ucyBwcm92aWRpbmcgRVhURVJOQUwgQVBJcy4gSXQgaXMgYWxzbyB3aGVyZSB0aGUgZ2xvYmFsIFNBUCBtb2R1bGUKKyAqICBjb250ZXh0IGdldHMgaW5pdGlhbGlzZWQKKyAqICBERVBFTkRFTkNJRVM6CisgKiAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgImNkZl90cmFjZS5oIgorI2luY2x1ZGUgImNkZl91dGlsLmgiCisvKiBQaWNrIHVwIHRoZSBzbWUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIEFQSSAqLworI2luY2x1ZGUgInNtZV9hcGkuaCIKKworLyogU0FQIEFQSSBoZWFkZXIgZmlsZSAqLworCisjaW5jbHVkZSAic2FwX2ludGVybmFsLmgiCisjaW5jbHVkZSAic21lX2luc2lkZS5oIgorI2luY2x1ZGUgImNkc19pZWVlODAyMTFfY29tbW9uX2kuaCIKKyNpbmNsdWRlICJjZHNfcmVnZG9tYWluX2NvbW1vbi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU0FQX0RFQlVHCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdsb2JhbCBEYXRhIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRXh0ZXJuYWwgZGVjbGFyYXRpb25zIGZvciBnbG9iYWwgY29udGV4dAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgTm8hICBHZXQgdGhpcyBmcm9tIENEUy4gKi8KKy8qICBUaGUgbWFpbiBwZXItUGh5c2ljYWwgTGluayAocGVyIFdMQU4gYXNzb2NpYXRpb24pIGNvbnRleHQuICovCitwdFNhcENvbnRleHQgZ3Bfc2FwX2N0eDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgVmFyaWFibGUgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbGl6ZWQgRnVuY3Rpb24gRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRG9jdW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogd2xhbnNhcF9vcGVuKCkgLSBXTEFOIFNBUCBvcGVuIGZ1bmN0aW9uIGNhbGwKKyAqIEBwX2Nkc19nY3R4OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2RzIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzCisgKgorICogQ2FsbGVkIGF0IGRyaXZlciBpbml0aWFsaXphdGlvbiAoY2RzX29wZW4pLiBTQVAgd2lsbCBpbml0aWFsaXplCisgKiBhbGwgaXRzIGludGVybmFsIHJlc291cmNlcyBhbmQgd2lsbCB3YWl0IGZvciB0aGUgY2FsbCB0byBzdGFydCB0bworICogcmVnaXN0ZXIgd2l0aCB0aGUgb3RoZXIgbW9kdWxlcy4KKyAqCisgKiBSZXR1cm46IFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisgKgorICogI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKyAqICAgICAgICAgIHZvaWQgKjogUG9pbnRlciB0byB0aGUgU0FQIGNvbnRleHQKKyAqICNlbHNlCisgKiAgICAgICAgICBDREZfU1RBVFVTX0VfRkFVTFQ6IFBvaW50ZXIgdG8gU0FQIGNiIGlzIE5VTEwgOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CisgKiAgICAgICAgICBDREZfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKyAqICAjZW5kaWYKKyAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKK3ZvaWQgKgorI2Vsc2UKK0NERl9TVEFUVVMKKyNlbmRpZgord2xhbnNhcF9vcGVuKHZvaWQgKnBfY2RzX2djdHgpIHsKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IE5VTEw7CisKKwkvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJLyogYW1pY2FsbHkgYWxsb2NhdGUgdGhlIHNhcENvbnRleHQgKi8KKwlwU2FwQ3R4ID0gKHB0U2FwQ29udGV4dCkgY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTYXBDb250ZXh0KSk7CisjZWxzZQorCWlmIChOVUxMID09IHBfY2RzX2djdHgpIHsKKwkJQ0RGX0FTU0VSVChwX2Nkc19nY3R4KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgIEFsbG9jYXRlIChhbmQgc2FuaXR5IGNoZWNrPyEpIFNBUCBjb250cm9sIGJsb2NrCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwljZHNfYWxsb2NfY29udGV4dChwX2Nkc19nY3R4LCBDREZfTU9EVUxFX0lEX1NBUCwgKHZvaWQgKiopJnBTYXBDdHgsCisJCQkgIHNpemVvZih0U2FwQ29udGV4dCkpOworI2VuZGlmCisKKwlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwX2Nkc19nY3R4IiwgX19mdW5jX18pOworI2lmZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwkJcmV0dXJuIE5VTEw7CisjZWxzZQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworI2VuZGlmCisJfQorCisJY2RmX21lbV96ZXJvKHBTYXBDdHgsIHNpemVvZih0U2FwQ29udGV4dCkpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgQ2xlYW4gdXAgU0FQIGNvbnRyb2wgYmxvY2ssIGluaXRpYWxpemUgYWxsIHZhbHVlcworCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAid2xhbnNhcF9vcGVuIik7CisKKwl3bGFuc2FwX2NsZWFuX2NiKHBTYXBDdHgsIDApOyAvKmRvIG5vdCBlbXB0eSAqLworCisJLyogU2V0dXAgdGhlICJsaW5rIGJhY2siIHRvIHRoZSBDRFMgY29udGV4dCAqLworCXBTYXBDdHgtPnBfY2RzX2djdHggPSBwX2Nkc19nY3R4OworCisJLyogU3RvcmUgYSBwb2ludGVyIHRvIHRoZSBTQVAgY29udGV4dCBwcm92aWRlZCBieSBDRFMgKi8KKwlncF9zYXBfY3R4ID0gcFNhcEN0eDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIEFsbG9jYXRlIGludGVybmFsIHJlc291cmNlcworCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJcmV0dXJuIHBTYXBDdHg7CisjZWxzZQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisjZW5kaWYKK30gLyogd2xhbnNhcF9vcGVuICovCisKKy8qKgorICogd2xhbnNhcF9zdGFydCgpIC0gd2xhbiBzdGFydCBTQVAuCisgKiBAcEN0eDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIGNkcyBjb250ZXh0OyBhIGhhbmRsZSB0byBTQVAncworICogICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgKiAgICAgICAgV2hlbiBNQlNTSUQgZmVhdHVyZSBpcyBlbmFibGVkLCBTQVAgY29udGV4dCBpcyBkaXJlY3RseQorICogICAgICAgIHBhc3NlZCB0byBTQVAgQVBJcworICoKKyAqIENhbGxlZCBhcyBwYXJ0IG9mIHRoZSBvdmVyYWxsIHN0YXJ0IHByb2NlZHVyZSAoY2RzX2VuYWJsZSkuIFNBUCB3aWxsCisgKiB1c2UgdGhpcyBjYWxsIHRvIHJlZ2lzdGVyIHdpdGggVEwgYXMgdGhlIFNBUCBlbnRpdHkgZm9yIFNBUCBSU04gZnJhbWVzLgorICoKKyAqIFJldHVybjogVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBVUxUOiBQb2ludGVyIHRvIFNBUCBjYiBpcyBOVUxMOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQuCisgKiAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogU3VjY2VzcworICovCitDREZfU1RBVFVTIHdsYW5zYXBfc3RhcnQodm9pZCAqcEN0eCkKK3sKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IE5VTEw7CisKKwkvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAid2xhbnNhcF9zdGFydCBpbnZva2VkIHN1Y2Nlc3NmdWxseSIpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIFNhbml0eSBjaGVjaworCSAgICBFeHRyYWN0IFNBUCBjb250cm9sIGJsb2NrCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlwU2FwQ3R4ID0gQ0RTX0dFVF9TQVBfQ0IocEN0eCk7CisKKwlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwQ3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIEZvciBub3csIHByZXN1bWUgc2VjdXJpdHkgaXMgbm90IGVuYWJsZWQuCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXBTYXBDdHgtPnVjU2VjRW5hYmxlZCA9IFdMQU5TQVBfU0VDVVJJVFlfRU5BQkxFRF9TVEFURTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIE5vdyBjb25maWd1cmUgdGhlIHJvYW1pbmcgcHJvZmlsZSBsaW5rcy4gVG8gU1NJRCBhbmQgYnNzaWQuCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBXZSBoYXZlIHJvb20gZm9yIHR3byBTU0lEcy4gKi8KKwlwU2FwQ3R4LT5jc3Jfcm9hbVByb2ZpbGUuU1NJRHMubnVtT2ZTU0lEcyA9IDE7ICAgLyogVGhpcyBpcyB0cnVlIGZvciBub3cuICovCisJcFNhcEN0eC0+Y3NyX3JvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0ID0gcFNhcEN0eC0+U1NJRExpc3Q7ICAgICAvKiBBcnJheSBvZiB0d28gKi8KKwlwU2FwQ3R4LT5jc3Jfcm9hbVByb2ZpbGUuU1NJRHMuU1NJRExpc3RbMF0uU1NJRC5sZW5ndGggPSAwOworCXBTYXBDdHgtPmNzcl9yb2FtUHJvZmlsZS5TU0lEcy5TU0lETGlzdFswXS5oYW5kb2ZmUGVybWl0dGVkID0gZmFsc2U7CisJcFNhcEN0eC0+Y3NyX3JvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0WzBdLnNzaWRIaWRkZW4gPQorCQlwU2FwQ3R4LT5TU0lETGlzdFswXS5zc2lkSGlkZGVuOworCisJcFNhcEN0eC0+Y3NyX3JvYW1Qcm9maWxlLkJTU0lEcy5udW1PZkJTU0lEcyA9IDE7IC8qIFRoaXMgaXMgdHJ1ZSBmb3Igbm93LiAqLworCXBTYXBDdHgtPmNzcl9yb2FtUHJvZmlsZS5CU1NJRHMuYnNzaWQgPSAmcFNhcEN0eC0+YnNzaWQ7CisKKwkvKiBOb3cgY29uZmlndXJlIHRoZSBhdXRoIHR5cGUgaW4gdGhlIHJvYW1pbmcgcHJvZmlsZS4gVG8gb3Blbi4gKi8KKwlwU2FwQ3R4LT5jc3Jfcm9hbVByb2ZpbGUubmVnb3RpYXRlZEF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07ICAgICAgICAvKiBvcGVuIGlzIHRoZSBkZWZhdWx0ICovCisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfbXV0ZXhfaW5pdCgmcFNhcEN0eC0+U2FwR2xvYmFsTG9jaykpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAid2xhbnNhcF9zdGFydCBmYWlsZWQgaW5pdCBsb2NrIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bGFuc2FwX3N0b3AoKSAtIHN0b3AgU0FQIG1vZHVsZS4KKyAqIEBwQ3R4OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2RzIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIGNvbnRyb2wgYmxvY2sKKyAqICAgICAgICBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQuIFdoZW4gTUJTU0lEIGZlYXR1cmUgaXMgZW5hYmxlZCwKKyAqICAgICAgICBTQVAgY29udGV4dCBpcyBkaXJlY3RseSBwYXNzZWQgdG8gU0FQIEFQSXMKKyAqCisgKiBDYWxsZWQgYnkgY2RzX2Rpc2FibGUgdG8gc3RvcCBvcGVyYXRpb24gaW4gU0FQLCBiZWZvcmUgY2xvc2UuIFNBUCB3aWxsCisgKiBzdXNwZW5kIGFsbCBCVC1BTVAgUHJvdG9jb2wgQWRhcHRpb24gTGF5ZXIgb3BlcmF0aW9uIGFuZCB3aWxsIHdhaXQgZm9yIHRoZQorICogY2xvc2UgcmVxdWVzdCB0byBjbGVhbiB1cCBpdHMgcmVzb3VyY2VzLgorICoKKyAqIFJldHVybjogVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBVUxUOiBQb2ludGVyIHRvIFNBUCBjYiBpcyBOVUxMOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQuCisgKiAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogU3VjY2VzcworICovCitDREZfU1RBVFVTIHdsYW5zYXBfc3RvcCh2b2lkICpwQ3R4KQoreworCXB0U2FwQ29udGV4dCBwU2FwQ3R4ID0gTlVMTDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIFNhbml0eSBjaGVjaworCSAgICBFeHRyYWN0IFNBUCBjb250cm9sIGJsb2NrCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIndsYW5zYXBfc3RvcCBpbnZva2VkIHN1Y2Nlc3NmdWxseSAiKTsKKworCXBTYXBDdHggPSBDRFNfR0VUX1NBUF9DQihwQ3R4KTsKKwlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwQ3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXNhcF9mcmVlX3JvYW1fcHJvZmlsZSgmcFNhcEN0eC0+Y3NyX3JvYW1Qcm9maWxlKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9tdXRleF9kZXN0cm95KCZwU2FwQ3R4LT5TYXBHbG9iYWxMb2NrKSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJ3bGFuc2FwX3N0b3AgZmFpbGVkIGRlc3Ryb3kgbG9jayIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICBTdG9wIFNBUCAoZGUtcmVnaXN0ZXIgUlNOIGhhbmRsZXIhPykKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bGFuc2FwX2Nsb3NlIC0gY2xvc2UgU0FQIG1vZHVsZS4KKyAqIEBwQ3R4OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2RzIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIGNvbnRyb2wgYmxvY2sKKyAqICAgICAgICBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQuIFdoZW4gTUJTU0lEIGZlYXR1cmUgaXMgZW5hYmxlZCwKKyAqICAgICAgICBTQVAgY29udGV4dCBpcyBkaXJlY3RseSBwYXNzZWQgdG8gU0FQIEFQSXMuCisgKgorICogQ2FsbGVkIGJ5IGNkc19jbG9zZSBkdXJpbmcgZ2VuZXJhbCBkcml2ZXIgY2xvc2UgcHJvY2VkdXJlLiBTQVAgd2lsbCBjbGVhbiB1cAorICogYWxsIHRoZSBpbnRlcm5hbCByZXNvdXJjZXMuCisgKgorICogUmV0dXJuOiBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorICogICAgICAgICBDREZfU1RBVFVTX0VfRkFVTFQ6IFBvaW50ZXIgdG8gU0FQIGNiIGlzIE5VTEw7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAorICogICAgICAgICBDREZfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKyAqLworQ0RGX1NUQVRVUyB3bGFuc2FwX2Nsb3NlKHZvaWQgKnBDdHgpCit7CisJcHRTYXBDb250ZXh0IHBTYXBDdHggPSBOVUxMOworCisJLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICBTYW5pdHkgY2hlY2sKKwkgICAgRXh0cmFjdCBTQVAgY29udHJvbCBibG9jaworCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJ3bGFuc2FwX2Nsb3NlIGludm9rZWQiKTsKKworCXBTYXBDdHggPSBDRFNfR0VUX1NBUF9DQihwQ3R4KTsKKwlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwQ3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIENsZWFudXAgU0FQIGNvbnRyb2wgYmxvY2suCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIndsYW5zYXBfY2xvc2UiKTsKKwl3bGFuc2FwX2NsZWFuX2NiKHBTYXBDdHgsCisJCQkgdHJ1ZSk7IC8qIGVtcHR5IHF1ZXVlcy9saXN0cy9wa3RzIGlmIGFueSAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCWNkZl9tZW1fZnJlZShwU2FwQ3R4KTsKKyNlbHNlCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgRnJlZSBTQVAgY29udGV4dCBmcm9tIENEUyBnbG9iYWwKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWNkc19mcmVlX2NvbnRleHQocEN0eCwgQ0RGX01PRFVMRV9JRF9TQVAsIHBTYXBDdHgpOworI2VuZGlmCisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfSAvKiB3bGFuc2FwX2Nsb3NlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVXRpbGl0eSBGdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIHdsYW5zYXBfY2xlYW5fY2IoKSAtIGNsZWFuIFNBUCBjYWxsYmFjayBmdW5jdGlvbi4KKyAqIEBwQ3R4OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2RzIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIGNvbnRyb2wgYmxvY2sKKyAqICAgICAgICBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQuIFdoZW4gTUJTU0lEIGZlYXR1cmUgaXMgZW5hYmxlZCwKKyAqICAgICAgICBTQVAgY29udGV4dCBpcyBkaXJlY3RseSBwYXNzZWQgdG8gU0FQIEFQSXMuCisgKgorICogQ2xlYXIgb3V0IGFsbCBmaWVsZHMgaW4gdGhlIFNBUCBjb250ZXh0LgorICoKKyAqIFJldHVybjogVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBVUxUOiBQb2ludGVyIHRvIFNBUCBjYiBpcyBOVUxMOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKKyAqICAgICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiBTdWNjZXNzCisgKi8KK0NERl9TVEFUVVMgd2xhbnNhcF9jbGVhbl9jYihwdFNhcENvbnRleHQgcFNhcEN0eCwgdWludDMyX3QgZnJlZUZsYWcgICAgICAvKiAwIC8gKmRvIG5vdCBlbXB0eSogLyk7ICovCisJCQkgICAgKSB7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgU2FuaXR5IGNoZWNrIFNBUCBjb250cm9sIGJsb2NrCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICBDbGVhbiB1cCBTQVAgY29udHJvbCBibG9jaywgaW5pdGlhbGl6ZSBhbGwgdmFsdWVzCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIndsYW5zYXBfY2xlYW5fY2IiKTsKKworCWNkZl9tZW1femVybyhwU2FwQ3R4LCBzaXplb2YodFNhcENvbnRleHQpKTsKKworCXBTYXBDdHgtPnBfY2RzX2djdHggPSBOVUxMOworCisJcFNhcEN0eC0+c2Fwc01hY2hpbmUgPSBlU0FQX0RJU0NPTk5FQ1RFRDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6IEluaXRpYWxpemluZyBTdGF0ZTogJWQsIHNhcENvbnRleHQgdmFsdWUgPSAlcCIsIF9fZnVuY19fLAorCQkgIHBTYXBDdHgtPnNhcHNNYWNoaW5lLCBwU2FwQ3R4KTsKKwlwU2FwQ3R4LT5zZXNzaW9uSWQgPSAwOworCXBTYXBDdHgtPmNoYW5uZWwgPSAwOworCXBTYXBDdHgtPmlzU2FwU2Vzc2lvbk9wZW4gPSBlU0FQX0ZBTFNFOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30gLyogd2xhbnNhcF9jbGVhbl9jYiAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICB3bGFuc2FwX3BtY19mdWxsX3B3cl9yZXFfY2IKKworICAgREVTQ1JJUFRJT04KKyAgICBDYWxsYmFjayBwcm92aWRlIHRvIFBNQyBpbiB0aGUgcG1jX3JlcXVlc3RfZnVsbF9wb3dlciBBUEkuCisKKyAgIERFUEVOREVOQ0lFUworCisgICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIGNhbGxiYWNrQ29udGV4dDogIFRoZSB1c2VyIHBhc3NlZCBpbiBhIGNvbnRleHQgdG8gaWRlbnRpZnkKKyAgICBzdGF0dXM6ICAgICAgICAgICBUaGUgY2RmX3JldF9zdGF0dXMKKworICAgUkVUVVJOIFZBTFVFCisgICAgTm9uZQorCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZAord2xhbnNhcF9wbWNfZnVsbF9wd3JfcmVxX2NiKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgQ0RGX1NUQVRVUyBzdGF0dXMpCit7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCS8qIElmIHN1Y2Nlc3Mgd2hhdCBlbHNlIHRvIGJlIGhhbmRsZWQ/Pz8gKi8KKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIndsYW5zYXBfcG1jX2Z1bGxfcHdyX3JlcV9jYjogUE1DIGZhaWxlZCB0byBwdXQgdGhlIGNoaXAgaW4gRnVsbCBwb3dlciIpOworCisJfQorCit9IC8qIHdsYW5zYXBfcG1jX2Z1bGxfcHdyX3JlcV9jYiAqLworCisvKioKKyAqIHdsYW5zYXBfZ2V0X3N0YXRlKCkgLSBnZXQgU0FQIHN0YXRlCisgKiBAcEN0eDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIGNkcyBjb250ZXh0OyBhIGhhbmRsZSB0byBTQVAncyBjb250cm9sIGJsb2NrCisgKiAgICAgICAgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0LiBXaGVuIE1CU1NJRCBmZWF0dXJlIGlzIGVuYWJsZWQsCisgKiAgICAgICAgU0FQIGNvbnRleHQgaXMgZGlyZWN0bHkgcGFzc2VkIHRvIFNBUCBBUElzLgorICoKKyAqIFRoaXMgYXBpIHJldHVybnMgdGhlIGN1cnJlbnQgU0FQIHN0YXRlIHRvIHRoZSBjYWxsZXIuCisgKgorICogUmV0dXJuOiB1aW50OF90IC0gdGhlIFNBUCBGU00gc3RhdGUuCisgKi8KK3VpbnQ4X3Qgd2xhbnNhcF9nZXRfc3RhdGUodm9pZCAqcEN0eCkKK3sKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IE5VTEw7CisKKwlwU2FwQ3R4ID0gQ0RTX0dFVF9TQVBfQ0IocEN0eCk7CisKKwlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcEN0eCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisJcmV0dXJuIHBTYXBDdHgtPnNhcHNNYWNoaW5lOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICB3bGFuc2FwX2NoZWNrX2NjX2ludGYKKworICAgREVTQ1JJUFRJT04gUmVzdGFydCBTQVAgaWYgQ29uY3VycmVudCBDaGFubmVsIGludGVyZmVyaW5nCisKKyAgIERFUEVOREVOQ0lFUyBOQS4KKworICAgUEFSQU1FVEVSUworICAgSU4KKyAgIEN0eDogUG9pbnRlciB0byBjZHMgQ29udGV4dCBvciBTYXAgQ29udGV4dCBiYXNlZCBvbiBNQlNTSUQKKworICAgUkVUVVJOIFZBTFVFIE5PTkUKKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQxNl90IHdsYW5zYXBfY2hlY2tfY2NfaW50Zih2b2lkICpDdHgpCit7CisJdEhhbEhhbmRsZSBoSGFsOworCXVpbnQxNl90IGludGZfY2g7CisJcHRTYXBDb250ZXh0IHBTYXBDdHggPSBDRFNfR0VUX1NBUF9DQihDdHgpOworCisJaEhhbCA9ICh0SGFsSGFuZGxlKSBDRFNfR0VUX0hBTF9DQihwU2FwQ3R4LT5wX2Nkc19nY3R4KTsKKwlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgTUFDIGNvbnRleHQgZnJvbSBwX2Nkc19nY3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJaW50Zl9jaCA9IHNtZV9jaGVja19jb25jdXJyZW50X2NoYW5uZWxfb3ZlcmxhcChoSGFsLCAwLCAwLAorCQkJCQkJICAgICAgIHBTYXBDdHgtPmNjX3N3aXRjaF9tb2RlKTsKKwlyZXR1cm4gaW50Zl9jaDsKK30KKyNlbmRpZgorCisgLyoqCisgICogd2xhbnNhcF9zZXRfc2Nhbl9hY3NfY2hhbm5lbF9wYXJhbXMoKSAtIENvbmZpZyBzY2FuIGFuZCBjaGFubmVsIHBhcmFtZXRlcnMuCisgICogcGNvbmZpZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNBUCBjb25maWcKKyAgKiBwc2FwX2N0eDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgU0FQIENvbnRleHQuCisgICogcHVzcl9jb250ZXh0OiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciB0aGF0IHdpbGwgYmUgcGFzc2VkCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2sgaW4gYWxsIHRoZSBTQVAgY2FsbGJhY2sgZXZlbnRzLgorICAqCisgICogVGhpcyBhcGkgZnVuY3Rpb24gaXMgdXNlZCB0byBjb3B5IFNjYW4gYW5kIENoYW5uZWwgcGFyYW1ldGVycyBmcm9tIHNhcAorICAqIGNvbmZpZyB0byBzYXAgY29udGV4dC4KKyAgKgorICAqIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorICAqLworQ0RGX1NUQVRVUword2xhbnNhcF9zZXRfc2Nhbl9hY3NfY2hhbm5lbF9wYXJhbXModHNhcF9Db25maWdfdCAqcGNvbmZpZywKKwkJCQlwdFNhcENvbnRleHQgcHNhcF9jdHgsCisJCQkJdm9pZCAqcHVzcl9jb250ZXh0KQoreworCXRIYWxIYW5kbGUgaF9oYWwgPSBOVUxMOworCisJaWYgKE5VTEwgPT0gcGNvbmZpZykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSIlczogSW52YWxpZCBwY29uZmlnIHBhc3NlZCAiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJaWYgKE5VTEwgPT0gcHNhcF9jdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiJXM6IEludmFsaWQgcGNvbmZpZyBwYXNzZWQgIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCS8qIENoYW5uZWwgc2VsZWN0aW9uIGlzIGF1dG8gb3IgY29uZmlndXJlZCAqLworCXBzYXBfY3R4LT5jaGFubmVsID0gcGNvbmZpZy0+Y2hhbm5lbDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwlwc2FwX2N0eC0+Y2Nfc3dpdGNoX21vZGUgPSBwY29uZmlnLT5jY19zd2l0Y2hfbW9kZTsKKyNlbmRpZgorCXBzYXBfY3R4LT5wVXNyQ29udGV4dCA9IHB1c3JfY29udGV4dDsKKwlwc2FwX2N0eC0+ZW5hYmxlT3ZlckxhcENoID0gcGNvbmZpZy0+ZW5PdmVyTGFwQ2g7CisJcHNhcF9jdHgtPmFjc19jZmcgPSAmcGNvbmZpZy0+YWNzX2NmZzsKKwlwc2FwX2N0eC0+Y2hfd2lkdGhfb3JpZyA9IHBjb25maWctPmFjc19jZmcuY2hfd2lkdGg7CisJcHNhcF9jdHgtPnNlY29uZGFyeV9jaCA9IHBjb25maWctPnNlY19jaDsKKworCS8qCisJICogU2V0IHRoZSBCU1NJRCB0byB5b3VyICJzZWxmIE1BQyBBZGRyIiByZWFkCisJICogdGhlIG1hYyBhZGRyZXNzIGZyb20gQ29uZmlndWF0aW9uIElURU0gcmVjZWl2ZWQKKwkgKiBmcm9tIEhERAorCSAqLworCXBzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUuQlNTSURzLm51bU9mQlNTSURzID0gMTsKKwljZGZfbWVtX2NvcHkocHNhcF9jdHgtPmNzcl9yb2FtUHJvZmlsZS5CU1NJRHMuYnNzaWQsCisJCQlwc2FwX2N0eC0+c2VsZl9tYWNfYWRkciwKKwkJCXNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisKKwkvKgorCSAqIFNhdmUgYSBjb3B5IHRvIFNBUCBjb250ZXh0CisJICovCisJY2RmX21lbV9jb3B5KHBzYXBfY3R4LT5jc3Jfcm9hbVByb2ZpbGUuQlNTSURzLmJzc2lkLAorCQlwY29uZmlnLT5zZWxmX21hY2FkZHIuYnl0ZXMsIENERl9NQUNfQUREUl9TSVpFKTsKKwljZGZfbWVtX2NvcHkocHNhcF9jdHgtPnNlbGZfbWFjX2FkZHIsCisJCXBjb25maWctPnNlbGZfbWFjYWRkci5ieXRlcywgQ0RGX01BQ19BRERSX1NJWkUpOworCisJaF9oYWwgPSAodEhhbEhhbmRsZSlDRFNfR0VUX0hBTF9DQihwc2FwX2N0eC0+cF9jZHNfZ2N0eCk7CisJaWYgKE5VTEwgPT0gaF9oYWwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJIiVzOiBJbnZhbGlkIE1BQyBjb250ZXh0IGZyb20gcHZvc0dDdHgiLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJLyoKKwkJKiBJZiBjb25jdXJyZW50IHNlc3Npb24gaXMgcnVubmluZyB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZAorCQkqIHRoZW4gd2UganVzdCBmb2xsb3cgdGhhdCBzZXNzaW9ucyBjb3VudHJ5IGluZm8gKHdoZXRoZXIKKwkJKiBwcmVzZW50IG9yIG5vdCBkb2Vzbid0IG1hYXRlciBhcyB3ZSBoYXZlIHRvIGZvbGxvdyB3aGF0ZXZlcgorCQkqIFNUQSBzZXNzaW9uIGRvZXMpCisJCSovCisJCWlmICgoMCA9PSBzbWVfZ2V0X2NvbmN1cnJlbnRfb3BlcmF0aW9uX2NoYW5uZWwoaF9oYWwpKSAmJgorCQkJcGNvbmZpZy0+aWVlZTgwMjExZCkgeworCQkJLyogU2V0dGluZyB0aGUgcmVnaW9uL2NvdW50cnkgIGluZm9ybWF0aW9uICovCisJCQlzbWVfc2V0X3JlZ19pbmZvKGhfaGFsLCBwY29uZmlnLT5jb3VudHJ5Q29kZSk7CisJCQlzbWVfYXBwbHlfY2hhbm5lbF9wb3dlcl9pbmZvX3RvX2Z3KGhfaGFsKTsKKwkJfQorCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisvKioKKyAqIHdsYW5fc2FwX2dldF92aHRfY2hfd2lkdGgoKSAtIFJldHVybnMgU0FQIFZIVCBjaGFubmVsIHdpZHRoLgorICogQGN0eDoJUG9pbnRlciB0byBjZHMgQ29udGV4dCBvciBTYXAgQ29udGV4dCBiYXNlZCBvbiBNQlNTSUQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBTQVAgY3VycmVudCBWSFQgY2hhbm5lbCB3aXRoLgorICoKKyAqIFJldHVybjogVkhUIGNoYW5uZWwgd2lkdGgKKyAqLwordWludDMyX3Qgd2xhbl9zYXBfZ2V0X3ZodF9jaF93aWR0aCh2b2lkICpjdHgpCit7CisJcHRTYXBDb250ZXh0IHNhcF9jdHggPSBDRFNfR0VUX1NBUF9DQihjdHgpOworCisJaWYgKCFzYXBfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIkludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBjdHgiKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBzYXBfY3R4LT5jaF9wYXJhbXMuY2hfd2lkdGg7Cit9CisKKy8qKgorICogd2xhbl9zYXBfc2V0X3ZodF9jaF93aWR0aCgpIC0gU2V0cyBTQVAgVkhUIGNoYW5uZWwgd2lkdGguCisgKiBAY3R4OgkJUG9pbnRlciB0byBjZHMgQ29udGV4dCBvciBTYXAgQ29udGV4dCBiYXNlZCBvbiBNQlNTSUQKKyAqIEB2aHRfY2hhbm5lbF93aWR0aDoJU0FQIFZIVCBjaGFubmVsIHdpZHRoIHZhbHVlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgU0FQIGN1cnJlbnQgVkhUIGNoYW5uZWwgd2l0aC4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCB3bGFuX3NhcF9zZXRfdmh0X2NoX3dpZHRoKHZvaWQgKmN0eCwgdWludDMyX3Qgdmh0X2NoYW5uZWxfd2lkdGgpCit7CisJcHRTYXBDb250ZXh0IHNhcF9jdHggPSBDRFNfR0VUX1NBUF9DQihjdHgpOworCisJaWYgKCFzYXBfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIkludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBjdHgiKSk7CisJCXJldHVybjsKKwl9CisKKwlzYXBfY3R4LT5jaF9wYXJhbXMuY2hfd2lkdGggPSB2aHRfY2hhbm5lbF93aWR0aDsKK30KKworLyoqCisgKiB3bGFuc2FwX3N0YXJ0X2JzcygpIC0gc3RhcnQgQlNTCisgKiBAcEN0eDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIGNkcyBjb250ZXh0OyBhIGhhbmRsZSB0byBTQVAncyBjb250cm9sIGJsb2NrCisgKiAgICAgICAgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0LiBXaGVuIE1CU1NJRCBmZWF0dXJlIGlzIGVuYWJsZWQsCisgKiAgICAgICAgU0FQIGNvbnRleHQgaXMgZGlyZWN0bHkgcGFzc2VkIHRvIFNBUCBBUElzLgorICogQHBRY3RDb21taXRDb25maWc6IFBvaW50ZXIgdG8gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgcGFzc2VkIGRvd24gZnJvbQorICogICAgICAgICAgICAgICAgICAgIEhERChIb3N0QXBkIGZvciBBbmRyb2lkKQorICogQGhkZF9TYXBFdmVudENhbGxiYWNrOiBDYWxsYmFjayBmdW5jdGlvbiBpbiBIREQgY2FsbGVkIGJ5IFNBUCB0byBpbmZvcm0gSERECisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFib3V0IFNBUCByZXN1bHRzCisgKiBAcFVzckNvbnRleHQ6IFBhcmFtZXRlciB0aGF0IHdpbGwgYmUgcGFzc2VkIGJhY2sgaW4gYWxsIHRoZSBTQVAgY2FsbGJhY2sKKyAqICAgICAgICAgICAgICAgZXZlbnRzLgorICoKKyAqIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIFNBUCBGU00gZXZlbnQgZVdMQU5fU0FQX1BIWVNJQ0FMX0xJTktfQ1JFQVRFIGZvcgorICogc3RhcnRpbmcgQVAgQlNTCisgKgorICogUmV0dXJuOiBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorICogICAgICAgICBDREZfU1RBVFVTX0VfRkFVTFQ6IFBvaW50ZXIgdG8gU0FQIGNiIGlzIE5VTEw7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAorICogICAgICAgICBDREZfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKyAqLworQ0RGX1NUQVRVUyB3bGFuc2FwX3N0YXJ0X2Jzcyh2b2lkICpwQ3R4LCAgICAgLyogcHdleHRDdHggKi8KKwkJCSAgICAgdHBXTEFOX1NBUEV2ZW50Q0IgcFNhcEV2ZW50Q2FsbGJhY2ssCisJCQkgICAgIHRzYXBfQ29uZmlnX3QgKnBDb25maWcsIHZvaWQgKnBVc3JDb250ZXh0KSB7CisJdFdMQU5fU0FQRXZlbnQgc2FwRXZlbnQ7ICAgICAgICAvKiBTdGF0ZSBtYWNoaW5lIGV2ZW50ICovCisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXB0U2FwQ29udGV4dCBwU2FwQ3R4ID0gTlVMTDsKKwl0SGFsSGFuZGxlIGhIYWw7CisJdHBBbmlTaXJHbG9iYWwgcG1hYyA9IE5VTEw7CisKKwkvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIFNhbml0eSBjaGVjaworCSAgICBFeHRyYWN0IFNBUCBjb250cm9sIGJsb2NrCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoQ0RGX1NBUF9NT0RFID09IGNkc19nZXRfY29ucGFyYW0oKSkgeworCQlwU2FwQ3R4ID0gQ0RTX0dFVF9TQVBfQ0IocEN0eCk7CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAid2xhbnNhcF9zdGFydF9ic3M6IHNhcENvbnRleHQ9JXAiLCBwU2FwQ3R4KTsKKworCQlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwQ3R4IiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKwkJcFNhcEN0eC0+c2Fwc01hY2hpbmUgPSBlU0FQX0RJU0NPTk5FQ1RFRDsKKworCQkvKiBDaGFubmVsIHNlbGVjdGlvbiBpcyBhdXRvIG9yIGNvbmZpZ3VyZWQgKi8KKwkJcFNhcEN0eC0+Y2hhbm5lbCA9IHBDb25maWctPmNoYW5uZWw7CisJCXBTYXBDdHgtPmNoX3BhcmFtcy5jaF93aWR0aCA9IHBDb25maWctPmNoX3BhcmFtcy5jaF93aWR0aDsKKwkJcFNhcEN0eC0+Y2hfcGFyYW1zLmNlbnRlcl9mcmVxX3NlZzAgPQorCQkJcENvbmZpZy0+Y2hfcGFyYW1zLmNlbnRlcl9mcmVxX3NlZzA7CisJCXBTYXBDdHgtPmNoX3BhcmFtcy5jZW50ZXJfZnJlcV9zZWcxID0KKwkJCXBDb25maWctPmNoX3BhcmFtcy5jZW50ZXJfZnJlcV9zZWcxOworCQlwU2FwQ3R4LT5jaF9wYXJhbXMuc2VjX2NoX29mZnNldCA9CisJCQlwQ29uZmlnLT5jaF9wYXJhbXMuc2VjX2NoX29mZnNldDsKKwkJcFNhcEN0eC0+Y2hfd2lkdGhfb3JpZyA9IHBDb25maWctPmNoX3dpZHRoX29yaWc7CisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisJCXBTYXBDdHgtPmNjX3N3aXRjaF9tb2RlID0gcENvbmZpZy0+Y2Nfc3dpdGNoX21vZGU7CisjZW5kaWYKKwkJcFNhcEN0eC0+cFVzckNvbnRleHQgPSBwVXNyQ29udGV4dDsKKwkJcFNhcEN0eC0+ZW5hYmxlT3ZlckxhcENoID0gcENvbmZpZy0+ZW5PdmVyTGFwQ2g7CisJCXBTYXBDdHgtPmFjc19jZmcgPSAmcENvbmZpZy0+YWNzX2NmZzsKKwkJLyogU2V0IHRoZSBCU1NJRCB0byB5b3VyICJzZWxmIE1BQyBBZGRyIiByZWFkIHRoZSBtYWMgYWRkcmVzcyBmcm9tIENvbmZpZ3VhdGlvbiBJVEVNIHJlY2VpdmVkIGZyb20gSEREICovCisJCXBTYXBDdHgtPmNzcl9yb2FtUHJvZmlsZS5CU1NJRHMubnVtT2ZCU1NJRHMgPSAxOworCQljZGZfbWVtX2NvcHkocFNhcEN0eC0+Y3NyX3JvYW1Qcm9maWxlLkJTU0lEcy5ic3NpZCwKKwkJCSAgICAgcFNhcEN0eC0+c2VsZl9tYWNfYWRkciwgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKworCQkvKiBTYXZlIGEgY29weSB0byBTQVAgY29udGV4dCAqLworCQljZGZfbWVtX2NvcHkocFNhcEN0eC0+Y3NyX3JvYW1Qcm9maWxlLkJTU0lEcy5ic3NpZCwKKwkJCSAgICAgcENvbmZpZy0+c2VsZl9tYWNhZGRyLmJ5dGVzLCBDREZfTUFDX0FERFJfU0laRSk7CisJCWNkZl9tZW1fY29weShwU2FwQ3R4LT5zZWxmX21hY19hZGRyLAorCQkJICAgICBwQ29uZmlnLT5zZWxmX21hY2FkZHIuYnl0ZXMsIENERl9NQUNfQUREUl9TSVpFKTsKKworCQkvKiBjb3B5IHRoZSBjb25maWd1cmF0aW9uIGl0ZW1zIHRvIGNzclByb2ZpbGUgKi8KKwkJc2FwY29udmVydF90b19jc3JfcHJvZmlsZShwQ29uZmlnLCBlQ1NSX0JTU19UWVBFX0lORlJBX0FQLAorCQkJCSAgICAgICAmcFNhcEN0eC0+Y3NyX3JvYW1Qcm9maWxlKTsKKwkJaEhhbCA9ICh0SGFsSGFuZGxlKSBDRFNfR0VUX0hBTF9DQihwU2FwQ3R4LT5wX2Nkc19nY3R4KTsKKwkJaWYgKE5VTEwgPT0gaEhhbCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgIiVzOiBJbnZhbGlkIE1BQyBjb250ZXh0IGZyb20gcF9jZHNfZ2N0eCIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQl9IGVsc2UgeworCQkJLyogSWYgY29uY3VycmVudCBzZXNzaW9uIGlzIHJ1bm5pbmcgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgKi8KKwkJCS8qIHRoZW4gd2UganVzdCBmb2xsb3cgdGhhdCBzZXNzaW9ucyBjb3VudHJ5IGluZm8gKHdoZXRoZXIgKi8KKwkJCS8qIHByZXNlbnQgb3Igbm90IGRvZXNuJ3QgbWFhdGVyIGFzIHdlIGhhdmUgdG8gZm9sbG93IHdoYXRldmVyICovCisJCQkvKiBTVEEgc2Vzc2lvbiBkb2VzKSAqLworCQkJaWYgKCgwID09IHNtZV9nZXRfY29uY3VycmVudF9vcGVyYXRpb25fY2hhbm5lbChoSGFsKSkgJiYKKwkJCSAgICBwQ29uZmlnLT5pZWVlODAyMTFkKSB7CisJCQkJLyogU2V0dGluZyB0aGUgcmVnaW9uL2NvdW50cnkgIGluZm9ybWF0aW9uICovCisJCQkJc21lX3NldF9yZWdfaW5mbyhoSGFsLCBwQ29uZmlnLT5jb3VudHJ5Q29kZSk7CisJCQkJc21lX2FwcGx5X2NoYW5uZWxfcG93ZXJfaW5mb190b19mdyhoSGFsKTsKKwkJCX0KKwkJfQorCisJCXBtYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwkJaWYgKE5VTEwgPT0gcG1hYykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgIiVzOiBJbnZhbGlkIE1BQyBjb250ZXh0IGZyb20gcF9jZHNfZ2N0eCIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQl9CisJCS8qCisJCSAqIENvcHkgdGhlIERGUyBUZXN0IE1vZGUgc2V0dGluZyB0byBwbWFjIGZvcgorCQkgKiBhY2Nlc3MgaW4gbG93ZXIgbGF5ZXJzCisJCSAqLworCQlwbWFjLT5zYXAuU2FwRGZzSW5mby5kaXNhYmxlX2Rmc19jaF9zd2l0Y2ggPQorCQkJCQlwQ29uZmlnLT5kaXNhYmxlREZTQ2hTd2l0Y2g7CisKKwkJLyogQ29weSBNQUMgZmlsdGVyaW5nIHNldHRpbmdzIHRvIHNhcCBjb250ZXh0ICovCisJCXBTYXBDdHgtPmVTYXBNYWNBZGRyQWNsTW9kZSA9IHBDb25maWctPlNhcE1hY2FkZHJfYWNsOworCQljZGZfbWVtX2NvcHkocFNhcEN0eC0+YWNjZXB0TWFjTGlzdCwgcENvbmZpZy0+YWNjZXB0X21hYywKKwkJCSAgICAgc2l6ZW9mKHBDb25maWctPmFjY2VwdF9tYWMpKTsKKwkJcFNhcEN0eC0+bkFjY2VwdE1hYyA9IHBDb25maWctPm51bV9hY2NlcHRfbWFjOworCQlzYXBfc29ydF9tYWNfbGlzdChwU2FwQ3R4LT5hY2NlcHRNYWNMaXN0LCBwU2FwQ3R4LT5uQWNjZXB0TWFjKTsKKwkJY2RmX21lbV9jb3B5KHBTYXBDdHgtPmRlbnlNYWNMaXN0LCBwQ29uZmlnLT5kZW55X21hYywKKwkJCSAgICAgc2l6ZW9mKHBDb25maWctPmRlbnlfbWFjKSk7CisJCXBTYXBDdHgtPm5EZW55TWFjID0gcENvbmZpZy0+bnVtX2RlbnlfbWFjOworCQlzYXBfc29ydF9tYWNfbGlzdChwU2FwQ3R4LT5kZW55TWFjTGlzdCwgcFNhcEN0eC0+bkRlbnlNYWMpOworCQkvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgZm9yIEZTTSAqLworCQlzYXBFdmVudC5ldmVudCA9IGVTQVBfSEREX1NUQVJUX0lORlJBX0JTUzsKKwkJc2FwRXZlbnQucGFyYW1zID0gMDsgICAgLyogcFNhcFBoeXNMaW5rQ3JlYXRlICovCisKKwkJLyogU3RvcmUgdGhlIEhERCBjYWxsYmFjayBpbiBTQVAgY29udGV4dCAqLworCQlwU2FwQ3R4LT5wZm5TYXBFdmVudENhbGxiYWNrID0gcFNhcEV2ZW50Q2FsbGJhY2s7CisKKwkJLyogSGFuZGxlIGV2ZW50ICovCisJCWNkZl9zdGF0dXMgPSBzYXBfZnNtKHBTYXBDdHgsICZzYXBFdmVudCk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJTb2Z0QXAgcm9sZSBoYXMgbm90IGJlZW4gZW5hYmxlZCIpOworCX0KKworCXJldHVybiBjZGZfc3RhdHVzOworfSAvKiB3bGFuc2FwX3N0YXJ0X2JzcyAqLworCisvKioKKyAqIHdsYW5zYXBfc2V0X21hY19hY2woKSAtIHNldCBNQUMgbGlzdCBlbnRyeSBpbiBBQ0wuCisgKiBAcEN0eDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIGNkcyBjb250ZXh0OyBhIGhhbmRsZSB0byBTQVAncyBjb250cm9sIGJsb2NrCisgKiAgICAgICAgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0LiBXaGVuIE1CU1NJRCBmZWF0dXJlIGlzIGVuYWJsZWQsCisgKiAgICAgICAgU0FQIGNvbnRleHQgaXMgZGlyZWN0bHkgcGFzc2VkIHRvIFNBUCBBUElzLgorICogQHBDb25maWc6IFBvaW50ZXIgdG8gU0FQIGNvbmZpZy4KKyAqCisgKiBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBTQVAgdG8gc2V0IG1hYyBsaXN0IGVudHJ5IGluIGFjY2VwdCBsaXN0IGFzIHdlbGwKKyAqIGFzIGRlbnkgbGlzdAorICoKKyAqIFJldHVybjogVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBVUxUOiBQb2ludGVyIHRvIFNBUCBjYiBpcyBOVUxMOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKKyAqICAgICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiBTdWNjZXNzCisgKi8KK0NERl9TVEFUVVMgd2xhbnNhcF9zZXRfbWFjX2FjbCh2b2lkICpwQ3R4LCAgICAvKiBwd2V4dEN0eCAqLworCQkJICAgICAgIHRzYXBfQ29uZmlnX3QgKnBDb25maWcpIHsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJcHRTYXBDb250ZXh0IHBTYXBDdHggPSBOVUxMOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICJ3bGFuc2FwX3NldF9tYWNfYWNsIik7CisKKwlpZiAoQ0RGX1NBUF9NT0RFID09IGNkc19nZXRfY29ucGFyYW0oKSkgeworCQlwU2FwQ3R4ID0gQ0RTX0dFVF9TQVBfQ0IocEN0eCk7CisJCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBDdHgiLAorCQkJCSAgX19mdW5jX18pOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJfQorCQkvKiBDb3B5IE1BQyBmaWx0ZXJpbmcgc2V0dGluZ3MgdG8gc2FwIGNvbnRleHQgKi8KKwkJcFNhcEN0eC0+ZVNhcE1hY0FkZHJBY2xNb2RlID0gcENvbmZpZy0+U2FwTWFjYWRkcl9hY2w7CisKKwkJaWYgKGVTQVBfREVOWV9VTkxFU1NfQUNDRVBURUQgPT0gcFNhcEN0eC0+ZVNhcE1hY0FkZHJBY2xNb2RlKSB7CisJCQljZGZfbWVtX2NvcHkocFNhcEN0eC0+YWNjZXB0TWFjTGlzdCwKKwkJCQkgICAgIHBDb25maWctPmFjY2VwdF9tYWMsCisJCQkJICAgICBzaXplb2YocENvbmZpZy0+YWNjZXB0X21hYykpOworCQkJcFNhcEN0eC0+bkFjY2VwdE1hYyA9IHBDb25maWctPm51bV9hY2NlcHRfbWFjOworCQkJc2FwX3NvcnRfbWFjX2xpc3QocFNhcEN0eC0+YWNjZXB0TWFjTGlzdCwKKwkJCQkgICAgICAgcFNhcEN0eC0+bkFjY2VwdE1hYyk7CisJCX0gZWxzZSBpZiAoZVNBUF9BQ0NFUFRfVU5MRVNTX0RFTklFRCA9PQorCQkJICAgcFNhcEN0eC0+ZVNhcE1hY0FkZHJBY2xNb2RlKSB7CisJCQljZGZfbWVtX2NvcHkocFNhcEN0eC0+ZGVueU1hY0xpc3QsIHBDb25maWctPmRlbnlfbWFjLAorCQkJCSAgICAgc2l6ZW9mKHBDb25maWctPmRlbnlfbWFjKSk7CisJCQlwU2FwQ3R4LT5uRGVueU1hYyA9IHBDb25maWctPm51bV9kZW55X21hYzsKKwkJCXNhcF9zb3J0X21hY19saXN0KHBTYXBDdHgtPmRlbnlNYWNMaXN0LCBwU2FwQ3R4LT5uRGVueU1hYyk7CisJCX0KKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzIDogU29mdEFwIHJvbGUgaGFzIG5vdCBiZWVuIGVuYWJsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9IC8qIHdsYW5zYXBfc2V0X21hY19hY2wgKi8KKworLyoqCisgKiB3bGFuc2FwX3N0b3BfYnNzKCkgLSBzdG9wIEJTUy4KKyAqIEBwQ3R4OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2RzIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIGNvbnRyb2wgYmxvY2sKKyAqICAgICAgICBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQuIFdoZW4gTUJTU0lEIGZlYXR1cmUgaXMgZW5hYmxlZCwKKyAqICAgICAgICBTQVAgY29udGV4dCBpcyBkaXJlY3RseSBwYXNzZWQgdG8gU0FQIEFQSXMuCisgKgorICogVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgU0FQIEZTTSBldmVudCBlU0FQX0hERF9TVE9QX0lORlJBX0JTUyBmb3IKKyAqIHN0b3BwaW5nIEFQIEJTUworICoKKyAqIFJldHVybjogVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBVUxUOiBQb2ludGVyIHRvIFNBUCBjYiBpcyBOVUxMOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKKyAqICAgICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiBTdWNjZXNzCisgKi8KK0NERl9TVEFUVVMgd2xhbnNhcF9zdG9wX2Jzcyh2b2lkICpwQ3R4KQoreworCXRXTEFOX1NBUEV2ZW50IHNhcEV2ZW50OyAgICAgICAgLyogU3RhdGUgbWFjaGluZSBldmVudCAqLworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IE5VTEw7CisJLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICBTYW5pdHkgY2hlY2sKKwkgICAgRXh0cmFjdCBTQVAgY29udHJvbCBibG9jaworCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKE5VTEwgPT0gcEN0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBJbnZhbGlkIEdsb2JhbCBDRFMgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXBTYXBDdHggPSBDRFNfR0VUX1NBUF9DQihwQ3R4KTsKKworCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBDdHgiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlIGZvciBGU00gKi8KKwlzYXBFdmVudC5ldmVudCA9IGVTQVBfSEREX1NUT1BfSU5GUkFfQlNTOworCXNhcEV2ZW50LnBhcmFtcyA9IDA7CisKKwkvKiBIYW5kbGUgZXZlbnQgKi8KKwljZGZfc3RhdHVzID0gc2FwX2ZzbShwU2FwQ3R4LCAmc2FwRXZlbnQpOworCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogd2xhbnNhcF9nZXRfYXNzb2Nfc3RhdGlvbnMoKSAtIGdldCBsaXN0IG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMuCisgKiBAcEN0eDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIGNkcyBjb250ZXh0OyBhIGhhbmRsZSB0byBTQVAncyBjb250cm9sIGJsb2NrCisgKiAgICAgICAgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0LiBXaGVuIE1CU1NJRCBmZWF0dXJlIGlzIGVuYWJsZWQsCisgKiAgICAgICAgU0FQIGNvbnRleHQgaXMgZGlyZWN0bHkgcGFzc2VkIHRvIFNBUCBBUElzLgorICogQG1vZElkOiBNb2R1bGUgZnJvbSB3aG9tIGxpc3Qgb2YgYXNzb2NpdGF0ZWQgc3RhdGlvbnMgIGlzIHN1cHBvc2VkIHRvIGJlCisgKiAgICAgICAgIHByb2JlZC4gSWYgYW4gaW52YWxpZCBtb2R1bGUgaXMgcGFzc2VkIHRoZW4gYnkgZGVmYXVsdAorICogICAgICAgICBDREZfTU9EVUxFX0lEX1BFIHdpbGwgYmUgcHJvYmVkCisgKiBAcEFzc29jU3RhczogUG9pbnRlciB0byBsaXN0IG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgdGhhdCBhcmUga25vd24gdG8gdGhlCisgKiAgICAgICAgICAgICAgbW9kdWxlIHNwZWNpZmllZCBpbiBtb2QgcGFyYW1ldGVyCisgKgorICogVGhpcyBhcGkgZnVuY3Rpb24gaXMgdXNlZCB0byBwcm9iZSB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHN0YXRpb25zIGZyb20KKyAqIHZhcmlvdXMgbW9kdWxlcyBvZiBDT1JFIHN0YWNrCisgKiBOT1RFOiBUaGUgbWVtb3J5IGZvciB0aGlzIGxpc3Qgd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciBvZiB0aGlzIEFQSQorICoKKyAqIFJldHVybjogVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiBTdWNjZXNzCisgKi8KK0NERl9TVEFUVVMKK3dsYW5zYXBfZ2V0X2Fzc29jX3N0YXRpb25zCisJKHZvaWQgKnBDdHgsIENERl9NT0RVTEVfSUQgbW9kSWQsIHRwU2FwX0Fzc29jTWFjQWRkciBwQXNzb2NTdGFzKSB7CisJcHRTYXBDb250ZXh0IHBTYXBDdHggPSBDRFNfR0VUX1NBUF9DQihwQ3R4KTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgU2FuaXR5IGNoZWNrCisJICAgRXh0cmFjdCBTQVAgY29udHJvbCBibG9jaworCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKE5VTEwgPT0gcFNhcEN0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcEN0eCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlzbWVfcm9hbV9nZXRfYXNzb2NpYXRlZF9zdGFzKENEU19HRVRfSEFMX0NCKHBTYXBDdHgtPnBfY2RzX2djdHgpLAorCQkJCSAgICAgcFNhcEN0eC0+c2Vzc2lvbklkLCBtb2RJZCwKKwkJCQkgICAgIHBTYXBDdHgtPnBVc3JDb250ZXh0LAorCQkJCSAgICAgKHZvaWQgKiopIHBTYXBDdHgtPnBmblNhcEV2ZW50Q2FsbGJhY2ssCisJCQkJICAgICAodWludDhfdCAqKSBwQXNzb2NTdGFzKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd2xhbnNhcF9yZW1vdmVfd3BzX3Nlc3Npb25fb3ZlcmxhcCgpIC0gcmVtb3ZlIG92ZXJsYXBwaW5nIHdwcyBzZXNzaW9uLgorICogQHBDdHg6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjZHMgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgY29udHJvbCBibG9jaworICogICAgICAgIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dC4gV2hlbiBNQlNTSUQgZmVhdHVyZSBpcyBlbmFibGVkLAorICogICAgICAgIFNBUCBjb250ZXh0IGlzIGRpcmVjdGx5IHBhc3NlZCB0byBTQVAgQVBJcy4KKyAqIEBwUmVtb3ZlTWFjOiBwb2ludGVyIHRvIHN0cnVjdCBjZGZfbWFjX2FkZHIgZm9yIHNlc3Npb24gTUFDIGFkZHJlc3MKKyAqCisgKiBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byByZW1vdmUgYW4gZW50cnkgZnJvbSBzZXNzaW9uCisgKiBvdmVybGFwIGluZm8uCisgKgorICogUmV0dXJuOiBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICogICAgICAgICBDREZfU1RBVFVTX0VfRkFVTFQ6ICBTZXNzaW9uIGlzIG5vdCBkZWN0ZWN0ZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXIgaXMgZnVuY3Rpb24gbm90IHZhbGlkLgorICovCitDREZfU1RBVFVTCit3bGFuc2FwX3JlbW92ZV93cHNfc2Vzc2lvbl9vdmVybGFwKHZvaWQgKnBDdHgsCisJCQkJICAgc3RydWN0IGNkZl9tYWNfYWRkciBwUmVtb3ZlTWFjKQoreworCXB0U2FwQ29udGV4dCBwU2FwQ3R4ID0gQ0RTX0dFVF9TQVBfQ0IocEN0eCk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIFNhbml0eSBjaGVjaworCSAgIEV4dHJhY3QgU0FQIGNvbnRyb2wgYmxvY2sKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBDdHgiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJc21lX3JvYW1fZ2V0X3dwc19zZXNzaW9uX292ZXJsYXAoQ0RTX0dFVF9IQUxfQ0IocFNhcEN0eC0+cF9jZHNfZ2N0eCksCisJCQkJCSBwU2FwQ3R4LT5zZXNzaW9uSWQsIHBTYXBDdHgtPnBVc3JDb250ZXh0LAorCQkJCQkgKHZvaWQgKiopIHBTYXBDdHgtPnBmblNhcEV2ZW50Q2FsbGJhY2ssCisJCQkJCSBwUmVtb3ZlTWFjKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd2xhbnNhcF9nZXRfd3BzX3Nlc3Npb25fb3ZlcmxhcCgpIC0gZ2V0IG92ZXJsYXBwaW5nIHdwcyBzZXNzaW9uLgorICogQHBDdHg6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjZHMgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgY29udHJvbCBibG9jaworICogICAgICAgIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dC4gV2hlbiBNQlNTSUQgZmVhdHVyZSBpcyBlbmFibGVkLAorICogICAgICAgIFNBUCBjb250ZXh0IGlzIGRpcmVjdGx5IHBhc3NlZCB0byBTQVAgQVBJcy4KKyAqCisgKiBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBnZXQgV1BTIHNlc3Npb24gb3ZlcmxhcCBpbmZvLgorICoKKyAqIFJldHVybjogVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisgKiAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAqLworQ0RGX1NUQVRVUyB3bGFuc2FwX2dldF93cHNfc2Vzc2lvbl9vdmVybGFwKHZvaWQgKnBDdHgpCit7CisJc3RydWN0IGNkZl9tYWNfYWRkciBwUmVtb3ZlTWFjID0gQ0RGX01BQ19BRERSX1pFUk9fSU5JVElBTElaRVI7CisKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBDdHgpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICBTYW5pdHkgY2hlY2sKKwkgICBFeHRyYWN0IFNBUCBjb250cm9sIGJsb2NrCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwQ3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXNtZV9yb2FtX2dldF93cHNfc2Vzc2lvbl9vdmVybGFwKENEU19HRVRfSEFMX0NCKHBTYXBDdHgtPnBfY2RzX2djdHgpLAorCQkJCQkgcFNhcEN0eC0+c2Vzc2lvbklkLCBwU2FwQ3R4LT5wVXNyQ29udGV4dCwKKwkJCQkJICh2b2lkICoqKSBwU2FwQ3R4LT5wZm5TYXBFdmVudENhbGxiYWNrLAorCQkJCQkgcFJlbW92ZU1hYyk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiBUaGlzIHJvdXRpbmUgd2lsbCBzZXQgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uIGZvciBBQ0wgZHluYW1pY2FsbHkqLworQ0RGX1NUQVRVUyB3bGFuc2FwX3NldF9tb2RlKHZvaWQgKnBDdHgsIHVpbnQzMl90IG1vZGUpCit7CisJcHRTYXBDb250ZXh0IHBTYXBDdHggPSBDRFNfR0VUX1NBUF9DQihwQ3R4KTsKKworCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBDdHgiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJcFNhcEN0eC0+ZVNhcE1hY0FkZHJBY2xNb2RlID0gKGVTYXBNYWNBZGRyQUNMKSBtb2RlOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIEdldCBBQ0wgTW9kZSAqLworQ0RGX1NUQVRVUyB3bGFuc2FwX2dldF9hY2xfbW9kZSh2b2lkICpwQ3R4LCBlU2FwTWFjQWRkckFDTCAqbW9kZSkKK3sKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBDdHgpOworCisJaWYgKE5VTEwgPT0gcFNhcEN0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcEN0eCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwkqbW9kZSA9IHBTYXBDdHgtPmVTYXBNYWNBZGRyQWNsTW9kZTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiBBUEkgdG8gZ2V0IEFDTCBBY2NlcHQgTGlzdCAqLworQ0RGX1NUQVRVUword2xhbnNhcF9nZXRfYWNsX2FjY2VwdF9saXN0KHZvaWQgKnBDdHgsIHN0cnVjdCBjZGZfbWFjX2FkZHIgKnBBY2NlcHRMaXN0LAorCQkJCXVpbnQ4X3QgKm5BY2NlcHRMaXN0KQoreworCXB0U2FwQ29udGV4dCBwU2FwQ3R4ID0gQ0RTX0dFVF9TQVBfQ0IocEN0eCk7CisJaWYgKE5VTEwgPT0gcFNhcEN0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcF9jZHNfZ2N0eCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwltZW1jcHkoKHZvaWQgKilwQWNjZXB0TGlzdCwgKHZvaWQgKilwU2FwQ3R4LT5hY2NlcHRNYWNMaXN0LAorCSAgICAgICAocFNhcEN0eC0+bkFjY2VwdE1hYyAqIENERl9NQUNfQUREUl9TSVpFKSk7CisJKm5BY2NlcHRMaXN0ID0gcFNhcEN0eC0+bkFjY2VwdE1hYzsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiBBUEkgdG8gZ2V0IERlbnkgTGlzdCAqLworQ0RGX1NUQVRVUword2xhbnNhcF9nZXRfYWNsX2RlbnlfbGlzdCh2b2lkICpwQ3R4LCBzdHJ1Y3QgY2RmX21hY19hZGRyICpwRGVueUxpc3QsCisJCQkgIHVpbnQ4X3QgKm5EZW55TGlzdCkKK3sKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBDdHgpOworCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBfY2RzX2djdHgiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJbWVtY3B5KCh2b2lkICopcERlbnlMaXN0LCAodm9pZCAqKXBTYXBDdHgtPmRlbnlNYWNMaXN0LAorCSAgICAgICAocFNhcEN0eC0+bkRlbnlNYWMgKiBDREZfTUFDX0FERFJfU0laRSkpOworCSpuRGVueUxpc3QgPSBwU2FwQ3R4LT5uRGVueU1hYzsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiBUaGlzIHJvdXRpbmUgd2lsbCBjbGVhciBhbGwgdGhlIGVudHJpZXMgaW4gYWNjZXB0IGxpc3QgYXMgd2VsbCBhcyBkZW55IGxpc3QgICovCisKK0NERl9TVEFUVVMgd2xhbnNhcF9jbGVhcl9hY2wodm9pZCAqcEN0eCkKK3sKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBDdHgpOworCXVpbnQ4X3QgaTsKKworCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfQorCisJaWYgKHBTYXBDdHgtPmRlbnlNYWNMaXN0ICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IChwU2FwQ3R4LT5uRGVueU1hYyAtIDEpOyBpKyspIHsKKwkJCWNkZl9tZW1femVybygocFNhcEN0eC0+ZGVueU1hY0xpc3QgKyBpKS0+Ynl0ZXMsCisJCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisKKwkJfQorCX0KKwlzYXBfcHJpbnRfYWNsKHBTYXBDdHgtPmRlbnlNYWNMaXN0LCBwU2FwQ3R4LT5uRGVueU1hYyk7CisJcFNhcEN0eC0+bkRlbnlNYWMgPSAwOworCisJaWYgKHBTYXBDdHgtPmFjY2VwdE1hY0xpc3QgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgKHBTYXBDdHgtPm5BY2NlcHRNYWMgLSAxKTsgaSsrKSB7CisJCQljZGZfbWVtX3plcm8oKHBTYXBDdHgtPmFjY2VwdE1hY0xpc3QgKyBpKS0+Ynl0ZXMsCisJCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisKKwkJfQorCX0KKwlzYXBfcHJpbnRfYWNsKHBTYXBDdHgtPmFjY2VwdE1hY0xpc3QsIHBTYXBDdHgtPm5BY2NlcHRNYWMpOworCXBTYXBDdHgtPm5BY2NlcHRNYWMgPSAwOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKyAqIHdsYW5zYXBfbW9kaWZ5X2FjbCgpIC1VcGRhdGUgQUNMIGVudHJpZXMKKyAqCisgKiBAY3R4OiBHbG9iYWwgY29udGV4dAorICogQHBlZXJfc3RhX21hYzogcGVlciBzdGEgbWFjIHRvIGJlIHVwZGF0ZWQuCisgKiBAbGlzdF90eXBlOiB3aGl0ZS9CbGFjayBsaXN0IHR5cGUuCisgKiBAY21kOiBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkIG9uIEFDTC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcGVlciBuZWVkcyB0byBiZSBhZGRlZCBvciBkZWxldGVkIGZyb20gdGhlCisgKiB3aGl0ZS9ibGFjayBBQ0wKKyAqCisgKiBSZXR1cm46IFN0YXR1cworICovCisKK0NERl9TVEFUVVMKK3dsYW5zYXBfbW9kaWZ5X2FjbAorCSh2b2lkICpjdHgsCisJdWludDhfdCAqcGVlcl9zdGFfbWFjLCBlU2FwQUNMVHlwZSBsaXN0X3R5cGUsIGVTYXBBQ0xDbWRUeXBlIGNtZCkgeworCWVTYXBCb29sIHN0YV93aGl0ZV9saXN0ID0gZVNBUF9GQUxTRSwgc3RhX2JsYWNrX2xpc3QgPSBlU0FQX0ZBTFNFOworCXVpbnQ4X3Qgc3RhV0xJbmRleCwgc3RhQkxJbmRleDsKKwlwdFNhcENvbnRleHQgc2FwX2N0eCA9IENEU19HRVRfU0FQX0NCKGN0eCk7CisKKwlpZiAoTlVMTCA9PSBzYXBfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgU0FQIENvbnRleHQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgIk1vZGlmeSBBQ0wgZW50ZXJlZFxuIiAiQmVmb3JlIG1vZGlmaWNhdGlvbiBvZiBBQ0xcbiIKKwkJICAic2l6ZSBvZiBhY2NlcHQgYW5kIGRlbnkgbGlzdHMgJWQgJWQiLCBzYXBfY3R4LT5uQWNjZXB0TWFjLAorCQkgIHNhcF9jdHgtPm5EZW55TWFjKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIioqKiBXSElURSBMSVNUICoqKiIpOworCXNhcF9wcmludF9hY2woc2FwX2N0eC0+YWNjZXB0TWFjTGlzdCwgc2FwX2N0eC0+bkFjY2VwdE1hYyk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIqKiogQkxBQ0sgTElTVCAqKioiKTsKKwlzYXBfcHJpbnRfYWNsKHNhcF9jdHgtPmRlbnlNYWNMaXN0LCBzYXBfY3R4LT5uRGVueU1hYyk7CisKKwkvKiB0aGUgZXhwZWN0YXRpb24gaXMgYSBtYWMgYWRkciB3aWxsIG5vdCBiZSBpbiBib3RoIHRoZSBsaXN0cyBhdCB0aGUgc2FtZSB0aW1lLgorCSAgIEl0IGlzIHRoZSByZXNwb25zaWJsaXR5IG9mIHVzZXJzcGFjZSB0byBlbnN1cmUgdGhpcyAqLworCXN0YV93aGl0ZV9saXN0ID0KKwkJc2FwX3NlYXJjaF9tYWNfbGlzdChzYXBfY3R4LT5hY2NlcHRNYWNMaXN0LCBzYXBfY3R4LT5uQWNjZXB0TWFjLAorCQkJCSBwZWVyX3N0YV9tYWMsICZzdGFXTEluZGV4KTsKKwlzdGFfYmxhY2tfbGlzdCA9CisJCXNhcF9zZWFyY2hfbWFjX2xpc3Qoc2FwX2N0eC0+ZGVueU1hY0xpc3QsIHNhcF9jdHgtPm5EZW55TWFjLAorCQkJCSBwZWVyX3N0YV9tYWMsICZzdGFCTEluZGV4KTsKKworCWlmIChzdGFfd2hpdGVfbGlzdCAmJiBzdGFfYmxhY2tfbGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIlBlZXIgbWFjICIgTUFDX0FERFJFU1NfU1RSCisJCQkgICIgZm91bmQgaW4gd2hpdGUgYW5kIGJsYWNrIGxpc3RzLiIKKwkJCSAgIkluaXRpYWwgbGlzdHMgcGFzc2VkIGluY29ycmVjdC4gQ2Fubm90IGV4ZWN1dGUgdGhpcyBjb21tYW5kLiIsCisJCQkgIE1BQ19BRERSX0FSUkFZKHBlZXJfc3RhX21hYykpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwl9CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisJCSAgImNtZCAlZCIsIGNtZCk7CisKKwlzd2l0Y2ggKGxpc3RfdHlwZSkgeworCWNhc2UgZVNBUF9XSElURV9MSVNUOgorCQlpZiAoY21kID09IEFERF9TVEFfVE9fQUNMKSB7CisJCQkvKiBlcnJvciBjaGVjayAqLworCQkJLyogaWYgbGlzdCBpcyBhbHJlYWR5IGF0IG1heCwgcmV0dXJuIGZhaWx1cmUgKi8KKwkJCWlmIChzYXBfY3R4LT5uQWNjZXB0TWFjID09IE1BWF9BQ0xfTUFDX0FERFJFU1MpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICJXaGl0ZSBsaXN0IGlzIGFscmVhZHkgbWF4ZWQgb3V0LiBDYW5ub3QgYWNjZXB0ICIKKwkJCQkJICBNQUNfQUREUkVTU19TVFIsCisJCQkJCSAgTUFDX0FERFJfQVJSQVkocGVlcl9zdGFfbWFjKSk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJfQorCQkJaWYgKHN0YV93aGl0ZV9saXN0KSB7CisJCQkJLyogRG8gbm90aGluZyBpZiBhbHJlYWR5IHByZXNlbnQgaW4gd2hpdGUgbGlzdC4gSnVzdCBwcmludCBhIHdhcm5pbmcgKi8KKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJCSAgIk1BQyBhZGRyZXNzIGFscmVhZHkgcHJlc2VudCBpbiB3aGl0ZSBsaXN0ICIKKwkJCQkJICBNQUNfQUREUkVTU19TVFIsCisJCQkJCSAgTUFDX0FERFJfQVJSQVkocGVlcl9zdGFfbWFjKSk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCX0KKwkJCWlmIChzdGFfYmxhY2tfbGlzdCkgeworCQkJCS8qIHJlbW92ZSBpdCBmcm9tIGJsYWNrIGxpc3QgYmVmb3JlIGFkZGluZyB0byB0aGUgd2hpdGUgbGlzdCAqLworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJICAiU1RBIHByZXNlbnQgaW4gYmxhY2sgbGlzdCBzbyBmaXJzdCByZW1vdmUgZnJvbSBpdCIpOworCQkJCXNhcF9yZW1vdmVfbWFjX2Zyb21fYWNsKHNhcF9jdHgtPgorCQkJCQkJICAgIGRlbnlNYWNMaXN0LAorCQkJCQkJICAgICZzYXBfY3R4LT5uRGVueU1hYywKKwkJCQkJCSAgICBzdGFCTEluZGV4KTsKKwkJCX0KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIi4uLiBOb3cgYWRkIHRvIHRoZSB3aGl0ZSBsaXN0Iik7CisJCQlzYXBfYWRkX21hY190b19hY2woc2FwX2N0eC0+YWNjZXB0TWFjTGlzdCwKKwkJCQkJICAgICAgICZzYXBfY3R4LT5uQWNjZXB0TWFjLAorCQkJICAgICAgIHBlZXJfc3RhX21hYyk7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCSAgInNpemUgb2YgYWNjZXB0IGFuZCBkZW55IGxpc3RzICVkICVkIiwKKwkJCQkgIHNhcF9jdHgtPm5BY2NlcHRNYWMsCisJCQkJICBzYXBfY3R4LT5uRGVueU1hYyk7CisJCX0gZWxzZSBpZiAoY21kID09IERFTEVURV9TVEFfRlJPTV9BQ0wpIHsKKwkJCWlmIChzdGFfd2hpdGVfbGlzdCkgeworCisJCQkJc3RydWN0IHRhZ0NzckRlbFN0YVBhcmFtcyBkZWxTdGFQYXJhbXM7CisKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCSAgIkRlbGV0ZSBmcm9tIHdoaXRlIGxpc3QiKTsKKwkJCQlzYXBfcmVtb3ZlX21hY19mcm9tX2FjbChzYXBfY3R4LT5hY2NlcHRNYWNMaXN0LAorCQkJCQkJICAgICZzYXBfY3R4LT5uQWNjZXB0TWFjLAorCQkJCQkJICAgIHN0YVdMSW5kZXgpOworCQkJCS8qIElmIGEgY2xpZW50IGlzIGRlbGV0ZWQgZnJvbSB3aGl0ZSBsaXN0IGFuZCBpdCBpcyBjb25uZWN0ZWQsIHNlbmQgZGVhdXRoICovCisJCQkJd2xhbnNhcF9wb3B1bGF0ZV9kZWxfc3RhX3BhcmFtcyhwZWVyX3N0YV9tYWMsCisJCQkJCWVDc3JGb3JjZWREZWF1dGhTdGEsCisJCQkJCShTSVJfTUFDX01HTVRfREVBVVRIID4+IDQpLAorCQkJCQkmZGVsU3RhUGFyYW1zKTsKKwkJCQl3bGFuc2FwX2RlYXV0aF9zdGEoY3R4LCAmZGVsU3RhUGFyYW1zKTsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCQkgICJzaXplIG9mIGFjY2VwdCBhbmQgZGVueSBsaXN0cyAlZCAlZCIsCisJCQkJCSAgc2FwX2N0eC0+bkFjY2VwdE1hYywKKwkJCQkJICBzYXBfY3R4LT5uRGVueU1hYyk7CisJCQl9IGVsc2UgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJICAiTUFDIGFkZHJlc3MgdG8gYmUgZGVsZXRlZCBpcyBub3QgcHJlc2VudCBpbiB0aGUgd2hpdGUgbGlzdCAiCisJCQkJCSAgTUFDX0FERFJFU1NfU1RSLAorCQkJCQkgIE1BQ19BRERSX0FSUkFZKHBlZXJfc3RhX21hYykpOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIkludmFsaWQgY21kIHR5cGUgcGFzc2VkIik7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGVTQVBfQkxBQ0tfTElTVDoKKworCQlpZiAoY21kID09IEFERF9TVEFfVE9fQUNMKSB7CisJCQlzdHJ1Y3QgdGFnQ3NyRGVsU3RhUGFyYW1zIGRlbFN0YVBhcmFtczsKKwkJCS8qIGVycm9yIGNoZWNrICovCisJCQkvKiBpZiBsaXN0IGlzIGFscmVhZHkgYXQgbWF4LCByZXR1cm4gZmFpbHVyZSAqLworCQkJaWYgKHNhcF9jdHgtPm5EZW55TWFjID09IE1BWF9BQ0xfTUFDX0FERFJFU1MpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICJCbGFjayBsaXN0IGlzIGFscmVhZHkgbWF4ZWQgb3V0LiBDYW5ub3QgYWNjZXB0ICIKKwkJCQkJICBNQUNfQUREUkVTU19TVFIsCisJCQkJCSAgTUFDX0FERFJfQVJSQVkocGVlcl9zdGFfbWFjKSk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJfQorCQkJaWYgKHN0YV9ibGFja19saXN0KSB7CisJCQkJLyogRG8gbm90aGluZyBpZiBhbHJlYWR5IHByZXNlbnQgaW4gd2hpdGUgbGlzdCAqLworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJICAiTUFDIGFkZHJlc3MgYWxyZWFkeSBwcmVzZW50IGluIGJsYWNrIGxpc3QgIgorCQkJCQkgIE1BQ19BRERSRVNTX1NUUiwKKwkJCQkJICBNQUNfQUREUl9BUlJBWShwZWVyX3N0YV9tYWMpKTsKKwkJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJfQorCQkJaWYgKHN0YV93aGl0ZV9saXN0KSB7CisJCQkJLyogcmVtb3ZlIGl0IGZyb20gd2hpdGUgbGlzdCBiZWZvcmUgYWRkaW5nIHRvIHRoZSBibGFjayBsaXN0ICovCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJCQkgICJQcmVzZW50IGluIHdoaXRlIGxpc3Qgc28gZmlyc3QgcmVtb3ZlIGZyb20gaXQiKTsKKwkJCQlzYXBfcmVtb3ZlX21hY19mcm9tX2FjbChzYXBfY3R4LT4KKwkJCQkJCSAgICBhY2NlcHRNYWNMaXN0LAorCQkJCQkJICAgICZzYXBfY3R4LT4KKwkJCQkJCSAgICBuQWNjZXB0TWFjLAorCQkJCQkJICAgIHN0YVdMSW5kZXgpOworCQkJfQorCQkJLyogSWYgd2UgYXJlIGFkZGluZyBhIGNsaWVudCB0byB0aGUgYmxhY2sgbGlzdDsgaWYgaXRzIGNvbm5lY3RlZCwgc2VuZCBkZWF1dGggKi8KKwkJCXdsYW5zYXBfcG9wdWxhdGVfZGVsX3N0YV9wYXJhbXMocGVlcl9zdGFfbWFjLAorCQkJCWVDc3JGb3JjZWREZWF1dGhTdGEsCisJCQkJKFNJUl9NQUNfTUdNVF9ERUFVVEggPj4gNCksCisJCQkJJmRlbFN0YVBhcmFtcyk7CisJCQl3bGFuc2FwX2RlYXV0aF9zdGEoY3R4LCAmZGVsU3RhUGFyYW1zKTsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIi4uLiBOb3cgYWRkIHRvIGJsYWNrIGxpc3QiKTsKKwkJCXNhcF9hZGRfbWFjX3RvX2FjbChzYXBfY3R4LT5kZW55TWFjTGlzdCwKKwkJCQkgICAgICAgJnNhcF9jdHgtPm5EZW55TWFjLCBwZWVyX3N0YV9tYWMpOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCSAgInNpemUgb2YgYWNjZXB0IGFuZCBkZW55IGxpc3RzICVkICVkIiwKKwkJCQkgIHNhcF9jdHgtPm5BY2NlcHRNYWMsCisJCQkJICBzYXBfY3R4LT5uRGVueU1hYyk7CisJCX0gZWxzZSBpZiAoY21kID09IERFTEVURV9TVEFfRlJPTV9BQ0wpIHsKKwkJCWlmIChzdGFfYmxhY2tfbGlzdCkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICAiRGVsZXRlIGZyb20gYmxhY2sgbGlzdCIpOworCQkJCXNhcF9yZW1vdmVfbWFjX2Zyb21fYWNsKHNhcF9jdHgtPmRlbnlNYWNMaXN0LAorCQkJCQkJICAgICZzYXBfY3R4LT5uRGVueU1hYywKKwkJCQkJCSAgICBzdGFCTEluZGV4KTsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJCQkgICJubyBhY2NlcHQgYW5kIGRlbnkgbWFjICVkICVkIiwKKwkJCQkJICBzYXBfY3R4LT5uQWNjZXB0TWFjLAorCQkJCQkgIHNhcF9jdHgtPm5EZW55TWFjKTsKKwkJCX0gZWxzZSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJCQkgICJNQUMgYWRkcmVzcyB0byBiZSBkZWxldGVkIGlzIG5vdCBwcmVzZW50IGluIHRoZSBibGFjayBsaXN0ICIKKwkJCQkJICBNQUNfQUREUkVTU19TVFIsCisJCQkJCSAgTUFDX0FERFJfQVJSQVkocGVlcl9zdGFfbWFjKSk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJfQorCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiSW52YWxpZCBjbWQgdHlwZSBwYXNzZWQiKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkludmFsaWQgbGlzdCB0eXBlIHBhc3NlZCAlZCIsIGxpc3RfdHlwZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkgICJBZnRlciBtb2RpZmljYXRpb24gb2YgQUNMIik7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIqKiogV0hJVEUgTElTVCAqKioiKTsKKwlzYXBfcHJpbnRfYWNsKHNhcF9jdHgtPmFjY2VwdE1hY0xpc3QsIHNhcF9jdHgtPm5BY2NlcHRNYWMpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiKioqIEJMQUNLIExJU1QgKioqIik7CisJc2FwX3ByaW50X2FjbChzYXBfY3R4LT5kZW55TWFjTGlzdCwgc2FwX2N0eC0+bkRlbnlNYWMpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd2xhbnNhcF9kaXNhc3NvY19zdGEoKSAtIGluaXRpYXRlIGRpc2Fzc29jaWF0aW9uIG9mIHN0YXRpb24uCisgKiBAcEN0eDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIGNkcyBjb250ZXh0OyBhIGhhbmRsZSB0byBTQVAncyBjb250cm9sIGJsb2NrCisgKiAgICAgICAgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0LiBXaGVuIE1CU1NJRCBmZWF0dXJlIGlzIGVuYWJsZWQsCisgKiAgICAgICAgU0FQIGNvbnRleHQgaXMgZGlyZWN0bHkgcGFzc2VkIHRvIFNBUCBBUElzLgorICogQHBQZWVyU3RhTWFjOiBNYWMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbiB0byBkaXNhc3NvY2lhdGUKKyAqCisgKiBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCBpbml0aWF0ZWQgZGlzYXNzb2NpYXRpb24gb2Ygc3RhdGlvbgorICoKKyAqIFJldHVybjogVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisgKiAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAqLworQ0RGX1NUQVRVUyB3bGFuc2FwX2Rpc2Fzc29jX3N0YSh2b2lkICpwQ3R4LCBjb25zdCB1aW50OF90ICpwUGVlclN0YU1hYykKK3sKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBDdHgpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICBTYW5pdHkgY2hlY2sKKwkgICBFeHRyYWN0IFNBUCBjb250cm9sIGJsb2NrCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwQ3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXNtZV9yb2FtX2Rpc2Nvbm5lY3Rfc3RhKENEU19HRVRfSEFMX0NCKHBTYXBDdHgtPnBfY2RzX2djdHgpLAorCQkJCXBTYXBDdHgtPnNlc3Npb25JZCwgcFBlZXJTdGFNYWMpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bGFuc2FwX2RlYXV0aF9zdGEoKSAtIEFwIEFwcC9IREQgaW5pdGlhdGVkIGRlYXV0aGVudGljYXRpb24gb2Ygc3RhdGlvbgorICogQHBDdHggOiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2RzIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzCisgKiAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgKiAgICAgICAgIFdoZW4gTUJTU0lEIGZlYXR1cmUgaXMgZW5hYmxlZCwgU0FQIGNvbnRleHQgaXMgZGlyZWN0bHkKKyAqICAgICAgICAgcGFzc2VkIHRvIFNBUCBBUElzCisgKiBAcERlbFN0YVBhcmFtcyA6IFBvaW50ZXIgdG8gcGFyYW1ldGVycyBvZiB0aGUgc3RhdGlvbiB0byBkZWF1dGhlbnRpY2F0ZQorICoKKyAqIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIGluaXRpYXRlZCBkZWF1dGhlbnRpY2F0aW9uIG9mCisgKiBzdGF0aW9uCisgKgorICogUmV0dXJuOiBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyB3bGFuc2FwX2RlYXV0aF9zdGEodm9pZCAqcEN0eCwKKwkJCSAgICAgIHN0cnVjdCB0YWdDc3JEZWxTdGFQYXJhbXMgKnBEZWxTdGFQYXJhbXMpCit7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQVVMVDsKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBDdHgpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICBTYW5pdHkgY2hlY2sKKwkgICBFeHRyYWN0IFNBUCBjb250cm9sIGJsb2NrCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwQ3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gY2RmX3N0YXR1czsKKwl9CisKKwljZGZfcmV0X3N0YXR1cyA9CisJCXNtZV9yb2FtX2RlYXV0aF9zdGEoQ0RTX0dFVF9IQUxfQ0IocFNhcEN0eC0+cF9jZHNfZ2N0eCksCisJCQkJICAgIHBTYXBDdHgtPnNlc3Npb25JZCwgcERlbFN0YVBhcmFtcyk7CisKKwlpZiAoY2RmX3JldF9zdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICB3bGFuc2FwX3NldF9jaGFubmVsX2NoYW5nZV93aXRoX2NzYQorCisgICBERVNDUklQVElPTgorICAgICAgVGhpcyBhcGkgZnVuY3Rpb24gZG9lcyBhIGNoYW5uZWwgY2hhbmdlIHRvIHRoZSB0YXJnZXQgY2hhbm5lbCBzcGVjaWZpZWQKKyAgICAgIHRocm91Z2ggYW4gaXdwcml2LiBDU0EgSUUgaXMgaW5jbHVkZWQgaW4gdGhlIGJlYWNvbnMgYmVmb3JlIGRvaW5nIGEKKyAgICAgIGNoYW5uZWwgY2hhbmdlLgorCisgICBERVBFTkRFTkNJRVMKKyAgICBOQS4KKworICAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwX2Nkc19nY3R4ICAgICAgICAgICAgIDogUG9pbnRlciB0byBjZHMgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisgICAgdGFyZ2V0Q2hhbm5lbCAgICAgICAgOiBOZXcgdGFyZ2V0IGNoYW5uZWwgdG8gY2hhbmdlIHRvLgorCisgICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0NERl9TVEFUVVMKK3dsYW5zYXBfc2V0X2NoYW5uZWxfY2hhbmdlX3dpdGhfY3NhKHZvaWQgKnBfY2RzX2djdHgsIHVpbnQzMl90IHRhcmdldENoYW5uZWwpCit7CisKKwlwdFNhcENvbnRleHQgc2FwQ29udGV4dCA9IE5VTEw7CisJdFdMQU5fU0FQRXZlbnQgc2FwRXZlbnQ7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IE5VTEw7CisJdm9pZCAqaEhhbCA9IE5VTEw7CisKKwlzYXBDb250ZXh0ID0gQ0RTX0dFVF9TQVBfQ0IocF9jZHNfZ2N0eCk7CisJaWYgKE5VTEwgPT0gc2FwQ29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcF9jZHNfZ2N0eCIsIF9fZnVuY19fKTsKKworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKwloSGFsID0gQ0RTX0dFVF9IQUxfQ0Ioc2FwQ29udGV4dC0+cF9jZHNfZ2N0eCk7CisJaWYgKE5VTEwgPT0gaEhhbCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBJbnZhbGlkIEhBTCBwb2ludGVyIGZyb20gcF9jZHNfZ2N0eCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJLyoKKwkgKiBOb3csIHZhbGlkYXRlIGlmIHRoZSBwYXNzZWQgY2hhbm5lbCBpcyB2YWxpZCBpbiB0aGUKKwkgKiBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorCSAqLworCWlmIChzYXBDb250ZXh0LT5jaGFubmVsICE9IHRhcmdldENoYW5uZWwgJiYKKwkJKChjZHNfZ2V0X2NoYW5uZWxfc3RhdGUodGFyZ2V0Q2hhbm5lbCkgPT0KKwkJCUNIQU5ORUxfU1RBVEVfRU5BQkxFKSB8fAorCQkoY2RzX2dldF9jaGFubmVsX3N0YXRlKHRhcmdldENoYW5uZWwpID09CisJCQlDSEFOTkVMX1NUQVRFX0RGUyAmJgorCQkhY2RzX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKCkpKSkgeworCQkvKgorCQkgKiBQb3N0IGEgQ1NBIElFIHJlcXVlc3QgdG8gU0FQIHN0YXRlIG1hY2hpbmUgd2l0aAorCQkgKiB0YXJnZXQgY2hhbm5lbCBpbmZvcm1hdGlvbiBhbmQgYWxzbyBDU0EgSUUgcmVxdWlyZWQKKwkJICogZmxhZyBzZXQgaW4gc2FwQ29udGV4dCBvbmx5LCBpZiBTQVAgaXMgaW4gZVNBUF9TVEFSVEVECisJCSAqIHN0YXRlLgorCQkgKi8KKwkJaWYgKGVTQVBfU1RBUlRFRCA9PSBzYXBDb250ZXh0LT5zYXBzTWFjaGluZSkgeworCQkJLyoKKwkJCSAqIENvcHkgdGhlIHJlcXVlc3RlZCB0YXJnZXQgY2hhbm5lbAorCQkJICogdG8gc2FwIGNvbnRleHQuCisJCQkgKi8KKwkJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLnRhcmdldF9jaGFubmVsID0gdGFyZ2V0Q2hhbm5lbDsKKwkJCS8qCisJCQkgKiBUT0RPOiBuZWVkIHRvIGlkZW50aWZ5IHRoZSBhbGxvd2VkIGNoYW5uZWwgd2lkdGggYW5kCisJCQkgKiBib25kaW5nIG1vZGUuCisJCQkgKi8KKwkJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLm5ld19jaGFuV2lkdGggPSAwOworCQkJcE1hYy0+c2FwLlNhcERmc0luZm8ubmV3X2NiTW9kZSA9IDA7CisKKwkJCS8qCisJCQkgKiBTZXQgdGhlIENTQSBJRSByZXF1aXJlZCBmbGFnLgorCQkJICovCisJCQlwTWFjLT5zYXAuU2FwRGZzSW5mby5jc2FJRVJlcXVpcmVkID0gdHJ1ZTsKKworCQkJLyoKKwkJCSAqIFNldCB0aGUgcmFkYXIgZm91bmQgc3RhdHVzIHRvIGFsbG93IHRoZSBjaGFubmVsCisJCQkgKiBjaGFuZ2UgdG8gaGFwcGVuIHNhbWUgYXMgaW4gdGhlIGNhc2Ugb2YgYSByYWRhcgorCQkJICogZGV0ZWN0aW9uLiBTaW5jZSwgdGhpcyB3aWxsIGFsbG93IFNBUCB0byBiZSBpbgorCQkJICogY29ycmVjdCBzdGF0ZSBhbmQgYWxzbyByZXN1bWUgdGhlIG5ldGlmIHF1ZXVlcworCQkJICogdGhhdCB3ZXJlIHN1c3BlbmRlZCBpbiBIREQgYmVmb3JlIHRoZSBjaGFubmVsCisJCQkgKiByZXF1ZXN0IHdhcyBpc3N1ZWQuCisJCQkgKi8KKwkJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcF9yYWRhcl9mb3VuZF9zdGF0dXMgPSB0cnVlOworCisJCQkvKgorCQkJICogUG9zdCB0aGUgZVNBUF9ERlNfQ0hOTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX1NUQVJUCisJCQkgKiB0byBTQVAgc3RhdGUgbWFjaGluZSB0byBwcm9jZXNzIHRoZSBjaGFubmVsCisJCQkgKiByZXF1ZXN0IHdpdGggQ1NBIElFIHNldCBpbiB0aGUgYmVhY29ucy4KKwkJCSAqLworCQkJc2FwRXZlbnQuZXZlbnQgPQorCQkJCWVTQVBfREZTX0NITkxfU1dJVENIX0FOTk9VTkNFTUVOVF9TVEFSVDsKKwkJCXNhcEV2ZW50LnBhcmFtcyA9IDA7CisJCQlzYXBFdmVudC51MSA9IDA7CisJCQlzYXBFdmVudC51MiA9IDA7CisKKwkJCXNhcF9mc20oc2FwQ29udGV4dCwgJnNhcEV2ZW50KTsKKworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEZhaWxlZCB0byByZXF1ZXN0IENoYW5uZWwgQ2hhbmdlLCBzaW5jZSIKKwkJCQkgICJTQVAgaXMgbm90IGluIGVTQVBfU1RBUlRFRCBzdGF0ZSIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKworCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IENoYW5uZWwgPSAlZCBpcyBub3QgdmFsaWQgaW4gdGhlIGN1cnJlbnQiCisJCQkgICJyZWd1bGF0b3J5IGRvbWFpbiIsIF9fZnVuY19fLCB0YXJnZXRDaGFubmVsKTsKKworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6IFBvc3RlZCBlU0FQX0RGU19DSE5MX1NXSVRDSF9BTk5PVU5DRU1FTlRfU1RBUlQiCisJCSAgInN1Y2Nlc3NmdWxseSB0byBzYXBfZnNtIGZvciBDaGFubmVsID0gJWQiLAorCQkgIF9fZnVuY19fLCB0YXJnZXRDaGFubmVsKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd2xhbnNhcF9zZXRfY291bnRlcl9tZWFzdXJlKCkgLSBzZXQgY291bnRlciBtZWFzdXJlLgorICogQHBDdHg6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjZHMgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgY29udHJvbCBibG9jaworICogICAgICAgIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dC4gV2hlbiBNQlNTSUQgZmVhdHVyZSBpcyBlbmFibGVkLAorICogICAgICAgIFNBUCBjb250ZXh0IGlzIGRpcmVjdGx5IHBhc3NlZCB0byBTQVAgQVBJcy4KKyAqIEBiRW5hYmxlOiBJZiB0cnVlIHRoYW4gYWxsIHN0YXRpb25zIHdpbGwgYmUgZGlzYXNzb2NpYXRlZCBhbmQgbm8gbW9yZQorICogICAgICAgICAgIHdpbGwgYmUgYWxsb3dlZCB0byBhc3NvY2lhdGUuIElmIGZhbHNlIHRoYW4gQ09SRSB3aWxsIGNvbWUgb3V0CisgKiAgICAgICAgICAgIG9mIHRoaXMgc3RhdGUuCisgKgorICogVGhpcyBhcGkgZnVuY3Rpb24gaXMgdXNlZCB0byBkaXNhc3NvY2lhdGUgYWxsIHRoZSBzdGF0aW9ucyBhbmQgcHJldmVudAorICogYXNzb2NpYXRpb24gZm9yIGFueSBvdGhlciBzdGF0aW9uLldoZW5ldmVyIEF1dGhlbnRpY2F0b3IgcmVjZWl2ZXMgMiBtaWMKKyAqIGZhaWx1cmVzIHdpdGhpbiA2MCBzZWNvbmRzLCBBdXRoZW50aWNhdG9yIHdpbGwgZW5hYmxlIGNvdW50ZXIgbWVhc3VyZSBhdAorICogU0FQIExheWVyLiBBdXRoZW50aWNhdG9yIHdpbGwgc3RhcnQgdGhlIDYwIHNlY29uZHMgdGltZXIuIENvcmUgc3RhY2sgd2lsbAorICogbm90IGFsbG93IGFueSBTVEEgdG8gYXNzb2NpYXRlIHRpbGwgSEREIGRpc2FibGVzIGNvdW50ZXIgbWVhc3N1cmUuIENvcmUKKyAqIHN0YWNrIHNoYWxsIGtpY2sgb3V0IGFsbCB0aGUgU1RBIHdoaWNoIGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBhbmQgRElBU1NPQworICogRXZlbnQgd2lsbCBiZSBwcm9wb2dhdGVkIHRvIEhERCBmb3IgZWFjaCBTVEEgdG8gY2xlYW4gdXAgdGhlIEhERCBTVEEgdGFibGUuCisgKiBPbmNlIHRoZSA2MCBzZWNvbmRzIHRpbWVyIGV4cGlyZXMsIEF1dGhlbnRpY2F0b3Igd2lsbCBkaXNhYmxlIHRoZSBjb3VudGVyCisgKiBtZWFzc3VyZSBhdCBjb3JlIHN0YWNrLiBOb3cgY29yZSBzdGFjayBjYW4gYWxsb3cgU1RBcyB0byBhc3NvY2lhdGUuCisgKgorICogUmV0dXJuOiBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICovCitDREZfU1RBVFVTIHdsYW5zYXBfc2V0X2NvdW50ZXJfbWVhc3VyZSh2b2lkICpwQ3R4LCBib29sIGJFbmFibGUpCit7CisJcHRTYXBDb250ZXh0IHBTYXBDdHggPSBDRFNfR0VUX1NBUF9DQihwQ3R4KTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgU2FuaXR5IGNoZWNrCisJICAgRXh0cmFjdCBTQVAgY29udHJvbCBibG9jaworCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKE5VTEwgPT0gcFNhcEN0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcEN0eCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlzbWVfcm9hbV90a2lwX2NvdW50ZXJfbWVhc3VyZXMoQ0RTX0dFVF9IQUxfQ0IocFNhcEN0eC0+cF9jZHNfZ2N0eCksCisJCQkJICAgICAgIHBTYXBDdHgtPnNlc3Npb25JZCwgYkVuYWJsZSk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdsYW5zYXBfc2V0X2tleV9zdGEoKSAtIHNldCBrZXlzIGZvciBhIHN0YXRpb25zLgorICogQHBDdHg6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjZHMgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgY29udHJvbCBibG9jaworICogICAgICAgIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dC4gV2hlbiBNQlNTSUQgZmVhdHVyZSBpcyBlbmFibGVkLAorICogICAgICAgIFNBUCBjb250ZXh0IGlzIGRpcmVjdGx5IHBhc3NlZCB0byBTQVAgQVBJcy4KKyAqIEBwU2V0S2V5SW5mbyA6IHRDc3JSb2FtU2V0S2V5IHN0cnVjdHVyZSBmb3IgdGhlIHN0YXRpb24KKyAqCisgKiBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBzZXQga2V5IGZvciBhIHN0YXRpb24uCisgKgorICogUmV0dXJuOiBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICovCitDREZfU1RBVFVTIHdsYW5zYXBfc2V0X2tleV9zdGEodm9pZCAqcEN0eCwgdENzclJvYW1TZXRLZXkgKnBTZXRLZXlJbmZvKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IE5VTEw7CisJdm9pZCAqaEhhbCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXVpbnQzMl90IHJvYW1JZCA9IDB4RkY7CisKKwlpZiAoQ0RGX1NBUF9NT0RFID09IGNkc19nZXRfY29ucGFyYW0oKSkgeworCQlwU2FwQ3R4ID0gQ0RTX0dFVF9TQVBfQ0IocEN0eCk7CisJCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcEN0eCIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQl9CisJCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihwU2FwQ3R4LT5wX2Nkc19nY3R4KTsKKwkJaWYgKE5VTEwgPT0gaEhhbCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwX2Nkc19nY3R4IiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKwkJY2RmX3JldF9zdGF0dXMgPQorCQkJc21lX3JvYW1fc2V0X2tleShoSGFsLCBwU2FwQ3R4LT5zZXNzaW9uSWQsIHBTZXRLZXlJbmZvLAorCQkJCQkgJnJvYW1JZCk7CisKKwkJaWYgKGNkZl9yZXRfc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKwl9IGVsc2UKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQVVMVDsKKworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5fc2FwX2dldHN0YXRpb25faWVfaW5mb3JtYXRpb24oKSAtIFJTTklFIFBvcHVsYXRpb24KKyAqCisgKiBAY3R4OiBHbG9iYWwgY29udGV4dAorICogQGxlbjogTGVuZ3RoIG9mIEBidWYKKyAqIEBidWY6IFJTTklFIElFIGRhdGEKKyAqCisgKiAgUG9wdWxhdGUgUlNOIElFIGZyb20gQ1NSIHRvIEhERCBjb250ZXh0CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KKworQ0RGX1NUQVRVUword2xhbl9zYXBfZ2V0c3RhdGlvbl9pZV9pbmZvcm1hdGlvbgorCSh2b2lkICpjdHgsIHVpbnQzMl90ICpsZW4sIHVpbnQ4X3QgKmJ1ZikgeworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXB0U2FwQ29udGV4dCBzYXBfY3R4ID0gTlVMTDsKKwl1aW50MzJfdCBpZV9sZW4gPSAwOworCXRDREZfQ09OX01PREUgbW9kZTsKKworCW1vZGUgPSBjZHNfZ2V0X2NvbnBhcmFtKCk7CisJaWYgKENERl9TQVBfTU9ERSAhPSBtb2RlKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJIiVkOiBjYWxsZWQgaW4gd3JvbmcgbW9kZSAiLAorCQkJbW9kZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJc2FwX2N0eCA9IENEU19HRVRfU0FQX0NCKGN0eCk7CisJaWYgKE5VTEwgPT0gc2FwX2N0eCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCUZMKCJJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcEN0eCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlpZiAobGVuKSB7CisJCWllX2xlbiA9ICpsZW47CisJCSpsZW4gPSBzYXBfY3R4LT5uU3RhV1BBUlNuUmVxSWVMZW5ndGg7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQlGTCgiV1BBSUUgbGVuIDogJXgiKSwgKmxlbik7CisJCWlmICgoYnVmKSAmJiAoaWVfbGVuID49IHNhcF9jdHgtPm5TdGFXUEFSU25SZXFJZUxlbmd0aCkpIHsKKwkJCWNkZl9tZW1fY29weShidWYsCisJCQkJc2FwX2N0eC0+cFN0YVdwYVJzblJlcUlFLAorCQkJCXNhcF9jdHgtPm5TdGFXUEFSU25SZXFJZUxlbmd0aCk7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCUZMKCJXUEFJRTogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiKSwKKwkJCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwKKwkJCQlidWZbNV0pOworCQkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCX0KKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiB3bGFuc2FwX3NldF93cHNfaWUoKSAtIHNldCBXUEkgSUUKKyAqIEBwQ3R4OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2RzIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIGNvbnRyb2wgYmxvY2sKKyAqICAgICAgICBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQuIFdoZW4gTUJTU0lEIGZlYXR1cmUgaXMgZW5hYmxlZCwKKyAqICAgICAgICBTQVAgY29udGV4dCBpcyBkaXJlY3RseSBwYXNzZWQgdG8gU0FQIEFQSXMuCisgKiBAcFdQU0lFOiB0U2FwX1dQU0lFIHN0cnVjdHVyZSB0aGF0IGluY2x1ZGUgV1BTIElFcworICoKKyAqIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIEFQSSBmb3IgQXBwL0hERCB0byBzZXQgV1BTIElFLgorICoKKyAqIFJldHVybjogVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisgKiAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MgYW5kIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitDREZfU1RBVFVTIHdsYW5zYXBfc2V0X3dwc19pZSh2b2lkICpwQ3R4LCB0U2FwX1dQU0lFICpwU2FwX1dQU0llKQoreworCXB0U2FwQ29udGV4dCBwU2FwQ3R4ID0gTlVMTDsKKwl2b2lkICpoSGFsID0gTlVMTDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzLCAlZCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlpZiAoQ0RGX1NBUF9NT0RFID09IGNkc19nZXRfY29ucGFyYW0oKSkgeworCQlwU2FwQ3R4ID0gQ0RTX0dFVF9TQVBfQ0IocEN0eCk7CisJCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcEN0eCIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQl9CisKKwkJaEhhbCA9IENEU19HRVRfSEFMX0NCKHBTYXBDdHgtPnBfY2RzX2djdHgpOworCQlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogSW52YWxpZCBIQUwgcG9pbnRlciBmcm9tIHBfY2RzX2djdHgiLAorCQkJCSAgX19mdW5jX18pOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJfQorCisJCWlmIChzYXBfYWNxdWlyZV9nbG9iYWxfbG9jayhwU2FwQ3R4KSA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWlmIChwU2FwX1dQU0llLT5zYXBXUFNJRUNvZGUgPT0gZVNBUF9XUFNfQkVBQ09OX0lFKSB7CisJCQkJY2RmX21lbV9jb3B5KCZwU2FwQ3R4LT5BUFdQU0lFcy5TaXJXUFNCZWFjb25JRSwKKwkJCQkJICAgICAmcFNhcF9XUFNJZS0+c2Fwd3BzaWUuCisJCQkJCSAgICAgc2FwV1BTQmVhY29uSUUsCisJCQkJCSAgICAgc2l6ZW9mKHRTYXBfV1BTQmVhY29uSUUpKTsKKwkJCX0gZWxzZSBpZiAocFNhcF9XUFNJZS0+c2FwV1BTSUVDb2RlID09CisJCQkJICAgZVNBUF9XUFNfUFJPQkVfUlNQX0lFKSB7CisJCQkJY2RmX21lbV9jb3B5KCZwU2FwQ3R4LT5BUFdQU0lFcy4KKwkJCQkJICAgICBTaXJXUFNQcm9iZVJzcElFLAorCQkJCQkgICAgICZwU2FwX1dQU0llLT5zYXB3cHNpZS4KKwkJCQkJICAgICBzYXBXUFNQcm9iZVJzcElFLAorCQkJCQkgICAgIHNpemVvZih0U2FwX1dQU1Byb2JlUnNwSUUpKTsKKwkJCX0gZWxzZSB7CisJCQkJc2FwX3JlbGVhc2VfZ2xvYmFsX2xvY2socFNhcEN0eCk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJCX0KKwkJCXNhcF9yZWxlYXNlX2dsb2JhbF9sb2NrKHBTYXBDdHgpOworCQkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfSBlbHNlCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0gZWxzZQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworfQorCisvKioKKyAqIHdsYW5zYXBfdXBkYXRlX3dwc19pZSgpIC0gdXBkYXRlIFdQSSBJRQorICogQHBDdHg6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjZHMgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgY29udHJvbCBibG9jaworICogICAgICAgIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dC4gV2hlbiBNQlNTSUQgZmVhdHVyZSBpcyBlbmFibGVkLAorICogICAgICAgIFNBUCBjb250ZXh0IGlzIGRpcmVjdGx5IHBhc3NlZCB0byBTQVAgQVBJcy4KKyAqCisgKiBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBBUEkgZm9yIEFwcC9IREQgdG8gdXBkYXRlIFdQUyBJRS4KKyAqCisgKiBSZXR1cm46IFRoZSBDREZfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorICogICAgICAgICBDREZfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzIGFuZCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworQ0RGX1NUQVRVUyB3bGFuc2FwX3VwZGF0ZV93cHNfaWUodm9pZCAqcEN0eCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFVTFQ7CisJcHRTYXBDb250ZXh0IHBTYXBDdHggPSBOVUxMOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl2b2lkICpoSGFsID0gTlVMTDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICIlcywgJWQiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJaWYgKENERl9TQVBfTU9ERSA9PSBjZHNfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBDdHgpOworCQlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBDdHgiLAorCQkJCSAgX19mdW5jX18pOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJfQorCisJCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihwU2FwQ3R4LT5wX2Nkc19nY3R4KTsKKwkJaWYgKE5VTEwgPT0gaEhhbCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwX2Nkc19nY3R4IiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKworCQljZGZfcmV0X3N0YXR1cyA9CisJCQlzbWVfcm9hbV91cGRhdGVfYXB3cHNpZShoSGFsLCBwU2FwQ3R4LT5zZXNzaW9uSWQsCisJCQkJCQkmcFNhcEN0eC0+QVBXUFNJRXMpOworCisJCWlmIChjZGZfcmV0X3N0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQl9CisKKwl9CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiB3bGFuc2FwX2dldF93cHNfc3RhdGUoKSAtIGdldCBXUFMgc2Vzc2lvbiBzdGF0ZQorICogQHBDdHg6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjZHMgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgY29udHJvbCBibG9jaworICogICAgICAgIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dC4gV2hlbiBNQlNTSUQgZmVhdHVyZSBpcyBlbmFibGVkLAorICogICAgICAgIFNBUCBjb250ZXh0IGlzIGRpcmVjdGx5IHBhc3NlZCB0byBTQVAgQVBJcy4KKyAqIEBwYldQU1N0YXRlOiBQb2ludGVyIHRvIHZhcmlhYmxlIHRvIGluZGljYXRlIGlmIGRldmljZSBpcyBpbgorICogICAgICAgICAgICAgIFdQUyBSZWdpc3RyYXRpb24gc3RhdGUKKyAqCisgKiBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBjaGVjayBpZiBXUFMgc2Vzc2lvbiBpbiBwcm9jZXNzLgorICoKKyAqIFJldHVybjogVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisgKiAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAqLworQ0RGX1NUQVRVUyB3bGFuc2FwX2dldF93cHNfc3RhdGUodm9pZCAqcEN0eCwgYm9vbCAqYldQU1N0YXRlKQoreworCXB0U2FwQ29udGV4dCBwU2FwQ3R4ID0gTlVMTDsKKwl2b2lkICpoSGFsID0gTlVMTDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzLCAlZCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlpZiAoQ0RGX1NBUF9NT0RFID09IGNkc19nZXRfY29ucGFyYW0oKSkgeworCisJCXBTYXBDdHggPSBDRFNfR0VUX1NBUF9DQihwQ3R4KTsKKwkJaWYgKE5VTEwgPT0gcFNhcEN0eCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwQ3R4IiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKworCQloSGFsID0gQ0RTX0dFVF9IQUxfQ0IocFNhcEN0eC0+cF9jZHNfZ2N0eCk7CisJCWlmIChOVUxMID09IGhIYWwpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBJbnZhbGlkIEhBTCBwb2ludGVyIGZyb20gcF9jZHNfZ2N0eCIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQl9CisKKwkJaWYgKHNhcF9hY3F1aXJlX2dsb2JhbF9sb2NrKHBTYXBDdHgpID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKHBTYXBDdHgtPkFQV1BTSUVzLlNpcldQU1Byb2JlUnNwSUUuCisJCQkgICAgRmllbGRQcmVzZW50ICYKKwkJCSAgICBTSVJfV1BTX1BST0JSU1BfU0VMRUNURURSRUdJU1RSQV9QUkVTRU5UKQorCQkJCSpiV1BTU3RhdGUgPSB0cnVlOworCQkJZWxzZQorCQkJCSpiV1BTU3RhdGUgPSBmYWxzZTsKKworCQkJc2FwX3JlbGVhc2VfZ2xvYmFsX2xvY2socFNhcEN0eCk7CisKKwkJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0gZWxzZQorCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9IGVsc2UKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKworfQorCitDREZfU1RBVFVTIHNhcF9hY3F1aXJlX2dsb2JhbF9sb2NrKHB0U2FwQ29udGV4dCBwU2FwQ3R4KQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQVVMVDsKKworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX211dGV4X2FjcXVpcmUoJnBTYXBDdHgtPlNhcEdsb2JhbExvY2spKSkgeworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiBjZGZfc3RhdHVzOworfQorCitDREZfU1RBVFVTIHNhcF9yZWxlYXNlX2dsb2JhbF9sb2NrKHB0U2FwQ29udGV4dCBwU2FwQ3R4KQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQVVMVDsKKworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX211dGV4X3JlbGVhc2UoJnBTYXBDdHgtPlNhcEdsb2JhbExvY2spKSkgeworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5zYXBfc2V0X3dwYXJzbl9pZXMoKSAtIHNldCBXUEEgIFJTTiBJRXMKKyAqIEBwQ3R4OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2RzIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIGNvbnRyb2wgYmxvY2sKKyAqICAgICAgICBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQuIFdoZW4gTUJTU0lEIGZlYXR1cmUgaXMgZW5hYmxlZCwKKyAqICAgICAgICBTQVAgY29udGV4dCBpcyBkaXJlY3RseSBwYXNzZWQgdG8gU0FQIEFQSXMuCisgKiBAcFdQQVJTTklFcyAgOiBidWZmZXIgdG8gdGhlIFdQQS9SU04gSUVzCisgKiBAV1BBUlNOSUVzTGVuOiBsZW5ndGggb2YgV1BBL1JTTiBJRXMKKyAqCisgKiBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBzZXQgQVAgV1BBIGFuZCBSU04gSUUgaW4gaXRzCisgKiBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlLgorICoKKyAqIFJldHVybjogVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisgKiAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MgYW5kIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK0NERl9TVEFUVVMgd2xhbnNhcF9zZXRfd3BhcnNuX2llcworCSh2b2lkICpwQ3R4LCB1aW50OF90ICpwV1BBUlNOSUVzLCB1aW50MzJfdCBXUEFSU05JRXNMZW4pIHsKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXZvaWQgKmhIYWwgPSBOVUxMOworCisJaWYgKENERl9TQVBfTU9ERSA9PSBjZHNfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBDdHgpOworCQlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBDdHgiLAorCQkJCSAgX19mdW5jX18pOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJfQorCisJCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihwU2FwQ3R4LT5wX2Nkc19nY3R4KTsKKwkJaWYgKE5VTEwgPT0gaEhhbCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwX2Nkc19nY3R4IiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKworCQlwU2FwQ3R4LT5BUFdQQVJTTklFcy5sZW5ndGggPSAodWludDE2X3QpIFdQQVJTTklFc0xlbjsKKwkJY2RmX21lbV9jb3B5KHBTYXBDdHgtPkFQV1BBUlNOSUVzLnJzbklFZGF0YSwgcFdQQVJTTklFcywKKwkJCSAgICAgV1BBUlNOSUVzTGVuKTsKKworCQljZGZfcmV0X3N0YXR1cyA9CisJCQlzbWVfcm9hbV91cGRhdGVfYXB3cGFyc25pX2VzKGhIYWwsIHBTYXBDdHgtPnNlc3Npb25JZCwKKwkJCQkJCSAgICAgJnBTYXBDdHgtPkFQV1BBUlNOSUVzKTsKKworCQlpZiAoY2RmX3JldF9zdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9IGVsc2UgeworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJfQorCX0KKworCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7Cit9CisKKy8qKgorICogd2xhbnNhcF9zZW5kX2FjdGlvbigpIC0gc2VuZCBhY3Rpb24gZnJhbWUKKyAqIEBwQ3R4OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2RzIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIGNvbnRyb2wgYmxvY2sKKyAqICAgICAgICBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQuIFdoZW4gTUJTU0lEIGZlYXR1cmUgaXMgZW5hYmxlZCwKKyAqICAgICAgICBTQVAgY29udGV4dCBpcyBkaXJlY3RseSBwYXNzZWQgdG8gU0FQIEFQSXMuCisgKiBAcEJ1ZjogUG9pbnRlciBvZiB0aGUgYWN0aW9uIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkCisgKiBAbGVuOiBMZW5ndGggb2YgdGhlIGFjdGlvbiBmcmFtZQorICoKKyAqIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIHRvIHNlbmQgYWN0aW9uIGZyYW1lIHNlbnQgYnkgdXBwZXIgbGF5ZXIuCisgKgorICogUmV0dXJuOiBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyogICAgICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcyBhbmQgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqLworQ0RGX1NUQVRVUyB3bGFuc2FwX3NlbmRfYWN0aW9uKHZvaWQgKnBDdHgsIGNvbnN0IHVpbnQ4X3QgKnBCdWYsCisJdWludDMyX3QgbGVuLCB1aW50MTZfdCB3YWl0LCB1aW50MTZfdCBjaGFubmVsX2ZyZXEpCit7CisJcHRTYXBDb250ZXh0IHBTYXBDdHggPSBOVUxMOworCXZvaWQgKmhIYWwgPSBOVUxMOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWlmIChDREZfU0FQX01PREUgPT0gY2RzX2dldF9jb25wYXJhbSgpKSB7CisJCXBTYXBDdHggPSBDRFNfR0VUX1NBUF9DQihwQ3R4KTsKKwkJaWYgKE5VTEwgPT0gcFNhcEN0eCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwQ3R4IiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKwkJaEhhbCA9IENEU19HRVRfSEFMX0NCKHBTYXBDdHgtPnBfY2RzX2djdHgpOworCQlpZiAoKE5VTEwgPT0gaEhhbCkgfHwgKGVTQVBfVFJVRSAhPSBwU2FwQ3R4LT5pc1NhcFNlc3Npb25PcGVuKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEhBTCBwb2ludGVyICglcCkgTlVMTCBPUiBTTUUgc2Vzc2lvbiBpcyBub3Qgb3BlbiAoJWQpIiwKKwkJCQkgIF9fZnVuY19fLCBoSGFsLCBwU2FwQ3R4LT5pc1NhcFNlc3Npb25PcGVuKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKworCQljZGZfcmV0X3N0YXR1cyA9CisJCQlzbWVfc2VuZF9hY3Rpb24oaEhhbCwgcFNhcEN0eC0+c2Vzc2lvbklkLCBwQnVmLCBsZW4sIDAsCisJCQkwLCBjaGFubmVsX2ZyZXEpOworCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gY2RmX3JldF9zdGF0dXMpIHsKKwkJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiRmFpbGVkIHRvIFNlbmQgQWN0aW9uIEZyYW1lIik7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworfQorCisvKioKKyAqIHdsYW5zYXBfcmVtYWluX29uX2NoYW5uZWwoKSAtIHNldCByZW1haW4gb24gY2hhbm5lbAorICogQHBDdHg6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjZHMgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgY29udHJvbCBibG9jaworICogICAgICAgIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dC4gV2hlbiBNQlNTSUQgZmVhdHVyZSBpcyBlbmFibGVkLAorICogICAgICAgIFNBUCBjb250ZXh0IGlzIGRpcmVjdGx5IHBhc3NlZCB0byBTQVAgQVBJcy4KKyAqIEBjaGFubmVsOiBDaGFubmVsIG9uIHdoaWNoIGRyaXZlciBoYXMgdG8gbGlzdGVuCisgKiBAZHVyYXRpb246IER1cmF0aW9uIGZvciB3aGljaCBkcml2ZXIgaGFzIHRvIGxpc3RlbiBvbiBzcGVjaWZpZWQgY2hhbm5lbAorICogQGNhbGxiYWNrOiBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb25jZSBMaXN0ZW4gaXMgZG9uZS4KKyAqIEBwQ29udGV4dDogQ29udGV4dCBuZWVkcyB0byBiZSBjYWxsZWQgaW4gY2FsbGJhY2sgZnVuY3Rpb24uCisgKiBAc2Nhbl9pZDogc2NhbiBpZGVudGlmaWVyCisgKgorICogVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgdG8gc2V0IFJlbWFpbiBPbiBjaGFubmVsIG9uIHNwZWNpZmllZCBjaGFubmVsCisgKiBmb3Igc3BlY2lmaWVkIGR1cmF0aW9uLgorICoKKyAqIFJldHVybjogVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisgKiAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MgYW5kIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK0NERl9TVEFUVVMgd2xhbnNhcF9yZW1haW5fb25fY2hhbm5lbCh2b2lkICpwQ3R4LAorCXVpbnQ4X3QgY2hhbm5lbCwgdWludDMyX3QgZHVyYXRpb24sIHJlbWFpbk9uQ2hhbkNhbGxiYWNrIGNhbGxiYWNrLAorCXZvaWQgKnBDb250ZXh0LCB1aW50MzJfdCAqc2Nhbl9pZCkKK3sKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IE5VTEw7CisJdm9pZCAqaEhhbCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKENERl9TQVBfTU9ERSA9PSBjZHNfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBDdHgpOworCQlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBDdHgiLAorCQkJCSAgX19mdW5jX18pOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJfQorCQloSGFsID0gQ0RTX0dFVF9IQUxfQ0IocFNhcEN0eC0+cF9jZHNfZ2N0eCk7CisJCWlmICgoTlVMTCA9PSBoSGFsKSB8fCAoZVNBUF9UUlVFICE9IHBTYXBDdHgtPmlzU2FwU2Vzc2lvbk9wZW4pKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogSEFMIHBvaW50ZXIgKCVwKSBOVUxMIE9SIFNNRSBzZXNzaW9uIGlzIG5vdCBvcGVuICglZCkiLAorCQkJCSAgX19mdW5jX18sIGhIYWwsIHBTYXBDdHgtPmlzU2FwU2Vzc2lvbk9wZW4pOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJfQorCisJCWNkZl9yZXRfc3RhdHVzID0gc21lX3JlbWFpbl9vbl9jaGFubmVsKGhIYWwsIHBTYXBDdHgtPnNlc3Npb25JZCwKKwkJCQkJY2hhbm5lbCwgZHVyYXRpb24sIGNhbGxiYWNrLCBwQ29udGV4dCwKKwkJCQkJdHJ1ZSwgc2Nhbl9pZCk7CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfcmV0X3N0YXR1cykgeworCQkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICJGYWlsZWQgdG8gU2V0IFJlbWFpbiBvbiBDaGFubmVsIik7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworfQorCisvKioKKyAqIHdsYW5zYXBfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKCkgLSBjYW5jZWwgcmVtYWluIG9uIGNoYW5uZWwKKyAqIEBwQ3R4OiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2RzIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIGNvbnRyb2wgYmxvY2sKKyAqICAgICAgICBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQuIFdoZW4gTUJTU0lEIGZlYXR1cmUgaXMgZW5hYmxlZCwKKyAqICAgICAgICBTQVAgY29udGV4dCBpcyBkaXJlY3RseSBwYXNzZWQgdG8gU0FQIEFQSXMuCisgKgorICogVGhpcyBhcGkgY2FuY2VsIHByZXZpb3VzIHJlbWFpbiBvbiBjaGFubmVsIHJlcXVlc3QuCisgKgorICogUmV0dXJuOiBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcyBhbmQgZXJyb3IgY29kZSBvdGhlcndpZQorICovCitDREZfU1RBVFVTIHdsYW5zYXBfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKHZvaWQgKnBDdHgsCisJdWludDMyX3Qgc2Nhbl9pZCkKK3sKKwlwdFNhcENvbnRleHQgcFNhcEN0eCA9IE5VTEw7CisJdm9pZCAqaEhhbCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKENERl9TQVBfTU9ERSA9PSBjZHNfZ2V0X2NvbnBhcmFtKCkpIHsKKwkJcFNhcEN0eCA9IENEU19HRVRfU0FQX0NCKHBDdHgpOworCQlpZiAoTlVMTCA9PSBwU2FwQ3R4KSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBDdHgiLAorCQkJCSAgX19mdW5jX18pOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwkJfQorCQloSGFsID0gQ0RTX0dFVF9IQUxfQ0IocFNhcEN0eC0+cF9jZHNfZ2N0eCk7CisJCWlmICgoTlVMTCA9PSBoSGFsKSB8fAorCQkJKGVTQVBfVFJVRSAhPSBwU2FwQ3R4LT5pc1NhcFNlc3Npb25PcGVuKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEhBTCBwb2ludGVyICglcCkgTlVMTCBPUiBTTUUgc2Vzc2lvbiBpcyBub3Qgb3BlbiAoJWQpIiwKKwkJCQkgIF9fZnVuY19fLCBoSGFsLCBwU2FwQ3R4LT5pc1NhcFNlc3Npb25PcGVuKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKworCQljZGZfcmV0X3N0YXR1cyA9CisJCQlzbWVfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKGhIYWwsIHBTYXBDdHgtPnNlc3Npb25JZCwKKwkJCXNjYW5faWQpOworCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gY2RmX3JldF9zdGF0dXMpIHsKKwkJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiRmFpbGVkIHRvIENhbmNlbCBSZW1haW4gb24gQ2hhbm5lbCIpOworCisJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKK30KKy8qKgorICogd2xhbnNhcF9yZWdpc3Rlcl9tZ210X2ZyYW1lKCkgLSByZWdpc3RlciBtYW5hZ2VtZW50IGZyYW1lCisgKiBAcEN0eDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIGNkcyBjb250ZXh0OyBhIGhhbmRsZSB0byBTQVAncyBjb250cm9sIGJsb2NrCisgKiAgICAgICAgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0LiBXaGVuIE1CU1NJRCBmZWF0dXJlIGlzIGVuYWJsZWQsCisgKiAgICAgICAgU0FQIGNvbnRleHQgaXMgZGlyZWN0bHkgcGFzc2VkIHRvIFNBUCBBUElzLgorICogQGZyYW1lVHlwZTogZnJhbWVUeXBlIHRoYXQgbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIFBFLgorICogQG1hdGNoRGF0YTogRGF0YSBwb2ludGVyIHdoaWNoIHNob3VsZCBiZSBtYXRjaGVkIGFmdGVyIGZyYW1lIHR5cGUgaXMgbWF0Y2hlZC4KKyAqIEBtYXRjaExlbjogTGVuZ3RoIG9mIHRoZSBtYXRjaERhdGEKKyAqCisgKiBIREQgdXNlIHRoaXMgQVBJIHRvIHJlZ2lzdGVyIHNwZWNpZmllZCB0eXBlIG9mIGZyYW1lIHdpdGggQ09SRSBzdGFjay4KKyAqIE9uIHJlY2VpdmluZyBzdWNoIGtpbmQgb2YgZnJhbWUgQ09SRSBzdGFjayBzaG91bGQgcGFzcyB0aGlzIGZyYW1lIHRvIEhERAorICoKKyAqIFJldHVybjogVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisgKiAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MgYW5kIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK0NERl9TVEFUVVMgd2xhbnNhcF9yZWdpc3Rlcl9tZ210X2ZyYW1lCisJKHZvaWQgKnBDdHgsCisJdWludDE2X3QgZnJhbWVUeXBlLCB1aW50OF90ICptYXRjaERhdGEsIHVpbnQxNl90IG1hdGNoTGVuKSB7CisJcHRTYXBDb250ZXh0IHBTYXBDdHggPSBOVUxMOworCXZvaWQgKmhIYWwgPSBOVUxMOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWlmIChDREZfU0FQX01PREUgPT0gY2RzX2dldF9jb25wYXJhbSgpKSB7CisJCXBTYXBDdHggPSBDRFNfR0VUX1NBUF9DQihwQ3R4KTsKKwkJaWYgKE5VTEwgPT0gcFNhcEN0eCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwQ3R4IiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKwkJaEhhbCA9IENEU19HRVRfSEFMX0NCKHBTYXBDdHgtPnBfY2RzX2djdHgpOworCQlpZiAoKE5VTEwgPT0gaEhhbCkgfHwgKGVTQVBfVFJVRSAhPSBwU2FwQ3R4LT5pc1NhcFNlc3Npb25PcGVuKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IEhBTCBwb2ludGVyICglcCkgTlVMTCBPUiBTTUUgc2Vzc2lvbiBpcyBub3Qgb3BlbiAoJWQpIiwKKwkJCQkgIF9fZnVuY19fLCBoSGFsLCBwU2FwQ3R4LT5pc1NhcFNlc3Npb25PcGVuKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKworCQljZGZfcmV0X3N0YXR1cyA9IHNtZV9yZWdpc3Rlcl9tZ210X2ZyYW1lKGhIYWwsIHBTYXBDdHgtPnNlc3Npb25JZCwKKwkJCQkJCQkgZnJhbWVUeXBlLCBtYXRjaERhdGEsCisJCQkJCQkJIG1hdGNoTGVuKTsKKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IGNkZl9yZXRfc3RhdHVzKSB7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIkZhaWxlZCB0byBSZWdpc3RlciBNR01UIGZyYW1lIik7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworfQorCisvKioKKyAqIHdsYW5zYXBfZGVfcmVnaXN0ZXJfbWdtdF9mcmFtZSgpIC0gZGUgcmVnaXN0ZXIgbWFuYWdlbWVudCBmcmFtZQorICogQHBDdHg6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjZHMgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgY29udHJvbCBibG9jaworICogICAgICAgIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dC4gV2hlbiBNQlNTSUQgZmVhdHVyZSBpcyBlbmFibGVkLAorICogICAgICAgIFNBUCBjb250ZXh0IGlzIGRpcmVjdGx5IHBhc3NlZCB0byBTQVAgQVBJcy4KKyAqIEBmcmFtZVR5cGU6IGZyYW1lVHlwZSB0aGF0IG5lZWRzIHRvIGJlIERlLXJlZ2lzdGVyZWQgd2l0aCBQRS4KKyAqIEBtYXRjaERhdGE6IERhdGEgcG9pbnRlciB3aGljaCBzaG91bGQgYmUgbWF0Y2hlZCBhZnRlciBmcmFtZSB0eXBlIGlzIG1hdGNoZWQuCisgKiBAbWF0Y2hMZW46IExlbmd0aCBvZiB0aGUgbWF0Y2hEYXRhCisgKgorICogVGhpcyBBUEkgaXMgdXNlZCB0byBkZXJlZ2lzdGVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBmcmFtZS4KKyAqCisgKiBSZXR1cm46IFRoZSBDREZfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorICogICAgICAgICBDREZfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzIGFuZCBlcnJvciBjb2RlIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTIHdsYW5zYXBfZGVfcmVnaXN0ZXJfbWdtdF9mcmFtZQorCSh2b2lkICpwQ3R4LAorCXVpbnQxNl90IGZyYW1lVHlwZSwgdWludDhfdCAqbWF0Y2hEYXRhLCB1aW50MTZfdCBtYXRjaExlbikgeworCXB0U2FwQ29udGV4dCBwU2FwQ3R4ID0gTlVMTDsKKwl2b2lkICpoSGFsID0gTlVMTDsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAoQ0RGX1NBUF9NT0RFID09IGNkc19nZXRfY29ucGFyYW0oKSkgeworCQlwU2FwQ3R4ID0gQ0RTX0dFVF9TQVBfQ0IocEN0eCk7CisJCWlmIChOVUxMID09IHBTYXBDdHgpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcEN0eCIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQl9CisJCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihwU2FwQ3R4LT5wX2Nkc19nY3R4KTsKKwkJaWYgKChOVUxMID09IGhIYWwpIHx8IChlU0FQX1RSVUUgIT0gcFNhcEN0eC0+aXNTYXBTZXNzaW9uT3BlbikpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBIQUwgcG9pbnRlciAoJXApIE5VTEwgT1IgU01FIHNlc3Npb24gaXMgbm90IG9wZW4gKCVkKSIsCisJCQkJICBfX2Z1bmNfXywgaEhhbCwgcFNhcEN0eC0+aXNTYXBTZXNzaW9uT3Blbik7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQl9CisKKwkJY2RmX3JldF9zdGF0dXMgPQorCQkJc21lX2RlcmVnaXN0ZXJfbWdtdF9mcmFtZShoSGFsLCBwU2FwQ3R4LT5zZXNzaW9uSWQsIGZyYW1lVHlwZSwKKwkJCQkJCSAgbWF0Y2hEYXRhLCBtYXRjaExlbik7CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfcmV0X3N0YXR1cykgeworCQkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICJGYWlsZWQgdG8gRGVyZWdpc3RlciBNR01UIGZyYW1lIik7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgIHdsYW5zYXBfY2hhbm5lbF9jaGFuZ2VfcmVxdWVzdAorCisgICBERVNDUklQVElPTgorICAgVGhpcyBBUEkgaXMgdXNlZCB0byBzZW5kIGFuIEluZGljYXRpb24gdG8gU01FL1BFIHRvIGNoYW5nZSB0aGUKKyAgIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0IGNoYW5uZWwuCisKKyAgIFRoZSBDaGFubmVsIGNoYW5nZSB3aWxsIGJlIGlzc3VlZCBieSBTQVAgdW5kZXIgdGhlIGZvbGxvd2luZworICAgc2NlbmFyaW9zLgorICAgMS4gQSByYWRhciBpbmRpY2F0aW9uIGlzIHJlY2VpdmVkICBkdXJpbmcgU0FQIENBQyBXQUlUIFNUQVRFIGFuZAorICAgICAgY2hhbm5lbCBjaGFuZ2UgaXMgcmVxdWlyZWQuCisgICAyLiBBIHJhZGFyIGluZGljYXRpb24gaXMgcmVjZWl2ZWQgZHVyaW5nIFNBUCBTVEFSVEVEIFNUQVRFIGFuZAorICAgICAgY2hhbm5lbCBjaGFuZ2UgaXMgcmVxdWlyZWQuCisgICBERVBFTkRFTkNJRVMKKyAgIE5BLgorCisgICBQQVJBTUVURVJTCisgICBJTgorICAgcFNhcEN0eDogUG9pbnRlciB0byBjZHMgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisKKyAgIFJFVFVSTiBWQUxVRQorICAgVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0NERl9TVEFUVVMKK3dsYW5zYXBfY2hhbm5lbF9jaGFuZ2VfcmVxdWVzdCh2b2lkICpwU2FwQ3R4LCB1aW50OF90IHRhcmdldENoYW5uZWwpCit7CisJcHRTYXBDb250ZXh0IHNhcENvbnRleHQgPSBOVUxMOworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl2b2lkICpoSGFsID0gTlVMTDsKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gTlVMTDsKKwllQ3NyUGh5TW9kZSBwaHlfbW9kZTsKKwl1aW50MzJfdCBjYl9tb2RlOworCXVpbnQzMl90IHZodF9jaGFubmVsX3dpZHRoOworCWNoYW5fcGFyYW1zX3QgY2hfcGFyYW1zOworCXNhcENvbnRleHQgPSAocHRTYXBDb250ZXh0KSBwU2FwQ3R4OworCisJaWYgKE5VTEwgPT0gc2FwQ29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihzYXBDb250ZXh0LT5wX2Nkc19nY3R4KTsKKwlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwX2Nkc19nY3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKwltYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJcGh5X21vZGUgPSBzYXBDb250ZXh0LT5jc3Jfcm9hbVByb2ZpbGUucGh5TW9kZTsKKwlzYXBDb250ZXh0LT5jc3Jfcm9hbVByb2ZpbGUuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbMF0gPSB0YXJnZXRDaGFubmVsOworCS8qCisJICogV2UgYXJlIGdldHRpbmcgY2hhbm5lbCBib25kaW5nIG1vZGUgZnJvbSBzYXBEZnNJbmZvciBzdHJ1Y3R1cmUKKwkgKiBiZWNhdXNlIHdlJ3ZlIGltcGxlbWVudGVkIGNoYW5uZWwgd2lkdGggZmFsbGJhY2sgbWVjaGFuaXNtIGZvciBERlMKKwkgKiB3aGljaCB3aWxsIHJlc3VsdCBpbiBjaGFubmVsIHdpZHRoIGNoYW5naW5nIGR5bmFtaWNhbGx5LgorCSAqLworCWNiX21vZGUgPSBtYWNfY3R4LT5zYXAuU2FwRGZzSW5mby5uZXdfY2JNb2RlOworCXZodF9jaGFubmVsX3dpZHRoID0gbWFjX2N0eC0+c2FwLlNhcERmc0luZm8ubmV3X2NoYW5XaWR0aDsKKwljaF9wYXJhbXMuY2hfd2lkdGggPSB2aHRfY2hhbm5lbF93aWR0aDsKKwlzbWVfc2V0X2NoX3BhcmFtcyhoSGFsLCBwaHlfbW9kZSwgdGFyZ2V0Q2hhbm5lbCwgMCwgJmNoX3BhcmFtcyk7CisJc2FwQ29udGV4dC0+Y2hfcGFyYW1zLmNoX3dpZHRoID0gdmh0X2NoYW5uZWxfd2lkdGg7CisJc2FwQ29udGV4dC0+Y3NyX3JvYW1Qcm9maWxlLmNoX3BhcmFtcy5jaF93aWR0aCA9IHZodF9jaGFubmVsX3dpZHRoOworCWNkZl9yZXRfc3RhdHVzID0gc21lX3JvYW1fY2hhbm5lbF9jaGFuZ2VfcmVxKGhIYWwsIHNhcENvbnRleHQtPmJzc2lkLAorCQkJCWNiX21vZGUsICZzYXBDb250ZXh0LT5jc3Jfcm9hbVByb2ZpbGUpOworCisJaWYgKGNkZl9yZXRfc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlzYXBfc2lnbmFsX2hkZF9ldmVudChzYXBDb250ZXh0LCBOVUxMLAorCQkJZVNBUF9DSEFOTkVMX0NIQU5HRV9FVkVOVCwKKwkJCSh2b2lkICopIGVTQVBfU1RBVFVTX1NVQ0NFU1MpOworCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgRlVOQ1RJT04gICAgd2xhbnNhcF9zdGFydF9iZWFjb25fcmVxCisgICBERVNDUklQVElPTgorICAgVGhpcyBBUEkgaXMgdXNlZCB0byBzZW5kIGFuIEluZGljYXRpb24gdG8gU01FL1BFIHRvIHN0YXJ0CisgICBiZWFjb25pbmcgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwuCisKKyAgIEJyaWVmOldoZW4gU0FQIGlzIHN0YXJ0ZWQgb24gREZTIGNoYW5uZWwgYW5kIHdoZW4gQUREIEJTUyBSRVNQIGlzIHJlY2VpdmVkCisgICBMSU0gdGVtcG9yYXJpbHkgaG9sZHMgb2ZmIEJlYWNvbmluZyBmb3IgU0FQIHRvIGRvIENBQyBXQUlULiBXaGVuCisgICBDQUMgV0FJVCBpcyBkb25lIFNBUCByZXN1bWVzIHRoZSBCZWFjb24gVHggYnkgc2VuZGluZyBhIHN0YXJ0IGJlYWNvbgorICAgcmVxdWVzdCB0byBMSU0uCisKKyAgIERFUEVOREVOQ0lFUworICAgTkEuCisKKyAgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgIHBTYXBDdHg6IFBvaW50ZXIgdG8gY2RzIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorCisgICBSRVRVUk4gVkFMVUUKKyAgIFRoZSBDREZfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICBDREZfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisKKyAgIFNJREUgRUZGRUNUUworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDREZfU1RBVFVTIHdsYW5zYXBfc3RhcnRfYmVhY29uX3JlcSh2b2lkICpwU2FwQ3R4KQoreworCXB0U2FwQ29udGV4dCBzYXBDb250ZXh0ID0gTlVMTDsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdm9pZCAqaEhhbCA9IE5VTEw7CisJdWludDhfdCBkZnNDYWNXYWl0U3RhdHVzID0gMDsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gTlVMTDsKKwlzYXBDb250ZXh0ID0gKHB0U2FwQ29udGV4dCkgcFNhcEN0eDsKKworCWlmIChOVUxMID09IHNhcENvbnRleHQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwloSGFsID0gQ0RTX0dFVF9IQUxfQ0Ioc2FwQ29udGV4dC0+cF9jZHNfZ2N0eCk7CisJaWYgKE5VTEwgPT0gaEhhbCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBJbnZhbGlkIEhBTCBwb2ludGVyIGZyb20gcF9jZHNfZ2N0eCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJLyogTm8gUmFkYXIgd2FzIGZvdW5kIGR1cmluZyBDQUMgV0FJVCwgU28gc3RhcnQgQmVhY29uaW5nICovCisJaWYgKHBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcF9yYWRhcl9mb3VuZF9zdGF0dXMgPT0gZmFsc2UpIHsKKwkJLyogQ0FDIFdhaXQgZG9uZSB3aXRob3V0IGFueSBSYWRhciBEZXRlY3Rpb24gKi8KKwkJZGZzQ2FjV2FpdFN0YXR1cyA9IHRydWU7CisJCWNkZl9yZXRfc3RhdHVzID0gc21lX3JvYW1fc3RhcnRfYmVhY29uX3JlcShoSGFsLAorCQkJCQkJCSAgIHNhcENvbnRleHQtPmJzc2lkLAorCQkJCQkJCSAgIGRmc0NhY1dhaXRTdGF0dXMpOworCQlpZiAoY2RmX3JldF9zdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgd2xhbnNhcF9kZnNfc2VuZF9jc2FfaWVfcmVxdWVzdAorCisgICBERVNDUklQVElPTgorICAgVGhpcyBBUEkgaXMgdXNlZCB0byBzZW5kIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCByZXF1ZXN0IHRvIFBFCisgICBERVBFTkRFTkNJRVMKKyAgIE5BLgorCisgICBQQVJBTUVURVJTCisgICBJTgorICAgcFNhcEN0eDogUG9pbnRlciB0byBjZHMgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisKKyAgIFJFVFVSTiBWQUxVRQorICAgVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0NERl9TVEFUVVMgd2xhbnNhcF9kZnNfc2VuZF9jc2FfaWVfcmVxdWVzdCh2b2lkICpwU2FwQ3R4KQoreworCXB0U2FwQ29udGV4dCBzYXBDb250ZXh0ID0gTlVMTDsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdm9pZCAqaEhhbCA9IE5VTEw7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IE5VTEw7CisJdWludDMyX3QgY2Jtb2RlLCB2aHRfY2hfd2lkdGg7CisJdWludDhfdCBjaF9iYW5kd2lkdGg7CisJc2FwQ29udGV4dCA9IChwdFNhcENvbnRleHQpIHBTYXBDdHg7CisKKwlpZiAoTlVMTCA9PSBzYXBDb250ZXh0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJaEhhbCA9IENEU19HRVRfSEFMX0NCKHNhcENvbnRleHQtPnBfY2RzX2djdHgpOworCWlmIChOVUxMID09IGhIYWwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBIQUwgcG9pbnRlciBmcm9tIHBfY2RzX2djdHgiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCXBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCS8qCisJICogV2UgYXJlIGdldHRpbmcgY2hhbm5lbCBib25kaW5nIG1vZGUgZnJvbSBzYXBEZnNJbmZvciBzdHJ1Y3R1cmUKKwkgKiBiZWNhdXNlIHdlJ3ZlIGltcGxlbWVudGVkIGNoYW5uZWwgd2lkdGggZmFsbGJhY2sgbWVjaGFuaXNtIGZvciBERlMKKwkgKiB3aGljaCB3aWxsIHJlc3VsdCBpbiBjaGFubmVsIHdpZHRoIGNoYW5naW5nIGR5bmFtaWNhbGx5LgorCSAqLworCXZodF9jaF93aWR0aCA9IHBNYWMtPnNhcC5TYXBEZnNJbmZvLm5ld19jaGFuV2lkdGg7CisJY2Jtb2RlID0gcE1hYy0+c2FwLlNhcERmc0luZm8ubmV3X2NiTW9kZTsKKworCWlmIChwTWFjLT5zYXAuU2FwRGZzSW5mby50YXJnZXRfY2hhbm5lbCA8PSAxNCB8fAorCQl2aHRfY2hfd2lkdGggPT0gZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFogfHwKKwkJdmh0X2NoX3dpZHRoID09IGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaKSB7CisJCXN3aXRjaCAoY2Jtb2RlKSB7CisJCWNhc2UgZUNTUl9JTklfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOgorCQkJY2hfYmFuZHdpZHRoID0gQlc0MF9ISUdIX1BSSU1BUlk7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0lOSV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWToKKwkJCWNoX2JhbmR3aWR0aCA9IEJXNDBfTE9XX1BSSU1BUlk7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0lOSV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDoKKwkJZGVmYXVsdDoKKwkJCWNoX2JhbmR3aWR0aCA9IEJXMjA7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWNoX2JhbmR3aWR0aCA9IEJXODA7CisJfQorCisJY2RmX3JldF9zdGF0dXMgPSBzbWVfcm9hbV9jc2FfaWVfcmVxdWVzdChoSGFsLAorCQkJCXNhcENvbnRleHQtPmJzc2lkLAorCQkJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLnRhcmdldF9jaGFubmVsLAorCQkJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLmNzYUlFUmVxdWlyZWQsCisJCQkJY2hfYmFuZHdpZHRoKTsKKworCWlmIChjZGZfcmV0X3N0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICB3bGFuc2FwX2dldF9kZnNfaWdub3JlX2NhYworCisgICBERVNDUklQVElPTgorICAgVGhpcyBBUEkgaXMgdXNlZCB0byBnZXQgdGhlIHZhbHVlIG9mIGlnbm9yZV9jYWMgdmFsdWUKKworICAgREVQRU5ERU5DSUVTCisgICBOQS4KKworICAgUEFSQU1FVEVSUworICAgSU4KKyAgIGhIYWwgOiBIQUwgcG9pbnRlcgorICAgcElnbm9yZV9jYWMgOiBwb2ludGVyIHRvIGlnbm9yZV9jYWMgdmFyaWFibGUKKworICAgUkVUVVJOIFZBTFVFCisgICBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworQ0RGX1NUQVRVUyB3bGFuc2FwX2dldF9kZnNfaWdub3JlX2NhYyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgKnBJZ25vcmVfY2FjKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBOVUxMOworCisJaWYgKE5VTEwgIT0gaEhhbCkgeworCQlwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBoSGFsIHBvaW50ZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJKnBJZ25vcmVfY2FjID0gcE1hYy0+c2FwLlNhcERmc0luZm8uaWdub3JlX2NhYzsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICB3bGFuc2FwX3NldF9kZnNfaWdub3JlX2NhYworCisgICBERVNDUklQVElPTgorICAgVGhpcyBBUEkgaXMgdXNlZCB0byBTZXQgdGhlIHZhbHVlIG9mIGlnbm9yZV9jYWMgdmFsdWUKKworICAgREVQRU5ERU5DSUVTCisgICBOQS4KKworICAgUEFSQU1FVEVSUworICAgSU4KKyAgIGhIYWwgOiBIQUwgcG9pbnRlcgorICAgaWdub3JlX2NhYyA6IHZhbHVlIHRvIHNldCBmb3IgaWdub3JlX2NhYyB2YXJpYWJsZSBpbiBERlMgZ2xvYmFsIHN0cnVjdHVyZS4KKworICAgUkVUVVJOIFZBTFVFCisgICBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworQ0RGX1NUQVRVUyB3bGFuc2FwX3NldF9kZnNfaWdub3JlX2NhYyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgaWdub3JlX2NhYykKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gTlVMTDsKKworCWlmIChOVUxMICE9IGhIYWwpIHsKKwkJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgaEhhbCBwb2ludGVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXBNYWMtPnNhcC5TYXBEZnNJbmZvLmlnbm9yZV9jYWMgPSAoaWdub3JlX2NhYyA+PSB0cnVlKSA/CisJCQkJCSAgdHJ1ZSA6IGZhbHNlOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd2xhbnNhcF9zZXRfZGZzX3Jlc3RyaWN0X2phcGFuX3c1MygpIC0gZW5hYmxlL2Rpc2FibGUgZGZTIGZvciBqYXBhbgorICogQGhIYWwgOiBIQUwgcG9pbnRlcgorICogQGRpc2FibGVfRGZzX0phcGFuVzMgOkluZGljYXRlcyBpZiBKYXBhbiBXNTMgaXMgZGlzYWJsZWQgd2hlbiBzZXQgdG8gMQorICogICAgICAgICAgICAgICAgICAgICAgIEluZGljYXRlcyBpZiBKYXBhbiBXNTMgaXMgZW5hYmxlZCB3aGVuIHNldCB0byAwCisgKgorICogVGhpcyBBUEkgaXMgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSBKYXBhbiBXNTMgQmFuZAorICogUmV0dXJuOiBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICovCitDREZfU1RBVFVTCit3bGFuc2FwX3NldF9kZnNfcmVzdHJpY3RfamFwYW5fdzUzKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBkaXNhYmxlX0Rmc19XNTMpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCBkZnNfcmVnaW9uOworCisJaWYgKE5VTEwgIT0gaEhhbCkgeworCQlwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBoSGFsIHBvaW50ZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJY2RzX2dldF9kZnNfcmVnaW9uKCZkZnNfcmVnaW9uKTsKKworCS8qCisJICogU2V0IHRoZSBKQVBBTiBXNTMgcmVzdHJpY3Rpb24gb25seSBpZiB0aGUgY3VycmVudAorCSAqIHJlZ3VsYXRvcnkgZG9tYWluIGlzIEpBUEFOLgorCSAqLworCWlmIChERlNfTUtLNF9ET01BSU4gPT0gZGZzX3JlZ2lvbikgeworCQlwTWFjLT5zYXAuU2FwRGZzSW5mby5pc19kZnNfdzUzX2Rpc2FibGVkID0gZGlzYWJsZV9EZnNfVzUzOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsCisJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKwkJCSAgRkwoInNhcGRmczogU0VUIERGUyBKQVBBTiBXNTMgRElTQUJMRUQgPSAlZCIpLAorCQkJICBwTWFjLT5zYXAuU2FwRGZzSW5mby5pc19kZnNfdzUzX2Rpc2FibGVkKTsKKworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMCisJCQkJICAoIlJlZ2RvbWFpbiBub3QgamFwYW4sIHNldCBkaXNhYmxlIEpQIFc1MyBub3QgdmFsaWQiKSk7CisKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKy8qKgorICogd2xhbl9zYXBfc2V0X2NoYW5uZWxfYXZvaWRhbmNlKCkgLSBzZXRzIHNhcCBtY2MgY2hhbm5lbCBhdm9pZGFuY2UgaW5pIHBhcmFtCisgKiBAaGFsOiAgICAgICAgICAgICAgICAgICAgICAgIGhhbCBoYW5kbGUKKyAqIEBzYXBfY2hhbm5lbF9hdm9pZGFuY2U6ICAgICAgaW5pIHBhcmFtZXRlciB2YWx1ZQorICoKKyAqIHNldHMgc2FwIG1jYyBjaGFubmVsIGF2b2lkYW5jZSBpbmkgcGFyYW0sIHRvIGJlIGNhbGxlZCBpbiBzYXBfc3RhcnQKKyAqCisgKiBSZXR1cm46IHN1Y2Nlc3Mgb2YgZmFpbHVyZSBvZiBvcGVyYXRpb24KKyAqLworQ0RGX1NUQVRVUword2xhbl9zYXBfc2V0X2NoYW5uZWxfYXZvaWRhbmNlKHRIYWxIYW5kbGUgaGFsLCBib29sIHNhcF9jaGFubmVsX2F2b2lkYW5jZSkKK3sKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gTlVMTDsKKwlpZiAoTlVMTCAhPSBoYWwpCisJCW1hY19jdHggPSBQTUFDX1NUUlVDVChoYWwpOworCWlmIChtYWNfY3R4ID09IE5VTEwgfHwgaGFsID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJoYWwgb3IgbWFjX2N0eCBwb2ludGVyIE5VTEwiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCW1hY19jdHgtPnNhcC5zYXBfY2hhbm5lbF9hdm9pZGFuY2UgPSBzYXBfY2hhbm5lbF9hdm9pZGFuY2U7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKworLyoqCisgKiB3bGFuc2FwX3NldF9kZnNfcHJlZmVycmVkX2NoYW5uZWxfbG9jYXRpb24oKSAtIHNldCBkZnMgcHJlZmVycmVkIGNoYW5uZWwKKyAqIEBoSGFsIDogSEFMIHBvaW50ZXIKKyAqIEBkZnNfUHJlZmVycmVkX0NoYW5uZWxzX2xvY2F0aW9uIDoKKyAqICAgICAgIDAgLSBJbmRpY2F0ZXMgTm8gcHJlZmVycmVkIGNoYW5uZWwgbG9jYXRpb24gcmVzdHJpY3Rpb25zCisgKiAgICAgICAxIC0gSW5kaWNhdGVzIFNBUCBJbmRvb3IgQ2hhbm5lbHMgb3BlcmF0aW9uIG9ubHkuCisgKiAgICAgICAyIC0gSW5kaWNhdGVzIFNBUCBPdXRkb29yIENoYW5uZWxzIG9wZXJhdGlvbiBvbmx5LgorICoKKyAqIFRoaXMgQVBJIGlzIHVzZWQgdG8gc2V0IHNhcCBwcmVmZXJyZWQgY2hhbm5lbHMgbG9jYXRpb24KKyAqIHRvIHJlc2V0cmljdCB0aGUgREZTIHJhbmRvbSBjaGFubmVsIHNlbGVjdGlvbiBhbGdvcml0aG0KKyAqIGVpdGhlciBJbmRvb3IvT3V0ZG9vciBjaGFubmVscyBvbmx5LgorICoKKyAqIFJldHVybjogVGhlIENERl9TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisgKiAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MgYW5kIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitDREZfU1RBVFVTCit3bGFuc2FwX3NldF9kZnNfcHJlZmVycmVkX2NoYW5uZWxfbG9jYXRpb24odEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgICB1aW50OF90CisJCQkJCSAgIGRmc19QcmVmZXJyZWRfQ2hhbm5lbHNfbG9jYXRpb24pCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCBkZnNfcmVnaW9uOworCisJaWYgKE5VTEwgIT0gaEhhbCkgeworCQlwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBoSGFsIHBvaW50ZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJY2RzX2dldF9kZnNfcmVnaW9uKCZkZnNfcmVnaW9uKTsKKworCS8qCisJICogVGhlIEluZG9vci9PdXRkb29yIG9ubHkgcmFuZG9tIGNoYW5uZWwgc2VsZWN0aW9uCisJICogcmVzdHJpY3Rpb24gaXMgY3VycmVudGx5IGVuZm9yZWNlZCBvbmx5IGZvcgorCSAqIEpBUEFOIHJlZ3VsYXRvcnkgZG9tYWluLgorCSAqLworCWlmIChERlNfTUtLNF9ET01BSU4gPT0gZGZzX3JlZ2lvbikgeworCQlwTWFjLT5zYXAuU2FwRGZzSW5mby5zYXBfb3BlcmF0aW5nX2NoYW5fcHJlZmVycmVkX2xvY2F0aW9uID0KKwkJCWRmc19QcmVmZXJyZWRfQ2hhbm5lbHNfbG9jYXRpb247CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJICBGTAorCQkJCSAgKCJzYXBkZnM6U2V0IFByZWZlcnJlZCBPcGVyYXRpbmcgQ2hhbm5lbCBsb2NhdGlvbj0lZCIpLAorCQkJICBwTWFjLT5zYXAuU2FwRGZzSW5mby4KKwkJCSAgc2FwX29wZXJhdGluZ19jaGFuX3ByZWZlcnJlZF9sb2NhdGlvbik7CisKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTAorCQkJCSAgKCJzYXBkZnM6Tk9UIEpBUEFOIFJFRywgSW52YWxpZCBTZXQgcHJlZmVycmVkIGNoYW5zIGxvY2F0aW9uIikpOworCisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICB3bGFuc2FwX3NldF9kZnNfdGFyZ2V0X2NobmwKKworICAgREVTQ1JJUFRJT04KKyAgIFRoaXMgQVBJIGlzIHVzZWQgdG8gc2V0IG5leHQgdGFyZ2V0IGNobmwgYXMgcHJvdmlkZWQgY2hhbm5lbC4KKyAgIHlvdSBjYW4gcHJvdmlkZSBhbnkgdmFsaWQgY2hhbm5lbCB0byB0aGlzIEFQSS4KKworICAgREVQRU5ERU5DSUVTCisgICBOQS4KKworICAgUEFSQU1FVEVSUworICAgSU4KKyAgIGhIYWwgOiBIQUwgcG9pbnRlcgorICAgdGFyZ2V0X2NoYW5uZWwgOiB0YXJnZXQgY2hhbm5lbCB0byBiZSBzZXQKKworICAgUkVUVVJOIFZBTFVFCisgICBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworQ0RGX1NUQVRVUyB3bGFuc2FwX3NldF9kZnNfdGFyZ2V0X2NobmwodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHRhcmdldF9jaGFubmVsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBOVUxMOworCisJaWYgKE5VTEwgIT0gaEhhbCkgeworCQlwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBoSGFsIHBvaW50ZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCWlmICh0YXJnZXRfY2hhbm5lbCA+IDApIHsKKwkJcE1hYy0+c2FwLlNhcERmc0luZm8udXNlcl9wcm92aWRlZF90YXJnZXRfY2hhbm5lbCA9CisJCQl0YXJnZXRfY2hhbm5lbDsKKwl9IGVsc2UgeworCQlwTWFjLT5zYXAuU2FwRGZzSW5mby51c2VyX3Byb3ZpZGVkX3RhcmdldF9jaGFubmVsID0gMDsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitDREZfU1RBVFVTCit3bGFuc2FwX3VwZGF0ZV9zYXBfY29uZmlnX2FkZF9pZSh0c2FwX0NvbmZpZ190ICpwQ29uZmlnLAorCQkJCSBjb25zdCB1aW50OF90ICpwQWRkaXRpb25JRUJ1ZmZlciwKKwkJCQkgdWludDE2X3QgYWRkaXRpb25JRUxlbmd0aCwKKwkJCQkgZVVwZGF0ZUlFc1R5cGUgdXBkYXRlVHlwZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl1aW50OF90IGJ1ZmZlclZhbGlkID0gZmFsc2U7CisJdWludDE2X3QgYnVmZmVyTGVuZ3RoID0gMDsKKwl1aW50OF90ICpwQnVmZmVyID0gTlVMTDsKKworCWlmIChOVUxMID09IHBDb25maWcpIHsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlpZiAoKHBBZGRpdGlvbklFQnVmZmVyICE9IE5VTEwpICYmIChhZGRpdGlvbklFTGVuZ3RoICE9IDApKSB7CisJCS8qIGluaXRpYWxpemUgdGhlIGJ1ZmZlciBwb2ludGVyIHNvIHRoYXQgcGUgY2FuIGNvcHkgKi8KKwkJaWYgKGFkZGl0aW9uSUVMZW5ndGggPiAwKSB7CisJCQlidWZmZXJMZW5ndGggPSBhZGRpdGlvbklFTGVuZ3RoOworCQkJcEJ1ZmZlciA9IGNkZl9tZW1fbWFsbG9jKGJ1ZmZlckxlbmd0aCk7CisJCQlpZiAoTlVMTCA9PSBwQnVmZmVyKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTCgiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBidWZmZXIgIikpOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCQl9CisJCQljZGZfbWVtX2NvcHkocEJ1ZmZlciwgcEFkZGl0aW9uSUVCdWZmZXIsIGJ1ZmZlckxlbmd0aCk7CisJCQlidWZmZXJWYWxpZCA9IHRydWU7CisJCX0KKwl9CisKKwlzd2l0Y2ggKHVwZGF0ZVR5cGUpIHsKKwljYXNlIGVVUERBVEVfSUVfUFJPQkVfQkNOOgorCQlpZiAoYnVmZmVyVmFsaWQpIHsKKwkJCXBDb25maWctPnByb2JlUmVzcEJjbklFc0xlbiA9IGJ1ZmZlckxlbmd0aDsKKwkJCXBDb25maWctPnBQcm9iZVJlc3BCY25JRXNCdWZmZXIgPSBwQnVmZmVyOworCQl9IGVsc2UgeworCQkJY2RmX21lbV9mcmVlKHBDb25maWctPnBQcm9iZVJlc3BCY25JRXNCdWZmZXIpOworCQkJcENvbmZpZy0+cHJvYmVSZXNwQmNuSUVzTGVuID0gMDsKKwkJCXBDb25maWctPnBQcm9iZVJlc3BCY25JRXNCdWZmZXIgPSBOVUxMOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgIEZMCisJCQkJCSAgKCJObyBQcm9iZSBSZXNwIGJlYWNvbmUgSUUgcmVjZWl2ZWQgaW4gc2V0IGJlYWNvbiIpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGVVUERBVEVfSUVfUFJPQkVfUkVTUDoKKwkJaWYgKGJ1ZmZlclZhbGlkKSB7CisJCQlwQ29uZmlnLT5wcm9iZVJlc3BJRXNCdWZmZXJMZW4gPSBidWZmZXJMZW5ndGg7CisJCQlwQ29uZmlnLT5wUHJvYmVSZXNwSUVzQnVmZmVyID0gcEJ1ZmZlcjsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fZnJlZShwQ29uZmlnLT5wUHJvYmVSZXNwSUVzQnVmZmVyKTsKKwkJCXBDb25maWctPnByb2JlUmVzcElFc0J1ZmZlckxlbiA9IDA7CisJCQlwQ29uZmlnLT5wUHJvYmVSZXNwSUVzQnVmZmVyID0gTlVMTDsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICBGTAorCQkJCQkgICgiTm8gUHJvYmUgUmVzcG9uc2UgSUUgcmVjZWl2ZWQgaW4gc2V0IGJlYWNvbiIpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGVVUERBVEVfSUVfQVNTT0NfUkVTUDoKKwkJaWYgKGJ1ZmZlclZhbGlkKSB7CisJCQlwQ29uZmlnLT5hc3NvY1Jlc3BJRXNMZW4gPSBidWZmZXJMZW5ndGg7CisJCQlwQ29uZmlnLT5wQXNzb2NSZXNwSUVzQnVmZmVyID0gcEJ1ZmZlcjsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fZnJlZShwQ29uZmlnLT5wQXNzb2NSZXNwSUVzQnVmZmVyKTsKKwkJCXBDb25maWctPmFzc29jUmVzcElFc0xlbiA9IDA7CisJCQlwQ29uZmlnLT5wQXNzb2NSZXNwSUVzQnVmZmVyID0gTlVMTDsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICBGTAorCQkJCQkgICgiTm8gQXNzb2MgUmVzcG9uc2UgSUUgcmVjZWl2ZWQgaW4gc2V0IGJlYWNvbiIpKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICBGTCgiTm8gbWF0Y2hpbmcgYnVmZmVyIHR5cGUgJWQiKSwgdXBkYXRlVHlwZSk7CisJCWlmIChwQnVmZmVyICE9IE5VTEwpCisJCQljZGZfbWVtX2ZyZWUocEJ1ZmZlcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMKK3dsYW5zYXBfcmVzZXRfc2FwX2NvbmZpZ19hZGRfaWUodHNhcF9Db25maWdfdCAqcENvbmZpZywgZVVwZGF0ZUlFc1R5cGUgdXBkYXRlVHlwZSkKK3sKKwlpZiAoTlVMTCA9PSBwQ29uZmlnKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgQ29uZmlnIHBvaW50ZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJc3dpdGNoICh1cGRhdGVUeXBlKSB7CisJY2FzZSBlVVBEQVRFX0lFX0FMTDogICAgLypvbmx5IHVzZWQgdG8gcmVzZXQgKi8KKwljYXNlIGVVUERBVEVfSUVfUFJPQkVfUkVTUDoKKwkJY2RmX21lbV9mcmVlKHBDb25maWctPnBQcm9iZVJlc3BJRXNCdWZmZXIpOworCQlwQ29uZmlnLT5wcm9iZVJlc3BJRXNCdWZmZXJMZW4gPSAwOworCQlwQ29uZmlnLT5wUHJvYmVSZXNwSUVzQnVmZmVyID0gTlVMTDsKKwkJaWYgKGVVUERBVEVfSUVfQUxMICE9IHVwZGF0ZVR5cGUpCisJCQlicmVhazsKKworCWNhc2UgZVVQREFURV9JRV9BU1NPQ19SRVNQOgorCQljZGZfbWVtX2ZyZWUocENvbmZpZy0+cEFzc29jUmVzcElFc0J1ZmZlcik7CisJCXBDb25maWctPmFzc29jUmVzcElFc0xlbiA9IDA7CisJCXBDb25maWctPnBBc3NvY1Jlc3BJRXNCdWZmZXIgPSBOVUxMOworCQlpZiAoZVVQREFURV9JRV9BTEwgIT0gdXBkYXRlVHlwZSkKKwkJCWJyZWFrOworCisJY2FzZSBlVVBEQVRFX0lFX1BST0JFX0JDTjoKKwkJY2RmX21lbV9mcmVlKHBDb25maWctPnBQcm9iZVJlc3BCY25JRXNCdWZmZXIpOworCQlwQ29uZmlnLT5wcm9iZVJlc3BCY25JRXNMZW4gPSAwOworCQlwQ29uZmlnLT5wUHJvYmVSZXNwQmNuSUVzQnVmZmVyID0gTlVMTDsKKwkJaWYgKGVVUERBVEVfSUVfQUxMICE9IHVwZGF0ZVR5cGUpCisJCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmIChlVVBEQVRFX0lFX0FMTCAhPSB1cGRhdGVUeXBlKQorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTCgiSW52YWxpZCBidWZmZXIgdHlwZSAlZCIpLCB1cGRhdGVUeXBlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICB3bGFuc2FwX2V4dGVuZF90b19hY3NfcmFuZ2UKKworICAgREVTQ1JJUFRJT04gRnVuY3Rpb24gZXh0ZW5kcyBnaXZlIGNoYW5uZWwgcmFuZ2UgdG8gY29uc2lkZXIgQUNTIGNoYW4gYm9uZGluZworCisgICBERVBFTkRFTkNJRVMgUEFSQU1FVEVSUworCisgICBJTiAvT1VUCisgICAqc3RhcnRDaGFubmVsTnVtIDogQUNTIGV4dGVuZCBzdGFydCBjaAorICAgKmVuZENoYW5uZWxOdW0gICA6IEFDUyBleHRlbmRlZCBFbmQgY2gKKyAgICpiYW5kU3RhcnRDaGFubmVsOiBCYW5kIHN0YXJ0IGNoCisgICAqYmFuZEVuZENoYW5uZWwgIDogQmFuZCBlbmQgY2gKKworICAgUkVUVVJOIFZBTFVFIE5PTkUKKworICAgU0lERSBFRkZFQ1RTCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgd2xhbnNhcF9leHRlbmRfdG9fYWNzX3JhbmdlKHVpbnQ4X3QgKnN0YXJ0Q2hhbm5lbE51bSwKKwkJCQkgdWludDhfdCAqZW5kQ2hhbm5lbE51bSwKKwkJCQkgdWludDhfdCAqYmFuZFN0YXJ0Q2hhbm5lbCwKKwkJCQkgdWludDhfdCAqYmFuZEVuZENoYW5uZWwpCit7CisjZGVmaW5lIEFDU19XTEFOXzIwTV9DSF9JTkMgNAorI2RlZmluZSBBQ1NfMkdfRVhURU5EIEFDU19XTEFOXzIwTV9DSF9JTkMKKyNkZWZpbmUgQUNTXzVHX0VYVEVORCAoQUNTX1dMQU5fMjBNX0NIX0lOQyAqIDMpCisKKwl1aW50OF90IHRtcF9zdGFydENoYW5uZWxOdW0gPSAwLCB0bXBfZW5kQ2hhbm5lbE51bSA9IDA7CisKKwlpZiAoKnN0YXJ0Q2hhbm5lbE51bSA8PSAxNCAmJiAqZW5kQ2hhbm5lbE51bSA8PSAxNCkgeworCQkqYmFuZFN0YXJ0Q2hhbm5lbCA9IFJGX0NIQU5fMTsKKwkJKmJhbmRFbmRDaGFubmVsID0gUkZfQ0hBTl8xNDsKKwkJdG1wX3N0YXJ0Q2hhbm5lbE51bSA9ICpzdGFydENoYW5uZWxOdW0gPiA1ID8KKwkJCQkgICAoKnN0YXJ0Q2hhbm5lbE51bSAtIEFDU18yR19FWFRFTkQpIDogMTsKKwkJdG1wX2VuZENoYW5uZWxOdW0gPSAoKmVuZENoYW5uZWxOdW0gKyBBQ1NfMkdfRVhURU5EKSA8PSAxNCA/CisJCQkJICgqZW5kQ2hhbm5lbE51bSArIEFDU18yR19FWFRFTkQpIDogMTQ7CisJfSBlbHNlIGlmICgqc3RhcnRDaGFubmVsTnVtID49IDM2ICYmICplbmRDaGFubmVsTnVtID49IDM2KSB7CisJCSpiYW5kU3RhcnRDaGFubmVsID0gUkZfQ0hBTl8zNjsKKwkJKmJhbmRFbmRDaGFubmVsID0gUkZfQ0hBTl8xNjU7CisJCXRtcF9zdGFydENoYW5uZWxOdW0gPSAoKnN0YXJ0Q2hhbm5lbE51bSAtIEFDU181R19FWFRFTkQpID4gMzYgPworCQkJCSAgICgqc3RhcnRDaGFubmVsTnVtIC0gQUNTXzVHX0VYVEVORCkgOiAzNjsKKwkJdG1wX2VuZENoYW5uZWxOdW0gPSAoKmVuZENoYW5uZWxOdW0gKyBBQ1NfNUdfRVhURU5EKSA8PSAxNjUgPworCQkJCSAoKmVuZENoYW5uZWxOdW0gKyBBQ1NfNUdfRVhURU5EKSA6IDE2NTsKKwl9IGVsc2UgeworCQkqYmFuZFN0YXJ0Q2hhbm5lbCA9IFJGX0NIQU5fMTsKKwkJKmJhbmRFbmRDaGFubmVsID0gUkZfQ0hBTl8xNjU7CisJCXRtcF9zdGFydENoYW5uZWxOdW0gPSAqc3RhcnRDaGFubmVsTnVtID4gNSA/CisJCQkoKnN0YXJ0Q2hhbm5lbE51bSAtIEFDU18yR19FWFRFTkQpIDogMTsKKwkJdG1wX2VuZENoYW5uZWxOdW0gPSAoKmVuZENoYW5uZWxOdW0gKyBBQ1NfNUdfRVhURU5EKSA8PSAxNjUgPworCQkJKCplbmRDaGFubmVsTnVtICsgQUNTXzVHX0VYVEVORCkgOiAxNjU7CisJfQorCisJLyogTm90ZSBpZiB0aGUgQUNTIHJhbmdlIGluY2x1ZGUgb25seSBERlMgY2hhbm5lbHMsIGRvIG5vdCBjcm9zcyByYW5nZQorCSogQWN0aXZlIHNjYW5uaW5nIGluIGFkamFjZW50IG5vbiBERlMgY2hhbm5lbHMgcmVzdWx0cyBpbiB0cmFuc21pc3Npb24KKwkqIHNwaWtlcyBpbiBERlMgc3BlY3R1cm0gY2hhbm5lbHMgd2hpY2ggaXMgZHVlIHRvIGVtaXNzaW9uIHNwaWxsLgorCSogUmVtb3ZlIHRoZSBhY3RpdmUgY2hhbm5lbHMgZnJvbSBleHRlbmQgQUNTIHJhbmdlIGZvciBERlMgb25seSByYW5nZQorCSovCisJaWYgKENEU19JU19ERlNfQ0goKnN0YXJ0Q2hhbm5lbE51bSkpIHsKKwkJd2hpbGUgKCFDRFNfSVNfREZTX0NIKHRtcF9zdGFydENoYW5uZWxOdW0pICYmCisJCQl0bXBfc3RhcnRDaGFubmVsTnVtIDwgKnN0YXJ0Q2hhbm5lbE51bSkKKwkJCXRtcF9zdGFydENoYW5uZWxOdW0gKz0gQUNTX1dMQU5fMjBNX0NIX0lOQzsKKworCQkqc3RhcnRDaGFubmVsTnVtID0gdG1wX3N0YXJ0Q2hhbm5lbE51bTsKKwl9CisJaWYgKENEU19JU19ERlNfQ0goKmVuZENoYW5uZWxOdW0pKSB7CisJCXdoaWxlICghQ0RTX0lTX0RGU19DSCh0bXBfZW5kQ2hhbm5lbE51bSkgJiYKKwkJCQkgdG1wX2VuZENoYW5uZWxOdW0gPiAqZW5kQ2hhbm5lbE51bSkKKwkJCXRtcF9lbmRDaGFubmVsTnVtIC09IEFDU19XTEFOXzIwTV9DSF9JTkM7CisKKwkJKmVuZENoYW5uZWxOdW0gPSB0bXBfZW5kQ2hhbm5lbE51bTsKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICAgIHdsYW5zYXBfZ2V0X2Rmc19ub2wKKworICAgREVTQ1JJUFRJT04KKyAgIFRoaXMgQVBJIGlzIHVzZWQgdG8gZHVtcCB0aGUgZGZzIG5vbAorICAgREVQRU5ERU5DSUVTCisgICBOQS4KKworICAgUEFSQU1FVEVSUworICAgSU4KKyAgIHNhcENvbnRleHQ6IFBvaW50ZXIgdG8gY2RzIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorCisgICBSRVRVUk4gVkFMVUUKKyAgIFRoZSBDREZfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICBDREZfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisKKyAgIFNJREUgRUZGRUNUUworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDREZfU1RBVFVTIHdsYW5zYXBfZ2V0X2Rmc19ub2wodm9pZCAqcFNhcEN0eCkKK3sKKwlpbnQgaSA9IDA7CisJcHRTYXBDb250ZXh0IHNhcENvbnRleHQgPSAocHRTYXBDb250ZXh0KSBwU2FwQ3R4OworCXZvaWQgKmhIYWwgPSBOVUxMOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBOVUxMOworCXVpbnQ2NF90IGN1cnJlbnRfdGltZSwgZm91bmRfdGltZSwgZWxhcHNlZF90aW1lOworCXVuc2lnbmVkIGxvbmcgbGVmdF90aW1lOworCXRTYXBEZnNOb2xJbmZvICpkZnNfbm9sID0gTlVMTDsKKwlib29sIGJBdmFpbGFibGUgPSBmYWxzZTsKKworCWlmIChOVUxMID09IHNhcENvbnRleHQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBfY2RzX2djdHgiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihzYXBDb250ZXh0LT5wX2Nkc19nY3R4KTsKKwlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwX2Nkc19nY3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKwlwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAoIXBNYWMtPnNhcC5TYXBEZnNJbmZvLm51bUN1cnJlbnRSZWdEb21haW5EZnNDaGFubmVscykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IERGUyBOT0wgaXMgZW1wdHkiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJZGZzX25vbCA9IHBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcERmc0NoYW5uZWxOb2xMaXN0OworCisJaWYgKCFkZnNfbm9sKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogREZTIE5PTCBjb250ZXh0IGlzIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBNYWMtPnNhcC5TYXBEZnNJbmZvLm51bUN1cnJlbnRSZWdEb21haW5EZnNDaGFubmVsczsKKwkgICAgIGkrKykgeworCQlpZiAoIWRmc19ub2xbaV0uZGZzX2NoYW5uZWxfbnVtYmVyKQorCQkJY29udGludWU7CisKKwkJY3VycmVudF90aW1lID0gY2RzX2dldF9tb25vdG9uaWNfYm9vdHRpbWUoKTsKKwkJZm91bmRfdGltZSA9IGRmc19ub2xbaV0ucmFkYXJfZm91bmRfdGltZXN0YW1wOworCisJCWVsYXBzZWRfdGltZSA9IGN1cnJlbnRfdGltZSAtIGZvdW5kX3RpbWU7CisKKwkJLyogY2hlY2sgaWYgY2hhbm5lbCBpcyBhdmFpbGFibGUKKwkJICogaWYgZWl0aGVyIGNoYW5uZWwgaXMgdXNhYmxlIG9yIGF2YWlsYWJsZSwgb3IgdGltZXIgZXhwaXJlZCAzMG1pbnMKKwkJICovCisJCWJBdmFpbGFibGUgPQorCQkJKChkZnNfbm9sW2ldLnJhZGFyX3N0YXR1c19mbGFnID09CisJCQkgIGVTQVBfREZTX0NIQU5ORUxfQVZBSUxBQkxFKQorCQkJIHx8IChkZnNfbm9sW2ldLnJhZGFyX3N0YXR1c19mbGFnID09CisJCQkgICAgIGVTQVBfREZTX0NIQU5ORUxfVVNBQkxFKQorCQkJIHx8IChlbGFwc2VkX3RpbWUgPj0gU0FQX0RGU19OT05fT0NDVVBBTkNZX1BFUklPRCkpOworCisJCWlmIChiQXZhaWxhYmxlKSB7CisJCQlkZnNfbm9sW2ldLnJhZGFyX3N0YXR1c19mbGFnID0KKwkJCQllU0FQX0RGU19DSEFOTkVMX0FWQUlMQUJMRTsKKwkJCWRmc19ub2xbaV0ucmFkYXJfZm91bmRfdGltZXN0YW1wID0gMDsKKworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IENoYW5uZWxbJWRdIGlzIEFWQUlMQUJMRSIsCisJCQkJICBfX2Z1bmNfXywgZGZzX25vbFtpXS5kZnNfY2hhbm5lbF9udW1iZXIpOworCQl9IGVsc2UgeworCisJCQkvKiB0aGUgdGltZSBsZWZ0IGluIG1pbiAqLworCQkJbGVmdF90aW1lID0gU0FQX0RGU19OT05fT0NDVVBBTkNZX1BFUklPRCAtIGVsYXBzZWRfdGltZTsKKwkJCWxlZnRfdGltZSA9IGxlZnRfdGltZSAvICg2MCAqIDEwMDAgKiAxMDAwKTsKKworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IENoYW5uZWxbJWRdIGlzIFVOQVZBSUxBQkxFIFslbHUgbWluIGxlZnRdIiwKKwkJCQkgIF9fZnVuY19fLAorCQkJCSAgZGZzX25vbFtpXS5kZnNfY2hhbm5lbF9udW1iZXIsIGxlZnRfdGltZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICB3bGFuc2FwX3NldF9kZnNfbm9sCisKKyAgIERFU0NSSVBUSU9OCisgICBUaGlzIEFQSSBpcyB1c2VkIHRvIHNldCB0aGUgZGZzIG5vbAorICAgREVQRU5ERU5DSUVTCisgICBOQS4KKworICAgUEFSQU1FVEVSUworICAgSU4KKyAgIHNhcENvbnRleHQ6IFBvaW50ZXIgdG8gY2RzIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgY29uZjogc2V0IHR5cGUKKworICAgUkVUVVJOIFZBTFVFCisgICBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgQ0RGX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworCisgICBTSURFIEVGRkVDVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworQ0RGX1NUQVRVUyB3bGFuc2FwX3NldF9kZnNfbm9sKHZvaWQgKnBTYXBDdHgsIGVTYXBEZnNOb2xUeXBlIGNvbmYpCit7CisJaW50IGkgPSAwOworCXB0U2FwQ29udGV4dCBzYXBDb250ZXh0ID0gKHB0U2FwQ29udGV4dCkgcFNhcEN0eDsKKwl2b2lkICpoSGFsID0gTlVMTDsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gTlVMTDsKKworCWlmIChOVUxMID09IHNhcENvbnRleHQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHBfY2RzX2djdHgiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCWhIYWwgPSBDRFNfR0VUX0hBTF9DQihzYXBDb250ZXh0LT5wX2Nkc19nY3R4KTsKKwlpZiAoTlVMTCA9PSBoSGFsKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IEludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwX2Nkc19nY3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKwlwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAoIXBNYWMtPnNhcC5TYXBEZnNJbmZvLm51bUN1cnJlbnRSZWdEb21haW5EZnNDaGFubmVscykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IERGUyBOT0wgaXMgZW1wdHkiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJaWYgKGNvbmYgPT0gZVNBUF9ERlNfTk9MX0NMRUFSKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGNsZWFyIHRoZSBERlMgTk9MIiwgX19mdW5jX18pOworCisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IHBNYWMtPnNhcC5TYXBEZnNJbmZvLm51bUN1cnJlbnRSZWdEb21haW5EZnNDaGFubmVsczsKKwkJICAgICBpKyspIHsKKwkJCWlmICghcE1hYy0+c2FwLlNhcERmc0luZm8uCisJCQkgICAgc2FwRGZzQ2hhbm5lbE5vbExpc3RbaV0uZGZzX2NoYW5uZWxfbnVtYmVyKQorCQkJCWNvbnRpbnVlOworCisJCQlwTWFjLT5zYXAuU2FwRGZzSW5mby4KKwkJCXNhcERmc0NoYW5uZWxOb2xMaXN0W2ldLnJhZGFyX3N0YXR1c19mbGFnID0KKwkJCQllU0FQX0RGU19DSEFOTkVMX0FWQUlMQUJMRTsKKwkJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLgorCQkJc2FwRGZzQ2hhbm5lbE5vbExpc3RbaV0ucmFkYXJfZm91bmRfdGltZXN0YW1wID0gMDsKKwkJfQorCX0gZWxzZSBpZiAoY29uZiA9PSBlU0FQX0RGU19OT0xfUkFORE9NSVpFKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFJhbmRvbWl6ZSB0aGUgREZTIE5PTCIsIF9fZnVuY19fKTsKKworCQkvKiByYW5kb20gMS8wIHRvIGRlY2lkZSB0byBwdXQgdGhlIGNoYW5uZWwgaW50byBOT0wgKi8KKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgcE1hYy0+c2FwLlNhcERmc0luZm8ubnVtQ3VycmVudFJlZ0RvbWFpbkRmc0NoYW5uZWxzOworCQkgICAgIGkrKykgeworCQkJdWludDMyX3QgcmFuZG9tX2J5dGVzID0gMDsKKwkJCWdldF9yYW5kb21fYnl0ZXMoJnJhbmRvbV9ieXRlcywgMSk7CisKKwkJCWlmICghcE1hYy0+c2FwLlNhcERmc0luZm8uCisJCQkgICAgc2FwRGZzQ2hhbm5lbE5vbExpc3RbaV0uZGZzX2NoYW5uZWxfbnVtYmVyKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoKHJhbmRvbV9ieXRlcyArIGppZmZpZXMpICUgMikgeworCQkJCS8qIG1hcmsgdGhlIGNoYW5uZWwgdW5hdmFpbGFibGUgKi8KKwkJCQlwTWFjLT5zYXAuU2FwRGZzSW5mby5zYXBEZnNDaGFubmVsTm9sTGlzdFtpXQorCQkJCS5yYWRhcl9zdGF0dXNfZmxhZyA9CisJCQkJCWVTQVBfREZTX0NIQU5ORUxfVU5BVkFJTEFCTEU7CisKKwkJCQkvKiBtYXJrIHRoZSB0aW1lc3RhbXAgKi8KKwkJCQlwTWFjLT5zYXAuU2FwRGZzSW5mby5zYXBEZnNDaGFubmVsTm9sTGlzdFtpXQorCQkJCS5yYWRhcl9mb3VuZF90aW1lc3RhbXAgPQorCQkJCQljZHNfZ2V0X21vbm90b25pY19ib290dGltZSgpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBtYXJrIHRoZSBjaGFubmVsIGF2YWlsYWJsZSAqLworCQkJCXBNYWMtPnNhcC5TYXBEZnNJbmZvLgorCQkJCXNhcERmc0NoYW5uZWxOb2xMaXN0W2ldLnJhZGFyX3N0YXR1c19mbGFnID0KKwkJCQkJZVNBUF9ERlNfQ0hBTk5FTF9BVkFJTEFCTEU7CisKKwkJCQkvKiBjbGVhciB0aGUgdGltZXN0YW1wICovCisJCQkJcE1hYy0+c2FwLlNhcERmc0luZm8uCisJCQkJc2FwRGZzQ2hhbm5lbE5vbExpc3QKKwkJCQlbaV0ucmFkYXJfZm91bmRfdGltZXN0YW1wID0gMDsKKwkJCX0KKworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IFNldCBjaGFubmVsWyVkXSAlcyIsCisJCQkJICBfX2Z1bmNfXywKKwkJCQkgIHBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcERmc0NoYW5uZWxOb2xMaXN0W2ldCisJCQkJICAuZGZzX2NoYW5uZWxfbnVtYmVyLAorCQkJCSAgKHBNYWMtPnNhcC5TYXBEZnNJbmZvLgorCQkJCSAgIHNhcERmc0NoYW5uZWxOb2xMaXN0W2ldLnJhZGFyX3N0YXR1c19mbGFnID4KKwkJCQkgICBlU0FQX0RGU19DSEFOTkVMX0FWQUlMQUJMRSkgPyAiVU5BVkFJTEFCTEUiIDoKKwkJCQkgICJBVkFJTEFCTEUiKTsKKwkJfQorCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHVuc3VwcG9ydCB0eXBlICVkIiwgX19mdW5jX18sIGNvbmYpOworCX0KKworCS8qIHNldCBERlMtTk9MIGJhY2sgdG8ga2VlcCBpdCB1cGRhdGUtdG8tZGF0ZSBpbiBDTlNTICovCisJc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwQ29udGV4dCwgTlVMTCwgZVNBUF9ERlNfTk9MX1NFVCwKKwkJCSAgKHZvaWQgKikgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdsYW5zYXBfcG9wdWxhdGVfZGVsX3N0YV9wYXJhbXMoKSAtIHBvcHVsYXRlIGRlbGV0ZSBzdGF0aW9uIHBhcmFtZXRlcgorICogQG1hYzogICAgICAgICAgIFBvaW50ZXIgdG8gcGVlciBtYWMgYWRkcmVzcy4KKyAqIEByZWFzb25fY29kZTogICBSZWFzb24gY29kZSBmb3IgdGhlIGRpc2Fzc29jL2RlYXV0aC4KKyAqIEBzdWJ0eXBlOiAgICAgICBTdWJ0eXBlIHBvaW50cyB0byBlaXRoZXIgZGlzYXNzb2MvZGVhdXRoIGZyYW1lLgorICogQHBEZWxTdGFQYXJhbXM6IEFkZHJlc3Mgd2hlcmUgcGFyYW1ldGVycyB0byBiZSBwb3B1bGF0ZWQuCisgKgorICogVGhpcyBBUEkgaXMgdXNlZCB0byBwb3B1bGF0ZSBkZWxldGUgc3RhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KKwordm9pZCB3bGFuc2FwX3BvcHVsYXRlX2RlbF9zdGFfcGFyYW1zKGNvbnN0IHVpbnQ4X3QgKm1hYywKKwkJCQkgICAgIHVpbnQxNl90IHJlYXNvbl9jb2RlLAorCQkJCSAgICAgdWludDhfdCBzdWJ0eXBlLAorCQkJCSAgICAgc3RydWN0IHRhZ0NzckRlbFN0YVBhcmFtcyAqcERlbFN0YVBhcmFtcykKK3sKKwlpZiAoTlVMTCA9PSBtYWMpCisJCWNkZl9zZXRfbWFjYWRkcl9icm9hZGNhc3QoJnBEZWxTdGFQYXJhbXMtPnBlZXJNYWNBZGRyKTsKKwllbHNlCisJCWNkZl9tZW1fY29weShwRGVsU3RhUGFyYW1zLT5wZWVyTWFjQWRkci5ieXRlcywgbWFjLAorCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisKKwlpZiAocmVhc29uX2NvZGUgPT0gMCkKKwkJcERlbFN0YVBhcmFtcy0+cmVhc29uX2NvZGUgPSBlU0lSX01BQ19ERUFVVEhfTEVBVklOR19CU1NfUkVBU09OOworCWVsc2UKKwkJcERlbFN0YVBhcmFtcy0+cmVhc29uX2NvZGUgPSByZWFzb25fY29kZTsKKworCWlmIChzdWJ0eXBlID09IChTSVJfTUFDX01HTVRfREVBVVRIID4+IDQpIHx8CisJICAgIHN1YnR5cGUgPT0gKFNJUl9NQUNfTUdNVF9ESVNBU1NPQyA+PiA0KSkKKwkJcERlbFN0YVBhcmFtcy0+c3VidHlwZSA9IHN1YnR5cGU7CisJZWxzZQorCQlwRGVsU3RhUGFyYW1zLT5zdWJ0eXBlID0gKFNJUl9NQUNfTUdNVF9ERUFVVEggPj4gNCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgIEZMKAorCQkgICAgICJEZWxldGUgU1RBIHdpdGggUkM6JWh1IHN1YnR5cGU6JWhodSBNQUM6OiIKKwkJICAgICBNQUNfQUREUkVTU19TVFIpLAorCQkgIHBEZWxTdGFQYXJhbXMtPnJlYXNvbl9jb2RlLCBwRGVsU3RhUGFyYW1zLT5zdWJ0eXBlLAorCQkgIE1BQ19BRERSX0FSUkFZKHBEZWxTdGFQYXJhbXMtPnBlZXJNYWNBZGRyLmJ5dGVzKSk7Cit9CisKKy8qKgorICogd2xhbnNhcF9hY3NfY2hzZWxlY3QoKSAtIEluaXRpYXRlcyBhY3MgY2hhbm5lbCBzZWxlY3Rpb24KKyAqIEBwdm9zX2djdHg6ICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAqIEBwYWNzX2V2ZW50X2NhbGxiYWNrOiAgICAgICBDYWxsYmFjayBmdW5jdGlvbiBpbiBoZGQgY2FsbGVkIGJ5IHNhcAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluZm9ybSBoZGQgYWJvdXQgY2hhbm5lbCBzZWN0aW9uIHJlc3VsdAorICogQHBjb25maWc6ICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgZG93biBmcm9tIGhkZAorICogQHB1c3JfY29udGV4dDogICAgICAgICAgICAgIFBhcmFtZXRlciB0aGF0IHdpbGwgYmUgcGFzc2VkIGJhY2sgaW4gYWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhcCBjYWxsYmFjayBldmVudHMuCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYXMgYW4gYXBpIGZvciBoZGQgdG8gaW5pdGlhdGUgYWNzIHNjYW4gcHJlCisgKiBzdGFydCBic3MuCisgKgorICogUmV0dXJuOiBUaGUgQ0RGX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCisgKi8KK0NERl9TVEFUVVMKK3dsYW5zYXBfYWNzX2Noc2VsZWN0KHZvaWQgKnB2b3NfZ2N0eCwKKwkJCXRwV0xBTl9TQVBFdmVudENCIHBhY3NfZXZlbnRfY2FsbGJhY2ssCisJCQl0c2FwX0NvbmZpZ190ICpwY29uZmlnLAorCQkJdm9pZCAqcHVzcl9jb250ZXh0KQoreworCXB0U2FwQ29udGV4dCBzYXBfY29udGV4dCA9IE5VTEw7CisJdEhhbEhhbmRsZSBoX2hhbCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcG1hYyA9IE5VTEw7CisKKwlzYXBfY29udGV4dCA9IENEU19HRVRfU0FQX0NCKHB2b3NfZ2N0eCk7CisJaWYgKE5VTEwgPT0gc2FwX2NvbnRleHQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zX2djdHgiLCBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwloX2hhbCA9ICh0SGFsSGFuZGxlKUNEU19HRVRfSEFMX0NCKHNhcF9jb250ZXh0LT5wX2Nkc19nY3R4KTsKKwlpZiAoTlVMTCA9PSBoX2hhbCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSIlczogSW52YWxpZCBNQUMgY29udGV4dCBmcm9tIHB2b3NHQ3R4IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCWlmIChzYXBfY29udGV4dC0+aXNTYXBTZXNzaW9uT3BlbiA9PSBlU0FQX1RSVUUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkiJXM6U01FIFNlc3Npb24gaXMgYWxyZWFkeSBvcGVuZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9FWElTVFM7CisJfQorCisJc2FwX2NvbnRleHQtPnNlc3Npb25JZCA9IDB4ZmY7CisKKwlwbWFjID0gUE1BQ19TVFJVQ1QoaF9oYWwpOworCXNhcF9jb250ZXh0LT5hY3NfY2ZnID0gJnBjb25maWctPmFjc19jZmc7CisJc2FwX2NvbnRleHQtPmNoX3dpZHRoX29yaWcgPSBwY29uZmlnLT5hY3NfY2ZnLmNoX3dpZHRoOworCXNhcF9jb250ZXh0LT5jc3Jfcm9hbVByb2ZpbGUucGh5TW9kZSA9IHBjb25maWctPmFjc19jZmcuaHdfbW9kZTsKKworCWlmIChzYXBfY29udGV4dC0+aXNTY2FuU2Vzc2lvbk9wZW4gPT0gZVNBUF9GQUxTRSkgeworCQl1aW50MzJfdCB0eXBlLCBzdWJUeXBlOworCisJCS8qCisJCSogTm93LCBjb25maWd1cmUgdGhlIHNjYW4gYW5kIEFDUyBjaGFubmVsIHBhcmFtcworCQkqIHRvIGlzc3VlIGEgc2NhbiByZXF1ZXN0LgorCQkqLworCQl3bGFuc2FwX3NldF9zY2FuX2Fjc19jaGFubmVsX3BhcmFtcyhwY29uZmlnLCBzYXBfY29udGV4dCwKKwkJCQkJCXB1c3JfY29udGV4dCk7CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PQorCQkJY2RzX2dldF92ZGV2X3R5cGVzKENERl9TVEFfTU9ERSwgJnR5cGUsICZzdWJUeXBlKSkgeworCQkJLyoKKwkJCSogT3BlbiBTTUUgU2Vzc2lvbiBmb3Igc2NhbgorCQkJKi8KKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgICE9IHNtZV9vcGVuX3Nlc3Npb24oaF9oYWwsCisJCQkJCQlOVUxMLCBzYXBfY29udGV4dCwKKwkJCQkJCXNhcF9jb250ZXh0LT5zZWxmX21hY19hZGRyLAorCQkJCQkJJnNhcF9jb250ZXh0LT5zZXNzaW9uSWQsCisJCQkJCQl0eXBlLCBzdWJUeXBlKSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkiRXJyb3I6IEluICVzIGNhbGxpbmcgc21lX09wZW5TZXNzaW9uIiwKKwkJCQkJX19mdW5jX18pOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0gZWxzZSB7CisJCQkJc2FwX2NvbnRleHQtPmlzU2NhblNlc3Npb25PcGVuID0gZVNBUF9UUlVFOworCQkJfQorCQl9CisKKwkJLyoKKwkJKiBDb3B5IHRoZSBIREQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVwb3J0IHRoZQorCQkqIEFDUyByZXN1bHQgYWZ0ZXIgc2NhbiBpbiBTQVAgY29udGV4dCBjYWxsYmFjayBmdW5jdGlvbi4KKwkJKi8KKwkJc2FwX2NvbnRleHQtPnBmblNhcEV2ZW50Q2FsbGJhY2sgPSBwYWNzX2V2ZW50X2NhbGxiYWNrOworCQkvKgorCQkqIGluaXQgZGZzIGNoYW5uZWwgbm9sCisJCSovCisJCXNhcF9pbml0X2Rmc19jaGFubmVsX25vbF9saXN0KHNhcF9jb250ZXh0KTsKKworCQkvKgorCQkqIElzc3VlIHRoZSBzY2FuIHJlcXVlc3QuIFRoaXMgc2NhbiByZXF1ZXN0IGlzCisJCSogaXNzdWVkIGJlZm9yZSB0aGUgc3RhcnQgQlNTIGlzIGRvbmUgc28KKwkJKgorCQkqIDEuIE5vIG5lZWQgdG8gcGFzcyB0aGUgc2Vjb25kIHBhcmFtZXRlcgorCQkqIGFzIHRoZSBTQVAgc3RhdGUgbWFjaGluZSBpcyBub3Qgc3RhcnRlZCB5ZXQKKwkJKiBhbmQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW55IGV2ZW50IHBvc3RpbmcuCisJCSoKKwkJKiAyLiBTZXQgdGhpcmQgcGFyYW1ldGVyIHRvIFRSVUUgdG8gaW5kaWNhdGUgdGhlCisJCSogY2hhbm5lbCBzZWxlY3Rpb24gZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYQorCQkqIGRpZmZlcmVudCBzY2FuIGNhbGxiYWNrIGZ1Y250aW9uIHRvIHByb2Nlc3MKKwkJKiB0aGUgcmVzdWx0cyBwcmUgc3RhcnQgQlNTLgorCQkqLworCQljZGZfc3RhdHVzID0gc2FwX2dvdG9fY2hhbm5lbF9zZWwoc2FwX2NvbnRleHQsIE5VTEwsIHRydWUpOworCisJCWlmIChDREZfU1RBVFVTX0VfQUJPUlRFRCA9PSBjZGZfc3RhdHVzKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJJbiAlcyxERlMgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBvcGVyYXRpbmcgbW9kZSIsCisJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0gZWxzZSBpZiAoQ0RGX1NUQVRVU19FX0NBTkNFTEVEID09IGNkZl9zdGF0dXMpIHsKKwkJCS8qCisJCQkqIEVSUk9SIGlzIHJldHVybmVkIHdoZW4gZWl0aGVyIHRoZSBTTUUgc2NhbiByZXF1ZXN0CisJCQkqIGZhaWxlZCBvciBBQ1MgaXMgb3ZlcnJpZGRlbiBkdWUgdG8gb3RoZXIgY29uc3RyYWluc3QKKwkJCSogU28gc2VuZCBzZWxlY3RlZCBjaGFubmVsIHRvIEhERAorCQkJKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NBUCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMKCJTY2FuIFJlcSBGYWlsZWQvQUNTIE92ZXJyaWRkZW4iKSk7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgiU2VsZWN0ZWQgY2hhbm5lbCA9ICVkIiksCisJCQkJc2FwX2NvbnRleHQtPmNoYW5uZWwpOworCQkJaWYgKHNhcF9jb250ZXh0LT5pc1NjYW5TZXNzaW9uT3BlbiA9PSBlU0FQX1RSVUUpIHsKKwkJCQkvKiBBQ1Mgc2NhbiBub3QgbmVlZGVkIHNvIGNsb3NlIHNlc3Npb24gKi8KKwkJCQl0SGFsSGFuZGxlIGhfaGFsID0gQ0RTX0dFVF9IQUxfQ0IoCisJCQkJCQlzYXBfY29udGV4dC0+cF9jZHNfZ2N0eCk7CisJCQkJaWYgKGhfaGFsID09IE5VTEwpCisJCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQkJCWlmIChzbWVfY2xvc2Vfc2Vzc2lvbihoX2hhbCwKKwkJCQkJc2FwX2NvbnRleHQtPnNlc3Npb25JZCwgTlVMTCwgTlVMTCkgPT0KKwkJCQkJCQkgQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJCQlzYXBfY29udGV4dC0+aXNTY2FuU2Vzc2lvbk9wZW4gPQorCQkJCQkJCQllU0FQX0ZBTFNFOworCQkJCWVsc2UKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU0FQLAorCQkJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJIkFDUyBTY2FuIFNlc3Npb24gY2xvc2UgZmFpbCIpOworCQkJCXNhcF9jb250ZXh0LT5zZXNzaW9uSWQgPSAweGZmOworCQkJfQorCisJCQlyZXR1cm4gc2FwX3NpZ25hbF9oZGRfZXZlbnQoc2FwX2NvbnRleHQsIE5VTEwsCisJCQkJCWVTQVBfQUNTX0NIQU5ORUxfU0VMRUNURUQsCisJCQkJCSh2b2lkICopIGVTQVBfU1RBVFVTX1NVQ0NFU1MpOworCQl9IGVsc2UgaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfc3RhdHVzKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQlGTCgiU3VjY2Vzc2Z1bGx5IElzc3VlZCBhIFByZSBTdGFydCBCc3MgU2NhbiBSZXF1ZXN0IikpOworCQl9CisJfQorCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdsYW5fc2FwX2VuYWJsZV9waHlfZXJyb3JfbG9ncygpIC0gRW5hYmxlIERGUyBwaHkgZXJyb3IgbG9ncworICogQGhhbDogICAgICAgIGdsb2JhbCBoYWwgaGFuZGxlCisgKiBAZW5hYmxlX2xvZzogdmFsdWUgdG8gc2V0CisgKgorICogU2luY2UgdGhlIGZyZXF1ZW5jeSBvZiBERlMgcGh5IGVycm9yIGlzIHZlcnkgaGlnaCwgZW5hYmxpbmcgbG9ncyBmb3IgdGhlbQorICogYWxsIHRoZSB0aW1lcyBjYW4gY2F1c2UgY3Jhc2ggYW5kIHdpbGwgYWxzbyBjcmVhdGUgbG90IG9mIHVzZWxlc3MgbG9ncworICogY2F1c2luZyBkaWZmaWN1bHRpZXMgaW4gZGVidWdnaW5nIG90aGVyIGlzc3VlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisgKiBmcm9tIGl3cHJpdiBjbWQgdG8gZWFuYmxlIHN1Y2ggbG9ncyB0ZW1wb3JhcmlseS4KKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCB3bGFuX3NhcF9lbmFibGVfcGh5X2Vycm9yX2xvZ3ModEhhbEhhbmRsZSBoYWwsIGJvb2wgZW5hYmxlX2xvZykKK3sKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsKTsKKwltYWNfY3R4LT5zYXAuZW5hYmxlX2Rmc19waHlfZXJyb3JfbG9ncyA9IGVuYWJsZV9sb2c7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NtZS9pbmMvY3NyX2FwaS5oIGIvY29yZS9zbWUvaW5jL2Nzcl9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTcyNDBkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zbWUvaW5jL2Nzcl9hcGkuaApAQCAtMCwwICsxLDE2NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogICBcZmlsZSBjc3JfYXBpLmgKKyAqCisgKiAgIEV4cG9ydHMgYW5kIHR5cGVzIGZvciB0aGUgQ29tbW9uIFNjYW4gYW5kIFJvYW1pbmcgTW9kdWxlIGludGVyZmFjZXMuCisgKi8KKworI2lmbmRlZiBDU1JBUElfSF9fCisjZGVmaW5lIENTUkFQSV9IX18KKworI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJzaXJfbWFjX3Byb3RfZGVmLmgiCisjaW5jbHVkZSAiY3NyX2xpbmtfbGlzdC5oIgorCisjZGVmaW5lIENTUl9JTlZBTElEX1NDQU5SRVNVTFRfSEFORExFICAgICAgIChOVUxMKQorCit0eXBlZGVmIGVudW0geworCUNIX1dJRFRIXzIwTUhaID0gMCwKKwlDSF9XSURUSF80ME1IWiA9IDEsCisJQ0hfV0lEVEhfODBNSFogPSAyLAorCUNIX1dJRFRIXzE2ME1IWiA9IDMsCisJQ0hfV0lEVEhfODBQODBNSFogPSA0Cit9IHBoeV9jaF93aWR0aDsKKwordHlwZWRlZiBzdHJ1Y3QgY2hfcGFyYW1zX3MgeworCXBoeV9jaF93aWR0aCBjaF93aWR0aDsKKwl1aW50OF90IHNlY19jaF9vZmZzZXQ7CisJdWludDhfdCBjZW50ZXJfZnJlcV9zZWcwOworCXVpbnQ4X3QgY2VudGVyX2ZyZXFfc2VnMTsKK30gY2hhbl9wYXJhbXNfdDsKKwordHlwZWRlZiBlbnVtIHsKKwkvKiBuZXZlciB1c2VkICovCisJZUNTUl9BVVRIX1RZUEVfTk9ORSwKKwkvKiBNQUMgbGF5ZXIgYXV0aGVudGljYXRpb24gdHlwZXMgKi8KKwllQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSwKKwllQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZLAorCWVDU1JfQVVUSF9UWVBFX0FVVE9TV0lUQ0gsCisKKwkvKiBVcHBlciBsYXllciBhdXRoZW50aWNhdGlvbiB0eXBlcyAqLworCWVDU1JfQVVUSF9UWVBFX1dQQSwKKwllQ1NSX0FVVEhfVFlQRV9XUEFfUFNLLAorCWVDU1JfQVVUSF9UWVBFX1dQQV9OT05FLAorCisJZUNTUl9BVVRIX1RZUEVfUlNOLAorCWVDU1JfQVVUSF9UWVBFX1JTTl9QU0ssCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWVDU1JfQVVUSF9UWVBFX0ZUX1JTTiwKKwllQ1NSX0FVVEhfVFlQRV9GVF9SU05fUFNLLAorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwllQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9DRVJUSUZJQ0FURSwKKwllQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9QU0ssCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEEsCisJZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU04sCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwllQ1NSX0FVVEhfVFlQRV9SU05fUFNLX1NIQTI1NiwKKwllQ1NSX0FVVEhfVFlQRV9SU05fODAyMVhfU0hBMjU2LAorI2VuZGlmCisJZUNTUl9OVU1fT0ZfU1VQUE9SVF9BVVRIX1RZUEUsCisJZUNTUl9BVVRIX1RZUEVfRkFJTEVEID0gMHhmZiwKKwllQ1NSX0FVVEhfVFlQRV9VTktOT1dOID0gZUNTUl9BVVRIX1RZUEVfRkFJTEVELAorCit9IGVDc3JBdXRoVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX0VOQ1JZUFRfVFlQRV9OT05FLAorCWVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWSwKKwllQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZLAorCWVDU1JfRU5DUllQVF9UWVBFX1dFUDQwLAorCWVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNCwKKwllQ1NSX0VOQ1JZUFRfVFlQRV9US0lQLAorCWVDU1JfRU5DUllQVF9UWVBFX0FFUywKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCS8qIFdBUEkgKi8KKwllQ1NSX0VOQ1JZUFRfVFlQRV9XUEksCisjZW5kaWYgIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCWVDU1JfRU5DUllQVF9UWVBFX0tSSywKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJZUNTUl9FTkNSWVBUX1RZUEVfQlRLLAorI2VuZGlmCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkvKiAxMXcgQklQICovCisJZUNTUl9FTkNSWVBUX1RZUEVfQUVTX0NNQUMsCisjZW5kaWYKKwllQ1NSX0VOQ1JZUFRfVFlQRV9BTlksCisJZUNTUl9OVU1fT0ZfRU5DUllQVF9UWVBFID0gZUNTUl9FTkNSWVBUX1RZUEVfQU5ZLAorCisJZUNTUl9FTkNSWVBUX1RZUEVfRkFJTEVEID0gMHhmZiwKKwllQ1NSX0VOQ1JZUFRfVFlQRV9VTktOT1dOID0gZUNTUl9FTkNSWVBUX1RZUEVfRkFJTEVELAorCit9IGVDc3JFbmNyeXB0aW9uVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIFNlY3VyaXR5IHR5cGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX1NFQ1VSSVRZX1RZUEVfV1BBLAorCWVDU1JfU0VDVVJJVFlfVFlQRV9SU04sCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwllQ1NSX1NFQ1VSSVRZX1RZUEVfV0FQSSwKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCWVDU1JfU0VDVVJJVFlfVFlQRV9VTktOT1dOLAorCit9IGVDc3JTZWN1cml0eVR5cGU7CisKK3R5cGVkZWYgZW51bSB7CisJLyogMTFhL2IvZyBvbmx5LCBubyBIVCwgbm8gcHJvcHJpZXRhcnkgKi8KKwllQ1NSX0RPVDExX01PREVfYWJnID0gMHgwMDAxLAorCWVDU1JfRE9UMTFfTU9ERV8xMWEgPSAweDAwMDIsCisJZUNTUl9ET1QxMV9NT0RFXzExYiA9IDB4MDAwNCwKKwllQ1NSX0RPVDExX01PREVfMTFnID0gMHgwMDA4LAorCWVDU1JfRE9UMTFfTU9ERV8xMW4gPSAweDAwMTAsCisJZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZID0gMHgwMDIwLAorCWVDU1JfRE9UMTFfTU9ERV8xMW5fT05MWSA9IDB4MDA0MCwKKwllQ1NSX0RPVDExX01PREVfMTFiX09OTFkgPSAweDAwODAsCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwllQ1NSX0RPVDExX01PREVfMTFhYyA9IDB4MDEwMCwKKwllQ1NSX0RPVDExX01PREVfMTFhY19PTkxZID0gMHgwMjAwLAorI2VuZGlmCisJLyoKKwkgKiBUaGlzIGlzIGZvciBXSUZJIHRlc3QuIEl0IGlzIHNhbWUgYXMgZVdOSUFQSV9NQUNfUFJPVE9DT0xfQUxMCisJICogZXhjZXB0IHdoZW4gaXQgc3RhcnRzIElCU1MgaW4gMTFCIG9mIDIuNEdIegorCSAqIEl0IGlzIGZvciBDU1IgaW50ZXJuYWwgdXNlCisJICovCisJZUNTUl9ET1QxMV9NT0RFX0FVVE8gPSAweDA0MDAsCisKKwkvKiBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgbWF4aW11bSBiaXRzIGZvciBwaHlNb2RlICovCisJZUNTUl9OVU1fUEhZX01PREUgPSAxNiwKK30gZUNzclBoeU1vZGU7CisKK3R5cGVkZWYgZW51bSB7CisJZUNTUl9CU1NfVFlQRV9OT05FLAorCWVDU1JfQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUsCisJZUNTUl9CU1NfVFlQRV9JTkZSQV9BUCwgICAvKiBTb2Z0QVAgQVAgKi8KKwllQ1NSX0JTU19UWVBFX0lCU1MsICAgICAgIC8qIElCU1MgbmV0d29yayB3ZSdsbCBOT1Qgc3RhcnQgKi8KKwllQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1MsIC8qIElCU1MgbmV0d29yayB3ZSdsbCBzdGFydCBpZiBubyBwYXJ0bmVycyAqLworCWVDU1JfQlNTX1RZUEVfV0RTX0FQLCAgICAgLyogQlQtQU1QIEFQICovCisJZUNTUl9CU1NfVFlQRV9XRFNfU1RBLCAgICAvKiBCVC1BTVAgc3RhdGlvbiAqLworCWVDU1JfQlNTX1RZUEVfQU5ZLCAgICAgICAgLyogYW55IEJTUyB0eXBlIChJQlNTIG9yIEluZnJhc3RydWN0dXJlKS4qLworfSBlQ3NyUm9hbUJzc1R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisJZUNTUl9TQ0FOX1JFUVVFU1RfMTFEX1NDQU4gPSAxLAorCWVDU1JfU0NBTl9SRVFVRVNUX0ZVTExfU0NBTiwKKwllQ1NSX1NDQU5fSURMRV9NT0RFX1NDQU4sCisJZUNTUl9TQ0FOX0hPX1BST0JFX1NDQU4sIC8qIGRpcmVjdCBwcm9iZSBvbiBlbnRyeSBmcm9tIGNhbmRpZGF0ZSBsaXN0ICovCisJZUNTUl9TQ0FOX1AyUF9ESVNDT1ZFUlksCisKKwllQ1NSX1NDQU5fU09GVEFQX0NIQU5ORUxfUkFOR0UsCisJZUNTUl9TQ0FOX1AyUF9GSU5EX1BFRVIsCit9IGVDc3JSZXF1ZXN0VHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX1NDQU5fUkVTVUxUX0dFVCA9IDAsCisJZUNTUl9TQ0FOX1JFU1VMVF9GTFVTSCA9IDEsIC8qIHRvIGRlbGV0ZSBhbGwgY2FjaGVkIHNjYW4gcmVzdWx0cyAqLworfSBlQ3NyU2NhblJlc3VsdENtZDsKKwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX1NDQU5fU1VDQ0VTUywKKwllQ1NSX1NDQU5fRkFJTFVSRSwKKwllQ1NSX1NDQU5fQUJPUlQsCisJZUNTUl9TQ0FOX0ZPVU5EX1BFRVIsCit9IGVDc3JTY2FuU3RhdHVzOworCisvKgorICogUmVhc29uIHRvIGFib3J0IHRoZSBzY2FuCisgKiBUaGUgcmVhc29uIGNhbiB1c2VkIGxhdGVyIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHVwZGF0ZSB0aGUgc2NhbiByZXN1bHRzCisgKiB0byB1cHBlciBsYXllciBvciBub3QKKyAqLwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX1NDQU5fQUJPUlRfREVGQVVMVCwKKwllQ1NSX1NDQU5fQUJPUlRfRFVFX1RPX0JBTkRfQ0hBTkdFLCAvKiBTY2FuIGFib3J0IGR1ZSB0byBiYW5kIGNoYW5nZSAqLworCWVDU1JfU0NBTl9BQk9SVF9TU0lEX09OTFkKK30gZUNzckFib3J0UmVhc29uOworCit0eXBlZGVmIGVudW0geworCWVDU1JfQldfMjBNSHpfVkFMID0gMjAsCisJZUNTUl9CV180ME1Iel9WQUwgPSA0MCwKKwllQ1NSX0JXXzgwTUh6X1ZBTCA9IDgwLAorCWVDU1JfQldfMTYwTUh6X1ZBTCA9IDE2MAorfSBlQ1NSX0JXX1ZhbDsKKwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX0lOSV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRCA9IDAsCisJZUNTUl9JTklfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZLAorCWVDU1JfSU5JX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZLAorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJZUNTUl9JTklfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0NFTlRFUkVELAorCWVDU1JfSU5JX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0NFTlRFUkVEXzQwTUhaX0NFTlRFUkVELAorCWVDU1JfSU5JX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfQ0VOVEVSRUQsCisJZUNTUl9JTklfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0xPVywKKwllQ1NSX0lOSV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0xPVywKKwllQ1NSX0lOSV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfSElHSCwKKwllQ1NSX0lOSV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0hJR0gsCisjZW5kaWYKKwllQ1NSX0lOSV9DSEFOTkVMX0JPTkRJTkdfU1RBVEVfTUFYCit9IGVJbmlDaGFuQm9uZFN0YXRlOworCisjZGVmaW5lIENTUl9SU05fUE1LSURfU0laRSAgICAgICAgICAxNgorI2RlZmluZSBDU1JfTUFYX1BNS0lEX0FMTE9XRUQgICAgICAgMzIKKyNkZWZpbmUgQ1NSX1dFUDQwX0tFWV9MRU4gICAgICAgICAgIDUKKyNkZWZpbmUgQ1NSX1dFUDEwNF9LRVlfTEVOICAgICAgICAgIDEzCisjZGVmaW5lIENTUl9US0lQX0tFWV9MRU4gICAgICAgICAgICAzMgorI2RlZmluZSBDU1JfQUVTX0tFWV9MRU4gICAgICAgICAgICAgMTYKKyNkZWZpbmUgQ1NSX01BWF9UWF9QT1dFUiAgICAgICAgKFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9TVEFNQVgpCisjZGVmaW5lIENTUl9NQVhfUlNDX0xFTiAgICAgICAgICAgICAxNgorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisjZGVmaW5lIENTUl9XQVBJX0JLSURfU0laRSAgICAgICAgICAxNgorI2RlZmluZSBDU1JfTUFYX0JLSURfQUxMT1dFRCAgICAgICAgMTYKKyNkZWZpbmUgQ1NSX1dBUElfS0VZX0xFTiAgICAgICAgICAgIDMyCisjZGVmaW5lIENTUl9NQVhfS0VZX0xFTiAgICAgICAgIChDU1JfV0FQSV9LRVlfTEVOKSAvKiBsb25nZXN0IG9uZSBpcyBmb3IgV0FQSSAqLworI2Vsc2UKKyNkZWZpbmUgQ1NSX01BWF9LRVlfTEVOICAgICAgICAgKENTUl9US0lQX0tFWV9MRU4pIC8qIGxvbmdlc3Qgb25lIGlzIGZvciBUS0lQICovCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisjZGVmaW5lIENTUl9LUktfS0VZX0xFTiAgICAgICAgICAgICAxNgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzckNoYW5uZWxJbmZvIHsKKwl1aW50OF90IG51bU9mQ2hhbm5lbHM7CisJdWludDhfdCAqQ2hhbm5lbExpc3Q7ICAgLyogaXQgd2lsbCBiZSBhbiBhcnJheSBvZiBjaGFubmVscyAqLworfSB0Q3NyQ2hhbm5lbEluZm8sICp0cENzckNoYW5uZWxJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JTU0lESW5mbyB7CisJdFNpck1hY1NTaWQgU1NJRDsKKwlib29sIGhhbmRvZmZQZXJtaXR0ZWQ7CisJYm9vbCBzc2lkSGlkZGVuOworfSB0Q3NyU1NJREluZm87CisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzclNTSURzIHsKKwl1aW50MzJfdCBudW1PZlNTSURzOworCXRDc3JTU0lESW5mbyAqU1NJRExpc3Q7IC8qIFRvIGJlIGFsbG9jYXRlZCBmb3IgYXJyYXkgb2YgU1NJRHMgKi8KK30gdENzclNTSURzOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JCU1NJRHMgeworCXVpbnQzMl90IG51bU9mQlNTSURzOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgKmJzc2lkOworfSB0Q3NyQlNTSURzOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JTdGFQYXJhbXMgeworCXVpbnQxNl90IGNhcGFiaWxpdHk7CisJdWludDhfdCBleHRuX2NhcGFiaWxpdHlbU0lSX01BQ19NQVhfRVhUTl9DQVBdOworCXVpbnQ4X3Qgc3VwcG9ydGVkX3JhdGVzX2xlbjsKKwl1aW50OF90IHN1cHBvcnRlZF9yYXRlc1tTSVJfTUFDX01BWF9TVVBQX1JBVEVTXTsKKwl1aW50OF90IGh0Y2FwX3ByZXNlbnQ7CisJdFNpckhUQ2FwIEhUQ2FwOworCXVpbnQ4X3Qgdmh0Y2FwX3ByZXNlbnQ7CisJdFNpclZIVENhcCBWSFRDYXA7CisJdWludDhfdCB1YXBzZF9xdWV1ZXM7CisJdWludDhfdCBtYXhfc3A7CisJdWludDhfdCBzdXBwb3J0ZWRfY2hhbm5lbHNfbGVuOworCXVpbnQ4X3Qgc3VwcG9ydGVkX2NoYW5uZWxzW1NJUl9NQUNfTUFYX1NVUFBfQ0hBTk5FTFNdOworCXVpbnQ4X3Qgc3VwcG9ydGVkX29wZXJfY2xhc3Nlc19sZW47CisJdWludDhfdCBzdXBwb3J0ZWRfb3Blcl9jbGFzc2VzW1NJUl9NQUNfTUFYX1NVUFBfT1BFUl9DTEFTU0VTXTsKK30gdENzclN0YVBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU2NhblJlcXVlc3QgeworCXRTaXJTY2FuVHlwZSBzY2FuVHlwZTsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkOworCWVDc3JSb2FtQnNzVHlwZSBCU1NUeXBlOworCXRDc3JTU0lEcyBTU0lEczsKKwl0Q3NyQ2hhbm5lbEluZm8gQ2hhbm5lbEluZm87CisJdWludDMyX3QgbWluQ2huVGltZTsgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgbWF4Q2huVGltZTsgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgcmVzdFRpbWU7ICAgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgdUlFRmllbGRMZW47CisJdWludDhfdCAqcElFRmllbGQ7CisJZUNzclJlcXVlc3RUeXBlIHJlcXVlc3RUeXBlOyAvKiAxMWQgc2NhbiBvciBmdWxsIHNjYW4gKi8KKwlib29sIHAycFNlYXJjaDsKKwlib29sIHNraXBEZnNDaG5sSW5QMnBTZWFyY2g7CisJYm9vbCBiY25ScHRSZXFTY2FuOyAgICAgLyogaXMgU2NhbiBpc3N1ZWQgYnkgQmVhY29uIFJlcG9ydCBSZXF1ZXN0ICovCisJdWludDMyX3Qgc2Nhbl9pZDsKKwl1aW50MzJfdCB0aW1lc3RhbXA7Cit9IHRDc3JTY2FuUmVxdWVzdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU2NhblJlc3VsdEluZm8geworCS8qCisJICogQ2FycnkgdGhlIElFcyBmb3IgdGhlIGN1cnJlbnQgQlNTRGVzY3JpcHRpb24uCisJICogQSBwb2ludGVyIHRvIHREb3QxMWZCZWFjb25JRXMuIE1heWJlIE5VTEwgZm9yIHN0YXJ0IEJTUy4KKwkgKi8KKwl2b2lkICpwdkllczsKKwl0QW5pU1NJRCBzc0lkOworCXZfVElNRV90IHRpbWVyOyAgICAgICAgICAgLyogdGltZXIgaXMgdmFyaWFibGUgZm9yIGhpZGRlbiBTU0lEIHRpbWVyICovCisJLyoKKwkgKiBUaGlzIG1lbWJlciBtdXN0IGJlIHRoZSBsYXN0IGluIHRoZSBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGUKKwkgKiBlbmQgb2YgdFNpckJzc0Rlc2NyaXB0aW9uIGlzIGFuCisJICogYXJyYXkgd2l0aCBub25rbm93biBzaXplIGF0IHRoaXMgdGltZSAqLworCXRTaXJCc3NEZXNjcmlwdGlvbiBCc3NEZXNjcmlwdG9yOworfSB0Q3NyU2NhblJlc3VsdEluZm87CisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzckVuY3J5cHRpb25MaXN0IHsKKworCXVpbnQzMl90IG51bUVudHJpZXM7CisJZUNzckVuY3J5cHRpb25UeXBlIGVuY3J5cHRpb25UeXBlW2VDU1JfTlVNX09GX0VOQ1JZUFRfVFlQRV07CisKK30gdENzckVuY3J5cHRpb25MaXN0LCAqdHBDc3JFbmNyeXB0aW9uTGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQXV0aExpc3QgeworCXVpbnQzMl90IG51bUVudHJpZXM7CisJZUNzckF1dGhUeXBlIGF1dGhUeXBlW2VDU1JfTlVNX09GX1NVUFBPUlRfQVVUSF9UWVBFXTsKK30gdENzckF1dGhMaXN0LCAqdHBDc3JBdXRoTGlzdDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JNb2JpbGl0eURvbWFpbkluZm8geworCXVpbnQ4X3QgbWRpZVByZXNlbnQ7CisJdWludDE2X3QgbW9iaWxpdHlEb21haW47Cit9IHRDc3JNb2JpbGl0eURvbWFpbkluZm87CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKK3R5cGVkZWYgc3RydWN0IHRhZ0NzckVzZUNja21JbmZvIHsKKwl1aW50MzJfdCByZWFzc29jX3JlcV9udW07CisJYm9vbCBrcmtfcGx1bWJlZDsKKwl1aW50OF90IGtya1tTSVJfS1JLX0tFWV9MRU5dOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwl1aW50OF90IGJ0a1tTSVJfQlRLX0tFWV9MRU5dOworI2VuZGlmCit9IHRDc3JFc2VDY2ttSW5mbzsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorI2RlZmluZSBDU1JfRE9UMTFGX0lFX1JTTl9NQVhfTEVOICAgKDExNCkKK3R5cGVkZWYgc3RydWN0IHRhZ0NzckVzZUNja21JZSB7CisJdWludDhfdCBjY2ttSWVbQ1NSX0RPVDExRl9JRV9SU05fTUFYX0xFTl07CisJdWludDhfdCBjY2ttSWVMZW47Cit9IHRDc3JFc2VDY2ttSWU7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAmJiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworCit0eXBlZGVmIHN0cnVjdCBzQ3NyQ2hhbm5lbF8geworCXVpbnQ4X3QgbnVtQ2hhbm5lbHM7CisJdWludDhfdCBjaGFubmVsTGlzdFtXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworfSBzQ3NyQ2hhbm5lbDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU2NhblJlc3VsdEZpbHRlciB7CisJdENzckJTU0lEcyBCU1NJRHM7CisJdENzclNTSURzIFNTSURzOworCXRDc3JDaGFubmVsSW5mbyBDaGFubmVsSW5mbzsKKwl0Q3NyQXV0aExpc3QgYXV0aFR5cGU7CisJdENzckVuY3J5cHRpb25MaXN0IEVuY3J5cHRpb25UeXBlOworCS8qCisJICogZUNTUl9FTkNSWVBUX1RZUEVfQU5ZIGNhbm5vdCBiZSBzZXQgaW4gbXVsdGljYXN0IGVuY3J5cHRpb24gdHlwZS4KKwkgKiBJZiBjYWxsZXIgZG9lc24ndCBjYXNlLCBwdXQgYWxsIHN1cHBvcnRlZCBlbmNyeXB0aW9uIHR5cGVzIGluIGhlcmUKKwkgKi8KKwl0Q3NyRW5jcnlwdGlvbkxpc3QgbWNFbmNyeXB0aW9uVHlwZTsKKwllQ3NyUm9hbUJzc1R5cGUgQlNTVHlwZTsKKwkvKiBpdHMgYSBiaXQgbWFzayBvZiBhbGwgdGhlIG5lZWRlZCBwaHkgbW9kZSBkZWZpbmVkIGluIGVDc3JQaHlNb2RlICovCisJZUNzclBoeU1vZGUgcGh5TW9kZTsKKwkvKgorCSAqIElmIGNvdW50cnlDb2RlWzBdIGlzIG5vdCAwLCBjb3VudHJ5Q29kZSBpcyBjaGVja2VkCisJICogaW5kZXBlbmRlbnQgb2YgZkNoZWNrVW5rbm93bkNvdW50cnlDb2RlCisJICovCisJdWludDhfdCBjb3VudHJ5Q29kZVtXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU5dOworCXVpbnQ4X3QgdWFwc2RfbWFzazsKKwkvKiBGb3IgV1BTIGZpbHRlcmluZyBpZiB0cnVlID0+IGF1dGggYW5kIGVjcnlwdGlvbiBzaG91bGQgYmUgaWdub3JlZCAqLworCWJvb2wgYldQU0Fzc29jaWF0aW9uOworCWJvb2wgYk9TRU5Bc3NvY2lhdGlvbjsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwkvKgorCSAqIEZvciBtZWFzdXJlbWVudCByZXBvcnRzIC0tPiBpZiBzZXQsIG9ubHkgU1NJRCwKKwkgKiBCU1NJRCBhbmQgY2hhbm5lbCBpcyBjb25zaWRlcmVkIGZvciBmaWx0ZXJpbmcuCisJICovCisJYm9vbCBmTWVhc3VyZW1lbnQ7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCXRDc3JNb2JpbGl0eURvbWFpbkluZm8gTURJRDsKKyNlbmRpZgorCWJvb2wgcDJwUmVzdWx0OworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkvKiBNYW5hZ2VtZW50IEZyYW1lIFByb3RlY3Rpb24gKi8KKwlib29sIE1GUEVuYWJsZWQ7CisJdWludDhfdCBNRlBSZXF1aXJlZDsKKwl1aW50OF90IE1GUENhcGFibGU7CisjZW5kaWYKKwkvKiBUaGUgZm9sbG93aW5nIGZsYWcgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGUKKwkgKiByb2FtaW5nIGNhc2Ugd2hpbGUgYnVpbGRpbmcgdGhlIHNjYW4gZmlsdGVyIGFuZAorCSAqIGFwcGx5aW5nIGl0IG9uIHRvIHRoZSBzY2FuIHJlc3VsdHMuIFRoaXMgaXMgbWFpbmx5CisJICogdXNlZCB0byBzdXBwb3J0IHdoaXRlbGlzdCBzc2lkIGZlYXR1cmUuCisJICovCisJdWludDhfdCBzY2FuX2ZpbHRlcl9mb3Jfcm9hbTsKKwlzdHJ1Y3Qgc0NzckNoYW5uZWxfIHBjbF9jaGFubmVsczsKKwl0Q0RGX0NPTl9NT0RFIGNzclBlcnNvbmE7Cit9IHRDc3JTY2FuUmVzdWx0RmlsdGVyOworCit0eXBlZGVmIHN0cnVjdCBzQ3NyQ2huUG93ZXJfIHsKKwl1aW50OF90IGZpcnN0Q2hhbm5lbDsKKwl1aW50OF90IG51bUNoYW5uZWxzOworCXVpbnQ4X3QgbWF4dHhQb3dlcjsKK30gc0NzckNoblBvd2VyOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3IxMWRpbmZvIHsKKwlzQ3NyQ2hhbm5lbCBDaGFubmVsczsKKwl1aW50OF90IGNvdW50cnlDb2RlW1dOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiArIDFdOworCS8qIG1heCBwb3dlciBjaGFubmVsIGxpc3QgKi8KKwlzQ3NyQ2huUG93ZXIgQ2huUG93ZXJbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKK30gdENzcjExZGluZm87CisKK3R5cGVkZWYgZW51bSB7CisJZUNTUl9ST0FNX0NBTkNFTExFRCA9IDEsCisJLyogaXQgbWVhbnMgZXJyb3IgaGFwcGVucyBiZWZvcmUgYXNzb2Nfc3RhcnQvcm9hbWluZ19zdGFydCBpcyBjYWxsZWQuICovCisJZUNTUl9ST0FNX0ZBSUxFRCwKKwkvKgorCSAqIGEgQ1NSIHRyaWdnZXIgcm9hbWluZyBvcGVyYXRpb24gc3RhcnRzLAorCSAqIGNhbGxiYWNrIG1heSBnZXQgYSBwb2ludGVyIHRvIHRDc3JDb25uZWN0ZWRQcm9maWxlCisJICovCisJZUNTUl9ST0FNX1JPQU1JTkdfU1RBUlQsCisJLyogYSBDU1IgdHJpZ2dlciByb2FtaW5nIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQgKi8KKwllQ1NSX1JPQU1fUk9BTUlOR19DT01QTEVUSU9OLAorCS8qIENvbm5lY3Rpb24gY29tcGxldGVkIHN0YXR1cy4gKi8KKwllQ1NSX1JPQU1fQ09OTkVDVF9DT01QTEVUSU9OLAorCS8qCisJICogYW4gYXNzb2NpYXRpb24gb3Igc3RhcnRfSUJTUyBvcGVyYXRpb24gc3RhcnRzLAorCSAqIGNhbGxiYWNrIG1heSBnZXQgYSBwb2ludGVyIHRvIHRDc3JSb2FtUHJvZmlsZSBhbmQKKwkgKiBhIHBvaW50ZXIgdG8gdFNpckJzc0Rlc2NyaXB0aW9uCisJICovCisJZUNTUl9ST0FNX0FTU09DSUFUSU9OX1NUQVJULAorCS8qCisJICogYSByb2FtaW5nIG9wZXJhdGlvbiBpcyBmaW5pc2gsIHNlZSBlQ3NyUm9hbVJlc3VsdCBmb3IKKwkgKiBwb3NzaWJsZSBkYXRhIHBhc3NlZCBiYWNrCisJICovCisJZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04sCisJZUNTUl9ST0FNX0RJU0FTU09DSUFURUQsCisJZUNTUl9ST0FNX0FTU09DSUFUSU9OX0ZBSUxVUkUsCisJLyogd2hlbiBjYWxsYmFjayB3aXRoIHRoaXMgZmxhZy4gaXQgZ2V0cyBhIHBvaW50ZXIgdG8gdGhlIEJTUyBkZXNjLiAqLworCWVDU1JfUk9BTV9TSE9VTERfUk9BTSwKKwkvKiBBIG5ldyBjYW5kaWRhdGUgZm9yIFBNS0lEIGlzIGZvdW5kICovCisJZUNTUl9ST0FNX1NDQU5fRk9VTkRfTkVXX0JTUywKKwkvKiBDU1IgaXMgZG9uZSBsb3N0bGluayByb2FtaW5nIGFuZCBzdGlsbCBjYW5ub3QgcmVjb25uZWN0ICovCisJZUNTUl9ST0FNX0xPU1RMSU5LLAorCS8qIGEgbGluayBsb3N0IGlzIGRldGVjdGVkLiBDU1Igc3RhcnRzIHJvYW1pbmcuICovCisJZUNTUl9ST0FNX0xPU1RMSU5LX0RFVEVDVEVELAorCS8qCisJICogVEtJUCBNSUMgZXJyb3IgZGV0ZWN0ZWQsIGNhbGxiYWNrIGdldHMgYSBwb2ludGVyCisJICogdG8gdHBTaXJTbWVNaWNGYWlsdXJlSW5kCisJICovCisJZUNTUl9ST0FNX01JQ19FUlJPUl9JTkQsCisJLyogSUJTUyBpbmRpY2F0aW9ucy4gKi8KKwllQ1NSX1JPQU1fSUJTU19JTkQsCisJLyoKKwkgKiBVcGRhdGUgdGhlIGNvbm5lY3Rpb24gc3RhdHVzLCB1c2VmdWwgZm9yIElCU1M6IG5ldyBwZWVyIGFkZGVkLAorCSAqIG5ldHdvcmsgaXMgYWN0aXZlIGV0Yy4KKwkgKi8KKwllQ1NSX1JPQU1fQ09OTkVDVF9TVEFUVVNfVVBEQVRFLAorCWVDU1JfUk9BTV9HRU5fSU5GTywKKwllQ1NSX1JPQU1fU0VUX0tFWV9DT01QTEVURSwKKwllQ1NSX1JPQU1fSUJTU19MRUFWRSwgICAvKiBJQlNTIGluZGljYXRpb25zLiAqLworCS8qIEJTUyBpbiBXRFMgbW9kZSBzdGF0dXMgaW5kaWNhdGlvbiAqLworCWVDU1JfUk9BTV9XRFNfSU5ELAorCS8qIEJTUyBpbiBTb2Z0QVAgbW9kZSBzdGF0dXMgaW5kaWNhdGlvbiAqLworCWVDU1JfUk9BTV9JTkZSQV9JTkQsCisJZUNTUl9ST0FNX1dQU19QQkNfUFJPQkVfUkVRX0lORCwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWVDU1JfUk9BTV9GVF9SRVNQT05TRSwKKyNlbmRpZgorCWVDU1JfUk9BTV9GVF9TVEFSVCwKKwllQ1NSX1JPQU1fSU5ESUNBVEVfTUdNVF9GUkFNRSwKKwllQ1NSX1JPQU1fUkVNQUlOX0NIQU5fUkVBRFksCisJZUNTUl9ST0FNX1NFTkRfQUNUSU9OX0NORiwKKwkvKiB0aGlzIG1lYW4gZXJyb3IgaGFwcGVucyBiZWZvcmUgYXNzb2Nfc3RhcnQvcm9hbV9zdGFydCBpcyBjYWxsZWQuICovCisJZUNTUl9ST0FNX1NFU1NJT05fT1BFTkVELAorCWVDU1JfUk9BTV9GVF9SRUFTU09DX0ZBSUxFRCwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJZUNTUl9ST0FNX1BNS19OT1RJRlksCisjZW5kaWYKKwkvKgorCSAqIEZvbGxvd2luZyA0IGVudW1zIGFyZSB1c2VkIGJ5IEZFQVRVUkVfV0xBTl9MRlJfTUVUUklDUworCSAqIGJ1dCB0aGV5IGFyZSBuZWVkZWQgZm9yIGNvbXBpbGF0aW9uIGV2ZW4gd2hlbgorCSAqIEZFQVRVUkVfV0xBTl9MRlJfTUVUUklDUyBpcyBub3QgZGVmaW5lZC4KKwkgKi8KKwllQ1NSX1JPQU1fUFJFQVVUSF9JTklUX05PVElGWSwKKwllQ1NSX1JPQU1fUFJFQVVUSF9TVEFUVVNfU1VDQ0VTUywKKwllQ1NSX1JPQU1fUFJFQVVUSF9TVEFUVVNfRkFJTFVSRSwKKwllQ1NSX1JPQU1fSEFORE9WRVJfU1VDQ0VTUywKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWVDU1JfUk9BTV9URExTX1NUQVRVU19VUERBVEUsCisJZUNTUl9ST0FNX1JFU1VMVF9NR01UX1RYX0NPTVBMRVRFX0lORCwKKyNlbmRpZgorCS8qIERpc2Fjb25uZWN0IGFsbCB0aGUgY2xpZW50cyAqLworCWVDU1JfUk9BTV9ESVNDT05ORUNUX0FMTF9QMlBfQ0xJRU5UUywKKwkvKiBTdG9wYnNzIHRyaWdnZXJlZCBmcm9tIFNNRSBkdWUgdG8gZGlmZmVyZW50ICovCisJZUNTUl9ST0FNX1NFTkRfUDJQX1NUT1BfQlNTLAorCS8qIGJlYWNvbiBpbnRlcnZhbCAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwllQ1NSX1JPQU1fVU5QUk9UX01HTVRfRlJBTUVfSU5ELAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisJZUNTUl9ST0FNX1RTTV9JRV9JTkQsCisJZUNTUl9ST0FNX0NDS01fUFJFQVVUSF9OT1RJRlksCisJZUNTUl9ST0FNX0VTRV9BREpfQVBfUkVQT1JUX0lORCwKKwllQ1NSX1JPQU1fRVNFX0JDTl9SRVBPUlRfSU5ELAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKworCS8qIFJhZGFyIGluZGljYXRpb24gZnJvbSBsb3dlciBsYXllcnMgKi8KKwllQ1NSX1JPQU1fREZTX1JBREFSX0lORCwKKwllQ1NSX1JPQU1fU0VUX0NIQU5ORUxfUlNQLAorCisJLyogQ2hhbm5lbCBzdyB1cGRhdGUgbm90aWZpY2F0aW9uICovCisJZUNTUl9ST0FNX0RGU19DSEFOX1NXX05PVElGWSwKK30gZVJvYW1DbWRTdGF0dXM7CisKKy8qIGNvbW1lbnQgaW5zaWRlIGluZGljYXRlcyB3aGF0IHJvYW1pbmcgY2FsbGJhY2sgZ2V0cyAqLwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX1JPQU1fUkVTVUxUX05PTkUsCisJLyoKKwkgKiBJZiByb2FtU3RhdHVzIGlzIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OLAorCSAqIHRDc3JSb2FtSW5mbydzIHBCc3NEZXNjIG1heSBwYXNzIGJhY2sKKwkgKi8KKwllQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUsCisJLyogUGFzcyBiYWNrIHBvaW50ZXIgdG8gdENzclJvYW1JbmZvICovCisJZUNTUl9ST0FNX1JFU1VMVF9BU1NPQ0lBVEVELAorCWVDU1JfUk9BTV9SRVNVTFRfTk9UX0FTU09DSUFURUQsCisJZUNTUl9ST0FNX1JFU1VMVF9NSUNfRkFJTFVSRSwKKwllQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCwKKwllQ1NSX1JPQU1fUkVTVUxUX0RJU0FTU09DX0lORCwKKwllQ1NSX1JPQU1fUkVTVUxUX0RFQVVUSF9JTkQsCisJZUNTUl9ST0FNX1JFU1VMVF9DQVBfQ0hBTkdFRCwKKwkvKgorCSAqIFRoaXMgbWVhbnMgd2Ugc3RhcnRzIGFuIElCU1MgdENzclJvYW1JbmZvJ3MKKwkgKiBwQnNzRGVzYyBtYXkgcGFzcyBiYWNrCisJICovCisJZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1NUQVJURUQsCisJZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1NUQVJUX0ZBSUxFRCwKKwllQ1NSX1JPQU1fUkVTVUxUX0lCU1NfSk9JTl9TVUNDRVNTLAorCWVDU1JfUk9BTV9SRVNVTFRfSUJTU19KT0lOX0ZBSUxFRCwKKwllQ1NSX1JPQU1fUkVTVUxUX0lCU1NfQ09OTkVDVCwKKwllQ1NSX1JPQU1fUkVTVUxUX0lCU1NfSU5BQ1RJVkUsCisJLyoKKwkgKiBJZiByb2FtU3RhdHVzIGlzIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OCisJICogdENzclJvYW1JbmZvJ3MgcEJzc0Rlc2MgbWF5IHBhc3MgYmFjayBhbmQgdGhlIHBlZXIncyBNQUMgYWRkcmVzcworCSAqIGluIHBlZXJNYWNPckJzc2lkLiBJZiByb2FtU3RhdHVzIGlzIGVDU1JfUk9BTV9JQlNTX0lORCwKKwkgKiB0aGUgcGVlcidzIE1BQyBhZGRyZXNzIGluIHBlZXJNYWNPckJzc2lkIGFuZCBhIGJlYWNvbiBmcmFtZQorCSAqIG9mIHRoZSBJQlNTIGluIHBiRnJhbWVzCisJICovCisJZUNTUl9ST0FNX1JFU1VMVF9JQlNTX05FV19QRUVSLAorCS8qCisJICogUGVlciBkZXBhcnRlZCBmcm9tIElCU1MsIENhbGxiYWNrIG1heSBnZXQgYSBwb2ludGVyIHRTbWVJYnNzUGVlckluZAorCSAqIGluIHBJYnNzUGVlckluZAorCSAqLworCWVDU1JfUk9BTV9SRVNVTFRfSUJTU19QRUVSX0RFUEFSVEVELAorCS8qCisJICogQ29hbGVzY2luZyBpbiB0aGUgSUJTUyBuZXR3b3JrIChqb2luZWQgYW4gSUJTUyBuZXR3b3JrKQorCSAqIENhbGxiYWNrIHBhc3MgYSBCU1NJRCBpbiBwZWVyTWFjT3JCc3NpZAorCSAqLworCWVDU1JfUk9BTV9SRVNVTFRfSUJTU19DT0FMRVNDRUQsCisJLyoKKwkgKiBJZiByb2FtU3RhdHVzIGlzIGVDU1JfUk9BTV9ST0FNSU5HX1NUQVJULCBjYWxsYmFjayBtYXkgZ2V0IGEgcG9pbnRlcgorCSAqIHRvIHRDc3JDb25uZWN0ZWRQcm9maWxlIHVzZWQgdG8gY29ubmVjdC4KKwkgKi8KKwllQ1NSX1JPQU1fUkVTVUxUX0lCU1NfU1RPUCwKKwllQ1NSX1JPQU1fUkVTVUxUX0xPU1RMSU5LLAorCWVDU1JfUk9BTV9SRVNVTFRfTUlDX0VSUk9SX1VOSUNBU1QsCisJZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfR1JPVVAsCisJZUNTUl9ST0FNX1JFU1VMVF9BVVRIRU5USUNBVEVELAorCWVDU1JfUk9BTV9SRVNVTFRfTkVXX1JTTl9CU1MsCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwllQ1NSX1JPQU1fUkVTVUxUX05FV19XQVBJX0JTUywKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCS8qIFdEUyBzdGFydGVkIHN1Y2Nlc3NmdWxseSAqLworCWVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUQVJURUQsCisJLyogV0RTIHN0YXJ0IGZhaWxlZCAqLworCWVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUQVJUX0ZBSUxFRCwKKwkvKiBXRFMgc3RvcHBlZCAqLworCWVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUT1BQRUQsCisJLyogV0RTIGpvaW5lZCBzdWNjZXNzZnVsbHkgaW4gU1RBIG1vZGUgKi8KKwllQ1NSX1JPQU1fUkVTVUxUX1dEU19BU1NPQ0lBVEVELAorCS8qIEEgc3RhdGlvbiBqb2luZWQgV0RTIEFQICovCisJZUNTUl9ST0FNX1JFU1VMVF9XRFNfQVNTT0NJQVRJT05fSU5ELAorCS8qIFdEUyBqb2luIGZhaWxlZCBpbiBTVEEgbW9kZSAqLworCWVDU1JfUk9BTV9SRVNVTFRfV0RTX05PVF9BU1NPQ0lBVEVELAorCS8qIFdEUyBkaXNhc3NvY2lhdGVkICovCisJZUNTUl9ST0FNX1JFU1VMVF9XRFNfRElTQVNTT0NJQVRFRCwKKwkvKiBJTkZSQSBzdGFydGVkIHN1Y2Nlc3NmdWxseSAqLworCWVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfU1RBUlRFRCwKKwkvKiBJTkZSQSBzdGFydCBmYWlsZWQgKi8KKwllQ1NSX1JPQU1fUkVTVUxUX0lORlJBX1NUQVJUX0ZBSUxFRCwKKwkvKiBJTkZSQSBzdG9wcGVkICovCisJZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9TVE9QUEVELAorCS8qIEEgc3RhdGlvbiBqb2luaW5nIElORlJBIEFQICovCisJZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9BU1NPQ0lBVElPTl9JTkQsCisJLyogQSBzdGF0aW9uIGpvaW5lZCBJTkZSQSBBUCAqLworCWVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfQVNTT0NJQVRJT05fQ05GLAorCS8qIElORlJBIGRpc2Fzc29jaWF0ZWQgKi8KKwllQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0RJU0FTU09DSUFURUQsCisJZUNTUl9ST0FNX1JFU1VMVF9XUFNfUEJDX1BST0JFX1JFUV9JTkQsCisJZUNTUl9ST0FNX1JFU1VMVF9TRU5EX0FDVElPTl9GQUlMLAorCS8qIHBlZXIgcmVqZWN0ZWQgYXNzb2MgYmVjYXVzZSBtYXggYXNzb2MgbGltaXQgcmVhY2hlZCAqLworCWVDU1JfUk9BTV9SRVNVTFRfTUFYX0FTU09DX0VYQ0VFREVELAorCS8qIEFzc29jIHJlamVjdGVkIGR1ZSB0byBjb25jdXJyZW50IHNlc3Npb24gcnVubmluZyBvbiBhIGRpZmYgY2hhbm5lbCAqLworCWVDU1JfUk9BTV9SRVNVTFRfQVNTT0NfRkFJTF9DT05fQ0hBTk5FTCwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWVDU1JfUk9BTV9SRVNVTFRfQUREX1RETFNfUEVFUiwKKwllQ1NSX1JPQU1fUkVTVUxUX1VQREFURV9URExTX1BFRVIsCisJZUNTUl9ST0FNX1JFU1VMVF9ERUxFVEVfVERMU19QRUVSLAorCWVDU1JfUk9BTV9SRVNVTFRfVEVBUkRPV05fVERMU19QRUVSX0lORCwKKwllQ1NSX1JPQU1fUkVTVUxUX0RFTEVURV9BTExfVERMU19QRUVSX0lORCwKKwllQ1NSX1JPQU1fUkVTVUxUX0xJTktfRVNUQUJMSVNIX1JFUV9SU1AsCisJZUNTUl9ST0FNX1JFU1VMVF9URExTX1NIT1VMRF9ESVNDT1ZFUiwKKwllQ1NSX1JPQU1fUkVTVUxUX1RETFNfU0hPVUxEX1RFQVJET1dOLAorCWVDU1JfUk9BTV9SRVNVTFRfVERMU19TSE9VTERfUEVFUl9ESVNDT05ORUNURUQsCisjZW5kaWYKKworCWVDU1JfUk9BTV9SRVNVTFRfREZTX1JBREFSX0ZPVU5EX0lORCwKKwllQ1NSX1JPQU1fUkVTVUxUX0NIQU5ORUxfQ0hBTkdFX1NVQ0NFU1MsCisJZUNTUl9ST0FNX1JFU1VMVF9DSEFOTkVMX0NIQU5HRV9GQUlMVVJFLAorCWVDU1JfUk9BTV9SRVNVTFRfREZTX0NIQU5TV19VUERBVEVfU1VDQ0VTUywKKwllQ1NSX1JPQU1fUkVTVUxUX0RGU19DSEFOU1dfVVBEQVRFX0ZBSUxVUkUsCit9IGVDc3JSb2FtUmVzdWx0OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIExpc3Qgb2YgbGluayBxdWFsaXR5IGluZGljYXRpb25zIEhERCBjYW4gcmVjZWl2ZSBmcm9tIFNNRQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX1JPQU1fTElOS19RVUFMX01JTl9JTkQgPSAtMSwKKworCWVDU1JfUk9BTV9MSU5LX1FVQUxfUE9PUl9JTkQgPSAwLCAgICAgICAvKiBiYWQgbGluayAgICAgICAgICAgICAgICAqLworCWVDU1JfUk9BTV9MSU5LX1FVQUxfR09PRF9JTkQgPSAxLCAgICAgICAvKiBhY2NlcHRhYmxlIGZvciB2b2ljZSAgICAqLworCWVDU1JfUk9BTV9MSU5LX1FVQUxfVkVSWV9HT09EX0lORCA9IDIsICAvKiBzdWl0YWJsZSBmb3Igdm9pY2UgICAgICAqLworCWVDU1JfUk9BTV9MSU5LX1FVQUxfRVhDRUxMRU5UX0lORCA9IDMsICAvKiBzdWl0YWJsZSBmb3Igdm9pY2UgICAgICAqLworCisJZUNTUl9ST0FNX0xJTktfUVVBTF9NQVhfSU5EICAgICAvKiBpbnZhbGlkIHZhbHVlICovCit9IGVDc3JSb2FtTGlua1F1YWxpdHlJbmQ7CisKK3R5cGVkZWYgZW51bSB7CisJZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCA9IDAsCisJZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9NSUNfRVJST1IsCisJZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9ESVNBU1NPQywKKwllQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0RFQVVUSCwKKwllQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0hBTkRPRkYsCisJZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9JQlNTX0pPSU5fRkFJTFVSRSwKKwllQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0lCU1NfTEVBVkUsCisJZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9TVEFfSEFTX0xFRlQsCit9IGVDc3JSb2FtRGlzY29ubmVjdFJlYXNvbjsKKwordHlwZWRlZiBlbnVtIHsKKwkvKiBOb3QgYXNzb2NpYXRlZCBpbiBJbmZyYSBvciBwYXJ0aWNpcGF0aW5nIGluIGFuIElCU1MvQWQtaG9jICovCisJZUNTUl9BU1NPQ19TVEFURV9UWVBFX05PVF9DT05ORUNURUQsCisJLyogQXNzb2NpYXRlZCBpbiBhbiBJbmZyYXN0cnVjdHVyZSBuZXR3b3JrLiAqLworCWVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JTkZSQV9BU1NPQ0lBVEVELAorCS8qIFBhcnRpY2lwYXRpbmcgaW4gSUJTUyBuZXR3b3JrIHRob3VnaCBkaXNjb25uZWN0aW9uICovCisJZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lCU1NfRElTQ09OTkVDVEVELAorCS8qIFBhcnRpY2lwYXRpbmcgaW4gSUJTUyBuZXR3b3JrIHdpdGggcGFydG5lciBzdGF0aW9ucyBhbHNvIHByZXNlbnQgKi8KKwllQ1NSX0FTU09DX1NUQVRFX1RZUEVfSUJTU19DT05ORUNURUQsCisJLyogUGFydGljaXBhdGluZyBpbiBXRFMgbmV0d29yayBpbiBBUC9TVEEgbW9kZSBidXQgbm90IGNvbm5lY3RlZCB5ZXQgKi8KKwllQ1NSX0FTU09DX1NUQVRFX1RZUEVfV0RTX0RJU0NPTk5FQ1RFRCwKKwkvKiBQYXJ0aWNpcGF0aW5nIGluIGEgV0RTIG5ldHdvcmsgYW5kIGNvbm5lY3RlZCBwZWVyIHRvIHBlZXIgKi8KKwllQ1NSX0FTU09DX1NUQVRFX1RZUEVfV0RTX0NPTk5FQ1RFRCwKKwkvKiBQYXJ0aWNpcGF0aW5nIGluIGEgSW5mcmEgbmV0d29yayBpbiBBUCBub3QgeWV0IGluIGNvbm5lY3RlZCBzdGF0ZSAqLworCWVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JTkZSQV9ESVNDT05ORUNURUQsCisJLyogUGFydGljaXBhdGluZyBpbiBhIEluZnJhIG5ldHdvcmsgYW5kIGNvbm5lY3RlZCB0byBhIHBlZXIgKi8KKwllQ1NSX0FTU09DX1NUQVRFX1RZUEVfSU5GUkFfQ09OTkVDVEVELAorCit9IGVDc3JDb25uZWN0U3RhdGU7CisKKy8qCisgKiBUaGlzIHBhcmFtZXRlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIHRoZSBQcm9maWxlLgorICogTmVlZCB0byBzZXQgdGhpcyBpbiB0aGUgZ2xvYmFsIHByb3BlcnRpZXMgZm9yIHRoZSBhZGFwdGVyLgorICovCit0eXBlZGVmIGVudW0gZUNTUl9NRURJVU1fQUNDRVNTIHsKKwllQ1NSX01FRElVTV9BQ0NFU1NfQVVUTyA9IDAsCisJZUNTUl9NRURJVU1fQUNDRVNTX0RDRiwKKwllQ1NSX01FRElVTV9BQ0NFU1NfZURDRiwKKwllQ1NSX01FRElVTV9BQ0NFU1NfSENGLAorCisJZUNTUl9NRURJVU1fQUNDRVNTX1dNTV9lRENGXzgwMmRvdDFwLAorCWVDU1JfTUVESVVNX0FDQ0VTU19XTU1fZURDRl9EU0NQLAorCWVDU1JfTUVESVVNX0FDQ0VTU19XTU1fZURDRl9Ob0NsYXNzaWZ5LAorCWVDU1JfTUVESVVNX0FDQ0VTU18xMWVfZURDRiA9IGVDU1JfTUVESVVNX0FDQ0VTU19lRENGLAorCWVDU1JfTUVESVVNX0FDQ0VTU18xMWVfSENGID0gZUNTUl9NRURJVU1fQUNDRVNTX0hDRiwKK30gZUNzck1lZGlhQWNjZXNzVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX1RYX1JBVEVfQVVUTyAgICA9IDAsICAvKiB1c2UgcmF0ZSBhZGFwdGlvbiB0byBkZXRlcm1pbmUgVHggcmF0ZS4gKi8KKwllQ1NSX1RYX1JBVEVfMU1icHMgICA9IDB4MDAwMDAwMDEsCisJZUNTUl9UWF9SQVRFXzJNYnBzICAgPSAweDAwMDAwMDAyLAorCWVDU1JfVFhfUkFURV81XzVNYnBzID0gMHgwMDAwMDAwNCwKKwllQ1NSX1RYX1JBVEVfNk1icHMgICA9IDB4MDAwMDAwMDgsCisJZUNTUl9UWF9SQVRFXzlNYnBzICAgPSAweDAwMDAwMDEwLAorCWVDU1JfVFhfUkFURV8xMU1icHMgID0gMHgwMDAwMDAyMCwKKwllQ1NSX1RYX1JBVEVfMTJNYnBzICA9IDB4MDAwMDAwNDAsCisJZUNTUl9UWF9SQVRFXzE4TWJwcyAgPSAweDAwMDAwMDgwLAorCWVDU1JfVFhfUkFURV8yNE1icHMgID0gMHgwMDAwMDEwMCwKKwllQ1NSX1RYX1JBVEVfMzZNYnBzICA9IDB4MDAwMDAyMDAsCisJZUNTUl9UWF9SQVRFXzQyTWJwcyAgPSAweDAwMDAwNDAwLAorCWVDU1JfVFhfUkFURV80OE1icHMgID0gMHgwMDAwMDgwMCwKKwllQ1NSX1RYX1JBVEVfNTRNYnBzICA9IDB4MDAwMDEwMDAsCisJZUNTUl9UWF9SQVRFXzcyTWJwcyAgPSAweDAwMDAyMDAwLAorCWVDU1JfVFhfUkFURV84NE1icHMgID0gMHgwMDAwNDAwMCwKKwllQ1NSX1RYX1JBVEVfOTZNYnBzICA9IDB4MDAwMDgwMDAsCisJZUNTUl9UWF9SQVRFXzEwOE1icHMgPSAweDAwMDEwMDAwLAorCWVDU1JfVFhfUkFURV8xMjZNYnBzID0gMHgwMDAyMDAwMCwKKwllQ1NSX1RYX1JBVEVfMTQ0TWJwcyA9IDB4MDAwNDAwMDAsCisJZUNTUl9UWF9SQVRFXzE2OE1icHMgPSAweDAwMDgwMDAwLAorCWVDU1JfVFhfUkFURV8xOTJNYnBzID0gMHgwMDEwMDAwMCwKKwllQ1NSX1RYX1JBVEVfMjE2TWJwcyA9IDB4MDAyMDAwMDAsCisJZUNTUl9UWF9SQVRFXzI0ME1icHMgPSAweDAwNDAwMDAwLAorCit9IGVDc3JFeHBvc2VkVHhSYXRlOworCit0eXBlZGVmIGVudW0geworCWVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQUxMID0gMCwKKwllQ1NSX09QRVJBVElOR19DSEFOTkVMX0FVVE8gPSBlQ1NSX09QRVJBVElOR19DSEFOTkVMX0FMTCwKKwllQ1NSX09QRVJBVElOR19DSEFOTkVMX0FOWSA9IGVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQUxMLAorfSBlT3BlcmF0aW9uQ2hhbm5lbDsKKwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX0RPVDExX0ZSQUdfVEhSRVNIX0FVVE8gPSAtMSwKKwllQ1NSX0RPVDExX0ZSQUdfVEhSRVNIX01JTiA9IDI1NiwKKwllQ1NSX0RPVDExX0ZSQUdfVEhSRVNIX01BWCA9IDIzNDYsCisJZUNTUl9ET1QxMV9GUkFHX1RIUkVTSF9ERUZBVUxUID0gMjAwMAorfSBlQ3NyRG90MTFGcmFnVGhyZXNoOworCisvKiBmb3IgY2hhbm5lbCBib25kaW5nIGZvciBpYnNzICovCit0eXBlZGVmIGVudW0geworCWVDU1JfQ0JfT0ZGID0gMCwKKwllQ1NSX0NCX0FVVE8gPSAxLAorCWVDU1JfQ0JfRE9XTiA9IDIsCisJZUNTUl9DQl9VUCA9IDMsCit9IGVDc3JDQkNob2ljZTsKKworLyoKKyAqIEZvciBjaGFubmVsIGJvbmRpbmcsIHRoZSBjaGFubmVsIG51bWJlciBnYXAgaXMgNCwgZWl0aGVyIHVwIG9yIGRvd24uCisgKiBGb3IgYm90aCAxMWEgYW5kIDExZyBtb2RlLgorICovCisjZGVmaW5lIENTUl9DQl9DSEFOTkVMX0dBUCA0CisjZGVmaW5lIENTUl9DQl9DRU5URVJfQ0hBTk5FTF9PRkZTRVQgICAgMgorCisvKiBXRVAga2V5c2l6ZSAoaW4gYml0cykgKi8KK3R5cGVkZWYgZW51bSB7CisJLyogNDAgYml0IGtleSArIDI0Yml0IElWID0gNjRiaXQgV0VQICovCisJZUNTUl9TRUNVUklUWV9XRVBfS0VZU0laRV80MCA9IDQwLAorCS8qIDEwNGJpdCBrZXkgKyAyNGJpdCBJViA9IDEyOGJpdCBXRVAgKi8KKwllQ1NSX1NFQ1VSSVRZX1dFUF9LRVlTSVpFXzEwNCA9IDEwNCwKKwllQ1NSX1NFQ1VSSVRZX1dFUF9LRVlTSVpFX01JTiA9IGVDU1JfU0VDVVJJVFlfV0VQX0tFWVNJWkVfNDAsCisJZUNTUl9TRUNVUklUWV9XRVBfS0VZU0laRV9NQVggPSBlQ1NSX1NFQ1VSSVRZX1dFUF9LRVlTSVpFXzEwNCwKKwllQ1NSX1NFQ1VSSVRZX1dFUF9LRVlTSVpFX01BWF9CWVRFUyA9CisJCShlQ1NSX1NFQ1VSSVRZX1dFUF9LRVlTSVpFX01BWCAvIDgpLAorfSBlQ3NyV0VQS2V5U2l6ZTsKKworLyogUG9zc2libGUgdmFsdWVzIGZvciB0aGUgV0VQIHN0YXRpYyBrZXkgSUQgKi8KK3R5cGVkZWYgZW51bSB7CisKKwllQ1NSX1NFQ1VSSVRZX1dFUF9TVEFUSUNfS0VZX0lEX01JTiA9IDAsCisJZUNTUl9TRUNVUklUWV9XRVBfU1RBVElDX0tFWV9JRF9NQVggPSAzLAorCWVDU1JfU0VDVVJJVFlfV0VQX1NUQVRJQ19LRVlfSURfREVGQVVMVCA9IDAsCisKKwllQ1NSX1NFQ1VSSVRZX1dFUF9TVEFUSUNfS0VZX0lEX0lOVkFMSUQgPSAtMSwKKworfSBlQ3NyV0VQU3RhdGljS2V5SUQ7CisKKy8qIFR3byBleHRyYSBrZXkgaW5kaWNpZXMgYXJlIHVzZWQgZm9yIHRoZSBJR1RLICh3aGljaCBpcyB1c2VkIGJ5IEJJUCkgKi8KKyNkZWZpbmUgQ1NSX01BWF9OVU1fS0VZICAgICAoZUNTUl9TRUNVUklUWV9XRVBfU1RBVElDX0tFWV9JRF9NQVggKyAyICsgMSkKKwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX1NFQ1VSSVRZX1NFVF9LRVlfQUNUSU9OX05PX0NIQU5HRSwKKwllQ1NSX1NFQ1VSSVRZX1NFVF9LRVlfQUNUSU9OX1NFVF9LRVksCisJZUNTUl9TRUNVUklUWV9TRVRfS0VZX0FDVElPTl9ERUxFVEVfS0VZLAorfSBlQ3NyU2V0S2V5QWN0aW9uOworCit0eXBlZGVmIGVudW0geworCWVDU1JfQkFORF9BTEwsCisJZUNTUl9CQU5EXzI0LAorCWVDU1JfQkFORF81RywKKwllQ1NSX0JBTkRfTUFYLAorfSBlQ3NyQmFuZDsKKwordHlwZWRlZiBlbnVtIHsKKwkvKgorCSAqIFJvYW1pbmcgYmVjYXVzZSBIREQgcmVxdWVzdGVkIGZvciByZWFzc29jIGJ5IGNoYW5naW5nIG9uZSBvZiB0aGUKKwkgKiBmaWVsZHMgaW4gdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzLiBPUiBSb2FtaW5nIGJlY2F1c2UgU01FCisJICogcmVxdWVzdGVkIGZvciByZWFzc29jIGJ5IGNoYW5naW5nIG9uZSBvZiB0aGUgZmllbGRzIGluCisJICogdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzLgorCSAqLworCWVDc3JSb2FtUmVhc29uU3RhQ2FwYWJpbGl0eUNoYW5nZWQsCisJLyoKKwkgKiBSb2FtaW5nIGJlY2F1c2UgU01FIHJlcXVlc3RlZCBmb3IgcmVhc3NvYyB0byBhIGRpZmZlcmVudCBBUCwKKwkgKiBhcyBwYXJ0IG9mIGludGVyIEFQIGhhbmRvZmYuCisJICovCisJZUNzclJvYW1SZWFzb25CZXR0ZXJBUCwKKwkvKgorCSAqIFJvYW1pbmcgYmVjYXVzZSBTTUUgcmVxdWVzdGVkIGl0IGFzIHRoZSBsaW5rIGlzIGxvc3QgLSBwbGFjZWhvbGRlciwKKwkgKiB3aWxsIGNsZWFuIGl0IHVwIG9uY2UgaGFuZG9mZiBjb2RlIGdldHMgaW4KKwkgKi8KKwllQ3NyUm9hbVJlYXNvblNtZUlzc3VlZEZvckxvc3RMaW5rLAorCit9IGVDc3JSb2FtUmVhc29uQ29kZXM7CisKK3R5cGVkZWYgZW51bSB7CisJZUNzclJvYW1XbW1BdXRvID0gMCwKKwllQ3NyUm9hbVdtbVFic3NPbmx5ID0gMSwKKwllQ3NyUm9hbVdtbU5vUW9zID0gMiwKKworfSBlQ3NyUm9hbVdtbVVzZXJNb2RlVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX1JFUVVFU1RFUl9NSU4gPSAwLAorCWVDU1JfRElBRywKKwllQ1NSX1VNQV9HQU4sCisJZUNTUl9IREQKK30gZUNzclN0YXRzUmVxdWVzdGVyVHlwZTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisvKioKKyAqIGVudW0gY3NyX2hpX3Jzc2lfc2Nhbl9pZCAtIFBhcmFtZXRlciBpZHMgZm9yIGhpIHJzc2kgc2NhbiBmZWF0dXJlCisgKgorICogQGVDU1JfSElfUlNTSV9TQ0FOX01BWENPVU5UX0lEOiBob3cgbWFueSB0aW1lcyBzY2FuIGNhbiBiZSBwZXJmb3JtZWQKKyAqIEBlQ1NSX0hJX1JTU0lfU0NBTl9SU1NJX0RFTFRBX0lEOiByc3NpIGRpZmZlcmVuY2UgdG8gdHJpZ2dlciBzY2FuCisgKiBAZUNTUl9ISV9SU1NJX1NDQU5fREVMQVlfSUQ6IGRlbGF5IGluIG1pbGxzZWNvbmRzIGJldHdlZW4gc2NhbnMKKyAqIEBlQ1NSX0hJX1JTU0lfU0NBTl9SU1NJX1VCX0lEOiByc3NpIHVwcGVyIGJvdW5kIGZvciBzY2FuIHRyaWdnZXIKKyAqLworZW51bSBjc3JfaGlfcnNzaV9zY2FuX2lkIHsKKwllQ1NSX0hJX1JTU0lfU0NBTl9NQVhDT1VOVF9JRCwKKwllQ1NSX0hJX1JTU0lfU0NBTl9SU1NJX0RFTFRBX0lELAorCWVDU1JfSElfUlNTSV9TQ0FOX0RFTEFZX0lELAorCWVDU1JfSElfUlNTSV9TQ0FOX1JTU0lfVUJfSUQKK307CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUG1raWRDYW5kaWRhdGVJbmZvIHsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIEJTU0lEOworCWJvb2wgcHJlQXV0aFN1cHBvcnRlZDsKK30gdFBta2lkQ2FuZGlkYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUG1raWRDYWNoZUluZm8geworCXN0cnVjdCBjZGZfbWFjX2FkZHIgQlNTSUQ7CisJdWludDhfdCBQTUtJRFtDU1JfUlNOX1BNS0lEX1NJWkVdOworfSB0UG1raWRDYWNoZUluZm87CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQordHlwZWRlZiBzdHJ1Y3QgdGFnQmtpZENhbmRpZGF0ZUluZm8geworCXN0cnVjdCBjZGZfbWFjX2FkZHIgQlNTSUQ7CisJYm9vbCBwcmVBdXRoU3VwcG9ydGVkOworfSB0QmtpZENhbmRpZGF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IHRhZ0JraWRDYWNoZUluZm8geworCXN0cnVjdCBjZGZfbWFjX2FkZHIgQlNTSUQ7CisJdWludDhfdCBCS0lEW0NTUl9XQVBJX0JLSURfU0laRV07Cit9IHRCa2lkQ2FjaGVJbmZvOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzcktleXMgeworCS8qIEFsc28gdXNlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGtleSBpbmRleCBpcyBzZXQgKi8KKwl1aW50OF90IEtleUxlbmd0aFtDU1JfTUFYX05VTV9LRVldOworCXVpbnQ4X3QgS2V5TWF0ZXJpYWxbQ1NSX01BWF9OVU1fS0VZXVtDU1JfTUFYX0tFWV9MRU5dOworCXVpbnQ4X3QgZGVmYXVsdEluZGV4OworfSB0Q3NyS2V5czsKKworLyoKKyAqIEZvbGxvd2luZyBmaWVsZHMgd2hpY2gncmUgcGFydCBvZiB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgbWlnaHQgbmVlZAorICogbW9kaWZpY2F0aW9uIGR5bmFtaWNhbGx5IG9uY2UgU1RBIGlzIHVwICYgcnVubmluZyAmIHRoaXMnZCB0cmlnZ2VyIHJlYXNzb2MKKyAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgeworCS8qCisJICogZHVyaW5nIGNvbm5lY3QgdGhpcyBzcGVjaWZpZXMgQUNzIFUtQVBTRCBpcyB0byBiZSBzZXR1cAorCSAqIGZvciAoQml0MDpWTzsgQml0MTpWSTsgQml0MjpCSzsgQml0MzpCRSBhbGwgb3RoZXIgYml0cyBhcmUgaWdub3JlZCkuCisJICogRHVyaW5nIGFzc29jIHJlc3BvbnNlIHRoaXMgQ09VTEQgY2FycnkgY29uZmlybWF0aW9uIG9mIHdoYXQKKwkgKiBBQ3MgVS1BUFNEIGdvdCBzZXR1cCBmb3IuIExhdGVyIGlmIGFuIEFQUCBsb29raW5nIGZvciBBUFNELAorCSAqIFNNRS1Rb1MgbWlnaHQgbmVlZCB0byBtb2RpZnkgdGhpcyBmaWVsZAorCSAqLworCXVpbnQ4X3QgdWFwc2RfbWFzazsKKwkvKiBIREQgbWlnaHQgYXNrIHRvIG1vZGlmeSB0aGlzIGZpZWxkICovCisJdWludDE2X3QgbGlzdGVuX2ludGVydmFsOworfSB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHM7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzclJvYW1Qcm9maWxlIHsKKwkvKgorCSAqIEZvciBlQ1NSX0JTU19UWVBFX1dEU19BUC4gVGhlcmUgbXVzdCBiZSBvbmUgU1NJRCBpbiBTU0lEcy4KKwkgKiBGb3IgZUNTUl9CU1NfVFlQRV9XRFNfU1RBLiBUaGVyZSBtdXN0IGJlIHR3byBTU0lEcy4KKwkgKiBJbmRleCAwIGlzIHRoZSBTU0lEIG9mIHRoZSBXRFMtQVAgdGhhdCB3ZSBuZWVkIHRvIGpvaW4uCisJICogSW5kZXggMSBpcyB0aGUgU1NJRCBmb3Igc2VsZiBCU1MuCisJICovCisJdENzclNTSURzIFNTSURzOworCXRDc3JCU1NJRHMgQlNTSURzOworCS8qIHRoaXMgaXMgYml0IG1hc2sgb2YgYWxsIHRoZSBuZWVkZWQgcGh5IG1vZGUgZGVmaW5lZCBpbiBlQ3NyUGh5TW9kZSAqLworCXVpbnQzMl90IHBoeU1vZGU7CisJZUNzclJvYW1Cc3NUeXBlIEJTU1R5cGU7CisJdENzckF1dGhMaXN0IEF1dGhUeXBlOworCWVDc3JBdXRoVHlwZSBuZWdvdGlhdGVkQXV0aFR5cGU7CisJdENzckVuY3J5cHRpb25MaXN0IEVuY3J5cHRpb25UeXBlOworCS8qIFRoaXMgZmllbGQgaXMgZm9yIG91dHB1dCBvbmx5LCBub3QgZm9yIGlucHV0ICovCisJZUNzckVuY3J5cHRpb25UeXBlIG5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlOworCS8qCisJICogZUNTUl9FTkNSWVBUX1RZUEVfQU5ZIGNhbm5vdCBiZSBzZXQgaW4gbXVsdGljYXN0IGVuY3J5cHRpb24gdHlwZS4KKwkgKiBJZiBjYWxsZXIgZG9lc24ndCBjYXNlLCBwdXQgYWxsIHN1cHBvcnRlZCBlbmNyeXB0aW9uIHR5cGVzIGluIGhlcmUKKwkgKi8KKwl0Q3NyRW5jcnlwdGlvbkxpc3QgbWNFbmNyeXB0aW9uVHlwZTsKKwkvKiBUaGlzIGZpZWxkIGlzIGZvciBvdXRwdXQgb25seSwgbm90IGZvciBpbnB1dCAqLworCWVDc3JFbmNyeXB0aW9uVHlwZSBuZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJLyogTWFuYWdlbWVudCBGcmFtZSBQcm90ZWN0aW9uICovCisJYm9vbCBNRlBFbmFibGVkOworCXVpbnQ4X3QgTUZQUmVxdWlyZWQ7CisJdWludDhfdCBNRlBDYXBhYmxlOworI2VuZGlmCisJdENzcktleXMgS2V5czsKKwllQ3NyQ0JDaG9pY2UgQ0JNb2RlOworCXRDc3JDaGFubmVsSW5mbyBDaGFubmVsSW5mbzsKKwl1aW50OF90IG9wZXJhdGlvbkNoYW5uZWw7CisJY2hhbl9wYXJhbXNfdCBjaF9wYXJhbXM7CisJLyogSWYgdGhpcyBpcyAwLCBTTUUgd2lsbCBmaWxsIGluIGZvciBjYWxsZXIuICovCisJdWludDE2X3QgYmVhY29uSW50ZXJ2YWw7CisJLyoKKwkgKiBkdXJpbmcgY29ubmVjdCB0aGlzIHNwZWNpZmllcyBBQ3MgVS1BUFNEIGlzIHRvIGJlIHNldHVwCisJICogZm9yIChCaXQwOlZPOyBCaXQxOlZJOyBCaXQyOkJLOyBCaXQzOkJFIGFsbCBvdGhlciBiaXRzIGFyZSBpZ25vcmVkKS4KKwkgKiBEdXJpbmcgYXNzb2MgcmVzcCB0aGlzJ2QgY2FycnkgY25mIG9mIHdoYXQgQUNzIFUtQVBTRCBnb3Qgc2V0dXAgZm9yCisJICovCisJdWludDhfdCB1YXBzZF9tYXNrOworCXVpbnQzMl90IG5XUEFSZXFJRUxlbmd0aDsgLyogVGhlIGJ5dGUgY291bnQgaW4gdGhlIHBXUEFSZXFJRSAqLworCXVpbnQ4X3QgKnBXUEFSZXFJRTsgICAgICAgLyogSWYgbm90IG51bGwsaXQncyBJRSBieXRlIHN0cmVhbSBmb3IgV1BBICovCisJdWludDMyX3QgblJTTlJlcUlFTGVuZ3RoOyAvKiBUaGUgYnl0ZSBjb3VudCBpbiB0aGUgcFJTTlJlcUlFICovCisJdWludDhfdCAqcFJTTlJlcUlFOyAgICAgICAvKiBJZiBub3QgbnVsbCxpdCdzIElFIGJ5dGUgc3RyZWFtIGZvciBSU04gKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCXVpbnQzMl90IG5XQVBJUmVxSUVMZW5ndGg7LyogVGhlIGJ5dGUgY291bnQgaW4gdGhlIHBXQVBJUmVxSUUgKi8KKwl1aW50OF90ICpwV0FQSVJlcUlFOyAgICAgIC8qIElmIG5vdCBudWxsLGl0J3MgSUUgYnl0ZSBzdHJlYW0gZm9yIFdBUEkgKi8KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisJdWludDMyX3QgbkFkZElFU2Nhbkxlbmd0aDsvKiBwQWRkSUUgZm9yIHNjYW4gKGF0IHRoZSB0aW1lIG9mIGpvaW4pICovCisJLyoKKwkgKiBJZiBub3QgbnVsbCxpdCdzIHRoZSBJRSBieXRlIHN0cmVhbSBmb3IgYWRkaXRpb25hbCBJRSwKKwkgKiB3aGljaCBjYW4gYmUgV1NDIElFIGFuZC9vciBQMlAgSUUKKwkgKi8KKwl1aW50OF90ICpwQWRkSUVTY2FuOworCXVpbnQzMl90IG5BZGRJRUFzc29jTGVuZ3RoOyAvKiBUaGUgYnl0ZSBjb3VudCBpbiB0aGUgcEFkZElFIGZvciBhc3NvYyAqLworCS8qCisJICogSWYgbm90IG51bGwsIGl0IGhhcyB0aGUgSUUgYnl0ZSBzdHJlYW0gZm9yIGFkZGl0aW9uYWwgSUUsCisJICogd2hpY2ggY2FuIGJlIFdTQyBJRSBhbmQvb3IgUDJQIElFCisJICovCisJdWludDhfdCAqcEFkZElFQXNzb2M7CisJLyogaXQgaXMgaWdub3JlZCBpZiBbMF0gaXMgMC4gKi8KKwl1aW50OF90IGNvdW50cnlDb2RlW1dOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTl07CisJLyogV1BTIEFzc29jaWF0aW9uIGlmIHRydWUgPT4gYXV0aCBhbmQgZWNyeXB0aW9uIHNob3VsZCBiZSBpZ25vcmVkICovCisJYm9vbCBiV1BTQXNzb2NpYXRpb247CisJYm9vbCBiT1NFTkFzc29jaWF0aW9uOworCXVpbnQzMl90IG5XU0NSZXFJRUxlbmd0aDsgLyogVGhlIGJ5dGUgY291bnQgaW4gdGhlIHBXU0NSZXFJRSAqLworCXVpbnQ4X3QgKnBXU0NSZXFJRTsgICAgICAgLyogSWYgbm90IG51bGwsaXQncyBJRSBieXRlIHN0cmVhbSBmb3IgV1NDICovCisJdWludDhfdCBpZWVlODAyMTFkOworCXVpbnQ4X3QgcHJpdmFjeTsKKwlib29sIGZ3ZFdQU1BCQ1Byb2JlUmVxOworCXRBbmlBdXRoVHlwZSBjc3I4MDIxMUF1dGhUeXBlOworCXVpbnQzMl90IGR0aW1QZXJpb2Q7CisJYm9vbCBBcFVhcHNkRW5hYmxlOworCWJvb2wgcHJvdEVuYWJsZWQ7CisJYm9vbCBvYnNzUHJvdEVuYWJsZWQ7CisJdWludDE2X3QgY2ZnX3Byb3RlY3Rpb247CisJdWludDhfdCB3cHNfc3RhdGU7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwl0Q3NyTW9iaWxpdHlEb21haW5JbmZvIE1ESUQ7CisjZW5kaWYKKwl0Q0RGX0NPTl9NT0RFIGNzclBlcnNvbmE7CisJdWludDhfdCBkaXNhYmxlREZTQ2hTd2l0Y2g7CisJLyogYWRkSWUgcGFyYW1zICovCisJdFNpckFkZEllUGFyYW1zIGFkZEllUGFyYW1zOworCXVpbnQ4X3Qgc2FwX2RvdDExbWM7Cit9IHRDc3JSb2FtUHJvZmlsZTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUm9hbUhUUHJvZmlsZSB7CisJdWludDhfdCBwaHltb2RlOworCXVpbnQ4X3QgaHRDYXBhYmlsaXR5OworCXVpbnQ4X3QgaHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisJdWludDhfdCBodFJlY29tbWVuZGVkVHhXaWR0aFNldDsKKwllUGh5Q2hhbkJvbmRTdGF0ZSBodFNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwl1aW50OF90IHZodENhcGFiaWxpdHk7CisJdWludDhfdCB2aHRUeENoYW5uZWxXaWR0aFNldDsKKwl1aW50OF90IGFwQ2VudGVyQ2hhbjsKKwl1aW50OF90IGFwQ2hhbldpZHRoOworI2VuZGlmCit9IHRDc3JSb2FtSFRQcm9maWxlOworI2VuZGlmCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSB7CisJdFNpck1hY1NTaWQgU1NJRDsKKwlib29sIGhhbmRvZmZQZXJtaXR0ZWQ7CisJYm9vbCBzc2lkSGlkZGVuOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzaWQ7CisJZUNzclJvYW1Cc3NUeXBlIEJTU1R5cGU7CisJZUNzckF1dGhUeXBlIEF1dGhUeXBlOworCXRDc3JBdXRoTGlzdCBBdXRoSW5mbzsKKwllQ3NyRW5jcnlwdGlvblR5cGUgRW5jcnlwdGlvblR5cGU7CisJdENzckVuY3J5cHRpb25MaXN0IEVuY3J5cHRpb25JbmZvOworCWVDc3JFbmNyeXB0aW9uVHlwZSBtY0VuY3J5cHRpb25UeXBlOworCXRDc3JFbmNyeXB0aW9uTGlzdCBtY0VuY3J5cHRpb25JbmZvOworCWVDc3JDQkNob2ljZSBDQk1vZGU7CisJdWludDhfdCBvcGVyYXRpb25DaGFubmVsOworCXVpbnQzMl90IHZodF9jaGFubmVsX3dpZHRoOworCXVpbnQxNl90IGJlYWNvbkludGVydmFsOworCXRDc3JLZXlzIEtleXM7CisJLyoKKwkgKiBtZWFuaW5nbGVzcyBvbiBjb25uZWN0LiBJdCdzIGFuIE9VVCBwYXJhbSBmcm9tIENTUidzIHBvaW50IG9mIHZpZXcKKwkgKiBEdXJpbmcgYXNzb2MgcmVzcG9uc2UgY2FycmllcyB0aGUgQUNNIGJpdC1tYXNrIGkuZS4gd2hhdAorCSAqIEFDcyBoYXZlIEFDTT0xIChpZiBhbnkpLChCaXQwOlZPOyBCaXQxOlZJOyBCaXQyOkJLOyBCaXQzOkJFCisJICogYWxsIG90aGVyIGJpdHMgYXJlIGlnbm9yZWQpCisJICovCisJdWludDhfdCBhY21fbWFzazsKKwl0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgbW9kaWZ5UHJvZmlsZUZpZWxkczsKKwl1aW50MzJfdCBuQWRkSUVBc3NvY0xlbmd0aDsKKwkvKgorCSAqIElmIG5vdCBudWxsLGl0J3MgSUUgYnl0ZSBzdHJlYW0gZm9yIGFkZGl0aW9uYWwgSUUsCisJICogd2hpY2ggY2FuIGJlIFdTQyBJRSBhbmQvb3IgUDJQIElFCisJICovCisJdWludDhfdCAqcEFkZElFQXNzb2M7CisJdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYzsKKwlib29sIHFhcDsgICAgICAgICAgICAgICAvKiBBUCBzdXBwb3J0cyBRb1MgKi8KKwlib29sIHFvc0Nvbm5lY3Rpb247ICAgICAvKiBBIGNvbm5lY3Rpb24gaXMgUW9TIGVuYWJsZWQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCXRDc3JNb2JpbGl0eURvbWFpbkluZm8gTURJRDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwl0Q3NyRXNlQ2NrbUluZm8gZXNlQ2NrbUluZm87CisJYm9vbCBpc0VTRUFzc29jOworI2VuZGlmCisJdWludDMyX3QgZG90MTFNb2RlOworCXVpbnQ4X3QgcHJveHlBUlBTZXJ2aWNlOworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCXRDc3JSb2FtSFRQcm9maWxlIEhUUHJvZmlsZTsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkvKiBNYW5hZ2VtZW50IEZyYW1lIFByb3RlY3Rpb24gKi8KKwlib29sIE1GUEVuYWJsZWQ7CisJdWludDhfdCBNRlBSZXF1aXJlZDsKKwl1aW50OF90IE1GUENhcGFibGU7CisjZW5kaWYKK30gdENzclJvYW1Db25uZWN0ZWRQcm9maWxlOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK3R5cGVkZWYgc3RydWN0IHRhZ0NzcjExckNvbmZpZ1BhcmFtcyB7CisJYm9vbCBJc0ZUUmVzb3VyY2VSZXFTdXBwb3J0ZWQ7Cit9IHRDc3IxMXJDb25maWdQYXJhbXM7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JOZWlnaGJvclJvYW1Db25maWdQYXJhbXMgeworCisJdWludDMyX3Qgbk5laWdoYm9yU2NhblRpbWVyUGVyaW9kOworCXVpbnQ4X3Qgbk5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZDsKKwl1aW50MTZfdCBuTmVpZ2hib3JTY2FuTWluQ2hhblRpbWU7CisJdWludDE2X3Qgbk5laWdoYm9yU2Nhbk1heENoYW5UaW1lOworCXNDc3JDaGFubmVsIG5laWdoYm9yU2NhbkNoYW5MaXN0OworCXVpbnQ4X3Qgbk1heE5laWdoYm9yUmV0cmllczsKKwl1aW50MTZfdCBuTmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZDsKKwl1aW50MTZfdCBuRW1wdHlTY2FuUmVmcmVzaFBlcmlvZDsKKwl1aW50OF90IG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZjsKKwl1aW50OF90IG5Sb2FtUmVzY2FuUnNzaURpZmY7CisJdWludDhfdCBuUm9hbUJtaXNzRmlyc3RCY250OworCXVpbnQ4X3QgblJvYW1CbWlzc0ZpbmFsQmNudDsKKwl1aW50OF90IG5Sb2FtQmVhY29uUnNzaVdlaWdodDsKKwl1aW50OF90IGRlbGF5X2JlZm9yZV92ZGV2X3N0b3A7CisJdWludDMyX3QgbmhpX3Jzc2lfc2Nhbl9tYXhfY291bnQ7CisJdWludDMyX3QgbmhpX3Jzc2lfc2Nhbl9yc3NpX2RlbHRhOworCXVpbnQzMl90IG5oaV9yc3NpX3NjYW5fZGVsYXk7CisJaW50MzJfdCBuaGlfcnNzaV9zY2FuX3Jzc2lfdWI7Cit9IHRDc3JOZWlnaGJvclJvYW1Db25maWdQYXJhbXM7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ29uZmlnUGFyYW0geworCXVpbnQzMl90IEZyYWdtZW50YXRpb25UaHJlc2hvbGQ7CisJLyoga2VlcCB0aGlzIHVpbnQzMl90LiBUaGlzIGdldHMgY29udmVydGVkIHRvIGVQaHlDaGFubmVsQm9uZFN0YXRlICovCisJdWludDMyX3QgY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHo7CisJdWludDMyX3QgY2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKKwllQ3NyUGh5TW9kZSBwaHlNb2RlOworCWVDc3JCYW5kIGVCYW5kOworCXVpbnQzMl90IFJUU1RocmVzaG9sZDsKKwl1aW50MzJfdCBIZWFydGJlYXRUaHJlc2g1MDsKKwl1aW50MzJfdCBIZWFydGJlYXRUaHJlc2gyNDsKKwllQ3NyQ0JDaG9pY2UgY2JDaG9pY2U7CisJZUNzckJhbmQgYmFuZENhcGFiaWxpdHk7ICAgICAvKiBpbmRpY2F0ZSBodyBjYXBhYmlsaXR5ICovCisJdWludDE2X3QgVHhSYXRlOworCWVDc3JSb2FtV21tVXNlck1vZGVUeXBlIFdNTVN1cHBvcnRNb2RlOworCWJvb2wgSXMxMWVTdXBwb3J0RW5hYmxlZDsKKwlib29sIElzMTFkU3VwcG9ydEVuYWJsZWQ7CisJYm9vbCBJczExZFN1cHBvcnRFbmFibGVkT3JpZ2luYWw7CisJYm9vbCBJczExaFN1cHBvcnRFbmFibGVkOworCWJvb2wgc2hvcnRTbG90VGltZTsKKwlib29sIFByb3ByaWV0YXJ5UmF0ZXNFbmFibGVkOworCXVpbnQ4X3QgQWRIb2NDaGFubmVsMjQ7CisJdWludDhfdCBBZEhvY0NoYW5uZWw1RzsKKwkvKgorCSAqIHRoaXMgbnVtYmVyIG1pbnVzIG9uZSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgc2NhbiBkb2Vzbid0IGZpbmQgaXQKKwkgKiBiZWZvcmUgaXQgaXMgcmVtb3ZlZAorCSAqLworCXVpbnQzMl90IG5TY2FuUmVzdWx0QWdlQ291bnQ7CisJLyogc2NhbiByZXMgYWdpbmcgdGltZSB0aHJlc2hvbGQgd2hlbiBOb3QtQ29ubmVjdC1Oby1Qb3dlclNhdmUsaW4gc2VjICovCisJdWludDMyX3Qgc2NhbkFnZVRpbWVOQ05QUzsKKwkvKiBzY2FuIHJlcyBhZ2luZyB0aW1lIHRocmVzaG9sZCB3aGVuIE5vdC1Db25uZWN0LVBvd2VyLVNhdmUsaW4gc2VjICovCisJdWludDMyX3Qgc2NhbkFnZVRpbWVOQ1BTOworCS8qIHNjYW4gcmVzIGFnaW5nIHRpbWUgdGhyZXNob2xkIHdoZW4gQ29ubmVjdC1Oby1Qb3dlci1TYXZlLCBpbiBzZWMgKi8KKwl1aW50MzJfdCBzY2FuQWdlVGltZUNOUFM7CisJLyogc2NhbiByZXMgYWdpbmcgdGltZSB0aHJlc2hvbGQgd2hlbiBDb25uZWN0LVBvd2VyLVNhdmUsIGluIHNlYyAqLworCXVpbnQzMl90IHNjYW5BZ2VUaW1lQ1BTOworCS8qIEluIHNlYywgQ1NSJ2xsIHRyeSB0aGlzIGxvbmcgYmVmb3JlIGdpdmVzIHVwLiAwIG1lYW5zIG5vIHJvYW1pbmcgKi8KKwl1aW50MzJfdCBuUm9hbWluZ1RpbWU7CisJLyogdG8gc2V0IHRoZSBSU1NJIGRpZmZlcmVuY2UgZm9yIGVhY2ggY2F0ZWdvcnkgKi8KKwl1aW50OF90IGJDYXRSc3NpT2Zmc2V0OworCS8qIHRvIHNldCBNQ0MgRW5hYmxlL0Rpc2FibGUgbW9kZSAqLworCXVpbnQ4X3QgZkVuYWJsZU1DQ01vZGU7CisJYm9vbCBtY2NfcnRzX2N0c19wcm90X2VuYWJsZTsKKwlib29sIG1jY19iY2FzdF9wcm9iX3Jlc3BfZW5hYmxlOworCS8qCisJICogVG8gYWxsb3cgTUNDIEdPIGRpZmZlcmVudCBCLkkgdGhhbiBTVEEncy4KKwkgKiBOT1RFOiBtYWtlIHN1cmUgaWYgUklWQSBmaXJtd2FyZSBjYW4gaGFuZGxlIHRoaXMgY29tYmluYXRpb24gYmVmb3JlCisJICogZW5hYmxpbmcgdGhpcyBhdCB0aGUgbW9tZW50LCB0aGlzIGZsYWcgaXMgcHJvdmlkZWQgb25seSB0byBwYXNzCisJICogV2ktRmkgQ2VydC4gNS4xLjEyCisJICovCisJdWludDhfdCBmQWxsb3dNQ0NHT0RpZmZCSTsKKwl0Q3NyMTFkaW5mbyBDc3IxMWRpbmZvOworCisJLyogQ291bnRyeSBDb2RlIFByaW9yaXR5ICovCisJYm9vbCBmU3VwcGxpY2FudENvdW50cnlDb2RlSGFzUHJpb3JpdHk7CisJdWludDE2X3QgdmNjUnNzaVRocmVzaG9sZDsKKwl1aW50MzJfdCB2Y2NVbE1hY0xvc3NUaHJlc2hvbGQ7CisJdWludDMyX3QgblBhc3NpdmVNaW5DaG5UaW1lOyAgICAgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgblBhc3NpdmVNYXhDaG5UaW1lOyAgICAgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgbkFjdGl2ZU1pbkNoblRpbWU7ICAgICAgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgbkFjdGl2ZU1heENoblRpbWU7ICAgICAgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgbkluaXRpYWxEd2VsbFRpbWU7ICAgICAgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJYm9vbCBpbml0aWFsX3NjYW5fbm9fZGZzX2Nobmw7CisjaWZkZWYgV0xBTl9BUF9TVEFfQ09OQ1VSUkVOQ1kKKwl1aW50MzJfdCBuUGFzc2l2ZU1pbkNoblRpbWVDb25jOyAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBuUGFzc2l2ZU1heENoblRpbWVDb25jOyAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBuQWN0aXZlTWluQ2huVGltZUNvbmM7ICAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBuQWN0aXZlTWF4Q2huVGltZUNvbmM7ICAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBuUmVzdFRpbWVDb25jOyAgICAgICAgICAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwkvKiBudW0gb2YgY2hhbm5lbHMgY29tYmluZWQgZm9yIFNUQSBpbiBlYWNoIHNwbGl0IHNjYW4gb3BlcmF0aW9uICovCisJdWludDhfdCBuTnVtU3RhQ2hhbkNvbWJpbmVkQ29uYzsKKwkvKiBudW1iZXIgb2YgY2hhbm5lbHMgY29tYmluZWQgZm9yIFAyUCBpbiBlYWNoIHNwbGl0IHNjYW4gb3BlcmF0aW9uICovCisJdWludDhfdCBuTnVtUDJQQ2hhbkNvbWJpbmVkQ29uYzsKKyNlbmRpZgorCS8qCisJICogaW4gZEJtLCB0aGUgbWF4aW11bSBUWCBwb3dlciBUaGUgYWN0dWFsIFRYIHBvd2VyIGlzIHRoZSBsZXNzZXIgb2YKKwkgKiB0aGlzIHZhbHVlIGFuZCAxMWQuIElmIDExZCBpcyBkaXNhYmxlLCB0aGUgbGVzc2VyIG9mIHRoaXMgYW5kCisJICogZGVmYXVsdCBzZXR0aW5nLgorCSAqLworCXVpbnQ4X3QgblR4UG93ZXJDYXA7CisJLyogc3RhdHMgcmVxdWVzdCBmcmVxdWVuY3kgZnJvbSBQRSB3aGlsZSBpbiBmdWxsIHBvd2VyICovCisJdWludDMyX3Qgc3RhdHNSZXFQZXJpb2RpY2l0eTsKKwkvKiBzdGF0cyByZXF1ZXN0IGZyZXF1ZW5jeSBmcm9tIFBFIHdoaWxlIGluIHBvd2VyIHNhdmUgKi8KKwl1aW50MzJfdCBzdGF0c1JlcVBlcmlvZGljaXR5SW5QUzsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCXRDc3IxMXJDb25maWdQYXJhbXMgY3NyMTFyQ29uZmlnOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXVpbnQ4X3QgaXNFc2VJbmlGZWF0dXJlRW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwl1aW50OF90IGlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZDsKKwl1aW50OF90IE1BV0NFbmFibGVkOworI2VuZGlmCisjaWYgIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgXAorCWRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwl1aW50OF90IGlzRmFzdFRyYW5zaXRpb25FbmFibGVkOworCXVpbnQ4X3QgUm9hbVJzc2lEaWZmOworCWJvb2wgaXNXRVNNb2RlRW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisJdENzck5laWdoYm9yUm9hbUNvbmZpZ1BhcmFtcyBuZWlnaGJvclJvYW1Db25maWc7CisjZW5kaWYKKwkvKgorCSAqIEluc3RlYWQgb2YgUmVhc3NvYywgc2VuZCBBRERUUy9ERUxUUyBldmVuIHdoZW4gQUNNIGlzIG9mZiBmb3IgdGhhdCBBQworCSAqIFRoaXMgaXMgbWFuZGF0ZWQgYnkgV01NLUFDIGNlcnRpZmljYXRpb24KKwkgKi8KKwlib29sIGFkZFRTV2hlbkFDTUlzT2ZmOworCS8qCisJICogY2hhbm5lbFBvd2VySW5mb0xpc3QyNCBoYXMgYmVlbiBzZWVuIGNvcnJ1cHRlZC4gU2V0IHRoaXMgZmxhZyB0byB0cnVlCisJICogdHJ5aW5nIHRvIGRldGVjdCB3aGVuIGl0IGhhcHBlbnMuIEFkZGluZyB0aGlzIGludG8gY29kZSBiZWNhdXNlIHdlCisJICogY2FuJ3QgcmVwcm9kdWNlIGl0IGVhc2lseS4gV2UgZG9uJ3Qga25vdyB3aGVuIGl0IGhhcHBlbnMuCisJICovCisJYm9vbCBmVmFsaWRhdGVMaXN0OworCS8qCisJICogQ3VzdG9tZXIgd2FudHMgdG8gc3RhcnQgd2l0aCBhbiBhY3RpdmUgc2NhbiBiYXNlZCBvbiB0aGUgZGVmYXVsdAorCSAqIGNvdW50cnkgY29kZS4gVGhpcyBvcHRpbWl6YXRpb24gd2lsbCBtaW5pbWl6ZSB0aGUgZHJpdmVyIGxvYWQgdG8KKwkgKiBhc3NvY2lhdGlvbiB0aW1lLiBCYXNlZCBvbiB0aGlzIGZsYWcgd2Ugd2lsbCBieXBhc3MgdGhlIGluaXRpYWwKKwkgKiBwYXNzaXZlIHNjYW4gbmVlZGVkIGZvciAxMWQgdG8gZGV0ZXJtaW5lIHRoZSBjb3VudHJ5IGNvZGUgJiBkb21haW4KKwkgKi8KKwlib29sIGZFbmFibGVCeXBhc3MxMWQ7CisJLyoKKwkgKiBDdXN0b21lciB3YW50cyB0byBvcHRpbWl6ZSB0aGUgc2NhbiB0aW1lLiBBdm9pZGluZyBzY2FucyhwYXNzaXZlKQorCSAqIG9uIERGUyBjaGFubmVscyB3aGlsZSBzd2lwcGluZyB0aHJvdWdoIGJvdGggYmFuZHMgY2FuIHNhdmUgc29tZSB0aW1lCisJICogKGFwcHJ4IDEuMyBzZWMpCisJICovCisJdWludDhfdCBmRW5hYmxlREZTQ2hubFNjYW47CisJLyoKKwkgKiBUbyBlbmFibGUvZGlzYWJsZSBzY2FubmluZyAyLjRHaHogY2hhbm5lbHMgdHdpY2Ugb24gYSBzaW5nbGUgc2NhbgorCSAqIHJlcXVlc3QgZnJvbSBIREQKKwkgKi8KKwlib29sIGZTY2FuVHdpY2U7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwl1aW50MzJfdCBuVmh0Q2hhbm5lbFdpZHRoOworCXVpbnQ4X3QgZW5hYmxlVHhCRjsKKwl1aW50OF90IHR4QkZDc25WYWx1ZTsKKwl1aW50OF90IGVuYWJsZTJ4MjsKKwlib29sIGVuYWJsZVZodEZvcjI0R0h6OworCXVpbnQ4X3QgZW5hYmxlTXVCZm9ybWVlOworCXVpbnQ4X3QgZW5hYmxlVmh0cEFpZDsKKwl1aW50OF90IGVuYWJsZVZodEdpZDsKKyNlbmRpZgorCXVpbnQ4X3QgZW5hYmxlQW1wZHVQczsKKwl1aW50OF90IGVuYWJsZUh0U21wczsKKwl1aW50OF90IGh0U21wczsKKwlib29sIGlnbm9yZV9wZWVyX2VycF9pbmZvOworCS8qCisJICogVG8gZW5hYmxlL2Rpc2FibGUgc2Nhbm5pbmcgb25seSAyLjRHaHogY2hhbm5lbHMgb24gZmlyc3Qgc2NhbgorCSAqLworCWJvb2wgZkZpcnN0U2Nhbk9ubHkyR0Nobmw7CisjaWYgIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgXAorCWRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwlib29sIG5Sb2FtUHJlZmVyNUdIejsKKwlib29sIG5Sb2FtSW50cmFCYW5kOworCXVpbnQ4X3QgblByb2JlczsKKwl1aW50MTZfdCBuUm9hbVNjYW5Ib21lQXdheVRpbWU7CisKKwlib29sIGlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZDsKKwlib29sIGJGYXN0Um9hbUluQ29uSW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKKwl1aW50OF90IHNjYW5DZmdBZ2luZ1RpbWU7CisJdWludDhfdCBlbmFibGVUeExkcGM7CisJdWludDhfdCBpc0Ftc2R1U3VwcG9ydEluQU1QRFU7CisJdWludDhfdCBuU2VsZWN0NUdIek1hcmdpbjsKKwl1aW50OF90IGlzQ29hbGVzaW5nSW5JQlNTQWxsb3dlZDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwl1aW50OF90IGNjX3N3aXRjaF9tb2RlOworI2VuZGlmCisJdWludDhfdCBhbGxvd0RGU0NoYW5uZWxSb2FtOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlib29sIGlzUm9hbU9mZmxvYWRFbmFibGVkOworI2VuZGlmCisJYm9vbCBvYnNzRW5hYmxlZDsKKwl1aW50OF90IGNvbmNfY3VzdG9tX3J1bGUxOworCXVpbnQ4X3QgY29uY19jdXN0b21fcnVsZTI7CisJdWludDhfdCBpc19zdGFfY29ubmVjdGlvbl9pbl81Z3pfZW5hYmxlZDsKKwlib29sIHNlbmREZWF1dGhCZWZvcmVDb247CisKKwkvKiA4MDIuMTFwIGVuYWJsZSAqLworCWJvb2wgZW5hYmxlX2RvdDExcDsKKwl1aW50OF90IG1heF9zY2FuX2NvdW50OworfSB0Q3NyQ29uZmlnUGFyYW07CisKKy8qIFR1c2ggKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0NzclVwZGF0ZUNvbmZpZ1BhcmFtIHsKKwl0Q3NyMTFkaW5mbyBDc3IxMWRpbmZvOworfSB0Q3NyVXBkYXRlQ29uZmlnUGFyYW07CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorI2RlZmluZSBjc3Jfcm9hbUlzUm9hbU9mZmxvYWRFbmFibGVkKHBNYWMpIFwKKwkocE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc1JvYW1PZmZsb2FkRW5hYmxlZCkKKyNkZWZpbmUgREVGQVVMVF9SRUFTU09DX0ZBSUxVUkVfVElNRU9VVCAxMDAwCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKy8qIGNvbm5lY3RlZCBidXQgbm90IGF1dGhlbnRpY2F0ZWQgKi8KKyNkZWZpbmUgQ1NSX1JPQU1fQVVUSF9TVEFUVVNfQ09OTkVDVEVEICAgICAgMHgxCisvKiBjb25uZWN0ZWQgYW5kIGF1dGhlbnRpY2F0ZWQgKi8KKyNkZWZpbmUgQ1NSX1JPQU1fQVVUSF9TVEFUVVNfQVVUSEVOVElDQVRFRCAgMHgyCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUm9hbUluZm8geworCXRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGU7CisJdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYzsKKwl1aW50MzJfdCBuQmVhY29uTGVuZ3RoOworCXVpbnQzMl90IG5Bc3NvY1JlcUxlbmd0aDsKKwl1aW50MzJfdCBuQXNzb2NSc3BMZW5ndGg7CisJdWludDMyX3QgbkZyYW1lTGVuZ3RoOworCXVpbnQ4X3QgZnJhbWVUeXBlOworCS8qCisJICogUG9pbnQgdG8gYSBidWZmZXIgY29udGFpbiB0aGUgYmVhY29uLCBhc3NvYyByZXEsIGFzc29jIHJzcCBmcmFtZSwKKwkgKiBpbiB0aGF0IG9yZGVyIHVzZXIgbmVlZHMgdG8gdXNlIG5CZWFjb25MZW5ndGgsIG5Bc3NvY1JlcUxlbmd0aCwKKwkgKiBuQXNzb2NSc3BMZW5ndGggdG8gZGVzaWNlIHdoZXJlIGVhY2ggZnJhbWUgc3RhcnRzIGFuZCBlbmRzLgorCSAqLworCXVpbnQ4X3QgKnBiRnJhbWVzOworCWJvb2wgZlJlYXNzb2NSZXE7ICAgICAgIC8qIHNldCB0byB0cnVlIGlmIGZvciByZS1hc3NvY2lhdGlvbiAqLworCWJvb2wgZlJlYXNzb2NSc3A7ICAgICAgIC8qIHNldCB0byB0cnVlIGlmIGZvciByZS1hc3NvY2lhdGlvbiAqLworCXN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzaWQ7CisJLyoKKwkgKiBPbmx5IHZhbGlkIGluIElCU1MuIHRoaXMgaXMgdGhlIHBlZXJzIE1BQyBhZGRyZXNzIGZvcgorCSAqIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19ORVdfUEVFUiBvciBQRUVSX0RFUEFSVEVECisJICovCisJc3RydWN0IGNkZl9tYWNfYWRkciBwZWVyTWFjOworCXRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlOworCS8qIHRoaXMnZCBiZSBvdXIgb3duIGRlZmluZWQgb3Igc2VudCBmcm9tIG90aGVyQlNTKHBlciA4MDIuMTFzcGVjKSAqLworCXVpbnQzMl90IHJlYXNvbkNvZGU7CisJdWludDhfdCBzdGFJZDsgICAgICAgICAvKiBQZWVyIHN0YXRpb25JZCB3aGVuIGNvbm5lY3RlZCAqLworCS8qCisJICogVGhlIERQVSBzaWduYXR1cmVzIHdpbGwgYmUgc2VudCBldmVudHVhbGx5IHRvIFRMIHRvIGhlbHAgaXQKKwkgKiBkZXRlcm1pbmUgdGhlIGFzc29jIHRvIHdoaWNoIGEgcGFja2V0IGJlbG9uZ3MgdG8gdW5pY2FzdCBEUFUgc2lnbgorCSAqLworCXVpbnQ4X3QgdWNhc3RTaWc7CisJdWludDhfdCBiY2FzdFNpZzsgICAgIC8qIEJyb2FkY2FzdCBEUFUgc2lnbmF0dXJlICovCisJLyogZmFsc2UgbWVhbnMgYXV0aCBuZWVkZWQgZnJvbSBzdXBwbGljYW50LiB0cnVlIG1lYW5zIGF1dGhlbnRpY2F0ZWQgKi8KKwlib29sIGZBdXRoUmVxdWlyZWQ7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDhfdCByc25JRUxlbjsKKwl1aW50OF90ICpwcnNuSUU7CisJdWludDhfdCB3YXBpSUVMZW47CisJdWludDhfdCAqcHdhcGlJRTsKKwl1aW50OF90IGFkZElFTGVuOworCXVpbnQ4X3QgKnBhZGRJRTsKKwl1bmlvbiB7CisJCXRTaXJNaWNGYWlsdXJlSW5mbyAqcE1JQ0ZhaWx1cmVJbmZvOworCQl0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBDb25uZWN0ZWRQcm9maWxlOworCQl0U2lyV1BTUEJDUHJvYmVSZXEgKnBXUFNQQkNQcm9iZVJlcTsKKwl9IHU7CisJYm9vbCB3bW1FbmFibGVkU3RhOyAgLyogc2V0IHRvIHRydWUgaWYgV01NIGVuYWJsZWQgU1RBICovCisJdWludDMyX3QgZHRpbVBlcmlvZDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJYm9vbCBpc0VTRUFzc29jOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECisJdFNpclRzbUlFIHRzbUllOworCXVpbnQzMl90IHRpbWVzdGFtcFsyXTsKKwl1aW50MTZfdCB0c21Sb2FtRGVsYXk7CisJdFNpckVzZUJjblJlcG9ydFJzcCAqcEVzZUJjblJlcG9ydFJzcDsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworI2VuZGlmCisJdm9pZCAqcFJlbWFpbkN0eDsKKwl1aW50MzJfdCByb2Nfc2Nhbl9pZDsKKwl1aW50MzJfdCByeENoYW47CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwl1aW50OF90IHN0YVR5cGU7CisJYm9vbCB0ZGxzX3Byb2hpYml0ZWQ7ICAgICAgICAgICAvKiBwZXIgRXh0Q2FwIGluIEFzc29jL1JlYXNzb2MgcmVzcCAqLworCWJvb2wgdGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZDsgLyogcGVyIEV4dENhcCBpbiBBc3NvYy9SZWFzc29jIHJlc3AgKi8KKyNlbmRpZgorCS8qIFJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZXMgdG8gdXBwZXIgbGF5ZXIgKi8KKwl1aW50MzJfdCBiZWFjb25MZW5ndGg7CisJdWludDhfdCAqYmVhY29uUHRyOworCXVpbnQzMl90IGFzc29jUmVxTGVuZ3RoOworCXVpbnQ4X3QgKmFzc29jUmVxUHRyOworCWludDhfdCByeFJzc2k7CisJdFNpclNtZURmc0V2ZW50SW5kIGRmc19ldmVudDsKKwl0U2lyQ2hhbkNoYW5nZVJlc3BvbnNlICpjaGFubmVsQ2hhbmdlUmVzcEV2ZW50OworCS8qIFRpbWluZyBhbmQgZmluZSBUaW1pbmcgbWVhc3VyZW1lbnQgY2FwYWJpbGl0eSBjbHViYmVkIHRvZ2V0aGVyICovCisJdWludDhfdCB0aW1pbmdNZWFzQ2FwOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwl1aW50OF90IHJvYW1TeW5jaEluUHJvZ3Jlc3M7CisJdWludDhfdCBzeW5jaEF1dGhTdGF0dXM7CisJdWludDhfdCBrY2tbU0lSX0tDS19LRVlfTEVOXTsKKwl1aW50OF90IGtla1tTSVJfS0VLX0tFWV9MRU5dOworCXVpbnQ4X3QgcmVwbGF5X2N0cltTSVJfUkVQTEFZX0NUUl9MRU5dOworI2VuZGlmCisJdFNpclNtZUNoYW5JbmZvIGNoYW5faW5mbzsKK30gdENzclJvYW1JbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JGcmVxU2NhbkluZm8geworCXVpbnQzMl90IG5TdGFydEZyZXE7ICAgIC8qIGluIHVuaXQgb2YgTUh6ICovCisJdWludDMyX3QgbkVuZEZyZXE7ICAgICAgLyogaW4gdW5pdCBvZiBNSHogKi8KKwl0U2lyU2NhblR5cGUgc2NhblR5cGU7Cit9IHRDc3JGcmVxU2NhbkluZm87CisKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVBc3NvY0luZFRvVXBwZXJMYXllckNuZiB7CisJdWludDE2X3QgbWVzc2FnZVR5cGU7ICAgLyogZVdOSV9TTUVfQVNTT0NfQ05GICovCisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlOworCXRTaXJNYWNBZGRyIGJzc0lkOyAgICAgIC8qIFNlbGYgQlNTSUQgKi8KKwl0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKwl1aW50MTZfdCBhaWQ7CisJdFNpck1hY0FkZHIgYWx0ZXJuYXRlQnNzSWQ7CisJdWludDhfdCBhbHRlcm5hdGVDaGFubmVsSWQ7CisJdWludDhfdCB3bW1FbmFibGVkU3RhOyAgLyogc2V0IHRvIHRydWUgaWYgV01NIGVuYWJsZWQgU1RBICovCisJdFNpclJTTmllIHJzbklFOyAgICAgICAgLyogUlNOIElFIHJlY2VpdmVkIGZyb20gcGVlciAqLworCXRTaXJXQVBJaWUgd2FwaUlFOyAgICAgIC8qIFdBUEkgSUUgcmVjZWl2ZWQgZnJvbSBwZWVyICovCisJdFNpckFkZGllIGFkZElFOyAgICAgICAgLyogdGhpcyBjYW4gYmUgV1NDIGFuZC9vciBQMlAgSUUgKi8KKwl1aW50OF90IHJlYXNzb2NSZXE7ICAgICAvKiBzZXQgdG8gdHJ1ZSBpZiByZWFzc29jICovCisJLyogVGltaW5nIGFuZCBmaW5lIFRpbWluZyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5IGNsdWJiZWQgdG9nZXRoZXIgKi8KKwl1aW50OF90IHRpbWluZ01lYXNDYXA7CisJdFNpclNtZUNoYW5JbmZvIGNoYW5faW5mbzsKK30gdFNpclNtZUFzc29jSW5kVG9VcHBlckxheWVyQ25mLCAqdHBTaXJTbWVBc3NvY0luZFRvVXBwZXJMYXllckNuZjsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU3VtbWFyeVN0YXRzSW5mbyB7CisJdWludDMyX3QgcmV0cnlfY250WzRdOworCXVpbnQzMl90IG11bHRpcGxlX3JldHJ5X2NudFs0XTsKKwl1aW50MzJfdCB0eF9mcm1fY250WzRdOworCS8qIHVpbnQzMl90IG51bV9yeF9mcm1fY3JjX2Vycjsgc2FtZSBhcyByeF9lcnJvcl9jbnQgKi8KKwkvKiB1aW50MzJfdCBudW1fcnhfZnJtX2NyY19vazsgc2FtZSBhcyByeF9mcm1fY250ICovCisJdWludDMyX3QgcnhfZnJtX2NudDsKKwl1aW50MzJfdCBmcm1fZHVwX2NudDsKKwl1aW50MzJfdCBmYWlsX2NudFs0XTsKKwl1aW50MzJfdCBydHNfZmFpbF9jbnQ7CisJdWludDMyX3QgYWNrX2ZhaWxfY250OworCXVpbnQzMl90IHJ0c19zdWNjX2NudDsKKwl1aW50MzJfdCByeF9kaXNjYXJkX2NudDsKKwl1aW50MzJfdCByeF9lcnJvcl9jbnQ7CisJdWludDMyX3QgdHhfYnl0ZV9jbnQ7CisKK30gdENzclN1bW1hcnlTdGF0c0luZm87CisKK3R5cGVkZWYgc3RydWN0IHRhZ0Nzckdsb2JhbENsYXNzQVN0YXRzSW5mbyB7CisJdWludDMyX3QgcnhfZnJhZ19jbnQ7CisJdWludDMyX3QgcHJvbWlzY3VvdXNfcnhfZnJhZ19jbnQ7CisJLyogdWludDMyX3QgcnhfZmNzX2VycjsgKi8KKwl1aW50MzJfdCByeF9pbnB1dF9zZW5zaXRpdml0eTsKKwl1aW50MzJfdCBtYXhfcHdyOworCS8qIHVpbnQzMl90IGRlZmF1bHRfcHdyOyAqLworCXVpbnQzMl90IHN5bmNfZmFpbF9jbnQ7CisJdWludDMyX3QgdHhfcmF0ZTsKKwkvKiBtY3MgaW5kZXggZm9yIEhUMjAgYW5kIEhUNDAgcmF0ZXMgKi8KKwl1aW50MzJfdCBtY3NfaW5kZXg7CisJLyogdG8gZGlmZiBiZXR3ZWVuIEhUMjAgJiBIVDQwIHJhdGVzO3Nob3J0ICYgbG9uZyBndWFyZCBpbnRlcnZhbCAqLworCXVpbnQzMl90IHR4X3JhdGVfZmxhZ3M7CisKK30gdENzckdsb2JhbENsYXNzQVN0YXRzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyR2xvYmFsQ2xhc3NCU3RhdHNJbmZvIHsKKwl1aW50MzJfdCB1Y19yeF93ZXBfdW5lbmNyeXB0ZWRfZnJtX2NudDsKKwl1aW50MzJfdCB1Y19yeF9taWNfZmFpbF9jbnQ7CisJdWludDMyX3QgdWNfdGtpcF9pY3ZfZXJyOworCXVpbnQzMl90IHVjX2Flc19jY21wX2Zvcm1hdF9lcnI7CisJdWludDMyX3QgdWNfYWVzX2NjbXBfcmVwbGF5X2NudDsKKwl1aW50MzJfdCB1Y19hZXNfY2NtcF9kZWNycHRfZXJyOworCXVpbnQzMl90IHVjX3dlcF91bmRlY3J5cHRhYmxlX2NudDsKKwl1aW50MzJfdCB1Y193ZXBfaWN2X2VycjsKKwl1aW50MzJfdCB1Y19yeF9kZWNyeXB0X3N1Y2NfY250OworCXVpbnQzMl90IHVjX3J4X2RlY3J5cHRfZmFpbF9jbnQ7CisJdWludDMyX3QgbWNiY19yeF93ZXBfdW5lbmNyeXB0ZWRfZnJtX2NudDsKKwl1aW50MzJfdCBtY2JjX3J4X21pY19mYWlsX2NudDsKKwl1aW50MzJfdCBtY2JjX3RraXBfaWN2X2VycjsKKwl1aW50MzJfdCBtY2JjX2Flc19jY21wX2Zvcm1hdF9lcnI7CisJdWludDMyX3QgbWNiY19hZXNfY2NtcF9yZXBsYXlfY250OworCXVpbnQzMl90IG1jYmNfYWVzX2NjbXBfZGVjcnB0X2VycjsKKwl1aW50MzJfdCBtY2JjX3dlcF91bmRlY3J5cHRhYmxlX2NudDsKKwl1aW50MzJfdCBtY2JjX3dlcF9pY3ZfZXJyOworCXVpbnQzMl90IG1jYmNfcnhfZGVjcnlwdF9zdWNjX2NudDsKKwl1aW50MzJfdCBtY2JjX3J4X2RlY3J5cHRfZmFpbF9jbnQ7CisKK30gdENzckdsb2JhbENsYXNzQlN0YXRzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyR2xvYmFsQ2xhc3NDU3RhdHNJbmZvIHsKKwl1aW50MzJfdCByeF9hbXNkdV9jbnQ7CisJdWludDMyX3QgcnhfYW1wZHVfY250OworCXVpbnQzMl90IHR4XzIwX2ZybV9jbnQ7CisJdWludDMyX3QgcnhfMjBfZnJtX2NudDsKKwl1aW50MzJfdCByeF9tcGR1X2luX2FtcGR1X2NudDsKKwl1aW50MzJfdCBhbXBkdV9kZWxpbWl0ZXJfY3JjX2VycjsKKworfSB0Q3NyR2xvYmFsQ2xhc3NDU3RhdHNJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JHbG9iYWxDbGFzc0RTdGF0c0luZm8geworCXVpbnQzMl90IHR4X3VjX2ZybV9jbnQ7CisJdWludDMyX3QgdHhfbWNfZnJtX2NudDsKKwl1aW50MzJfdCB0eF9iY19mcm1fY250OworCXVpbnQzMl90IHJ4X3VjX2ZybV9jbnQ7CisJdWludDMyX3QgcnhfbWNfZnJtX2NudDsKKwl1aW50MzJfdCByeF9iY19mcm1fY250OworCXVpbnQzMl90IHR4X3VjX2J5dGVfY250WzRdOworCXVpbnQzMl90IHR4X21jX2J5dGVfY250OworCXVpbnQzMl90IHR4X2JjX2J5dGVfY250OworCXVpbnQzMl90IHJ4X3VjX2J5dGVfY250WzRdOworCXVpbnQzMl90IHJ4X21jX2J5dGVfY250OworCXVpbnQzMl90IHJ4X2JjX2J5dGVfY250OworCXVpbnQzMl90IHJ4X2J5dGVfY250OworCXVpbnQzMl90IG51bV9yeF9ieXRlc19jcmNfb2s7CisJdWludDMyX3QgcnhfcmF0ZTsKKworfSB0Q3NyR2xvYmFsQ2xhc3NEU3RhdHNJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JQZXJTdGFTdGF0c0luZm8geworCXVpbnQzMl90IHR4X2ZyYWdfY250WzRdOworCXVpbnQzMl90IHR4X2FtcGR1X2NudDsKKwl1aW50MzJfdCB0eF9tcGR1X2luX2FtcGR1X2NudDsKK30gdENzclBlclN0YVN0YXRzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUm9hbVNldEtleSB7CisJZUNzckVuY3J5cHRpb25UeXBlIGVuY1R5cGU7CisJdEFuaUtleURpcmVjdGlvbiBrZXlEaXJlY3Rpb247ICAvKiBUeCwgUnggb3IgVHgtYW5kLVJ4ICovCisJc3RydWN0IGNkZl9tYWNfYWRkciBwZWVyTWFjOyAgICAvKiBQZWVyIE1BQy4gQUxMIDEncyBmb3IgZ3JvdXAga2V5ICovCisJdWludDhfdCBwYWVSb2xlOyAgICAgICAgLyogMCBmb3Igc3VwcGxpY2FudCAqLworCXVpbnQ4X3Qga2V5SWQ7ICAgICAgICAgIC8qIEtleSBpbmRleCAqLworCXVpbnQxNl90IGtleUxlbmd0aDsgICAgIC8qIE51bWJlciBvZiBieXRlcyBjb250YWluaW5nIHRoZSBrZXkgaW4gcEtleSAqLworCXVpbnQ4X3QgS2V5W0NTUl9NQVhfS0VZX0xFTl07CisJdWludDhfdCBrZXlSc2NbQ1NSX01BWF9SU0NfTEVOXTsKK30gdENzclJvYW1TZXRLZXk7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzclJvYW1SZW1vdmVLZXkgeworCWVDc3JFbmNyeXB0aW9uVHlwZSBlbmNUeXBlOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgcGVlck1hYzsgLyogUGVlciBNQUMuIEFMTCAxJ3MgZm9yIGdyb3VwIGtleSAqLworCXVpbnQ4X3Qga2V5SWQ7ICAgICAgICAgIC8qIGtleSBpbmRleCAqLworfSB0Q3NyUm9hbVJlbW92ZUtleTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzckxpbmtFc3RhYmxpc2hQYXJhbXMgeworCXRTaXJNYWNBZGRyIHBlZXJNYWM7CisJdWludDhfdCB1YXBzZFF1ZXVlczsKKwl1aW50OF90IG1heFNwOworCXVpbnQ4X3QgaXNCdWZTdGE7CisJdWludDhfdCBpc09mZkNoYW5uZWxTdXBwb3J0ZWQ7CisJdWludDhfdCBpc1Jlc3BvbmRlcjsKKwl1aW50OF90IHN1cHBvcnRlZENoYW5uZWxzTGVuOworCXVpbnQ4X3Qgc3VwcG9ydGVkQ2hhbm5lbHNbU0lSX01BQ19NQVhfU1VQUF9DSEFOTkVMU107CisJdWludDhfdCBzdXBwb3J0ZWRPcGVyQ2xhc3Nlc0xlbjsKKwl1aW50OF90IHN1cHBvcnRlZE9wZXJDbGFzc2VzW1NJUl9NQUNfTUFYX1NVUFBfT1BFUl9DTEFTU0VTXTsKK30gdENzclRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JUZGxzU2VuZE1nbXQgeworCXRTaXJNYWNBZGRyIHBlZXJNYWM7CisJdWludDhfdCBmcmFtZVR5cGU7CisJdWludDhfdCBkaWFsb2c7CisJdWludDE2X3Qgc3RhdHVzQ29kZTsKKwl1aW50OF90IHJlc3BvbmRlcjsKKwl1aW50MzJfdCBwZWVyQ2FwYWJpbGl0eTsKKwl1aW50OF90ICpidWY7CisJdWludDhfdCBsZW47CisKK30gdENzclRkbHNTZW5kTWdtdDsKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKnRTY2FuUmVzdWx0SGFuZGxlOworCit0eXBlZGVmIGVudW0geworCVJFQVNTT0MgPSAwLAorCUZBU1RSRUFTU09DID0gMQorfSBoYW5kb2ZmX3NyYzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NySGFuZG9mZlJlcXVlc3QgeworCXN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzaWQ7CisJdWludDhfdCBjaGFubmVsOworCXVpbnQ4X3Qgc3JjOyAgIC8qIFRvIGNoZWNrIGlmIGl0cyBhIFJFQVNTT0Mgb3IgYSBGQVNUUkVBU1NPQyBJT0NUTCAqLworfSB0Q3NySGFuZG9mZlJlcXVlc3Q7CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JFc2VCZWFjb25SZXFQYXJhbXMgeworCXVpbnQxNl90IG1lYXN1cmVtZW50VG9rZW47CisJdWludDhfdCBjaGFubmVsOworCXVpbnQ4X3Qgc2Nhbk1vZGU7CisJdWludDE2X3QgbWVhc3VyZW1lbnREdXJhdGlvbjsKK30gdENzckVzZUJlYWNvblJlcVBhcmFtcywgKnRwQ3NyRXNlQmVhY29uUmVxUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JFc2VCZWFjb25SZXEgeworCXVpbnQ4X3QgbnVtQmNuUmVxSWU7CisJdENzckVzZUJlYWNvblJlcVBhcmFtcyBiY25SZXFbU0lSX0VTRV9NQVhfTUVBU19JRV9SRVFTXTsKK30gdENzckVzZUJlYWNvblJlcSwgKnRwQ3NyRXNlQmVhY29uUmVxOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKworc3RydWN0IHRhZ0NzckRlbFN0YVBhcmFtcyB7CisJc3RydWN0IGNkZl9tYWNfYWRkciBwZWVyTWFjQWRkcjsKKwl1aW50MTZfdCByZWFzb25fY29kZTsKKwl1aW50OF90IHN1YnR5cGU7Cit9OworCisvKgorICogTk9URTogcDIgaXMgdGhlIHNlY29uZCBjb250ZXh0IHBhc3MgaW4gZm9yIHRoZSBjYWxsZXIKKyAqIE5PVEU6IHdoYXQgaWYgY2FsbGJhY2sgaXMgY2FsbGVkIGJlZm9yZSByZXF1ZXN0ZXIgZ2V0cyB0aGUgc2NhbklkPz8KKyAqLwordHlwZWRlZiBDREZfU1RBVFVTICgqY3NyX3NjYW5fY29tcGxldGVDYWxsYmFjaykodEhhbEhhbmRsZSwgdm9pZCAqcDIsCisJCQkJCQl1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJCXVpbnQzMl90IHNjYW5JRCwKKwkJCQkJCWVDc3JTY2FuU3RhdHVzIHN0YXR1cyk7Cit0eXBlZGVmIENERl9TVEFUVVMgKCpjc3Jfcm9hbV9jb21wbGV0ZUNhbGxiYWNrKSh2b2lkICpwQ29udGV4dCwKKwkJCQkJCXRDc3JSb2FtSW5mbyAqIHBQYXJhbSwKKwkJCQkJCXVpbnQzMl90IHJvYW1JZCwKKwkJCQkJCWVSb2FtQ21kU3RhdHVzIHJvYW1TdGF0dXMsCisJCQkJCQllQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0KTsKK3R5cGVkZWYgQ0RGX1NUQVRVUyAoKmNzcl9yb2FtU2Vzc2lvbkNsb3NlQ2FsbGJhY2spKHZvaWQgKnBDb250ZXh0KTsKKworI2RlZmluZSBDU1JfSVNfU1RBUlRfSUJTUyhwUHJvZmlsZSkgKGVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUyA9PSBcCisJCQkJICAgICAocFByb2ZpbGUpLT5CU1NUeXBlKQorI2RlZmluZSBDU1JfSVNfSk9JTl9UT19JQlNTKHBQcm9maWxlKSAoZUNTUl9CU1NfVFlQRV9JQlNTID09IFwKKwkJCQkgICAgICAgKHBQcm9maWxlKS0+QlNTVHlwZSkKKyNkZWZpbmUgQ1NSX0lTX0lCU1MocFByb2ZpbGUpIChDU1JfSVNfU1RBUlRfSUJTUyhwUHJvZmlsZSkgfHwgXAorCQkJICAgICAgIENTUl9JU19KT0lOX1RPX0lCU1MocFByb2ZpbGUpKQorI2RlZmluZSBDU1JfSVNfSU5GUkFTVFJVQ1RVUkUocFByb2ZpbGUpIChlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFID09IFwKKwkJCQkJIChwUHJvZmlsZSktPkJTU1R5cGUpCisjZGVmaW5lIENTUl9JU19BTllfQlNTX1RZUEUocFByb2ZpbGUpIChlQ1NSX0JTU19UWVBFX0FOWSA9PSBcCisJCQkJICAgICAgIChwUHJvZmlsZSktPkJTU1R5cGUpCisjZGVmaW5lIENTUl9JU19XRFNfQVAocFByb2ZpbGUpICAgKGVDU1JfQlNTX1RZUEVfV0RTX0FQID09IChwUHJvZmlsZSktPkJTU1R5cGUpCisjZGVmaW5lIENTUl9JU19XRFNfU1RBKHBQcm9maWxlKSAgKGVDU1JfQlNTX1RZUEVfV0RTX1NUQSA9PSAocFByb2ZpbGUpLT5CU1NUeXBlKQorI2RlZmluZSBDU1JfSVNfV0RTKHBQcm9maWxlKSAgICAgIChDU1JfSVNfV0RTX0FQKHBQcm9maWxlKSB8fCBcCisJCQkJICAgQ1NSX0lTX1dEU19TVEEocFByb2ZpbGUpKQorI2RlZmluZSBDU1JfSVNfSU5GUkFfQVAocFByb2ZpbGUpIChlQ1NSX0JTU19UWVBFX0lORlJBX0FQID09ICBcCisJCQkJICAgKHBQcm9maWxlKS0+QlNTVHlwZSkKKyNkZWZpbmUgQ1NSX0lTX0NPTk5fSU5GUkFfQVAocFByb2ZpbGUpICAoZUNTUl9CU1NfVFlQRV9JTkZSQV9BUCA9PSBcCisJCQkJCSAocFByb2ZpbGUpLT5CU1NUeXBlKQorI2RlZmluZSBDU1JfSVNfQ09OTl9XRFNfQVAocFByb2ZpbGUpICAgIChlQ1NSX0JTU19UWVBFX1dEU19BUCA9PSBcCisJCQkJCSAocFByb2ZpbGUpLT5CU1NUeXBlKQorI2RlZmluZSBDU1JfSVNfQ09OTl9XRFNfU1RBKHBQcm9maWxlKSAgIChlQ1NSX0JTU19UWVBFX1dEU19TVEEgPT0gXAorCQkJCQkgKHBQcm9maWxlKS0+QlNTVHlwZSkKKyNkZWZpbmUgQ1NSX0lTX0NPTk5fV0RTKHBQcm9maWxlKQkoQ1NSX0lTX1dEU19BUChwUHJvZmlsZSkgfHwgXAorCQkJCQkgQ1NSX0lTX1dEU19TVEEocFByb2ZpbGUpKQorI2RlZmluZSBDU1JfSVNfQ0xPU0VfU0VTU0lPTl9DT01NQU5EKHBDb21tYW5kKSBcCisJKChwQ29tbWFuZCktPmNvbW1hbmQgPT0gZVNtZUNvbW1hbmREZWxTdGFTZXNzaW9uKQorCitDREZfU1RBVFVTIGNzcl9zZXRfY2hhbm5lbHModEhhbEhhbmRsZSBoSGFsLCB0Q3NyQ29uZmlnUGFyYW0gKnBQYXJhbSk7CisKK0NERl9TVEFUVVMgY3NyX3NldF9yZWdfaW5mbyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgKmFwQ250cnlDb2RlKTsKKworLyogZW51bSB0byBzdHJpbmcgY29udmVyc2lvbiBmb3IgZGVidWcgb3V0cHV0ICovCitjb25zdCBjaGFyICpnZXRfZV9yb2FtX2NtZF9zdGF0dXNfc3RyKGVSb2FtQ21kU3RhdHVzIHZhbCk7Citjb25zdCBjaGFyICpnZXRfZV9jc3Jfcm9hbV9yZXN1bHRfc3RyKGVDc3JSb2FtUmVzdWx0IHZhbCk7CitDREZfU1RBVFVTIGNzcl9zZXRfcGh5X21vZGUodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBwaHlNb2RlLCBlQ3NyQmFuZCBlQmFuZCwKKwkJCSAgICBib29sICpwZlJlc3RhcnROZWVkZWQpOwordHlwZWRlZiB2b2lkICgqY3NyX3JvYW1MaW5rUXVhbGl0eUluZENhbGxiYWNrKQorCShlQ3NyUm9hbUxpbmtRdWFsaXR5SW5kIGluZCwgdm9pZCAqcENvbnRleHQpOwordHlwZWRlZiB2b2lkICgqdENzclN0YXRzQ2FsbGJhY2spKHZvaWQgKnN0YXRzLCB2b2lkICpwQ29udGV4dCk7Cit0eXBlZGVmIHZvaWQgKCp0Q3NyUnNzaUNhbGxiYWNrKShpbnQ4X3QgcnNzaSwgdWludDMyX3Qgc3RhSWQsIHZvaWQgKnBDb250ZXh0KTsKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKK3R5cGVkZWYgdm9pZCAoKnRDc3JUc21TdGF0c0NhbGxiYWNrKSh0QW5pVHJhZlN0cm1NZXRyaWNzIHRzbU1ldHJpY3MsCisJCQkJICAgICB1aW50MzJfdCBzdGFJZCwgdm9pZCAqcENvbnRleHQpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KK3R5cGVkZWYgdm9pZCAoKnRDc3JTbnJDYWxsYmFjaykoaW50OF90IHNuciwgdWludDMyX3Qgc3RhSWQsIHZvaWQgKnBDb250ZXh0KTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCitDREZfU1RBVFVTIGNzcl9yb2FtX2lzc3VlX2Z0X3ByZWF1dGhfcmVxKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgdHBTaXJCc3NEZXNjcmlwdGlvbiBwQnNzRGVzY3JpcHRpb24pOworI2VuZGlmCitDREZfU1RBVFVTIGNzcl9zZXRfYmFuZCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLCBlQ3NyQmFuZCBlQmFuZCk7CitlQ3NyQmFuZCBjc3JfZ2V0X2N1cnJlbnRfYmFuZCh0SGFsSGFuZGxlIGhIYWwpOwordHlwZWRlZiB2b2lkICgqY3NyX3JlYWR5VG9TdXNwZW5kQ2FsbGJhY2spKHZvaWQgKnBDb250ZXh0LCBib29sIHN1c3BlbmRlZCk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCit0eXBlZGVmIHZvaWQgKCpjc3JfcmVhZHlUb0V4dFdvV0NhbGxiYWNrKSh2b2lkICpwQ29udGV4dCwgYm9vbCBzdGF0dXMpOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorQ0RGX1NUQVRVUyBjc3Jfcm9hbV9pc3N1ZV9mdF9yb2FtX29mZmxvYWRfc3luY2godEhhbEhhbmRsZSBoSGFsLAorCQl1aW50MzJfdCBzZXNzaW9uSWQsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyaXB0aW9uKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkICgqdENzckxpbmtTdGF0dXNDYWxsYmFjaykodWludDhfdCBzdGF0dXMsIHZvaWQgKnBDb250ZXh0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zbWUvaW5jL2Nzcl9pbnRlcm5hbC5oIGIvY29yZS9zbWUvaW5jL2Nzcl9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMmZjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvY3NyX2ludGVybmFsLmgKQEAgLTAsMCArMSwxNDAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqICAgXGZpbGUgY3NyX2ludGVybmFsLmgKKyAqCisgKiAgIERlZmluZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBmb3IgTUFDLgorICovCisjaWZuZGVmIENTUklOVEVSTkFMX0hfXworI2RlZmluZSBDU1JJTlRFUk5BTF9IX18KKworI2luY2x1ZGUgImNkZl9zdGF0dXMuaCIKKyNpbmNsdWRlICJjZGZfbG9jay5oIgorCisjaW5jbHVkZSAiY2RmX21jX3RpbWVyLmgiCisjaW5jbHVkZSAiY3NyX3N1cHBvcnQuaCIKKyNpbmNsdWRlICJjZHNfcmVnX3NlcnZpY2UuaCIKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisjaW5jbHVkZSAiY3NyX25laWdoYm9yX3JvYW0uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic2lyX3R5cGVzLmgiCisKKyNkZWZpbmUgQ1NSX01BWF9TVEEgKEhBTF9OVU1fU1RBKQorCisvKiBkZWZpbmUgc2NhbiByZXR1cm4gY3JpdGVyaWEuIExJTSBzaG91bGQgdXNlIHRoZXNlIGRlZmluZSBhcyB3ZWxsICovCisjZGVmaW5lIENTUl9TQ0FOX1JFVFVSTl9BRlRFUl9BTExfQ0hBTk5FTFMgICAgICAgICAgKDApCisjZGVmaW5lIENTUl9TQ0FOX1JFVFVSTl9BRlRFUl9GSVJTVF9NQVRDSCAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIENTUl9TQ0FOX1JFVFVSTl9BRlRFUl81X0JBTkRfMTFkX0ZPVU5EICAgICAgKDB4ODApCisjZGVmaW5lIENTUl9TQ0FOX1JFVFVSTl9BRlRFUl8yNF9CQU5EXzExZF9GT1VORCAgICAgKDB4NDApCisjZGVmaW5lIENTUl9TQ0FOX1JFVFVSTl9BRlRFUl9FSVRIRVJfQkFORF8xMWRfRk9VTkQgXAorCShDU1JfU0NBTl9SRVRVUk5fQUZURVJfNV9CQU5EXzExZF9GT1VORCB8IFwKKwkgQ1NSX1NDQU5fUkVUVVJOX0FGVEVSXzI0X0JBTkRfMTFkX0ZPVU5EKQorI2RlZmluZSBDU1JfTlVNX1JTU0lfQ0FUICAgICAgICAxNQorI2RlZmluZSBDU1JfUk9BTV9TQ0FOX0NIQU5ORUxfU1dJVENIX1RJTUUgICAgICAgIDMKKworLyogc2Vzc2lvbiBJRCBpbnZhbGlkICovCisjZGVmaW5lIENTUl9TRVNTSU9OX0lEX0lOVkFMSUQgICAgMHhGRgorLyogTm8gb2Ygc2Vzc2lvbnMgdG8gYmUgc3VwcG9ydGVkLCBhbmQgYSBzZXNzaW9uIGlzIGZvciBJbmZyYSwgSUJTUyBvciBCVC1BTVAgKi8KKyNkZWZpbmUgQ1NSX1JPQU1fU0VTU0lPTl9NQVggICAgICA1CisjZGVmaW5lIENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkgXAorCSgoKHNlc3Npb25JZCkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWCkgJiYgXAorCSAoKHBNYWMpLT5yb2FtLnJvYW1TZXNzaW9uWyhzZXNzaW9uSWQpXS5zZXNzaW9uQWN0aXZlKSkKKworI2RlZmluZSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKSBcCisJKCBcCisJICAoc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVgpID8gXAorCSAgKCYocE1hYyktPnJvYW0ucm9hbVNlc3Npb25bKHNlc3Npb25JZCldKSA6IE5VTEwgXAorCSkKKworI2RlZmluZSBDU1JfSVNfU0VTU0lPTl9BTlkoc2Vzc2lvbklkKSAoc2Vzc2lvbklkID09IFNNRV9TRVNTSU9OX0lEX0FOWSkKKyNkZWZpbmUgQ1NSX01BWF9OVU1fQ09VTlRSWV9DT0RFICAxMDAKKyNkZWZpbmUgQ1NSX0lTX1NFTEVDVF81R0haX01BUkdJTihwTWFjKSBcCisJKCBcCisJICAoKChwTWFjKS0+cm9hbS5jb25maWdQYXJhbS5uU2VsZWN0NUdIek1hcmdpbikgPyB0cnVlIDogZmFsc2UpIFwKKwkpCisjZGVmaW5lIENTUl9JU19TRUxFQ1RfNUdfUFJFRkVSUkVEKHBNYWMpIFwKKwkoIFwKKwkgICgoKHBNYWMpLT5yb2FtLmNvbmZpZ1BhcmFtLnJvYW1fcGFyYW1zLmlzXzVnX3ByZWZfZW5hYmxlZCkgPyBcCisJICAgdHJ1ZSA6IGZhbHNlKSBcCisJKQorI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgXAorCSBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisjZGVmaW5lIENTUl9JU19ST0FNX1BSRUZFUl81R0haKHBNYWMpCVwKKwkoIFwKKwkgICgoKHBNYWMpLT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtUHJlZmVyNUdIeikgPyB0cnVlIDogZmFsc2UpIFwKKwkpCisjZGVmaW5lIENTUl9JU19ST0FNX0lOVFJBX0JBTkRfRU5BQkxFRChwTWFjKSBcCisJKCBcCisJICAoKChwTWFjKS0+cm9hbS5jb25maWdQYXJhbS5uUm9hbUludHJhQmFuZCkgPyB0cnVlIDogZmFsc2UpIFwKKwkpCisjZW5kaWYKKyNkZWZpbmUgQ1NSX0lTX0ZBU1RST0FNX0lOX0NPTkNVUlJFTkNZX0lOSV9GRUFUVVJFX0VOQUJMRUQocE1hYykgXAorCSggXAorCSAgKCgocE1hYyktPnJvYW0uY29uZmlnUGFyYW0uYkZhc3RSb2FtSW5Db25JbmlGZWF0dXJlRW5hYmxlZCkgPyBcCisJCXRydWUgOiBmYWxzZSkgXAorCSkKKworLyogU3VwcG9ydCBmb3IgIkZhc3Qgcm9hbWluZyIgKGkuZS4sIEVTRSwgTEZSLCBvciA4MDIuMTFyLikgKi8KKyNkZWZpbmUgQ1NSX0JHX1NDQU5fT0NDVVBJRURfQ0hBTk5FTF9MSVNUX0xFTiAxNQorCisvKiBVc2VkIHRvIGRldGVybWluZSB3aGF0IHRvIHNldCB0byB0aGUgV05JX0NGR19ET1QxMV9NT0RFICovCit0eXBlZGVmIGVudW0geworCWVDU1JfQ0ZHX0RPVDExX01PREVfQUJHLAorCWVDU1JfQ0ZHX0RPVDExX01PREVfMTFBLAorCWVDU1JfQ0ZHX0RPVDExX01PREVfMTFCLAorCWVDU1JfQ0ZHX0RPVDExX01PREVfMTFHLAorCWVDU1JfQ0ZHX0RPVDExX01PREVfMTFOLAorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUFDLAorI2VuZGlmCisJZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUdfT05MWSwKKwllQ1NSX0NGR19ET1QxMV9NT0RFXzExTl9PTkxZLAorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUFDX09OTFksCisjZW5kaWYKKwkvKiBUaGlzIHZhbHVlIGNhbiBuZXZlciBzZXQgdG8gQ0ZHLiBJdHMgZm9yIENTUidzIGludGVybmFsIHVzZSAqLworCWVDU1JfQ0ZHX0RPVDExX01PREVfQVVUTywKK30gZUNzckNmZ0RvdDExTW9kZTsKKwordHlwZWRlZiBlbnVtIGV0Q3NyUm9hbUNvbW1hbmRzIHsKKwllQ3NyUm9hbU5vQ29tbWFuZCwKKwllQ3NyUm9hbUNvbW1hbmRTY2FuLAorCWVDc3JSb2FtQ29tbWFuZFJvYW0sCisJZUNzclJvYW1Db21tYW5kV21TdGF0dXNDaGFuZ2UsCisJZUNzclJvYW1Db21tYW5kU2V0S2V5LAorCWVDc3JSb2FtQ29tbWFuZFJlbW92ZUtleSwKKworfSBlQ3NyUm9hbUNvbW1hbmRzOworCit0eXBlZGVmIGVudW0geworCWVDc3JTY2FuT3RoZXIgPSAxLAorCWVDc3JTY2FuTG9zdExpbmsxLAorCWVDc3JTY2FuTG9zdExpbmsyLAorCWVDc3JTY2FuTG9zdExpbmszLAorCWVDc3JTY2FuTG9zdExpbms0LAorCWVDc3JTY2FuMTFkMSwgICAgICAgICAgIC8qIEZpcnN0IDExZCBzY2FuICovCisJZUNzclNjYW4xMWQyLCAgICAgICAgICAgLyogRmlyc3QgMTFkIHNjYW4gaGFzIGZhaWxlZCAqLworCWVDc3JTY2FuMTFkRG9uZSwgICAgICAgIC8qIDExZCBzY2FuIHN1Y2NlZWQsIHRyeSByZXN0IG9mIHRoZSBjaGFubmVscyAqLworCWVDc3JTY2FuVXNlclJlcXVlc3QsCisJZUNzclNjYW5Gb3JTc2lkLAorCWVDc3JTY2FuSWRsZVNjYW4sCisJZUNzclNjYW5Qcm9iZUJzcywgICAgICAgLyogZGlyZWN0IHByYiBvbiBlbnRyeSBmcm9tIGNhbmRpZGF0ZSBsaXN0LUhPICovCisJZUNzclNjYW5BYm9ydE5vcm1hbFNjYW4sLyogYWJvcnRpbmcgYSBub3JtYWwgc2NhbiAqLworCWVDc3JTY2FuUDJQRmluZFBlZXIsCisJZUNzclNjYW5DYW5kaWRhdGVGb3VuZCwKK30gZUNzclNjYW5SZWFzb247CisKK3R5cGVkZWYgZW51bSB7CisJLyogUm9hbWluZyBiZWNhdXNlIHdlJ3ZlIG5vdCBlc3RhYmxpc2hlZCB0aGUgaW5pdGlhbCBjb25uZWN0aW9uLiAqLworCWVDc3JOb0Nvbm5lY3Rpb24sCisJLyogcm9hbWluZyBiZWNhdXNlIExJTSByZXBvcnRlZCBhIGNhcCBjaGFuZ2UgaW4gdGhlIGFzc29jaWF0ZWQgQVAuICovCisJZUNzckNhcHNDaGFuZ2UsCisJLyogcm9hbWluZyBiZWNhdXNlIHNvbWVvbmUgYXNrZWQgdXMgdG8gRGlzYXNzb2MgJiBzdGF5IGRpc2Fzc29jaWF0ZWQuICovCisJZUNzckZvcmNlZERpc2Fzc29jLAorCS8qIHJvYW1pbmcgYmVjYXVzZSBhbiA4MDIuMTEgcmVxdWVzdCB3YXMgaXNzdWVkIHRvIHRoZSBkcml2ZXIuICovCisJZUNzckhkZElzc3VlZCwKKwkvKiByb2FtaW5nIGJlY2F1c2Ugd2UgbG9zdCBsaW5rIHRvIGFuIGFzc29jaWF0ZWQgQVAgKi8KKwllQ3NyTG9zdExpbmsxLAorCWVDc3JMb3N0TGluazIsCisJZUNzckxvc3RMaW5rMywKKwkvKiByb2FtaW5nIGJlY2F1c2Ugd2UgbmVlZCB0byBmb3JjZSBhIERpc2Fzc29jIGR1ZSB0byBNSUMgZmFpbHVyZSAqLworCWVDc3JGb3JjZWREaXNhc3NvY01JQ0ZhaWx1cmUsCisJZUNzckhkZElzc3VlZFJlYXNzb2NUb1NhbWVBUCwKKwllQ3NyU21lSXNzdWVkUmVhc3NvY1RvU2FtZUFQLAorCWVDc3JTbWVJc3N1ZWRSZWFzc29jVG9EaWZmQVAsCisJLyogcm9hbWluZyBiZWN1YXNlIHNvbWVvbmUgYXNrZWQgdXMgdG8gZGVhdXRoIGFuZCBzdGF5IGRpc2Fzc29jaWF0ZWQuICovCisJZUNzckZvcmNlZERlYXV0aCwKKwkvKiB3aWxsIGJlIGlzc3VlZCBieSBIYW5kb2ZmIGxvZ2ljIHRvIGRpc2NvbmVjdCBmcm9tIGN1cnJlbnQgQVAgKi8KKwllQ3NyU21lSXNzdWVkRGlzYXNzb2NGb3JIYW5kb2ZmLAorCS8qIHdpbGwgYmUgaXNzdWVkIGJ5IEhhbmRvZmYgbG9naWMgdG8gam9pbiBhIG5ldyBBUCB3aXRoIHNhbWUgcHJvZmlsZSAqLworCWVDc3JTbWVJc3N1ZWRBc3NvY1RvU2ltaWxhckFQLAorCS8qIGlic3Mgam9pbnRpbWVyIGZpcmVkIGJlZm9yZSBhbnkgcGVlciBzaG93ZWR1cCwgc28gc2h1dGRvd24gbmV0d29yayAqLworCWVDc3JTbWVJc3N1ZWRJYnNzSm9pbkZhaWx1cmUsCisJZUNzckZvcmNlZElic3NMZWF2ZSwKKwllQ3NyU3RvcEJzcywKKwllQ3NyU21lSXNzdWVkRlRSZWFzc29jLAorCWVDc3JGb3JjZWREaXNhc3NvY1N0YSwKKwllQ3NyRm9yY2VkRGVhdXRoU3RhLAorCWVDc3JQZXJmb3JtUHJlYXV0aCwKKwllQ3NyTG9zdExpbmsxQWJvcnQsCisJZUNzckxvc3RMaW5rMkFib3J0LAorCWVDc3JMb3N0TGluazNBYm9ydCwKK30gZUNzclJvYW1SZWFzb247CisKK3R5cGVkZWYgZW51bSB7CisJZUNTUl9ST0FNX1NVQlNUQVRFX05PTkUgPSAwLAorCWVDU1JfUk9BTV9TVUJTVEFURV9TVEFSVF9CU1NfUkVRLAorCWVDU1JfUk9BTV9TVUJTVEFURV9KT0lOX1JFUSwKKwllQ1NSX1JPQU1fU1VCU1RBVEVfUkVBU1NPQ19SRVEsCisJZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX1JFUSwKKwllQ1NSX1JPQU1fU1VCU1RBVEVfU1RPUF9CU1NfUkVRLAorCS8qIENvbnRpbnVlIHRoZSBjdXJyZW50IHJvYW0gY29tbWFuZCBhZnRlciBkaXNjb25uZWN0ICovCisJZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0NPTk5FQ1RfQ09OVElOVUVfUk9BTUlORywKKwllQ1NSX1JPQU1fU1VCU1RBVEVfQVVUSF9SRVEsCisJZUNTUl9ST0FNX1NVQlNUQVRFX0NPTkZJRywKKwllQ1NSX1JPQU1fU1VCU1RBVEVfREVBVVRIX1JFUSwKKwllQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfTk9USElOR19UT19KT0lOLAorCWVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRUFTU09DX0ZBSUxVUkUsCisJZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0ZPUkNFRCwKKwllQ1NSX1JPQU1fU1VCU1RBVEVfV0FJVF9GT1JfS0VZLAorCWVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19IQU5ET0ZGLAorCWVDU1JfUk9BTV9TVUJTVEFURV9KT0lORURfTk9fVFJBRkZJQywKKwllQ1NSX1JPQU1fU1VCU1RBVEVfSk9JTkVEX05PTl9SRUFMVElNRV9UUkFGRklDLAorCWVDU1JfUk9BTV9TVUJTVEFURV9KT0lORURfUkVBTFRJTUVfVFJBRkZJQywKKwllQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfU1RBX0hBU19MRUZULAorCS8qICBtYXggaXMgMTUgdW5sZXNzIHRoZSBiaXRmaWVsZCBpcyBleHBhbmRlZC4uLiAqLworfSBlQ3NyUm9hbVN1YlN0YXRlOworCit0eXBlZGVmIGVudW0geworCWVDU1JfUk9BTUlOR19TVEFURV9TVE9QID0gMCwKKwllQ1NSX1JPQU1JTkdfU1RBVEVfSURMRSwKKwllQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTklORywKKwllQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTkVELAorfSBlQ3NyUm9hbVN0YXRlOworCit0eXBlZGVmIGVudW0geworCWVDc3JDb250aW51ZVJvYW1pbmcsCisJZUNzclN0b3BSb2FtaW5nLAorCWVDc3JTdGFydElic3MsCisJZUNzclN0YXJ0SWJzc1NhbWVJYnNzLAorCWVDc3JSZWFzc29jVG9TZWxmTm9DYXBDaGFuZ2UsCisJZUNzclN0b3BSb2FtaW5nRHVlVG9Db25jdXJyZW5jeSwKKworfSBlQ3NySm9pblN0YXRlOworCit0eXBlZGVmIGVudW0geworCWVDc3JOb3RSb2FtaW5nLAorCWVDc3JMb3N0bGlua1JvYW1pbmdEaXNhc3NvYywKKwllQ3NyTG9zdGxpbmtSb2FtaW5nRGVhdXRoLAorCWVDc3JEeW5hbWljUm9hbWluZywKKwllQ3NyUmVhc3NvY1JvYW1pbmcsCit9IGVDc3JSb2FtaW5nUmVhc29uOworCit0eXBlZGVmIGVudW0geworCWVDc3JEaXNhc3NvY2lhdGVkLAorCWVDc3JEZWF1dGhlbnRpY2F0ZWQKK30gZUNzclJvYW1XbVN0YXR1c0NoYW5nZVR5cGVzOworCit0eXBlZGVmIGVudW0geworCWVDc3JTdW1tYXJ5U3RhdHMgPSAwLAorCWVDc3JHbG9iYWxDbGFzc0FTdGF0cywKKwllQ3NyR2xvYmFsQ2xhc3NCU3RhdHMsCisJZUNzckdsb2JhbENsYXNzQ1N0YXRzLAorCWVDc3JHbG9iYWxDbGFzc0RTdGF0cywKKwllQ3NyUGVyU3RhU3RhdHMsCisJZUNzck1heFN0YXRzCit9IGVDc3JSb2FtU3RhdHNDbGFzc1R5cGVzOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAordHlwZWRlZiBlbnVtIHsKKwllQ1NSX1dMQU5fU1RBVFVTX0NPTk5FQ1QgPSAwLAorCWVDU1JfV0xBTl9TVEFUVVNfRElTQ09OTkVDVAorfSBlQ3NyRGlhZ1dsYW5TdGF0dXNFdmVudFN1YnR5cGU7CisKK3R5cGVkZWYgZW51bSB7CisJZUNTUl9SRUFTT05fVU5TUEVDSUZJRUQgPSAwLAorCWVDU1JfUkVBU09OX1VTRVJfUkVRVUVTVEVELAorCWVDU1JfUkVBU09OX01JQ19FUlJPUiwKKwllQ1NSX1JFQVNPTl9ESVNBU1NPQywKKwllQ1NSX1JFQVNPTl9ERUFVVEgsCisJZUNTUl9SRUFTT05fSEFORE9GRiwKKworfSBlQ3NyRGlhZ1dsYW5TdGF0dXNFdmVudFJlYXNvbjsKKworLyoqCisgKiBlbnVtIGVDU1JfV0xBTl9ESUFHX0VWRU5UX1RZUEUgLSBlbnVtIGZvciBESUFHIGV2ZW50cworICogQGVDU1JfRVZFTlRfU0NBTl9DT01QTEVURSAtIHNjYW4gY29tcGxldGUKKyAqIEBlQ1NSX0VWRU5UX1NDQU5fUkVTX0ZPVU5EIC0gc2NhbiByZXN1bHQgZm91bmQKKyAqLwordHlwZWRlZiBlbnVtIHsKKwllQ1NSX0VWRU5UX1RZUEVfSU5WQUxJRCA9IDAsCisJZUNTUl9FVkVOVF9TQ0FOX0NPTVBMRVRFID0gNjQsCisJZUNTUl9FVkVOVF9TQ0FOX1JFU19GT1VORCA9IDY1LAorfSBlQ1NSX1dMQU5fRElBR19FVkVOVF9UWVBFOworCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JDaGFubmVsIHsKKwl1aW50OF90IG51bUNoYW5uZWxzOworCXVpbnQ4X3QgY2hhbm5lbExpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKK30gdENzckNoYW5uZWw7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1NjYW5Qcm9maWxlIHsKKwl1aW50MzJfdCBtaW5DaG5UaW1lOworCXVpbnQzMl90IG1heENoblRpbWU7CisJdWludDMyX3QgcmVzdFRpbWU7ICAgLyogVGhpcyBpcyBpZ25vcmVkIGlmIG5vdCBhc3NvY2lhdGVkICovCisJdWludDMyX3QgbnVtT2ZDaGFubmVsczsKKwl1aW50OF90ICpwQ2hhbm5lbExpc3Q7CisJdFNpclNjYW5UeXBlIHNjYW5UeXBlOworCWVDc3JSb2FtQnNzVHlwZSBic3NUeXBlOworCXVpbnQ4X3Qgc3NpZFtXTklfQ0ZHX1NTSURfTEVOXTsKKwl1aW50OF90IGJSZXR1cm5BZnRlcjFzdE1hdGNoOworCXVpbnQ4X3QgZlVuaXF1ZVJlc3VsdDsKKwl1aW50OF90IGZyZXNoU2NhbjsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkOworfSB0U2NhblByb2ZpbGU7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0Jzc0NvbmZpZ1BhcmFtIHsKKwllQ3NyTWVkaWFBY2Nlc3NUeXBlIHFvc1R5cGU7CisJdFNpck1hY1NTaWQgU1NJRDsKKwl1aW50MzJfdCB1UlRTVGhyZXNoOworCXVpbnQzMl90IHVEZWZlclRocmVzaDsKKwllQ3NyQ2ZnRG90MTFNb2RlIHVDZmdEb3QxMU1vZGU7CisJZUNzckJhbmQgZUJhbmQ7CisJdWludDhfdCBzdGFuZGFyZFJhdGVbQ1NSX0RPVDExX1NVUFBPUlRFRF9SQVRFU19NQVhdOworCXVpbnQ4X3QgZXh0ZW5kZWRSYXRlW0NTUl9ET1QxMV9FWFRFTkRFRF9TVVBQT1JURURfUkFURVNfTUFYXTsKKwllQ3NyRXhwb3NlZFR4UmF0ZSB0eFJhdGU7CisJdEFuaUF1dGhUeXBlIGF1dGhUeXBlOworCWVDc3JFbmNyeXB0aW9uVHlwZSBlbmNUeXBlOworCXVpbnQzMl90IHVTaG9ydFNsb3RUaW1lOworCXVpbnQzMl90IHVIVFN1cHBvcnQ7CisJdWludDMyX3QgdVBvd2VyTGltaXQ7CisJdWludDMyX3QgdUhlYXJ0QmVhdFRocmVzaDsKKwl1aW50MzJfdCB1Sm9pblRpbWVPdXQ7CisJdFNpck1hY0NhcGFiaWxpdHlJbmZvIEJzc0NhcDsKKwlib29sIGYxMWhTdXBwb3J0OworCWVQaHlDaGFuQm9uZFN0YXRlIGNiTW9kZTsKK30gdEJzc0NvbmZpZ1BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JSb2FtU3RhcnRCc3NQYXJhbXMgeworCXRTaXJNYWNTU2lkIHNzSWQ7CisKKwkvKgorCSAqIFRoaXMgaXMgdGhlIEJTU0lEIGZvciB0aGUgcGFydHkgd2Ugd2FudCB0bworCSAqIGpvaW4gKG9ubHkgdXNlIGZvciBJQlNTIG9yIFdEUykuCisJICovCisJc3RydWN0IGNkZl9tYWNfYWRkciBic3NpZDsKKwl0U2lyTndUeXBlIHNpck53VHlwZTsKKwllUGh5Q2hhbkJvbmRTdGF0ZSBjYk1vZGU7CisJdFNpck1hY1JhdGVTZXQgb3BlcmF0aW9uYWxSYXRlU2V0OworCXRTaXJNYWNSYXRlU2V0IGV4dGVuZGVkUmF0ZVNldDsKKwl1aW50OF90IG9wZXJhdGlvbkNobjsKKwljaGFuX3BhcmFtc190IGNoX3BhcmFtczsKKwllQ3NyQ2ZnRG90MTFNb2RlIHVDZmdEb3QxMU1vZGU7CisJdWludDhfdCBwcml2YWN5OworCWJvb2wgZndkV1BTUEJDUHJvYmVSZXE7CisJYm9vbCBwcm90RW5hYmxlZDsKKwlib29sIG9ic3NQcm90RW5hYmxlZDsKKwl0QW5pQXV0aFR5cGUgYXV0aFR5cGU7CisJdWludDE2X3QgYmVhY29uSW50ZXJ2YWw7IC8qIElmIHRoaXMgaXMgMCwgU01FJ2xsIGZpbGwgaW4gZm9yIGNhbGxlciAqLworCXVpbnQxNl90IGh0X3Byb3RlY3Rpb247CisJdWludDMyX3QgZHRpbVBlcmlvZDsKKwl1aW50OF90IEFwVWFwc2RFbmFibGU7CisJdWludDhfdCBzc2lkSGlkZGVuOworCXVpbnQ4X3Qgd3BzX3N0YXRlOworCXRDREZfQ09OX01PREUgYnNzUGVyc29uYTsKKwl1aW50MTZfdCBuUlNOSUVMZW5ndGg7ICAvKiBJZiAwLCBwUlNOSUUgaXMgaWdub3JlZC4gKi8KKwl1aW50OF90ICpwUlNOSUU7ICAgICAgICAvKiBJZiBub3QgbnVsbCwgaXQgaGFzIElFIGJ5dGUgc3RyZWFtIGZvciBSU04gKi8KKwkvKiBGbGFnIHVzZWQgdG8gaW5kaWNhdGUgdXBkYXRlIGJlYWNvbkludGVydmFsICovCisJYm9vbCB1cGRhdGViZWFjb25JbnRlcnZhbDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJYm9vbCBtZnBDYXBhYmxlOworCWJvb2wgbWZwUmVxdWlyZWQ7CisjZW5kaWYKKwl0U2lyQWRkSWVQYXJhbXMgYWRkSWVQYXJhbXM7CisJdWludDhfdCBzYXBfZG90MTFtYzsKK30gdENzclJvYW1TdGFydEJzc1BhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnU2NhbkNtZCB7CisJdWludDMyX3Qgc2NhbklEOworCWNzcl9zY2FuX2NvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2s7CisJdm9pZCAqcENvbnRleHQ7CisJZUNzclNjYW5SZWFzb24gcmVhc29uOworCWVDc3JSb2FtU3RhdGUgbGFzdFJvYW1TdGF0ZVtDU1JfUk9BTV9TRVNTSU9OX01BWF07CisJdENzclJvYW1Qcm9maWxlICpwVG9Sb2FtUHJvZmlsZTsKKwkvKiB0aGlzIGlzIHRoZSBJRCByZWxhdGVkIHRvIHRoZSBwVG9Sb2FtUHJvZmlsZSAqLworCXVpbnQzMl90IHJvYW1JZDsKKwl1bmlvbiB7CisJCXRDc3JTY2FuUmVxdWVzdCBzY2FuUmVxdWVzdDsKKwkJLyogdENzckJHU2NhblJlcXVlc3QgYmdTY2FuUmVxdWVzdCBpcyBubyBsb25nZXIgdXNlZCAqLworCX0gdTsKKwkvKiBUaGlzIGZsYWcgd2lsbCBiZSBzZXQgd2hpbGUgYWJvcnRpbmcgdGhlIHNjYW4gZHVlIHRvIGJhbmQgY2hhbmdlICovCisJYm9vbCBhYm9ydFNjYW5EdWVUb0JhbmRDaGFuZ2U7CisJY2RmX21jX3RpbWVyX3QgY3NyX3NjYW5fdGltZXI7Cit9IHRTY2FuQ21kOworCit0eXBlZGVmIHN0cnVjdCB0YWdSb2FtQ21kIHsKKwl1aW50MzJfdCByb2FtSWQ7CisJZUNzclJvYW1SZWFzb24gcm9hbVJlYXNvbjsKKwl0Q3NyUm9hbVByb2ZpbGUgcm9hbVByb2ZpbGU7CisJdFNjYW5SZXN1bHRIYW5kbGUgaEJTU0xpc3Q7ICAgICAgIC8qIEJTUyBsaXN0IGZpdHMgdGhlIHByb2ZpbGUgKi8KKwkvKgorCSAqIHBvaW50IHRvIHRoZSBjdXJyZW50IEJTUyBpbiB0aGUgbGlzdCB0aGF0IGlzIHJvYW1pbmcuCisJICogSXQgc3RhcnRzIGZyb20gaGVhZCB0byB0YWlsCisJICogKi8KKwl0TGlzdEVsZW0gKnBSb2FtQnNzRW50cnk7CisJdFNpckJzc0Rlc2NyaXB0aW9uICpwTGFzdFJvYW1Cc3M7IC8qIHRoZSBsYXN0IEJTUyB3ZSB0cnkgYW5kIGZhaWxlZCAqLworCWJvb2wgZlJlbGVhc2VCc3NMaXN0OyAgICAgICAgICAgICAvKiB3aGV0aGVyIHRvIGZyZWUgaEJTU0xpc3QgKi8KKwlib29sIGZSZWxlYXNlUHJvZmlsZTsgICAgICAgICAgICAgLyogd2hldGhlciB0byBmcmVlIHJvYW1Qcm9maWxlICovCisJYm9vbCBmUmVhc3NvYzsgICAgICAgICAgICAgICAgICAgIC8qIHdoZXRoZXIgdGhpcyBjbWQgaXMgZm9yIHJlYXNzb2MgKi8KKwkvKiB3aGV0aGVyIHBNYWMtPnJvYW0ucEN1clJvYW1Qcm9maWxlIG5lZWRzIHRvIGJlIHVwZGF0ZWQgKi8KKwlib29sIGZVcGRhdGVDdXJSb2FtUHJvZmlsZTsKKwkvKgorCSAqIHRoaXMgaXMgZm9yIENTUiBpbnRlcm5hbCB1c2VkIG9ubHkuIEFuZCBpdCBzaG91bGQgbm90IGJlIGFzc2lnbmVkCisJICogd2hlbiBjcmVhdGluZyB0aGUgY29tbWFuZC4gVGhpcyBjYXVzZXMgdGhlIHJvYW0gY21kIG5vdCB0b2RvIGFueXRoaW5nCisJICovCisJYm9vbCBmUmVhc3NvY1RvU2VsZk5vQ2FwQ2hhbmdlOworCisJYm9vbCBmU3RvcFdkczsKKwl0U2lyTWFjQWRkciBwZWVyTWFjOworCXRTaXJNYWNSZWFzb25Db2RlcyByZWFzb247Cit9IHRSb2FtQ21kOworCit0eXBlZGVmIHN0cnVjdCB0YWdTZXRLZXlDbWQgeworCXVpbnQzMl90IHJvYW1JZDsKKwllQ3NyRW5jcnlwdGlvblR5cGUgZW5jVHlwZTsKKwllQ3NyQXV0aFR5cGUgYXV0aFR5cGU7CisJdEFuaUtleURpcmVjdGlvbiBrZXlEaXJlY3Rpb247ICAvKiBUeCwgUnggb3IgVHgtYW5kLVJ4ICovCisJdFNpck1hY0FkZHIgcGVlck1hYzsgICAgLyogUGVlcidzIE1BQyBhZGRyZXNzLiBBTEwgMSdzIGZvciBncm91cCBrZXkgKi8KKwl1aW50OF90IHBhZVJvbGU7ICAgICAgICAvKiAwIGZvciBzdXBwbGljYW50ICovCisJdWludDhfdCBrZXlJZDsgICAgICAgICAgLyogS3llIGluZGV4ICovCisJdWludDhfdCBrZXlMZW5ndGg7ICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIGNvbnRhaW5pbmcgdGhlIGtleSBpbiBwS2V5ICovCisJdWludDhfdCBLZXlbQ1NSX01BWF9LRVlfTEVOXTsKKwl1aW50OF90IGtleVJzY1tDU1JfTUFYX1JTQ19MRU5dOworfSB0U2V0S2V5Q21kOworCit0eXBlZGVmIHN0cnVjdCB0YWdXbVN0YXR1c0NoYW5nZUNtZCB7CisJZUNzclJvYW1XbVN0YXR1c0NoYW5nZVR5cGVzIFR5cGU7CisJdW5pb24geworCQl0U2lyU21lRGVhdXRoSW5kIERlYXV0aEluZE1zZzsKKwkJdFNpclNtZURpc2Fzc29jSW5kIERpc2Fzc29jSW5kTXNnOworCX0gdTsKKworfSB0V21TdGF0dXNDaGFuZ2VDbWQ7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0FkZFN0YUZvclNlc3Npb25DbWQgeworCS8qIFNlc3Npb24gc2VsZiBtYWMgYWRkciAqLworCXRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyOworCXRDREZfQ09OX01PREUgY3VyckRldmljZU1vZGU7CisJdWludDMyX3QgdHlwZTsKKwl1aW50MzJfdCBzdWJUeXBlOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworfSB0QWRkU3RhRm9yU2Vzc2lvbkNtZDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRGVsU3RhRm9yU2Vzc2lvbkNtZCB7CisJLyogU2Vzc2lvbiBzZWxmIG1hYyBhZGRyICovCisJdFNpck1hY0FkZHIgc2VsZk1hY0FkZHI7CisJY3NyX3JvYW1TZXNzaW9uQ2xvc2VDYWxsYmFjayBjYWxsYmFjazsKKwl2b2lkICpwQ29udGV4dDsKK30gdERlbFN0YUZvclNlc3Npb25DbWQ7CisKKy8qIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgb25lIHNjYW4gcmVxdWVzdCAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ21kIHsKKwl0TGlzdEVsZW0gTGluazsKKwllQ3NyUm9hbUNvbW1hbmRzIGNvbW1hbmQ7CisJdWludDhfdCBzZXNzaW9uSWQ7ICAgICAgLyogU2Vzc2lvbiBJRCBmb3IgdGhpcyBjb21tYW5kICovCisJdW5pb24geworCQl0U2NhbkNtZCBzY2FuQ21kOworCQl0Um9hbUNtZCByb2FtQ21kOworCQl0V21TdGF0dXNDaGFuZ2VDbWQgd21TdGF0dXNDaGFuZ2VDbWQ7CisJCXRTZXRLZXlDbWQgc2V0S2V5Q21kOworCQl0QWRkU3RhRm9yU2Vzc2lvbkNtZCBhZGRTdGFTZXNzaW9uQ21kOworCQl0RGVsU3RhRm9yU2Vzc2lvbkNtZCBkZWxTdGFTZXNzaW9uQ21kOworCX0gdTsKK30gdENzckNtZDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCit0eXBlZGVmIHN0cnVjdCB0YWdDc3IxMXJDb25maWcgeworCWJvb2wgSXNGVFJlc291cmNlUmVxU3VwcG9ydGVkOworfSB0Q3NyMTFyQ29uZmlnOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyTmVpZ2hib3JSb2FtQ29uZmlnIHsKKwl1aW50MzJfdCBuTmVpZ2hib3JTY2FuVGltZXJQZXJpb2Q7CisJdWludDhfdCBuTmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkOworCXVpbnQxNl90IG5OZWlnaGJvclNjYW5NaW5DaGFuVGltZTsKKwl1aW50MTZfdCBuTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWU7CisJc0NzckNoYW5uZWwgbmVpZ2hib3JTY2FuQ2hhbkxpc3Q7CisJdWludDhfdCBuTWF4TmVpZ2hib3JSZXRyaWVzOworCXVpbnQxNl90IG5OZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kOworCXVpbnQxNl90IG5FbXB0eVNjYW5SZWZyZXNoUGVyaW9kOworCXVpbnQ4X3Qgbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmOworCXVpbnQ4X3QgblJvYW1SZXNjYW5Sc3NpRGlmZjsKKwl1aW50OF90IG5Sb2FtQm1pc3NGaXJzdEJjbnQ7CisJdWludDhfdCBuUm9hbUJtaXNzRmluYWxCY250OworCXVpbnQ4X3QgblJvYW1CZWFjb25Sc3NpV2VpZ2h0OworCXVpbnQ4X3QgZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcDsKKwl1aW50MzJfdCBuaGlfcnNzaV9zY2FuX21heF9jb3VudDsKKwl1aW50MzJfdCBuaGlfcnNzaV9zY2FuX3Jzc2lfZGVsdGE7CisJdWludDMyX3QgbmhpX3Jzc2lfc2Nhbl9kZWxheTsKKwlpbnQzMl90IG5oaV9yc3NpX3NjYW5fcnNzaV91YjsKK30gdENzck5laWdoYm9yUm9hbUNvbmZpZzsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JDb25maWcgeworCXVpbnQzMl90IGFnaW5nQ291bnQ7CisJdWludDMyX3QgRnJhZ21lbnRhdGlvblRocmVzaG9sZDsKKwl1aW50MzJfdCBjaGFubmVsQm9uZGluZ01vZGUyNEdIejsKKwl1aW50MzJfdCBjaGFubmVsQm9uZGluZ01vZGU1R0h6OworCXVpbnQzMl90IFJUU1RocmVzaG9sZDsKKwllQ3NyUGh5TW9kZSBwaHlNb2RlOworCWVDc3JDZmdEb3QxMU1vZGUgdUNmZ0RvdDExTW9kZTsKKwllQ3NyQmFuZCBlQmFuZDsKKwl1aW50MzJfdCBIZWFydGJlYXRUaHJlc2g1MDsKKwl1aW50MzJfdCBIZWFydGJlYXRUaHJlc2gyNDsKKwllQ3NyQ0JDaG9pY2UgY2JDaG9pY2U7CisJZUNzckJhbmQgYmFuZENhcGFiaWxpdHk7ICAgICAgICAvKiBpbmRpY2F0ZSBodyBjYXBhYmlsaXR5ICovCisJZUNzclJvYW1XbW1Vc2VyTW9kZVR5cGUgV01NU3VwcG9ydE1vZGU7CisJYm9vbCBJczExZVN1cHBvcnRFbmFibGVkOworCWJvb2wgSXMxMWRTdXBwb3J0RW5hYmxlZDsKKwlib29sIElzMTFkU3VwcG9ydEVuYWJsZWRPcmlnaW5hbDsKKwlib29sIElzMTFoU3VwcG9ydEVuYWJsZWQ7CisJYm9vbCBzaG9ydFNsb3RUaW1lOworCWJvb2wgUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQ7CisJYm9vbCBmZW5hYmxlTUNDTW9kZTsKKwlib29sIG1jY19ydHNfY3RzX3Byb3RfZW5hYmxlOworCWJvb2wgbWNjX2JjYXN0X3Byb2JfcmVzcF9lbmFibGU7CisJdWludDE2X3QgVHhSYXRlOworCXVpbnQ4X3QgZkFsbG93TUNDR09EaWZmQkk7CisJdWludDhfdCBBZEhvY0NoYW5uZWwyNDsKKwl1aW50OF90IEFkSG9jQ2hhbm5lbDVHOworCS8qIHNjYW4gcmVzIGFnaW5ndGltZSB0aHJlc2hvbGQgd2hlbiBOb3QtQ29ubmVjdC1Oby1Qb3dlci1TYXZlLGluIHNlYyAqLworCXVpbnQzMl90IHNjYW5BZ2VUaW1lTkNOUFM7CisJLyogc2NhbiByZXMgYWdpbmcgdGltZSB0aHJlc2hvbGQgd2hlbiBOb3QtQ29ubmVjdC1Qb3dlci1TYXZlLCBpbiBzZWMqLworCXVpbnQzMl90IHNjYW5BZ2VUaW1lTkNQUzsKKwkvKiBzY2FuIHJlcyBhZ2luZyB0aW1lIHRocmVzaG9sZCB3aGVuIENvbm5lY3QtTm8tUG93ZXItU2F2ZSwgaW4gc2VjKi8KKwl1aW50MzJfdCBzY2FuQWdlVGltZUNOUFM7CisJLyogc2NhbiByZXMgYWdpbmcgdGltZSB0aHJlc2hvbGQgd2hlbiBDb25uZWN0LVBvd2VyLVNhdmVpbiBzZWMgKi8KKwl1aW50MzJfdCBzY2FuQWdlVGltZUNQUzsKKwkvKiBlYWNoIFJTU0kgY2F0ZWdvcnkgaGFzIG9uZSB2YWx1ZSAqLworCXVpbnQzMl90IEJzc1ByZWZlclZhbHVlW0NTUl9OVU1fUlNTSV9DQVRdOworCWludCBSU1NJQ2F0W0NTUl9OVU1fUlNTSV9DQVRdOworCXVpbnQ4X3QgYkNhdFJzc2lPZmZzZXQ7IC8qIHRvIHNldCBSU1NJIGRpZmZlcmVuY2UgZm9yIGVhY2ggY2F0ZWdvcnkgKi8KKwkvKiBJbiBzZWNzLCBDU1InbGwgdHJ5IHRoaXMgbG9uZyBiZWZvcmUgZ2l2ZXMgdXAsIDAgbWVhbnMgbm8gcm9hbWluZyAqLworCXVpbnQzMl90IG5Sb2FtaW5nVGltZTsKKwkvKgorCSAqIFdoZXRoZXIgdG8gbGltaXQgdGhlIGNoYW5uZWxzIHRvIHRoZSBvbmVzIHNldCBpbiBDc3IxMWRJbmZvLgorCSAqIElmIHRydWUsIHRoZSBvcGVydGFpb25hbCBjaGFubmVscyBhcmUgbGltaXRlZCB0byB0aGUgZGVmYXVsdCBjaGFubmVsCisJICogbGlzdC4gSXQgaXMgYW4gIkFORCIgb3BlcmF0aW9uIGJldHdlZW4gdGhlIGRlZmF1bHQgY2hhbm5lbHMgYW5kCisJICogdGhlIGNoYW5uZWxzIGluIHRoZSA4MDIuMTFkIElFLgorCSAqLworCS8qIENvdW50cnkgQ29kZSBQcmlvcml0eSAqLworCWJvb2wgZlN1cHBsaWNhbnRDb3VudHJ5Q29kZUhhc1ByaW9yaXR5OworCisJdWludDE2X3QgdmNjUnNzaVRocmVzaG9sZDsKKwl1aW50MzJfdCB2Y2NVbE1hY0xvc3NUaHJlc2hvbGQ7CisKKwl1aW50MzJfdCBuUGFzc2l2ZU1pbkNoblRpbWU7ICAgIC8qIGluIHVuaXRzIG9mIG1pbGxpc2Vjb25kcyAqLworCXVpbnQzMl90IG5QYXNzaXZlTWF4Q2huVGltZTsgICAgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgbkFjdGl2ZU1pbkNoblRpbWU7ICAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBuQWN0aXZlTWF4Q2huVGltZTsgICAgIC8qIGluIHVuaXRzIG9mIG1pbGxpc2Vjb25kcyAqLworCisJdWludDMyX3QgbkluaXRpYWxEd2VsbFRpbWU7ICAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwlib29sIGluaXRpYWxfc2Nhbl9ub19kZnNfY2hubDsKKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorCXVpbnQzMl90IG5QYXNzaXZlTWluQ2huVGltZUNvbmM7LyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgblBhc3NpdmVNYXhDaG5UaW1lQ29uYzsvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBuQWN0aXZlTWluQ2huVGltZUNvbmM7IC8qIGluIHVuaXRzIG9mIG1pbGxpc2Vjb25kcyAqLworCXVpbnQzMl90IG5BY3RpdmVNYXhDaG5UaW1lQ29uYzsgLyogaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzICovCisJdWludDMyX3QgblJlc3RUaW1lQ29uYzsgICAgICAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwkvKiBudW1iZXIgb2YgY2hhbm5lbHMgY29tYmluZWQgZm9yIFN0YSBpbiBlYWNoIHNwbGl0IHNjYW4gb3BlcmF0aW9uICovCisJdWludDhfdCBuTnVtU3RhQ2hhbkNvbWJpbmVkQ29uYzsKKwkvKiBudW1iZXIgb2YgY2hhbm5lbHMgY29tYmluZWQgZm9yIFAyUCBpbiBlYWNoIHNwbGl0IHNjYW4gb3BlcmF0aW9uICovCisJdWludDhfdCBuTnVtUDJQQ2hhbkNvbWJpbmVkQ29uYzsKKyNlbmRpZgorCS8qCisJICogaW4gZEJtLCB0aGUgbWF4IFRYIHBvd2VyLiBUaGUgYWN0dWFsIFRYIHBvd2VyIGlzIHRoZSBsZXNzZXIgb2YgdGhpcworCSAqIHZhbHVlICYgMTFkLiBJZiAxMWQgaXMgZGlzYWJsZSwgdGhlIGxlc3NlciBvZiB0aGlzICYgZGVmYXVsdCBzZXR0aW5nLgorCSAqLworCXVpbnQ4X3QgblR4UG93ZXJDYXA7CisJdWludDMyX3Qgc3RhdHNSZXFQZXJpb2RpY2l0eTsgICAgLyogc3RhdHMgcmVxIGZyZXEgd2hpbGUgaW4gZnVsbHBvd2VyICovCisJdWludDMyX3Qgc3RhdHNSZXFQZXJpb2RpY2l0eUluUFM7Lyogc3RhdHMgcmVxIGZyZXEgd2hpbGUgaW4gcG93ZXJzYXZlICovCisJdWludDMyX3QgZHRpbVBlcmlvZDsKKwlib29sIHNzaWRIaWRkZW47CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwl0Q3NyMTFyQ29uZmlnIGNzcjExckNvbmZpZzsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwl1aW50OF90IGlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZDsKKwl1aW50OF90IE1BV0NFbmFibGVkOworCXVpbnQ4X3QgaXNSb2FtT2ZmbG9hZFNjYW5FbmFibGVkOworCWJvb2wgYkZhc3RSb2FtSW5Db25JbmlGZWF0dXJlRW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwl1aW50OF90IGlzRXNlSW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKKyNpZiAgZGVmaW5lZChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSBcCisJfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCXVpbnQ4X3QgaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQ7CisJdWludDhfdCBSb2FtUnNzaURpZmY7CisJYm9vbCBuUm9hbVByZWZlcjVHSHo7CisJYm9vbCBuUm9hbUludHJhQmFuZDsKKwlib29sIGlzV0VTTW9kZUVuYWJsZWQ7CisJYm9vbCBuUm9hbVNjYW5Db250cm9sOworCXVpbnQ4X3QgblByb2JlczsKKwl1aW50MTZfdCBuUm9hbVNjYW5Ib21lQXdheVRpbWU7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisJdENzck5laWdoYm9yUm9hbUNvbmZpZyBuZWlnaGJvclJvYW1Db25maWc7CisjZW5kaWYKKworCS8qCisJICogSW5zdGVhZCBvZiBSZWFzc29jLCBzZW5kIEFERFRTL0RFTFRTIGV2ZW4gd2hlbiBBQ00gaXMgb2ZmIGZvcgorCSAqIHRoYXQgQUMgVGhpcyBpcyBtYW5kYXRlZCBieSBXTU0tQUMgY2VydGlmaWNhdGlvbgorCSAqLworCWJvb2wgYWRkVFNXaGVuQUNNSXNPZmY7CisJYm9vbCBmVmFsaWRhdGVMaXN0OworCS8qCisJICogUmVtb3ZlIHRoaXMgY29kZSBvbmNlIFNMTV9TZXNzaW9uaXphdGlvbiBpcyBzdXBwb3J0ZWQKKwkgKiBCTVBTX1dPUktBUk9VTkRfTk9UX05FRURFRAorCSAqLworCWJvb2wgZG9CTVBTV29ya2Fyb3VuZDsKKwkvKiBUbyBlbmFibGUgc2Nhbm5pbmcgMmcgY2hhbm5lbHMgdHdpY2Ugb24gc2luZ2xlIHNjYW4gcmVxIGZyb20gSEREICovCisJYm9vbCBmU2NhblR3aWNlOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJdWludDMyX3QgblZodENoYW5uZWxXaWR0aDsKKwl1aW50OF90IHR4QkZFbmFibGU7CisJdWludDhfdCB0eEJGQ3NuVmFsdWU7CisJdWludDhfdCBlbmFibGUyeDI7CisJYm9vbCBlbmFibGVWaHRGb3IyNEdIejsKKwl1aW50OF90IHR4TXVCZm9ybWVlOworCXVpbnQ4X3QgZW5hYmxlVmh0cEFpZDsKKwl1aW50OF90IGVuYWJsZVZodEdpZDsKKyNlbmRpZgorCXVpbnQ4X3QgZW5hYmxlQW1wZHVQczsKKwl1aW50OF90IGVuYWJsZUh0U21wczsKKwl1aW50OF90IGh0U21wczsKKwl1aW50OF90IHR4TGRwY0VuYWJsZTsKKwkvKgorCSAqIEVuYWJsZS9EaXNhYmxlIGhlYXJ0YmVhdCBvZmZsb2FkCisJICovCisJYm9vbCBlbmFibGVIZWFydEJlYXRPZmZsb2FkOworCXVpbnQ4X3QgaXNBbXNkdVN1cHBvcnRJbkFNUERVOworCXVpbnQ4X3QgblNlbGVjdDVHSHpNYXJnaW47CisJdWludDhfdCBpc0NvYWxlc2luZ0luSUJTU0FsbG93ZWQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisJdWludDhfdCBjY19zd2l0Y2hfbW9kZTsKKyNlbmRpZgorCXVpbnQ4X3QgYWxsb3dERlNDaGFubmVsUm9hbTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJYm9vbCBpc1JvYW1PZmZsb2FkRW5hYmxlZDsKKyNlbmRpZgorCWJvb2wgb2Jzc0VuYWJsZWQ7CisJYm9vbCBpZ25vcmVfcGVlcl9lcnBfaW5mbzsKKwl1aW50OF90IGNvbmNfY3VzdG9tX3J1bGUxOworCXVpbnQ4X3QgY29uY19jdXN0b21fcnVsZTI7CisJdWludDhfdCBpc19zdGFfY29ubmVjdGlvbl9pbl81Z3pfZW5hYmxlZDsKKwlzdHJ1Y3Qgcm9hbV9leHRfcGFyYW1zIHJvYW1fcGFyYW1zOworCWJvb2wgc2VuZERlYXV0aEJlZm9yZUNvbjsKK30gdENzckNvbmZpZzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ2hhbm5lbFBvd2VySW5mbyB7CisJdExpc3RFbGVtIGxpbms7CisJdWludDhfdCBmaXJzdENoYW5uZWw7CisJdWludDhfdCBudW1DaGFubmVsczsKKwl1aW50OF90IHR4UG93ZXI7CisJdWludDhfdCBpbnRlckNoYW5uZWxPZmZzZXQ7Cit9IHRDc3JDaGFubmVsUG93ZXJJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdSb2FtSm9pblN0YXR1cyB7CisJdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisJLyoKKwkgKiB0aGlzIGlzIHNldCB0byB1bnNwZWNpZmllZCBpZiBzdGF0dXNDb2RlIGluZGljYXRlcyB0aW1lb3V0LgorCSAqIE9yIGl0IGlzIHRoZSBmYWlsZWQgcmVhc29uIGZyb20gdGhlIG90aGVyIEJTUyhwZXIgODAyLjExIHNwZWMpCisJICovCisJdWludDMyX3QgcmVhc29uQ29kZTsKKwl0U2lyTWFjQWRkciBic3NJZDsKK30gdENzclJvYW1Kb2luU3RhdHVzOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JPc0NoYW5uZWxNYXNrIHsKKwl1aW50OF90IG51bUNoYW5uZWxzOworCWJvb2wgc2NhbkVuYWJsZWRbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKKwl1aW50OF90IGNoYW5uZWxMaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07Cit9IHRDc3JPc0NoYW5uZWxNYXNrOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JWb3RlczExZCB7CisJdWludDhfdCB2b3RlczsKKwl1aW50OF90IGNvdW50cnlDb2RlW1dOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTl07Cit9IHRDc3JWb3RlczExZDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU2NhblN0cnVjdCB7CisJdFNjYW5Qcm9maWxlIHNjYW5Qcm9maWxlOworCXREYmxMaW5rTGlzdCBzY2FuUmVzdWx0TGlzdDsKKwl0RGJsTGlua0xpc3QgdGVtcFNjYW5SZXN1bHRzOworCWJvb2wgZlNjYW5FbmFibGU7CisJYm9vbCBmRnVsbFNjYW5Jc3N1ZWQ7CisjaWZkZWYgV0xBTl9BUF9TVEFfQ09OQ1VSUkVOQ1kKKwljZGZfbWNfdGltZXJfdCBoVGltZXJTdGFBcENvbmNUaW1lcjsKKyNlbmRpZgorCWNkZl9tY190aW1lcl90IGhUaW1lcklkbGVTY2FuOworCWNkZl9tY190aW1lcl90IGhUaW1lclJlc3VsdENmZ0FnaW5nOworCS8qCisJICogY2hhbmdlcyBvbiBldmVyeSBzY2FuLCBpdCBpcyB1c2VkIGFzIGEgZmxhZyBmb3Igd2hldGhlciAxMWQgaW5mbyBpcworCSAqIGZvdW5kIG9uIGV2ZXJ5IHNjYW4KKwkgKi8KKwl1aW50OF90IGNoYW5uZWxPZjExZEluZm87CisJdWludDhfdCBzY2FuUmVzdWx0Q2ZnQWdpbmdUaW1lOworCXRTaXJTY2FuVHlwZSBjdXJTY2FuVHlwZTsKKwl0Q3NyQ2hhbm5lbCBjaGFubmVsczExZDsKKwl0Q2hhbm5lbExpc3RXaXRoUG93ZXIgZGVmYXVsdFBvd2VyVGFibGVbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKKwl0Q2hhbm5lbExpc3RXaXRoUG93ZXIKKwkJCWRlZmF1bHRQb3dlclRhYmxlNDBNSHpbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKKwl1aW50MzJfdCBudW1DaGFubmVsc0RlZmF1bHQ7CisJdENzckNoYW5uZWwgYmFzZV9jaGFubmVsczsgIC8qIFRoZSBjaGFubmVsIGJhc2UgdG8gd29yayBvbiAqLworCXRDc3JDaGFubmVsIGJhc2U0ME1IekNoYW5uZWxzOyAgLyogY2VudGVyIGNoYW5uZWxzIGZvciA0ME1IeiBjaGFubmVscyAqLworCXREYmxMaW5rTGlzdCBjaGFubmVsUG93ZXJJbmZvTGlzdDI0OworCXREYmxMaW5rTGlzdCBjaGFubmVsUG93ZXJJbmZvTGlzdDVHOworCXVpbnQzMl90IG5MYXN0QWdlVGltZU91dDsKKwl1aW50MzJfdCBuQWdpbmdDb3VudERvd247CisJdWludDhfdCBjb3VudHJ5Q29kZURlZmF1bHRbV05JX0NGR19DT1VOVFJZX0NPREVfTEVOXTsKKwl1aW50OF90IGNvdW50cnlDb2RlQ3VycmVudFtXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU5dOworCXVpbnQ4X3QgY291bnRyeUNvZGUxMWRbV05JX0NGR19DT1VOVFJZX0NPREVfTEVOXTsKKwl2X1JFR0RPTUFJTl90IGRvbWFpbklkRGVmYXVsdDsgIC8qIGRlZmF1bHQgcmVndWxhdG9yeSBkb21haW4gKi8KKwl2X1JFR0RPTUFJTl90IGRvbWFpbklkQ3VycmVudDsgIC8qIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4gKi8KKworCS8qIEJzc2lkIGZvciBjdXJyZW50IGNvdW50cnkgY29kZSAqLworCXN0cnVjdCBjZGZfbWFjX2FkZHIgY3VycmVudENvdW50cnlCc3NpZDsKKworCWludDhfdCBjdXJyZW50Q291bnRyeVJTU0k7ICAgICAgLyogUlNTSSBmb3IgY3VycmVudCBjb3VudHJ5IGNvZGUgKi8KKwlib29sIGZDYW5jZWxJZGxlU2NhbjsKKwl1aW50OF90IGNvdW50cnlDb2RlQ291bnQ7CisJLyogY291bnRzIGZvciB2YXJpb3VzIGFkdmVydGl6ZWQgY291bnRyeSBjb2RlcyAqLworCXRDc3JWb3RlczExZCB2b3RlczExZFtDU1JfTUFYX05VTV9DT1VOVFJZX0NPREVdOworCS8qCisJICogaW4gMTFkIElFIGZyb20gcHJvYmUgcnNwIG9yIGJlYWNvbnMgb2YgbmVpZ2hib3JpbmcgQVBzCisJICogd2lsbCB1c2UgdGhlIG1vc3QgcG9wdWxhciBvbmUgKG1heCBjb3VudCkKKwkgKi8KKwl1aW50OF90IGNvdW50cnlDb2RlRWxlY3RlZFtXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU5dOworCWJvb2wgZlJlc3RhcnRJZGxlU2NhbjsKKwl1aW50MzJfdCBuSWRsZVNjYW5UaW1lR2FwOworCS8qIGtlZXAgYSB0cmFjayBvZiBjaGFubmVscyB0byBiZSBzY25uZWQgd2hpbGUgaW4gdHJhZmZpYyBjb25kaXRpb24gKi8KKwl0Q3NyT3NDaGFubmVsTWFzayBvc1NjYW5DaGFubmVsTWFzazsKKwl1aW50MTZfdCBuQnNzTGltaXQ7ICAgICAvKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgQlNTIGluIHNjYW4gY2FjaGUgKi8KKwkvKgorCSAqIGNoYW5uZWxQb3dlckluZm9MaXN0MjQgaGFzIGJlZW4gc2VlbiBjb3JydXB0ZWQuIFNldCB0aGlzIGZsYWcgdG8gdHJ1ZQorCSAqIHRyeWluZyB0byBkZXRlY3Qgd2hlbiBpdCBoYXBwZW5zLiBBZGRpbmcgdGhpcyBpbnRvIGNvZGUgYmVjYXVzZSB3ZQorCSAqIGNhbid0IHJlcHJvZHVjZSBpdCBlYXNpbHkuIFdlIGRvbid0IGtub3cgd2hlbiBpdCBoYXBwZW5zLgorCSAqLworCWJvb2wgZlZhbGlkYXRlTGlzdDsKKwkvKgorCSAqIEN1c3RvbWVyIHdhbnRzIHRvIHN0YXJ0IHdpdGggYW4gYWN0aXZlIHNjYW4gYmFzZWQgb24gdGhlIGRlZmF1bHQKKwkgKiBjb3VudHJ5IGNvZGUuIFRoaXMgb3B0aW1pemF0aW9uIHdpbGwgbWluaW1pemUgdGhlIGRyaXZlciBsb2FkIHRvCisJICogYXNzb2NpYXRpb24gdGltZS4gQmFzZWQgb24gdGhpcyBmbGFnIHdlIHdpbGwgYnlwYXNzIHRoZSBpbml0aWFsCisJICogcGFzc2l2ZSBzY2FuIG5lZWRlZCBmb3IgMTFkIHRvIGRldGVybWluZSB0aGUgY291bnRyeSBjb2RlICYgZG9tYWluCisJICovCisJYm9vbCBmRW5hYmxlQnlwYXNzMTFkOworCS8qCisJICogQ3VzdG9tZXIgd2FudHMgdG8gb3B0aW1pemUgdGhlIHNjYW4gdGltZS4gQXZvaWRpbmcgc2NhbnMocGFzc2l2ZSkKKwkgKiBvbiBERlMgY2hhbm5lbHMgd2hpbGUgc3dpcHBpbmcgdGhyb3VnaCBib3RoIGJhbmRzIGNhbiBzYXZlIHNvbWUgdGltZQorCSAqIChhcHByeCAxLjMgc2VjKQorCSAqLworCXVpbnQ4X3QgZkVuYWJsZURGU0NobmxTY2FuOworCS8qCisJICogVG8gZW5hYmxlL2Rpc2FibGUgc2Nhbm5pbmcgb25seSAyLjRHaHogY2hhbm5lbHMgb24gZmlyc3Qgc2NhbgorCSAqLworCWJvb2wgZkZpcnN0U2Nhbk9ubHkyR0Nobmw7CisJYm9vbCBmRHJvcFNjYW5DbWQ7ICAgICAgLyogdHJ1ZSBtZWFucyB3ZSBkb24ndCBhY2NlcHQgc2NhbiBjb21tYW5kcyAqLworCisjaWZkZWYgV0xBTl9BUF9TVEFfQ09OQ1VSUkVOQ1kKKwl0RGJsTGlua0xpc3Qgc2NhbkNtZFBlbmRpbmdMaXN0OworI2VuZGlmCisJLyogVGhpcyBpbmNsdWRlcyBhbGwgY2hhbm5lbHMgb24gd2hpY2ggY2FuZGlkYXRlIEFQcyBhcmUgZm91bmQgKi8KKwl0Q3NyQ2hhbm5lbCBvY2N1cGllZENoYW5uZWxzW0NTUl9ST0FNX1NFU1NJT05fTUFYXTsKKwlpbnQ4X3QgaW5TY2FuUmVzdWx0QmVzdEFQUnNzaTsKKwljc3Jfc2Nhbl9jb21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrMTFkU2NhbkRvbmU7CisJYm9vbCBmY2NfY29uc3RyYWludDsKKwl1aW50OF90IG1heF9zY2FuX2NvdW50OworfSB0Q3NyU2NhblN0cnVjdDsKKworLyoKKyAqIFNhdmUgdGhlIGNvbm5lY3RlZCBpbmZvcm1hdGlvbi4gVGhpcyBzdHJ1Y3R1cmUgKyBjb25uZWN0ZWRQcm9maWxlCisgKiBzaG91bGQgY29udGFpbiBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbm5lY3Rpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnUm9hbUNzckNvbm5lY3RlZEluZm8geworCXVpbnQzMl90IG5CZWFjb25MZW5ndGg7CisJdWludDMyX3QgbkFzc29jUmVxTGVuZ3RoOworCXVpbnQzMl90IG5Bc3NvY1JzcExlbmd0aDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCS8qIGxlbiBvZiB0aGUgcGFyc2VkIFJJQyByZXNwIElFcyByZWNlaXZlZCBpbiByZWFzc29jIHJlc3BvbnNlICovCisJdWludDMyX3QgblJJQ1JzcExlbmd0aDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwl1aW50MzJfdCBuVHNwZWNJZUxlbmd0aDsKKyNlbmRpZgorCS8qCisJICogUG9pbnQgdG8gYSBidWZmZXIgY29udGFpbiB0aGUgYmVhY29uLCBhc3NvYyByZXEsIGFzc29jIHJzcCBmcmFtZSwgaW4KKwkgKiB0aGF0IG9yZGVyIHVzZXIgbmVlZHMgdG8gdXNlIG5CZWFjb25MZW5ndGgsIG5Bc3NvY1JlcUxlbmd0aCwKKwkgKiBuQXNzb2NSc3BMZW5ndGggdG8gZGVzaWNlIHdoZXJlIGVhY2ggZnJhbWUgc3RhcnRzIGFuZCBlbmRzLgorCSAqLworCXVpbnQ4X3QgKnBiRnJhbWVzOworCXVpbnQ4X3Qgc3RhSWQ7Cit9IHRDc3JSb2FtQ29ubmVjdGVkSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyTGlua1F1YWxpdHlJbmRJbmZvIHsKKwljc3Jfcm9hbUxpbmtRdWFsaXR5SW5kQ2FsbGJhY2sgY2FsbGJhY2s7CisJdm9pZCAqY29udGV4dDsKK30gdENzckxpbmtRdWFsaXR5SW5kSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUGVTdGF0c1JlcUluZm8geworCXRMaXN0RWxlbSBsaW5rOyAgICAgICAgIC8qIGxpc3QgbGlua3MgKi8KKwl1aW50MzJfdCBzdGF0c01hc2s7CisJdWludDMyX3QgcGVyaW9kaWNpdHk7CisJYm9vbCByc3BQZW5kaW5nOworCWNkZl9tY190aW1lcl90IGhQZVN0YXRzVGltZXI7CisJYm9vbCB0aW1lclJ1bm5pbmc7CisJdWludDhfdCBzdGFJZDsKKwl1aW50OF90IG51bUNsaWVudDsKKwl0cEFuaVNpckdsb2JhbCBwTWFjOworCS8qIFRvIHJlbWVtYmVyIGlmIHRoZSBwZVN0YXRzIHRpbWVyIGlzIHN0b3BwZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdCAqLworCWJvb2wgdGltZXJTdG9wRmFpbGVkOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCit9IHRDc3JQZVN0YXRzUmVxSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU3RhdHNDbGllbnRSZXFJbmZvIHsKKwl0TGlzdEVsZW0gbGluazsgICAgICAgICAvKiBsaXN0IGxpbmtzICovCisJZUNzclN0YXRzUmVxdWVzdGVyVHlwZSByZXF1ZXN0ZXJJZDsKKwl0Q3NyU3RhdHNDYWxsYmFjayBjYWxsYmFjazsKKwl1aW50MzJfdCBwZXJpb2RpY2l0eTsKKwl2b2lkICpwQ29udGV4dDsKKwl1aW50MzJfdCBzdGF0c01hc2s7CisJdENzclBlU3RhdHNSZXFJbmZvICpwUGVTdGFFbnRyeTsKKwl1aW50OF90IHN0YUlkOworCWNkZl9tY190aW1lcl90IHRpbWVyOworCWJvb2wgdGltZXJFeHBpcmVkOworCXRwQW5pU2lyR2xvYmFsIHBNYWM7ICAgIC8qIFRPRE86IENvbmZpcm0gdGhpcyBjaGFuZ2UgQlRBTVAgKi8KKwl1aW50OF90IHNlc3Npb25JZDsKK30gdENzclN0YXRzQ2xpZW50UmVxSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyVGxTdGF0c1JlcUluZm8geworCXVpbnQzMl90IHBlcmlvZGljaXR5OworCWJvb2wgdGltZXJSdW5uaW5nOworCWNkZl9tY190aW1lcl90IGhUbFN0YXRzVGltZXI7CisJdWludDhfdCBudW1DbGllbnQ7Cit9IHRDc3JUbFN0YXRzUmVxSW5mbzsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKK3R5cGVkZWYgZW51bSB7CisJLyogcmVhc3NvY2lhdGlvbiBpcyBkb25lIGJ1dCBjb3VsZG4ndCBmaW5pc2ggc2VjdXJpdHkgaGFuZHNoYWtlICovCisJZVNJUl9ST0FNX0FVVEhfU1RBVFVTX0NPTk5FQ1RFRCA9IDEsCisJLyogcm9hbSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGJ5IGZpcm13YXJlICovCisJZVNJUl9ST0FNX0FVVEhfU1RBVFVTX0FVVEhFTlRJQ0FURUQgPSAyLAorCS8qIHVua25vd24gZXJyb3IgKi8KKwllU0lSX1JPQU1fQVVUSF9TVEFUVVNfVU5LTk9XTiA9IDB4ZmYKK30gdENzclJvYW1PZmZsb2FkQXV0aFN0YXR1czsKK3R5cGVkZWYgc3RydWN0IHRhZ0NzclJvYW1PZmZsb2FkU3luY2hTdHJ1Y3QgeworCXVpbnQ4X3Qgcm9hbWVkVmRldklkOyAgIC8qIHZkZXZJZCBhZnRlciByb2FtaW5nICovCisJaW50OF90IHR4TWdtdFBvd2VyOyAgICAgLyogSEFMIGZpbGxzIGluIHRoZSB0eCBwb3dlciB1c2VkIGZvciAqLworCXVpbnQ4X3QgcnNzaTsgICAgICAgICAgIC8qIFJTU0kgKi8KKwl1aW50OF90IHJvYW1SZWFzb247ICAgICAvKiBSb2FtIHJlYXNvbiAqLworCXVpbnQ4X3QgbnNzOyAgICAgICAgICAgIC8qIG5vIG9mIHNwYXRpYWwgc3RyZWFtcyAqLworCXVpbnQxNl90IGNoYWluTWFzazsgICAgIC8qIGNoYWlubWFzayAqLworCXVpbnQxNl90IHNtcHNNb2RlOyAgICAgIC8qIHNtcHMubW9kZSAqLworCXRTaXJNYWNBZGRyIGJzc2lkOyAgICAgIC8qIE1BQyBhZGRyZXNzIG9mIHJvYW1lZCBBUCAqLworCWJvb2wgYlJvYW1TeW5jaEluUHJvZ3Jlc3M7ICAgICAgICAgICAgICAvKiBhIHJvYW0gb2ZmbG9hZCBzeW5jaCAqLworCXRDc3JSb2FtT2ZmbG9hZEF1dGhTdGF0dXMgYXV0aFN0YXR1czsgICAvKiBhdXRoIHN0YXR1cyAqLworCXVpbnQ4X3Qga2NrW1NJUl9LQ0tfS0VZX0xFTl07CisJdWludDhfdCBrZWtbU0lSX0tFS19LRVlfTEVOXTsKKwl1aW50OF90IHJlcGxheV9jdHJbU0lSX1JFUExBWV9DVFJfTEVOXTsKKwl0cFNpckJzc0Rlc2NyaXB0aW9uICBic3NfZGVzY19wdHI7ICAgICAgLypCU1MgZGVzY3JpcHRvciovCit9IGNzcl9yb2FtX29mZmxvYWRfc3luY2hfcGFyYW1zOworI2VuZGlmCisKK3N0cnVjdCBjc3Jfcm9hbV9zdG9yZWRfcHJvZmlsZSB7CisJdWludDMyX3Qgc2Vzc2lvbl9pZDsKKwl0Q3NyUm9hbVByb2ZpbGUgcHJvZmlsZTsKKwl0U2NhblJlc3VsdEhhbmRsZSBic3NsaXN0X2hhbmRsZTsKKwllQ3NyUm9hbVJlYXNvbiByZWFzb247CisJdWludDMyX3Qgcm9hbV9pZDsKKwlib29sIGltZWRpYXRlX2ZsYWc7CisJYm9vbCBjbGVhcl9mbGFnOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUm9hbVNlc3Npb24geworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gSUQgKi8KKwlib29sIHNlc3Npb25BY3RpdmU7ICAgICAvKiB0cnVlIGlmIGl0IGlzIHVzZWQgKi8KKworCS8qIEZvciBCVC1BTVAgc3RhdGlvbiwgdGhpcyBzZXJ2ZSBhcyBCU1NJRCBmb3Igc2VsZi1CU1MuICovCisJc3RydWN0IGNkZl9tYWNfYWRkciBzZWxmTWFjQWRkcjsKKworCWNzcl9yb2FtX2NvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2s7CisJdm9pZCAqcENvbnRleHQ7CisJZUNzckNvbm5lY3RTdGF0ZSBjb25uZWN0U3RhdGU7CisJdENzclJvYW1Db25uZWN0ZWRQcm9maWxlIGNvbm5lY3RlZFByb2ZpbGU7CisJdENzclJvYW1Db25uZWN0ZWRJbmZvIGNvbm5lY3RlZEluZm87CisJdENzclJvYW1Qcm9maWxlICpwQ3VyUm9hbVByb2ZpbGU7CisJdFNpckJzc0Rlc2NyaXB0aW9uICpwQ29ubmVjdEJzc0Rlc2M7CisJdWludDE2X3QgTnVtUG1raWRDYWNoZTsgLyogdmFsaWQgbnVtYmVyIG9mIHBta2lkIGluIHRoZSBjYWNoZSovCisJdWludDE2X3QgY3Vycl9jYWNoZV9pZHg7IC8qIHRoZSBpbmRleCBpbiBwbWtpZGNhY2hlIHRvIHdyaXRlIG5leHQgdG8gKi8KKwl0UG1raWRDYWNoZUluZm8gUG1raWRDYWNoZUluZm9bQ1NSX01BWF9QTUtJRF9BTExPV0VEXTsKKwl1aW50OF90IGNKb2luQXR0ZW1wczsKKwkvKgorCSAqIFRoaXMgbWF5IG9yIG1heSBub3QgaGF2ZSB0aGUgdXAtdG8tZGF0ZSB2YWxpZCBjaGFubmVsIGxpc3QuIEl0IGlzCisJICogdXNlZCB0byBnZXQgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QgYW5kIG5vdCBhbGxvYyBtZW1vcnkgYWxsIHRpbWUKKwkgKi8KKwl0U2lyTWFjQ2hhbk51bSB2YWxpZENoYW5uZWxMaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CisJaW50MzJfdCBzUGVuZGluZ0NvbW1hbmRzOyAgIC8qIDAgbWVhbnMgQ1NSIGlzIG9rIHRvIGxvdyBwb3dlciAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJdWludDE2X3QgTnVtQmtpZENhY2hlOworCXRCa2lkQ2FjaGVJbmZvIEJraWRDYWNoZUluZm9bQ1NSX01BWF9CS0lEX0FMTE9XRURdOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisJLyoKKwkgKiBpbmRpY2F0ZSB3aGV0aGVyIENTUiBpcyByb2FtaW5nCisJICogKGVpdGhlciB2aWEgbG9zdGxpbmsgb3IgZHluYW1pYyByb2FtaW5nKQorCSAqLworCWJvb2wgZlJvYW1pbmc7CisJLyoKKwkgKiB0byByZW1lbWJlciBzb21lIHBhcmFtZXRlcnMgbmVlZGVkIGZvciBTVEFSVF9CU1MuCisJICogQWxsIG1lbWJlciBtdXN0IGJlIHNldCBldmVyeSB0aW1lIHdlIHRyeSB0byBqb2luIG9yIHN0YXJ0IGFuIElCU1MKKwkgKi8KKwl0Q3NyUm9hbVN0YXJ0QnNzUGFyYW1zIGJzc1BhcmFtczsKKwkvKiB0aGUgYnl0ZSBjb3VudCBvZiBwV3BhUnNuSUU7ICovCisJdWludDMyX3QgbldwYVJzblJlcUllTGVuZ3RoOworCS8qIGNvbnRhaW4gdGhlIFdQQS9SU04gSUUgaW4gYXNzb2MgcmVxIG9yIG9uZSBzZW50IGluIGJlYWNvbihJQlNTKSAqLworCXVpbnQ4X3QgKnBXcGFSc25SZXFJRTsKKwkvKiB0aGUgYnl0ZSBjb3VudCBmb3IgcFdwYVJzblJzcElFICovCisJdWludDMyX3QgbldwYVJzblJzcEllTGVuZ3RoOworCS8qIHRoaXMgY29udGFpbiB0aGUgV1BBL1JTTiBJRSBpbiBiZWFjb24vcHJvYmUgcnNwICovCisJdWludDhfdCAqcFdwYVJzblJzcElFOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJLyogdGhlIGJ5dGUgY291bnQgb2YgcFdhcGlSZXFJRTsgKi8KKwl1aW50MzJfdCBuV2FwaVJlcUllTGVuZ3RoOworCS8qIHRoaXMgY29udGFpbiB0aGUgV0FQSSBJRSBpbiBhc3NvYyByZXEgb3Igb25lIHNlbnQgaW4gYmVhY29uIChJQlNTKSAqLworCXVpbnQ4X3QgKnBXYXBpUmVxSUU7CisJLyogdGhlIGJ5dGUgY291bnQgZm9yIHBXYXBpUnNwSUUgKi8KKwl1aW50MzJfdCBuV2FwaVJzcEllTGVuZ3RoOworCS8qIHRoaXMgY29udGFpbiB0aGUgV0FQSSBJRSBpbiBiZWFjb24vcHJvYmUgcnNwICovCisJdWludDhfdCAqcFdhcGlSc3BJRTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCXVpbnQzMl90IG5BZGRJRVNjYW5MZW5ndGg7ICAgICAgLyogdGhlIGJ5dGUgY291bnQgb2YgcEFkZEllU2NhbklFOyAqLworCS8qIGNvbnRhaW5zIHRoZSBhZGRpdGlvbmFsIElFIGluICh1bmljYXN0KSBwcm9iZSByZXEgYXQgdGltZSBvZiBqb2luICovCisJdWludDhfdCAqcEFkZElFU2NhbjsKKwl1aW50MzJfdCBuQWRkSUVBc3NvY0xlbmd0aDsgICAgIC8qIHRoZSBieXRlIGNvdW50IGZvciBwQWRkSWVBc3NvY0lFICovCisJdWludDhfdCAqcEFkZElFQXNzb2M7CisJdWludDMyX3Qgcm9hbWluZ1N0YXJ0VGltZTsgICAgICAvKiBpbiB1bml0cyBvZiAxMG1zICovCisJdENzclRpbWVySW5mbyByb2FtaW5nVGltZXJJbmZvOworCWVDc3JSb2FtaW5nUmVhc29uIHJvYW1pbmdSZWFzb247CisJYm9vbCBmQ2FuY2VsUm9hbWluZzsKKwljZGZfbWNfdGltZXJfdCBoVGltZXJSb2FtaW5nOworCS8qIHRoZSByb2FtUmVzdWx0IHRoYXQgaXMgdXNlZCB3aGVuIHRoZSByb2FtaW5nIHRpbWVyIGZpcmVzICovCisJZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdDsKKwkvKiBUaGlzIGlzIHRoZSByZWFzb24gY29kZSBmb3Igam9pbihhc3NvYykgZmFpbHVyZSAqLworCXRDc3JSb2FtSm9pblN0YXR1cyBqb2luRmFpbFN0YXR1c0NvZGU7CisJLyogc3RhdHVzIGZyb20gUEUgZm9yIGRlYXV0aC9kaXNhc3NvYyhsb3N0bGluaykgb3Igb3VyIG93biBkeW4gcm9hbSAqLworCXVpbnQzMl90IHJvYW1pbmdTdGF0dXNDb2RlOworCXVpbnQxNl90IE51bVBta2lkQ2FuZGlkYXRlOworCXRQbWtpZENhbmRpZGF0ZUluZm8gUG1raWRDYW5kaWRhdGVJbmZvW0NTUl9NQVhfUE1LSURfQUxMT1dFRF07CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwl1aW50MTZfdCBOdW1Ca2lkQ2FuZGlkYXRlOworCXRCa2lkQ2FuZGlkYXRlSW5mbyBCa2lkQ2FuZGlkYXRlSW5mb1tDU1JfTUFYX0JLSURfQUxMT1dFRF07CisjZW5kaWYKKwlib29sIGZXTU1Db25uZWN0aW9uOworCWJvb2wgZlFPU0Nvbm5lY3Rpb247CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXRDc3JFc2VDY2ttSW5mbyBlc2VDY2ttSW5mbzsKKwlib29sIGlzUHJldkFwSW5mb1ZhbGlkOworCXRTaXJNYWNTU2lkIHByZXZBcFNTSUQ7CisJc3RydWN0IGNkZl9tYWNfYWRkciBwcmV2QXBCc3NpZDsKKwl1aW50OF90IHByZXZPcENoYW5uZWw7CisJdWludDE2X3QgY2xpZW50RGlzc1NlY3M7CisJdWludDMyX3Qgcm9hbVRTMTsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorCXRDc3JFc2VDY2ttSWUgc3VwcENja21JZUluZm87CisjZW5kaWYKKyNlbmRpZgorCXVpbnQ4X3QgYlJlZkFzc29jU3RhcnRDbnQ7ICAgICAgLyogVHJhY2tpbmcgYXNzb2Mgc3RhcnQgaW5kaWNhdGlvbiAqLworCXRTaXJIVENvbmZpZyBodENvbmZpZzsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwlib29sIHBub1N0YXJ0ZWQ7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJY3NyX3JvYW1fb2ZmbG9hZF9zeW5jaF9wYXJhbXMgcm9hbU9mZmxvYWRTeW5jaFBhcmFtczsKKwl1aW50OF90IHBza19wbWtbU0lSX1JPQU1fU0NBTl9QU0tfU0laRV07CisJc2l6ZV90IHBta19sZW47CisJdWludDhfdCBSb2FtS2V5TWdtdE9mZmxvYWRFbmFibGVkOworI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCXRmdFNNRUNvbnRleHQgZnRTbWVDb250ZXh0OworI2VuZGlmCisJLyogVGhpcyBjb3VudCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgYnNzaWQncyB3ZSB0cnkgdG8gam9pbi4gKi8KKwl1aW50OF90IGpvaW5fYnNzaWRfY291bnQ7CisJc3RydWN0IGNzcl9yb2FtX3N0b3JlZF9wcm9maWxlIHN0b3JlZF9yb2FtX3Byb2ZpbGU7Cit9IHRDc3JSb2FtU2Vzc2lvbjsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUm9hbVN0cnVjdCB7CisJdWludDMyX3QgbmV4dFJvYW1JZDsKKwl0RGJsTGlua0xpc3Qgcm9hbUNtZFBlbmRpbmdMaXN0OworCXREYmxMaW5rTGlzdCBjaGFubmVsTGlzdDVHOworCXREYmxMaW5rTGlzdCBjaGFubmVsTGlzdDI0OworCXRDc3JDb25maWcgY29uZmlnUGFyYW07CisJdWludDMyX3QgbnVtQ2hhbm5lbHNFZXByb207ICAgICAvKiB0b3RhbCBjaGFubmVscyBvZiBlZXByb20gKi8KKwl0Q3NyQ2hhbm5lbCBiYXNlQ2hhbm5lbHM7ICAvKiBUaGUgY2hhbm5lbCBiYXNlIHRvIHdvcmsgb24gKi8KKwl0Q3NyQ2hhbm5lbCBiYXNlNDBNSHpDaGFubmVsczsgIC8qIGNlbnRlciBjaGFubmVscyBmb3IgNDBNSHogY2hhbm5lbHMgKi8KKwllQ3NyUm9hbVN0YXRlIGN1clN0YXRlW0NTUl9ST0FNX1NFU1NJT05fTUFYXTsKKwllQ3NyUm9hbVN1YlN0YXRlIGN1clN1YlN0YXRlW0NTUl9ST0FNX1NFU1NJT05fTUFYXTsKKwkvKgorCSAqIFRoaXMgbWF5IG9yIG1heSBub3QgaGF2ZSB0aGUgdXAtdG8tZGF0ZSB2YWxpZCBjaGFubmVsIGxpc3QuIEl0IGlzCisJICogdXNlZCB0byBnZXQgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QgYW5kIG5vdCBhbGxvYyBtZW0gYWxsIHRpbWUKKwkgKi8KKwl0U2lyTWFjQ2hhbk51bSB2YWxpZENoYW5uZWxMaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CisJdWludDMyX3QgbnVtVmFsaWRDaGFubmVsczsgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzIGluIENGRyAqLworCWludDMyX3Qgc1BlbmRpbmdDb21tYW5kczsKKwljZGZfbWNfdGltZXJfdCBoVGltZXJXYWl0Rm9yS2V5OyAvKiBzdXBwb3J0IHRpbWVvdXQgZm9yIFdhaXRGb3JLZXkgKi8KKwl0Q3NyU3VtbWFyeVN0YXRzSW5mbyBzdW1tYXJ5U3RhdHNJbmZvOworCXRDc3JHbG9iYWxDbGFzc0FTdGF0c0luZm8gY2xhc3NBU3RhdHNJbmZvOworCXRDc3JHbG9iYWxDbGFzc0JTdGF0c0luZm8gY2xhc3NCU3RhdHNJbmZvOworCXRDc3JHbG9iYWxDbGFzc0NTdGF0c0luZm8gY2xhc3NDU3RhdHNJbmZvOworCXRDc3JHbG9iYWxDbGFzc0RTdGF0c0luZm8gY2xhc3NEU3RhdHNJbmZvOworCXRDc3JQZXJTdGFTdGF0c0luZm8gcGVyU3RhU3RhdHNJbmZvW0NTUl9NQVhfU1RBXTsKKwl0RGJsTGlua0xpc3Qgc3RhdHNDbGllbnRSZXFMaXN0OworCXREYmxMaW5rTGlzdCBwZVN0YXRzUmVxTGlzdDsKKwl0Q3NyVGxTdGF0c1JlcUluZm8gdGxTdGF0c1JlcUluZm87CisJZUNzclJvYW1MaW5rUXVhbGl0eUluZCB2Y2NMaW5rUXVhbGl0eTsKKwl0Q3NyTGlua1F1YWxpdHlJbmRJbmZvIGxpbmtRdWFsaXR5SW5kSW5mbzsKKwl2X0NPTlRFWFRfdCBnX2Nkc19jb250ZXh0OyAgICAgIC8qIHVzZWQgZm9yIGludGVyYWN0aW9uIHdpdGggVEwgKi8KKwl0Q3NyVGltZXJJbmZvIFdhaXRGb3JLZXlUaW1lckluZm87CisJdENzclJvYW1TZXNzaW9uICpyb2FtU2Vzc2lvbjsKKwl1aW50MzJfdCB0cmFuc2FjdGlvbklkOyAgLyogQ3VycmVudCB0cmFuc2FjdGlvbiBJRCBmb3IgaW50ZXJuYWwgdXNlLiAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisJdENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIG5laWdoYm9yUm9hbUluZm9bQ1NSX1JPQU1fU0VTU0lPTl9NQVhdOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCXVpbnQ4X3QgaXNGYXN0Um9hbUluaUZlYXR1cmVFbmFibGVkOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXVpbnQ4X3QgaXNFc2VJbmlGZWF0dXJlRW5hYmxlZDsKKyNlbmRpZgorI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIFwKKwl8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJdWludDhfdCBSb2FtUnNzaURpZmY7CisJYm9vbCBpc1dFU01vZGVFbmFibGVkOworI2VuZGlmCisJdWludDMyX3QgZGVhdXRoUnNwU3RhdHVzOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwl1aW50OF90ICpwUmVhc3NvY1Jlc3A7ICAgICAgICAgIC8qIHJlYXNzb2NpYXRpb24gcmVzcG9uc2UgZnJvbSBuZXcgQVAgKi8KKwl1aW50MTZfdCByZWFzc29jUmVzcExlbjsgICAgICAgIC8qIGxlbmd0aCBvZiByZWFzc29jaWF0aW9uIHJlc3BvbnNlICovCisjZW5kaWYKK30gdENzclJvYW1TdHJ1Y3Q7CisKKyNkZWZpbmUgR0VUX05FWFRfUk9BTV9JRChwUm9hbVN0cnVjdCkgICgoKHBSb2FtU3RydWN0KS0+bmV4dFJvYW1JZCArIDEgPT0gMCkgPyBcCisJCQkxIDogKHBSb2FtU3RydWN0KS0+bmV4dFJvYW1JZCkKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1RBVEUocE1hYywgc3RhdGUsIHNlc3Npb25JZCkgXAorCQkJKChzdGF0ZSkgPT0gKHBNYWMpLT5yb2FtLmN1clN0YXRlW3Nlc3Npb25JZF0pCisjZGVmaW5lIENTUl9JU19ST0FNX1NUT1AocE1hYywgc2Vzc2lvbklkKSBcCisJCUNTUl9JU19ST0FNX1NUQVRFKChwTWFjKSwgZUNTUl9ST0FNSU5HX1NUQVRFX1NUT1AsIHNlc3Npb25JZCkKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fSU5JVChwTWFjLCBzZXNzaW9uSWQpIFwKKwkJIENTUl9JU19ST0FNX1NUQVRFKChwTWFjKSwgZUNTUl9ST0FNSU5HX1NUQVRFX0lOSVQsIHNlc3Npb25JZCkKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fSk9JTklORyhwTWFjLCBzZXNzaW9uSWQpICBcCisJCUNTUl9JU19ST0FNX1NUQVRFKHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HLCBzZXNzaW9uSWQpCisjZGVmaW5lIENTUl9JU19ST0FNX0lETEUocE1hYywgc2Vzc2lvbklkKSBcCisJCUNTUl9JU19ST0FNX1NUQVRFKHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9JRExFLCBzZXNzaW9uSWQpCisjZGVmaW5lIENTUl9JU19ST0FNX0pPSU5FRChwTWFjLCBzZXNzaW9uSWQpIFwKKwkJQ1NSX0lTX1JPQU1fU1RBVEUocE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5FRCwgc2Vzc2lvbklkKQorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURShwTWFjLCBzdWJTdGF0ZSwgc2Vzc2lvbklkKSBcCisJCSgoc3ViU3RhdGUpID09IChwTWFjKS0+cm9hbS5jdXJTdWJTdGF0ZVtzZXNzaW9uSWRdKQorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9KT0lOX1JFUShwTWFjLCBzZXNzaW9uSWQpIFwKKwlDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIGVDU1JfUk9BTV9TVUJTVEFURV9KT0lOX1JFUSwgc2Vzc2lvbklkKQorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9BVVRIX1JFUShwTWFjLCBzZXNzaW9uSWQpIFwKKwlDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIGVDU1JfUk9BTV9TVUJTVEFURV9BVVRIX1JFUSwgc2Vzc2lvbklkKQorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9SRUFTU09DX1JFUShwTWFjLCBzZXNzaW9uSWQpIFwKKwlDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIGVDU1JfUk9BTV9TVUJTVEFURV9SRUFTU09DX1JFUSwgc2Vzc2lvbklkKQorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRVEocE1hYywgc2Vzc2lvbklkKSBcCisJQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfUkVRLCBzZXNzaW9uSWQpCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX05PX0pPSU4ocE1hYywgc2Vzc2lvbklkKSBcCisJQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBcCisJCWVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19OT1RISU5HX1RPX0pPSU4sIHNlc3Npb25JZCkKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfUkVBU1NPQ19GQUlMKHBNYWMsIHNlc3Npb25JZCkgXAorCQlDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIFwKKwkJCWVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRUFTU09DX0ZBSUxVUkUsIHNlc3Npb25JZCkKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfRk9SQ0VEKHBNYWMsIHNlc3Npb25JZCkgXAorCQlDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIFwKKwkJCWVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19GT1JDRUQsIHNlc3Npb25JZCkKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfREVBVVRIX1JFUShwTWFjLCBzZXNzaW9uSWQpIFwKKwkJQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBcCisJCQllQ1NSX1JPQU1fU1VCU1RBVEVfREVBVVRIX1JFUSwgc2Vzc2lvbklkKQorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9TVEFSVF9CU1NfUkVRKHBNYWMsIHNlc3Npb25JZCkgXAorCQlDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIFwKKwkJCWVDU1JfUk9BTV9TVUJTVEFURV9TVEFSVF9CU1NfUkVRLCBzZXNzaW9uSWQpCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUShwTWFjLCBzZXNzaW9uSWQpIFwKKwkJQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBcCisJCQllQ1NSX1JPQU1fU1VCU1RBVEVfU1RPUF9CU1NfUkVRLCBzZXNzaW9uSWQpCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0NPTk5FQ1RfQ09OVElOVUUocE1hYywgc2Vzc2lvbklkKSBcCisJCUNTUl9JU19ST0FNX1NVQlNUQVRFKChwTWFjKSwgXAorCQllQ1NSX1JPQU1fU1VCU1RBVEVfRElTQ09OTkVDVF9DT05USU5VRV9ST0FNSU5HLCBzZXNzaW9uSWQpCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX0NPTkZJRyhwTWFjLCBzZXNzaW9uSWQpIFwKKwkJQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBcCisJCWVDU1JfUk9BTV9TVUJTVEFURV9DT05GSUcsIHNlc3Npb25JZCkKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfV0FJVEZPUktFWShwTWFjLCBzZXNzaW9uSWQpIFwKKwkJQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBcCisJCQllQ1NSX1JPQU1fU1VCU1RBVEVfV0FJVF9GT1JfS0VZLCBzZXNzaW9uSWQpCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hPKHBNYWMsIHNlc3Npb25JZCkgXAorCQlDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIFwKKwkJCWVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19IQU5ET0ZGLCBzZXNzaW9uSWQpCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX0hPX05UKHBNYWMsIHNlc3Npb25JZCkgXAorCQlDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIFwKKwkJCWVDU1JfUk9BTV9TVUJTVEFURV9KT0lORURfTk9fVFJBRkZJQywgc2Vzc2lvbklkKQorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9IT19OUlQocE1hYywgc2Vzc2lvbklkKSAgXAorCQkJQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBcCisJCQkJZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5FRF9OT05fUkVBTFRJTUVfVFJBRkZJQyxcCisJCQkJCXNlc3Npb25JZCkKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfSE9fUlQocE1hYywgc2Vzc2lvbklkKSBcCisJCQlDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksXAorCQkJZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5FRF9SRUFMVElNRV9UUkFGRklDLCBzZXNzaW9uSWQpCisjZGVmaW5lIENTUl9JU19QSFlfTU9ERV9CX09OTFkocE1hYykgXAorCSgoZUNTUl9ET1QxMV9NT0RFXzExYiA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSkgfHwgXAorCSAoZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZID09IChwTWFjKS0+cm9hbS5jb25maWdQYXJhbS5waHlNb2RlKSkKKworI2RlZmluZSBDU1JfSVNfUEhZX01PREVfR19PTkxZKHBNYWMpIFwKKwkoZUNTUl9ET1QxMV9NT0RFXzExZyA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSBcCisJCXx8IGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWSA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSkKKworI2RlZmluZSBDU1JfSVNfUEhZX01PREVfQV9PTkxZKHBNYWMpIFwKKwkoZUNTUl9ET1QxMV9NT0RFXzExYSA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSkKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisjZGVmaW5lIENTUl9JU19QSFlfTU9ERV9EVUFMX0JBTkQocGh5TW9kZSkgXAorCSgoZUNTUl9ET1QxMV9NT0RFX2FiZyAmIChwaHlNb2RlKSkgfHwgXAorCSAoZUNTUl9ET1QxMV9NT0RFXzExbiAmIChwaHlNb2RlKSkgfHwgXAorCSAoZUNTUl9ET1QxMV9NT0RFXzExYWMgJiAocGh5TW9kZSkpIHx8IFwKKwkgKGVDU1JfRE9UMTFfTU9ERV9BVVRPICYgKHBoeU1vZGUpKSkKKyNlbHNlCisjZGVmaW5lIENTUl9JU19QSFlfTU9ERV9EVUFMX0JBTkQocGh5TW9kZSkgXAorCSgoZUNTUl9ET1QxMV9NT0RFX2FiZyAmIChwaHlNb2RlKSkgfHwgIFwKKwkgKGVDU1JfRE9UMTFfTU9ERV8xMW4gJiAocGh5TW9kZSkpIHx8IFwKKwkgKGVDU1JfRE9UMTFfTU9ERV9BVVRPICYgKHBoeU1vZGUpKSkKKyNlbmRpZgorCisjZGVmaW5lIENTUl9JU19QSFlfTU9ERV8xMW4ocGh5X21vZGUpIFwKKwkoKGVDU1JfRE9UMTFfTU9ERV8xMW4gPT0gcGh5X21vZGUpIHx8IFwKKwkgKGVDU1JfRE9UMTFfTU9ERV8xMW5fT05MWSA9PSBwaHlfbW9kZSkgfHwgXAorCSAoZUNTUl9ET1QxMV9NT0RFXzExYWMgPT0gcGh5X21vZGUpIHx8IFwKKwkgKGVDU1JfRE9UMTFfTU9ERV8xMWFjX09OTFkgPT0gcGh5X21vZGUpKQorCisjZGVmaW5lIENTUl9JU19QSFlfTU9ERV8xMWFjKHBoeV9tb2RlKSBcCisJKChlQ1NSX0RPVDExX01PREVfMTFhYyA9PSBwaHlfbW9kZSkgfHwgXAorCSAoZUNTUl9ET1QxMV9NT0RFXzExYWNfT05MWSA9PSBwaHlfbW9kZSkpCisvKgorICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIE5JQyBpcyBvcGVyYXRpbmcgZXhjbHVzaXZlbHkgaW4KKyAqIHRoZSAyLjQgR0h6IGJhbmQsIG1lYW5pbmcuIGl0IGlzIE5PVCBvcGVyYXRpbmcgaW4gdGhlIDUuMCBHSHogYmFuZC4KKyAqLworI2RlZmluZSBDU1JfSVNfMjRfQkFORF9PTkxZKHBNYWMpIFwKKwkoZUNTUl9CQU5EXzI0ID09IChwTWFjKS0+cm9hbS5jb25maWdQYXJhbS5lQmFuZCkKKworI2RlZmluZSBDU1JfSVNfNUdfQkFORF9PTkxZKHBNYWMpIFwKKwkoZUNTUl9CQU5EXzVHID09IChwTWFjKS0+cm9hbS5jb25maWdQYXJhbS5lQmFuZCkKKworI2RlZmluZSBDU1JfSVNfUkFESU9fRFVBTF9CQU5EKHBNYWMpIFwKKwkoZUNTUl9CQU5EX0FMTCA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0uYmFuZENhcGFiaWxpdHkpCisKKyNkZWZpbmUgQ1NSX0lTX1JBRElPX0JHX09OTFkocE1hYykgXAorCShlQ1NSX0JBTkRfMjQgPT0gKHBNYWMpLT5yb2FtLmNvbmZpZ1BhcmFtLmJhbmRDYXBhYmlsaXR5KQorCisvKgorICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIE5JQyBpcyBvcGVyYXRpbmcgZXhjbHVzaXZlbHkgaW4gdGhlIDUuMCBHSHoKKyAqIGJhbmQsIG1lYW5pbmcuIGl0IGlzIE5PVCBvcGVyYXRpbmcgaW4gdGhlIDIuNCBHSHogYmFuZAorICovCisjZGVmaW5lIENTUl9JU19SQURJT19BX09OTFkocE1hYykgXAorCShlQ1NSX0JBTkRfNUcgPT0gKHBNYWMpLT5yb2FtLmNvbmZpZ1BhcmFtLmJhbmRDYXBhYmlsaXR5KQorLyogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIE5JQyBpcyBvcGVyYXRpbmcgaW4gYm90aCBiYW5kcy4gKi8KKyNkZWZpbmUgQ1NSX0lTX09QRUFSVElOR19EVUFMX0JBTkQocE1hYykgXAorCSgoZUNTUl9CQU5EX0FMTCA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0uYmFuZENhcGFiaWxpdHkpICYmIFwKKwkJKGVDU1JfQkFORF9BTEwgPT0gKHBNYWMpLT5yb2FtLmNvbmZpZ1BhcmFtLmVCYW5kKSkKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgTklDIGNhbiBvcGVyYXRlIGluIHRoZSA1LjAgR0h6IGJhbmQKKyAqIChjb3VsZCBvcGVyYXRlIGluIHRoZSAyLjQgR0h6IGJhbmQgYWxzbykKKyAqLworI2RlZmluZSBDU1JfSVNfT1BFUkFUSU5HX0FfQkFORChwTWFjKSBcCisJKENTUl9JU19PUEVBUlRJTkdfRFVBTF9CQU5EKChwTWFjKSkgfHwgXAorCQlDU1JfSVNfUkFESU9fQV9PTkxZKChwTWFjKSkgfHwgQ1NSX0lTXzVHX0JBTkRfT05MWSgocE1hYykpKQorCisvKgorICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIE5JQyBjYW4gb3BlcmF0ZSBpbiB0aGUgMi40IEdIeiBiYW5kCisgKiAoY291bGQgb3BlcmF0ZSBpbiB0aGUgNS4wIEdIeiBiYW5kIGFsc28pLgorICovCisjZGVmaW5lIENTUl9JU19PUEVSQVRJTkdfQkdfQkFORChwTWFjKSBcCisJKENTUl9JU19PUEVBUlRJTkdfRFVBTF9CQU5EKChwTWFjKSkgfHwgXAorCQlDU1JfSVNfUkFESU9fQkdfT05MWSgocE1hYykpIHx8IENTUl9JU18yNF9CQU5EX09OTFkoKHBNYWMpKSkKKyNkZWZpbmUgQ1NSX0dFVF9CQU5EKGNoX251bSkgXAorCSgoQ0RTX0lTX0NIQU5ORUxfMjRHSFooY2hfbnVtKSkgPyBlQ1NSX0JBTkRfMjQgOiBlQ1NSX0JBTkRfNUcpCisjZGVmaW5lIENTUl9JU18xMURfSU5GT19GT1VORChwTWFjKSBcCisJKDAgIT0gKHBNYWMpLT5zY2FuLmNoYW5uZWxPZjExZEluZm8pCisjZGVmaW5lIENTUl9JU19ST0FNSU5HKHBTZXNzaW9uKSBcCisJKChDU1JfSVNfTE9TVExJTktfUk9BTUlORygocFNlc3Npb24pLT5yb2FtaW5nUmVhc29uKSkgfHwgXAorCQkoZUNzckR5bmFtaWNSb2FtaW5nID09IChwU2Vzc2lvbiktPnJvYW1pbmdSZWFzb24pICB8fAlcCisJCShlQ3NyUmVhc3NvY1JvYW1pbmcgPT0gKHBTZXNzaW9uKS0+cm9hbWluZ1JlYXNvbikpCisjZGVmaW5lIENTUl9JU19TRVRfS0VZX0NPTU1BTkQocENvbW1hbmQpIFwKKwkoZVNtZUNvbW1hbmRTZXRLZXkgPT0gKHBDb21tYW5kKS0+Y29tbWFuZCkKKyNkZWZpbmUgQ1NSX0lTX0FERFRTX1dIRU5fQUNNT0ZGX1NVUFBPUlRFRChwTWFjKSBcCisJKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYWRkVFNXaGVuQUNNSXNPZmYpCisjZGVmaW5lIENTUl9JU19MT1NUTElOS19ST0FNSU5HKHJlYXNvbikgXAorCSgoZUNzckxvc3RsaW5rUm9hbWluZ0Rpc2Fzc29jID09IChyZWFzb24pKSB8fCBcCisJCShlQ3NyTG9zdGxpbmtSb2FtaW5nRGVhdXRoID09IChyZWFzb24pKSkKKworI2RlZmluZSBDU1JfSVNfUk9BTUlOR19DT01NQU5EKHBDb21tYW5kKSBcCisJCSgoZUNzckxvc3RMaW5rMSA9PSAocENvbW1hbmQpLT51LnJvYW1DbWQucm9hbVJlYXNvbikgfHwgXAorCQkJKGVDc3JMb3N0TGluazIgPT0gKHBDb21tYW5kKS0+dS5yb2FtQ21kLnJvYW1SZWFzb24pIHx8IFwKKwkJCShlQ3NyTG9zdExpbmszID09IChwQ29tbWFuZCktPnUucm9hbUNtZC5yb2FtUmVhc29uKSkKKworQ0RGX1NUQVRVUyBjc3JfZ2V0X2NoYW5uZWxfYW5kX3Bvd2VyX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitDREZfU1RBVFVTIGNzclNjYW5GaWx0ZXIxMWRSZXN1bHQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKK0NERl9TVEFUVVMgY3NyX3NjYW5fZmlsdGVyX3Jlc3VsdHModHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKK0NERl9TVEFUVVMgY3NyX3NldF9tb2RpZnlfcHJvZmlsZV9maWVsZHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDMyX3Qgc2Vzc2lvbklkLCB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgKgorCQlwTW9kaWZ5UHJvZmlsZUZpZWxkcyk7CitDREZfU1RBVFVTIGNzcl9nZXRfbW9kaWZ5X3Byb2ZpbGVfZmllbGRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQzMl90IHNlc3Npb25JZCwgdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzICoKKwkJcE1vZGlmeVByb2ZpbGVGaWVsZHMpOwordm9pZCBjc3Jfc2V0X2dsb2JhbF9jZmdzKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBjc3Jfc2V0X2RlZmF1bHRfZG90MTFfbW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyU2NhblNldENoYW5uZWxNYXNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JDaGFubmVsSW5mbyAqcENoYW5uZWxJbmZvKTsKK2Jvb2wgY3NyX2lzX2Nvbm5fc3RhdGVfZGlzY29ubmVjdGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7Citib29sIGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7Citib29sIGNzcl9pc19jb25uX3N0YXRlX2Rpc2Nvbm5lY3RlZF9pYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQzMl90IHNlc3Npb25JZCk7Citib29sIGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpOworYm9vbCBjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKK2Jvb2wgY3NyX2lzX2Nvbm5fc3RhdGVfaW5mcmEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKK2Jvb2wgY3NyX2lzX2Nvbm5fc3RhdGVfaWJzcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpOworYm9vbCBjc3JfaXNfY29ubl9zdGF0ZV93ZHModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKK2Jvb2wgY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX3dkcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpOworYm9vbCBjc3JfaXNfY29ubl9zdGF0ZV9kaXNjb25uZWN0ZWRfd2RzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQzMl90IHNlc3Npb25JZCk7Citib29sIGNzcl9pc19hbnlfc2Vzc2lvbl9pbl9jb25uZWN0X3N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworYm9vbCBjc3JfaXNfYWxsX3Nlc3Npb25fZGlzY29ubmVjdGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworYm9vbCBjc3JfaXNfc3RhX3Nlc3Npb25fY29ubmVjdGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworYm9vbCBjc3JfaXNfcDJwX3Nlc3Npb25fY29ubmVjdGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworYm9vbCBjc3JfaXNfYW55X3Nlc3Npb25fY29ubmVjdGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworYm9vbCBjc3JfaXNfaW5mcmFfY29ubmVjdGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworYm9vbCBjc3JfaXNfY29uY3VycmVudF9pbmZyYV9jb25uZWN0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Citib29sIGNzcl9pc19jb25jdXJyZW50X3Nlc3Npb25fcnVubmluZyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2Jvb2wgY3NyX2lzX2luZnJhX2FwX3N0YXJ0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Citib29sIGNzcl9pc19pYnNzX3N0YXJ0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Citib29sIGNzcl9pc19idGFtcF9zdGFydGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworYm9vbCBjc3JfaXNfYnRhbXAodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKK2Jvb2wgY3NyX2lzX3ZhbGlkX21jX2NvbmN1cnJlbnRfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MpOworYm9vbCBjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWRfaW5mcmFfYXAodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDMyX3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgY3NyX2dldF9zdGF0aXN0aWNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCWVDc3JTdGF0c1JlcXVlc3RlclR5cGUgcmVxdWVzdGVySWQsCisJCXVpbnQzMl90IHN0YXRzTWFzaywgdENzclN0YXRzQ2FsbGJhY2sgY2FsbGJhY2ssCisJCXVpbnQzMl90IHBlcmlvZGljaXR5LCBib29sIGNhY2hlLCB1aW50OF90IHN0YUlkLAorCQl2b2lkICpwQ29udGV4dCwgdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBjc3JfZ2V0X3Jzc2kodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJzc2lDYWxsYmFjayBjYWxsYmFjaywKKwkJdWludDhfdCBzdGFJZCwgc3RydWN0IGNkZl9tYWNfYWRkciBic3NJZCwgaW50OF90IGxhc3RSU1NJLAorCQl2b2lkICpwQ29udGV4dCwgdm9pZCAqcF9jZHNfY29udGV4dCk7CitDREZfU1RBVFVTIGNzcl9nZXRfc25yKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTbnJDYWxsYmFjayBjYWxsYmFjaywKKwkJdWludDhfdCBzdGFJZCwgc3RydWN0IGNkZl9tYWNfYWRkciBic3NJZCwgdm9pZCAqcENvbnRleHQpOworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKK0NERl9TVEFUVVMgY3NyX2dldF90c21fc3RhdHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdENzclRzbVN0YXRzQ2FsbGJhY2sgY2FsbGJhY2ssCisJCXVpbnQ4X3Qgc3RhSWQsCisJCXN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzSWQsCisJCXZvaWQgKnBDb250ZXh0LCB2b2lkICpwX2Nkc19jb250ZXh0LCB1aW50OF90IHRpZCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAmJiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworQ0RGX1NUQVRVUyBjc3JfZ2V0X2NvbmZpZ19wYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQ29uZmlnUGFyYW0gKnBQYXJhbSk7CitDREZfU1RBVFVTIGNzcl9jaGFuZ2VfZGVmYXVsdF9jb25maWdfcGFyYW0odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdENzckNvbmZpZ1BhcmFtICpwUGFyYW0pOworQ0RGX1NUQVRVUyBjc3JfbXNnX3Byb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKTsKK0NERl9TVEFUVVMgY3NyX29wZW4odHBBbmlTaXJHbG9iYWwgcE1hYyk7CitDREZfU1RBVFVTIGNzcl9pbml0X2NoYW5fbGlzdCh0cEFuaVNpckdsb2JhbCBtYWMsIHVpbnQ4X3QgKmFscGhhMik7CitDREZfU1RBVFVTIGNzcl9jbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK0NERl9TVEFUVVMgY3NyX3N0YXJ0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworQ0RGX1NUQVRVUyBjc3Jfc3RvcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0SGFsU3RvcFR5cGUgc3RvcFR5cGUpOworQ0RGX1NUQVRVUyBjc3JfcmVhZHkodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9nZXRfYmtpZF9jYW5kaWRhdGVfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl1aW50MzJfdCBzZXNzaW9uSWQsIHRCa2lkQ2FuZGlkYXRlSW5mbyAqIHBCa2lkTGlzdCwKKwkJdWludDMyX3QgKnBOdW1JdGVtcyk7CitDREZfU1RBVFVTIGNzcl9yb2FtX2dldF93YXBpX3JlcV9pZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl1aW50MzJfdCBzZXNzaW9uSWQsIHVpbnQzMl90ICpwTGVuLCB1aW50OF90ICpwQnVmKTsKK0NERl9TVEFUVVMgY3NyX3JvYW1fZ2V0X3dhcGlfcnNwX2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJdWludDMyX3QgKnBMZW4sIHVpbnQ4X3QgKnBCdWYpOwordWludDhfdCBjc3JfY29uc3RydWN0X3dhcGlfaWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQl0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQl0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLAorCQl0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0Q3NyV2FwaUllICpwV2FwaUllKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCitDREZfU1RBVFVTIGNzcl9yb2FtX3VwZGF0ZV9hcHdwc2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJdFNpckFQV1BTSUVzICogcEFQV1BTSUVTKTsKK0NERl9TVEFUVVMgY3NyX3JvYW1fdXBkYXRlX3dwYXJzbmlfZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQl0U2lyUlNOaWUgKnBBUFNpclJTTmllKTsKK3ZvaWQgY3NyX3NldF9jZmdfcHJpdmFjeSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQlib29sIGZQcml2YWN5KTsKK2ludDhfdCBjc3JfZ2V0X2luZnJhX3Nlc3Npb25faWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit1aW50OF90IGNzcl9nZXRfaW5mcmFfb3BlcmF0aW9uX2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpOworYm9vbCBjc3JfaXNfc2Vzc2lvbl9jbGllbnRfYW5kX2Nvbm5lY3RlZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl1aW50OF90IHNlc3Npb25JZCk7Cit1aW50OF90IGNzcl9nZXRfY29uY3VycmVudF9vcGVyYXRpb25fY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAordWludDE2X3QgY3NyX2NoZWNrX2NvbmN1cnJlbnRfY2hhbm5lbF9vdmVybGFwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQxNl90IHNhcF9jaCwgZUNzclBoeU1vZGUgc2FwX3BoeW1vZGUsCisJCXVpbnQ4X3QgY2Nfc3dpdGNoX21vZGUpOworI2VuZGlmCitDREZfU1RBVFVTIGNzcl9yb2FtX2NvcHlfY29ubmVjdF9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQzMl90IHNlc3Npb25JZCwgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSk7Citib29sIGNzcl9pc19zZXRfa2V5X2FsbG93ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKKwordm9pZCBjc3Jfc2V0X29wcG9zaXRlX2JhbmRfY2hhbm5lbF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9zYXZlX3ByZWZlcnJlZF9uZXR3b3JrX2ZvdW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRTaXJQcmVmTmV0d29ya0ZvdW5kSW5kICoKKwkJcFByZWZOZXR3b3JrRm91bmRJbmQpOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIGlzIGEgMTFyIGFzc29jIG9yIG5vdCAqLworYm9vbCBjc3Jfcm9hbV9pczExcl9hc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKy8qIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBhc3NvY2lhdGlvbiBpcyBhIEVTRSBhc3NvYyBvciBub3QgKi8KK2Jvb2wgY3NyX3JvYW1faXNfZXNlX2Fzc29jKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK2Jvb2wgY3NyX3JvYW1faXNfZXNlX2luaV9mZWF0dXJlX2VuYWJsZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Citib29sIGNzcl9uZWlnaGJvcl9yb2FtX2lzX2VzZV9hc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCk7CisjZW5kaWYKKworLyogUmVtb3ZlIHRoaXMgY29kZSBvbmNlIFNMTV9TZXNzaW9uaXphdGlvbiBpcyBzdXBwb3J0ZWQgKi8KK3ZvaWQgY3NyX2Rpc2Nvbm5lY3RfYWxsX2FjdGl2ZV9zZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKy8qIFJldHVybnMgd2hldGhlciAiTGVnYWN5IEZhc3QgUm9hbWluZyIgaXMgZW5hYmxlZC4uLm9yIG5vdCAqLworYm9vbCBjc3Jfcm9hbV9pc19mYXN0X3JvYW1fZW5hYmxlZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpOworYm9vbCBjc3Jfcm9hbV9pc19yb2FtX29mZmxvYWRfc2Nhbl9lbmFibGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworYm9vbCBjc3JfaXNfY2hhbm5lbF9wcmVzZW50X2luX2xpc3QodWludDhfdCAqcENoYW5uZWxMaXN0LCBpbnQgbnVtQ2hhbm5lbHMsCisJCXVpbnQ4X3QgY2hhbm5lbCk7CitDREZfU1RBVFVTIGNzcl9hZGRfdG9fY2hhbm5lbF9saXN0X2Zyb250KHVpbnQ4X3QgKnBDaGFubmVsTGlzdCwgaW50IG51bUNoYW5uZWxzLAorCQl1aW50OF90IGNoYW5uZWwpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9vZmZsb2FkX3NjYW5fcnNwX2hkbHIodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdHBTaXJSb2FtT2ZmbG9hZFNjYW5Sc3Agc2Nhbk9mZmxvYWRSc3ApOworQ0RGX1NUQVRVUyBjc3JfaGFuZG9mZl9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl0Q3NySGFuZG9mZlJlcXVlc3QgKnBIYW5kb2ZmSW5mbyk7Citib29sIGNzcl9yb2FtX2lzX3N0YV9tb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7CisjZW5kaWYKKworLyogUG9zdCBDaGFubmVsIENoYW5nZSBJbmRpY2F0aW9uICovCitDREZfU1RBVFVTIGNzcl9yb2FtX2NoYW5uZWxfY2hhbmdlX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkLCB1aW50OF90IGNiX21vZGUsCisJCXRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSk7CisKKy8qIFBvc3QgQmVhY29uIFR4IFN0YXJ0IEluZGljYXRpb24gKi8KK0NERl9TVEFUVVMgY3NyX3JvYW1fc3RhcnRfYmVhY29uX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkLCB1aW50OF90IGRmc0NhY1dhaXRTdGF0dXMpOworCitDREZfU1RBVFVTCitjc3Jfcm9hbV9zZW5kX2NoYW5fc3dfaWVfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkLAorCQl1aW50OF90IHRhcmdldENoYW5uZWwsIHVpbnQ4X3QgY3NhSWVSZXFkLCB1aW50OF90IGNoX2JhbmR3aWR0aCk7CitDREZfU1RBVFVTCitjc3Jfcm9hbV9tb2RpZnlfYWRkX2llcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0U2lyTW9kaWZ5SUUgKnBNb2RpZnlJRSwgZVVwZGF0ZUlFc1R5cGUgdXBkYXRlVHlwZSk7CitDREZfU1RBVFVTCitjc3Jfcm9hbV91cGRhdGVfYWRkX2llcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0U2lyVXBkYXRlSUUgKnBVcGRhdGVJRSwgZVVwZGF0ZUlFc1R5cGUgdXBkYXRlVHlwZSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECit2b2lkIGNzcl9wcm9jZXNzX3JvYW1fb2ZmbG9hZF9zeW5jaF9pbmQodEhhbEhhbmRsZSBoSGFsLAorCQlyb2FtX29mZmxvYWRfc3luY2hfaW5kICogcm9hbV9zeW5jaF9pbmRfcHRyKTsKK0NERl9TVEFUVVMgY3NyX3NjYW5fc2F2ZV9yb2FtX29mZmxvYWRfYXBfdG9fc2Nhbl9jYWNoZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQlyb2FtX29mZmxvYWRfc3luY2hfaW5kICpyb2FtX3N5bmNoX2luZF9wdHIpOwordm9pZCBjc3JfcHJvY2Vzc19ob19mYWlsX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKTsKKyNlbmRpZgorYm9vbCBjc3Jfc3RvcmVfam9pbnJlcV9wYXJhbSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl0Q3NyUm9hbVByb2ZpbGUgKnByb2ZpbGUsCisJCXRTY2FuUmVzdWx0SGFuZGxlIHNjYW5fY2FjaGUsCisJCXVpbnQzMl90ICpyb2FtX2lkLAorCQl1aW50MzJfdCBzZXNzaW9uX2lkKTsKK2Jvb2wgY3NyX2NsZWFyX2pvaW5yZXFfcGFyYW0odHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCk7CitDREZfU1RBVFVTIGNzcl9pc3N1ZV9zdG9yZWRfam9pbnJlcSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50MzJfdCAqcm9hbV9pZCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAordm9pZCBjc3JfZGlhZ19ldmVudF9yZXBvcnQodHBBbmlTaXJHbG9iYWwgcG1hYywgdWludDE2X3QgZXZlbnRfdHlwZSwKKwkJCSAgIHVpbnQxNl90IHN0YXR1cywgdWludDE2X3QgcmVhc29uY29kZSk7CisjZW5kaWYKK0NERl9TVEFUVVMgY3NyX2dldF9jaGFubmVsc19hbmRfcG93ZXIodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8qIGNzcl9zY2FuX3Byb2Nlc3Nfc2luZ2xlX2Jzc2Rlc2NyKCkgLSBBZGQgYSBic3NkZXNjcmlwdG9yIHRvIHNjYW4gdGFibGUKKyAqCisgKiBAbWFjX2N0eCAtIE1BQyBjb250ZXh0CisgKiBAYnNzZGVzY3IgLSBQb2ludGVyIHRvIEJTUyBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgZXZlcnl0aGluZyBmcm9tIGJlYWNvbi9wcm9iZSByZXNwb25zZSBmcmFtZSBhbmQgYWRkaXRpb25hbAorICogICAgICAgICAgICAgaW5mb3JtYXRpb24uCisgKiBAc2Nhbl9pZCAtIFNjYW4gaWRlbnRpZmllciBvZiB0aGUgc2NhbiByZXF1ZXN0IHRoYXQgd2FzIHJ1bm5pbmcKKyAqICAgICAgICAgICAgd2hlbiB0aGlzIGJlYWNvbiB3YXMgcmVjZWl2ZWQuIFJlc2VydmVkIGZvciBmdXR1cmUgd2hlbgorICogICAgICAgICAgICBmaXJtd2FyZSBwcm92aWRlcyB0aGF0IGluZm9ybWF0aW9uLgorICogQGZsYWdzIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgKgorICogQ2FsbGJhY2sgcm91dGluZSBjYWxsZWQgYnkgTElNIHdoZW4gaXQgcmVjZWl2ZXMgYSBiZWFjb24gb3IgcHJvYmUgcmVzcG9uc2UKKyAqIGZyb20gdGhlIGRldmljZS4gODAyLjExIGZyYW1lIGlzIGFscmVhZHkgY29udmVydGVkIHRvIGludGVybmFsCisgKiB0U2lyQnNzRGVzY3JpcHRpb24gZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuOiAwIG9yIG90aGVyIGVycm9yIGNvZGVzLgorICovCisKK0NERl9TVEFUVVMgY3NyX3NjYW5fcHJvY2Vzc19zaW5nbGVfYnNzZGVzY3IodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzY3JpcHRpb24sCisJCXVpbnQzMl90IHNjYW5faWQsIHVpbnQzMl90IGZsYWdzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9pbmMvY3NyX2xpbmtfbGlzdC5oIGIvY29yZS9zbWUvaW5jL2Nzcl9saW5rX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTQ2MjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zbWUvaW5jL2Nzcl9saW5rX2xpc3QuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIFxmaWxlIGNzcl9saW5rX2xpc3QuaAorICoKKyAqIEV4cG9ydHMgYW5kIHR5cGVzIGZvciB0aGUgQ29tbW9uIGxpbmsgbGlzdCBpbnRlcmZhY2VzLgorICovCisKKyNpZm5kZWYgQ1NSX0xJTktfTElTVF9IX18KKyNkZWZpbmUgQ1NSX0xJTktfTElTVF9IX18KKworI2luY2x1ZGUgImNkZl9sb2NrLmgiCisjaW5jbHVkZSAiY2RmX21jX3RpbWVyLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgInNpcl90eXBlcy5oIgorCisjZGVmaW5lIExMX0FDQ0VTU19MT0NLICAgICAgICAgIHRydWUKKyNkZWZpbmUgTExfQUNDRVNTX05PTE9DSyAgICAgICAgZmFsc2UKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTGlzdEVsZW0geworCXN0cnVjdCB0YWdMaXN0RWxlbSAqbGFzdDsKKwlzdHJ1Y3QgdGFnTGlzdEVsZW0gKm5leHQ7Cit9IHRMaXN0RWxlbTsKKwordHlwZWRlZiBlbnVtIHsKKwlMSVNUX0ZMQUdfQ0xPU0UgPSAwLAorCUxJU1RfRkxBR19PUEVOID0gMHhhMWIyYzRkNywKK30gdExpc3RGbGFnOworCisvKiBUaGlzIGlzIGEgY2lyY3VsYXIgZG91YmxlIGxpbmsgbGlzdCAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnRGJsTGlua0xpc3QgeworCXRMaXN0RWxlbSBMaXN0SGVhZDsKKwljZGZfbXV0ZXhfdCBMb2NrOworCXVpbnQzMl90IENvdW50OworCXRIZGRIYW5kbGUgaEhkZDsKKwl0TGlzdEZsYWcgRmxhZzsKKwkvKmNvbW1hbmQgZGVidWdnaW5nICovCisJdWludDMyX3QgY21kVGltZW91dER1cmF0aW9uOyAgICAgICAvKiBjb21tYW5kIHRpbWVvdXQgZHVyYXRpb24gKi8KKwljZGZfbWNfdGltZXJfdCAqY21kVGltZW91dFRpbWVyOyAgIC8qY29tbWFuZCB0aW1lb3V0IFRpbWVyICovCit9IHREYmxMaW5rTGlzdDsKKworLyoKKyAqIFRvIGdldCB0aGUgYWRkcmVzcyBvZiBhbiBvYmplY3Qgb2YgKHR5cGUpIGJhc2Ugb24gdGhlIChhZGRyZXNzKQorICogb2Ygb25lIG9mIGl0cyAoZmllbGQpCisgKi8KKyNkZWZpbmUgR0VUX0JBU0VfQUREUihhZGRyZXNzLCB0eXBlLCBmaWVsZCkgKCh0eXBlICopKCBcCisJCQkodWludDhfdCAqKShhZGRyZXNzKSAtIFwKKwkJCSh1aW50OF90ICopKCYoKHR5cGUgKikwKS0+ZmllbGQpKSkKKy8qIFRvIGdldCB0aGUgb2Zmc2V0IG9mIChmaWVsZCkgaW5zaWRlIHN0cnVjdHVyZSAodHlwZSkgKi8KKyNkZWZpbmUgR0VUX0ZJRUxEX09GRlNFVCh0eXBlLCBmaWVsZCkgICgodWludHB0cl90KSgmKCgodHlwZSAqKTApLT5maWVsZCkpKQorI2RlZmluZSBHRVRfUk9VTkRfVVAoX0ZpZWxkLCBfQm91bmRhcnkpIFwKKwkoKChfRmllbGQpICsgKChfQm91bmRhcnkpIC0gMSkpICAmIH4oKF9Cb3VuZGFyeSkgLSAxKSkKKyNkZWZpbmUgQklUU19PTihfRmllbGQsIF9CaXRtYXNrKSAgKChfRmllbGQpIHw9ICAoX0JpdG1hc2spKQorI2RlZmluZSBCSVRTX09GRihfRmllbGQsIF9CaXRtYXNrKSAoKF9GaWVsZCkgJj0gfihfQml0bWFzaykpCisjZGVmaW5lIENTUl9NQVgoYSwgYikgICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIENTUl9NSU4oYSwgYikgICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIGNzcklzTGlzdEVtcHR5KHBIZWFkKSAoKHBIZWFkKS0+bmV4dCA9PSAocEhlYWQpKQorCit1aW50MzJfdCBjc3JfbGxfY291bnQodERibExpbmtMaXN0ICpwTGlzdCk7CitDREZfU1RBVFVTIGNzcl9sbF9vcGVuKHRIZGRIYW5kbGUgaEhkZCwgdERibExpbmtMaXN0ICpwTGlzdCk7Cit2b2lkIGNzcl9sbF9jbG9zZSh0RGJsTGlua0xpc3QgKnBMaXN0KTsKK3ZvaWQgY3NyX2xsX2xvY2sodERibExpbmtMaXN0ICpwTGlzdCk7Cit2b2lkIGNzcl9sbF91bmxvY2sodERibExpbmtMaXN0ICpwTGlzdCk7Citib29sIGNzcl9sbF9pc19saXN0X2VtcHR5KHREYmxMaW5rTGlzdCAqcExpc3QsIGJvb2wgZkludGVybG9ja2VkKTsKK3ZvaWQgY3NyX2xsX2luc2VydF9oZWFkKHREYmxMaW5rTGlzdCAqcExpc3QsIHRMaXN0RWxlbSAqcEVudHJ5LAorCQlib29sIGZJbnRlcmxvY2tlZCk7Cit2b2lkIGNzcl9sbF9pbnNlcnRfdGFpbCh0RGJsTGlua0xpc3QgKnBMaXN0LCB0TGlzdEVsZW0gKnBFbnRyeSwKKwkJYm9vbCBmSW50ZXJsb2NrZWQpOworLyogVGhpcyBmdW5jdGlvbiBwdXQgcE5ld0VudHJ5IGJlZm9yZSBwRW50cnkuIENhbGxlciBzaG91bGQgaGF2ZSBmb3VuZCBwRW50cnkgKi8KK3ZvaWQgY3NyX2xsX2luc2VydF9lbnRyeSh0RGJsTGlua0xpc3QgKnBMaXN0LCB0TGlzdEVsZW0gKnBFbnRyeSwKKwkJdExpc3RFbGVtICpwTmV3RW50cnksIGJvb2wgZkludGVybG9ja2VkKTsKK3RMaXN0RWxlbSAqY3NyX2xsX3BlZWtfaGVhZCh0RGJsTGlua0xpc3QgKnBMaXN0LCBib29sIGZJbnRlcmxvY2tlZCk7Cit0TGlzdEVsZW0gKmNzcl9sbF9wZWVrX3RhaWwodERibExpbmtMaXN0ICpwTGlzdCwgYm9vbCBmSW50ZXJsb2NrZWQpOwordExpc3RFbGVtICpjc3JfbGxfcmVtb3ZlX2hlYWQodERibExpbmtMaXN0ICpwTGlzdCwgYm9vbCBmSW50ZXJsb2NrZWQpOwordExpc3RFbGVtICpjc3JfbGxfcmVtb3ZlX3RhaWwodERibExpbmtMaXN0ICpwTGlzdCwgYm9vbCBmSW50ZXJsb2NrZWQpOworYm9vbCBjc3JfbGxfcmVtb3ZlX2VudHJ5KHREYmxMaW5rTGlzdCAqcExpc3QsIHRMaXN0RWxlbSAqcEVudHJ5VG9SZW1vdmUsCisJCWJvb2wgZkludGVybG9ja2VkKTsKK3ZvaWQgY3NyX2xsX3B1cmdlKHREYmxMaW5rTGlzdCAqcExpc3QsIGJvb2wgZkludGVybG9ja2VkKTsKKy8qIGNzcl9sbF9uZXh0IHJldHVybiBOVUxMIGlmIHJlYWNoaW5nIHRoZSBlbmQgb3IgbGlzdCBpcyBlbXB0eSAqLwordExpc3RFbGVtICpjc3JfbGxfbmV4dCh0RGJsTGlua0xpc3QgKnBMaXN0LCB0TGlzdEVsZW0gKnBFbnRyeSwKKwkJYm9vbCBmSW50ZXJsb2NrZWQpOwordExpc3RFbGVtICpjc3JfbGxfcHJldmlvdXModERibExpbmtMaXN0ICpwTGlzdCwgdExpc3RFbGVtICpwRW50cnksCisJCWJvb2wgZkludGVybG9ja2VkKTsKK2Jvb2wgY3NyX2xsX2ZpbmRfZW50cnkodERibExpbmtMaXN0ICpwTGlzdCwgdExpc3RFbGVtICpwRW50cnlUb0ZpbmQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9pbmMvY3NyX25laWdoYm9yX3JvYW0uaCBiL2NvcmUvc21lL2luYy9jc3JfbmVpZ2hib3Jfcm9hbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZjI3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvY3NyX25laWdoYm9yX3JvYW0uaApAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBcZmlsZSBjc3JfbmVpZ2hib3Jfcm9hbS5oCisgKgorICogRXhwb3J0cyBhbmQgdHlwZXMgZm9yIHRoZSBuZWlnaGJvciByb2FtaW5nIGFsZ29yaXRobSB3aGljaCBpcyBzZXBjaWZpY2FsbHkKKyAqIGRlc2lnbmVkIGZvciBBbmRyb2lkLgorICovCisKKyNpZm5kZWYgQ1NSX05FSUdIQk9SX1JPQU1fSAorI2RlZmluZSBDU1JfTkVJR0hCT1JfUk9BTV9ICisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworI2luY2x1ZGUgInNtZV9hcGkuaCIKKworI2RlZmluZSBST0FNX0FQX0FHRV9MSU1JVF9NUyAgICAgICAgICAgICAgICAgICAgIDEwMDAwCisKKy8qIEVudW1lcmF0aW9uIG9mIHZhcmlvdXMgc3RhdGVzIGluIG5laWdoYm9yIHJvYW0gYWxnb3JpdGhtICovCit0eXBlZGVmIGVudW0geworCWVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DTE9TRUQsCisJZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQsCisJZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NPTk5FQ1RFRCwKKwllQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVBU1NPQ0lBVElORywKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9QUkVBVVRIRU5USUNBVElORywKKwllQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUFJFQVVUSF9ET05FLAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisJZU5FSUdIQk9SX1NUQVRFX01BWAorfSBlQ3NyTmVpZ2hib3JSb2FtU3RhdGU7CisKKy8qIFBhcmFtZXRlcnMgdGhhdCBhcmUgb2J0YWluZWQgZnJvbSBDRkcgKi8KK3R5cGVkZWYgc3RydWN0IHNDc3JOZWlnaGJvclJvYW1DZmdQYXJhbXMgeworCXVpbnQ4X3QgbWF4TmVpZ2hib3JSZXRyaWVzOworCXVpbnQzMl90IG5laWdoYm9yU2NhblBlcmlvZDsKKwl0Q3NyQ2hhbm5lbEluZm8gY2hhbm5lbEluZm87CisJdWludDhfdCBuZWlnaGJvckxvb2t1cFRocmVzaG9sZDsKKwl1aW50OF90IG5laWdoYm9yUmVhc3NvY1RocmVzaG9sZDsKKwl1aW50MzJfdCBtaW5DaGFubmVsU2NhblRpbWU7CisJdWludDMyX3QgbWF4Q2hhbm5lbFNjYW5UaW1lOworCXVpbnQxNl90IG5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2Q7CisJdWludDE2X3QgZW1wdHlTY2FuUmVmcmVzaFBlcmlvZDsKKwl1aW50OF90IG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZjsKKwl1aW50OF90IG5Sb2FtUmVzY2FuUnNzaURpZmY7CisJdWludDhfdCBuUm9hbUJtaXNzRmlyc3RCY250OworCXVpbnQ4X3QgblJvYW1CbWlzc0ZpbmFsQmNudDsKKwl1aW50OF90IG5Sb2FtQmVhY29uUnNzaVdlaWdodDsKKwl1aW50OF90IGRlbGF5X2JlZm9yZV92ZGV2X3N0b3A7CisJdWludDMyX3QgaGlfcnNzaV9zY2FuX21heF9jb3VudDsKKwl1aW50MzJfdCBoaV9yc3NpX3NjYW5fcnNzaV9kZWx0YTsKKwl1aW50MzJfdCBoaV9yc3NpX3NjYW5fZGVsYXk7CisJaW50MzJfdCBoaV9yc3NpX3NjYW5fcnNzaV91YjsKK30gdENzck5laWdoYm9yUm9hbUNmZ1BhcmFtcywgKnRwQ3NyTmVpZ2hib3JSb2FtQ2ZnUGFyYW1zOworCisjZGVmaW5lIENTUl9ORUlHSEJPUl9ST0FNX0lOVkFMSURfQ0hBTk5FTF9JTkRFWCAgICAyNTUKK3R5cGVkZWYgc3RydWN0IHNDc3JOZWlnaGJvclJvYW1DaGFubmVsSW5mbyB7CisJLyogRmxhZyB0byBtYXJrIHJlY2VwdGlvbiBvZiBJQVBQIE5laWdoYm9yIGxpc3QgKi8KKwlib29sIElBUFBOZWlnaGJvckxpc3RSZWNlaXZlZDsKKwkvKiBDdXJyZW50IGNoYW5uZWwgaW5kZXggdGhhdCBpcyBiZWluZyBzY2FubmVkICovCisJdWludDhfdCBjdXJyZW50Q2hhbkluZGV4OworCS8qIE1heCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gY2hhbm5lbCBsaXN0IGFuZCB0aGUgbGlzdCBvZiBjaGFubmVscyAqLworCXRDc3JDaGFubmVsSW5mbyBjdXJyZW50Q2hhbm5lbExpc3RJbmZvOworfSB0Q3NyTmVpZ2hib3JSb2FtQ2hhbm5lbEluZm8sICp0cENzck5laWdoYm9yUm9hbUNoYW5uZWxJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzQ3NyTmVpZ2hib3JSb2FtQlNTSW5mbyB7CisJdExpc3RFbGVtIExpc3Q7CisJdWludDhfdCBhcFByZWZlcmVuY2VWYWw7CisJdHBTaXJCc3NEZXNjcmlwdGlvbiBwQnNzRGVzY3JpcHRpb247Cit9IHRDc3JOZWlnaGJvclJvYW1CU1NJbmZvLCAqdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNkZWZpbmUgQ1NSX05FSUdIQk9SX1JPQU1fUkVQT1JUX1FVRVJZX1RJTUVPVVQgIDEwMDAgICAgICAgLyogaW4gbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIENTUl9ORUlHSEJPUl9ST0FNX1BSRUFVVEhfUlNQX1dBSVRfTVVMVElQTElFUiAgIDEwIC8qIGluIG1pbGxpc2Vjb25kcyAqLworLyogTWF4IG51bWJlciBvZiBNQUMgYWRkcmVzc2VzIHdpdGggd2hpY2ggdGhlIHByZS1hdXRoIHdhcyBmYWlsZWQgKi8KKyNkZWZpbmUgTUFYX05VTV9QUkVBVVRIX0ZBSUxfTElTVF9BRERSRVNTICAgICAgICAgIDEwCisjZGVmaW5lIE1BWF9CU1NfSU5fTkVJR0hCT1JfUlBUICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU1JfTkVJR0hCT1JfUk9BTV9NQVhfTlVNX1BSRUFVVEhfUkVUUklFUyAgMworCisvKiBCbGFjayBsaXN0ZWQgQVBzLiBMaXN0IG9mIE1BQyBBZGRyZXNzZXMgd2l0aCB3aGljaCB0aGUgUHJlYXV0aCB3YXMgZmFpbGVkICovCit0eXBlZGVmIHN0cnVjdCBzQ3NyUHJlYXV0aEZhaWxMaXN0SW5mbyB7CisJdWludDhfdCBudW1NQUNBZGRyZXNzOworCXRTaXJNYWNBZGRyIG1hY0FkZHJlc3NbTUFYX05VTV9QUkVBVVRIX0ZBSUxfTElTVF9BRERSRVNTXTsKK30gdENzclByZWF1dGhGYWlsTGlzdEluZm8sICp0cENzclByZWF1dGhGYWlsTGlzdEluZm87CisKK3R5cGVkZWYgc3RydWN0IHNDc3JOZWlnaGJvclJlcG9ydEJzc0luZm8geworCXVpbnQ4X3QgY2hhbm5lbE51bTsKKwl1aW50OF90IG5laWdoYm9yU2NvcmU7CisJdFNpck1hY0FkZHIgbmVpZ2hib3JCc3NJZDsKK30gdENzck5laWdoYm9yUmVwb3J0QnNzSW5mbywgKnRwQ3NyTmVpZ2hib3JSZXBvcnRCc3NJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzQ3NyMTFyQXNzb2NOZWlnaGJvckluZm8geworCWJvb2wgcHJlYXV0aFJzcFBlbmRpbmc7CisJYm9vbCBuZWlnaGJvclJwdFBlbmRpbmc7CisJdWludDhfdCBjdXJyZW50TmVpZ2hib3JScHRSZXRyeU51bTsKKwl0Q3NyUHJlYXV0aEZhaWxMaXN0SW5mbyBwcmVBdXRoRmFpbExpc3Q7CisJdWludDMyX3QgbmVpZ2hib3JSZXBvcnRUaW1lb3V0OworCXVpbnQzMl90IFBFUHJlYXV0aFJlc3BUaW1lb3V0OworCXVpbnQ4X3QgbnVtUHJlQXV0aFJldHJpZXM7CisJdERibExpbmtMaXN0IHByZUF1dGhEb25lTGlzdDsgICAvKiBsbGlzdCB3aGljaCBjb25zaXN0cy9wcmVhdXRoIG5vZGVzICovCisJdWludDhfdCBudW1Cc3NGcm9tTmVpZ2hib3JSZXBvcnQ7CisJLyogQ29udGFpbnMgaW5mbyBuZWVkZWQgZHVyaW5nIFJFUE9SVF9TQ0FOIFN0YXRlICovCisJdENzck5laWdoYm9yUmVwb3J0QnNzSW5mbyBuZWlnaGJvUmVwb3J0QnNzSW5mb1tNQVhfQlNTX0lOX05FSUdIQk9SX1JQVF07Cit9IHRDc3IxMXJBc3NvY05laWdoYm9ySW5mbywgKnRwQ3NyMTFyQXNzb2NOZWlnaGJvckluZm87CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKK3R5cGVkZWYgZW51bSB7CisJZUZpcnN0RW1wdHlTY2FuID0gMSwKKwllU2Vjb25kRW1wdHlTY2FuLAorCWVUaGlyZEVtcHR5U2NhbiwKKwllRm91cnRoRW1wdHlTY2FuLAorCWVGaWZ0aEVtcHR5U2NhbiwKKwllTWF4RW1wdHlTY2FuID0gZUZpZnRoRW1wdHlTY2FuLAorfSBlTmVpZ2hib3JSb2FtRW1wdHlTY2FuQ291bnQ7CisKK3R5cGVkZWYgZW51bSB7CisJREVGQVVMVF9TQ0FOID0gMCwKKwlTUExJVF9TQ0FOX09DQ1VQSUVEX0xJU1QgPSAxLAorfSBlTmVpZ2hib3JSb2FtU2Nhbk1vZGU7CisjZW5kaWYKKworLyogQ29tcGxldGUgY29udHJvbCBpbmZvcm1hdGlvbiBmb3IgbmVpZ2hib3Igcm9hbSBhbGdvcml0aG0gKi8KK3R5cGVkZWYgc3RydWN0IHNDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyB7CisJZUNzck5laWdoYm9yUm9hbVN0YXRlIG5laWdoYm9yUm9hbVN0YXRlOworCWVDc3JOZWlnaGJvclJvYW1TdGF0ZSBwcmV2TmVpZ2hib3JSb2FtU3RhdGU7CisJdENzck5laWdoYm9yUm9hbUNmZ1BhcmFtcyBjZmdQYXJhbXM7CisJc3RydWN0IGNkZl9tYWNfYWRkciBjdXJyQVBic3NpZDsgIC8qIGN1cnJlbnQgYXNzb2MgQVAgKi8KKwl1aW50OF90IGN1cnJBUG9wZXJhdGlvbkNoYW5uZWw7IC8qIGN1cnJlbnQgYXNzb2MgQVAgKi8KKwl0Q3NyTmVpZ2hib3JSb2FtQ2hhbm5lbEluZm8gcm9hbUNoYW5uZWxJbmZvOworCXVpbnQ4X3QgY3VycmVudE5laWdoYm9yTG9va3VwVGhyZXNob2xkOworCXVpbnQ4X3QgY3VycmVudE9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmOworCXVpbnQ4X3QgY3VycmVudFJvYW1SZXNjYW5Sc3NpRGlmZjsKKwl0RGJsTGlua0xpc3Qgcm9hbWFibGVBUExpc3Q7ICAgIC8qIExpc3Qgb2YgY3VycmVudCBGVCBjYW5kaWRhdGVzICovCisJdENzclJvYW1Qcm9maWxlIGNzck5laWdoYm9yUm9hbVByb2ZpbGU7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlib29sIGlzMTFyQXNzb2M7CisJdENzcjExckFzc29jTmVpZ2hib3JJbmZvIEZUUm9hbUluZm87CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJYm9vbCBpc0VTRUFzc29jOworCWJvb2wgaXNWT0FkbWl0dGVkOworCXVpbnQxNl90IE1pblFCc3NMb2FkUmVxdWlyZWQ7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJLyoKKwkgKiBQcmV2aW91cyBjb25uZWN0ZWQgcHJvZmlsZS4KKwkgKiBJZiB0aGUgbmV3IHByb2ZpbGUgZG9lcyBub3QgbWF0Y2ggcHJldmlvdXMgd2UgcmUtaW5pdGlhbGl6ZQorCSAqIG9jY3VwaWVkIGNoYW5uZWwgbGlzdAorCSAqLworCXRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSBwcmV2Q29ublByb2ZpbGU7CisJLyogdXBwZXIgbGF5ZXIgcmVxdWVzdGVkIGEgcmVhc3NvYyAqLworCXVpbnQ4X3QgdU9zUmVxdWVzdGVkSGFuZG9mZjsKKwkvKiBoYW5kb2ZmIHJlbGF0ZWQgaW5mbyBjYW1lIHdpdGggdXBwZXIgbGF5ZXIncyByZXEgZm9yIHJlYXNzb2MgKi8KKwl0Q3NySGFuZG9mZlJlcXVlc3QgaGFuZG9mZlJlcUluZm87CisjZW5kaWYKKwl1aW50OF90IGN1cnJlbnRSb2FtQm1pc3NGaXJzdEJjbnQ7CisJdWludDhfdCBjdXJyZW50Um9hbUJtaXNzRmluYWxCY250OworCXVpbnQ4X3QgY3VycmVudFJvYW1CZWFjb25Sc3NpV2VpZ2h0OworCXVpbnQ4X3QgbGFzdF9zZW50X2NtZDsKK30gdENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvLCAqdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbzsKKworLyogQWxsIHRoZSBuZWNlc3NhcnkgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFyZSBoZXJlICovCitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX2luZGljYXRlX2Nvbm5lY3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQsIENERl9TVEFUVVMgc3RhdHVzKTsKK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1faW5kaWNhdGVfZGlzY29ubmVjdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl1aW50OF90IHNlc3Npb25JZCk7Citib29sIGNzcl9uZWlnaGJvcl9yb2FtX2lzX2hhbmRvZmZfaW5fcHJvZ3Jlc3ModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQpOwordm9pZCBjc3JfbmVpZ2hib3Jfcm9hbV9yZXF1ZXN0X2hhbmRvZmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV9pbml0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK3ZvaWQgY3NyX25laWdoYm9yX3JvYW1fY2xvc2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpOwordm9pZCBjc3JfbmVpZ2hib3Jfcm9hbV9wdXJnZV9wcmVhdXRoX2ZhaWxlZF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV90cmFuc2l0X3RvX2NmZ19jaGFuX3NjYW4odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBjc3JOZWlnaGJvclJvYW1UcmFuc2l0aW9uVG9QcmVhdXRoRG9uZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1fcHJlcGFyZV9zY2FuX3Byb2ZpbGVfZmlsdGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRDc3JTY2FuUmVzdWx0RmlsdGVyICpwU2NhbkZpbHRlciwgdWludDhfdCBzZXNzaW9uSWQpOworYm9vbCBjc3JfbmVpZ2hib3Jfcm9hbV9nZXRfaGFuZG9mZl9hcF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRwQ3NyTmVpZ2hib3JSb2FtQlNTSW5mbyBwSGFuZG9mZk5vZGUsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1fcHJlYXV0aF9yc3BfaGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl1aW50OF90IHNlc3Npb25JZCwgdFNpclJldFN0YXR1cyBsaW1TdGF0dXMpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCitib29sIGNzcl9uZWlnaGJvcl9yb2FtX2lzMTFyX2Fzc29jKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKKyNlbmRpZgorQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV9jcmVhdGVfY2hhbl9saXN0X2Zyb21fbmVpZ2hib3JfcmVwb3J0KAorCQl0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCk7Cit2b2lkIGNzcl9uZWlnaGJvcl9yb2FtX3RyYW5pc3Rpb25fcHJlYXV0aF9kb25lX3RvX2Rpc2Nvbm5lY3RlZCgKKwkJdHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpOworYm9vbCBjc3JfbmVpZ2hib3Jfcm9hbV9zdGF0ZV9wcmVhdXRoX2RvbmUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQpOworYm9vbCBjc3JfbmVpZ2hib3JfbWlkZGxlX29mX3JvYW1pbmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV9zZXRfbG9va3VwX3Jzc2lfdGhyZXNob2xkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLCB1aW50OF90IG5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZCk7CitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX3NldF9vcHBvcnR1bmlzdGljX3NjYW5fdGhyZXNob2xkX2RpZmYoCisJCXRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl1aW50OF90IG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZik7CitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX3NldF9yb2FtX3Jlc2Nhbl9yc3NpX2RpZmYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQsIHVpbnQ4X3QgblJvYW1SZXNjYW5Sc3NpRGlmZik7CitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX3NldF9yb2FtX2JtaXNzX2ZpcnN0X2JjbnQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQsIHVpbnQ4X3QgblJvYW1CbWlzc0ZpcnN0QmNudCk7CitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX3NldF9yb2FtX2JtaXNzX2ZpbmFsX2JjbnQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQsIHVpbnQ4X3QgblJvYW1CbWlzc0ZpbmFsQmNudCk7CitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX3NldF9yb2FtX2JlYWNvbl9yc3NpX3dlaWdodCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl1aW50OF90IHNlc3Npb25JZCwgdWludDhfdCBuUm9hbUJlYWNvblJzc2lXZWlnaHQpOworQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV91cGRhdGVfZmFzdF9yb2FtaW5nX2VuYWJsZWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQsIGNvbnN0IGJvb2wgZmFzdFJvYW1FbmFibGVkKTsKK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1fdXBkYXRlX2VzZV9tb2RlX2VuYWJsZWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQsIGNvbnN0IGJvb2wgZXNlTW9kZSk7CitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX2NoYW5uZWxzX2ZpbHRlcl9ieV9jdXJyZW50X2JhbmQoCisJCXRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl1aW50OF90ICpwSW5wdXRDaGFubmVsTGlzdCwKKwkJdWludDhfdCBpbnB1dE51bU9mQ2hhbm5lbHMsCisJCXVpbnQ4X3QgKnBPdXRwdXRDaGFubmVsTGlzdCwKKwkJdWludDhfdCAqcE1lcmdlZE91dHB1dE51bU9mQ2hhbm5lbHMpOworQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV9tZXJnZV9jaGFubmVsX2xpc3RzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3QgKnBJbnB1dENoYW5uZWxMaXN0LAorCQl1aW50OF90IGlucHV0TnVtT2ZDaGFubmVscywKKwkJdWludDhfdCAqcE91dHB1dENoYW5uZWxMaXN0LAorCQl1aW50OF90IG91dHB1dE51bU9mQ2hhbm5lbHMsCisJCXVpbnQ4X3QgKnBNZXJnZWRPdXRwdXROdW1PZkNoYW5uZWxzKTsKK3ZvaWQgY3NyX3JvYW1fcmVzZXRfcm9hbV9wYXJhbXModHBBbmlTaXJHbG9iYWwgbWFjX3B0cik7CisjZGVmaW5lIFJPQU1fU0NBTl9PRkZMT0FEX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBST0FNX1NDQU5fT0ZGTE9BRF9TVE9QICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUk9BTV9TQ0FOX09GRkxPQURfUkVTVEFSVCAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcgICAgICAgICAgICAgICAgNAorI2RlZmluZSBST0FNX1NDQU5fT0ZGTE9BRF9BQk9SVF9TQ0FOICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBSRUFTT05fQ09OTkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkVBU09OX0NIQU5ORUxfTElTVF9DSEFOR0VEICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFJFQVNPTl9MT09LVVBfVEhSRVNIX0NIQU5HRUQgICAgICAgICAgICAgICAgMworI2RlZmluZSBSRUFTT05fRElTQ09OTkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUkVBU09OX1JTU0lfRElGRl9DSEFOR0VEICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFJFQVNPTl9FU0VfSU5JX0NGR19DSEFOR0VEICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBSRUFTT05fTkVJR0hCT1JfU0NBTl9SRUZSRVNIX1BFUklPRF9DSEFOR0VEIDcKKyNkZWZpbmUgUkVBU09OX1ZBTElEX0NIQU5ORUxfTElTVF9DSEFOR0VEICAgICAgICAgICA4CisjZGVmaW5lIFJFQVNPTl9GTFVTSF9DSEFOTkVMX0xJU1QgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBSRUFTT05fRU1QVFlfU0NBTl9SRUZfUEVSSU9EX0NIQU5HRUQgICAgICAgIDEwCisjZGVmaW5lIFJFQVNPTl9QUkVBVVRIX0ZBSUxFRF9GT1JfQUxMICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgUkVBU09OX05PX0NBTkRfRk9VTkRfT1JfTk9UX1JPQU1JTkdfTk9XICAgICAxMgorI2RlZmluZSBSRUFTT05fTlBST0JFU19DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFJFQVNPTl9IT01FX0FXQVlfVElNRV9DSEFOR0VEICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUkVBU09OX09TX1JFUVVFU1RFRF9ST0FNSU5HX05PVyAgICAgICAgICAgICAxNQorI2RlZmluZSBSRUFTT05fU0NBTl9DSF9USU1FX0NIQU5HRUQgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJFQVNPTl9TQ0FOX0hPTUVfVElNRV9DSEFOR0VEICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgUkVBU09OX09QUE9SVFVOSVNUSUNfVEhSRVNIX0RJRkZfQ0hBTkdFRCAgICAxOAorI2RlZmluZSBSRUFTT05fUk9BTV9SRVNDQU5fUlNTSV9ESUZGX0NIQU5HRUQgICAgICAgIDE5CisjZGVmaW5lIFJFQVNPTl9ST0FNX0JNSVNTX0ZJUlNUX0JDTlRfQ0hBTkdFRCAgICAgICAgMjAKKyNkZWZpbmUgUkVBU09OX1JPQU1fQk1JU1NfRklOQUxfQkNOVF9DSEFOR0VEICAgICAgICAyMQorI2RlZmluZSBSRUFTT05fUk9BTV9CRUFDT05fUlNTSV9XRUlHSFRfQ0hBTkdFRCAgICAgIDIyCisjZGVmaW5lIFJFQVNPTl9ST0FNX0RGU19TQ0FOX01PREVfQ0hBTkdFRCAgICAgICAgICAgMjMKKyNkZWZpbmUgUkVBU09OX1JPQU1fQUJPUlRfUk9BTV9TQ0FOICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBSRUFTT05fUk9BTV9FWFRfU0NBTl9QQVJBTVNfQ0hBTkdFRCAgICAgICAgIDI1CisjZGVmaW5lIFJFQVNPTl9ST0FNX1NFVF9TU0lEX0FMTE9XRUQgICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgUkVBU09OX1JPQU1fU0VUX0ZBVk9SRURfQlNTSUQgICAgICAgICAgICAgICAyNworI2RlZmluZSBSRUFTT05fUk9BTV9HT09EX1JTU0lfQ0hBTkdFRCAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIFJFQVNPTl9ST0FNX1NFVF9CTEFDS0xJU1RfQlNTSUQgICAgICAgICAgICAgMjkKKyNkZWZpbmUgUkVBU09OX1JPQU1fU0NBTl9ISV9SU1NJX01BWENPVU5UX0NIQU5HRUQgICAzMAorI2RlZmluZSBSRUFTT05fUk9BTV9TQ0FOX0hJX1JTU0lfREVMVEFfQ0hBTkdFRCAgICAgIDMxCisjZGVmaW5lIFJFQVNPTl9ST0FNX1NDQU5fSElfUlNTSV9ERUxBWV9DSEFOR0VEICAgICAgMzIKKyNkZWZpbmUgUkVBU09OX1JPQU1fU0NBTl9ISV9SU1NJX1VCX0NIQU5HRUQgICAgICAgICAzMworCitDREZfU1RBVFVTIGNzcl9yb2FtX29mZmxvYWRfc2Nhbih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwkJdWludDhfdCBjb21tYW5kLCB1aW50OF90IHJlYXNvbik7CitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX2NhbmRpZGF0ZV9mb3VuZF9pbmRfaGRscih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl2b2lkICpwTXNnKTsKK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1faGFuZG9mZl9yZXFfaGRscih0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnKTsKK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1fcHJvY2VlZF93aXRoX2hhbmRvZmZfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1fc3NzaWRfc2Nhbl9kb25lKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLCBDREZfU1RBVFVTIHN0YXR1cyk7CitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX3N0YXJ0X2xmcl9zY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkKTsKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKK0NERl9TVEFUVVMgY3NyX3NldF9jY2ttX2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGNvbnN0IHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB1aW50OF90ICpwQ2NrbUllLCBjb25zdCB1aW50OF90IGNjS21JZUxlbik7CitDREZfU1RBVFVTIGNzcl9yb2FtX3JlYWRfdHNmKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBUaW1lc3RhbXAsCisJCWNvbnN0IHVpbnQ4X3Qgc2Vzc2lvbklkKTsKKyNlbmRpZiAvKkZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECitDREZfU1RBVFVTIGNzcl9yb2FtX29mZmxvYWRfc2VuZF9zeW5jaF9jbmYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV9vZmZsb2FkX3VwZGF0ZV9wcmVhdXRoX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJcm9hbV9vZmZsb2FkX3N5bmNoX2luZCAqcm9hbV9zeW5jaF9pbmRfcHRyLCB1aW50OF90IHNlc3Npb25JZCk7CisjZW5kaWYKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORyAqLworI2VuZGlmIC8qIENTUl9ORUlHSEJPUl9ST0FNX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvc21lL2luYy9jc3Jfc3VwcG9ydC5oIGIvY29yZS9zbWUvaW5jL2Nzcl9zdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4NGU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL2luYy9jc3Jfc3VwcG9ydC5oCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIFxmaWxlIGNzcl9zdXBwb3J0LmgKKyAqCisgKiBFeHBvcnRzIGFuZCB0eXBlcyBmb3IgdGhlIENvbW1vbiBTY2FuIGFuZCBSb2FtaW5nIHN1cHBvcnRpbmcgaW50ZXJmYWNlcy4KKyAqLworI2lmbmRlZiBDU1JfU1VQUE9SVF9IX18KKyNkZWZpbmUgQ1NSX1NVUFBPUlRfSF9fCisKKyNpbmNsdWRlICJjc3JfbGlua19saXN0LmgiCisjaW5jbHVkZSAiY3NyX2FwaS5oIgorI2luY2x1ZGUgImNkc19yZWdfc2VydmljZS5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyNkZWZpbmUgQ1NSX1dBUElfT1VJX1NJWkUgICAgICAgICAgICAgICg0KQorI2RlZmluZSBDU1JfV0FQSV9WRVJTSU9OX1NVUFBPUlRFRCAgICAgKDEpCisjZGVmaW5lIENTUl9XQVBJX01BWF9BVVRIX1NVSVRFUyAgICAgICAoMikKKyNkZWZpbmUgQ1NSX1dBUElfTUFYX0NZUEhFUlMgICAgICAgICAgICg1KQorI2RlZmluZSBDU1JfV0FQSV9NQVhfVU5JQ0FTVF9DWVBIRVJTICAgKDUpCisjZGVmaW5lIENTUl9XQVBJX01BWF9NVUxUSUNBU1RfQ1lQSEVSUyAoMSkKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisjZGVmaW5lIENTUl9SU05fT1VJX1NJWkUgICAgICAgICAgICAgICg0KQorI2RlZmluZSBDU1JfUlNOX1ZFUlNJT05fU1VQUE9SVEVEICAgICAoMSkKKyNkZWZpbmUgQ1NSX1JTTl9NQVhfQVVUSF9TVUlURVMgICAgICAgKDQpCisjZGVmaW5lIENTUl9SU05fTUFYX0NZUEhFUlMgICAgICAgICAgICg1KQorI2RlZmluZSBDU1JfUlNOX01BWF9VTklDQVNUX0NZUEhFUlMgICAoNSkKKyNkZWZpbmUgQ1NSX1JTTl9NQVhfTVVMVElDQVNUX0NZUEhFUlMgKDEpCisKKyNkZWZpbmUgQ1NSX1dQQV9PVUlfU0laRSAgICAgICAgICAgICAgKDQpCisjZGVmaW5lIENTUl9XUEFfVkVSU0lPTl9TVVBQT1JURUQgICAgICgxKQorI2RlZmluZSBDU1JfV01FX09VSV9TSVpFICg0KQorI2RlZmluZSBDU1JfV1BBX01BWF9BVVRIX1NVSVRFUyAgICAgICAoMikKKyNkZWZpbmUgQ1NSX1dQQV9NQVhfQ1lQSEVSUyAgICAgICAgICAgKDUpCisjZGVmaW5lIENTUl9XUEFfTUFYX1VOSUNBU1RfQ1lQSEVSUyAgICg1KQorI2RlZmluZSBDU1JfV1BBX01BWF9NVUxUSUNBU1RfQ1lQSEVSUyAoMSkKKy8qIG1pbmltdW0gc2l6ZSBvZiB0aGUgSUUtPmxlbmd0aCBpcyB0aGUgc2l6ZSBvZiB0aGUgT3VpICsgVmVyc2lvbi4gKi8KKyNkZWZpbmUgQ1NSX1dQQV9JRV9NSU5fU0laRSAgICAgICAgICAgKDYpCisjZGVmaW5lIENTUl9XUEFfSUVfTUlOX1NJWkVfV19NVUxUSUNBU1QgKEhERF9XUEFfSUVfTUlOX1NJWkUgKyBIRERfV1BBX09VSV9TSVpFKQorI2RlZmluZSBDU1JfV1BBX0lFX01JTl9TSVpFX1dfVU5JQ0FTVCAgIChIRERfV1BBX0lFX01JTl9TSVpFICsgXAorCQlIRERfV1BBX09VSV9TSVpFICsgc2l6ZW9mKHBXcGFJZS0+Y1VuaWNhc3RDeXBoZXJzKSkKKworI2RlZmluZSBDU1JfRE9UMTFfU1VQUE9SVEVEX1JBVEVTX01BWCAoMTIpCisjZGVmaW5lIENTUl9ET1QxMV9FWFRFTkRFRF9TVVBQT1JURURfUkFURVNfTUFYICg4KQorCisjZGVmaW5lIENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0sgKDB4ODApCisKKyNkZWZpbmUgQ1NSX09VSV9VU0VfR1JPVVBfQ0lQSEVSX0lOREVYIDB4MDAKKyNkZWZpbmUgQ1NSX09VSV9XRVA0MF9PUl8xWF9JTkRFWCAgICAgIDB4MDEKKyNkZWZpbmUgQ1NSX09VSV9US0lQX09SX1BTS19JTkRFWCAgICAgIDB4MDIKKyNkZWZpbmUgQ1NSX09VSV9SRVNFUlZFRF9JTkRFWCAgICAgICAgIDB4MDMKKyNkZWZpbmUgQ1NSX09VSV9BRVNfSU5ERVggICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ1NSX09VSV9XRVAxMDRfSU5ERVggICAgICAgICAgIDB4MDUKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisjZGVmaW5lIENTUl9PVUlfV0FQSV9SRVNFUlZFRF9JTkRFWCAgICAweDAwCisjZGVmaW5lIENTUl9PVUlfV0FQSV9XQUlfQ0VSVF9PUl9TTVM0X0lOREVYICAgIDB4MDEKKyNkZWZpbmUgQ1NSX09VSV9XQVBJX1dBSV9QU0tfSU5ERVggICAgIDB4MDIKKy8qIG1heCBpZHgsIHNob3VsZCBiZSBsYXN0ICYgaGlnaGVzdCAqLworI2RlZmluZSBDU1JfT1VJX1dBUElfV0FJX01BWF9JTkRFWCAgICAgMHgwMworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKK3R5cGVkZWYgZW51bSB7CisJLyogMTFiIHJhdGVzICovCisJZUNzclN1cHBSYXRlXzFNYnBzICAgPSAxICogMiwKKwllQ3NyU3VwcFJhdGVfMk1icHMgICA9IDIgKiAyLAorCWVDc3JTdXBwUmF0ZV81XzVNYnBzID0gMTEsICAgICAgLyogNS41ICogMiAqLworCWVDc3JTdXBwUmF0ZV8xMU1icHMgID0gMTEgKiAyLAorCisJLyogMTFhIC8gMTFnIHJhdGVzICovCisJZUNzclN1cHBSYXRlXzZNYnBzICAgPSA2ICogMiwKKwllQ3NyU3VwcFJhdGVfOU1icHMgICA9IDkgKiAyLAorCWVDc3JTdXBwUmF0ZV8xMk1icHMgID0gMTIgKiAyLAorCWVDc3JTdXBwUmF0ZV8xOE1icHMgID0gMTggKiAyLAorCWVDc3JTdXBwUmF0ZV8yNE1icHMgID0gMjQgKiAyLAorCWVDc3JTdXBwUmF0ZV8zNk1icHMgID0gMzYgKiAyLAorCWVDc3JTdXBwUmF0ZV80OE1icHMgID0gNDggKiAyLAorCWVDc3JTdXBwUmF0ZV81NE1icHMgID0gNTQgKiAyLAorCisJLyogYWlyZ28gcHJvcHJpZXRhcnkgcmF0ZXMgKi8KKwllQ3NyU3VwcFJhdGVfMTBNYnBzICAgPSAxMCAqIDIsCisJZUNzclN1cHBSYXRlXzEwXzVNYnBzID0gMjEsICAgICAvKiAxMC41ICogMiAqLworCWVDc3JTdXBwUmF0ZV8yME1icHMgICA9IDIwICogMiwKKwllQ3NyU3VwcFJhdGVfMjFNYnBzICAgPSAyMSAqIDIsCisJZUNzclN1cHBSYXRlXzQwTWJwcyAgID0gNDAgKiAyLAorCWVDc3JTdXBwUmF0ZV80Mk1icHMgICA9IDQyICogMiwKKwllQ3NyU3VwcFJhdGVfNjBNYnBzICAgPSA2MCAqIDIsCisJZUNzclN1cHBSYXRlXzYzTWJwcyAgID0gNjMgKiAyLAorCWVDc3JTdXBwUmF0ZV83Mk1icHMgICA9IDcyICogMiwKKwllQ3NyU3VwcFJhdGVfODBNYnBzICAgPSA4MCAqIDIsCisJZUNzclN1cHBSYXRlXzg0TWJwcyAgID0gODQgKiAyLAorCWVDc3JTdXBwUmF0ZV85Nk1icHMgICA9IDk2ICogMiwKKwllQ3NyU3VwcFJhdGVfMTA4TWJwcyAgPSAxMDggKiAyLAorCWVDc3JTdXBwUmF0ZV8xMjBNYnBzICA9IDEyMCAqIDIsCisJZUNzclN1cHBSYXRlXzEyNk1icHMgID0gMTI2ICogMiwKKwllQ3NyU3VwcFJhdGVfMTQ0TWJwcyAgPSAxNDQgKiAyLAorCWVDc3JTdXBwUmF0ZV8xNjBNYnBzICA9IDE2MCAqIDIsCisJZUNzclN1cHBSYXRlXzE2OE1icHMgID0gMTY4ICogMiwKKwllQ3NyU3VwcFJhdGVfMTkyTWJwcyAgPSAxOTIgKiAyLAorCWVDc3JTdXBwUmF0ZV8yMTZNYnBzICA9IDIxNiAqIDIsCisJZUNzclN1cHBSYXRlXzI0ME1icHMgID0gMjQwICogMgorfSBlQ3NyU3VwcG9ydGVkUmF0ZXM7CisKKy8qIEdlbmVyaWMgSW5mb3JtYXRpb24gRWxlbWVudCBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHNEb3QxMUlFSGVhZGVyIHsKKwl1aW50OF90IEVsZW1lbnRJRDsKKwl1aW50OF90IExlbmd0aDsKK30gY2RmX3BhY2tlZCB0RG90MTFJRUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyV3BhSWUgeworCXREb3QxMUlFSGVhZGVyIEllSGVhZGVyOworCXVpbnQ4X3QgT3VpW0NTUl9XUEFfT1VJX1NJWkVdOworCXVpbnQxNl90IFZlcnNpb247CisJdWludDhfdCBNdWx0aWNhc3RPdWlbQ1NSX1dQQV9PVUlfU0laRV07CisJdWludDE2X3QgY1VuaWNhc3RDeXBoZXJzOworCXN0cnVjdCB7CisJCXVpbnQ4X3QgT3VpW0NTUl9XUEFfT1VJX1NJWkVdOworCX0gY2RmX3BhY2tlZCBVbmljYXN0T3VpWzFdOworfSBjZGZfcGFja2VkIHRDc3JXcGFJZTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyV3BhQXV0aEllIHsKKwl1aW50MTZfdCBjQXV0aGVudGljYXRpb25TdWl0ZXM7CisJc3RydWN0IHsKKwkJdWludDhfdCBPdWlbQ1NSX1dQQV9PVUlfU0laRV07CisJfSBjZGZfcGFja2VkIEF1dGhPdWlbMV07Cit9IGNkZl9wYWNrZWQgdENzcldwYUF1dGhJZTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUlNOSWUgeworCXREb3QxMUlFSGVhZGVyIEllSGVhZGVyOworCXVpbnQxNl90IFZlcnNpb247CisJdWludDhfdCBNdWx0aWNhc3RPdWlbQ1NSX1JTTl9PVUlfU0laRV07CisJdWludDE2X3QgY1VuaWNhc3RDeXBoZXJzOworCXN0cnVjdCB7CisJCXVpbnQ4X3QgT3VpW0NTUl9SU05fT1VJX1NJWkVdOworCX0gY2RmX3BhY2tlZCBVbmljYXN0T3VpWzFdOworfSBjZGZfcGFja2VkIHRDc3JSU05JZTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUlNOQXV0aEllIHsKKwl1aW50MTZfdCBjQXV0aGVudGljYXRpb25TdWl0ZXM7CisJc3RydWN0IHsKKwkJdWludDhfdCBPdWlbQ1NSX1JTTl9PVUlfU0laRV07CisJfSBjZGZfcGFja2VkIEF1dGhPdWlbMV07Cit9IGNkZl9wYWNrZWQgdENzclJTTkF1dGhJZTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUlNOQ2FwYWJpbGl0aWVzIHsKKwl1aW50MTZfdCBQcmVBdXRoU3VwcG9ydGVkOjE7CisJdWludDE2X3QgTm9QYWlyd2lzZToxOworCXVpbnQxNl90IFBUS1NBUmVwbGF5Q291bnRlcjoyOworCXVpbnQxNl90IEdUS1NBUmVwbGF5Q291bnRlcjoyOworCXVpbnQxNl90IE1GUFJlcXVpcmVkOjE7CisJdWludDE2X3QgTUZQQ2FwYWJsZToxOworCXVpbnQxNl90IFJlc2VydmVkOjg7Cit9IGNkZl9wYWNrZWQgdENzclJTTkNhcGFiaWxpdGllczsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUlNOUE1LSWUgeworCXVpbnQxNl90IGNQTUtJRHM7CisJc3RydWN0IHsKKwkJdWludDhfdCBQTUtJRFtDU1JfUlNOX1BNS0lEX1NJWkVdOworCX0gY2RmX3BhY2tlZCBQTUtJRExpc3RbMV07Cit9IGNkZl9wYWNrZWQgdENzclJTTlBNS0llOworCit0eXBlZGVmIHN0cnVjdCB0Q3NySUVMZW5JbmZvIHsKKwl1aW50OF90IG1pbjsKKwl1aW50OF90IG1heDsKK30gY2RmX3BhY2tlZCB0Q3NySUVMZW5JbmZvOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKK3R5cGVkZWYgc3RydWN0IHRhZ0NzcldhcGlJZSB7CisJdERvdDExSUVIZWFkZXIgSWVIZWFkZXI7CisJdWludDE2X3QgVmVyc2lvbjsKKwl1aW50MTZfdCBjQXV0aGVudGljYXRpb25TdWl0ZXM7CisJc3RydWN0IHsKKwkJdWludDhfdCBPdWlbQ1NSX1dBUElfT1VJX1NJWkVdOworCX0gY2RmX3BhY2tlZCBBdXRoT3VpWzFdOworCXVpbnQxNl90IGNVbmljYXN0Q3lwaGVyczsKKwlzdHJ1Y3QgeworCQl1aW50OF90IE91aVtDU1JfV0FQSV9PVUlfU0laRV07CisJfSBjZGZfcGFja2VkIFVuaWNhc3RPdWlbMV07CisJdWludDhfdCBNdWx0aWNhc3RPdWlbQ1NSX1dBUElfT1VJX1NJWkVdOworCXN0cnVjdCB7CisJCXVpbnQxNl90IFByZUF1dGhTdXBwb3J0ZWQ6MTsKKwkJdWludDE2X3QgUmVzZXJ2ZWQ6MTU7CisJfSBjZGZfcGFja2VkIHRDc3JXYXBpQ2FwYWJpbGl0aWVzOworfSBjZGZfcGFja2VkIHRDc3JXYXBpSWU7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgdGFnUm9hbWluZ1RpbWVySW5mbyB7CisJdHBBbmlTaXJHbG9iYWwgcE1hYzsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdENzclRpbWVySW5mbzsKKworI2RlZmluZSBDU1JfSVNfMTFBX0JTUyhwQnNzRGVzYykgICAgKGVTSVJfMTFBX05XX1RZUEUgPT0gKHBCc3NEZXNjKS0+bndUeXBlKQorI2RlZmluZSBDU1JfSVNfQkFTSUNfUkFURShyYXRlKSAgICAgKChyYXRlKSAmIENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0spCisjZGVmaW5lIENTUl9JU19RT1NfQlNTKHBJZXMpICBcCisJCSgocEllcyktPldNTVBhcmFtcy5wcmVzZW50IHx8IChwSWVzKS0+V01NSW5mb0FwLnByZXNlbnQpCisjZGVmaW5lIENTUl9JU19VQVBTRF9CU1MocEllcykgXAorCSgoKHBJZXMpLT5XTU1QYXJhbXMucHJlc2VudCAmJiBcCisJICgocEllcyktPldNTVBhcmFtcy5xb3NJbmZvICYgU01FX1FPU19BUF9TVVBQT1JUU19BUFNEKSkgfHwgXAorCSAoKHBJZXMpLT5XTU1JbmZvQXAucHJlc2VudCAmJiAocEllcyktPldNTUluZm9BcC51YXBzZCkpCisKKy8qIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgdG90YWwgbGVuIG5lZWRlZCBvZiBUbHYgd2l0aCB3aXRoIGxlbiBieXRlcyBvZiBkYXRhICovCisjZGVmaW5lIEdFVF9UTFZfTVNHX0xFTihsZW4pIFwKKwlHRVRfUk9VTkRfVVAoKHNpemVvZih0Q3NyQ2ZnTXNnVGx2SGRyKSArIChsZW4pKSwgc2l6ZW9mKHVpbnQzMl90KSkKKworYm9vbCBjc3JfZ2V0X2Jzc19pZF9ic3NfZGVzYyh0SGFsSGFuZGxlIGhIYWwsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCXN0cnVjdCBjZGZfbWFjX2FkZHIgKnBCc3NJZCk7Citib29sIGNzcl9pc19ic3NfaWRfZXF1YWwodEhhbEhhbmRsZSBoSGFsLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMSwKKwkJdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzIpOworZUNzck1lZGlhQWNjZXNzVHlwZSBjc3JfZ2V0X3FvX3NfZnJvbV9ic3NfZGVzYyh0SGFsSGFuZGxlIGhIYWwsCisJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCXREb3QxMWZCZWFjb25JRXMgKnBJZXMpOworYm9vbCBjc3JfaXNfbnVsbHNzaWQodWludDhfdCAqcEJzc1NzaWQsIHVpbnQ4X3QgbGVuKTsKK2Jvb2wgY3NyX2lzX2luZnJhX2Jzc19kZXNjKHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MpOworYm9vbCBjc3JfaXNfaWJzc19ic3NfZGVzYyh0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjKTsKK2Jvb2wgY3NyX2lzX3ByaXZhY3kodFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYyk7Cit0U2lyUmVzdWx0Q29kZXMgY3NyX2dldF9kaXNhc3NvY19yc3Bfc3RhdHVzX2NvZGUodFNpclNtZURpc2Fzc29jUnNwICoKKwkJcFNtZURpc2Fzc29jUnNwKTsKK3RTaXJSZXN1bHRDb2RlcyBjc3JfZ2V0X2RlX2F1dGhfcnNwX3N0YXR1c19jb2RlKHRTaXJTbWVEZWF1dGhSc3AgKnBTbWVSc3ApOwordWludDMyX3QgY3NyX2dldF9mcmFnX3RocmVzaCh0SGFsSGFuZGxlIGhIYWwpOwordWludDMyX3QgY3NyX2dldF9ydHNfdGhyZXNoKHRIYWxIYW5kbGUgaEhhbCk7CitlQ3NyUGh5TW9kZSBjc3JfZ2V0X3BoeV9tb2RlX2Zyb21fYnNzRGVzYyh0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjKTsKK3VpbnQzMl90IGNzcl9nZXQxMWhfcG93ZXJfY29uc3RyYWludCh0SGFsSGFuZGxlIGhIYWwsCisJCXREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgKnBQb3dlckNvbnN0cmFpbnQpOwordWludDhfdCBjc3JfY29uc3RydWN0X3Jzbl9pZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJdERvdDExZkJlYWNvbklFcyAqcEllcywgdENzclJTTkllICpwUlNOSWUpOwordWludDhfdCBjc3JfY29uc3RydWN0X3dwYV9pZSh0SGFsSGFuZGxlIGhIYWwsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCXREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JXcGFJZSAqcFdwYUllKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorYm9vbCBjc3JfaXNfcHJvZmlsZV93YXBpKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisvKgorICogSWYgYSBXUEFJRSBleGlzdHMgaW4gdGhlIHByb2ZpbGUsIGp1c3QgdXNlIGl0LgorICogT3IgZWxzZSBjb25zdHJ1Y3Qgb25lIGZyb20gdGhlIEJTUyBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBmb3IgcFdwYUllIGFuZAorICogZ3VhcnJhbnRlZSBpdCBjYW4gY29udGFpbiBhIG1heCBsZW5ndGggV1BBIElFCisgKi8KK3VpbnQ4X3QgY3NyX3JldHJpZXZlX3dwYV9pZSh0SGFsSGFuZGxlIGhIYWwsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCXREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JXcGFJZSAqcFdwYUllKTsKK2Jvb2wgY3NyX2lzX3NzaWRfZXF1YWwodEhhbEhhbmRsZSBoSGFsLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMSwKKwkJdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzIsCisJCXREb3QxMWZCZWFjb25JRXMgKnBJZXMyKTsKKy8qIE51bGwgc3NpZCBtZWFucyBtYXRjaCAqLworYm9vbCBjc3JfaXNfc3NpZF9pbl9saXN0KHRIYWxIYW5kbGUgaEhhbCwgdFNpck1hY1NTaWQgKnBTc2lkLAorCQl0Q3NyU1NJRHMgKnBTc2lkTGlzdCk7Citib29sIGNzcl9pc19wcm9maWxlX3dwYSh0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlKTsKK2Jvb2wgY3NyX2lzX3Byb2ZpbGVfcnNuKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUpOworLyoKKyAqIElmIGEgUlNOSUUgZXhpc3RzIGluIHRoZSBwcm9maWxlLCBqdXN0IHVzZSBpdC4gT3IKKyAqIGVsc2UgY29uc3RydWN0IG9uZSBmcm9tIHRoZSBCU1MgQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBXcGFJZSBhbmQKKyAqIGd1YXJyYW50ZWUgaXQgY2FuIGNvbnRhaW4gYSBtYXggbGVuZ3RoIFdQQSBJRQorICovCit1aW50OF90IGNzcl9yZXRyaWV2ZV9yc25faWUodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCXRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCXREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JSU05JZSAqcFJzbkllKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorLyoKKyAqIElmIGEgV0FQSSBJRSBleGlzdHMgaW4gdGhlIHByb2ZpbGUsIGp1c3QgdXNlIGl0LgorICogT3IgZWxzZSBjb25zdHJ1Y3Qgb25lIGZyb20gdGhlIEJTUy4gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBXYXBpSWUgYW5kCisgKiBndWFycmFudGVlIGl0IGNhbiBjb250YWluIGEgbWF4IGxlbmd0aCBXQVBJIElFCisgKi8KK3VpbnQ4X3QgY3NyX3JldHJpZXZlX3dhcGlfaWUodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCXRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCXREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JXYXBpSWUgKnBXYXBpSWUpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCitib29sIGNzcl9yYXRlc19pc19kb3QxMV9yYXRlMTFiX3N1cHBvcnRlZF9yYXRlKHVpbnQ4X3QgZG90MTFSYXRlKTsKK2Jvb2wgY3NyX3JhdGVzX2lzX2RvdDExX3JhdGUxMWFfc3VwcG9ydGVkX3JhdGUodWludDhfdCBkb3QxMVJhdGUpOwordEFuaUVkVHlwZSBjc3JfdHJhbnNsYXRlX2VuY3J5cHRfdHlwZV90b19lZF90eXBlKAorCQllQ3NyRW5jcnlwdGlvblR5cGUgRW5jcnlwdFR5cGUpOworLyoKKyAqIHBJZXMgc2hhbGwgY29udGFpbiBJRXMgZnJvbSBwU2lyQnNzRGVzYy4KKyAqIEl0IHNoYWxsIGJlIHJldHVybmVkIGZyb20gZnVuY3Rpb24gY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcworICovCitib29sIGNzcl9pc19zZWN1cml0eV9tYXRjaCh0SGFsSGFuZGxlIGhIYWwsIHRDc3JBdXRoTGlzdCAqYXV0aFR5cGUsCisJCXRDc3JFbmNyeXB0aW9uTGlzdCAqcFVDRW5jcnlwdGlvblR5cGUsCisJCXRDc3JFbmNyeXB0aW9uTGlzdCAqcE1DRW5jcnlwdGlvblR5cGUsIGJvb2wgKnBNRlBFbmFibGVkLAorCQl1aW50OF90ICpwTUZQUmVxdWlyZWQsIHVpbnQ4X3QgKnBNRlBDYXBhYmxlLAorCQl0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzLAorCQllQ3NyQXV0aFR5cGUgKm5lZ290aWF0ZWRBdXRodHlwZSwKKwkJZUNzckVuY3J5cHRpb25UeXBlICpuZWdvdGlhdGVkVUNDaXBoZXIsCisJCWVDc3JFbmNyeXB0aW9uVHlwZSAqbmVnb3RpYXRlZE1DQ2lwaGVyKTsKK2Jvb2wgY3NyX2lzX2Jzc190eXBlX21hdGNoKGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlMSwgZUNzclJvYW1Cc3NUeXBlIGJzc1R5cGUyKTsKK2Jvb2wgY3NyX2lzX2Jzc190eXBlX2lic3MoZUNzclJvYW1Cc3NUeXBlIGJzc1R5cGUpOworYm9vbCBjc3JfaXNfYnNzX3R5cGVfd2RzKGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlKTsKKy8qCisgKiBwcEllcyBjYW4gYmUgTlVMTC4gSWYgY2FsbGVyIHdhbnQgdG8gZ2V0IHRoZSAqcHBJZXMgYWxsb2NhdGVkIGJ5CisgKiB0aGlzIGZ1bmN0aW9uLCBwYXNzIGluICpwcEllcyA9IE5VTEwuIENhbGxlciBuZWVkcyB0byBmcmVlIHRoZSBtZW1vcnkKKyAqIGluIHRoaXMgY2FzZQorICovCitib29sIGNzcl9tYXRjaF9ic3ModEhhbEhhbmRsZSBoSGFsLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLAorCQl0Q3NyU2NhblJlc3VsdEZpbHRlciAqcEZpbHRlciwgZUNzckF1dGhUeXBlICpwTmVnQXV0aCwKKwkJZUNzckVuY3J5cHRpb25UeXBlICpwTmVnVWMsIGVDc3JFbmNyeXB0aW9uVHlwZSAqcE5lZ01jLAorCQl0RG90MTFmQmVhY29uSUVzICoqcHBJZXMpOworYm9vbCBjc3JfaXNfYnNzaWRfbWF0Y2godEhhbEhhbmRsZSBoSGFsLCBzdHJ1Y3QgY2RmX21hY19hZGRyICpwUHJvZkJzc2lkLAorCQlzdHJ1Y3QgY2RmX21hY19hZGRyICpCc3NCc3NpZCk7Citib29sIGNzcl9tYXRjaF9ic3NfdG9fY29ubmVjdF9wcm9maWxlKHRIYWxIYW5kbGUgaEhhbCwKKwkJdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSwKKwkJdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcEllcyk7Cit2b2lkIGNzcl9hZGRfcmF0ZV9iaXRtYXAodWludDhfdCByYXRlLCB1aW50MTZfdCAqcFJhdGVCaXRtYXApOworYm9vbCBjc3JfY2hlY2tfcmF0ZV9iaXRtYXAodWludDhfdCByYXRlLCB1aW50MTZfdCBSYXRlQml0bWFwKTsKK2Jvb2wgY3NyX3JhdGVzX2lzX2RvdDExX3JhdGVfc3VwcG9ydGVkKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCByYXRlKTsKK3VpbnQxNl90IGNzcl9yYXRlc19maW5kX2Jlc3RfcmF0ZSh0U2lyTWFjUmF0ZVNldCAqcFN1cHBSYXRlcywKKwkJdFNpck1hY1JhdGVTZXQgKnBFeHRSYXRlcywgdFNpck1hY1Byb3BSYXRlU2V0ICpwUHJvcFJhdGVzKTsKK3RTaXJCc3NUeXBlIGNzcl90cmFuc2xhdGVfYnNzdHlwZV90b19tYWNfdHlwZShlQ3NyUm9hbUJzc1R5cGUgY3NydHlwZSk7CisvKiBDYWxsZXIgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcElFU3RydWN0ICovCitDREZfU1RBVFVTIGNzcl9wYXJzZV9ic3NfZGVzY3JpcHRpb25faWVzKHRIYWxIYW5kbGUgaEhhbCwKKwkJdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcElFU3RydWN0KTsKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGFyc2VkIElFcyB0byB0aGUgY2FsbGVyLgorICogQ2FsbGVyIG11c3QgZnJlZSB0aGUgbWVtb3J5LiBhZnRlciBpdCBpcyBkb25lIHdpdGggdGhlIGRhdGEgb25seSBpZgorICogdGhpcyBmdW5jdGlvbiBzdWNjZWVkcworICovCitDREZfU1RBVFVTIGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXModEhhbEhhbmRsZSBoSGFsLAorCQl0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICoqcHBJRVN0cnVjdCk7CisKK2Jvb2wgY3NyVmFsaWRhdGVDb3VudHJ5U3RyaW5nKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCAqcENvdW50cnlTdHJpbmcpOwordFNpclNjYW5UeXBlIGNzcl9nZXRfc2Nhbl90eXBlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgY2huSWQpOwordWludDhfdCBjc3JfdG9fdXBwZXIodWludDhfdCBjaCk7CitDREZfU1RBVFVTIGNzcl9nZXRfcGh5X21vZGVfZnJvbV9ic3ModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdFNpckJzc0Rlc2NyaXB0aW9uICpwQlNTRGVzY3JpcHRpb24sCisJCWVDc3JQaHlNb2RlICpwUGh5TW9kZSwgdERvdDExZkJlYWNvbklFcyAqcEllcyk7CisvKgorICogZkZvcmNlIC0tIGZvcmNlIHJlYXNzb2MgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXJlIGlzIGFueSBjaGFuZ2UuCisgKiBUaGUgcmVhc29uIGlzIHRoYXQgZm9yIFVBUFNELWJ5cGFzcywgdGhlIGNvZGUgdW5kZXJuZWF0aCB0aGlzIGNhbGwgZGV0ZXJtaW5lCisgKiB3aGV0aGVyIHRvIGFsbG93IFVBUFNELiBUaGUgaW5mb3JtYXRpb24gaW4gcE1vZFByb2ZpbGVGaWVsZHMgcmVmbGVjdHMgd2hhdAorICogdGhlIHVzZXIgd2FudHMuIFRoZXJlIG1heSBiZSBkaXNjcmVwZW5jeSBpbiBpdC4gVUFQU0QtYnlwYXNzIGxvZ2ljIHNob3VsZAorICogZGVjaWRlIGlmIGl0IG5lZWRzIHRvIHJlYXNzb2MKKyAqLworQ0RGX1NUQVRVUyBjc3JfcmVhc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCXRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqcE1vZFByb2ZpbGVGaWVsZHMsCisJCXVpbnQzMl90ICpwUm9hbUlkLCBib29sIGZGb3JjZSk7CisKK0NERl9TVEFUVVMgY3NyX2lzY29uY3VycmVudHNlc3Npb25fdmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDMyX3QgY3Vyc2Vzc2lvbklkLCB0Q0RGX0NPTl9NT0RFIGN1cnJCc3NQZXJzb25hKTsKKy8qIEJlYWNvbkludGVydmFsIHZhbGlkYXRpb24gZm9yIE1DQyBzdXBwb3J0ICovCitDREZfU1RBVFVTIGNzcl92YWxpZGF0ZV9tY2NfYmVhY29uX2ludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgY2hhbm5lbElkLAorCQl1aW50MTZfdCAqYmVhY29uSW50ZXJ2YWwsIHVpbnQzMl90IGN1cnNlc3Npb25JZCwKKwkJdENERl9DT05fTU9ERSBjdXJyQnNzUGVyc29uYSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK2Jvb2wgY3NyX2lzX3Byb2ZpbGUxMXIodENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSk7Citib29sIGNzcl9pc19hdXRoX3R5cGUxMXIoZUNzckF1dGhUeXBlIEF1dGhUeXBlLCB1aW50OF90IG1kaWVQcmVzZW50KTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKK2Jvb2wgY3NyX2lzX2F1dGhfdHlwZV9lc2UoZUNzckF1dGhUeXBlIEF1dGhUeXBlKTsKK2Jvb2wgY3NyX2lzX3Byb2ZpbGVfZXNlKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zbWUvaW5jL25hbl9hcGkuaCBiL2NvcmUvc21lL2luYy9uYW5fYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyNzVjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL2luYy9uYW5fYXBpLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKgorICogTmFtZTogIG5hbl9hcGkuaAorICoKKyAqIERlc2NyaXB0aW9uOiBOQU4gRlNNIGRlZmluZXMuCisgKgorICovCisKKyNpZm5kZWYgX19OQU5fQVBJX0hfXworI2RlZmluZSBfX05BTl9BUElfSF9fCisKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3Qgc05hblJlcXVlc3RSZXEgeworCXVpbnQxNl90IHJlcXVlc3RfZGF0YV9sZW47CisJY29uc3QgdWludDhfdCAqcmVxdWVzdF9kYXRhOworfSB0TmFuUmVxdWVzdFJlcSwgKnRwTmFuUmVxdWVzdFJlcTsKKwordHlwZWRlZiB2b2lkICgqTmFuQ2FsbGJhY2spKHZvaWQgKiwgdFNpck5hbkV2ZW50ICopOwordm9pZCBzbWVfbmFuX3JlZ2lzdGVyX2NhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwgTmFuQ2FsbGJhY2sgY2FsbGJhY2spOworQ0RGX1NUQVRVUyBzbWVfbmFuX3JlcXVlc3QodHBOYW5SZXF1ZXN0UmVxIGlucHV0KTsKKworI2VuZGlmIC8qIF9fTkFOX0FQSV9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvc21lL2luYy9vZW1fZGF0YV9hcGkuaCBiL2NvcmUvc21lL2luYy9vZW1fZGF0YV9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2VjMDhjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zbWUvaW5jL29lbV9kYXRhX2FwaS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKworLyoqCisgKiBcZmlsZSBvZW1fZGF0YV9hcGkuaAorICoKKyAqIEV4cG9ydHMgYW5kIHR5cGVzIGZvciB0aGUgQ29tbW9uIE9FTSBEQVRBIFJFUS9SU1AgTW9kdWxlIGludGVyZmFjZXMuCisgKi8KKworI2lmbmRlZiBfX09FTV9EQVRBX0FQSV9IX18KKyNkZWZpbmUgX19PRU1fREFUQV9BUElfSF9fCisjaW5jbHVkZSAic2lyX2FwaS5oIgorI2luY2x1ZGUgInNpcl9tYWNfcHJvdF9kZWYuaCIKKyNpbmNsdWRlICJjc3JfbGlua19saXN0LmgiCisKKyNpZm5kZWYgT0VNX0RBVEFfUkVRX1NJWkUKKyNkZWZpbmUgT0VNX0RBVEFfUkVRX1NJWkUgMjgwCisjZW5kaWYKKworI2lmbmRlZiBPRU1fREFUQV9SU1BfU0laRQorI2RlZmluZSBPRU1fREFUQV9SU1BfU0laRSAxNzI0CisjZW5kaWYKKworLyogbWVzc2FnZSBzdWJ0eXBlIGZvciBpbnRlcm5hbCBwdXJwb3NlICovCisjZGVmaW5lIE9FTV9NRVNTQUdFX1NVQlRZUEVfSU5URVJOQUwgICAweGRlYWRiZWVmCisKKy8qIFN0cnVjdHVyZSBmb3IgZGVmaW5pbmcgcmVxIHNlbnQgdG8gdGhlIFBFICovCit0eXBlZGVmIHN0cnVjdCB0YWdPZW1EYXRhUmVxIHsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IG9lbURhdGFSZXFbT0VNX0RBVEFfUkVRX1NJWkVdOworfSB0T2VtRGF0YVJlcSwgdE9lbURhdGFSZXFDb25maWc7CisKK3R5cGVkZWYgc3RydWN0IHRhZ09lbURhdGFSc3AgeworCXVpbnQ4X3Qgb2VtRGF0YVJzcFtPRU1fREFUQV9SU1BfU0laRV07Cit9IHRPZW1EYXRhUnNwOworCit0eXBlZGVmIGVudW0geworCWVPRU1fREFUQV9SRVFfU1VDQ0VTUyA9IDEsCisJZU9FTV9EQVRBX1JFUV9GQUlMVVJFLAorCWVPRU1fREFUQV9SRVFfSU5WQUxJRF9NT0RFLAorfSBlT2VtRGF0YVJlcVN0YXR1czsKK0NERl9TVEFUVVMgb2VtX2RhdGFfb2VtX2RhdGFfcmVxX29wZW4odEhhbEhhbmRsZSBoSGFsKTsKK0NERl9TVEFUVVMgb2VtX2RhdGFfb2VtX2RhdGFfcmVxX2Nsb3NlKHRIYWxIYW5kbGUgaEhhbCk7CisKKy8qCisgKiBIREQgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBzbWUgdG8gY2FsbGJhY2sgd2hlbgorICogdGhlIG9lbSBkYXRhIHJzcCBpcyBhdmFpbGFibGUKKyAqLwordHlwZWRlZiBDREZfU1RBVFVTICgqb2VtX2RhdGFfb2VtX2RhdGFfcmVxQ29tcGxldGVDYWxsYmFjaykodEhhbEhhbmRsZSwKKwkJdm9pZCAqcDIsIHVpbnQzMl90IG9lbURhdGFSZXFJRCwgZU9lbURhdGFSZXFTdGF0dXMgc3RhdHVzKTsKKworQ0RGX1NUQVRVUyBvZW1fZGF0YV9vZW1fZGF0YV9yZXEodEhhbEhhbmRsZSwgdWludDhfdCwgdE9lbURhdGFSZXFDb25maWcgKiwKKwkJdWludDMyX3QgKnBPZW1EYXRhUmVxSUQsCisJCW9lbV9kYXRhX29lbV9kYXRhX3JlcUNvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2ssCisJCXZvaWQgKnBDb250ZXh0KTsKK0NERl9TVEFUVVMgc21lX2hhbmRsZV9vZW1fZGF0YV9yc3AodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90ICopOworQ0RGX1NUQVRVUyBvZW1fZGF0YV9pc19vZW1fZGF0YV9yZXFfYWxsb3dlZCh0SGFsSGFuZGxlIGhIYWwpOwordHlwZWRlZiB2b2lkICgqc21lX3NlbmRfb2VtX2RhdGFfcnNwX21zZykoaW50IGxlbmd0aCwgdWludDhfdCAqb2VtX2RhdGFfcnNwKTsKKyNlbmRpZiAvKiBfT0VNX0RBVEFfQVBJX0hfXyAqLworCisjZW5kaWYgLyogRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUICovCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9pbmMvb2VtX2RhdGFfaW50ZXJuYWwuaCBiL2NvcmUvc21lL2luYy9vZW1fZGF0YV9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNmE2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvb2VtX2RhdGFfaW50ZXJuYWwuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisKKy8qKgorICoKKyAqIFxmaWxlIG9lbV9kYXRhX2ludGVybmFsLmgKKyAqCisgKiBFeHBvcnRzIGFuZCB0eXBlcyBmb3IgdGhlIENvbW1vbiBPRU0gREFUQSBSRVEvUlNQIE1vZHVsZSBpbnRlcmZhY2VzLgorICovCisKKyNpZm5kZWYgX19PRU1fREFUQV9JTlRFUk5BTF9IX18KKyNkZWZpbmUgX19PRU1fREFUQV9JTlRFUk5BTF9IX18KKworI2luY2x1ZGUgImNzcl9zdXBwb3J0LmgiCisjaW5jbHVkZSAiY2RzX3JlZ19zZXJ2aWNlLmgiCisjaW5jbHVkZSAib2VtX2RhdGFfYXBpLmgiCisKK3R5cGVkZWYgc3RydWN0IHRhZ09lbURhdGFTdHJ1Y3QgeworCS8qIGEgZ2xvYmFsIHJlcSBpZCAqLworCXVpbnQzMl90IG5leHRPZW1SZXFJZDsKKwkvKiBpbmRpY2F0ZXMgdGhhdCBjdXJyZW50bHkgYSByZXF1ZXN0IGhhcyBiZWVuIHBvc3RlZCBhbmQgKi8KKwlib29sIG9lbURhdGFSZXFBY3RpdmU7CisJLyogY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBmb3IgcmV0dXJuaW5nIHRoZSByZXNwb25zZSAqLworCW9lbV9kYXRhX29lbV9kYXRhX3JlcUNvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2s7CisJLyogY29udGV4dCBvZiB0aGUgb3JpZ2luYWwgY2FsbGVyICovCisJdm9pZCAqcENvbnRleHQ7CisJdWludDMyX3Qgb2VtRGF0YVJlcUlEOyAgICAgICAgICAgICAgLyogb3JpZ2luYWwgcmVxdWVzdCBJRCAqLworCXRPZW1EYXRhUmVxQ29uZmlnIG9lbURhdGFSZXFDb25maWc7IC8qIGN1cnJlbnQgb2VtIGRhdGEgcmVxdWVzdCAqLworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgLyogU2Vzc2lvbiBvbiB3aGljaCBvZW0gZGF0YSByZXEgaXMgYWN0aXZlICovCisJLyogY2FsbGJhY2sgZm9yIHNlbmRpbmcgZGF0YSByZXNwb25zZSB0byBvZW0gYXBwbGljYXRpb24gKi8KKwlzbWVfc2VuZF9vZW1fZGF0YV9yc3BfbXNnIG9lbV9kYXRhX3JzcF9jYWxsYmFjazsKK30gdE9lbURhdGFTdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IHRhZ09lbURhdGFDbWQgeworCXVpbnQzMl90IG9lbURhdGFSZXFJRDsKKwlvZW1fZGF0YV9vZW1fZGF0YV9yZXFDb21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrOworCXZvaWQgKnBDb250ZXh0OworCXRPZW1EYXRhUmVxIG9lbURhdGFSZXE7Cit9IHRPZW1EYXRhQ21kOworI2VuZGlmIC8qIF9fT0VNX0RBVEFfSU5URVJOQUxfSF9fICovCisKKyNlbmRpZiAvKiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc21lL2luYy9wMnBfYXBpLmggYi9jb3JlL3NtZS9pbmMvcDJwX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTY1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvcDJwX2FwaS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICoKKyAqIE5hbWU6ICBwMnBfYXBpLmgKKyAqCisgKiBEZXNjcmlwdGlvbjogUDJQIEZTTSBkZWZpbmVzLgorICoKKyAqCisgKi8KKworI2lmbmRlZiBfX1AyUF9BUElfSF9fCisjZGVmaW5lIF9fUDJQX0FQSV9IX18KKworI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgImNkZl9tY190aW1lci5oIgorI2luY2x1ZGUgImNkZl9sb2NrLmgiCisKK3R5cGVkZWYgc3RydWN0IHNQMnBQc0NvbmZpZyB7CisJdWludDhfdCBvcHBfcHM7CisJdWludDMyX3QgY3RXaW5kb3c7CisJdWludDhfdCBjb3VudDsKKwl1aW50MzJfdCBkdXJhdGlvbjsKKwl1aW50MzJfdCBpbnRlcnZhbDsKKwl1aW50MzJfdCBzaW5nbGVfbm9hX2R1cmF0aW9uOworCXVpbnQ4X3QgcHNTZWxlY3Rpb247CisJdWludDhfdCBzZXNzaW9uaWQ7Cit9IHRQMnBQc0NvbmZpZywgKnRwUDJwUHNDb25maWc7CisKK3R5cGVkZWYgQ0RGX1NUQVRVUyAoKnJlbWFpbk9uQ2hhbkNhbGxiYWNrKSh0SGFsSGFuZGxlLCB2b2lkICpjb250ZXh0LAorCQlDREZfU1RBVFVTIHN0YXR1cywgdWludDMyX3Qgc2Nhbl9pZCk7CisKK3R5cGVkZWYgc3RydWN0IHNSZW1haW5PbkNobiB7CisJdWludDhfdCBjaG47CisJdWludDMyX3QgZHVyYXRpb247CisJcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2s7CisJdm9pZCAqcENCQ29udGV4dDsKK30gdFJlbWFpbk9uQ2huLCB0cFJlbWFpbk9uQ2huOworCisjZGVmaW5lIFNJWkVfT0ZfTk9BX0RFU0NSSVBUT1IgMTMKKyNkZWZpbmUgTUFYX05PQV9QRVJJT0RfSU5fTUlDUk9TRUNTIDMwMDAwMDAKKworI2RlZmluZSBQMlBfQ0xFQVJfUE9XRVJTQVZFIDAKKyNkZWZpbmUgUDJQX09QUE9SVFVOSVNUSUNfUFMgMQorI2RlZmluZSBQMlBfUEVSSU9ESUNfTk9BIDIKKyNkZWZpbmUgUDJQX1NJTkdMRV9OT0EgNAorCit0eXBlZGVmIHN0cnVjdCBzcDJwQ29udGV4dCB7CisJdl9DT05URVhUX3QgY2RzX2NvbnRleHQ7CisJdEhhbEhhbmRsZSBoSGFsOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIFNlc3Npb24gaWQgY29ycmVzcG9uZGluZyB0byBQMlAgKi8KKwl1aW50OF90IFNNRXNlc3Npb25JZDsKKwl1aW50OF90IHByb2JlUmVxRm9yd2FyZGluZzsKKwl1aW50OF90ICpwcm9iZVJzcEllOworCXVpbnQzMl90IHByb2JlUnNwSWVMZW5ndGg7Cit9IHRwMnBDb250ZXh0LCAqdFBwMnBDb250ZXh0OworCitDREZfU1RBVFVTIHNtZV9yZW1haW5fb25fY2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl1aW50OF90IGNoYW5uZWwsIHVpbnQzMl90IGR1cmF0aW9uLAorCQlyZW1haW5PbkNoYW5DYWxsYmFjayBjYWxsYmFjaywKKwkJdm9pZCAqcENvbnRleHQsIHVpbnQ4X3QgaXNQMlBQcm9iZVJlcUFsbG93ZWQsCisJCXVpbnQzMl90ICpzY2FuX2lkKTsKK0NERl9TVEFUVVMgc21lX3JlcG9ydF9wcm9iZV9yZXEodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IGZsYWcpOworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3AycF9pZSh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnAycEllLAorCQl1aW50MzJfdCBwMnBJZUxlbmd0aCk7CitDREZfU1RBVFVTIHNtZV9zZW5kX2FjdGlvbih0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4sIHVpbnQxNl90IHdhaXQsIGJvb2wgbm9hY2ssCisJCXVpbnQxNl90IGNoYW5uZWxfZnJlcSk7CitDREZfU1RBVFVTIHNtZV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwodEhhbEhhbmRsZSBoSGFsLAorCXVpbnQ4X3Qgc2Vzc2lvbklkLCB1aW50MzJfdCBzY2FuX2lkKTsKK0NERl9TVEFUVVMgc21lX3AycF9vcGVuKHRIYWxIYW5kbGUgaEhhbCk7CitDREZfU1RBVFVTIHAycF9zdG9wKHRIYWxIYW5kbGUgaEhhbCk7CitDREZfU1RBVFVTIHNtZV9wMnBfY2xvc2UodEhhbEhhbmRsZSBoSGFsKTsKK0NERl9TVEFUVVMgc21lX3AycF9zZXRfcHModEhhbEhhbmRsZSBoSGFsLCB0UDJwUHNDb25maWcgKmRhdGEpOworQ0RGX1NUQVRVUyBwMnBfcmVtYWluX29uX2NoYW5uZWwodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJdWludDhfdCBjaGFubmVsLCB1aW50MzJfdCBkdXJhdGlvbiwKKwkJcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2ssCisJCXZvaWQgKnBDb250ZXh0LCB1aW50OF90IGlzUDJQUHJvYmVSZXFBbGxvd2VkLAorCQl1aW50MzJfdCBzY2FuX2lkKTsKK0NERl9TVEFUVVMgcDJwX3NlbmRfYWN0aW9uKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCWNvbnN0IHVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IGxlbiwgdWludDE2X3Qgd2FpdCwgYm9vbCBub2FjaywKKwkJdWludDE2X3QgY2hhbm5lbF9mcmVxKTsKK0NERl9TVEFUVVMgcDJwX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsCisJdWludDhfdCBzZXNzaW9uSWQsIHVpbnQzMl90IHNjYW5faWQpOworQ0RGX1NUQVRVUyBwMnBfc2V0X3BzKHRIYWxIYW5kbGUgaEhhbCwgdFAycFBzQ29uZmlnICpwTm9BKTsKK3RTaXJSRkJhbmQgZ2V0X3JmX2JhbmQodWludDhfdCBjaGFubmVsKTsKKyNlbmRpZiAvKiBfX1AyUF9BUElfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9pbmMvc21lX2FwaS5oIGIvY29yZS9zbWUvaW5jL3NtZV9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGE0ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zbWUvaW5jL3NtZV9hcGkuaApAQCAtMCwwICsxLDEwMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChfX1NNRV9BUElfSCkKKyNkZWZpbmUgX19TTUVfQVBJX0gKKworLyoqCisgKiBmaWxlICBzbWVBcGkuaAorICoKKyAqIGJyaWVmIHByb3RvdHlwZSBmb3IgU01FIEFQSXMKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJjc3JfYXBpLmgiCisjaW5jbHVkZSAiY2RzX21xLmgiCisjaW5jbHVkZSAiY2RmX2xvY2suaCIKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJzaXJfYXBpLmgiCisjaW5jbHVkZSAiY2RzX3JlZ19zZXJ2aWNlLmgiCisjaW5jbHVkZSAicDJwX2FwaS5oIgorI2luY2x1ZGUgImNkc19yZWdkb21haW4uaCIKKyNpbmNsdWRlICJzbWVfaW50ZXJuYWwuaCIKKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorI2luY2x1ZGUgIm9lbV9kYXRhX2FwaS5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNpbmNsdWRlICJzbWVfcnJtX2ludGVybmFsLmgiCisjZW5kaWYKKyNpbmNsdWRlICJzaXJfdHlwZXMuaCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBTTUVfU1VNTUFSWV9TVEFUUyAgICAgICAgIDEKKyNkZWZpbmUgU01FX0dMT0JBTF9DTEFTU0FfU1RBVFMgICAyCisjZGVmaW5lIFNNRV9HTE9CQUxfQ0xBU1NCX1NUQVRTICAgNAorI2RlZmluZSBTTUVfR0xPQkFMX0NMQVNTQ19TVEFUUyAgIDgKKyNkZWZpbmUgU01FX0dMT0JBTF9DTEFTU0RfU1RBVFMgIDE2CisjZGVmaW5lIFNNRV9QRVJfU1RBX1NUQVRTICAgICAgICAzMgorCisjZGVmaW5lIFNNRV9TRVNTSU9OX0lEX0FOWSAgICAgICAgNTAKKworI2RlZmluZSBTTUVfSU5WQUxJRF9DT1VOVFJZX0NPREUgIlhYIgorCisjZGVmaW5lIFNNRV8yXzRfR0haX01BWF9GUkVRICAgIDMwMDAKKworI2RlZmluZSBTTUVfU0VUX0NIQU5ORUxfUkVHX1BPV0VSKHJlZ19pbmZvXzEsIHZhbCkgZG8gewlcCisJcmVnX2luZm9fMSAmPSAweGZmMDBmZmZmOwkgICAgICBcCisJcmVnX2luZm9fMSB8PSAoKHZhbCAmIDB4ZmYpIDw8IDE2KTsgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNNRV9TRVRfQ0hBTk5FTF9NQVhfVFhfUE9XRVIocmVnX2luZm9fMiwgdmFsKSBkbyB7IFwKKwlyZWdfaW5mb18yICY9IDB4ZmZmZjAwZmY7CSAgICAgIFwKKwlyZWdfaW5mb18yIHw9ICgodmFsICYgMHhmZikgPDwgOCk7ICAgXAorfSB3aGlsZSAoMCkKKworLyogTWFjcm8gdG8gaW5kaWNhdGUgaW52YWxpZCBubyBvZiB0c3BlY3MgKi8KKyNkZWZpbmUgSU5WQUxJRF9UU1BFQyAxMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICgqaGRkX2Z0bV9tc2dfcHJvY2Vzc29yKSh2b2lkICopOwordHlwZWRlZiBzdHJ1Y3QgX3NtZUNvbmZpZ1BhcmFtcyB7CisJdENzckNvbmZpZ1BhcmFtIGNzckNvbmZpZzsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwl0UnJtQ29uZmlnUGFyYW0gcnJtQ29uZmlnOworI2VuZGlmCisjaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fTEZSCisJdWludDhfdCBpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQ7CisJdWludDhfdCBNQVdDRW5hYmxlZDsKKyNlbmRpZgorI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0VTRQorCXVpbnQ4X3QgaXNFc2VJbmlGZWF0dXJlRW5hYmxlZDsKKyNlbmRpZgorI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IFwKKwlkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJdWludDhfdCBpc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZDsKKwl1aW50OF90IFJvYW1Sc3NpRGlmZjsKKwlib29sIGlzV0VTTW9kZUVuYWJsZWQ7CisjZW5kaWYKKwl1aW50OF90IGlzQW1zZHVTdXBwb3J0SW5BTVBEVTsKKwlib29sIHBub09mZmxvYWQ7CisJdWludDhfdCBmRW5hYmxlRGVidWdMb2c7CisJdWludDhfdCBtYXhfaW50Zl9jb3VudDsKKwlib29sIGVuYWJsZTVnRUJUOworCWJvb2wgZW5hYmxlU2VsZlJlY292ZXJ5OworCXVpbnQzMl90IGZfc3RhX21pcmFjYXN0X21jY19yZXN0X3RpbWVfdmFsOworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCWJvb2wgc2FwX2NoYW5uZWxfYXZvaWRhbmNlOworI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCXVpbnQ4X3QgZl9wcmVmZXJfbm9uX2Rmc19vbl9yYWRhcjsKKwlib29sIGlzX3BzX2VuYWJsZWQ7CisJYm9vbCBwb2xpY3lfbWFuYWdlcl9lbmFibGVkOworCXVpbnQzMl90IGZpbmVfdGltZV9tZWFzX2NhcDsKKwl1aW50MzJfdCBkdWFsX21hY19mZWF0dXJlX2Rpc2FibGU7Cit9IHRTbWVDb25maWdQYXJhbXMsICp0cFNtZUNvbmZpZ1BhcmFtczsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisjZGVmaW5lIFNNRV9URExTX01BWF9TVVBQX0NIQU5ORUxTICAgICAgIDEyOAorI2RlZmluZSBTTUVfVERMU19NQVhfU1VQUF9PUEVSX0NMQVNTRVMgICAzMgorCit0eXBlZGVmIHN0cnVjdCBfc21lVGRsc1BlZXJDYXBQYXJhbXMgeworCXVpbnQ4X3QgaXNQZWVyUmVzcG9uZGVyOworCXVpbnQ4X3QgcGVlclVhcHNkUXVldWU7CisJdWludDhfdCBwZWVyTWF4U3A7CisJdWludDhfdCBwZWVyQnVmZlN0YVN1cHBvcnQ7CisJdWludDhfdCBwZWVyT2ZmQ2hhblN1cHBvcnQ7CisJdWludDhfdCBwZWVyQ3Vyck9wZXJDbGFzczsKKwl1aW50OF90IHNlbGZDdXJyT3BlckNsYXNzOworCXVpbnQ4X3QgcGVlckNoYW5MZW47CisJdWludDhfdCBwZWVyQ2hhbltTTUVfVERMU19NQVhfU1VQUF9DSEFOTkVMU107CisJdWludDhfdCBwZWVyT3BlckNsYXNzTGVuOworCXVpbnQ4X3QgcGVlck9wZXJDbGFzc1tTTUVfVERMU19NQVhfU1VQUF9PUEVSX0NMQVNTRVNdOworCXVpbnQ4X3QgcHJlZk9mZkNoYW5OdW07CisJdWludDhfdCBwcmVmT2ZmQ2hhbkJhbmR3aWR0aDsKKwl1aW50OF90IG9wQ2xhc3NGb3JQcmVmT2ZmQ2hhbjsKKwl1aW50OF90IG9wQ2xhc3NGb3JQcmVmT2ZmQ2hhbklzU2V0OworfSB0U21lVGRsc1BlZXJDYXBQYXJhbXM7CisKK3R5cGVkZWYgZW51bSB7CisJZVNNRV9URExTX1BFRVJfU1RBVEVfUEVFUklORywKKwllU01FX1RETFNfUEVFUl9TVEFURV9DT05ORUNURUQsCisJZVNNRV9URExTX1BFRVJfU1RBVEVfVEVBUkRPV04KK30gZVNtZVRkbHNQZWVyU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IF9zbWVUZGxzUGVlclN0YXRlUGFyYW1zIHsKKwl1aW50MzJfdCB2ZGV2SWQ7CisJdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisJdWludDMyX3QgcGVlclN0YXRlOworCXRTbWVUZGxzUGVlckNhcFBhcmFtcyBwZWVyQ2FwOworfSB0U21lVGRsc1BlZXJTdGF0ZVBhcmFtczsKKworI2RlZmluZSBFTkFCTEVfQ0hBTlNXSVRDSCAgMQorI2RlZmluZSBESVNBQkxFX0NIQU5TV0lUQ0ggMgorI2RlZmluZSBCV18yMF9PRkZTRVRfQklUICAgMAorI2RlZmluZSBCV180MF9PRkZTRVRfQklUICAgMQorI2RlZmluZSBCV184MF9PRkZTRVRfQklUICAgMgorI2RlZmluZSBCV18xNjBfT0ZGU0VUX0JJVCAgMwordHlwZWRlZiBzdHJ1Y3Qgc21lX3RkbHNfY2hhbl9zd2l0Y2hfcGFyYW1zX3N0cnVjdCB7CisJdWludDMyX3QgdmRldl9pZDsKKwl0U2lyTWFjQWRkciBwZWVyX21hY19hZGRyOworCXVpbnQxNl90IHRkbHNfb2ZmX2NoX2J3X29mZnNldDsvKiBUYXJnZXQgT2ZmIENoYW5uZWwgQmFuZHdpZHRoIG9mZnNldCAqLworCXVpbnQ4X3QgdGRsc19vZmZfY2hhbm5lbDsgICAgICAvKiBUYXJnZXQgT2ZmIENoYW5uZWwgKi8KKwl1aW50OF90IHRkbHNfb2ZmX2NoX21vZGU7ICAgICAgLyogVERMUyBPZmYgQ2hhbm5lbCBNb2RlICovCisJdWludDhfdCBpc19yZXNwb25kZXI7ICAgICAgICAgIC8qIGlzIHBlZXIgcmVzcG9uZGVyIG9yIGluaXRpYXRvciAqLworfSBzbWVfdGRsc19jaGFuX3N3aXRjaF9wYXJhbXM7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KKworLyogVGhlcm1hbCBNaXRpZ2F0aW9uKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBzbWVNaW5UZW1wVGhyZXNob2xkOworCXVpbnQxNl90IHNtZU1heFRlbXBUaHJlc2hvbGQ7Cit9IHRTbWVUaGVybWFsTGV2ZWxJbmZvOworCisjZGVmaW5lIFNNRV9NQVhfVEhFUk1BTF9MRVZFTFMgKDQpCit0eXBlZGVmIHN0cnVjdCB7CisJLyogQXJyYXkgb2YgdGhlcm1hbCBsZXZlbHMgKi8KKwl0U21lVGhlcm1hbExldmVsSW5mbyBzbWVUaGVybWFsTGV2ZWxzW1NNRV9NQVhfVEhFUk1BTF9MRVZFTFNdOworCXVpbnQ4X3Qgc21lVGhlcm1hbE1nbXRFbmFibGVkOworCXVpbnQzMl90IHNtZVRocm90dGxlUGVyaW9kOworfSB0U21lVGhlcm1hbFBhcmFtczsKKwordHlwZWRlZiBlbnVtIHsKKwlTTUVfQUNfQksgPSAwLAorCVNNRV9BQ19CRSA9IDEsCisJU01FX0FDX1ZJID0gMiwKKwlTTUVfQUNfVk8gPSAzCit9IHNtZV9hY19lbnVtX3R5cGU7CisKKy8qIFRTUEVDIERpcmVjdGlvbiBFbnVtIFR5cGUgKi8KK3R5cGVkZWYgZW51bSB7CisJLyogdXBsaW5rICovCisJU01FX1RYX0RJUiA9IDAsCisJLyogZG93bmxpbmsgKi8KKwlTTUVfUlhfRElSID0gMSwKKwkvKiBiaWRpcmVjdGlvbmFsICovCisJU01FX0JJX0RJUiA9IDIsCit9IHNtZV90c3BlY19kaXJfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9vcGVuKHRIYWxIYW5kbGUgaEhhbCk7CitDREZfU1RBVFVTIHNtZV9pbml0X2NoYW5fbGlzdCh0SGFsSGFuZGxlIGhhbCwgdWludDhfdCAqYWxwaGEyLAorCQlDT1VOVFJZX0NPREVfU09VUkNFIGNjX3NyYyk7CitDREZfU1RBVFVTIHNtZV9jbG9zZSh0SGFsSGFuZGxlIGhIYWwpOworQ0RGX1NUQVRVUyBzbWVfc3RhcnQodEhhbEhhbmRsZSBoSGFsKTsKK0NERl9TVEFUVVMgc21lX3N0b3AodEhhbEhhbmRsZSBoSGFsLCB0SGFsU3RvcFR5cGUgc3RvcFR5cGUpOworQ0RGX1NUQVRVUyBzbWVfb3Blbl9zZXNzaW9uKHRIYWxIYW5kbGUgaEhhbCwgY3NyX3JvYW1fY29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywKKwkJdm9pZCAqcENvbnRleHQsIHVpbnQ4X3QgKnBTZWxmTWFjQWRkciwKKwkJdWludDhfdCAqcGJTZXNzaW9uSWQsIHVpbnQzMl90IHR5cGUsCisJCXVpbnQzMl90IHN1YlR5cGUpOwordm9pZCBzbWVfc2V0X2N1cnJfZGV2aWNlX21vZGUodEhhbEhhbmRsZSBoSGFsLCB0Q0RGX0NPTl9NT0RFIGN1cnJEZXZpY2VNb2RlKTsKK0NERl9TVEFUVVMgc21lX2Nsb3NlX3Nlc3Npb24odEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJY3NyX3JvYW1TZXNzaW9uQ2xvc2VDYWxsYmFjayBjYWxsYmFjaywKKwkJdm9pZCAqcENvbnRleHQpOworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3JvYW1fcGFyYW1zKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uX2lkLAorCQlzdHJ1Y3Qgcm9hbV9leHRfcGFyYW1zIHJvYW1fcGFyYW1zX3NyYywgaW50IHVwZGF0ZV9wYXJhbSk7CitDREZfU1RBVFVTIHNtZV91cGRhdGVfY29uZmlnKHRIYWxIYW5kbGUgaEhhbCwKKwkJdHBTbWVDb25maWdQYXJhbXMgcFNtZUNvbmZpZ1BhcmFtcyk7CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCitDREZfU1RBVFVTIHNtZV9zZXRfcGxtX3JlcXVlc3QodEhhbEhhbmRsZSBoSGFsLCB0cFNpclBsbVJlcSBwUGxtKTsKKyNlbmRpZgorCitDREZfU1RBVFVTIHNtZV9zZXQxMWRpbmZvKHRIYWxIYW5kbGUgaEhhbCwgdHBTbWVDb25maWdQYXJhbXMgcFNtZUNvbmZpZ1BhcmFtcyk7CitDREZfU1RBVFVTIHNtZV9nZXRfc29mdF9hcF9kb21haW4odEhhbEhhbmRsZSBoSGFsLAorCQl2X1JFR0RPTUFJTl90ICpkb21haW5JZFNvZnRBcCk7CitDREZfU1RBVFVTIHNtZV9zZXRfcmVnX2luZm8odEhhbEhhbmRsZSBoSGFsLCB1aW50OF90ICphcENudHJ5Q29kZSk7CitDREZfU1RBVFVTIHNtZV9jaGFuZ2VfY29uZmlnX3BhcmFtcyh0SGFsSGFuZGxlIGhIYWwsCisJCXRDc3JVcGRhdGVDb25maWdQYXJhbSAqcFVwZGF0ZUNvbmZpZ1BhcmFtKTsKK0NERl9TVEFUVVMgc21lX2hkZF9yZWFkeV9pbmQodEhhbEhhbmRsZSBoSGFsKTsKK0NERl9TVEFUVVMgc21lX3Byb2Nlc3NfbXNnKHRIYWxIYW5kbGUgaEhhbCwgY2RzX21zZ190ICpwTXNnKTsKK3ZvaWQgc21lX2ZyZWVfbXNnKHRIYWxIYW5kbGUgaEhhbCwgY2RzX21zZ190ICpwTXNnKTsKK0NERl9TVEFUVVMgc21lX3NjYW5fcmVxdWVzdCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl0Q3NyU2NhblJlcXVlc3QgKiwgY3NyX3NjYW5fY29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywKKwkJdm9pZCAqcENvbnRleHQpOworQ0RGX1NUQVRVUyBzbWVfc2Nhbl9nZXRfcmVzdWx0KHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXRDc3JTY2FuUmVzdWx0RmlsdGVyICpwRmlsdGVyLAorCQl0U2NhblJlc3VsdEhhbmRsZSAqcGhSZXN1bHQpOworQ0RGX1NUQVRVUyBzbWVfZ2V0X2FwX2NoYW5uZWxfZnJvbV9zY2FuX2NhY2hlKHRIYWxIYW5kbGUgaEhhbCwKKwkJdENzclJvYW1Qcm9maWxlICpwcm9maWxlLAorCQl0U2NhblJlc3VsdEhhbmRsZSAqc2Nhbl9jYWNoZSwKKwkJdWludDhfdCAqYXBfY2hubF9pZCk7Citib29sIHNtZV9zdG9yZV9qb2lucmVxX3BhcmFtKHRIYWxIYW5kbGUgaGFsX2hhbmRsZSwKKwkJdENzclJvYW1Qcm9maWxlICpwcm9maWxlLAorCQl0U2NhblJlc3VsdEhhbmRsZSBzY2FuX2NhY2hlLAorCQl1aW50MzJfdCAqcm9hbV9pZCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCk7Citib29sIHNtZV9jbGVhcl9qb2lucmVxX3BhcmFtKHRIYWxIYW5kbGUgaGFsX2hhbmRsZSwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCk7CitDREZfU1RBVFVTIHNtZV9pc3N1ZV9zdG9yZWRfam9pbnJlcSh0SGFsSGFuZGxlIGhhbF9oYW5kbGUsCisJCXVpbnQzMl90ICpyb2FtX2lkLAorCQl1aW50MzJfdCBzZXNzaW9uX2lkKTsKK0NERl9TVEFUVVMgc21lX3NjYW5fZmx1c2hfcmVzdWx0KHRIYWxIYW5kbGUgaEhhbCk7CitDREZfU1RBVFVTIHNtZV9maWx0ZXJfc2Nhbl9yZXN1bHRzKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBzbWVfc2Nhbl9mbHVzaF9wMnBfcmVzdWx0KHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpOwordENzclNjYW5SZXN1bHRJbmZvICpzbWVfc2Nhbl9yZXN1bHRfZ2V0X2ZpcnN0KHRIYWxIYW5kbGUsCisJCXRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0KTsKK3RDc3JTY2FuUmVzdWx0SW5mbyAqc21lX3NjYW5fcmVzdWx0X2dldF9uZXh0KHRIYWxIYW5kbGUsCisJCXRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0KTsKK0NERl9TVEFUVVMgc21lX3NjYW5fcmVzdWx0X3B1cmdlKHRIYWxIYW5kbGUgaEhhbCwKKwkJdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5SZXN1bHQpOworQ0RGX1NUQVRVUyBzbWVfc2Nhbl9nZXRfcG1raWRfY2FuZGlkYXRlX2xpc3QodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJdFBta2lkQ2FuZGlkYXRlSW5mbyAqcFBta2lkTGlzdCwKKwkJdWludDMyX3QgKnBOdW1JdGVtcyk7CitDREZfU1RBVFVTIHNtZV9yb2FtX2Nvbm5lY3QodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdWludDMyX3QgKnBSb2FtSWQpOworQ0RGX1NUQVRVUyBzbWVfcm9hbV9yZWFzc29jKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCXRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyBtb2RQcm9maWxlRmllbGRzLAorCQl1aW50MzJfdCAqcFJvYW1JZCwgYm9vbCBmRm9yY2UpOworQ0RGX1NUQVRVUyBzbWVfcm9hbV9jb25uZWN0X3RvX2xhc3RfcHJvZmlsZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgc21lX3JvYW1fZGlzY29ubmVjdCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQllQ3NyUm9hbURpc2Nvbm5lY3RSZWFzb24gcmVhc29uKTsKK0NERl9TVEFUVVMgc21lX3JvYW1fc3RvcF9ic3ModEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCk7CitDREZfU1RBVFVTIHNtZV9yb2FtX2dldF9hc3NvY2lhdGVkX3N0YXModEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJQ0RGX01PRFVMRV9JRCBtb2RJZCwgdm9pZCAqcFVzckNvbnRleHQsCisJCXZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssCisJCXVpbnQ4X3QgKnBBc3NvY1N0YXNCdWYpOworQ0RGX1NUQVRVUyBzbWVfcm9hbV9kaXNjb25uZWN0X3N0YSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB1aW50OF90ICpwUGVlck1hY0FkZHIpOworQ0RGX1NUQVRVUyBzbWVfcm9hbV9kZWF1dGhfc3RhKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXN0cnVjdCB0YWdDc3JEZWxTdGFQYXJhbXMgKnBEZWxTdGFQYXJhbXMpOworQ0RGX1NUQVRVUyBzbWVfcm9hbV90a2lwX2NvdW50ZXJfbWVhc3VyZXModEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJYm9vbCBiRW5hYmxlKTsKK0NERl9TVEFUVVMgc21lX3JvYW1fZ2V0X3dwc19zZXNzaW9uX292ZXJsYXAodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJdm9pZCAqcFVzckNvbnRleHQsCisJCXZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssCisJCXN0cnVjdCBjZGZfbWFjX2FkZHIgcFJlbW92ZU1hYyk7CitDREZfU1RBVFVTIHNtZV9yb2FtX2dldF9jb25uZWN0X3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCWVDc3JDb25uZWN0U3RhdGUgKnBTdGF0ZSk7CitDREZfU1RBVFVTIHNtZV9yb2FtX2dldF9jb25uZWN0X3Byb2ZpbGUodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSk7CitDREZfU1RBVFVTIHNtZV9yb2FtX2ZyZWVfY29ubmVjdF9wcm9maWxlKHRIYWxIYW5kbGUgaEhhbCwKKwkJdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSk7CitDREZfU1RBVFVTIHNtZV9yb2FtX3NldF9wbWtpZF9jYWNoZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl0UG1raWRDYWNoZUluZm8gKnBQTUtJRENhY2hlLAorCQl1aW50MzJfdCBudW1JdGVtcywKKwkJYm9vbCB1cGRhdGVfZW50aXJlX2NhY2hlKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKK0NERl9TVEFUVVMgc21lX3JvYW1fc2V0X3Bza19wbWsodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJdWludDhfdCAqcFBTS19QTUssIHNpemVfdCBwbWtfbGVuKTsKKyNlbmRpZgorQ0RGX1NUQVRVUyBzbWVfcm9hbV9nZXRfc2VjdXJpdHlfcmVxX2llKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXVpbnQzMl90ICpwTGVuLCB1aW50OF90ICpwQnVmLAorCQllQ3NyU2VjdXJpdHlUeXBlIHNlY1R5cGUpOworQ0RGX1NUQVRVUyBzbWVfcm9hbV9nZXRfc2VjdXJpdHlfcnNwX2llKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXVpbnQzMl90ICpwTGVuLCB1aW50OF90ICpwQnVmLAorCQllQ3NyU2VjdXJpdHlUeXBlIHNlY1R5cGUpOwordWludDMyX3Qgc21lX3JvYW1fZ2V0X251bV9wbWtpZF9jYWNoZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgc21lX3JvYW1fZ2V0X3Bta2lkX2NhY2hlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXVpbnQzMl90ICpwTnVtLAorCQl0UG1raWRDYWNoZUluZm8gKnBQbWtpZENhY2hlKTsKK0NERl9TVEFUVVMgc21lX2dldF9jb25maWdfcGFyYW0odEhhbEhhbmRsZSBoSGFsLCB0U21lQ29uZmlnUGFyYW1zICpwUGFyYW0pOworQ0RGX1NUQVRVUyBzbWVfZ2V0X3N0YXRpc3RpY3ModEhhbEhhbmRsZSBoSGFsLAorCQllQ3NyU3RhdHNSZXF1ZXN0ZXJUeXBlIHJlcXVlc3RlcklkLAorCQl1aW50MzJfdCBzdGF0c01hc2ssIHRDc3JTdGF0c0NhbGxiYWNrIGNhbGxiYWNrLAorCQl1aW50MzJfdCBwZXJpb2RpY2l0eSwgYm9vbCBjYWNoZSwgdWludDhfdCBzdGFJZCwKKwkJdm9pZCAqcENvbnRleHQsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgc21lX2dldF9yc3NpKHRIYWxIYW5kbGUgaEhhbCwKKwkJdENzclJzc2lDYWxsYmFjayBjYWxsYmFjaywKKwkJdWludDhfdCBzdGFJZCwgc3RydWN0IGNkZl9tYWNfYWRkciBic3NJZCwgaW50OF90IGxhc3RSU1NJLAorCQl2b2lkICpwQ29udGV4dCwgdm9pZCAqcF9jZHNfY29udGV4dCk7CitDREZfU1RBVFVTIHNtZV9nZXRfc25yKHRIYWxIYW5kbGUgaEhhbCwKKwkJdENzclNuckNhbGxiYWNrIGNhbGxiYWNrLAorCQl1aW50OF90IHN0YUlkLCBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkLCB2b2lkICpwQ29udGV4dCk7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorQ0RGX1NUQVRVUyBzbWVfZ2V0X3RzbV9zdGF0cyh0SGFsSGFuZGxlIGhIYWwsCisJCXRDc3JUc21TdGF0c0NhbGxiYWNrIGNhbGxiYWNrLAorCQl1aW50OF90IHN0YUlkLCBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkLAorCQl2b2lkICpwQ29udGV4dCwgdm9pZCAqcF9jZHNfY29udGV4dCwgdWludDhfdCB0aWQpOworQ0RGX1NUQVRVUyBzbWVfc2V0X2Nja21faWUodEhhbEhhbmRsZSBoSGFsLAorCQl1aW50OF90IHNlc3Npb25JZCwKKwkJdWludDhfdCAqcENja21JZSwgdWludDhfdCBjY2ttSWVMZW4pOworQ0RGX1NUQVRVUyBzbWVfc2V0X2VzZV9iZWFjb25fcmVxdWVzdCh0SGFsSGFuZGxlIGhIYWwsIGNvbnN0IHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB0Q3NyRXNlQmVhY29uUmVxICpwRXNlQmNuUmVxKTsKKyNlbmRpZiAvKkZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KK0NERl9TVEFUVVMgc21lX2NmZ19zZXRfaW50KHRIYWxIYW5kbGUgaGFsLCB1aW50MTZfdCBjZmdfaWQsIHVpbnQzMl90IHZhbHVlKTsKK0NERl9TVEFUVVMgc21lX2NmZ19zZXRfc3RyKHRIYWxIYW5kbGUgaGFsLCB1aW50MTZfdCBjZmdfaWQsIHVpbnQ4X3QgKnN0ciwKKwkJdWludDMyX3QgbGVuZ3RoKTsKK0NERl9TVEFUVVMgc21lX2NmZ19nZXRfaW50KHRIYWxIYW5kbGUgaGFsLCB1aW50MTZfdCBjZmdfaWQsCisJCXVpbnQzMl90ICpjZmdfdmFsdWUpOworQ0RGX1NUQVRVUyBzbWVfY2ZnX2dldF9zdHIodEhhbEhhbmRsZSBoYWwsIHVpbnQxNl90IGNmZ19pZCwgdWludDhfdCAqc3RyLAorCQl1aW50MzJfdCAqbGVuZ3RoKTsKK0NERl9TVEFUVVMgc21lX2dldF9tb2RpZnlfcHJvZmlsZV9maWVsZHModEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqCisJCQkJCSBwTW9kaWZ5UHJvZmlsZUZpZWxkcyk7CisKK2V4dGVybiBDREZfU1RBVFVTIHNtZV9zZXRfaG9zdF9wb3dlcl9zYXZlKHRIYWxIYW5kbGUgaEhhbCwgYm9vbCBwc01vZGUpOworCit2b2lkIHNtZV9zZXRfZGhjcF90aWxsX3Bvd2VyX2FjdGl2ZV9mbGFnKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBmbGFnKTsKK2V4dGVybiBDREZfU1RBVFVTIHNtZV9yZWdpc3RlcjExZF9zY2FuX2RvbmVfY2FsbGJhY2sodEhhbEhhbmRsZSBoSGFsLAorCQljc3Jfc2Nhbl9jb21wbGV0ZUNhbGxiYWNrKTsKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKK2V4dGVybiBDREZfU1RBVFVTIHNtZV9yZWdpc3Rlcl9vZW1fZGF0YV9yc3BfY2FsbGJhY2sodEhhbEhhbmRsZSBoX2hhbCwKKwkJc21lX3NlbmRfb2VtX2RhdGFfcnNwX21zZyBjYWxsYmFjayk7CisjZW5kaWYKKworZXh0ZXJuIENERl9TVEFUVVMgc21lX3dvd19hZGRfcGF0dGVybih0SGFsSGFuZGxlIGhIYWwsCisJCXN0cnVjdCB3b3dfYWRkX3BhdHRlcm4gKnBhdHRlcm4sIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK2V4dGVybiBDREZfU1RBVFVTIHNtZV93b3dfZGVsZXRlX3BhdHRlcm4odEhhbEhhbmRsZSBoSGFsLAorCQlzdHJ1Y3Qgd293X2RlbGV0ZV9wYXR0ZXJuICpwYXR0ZXJuLCB1aW50OF90IHNlc3Npb25JZCk7CisKK3ZvaWQgc21lX3JlZ2lzdGVyX2Z0bV9tc2dfcHJvY2Vzc29yKHRIYWxIYW5kbGUgaGFsLAorCQkJCSAgICBoZGRfZnRtX21zZ19wcm9jZXNzb3IgY2FsbGJhY2spOworCitleHRlcm4gQ0RGX1NUQVRVUyBzbWVfZW50ZXJfd293bCh0SGFsSGFuZGxlIGhIYWwsCisJCQkgdm9pZCAoKmVudGVyX3dvd2xfY2FsbGJhY2tfcm91dGluZSkodm9pZAorCQkJCQkJICAqY2FsbGJhY2tDb250ZXh0LAorCQkJCQkJICBDREZfU1RBVFVTICBzdGF0dXMpLAorCQkJIHZvaWQgKmVudGVyX3dvd2xfY2FsbGJhY2tfY29udGV4dCwKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKwkJCSB2b2lkICgqd2FrZV9yZWFzb25faW5kX2NiKSh2b2lkICpjYWxsYmFja0NvbnRleHQsCisJCQkJCQkgdHBTaXJXYWtlUmVhc29uSW5kCisJCQkJCQkgd2FrZV9yZWFzb25faW5kKSwKKwkJCSB2b2lkICp3YWtlX3JlYXNvbl9pbmRfY2JfY3R4LAorI2VuZGlmIC8qIFdMQU5fV0FLRVVQX0VWRU5UUyAqLworCQkJIHRwU2lyU21lV293bEVudGVyUGFyYW1zIHdvd2xfZW50ZXJfcGFyYW1zLAorCQkJIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKKworZXh0ZXJuIENERl9TVEFUVVMgc21lX2V4aXRfd293bCh0SGFsSGFuZGxlIGhIYWwsCisJCXRwU2lyU21lV293bEV4aXRQYXJhbXMgd293bF9leGl0X3BhcmFtcyk7CitDREZfU1RBVFVTIHNtZV9yb2FtX3NldF9rZXkodEhhbEhhbmRsZSwgdWludDhfdCBzZXNzaW9uSWQsCisJCXRDc3JSb2FtU2V0S2V5ICpwU2V0S2V5LCB1aW50MzJfdCAqcFJvYW1JZCk7CitDREZfU1RBVFVTIHNtZV9nZXRfY291bnRyeV9jb2RlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCAqcEJ1ZiwgdWludDhfdCAqcGJMZW4pOworCisKK3ZvaWQgc21lX2FwcGx5X2NoYW5uZWxfcG93ZXJfaW5mb190b19mdyh0SGFsSGFuZGxlIGhIYWwpOworCisvKiBzb21lIHN1cHBvcnQgZnVuY3Rpb25zICovCitib29sIHNtZV9pczExZF9zdXBwb3J0ZWQodEhhbEhhbmRsZSBoSGFsKTsKK2Jvb2wgc21lX2lzMTFoX3N1cHBvcnRlZCh0SGFsSGFuZGxlIGhIYWwpOworYm9vbCBzbWVfaXNfd21tX3N1cHBvcnRlZCh0SGFsSGFuZGxlIGhIYWwpOworCit0eXBlZGVmIHZvaWQgKCp0U21lQ2hhbmdlQ291bnRyeUNhbGxiYWNrKSh2b2lkICpwQ29udGV4dCk7CitDREZfU1RBVFVTIHNtZV9jaGFuZ2VfY291bnRyeV9jb2RlKHRIYWxIYW5kbGUgaEhhbCwKKwkJdFNtZUNoYW5nZUNvdW50cnlDYWxsYmFjayBjYWxsYmFjaywKKwkJdWludDhfdCAqcENvdW50cnksCisJCXZvaWQgKnBDb250ZXh0LAorCQl2b2lkICpwX2Nkc19jb250ZXh0LAorCQl0QW5pQm9vbCBjb3VudHJ5RnJvbVVzZXJTcGFjZSwKKwkJdEFuaUJvb2wgc2VuZFJlZ0hpbnQpOworQ0RGX1NUQVRVUyBzbWVfZ2VuZXJpY19jaGFuZ2VfY291bnRyeV9jb2RlKHRIYWxIYW5kbGUgaEhhbCwKKwkJdWludDhfdCAqcENvdW50cnksCisJCXZfUkVHRE9NQUlOX3QgcmVnX2RvbWFpbik7CisKK0NERl9TVEFUVVMgc21lX2RoY3Bfc3RhcnRfaW5kKHRIYWxIYW5kbGUgaEhhbCwKKwkJdWludDhfdCBkZXZpY2VfbW9kZSwKKwkJdWludDhfdCAqbWFjQWRkciwgdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBzbWVfZGhjcF9zdG9wX2luZCh0SGFsSGFuZGxlIGhIYWwsCisJCXVpbnQ4X3QgZGV2aWNlX21vZGUsCisJCXVpbnQ4X3QgKm1hY0FkZHIsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK3ZvaWQgc21lX3NldF9jZmdfcHJpdmFjeSh0SGFsSGFuZGxlIGhIYWwsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCWJvb2wgZlByaXZhY3kpOwordm9pZCBzbWVfZ2V0X3JlY292ZXJ5X3N0YXRzKHRIYWxIYW5kbGUgaEhhbCk7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCitDREZfU1RBVFVTIHNtZV9uZWlnaGJvcl9yZXBvcnRfcmVxdWVzdCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl0cFJybU5laWdoYm9yUmVxIHBScm1OZWlnaGJvclJlcSwKKwkJdHBScm1OZWlnaGJvclJzcENhbGxiYWNrSW5mbyBjYWxsYmFja0luZm8pOworI2VuZGlmCitDREZfU1RBVFVTIHNtZV9nZXRfd2Nuc3Nfd2xhbl9jb21waWxlZF92ZXJzaW9uKHRIYWxIYW5kbGUgaEhhbCwKKwkJdFNpclZlcnNpb25UeXBlICogcFZlcnNpb24pOworQ0RGX1NUQVRVUyBzbWVfZ2V0X3djbnNzX3dsYW5fcmVwb3J0ZWRfdmVyc2lvbih0SGFsSGFuZGxlIGhIYWwsCisJCXRTaXJWZXJzaW9uVHlwZSAqcFZlcnNpb24pOworQ0RGX1NUQVRVUyBzbWVfZ2V0X3djbnNzX3NvZnR3YXJlX3ZlcnNpb24odEhhbEhhbmRsZSBoSGFsLAorCQl1aW50OF90ICpwVmVyc2lvbiwgdWludDMyX3QgdmVyc2lvbkJ1ZmZlclNpemUpOworQ0RGX1NUQVRVUyBzbWVfZ2V0X3djbnNzX2hhcmR3YXJlX3ZlcnNpb24odEhhbEhhbmRsZSBoSGFsLAorCQl1aW50OF90ICpwVmVyc2lvbiwgdWludDMyX3QgdmVyc2lvbkJ1ZmZlclNpemUpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCitDREZfU1RBVFVTIHNtZV9zY2FuX2dldF9ia2lkX2NhbmRpZGF0ZV9saXN0KHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkLAorCQl0QmtpZENhbmRpZGF0ZUluZm8gKiBwQmtpZExpc3QsCisJCXVpbnQzMl90ICpwTnVtSXRlbXMpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCitDREZfU1RBVFVTIHNtZV9vZW1fZGF0YV9yZXEodEhhbEhhbmRsZSBoSGFsLAorCQl1aW50OF90IHNlc3Npb25JZCwKKwkJdE9lbURhdGFSZXFDb25maWcgKiwKKwkJdWludDMyX3QgKnBPZW1EYXRhUmVxSUQsCisJCW9lbV9kYXRhX29lbV9kYXRhX3JlcUNvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2ssCisJCXZvaWQgKnBDb250ZXh0KTsKKyNlbmRpZiAvKkZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVCAqLworQ0RGX1NUQVRVUyBzbWVfcm9hbV91cGRhdGVfYXB3cHNpZSh0SGFsSGFuZGxlLCB1aW50OF90IHNlc3Npb25JZCwKKwkJdFNpckFQV1BTSUVzICogcEFQV1BTSUVTKTsKK0NERl9TVEFUVVMgc21lX3JvYW1fdXBkYXRlX2Fwd3BhcnNuaV9lcyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl0U2lyUlNOaWUgKnBBUFNpclJTTmllKTsKK0NERl9TVEFUVVMgc21lX2NoYW5nZV9tY2NfYmVhY29uX2ludGVydmFsKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBzbWVfc2V0X2hvc3Rfb2ZmbG9hZCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl0cFNpckhvc3RPZmZsb2FkUmVxIHBSZXF1ZXN0KTsKK0NERl9TVEFUVVMgc21lX3NldF9rZWVwX2FsaXZlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXRwU2lyS2VlcEFsaXZlUmVxIHBSZXF1ZXN0KTsKK0NERl9TVEFUVVMgc21lX2dldF9vcGVyYXRpb25fY2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90ICpwQ2hhbm5lbCwKKwkJdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBzbWVfcmVnaXN0ZXJfbWdtdF9mcmFtZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl1aW50MTZfdCBmcmFtZVR5cGUsIHVpbnQ4X3QgKm1hdGNoRGF0YSwKKwkJdWludDE2X3QgbWF0Y2hMZW4pOworQ0RGX1NUQVRVUyBzbWVfZGVyZWdpc3Rlcl9tZ210X2ZyYW1lKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXVpbnQxNl90IGZyYW1lVHlwZSwgdWludDhfdCAqbWF0Y2hEYXRhLAorCQl1aW50MTZfdCBtYXRjaExlbik7CitDREZfU1RBVFVTIHNtZV9jb25maWd1cmVfcnhwX2ZpbHRlcih0SGFsSGFuZGxlIGhIYWwsCisJCXRwU2lyV2xhblNldFJ4cEZpbHRlcnMgd2xhblJ4cEZpbHRlclBhcmFtKTsKK0NERl9TVEFUVVMgc21lX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZSh0SGFsSGFuZGxlIGhIYWwsIGJvb2wgaXNBcHBzQXdha2UpOworQ0RGX1NUQVRVUyBzbWVfY29uZmlndXJlX3N1c3BlbmRfaW5kKHRIYWxIYW5kbGUgaEhhbCwKKwkJdHBTaXJXbGFuU3VzcGVuZFBhcmFtIHdsYW5TdXNwZW5kUGFyYW0sCisJCWNzcl9yZWFkeVRvU3VzcGVuZENhbGxiYWNrLAorCQl2b2lkICpjYWxsYmFja0NvbnRleHQpOworQ0RGX1NUQVRVUyBzbWVfY29uZmlndXJlX3Jlc3VtZV9yZXEodEhhbEhhbmRsZSBoSGFsLAorCQl0cFNpcldsYW5SZXN1bWVQYXJhbSB3bGFuUmVzdW1lUGFyYW0pOworI2lmZGVmIFdMQU5fRkVBVFVSRV9FWFRXT1dfU1VQUE9SVAorQ0RGX1NUQVRVUyBzbWVfY29uZmlndXJlX2V4dF93b193KHRIYWxIYW5kbGUgaEhhbCwKKwkJdHBTaXJFeHRXb1dQYXJhbXMgd2xhbkV4dFBhcmFtcywKKwkJY3NyX3JlYWR5VG9TdXNwZW5kQ2FsbGJhY2sgY2FsbGJhY2ssCisJCXZvaWQgKmNhbGxiYWNrQ29udGV4dCk7CitDREZfU1RBVFVTIHNtZV9jb25maWd1cmVfYXBwX3R5cGUxX3BhcmFtcyh0SGFsSGFuZGxlIGhIYWwsCisJCXRwU2lyQXBwVHlwZTFQYXJhbXMgd2xhbkFwcFR5cGUxUGFyYW1zKTsKK0NERl9TVEFUVVMgc21lX2NvbmZpZ3VyZV9hcHBfdHlwZTJfcGFyYW1zKHRIYWxIYW5kbGUgaEhhbCwKKwkJdHBTaXJBcHBUeXBlMlBhcmFtcyB3bGFuQXBwVHlwZTJQYXJhbXMpOworI2VuZGlmCitpbnQ4X3Qgc21lX2dldF9pbmZyYV9zZXNzaW9uX2lkKHRIYWxIYW5kbGUgaEhhbCk7Cit1aW50OF90IHNtZV9nZXRfaW5mcmFfb3BlcmF0aW9uX2NoYW5uZWwodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCk7Cit1aW50OF90IHNtZV9nZXRfY29uY3VycmVudF9vcGVyYXRpb25fY2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAordWludDE2X3Qgc21lX2NoZWNrX2NvbmN1cnJlbnRfY2hhbm5lbF9vdmVybGFwKHRIYWxIYW5kbGUgaEhhbCwgdWludDE2X3Qgc2FwX2NoLAorCQllQ3NyUGh5TW9kZSBzYXBQaHlNb2RlLAorCQl1aW50OF90IGNjX3N3aXRjaF9tb2RlKTsKKyNlbmRpZgorQ0RGX1NUQVRVUyBzbWVfYWJvcnRfbWFjX3NjYW4odEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJZUNzckFib3J0UmVhc29uIHJlYXNvbik7CitDREZfU1RBVFVTIHNtZV9nZXRfY2ZnX3ZhbGlkX2NoYW5uZWxzKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCAqYVZhbGlkQ2hhbm5lbHMsCisJCXVpbnQzMl90ICpsZW4pOworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworQ0RGX1NUQVRVUyBzbWVfc2V0X3ByZWZlcnJlZF9uZXR3b3JrX2xpc3QodEhhbEhhbmRsZSBoSGFsLAorCQl0cFNpclBOT1NjYW5SZXEgcFJlcXVlc3QsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLAorCQlwcmVmZXJyZWRfbmV0d29ya19mb3VuZF9pbmRfY2IKKwkJY2FsbGJhY2tSb3V0aW5lLCB2b2lkICpjYWxsYmFja0NvbnRleHQpOworCitDREZfU1RBVFVTIHNtZV9wcmVmZXJyZWRfbmV0d29ya19mb3VuZF9pbmQodEhhbEhhbmRsZSBoSGFsLCB2b2lkICpwTXNnKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworQ0RGX1NUQVRVUyBzbWVfODAyM19tdWx0aWNhc3RfbGlzdCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl0cFNpclJjdkZsdE1jQWRkckxpc3QgcE11bHRpY2FzdEFkZHJzKTsKK0NERl9TVEFUVVMgc21lX3JlY2VpdmVfZmlsdGVyX3NldF9maWx0ZXIodEhhbEhhbmRsZSBoSGFsLAorCQl0cFNpclJjdlBrdEZpbHRlckNmZ1R5cGUgcFJjdlBrdEZpbHRlckNmZywKKwkJdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBzbWVfcmVjZWl2ZV9maWx0ZXJfY2xlYXJfZmlsdGVyKHRIYWxIYW5kbGUgaEhhbCwKKwkJdHBTaXJSY3ZGbHRQa3RDbGVhclBhcmFtIHBSY3ZGbHRQa3RDbGVhclBhcmFtLAorCQl1aW50OF90IHNlc3Npb25JZCk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcgKi8KK2Jvb2wgc21lX2lzX2NoYW5uZWxfdmFsaWQodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IGNoYW5uZWwpOworQ0RGX1NUQVRVUyBzbWVfc2V0X2ZyZXFfYmFuZCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQllQ3NyQmFuZCBlQmFuZCk7CitDREZfU1RBVFVTIHNtZV9nZXRfZnJlcV9iYW5kKHRIYWxIYW5kbGUgaEhhbCwgZUNzckJhbmQgKnBCYW5kKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKK0NERl9TVEFUVVMgc21lX3NldF9ndGtfb2ZmbG9hZCh0SGFsSGFuZGxlIGhhbF9jdHgsCisJCXRwU2lyR3RrT2ZmbG9hZFBhcmFtcyByZXF1ZXN0LAorCQl1aW50OF90IHNlc3Npb25faWQpOworQ0RGX1NUQVRVUyBzbWVfZ2V0X2d0a19vZmZsb2FkKHRIYWxIYW5kbGUgaGFsX2N0eCwKKwkJZ3RrX29mZmxvYWRfZ2V0X2luZm9fY2FsbGJhY2sgY2FsbGJhY2tfcm91dGluZSwKKwkJdm9pZCAqY2FsbGJhY2tfY29udGV4dCwgdWludDhfdCBzZXNzaW9uX2lkKTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQgKi8KK3VpbnQxNl90IHNtZV9jaG5fdG9fZnJlcSh1aW50OF90IGNoYW5OdW0pOworYm9vbCBzbWVfaXNfY2hhbm5lbF92YWxpZCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgY2hhbm5lbCk7CitDREZfU1RBVFVTIHNtZV9zZXRfbWF4X3R4X3Bvd2VyKHRIYWxIYW5kbGUgaEhhbCwgdFNpck1hY0FkZHIgcEJzc2lkLAorCQl0U2lyTWFjQWRkciBwU2VsZk1hY0FkZHJlc3MsIGludDhfdCBkQik7CitDREZfU1RBVFVTIHNtZV9zZXRfbWF4X3R4X3Bvd2VyX3Blcl9iYW5kKGVDc3JCYW5kIGJhbmQsIGludDhfdCBkYik7CitDREZfU1RBVFVTIHNtZV9zZXRfdHhfcG93ZXIodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJdFNpck1hY0FkZHIgcEJTU0lkLAorCQl0Q0RGX0NPTl9NT0RFIGRldl9tb2RlLCBpbnQgcG93ZXIpOworQ0RGX1NUQVRVUyBzbWVfc2V0X2N1c3RvbV9tYWNfYWRkcih0U2lyTWFjQWRkciBjdXN0b21NYWNBZGRyKTsKK0NERl9TVEFUVVMgc21lX2hpZGVfc3NpZCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl1aW50OF90IHNzaWRIaWRkZW4pOworQ0RGX1NUQVRVUyBzbWVfc2V0X3RtX2xldmVsKHRIYWxIYW5kbGUgaEhhbCwgdWludDE2X3QgbmV3VE1MZXZlbCwKKwkJdWludDE2X3QgdG1Nb2RlKTsKK3ZvaWQgc21lX2ZlYXR1cmVfY2Fwc19leGNoYW5nZSh0SGFsSGFuZGxlIGhIYWwpOwordm9pZCBzbWVfZGlzYWJsZV9mZWF0dXJlX2NhcGFibGl0eSh1aW50OF90IGZlYXR1cmVfaW5kZXgpOwordm9pZCBzbWVfcmVzZXRfcG93ZXJfdmFsdWVzX2ZvcjVfZyh0SGFsSGFuZGxlIGhIYWwpOworI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IFwKKwkJZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3JvYW1fcHJlZmVyNV9nX2h6KHRIYWxIYW5kbGUgaEhhbCwgYm9vbCBuUm9hbVByZWZlcjVHSHopOworQ0RGX1NUQVRVUyBzbWVfc2V0X3JvYW1faW50cmFfYmFuZCh0SGFsSGFuZGxlIGhIYWwsIGNvbnN0IGJvb2wgblJvYW1JbnRyYUJhbmQpOworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3JvYW1fc2Nhbl9uX3Byb2Jlcyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB1aW50OF90IG5Qcm9iZXMpOworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3JvYW1fc2Nhbl9ob21lX2F3YXlfdGltZSh0SGFsSGFuZGxlIGhIYWwsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB1aW50MTZfdCBuUm9hbVNjYW5Ib21lQXdheVRpbWUsCisJCWNvbnN0IGJvb2wgYlNlbmRPZmZsb2FkQ21kKTsKKworYm9vbCBzbWVfZ2V0X3JvYW1faW50cmFfYmFuZCh0SGFsSGFuZGxlIGhIYWwpOwordWludDhfdCBzbWVfZ2V0X3JvYW1fc2Nhbl9uX3Byb2Jlcyh0SGFsSGFuZGxlIGhIYWwpOwordWludDE2X3Qgc21lX2dldF9yb2FtX3NjYW5faG9tZV9hd2F5X3RpbWUodEhhbEhhbmRsZSBoSGFsKTsKK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9yb2FtX3Jzc2lfZGlmZih0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl1aW50OF90IFJvYW1Sc3NpRGlmZik7CitDREZfU1RBVFVTIHNtZV91cGRhdGVfZmFzdF90cmFuc2l0aW9uX2VuYWJsZWQodEhhbEhhbmRsZSBoSGFsLAorCQlib29sIGlzRmFzdFRyYW5zaXRpb25FbmFibGVkKTsKK0NERl9TVEFUVVMgc21lX3VwZGF0ZV93ZXNfbW9kZSh0SGFsSGFuZGxlIGhIYWwsIGJvb2wgaXNXRVNNb2RlRW5hYmxlZCwKKwkJdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBzbWVfc2V0X3JvYW1fc2Nhbl9jb250cm9sKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCWJvb2wgcm9hbVNjYW5Db250cm9sKTsKKyNlbmRpZiAvKiAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpfHwoRkVBVFVSRV9XTEFOX0VTRSl8fChGRUFUVVJFX1dMQU5fTEZSKSAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX2lzX2Zhc3Rfcm9hbV9pbmlfZmVhdHVyZV9lbmFibGVkKHRIYWxIYW5kbGUgaEhhbCwKKwkJdWludDhfdCBzZXNzaW9uSWQsCisJCWNvbnN0IGJvb2wKKwkJaXNGYXN0Um9hbUluaUZlYXR1cmVFbmFibGVkKTsKK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9pc19tYXdjX2luaV9mZWF0dXJlX2VuYWJsZWQodEhhbEhhbmRsZSBoSGFsLAorCQljb25zdCBib29sIE1BV0NFbmFibGVkKTsKK0NERl9TVEFUVVMgc21lX3N0b3Bfcm9hbWluZyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLCB1aW50OF90IHJlYXNvbik7CitDREZfU1RBVFVTIHNtZV9zdGFydF9yb2FtaW5nKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXVpbnQ4X3QgcmVhc29uKTsKK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9lbmFibGVfZmFzdF9yb2FtX2luX2NvbmN1cnJlbmN5KHRIYWxIYW5kbGUgaEhhbCwKKwkJYm9vbCBiRmFzdFJvYW1JbkNvbkluaUZlYXR1cmVFbmFibGVkKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTEZSICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX2lzX2VzZV9mZWF0dXJlX2VuYWJsZWQodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJY29uc3QgYm9vbCBpc0VzZUluaUZlYXR1cmVFbmFibGVkKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICovCitDREZfU1RBVFVTIHNtZV91cGRhdGVfY29uZmlnX2Z3X3Jzc2lfbW9uaXRvcmluZyh0SGFsSGFuZGxlIGhIYWwsCisJCWJvb2wgZkVuYWJsZUZ3UnNzaU1vbml0b3JpbmcpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCitDREZfU1RBVFVTIHNtZV9zZXRfcm9hbV9yZXNjYW5fcnNzaV9kaWZmKHRIYWxIYW5kbGUgaEhhbCwKKwkJdWludDhfdCBzZXNzaW9uSWQsCisJCWNvbnN0IHVpbnQ4X3QgblJvYW1SZXNjYW5Sc3NpRGlmZik7Cit1aW50OF90IHNtZV9nZXRfcm9hbV9yZXNjYW5fcnNzaV9kaWZmKHRIYWxIYW5kbGUgaEhhbCk7CisKK0NERl9TVEFUVVMgc21lX3NldF9yb2FtX29wcG9ydHVuaXN0aWNfc2Nhbl90aHJlc2hvbGRfZGlmZih0SGFsSGFuZGxlIGhIYWwsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB1aW50OF90IG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZik7Cit1aW50OF90IHNtZV9nZXRfcm9hbV9vcHBvcnR1bmlzdGljX3NjYW5fdGhyZXNob2xkX2RpZmYodEhhbEhhbmRsZSBoSGFsKTsKK0NERl9TVEFUVVMgc21lX3NldF9uZWlnaGJvcl9sb29rdXBfcnNzaV90aHJlc2hvbGQodEhhbEhhbmRsZSBoSGFsLAorCQl1aW50OF90IHNlc3Npb25JZCwgdWludDhfdCBuZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQpOworQ0RGX1NUQVRVUyBzbWVfc2V0X2RlbGF5X2JlZm9yZV92ZGV2X3N0b3AodEhhbEhhbmRsZSBoSGFsLAorCQl1aW50OF90IHNlc3Npb25JZCwgdWludDhfdCBkZWxheV9iZWZvcmVfdmRldl9zdG9wKTsKK3VpbnQ4X3Qgc21lX2dldF9uZWlnaGJvcl9sb29rdXBfcnNzaV90aHJlc2hvbGQodEhhbEhhbmRsZSBoSGFsKTsKK0NERl9TVEFUVVMgc21lX3NldF9uZWlnaGJvcl9zY2FuX3JlZnJlc2hfcGVyaW9kKHRIYWxIYW5kbGUgaEhhbCwKKwkJdWludDhfdCBzZXNzaW9uSWQsIHVpbnQxNl90IG5laWdoYm9yU2NhblJlc3VsdHNSZWZyZXNoUGVyaW9kKTsKK3VpbnQxNl90IHNtZV9nZXRfbmVpZ2hib3Jfc2Nhbl9yZWZyZXNoX3BlcmlvZCh0SGFsSGFuZGxlIGhIYWwpOwordWludDE2X3Qgc21lX2dldF9lbXB0eV9zY2FuX3JlZnJlc2hfcGVyaW9kKHRIYWxIYW5kbGUgaEhhbCk7CitDREZfU1RBVFVTIHNtZV91cGRhdGVfZW1wdHlfc2Nhbl9yZWZyZXNoX3BlcmlvZCh0SGFsSGFuZGxlIGhIYWwsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLCB1aW50MTZfdCBuRW1wdHlTY2FuUmVmcmVzaFBlcmlvZCk7CitDREZfU1RBVFVTIHNtZV9zZXRfbmVpZ2hib3Jfc2Nhbl9taW5fY2hhbl90aW1lKHRIYWxIYW5kbGUgaEhhbCwKKwkJY29uc3QgdWludDE2X3Qgbk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lLAorCQl1aW50OF90IHNlc3Npb25JZCk7CitDREZfU1RBVFVTIHNtZV9zZXRfbmVpZ2hib3Jfc2Nhbl9tYXhfY2hhbl90aW1lKHRIYWxIYW5kbGUgaEhhbCwKKwkJdWludDhfdCBzZXNzaW9uSWQsIGNvbnN0IHVpbnQxNl90IG5OZWlnaGJvclNjYW5NYXhDaGFuVGltZSk7Cit1aW50MTZfdCBzbWVfZ2V0X25laWdoYm9yX3NjYW5fbWluX2NoYW5fdGltZSh0SGFsSGFuZGxlIGhIYWwsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkKTsKK3VpbnQzMl90IHNtZV9nZXRfbmVpZ2hib3Jfcm9hbV9zdGF0ZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK3VpbnQzMl90IHNtZV9nZXRfY3VycmVudF9yb2FtX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpOwordWludDMyX3Qgc21lX2dldF9jdXJyZW50X3JvYW1fc3ViX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpOwordWludDMyX3Qgc21lX2dldF9saW1fc21lX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCk7Cit1aW50MzJfdCBzbWVfZ2V0X2xpbV9tbG1fc3RhdGUodEhhbEhhbmRsZSBoSGFsKTsKK2Jvb2wgc21lX2lzX2xpbV9zZXNzaW9uX3ZhbGlkKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpOwordWludDMyX3Qgc21lX2dldF9saW1fc21lX3Nlc3Npb25fc3RhdGUodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCk7Cit1aW50MzJfdCBzbWVfZ2V0X2xpbV9tbG1fc2Vzc2lvbl9zdGF0ZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK3VpbnQxNl90IHNtZV9nZXRfbmVpZ2hib3Jfc2Nhbl9tYXhfY2hhbl90aW1lKHRIYWxIYW5kbGUgaEhhbCwKKwkJdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBzbWVfc2V0X25laWdoYm9yX3NjYW5fcGVyaW9kKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCWNvbnN0IHVpbnQxNl90IG5OZWlnaGJvclNjYW5QZXJpb2QpOwordWludDE2X3Qgc21lX2dldF9uZWlnaGJvcl9zY2FuX3BlcmlvZCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgc21lX3NldF9yb2FtX2JtaXNzX2ZpcnN0X2JjbnQodEhhbEhhbmRsZSBoSGFsLAorCQl1aW50OF90IHNlc3Npb25JZCwgY29uc3QgdWludDhfdCBuUm9hbUJtaXNzRmlyc3RCY250KTsKK3VpbnQ4X3Qgc21lX2dldF9yb2FtX2JtaXNzX2ZpcnN0X2JjbnQodEhhbEhhbmRsZSBoSGFsKTsKK0NERl9TVEFUVVMgc21lX3NldF9yb2FtX2JtaXNzX2ZpbmFsX2JjbnQodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJY29uc3QgdWludDhfdCBuUm9hbUJtaXNzRmluYWxCY250KTsKK3VpbnQ4X3Qgc21lX2dldF9yb2FtX2JtaXNzX2ZpbmFsX2JjbnQodEhhbEhhbmRsZSBoSGFsKTsKK0NERl9TVEFUVVMgc21lX3NldF9yb2FtX2JlYWNvbl9yc3NpX3dlaWdodCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB1aW50OF90IG5Sb2FtQmVhY29uUnNzaVdlaWdodCk7Cit1aW50OF90IHNtZV9nZXRfcm9hbV9iZWFjb25fcnNzaV93ZWlnaHQodEhhbEhhbmRsZSBoSGFsKTsKKyNlbmRpZgorI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IFwKKwkJZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQordWludDhfdCBzbWVfZ2V0X3JvYW1fcnNzaV9kaWZmKHRIYWxIYW5kbGUgaEhhbCk7CitDREZfU1RBVFVTIHNtZV9jaGFuZ2Vfcm9hbV9zY2FuX2NoYW5uZWxfbGlzdCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl1aW50OF90ICpwQ2hhbm5lbExpc3QsCisJCXVpbnQ4X3QgbnVtQ2hhbm5lbHMpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECitDREZfU1RBVFVTIHNtZV9zZXRfZXNlX3JvYW1fc2Nhbl9jaGFubmVsX2xpc3QodEhhbEhhbmRsZSBoSGFsLAorCQl1aW50OF90IHNlc3Npb25JZCwgdWludDhfdCAqcENoYW5uZWxMaXN0LAorCQl1aW50OF90IG51bUNoYW5uZWxzKTsKKyNlbmRpZgorQ0RGX1NUQVRVUyBzbWVfZ2V0X3JvYW1fc2Nhbl9jaGFubmVsX2xpc3QodEhhbEhhbmRsZSBoSGFsLAorCQl1aW50OF90ICpwQ2hhbm5lbExpc3QsIHVpbnQ4X3QgKnBOdW1DaGFubmVscywKKwkJdWludDhfdCBzZXNzaW9uSWQpOworYm9vbCBzbWVfZ2V0X2lzX2VzZV9mZWF0dXJlX2VuYWJsZWQodEhhbEhhbmRsZSBoSGFsKTsKK2Jvb2wgc21lX2dldF93ZXNfbW9kZSh0SGFsSGFuZGxlIGhIYWwpOworYm9vbCBzbWVfZ2V0X3JvYW1fc2Nhbl9jb250cm9sKHRIYWxIYW5kbGUgaEhhbCk7Citib29sIHNtZV9nZXRfaXNfbGZyX2ZlYXR1cmVfZW5hYmxlZCh0SGFsSGFuZGxlIGhIYWwpOworYm9vbCBzbWVfZ2V0X2lzX2Z0X2ZlYXR1cmVfZW5hYmxlZCh0SGFsSGFuZGxlIGhIYWwpOworI2VuZGlmCitDREZfU1RBVFVTIHNtZV91cGRhdGVfcm9hbV9zY2FuX29mZmxvYWRfZW5hYmxlZCh0SGFsSGFuZGxlIGhIYWwsCisJCWJvb2wgblJvYW1TY2FuT2ZmbG9hZEVuYWJsZWQpOwordWludDhfdCBzbWVfaXNfZmVhdHVyZV9zdXBwb3J0ZWRfYnlfZncodWludDhfdCBmZWF0RW51bVZhbHVlKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworQ0RGX1NUQVRVUyBzbWVfc2VuZF90ZGxzX2xpbmtfZXN0YWJsaXNoX3BhcmFtcyh0SGFsSGFuZGxlIGhIYWwsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB0U2lyTWFjQWRkciBwZWVyTWFjLAorCQl0Q3NyVGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMgKgorCQl0ZGxzTGlua0VzdGFibGlzaFBhcmFtcyk7CitDREZfU1RBVFVTIHNtZV9zZW5kX3RkbHNfbWdtdF9mcmFtZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB0U2lyTWFjQWRkciBwZWVyTWFjLCB1aW50OF90IGZyYW1lX3R5cGUsCisJCXVpbnQ4X3QgZGlhbG9nLCB1aW50MTZfdCBzdGF0dXMsCisJCXVpbnQzMl90IHBlZXJDYXBhYmlsaXR5LCB1aW50OF90ICpidWYsCisJCXVpbnQ4X3QgbGVuLCB1aW50OF90IHJlc3BvbmRlcik7CitDREZfU1RBVFVTIHNtZV9jaGFuZ2VfdGRsc19wZWVyX3N0YSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB0U2lyTWFjQWRkciBwZWVyTWFjLAorCQl0Q3NyU3RhUGFyYW1zICpwc3RhUGFyYW1zKTsKK0NERl9TVEFUVVMgc21lX2FkZF90ZGxzX3BlZXJfc3RhKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCWNvbnN0IHRTaXJNYWNBZGRyIHBlZXJNYWMpOworQ0RGX1NUQVRVUyBzbWVfZGVsZXRlX3RkbHNfcGVlcl9zdGEodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJY29uc3QgdFNpck1hY0FkZHIgcGVlck1hYyk7Cit2b2lkIHNtZV9zZXRfdGRsc19wb3dlcl9zYXZlX3Byb2hpYml0ZWQodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCWJvb2wgdmFsKTsKK0NERl9TVEFUVVMgc21lX3NlbmRfdGRsc19jaGFuX3N3aXRjaF9yZXEoCisJCXRIYWxIYW5kbGUgaGFsLAorCQlzbWVfdGRsc19jaGFuX3N3aXRjaF9wYXJhbXMgKmNoX3N3aXRjaF9wYXJhbXMpOworI2VuZGlmCisKKy8qCisgKiBTTUUgQVBJIHRvIGVuYWJsZS9kaXNhYmxlIFdMQU4gZHJpdmVyIGluaXRpYXRlZCBTU1IKKyAqLwordm9pZCBzbWVfdXBkYXRlX2VuYWJsZV9zc3IodEhhbEhhbmRsZSBoSGFsLCBib29sIGVuYWJsZVNTUik7CitDREZfU1RBVFVTIHNtZV9zZXRfcGh5X21vZGUodEhhbEhhbmRsZSBoSGFsLCBlQ3NyUGh5TW9kZSBwaHlNb2RlKTsKK2VDc3JQaHlNb2RlIHNtZV9nZXRfcGh5X21vZGUodEhhbEhhbmRsZSBoSGFsKTsKKy8qCisgKiBTTUUgQVBJIHRvIGRldGVybWluZSB0aGUgY2hhbm5lbCBib25kaW5nIG1vZGUKKyAqLworQ0RGX1NUQVRVUyBzbWVfc2V0X2NoX3BhcmFtcyh0SGFsSGFuZGxlIGhIYWwsIGVDc3JQaHlNb2RlIGVDc3JQaHlNb2RlLAorCQl1aW50OF90IGNoYW5uZWwsIHVpbnQ4X3QgaHRfc2VjX2NoLCBjaGFuX3BhcmFtc190ICpjaF9wYXJhbXMpOworQ0RGX1NUQVRVUyBzbWVfaGFuZG9mZl9yZXF1ZXN0KHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXRDc3JIYW5kb2ZmUmVxdWVzdCAqcEhhbmRvZmZJbmZvKTsKK0NERl9TVEFUVVMgc21lX2lzX3N0YV9wMnBfY2xpZW50X2Nvbm5lY3RlZCh0SGFsSGFuZGxlIGhIYWwpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9MUEhCCitDREZfU1RBVFVTIHNtZV9scGhiX2NvbmZpZ19yZXEodEhhbEhhbmRsZSBoSGFsLAorCQl0U2lyTFBIQlJlcSAqIGxwaGRSZXEsCisJCXZvaWQgKCpwQ2FsbGJhY2tmbikodm9pZCAqcEhkZEN0eCwKKwkJCXRTaXJMUEhCSW5kICogaW5kUGFyYW0pKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTFBIQiAqLworQ0RGX1NUQVRVUyBzbWVfYWRkX3BlcmlvZGljX3R4X3B0cm4odEhhbEhhbmRsZSBoSGFsLCB0U2lyQWRkUGVyaW9kaWNUeFB0cm4KKwkJKmFkZFBlcmlvZGljVHhQdHJuUGFyYW1zKTsKK0NERl9TVEFUVVMgc21lX2RlbF9wZXJpb2RpY190eF9wdHJuKHRIYWxIYW5kbGUgaEhhbCwgdFNpckRlbFBlcmlvZGljVHhQdHJuCisJCSpkZWxQZXJpb2RpY1R4UHRyblBhcmFtcyk7Cit2b2lkIHNtZV9lbmFibGVfZGlzYWJsZV9zcGxpdF9zY2FuKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBuTnVtU3RhQ2hhbiwKKwkJdWludDhfdCBuTnVtUDJQQ2hhbik7CitDREZfU1RBVFVTIHNtZV9zZW5kX3JhdGVfdXBkYXRlX2luZCh0SGFsSGFuZGxlIGhIYWwsCisJCXRTaXJSYXRlVXBkYXRlSW5kICpyYXRlVXBkYXRlUGFyYW1zKTsKK0NERl9TVEFUVVMgc21lX3JvYW1fZGVsX3Bta2lkX2Zyb21fY2FjaGUodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJY29uc3QgdWludDhfdCAqcEJTU0lkLCBib29sIGZsdXNoX2NhY2hlKTsKK3ZvaWQgc21lX2dldF9jb21tYW5kX3Ffc3RhdHVzKHRIYWxIYW5kbGUgaEhhbCk7CisKKy8qCisgKiBTTUUgQVBJIHRvIGVuYWJsZS9kaXNhYmxlIGlkbGUgbW9kZSBwb3dlcnNhdmUKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIHBvd2Vyc2F2ZSBvZmZsb2FkCisgKiBpcyBlbmFibGVkCisgKi8KK0NERl9TVEFUVVMgc21lX3NldF9pZGxlX3Bvd2Vyc2F2ZV9jb25maWcodm9pZCAqY2RzX2NvbnRleHQsCisJCXRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3QgdmFsdWUpOworQ0RGX1NUQVRVUyBzbWVfbm90aWZ5X21vZGVtX3Bvd2VyX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3QgdmFsdWUpOworCisvKlNNRSBBUEkgdG8gY29udmVydCBjb252ZXJ0IHRoZSBpbmkgdmFsdWUgdG8gdGhlIEVOVU0gdXNlZCBpbiBjc3IgYW5kIE1BQyovCitlUGh5Q2hhbkJvbmRTdGF0ZSBzbWVfZ2V0X2NiX3BoeV9zdGF0ZV9mcm9tX2NiX2luaV92YWx1ZSh1aW50MzJfdCBjYl9pbmlfdmFsdWUpOworaW50IHNtZV91cGRhdGVfaHRfY29uZmlnKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsIHVpbnQxNl90IGh0Q2FwYWIsCisJCWludCB2YWx1ZSk7CitpbnQxNl90IHNtZV9nZXRfaHRfY29uZmlnKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uX2lkLAorCQl1aW50MTZfdCBodF9jYXBhYik7CisjaWZkZWYgUUNBX0hUXzIwNDBfQ09FWAorQ0RGX1NUQVRVUyBzbWVfbm90aWZ5X2h0MjA0MF9tb2RlKHRIYWxIYW5kbGUgaEhhbCwgdWludDE2X3Qgc3RhSWQsCisJCXN0cnVjdCBjZGZfbWFjX2FkZHIgbWFjQWRkclNUQSwKKwkJdWludDhfdCBzZXNzaW9uSWQsCisJCXVpbnQ4X3QgY2hhbm5lbF90eXBlKTsKK0NERl9TVEFUVVMgc21lX3NldF9odDIwNDBfbW9kZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl1aW50OF90IGNoYW5uZWxfdHlwZSwgYm9vbCBvYnNzRW5hYmxlZCk7CisjZW5kaWYKK0NERl9TVEFUVVMgc21lX2dldF9yZWdfaW5mbyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgY2hhbklkLAorCQl1aW50MzJfdCAqcmVnSW5mbzEsIHVpbnQzMl90ICpyZWdJbmZvMik7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9md190ZGxzX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAqcHNtZVRkbHNQYXJhbXMsCisJCWJvb2wgdXNlU21lTG9jayk7CitDREZfU1RBVFVTIHNtZV91cGRhdGVfdGRsc19wZWVyX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwKKwkJdFNtZVRkbHNQZWVyU3RhdGVQYXJhbXMgKnBQZWVyU3RhdGVQYXJhbXMpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9URExTICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NIX0FWT0lECitDREZfU1RBVFVTIHNtZV9hZGRfY2hfYXZvaWRfY2FsbGJhY2sodEhhbEhhbmRsZSBoSGFsLAorCXZvaWQgKCpwQ2FsbGJhY2tmbikodm9pZCAqaGRkX2NvbnRleHQsIHZvaWQgKmluZGlfcGFyYW0pKTsKK0NERl9TVEFUVVMgc21lX2NoX2F2b2lkX3VwZGF0ZV9yZXEodEhhbEhhbmRsZSBoSGFsKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lCitDREZfU1RBVFVTIHNtZV9hZGRfY2hfYXZvaWRfY2FsbGJhY2sodEhhbEhhbmRsZSBoSGFsLAorCXZvaWQgKCpwQ2FsbGJhY2tmbikodm9pZCAqaGRkX2NvbnRleHQsIHZvaWQgKmluZGlfcGFyYW0pKQoreworCXJldHVybiBDREZfU1RBVFVTX0VfTk9TVVBQT1JUOworfQorCitzdGF0aWMgaW5saW5lCitDREZfU1RBVFVTIHNtZV9jaF9hdm9pZF91cGRhdGVfcmVxKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX05PU1VQUE9SVDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgorQ0RGX1NUQVRVUyBzbWVfc2V0X2F1dG9fc2h1dGRvd25fY2IodEhhbEhhbmRsZSBoSGFsLCB2b2lkICgqcENhbGxiYWNrZm4pKHZvaWQpKTsKK0NERl9TVEFUVVMgc21lX3NldF9hdXRvX3NodXRkb3duX3RpbWVyKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3QgdGltZXJfdmFsdWUpOworI2VuZGlmCitDREZfU1RBVFVTIHNtZV9yb2FtX2NoYW5uZWxfY2hhbmdlX3JlcSh0SGFsSGFuZGxlIGhIYWwsCisJCXN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzaWQsIHVpbnQzMl90IGNiX21vZGUsCisJCXRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSk7CitDREZfU1RBVFVTIHNtZV9yb2FtX3N0YXJ0X2JlYWNvbl9yZXEodEhhbEhhbmRsZSBoSGFsLAorCQlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkLCB1aW50OF90IGRmc0NhY1dhaXRTdGF0dXMpOworQ0RGX1NUQVRVUyBzbWVfcm9hbV9jc2FfaWVfcmVxdWVzdCh0SGFsSGFuZGxlIGhIYWwsIHN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzaWQsCisJCXVpbnQ4X3QgdGFyZ2V0Q2hhbm5lbCwgdWludDhfdCBjc2FJZVJlcWQsIHVpbnQ4X3QgY2hfYmFuZHdpZHRoKTsKK0NERl9TVEFUVVMgc21lX2luaXRfdGhlcm1hbF9pbmZvKHRIYWxIYW5kbGUgaEhhbCwKKwkJdFNtZVRoZXJtYWxQYXJhbXMgdGhlcm1hbFBhcmFtKTsKK0NERl9TVEFUVVMgc21lX3NldF90aGVybWFsX2xldmVsKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBsZXZlbCk7CitDREZfU1RBVFVTIHNtZV90eHBvd2VyX2xpbWl0KHRIYWxIYW5kbGUgaEhhbCwgdFNpclR4UG93ZXJMaW1pdCAqcHNtZXR4KTsKK0NERl9TVEFUVVMgc21lX2dldF9saW5rX3NwZWVkKHRIYWxIYW5kbGUgaEhhbCwgdFNpckxpbmtTcGVlZEluZm8gKmxzUmVxLAorCQl2b2lkICpwbHNDb250ZXh0LAorCQl2b2lkICgqcENhbGxiYWNrZm4pKHRTaXJMaW5rU3BlZWRJbmZvICppbmRQYXJhbSwKKwkJdm9pZCAqcENvbnRleHQpKTsKK0NERl9TVEFUVVMgc21lX21vZGlmeV9hZGRfaWUodEhhbEhhbmRsZSBoSGFsLAorCQl0U2lyTW9kaWZ5SUUgKnBNb2RpZnlJRSwgZVVwZGF0ZUlFc1R5cGUgdXBkYXRlVHlwZSk7CitDREZfU1RBVFVTIHNtZV91cGRhdGVfYWRkX2llKHRIYWxIYW5kbGUgaEhhbCwKKwkJdFNpclVwZGF0ZUlFICpwVXBkYXRlSUUsIGVVcGRhdGVJRXNUeXBlIHVwZGF0ZVR5cGUpOworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX2Nvbm5lY3RfZGVidWcodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXRfdmFsdWUpOworQ0RGX1NUQVRVUyBzbWVfYXBfZGlzYWJsZV9pbnRyYV9ic3NfZndkKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCWJvb2wgZGlzYWJsZWZ3ZCk7Cit1aW50MzJfdCBzbWVfZ2V0X2NoYW5uZWxfYm9uZGluZ19tb2RlNV9nKHRIYWxIYW5kbGUgaEhhbCk7Cit1aW50MzJfdCBzbWVfZ2V0X2NoYW5uZWxfYm9uZGluZ19tb2RlMjRfZyh0SGFsSGFuZGxlIGhIYWwpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9TVEFUU19FWFQKK3R5cGVkZWYgc3RydWN0IHNTdGF0c0V4dFJlcXVlc3RSZXEgeworCXVpbnQzMl90IHJlcXVlc3RfZGF0YV9sZW47CisJdWludDhfdCAqcmVxdWVzdF9kYXRhOworfSB0U3RhdHNFeHRSZXF1ZXN0UmVxLCAqdHBTdGF0c0V4dFJlcXVlc3RSZXE7Cit0eXBlZGVmIHZvaWQgKCpTdGF0c0V4dENhbGxiYWNrKSh2b2lkICosIHRTdGF0c0V4dEV2ZW50ICopOwordm9pZCBzbWVfc3RhdHNfZXh0X3JlZ2lzdGVyX2NhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwKKwkJU3RhdHNFeHRDYWxsYmFjayBjYWxsYmFjayk7CitDREZfU1RBVFVTIHNtZV9zdGF0c19leHRfcmVxdWVzdCh1aW50OF90IHNlc3Npb25faWQsCisJCXRwU3RhdHNFeHRSZXF1ZXN0UmVxIGlucHV0KTsKK0NERl9TVEFUVVMgc21lX3N0YXRzX2V4dF9ldmVudCh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnBNc2cpOworI2VuZGlmCitDREZfU1RBVFVTIHNtZV91cGRhdGVfZGZzX3NjYW5fbW9kZSh0SGFsSGFuZGxlIGhIYWwsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl1aW50OF90IGFsbG93REZTQ2hhbm5lbFJvYW0pOwordWludDhfdCBzbWVfZ2V0X2Rmc19zY2FuX21vZGUodEhhbEhhbmRsZSBoSGFsKTsKK2Jvb2wgc21lX3N0YV9pbl9taWRkbGVfb2Zfcm9hbWluZyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCitDREZfU1RBVFVTIHNtZV9nZXRfdmFsaWRfY2hhbm5lbHNfYnlfYmFuZCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgd2lmaUJhbmQsCisJCXVpbnQzMl90ICphVmFsaWRDaGFubmVscywKKwkJdWludDhfdCAqcE51bUNoYW5uZWxzKTsKK0NERl9TVEFUVVMgc21lX2V4dF9zY2FuX2dldF9jYXBhYmlsaXRpZXModEhhbEhhbmRsZSBoSGFsLAorCQl0U2lyR2V0RXh0U2NhbkNhcGFiaWxpdGllc1JlcVBhcmFtcyAqcFJlcSk7CitDREZfU1RBVFVTIHNtZV9leHRfc2Nhbl9zdGFydCh0SGFsSGFuZGxlIGhIYWwsCisJCXRTaXJXaWZpU2NhbkNtZFJlcVBhcmFtcyAqcFN0YXJ0Q21kKTsKK0NERl9TVEFUVVMgc21lX2V4dF9zY2FuX3N0b3AodEhhbEhhbmRsZSBoSGFsLAorCQl0U2lyRXh0U2NhblN0b3BSZXFQYXJhbXMgKnBTdG9wUmVxKTsKK0NERl9TVEFUVVMgc21lX3NldF9ic3NfaG90bGlzdCh0SGFsSGFuZGxlIGhIYWwsCisJCXRTaXJFeHRTY2FuU2V0QnNzaWRIb3RMaXN0UmVxUGFyYW1zICoKKwkJcFNldEhvdExpc3RSZXEpOworQ0RGX1NUQVRVUyBzbWVfcmVzZXRfYnNzX2hvdGxpc3QodEhhbEhhbmRsZSBoSGFsLAorCQl0U2lyRXh0U2NhblJlc2V0QnNzaWRIb3RsaXN0UmVxUGFyYW1zICoKKwkJcFJlc2V0UmVxKTsKK0NERl9TVEFUVVMgc21lX3NldF9zaWduaWZpY2FudF9jaGFuZ2UodEhhbEhhbmRsZSBoSGFsLAorCQl0U2lyRXh0U2NhblNldFNpZ0NoYW5nZVJlcVBhcmFtcyAqCisJCXBTZXRTaWduaWZpY2FudENoYW5nZVJlcSk7CitDREZfU1RBVFVTIHNtZV9yZXNldF9zaWduaWZpY2FudF9jaGFuZ2UodEhhbEhhbmRsZSBoSGFsLAorCQl0U2lyRXh0U2NhblJlc2V0U2lnbmlmaWNhbnRDaGFuZ2VSZXFQYXJhbXMKKwkJKnBSZXNldFJlcSk7CitDREZfU1RBVFVTIHNtZV9nZXRfY2FjaGVkX3Jlc3VsdHModEhhbEhhbmRsZSBoSGFsLAorCQl0U2lyRXh0U2NhbkdldENhY2hlZFJlc3VsdHNSZXFQYXJhbXMgKgorCQlwQ2FjaGVkUmVzdWx0c1JlcSk7CisKK0NERl9TVEFUVVMgc21lX3NldF9lcG5vX2xpc3QodEhhbEhhbmRsZSBoYWwsCisJCQkgICAgIHN0cnVjdCB3aWZpX2Vwbm9fcGFyYW1zICpyZXFfbXNnKTsKK0NERl9TVEFUVVMgc21lX3NldF9wYXNzcG9pbnRfbGlzdCh0SGFsSGFuZGxlIGhhbCwKKwkJCQkJc3RydWN0IHdpZmlfcGFzc3BvaW50X3JlcSAqcmVxX21zZyk7CitDREZfU1RBVFVTIHNtZV9yZXNldF9wYXNzcG9pbnRfbGlzdCh0SGFsSGFuZGxlIGhhbCwKKwkJCQkJc3RydWN0IHdpZmlfcGFzc3BvaW50X3JlcSAqcmVxX21zZyk7CitDREZfU1RBVFVTCitzbWVfc2V0X3NzaWRfaG90bGlzdCh0SGFsSGFuZGxlIGhhbCwKKwkJICAgICBzdHJ1Y3Qgc2lyX3NldF9zc2lkX2hvdGxpc3RfcmVxdWVzdCAqcmVxdWVzdCk7CisKK0NERl9TVEFUVVMgc21lX2V4dF9zY2FuX3JlZ2lzdGVyX2NhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwKKwkJdm9pZCAoKnBFeHRTY2FuSW5kQ2IpKHZvaWQgKiwgY29uc3QgdWludDE2X3QsIHZvaWQgKikpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FWFRTQ0FOICovCitDREZfU1RBVFVTIHNtZV9hYm9ydF9yb2FtX3NjYW4odEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKK0NERl9TVEFUVVMgc21lX2xsX3N0YXRzX2NsZWFyX3JlcSh0SGFsSGFuZGxlIGhIYWwsCisJCXRTaXJMTFN0YXRzQ2xlYXJSZXEgKiBwY2xlYXJTdGF0c1JlcSk7CitDREZfU1RBVFVTIHNtZV9sbF9zdGF0c19zZXRfcmVxKHRIYWxIYW5kbGUgaEhhbCwKKwkJdFNpckxMU3RhdHNTZXRSZXEgKnBzZXRTdGF0c1JlcSk7CitDREZfU1RBVFVTIHNtZV9sbF9zdGF0c19nZXRfcmVxKHRIYWxIYW5kbGUgaEhhbCwKKwkJdFNpckxMU3RhdHNHZXRSZXEgKnBnZXRTdGF0c1JlcSk7CitDREZfU1RBVFVTIHNtZV9zZXRfbGlua19sYXllcl9zdGF0c19pbmRfY2IodEhhbEhhbmRsZSBoSGFsLAorCQl2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSh2b2lkICpjYWxsYmFja0N0eCwKKwkJCQlpbnQgaW5kVHlwZSwgdm9pZCAqcFJzcCkpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICovCisKK0NERl9TVEFUVVMgc21lX2Z3X21lbV9kdW1wKHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAqcmVjdmRfcmVxKTsKK0NERl9TVEFUVVMgc21lX2Z3X21lbV9kdW1wX3JlZ2lzdGVyX2NiKHRIYWxIYW5kbGUgaEhhbCwKKwkJdm9pZCAoKmNhbGxiYWNrX3JvdXRpbmUpKHZvaWQgKmNiX2NvbnRleHQsCisJCXN0cnVjdCBmd19kdW1wX3JzcCAqcnNwKSk7CitDREZfU1RBVFVTIHNtZV9md19tZW1fZHVtcF91bnJlZ2lzdGVyX2NiKHRIYWxIYW5kbGUgaEhhbCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECitDREZfU1RBVFVTIHNtZV91cGRhdGVfcm9hbV9vZmZsb2FkX2VuYWJsZWQodEhhbEhhbmRsZSBoSGFsLAorCQlib29sIG5Sb2FtT2ZmbG9hZEVuYWJsZWQpOworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3JvYW1fa2V5X21nbXRfb2ZmbG9hZF9lbmFibGVkKHRIYWxIYW5kbGUgaEhhbCwKKwkJdWludDhfdCBzZXNzaW9uSWQsCisJCWJvb2wgblJvYW1LZXlNZ210T2ZmbG9hZEVuYWJsZWQpOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorQ0RGX1NUQVRVUyBzbWVfbmFuX2V2ZW50KHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAqcE1zZyk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX05BTiAqLworQ0RGX1NUQVRVUyBzbWVfZ2V0X2xpbmtfc3RhdHVzKHRIYWxIYW5kbGUgaEhhbCwKKwkJdENzckxpbmtTdGF0dXNDYWxsYmFjayBjYWxsYmFjaywKKwkJdm9pZCAqcENvbnRleHQsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgc21lX2dldF90ZW1wZXJhdHVyZSh0SGFsSGFuZGxlIGhIYWwsCisJCXZvaWQgKnRlbXBDb250ZXh0LAorCQl2b2lkICgqcENhbGxiYWNrZm4pKGludCB0ZW1wZXJhdHVyZSwKKwkJCXZvaWQgKnBDb250ZXh0KSk7CitDREZfU1RBVFVTIHNtZV9zZXRfc2Nhbm5pbmdfbWFjX291aSh0SGFsSGFuZGxlIGhIYWwsCisJCXRTaXJTY2FuTWFjT3VpICpwU2Nhbk1hY091aSk7CisKKyNpZmRlZiBJUEFfT0ZGTE9BRAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9pcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZQorICAgIFxicmllZiAgQVBJIHRvIGVuYWJsZS9kaXNhYmxlIElQQSBvZmZsb2FkCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgc2Vzc2lvbklkIC0gU2Vzc2lvbiBJZGVudGlmaWVyCisgICAgXHBhcmFtICBwUmVxdWVzdCAtICBQb2ludGVyIHRvIHRoZSBvZmZsb2FkIHJlcXVlc3QuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9pcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZSh0SGFsSGFuZGxlIGhhbCwKKwkJCQl1aW50OF90IHNlc3Npb25faWQsCisJCQkJc3RydWN0IHNpcl9pcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZSAqcmVxdWVzdCk7CisjZWxzZQorc3RhdGljIGlubGluZSBDREZfU1RBVFVTIHNtZV9pcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZSh0SGFsSGFuZGxlIGhhbCwKKwkJCQl1aW50OF90IHNlc3Npb25faWQsCisJCQkJc3RydWN0IHNpcl9pcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZSAqcmVxdWVzdCkKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8qIElQQV9PRkZMT0FEICovCisKKyNpZmRlZiBESENQX1NFUlZFUl9PRkZMT0FECitDREZfU1RBVFVTIHNtZV9zZXRfZGhjcF9zcnZfb2ZmbG9hZCh0SGFsSGFuZGxlIGhIYWwsCisJCXRTaXJEaGNwU3J2T2ZmbG9hZEluZm8gKiBwRGhjcFNydkluZm8pOworI2VuZGlmIC8qIERIQ1BfU0VSVkVSX09GRkxPQUQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1BJT19MRURfRkxBU0hJTkcKK0NERl9TVEFUVVMgc21lX3NldF9sZWRfZmxhc2hpbmcodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHR5cGUsCisJCXVpbnQzMl90IHgwLCB1aW50MzJfdCB4MSk7CisjZW5kaWYKK0NERl9TVEFUVVMgc21lX2hhbmRsZV9kZnNfY2hhbl9zY2FuKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBkZnNfZmxhZyk7CitDREZfU1RBVFVTIHNtZV9zZXRfbWFzKHVpbnQzMl90IHZhbCk7CitDREZfU1RBVFVTIHNtZV9zZXRfbWlyYWNhc3QodEhhbEhhbmRsZSBoYWwsIHVpbnQ4X3QgZmlsdGVyX3R5cGUpOworCitDREZfU1RBVFVTIHNtZV9jb25maWd1cmVfbW9kdWxhdGVkX2R0aW0odEhhbEhhbmRsZSBoYWwsIHVpbnQ4X3Qgc2Vzc2lvbl9pZCwKKwkJCQkgICAgICB1aW50MzJfdCBtb2R1bGF0ZWRfZHRpbSk7CisKK0NERl9TVEFUVVMgc21lX2NvbmZpZ3VyZV9zdGF0c19hdmdfZmFjdG9yKHRIYWxIYW5kbGUgaGFsLCB1aW50OF90IHNlc3Npb25faWQsCisJCQkJCSAgdWludDE2X3Qgc3RhdHNfYXZnX2ZhY3Rvcik7CisKK0NERl9TVEFUVVMgc21lX2NvbmZpZ3VyZV9ndWFyZF90aW1lKHRIYWxIYW5kbGUgaGFsLCB1aW50OF90IHNlc3Npb25faWQsCisJCQkJICAgIHVpbnQzMl90IGd1YXJkX3RpbWUpOworCitDREZfU1RBVFVTIHNtZV93aWZpX3N0YXJ0X2xvZ2dlcih0SGFsSGFuZGxlIGhhbCwKKwkJc3RydWN0IHNpcl93aWZpX3N0YXJ0X2xvZyBzdGFydF9sb2cpOworCitib29sIHNtZV9uZWlnaGJvcl9taWRkbGVfb2Zfcm9hbWluZyh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCQl1aW50OF90IHNlc3Npb25JZCk7CisKK0NERl9TVEFUVVMgc21lX2VuYWJsZV91YXBzZF9mb3JfYWModm9pZCAqY2RzX2N0eCwgdWludDhfdCBzdGFfaWQsCisJCQkJICAgICAgc21lX2FjX2VudW1fdHlwZSBhYywgdWludDhfdCB0aWQsCisJCQkJICAgICAgdWludDhfdCBwcmksIHVpbnQzMl90IHNydmNfaW50LAorCQkJCSAgICAgIHVpbnQzMl90IHN1c19pbnQsCisJCQkJICAgICAgc21lX3RzcGVjX2Rpcl90eXBlIGRpciwKKwkJCQkgICAgICB1aW50OF90IHBzYiwgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgIHVpbnQzMl90IGRlbGF5X2ludGVydmFsKTsKKworQ0RGX1NUQVRVUyBzbWVfZGlzYWJsZV91YXBzZF9mb3JfYWModm9pZCAqY2RzX2N0eCwgdWludDhfdCBzdGFfaWQsCisJCQkJICAgICAgIHNtZV9hY19lbnVtX3R5cGUgYWMsCisJCQkJICAgICAgIHVpbnQzMl90IHNlc3Npb25JZCk7CisKK0NERl9TVEFUVVMgc21lX3NldF9yc3NpX21vbml0b3JpbmcodEhhbEhhbmRsZSBoYWwsCisJCQkJCXN0cnVjdCByc3NpX21vbml0b3JfcmVxICppbnB1dCk7CitDREZfU1RBVFVTIHNtZV9zZXRfcnNzaV90aHJlc2hvbGRfYnJlYWNoZWRfY2IodEhhbEhhbmRsZSBoYWwsCisJCQl2b2lkICgqY2IpKHZvaWQgKiwgc3RydWN0IHJzc2lfYnJlYWNoX2V2ZW50ICopKTsKKworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX25zcyh0SGFsSGFuZGxlIGhfaGFsLCB1aW50OF90IG5zcyk7CisKK2Jvb2wgc21lX2lzX2FueV9zZXNzaW9uX2luX2Nvbm5lY3RlZF9zdGF0ZSh0SGFsSGFuZGxlIGhfaGFsKTsKKworQ0RGX1NUQVRVUyBzbWVfc29jX3NldF9wY2wodEhhbEhhbmRsZSBoYWwsCisJCXN0cnVjdCBzaXJfcGNsX2xpc3QgbXNnKTsKK0NERl9TVEFUVVMgc21lX3NvY19zZXRfaHdfbW9kZSh0SGFsSGFuZGxlIGhhbCwKKwkJc3RydWN0IHNpcl9od19tb2RlIG1zZyk7Cit2b2lkIHNtZV9yZWdpc3Rlcl9od19tb2RlX3RyYW5zX2NiKHRIYWxIYW5kbGUgaGFsLAorCQlod19tb2RlX3RyYW5zaXRpb25fY2IgY2FsbGJhY2spOworQ0RGX1NUQVRVUyBzbWVfbnNzX3VwZGF0ZV9yZXF1ZXN0KHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3QgdmRldl9pZCwKKwkJCQl1aW50OF90ICBuZXdfbnNzLCB2b2lkICpjYmFjaywKKwkJCQl1aW50OF90IG5leHRfYWN0aW9uLCB2b2lkICpoZGRfY29udGV4dCk7CisKK3R5cGVkZWYgdm9pZCAoKnNtZV9wZWVyX2F1dGhvcml6ZWRfZnApICh1aW50MzJfdCB2ZGV2X2lkKTsKK0NERl9TVEFUVVMgc21lX3NldF9wZWVyX2F1dGhvcml6ZWQodWludDhfdCAqcGVlcl9hZGRyLAorCQkJCSAgIHNtZV9wZWVyX2F1dGhvcml6ZWRfZnAgYXV0aF9mcCwKKwkJCQkgICB1aW50MzJfdCB2ZGV2X2lkKTsKK0NERl9TVEFUVVMgc21lX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnKHRIYWxIYW5kbGUgaGFsLAorCQlzdHJ1Y3Qgc2lyX2R1YWxfbWFjX2NvbmZpZyBtc2cpOworCit2b2lkIHNtZV9zZXRfc2Nhbl9kaXNhYmxlKHRIYWxIYW5kbGUgaF9oYWwsIGludCB2YWx1ZSk7Cit2b2lkIHNtZV9zZXRkZWZfZG90MTFtb2RlKHRIYWxIYW5kbGUgaGFsKTsKKworQ0RGX1NUQVRVUyBzbWVfZGlzYWJsZV9ub25fZmNjX2NoYW5uZWwodEhhbEhhbmRsZSBoSGFsLAorCQkJCSAgICAgICBib29sIGZjY19jb25zdHJhaW50KTsKKworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3JvYW1fc2Nhbl9oaV9yc3NpX3NjYW5fcGFyYW1zKHRIYWxIYW5kbGUgaGFsX2hhbmRsZSwKKwl1aW50OF90IHNlc3Npb25faWQsCisJdWludDMyX3Qgbm90aWZ5X2lkLAorCWludDMyX3QgdmFsKTsKKwordm9pZCB3bGFuX3NhcF9lbmFibGVfcGh5X2Vycm9yX2xvZ3ModEhhbEhhbmRsZSBoYWwsIGJvb2wgZW5hYmxlX2xvZyk7Cit2b2lkIHNtZV9zZXRfZG90MTFwX2NvbmZpZyh0SGFsSGFuZGxlIGhhbCwgYm9vbCBlbmFibGVfZG90MTFwKTsKKworQ0RGX1NUQVRVUyBzbWVfb2NiX3NldF9jb25maWcodEhhbEhhbmRsZSBoSGFsLCB2b2lkICpjb250ZXh0LAorCQkJICAgICAgb2NiX2NhbGxiYWNrIGNhbGxiYWNrLAorCQkJICAgICAgc3RydWN0IHNpcl9vY2JfY29uZmlnICpjb25maWcpOworCitDREZfU1RBVFVTIHNtZV9vY2Jfc2V0X3V0Y190aW1lKHRIYWxIYW5kbGUgaEhhbCwgc3RydWN0IHNpcl9vY2JfdXRjICp1dGMpOworCitDREZfU1RBVFVTIHNtZV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydCh0SGFsSGFuZGxlIGhIYWwsCisJc3RydWN0IHNpcl9vY2JfdGltaW5nX2FkdmVydCAqdGltaW5nX2FkdmVydCk7CisKK0NERl9TVEFUVVMgc21lX29jYl9zdG9wX3RpbWluZ19hZHZlcnQodEhhbEhhbmRsZSBoSGFsLAorCXN0cnVjdCBzaXJfb2NiX3RpbWluZ19hZHZlcnQgKnRpbWluZ19hZHZlcnQpOworCitDREZfU1RBVFVTIHNtZV9vY2JfZ2V0X3RzZl90aW1lcih0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKmNvbnRleHQsCisJCQkJIG9jYl9jYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgc3RydWN0IHNpcl9vY2JfZ2V0X3RzZl90aW1lciAqcmVxdWVzdCk7CisKK0NERl9TVEFUVVMgc21lX2RjY19nZXRfc3RhdHModEhhbEhhbmRsZSBoSGFsLCB2b2lkICpjb250ZXh0LAorCQkJICAgICBvY2JfY2FsbGJhY2sgY2FsbGJhY2ssCisJCQkgICAgIHN0cnVjdCBzaXJfZGNjX2dldF9zdGF0cyAqcmVxdWVzdCk7CisKK0NERl9TVEFUVVMgc21lX2RjY19jbGVhcl9zdGF0cyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHZkZXZfaWQsCisJCQkgICAgICAgdWludDMyX3QgZGNjX3N0YXRzX2JpdG1hcCk7CisKK0NERl9TVEFUVVMgc21lX2RjY191cGRhdGVfbmRsKHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAqY29udGV4dCwKKwkJCSAgICAgIG9jYl9jYWxsYmFjayBjYWxsYmFjaywKKwkJCSAgICAgIHN0cnVjdCBzaXJfZGNjX3VwZGF0ZV9uZGwgKnJlcXVlc3QpOworCitDREZfU1RBVFVTIHNtZV9yZWdpc3Rlcl9mb3JfZGNjX3N0YXRzX2V2ZW50KHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAqY29udGV4dCwKKwkJCQkJICAgIG9jYl9jYWxsYmFjayBjYWxsYmFjayk7Cit2b2lkIHNtZV9hZGRfc2V0X3RoZXJtYWxfbGV2ZWxfY2FsbGJhY2sodEhhbEhhbmRsZSBoYWwsCisJCXNtZV9zZXRfdGhlcm1hbF9sZXZlbF9jYWxsYmFjayBjYWxsYmFjayk7CisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoIF9fU01FX0FQSV9IICkgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc21lL2luYy9zbWVfZnRfYXBpLmggYi9jb3JlL3NtZS9pbmMvc21lX2Z0X2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTcyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvc21lX2Z0X2FwaS5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpCisKKyNpZiAhZGVmaW5lZChfX1NNRV9GVEFQSV9IKQorI2RlZmluZSBfX1NNRV9GVEFQSV9ICisKKyNpbmNsdWRlIDxsaW1fZnRfZGVmcy5oPgorCit0eXBlZGVmIGVudW0gZUZUSUVTdGF0ZSB7CisJZUZUX1NUQVJUX1JFQURZLCAgICAgICAgLyogU3RhcnQgYmVmb3JlIGFuZCBhZnRlciAxMXIgYXNzb2MgKi8KKwllRlRfQVVUSF9SRVFfUkVBRFksICAgICAvKiBXaGVuIHdlIGhhdmUgcmVjdmQgdGhlIDFzdCBvciBudGggYXV0aCByZXEgKi8KKwkvKgorCSAqIFNlbnQgYXV0aDEgYW5kIHdhaXRpbmcgYXV0aDIgV2UgYXJlIG5vdyByZWFkeSBmb3IgRlQgcGhhc2UsCisJICogc2VuZCBhdXRoMSwgcmVjZCBhdXRoMgorCSAqLworCWVGVF9XQUlUX0FVVEgyLAorCWVGVF9BVVRIX0NPTVBMRVRFLAorCS8qIE5vdyB3ZSBoYXZlIHNlbnQgQXV0aCBSc3AgdG8gdGhlIHN1cHBsaWNhbnQgYW5kIHdhaXRpbmcgKi8KKwkvKiBSZWFzc29jIFJlcSBmcm9tIHRoZSBzdXBwbGljYW50LiAqLworCWVGVF9SRUFTU09DX1JFUV9XQUlULAorCS8qCisJICogV2UgaGF2ZSByZWNlaXZlZCB0aGUgUmVhc3NvYyByZXF1ZXN0IGZyb20gc3VwcGxpY2FudC4KKwkgKiBXYWl0aW5nIGZvciB0aGUga2V5cy4KKwkgKi8KKwllRlRfU0VUX0tFWV9XQUlULAorfSB0RlRJRVN0YXRlczsKKworLyogRlQgbmVpZ2hib3Igcm9hbSBjYWxsYmFjayB1c2VyIGNvbnRleHQgKi8KK3R5cGVkZWYgc3RydWN0IHNGVFJvYW1DYWxsYmFja1VzckN0eCB7CisJdHBBbmlTaXJHbG9iYWwgcE1hYzsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdEZUUm9hbUNhbGxiYWNrVXNyQ3R4LCAqdHBGVFJvYW1DYWxsYmFja1VzckN0eDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0ZUU01FQ29udGV4dCB7CisJLyogUmVjZWl2ZWQgYW5kIHByb2Nlc3NlZCBkdXJpbmcgcHJlLWF1dGggKi8KKwl1aW50OF90ICphdXRoX2Z0X2llczsKKwl1aW50MzJfdCBhdXRoX2Z0X2llc19sZW5ndGg7CisJLyogUmVjZWl2ZWQgYW5kIHByb2Nlc3NlZCBkdXJpbmcgcmUtYXNzb2MgKi8KKwl1aW50OF90ICpyZWFzc29jX2Z0X2llczsKKwl1aW50MTZfdCByZWFzc29jX2Z0X2llc19sZW5ndGg7CisJLyogUHJlLUF1dGggaW5mbyAqLworCXRGVElFU3RhdGVzIEZUU3RhdGU7ICAgIC8qIFRoZSBzdGF0ZSBvZiBGVCBpbiB0aGUgY3VycmVudCAxMXJBc3NvYyAqLworCXRTaXJNYWNBZGRyIHByZUF1dGhic3NJZDsgICAgICAgLyogQlNTSUQgdG8gcHJlYXV0aCB0byAqLworCXVpbnQzMl90IHNtZVNlc3Npb25JZDsKKwkvKiBTYXZlZCBwRlRQcmVBdXRoUnNwICovCisJdHBTaXJGVFByZUF1dGhSc3AgcHNhdmVkRlRQcmVBdXRoUnNwOworCWJvb2wgc2V0RlRQcmVBdXRoU3RhdGU7CisJYm9vbCBzZXRGVFBUS1N0YXRlOworCS8qIFRpbWUgdG8gdHJpZ2dlciByZWFzc29jIG9uY2UgcHJlLWF1dGggaXMgc3VjY2Vzc2Z1bCAqLworCWNkZl9tY190aW1lcl90IHByZUF1dGhSZWFzc29jSW50dmxUaW1lcjsKKwlib29sIGFkZE1ESUU7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCXVpbnQzMl90IHIwa2hfaWRfbGVuOworCXVpbnQ4X3QgcjBraF9pZFtTSVJfUk9BTV9SMEtIX0lEX01BWF9MRU5dOworI2VuZGlmCisJLyogVXNlciBjb250ZXh0IGZvciB0aGUgdGltZXIgY2FsbGJhY2sgKi8KKwl0cEZUUm9hbUNhbGxiYWNrVXNyQ3R4IHBVc3JDdHg7Cit9IHRmdFNNRUNvbnRleHQsICp0cGZ0U01FQ29udGV4dDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBQcm90b3R5cGUgZnVuY3Rpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNtZV9mdF9vcGVuKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkKTsKK3ZvaWQgc21lX2Z0X2Nsb3NlKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkKTsKK3ZvaWQgc21lX2Z0X3Jlc2V0KHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkKTsKK3ZvaWQgc21lX3NldF9mdF9pZXModEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsIGNvbnN0IHVpbnQ4X3QgKmZ0X2llcywKKwkJdWludDE2X3QgZnRfaWVzX2xlbmd0aCk7CitDREZfU1RBVFVTIHNtZV9mdF91cGRhdGVfa2V5KHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkLAorCQl0Q3NyUm9hbVNldEtleSAqcEZUS2V5SW5mbyk7Cit2b2lkIHNtZV9nZXRfZnRfcHJlX2F1dGhfcmVzcG9uc2UodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCXVpbnQ4X3QgKmZ0X2llcywgdWludDMyX3QgZnRfaWVzX2lwX2xlbiwKKwkJdWludDE2X3QgKmZ0X2llc19sZW5ndGgpOwordm9pZCBzbWVfZ2V0X3JpY2lfZXModEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsIHVpbnQ4X3QgKnJpY19pZXMsCisJCXVpbnQzMl90IHJpY19pZXNfaXBfbGVuLCB1aW50MzJfdCAqcmljX2llc19sZW5ndGgpOwordm9pZCBzbWVfcHJlYXV0aF9yZWFzc29jX2ludHZsX3RpbWVyX2NhbGxiYWNrKHZvaWQgKmNvbnRleHQpOwordm9pZCBzbWVfc2V0X2Z0X3ByZV9hdXRoX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkLCBib29sIHN0YXRlKTsKK2Jvb2wgc21lX2dldF9mdF9wcmVfYXV0aF9zdGF0ZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHNlc3Npb25JZCk7Citib29sIHNtZV9nZXRfZnRwdGtfc3RhdGUodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQpOwordm9pZCBzbWVfc2V0X2Z0cHRrX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkLCBib29sIHN0YXRlKTsKKyNlbmRpZgorCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKCBfX1NNRV9GVEFQSV9IICkgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc21lL2luYy9zbWVfaW5zaWRlLmggYi9jb3JlL3NtZS9pbmMvc21lX2luc2lkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NjE2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvc21lX2luc2lkZS5oCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoX19TTUVJTlNJREVfSCkKKyNkZWZpbmUgX19TTUVJTlNJREVfSAorCisvKioKKyAqIFxmaWxlICBzbWVfaW5zaWRlLmgKKyAqCisgKiBcYnJpZWYgcHJvdG90eXBlIGZvciBTTUUgc3RydWN0dXJlcyBhbmQgQVBJcyB1c2VkIGluc3NpZGUgU01FCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiY2RmX3N0YXR1cy5oIgorI2luY2x1ZGUgImNkZl9sb2NrLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RmX21lbW9yeS5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJjc3JfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzbWVfcW9zX2FwaS5oIgorI2luY2x1ZGUgInNtZV9xb3NfaW50ZXJuYWwuaCIKKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorI2luY2x1ZGUgIm9lbV9kYXRhX2ludGVybmFsLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInNtZV9ycm1fYXBpLmgiCisjZW5kaWYKK2VQaHlDaGFuQm9uZFN0YXRlIGNzcl9jb252ZXJ0X2NiX2luaV92YWx1ZV90b19waHlfY2Jfc3RhdGUodWludDMyX3QgY2JJbmlWYWx1ZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBTTUVfVE9UQUxfQ09NTUFORCAgNDAKKwordHlwZWRlZiBzdHJ1Y3Qgc0dlbmVyaWNQbWNDbWQgeworCXVpbnQzMl90IHNpemU7ICAgICAgICAgIC8qIHNpemVvZiB0aGUgZGF0YSBpbiB0aGUgdW5pb24sIGlmIGFueSAqLworCXVpbnQzMl90IHNlc3Npb25JZDsKKwkvKiBpZiB0cnVlLCB0aGUgY21kIHNoYWxsbid0IHB1dCBiYWNrIHRvIHRoZSBxdWV1ZSwgZnJlZSBtZW0gaW5zdGVhZC4gKi8KKwlib29sIGZSZWxlYXNlV2hlbkRvbmU7CisJdW5pb24geworCQl0U2lyU21lV293bEVudGVyUGFyYW1zIGVudGVyV293bEluZm87CisJCXRTaXJTbWVXb3dsRXhpdFBhcmFtcyBleGl0V293bEluZm87CisJfSB1OworfSB0R2VuZXJpY1BtY0NtZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0dlbmVyaWNRb3NDbWQgeworCXNtZV9Rb3NXbW1Uc3BlY0luZm8gdHNwZWNJbmZvOworCXNtZV9Rb3NFZGNhQWNUeXBlIGFjOworCXVpbnQ4X3QgdHNwZWNfbWFzazsKK30gdEdlbmVyaWNRb3NDbWQ7CisKK3R5cGVkZWYgc3RydWN0IHNSZW1haW5DaGxDbWQgeworCXVpbnQ4X3QgY2huOworCXVpbnQ4X3QgcGh5TW9kZTsKKwl1aW50MzJfdCBkdXJhdGlvbjsKKwl1aW50OF90IGlzUDJQUHJvYmVSZXFBbGxvd2VkOworCXVpbnQzMl90IHNjYW5faWQ7CisJdm9pZCAqY2FsbGJhY2s7CisJdm9pZCAqY2FsbGJhY2tDdHg7Cit9IHRSZW1haW5DaGxDbWQ7CisKK3R5cGVkZWYgc3RydWN0IHNOb0FDbWQgeworCXRQMnBQc0NvbmZpZyBOb0E7Cit9IHROb0FDbWQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKK3R5cGVkZWYgc3RydWN0IFRkbHNTZW5kTWdtdEluZm8geworCXRTaXJNYWNBZGRyIHBlZXJNYWM7CisJdWludDhfdCBmcmFtZVR5cGU7CisJdWludDhfdCBkaWFsb2c7CisJdWludDE2X3Qgc3RhdHVzQ29kZTsKKwl1aW50OF90IHJlc3BvbmRlcjsKKwl1aW50MzJfdCBwZWVyQ2FwYWJpbGl0eTsKKwl1aW50OF90ICpidWY7CisJdWludDhfdCBsZW47Cit9IHRUZGxzU2VuZE1nbXRDbWRJbmZvOworCit0eXBlZGVmIHN0cnVjdCBUZGxzTGlua0VzdGFibGlzaEluZm8geworCXRTaXJNYWNBZGRyIHBlZXJNYWM7CisJdWludDhfdCB1YXBzZFF1ZXVlczsKKwl1aW50OF90IG1heFNwOworCXVpbnQ4X3QgaXNCdWZTdGE7CisJdWludDhfdCBpc09mZkNoYW5uZWxTdXBwb3J0ZWQ7CisJdWludDhfdCBpc1Jlc3BvbmRlcjsKKwl1aW50OF90IHN1cHBvcnRlZENoYW5uZWxzTGVuOworCXVpbnQ4X3Qgc3VwcG9ydGVkQ2hhbm5lbHNbU0lSX01BQ19NQVhfU1VQUF9DSEFOTkVMU107CisJdWludDhfdCBzdXBwb3J0ZWRPcGVyQ2xhc3Nlc0xlbjsKKwl1aW50OF90IHN1cHBvcnRlZE9wZXJDbGFzc2VzW1NJUl9NQUNfTUFYX1NVUFBfT1BFUl9DTEFTU0VTXTsKK30gdFRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVGRsc0FkZFN0YUluZm8geworCWVUZGxzQWRkT3BlciB0ZGxzQWRkT3BlcjsKKwl0U2lyTWFjQWRkciBwZWVyTWFjOworCXVpbnQxNl90IGNhcGFiaWxpdHk7CisJdWludDhfdCBleHRuQ2FwYWJpbGl0eVtTSVJfTUFDX01BWF9FWFROX0NBUF07CisJdWludDhfdCBzdXBwb3J0ZWRSYXRlc0xlbjsKKwl1aW50OF90IHN1cHBvcnRlZFJhdGVzW1NJUl9NQUNfTUFYX1NVUFBfUkFURVNdOworCXVpbnQ4X3QgaHRjYXBfcHJlc2VudDsKKwl0U2lySFRDYXAgSFRDYXA7CisJdWludDhfdCB2aHRjYXBfcHJlc2VudDsKKwl0U2lyVkhUQ2FwIFZIVENhcDsKKwl1aW50OF90IHVhcHNkUXVldWVzOworCXVpbnQ4X3QgbWF4U3A7Cit9IHRUZGxzQWRkU3RhQ21kSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVGRsc0RlbFN0YUluZm8geworCXRTaXJNYWNBZGRyIHBlZXJNYWM7Cit9IHRUZGxzRGVsU3RhQ21kSW5mbzsKKy8qCisgKiBURExTIGNtZCBpbmZvLCBDTUQgZnJvbSBTTUUgdG8gUEUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHNfdGRsc19jbWQgeworCXVpbnQzMl90IHNpemU7CisJdW5pb24geworCQl0VGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvIHRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mbzsKKwkJdFRkbHNTZW5kTWdtdENtZEluZm8gdGRsc1NlbmRNZ210Q21kSW5mbzsKKwkJdFRkbHNBZGRTdGFDbWRJbmZvIHRkbHNBZGRTdGFDbWRJbmZvOworCQl0VGRsc0RlbFN0YUNtZEluZm8gdGRsc0RlbFN0YUNtZEluZm87CisJfSB1OworfSB0VGRsc0NtZDsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fVERMUyAqLworCisvKioKKyAqIHN0cnVjdCBzX25zc191cGRhdGVfY21kIC0gRm9ybWF0IG9mIG5zcyB1cGRhdGUgcmVxdWVzdAorICogQG5ld19uc3M6IG5ldyBuc3MgdmFsdWUKKyAqIEBzZXNzaW9uX2lkOiBTZXNzaW9uIElECisgKiBAc2V0X2h3X21vZGVfY2I6IEhERCBuc3MgdXBkYXRlIGNhbGxiYWNrCisgKiBAY29udGV4dDogQWRhcHRlciBjb250ZXh0CisgKi8KK3N0cnVjdCBzX25zc191cGRhdGVfY21kIHsKKwl1aW50MzJfdCBuZXdfbnNzOworCXVpbnQzMl90IHNlc3Npb25faWQ7CisJdm9pZCAqbnNzX3VwZGF0ZV9jYjsKKwl2b2lkICpjb250ZXh0OworCXVpbnQ4X3QgbmV4dF9hY3Rpb247Cit9OworCit0eXBlZGVmIHN0cnVjdCB0YWdTbWVDbWQgeworCXRMaXN0RWxlbSBMaW5rOworCWVTbWVDb21tYW5kVHlwZSBjb21tYW5kOworCXVpbnQzMl90IHNlc3Npb25JZDsKKwl1bmlvbiB7CisJCXRTY2FuQ21kIHNjYW5DbWQ7CisJCXRSb2FtQ21kIHJvYW1DbWQ7CisJCXRXbVN0YXR1c0NoYW5nZUNtZCB3bVN0YXR1c0NoYW5nZUNtZDsKKwkJdFNldEtleUNtZCBzZXRLZXlDbWQ7CisJCXRHZW5lcmljUG1jQ21kIHBtY0NtZDsKKwkJdEdlbmVyaWNRb3NDbWQgcW9zQ21kOworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCQl0T2VtRGF0YUNtZCBvZW1EYXRhQ21kOworI2VuZGlmCisJCXRSZW1haW5DaGxDbWQgcmVtYWluQ2hsQ21kOworCQl0Tm9BQ21kIE5vQUNtZDsKKwkJdEFkZFN0YUZvclNlc3Npb25DbWQgYWRkU3RhU2Vzc2lvbkNtZDsKKwkJdERlbFN0YUZvclNlc3Npb25DbWQgZGVsU3RhU2Vzc2lvbkNtZDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCQl0VGRsc0NtZCB0ZGxzQ21kOworI2VuZGlmCisJCXN0cnVjdCBzaXJfaHdfbW9kZSBzZXRfaHdfbW9kZV9jbWQ7CisJCXN0cnVjdCBzX25zc191cGRhdGVfY21kIG5zc191cGRhdGVfY21kOworCQlzdHJ1Y3Qgc2lyX2R1YWxfbWFjX2NvbmZpZyBzZXRfZHVhbF9tYWNfY21kOworCX0gdTsKK30gdFNtZUNtZDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbnRlcm5hbCB0byBTTUUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTbWVDbWQgKnNtZV9nZXRfY29tbWFuZF9idWZmZXIodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIHNtZV9wdXNoX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENtZCwgYm9vbCBmSGlnaFByaW9yaXR5KTsKK3ZvaWQgc21lX3Byb2Nlc3NfcGVuZGluZ19xdWV1ZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgc21lX3JlbGVhc2VfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ21kKTsKK3ZvaWQgcHVyZ2Vfc21lX3Nlc3Npb25fY21kX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQl0RGJsTGlua0xpc3QgKnBMaXN0KTsKK2Jvb2wgc21lX2NvbW1hbmRfcGVuZGluZyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2Jvb2wgcG1jX3Byb2Nlc3NfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCk7Citib29sIHFvc19wcm9jZXNzX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOworQ0RGX1NUQVRVUyBjc3JfcHJvY2Vzc19zY2FuX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9wcm9jZXNzX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOwordm9pZCBjc3Jfcm9hbV9wcm9jZXNzX3dtX3N0YXR1c19jaGFuZ2VfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0U21lQ21kICpwQ29tbWFuZCk7Cit2b2lkIGNzcl9yZWluaXRfcm9hbV9jbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOwordm9pZCBjc3JfcmVpbml0X3dtX3N0YXR1c19jaGFuZ2VfY21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKTsKK3ZvaWQgY3NyX3JlaW5pdF9zZXRfa2V5X2NtZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCk7CitDREZfU1RBVFVTIGNzcl9yb2FtX3Byb2Nlc3Nfc2V0X2tleV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRTbWVDbWQgKnBDb21tYW5kKTsKK3ZvaWQgY3NyX3JlbGVhc2VfY29tbWFuZF9zZXRfa2V5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKTsKK3ZvaWQgY3NyX2Fib3J0X2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIGJvb2wgZlN0b3BwaW5nKTsKKworQ0RGX1NUQVRVUyBjc3JfaXNfdmFsaWRfY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNobk51bSk7Citib29sIGNzcl9yb2FtX2lzX3ZhbGlkNDBfbWh6X2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcG1hYywgdWludDhfdCBjaGFubmVsKTsKKworQ0RGX1NUQVRVUyBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jayh0U21lU3RydWN0ICpwc1NtZSk7CitDREZfU1RBVFVTIHNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKHRTbWVTdHJ1Y3QgKnBzU21lKTsKKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorQ0RGX1NUQVRVUyBvZW1fZGF0YV9wcm9jZXNzX29lbV9kYXRhX3JlcV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRTbWVDbWQgKnBDb21tYW5kKTsKKyNlbmRpZgorCitDREZfU1RBVFVTIGNzcl9wcm9jZXNzX2FkZF9zdGFfc2Vzc2lvbl9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRTbWVDbWQgKnBDb21tYW5kKTsKK0NERl9TVEFUVVMgY3NyX3Byb2Nlc3NfYWRkX3N0YV9zZXNzaW9uX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwTXNnKTsKK0NERl9TVEFUVVMgY3NyX3Byb2Nlc3NfZGVsX3N0YV9zZXNzaW9uX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdFNtZUNtZCAqcENvbW1hbmQpOworQ0RGX1NUQVRVUyBjc3JfcHJvY2Vzc19kZWxfc3RhX3Nlc3Npb25fcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBNc2cpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCitDREZfU1RBVFVTIHBtY19zZXRfcHJlZmVycmVkX25ldHdvcmtfbGlzdCh0SGFsSGFuZGxlIGhIYWwsCisJCXRwU2lyUE5PU2NhblJlcSBwUmVxdWVzdCwKKwkJdWludDhfdCBzZXNzaW9uSWQsCisJCXByZWZlcnJlZF9uZXR3b3JrX2ZvdW5kX2luZF9jYgorCQljYWxsYmFja1JvdXRpbmUsIHZvaWQgKmNhbGxiYWNrQ29udGV4dCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1NDQU5fUE5PICovCitib29sIGNzcl9yb2FtR2V0Q29uY3VycmVuY3lDb25uZWN0U3RhdHVzRm9yQm1wcyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworQ0RGX1NUQVRVUyBjc3JfdGRsc19zZW5kX21nbXRfcmVxKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCXRDc3JUZGxzU2VuZE1nbXQgKiB0ZGxzU2VuZE1nbXQpOworQ0RGX1NUQVRVUyBjc3JfdGRsc19zZW5kX2xpbmtfZXN0YWJsaXNoX3BhcmFtcyh0SGFsSGFuZGxlIGhIYWwsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLCBjb25zdCB0U2lyTWFjQWRkciBwZWVyTWFjLAorCQl0Q3NyVGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMgKnRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zKTsKK0NERl9TVEFUVVMgY3NyX3RkbHNfYWRkX3BlZXJfc3RhKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCWNvbnN0IHRTaXJNYWNBZGRyIHBlZXJNYWMpOworQ0RGX1NUQVRVUyBjc3JfdGRsc19jaGFuZ2VfcGVlcl9zdGEodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJY29uc3QgdFNpck1hY0FkZHIgcGVlck1hYywKKwkJdENzclN0YVBhcmFtcyAqcHN0YVBhcmFtcyk7CitDREZfU1RBVFVTIGNzcl90ZGxzX2RlbF9wZWVyX3N0YSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQljb25zdCB0U2lyTWFjQWRkciBwZWVyTWFjKTsKK0NERl9TVEFUVVMgY3NyX3RkbHNfcHJvY2Vzc19jbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOworQ0RGX1NUQVRVUyBjc3JfdGRsc19wcm9jZXNzX2xpbmtfZXN0YWJsaXNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKmNtZCk7CitDREZfU1RBVFVTIHRkbHNfbXNnX3Byb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBtc2dfdHlwZSwKKwkJdm9pZCAqcE1zZ0J1Zik7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KKworI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IFwKKwkJIGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKK0NERl9TVEFUVVMgY3NyX2ZsdXNoX2NmZ19iZ19zY2FuX3JvYW1fY2hhbm5lbF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgY3NyX2NyZWF0ZV9iZ19zY2FuX3JvYW1fY2hhbm5lbF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLCBjb25zdCB1aW50OF90ICpwQ2hhbm5lbExpc3QsCisJCWNvbnN0IHVpbnQ4X3QgbnVtQ2hhbm5lbHMpOworQ0RGX1NUQVRVUyBjc3JfdXBkYXRlX2JnX3NjYW5fY29uZmlnX2luaV9jaGFubmVsX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQsIGVDc3JCYW5kIGVCYW5kKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorQ0RGX1NUQVRVUyBjc3JfY3JlYXRlX3JvYW1fc2Nhbl9jaGFubmVsX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQsCisJCXVpbnQ4X3QgKnBDaGFubmVsTGlzdCwKKwkJdWludDhfdCBudW1DaGFubmVscywKKwkJY29uc3QgZUNzckJhbmQgZUJhbmQpOworI2VuZGlmCisKK2VQaHlDaGFuQm9uZFN0YXRlIGNzcl9jb252ZXJ0X2NiX2luaV92YWx1ZV90b19waHlfY2Jfc3RhdGUodWludDMyX3QgY2JJbmlWYWx1ZSk7Cit2b2lkIGFjdGl2ZV9saXN0X2NtZF90aW1lb3V0X2hhbmRsZSh2b2lkICp1c2VyRGF0YSk7Cit2b2lkIGNzcl9wcm9jZXNzX3NldF9kdWFsX21hY19jb25maWcodHBBbmlTaXJHbG9iYWwgbWFjLCB0U21lQ21kICpjb21tYW5kKTsKK3ZvaWQgY3NyX3Byb2Nlc3Nfc2V0X2h3X21vZGUodHBBbmlTaXJHbG9iYWwgbWFjLCB0U21lQ21kICpjb21tYW5kKTsKK3ZvaWQgY3NyX3Byb2Nlc3NfbnNzX3VwZGF0ZV9yZXEodHBBbmlTaXJHbG9iYWwgbWFjLCB0U21lQ21kICpjb21tYW5kKTsKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoIF9fU01FSU5TSURFX0ggKSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zbWUvaW5jL3NtZV9pbnRlcm5hbC5oIGIvY29yZS9zbWUvaW5jL3NtZV9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjU0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvc21lX2ludGVybmFsLmgKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChfX1NNRUlOVEVSTkFMX0gpCisjZGVmaW5lIF9fU01FSU5URVJOQUxfSAorCisvKioKKyAqIFxmaWxlICBzbWVfaW50ZXJuYWwuaAorICoKKyAqIFxicmllZiBwcm90b3R5cGUgZm9yIFNNRSBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGFuZCBBUElzIHVzZWQgZm9yIFNNRSBhbmQgTUFDCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiY2RmX3N0YXR1cy5oIgorI2luY2x1ZGUgImNkZl9sb2NrLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RmX21lbW9yeS5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2V2ZW50LmgiCisjaW5jbHVkZSAiY3NyX2xpbmtfbGlzdC5oIgorI2luY2x1ZGUgInNtZV9wb3dlcl9zYXZlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTWFzayBjYW4gYmUgb25seSBoYXZlIG9uZSBiaXQgc2V0ICovCit0eXBlZGVmIGVudW0gZVNtZUNvbW1hbmRUeXBlIHsKKwllU21lTm9Db21tYW5kID0gMCwKKwllU21lRHJvcENvbW1hbmQsCisJLyogdGhpcyBpcyBub3QgYSBjb21tYW5kLCBpdCBpcyB0byBpZGVudGlmeSB0aGlzIGlzIGEgQ1NSIGNvbW1hbmQgKi8KKwllU21lQ3NyQ29tbWFuZE1hc2sgPSAweDEwMDAwLAorCWVTbWVDb21tYW5kU2NhbiwKKwllU21lQ29tbWFuZFJvYW0sCisJZVNtZUNvbW1hbmRXbVN0YXR1c0NoYW5nZSwKKwllU21lQ29tbWFuZFNldEtleSwKKwllU21lQ29tbWFuZEFkZFN0YVNlc3Npb24sCisJZVNtZUNvbW1hbmREZWxTdGFTZXNzaW9uLAorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJLyoKKwkgKiBlU21lVGRsc0NvbW1hbmRNYXNrID0gMHg4MDAwMCwKKwkgKiBUbyBpZGVudGlmeSBURExTIGNvbW1hbmRzIDxUT0RPPgorCSAqIFRoZXNlIGNhbiBiZSBjb25zaWRlcmVkIGFzIGNzciBjb21tYW5kcy4KKwkgKi8KKwllU21lQ29tbWFuZFRkbHNTZW5kTWdtdCwKKwllU21lQ29tbWFuZFRkbHNBZGRQZWVyLAorCWVTbWVDb21tYW5kVGRsc0RlbFBlZXIsCisJZVNtZUNvbW1hbmRUZGxzTGlua0VzdGFibGlzaCwKKyNlbmRpZgorCS8qIFBNQyAqLworCWVTbWVQbWNDb21tYW5kTWFzayA9IDB4MjAwMDAsICAgLyogVG8gaWRlbnRpZnkgUE1DIGNvbW1hbmRzICovCisJZVNtZUNvbW1hbmRFbnRlckJtcHMsCisJZVNtZUNvbW1hbmRFeGl0Qm1wcywKKwllU21lQ29tbWFuZEVudGVyVWFwc2QsCisJZVNtZUNvbW1hbmRFeGl0VWFwc2QsCisJZVNtZUNvbW1hbmRFeGl0V293bCwKKwllU21lQ29tbWFuZEVudGVyU3RhbmRieSwKKwkvKiBRT1MgKi8KKwllU21lUW9zQ29tbWFuZE1hc2sgPSAweDQwMDAwLCAgIC8qIFRvIGlkZW50aWZ5IFFvcyBjb21tYW5kcyAqLworCWVTbWVDb21tYW5kQWRkVHMsCisJZVNtZUNvbW1hbmREZWxUcywKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKwllU21lQ29tbWFuZE9lbURhdGFSZXEgPSAweDgwMDAwLCAvKiBUbyBpZGVudGlmeSB0aGUgb2VtIGRhdGEgY29tbWFuZHMgKi8KKyNlbmRpZgorCWVTbWVDb21tYW5kUmVtYWluT25DaGFubmVsLAorCWVfc21lX2NvbW1hbmRfc2V0X2h3X21vZGUsCisJZV9zbWVfY29tbWFuZF9uc3NfdXBkYXRlLAorCWVfc21lX2NvbW1hbmRfc2V0X2R1YWxfbWFjX2NvbmZpZywKK30gZVNtZUNvbW1hbmRUeXBlOworCit0eXBlZGVmIGVudW0gZVNtZVN0YXRlIHsKKwlTTUVfU1RBVEVfU1RPUCwKKwlTTUVfU1RBVEVfU1RBUlQsCisJU01FX1NUQVRFX1JFQURZLAorfSBlU21lU3RhdGU7CisKKyNkZWZpbmUgU01FX0lTX1NUQVJUKHBNYWMpICAoU01FX1NUQVRFX1NUT1AgIT0gKHBNYWMpLT5zbWUuc3RhdGUpCisjZGVmaW5lIFNNRV9JU19SRUFEWShwTWFjKSAgKFNNRV9TVEFURV9SRUFEWSA9PSAocE1hYyktPnNtZS5zdGF0ZSkKKwordHlwZWRlZiBzdHJ1Y3Qgc1N0YXRzRXh0RXZlbnQgeworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3QgZXZlbnRfZGF0YV9sZW47CisJdWludDhfdCBldmVudF9kYXRhW107Cit9IHRTdGF0c0V4dEV2ZW50LCAqdHBTdGF0c0V4dEV2ZW50OworCisjZGVmaW5lIE1BWF9BQ1RJVkVfQ01EX1NUQVRTICAgIDE2CisKK3R5cGVkZWYgc3RydWN0IHNBY3RpdmVDbWRTdGF0cyB7CisJZVNtZUNvbW1hbmRUeXBlIGNvbW1hbmQ7CisJdWludDMyX3QgcmVhc29uOworCXVpbnQzMl90IHNlc3Npb25JZDsKKwl1aW50NjRfdCB0aW1lc3RhbXA7Cit9IHRBY3RpdmVDbWRTdGF0czsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NlbGZSZWNvdmVyeVN0YXRzIHsKKwl0QWN0aXZlQ21kU3RhdHMgYWN0aXZlQ21kU3RhdHNbTUFYX0FDVElWRV9DTURfU1RBVFNdOworCXVpbnQ4X3QgY21kU3RhdHNJbmR4OworfSB0U2VsZlJlY292ZXJ5U3RhdHM7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKy8qIEdUSyBPZmZsb2FkIEluZm9ybWF0aW9uIENhbGxiYWNrIGRlY2xhcmF0aW9uICovCit0eXBlZGVmIHZvaWQgKCpndGtfb2ZmbG9hZF9nZXRfaW5mb19jYWxsYmFjaykodm9pZCAqY2FsbGJhY2tfY29udGV4dCwKKwkJdHBTaXJHdGtPZmZsb2FkR2V0SW5mb1JzcFBhcmFtcworCQlwR3RrT2ZmbG9hZEdldEluZm9Sc3ApOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisvKlByZWYgbmV0dyBmb3VuZCBDYiBkZWNsYXJhdGlvbiovCit0eXBlZGVmIHZvaWQgKCpwcmVmZXJyZWRfbmV0d29ya19mb3VuZF9pbmRfY2IpKHZvaWQgKmNhbGxiYWNrX2NvbnRleHQsCisJCXRwU2lyUHJlZk5ldHdvcmtGb3VuZEluZAorCQlwUHJlZk5ldHdvcmtGb3VuZEluZCk7CisjZW5kaWYKKwordHlwZWRlZiB2b2lkICgqb2NiX2NhbGxiYWNrKSh2b2lkICpjb250ZXh0LCB2b2lkICpyZXNwb25zZSk7Cit0eXBlZGVmIHZvaWQgKCpzbWVfc2V0X3RoZXJtYWxfbGV2ZWxfY2FsbGJhY2spKHZvaWQgKmNvbnRleHQsIHVfaW50OF90IGxldmVsKTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnU21lU3RydWN0IHsKKwllU21lU3RhdGUgc3RhdGU7CisJY2RmX211dGV4X3QgbGtTbWVHbG9iYWxMb2NrOworCXVpbnQzMl90IHRvdGFsU21lQ21kOworCXZvaWQgKnBTbWVDbWRCdWZBZGRyOworCXREYmxMaW5rTGlzdCBzbWVDbWRBY3RpdmVMaXN0OworCXREYmxMaW5rTGlzdCBzbWVDbWRQZW5kaW5nTGlzdDsKKwl0RGJsTGlua0xpc3Qgc21lQ21kRnJlZUxpc3Q7ICAgIC8qIHByZWFsbG9jYXRlZCByb2FtIGNtZCBsaXN0ICovCisJdENERl9DT05fTU9ERSBjdXJyRGV2aWNlTW9kZTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTFBIQgorCXZvaWQgKCpwTHBoYkluZENiKSh2b2lkICpwSGRkQ3R4LCB0U2lyTFBIQkluZCAqaW5kUGFyYW0pOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9MUEhCICovCisJLyogcGVuZGluZyBzY2FuIGNvbW1hbmQgbGlzdCAqLworCXREYmxMaW5rTGlzdCBzbWVTY2FuQ21kUGVuZGluZ0xpc3Q7CisJLyogYWN0aXZlIHNjYW4gY29tbWFuZCBsaXN0ICovCisJdERibExpbmtMaXN0IHNtZVNjYW5DbWRBY3RpdmVMaXN0OworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisJaG9zdF9ldmVudF93bGFuX3N0YXR1c19wYXlsb2FkX3R5cGUgZXZlbnRQYXlsb2FkOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NIX0FWT0lECisJdm9pZCAoKnBDaEF2b2lkTm90aWZpY2F0aW9uQ2IpKHZvaWQgKmhkZF9jb250ZXh0LCB2b2lkICppbmRpX3BhcmFtKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUworCXZvaWQgKCpwTGlua0xheWVyU3RhdHNJbmRDYWxsYmFjaykodm9pZCAqY2FsbGJhY2tDb250ZXh0LAorCQkJaW50IGluZFR5cGUsIHZvaWQgKnBSc3ApOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKwl2b2lkICgqcEF1dG9TaHV0ZG93bk5vdGlmaWNhdGlvbkNiKSh2b2lkKTsKKyNlbmRpZgorCS8qIE1heGltdW0gaW50ZXJmYWNlcyBhbGxvd2VkIGJ5IHRoZSBob3N0ICovCisJdWludDhfdCBtYXhfaW50Zl9jb3VudDsKKwl2b2lkICgqU3RhdHNFeHRDYWxsYmFjaykodm9pZCAqLCB0U3RhdHNFeHRFdmVudCAqKTsKKwkvKiBsaW5rc3BlZWQgY2FsbGJhY2sgKi8KKwl2b2lkICgqcExpbmtTcGVlZEluZENiKSh0U2lyTGlua1NwZWVkSW5mbyAqaW5kUGFyYW0sCisJCQl2b2lkICpwRGV2Q29udGV4dCk7CisJdm9pZCAqcExpbmtTcGVlZENiQ29udGV4dDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCXZvaWQgKCpwRXh0U2NhbkluZENiKSh2b2lkICosIGNvbnN0IHVpbnQxNl90LCB2b2lkICopOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FWFRTQ0FOICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorCXZvaWQgKCpuYW5DYWxsYmFjaykodm9pZCAqLCB0U2lyTmFuRXZlbnQgKik7CisjZW5kaWYKKwlib29sIGVuYWJsZVNlbGZSZWNvdmVyeTsKKwl0Q3NyTGlua1N0YXR1c0NhbGxiYWNrIGxpbmtTdGF0dXNDYWxsYmFjazsKKwl2b2lkICpsaW5rU3RhdHVzQ29udGV4dDsKKwkvKiBnZXQgdGVtcGVyYXR1cmUgZXZlbnQgY29udGV4dCBhbmQgY2FsbGJhY2sgKi8KKwl2b2lkICpwVGVtcGVyYXR1cmVDYkNvbnRleHQ7CisJdm9pZCAoKnBHZXRUZW1wZXJhdHVyZUNiKShpbnQgdGVtcGVyYXR1cmUsIHZvaWQgKmNvbnRleHQpOworCXVpbnQ4X3QgbWlyYWNhc3RfdmFsdWU7CisJc3RydWN0IHBzX2dsb2JhbF9pbmZvICBwc19nbG9iYWxfaW5mbzsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKwkvKiByb3V0aW5lIHRvIGNhbGwgZm9yIEdUSyBPZmZsb2FkIEluZm9ybWF0aW9uICovCisJZ3RrX29mZmxvYWRfZ2V0X2luZm9fY2FsbGJhY2sgZ3RrX29mZmxvYWRfZ2V0X2luZm9fY2I7CisJLyogdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byByb3V0aW5lIHNwZWNpZmllZCBhYm92ZSAqLworCXZvaWQgKmd0a19vZmZsb2FkX2dldF9pbmZvX2NiX2NvbnRleHQ7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FEICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisJLyogcm91dGluZSB0byBjYWxsIGZvciBQcmVmZXJyZWQgTmV0d29yayBGb3VuZCBJbmRpY2F0aW9uICovCisJcHJlZmVycmVkX25ldHdvcmtfZm91bmRfaW5kX2NiIHByZWZfbmV0d19mb3VuZF9jYjsKKwkvKiB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHJvdXRpbmUgc3BlY2lmaWVkIGFib3ZlICovCisJdm9pZCAqcHJlZmVycmVkX25ldHdvcmtfZm91bmRfaW5kX2NiX2N0eDsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKwl2b2lkICgqcnNzaV90aHJlc2hvbGRfYnJlYWNoZWRfY2IpKHZvaWQgKiwgc3RydWN0IHJzc2lfYnJlYWNoX2V2ZW50ICopOworI2lmZGVmIFdMQU5fRkVBVFVSRV9NRU1EVU1QCisJdm9pZCAoKmZ3X2R1bXBfY2FsbGJhY2spKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBmd19kdW1wX3JzcCAqcnNwKTsKKyNlbmRpZgorCWh3X21vZGVfdHJhbnNpdGlvbl9jYiBzbWVfaHdfbW9kZV90cmFuc19jYjsKKwkvKiBPQ0IgY2FsbGJhY2tzICovCisJdm9pZCAqb2NiX3NldF9jb25maWdfY29udGV4dDsKKwlvY2JfY2FsbGJhY2sgb2NiX3NldF9jb25maWdfY2FsbGJhY2s7CisJdm9pZCAqb2NiX2dldF90c2ZfdGltZXJfY29udGV4dDsKKwlvY2JfY2FsbGJhY2sgb2NiX2dldF90c2ZfdGltZXJfY2FsbGJhY2s7CisJdm9pZCAqZGNjX2dldF9zdGF0c19jb250ZXh0OworCW9jYl9jYWxsYmFjayBkY2NfZ2V0X3N0YXRzX2NhbGxiYWNrOworCXZvaWQgKmRjY191cGRhdGVfbmRsX2NvbnRleHQ7CisJb2NiX2NhbGxiYWNrIGRjY191cGRhdGVfbmRsX2NhbGxiYWNrOworCXZvaWQgKmRjY19zdGF0c19ldmVudF9jb250ZXh0OworCW9jYl9jYWxsYmFjayBkY2Nfc3RhdHNfZXZlbnRfY2FsbGJhY2s7CisJc21lX3NldF90aGVybWFsX2xldmVsX2NhbGxiYWNrIHNldF90aGVybWFsX2xldmVsX2NiOworfSB0U21lU3RydWN0LCAqdHBTbWVTdHJ1Y3Q7CisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoIF9fU01FSU5URVJOQUxfSCApICovCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9pbmMvc21lX3Bvd2VyX3NhdmUuaCBiL2NvcmUvc21lL2luYy9zbWVfcG93ZXJfc2F2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWY2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvc21lX3Bvd2VyX3NhdmUuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChfX1NNRV9QT1dFUl9TQVZFX0gpCisjZGVmaW5lIF9fU01FX1BPV0VSX1NBVkVfSAorI2luY2x1ZGUgImNkZl9sb2NrLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RmX21lbW9yeS5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgImFuaV9zeXN0ZW1fZGVmcy5oIgorI2luY2x1ZGUgInNpcl9hcGkuaCIKKworI2RlZmluZSBNQVhfU01FX1NFU1NJT05TIDUKKy8qIEF1dG8gUHMgRW50cnkgVGltZXIgRGVmYXVsdCB2YWx1ZSAtIDEwMDAgbXMgKi8KKyNkZWZpbmUgQVVUT19QU19FTlRSWV9USU1FUl9ERUZBVUxUX1ZBTFVFIDEwMDAKKworLyogQXV0byBEZWZlcnJlZCBQcyBFbnRyeSBUaW1lciB2YWx1ZSAtIDIwMDAwIG1zICovCisjZGVmaW5lIEFVVE9fREVGRVJSRURfUFNfRU5UUllfVElNRVJfREVGQVVMVF9WQUxVRSAyMDAwMAorCisKKworLyoqCisgKiBlbnVtIHBzX3N0YXRlIC0gU3RhdGUgb2YgdGhlIHBvd2VyIHNhdmUKKyAqIEBGVUxMX1BPV0VSX01PREU6IGZvciBGdWxsIHBvd2VyIG1vZGUKKyAqIEBMRUdBQ1lfUE9XRVJfU0FWRV9NT0RFOiBGb3IgTGVnYWN5IFBvd2VyIFNhdmUgbW9kZQorICogQFVBUFNEX01PREU6IGZvciBVQVBTRCBwb3dlciBzYXZlCisgKi8KKworZW51bSBwc19zdGF0ZSB7CisJRlVMTF9QT1dFUl9NT0RFLAorCUxFR0FDWV9QT1dFUl9TQVZFX01PREUsCisJVUFQU0RfTU9ERQorfTsKKworLyoqCisgKiBzdHJ1Y3QgcHNfcGFyYW1zIC0gbWFpbnRhaW4gcG93ZXIgc2F2ZSBzdGF0ZSBhbmQgVVNBUEQgcGFyYW1zCisgKiBAbWFjX2N0eDogbWFjX2N0eAorICogQHNlc3Npb25faWQ6IFNlc3Npb24gSWQuCisgKiBAcHNfc3RhdGUgOiBTdGF0ZSBvZiB0aGUgcG93ZXIgc2F2ZQorICogQHVhcHNkX3Blcl9hY190cmlnZ2VyX2VuYWJsZV9tYXNrOiBkeW5hbWljIFVQQVNEIG1hc2sgc2V0dGluZworICoJCWRlcml2ZWQgZnJvbSBBZGRUUyBSc3AgYW5kIERlbFRTIGZyYW1lLgorICoJCUlmIGEgcGFydGljdWxhciBBQyBiaXQgaXMgc2V0LCBpdCBtZWFucyBBQyBpcyB0cmlnZ2VyICBlbmFibGVkLgorICogQHVhcHNkX3Blcl9hY19kZWxpdmVyeV9lbmFibGVfbWFzazogZHluYW1pYyBVUEFTRCBtYXNrIHNldHRpbmcKKyAqCQlkZXJpdmVkIGZyb20gQWRkVFMgUnNwIGFuZCBEZWxUcyBmcmFtZS4KKyAqCQlJZiBhIHBhcnRpY3VsYXIgQUMgYml0IGlzIHNldCwgaXQgbWVhbnMgQUMgaXMgZGVsaXZlcnkgZW5hYmxlZC4KKyAqIEBhY19hZG1pdF9tYXNrOiB1c2VkIGZvciBBQyBkb3duZ3JhZGUuIFRoaXMgaXMgYSBkeW5hbWljIG1hc2sKKyAqCQlzZXR0aW5nIHdoaWNoIGtlZXAgdHJhY2tzIG9mIEFDcyBiZWluZyBhZG1pdHRlZC4KKyAqCQlJZiBiaXQgaXMgc2V0IHRvIDA6IFRoYXQgcGFydGljdWxhciBBQyBpcyBub3QgYWRtaXR0ZWQKKyAqCQlJZiBiaXQgaXMgc2V0IHRvIDE6IFRoYXQgcGFydGljdWxhciBBQyBpcyBhZG1pdHRlZAorICogQCB1YXBzZF9wZXJfYWNfYml0X21hc2s6IFRoaXMgaXMgYSBzdGF0aWMgVUFQU0QgbWFzayBzZXR0aW5nCisgKgkJZGVyaXZlZCBmcm9tIFNNRV9KT0lOX1JFUSBhbmQgU01FX1JFQVNTT0NfUkVRLgorICoJCUlmIGEgcGFydGljdWxhciBBQyBiaXQgaXMgc2V0LCBpdCBtZWFucyB0aGUgQUMgaXMgYm90aAorICoJCXRyaWdnZXIgZW5hYmxlZCBhbmQgZGVsaXZlcnkgZW5hYmxlZC4KKyAqIEBlbnRlcl93b3dsX2NhbGxiYWNrX3JvdXRpbmU6IHJvdXRpbmUgdG8gY2FsbCBmb3Igd293bCByZXF1ZXN0LgorICogQGVudGVyX3dvd2xfY2FsbGJhY2tfY29udGV4dDogdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0bworICoJCQlyb3V0aW5lIHNwZWNpZmllZCBhYm92ZS4KKyAqIEB3b3dsX2VudGVyX3BhcmFtczogV09XTCBtb2RlIGNvbmZpZ3VyYXRpb24uCisgKiBAd2FrZV9yZWFzb25faW5kX2NiOiByb3V0aW5lIHRvIGNhbGwgZm9yIHdha2UgcmVhc29uIGluZGljYXRpb24uCisgKiBAd2FrZV9yZWFzb25faW5kX2NiX2N0eDogdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0bworICoJCQlyb3V0aW5lIHNwZWNpZmllZCBhYm92ZS4KKyAqLworCitzdHJ1Y3QgcHNfcGFyYW1zIHsKKwl2b2lkICptYWNfY3R4OworCXVpbnQzMl90ICAgICBzZXNzaW9uX2lkOworCWVudW0gICAgcHNfc3RhdGUgcHNfc3RhdGU7CisJdWludDhfdCB1YXBzZF9wZXJfYWNfdHJpZ2dlcl9lbmFibGVfbWFzazsKKwl1aW50OF90IHVhcHNkX3Blcl9hY19kZWxpdmVyeV9lbmFibGVfbWFzazsKKwl1aW50OF90IGFjX2FkbWl0X21hc2tbU0lSX01BQ19ESVJFQ1RJT05fRElSRUNUXTsKKwl1aW50OF90IHVhcHNkX3Blcl9hY19iaXRfbWFzazsKKwkvKiBXT1dMIHBhcmFtICovCisJdm9pZCAoKmVudGVyX3dvd2xfY2FsbGJhY2tfcm91dGluZSkodm9pZCAqY2FsbGJhY2tfY29udGV4dCwKKwkJCUNERl9TVEFUVVMgc3RhdHVzKTsKKwl2b2lkICplbnRlcl93b3dsX2NhbGxiYWNrX2NvbnRleHQ7CisJdFNpclNtZVdvd2xFbnRlclBhcmFtcyB3b3dsX2VudGVyX3BhcmFtczsKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKwl2b2lkICgqd2FrZV9yZWFzb25faW5kX2NiKSh2b2lkICpjYWxsYmFja19jb250ZXh0LAorCQkJdHBTaXJXYWtlUmVhc29uSW5kIHdha2VfcmVhc29uX2luZCk7CisJdm9pZCAqd2FrZV9yZWFzb25faW5kX2NiX2N0eDsKKyNlbmRpZiAvKiBXTEFOX1dBS0VVUF9FVkVOVFMgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWJvb2wgaXNfdGRsc19wb3dlcl9zYXZlX3Byb2hpYml0ZWQ7CisjZW5kaWYKKwkvKgorCSAqIEF1dG8gU3RhIFBzIEVuYWJsZSBUaW1lcgorCSAqIFVwb24gZXhwaXJhdGlvbiBvZiB0aGlzIHRpbWVyCisJICogUG93ZXIgU2F2ZSBPZmZsb2FkIG1vZHVsZSB3aWxsCisJICogdHJ5IHRvIGVuYWJsZSBzdGEgbW9kZSBwcworCSAqLworCWNkZl9tY190aW1lcl90IGF1dG9fcHNfZW5hYmxlX3RpbWVyOworCit9OworCisvKioKKyAqIHN0cnVjdCBwc19nbG9iYWxfaW5mbyAtIGdsb2JhbCBzdHJ1Y3QgZm9yIFBvd2VyIHNhdmUgaW5mb3JtYXRpb24KKyAqIEBwc19lbmFibGVkOiBQb3dlciBTYXZlIGlzIGVuYWJsZWQgb3Igbm90IGluIGluaQorICogQHBzX3BhcmFtczogIG1haW50YWluIHBvd2VyIHNhdmUgc3RhdGUgYW5kIFVTQVBEIHBhcmFtcworICovCitzdHJ1Y3QgcHNfZ2xvYmFsX2luZm8geworCWJvb2wgcHNfZW5hYmxlZDsKKwlzdHJ1Y3QgcHNfcGFyYW1zIHBzX3BhcmFtc1tNQVhfU01FX1NFU1NJT05TXTsKKwkvKiBSZW1haW4gaW4gUG93ZXIgYWN0aXZlIHRpbGwgREhDUCBjb21wbGV0ZXMgKi8KKwlib29sIHJlbWFpbl9pbl9wb3dlcl9hY3RpdmVfdGlsbF9kaGNwOworfTsKKworLyoqCisgKiBlbnVtIHNtZV9wc19jbWQ6IHBvd2VyIHNhdmUgbWVzc2FnZSB0byBzZW5kIFdNQQorICogQFNNRV9QU19FTkFCTEU6IEZvciBwb3dlciBzYXZlIGVuYWJsZS4KKyAqIEBTTUVfUFNfRElTQUJMRTogZm9yIFBvd2VyIHNhdmUgZGlzYWJsZS4KKyAqIEBTTUVfUFNfVUFQU0RfRU5BQkxFOyBmb3IgVUFQU0QgZW5hYmxlLgorICogQFNNRV9QU19VQVBTRF9ESVNBQkxFOiBmb3IgVUFQU0QgZGlzYWJsZS4KKyAqIEBTTUVfUFNfV09XTF9FTlRFUjogZm9yIFdPV0wgRW50ZXIuCisgKiBAU01FX1BTX1dPV0xfRVhJVDogZm9yIFdPV0wgRXhpdC4KKyAqIEBTTUVfUFNfV09XTF9BRERfQkNBU1RfUFRSTjogQWRkIGJjc3QgV09XTCBwYXR0ZXJuLgorICogQFNNRV9QU19XT1dMX0RFTF9CQ0FTVF9QVFJOOiBEZWwgQmNzciBXb3dsIFBhdHRlcm4uCisgKi8KK2VudW0gc21lX3BzX2NtZCB7CisJU01FX1BTX0VOQUJMRSA9IDAsCisJU01FX1BTX0RJU0FCTEUsCisJU01FX1BTX1VBUFNEX0VOQUJMRSwKKwlTTUVfUFNfVUFQU0RfRElTQUJMRSwKKwlTTUVfUFNfV09XTF9FTlRFUiwKKwlTTUVfUFNfV09XTF9FWElULAorCVNNRV9QU19XT1dMX0FERF9CQ0FTVF9QVFJOLAorCVNNRV9QU19XT1dMX0RFTF9CQ0FTVF9QVFJOLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9pbmMvc21lX3Bvd2VyX3NhdmVfYXBpLmggYi9jb3JlL3NtZS9pbmMvc21lX3Bvd2VyX3NhdmVfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmYTY3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL2luYy9zbWVfcG93ZXJfc2F2ZV9hcGkuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKF9fU01FX1BPV0VSX1NBVkVfQVBJX0gpCisjZGVmaW5lIF9fU01FX1BPV0VSX1NBVkVfQVBJX0gKKworI2luY2x1ZGUgInNtZV9wb3dlcl9zYXZlLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgInNtZV9pbnNpZGUuaCIKKworQ0RGX1NUQVRVUyBzbWVfcHNfZW5hYmxlX2Rpc2FibGUodEhhbEhhbmRsZSBoYWxfY3R4LCB1aW50MzJfdCBzZXNzaW9uX2lkLAorCQllbnVtIHNtZV9wc19jbWQgY29tbWFuZCk7CisKK0NERl9TVEFUVVMgc21lX3BzX3VhcHNkX2VuYWJsZSh0SGFsSGFuZGxlIGhhbF9jdHgsIHVpbnQzMl90IHNlc3Npb25faWQpOworCitDREZfU1RBVFVTIHNtZV9wc191YXBzZF9kaXNhYmxlKHRIYWxIYW5kbGUgaGFsX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCk7CisKKy8qIENvbmRpdGlvbiBjaGVjayBpZiBkcml2ZXIgaXMgcmVhZHkgdG8gZW50ZXIgaW4gUFMgKi8KK0NERl9TVEFUVVMgc21lX2VuYWJsZV9zdGFfcHNfY2hlY2sodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCk7CisKK0NERl9TVEFUVVMgc21lX3BzX3Byb2Nlc3NfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50MzJfdCBzZXNzaW9uX2lkLAorCQllbnVtIHNtZV9wc19jbWQgY29tbWFuZCk7CisKK3ZvaWQgc21lX3NldF90c3BlY191YXBzZF9tYXNrX3Blcl9zZXNzaW9uKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXRTaXJNYWNUU0luZm8gKnRzX2luZm8sCisJCXVpbnQ4X3Qgc2Vzc2lvbl9pZCk7CisvKiBGdWxsIFBvd2VyIFJlcSBDYWxsYmFjayAqLwordHlwZWRlZiB2b2lkICgqdWFwc2Rfc3RhcnRfaW5kaWNhdGlvbl9jYikodm9pZCAqY2FsbGJhY2tfY29udGV4dCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCwgQ0RGX1NUQVRVUyBzdGF0dXMpOworCitDREZfU1RBVFVTIHNtZV9wc19zdGFydF91YXBzZCh0SGFsSGFuZGxlIGhhbF9jdHgsIHVpbnQzMl90IHNlc3Npb25faWQsCisJCXVhcHNkX3N0YXJ0X2luZGljYXRpb25fY2IgdWFwc2Rfc3RhcnRfaW5kX2NiLAorCQl2b2lkICpjYWxsYmFja19jb250ZXh0KTsKK0NERl9TVEFUVVMgc21lX3NldF9wc19ob3N0X29mZmxvYWQodEhhbEhhbmRsZSBoYWxfY3R4LAorCQl0cFNpckhvc3RPZmZsb2FkUmVxIHJlcXVlc3QsCisJCXVpbnQ4X3Qgc2Vzc2lvbl9pZCk7CisKKyNpZmRlZiBXTEFOX05TX09GRkxPQUQKK0NERl9TVEFUVVMgc21lX3NldF9wc19uc19vZmZsb2FkKHRIYWxIYW5kbGUgaGFsX2N0eCwKKwkJdHBTaXJIb3N0T2ZmbG9hZFJlcSByZXF1ZXN0LAorCQl1aW50OF90IHNlc3Npb25faWQpOworCisjZW5kaWYgLyogV0xBTl9OU19PRkZMT0FEICovCisvKiAvIFBvc3QgYSBtZXNzYWdlIHRvIFBFIG1vZHVsZSAqLwordFNpclJldFN0YXR1cyBzbWVfcG9zdF9wZV9tZXNzYWdlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwU2lyTXNnUSBwTXNnKTsKKworQ0RGX1NUQVRVUyBzbWVfcHNfZW5hYmxlX2F1dG9fcHNfdGltZXIodEhhbEhhbmRsZSBoYWxfY3R4LAorCQl1aW50MzJfdCBzZXNzaW9uSWQsCisJCWJvb2wgaXNSZWFzc29jKTsKK0NERl9TVEFUVVMgc21lX3BzX2Rpc2FibGVfYXV0b19wc190aW1lcih0SGFsSGFuZGxlIGhhbF9jdHgsCisJCXVpbnQzMl90IHNlc3Npb25JZCk7CisKK0NERl9TVEFUVVMgc21lX3BzX29wZW4odEhhbEhhbmRsZSBoYWxfY3R4KTsKKworQ0RGX1NUQVRVUyBzbWVfcHNfb3Blbl9wZXJfc2Vzc2lvbih0SGFsSGFuZGxlIGhhbF9jdHgsIHVpbnQzMl90IHNlc3Npb25faWQpOworCit2b2lkIHNtZV9hdXRvX3BzX2VudHJ5X3RpbWVyX2V4cGlyZWQodm9pZCAqcHNfcGFyYW0pOworQ0RGX1NUQVRVUyBzbWVfcHNfY2xvc2UodEhhbEhhbmRsZSBoYWxfY3R4KTsKK0NERl9TVEFUVVMgc21lX3BzX2Nsb3NlX3Blcl9zZXNzaW9uKHRIYWxIYW5kbGUgaGFsX2N0eCwgdWludDMyX3Qgc2Vzc2lvbklkKTsKKworQ0RGX1NUQVRVUyBzbWVfc2V0X3BzX3ByZWZlcnJlZF9uZXR3b3JrX2xpc3QodEhhbEhhbmRsZSBoYWxfY3R4LAorCQl0cFNpclBOT1NjYW5SZXEgcmVxdWVzdCwKKwkJdWludDhfdCBzZXNzaW9uX2lkLAorCQlwcmVmZXJyZWRfbmV0d29ya19mb3VuZF9pbmRfY2IKKwkJY2FsbGJhY2tfcm91dGluZSwKKwkJdm9pZCAqY2FsbGJhY2tfY29udGV4dCk7CisKK0NERl9TVEFUVVMgc21lX2lzX2F1dG9fcHNfdGltZXJfcnVubmluZyh0SGFsSGFuZGxlIGhhbF9jdHgsCisJCXVpbnQzMl90IHNlc3Npb25faWQpOworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKF9fU01FX1BPV0VSX1NBVkVfQVBJX0gpICovCisKZGlmZiAtLWdpdCBhL2NvcmUvc21lL2luYy9zbWVfcW9zX2FwaS5oIGIvY29yZS9zbWUvaW5jL3NtZV9xb3NfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkMDJkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL2luYy9zbWVfcW9zX2FwaS5oCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoX19TTUVfUU9TQVBJX0gpCisjZGVmaW5lIF9fU01FX1FPU0FQSV9ICisKKy8qKgorICogXGZpbGUgIHNtZV9xb3NfYXBpLmgKKyAqCisgKiBcYnJpZWYgcHJvdG90eXBlIGZvciBTTUUgUW9TIEFQSXMKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJjZGZfbG9jay5oIgorI2luY2x1ZGUgImNkZl90cmFjZS5oIgorI2luY2x1ZGUgImNkZl9tZW1vcnkuaCIKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAic2lyX2FwaS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFByZS1wcm9jZXNzb3IgRGVmaW5pdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU01FX1FPU19VQVBTRF9WTyAgICAgIDB4MDEKKyNkZWZpbmUgU01FX1FPU19VQVBTRF9WSSAgICAgIDB4MDIKKyNkZWZpbmUgU01FX1FPU19VQVBTRF9CRSAgICAgIDB4MDgKKyNkZWZpbmUgU01FX1FPU19VQVBTRF9CSyAgICAgIDB4MDQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgUW9TIHN0YXR1cyB0eXBlcyB0aGF0IHdvdWxkIGJlIHJlcG9ydGVkIHRvIEhERAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKwkvKgorCSAqIGFzeW5jOiBvbmNlIFBFIG5vdGlmaWVzIHN1Y2Nlc3NmdWwgVFNQRUMgbmVnb3RpYXRpb24sIG9yIENTUiBub3RpZmllcworCSAqIGZvciBzdWNjZXNzZnVsIHJlYXNzb2MsIG5vdGlmaWVzIEhERCB3aXRoIGN1cnJlbnQgUW9TIFBhcmFtcworCSAqLworCVNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfSU5EID0gMCwKKwkvKiBzeW5jOiBvbmx5IHdoZW4gQXBwIGFza2VkIGZvciBBUFNEICYgaXQncyBhbHJlYWR5IHNldCB3aXRoIEFDTSA9IDAgKi8KKwlTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFksCisJLyogc3luYyBvciBhc3luYzogaW4gY2FzZSBvZiBhc3luYyBub3RpZnkgSEREIHdpdGggY3VycmVudCBRb1MgUGFyYW1zICovCisJU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1AsCisJLyogc3luYyAqLworCVNNRV9RT1NfU1RBVFVTX1NFVFVQX0lOVkFMSURfUEFSQU1TX1JTUCwKKwkvKiBzeW5jOiBBUCBkb2Vzbid0IHN1cHBvcnQgUW9TIChXTU0pICovCisJU01FX1FPU19TVEFUVVNfU0VUVVBfTk9UX1FPU19BUF9SU1AsCisJLyogc3luYzogZWl0aGVyIHJlcSBoYXMgYmVlbiBzZW50IGRvd24gdG8gUEUgb3IganVzdCBidWZmZXJlZCBpbiBTTUUgKi8KKwlTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1AsCisJLyoKKwkgKiBhc3luYzogaW4gY2FzZSBvZiBmbG93IGFnZ3JlZ2F0aW9uLCBpZiB0aGUgbmV3IFRTUEVDIG5lZ290aWF0aW9uCisJICogaXMgc3VjY2Vzc2Z1bCwgT1IsIG5vdGlmeSBleGlzdGluZyBmbG93cyB0aGF0IFRTUEVDIGlzIG1vZGlmaWVkIHdpdGgKKwkgKiBjdXJyZW50IFFvUyBQYXJhbXMKKwkgKi8KKwlTTUVfUU9TX1NUQVRVU19TRVRVUF9NT0RJRklFRF9JTkQsCisJLyogc3luYzogbm8gQVBTRCBhc2tlZCBmb3IgJiBBQ00gPSAwICovCisJU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1AsCisJLyoKKwkgKiBhc3luYzogSW4gY2FzZSBvZiBVQVBTRCwgb25jZSBQRSBub3RpZmllcyBzdWNjZXNzZnVsIFRTUEVDCisJICogbmVnb3RpYXRpb24sIG9yIENTUiBub3RpZmllcyBmb3Igc3VjY2Vzc2Z1bCByZWFzc29jIHRvIFNNRS1Rb1MsCisJICogbm90aWZ5IEhERCBpZiBQTUMgY2FuJ3QgcHV0IHRoZSBtb2R1bGUgaW4gVUFQU0QgbW9kZSByaWdodCBhd2F5CisJICogKENERl9TVEFUVVNfUE1DX1BFTkRJTkcpCisJICovCisJU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9QRU5ESU5HLAorCS8qCisJICogYXN5bmM6IEluIGNhc2Ugb2YgVUFQU0QsIG9uY2UgUEUgbm90aWZpZXMgc3VjY2Vzc2Z1bCBUU1BFQworCSAqIG5lZ290aWF0aW9uLCBvciBDU1Igbm90aWZpZXMgZm9yIHN1Y2Nlc3NmdWwgcmVhc3NvYyB0byBTTUUtUW9TLAorCSAqIG5vdGlmeSBIREQgaWYgUE1DIGNhbid0IHB1dCB0aGUgbW9kdWxlIGluIFVBUFNEIG1vZGUgYXQgYWxsCisJICogKENERl9TVEFUVVNfRV9GQUlMVVJFKQorCSAqLworCVNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfSU5EX0FQU0RfU0VUX0ZBSUxFRCwKKwkvKgorCSAqIHN5bmM6IHJlcSBoYXMgYmVlbiBzZW50IGRvd24gdG8gUEUgaW4gY2FzZSBvZiBkZWx0cyBvciBhZGR0cworCSAqIGZvciByZW1haW4gZmxvd3MsIE9SIGlmIHRoZSBBQyBkb2Vzbid0IGhhdmUgQVBTRCBvciBBQ00KKwkgKiBhc3luYzogb25jZSB0aGUgZG93bmdyYWRlIHJlcSBmb3IgUW9TIHBhcmFtcyBpcyBzdWNjZXNzZnVsCisJICovCisJU01FX1FPU19TVEFUVVNfUkVMRUFTRV9TVUNDRVNTX1JTUCA9IDEwMCwKKwkvKiBzeW5jIG9yIGFzeW5jOiBpbiBjYXNlIG9mIGFzeW5jIG5vdGlmeSBIREQgd2l0aCBjdXJyZW50IFFvUyBQYXJhbSAqLworCVNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfRkFJTFVSRV9SU1AsCisJLyogYXN5bmM6IEFQIHNlbnQgREVMVFMgaW5kaWNhdGlvbiAqLworCVNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUU9TX0xPU1RfSU5ELAorCS8qCisJICogc3luYzogYW4gYWRkdHMgcmVxIGhhcyBiZWVuIHNlbnQgZG93biB0byBQRSB0byBkb3duZ3JhZGUgdGhlCisJICogUW9TIHBhcmFtcyBvciBqdXN0IGJ1ZmZlcmVkIGluIFNNRQorCSAqLworCVNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUkVRX1BFTkRJTkdfUlNQLAorCS8qIHN5bmMgKi8KKwlTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0lOVkFMSURfUEFSQU1TX1JTUCwKKwkvKgorCSAqIGFzeW5jOiBmb3IgUW9TIG1vZGlmeSByZXF1ZXN0IGlmIG1vZGlmaWNhdGlvbiBpcyBzdWNjZXNzZnVsLAorCSAqIG5vdGlmaWVzIEhERCB3aXRoIGN1cnJlbnQgUW9TIFBhcmFtcworCSAqLworCVNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX0lORCA9IDIwMCwKKwkvKiBzeW5jOiBvbmx5IHdoZW4gQXBwIGFza2VkIGZvciBBUFNEICYgaXQncyBhbHJlYWR5IHNldCB3aXRoIEFDTSA9IDAgKi8KKwlTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZLAorCS8qIHN5bmMgb3IgYXN5bmM6IGluIGNhc2Ugb2YgYXN5bmMgbm90aWZ5IEhERCB3aXRoIGN1cnJlbnQgUW9TIFBhcmFtICovCisJU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQLAorCS8qIHN5bmM6IGVpdGhlciByZXEgaGFzIGJlZW4gc2VudCBkb3duIHRvIFBFIG9yIGp1c3QgYnVmZmVyZWQgaW4gU01FICovCisJU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1BFTkRJTkdfUlNQLAorCS8qIHN5bmM6IG5vIEFQU0QgYXNrZWQgZm9yICYgQUNNID0gMCAqLworCVNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUCwKKwkvKiBzeW5jICovCisJU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0lOVkFMSURfUEFSQU1TX1JTUCwKKwkvKgorCSAqIGFzeW5jOiBJbiBjYXNlIG9mIFVBUFNELCBvbmNlIFBFIG5vdGlmaWVzIHN1Y2Nlc3NmdWwgVFNQRUMKKwkgKiBuZWdvdGlhdGlvbiBvciBDU1Igbm90aWZpZXMgZm9yIHN1Y2Nlc3NmdWwgcmVhc3NvYyB0byBTTUUtUW9TLAorCSAqIG5vdGlmeSBIREQgaWYgUE1DIGNhbid0IHB1dCB0aGUgbW9kdWxlIGluIFVBUFNEIG1vZGUgcmlnaHQgYXdheQorCSAqIChDREZfU1RBVFVTX1BNQ19QRU5ESU5HKQorCSAqLworCVNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX0lORF9BUFNEX1BFTkRJTkcsCisJLyoKKwkgKiBhc3luYzogSW4gY2FzZSBvZiBVQVBTRCwgb25jZSBQRSBub3RpZmllcyBzdWNjZXNzZnVsIFRTUEVDCisJICogbmVnb3RpYXRpb24sIG9yIENTUiBub3RpZmllcyBmb3Igc3VjY2Vzc2Z1bCByZWFzc29jIHRvIFNNRS1Rb1MsCisJICogbm90aWZ5IEhERCBpZiBQTUMgY2FuJ3QgcHV0IHRoZSBtb2R1bGUgaW4gVUFQU0QgbW9kZSBhdCBhbGwKKwkgKiAoQ0RGX1NUQVRVU19FX0ZBSUxVUkUpCisJICovCisJU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfSU5EX0FQU0RfU0VUX0ZBSUxFRCwKKwkvKiBzeW5jOiBTVEEgaXMgaGFuZGluZyBvZmYgdG8gYSBuZXcgQVAgKi8KKwlTTUVfUU9TX1NUQVRVU19IQU5ESU5HX09GRiA9IDMwMCwKKwkvKiBhc3luYzpwb3dlcnNhdmUgbW9kZSBjaGFuZ2VkIGJ5IFBNQyBmcm9tIFVBUFNEIHRvIEZ1bGwgcG93ZXIgKi8KKwlTTUVfUU9TX1NUQVRVU19PVVRfT0ZfQVBTRF9QT1dFUl9NT0RFX0lORCA9IDQwMCwKKwkvKiBhc3luYzpwb3dlcnNhdmUgbW9kZSBjaGFuZ2VkIGJ5IFBNQyBmcm9tIEZ1bGwgcG93ZXIgdG8gVUFQU0QgKi8KKwlTTUVfUU9TX1NUQVRVU19JTlRPX0FQU0RfUE9XRVJfTU9ERV9JTkQsCisKK30gc21lX1Fvc1N0YXR1c1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIFVzZXIgcHJpb3JpdHkgKFVQKSB0eXBlcworCisgIEZyb20gODAyLjFELzgwMi4xMWUvV01NIHNwZWNpZmljYXRpb25zIChhbGwgcmVmZXIgdG8gc2FtZSB0YWJsZSkKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSB7CisJU01FX1FPU19XTU1fVVBfQkUgPSAwLAorCVNNRV9RT1NfV01NX1VQX0JLID0gMSwKKwlTTUVfUU9TX1dNTV9VUF9SRVNWID0gMiwgICAgICAgIC8qIFJlc2VydmVkICovCisJU01FX1FPU19XTU1fVVBfRUUgPSAzLAorCVNNRV9RT1NfV01NX1VQX0NMID0gNCwKKwlTTUVfUU9TX1dNTV9VUF9WSSA9IDUsCisJU01FX1FPU19XTU1fVVBfVk8gPSA2LAorCVNNRV9RT1NfV01NX1VQX05DID0gNywKKwlTTUVfUU9TX1dNTV9VUF9NQVgKK30gc21lX1Fvc1dtbVVwVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgVFNQRUMgZGlyZWN0aW9ucworCisgIEZyb20gODAyLjExZS9XTU0gc3BlY2lmaWNhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKwlTTUVfUU9TX1dNTV9UU19ESVJfVVBMSU5LID0gMCwKKwlTTUVfUU9TX1dNTV9UU19ESVJfRE9XTkxJTksgPSAxLAorCVNNRV9RT1NfV01NX1RTX0RJUl9SRVNWID0gMiwgICAgLyogUmVzZXJ2ZWQgKi8KKwlTTUVfUU9TX1dNTV9UU19ESVJfQk9USCA9IDMsCit9IHNtZV9Rb3NXbW1EaXJUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBFbnVtZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBUU1BFQyBhY2sgcG9saWNpZXMuCisKKyAgRnJvbSA4MDIuMTEgV01NIHNwZWNpZmljYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKwlTTUVfUU9TX1dNTV9UU19BQ0tfUE9MSUNZX05PUk1BTF9BQ0sgPSAwLAorCVNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfUkVTVjEgPSAxLAorCVNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfUkVTVjIgPSAyLCAgICAvKiBSZXNlcnZlZCAqLworCVNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfSFRfSU1NRURJQVRFX0JMT0NLX0FDSyA9IDMsCisKK30gc21lX1Fvc1dtbUFja1BvbGljeVR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRTIEluZm8gZmllbGQgaW4gdGhlIFdNTSBUU1BFQworCisgIFNlZSBzdWdnZXN0aXZlIHZhbHVlcyBhYm92ZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgYnVyc3Rfc2l6ZV9kZWZuOworCXNtZV9Rb3NXbW1BY2tQb2xpY3lUeXBlIGFja19wb2xpY3k7CisJc21lX1Fvc1dtbVVwVHlwZSB1cDsgICAgLyogVXNlciBwcmlvcml0eSAqLworCXVpbnQ4X3QgcHNiOyAgICAgICAgICAgIC8qIHBvd2VyLXNhdmUgYml0ICovCisJc21lX1Fvc1dtbURpclR5cGUgZGlyZWN0aW9uOyAgICAvKiBEaXJlY3Rpb24gKi8KKwl1aW50OF90IHRpZDsgICAgICAgICAgICAvKiBUSUQgOiBUbyBiZSBmaWxsZWQgdXAgYnkgU01FLVFvUyAqLworfSBzbWVfUW9zV21tVHNJbmZvVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVGhlIFdNTSBUU1BFQyBFbGVtZW50IChmcm9tIHRoZSBXTU0gc3BlYykKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlzbWVfUW9zV21tVHNJbmZvVHlwZSB0c19pbmZvOworCXVpbnQxNl90IG5vbWluYWxfbXNkdV9zaXplOworCXVpbnQxNl90IG1heGltdW1fbXNkdV9zaXplOworCXVpbnQzMl90IG1pbl9zZXJ2aWNlX2ludGVydmFsOworCXVpbnQzMl90IG1heF9zZXJ2aWNlX2ludGVydmFsOworCXVpbnQzMl90IGluYWN0aXZpdHlfaW50ZXJ2YWw7CisJdWludDMyX3Qgc3VzcGVuc2lvbl9pbnRlcnZhbDsKKwl1aW50MzJfdCBzdmNfc3RhcnRfdGltZTsKKwl1aW50MzJfdCBtaW5fZGF0YV9yYXRlOworCXVpbnQzMl90IG1lYW5fZGF0YV9yYXRlOworCXVpbnQzMl90IHBlYWtfZGF0YV9yYXRlOworCXVpbnQzMl90IG1heF9idXJzdF9zaXplOworCXVpbnQzMl90IGRlbGF5X2JvdW5kOworCXVpbnQzMl90IG1pbl9waHlfcmF0ZTsKKwl1aW50MTZfdCBzdXJwbHVzX2J3X2FsbG93YW5jZTsKKwl1aW50MTZfdCBtZWRpdW1fdGltZTsKK30gc21lX1Fvc1dtbVRzcGVjSW5mbzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBFeHRlcm5hbCBBUElzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIENERl9TVEFUVVMgKCpzbWVfUW9zQ2FsbGJhY2spKHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAqSEREY29udGV4dCwKKwkJc21lX1Fvc1dtbVRzcGVjSW5mbyAqcEN1cnJlbnRRb1NJbmZvLAorCQlzbWVfUW9zU3RhdHVzVHlwZSBzdGF0dXMsIHVpbnQzMl90IFFvc0Zsb3dJRCk7CitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfcW9zX3NldHVwX3JlcSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJc21lX1Fvc1dtbVRzcGVjSW5mbyAqcFFvU0luZm8sCisJCXNtZV9Rb3NDYWxsYmFjayBRb1NDYWxsYmFjaywgdm9pZCAqSEREY29udGV4dCwKKwkJc21lX1Fvc1dtbVVwVHlwZSBVUFR5cGUsIHVpbnQzMl90ICpwUW9zRmxvd0lEKTsKK3NtZV9Rb3NTdGF0dXNUeXBlIHNtZV9xb3NfbW9kaWZ5X3JlcSh0SGFsSGFuZGxlIGhIYWwsCisJCXNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBRb1NJbmZvLCB1aW50MzJfdCBRb3NGbG93SUQpOworc21lX1Fvc1N0YXR1c1R5cGUgc21lX3Fvc19yZWxlYXNlX3JlcSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IFFvc0Zsb3dJRCk7Citib29sIHNtZV9xb3NfaXNfdHNfaW5mb19hY2tfcG9saWN5X3ZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBRb1NJbmZvLCB1aW50OF90IHNlc3Npb25JZCk7Cit2b2lkIHNtZV9xb3NfdXBkYXRlX2hhbmRfb2ZmKHVpbnQ4X3Qgc2Vzc2lvbklkLCBib29sIHVwZGF0ZUhhbmRPZmYpOworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX2RzY19wdG9fdXBfbWFwcGluZyh0SGFsSGFuZGxlIGhIYWwsCisJCXNtZV9Rb3NXbW1VcFR5cGUgKmRzY3BtYXBwaW5nLCB1aW50OF90IHNlc3Npb25JZCk7CisKK0NERl9TVEFUVVMgc21lX29mZmxvYWRfcW9zX3Byb2Nlc3Nfb3V0X29mX3VhcHNkX21vZGUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCk7CitDREZfU1RBVFVTIHNtZV9vZmZsb2FkX3Fvc19wcm9jZXNzX2ludG9fdWFwc2RfbW9kZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50MzJfdCBzZXNzaW9uX2lkKTsKK2Jvb2wgc21lX3Fvc190c3BlY19hY3RpdmUodHBBbmlTaXJHbG9iYWwgcE1hYywgc21lX2FjX2VudW1fdHlwZSBhYywKKwkJCSAgdWludDhfdCBzZXNzaW9uSWQsIHVpbnQ4X3QgKnBBY3RpdmVUc3BlYyk7CisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoIF9fU01FX1FPU0FQSV9IICkgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc21lL2luYy9zbWVfcW9zX2ludGVybmFsLmggYi9jb3JlL3NtZS9pbmMvc21lX3Fvc19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZGI5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvc21lX3Fvc19pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoX19TTUVRT1NJTlRFUk5BTF9IKQorI2RlZmluZSBfX1NNRVFPU0lOVEVSTkFMX0gKKworLyoqCisgKiBcZmlsZSAgc21lX3Fvc19pbnRlcm5hbC5oCisgKgorICogXGJyaWVmIHByb3RvdHlwZSBmb3IgU01FIFFvUyBBUElzCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiY2RmX2xvY2suaCIKKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJzbWVfcW9zX2FwaS5oIgorI2luY2x1ZGUgInNtZV9pbnRlcm5hbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNNRV9RT1NfQVBfU1VQUE9SVFNfQVBTRCAgICAgICAgIDB4ODAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgRURDQSBBY2Nlc3MgQ2F0ZWdvcmllczoKKyAgQmFzZWQgb24gQUMgdG8gQUNJIG1hcHBpbmcgaW4gODAyLjExZSBzcGVjIChpZGVudGljYWwgdG8gV01NKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKwlTTUVfUU9TX0VEQ0FfQUNfQkUgPSAwLCAvKiBCZXN0IGVmZm9ydCBhY2Nlc3MgY2F0ZWdvcnkgKi8KKwlTTUVfUU9TX0VEQ0FfQUNfQksgPSAxLCAvKiBCYWNrZ3JvdW5kIGFjY2VzcyBjYXRlZ29yeSAgKi8KKwlTTUVfUU9TX0VEQ0FfQUNfVkkgPSAyLCAvKiBWaWRlbyBhY2Nlc3MgY2F0ZWdvcnkgICAgICAgKi8KKwlTTUVfUU9TX0VEQ0FfQUNfVk8gPSAzLCAvKiBWb2ljZSBhY2Nlc3MgY2F0ZWdvcnkgICAgICAgKi8KKworCVNNRV9RT1NfRURDQV9BQ19NQVgKK30gc21lX1Fvc0VkY2FBY1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIENTUiBldmVudCBpbmRpY2F0aW9uIHR5cGVzIHRoYXQgd291bGQgYmUgcmVwb3J0ZWQKKyAgYnkgQ1NSCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0geworCVNNRV9RT1NfQ1NSX0pPSU5fUkVRID0gMCwKKwlTTUVfUU9TX0NTUl9BU1NPQ19DT01QTEVURSwKKwlTTUVfUU9TX0NTUl9SRUFTU09DX1JFUSwKKwlTTUVfUU9TX0NTUl9SRUFTU09DX0NPTVBMRVRFLAorCVNNRV9RT1NfQ1NSX1JFQVNTT0NfRkFJTFVSRSwKKwlTTUVfUU9TX0NTUl9ESVNDT05ORUNUX1JFUSwKKwlTTUVfUU9TX0NTUl9ESVNDT05ORUNUX0lORCwKKwlTTUVfUU9TX0NTUl9IQU5ET0ZGX0FTU09DX1JFUSwKKwlTTUVfUU9TX0NTUl9IQU5ET0ZGX0NPTVBMRVRFLAorCVNNRV9RT1NfQ1NSX0hBTkRPRkZfRkFJTFVSRSwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCVNNRV9RT1NfQ1NSX1BSRUFVVEhfU1VDQ0VTU19JTkQsCisJU01FX1FPU19DU1JfU0VUX0tFWV9TVUNDRVNTX0lORCwKKyNlbmRpZgorfSBzbWVfcW9zX2Nzcl9ldmVudF9pbmRUeXBlOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAordHlwZWRlZiBlbnVtIHsKKwlTTUVfUU9TX0RJQUdfQUREVFNfUkVRID0gMCwKKwlTTUVfUU9TX0RJQUdfQUREVFNfUlNQLAorCVNNRV9RT1NfRElBR19ERUxUUworfSBzbWVfUW9zRGlhZ1Fvc0V2ZW50U3VidHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlTTUVfUU9TX0RJQUdfQUREVFNfQURNSVNTSU9OX0FDQ0VQVEVEID0gMCwKKwlTTUVfUU9TX0RJQUdfQUREVFNfSU5WQUxJRF9QQVJBTVMsCisJU01FX1FPU19ESUFHX0FERFRTX1JFU0VSVkVELAorCVNNRV9RT1NfRElBR19BRERUU19SRUZVU0VELAorCVNNRV9RT1NfRElBR19VU0VSX1JFUVVFU1RFRCwKKwlTTUVfUU9TX0RJQUdfREVMVFNfSU5EX0ZST01fQVAsCisKK30gc21lX1Fvc0RpYWdRb3NFdmVudFJlYXNvbkNvZGU7CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUaGUgYXNzb2NpYXRpb24gaW5mb3JtYXRpb24gc3RydWN0dXJlIHRvIGJlIHBhc3NlZCBieSBDU1IgYWZ0ZXIgYXNzb2Mgb3IKKyAgcmVhc3NvYyBpcyBkb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYzsKKwl0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlOworfSBzbWVfUW9zQXNzb2NJbmZvOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEV4dGVybmFsIEFQSXMgZm9yIENTUiAtIEludGVybmFsIHRvIFNNRQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcW9zX29wZW4odHBBbmlTaXJHbG9iYWwgcE1hYyk7CitDREZfU1RBVFVTIHNtZV9xb3NfY2xvc2UodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitDREZfU1RBVFVTIHNtZV9xb3NfbXNnX3Byb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBtc2dfdHlwZSwKKwkJdm9pZCAqcE1zZ0J1Zik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW50ZXJuYWwgQVBJcyBmb3IgQ1NSCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfdmFsaWRhdGVfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MpOworQ0RGX1NUQVRVUyBzbWVfcW9zX2Nzcl9ldmVudF9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQsCisJCXNtZV9xb3NfY3NyX2V2ZW50X2luZFR5cGUgaW5kLCB2b2lkICpwRXZlbnRfaW5mbyk7Cit1aW50OF90IHNtZV9xb3NfZ2V0X2FjbV9tYXNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKK3VpbnQ4X3Qgc21lX3Fvc19lc2VfcmV0cmlldmVfdHNwZWNfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwkJdFRzcGVjSW5mbyAqIHBUc3BlY0luZm8pOworI2VuZGlmCisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoIF9fU01FUU9TSU5URVJOQUxfSCApICovCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9pbmMvc21lX3JybV9hcGkuaCBiL2NvcmUvc21lL2luYy9zbWVfcnJtX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0M2M3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvc21lX3JybV9hcGkuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoX19TTUVSUk1BUElfSCkKKyNkZWZpbmUgX19TTUVSUk1BUElfSAorCisvKioKKyAqIFxmaWxlICBzbWVfcnJtX2FwaS5oCisgKgorICogXGJyaWVmIHByb3RvdHlwZSBmb3IgU01FIFJSTSBBUElzCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiY2RmX2xvY2suaCIKKyNpbmNsdWRlICJjZGZfdHJhY2UuaCIKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJzbWVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzbWVfcnJtX2ludGVybmFsLmgiCisKK0NERl9TVEFUVVMgc21lX3JybV9tc2dfcHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IG1zZ190eXBlLAorCQl2b2lkICpwTXNnQnVmKTsKK0NERl9TVEFUVVMgcnJtX2Nsb3NlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworQ0RGX1NUQVRVUyBycm1fcmVhZHkodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitDREZfU1RBVFVTIHJybV9vcGVuKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworQ0RGX1NUQVRVUyBycm1fY2hhbmdlX2RlZmF1bHRfY29uZmlnX3BhcmFtKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRwUnJtQ29uZmlnUGFyYW0gcFJybUNvbmZpZyk7CitDREZfU1RBVFVTIHNtZV9ycm1fbmVpZ2hib3JfcmVwb3J0X3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uSWQsIHRwUnJtTmVpZ2hib3JSZXEgcE5laWdoYm9yUmVxLAorCQl0cFJybU5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvIGNhbGxiYWNrSW5mbyk7Cit0UnJtTmVpZ2hib3JSZXBvcnREZXNjICpzbWVfcnJtX2dldF9maXJzdF9ic3NfZW50cnlfZnJvbV9uZWlnaGJvcl9jYWNoZSgKKwkJdHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit0UnJtTmVpZ2hib3JSZXBvcnREZXNjICpzbWVfcnJtX2dldF9uZXh0X2Jzc19lbnRyeV9mcm9tX25laWdoYm9yX2NhY2hlKAorCQl0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0cFJybU5laWdoYm9yUmVwb3J0RGVzYyBwQnNzRW50cnkpOworQ0RGX1NUQVRVUyBzbWVfcnJtX3Byb2Nlc3NfYmVhY29uX3JlcG9ydF9yZXFfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXZvaWQgKnBNc2dCdWYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc21lL2luYy9zbWVfcnJtX2ludGVybmFsLmggYi9jb3JlL3NtZS9pbmMvc21lX3JybV9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NDE1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9pbmMvc21lX3JybV9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChfX1NNRVJSTUlOVEVSTkFMX0gpCisjZGVmaW5lIF9fU01FUlJNSU5URVJOQUxfSAorCisvKioKKyAqIFxmaWxlICBzbWVfcnJtX2ludGVybmFsLmgKKyAqCisgKiBcYnJpZWYgcHJvdG90eXBlIGZvciBTTUUgUlJNIEFQSXMKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJjZGZfbG9jay5oIgorI2luY2x1ZGUgImNkZl90cmFjZS5oIgorI2luY2x1ZGUgImNkZl9tZW1vcnkuaCIKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJycm1fZ2xvYmFsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNScm1Db25maWdQYXJhbSB7CisJdWludDhfdCBycm1FbmFibGVkOworCXVpbnQ4X3QgbWF4UmFuZG5JbnRlcnZhbDsKK30gdFJybUNvbmZpZ1BhcmFtLCAqdHBScm1Db25maWdQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1JybU5laWdoYm9yUmVwb3J0RGVzYyB7CisJdExpc3RFbGVtIExpc3Q7CisJdFNpck5laWdoYm9yQnNzRGVzY3JpcHRpb24gKnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uOworCXVpbnQzMl90IHJvYW1TY29yZTsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdFJybU5laWdoYm9yUmVwb3J0RGVzYywgKnRwUnJtTmVpZ2hib3JSZXBvcnREZXNjOworCit0eXBlZGVmIHZvaWQgKCpOZWlnaGJvclJlcG9ydFJzcENhbGxiYWNrKSh2b2lkICpjb250ZXh0LAorCQlDREZfU1RBVFVTIGNkZl9zdGF0dXMpOworCit0eXBlZGVmIHN0cnVjdCBzUnJtTmVpZ2hib3JSc3BDYWxsYmFja0luZm8geworCXVpbnQzMl90IHRpbWVvdXQ7ICAgICAgIC8qIGluIG1zLi4gbWluIHZhbHVlIGlzIDEwICgxMG1zKSAqLworCU5laWdoYm9yUmVwb3J0UnNwQ2FsbGJhY2sgbmVpZ2hib3JSc3BDYWxsYmFjazsKKwl2b2lkICpuZWlnaGJvclJzcENhbGxiYWNrQ29udGV4dDsKK30gdFJybU5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvLCAqdHBScm1OZWlnaGJvclJzcENhbGxiYWNrSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1JybU5laWdoYm9yUmVxdWVzdENvbnRyb2xJbmZvIHsKKwkvKiBUbyBjaGVjayB3aGV0aGVyIGEgbmVpZ2hib3IgcmVxIGlzIGFscmVhZHkgc2VudCAmIHJlc3BvbnNlIHBlbmRpbmcgKi8KKwlib29sIGlzTmVpZ2hib3JSc3BQZW5kaW5nOworCWNkZl9tY190aW1lcl90IG5laWdoYm9yUnNwV2FpdFRpbWVyOworCXRScm1OZWlnaGJvclJzcENhbGxiYWNrSW5mbyBuZWlnaGJvclJzcENhbGxiYWNrSW5mbzsKK30gdFJybU5laWdoYm9yUmVxdWVzdENvbnRyb2xJbmZvLCAqdHBScm1OZWlnaGJvclJlcXVlc3RDb250cm9sSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1JybVNNRUNvbnRleHQgeworCXVpbnQxNl90IHRva2VuOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgc2Vzc2lvbkJzc0lkOworCXVpbnQ4X3QgcmVnQ2xhc3M7CisJLyogbGlzdCBvZiBhbGwgY2hhbm5lbHMgdG8gYmUgbWVhc3VyZWQuICovCisJdENzckNoYW5uZWxJbmZvIGNoYW5uZWxMaXN0OworCXVpbnQ4X3QgY3VycmVudEluZGV4OworCS8qIFNTSUQgdXNlZCBpbiB0aGUgbWVhc3VyaW5nIGJlYWNvbiByZXBvcnQuICovCisJdEFuaVNTSUQgc3NJZDsKKwl0U2lyTWFjQWRkciBic3NJZDsgICAgICAvKiBic3NpZCB1c2VkIGZvciBiZWFjb24gcmVwb3J0IG1lYXN1cmVtZW50LiAqLworCS8qIFJhbmRvbWl6YXRpb24gaW50ZXJ2YWwgdG8gYmUgdXNlZCBpbiBzdWJzZXF1ZW50IG1lYXN1cmVtZW50cy4gKi8KKwl1aW50MTZfdCByYW5kbkludHZsOworCXVpbnQxNl90IGR1cmF0aW9uW1NJUl9FU0VfTUFYX01FQVNfSUVfUkVRU107CisJdWludDhfdCBtZWFzTW9kZVtTSVJfRVNFX01BWF9NRUFTX0lFX1JFUVNdOworCXRScm1Db25maWdQYXJhbSBycm1Db25maWc7CisJY2RmX21jX3RpbWVyX3QgSXRlck1lYXNUaW1lcjsKKwl0RGJsTGlua0xpc3QgbmVpZ2hib3JSZXBvcnRDYWNoZTsKKwl0UnJtTmVpZ2hib3JSZXF1ZXN0Q29udHJvbEluZm8gbmVpZ2hib3JSZXFDb250cm9sSW5mbzsKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKwl0Q3NyRXNlQmVhY29uUmVxIGVzZUJjblJlcUluZm87CisJYm9vbCBlc2VCY25SZXFJblByb2dyZXNzOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKwl0UnJtTXNnUmVxU291cmNlIG1zZ1NvdXJjZTsKK30gdFJybVNNRUNvbnRleHQsICp0cFJybVNNRUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IHNScm1OZWlnaGJvclJlcSB7CisJdWludDhfdCBub19zc2lkOworCXRTaXJNYWNTU2lkIHNzaWQ7Cit9IHRScm1OZWlnaGJvclJlcSwgKnRwUnJtTmVpZ2hib3JSZXE7CisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoIF9fU01FUlJNSU5URVJOQUxfSCApICovCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9pbmMvc21lX3RyYWNlLmggYi9jb3JlL3NtZS9pbmMvc21lX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkMWZlYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL2luYy9zbWVfdHJhY2UuaApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBcc21lX3RyYWNlLmgKKyAqCisgKiBcYnJpZWYgZGVmaW5pdGlvbiBmb3IgdHJhY2UgcmVsYXRlZCBBUElzCisgKi8KKworI2lmbmRlZiBfX1NNRV9UUkFDRV9IX18KKyNkZWZpbmUgX19TTUVfVFJBQ0VfSF9fCisKKyNpbmNsdWRlICJtYWNfdHJhY2UuaCIKKworI2RlZmluZSBOT19TRVNTSU9OIDB4RkYKKyNkZWZpbmUgVFJBQ0VfQ09ERV9TTUVfQ09NTUFORCAweEZGCitlbnVtIHsKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX1NDQU5fUkVRLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfU0NBTl9HRVRfUkVTVUxUUywKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX0NPTk5FQ1QsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TRVRfMTFESU5GTywKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX0dFVF9TT0ZUQVBfRE9NQUlOLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfU0VUX1JFR0lORk8sCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19VUERBVEVfQ0hBTk5FTF9DT05GSUcsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19VUERBVEVfQ09ORklHLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfSEREUkVBRFlJTkQsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TQ0FOX0ZMVVNIX1JFU1VMVFMsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TQ0FOX0ZMVVNIX1AyUFJFU1VMVFMsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TQ0FOX1JFU1VMVF9HRVRGSVJTVCwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX1NDQU5fUkVTVUxUX0dFVE5FWFQsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TQ0FOX1JFU1VMVF9QVVJHRSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfUk9BTV9SRUFTU09DLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9ST0FNX0RJU0NPTk5FQ1QsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JPQU1fR0VUX0NPTk5FQ1RQUk9GSUxFLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9ST0FNX0ZSRUVfQ09OTkVDVFBST0ZJTEUsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JPQU1fU0VUX1BNS0lEQ0FDSEUsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JPQU1fR0VUX1BNS0lEQ0FDSEUsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0dFVF9DT05GSUdQQVJBTSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfR0VUX01PRFBST0ZGSUVMRFMsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NFVF9DT05GSUdfUFdSU0FWRSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfR0VUX0NPTkZJR19QV1JTQVZFLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9FTkFCTEVfUFdSU0FWRSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfRElTQUJMRV9QV1JTQVZFLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9TSUdOQUxfUE9XRVJfRVZFTlQsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NUQVJUX0FVVE9fQk1QU1RJTUVSLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9TVE9QX0FVVE9fQk1QU1RJTUVSLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9JU19QV1JTQVZFX0VOQUJMRUQsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JFUVVFU1RfRlVMTFBPV0VSLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9SRVFVRVNUX0JNUFMsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NFVF9ESENQX0ZMQUcsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JFUVVFU1RfU1RBTkRCWSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfV09XTF9BRERCQ0FTVF9QQVRURVJOLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9XT1dMX0RFTEJDQVNUX1BBVFRFUk4sCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0VOVEVSX1dPV0wsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0VYSVRfV09XTCwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX0tFWSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfUkVNT1ZFX0tFWSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfR0VUX1NUQVRTLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9HRVRfUlNTSSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfR0VUX0NOVFJZQ09ERSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX0NOVFJZQ09ERSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ0hBTkdFX0NOVFJZQ09ERSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX0NGR1BSSVZBQ1ksCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX05FSUdIQk9SX1JFUE9SVFJFUSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfREJHX1JFQURSRUcsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0RCR19XUklURVJFRywKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfREJHX1JFQURNRU0sCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0RCR19XUklURU1FTSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfT1BFTl9TRVNTSU9OLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9DTE9TRV9TRVNTSU9OLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfSE9TVE9GRkxPQUQsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NFVF9HVEtPRkZMT0FELAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9HRVRfR1RLT0ZGTE9BRCwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfQUJPUlRfTUFDU0NBTiwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfUkVHSVNURVJfTUdNVEZSLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9ERVJFR0lTVEVSX01HTVRGUiwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfUkVNQUlOX09OQ0hBTiwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VORF9BQ1RJT04sCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0NBTkNFTF9SRU1BSU5fT05DSEFOLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9DT05GSUdfUlhQRklMLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9DT05GSUdfU1VTUEVORElORCwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ09ORklHX1JFU1VNRVJFUSwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRVhUV09XX1NVUFBPUlQKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ09ORklHX0VYVFdPVywKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ09ORklHX0FQUF9UWVBFMSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ09ORklHX0FQUF9UWVBFMiwKKyNlbmRpZgorCVRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfTUFYVFhQT1csCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NFVF9UWFBPVywKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX1RNTEVWRUwsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0NBUFNfRVhDSCwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfRElTQUJMRV9DQVAsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0dFVF9ERUZDQ05WLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9HRVRfQ1VSQ0MsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JFU0VUX1BXNUcsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1VQREFURV9SUDVHLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfUk9BTUlCQU5ELAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9HRVRfUk9BTUlCQU5ELAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9VUERBVEVfUlNTSURJRkYsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1VQREFURV9JTU1SU1NJRElGRiwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX0ZURU5BQkxFRCwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX1dFU01PREUsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NFVF9TQ0FOQ1RSTCwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX1AyUF9JRSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX1JPQU1fU0NBTl9OX1BST0JFUywKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX1JPQU1fU0NBTl9IT01FX0FXQVlfVElNRSwKKwlUUkFDRV9DT0RFX1NNRV9SWF9IRERfU1RPUkVfSk9JTl9SRVEsCisJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0NMRUFSX0pPSU5fUkVRLAorCVRSQUNFX0NPREVfU01FX1JYX0hERF9JU1NVRV9KT0lOX1JFUSwKK307CisKK3ZvaWQgc21lX3RyYWNlX2luaXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisjZW5kaWYgLyogX19TTUVfVFJBQ0VfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9pbmMvc21zX2RlYnVnLmggYi9jb3JlL3NtZS9pbmMvc21zX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlYmMxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL2luYy9zbXNfZGVidWcuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIFxmaWxlIGNzc0RlYnVnLmgKKyAqCisgKiBEZWZpbmUgZGVidWcgbG9nIGludGVyZmFjZSBmb3IgU01TLgorICovCisKKyNpZm5kZWYgU01TX0RFQlVHX0hfXworI2RlZmluZSBTTVNfREVCVUdfSF9fCisKKyNpbmNsdWRlICJ1dGlsc19hcGkuaCIKKyNpbmNsdWRlICJzaXJfZGVidWcuaCIKKworI2lmICFkZWZpbmVkKF9fcHJpbnRmKQorI2RlZmluZSBfX3ByaW50ZihhLCBiKQorI2VuZGlmCisKK3ZvaWQgX19wcmludGYoMywgNCkKKwlzbXNfbG9nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IGxvZ2xldmVsLAorCQkJY29uc3QgY2hhciAqcFN0cmluZywgLi4uKTsKKworI2VuZGlmIC8qIF9fU01TX0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zbWUvaW5jL3dsYW5fcHNfd293X2RpYWcuaCBiL2NvcmUvc21lL2luYy93bGFuX3BzX3dvd19kaWFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxY2JjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL2luYy93bGFuX3BzX3dvd19kaWFnLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1dMQU5fUFNfV09XX0RJQUdfSF8KKyNkZWZpbmUgX1dMQU5fUFNfV09XX0RJQUdfSF8KKworI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2V2ZW50LmgiCisjaW5jbHVkZSAiaG9zdF9kaWFnX2NvcmVfbG9nLmgiCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisKK3R5cGVkZWYgZW51bSB7CisJV0xBTl9CTVBTX0VOVEVSX1JFUSA9IDAsCisJV0xBTl9VQVBTRF9TVEFSVF9SRVEgPSAxLAorCVdMQU5fVUFQU0RfU1RPUF9SRVEgPSAyLAorCVdMQU5fRU5URVJfU1RBTkRCWV9SRVEgPSAzLAorCVdMQU5fRU5URVJfREVFUF9TTEVFUF9SRVEgPSA0LAorCVdMQU5fU1RBUlRfQk1QU19BVVRPX1RJTUVSX1JFUSA9IDUsCisJV0xBTl9TVE9QX0JNUFNfQVVUT19USU1FUl9SRVEgPSA2LAorCVdMQU5fRU5URVJfRlVMTF9QT1dFUl9SRVEgPSA3LAorCVdMQU5fUE1DX0NVUlJFTlRfU1RBVEUgPSA4LAorCVdMQU5fUFNfTU9ERV9FTkFCTEVfUkVRID0gOSwKKwlXTEFOX1BTX01PREVfRElTQUJMRV9SRVEgPSAxMCwKKwlXTEFOX1dJTk1PQl9EX1BPV0VSX1NUQVRFID0gMTEsCisJV0xBTl9CTVBTX0RUSU1fUEVSSU9EID0gMTIsCisJV0xBTl9CTVBTX0ZJTkFMX0xJID0gMTMsCisJV0xBTl9CTVBTX1NFVF9DT05GSUcgPSAxNCwKKworfSB3bGFuX3BzX2V2dF9zdWJ0eXBlX3Q7CisKKy8qIG1hcHMgZGlyZWN0bHkgdG8gZVJlcXVlc3RGdWxsUG93ZXJSZWFzb24gKi8KK3R5cGVkZWYgZW51bSB7CisJLyogUEUgcmVjZWl2ZWQgYSBNQVhfTUlTU0VEX0JFQUNPTl9JTkQgKi8KKwlXTEFOX01JU1NFRF9CRUFDT05fSU5EX1JDVkQsCisJLyogUEUgcmVjZWl2ZWQgYSBTSVJfSEFMX0JNUFNfU1RBVFVTX0lORCAqLworCVdMQU5fQk1QU19TVEFUVVNfSU5EX1JDVkQsCisJLyogQk1QUyBtb2RlIHdhcyBkaXNhYmxlZCBieSBIREQgaW4gU01FICovCisJV0xBTl9CTVBTX01PREVfRElTQUJMRUQsCisJLyogTGluayBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgcmVxdWVzdGVkIGJ5IEhERCAqLworCVdMQU5fTElOS19ESVNDT05ORUNURURfQllfSERELAorCS8qIERpc2Nvbm5lY3QgZHVlIHRvIGxpbmtsb3N0IG9yIHJlcXVlc3RlZCBieSBwZWVyICovCisJV0xBTl9MSU5LX0RJU0NPTk5FQ1RFRF9CWV9PVEhFUiwKKwkvKiBIREQgcmVxdWVzdCBmdWxsIHBvd2VyIGZvciBzb21lIHJlYXNvbiAqLworCVdMQU5fRlVMTF9QV1JfTkVFREVEX0JZX0hERCwKKwkvKiBCQVAgcmVxdWVzdCBmdWxsIHBvd2VyIGZvciBCVF9BTVAgKi8KKwlXTEFOX0ZVTExfUFdSX05FRURFRF9CWV9CQVAsCisJLyogQ1NSIHJlcXVlc3RzIGZ1bGwgcG93ZXIgKi8KKwlXTEFOX0ZVTExfUFdSX05FRURFRF9CWV9DU1IsCisJLyogUU9TIHJlcXVlc3RzIGZ1bGwgcG93ZXIgKi8KKwlXTEFOX0ZVTExfUFdSX05FRURFRF9CWV9RT1MsCisJLyogTm8gc3BlY2lmaWMgcmVhc29uLiBHZW5lcmFsIHJlYXNvbiBjb2RlICovCisJV0xBTl9SRUFTT05fT1RIRVIKK30gd2xhbl9wc19mdWxsX3Bvd2VyX3JlcXVlc3RfcmVhc29uX3Q7CisKKy8qIG1hcHMgZGlyZWN0bHkgdG8gZVBtY1N0YXRlICovCit0eXBlZGVmIGVudW0geworCVdMQU5fUE1DX1NUT1BQRUQsICAgICAgIC8qIFBNQyBpcyBzdG9wcGVkICovCisJV0xBTl9QTUNfRlVMTF9QT1dFUiwgICAgLyogZnVsbCBwb3dlciAqLworCVdMQU5fUE1DX0xPV19QT1dFUiwgICAgIC8qIGxvdyBwb3dlciAqLworCVdMQU5fUE1DX1JFUVVFU1RfQk1QUywgIC8qIHJlcXVlc3RpbmcgQk1QUyAqLworCVdMQU5fUE1DX0JNUFMsICAgICAgICAgIC8qIGluIEJNUFMgKi8KKwlXTEFOX1BNQ19SRVFVRVNUX0ZVTExfUE9XRVIsICAgIC8qIHJlcXVlc3RpbmcgZnVsbCBwb3dlciAqLworCVdMQU5fUE1DX1JFUVVFU1RfU1RBUlRfVUFQU0QsICAgLyogcmVxdWVzdGluZyBTdGFydCBVQVBTRCAqLworCVdMQU5fUE1DX1JFUVVFU1RfU1RPUF9VQVBTRCwgICAgLyogcmVxdWVzdGluZyBTdG9wIFVBUFNEICovCisJV0xBTl9QTUNfVUFQU0QsICAgICAgICAgICAgICAgICAvKiBpbiBVQVBTRCAqLworCVdMQU5fUE1DX1JFUVVFU1RfU1RBTkRCWSwgICAgICAgLyogcmVxdWVzdGluZyBzdGFuZGJ5IG1vZGUgKi8KKwlXTEFOX1BNQ19TVEFOREJZLCAgICAgICAgICAgICAgIC8qIGluIHN0YW5kYnkgbW9kZSAqLworCVdMQU5fUE1DX1JFUVVFU1RfRU5URVJfV09XTCwgICAgLyogcmVxdWVzdGluZyBlbnRlciBXT1dMICovCisJV0xBTl9QTUNfUkVRVUVTVF9FWElUX1dPV0wsICAgICAvKiByZXF1ZXN0aW5nIGV4aXQgV09XTCAqLworCVdMQU5fUE1DX1dPV0wgICAgICAgICAgICAgICAgICAgLyogQ2hpcCBpbiBXT1dMIG1vZGUgKi8KK30gd2xhbl9wc19wbWNfY3VycmVudF9zdGF0ZV90OworCisvKiBtYXBzIGRpcmVjdGx5IHRvIGVQbWNQb3dlclNhdmluZ01vZGUgKi8KK3R5cGVkZWYgZW51bSB7CisJV0xBTl9JRExFX01PREVfUE9XRVJfU0FWRSwgICAgICAvKiBJZGxlIE1vZGUgUG93ZXIgU2F2ZSAoSU1QUykgKi8KKwlXTEFOX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkUsICAgIC8qIEJlYWNvbiBNb2RlIFBvd2VyIFNhdmUgKEJNUFMpICovCisJV0xBTl9TUEFUSUFMX01VTFRJUExFWF9QT1dFUl9TQVZFLCAvKiBTcGF0aWFsIE11bHRpcGxleGluZyBQb3dlciBTYXZlICovCisJV0xBTl9VQVBTRF9NT0RFX1BPV0VSX1NBVkUsICAgICAvKiBVbnNjaGVkdWxlZCBBdXRvIFBTIERlbGl2ZXJ5IE1vZGUgKi8KKwlXTEFOX1NUQU5EQllfTU9ERV9QT1dFUl9TQVZFLCAgIC8qIFN0YW5kYnkgUG93ZXIgU2F2ZSBNb2RlICovCisJV0xBTl9XT1dMX01PREVfUE9XRVJfU0FWRSAgICAgICAvKiBXYWtlLW9uLVdpcmVsZXNzIFBvd2VyIFNhdmUgTW9kZSAqLworfSB3bGFuX3BzX2VuYWJsZV9kaXNhYmxlX3BzX21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlXTEFOX0QwLAorCVdMQU5fRDEsCisJV0xBTl9EMiwKKwlXTEFOX0QzLAorCVdMQU5fRDQKK30gd2xhbl9wc193aW5tb2JfZF9wb3dlcl9zdGF0ZV90OworCit0eXBlZGVmIGVudW0geworCVdMQU5fV09XX0VOVEVSX1JFUSA9IDAsCisJV0xBTl9XT1dfRVhJVF9SRVEgPSAxLAorCVdMQU5fV09XX0RFTF9QVFJOX1JFUSA9IDIsCisJV0xBTl9XT1dfV0FLRVVQID0gMworfSB3bGFuX3BzX3dvd19ldnRfc3VidHlwZV90OworCit0eXBlZGVmIGVudW0geworCVdMQU5fV09XX1RZUEVfTk9ORSwKKwlXTEFOX1dPV19UWVBFX01BR0lDX1BLVF9PTkxZLAorCVdMQU5fV09XX1RZUEVfUFRSTl9CWVRFX01BVENIX09OTFksCisJV0xBTl9XT1dfVFlQRV9NQUdJQ19QS1RfUFRSTl9CWVRFX01BVENILAorfSB3bGFuX3BzX3dvd190eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJV0xBTl9XT1dfTUFHSUNfUEtUX01BVENILAorCVdMQU5fV09XX1BUUk5fQllURV9NQVRDSAorfSB3bGFuX3BzX3dvc193YWtldXBfY2F1c2VfdDsKKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIF9XTEFOX1BTX1dPV19ESUFHX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9zcmMvY29tbW9uL3NtZV9hcGkuYyBiL2NvcmUvc21lL3NyYy9jb21tb24vc21lX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTFmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9zcmMvY29tbW9uL3NtZV9hcGkuYwpAQCAtMCwwICsxLDE0NjEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICBzbWVBcGkuYworCisgICBcYnJpZWYgRGVmaW5pdGlvbnMgZm9yIFNNRSBBUElzCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJzbXNfZGVidWcuaCIKKyNpbmNsdWRlICJzbWVfYXBpLmgiCisjaW5jbHVkZSAiY3NyX2luc2lkZV9hcGkuaCIKKyNpbmNsdWRlICJzbWVfaW5zaWRlLmgiCisjaW5jbHVkZSAiY3NyX2ludGVybmFsLmgiCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAid21hX2lmLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAic21lX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RzX3V0aWxzLmgiCisjaW5jbHVkZSAic2FwX2FwaS5oIgorI2luY2x1ZGUgIm1hY190cmFjZS5oIgorI2lmZGVmIFdMQU5fRkVBVFVSRV9OQU4KKyNpbmNsdWRlICJuYW5fYXBpLmgiCisjZW5kaWYKKyNpbmNsdWRlICJjZHNfcmVnZG9tYWluX2NvbW1vbi5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJzbWVfcG93ZXJfc2F2ZV9hcGkuaCIKKyNpbmNsdWRlICJ3bWEuaCIKKworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgdV9tYWNfcG9zdF9jdHJsX21zZyh2b2lkICpwU2lyR2xvYmFsLCB0U2lyTWJNc2cgKnBNYik7CisKKyNkZWZpbmUgTE9HX1NJWkUgMjU2CisjZGVmaW5lIFJFQURfTUVNT1JZX0RVTVBfQ01EICAgICA5CisjZGVmaW5lIFRMX0lOSVRfU1RBVEUgICAgICAgICAgICAwCisKK3N0YXRpYyB0U2VsZlJlY292ZXJ5U3RhdHMgZ19zZWxmX3JlY292ZXJ5X3N0YXRzOworLyogVHhNQiBGdW5jdGlvbnMgKi8KK2V4dGVybiBDREZfU1RBVFVTIHBtY19wcmVwYXJlX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgIGVTbWVDb21tYW5kVHlwZSBjbWRUeXBlLCB2b2lkICpwdlBhcmFtLAorCQkJCSAgICAgIHVpbnQzMl90IHNpemUsIHRTbWVDbWQgKipwcENtZCk7CitleHRlcm4gdm9pZCBwbWNfcmVsZWFzZV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKTsKK2V4dGVybiB2b2lkIHFvc19yZWxlYXNlX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOworZXh0ZXJuIENERl9TVEFUVVMgcDJwX3Byb2Nlc3NfcmVtYWluX29uX2NoYW5uZWxfY21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgdFNtZUNtZCAqcDJwUmVtYWlub25DaG4pOworZXh0ZXJuIENERl9TVEFUVVMgc21lX3JlbWFpbl9vbl9jaG5fcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBNc2cpOworZXh0ZXJuIENERl9TVEFUVVMgc21lX21nbXRfZnJtX2luZCh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgdHBTaXJTbWVNZ210RnJhbWVJbmQgcFNtZU1nbXRGcm0pOworZXh0ZXJuIENERl9TVEFUVVMgc21lX3JlbWFpbl9vbl9jaG5fcmVhZHkodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90ICpwTXNnKTsKK2V4dGVybiBDREZfU1RBVFVTIHNtZV9zZW5kX2FjdGlvbl9jbmYodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90ICpwTXNnKTsKKworc3RhdGljIENERl9TVEFUVVMgaW5pdF9zbWVfY21kX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitzdGF0aWMgdm9pZCBzbWVfYWJvcnRfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwKKwkJCSAgICAgIGJvb2wgZlN0b3BwaW5nKTsKKworZUNzclBoeU1vZGUgc21lX2dldF9waHlfbW9kZSh0SGFsSGFuZGxlIGhIYWwpOworCitDREZfU1RBVFVTIHNtZV9oYW5kbGVfY2hhbmdlX2NvdW50cnlfY29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKTsKKwordm9pZCBzbWVfZGlzY29ubmVjdF9jb25uZWN0ZWRfc2Vzc2lvbnModHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKK0NERl9TVEFUVVMgc21lX2hhbmRsZV9nZW5lcmljX2NoYW5nZV9jb3VudHJ5X2NvZGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgdm9pZCAqcE1zZ0J1Zik7CisKK0NERl9TVEFUVVMgc21lX3Byb2Nlc3NfbnNzX3VwZGF0ZV9yZXNwKHRwQW5pU2lyR2xvYmFsIG1hYywgdWludDhfdCAqbXNnKTsKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKK2Jvb2wgY3NyX2lzX3N1cHBvcnRlZF9jaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgY2hhbm5lbElkKTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworQ0RGX1NUQVRVUyBzbWVfdW5wcm90ZWN0ZWRfbWdtdF9mcm1faW5kKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJdHBTaXJTbWVVbnByb3RNZ210RnJhbWVJbmQgcFNtZU1nbXRGcm0pOworI2VuZGlmCisKKy8qIE1lc3NhZ2UgcHJvY2Vzc29yIGZvciBldmVudHMgZnJvbSBERlMgKi8KK0NERl9TVEFUVVMgZGZzX21zZ19wcm9jZXNzb3IodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgdWludDE2X3QgbXNnX3R5cGUsIHZvaWQgKnBNc2dCdWYpOworCisvKiBDaGFubmVsIENoYW5nZSBSZXNwb25zZSBJbmRpY2F0aW9uIEhhbmRsZXIgKi8KK0NERl9TVEFUVVMgc21lX3Byb2Nlc3NfY2hhbm5lbF9jaGFuZ2VfcmVzcCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICB1aW50MTZfdCBtc2dfdHlwZSwgdm9pZCAqcE1zZ0J1Zik7CisKKy8qIEludGVybmFsIFNNRSBBUElzICovCitDREZfU1RBVFVTIHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKHRTbWVTdHJ1Y3QgKnBzU21lKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCisJaWYgKHBzU21lKSB7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJCSAgICAoY2RmX211dGV4X2FjcXVpcmUoJnBzU21lLT5sa1NtZUdsb2JhbExvY2spKSkgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBzbWVfcmVsZWFzZV9nbG9iYWxfbG9jayh0U21lU3RydWN0ICpwc1NtZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKworCWlmIChwc1NtZSkgeworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCQkgICAgKGNkZl9tdXRleF9yZWxlYXNlKCZwc1NtZS0+bGtTbWVHbG9iYWxMb2NrKSkpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX3Byb2Nlc3Nfc2V0X2h3X21vZGVfcmVzcCgpIC0gUHJvY2VzcyBzZXQgSFcgbW9kZSByZXNwb25zZQorICogQG1hYzogR2xvYmFsIE1BQyBwb2ludGVyCisgKiBAbXNnOiBIVyBtb2RlIHJlc3BvbnNlCisgKgorICogUHJvY2Vzc2VzIHRoZSBIVyBtb2RlIHJlc3BvbnNlIGFuZCBpbnZva2VzIHRoZSBIREQgY2FsbGJhY2sKKyAqIHRvIHByb2Nlc3MgZnVydGhlcgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBzbWVfcHJvY2Vzc19zZXRfaHdfbW9kZV9yZXNwKHRwQW5pU2lyR2xvYmFsIG1hYywgdWludDhfdCAqbXNnKQoreworCXRMaXN0RWxlbSAqZW50cnkgPSBOVUxMOworCXRTbWVDbWQgKmNvbW1hbmQgPSBOVUxMOworCWJvb2wgZm91bmQ7CisJaHdfbW9kZV9jYiBjYWxsYmFjayA9IE5VTEw7CisJc3RydWN0IHNpcl9zZXRfaHdfbW9kZV9yZXNwICpwYXJhbTsKKworCXBhcmFtID0gKHN0cnVjdCBzaXJfc2V0X2h3X21vZGVfcmVzcCAqKW1zZzsKKwlpZiAoIXBhcmFtKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiSFcgbW9kZSByZXNwIHBhcmFtIGlzIE5VTEwiKSk7CisJCS8qIE5vdCByZXR1cm5pbmcuIE5lZWQgdG8gY2hlY2sgaWYgYWN0aXZlIGNvbW1hbmQgbGlzdAorCQkgKiBuZWVkcyB0byBiZSBmcmVlZAorCQkgKi8KKwl9CisKKwllbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJm1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQlMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKCFlbnRyeSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIk5vIGNtZCBmb3VuZCBpbiBhY3RpdmUgbGlzdCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNvbW1hbmQgPSBHRVRfQkFTRV9BRERSKGVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwlpZiAoIWNvbW1hbmQpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJCYXNlIGFkZHJlc3MgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChlX3NtZV9jb21tYW5kX3NldF9od19tb2RlICE9IGNvbW1hbmQtPmNvbW1hbmQpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJDb21tYW5kIG1pc21hdGNoISIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNhbGxiYWNrID0gY29tbWFuZC0+dS5zZXRfaHdfbW9kZV9jbWQuc2V0X2h3X21vZGVfY2I7CisJaWYgKGNhbGxiYWNrKSB7CisJCWlmICghcGFyYW0pIHsKKwkJCXNtc19sb2cobWFjLCBMT0dFLAorCQkJICAgIEZMKCJDYWxsYmFjayBmYWlsZWQgc2luY2UgSFcgbW9kZSBwYXJhbXMgaXMgTlVMTCIpKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cobWFjLCBMT0dFLAorCQkJICAgICAgRkwoIkNhbGxpbmcgSEREIGNhbGxiYWNrIGZvciBIVyBtb2RlIHJlc3BvbnNlIikpOworCQkJY2FsbGJhY2socGFyYW0tPnN0YXR1cywKKwkJCQkgcGFyYW0tPmNmZ2RfaHdfbW9kZV9pbmRleCwKKwkJCQkgcGFyYW0tPm51bV92ZGV2X21hY19lbnRyaWVzLAorCQkJCSBwYXJhbS0+dmRldl9tYWNfbWFwKTsKKwkJfQorCX0gZWxzZSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiQ2FsbGJhY2sgZG9lcyBub3QgZXhpc3QiKSk7CisJfQorCisJZm91bmQgPSBjc3JfbGxfcmVtb3ZlX2VudHJ5KCZtYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBlbnRyeSwKKwkJCUxMX0FDQ0VTU19MT0NLKTsKKwlpZiAoZm91bmQpIHsKKwkJLyogTm93IHB1dCB0aGlzIGNvbW1hbmQgYmFjayBvbiB0aGUgYXZpbGFibGUgY29tbWFuZCBsaXN0ICovCisJCXNtZV9yZWxlYXNlX2NvbW1hbmQobWFjLCBjb21tYW5kKTsKKwl9CisJc21lX3Byb2Nlc3NfcGVuZGluZ19xdWV1ZShtYWMpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3Byb2Nlc3NfaHdfbW9kZV90cmFuc19pbmQoKSAtIFByb2Nlc3MgSFcgbW9kZSB0cmFuc2l0aW9uIGluZGljYXRpb24KKyAqIEBtYWM6IEdsb2JhbCBNQUMgcG9pbnRlcgorICogQG1zZzogSFcgbW9kZSB0cmFuc2l0aW9uIHJlc3BvbnNlCisgKgorICogUHJvY2Vzc2VzIHRoZSBIVyBtb2RlIHRyYW5zaXRpb24gaW5kaWNhdGlvbiBhbmQgaW52b2tlIHRoZSBIREQgY2FsbGJhY2sKKyAqIHRvIHByb2Nlc3MgZnVydGhlcgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBzbWVfcHJvY2Vzc19od19tb2RlX3RyYW5zX2luZCh0cEFuaVNpckdsb2JhbCBtYWMsCisJCQkJCQl1aW50OF90ICptc2cpCit7CisJaHdfbW9kZV90cmFuc2l0aW9uX2NiIGNhbGxiYWNrID0gTlVMTDsKKwlzdHJ1Y3Qgc2lyX2h3X21vZGVfdHJhbnNfaW5kICpwYXJhbTsKKworCXBhcmFtID0gKHN0cnVjdCBzaXJfaHdfbW9kZV90cmFuc19pbmQgKiltc2c7CisJaWYgKCFwYXJhbSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIkhXIG1vZGUgdHJhbnMgaW5kIHBhcmFtIGlzIE5VTEwiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljYWxsYmFjayA9IG1hYy0+c21lLnNtZV9od19tb2RlX3RyYW5zX2NiOworCWlmIChjYWxsYmFjaykgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIkNhbGxpbmcgcmVnaXN0ZXJlZCBjYWxsYmFjay4uLiIpKTsKKwkJY2FsbGJhY2socGFyYW0tPm9sZF9od19tb2RlX2luZGV4LAorCQkJcGFyYW0tPm5ld19od19tb2RlX2luZGV4LAorCQkJcGFyYW0tPm51bV92ZGV2X21hY19lbnRyaWVzLAorCQkJcGFyYW0tPnZkZXZfbWFjX21hcCk7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIENERl9TVEFUVVMgaW5pdF9zbWVfY21kX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0U21lQ21kICpwQ21kOworCXVpbnQzMl90IGNtZF9pZHg7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCWNkZl9tY190aW1lcl90ICpjbWRUaW1lb3V0VGltZXIgPSBOVUxMOworCisJcE1hYy0+c21lLnRvdGFsU21lQ21kID0gU01FX1RPVEFMX0NPTU1BTkQ7CisKKwlzdGF0dXMgPSBjc3JfbGxfb3BlbihwTWFjLT5oSGRkLCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCWdvdG8gZW5kOworCisJc3RhdHVzID0gY3NyX2xsX29wZW4ocE1hYy0+aEhkZCwgJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJZ290byBlbmQ7CisKKwlzdGF0dXMgPSBjc3JfbGxfb3BlbihwTWFjLT5oSGRkLCAmcE1hYy0+c21lLnNtZVNjYW5DbWRBY3RpdmVMaXN0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlnb3RvIGVuZDsKKworCXN0YXR1cyA9IGNzcl9sbF9vcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5zbWUuc21lU2NhbkNtZFBlbmRpbmdMaXN0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlnb3RvIGVuZDsKKworCXN0YXR1cyA9IGNzcl9sbF9vcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5zbWUuc21lQ21kRnJlZUxpc3QpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCWdvdG8gZW5kOworCisJcENtZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U21lQ21kKSAqIHBNYWMtPnNtZS50b3RhbFNtZUNtZCk7CisJaWYgKE5VTEwgPT0gcENtZCkKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCWVsc2UgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkJY2RmX21lbV9zZXQocENtZCwgc2l6ZW9mKHRTbWVDbWQpICogcE1hYy0+c21lLnRvdGFsU21lQ21kLCAwKTsKKwkJcE1hYy0+c21lLnBTbWVDbWRCdWZBZGRyID0gcENtZDsKKworCQlmb3IgKGNtZF9pZHggPSAwOyBjbWRfaWR4IDwgcE1hYy0+c21lLnRvdGFsU21lQ21kOyBjbWRfaWR4KyspIHsKKwkJCWNzcl9sbF9pbnNlcnRfdGFpbCgmcE1hYy0+c21lLnNtZUNtZEZyZWVMaXN0LAorCQkJCQkgICAmcENtZFtjbWRfaWR4XS5MaW5rLCBMTF9BQ0NFU1NfTE9DSyk7CisJCX0KKwl9CisKKwkvKiBUaGlzIHRpbWVyIGlzIG9ubHkgdG8gZGVidWcgdGhlIGFjdGl2ZSBsaXN0IGNvbW1hbmQgdGltZW91dCAqLworCisJY21kVGltZW91dFRpbWVyID0KKwkJKGNkZl9tY190aW1lcl90ICopIGNkZl9tZW1fbWFsbG9jKHNpemVvZihjZGZfbWNfdGltZXJfdCkpOworCWlmIChjbWRUaW1lb3V0VGltZXIpIHsKKwkJcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QuY21kVGltZW91dFRpbWVyID0gY21kVGltZW91dFRpbWVyOworCQljZGZfc3RhdHVzID0KKwkJCWNkZl9tY190aW1lcl9pbml0KHBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LgorCQkJCQkgIGNtZFRpbWVvdXRUaW1lciwgQ0RGX1RJTUVSX1RZUEVfU1csCisJCQkJCSAgYWN0aXZlX2xpc3RfY21kX3RpbWVvdXRfaGFuZGxlLCAodm9pZCAqKXBNYWMpOworCisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJJbml0IFRpbWVyIGZhaWwgZm9yIGFjdGl2ZSBsaXN0IGNvbW1hbmQgcHJvY2VzcyB0aW1lIG91dCIpOworCQkJY2RmX21lbV9mcmVlKHBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LgorCQkJCSAgICAgY21kVGltZW91dFRpbWVyKTsKKwkJCXBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LmNtZFRpbWVvdXRUaW1lciA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdC5jbWRUaW1lb3V0RHVyYXRpb24gPQorCQkJCUNTUl9BQ1RJVkVfTElTVF9DTURfVElNRU9VVF9WQUxVRTsKKwkJfQorCX0KKworZW5kOgorCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCXNtc19sb2cocE1hYywgTE9HRSwgImZhaWxlZCB0byBpbml0aWFsaXplIHNtZSBjb21tYW5kIGxpc3Q6JWRcbiIsCisJCQlzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBzbWVfcmVsZWFzZV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDbWQpCit7CisJcENtZC0+Y29tbWFuZCA9IGVTbWVOb0NvbW1hbmQ7CisJY3NyX2xsX2luc2VydF90YWlsKCZwTWFjLT5zbWUuc21lQ21kRnJlZUxpc3QsICZwQ21kLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSyk7Cit9CisKK3N0YXRpYyB2b2lkIHNtZV9yZWxlYXNlX2NtZF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREYmxMaW5rTGlzdCAqcExpc3QpCit7CisJdExpc3RFbGVtICpwRW50cnk7CisJdFNtZUNtZCAqcENvbW1hbmQ7CisKKwl3aGlsZSAoKHBFbnRyeSA9IGNzcl9sbF9yZW1vdmVfaGVhZChwTGlzdCwgTExfQUNDRVNTX0xPQ0spKSAhPSBOVUxMKSB7CisJCS8qIFRPRE86IGJhc2Ugb24gY29tbWFuZCB0eXBlIHRvIGNhbGwgcmVsZWFzZSBmdW5jdGlvbnMgKi8KKwkJLyogcmVpbml0aWFsaXplIGRpZmZlcmVudCBjb21tYW5kIHR5cGVzIHNvIHRoZXkgY2FuIGJlIHJldXNlZCAqLworCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJc21lX2Fib3J0X2NvbW1hbmQocE1hYywgcENvbW1hbmQsIHRydWUpOworCX0KK30KKworc3RhdGljIHZvaWQgcHVyZ2Vfc21lX2NtZF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJLyogcmVsZWFzZSBhbnkgb3V0IHN0YW5kaW5nIGNvbW1hbmRzIGJhY2sgdG8gZnJlZSBjb21tYW5kIGxpc3QgKi8KKwlzbWVfcmVsZWFzZV9jbWRfbGlzdChwTWFjLCAmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0KTsKKwlzbWVfcmVsZWFzZV9jbWRfbGlzdChwTWFjLCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QpOworCXNtZV9yZWxlYXNlX2NtZF9saXN0KHBNYWMsICZwTWFjLT5zbWUuc21lU2NhbkNtZFBlbmRpbmdMaXN0KTsKKwlzbWVfcmVsZWFzZV9jbWRfbGlzdChwTWFjLCAmcE1hYy0+c21lLnNtZVNjYW5DbWRBY3RpdmVMaXN0KTsKK30KKwordm9pZCBwdXJnZV9zbWVfc2Vzc2lvbl9jbWRfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJdERibExpbmtMaXN0ICpwTGlzdCkKK3sKKwkvKiByZWxlYXNlIGFueSBvdXQgc3RhbmRpbmcgY29tbWFuZHMgYmFjayB0byBmcmVlIGNvbW1hbmQgbGlzdCAqLworCXRMaXN0RWxlbSAqcEVudHJ5LCAqcE5leHQ7CisJdFNtZUNtZCAqcENvbW1hbmQ7CisJdERibExpbmtMaXN0IGxvY2FsTGlzdDsKKworCWNkZl9tZW1femVybygmbG9jYWxMaXN0LCBzaXplb2YodERibExpbmtMaXN0KSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY3NyX2xsX29wZW4ocE1hYy0+aEhkZCwgJmxvY2FsTGlzdCkpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiBmYWlsZWQgdG8gb3BlbiBsaXN0IikpOworCQlyZXR1cm47CisJfQorCisJY3NyX2xsX2xvY2socExpc3QpOworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQocExpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCXdoaWxlIChwRW50cnkgIT0gTlVMTCkgeworCQlwTmV4dCA9IGNzcl9sbF9uZXh0KHBMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spOworCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJaWYgKHBDb21tYW5kLT5zZXNzaW9uSWQgPT0gc2Vzc2lvbklkKSB7CisJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeShwTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKSkgeworCQkJCWNzcl9sbF9pbnNlcnRfdGFpbCgmbG9jYWxMaXN0LCBwRW50cnksCisJCQkJCQkgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCX0KKwkJfQorCQlwRW50cnkgPSBwTmV4dDsKKwl9CisJY3NyX2xsX3VubG9jayhwTGlzdCk7CisKKwl3aGlsZSAoKHBFbnRyeSA9IGNzcl9sbF9yZW1vdmVfaGVhZCgmbG9jYWxMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKSkpIHsKKwkJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisJCXNtZV9hYm9ydF9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCB0cnVlKTsKKwl9CisJY3NyX2xsX2Nsb3NlKCZsb2NhbExpc3QpOworfQorCitzdGF0aWMgQ0RGX1NUQVRVUyBmcmVlX3NtZV9jbWRfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJcHVyZ2Vfc21lX2NtZF9saXN0KHBNYWMpOworCWNzcl9sbF9jbG9zZSgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0KTsKKwljc3JfbGxfY2xvc2UoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwljc3JfbGxfY2xvc2UoJnBNYWMtPnNtZS5zbWVTY2FuQ21kUGVuZGluZ0xpc3QpOworCWNzcl9sbF9jbG9zZSgmcE1hYy0+c21lLnNtZVNjYW5DbWRBY3RpdmVMaXN0KTsKKwljc3JfbGxfY2xvc2UoJnBNYWMtPnNtZS5zbWVDbWRGcmVlTGlzdCk7CisKKwkvKmRlc3Ryb3kgYWN0aXZlIGxpc3QgY29tbWFuZCB0aW1lIG91dCB0aW1lciAqLworCWNkZl9tY190aW1lcl9kZXN0cm95KHBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LmNtZFRpbWVvdXRUaW1lcik7CisJY2RmX21lbV9mcmVlKHBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LmNtZFRpbWVvdXRUaW1lcik7CisJcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QuY21kVGltZW91dFRpbWVyID0gTlVMTDsKKworCXN0YXR1cyA9IGNkZl9tdXRleF9hY3F1aXJlKCZwTWFjLT5zbWUubGtTbWVHbG9iYWxMb2NrKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGxvY2sgc3RhdHVzID0gJWQiKSwgc3RhdHVzKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChOVUxMICE9IHBNYWMtPnNtZS5wU21lQ21kQnVmQWRkcikgeworCQljZGZfbWVtX2ZyZWUocE1hYy0+c21lLnBTbWVDbWRCdWZBZGRyKTsKKwkJcE1hYy0+c21lLnBTbWVDbWRCdWZBZGRyID0gTlVMTDsKKwl9CisKKwlzdGF0dXMgPSBjZGZfbXV0ZXhfcmVsZWFzZSgmcE1hYy0+c21lLmxrU21lR2xvYmFsTG9jayk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byByZWxlYXNlIHRoZSBsb2NrIHN0YXR1cyA9ICVkIiksIHN0YXR1cyk7CisJfQorZG9uZToKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGR1bXBfY3NyX2NvbW1hbmRfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ21kKQoreworCXN3aXRjaCAocENtZC0+Y29tbWFuZCkgeworCWNhc2UgZVNtZUNvbW1hbmRTY2FuOgorCQlzbXNfbG9nKHBNYWMsIExPR0UsICIgc2NhbiBjb21tYW5kIHJlYXNvbiBpcyAlZCIsCisJCQlwQ21kLT51LnNjYW5DbWQucmVhc29uKTsKKwkJYnJlYWs7CisKKwljYXNlIGVTbWVDb21tYW5kUm9hbToKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiIHJvYW0gY29tbWFuZCByZWFzb24gaXMgJWQiLAorCQkJcENtZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pOworCQlicmVhazsKKworCWNhc2UgZVNtZUNvbW1hbmRXbVN0YXR1c0NoYW5nZToKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiIFdNU3RhdHVzQ2hhbmdlIGNvbW1hbmQgdHlwZSBpcyAlZCIsCisJCQlwQ21kLT51LndtU3RhdHVzQ2hhbmdlQ21kLlR5cGUpOworCQlicmVhazsKKworCWNhc2UgZVNtZUNvbW1hbmRTZXRLZXk6CisJCXNtc19sb2cocE1hYywgTE9HRSwgIiBzZXRLZXkgY29tbWFuZCBhdXRoKCVkKSBlbmMoJWQpIiwKKwkJCXBDbWQtPnUuc2V0S2V5Q21kLmF1dGhUeXBlLCBwQ21kLT51LnNldEtleUNtZC5lbmNUeXBlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzbXNfbG9nKHBNYWMsIExPR0UsICIgZGVmYXVsdDogVW5oYW5kbGVkIGNvbW1hbmQgJWQiLAorCQkJcENtZC0+Y29tbWFuZCk7CisJCWJyZWFrOworCX0KK30KKwordFNtZUNtZCAqc21lX2dldF9jb21tYW5kX2J1ZmZlcih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRTbWVDbWQgKnBSZXRDbWQgPSBOVUxMLCAqcFRlbXBDbWQgPSBOVUxMOworCXRMaXN0RWxlbSAqcEVudHJ5OworCXN0YXRpYyBpbnQgc21lX2NvbW1hbmRfcXVldWVfZnVsbDsKKworCXBFbnRyeSA9IGNzcl9sbF9yZW1vdmVfaGVhZCgmcE1hYy0+c21lLnNtZUNtZEZyZWVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisKKwkvKiBJZiB3ZSBjYW4gZ2V0IGFub3RoZXIgTVMgTXNnIGJ1ZmZlciwgdGhlbiB3ZSBhcmUgb2suICBKdXN0IGxpbmsgKi8KKwkvKiB0aGUgZW50cnkgb250byB0aGUgbGlua2VkIGxpc3QuICAoV2UgYXJlIHVzaW5nIHRoZSBsaW5rZWQgbGlzdCAqLworCS8qIHRvIGtlZXAgdHJhY2sgb2YgdGZoZSBtZXNzYWdlIGJ1ZmZlcnMpLiAqLworCWlmIChwRW50cnkpIHsKKwkJcFJldENtZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJLyogcmVzZXQgd2hlbiBmcmVlIGxpc3QgaXMgYXZhaWxhYmxlICovCisJCXNtZV9jb21tYW5kX3F1ZXVlX2Z1bGwgPSAwOworCX0gZWxzZSB7CisJCWludCBpZHggPSAxOworCisJCS8qIENhbm5vdCBjaGFuZ2UgcFJldENtZCBoZXJlIHNpbmNlIGl0IG5lZWRzIHRvIHJldHVybiBsYXRlci4gKi8KKwkJcEVudHJ5ID0KKwkJCWNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisJCWlmIChwRW50cnkpIHsKKwkJCXBUZW1wQ21kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCQl9CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJPdXQgb2YgY29tbWFuZCBidWZmZXIuLi4uIGNvbW1hbmQgKDB4JVgpIHN0dWNrIiwKKwkJCShwVGVtcENtZCkgPyBwVGVtcENtZC0+Y29tbWFuZCA6IGVTbWVOb0NvbW1hbmQpOworCQlpZiAocFRlbXBDbWQpIHsKKwkJCWlmIChlU21lQ3NyQ29tbWFuZE1hc2sgJiBwVGVtcENtZC0+Y29tbWFuZCkgeworCQkJCS8qIENTUiBjb21tYW5kIGlzIHN0dWNrLiBTZWUgd2hhdCB0aGUgcmVhc29uIGNvZGUgaXMgZm9yIHRoYXQgY29tbWFuZCAqLworCQkJCWR1bXBfY3NyX2NvbW1hbmRfaW5mbyhwTWFjLCBwVGVtcENtZCk7CisJCQl9CisJCX0gLyogaWYocFRlbXBDbWQpICovCisKKwkJLyogZHVtcCB3aGF0IGlzIGluIHRoZSBwZW5kaW5nIHF1ZXVlICovCisJCWNzcl9sbF9sb2NrKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QpOworCQlwRW50cnkgPQorCQkJY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LAorCQkJCQkgTExfQUNDRVNTX05PTE9DSyk7CisJCXdoaWxlIChwRW50cnkgJiYgIXNtZV9jb21tYW5kX3F1ZXVlX2Z1bGwpIHsKKwkJCXBUZW1wQ21kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCQkJLyogUHJpbnQgb25seSAxc3QgZml2ZSBjb21tYW5kcyBmcm9tIHBlbmRpbmcgcXVldWUuICovCisJCQlpZiAoaWR4IDw9IDUpCisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkiT3V0IG9mIGNvbW1hbmQgYnVmZmVyLi4uLiBTTUUgcGVuZGluZyBjb21tYW5kICMlZCAoMHglWCkiLAorCQkJCQlpZHgsIHBUZW1wQ21kLT5jb21tYW5kKTsKKwkJCWlkeCsrOworCQkJaWYgKGVTbWVDc3JDb21tYW5kTWFzayAmIHBUZW1wQ21kLT5jb21tYW5kKSB7CisJCQkJLyogQ1NSIGNvbW1hbmQgaXMgc3R1Y2suIFNlZSB3aGF0IHRoZSByZWFzb24gY29kZSBpcyBmb3IgdGhhdCBjb21tYW5kICovCisJCQkJZHVtcF9jc3JfY29tbWFuZF9pbmZvKHBNYWMsIHBUZW1wQ21kKTsKKwkJCX0KKwkJCXBFbnRyeSA9CisJCQkJY3NyX2xsX25leHQoJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwgcEVudHJ5LAorCQkJCQkgICAgTExfQUNDRVNTX05PTE9DSyk7CisJCX0KKwkJLyogSW5jcmVtZW50IHN0YXRpYyB2YXJpYWJsZSBzbyB0aGF0IGl0IHByaW50cworCQkgKiBwZW5kaW5nIGNvbW1hbmQgb25seSBvbmNlCisJCSAqLworCQlzbWVfY29tbWFuZF9xdWV1ZV9mdWxsKys7CisKKwkJY3NyX2xsX3VubG9jaygmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0KTsKKworCQkvKiBUaGVyZSBtYXkgYmUgc29tZSBtb3JlIGNvbW1hbmQgaW4gQ1NSJ3Mgb3duIHBlbmRpbmcgcXVldWUgKi8KKwkJY3NyX2xsX2xvY2soJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0KTsKKwkJcEVudHJ5ID0KKwkJCWNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0LAorCQkJCQkgTExfQUNDRVNTX05PTE9DSyk7CisJCXdoaWxlIChwRW50cnkpIHsKKwkJCXBUZW1wQ21kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCSJPdXQgb2YgY29tbWFuZCBidWZmZXIuLi4uIENTUiBwZW5kaW5nIGNvbW1hbmQgIyVkICgweCVYKSIsCisJCQkJaWR4KyssIHBUZW1wQ21kLT5jb21tYW5kKTsKKwkJCWR1bXBfY3NyX2NvbW1hbmRfaW5mbyhwTWFjLCBwVGVtcENtZCk7CisJCQlwRW50cnkgPQorCQkJCWNzcl9sbF9uZXh0KCZwTWFjLT5yb2FtLnJvYW1DbWRQZW5kaW5nTGlzdCwgcEVudHJ5LAorCQkJCQkgICAgTExfQUNDRVNTX05PTE9DSyk7CisJCX0KKwkJY3NyX2xsX3VubG9jaygmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QpOworCX0KKworCS8qIG1lbXNldCB0byB6ZXJvICovCisJaWYgKHBSZXRDbWQpIHsKKwkJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikmcFJldENtZC0+Y29tbWFuZCwKKwkJCSAgICBzaXplb2YocFJldENtZC0+Y29tbWFuZCksIDApOworCQljZGZfbWVtX3NldCgodWludDhfdCAqKSZwUmV0Q21kLT5zZXNzaW9uSWQsCisJCQkgICAgc2l6ZW9mKHBSZXRDbWQtPnNlc3Npb25JZCksIDApOworCQljZGZfbWVtX3NldCgodWludDhfdCAqKSZwUmV0Q21kLT51LCBzaXplb2YocFJldENtZC0+dSksIDApOworCX0KKworCXJldHVybiBwUmV0Q21kOworfQorCit2b2lkIHNtZV9wdXNoX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENtZCwgYm9vbCBmSGlnaFByaW9yaXR5KQoreworCWlmICghU01FX0lTX1NUQVJUKHBNYWMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIlNtZSBpbiBzdG9wIHN0YXRlIikpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm47CisJfQorCisJaWYgKGZIaWdoUHJpb3JpdHkpIHsKKwkJY3NyX2xsX2luc2VydF9oZWFkKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsICZwQ21kLT5MaW5rLAorCQkJCSAgIExMX0FDQ0VTU19MT0NLKTsKKwl9IGVsc2UgeworCQljc3JfbGxfaW5zZXJ0X3RhaWwoJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwgJnBDbWQtPkxpbmssCisJCQkJICAgTExfQUNDRVNTX0xPQ0spOworCX0KKworCS8qIHByb2Nlc3MgdGhlIGNvbW1hbmQgcXVldWUuLi4gKi8KKwlzbWVfcHJvY2Vzc19wZW5kaW5nX3F1ZXVlKHBNYWMpOworCisJcmV0dXJuOworfQorCisvKiBGb3IgY29tbWFuZHMgdGhhdCBuZWVkIHRvIGRvIGV4dHJhIGNsZWFudXAuICovCitzdGF0aWMgdm9pZCBzbWVfYWJvcnRfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwKKwkJCSAgICAgIGJvb2wgZlN0b3BwaW5nKQoreworCWlmIChlU21lUG1jQ29tbWFuZE1hc2sgJiBwQ29tbWFuZC0+Y29tbWFuZCkgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQkJIk5vIG5lZWQgdG8gcHJvY2VzcyBQTUMgY29tbWFuZHMiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZVNtZUNzckNvbW1hbmRNYXNrICYgcENvbW1hbmQtPmNvbW1hbmQpIHsKKwkJY3NyX2Fib3J0X2NvbW1hbmQocE1hYywgcENvbW1hbmQsIGZTdG9wcGluZyk7CisJCXJldHVybjsKKwl9CisJc3dpdGNoIChwQ29tbWFuZC0+Y29tbWFuZCkgeworCWNhc2UgZVNtZUNvbW1hbmRSZW1haW5PbkNoYW5uZWw6CisJCWlmIChOVUxMICE9IHBDb21tYW5kLT51LnJlbWFpbkNobENtZC5jYWxsYmFjaykgeworCQkJcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2sgPQorCQkJCXBDb21tYW5kLT51LnJlbWFpbkNobENtZC5jYWxsYmFjazsKKwkJCS8qIHByb2Nlc3MgdGhlIG1zZyAqLworCQkJaWYgKGNhbGxiYWNrKSB7CisJCQkJY2FsbGJhY2socE1hYywgcENvbW1hbmQtPnUucmVtYWluQ2hsQ21kLgorCQkJCQljYWxsYmFja0N0eCwgZUNTUl9TQ0FOX0FCT1JULAorCQkJCQlwQ29tbWFuZC0+dS5yZW1haW5DaGxDbWQuc2Nhbl9pZCk7CisJCQl9CisJCX0KKwkJc21lX3JlbGVhc2VfY29tbWFuZChwTWFjLCBwQ29tbWFuZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNtZV9yZWxlYXNlX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworCQlicmVhazsKKwl9CisKK30KKwordExpc3RFbGVtICpjc3JfZ2V0X2NtZF90b19wcm9jZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREYmxMaW5rTGlzdCAqcExpc3QsCisJCQkJICB1aW50OF90IHNlc3Npb25JZCwgYm9vbCBmSW50ZXJsb2NrZWQpCit7CisJdExpc3RFbGVtICpwQ3VyRW50cnkgPSBOVUxMOworCXRTbWVDbWQgKnBDb21tYW5kOworCisJLyogR28gdGhyb3VnaCB0aGUgbGlzdCBhbmQgcmV0dXJuIHRoZSBjb21tYW5kIHdob3NlIHNlc3Npb24gaWQgaXMgbm90CisJICogbWF0Y2hpbmcgd2l0aCB0aGUgY3VycmVudCBvbmdvaW5nIHNjYW4gY21kIHNlc3Npb25JZCAqLworCXBDdXJFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQocExpc3QsIExMX0FDQ0VTU19MT0NLKTsKKwl3aGlsZSAocEN1ckVudHJ5KSB7CisJCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwQ3VyRW50cnksIHRTbWVDbWQsIExpbmspOworCQlpZiAocENvbW1hbmQtPnNlc3Npb25JZCAhPSBzZXNzaW9uSWQpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HMSwKKwkJCQkic2VsZWN0ZWQgdGhlIGNvbW1hbmQgd2l0aCBkaWZmZXJlbnQgc2Vzc2lvbklkIik7CisJCQlyZXR1cm4gcEN1ckVudHJ5OworCQl9CisKKwkJcEN1ckVudHJ5ID0gY3NyX2xsX25leHQocExpc3QsIHBDdXJFbnRyeSwgZkludGVybG9ja2VkKTsKKwl9CisKKwlzbXNfbG9nKHBNYWMsIExPRzEsICJObyBjb21tYW5kIHBlbmRpbmcgd2l0aCBkaWZmZXJlbnQgc2Vzc2lvbklkIik7CisJcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgc21lX3Byb2Nlc3Nfc2Nhbl9xdWV1ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRTbWVDbWQgKnBDb21tYW5kOworCXRMaXN0RWxlbSAqcFNtZUVudHJ5ID0gTlVMTDsKKwl0U21lQ21kICpwU21lQ29tbWFuZCA9IE5VTEw7CisJYm9vbCBzdGF0dXMgPSB0cnVlOworCisJaWYgKCghY3NyX2xsX2lzX2xpc3RfZW1wdHkoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LAorCQkJCSAgIExMX0FDQ0VTU19MT0NLKSkpIHsKKwkJcFNtZUVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQkJCUxMX0FDQ0VTU19MT0NLKTsKKwkJaWYgKHBTbWVFbnRyeSkKKwkJCXBTbWVDb21tYW5kID0gR0VUX0JBU0VfQUREUihwU21lRW50cnksIHRTbWVDbWQsIExpbmspOworCX0KKwljc3JfbGxfbG9jaygmcE1hYy0+c21lLnNtZVNjYW5DbWRBY3RpdmVMaXN0KTsKKwlpZiAoY3NyX2xsX2lzX2xpc3RfZW1wdHkoJnBNYWMtPnNtZS5zbWVTY2FuQ21kUGVuZGluZ0xpc3QsCisJCQkJIExMX0FDQ0VTU19MT0NLKSkKKwkJZ290byBlbmQ7CisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+c21lLnNtZVNjYW5DbWRQZW5kaW5nTGlzdCwKKwkJCQkgIExMX0FDQ0VTU19MT0NLKTsKKwlpZiAoIXBFbnRyeSkKKwkJZ290byBlbmQ7CisKKwlzbXNfbG9nKHBNYWMsIExPR0UsCisJCUZMKCJzY2FuX2NvdW50IGluIGFjdGl2ZSBzY2FubGlzdCAlZCAiKSwKKwkJcE1hYy0+c21lLnNtZVNjYW5DbWRBY3RpdmVMaXN0LkNvdW50KTsKKworCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCWlmIChwU21lQ29tbWFuZCAhPSBOVUxMKSB7CisJCS8qCisJCSAqIGlmIHNjYW4gaXMgcnVubmluZyBvbiBvbmUgaW50ZXJmYWNlIGFuZCBTTUUgcmVjZWl2ZXMKKwkJICogdGhlIG5leHQgY29tbWFuZCBvbiB0aGUgc2FtZSBpbnRlcmZhY2UgdGhlbgorCQkgKiBkb250IHRoZSBhbGxvdyB0aGUgY29tbWFuZCB0byBiZSBxdWV1ZWQgdG8KKwkJICogc21lQ21kUGVuZGluZ0xpc3QuIElmIG5leHQgc2NhbiBpcyBhbGxvd2VkIG9uCisJCSAqIHRoZSBzYW1lIGludGVyZmFjZSB0aGUgQ1NSIHN0YXRlIG1hY2hpbmUgd2lsbAorCQkgKiBnZXQgc2NyZXdlZCB1cC4KKwkJICovCisJCWlmIChwU21lQ29tbWFuZC0+c2Vzc2lvbklkID09IHBDb21tYW5kLT5zZXNzaW9uSWQpIHsKKwkJCXN0YXR1cyA9IGZhbHNlOworCQkJZ290byBlbmQ7CisJCX0KKwl9CisJLyoKKwkgKiBXZSBjYW5ub3QgZXhlY3V0ZSBhbnkgY29tbWFuZCBpbiB3YWl0LWZvci1rZXkgc3RhdGUgdW50aWwgc2V0S2V5IGlzCisJICogdGhyb3VnaC4KKwkgKi8KKwlpZiAoQ1NSX0lTX1dBSVRfRk9SX0tFWShwTWFjLCBwQ29tbWFuZC0+c2Vzc2lvbklkKSkgeworCQlpZiAoIUNTUl9JU19TRVRfS0VZX0NPTU1BTkQocENvbW1hbmQpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIkNhbid0IHByb2Nlc3MgY21kKCVkKSwgd2FpdGluZyBmb3Iga2V5IiksCisJCQkJcENvbW1hbmQtPmNvbW1hbmQpOworCQkJc3RhdHVzID0gZmFsc2U7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKwlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeSgmcE1hYy0+c21lLnNtZVNjYW5DbWRQZW5kaW5nTGlzdCwgcEVudHJ5LAorCQkJCUxMX0FDQ0VTU19MT0NLKSkgeworCQljc3JfbGxfaW5zZXJ0X2hlYWQoJnBNYWMtPnNtZS5zbWVTY2FuQ21kQWN0aXZlTGlzdCwKKwkJCQkgICAmcENvbW1hbmQtPkxpbmssIExMX0FDQ0VTU19OT0xPQ0spOworCQlzd2l0Y2ggKHBDb21tYW5kLT5jb21tYW5kKSB7CisJCWNhc2UgZVNtZUNvbW1hbmRTY2FuOgorCQkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiUHJvY2Vzc2luZyBzY2FuIG9mZmxvYWQgY21kLiIpKTsKKwkJCWNkZl9tY190aW1lcl9zdGFydCgmcENvbW1hbmQtPnUuc2NhbkNtZC5jc3Jfc2Nhbl90aW1lciwKKwkJCQlDU1JfQUNUSVZFX1NDQU5fTElTVF9DTURfVElNRU9VVCk7CisJCQljc3JfcHJvY2Vzc19zY2FuX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworCQkJYnJlYWs7CisJCWNhc2UgZVNtZUNvbW1hbmRSZW1haW5PbkNoYW5uZWw6CisJCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQkJRkwoIlByb2Nlc3NpbmcgcmVtYWluIG9uIGNoYW5uZWwgb2ZmbG9hZCBjbWQiKSk7CisJCQlwMnBfcHJvY2Vzc19yZW1haW5fb25fY2hhbm5lbF9jbWQocE1hYywgcENvbW1hbmQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIldyb25nIGNtZCBlbnF1ZXVlZCB0byBTY2FuQ21kUGVuZGluZ0xpc3QiKSk7CisJCQlwRW50cnkgPSBjc3JfbGxfcmVtb3ZlX2hlYWQoCisJCQkJCSZwTWFjLT5zbWUuc21lU2NhbkNtZEFjdGl2ZUxpc3QsCisJCQkJCUxMX0FDQ0VTU19OT0xPQ0spOworCQkJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisJCQlzbWVfcmVsZWFzZV9jb21tYW5kKHBNYWMsIHBDb21tYW5kKTsKKwkJCWJyZWFrOworCQl9CisJfQorZW5kOgorCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVTY2FuQ21kQWN0aXZlTGlzdCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcHJvY2Vzc19jb21tYW5kKCkgLSBwcm9jZXNzZXMgU01FIGNvbW1uZAorICogQG1hY19jdHg6ICAgICAgIG1hYyBnbG9iYWwgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUoKSBpbiBhIHdoaWxlIGxvb3AKKyAqCisgKiBSZXR1cm46IHRydWUgaW5kaWNhdGVzIHRoYXQgY2FsbGVyIGZ1bmN0aW9uIGNhbiBwcm9jZWVkIHRvIG5leHQgY21kCisgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAqLworYm9vbCBzbWVfcHJvY2Vzc19jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJYm9vbCBmQ29udGludWUgPSBmYWxzZTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwl0U21lQ21kICpwQ29tbWFuZDsKKwl0TGlzdEVsZW0gKnBTbWVFbnRyeTsKKwl0U21lQ21kICpwU21lQ29tbWFuZDsKKworCS8qCisJICogaWYgdGhlIEFjdGl2ZUxpc3QgaXMgZW1wdHksIHRoZW4gbm90aGluZyBpcyBhY3RpdmUgc28gd2UgY2FuIHByb2Nlc3MKKwkgKiBhIHBlbmRpbmcgY29tbWFuZC4uLgorCSAqIGFsd2FzeSBsb2NrIGFjdGl2ZSBsaXN0IGJlZm9yZSBsb2NraW5nIHBlbmRpbmcgbGlzdAorCSAqLworCWNzcl9sbF9sb2NrKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCk7CisJaWYgKCFjc3JfbGxfaXNfbGlzdF9lbXB0eSgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQkJIExMX0FDQ0VTU19OT0xPQ0spKSB7CisJCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwkJZ290byBwcm9jZXNzX3NjYW5fcTsKKwl9CisKKwlpZiAoY3NyX2xsX2lzX2xpc3RfZW1wdHkoJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwKKwkJCQkgTExfQUNDRVNTX0xPQ0spKSB7CisJCS8qIE5vIGNvbW1hbmQgd2FpdGluZyAqLworCQljc3JfbGxfdW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCk7CisJCWdvdG8gcHJvY2Vzc19zY2FuX3E7CisJfQorCisJLyoKKwkgKiBJZiBzY2FuIGNvbW1hbmQgaXMgcGVuZGluZyBpbiB0aGUgc21lU2NhbkNtZEFjdGl2ZSBsaXN0IHRoZW4gcGljayB0aGUKKwkgKiBjb21tYW5kIGZyb20gc21lQ21kUGVuZGluZ0xpc3Qgd2hpY2ggaXMgbm90IG1hdGNoaW5nIHdpdGggdGhlIHNjYW4KKwkgKiBjb21tYW5kIHNlc3Npb24gaWQuIEF0IGFueSBwb2ludCBvZiB0aW1lIG9ubHkgb25lIGNvbW1hbmQgd2lsbCBiZQorCSAqIGFsbG93ZWQgb24gYSBzaW5nbGUgc2Vzc2lvbi4KKwkgKi8KKwlpZiAoIWNzcl9sbF9pc19saXN0X2VtcHR5KAorCQkJJnBNYWMtPnNtZS5zbWVTY2FuQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0spKSB7CisJCXBTbWVFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNtZS5zbWVTY2FuQ21kQWN0aXZlTGlzdCwKKwkJCQkJICAgICBMTF9BQ0NFU1NfTE9DSyk7CisJCWlmIChwU21lRW50cnkpIHsKKwkJCXBTbWVDb21tYW5kID0gR0VUX0JBU0VfQUREUihwU21lRW50cnksIHRTbWVDbWQsIExpbmspOworCQkJcEVudHJ5ID0gY3NyX2dldF9jbWRfdG9fcHJvY2VzcyhwTWFjLAorCQkJCQkmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LAorCQkJCQlwU21lQ29tbWFuZC0+c2Vzc2lvbklkLAorCQkJCQlMTF9BQ0NFU1NfTE9DSyk7CisJCQlnb3RvIHNtZV9wcm9jZXNzX2NtZDsKKwkJfQorCX0KKworCS8qIFBlZWsgdGhlIGNvbW1hbmQgKi8KKwlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsIExMX0FDQ0VTU19MT0NLKTsKK3NtZV9wcm9jZXNzX2NtZDoKKwlpZiAoIXBFbnRyeSkgeworCQljc3JfbGxfdW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCk7CisJCWdvdG8gcHJvY2Vzc19zY2FuX3E7CisJfQorCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCS8qCisJICogQWxsb3cgb25seSBkaXNjb25uZWN0IGNvbW1hbmQgaW4gd2FpdC1mb3Ita2V5IHN0YXRlIHVudGlsIHNldEtleSBpcworCSAqIHRocm91Z2guCisJICovCisJaWYgKENTUl9JU19XQUlUX0ZPUl9LRVkocE1hYywgcENvbW1hbmQtPnNlc3Npb25JZCkKKwkgICAgJiYgIUNTUl9JU19ESVNDT05ORUNUX0NPTU1BTkQocENvbW1hbmQpCisJICAgICYmICFDU1JfSVNfU0VUX0tFWV9DT01NQU5EKHBDb21tYW5kKSkgeworCQlpZiAoQ1NSX0lTX0NMT1NFX1NFU1NJT05fQ09NTUFORChwQ29tbWFuZCkpIHsKKwkJCXRTbWVDbWQgKnNtZV9jbWQgPSBOVUxMOworCisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIlNlc3Npb25JZCAlZDogY2xvc2Ugc2Vzc2lvbiBjb21tYW5kIGlzc3VlZCB3aGlsZSB3YWl0aW5nIGZvciBrZXksIGlzc3VlIGRpc2Nvbm5lY3QgZmlyc3QiKSwKKwkJCQlwQ29tbWFuZC0+c2Vzc2lvbklkKTsKKwkJCXN0YXR1cyA9IGNzcl9wcmVwYXJlX2Rpc2Nvbm5lY3RfY29tbWFuZChwTWFjLAorCQkJCQlwQ29tbWFuZC0+c2Vzc2lvbklkLCAmc21lX2NtZCk7CisJCQlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUyAmJiBzbWVfY21kKSB7CisJCQkJY3NyX2xsX2xvY2soJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCk7CisJCQkJY3NyX2xsX2luc2VydF9oZWFkKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsCisJCQkJCSZzbWVfY21kLT5MaW5rLCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCQlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKAorCQkJCQkJJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwKKwkJCQkJCUxMX0FDQ0VTU19OT0xPQ0spOworCQkJCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCk7CisJCQkJZ290byBzbWVfcHJvY2Vzc19jbWQ7CisJCQl9CisJCX0KKworCQljc3JfbGxfdW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCk7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJTZXNzaW9uSWQgJWQ6IENhbid0IHByb2Nlc3MgY21kKCVkKSwgd2FpdGluZyBmb3Iga2V5IiksCisJCQlwQ29tbWFuZC0+c2Vzc2lvbklkLCBwQ29tbWFuZC0+Y29tbWFuZCk7CisJCWZDb250aW51ZSA9IGZhbHNlOworCQlnb3RvIHByb2Nlc3Nfc2Nhbl9xOworCX0KKworCWlmICghY3NyX2xsX3JlbW92ZV9lbnRyeSgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBwRW50cnksCisJCQkJTExfQUNDRVNTX0xPQ0spKSB7CisJCS8qIFRoaXMgaXMgb2RkLiBTb21lIG9uZSBlbHNlIHB1bGwgb2ZmIHRoZSBjb21tYW5kLiAqLworCQljc3JfbGxfdW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCk7CisJCWdvdG8gcHJvY2Vzc19zY2FuX3E7CisJfQorCS8qIHdlIGNhbiByZXVzZSB0aGUgcENvbW1hbmQuIEluc2VydCB0aGUgY29tbWFuZCBvbnRvIHRoZSBBY3RpdmVMaXN0ICovCisJY3NyX2xsX2luc2VydF9oZWFkKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgJnBDb21tYW5kLT5MaW5rLAorCQkJICAgTExfQUNDRVNTX05PTE9DSyk7CisJLyogLi4uLiBhbmQgcHJvY2VzcyB0aGUgY29tbWFuZC4gKi8KKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLCBUUkFDRV9DT0RFX1NNRV9DT01NQU5ELAorCQkJIHBDb21tYW5kLT5zZXNzaW9uSWQsIHBDb21tYW5kLT5jb21tYW5kKSk7CisKKwlzd2l0Y2ggKHBDb21tYW5kLT5jb21tYW5kKSB7CisJY2FzZSBlU21lQ29tbWFuZFNjYW46CisJCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwkJc3RhdHVzID0gY3NyX3Byb2Nlc3Nfc2Nhbl9jb21tYW5kKHBNYWMsIHBDb21tYW5kKTsKKwkJYnJlYWs7CisJY2FzZSBlU21lQ29tbWFuZFJvYW06CisJCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwkJc3RhdHVzID0gY3NyX3JvYW1fcHJvY2Vzc19jb21tYW5kKHBNYWMsIHBDb21tYW5kKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKQorCQkgICAgJiYgY3NyX2xsX3JlbW92ZV9lbnRyeSgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQkJJnBDb21tYW5kLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSykpCisJCQljc3JfcmVsZWFzZV9jb21tYW5kX3JvYW0ocE1hYywgcENvbW1hbmQpOworCQlicmVhazsKKwljYXNlIGVTbWVDb21tYW5kV21TdGF0dXNDaGFuZ2U6CisJCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwkJY3NyX3JvYW1fcHJvY2Vzc193bV9zdGF0dXNfY2hhbmdlX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworCQlicmVhazsKKwljYXNlIGVTbWVDb21tYW5kU2V0S2V5OgorCQljc3JfbGxfdW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCk7CisJCXN0YXR1cyA9IGNzcl9yb2FtX3Byb2Nlc3Nfc2V0X2tleV9jb21tYW5kKHBNYWMsIHBDb21tYW5kKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKQorCQkgICAgJiYgY3NyX2xsX3JlbW92ZV9lbnRyeSgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQkJJnBDb21tYW5kLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSykpIHsKKwkJCWNzcl9yZWxlYXNlX2NvbW1hbmRfc2V0X2tleShwTWFjLCBwQ29tbWFuZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlU21lQ29tbWFuZEFkZFN0YVNlc3Npb246CisJCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwkJY3NyX3Byb2Nlc3NfYWRkX3N0YV9zZXNzaW9uX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworCQlicmVhazsKKwljYXNlIGVTbWVDb21tYW5kRGVsU3RhU2Vzc2lvbjoKKwkJY3NyX2xsX3VubG9jaygmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QpOworCQljc3JfcHJvY2Vzc19kZWxfc3RhX3Nlc3Npb25fY29tbWFuZChwTWFjLCBwQ29tbWFuZCk7CisJCWJyZWFrOworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCWNhc2UgZVNtZUNvbW1hbmRPZW1EYXRhUmVxOgorCQljc3JfbGxfdW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCk7CisJCW9lbV9kYXRhX3Byb2Nlc3Nfb2VtX2RhdGFfcmVxX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgZVNtZUNvbW1hbmRSZW1haW5PbkNoYW5uZWw6CisJCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwkJcDJwX3Byb2Nlc3NfcmVtYWluX29uX2NoYW5uZWxfY21kKHBNYWMsIHBDb21tYW5kKTsKKwkJYnJlYWs7CisJLyoKKwkgKiBUcmVhdCBzdGFuZGJ5IGRpZmZlcmVudGx5IGhlcmUgYmVjYXVzZSBjYWxsZXIgbWF5IG5vdCBiZSBhYmxlCisJICogdG8gaGFuZGxlIHRoZSBmYWlsdXJlIHNvIHdlIGRvIG91ciBiZXN0IGhlcmUKKwkgKi8KKwljYXNlIGVTbWVDb21tYW5kRW50ZXJTdGFuZGJ5OgorCQlicmVhazsKKwljYXNlIGVTbWVDb21tYW5kQWRkVHM6CisJY2FzZSBlU21lQ29tbWFuZERlbFRzOgorCQljc3JfbGxfdW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCk7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCQlmQ29udGludWUgPSBxb3NfcHJvY2Vzc19jb21tYW5kKHBNYWMsIHBDb21tYW5kKTsKKwkJaWYgKGZDb250aW51ZSAmJiBjc3JfbGxfcmVtb3ZlX2VudHJ5KAorCQkJJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LAorCQkJJnBDb21tYW5kLT5MaW5rLCBMTF9BQ0NFU1NfTk9MT0NLKSkgeworCQkJLyogVGhlIGNvbW1hbmQgZmFpbGVkLCByZW1vdmUgaXQgKi8KKwkJCXFvc19yZWxlYXNlX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworCQl9CisjZW5kaWYKKwkJYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwljYXNlIGVTbWVDb21tYW5kVGRsc1NlbmRNZ210OgorCWNhc2UgZVNtZUNvbW1hbmRUZGxzQWRkUGVlcjoKKwljYXNlIGVTbWVDb21tYW5kVGRsc0RlbFBlZXI6CisJY2FzZSBlU21lQ29tbWFuZFRkbHNMaW5rRXN0YWJsaXNoOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICBGTCgic2VuZGluZyBURExTIENvbW1hbmQgMHgleCB0byBQRSIpLAorCQkJICBwQ29tbWFuZC0+Y29tbWFuZCk7CisJCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwkJc3RhdHVzID0gY3NyX3RkbHNfcHJvY2Vzc19jbWQocE1hYywgcENvbW1hbmQpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgZV9zbWVfY29tbWFuZF9zZXRfaHdfbW9kZToKKwkJY3NyX2xsX3VubG9jaygmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QpOworCQljc3JfcHJvY2Vzc19zZXRfaHdfbW9kZShwTWFjLCBwQ29tbWFuZCk7CisJCWJyZWFrOworCWNhc2UgZV9zbWVfY29tbWFuZF9uc3NfdXBkYXRlOgorCQljc3JfbGxfdW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCk7CisJCWNzcl9wcm9jZXNzX25zc191cGRhdGVfcmVxKHBNYWMsIHBDb21tYW5kKTsKKwkJYnJlYWs7CisJY2FzZSBlX3NtZV9jb21tYW5kX3NldF9kdWFsX21hY19jb25maWc6CisJCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwkJY3NyX3Byb2Nlc3Nfc2V0X2R1YWxfbWFjX2NvbmZpZyhwTWFjLCBwQ29tbWFuZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHNvbWV0aGluZyBpcyB3cm9uZyAqLworCQkvKiByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aXZlIGxpc3QgKi8KKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgidW5rbm93biBjb21tYW5kICVkIiksCisJCQlwQ29tbWFuZC0+Y29tbWFuZCk7CisJCXBFbnRyeSA9IGNzcl9sbF9yZW1vdmVfaGVhZCgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQkJCSAgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJY3NyX2xsX3VubG9jaygmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QpOworCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJc21lX3JlbGVhc2VfY29tbWFuZChwTWFjLCBwQ29tbWFuZCk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlicmVhazsKKwl9CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJZkNvbnRpbnVlID0gdHJ1ZTsKK3Byb2Nlc3Nfc2Nhbl9xOgorCWlmICghKHNtZV9wcm9jZXNzX3NjYW5fcXVldWUocE1hYykpKQorCQlmQ29udGludWUgPSBmYWxzZTsKKwlyZXR1cm4gZkNvbnRpbnVlOworfQorCit2b2lkIHNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl3aGlsZSAoc21lX3Byb2Nlc3NfY29tbWFuZChwTWFjKSkKKwk7Cit9CisKK2Jvb2wgc21lX2NvbW1hbmRfcGVuZGluZyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXJldHVybiAhY3NyX2xsX2lzX2xpc3RfZW1wdHkoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKQorCQl8fCAhY3NyX2xsX2lzX2xpc3RfZW1wdHkoJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwKKwkJCQkJIExMX0FDQ0VTU19OT0xPQ0spOworfQorCisvKiBHbG9iYWwgQVBJcyAqLworCisvKioKKyAqIHNtZV9vcGVuKCkgLSBJbml0aWFsemUgYWxsIFNNRSBtb2R1bGVzIGFuZCBwdXQgdGhlbSBhdCBpZGxlIHN0YXRlCisgKiBAaEhhbDogICAgICAgVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorICoKKyAqIFRoZSBmdW5jdGlvbiBpbml0aWFsaXplcyBlYWNoIG1vZHVsZSBpbnNpZGUgU01FLCBQTUMsIENTUiwgZXRjLiBVcG9uCisgKiBzdWNjZXNzZnVsbHkgcmV0dXJuLCBhbGwgbW9kdWxlcyBhcmUgYXQgaWRsZSBzdGF0ZSByZWFkeSB0byBzdGFydC4KKyAqIHNtZU9wZW4gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBTTUUgQVBJcyBjYW4gYmUgaW52b2x2ZWQuCisgKiBzbWVPcGVuIG11c3QgYmUgY2FsbGVkIGFmdGVyIG1hY19vcGVuLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIGlzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4KKyAqICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqLworQ0RGX1NUQVRVUyBzbWVfb3Blbih0SGFsSGFuZGxlIGhIYWwpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisjaWZuZGVmIFdMQU5fRkVBVFVSRV9NQlNTSUQKKwl2b2lkICpwX2Nkc19nY3R4ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworI2VuZGlmCisKKwlwTWFjLT5zbWUuc3RhdGUgPSBTTUVfU1RBVEVfU1RPUDsKKwlwTWFjLT5zbWUuY3VyckRldmljZU1vZGUgPSBDREZfU1RBX01PREU7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX211dGV4X2luaXQoCisJCQkJCSZwTWFjLT5zbWUubGtTbWVHbG9iYWxMb2NrKSkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgic21lX29wZW4gZmFpbGVkIGluaXQgbG9jayIpKTsKKwkJcmV0dXJuICBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc3RhdHVzID0gY3NyX29wZW4ocE1hYyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJjc3Jfb3BlbiBmYWlsZWQsIHN0YXR1cz0lZCIpLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IHNtZV9wc19vcGVuKGhIYWwpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQlGTCgic21lX3BzX29wZW4gZmFpbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiB3aXRoIHN0YXR1cz0lZCIpLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwlwTWFjLT5pc190ZGxzX3Bvd2VyX3NhdmVfcHJvaGliaXRlZCA9IDA7CisjZW5kaWYKKworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKwlzdGF0dXMgPSBzbWVfcW9zX29wZW4ocE1hYyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJRb3Mgb3Blbiwgc3RhdHVzPSVkIiksIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisJc3RhdHVzID0gb2VtX2RhdGFfb2VtX2RhdGFfcmVxX29wZW4ocE1hYyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgib2VtX2RhdGFfb2VtX2RhdGFfcmVxX29wZW4sIHN0YXR1cz0lZCIpLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisjZW5kaWYKKwlzdGF0dXMgPSBpbml0X3NtZV9jbWRfbGlzdChwTWFjKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJaWYgKE5VTEwgPT0gcF9jZHNfZ2N0eCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJwX2Nkc19nY3R4IGlzIE5VTEwiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc3RhdHVzID0gd2xhbnNhcF9vcGVuKHBfY2RzX2djdHgpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgid2xhbnNhcF9vcGVuIGZhaWxlZCwgc3RhdHVzPSVkIiksCisJCQlzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJc3RhdHVzID0gcnJtX29wZW4ocE1hYyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJycm1fb3BlbiBmYWlsZWQsIHN0YXR1cz0lZCIpLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKyNlbmRpZgorCXNtZV9wMnBfb3BlbihwTWFjKTsKKwlzbWVfdHJhY2VfaW5pdChwTWFjKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogc21lX2luaXRfY2hhbl9saXN0LCB0cmlnZ2VycyBjaGFubmVsIHNldHVwIGJhc2VkIG9uIGNvdW50cnkgY29kZS4KKyAqLworQ0RGX1NUQVRVUyBzbWVfaW5pdF9jaGFuX2xpc3QodEhhbEhhbmRsZSBoYWwsIHVpbnQ4X3QgKmFscGhhMiwKKwkJCSAgICAgIENPVU5UUllfQ09ERV9TT1VSQ0UgY2Nfc3JjKQoreworCXRwQW5pU2lyR2xvYmFsIHBtYWMgPSBQTUFDX1NUUlVDVChoYWwpOworCisJaWYgKChjY19zcmMgPT0gQ09VTlRSWV9DT0RFX1NFVF9CWV9VU0VSKSAmJgorCSAgICAocG1hYy0+cm9hbS5jb25maWdQYXJhbS5mU3VwcGxpY2FudENvdW50cnlDb2RlSGFzUHJpb3JpdHkpKSB7CisJCXBtYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCA9IGZhbHNlOworCX0KKworCXJldHVybiBjc3JfaW5pdF9jaGFuX2xpc3QocG1hYywgYWxwaGEyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgc21lX3NldDExZGluZm8oKSAtIFNldCB0aGUgMTFkIGluZm9ybWF0aW9uIGFib3V0IHZhbGlkIGNoYW5uZWxzCisgICBhbmQgdGhlcmUgcG93ZXIgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSBudlJBTQorICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBmb3IgQVAuCisKKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxQYXJhbSBwU21lQ29uZmlnUGFyYW1zIC0gYSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YKKyAgIHR5cGVkZWYgc3RydWN0IF9zbWVDb25maWdQYXJhbXMuCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSB0aGUgY29uZmlnIHBhcmFtZXRlcnMgc3VjY2Vzc2Z1bGx5LgorCisgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgdGhlIGNvbmZpZyBwYXJhbWV0ZXJzLgorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NERl9TVEFUVVMgc21lX3NldDExZGluZm8odEhhbEhhbmRsZSBoSGFsLCB0cFNtZUNvbmZpZ1BhcmFtcyBwU21lQ29uZmlnUGFyYW1zKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX1NFVF8xMURJTkZPLCBOT19TRVNTSU9OLCAwKSk7CisJaWYgKE5VTEwgPT0gcFNtZUNvbmZpZ1BhcmFtcykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiRW1wdHkgY29uZmlnIHBhcmFtIHN0cnVjdHVyZSBmb3IgU01FLCBub3RoaW5nIHRvIHVwZGF0ZSIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGNzcl9zZXRfY2hhbm5lbHMoaEhhbCwgJnBTbWVDb25maWdQYXJhbXMtPmNzckNvbmZpZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiY3NyX2NoYW5nZV9kZWZhdWx0X2NvbmZpZ19wYXJhbSBmYWlsZWQgd2l0aCBzdGF0dXM9JWQiLAorCQkJc3RhdHVzKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfc2V0X3NjYW5fZGlzYWJsZSgpIC0gRHluYW1pY2FsbHkgZW5hYmxlL2Rpc2FibGUgc2NhbgorICogQGhfaGFsOiBIYW5kbGUgdG8gSEFMCisgKgorICogVGhpcyBjb21tYW5kIGdpdmVzIHRoZSB1c2VyIGFuIG9wdGlvbiB0byBkeW5hbWljYWxseQorICogZW5hYmxlIG9yIGRpc2FibGUgc2NhbnMuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgc21lX3NldF9zY2FuX2Rpc2FibGUodEhhbEhhbmRsZSBoX2hhbCwgaW50IHZhbHVlKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoX2hhbCk7CisJbWFjX2N0eC0+bGltLnNjYW5fZGlzYWJsZWQgPSB2YWx1ZTsKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsIEZMKCJ2YWx1ZT0lZCIpLCB2YWx1ZSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBzbWVfZ2V0X3NvZnRfYXBfZG9tYWluKCkgLSBHZXQgdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4gb2Ygc29mdEFwLgorCisgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgSG9zdGFwZEFkYXB0ZXIuCisgICBcUGFyYW0gdl9SRUdET01BSU5fdCAtIFRoZSBjdXJyZW50IFJlZ3VsYXRvcnkgRG9tYWluIHJlcXVlc3RlZCBmb3IgU29mdEFwLgorCisgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIFNNRSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoZSByZXF1ZXN0LgorCisgICBPdGhlciBzdGF0dXMgbWVhbnMsIGZhaWxlZCB0byBnZXQgdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUyBzbWVfZ2V0X3NvZnRfYXBfZG9tYWluKHRIYWxIYW5kbGUgaEhhbCwgdl9SRUdET01BSU5fdCAqZG9tYWluSWRTb2Z0QXApCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfR0VUX1NPRlRBUF9ET01BSU4sCisJCQkgTk9fU0VTU0lPTiwgMCkpOworCWlmIChOVUxMID09IGRvbWFpbklkU29mdEFwKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgIlVuaW5pdGlhbGl6ZWQgZG9tYWluIElkIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJKmRvbWFpbklkU29mdEFwID0gcE1hYy0+c2Nhbi5kb21haW5JZEN1cnJlbnQ7CisJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBzbWVfc2V0X3JlZ19pbmZvKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCAqYXBDbnRyeUNvZGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfU0VUX1JFR0lORk8sIE5PX1NFU1NJT04sIDApKTsKKwlpZiAoTlVMTCA9PSBhcENudHJ5Q29kZSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsICJFbXB0eSBDb3VudHJ5IENvZGUsIG5vdGhpbmcgdG8gdXBkYXRlIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gY3NyX3NldF9yZWdfaW5mbyhoSGFsLCBhcENudHJ5Q29kZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsICJjc3Jfc2V0X3JlZ19pbmZvIGZhaWxlZCB3aXRoIHN0YXR1cz0lZCIsCisJCQlzdGF0dXMpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorQ0RGX1NUQVRVUyBzbWVfc2V0X3BsbV9yZXF1ZXN0KHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJQbG1SZXEgcFBsbVJlcSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlib29sIHJldCA9IGZhbHNlOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl1aW50OF90IGNoX2xpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RdID0geyAwIH07CisJdWludDhfdCBjb3VudCwgdmFsaWRfY291bnQgPSAwOworCWNkc19tc2dfdCBtc2c7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBwUGxtUmVxLT5zZXNzaW9uSWQpOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQiKSwKKwkJCXBQbG1SZXEtPnNlc3Npb25JZCk7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKCFwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIkludmFsaWQgU2Vzc2lvbmlkIikpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmICghcFBsbVJlcS0+ZW5hYmxlKQorCQlnb3RvIHNlbmRfcGxtX3N0YXJ0OworCS8qIHZhbGlkYXRpbmcgY2hhbm5lbCBudW1iZXJzICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgcFBsbVJlcS0+cGxtTnVtQ2g7IGNvdW50KyspIHsKKwkJcmV0ID0gY3NyX2lzX3N1cHBvcnRlZF9jaGFubmVsKHBNYWMsIHBQbG1SZXEtPnBsbUNoTGlzdFtjb3VudF0pOworCQlpZiAocmV0ICYmIHBQbG1SZXEtPnBsbUNoTGlzdFtjb3VudF0gPiAxNCkgeworCQkJaWYgKENIQU5ORUxfU1RBVEVfREZTID09IGNkc19nZXRfY2hhbm5lbF9zdGF0ZSgKKwkJCQkJCXBQbG1SZXEtPnBsbUNoTGlzdFtjb3VudF0pKSB7CisJCQkJLyogREZTIGNoYW5uZWwgaXMgcHJvdmlkZWQsIG5vIFBMTSBidXJzdHMgY2FuIGJlCisJCQkJICogdHJhbnNtaXR0ZWQuIElnbm9yaW5nIHRoZXNlIGNoYW5uZWxzLgorCQkJCSAqLworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICBGTCgiREZTIGNoYW5uZWwgJWQgaWdub3JlZCBmb3IgUExNIiksCisJCQkJCSAgcFBsbVJlcS0+cGxtQ2hMaXN0W2NvdW50XSk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSBpZiAoIXJldCkgeworCQkJLyogTm90IHN1cHBvcnRlZCwgaWdub3JlIHRoZSBjaGFubmVsICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgRkwoIlVuc3VwcG9ydGVkIGNoYW5uZWwgJWQgaWdub3JlZCBmb3IgUExNIiksCisJCQkJICBwUGxtUmVxLT5wbG1DaExpc3RbY291bnRdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNoX2xpc3RbdmFsaWRfY291bnRdID0gcFBsbVJlcS0+cGxtQ2hMaXN0W2NvdW50XTsKKwkJdmFsaWRfY291bnQrKzsKKwl9IC8qIEVuZCBvZiBmb3IgKCkgKi8KKworCS8qIENvcHlpbmcgYmFjayB0aGUgdmFsaWQgY2hhbm5lbCBsaXN0IHRvIHBsbSBzdHJ1Y3QgKi8KKwljZGZfbWVtX3NldCgodm9pZCAqKXBQbG1SZXEtPnBsbUNoTGlzdCwKKwkJICAgIHBQbG1SZXEtPnBsbU51bUNoLCAwKTsKKwlpZiAodmFsaWRfY291bnQpCisJCWNkZl9tZW1fY29weShwUGxtUmVxLT5wbG1DaExpc3QsIGNoX2xpc3QsCisJCQkgICAgIHZhbGlkX2NvdW50KTsKKwkvKiBBbGwgYXJlIGludmFsaWQgY2hhbm5lbHMsIEZXIG5lZWQgdG8gc2VuZCB0aGUgUExNCisJICogIHJlcG9ydCB3aXRoICJpbmNhcGFibGUiIGJpdCBzZXQuCisJICovCisJcFBsbVJlcS0+cGxtTnVtQ2ggPSB2YWxpZF9jb3VudDsKKworc2VuZF9wbG1fc3RhcnQ6CisJLyogUExNIFNUQVJUICovCisJbXNnLnR5cGUgPSBXTUFfU0VUX1BMTV9SRVE7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHBQbG1SZXE7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLAorCQkJCQkJICAgICAgICZtc2cpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIk5vdCBhYmxlIHRvIHBvc3QgV01BX1NFVF9QTE1fUkVRIHRvIFdNQSIpKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIHNtZV91cGRhdGVfY29uZmlnKCkgLSBDaGFuZ2UgY29uZmlndXJhdGlvbnMgZm9yIGFsbCBTTUUgbW9kdWVscworCisgICBUaGUgZnVuY3Rpb24gdXBkYXRlcyBzb21lIGNvbmZpZ3VyYXRpb24gZm9yIG1vZHVsZXMgaW4gU01FLCBDU1IsIGV0YworICAgZHVyaW5nIFNNRXMgY2xvc2Ugb3BlbiBzZXF1ZW5jZS4KKworICAgTW9kdWxlcyBpbnNpZGUgU01FIGFwcGx5IHRoZSBuZXcgY29uZmlndXJhdGlvbiBhdCB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KKworICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwKKworICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgXFBhcmFtIHBTbWVDb25maWdQYXJhbXMgLSBhIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZgorICAgdHlwZWRlZiBzdHJ1Y3QgX3NtZUNvbmZpZ1BhcmFtcy4KKworICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIHRoZSBjb25maWcgcGFyYW1ldGVycyBzdWNjZXNzZnVsbHkuCisKKyAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIHVwZGF0ZSB0aGUgY29uZmlnIHBhcmFtZXRlcnMuCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX2NvbmZpZyh0SGFsSGFuZGxlIGhIYWwsIHRwU21lQ29uZmlnUGFyYW1zIHBTbWVDb25maWdQYXJhbXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfVVBEQVRFX0NPTkZJRywgTk9fU0VTU0lPTiwKKwkJCSAwKSk7CisJaWYgKE5VTEwgPT0gcFNtZUNvbmZpZ1BhcmFtcykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiRW1wdHkgY29uZmlnIHBhcmFtIHN0cnVjdHVyZSBmb3IgU01FLCBub3RoaW5nIHRvIHVwZGF0ZSIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9CisJCWNzcl9jaGFuZ2VfZGVmYXVsdF9jb25maWdfcGFyYW0ocE1hYywgJnBTbWVDb25maWdQYXJhbXMtPmNzckNvbmZpZyk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJjc3JfY2hhbmdlX2RlZmF1bHRfY29uZmlnX3BhcmFtIGZhaWxlZCB3aXRoIHN0YXR1cz0lZCIsCisJCQlzdGF0dXMpOworCX0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwlzdGF0dXMgPQorCQlycm1fY2hhbmdlX2RlZmF1bHRfY29uZmlnX3BhcmFtKGhIYWwsICZwU21lQ29uZmlnUGFyYW1zLT5ycm1Db25maWcpOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkicnJtX2NoYW5nZV9kZWZhdWx0X2NvbmZpZ19wYXJhbSBmYWlsZWQgd2l0aCBzdGF0dXM9JWQiLAorCQkJc3RhdHVzKTsKKwl9CisjZW5kaWYKKwkvKiBGb3IgU09DLCBDRkcgaXMgc2V0IGJlZm9yZSBzdGFydCAqLworCS8qIFdlIGRvbid0IHdhbnQgdG8gYXBwbHkgZ2xvYmFsIENGRyBpbiBjb25uZWN0IHN0YXRlIGJlY2F1c2UgdGhhdCBtYXkgY2F1c2Ugc29tZSBzaWRlIGFmZmVjdCAqLworCWlmIChjc3JfaXNfYWxsX3Nlc3Npb25fZGlzY29ubmVjdGVkKHBNYWMpKSB7CisJCWNzcl9zZXRfZ2xvYmFsX2NmZ3MocE1hYyk7CisJfQorCisJLyoKKwkgKiBJZiBzY2FuIG9mZmxvYWQgaXMgZW5hYmxlZCB0aGVuIGxpbSBoYXMgYWxsb3cgdGhlIHNlbmRpbmcgb2YKKwkgKiBzY2FuIHJlcXVlc3QgdG8gZmlybXdhcmUgZXZlbiBpbiBwb3dlcnNhdmUgbW9kZS4gVGhlIGZpcm13YXJlIGhhcworCSAqIHRvIHRha2UgY2FyZSBvZiBleGl0aW5nIGZyb20gcG93ZXIgc2F2ZSBtb2RlCisJICovCisJc3RhdHVzID0gc21lX2NmZ19zZXRfaW50KGhIYWwsIFdOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkUsIHRydWUpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFIHRvIENGRyIpOworCX0KKwlwTWFjLT5pc0NvYWxlc2luZ0luSUJTU0FsbG93ZWQgPQorCQlwU21lQ29uZmlnUGFyYW1zLT5jc3JDb25maWcuaXNDb2FsZXNpbmdJbklCU1NBbGxvd2VkOworCisJLyogdXBkYXRlIHAycCBvZmZsb2FkIHN0YXR1cyAqLworCXBNYWMtPnBub09mZmxvYWQgPSBwU21lQ29uZmlnUGFyYW1zLT5wbm9PZmZsb2FkOworCisJcE1hYy0+ZkVuYWJsZURlYnVnTG9nID0gcFNtZUNvbmZpZ1BhcmFtcy0+ZkVuYWJsZURlYnVnTG9nOworCisJLyogdXBkYXRlIGludGVyZmFjZSBjb25maWd1cmF0aW9uICovCisJcE1hYy0+c21lLm1heF9pbnRmX2NvdW50ID0gcFNtZUNvbmZpZ1BhcmFtcy0+bWF4X2ludGZfY291bnQ7CisKKwlwTWFjLT5lbmFibGU1Z0VCVCA9IHBTbWVDb25maWdQYXJhbXMtPmVuYWJsZTVnRUJUOworCXBNYWMtPnNtZS5lbmFibGVTZWxmUmVjb3ZlcnkgPSBwU21lQ29uZmlnUGFyYW1zLT5lbmFibGVTZWxmUmVjb3Zlcnk7CisKKwlwTWFjLT5mX3N0YV9taXJhY2FzdF9tY2NfcmVzdF90aW1lX3ZhbCA9CisJCXBTbWVDb25maWdQYXJhbXMtPmZfc3RhX21pcmFjYXN0X21jY19yZXN0X3RpbWVfdmFsOworCisjaWZkZWYgRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFCisJcE1hYy0+c2FwLnNhcF9jaGFubmVsX2F2b2lkYW5jZSA9CisJCXBTbWVDb25maWdQYXJhbXMtPnNhcF9jaGFubmVsX2F2b2lkYW5jZTsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKworCXBNYWMtPmZfcHJlZmVyX25vbl9kZnNfb25fcmFkYXIgPQorCQlwU21lQ29uZmlnUGFyYW1zLT5mX3ByZWZlcl9ub25fZGZzX29uX3JhZGFyOworCisJcE1hYy0+c21lLnBzX2dsb2JhbF9pbmZvLnBzX2VuYWJsZWQgPQorCQlwU21lQ29uZmlnUGFyYW1zLT5pc19wc19lbmFibGVkOworCisJcE1hYy0+cG9saWN5X21hbmFnZXJfZW5hYmxlZCA9IHBTbWVDb25maWdQYXJhbXMtPnBvbGljeV9tYW5hZ2VyX2VuYWJsZWQ7CisJcE1hYy0+ZmluZV90aW1lX21lYXNfY2FwID0gcFNtZUNvbmZpZ1BhcmFtcy0+ZmluZV90aW1lX21lYXNfY2FwOworCXBNYWMtPmR1YWxfbWFjX2ZlYXR1cmVfZGlzYWJsZSA9CisJCQkJcFNtZUNvbmZpZ1BhcmFtcy0+ZHVhbF9tYWNfZmVhdHVyZV9kaXNhYmxlOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfdXBkYXRlX3JvYW1fcGFyYW1zKCkgLSBTdG9yZS9VcGRhdGUgdGhlIHJvYW1pbmcgcGFyYW1zCisgKiBAaGFsOiAgICAgICAgICAgICAgICAgICAgICBIYW5kbGUgZm9yIEhhbCBsYXllcgorICogQHNlc3Npb25faWQ6ICAgICAgICAgICAgICAgU01FIFNlc3Npb24gSUQKKyAqIEByb2FtX3BhcmFtc19zcmM6ICAgICAgICAgIFRoZSBzb3VyY2UgYnVmZmVyIHRvIGNvcHkKKyAqIEB1cGRhdGVfcGFyYW06ICAgICAgICAgICAgIFR5cGUgb2YgcGFyYW1ldGVyIHRvIGJlIHVwZGF0ZWQKKyAqCisgKiBSZXR1cm46IFJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB1cGRhdGlvbi4KKyAqLworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3JvYW1fcGFyYW1zKHRIYWxIYW5kbGUgaGFsLAorCXVpbnQ4X3Qgc2Vzc2lvbl9pZCwgc3RydWN0IHJvYW1fZXh0X3BhcmFtcyByb2FtX3BhcmFtc19zcmMsCisJaW50IHVwZGF0ZV9wYXJhbSkKK3sKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsKTsKKwlzdHJ1Y3Qgcm9hbV9leHRfcGFyYW1zICpyb2FtX3BhcmFtc19kc3Q7CisJdWludDhfdCBpOworCisJcm9hbV9wYXJhbXNfZHN0ID0gJm1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0ucm9hbV9wYXJhbXM7CisJc3dpdGNoICh1cGRhdGVfcGFyYW0pIHsKKwljYXNlIFJFQVNPTl9ST0FNX0VYVF9TQ0FOX1BBUkFNU19DSEFOR0VEOgorCQlyb2FtX3BhcmFtc19kc3QtPnJhaXNlX3Jzc2lfdGhyZXNoXzVnID0KKwkJCXJvYW1fcGFyYW1zX3NyYy5yYWlzZV9yc3NpX3RocmVzaF81ZzsKKwkJcm9hbV9wYXJhbXNfZHN0LT5kcm9wX3Jzc2lfdGhyZXNoXzVnID0KKwkJCXJvYW1fcGFyYW1zX3NyYy5kcm9wX3Jzc2lfdGhyZXNoXzVnOworCQlyb2FtX3BhcmFtc19kc3QtPnJhaXNlX2ZhY3Rvcl81ZyA9CisJCQlyb2FtX3BhcmFtc19zcmMucmFpc2VfZmFjdG9yXzVnOworCQlyb2FtX3BhcmFtc19kc3QtPmRyb3BfZmFjdG9yXzVnID0KKwkJCXJvYW1fcGFyYW1zX3NyYy5kcm9wX2ZhY3Rvcl81ZzsKKwkJcm9hbV9wYXJhbXNfZHN0LT5tYXhfcmFpc2VfcnNzaV81ZyA9CisJCQlyb2FtX3BhcmFtc19zcmMubWF4X3JhaXNlX3Jzc2lfNWc7CisJCXJvYW1fcGFyYW1zX2RzdC0+bWF4X2Ryb3BfcnNzaV81ZyA9CisJCQlyb2FtX3BhcmFtc19zcmMubWF4X2Ryb3BfcnNzaV81ZzsKKwkJcm9hbV9wYXJhbXNfZHN0LT5hbGVydF9yc3NpX3RocmVzaG9sZCA9CisJCQlyb2FtX3BhcmFtc19zcmMuYWxlcnRfcnNzaV90aHJlc2hvbGQ7CisJCXJvYW1fcGFyYW1zX2RzdC0+aXNfNWdfcHJlZl9lbmFibGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBSRUFTT05fUk9BTV9TRVRfU1NJRF9BTExPV0VEOgorCQljZGZfbWVtX3NldCgmcm9hbV9wYXJhbXNfZHN0LT5zc2lkX2FsbG93ZWRfbGlzdCwgMCwKKwkJCQlzaXplb2YodFNpck1hY1NTaWQpICogTUFYX1NTSURfQUxMT1dFRF9MSVNUKTsKKwkJcm9hbV9wYXJhbXNfZHN0LT5udW1fc3NpZF9hbGxvd2VkX2xpc3QgPQorCQkJcm9hbV9wYXJhbXNfc3JjLm51bV9zc2lkX2FsbG93ZWRfbGlzdDsKKwkJZm9yIChpID0gMDsgaSA8IHJvYW1fcGFyYW1zX2RzdC0+bnVtX3NzaWRfYWxsb3dlZF9saXN0OyBpKyspIHsKKwkJCXJvYW1fcGFyYW1zX2RzdC0+c3NpZF9hbGxvd2VkX2xpc3RbaV0ubGVuZ3RoID0KKwkJCQlyb2FtX3BhcmFtc19zcmMuc3NpZF9hbGxvd2VkX2xpc3RbaV0ubGVuZ3RoOworCQkJY2RmX21lbV9jb3B5KHJvYW1fcGFyYW1zX2RzdC0+c3NpZF9hbGxvd2VkX2xpc3RbaV0uc3NJZCwKKwkJCQlyb2FtX3BhcmFtc19zcmMuc3NpZF9hbGxvd2VkX2xpc3RbaV0uc3NJZCwKKwkJCQlyb2FtX3BhcmFtc19kc3QtPnNzaWRfYWxsb3dlZF9saXN0W2ldLmxlbmd0aCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSRUFTT05fUk9BTV9TRVRfRkFWT1JFRF9CU1NJRDoKKwkJY2RmX21lbV9zZXQoJnJvYW1fcGFyYW1zX2RzdC0+YnNzaWRfZmF2b3JlZCwgMCwKKwkJCXNpemVvZih0U2lyTWFjQWRkcikgKiBNQVhfQlNTSURfRkFWT1JFRCk7CisJCXJvYW1fcGFyYW1zX2RzdC0+bnVtX2Jzc2lkX2Zhdm9yZWQgPQorCQkJcm9hbV9wYXJhbXNfc3JjLm51bV9ic3NpZF9mYXZvcmVkOworCQlmb3IgKGkgPSAwOyBpIDwgcm9hbV9wYXJhbXNfZHN0LT5udW1fYnNzaWRfZmF2b3JlZDsgaSsrKSB7CisJCQljZGZfbWVtX2NvcHkoJnJvYW1fcGFyYW1zX2RzdC0+YnNzaWRfZmF2b3JlZFtpXSwKKwkJCQkmcm9hbV9wYXJhbXNfc3JjLmJzc2lkX2Zhdm9yZWRbaV0sCisJCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCQlyb2FtX3BhcmFtc19kc3QtPmJzc2lkX2Zhdm9yZWRfZmFjdG9yW2ldID0KKwkJCQlyb2FtX3BhcmFtc19zcmMuYnNzaWRfZmF2b3JlZF9mYWN0b3JbaV07CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSRUFTT05fUk9BTV9TRVRfQkxBQ0tMSVNUX0JTU0lEOgorCQljZGZfbWVtX3NldCgmcm9hbV9wYXJhbXNfZHN0LT5ic3NpZF9hdm9pZF9saXN0LCAwLAorCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSAqIE1BWF9CU1NJRF9BVk9JRF9MSVNUKTsKKwkJcm9hbV9wYXJhbXNfZHN0LT5udW1fYnNzaWRfYXZvaWRfbGlzdCA9CisJCQlyb2FtX3BhcmFtc19zcmMubnVtX2Jzc2lkX2F2b2lkX2xpc3Q7CisJCWZvciAoaSA9IDA7IGkgPCByb2FtX3BhcmFtc19kc3QtPm51bV9ic3NpZF9hdm9pZF9saXN0OyBpKyspIHsKKwkJCWNkZl9tZW1fY29weSgmcm9hbV9wYXJhbXNfZHN0LT5ic3NpZF9hdm9pZF9saXN0W2ldLAorCQkJCSZyb2FtX3BhcmFtc19zcmMuYnNzaWRfYXZvaWRfbGlzdFtpXSwKKwkJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFQVNPTl9ST0FNX0dPT0RfUlNTSV9DSEFOR0VEOgorCQlyb2FtX3BhcmFtc19kc3QtPmdvb2RfcnNzaV9yb2FtID0KKwkJCXJvYW1fcGFyYW1zX3NyYy5nb29kX3Jzc2lfcm9hbTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWNzcl9yb2FtX29mZmxvYWRfc2NhbihtYWNfY3R4LCBzZXNzaW9uX2lkLCBST0FNX1NDQU5fT0ZGTE9BRF9VUERBVEVfQ0ZHLAorCQkJdXBkYXRlX3BhcmFtKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAordm9pZCBzbWVfcHJvY2Vzc19nZXRfZ3RrX2luZm9fcnNwKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkgIHRwU2lyR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXMKKwkJCQkgIHBHdGtPZmZsb2FkR2V0SW5mb1JzcCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IHBNYWMgaXMgbnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocE1hYy0+c21lLmd0a19vZmZsb2FkX2dldF9pbmZvX2NiID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSEREIGNhbGxiYWNrIGlzIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJcE1hYy0+c21lLmd0a19vZmZsb2FkX2dldF9pbmZvX2NiKAorCQkJcE1hYy0+c21lLmd0a19vZmZsb2FkX2dldF9pbmZvX2NiX2NvbnRleHQsCisJCQlwR3RrT2ZmbG9hZEdldEluZm9Sc3ApOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGZuICAgIC0gc21lX3Byb2Nlc3NfcmVhZHlfdG9fc3VzcGVuZAorICAgXGJyaWVmIC0gT24gZ2V0dGluZyByZWFkeSB0byBzdXNwZW5kIGluZGljYXRpb24sIHRoaXMgZnVuY3Rpb24gY2FsbHMKKwkgICAgY2FsbGJhY2sgcmVnaXN0ZXJlZCAoSEREIGNhbGxiYWNrcykgd2l0aCBTTUUgdG8gaW5mb3JtCisJICAgIHJlYWR5IHRvIHN1c3BlbmQgaW5kaWNhdGlvbi4KKworICAgXHBhcmFtIGhIYWwgLSBIYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisJICBwUmVhZHlUb1N1c3BlbmQgLSBQYXJhbWV0ZXIgcmVjZWl2ZWQgYWxvbmcgd2l0aCByZWFkeSB0byBzdXNwZW5kCisJCQkgICAgaW5kaWNhdGlvbiBmcm9tIFdNQS4KKworICAgXHJldHVybiBOb25lCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNtZV9wcm9jZXNzX3JlYWR5X3RvX3N1c3BlbmQodEhhbEhhbmRsZSBoSGFsLAorCQkJCSAgdHBTaXJSZWFkeVRvU3VzcGVuZEluZCBwUmVhZHlUb1N1c3BlbmQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKE5VTEwgPT0gcE1hYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBwTWFjIGlzIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTlVMTCAhPSBwTWFjLT5yZWFkeVRvU3VzcGVuZENhbGxiYWNrKSB7CisJCXBNYWMtPnJlYWR5VG9TdXNwZW5kQ2FsbGJhY2socE1hYy0+cmVhZHlUb1N1c3BlbmRDb250ZXh0LAorCQkJCQkgICAgIHBSZWFkeVRvU3VzcGVuZC0+c3VzcGVuZGVkKTsKKwkJcE1hYy0+cmVhZHlUb1N1c3BlbmRDYWxsYmFjayA9IE5VTEw7CisJfQorfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxmbiAtIHNtZV9wcm9jZXNzX3JlYWR5X3RvX2V4dF93b193CisgICBcYnJpZWYgLSBPbiBnZXR0aW5nIHJlYWR5IHRvIEV4dCBXb1cgaW5kaWNhdGlvbiwgdGhpcyBmdW5jdGlvbiBjYWxscworCSAgICBjYWxsYmFjayByZWdpc3RlcmVkIChIREQgY2FsbGJhY2tzKSB3aXRoIFNNRSB0byBpbmZvcm0KKwkgICAgcmVhZHkgdG8gRXh0V29XIGluZGljYXRpb24uCisKKyAgIFxwYXJhbSBoSGFsIC0gSGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorCSAgcFJlYWR5VG9FeHRXb1cgLSBQYXJhbWV0ZXIgcmVjZWl2ZWQgYWxvbmcgd2l0aCByZWFkeSB0byBFeHQgV29XCisJCQkgICBpbmRpY2F0aW9uIGZyb20gV01BLgorCisgICBccmV0dXJuIE5vbmUKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX3Byb2Nlc3NfcmVhZHlfdG9fZXh0X3dvX3codEhhbEhhbmRsZSBoSGFsLAorCQkJCSAgIHRwU2lyUmVhZHlUb0V4dFdvV0luZCBwUmVhZHlUb0V4dFdvVykKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IHBNYWMgaXMgbnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChOVUxMICE9IHBNYWMtPnJlYWR5VG9FeHRXb1dDYWxsYmFjaykgeworCQlwTWFjLT5yZWFkeVRvRXh0V29XQ2FsbGJhY2socE1hYy0+cmVhZHlUb0V4dFdvV0NvbnRleHQsCisJCQkJCSAgICBwUmVhZHlUb0V4dFdvVy0+c3RhdHVzKTsKKwkJcE1hYy0+cmVhZHlUb0V4dFdvV0NhbGxiYWNrID0gTlVMTDsKKwkJcE1hYy0+cmVhZHlUb0V4dFdvV0NvbnRleHQgPSBOVUxMOworCX0KKworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfY2hhbmdlX2NvbmZpZ19wYXJhbXMKKyAgICBcYnJpZWYgVGhlIFNNRSBBUEkgZXhwb3NlZCBmb3IgSEREIHRvIHByb3ZpZGUgY29uZmlnIHBhcmFtcyB0byBTTUUgZHVyaW5nCisgICAgU01FcyBzdG9wIC0+IHN0YXJ0IHNlcXVlbmNlLgorCisgICAgSWYgSEREIGNoYW5nZWQgdGhlIGRvbWFpbiB0aGF0IHdpbGwgY2F1c2UgYSByZXNldC4gVGhpcyBmdW5jdGlvbiB3aWxsCisgICAgcHJvdmlkZSB0aGUgbmV3IHNldCBvZiAxMWQgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXcgZG9tYWluLiBDdXJycmVudGx5IHRoaXMKKyAgICBBUEkgcHJvdmlkZXMgaW5mbyByZWdhcmRpbmcgMTFkIG9ubHkgYXQgcmVzZXQgYnV0IHdlIGNhbiBleHRlbmQgdGhpcyBmb3IKKyAgICBvdGhlciBwYXJhbXMgKFBNQywgUW9TKSB3aGljaCBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBhZ2FpbiBhdCByZXNldC4KKworICAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisKKyAgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisKKyAgICBcUGFyYW0KKyAgICBwVXBkYXRlQ29uZmlnUGFyYW0gLSBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgKHRDc3JVcGRhdGVDb25maWdQYXJhbSkgdGhhdAorCQljdXJyZW50bHkgcHJvdmlkZXMgMTFkIHJlbGF0ZWQgaW5mb3JtYXRpb24gbGlrZSBDb3VudHJ5IGNvZGUsCisJCVJlZ3VsYXRvcnkgZG9tYWluLCB2YWxpZCBjaGFubmVsIGxpc3QsIFR4IHBvd2VyIHBlciBjaGFubmVsLCBhCisJCWxpc3Qgd2l0aCBhY3RpdmUvcGFzc2l2ZSBzY2FuIGFsbG93ZWQgcGVyIHZhbGlkIGNoYW5uZWwuCisKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9jaGFuZ2VfY29uZmlnX3BhcmFtcyh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgIHRDc3JVcGRhdGVDb25maWdQYXJhbSAqcFVwZGF0ZUNvbmZpZ1BhcmFtKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKE5VTEwgPT0gcFVwZGF0ZUNvbmZpZ1BhcmFtKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJFbXB0eSBjb25maWcgcGFyYW0gc3RydWN0dXJlIGZvciBTTUUsIG5vdGhpbmcgdG8gcmVzZXQiKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBjc3JfY2hhbmdlX2NvbmZpZ19wYXJhbXMocE1hYywgcFVwZGF0ZUNvbmZpZ1BhcmFtKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiY3NyVXBkYXRlQ29uZmlnUGFyYW0gZmFpbGVkIHdpdGggc3RhdHVzPSVkIiwKKwkJCXN0YXR1cyk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBzbWVfaGRkX3JlYWR5X2luZCgpIC0gU01FIHNlbmRzIGVXTklfU01FX1NZU19SRUFEWV9JTkQgdG8gUEUgdG8gaW5mb3JtCisgICB0aGF0IHRoZSBOSUMgaXMgcmVhZHkgdGlvIHJ1bi4KKworICAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBIREQgYXQgdGhlIGVuZCBvZiBpbml0aWFsaXphdGlvbiBzdGFnZSBzbyBQRS9IQUwgY2FuCisgICBlbmFibGUgdGhlIE5JQyB0byBydW5uaW5nIHN0YXRlLgorCisgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorCisgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIGVXTklfU01FX1NZU19SRUFEWV9JTkQgaXMgc2VudCB0byBQRQorCQkJCXN1Y2Nlc3NmdWxseS4KKworICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBmYWlsZWQgdG8gc2VuZCB0aGUgbWVzc2FnZSB0byBQRS4KKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9oZGRfcmVhZHlfaW5kKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0U2lyU21lUmVhZHlSZXEgTXNnOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX0hERFJFQURZSU5ELCBOT19TRVNTSU9OLCAwKSk7CisJZG8geworCisJCU1zZy5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1NZU19SRUFEWV9JTkQ7CisJCU1zZy5sZW5ndGggPSBzaXplb2YodFNpclNtZVJlYWR5UmVxKTsKKwkJTXNnLmFkZF9ic3NkZXNjcl9jYiA9IGNzcl9zY2FuX3Byb2Nlc3Nfc2luZ2xlX2Jzc2Rlc2NyOworCisKKwkJaWYgKGVTSVJfRkFJTFVSRSAhPSB1X21hY19wb3N0X2N0cmxfbXNnKGhIYWwsICh0U2lyTWJNc2cgKikgJk1zZykpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkidV9tYWNfcG9zdF9jdHJsX21zZyBmYWlsZWQgdG8gc2VuZCBlV05JX1NNRV9TWVNfUkVBRFlfSU5EIik7CisJCQlicmVhazsKKwkJfQorCisJCXN0YXR1cyA9IGNzcl9yZWFkeShwTWFjKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCSJjc3JfcmVhZHkgZmFpbGVkIHdpdGggc3RhdHVzPSVkIiwKKwkJCQlzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHJybV9yZWFkeShoSGFsKSkgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsICJycm1fcmVhZHkgZmFpbGVkIik7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCXBNYWMtPnNtZS5zdGF0ZSA9IFNNRV9TVEFURV9SRUFEWTsKKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIHNtZV9zdGFydCgpIC0gUHV0IGFsbCBTTUUgbW9kdWxlcyBhdCByZWFkeSBzdGF0ZS4KKworICAgVGhlIGZ1bmN0aW9uIHN0YXJ0cyBlYWNoIG1vZHVsZSBpbiBTTUUsIFBNQywgQ1NSLCBldGMuIC4gVXBvbgorICAgc3VjY2Vzc2Z1bGx5IHJldHVybiwgYWxsIG1vZHVsZXMgYXJlIHJlYWR5IHRvIHJ1bi4KKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIGlzIHJlYWR5LgorCisgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byBzdGFydAorICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3N0YXJ0KHRIYWxIYW5kbGUgaEhhbCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCWRvIHsKKwkJc3RhdHVzID0gY3NyX3N0YXJ0KHBNYWMpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJImNzcl9zdGFydCBmYWlsZWQgZHVyaW5nIHNtZVN0YXJ0IHdpdGggc3RhdHVzPSVkIiwKKwkJCQlzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJCXN0YXR1cyA9IHdsYW5zYXBfc3RhcnQoY2RzX2dldF9nbG9iYWxfY29udGV4dCgpKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCSJ3bGFuc2FwX3N0YXJ0IGZhaWxlZCBkdXJpbmcgc21lU3RhcnQgd2l0aCBzdGF0dXM9JWQiLAorCQkJCXN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJcE1hYy0+c21lLnN0YXRlID0gU01FX1NUQVRFX1NUQVJUOworCX0gd2hpbGUgKDApOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfaGFuZGxlX3NjYW5fcmVxKCkgLSBTY2FuIHJlcXVlc3QgaGFuZGxlcgorICogQG1hY19jdHg6IE1BQyBnbG9iYWwgY29udGV4dAorICogQG1zZzogbWVzc2FnZSBidWZmZXIKKyAqCisgKiBTY2FuIHJlcXVlc3QgbWVzc2FnZSBmcm9tIHVwcGVyIGxheWVyIGlzIGhhbmRsZWQgYXMKKyAqIHBhcnQgb2YgdGhpcyBBUEkKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworc3RhdGljIENERl9TVEFUVVMgc21lX2hhbmRsZV9zY2FuX3JlcSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQl2b2lkICptc2cpCit7CisJc3RydWN0IGFuaV9zY2FuX3JlcSAqc2Nhbl9tc2c7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl1aW50MTZfdCBzZXNzaW9uX2lkOworCWNzcl9zY2FuX2NvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2s7CisKKwlzY2FuX21zZyA9IG1zZzsKKwlzZXNzaW9uX2lkID0gc2Nhbl9tc2ctPnNlc3Npb25faWQ7CisJY2FsbGJhY2sgPSBzY2FuX21zZy0+Y2FsbGJhY2s7CisJc3RhdHVzID0gY3NyX3NjYW5fcmVxdWVzdChtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQlzY2FuX21zZy0+c2Nhbl9wYXJhbSwKKwkJY2FsbGJhY2ssIHNjYW5fbXNnLT5jdHgpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInNjYW4gcmVxdWVzdCBmYWlsZWQuIHNlc3Npb25faWQgJWQiKSwgc2Vzc2lvbl9pZCk7CisJfQorCWNzcl9zY2FuX2ZyZWVfcmVxdWVzdChtYWNfY3R4LCBzY2FuX21zZy0+c2Nhbl9wYXJhbSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfaGFuZGxlX3JvY19yZXEoKSAtIFJvYyByZXF1ZXN0IGhhbmRsZXIKKyAqIEBtYWNfY3R4OiBNQUMgZ2xvYmFsIGNvbnRleHQKKyAqIEBtc2c6IG1lc3NhZ2UgYnVmZmVyCisgKgorICogUm9jIHJlcXVlc3QgbWVzc2FnZSBmcm9tIHVwcGVyIGxheWVyIGlzIGhhbmRsZWQgYXMKKyAqIHBhcnQgb2YgdGhpcyBBUEkKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworc3RhdGljIENERl9TVEFUVVMgc21lX2hhbmRsZV9yb2NfcmVxKHRIYWxIYW5kbGUgaGFsLAorCQkJCQl2b2lkICptc2cpCit7CisJc3RydWN0IGFuaV9yb2NfcmVxICpyb2NfbXNnOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbCk7CisJcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2s7CisKKwlpZiAobXNnID09IE5VTEwpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiUk9DIHJlcXVlc3QgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlyb2NfbXNnID0gbXNnOworCWNhbGxiYWNrID0gcm9jX21zZy0+Y2FsbGJhY2s7CisJc3RhdHVzID0gcDJwX3JlbWFpbl9vbl9jaGFubmVsKGhhbCwgcm9jX21zZy0+c2Vzc2lvbl9pZCwKKwkJcm9jX21zZy0+Y2hhbm5lbCwgcm9jX21zZy0+ZHVyYXRpb24sIGNhbGxiYWNrLAorCQlyb2NfbXNnLT5jdHgsIHJvY19tc2ctPmlzX3AycHByb2JlX2FsbG93ZWQsCisJCXJvY19tc2ctPnNjYW5faWQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoInNjYW4gcmVxdWVzdCBmYWlsZWQuIHNlc3Npb25faWQgJWQgc2Nhbl9pZCAlZCIpLAorCQkJcm9jX21zZy0+c2Vzc2lvbl9pZCwgcm9jX21zZy0+c2Nhbl9pZCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEhhbmRsZSB0aGUgdW5wcm90ZWN0ZWQgbWFuYWdlbWVudCBmcmFtZSBpbmRpY2F0aW9uIGZyb20gTElNIGFuZAorICogZm9yd2FyZCBpdCB0byBIREQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitDREZfU1RBVFVTIHNtZV91bnByb3RlY3RlZF9tZ210X2ZybV9pbmQodEhhbEhhbmRsZSBoSGFsLAorCQkJCQl0cFNpclNtZVVucHJvdE1nbXRGcmFtZUluZCBwU21lTWdtdEZybSkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1JbmZvIHBSb2FtSW5mbyA9IHsgMCB9OworCXVpbnQzMl90IFNlc3Npb25JZCA9IHBTbWVNZ210RnJtLT5zZXNzaW9uSWQ7CisKKwlwUm9hbUluZm8ubkZyYW1lTGVuZ3RoID0gcFNtZU1nbXRGcm0tPmZyYW1lTGVuOworCXBSb2FtSW5mby5wYkZyYW1lcyA9IHBTbWVNZ210RnJtLT5mcmFtZUJ1ZjsKKwlwUm9hbUluZm8uZnJhbWVUeXBlID0gcFNtZU1nbXRGcm0tPmZyYW1lVHlwZTsKKworCS8qIGZvcndhcmQgdGhlIG1nbXQgZnJhbWUgdG8gSEREICovCisJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBTZXNzaW9uSWQsICZwUm9hbUluZm8sIDAsCisJCQkgICAgICAgZUNTUl9ST0FNX1VOUFJPVF9NR01UX0ZSQU1FX0lORCwgMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSGFuZGxlIHRoZSBERlMgUmFkYXIgRXZlbnQgYW5kIGluZGljYXRlIGl0IHRvIHRoZSBTQVAKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGRmc19tc2dfcHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IG1zZ1R5cGUsIHZvaWQgKnBNc2dCdWYpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1JbmZvIHJvYW1JbmZvID0geyAwIH07CisJdFNpclNtZURmc0V2ZW50SW5kICpkZnNfZXZlbnQ7CisJdFNpclNtZUNTQUllVHhDb21wbGV0ZVJzcCAqY3NhSWVUeENvbXBsZXRlUnNwOworCXVpbnQzMl90IHNlc3Npb25JZCA9IDA7CisJZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1czsKKwllQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0OworCWludCBpOworCisJc3dpdGNoIChtc2dUeXBlKSB7CisJY2FzZSBlV05JX1NNRV9ERlNfUkFEQVJfRk9VTkQ6CisJeworCQkvKiBSYWRhciBmb3VuZCAhISAqLworCQlkZnNfZXZlbnQgPSAodFNpclNtZURmc0V2ZW50SW5kICopIHBNc2dCdWY7CisJCWlmIChOVUxMID09IGRmc19ldmVudCkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCSIlczogcE1zZyBpcyBOVUxMIGZvciBlV05JX1NNRV9ERlNfUkFEQVJfRk9VTkQgbWVzc2FnZSIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNlc3Npb25JZCA9IGRmc19ldmVudC0+c2Vzc2lvbklkOworCQlyb2FtSW5mby5kZnNfZXZlbnQuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworCQlyb2FtSW5mby5kZnNfZXZlbnQuY2hhbl9saXN0Lm5jaGFubmVscyA9CisJCQlkZnNfZXZlbnQtPmNoYW5fbGlzdC5uY2hhbm5lbHM7CisJCWZvciAoaSA9IDA7IGkgPCBkZnNfZXZlbnQtPmNoYW5fbGlzdC5uY2hhbm5lbHM7IGkrKykgeworCQkJcm9hbUluZm8uZGZzX2V2ZW50LmNoYW5fbGlzdC5jaGFubmVsc1tpXSA9CisJCQkJZGZzX2V2ZW50LT5jaGFuX2xpc3QuY2hhbm5lbHNbaV07CisJCX0KKworCQlyb2FtSW5mby5kZnNfZXZlbnQuZGZzX3JhZGFyX3N0YXR1cyA9CisJCQlkZnNfZXZlbnQtPmRmc19yYWRhcl9zdGF0dXM7CisJCXJvYW1JbmZvLmRmc19ldmVudC51c2Vfbm9sID0gZGZzX2V2ZW50LT51c2Vfbm9sOworCisJCXJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fREZTX1JBREFSX0lORDsKKwkJcm9hbVJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfREZTX1JBREFSX0ZPVU5EX0lORDsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkgICJzYXBkZnM6IFJhZGFyIGluZGljYXRpb24gZXZlbnQgb2NjdXJyZWQiKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgZVdOSV9TTUVfREZTX0NTQUlFX1RYX0NPTVBMRVRFX0lORDoKKwl7CisJCWNzYUllVHhDb21wbGV0ZVJzcCA9CisJCQkodFNpclNtZUNTQUllVHhDb21wbGV0ZVJzcCAqKSBwTXNnQnVmOworCQlpZiAoTlVMTCA9PSBjc2FJZVR4Q29tcGxldGVSc3ApIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkiJXM6IHBNc2cgaXMgTlVMTCBmb3IgZVdOSV9TTUVfREZTX0NTQUlFX1RYX0NPTVBMRVRFX0lORCIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNlc3Npb25JZCA9IGNzYUllVHhDb21wbGV0ZVJzcC0+c2Vzc2lvbklkOworCQlyb2FtU3RhdHVzID0gZUNTUl9ST0FNX0RGU19DSEFOX1NXX05PVElGWTsKKwkJcm9hbVJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfREZTX0NIQU5TV19VUERBVEVfU1VDQ0VTUzsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkgICJzYXBkZnM6IFJlY2VpdmVkIGVXTklfU01FX0RGU19DU0FJRV9UWF9DT01QTEVURV9JTkQgZm9yIHNlc3Npb24gaWQgWyVkXSIsCisJCQkgIHNlc3Npb25JZCk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCXsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCAiJXM6IEludmFsaWQgREZTIG1lc3NhZ2UgPSAweCV4IiwKKwkJCV9fZnVuY19fLCBtc2dUeXBlKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCXJldHVybiBzdGF0dXM7CisJfQorCX0KKworCS8qIEluZGljYXRlIFJhZGFyIEV2ZW50IHRvIFNBUCAqLworCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIDAsCisJCQkgICAgICAgcm9hbVN0YXR1cywgcm9hbVJlc3VsdCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSGFuZGxlIHRoZSB0c20gaWUgaW5kaWNhdGlvbiBmcm9tICBMSU0gYW5kIGZvcndhcmQgaXQgdG8gSERELgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3RzbV9pZV9pbmQodEhhbEhhbmRsZSBoSGFsLCB0U2lyU21lVHNtSUVJbmQgKnBTbWVUc21JZUluZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1JbmZvIHBSb2FtSW5mbyA9IHsgMCB9OworCXVpbnQzMl90IFNlc3Npb25JZCA9IHBTbWVUc21JZUluZC0+c2Vzc2lvbklkOworCXBSb2FtSW5mby50c21JZS50c2lkID0gcFNtZVRzbUllSW5kLT50c21JZS50c2lkOworCXBSb2FtSW5mby50c21JZS5zdGF0ZSA9IHBTbWVUc21JZUluZC0+dHNtSWUuc3RhdGU7CisJcFJvYW1JbmZvLnRzbUllLm1zbXRfaW50ZXJ2YWwgPSBwU21lVHNtSWVJbmQtPnRzbUllLm1zbXRfaW50ZXJ2YWw7CisJLyogZm9yd2FyZCB0aGUgdHNtIGllIGluZm9ybWF0aW9uIHRvIEhERCAqLworCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywKKwkJCSAgICAgICBTZXNzaW9uSWQsICZwUm9hbUluZm8sIDAsIGVDU1JfUk9BTV9UU01fSUVfSU5ELCAwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3NldF9jY2ttX2llCisgICAgXGJyaWVmICBmdW5jdGlvbiB0byBzdG9yZSB0aGUgQ0NLTSBJRSBwYXNzZWQgZnJvbSBzdXBwbGljYW50IGFuZCB1c2UKKyAgICBpdCB3aGlsZSBwYWNraW5nIHJlYXNzb2NpYXRpb24gcmVxdWVzdAorICAgIFxwYXJhbSAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorICAgIFxwYXJhbSAgc2Vzc2lvbklkIC0gU2Vzc2lvbiBJZGVudGlmaWVyCisgICAgXHBhcmFtICBwQ2NrbUllIC0gcG9pbnRlciB0byBDQ0tNIElFIGRhdGEKKyAgICBccGFyYW0gIHBDY2ttSWVMZW4gLSBsZW5ndGggb2YgdGhlIENDS00gSUUKKyAgIFwtIHJldHVybiBTdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9jY2ttX2llKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkgICB1aW50OF90ICpwQ2NrbUllLCB1aW50OF90IGNja21JZUxlbikKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWNzcl9zZXRfY2NrbV9pZShwTWFjLCBzZXNzaW9uSWQsIHBDY2ttSWUsIGNja21JZUxlbik7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3NldF9lc2VfYmVhY29uX3JlcXVlc3QKKyAgICBcYnJpZWYgIGZ1bmN0aW9uIHRvIHNldCBFU0UgYmVhY29uIHJlcXVlc3QgcGFyYW1ldGVycworICAgIFxwYXJhbSAgaEhhbCAgICAgICAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorICAgIFxwYXJhbSAgc2Vzc2lvbklkICAtIFNlc3Npb24gaWQKKyAgICBccGFyYW0gIHBFc2VCY25SZXEgLSBwb2ludGVyIHRvIEVTRSBiZWFjb24gcmVxdWVzdAorICAgXC0gcmV0dXJuIFN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2V0X2VzZV9iZWFjb25fcmVxdWVzdCh0SGFsSGFuZGxlIGhIYWwsIGNvbnN0IHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgIGNvbnN0IHRDc3JFc2VCZWFjb25SZXEgKnBFc2VCY25SZXEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRwU2lyQmVhY29uUmVwb3J0UmVxSW5kIHBTbWVCY25SZXBvcnRSZXEgPSBOVUxMOworCXRDc3JFc2VCZWFjb25SZXFQYXJhbXMgKnBCZWFjb25SZXEgPSBOVUxMOworCXVpbnQ4X3QgY291bnRlciA9IDA7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCXRwUnJtU01FQ29udGV4dCBwU21lUnJtQ29udGV4dCA9ICZwTWFjLT5ycm0ucnJtU21lQ29udGV4dDsKKworCWlmIChwU21lUnJtQ29udGV4dC0+ZXNlQmNuUmVxSW5Qcm9ncmVzcyA9PSB0cnVlKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJBIEJlYWNvbiBSZXBvcnQgUmVxIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfQorCisJLyogU3RvcmUgdGhlIGluZm8gaW4gUlJNIGNvbnRleHQgKi8KKwljZGZfbWVtX2NvcHkoJnBTbWVScm1Db250ZXh0LT5lc2VCY25SZXFJbmZvLCBwRXNlQmNuUmVxLAorCQkgICAgIHNpemVvZih0Q3NyRXNlQmVhY29uUmVxKSk7CisKKwkvKiBQcmVwYXJlIHRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gU01FLiAqLworCXBTbWVCY25SZXBvcnRSZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpckJlYWNvblJlcG9ydFJlcUluZCkpOworCWlmIChOVUxMID09IHBTbWVCY25SZXBvcnRSZXEpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dQLAorCQkJIk1lbW9yeSBBbGxvY2F0aW9uIEZhaWx1cmUhISEgRVNFICBCY25SZXEgSW5kIHRvIFNNRSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCXBTbWVScm1Db250ZXh0LT5lc2VCY25SZXFJblByb2dyZXNzID0gdHJ1ZTsKKworCXNtc19sb2cocE1hYywgTE9HRSwgIlNlbmRpbmcgQmVhY29uIFJlcG9ydCBSZXEgdG8gU01FIik7CisJY2RmX21lbV96ZXJvKHBTbWVCY25SZXBvcnRSZXEsIHNpemVvZih0U2lyQmVhY29uUmVwb3J0UmVxSW5kKSk7CisKKwlwU21lQmNuUmVwb3J0UmVxLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVRX0lORDsKKwlwU21lQmNuUmVwb3J0UmVxLT5sZW5ndGggPSBzaXplb2YodFNpckJlYWNvblJlcG9ydFJlcUluZCk7CisJY2RmX21lbV9jb3B5KHBTbWVCY25SZXBvcnRSZXEtPmJzc0lkLAorCQkgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLmJ5dGVzLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCXBTbWVCY25SZXBvcnRSZXEtPmNoYW5uZWxJbmZvLmNoYW5uZWxOdW0gPSAyNTU7CisJcFNtZUJjblJlcG9ydFJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgPSBwRXNlQmNuUmVxLT5udW1CY25SZXFJZTsKKwlwU21lQmNuUmVwb3J0UmVxLT5tc2dTb3VyY2UgPSBlUlJNX01TR19TT1VSQ0VfRVNFX1VQTE9BRDsKKworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBwRXNlQmNuUmVxLT5udW1CY25SZXFJZTsgY291bnRlcisrKSB7CisJCXBCZWFjb25SZXEgPQorCQkJKHRDc3JFc2VCZWFjb25SZXFQYXJhbXMgKikgJnBFc2VCY25SZXEtPmJjblJlcVtjb3VudGVyXTsKKwkJcFNtZUJjblJlcG9ydFJlcS0+Zk1lYXN1cmVtZW50dHlwZVtjb3VudGVyXSA9CisJCQlwQmVhY29uUmVxLT5zY2FuTW9kZTsKKwkJcFNtZUJjblJlcG9ydFJlcS0+bWVhc3VyZW1lbnREdXJhdGlvbltjb3VudGVyXSA9CisJCQlTWVNfVFVfVE9fTVMocEJlYWNvblJlcS0+bWVhc3VyZW1lbnREdXJhdGlvbik7CisJCXBTbWVCY25SZXBvcnRSZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXJbY291bnRlcl0gPQorCQkJcEJlYWNvblJlcS0+Y2hhbm5lbDsKKwl9CisKKwlzdGF0dXMgPSBzbWVfcnJtX3Byb2Nlc3NfYmVhY29uX3JlcG9ydF9yZXFfaW5kKHBNYWMsIHBTbWVCY25SZXBvcnRSZXEpOworCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCXBTbWVScm1Db250ZXh0LT5lc2VCY25SZXFJblByb2dyZXNzID0gZmFsc2U7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAmJiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworCisvKioKKyAqIHNtZV9wcm9jZXNzX2Z3X21lbV9kdW1wX3JzcCAtIHByb2Nlc3MgZncgbWVtb3J5IGR1bXAgcmVzcG9uc2UgZnJvbSBXTUEKKyAqCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBNQUMgaGFuZGxlLgorICogQG1zZzogcG9pbnRlciB0byByZWNlaXZlZCBTTUUgbXNnLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgcmVjZWl2ZWQgU01FIG1lc3NhZ2UgYW5kIGNhbGxzIHRoZSBjb3JyZXNwb25kaW5nCisgKiBjYWxsYmFjayB3aGljaCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggU01FLgorICoKKyAqIFJldHVybjogTm9uZQorICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX01FTURVTVAKK3N0YXRpYyB2b2lkIHNtZV9wcm9jZXNzX2Z3X21lbV9kdW1wX3JzcCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCBjZHNfbXNnX3QgKm1zZykKK3sKKwlpZiAobXNnLT5ib2R5cHRyKSB7CisJCWlmIChtYWNfY3R4LT5zbWUuZndfZHVtcF9jYWxsYmFjaykKKwkJCW1hY19jdHgtPnNtZS5md19kdW1wX2NhbGxiYWNrKG1hY19jdHgtPmhIZGQsCisJCQkJKHN0cnVjdCBmd19kdW1wX3JzcCAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgc21lX3Byb2Nlc3NfZndfbWVtX2R1bXBfcnNwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIGNkc19tc2dfdCAqbXNnKQoreworfQorI2VuZGlmCisKKy8qKgorICogc21lX3Byb2Nlc3NfZHVhbF9tYWNfY29uZmlnX3Jlc3AoKSAtIFByb2Nlc3Mgc2V0IER1YWwgbWFjIGNvbmZpZyByZXNwb25zZQorICogQG1hYzogR2xvYmFsIE1BQyBwb2ludGVyCisgKiBAbXNnOiBEdWFsIG1hYyBjb25maWcgcmVzcG9uc2UKKyAqCisgKiBQcm9jZXNzZXMgdGhlIGR1YWwgbWFjIGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgYW5kIGludm9rZXMgdGhlIEhERCBjYWxsYmFjaworICogdG8gcHJvY2VzcyBmdXJ0aGVyCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHNtZV9wcm9jZXNzX2R1YWxfbWFjX2NvbmZpZ19yZXNwKHRwQW5pU2lyR2xvYmFsIG1hYywKKwkJdWludDhfdCAqbXNnKQoreworCXRMaXN0RWxlbSAqZW50cnkgPSBOVUxMOworCXRTbWVDbWQgKmNvbW1hbmQgPSBOVUxMOworCWJvb2wgZm91bmQ7CisJZHVhbF9tYWNfY2IgY2FsbGJhY2sgPSBOVUxMOworCXN0cnVjdCBzaXJfZHVhbF9tYWNfY29uZmlnX3Jlc3AgKnBhcmFtOworCisJcGFyYW0gPSAoc3RydWN0IHNpcl9kdWFsX21hY19jb25maWdfcmVzcCAqKW1zZzsKKwlpZiAoIXBhcmFtKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiRHVhbCBtYWMgY29uZmlnIHJlc3AgcGFyYW0gaXMgTlVMTCIpKTsKKwkJLyogTm90IHJldHVybmluZy4gTmVlZCB0byBjaGVjayBpZiBhY3RpdmUgY29tbWFuZCBsaXN0CisJCSAqIG5lZWRzIHRvIGJlIGZyZWVkCisJCSAqLworCX0KKworCWVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmbWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwKKwkJCUxMX0FDQ0VTU19MT0NLKTsKKwlpZiAoIWVudHJ5KSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiTm8gY21kIGZvdW5kIGluIGFjdGl2ZSBsaXN0IikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY29tbWFuZCA9IEdFVF9CQVNFX0FERFIoZW50cnksIHRTbWVDbWQsIExpbmspOworCWlmICghY29tbWFuZCkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIkJhc2UgYWRkcmVzcyBpcyBOVUxMIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKGVfc21lX2NvbW1hbmRfc2V0X2R1YWxfbWFjX2NvbmZpZyAhPSBjb21tYW5kLT5jb21tYW5kKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiQ29tbWFuZCBtaXNtYXRjaCEiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljYWxsYmFjayA9IGNvbW1hbmQtPnUuc2V0X2R1YWxfbWFjX2NtZC5zZXRfZHVhbF9tYWNfY2I7CisJaWYgKGNhbGxiYWNrKSB7CisJCWlmICghcGFyYW0pIHsKKwkJCXNtc19sb2cobWFjLCBMT0dFLAorCQkJCUZMKCJDYWxsYmFjayBmYWlsZWQtRHVhbCBtYWMgY29uZmlnIGlzIE5VTEwiKSk7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKG1hYywgTE9HMSwKKwkJCQlGTCgiQ2FsbGluZyBIREQgY2FsbGJhY2sgZm9yIER1YWwgbWFjIGNvbmZpZyIpKTsKKwkJCWNhbGxiYWNrKHBhcmFtLT5zdGF0dXMsCisJCQkJY29tbWFuZC0+dS5zZXRfZHVhbF9tYWNfY21kLnNjYW5fY29uZmlnLAorCQkJCWNvbW1hbmQtPnUuc2V0X2R1YWxfbWFjX2NtZC5md19tb2RlX2NvbmZpZyk7CisJCX0KKwl9IGVsc2UgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIkNhbGxiYWNrIGRvZXMgbm90IGV4aXN0IikpOworCX0KKworCWZvdW5kID0gY3NyX2xsX3JlbW92ZV9lbnRyeSgmbWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgZW50cnksCisJCQlMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKGZvdW5kKQorCQkvKiBOb3cgcHV0IHRoaXMgY29tbWFuZCBiYWNrIG9uIHRoZSBhdmFpbGFibGUgY29tbWFuZCBsaXN0ICovCisJCXNtZV9yZWxlYXNlX2NvbW1hbmQobWFjLCBjb21tYW5kKTsKKworCXNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUobWFjKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBzbWVfcHJvY2Vzc19tc2coKSAtIFRoZSBtYWluIG1lc3NhZ2UgcHJvY2Vzc29yIGZvciBTTUUuCisKKyAgIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBtZXNzYWdlIGRpc3BhdGNoZXIgd2hlbiB0byBwcm9jZXNzIGEgbWVzc2FnZQorICAgdGFyZ2V0ZWQgZm9yIFNNRS4KKworICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxwYXJhbSBwTXNnIC0gQSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdFNpck1zZ1EuCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIHN1Y2Nlc3NmdWxseSBwcm9jZXNzIHRoZSBtZXNzYWdlLgorCisgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGZhaWxlZCB0byBwcm9jZXNzIHRoZSBtZXNzYWdlIHRvIEhBTC4KKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9wcm9jZXNzX21zZyh0SGFsSGFuZGxlIGhIYWwsIGNkc19tc2dfdCAqcE1zZykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCWlmIChwTXNnID09IE5VTEwpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiRW1wdHkgbWVzc2FnZSBmb3IgU01FIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiTG9ja2luZyBmYWlsZWQsIGJhaWxpbmcgb3V0IikpOworCQlpZiAocE1zZy0+Ym9keXB0cikKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKCFTTUVfSVNfU1RBUlQocE1hYykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgibWVzc2FnZSB0eXBlICVkIGluIHN0b3Agc3RhdGUgaWdub3JlZCIpLAorCQkJcE1zZy0+dHlwZSk7CisJCWlmIChwTXNnLT5ib2R5cHRyKQorCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQlnb3RvIHJlbGVhc2VfbG9jazsKKwl9CisJc3dpdGNoIChwTXNnLT50eXBlKSB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWNhc2UgZVdOSV9TTUVfUk9BTV9PRkZMT0FEX1NZTkNIX0lORDoKKwkJY3NyX3Byb2Nlc3Nfcm9hbV9vZmZsb2FkX3N5bmNoX2luZChwTWFjLAorCQkJCShyb2FtX29mZmxvYWRfc3luY2hfaW5kICopIHBNc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfSE9fRkFJTF9JTkQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiTEZSMzogUmN2ZCBlV05JX1NNRV9IT19GQUlMX0lORCIpKTsKKwkJY3NyX3Byb2Nlc3NfaG9fZmFpbF9pbmQocE1hYywgcE1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIGVXTklfUE1DX1NNUFNfU1RBVEVfSU5EOgorCQlicmVhazsKKwljYXNlIFdOSV9DRkdfU0VUX0NORjoKKwljYXNlIFdOSV9DRkdfRE5MRF9DTkY6CisJY2FzZSBXTklfQ0ZHX0dFVF9SU1A6CisJY2FzZSBXTklfQ0ZHX0FERF9HUlBfQUREUl9DTkY6CisJY2FzZSBXTklfQ0ZHX0RFTF9HUlBfQUREUl9DTkY6CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfQUREVFNfUlNQOgorCWNhc2UgZVdOSV9TTUVfREVMVFNfUlNQOgorCWNhc2UgZVdOSV9TTUVfREVMVFNfSU5EOgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJY2FzZSBlV05JX1NNRV9GVF9BR0dSX1FPU19SU1A6CisjZW5kaWYKKwkJLyogUW9TICovCisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCQkJc3RhdHVzID0gc21lX3Fvc19tc2dfcHJvY2Vzc29yKHBNYWMsIHBNc2ctPnR5cGUsCisJCQkJCQkgICAgICAgcE1zZy0+Ym9keXB0cik7CisJCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJYnJlYWs7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJY2FzZSBlV05JX1NNRV9ORUlHSEJPUl9SRVBPUlRfSU5EOgorCWNhc2UgZVdOSV9TTUVfQkVBQ09OX1JFUE9SVF9SRVFfSU5EOgorI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiUmVjZWl2ZWQgUlJNIG1lc3NhZ2UuIE1lc3NhZ2UgSWQgPSAlZCIpLAorCQkJcE1zZy0+dHlwZSk7CisjZW5kaWYKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCXN0YXR1cyA9IHNtZV9ycm1fbXNnX3Byb2Nlc3NvcihwTWFjLCBwTXNnLT50eXBlLAorCQkJCQkJICAgICAgIHBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCS8qIEhhbmRsZSB0aGUgZVdOSV9TTUVfT0VNX0RBVEFfUlNQOiAqLworCWNhc2UgZVdOSV9TTUVfT0VNX0RBVEFfUlNQOgorCQlpZiAocE1zZy0+Ym9keXB0cikgeworCQkJc3RhdHVzID0gc21lX2hhbmRsZV9vZW1fZGF0YV9yc3AocE1hYywgcE1zZy0+Ym9keXB0cik7CisJCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJFbXB0eSBtZXNzYWdlIGZvciAlZCIpLAorCQkJCXBNc2ctPnR5cGUpOworCQl9CisJCXNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUocE1hYyk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBlV05JX1NNRV9BRERfU1RBX1NFTEZfUlNQOgorCQlpZiAocE1zZy0+Ym9keXB0cikgeworCQkJc3RhdHVzID0gY3NyX3Byb2Nlc3NfYWRkX3N0YV9zZXNzaW9uX3JzcChwTWFjLAorCQkJCQkJCQlwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9ERUxfU1RBX1NFTEZfUlNQOgorCQlpZiAocE1zZy0+Ym9keXB0cikgeworCQkJc3RhdHVzID0gY3NyX3Byb2Nlc3NfZGVsX3N0YV9zZXNzaW9uX3JzcChwTWFjLAorCQkJCQkJCQlwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9SRU1BSU5fT05fQ0hOX1JTUDoKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCXN0YXR1cyA9IHNtZV9yZW1haW5fb25fY2huX3JzcChwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9SRU1BSU5fT05fQ0hOX1JEWV9JTkQ6CisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQlzdGF0dXMgPSBzbWVfcmVtYWluX29uX2Nobl9yZWFkeShwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9NR01UX0ZSTV9JTkQ6CisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQlzbWVfbWdtdF9mcm1faW5kKHBNYWMsIHBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGVXTklfU01FX0FDVElPTl9GUkFNRV9TRU5EX0NORjoKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCXN0YXR1cyA9IHNtZV9zZW5kX2FjdGlvbl9jbmYocE1hYywgcE1zZy0+Ym9keXB0cik7CisJCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJFbXB0eSBtZXNzYWdlIGZvciAlZCIpLAorCQkJCXBNc2ctPnR5cGUpOworCQl9CisJCWJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCWNhc2UgZVdOSV9TTUVfUFJFRl9ORVRXT1JLX0ZPVU5EX0lORDoKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCXN0YXR1cyA9IHNtZV9wcmVmZXJyZWRfbmV0d29ya19mb3VuZF9pbmQoKHZvaWQgKilwTWFjLAorCQkJCQkJCQkgcE1zZy0+Ym9keXB0cik7CisJCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJFbXB0eSBtZXNzYWdlIGZvciAlZCIpLAorCQkJCXBNc2ctPnR5cGUpOworCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCWNhc2UgZVdOSV9TTUVfQ0hBTkdFX0NPVU5UUllfQ09ERToKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCXN0YXR1cyA9IHNtZV9oYW5kbGVfY2hhbmdlX2NvdW50cnlfY29kZSgodm9pZCAqKXBNYWMsCisJCQkJCQkJCXBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGVXTklfU01FX0dFTkVSSUNfQ0hBTkdFX0NPVU5UUllfQ09ERToKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCXN0YXR1cyA9IHNtZV9oYW5kbGVfZ2VuZXJpY19jaGFuZ2VfY291bnRyeV9jb2RlKAorCQkJCQkJKHZvaWQgKilwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9TQ0FOX0NNRDoKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCXN0YXR1cyA9IHNtZV9oYW5kbGVfc2Nhbl9yZXEocE1hYywgcE1zZy0+Ym9keXB0cik7CisJCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJFbXB0eSBtZXNzYWdlIGZvciAlZCIpLAorCQkJCXBNc2ctPnR5cGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfUk9DX0NNRDoKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCXN0YXR1cyA9IHNtZV9oYW5kbGVfcm9jX3JlcShoSGFsLCBwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwkvKgorCSAqIGNvbW1hbmQgcmVzY2l2ZWQgZnJvbSBQRSwgU01FIHRkbHMgbXNnIHByb2Nlc3NvciBzaGFsbCBiZSBjYWxsZWQKKwkgKiB0byBwcm9jZXNzIGNvbW1hbmRzIHJlY2lldmVkIGZyb20gUEUKKwkgKi8KKwljYXNlIGVXTklfU01FX1RETFNfU0VORF9NR01UX1JTUDoKKwljYXNlIGVXTklfU01FX1RETFNfQUREX1NUQV9SU1A6CisJY2FzZSBlV05JX1NNRV9URExTX0RFTF9TVEFfUlNQOgorCWNhc2UgZVdOSV9TTUVfVERMU19ERUxfU1RBX0lORDoKKwljYXNlIGVXTklfU01FX1RETFNfREVMX0FMTF9QRUVSX0lORDoKKwljYXNlIGVXTklfU01FX01HTVRfRlJNX1RYX0NPTVBMRVRJT05fSU5EOgorCWNhc2UgZVdOSV9TTUVfVERMU19MSU5LX0VTVEFCTElTSF9SU1A6CisJY2FzZSBlV05JX1NNRV9URExTX1NIT1VMRF9ESVNDT1ZFUjoKKwljYXNlIGVXTklfU01FX1RETFNfU0hPVUxEX1RFQVJET1dOOgorCWNhc2UgZVdOSV9TTUVfVERMU19QRUVSX0RJU0NPTk5FQ1RFRDoKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCXN0YXR1cyA9IHRkbHNfbXNnX3Byb2Nlc3NvcihwTWFjLCBwTXNnLT50eXBlLAorCQkJCQkJICAgIHBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwljYXNlIGVXTklfU01FX1VOUFJPVF9NR01UX0ZSTV9JTkQ6CisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQlzbWVfdW5wcm90ZWN0ZWRfbWdtdF9mcm1faW5kKHBNYWMsIHBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKwljYXNlIGVXTklfU01FX1RTTV9JRV9JTkQ6CisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQlzbWVfdHNtX2llX2luZChwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAmJiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworCWNhc2UgZVdOSV9TTUVfUk9BTV9TQ0FOX09GRkxPQURfUlNQOgorCQlzdGF0dXMgPSBjc3Jfcm9hbV9vZmZsb2FkX3NjYW5fcnNwX2hkbHIoKHZvaWQgKilwTWFjLAorCQkJCQkJCXBNc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCWNhc2UgZVdOSV9QTUNfR1RLX09GRkxPQURfR0VUSU5GT19SU1A6CisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQlzbWVfcHJvY2Vzc19nZXRfZ3RrX2luZm9fcnNwKHBNYWMsIHBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9MUEhCCisJLyogTFBIQiB0aW1lb3V0IGluZGljYXRpb24gYXJyaXZlZCwgc2VuZCBJTkQgdG8gY2xpZW50ICovCisJY2FzZSBlV05JX1NNRV9MUEhCX0lORDoKKwkJaWYgKHBNYWMtPnNtZS5wTHBoYkluZENiKQorCQkJcE1hYy0+c21lLnBMcGhiSW5kQ2IocE1hYy0+aEhkZCwgcE1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0xQSEIgKi8KKworCWNhc2UgZVdOSV9TTUVfUkVBRFlfVE9fU1VTUEVORF9JTkQ6CisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQlzbWVfcHJvY2Vzc19yZWFkeV90b19zdXNwZW5kKHBNYWMsIHBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRVhUV09XX1NVUFBPUlQKKwljYXNlIGVXTklfU01FX1JFQURZX1RPX0VYVFdPV19JTkQ6CisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQlzbWVfcHJvY2Vzc19yZWFkeV90b19leHRfd29fdyhwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQKKwkvKiBjaGFubmVsIGF2b2lkIG1lc3NhZ2UgYXJyaXZlZCwgc2VuZCBJTkQgdG8gY2xpZW50ICovCisJY2FzZSBlV05JX1NNRV9DSF9BVk9JRF9JTkQ6CisJCWlmIChwTWFjLT5zbWUucENoQXZvaWROb3RpZmljYXRpb25DYikgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTCgiQ0ggYXZvaWQgbm90aWZpY2F0aW9uIikpOworCQkJcE1hYy0+c21lLnBDaEF2b2lkTm90aWZpY2F0aW9uQ2IocE1hYy0+aEhkZCwKKwkJCQkJCQkgcE1zZy0+Ym9keXB0cik7CisJCX0KKwkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgorCWNhc2UgZVdOSV9TTUVfQVVUT19TSFVURE9XTl9JTkQ6CisJCWlmIChwTWFjLT5zbWUucEF1dG9TaHV0ZG93bk5vdGlmaWNhdGlvbkNiKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgRkwoIkF1dG8gc2h1dGRvd24gbm90aWZpY2F0aW9uIikpOworCQkJcE1hYy0+c21lLnBBdXRvU2h1dGRvd25Ob3RpZmljYXRpb25DYigpOworCQl9CisJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIGVXTklfU01FX0RGU19SQURBUl9GT1VORDoKKwljYXNlIGVXTklfU01FX0RGU19DU0FJRV9UWF9DT01QTEVURV9JTkQ6CisJCXN0YXR1cyA9IGRmc19tc2dfcHJvY2Vzc29yKHBNYWMsIHBNc2ctPnR5cGUsIHBNc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfQ0hBTk5FTF9DSEFOR0VfUlNQOgorCQlpZiAocE1zZy0+Ym9keXB0cikgeworCQkJc3RhdHVzID0gc21lX3Byb2Nlc3NfY2hhbm5lbF9jaGFuZ2VfcmVzcChwTWFjLAorCQkJCQkJCQkgcE1zZy0+dHlwZSwKKwkJCQkJCQkJIHBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUCisJY2FzZSBlV05JX1NNRV9TVEFUU19FWFRfRVZFTlQ6CisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQlzdGF0dXMgPSBzbWVfc3RhdHNfZXh0X2V2ZW50KGhIYWwsIHBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCWNhc2UgZVdOSV9TTUVfTElOS19TUEVFRF9JTkQ6CisJCWlmIChwTWFjLT5zbWUucExpbmtTcGVlZEluZENiKQorCQkJcE1hYy0+c21lLnBMaW5rU3BlZWRJbmRDYihwTXNnLT5ib2R5cHRyLAorCQkJCQkJcE1hYy0+c21lLnBMaW5rU3BlZWRDYkNvbnRleHQpOworCQlpZiAocE1zZy0+Ym9keXB0cikKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9DU0FfT0ZGTE9BRF9FVkVOVDoKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCWNzcl9zY2FuX2ZsdXNoX2Jzc19lbnRyeShwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkFOCisJY2FzZSBlV05JX1NNRV9OQU5fRVZFTlQ6CisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQlzbWVfbmFuX2V2ZW50KGhIYWwsIHBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9OQU4gKi8KKwljYXNlIGVXTklfU01FX0xJTktfU1RBVFVTX0lORDoKKwl7CisJCXRBbmlHZXRMaW5rU3RhdHVzICpwTGlua1N0YXR1cyA9CisJCQkodEFuaUdldExpbmtTdGF0dXMgKikgcE1zZy0+Ym9keXB0cjsKKwkJaWYgKHBMaW5rU3RhdHVzKSB7CisJCQlpZiAocE1hYy0+c21lLmxpbmtTdGF0dXNDYWxsYmFjaykgeworCQkJCXBNYWMtPnNtZS5saW5rU3RhdHVzQ2FsbGJhY2soCisJCQkJCXBMaW5rU3RhdHVzLT5saW5rU3RhdHVzLAorCQkJCQlwTWFjLT5zbWUubGlua1N0YXR1c0NvbnRleHQpOworCQkJfQorCQkJcE1hYy0+c21lLmxpbmtTdGF0dXNDYWxsYmFjayA9IE5VTEw7CisJCQlwTWFjLT5zbWUubGlua1N0YXR1c0NvbnRleHQgPSBOVUxMOworCQkJY2RmX21lbV9mcmVlKHBMaW5rU3RhdHVzKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBlV05JX1NNRV9NU0dfR0VUX1RFTVBFUkFUVVJFX0lORDoKKwkJaWYgKHBNYWMtPnNtZS5wR2V0VGVtcGVyYXR1cmVDYikgeworCQkJcE1hYy0+c21lLnBHZXRUZW1wZXJhdHVyZUNiKHBNc2ctPmJvZHl2YWwsCisJCQkJCXBNYWMtPnNtZS5wVGVtcGVyYXR1cmVDYkNvbnRleHQpOworCQl9CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfU05SX0lORDoKKwl7CisJCXRBbmlHZXRTbnJSZXEgKnBTbnJSZXEgPSAodEFuaUdldFNuclJlcSAqKSBwTXNnLT5ib2R5cHRyOworCQlpZiAocFNuclJlcSkgeworCQkJaWYgKHBTbnJSZXEtPnNuckNhbGxiYWNrKSB7CisJCQkJKCh0Q3NyU25yQ2FsbGJhY2spCisJCQkJIChwU25yUmVxLT5zbnJDYWxsYmFjaykpCisJCQkJCShwU25yUmVxLT5zbnIsIHBTbnJSZXEtPnN0YUlkLAorCQkJCQlwU25yUmVxLT5wRGV2Q29udGV4dCk7CisJCQl9CisJCQljZGZfbWVtX2ZyZWUocFNuclJlcSk7CisJCX0KKwkJYnJlYWs7CisJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisJY2FzZSBlV05JX1NNRV9FWFRTQ0FOX0ZVTExfU0NBTl9SRVNVTFRfSU5EOgorCQlpZiAocE1hYy0+c21lLnBFeHRTY2FuSW5kQ2IpCisJCQlwTWFjLT5zbWUucEV4dFNjYW5JbmRDYihwTWFjLT5oSGRkLAorCQkJCQllU0lSX0VYVFNDQU5fRlVMTF9TQ0FOX1JFU1VMVF9JTkQsCisJCQkJCXBNc2ctPmJvZHlwdHIpOworCQllbHNlCisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoImNhbGxiYWNrIG5vdCByZWdpc3RlcmVkIHRvIHByb2Nlc3MgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKworCQljZGZfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfRVBOT19ORVRXT1JLX0ZPVU5EX0lORDoKKwkJaWYgKHBNYWMtPnNtZS5wRXh0U2NhbkluZENiKQorCQkJcE1hYy0+c21lLnBFeHRTY2FuSW5kQ2IocE1hYy0+aEhkZCwKKwkJCQkJZVNJUl9FUE5PX05FVFdPUktfRk9VTkRfSU5ELAorCQkJCQlwTXNnLT5ib2R5cHRyKTsKKwkJZWxzZQorCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJjYWxsYmFjayBub3QgcmVnaXN0ZXJlZCB0byBwcm9jZXNzICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisKKwkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgZVdOSV9TTUVfRldfRFVNUF9JTkQ6CisJCXNtZV9wcm9jZXNzX2Z3X21lbV9kdW1wX3JzcChwTWFjLCBwTXNnKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9TRVRfSFdfTU9ERV9SRVNQOgorCQlpZiAocE1zZy0+Ym9keXB0cikgeworCQkJc3RhdHVzID0gc21lX3Byb2Nlc3Nfc2V0X2h3X21vZGVfcmVzcChwTWFjLAorCQkJCQkJCQlwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9IV19NT0RFX1RSQU5TX0lORDoKKwkJaWYgKHBNc2ctPmJvZHlwdHIpIHsKKwkJCXN0YXR1cyA9IHNtZV9wcm9jZXNzX2h3X21vZGVfdHJhbnNfaW5kKHBNYWMsCisJCQkJCQkJCXBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGVXTklfU01FX05TU19VUERBVEVfUlNQOgorCQlpZiAocE1zZy0+Ym9keXB0cikgeworCQkJc3RhdHVzID0gc21lX3Byb2Nlc3NfbnNzX3VwZGF0ZV9yZXNwKHBNYWMsCisJCQkJCQkJCXBNc2ctPmJvZHlwdHIpOworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRW1wdHkgbWVzc2FnZSBmb3IgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGVXTklfU01FX09DQl9TRVRfQ09ORklHX1JTUDoKKwkJaWYgKHBNYWMtPnNtZS5vY2Jfc2V0X2NvbmZpZ19jYWxsYmFjaykgeworCQkJcE1hYy0+c21lLm9jYl9zZXRfY29uZmlnX2NhbGxiYWNrKAorCQkJCXBNYWMtPnNtZS5vY2Jfc2V0X2NvbmZpZ19jb250ZXh0LAorCQkJCXBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkiTWVzc2FnZSBlcnJvci4gVGhlIGNhbGxiYWNrIGlzIE5VTEwuIikpOworCQl9CisJCXBNYWMtPnNtZS5vY2Jfc2V0X2NvbmZpZ19jYWxsYmFjayA9IE5VTEw7CisJCXBNYWMtPnNtZS5vY2Jfc2V0X2NvbmZpZ19jb250ZXh0ID0gTlVMTDsKKwkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX09DQl9HRVRfVFNGX1RJTUVSX1JTUDoKKwkJaWYgKHBNYWMtPnNtZS5vY2JfZ2V0X3RzZl90aW1lcl9jYWxsYmFjaykgeworCQkJcE1hYy0+c21lLm9jYl9nZXRfdHNmX3RpbWVyX2NhbGxiYWNrKAorCQkJCXBNYWMtPnNtZS5vY2JfZ2V0X3RzZl90aW1lcl9jb250ZXh0LAorCQkJCXBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkiTWVzc2FnZSBlcnJvci4gVGhlIGNhbGxiYWNrIGlzIE5VTEwuIikpOworCQl9CisJCXBNYWMtPnNtZS5vY2JfZ2V0X3RzZl90aW1lcl9jYWxsYmFjayA9IE5VTEw7CisJCXBNYWMtPnNtZS5vY2JfZ2V0X3RzZl90aW1lcl9jb250ZXh0ID0gTlVMTDsKKwkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0RDQ19HRVRfU1RBVFNfUlNQOgorCQlpZiAocE1hYy0+c21lLmRjY19nZXRfc3RhdHNfY2FsbGJhY2spIHsKKwkJCXBNYWMtPnNtZS5kY2NfZ2V0X3N0YXRzX2NhbGxiYWNrKAorCQkJCXBNYWMtPnNtZS5kY2NfZ2V0X3N0YXRzX2NvbnRleHQsCisJCQkJcE1zZy0+Ym9keXB0cik7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKAorCQkJCSJNZXNzYWdlIGVycm9yLiBUaGUgY2FsbGJhY2sgaXMgTlVMTC4iKSk7CisJCX0KKwkJcE1hYy0+c21lLmRjY19nZXRfc3RhdHNfY2FsbGJhY2sgPSBOVUxMOworCQlwTWFjLT5zbWUuZGNjX2dldF9zdGF0c19jb250ZXh0ID0gTlVMTDsKKwkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0RDQ19VUERBVEVfTkRMX1JTUDoKKwkJaWYgKHBNYWMtPnNtZS5kY2NfdXBkYXRlX25kbF9jYWxsYmFjaykgeworCQkJcE1hYy0+c21lLmRjY191cGRhdGVfbmRsX2NhbGxiYWNrKAorCQkJCXBNYWMtPnNtZS5kY2NfdXBkYXRlX25kbF9jb250ZXh0LAorCQkJCXBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkiTWVzc2FnZSBlcnJvci4gVGhlIGNhbGxiYWNrIGlzIE5VTEwuIikpOworCQl9CisJCXBNYWMtPnNtZS5kY2NfdXBkYXRlX25kbF9jYWxsYmFjayA9IE5VTEw7CisJCXBNYWMtPnNtZS5kY2NfdXBkYXRlX25kbF9jb250ZXh0ID0gTlVMTDsKKwkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0RDQ19TVEFUU19FVkVOVDoKKwkJaWYgKHBNYWMtPnNtZS5kY2Nfc3RhdHNfZXZlbnRfY2FsbGJhY2spIHsKKwkJCXBNYWMtPnNtZS5kY2Nfc3RhdHNfZXZlbnRfY2FsbGJhY2soCisJCQkJcE1hYy0+c21lLmRjY19zdGF0c19ldmVudF9jb250ZXh0LAorCQkJCXBNc2ctPmJvZHlwdHIpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgKKwkJCQkiTWVzc2FnZSBlcnJvci4gVGhlIGNhbGxiYWNrIGlzIE5VTEwuIikpOworCQl9CisJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9TRVRfRFVBTF9NQUNfQ0ZHX1JFU1A6CisJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQlzdGF0dXMgPSBzbWVfcHJvY2Vzc19kdWFsX21hY19jb25maWdfcmVzcChwTWFjLAorCQkJCQlwTXNnLT5ib2R5cHRyKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVtcHR5IG1lc3NhZ2UgZm9yICVkIiksCisJCQkJCXBNc2ctPnR5cGUpOworCQl9CisJY2FzZSBlV05JX1NNRV9TRVRfVEhFUk1BTF9MRVZFTF9JTkQ6CisJCWlmIChwTWFjLT5zbWUuc2V0X3RoZXJtYWxfbGV2ZWxfY2IpCisJCQlwTWFjLT5zbWUuc2V0X3RoZXJtYWxfbGV2ZWxfY2IocE1hYy0+aEhkZCwKKwkJCQkJCQkJcE1zZy0+Ym9keXZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisKKwkJaWYgKChwTXNnLT50eXBlID49IGVXTklfU01FX01TR19UWVBFU19CRUdJTikKKwkJICAgICYmIChwTXNnLT50eXBlIDw9IGVXTklfU01FX01TR19UWVBFU19FTkQpKSB7CisJCQkvKiBDU1IgKi8KKwkJCWlmIChwTXNnLT5ib2R5cHRyKSB7CisJCQkJc3RhdHVzID0gY3NyX21zZ19wcm9jZXNzb3IoaEhhbCwgcE1zZy0+Ym9keXB0cik7CisJCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQkJfSBlbHNlIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJFbXB0eSBtZXNzYWdlIGZvciAlZCIpLAorCQkJCXBNc2ctPnR5cGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiVW5rbm93biBtZXNzYWdlIHR5cGUgJWQiKSwKKwkJCQlwTXNnLT50eXBlKTsKKwkJCWlmIChwTXNnLT5ib2R5cHRyKQorCQkJCWNkZl9tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKwkJfQorCX0gLyogc3dpdGNoICovCityZWxlYXNlX2xvY2s6CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcHJvY2Vzc19uc3NfdXBkYXRlX3Jlc3AoKSAtIFByb2Nlc3MgbnNzIHVwZGF0ZSByZXNwb25zZQorICogQG1hYzogR2xvYmFsIE1BQyBwb2ludGVyCisgKiBAbXNnOiBuc3MgdXBkYXRlIHJlc3BvbnNlCisgKgorICogUHJvY2Vzc2VzIHRoZSBuc3MgdXBkYXRlIHJlc3BvbnNlIGFuZCBpbnZva2VzIHRoZSBIREQKKyAqIGNhbGxiYWNrIHRvIHByb2Nlc3MgZnVydGhlcgorICovCitDREZfU1RBVFVTIHNtZV9wcm9jZXNzX25zc191cGRhdGVfcmVzcCh0cEFuaVNpckdsb2JhbCBtYWMsIHVpbnQ4X3QgKm1zZykKK3sKKwl0TGlzdEVsZW0gKmVudHJ5ID0gTlVMTDsKKwl0U21lQ21kICpjb21tYW5kID0gTlVMTDsKKwlib29sIGZvdW5kOworCW5zc191cGRhdGVfY2IgY2FsbGJhY2sgPSBOVUxMOworCXN0cnVjdCBzaXJfYmVhY29uX3R4X2NvbXBsZXRlX3JzcCAqcGFyYW07CisKKwlwYXJhbSA9IChzdHJ1Y3Qgc2lyX2JlYWNvbl90eF9jb21wbGV0ZV9yc3AgKiltc2c7CisJaWYgKCFwYXJhbSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIm5zcyB1cGRhdGUgcmVzcCBwYXJhbSBpcyBOVUxMIikpOworCQkvKiBOb3QgcmV0dXJuaW5nLiBOZWVkIHRvIGNoZWNrIGlmIGFjdGl2ZSBjb21tYW5kIGxpc3QKKwkJICogbmVlZHMgdG8gYmUgZnJlZWQKKwkJICovCisJfQorCisJZW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZtYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LAorCQkJTExfQUNDRVNTX0xPQ0spOworCWlmICghZW50cnkpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJObyBjbWQgZm91bmQgaW4gYWN0aXZlIGxpc3QiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljb21tYW5kID0gR0VUX0JBU0VfQUREUihlbnRyeSwgdFNtZUNtZCwgTGluayk7CisJaWYgKCFjb21tYW5kKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiQmFzZSBhZGRyZXNzIGlzIE5VTEwiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoZV9zbWVfY29tbWFuZF9uc3NfdXBkYXRlICE9IGNvbW1hbmQtPmNvbW1hbmQpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJDb21tYW5kIG1pc21hdGNoISIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNhbGxiYWNrID0gY29tbWFuZC0+dS5uc3NfdXBkYXRlX2NtZC5uc3NfdXBkYXRlX2NiOworCWlmIChjYWxsYmFjaykgeworCQlpZiAoIXBhcmFtKSB7CisJCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCQlGTCgiQ2FsbGJhY2sgZmFpbGVkIHNpbmNlIG5zcyB1cGRhdGUgcGFyYW1zIGlzIE5VTEwiKSk7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCQlGTCgiQ2FsbGluZyBIREQgY2FsbGJhY2sgZm9yIG5zcyB1cGRhdGUgcmVzcG9uc2UiKSk7CisJCQljYWxsYmFjayhjb21tYW5kLT51Lm5zc191cGRhdGVfY21kLmNvbnRleHQsCisJCQkJcGFyYW0tPnR4X3N0YXR1cywKKwkJCQlwYXJhbS0+c2Vzc2lvbl9pZCwKKwkJCQljb21tYW5kLT51Lm5zc191cGRhdGVfY21kLm5leHRfYWN0aW9uKTsKKwkJfQorCX0gZWxzZSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiQ2FsbGJhY2sgZG9lcyBub3QgZXhpc2l0IikpOworCX0KKworCWZvdW5kID0gY3NyX2xsX3JlbW92ZV9lbnRyeSgmbWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgZW50cnksCisJCQlMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKGZvdW5kKSB7CisJCS8qIE5vdyBwdXQgdGhpcyBjb21tYW5kIGJhY2sgb24gdGhlIGF2aWxhYmxlIGNvbW1hbmQgbGlzdCAqLworCQlzbWVfcmVsZWFzZV9jb21tYW5kKG1hYywgY29tbWFuZCk7CisJfQorCXNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUobWFjKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiBObyBuZWVkIHRvIGhvbGQgdGhlIGdsb2JhbCBsb2NrIGhlcmUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCAqLworLyogYWZ0ZXIgc21lX3N0b3AuICovCit2b2lkIHNtZV9mcmVlX21zZyh0SGFsSGFuZGxlIGhIYWwsIGNkc19tc2dfdCAqcE1zZykKK3sKKwlpZiAocE1zZykgeworCQlpZiAocE1zZy0+Ym9keXB0cikgeworCQkJY2RmX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworCQl9CisJfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIHNtZV9zdG9wKCkgLSBTdG9wIGFsbCBTTUUgbW9kdWxlcyBhbmQgcHV0IHRoZW0gYXQgaWRsZSBzdGF0ZQorCisgICBUaGUgZnVuY3Rpb24gc3RvcHMgZWFjaCBtb2R1bGUgaW4gU01FLCBQTUMsIENTUiwgZXRjLiAuIFVwb24KKyAgIHJldHVybiwgYWxsIG1vZHVsZXMgYXJlIGF0IGlkbGUgc3RhdGUgcmVhZHkgdG8gc3RhcnQuCisKKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4KKyAgIFxwYXJhbSB0SGFsU3RvcFR5cGUgLSByZWFzb24gZm9yIHN0b3BwaW5nCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIGlzIHN0b3BwZWQuCisKKyAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIHN0b3AgYnV0IGNhbGxlciBzaG91bGQgc3RpbGwKKyAgIGNvbnNpZGVyIFNNRSBpcyBzdG9wcGVkLgorICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3N0b3AodEhhbEhhbmRsZSBoSGFsLCB0SGFsU3RvcFR5cGUgc3RvcFR5cGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwlDREZfU1RBVFVTIGZhaWxfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfTUJTU0lECisJc3RhdHVzID0gd2xhbnNhcF9zdG9wKGNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkid2xhbnNhcF9zdG9wIGZhaWxlZCBkdXJpbmcgc21lU3RvcCB3aXRoIHN0YXR1cz0lZCIsCisJCQlzdGF0dXMpOworCQlmYWlsX3N0YXR1cyA9IHN0YXR1czsKKwl9CisjZW5kaWYKKworCXAycF9zdG9wKGhIYWwpOworCisJc3RhdHVzID0gY3NyX3N0b3AocE1hYywgc3RvcFR5cGUpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJImNzcl9zdG9wIGZhaWxlZCBkdXJpbmcgc21lU3RvcCB3aXRoIHN0YXR1cz0lZCIsIHN0YXR1cyk7CisJCWZhaWxfc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1cmdlX3NtZV9jbWRfbGlzdChwTWFjKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGZhaWxfc3RhdHVzKSkgeworCQlzdGF0dXMgPSBmYWlsX3N0YXR1czsKKwl9CisKKwlwTWFjLT5zbWUuc3RhdGUgPSBTTUVfU1RBVEVfU1RPUDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIHNtZV9jbG9zZSgpIC0gUmVsZWFzZSBhbGwgU01FIG1vZHVsZXMgYW5kIHRoZWlyIHJlc291cmNlcy4KKworICAgVGhlIGZ1bmN0aW9uIHJlbGVhc2UgZWFjaCBtb2R1bGUgaW4gU01FLCBQTUMsIENTUiwgZXRjLiAuIFVwb24KKyAgIHJldHVybiwgYWxsIG1vZHVsZXMgYXJlIGF0IGNsb3NlZCBzdGF0ZS4KKworICAgTm8gU01FIEFQSXMgY2FuIGJlIGludm9sdmVkIGFmdGVyIHNtZUNsb3NlIGV4Y2VwdCBzbWVPcGVuLgorICAgc21lQ2xvc2UgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIG1hY19jbG9zZS4KKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4KKworICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgaXMgc3VjY2Vzc2Z1bGx5IGNsb3NlLgorCisgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byBiZSBjbG9zZWQgYnV0IGNhbGxlciBzdGlsbCBjYW5ub3QKKyAgIGNhbGwgYW55IG90aGVyIFNNRSBmdW5jdGlvbnMgZXhjZXB0IHNtZU9wZW4uCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfY2xvc2UodEhhbEhhbmRsZSBoSGFsKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJQ0RGX1NUQVRVUyBmYWlsX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAoIXBNYWMpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCS8qIE5vdGU6IHBTZXNzaW9uIHdpbGwgYmUgaW52YWxpZCBmcm9tIGhlcmUgb24sIGRvIG5vdCBhY2Nlc3MgKi8KKwlzdGF0dXMgPSBjc3JfY2xvc2UocE1hYyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiY3NyX2Nsb3NlIGZhaWxlZCBkdXJpbmcgc21lIGNsb3NlIHdpdGggc3RhdHVzPSVkIiwKKwkJCXN0YXR1cyk7CisJCWZhaWxfc3RhdHVzID0gc3RhdHVzOworCX0KKyNpZm5kZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCXN0YXR1cyA9IHdsYW5zYXBfY2xvc2UoY2RzX2dldF9nbG9iYWxfY29udGV4dCgpKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJXTEFOU0FQX2Nsb3NlIGZhaWxlZCBkdXJpbmcgc21lIGNsb3NlIHdpdGggc3RhdHVzPSVkIiwKKwkJCXN0YXR1cyk7CisJCWZhaWxfc3RhdHVzID0gc3RhdHVzOworCX0KKyNlbmRpZgorCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCXN0YXR1cyA9IHNtZV9xb3NfY2xvc2UocE1hYyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiUW9zIGNsb3NlIGZhaWxlZCBkdXJpbmcgc21lIGNsb3NlIHdpdGggc3RhdHVzPSVkIiwKKwkJCXN0YXR1cyk7CisJCWZhaWxfc3RhdHVzID0gc3RhdHVzOworCX0KKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCXN0YXR1cyA9IG9lbV9kYXRhX29lbV9kYXRhX3JlcV9jbG9zZShoSGFsKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJPRU0gREFUQSBSRVEgY2xvc2UgZmFpbGVkIGR1cmluZyBzbWUgY2xvc2Ugd2l0aCBzdGF0dXM9JWQiLAorCQkJc3RhdHVzKTsKKwkJZmFpbF9zdGF0dXMgPSBzdGF0dXM7CisJfQorI2VuZGlmCisJc3RhdHVzID0gc21lX3BzX2Nsb3NlKGhIYWwpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCSJzbWVfcHNfY2xvc2UgZmFpbGVkIGR1cmluZyBzbWVDbG9zZSBzdGF0dXM9JWQiLAorCQkJCXN0YXR1cyk7CisJCWZhaWxfc3RhdHVzID0gc3RhdHVzOworCX0KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXN0YXR1cyA9IHJybV9jbG9zZShoSGFsKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJSUk0gY2xvc2UgZmFpbGVkIGR1cmluZyBzbWUgY2xvc2Ugd2l0aCBzdGF0dXM9JWQiLAorCQkJc3RhdHVzKTsKKwkJZmFpbF9zdGF0dXMgPSBzdGF0dXM7CisJfQorI2VuZGlmCisKKwlzbWVfcDJwX2Nsb3NlKGhIYWwpOworCisJZnJlZV9zbWVfY21kX2xpc3QocE1hYyk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkgICAgKGNkZl9tdXRleF9kZXN0cm95KCZwTWFjLT5zbWUubGtTbWVHbG9iYWxMb2NrKSkpIHsKKwkJZmFpbF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhmYWlsX3N0YXR1cykpIHsKKwkJc3RhdHVzID0gZmFpbF9zdGF0dXM7CisJfQorCisJcE1hYy0+c21lLnN0YXRlID0gU01FX1NUQVRFX1NUT1A7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9zY2FuX3JlcXVlc3QoKSAtIHdyYXBwZXIgZnVuY3Rpb24gdG8gUmVxdWVzdCBhIDExZCBvciBmdWxsIHNjYW4gZnJvbSBDU1IuCisgKiBAaGFsOiAgICAgICAgICBoYWwgZ2xvYmFsIGNvbnRleHQKKyAqIEBzZXNzaW9uX2lkOiAgIHNlc3Npb24gaWQKKyAqIEBzY2FuX3JlcTogICAgIHNjYW4gcmVxCisgKiBAY2FsbGJhY2s6ICAgICBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgc2NhbiBjYWxscyB1cG9uIGZpbmlzaCwgd2lsbCBub3QKKyAqICAgICAgICAgICAgICAgIGJlIGNhbGxlZCBpZiBjc3Jfc2Nhbl9yZXF1ZXN0IHJldHVybnMgZXJyb3IKKyAqIEBjdHg6ICAgICAgICAgIGEgcG9pbnRlciBwYXNzZWQgaW4gZm9yIHRoZSBjYWxsYmFjaworICoKKyAqIFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIFJlcXVlc3QgYSAxMWQgb3IgZnVsbCBzY2FuIGZyb20gQ1NSLiBUaGlzIGlzCisgKiBhbiBhc3luY2hyb25vdXMgY2FsbAorICoKKyAqIFJldHVybjogU3RhdHVzIG9mIG9wZXJhdGlvbgorICovCitDREZfU1RBVFVTIHNtZV9zY2FuX3JlcXVlc3QodEhhbEhhbmRsZSBoYWwsIHVpbnQ4X3Qgc2Vzc2lvbl9pZCwKKwkJdENzclNjYW5SZXF1ZXN0ICpzY2FuX3JlcSwKKwkJY3NyX3NjYW5fY29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqY3R4KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbCk7CisJc3RydWN0IGFuaV9zY2FuX3JlcSAqc2Nhbl9tc2c7CisJY2RzX21zZ190IG1zZzsKKwl1aW50MzJfdCBzY2FuX3JlcV9pZCwgc2Nhbl9jb3VudDsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX1NDQU5fUkVRLCBzZXNzaW9uX2lkLAorCQkgc2Nhbl9yZXEtPnNjYW5UeXBlKSk7CisJaWYgKCFtYWNfY3R4LT5zY2FuLmZTY2FuRW5hYmxlKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoImZTY2FuRW5hYmxlIGZhbHNlIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXNjYW5fY291bnQgPSBjc3JfbGxfY291bnQoJm1hY19jdHgtPnNtZS5zbWVTY2FuQ21kQWN0aXZlTGlzdCk7CisJaWYgKHNjYW5fY291bnQgPj0gbWFjX2N0eC0+c2Nhbi5tYXhfc2Nhbl9jb3VudCkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJNYXggc2NhbiByZWFjaGVkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXdtYV9nZXRfc2Nhbl9pZCgmc2Nhbl9yZXFfaWQpOworCXNjYW5fcmVxLT5zY2FuX2lkID0gc2Nhbl9yZXFfaWQ7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmbWFjX2N0eC0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIlVuYWJsZSB0byBhY3F1aXJlIGxvY2siKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXNtc19sb2cobWFjX2N0eCwgTE9HMSwgRkwoIiBjYWxsZWQiKSk7CisJc2Nhbl9tc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IGFuaV9zY2FuX3JlcSkpOworCWlmIChOVUxMID09IHNjYW5fbXNnKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCSIgc2Nhbl9yZXE6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW0gZm9yIG1zZyIpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjX2N0eC0+c21lKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJc2Nhbl9tc2ctPm1zZ190eXBlID0gZVdOSV9TTUVfU0NBTl9DTUQ7CisJc2Nhbl9tc2ctPm1zZ19sZW4gPSAodWludDE2X3QpIHNpemVvZihzdHJ1Y3QgYW5pX3NjYW5fcmVxKTsKKwlzY2FuX21zZy0+c2Vzc2lvbl9pZCA9IHNlc3Npb25faWQ7CisJc2Nhbl9tc2ctPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJc2Nhbl9tc2ctPmN0eCA9IGN0eDsKKwlzY2FuX21zZy0+c2Nhbl9wYXJhbSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0Q3NyU2NhblJlcXVlc3QpKTsKKwlpZiAoTlVMTCA9PSBzY2FuX21zZy0+c2Nhbl9wYXJhbSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkic2Nhbl9yZXE6ZmFpbGVkIHRvIGFsbG9jYXRlIG1lbSBmb3Igc2NhbnJlcSIpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjX2N0eC0+c21lKTsKKwkJY2RmX21lbV9mcmVlKHNjYW5fbXNnKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJY3NyX3NjYW5fY29weV9yZXF1ZXN0KG1hY19jdHgsIHNjYW5fbXNnLT5zY2FuX3BhcmFtLCBzY2FuX3JlcSk7CisJbXNnLnR5cGUgPSBlV05JX1NNRV9TQ0FOX0NNRDsKKwltc2cuYm9keXB0ciA9IHNjYW5fbXNnOworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHl2YWwgPSAwOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfU01FLCAmbXNnKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkiIHNtZV9zY2FuX3JlcSBmYWlsZWQgdG8gcG9zdCBtc2ciKTsKKwkJY3NyX3NjYW5fZnJlZV9yZXF1ZXN0KG1hY19jdHgsIHNjYW5fbXNnLT5zY2FuX3BhcmFtKTsKKwkJY2RmX21lbV9mcmVlKHNjYW5fbXNnKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZtYWNfY3R4LT5zbWUpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfc2Nhbl9nZXRfcmVzdWx0CisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IHNjYW4gcmVzdWx0cyBmcm9tIENTUi4KKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgIFxwYXJhbSBwRmlsdGVyIC0gSWYgcEZpbHRlciBpcyBOVUxMLCBhbGwgY2FjaGVkIHJlc3VsdHMgYXJlIHJldHVybmVkCisgICAgXHBhcmFtIHBoUmVzdWx0IC0gYW4gb2JqZWN0IGZvciB0aGUgcmVzdWx0LgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NjYW5fZ2V0X3Jlc3VsdCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJICAgICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwRmlsdGVyLAorCQkJICAgICAgIHRTY2FuUmVzdWx0SGFuZGxlICpwaFJlc3VsdCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TQ0FOX0dFVF9SRVNVTFRTLCBzZXNzaW9uSWQsCisJCQkgMCkpOworCXNtc19sb2cocE1hYywgTE9HMiwgRkwoImVudGVyIikpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzdGF0dXMgPSBjc3Jfc2Nhbl9nZXRfcmVzdWx0KGhIYWwsIHBGaWx0ZXIsIHBoUmVzdWx0KTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXNtc19sb2cocE1hYywgTE9HMiwgRkwoImV4aXQgc3RhdHVzICVkIiksIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9nZXRfYXBfY2hhbm5lbF9mcm9tX3NjYW5fY2FjaGUoKSAtIGEgd3JhcHBlciBmdW5jdGlvbiB0byBnZXQgQVAncworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBpZCBmcm9tIENTUiBieSBmaWx0ZXJpbmcgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgd2hpY2ggbWF0Y2hlcyBvdXIgcm9hbSBwcm9maWxlLgorICogQHByb2ZpbGU6IFNBUCBhZGFwdGVyCisgKiBAYXBfY2hubF9pZDogcG9pbnRlciB0byBjaGFubmVsIGlkIG9mIFNBUC4gRmlsbCB0aGUgdmFsdWUgYWZ0ZXIgZmluZGluZyB0aGUKKyAqICAgICAgICAgICAgICBiZXN0IGFwIGZyb20gc2NhbiBjYWNoZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHdyaXR0ZW4gdG8gZ2V0IEFQJ3MgY2hhbm5lbCBpZCBmcm9tIENTUiBieSBmaWx0ZXJpbmcKKyAqIHRoZSByZXN1bHQgd2hpY2ggbWF0Y2hlcyBvdXIgcm9hbSBwcm9maWxlLiBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMuCisgKi8KK0NERl9TVEFUVVMgc21lX2dldF9hcF9jaGFubmVsX2Zyb21fc2Nhbl9jYWNoZSh0SGFsSGFuZGxlIGhhbF9oYW5kbGUsCisJCQkJCXRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSwKKwkJCQkJdFNjYW5SZXN1bHRIYW5kbGUgKnNjYW5fY2FjaGUsCisJCQkJCXVpbnQ4X3QgKmFwX2NobmxfaWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsX2hhbmRsZSk7CisJdENzclNjYW5SZXN1bHRGaWx0ZXIgKnNjYW5fZmlsdGVyID0gTlVMTDsKKwl0U2NhblJlc3VsdEhhbmRsZSBmaWx0ZXJlZF9zY2FuX3Jlc3VsdCA9IE5VTEw7CisJdFNpckJzc0Rlc2NyaXB0aW9uIGZpcnN0X2FwX3Byb2ZpbGU7CisKKwlpZiAoTlVMTCA9PSBtYWNfY3R4KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMKCJtYWNfY3R4IGlzIE5VTEwiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc2Nhbl9maWx0ZXIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKwlpZiAoTlVMTCA9PSBzY2FuX2ZpbHRlcikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgic2Nhbl9maWx0ZXIgbWVtIGFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0gZWxzZSB7CisJCWNkZl9tZW1fc2V0KHNjYW5fZmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpLCAwKTsKKwkJY2RmX21lbV9zZXQoJmZpcnN0X2FwX3Byb2ZpbGUsIHNpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pLCAwKTsKKworCQlpZiAoTlVMTCA9PSBwcm9maWxlKSB7CisJCQlzY2FuX2ZpbHRlci0+RW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisJCQlzY2FuX2ZpbHRlci0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0KKwkJCQk9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisJCX0gZWxzZSB7CisJCQkvKiBIZXJlIGlzIHRoZSBwcm9maWxlIHdlIG5lZWQgdG8gY29ubmVjdCB0byAqLworCQkJc3RhdHVzID0gY3NyX3JvYW1fcHJlcGFyZV9maWx0ZXJfZnJvbV9wcm9maWxlKG1hY19jdHgsCisJCQkJCXByb2ZpbGUsCisJCQkJCXNjYW5fZmlsdGVyKTsKKwkJfQorCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCQkvKiBTYXZlIHRoZSBXUFMgaW5mbyAqLworCQkJaWYgKE5VTEwgIT0gcHJvZmlsZSkgeworCQkJCXNjYW5fZmlsdGVyLT5iV1BTQXNzb2NpYXRpb24gPQorCQkJCQkJIHByb2ZpbGUtPmJXUFNBc3NvY2lhdGlvbjsKKwkJCQlzY2FuX2ZpbHRlci0+Yk9TRU5Bc3NvY2lhdGlvbiA9CisJCQkJCQkgcHJvZmlsZS0+Yk9TRU5Bc3NvY2lhdGlvbjsKKwkJCX0gZWxzZSB7CisJCQkJc2Nhbl9maWx0ZXItPmJXUFNBc3NvY2lhdGlvbiA9IDA7CisJCQkJc2Nhbl9maWx0ZXItPmJPU0VOQXNzb2NpYXRpb24gPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoIlByZXBhcmluZyB0aGUgcHJvZmlsZSBmaWx0ZXIgZmFpbGVkIikpOworCQkJY2RmX21lbV9mcmVlKHNjYW5fZmlsdGVyKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCX0KKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmbWFjX2N0eC0+c21lKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlzdGF0dXMgPSBjc3Jfc2Nhbl9nZXRfcmVzdWx0KGhhbF9oYW5kbGUsIHNjYW5fZmlsdGVyLAorCQkJCQkgICZmaWx0ZXJlZF9zY2FuX3Jlc3VsdCk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCQljc3JfZ2V0X2Jzc2Rlc2NyX2Zyb21fc2Nhbl9oYW5kbGUoZmlsdGVyZWRfc2Nhbl9yZXN1bHQsCisJCQkJCSZmaXJzdF9hcF9wcm9maWxlKTsKKwkJCSpzY2FuX2NhY2hlID0gZmlsdGVyZWRfc2Nhbl9yZXN1bHQ7CisJCQlpZiAoMCAhPSBmaXJzdF9hcF9wcm9maWxlLmNoYW5uZWxJZCkgeworCQkJCSphcF9jaG5sX2lkID0gZmlyc3RfYXBfcHJvZmlsZS5jaGFubmVsSWQ7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTCgiRm91bmQgYmVzdCBBUCAmIGl0cyBvbiBjaG5sWyVkXSIpLAorCQkJCQkgIGZpcnN0X2FwX3Byb2ZpbGUuY2hhbm5lbElkKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIG1lYW5zIHNjYW4gcmVzdWx0IGlzIGVtcHR5CisJCQkJICogc28gc2V0IHRoZSBjaGFubmVsIHRvIHplcm8sIGNhbGxlciBzaG91bGQKKwkJCQkgKiB0YWtlIG9mIHplcm8gY2hhbm5lbCBpZCBjYXNlLgorCQkJCSAqLworCQkJCSphcF9jaG5sX2lkID0gMDsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgIEZMKCJTY2FuIGlzIGVtcHR5LCBzZXQgY2hubCB0byAwIikpOworCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJfQorCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCUZMKCJGYWlsZWQgdG8gZ2V0IHNjYW4gZ2V0IHJlc3VsdCIpKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCWNzcl9mcmVlX3NjYW5fZmlsdGVyKG1hY19jdHgsIHNjYW5fZmlsdGVyKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoIkFxdWlyaW5nIGxvY2sgZmFpbGVkIikpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZGZfbWVtX2ZyZWUoc2Nhbl9maWx0ZXIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfc3RvcmVfam9pbnJlcV9wYXJhbSgpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIHBhc3Mgc3RhdGlvbidzIGpvaW4KKyAqIHJlcXVlc3QgdG8gc3RvcmUgdG8gY3NyLgorICogQGhhbF9oYW5kbGU6IHBvaW50ZXIgdG8gaGFsIGNvbnRleHQuCisgKiBAcHJvZmlsZTogcG9pbnRlciB0byBzdGF0aW9uJ3Mgcm9hbSBwcm9maWxlLgorICogQHNjYW5fY2FjaGU6IHBvaW50ZXIgdG8gc3RhdGlvbidzIHNjYW4gY2FjaGUuCisgKiBAcm9hbV9pZDogcmVmZXJlbmNlIHRvIHJvYW1faWQgdmFyaWFibGUgYmVpbmcgcGFzc2VkLgorICogQHNlc3Npb25faWQ6IHN0YXRpb24ncyBzZXNzaW9uIGlkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBwYXNzIHN0YXRpb24ncyBqb2luIHJlcXVlc3QgZnVydGhlciBkb3duIHRvIGNzcgorICogdG8gc3RvcmUgaXQuIHRoaXMgc3RvcmVkIHBhcmFtZXRlciB3aWxsIGJlIHVzZWQgbGF0ZXIuCisgKgorICogUmV0dXJuOiB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGZ1bmN0aW9uJ3Mgb3ZlcmFsbCBzdWNjZXNzLgorICoqLworYm9vbCBzbWVfc3RvcmVfam9pbnJlcV9wYXJhbSh0SGFsSGFuZGxlIGhhbF9oYW5kbGUsCisJCXRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSwKKwkJdFNjYW5SZXN1bHRIYW5kbGUgc2Nhbl9jYWNoZSwKKwkJdWludDMyX3QgKnJvYW1faWQsCisJCXVpbnQzMl90IHNlc3Npb25faWQpCit7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbF9oYW5kbGUpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJYm9vbCByZXRfc3RhdHVzID0gdHJ1ZTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQlUUkFDRV9DT0RFX1NNRV9SWF9IRERfU1RPUkVfSk9JTl9SRVEsCisJCQlzZXNzaW9uX2lkLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJaWYgKGZhbHNlID09IGNzcl9zdG9yZV9qb2lucmVxX3BhcmFtKG1hY19jdHgsIHByb2ZpbGUsCisJCQkJCXNjYW5fY2FjaGUsIHJvYW1faWQsIHNlc3Npb25faWQpKSB7CisJCQlyZXRfc3RhdHVzID0gZmFsc2U7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJfSBlbHNlIHsKKwkJcmV0X3N0YXR1cyA9IGZhbHNlOworCX0KKworCXJldHVybiByZXRfc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9jbGVhcl9qb2lucmVxX3BhcmFtKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgcGFzcyBzdGF0aW9uJ3MgY2xlYXIKKyAqIHRoZSBqb2luIHJlcXVlc3QgdG8gY3NyLgorICogQGhhbF9oYW5kbGU6IHBvaW50ZXIgdG8gaGFsIGNvbnRleHQuCisgKiBAc2Vzc2lvbl9pZDogc3RhdGlvbidzIHNlc3Npb24gaWQuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHBhc3Mgc3RhdGlvbidzIGNsZWFyIGpvaW4gcmVxdWVzdCBmdXJ0aGVyIGRvd24gdG8gY3NyCisgKiB0byBjbGVhbnVwLgorICoKKyAqIFJldHVybjogdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBmdW5jdGlvbidzIG92ZXJhbGwgc3VjY2Vzcy4KKyAqKi8KK2Jvb2wgc21lX2NsZWFyX2pvaW5yZXFfcGFyYW0odEhhbEhhbmRsZSBoYWxfaGFuZGxlLAorCQl1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWxfaGFuZGxlKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCWJvb2wgcmV0X3N0YXR1cyA9IHRydWU7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJCVRSQUNFX0NPREVfU01FX1JYX0hERF9DTEVBUl9KT0lOX1JFUSwKKwkJCQlzZXNzaW9uX2lkLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJaWYgKGZhbHNlID09IGNzcl9jbGVhcl9qb2lucmVxX3BhcmFtKG1hY19jdHgsCisJCQkJCXNlc3Npb25faWQpKSB7CisJCQlyZXRfc3RhdHVzID0gZmFsc2U7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJfSBlbHNlIHsKKwkJcmV0X3N0YXR1cyA9IGZhbHNlOworCX0KKworCXJldHVybiByZXRfc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9pc3N1ZV9zdG9yZWRfam9pbnJlcSgpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGlzc3VlcyBzdGF0aW9uJ3Mgc3RvcmVkCisgKiB0aGUgam9pbiByZXF1ZXN0IHRvIGNzci4KKyAqIEBoYWxfaGFuZGxlOiBwb2ludGVyIHRvIGhhbCBjb250ZXh0LgorICogQHJvYW1faWQ6IHJlZmVyZW5jZSB0byByb2FtX2lkIHZhcmlhYmxlIGJlaW5nIHBhc3NlZC4KKyAqIEBzZXNzaW9uX2lkOiBzdGF0aW9uJ3Mgc2Vzc2lvbiBpZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaXNzdWUgc3RhdGlvbidzIHN0b3JlZCBqb2luIHJlcXVlc3QgZnVydGhlciBkb3duIHRvIGNzcgorICogdG8gcHJvY2VlZCBmb3J3YXJkLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9yIENERl9TVEFUVVNfRV9GQUlMVVJFLgorICoqLworQ0RGX1NUQVRVUyBzbWVfaXNzdWVfc3RvcmVkX2pvaW5yZXEodEhhbEhhbmRsZSBoYWxfaGFuZGxlLAorCQl1aW50MzJfdCAqcm9hbV9pZCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsX2hhbmRsZSk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwlDREZfU1RBVFVTIHJldF9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJCVRSQUNFX0NPREVfU01FX1JYX0hERF9JU1NVRV9KT0lOX1JFUSwKKwkJCQlzZXNzaW9uX2lkLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjc3JfaXNzdWVfc3RvcmVkX2pvaW5yZXEobWFjX2N0eCwKKwkJCQkJcm9hbV9pZCwKKwkJCQkJc2Vzc2lvbl9pZCkpIHsKKwkJCXJldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjX2N0eC0+c21lKTsKKwl9IGVsc2UgeworCQljc3JfY2xlYXJfam9pbnJlcV9wYXJhbShtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwkJcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gcmV0X3N0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zY2FuX2ZsdXNoX3Jlc3VsdAorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gY2xlYXIgc2NhbiByZXN1bHRzLgorICAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2Nhbl9mbHVzaF9yZXN1bHQodEhhbEhhbmRsZSBoSGFsKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX1NDQU5fRkxVU0hfUkVTVUxUUywKKwkJCSAwLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9zY2FuX2ZsdXNoX3Jlc3VsdChoSGFsKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9maWx0ZXJfc2Nhbl9yZXN1bHRzCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byBjbGVhciBzY2FuIHJlc3VsdHMuCisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwKKyAgICBccGFyYW0gdEhhbEhhbmRsZSAtIEhBTCBjb250ZXh0IGhhbmRsZQorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uIGlkCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfZmlsdGVyX3NjYW5fcmVzdWx0cyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TQ0FOX0ZMVVNIX1JFU1VMVFMsCisJCQkgc2Vzc2lvbklkLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWNzcl9zY2FuX2ZpbHRlcl9yZXN1bHRzKHBNYWMpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIHNtZV9zY2FuX2ZsdXNoX3AycF9yZXN1bHQodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TQ0FOX0ZMVVNIX1AyUFJFU1VMVFMsCisJCQkgc2Vzc2lvbklkLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9zY2FuX2ZsdXNoX3NlbGVjdGl2ZV9yZXN1bHQoaEhhbCwgdHJ1ZSk7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfc2Nhbl9yZXN1bHRfZ2V0X2ZpcnN0CisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mCisJc2NhbiByZXN1bHQuCisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwKKyAgICBccGFyYW0gaFNjYW5SZXN1bHQgLSByZXR1cm5lZCBmcm9tIGNzcl9zY2FuX2dldF9yZXN1bHQKKyAgICBccmV0dXJuIHRDc3JTY2FuUmVzdWx0SW5mbyAqIC0gTlVMTCBpZiBubyByZXN1bHQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0Q3NyU2NhblJlc3VsdEluZm8gKnNtZV9zY2FuX3Jlc3VsdF9nZXRfZmlyc3QodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgICAgICB0U2NhblJlc3VsdEhhbmRsZSBoU2NhblJlc3VsdCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0Q3NyU2NhblJlc3VsdEluZm8gKnBSZXQgPSBOVUxMOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX1NDQU5fUkVTVUxUX0dFVEZJUlNULAorCQkJIE5PX1NFU1NJT04sIDApKTsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJcFJldCA9IGNzcl9zY2FuX3Jlc3VsdF9nZXRfZmlyc3QocE1hYywgaFNjYW5SZXN1bHQpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gcFJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zY2FuX3Jlc3VsdF9nZXRfbmV4dAorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IG9mCisJc2NhbiByZXN1bHQuIEl0IGNhbiBiZSBjYWxsZWQgd2l0aG91dCBjYWxsaW5nIGNzcl9zY2FuX3Jlc3VsdF9nZXRfZmlyc3QKKwlmaXJzdAorICAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICAgXHBhcmFtIGhTY2FuUmVzdWx0IC0gcmV0dXJuZWQgZnJvbSBjc3Jfc2Nhbl9nZXRfcmVzdWx0CisgICAgXHJldHVybiBOdWxsIGlmIG5vIHJlc3VsdCBvciByZWFjaCB0aGUgZW5kCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordENzclNjYW5SZXN1bHRJbmZvICpzbWVfc2Nhbl9yZXN1bHRfZ2V0X25leHQodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRDc3JTY2FuUmVzdWx0SW5mbyAqcFJldCA9IE5VTEw7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfU0NBTl9SRVNVTFRfR0VUTkVYVCwKKwkJCSBOT19TRVNTSU9OLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXBSZXQgPSBjc3Jfc2Nhbl9yZXN1bHRfZ2V0X25leHQocE1hYywgaFNjYW5SZXN1bHQpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gcFJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zY2FuX3Jlc3VsdF9wdXJnZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmVtb3ZlIGFsbCBpdGVtcyh0Q3NyU2NhblJlc3VsdCkKKwlpbiB0aGUgbGlzdCBhbmQgZnJlZSBtZW1vcnkgZm9yIGVhY2ggaXRlbQorICAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICAgXHBhcmFtIGhTY2FuUmVzdWx0IC0gcmV0dXJuZWQgZnJvbSBjc3Jfc2Nhbl9nZXRfcmVzdWx0LiBoU2NhblJlc3VsdCBpcworCQkJIGNvbnNpZGVyZWQgZ29uZSBieQorICAgIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbmQgZXZlbiBiZWZvcmUgdGhpcyBmdW5jdGlvbiByZXV0cm5zLgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NjYW5fcmVzdWx0X3B1cmdlKHRIYWxIYW5kbGUgaEhhbCwgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5SZXN1bHQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfU0NBTl9SRVNVTFRfUFVSR0UsCisJCQkgTk9fU0VTU0lPTiwgMCkpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzdGF0dXMgPSBjc3Jfc2Nhbl9yZXN1bHRfcHVyZ2UoaEhhbCwgaFNjYW5SZXN1bHQpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3NjYW5fZ2V0X3Bta2lkX2NhbmRpZGF0ZV9saXN0CisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXR1cm4gdGhlIFBNS0lEIGNhbmRpZGF0ZSBsaXN0CisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwKKyAgICBccGFyYW0gcFBta2lkTGlzdCAtIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHBvaW50IHRvIGFuIGFycmF5IG9mCisJCQl0UG1raWRDYW5kaWRhdGVJbmZvCisgICAgXHBhcmFtIHBOdW1JdGVtcyAtIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgbnVtYmVyIG9mCisJCSAgICAgICB0UG1raWRDYW5kaWRhdGVJbmZvIGFsbG9jYXRlZCB3aGVuIHJldHJ1bmluZywgdGhpcyBpcworCQkgICAgICAgZWl0aGVyIHRoZSBudW1iZXIgbmVlZGVkIG9yIG51bWJlciBvZiBpdGVtcyBwdXQgaW50bworCQkgICAgICAgcFBta2lkTGlzdAorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QKKwkJCSBiaWcgZW5vdWdoIGFuZCBwTnVtSXRlbXMKKwkJCSBoYXMgdGhlIG51bWJlciBvZiB0UG1raWRDYW5kaWRhdGVJbmZvLgorICAgIFxOb3RlOiBwTnVtSXRlbXMgaXMgYSBudW1iZXIgb2YgdFBta2lkQ2FuZGlkYXRlSW5mbywKKwkgICBub3Qgc2l6ZW9mKHRQbWtpZENhbmRpZGF0ZUluZm8pICogc29tZXRoaW5nCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2Nhbl9nZXRfcG1raWRfY2FuZGlkYXRlX2xpc3QodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgICB0UG1raWRDYW5kaWRhdGVJbmZvICpwUG1raWRMaXN0LAorCQkJCQkgICAgIHVpbnQzMl90ICpwTnVtSXRlbXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJCWNzcl9zY2FuX2dldF9wbWtpZF9jYW5kaWRhdGVfbGlzdChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICBwUG1raWRMaXN0LAorCQkJCQkJCSAgcE51bUl0ZW1zKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworZUNzclBoeU1vZGUgc21lX2dldF9waHlfbW9kZSh0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X2NoYW5uZWxfYm9uZGluZ19tb2RlNV9nCisgICAgXGJyaWVmIGdldCB0aGUgY2hhbm5lbCBib25kaW5nIG1vZGUgZm9yIDVHIGJhbmQKKyAgICBccGFyYW0gaEhhbCAtIEhBTCBoYW5kbGUKKyAgICBccmV0dXJuIGNoYW5uZWwgYm9uZGluZyBtb2RlIGZvciA1RworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQzMl90IHNtZV9nZXRfY2hhbm5lbF9ib25kaW5nX21vZGU1X2codEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0U21lQ29uZmlnUGFyYW1zIHNtZUNvbmZpZzsKKworCXNtZV9nZXRfY29uZmlnX3BhcmFtKHBNYWMsICZzbWVDb25maWcpOworCisJcmV0dXJuIHNtZUNvbmZpZy5jc3JDb25maWcuY2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9nZXRfY2hhbm5lbF9ib25kaW5nX21vZGUyNF9nCisgICAgXGJyaWVmIGdldCB0aGUgY2hhbm5lbCBib25kaW5nIG1vZGUgZm9yIDIuNEcgYmFuZAorICAgIFxwYXJhbSBoSGFsIC0gSEFMIGhhbmRsZQorICAgIFxyZXR1cm4gY2hhbm5lbCBib25kaW5nIG1vZGUgZm9yIDIuNEcKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1aW50MzJfdCBzbWVfZ2V0X2NoYW5uZWxfYm9uZGluZ19tb2RlMjRfZyh0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRTbWVDb25maWdQYXJhbXMgc21lQ29uZmlnOworCisJc21lX2dldF9jb25maWdfcGFyYW0ocE1hYywgJnNtZUNvbmZpZyk7CisKKwlyZXR1cm4gc21lQ29uZmlnLmNzckNvbmZpZy5jaGFubmVsQm9uZGluZ01vZGUyNEdIejsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9yb2FtX2Nvbm5lY3QKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIGluaXRpdGlhdGUgYW4gYXNzb2NpYXRpb24KKyAgICBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBjYWxsLgorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSB0aGUgc2Vzc2lvbklkIHJldHVybmVkIGJ5IHNtZV9vcGVuX3Nlc3Npb24uCisgICAgXHBhcmFtIHBQcm9maWxlIC0gZGVzY3JpcHRpb24gb2YgdGhlIG5ldHdvcmsgdG8gd2hpY2ggdG8gY29ubmVjdAorICAgIFxwYXJhbSBoQnNzTGlzdEluIC0gYSBsaXN0IG9mIEJTUyBkZXNjcmlwdG9yIHRvIHJvYW0gdG8uIEl0IGlzIHJldHVybmVkCisJCQlmcm9tIGNzcl9zY2FuX2dldF9yZXN1bHQKKyAgICBccGFyYW0gcFJvYW1JZCAtIHRvIGdldCBiYWNrIHRoZSByZXF1ZXN0IElECisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcm9hbV9jb25uZWN0KHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdWludDMyX3QgKnBSb2FtSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAoIXBNYWMpIHsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19DT05ORUNULCBzZXNzaW9uSWQsIDApKTsKKwlzbXNfbG9nKHBNYWMsIExPRzIsIEZMKCJlbnRlciIpKTsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCXN0YXR1cyA9CisJCQkJY3NyX3JvYW1fY29ubmVjdChwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLAorCQkJCQkJIHBSb2FtSWQpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiaW52YWxpZCBzZXNzaW9uSUQgJWQiKSwKKwkJCQlzZXNzaW9uSWQpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0gZWxzZSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoInNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrIGZhaWxlZCIpKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfc2V0X3BoeV9tb2RlCisKKyAgICBcYnJpZWYgQ2hhbmdlcyB0aGUgUGh5TW9kZS4KKworICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIFxwYXJhbSBwaHlNb2RlIG5ldyBwaHlNb2RlIHdoaWNoIGlzIHRvIHNldAorCisgICAgXHJldHVybiBDREZfU1RBVFVTICBTVUNDRVNTLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9waHlfbW9kZSh0SGFsSGFuZGxlIGhIYWwsIGVDc3JQaHlNb2RlIHBoeU1vZGUpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKE5VTEwgPT0gcE1hYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBpbnZhbGlkIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUgPSBwaHlNb2RlOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSA9CisJCWNzcl9nZXRfY2ZnX2RvdDExX21vZGVfZnJvbV9jc3JfcGh5X21vZGUoTlVMTCwKKwkJCQkJCQkgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5waHlNb2RlLAorCQkJCQkJCSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLgorCQkJCQkJCSBQcm9wcmlldGFyeVJhdGVzRW5hYmxlZCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3JvYW1fcmVhc3NvYworICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gaW5pdGl0aWF0ZSBhIHJlLWFzc29jaWF0aW9uCisgICAgXHBhcmFtIHBQcm9maWxlIC0gY2FuIGJlIE5VTEwgdG8gam9pbiB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBBUC4gSW4gdGhhdAorICAgIGNhc2UgbW9kUHJvZmlsZUZpZWxkcyBzaG91bGQgY2FycnkgdGhlIG1vZGlmaWVkIGZpZWxkKHMpIHdoaWNoIGNvdWxkIHRyaWdnZXIKKyAgICByZWFzc29jCisgICAgXHBhcmFtIG1vZFByb2ZpbGVGaWVsZHMgLSBmaWVsZHMgd2hpY2ggYXJlIHBhcnQgb2YgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlCisgICAgdGhhdCBtaWdodCBuZWVkIG1vZGlmaWNhdGlvbiBkeW5hbWljYWxseSBvbmNlIFNUQSBpcyB1cCAmIHJ1bm5pbmcgYW5kIHRoaXMKKyAgICBjb3VsZCB0cmlnZ2VyIGEgcmVhc3NvYworICAgIFxwYXJhbSBwUm9hbUlkIC0gdG8gZ2V0IGJhY2sgdGhlIHJlcXVlc3QgSUQKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcm9hbV9yZWFzc29jKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCSAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgbW9kUHJvZmlsZUZpZWxkcywKKwkJCSAgICB1aW50MzJfdCAqcFJvYW1JZCwgYm9vbCBmRm9yY2UpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9ST0FNX1JFQVNTT0MsIHNlc3Npb25JZCwgMCkpOworCXNtc19sb2cocE1hYywgTE9HMiwgRkwoImVudGVyIikpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQkJaWYgKChOVUxMID09IHBQcm9maWxlKSAmJiAoZkZvcmNlID09IDEpKSB7CisJCQkJc3RhdHVzID0KKwkJCQkJY3NyX3JlYXNzb2MocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJICAgICZtb2RQcm9maWxlRmllbGRzLCBwUm9hbUlkLAorCQkJCQkJICAgIGZGb3JjZSk7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9CisJCQkJCWNzcl9yb2FtX3JlYXNzb2MocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwKKwkJCQkJCQkgbW9kUHJvZmlsZUZpZWxkcywgcFJvYW1JZCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9yb2FtX2Nvbm5lY3RfdG9fbGFzdF9wcm9maWxlCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byBkaXNjb25uZWN0IGFuZCByZWNvbm5lY3Qgd2l0aAorCXRoZSBzYW1lIHByb2ZpbGUKKyAgICBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBjYWxsLgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUy4gSXQgcmV0dXJucyBmYWlsIGlmIGN1cnJlbnRseSBjb25uZWN0ZWQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9yb2FtX2Nvbm5lY3RfdG9fbGFzdF9wcm9maWxlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9ST0FNX0dFVF9DT05ORUNUUFJPRklMRSwKKwkJCSBzZXNzaW9uSWQsIDApKTsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCXN0YXR1cyA9IGNzcl9yb2FtX2Nvbm5lY3RfdG9fbGFzdF9wcm9maWxlKHBNYWMsIHNlc3Npb25JZCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9yb2FtX2Rpc2Nvbm5lY3QKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIGRpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsKKyAgICBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBjYWxsLgorICAgIFxwYXJhbSByZWFzb24gLS0gVG8gaW5kaWNhdGUgdGhlIHJlYXNvbiBmb3IgZGlzY29ubmVjdGluZy4gQ3VycmVudGx5LCBvbmx5CisJCSAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9NSUNfRVJST1IgaXMgbWVhbmZ1bC4KKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9yb2FtX2Rpc2Nvbm5lY3QodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCSAgICAgICBlQ3NyUm9hbURpc2Nvbm5lY3RSZWFzb24gcmVhc29uKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfUk9BTV9ESVNDT05ORUNULCBzZXNzaW9uSWQsCisJCQkgcmVhc29uKSk7CisJc21zX2xvZyhwTWFjLCBMT0cyLCBGTCgiZW50ZXIiKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9kaXNjb25uZWN0KHBNYWMsIHNlc3Npb25JZCwgcmVhc29uKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3JvYW1fc3RvcF9ic3MKKyAgICBcYnJpZWYgVG8gc3RvcCBCU1MgZm9yIFNvZnQgQVAuIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKyAgICBccGFyYW0gaEhhbCAtIEdsb2JhbCBzdHJ1Y3R1cmUKKyAgICBccGFyYW0gc2Vzc2lvbklkIC0gc2Vzc2lvbklkIG9mIFNvZnRBUAorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUyAgU1VDQ0VTUyAgUm9hbSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB0byBpbmRpY2F0ZSBhY3R1YWwgcmVzdWx0cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9yb2FtX3N0b3BfYnNzKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzbXNfbG9nKHBNYWMsIExPRzIsIEZMKCJlbnRlciIpKTsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX3N0b3BfYnNzX2NtZChwTWFjLCBzZXNzaW9uSWQsIHRydWUpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfcm9hbV9kaXNjb25uZWN0X3N0YQorICAgIFxicmllZiBUbyBkaXNhc3NvY2lhdGUgYSBzdGF0aW9uLiBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBBUEkuCisgICAgXHBhcmFtIGhIYWwgLSBHbG9iYWwgc3RydWN0dXJlCisgICAgXHBhcmFtIHNlc3Npb25JZCAtIHNlc3Npb25JZCBvZiBTb2Z0QVAKKyAgICBccGFyYW0gcFBlZXJNYWNBZGRyIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZmlsbGVkIHdpdGggcGVlciBNQUMgYWRkcmVzcyAoNiBieXRlcykKKyAgICBccmV0dXJuIENERl9TVEFUVVMgIFNVQ0NFU1MgIFJvYW0gY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgdG8gaW5kaWNhdGUgYWN0dWFsIHJlc3VsdHMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcm9hbV9kaXNjb25uZWN0X3N0YSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgIGNvbnN0IHVpbnQ4X3QgKnBQZWVyTWFjQWRkcikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZV9zdGFfY21kKHBNYWMsCisJCQkJCXNlc3Npb25JZCwgcFBlZXJNYWNBZGRyLAorCQkJCQllU0lSX01BQ19ERUFVVEhfTEVBVklOR19CU1NfUkVBU09OKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9yb2FtX2RlYXV0aF9zdGEoKSAtIGRlYXV0aGVudGljYXRlIGEgc3RhdGlvbgorICogQGhIYWw6ICAgICAgICAgIEdsb2JhbCBzdHJ1Y3R1cmUKKyAqIEBzZXNzaW9uSWQ6ICAgICBTZXNzaW9uSWQgb2YgU29mdEFQCisgKiBAcERlbFN0YVBhcmFtczogUG9pbnRlciB0byBwYXJhbWV0ZXJzIG9mIHRoZSBzdGF0aW9uIHRvIGRlYXV0aGVudGljYXRlCisgKgorICogVG8gZGlzYXNzb2NpYXRlIGEgc3RhdGlvbi4gVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3Mgb3IgYW5vdGhlciBDREZfU1RBVFVTIGVycm9yCisgKiAgICAgICAgIGNvZGUgb24gZXJyb3IuIFJvYW0gY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgdG8gaW5kaWNhdGUgYWN0dWFsCisgKiAgICAgICAgIHJlc3VsdAorICovCitDREZfU1RBVFVTIHNtZV9yb2FtX2RlYXV0aF9zdGEodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCSAgICAgICBzdHJ1Y3QgdGFnQ3NyRGVsU3RhUGFyYW1zICpwRGVsU3RhUGFyYW1zKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKE5VTEwgPT0gcE1hYykgeworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQkJc3RhdHVzID0KKwkJCQljc3Jfcm9hbV9pc3N1ZV9kZWF1dGhfc3RhX2NtZChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICAgICAgcERlbFN0YVBhcmFtcyk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9yb2FtX3RraXBfY291bnRlcl9tZWFzdXJlcworICAgIFxicmllZiBUbyBzdGFydCBvciBzdG9wIFRLSVAgY291bnRlciBtZWFzdXJlcy4gVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uSWQgb2YgU29mdEFQCisgICAgXHBhcmFtIHBQZWVyTWFjQWRkciAtIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IGZpbGxlZCB3aXRoIHBlZXIgTUFDIGFkZHJlc3MgKDYgYnl0ZXMpCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3JvYW1fdGtpcF9jb3VudGVyX21lYXN1cmVzKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgYm9vbCBiRW5hYmxlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKE5VTEwgPT0gcE1hYykgeworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQkJc3RhdHVzID0KKwkJCQljc3Jfcm9hbV9pc3N1ZV90a2lwX2NvdW50ZXJfbWVhc3VyZXMocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCQkgICAgIGJFbmFibGUpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfcm9hbV9nZXRfYXNzb2NpYXRlZF9zdGFzCisgICAgXGJyaWVmIFRvIHByb2JlIHRoZSBsaXN0IG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgZnJvbSB2YXJpb3VzIG1vZHVsZXMKKwkgb2YgQ09SRSBzdGFjay4KKyAgICBcVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorICAgIFxwYXJhbSBzZXNzaW9uSWQgICAgLSBzZXNzaW9uSWQgb2YgU29mdEFQCisgICAgXHBhcmFtIG1vZElkICAgICAgICAtIE1vZHVsZSBmcm9tIHdob20gbGlzdCBvZiBhc3NvY2l0YXRlZCBzdGF0aW9ucyBpcworCQkJICB0byBiZSBwcm9iZWQuIElmIGFuIGludmFsaWQgbW9kdWxlIGlzIHBhc3NlZCB0aGVuCisJCQkgIGJ5IGRlZmF1bHQgQ0RGX01PRFVMRV9JRF9QRSB3aWxsIGJlIHByb2JlZC4KKyAgICBccGFyYW0gcFVzckNvbnRleHQgIC0gT3BhcXVlIEhERCBjb250ZXh0CisgICAgXHBhcmFtIHBmblNhcEV2ZW50Q2FsbGJhY2sgIC0gU2FwIGV2ZW50IGNhbGxiYWNrIGluIEhERAorICAgIFxwYXJhbSBwQXNzb2NCdWYgICAgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0byBiZSBmaWxsZWQgd2l0aCBhc3NvY2lhdGQKKwkJCSAgc3RhdGlvbnMgaW5mbworICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9yb2FtX2dldF9hc3NvY2lhdGVkX3N0YXModEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJQ0RGX01PRFVMRV9JRCBtb2RJZCwgdm9pZCAqcFVzckNvbnRleHQsCisJCQkJCXZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssCisJCQkJCXVpbnQ4X3QgKnBBc3NvY1N0YXNCdWYpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQlzdGF0dXMgPQorCQkJCWNzcl9yb2FtX2dldF9hc3NvY2lhdGVkX3N0YXMocE1hYywgc2Vzc2lvbklkLCBtb2RJZCwKKwkJCQkJCQkgICAgIHBVc3JDb250ZXh0LAorCQkJCQkJCSAgICAgcGZuU2FwRXZlbnRDYWxsYmFjaywKKwkJCQkJCQkgICAgIHBBc3NvY1N0YXNCdWYpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfcm9hbV9nZXRfd3BzX3Nlc3Npb25fb3ZlcmxhcAorICAgIFxicmllZiBUbyBnZXQgdGhlIFdQUyBQQkMgc2Vzc2lvbiBvdmVybGFwIGluZm9ybWF0aW9uLgorICAgIFxUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBBUEkuCisgICAgXHBhcmFtIHNlc3Npb25JZCAgICAtIHNlc3Npb25JZCBvZiBTb2Z0QVAKKyAgICBccGFyYW0gcFVzckNvbnRleHQgIC0gT3BhcXVlIEhERCBjb250ZXh0CisgICAgXHBhcmFtIHBmblNhcEV2ZW50Q2FsbGJhY2sgIC0gU2FwIGV2ZW50IGNhbGxiYWNrIGluIEhERAorICAgIFxwUmVtb3ZlTWFjIC0gcG9pbnRlciB0byBNYWMgYWRkcmVzcyB3aGljaCBuZWVkcyB0byBiZSByZW1vdmVkIGZyb20gc2Vzc2lvbgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9yb2FtX2dldF93cHNfc2Vzc2lvbl9vdmVybGFwKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgICB2b2lkICpwVXNyQ29udGV4dCwgdm9pZAorCQkJCQkgICAgKnBmblNhcEV2ZW50Q2FsbGJhY2ssCisJCQkJCSAgICBzdHJ1Y3QgY2RmX21hY19hZGRyIHBSZW1vdmVNYWMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQlzdGF0dXMgPQorCQkJCWNzcl9yb2FtX2dldF93cHNfc2Vzc2lvbl9vdmVybGFwKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQkJIHBVc3JDb250ZXh0LAorCQkJCQkJCQkgcGZuU2FwRXZlbnRDYWxsYmFjaywKKwkJCQkJCQkJIHBSZW1vdmVNYWMpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfcm9hbV9nZXRfY29ubmVjdF9zdGF0ZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGNvbm5lY3Qgc3RhdGUKKwlvZiBSb2FtaW5nCisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwuCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcm9hbV9nZXRfY29ubmVjdF9zdGF0ZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgIGVDc3JDb25uZWN0U3RhdGUgKnBTdGF0ZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQkJc3RhdHVzID0KKwkJCQljc3Jfcm9hbV9nZXRfY29ubmVjdF9zdGF0ZShwTWFjLCBzZXNzaW9uSWQsIHBTdGF0ZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9yb2FtX2dldF9jb25uZWN0X3Byb2ZpbGUKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIHJldHVybiB0aGUgY3VycmVudCBjb25uZWN0CisJcHJvZmlsZS4gQ2FsbGVyIG11c3QgY2FsbCBjc3Jfcm9hbV9mcmVlX2Nvbm5lY3RfcHJvZmlsZSBhZnRlciBpdCBpcyBkb25lCisJYW5kIGJlZm9yZSByZXVzZSBmb3IgYW5vdGhlciBjc3Jfcm9hbV9nZXRfY29ubmVjdF9wcm9maWxlIGNhbGwuCisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwuCisgICAgXHBhcmFtIHBQcm9maWxlIC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgc3RydWN0dXJlCisJCSAgICAgIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZQorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUy4gRmFpbHVyZSBpZiBub3QgY29ubmVjdGVkCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcm9hbV9nZXRfY29ubmVjdF9wcm9maWxlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCXRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcFByb2ZpbGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9ST0FNX0dFVF9DT05ORUNUUFJPRklMRSwKKwkJCSBzZXNzaW9uSWQsIDApKTsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCXN0YXR1cyA9CisJCQkJY3NyX3JvYW1fZ2V0X2Nvbm5lY3RfcHJvZmlsZShwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3JvYW1fZnJlZV9jb25uZWN0X3Byb2ZpbGUKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIGZyZWUgYW5kIHJlaW5pdGlhbGl6ZSB0aGUKKwlwcm9maWxlIHJldHVybmVkIHByZXZpb3VzbHkgYnkgY3NyX3JvYW1fZ2V0X2Nvbm5lY3RfcHJvZmlsZS4KKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbC4KKyAgICBccGFyYW0gcFByb2ZpbGUgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBzdHJ1Y3R1cmUKKwkJICAgICAgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlCisgICAgXHJldHVybiBDREZfU1RBVFVTLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3JvYW1fZnJlZV9jb25uZWN0X3Byb2ZpbGUodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JPQU1fRlJFRV9DT05ORUNUUFJPRklMRSwKKwkJCSBOT19TRVNTSU9OLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9yb2FtX2ZyZWVfY29ubmVjdF9wcm9maWxlKHBNYWMsIHBQcm9maWxlKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9yb2FtX3NldF9wbWtpZF9jYWNoZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIHRoZSBQTUtJRCBjYW5kaWRhdGUgbGlzdAorICAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsLgorICAgIFxwYXJhbSBwUE1LSURDYWNoZSAtIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHBvaW50IHRvIGFuIGFycmF5IG9mCisJCQkgdFBta2lkQ2FjaGVJbmZvCisgICAgXHBhcmFtIG51bUl0ZW1zIC0gYSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgbnVtYmVyIG9mIHRQbWtpZENhY2hlSW5mbworCQkgICAgICBhbGxvY2F0ZWQgd2hlbiByZXRydW5pbmcsIHRoaXMgaXMgZWl0aGVyIHRoZSBudW1iZXIgbmVlZGVkCisJCSAgICAgIG9yIG51bWJlciBvZiBpdGVtcyBwdXQgaW50byBwUE1LSURDYWNoZQorICAgIFxwYXJhbSB1cGRhdGVfZW50aXJlX2NhY2hlIC0gdGhpcyBib29sIHZhbHVlIHNwZWNpZmllcyBpZiB0aGUgZW50aXJlIHBta2lkCisJCQkJIGNhY2hlIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBvciBzaG91bGQgaXQgYmUKKwkJCQkgdXBkYXRlZCBlbnRyeSBieSBlbnRyeS4KKyAgICBccmV0dXJuIENERl9TVEFUVVMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90CisJCQkgYmlnIGVub3VnaCBhbmQgcE51bUl0ZW1zIGhhcyB0aGUgbnVtYmVyIG9mCisJCQkgdFBta2lkQ2FjaGVJbmZvLgorICAgIFxOb3RlOiBwTnVtSXRlbXMgaXMgYSBudW1iZXIgb2YgdFBta2lkQ2FjaGVJbmZvLAorCSAgIG5vdCBzaXplb2YodFBta2lkQ2FjaGVJbmZvKSAqIHNvbWV0aGluZworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3JvYW1fc2V0X3Bta2lkX2NhY2hlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJICAgIHRQbWtpZENhY2hlSW5mbyAqcFBNS0lEQ2FjaGUsCisJCQkJICAgIHVpbnQzMl90IG51bUl0ZW1zLCBib29sIHVwZGF0ZV9lbnRpcmVfY2FjaGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9ST0FNX1NFVF9QTUtJRENBQ0hFLCBzZXNzaW9uSWQsCisJCQkgbnVtSXRlbXMpKTsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCXN0YXR1cyA9CisJCQkJY3NyX3JvYW1fc2V0X3Bta2lkX2NhY2hlKHBNYWMsIHNlc3Npb25JZCwgcFBNS0lEQ2FjaGUsCisJCQkJCQkJIG51bUl0ZW1zLCB1cGRhdGVfZW50aXJlX2NhY2hlKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIHNtZV9yb2FtX2RlbF9wbWtpZF9mcm9tX2NhY2hlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSBjb25zdCB1aW50OF90ICpwQlNTSWQsIGJvb2wgZmx1c2hfY2FjaGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9kZWxfcG1raWRfZnJvbV9jYWNoZShwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICAgICAgIHBCU1NJZCwgZmx1c2hfY2FjaGUpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBcZm4gc21lX3JvYW1fc2V0X3Bza19wbWsKKyAqIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gc2F2ZSBQU0svUE1LCisgKiAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwuCisgKiBccGFyYW0gaEhhbCAtIEdsb2JhbCBzdHJ1Y3R1cmUKKyAqIFxwYXJhbSBzZXNzaW9uSWQgLSBTTUUgc2Vzc2lvbklkCisgKiBccGFyYW0gcFBTS19QTUsgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFBza1tdL1BtaworICogXHBhcmFtIHBta19sZW4gLSBMZW5ndGggY291bGQgYmUgb25seSAxNiBieXRlcyBpbiBjYXNlIGlmIExFQVAKKyAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMuIE5lZWQgdG8gcGFzcyB0aGlzIGluZm9ybWF0aW9uIHRvCisgKiAgICAgICAgICAgICAgICAgIGZpcm13YXJlLgorICogXHJldHVybiBDREZfU1RBVFVTIC1zdGF0dXMgd2hldGhlciBQU0svUE1LIGlzIHNldCBvciBub3QKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK0NERl9TVEFUVVMgc21lX3JvYW1fc2V0X3Bza19wbWsodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQl1aW50OF90ICpwUFNLX1BNSywgc2l6ZV90IHBta19sZW4pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQlzdGF0dXMgPQorCQkJCWNzcl9yb2FtX3NldF9wc2tfcG1rKHBNYWMsIHNlc3Npb25JZCwgcFBTS19QTUssCisJCQkJCQkgICAgIHBta19sZW4pOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3JvYW1fZ2V0X3NlY3VyaXR5X3JlcV9pZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIHRoZSBXUEEgb3IgUlNOIG9yIFdBUEkgSUUgQ1NSCisJcGFzc2VzIHRvIFBFIHRvIEpPSU4gcmVxdWVzdCBvciBTVEFSVF9CU1MgcmVxdWVzdAorICAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsLgorICAgIFxwYXJhbSBwTGVuIC0gY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBoYXMgdGhlIGxlbmd0aCBvZiBwQnVmIGFzIGlucHV0LgorCQkgIFVwb24gcmV0dXJuZWQsICpwTGVuIGhhcyB0aGUgbmVlZGVkIG9yIElFIGxlbmd0aCBpbiBwQnVmLgorICAgIFxwYXJhbSBwQnVmIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBjb250YWluIHRoZSBJRSBmaWVsZCwgaWYgYW55LAorCQkgIHVwb24gcmV0dXJuCisgICAgXHBhcmFtIHNlY1R5cGUgLSBTcGVjaWZpZXMgd2hldGhlciBsb29raW5nIGZvciBXUEEvV1BBMi9XQVBJIElFCisgICAgXHJldHVybiBDREZfU1RBVFVTIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdAorCQkJIGJpZyBlbm91Z2gKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9yb2FtX2dldF9zZWN1cml0eV9yZXFfaWUodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJdWludDMyX3QgKnBMZW4sIHVpbnQ4X3QgKnBCdWYsCisJCQkJCWVDc3JTZWN1cml0eVR5cGUgc2VjVHlwZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQkJc3RhdHVzID0KKwkJCQljc3Jfcm9hbV9nZXRfd3BhX3Jzbl9yZXFfaWUoaEhhbCwgc2Vzc2lvbklkLCBwTGVuLCBwQnVmKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3JvYW1fZ2V0X3NlY3VyaXR5X3JzcF9pZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIHRoZSBXUEEgb3IgUlNOIG9yCisJIFdBUEkgSUUgZnJvbSB0aGUgYmVhY29uIG9yIHByb2JlIHJzcCBpZiBjb25uZWN0ZWQKKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbC4KKyAgICBccGFyYW0gcExlbiAtIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaGFzIHRoZSBsZW5ndGggb2YgcEJ1ZiBhcyBpbnB1dC4KKwkJICBVcG9uIHJldHVybmVkLCAqcExlbiBoYXMgdGhlIG5lZWRlZCBvciBJRSBsZW5ndGggaW4gcEJ1Zi4KKyAgICBccGFyYW0gcEJ1ZiAtIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgY29udGFpbiB0aGUgSUUgZmllbGQsIGlmIGFueSwKKwkJICB1cG9uIHJldHVybgorICAgIFxwYXJhbSBzZWNUeXBlIC0gU3BlY2lmaWVzIHdoZXRoZXIgbG9va2luZyBmb3IgV1BBL1dQQTIvV0FQSSBJRQorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QKKwkJCSBiaWcgZW5vdWdoCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcm9hbV9nZXRfc2VjdXJpdHlfcnNwX2llKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCXVpbnQzMl90ICpwTGVuLCB1aW50OF90ICpwQnVmLAorCQkJCQllQ3NyU2VjdXJpdHlUeXBlIHNlY1R5cGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCXN0YXR1cyA9CisJCQkJY3NyX3JvYW1fZ2V0X3dwYV9yc25fcnNwX2llKHBNYWMsIHNlc3Npb25JZCwgcExlbiwgcEJ1Zik7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3JvYW1fZ2V0X251bV9wbWtpZF9jYWNoZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIG51bWJlciBvZiBQTUtJRCBjYWNoZQorCWVudHJpZXMKKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbC4KKyAgICBccmV0dXJuIHVpbnQzMl90IC0gdGhlIG51bWJlciBvZiBQTUtJRCBjYWNoZSBlbnRyaWVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDMyX3Qgc21lX3JvYW1fZ2V0X251bV9wbWtpZF9jYWNoZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXVpbnQzMl90IG51bVBta2lkQ2FjaGUgPSAwOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQludW1QbWtpZENhY2hlID0KKwkJCQljc3Jfcm9hbV9nZXRfbnVtX3Bta2lkX2NhY2hlKHBNYWMsIHNlc3Npb25JZCk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIG51bVBta2lkQ2FjaGU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfcm9hbV9nZXRfcG1raWRfY2FjaGUKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIHJldHVybiBQTUtJRCBjYWNoZSBmcm9tIENTUgorICAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsLgorICAgIFxwYXJhbSBwTnVtIC0gY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBoYXMgdGhlIHNwYWNlIG9mIHRoZSBudW1iZXIgb2YKKwkJICBwQnVmIHRQbWtpZENhY2hlSW5mbyBhcyBpbnB1dC4gVXBvbiByZXR1cm5lZCwgKnBOdW0gaGFzIHRoZQorCQkgIG5lZWRlZCBvciBhY3R1YWxseSBudW1iZXIgaW4gdFBta2lkQ2FjaGVJbmZvLgorICAgIFxwYXJhbSBwUG1raWRDYWNoZSAtIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgY29udGFpbnMgUE1LSUQgY2FjaGUsIGlmCisJCQkgYW55LCB1cG9uIHJldHVybgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QKKwkJCSBiaWcgZW5vdWdoCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcm9hbV9nZXRfcG1raWRfY2FjaGUodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkgICAgdWludDMyX3QgKnBOdW0sIHRQbWtpZENhY2hlSW5mbyAqcFBta2lkQ2FjaGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9ST0FNX0dFVF9QTUtJRENBQ0hFLCBzZXNzaW9uSWQsCisJCQkgMCkpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQkJc3RhdHVzID0KKwkJCQljc3Jfcm9hbV9nZXRfcG1raWRfY2FjaGUocE1hYywgc2Vzc2lvbklkLCBwTnVtLAorCQkJCQkJCSBwUG1raWRDYWNoZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9nZXRfY29uZmlnX3BhcmFtCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBnZXQgdGhlIGdsb2JhbCBzZXR0aW5ncworCWN1cnJlbnRseSBtYWludGFpbmVkIGJ5IENTUi4KKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbC4KKyAgICBccGFyYW0gcFBhcmFtIC0gY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9nZXRfY29uZmlnX3BhcmFtKHRIYWxIYW5kbGUgaEhhbCwgdFNtZUNvbmZpZ1BhcmFtcyAqcFBhcmFtKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfR0VUX0NPTkZJR1BBUkFNLCBOT19TRVNTSU9OLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9nZXRfY29uZmlnX3BhcmFtKHBNYWMsICZwUGFyYW0tPmNzckNvbmZpZyk7CisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsICIlcyBjc3JfZ2V0X2NvbmZpZ19wYXJhbSBmYWlsZWQiLAorCQkJCV9fZnVuY19fKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCQlwUGFyYW0tPnNhcF9jaGFubmVsX2F2b2lkYW5jZSA9IHBNYWMtPnNhcC5zYXBfY2hhbm5lbF9hdm9pZGFuY2U7CisjZW5kaWYgLyogRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFICovCisJCXBQYXJhbS0+bWF4X2ludGZfY291bnQgPSBwTWFjLT5zbWUubWF4X2ludGZfY291bnQ7CisJCXBQYXJhbS0+ZW5hYmxlU2VsZlJlY292ZXJ5ID0gcE1hYy0+c21lLmVuYWJsZVNlbGZSZWNvdmVyeTsKKwkJcFBhcmFtLT5mX3ByZWZlcl9ub25fZGZzX29uX3JhZGFyID0KKwkJCQkJCXBNYWMtPmZfcHJlZmVyX25vbl9kZnNfb25fcmFkYXI7CisJCXBQYXJhbS0+cG9saWN5X21hbmFnZXJfZW5hYmxlZCA9IHBNYWMtPnBvbGljeV9tYW5hZ2VyX2VuYWJsZWQ7CisJCXBQYXJhbS0+ZmluZV90aW1lX21lYXNfY2FwID0gcE1hYy0+ZmluZV90aW1lX21lYXNfY2FwOworCQlwUGFyYW0tPmR1YWxfbWFjX2ZlYXR1cmVfZGlzYWJsZSA9CisJCQkJCQlwTWFjLT5kdWFsX21hY19mZWF0dXJlX2Rpc2FibGU7CisJCXBQYXJhbS0+aXNfcHNfZW5hYmxlZCA9IHBNYWMtPnNtZS5wc19nbG9iYWxfaW5mby5wc19lbmFibGVkOworCQlwUGFyYW0tPnBub09mZmxvYWQgPSBwTWFjLT5wbm9PZmZsb2FkOworCQlwUGFyYW0tPmZFbmFibGVEZWJ1Z0xvZyA9IHBNYWMtPmZFbmFibGVEZWJ1Z0xvZzsKKwkJcFBhcmFtLT5lbmFibGU1Z0VCVCA9IHBNYWMtPmVuYWJsZTVnRUJUOworCQlwUGFyYW0tPmZfc3RhX21pcmFjYXN0X21jY19yZXN0X3RpbWVfdmFsID0KKwkJCXBNYWMtPmZfc3RhX21pcmFjYXN0X21jY19yZXN0X3RpbWVfdmFsOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9jZmdfc2V0X2ludCgpIC0gU2V0cyB0aGUgY2ZnIHBhcmFtZXRlciB2YWx1ZS4KKyAqIEBoYWw6CUhhbmRsZSB0byBoYWwuCisgKiBAY2ZnX2lkOglDb25maWd1cmF0aW9uIHBhcmFtZXRlciBJRC4KKyAqIEB2YWx1ZTogCXZhbHVlIHRvIGJlIHNhdmVkIGluIHRoZSBjZmcgcGFyYW1ldGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgc3RyaW5nIHZhbHVlIGluIGNmZyBwYXJhbWV0ZXIuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX2NmZ19zZXRfaW50KHRIYWxIYW5kbGUgaGFsLCB1aW50MTZfdCBjZmdfaWQsIHVpbnQzMl90IHZhbHVlKQoreworCXRwQW5pU2lyR2xvYmFsIHBtYWMgPSBQTUFDX1NUUlVDVChoYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBjZmdfc2V0X2ludChwbWFjLCBjZmdfaWQsIHZhbHVlKSkKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9jZmdfc2V0X3N0cigpIC0gU2V0cyB0aGUgY2ZnIHBhcmFtZXRlciBzdHJpbmcuCisgKiBAaGFsOglIYW5kbGUgdG8gaGFsLgorICogQGNmZ19pZDoJQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgSUQuCisgKiBAc3RyOglQb2ludGVyIHRvIHRoZSBzdHJpbmcgYnVmZmVyLgorICogQGxlbmd0aDoJTGVuZ3RoIG9mIHRoZSBzdHJpbmcuCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzdHJpbmcgdmFsdWUgaW4gY2ZnIHBhcmFtZXRlci4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfY2ZnX3NldF9zdHIodEhhbEhhbmRsZSBoYWwsIHVpbnQxNl90IGNmZ19pZCwgdWludDhfdCAqc3RyLAorCQkJICAgdWludDMyX3QgbGVuZ3RoKQoreworCXRwQW5pU2lyR2xvYmFsIHBtYWMgPSBQTUFDX1NUUlVDVChoYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSBjZmdfc2V0X3N0cihwbWFjLCBjZmdfaWQsIHN0ciwgbGVuZ3RoKSkKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9jZmdfZ2V0X2ludCgpIC0gIEdldHMgdGhlIGNmZyBwYXJhbWV0ZXIgdmFsdWUuCisgKiBAaGFsOglIYW5kbGUgdG8gaGFsLgorICogQGNmZ19pZDoJQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgSUQuCisgKiBAY2ZnX3ZhbHVlOglQb2ludGVyIHRvIHZhcmlhYmxlIGluIHdoaWNoIGNmZyB2YWx1ZQorICogCQl3aWxsIGJlIHNhdmVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNmZyBwYXJhbWV0ZXIuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX2NmZ19nZXRfaW50KHRIYWxIYW5kbGUgaGFsLCB1aW50MTZfdCBjZmdfaWQsIHVpbnQzMl90ICpjZmdfdmFsdWUpCit7CisJdHBBbmlTaXJHbG9iYWwgcG1hYyA9IFBNQUNfU1RSVUNUKGhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnX2dldF9pbnQocG1hYywgY2ZnX2lkLCBjZmdfdmFsdWUpKQorCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX2NmZ19nZXRfc3RyKCkgLSBHZXRzIHRoZSBjZmcgcGFyYW1ldGVyIHN0cmluZy4KKyAqIEBoYWw6CUhhbmRsZSB0byBoYWwuCisgKiBAY2ZnX2lkOglDb25maWd1cmF0aW9uIHBhcmFtZXRlciBJRC4KKyAqIEBzdHI6CVBvaW50ZXIgdG8gdGhlIHN0cmluZyBidWZmZXIuCisgKiBAbGVuZ3RoOglQb2ludGVyIHRvIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBjZmcgcGFyYW1ldGVyLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9jZmdfZ2V0X3N0cih0SGFsSGFuZGxlIGhhbCwgdWludDE2X3QgY2ZnX2lkLCB1aW50OF90ICpzdHIsCisJCQkgICB1aW50MzJfdCAqbGVuZ3RoKQoreworCXRwQW5pU2lyR2xvYmFsIHBtYWMgPSBQTUFDX1NUUlVDVChoYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKGVTSVJfU1VDQ0VTUyAhPSB3bGFuX2NmZ19nZXRfc3RyKHBtYWMsIGNmZ19pZCwgc3RyLCBsZW5ndGgpKQorCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2dldF9tb2RpZnlfcHJvZmlsZV9maWVsZHMKKyAgICBcYnJpZWYgSEREIG9yIFNNRSAtIFFPUyBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB2YWx1ZXMgb2YKKyAgICBjb25uZWN0ZWQgcHJvZmlsZSBmaWVsZHMsIGNoYW5naW5nIHdoaWNoIGNhbiBjYXVzZSByZWFzc29jLgorICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQ0ZHIGlzIGRvd25sb2FkZWQgYW5kIFNUQSBpcyBpbiBjb25uZWN0ZWQKKyAgICBzdGF0ZS4gQWxzbywgbWFrZSBzdXJlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgcHJvZmlsZQorICAgIGZpZWxkcyBiZWZvcmUgY2FsbGluZyB0aGUgcmVhc3NvYy4gU28gdGhhdCBwTW9kaWZ5UHJvZmlsZUZpZWxkcyB3aWxsIGhhdmUKKyAgICBhbGwgdGhlIGxhdGVzdCB2YWx1ZXMgcGx1cyB0aGUgb25lKHMpIGhhcyBiZWVuIHVwZGF0ZWQgYXMgcGFydCBvZiByZWFzc29jCisgICAgcmVxdWVzdC4KKyAgICBccGFyYW0gcE1vZGlmeVByb2ZpbGVGaWVsZHMgLSBwb2ludGVyIHRvIHRoZSBjb25uZWN0ZWQgcHJvZmlsZSBmaWVsZHMKKyAgICBjaGFuZ2luZyB3aGljaCBjYW4gY2F1c2UgcmVhc3NvYworCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2dldF9tb2RpZnlfcHJvZmlsZV9maWVsZHModEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqCisJCQkJCSBwTW9kaWZ5UHJvZmlsZUZpZWxkcykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0dFVF9NT0RQUk9GRklFTERTLCBzZXNzaW9uSWQsCisJCQkgMCkpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQkJc3RhdHVzID0KKwkJCQljc3JfZ2V0X21vZGlmeV9wcm9maWxlX2ZpZWxkcyhwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICAgICAgcE1vZGlmeVByb2ZpbGVGaWVsZHMpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiAgc21lX3NldF9kaGNwX3RpbGxfcG93ZXJfYWN0aXZlX2ZsYWcKKyAgICBcYnJpZWYgIFNldHMvQ2xlYXJzIERIQ1AgcmVsYXRlZCBmbGFnIHRvIGRpc2FibGUvZW5hYmxlIGF1dG8gUFMKKyAgICBccGFyYW0gIGhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfc2V0X2RoY3BfdGlsbF9wb3dlcl9hY3RpdmVfZmxhZyh0SGFsSGFuZGxlIGhhbCwgdWludDhfdCBmbGFnKQoreworCXRwQW5pU2lyR2xvYmFsIG1hYyA9IFBNQUNfU1RSVUNUKGhhbCk7CisJc3RydWN0IHBzX2dsb2JhbF9pbmZvICpwc19nbG9iYWxfaW5mbyA9ICZtYWMtPnNtZS5wc19nbG9iYWxfaW5mbzsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NFVF9ESENQX0ZMQUcsIE5PX1NFU1NJT04sCisJCQkJZmxhZykpOworCS8qIFNldC9DbGVhciB0aGUgREhDUCBmbGFnIHdoaWNoIHdpbGwgZGlzYWJsZS9lbmFibGUgYXV0byBQUyAqLworCXBzX2dsb2JhbF9pbmZvLT5yZW1haW5faW5fcG93ZXJfYWN0aXZlX3RpbGxfZGhjcCA9IGZsYWc7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfcmVnaXN0ZXIxMWRfc2Nhbl9kb25lX2NhbGxiYWNrCisgICAgXGJyaWVmICBSZWdpc3RlciBhIHJvdXRpbmUgb2YgdHlwZSBjc3Jfc2Nhbl9jb21wbGV0ZUNhbGxiYWNrIHdoaWNoIGlzCisJY2FsbGVkIHdoZW5ldmVyIGFuIDExZCBzY2FuIGlzIGRvbmUKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgIFxwYXJhbSAgY2FsbGJhY2sgLSAgMTFkIHNjYW4gY29tcGxldGUgcm91dGluZSB0byBiZSByZWdpc3RlcmVkCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcmVnaXN0ZXIxMWRfc2Nhbl9kb25lX2NhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJICAgICAgY3NyX3NjYW5fY29tcGxldGVDYWxsYmFjayBjYWxsYmFjaykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlwTWFjLT5zY2FuLmNhbGxiYWNrMTFkU2NhbkRvbmUgPSBjYWxsYmFjazsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKy8qKgorICogc21lX3JlZ2lzdGVyX29lbV9kYXRhX3JzcF9jYWxsYmFjaygpIC0gUmVnaXN0ZXIgYSByb3V0aW5lIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIHNlbmRfb2VtX2RhdGFfcnNwX21zZworICogQGhfaGFsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQGNhbGxiYWNrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2sgdG8gc2VuZCByZXNwb25zZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gb2VtIGFwcGxpY2F0aW9uLgorICoKKyAqIHNtZV9vZW1fZGF0YV9yc3BfY2FsbGJhY2sgaXMgdXNlZCB0byByZWdpc3RlciBzbWVfc2VuZF9vZW1fZGF0YV9yc3BfbXNnCisgKiBjYWxsYmFjayBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMuCisgKi8KK0NERl9TVEFUVVMgc21lX3JlZ2lzdGVyX29lbV9kYXRhX3JzcF9jYWxsYmFjayh0SGFsSGFuZGxlIGhfaGFsLAorCQkJCXNtZV9zZW5kX29lbV9kYXRhX3JzcF9tc2cgY2FsbGJhY2spCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcG1hYyA9IFBNQUNfU1RSVUNUKGhfaGFsKTsKKworCXBtYWMtPm9lbURhdGEub2VtX2RhdGFfcnNwX2NhbGxiYWNrID0gY2FsbGJhY2s7CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisjZW5kaWYKKworLyoqCisgKiBzbWVfcmVnaXN0ZXJfZnRtX21zZ19wcm9jZXNzb3IoKSAtIHJlZ2lzdGVycyBoZGQgZnRtIG1lc3NhZ2UgcHJvY2Vzc29yCisgKiBmdW5jdGlvbiB0byBNQUMvU1lTCisgKgorICogQGhhbDogICAgICAgIGhhbCBoYW5kbGUKKyAqIEBjYWxsYmFjazogICBoZGQgZnVuY3Rpb24gdGhhdCBoYXMgdG8gYmUgcmVnaXN0ZXJlZAorICoKKyAqIFJldHVybjogdm9pZAorICovCit2b2lkIHNtZV9yZWdpc3Rlcl9mdG1fbXNnX3Byb2Nlc3Nvcih0SGFsSGFuZGxlIGhhbCwKKwkJCQkgICAgaGRkX2Z0bV9tc2dfcHJvY2Vzc29yIGNhbGxiYWNrKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWwpOworCisJaWYgKG1hY19jdHggPT0gTlVMTCkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJtYWNfY3R4IGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisJbWFjX2N0eC0+ZnRtX21zZ19wcm9jZXNzb3JfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlyZXR1cm47Cit9CisKKy8qKgorICogc21lX3dvd19hZGRfcGF0dGVybigpIC0gYWRkIGEgd293IHBhdHRlcm4gaW4gZncKKyAqIEBoSGFsOiBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4KKyAqIEBwYXR0ZXJuOiBwb2ludGVyIHRvIGlucHV0IHBhdHRlcm4KKyAqCisgKiBBZGQgYSBwYXR0ZXJuIGZvciBQYXR0ZXJuIEJ5dGUgTWF0Y2hpbmcgaW4gV29XIG1vZGUuIEZpcm13YXJlIHdpbGwKKyAqIGRvIGEgcGF0dGVybiBtYXRjaCBvbiB0aGVzZSBwYXR0ZXJucyB3aGVuIFdvVyBpcyBlbmFibGVkIGR1cmluZyBzeXN0ZW0KKyAqIHN1c3BlbmQuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX3dvd19hZGRfcGF0dGVybih0SGFsSGFuZGxlIGhhbCwKKwkJCXN0cnVjdCB3b3dfYWRkX3BhdHRlcm4gKnBhdHRlcm4sCisJCQl1aW50OF90IHNlc3Npb25faWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhhbCk7CisJc3RydWN0IHdvd19hZGRfcGF0dGVybiAqcHRybjsKKwl0U2lyUmV0U3RhdHVzIHJldF9jb2RlID0gZVNJUl9TVUNDRVNTOworCXRTaXJNc2dRIG1zZ19xOworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQlUUkFDRV9DT0RFX1NNRV9SWF9IRERfV09XTF9BRERCQ0FTVF9QQVRURVJOLCBzZXNzaW9uX2lkLAorCQkJMCkpOworCXB0cm4gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnB0cm4pKTsKKwlpZiAoTlVMTCA9PSBwdHJuKSB7CisJCXNtc19sb2cocE1hYywgTE9HUCwKKwkJCUZMKCJGYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgV29XTEFOIEFkZCBCY2FzdCBQYXR0ZXJuICIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJKHZvaWQpY2RmX21lbV9jb3B5KHB0cm4sIHBhdHRlcm4sIHNpemVvZigqcHRybikpOworCisJbXNnX3EudHlwZSA9IFdNQV9XT1dfQUREX1BUUk47CisJbXNnX3EucmVzZXJ2ZWQgPSAwOworCW1zZ19xLmJvZHlwdHIgPSBwdHJuOworCW1zZ19xLmJvZHl2YWwgPSAwOworCisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBXTUFfV09XTF9BRERfQkNBU1RfUFRSTiB0byBIQUwiKSk7CisJcmV0X2NvZGUgPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnX3EpOworCWlmIChlU0lSX1NVQ0NFU1MgIT0gcmV0X2NvZGUpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlBvc3RpbmcgV01BX1dPV0xfQUREX0JDQVNUX1BUUk4gZmFpbGVkLCByZWFzb249JVgiKSwKKwkJCXJldF9jb2RlKTsKKwl9CisJcmV0dXJuIHJldF9jb2RlOworfQorCisvKioKKyAqIHNtZV93b3dfZGVsZXRlX3BhdHRlcm4oKSAtIGRlbGV0ZSB1c2VyIGNvbmZpZ3VyZWQgd293IHBhdHRlcm4gaW4gdGFyZ2V0CisgKiBAaEhhbDogaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQHBhdHRlcm46IHBvaW50ZXIgdG8gZGVsZXRlIHBhdHRlcm4gcGFyYW1ldGVyCisgKiBAc2Vzc2lvbklkOiBzZXNzaW9uIGlkCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX3dvd19kZWxldGVfcGF0dGVybih0SGFsSGFuZGxlIGhhbCwKKwkJc3RydWN0IHdvd19kZWxldGVfcGF0dGVybiAqcGF0dGVybiwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhhbCk7CisJc3RydWN0IHdvd19kZWxldGVfcGF0dGVybiAqZGVsZXRlX3B0cm47CisJdFNpclJldFN0YXR1cyByZXRfY29kZSA9IGVTSVJfU1VDQ0VTUzsKKwl0U2lyTXNnUSBtc2dfcTsKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9XT1dMX0RFTEJDQVNUX1BBVFRFUk4sIHNlc3Npb25JZCwKKwkJCSAwKSk7CisJZGVsZXRlX3B0cm4gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKmRlbGV0ZV9wdHJuKSk7CisJaWYgKE5VTEwgPT0gZGVsZXRlX3B0cm4pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dQLAorCQkJRkwoIkZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBXb1dMQU4gRGVsZXRlIEJjYXN0IFBhdHRlcm4gIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwkodm9pZCljZGZfbWVtX2NvcHkoZGVsZXRlX3B0cm4sIHBhdHRlcm4sIHNpemVvZigqZGVsZXRlX3B0cm4pKTsKKwltc2dfcS50eXBlID0gV01BX1dPV19ERUxfUFRSTjsKKwltc2dfcS5yZXNlcnZlZCA9IDA7CisJbXNnX3EuYm9keXB0ciA9IGRlbGV0ZV9wdHJuOworCW1zZ19xLmJvZHl2YWwgPSAwOworCisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBXTUFfV09XTF9ERUxfQkNBU1RfUFRSTiIpKTsKKworCXJldF9jb2RlID0gd21hX3Bvc3RfY3RybF9tc2cocE1hYywgJm1zZ19xKTsKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHJldF9jb2RlKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJQb3N0aW5nIFdNQV9XT1dMX0RFTF9CQ0FTVF9QVFJOIGZhaWxlZCwgcmVhc29uPSVYIiksCisJCQlyZXRfY29kZSk7CisJfQorCXJldHVybiByZXRfY29kZTsKK30KKworLyoqCisgKiBzbWVfZW50ZXJfd293bCgpOiBTTUUgQVBJIGV4cG9zZWQgdG8gSEREIHRvIHJlcXVlc3QgZW5hYmxpbmcgb2YgV09XTCBtb2RlLgorICogQGhhbF9jdHggLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQGVudGVyX3dvd2xfY2FsbGJhY2tfcm91dGluZSAtICBDYWxsYmFjayByb3V0aW5lIHByb3ZpZGVkIGJ5IEhERC4KKyAqCQlVc2VkIGZvciBzdWNjZXNzL2ZhaWx1cmUgbm90aWZpY2F0aW9uIGJ5IFNNRQorICogQGVudGVyX3dvd2xfY2FsbGJhY2tfY29udGV4dCAtIEEgY29va2llIHBhc3NlZCBieSBIREQsIHRoYXQgaXMgcGFzc2VkCisgKgkJYmFjayB0byBIREQgYXQgdGhlIHRpbWUgb2YgY2FsbGJhY2suCisgKiBAd2FrZV9yZWFzb25faW5kX2NiIC0gIENhbGxiYWNrIHJvdXRpbmUgcHJvdmlkZWQgYnkgSERELgorICoJCVVzZWQgZm9yIFdha2UgUmVhc29uIEluZGljYXRpb24gYnkgU01FCisgKiBAd2FrZV9yZWFzb25faW5kX2NiX2N0eCAtIEEgY29va2llIHBhc3NlZCBieSBIREQsIHRoYXQgaXMgcGFzc2VkCisgKgkJYmFjayB0byBIREQgYXQgdGhlIHRpbWUgb2YgY2FsbGJhY2suCisgKgorICogV29XTEFOIHdvcmtzIG9uIHRvcCBvZiBCTVBTIG1vZGUuCisgKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCBpbiBCTVBTIG1vZGUsCisgKiBTTUUgd2lsbCB3aWxsIGNhY2hlIHRoZSBpbmZvcm1hdGlvbiB0aGF0CisgKiBXT1dMIGhhcyBiZWVuIGVuYWJsZWQgYW5kIGF0dGVtcHQgdG8gcHV0IHRoZSBkZXZpY2UKKyAqIGluIEJNUFMuIE9uIGVudHJ5IGludG8gQk1QUywgU01FIHdpbGwgZW5hYmxlIHRoZQorICogV09XTCBtb2RlLgorICogTm90ZSAxOiBJZiB3ZSBleGl0IEJNUFMgbW9kZSAoc29tZW9uZSByZXF1ZXN0cyBmdWxsIHBvd2VyKSwKKyAqIHdlIHdpbGwgTk9UIHJlc3VtZSBXT1dMIHdoZW4gd2UgZ28gYmFjayB0byBCTVBTIGFnYWluLgorICogUmVxdWVzdCBmb3IgZnVsbCBwb3dlciAod2hpbGUgaW4gV09XTCBtb2RlKSBtZWFucyBkaXNhYmxlCisgKiBXT1dMIGFuZCBnbyB0byBmdWxsIHBvd2VyLgorICogTm90ZSAyOiBCb3RoIFVBUFNEIGFuZCBXT1dMIHdvcmsgb24gdG9wIG9mIEJNUFMuCisgKiBPbiBlbnRyeSBpbnRvIEJNUFMsIFNNRSB3aWxsIGdpdmUgcHJpb3JpdHkgdG8gVUFQU0QgYW5kCisgKiBlbmFibGUgb25seSBVQVBTRCBpZiBib3RoIFVBUFNEIGFuZCBXT1dMIGFyZSByZXF1aXJlZC4KKyAqIEN1cnJlbnRseSB0aGVyZSBpcyBubyByZXF1aXJlbWVudCBvciB1c2UgY2FzZSB0byBzdXBwb3J0CisgKiBVQVBTRCBhbmQgV09XTCBhdCB0aGUgc2FtZSB0aW1lLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICoJQ0RGX1NUQVRVU19TVUNDRVNTICBEZXZpY2UgaXMgYWxyZWFkeSBpbiBXb1dMQU4gbW9kZQorICoJQ0RGX1NUQVRVU19FX0ZBSUxVUkUgIERldmljZSBjYW5ub3QgZW50ZXIgV29XTEFOIG1vZGUuCisgKglDREZfU1RBVFVTX1BNQ19QRU5ESU5HICBSZXF1ZXN0IGFjY2VwdGVkLiBTTUUgd2lsbCBlbmFibGUKKyAqCQkJV09XTCBhZnRlciBCTVBTIG1vZGUgaXMgZW50ZXJlZC4KKyAqLworQ0RGX1NUQVRVUyBzbWVfZW50ZXJfd293bCh0SGFsSGFuZGxlIGhhbF9jdHgsCisJCXZvaWQgKCplbnRlcl93b3dsX2NhbGxiYWNrX3JvdXRpbmUpKHZvaWQKKwkJCSpjYWxsYmFja19jb250ZXh0LAorCQkJQ0RGX1NUQVRVUyBzdGF0dXMpLAorCQl2b2lkICplbnRlcl93b3dsX2NhbGxiYWNrX2NvbnRleHQsCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisJCXZvaWQgKCp3YWtlSW5kaWNhdGlvbkNCKSh2b2lkICpjYWxsYmFja19jb250ZXh0LAorCQkJdHBTaXJXYWtlUmVhc29uSW5kCisJCQl3YWtlX3JlYXNvbl9pbmQpLAorCQl2b2lkICp3YWtlSW5kaWNhdGlvbkNCQ29udGV4dCwKKyNlbmRpZiAvKiBXTEFOX1dBS0VVUF9FVkVOVFMgKi8KKwkJdHBTaXJTbWVXb3dsRW50ZXJQYXJhbXMgd293bF9lbnRlcl9wYXJhbXMsCisJCXVpbnQ4X3Qgc2Vzc2lvbl9pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWxfY3R4KTsKKwlzdHJ1Y3QgcHNfZ2xvYmFsX2luZm8gKnBzX2dsb2JhbF9pbmZvID0gJm1hY19jdHgtPnNtZS5wc19nbG9iYWxfaW5mbzsKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0VOVEVSX1dPV0wsIHNlc3Npb25faWQsIDApKTsKKworCS8qIGNhY2hlIHRoZSBXT1dMIGluZm9ybWF0aW9uICovCisJcHNfZ2xvYmFsX2luZm8tPnBzX3BhcmFtc1tzZXNzaW9uX2lkXS53b3dsX2VudGVyX3BhcmFtcyA9CisJCSp3b3dsX2VudGVyX3BhcmFtczsKKwlwc19nbG9iYWxfaW5mby0+cHNfcGFyYW1zW3Nlc3Npb25faWRdLmVudGVyX3dvd2xfY2FsbGJhY2tfcm91dGluZSA9CisJCWVudGVyX3dvd2xfY2FsbGJhY2tfcm91dGluZTsKKwlwc19nbG9iYWxfaW5mby0+cHNfcGFyYW1zW3Nlc3Npb25faWRdLmVudGVyX3dvd2xfY2FsbGJhY2tfY29udGV4dCA9CisJCWVudGVyX3dvd2xfY2FsbGJhY2tfY29udGV4dDsKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKwkvKiBDYWNoZSB0aGUgV2FrZSBSZWFzb24gSW5kaWNhdGlvbiBjYWxsYmFjayBpbmZvcm1hdGlvbiAqLworCXBzX2dsb2JhbF9pbmZvLT5wc19wYXJhbXNbc2Vzc2lvbl9pZF0ud2FrZV9yZWFzb25faW5kX2NiID0KKwkJd2FrZUluZGljYXRpb25DQjsKKwlwc19nbG9iYWxfaW5mby0+cHNfcGFyYW1zW3Nlc3Npb25faWRdLndha2VfcmVhc29uX2luZF9jYl9jdHggPQorCQl3YWtlSW5kaWNhdGlvbkNCQ29udGV4dDsKKyNlbmRpZiAvKiBXTEFOX1dBS0VVUF9FVkVOVFMgKi8KKworCXN0YXR1cyA9IHNtZV9wc19wcm9jZXNzX2NvbW1hbmQobWFjX2N0eCwgc2Vzc2lvbl9pZCwgU01FX1BTX1dPV0xfRU5URVIpOworCXJldHVybiBzdGF0dXM7Cit9CisvKioKKyAqc21lX2V4aXRfd293bCgpOiBTTUUgQVBJIGV4cG9zZWQgdG8gSEREIHRvIHJlcXVlc3QgZXhpdCBmcm9tIFdvV0xBTiBtb2RlLgorICogQGhhbF9jdHggLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQHdvd2xfZXhpdF9wYXJhbXMgLSBDYXJyaWVzIGluZm8gb24gd2hpY2ggc21lc2Vzc2lvbgorICoJCQl3b3dsIGV4aXQgaXMgcmVxdWVzdGVkLgorICoKKyAqIFNNRSB3aWxsIGluaXRpYXRlIGV4aXQgZnJvbSBXb1dMQU4gbW9kZSBhbmQgZGV2aWNlIHdpbGwgYmUKKyAqIHB1dCBpbiBCTVBTIG1vZGUuCisgKiBSZXR1cm4gQ0RGX1NUQVRVUworICoJQ0RGX1NUQVRVU19FX0ZBSUxVUkUgIERldmljZSBjYW5ub3QgZXhpdCBXb1dMQU4gbW9kZS4KKyAqCUNERl9TVEFUVVNfU1VDQ0VTUyAgUmVxdWVzdCBhY2NlcHRlZCB0byBleGl0IFdvV0xBTiBtb2RlLgorICovCitDREZfU1RBVFVTIHNtZV9leGl0X3dvd2wodEhhbEhhbmRsZSBoYWxfY3R4LAorCQl0cFNpclNtZVdvd2xFeGl0UGFyYW1zIHdvd2xfZXhpdF9wYXJhbXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsX2N0eCk7CisJdWludDhfdCBzZXNzaW9uX2lkOworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQlUUkFDRV9DT0RFX1NNRV9SWF9IRERfRVhJVF9XT1dMLCBOT19TRVNTSU9OLCAwKSk7CisJc2Vzc2lvbl9pZCA9IHdvd2xfZXhpdF9wYXJhbXMtPnNlc3Npb25JZDsKKwlzdGF0dXMgPSBzbWVfcHNfcHJvY2Vzc19jb21tYW5kKG1hY19jdHgsIHNlc3Npb25faWQsIFNNRV9QU19XT1dMX0VYSVQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX3JvYW1fc2V0X2tleSgpIC0gVG8gc2V0IGVuY3J5cHRpb24ga2V5LgorICogQGhhbDogICAgICAgICAgIGhhbCBnbG9iYWwgY29udGV4dAorICogQHNlc3Npb25faWQ6ICAgIHNlc3Npb24gaWQKKyAqIEBzZXRfa2V5OiAgICAgICBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdENzclNldENvbnRleHRJbmZvCisgKiBAcHRyX3JvYW1faWQ6ICAgICAgIFVwb24gc3VjY2VzcyByZXR1cm4sIHRoaXMgaXMgdGhlIGlkIGNhbGxlciBjYW4gdXNlIHRvCisgKiAgICAgICAgICAgICAgICAgaWRlbnRpZnkgdGhlIHJlcXVlc3QgaW4gcm9hbWNhbGxiYWNrCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBjb25uZWN0ZWQuIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzCisgKiBBUEkuCisgKgorICogUmV0dXJuOiBTdGF0dXMgb2Ygb3BlcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgc21lX3JvYW1fc2V0X2tleSh0SGFsSGFuZGxlIGhhbCwgIHVpbnQ4X3Qgc2Vzc2lvbl9pZCwKKwkJCSAgICB0Q3NyUm9hbVNldEtleSAqc2V0X2tleSwgdWludDMyX3QgKnB0cl9yb2FtX2lkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbCk7CisJdWludDMyX3Qgcm9hbV9pZDsKKwl1aW50MzJfdCBpOworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisJc3RydWN0IHBzX2dsb2JhbF9pbmZvICpwc19nbG9iYWxfaW5mbyA9ICZtYWNfY3R4LT5zbWUucHNfZ2xvYmFsX2luZm87CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLCBUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX0tFWSwKKwkJCSBzZXNzaW9uX2lkLCAwKSk7CisJaWYgKHNldF9rZXktPmtleUxlbmd0aCA+IENTUl9NQVhfS0VZX0xFTikgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJJbnZhbGlkIGtleSBsZW5ndGggJWQiKSwKKwkJCXNldF9rZXktPmtleUxlbmd0aCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLypPbmNlIFNldGtleSBpcyBkb25lLCB3ZSBjYW4gZ28gaW4gQk1QUyAqLworCWlmIChzZXRfa2V5LT5rZXlMZW5ndGgpCisJCXBzX2dsb2JhbF9pbmZvLT5yZW1haW5faW5fcG93ZXJfYWN0aXZlX3RpbGxfZGhjcCA9IGZhbHNlOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCXJvYW1faWQgPSBHRVRfTkVYVF9ST0FNX0lEKCZtYWNfY3R4LT5yb2FtKTsKKwlpZiAocHRyX3JvYW1faWQpCisJCSpwdHJfcm9hbV9pZCA9IHJvYW1faWQ7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzIsIEZMKCJrZXlMZW5ndGggJWQiKSwgc2V0X2tleS0+a2V5TGVuZ3RoKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2V0X2tleS0+a2V5TGVuZ3RoOyBpKyspCisJCXNtc19sb2cobWFjX2N0eCwgTE9HMiwgRkwoIiUwMngiKSwgc2V0X2tleS0+S2V5W2ldKTsKKworCXNtc19sb2cobWFjX2N0eCwgTE9HMiwgIlxuIHNlc3Npb25faWQ9JWQgcm9hbV9pZD0lZCIsIHNlc3Npb25faWQsCisJCXJvYW1faWQpOworCXNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJaWYgKCFzZXNzaW9uKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25faWQpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjX2N0eC0+c21lKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlpZiAoQ1NSX0lTX0lORlJBX0FQKCZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKQorCSAgICAmJiBzZXRfa2V5LT5rZXlEaXJlY3Rpb24gPT0gZVNJUl9UWF9ERUZBVUxUKSB7CisJCWlmICgoZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDAgPT0gc2V0X2tleS0+ZW5jVHlwZSkKKwkJICAgIHx8IChlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVkgPT0KKwkJCXNldF9rZXktPmVuY1R5cGUpKSB7CisJCQlzZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlID0KKwkJCQllQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk7CisJCX0KKwkJaWYgKChlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQgPT0gc2V0X2tleS0+ZW5jVHlwZSkKKwkJICAgIHx8IChlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZID09CisJCQlzZXRfa2V5LT5lbmNUeXBlKSkgeworCQkJc2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSA9CisJCQkJZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWTsKKwkJfQorCX0KKwlzdGF0dXMgPSBjc3Jfcm9hbV9zZXRfa2V5KG1hY19jdHgsIHNlc3Npb25faWQsIHNldF9rZXksIHJvYW1faWQpOworCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZtYWNfY3R4LT5zbWUpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X3Jzc2kKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgY2xpZW50IGNhbGxzIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gZ2V0CisJUlNTSQorCisgICAgXHBhcmFtIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgICBccGFyYW0gY2FsbGJhY2sgLSBTTUUgc2VuZHMgYmFjayB0aGUgcmVxdWVzdGVkIHN0YXRzIHVzaW5nIHRoZSBjYWxsYmFjaworICAgIFxwYXJhbSBzdGFJZCAtICAgIFRoZSBzdGF0aW9uIElEIGZvciB3aGljaCB0aGUgc3RhdHMgaXMgcmVxdWVzdGVkIGZvcgorICAgIFxwYXJhbSBic3NpZCAtIFRoZSBic3NpZCBvZiB0aGUgY29ubmVjdGVkIHNlc3Npb24KKyAgICBccGFyYW0gbGFzdFJTU0kgLSBSU1NJIHZhbHVlIGF0IHRpbWUgb2YgcmVxdWVzdC4gSW4gY2FzZSBmdyBjYW5ub3QgcHJvdmlkZQorCQkgICAgICBSU1NJLCBkbyBub3QgaG9sZCB1cCBidXQgcmV0dXJuIHRoaXMgdmFsdWUuCisgICAgXHBhcmFtIHBDb250ZXh0IC0gdXNlciBjb250ZXh0IHRvIGJlIHBhc3NlZCBiYWNrIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrCisgICAgXHBhcmFtIHBfY2RzX2NvbnRleHQgLSBjZHMgY29udGV4dAorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2dldF9yc3NpKHRIYWxIYW5kbGUgaEhhbCwKKwkJCXRDc3JSc3NpQ2FsbGJhY2sgY2FsbGJhY2ssCisJCQl1aW50OF90IHN0YUlkLCBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkLCBpbnQ4X3QgbGFzdFJTU0ksCisJCQl2b2lkICpwQ29udGV4dCwgdm9pZCAqcF9jZHNfY29udGV4dCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0dFVF9SU1NJLCBOT19TRVNTSU9OLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9nZXRfcnNzaShwTWFjLCBjYWxsYmFjaywKKwkJCQkgICAgICBzdGFJZCwgYnNzSWQsIGxhc3RSU1NJLAorCQkJCSAgICAgIHBDb250ZXh0LCBwX2Nkc19jb250ZXh0KTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X3NucgorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBjbGllbnQgY2FsbHMgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0bworCWdldCBTTlIKKworICAgIFxwYXJhbSBjYWxsYmFjayAtIFNNRSBzZW5kcyBiYWNrIHRoZSByZXF1ZXN0ZWQgc3RhdHMgdXNpbmcgdGhlIGNhbGxiYWNrCisgICAgXHBhcmFtIHN0YUlkIC0gVGhlIHN0YXRpb24gSUQgZm9yIHdoaWNoIHRoZSBzdGF0cyBpcyByZXF1ZXN0ZWQgZm9yCisgICAgXHBhcmFtIHBDb250ZXh0IC0gdXNlciBjb250ZXh0IHRvIGJlIHBhc3NlZCBiYWNrIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrCisgICAgXHBhcmFtIHBfY2RzX2NvbnRleHQgLSBjZHMgY29udGV4dAorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2dldF9zbnIodEhhbEhhbmRsZSBoSGFsLAorCQkgICAgICAgdENzclNuckNhbGxiYWNrIGNhbGxiYWNrLAorCQkgICAgICAgdWludDhfdCBzdGFJZCwgc3RydWN0IGNkZl9tYWNfYWRkciBic3NJZCwgdm9pZCAqcENvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gY3NyX2dldF9zbnIocE1hYywgY2FsbGJhY2ssIHN0YUlkLCBic3NJZCwgcENvbnRleHQpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X3RzbV9zdGF0cworICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBjbGllbnQgY2FsbHMgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0bworICAgICBnZXQgVFNNIFN0YXRzCisgICAgXHBhcmFtIGNhbGxiYWNrIC0gU01FIHNlbmRzIGJhY2sgdGhlIHJlcXVlc3RlZCBzdGF0cyB1c2luZyB0aGUgY2FsbGJhY2sKKyAgICBccGFyYW0gc3RhSWQgLSBUaGUgc3RhdGlvbiBJRCBmb3Igd2hpY2ggdGhlIHN0YXRzIGlzIHJlcXVlc3RlZCBmb3IKKyAgICBccGFyYW0gcENvbnRleHQgLSB1c2VyIGNvbnRleHQgdG8gYmUgcGFzc2VkIGJhY2sgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2sKKyAgICBccGFyYW0gcF9jZHNfY29udGV4dCAtIGNkcyBjb250ZXh0CisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfZ2V0X3RzbV9zdGF0cyh0SGFsSGFuZGxlIGhIYWwsCisJCQkgICAgIHRDc3JUc21TdGF0c0NhbGxiYWNrIGNhbGxiYWNrLAorCQkJICAgICB1aW50OF90IHN0YUlkLCBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkLAorCQkJICAgICB2b2lkICpwQ29udGV4dCwgdm9pZCAqcF9jZHNfY29udGV4dCwgdWludDhfdCB0aWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9nZXRfdHNtX3N0YXRzKHBNYWMsIGNhbGxiYWNrLAorCQkJCQkgICBzdGFJZCwgYnNzSWQsIHBDb250ZXh0LCBwX2Nkc19jb250ZXh0LAorCQkJCQkgICB0aWQpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2dldF9zdGF0aXN0aWNzCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGNsaWVudCBjYWxscyB0byByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGdldAorICAgIGRpZmZlcmVudCBQSFkgbGV2ZWwgc3RhdGlzdGljcyBmcm9tIENTUi4KKworICAgIFxwYXJhbSByZXF1ZXN0ZXJJZCAtIGRpZmZlcmVudCBjbGllbnQgcmVxdWVzdGluZyBmb3Igc3RhdGlzdGljcywKKwlIREQsIFVNQS9HQU4gZXRjCisgICAgXHBhcmFtIHN0YXRzTWFzayAtIFRoZSBkaWZmZXJlbnQgY2F0ZWdvcnkvY2F0ZWdvcmllcyBvZiBzdGF0cyByZXF1ZXN0ZXIKKwlpcyBsb29raW5nIGZvcgorICAgIFxwYXJhbSBjYWxsYmFjayAtIFNNRSBzZW5kcyBiYWNrIHRoZSByZXF1ZXN0ZWQgc3RhdHMgdXNpbmcgdGhlIGNhbGxiYWNrCisgICAgXHBhcmFtIHBlcmlvZGljaXR5IC0gSWYgcmVxdWVzdGVyIG5lZWRzIHBlcmlvZGljIHVwZGF0ZSBpbiBtaWxsaXNlYywgMCBtZWFucworCQkJIGl0J3MgYW4gb25lIHRpbWUgcmVxdWVzdAorICAgIFxwYXJhbSBjYWNoZSAtIElmIHJlcXVlc3RlciBpcyBoYXBweSB3aXRoIGNhY2hlZCBzdGF0cworICAgIFxwYXJhbSBzdGFJZCAtIFRoZSBzdGF0aW9uIElEIGZvciB3aGljaCB0aGUgc3RhdHMgaXMgcmVxdWVzdGVkIGZvcgorICAgIFxwYXJhbSBwQ29udGV4dCAtIHVzZXIgY29udGV4dCB0byBiZSBwYXNzZWQgYmFjayBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjaworICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzbWUgc2Vzc2lvbiBpbnRlcmZhY2UKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9nZXRfc3RhdGlzdGljcyh0SGFsSGFuZGxlIGhIYWwsCisJCQkgICAgICBlQ3NyU3RhdHNSZXF1ZXN0ZXJUeXBlIHJlcXVlc3RlcklkLAorCQkJICAgICAgdWludDMyX3Qgc3RhdHNNYXNrLCB0Q3NyU3RhdHNDYWxsYmFjayBjYWxsYmFjaywKKwkJCSAgICAgIHVpbnQzMl90IHBlcmlvZGljaXR5LCBib29sIGNhY2hlLCB1aW50OF90IHN0YUlkLAorCQkJICAgICAgdm9pZCAqcENvbnRleHQsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfR0VUX1NUQVRTLCBOT19TRVNTSU9OLAorCQkJIHBlcmlvZGljaXR5KSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCQljc3JfZ2V0X3N0YXRpc3RpY3MocE1hYywgcmVxdWVzdGVySWQsIHN0YXRzTWFzaywgY2FsbGJhY2ssCisJCQkJCSAgIHBlcmlvZGljaXR5LCBjYWNoZSwgc3RhSWQsIHBDb250ZXh0LAorCQkJCQkgICBzZXNzaW9uSWQpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisKK0NERl9TVEFUVVMgc21lX2dldF9saW5rX3N0YXR1cyh0SGFsSGFuZGxlIGhIYWwsCisJCQkgICAgICAgdENzckxpbmtTdGF0dXNDYWxsYmFjayBjYWxsYmFjaywKKwkJCSAgICAgICB2b2lkICpwQ29udGV4dCwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJdEFuaUdldExpbmtTdGF0dXMgKnBNc2c7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodEFuaUdldExpbmtTdGF0dXMpKTsKKwkJaWYgKE5VTEwgPT0gcE1zZykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IE5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbGluayBzdGF0dXMiLAorCQkJCSAgX19mdW5jX18pOworCQkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisKKwkJcE1zZy0+bXNnVHlwZSA9IFdNQV9MSU5LX1NUQVRVU19HRVRfUkVROworCQlwTXNnLT5tc2dMZW4gPSAodWludDE2X3QpIHNpemVvZih0QW5pR2V0TGlua1N0YXR1cyk7CisJCXBNc2ctPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJcE1hYy0+c21lLmxpbmtTdGF0dXNDb250ZXh0ID0gcENvbnRleHQ7CisJCXBNYWMtPnNtZS5saW5rU3RhdHVzQ2FsbGJhY2sgPSBjYWxsYmFjazsKKworCQljZHNfbWVzc2FnZS50eXBlID0gV01BX0xJTktfU1RBVFVTX0dFVF9SRVE7CisJCWNkc19tZXNzYWdlLmJvZHlwdHIgPSBwTXNnOworCQljZHNfbWVzc2FnZS5yZXNlcnZlZCA9IDA7CisKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJCSAgICAoY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJmNkc19tZXNzYWdlKSkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBQb3N0IExJTksgU1RBVFVTIE1TRyBmYWlsIiwgX19mdW5jX18pOworCQkJY2RmX21lbV9mcmVlKHBNc2cpOworCQkJcE1hYy0+c21lLmxpbmtTdGF0dXNDb250ZXh0ID0gTlVMTDsKKwkJCXBNYWMtPnNtZS5saW5rU3RhdHVzQ2FsbGJhY2sgPSBOVUxMOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfZ2V0X2NvdW50cnlfY29kZQorCisgICAgXGJyaWVmIFRvIHJldHVybiB0aGUgY3VycmVudCBjb3VudHJ5IGNvZGUuIElmIG5vIGNvdW50cnkgY29kZSBpcyBhcHBsaWVkLAorCWRlZmF1bHQgY291bnRyeSBjb2RlIGlzIHVzZWQgdG8gZmlsbCB0aGUgYnVmZmVyLgorCUlmIDExZCBzdXBwb3J0ZWQgaXMgdHVybmVkIG9mZiwgYW4gZXJyb3IgaXMgcmV0dXJuIGFuZCB0aGUgbGFzdAorCWFwcGxpZWQvZGVmYXVsdCBjb3VudHJ5IGNvZGUgaXMgdXNlZC4KKwlUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIHBCdWYgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgZm9yIHJldHVybmVkIGNvdW50cnkgY29kZS4KKworICAgIFxwYXJhbSBwYkxlbiAgRm9yIGlucHV0LCB0aGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgaG93IGJpZyBpcyB0aGUgYnVmZmVyLgorCQkgIFVwb24gcmV0dXJuLCB0aGlzIHBhcmFtZXRlciBoYXMgdGhlIG51bWJlciBvZiBieXRlcyBmb3IKKwkJICBjb3VudHJ5LiBJZiBwQnVmIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggc3BhY2UsIHRoaXMgZnVuY3Rpb24KKwkJICByZXR1cm5zIGZhaWwgc3RhdHVzIGFuZCB0aGlzIHBhcmFtZXRlciBjb250YWlucyB0aGUgbnVtYmVyCisJCSAgdGhhdCBpcyBuZWVkZWQuCisKKyAgICBccmV0dXJuIENERl9TVEFUVVMgIFNVQ0NFU1MuCisKKwkJCUZBSUxVUkUgb3IgUkVTT1VSQ0VTICBUaGUgQVBJIGZpbmlzaGVkIGFuZCBmYWlsZWQuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfZ2V0X2NvdW50cnlfY29kZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgKnBCdWYsIHVpbnQ4X3QgKnBiTGVuKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0dFVF9DTlRSWUNPREUsIE5PX1NFU1NJT04sIDApKTsKKworCXJldHVybiBjc3JfZ2V0X2NvdW50cnlfY29kZShwTWFjLCBwQnVmLCBwYkxlbik7Cit9CisKKy8qKgorICogc21lX2FwcGx5X2NoYW5uZWxfcG93ZXJfaW5mb190b19mdygpIC0gc2VuZHMgY2hhbm5lbCBpbmZvIHRvIGZ3CisgKiBAaEhhbDogaGFsIGhhbmRsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIGNoYW5uZWwgcG93ZXIgaW5mbyB0byBmaXJtd2FyZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHNtZV9hcHBseV9jaGFubmVsX3Bvd2VyX2luZm9fdG9fZncodEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCWNzcl9hcHBseV9jaGFubmVsX3Bvd2VyX2luZm9fd3JhcHBlcihwTWFjKTsKK30KKworLyogc29tZSBzdXBwb3J0IGZ1bmN0aW9ucyAqLworYm9vbCBzbWVfaXMxMWRfc3VwcG9ydGVkKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlyZXR1cm4gY3NyX2lzMTFkX3N1cHBvcnRlZChwTWFjKTsKK30KKworYm9vbCBzbWVfaXMxMWhfc3VwcG9ydGVkKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlyZXR1cm4gY3NyX2lzMTFoX3N1cHBvcnRlZChwTWFjKTsKK30KKworYm9vbCBzbWVfaXNfd21tX3N1cHBvcnRlZCh0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJcmV0dXJuIGNzcl9pc193bW1fc3VwcG9ydGVkKHBNYWMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfY2hhbmdlX2NvdW50cnlfY29kZQorCisgICAgXGJyaWVmIENoYW5nZSBDb3VudHJ5IGNvZGUgZnJvbSB1cHBlcmxheWVyIGR1cmluZyBXTEFOIGRyaXZlciBvcGVyYXRpb24uCisJVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIFxwYXJhbSBwQ291bnRyeSBOZXcgQ291bnRyeSBDb2RlIFN0cmluZworCisgICAgXHBhcmFtIHNlbmRSZWdIaW50IElmIHdlIHdhbnQgdG8gc2VuZCByZWcgaGludCB0byBubDgwMjExCisKKyAgICBccmV0dXJuIENERl9TVEFUVVMgIFNVQ0NFU1MuCisKKwkJCUZBSUxVUkUgb3IgUkVTT1VSQ0VTICBUaGUgQVBJIGZpbmlzaGVkIGFuZCBmYWlsZWQuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfY2hhbmdlX2NvdW50cnlfY29kZSh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgdFNtZUNoYW5nZUNvdW50cnlDYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgICB1aW50OF90ICpwQ291bnRyeSwKKwkJCQkgICB2b2lkICpwQ29udGV4dCwKKwkJCQkgICB2b2lkICpwX2Nkc19jb250ZXh0LAorCQkJCSAgIHRBbmlCb29sIGNvdW50cnlGcm9tVXNlclNwYWNlLAorCQkJCSAgIHRBbmlCb29sIHNlbmRSZWdIaW50KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWNkc19tc2dfdCBtc2c7CisJdEFuaUNoYW5nZUNvdW50cnlDb2RlUmVxICpwTXNnOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ0hBTkdFX0NOVFJZQ09ERSwgTk9fU0VTU0lPTiwKKwkJCSAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIiBjYWxsZWQiKSk7CisKKwkJaWYgKChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFkU3VwcG9ydEVuYWJsZWRPcmlnaW5hbCA9PSB0cnVlKQorCQkgICAgJiYgKCFwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLgorCQkJZlN1cHBsaWNhbnRDb3VudHJ5Q29kZUhhc1ByaW9yaXR5KSkgeworCisJCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkJIlNldCBDb3VudHJ5IENvZGUgRmFpbCBzaW5jZSB0aGUgU1RBIGlzIGFzc29jaWF0ZWQgYW5kIHVzZXJzcGFjZSBkb2VzIG5vdCBoYXZlIHByaW9yaXR5ICIpOworCisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodEFuaUNoYW5nZUNvdW50cnlDb2RlUmVxKSk7CisJCWlmIChOVUxMID09IHBNc2cpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkiIGNzckNoYW5nZUNvdW50cnlDb2RlOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtIGZvciByZXEiKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCisJCXBNc2ctPm1zZ1R5cGUgPSBlV05JX1NNRV9DSEFOR0VfQ09VTlRSWV9DT0RFOworCQlwTXNnLT5tc2dMZW4gPSAodWludDE2X3QpIHNpemVvZih0QW5pQ2hhbmdlQ291bnRyeUNvZGVSZXEpOworCQljZGZfbWVtX2NvcHkocE1zZy0+Y291bnRyeUNvZGUsIHBDb3VudHJ5LCAzKTsKKwkJcE1zZy0+Y291bnRyeUZyb21Vc2VyU3BhY2UgPSBjb3VudHJ5RnJvbVVzZXJTcGFjZTsKKwkJcE1zZy0+c2VuZFJlZ0hpbnQgPSBzZW5kUmVnSGludDsKKwkJcE1zZy0+Y2hhbmdlQ0NDYWxsYmFjayA9IGNhbGxiYWNrOworCQlwTXNnLT5wRGV2Q29udGV4dCA9IHBDb250ZXh0OworCQlwTXNnLT5wX2Nkc19jb250ZXh0ID0gcF9jZHNfY29udGV4dDsKKworCQltc2cudHlwZSA9IGVXTklfU01FX0NIQU5HRV9DT1VOVFJZX0NPREU7CisJCW1zZy5ib2R5cHRyID0gcE1zZzsKKwkJbXNnLnJlc2VydmVkID0gMDsKKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCSAgICBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9TTUUsICZtc2cpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJIiBzbWVfY2hhbmdlX2NvdW50cnlfY29kZSBmYWlsZWQgdG8gcG9zdCBtc2cgdG8gc2VsZiAiKTsKKwkJCWNkZl9tZW1fZnJlZSgodm9pZCAqKXBNc2cpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiIHJldHVybmVkIikpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX2dlbmVyaWNfY2hhbmdlX2NvdW50cnlfY29kZQorCisgICAgXGJyaWVmIENoYW5nZSBDb3VudHJ5IGNvZGUgZnJvbSB1cHBlcmxheWVyIGR1cmluZyBXTEFOIGRyaXZlciBvcGVyYXRpb24uCisJVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIFxwYXJhbSBwQ291bnRyeSBOZXcgQ291bnRyeSBDb2RlIFN0cmluZworCisgICAgXHBhcmFtIHJlZ19kb21haW4gcmVndWxhdG9yeSBkb21haW4KKworICAgIFxyZXR1cm4gQ0RGX1NUQVRVUyAgU1VDQ0VTUy4KKworCQkJRkFJTFVSRSBvciBSRVNPVVJDRVMgIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfZ2VuZXJpY19jaGFuZ2VfY291bnRyeV9jb2RlKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJICAgdWludDhfdCAqcENvdW50cnksCisJCQkJCSAgIHZfUkVHRE9NQUlOX3QgcmVnX2RvbWFpbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgbXNnOworCXRBbmlHZW5lcmljQ2hhbmdlQ291bnRyeUNvZGVSZXEgKnBNc2c7CisKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IHBNYWMgaXMgbnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiIGNhbGxlZCIpKTsKKwkJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0QW5pR2VuZXJpY0NoYW5nZUNvdW50cnlDb2RlUmVxKSk7CisKKwkJaWYgKE5VTEwgPT0gcE1zZykgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCSIgc21lX2dlbmVyaWNfY2hhbmdlX2NvdW50cnlfY29kZTogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbSBmb3IgcmVxIik7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCX0KKworCQlwTXNnLT5tc2dUeXBlID0gZVdOSV9TTUVfR0VORVJJQ19DSEFOR0VfQ09VTlRSWV9DT0RFOworCQlwTXNnLT5tc2dMZW4gPQorCQkJKHVpbnQxNl90KSBzaXplb2YodEFuaUdlbmVyaWNDaGFuZ2VDb3VudHJ5Q29kZVJlcSk7CisJCWNkZl9tZW1fY29weShwTXNnLT5jb3VudHJ5Q29kZSwgcENvdW50cnksIDIpOworCQlwTXNnLT5kb21haW5faW5kZXggPSByZWdfZG9tYWluOworCQlwTXNnLT5jb3VudHJ5Q29kZVsyXSA9ICcgJzsgLyogRm9yIEFTQ0lJIHNwYWNlICovCisKKwkJbXNnLnR5cGUgPSBlV05JX1NNRV9HRU5FUklDX0NIQU5HRV9DT1VOVFJZX0NPREU7CisJCW1zZy5ib2R5cHRyID0gcE1zZzsKKwkJbXNnLnJlc2VydmVkID0gMDsKKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCSAgICBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9TTUUsICZtc2cpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJInNtZV9nZW5lcmljX2NoYW5nZV9jb3VudHJ5X2NvZGUgZmFpbGVkIHRvIHBvc3QgbXNnIHRvIHNlbGYiKTsKKwkJCWNkZl9tZW1fZnJlZShwTXNnKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIiByZXR1cm5lZCIpKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX2RoY3Bfc3RhcnRfaW5kCisKKyAgICBcYnJpZWYgQVBJIHRvIHNpZ25hbCB0aGUgRlcgYWJvdXQgdGhlIERIQ1AgU3RhcnQgZXZlbnQuCisKKyAgICBccGFyYW0gaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZS4KKworICAgIFxwYXJhbSBkZXZpY2VfbW9kZSAtIG1vZGUoQVAsU0FQIGV0Yykgb2YgdGhlIGRldmljZS4KKworICAgIFxwYXJhbSBtYWNBZGRyIC0gTUFDIGFkZHJlc3Mgb2YgdGhlIGFkYXB0ZXIuCisKKyAgICBccGFyYW0gc2Vzc2lvbklkIC0gc2Vzc2lvbiBJRC4KKworICAgIFxyZXR1cm4gQ0RGX1NUQVRVUyAgU1VDQ0VTUy4KKworCQkJRkFJTFVSRSBvciBSRVNPVVJDRVMgIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2RoY3Bfc3RhcnRfaW5kKHRIYWxIYW5kbGUgaEhhbCwKKwkJCSAgICAgIHVpbnQ4X3QgZGV2aWNlX21vZGUsCisJCQkgICAgICB1aW50OF90ICptYWNBZGRyLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKwl0QW5pREhDUEluZCAqcE1zZzsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCQlpZiAoIXBTZXNzaW9uKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwKKwkJCQlzZXNzaW9uSWQpOworCQkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKworCQlwTXNnID0gKHRBbmlESENQSW5kICopIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0QW5pREhDUEluZCkpOworCQlpZiAoTlVMTCA9PSBwTXNnKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkaGNwIHN0YXJ0IiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCQlwTXNnLT5tc2dUeXBlID0gV01BX0RIQ1BfU1RBUlRfSU5EOworCQlwTXNnLT5tc2dMZW4gPSAodWludDE2X3QpIHNpemVvZih0QW5pREhDUEluZCk7CisJCXBNc2ctPmRldmljZV9tb2RlID0gZGV2aWNlX21vZGU7CisJCWNkZl9tZW1fY29weShwTXNnLT5hZGFwdGVyTWFjQWRkciwgbWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCWNkZl9tZW1fY29weShwTXNnLT5wZWVyTWFjQWRkciwKKwkJCSAgICAgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQuYnl0ZXMsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfREhDUF9TVEFSVF9JTkQ7CisJCWNkc19tZXNzYWdlLmJvZHlwdHIgPSBwTXNnOworCQljZHNfbWVzc2FnZS5yZXNlcnZlZCA9IDA7CisKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBQb3N0IERIQ1AgU3RhcnQgTVNHIGZhaWwiLCBfX2Z1bmNfXyk7CisJCQljZGZfbWVtX2ZyZWUocE1zZyk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9kaGNwX3N0b3BfaW5kCisKKyAgICBcYnJpZWYgQVBJIHRvIHNpZ25hbCB0aGUgRlcgYWJvdXQgdGhlIERIQ1AgY29tcGxldGUgZXZlbnQuCisKKyAgICBccGFyYW0gaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZS4KKworICAgIFxwYXJhbSBkZXZpY2VfbW9kZSAtIG1vZGUoQVAsIFNBUCBldGMpIG9mIHRoZSBkZXZpY2UuCisKKyAgICBccGFyYW0gbWFjQWRkciAtIE1BQyBhZGRyZXNzIG9mIHRoZSBhZGFwdGVyLgorCisgICAgXHBhcmFtIHNlc3Npb25JZCAtIHNlc3Npb24gSUQuCisKKyAgICBccmV0dXJuIENERl9TVEFUVVMgIFNVQ0NFU1MuCisJCQlGQUlMVVJFIG9yIFJFU09VUkNFUyAgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfZGhjcF9zdG9wX2luZCh0SGFsSGFuZGxlIGhIYWwsCisJCQkgICAgIHVpbnQ4X3QgZGV2aWNlX21vZGUsCisJCQkgICAgIHVpbnQ4X3QgKm1hY0FkZHIsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCXRBbmlESENQSW5kICpwTXNnOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJCWlmICghcFNlc3Npb24pIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kICIpLAorCQkJCXNlc3Npb25JZCk7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCisJCXBNc2cgPSAodEFuaURIQ1BJbmQgKikgY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBbmlESENQSW5kKSk7CisJCWlmIChOVUxMID09IHBNc2cpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRoY3Agc3RvcCIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCX0KKworCQlwTXNnLT5tc2dUeXBlID0gV01BX0RIQ1BfU1RPUF9JTkQ7CisJCXBNc2ctPm1zZ0xlbiA9ICh1aW50MTZfdCkgc2l6ZW9mKHRBbmlESENQSW5kKTsKKwkJcE1zZy0+ZGV2aWNlX21vZGUgPSBkZXZpY2VfbW9kZTsKKwkJY2RmX21lbV9jb3B5KHBNc2ctPmFkYXB0ZXJNYWNBZGRyLCBtYWNBZGRyLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJY2RmX21lbV9jb3B5KHBNc2ctPnBlZXJNYWNBZGRyLAorCQkJICAgICBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZC5ieXRlcywKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9ESENQX1NUT1BfSU5EOworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gcE1zZzsKKwkJY2RzX21lc3NhZ2UucmVzZXJ2ZWQgPSAwOworCisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogUG9zdCBESENQIFN0b3AgTVNHIGZhaWwiLCBfX2Z1bmNfXyk7CisJCQljZGZfbWVtX2ZyZWUocE1zZyk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3NldF9jZmdfcHJpdmFjeQorICAgIFxicmllZiAgQVBJIHRvIHNldCBjb25maWd1cmUgcHJpdmFjeSBwYXJhbWV0ZXJzCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHBQcm9maWxlIC0gUG9pbnRlciBDU1IgUm9hbSBwcm9maWxlLgorICAgIFxwYXJhbSAgZlByaXZhY3kgLSBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgc3RhdHVzIG9mIHByaXZhY3kKKworICAgIFxyZXR1cm4gdm9pZAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX3NldF9jZmdfcHJpdmFjeSh0SGFsSGFuZGxlIGhIYWwsCisJCQkgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgYm9vbCBmUHJpdmFjeSkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX0NGR1BSSVZBQ1ksIE5PX1NFU1NJT04sIDApKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpKSB7CisJCWNzcl9zZXRfY2ZnX3ByaXZhY3kocE1hYywgcFByb2ZpbGUsIGZQcml2YWN5KTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX25laWdoYm9yX3JlcG9ydF9yZXF1ZXN0CisgICAgXGJyaWVmICBBUEkgdG8gcmVxdWVzdCBuZWlnaGJvciByZXBvcnQuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHBScm1OZWlnaGJvclJlcSAtIFBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0eXBlCisJCQkgICAgICB0UnJtTmVpZ2hib3JSZXEuIENhbGxlciBvd25zIHRoZSBtZW1vcnkgYW5kIGlzCisJCQkgICAgICByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdC4KKyAgICBccmV0dXJuIENERl9TVEFUVVMKKwkgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgLSBmYWlsdXJlCisJICAgIENERl9TVEFUVVNfU1VDQ0VTUyAgc3VjY2VzcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX25laWdoYm9yX3JlcG9ydF9yZXF1ZXN0KHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJICAgICAgIHRwUnJtTmVpZ2hib3JSZXEgcFJybU5laWdoYm9yUmVxLAorCQkJCSAgICAgICB0cFJybU5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvIGNhbGxiYWNrSW5mbykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9ORUlHSEJPUl9SRVBPUlRSRVEsIE5PX1NFU1NJT04sCisJCQkgMCkpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKSkgeworCQlzdGF0dXMgPQorCQkJc21lX3JybV9uZWlnaGJvcl9yZXBvcnRfcmVxdWVzdChoSGFsLCBzZXNzaW9uSWQsCisJCQkJCQkJcFJybU5laWdoYm9yUmVxLCBjYWxsYmFja0luZm8pOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKK3ZvaWQgc21zX2xvZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBsb2dsZXZlbCwgY29uc3QgY2hhciAqcFN0cmluZywgLi4uKQoreworI2lmZGVmIFdMQU5fREVCVUcKKwkvKiBWZXJpZnkgYWdhaW5zdCBjdXJyZW50IGxvZyBsZXZlbCAqLworCWlmIChsb2dsZXZlbCA+CisJICAgIHBNYWMtPnV0aWxzLmdMb2dEYmdMZXZlbFtMT0dfSU5ERVhfRk9SX01PRFVMRShTSVJfU01TX01PRFVMRV9JRCldKQorCQlyZXR1cm47CisJZWxzZSB7CisJCXZhX2xpc3QgbWFya2VyOworCisJCXZhX3N0YXJ0KG1hcmtlciwgcFN0cmluZyk7ICAgICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZSBhcmd1bWVudHMuICovCisKKwkJbG9nX2RlYnVnKHBNYWMsIFNJUl9TTVNfTU9EVUxFX0lELCBsb2dsZXZlbCwgcFN0cmluZywgbWFya2VyKTsKKworCQl2YV9lbmQobWFya2VyKTsgLyogUmVzZXQgdmFyaWFibGUgYXJndW1lbnRzLiAgICAgICovCisJfQorI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X3djbnNzX3dsYW5fY29tcGlsZWRfdmVyc2lvbgorICAgIFxicmllZiAgVGhpcyBBUEkgcmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgV0NOU1MgV0xBTiBBUEkgd2l0aAorCXdoaWNoIHRoZSBIT1NUIGRyaXZlciB3YXMgYnVpbHQKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgIFxwYXJhbSAgcFZlcnNpb24gLSBQb2ludHMgdG8gdGhlIFZlcnNpb24gc3RydWN0dXJlIHRvIGJlIGZpbGxlZAorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworCSAgICBDREZfU1RBVFVTX0VfSU5WQUwgLSBmYWlsdXJlCisJICAgIENERl9TVEFUVVNfU1VDQ0VTUyAgc3VjY2VzcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2dldF93Y25zc193bGFuX2NvbXBpbGVkX3ZlcnNpb24odEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgICAgICAgdFNpclZlcnNpb25UeXBlICpwVmVyc2lvbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpKSB7CisJCWlmIChwVmVyc2lvbiAhPSBOVUxMKQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQllbHNlCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9nZXRfd2Nuc3Nfd2xhbl9yZXBvcnRlZF92ZXJzaW9uCisgICAgXGJyaWVmICBUaGlzIEFQSSByZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBXQ05TUyBXTEFOIEFQSSB3aXRoCisJd2hpY2ggdGhlIFdDTlNTIGRyaXZlciByZXBvcnRzIGl0IHdhcyBidWlsdAorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICAgXHBhcmFtICBwVmVyc2lvbiAtIFBvaW50cyB0byB0aGUgVmVyc2lvbiBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkCisgICAgXHJldHVybiBDREZfU1RBVFVTCisJICAgIENERl9TVEFUVVNfRV9JTlZBTCAtIGZhaWx1cmUKKwkgICAgQ0RGX1NUQVRVU19TVUNDRVNTICBzdWNjZXNzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfZ2V0X3djbnNzX3dsYW5fcmVwb3J0ZWRfdmVyc2lvbih0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSAgICAgICB0U2lyVmVyc2lvblR5cGUgKnBWZXJzaW9uKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSkpIHsKKwkJaWYgKHBWZXJzaW9uICE9IE5VTEwpCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWVsc2UKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2dldF93Y25zc19zb2Z0d2FyZV92ZXJzaW9uCisgICAgXGJyaWVmICBUaGlzIEFQSSByZXR1cm5zIHRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgV0NOU1MgZHJpdmVyCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHBWZXJzaW9uIC0gUG9pbnRzIHRvIHRoZSBWZXJzaW9uIHN0cmluZyBidWZmZXIgdG8gYmUgZmlsbGVkCisgICAgXHBhcmFtICB2ZXJzaW9uQnVmZmVyU2l6ZSAtIFRIZSBzaXplIG9mIHRoZSBWZXJzaW9uIHN0cmluZyBidWZmZXIKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKwkgICAgQ0RGX1NUQVRVU19FX0lOVkFMIC0gZmFpbHVyZQorCSAgICBDREZfU1RBVFVTX1NVQ0NFU1MgIHN1Y2Nlc3MKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9nZXRfd2Nuc3Nfc29mdHdhcmVfdmVyc2lvbih0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSAgdWludDhfdCAqcFZlcnNpb24sCisJCQkJCSAgdWludDMyX3QgdmVyc2lvbkJ1ZmZlclNpemUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXZfQ09OVEVYVF90IGNkc19jb250ZXh0ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKSkgeworCQlpZiAocFZlcnNpb24gIT0gTlVMTCkgeworCQkJc3RhdHVzID0KKwkJCQl3bWFfZ2V0X3djbnNzX3NvZnR3YXJlX3ZlcnNpb24oY2RzX2NvbnRleHQsCisJCQkJCQkJICAgIHBWZXJzaW9uLAorCQkJCQkJCSAgICB2ZXJzaW9uQnVmZmVyU2l6ZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9nZXRfd2Nuc3NfaGFyZHdhcmVfdmVyc2lvbgorICAgIFxicmllZiAgVGhpcyBBUEkgcmV0dXJucyB0aGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIFdDTlNTIGhhcmR3YXJlCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHBWZXJzaW9uIC0gUG9pbnRzIHRvIHRoZSBWZXJzaW9uIHN0cmluZyBidWZmZXIgdG8gYmUgZmlsbGVkCisgICAgXHBhcmFtICB2ZXJzaW9uQnVmZmVyU2l6ZSAtIFRIZSBzaXplIG9mIHRoZSBWZXJzaW9uIHN0cmluZyBidWZmZXIKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKwkgICAgQ0RGX1NUQVRVU19FX0lOVkFMIC0gZmFpbHVyZQorCSAgICBDREZfU1RBVFVTX1NVQ0NFU1MgIHN1Y2Nlc3MKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9nZXRfd2Nuc3NfaGFyZHdhcmVfdmVyc2lvbih0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSAgdWludDhfdCAqcFZlcnNpb24sCisJCQkJCSAgdWludDMyX3QgdmVyc2lvbkJ1ZmZlclNpemUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKSkgeworCQlpZiAocFZlcnNpb24gIT0gTlVMTCkKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJZWxzZQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3NjYW5fZ2V0X2JraWRfY2FuZGlkYXRlX2xpc3QKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgQktJRCBjYW5kaWRhdGUgbGlzdAorICAgIFxwYXJhbSBwQmtpZExpc3QgLSBjYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciBwb2ludCB0byBhbiBhcnJheSBvZgorCQkgICAgICAgdEJraWRDYW5kaWRhdGVJbmZvCisgICAgXHBhcmFtIHBOdW1JdGVtcyAtIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgbnVtYmVyIG9mCisJCSAgICAgICB0QmtpZENhbmRpZGF0ZUluZm8gYWxsb2NhdGVkIHdoZW4gcmV0cnVuaW5nLCB0aGlzIGlzCisJCSAgICAgICBlaXRoZXIgdGhlIG51bWJlciBuZWVkZWQgb3IgbnVtYmVyIG9mIGl0ZW1zIHB1dCBpbnRvCisJCSAgICAgICBwUG1raWRMaXN0CisgICAgXHJldHVybiBDREZfU1RBVFVTIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdAorCQkJIGJpZyBlbm91Z2ggYW5kIHBOdW1JdGVtcworCQkJIGhhcyB0aGUgbnVtYmVyIG9mIHRCa2lkQ2FuZGlkYXRlSW5mby4KKyAgICBcTm90ZTogcE51bUl0ZW1zIGlzIGEgbnVtYmVyIG9mIHRCa2lkQ2FuZGlkYXRlSW5mbywKKwkgICBub3Qgc2l6ZW9mKHRCa2lkQ2FuZGlkYXRlSW5mbykgKiBzb21ldGhpbmcKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zY2FuX2dldF9ia2lkX2NhbmRpZGF0ZV9saXN0KHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgdEJraWRDYW5kaWRhdGVJbmZvICpwQmtpZExpc3QsCisJCQkJCSAgICB1aW50MzJfdCAqcE51bUl0ZW1zKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCQljc3Jfc2Nhbl9nZXRfYmtpZF9jYW5kaWRhdGVfbGlzdChwTWFjLCBzZXNzaW9uSWQsIHBCa2lkTGlzdCwKKwkJCQkJCQkgcE51bUl0ZW1zKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgT0VNIERBVEEgcmVsYXRlZCBtb2RpZmljYXRpb25zIGFuZCBmdW5jdGlvbiBhZGRpdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX29lbV9kYXRhX3JlcQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gZm9yIE9FTSBEQVRBIFJFUQorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uIGlkIHRvIGJlIHVzZWQuCisgICAgXHBhcmFtIHBPZW1EYXRhUmVxSWQgLSBwb2ludGVyIHRvIGFuIG9iamVjdCB0byBnZXQgYmFjayB0aGUgcmVxdWVzdCBJRAorICAgIFxwYXJhbSBjYWxsYmFjayAtIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdXBvbiBmaW5pc2gKKyAgICBccGFyYW0gcENvbnRleHQgLSBhIHBvaW50ZXIgcGFzc2VkIGluIGZvciB0aGUgY2FsbGJhY2sKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9vZW1fZGF0YV9yZXEodEhhbEhhbmRsZSBoSGFsLAorCQkJICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJICAgIHRPZW1EYXRhUmVxQ29uZmlnICpwT2VtRGF0YVJlcUNvbmZpZywKKwkJCSAgICB1aW50MzJfdCAqcE9lbURhdGFSZXFJRCwKKwkJCSAgICBvZW1fZGF0YV9vZW1fZGF0YV9yZXFDb21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLAorCQkJICAgIHZvaWQgKnBDb250ZXh0KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCWRvIHsKKwkJLyogYWNxdWlyZSB0aGUgbG9jayBmb3IgdGhlIHNtZSBvYmplY3QgKi8KKwkJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJdWludDMyX3QgbE9lbURhdGFSZXFJZCA9IHBNYWMtPm9lbURhdGEub2VtRGF0YVJlcUlEKys7ICAvKiBsZXQgaXQgd3JhcCBhcm91bmQgKi8KKworCQkJaWYgKHBPZW1EYXRhUmVxSUQpIHsKKwkJCQkqcE9lbURhdGFSZXFJRCA9IGxPZW1EYXRhUmVxSWQ7CisJCQl9IGVsc2UgeworCQkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKworCQkJc3RhdHVzID0KKwkJCQlvZW1fZGF0YV9vZW1fZGF0YV9yZXEoaEhhbCwgc2Vzc2lvbklkLAorCQkJCQkJICAgICAgcE9lbURhdGFSZXFDb25maWcsIHBPZW1EYXRhUmVxSUQsCisJCQkJCQkgICAgICBjYWxsYmFjaywgcENvbnRleHQpOworCisJCQkvKiByZWxlYXNlIHRoZSBsb2NrIGZvciB0aGUgc21lIG9iamVjdCAqLworCQkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCX0KKwl9IHdoaWxlICgwKTsKKworCXNtc19sb2cocE1hYywgTE9HVywgImV4aXRpbmcgZnVuY3Rpb24gJXMiLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLypGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgc21lX29wZW5fc2Vzc2lvbigpIC0gT3BlbiBhIHNlc3Npb24gZm9yIHNjYW4vcm9hbSBvcGVyYXRpb24uCisKKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBBUEkuCisKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxwYXJhbSBjYWxsYmFjayAtIEEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gY2FsbGVyIHNwZWNpZmllcyBmb3IKKwkJICAgICByb2FtL2Nvbm5lY3Qgc3RhdHVzIGluZGljYXRpb24KKyAgIFxwYXJhbSBwQ29udGV4dCAtIFRoZSBjb250ZXh0IHBhc3NlZCB3aXRoIGNhbGxiYWNrCisgICBccGFyYW0gcFNlbGZNYWNBZGRyIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZmlsbGVkIHdpdGggc2VsZiBNQUMgYWRkcmVzcworCQkJICg2IGJ5dGVzKQorICAgXHBhcmFtIHBiU2Vzc2lvbklkIC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIGZvciByZXR1cm5lZCBzZXNzaW9uIElECisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gc2Vzc2lvbiBpcyBvcGVuZWQuIHNlc3Npb25JZCByZXR1cm5lZC4KKworCQlPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byBvcGVuIHRoZSBzZXNzaW9uLgorCQlDREZfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gbm8gbW9yZSBzZXNzaW9uIGF2YWlsYWJsZS4KKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9vcGVuX3Nlc3Npb24odEhhbEhhbmRsZSBoSGFsLCBjc3Jfcm9hbV9jb21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLAorCQkJICAgIHZvaWQgKnBDb250ZXh0LAorCQkJICAgIHVpbnQ4X3QgKnBTZWxmTWFjQWRkciwgdWludDhfdCAqcGJTZXNzaW9uSWQsCisJCQkgICAgdWludDMyX3QgdHlwZSwgdWludDMyX3Qgc3ViVHlwZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TQVAsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiB0eXBlPSVkLCBzdWJUeXBlPSVkIiwgX19mdW5jX18sIHR5cGUsIHN1YlR5cGUpOworCisJaWYgKE5VTEwgPT0gcGJTZXNzaW9uSWQpIHsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkJY3NyX3JvYW1fb3Blbl9zZXNzaW9uKHBNYWMsIGNhbGxiYWNrLCBwQ29udGV4dCwKKwkJCQkJCSAgICAgIHBTZWxmTWFjQWRkciwgcGJTZXNzaW9uSWQsIHR5cGUsCisJCQkJCQkgICAgICBzdWJUeXBlKTsKKworCQkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCX0KKwl9CisJaWYgKE5VTEwgIT0gcGJTZXNzaW9uSWQpCisJCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9PUEVOX1NFU1NJT04sCisJCQkJICpwYlNlc3Npb25JZCwgMCkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgc21lX2Nsb3NlX3Nlc3Npb24oKSAtIE9wZW4gYSBzZXNzaW9uIGZvciBzY2FuL3JvYW0gb3BlcmF0aW9uLgorCisgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisKKyAgIFxwYXJhbSBzZXNzaW9uSWQgLSBBIHByZXZpb3VzIG9wZW5lZCBzZXNzaW9uJ3MgSUQuCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gc2Vzc2lvbiBpcyBjbG9zZWQuCisKKwlPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byBvcGVuIHRoZSBzZXNzaW9uLgorCUNERl9TVEFUVVNfRV9JTlZBTCAtIHNlc3Npb24gaXMgbm90IG9wZW5lZC4KKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9jbG9zZV9zZXNzaW9uKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkgICAgIGNzcl9yb2FtU2Vzc2lvbkNsb3NlQ2FsbGJhY2sgY2FsbGJhY2ssCisJCQkgICAgIHZvaWQgKnBDb250ZXh0KQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0NMT1NFX1NFU1NJT04sIHNlc3Npb25JZCwgMCkpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzdGF0dXMgPSBjc3Jfcm9hbV9jbG9zZV9zZXNzaW9uKHBNYWMsIHNlc3Npb25JZCwgZmFsc2UsCisJCQkJCQljYWxsYmFjaywgcENvbnRleHQpOworCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9yb2FtX3VwZGF0ZV9hcHdwc2llCisKKyAgICBcYnJpZWYgVG8gdXBkYXRlIEFQJ3MgV1BTIElFLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgU01FIEFQIHNlc3Npb24gaXMgY3JlYXRlZAorICAgIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBwQVBXUFNJRVMgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdFNpckFQV1BTSUVzCisKKyAgICBccmV0dXJuIENERl9TVEFUVVMgwpYgU1VDQ0VTUyDClgorCisJCQlGQUlMVVJFIG9yIFJFU09VUkNFUyDCliBUaGUgQVBJIGZpbmlzaGVkIGFuZCBmYWlsZWQuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcm9hbV91cGRhdGVfYXB3cHNpZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgIHRTaXJBUFdQU0lFcyAqcEFQV1BTSUVTKQoreworCisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKworCQlzdGF0dXMgPSBjc3Jfcm9hbV91cGRhdGVfYXB3cHNpZShwTWFjLCBzZXNzaW9uSWQsIHBBUFdQU0lFUyk7CisKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX3JvYW1fdXBkYXRlX2Fwd3BhcnNuaV9lcworCisgICAgXGJyaWVmIFRvIHVwZGF0ZSBBUCdzIFdQQS9SU04gSUVzLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgU01FIEFQIHNlc3Npb24gaXMgY3JlYXRlZAorICAgIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBwQVBTaXJSU05pZSAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0U2lyUlNOaWUgd2l0aCBXUFMvUlNOIElFcworCisgICAgXHJldHVybiBDREZfU1RBVFVTIMKWIFNVQ0NFU1MgwpYKKworCQkJRkFJTFVSRSBvciBSRVNPVVJDRVMgwpYgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3JvYW1fdXBkYXRlX2Fwd3BhcnNuaV9lcyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQl0U2lyUlNOaWUgKnBBUFNpclJTTmllKQoreworCisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKworCQlzdGF0dXMgPSBjc3Jfcm9hbV91cGRhdGVfd3BhcnNuaV9lcyhwTWFjLCBzZXNzaW9uSWQsIHBBUFNpclJTTmllKTsKKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfY2hhbmdlX21jY19iZWFjb25faW50ZXJ2YWwKKworICAgIFxicmllZiBUbyB1cGRhdGUgUDJQLUdPIGJlYWNvbkludGVydmFsLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIKKyAgICBkaXNhc3NvY2lhdGluZyBhbGwgdGhlIHN0YXRpb24gaXMgZG9uZQorICAgIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbQorCisgICAgXHJldHVybiBDREZfU1RBVFVTICBTVUNDRVNTCisJCQlGQUlMVVJFIG9yIFJFU09VUkNFUworCQkJVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2NoYW5nZV9tY2NfYmVhY29uX2ludGVydmFsKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJVcGRhdGUgQmVhY29uIFBBUkFNUyAiKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9zZW5kX2NobmdfbWNjX2JlYWNvbl9pbnRlcnZhbChwTWFjLCBzZXNzaW9uSWQpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfc2V0X2hvc3Rfb2ZmbG9hZCgpOiBBUEkgdG8gc2V0IHRoZSBob3N0IG9mZmxvYWQgZmVhdHVyZS4KKyAqIEBoSGFsOiBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQHNlc3Npb25JZDogU2Vzc2lvbiBJZGVudGlmaWVyCisgKiBAcmVxdWVzdDogUG9pbnRlciB0byB0aGUgb2ZmbG9hZCByZXF1ZXN0LgorICoKKyAqIFJldHVybiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX3NldF9ob3N0X29mZmxvYWQodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQl0cFNpckhvc3RPZmZsb2FkUmVxIHJlcXVlc3QpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfSE9TVE9GRkxPQUQsIHNlc3Npb25JZCwgMCkpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorCQlpZiAoU0lSX0lQVjZfTlNfT0ZGTE9BRCA9PSByZXF1ZXN0LT5vZmZsb2FkVHlwZSkgeworCQkJc3RhdHVzID0gc21lX3NldF9wc19uc19vZmZsb2FkKGhIYWwsIHJlcXVlc3QsCisJCQkJCXNlc3Npb25JZCk7CisJCX0gZWxzZQorI2VuZGlmIC8qIFdMQU5fTlNfT0ZGTE9BRCAqLworCQl7CisJCQlzdGF0dXMgPSBzbWVfc2V0X3BzX2hvc3Rfb2ZmbG9hZChoSGFsLCByZXF1ZXN0LAorCQkJCQlzZXNzaW9uSWQpOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKy8qKgorICogc21lX3NldF9ndGtfb2ZmbG9hZCgpOiBBUEkgdG8gc2V0IEdUSyBvZmZsb2FkIGluZm9ybWF0aW9uLgorICogQGhIYWw6IFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgKiBAc2Vzc2lvbklkOiBTZXNzaW9uIElkZW50aWZpZXIKKyAqIEBwR3RrT2ZmbG9hZDogUG9pbnRlciB0byB0aGUgR1RLIG9mZmxvYWQgcmVxdWVzdC4uCisgKgorICogUmV0dXJuIENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfc2V0X2d0a19vZmZsb2FkKHRIYWxIYW5kbGUgaEhhbCwKKwkJdHBTaXJHdGtPZmZsb2FkUGFyYW1zIHBHdGtPZmZsb2FkLAorCQkJICAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwU2lyR3RrT2ZmbG9hZFBhcmFtcyByZXF1ZXN0X2J1ZjsKKwljZHNfbXNnX3QgbXNnOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogS2V5UmVwbGF5Q291bnRlcjogJWxsZCIsIF9fZnVuY19fLAorCQkgIHBHdGtPZmZsb2FkLT51bGxLZXlSZXBsYXlDb3VudGVyKTsKKworCWlmIChOVUxMID09IHBTZXNzaW9uKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFNlc3Npb24gbm90IGZvdW5kICIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJlcXVlc3RfYnVmID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpyZXF1ZXN0X2J1ZikpOworCWlmIChOVUxMID09IHJlcXVlc3RfYnVmKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgIEZMKCJOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEdUSyBvZmZsb2FkIHJlcXVlc3QiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV9jb3B5KHBHdGtPZmZsb2FkLT5ic3NJZCwgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQuYnl0ZXMsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkqcmVxdWVzdF9idWYgPSAqcEd0a09mZmxvYWQ7CisKKwltc2cudHlwZSA9IFdNQV9HVEtfT0ZGTE9BRF9SRVE7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHJlcXVlc3RfYnVmOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCSAgICAoY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIk5vdCBhYmxlIHRvIHBvc3QgU0lSX0hBTF9TRVRfR1RLX09GRkxPQUQgbWVzc2FnZSB0byBIQUwiKSk7CisJCWNkZl9tZW1fZnJlZShyZXF1ZXN0X2J1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHNtZV9nZXRfZ3RrX29mZmxvYWQoKTogQVBJIHRvIGdldCBHVEsgb2ZmbG9hZCBpbmZvcm1hdGlvbgorICogQGhIYWw6IFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgKiBAY2FsbGJhY2tfcm91dGluZTogY2FsbGJhY2tfcm91dGluZS4KKyAqIEBzZXNzaW9uSWQ6IFNlc3Npb24gSWRlbnRpZmllci4KKyAqIGNhbGxiYWNrX2NvbnRleHQ6IGNhbGxiYWNrX2NvbnRleHQuCisgKgorICogUmV0dXJuIENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfZ2V0X2d0a19vZmZsb2FkKHRIYWxIYW5kbGUgaEhhbCwKKwkJCSAgICAgICBndGtfb2ZmbG9hZF9nZXRfaW5mb19jYWxsYmFjayBjYWxsYmFja19yb3V0aW5lLAorCQkJICAgICAgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQsIHVpbnQ4X3Qgc2Vzc2lvbl9pZCkKK3sKKwl0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zIHJlcXVlc3RfYnVmOworCWNkc19tc2dfdCBtc2c7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbl9pZCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IEVudGVyZWQiLAorCQkgIF9fZnVuY19fKTsKKworCWlmIChOVUxMID09IHBTZXNzaW9uKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFNlc3Npb24gbm90IGZvdW5kICIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJlcXVlc3RfYnVmID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpyZXF1ZXN0X2J1ZikpOworCWlmIChOVUxMID09IHJlcXVlc3RfYnVmKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJIEZMKCJOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEdldCBHVEsgb2ZmbG9hZCByZXF1ZXN0IikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1fY29weShyZXF1ZXN0X2J1Zi0+YnNzSWQsIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLmJ5dGVzLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJbXNnLnR5cGUgPSBXTUFfR1RLX09GRkxPQURfR0VUSU5GT19SRVE7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHJlcXVlc3RfYnVmOworCisJLyogQ2FjaGUgdGhlIEdldCBHVEsgT2ZmbG9hZCBjYWxsYmFjayBpbmZvcm1hdGlvbiAqLworCWlmIChOVUxMICE9IHBNYWMtPnNtZS5ndGtfb2ZmbG9hZF9nZXRfaW5mb19jYikgeworCisJCS8qIERvIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNhbGxiYWNrIGlzIGluIHVzZT8gKi8KKwkJLyogQmVjYXVzZSB3ZSBhcmUgbm90IHNlbmRpbmcgdGhlIHNhbWUgbWVzc2FnZSBhZ2FpbgorCQkgKiB3aGVuIGl0IGlzIHBlbmRpbmcsCisJCSAqIHRoZSBvbmx5IGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgbm90IE5VTEwgaXMgdGhhdAorCQkgKiB0aGUgcHJldmlvdXMgbWVzc2FnZSB3YXMgdGltZWQgb3V0IG9yIGZhaWxlZC4KKwkJICogU28sIGl0IHdpbGwgYmUgc2FmZSB0byBzZXQgdGhlIGNhbGxiYWNrIGluIHRoaXMgY2FzZS4KKwkJICovCisJfQorCisJcE1hYy0+c21lLmd0a19vZmZsb2FkX2dldF9pbmZvX2NiID0gY2FsbGJhY2tfcm91dGluZTsKKwlwTWFjLT5zbWUuZ3RrX29mZmxvYWRfZ2V0X2luZm9fY2JfY29udGV4dCA9IGNhbGxiYWNrX2NvbnRleHQ7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkgICAgKGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIk5vdCBhYmxlIHRvIHBvc3QgV01BX0dUS19PRkZMT0FEX0dFVElORk9fUkVRIG1lc3NhZ2UgdG8gV01BIikpOworCQljZGZfbWVtX2ZyZWUocmVxdWVzdF9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfa2VlcF9hbGl2ZQorICAgIFxicmllZiAgQVBJIHRvIHNldCB0aGUgS2VlcCBBbGl2ZSBmZWF0dXJlLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICAgXHBhcmFtICByZXF1ZXN0IC0gIFBvaW50ZXIgdG8gdGhlIEtlZXAgQWxpdmUgcmVxdWVzdC4KKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zZXRfa2VlcF9hbGl2ZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbl9pZCwKKwkJCSAgICAgIHRwU2lyS2VlcEFsaXZlUmVxIHJlcXVlc3QpCit7CisJdHBTaXJLZWVwQWxpdmVSZXEgcmVxdWVzdF9idWY7CisJY2RzX21zZ190IG1zZzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uX2lkKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJRkwoIldNQV9TRVRfS0VFUF9BTElWRSBtZXNzYWdlIikpOworCisJaWYgKHBTZXNzaW9uID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoIlNlc3Npb24gbm90IEZvdW5kIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJlcXVlc3RfYnVmID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJLZWVwQWxpdmVSZXEpKTsKKwlpZiAoTlVMTCA9PSByZXF1ZXN0X2J1ZikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCUZMKCJOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGtlZXAgYWxpdmUgcmVxdWVzdCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX2NvcHkocmVxdWVzdC0+YnNzSWQsIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLmJ5dGVzLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCWNkZl9tZW1fY29weShyZXF1ZXN0X2J1ZiwgcmVxdWVzdCwgc2l6ZW9mKHRTaXJLZWVwQWxpdmVSZXEpKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCQkJImJ1ZmYgVFAgJWQgaW5wdXQgVFAgJWQgIiwgcmVxdWVzdF9idWYtPnRpbWVQZXJpb2QsCisJCSAgcmVxdWVzdC0+dGltZVBlcmlvZCk7CisJcmVxdWVzdF9idWYtPnNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisKKwltc2cudHlwZSA9IFdNQV9TRVRfS0VFUF9BTElWRTsKKwltc2cucmVzZXJ2ZWQgPSAwOworCW1zZy5ib2R5cHRyID0gcmVxdWVzdF9idWY7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkJY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoIk5vdCBhYmxlIHRvIHBvc3QgV01BX1NFVF9LRUVQX0FMSVZFIG1lc3NhZ2UgdG8gV01BIikpOworCQljZGZfbWVtX2ZyZWUocmVxdWVzdF9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfcHJlZmVycmVkX25ldHdvcmtfbGlzdAorICAgIFxicmllZiAgQVBJIHRvIHNldCB0aGUgUHJlZmVycmVkIE5ldHdvcmsgTGlzdCBPZmZsb2FkIGZlYXR1cmUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHJlcXVlc3QgLSAgUG9pbnRlciB0byB0aGUgb2ZmbG9hZCByZXF1ZXN0LgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9wcmVmZXJyZWRfbmV0d29ya19saXN0KHRIYWxIYW5kbGUgaEhhbCwKKwkJdHBTaXJQTk9TY2FuUmVxIHJlcXVlc3QsCisJCXVpbnQ4X3Qgc2Vzc2lvbklkLAorCQl2b2lkICgqY2FsbGJhY2tfcm91dGluZSkodm9pZCAqY2FsbGJhY2tfY29udGV4dCwKKwkJCXRTaXJQcmVmTmV0d29ya0ZvdW5kSW5kCisJCQkqcFByZWZOZXR3b3JrRm91bmRJbmQpLAorCQl2b2lkICpjYWxsYmFja19jb250ZXh0KQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbWVfc2V0X3BzX3ByZWZlcnJlZF9uZXR3b3JrX2xpc3QoaEhhbCwgcmVxdWVzdCwgc2Vzc2lvbklkLAorCQkJCWNhbGxiYWNrX3JvdXRpbmUsIGNhbGxiYWNrX2NvbnRleHQpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1NDQU5fUE5PICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfYWJvcnRfbWFjX3NjYW4KKyAgICBcYnJpZWYgIEFQSSB0byBjYW5jZWwgTUFDIHNjYW4uCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIHNlc3Npb25JZCBvbiB3aGljaCB3ZSBuZWVkIHRvIGFib3J0IHNjYW4uCisgICAgXHBhcmFtICByZWFzb24gLSBSZWFzb24gdG8gYWJvcnQgdGhlIHNjYW4uCisgICAgXHJldHVybiBDREZfU1RBVFVTCisJICAgIENERl9TVEFUVVNfRV9GQUlMVVJFIC0gZmFpbHVyZQorCSAgICBDREZfU1RBVFVTX1NVQ0NFU1MgIHN1Y2Nlc3MKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9hYm9ydF9tYWNfc2Nhbih0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJICAgICAgZUNzckFib3J0UmVhc29uIHJlYXNvbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9BQk9SVF9NQUNTQ0FOLCBOT19TRVNTSU9OLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9zY2FuX2Fib3J0X21hY19zY2FuKHBNYWMsIHNlc3Npb25JZCwgcmVhc29uKTsKKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9nZXRfb3BlcmF0aW9uX2NoYW5uZWwKKyAgICBcYnJpZWYgQVBJIHRvIGdldCBjdXJyZW50IGNoYW5uZWwgb24gd2hpY2ggU1RBIGlzIHBhcmtlZAorICAgIHRoaXMgZnVuY3Rpb24gZ2l2ZXMgY2hhbm5lbCBpbmZvcm1hdGlvbiBvbmx5IG9mIGluZnJhIHN0YXRpb24gb3IgSUJTUyBzdGF0aW9uCisgICAgXHBhcmFtIGhIYWwsIHBvaW50ZXIgdG8gbWVtb3J5IGxvY2F0aW9uIGFuZCBzZXNzaW9uSWQKKyAgICBccmV0dXJucyBDREZfU1RBVFVTX1NVQ0NFU1MKKwkgICAgIENERl9TVEFUVVNfRV9GQUlMVVJFCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2dldF9vcGVyYXRpb25fY2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90ICpwQ2hhbm5lbCwKKwkJCQkgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uOworCisJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCQlpZiAoKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGUgPT0KKwkJICAgICBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFKQorCQkgICAgfHwgKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGUgPT0KKwkJCWVDU1JfQlNTX1RZUEVfSUJTUykKKwkJICAgIHx8IChwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5CU1NUeXBlID09CisJCQllQ1NSX0JTU19UWVBFX0lORlJBX0FQKQorCQkgICAgfHwgKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGUgPT0KKwkJCWVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUykpIHsKKwkJCSpwQ2hhbm5lbCA9IHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWw7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9CisJfQorCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKK30gLyogc21lX2dldF9vcGVyYXRpb25fY2hhbm5lbCBlbmRzIGhlcmUgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX1JlZ2lzdGVyTWd0RnJhbWUKKworICAgIFxicmllZiBUbyByZWdpc3RlciBtYW5hZ21lbnQgZnJhbWUgb2Ygc3BlY2lmaWVkIHR5cGUgYW5kIHN1YnR5cGUuCisgICAgXHBhcmFtIGZyYW1lVHlwZSAtIHR5cGUgb2YgdGhlIGZyYW1lIHRoYXQgbmVlZHMgdG8gYmUgcGFzc2VkIHRvIEhERC4KKyAgICBccGFyYW0gbWF0Y2hEYXRhIC0gZGF0YSB3aGljaCBuZWVkcyB0byBiZSBtYXRjaGVkIGJlZm9yZSBwYXNzaW5nIGZyYW1lCisJCSAgICAgICB0byBIREQuCisgICAgXHBhcmFtIG1hdGNoRGF0YUxlbiAtIExlbmd0aCBvZiBtYXRjaGVkIGRhdGEuCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3JlZ2lzdGVyX21nbXRfZnJhbWUodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkgICB1aW50MTZfdCBmcmFtZVR5cGUsIHVpbnQ4X3QgKm1hdGNoRGF0YSwKKwkJCQkgICB1aW50MTZfdCBtYXRjaExlbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9SRUdJU1RFUl9NR01URlIsIHNlc3Npb25JZCwgMCkpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQl0U2lyUmVnaXN0ZXJNZ210RnJhbWUgKnBNc2c7CisJCXVpbnQxNl90IGxlbjsKKwkJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJCWlmICghQ1NSX0lTX1NFU1NJT05fQU5ZKHNlc3Npb25JZCkgJiYgIXBTZXNzaW9uKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLAorCQkJCXNlc3Npb25JZCk7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCisJCWlmICghQ1NSX0lTX1NFU1NJT05fQU5ZKHNlc3Npb25JZCkgJiYgIXBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlcyBJbnZhbGlkIFNlc3Npb25pZCIsIF9fZnVuY19fKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisKKwkJbGVuID0gc2l6ZW9mKHRTaXJSZWdpc3Rlck1nbXRGcmFtZSkgKyBtYXRjaExlbjsKKworCQlwTXNnID0gY2RmX21lbV9tYWxsb2MobGVuKTsKKwkJaWYgKE5VTEwgPT0gcE1zZykKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZWxzZSB7CisJCQljZGZfbWVtX3NldChwTXNnLCBsZW4sIDApOworCQkJcE1zZy0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9SRUdJU1RFUl9NR01UX0ZSQU1FX1JFUTsKKwkJCXBNc2ctPmxlbmd0aCA9IGxlbjsKKwkJCXBNc2ctPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJCXBNc2ctPnJlZ2lzdGVyRnJhbWUgPSB0cnVlOworCQkJcE1zZy0+ZnJhbWVUeXBlID0gZnJhbWVUeXBlOworCQkJcE1zZy0+bWF0Y2hMZW4gPSBtYXRjaExlbjsKKwkJCWNkZl9tZW1fY29weShwTXNnLT5tYXRjaERhdGEsIG1hdGNoRGF0YSwgbWF0Y2hMZW4pOworCQkJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9EZXJlZ2lzdGVyTWd0RnJhbWUKKworICAgIFxicmllZiBUbyBEZS1yZWdpc3RlciBtYW5hZ21lbnQgZnJhbWUgb2Ygc3BlY2lmaWVkIHR5cGUgYW5kIHN1YnR5cGUuCisgICAgXHBhcmFtIGZyYW1lVHlwZSAtIHR5cGUgb2YgdGhlIGZyYW1lIHRoYXQgbmVlZHMgdG8gYmUgcGFzc2VkIHRvIEhERC4KKyAgICBccGFyYW0gbWF0Y2hEYXRhIC0gZGF0YSB3aGljaCBuZWVkcyB0byBiZSBtYXRjaGVkIGJlZm9yZSBwYXNzaW5nIGZyYW1lCisJCSAgICAgICB0byBIREQuCisgICAgXHBhcmFtIG1hdGNoRGF0YUxlbiAtIExlbmd0aCBvZiBtYXRjaGVkIGRhdGEuCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2RlcmVnaXN0ZXJfbWdtdF9mcmFtZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgdWludDE2X3QgZnJhbWVUeXBlLCB1aW50OF90ICptYXRjaERhdGEsCisJCQkJICAgICB1aW50MTZfdCBtYXRjaExlbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9ERVJFR0lTVEVSX01HTVRGUiwgc2Vzc2lvbklkLAorCQkJIDApKTsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJdFNpclJlZ2lzdGVyTWdtdEZyYW1lICpwTXNnOworCQl1aW50MTZfdCBsZW47CisJCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCQlpZiAoIUNTUl9JU19TRVNTSU9OX0FOWShzZXNzaW9uSWQpICYmICFwU2Vzc2lvbikgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwKKwkJCQlzZXNzaW9uSWQpOworCQkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKworCQlpZiAoIUNTUl9JU19TRVNTSU9OX0FOWShzZXNzaW9uSWQpICYmICFwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXMgSW52YWxpZCBTZXNzaW9uaWQiLCBfX2Z1bmNfXyk7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCisJCWxlbiA9IHNpemVvZih0U2lyUmVnaXN0ZXJNZ210RnJhbWUpICsgbWF0Y2hMZW47CisKKwkJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKGxlbik7CisJCWlmIChOVUxMID09IHBNc2cpCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWVsc2UgeworCQkJY2RmX21lbV9zZXQocE1zZywgbGVuLCAwKTsKKwkJCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfUkVHSVNURVJfTUdNVF9GUkFNRV9SRVE7CisJCQlwTXNnLT5sZW5ndGggPSBsZW47CisJCQlwTXNnLT5yZWdpc3RlckZyYW1lID0gZmFsc2U7CisJCQlwTXNnLT5mcmFtZVR5cGUgPSBmcmFtZVR5cGU7CisJCQlwTXNnLT5tYXRjaExlbiA9IG1hdGNoTGVuOworCQkJY2RmX21lbV9jb3B5KHBNc2ctPm1hdGNoRGF0YSwgbWF0Y2hEYXRhLCBtYXRjaExlbik7CisJCQlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcmVtYWluX29uX2NoYW5uZWwgLSBBUEkgdG8gcmVxdWVzdCByZW1haW4gb24gY2hhbm5lbCBmb3IgJ3gnIGR1cmF0aW9uCisgKgorICogQGhIYWw6IHBvaW50ZXIgdG8gTUFDIGhhbmRsZQorICogQHNlc3Npb25faWQ6IFNlc3Npb24gaWRlbnRpZmllcgorICogQGNoYW5uZWw6IGNoYW5uZWwgaW5mb3JtYXRpb24KKyAqIEBkdXJhdGlvbjogZHVyYXRpb24gaW4gbXMKKyAqIEBjYWxsYmFjazogSEREIHJlZ2lzdGVyZWQgY2FsbGJhY2sgdG8gcHJvY2VzcyByZWFtaW5PbkNoYW5uZWxSc3AKKyAqIEBjb250ZXh0OiBIREQgQ2FsbGJhY2sgcGFyYW0KKyAqIEBzY2FuX2lkOiBzY2FuIGlkZW50aWZpZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIHJvYyByZXF1ZXN0IGFuZCBnZW5lcmF0ZXMgc2NhbiBpZGVudGlmaWVyLnMKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfcmVtYWluX29uX2NoYW5uZWwodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25faWQsCisJCQkJIHVpbnQ4X3QgY2hhbm5lbCwgdWludDMyX3QgZHVyYXRpb24sCisJCQkJIHJlbWFpbk9uQ2hhbkNhbGxiYWNrIGNhbGxiYWNrLAorCQkJCSB2b2lkICpwQ29udGV4dCwgdWludDhfdCBpc1AyUFByb2JlUmVxQWxsb3dlZCwKKwkJCQkgdWludDMyX3QgKnNjYW5faWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXVpbnQzMl90IHNhbl9yZXFfaWQsIHNjYW5fY291bnQ7CisJc3RydWN0IGFuaV9yb2NfcmVxICpyb2NfbXNnOworCWNkc19tc2dfdCBtc2c7CisKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JFTUFJTl9PTkNIQU4sIHNlc3Npb25faWQsIDApKTsKKworCXNjYW5fY291bnQgPSBjc3JfbGxfY291bnQoJm1hY19jdHgtPnNtZS5zbWVTY2FuQ21kQWN0aXZlTGlzdCk7CisJaWYgKHNjYW5fY291bnQgPj0gbWFjX2N0eC0+c2Nhbi5tYXhfc2Nhbl9jb3VudCkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJNYXggc2NhbiByZWFjaGVkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJd21hX2dldF9zY2FuX2lkKCZzYW5fcmVxX2lkKTsKKwkqc2Nhbl9pZCA9IHNhbl9yZXFfaWQ7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsIEZMKCIgY2FsbGVkIikpOworCXJvY19tc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IGFuaV9yb2NfcmVxKSk7CisJaWYgKE5VTEwgPT0gcm9jX21zZykgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkiIHNjYW5fcmVxOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtIGZvciBtc2ciKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCXJvY19tc2ctPm1zZ190eXBlID0gZVdOSV9TTUVfUk9DX0NNRDsKKwlyb2NfbXNnLT5tc2dfbGVuID0gKHVpbnQxNl90KSBzaXplb2Yoc3RydWN0IGFuaV9yb2NfcmVxKTsKKwlyb2NfbXNnLT5zZXNzaW9uX2lkID0gc2Vzc2lvbl9pZDsKKwlyb2NfbXNnLT5jYWxsYmFjayA9IGNhbGxiYWNrOworCXJvY19tc2ctPmR1cmF0aW9uID0gZHVyYXRpb247CisJcm9jX21zZy0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJcm9jX21zZy0+aXNfcDJwcHJvYmVfYWxsb3dlZCA9IGlzUDJQUHJvYmVSZXFBbGxvd2VkOworCXJvY19tc2ctPmN0eCA9IHBDb250ZXh0OworCXJvY19tc2ctPnNjYW5faWQgPSAqc2Nhbl9pZDsKKwltc2cudHlwZSA9IGVXTklfU01FX1JPQ19DTUQ7CisJbXNnLmJvZHlwdHIgPSByb2NfbXNnOworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHl2YWwgPSAwOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfU01FLCAmbXNnKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkiIHNtZV9zY2FuX3JlcSBmYWlsZWQgdG8gcG9zdCBtc2ciKTsKKwkJY2RmX21lbV9mcmVlKHJvY19tc2cpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9yZXBvcnRfcHJvYmVfcmVxCisgICAgXGJyaWVmICBBUEkgdG8gZW5hYmxlL2Rpc2FibGUgZm9yd2FyZGluZyBvZiBwcm9iZVJlcSB0byBhcHBzIGluIHAycC4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgIFxwYXJhbSAgZmFsZzogdG8gc2V0IHRoZSBQcm9iZSByZXF1ZXN0IGZvcmFyZGluZyB0byB3cGFfc3VwcGxpY2FudCBpbiBsaXN0ZW4gc3RhdGUgaW4gcDJwCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIFdMQU5fRkVBVFVSRV9DT05DVVJSRU5UX1AyUAorQ0RGX1NUQVRVUyBzbWVfcmVwb3J0X3Byb2JlX3JlcSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgZmxhZykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlkbyB7CisJCS8qIGFjcXVpcmUgdGhlIGxvY2sgZm9yIHRoZSBzbWUgb2JqZWN0ICovCisJCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCS8qIGNhbGwgc2V0IGluIGNvbnRleHQgKi8KKwkJCXBNYWMtPnAycENvbnRleHQucHJvYmVSZXFGb3J3YXJkaW5nID0gZmxhZzsKKwkJCS8qIHJlbGVhc2UgdGhlIGxvY2sgZm9yIHRoZSBzbWUgb2JqZWN0ICovCisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJfQorCX0gd2hpbGUgKDApOworCisJc21zX2xvZyhwTWFjLCBMT0dXLCAiZXhpdGluZyBmdW5jdGlvbiAlcyIsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfdXBkYXRlX3AycF9pZQorICAgIFxicmllZiAgQVBJIHRvIHNldCB0aGUgUDJwIEllIGluIHAycCBjb250ZXh0CisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHAycEllIC0gIFB0ciB0byBwMnBJZSBmcm9tIEhERC4KKyAgICBccGFyYW0gcDJwSWVMZW5ndGg6IGxlbmd0aCBvZiBwMnBJZQorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3AycF9pZSh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnAycEllLCB1aW50MzJfdCBwMnBJZUxlbmd0aCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9VUERBVEVfUDJQX0lFLCBOT19TRVNTSU9OLCAwKSk7CisJLyogYWNxdWlyZSB0aGUgbG9jayBmb3IgdGhlIHNtZSBvYmplY3QgKi8KKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKE5VTEwgIT0gcE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllKSB7CisJCQljZGZfbWVtX2ZyZWUocE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllKTsKKwkJCXBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZUxlbmd0aCA9IDA7CisJCX0KKworCQlwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWUgPSBjZGZfbWVtX21hbGxvYyhwMnBJZUxlbmd0aCk7CisJCWlmIChOVUxMID09IHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBQMlAgSUUiLAorCQkJCV9fZnVuY19fKTsKKwkJCXBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZUxlbmd0aCA9IDA7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCX0gZWxzZSB7CisJCQlwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWVMZW5ndGggPSBwMnBJZUxlbmd0aDsKKworCQkJc2lyX2R1bXBfYnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cyLAorCQkJCSAgICAgcE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllLAorCQkJCSAgICAgcE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllTGVuZ3RoKTsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWUsCisJCQkJICAgICBwMnBJZSwgcDJwSWVMZW5ndGgpOworCQl9CisKKwkJLyogcmVsZWFzZSB0aGUgbG9jayBmb3IgdGhlIHNtZSBvYmplY3QgKi8KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJc21zX2xvZyhwTWFjLCBMT0cyLCAiZXhpdGluZyBmdW5jdGlvbiAlcyIsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZW5kX2FjdGlvbgorICAgIFxicmllZiAgQVBJIHRvIHNlbmQgYWN0aW9uIGZyYW1lIGZyb20gc3VwcGxpY2FudC4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUyBzbWVfc2VuZF9hY3Rpb24odEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCSAgIGNvbnN0IHVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IGxlbiwKKwkJCSAgIHVpbnQxNl90IHdhaXQsIGJvb2wgbm9hY2ssCisJCQkgICB1aW50MTZfdCBjaGFubmVsX2ZyZXEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VORF9BQ1RJT04sIHNlc3Npb25JZCwgMCkpOworCS8qIGFjcXVpcmUgdGhlIGxvY2sgZm9yIHRoZSBzbWUgb2JqZWN0ICovCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXAycF9zZW5kX2FjdGlvbihoSGFsLCBzZXNzaW9uSWQsIHBCdWYsIGxlbiwgd2FpdCwgbm9hY2ssCisJCWNoYW5uZWxfZnJlcSk7CisJCS8qIHJlbGVhc2UgdGhlIGxvY2sgZm9yIHRoZSBzbWUgb2JqZWN0ICovCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXNtc19sb2cocE1hYywgTE9HVywgImV4aXRpbmcgZnVuY3Rpb24gJXMiLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIHNtZV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwodEhhbEhhbmRsZSBoSGFsLAorCXVpbnQ4X3Qgc2Vzc2lvbklkLCB1aW50MzJfdCBzY2FuX2lkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0NBTkNFTF9SRU1BSU5fT05DSEFOLCBzZXNzaW9uSWQsCisJCQkgMCkpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzdGF0dXMgPSBwMnBfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKGhIYWwsIHNlc3Npb25JZCwgc2Nhbl9pZCk7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBQb3dlciBTYXZlIFJlbGF0ZWQgKi8KK0NERl9TVEFUVVMgc21lX3AycF9zZXRfcHModEhhbEhhbmRsZSBoSGFsLCB0UDJwUHNDb25maWcgKmRhdGEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IHAycF9zZXRfcHMoaEhhbCwgZGF0YSk7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGZuICAgIHNtZV9jb25maWd1cmVfcnhwX2ZpbHRlcgorCisgICBcYnJpZWYKKyAgICBTTUUgd2lsbCBwYXNzIHRoaXMgcmVxdWVzdCB0byBsb3dlciBtYWMgdG8gc2V0L3Jlc2V0IHRoZSBmaWx0ZXIgb24gUlhQIGZvcgorICAgIG11bHRpY2FzdCAmIGJyb2FkY2FzdCB0cmFmZmljLgorCisgICBccGFyYW0KKworICAgIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorCisgICAgZmlsdGVyTWFzay0gQ3VycmVudGx5IHRoZSBBUEkgdGFrZXMgYSAxIG9yIDAgKHNldCBvciByZXNldCkgYXMgZmlsdGVyLgorICAgIEJhc2ljYWxseSB0byBlbmFibGUvZGlzYWJsZSB0aGUgZmlsdGVyICh0byBmaWx0ZXIgImFsbCIgbWNiYyB0cmFmZmljKSBiYXNlZAorICAgIG9uIHRoaXMgcGFyYW0uIEluIGZ1dHVyZSB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBtYXNrIHRvIHNldCB2YXJpb3VzIHR5cGVzIG9mCisgICAgZmlsdGVycyBhcyBzdWdnZXN0ZWQgYmVsb3c6CisgICAgRklMVEVSX0FMTF9NVUxUSUNBU1Q6CisgICAgRklMVEVSX0FMTF9CUk9BRENBU1Q6CisgICAgRklMVEVSX0FMTF9NVUxUSUNBU1RfQlJPQURDQVNUOgorCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDREZfU1RBVFVTIHNtZV9jb25maWd1cmVfcnhwX2ZpbHRlcih0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgIHRwU2lyV2xhblNldFJ4cEZpbHRlcnMgd2xhblJ4cEZpbHRlclBhcmFtKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ09ORklHX1JYUEZJTCwgTk9fU0VTU0lPTiwgMCkpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkvKiBzZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gd2xhblJ4cEZpbHRlclBhcmFtOworCQljZHNfbWVzc2FnZS50eXBlID0gV01BX0NGR19SWFBfRklMVEVSX1JFUTsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGZuICAgIHNtZV9jb25maWd1cmVfc3VzcGVuZF9pbmQKKworICAgXGJyaWVmCisgICAgU01FIHdpbGwgcGFzcyB0aGlzIHJlcXVlc3QgdG8gbG93ZXIgbWFjIHRvIEluZGljYXRlIHRoYXQgdGhlIHdsYW4gbmVlZHMgdG8KKyAgICBiZSBzdXNwZW5kZWQKKworICAgXHBhcmFtCisKKyAgICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIHdsYW5TdXNwZW5kUGFyYW0tIERlcGljdHMgdGhlIHdsYW4gc3VzcGVuZCBwYXJhbXMKKworICAgIGNzcl9yZWFkeVRvU3VzcGVuZENhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gcmVhZHkgdG8gc3VzcGVuZAorCQkJCSBldmVudCBpcyByZWNlaXZlZC4KKwljYWxsYmFja19jb250ZXh0ICAtIENvbnRleHQgYXNzb2NpYXRlZCB3aXRoIGNzcl9yZWFkeVRvU3VzcGVuZENhbGxiYWNrLgorCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDREZfU1RBVFVTIHNtZV9jb25maWd1cmVfc3VzcGVuZF9pbmQodEhhbEhhbmRsZSBoSGFsLAorCQkJCSAgICAgdHBTaXJXbGFuU3VzcGVuZFBhcmFtIHdsYW5TdXNwZW5kUGFyYW0sCisJCQkJICAgICBjc3JfcmVhZHlUb1N1c3BlbmRDYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgICAgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9DT05GSUdfU1VTUEVORElORCwgTk9fU0VTU0lPTiwKKwkJCSAwKSk7CisKKwlwTWFjLT5yZWFkeVRvU3VzcGVuZENhbGxiYWNrID0gY2FsbGJhY2s7CisJcE1hYy0+cmVhZHlUb1N1c3BlbmRDb250ZXh0ID0gY2FsbGJhY2tfY29udGV4dDsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkvKiBzZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gd2xhblN1c3BlbmRQYXJhbTsKKwkJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9XTEFOX1NVU1BFTkRfSU5EOworCQljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJcE1hYy0+cmVhZHlUb1N1c3BlbmRDYWxsYmFjayA9IE5VTEw7CisJCQlwTWFjLT5yZWFkeVRvU3VzcGVuZENvbnRleHQgPSBOVUxMOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxmbiAgICBzbWVfY29uZmlndXJlX3Jlc3VtZV9yZXEKKworICAgXGJyaWVmCisgICAgU01FIHdpbGwgcGFzcyB0aGlzIHJlcXVlc3QgdG8gbG93ZXIgbWFjIHRvIEluZGljYXRlIHRoYXQgdGhlIHdsYW4gbmVlZHMgdG8KKyAgICBiZSBSZXN1bWVkCisKKyAgIFxwYXJhbQorCisgICAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisKKyAgICB3bGFuUmVzdW1lUGFyYW0tIERlcGljdHMgdGhlIHdsYW4gcmVzdW1lIHBhcmFtcworCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDREZfU1RBVFVTIHNtZV9jb25maWd1cmVfcmVzdW1lX3JlcSh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgIHRwU2lyV2xhblJlc3VtZVBhcmFtIHdsYW5SZXN1bWVQYXJhbSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0NPTkZJR19SRVNVTUVSRVEsIE5PX1NFU1NJT04sCisJCQkgMCkpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkvKiBzZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gd2xhblJlc3VtZVBhcmFtOworCQljZHNfbWVzc2FnZS50eXBlID0gV01BX1dMQU5fUkVTVU1FX1JFUTsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGZuICAgIHNtZV9jb25maWd1cmVfZXh0X3dvX3cKKworICAgXGJyaWVmCisgICAgU01FIHdpbGwgcGFzcyB0aGlzIHJlcXVlc3QgdG8gbG93ZXIgbWFjIHRvIGNvbmZpZ3VyZSBFeHRyIFdvVworCisgICBccGFyYW0KKworICAgIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorCisgICAgd2xhbkV4dFBhcmFtcy0gRGVwaWN0cyB0aGUgd2xhbiBFeHQgcGFyYW1zCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NERl9TVEFUVVMgc21lX2NvbmZpZ3VyZV9leHRfd29fdyh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICB0cFNpckV4dFdvV1BhcmFtcyB3bGFuRXh0UGFyYW1zLAorCQkJCSAgY3NyX3JlYWR5VG9FeHRXb1dDYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJdHBTaXJFeHRXb1dQYXJhbXMgTXNnUHRyID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpNc2dQdHIpKTsKKworCWlmICghTXNnUHRyKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ09ORklHX0VYVFdPVywgTk9fU0VTU0lPTiwgMCkpOworCisJcE1hYy0+cmVhZHlUb0V4dFdvV0NhbGxiYWNrID0gY2FsbGJhY2s7CisJcE1hYy0+cmVhZHlUb0V4dFdvV0NvbnRleHQgPSBjYWxsYmFja19jb250ZXh0OworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisKKwkJLyogc2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwkJY2RmX21lbV9jb3B5KE1zZ1B0ciwgd2xhbkV4dFBhcmFtcywgc2l6ZW9mKCpNc2dQdHIpKTsKKwkJY2RzX21lc3NhZ2UuYm9keXB0ciA9IE1zZ1B0cjsKKwkJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9XTEFOX0VYVF9XT1c7CisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlwTWFjLT5yZWFkeVRvRXh0V29XQ2FsbGJhY2sgPSBOVUxMOworCQkJcE1hYy0+cmVhZHlUb0V4dFdvV0NvbnRleHQgPSBOVUxMOworCQkJY2RmX21lbV9mcmVlKE1zZ1B0cik7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9IGVsc2UgeworCQlwTWFjLT5yZWFkeVRvRXh0V29XQ2FsbGJhY2sgPSBOVUxMOworCQlwTWFjLT5yZWFkeVRvRXh0V29XQ29udGV4dCA9IE5VTEw7CisJCWNkZl9tZW1fZnJlZShNc2dQdHIpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcZm4gICAgc21lX2NvbmZpZ3VyZV9hcHBfdHlwZTFfcGFyYW1zCisKKyAgIFxicmllZgorICAgU01FIHdpbGwgcGFzcyB0aGlzIHJlcXVlc3QgdG8gbG93ZXIgbWFjIHRvIGNvbmZpZ3VyZSBJbmRvb3IgV29XIHBhcmFtZXRlcnMuCisKKyAgIFxwYXJhbQorCisgICAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisKKyAgICB3bGFuQXBwVHlwZTFQYXJhbXMtIERlcGljdHMgdGhlIHdsYW4gQXBwIFR5cGUgMShJbmRvb3IpIHBhcmFtcworCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDREZfU1RBVFVTIHNtZV9jb25maWd1cmVfYXBwX3R5cGUxX3BhcmFtcyh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSAgdHBTaXJBcHBUeXBlMVBhcmFtcyB3bGFuQXBwVHlwZTFQYXJhbXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJdHBTaXJBcHBUeXBlMVBhcmFtcyBNc2dQdHIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKk1zZ1B0cikpOworCisJaWYgKCFNc2dQdHIpCisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9DT05GSUdfQVBQX1RZUEUxLCBOT19TRVNTSU9OLAorCQkJIDApKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkvKiBzZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZGZfbWVtX2NvcHkoTXNnUHRyLCB3bGFuQXBwVHlwZTFQYXJhbXMsIHNpemVvZigqTXNnUHRyKSk7CisJCWNkc19tZXNzYWdlLmJvZHlwdHIgPSBNc2dQdHI7CisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfV0xBTl9TRVRfQVBQX1RZUEUxX1BBUkFNUzsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCWNkZl9tZW1fZnJlZShNc2dQdHIpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfSBlbHNlIHsKKwkJY2RmX21lbV9mcmVlKE1zZ1B0cik7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxmbiAgICBzbWVfY29uZmlndXJlX2FwcF90eXBlMl9wYXJhbXMKKworICAgXGJyaWVmCisgICBTTUUgd2lsbCBwYXNzIHRoaXMgcmVxdWVzdCB0byBsb3dlciBtYWMgdG8gY29uZmlndXJlIEluZG9vciBXb1cgcGFyYW1ldGVycy4KKworICAgXHBhcmFtCisKKyAgICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIHdsYW5BcHBUeXBlMlBhcmFtcy0gRGVwaWN0cyB0aGUgd2xhbiBBcHAgVHlwZSAyIChPdXRkb29yKSBwYXJhbXMKKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworQ0RGX1NUQVRVUyBzbWVfY29uZmlndXJlX2FwcF90eXBlMl9wYXJhbXModEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgIHRwU2lyQXBwVHlwZTJQYXJhbXMgd2xhbkFwcFR5cGUyUGFyYW1zKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCXRwU2lyQXBwVHlwZTJQYXJhbXMgTXNnUHRyID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpNc2dQdHIpKTsKKworCWlmICghTXNnUHRyKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ09ORklHX0FQUF9UWVBFMiwgTk9fU0VTU0lPTiwKKwkJCSAwKSk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJLyogc2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwkJY2RmX21lbV9jb3B5KE1zZ1B0ciwgd2xhbkFwcFR5cGUyUGFyYW1zLCBzaXplb2YoKk1zZ1B0cikpOworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gTXNnUHRyOworCQljZHNfbWVzc2FnZS50eXBlID0gV01BX1dMQU5fU0VUX0FQUF9UWVBFMl9QQVJBTVM7CisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQljZGZfbWVtX2ZyZWUoTXNnUHRyKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0gZWxzZSB7CisJCWNkZl9tZW1fZnJlZShNc2dQdHIpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX2dldF9pbmZyYV9zZXNzaW9uX2lkCisKKyAgICBcYnJpZWYgVG8gZ2V0IHRoZSBzZXNzaW9uIElEIGZvciBpbmZyYSBzZXNzaW9uLCBpZiBjb25uZWN0ZWQKKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorCisgICAgXHJldHVybiBzZXNzaW9uaWQsIC0xIGlmIGluZnJhIHNlc3Npb24gaXMgbm90IGNvbm5lY3RlZAorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludDhfdCBzbWVfZ2V0X2luZnJhX3Nlc3Npb25faWQodEhhbEhhbmRsZSBoSGFsKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJaW50OF90IHNlc3Npb25pZCA9IC0xOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCisJCXNlc3Npb25pZCA9IGNzcl9nZXRfaW5mcmFfc2Vzc2lvbl9pZChwTWFjKTsKKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc2Vzc2lvbmlkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfZ2V0X2luZnJhX29wZXJhdGlvbl9jaGFubmVsCisKKyAgICBcYnJpZWYgVG8gZ2V0IHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBmb3IgaW5mcmEgc2Vzc2lvbiwgaWYgY29ubmVjdGVkCisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gc2Vzc2lvbklkIC0gdGhlIHNlc3Npb25JZCByZXR1cm5lZCBieSBzbWVfb3Blbl9zZXNzaW9uLgorCisgICAgXHJldHVybiBvcGVyYXRpbmcgY2hhbm5lbCwgMCBpZiBpbmZyYSBzZXNzaW9uIGlzIG5vdCBjb25uZWN0ZWQKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1aW50OF90IHNtZV9nZXRfaW5mcmFfb3BlcmF0aW9uX2NoYW5uZWwodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl1aW50OF90IGNoYW5uZWwgPSAwOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCisJCWNoYW5uZWwgPSBjc3JfZ2V0X2luZnJhX29wZXJhdGlvbl9jaGFubmVsKHBNYWMsIHNlc3Npb25JZCk7CisKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIGNoYW5uZWw7Cit9CisKKy8qIFRoaXMgcm91dGluZSB3aWxsIHJldHVybiBwb2VyYXRpbmcgY2hhbm5lbCBvbiB3aGljaCBvdGhlciBCU1MgaXMgb3BlcmF0aW5nIHRvIGJlIHVzZWQgZm9yIGNvbmN1cnJlbmN5IG1vZGUuICovCisvKiBJZiBvdGhlciBCU1MgaXMgbm90IHVwIG9yIG5vdCBjb25uZWN0ZWQgaXQgd2lsbCByZXR1cm4gMCAqLwordWludDhfdCBzbWVfZ2V0X2NvbmN1cnJlbnRfb3BlcmF0aW9uX2NoYW5uZWwodEhhbEhhbmRsZSBoSGFsKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXVpbnQ4X3QgY2hhbm5lbCA9IDA7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisKKwkJY2hhbm5lbCA9IGNzcl9nZXRfY29uY3VycmVudF9vcGVyYXRpb25fY2hhbm5lbChwTWFjKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6ICIKKwkJCSAgIiBPdGhlciBDb25jdXJyZW50IENoYW5uZWwgPSAlZCIsIF9fZnVuY19fLCBjaGFubmVsKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIGNoYW5uZWw7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKK3VpbnQxNl90IHNtZV9jaGVja19jb25jdXJyZW50X2NoYW5uZWxfb3ZlcmxhcCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQxNl90IHNhcF9jaCwKKwkJCQkJICAgICAgZUNzclBoeU1vZGUgc2FwUGh5TW9kZSwKKwkJCQkJICAgICAgdWludDhfdCBjY19zd2l0Y2hfbW9kZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl1aW50MTZfdCBjaGFubmVsID0gMDsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljaGFubmVsID0KKwkJCWNzcl9jaGVja19jb25jdXJyZW50X2NoYW5uZWxfb3ZlcmxhcChwTWFjLCBzYXBfY2gsIHNhcFBoeU1vZGUsCisJCQkJCQkJICAgICBjY19zd2l0Y2hfbW9kZSk7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBjaGFubmVsOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogc21lX3ByZWZlcnJlZF9uZXR3b3JrX2ZvdW5kX2luZAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSW52b2tlIFByZWZlcnJlZCBOZXR3b3JrIEZvdW5kIEluZGljYXRpb24KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKiAgICBwTXNnIC0gZm91bmQgbmV0d29yayBkZXNjcmlwdGlvbgorKgorKiBSZXR1cm5zOiBDREZfU1RBVFVTCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDREZfU1RBVFVTIHNtZV9wcmVmZXJyZWRfbmV0d29ya19mb3VuZF9pbmQodEhhbEhhbmRsZSBoSGFsLCB2b2lkICpwTXNnKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U2lyUHJlZk5ldHdvcmtGb3VuZEluZCAqcFByZWZOZXR3b3JrRm91bmRJbmQgPQorCQkodFNpclByZWZOZXR3b3JrRm91bmRJbmQgKikgcE1zZzsKKwl1aW50OF90IGR1bXBTc0lkW1NJUl9NQUNfTUFYX1NTSURfTEVOR1RIICsgMV07CisJdWludDhfdCBzc0lkTGVuZ3RoID0gMDsKKworCWlmIChOVUxMID09IHBNc2cpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiaW4gJXMgbXNnIHB0ciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKHBNYWMtPnBub09mZmxvYWQpIHsKKwkJLyogQ2FsbCBQcmVmZXJyZWQgTmV0d29yayBGb3VuZCBJbmRpY2F0aW9uIGNhbGxiYWNrIHJvdXRpbmUuICovCisJCWlmIChwTWFjLT5zbWUucHJlZl9uZXR3X2ZvdW5kX2NiICE9IE5VTEwpIHsKKwkJCXBNYWMtPnNtZS5wcmVmX25ldHdfZm91bmRfY2IocE1hYy0+c21lLgorCQkJCQlwcmVmZXJyZWRfbmV0d29ya19mb3VuZF9pbmRfY2JfY3R4LAorCQkJCQlwUHJlZk5ldHdvcmtGb3VuZEluZCk7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAocFByZWZOZXR3b3JrRm91bmRJbmQtPnNzSWQubGVuZ3RoID4gMCkgeworCQlzc0lkTGVuZ3RoID0gQ1NSX01JTihTSVJfTUFDX01BWF9TU0lEX0xFTkdUSCwKKwkJCQkgICAgIHBQcmVmTmV0d29ya0ZvdW5kSW5kLT5zc0lkLmxlbmd0aCk7CisJCWNkZl9tZW1fY29weShkdW1wU3NJZCwgcFByZWZOZXR3b3JrRm91bmRJbmQtPnNzSWQuc3NJZCwKKwkJCSAgICAgc3NJZExlbmd0aCk7CisJCWR1bXBTc0lkW3NzSWRMZW5ndGhdID0gMDsKKwkJc21zX2xvZyhwTWFjLCBMT0cyLCAiJXM6U1NJRD0lcyBmcmFtZSBsZW5ndGggJWQiLAorCQkJX19mdW5jX18sIGR1bXBTc0lkLCBwUHJlZk5ldHdvcmtGb3VuZEluZC0+ZnJhbWVMZW5ndGgpOworCisJCS8qIEZsdXNoIHNjYW4gcmVzdWx0cywgU28gYXMgdG8gYXZvaWQgaW5kaWNhdGlvbi91cGRhdGlvbiBvZgorCQkgKiBzdGFsZSBlbnRyaWVzLCB3aGljaCBtYXkgbm90IGhhdmUgYWdlZCBvdXQgZHVyaW5nIEFQUFMgY29sbGFwc2UKKwkJICovCisJCXNtZV9zY2FuX2ZsdXNoX3Jlc3VsdChoSGFsKTsKKworCQkvKiBTYXZlIHRoZSBmcmFtZSB0byBzY2FuIHJlc3VsdCAqLworCQlpZiAocFByZWZOZXR3b3JrRm91bmRJbmQtPm1lc2dMZW4gPgorCQkgICAgc2l6ZW9mKHRTaXJQcmVmTmV0d29ya0ZvdW5kSW5kKSkgeworCQkJLyogd2UgbWF5IGhhdmUgYSBmcmFtZSAqLworCQkJc3RhdHVzID0gY3NyX3NjYW5fc2F2ZV9wcmVmZXJyZWRfbmV0d29ya19mb3VuZChwTWFjLAorCQkJCQlwUHJlZk5ldHdvcmtGb3VuZEluZCk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTCgiIGZhaWwgdG8gc2F2ZSBwcmVmZXJyZWQgbmV0d29yayIpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiIG5vdCBlbm91Z2ggZGF0YSBsZW5ndGggJWQgbmVlZGVkICV6dSIpLAorCQkJCXBQcmVmTmV0d29ya0ZvdW5kSW5kLT5tZXNnTGVuLAorCQkJCXNpemVvZih0U2lyUHJlZk5ldHdvcmtGb3VuZEluZCkpOworCQl9CisKKwkJLyogQ2FsbCBQcmVmZXJyZWQgTmV0b3dyayBGb3VuZCBJbmRpY2F0aW9uIGNhbGxiYWNrIHJvdXRpbmUuICovCisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKQorCQkgICAgJiYgKHBNYWMtPnNtZS5wcmVmX25ldHdfZm91bmRfY2IgIT0gTlVMTCkpIHsKKwkJCXBNYWMtPnNtZS5wcmVmX25ldHdfZm91bmRfY2IocE1hYy0+c21lLgorCQkJCQlwcmVmZXJyZWRfbmV0d29ya19mb3VuZF9pbmRfY2JfY3R4LAorCQkJCQlwUHJlZk5ldHdvcmtGb3VuZEluZCk7CisJCX0KKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsICIlczogY2FsbGJhY2sgZmFpbGVkIC0gU1NJRCBpcyBOVUxMIiwKKwkJCV9fZnVuY19fKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCitDREZfU1RBVFVTIHNtZV9nZXRfY2ZnX3ZhbGlkX2NoYW5uZWxzKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCAqYVZhbGlkQ2hhbm5lbHMsCisJCQkJICAgICAgdWludDMyX3QgKmxlbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzdGF0dXMgPSBjc3JfZ2V0X2NmZ192YWxpZF9jaGFubmVscyhwTWFjLCBhVmFsaWRDaGFubmVscywgbGVuKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX2hhbmRsZV9jaGFuZ2VfY291bnRyeV9jb2RlCisKKyAgICBcYnJpZWYgQ2hhbmdlIENvdW50cnkgY29kZSwgUmVnIERvbWFpbiBhbmQgY2hhbm5lbCBsaXN0CisKKyAgICBcZGV0YWlscyBDb3VudHJ5IENvZGUgUHJpb3JpdHkKKyAgICBJZiBTdXBwbGljYW50IGNvdW50cnkgY29kZSBpcyBwcmlvcml0eSB0aGFuIDExZCBpcyBkaXNhYmxlZC4KKyAgICBJZiAxMUQgaXMgZW5hYmxlZCwgd2UgdXBkYXRlIHRoZSBjb3VudHJ5IGNvZGUgYWZ0ZXIgZXZlcnkgc2Nhbi4KKyAgICBIZW5jZSB3aGVuIFN1cHBsaWNhbnQgY291bnRyeSBjb2RlIGlzIHByaW9yaXR5LCB3ZSBkb24ndCBuZWVkIDExRCBpbmZvLgorICAgIENvdW50cnkgY29kZSBmcm9tIFN1cHBsaWNhbnQgaXMgc2V0IGFzIGN1cnJlbnQgY291cnRyeSBjb2RlLgorICAgIFVzZXIgY2FuIHNlbmQgcmVzZXQgY29tbWFuZCBYWCAoaW5zdGVhZCBvZiBjb3VudHJ5IGNvZGUpIHRvIHJlc2V0IHRoZQorICAgIGNvdW50cnkgY29kZSB0byBkZWZhdWx0IHZhbHVlcy4KKyAgICBJZiAxMUQgaXMgcHJpb3JpdHksCisgICAgVGhhbiBTdXBwbGljYW50IGNvdW50cnkgY29kZSBjb2RlIGlzIHNldCB0byBkZWZhdWx0IGNvZGUuIEJ1dCAxMUQgY29kZSBpcyBzZXQgYXMgY3VycmVudCBjb3VudHJ5IGNvZGUKKworICAgIFxwYXJhbSBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gcE1zZ0J1ZiAtIE1TRyBCdWZmZXIKKworICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2hhbmRsZV9jaGFuZ2VfY291bnRyeV9jb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdEFuaUNoYW5nZUNvdW50cnlDb2RlUmVxICpwTXNnOworCXZfUkVHRE9NQUlOX3QgZG9tYWluSWRJb2N0bDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJc3RhdGljIGNvdW50cnlfY29kZV90IGRlZmF1bHRfY291bnRyeTsKKwlwTXNnID0gKHRBbmlDaGFuZ2VDb3VudHJ5Q29kZVJlcSAqKSBwTXNnQnVmOworCisJLyoKKwkgKiBpZiB0aGUgcmVzZXQgU3VwcGxpY2FudCBjb3VudHJ5IGNvZGUgY29tbWFuZCBpcyB0cmlnZ2VyZWQsCisJICogZW5hYmxlIDExRCwgcmVzZXQgdGhlIGNvdW50cnkgY29kZSBhbmQgcmV0dXJuCisJICovCisJaWYgKHRydWUgPT0KKwkgICAgY2RmX21lbV9jb21wYXJlKHBNc2ctPmNvdW50cnlDb2RlLCBTTUVfSU5WQUxJRF9DT1VOVFJZX0NPREUsIDIpKSB7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCA9CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFkU3VwcG9ydEVuYWJsZWRPcmlnaW5hbDsKKworCQljZGZfc3RhdHVzID0gY2RzX3JlYWRfZGVmYXVsdF9jb3VudHJ5KGRlZmF1bHRfY291bnRyeSk7CisKKwkJLyogcmVhZCB0aGUgY291bnRyeSBjb2RlIGFuZCB1c2UgaXQgKi8KKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJY2RmX21lbV9jb3B5KHBNc2ctPmNvdW50cnlDb2RlLAorCQkJCSAgICAgZGVmYXVsdF9jb3VudHJ5LAorCQkJCSAgICAgV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQkvKgorCQkgKiBVcGRhdGUgdGhlIDExZCBjb3VudHJ5IHRvIGRlZmF1bHQgY291bnRyeSBzbyB0aGF0IHdoZW4KKwkJICogY2FsbGJhY2sgaXMgcmVjZWl2ZWQgZm9yIHRoaXMgZGVmYXVsdCBjb3VudHJ5LCBkcml2ZXIgd2lsbAorCQkgKiBub3QgZGlzYWJsZSB0aGUgMTFkIHRha2luZyBpdCBhcyB2YWxpZCBjb3VudHJ5IGJ5IHVzZXIuCisJCSAqLworCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQlGTCgiU2V0IGRlZmF1bHQgY291bnRyeSBjb2RlICglYyVjKSBhcyBpbnZhbGlkIGNvdW50cnkgcmVjZWl2ZWQiKSwKKwkJCXBNc2ctPmNvdW50cnlDb2RlWzBdLCBwTXNnLT5jb3VudHJ5Q29kZVsxXSk7CisJCQljZGZfbWVtX2NvcHkocE1hYy0+c2Nhbi5jb3VudHJ5Q29kZTExZCwKKwkJCXBNc2ctPmNvdW50cnlDb2RlLAorCQkJV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKTsKKwl9IGVsc2UgeworCQkvKiBpZiBTdXBwbGljYW50IGNvdW50cnkgY29kZSBoYXMgcHJpb3JpdHksIGRpc2FibGUgMTFkICovCisJCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eSAmJgorCQkgICAgcE1zZy0+Y291bnRyeUZyb21Vc2VyU3BhY2UpIHsKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCA9IGZhbHNlOworCQl9CisJfQorCisJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCkKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworCS8qIFNldCBDdXJyZW50IENvdW50cnkgY29kZSBhbmQgQ3VycmVudCBSZWd1bGF0b3J5IGRvbWFpbiAqLworCXN0YXR1cyA9IGNzcl9zZXRfY291bnRyeV9jb2RlKHBNYWMsIHBNc2ctPmNvdW50cnlDb2RlKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQkvKiBTdXBwbGljYW50IGNvdW50cnkgY29kZSBmYWlsZWQuIFNvIGdpdmUgMTFEIHByaW9yaXR5ICovCisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCA9CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFkU3VwcG9ydEVuYWJsZWRPcmlnaW5hbDsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiU2V0IENvdW50cnkgQ29kZSBGYWlsICVkIiwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBvdmVyd3JpdGUgdGhlIGRlZnVhbHQgY291bnRyeSBjb2RlICovCisJY2RmX21lbV9jb3B5KHBNYWMtPnNjYW4uY291bnRyeUNvZGVEZWZhdWx0LAorCQkgICAgIHBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCisJLyogR2V0IERvbWFpbiBJRCBmcm9tIGNvdW50cnkgY29kZSAqLworCXN0YXR1cyA9IGNzcl9nZXRfcmVndWxhdG9yeV9kb21haW5fZm9yX2NvdW50cnkocE1hYywKKwkJCQkJCSAgICAgICBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwKKwkJCQkJCSAgICAgICAodl9SRUdET01BSU5fdCAqKSAmCisJCQkJCQkgICAgICAgZG9tYWluSWRJb2N0bCwgQ09VTlRSWV9RVUVSWSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBmYWlsIHRvIGdldCByZWdJZCAlZCIpLCBkb21haW5JZElvY3RsKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9IGVsc2UgaWYgKFJFR0RPTUFJTl9XT1JMRCA9PSBkb21haW5JZElvY3RsKSB7CisJCS8qIFN1cHBsaWNhbnQgY291bnRyeSBjb2RlIGlzIGludmFsaWQsIHNvIHdlIGFyZSBvbiB3b3JsZCBtb2RlIG5vdy4gU28KKwkJICAgZ2l2ZSAxMUQgY2hhbmNlIHRvIHVwZGF0ZSAqLworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFkU3VwcG9ydEVuYWJsZWQgPQorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkT3JpZ2luYWw7CisJCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIkNvdW50cnkgQ29kZSB1bnJlY29nbml6ZWQgYnkgZHJpdmVyIikpOworCX0KKworCXN0YXR1cyA9IHdtYV9zZXRfcmVnX2RvbWFpbihwTWFjLCBkb21haW5JZElvY3RsKTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgZmFpbCB0byBzZXQgcmVnSWQgJWQiKSwgZG9tYWluSWRJb2N0bCk7CisJCXJldHVybiBzdGF0dXM7CisJfSBlbHNlIHsKKwkJLyogaWYgMTFkIGhhcyBwcmlvcml0eSwgY2xlYXIgY3VycmVudENvdW50cnlCc3NpZCAmIGNvdW50cnlDb2RlMTFkIHRvIGdldCAqLworCQkvKiBzZXQgYWdhaW4gaWYgd2UgZmluZCBBUCB3aXRoIDExZCBpbmZvIGR1cmluZyBzY2FuICovCisJCWlmICghcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mU3VwcGxpY2FudENvdW50cnlDb2RlSGFzUHJpb3JpdHkpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQlGTAorCQkJCQkoIkNsZWFyaW5nIGN1cnJlbnRDb3VudHJ5QnNzaWQsIGNvdW50cnlDb2RlMTFkIikpOworCQkJY2RmX21lbV96ZXJvKCZwTWFjLT5zY2FuLmN1cnJlbnRDb3VudHJ5QnNzaWQsCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCQkJY2RmX21lbV96ZXJvKHBNYWMtPnNjYW4uY291bnRyeUNvZGUxMWQsCisJCQkJICAgICBzaXplb2YocE1hYy0+c2Nhbi5jb3VudHJ5Q29kZTExZCkpOworCQl9CisJfQorCisJaWYgKHBNc2ctPmNoYW5nZUNDQ2FsbGJhY2spIHsKKwkJKCh0U21lQ2hhbmdlQ291bnRyeUNhbGxiYWNrKSAocE1zZy0+Y2hhbmdlQ0NDYWxsYmFjaykpKCh2b2lkICopCisJCQkJCQkJCSAgICAgICBwTXNnLT4KKwkJCQkJCQkJICAgICAgIHBEZXZDb250ZXh0KTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHNtZV9oYW5kbGVfY2hhbmdlX2NvdW50cnlfY29kZV9ieV91c2VyKCkgLSBoYW5kbGVzIGNvdW50cnkgY2ggcmVxCisgKiBAbWFjX2N0eDogICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAbXNnOiAgICAgICAgcmVxdWVzdCBtc2cgcGFja2V0CisgKgorICogSWYgU3VwcGxpY2FudCBjb3VudHJ5IGNvZGUgaXMgcHJpb3JpdHkgdGhhbiAxMWQgaXMgZGlzYWJsZWQuCisgKiBJZiAxMUQgaXMgZW5hYmxlZCwgd2UgdXBkYXRlIHRoZSBjb3VudHJ5IGNvZGUgYWZ0ZXIgZXZlcnkgc2Nhbi4KKyAqIEhlbmNlIHdoZW4gU3VwcGxpY2FudCBjb3VudHJ5IGNvZGUgaXMgcHJpb3JpdHksIHdlIGRvbid0IG5lZWQgMTFEIGluZm8uCisgKiBDb3VudHJ5IGNvZGUgZnJvbSBTdXBwbGljYW50IGlzIHNldCBhcyBjdXJyZW50IGNvdW50cnkgY29kZS4KKyAqCisgKiBSZXR1cm46IHN0YXR1cyBvZiBvcGVyYXRpb24KKyAqLworQ0RGX1NUQVRVUworc21lX2hhbmRsZV9jaGFuZ2VfY291bnRyeV9jb2RlX2J5X3VzZXIodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgICAgICAgdEFuaUdlbmVyaWNDaGFuZ2VDb3VudHJ5Q29kZVJlcSAqbXNnKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXZfUkVHRE9NQUlOX3QgcmVnX2RvbWFpbl9pZDsKKwlib29sIGlzXzExZF9jb3VudHJ5ID0gZmFsc2U7CisJYm9vbCBzdXBwbGljYW50X3ByaW9yaXR5ID0KKwkJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5mU3VwcGxpY2FudENvdW50cnlDb2RlSGFzUHJpb3JpdHk7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsIEZMKCIgY2FsbGVkIikpOworCXJlZ19kb21haW5faWQgPSAodl9SRUdET01BSU5fdCkgbXNnLT5kb21haW5faW5kZXg7CisJaWYgKG1lbWNtcChtc2ctPmNvdW50cnlDb2RlLCBtYWNfY3R4LT5zY2FuLmNvdW50cnlDb2RlMTFkLAorCQkgICBDRFNfQ09VTlRSWV9DT0RFX0xFTikgPT0gMCkgeworCQlpc18xMWRfY291bnRyeSA9IHRydWU7CisJfQorCS8qIFNldCB0aGUgY291bnRyeSBjb2RlIGdpdmVuIGJ5IHVzZXJzcGFjZSB3aGVuIDExZE9yaWdpbmFsIGlzIGZhbHNlCisJICogd2hlbiAxMWRvcmlnaW5hbCBpcyBUcnVlLGlzXzExZF9jb3VudHJ5ID0wIGFuZAorCSAqIGZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eSA9IDAsIHRoZW4gcmV2ZXJ0IHRoZSBjb3VudHJ5IGNvZGUsCisJICogYW5kIHJldHVybiBmYWlsdXJlCisJICovCisJaWYgKG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZE9yaWdpbmFsID09IHRydWUKKwkgICAgJiYgIWlzXzExZF9jb3VudHJ5ICYmICFzdXBwbGljYW50X3ByaW9yaXR5KSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJJbmNvcnJlY3QgY291bnRyeSByZXEsIG51bGxpZnkgdGhpcyIpKTsKKworCQkvKiB3ZSBoYXZlIGdvdCBhIHJlcXVlc3QgZm9yIGEgY291bnRyeSB0aGF0IHNob3VsZCBub3QgaGF2ZSBiZWVuCisJCSAqIGFkZGVkIHNpbmNlIHRoZSBTVEEgaXMgYXNzb2NpYXRlZDsgbnVsbGlmeSB0aGlzIHJlcXVlc3QuIElmCisJCSAqIGJvdGggY291bnRyeUNvZGUxMWRbMF0gYW5kIGNvdW50cnlDb2RlMTFkWzFdIGFyZSB6ZXJvLCByZXZlcnQKKwkJICogaXQgdG8gV29ybGQgZG9tYWluIHRvIGF2b2lkIGZyb20gY2F1c2luZyBjZmc4MDIxMSBjYWxsIHRyYWNlLgorCQkgKi8KKwkJaWYgKChtYWNfY3R4LT5zY2FuLmNvdW50cnlDb2RlMTFkWzBdID09IDApCisJCSAgICAmJiAobWFjX2N0eC0+c2Nhbi5jb3VudHJ5Q29kZTExZFsxXSA9PSAwKSkKKwkJCXN0YXR1cyA9IGNzcl9nZXRfcmVndWxhdG9yeV9kb21haW5fZm9yX2NvdW50cnkobWFjX2N0eCwKKwkJCQkJIjAwIiwgKHZfUkVHRE9NQUlOX3QgKikgJnJlZ19kb21haW5faWQsCisJCQkJCUNPVU5UUllfSUUpOworCQllbHNlCisJCQlzdGF0dXMgPSBjc3JfZ2V0X3JlZ3VsYXRvcnlfZG9tYWluX2Zvcl9jb3VudHJ5KG1hY19jdHgsCisJCQkJCW1hY19jdHgtPnNjYW4uY291bnRyeUNvZGUxMWQsCisJCQkJCSh2X1JFR0RPTUFJTl90ICopICZyZWdfZG9tYWluX2lkLAorCQkJCQlDT1VOVFJZX0lFKTsKKworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIGlmIFN1cHBsaWNhbnQgY291bnRyeSBjb2RlIGhhcyBwcmlvcml0eSwgZGlzYWJsZSAxMWQgKi8KKwlpZiAoIWlzXzExZF9jb3VudHJ5ICYmIHN1cHBsaWNhbnRfcHJpb3JpdHkpCisJCW1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCA9IGZhbHNlOworCWNkZl9tZW1fY29weShtYWNfY3R4LT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwgbXNnLT5jb3VudHJ5Q29kZSwKKwkJICAgICBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCXN0YXR1cyA9IHdtYV9zZXRfcmVnX2RvbWFpbihtYWNfY3R4LCByZWdfZG9tYWluX2lkKTsKKwlpZiAoZmFsc2UgPT0gaXNfMTFkX2NvdW50cnkpIHsKKwkJLyogb3ZlcndyaXRlIHRoZSBkZWZ1YWx0IGNvdW50cnkgY29kZSAqLworCQljZGZfbWVtX2NvcHkobWFjX2N0eC0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsCisJCQkgICAgIG1hY19jdHgtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LAorCQkJICAgICBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCQkvKiBzZXQgdG8gZGVmYXVsdCBkb21haW4gSUQgKi8KKwkJbWFjX2N0eC0+c2Nhbi5kb21haW5JZERlZmF1bHQgPSBtYWNfY3R4LT5zY2FuLmRvbWFpbklkQ3VycmVudDsKKwl9CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiZmFpbCB0byBzZXQgcmVnSWQgJWQiKSwKKwkJCXJlZ19kb21haW5faWQpOworCQlyZXR1cm4gc3RhdHVzOworCX0gZWxzZSB7CisJCS8qIGlmIDExZCBoYXMgcHJpb3JpdHksIGNsZWFyIGN1cnJlbnRDb3VudHJ5QnNzaWQgJgorCQkgKiBjb3VudHJ5Q29kZTExZCB0byBnZXQgc2V0IGFnYWluIGlmIHdlIGZpbmQgQVAgd2l0aCAxMWQgaW5mbworCQkgKiBkdXJpbmcgc2NhbgorCQkgKi8KKwkJaWYgKCFzdXBwbGljYW50X3ByaW9yaXR5ICYmIChmYWxzZSA9PSBpc18xMWRfY291bnRyeSkpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiQ2xlYXJpbmcgY3VycmVudENvdW50cnlCc3NpZCwgY291bnRyeUNvZGUxMWQiKSk7CisJCQljZGZfbWVtX3plcm8oJm1hY19jdHgtPnNjYW4uY3VycmVudENvdW50cnlCc3NpZCwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJCQljZGZfbWVtX3plcm8obWFjX2N0eC0+c2Nhbi5jb3VudHJ5Q29kZTExZCwKKwkJCQkgICAgIHNpemVvZihtYWNfY3R4LT5zY2FuLmNvdW50cnlDb2RlMTFkKSk7CisJCX0KKwl9CisJLyogZ2V0IHRoZSBjaGFubmVscyBiYXNlZCBvbiBuZXcgY2MgKi8KKwlzdGF0dXMgPSBjc3JfZ2V0X2NoYW5uZWxfYW5kX3Bvd2VyX2xpc3QobWFjX2N0eCk7CisKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJmYWlsIHRvIGdldCBDaGFubmVscyIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJLyogcmVzZXQgaW5mbyBiYXNlZCBvbiBuZXcgY2MsIGFuZCB3ZSBhcmUgZG9uZSAqLworCWNzcl9hcHBseV9jaGFubmVsX3Bvd2VyX2luZm9fd3JhcHBlcihtYWNfY3R4KTsKKworCS8qIENvdW50cnkgY29kZSAgQ2hhbmdlZCwgUHVyZ2UgT25seSBzY2FuIHJlc3VsdAorCSAqIHdoaWNoIGRvZXMgbm90IGhhdmUgY2hhbm5lbCBudW1iZXIgYmVsb25nIHRvIDExZAorCSAqIGNoYW5uZWwgbGlzdAorCSAqLworCWNzcl9zY2FuX2ZpbHRlcl9yZXN1bHRzKG1hY19jdHgpOworCS8qIERvIGFjdGl2ZSBzY2FucyBhZnRlciB0aGUgY291bnRyeSBpcyBzZXQgYnkgVXNlciBoaW50cyBvcgorCSAqIENvdW50cnkgSUUKKwkgKi8KKwltYWNfY3R4LT5zY2FuLmN1clNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKwlzbWVfZGlzY29ubmVjdF9jb25uZWN0ZWRfc2Vzc2lvbnMobWFjX2N0eCk7CisJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiIHJldHVybmVkIikpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9oYW5kbGVfY2hhbmdlX2NvdW50cnlfY29kZV9ieV9jb3JlCisKKyAgICBcYnJpZWYgVXBkYXRlIENvdW50cnkgY29kZSBpbiB0aGUgZHJpdmVyIGlmIHNldCBieSBrZXJuZWwgYXMgd29ybGQKKworICAgIElmIDExRCBpcyBlbmFibGVkLCB3ZSB1cGRhdGUgdGhlIGNvdW50cnkgY29kZSBhZnRlciBldmVyeSBzY2FuICYgbm90aWZ5IGtlcm5lbC4KKyAgICBUaGlzIGlzIHRvIG1ha2Ugc3VyZSBrZXJuZWwgJiBkcml2ZXIgYXJlIGluIHN5bmMgaW4gY2FzZSBvZiBDQyBmb3VuZCBpbgorICAgIGRyaXZlciBidXQgbm90IGluIGtlcm5lbCBkYXRhYmFzZQorCisgICAgXHBhcmFtIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgIFxwYXJhbSBwTXNnIC0gQ2FycnlpbmcgbmV3IENDIHNldCBpbiBrZXJuZWwKKworICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2hhbmRsZV9jaGFuZ2VfY291bnRyeV9jb2RlX2J5X2NvcmUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgdEFuaUdlbmVyaWNDaGFuZ2VDb3VudHJ5Q29kZVJlcSAqCisJCQkJCQkgIHBNc2cpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCIgY2FsbGVkIikpOworCisJLyogdGhpcyBpcyB0byBtYWtlIHN1cmUga2VybmVsICYgZHJpdmVyIGFyZSBpbiBzeW5jIGluIGNhc2Ugb2YgQ0MgZm91bmQgaW4gKi8KKwkvKiBkcml2ZXIgYnV0IG5vdCBpbiBrZXJuZWwgZGF0YWJhc2UgKi8KKwlpZiAoKCcwJyA9PSBwTXNnLT5jb3VudHJ5Q29kZVswXSkgJiYgKCcwJyA9PSBwTXNnLT5jb3VudHJ5Q29kZVsxXSkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIlNldHRpbmcgY291bnRyeUNvZGUxMWQgJiBjb3VudHJ5Q29kZUN1cnJlbnQgdG8gd29ybGQgQ0MiKSk7CisJCWNkZl9tZW1fY29weShwTWFjLT5zY2FuLmNvdW50cnlDb2RlMTFkLCBwTXNnLT5jb3VudHJ5Q29kZSwKKwkJCSAgICAgV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKTsKKwkJY2RmX21lbV9jb3B5KHBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LCBwTXNnLT5jb3VudHJ5Q29kZSwKKwkJCSAgICAgV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKTsKKwl9CisKKwlzdGF0dXMgPSB3bWFfc2V0X3JlZ19kb21haW4ocE1hYywgUkVHRE9NQUlOX1dPUkxEKTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgZmFpbCB0byBzZXQgcmVnSWQiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gY3NyX2dldF9jaGFubmVsX2FuZF9wb3dlcl9saXN0KHBNYWMpOworCQlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBmYWlsIHRvIGdldCBDaGFubmVscyAiKSk7CisJCX0gZWxzZSB7CisJCQljc3JfYXBwbHlfY2hhbm5lbF9hbmRfcG93ZXJfbGlzdChwTWFjKTsKKwkJfQorCX0KKwkvKiBDb3VudHJ5IGNvZGUgIENoYW5nZWQsIFB1cmdlIE9ubHkgc2NhbiByZXN1bHQKKwkgKiB3aGljaCBkb2VzIG5vdCBoYXZlIGNoYW5uZWwgbnVtYmVyIGJlbG9uZyB0byAxMWQKKwkgKiBjaGFubmVsIGxpc3QKKwkgKi8KKwljc3Jfc2Nhbl9maWx0ZXJfcmVzdWx0cyhwTWFjKTsKKwlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCIgcmV0dXJuZWQiKSk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGJvb2wKK3NtZV9zZWFyY2hfaW5fYmFzZV9jaF9sc3QodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCBjdXJyX2NoKQoreworCXVpbnQ4X3QgaTsKKwl0Q3NyQ2hhbm5lbCAqY2hfbHN0X2luZm87CisJY2hfbHN0X2luZm8gPSAmbWFjX2N0eC0+c2Nhbi5iYXNlX2NoYW5uZWxzOworCWZvciAoaSA9IDA7IGkgPCBjaF9sc3RfaW5mby0+bnVtQ2hhbm5lbHM7IGkrKykgeworCQlpZiAoY2hfbHN0X2luZm8tPmNoYW5uZWxMaXN0W2ldID09IGN1cnJfY2gpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwljaF9sc3RfaW5mbyA9ICZtYWNfY3R4LT5zY2FuLmJhc2U0ME1IekNoYW5uZWxzOworCWZvciAoaSA9IDA7IGkgPCBjaF9sc3RfaW5mby0+bnVtQ2hhbm5lbHM7IGkrKykgeworCQlpZiAoY2hfbHN0X2luZm8tPmNoYW5uZWxMaXN0W2ldID09IGN1cnJfY2gpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBzbWVfZGlzY29ubmVjdF9jb25uZWN0ZWRfc2Vzc2lvbnMoKSAtIERpc2Nvbm5lY3QgU1RBIGFuZCBQMlAgY2xpZW50IHNlc3Npb24KKyAqIGlmIGNoYW5uZWwgaXMgbm90IHN1cHBvcnRlZAorICogQG1hY19jdHg6ICAgICAgICAgIG1hYyBnbG9iYWwgY29udGV4dAorICoKKyAqIElmIG5ldyBjb3VudHJ5IGNvZGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2hhbm5lbCBvbiB3aGljaCBTVEEvUDJQIGNsaWVudAorICogaXMgY29ubmV0Y2VkLCBpdCBzZW5kcyB0aGUgZGlzY29ubmVjdCB0byB0aGUgQVAvUDJQIEdPCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgc21lX2Rpc2Nvbm5lY3RfY29ubmVjdGVkX3Nlc3Npb25zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJdWludDhfdCBzZXNzaW9uX2lkLCBmb3VuZCA9IGZhbHNlOworCXVpbnQ4X3QgY3Vycl9jaDsKKworCWZvciAoc2Vzc2lvbl9pZCA9IDA7IHNlc3Npb25faWQgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgc2Vzc2lvbl9pZCsrKSB7CisJCWlmICghY3NyX2lzX3Nlc3Npb25fY2xpZW50X2FuZF9jb25uZWN0ZWQobWFjX2N0eCwgc2Vzc2lvbl9pZCkpCisJCQljb250aW51ZTsKKwkJZm91bmQgPSBmYWxzZTsKKwkJLyogU2Vzc2lvbiBpcyBjb25uZWN0ZWQuQ2hlY2sgdGhlIGNoYW5uZWwgKi8KKwkJY3Vycl9jaCA9IGNzcl9nZXRfaW5mcmFfb3BlcmF0aW9uX2NoYW5uZWwobWFjX2N0eCwKKwkJCQkJCQkgIHNlc3Npb25faWQpOworCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiQ3VycmVudCBPcGVyYXRpbmcgY2hhbm5lbCA6ICVkLCBzZXNzaW9uIDolZCIpLAorCQkJY3Vycl9jaCwgc2Vzc2lvbl9pZCk7CisJCWZvdW5kID0gc21lX3NlYXJjaF9pbl9iYXNlX2NoX2xzdChtYWNfY3R4LCBjdXJyX2NoKTsKKwkJaWYgKCFmb3VuZCkgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiRGlzY29ubmVjdCBTZXNzaW9uIDolZCIpLAorCQkJCXNlc3Npb25faWQpOworCQkJY3NyX3JvYW1fZGlzY29ubmVjdChtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQkJCQkgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisJCX0KKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9oYW5kbGVfZ2VuZXJpY19jaGFuZ2VfY291bnRyeV9jb2RlCisKKyAgICBcYnJpZWYgQ2hhbmdlIENvdW50cnkgY29kZSwgUmVnIERvbWFpbiBhbmQgY2hhbm5lbCBsaXN0CisKKyAgICBJZiBTdXBwbGljYW50IGNvdW50cnkgY29kZSBpcyBwcmlvcml0eSB0aGFuIDExZCBpcyBkaXNhYmxlZC4KKyAgICBJZiAxMUQgaXMgZW5hYmxlZCwgd2UgdXBkYXRlIHRoZSBjb3VudHJ5IGNvZGUgYWZ0ZXIgZXZlcnkgc2Nhbi4KKyAgICBIZW5jZSB3aGVuIFN1cHBsaWNhbnQgY291bnRyeSBjb2RlIGlzIHByaW9yaXR5LCB3ZSBkb24ndCBuZWVkIDExRCBpbmZvLgorICAgIENvdW50cnkgY29kZSBmcm9tIGtlcm5lbCBpcyBzZXQgYXMgY3VycmVudCBjb3VudHJ5IGNvZGUuCisKKyAgICBccGFyYW0gcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICAgXHBhcmFtIHBNc2dCdWYgLSBtZXNzYWdlIGJ1ZmZlcgorCisgICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfaGFuZGxlX2dlbmVyaWNfY2hhbmdlX2NvdW50cnlfY29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICB2b2lkICpwTXNnQnVmKQoreworCXRBbmlHZW5lcmljQ2hhbmdlQ291bnRyeUNvZGVSZXEgKnBNc2c7CisJdl9SRUdET01BSU5fdCByZWdfZG9tYWluX2lkOworCisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiIGNhbGxlZCIpKTsKKwlwTXNnID0gKHRBbmlHZW5lcmljQ2hhbmdlQ291bnRyeUNvZGVSZXEgKikgcE1zZ0J1ZjsKKwlyZWdfZG9tYWluX2lkID0gKHZfUkVHRE9NQUlOX3QpIHBNc2ctPmRvbWFpbl9pbmRleDsKKworCWlmIChSRUdET01BSU5fQ09VTlQgPT0gcmVnX2RvbWFpbl9pZCkgeworCQlzbWVfaGFuZGxlX2NoYW5nZV9jb3VudHJ5X2NvZGVfYnlfY29yZShwTWFjLCBwTXNnKTsKKwl9IGVsc2UgeworCQlzbWVfaGFuZGxlX2NoYW5nZV9jb3VudHJ5X2NvZGVfYnlfdXNlcihwTWFjLCBwTXNnKTsKKwl9CisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiIHJldHVybmVkIikpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworQ0RGX1NUQVRVUyBzbWVfODAyM19tdWx0aWNhc3RfbGlzdCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgIHRwU2lyUmN2Rmx0TWNBZGRyTGlzdCBwTXVsdGljYXN0QWRkcnMpCit7CisJdHBTaXJSY3ZGbHRNY0FkZHJMaXN0IHJlcXVlc3RfYnVmOworCWNkc19tc2dfdCBtc2c7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBOVUxMOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiAiCisJCSAgInVsTXVsdGljYXN0QWRkckNudD0lZCwgbXVsdGljYXN0QWRkclswXT0lcCIsIF9fZnVuY19fLAorCQkgIHBNdWx0aWNhc3RBZGRycy0+dWxNdWx0aWNhc3RBZGRyQ250LAorCQkgIHBNdWx0aWNhc3RBZGRycy0+bXVsdGljYXN0QWRkclswXSk7CisKKwkvKgorCSAgICpGaW5kIHRoZSBjb25uZWN0ZWQgSW5mcmEgLyBQMlBfY2xpZW50IGNvbm5lY3RlZCBzZXNzaW9uCisJICovCisJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkgJiYKKwkgICAgY3NyX2lzX2Nvbm5fc3RhdGVfaW5mcmEocE1hYywgc2Vzc2lvbklkKSkgeworCQlwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCX0KKworCWlmIChwU2Vzc2lvbiA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFVuYWJsZSB0byBmaW5kICIgInRoZSBzZXNzaW9uIElkOiAlZCIsIF9fZnVuY19fLAorCQkJICBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmVxdWVzdF9idWYgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclJjdkZsdE1jQWRkckxpc3QpKTsKKwlpZiAoTlVMTCA9PSByZXF1ZXN0X2J1ZikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOb3QgYWJsZSB0byAiCisJCQkgICJhbGxvY2F0ZSBtZW1vcnkgZm9yIDgwMjMgTXVsdGljYXN0IExpc3QgcmVxdWVzdCIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlpZiAoIWNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYShwTWFjLCBzZXNzaW9uSWQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IElnbm9yaW5nIHRoZSAiCisJCQkgICJpbmRpY2F0aW9uIGFzIHdlIGFyZSBub3QgY29ubmVjdGVkIiwgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUocmVxdWVzdF9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY2RmX21lbV9jb3B5KHJlcXVlc3RfYnVmLCBwTXVsdGljYXN0QWRkcnMsCisJCSAgICAgc2l6ZW9mKHRTaXJSY3ZGbHRNY0FkZHJMaXN0KSk7CisKKwljZGZfbWVtX2NvcHkocmVxdWVzdF9idWYtPnNlbGZNYWNBZGRyLCBwU2Vzc2lvbi0+c2VsZk1hY0FkZHIuYnl0ZXMsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJY2RmX21lbV9jb3B5KHJlcXVlc3RfYnVmLT5ic3NJZCwgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQuYnl0ZXMsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwltc2cudHlwZSA9IFdNQV84MDIzX01VTFRJQ0FTVF9MSVNUX1JFUTsKKwltc2cucmVzZXJ2ZWQgPSAwOworCW1zZy5ib2R5cHRyID0gcmVxdWVzdF9idWY7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOb3QgYWJsZSB0byAiCisJCQkgICJwb3N0IFdNQV84MDIzX01VTFRJQ0FTVF9MSVNUIG1lc3NhZ2UgdG8gV01BIiwKKwkJCSAgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUocmVxdWVzdF9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBzbWVfcmVjZWl2ZV9maWx0ZXJfc2V0X2ZpbHRlcih0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSB0cFNpclJjdlBrdEZpbHRlckNmZ1R5cGUgcFJjdlBrdEZpbHRlckNmZywKKwkJCQkJIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwU2lyUmN2UGt0RmlsdGVyQ2ZnVHlwZSByZXF1ZXN0X2J1ZjsKKwlpbnQzMl90IGFsbG9jU2l6ZTsKKwljZHNfbXNnX3QgbXNnOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJdWludDhfdCBpZHggPSAwOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBmaWx0ZXJUeXBlPSVkLCAiCisJCSAgImZpbHRlcklkID0gJWQiLCBfX2Z1bmNfXywKKwkJICBwUmN2UGt0RmlsdGVyQ2ZnLT5maWx0ZXJUeXBlLCBwUmN2UGt0RmlsdGVyQ2ZnLT5maWx0ZXJJZCk7CisKKwlhbGxvY1NpemUgPSBzaXplb2YodFNpclJjdlBrdEZpbHRlckNmZ1R5cGUpOworCisJcmVxdWVzdF9idWYgPSBjZGZfbWVtX21hbGxvYyhhbGxvY1NpemUpOworCisJaWYgKE5VTEwgPT0gcmVxdWVzdF9idWYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTm90IGFibGUgdG8gIgorCQkJICAiYWxsb2NhdGUgbWVtb3J5IGZvciBSZWNlaXZlIEZpbHRlciBTZXQgRmlsdGVyIHJlcXVlc3QiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJaWYgKE5VTEwgPT0gcFNlc3Npb24pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogU2Vzc2lvbiBOb3QgZm91bmQgIiwgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUocmVxdWVzdF9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY2RmX21lbV9jb3B5KHBSY3ZQa3RGaWx0ZXJDZmctPnNlbGZNYWNBZGRyLCBwU2Vzc2lvbi0+c2VsZk1hY0FkZHIuYnl0ZXMsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJY2RmX21lbV9jb3B5KHBSY3ZQa3RGaWx0ZXJDZmctPmJzc0lkLAorCQkgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLmJ5dGVzLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCWNkZl9tZW1fY29weShyZXF1ZXN0X2J1ZiwgcFJjdlBrdEZpbHRlckNmZywgYWxsb2NTaXplKTsKKworCW1zZy50eXBlID0gV01BX1JFQ0VJVkVfRklMVEVSX1NFVF9GSUxURVJfUkVROworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHlwdHIgPSByZXF1ZXN0X2J1ZjsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sICJQa3QgRmx0IFJlcSA6ICIKKwkJICAiRlQgJWQgRklEICVkICIsCisJCSAgcmVxdWVzdF9idWYtPmZpbHRlclR5cGUsIHJlcXVlc3RfYnVmLT5maWx0ZXJJZCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLCAiUGt0IEZsdCBSZXEgOiAiCisJCSAgInBhcmFtcyAlZCBDVCAlZCIsCisJCSAgcmVxdWVzdF9idWYtPm51bUZpZWxkUGFyYW1zLCByZXF1ZXN0X2J1Zi0+Y29hbGVzY2VUaW1lKTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgcmVxdWVzdF9idWYtPm51bUZpZWxkUGFyYW1zOyBpZHgrKykgeworCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICJQcm90byAlZCBDb21wIEZsYWcgJWQgIiwKKwkJCSAgcmVxdWVzdF9idWYtPnBhcmFtc0RhdGFbaWR4XS5wcm90b2NvbExheWVyLAorCQkJICByZXF1ZXN0X2J1Zi0+cGFyYW1zRGF0YVtpZHhdLmNtcEZsYWcpOworCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICJEYXRhIE9mZnNldCAlZCBEYXRhIExlbiAlZCIsCisJCQkgIHJlcXVlc3RfYnVmLT5wYXJhbXNEYXRhW2lkeF0uZGF0YU9mZnNldCwKKwkJCSAgcmVxdWVzdF9idWYtPnBhcmFtc0RhdGFbaWR4XS5kYXRhTGVuZ3RoKTsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiQ0RhdGE6ICVkOiVkOiVkOiVkOiVkOiVkIiwKKwkJCSAgcmVxdWVzdF9idWYtPnBhcmFtc0RhdGFbaWR4XS5jb21wYXJlRGF0YVswXSwKKwkJCSAgcmVxdWVzdF9idWYtPnBhcmFtc0RhdGFbaWR4XS5jb21wYXJlRGF0YVsxXSwKKwkJCSAgcmVxdWVzdF9idWYtPnBhcmFtc0RhdGFbaWR4XS5jb21wYXJlRGF0YVsyXSwKKwkJCSAgcmVxdWVzdF9idWYtPnBhcmFtc0RhdGFbaWR4XS5jb21wYXJlRGF0YVszXSwKKwkJCSAgcmVxdWVzdF9idWYtPnBhcmFtc0RhdGFbaWR4XS5jb21wYXJlRGF0YVs0XSwKKwkJCSAgcmVxdWVzdF9idWYtPnBhcmFtc0RhdGFbaWR4XS5jb21wYXJlRGF0YVs1XSk7CisKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIk1EYXRhOiAlZDolZDolZDolZDolZDolZCIsCisJCQkgIHJlcXVlc3RfYnVmLT5wYXJhbXNEYXRhW2lkeF0uZGF0YU1hc2tbMF0sCisJCQkgIHJlcXVlc3RfYnVmLT5wYXJhbXNEYXRhW2lkeF0uZGF0YU1hc2tbMV0sCisJCQkgIHJlcXVlc3RfYnVmLT5wYXJhbXNEYXRhW2lkeF0uZGF0YU1hc2tbMl0sCisJCQkgIHJlcXVlc3RfYnVmLT5wYXJhbXNEYXRhW2lkeF0uZGF0YU1hc2tbM10sCisJCQkgIHJlcXVlc3RfYnVmLT5wYXJhbXNEYXRhW2lkeF0uZGF0YU1hc2tbNF0sCisJCQkgIHJlcXVlc3RfYnVmLT5wYXJhbXNEYXRhW2lkeF0uZGF0YU1hc2tbNV0pOworCisJfQorCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOb3QgYWJsZSB0byBwb3N0ICIKKwkJCSAgIldNQV9SRUNFSVZFX0ZJTFRFUl9TRVRfRklMVEVSIG1lc3NhZ2UgdG8gV01BIiwKKwkJCSAgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUocmVxdWVzdF9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBzbWVfcmVjZWl2ZV9maWx0ZXJfY2xlYXJfZmlsdGVyKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJICAgdHBTaXJSY3ZGbHRQa3RDbGVhclBhcmFtCisJCQkJCSAgIHBSY3ZGbHRQa3RDbGVhclBhcmFtLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0cFNpclJjdkZsdFBrdENsZWFyUGFyYW0gcmVxdWVzdF9idWY7CisJY2RzX21zZ190IG1zZzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBmaWx0ZXJJZCA9ICVkIiwKKwkJICBfX2Z1bmNfXywgcFJjdkZsdFBrdENsZWFyUGFyYW0tPmZpbHRlcklkKTsKKworCXJlcXVlc3RfYnVmID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJSY3ZGbHRQa3RDbGVhclBhcmFtKSk7CisJaWYgKE5VTEwgPT0gcmVxdWVzdF9idWYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBSZWNlaXZlIEZpbHRlciAiCisJCQkgICJDbGVhciBGaWx0ZXIgcmVxdWVzdCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJaWYgKE5VTEwgPT0gcFNlc3Npb24pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogU2Vzc2lvbiBOb3QgZmluZCAiLCBfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShyZXF1ZXN0X2J1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZGZfbWVtX2NvcHkocFJjdkZsdFBrdENsZWFyUGFyYW0tPnNlbGZNYWNBZGRyLAorCQkgICAgIHBTZXNzaW9uLT5zZWxmTWFjQWRkci5ieXRlcywKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwljZGZfbWVtX2NvcHkocFJjdkZsdFBrdENsZWFyUGFyYW0tPmJzc0lkLAorCQkgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLmJ5dGVzLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWNkZl9tZW1fY29weShyZXF1ZXN0X2J1ZiwgcFJjdkZsdFBrdENsZWFyUGFyYW0sCisJCSAgICAgc2l6ZW9mKHRTaXJSY3ZGbHRQa3RDbGVhclBhcmFtKSk7CisKKwltc2cudHlwZSA9IFdNQV9SRUNFSVZFX0ZJTFRFUl9DTEVBUl9GSUxURVJfUkVROworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHlwdHIgPSByZXF1ZXN0X2J1ZjsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgIgorCQkJICAiV01BX1JFQ0VJVkVfRklMVEVSX0NMRUFSX0ZJTFRFUiBtZXNzYWdlIHRvIFdNQSIsCisJCQkgIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKHJlcXVlc3RfYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX2lzX2NoYW5uZWxfdmFsaWQKKworICAgIFxicmllZiBUbyBjaGVjayBpZiB0aGUgY2hhbm5lbCBpcyB2YWxpZCBmb3IgY3VycmVudGx5IGVzdGFibGlzaGVkIGRvbWFpbgorICAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBBUEkuCisKKyAgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICAgXHBhcmFtIGNoYW5uZWwgLSBjaGFubmVsIHRvIHZlcmlmeQorCisgICAgXHJldHVybiB0cnVlL2ZhbHNlLCB0cnVlIGlmIGNoYW5uZWwgaXMgdmFsaWQKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitib29sIHNtZV9pc19jaGFubmVsX3ZhbGlkKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBjaGFubmVsKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJYm9vbCB2YWxpZCA9IGZhbHNlOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCisJCXZhbGlkID0gY3NyX3JvYW1faXNfY2hhbm5lbF92YWxpZChwTWFjLCBjaGFubmVsKTsKKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gdmFsaWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfc2V0X2ZyZXFfYmFuZAorICAgIFxicmllZiAgVXNlZCB0byBzZXQgZnJlcXVlbmN5IGJhbmQuCisgICAgXHBhcmFtICBoSGFsCisgICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgICBcZUJhbmQgIGJhbmQgdmFsdWUgdG8gYmUgY29uZmlndXJlZAorICAgXC0gcmV0dXJuIENERl9TVEFUVVMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9mcmVxX2JhbmQodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwgZUNzckJhbmQgZUJhbmQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gY3NyX3NldF9iYW5kKGhIYWwsIHNlc3Npb25JZCwgZUJhbmQpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9nZXRfZnJlcV9iYW5kCisgICAgXGJyaWVmICBVc2VkIHRvIGdldCB0aGUgY3VycmVudCBiYW5kIHNldHRpbmdzLgorICAgIFxwYXJhbSAgaEhhbAorICAgIFxwQmFuZCAgcG9pbnRlciB0byBob2xkIGJhbmQgdmFsdWUKKyAgIFwtIHJldHVybiBDREZfU1RBVFVTCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9nZXRfZnJlcV9iYW5kKHRIYWxIYW5kbGUgaEhhbCwgZUNzckJhbmQgKnBCYW5kKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCSpwQmFuZCA9IGNzcl9nZXRfY3VycmVudF9iYW5kKGhIYWwpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfbWF4X3R4X3Bvd2VyX3Blcl9iYW5kCisKKyAgICBcYnJpZWYgU2V0IHRoZSBNYXhpbXVtIFRyYW5zbWl0IFBvd2VyIHNwZWNpZmljIHRvIGJhbmQgZHluYW1pY2FsbHkuCisgICAgTm90ZTogdGhpcyBzZXR0aW5nIHdpbGwgbm90IHBlcnNpc3Qgb3ZlciByZWJvb3RzLgorCisgICAgXHBhcmFtIGJhbmQKKyAgICBccGFyYW0gcG93ZXIgdG8gc2V0IGluIGRCCisgIFwtIHJldHVybiBDREZfU1RBVFVTCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2V0X21heF90eF9wb3dlcl9wZXJfYmFuZChlQ3NyQmFuZCBiYW5kLCBpbnQ4X3QgZEIpCit7CisJY2RzX21zZ190IG1zZzsKKwl0cE1heFR4UG93ZXJQZXJCYW5kUGFyYW1zIHBNYXhUeFBvd2VyUGVyQmFuZFBhcmFtcyA9IE5VTEw7CisKKwlwTWF4VHhQb3dlclBlckJhbmRQYXJhbXMgPQorCQljZGZfbWVtX21hbGxvYyhzaXplb2YodE1heFR4UG93ZXJQZXJCYW5kUGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gcE1heFR4UG93ZXJQZXJCYW5kUGFyYW1zKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6Tm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwTWF4VHhQb3dlclBlckJhbmRQYXJhbXMiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJcE1heFR4UG93ZXJQZXJCYW5kUGFyYW1zLT5wb3dlciA9IGRCOworCXBNYXhUeFBvd2VyUGVyQmFuZFBhcmFtcy0+YmFuZEluZm8gPSBiYW5kOworCisJbXNnLnR5cGUgPSBXTUFfU0VUX01BWF9UWF9QT1dFUl9QRVJfQkFORF9SRVE7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHBNYXhUeFBvd2VyUGVyQmFuZFBhcmFtczsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczpOb3QgYWJsZSB0byBwb3N0IFdNQV9TRVRfTUFYX1RYX1BPV0VSX1BFUl9CQU5EX1JFUSIsCisJCQkgIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKHBNYXhUeFBvd2VyUGVyQmFuZFBhcmFtcyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfc2V0X21heF90eF9wb3dlcgorCisgICAgXGJyaWVmIFNldCB0aGUgTWF4aW11bSBUcmFuc21pdCBQb3dlciBkeW5hbWljYWxseS4gTm90ZTogdGhpcyBzZXR0aW5nIHdpbGwKKyAgICBub3QgcGVyc2lzdCBvdmVyIHJlYm9vdHMuCisKKyAgICBccGFyYW0gIGhIYWwKKyAgICBccGFyYW0gcEJzc2lkICBCU1NJRCB0byBzZXQgdGhlIHBvd2VyIGNhcCBmb3IKKyAgICBccGFyYW0gcEJzc2lkICBwU2VsZk1hY0FkZHJlc3Mgc2VsZiBNQUMgQWRkcmVzcworICAgIFxwYXJhbSBwQnNzaWQgIHBvd2VyIHRvIHNldCBpbiBkQgorICAgXC0gcmV0dXJuIENERl9TVEFUVVMKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zZXRfbWF4X3R4X3Bvd2VyKHRIYWxIYW5kbGUgaEhhbCwgdFNpck1hY0FkZHIgcEJzc2lkLAorCQkJCXRTaXJNYWNBZGRyIHBTZWxmTWFjQWRkcmVzcywgaW50OF90IGRCKQoreworCWNkc19tc2dfdCBtc2c7CisJdHBNYXhUeFBvd2VyUGFyYW1zIHBNYXhUeFBhcmFtcyA9IE5VTEw7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfTUFYVFhQT1csIE5PX1NFU1NJT04sIDApKTsKKwlwTWF4VHhQYXJhbXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodE1heFR4UG93ZXJQYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBwTWF4VHhQYXJhbXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwTWF4VHhQYXJhbXMiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV9jb3B5KHBNYXhUeFBhcmFtcy0+YnNzSWQsIHBCc3NpZCwgQ0RGX01BQ19BRERSX1NJWkUpOworCWNkZl9tZW1fY29weShwTWF4VHhQYXJhbXMtPnNlbGZTdGFNYWNBZGRyLCBwU2VsZk1hY0FkZHJlc3MsCisJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCXBNYXhUeFBhcmFtcy0+cG93ZXIgPSBkQjsKKworCW1zZy50eXBlID0gV01BX1NFVF9NQVhfVFhfUE9XRVJfUkVROworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHlwdHIgPSBwTWF4VHhQYXJhbXM7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV01BX1NFVF9NQVhfVFhfUE9XRVJfUkVRIG1lc3NhZ2UgdG8gV01BIiwKKwkJCSAgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUocE1heFR4UGFyYW1zKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9zZXRfY3VzdG9tX21hY19hZGRyCisKKyAgICBcYnJpZWYgU2V0IHRoZSBjdXN0b21lciBNYWMgQWRkcmVzcy4KKworICAgIFxwYXJhbSBjdXN0b21NYWNBZGRyICBjdXN0b21lciBNQUMgQWRkcmVzcworICAgXC0gcmV0dXJuIENERl9TVEFUVVMKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9jdXN0b21fbWFjX2FkZHIodFNpck1hY0FkZHIgY3VzdG9tTWFjQWRkcikKK3sKKwljZHNfbXNnX3QgbXNnOworCXRTaXJNYWNBZGRyICpwQmFzZU1hY0FkZHI7CisKKwlwQmFzZU1hY0FkZHIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpck1hY0FkZHIpKTsKKwlpZiAoTlVMTCA9PSBwQmFzZU1hY0FkZHIpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBCYXNlTWFjQWRkciIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX2NvcHkoKnBCYXNlTWFjQWRkciwgY3VzdG9tTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwltc2cudHlwZSA9IFNJUl9IQUxfU0VUX0JBU0VfTUFDQUREUl9JTkQ7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHBCYXNlTWFjQWRkcjsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMCisJCQkJICAoIk5vdCBhYmxlIHRvIHBvc3QgU0lSX0hBTF9TRVRfQkFTRV9NQUNBRERSX0lORCBtZXNzYWdlIHRvIFdNQSIpKTsKKwkJY2RmX21lbV9mcmVlKHBCYXNlTWFjQWRkcik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gc21lX3NldF90eF9wb3dlcgorICAgXGJyaWVmIFNldCBUcmFuc21pdCBQb3dlciBkeW5hbWljYWxseS4KKyAgIFxwYXJhbSAgaEhhbAorICAgXHBhcmFtIHNlc3Npb25JZCAgVGFyZ2V0IFNlc3Npb24gSUQKKyAgIFxwQlNTSWQgQlNTSUQKKyAgIFxkZXZfbW9kZSBkZXZfbW9kZSBzdWNoIGFzIHN0YXRpb24sIFAyUEdPLCBTQVAKKyAgIFxwYXJhbSBkQm0gIHBvd2VyIHRvIHNldAorICAgXC0gcmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zZXRfdHhfcG93ZXIodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCSAgICB0U2lyTWFjQWRkciBwQlNTSWQsIHRDREZfQ09OX01PREUgZGV2X21vZGUsIGludCBkQm0pCit7CisJY2RzX21zZ190IG1zZzsKKwl0cE1heFR4UG93ZXJQYXJhbXMgcFR4UGFyYW1zID0gTlVMTDsKKwlpbnQ4X3QgcG93ZXIgPSAoaW50OF90KSBkQm07CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfVFhQT1csIHNlc3Npb25JZCwgMCkpOworCisJLyogbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG92ZXJmbG93ICovCisJaWYgKChpbnQpcG93ZXIgIT0gZEJtKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGVycm9yLCBpbnZhbGlkIHBvd2VyID0gJWQiLCBfX2Z1bmNfXywgZEJtKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBUeFBhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0TWF4VHhQb3dlclBhcmFtcykpOworCWlmIChOVUxMID09IHBUeFBhcmFtcykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBUeFBhcmFtcyIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX2NvcHkocFR4UGFyYW1zLT5ic3NJZCwgcEJTU0lkLCBDREZfTUFDX0FERFJfU0laRSk7CisJcFR4UGFyYW1zLT5wb3dlciA9IHBvd2VyOyAgICAgICAvKiB1bml0IGlzIGRCbSAqLworCXBUeFBhcmFtcy0+ZGV2X21vZGUgPSBkZXZfbW9kZTsKKwltc2cudHlwZSA9IFdNQV9TRVRfVFhfUE9XRVJfUkVROworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHlwdHIgPSBwVHhQYXJhbXM7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGZhaWxlZCB0byBwb3N0IFdNQV9TRVRfVFhfUE9XRVJfUkVRIHRvIFdNQSIsCisJCQkgIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKHBUeFBhcmFtcyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfaGlkZV9zc2lkCisKKyAgICBcYnJpZWYgaGlkZS9zaG93IFNTSUQgZHluYW1pY2FsbHkuIE5vdGU6IHRoaXMgc2V0dGluZyB3aWxsCisgICAgbm90IHBlcnNpc3Qgb3ZlciByZWJvb3RzLgorCisgICAgXHBhcmFtIGhIYWwKKyAgICBccGFyYW0gc2Vzc2lvbklkCisgICAgXHBhcmFtIHNzaWRIaWRkZW4gMCAtIEJyb2FkY2FzdCBTU0lELCAxIC0gRGlzYWJsZSBicm9hZGNhc3QgU1NJRAorICAgXC0gcmV0dXJuIENERl9TVEFUVVMKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9oaWRlX3NzaWQodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwgdWludDhfdCBzc2lkSGlkZGVuKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl1aW50MTZfdCBsZW47CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJdHBTaXJVcGRhdGVQYXJhbXMgcE1zZzsKKwkJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJCWlmICghcFNlc3Npb24pIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksCisJCQkJc2Vzc2lvbklkKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisKKwkJaWYgKCFwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSkKKwkJCUNERl9BU1NFUlQoMCk7CisKKwkJLyogQ3JlYXRlIHRoZSBtZXNzYWdlIGFuZCBzZW5kIHRvIGxpbSAqLworCQlsZW4gPSBzaXplb2YodFNpclVwZGF0ZVBhcmFtcyk7CisJCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCQlpZiAoTlVMTCA9PSBwTXNnKQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQllbHNlIHsKKwkJCWNkZl9tZW1fc2V0KHBNc2csIHNpemVvZih0U2lyVXBkYXRlUGFyYW1zKSwgMCk7CisJCQlwTXNnLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0hJREVfU1NJRF9SRVE7CisJCQlwTXNnLT5sZW5ndGggPSBsZW47CisJCQkvKiBEYXRhIHN0YXJ0cyBmcm9tIGhlcmUgKi8KKwkJCXBNc2ctPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJCXBNc2ctPnNzaWRIaWRkZW4gPSBzc2lkSGlkZGVuOworCQkJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9zZXRfdG1fbGV2ZWwKKyAgICBcYnJpZWYgIFNldCBUaGVybWFsIE1pdGlnYXRpb24gTGV2ZWwgdG8gUklWQQorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICAgXHBhcmFtICBuZXdUTUxldmVsIC0gbmV3IFRoZXJtYWwgTWl0aWdhdGlvbiBMZXZlbAorICAgIFxwYXJhbSAgdG1Nb2RlIC0gVGhlcm1hbCBNaXRpZ2F0aW9uIGhhbmRsZSBtb2RlLCBkZWZhdWx0IDAKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zZXRfdG1fbGV2ZWwodEhhbEhhbmRsZSBoSGFsLCB1aW50MTZfdCBuZXdUTUxldmVsLCB1aW50MTZfdCB0bU1vZGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJdEFuaVNldFRtTGV2ZWxSZXEgKnNldFRtTGV2ZWxSZXEgPSBOVUxMOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX1RNTEVWRUwsIE5PX1NFU1NJT04sIDApKTsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc2V0VG1MZXZlbFJlcSA9CisJCQkodEFuaVNldFRtTGV2ZWxSZXEgKikKKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0QW5pU2V0VG1MZXZlbFJlcSkpOworCQlpZiAoTlVMTCA9PSBzZXRUbUxldmVsUmVxKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzbWVfc2V0X3RtX2xldmVsIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCisJCXNldFRtTGV2ZWxSZXEtPnRtTW9kZSA9IHRtTW9kZTsKKwkJc2V0VG1MZXZlbFJlcS0+bmV3VG1MZXZlbCA9IG5ld1RNTGV2ZWw7CisKKwkJLyogc2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwkJY2RzX21lc3NhZ2UuYm9keXB0ciA9IHNldFRtTGV2ZWxSZXE7CisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfU0VUX1RNX0xFVkVMX1JFUTsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBQb3N0IFNldCBUTSBMZXZlbCBNU0cgZmFpbCIsIF9fZnVuY19fKTsKKwkJCWNkZl9tZW1fZnJlZShzZXRUbUxldmVsUmVxKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgc21lX2ZlYXR1cmVfY2Fwc19leGNoYW5nZSgpIC0gU01FIGludGVyZmFjZSB0byBleGNoYW5nZSBjYXBhYmlsaXRpZXMgYmV0d2VlbgorICAgSG9zdCBhbmQgRlcuCisKKyAgIFxwYXJhbSAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorCisgICBccmV0dXJuIE5PTkUKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX2ZlYXR1cmVfY2Fwc19leGNoYW5nZSh0SGFsSGFuZGxlIGhIYWwpCit7CisJTVRSQUNFKGNkZl90cmFjZQorCQkgICAgICAgKENERl9NT0RVTEVfSURfU01FLCBUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ0FQU19FWENILCBOT19TRVNTSU9OLAorCQkgICAgICAgMCkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgc21lX2Rpc2FibGVfZmVhdHVyZV9jYXBhYmxpdHkoKSAtIFNNRSBpbnRlcmZhY2UgdG8gZGlzYWJsZSBBY3RpdmUgbW9kZSBvZmZsb2FkIGNhcGFibGl0eQorICAgaW4gSG9zdC4KKworICAgXHBhcmFtICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisKKyAgIFxyZXR1cm4gTk9ORQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfZGlzYWJsZV9mZWF0dXJlX2NhcGFibGl0eSh1aW50OF90IGZlYXR1cmVfaW5kZXgpCit7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiAgICAgc21lX3Jlc2V0X3Bvd2VyX3ZhbHVlc19mb3I1X2cKKyAgICBcYnJpZWYgIFJlc2V0IHRoZSBwb3dlciB2YWx1ZXMgZm9yIDVHIGJhbmQgd2l0aCBkZWZhdWx0IHBvd2VyIHZhbHVlcy4KKyAgICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgIFwtIHJldHVybiBOT05FCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNtZV9yZXNldF9wb3dlcl92YWx1ZXNfZm9yNV9nKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfUkVTRVRfUFc1RywgTk9fU0VTU0lPTiwgMCkpOworCWNzcl9zYXZlX2NoYW5uZWxfcG93ZXJfZm9yX2JhbmQocE1hYywgdHJ1ZSk7CisJY3NyX2FwcGx5X3Bvd2VyMl9jdXJyZW50KHBNYWMpOyAgICAvKiBTdG9yZSB0aGUgY2hhbm5lbCtwb3dlciBpbmZvIGluIHRoZSBnbG9iYWwgcGxhY2U6IENmZyAqLworfQorCisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3VwZGF0ZV9yb2FtX3ByZWZlcjVfZ19oegorICAgIFxicmllZiAgZW5hYmxlL2Rpc2FibGUgUm9hbSBwcmVmZXIgNUcgcnVudGltZSBvcHRpb24KKwkgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhyb3VnaCBkeW5hbWljIHNldENvbmZpZyBjYWxsYmFjayBmdW5jdGlvbgorCSAgICB0byBjb25maWd1cmUgdGhlIFJvYW0gcHJlZmVyIDVHIHJ1bnRpbWUgb3B0aW9uCisgICAgXHBhcmFtICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisgICAgXHBhcmFtICBuUm9hbVByZWZlcjVHSHogRW5hYmxlL0Rpc2FibGUgUm9hbSBwcmVmZXIgNUcgcnVudGltZSBvcHRpb24KKyAgIFwtIHJldHVybiBTdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3JvYW1fcHJlZmVyNV9nX2h6KHRIYWxIYW5kbGUgaEhhbCwgYm9vbCBuUm9hbVByZWZlcjVHSHopCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX1JQNUcsIE5PX1NFU1NJT04sIDApKTsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzOiBnUm9hbVByZWZlcjVHSHogaXMgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwKKwkJCSAgX19mdW5jX18sIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublJvYW1QcmVmZXI1R0h6LAorCQkJICBuUm9hbVByZWZlcjVHSHopOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtUHJlZmVyNUdIeiA9IG5Sb2FtUHJlZmVyNUdIejsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfcm9hbV9pbnRyYV9iYW5kCisgICAgXGJyaWVmICBlbmFibGUvZGlzYWJsZSBJbnRyYSBiYW5kIHJvYW1pbmcKKwkgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhyb3VnaCBkeW5hbWljIHNldENvbmZpZyBjYWxsYmFjayBmdW5jdGlvbgorCSAgICB0byBjb25maWd1cmUgdGhlIGludHJhIGJhbmQgcm9hbWluZworICAgIFxwYXJhbSAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorICAgIFxwYXJhbSAgblJvYW1JbnRyYUJhbmQgRW5hYmxlL0Rpc2FibGUgSW50cmEgYmFuZCByb2FtaW5nCisgICBcLSByZXR1cm4gU3VjY2VzcyBvciBmYWlsdXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zZXRfcm9hbV9pbnRyYV9iYW5kKHRIYWxIYW5kbGUgaEhhbCwgY29uc3QgYm9vbCBuUm9hbUludHJhQmFuZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlNVFJBQ0UoY2RmX3RyYWNlKENERl9NT0RVTEVfSURfU01FLAorCQkJIFRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfUk9BTUlCQU5ELCBOT19TRVNTSU9OLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogZ1JvYW1JbnRyYUJhbmQgaXMgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwKKwkJCSAgX19mdW5jX18sIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublJvYW1JbnRyYUJhbmQsCisJCQkgIG5Sb2FtSW50cmFCYW5kKTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUm9hbUludHJhQmFuZCA9IG5Sb2FtSW50cmFCYW5kOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3VwZGF0ZV9yb2FtX3NjYW5fbl9wcm9iZXMKKyAgICBcYnJpZWYgIGZ1bmN0aW9uIHRvIHVwZGF0ZSByb2FtIHNjYW4gTiBwcm9iZXMKKwkgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhyb3VnaCBkeW5hbWljIHNldENvbmZpZyBjYWxsYmFjayBmdW5jdGlvbgorCSAgICB0byB1cGRhdGUgcm9hbSBzY2FuIE4gcHJvYmVzCisgICAgXHBhcmFtICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisgICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgICBccGFyYW0gIG5Qcm9iZXMgbnVtYmVyIG9mIHByb2JlIHJlcXVlc3RzIHRvIGJlIHNlbnQgb3V0CisgICBcLSByZXR1cm4gU3VjY2VzcyBvciBmYWlsdXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV91cGRhdGVfcm9hbV9zY2FuX25fcHJvYmVzKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSBjb25zdCB1aW50OF90IG5Qcm9iZXMpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX1JPQU1fU0NBTl9OX1BST0JFUywKKwkJCSBOT19TRVNTSU9OLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogZ1JvYW1TY2FuTlByb2JlcyBpcyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAorCQkJICBfX2Z1bmNfXywgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUHJvYmVzLCBuUHJvYmVzKTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUHJvYmVzID0gblByb2JlczsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkgeworCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCSAgICAgIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcsCisJCQkJICAgICAgUkVBU09OX05QUk9CRVNfQ0hBTkdFRCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfdXBkYXRlX3JvYW1fc2Nhbl9ob21lX2F3YXlfdGltZQorICAgIFxicmllZiAgZnVuY3Rpb24gdG8gdXBkYXRlIHJvYW0gc2NhbiBIb21lIGF3YXkgdGltZQorCSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aHJvdWdoIGR5bmFtaWMgc2V0Q29uZmlnIGNhbGxiYWNrIGZ1bmN0aW9uCisJICAgIHRvIHVwZGF0ZSByb2FtIHNjYW4gaG9tZSBhd2F5IHRpbWUKKyAgICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxwYXJhbSAgblJvYW1TY2FuQXdheVRpbWUgU2NhbiBob21lIGF3YXkgdGltZQorICAgIFxwYXJhbSAgYlNlbmRPZmZsb2FkQ21kIElmIHRydWUgdGhlbiBzZW5kIG9mZmxvYWQgY29tbWFuZCB0byBmaXJtd2FyZQorCQkJICAgIElmIGZhbHNlIHRoZW4gY29tbWFuZCBpcyBub3Qgc2VudCB0byBmaXJtd2FyZQorICAgXC0gcmV0dXJuIFN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3JvYW1fc2Nhbl9ob21lX2F3YXlfdGltZSh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSAgICAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgIGNvbnN0IHVpbnQxNl90IG5Sb2FtU2NhbkhvbWVBd2F5VGltZSwKKwkJCQkJICAgICAgIGNvbnN0IGJvb2wgYlNlbmRPZmZsb2FkQ21kKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCU1UUkFDRShjZGZfdHJhY2UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1VQREFURV9ST0FNX1NDQU5fSE9NRV9BV0FZX1RJTUUsCisJCQkgTk9fU0VTU0lPTiwgMCkpOworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IGdSb2FtU2NhbkhvbWVBd2F5VGltZSBpcyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAorCQkJICBfX2Z1bmNfXywKKwkJCSAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUm9hbVNjYW5Ib21lQXdheVRpbWUsCisJCQkgIG5Sb2FtU2NhbkhvbWVBd2F5VGltZSk7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublJvYW1TY2FuSG9tZUF3YXlUaW1lID0KKwkJCW5Sb2FtU2NhbkhvbWVBd2F5VGltZTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCAmJiBiU2VuZE9mZmxvYWRDbWQpIHsKKwkJY3NyX3JvYW1fb2ZmbG9hZF9zY2FuKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkgICAgICBST0FNX1NDQU5fT0ZGTE9BRF9VUERBVEVfQ0ZHLAorCQkJCSAgICAgIFJFQVNPTl9IT01FX0FXQVlfVElNRV9DSEFOR0VEKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9nZXRfcm9hbV9pbnRyYV9iYW5kCisgICAgXGJyaWVmICBnZXQgSW50cmEgYmFuZCByb2FtaW5nCisgICAgXHBhcmFtICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisgICBcLSByZXR1cm4gU3VjY2VzcyBvciBmYWlsdXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitib29sIHNtZV9nZXRfcm9hbV9pbnRyYV9iYW5kKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfR0VUX1JPQU1JQkFORCwgTk9fU0VTU0lPTiwgMCkpOworCXJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtSW50cmFCYW5kOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2dldF9yb2FtX3NjYW5fbl9wcm9iZXMKKyAgICBcYnJpZWYgIGdldCBOIFByb2JlcworICAgIFxwYXJhbSAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorICAgXC0gcmV0dXJuIFN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDhfdCBzbWVfZ2V0X3JvYW1fc2Nhbl9uX3Byb2Jlcyh0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5Qcm9iZXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X3JvYW1fc2Nhbl9ob21lX2F3YXlfdGltZQorICAgIFxicmllZiAgZ2V0IFJvYW0gc2NhbiBob21lIGF3YXkgdGltZQorICAgIFxwYXJhbSAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorICAgXC0gcmV0dXJuIFN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDE2X3Qgc21lX2dldF9yb2FtX3NjYW5faG9tZV9hd2F5X3RpbWUodEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUm9hbVNjYW5Ib21lQXdheVRpbWU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfdXBkYXRlX3JvYW1fcnNzaV9kaWZmCisgICAgXGJyaWVmICBVcGRhdGUgUm9hbVJzc2lEaWZmCisJICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRocm91Z2ggZHluYW1pYyBzZXRDb25maWcgY2FsbGJhY2sgZnVuY3Rpb24KKwkgICAgdG8gY29uZmlndXJlIFJvYW1Sc3NpRGlmZgorCSAgICBVc2FnZTogYWRiIHNoZWxsIGl3cHJpdiB3bGFuMCBzZXRDb25maWcgUm9hbVJzc2lEaWZmPVswIC4uIDEyNV0KKyAgICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxwYXJhbSAgUm9hbVJzc2lEaWZmIC0gbWluaW11bSByc3NpIGRpZmZlcmVuY2UgYmV0d2VlbiBwb3RlbnRpYWwKKwkgICAgY2FuZGlkYXRlIGFuZCBjdXJyZW50IEFQLgorICAgXC0gcmV0dXJuIFN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitDREZfU1RBVFVTIHNtZV91cGRhdGVfcm9hbV9yc3NpX2RpZmYodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkgICAgIHVpbnQ4X3QgUm9hbVJzc2lEaWZmKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSAgIkxGUiBydW50aW1lIHN1Y2Nlc3NmdWxseSBzZXQgcm9hbSByc3NpIGRpZmYgdG8gJWQgLSBvbGQgdmFsdWUgaXMgJWQgLSByb2FtIHN0YXRlIGlzICVzIiwKKwkJCSAgUm9hbVJzc2lEaWZmLAorCQkJICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlJvYW1Sc3NpRGlmZiwKKwkJCSAgbWFjX3RyYWNlX2dldF9uZWlnaGJvdXJfcm9hbV9zdGF0ZShwTWFjLT5yb2FtLgorCQkJCQkJCSAgICAgbmVpZ2hib3JSb2FtSW5mbworCQkJCQkJCSAgICAgW3Nlc3Npb25JZF0uCisJCQkJCQkJICAgICBuZWlnaGJvclJvYW1TdGF0ZSkpOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlJvYW1Sc3NpRGlmZiA9IFJvYW1Sc3NpRGlmZjsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkgeworCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCSAgICAgIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcsCisJCQkJICAgICAgUkVBU09OX1JTU0lfRElGRl9DSEFOR0VEKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV91cGRhdGVfZmFzdF90cmFuc2l0aW9uX2VuYWJsZWQoKSAtIGVuYWJsZS9kaXNhYmxlIEZhc3QgVHJhbnNpdGlvbgorCXN1cHBvcnQgYXQgcnVudGltZQorICAgSXQgaXMgdXNlZCBhdCBpbiB0aGUgUkVHX0RZTkFNSUNfVkFSSUFCTEUgbWFjcm8gZGVmaW5pdGlvbiBvZgorICAgaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQuCisgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIGlzRmFzdFRyYW5zaXRpb25FbmFibGVkIGNvbmZpZworCXN1Y2Nlc3NmdWxseS4KKwlPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQuCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9mYXN0X3RyYW5zaXRpb25fZW5hYmxlZCh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSAgICAgIGJvb2wgaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX0ZURU5BQkxFRCwgTk9fU0VTU0lPTiwKKwkJCSAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogRmFzdFRyYW5zaXRpb25FbmFibGVkIGlzIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCisJCQkgIF9fZnVuY19fLAorCQkJICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzRmFzdFRyYW5zaXRpb25FbmFibGVkLAorCQkJICBpc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZCk7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQgPQorCQkJaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQ7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfdXBkYXRlX3dlc19tb2RlCisgICAgXGJyaWVmICBVcGRhdGUgV0VTIE1vZGUKKwkgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhyb3VnaCBkeW5hbWljIHNldENvbmZpZyBjYWxsYmFjayBmdW5jdGlvbgorCSAgICB0byBjb25maWd1cmUgaXNXRVNNb2RlRW5hYmxlZAorICAgIFxwYXJhbSAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorICAgIFxwYXJhbSAgaXNXRVNNb2RlRW5hYmxlZCAtIFdFUyBtb2RlCisgICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIFNNRSB1cGRhdGUgaXNXRVNNb2RlRW5hYmxlZCBjb25maWcgc3VjY2Vzc2Z1bGx5LgorCSAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgaXNXRVNNb2RlRW5hYmxlZC4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3dlc19tb2RlKHRIYWxIYW5kbGUgaEhhbCwgYm9vbCBpc1dFU01vZGVFbmFibGVkLAorCQkJICAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSAgIkxGUiBydW50aW1lIHN1Y2Nlc3NmdWxseSBzZXQgV0VTIE1vZGUgdG8gJWQgLSBvbGQgdmFsdWUgaXMgJWQgLSByb2FtIHN0YXRlIGlzICVzIiwKKwkJCSAgaXNXRVNNb2RlRW5hYmxlZCwKKwkJCSAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc1dFU01vZGVFbmFibGVkLAorCQkJICBtYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlKHBNYWMtPnJvYW0uCisJCQkJCQkJICAgICBuZWlnaGJvclJvYW1JbmZvCisJCQkJCQkJICAgICBbc2Vzc2lvbklkXS4KKwkJCQkJCQkgICAgIG5laWdoYm9yUm9hbVN0YXRlKSk7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNXRVNNb2RlRW5hYmxlZCA9IGlzV0VTTW9kZUVuYWJsZWQ7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfc2V0X3JvYW1fc2Nhbl9jb250cm9sCisgICAgXGJyaWVmICBTZXQgcm9hbSBzY2FuIGNvbnRyb2wKKwkgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0IHJvYW0gc2NhbiBjb250cm9sCisJICAgIGlmIHJvYW0gc2NhbiBjb250cm9sIGlzIHNldCB0byAwLCByb2FtaW5nIHNjYW4gY2FjaGUgaXMgY2xlYXJlZAorCSAgICBhbnkgdmFsdWUgb3RoZXIgdGhhbiAwIGlzIHRyZWF0ZWQgYXMgaW52YWxpZCB2YWx1ZQorICAgIFxwYXJhbSAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorICAgIFxwYXJhbSAgc2Vzc2lvbklkIC0gU2Vzc2lvbiBJZGVudGlmaWVyCisgICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIGNvbmZpZyBzdWNjZXNzZnVsbHkuCisJICAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgZmFpbHVyZSB0byB1cGRhdGUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9yb2FtX3NjYW5fY29udHJvbCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgYm9vbCByb2FtU2NhbkNvbnRyb2wpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJTVRSQUNFKGNkZl90cmFjZShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCSBUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX1NDQU5DVFJMLCBOT19TRVNTSU9OLCAwKSk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJICAiTEZSIHJ1bnRpbWUgc3VjY2Vzc2Z1bGx5IHNldCByb2FtIHNjYW4gY29udHJvbCB0byAlZCAtIG9sZCB2YWx1ZSBpcyAlZCAtIHJvYW0gc3RhdGUgaXMgJXMiLAorCQkJICByb2FtU2NhbkNvbnRyb2wsCisJCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublJvYW1TY2FuQ29udHJvbCwKKwkJCSAgbWFjX3RyYWNlX2dldF9uZWlnaGJvdXJfcm9hbV9zdGF0ZShwTWFjLT5yb2FtLgorCQkJCQkJCSAgICAgbmVpZ2hib3JSb2FtSW5mbworCQkJCQkJCSAgICAgW3Nlc3Npb25JZF0uCisJCQkJCQkJICAgICBuZWlnaGJvclJvYW1TdGF0ZSkpOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtU2NhbkNvbnRyb2wgPSByb2FtU2NhbkNvbnRyb2w7CisJCWlmICgwID09IHJvYW1TY2FuQ29udHJvbCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJICAiTEZSIHJ1bnRpbWUgc3VjY2Vzc2Z1bGx5IGNsZWFyZWQgcm9hbSBzY2FuIGNhY2hlIik7CisJCQljc3JfZmx1c2hfY2ZnX2JnX3NjYW5fcm9hbV9jaGFubmVsX2xpc3QocE1hYywgc2Vzc2lvbklkKTsKKwkJCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkgeworCQkJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkgICAgICBST0FNX1NDQU5fT0ZGTE9BRF9VUERBVEVfQ0ZHLAorCQkJCQkJICAgICAgUkVBU09OX0ZMVVNIX0NIQU5ORUxfTElTVCk7CisJCQl9CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgKEZFQVRVUkVfV0xBTl9MRlIpICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3VwZGF0ZV9pc19mYXN0X3JvYW1faW5pX2ZlYXR1cmVfZW5hYmxlZCgpIC0gZW5hYmxlL2Rpc2FibGUgTEZSCisJc3VwcG9ydCBhdCBydW50aW1lCisgICBJdCBpcyB1c2VkIGF0IGluIHRoZSBSRUdfRFlOQU1JQ19WQVJJQUJMRSBtYWNybyBkZWZpbml0aW9uIG9mCisgICBpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQuCisgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSBpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQgY29uZmlnCisJc3VjY2Vzc2Z1bGx5LgorCU90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIHVwZGF0ZSBpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQuCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9pc19mYXN0X3JvYW1faW5pX2ZlYXR1cmVfZW5hYmxlZAorCSh0SGFsSGFuZGxlIGhIYWwsCisJdWludDhfdCBzZXNzaW9uSWQsIGNvbnN0IGJvb2wgaXNGYXN0Um9hbUluaUZlYXR1cmVFbmFibGVkKSB7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNGYXN0Um9hbUluaUZlYXR1cmVFbmFibGVkID09CisJICAgIGlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSAgIiVzOiBGYXN0Um9hbSBpcyBhbHJlYWR5IGVuYWJsZWQgb3IgZGlzYWJsZWQsIG5vdGhpbmcgdG8gZG8gKHJldHVybmluZykgb2xkKCVkKSBuZXcoJWQpIiwKKwkJCSAgX19mdW5jX18sCisJCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNGYXN0Um9hbUluaUZlYXR1cmVFbmFibGVkLAorCQkJICBpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkgICIlczogRmFzdFJvYW1FbmFibGVkIGlzIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIF9fZnVuY19fLAorCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNGYXN0Um9hbUluaUZlYXR1cmVFbmFibGVkLAorCQkgIGlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCk7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQgPQorCQlpc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQ7CisJY3NyX25laWdoYm9yX3JvYW1fdXBkYXRlX2Zhc3Rfcm9hbWluZ19lbmFibGVkKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCSAgICAgIGlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3VwZGF0ZV9pc19tYXdjX2luaV9mZWF0dXJlX2VuYWJsZWQoKSAtCisgICBFbmFibGUvZGlzYWJsZSBMRlIgTUFXQyBzdXBwb3J0IGF0IHJ1bnRpbWUKKyAgIEl0IGlzIHVzZWQgYXQgaW4gdGhlIFJFR19EWU5BTUlDX1ZBUklBQkxFIG1hY3JvIGRlZmluaXRpb24gb2YKKyAgIGlzTUFXQ0luaUZlYXR1cmVFbmFibGVkLgorICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSBNQVdDRW5hYmxlZCBjb25maWcgc3VjY2Vzc2Z1bGx5LgorCU90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIHVwZGF0ZSBNQVdDRW5hYmxlZC4KKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX2lzX21hd2NfaW5pX2ZlYXR1cmVfZW5hYmxlZCh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCQkgIGNvbnN0IGJvb2wgTUFXQ0VuYWJsZWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogTUFXQ0VuYWJsZWQgaXMgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwgX19mdW5jX18sCisJCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uTUFXQ0VuYWJsZWQsIE1BV0NFbmFibGVkKTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5NQVdDRW5hYmxlZCA9IE1BV0NFbmFibGVkOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfc3RvcF9yb2FtaW5nKCkgLSBTdG9wIHJvYW1pbmcgZm9yIGEgZ2l2ZW4gc2Vzc2lvbklkCisgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgXHBhcmFtIGhIYWwgICAgICAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4KKyAgIFxwYXJhbSAgc2Vzc2lvbklkIC0gU2Vzc2lvbiBJZGVudGlmaWVyCisgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCisJICAgT3RoZXIgc3RhdHVzIG9uIGZhaWx1cmUKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc3RvcF9yb2FtaW5nKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsIHVpbnQ4X3QgcmVhc29uKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLCBST0FNX1NDQU5fT0ZGTE9BRF9TVE9QLAorCQkJCSAgICAgIHJlYXNvbik7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfc3RhcnRfcm9hbWluZygpIC0gU3RhcnQgcm9hbWluZyBmb3IgYSBnaXZlbiBzZXNzaW9uSWQKKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAgICAgIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKKwlPdGhlciBzdGF0dXMgb24gZmFpbHVyZQorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zdGFydF9yb2FtaW5nKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsIHVpbnQ4X3QgcmVhc29uKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLCBST0FNX1NDQU5fT0ZGTE9BRF9TVEFSVCwKKwkJCQkgICAgICByZWFzb24pOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3VwZGF0ZV9lbmFibGVfZmFzdF9yb2FtX2luX2NvbmN1cnJlbmN5KCkgLSBlbmFibGUvZGlzYWJsZSBMRlIgaWYKKwlDb25jdXJyZW50IHNlc3Npb24gZXhpc3RzCisgICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTCisJT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitDREZfU1RBVFVTIHNtZV91cGRhdGVfZW5hYmxlX2Zhc3Rfcm9hbV9pbl9jb25jdXJyZW5jeSh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCQkgICAgICBib29sCisJCQkJCQkgICAgICBiRmFzdFJvYW1JbkNvbkluaUZlYXR1cmVFbmFibGVkKQoreworCisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYkZhc3RSb2FtSW5Db25JbmlGZWF0dXJlRW5hYmxlZCA9CisJCQliRmFzdFJvYW1JbkNvbkluaUZlYXR1cmVFbmFibGVkOworCQlpZiAoMCA9PSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkgeworCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5iRmFzdFJvYW1JbkNvbkluaUZlYXR1cmVFbmFibGVkID0KKwkJCQkwOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0xGUiAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV91cGRhdGVfaXNfZXNlX2ZlYXR1cmVfZW5hYmxlZCgpIC0gZW5hYmxlL2Rpc2FibGUgRVNFIHN1cHBvcnQgYXQgcnVudGltZQorICAgSXQgaXMgdXNlZCBhdCBpbiB0aGUgUkVHX0RZTkFNSUNfVkFSSUFCTEUgbWFjcm8gZGVmaW5pdGlvbiBvZgorICAgaXNFc2VJbmlGZWF0dXJlRW5hYmxlZC4KKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICBccGFyYW0gc2Vzc2lvbklkIC0gU2Vzc2lvbiBJZGVudGlmaWVyCisgICBccGFyYW0gaXNFc2VJbmlGZWF0dXJlRW5hYmxlZCAtIGZsYWcgdG8gZW5hYmxlL2Rpc2FibGUKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSBpc0VzZUluaUZlYXR1cmVFbmFibGVkIGNvbmZpZworCSAgIHN1Y2Nlc3NmdWxseS4KKwkgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgaXNFc2VJbmlGZWF0dXJlRW5hYmxlZC4KKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX2lzX2VzZV9mZWF0dXJlX2VuYWJsZWQKKwkodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwgY29uc3QgYm9vbCBpc0VzZUluaUZlYXR1cmVFbmFibGVkKSB7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNFc2VJbmlGZWF0dXJlRW5hYmxlZCA9PQorCSAgICBpc0VzZUluaUZlYXR1cmVFbmFibGVkKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogRVNFIE1vZGUgaXMgYWxyZWFkeSBlbmFibGVkIG9yIGRpc2FibGVkLCBub3RoaW5nIHRvIGRvIChyZXR1cm5pbmcpIG9sZCglZCkgbmV3KCVkKSIsCisJCQkgIF9fZnVuY19fLAorCQkJICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzRXNlSW5pRmVhdHVyZUVuYWJsZWQsCisJCQkgIGlzRXNlSW5pRmVhdHVyZUVuYWJsZWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBFc2VFbmFibGVkIGlzIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIF9fZnVuY19fLAorCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNFc2VJbmlGZWF0dXJlRW5hYmxlZCwKKwkJICBpc0VzZUluaUZlYXR1cmVFbmFibGVkKTsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzRXNlSW5pRmVhdHVyZUVuYWJsZWQgPSBpc0VzZUluaUZlYXR1cmVFbmFibGVkOworCWNzcl9uZWlnaGJvcl9yb2FtX3VwZGF0ZV9lc2VfbW9kZV9lbmFibGVkKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCSAgaXNFc2VJbmlGZWF0dXJlRW5hYmxlZCk7CisKKwlpZiAodHJ1ZSA9PSBpc0VzZUluaUZlYXR1cmVFbmFibGVkKSB7CisJCXNtZV91cGRhdGVfZmFzdF90cmFuc2l0aW9uX2VuYWJsZWQoaEhhbCwgdHJ1ZSk7CisJfQorCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkgeworCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCSAgICAgIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcsCisJCQkJICAgICAgUkVBU09OX0VTRV9JTklfQ0ZHX0NIQU5HRUQpOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV91cGRhdGVfY29uZmlnX2Z3X3Jzc2lfbW9uaXRvcmluZygpIC0gZW5hYmxlL2Rpc2FibGUgZmlybXdhcmUgUlNTSQorCU1vbml0b3JpbmcgYXQgcnVudGltZQorICAgSXQgaXMgdXNlZCBhdCBpbiB0aGUgUkVHX0RZTkFNSUNfVkFSSUFCTEUgbWFjcm8gZGVmaW5pdGlvbiBvZgorICAgZkVuYWJsZUZ3UnNzaU1vbml0b3JpbmcuCisgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIGZFbmFibGVGd1Jzc2lNb25pdG9yaW5nLgorCWNvbmZpZyBzdWNjZXNzZnVsbHkuCisJT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gdXBkYXRlIGZFbmFibGVGd1Jzc2lNb25pdG9yaW5nLgorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9jb25maWdfZndfcnNzaV9tb25pdG9yaW5nKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJCWJvb2wgZkVuYWJsZUZ3UnNzaU1vbml0b3JpbmcpCit7CisJQ0RGX1NUQVRVUyBjZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWlmIChzbWVfY2ZnX3NldF9pbnQgKGhIYWwsIFdOSV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUiwKKwkJCQkJCWZFbmFibGVGd1Jzc2lNb25pdG9yaW5nKSA9PSBDREZfU1RBVFVTX0VfRkFJTFVSRSkgeworCQljZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUFNfUlNTSV9NT05JVE9SIHRvIENGRyIpOworCX0KKworCXJldHVybiBjZGZfcmV0X3N0YXR1czsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gICAgIHNtZV9zZXRfcm9hbV9vcHBvcnR1bmlzdGljX3NjYW5fdGhyZXNob2xkX2RpZmYKKyAgICBcYnJpZWYgIFVwZGF0ZSBPcHBvcnR1bmlzdGljIFNjYW4gdGhyZXNob2xkIGRpZmYKKwlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aHJvdWdoIGR5bmFtaWMgc2V0Q29uZmlnIGNhbGxiYWNrIGZ1bmN0aW9uCisJdG8gY29uZmlndXJlICBuT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmYKKyAgICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxwYXJhbSAgbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmIC0gT3Bwb3J0dW5pc3RpYyBTY2FuIHRocmVzaG9sZCBkaWZmCisgICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZiBjb25maWcKKwkgICAgc3VjY2Vzc2Z1bGx5LgorCSAgICBlbHNlIFNNRSBpcyBmYWlsZWQgdG8gdXBkYXRlIG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZi4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9yb2FtX29wcG9ydHVuaXN0aWNfc2Nhbl90aHJlc2hvbGRfZGlmZih0SGFsSGFuZGxlIGhIYWwsCisJCQkJCQkJICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJCQkgIGNvbnN0IHVpbnQ4X3QKKwkJCQkJCQkgIG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZikKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gY3NyX25laWdoYm9yX3JvYW1fc2V0X29wcG9ydHVuaXN0aWNfc2Nhbl90aHJlc2hvbGRfZGlmZihwTWFjLAorCQkJCQkJCQkJCSBzZXNzaW9uSWQsCisJCQkJCQkJCQkJIG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZik7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJICAiTEZSIHJ1bnRpbWUgc3VjY2Vzc2Z1bGx5IHNldCAiCisJCQkJICAib3Bwb3J0dW5pc3RpYyB0aHJlc2hvbGQgZGlmZiB0byAlZCIKKwkJCQkgICIgLSBvbGQgdmFsdWUgaXMgJWQgLSByb2FtIHN0YXRlIGlzICVkIiwKKwkJCQkgIG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZiwKKwkJCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJCSAgbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmLAorCQkJCSAgcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF0uCisJCQkJICBuZWlnaGJvclJvYW1TdGF0ZSk7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCW5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZiA9CisJCQkJbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgc21lX2dldF9yb2FtX29wcG9ydHVuaXN0aWNfc2Nhbl90aHJlc2hvbGRfZGlmZigpCisgICBcYnJpZWYgZ2V0cyBPcHBvcnR1bmlzdGljIFNjYW4gdGhyZXNob2xkIGRpZmYKKwlUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuCisgICBccmV0dXJuIHVpbnQ4X3QgLSBuT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmYKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDhfdCBzbWVfZ2V0X3JvYW1fb3Bwb3J0dW5pc3RpY19zY2FuX3RocmVzaG9sZF9kaWZmKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJcmV0dXJuIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCSAgICAgICBuT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmY7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiAgICAgc21lX3NldF9yb2FtX3Jlc2Nhbl9yc3NpX2RpZmYKKyAgICBcYnJpZWYgIFVwZGF0ZSByb2FtIHJlc2NhbiByc3NpIGRpZmYKKwkgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhyb3VnaCBkeW5hbWljIHNldENvbmZpZyBjYWxsYmFjayBmdW5jdGlvbgorCSAgICB0byBjb25maWd1cmUgIG5Sb2FtUmVzY2FuUnNzaURpZmYKKyAgICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxwYXJhbSAgblJvYW1SZXNjYW5Sc3NpRGlmZiAtIHJvYW0gcmVzY2FuIHJzc2kgZGlmZgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSBuUm9hbVJlc2NhblJzc2lEaWZmIGNvbmZpZworCSAgICBzdWNjZXNzZnVsbHkuCisJICAgIGVsc2UgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgblJvYW1SZXNjYW5Sc3NpRGlmZi4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9yb2FtX3Jlc2Nhbl9yc3NpX2RpZmYodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSBjb25zdCB1aW50OF90IG5Sb2FtUmVzY2FuUnNzaURpZmYpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9uZWlnaGJvcl9yb2FtX3NldF9yb2FtX3Jlc2Nhbl9yc3NpX2RpZmYocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCQkgICAgIG5Sb2FtUmVzY2FuUnNzaURpZmYpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCSAgIkxGUiBydW50aW1lIHN1Y2Nlc3NmdWxseSBzZXQgIgorCQkJCSAgIm9wcG9ydHVuaXN0aWMgdGhyZXNob2xkIGRpZmYgdG8gJWQiCisJCQkJICAiIC0gb2xkIHZhbHVlIGlzICVkIC0gcm9hbSBzdGF0ZSBpcyAlZCIsCisJCQkJICBuUm9hbVJlc2NhblJzc2lEaWZmLAorCQkJCSAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCQkJICBuUm9hbVJlc2NhblJzc2lEaWZmLAorCQkJCSAgcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF0uCisJCQkJICBuZWlnaGJvclJvYW1TdGF0ZSk7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCW5Sb2FtUmVzY2FuUnNzaURpZmYgPSBuUm9hbVJlc2NhblJzc2lEaWZmOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gICAgc21lX2dldF9yb2FtX3Jlc2Nhbl9yc3NpX2RpZmYKKyAgIFxicmllZiBnZXRzIHJvYW0gcmVzY2FuIHJzc2kgZGlmZgorCSAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorICAgXHJldHVybiBpbnQ4X3QgLSBuUm9hbVJlc2NhblJzc2lEaWZmCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQ4X3Qgc21lX2dldF9yb2FtX3Jlc2Nhbl9yc3NpX2RpZmYodEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcublJvYW1SZXNjYW5Sc3NpRGlmZjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuICAgICBzbWVfc2V0X3JvYW1fYm1pc3NfZmlyc3RfYmNudAorICAgIFxicmllZiAgVXBkYXRlIFJvYW0gY291bnQgZm9yIGZpcnN0IGJlYWNvbiBtaXNzCisJICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRocm91Z2ggZHluYW1pYyBzZXRDb25maWcgY2FsbGJhY2sgZnVuY3Rpb24KKwkgICAgdG8gY29uZmlndXJlIG5Sb2FtQm1pc3NGaXJzdEJjbnQKKyAgICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxwYXJhbSAgblJvYW1CbWlzc0ZpcnN0QmNudCAtIFJvYW0gZmlyc3QgYm1pc3MgY291bnQKKyAgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIFNNRSB1cGRhdGUgblJvYW1CbWlzc0ZpcnN0QmNudAorCSAgICBzdWNjZXNzZnVsbHkuCisJICAgIGVsc2UgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgblJvYW1CbWlzc0ZpcnN0QmNudAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2V0X3JvYW1fYm1pc3NfZmlyc3RfYmNudCh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJIGNvbnN0IHVpbnQ4X3QgblJvYW1CbWlzc0ZpcnN0QmNudCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gY3NyX25laWdoYm9yX3JvYW1fc2V0X3JvYW1fYm1pc3NfZmlyc3RfYmNudChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJCSAgICAgblJvYW1CbWlzc0ZpcnN0QmNudCk7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJICAiTEZSIHJ1bnRpbWUgc3VjY2Vzc2Z1bGx5IHNldCAiCisJCQkJICAiYmVhY29uIG1pc3MgZmlyc3QgYmVhY29uIGNvdW50IHRvICVkIgorCQkJCSAgIiAtIG9sZCB2YWx1ZSBpcyAlZCAtIHJvYW0gc3RhdGUgaXMgJWQiLAorCQkJCSAgblJvYW1CbWlzc0ZpcnN0QmNudCwKKwkJCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJCSAgblJvYW1CbWlzc0ZpcnN0QmNudCwKKwkJCQkgIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdLgorCQkJCSAgbmVpZ2hib3JSb2FtU3RhdGUpOworCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCQluUm9hbUJtaXNzRmlyc3RCY250ID0gblJvYW1CbWlzc0ZpcnN0QmNudDsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9nZXRfcm9hbV9ibWlzc19maXJzdF9iY250CisgICAgXGJyaWVmICBnZXQgbmVpZ2hib3Igcm9hbSBiZWFjb24gbWlzcyBmaXJzdCBjb3VudAorICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccmV0dXJuIHVpbnQ4X3QgLSBuZWlnaGJvciByb2FtIGJlYWNvbiBtaXNzIGZpcnN0IGNvdW50CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1aW50OF90IHNtZV9nZXRfcm9hbV9ibWlzc19maXJzdF9iY250KHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJcmV0dXJuIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5Sb2FtQm1pc3NGaXJzdEJjbnQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiAgICAgc21lX3NldF9yb2FtX2JtaXNzX2ZpbmFsX2JjbnQKKyAgICBcYnJpZWYgIFVwZGF0ZSBSb2FtIGNvdW50IGZvciBmaW5hbCBiZWFjb24gbWlzcworCSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aHJvdWdoIGR5bmFtaWMgc2V0Q29uZmlnIGNhbGxiYWNrIGZ1bmN0aW9uCisJICAgIHRvIGNvbmZpZ3VyZSBuUm9hbUJtaXNzRmluYWxCY250CisgICAgXHBhcmFtICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisgICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgICBccGFyYW0gIG5Sb2FtQm1pc3NGaW5hbEJjbnQgLSBSb2FtIGZpbmFsIGJtaXNzIGNvdW50CisgICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIG5Sb2FtQm1pc3NGaW5hbEJjbnQKKwkgICAgc3VjY2Vzc2Z1bGx5LgorCSAgICBlbHNlIFNNRSBpcyBmYWlsZWQgdG8gdXBkYXRlIG5Sb2FtQm1pc3NGaW5hbEJjbnQKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9yb2FtX2JtaXNzX2ZpbmFsX2JjbnQodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSBjb25zdCB1aW50OF90IG5Sb2FtQm1pc3NGaW5hbEJjbnQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9uZWlnaGJvcl9yb2FtX3NldF9yb2FtX2JtaXNzX2ZpbmFsX2JjbnQocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCQkgICAgIG5Sb2FtQm1pc3NGaW5hbEJjbnQpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCSAgIkxGUiBydW50aW1lIHN1Y2Nlc3NmdWxseSBzZXQgIgorCQkJCSAgImJlYWNvbiBtaXNzIGZpbmFsIGJlYWNvbiBjb3VudCB0byAlZCIKKwkJCQkgICIgLSBvbGQgdmFsdWUgaXMgJWQgLSByb2FtIHN0YXRlIGlzICVkIiwKKwkJCQkgIG5Sb2FtQm1pc3NGaW5hbEJjbnQsCisJCQkJICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCQkgIG5Sb2FtQm1pc3NGaW5hbEJjbnQsCisJCQkJICBwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXS4KKwkJCQkgIG5laWdoYm9yUm9hbVN0YXRlKTsKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJblJvYW1CbWlzc0ZpbmFsQmNudCA9IG5Sb2FtQm1pc3NGaW5hbEJjbnQ7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiAgICBzbWVfZ2V0X3JvYW1fYm1pc3NfZmluYWxfYmNudAorICAgXGJyaWVmIGdldHMgUm9hbSBjb3VudCBmb3IgZmluYWwgYmVhY29uIG1pc3MKKwkgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4KKyAgIFxyZXR1cm4gdWludDhfdCAtIG5Sb2FtQm1pc3NGaW5hbEJjbnQKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDhfdCBzbWVfZ2V0X3JvYW1fYm1pc3NfZmluYWxfYmNudCh0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uUm9hbUJtaXNzRmluYWxCY250OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gICAgIHNtZV9zZXRfcm9hbV9iZWFjb25fcnNzaV93ZWlnaHQKKyAgICBcYnJpZWYgIFVwZGF0ZSBSb2FtIGJlYWNvbiByc3NpIHdlaWdodAorCSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aHJvdWdoIGR5bmFtaWMgc2V0Q29uZmlnIGNhbGxiYWNrIGZ1bmN0aW9uCisJICAgIHRvIGNvbmZpZ3VyZSBuUm9hbUJlYWNvblJzc2lXZWlnaHQKKyAgICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxwYXJhbSAgblJvYW1CZWFjb25Sc3NpV2VpZ2h0IC0gUm9hbSBiZWFjb24gcnNzaSB3ZWlnaHQKKyAgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIFNNRSB1cGRhdGUgblJvYW1CZWFjb25Sc3NpV2VpZ2h0IGNvbmZpZworCSAgICBzdWNjZXNzZnVsbHkuCisJICAgIGVsc2UgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgblJvYW1CZWFjb25Sc3NpV2VpZ2h0CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zZXRfcm9hbV9iZWFjb25fcnNzaV93ZWlnaHQodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgY29uc3QgdWludDhfdCBuUm9hbUJlYWNvblJzc2lXZWlnaHQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9uZWlnaGJvcl9yb2FtX3NldF9yb2FtX2JlYWNvbl9yc3NpX3dlaWdodChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJCSAgICAgICBuUm9hbUJlYWNvblJzc2lXZWlnaHQpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCSAgIkxGUiBydW50aW1lIHN1Y2Nlc3NmdWxseSBzZXQgIgorCQkJCSAgImJlYWNvbiBtaXNzIGZpbmFsIGJlYWNvbiBjb3VudCB0byAlZCIKKwkJCQkgICIgLSBvbGQgdmFsdWUgaXMgJWQgLSByb2FtIHN0YXRlIGlzICVkIiwKKwkJCQkgIG5Sb2FtQmVhY29uUnNzaVdlaWdodCwKKwkJCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJCSAgblJvYW1CZWFjb25Sc3NpV2VpZ2h0LAorCQkJCSAgcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF0uCisJCQkJICBuZWlnaGJvclJvYW1TdGF0ZSk7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCW5Sb2FtQmVhY29uUnNzaVdlaWdodCA9IG5Sb2FtQmVhY29uUnNzaVdlaWdodDsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuICAgIHNtZV9nZXRfcm9hbV9iZWFjb25fcnNzaV93ZWlnaHQKKyAgIFxicmllZiBnZXRzIFJvYW0gYmVhY29uIHJzc2kgd2VpZ2h0CisJICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuCisgICBccmV0dXJuIHVpbnQ4X3QgLSBuUm9hbUJlYWNvblJzc2lXZWlnaHQKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDhfdCBzbWVfZ2V0X3JvYW1fYmVhY29uX3Jzc2lfd2VpZ2h0KHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJcmV0dXJuIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5Sb2FtQmVhY29uUnNzaVdlaWdodDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9zZXRfbmVpZ2hib3JfbG9va3VwX3Jzc2lfdGhyZXNob2xkKCkgLSB1cGRhdGUgbmVpZ2hib3IgbG9va3VwCisJcnNzaSB0aHJlc2hvbGQKKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIGNvbmZpZyBzdWNjZXNzZnVsLgorCSAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIHVwZGF0ZQorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zZXRfbmVpZ2hib3JfbG9va3VwX3Jzc2lfdGhyZXNob2xkCisJKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsIHVpbnQ4X3QgbmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkKSB7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9uZWlnaGJvcl9yb2FtX3NldF9sb29rdXBfcnNzaV90aHJlc2hvbGQocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCQkgICAgIG5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZCk7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJICAiTEZSIHJ1bnRpbWUgc3VjY2Vzc2Z1bGx5IHNldCBMb29rdXAgdGhyZXNob2xkIHRvICVkIC0gb2xkIHZhbHVlIGlzICVkIC0gcm9hbSBzdGF0ZSBpcyAlcyIsCisJCQkJICBuZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQsCisJCQkJICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCQkgIG5OZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQsCisJCQkJICBtYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlKHBNYWMtPnJvYW0uCisJCQkJCQkJCSAgICAgbmVpZ2hib3JSb2FtSW5mbworCQkJCQkJCQkgICAgIFtzZXNzaW9uSWRdLgorCQkJCQkJCQkgICAgIG5laWdoYm9yUm9hbVN0YXRlKSk7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCW5OZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQgPQorCQkJCW5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZDsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX3NldF9kZWxheV9iZWZvcmVfdmRldl9zdG9wKCkgLSB1cGRhdGUgZGVsYXkgYmVmb3JlIFZERVZfU1RPUAorICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICBccGFyYW0gIGhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgXHBhcmFtICBzZXNzaW9uX2lkIC0gU2Vzc2lvbiBJZGVudGlmaWVyCisgIFxwYXJhbSAgZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcCAtIHZhbHVlIHRvIGJlIHNldAorICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIFNNRSB1cGRhdGUgY29uZmlnIHN1Y2Nlc3NmdWwuCisJICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9kZWxheV9iZWZvcmVfdmRldl9zdG9wKHRIYWxIYW5kbGUgaGFsLAorCQkJCQkgIHVpbnQ4X3Qgc2Vzc2lvbl9pZCwKKwkJCQkJICB1aW50OF90IGRlbGF5X2JlZm9yZV92ZGV2X3N0b3ApCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCUNERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCUZMKCJMRlIgcGFyYW0gZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcCBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiKSwKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcCwKKwkJCWRlbGF5X2JlZm9yZV92ZGV2X3N0b3ApOworCQlwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbl9pZF0uY2ZnUGFyYW1zLgorCQkJZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcCA9IGRlbGF5X2JlZm9yZV92ZGV2X3N0b3A7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcCA9IGRlbGF5X2JlZm9yZV92ZGV2X3N0b3A7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX2dldF9uZWlnaGJvcl9sb29rdXBfcnNzaV90aHJlc2hvbGQoKSAtIGdldCBuZWlnaGJvciBsb29rdXAKKwlyc3NpIHRocmVzaG9sZAorICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSBjb25maWcgc3VjY2Vzc2Z1bC4KKwkgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDhfdCBzbWVfZ2V0X25laWdoYm9yX2xvb2t1cF9yc3NpX3RocmVzaG9sZCh0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkgICAgICAgbk5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9zZXRfbmVpZ2hib3Jfc2Nhbl9yZWZyZXNoX3BlcmlvZCgpIC0gc2V0IG5laWdoYm9yIHNjYW4gcmVzdWx0cworCXJlZnJlc2ggcGVyaW9kCisgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSBjb25maWcgc3VjY2Vzc2Z1bC4KKwkgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2V0X25laWdoYm9yX3NjYW5fcmVmcmVzaF9wZXJpb2QKKwkodEhhbEhhbmRsZSBoSGFsLAorCXVpbnQ4X3Qgc2Vzc2lvbklkLCB1aW50MTZfdCBuZWlnaGJvclNjYW5SZXN1bHRzUmVmcmVzaFBlcmlvZCkgeworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyTmVpZ2hib3JSb2FtQ29uZmlnICpwTmVpZ2hib3JSb2FtQ29uZmlnID0gTlVMTDsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0gTlVMTDsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlwTmVpZ2hib3JSb2FtQ29uZmlnID0KKwkJCSZwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZzsKKwkJcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJICAiTEZSIHJ1bnRpbWUgc3VjY2Vzc2Z1bGx5IHNldCByb2FtIHNjYW4gcmVmcmVzaCBwZXJpb2QgdG8gJWQtIG9sZCB2YWx1ZSBpcyAlZCAtIHJvYW0gc3RhdGUgaXMgJXMiLAorCQkJICBuZWlnaGJvclNjYW5SZXN1bHRzUmVmcmVzaFBlcmlvZCwKKwkJCSAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCQkgIG5OZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kLAorCQkJICBtYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlKHBNYWMtPnJvYW0uCisJCQkJCQkJICAgICBuZWlnaGJvclJvYW1JbmZvCisJCQkJCQkJICAgICBbc2Vzc2lvbklkXS4KKwkJCQkJCQkgICAgIG5laWdoYm9yUm9hbVN0YXRlKSk7CisJCXBOZWlnaGJvclJvYW1Db25maWctPm5OZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kID0KKwkJCW5laWdoYm9yU2NhblJlc3VsdHNSZWZyZXNoUGVyaW9kOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2QgPQorCQkJbmVpZ2hib3JTY2FuUmVzdWx0c1JlZnJlc2hQZXJpb2Q7CisKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkgeworCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCSAgICAgIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcsCisJCQkJICAgICAgUkVBU09OX05FSUdIQk9SX1NDQU5fUkVGUkVTSF9QRVJJT0RfQ0hBTkdFRCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfdXBkYXRlX3JvYW1fc2Nhbl9vZmZsb2FkX2VuYWJsZWQoKSAtIGVuYWJsZS9kaXNhYmxlIHJvYW0gc2NhbgorCW9mZmxvYWQgZmVhdXJlCisgICBJdCBpcyB1c2VkIGF0IGluIHRoZSBSRUdfRFlOQU1JQ19WQVJJQUJMRSBtYWNybyBkZWZpbml0aW9uIG9mCisgICBnUm9hbVNjYW5PZmZsb2FkRW5hYmxlZC4KKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIFNNRSB1cGRhdGUgY29uZmlnIHN1Y2Nlc3NmdWxseS4KKwkgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUuCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX3JvYW1fc2Nhbl9vZmZsb2FkX2VuYWJsZWQodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkJYm9vbCBuUm9hbVNjYW5PZmZsb2FkRW5hYmxlZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkgIEZMCisJCQkJICAoImdSb2FtU2Nhbk9mZmxvYWRFbmFibGVkIGlzIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIpLAorCQkJICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCwKKwkJCSAgblJvYW1TY2FuT2ZmbG9hZEVuYWJsZWQpOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCA9CisJCQluUm9hbVNjYW5PZmZsb2FkRW5hYmxlZDsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9nZXRfbmVpZ2hib3Jfc2Nhbl9yZWZyZXNoX3BlcmlvZCgpIC0gZ2V0IG5laWdoYm9yIHNjYW4gcmVzdWx0cworCXJlZnJlc2ggcGVyaW9kCisgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgXHJldHVybiB1aW50MTZfdCAtIE5laWdoYm9yIHNjYW4gcmVzdWx0cyByZWZyZXNoIHBlcmlvZCB2YWx1ZQorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1aW50MTZfdCBzbWVfZ2V0X25laWdoYm9yX3NjYW5fcmVmcmVzaF9wZXJpb2QodEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJICAgICAgIG5OZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX2dldF9lbXB0eV9zY2FuX3JlZnJlc2hfcGVyaW9kKCkgLSBnZXQgZW1wdHkgc2NhbiByZWZyZXNoIHBlcmlvZAorICAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIFNNRSB1cGRhdGUgY29uZmlnIHN1Y2Nlc3NmdWwuCisJICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gdXBkYXRlCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQxNl90IHNtZV9nZXRfZW1wdHlfc2Nhbl9yZWZyZXNoX3BlcmlvZCh0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkgICAgICAgbkVtcHR5U2NhblJlZnJlc2hQZXJpb2Q7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfdXBkYXRlX2VtcHR5X3NjYW5fcmVmcmVzaF9wZXJpb2QKKyAgICBcYnJpZWYgIFVwZGF0ZSBuRW1wdHlTY2FuUmVmcmVzaFBlcmlvZAorCSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aHJvdWdoIGR5bmFtaWMgc2V0Q29uZmlnIGNhbGxiYWNrIGZ1bmN0aW9uCisJICAgIHRvIGNvbmZpZ3VyZSBuRW1wdHlTY2FuUmVmcmVzaFBlcmlvZAorCSAgICBVc2FnZTogYWRiIHNoZWxsIGl3cHJpdiB3bGFuMCBzZXRDb25maWcKKwkJCW5FbXB0eVNjYW5SZWZyZXNoUGVyaW9kPVswIC4uIDYwXQorICAgIFxwYXJhbSAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorICAgIFxwYXJhbSAgc2Vzc2lvbklkIC0gU2Vzc2lvbiBJZGVudGlmaWVyCisgICAgXHBhcmFtICBuRW1wdHlTY2FuUmVmcmVzaFBlcmlvZCAtIHNjYW4gcGVyaW9kIGZvbGxvd2luZyBlbXB0eSBzY2FuIHJlc3VsdHMuCisgICBcLSByZXR1cm4gU3VjY2VzcyBvciBmYWlsdXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9lbXB0eV9zY2FuX3JlZnJlc2hfcGVyaW9kKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCQl1aW50MTZfdCBuRW1wdHlTY2FuUmVmcmVzaFBlcmlvZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzck5laWdoYm9yUm9hbUNvbmZpZyAqcE5laWdoYm9yUm9hbUNvbmZpZyA9IE5VTEw7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9IE5VTEw7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJcE5laWdoYm9yUm9hbUNvbmZpZyA9CisJCQkmcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWc7CisJCXBOZWlnaGJvclJvYW1JbmZvID0gJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSAgIkxGUiBydW50aW1lIHN1Y2Nlc3NmdWxseSBzZXQgcm9hbSBzY2FuIHBlcmlvZCB0byAlZCAtb2xkIHZhbHVlIGlzICVkIC0gcm9hbSBzdGF0ZSBpcyAlcyIsCisJCQkgIG5FbXB0eVNjYW5SZWZyZXNoUGVyaW9kLAorCQkJICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCSAgbkVtcHR5U2NhblJlZnJlc2hQZXJpb2QsCisJCQkgIG1hY190cmFjZV9nZXRfbmVpZ2hib3VyX3JvYW1fc3RhdGUocE1hYy0+cm9hbS4KKwkJCQkJCQkgICAgIG5laWdoYm9yUm9hbUluZm8KKwkJCQkJCQkgICAgIFtzZXNzaW9uSWRdLgorCQkJCQkJCSAgICAgbmVpZ2hib3JSb2FtU3RhdGUpKTsKKwkJcE5laWdoYm9yUm9hbUNvbmZpZy0+bkVtcHR5U2NhblJlZnJlc2hQZXJpb2QgPQorCQkJbkVtcHR5U2NhblJlZnJlc2hQZXJpb2Q7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuZW1wdHlTY2FuUmVmcmVzaFBlcmlvZCA9CisJCQluRW1wdHlTY2FuUmVmcmVzaFBlcmlvZDsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkgeworCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCSAgICAgIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcsCisJCQkJICAgICAgUkVBU09OX0VNUFRZX1NDQU5fUkVGX1BFUklPRF9DSEFOR0VEKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfbmVpZ2hib3Jfc2Nhbl9taW5fY2hhbl90aW1lCisgICAgXGJyaWVmICBVcGRhdGUgbk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lCisJICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRocm91Z2ggZHluYW1pYyBzZXRDb25maWcgY2FsbGJhY2sgZnVuY3Rpb24KKwkgICAgdG8gY29uZmlndXJlIGdOZWlnaGJvclNjYW5DaGFubmVsTWluVGltZQorCSAgICBVc2FnZTogYWRiIHNoZWxsIGl3cHJpdiB3bGFuMCBzZXRDb25maWcKKwkJCWdOZWlnaGJvclNjYW5DaGFubmVsTWluVGltZT1bMCAuLiA2MF0KKyAgICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgICBccGFyYW0gIG5OZWlnaGJvclNjYW5NaW5DaGFuVGltZSAtIENoYW5uZWwgbWluaW11bSBkd2VsbCB0aW1lCisgICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgIFwtIHJldHVybiBTdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9uZWlnaGJvcl9zY2FuX21pbl9jaGFuX3RpbWUodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgICAgICAgY29uc3QgdWludDE2X3QKKwkJCQkJICAgICAgIG5OZWlnaGJvclNjYW5NaW5DaGFuVGltZSwKKwkJCQkJICAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSAgIkxGUiBydW50aW1lIHN1Y2Nlc3NmdWxseSBzZXQgY2hhbm5lbCBtaW4gZHdlbGwgdGltZSB0byAlZCAtIG9sZCB2YWx1ZSBpcyAlZCAtIHJvYW0gc3RhdGUgaXMgJXMiLAorCQkJICBuTmVpZ2hib3JTY2FuTWluQ2hhblRpbWUsCisJCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJICBuTmVpZ2hib3JTY2FuTWluQ2hhblRpbWUsCisJCQkgIG1hY190cmFjZV9nZXRfbmVpZ2hib3VyX3JvYW1fc3RhdGUocE1hYy0+cm9hbS4KKwkJCQkJCQkgICAgIG5laWdoYm9yUm9hbUluZm8KKwkJCQkJCQkgICAgIFtzZXNzaW9uSWRdLgorCQkJCQkJCSAgICAgbmVpZ2hib3JSb2FtU3RhdGUpKTsKKworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJbk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lID0gbk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lOworCQlwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXS5jZmdQYXJhbXMuCisJCW1pbkNoYW5uZWxTY2FuVGltZSA9IG5OZWlnaGJvclNjYW5NaW5DaGFuVGltZTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfbmVpZ2hib3Jfc2Nhbl9tYXhfY2hhbl90aW1lCisgICAgXGJyaWVmICBVcGRhdGUgbk5laWdoYm9yU2Nhbk1heENoYW5UaW1lCisJICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRocm91Z2ggZHluYW1pYyBzZXRDb25maWcgY2FsbGJhY2sgZnVuY3Rpb24KKwkgICAgdG8gY29uZmlndXJlIGdOZWlnaGJvclNjYW5DaGFubmVsTWF4VGltZQorCSAgICBVc2FnZTogYWRiIHNoZWxsIGl3cHJpdiB3bGFuMCBzZXRDb25maWcKKwkJCWdOZWlnaGJvclNjYW5DaGFubmVsTWF4VGltZT1bMCAuLiA2MF0KKyAgICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxwYXJhbSAgbk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lIC0gQ2hhbm5lbCBtYXhpbXVtIGR3ZWxsIHRpbWUKKyAgIFwtIHJldHVybiBTdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9uZWlnaGJvcl9zY2FuX21heF9jaGFuX3RpbWUodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgIGNvbnN0IHVpbnQxNl90CisJCQkJCSAgICAgICBuTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWUpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRDc3JOZWlnaGJvclJvYW1Db25maWcgKnBOZWlnaGJvclJvYW1Db25maWcgPSBOVUxMOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPSBOVUxMOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXBOZWlnaGJvclJvYW1Db25maWcgPQorCQkJJnBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnOworCQlwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkgICJMRlIgcnVudGltZSBzdWNjZXNzZnVsbHkgc2V0IGNoYW5uZWwgbWF4IGR3ZWxsIHRpbWUgdG8gJWQgLSBvbGQgdmFsdWUgaXMgJWQgLSByb2FtIHN0YXRlIGlzICVzIiwKKwkJCSAgbk5laWdoYm9yU2Nhbk1heENoYW5UaW1lLAorCQkJICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCSAgbk5laWdoYm9yU2Nhbk1heENoYW5UaW1lLAorCQkJICBtYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlKHBNYWMtPnJvYW0uCisJCQkJCQkJICAgICBuZWlnaGJvclJvYW1JbmZvCisJCQkJCQkJICAgICBbc2Vzc2lvbklkXS4KKwkJCQkJCQkgICAgIG5laWdoYm9yUm9hbVN0YXRlKSk7CisJCXBOZWlnaGJvclJvYW1Db25maWctPm5OZWlnaGJvclNjYW5NYXhDaGFuVGltZSA9CisJCQluTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWU7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubWF4Q2hhbm5lbFNjYW5UaW1lID0KKwkJCW5OZWlnaGJvclNjYW5NYXhDaGFuVGltZTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkgeworCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCSAgICAgIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcsCisJCQkJICAgICAgUkVBU09OX1NDQU5fQ0hfVElNRV9DSEFOR0VEKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2dldF9uZWlnaGJvcl9zY2FuX21pbl9jaGFuX3RpbWUKKyAgICBcYnJpZWYgIGdldCBuZWlnaGJvciBzY2FuIG1pbiBjaGFubmVsIHRpbWUKKyAgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgICBccmV0dXJuIHVpbnQxNl90IC0gY2hhbm5lbCBtaW4gdGltZSB2YWx1ZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDE2X3Qgc21lX2dldF9uZWlnaGJvcl9zY2FuX21pbl9jaGFuX3RpbWUodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJcmV0dXJuIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdLmNmZ1BhcmFtcy4KKwkgICAgICAgbWluQ2hhbm5lbFNjYW5UaW1lOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2dldF9uZWlnaGJvcl9yb2FtX3N0YXRlCisgICAgXGJyaWVmICBnZXQgbmVpZ2hib3Igcm9hbSBzdGF0ZQorICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxyZXR1cm4gdWludDMyX3QgLSBuZWlnaGJvciByb2FtIHN0YXRlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1aW50MzJfdCBzbWVfZ2V0X25laWdoYm9yX3JvYW1fc3RhdGUodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJcmV0dXJuIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdLm5laWdoYm9yUm9hbVN0YXRlOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2dldF9jdXJyZW50X3JvYW1fc3RhdGUKKyAgICBcYnJpZWYgIGdldCBjdXJyZW50IHJvYW0gc3RhdGUKKyAgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgICBccmV0dXJuIHVpbnQzMl90IC0gY3VycmVudCByb2FtIHN0YXRlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1aW50MzJfdCBzbWVfZ2V0X2N1cnJlbnRfcm9hbV9zdGF0ZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5jdXJTdGF0ZVtzZXNzaW9uSWRdOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2dldF9jdXJyZW50X3JvYW1fc3ViX3N0YXRlCisgICAgXGJyaWVmICBnZXQgbmVpZ2hib3Igcm9hbSBzdWIgc3RhdGUKKyAgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgICBccmV0dXJuIHVpbnQzMl90IC0gY3VycmVudCByb2FtIHN1YiBzdGF0ZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDMyX3Qgc21lX2dldF9jdXJyZW50X3JvYW1fc3ViX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5yb2FtLmN1clN1YlN0YXRlW3Nlc3Npb25JZF07Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X2xpbV9zbWVfc3RhdGUKKyAgICBcYnJpZWYgIGdldCBMaW0gU21lIHN0YXRlCisgICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgIFxyZXR1cm4gdWludDMyX3QgLSBMaW0gU21lIHN0YXRlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1aW50MzJfdCBzbWVfZ2V0X2xpbV9zbWVfc3RhdGUodEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+bGltLmdMaW1TbWVTdGF0ZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9nZXRfbGltX21sbV9zdGF0ZQorICAgIFxicmllZiAgZ2V0IExpbSBNbG0gc3RhdGUKKyAgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICAgXHJldHVybiB1aW50MzJfdCAtIExpbSBNbG0gc3RhdGUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQzMl90IHNtZV9nZXRfbGltX21sbV9zdGF0ZSh0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2lzX2xpbV9zZXNzaW9uX3ZhbGlkCisgICAgXGJyaWVmICBpcyBMaW0gc2Vzc2lvbiB2YWxpZAorICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxyZXR1cm4gYm9vbCAtIHRydWUgb3IgZmFsc2UKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Jvb2wgc21lX2lzX2xpbV9zZXNzaW9uX3ZhbGlkKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5saW0uZ3BTZXNzaW9uW3Nlc3Npb25JZF0udmFsaWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X2xpbV9zbWVfc2Vzc2lvbl9zdGF0ZQorICAgIFxicmllZiAgZ2V0IExpbSBTbWUgc2Vzc2lvbiBzdGF0ZQorICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxyZXR1cm4gdWludDMyX3QgLSBMaW0gU21lIHNlc3Npb24gc3RhdGUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQzMl90IHNtZV9nZXRfbGltX3NtZV9zZXNzaW9uX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5saW0uZ3BTZXNzaW9uW3Nlc3Npb25JZF0ubGltU21lU3RhdGU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X2xpbV9tbG1fc2Vzc2lvbl9zdGF0ZQorICAgIFxicmllZiAgZ2V0IExpbSBNbG0gc2Vzc2lvbiBzdGF0ZQorICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxyZXR1cm4gdWludDMyX3QgLSBMaW0gTWxtIHNlc3Npb24gc3RhdGUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQzMl90IHNtZV9nZXRfbGltX21sbV9zZXNzaW9uX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5saW0uZ3BTZXNzaW9uW3Nlc3Npb25JZF0ubGltTWxtU3RhdGU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X25laWdoYm9yX3NjYW5fbWF4X2NoYW5fdGltZQorICAgIFxicmllZiAgZ2V0IG5laWdoYm9yIHNjYW4gbWF4IGNoYW5uZWwgdGltZQorICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxyZXR1cm4gdWludDE2X3QgLSBjaGFubmVsIG1heCB0aW1lIHZhbHVlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1aW50MTZfdCBzbWVfZ2V0X25laWdoYm9yX3NjYW5fbWF4X2NoYW5fdGltZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF0uY2ZnUGFyYW1zLgorCSAgICAgICBtYXhDaGFubmVsU2NhblRpbWU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfc2V0X25laWdoYm9yX3NjYW5fcGVyaW9kCisgICAgXGJyaWVmICBVcGRhdGUgbk5laWdoYm9yU2NhblBlcmlvZAorCSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aHJvdWdoIGR5bmFtaWMgc2V0Q29uZmlnIGNhbGxiYWNrIGZ1bmN0aW9uCisJICAgIHRvIGNvbmZpZ3VyZSBuTmVpZ2hib3JTY2FuUGVyaW9kCisJICAgIFVzYWdlOiBhZGIgc2hlbGwgaXdwcml2IHdsYW4wIHNldENvbmZpZworCQkJbk5laWdoYm9yU2NhblBlcmlvZD1bMCAuLiAxMDAwXQorICAgIFxwYXJhbSAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorICAgIFxwYXJhbSAgc2Vzc2lvbklkIC0gU2Vzc2lvbiBJZGVudGlmaWVyCisgICAgXHBhcmFtICBuTmVpZ2hib3JTY2FuUGVyaW9kIC0gbmVpZ2hib3Igc2NhbiBwZXJpb2QKKyAgIFwtIHJldHVybiBTdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9uZWlnaGJvcl9zY2FuX3BlcmlvZCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQljb25zdCB1aW50MTZfdCBuTmVpZ2hib3JTY2FuUGVyaW9kKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyTmVpZ2hib3JSb2FtQ29uZmlnICpwTmVpZ2hib3JSb2FtQ29uZmlnID0gTlVMTDsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0gTlVMTDsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlwTmVpZ2hib3JSb2FtQ29uZmlnID0KKwkJCSZwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZzsKKwkJcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJICAiTEZSIHJ1bnRpbWUgc3VjY2Vzc2Z1bGx5IHNldCBuZWlnaGJvciBzY2FuIHBlcmlvZCB0byAlZCIKKwkJCSAgIiAtIG9sZCB2YWx1ZSBpcyAlZCAtIHJvYW0gc3RhdGUgaXMgJXMiLAorCQkJICBuTmVpZ2hib3JTY2FuUGVyaW9kLAorCQkJICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCSAgbk5laWdoYm9yU2NhblRpbWVyUGVyaW9kLAorCQkJICBtYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlKHBNYWMtPnJvYW0uCisJCQkJCQkJICAgICBuZWlnaGJvclJvYW1JbmZvCisJCQkJCQkJICAgICBbc2Vzc2lvbklkXS4KKwkJCQkJCQkgICAgIG5laWdoYm9yUm9hbVN0YXRlKSk7CisJCXBOZWlnaGJvclJvYW1Db25maWctPm5OZWlnaGJvclNjYW5UaW1lclBlcmlvZCA9CisJCQluTmVpZ2hib3JTY2FuUGVyaW9kOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5laWdoYm9yU2NhblBlcmlvZCA9CisJCQluTmVpZ2hib3JTY2FuUGVyaW9kOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNSb2FtT2ZmbG9hZFNjYW5FbmFibGVkKSB7CisJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJICAgICAgUk9BTV9TQ0FOX09GRkxPQURfVVBEQVRFX0NGRywKKwkJCQkgICAgICBSRUFTT05fU0NBTl9IT01FX1RJTUVfQ0hBTkdFRCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9nZXRfbmVpZ2hib3Jfc2Nhbl9wZXJpb2QKKyAgICBcYnJpZWYgIGdldCBuZWlnaGJvciBzY2FuIHBlcmlvZAorICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxyZXR1cm4gdWludDE2X3QgLSBuZWlnaGJvciBzY2FuIHBlcmlvZAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDE2X3Qgc21lX2dldF9uZWlnaGJvcl9zY2FuX3BlcmlvZCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF0uY2ZnUGFyYW1zLgorCSAgICAgICBuZWlnaGJvclNjYW5QZXJpb2Q7Cit9CisKKyNlbmRpZgorCisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfZ2V0X3JvYW1fcnNzaV9kaWZmKCkgLSBnZXQgUm9hbSByc3NpIGRpZmYKKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICBccmV0dXJuIHVpbnQxNl90IC0gUnNzaSBkaWZmIHZhbHVlCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQ4X3Qgc21lX2dldF9yb2FtX3Jzc2lfZGlmZih0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlJvYW1Sc3NpRGlmZjsKK30KKworLyoqCisgKiBzbWVfY2hhbmdlX3JvYW1fc2Nhbl9jaGFubmVsX2xpc3QoKSAtIHRvIGNoYW5nZSBzY2FuIGNoYW5uZWwgbGlzdAorICogQGhIYWw6IHBvaW50ZXIgSEFMIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorICogQHNlc3Npb25JZDogc21lIHNlc3Npb24gaWQKKyAqIEBwQ2hhbm5lbExpc3Q6IE91dHB1dCBjaGFubmVsIGxpc3QKKyAqIEBudW1DaGFubmVsczogT3V0cHV0IG51bWJlciBvZiBjaGFubmVscworICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gQ2hhbmdlIHJvYW0gc2NhbiBjaGFubmVsIGxpc3QuCisgKiBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9jaGFuZ2Vfcm9hbV9zY2FuX2NoYW5uZWxfbGlzdCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgIHVpbnQ4X3QgKnBDaGFubmVsTGlzdCwKKwkJCQkJICAgICB1aW50OF90IG51bUNoYW5uZWxzKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0KKwkJJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCXVpbnQ4X3Qgb2xkQ2hhbm5lbExpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOICogMl0gPSB7IDAgfTsKKwl1aW50OF90IG5ld0NoYW5uZWxMaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTiAqIDJdID0geyAwIH07CisJdWludDhfdCBpID0gMCwgaiA9IDA7CisJdENzckNoYW5uZWxJbmZvICpjaGFuX2luZm87CisKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNSb2FtT2ZmbG9hZFNjYW5FbmFibGVkKQorCQkJY3NyX3JvYW1fb2ZmbG9hZF9zY2FuKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJUk9BTV9TQ0FOX09GRkxPQURfVVBEQVRFX0NGRywKKwkJCQkJUkVBU09OX0NIQU5ORUxfTElTVF9DSEFOR0VEKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJY2hhbl9pbmZvID0gJnBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm87CisKKwlpZiAoTlVMTCAhPSBjaGFuX2luZm8tPkNoYW5uZWxMaXN0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBjaGFuX2luZm8tPm51bU9mQ2hhbm5lbHM7IGkrKykgeworCQkJaWYgKGogPCBzaXplb2Yob2xkQ2hhbm5lbExpc3QpKQorCQkJCWogKz0gc25wcmludGYob2xkQ2hhbm5lbExpc3QgKyBqLAorCQkJCQlzaXplb2Yob2xkQ2hhbm5lbExpc3QpIC0KKwkJCQkJaiwgIiVkIiwKKwkJCQkJY2hhbl9pbmZvLT5DaGFubmVsTGlzdFtpXSk7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKwl9CisJY3NyX2ZsdXNoX2NmZ19iZ19zY2FuX3JvYW1fY2hhbm5lbF9saXN0KHBNYWMsIHNlc3Npb25JZCk7CisJY3NyX2NyZWF0ZV9iZ19zY2FuX3JvYW1fY2hhbm5lbF9saXN0KHBNYWMsIHNlc3Npb25JZCwgcENoYW5uZWxMaXN0LAorCQkJbnVtQ2hhbm5lbHMpOworCXNtZV9zZXRfcm9hbV9zY2FuX2NvbnRyb2woaEhhbCwgc2Vzc2lvbklkLCAxKTsKKwlpZiAoTlVMTCAhPSBjaGFuX2luZm8tPkNoYW5uZWxMaXN0KSB7CisJCWogPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgY2hhbl9pbmZvLT5udW1PZkNoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChqIDwgc2l6ZW9mKG5ld0NoYW5uZWxMaXN0KSkKKwkJCQlqICs9IHNucHJpbnRmKG5ld0NoYW5uZWxMaXN0ICsgaiwKKwkJCQkJc2l6ZW9mKG5ld0NoYW5uZWxMaXN0KSAtCisJCQkJCWosICIgJWQiLAorCQkJCQljaGFuX2luZm8tPkNoYW5uZWxMaXN0W2ldKTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfQorCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCUZMKCJMRlIgcnVudGltZSBzdWNjZXNzZnVsbHkgc2V0IHJvYW0gc2NhbiBjaGFubmVscyB0byAlcyAtIG9sZCB2YWx1ZSBpcyAlcyAtIHJvYW0gc3RhdGUgaXMgJWQiKSwKKwkJCW5ld0NoYW5uZWxMaXN0LCBvbGRDaGFubmVsTGlzdCwKKwkJCXBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdLm5laWdoYm9yUm9hbVN0YXRlKTsKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKworCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkKKwkJY3NyX3JvYW1fb2ZmbG9hZF9zY2FuKHBNYWMsIHNlc3Npb25JZCwKKwkJCQlST0FNX1NDQU5fT0ZGTE9BRF9VUERBVEVfQ0ZHLAorCQkJCVJFQVNPTl9DSEFOTkVMX0xJU1RfQ0hBTkdFRCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECisvKioKKyAqIHNtZV9zZXRfZXNlX3JvYW1fc2Nhbl9jaGFubmVsX2xpc3QoKSAtIFRvIHNldCBlc2Ugcm9hbSBzY2FuIGNoYW5uZWwgbGlzdAorICogQGhIYWw6IHBvaW50ZXIgSEFMIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorICogQHNlc3Npb25JZDogc21lIHNlc3Npb24gaWQKKyAqIEBwQ2hhbm5lbExpc3Q6IE91dHB1dCBjaGFubmVsIGxpc3QKKyAqIEBudW1DaGFubmVsczogT3V0cHV0IG51bWJlciBvZiBjaGFubmVscworICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IGVzZSByb2FtIHNjYW4gY2hhbm5lbCBsaXN0LgorICogVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfc2V0X2VzZV9yb2FtX3NjYW5fY2hhbm5lbF9saXN0KHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgIHVpbnQ4X3QgKnBDaGFubmVsTGlzdCwKKwkJCQkJICAgICAgdWludDhfdCBudW1DaGFubmVscykKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbworCQk9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKwl0cENzckNoYW5uZWxJbmZvIGN1cmNobmxfbGlzdF9pbmZvCisJCT0gJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mbzsKKwl1aW50OF90IG9sZENoYW5uZWxMaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTiAqIDJdID0geyAwIH07CisJdWludDhfdCBuZXdDaGFubmVsTGlzdFsxMjhdID0geyAwIH07CisJdWludDhfdCBpID0gMCwgaiA9IDA7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRTY2FuRW5hYmxlZCkKKwkJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJCVJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcsCisJCQkJCVJFQVNPTl9DSEFOTkVMX0xJU1RfQ0hBTkdFRCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChOVUxMICE9IGN1cmNobmxfbGlzdF9pbmZvLT5DaGFubmVsTGlzdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgY3VyY2hubF9saXN0X2luZm8tPm51bU9mQ2hhbm5lbHM7IGkrKykgeworCQkJaiArPSBzbnByaW50ZihvbGRDaGFubmVsTGlzdCArIGosCisJCQkJc2l6ZW9mKG9sZENoYW5uZWxMaXN0KSAtIGosICIlZCIsCisJCQkJY3VyY2hubF9saXN0X2luZm8tPkNoYW5uZWxMaXN0W2ldKTsKKwkJfQorCX0KKwlzdGF0dXMgPSBjc3JfY3JlYXRlX3JvYW1fc2Nhbl9jaGFubmVsX2xpc3QocE1hYywgc2Vzc2lvbklkLAorCQkJCXBDaGFubmVsTGlzdCwgbnVtQ2hhbm5lbHMsCisJCQkJY3NyX2dldF9jdXJyZW50X2JhbmQoaEhhbCkpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlpZiAoTlVMTCAhPSBjdXJjaG5sX2xpc3RfaW5mby0+Q2hhbm5lbExpc3QpIHsKKwkJCWogPSAwOworCQkJZm9yIChpID0gMDsgaSA8IGN1cmNobmxfbGlzdF9pbmZvLT5udW1PZkNoYW5uZWxzOyBpKyspIHsKKwkJCQlqICs9IHNucHJpbnRmKG5ld0NoYW5uZWxMaXN0ICsgaiwKKwkJCQkJc2l6ZW9mKG5ld0NoYW5uZWxMaXN0KSAtIGosICIlZCIsCisJCQkJCWN1cmNobmxfbGlzdF9pbmZvLT5DaGFubmVsTGlzdFtpXSk7CisJCQl9CisJCX0KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkiRVNFIHJvYW0gc2NhbiBjaG5sIGxpc3Qgc3VjY2Vzc2Z1bGx5IHNldCB0byAlcy1vbGQgdmFsdWUgaXMgJXMtcm9hbSBzdGF0ZSBpcyAlZCIsCisJCQluZXdDaGFubmVsTGlzdCwgb2xkQ2hhbm5lbExpc3QsCisJCQlwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpOworCX0KKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQpCisJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJUk9BTV9TQ0FOX09GRkxPQURfVVBEQVRFX0NGRywKKwkJCQlSRUFTT05fQ0hBTk5FTF9MSVNUX0NIQU5HRUQpOworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworLyoqCisgKiBzbWVfZ2V0X3JvYW1fc2Nhbl9jaGFubmVsX2xpc3QoKSAtIFRvIGdldCByb2FtIHNjYW4gY2hhbm5lbCBsaXN0CisgKiBAaEhhbDogSEFMIHBvaW50ZXIKKyAqIEBwQ2hhbm5lbExpc3Q6IE91dHB1dCBjaGFubmVsIGxpc3QKKyAqIEBwTnVtQ2hhbm5lbHM6IE91dHB1dCBudW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBzZXNzaW9uSWQ6IFNlc3Npb24gSWRlbnRpZmllcgorICoKKyAqIFRvIGdldCByb2FtIHNjYW4gY2hhbm5lbCBsaXN0IFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX2dldF9yb2FtX3NjYW5fY2hhbm5lbF9saXN0KHRIYWxIYW5kbGUgaEhhbCwKKwkJCXVpbnQ4X3QgKnBDaGFubmVsTGlzdCwgdWludDhfdCAqcE51bUNoYW5uZWxzLAorCQkJdWludDhfdCBzZXNzaW9uSWQpCit7CisJaW50IGkgPSAwOworCXVpbnQ4X3QgKnBPdXRQdHIgPSBwQ2hhbm5lbExpc3Q7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChOVUxMID09IHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCUZMKCJSb2FtIFNjYW4gY2hhbm5lbCBsaXN0IGlzIE5PVCB5ZXQgaW5pdGlhbGl6ZWQiKSk7CisJCSpwTnVtQ2hhbm5lbHMgPSAwOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkqcE51bUNoYW5uZWxzID0gcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOworCWZvciAoaSA9IDA7IGkgPCAoKnBOdW1DaGFubmVscyk7IGkrKykgeworCQlwT3V0UHRyW2ldID0KKwkJCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaV07CisJfQorCXBPdXRQdHJbaV0gPSAnXDAnOworCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfZ2V0X2lzX2VzZV9mZWF0dXJlX2VuYWJsZWQoKSAtIGdldCBFU0UgZmVhdHVyZSBlbmFibGVkIG9yIG5vdAorICAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICBccmV0dXJuIHRydWUgKDEpIC0gaWYgdGhlIEVTRSBmZWF0dXJlIGlzIGVuYWJsZWQKKwkgICBmYWxzZSAoMCkgLSBpZiBmZWF0dXJlIGlzIGRpc2FibGVkIChjb21waWxlIG9yIHJ1bnRpbWUpCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Jvb2wgc21lX2dldF9pc19lc2VfZmVhdHVyZV9lbmFibGVkKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBjc3Jfcm9hbV9pc19lc2VfaW5pX2ZlYXR1cmVfZW5hYmxlZChwTWFjKTsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfZ2V0X3dlc19tb2RlKCkgLSBnZXQgV0VTIE1vZGUKKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4KKyAgIFxyZXR1cm4gdWludDhfdCAtIFdFUyBNb2RlIEVuYWJsZWQoMSkvRGlzYWJsZWQoMCkKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworYm9vbCBzbWVfZ2V0X3dlc19tb2RlKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJcmV0dXJuIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNXRVNNb2RlRW5hYmxlZDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9nZXRfcm9hbV9zY2FuX2NvbnRyb2woKSAtIGdldCBzY2FuIGNvbnRyb2wKKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICBccmV0dXJuIGJvb2wgLSBFbmFibGVkKDEpL0Rpc2FibGVkKDApCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Jvb2wgc21lX2dldF9yb2FtX3NjYW5fY29udHJvbCh0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtU2NhbkNvbnRyb2w7Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9nZXRfaXNfbGZyX2ZlYXR1cmVfZW5hYmxlZCgpIC0gZ2V0IExGUiBmZWF0dXJlIGVuYWJsZWQgb3Igbm90CisgICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxyZXR1cm4gdHJ1ZSAoMSkgLSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkCisJICAgZmFsc2UgKDApIC0gaWYgZmVhdHVyZSBpcyBkaXNhYmxlZCAoY29tcGlsZSBvciBydW50aW1lKQorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitib29sIHNtZV9nZXRfaXNfbGZyX2ZlYXR1cmVfZW5hYmxlZCh0SGFsSGFuZGxlIGhIYWwpCit7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQ7CisjZWxzZQorCXJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX2dldF9pc19mdF9mZWF0dXJlX2VuYWJsZWQoKSAtIGdldCBGVCBmZWF0dXJlIGVuYWJsZWQgb3Igbm90CisgICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxyZXR1cm4gdHJ1ZSAoMSkgLSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkCisJICAgZmFsc2UgKDApIC0gaWYgZmVhdHVyZSBpcyBkaXNhYmxlZCAoY29tcGlsZSBvciBydW50aW1lKQorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitib29sIHNtZV9nZXRfaXNfZnRfZmVhdHVyZV9lbmFibGVkKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZDsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfaXNfZmVhdHVyZV9zdXBwb3J0ZWRfYnlfZncKKyAgICBcYnJpZWYgIENoZWNrIGlmIGFuIGZlYXR1cmUgaXMgZW5hYmxlZCBieSBGVworCisgICAgXHBhcmFtICBmZWF0dEVudW1WYWx1ZSAtIEVudW1lcmF0aW9uIHZhbHVlIGZyb20gcGxhY2VIb2xkZXJJbkNhcEJpdG1hcAorICAgXC0gcmV0dXJuIDEvMCAodHJ1ZS9mYWxzZSkKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQ4X3Qgc21lX2lzX2ZlYXR1cmVfc3VwcG9ydGVkX2J5X2Z3KHVpbnQ4X3QgZmVhdEVudW1WYWx1ZSkKK3sKKwlyZXR1cm4gSVNfRkVBVFVSRV9TVVBQT1JURURfQllfRlcoZmVhdEVudW1WYWx1ZSk7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3NlbmRfdGRsc19saW5rX2VzdGFibGlzaF9wYXJhbXMKKyAgICBcYnJpZWYgIEFQSSB0byBzZW5kIFRETFMgUGVlciBMaW5rIEVzdGFibGlzaG1lbnQgUGFyYW1ldGVycy4KKworICAgIFxwYXJhbSAgcGVlck1hYyAtIHBlZXIncyBNYWMgQWRyZXNzLgorICAgIFxwYXJhbSAgdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMgLSBURExTIFBlZXIgTGluayBFc3RhYmxpc2htZW50IFBhcmFtZXRlcnMKKyAgIFwtIHJldHVybiBDREZfU1RBVFVTX1NVQ0NFUworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2VuZF90ZGxzX2xpbmtfZXN0YWJsaXNoX3BhcmFtcyh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSAgICAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgIGNvbnN0IHRTaXJNYWNBZGRyIHBlZXJNYWMsCisJCQkJCSAgICAgICB0Q3NyVGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMgKgorCQkJCQkgICAgICAgdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkgICAgc3RhdHVzID0gY3NyX3RkbHNfc2VuZF9saW5rX2VzdGFibGlzaF9wYXJhbXMoaEhhbCwgc2Vzc2lvbklkLAorCQkJCXBlZXJNYWMsIHRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfc2VuZF90ZGxzX21nbXRfZnJhbWUKKyAgICBcYnJpZWYgIEFQSSB0byBzZW5kIFRETFMgbWFuYWdlbWVudCBmcmFtZXMuCisKKyAgICBccGFyYW0gIHBlZXJNYWMgLSBwZWVyJ3MgTWFjIEFkcmVzcy4KKyAgICBccGFyYW0gZnJhbWVfdHlwZSAtIFR5cGUgb2YgVERMUyBtZ210IGZyYW1lIHRvIGJlIHNlbnQuCisgICAgXHBhcmFtIGRpYWxvZyAtIGRpYWxvZyB0b2tlbiB1c2VkIGluIHRoZSBmcmFtZS4KKyAgICBccGFyYW0gc3RhdHVzIC0gc3RhdHVzIHRvIGJlIGluY3VkZWQgaW4gdGhlIGZyYW1lLgorICAgIFxwYXJhbSBwZWVyQ2FwYWJpbGl0eSAtIHBlZXIgY3BhYmlsaXRpZXMKKyAgICBccGFyYW0gYnVmIC0gYWRkaXRpb25hbCBJRXMgdG8gYmUgaW5jbHVkZWQKKyAgICBccGFyYW0gbGVuIC0gbGVuZ2h0IG9mIGFkZGl0aW9uYWwgSWVzCisgICAgXHBhcmFtIHJlc3BvbmRlciAtIFRkbHMgcmVxdWVzdCB0eXBlCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NlbmRfdGRsc19tZ210X2ZyYW1lKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJICAgIGNvbnN0IHRTaXJNYWNBZGRyIHBlZXJNYWMsCisJCQkJICAgIHVpbnQ4X3QgZnJhbWVfdHlwZSwKKwkJCQkgICAgdWludDhfdCBkaWFsb2csIHVpbnQxNl90IHN0YXR1c0NvZGUsCisJCQkJICAgIHVpbnQzMl90IHBlZXJDYXBhYmlsaXR5LCB1aW50OF90ICpidWYsCisJCQkJICAgIHVpbnQ4X3QgbGVuLCB1aW50OF90IHJlc3BvbmRlcikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyVGRsc1NlbmRNZ210IHNlbmRUZGxzUmVxID0geyB7MH0gfTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJY2RmX21lbV9jb3B5KHNlbmRUZGxzUmVxLnBlZXJNYWMsIHBlZXJNYWMsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlzZW5kVGRsc1JlcS5mcmFtZVR5cGUgPSBmcmFtZV90eXBlOworCQlzZW5kVGRsc1JlcS5idWYgPSBidWY7CisJCXNlbmRUZGxzUmVxLmxlbiA9IGxlbjsKKwkJc2VuZFRkbHNSZXEuZGlhbG9nID0gZGlhbG9nOworCQlzZW5kVGRsc1JlcS5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTsKKwkJc2VuZFRkbHNSZXEucmVzcG9uZGVyID0gcmVzcG9uZGVyOworCQlzZW5kVGRsc1JlcS5wZWVyQ2FwYWJpbGl0eSA9IHBlZXJDYXBhYmlsaXR5OworCisJCXN0YXR1cyA9IGNzcl90ZGxzX3NlbmRfbWdtdF9yZXEoaEhhbCwgc2Vzc2lvbklkLCAmc2VuZFRkbHNSZXEpOworCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9jaGFuZ2VfdGRsc19wZWVyX3N0YQorICAgIFxicmllZiAgQVBJIHRvIFVwZGF0ZSBURExTIHBlZXIgc3RhIHBhcmFtZXRlcnMuCisKKyAgICBccGFyYW0gIHBlZXJNYWMgLSBwZWVyJ3MgTWFjIEFkcmVzcy4KKyAgICBccGFyYW0gIHN0YVBhcmFtcyAtIFBlZXIgU3RhdGlvbiBQYXJhbWV0ZXJzCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2NoYW5nZV90ZGxzX3BlZXJfc3RhKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJICAgIGNvbnN0IHRTaXJNYWNBZGRyIHBlZXJNYWMsCisJCQkJICAgIHRDc3JTdGFQYXJhbXMgKnBzdGFQYXJhbXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKE5VTEwgPT0gcHN0YVBhcmFtcykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzIDpwc3RhUGFyYW1zIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl90ZGxzX2NoYW5nZV9wZWVyX3N0YShoSGFsLCBzZXNzaW9uSWQsIHBlZXJNYWMsCisJCQkJCQkgIHBzdGFQYXJhbXMpOworCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9hZGRfdGRsc19wZWVyX3N0YQorICAgIFxicmllZiAgQVBJIHRvIEFkZCBURExTIHBlZXIgc3RhIGVudHJ5LgorCisgICAgXHBhcmFtICBwZWVyTWFjIC0gcGVlcidzIE1hYyBBZHJlc3MuCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2FkZF90ZGxzX3BlZXJfc3RhKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJIGNvbnN0IHRTaXJNYWNBZGRyIHBlZXJNYWMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl90ZGxzX2FkZF9wZWVyX3N0YShoSGFsLCBzZXNzaW9uSWQsIHBlZXJNYWMpOworCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9kZWxldGVfdGRsc19wZWVyX3N0YQorICAgIFxicmllZiAgQVBJIHRvIERlbGV0ZSBURExTIHBlZXIgc3RhIGVudHJ5LgorCisgICAgXHBhcmFtICBwZWVyTWFjIC0gcGVlcidzIE1hYyBBZHJlc3MuCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2RlbGV0ZV90ZGxzX3BlZXJfc3RhKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJICAgIGNvbnN0IHRTaXJNYWNBZGRyIHBlZXJNYWMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl90ZGxzX2RlbF9wZWVyX3N0YShoSGFsLCBzZXNzaW9uSWQsIHBlZXJNYWMpOworCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfdGRsc19wb3dlcl9zYXZlX3Byb2hpYml0ZWQKKyAgICBcQVBJIHRvIHNldC9yZXNldCB0aGUgaXNfdGRsc19wb3dlcl9zYXZlX3Byb2hpYml0ZWQuCisKKyAgIFwtIHJldHVybiB2b2lkCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX3NldF90ZGxzX3Bvd2VyX3NhdmVfcHJvaGliaXRlZCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJYm9vbCB2YWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXN0cnVjdCBwc19nbG9iYWxfaW5mbyAqcHNfZ2xvYmFsX2luZm8gPSAmcE1hYy0+c21lLnBzX2dsb2JhbF9pbmZvOworCXN0cnVjdCBwc19wYXJhbXMgKnBzX3BhcmFtID0gJnBzX2dsb2JhbF9pbmZvLT5wc19wYXJhbXNbc2Vzc2lvbklkXTsKKwlwc19wYXJhbS0+aXNfdGRsc19wb3dlcl9zYXZlX3Byb2hpYml0ZWQgPSB2YWw7CisJcmV0dXJuOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiAgICBzbWVfdXBkYXRlX2Z3X3RkbHNfc3RhdGUKKworICAgXGJyaWVmCisgICAgU01FIHdpbGwgc2VuZCBtZXNzYWdlIHRvIFdNQSB0byBzZXQgVERMUyBzdGF0ZSBpbiBmL3cKKworICAgXHBhcmFtCisKKyAgICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorCisgICAgcHNtZVRkbHNQYXJhbXMgLSBURExTIHN0YXRlIGluZm8gdG8gdXBkYXRlIGluIGYvdworCisgICAgdXNlU21lTG9jayAtIE5lZWQgdG8gYWNxdWlyZSBTTUUgR2xvYmFsIExvY2sgYmVmb3JlIHN0YXRlIHVwZGF0ZSBvciBub3QKKworICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9md190ZGxzX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAqcHNtZVRkbHNQYXJhbXMsCisJCQkJICAgIGJvb2wgdXNlU21lTG9jaykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IE5VTEw7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCisJLyogb25seSBhY3F1aXJlIHNtZSBnbG9iYWwgbG9jayBiZWZvcmUgc3RhdGUgdXBkYXRlIGlmIGFza2VkIHRvICovCisJaWYgKHVzZVNtZUxvY2spIHsKKwkJcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCQlpZiAoTlVMTCA9PSBwTWFjKQorCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogc2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwljZHNfbWVzc2FnZS5ib2R5cHRyID0gcHNtZVRkbHNQYXJhbXM7CisJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9VUERBVEVfRldfVERMU19TVEFURTsKKwljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCS8qIHJlbGVhc2UgdGhlIGxvY2sgaWYgaXQgd2FzIGFjcXVpcmVkICovCisJaWYgKHVzZVNtZUxvY2spCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfdXBkYXRlX3RkbHNfcGVlcl9zdGF0ZSgpIC0gdG8gdXBkYXRlIHRoZSBzdGF0ZSBvZiBURExTIHBlZXIKKyAqIEBoSGFsOiBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuCisgKiBAcGVlclN0YXRlUGFyYW1zOiBURExTIFBlZXIgc3RhdGUgaW5mbyB0byB1cGRhdGUgaW4gZi93CisgKgorICogU01FIHdpbGwgc2VuZCBtZXNzYWdlIHRvIFdNQSB0byBzZXQgVERMUyBQZWVyIHN0YXRlIGluIGYvdworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV91cGRhdGVfdGRsc19wZWVyX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkgICAgICB0U21lVGRsc1BlZXJTdGF0ZVBhcmFtcyAqcGVlclN0YXRlUGFyYW1zKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJdFRkbHNQZWVyU3RhdGVQYXJhbXMgKnBUZGxzUGVlclN0YXRlUGFyYW1zID0gTlVMTDsKKwl0VGRsc1BlZXJDYXBQYXJhbXMgKnBlZXJfY2FwID0gTlVMTDsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJdWludDhfdCBudW07CisJdWludDhfdCBjaGFuSWQ7CisJdWludDhfdCBpOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlwVGRsc1BlZXJTdGF0ZVBhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcFRkbHNQZWVyU3RhdGVQYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBwVGRsc1BlZXJTdGF0ZVBhcmFtcykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCUZMKCJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtIGZvciB0ZGxzIHBlZXIgc3RhdGUgcGFyYW0iKSk7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1femVybyhwVGRsc1BlZXJTdGF0ZVBhcmFtcywgc2l6ZW9mKCpwVGRsc1BlZXJTdGF0ZVBhcmFtcykpOworCWNkZl9tZW1fY29weSgmcFRkbHNQZWVyU3RhdGVQYXJhbXMtPnBlZXJNYWNBZGRyLAorCQkJJnBlZXJTdGF0ZVBhcmFtcy0+cGVlck1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCXBUZGxzUGVlclN0YXRlUGFyYW1zLT52ZGV2SWQgPSBwZWVyU3RhdGVQYXJhbXMtPnZkZXZJZDsKKwlwVGRsc1BlZXJTdGF0ZVBhcmFtcy0+cGVlclN0YXRlID0gcGVlclN0YXRlUGFyYW1zLT5wZWVyU3RhdGU7CisKKwlzd2l0Y2ggKHBlZXJTdGF0ZVBhcmFtcy0+cGVlclN0YXRlKSB7CisJY2FzZSBlU01FX1RETFNfUEVFUl9TVEFURV9QRUVSSU5HOgorCQlwVGRsc1BlZXJTdGF0ZVBhcmFtcy0+cGVlclN0YXRlID0KKwkJCVdNQV9URExTX1BFRVJfU1RBVEVfUEVFUklORzsKKwkJYnJlYWs7CisKKwljYXNlIGVTTUVfVERMU19QRUVSX1NUQVRFX0NPTk5FQ1RFRDoKKwkJcFRkbHNQZWVyU3RhdGVQYXJhbXMtPnBlZXJTdGF0ZSA9CisJCQlXTUFfVERMU19QRUVSX1NUQVRFX0NPTk5FQ1RFRDsKKwkJYnJlYWs7CisKKwljYXNlIGVTTUVfVERMU19QRUVSX1NUQVRFX1RFQVJET1dOOgorCQlwVGRsc1BlZXJTdGF0ZVBhcmFtcy0+cGVlclN0YXRlID0KKwkJCVdNQV9URExTX1BFRVJfU1RBVEVfVEVBUkRPV047CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiaW52YWxpZCBwZWVyIHN0YXRlIHBhcmFtICglZCkiKSwKKwkJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlclN0YXRlKTsKKwkJY2RmX21lbV9mcmVlKHBUZGxzUGVlclN0YXRlUGFyYW1zKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcGVlcl9jYXAgPSAmKHBUZGxzUGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwKTsKKwlwZWVyX2NhcC0+aXNQZWVyUmVzcG9uZGVyID0KKwkJcGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLmlzUGVlclJlc3BvbmRlcjsKKwlwZWVyX2NhcC0+cGVlclVhcHNkUXVldWUgPQorCQlwZWVyU3RhdGVQYXJhbXMtPnBlZXJDYXAucGVlclVhcHNkUXVldWU7CisJcGVlcl9jYXAtPnBlZXJNYXhTcCA9CisJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyTWF4U3A7CisJcGVlcl9jYXAtPnBlZXJCdWZmU3RhU3VwcG9ydCA9CisJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyQnVmZlN0YVN1cHBvcnQ7CisJcGVlcl9jYXAtPnBlZXJPZmZDaGFuU3VwcG9ydCA9CisJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyT2ZmQ2hhblN1cHBvcnQ7CisJcGVlcl9jYXAtPnBlZXJDdXJyT3BlckNsYXNzID0KKwkJcGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLnBlZXJDdXJyT3BlckNsYXNzOworCXBlZXJfY2FwLT5zZWxmQ3Vyck9wZXJDbGFzcyA9CisJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5zZWxmQ3Vyck9wZXJDbGFzczsKKworCW51bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IHBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyQ2hhbkxlbjsgaSsrKSB7CisJCWNoYW5JZCA9IHBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyQ2hhbltpXTsKKwkJaWYgKCFjc3Jfcm9hbV9pc19jaGFubmVsX3ZhbGlkKHBNYWMsIGNoYW5JZCkpCisJCQljb250aW51ZTsKKwkJcGVlcl9jYXAtPnBlZXJDaGFuW251bV0uY2hhbklkID0gY2hhbklkOworCQlwZWVyX2NhcC0+cGVlckNoYW5bbnVtXS5wd3IgPQorCQkJCQljc3JfZ2V0X2NmZ19tYXhfdHhfcG93ZXIocE1hYywgY2hhbklkKTsKKworCQlpZiAoY2RzX2dldF9jaGFubmVsX3N0YXRlKGNoYW5JZCkgPT0gQ0hBTk5FTF9TVEFURV9ERlMpCisJCQlwZWVyX2NhcC0+cGVlckNoYW5bbnVtXS5kZnNTZXQgPQorCQkJCQl0cnVlOworCQllbHNlCisJCQlwZWVyX2NhcC0+cGVlckNoYW5bbnVtXS5kZnNTZXQgPQorCQkJCQlmYWxzZTsKKwkJbnVtKys7CisJfQorCXBlZXJfY2FwLT5wZWVyQ2hhbkxlbiA9IG51bTsKKwlwZWVyX2NhcC0+cGVlck9wZXJDbGFzc0xlbiA9CisJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyT3BlckNsYXNzTGVuOworCWZvciAoaSA9IDA7IGkgPCBIQUxfVERMU19NQVhfU1VQUF9PUEVSX0NMQVNTRVM7IGkrKykgeworCQlwZWVyX2NhcC0+cGVlck9wZXJDbGFzc1tpXSA9CisJCQlwZWVyU3RhdGVQYXJhbXMtPnBlZXJDYXAucGVlck9wZXJDbGFzc1tpXTsKKwl9CisKKwlwZWVyX2NhcC0+cHJlZk9mZkNoYW5OdW0gPQorCQlwZWVyU3RhdGVQYXJhbXMtPnBlZXJDYXAucHJlZk9mZkNoYW5OdW07CisJcGVlcl9jYXAtPnByZWZPZmZDaGFuQmFuZHdpZHRoID0KKwkJcGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLnByZWZPZmZDaGFuQmFuZHdpZHRoOworCisJaWYgKHBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5vcENsYXNzRm9yUHJlZk9mZkNoYW5Jc1NldCkgeworCQlwZWVyX2NhcC0+b3BDbGFzc0ZvclByZWZPZmZDaGFuID0KKwkJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5vcENsYXNzRm9yUHJlZk9mZkNoYW47CisJfSBlbHNlIHsKKwkJLyoKKwkJICogcmVkZ20gb3BjbGFzcyB0YWJsZSBjb250YWlucyBvcGNsYXNzIGZvciA0ME1IeiBsb3cKKwkJICogcHJpbWFyeSwgNDBNSHogaGlnaCBwcmltYXJ5IGFuZCAyME1Iei4gTm8gc3VwcG9ydAorCQkgKiBmb3IgODBNSHogeWV0LiBTbyBmaXJzdCB3ZSB3aWxsIGNoZWNrIGlmIGJpdCBmb3IKKwkJICogNDBNSHogaXMgc2V0IGFuZCBpZiBzbyBmaW5kIG1hdGNoaW5nIG9wY2xhc3MgZWl0aGVyCisJCSAqIHdpdGggbG93IHByaW1hcnkgb3IgaGlnaCBwcmltYXJ5IChhIGNoYW5uZWwgd291bGQKKwkJICogbmV2ZXIgYmUgaW4gYm90aCkgYW5kIHRoZW4gc2VhcmNoIGZvciBvcGNsYXNzCisJCSAqIG1hdGNoaW5nIDIwTUh6LCBlbHNlIGZvciBhbnkgQlcuCisJCSAqLworCQlpZiAocGVlcl9jYXAtPnByZWZPZmZDaGFuQmFuZHdpZHRoICYKKwkJCQkoMSA8PCBCV180MF9PRkZTRVRfQklUKSkgeworCQkJcGVlcl9jYXAtPm9wQ2xhc3NGb3JQcmVmT2ZmQ2hhbiA9CisJCQkJY2RzX3JlZ2RtX2dldF9vcGNsYXNzX2Zyb21fY2hhbm5lbCgKKwkJCQkJCXBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LAorCQkJCQkJcGVlcl9jYXAtPnByZWZPZmZDaGFuTnVtLAorCQkJCQkJQlc0MF9MT1dfUFJJTUFSWSk7CisJCQlpZiAoIXBlZXJfY2FwLT5vcENsYXNzRm9yUHJlZk9mZkNoYW4pIHsKKwkJCQlwZWVyX2NhcC0+b3BDbGFzc0ZvclByZWZPZmZDaGFuID0KKwkJCQkJY2RzX3JlZ2RtX2dldF9vcGNsYXNzX2Zyb21fY2hhbm5lbCgKKwkJCQkJCXBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LAorCQkJCQkJcGVlcl9jYXAtPnByZWZPZmZDaGFuTnVtLAorCQkJCQkJQlc0MF9ISUdIX1BSSU1BUlkpOworCQkJfQorCQl9IGVsc2UgaWYgKHBlZXJfY2FwLT5wcmVmT2ZmQ2hhbkJhbmR3aWR0aCAmCisJCQkJKDEgPDwgQldfMjBfT0ZGU0VUX0JJVCkpIHsKKwkJCXBlZXJfY2FwLT5vcENsYXNzRm9yUHJlZk9mZkNoYW4gPQorCQkJCWNkc19yZWdkbV9nZXRfb3BjbGFzc19mcm9tX2NoYW5uZWwoCisJCQkJCQlwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwKKwkJCQkJCXBlZXJfY2FwLT5wcmVmT2ZmQ2hhbk51bSwKKwkJCQkJCUJXMjApOworCQl9IGVsc2UgeworCQkJcGVlcl9jYXAtPm9wQ2xhc3NGb3JQcmVmT2ZmQ2hhbiA9CisJCQkJY2RzX3JlZ2RtX2dldF9vcGNsYXNzX2Zyb21fY2hhbm5lbCgKKwkJCQkJCXBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LAorCQkJCQkJcGVlcl9jYXAtPnByZWZPZmZDaGFuTnVtLAorCQkJCQkJQldBTEwpOworCQl9CisJfQorCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfVVBEQVRFX1RETFNfUEVFUl9TVEFURTsKKwljZHNfbWVzc2FnZS5yZXNlcnZlZCA9IDA7CisJY2RzX21lc3NhZ2UuYm9keXB0ciA9IHBUZGxzUGVlclN0YXRlUGFyYW1zOworCisJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQljZGZfbWVtX2ZyZWUocFRkbHNQZWVyU3RhdGVQYXJhbXMpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfc2VuZF90ZGxzX2NoYW5fc3dpdGNoX3JlcSgpIC0gc2VuZCB0ZGxzIGNoYW5uZWwgc3dpdGNoIHJlcXVlc3QKKyAqIEBoYWw6IFVNQUMgaGFuZGxlcgorICogQGNoX3N3aXRjaF9wYXJhbXM6IFBvaW50ZXIgdG8gdGhlIGNoYW4gc3dpdGNoIHBhcmFtZXRlciBzdHJ1Y3R1cmUKKyAqCisgKiBBUEkgdG8gc2V0IHRkbHMgY2hhbm5lbCBzd2l0Y2ggcGFyYW1ldGVycy4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzOyBhbm90aGVyIENERl9TVEFUVVNfKiBjb2RlIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTIHNtZV9zZW5kX3RkbHNfY2hhbl9zd2l0Y2hfcmVxKHRIYWxIYW5kbGUgaGFsLAorCXNtZV90ZGxzX2NoYW5fc3dpdGNoX3BhcmFtcyAqY2hfc3dpdGNoX3BhcmFtcykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgbWFjID0gUE1BQ19TVFJVQ1QoaGFsKTsKKwl0ZGxzX2NoYW5fc3dpdGNoX3BhcmFtcyAqY2hhbl9zd2l0Y2hfcGFyYW1zID0gTlVMTDsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCWNoYW5fc3dpdGNoX3BhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqY2hhbl9zd2l0Y2hfcGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gY2hhbl9zd2l0Y2hfcGFyYW1zKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoImZhaWwgdG8gYWxsb2MgbWVtIGZvciB0ZGxzIGNoYW4gc3dpdGNoIHBhcmFtIikpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWNkZl9tZW1femVybyhjaGFuX3N3aXRjaF9wYXJhbXMsIHNpemVvZigqY2hhbl9zd2l0Y2hfcGFyYW1zKSk7CisKKwlzd2l0Y2ggKGNoX3N3aXRjaF9wYXJhbXMtPnRkbHNfb2ZmX2NoX21vZGUpIHsKKwljYXNlIEVOQUJMRV9DSEFOU1dJVENIOgorCQljaGFuX3N3aXRjaF9wYXJhbXMtPnRkbHNfc3dfbW9kZSA9IFdNQV9URExTX0VOQUJMRV9PRkZDSEFOTkVMOworCQlicmVhazsKKworCWNhc2UgRElTQUJMRV9DSEFOU1dJVENIOgorCQljaGFuX3N3aXRjaF9wYXJhbXMtPnRkbHNfc3dfbW9kZSA9IFdNQV9URExTX0RJU0FCTEVfT0ZGQ0hBTk5FTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCUZMKCJpbnZhbGlkIG9mZiBjaGFubmVsIGNvbW1hbmQgKCVkKSIpLAorCQkJY2hfc3dpdGNoX3BhcmFtcy0+dGRsc19vZmZfY2hfbW9kZSk7CisJCWNkZl9tZW1fZnJlZShjaGFuX3N3aXRjaF9wYXJhbXMpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY2RmX21lbV9jb3B5KCZjaGFuX3N3aXRjaF9wYXJhbXMtPnBlZXJfbWFjX2FkZHIsCisJCSZjaF9zd2l0Y2hfcGFyYW1zLT5wZWVyX21hY19hZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwljaGFuX3N3aXRjaF9wYXJhbXMtPnZkZXZfaWQgPSBjaF9zd2l0Y2hfcGFyYW1zLT52ZGV2X2lkOworCWNoYW5fc3dpdGNoX3BhcmFtcy0+dGRsc19vZmZfY2ggPSBjaF9zd2l0Y2hfcGFyYW1zLT50ZGxzX29mZl9jaGFubmVsOworCWNoYW5fc3dpdGNoX3BhcmFtcy0+dGRsc19vZmZfY2hfYndfb2Zmc2V0ID0KKwkJY2hfc3dpdGNoX3BhcmFtcy0+dGRsc19vZmZfY2hfYndfb2Zmc2V0OworCWNoYW5fc3dpdGNoX3BhcmFtcy0+aXNfcmVzcG9uZGVyID0gY2hfc3dpdGNoX3BhcmFtcy0+aXNfcmVzcG9uZGVyOworCisJc3dpdGNoIChjaGFuX3N3aXRjaF9wYXJhbXMtPnRkbHNfb2ZmX2NoX2J3X29mZnNldCkgeworCWNhc2UgKDEgPDwgQldfMjBfT0ZGU0VUX0JJVCk6CisJCWNoYW5fc3dpdGNoX3BhcmFtcy0+b3Blcl9jbGFzcyA9CisJCWNkc19yZWdkbV9nZXRfb3BjbGFzc19mcm9tX2NoYW5uZWwoCisJCQkJbWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwKKwkJCQljaGFuX3N3aXRjaF9wYXJhbXMtPnRkbHNfb2ZmX2NoLAorCQkJCUJXMjApOworCQlicmVhazsKKwljYXNlICgxIDw8IEJXXzQwX09GRlNFVF9CSVQpOgorCQljaGFuX3N3aXRjaF9wYXJhbXMtPm9wZXJfY2xhc3MgPQorCQljZHNfcmVnZG1fZ2V0X29wY2xhc3NfZnJvbV9jaGFubmVsKAorCQkJCW1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnQsCisJCQkJY2hhbl9zd2l0Y2hfcGFyYW1zLT50ZGxzX29mZl9jaCwKKwkJCQlCVzQwX0xPV19QUklNQVJZKTsKKwkJaWYgKCFjaGFuX3N3aXRjaF9wYXJhbXMtPm9wZXJfY2xhc3MpIHsKKwkJCWNoYW5fc3dpdGNoX3BhcmFtcy0+b3Blcl9jbGFzcyA9CisJCQkJY2RzX3JlZ2RtX2dldF9vcGNsYXNzX2Zyb21fY2hhbm5lbCgKKwkJCQkJbWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwKKwkJCQkJY2hhbl9zd2l0Y2hfcGFyYW1zLT50ZGxzX29mZl9jaCwKKwkJCQkJQlc0MF9ISUdIX1BSSU1BUlkpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNoYW5fc3dpdGNoX3BhcmFtcy0+b3Blcl9jbGFzcyA9CisJCQljZHNfcmVnZG1fZ2V0X29wY2xhc3NfZnJvbV9jaGFubmVsKAorCQkJCW1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnQsCisJCQkJY2hhbl9zd2l0Y2hfcGFyYW1zLT50ZGxzX29mZl9jaCwKKwkJCQlCV0FMTCk7CisJCWJyZWFrOworCX0gLyogZW5kIHN3aXRjaCAqLworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJRkwoIkNvdW50cnkgQ29kZT0lcywgUmVxIG9mZnNldD0lZCwgU2VsZWN0ZWQgT3BlcmF0ZSBDbGFzcz0lZCIpLAorCQltYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LAorCQljaGFuX3N3aXRjaF9wYXJhbXMtPnRkbHNfb2ZmX2NoX2J3X29mZnNldCwKKwkJY2hhbl9zd2l0Y2hfcGFyYW1zLT5vcGVyX2NsYXNzKTsKKworCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfVERMU19TRVRfT0ZGQ0hBTl9NT0RFOworCWNkc19tZXNzYWdlLnJlc2VydmVkID0gMDsKKwljZHNfbWVzc2FnZS5ib2R5cHRyID0gY2hhbl9zd2l0Y2hfcGFyYW1zOworCisJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCUZMKCJNZXNzYWdlIFBvc3QgZmFpbGVkIHN0YXR1cz0lZCIpLAorCQkJY2RmX3N0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShjaGFuX3N3aXRjaF9wYXJhbXMpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9URExTICovCisKK0NERl9TVEFUVVMgc21lX2dldF9saW5rX3NwZWVkKHRIYWxIYW5kbGUgaEhhbCwgdFNpckxpbmtTcGVlZEluZm8gKmxzUmVxLAorCQkJICAgICAgdm9pZCAqcGxzQ29udGV4dCwKKwkJCSAgICAgIHZvaWQgKCpwQ2FsbGJhY2tmbikodFNpckxpbmtTcGVlZEluZm8gKmluZFBhcmFtLAorCQkJCQkJICB2b2lkICpwQ29udGV4dCkpCit7CisKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCWlmICgoTlVMTCA9PSBwQ2FsbGJhY2tmbikgJiYKKwkJICAgIChOVUxMID09IHBNYWMtPnNtZS5wTGlua1NwZWVkSW5kQ2IpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogSW5kaWNhdGlvbiBDYWxsIGJhY2sgZGlkIG5vdCByZWdpc3RlcmVkIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9IGVsc2UgaWYgKE5VTEwgIT0gcENhbGxiYWNrZm4pIHsKKwkJCXBNYWMtPnNtZS5wTGlua1NwZWVkQ2JDb250ZXh0ID0gcGxzQ29udGV4dDsKKwkJCXBNYWMtPnNtZS5wTGlua1NwZWVkSW5kQ2IgPSBwQ2FsbGJhY2tmbjsKKwkJfQorCQkvKiBzZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gbHNSZXE7CisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfR0VUX0xJTktfU1BFRUQ7CisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogUG9zdCBMaW5rIFNwZWVkIG1zZyBmYWlsIiwgX19mdW5jX18pOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqIFNNRSBBUEkgdG8gZW5hYmxlL2Rpc2FibGUgV0xBTiBkcml2ZXIgaW5pdGlhdGVkIFNTUgorICovCit2b2lkIHNtZV91cGRhdGVfZW5hYmxlX3Nzcih0SGFsSGFuZGxlIGhIYWwsIGJvb2wgZW5hYmxlU1NSKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSAgIlNTUiBsZXZlbCBpcyBjaGFuZ2VkICVkIiwgZW5hYmxlU1NSKTsKKwkJLyogbm90IHNlcmlhbGl6aW5nIHRoaXMgbWVzc3NhZ2UsIGFzIHRoaXMgaXMgb25seSBnb2luZworCQkgKiB0byBzZXQgYSB2YXJpYWJsZSBpbiBXTUEvV0RJCisJCSAqLworCQlXTUFfU2V0RW5hYmxlU1NSKGVuYWJsZVNTUik7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm47Cit9CisKK0NERl9TVEFUVVMgc21lX2NoZWNrX2NoX2luX2JhbmQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCBzdGFydF9jaCwKKwkJdWludDhfdCBjaF9jbnQpCit7CisJdWludDhfdCBpOworCWZvciAoaSA9IDA7IGkgPCBjaF9jbnQ7IGkrKykgeworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNzcl9pc192YWxpZF9jaGFubmVsKG1hY19jdHgsCisJCQkJCShzdGFydF9jaCArIGkqNCkpKQorCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCit2b2lkIHNtZV9zZXRfMTYwYndfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgY2hhbm5lbCwKKwkJY2hhbl9wYXJhbXNfdCAqY2hfcGFyYW1zKQoreworCXVpbnQ4X3Qgc3RhcnRfY2ggPSAwOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKGNoYW5uZWwgPj0gMzYgJiYgY2hhbm5lbCA8PSA2NCkgeworCQljaF9wYXJhbXMtPmNlbnRlcl9mcmVxX3NlZzAgPSA1MDsKKwkJc3RhcnRfY2ggPSAzNjsKKwl9IGVsc2UgaWYgKGNoYW5uZWwgPj0gMTAwICYmIGNoYW5uZWwgPD0gMTI4KSB7CisJCWNoX3BhcmFtcy0+Y2VudGVyX2ZyZXFfc2VnMCA9IDExNDsKKwkJc3RhcnRfY2ggPSAxMDA7CisJfSBlbHNlIHsKKwkJY2hfcGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzgwTUhaOworCX0KKworCWlmIChjaF9wYXJhbXMtPmNoX3dpZHRoID09IENIX1dJRFRIXzE2ME1IWikKKwkJc3RhdHVzID0gc21lX2NoZWNrX2NoX2luX2JhbmQobWFjX2N0eCwgc3RhcnRfY2gsIDgpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisJCWNoX3BhcmFtcy0+Y2hfd2lkdGggPSBDSF9XSURUSF84ME1IWjsKK30KKwordm9pZCBzbWVfc2V0XzgwYndfcGFyYW1zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgY2hhbm5lbCwKKwkJY2hhbl9wYXJhbXNfdCAqY2hfcGFyYW1zKQoreworCXVpbnQ4X3Qgc3RhcnRfY2ggPSAwOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKGNoYW5uZWwgPj0gMzYgJiYgY2hhbm5lbCA8PSA0OCkgeworCQljaF9wYXJhbXMtPmNlbnRlcl9mcmVxX3NlZzAgPSA0MjsKKwkJc3RhcnRfY2ggPSAzNjsKKwl9IGVsc2UgaWYgKGNoYW5uZWwgPj0gNTIgJiYgY2hhbm5lbCA8PSA2NCkgeworCQljaF9wYXJhbXMtPmNlbnRlcl9mcmVxX3NlZzAgPSA1ODsKKwkJc3RhcnRfY2ggPSA1MjsKKwl9IGVsc2UgaWYgKGNoYW5uZWwgPj0gMTAwICYmIGNoYW5uZWwgPD0gMTEyKSB7CisJCWNoX3BhcmFtcy0+Y2VudGVyX2ZyZXFfc2VnMCA9IDEwNjsKKwkJc3RhcnRfY2ggPSAxMDA7CisJfSBlbHNlIGlmIChjaGFubmVsID49IDExNiAmJiBjaGFubmVsIDw9IDEyOCkgeworCQljaF9wYXJhbXMtPmNlbnRlcl9mcmVxX3NlZzAgPSAxMjI7CisJCXN0YXJ0X2NoID0gMTE2OworCX0gZWxzZSBpZiAoY2hhbm5lbCA+PSAxMzIgJiYgY2hhbm5lbCA8PSAxNDQpIHsKKwkJY2hfcGFyYW1zLT5jZW50ZXJfZnJlcV9zZWcwID0gMTM4OworCQlzdGFydF9jaCA9IDEzMjsKKwl9IGVsc2UgaWYgKGNoYW5uZWwgPj0gMTQ5ICYmIGNoYW5uZWwgPD0gMTYxKSB7CisJCWNoX3BhcmFtcy0+Y2VudGVyX2ZyZXFfc2VnMCA9IDE1NTsKKwkJc3RhcnRfY2ggPSAxNDk7CisJfSBlbHNlIHsKKwkJY2hfcGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzQwTUhaOworCX0KKworCWlmIChjaF9wYXJhbXMtPmNoX3dpZHRoID09IENIX1dJRFRIXzgwTUhaKQorCQlzdGF0dXMgPSBzbWVfY2hlY2tfY2hfaW5fYmFuZChtYWNfY3R4LCBzdGFydF9jaCwgNCk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKwkJY2hfcGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzQwTUhaOworfQorCit2b2lkIHNtZV9zZXRfNDBid19wYXJhbXModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDhfdCBjaGFubmVsLAorCQljaGFuX3BhcmFtc190ICpjaF9wYXJhbXMsIHVpbnQ4X3QgaXNfMTFhY19tb2RlKQoreworCXVpbnQ4X3QgdG1wOworCXVpbnQ4X3QgY2VudGVyX2ZyZXEgPSAwOworCWJvb2wgdmFsaWRfNDBNaHpfY2ggPSB0cnVlOworCisJaWYgKGNoYW5uZWwgPT0gMTY1KSB7CisJCWNoX3BhcmFtcy0+Y2hfd2lkdGggPSBDSF9XSURUSF8yME1IWjsKKwkJY2hfcGFyYW1zLT5jZW50ZXJfZnJlcV9zZWcwID0gMDsKKwkJY2hfcGFyYW1zLT5zZWNfY2hfb2Zmc2V0ID0gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCQlyZXR1cm47CisJfQorCXRtcCA9IGNoYW5uZWwgJSAyOworCWlmICgoY2hhbm5lbCAtIHRtcCkgJSA4KSB7CisJCWNoX3BhcmFtcy0+c2VjX2NoX29mZnNldCA9IFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWTsKKwkJY2VudGVyX2ZyZXEgPSBjaGFubmVsICsgMjsKKwl9IGVsc2UgeworCQljaF9wYXJhbXMtPnNlY19jaF9vZmZzZXQgPSBQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOworCQljZW50ZXJfZnJlcSA9IGNoYW5uZWwgLSAyOworCX0KKwlpZiAoKCFpc18xMWFjX21vZGUpIHx8IChpc18xMWFjX21vZGUgJiYKKwkJCQkoY2hfcGFyYW1zLT5jaF93aWR0aCA9PSBDSF9XSURUSF80ME1IWikpKSB7CisJCWNoX3BhcmFtcy0+Y2hfd2lkdGggPSBDSF9XSURUSF80ME1IWjsKKwkJY2hfcGFyYW1zLT5jZW50ZXJfZnJlcV9zZWcwID0gY2VudGVyX2ZyZXE7CisJCXZhbGlkXzQwTWh6X2NoID0gY3NyX3JvYW1faXNfdmFsaWQ0MF9taHpfY2hhbm5lbChtYWNfY3R4LAorCQkJCWNoX3BhcmFtcy0+Y2VudGVyX2ZyZXFfc2VnMCk7CisJfQorCWlmICghdmFsaWRfNDBNaHpfY2gpIHsKKwkJY2hfcGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzIwTUhaOworCQljaF9wYXJhbXMtPmNlbnRlcl9mcmVxX3NlZzAgPSAwOworCQljaF9wYXJhbXMtPnNlY19jaF9vZmZzZXQgPSBQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQ7CisJfQorfQorCisvKgorICogU01FIEFQSSB0byBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgYm9uZGluZyBtb2RlCisgKi8KK0NERl9TVEFUVVMgc21lX3NldF9jaF9wYXJhbXModEhhbEhhbmRsZSBoSGFsLCBlQ3NyUGh5TW9kZSBlQ3NyUGh5TW9kZSwKKwkJdWludDhfdCBjaGFubmVsLCB1aW50OF90IGh0X3NlY19jaCwgY2hhbl9wYXJhbXNfdCAqY2hfcGFyYW1zKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlpbnQgaXNfMTFhY19tb2RlID0gQ1NSX0lTX1BIWV9NT0RFXzExYWMoZUNzclBoeU1vZGUpOworCisJaWYgKCFDU1JfSVNfUEhZX01PREVfMTFuKGVDc3JQaHlNb2RlKSB8fAorCQljaF9wYXJhbXMtPmNoX3dpZHRoID09IENIX1dJRFRIXzIwTUhaIHx8CisJCUNERl9TVEFUVVNfU1VDQ0VTUyAhPSBjc3JfaXNfdmFsaWRfY2hhbm5lbChtYWNfY3R4LCBjaGFubmVsKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSIlczogSW52YWxpZCBDaGFubmVsL3BoeW1vZGUgY29uZmlnOiBDQiBNb2RlIGRpc2FibGVkIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQljaF9wYXJhbXMtPmNoX3dpZHRoID0gQ0hfV0lEVEhfMjBNSFo7CisJCWNoX3BhcmFtcy0+c2VjX2NoX29mZnNldCA9IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKwkJaWYgKGNoYW5uZWwgPD0gMTQpCisJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmNoYW5uZWxCb25kaW5nTW9kZTI0R0h6ID0KKwkJCQkJUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCQllbHNlCisJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmNoYW5uZWxCb25kaW5nTW9kZTVHSHogPQorCQkJCQlQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQ7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJc21zX2xvZyhtYWNfY3R4LCBMT0dXLCAiJXM6IGNoYW5uZWwgLSAlZCwgdmh0IGNoYW5uZWwgd2lkdGggLSAlZCIsCisJCQkJX19mdW5jX18sIGNoYW5uZWwsIGNoX3BhcmFtcy0+Y2hfd2lkdGgpOworCisJaWYgKENEU19JU19DSEFOTkVMXzVHSFooY2hhbm5lbCkpIHsKKwkJaWYgKGNoX3BhcmFtcy0+Y2hfd2lkdGggPT0gQ0hfV0lEVEhfMTYwTUhaKQorCQkJc21lX3NldF8xNjBid19wYXJhbXMobWFjX2N0eCwgY2hhbm5lbCwgY2hfcGFyYW1zKTsKKwkJaWYgKChjaF9wYXJhbXMtPmNoX3dpZHRoID09IENIX1dJRFRIXzgwTUhaKSB8fAorCQkgICAoY2hfcGFyYW1zLT5jaF93aWR0aCA9PSBDSF9XSURUSF84MFA4ME1IWikpCisJCQlzbWVfc2V0XzgwYndfcGFyYW1zKG1hY19jdHgsIGNoYW5uZWwsIGNoX3BhcmFtcyk7CisKKwkJc21lX3NldF80MGJ3X3BhcmFtcyhtYWNfY3R4LCBjaGFubmVsLAorCQkJCQljaF9wYXJhbXMsIGlzXzExYWNfbW9kZSk7CisKKwkJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGU1R0h6ID0KKwkJCWNoX3BhcmFtcy0+c2VjX2NoX29mZnNldDsKKwl9IGVsc2UgaWYgKENEU19JU19DSEFOTkVMXzI0R0haKGNoYW5uZWwpKSB7CisJCWlmIChjaGFubmVsID49IDEgJiYgY2hhbm5lbCA8IDUpIHsKKwkJCWNoX3BhcmFtcy0+Y2hfd2lkdGggPSBDSF9XSURUSF80ME1IWjsKKwkJCWNoX3BhcmFtcy0+c2VjX2NoX29mZnNldCA9CisJCQkJUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZOworCQkJY2hfcGFyYW1zLT5jZW50ZXJfZnJlcV9zZWcwID0gY2hhbm5lbCArIDI7CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA+PSA1ICYmIGNoYW5uZWwgPD0gOSkgeworCQkJY2hfcGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzQwTUhaOworCQkJaWYgKDAgIT0gaHRfc2VjX2NoKSB7CisJCQkJaWYgKGh0X3NlY19jaCA+IGNoYW5uZWwpIHsKKwkJCQkJY2hfcGFyYW1zLT5zZWNfY2hfb2Zmc2V0ID0KKwkJCQkJCVBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWTsKKwkJCQkJY2hfcGFyYW1zLT5jZW50ZXJfZnJlcV9zZWcwID0KKwkJCQkJCWNoYW5uZWwgKyAyOworCQkJCX0gZWxzZSB7CisJCQkJCWNoX3BhcmFtcy0+c2VjX2NoX29mZnNldCA9CisJCQkJCQlQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOworCQkJCQljaF9wYXJhbXMtPmNlbnRlcl9mcmVxX3NlZzAgPQorCQkJCQkJY2hhbm5lbCAtIDI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBpbiBjYXNlIGh0X3NlY19jaCBpcyBub3Qgc2V0IGJ5IEFDUyBvcgorCQkJCSAqIGNhbGxpbmcgZnVuY3Rpb24sIHNldCB0aGUgc2Vjb25kYXJ5IGNoYW5uZWwKKwkJCQkgKiBvZmZzZXQgdmFsdWUgdG8gbG93ZXIgY2hhbm5lbAorCQkJCSAqLworCQkJCWNoX3BhcmFtcy0+c2VjX2NoX29mZnNldCA9CisJCQkJCVBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlk7CisJCQkJY2hfcGFyYW1zLT5jZW50ZXJfZnJlcV9zZWcwID0gY2hhbm5lbCAtIDI7CisJCQl9CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA+IDkgJiYgY2hhbm5lbCA8PSAxMykgeworCQkJY2hfcGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzQwTUhaOworCQkJY2hfcGFyYW1zLT5zZWNfY2hfb2Zmc2V0ID0KKwkJCQlQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOworCQkJY2hfcGFyYW1zLT5jZW50ZXJfZnJlcV9zZWcwID0gY2hhbm5lbCAtIDI7CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSAxNCkgeworCQkJY2hfcGFyYW1zLT5jaF93aWR0aCA9IENIX1dJRFRIXzIwTUhaOworCQkJY2hfcGFyYW1zLT5zZWNfY2hfb2Zmc2V0ID0KKwkJCQlQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQ7CisJCQljaF9wYXJhbXMtPmNlbnRlcl9mcmVxX3NlZzAgPSAwOworCQl9CisJCW1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPQorCQkJY2hfcGFyYW1zLT5zZWNfY2hfb2Zmc2V0OworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKmNvbnZlcnQgdGhlIGluaSB2YWx1ZSB0byB0aGUgRU5VTSB1c2VkIGluIGNzciBhbmQgTUFDIGZvciBDQiBzdGF0ZSovCitlUGh5Q2hhbkJvbmRTdGF0ZSBzbWVfZ2V0X2NiX3BoeV9zdGF0ZV9mcm9tX2NiX2luaV92YWx1ZSh1aW50MzJfdCBjYl9pbmlfdmFsdWUpCit7CisJcmV0dXJuIGNzcl9jb252ZXJ0X2NiX2luaV92YWx1ZV90b19waHlfY2Jfc3RhdGUoY2JfaW5pX3ZhbHVlKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgc21lX3NldF9jdXJyX2RldmljZV9tb2RlKCkgLSBTZXRzIHRoZSBjdXJyZW50IG9wZXJhdGluZyBkZXZpY2UgbW9kZS4KKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxwYXJhbSBjdXJyRGV2aWNlTW9kZSAtIEN1cnJlbnQgb3BlcmF0aW5nIGRldmljZSBtb2RlLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHNtZV9zZXRfY3Vycl9kZXZpY2VfbW9kZSh0SGFsSGFuZGxlIGhIYWwsIHRDREZfQ09OX01PREUgY3VyckRldmljZU1vZGUpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXBNYWMtPnNtZS5jdXJyRGV2aWNlTW9kZSA9IGN1cnJEZXZpY2VNb2RlOworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9oYW5kb2ZmX3JlcXVlc3QoKSAtIGEgd3JhcHBlciBmdW5jdGlvbiB0byBSZXF1ZXN0IGEgaGFuZG9mZgorICAgZnJvbSBDU1IuCisgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbAorICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuCisgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgXHBhcmFtIHBIYW5kb2ZmSW5mbyAtIGluZm8gcHJvdmlkZWQgYnkgSEREIHdpdGggdGhlIGhhbmRvZmYgcmVxdWVzdCAobmFtZWx5OgorICAgQlNTSUQsIGNoYW5uZWwgZXRjLikKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIHBhc3NlZCB0aGUgcmVxdWVzdCB0byBDU1Igc3VjY2Vzc2Z1bGx5LgorCSAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QuCisgICBcc2EKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUyBzbWVfaGFuZG9mZl9yZXF1ZXN0KHRIYWxIYW5kbGUgaEhhbCwKKwkJCSAgICAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCSAgICAgICB0Q3NySGFuZG9mZlJlcXVlc3QgKnBIYW5kb2ZmSW5mbykKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzOiBpbnZva2VkIiwgX19mdW5jX18pOworCQlzdGF0dXMgPSBjc3JfaGFuZG9mZl9yZXF1ZXN0KHBNYWMsIHNlc3Npb25JZCwgcEhhbmRvZmZJbmZvKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIElQQV9PRkZMT0FECisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBzbWVfaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGUKKyAgIFxicmllZiAgQVBJIHRvIGVuYWJsZS9kaXNhYmxlIElQQSBvZmZsb2FkCisgICBccGFyYW0gIGhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgIFxwYXJhbSAgc2Vzc2lvbl9pZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgXHBhcmFtICByZXF1ZXN0IC0gIFBvaW50ZXIgdG8gdGhlIG9mZmxvYWQgcmVxdWVzdC4KKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2lwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlKHRIYWxIYW5kbGUgaGFsLCB1aW50OF90IHNlc3Npb25faWQsCisJCXN0cnVjdCBzaXJfaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGUgKnJlcXVlc3QpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwlzdHJ1Y3Qgc2lyX2lwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlICpyZXF1ZXN0X2J1ZjsKKwljZHNfbXNnX3QgbXNnOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJcmVxdWVzdF9idWYgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnJlcXVlc3RfYnVmKSk7CisJCWlmIChOVUxMID09IHJlcXVlc3RfYnVmKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJRkwoIk5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgXAorCQkJCQlJUEFfT0ZGTE9BRF9FTkFCTEVfRElTQUJMRSIpKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCisJCXJlcXVlc3RfYnVmLT5vZmZsb2FkX3R5cGUgPSByZXF1ZXN0LT5vZmZsb2FkX3R5cGU7CisJCXJlcXVlc3RfYnVmLT52ZGV2X2lkID0gcmVxdWVzdC0+dmRldl9pZDsKKwkJcmVxdWVzdF9idWYtPmVuYWJsZSA9IHJlcXVlc3QtPmVuYWJsZTsKKworCQltc2cudHlwZSAgICAgPSBXTUFfSVBBX09GRkxPQURfRU5BQkxFX0RJU0FCTEU7CisJCW1zZy5yZXNlcnZlZCA9IDA7CisJCW1zZy5ib2R5cHRyICA9IHJlcXVlc3RfYnVmOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUygKKwkJCQljZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZtc2cpKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCUZMKCJOb3QgYWJsZSB0byBwb3N0IFdNQV9JUEFfT0ZGTE9BRF9cCisJCQkJCUVOQUJMRV9ESVNBQkxFIG1lc3NhZ2UgdG8gV01BIikpOworCQkJY2RmX21lbV9mcmVlKHJlcXVlc3RfYnVmKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBJUEFfT0ZGTE9BRCAqLworCisvKgorICogU01FIEFQSSB0byBjaGVjayBpZiB0aGVyZSBpcyBhbnkgaW5mcmEgc3RhdGlvbiBvcgorICogUDJQIGNsaWVudCBpcyBjb25uZWN0ZWQKKyAqLworQ0RGX1NUQVRVUyBzbWVfaXNfc3RhX3AycF9jbGllbnRfY29ubmVjdGVkKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJaWYgKGNzcl9pc19pbmZyYV9jb25uZWN0ZWQocE1hYykpIHsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xQSEIKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfbHBoYl9jb25maWdfcmVxCisgICAgXEFQSSB0byBtYWtlIGNvbmZpZ3VyYXRpb24gTFBIQiB3aXRoaW4gRlcuCisgICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuCisgICAgXHBhcmFtIGxwaGRSZXEgLSBMUEhCIHJlcXVlc3QgYXJndW1lbnQgYnkgY2xpZW50CisgICAgXHBhcmFtIHBDYWxsYmFja2ZuIC0gTFBIQiB0aW1lb3V0IG5vdGlmaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisgICBcLSByZXR1cm4gQ29uZmlndXJhdGlvbiBtZXNzYWdlIHBvc3Rpbmcgc3RhdHVzLCBTVUNDRVNTIG9yIEZhaWwKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2xwaGJfY29uZmlnX3JlcQorCSh0SGFsSGFuZGxlIGhIYWwsCisJdFNpckxQSEJSZXEgKmxwaGRSZXEsCisJdm9pZCAoKnBDYWxsYmFja2ZuKSh2b2lkICpwSGRkQ3R4LCB0U2lyTFBIQkluZCAqaW5kUGFyYW0pCisJKSB7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlpZiAoKExQSEJfU0VUX0VOX1BBUkFNU19JTkRJRCA9PSBscGhkUmVxLT5jbWQpICYmCisJCSAgICAoTlVMTCA9PSBwQ2FsbGJhY2tmbikgJiYgKE5VTEwgPT0gcE1hYy0+c21lLnBMcGhiSW5kQ2IpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogSW5kaWNhdGlvbiBDYWxsIGJhY2sgZGlkIG5vdCByZWdpc3RlcmVkIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9IGVsc2UgaWYgKE5VTEwgIT0gcENhbGxiYWNrZm4pIHsKKwkJCXBNYWMtPnNtZS5wTHBoYkluZENiID0gcENhbGxiYWNrZm47CisJCX0KKworCQkvKiBzZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gbHBoZFJlcTsKKwkJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9MUEhCX0NPTkZfUkVROworCQljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IFBvc3QgQ29uZmlnIExQSEIgTVNHIGZhaWwiLCBfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9MUEhCICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX2VuYWJsZV9kaXNhYmxlX3NwbGl0X3NjYW4oKSAtIGEgd3JhcHBlciBmdW5jdGlvbiB0byBzZXQgdGhlIHNwbGl0CisJCQkJCSAgICBzY2FuIHBhcmFtZXRlci4KKyAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4KKyAgIFxyZXR1cm4gTk9ORS4KKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfZW5hYmxlX2Rpc2FibGVfc3BsaXRfc2Nhbih0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgbk51bVN0YUNoYW4sCisJCQkJICAgdWludDhfdCBuTnVtUDJQQ2hhbikKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5OdW1TdGFDaGFuQ29tYmluZWRDb25jID0gbk51bVN0YUNoYW47CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uTnVtUDJQQ2hhbkNvbWJpbmVkQ29uYyA9IG5OdW1QMlBDaGFuOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFNDQU4gbk51bVN0YUNoYW5Db21iaW5lZENvbmMgOiAlZCwiCisJCSAgIm5OdW1QMlBDaGFuQ29tYmluZWRDb25jIDogJWQgIiwKKwkJICBfX2Z1bmNfXywgbk51bVN0YUNoYW4sIG5OdW1QMlBDaGFuKTsKKworCXJldHVybjsKKworfQorCisvKioKKyAqIHNtZV9hZGRfcGVyaW9kaWNfdHhfcHRybigpIC0gQWRkIFBlcmlvZGljIFRYIFBhdHRlcm4KKyAqIEBoYWw6IGdsb2JhbCBoYWwgaGFuZGxlCisgKiBAYWRkUGVyaW9kaWNUeFB0cm5QYXJhbXM6IHJlcXVlc3QgbWVzc2FnZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitDREZfU1RBVFVTCitzbWVfYWRkX3BlcmlvZGljX3R4X3B0cm4odEhhbEhhbmRsZSBoYWwsCisJCQkgc3RydWN0IHNTaXJBZGRQZXJpb2RpY1R4UHRybiAqYWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgICA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBtYWMgID0gUE1BQ19TVFJVQ1QoaGFsKTsKKwlzdHJ1Y3Qgc1NpckFkZFBlcmlvZGljVHhQdHJuICpyZXFfbXNnOworCWNkc19tc2dfdCBtc2c7CisKKwlzbXNfbG9nKG1hYywgTE9HMSwgRkwoImVudGVyIikpOworCisJcmVxX21zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcmVxX21zZykpOworCWlmICghcmVxX21zZykgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwkqcmVxX21zZyA9ICphZGRQZXJpb2RpY1R4UHRyblBhcmFtczsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJzbWVfYWNxdWlyZV9nbG9iYWxfbG9jayBmYWlsZWQhKHN0YXR1cz0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBTZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCW1zZy5ib2R5cHRyID0gcmVxX21zZzsKKwltc2cudHlwZSAgICA9IFdNQV9BRERfUEVSSU9ESUNfVFhfUFRSTl9JTkQ7CisJc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJjZHNfbXFfcG9zdF9tZXNzYWdlIGZhaWxlZCEoZXJyPSVkKSIpLAorCQkJc3RhdHVzKTsKKwkJY2RmX21lbV9mcmVlKHJlcV9tc2cpOworCX0KKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX2RlbF9wZXJpb2RpY190eF9wdHJuKCkgLSBEZWxldGUgUGVyaW9kaWMgVFggUGF0dGVybgorICogQGhhbDogZ2xvYmFsIGhhbCBoYW5kbGUKKyAqIEBkZWxQZXJpb2RpY1R4UHRyblBhcmFtczogcmVxdWVzdCBtZXNzYWdlCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMKK3NtZV9kZWxfcGVyaW9kaWNfdHhfcHRybih0SGFsSGFuZGxlIGhhbCwKKwkJCSBzdHJ1Y3Qgc1NpckRlbFBlcmlvZGljVHhQdHJuICpkZWxQZXJpb2RpY1R4UHRyblBhcmFtcykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyAgICA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBtYWMgICA9IFBNQUNfU1RSVUNUKGhhbCk7CisJc3RydWN0IHNTaXJEZWxQZXJpb2RpY1R4UHRybiAqcmVxX21zZzsKKwljZHNfbXNnX3QgbXNnOworCisJc21zX2xvZyhtYWMsIExPRzEsIEZMKCJlbnRlciIpKTsKKworCXJlcV9tc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnJlcV9tc2cpKTsKKwlpZiAoIXJlcV9tc2cpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJKnJlcV9tc2cgPSAqZGVsUGVyaW9kaWNUeFB0cm5QYXJhbXM7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsCisJCQlGTCgic21lX2FjcXVpcmVfZ2xvYmFsX2xvY2sgZmFpbGVkIShzdGF0dXM9JWQpIiksCisJCQlzdGF0dXMpOworCQljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogU2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwltc2cuYm9keXB0ciA9IHJlcV9tc2c7CisJbXNnLnR5cGUgICAgPSBXTUFfREVMX1BFUklPRElDX1RYX1BUUk5fSU5EOworCXN0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsCisJCQlGTCgiY2RzX21xX3Bvc3RfbWVzc2FnZSBmYWlsZWQhKGVycj0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKKwl9CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHNtZV9nZXRfY29tbWFuZF9xX3N0YXR1cyh0SGFsSGFuZGxlIGhIYWwpCit7CisJdFNtZUNtZCAqcFRlbXBDbWQgPSBOVUxMOworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogcE1hYyBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKwlpZiAocEVudHJ5KSB7CisJCXBUZW1wQ21kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCX0KKwlzbXNfbG9nKHBNYWMsIExPR0UsICJDdXJyZW50bHkgc21lQ21kQWN0aXZlTGlzdCBoYXMgY29tbWFuZCAoMHglWCkiLAorCQkocFRlbXBDbWQpID8gcFRlbXBDbWQtPmNvbW1hbmQgOiBlU21lTm9Db21tYW5kKTsKKwlpZiAocFRlbXBDbWQpIHsKKwkJaWYgKGVTbWVDc3JDb21tYW5kTWFzayAmIHBUZW1wQ21kLT5jb21tYW5kKSB7CisJCQkvKiBDU1IgY29tbWFuZCBpcyBzdHVjay4gU2VlIHdoYXQgdGhlIHJlYXNvbiBjb2RlIGlzIGZvciB0aGF0IGNvbW1hbmQgKi8KKwkJCWR1bXBfY3NyX2NvbW1hbmRfaW5mbyhwTWFjLCBwVGVtcENtZCk7CisJCX0KKwl9IC8qIGlmKHBUZW1wQ21kKSAqLworCisJc21zX2xvZyhwTWFjLCBMT0dFLCAiQ3VycmVudGx5IHNtZUNtZFBlbmRpbmdMaXN0IGhhcyAlZCBjb21tYW5kcyIsCisJCWNzcl9sbF9jb3VudCgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0KSk7CisKKwlzbXNfbG9nKHBNYWMsIExPR0UsICJDdXJyZW50bHkgcm9hbUNtZFBlbmRpbmdMaXN0IGhhcyAlZCBjb21tYW5kcyIsCisJCWNzcl9sbF9jb3VudCgmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QpKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBzbWVfc2V0X2RvdDExcF9jb25maWcoKSAtIEFQSSB0byBzZXQgdGhlIDgwMi4xMXAgY29uZmlnCisgKiBAaEhhbDogICAgICAgICAgIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3BlbgorICogQGVuYWJsZV9kb3QxMXA6ICA4MDIuMTFwIGNvbmZpZyBwYXJhbQorICovCit2b2lkIHNtZV9zZXRfZG90MTFwX2NvbmZpZyh0SGFsSGFuZGxlIGhIYWwsIGJvb2wgZW5hYmxlX2RvdDExcCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJcE1hYy0+ZW5hYmxlX2RvdDExcCA9IGVuYWJsZV9kb3QxMXA7Cit9CisKKy8qKgorICogY29weV9zaXJfb2NiX2NvbmZpZygpIC0gUGVyZm9ybXMgZGVlcCBjb3B5IG9mIGFuIE9DQiBjb25maWd1cmF0aW9uCisgKiBAc3JjOiB0aGUgc291cmNlIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSZXR1cm46IHBvaW50ZXIgdG8gdGhlIGNvcGllZCBPQ0IgY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgc3RydWN0IHNpcl9vY2JfY29uZmlnICpzbWVfY29weV9zaXJfb2NiX2NvbmZpZygKKwlzdHJ1Y3Qgc2lyX29jYl9jb25maWcgKnNyYykKK3sKKwlzdHJ1Y3Qgc2lyX29jYl9jb25maWcgKmRzdDsKKwl1aW50MzJfdCBsZW5ndGg7CisJdm9pZCAqY3Vyc29yOworCisJbGVuZ3RoID0gc2l6ZW9mKCpzcmMpICsKKwkJc3JjLT5jaGFubmVsX2NvdW50ICogc2l6ZW9mKCpzcmMtPmNoYW5uZWxzKSArCisJCXNyYy0+c2NoZWR1bGVfc2l6ZSAqIHNpemVvZigqc3JjLT5zY2hlZHVsZSkgKworCQlzcmMtPmRjY19uZGxfY2hhbl9saXN0X2xlbiArCisJCXNyYy0+ZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdF9sZW47CisKKwlkc3QgPSBjZGZfbWVtX21hbGxvYyhsZW5ndGgpOworCWlmICghZHN0KQorCQlyZXR1cm4gTlVMTDsKKworCSpkc3QgPSAqc3JjOworCisJY3Vyc29yID0gZHN0OworCWN1cnNvciArPSBzaXplb2YoKmRzdCk7CisJZHN0LT5jaGFubmVscyA9IGN1cnNvcjsKKwljdXJzb3IgKz0gc3JjLT5jaGFubmVsX2NvdW50ICogc2l6ZW9mKCpzcmMtPmNoYW5uZWxzKTsKKwljZGZfbWVtX2NvcHkoZHN0LT5jaGFubmVscywgc3JjLT5jaGFubmVscywKKwkJICAgICBzcmMtPmNoYW5uZWxfY291bnQgKiBzaXplb2YoKnNyYy0+Y2hhbm5lbHMpKTsKKwlkc3QtPnNjaGVkdWxlID0gY3Vyc29yOworCWN1cnNvciArPSBzcmMtPnNjaGVkdWxlX3NpemUgKiBzaXplb2YoKnNyYy0+c2NoZWR1bGUpOworCWNkZl9tZW1fY29weShkc3QtPnNjaGVkdWxlLCBzcmMtPnNjaGVkdWxlLAorCQkgICAgIHNyYy0+c2NoZWR1bGVfc2l6ZSAqIHNpemVvZigqc3JjLT5zY2hlZHVsZSkpOworCWRzdC0+ZGNjX25kbF9jaGFuX2xpc3QgPSBjdXJzb3I7CisJY3Vyc29yICs9IHNyYy0+ZGNjX25kbF9jaGFuX2xpc3RfbGVuOworCWNkZl9tZW1fY29weShkc3QtPmRjY19uZGxfY2hhbl9saXN0LCBzcmMtPmRjY19uZGxfY2hhbl9saXN0LAorCQkgICAgIHNyYy0+ZGNjX25kbF9jaGFuX2xpc3RfbGVuKTsKKwlkc3QtPmRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3QgPSBjdXJzb3I7CisJY3Vyc29yICs9IHNyYy0+ZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdF9sZW47CisJY2RmX21lbV9jb3B5KGRzdC0+ZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdCwKKwkJICAgICBzcmMtPmRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3QsCisJCSAgICAgc3JjLT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbik7CisJcmV0dXJuIGRzdDsKK30KKworLyoqCisgKiBzbWVfb2NiX3NldF9jb25maWcoKSAtIFNldCB0aGUgT0NCIGNvbmZpZ3VyYXRpb24KKyAqIEBoSGFsOiByZWZlcmVuY2UgdG8gdGhlIEhBTAorICogQGNvbnRleHQ6IHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsCisgKiBAY2FsbGJhY2s6IHRoZSBjYWxsYmFjayB0byBoZGQKKyAqIEBjb25maWc6IHRoZSBPQ0IgY29uZmlndXJhdGlvbgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV9GQUlMVVJFIG9uIGZhaWx1cmUKKyAqLworQ0RGX1NUQVRVUyBzbWVfb2NiX3NldF9jb25maWcodEhhbEhhbmRsZSBoSGFsLCB2b2lkICpjb250ZXh0LAorCQkJICAgICAgb2NiX2NhbGxiYWNrIGNhbGxiYWNrLAorCQkJICAgICAgc3RydWN0IHNpcl9vY2JfY29uZmlnICpjb25maWcpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJY2RzX21zZ190IG1zZyA9IHswfTsKKwlzdHJ1Y3Qgc2lyX29jYl9jb25maWcgKm1zZ19ib2R5OworCisJLyogTG9jayB0aGUgU01FIHN0cnVjdHVyZSAqLworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZXJlIGlzIGEgcGVuZGluZyByZXF1ZXN0IGFuZCByZXR1cm4gYW4gZXJyb3IgaWYgb25lCisJICogZXhpc3RzCisJICovCisJaWYgKHBNYWMtPnNtZS5vY2Jfc2V0X2NvbmZpZ19jYWxsYmFjaykgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfQlVTWTsKKwkJZ290byBlbmQ7CisJfQorCisJbXNnX2JvZHkgPSBzbWVfY29weV9zaXJfb2NiX2NvbmZpZyhjb25maWcpOworCisJaWYgKCFtc2dfYm9keSkgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCW1zZy50eXBlID0gV01BX09DQl9TRVRfQ09ORklHX0NNRDsKKwltc2cuYm9keXB0ciA9IG1zZ19ib2R5OworCisJLyogU2V0IHRoZSByZXF1ZXN0IGNhbGxiYWNrIGFuZCBjb250ZXh0ICovCisJcE1hYy0+c21lLm9jYl9zZXRfY29uZmlnX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJcE1hYy0+c21lLm9jYl9zZXRfY29uZmlnX2NvbnRleHQgPSBjb250ZXh0OworCisJc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICAgRkwoIkVycm9yIHBvc3RpbmcgbWVzc2FnZSB0byBXREE6ICVkIiksIHN0YXR1cyk7CisJCXBNYWMtPnNtZS5vY2Jfc2V0X2NvbmZpZ19jYWxsYmFjayA9IGNhbGxiYWNrOworCQlwTWFjLT5zbWUub2NiX3NldF9jb25maWdfY29udGV4dCA9IGNvbnRleHQ7CisJCWNkZl9tZW1fZnJlZShtc2dfYm9keSk7CisJCWdvdG8gZW5kOworCX0KKworZW5kOgorCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfb2NiX3NldF91dGNfdGltZSgpIC0gU2V0IHRoZSBPQ0IgVVRDIHRpbWUKKyAqIEBoSGFsOiByZWZlcmVuY2UgdG8gdGhlIEhBTAorICogQHV0YzogdGhlIFVUQyB0aW1lIHN0cnVjdAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV9GQUlMVVJFIG9uIGZhaWx1cmUKKyAqLworQ0RGX1NUQVRVUyBzbWVfb2NiX3NldF91dGNfdGltZSh0SGFsSGFuZGxlIGhIYWwsIHN0cnVjdCBzaXJfb2NiX3V0YyAqdXRjKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWNkc19tc2dfdCBtc2cgPSB7MH07CisJc3RydWN0IHNpcl9vY2JfdXRjICpzbWVfdXRjOworCisJLyogTG9jayB0aGUgU01FIHN0cnVjdHVyZSAqLworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlzbWVfdXRjID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpzbWVfdXRjKSk7CisJaWYgKCFzbWVfdXRjKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiTWFsbG9jIGZhaWxlZCIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQlnb3RvIGVuZDsKKwl9CisJKnNtZV91dGMgPSAqdXRjOworCisJbXNnLnR5cGUgPSBXTUFfT0NCX1NFVF9VVENfVElNRV9DTUQ7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHNtZV91dGM7CisJc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIk5vdCBhYmxlIHRvIHBvc3QgbWVzc2FnZSB0byBXREEiKSk7CisJCWNkZl9tZW1fZnJlZSh1dGMpOworCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX29jYl9zdGFydF90aW1pbmdfYWR2ZXJ0KCkgLSBTdGFydCBzZW5kaW5nIHRpbWluZyBhZHZlcnQgZnJhbWVzCisgKiBAaEhhbDogcmVmZXJlbmNlIHRvIHRoZSBIQUwKKyAqIEB0aW1pbmdfYWR2ZXJ0OiB0aGUgdGltaW5nIGFkdmVydGlzZW1lbnQgc3RydWN0CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgb24gZmFpbHVyZQorICovCitDREZfU1RBVFVTIHNtZV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydCh0SGFsSGFuZGxlIGhIYWwsCisJc3RydWN0IHNpcl9vY2JfdGltaW5nX2FkdmVydCAqdGltaW5nX2FkdmVydCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgbXNnID0gezB9OworCXZvaWQgKmJ1ZjsKKwlzdHJ1Y3Qgc2lyX29jYl90aW1pbmdfYWR2ZXJ0ICpzbWVfdGltaW5nX2FkdmVydDsKKworCS8qIExvY2sgdGhlIFNNRSBzdHJ1Y3R1cmUgKi8KKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCisJYnVmID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpzbWVfdGltaW5nX2FkdmVydCkgKworCQkJICAgICB0aW1pbmdfYWR2ZXJ0LT50ZW1wbGF0ZV9sZW5ndGgpOworCWlmICghYnVmKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdGFydCBUQSIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQlnb3RvIGVuZDsKKwl9CisKKwlzbWVfdGltaW5nX2FkdmVydCA9IChzdHJ1Y3Qgc2lyX29jYl90aW1pbmdfYWR2ZXJ0ICopYnVmOworCSpzbWVfdGltaW5nX2FkdmVydCA9ICp0aW1pbmdfYWR2ZXJ0OworCXNtZV90aW1pbmdfYWR2ZXJ0LT50ZW1wbGF0ZV92YWx1ZSA9IGJ1ZiArIHNpemVvZigqc21lX3RpbWluZ19hZHZlcnQpOworCWNkZl9tZW1fY29weShzbWVfdGltaW5nX2FkdmVydC0+dGVtcGxhdGVfdmFsdWUsCisJdGltaW5nX2FkdmVydC0+dGVtcGxhdGVfdmFsdWUsIHRpbWluZ19hZHZlcnQtPnRlbXBsYXRlX2xlbmd0aCk7CisKKwltc2cudHlwZSA9IFdNQV9PQ0JfU1RBUlRfVElNSU5HX0FEVkVSVF9DTUQ7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IGJ1ZjsKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiTm90IGFibGUgdG8gcG9zdCBtc2cgdG8gV0RBIikpOworCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX29jYl9zdG9wX3RpbWluZ19hZHZlcnQoKSAtIFN0b3Agc2VuZGluZyB0aW1pbmcgYWR2ZXJ0IGZyYW1lcyBvbiBhIGNoYW5uZWwKKyAqIEBoSGFsOiByZWZlcmVuY2UgdG8gdGhlIEhBTAorICogQHRpbWluZ19hZHZlcnQ6IHRoZSB0aW1pbmcgYWR2ZXJ0aXNlbWVudCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBDREZfU1RBVFVTX0VfRkFJTFVSRSBvbiBmYWlsdXJlCisgKi8KK0NERl9TVEFUVVMgc21lX29jYl9zdG9wX3RpbWluZ19hZHZlcnQodEhhbEhhbmRsZSBoSGFsLAorCXN0cnVjdCBzaXJfb2NiX3RpbWluZ19hZHZlcnQgKnRpbWluZ19hZHZlcnQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJY2RzX21zZ190IG1zZyA9IHswfTsKKwlzdHJ1Y3Qgc2lyX29jYl90aW1pbmdfYWR2ZXJ0ICpzbWVfdGltaW5nX2FkdmVydDsKKworCS8qIExvY2sgdGhlIFNNRSBzdHJ1Y3R1cmUgKi8KKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCisJc21lX3RpbWluZ19hZHZlcnQgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnRpbWluZ19hZHZlcnQpKTsKKwlpZiAoIXNtZV90aW1pbmdfYWR2ZXJ0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdG9wIFRBIikpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gZW5kOworCX0KKwkqc21lX3RpbWluZ19hZHZlcnQgPSAqdGltaW5nX2FkdmVydDsKKworCW1zZy50eXBlID0gV01BX09DQl9TVE9QX1RJTUlOR19BRFZFUlRfQ01EOworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHlwdHIgPSBzbWVfdGltaW5nX2FkdmVydDsKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiTm90IGFibGUgdG8gcG9zdCBtc2cgdG8gV0RBIikpOworCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX29jYl9nZXRfdHNmX3RpbWVyKCkgLSBHZXQgdGhlIFRTRiB0aW1lciB2YWx1ZQorICogQGhIYWw6IHJlZmVyZW5jZSB0byB0aGUgSEFMCisgKiBAY29udGV4dDogdGhlIGNvbnRleHQgb2YgdGhlIGNhbGwKKyAqIEBjYWxsYmFjazogdGhlIGNhbGxiYWNrIHRvIGhkZAorICogQHJlcXVlc3Q6IHRoZSBUU0YgdGltZXIgcmVxdWVzdAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV9GQUlMVVJFIG9uIGZhaWx1cmUKKyAqLworQ0RGX1NUQVRVUyBzbWVfb2NiX2dldF90c2ZfdGltZXIodEhhbEhhbmRsZSBoSGFsLCB2b2lkICpjb250ZXh0LAorCQkJCSBvY2JfY2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJIHN0cnVjdCBzaXJfb2NiX2dldF90c2ZfdGltZXIgKnJlcXVlc3QpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJY2RzX21zZ190IG1zZyA9IHswfTsKKwlzdHJ1Y3Qgc2lyX29jYl9nZXRfdHNmX3RpbWVyICptc2dfYm9keTsKKworCS8qIExvY2sgdGhlIFNNRSBzdHJ1Y3R1cmUgKi8KKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgV01JIHJlcXVlc3QsIGFuZCBjb3B5IHRoZSBwYXJhbWV0ZXIgKi8KKwltc2dfYm9keSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqbXNnX2JvZHkpKTsKKwlpZiAoIW1zZ19ib2R5KSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZ290byBlbmQ7CisJfQorCSptc2dfYm9keSA9ICpyZXF1ZXN0OworCisJbXNnLnR5cGUgPSBXTUFfT0NCX0dFVF9UU0ZfVElNRVJfQ01EOworCW1zZy5ib2R5cHRyID0gbXNnX2JvZHk7CisKKwkvKiBTZXQgdGhlIHJlcXVlc3QgY2FsbGJhY2sgYW5kIHRoZSBjb250ZXh0ICovCisJcE1hYy0+c21lLm9jYl9nZXRfdHNmX3RpbWVyX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJcE1hYy0+c21lLm9jYl9nZXRfdHNmX3RpbWVyX2NvbnRleHQgPSBjb250ZXh0OworCisJLyogUG9zdCB0aGUgbWVzc2FnZSB0byBXREEgKi8KKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiRXJyb3IgcG9zdGluZyBtZXNzYWdlIHRvIFdEQTogJWQiKSwgc3RhdHVzKTsKKwkJcE1hYy0+c21lLm9jYl9nZXRfdHNmX3RpbWVyX2NhbGxiYWNrID0gTlVMTDsKKwkJcE1hYy0+c21lLm9jYl9nZXRfdHNmX3RpbWVyX2NvbnRleHQgPSBOVUxMOworCQljZGZfbWVtX2ZyZWUobXNnX2JvZHkpOworCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX2RjY19nZXRfc3RhdHMoKSAtIEdldCB0aGUgRENDIHN0YXRzCisgKiBAaEhhbDogcmVmZXJlbmNlIHRvIHRoZSBIQUwKKyAqIEBjb250ZXh0OiB0aGUgY29udGV4dCBvZiB0aGUgY2FsbAorICogQGNhbGxiYWNrOiB0aGUgY2FsbGJhY2sgdG8gaGRkCisgKiBAcmVxdWVzdDogdGhlIGdldCBEQ0Mgc3RhdHMgcmVxdWVzdAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV9GQUlMVVJFIG9uIGZhaWx1cmUKKyAqLworQ0RGX1NUQVRVUyBzbWVfZGNjX2dldF9zdGF0cyh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKmNvbnRleHQsCisJCQkgICAgIG9jYl9jYWxsYmFjayBjYWxsYmFjaywKKwkJCSAgICAgc3RydWN0IHNpcl9kY2NfZ2V0X3N0YXRzICpyZXF1ZXN0KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWNkc19tc2dfdCBtc2cgPSB7MH07CisJc3RydWN0IHNpcl9kY2NfZ2V0X3N0YXRzICptc2dfYm9keTsKKworCS8qIExvY2sgdGhlIFNNRSBzdHJ1Y3R1cmUgKi8KKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgV01JIHJlcXVlc3QsIGFuZCBjb3B5IHRoZSBwYXJhbWV0ZXIgKi8KKwltc2dfYm9keSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqbXNnX2JvZHkpICsKKwkJCQkgIHJlcXVlc3QtPnJlcXVlc3RfYXJyYXlfbGVuKTsKKwlpZiAoIW1zZ19ib2R5KSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZ290byBlbmQ7CisJfQorCSptc2dfYm9keSA9ICpyZXF1ZXN0OworCW1zZ19ib2R5LT5yZXF1ZXN0X2FycmF5ID0gKHZvaWQgKiltc2dfYm9keSArIHNpemVvZigqbXNnX2JvZHkpOworCWNkZl9tZW1fY29weShtc2dfYm9keS0+cmVxdWVzdF9hcnJheSwgcmVxdWVzdC0+cmVxdWVzdF9hcnJheSwKKwkJICAgICByZXF1ZXN0LT5yZXF1ZXN0X2FycmF5X2xlbik7CisKKwltc2cudHlwZSA9IFdNQV9EQ0NfR0VUX1NUQVRTX0NNRDsKKwltc2cuYm9keXB0ciA9IG1zZ19ib2R5OworCisJLyogU2V0IHRoZSByZXF1ZXN0IGNhbGxiYWNrIGFuZCBjb250ZXh0ICovCisJcE1hYy0+c21lLmRjY19nZXRfc3RhdHNfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlwTWFjLT5zbWUuZGNjX2dldF9zdGF0c19jb250ZXh0ID0gY29udGV4dDsKKworCXN0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJFcnJvciBwb3N0aW5nIG1lc3NhZ2UgdG8gV0RBOiAlZCIpLCBzdGF0dXMpOworCQlwTWFjLT5zbWUuZGNjX2dldF9zdGF0c19jYWxsYmFjayA9IGNhbGxiYWNrOworCQlwTWFjLT5zbWUuZGNjX2dldF9zdGF0c19jb250ZXh0ID0gY29udGV4dDsKKwkJY2RmX21lbV9mcmVlKG1zZ19ib2R5KTsKKwkJZ290byBlbmQ7CisJfQorCitlbmQ6CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9kY2NfY2xlYXJfc3RhdHMoKSAtIENsZWFyIHRoZSBEQ0Mgc3RhdHMKKyAqIEBoSGFsOiByZWZlcmVuY2UgdG8gdGhlIEhBTAorICogQHZkZXZfaWQ6IHZkZXYgaWQgZm9yIE9DQiBpbnRlcmZhY2UKKyAqIEBkY2Nfc3RhdHNfYml0bWFwOiB0aGUgZW50cmllcyBpbiB0aGUgc3RhdHMgdG8gY2xlYXIKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBDREZfU1RBVFVTX0VfRkFJTFVSRSBvbiBmYWlsdXJlCisgKi8KK0NERl9TVEFUVVMgc21lX2RjY19jbGVhcl9zdGF0cyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHZkZXZfaWQsCisJCQkgICAgICAgdWludDMyX3QgZGNjX3N0YXRzX2JpdG1hcCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgbXNnID0gezB9OworCXN0cnVjdCBzaXJfZGNjX2NsZWFyX3N0YXRzICpyZXF1ZXN0OworCisJLyogTG9jayB0aGUgU01FIHN0cnVjdHVyZSAqLworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlyZXF1ZXN0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaXJfZGNjX2NsZWFyX3N0YXRzKSk7CisJaWYgKCFyZXF1ZXN0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCWNkZl9tZW1femVybyhyZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKTsKKwlyZXF1ZXN0LT52ZGV2X2lkID0gdmRldl9pZDsKKwlyZXF1ZXN0LT5kY2Nfc3RhdHNfYml0bWFwID0gZGNjX3N0YXRzX2JpdG1hcDsKKworCW1zZy50eXBlID0gV01BX0RDQ19DTEVBUl9TVEFUU19DTUQ7CisJbXNnLmJvZHlwdHIgPSByZXF1ZXN0OworCisJc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIk5vdCBhYmxlIHRvIHBvc3QgbXNnIHRvIFdEQSIpKTsKKwkJY2RmX21lbV9mcmVlKHJlcXVlc3QpOworCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX2RjY191cGRhdGVfbmRsKCkgLSBVcGRhdGUgdGhlIERDQyBzZXR0aW5ncworICogQGhIYWw6IHJlZmVyZW5jZSB0byB0aGUgSEFMCisgKiBAY29udGV4dDogdGhlIGNvbnRleHQgb2YgdGhlIGNhbGwKKyAqIEBjYWxsYmFjazogdGhlIGNhbGxiYWNrIHRvIGhkZAorICogQHJlcXVlc3Q6IHRoZSB1cGRhdGUgRENDIHJlcXVlc3QKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBDREZfU1RBVFVTX0VfRkFJTFVSRSBvbiBmYWlsdXJlCisgKi8KK0NERl9TVEFUVVMgc21lX2RjY191cGRhdGVfbmRsKHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAqY29udGV4dCwKKwkJCSAgICAgIG9jYl9jYWxsYmFjayBjYWxsYmFjaywKKwkJCSAgICAgIHN0cnVjdCBzaXJfZGNjX3VwZGF0ZV9uZGwgKnJlcXVlc3QpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJY2RzX21zZ190IG1zZyA9IHswfTsKKwlzdHJ1Y3Qgc2lyX2RjY191cGRhdGVfbmRsICptc2dfYm9keTsKKworCS8qIExvY2sgdGhlIFNNRSBzdHJ1Y3R1cmUgKi8KKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgV01JIHJlcXVlc3QsIGFuZCBjb3B5IHRoZSBwYXJhbWV0ZXIgKi8KKwltc2dfYm9keSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqbXNnX2JvZHkpICsKKwkJCQkgIHJlcXVlc3QtPmRjY19uZGxfY2hhbl9saXN0X2xlbiArCisJCQkJICByZXF1ZXN0LT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbik7CisJaWYgKCFtc2dfYm9keSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkiKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZ290byBlbmQ7CisJfQorCisJKm1zZ19ib2R5ID0gKnJlcXVlc3Q7CisKKwltc2dfYm9keS0+ZGNjX25kbF9jaGFuX2xpc3QgPSAodm9pZCAqKW1zZ19ib2R5ICsgc2l6ZW9mKCptc2dfYm9keSk7CisJbXNnX2JvZHktPmRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3QgPSBtc2dfYm9keS0+ZGNjX25kbF9jaGFuX2xpc3QgKworCQlyZXF1ZXN0LT5kY2NfbmRsX2NoYW5fbGlzdF9sZW47CisJY2RmX21lbV9jb3B5KG1zZ19ib2R5LT5kY2NfbmRsX2NoYW5fbGlzdCwgcmVxdWVzdC0+ZGNjX25kbF9jaGFuX2xpc3QsCisJCSAgICAgcmVxdWVzdC0+ZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdF9sZW4pOworCWNkZl9tZW1fY29weShtc2dfYm9keS0+ZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdCwKKwkJICAgICByZXF1ZXN0LT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0LAorCQkgICAgIHJlcXVlc3QtPmRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3RfbGVuKTsKKworCW1zZy50eXBlID0gV01BX0RDQ19VUERBVEVfTkRMX0NNRDsKKwltc2cuYm9keXB0ciA9IG1zZ19ib2R5OworCisJLyogU2V0IHRoZSByZXF1ZXN0IGNhbGxiYWNrIGFuZCB0aGUgY29udGV4dCAqLworCXBNYWMtPnNtZS5kY2NfdXBkYXRlX25kbF9jYWxsYmFjayA9IGNhbGxiYWNrOworCXBNYWMtPnNtZS5kY2NfdXBkYXRlX25kbF9jb250ZXh0ID0gY29udGV4dDsKKworCXN0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJFcnJvciBwb3N0aW5nIG1lc3NhZ2UgdG8gV0RBOiAlZCIpLCBzdGF0dXMpOworCQlwTWFjLT5zbWUuZGNjX3VwZGF0ZV9uZGxfY2FsbGJhY2sgPSBOVUxMOworCQlwTWFjLT5zbWUuZGNjX3VwZGF0ZV9uZGxfY29udGV4dCA9IE5VTEw7CisJCWNkZl9tZW1fZnJlZShtc2dfYm9keSk7CisJCWdvdG8gZW5kOworCX0KKworZW5kOgorCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcmVnaXN0ZXJfZm9yX2RjY19zdGF0c19ldmVudCgpIC0gUmVnaXN0ZXIgZm9yIHRoZSBwZXJpb2RpYyBEQ0Mgc3RhdHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudAorICogQGhIYWw6IHJlZmVyZW5jZSB0byB0aGUgSEFMCisgKiBAY29udGV4dDogdGhlIGNvbnRleHQgb2YgdGhlIGNhbGwKKyAqIEBjYWxsYmFjazogdGhlIGNhbGxiYWNrIHRvIGhkZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV9GQUlMVVJFIG9uIGZhaWx1cmUKKyAqLworQ0RGX1NUQVRVUyBzbWVfcmVnaXN0ZXJfZm9yX2RjY19zdGF0c19ldmVudCh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKmNvbnRleHQsCisJCQkJCSAgICBvY2JfY2FsbGJhY2sgY2FsbGJhY2spCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlwTWFjLT5zbWUuZGNjX3N0YXRzX2V2ZW50X2NhbGxiYWNrID0gY2FsbGJhY2s7CisJcE1hYy0+c21lLmRjY19zdGF0c19ldmVudF9jb250ZXh0ID0gY29udGV4dDsKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHNtZV9nZXRfcmVjb3Zlcnlfc3RhdHModEhhbEhhbmRsZSBoSGFsKQoreworCXVpbnQ4X3QgaTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICJTZWxmIFJlY292ZXJ5IFN0YXRzIik7CisJZm9yIChpID0gMDsgaSA8IE1BWF9BQ1RJVkVfQ01EX1NUQVRTOyBpKyspIHsKKwkJaWYgKGVTbWVOb0NvbW1hbmQgIT0KKwkJICAgIGdfc2VsZl9yZWNvdmVyeV9zdGF0cy5hY3RpdmVDbWRTdGF0c1tpXS5jb21tYW5kKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJ0aW1lc3RhbXAgJWxsdTogY29tbWFuZCAweCUwWDogcmVhc29uICVkOiBzZXNzaW9uICVkIiwKKwkJCQkgIGdfc2VsZl9yZWNvdmVyeV9zdGF0cy5hY3RpdmVDbWRTdGF0c1tpXS4KKwkJCQkgIHRpbWVzdGFtcCwKKwkJCQkgIGdfc2VsZl9yZWNvdmVyeV9zdGF0cy5hY3RpdmVDbWRTdGF0c1tpXS5jb21tYW5kLAorCQkJCSAgZ19zZWxmX3JlY292ZXJ5X3N0YXRzLmFjdGl2ZUNtZFN0YXRzW2ldLnJlYXNvbiwKKwkJCQkgIGdfc2VsZl9yZWNvdmVyeV9zdGF0cy5hY3RpdmVDbWRTdGF0c1tpXS4KKwkJCQkgIHNlc3Npb25JZCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogc21lX3NhdmVfYWN0aXZlX2NtZF9zdGF0cygpIC0gVG8gc2F2ZSBhY3RpdmUgY29tbWFuZCBzdGF0cworICogQGhIYWw6IEhBTCBjb250ZXh0CisgKgorICogVGhpcyByb3V0aW5lIGlzIHRvIHNhdmUgYWN0aXZlIGNvbW1hbmQgc3RhdHMKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBzbWVfc2F2ZV9hY3RpdmVfY21kX3N0YXRzKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0U21lQ21kICpwVGVtcENtZCA9IE5VTEw7CisJdExpc3RFbGVtICpwRW50cnk7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXVpbnQ4X3Qgc3RhdGlkeCA9IDA7CisJdEFjdGl2ZUNtZFN0YXRzICphY3R2X2NtZF9zdGF0ID0gTlVMTDsKKworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoInBNYWMgaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKHBFbnRyeSkKKwkJcFRlbXBDbWQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisKKwlpZiAoIXBUZW1wQ21kKQorCQlyZXR1cm47CisKKwlpZiAoZVNtZUNzckNvbW1hbmRNYXNrICYgcFRlbXBDbWQtPmNvbW1hbmQpIHsKKwkJc3RhdGlkeCA9IGdfc2VsZl9yZWNvdmVyeV9zdGF0cy5jbWRTdGF0c0luZHg7CisJCWFjdHZfY21kX3N0YXQgPSAmZ19zZWxmX3JlY292ZXJ5X3N0YXRzLmFjdGl2ZUNtZFN0YXRzW3N0YXRpZHhdOworCQlhY3R2X2NtZF9zdGF0LT5jb21tYW5kID0gcFRlbXBDbWQtPmNvbW1hbmQ7CisJCWFjdHZfY21kX3N0YXQtPnNlc3Npb25JZCA9IHBUZW1wQ21kLT5zZXNzaW9uSWQ7CisJCWFjdHZfY21kX3N0YXQtPnRpbWVzdGFtcCA9IGNkc19nZXRfbW9ub3RvbmljX2Jvb3R0aW1lKCk7CisJCWlmIChlU21lQ29tbWFuZFJvYW0gPT0gcFRlbXBDbWQtPmNvbW1hbmQpCisJCQlhY3R2X2NtZF9zdGF0LT5yZWFzb24gPSBwVGVtcENtZC0+dS5yb2FtQ21kLnJvYW1SZWFzb247CisJCWVsc2UgaWYgKGVTbWVDb21tYW5kU2NhbiA9PSBwVGVtcENtZC0+Y29tbWFuZCkKKwkJCWFjdHZfY21kX3N0YXQtPnJlYXNvbiA9IHBUZW1wQ21kLT51LnNjYW5DbWQucmVhc29uOworCQllbHNlCisJCQlhY3R2X2NtZF9zdGF0LT5yZWFzb24gPSAweEZGOworCisJCWdfc2VsZl9yZWNvdmVyeV9zdGF0cy5jbWRTdGF0c0luZHggPQorCQkJKChnX3NlbGZfcmVjb3Zlcnlfc3RhdHMuY21kU3RhdHNJbmR4ICsgMSkgJgorCQkJCShNQVhfQUNUSVZFX0NNRF9TVEFUUyAtIDEpKTsKKwl9CisJcmV0dXJuOworfQorCit2b2lkIGFjdGl2ZV9saXN0X2NtZF90aW1lb3V0X2hhbmRsZSh2b2lkICp1c2VyRGF0YSkKK3sKKwlpZiAoTlVMTCA9PSB1c2VyRGF0YSkKKwkJcmV0dXJuOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICIlczogQWN0aXZlIExpc3QgY29tbWFuZCB0aW1lb3V0IENtZCBMaXN0IENvdW50ICVkIiwgX19mdW5jX18sCisJCSAgY3NyX2xsX2NvdW50KCYoKHRwQW5pU2lyR2xvYmFsKSB1c2VyRGF0YSktPnNtZS4KKwkJCSAgICAgICBzbWVDbWRBY3RpdmVMaXN0KSk7CisJc21lX2dldF9jb21tYW5kX3Ffc3RhdHVzKCh0SGFsSGFuZGxlKSB1c2VyRGF0YSk7CisKKwlpZiAoKCh0cEFuaVNpckdsb2JhbCkgdXNlckRhdGEpLT5zbWUuZW5hYmxlU2VsZlJlY292ZXJ5KSB7CisJCXNtZV9zYXZlX2FjdGl2ZV9jbWRfc3RhdHMoKHRIYWxIYW5kbGUpIHVzZXJEYXRhKTsKKwkJY2RzX3RyaWdnZXJfcmVjb3ZlcnkoKTsKKwl9IGVsc2UgeworCQlDREZfQlVHKDApOworCX0KK30KKworQ0RGX1NUQVRVUyBzbWVfbm90aWZ5X21vZGVtX3Bvd2VyX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3QgdmFsdWUpCit7CisJY2RzX21zZ190IG1zZzsKKwl0cFNpck1vZGVtUG93ZXJTdGF0ZUluZCByZXF1ZXN0X2J1ZjsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXF1ZXN0X2J1ZiA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyTW9kZW1Qb3dlclN0YXRlSW5kKSk7CisJaWYgKE5VTEwgPT0gcmVxdWVzdF9idWYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBNT0RFTSBQT1dFUiBTVEFURSBJTkQiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJcmVxdWVzdF9idWYtPnBhcmFtID0gdmFsdWU7CisKKwltc2cudHlwZSA9IFdNQV9NT0RFTV9QT1dFUl9TVEFURV9JTkQ7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHJlcXVlc3RfYnVmOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCSAgICAoY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV01BX01PREVNX1BPV0VSX1NUQVRFX0lORCBtZXNzYWdlIgorCQkJICAiIHRvIFdNQSIsIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKHJlcXVlc3RfYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBRQ0FfSFRfMjA0MF9DT0VYCitDREZfU1RBVFVTIHNtZV9ub3RpZnlfaHQyMDQwX21vZGUodEhhbEhhbmRsZSBoSGFsLCB1aW50MTZfdCBzdGFJZCwKKwkJCQkgIHN0cnVjdCBjZGZfbWFjX2FkZHIgbWFjQWRkclNUQSwKKwkJCQkgIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgdWludDhfdCBjaGFubmVsX3R5cGUpCit7CisJY2RzX21zZ190IG1zZzsKKwl0VXBkYXRlVkhUT3BNb2RlICpwSHRPcE1vZGUgPSBOVUxMOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBIdE9wTW9kZSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0VXBkYXRlVkhUT3BNb2RlKSk7CisJaWYgKE5VTEwgPT0gcEh0T3BNb2RlKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc2V0dGluZyBPUCBtb2RlIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCXN3aXRjaCAoY2hhbm5lbF90eXBlKSB7CisJY2FzZSBlSFRfQ0hBTl9IVDIwOgorCQlwSHRPcE1vZGUtPm9wTW9kZSA9IGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaOworCQlicmVhazsKKworCWNhc2UgZUhUX0NIQU5fSFQ0ME1JTlVTOgorCWNhc2UgZUhUX0NIQU5fSFQ0MFBMVVM6CisJCXBIdE9wTW9kZS0+b3BNb2RlID0gZUhUX0NIQU5ORUxfV0lEVEhfNDBNSFo7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogSW52YWxpZCBPUCBtb2RlIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcEh0T3BNb2RlLT5zdGFJZCA9IHN0YUlkLAorCWNkZl9tZW1fY29weShwSHRPcE1vZGUtPnBlZXJfbWFjLCBtYWNBZGRyU1RBLmJ5dGVzLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCXBIdE9wTW9kZS0+c21lc2Vzc2lvbklkID0gc2Vzc2lvbklkOworCisJbXNnLnR5cGUgPSBXTUFfVVBEQVRFX09QX01PREU7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHBIdE9wTW9kZTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkgICAgKGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOb3QgYWJsZSB0byBwb3N0IFdNQV9VUERBVEVfT1BfTU9ERSBtZXNzYWdlIgorCQkJICAiIHRvIFdNQSIsIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKHBIdE9wTW9kZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogTm90aWZlZCBGVyBhYm91dCBPUCBtb2RlOiAlZCBmb3Igc3RhSWQ9JWQiLAorCQkgIF9fZnVuY19fLCBwSHRPcE1vZGUtPm9wTW9kZSwgc3RhSWQpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX3NldF9odDIwNDBfbW9kZQorCisgICAgXGJyaWVmIFRvIHVwZGF0ZSBIVCBPcGVyYXRpb24gYmVhY29uIElFLgorCisgICAgXHBhcmFtCisKKyAgICBccmV0dXJuIENERl9TVEFUVVMgIFNVQ0NFU1MKKwkJCUZBSUxVUkUgb3IgUkVTT1VSQ0VTCisJCQlUaGUgQVBJIGZpbmlzaGVkIGFuZCBmYWlsZWQuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2V0X2h0MjA0MF9tb2RlKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkgICAgICAgdWludDhfdCBjaGFubmVsX3R5cGUsIGJvb2wgb2Jzc0VuYWJsZWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJZVBoeUNoYW5Cb25kU3RhdGUgY2JNb2RlOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IFVwZGF0ZSBIVCBvcGVyYXRpb24gYmVhY29uIElFLCBjaGFubmVsX3R5cGU9JWQiLAorCQkgIF9fZnVuY19fLCBjaGFubmVsX3R5cGUpOworCisJc3dpdGNoIChjaGFubmVsX3R5cGUpIHsKKwljYXNlIGVIVF9DSEFOX0hUMjA6CisJCWNiTW9kZSA9IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKwkJYnJlYWs7CisJY2FzZSBlSFRfQ0hBTl9IVDQwTUlOVVM6CisJCWNiTW9kZSA9IFBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlk7CisJCWJyZWFrOworCWNhc2UgZUhUX0NIQU5fSFQ0MFBMVVM6CisJCWNiTW9kZSA9IFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczpFcnJvciEhISBJbnZhbGlkIEhUMjAvNDAgbW9kZSAhIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzdGF0dXMgPSBjc3Jfc2V0X2h0MjA0MF9tb2RlKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJICAgICBjYk1vZGUsIG9ic3NFbmFibGVkKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9zZXRfcGh5X2NiX21vZGUyNF9nCisKKyAgICBcYnJpZWYgQ2hhbmdlcyBQSFkgY2hhbm5lbCBib25kaW5nIG1vZGUKKworICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIFxwYXJhbSBjYk1vZGUgbmV3IGNoYW5uZWwgYm9uZGluZyBtb2RlIHdoaWNoIGlzIHRvIHNldAorCisgICAgXHJldHVybiBDREZfU1RBVFVTICBTVUNDRVNTLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9waHlfY2JfbW9kZTI0X2codEhhbEhhbmRsZSBoSGFsLCBlUGh5Q2hhbkJvbmRTdGF0ZSBwaHlDQk1vZGUpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKE5VTEwgPT0gcE1hYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBpbnZhbGlkIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNoYW5uZWxCb25kaW5nTW9kZTI0R0h6ID0gcGh5Q0JNb2RlOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisvKgorICogU01FIEFQSSB0byBlbmFibGUvZGlzYWJsZSBpZGxlIG1vZGUgcG93ZXJzYXZlCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgb25seSBpZiBwb3dlcnNhdmUgb2ZmbG9hZAorICogaXMgZW5hYmxlZAorICovCitDREZfU1RBVFVTIHNtZV9zZXRfaWRsZV9wb3dlcnNhdmVfY29uZmlnKHZvaWQgKmNkc19jb250ZXh0LAorCQkJCXRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3QgdmFsdWUpCit7CisJdm9pZCAqd21hQ29udGV4dCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKE5VTEwgPT0gd21hQ29udGV4dCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiB3bWFDb250ZXh0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCSAgIiBJZGxlIFBzIFNldCBWYWx1ZSAlZCIsIHZhbHVlKTsKKworCXBNYWMtPmltcHNfZW5hYmxlZCA9IGZhbHNlOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gd21hX3NldF9pZGxlX3BzX2NvbmZpZyh3bWFDb250ZXh0LCB2YWx1ZSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIgRmFpbGVkIHRvIFNldCBJZGxlIFBzIFZhbHVlICVkIiwgdmFsdWUpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICh2YWx1ZSkKKwkJcE1hYy0+aW1wc19lbmFibGVkID0gdHJ1ZTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitpbnQxNl90IHNtZV9nZXRfaHRfY29uZmlnKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uX2lkLCB1aW50MTZfdCBodF9jYXBhYikKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uX2lkKTsKKworCWlmIChOVUxMID09IHBTZXNzaW9uKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHBTZXNzaW9uIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKwlzd2l0Y2ggKGh0X2NhcGFiKSB7CisJY2FzZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX0FEVkFOQ0VfQ09ESU5HOgorCQlyZXR1cm4gcFNlc3Npb24tPmh0Q29uZmlnLmh0X3J4X2xkcGM7CisJY2FzZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1RYX1NUQkM6CisJCXJldHVybiBwU2Vzc2lvbi0+aHRDb25maWcuaHRfdHhfc3RiYzsKKwljYXNlIFdOSV9DRkdfSFRfQ0FQX0lORk9fUlhfU1RCQzoKKwkJcmV0dXJuIHBTZXNzaW9uLT5odENvbmZpZy5odF9yeF9zdGJjOworCWNhc2UgV05JX0NGR19IVF9DQVBfSU5GT19TSE9SVF9HSV8yME1IWjoKKwljYXNlIFdOSV9DRkdfSFRfQ0FQX0lORk9fU0hPUlRfR0lfNDBNSFo6CisJCXJldHVybiBwU2Vzc2lvbi0+aHRDb25maWcuaHRfc2dpOworCWRlZmF1bHQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiaW52YWxpZCBodCBjYXBhYmlsaXR5Iik7CisJCXJldHVybiAtRUlPOworCX0KK30KKworaW50IHNtZV91cGRhdGVfaHRfY29uZmlnKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsIHVpbnQxNl90IGh0Q2FwYWIsCisJCQkgaW50IHZhbHVlKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBwU2Vzc2lvbiBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHdtYV9zZXRfaHRjb25maWcoc2Vzc2lvbklkLCBodENhcGFiLCB2YWx1ZSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJGYWlsZWQgdG8gc2V0IGh0IGNhcGFiaWxpdHkgaW4gdGFyZ2V0Iik7CisJCXJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoaHRDYXBhYikgeworCWNhc2UgV05JX0NGR19IVF9DQVBfSU5GT19BRFZBTkNFX0NPRElORzoKKwkJcFNlc3Npb24tPmh0Q29uZmlnLmh0X3J4X2xkcGMgPSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1RYX1NUQkM6CisJCXBTZXNzaW9uLT5odENvbmZpZy5odF90eF9zdGJjID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgV05JX0NGR19IVF9DQVBfSU5GT19SWF9TVEJDOgorCQlwU2Vzc2lvbi0+aHRDb25maWcuaHRfcnhfc3RiYyA9IHZhbHVlOworCQlicmVhazsKKwljYXNlIFdOSV9DRkdfSFRfQ0FQX0lORk9fU0hPUlRfR0lfMjBNSFo6CisJY2FzZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NIT1JUX0dJXzQwTUhaOgorCQlwU2Vzc2lvbi0+aHRDb25maWcuaHRfc2dpID0gdmFsdWU7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEhUMjBfU0hPUlRfR0lfTUNTN19SQVRFIDcyMgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZW5kX3JhdGVfdXBkYXRlX2luZAorICAgIFxicmllZiAgQVBJIHRvIFVwZGF0ZSByYXRlCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorICAgIFxwYXJhbSAgcmF0ZVVwZGF0ZVBhcmFtcyAtIFBvaW50ZXIgdG8gcmF0ZSB1cGRhdGUgcGFyYW1zCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2VuZF9yYXRlX3VwZGF0ZV9pbmQodEhhbEhhbmRsZSBoSGFsLAorCQkJCSAgICB0U2lyUmF0ZVVwZGF0ZUluZCAqcmF0ZVVwZGF0ZVBhcmFtcykKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJY2RzX21zZ190IG1zZzsKKwl0U2lyUmF0ZVVwZGF0ZUluZCAqcmF0ZV91cGQgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclJhdGVVcGRhdGVJbmQpKTsKKworCWlmIChyYXRlX3VwZCA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiUmF0ZSB1cGRhdGUgc3RydWN0IGFsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCSpyYXRlX3VwZCA9ICpyYXRlVXBkYXRlUGFyYW1zOworCisJaWYgKHJhdGVfdXBkLT5tY2FzdERhdGFSYXRlMjRHSHogPT0gSFQyMF9TSE9SVF9HSV9NQ1M3X1JBVEUpCisJCXJhdGVfdXBkLT5tY2FzdERhdGFSYXRlMjRHSHpUeEZsYWcgPQorCQkJZUhBTF9UWF9SQVRFX0hUMjAgfCBlSEFMX1RYX1JBVEVfU0dJOworCWVsc2UgaWYgKHJhdGVfdXBkLT5yZWxpYWJsZU1jYXN0RGF0YVJhdGUgPT0KKwkJIEhUMjBfU0hPUlRfR0lfTUNTN19SQVRFKQorCQlyYXRlX3VwZC0+cmVsaWFibGVNY2FzdERhdGFSYXRlVHhGbGFnID0KKwkJCWVIQUxfVFhfUkFURV9IVDIwIHwgZUhBTF9UWF9SQVRFX1NHSTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCW1zZy50eXBlID0gV01BX1JBVEVfVVBEQVRFX0lORDsKKwkJbXNnLmJvZHlwdHIgPSByYXRlX3VwZDsKKworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgIChjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBOb3QgYWJsZSAiCisJCQkJICAidG8gcG9zdCBXTUFfU0VUX1JNQ19SQVRFX0lORCB0byBXTUEhIiwKKwkJCQkgIF9fZnVuY19fKTsKKworCQkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCQljZGZfbWVtX2ZyZWUocmF0ZV91cGQpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfZ2V0X3JlZ19pbmZvKCkgLSBUbyBnZXQgcmVnaXN0cmF0aW9uIGluZm8KKyAqIEBoSGFsOiBIQUwgY29udGV4dAorICogQGNoYW5JZDogY2hhbm5lbCBpZAorICogQHJlZ0luZm8xOiBmaXJzdCByZWcgaW5mbyB0byBmaWxsCisgKiBAcmVnSW5mbzI6IHNlY29uZCByZWcgaW5mbyB0byBmaWxsCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgZ2l2ZSB5b3UgcmVnIGluZm8KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfZ2V0X3JlZ19pbmZvKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBjaGFuSWQsCisJCQkgICAgdWludDMyX3QgKnJlZ0luZm8xLCB1aW50MzJfdCAqcmVnSW5mbzIpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQ4X3QgaTsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkqcmVnSW5mbzEgPSAwOworCSpyZWdJbmZvMiA9IDA7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCWZvciAoaSA9IDA7IGkgPCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU47IGkrKykgeworCQlpZiAocE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZVtpXS5jaGFuSWQgPT0gY2hhbklkKSB7CisJCQlTTUVfU0VUX0NIQU5ORUxfUkVHX1BPV0VSKCpyZWdJbmZvMSwKKwkJCQlwTWFjLT5zY2FuLmRlZmF1bHRQb3dlclRhYmxlW2ldLnB3cik7CisKKwkJCVNNRV9TRVRfQ0hBTk5FTF9NQVhfVFhfUE9XRVIoKnJlZ0luZm8yLAorCQkJCXBNYWMtPnNjYW4uZGVmYXVsdFBvd2VyVGFibGVbaV0ucHdyKTsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQpCisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2F1dG9fc2h1dGRvd25fY2IKKyAgICBcYnJpZWYgIFVzZWQgdG8gcGx1ZyBpbiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgcmVjZWl2aW5nIGF1dG8gc2h1dGRvd24gZXZ0CisgICAgXHBhcmFtICBoSGFsCisgICAgXHBhcmFtICBwQ2FsbGJhY2tmbiA6IGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgc2hvdWxkIGJlIHBsdWdnZWQgaW4KKyAgIFwtIHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9hdXRvX3NodXRkb3duX2NiKHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAoKnBDYWxsYmFja2ZuKSh2b2lkKQorCQkJCSAgICApIHsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiJXM6IFBsdWcgaW4gQXV0byBzaHV0ZG93biBldmVudCBjYWxsYmFjayIsIF9fZnVuY19fKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCWlmIChOVUxMICE9IHBDYWxsYmFja2ZuKSB7CisJCQlwTWFjLT5zbWUucEF1dG9TaHV0ZG93bk5vdGlmaWNhdGlvbkNiID0gcENhbGxiYWNrZm47CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfYXV0b19zaHV0ZG93bl90aW1lcgorICAgIFxBUEkgdG8gc2V0IGF1dG8gc2h1dGRvd24gdGltZXIgdmFsdWUgaW4gRlcuCisgICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuCisgICAgXHBhcmFtIHRpbWVyX3ZhbCAtIFRoZSBhdXRvIHNodXRkb3duIHRpbWVyIHZhbHVlIHRvIGJlIHNldAorICAgXC0gcmV0dXJuIENvbmZpZ3VyYXRpb24gbWVzc2FnZSBwb3N0aW5nIHN0YXR1cywgU1VDQ0VTUyBvciBGYWlsCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zZXRfYXV0b19zaHV0ZG93bl90aW1lcih0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHRpbWVyX3ZhbCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRTaXJBdXRvU2h1dGRvd25DbWRQYXJhbXMgKmF1dG9fc2hfY21kOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCWF1dG9fc2hfY21kID0gKHRTaXJBdXRvU2h1dGRvd25DbWRQYXJhbXMgKikKKwkJCSAgICAgIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyQXV0b1NodXRkb3duQ21kUGFyYW1zKSk7CisJCWlmIChhdXRvX3NoX2NtZCA9PSBOVUxMKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlcyBSZXF1ZXN0IEJ1ZmZlciBBbGxvYyBGYWlsIiwgX19mdW5jX18pOworCQkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisKKwkJYXV0b19zaF9jbWQtPnRpbWVyX3ZhbCA9IHRpbWVyX3ZhbDsKKworCQkvKiBzZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gYXV0b19zaF9jbWQ7CisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfU0VUX0FVVE9fU0hVVERPV05fVElNRVJfUkVROworCQljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IFBvc3QgQXV0byBzaHV0ZG93biBNU0cgZmFpbCIsIF9fZnVuY19fKTsKKwkJCWNkZl9tZW1fZnJlZShhdXRvX3NoX2NtZCk7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IFBvc3RlZCBBdXRvIHNodXRkb3duIE1TRyIsIF9fZnVuY19fKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NIX0FWT0lECisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2FkZF9jaF9hdm9pZF9jYWxsYmFjaworICAgIFxicmllZiAgVXNlZCB0byBwbHVnIGluIGNhbGxiYWNrIGZ1bmN0aW9uCisJICAgIFdoaWNoIG5vdGlmeSBjaGFubmVsIG1heSBub3QgYmUgdXNlZCB3aXRoIFNBUCBvciBQMlBHTyBtb2RlLgorCSAgICBOb3RpZmljYXRpb24gY29tZSBmcm9tIEZXLgorICAgIFxwYXJhbSAgaEhhbAorICAgIFxwYXJhbSAgcENhbGxiYWNrZm4gOiBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyIHNob3VsZCBiZSBwbHVnZ2VkIGluCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVUworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfYWRkX2NoX2F2b2lkX2NhbGxiYWNrCisJKHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAoKnBDYWxsYmFja2ZuKSh2b2lkICpwQWRhcHRlciwgdm9pZCAqaW5kUGFyYW0pCisJKSB7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgIiVzOiBQbHVnIGluIENIIEFWT0lEIENCIiwgX19mdW5jX18pOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKwkJaWYgKE5VTEwgIT0gcENhbGxiYWNrZm4pIHsKKwkJCXBNYWMtPnNtZS5wQ2hBdm9pZE5vdGlmaWNhdGlvbkNiID0gcENhbGxiYWNrZm47CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9jaF9hdm9pZF91cGRhdGVfcmVxCisgICAgXEFQSSB0byByZXF1ZXN0IGNoYW5uZWwgYXZvaWRhbmNlIHVwZGF0ZSBmcm9tIEZXLgorICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorICAgIFxwYXJhbSB1cGRhdGVfdHlwZSAtIFRoZSB1ZHBhdGVfdHlwZSBwYXJhbWV0ZXIgb2YgdGhpcyByZXF1ZXN0IGNhbGwKKyAgIFwtIHJldHVybiBDb25maWd1cmF0aW9uIG1lc3NhZ2UgcG9zdGluZyBzdGF0dXMsIFNVQ0NFU1Mgb3IgRmFpbAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfY2hfYXZvaWRfdXBkYXRlX3JlcSh0SGFsSGFuZGxlIGhIYWwpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0U2lyQ2hBdm9pZFVwZGF0ZVJlcSAqY2F1UmVxOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCWNhdVJlcSA9ICh0U2lyQ2hBdm9pZFVwZGF0ZVJlcSAqKQorCQkJIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyQ2hBdm9pZFVwZGF0ZVJlcSkpOworCQlpZiAoTlVMTCA9PSBjYXVSZXEpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzIFJlcXVlc3QgQnVmZmVyIEFsbG9jIEZhaWwiLCBfX2Z1bmNfXyk7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCX0KKworCQljYXVSZXEtPnJlc2VydmVkX3BhcmFtID0gMDsKKworCQkvKiBzZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gY2F1UmVxOworCQljZHNfbWVzc2FnZS50eXBlID0gV01BX0NIX0FWT0lEX1VQREFURV9SRVE7CisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogUG9zdCBDaCBBdm9pZCBVcGRhdGUgTVNHIGZhaWwiLAorCQkJCSAgX19mdW5jX18pOworCQkJY2RmX21lbV9mcmVlKGNhdVJlcSk7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IFBvc3RlZCBDaCBBdm9pZCBVcGRhdGUgTVNHIiwgX19mdW5jX18pOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DSF9BVk9JRCAqLworCisvKioKKyAqIHNtZV9zZXRfbWlyYWNhc3QoKSAtIEZ1bmN0aW9uIHRvIHNldCBtaXJhY2FzdCB2YWx1ZSB0byBVTUFDCisgKiBAaGFsOiAgICAgICAgICAgICAgICBIYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3BlbgorICogQGZpbHRlcl90eXBlOiAgICAgICAgMC1EaXNhYmxlZCwgMS1Tb3VyY2UsIDItc2luaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFzc2VzIGRvd24gdGhlIHZhbHVlIG9mIG1pcmFjYXN0IHNldCBieQorICogZnJhbWV3b3JrIHRvIFVNQUMKKyAqCisgKiBSZXR1cm46IENvbmZpZ3VyYXRpb24gbWVzc2FnZSBwb3N0aW5nIHN0YXR1cywgU1VDQ0VTUyBvciBGYWlsCisgKgorICovCitDREZfU1RBVFVTIHNtZV9zZXRfbWlyYWNhc3QodEhhbEhhbmRsZSBoYWwsIHVpbnQ4X3QgZmlsdGVyX3R5cGUpCit7CisJY2RzX21zZ190IG1zZzsKKwl1aW50MzJfdCAqdmFsOworCXRwQW5pU2lyR2xvYmFsIG1hY19wdHIgPSBQTUFDX1NUUlVDVChoYWwpOworCisJdmFsID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCp2YWwpKTsKKwlpZiAoTlVMTCA9PSB2YWwgfHwgTlVMTCA9PSBtYWNfcHRyKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSIlczogSW52YWxpZCBwb2ludGVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCSp2YWwgPSBmaWx0ZXJfdHlwZTsKKworCW1zZy50eXBlID0gU0lSX0hBTF9TRVRfTUlSQUNBU1Q7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHZhbDsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKAorCQkJCWNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAgICIlczogTm90IGFibGUgdG8gcG9zdCBXREFfU0VUX01BU19FTkFCTEVfRElTQUJMRSB0byBXTUEhIiwKKwkJICAgIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKHZhbCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwltYWNfcHRyLT5zbWUubWlyYWNhc3RfdmFsdWUgPSBmaWx0ZXJfdHlwZTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHNtZV9zZXRfbWFzKCkgLSBGdW5jdGlvbiB0byBzZXQgTUFTIHZhbHVlIHRvIFVNQUMKKyAqIEB2YWw6CTEtRW5hYmxlLCAwLURpc2FibGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBhc3NlcyBkb3duIHRoZSB2YWx1ZSBvZiBNQVMgdG8gdGhlIFVNQUMuIEEKKyAqIHZhbHVlIG9mIDEgd2lsbCBlbmFibGUgTUFTIGFuZCBhIHZhbHVlIG9mIDAgd2lsbCBkaXNhYmxlIE1BUworICoKKyAqIFJldHVybjogQ29uZmlndXJhdGlvbiBtZXNzYWdlIHBvc3Rpbmcgc3RhdHVzLCBTVUNDRVNTIG9yIEZhaWwKKyAqCisgKi8KK0NERl9TVEFUVVMgc21lX3NldF9tYXModWludDMyX3QgdmFsKQoreworCWNkc19tc2dfdCBtc2c7CisJdWludDMyX3QgKnB0cl92YWw7CisKKwlwdHJfdmFsID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwdHJfdmFsKSk7CisJaWYgKE5VTEwgPT0gcHRyX3ZhbCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBwdHJfdmFsIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCSpwdHJfdmFsID0gdmFsOworCisJbXNnLnR5cGUgPSBTSVJfSEFMX1NFVF9NQVM7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHB0cl92YWw7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUygKKwkJCQljZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV0RBX1NFVF9NQVNfRU5BQkxFX0RJU0FCTEUgdG8gV01BISIsCisJCSAgICBfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShwdHJfdmFsKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gc21lX3JvYW1fY2hhbm5lbF9jaGFuZ2VfcmVxCisgICBcYnJpZWYgQVBJIHRvIEluZGljYXRlIENoYW5uZWwgY2hhbmdlIHRvIG5ldyB0YXJnZXQgY2hhbm5lbAorICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuCisgICBccGFyYW0gdGFyZ2V0Q2hhbm5lbCAtIE5ldyBDaGFubmVsIHRvIG1vdmUgdGhlIFNBUCB0by4KKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3JvYW1fY2hhbm5lbF9jaGFuZ2VfcmVxKHRIYWxIYW5kbGUgaEhhbCwKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkLCB1aW50MzJfdCBjYl9tb2RlLCB0Q3NyUm9hbVByb2ZpbGUgKnByb2ZpbGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJdWludDhfdCBjaF9tb2RlOworCisJY2hfbW9kZSA9IChwcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXSA8PQorCQkJQ1NSX01BWF8yXzRfR0haX1NVUFBPUlRFRF9DSEFOTkVMUykgPworCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGUyNEdIeiA6CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNoYW5uZWxCb25kaW5nTW9kZTVHSHo7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgRkwoInNhcGRmczogcmVxdWVzdGVkIGNibW9kZT1bJWRdICYgbmV3IG5lZ290aWF0ZWQgY2Jtb2RlWyVkXSIpLAorCQkJICBjYl9tb2RlLCBjaF9tb2RlKTsKKwkJc3RhdHVzID0gY3NyX3JvYW1fY2hhbm5lbF9jaGFuZ2VfcmVxKHBNYWMsIGJzc2lkLCBjaF9tb2RlLAorCQkJCXByb2ZpbGUpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIHNtZV9wcm9jZXNzX2NoYW5uZWxfY2hhbmdlX3Jlc3AKKyAgIFxicmllZiBBUEkgdG8gSW5kaWNhdGUgQ2hhbm5lbCBjaGFuZ2UgcmVzcG9uc2UgbWVzc2FnZSB0byBTQVAuCisgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9wcm9jZXNzX2NoYW5uZWxfY2hhbmdlX3Jlc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgdWludDE2X3QgbXNnX3R5cGUsIHZvaWQgKnBNc2dCdWYpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1JbmZvIHByb2FtX2luZm8gPSB7IDAgfTsKKwllQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0OworCXRwU3dpdGNoQ2hhbm5lbFBhcmFtcyBwQ2hubFBhcmFtcyA9ICh0cFN3aXRjaENoYW5uZWxQYXJhbXMpIHBNc2dCdWY7CisJdWludDMyX3QgU2Vzc2lvbklkID0gcENobmxQYXJhbXMtPnBlU2Vzc2lvbklkOworCisJcHJvYW1faW5mby5jaGFubmVsQ2hhbmdlUmVzcEV2ZW50ID0KKwkJKHRTaXJDaGFuQ2hhbmdlUmVzcG9uc2UgKikKKwkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJDaGFuQ2hhbmdlUmVzcG9uc2UpKTsKKwlpZiAoTlVMTCA9PSBwcm9hbV9pbmZvLmNoYW5uZWxDaGFuZ2VSZXNwRXZlbnQpIHsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiQ2hhbm5lbCBDaGFuZ2UgRXZlbnQgQWxsb2NhdGlvbiBGYWlsZWQ6ICVkXG4iLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAobXNnX3R5cGUgPT0gZVdOSV9TTUVfQ0hBTk5FTF9DSEFOR0VfUlNQKSB7CisJCXByb2FtX2luZm8uY2hhbm5lbENoYW5nZVJlc3BFdmVudC0+c2Vzc2lvbklkID0gU2Vzc2lvbklkOworCQlwcm9hbV9pbmZvLmNoYW5uZWxDaGFuZ2VSZXNwRXZlbnQtPm5ld0NoYW5uZWxOdW1iZXIgPQorCQkJcENobmxQYXJhbXMtPmNoYW5uZWxOdW1iZXI7CisJCXByb2FtX2luZm8uY2hhbm5lbENoYW5nZVJlc3BFdmVudC0+c2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9CisJCQlwQ2hubFBhcmFtcy0+Y2hfd2lkdGg7CisKKwkJaWYgKHBDaG5sUGFyYW1zLT5zdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCQkgICJzYXBkZnM6IFJlY2VpdmVkIHN1Y2Nlc3MgZVdOSV9TTUVfQ0hBTk5FTF9DSEFOR0VfUlNQIGZvciBzZXNzaW9uSWRbJWRdIiwKKwkJCQkgIFNlc3Npb25JZCk7CisJCQlwcm9hbV9pbmZvLmNoYW5uZWxDaGFuZ2VSZXNwRXZlbnQtPmNoYW5uZWxDaGFuZ2VTdGF0dXMgPQorCQkJCTE7CisJCQlyb2FtUmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9DSEFOTkVMX0NIQU5HRV9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkJICAic2FwZGZzOiBSZWNlaXZlZCBmYWlsdXJlIGVXTklfU01FX0NIQU5ORUxfQ0hBTkdFX1JTUCBmb3Igc2Vzc2lvbklkWyVkXSIsCisJCQkJICBTZXNzaW9uSWQpOworCQkJcHJvYW1faW5mby5jaGFubmVsQ2hhbmdlUmVzcEV2ZW50LT5jaGFubmVsQ2hhbmdlU3RhdHVzID0KKwkJCQkwOworCQkJcm9hbVJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfQ0hBTk5FTF9DSEFOR0VfRkFJTFVSRTsKKwkJfQorCisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgU2Vzc2lvbklkLCAmcHJvYW1faW5mbywgMCwKKwkJCQkgICAgICAgZUNTUl9ST0FNX1NFVF9DSEFOTkVMX1JTUCwgcm9hbVJlc3VsdCk7CisKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiSW52YWxpZCBDaGFubmVsIENoYW5nZSBSZXNwIE1lc3NhZ2U6ICVkXG4iLAorCQkJc3RhdHVzKTsKKwl9CisJY2RmX21lbV9mcmVlKHByb2FtX2luZm8uY2hhbm5lbENoYW5nZVJlc3BFdmVudCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gc21lX3JvYW1fc3RhcnRfYmVhY29uX3JlcQorICAgXGJyaWVmIEFQSSB0byBJbmRpY2F0ZSBMSU0gdG8gc3RhcnQgQmVhY29uIFR4CisgICBcYWZ0ZXIgU0FQIENBQyBXYWl0IGlzIGNvbXBsZXRlZC4KKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorICAgXHBhcmFtIHNlc3Npb25JZCAtIHNlc3Npb24gSUQKKyAgIFxwYXJhbSBkZnNDYWNXYWl0U3RhdHVzIC0gQ0FDIFdBSVQgc3RhdHVzIGZsYWcKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3JvYW1fc3RhcnRfYmVhY29uX3JlcSh0SGFsSGFuZGxlIGhIYWwsIHN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzaWQsCisJCQkJICAgICB1aW50OF90IGRmc0NhY1dhaXRTdGF0dXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gY3NyX3JvYW1fc3RhcnRfYmVhY29uX3JlcShwTWFjLCBic3NpZCwgZGZzQ2FjV2FpdFN0YXR1cyk7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gc21lX3JvYW1fY3NhX2llX3JlcXVlc3QKKyAgIFxicmllZiBBUEkgdG8gcmVxdWVzdCBDU0EgSUUgdHJhbnNtaXNzaW9uIGZyb20gUEUKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorICAgXHBhcmFtIHBEZnNDc2FSZXEgLSBDU0EgSUUgcmVxdWVzdAorICAgXHBhcmFtIGJzc2lkIC0gU0FQIGJzc2lkCisgICBccGFyYW0gY2hfYmFuZHdpZHRoIC0gQ2hhbm5lbCBvZmZzZXQKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3JvYW1fY3NhX2llX3JlcXVlc3QodEhhbEhhbmRsZSBoSGFsLCBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkLAorCQkJCXVpbnQ4X3QgdGFyZ2V0Q2hhbm5lbCwgdWludDhfdCBjc2FJZVJlcWQsCisJCQkJdWludDhfdCBjaF9iYW5kd2lkdGgpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGNzcl9yb2FtX3NlbmRfY2hhbl9zd19pZV9yZXF1ZXN0KHBNYWMsIGJzc2lkLCB0YXJnZXRDaGFubmVsLAorCQkJCWNzYUllUmVxZCwgY2hfYmFuZHdpZHRoKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfaW5pdF90aGVybWFsX2luZm8KKyAgICBcYnJpZWYgIFNNRSBBUEkgdG8gaW5pdGlhbGl6ZSB0aGUgdGhlcm1hbCBtaXRpZ2F0aW9uIHBhcmFtZXRlcnMKKyAgICBccGFyYW0gIGhIYWwKKyAgICBccGFyYW0gIHRoZXJtYWxQYXJhbSA6IHRoZXJtYWwgbWl0aWdhdGlvbiBwYXJhbWV0ZXJzCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVUworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfaW5pdF90aGVybWFsX2luZm8odEhhbEhhbmRsZSBoSGFsLCB0U21lVGhlcm1hbFBhcmFtcyB0aGVybWFsUGFyYW0pCit7CisJdF90aGVybWFsX21nbXQgKnBXbWFQYXJhbTsKKwljZHNfbXNnX3QgbXNnOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCXBXbWFQYXJhbSA9ICh0X3RoZXJtYWxfbWdtdCAqKSBjZGZfbWVtX21hbGxvYyhzaXplb2YodF90aGVybWFsX21nbXQpKTsKKwlpZiAoTlVMTCA9PSBwV21hUGFyYW0pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogY291bGQgbm90IGFsbG9jYXRlIHRUaGVybWFsTWdtdCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX3plcm8oKHZvaWQgKilwV21hUGFyYW0sIHNpemVvZih0X3RoZXJtYWxfbWdtdCkpOworCisJcFdtYVBhcmFtLT50aGVybWFsTWdtdEVuYWJsZWQgPSB0aGVybWFsUGFyYW0uc21lVGhlcm1hbE1nbXRFbmFibGVkOworCXBXbWFQYXJhbS0+dGhyb3R0bGVQZXJpb2QgPSB0aGVybWFsUGFyYW0uc21lVGhyb3R0bGVQZXJpb2Q7CisJcFdtYVBhcmFtLT50aGVybWFsTGV2ZWxzWzBdLm1pblRlbXBUaHJlc2hvbGQgPQorCQl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1swXS5zbWVNaW5UZW1wVGhyZXNob2xkOworCXBXbWFQYXJhbS0+dGhlcm1hbExldmVsc1swXS5tYXhUZW1wVGhyZXNob2xkID0KKwkJdGhlcm1hbFBhcmFtLnNtZVRoZXJtYWxMZXZlbHNbMF0uc21lTWF4VGVtcFRocmVzaG9sZDsKKwlwV21hUGFyYW0tPnRoZXJtYWxMZXZlbHNbMV0ubWluVGVtcFRocmVzaG9sZCA9CisJCXRoZXJtYWxQYXJhbS5zbWVUaGVybWFsTGV2ZWxzWzFdLnNtZU1pblRlbXBUaHJlc2hvbGQ7CisJcFdtYVBhcmFtLT50aGVybWFsTGV2ZWxzWzFdLm1heFRlbXBUaHJlc2hvbGQgPQorCQl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1sxXS5zbWVNYXhUZW1wVGhyZXNob2xkOworCXBXbWFQYXJhbS0+dGhlcm1hbExldmVsc1syXS5taW5UZW1wVGhyZXNob2xkID0KKwkJdGhlcm1hbFBhcmFtLnNtZVRoZXJtYWxMZXZlbHNbMl0uc21lTWluVGVtcFRocmVzaG9sZDsKKwlwV21hUGFyYW0tPnRoZXJtYWxMZXZlbHNbMl0ubWF4VGVtcFRocmVzaG9sZCA9CisJCXRoZXJtYWxQYXJhbS5zbWVUaGVybWFsTGV2ZWxzWzJdLnNtZU1heFRlbXBUaHJlc2hvbGQ7CisJcFdtYVBhcmFtLT50aGVybWFsTGV2ZWxzWzNdLm1pblRlbXBUaHJlc2hvbGQgPQorCQl0aGVybWFsUGFyYW0uc21lVGhlcm1hbExldmVsc1szXS5zbWVNaW5UZW1wVGhyZXNob2xkOworCXBXbWFQYXJhbS0+dGhlcm1hbExldmVsc1szXS5tYXhUZW1wVGhyZXNob2xkID0KKwkJdGhlcm1hbFBhcmFtLnNtZVRoZXJtYWxMZXZlbHNbM10uc21lTWF4VGVtcFRocmVzaG9sZDsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSkpIHsKKwkJbXNnLnR5cGUgPSBXTUFfSU5JVF9USEVSTUFMX0lORk9fQ01EOworCQltc2cuYm9keXB0ciA9IHBXbWFQYXJhbTsKKworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgIChjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBOb3QgYWJsZSB0byBwb3N0IFdNQV9TRVRfVEhFUk1BTF9JTkZPX0NNRCB0byBXTUEhIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCWNkZl9tZW1fZnJlZShwV21hUGFyYW0pOworCQkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCWNkZl9tZW1fZnJlZShwV21hUGFyYW0pOworCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKK30KKworLyoqCisgKiBzbWVfYWRkX3NldF90aGVybWFsX2xldmVsX2NhbGxiYWNrKCkgLSBQbHVnIGluIHNldCB0aGVybWFsIGxldmVsIGNhbGxiYWNrCisgKiBAaGFsOglIYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3BlbgorICogQGNhbGxiYWNrOglzbWVfc2V0X3RoZXJtYWxfbGV2ZWxfY2FsbGJhY2sKKyAqCisgKiBQbHVnIGluIHNldCB0aGVybWFsIGxldmVsIGNhbGxiYWNrCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgc21lX2FkZF9zZXRfdGhlcm1hbF9sZXZlbF9jYWxsYmFjayh0SGFsSGFuZGxlIGhhbCwKKwkJc21lX3NldF90aGVybWFsX2xldmVsX2NhbGxiYWNrIGNhbGxiYWNrKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoYWwpOworCisJcE1hYy0+c21lLnNldF90aGVybWFsX2xldmVsX2NiID0gY2FsbGJhY2s7Cit9CisKKy8qKgorICogc21lX3NldF90aGVybWFsX2xldmVsKCkgLSBTTUUgQVBJIHRvIHNldCB0aGUgdGhlcm1hbCBtaXRpZ2F0aW9uIGxldmVsCisgKiBAaGFsOiAgICAgICAgIEhhbmRsZXIgdG8gSEFMCisgKiBAbGV2ZWw6ICAgICAgIFRoZXJtYWwgbWl0aWdhdGlvbiBsZXZlbAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9zZXRfdGhlcm1hbF9sZXZlbCh0SGFsSGFuZGxlIGhhbCwgdWludDhfdCBsZXZlbCkKK3sKKwljZHNfbXNnX3QgbXNnOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoYWwpOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSkpIHsKKwkJY2RmX21lbV9zZXQoJm1zZywgc2l6ZW9mKG1zZyksIDApOworCQltc2cudHlwZSA9IFdNQV9TRVRfVEhFUk1BTF9MRVZFTDsKKwkJbXNnLmJvZHl2YWwgPSBsZXZlbDsKKworCQljZGZfc3RhdHVzID0gIGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAgIiVzOiBOb3QgYWJsZSB0byBwb3N0IFdNQV9TRVRfVEhFUk1BTF9MRVZFTCB0byBXTUEhIiwKKwkJCQkgICBfX2Z1bmNfXyk7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBzbWVfdHhwb3dlcl9saW1pdAorICAgXGJyaWVmIFNNRSBBUEkgdG8gc2V0IHR4cG93ZXIgbGltaXRzCisgICBccGFyYW0gaEhhbAorICAgXHBhcmFtIHBzbWV0eCA6IHBvd2VyIGxpbWl0cyBmb3IgMmcvNWcKKyAgIFwtIHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3R4cG93ZXJfbGltaXQodEhhbEhhbmRsZSBoSGFsLCB0U2lyVHhQb3dlckxpbWl0ICpwc21ldHgpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9UWF9QT1dFUl9MSU1JVDsKKwkJY2RzX21lc3NhZ2UucmVzZXJ2ZWQgPSAwOworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gcHNtZXR4OworCisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogbm90IGFibGUgdG8gcG9zdCBXTUFfVFhfUE9XRVJfTElNSVQiLAorCQkJCSAgX19mdW5jX18pOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQljZGZfbWVtX2ZyZWUocHNtZXR4KTsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBzbWVfdXBkYXRlX2Nvbm5lY3RfZGVidWcodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXRfdmFsdWUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXBNYWMtPmZFbmFibGVEZWJ1Z0xvZyA9IHNldF92YWx1ZTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiAgICBzbWVfYXBfZGlzYWJsZV9pbnRyYV9ic3NfZndkCisKKyAgIFxicmllZgorICAgIFNNRSB3aWxsIHNlbmQgbWVzc2FnZSB0byBXTUEgdG8gc2V0IEludHJhIEJTUyBpbiB0eHJ4CisKKyAgIFxwYXJhbQorCisgICAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4KKworICAgIHNlc3Npb25JZCAtIHNlc3Npb24gaWQgKCB2ZGV2IGlkKQorCisgICAgZGlzYWJsZWZ3ZCAtIGJvb2wgdmFsdWUgdGhhdCBpbmRpY2F0ZSBkaXNhYmxlIGludHJhYnNzIGZ3ZCBkaXNhYmxlCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDREZfU1RBVFVTIHNtZV9hcF9kaXNhYmxlX2ludHJhX2Jzc19md2QodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJYm9vbCBkaXNhYmxlZndkKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlpbnQgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJdHBEaXNhYmxlSW50cmFCc3NGd2QgcFNhcERpc2FibGVJbnRyYUZ3ZCA9IE5VTEw7CisKKwkvKiBQcmVwYXJlIHRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gU01FLiAqLworCXBTYXBEaXNhYmxlSW50cmFGd2QgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodERpc2FibGVJbnRyYUJzc0Z3ZCkpOworCWlmIChOVUxMID09IHBTYXBEaXNhYmxlSW50cmFGd2QpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dQLCAiTWVtb3J5IEFsbG9jYXRpb24gRmFpbHVyZSEhISAlcyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX3plcm8ocFNhcERpc2FibGVJbnRyYUZ3ZCwgc2l6ZW9mKHREaXNhYmxlSW50cmFCc3NGd2QpKTsKKworCXBTYXBEaXNhYmxlSW50cmFGd2QtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwlwU2FwRGlzYWJsZUludHJhRndkLT5kaXNhYmxlaW50cmFic3Nmd2QgPSBkaXNhYmxlZndkOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCS8qIHNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisJCWNkc19tZXNzYWdlLmJvZHlwdHIgPSBwU2FwRGlzYWJsZUludHJhRndkOworCQljZHNfbWVzc2FnZS50eXBlID0gV01BX1NFVF9TQVBfSU5UUkFCU1NfRElTOworCQljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQljZGZfbWVtX2ZyZWUocFNhcERpc2FibGVJbnRyYUZ3ZCk7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIFxmbiBzbWVfc3RhdHNfZXh0X3JlZ2lzdGVyX2NhbGxiYWNrCisKKyAgIFxicmllZgorICAgYSBmdW5jdGlvbiBjYWxsZWQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIHRoYXQgc2VuZCB2ZW5kb3IgZXZlbnQgZm9yIHN0YXRzCisgICBleHQKKworICAgXHBhcmFtIGNhbGxiYWNrIC0gY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzbWVfc3RhdHNfZXh0X3JlZ2lzdGVyX2NhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwgU3RhdHNFeHRDYWxsYmFjayBjYWxsYmFjaykKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlwTWFjLT5zbWUuU3RhdHNFeHRDYWxsYmFjayA9IGNhbGxiYWNrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBcZm4gc21lX3N0YXRzX2V4dF9yZXF1ZXN0CisKKyAgIFxicmllZgorICAgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiBIREQgcmVjZWl2ZXMgU1RBVFMgRVhUIHZlbmRvciBjb21tYW5kIGZyb20gdXNlcnNwYWNlCisKKyAgIFxwYXJhbSBzZXNzaW9uSUQgLSB2ZGV2SUQgZm9yIHRoZSBzdGF0cyBleHQgcmVxdWVzdAorCisgICBccGFyYW0gaW5wdXQgLSBTdGF0cyBFeHQgUmVxdWVzdCBzdHJ1Y3R1cmUgcHRyCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0RGX1NUQVRVUyBzbWVfc3RhdHNfZXh0X3JlcXVlc3QodWludDhfdCBzZXNzaW9uX2lkLCB0cFN0YXRzRXh0UmVxdWVzdFJlcSBpbnB1dCkKK3sKKwljZHNfbXNnX3QgbXNnOworCXRwU3RhdHNFeHRSZXF1ZXN0IGRhdGE7CisJc2l6ZV90IGRhdGFfbGVuOworCisJZGF0YV9sZW4gPSBzaXplb2YodFN0YXRzRXh0UmVxdWVzdCkgKyBpbnB1dC0+cmVxdWVzdF9kYXRhX2xlbjsKKwlkYXRhID0gY2RmX21lbV9tYWxsb2MoZGF0YV9sZW4pOworCisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1femVybyhkYXRhLCBkYXRhX2xlbik7CisJZGF0YS0+dmRldl9pZCA9IHNlc3Npb25faWQ7CisJZGF0YS0+cmVxdWVzdF9kYXRhX2xlbiA9IGlucHV0LT5yZXF1ZXN0X2RhdGFfbGVuOworCWlmIChpbnB1dC0+cmVxdWVzdF9kYXRhX2xlbikgeworCQljZGZfbWVtX2NvcHkoZGF0YS0+cmVxdWVzdF9kYXRhLAorCQkJICAgICBpbnB1dC0+cmVxdWVzdF9kYXRhLCBpbnB1dC0+cmVxdWVzdF9kYXRhX2xlbik7CisJfQorCisJbXNnLnR5cGUgPSBXTUFfU1RBVFNfRVhUX1JFUVVFU1Q7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IGRhdGE7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV01BX1NUQVRTX0VYVF9SRVFVRVNUIG1lc3NhZ2UgdG8gV01BIiwKKwkJCSAgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUoZGF0YSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBcZm4gc21lX3N0YXRzX2V4dF9ldmVudAorCisgICBcYnJpZWYKKyAgIGEgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gU01FIHJlY2VpdmVkIGVXTklfU01FX1NUQVRTX0VYVF9FVkVOVAorICAgcmVzcG9uc2UgZnJvbSBXTUEKKworICAgXHBhcmFtIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgIFxwYXJhbSBwTXNnIC0gTWVzc2FnZSBib2R5IHBhc3NlZCBmcm9tIFdNQTsgaW5jbHVkZXMgTkFOIGhlYWRlcgorICAgXHJldHVybiBDREZfU1RBVFVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDREZfU1RBVFVTIHNtZV9zdGF0c19leHRfZXZlbnQodEhhbEhhbmRsZSBoSGFsLCB2b2lkICpwTXNnKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWlmIChOVUxMID09IHBNc2cpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiaW4gJXMgbXNnIHB0ciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPRzIsICJTTUU6IGVudGVyaW5nICVzIiwgX19mdW5jX18pOworCisJCWlmIChwTWFjLT5zbWUuU3RhdHNFeHRDYWxsYmFjaykgeworCQkJcE1hYy0+c21lLlN0YXRzRXh0Q2FsbGJhY2socE1hYy0+aEhkZCwKKwkJCQkJCSAgICh0cFN0YXRzRXh0RXZlbnQpIHBNc2cpOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfdXBkYXRlX2Rmc19zY2FuX21vZGUKKyAgICBcYnJpZWYgIFVwZGF0ZSBERlMgcm9hbSBzY2FuIG1vZGUKKwkgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhyb3VnaCBkeW5hbWljIHNldENvbmZpZyBjYWxsYmFjayBmdW5jdGlvbgorCSAgICB0byBjb25maWd1cmUgYWxsb3dERlNDaGFubmVsUm9hbS4KKyAgICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyAgICBccGFyYW0gIHNlc3Npb25JZCAtIFNlc3Npb24gSWRlbnRpZmllcgorICAgIFxwYXJhbSAgYWxsb3dERlNDaGFubmVsUm9hbSAtIERGUyByb2FtaW5nIHNjYW4gbW9kZSAwIChkaXNhYmxlKSwKKwkgICAgMSAocGFzc2l2ZSksIDIgKGFjdGl2ZSkKKyAgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyAtIFNNRSB1cGRhdGUgREZTIHJvYW1pbmcgc2NhbiBjb25maWcKKwkgICAgc3VjY2Vzc2Z1bGx5LgorCSAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGZhaWxlZCB0byB1cGRhdGUgREZTIHJvYW1pbmcgc2NhbiBjb25maWcuCisgICAgXHNhCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV91cGRhdGVfZGZzX3NjYW5fbW9kZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgICB1aW50OF90IGFsbG93REZTQ2hhbm5lbFJvYW0pCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJICAiTEZSIHJ1bnRpbWUgc3VjY2Vzc2Z1bGx5IHNldCBBbGxvd0RGU0NoYW5uZWxSb2FtIE1vZGUgdG8gIgorCQkJICAiJWQgLSBvbGQgdmFsdWUgaXMgJWQgLSByb2FtIHN0YXRlIGlzICVzIiwKKwkJCSAgYWxsb3dERlNDaGFubmVsUm9hbSwKKwkJCSAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5hbGxvd0RGU0NoYW5uZWxSb2FtLAorCQkJICBtYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlKHBNYWMtPnJvYW0uCisJCQkJCQkJICAgICBuZWlnaGJvclJvYW1JbmZvCisJCQkJCQkJICAgICBbc2Vzc2lvbklkXS4KKwkJCQkJCQkgICAgIG5laWdoYm9yUm9hbVN0YXRlKSk7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYWxsb3dERlNDaGFubmVsUm9hbSA9CisJCQlhbGxvd0RGU0NoYW5uZWxSb2FtOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNSb2FtT2ZmbG9hZFNjYW5FbmFibGVkKSB7CisJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJICAgICAgUk9BTV9TQ0FOX09GRkxPQURfVVBEQVRFX0NGRywKKwkJCQkgICAgICBSRUFTT05fUk9BTV9ERlNfU0NBTl9NT0RFX0NIQU5HRUQpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfZ2V0X2Rmc19zY2FuX21vZGUoKSAtIGdldCBERlMgcm9hbSBzY2FuIG1vZGUKKwkgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBjYWxsCisgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgICBccmV0dXJuIERGUyByb2FtaW5nIHNjYW4gbW9kZSAwIChkaXNhYmxlKSwgMSAocGFzc2l2ZSksIDIgKGFjdGl2ZSkKKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDhfdCBzbWVfZ2V0X2Rmc19zY2FuX21vZGUodEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5hbGxvd0RGU0NoYW5uZWxSb2FtOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiAgc21lX21vZGlmeV9hZGRfaWUKKyAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBzZW5kcyBtc2cgdG8gdXBkYXRlcyB0aGUgYWRkaXRpb25hbCBJRSBidWZmZXJzIGluIFBFCisgICBccGFyYW0gIGhIYWwgLSBnbG9iYWwgc3RydWN0dXJlCisgICBccGFyYW0gIHBNb2RpZnlJRSAtIHBvaW50ZXIgdG8gdE1vZGlmeUlFIHN0cnVjdHVyZQorICAgXHBhcmFtICB1cGRhdGVUeXBlIC0gdHlwZSBvZiBidWZmZXIKKyAgIFwtIHJldHVybiBTdWNjZXNzIG9yIGZhaWx1cmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX21vZGlmeV9hZGRfaWUodEhhbEhhbmRsZSBoSGFsLAorCQkJICAgICB0U2lyTW9kaWZ5SUUgKnBNb2RpZnlJRSwgZVVwZGF0ZUlFc1R5cGUgdXBkYXRlVHlwZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzdGF0dXMgPSBjc3Jfcm9hbV9tb2RpZnlfYWRkX2llcyhwTWFjLCBwTW9kaWZ5SUUsIHVwZGF0ZVR5cGUpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcZm4gIHNtZV91cGRhdGVfYWRkX2llCisgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gc2VuZHMgbXNnIHRvIHVwZGF0ZXMgdGhlIGFkZGl0aW9uYWwgSUUgYnVmZmVycyBpbiBQRQorICAgXHBhcmFtICBoSGFsIC0gZ2xvYmFsIHN0cnVjdHVyZQorICAgXHBhcmFtICBwVXBkYXRlSUUgLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0VXBkYXRlSUUKKyAgIFxwYXJhbSAgdXBkYXRlVHlwZSAtIHR5cGUgb2YgYnVmZmVyCisgICBcLSByZXR1cm4gU3VjY2VzcyBvciBmYWlsdXJlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV91cGRhdGVfYWRkX2llKHRIYWxIYW5kbGUgaEhhbCwKKwkJCSAgICAgdFNpclVwZGF0ZUlFICpwVXBkYXRlSUUsIGVVcGRhdGVJRXNUeXBlIHVwZGF0ZVR5cGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gY3NyX3JvYW1fdXBkYXRlX2FkZF9pZXMocE1hYywgcFVwZGF0ZUlFLCB1cGRhdGVUeXBlKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfc3RhX2luX21pZGRsZV9vZl9yb2FtaW5nCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBTVEEgaXMgaW4gdGhlIG1pZGRsZSBvZiByb2FtaW5nIHN0YXRlCisgICAgXHBhcmFtICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisgICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgIFwtIHJldHVybiB0cnVlIG9yIGZhbHNlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitib29sIHNtZV9zdGFfaW5fbWlkZGxlX29mX3JvYW1pbmcodEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlyZXQgPSBjc3JfbmVpZ2hib3JfbWlkZGxlX29mX3JvYW1pbmcoaEhhbCwgc2Vzc2lvbklkKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiBzbWVfdXBkYXRlX2RzY19wdG9fdXBfbWFwcGluZygpCisgKiBAaEhhbDogSEFMIGNvbnRleHQKKyAqIEBkc2NwbWFwcGluZzogcG9pbnRlciB0byBEU0NQIG1hcHBpbmcgc3RydWN0dXJlCisgKiBAc2Vzc2lvbklkOiBTTUUgc2Vzc2lvbiBpZAorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gdXBkYXRlIGRzY3AgbWFwcGluZworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV91cGRhdGVfZHNjX3B0b191cF9tYXBwaW5nKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJIHNtZV9Rb3NXbW1VcFR5cGUgKmRzY3BtYXBwaW5nLAorCQkJCQkgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVpbnQ4X3QgaSwgaiwgcGVTZXNzaW9uSWQ7CisJdENzclJvYW1TZXNzaW9uICpwQ3NyU2Vzc2lvbiA9IE5VTEw7CisJdHBQRVNlc3Npb24gcFNlc3Npb24gPSBOVUxMOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlwQ3NyU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCWlmIChwQ3NyU2Vzc2lvbiA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMKCJTZXNzaW9uIGxvb2t1cCBmYWlscyBmb3IgQ1NSIHNlc3Npb24iKSk7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICghQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgiSW52YWxpZCBzZXNzaW9uIElkICV1IiksIHNlc3Npb25JZCk7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcFNlc3Npb24gPSBwZV9maW5kX3Nlc3Npb25fYnlfYnNzaWQocE1hYywKKwkJCQlwQ3NyU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZC5ieXRlcywKKwkJCQkmcGVTZXNzaW9uSWQpOworCisJaWYgKHBTZXNzaW9uID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoIiBTZXNzaW9uIGxvb2t1cCBmYWlscyBmb3IgQlNTSUQiKSk7CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKCFwU2Vzc2lvbi0+UW9zTWFwU2V0LnByZXNlbnQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoIlFPUyBNYXBwaW5nIElFIG5vdCBwcmVzZW50IikpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgU01FX1FPU19XTU1fVVBfTUFYOyBpKyspIHsKKwkJZm9yIChqID0gcFNlc3Npb24tPlFvc01hcFNldC5kc2NwX3JhbmdlW2ldWzBdOworCQkJaiA8PSBwU2Vzc2lvbi0+UW9zTWFwU2V0LmRzY3BfcmFuZ2VbaV1bMV07CisJCQlqKyspIHsKKwkJCWlmICgocFNlc3Npb24tPlFvc01hcFNldC5kc2NwX3JhbmdlW2ldWzBdID09IDI1NSkKKwkJCQkmJiAocFNlc3Npb24tPlFvc01hcFNldC5kc2NwX3JhbmdlW2ldWzFdID09CisJCQkJCQkJMjU1KSkgeworCQkJCWRzY3BtYXBwaW5nW2pdID0gMDsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJRkwoIlVzZXIgUHJpb3JpdHkgJWQgaXNuJ3QgdXNlZCIpLCBpKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJZHNjcG1hcHBpbmdbal0gPSBpOworCQkJfQorCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBwU2Vzc2lvbi0+UW9zTWFwU2V0Lm51bV9kc2NwX2V4Y2VwdGlvbnM7IGkrKykKKwkJaWYgKHBTZXNzaW9uLT5Rb3NNYXBTZXQuZHNjcF9leGNlcHRpb25zW2ldWzBdICE9IDI1NSkKKwkJCWRzY3BtYXBwaW5nW3BTZXNzaW9uLT5Rb3NNYXBTZXQuZHNjcF9leGNlcHRpb25zW2ldWzBdXSA9CisJCQkJcFNlc3Npb24tPlFvc01hcFNldC5kc2NwX2V4Y2VwdGlvbnNbaV1bMV07CisKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2Fib3J0X3JvYW1fc2NhbgorICAgIFxicmllZiAgQVBJIHRvIGFib3J0IGN1cnJlbnQgcm9hbSBzY2FuIGN5Y2xlIGJ5IHJvYW0gc2NhbiBvZmZsb2FkIG1vZHVsZS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgIFxwYXJhbSAgc2Vzc2lvbklkIC0gU2Vzc2lvbiBJZGVudGlmaWVyCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitDREZfU1RBVFVTIHNtZV9hYm9ydF9yb2FtX3NjYW4odEhhbEhhbmRsZSBoSGFsLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzbXNfbG9nKHBNYWMsIExPR1csICJlbnRlcmluZyBmdW5jdGlvbiAlcyIsIF9fZnVuY19fKTsKKwlpZiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQpIHsKKwkJLyogYWNxdWlyZSB0aGUgbG9jayBmb3IgdGhlIHNtZSBvYmplY3QgKi8KKwkJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJY3NyX3JvYW1fb2ZmbG9hZF9zY2FuKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJICAgICAgUk9BTV9TQ0FOX09GRkxPQURfQUJPUlRfU0NBTiwKKwkJCQkJICAgICAgUkVBU09OX1JPQU1fQUJPUlRfUk9BTV9TQ0FOKTsKKwkJCS8qIHJlbGVhc2UgdGhlIGxvY2sgZm9yIHRoZSBzbWUgb2JqZWN0ICovCisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorLyoqCisgKiBzbWVfZ2V0X3ZhbGlkX2NoYW5uZWxzX2J5X2JhbmQoKSAtIHRvIGZldGNoIHZhbGlkIGNoYW5uZWxzIGZpbHRlcmVkIGJ5IGJhbmQKKyAqIEBoSGFsOiBIQUwgY29udGV4dAorICogQHdpZmlCYW5kOiBSRiBiYW5kIGluZm9ybWF0aW9uCisgKiBAYVZhbGlkQ2hhbm5lbHM6IG91dHB1dCBhcnJheSB0byBzdG9yZSBjaGFubmVsIGluZm8KKyAqIEBwTnVtQ2hhbm5lbHM6IG91dHB1dCBudW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiAgU01FIEFQSSB0byBmZXRjaCBhbGwgdmFsaWQgY2hhbm5lbHMgZmlsdGVyZWQgYnkgYmFuZAorICoKKyAqICBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfZ2V0X3ZhbGlkX2NoYW5uZWxzX2J5X2JhbmQodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgIHVpbnQ4X3Qgd2lmaUJhbmQsCisJCQkJCSAgdWludDMyX3QgKmFWYWxpZENoYW5uZWxzLAorCQkJCQkgIHVpbnQ4X3QgKnBOdW1DaGFubmVscykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl1aW50OF90IGNoYW5MaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl0gPSB7IDAgfTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJdWludDhfdCBudW1DaGFubmVscyA9IDA7CisJdWludDhfdCBpID0gMDsKKwl1aW50MzJfdCB0b3RWYWxpZENoYW5uZWxzID0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOOworCisJaWYgKCFhVmFsaWRDaGFubmVscyB8fCAhcE51bUNoYW5uZWxzKSB7CisJCXNtc19sb2cocE1hYywgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIk91dHB1dCBjaGFubmVsIGxpc3QvTnVtQ2hhbm5lbHMgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwlpZiAoKHdpZmlCYW5kIDwgV0lGSV9CQU5EX1VOU1BFQ0lGSUVEKSB8fCAod2lmaUJhbmQgPj0gV0lGSV9CQU5EX01BWCkpIHsKKwkJc21zX2xvZyhwTWFjLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiSW52YWxpZCB3aWZpQmFuZCAoJWQpIiksIHdpZmlCYW5kKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwlzdGF0dXMgPSBzbWVfZ2V0X2NmZ192YWxpZF9jaGFubmVscyhoSGFsLCAmY2hhbkxpc3RbMF0sCisJCQkmdG90VmFsaWRDaGFubmVscyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCUZMKCJGYWlsIHRvIGdldCB2YWxpZCBjaGFubmVsIGxpc3QgKGVycj0lZCkiKSwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzd2l0Y2ggKHdpZmlCYW5kKSB7CisJY2FzZSBXSUZJX0JBTkRfVU5TUEVDSUZJRUQ6CisJCXNtc19sb2cocE1hYywgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQlGTCgiVW5zcGVjIEJhbmQsIHJldHVybiBhbGwgKCVkKSB2YWxpZCBjaGFubmVscyIpLAorCQkJdG90VmFsaWRDaGFubmVscyk7CisJCW51bUNoYW5uZWxzID0gdG90VmFsaWRDaGFubmVsczsKKwkJZm9yIChpID0gMDsgaSA8IHRvdFZhbGlkQ2hhbm5lbHM7IGkrKykgeworCQkJYVZhbGlkQ2hhbm5lbHNbaV0gPSBjZHNfY2hhbl90b19mcmVxKGNoYW5MaXN0W2ldKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgV0lGSV9CQU5EX0JHOgorCQlzbXNfbG9nKHBNYWMsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJRkwoIldJRklfQkFORF9CRyAoMi40IEdIeikiKSk7CisJCWZvciAoaSA9IDA7IGkgPCB0b3RWYWxpZENoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChDRFNfSVNfQ0hBTk5FTF8yNEdIWihjaGFuTGlzdFtpXSkpIHsKKwkJCQlhVmFsaWRDaGFubmVsc1tudW1DaGFubmVscysrXSA9CisJCQkJCWNkc19jaGFuX3RvX2ZyZXEoY2hhbkxpc3RbaV0pOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBXSUZJX0JBTkRfQToKKwkJc21zX2xvZyhwTWFjLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCUZMKCJXSUZJX0JBTkRfQSAoNSBHSHogd2l0aG91dCBERlMpIikpOworCQlmb3IgKGkgPSAwOyBpIDwgdG90VmFsaWRDaGFubmVsczsgaSsrKSB7CisJCQlpZiAoQ0RTX0lTX0NIQU5ORUxfNUdIWihjaGFuTGlzdFtpXSkgJiYKKwkJCSAgICAhQ0RTX0lTX0RGU19DSChjaGFuTGlzdFtpXSkpIHsKKwkJCQlhVmFsaWRDaGFubmVsc1tudW1DaGFubmVscysrXSA9CisJCQkJCWNkc19jaGFuX3RvX2ZyZXEoY2hhbkxpc3RbaV0pOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBXSUZJX0JBTkRfQUJHOgorCQlzbXNfbG9nKHBNYWMsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJRkwoIldJRklfQkFORF9BQkcgKDIuNCBHSHogKyA1IEdIejsgbm8gREZTKSIpKTsKKwkJZm9yIChpID0gMDsgaSA8IHRvdFZhbGlkQ2hhbm5lbHM7IGkrKykgeworCQkJaWYgKChDRFNfSVNfQ0hBTk5FTF8yNEdIWihjaGFuTGlzdFtpXSkgfHwKKwkJCSAgICAgQ0RTX0lTX0NIQU5ORUxfNUdIWihjaGFuTGlzdFtpXSkpICYmCisJCQkgICAgIUNEU19JU19ERlNfQ0goY2hhbkxpc3RbaV0pKSB7CisJCQkJYVZhbGlkQ2hhbm5lbHNbbnVtQ2hhbm5lbHMrK10gPQorCQkJCQljZHNfY2hhbl90b19mcmVxKGNoYW5MaXN0W2ldKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgV0lGSV9CQU5EX0FfREZTX09OTFk6CisJCXNtc19sb2cocE1hYywgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQlGTCgiV0lGSV9CQU5EX0FfREZTICg1IEdIeiBERlMgb25seSkiKSk7CisJCWZvciAoaSA9IDA7IGkgPCB0b3RWYWxpZENoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChDRFNfSVNfQ0hBTk5FTF81R0haKGNoYW5MaXN0W2ldKSAmJgorCQkJICAgIENEU19JU19ERlNfQ0goY2hhbkxpc3RbaV0pKSB7CisJCQkJYVZhbGlkQ2hhbm5lbHNbbnVtQ2hhbm5lbHMrK10gPQorCQkJCQljZHNfY2hhbl90b19mcmVxKGNoYW5MaXN0W2ldKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgV0lGSV9CQU5EX0FfV0lUSF9ERlM6CisJCXNtc19sb2cocE1hYywgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQlGTCgiV0lGSV9CQU5EX0FfV0lUSF9ERlMgKDUgR0h6IHdpdGggREZTKSIpKTsKKwkJZm9yIChpID0gMDsgaSA8IHRvdFZhbGlkQ2hhbm5lbHM7IGkrKykgeworCQkJaWYgKENEU19JU19DSEFOTkVMXzVHSFooY2hhbkxpc3RbaV0pKSB7CisJCQkJYVZhbGlkQ2hhbm5lbHNbbnVtQ2hhbm5lbHMrK10gPQorCQkJCQljZHNfY2hhbl90b19mcmVxKGNoYW5MaXN0W2ldKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgV0lGSV9CQU5EX0FCR19XSVRIX0RGUzoKKwkJc21zX2xvZyhwTWFjLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCUZMKCJXSUZJX0JBTkRfQUJHX1dJVEhfREZTICgyLjQgR0h6KzUgR0h6IHdpdGggREZTKSIpKTsKKwkJZm9yIChpID0gMDsgaSA8IHRvdFZhbGlkQ2hhbm5lbHM7IGkrKykgeworCQkJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKGNoYW5MaXN0W2ldKSB8fAorCQkJICAgIENEU19JU19DSEFOTkVMXzVHSFooY2hhbkxpc3RbaV0pKSB7CisJCQkJYVZhbGlkQ2hhbm5lbHNbbnVtQ2hhbm5lbHMrK10gPQorCQkJCQljZHNfY2hhbl90b19mcmVxKGNoYW5MaXN0W2ldKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXNtc19sb2cocE1hYywgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIlVua25vd24gd2lmaUJhbmQgKCVkKSkiKSwgd2lmaUJhbmQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCQlicmVhazsKKwl9CisJKnBOdW1DaGFubmVscyA9IG51bUNoYW5uZWxzOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9leHRfc2Nhbl9nZXRfY2FwYWJpbGl0aWVzCisgICAgXGJyaWVmICBTTUUgQVBJIHRvIGZldGNoIGV4dHNjYW4gY2FwYWJpbGl0aWVzCisgICAgXHBhcmFtICBoSGFsCisgICAgXHBhcmFtICBwUmVxOiBleHRzY2FuIGNhcGFiaWxpdGllcyBzdHJ1Y3R1cmUKKyAgIFwtIHJldHVybiBDREZfU1RBVFVTCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9leHRfc2Nhbl9nZXRfY2FwYWJpbGl0aWVzKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJIHRTaXJHZXRFeHRTY2FuQ2FwYWJpbGl0aWVzUmVxUGFyYW1zICoKKwkJCQkJIHBSZXEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJLyogU2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwkJY2RzX21lc3NhZ2UuYm9keXB0ciA9IHBSZXE7CisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX1JFUTsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9leHRfc2Nhbl9zdGFydAorICAgIFxicmllZiAgU01FIEFQSSB0byBpc3N1ZSBleHRzY2FuIHN0YXJ0CisgICAgXHBhcmFtICBoSGFsCisgICAgXHBhcmFtICBwU3RhcnRDbWQ6IGV4dHNjYW4gc3RhcnQgc3RydWN0dXJlCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVUworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfZXh0X3NjYW5fc3RhcnQodEhhbEhhbmRsZSBoSGFsLAorCQkJICAgICAgdFNpcldpZmlTY2FuQ21kUmVxUGFyYW1zICpwU3RhcnRDbWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJLyogU2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwkJY2RzX21lc3NhZ2UuYm9keXB0ciA9IHBTdGFydENtZDsKKwkJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9FWFRTQ0FOX1NUQVJUX1JFUTsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9leHRfc2Nhbl9zdG9wCisgICAgXGJyaWVmICBTTUUgQVBJIHRvIGlzc3VlIGV4dHNjYW4gc3RvcAorICAgIFxwYXJhbSAgaEhhbAorICAgIFxwYXJhbSAgcFN0b3BSZXE6IGV4dHNjYW4gc3RvcCBzdHJ1Y3R1cmUKKyAgIFwtIHJldHVybiBDREZfU1RBVFVTCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9leHRfc2Nhbl9zdG9wKHRIYWxIYW5kbGUgaEhhbCwgdFNpckV4dFNjYW5TdG9wUmVxUGFyYW1zICpwU3RvcFJlcSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkvKiBTZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gcFN0b3BSZXE7CisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfRVhUU0NBTl9TVE9QX1JFUTsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfc2V0X2Jzc19ob3RsaXN0CisgICAgXGJyaWVmICBTTUUgQVBJIHRvIHNldCBCU1NJRCBob3RsaXN0CisgICAgXHBhcmFtICBoSGFsCisgICAgXHBhcmFtICBwU2V0SG90TGlzdFJlcTogZXh0c2NhbiBzZXQgaG90bGlzdCBzdHJ1Y3R1cmUKKyAgIFwtIHJldHVybiBDREZfU1RBVFVTCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zZXRfYnNzX2hvdGxpc3QodEhhbEhhbmRsZSBoSGFsLAorCQkJICAgICAgIHRTaXJFeHRTY2FuU2V0QnNzaWRIb3RMaXN0UmVxUGFyYW1zICoKKwkJCSAgICAgICBwU2V0SG90TGlzdFJlcSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkvKiBTZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gcFNldEhvdExpc3RSZXE7CisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfRVhUU0NBTl9TRVRfQlNTSURfSE9UTElTVF9SRVE7CisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfcmVzZXRfYnNzX2hvdGxpc3QKKyAgICBcYnJpZWYgIFNNRSBBUEkgdG8gcmVzZXQgQlNTSUQgaG90bGlzdAorICAgIFxwYXJhbSAgaEhhbAorICAgIFxwYXJhbSAgcFNldEhvdExpc3RSZXE6IGV4dHNjYW4gc2V0IGhvdGxpc3Qgc3RydWN0dXJlCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVUworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcmVzZXRfYnNzX2hvdGxpc3QodEhhbEhhbmRsZSBoSGFsLAorCQkJCSB0U2lyRXh0U2NhblJlc2V0QnNzaWRIb3RsaXN0UmVxUGFyYW1zICoKKwkJCQkgcFJlc2V0UmVxKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCS8qIFNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisJCWNkc19tZXNzYWdlLmJvZHlwdHIgPSBwUmVzZXRSZXE7CisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfRVhUU0NBTl9SRVNFVF9CU1NJRF9IT1RMSVNUX1JFUTsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfc2lnbmlmaWNhbnRfY2hhbmdlCisgICAgXGJyaWVmICBTTUUgQVBJIHRvIHNldCBzaWduaWZpY2FudCBjaGFuZ2UKKyAgICBccGFyYW0gIGhIYWwKKyAgICBccGFyYW0gIHBTZXRTaWduaWZpY2FudENoYW5nZVJlcTogZXh0c2NhbiBzZXQgc2lnbmlmaWNhbnQgY2hhbmdlIHN0cnVjdHVyZQorICAgXC0gcmV0dXJuIENERl9TVEFUVVMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9zaWduaWZpY2FudF9jaGFuZ2UodEhhbEhhbmRsZSBoSGFsLAorCQkJCSAgICAgIHRTaXJFeHRTY2FuU2V0U2lnQ2hhbmdlUmVxUGFyYW1zICoKKwkJCQkgICAgICBwU2V0U2lnbmlmaWNhbnRDaGFuZ2VSZXEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJLyogU2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwkJY2RzX21lc3NhZ2UuYm9keXB0ciA9IHBTZXRTaWduaWZpY2FudENoYW5nZVJlcTsKKwkJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9FWFRTQ0FOX1NFVF9TSUdORl9DSEFOR0VfUkVROworCQljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3Jlc2V0X3NpZ25pZmljYW50X2NoYW5nZQorICAgIFxicmllZiAgU01FIEFQSSB0byByZXNldCBzaWduaWZpY2FudCBjaGFuZ2UKKyAgICBccGFyYW0gIGhIYWwKKyAgICBccGFyYW0gIHBSZXNldFJlcTogZXh0c2NhbiByZXNldCBzaWduaWZpY2FudCBjaGFuZ2Ugc3RydWN0dXJlCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVUworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcmVzZXRfc2lnbmlmaWNhbnRfY2hhbmdlKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJdFNpckV4dFNjYW5SZXNldFNpZ25pZmljYW50Q2hhbmdlUmVxUGFyYW1zCisJCQkJCSpwUmVzZXRSZXEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJLyogU2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwkJY2RzX21lc3NhZ2UuYm9keXB0ciA9IHBSZXNldFJlcTsKKwkJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9FWFRTQ0FOX1JFU0VUX1NJR05GX0NIQU5HRV9SRVE7CisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfZ2V0X2NhY2hlZF9yZXN1bHRzCisgICAgXGJyaWVmICBTTUUgQVBJIHRvIGdldCBjYWNoZWQgcmVzdWx0cworICAgIFxwYXJhbSAgaEhhbAorICAgIFxwYXJhbSAgcENhY2hlZFJlc3VsdHNSZXE6IGV4dHNjYW4gZ2V0IGNhY2hlZCByZXN1bHRzIHN0cnVjdHVyZQorICAgXC0gcmV0dXJuIENERl9TVEFUVVMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2dldF9jYWNoZWRfcmVzdWx0cyh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICB0U2lyRXh0U2NhbkdldENhY2hlZFJlc3VsdHNSZXFQYXJhbXMgKgorCQkJCSAgcENhY2hlZFJlc3VsdHNSZXEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJLyogU2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwkJY2RzX21lc3NhZ2UuYm9keXB0ciA9IHBDYWNoZWRSZXN1bHRzUmVxOworCQljZHNfbWVzc2FnZS50eXBlID0gV01BX0VYVFNDQU5fR0VUX0NBQ0hFRF9SRVNVTFRTX1JFUTsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfc2V0X2Vwbm9fbGlzdCgpIC0gc2V0IGVwbm8gbmV0d29yayBsaXN0CisgKiBAaEhhbDogZ2xvYmFsIGhhbCBoYW5kbGUKKyAqIEBpbnB1dDogcmVxdWVzdCBtZXNzYWdlCisgKgorICogVGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIHRoZSBjZHMgbWVzc2FnZSBhbmQgZmlsbCBpbiBtZXNzYWdlIHR5cGUsCisgKiBib2R5cHRyIHdpdGggJWlucHV0IGFuZCBwb3N0cyBpdCB0byBXREEgcXVldWUuCisgKgorICogUmV0dXJuOiBlSGFsU3RhdHVzIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgc21lX3NldF9lcG5vX2xpc3QodEhhbEhhbmRsZSBoYWwsCisJCQkJc3RydWN0IHdpZmlfZXBub19wYXJhbXMgKmlucHV0KQoreworCUNERl9TVEFUVVMgc3RhdHVzICAgID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIG1hYyAgID0gUE1BQ19TVFJVQ1QoaGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJc3RydWN0IHdpZmlfZXBub19wYXJhbXMgKnJlcV9tc2c7CisJaW50IGxlbiwgaTsKKworCXNtc19sb2cobWFjLCBMT0cxLCBGTCgiZW50ZXIiKSk7CisJbGVuID0gc2l6ZW9mKCpyZXFfbXNnKSArCisJCShpbnB1dC0+bnVtX25ldHdvcmtzICogc2l6ZW9mKHN0cnVjdCB3aWZpX2Vwbm9fbmV0d29yaykpOworCXJlcV9tc2cgPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCWlmICghcmVxX21zZykgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX3plcm8ocmVxX21zZywgbGVuKTsKKwlyZXFfbXNnLT5udW1fbmV0d29ya3MgPSBpbnB1dC0+bnVtX25ldHdvcmtzOworCXJlcV9tc2ctPnJlcXVlc3RfaWQgPSBpbnB1dC0+cmVxdWVzdF9pZDsKKwlyZXFfbXNnLT5zZXNzaW9uX2lkID0gaW5wdXQtPnNlc3Npb25faWQ7CisJZm9yIChpID0gMDsgaSA8IHJlcV9tc2ctPm51bV9uZXR3b3JrczsgaSsrKSB7CisJCXJlcV9tc2ctPm5ldHdvcmtzW2ldLnJzc2lfdGhyZXNob2xkID0KKwkJCQlpbnB1dC0+bmV0d29ya3NbaV0ucnNzaV90aHJlc2hvbGQ7CisJCXJlcV9tc2ctPm5ldHdvcmtzW2ldLmZsYWdzID0gaW5wdXQtPm5ldHdvcmtzW2ldLmZsYWdzOworCQlyZXFfbXNnLT5uZXR3b3Jrc1tpXS5hdXRoX2JpdF9maWVsZCA9CisJCQkJaW5wdXQtPm5ldHdvcmtzW2ldLmF1dGhfYml0X2ZpZWxkOworCQlyZXFfbXNnLT5uZXR3b3Jrc1tpXS5zc2lkLmxlbmd0aCA9CisJCQkJaW5wdXQtPm5ldHdvcmtzW2ldLnNzaWQubGVuZ3RoOworCQljZGZfbWVtX2NvcHkocmVxX21zZy0+bmV0d29ya3NbaV0uc3NpZC5zc0lkLAorCQkJCWlucHV0LT5uZXR3b3Jrc1tpXS5zc2lkLnNzSWQsCisJCQkJcmVxX21zZy0+bmV0d29ya3NbaV0uc3NpZC5sZW5ndGgpOworCX0KKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLAorCQkJRkwoInNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrIGZhaWxlZCEoc3RhdHVzPSVkKSIpLAorCQkJc3RhdHVzKTsKKwkJY2RmX21lbV9mcmVlKHJlcV9tc2cpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIFNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisJY2RzX21lc3NhZ2UuYm9keXB0ciA9IHJlcV9tc2c7CisJY2RzX21lc3NhZ2UudHlwZSAgICA9IFdNQV9TRVRfRVBOT19MSVNUX1JFUTsKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJjZHNfbXFfcG9zdF9tZXNzYWdlIGZhaWxlZCEoZXJyPSVkKSIpLAorCQkJc3RhdHVzKTsKKwkJY2RmX21lbV9mcmVlKHJlcV9tc2cpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9zZXRfcGFzc3BvaW50X2xpc3QoKSAtIHNldCBwYXNzcG9pbnQgbmV0d29yayBsaXN0CisgKiBAaGFsOiBnbG9iYWwgaGFsIGhhbmRsZQorICogQGlucHV0OiByZXF1ZXN0IG1lc3NhZ2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgdGhlIGNkcyBtZXNzYWdlIGFuZCBmaWxsIGluIG1lc3NhZ2UgdHlwZSwKKyAqIGJvZHlwdHIgd2l0aCBAaW5wdXQgYW5kIHBvc3RzIGl0IHRvIFdEQSBxdWV1ZS4KKyAqCisgKiBSZXR1cm46IGVIYWxTdGF0dXMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyBzbWVfc2V0X3Bhc3Nwb2ludF9saXN0KHRIYWxIYW5kbGUgaGFsLAorCQkJCXN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKmlucHV0KQoreworCUNERl9TVEFUVVMgc3RhdHVzICA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBtYWMgPSBQTUFDX1NUUlVDVChoYWwpOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKwlzdHJ1Y3Qgd2lmaV9wYXNzcG9pbnRfcmVxICpyZXFfbXNnOworCWludCBsZW4sIGk7CisKKwlzbXNfbG9nKG1hYywgTE9HMSwgRkwoImVudGVyIikpOworCWxlbiA9IHNpemVvZigqcmVxX21zZykgKworCQkoaW5wdXQtPm51bV9uZXR3b3JrcyAqIHNpemVvZihzdHJ1Y3Qgd2lmaV9wYXNzcG9pbnRfbmV0d29yaykpOworCXJlcV9tc2cgPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCWlmICghcmVxX21zZykgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX3plcm8ocmVxX21zZywgbGVuKTsKKwlyZXFfbXNnLT5udW1fbmV0d29ya3MgPSBpbnB1dC0+bnVtX25ldHdvcmtzOworCXJlcV9tc2ctPnJlcXVlc3RfaWQgPSBpbnB1dC0+cmVxdWVzdF9pZDsKKwlyZXFfbXNnLT5zZXNzaW9uX2lkID0gaW5wdXQtPnNlc3Npb25faWQ7CisJZm9yIChpID0gMDsgaSA8IHJlcV9tc2ctPm51bV9uZXR3b3JrczsgaSsrKSB7CisJCXJlcV9tc2ctPm5ldHdvcmtzW2ldLmlkID0KKwkJCQlpbnB1dC0+bmV0d29ya3NbaV0uaWQ7CisJCWNkZl9tZW1fY29weShyZXFfbXNnLT5uZXR3b3Jrc1tpXS5yZWFsbSwKKwkJCQlpbnB1dC0+bmV0d29ya3NbaV0ucmVhbG0sCisJCQkJc3RybGVuKGlucHV0LT5uZXR3b3Jrc1tpXS5yZWFsbSkgKyAxKTsKKwkJY2RmX21lbV9jb3B5KHJlcV9tc2ctPm5ldHdvcmtzW2ldLnBsbW4sCisJCQkJaW5wdXQtPm5ldHdvcmtzW2ldLnBsbW4sCisJCQkJU0lSX1BBU1NQT0lOVF9QTE1OX0xFTik7CisJCWNkZl9tZW1fY29weShyZXFfbXNnLT5uZXR3b3Jrc1tpXS5yb2FtaW5nX2NvbnNvcnRpdW1faWRzLAorCQkJICAgICBpbnB1dC0+bmV0d29ya3NbaV0ucm9hbWluZ19jb25zb3J0aXVtX2lkcywKKwkJCXNpemVvZihyZXFfbXNnLT5uZXR3b3Jrc1tpXS5yb2FtaW5nX2NvbnNvcnRpdW1faWRzKSk7CisJfQorCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsCisJCQlGTCgic21lX2FjcXVpcmVfZ2xvYmFsX2xvY2sgZmFpbGVkIShzdGF0dXM9JWQpIiksCisJCQlzdGF0dXMpOworCQljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogU2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwljZHNfbWVzc2FnZS5ib2R5cHRyID0gcmVxX21zZzsKKwljZHNfbWVzc2FnZS50eXBlICAgID0gV01BX1NFVF9QQVNTUE9JTlRfTElTVF9SRVE7CisJc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsCisJCQlGTCgiY2RzX21xX3Bvc3RfbWVzc2FnZSBmYWlsZWQhKGVycj0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcmVzZXRfcGFzc3BvaW50X2xpc3QoKSAtIHJlc2V0IHBhc3Nwb2ludCBuZXR3b3JrIGxpc3QKKyAqIEBoSGFsOiBnbG9iYWwgaGFsIGhhbmRsZQorICogQGlucHV0OiByZXF1ZXN0IG1lc3NhZ2UKKyAqCisgKiBSZXR1cm46IGVIYWxTdGF0dXMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUyBzbWVfcmVzZXRfcGFzc3BvaW50X2xpc3QodEhhbEhhbmRsZSBoYWwsCisJCQkJICAgIHN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKmlucHV0KQoreworCUNERl9TVEFUVVMgc3RhdHVzICAgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgbWFjICA9IFBNQUNfU1RSVUNUKGhhbCk7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCXN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKnJlcV9tc2c7CisKKwlzbXNfbG9nKG1hYywgTE9HMSwgRkwoImVudGVyIikpOworCXJlcV9tc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnJlcV9tc2cpKTsKKwlpZiAoIXJlcV9tc2cpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJjZGZfbWVtX21hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV96ZXJvKHJlcV9tc2csIHNpemVvZigqcmVxX21zZykpOworCXJlcV9tc2ctPnJlcXVlc3RfaWQgPSBpbnB1dC0+cmVxdWVzdF9pZDsKKwlyZXFfbXNnLT5zZXNzaW9uX2lkID0gaW5wdXQtPnNlc3Npb25faWQ7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJzbWVfYWNxdWlyZV9nbG9iYWxfbG9jayBmYWlsZWQhKHN0YXR1cz0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBTZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCWNkc19tZXNzYWdlLmJvZHlwdHIgPSByZXFfbXNnOworCWNkc19tZXNzYWdlLnR5cGUgICAgPSBXTUFfUkVTRVRfUEFTU1BPSU5UX0xJU1RfUkVROworCXN0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLAorCQkJRkwoImNkc19tcV9wb3N0X21lc3NhZ2UgZmFpbGVkIShlcnI9JWQpIiksCisJCQlzdGF0dXMpOworCQljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX3NldF9zc2lkX2hvdGxpc3QoKSAtIFNldCB0aGUgU1NJRCBob3RsaXN0CisgKiBAaGFsOiBTTUUgaGFuZGxlCisgKiBAcmVxdWVzdDogc2V0IHNzaWQgaG90bGlzdCByZXF1ZXN0CisgKgorICogUmV0dXJuOiBlSGFsU3RhdHVzCisgKi8KK0NERl9TVEFUVVMKK3NtZV9zZXRfc3NpZF9ob3RsaXN0KHRIYWxIYW5kbGUgaGFsLAorCQkgICAgIHN0cnVjdCBzaXJfc2V0X3NzaWRfaG90bGlzdF9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCUNERl9TVEFUVVMgc3RhdHVzICAgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgbWFjID0gUE1BQ19TVFJVQ1QoaGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJc3RydWN0IHNpcl9zZXRfc3NpZF9ob3RsaXN0X3JlcXVlc3QgKnNldF9yZXE7CisKKwlzZXRfcmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpzZXRfcmVxKSk7CisJaWYgKCFzZXRfcmVxKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJKnNldF9yZXEgPSAqcmVxdWVzdDsKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCS8qIFNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisJCWNkc19tZXNzYWdlLmJvZHlwdHIgPSBzZXRfcmVxOworCQljZHNfbWVzc2FnZS50eXBlICAgID0gV01BX0VYVFNDQU5fU0VUX1NTSURfSE9UTElTVF9SRVE7CisJCXN0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJY2RmX21lbV9mcmVlKHNldF9yZXEpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwl9IGVsc2UgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJzbWVfYWNxdWlyZV9nbG9iYWxfbG9jayBmYWlsZWQhKHN0YXR1cz0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShzZXRfcmVxKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgc21lX2V4dF9zY2FuX3JlZ2lzdGVyX2NhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJICB2b2lkICgqcEV4dFNjYW5JbmRDYikodm9pZCAqLAorCQkJCQkJCQljb25zdCB1aW50MTZfdCwKKwkJCQkJCQkJdm9pZCAqKSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJcE1hYy0+c21lLnBFeHRTY2FuSW5kQ2IgPSBwRXh0U2NhbkluZENiOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworI2Vsc2UKK0NERl9TVEFUVVMgc21lX2V4dF9zY2FuX3JlZ2lzdGVyX2NhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwKKwkJICB2b2lkICgqcEV4dFNjYW5JbmRDYikodm9pZCAqLCBjb25zdCB1aW50MTZfdCwgdm9pZCAqKSkKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VYVFNDQU4gKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfbGxfc3RhdHNfY2xlYXJfcmVxCisgICAgXGJyaWVmICBTTUUgQVBJIHRvIGNsZWFyIExpbmsgTGF5ZXIgU3RhdGlzdGljcworICAgIFxwYXJhbSAgaEhhbAorICAgIFxwYXJhbSAgcGNsZWFyU3RhdHNSZXE6IExpbmsgTGF5ZXIgY2xlYXIgc3RhdHMgcmVxdWVzdCBwYXJhbXMgc3RydWN0dXJlCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVUworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfbGxfc3RhdHNfY2xlYXJfcmVxKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkgIHRTaXJMTFN0YXRzQ2xlYXJSZXEgKnBjbGVhclN0YXRzUmVxKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCXRTaXJMTFN0YXRzQ2xlYXJSZXEgKmNsZWFyX3N0YXRzX3JlcTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgInN0YUlkID0gJXUiLCBwY2xlYXJTdGF0c1JlcS0+c3RhSWQpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgInN0YXRzQ2xlYXJSZXFNYXNrID0gMHglWCIsCisJCSAgcGNsZWFyU3RhdHNSZXEtPnN0YXRzQ2xlYXJSZXFNYXNrKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICJzdG9wUmVxID0gJXUiLCBwY2xlYXJTdGF0c1JlcS0+c3RvcFJlcSk7CisKKwljbGVhcl9zdGF0c19yZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKmNsZWFyX3N0YXRzX3JlcSkpOworCisJaWYgKCFjbGVhcl9zdGF0c19yZXEpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBXTUFfTExfU1RBVFNfQ0xFQVJfUkVRIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCSpjbGVhcl9zdGF0c19yZXEgPSAqcGNsZWFyU3RhdHNSZXE7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpKSB7CisJCS8qIFNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisJCWNkc19tZXNzYWdlLmJvZHlwdHIgPSBjbGVhcl9zdGF0c19yZXE7CisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfTElOS19MQVlFUl9TVEFUU19DTEVBUl9SRVE7CisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogbm90IGFibGUgdG8gcG9zdCBXTUFfTExfU1RBVFNfQ0xFQVJfUkVRIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCWNkZl9tZW1fZnJlZShjbGVhcl9zdGF0c19yZXEpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogIgorCQkJICAic21lX2FjcXVpcmVfZ2xvYmFsX2xvY2sgZXJyb3IiLCBfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShjbGVhcl9zdGF0c19yZXEpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX2xsX3N0YXRzX3NldF9yZXEKKyAgICBcYnJpZWYgIFNNRSBBUEkgdG8gc2V0IHRoZSBMaW5rIExheWVyIFN0YXRpc3RpY3MKKyAgICBccGFyYW0gIGhIYWwKKyAgICBccGFyYW0gIHBzZXRTdGF0c1JlcTogTGluayBMYXllciBzZXQgc3RhdHMgcmVxdWVzdCBwYXJhbXMgc3RydWN0dXJlCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVUworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfbGxfc3RhdHNfc2V0X3JlcSh0SGFsSGFuZGxlIGhIYWwsIHRTaXJMTFN0YXRzU2V0UmVxICpwc2V0U3RhdHNSZXEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJdFNpckxMU3RhdHNTZXRSZXEgKnNldF9zdGF0c19yZXE7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogIE1QRFUgU2l6ZSA9ICV1IiwgX19mdW5jX18sCisJCSAgcHNldFN0YXRzUmVxLT5tcGR1U2l6ZVRocmVzaG9sZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiIEFnZ3Jlc3NpdmUgU3RhdHMgQ29sbGVjdGlvbnMgPSAldSIsCisJCSAgcHNldFN0YXRzUmVxLT5hZ2dyZXNzaXZlU3RhdGlzdGljc0dhdGhlcmluZyk7CisKKwlzZXRfc3RhdHNfcmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpzZXRfc3RhdHNfcmVxKSk7CisKKwlpZiAoIXNldF9zdGF0c19yZXEpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBXTUFfTExfU1RBVFNfU0VUX1JFUSIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwkqc2V0X3N0YXRzX3JlcSA9ICpwc2V0U3RhdHNSZXE7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpKSB7CisJCS8qIFNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisJCWNkc19tZXNzYWdlLmJvZHlwdHIgPSBzZXRfc3RhdHNfcmVxOworCQljZHNfbWVzc2FnZS50eXBlID0gV01BX0xJTktfTEFZRVJfU1RBVFNfU0VUX1JFUTsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBub3QgYWJsZSB0byBwb3N0IFdNQV9MTF9TVEFUU19TRVRfUkVRIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCWNkZl9tZW1fZnJlZShzZXRfc3RhdHNfcmVxKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6ICIKKwkJCSAgInNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrIGVycm9yIiwgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUoc2V0X3N0YXRzX3JlcSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfbGxfc3RhdHNfZ2V0X3JlcQorICAgIFxicmllZiAgU01FIEFQSSB0byBnZXQgdGhlIExpbmsgTGF5ZXIgU3RhdGlzdGljcworICAgIFxwYXJhbSAgaEhhbAorICAgIFxwYXJhbSAgcGdldFN0YXRzUmVxOiBMaW5rIExheWVyIGdldCBzdGF0cyByZXF1ZXN0IHBhcmFtcyBzdHJ1Y3R1cmUKKyAgIFwtIHJldHVybiBDREZfU1RBVFVTCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9sbF9zdGF0c19nZXRfcmVxKHRIYWxIYW5kbGUgaEhhbCwgdFNpckxMU3RhdHNHZXRSZXEgKnBnZXRTdGF0c1JlcSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKwl0U2lyTExTdGF0c0dldFJlcSAqZ2V0X3N0YXRzX3JlcTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgInJlcUlkID0gJXUiLCBwZ2V0U3RhdHNSZXEtPnJlcUlkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICJzdGFJZCA9ICV1IiwgcGdldFN0YXRzUmVxLT5zdGFJZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiU3RhdHMgVHlwZSA9ICV1IiwgcGdldFN0YXRzUmVxLT5wYXJhbUlkTWFzayk7CisKKwlnZXRfc3RhdHNfcmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpnZXRfc3RhdHNfcmVxKSk7CisKKwlpZiAoIWdldF9zdGF0c19yZXEpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBXTUFfTExfU1RBVFNfR0VUX1JFUSIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwkqZ2V0X3N0YXRzX3JlcSA9ICpwZ2V0U3RhdHNSZXE7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpKSB7CisJCS8qIFNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisJCWNkc19tZXNzYWdlLmJvZHlwdHIgPSBnZXRfc3RhdHNfcmVxOworCQljZHNfbWVzc2FnZS50eXBlID0gV01BX0xJTktfTEFZRVJfU1RBVFNfR0VUX1JFUTsKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1dNQSwgJmNkc19tZXNzYWdlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBub3QgYWJsZSB0byBwb3N0IFdNQV9MTF9TVEFUU19HRVRfUkVRIiwKKwkJCQkgIF9fZnVuY19fKTsKKworCQkJY2RmX21lbV9mcmVlKGdldF9zdGF0c19yZXEpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiAiCisJCQkgICJzbWVfYWNxdWlyZV9nbG9iYWxfbG9jayBlcnJvciIsIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKGdldF9zdGF0c19yZXEpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3NldF9saW5rX2xheWVyX3N0YXRzX2luZF9jYgorICAgIFxicmllZiAgU01FIEFQSSB0byB0cmlnZ2VyIHRoZSBzdGF0cyBhcmUgYXZhaWxhYmxlICBhZnRlciBnZXQgcmVxdWVzdAorICAgIFxwYXJhbSAgaEhhbAorICAgIFxwYXJhbSBjYWxsYmFja19yb3V0aW5lIC0gSEREIGNhbGxiYWNrIHdoaWNoIG5lZWRzIHRvIGJlIGludm9rZWQgYWZ0ZXIKKwkgICBnZXR0aW5nIHN0YXR1cyBub3RpZmljYXRpb24gZnJvbSBGVworICAgXC0gcmV0dXJuIENERl9TVEFUVVMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3NldF9saW5rX2xheWVyX3N0YXRzX2luZF9jYgorCSh0SGFsSGFuZGxlIGhIYWwsCisJdm9pZCAoKmNhbGxiYWNrX3JvdXRpbmUpKHZvaWQgKmNhbGxiYWNrQ3R4LCBpbnQgaW5kVHlwZSwgdm9pZCAqcFJzcCkKKwkpIHsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJcE1hYy0+c21lLnBMaW5rTGF5ZXJTdGF0c0luZENhbGxiYWNrID0gY2FsbGJhY2tfcm91dGluZTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogIgorCQkJICAic21lX2FjcXVpcmVfZ2xvYmFsX2xvY2sgZXJyb3IiLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICovCisKKy8qKgorICogc21lX2Z3X21lbV9kdW1wX3JlZ2lzdGVyX2NiKCkgLSBSZWdpc3RlciBmdyBtZW1vcnkgZHVtcCBjYWxsYmFjaworICoKKyAqIEBoYWwgLSBNQUMgZ2xvYmFsIGhhbmRsZQorICogQGNhbGxiYWNrX3JvdXRpbmUgLSBjYWxsYmFjayByb3V0aW5lIGZyb20gSERECisgKgorICogVGhpcyBBUEkgaXMgaW52b2tlZCBieSBIREQgdG8gcmVnaXN0ZXIgaXRzIGNhbGxiYWNrIGluIFNNRQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX01FTURVTVAKK0NERl9TVEFUVVMgc21lX2Z3X21lbV9kdW1wX3JlZ2lzdGVyX2NiKHRIYWxIYW5kbGUgaGFsLAorCQl2b2lkICgqY2FsbGJhY2tfcm91dGluZSkodm9pZCAqY2JfY29udGV4dCwKKwkJCQkJIHN0cnVjdCBmd19kdW1wX3JzcCAqcnNwKSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwbWFjID0gUE1BQ19TVFJVQ1QoaGFsKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwbWFjLT5zbWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCXBtYWMtPnNtZS5md19kdW1wX2NhbGxiYWNrID0gY2FsbGJhY2tfcm91dGluZTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBtYWMtPnNtZSk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJzbWVfYWNxdWlyZV9nbG9iYWxfbG9jayBlcnJvciIpKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorI2Vsc2UKK0NERl9TVEFUVVMgc21lX2Z3X21lbV9kdW1wX3JlZ2lzdGVyX2NiKHRIYWxIYW5kbGUgaGFsLAorCQl2b2lkICgqY2FsbGJhY2tfcm91dGluZSkodm9pZCAqY2JfY29udGV4dCwKKwkJCQkJIHN0cnVjdCBmd19kdW1wX3JzcCAqcnNwKSkKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9NRU1EVU1QICovCisKKy8qKgorICogc21lX2Z3X21lbV9kdW1wX3VucmVnaXN0ZXJfY2IoKSAtIFVucmVnaXN0ZXIgZncgbWVtb3J5IGR1bXAgY2FsbGJhY2sKKyAqCisgKiBAaEhhbCAtIE1BQyBnbG9iYWwgaGFuZGxlCisgKgorICogVGhpcyBBUEkgaXMgaW52b2tlZCBieSBIREQgdG8gdW5yZWdpc3RlciBpdHMgY2FsbGJhY2sgaW4gU01FCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTUVNRFVNUAorQ0RGX1NUQVRVUyBzbWVfZndfbWVtX2R1bXBfdW5yZWdpc3Rlcl9jYih0SGFsSGFuZGxlIGhhbCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0cEFuaVNpckdsb2JhbCBwbWFjID0gUE1BQ19TVFJVQ1QoaGFsKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwbWFjLT5zbWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCXBtYWMtPnNtZS5md19kdW1wX2NhbGxiYWNrID0gTlVMTDsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBtYWMtPnNtZSk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJzbWVfYWNxdWlyZV9nbG9iYWxfbG9jayBlcnJvciIpKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorI2Vsc2UKK0NERl9TVEFUVVMgc21lX2Z3X21lbV9kdW1wX3VucmVnaXN0ZXJfY2IodEhhbEhhbmRsZSBoYWwpCit7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTUVNRFVNUCAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV91cGRhdGVfcm9hbV9vZmZsb2FkX2VuYWJsZWQoKSAtIGVuYWJsZS9kaXNhYmxlIHJvYW0gb2ZmbG9hZCBmZWF1cmUKKyAgIEl0IGlzIHVzZWQgYXQgaW4gdGhlIFJFR19EWU5BTUlDX1ZBUklBQkxFIG1hY3JvIGRlZmluaXRpb24gb2YKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxwYXJhbSBuUm9hbU9mZmxvYWRFbmFibGVkIC0gVGhlIGJvb2wgdG8gdXBkYXRlIHdpdGgKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSBjb25maWcgc3VjY2Vzc2Z1bGx5LgorCSAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIHVwZGF0ZS4KKyAgIFxzYQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitDREZfU1RBVFVTIHNtZV91cGRhdGVfcm9hbV9vZmZsb2FkX2VuYWJsZWQodEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgICBib29sIG5Sb2FtT2ZmbG9hZEVuYWJsZWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICIlczogTEZSMzpnUm9hbU9mZmxvYWRFbmFibGVkIGlzIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCisJCQkgIF9fZnVuY19fLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzUm9hbU9mZmxvYWRFbmFibGVkLAorCQkJICBuUm9hbU9mZmxvYWRFbmFibGVkKTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc1JvYW1PZmZsb2FkRW5hYmxlZCA9CisJCQluUm9hbU9mZmxvYWRFbmFibGVkOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3VwZGF0ZV9yb2FtX2tleV9tZ210X29mZmxvYWRfZW5hYmxlZCgpIC0gZW5hYmxlL2Rpc2FibGUga2V5IG1nbXQKKwlvZmZsb2FkCisJVGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwKKyAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgIFxwYXJhbSAgc2Vzc2lvbklkIC0gU2Vzc2lvbiBJZGVudGlmaWVyCisgICBccGFyYW0gblJvYW1LZXlNZ210T2ZmbG9hZEVuYWJsZWQgLSBUaGUgYm9vbCB0byB1cGRhdGUgd2l0aAorICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIGNvbmZpZyBzdWNjZXNzZnVsbHkuCisJICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gdXBkYXRlLgorICAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9yb2FtX2tleV9tZ210X29mZmxvYWRfZW5hYmxlZCh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCQkgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCQkgICAgYm9vbCBuUm9hbUtleU1nbXRPZmZsb2FkRW5hYmxlZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAiJXM6IExGUjM6IEtleU1nbXRPZmZsb2FkRW5hYmxlZCBjaGFuZ2VkIHRvICVkIiwKKwkJCQkgIF9fZnVuY19fLCBuUm9hbUtleU1nbXRPZmZsb2FkRW5hYmxlZCk7CisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9zZXRfa2V5X21nbXRfb2ZmbG9hZChwTWFjLAorCQkJCQkJCSAgICAgICBzZXNzaW9uSWQsCisJCQkJCQkJICAgICAgIG5Sb2FtS2V5TWdtdE9mZmxvYWRFbmFibGVkKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBzbWVfZ2V0X3RlbXBlcmF0dXJlCisgICBcYnJpZWYgU01FIEFQSSB0byBnZXQgdGhlIHBkZXYgdGVtcGVyYXR1cmUKKyAgIFxwYXJhbSBoSGFsCisgICBccGFyYW0gdGVtcGVyYXR1cmUgY29udGV4dAorICAgXHBhcmFtIHBDYWxsYmFja2ZuOiBjYWxsYmFjayBmbiB3aXRoIHJlc3BvbnNlICh0ZW1wZXJhdHVyZSkKKyAgIFwtIHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX2dldF90ZW1wZXJhdHVyZSh0SGFsSGFuZGxlIGhIYWwsCisJCQkgICAgICAgdm9pZCAqdGVtcENvbnRleHQsCisJCQkgICAgICAgdm9pZCAoKnBDYWxsYmFja2ZuKShpbnQgdGVtcGVyYXR1cmUsCisJCQkJCQkgICB2b2lkICpwQ29udGV4dCkpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlpZiAoKE5VTEwgPT0gcENhbGxiYWNrZm4pICYmCisJCSAgICAoTlVMTCA9PSBwTWFjLT5zbWUucEdldFRlbXBlcmF0dXJlQ2IpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgIEZMCisJCQkJCSAgKCJJbmRpY2F0aW9uIENhbGwgYmFjayBkaWQgbm90IHJlZ2lzdGVyZWQiKSk7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfSBlbHNlIGlmIChOVUxMICE9IHBDYWxsYmFja2ZuKSB7CisJCQlwTWFjLT5zbWUucFRlbXBlcmF0dXJlQ2JDb250ZXh0ID0gdGVtcENvbnRleHQ7CisJCQlwTWFjLT5zbWUucEdldFRlbXBlcmF0dXJlQ2IgPSBwQ2FsbGJhY2tmbjsKKwkJfQorCQkvKiBzZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gTlVMTDsKKwkJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9HRVRfVEVNUEVSQVRVUkVfUkVROworCQljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTCgiUG9zdCBHZXQgVGVtcGVyYXR1cmUgbXNnIGZhaWwiKSk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfc2Nhbm5pbmdfbWFjX291aQorICAgIFxicmllZiAgU01FIEFQSSB0byBzZXQgc2Nhbm5pbmcgbWFjIG91aQorICAgIFxwYXJhbSAgaEhhbAorICAgIFxwYXJhbSAgcFNjYW5NYWNPdWk6IFNjYW5uaW5nIE1hYyBPdWkgKGlucHV0IDMgYnl0ZXMpCisgICBcLSByZXR1cm4gQ0RGX1NUQVRVUworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2V0X3NjYW5uaW5nX21hY19vdWkodEhhbEhhbmRsZSBoSGFsLCB0U2lyU2Nhbk1hY091aSAqcFNjYW5NYWNPdWkpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQkvKiBTZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS5ib2R5cHRyID0gcFNjYW5NYWNPdWk7CisJCWNkc19tZXNzYWdlLnR5cGUgPSBXTUFfU0VUX1NDQU5fTUFDX09VSV9SRVE7CisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgIEZMKCJNc2cgcG9zdCBTZXQgU2NhbiBNYWMgT1VJIGZhaWxlZCIpKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKKyNpZmRlZiBESENQX1NFUlZFUl9PRkZMT0FECisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3NldF9kaGNwX3Nydl9vZmZsb2FkCisgICAgXGJyaWVmICBTTUUgQVBJIHRvIHNldCBESENQIHNlcnZlciBvZmZsb2FkIGluZm8KKyAgICBccGFyYW0gIGhIYWwKKyAgICBccGFyYW0gIHBEaGNwU3J2SW5mbyA6IERIQ1Agc2VydmVyIG9mZmxvYWQgaW5mbyBzdHJ1Y3QKKyAgIFwtIHJldHVybiBDREZfU1RBVFVTCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9zZXRfZGhjcF9zcnZfb2ZmbG9hZCh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgIHRTaXJEaGNwU3J2T2ZmbG9hZEluZm8gKnBEaGNwU3J2SW5mbykKK3sKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJdFNpckRoY3BTcnZPZmZsb2FkSW5mbyAqcFNtZURoY3BTcnZJbmZvOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCXBTbWVEaGNwU3J2SW5mbyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcFNtZURoY3BTcnZJbmZvKSk7CisKKwlpZiAoIXBTbWVEaGNwU3J2SW5mbykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFdNQV9TRVRfREhDUF9TRVJWRVJfT0ZGTE9BRF9DTUQiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJKnBTbWVEaGNwU3J2SW5mbyA9ICpwRGhjcFNydkluZm87CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQkvKiBzZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCQljZHNfbWVzc2FnZS50eXBlID0gV01BX1NFVF9ESENQX1NFUlZFUl9PRkZMT0FEX0NNRDsKKwkJY2RzX21lc3NhZ2UuYm9keXB0ciA9IHBTbWVEaGNwU3J2SW5mbzsKKworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgIChjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmY2RzX21lc3NhZ2UpKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV01BX1NFVF9ESENQX1NFUlZFUl9PRkZMT0FEX0NNRCB0byBXTUEhIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCWNkZl9tZW1fZnJlZShwU21lRGhjcFNydkluZm8pOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2sgZXJyb3IhIiwgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUocFNtZURoY3BTcnZJbmZvKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIERIQ1BfU0VSVkVSX09GRkxPQUQgKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9HUElPX0xFRF9GTEFTSElORworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9zZXRfbGVkX2ZsYXNoaW5nCisgICAgXGJyaWVmICBBUEkgdG8gc2V0IHRoZSBMZWQgZmxhc2hpbmcgcGFyYW1ldGVycy4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgIFxwYXJhbSAgeDAsIHgxIC0gIGxlZCBmbGFzaGluZyBwYXJhbWV0ZXJzCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfc2V0X2xlZF9mbGFzaGluZyh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgdHlwZSwKKwkJCQl1aW50MzJfdCB4MCwgdWludDMyX3QgeDEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJdFNpckxlZEZsYXNoaW5nUmVxICpsZWRmbGFzaGluZzsKKworCWxlZGZsYXNoaW5nID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpsZWRmbGFzaGluZykpOworCWlmICghbGVkZmxhc2hpbmcpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMCisJCQkJICAoIk5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgV01BX0xFRF9USU1JTkdfUkVRIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWxlZGZsYXNoaW5nLT5wYXR0ZXJuX2lkID0gdHlwZTsKKwlsZWRmbGFzaGluZy0+bGVkX3gwID0geDA7CisJbGVkZmxhc2hpbmctPmxlZF94MSA9IHgxOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCS8qIFNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisJCWNkc19tZXNzYWdlLmJvZHlwdHIgPSBsZWRmbGFzaGluZzsKKwkJY2RzX21lc3NhZ2UudHlwZSA9IFdNQV9MRURfRkxBU0hJTkdfUkVROworCQljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisvKioKKyAqICBzbWVfaGFuZGxlX2RmU19jaGFuX3NjYW4oKSAtIGhhbmRsZSBERlMgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKiAgQGhfaGFsOiAgICAgICAgIGNvcmVzdGFjayBoYW5kbGVyCisgKiAgQGRmc19mbGFnOiAgICAgIGZsYWcgaW5kaWNhdGluZyBkZnMgY2hhbm5lbCBlbmFibGUvZGlzYWJsZQorICogIFJldHVybjogICAgICAgICBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX2hhbmRsZV9kZnNfY2hhbl9zY2FuKHRIYWxIYW5kbGUgaF9oYWwsIHVpbnQ4X3QgZGZzX2ZsYWcpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgbWFjICA9IFBNQUNfU1RSVUNUKGhfaGFsKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCisJCW1hYy0+c2Nhbi5mRW5hYmxlREZTQ2hubFNjYW4gPSBkZnNfZmxhZzsKKworCQkvKiB1cGRhdGUgdGhlIGNoYW5uZWwgbGlzdCB0byB0aGUgZmlybXdhcmUgKi8KKwkJc3RhdHVzID0gY3NyX3VwZGF0ZV9jaGFubmVsX2xpc3QobWFjKTsKKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgKiBzbWVfY29uZmlndXJlX3N0YXRzX2F2Z19mYWN0b3IoKSAtIGZ1bmN0aW9uIHRvIGNvbmZpZyBhdmcuIHN0YXRzIGZhY3RvcgorICogQGhhbDogaGFsCisgKiBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBJRAorICogQHN0YXRzX2F2Z19mYWN0b3I6IGF2ZXJhZ2Ugc3RhdHMgZmFjdG9yCisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBzdGF0cyBhdmcgZmFjdG9yIGluIGZpcm13YXJlCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX2NvbmZpZ3VyZV9zdGF0c19hdmdfZmFjdG9yKHRIYWxIYW5kbGUgaGFsLCB1aW50OF90IHNlc3Npb25faWQsCisJCQkJCSAgdWludDE2X3Qgc3RhdHNfYXZnX2ZhY3RvcikKK3sKKwljZHNfbXNnX3QgbXNnOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIG1hYyAgPSBQTUFDX1NUUlVDVChoYWwpOworCXN0cnVjdCBzaXJfc3RhdHNfYXZnX2ZhY3RvciAqc3RhdHNfZmFjdG9yOworCisJc3RhdHNfZmFjdG9yID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpzdGF0c19mYWN0b3IpKTsKKworCWlmICghc3RhdHNfZmFjdG9yKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgU0lSX0hBTF9DT05GSUdfU1RBVFNfRkFDVE9SIiwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCisJCXN0YXRzX2ZhY3Rvci0+dmRldl9pZCA9IHNlc3Npb25faWQ7CisJCXN0YXRzX2ZhY3Rvci0+c3RhdHNfYXZnX2ZhY3RvciA9IHN0YXRzX2F2Z19mYWN0b3I7CisKKwkJLyogc2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwkJbXNnLnR5cGUgICAgID0gU0lSX0hBTF9DT05GSUdfU1RBVFNfRkFDVE9SOworCQltc2cuYm9keXB0ciAgPSBzdGF0c19mYWN0b3I7CisKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoCisJCQkgICAgY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogTm90IGFibGUgdG8gcG9zdCBTSVJfSEFMX0NPTkZJR19TVEFUU19GQUNUT1IgdG8gV01BISIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQljZGZfbWVtX2ZyZWUoc3RhdHNfZmFjdG9yKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2sgZXJyb3IhIiwKKwkJCSAgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUoc3RhdHNfZmFjdG9yKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9jb25maWd1cmVfZ3VhcmRfdGltZSgpIC0gZnVuY3Rpb24gdG8gY29uZmlndXJlIGd1YXJkIHRpbWUKKyAqIEBoYWw6IGhhbAorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqIEBndWFyZF90aW1lOiBndWFyZCB0aW1lCisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBndWFyZCB0aW1lIGluIGZpcm13YXJlCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX2NvbmZpZ3VyZV9ndWFyZF90aW1lKHRIYWxIYW5kbGUgaGFsLCB1aW50OF90IHNlc3Npb25faWQsCisJCQkJICAgIHVpbnQzMl90IGd1YXJkX3RpbWUpCit7CisJY2RzX21zZ190IG1zZzsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBtYWMgID0gUE1BQ19TVFJVQ1QoaGFsKTsKKwlzdHJ1Y3Qgc2lyX2d1YXJkX3RpbWVfcmVxdWVzdCAqZ190aW1lOworCisJZ190aW1lID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpnX3RpbWUpKTsKKworCWlmICghZ190aW1lKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IE5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgU0lSX0hBTF9DT05GSUdfR1VBUkRfVElNRSIsCisJCQkgIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKworCQlnX3RpbWUtPnZkZXZfaWQgPSBzZXNzaW9uX2lkOworCQlnX3RpbWUtPmd1YXJkX3RpbWUgPSBndWFyZF90aW1lOworCisJCS8qIHNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisJCW1zZy50eXBlICAgICA9IFNJUl9IQUxfQ09ORklHX0dVQVJEX1RJTUU7CisJCW1zZy5ib2R5cHRyICA9IGdfdGltZTsKKworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUygKKwkJCSAgICBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBOb3QgYWJsZSB0byBwb3N0IFNJUl9IQUxfQ09ORklHX0dVQVJEX1RJTUUgdG8gV01BISIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQljZGZfbWVtX2ZyZWUoZ190aW1lKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2sgZXJyb3IhIiwKKwkJCSAgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUoZ190aW1lKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9jb25maWd1cmVfbW9kdWxhdGVkX2R0aW0oKSAtIGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSBtb2R1bGF0ZWQgZHRpbQorICogQGhfaGFsOiBTTUUgQVBJIHRvIGVuYWJsZS9kaXNhYmxlIG1vZHVsYXRlZCBEVElNIGluc3RhbnRhbmVvdXNseQorICogQHNlc3Npb25faWQ6IHNlc3Npb24gSUQKKyAqIEBtb2R1bGF0ZWRfZHRpbTogbW9kdWxhdGVkIGR0aW0gdmFsdWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIG1vZHVsYXRlZCBkdGltIGluIGZpcm13YXJlCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX2NvbmZpZ3VyZV9tb2R1bGF0ZWRfZHRpbSh0SGFsSGFuZGxlIGhfaGFsLCB1aW50OF90IHNlc3Npb25faWQsCisJCQkJCXVpbnQzMl90IG1vZHVsYXRlZF9kdGltKQoreworCWNkc19tc2dfdCBtc2c7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgbWFjICA9IFBNQUNfU1RSVUNUKGhfaGFsKTsKKwl3bWFfY2xpX3NldF9jbWRfdCAqaXdjbWQ7CisKKwlpd2NtZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqaXdjbWQpKTsKKwlpZiAoTlVMTCA9PSBpd2NtZCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBjZGZfbWVtX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKKworCQljZGZfbWVtX3plcm8oKHZvaWQgKilpd2NtZCwgc2l6ZW9mKCppd2NtZCkpOworCQlpd2NtZC0+cGFyYW1fdmFsdWUgPSBtb2R1bGF0ZWRfZHRpbTsKKwkJaXdjbWQtPnBhcmFtX3ZkZXZfaWQgPSBzZXNzaW9uX2lkOworCQlpd2NtZC0+cGFyYW1faWQgPSBHRU5fUEFSQU1fTU9EVUxBVEVEX0RUSU07CisJCWl3Y21kLT5wYXJhbV92cF9kZXYgPSBHRU5fQ01EOworCQltc2cudHlwZSA9IFdNQV9DTElfU0VUX0NNRDsKKwkJbXNnLnJlc2VydmVkID0gMDsKKwkJbXNnLmJvZHlwdHIgPSAodm9pZCAqKWl3Y21kOworCisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKAorCQkJICAgIGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgR0VOX1BBUkFNX0RZTkFNSUNfRFRJTSB0byBXTUEhIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCWNkZl9tZW1fZnJlZShpd2NtZCk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrIGVycm9yISIsCisJCQkgIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKGl3Y21kKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogc21lX3dpZmlfc3RhcnRfbG9nZ2VyKCkgLSBTZW5kIHRoZSBzdGFydC9zdG9wIGxvZ2dpbmcgY29tbWFuZCB0byBXTUEKKyAqIHRvIGVpdGhlciBzdGFydC9zdG9wIGxvZ2dpbmcKKyAqIEBoYWw6IEhBTCBjb250ZXh0CisgKiBAc3RhcnRfbG9nOiBTdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgd2lmaSBzdGFydCBsb2dnZXIgcGFyYW1zCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgc3RhcnQvc3RvcCBsb2dnaW5nIGNvbW1hbmQgdG8gV01BCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBwb3N0aW5nCisgKi8KK0NERl9TVEFUVVMgc21lX3dpZmlfc3RhcnRfbG9nZ2VyKHRIYWxIYW5kbGUgaGFsLAorCQlzdHJ1Y3Qgc2lyX3dpZmlfc3RhcnRfbG9nIHN0YXJ0X2xvZykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBtYWMgICA9IFBNQUNfU1RSVUNUKGhhbCk7CisJY2RzX21zZ190IGNkc19tZXNzYWdlOworCXN0cnVjdCBzaXJfd2lmaV9zdGFydF9sb2cgKnJlcV9tc2c7CisJdWludDMyX3QgbGVuOworCisJbGVuID0gc2l6ZW9mKCpyZXFfbXNnKTsKKwlyZXFfbXNnID0gY2RmX21lbV9tYWxsb2MobGVuKTsKKwlpZiAoIXJlcV9tc2cpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJjZGZfbWVtX21hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV96ZXJvKHJlcV9tc2csIGxlbik7CisKKwlyZXFfbXNnLT52ZXJib3NlX2xldmVsID0gc3RhcnRfbG9nLnZlcmJvc2VfbGV2ZWw7CisJcmVxX21zZy0+ZmxhZyA9IHN0YXJ0X2xvZy5mbGFnOworCXJlcV9tc2ctPnJpbmdfaWQgPSBzdGFydF9sb2cucmluZ19pZDsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsCisJCQlGTCgic21lX2FjcXVpcmVfZ2xvYmFsX2xvY2sgZmFpbGVkKHN0YXR1cz0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBTZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCWNkc19tZXNzYWdlLmJvZHlwdHIgPSByZXFfbXNnOworCWNkc19tZXNzYWdlLnR5cGUgICAgPSBTSVJfSEFMX1NUQVJUX1NUT1BfTE9HR0lORzsKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJ2b3NfbXFfcG9zdF9tZXNzYWdlIGZhaWxlZCEoZXJyPSVkKSIpLAorCQkJc3RhdHVzKTsKKwkJY2RmX21lbV9mcmVlKHJlcV9tc2cpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX25laWdoYm9yX21pZGRsZV9vZl9yb2FtaW5nKCkgLSBGdW5jdGlvbiB0byBrbm93IGlmCisgKiBTVEEgaXMgaW4gdGhlIG1pZGRsZSBvZiByb2FtaW5nIHN0YXRlcworICogQGhhbDogICAgICAgICAgICAgICAgSGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4KKyAqIEBzZXNzaW9uSWQ6IHNlc3Npb25JZCBvZiB0aGUgU1RBIHNlc3Npb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciB0byBjYWxsCisgKiBjc3JfbmVpZ2hib3JfbWlkZGxlX29mX3JvYW1pbmcgdG8ga25vdyBTVEEgaXMgaW4gdGhlCisgKiBtaWRkbGUgb2Ygcm9hbWluZyBzdGF0ZXMKKyAqCisgKiBSZXR1cm46IFRydWUgb3IgRmFsc2UKKyAqCisgKi8KK2Jvb2wgc21lX25laWdoYm9yX21pZGRsZV9vZl9yb2FtaW5nKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJcmV0dXJuIGNzcl9uZWlnaGJvcl9taWRkbGVfb2Zfcm9hbWluZyhQTUFDX1NUUlVDVChoSGFsKSwgc2Vzc2lvbklkKTsKK30KKworLyoKKyAqIHNtZV9zZW5kX2ZsdXNoX2xvZ3NfY21kX3RvX2Z3KCkgLSBGbHVzaCBGVyBsb2dzCisgKiBAbWFjOiBNQUMgaGFuZGxlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgdGhlIGNvbW1hbmQgdGhhdCB3aWxsCisgKiBiZSB1c2VkIHRvIGZsdXNoIHRoZSBsb2dzIGluIHRoZSBmaXJtd2FyZQorICoKKyAqIFJldHVybjogZUhhbFN0YXR1cworICovCitDREZfU1RBVFVTIHNtZV9zZW5kX2ZsdXNoX2xvZ3NfY21kX3RvX2Z3KHRwQW5pU2lyR2xvYmFsIG1hYykKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwljZHNfbXNnX3QgbWVzc2FnZTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsCisJCQlGTCgic21lX2FjcXVpcmVfZ2xvYmFsX2xvY2sgZmFpbGVkIShzdGF0dXM9JWQpIiksCisJCQlzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIFNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisJbWVzc2FnZS5ib2R5cHRyID0gTlVMTDsKKwltZXNzYWdlLnR5cGUgICAgPSBTSVJfSEFMX0ZMVVNIX0xPR19UT19GVzsKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZtZXNzYWdlKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLAorCQkJRkwoImNkc19tcV9wb3N0X21lc3NhZ2UgZmFpbGVkIShlcnI9JWQpIiksCisJCQlzdGF0dXMpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9lbmFibGVfdWFwc2RfZm9yX2FjKCkgLSBlbmFibGUgdWFwc2QgZm9yIGFjY2VzcyBjYXRhZ29yeSByZXF1ZXJzdCB0byBXTUEKKyAqIEBjZHNfY3R4OiBjZHMgY29udGV4dAorICogQHN0YV9pZDogc3RhdGlvbiBpZAorICogQGFjOiBhY2Nlc3MgY2F0YWdvcnkKKyAqIEB0aWQ6IHRpZCB2YWx1ZQorICogQHByaTogdXNlciBwcmlvcml0eQorICogQHNydmNfaW50OiBzZXJ2aWNlIGludGVydmFsCisgKiBAc3VzX2ludDogc3VzcGVuZCBpbnRlcnZhbAorICogQGRpcjogdHNwZWMgZGlyZWN0aW9uCisgKiBAcHNiOiBQU0IgdmFsdWUKKyAqIEBzZXNzaW9uSWQ6IHNlc3Npb24gaWQKKyAqIEBkZWxheV9pbnRlcnZhbDogZGVsYXkgaW50ZXJ2YWwKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBzbWVfZW5hYmxlX3VhcHNkX2Zvcl9hYyh2b2lkICpjZHNfY3R4LCB1aW50OF90IHN0YV9pZCwKKwkJCQkgICBzbWVfYWNfZW51bV90eXBlIGFjLCB1aW50OF90IHRpZCwKKwkJCQkgICB1aW50OF90IHByaSwgdWludDMyX3Qgc3J2Y19pbnQsCisJCQkJICAgdWludDMyX3Qgc3VzX2ludCwKKwkJCQkgICBzbWVfdHNwZWNfZGlyX3R5cGUgZGlyLAorCQkJCSAgIHVpbnQ4X3QgcHNiLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgdWludDMyX3QgZGVsYXlfaW50ZXJ2YWwpCit7CisJdm9pZCAqd21hX2hhbmRsZTsKKwl0X3dtYV90cmlnZ2VyX3VhcHNkX3BhcmFtcyB1YXBzZF9wYXJhbXM7CisJZW51bSB1YXBzZF9hYyBhY2Nlc3NfY2F0ZWdvcnk7CisKKwlpZiAoIXBzYikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSJObyBuZWVkIHRvIGNvbmZpZ3VyZSBhdXRvIHRyaWdnZXI6cHNiIGlzIDAiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwl3bWFfaGFuZGxlID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoIXdtYV9oYW5kbGUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSJ3bWFfaGFuZGxlIGlzIE5VTEwiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXN3aXRjaCAoYWMpIHsKKwljYXNlIFNNRV9BQ19CSzoKKwkJYWNjZXNzX2NhdGVnb3J5ID0gVUFQU0RfQks7CisJCWJyZWFrOworCWNhc2UgU01FX0FDX0JFOgorCQlhY2Nlc3NfY2F0ZWdvcnkgPSBVQVBTRF9CRTsKKwkJYnJlYWs7CisJY2FzZSBTTUVfQUNfVkk6CisJCWFjY2Vzc19jYXRlZ29yeSA9IFVBUFNEX1ZJOworCQlicmVhazsKKwljYXNlIFNNRV9BQ19WTzoKKwkJYWNjZXNzX2NhdGVnb3J5ID0gVUFQU0RfVk87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwl1YXBzZF9wYXJhbXMud21tX2FjID0gYWNjZXNzX2NhdGVnb3J5OworCXVhcHNkX3BhcmFtcy51c2VyX3ByaW9yaXR5ID0gcHJpOworCXVhcHNkX3BhcmFtcy5zZXJ2aWNlX2ludGVydmFsID0gc3J2Y19pbnQ7CisJdWFwc2RfcGFyYW1zLmRlbGF5X2ludGVydmFsID0gZGVsYXlfaW50ZXJ2YWw7CisJdWFwc2RfcGFyYW1zLnN1c3BlbmRfaW50ZXJ2YWwgPSBzdXNfaW50OworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCSAgICB3bWFfdHJpZ2dlcl91YXBzZF9wYXJhbXMod21hX2hhbmRsZSwgc2Vzc2lvbklkLCAmdWFwc2RfcGFyYW1zKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJGYWlsZWQgdG8gVHJpZ2dlciBVYXBzZCBwYXJhbXMgZm9yIHNlc3Npb25JZCAlZCIsCisJCQkgICAgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHNtZV9kaXNhYmxlX3VhcHNkX2Zvcl9hYygpIC0gZGlzYWJsZSB1YXBzZWQgYWNjZXNzIGNhdGFnb3J5IHJlcXVlc3QgdG8gV01BCisgKiBAY2RzX2N0eDogY2RzIGNvbnRleHQKKyAqIEBzdGFfaWQ6IHN0YXRpb24gaWQKKyAqIEBhYzogYWNjZXNzIGNhdGFnb3J5CisgKiBAc2Vzc2lvbklkOiBzZXNzaW9uIGlkCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgc21lX2Rpc2FibGVfdWFwc2RfZm9yX2FjKHZvaWQgKmNkc19jdHgsIHVpbnQ4X3Qgc3RhX2lkLAorCQkJCSAgICAgICBzbWVfYWNfZW51bV90eXBlIGFjLAorCQkJCSAgICAgICB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJdm9pZCAqd21hX2hhbmRsZTsKKwllbnVtIHVhcHNkX2FjIGFjY2Vzc19jYXRlZ29yeTsKKworCXN3aXRjaCAoYWMpIHsKKwljYXNlIFNNRV9BQ19CSzoKKwkJYWNjZXNzX2NhdGVnb3J5ID0gVUFQU0RfQks7CisJCWJyZWFrOworCWNhc2UgU01FX0FDX0JFOgorCQlhY2Nlc3NfY2F0ZWdvcnkgPSBVQVBTRF9CRTsKKwkJYnJlYWs7CisJY2FzZSBTTUVfQUNfVkk6CisJCWFjY2Vzc19jYXRlZ29yeSA9IFVBUFNEX1ZJOworCQlicmVhazsKKwljYXNlIFNNRV9BQ19WTzoKKwkJYWNjZXNzX2NhdGVnb3J5ID0gVUFQU0RfVk87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwl3bWFfaGFuZGxlID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoIXdtYV9oYW5kbGUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIndtYSBoYW5kbGUgaXMgTlVMTCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkgICAgd21hX2Rpc2FibGVfdWFwc2RfcGVyX2FjKHdtYV9oYW5kbGUsIHNlc3Npb25JZCwgYWNjZXNzX2NhdGVnb3J5KSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSJGYWlsZWQgdG8gZGlzYWJsZSB1YXBzZCBmb3IgYWMgJWQgZm9yIHNlc3Npb25JZCAlZCIsCisJCQkgICAgYWMsIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzbWVfdXBkYXRlX25zcygpIC0gU01FIEFQSSB0byBjaGFuZ2UgdGhlIG51bWJlciBmb3Igc3BhdGlhbCBzdHJlYW1zCisgKiAoMSBvciAyKQorICogQGhhbDogSGFuZGxlIHJldHVybmVkIGJ5IG1hYyBvcGVuCisgKiBAbnNzOiBOdW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIHNwYXRpYWwgc3RyZWFtcyBzdXBwb3J0ZWQuCisgKgorICogUmV0dXJuOiBTdWNjZXNzIHVwb24gc3VjY2Vzc2Z1bGx5IGNoYW5naW5nIG5zcyBlbHNlIGZhaWx1cmUKKyAqCisgKi8KK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9uc3ModEhhbEhhbmRsZSBoX2hhbCwgdWludDhfdCBuc3MpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhfaGFsKTsKKwl1aW50MzJfdCBpLCB2YWx1ZSA9IDA7CisJdW5pb24geworCQl1aW50MTZfdCBjZmdfdmFsdWUxNjsKKwkJdFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gaHRfY2FwX2luZm87CisJfSB1SFRDYXBhYmlsaXR5SW5mbzsKKwl0Q3NyUm9hbVNlc3Npb24gKmNzcl9zZXNzaW9uOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmVuYWJsZTJ4MiA9IChuc3MgPT0gMSkgPyAwIDogMTsKKworCQkvKiBnZXQgdGhlIEhUIGNhcGFiaWxpdHkgaW5mbyovCisJCXNtZV9jZmdfZ2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHX0hUX0NBUF9JTkZPLCAmdmFsdWUpOworCQl1SFRDYXBhYmlsaXR5SW5mby5jZmdfdmFsdWUxNiA9ICgweEZGRkYgJiB2YWx1ZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChtYWNfY3R4LCBpKSkgeworCQkJCWNzcl9zZXNzaW9uID0gJm1hY19jdHgtPnJvYW0ucm9hbVNlc3Npb25baV07CisJCQkJY3NyX3Nlc3Npb24tPmh0Q29uZmlnLmh0X3R4X3N0YmMgPQorCQkJCQl1SFRDYXBhYmlsaXR5SW5mby5odF9jYXBfaW5mby50eFNUQkM7CisJCQl9CisJCX0KKworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjX2N0eC0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfc2V0X3Jzc2lfdGhyZXNob2xkX2JyZWFjaGVkX2NiKCkgLSBzZXQgcnNzaSB0aHJlc2hvbGQgYnJlYWNoZWQgY2FsbGJhY2sKKyAqIEBoYWw6IGdsb2JhbCBoYWwgaGFuZGxlCisgKiBAY2I6IGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHN0b3JlcyB0aGUgcnNzaSB0aHJlc2hvbGQgYnJlYWNoZWQgY2FsbGJhY2sgZnVuY3Rpb24uCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uLgorICovCitDREZfU1RBVFVTIHNtZV9zZXRfcnNzaV90aHJlc2hvbGRfYnJlYWNoZWRfY2IodEhhbEhhbmRsZSBoYWwsCisJCQkJdm9pZCAoKmNiKSh2b2lkICosIHN0cnVjdCByc3NpX2JyZWFjaF9ldmVudCAqKSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyAgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgbWFjID0gUE1BQ19TVFJVQ1QoaGFsKTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJzbWVfYWNxdWlyZV9nbG9iYWxfbG9jayBmYWlsZWQhKHN0YXR1cz0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJbWFjLT5zbWUucnNzaV90aHJlc2hvbGRfYnJlYWNoZWRfY2IgPSBjYjsKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX2lzX2FueV9zZXNzaW9uX2luX2Nvbm5lY3RlZF9zdGF0ZSgpIC0gU01FIHdyYXBwZXIgQVBJIHRvCisgKiBjaGVjayBpZiBhbnkgc2Vzc2lvbiBpcyBpbiBjb25uZWN0ZWQgc3RhdGUgb3Igbm90LgorICoKKyAqIEBoYWw6IEhhbmRsZSByZXR1cm5lZCBieSBtYWMgb3BlbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayBpZiBhbnkgdmFsaWQgc21lIHNlc3Npb24gaXMgaW4KKyAqIGNvbm5lY3RlZCBzdGF0ZSBvciBub3QuCisgKgorICogUmV0dXJuOiB0cnVlIGlmIGFueSBzZXNzaW9uIGlzIGNvbm5lY3RlZCwgZWxzZSBmYWxzZS4KKyAqCisgKi8KK2Jvb2wgc21lX2lzX2FueV9zZXNzaW9uX2luX2Nvbm5lY3RlZF9zdGF0ZSh0SGFsSGFuZGxlIGhfaGFsKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoX2hhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZtYWNfY3R4LT5zbWUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKSB7CisJCXJldCA9IGNzcl9pc19hbnlfc2Vzc2lvbl9pbl9jb25uZWN0X3N0YXRlKG1hY19jdHgpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjX2N0eC0+c21lKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzbWVfc2V0X3Jzc2lfbW9uaXRvcmluZygpIC0gc2V0IHJzc2kgbW9uaXRvcmluZworICogQGhhbDogZ2xvYmFsIGhhbCBoYW5kbGUKKyAqIEBpbnB1dDogcmVxdWVzdCBtZXNzYWdlCisgKgorICogVGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIHRoZSB2b3MgbWVzc2FnZSBhbmQgZmlsbCBpbiBtZXNzYWdlIHR5cGUsCisgKiBib2R5cHRyIHdpdGggQGlucHV0IGFuZCBwb3N0cyBpdCB0byBXREEgcXVldWUuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgc21lX3NldF9yc3NpX21vbml0b3JpbmcodEhhbEhhbmRsZSBoYWwsCisJCQkJc3RydWN0IHJzc2lfbW9uaXRvcl9yZXEgKmlucHV0KQoreworCUNERl9TVEFUVVMgc3RhdHVzICAgICA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBtYWMgICAgPSBQTUFDX1NUUlVDVChoYWwpOworCWNkc19tc2dfdCBjZHNfbWVzc2FnZTsKKwlzdHJ1Y3QgcnNzaV9tb25pdG9yX3JlcSAqcmVxX21zZzsKKworCXNtc19sb2cobWFjLCBMT0cxLCBGTCgiZW50ZXIiKSk7CisJcmVxX21zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcmVxX21zZykpOworCWlmICghcmVxX21zZykgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwkqcmVxX21zZyA9ICppbnB1dDsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJzbWVfYWNxdWlyZV9nbG9iYWxfbG9jayBmYWlsZWQhKHN0YXR1cz0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBTZXJpYWxpemUgdGhlIHJlcSB0aHJvdWdoIE1DIHRocmVhZCAqLworCWNkc19tZXNzYWdlLmJvZHlwdHIgPSByZXFfbXNnOworCWNkc19tZXNzYWdlLnR5cGUgICAgPSBXTUFfU0VUX1JTU0lfTU9OSVRPUl9SRVE7CisJc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21lc3NhZ2UpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsCisJCQlGTCgiY2RzX21xX3Bvc3RfbWVzc2FnZSBmYWlsZWQhKGVycj0lZCkiKSwKKwkJCXN0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKKwl9CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX2Z3X21lbV9kdW1wKCkgLSBHZXQgRlcgbWVtb3J5IGR1bXAKKyAqIEBoSGFsOiBoYWwgaGFuZGxlCisgKiBAcmVjdmRfcmVxOiByZWNlaXZlZCBtZW1vcnkgZHVtcCByZXF1ZXN0LgorICoKKyAqIFRoaXMgQVBJIGlzIGludm9rZWQgYnkgSEREIHRvIGluZGljYXRlIEZXIHRvIHN0YXJ0CisgKiBkdW1waW5nIGZpcm13YXJlIG1lbW9yeS4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9NRU1EVU1QCitDREZfU1RBVFVTIHNtZV9md19tZW1fZHVtcCh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnJlY3ZkX3JlcSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWNkc19tc2dfdCBtc2c7CisJc3RydWN0IGZ3X2R1bXBfcmVxICpzZW5kX3JlcTsKKwlzdHJ1Y3QgZndfZHVtcF9zZWdfcmVxIHNlZ19yZXE7CisJaW50IGxvb3A7CisKKwlzZW5kX3JlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqc2VuZF9yZXEpKTsKKwlpZiAoIXNlbmRfcmVxKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgV0RBX0ZXX01FTV9EVU1QIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWNkZl9tZW1fY29weShzZW5kX3JlcSwgcmVjdmRfcmVxLCBzaXplb2YoKnNlbmRfcmVxKSk7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgIEZMKCJyZXF1ZXN0X2lkOiVkIG51bV9zZWc6JWQiKSwKKwkJICBzZW5kX3JlcS0+cmVxdWVzdF9pZCwgc2VuZF9yZXEtPm51bV9zZWcpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgRkwoIlNlZ21lbnQgSW5mb3JtYXRpb24iKSk7CisJZm9yIChsb29wID0gMDsgbG9vcCA8IHNlbmRfcmVxLT5udW1fc2VnOyBsb29wKyspIHsKKwkJc2VnX3JlcSA9IHNlbmRfcmVxLT5zZWdtZW50W2xvb3BdOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICBGTCgic2VnX251bWJlcjolZCIpLCBsb29wKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoInNlZ19pZDolZCBzdGFydF9hZGRyX2xvOjB4JXggc3RhcnRfYWRkcl9oaToweCV4IiksCisJCQkgIHNlZ19yZXEuc2VnX2lkLCBzZWdfcmVxLnNlZ19zdGFydF9hZGRyX2xvLAorCQkJICBzZWdfcmVxLnNlZ19zdGFydF9hZGRyX2hpKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoInNlZ19sZW5ndGg6JWQgZHN0X2FkZHJfbG86MHgleCBkc3RfYWRkcl9oaToweCV4IiksCisJCQkgIHNlZ19yZXEuc2VnX2xlbmd0aCwgc2VnX3JlcS5kc3RfYWRkcl9sbywKKwkJCSAgc2VnX3JlcS5kc3RfYWRkcl9oaSk7CisJfQorCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKSkgeworCQltc2cuYm9keXB0ciA9IHNlbmRfcmVxOworCQltc2cudHlwZSA9IFdNQV9GV19NRU1fRFVNUF9SRVE7CisJCW1zZy5yZXNlcnZlZCA9IDA7CisKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgRkwoIk5vdCBhYmxlIHRvIHBvc3QgV01BX0ZXX01FTV9EVU1QIikpOworCQkJY2RmX21lbV9mcmVlKHNlbmRfcmVxKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIkZhaWxlZCB0byBhY3F1aXJlIFNNRSBHbG9iYWwgTG9jayIpKTsKKwkJY2RmX21lbV9mcmVlKHNlbmRfcmVxKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbHNlCitDREZfU1RBVFVTIHNtZV9md19tZW1fZHVtcCh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnJlY3ZkX3JlcSkKK3sKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9NRU1EVU1QICovCisKKy8qCisgKiBzbWVfc29jX3NldF9wY2woKSAtIFNlbmQgV01JX1NPQ19TRVRfUENMX0NNRElEIHRvIHRoZSBXTUEKKyAqIEBoYWw6IEhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuCisgKiBAbXNnOiBQQ0wgY2hhbm5lbCBsaXN0IGFuZCBsZW5ndGggc3RydWN0dXJlCisgKgorICogU2VuZHMgdGhlIGNvbW1hbmQgdG8gV01BIHRvIHNlbmQgV01JX1NPQ19TRVRfUENMX0NNRElEIHRvIEZXCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIHBvc3RpbmcKKyAqLworQ0RGX1NUQVRVUyBzbWVfc29jX3NldF9wY2wodEhhbEhhbmRsZSBoYWwsCisJCXN0cnVjdCBzaXJfcGNsX2xpc3QgbXNnKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIG1hYyAgID0gUE1BQ19TVFJVQ1QoaGFsKTsKKwljZHNfbXNnX3QgY2RzX21lc3NhZ2U7CisJc3RydWN0IHNpcl9wY2xfbGlzdCAqcmVxX21zZzsKKwl1aW50MzJfdCBsZW4sIGk7CisKKwlsZW4gPSBzaXplb2YoKnJlcV9tc2cpOworCisJcmVxX21zZyA9IGNkZl9tZW1fbWFsbG9jKGxlbik7CisJaWYgKCFyZXFfbXNnKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1femVybyhyZXFfbXNnLCBsZW4pOworCisJZm9yIChpID0gMDsgaSA8IG1zZy5wY2xfbGVuOyBpKyspCisJCXJlcV9tc2ctPnBjbF9saXN0W2ldID0gIG1zZy5wY2xfbGlzdFtpXTsKKworCXJlcV9tc2ctPnBjbF9sZW4gPSBtc2cucGNsX2xlbjsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZtYWMtPnNtZSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsCisJCQkJRkwoInNtZV9BY3F1aXJlR2xvYmFsTG9jayBmYWlsZWQhKHN0YXR1cz0lZCkiKSwKKwkJCQlzdGF0dXMpOworCQljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogU2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKwljZHNfbWVzc2FnZS5ib2R5cHRyID0gcmVxX21zZzsKKwljZHNfbWVzc2FnZS50eXBlICAgID0gU0lSX0hBTF9TT0NfU0VUX1BDTF9UT19GVzsKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZjZHNfbWVzc2FnZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCQlGTCgidm9zX21xX3Bvc3RfbWVzc2FnZSBmYWlsZWQhKGVycj0lZCkiKSwKKwkJCQlzdGF0dXMpOworCQljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIHNtZV9zb2Nfc2V0X2h3X21vZGUoKSAtIFNlbmQgV01JX1NPQ19TRVRfSFdfTU9ERV9DTURJRCB0byB0aGUgV01BCisgKiBAaGFsOiBIYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3BlbgorICogQG1zZzogSFcgbW9kZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBodyBtb2RlIGFuZCBjYWxsYmFjayBkZXRhaWxzCisgKgorICogU2VuZHMgdGhlIGNvbW1hbmQgdG8gQ1NSIHRvIHNlbmQgV01JX1NPQ19TRVRfSFdfTU9ERV9DTURJRCB0byBGVworICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBwb3N0aW5nCisgKi8KK0NERl9TVEFUVVMgc21lX3NvY19zZXRfaHdfbW9kZSh0SGFsSGFuZGxlIGhhbCwKKwkJc3RydWN0IHNpcl9od19tb2RlIG1zZykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBtYWMgPSBQTUFDX1NUUlVDVChoYWwpOworCXRTbWVDbWQgKmNtZCA9IE5VTEw7CisKKwlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gYWNxdWlyZSBsb2NrIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwl9CisKKwljbWQgPSBzbWVfZ2V0X2NvbW1hbmRfYnVmZmVyKG1hYyk7CisJaWYgKCFjbWQpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJHZXQgY29tbWFuZCBidWZmZXIgZmFpbGVkIikpOworCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05VTExfVkFMVUU7CisJfQorCisJY21kLT5jb21tYW5kID0gZV9zbWVfY29tbWFuZF9zZXRfaHdfbW9kZTsKKwljbWQtPnUuc2V0X2h3X21vZGVfY21kLmh3X21vZGVfaW5kZXggPSBtc2cuaHdfbW9kZV9pbmRleDsKKwljbWQtPnUuc2V0X2h3X21vZGVfY21kLnNldF9od19tb2RlX2NiID0gbXNnLnNldF9od19tb2RlX2NiOworCisJc21zX2xvZyhtYWMsIExPRzEsIEZMKCJRdWV1aW5nIGVfc21lX2NvbW1hbmRfc2V0X2h3X21vZGUgdG8gQ1NSIikpOworCWNzcl9xdWV1ZV9zbWVfY29tbWFuZChtYWMsIGNtZCwgZmFsc2UpOworCisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHNtZV9yZWdpc3Rlcl9od19tb2RlX3RyYW5zX2NiKCkgLSBIVyBtb2RlIHRyYW5zaXRpb24gY2FsbGJhY2sgcmVnaXN0cmF0aW9uCisgKiBAaGFsOiBIYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3BlbgorICogQGNhbGxiYWNrOiBIREQgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICoKKyAqIFJlZ2lzdGVycyB0aGUgSEREIGNhbGxiYWNrIHdpdGggU01FLiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCB3aGVuCisgKiBIVyBtb2RlIHRyYW5zaXRpb24gZXZlbnQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgRlcKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBzbWVfcmVnaXN0ZXJfaHdfbW9kZV90cmFuc19jYih0SGFsSGFuZGxlIGhhbCwKKwkJCWh3X21vZGVfdHJhbnNpdGlvbl9jYiBjYWxsYmFjaykKK3sKKwl0cEFuaVNpckdsb2JhbCBtYWMgPSBQTUFDX1NUUlVDVChoYWwpOworCisJbWFjLT5zbWUuc21lX2h3X21vZGVfdHJhbnNfY2IgPSBjYWxsYmFjazsKKwlzbXNfbG9nKG1hYywgTE9HMSwgRkwoIkhXIG1vZGUgdHJhbnNpdGlvbiBjYWxsYmFjayByZWdpc3RlcmVkIikpOworfQorCisvKioKKyAqIHNtZV9uc3NfdXBkYXRlX3JlcXVlc3QoKSAtIFNlbmQgYmVhY29uIHRlbXBsZXRlIHVwZGF0ZSB0byBGVyB3aXRoIG5ldworICogbnNzIHZhbHVlCisgKiBAaGFsOiBIYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3BlbgorICogQHZkZXZfaWQ6IHRoZSBzZXNzaW9uIGlkCisgKiBAbmV3X25zczogdGhlIG5ldyBuc3MgdmFsdWUKKyAqIEBjYmFjazogaGRkIGNhbGxiYWNrCisgKiBAbmV4dF9hY3Rpb246IG5leHQgYWN0aW9uIHRvIGhhcHBlbiBhdCBwb2xpY3kgbWdyIGFmdGVyIGJlYWNvbiB1cGRhdGUKKyAqCisgKiBTZW5kcyB0aGUgY29tbWFuZCB0byBDU1IgdG8gc2VuZCB0byBQRQorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBwb3N0aW5nCisgKi8KK0NERl9TVEFUVVMgc21lX25zc191cGRhdGVfcmVxdWVzdCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHZkZXZfaWQsCisJCQkJdWludDhfdCAgbmV3X25zcywgdm9pZCAqY2JhY2ssIHVpbnQ4X3QgbmV4dF9hY3Rpb24sCisJCQkJdm9pZCAqaGRkX2NvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBtYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0U21lQ21kICpjbWQgPSBOVUxMOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJY21kID0gc21lX2dldF9jb21tYW5kX2J1ZmZlcihtYWMpOworCQlpZiAoIWNtZCkgeworCQkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJHZXQgY29tbWFuZCBidWZmZXIgZmFpbGVkIikpOworCQkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTlVMTF9WQUxVRTsKKwkJfQorCQljbWQtPmNvbW1hbmQgPSBlX3NtZV9jb21tYW5kX25zc191cGRhdGU7CisJCS8qIFNlc3Npb25pemVkIG1vZHVsZXMgbWF5IHJlcXVpcmUgdGhpcyBpbmZvICovCisJCWNtZC0+c2Vzc2lvbklkID0gdmRldl9pZDsKKwkJY21kLT51Lm5zc191cGRhdGVfY21kLm5ld19uc3MgPSBuZXdfbnNzOworCQljbWQtPnUubnNzX3VwZGF0ZV9jbWQuc2Vzc2lvbl9pZCA9IHZkZXZfaWQ7CisJCWNtZC0+dS5uc3NfdXBkYXRlX2NtZC5uc3NfdXBkYXRlX2NiID0gY2JhY2s7CisJCWNtZC0+dS5uc3NfdXBkYXRlX2NtZC5jb250ZXh0ID0gaGRkX2NvbnRleHQ7CisJCWNtZC0+dS5uc3NfdXBkYXRlX2NtZC5uZXh0X2FjdGlvbiA9IG5leHRfYWN0aW9uOworCisJCXNtc19sb2cobWFjLCBMT0cxLCBGTCgiUXVldWluZyBlX3NtZV9jb21tYW5kX25zc191cGRhdGUgdG8gQ1NSIikpOworCQljc3JfcXVldWVfc21lX2NvbW1hbmQobWFjLCBjbWQsIGZhbHNlKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfc29jX3NldF9kdWFsX21hY19jb25maWcoKSAtIFNldCBkdWFsIG1hYyBjb25maWd1cmF0aW9ucworICogQGhhbDogSGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4KKyAqIEBtc2c6IFN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBkdWFsIG1hYyBjb25maWcgcGFyYW1ldGVycworICoKKyAqIFF1ZXVlcyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRvIENTUiB0byBjb25maWd1cmUKKyAqIFdMQU4gZmlybXdhcmUgZm9yIHRoZSBkdWFsIE1BQyBmZWF0dXJlcworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9zb2Nfc2V0X2R1YWxfbWFjX2NvbmZpZyh0SGFsSGFuZGxlIGhhbCwKKwkJc3RydWN0IHNpcl9kdWFsX21hY19jb25maWcgbXNnKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQW5pU2lyR2xvYmFsIG1hYyA9IFBNQUNfU1RSVUNUKGhhbCk7CisJdFNtZUNtZCAqY21kOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFjcXVpcmUgbG9jayIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfQorCisJY21kID0gc21lX2dldF9jb21tYW5kX2J1ZmZlcihtYWMpOworCWlmICghY21kKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgiR2V0IGNvbW1hbmQgYnVmZmVyIGZhaWxlZCIpKTsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJm1hYy0+c21lKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OVUxMX1ZBTFVFOworCX0KKworCWNtZC0+Y29tbWFuZCA9IGVfc21lX2NvbW1hbmRfc2V0X2R1YWxfbWFjX2NvbmZpZzsKKwljbWQtPnUuc2V0X2R1YWxfbWFjX2NtZC5zY2FuX2NvbmZpZyA9IG1zZy5zY2FuX2NvbmZpZzsKKwljbWQtPnUuc2V0X2R1YWxfbWFjX2NtZC5md19tb2RlX2NvbmZpZyA9IG1zZy5md19tb2RlX2NvbmZpZzsKKwljbWQtPnUuc2V0X2R1YWxfbWFjX2NtZC5zZXRfZHVhbF9tYWNfY2IgPSBtc2cuc2V0X2R1YWxfbWFjX2NiOworCisJc21zX2xvZyhtYWMsIExPRzEsCisJCUZMKCJRdWV1aW5nIGVfc21lX2NvbW1hbmRfc2V0X2R1YWxfbWFjX2NvbmZpZyB0byBDU1I6ICV4ICV4IiksCisJCWNtZC0+dS5zZXRfZHVhbF9tYWNfY21kLnNjYW5fY29uZmlnLAorCQljbWQtPnUuc2V0X2R1YWxfbWFjX2NtZC5md19tb2RlX2NvbmZpZyk7CisJY3NyX3F1ZXVlX3NtZV9jb21tYW5kKG1hYywgY21kLCBmYWxzZSk7CisKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjLT5zbWUpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3NldF9wZWVyX2F1dGhvcml6ZWQoKSAtIGNhbGwgcGVlciBhdXRob3JpemVkIGNhbGxiYWNrCisgKiBAcGVlcl9hZGRyOiBwZWVyIG1hYyBhZGRyZXNzCisgKiBAYXV0aF9jYjogYXV0aCBjYWxsYmFjaworICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBSZXR1cm46IENERiBTdGF0dXMKKyAqLworQ0RGX1NUQVRVUyBzbWVfc2V0X3BlZXJfYXV0aG9yaXplZCh1aW50OF90ICpwZWVyX2FkZHIsCisJCQkJICAgc21lX3BlZXJfYXV0aG9yaXplZF9mcCBhdXRoX2NiLAorCQkJCSAgIHVpbnQzMl90IHZkZXZfaWQpCit7CisJdm9pZCAqd21hX2hhbmRsZTsKKworCXdtYV9oYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmICghd21hX2hhbmRsZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkid21hIGhhbmRsZSBpcyBOVUxMIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwl3bWFfc2V0X3BlZXJfYXV0aG9yaXplZF9jYih3bWFfaGFuZGxlLCBhdXRoX2NiKTsKKwlyZXR1cm4gd21hX3NldF9wZWVyX3BhcmFtKHdtYV9oYW5kbGUsIHBlZXJfYWRkciwgV01JX1BFRVJfQVVUSE9SSVpFLAorCQkJCSAgMSwgdmRldl9pZCk7Cit9CisKKy8qCisgKiBzbWVfZGlzYWJsZV9ub25fZmNjX2NoYW5uZWwoKSAtIG5vbi1mY2MgY2hhbm5lbCBkaXNhYmxlIHJlcXVlc3QKKyAqIEBoYWw6IEhBTCBwb2ludGVyCisgKiBAZmNjX2NvbnN0cmFpbnQ6IHRydWU6IGRpc2FibGUsIGZhbHNlOyBlbmFibGUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfZGlzYWJsZV9ub25fZmNjX2NoYW5uZWwodEhhbEhhbmRsZSBoYWwsIGJvb2wgZmNjX2NvbnN0cmFpbnQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdHBBbmlTaXJHbG9iYWwgbWFjX3B0ciAgPSBQTUFDX1NUUlVDVChoYWwpOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hY19wdHItPnNtZSk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCisJCWlmIChmY2NfY29uc3RyYWludCAhPSBtYWNfcHRyLT5zY2FuLmZjY19jb25zdHJhaW50KSB7CisJCQltYWNfcHRyLT5zY2FuLmZjY19jb25zdHJhaW50ID0gZmNjX2NvbnN0cmFpbnQ7CisKKwkJCS8qIHVwZGF0ZSB0aGUgY2hhbm5lbCBsaXN0IGluIGZpcm13YXJlICovCisJCQlzdGF0dXMgPSBjc3JfdXBkYXRlX2NoYW5uZWxfbGlzdChtYWNfcHRyKTsKKwkJfQorCisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZtYWNfcHRyLT5zbWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisvKioKKyAqIHNtZV9zZXRkZWZfZG90MTFtb2RlKCkgLSBVcGRhdGVzIHBNYWMgd2l0aCBkZWZhdWx0IGRvdDExbW9kZQorICogQGhhbDogR2xvYmFsIE1BQyBwb2ludGVyCisgKgorICogUmV0dXJuOiBOVUxMLgorICovCit2b2lkIHNtZV9zZXRkZWZfZG90MTFtb2RlKHRIYWxIYW5kbGUgaGFsKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWwpOworCWNzcl9zZXRfZGVmYXVsdF9kb3QxMV9tb2RlKG1hY19jdHgpOworfQorCisvKioKKyAqIHNtZV91cGRhdGVfcm9hbV9zY2FuX2hpX3Jzc2lfc2Nhbl9wYXJhbXMoKSAtIHVwZGF0ZSBoaWdoIHJzc2kgc2NhbgorICogICAgICAgICBwYXJhbXMKKyAqIEBoYWxfaGFuZGxlIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICogQHNlc3Npb25faWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAqIEBub3RpZnlfaWQgLSBJZGVudGlmaWVzIDEgb2YgdGhlIDQgcGFyYW1ldGVycyB0byBiZSBtb2RpZmllZAorICogQHZhbCBOZXcgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyAtIFNNRSB1cGRhdGUgY29uZmlnIHN1Y2Nlc3NmdWwuCisgKiAgICAgICAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgZmFpbGVkIHRvIHVwZGF0ZQorICovCisKK0NERl9TVEFUVVMgc21lX3VwZGF0ZV9yb2FtX3NjYW5faGlfcnNzaV9zY2FuX3BhcmFtcyh0SGFsSGFuZGxlIGhhbF9oYW5kbGUsCisJdWludDhfdCBzZXNzaW9uX2lkLAorCXVpbnQzMl90IG5vdGlmeV9pZCwKKwlpbnQzMl90IHZhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsX2hhbmRsZSk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRDc3JOZWlnaGJvclJvYW1Db25maWcgKm5yX2NvbmZpZyA9IE5VTEw7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBucl9pbmZvID0gTlVMTDsKKwl1aW50MzJfdCByZWFzb24gPSAwOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCW5yX2NvbmZpZyA9ICZtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZzsKKwkJbnJfaW5mbyAgID0gJm1hY19jdHgtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uX2lkXTsKKwkJc3dpdGNoIChub3RpZnlfaWQpIHsKKwkJY2FzZSBlQ1NSX0hJX1JTU0lfU0NBTl9NQVhDT1VOVF9JRDoKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJIiVzOiBnUm9hbVNjYW5IaXJzc2lNYXhDb3VudCAlZCA9PiAlZCIsCisJCQkJX19mdW5jX18sIG5yX2NvbmZpZy0+bmhpX3Jzc2lfc2Nhbl9tYXhfY291bnQsCisJCQkJdmFsKTsKKwkJCW5yX2NvbmZpZy0+bmhpX3Jzc2lfc2Nhbl9tYXhfY291bnQgPSB2YWw7CisJCQlucl9pbmZvLT5jZmdQYXJhbXMuaGlfcnNzaV9zY2FuX21heF9jb3VudCA9IHZhbDsKKwkJCXJlYXNvbiA9IFJFQVNPTl9ST0FNX1NDQU5fSElfUlNTSV9NQVhDT1VOVF9DSEFOR0VEOworCQlicmVhazsKKworCQljYXNlIGVDU1JfSElfUlNTSV9TQ0FOX1JTU0lfREVMVEFfSUQ6CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCUZMKCJnUm9hbVNjYW5IaVJzc2lEZWx0YSAlZCA9PiAlZCIpLAorCQkJCW5yX2NvbmZpZy0+bmhpX3Jzc2lfc2Nhbl9yc3NpX2RlbHRhLAorCQkJCXZhbCk7CisJCQlucl9jb25maWctPm5oaV9yc3NpX3NjYW5fcnNzaV9kZWx0YSA9IHZhbDsKKwkJCW5yX2luZm8tPmNmZ1BhcmFtcy5oaV9yc3NpX3NjYW5fcnNzaV9kZWx0YSA9IHZhbDsKKwkJCXJlYXNvbiA9IFJFQVNPTl9ST0FNX1NDQU5fSElfUlNTSV9ERUxUQV9DSEFOR0VEOworCQkJYnJlYWs7CisKKwkJY2FzZSBlQ1NSX0hJX1JTU0lfU0NBTl9ERUxBWV9JRDoKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJRkwoImdSb2FtU2NhbkhpUnNzaURlbGF5ICVkID0+ICVkIiksCisJCQkJbnJfY29uZmlnLT5uaGlfcnNzaV9zY2FuX2RlbGF5LAorCQkJCXZhbCk7CisJCQlucl9jb25maWctPm5oaV9yc3NpX3NjYW5fZGVsYXkgPSB2YWw7CisJCQlucl9pbmZvLT5jZmdQYXJhbXMuaGlfcnNzaV9zY2FuX2RlbGF5ID0gdmFsOworCQkJcmVhc29uID0gUkVBU09OX1JPQU1fU0NBTl9ISV9SU1NJX0RFTEFZX0NIQU5HRUQ7CisJCQlicmVhazsKKworCQljYXNlIGVDU1JfSElfUlNTSV9TQ0FOX1JTU0lfVUJfSUQ6CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCUZMKCJnUm9hbVNjYW5IaVJzc2lVcHBlckJvdW5kICVkID0+ICVkIiksCisJCQkJbnJfY29uZmlnLT5uaGlfcnNzaV9zY2FuX3Jzc2lfdWIsCisJCQkJdmFsKTsKKwkJCW5yX2NvbmZpZy0+bmhpX3Jzc2lfc2Nhbl9yc3NpX3ViID0gdmFsOworCQkJbnJfaW5mby0+Y2ZnUGFyYW1zLmhpX3Jzc2lfc2Nhbl9yc3NpX3ViID0gdmFsOworCQkJcmVhc29uID0gUkVBU09OX1JPQU1fU0NBTl9ISV9SU1NJX1VCX0NIQU5HRUQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQlGTCgiaW52YWxpZCBwYXJhbWV0ZXIgbm90aWZ5X2lkICVkIiksCisJCQkJbm90aWZ5X2lkKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZtYWNfY3R4LT5zbWUpOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9TQ0FOX09GRkxPQUQKKwlpZiAobWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5pc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQgJiYKKwkJc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4obWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCVJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcsIHJlYXNvbik7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gc3RhdHVzOworfQorCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9zcmMvY29tbW9uL3NtZV9mdF9hcGkuYyBiL2NvcmUvc21lL3NyYy9jb21tb24vc21lX2Z0X2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OGUxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9zcmMvY29tbW9uL3NtZV9mdF9hcGkuYwpAQCAtMCwwICsxLDYzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxicmllZiBEZWZpbml0aW9ucyBmb3IgU01FIEZUIEFQSXMKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBGaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxzbXNfZGVidWcuaD4KKyNpbmNsdWRlIDxjc3JfaW5zaWRlX2FwaS5oPgorI2luY2x1ZGUgPGNzcl9uZWlnaGJvcl9yb2FtLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluaXRpYWxpemUgdGhlIEZUIGNvbnRleHQuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfZnRfb3Blbih0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKE5VTEwgIT0gcFNlc3Npb24pIHsKKwkJLyogQ2xlYW4gdXAgdGhlIGNvbnRleHQgKi8KKwkJY2RmX21lbV9zZXQoJnBTZXNzaW9uLT5mdFNtZUNvbnRleHQsIHNpemVvZih0ZnRTTUVDb250ZXh0KSwgMCk7CisKKwkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5wVXNyQ3R4ID0KKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0RlRSb2FtQ2FsbGJhY2tVc3JDdHgpKTsKKworCQlpZiAoTlVMTCA9PSBwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnBVc3JDdHgpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5wVXNyQ3R4LT5wTWFjID0gcE1hYzsKKwkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5wVXNyQ3R4LT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKwkJc3RhdHVzID0KKwkJCWNkZl9tY190aW1lcl9pbml0KCZwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LgorCQkJCQkgIHByZUF1dGhSZWFzc29jSW50dmxUaW1lciwKKwkJCQkJICBDREZfVElNRVJfVFlQRV9TVywKKwkJCQkJICBzbWVfcHJlYXV0aF9yZWFzc29jX2ludHZsX3RpbWVyX2NhbGxiYWNrLAorCQkJCQkgICh2b2lkICopcFNlc3Npb24tPmZ0U21lQ29udGV4dC5wVXNyQ3R4KTsKKworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiUHJlYXV0aCBSZWFzc29jIGludGVydmFsIFRpbWVyIGFsbG9jYXRpb24gZmFpbGVkIikpOworCQkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5mdFNtZUNvbnRleHQucFVzckN0eCk7CisJCQlwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnBVc3JDdHggPSBOVUxMOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBDbGVhbnVwIHRoZSBTTUUgRlQgR2xvYmFsIGNvbnRleHQuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfZnRfY2xvc2UodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBOVUxMOworCisJLyogQ2xlYXIgdGhlIEZUIENvbnRleHQgKi8KKwlzbWVfZnRfcmVzZXQoaEhhbCwgc2Vzc2lvbklkKTsKKworCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJaWYgKE5VTEwgIT0gcFNlc3Npb24pIHsKKwkJLyogY2hlY2sgaWYgdGhlIHRpbWVyIGlzIHJ1bm5pbmcgKi8KKwkJaWYgKENERl9USU1FUl9TVEFURV9SVU5OSU5HID09CisJCSAgICBjZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoJnBTZXNzaW9uLT5mdFNtZUNvbnRleHQuCisJCQkJCQkgICBwcmVBdXRoUmVhc3NvY0ludHZsVGltZXIpKSB7CisJCQljZGZfbWNfdGltZXJfc3RvcCgmcFNlc3Npb24tPmZ0U21lQ29udGV4dC4KKwkJCQkJICBwcmVBdXRoUmVhc3NvY0ludHZsVGltZXIpOworCQl9CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkgICAgY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnBTZXNzaW9uLT5mdFNtZUNvbnRleHQuCisJCQkJCSBwcmVBdXRoUmVhc3NvY0ludHZsVGltZXIpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoInByZUF1dGhSZUFzc29jVGltZXIgZGVzdHJveSBmYWlsZWQiKSk7CisJCX0KKworCQlpZiAocFNlc3Npb24tPmZ0U21lQ29udGV4dC5wVXNyQ3R4ICE9IE5VTEwpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HMSwKKwkJCQlGTAorCQkJCQkoIkZyZWVpbmcgZnRTbWVDb250ZXh0LnBVc3JDdHggYW5kIHNldHRpbmcgdG8gTlVMTCIpKTsKKwkJCWNkZl9tZW1fZnJlZShwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnBVc3JDdHgpOworCQkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5wVXNyQ3R4ID0gTlVMTDsKKwkJfQorCX0KK30KKwordm9pZCBzbWVfc2V0X2Z0X3ByZV9hdXRoX3N0YXRlKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkLCBib29sIHN0YXRlKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJaWYgKHBTZXNzaW9uKQorCQlwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnNldEZUUHJlQXV0aFN0YXRlID0gc3RhdGU7Cit9CisKK2Jvb2wgc21lX2dldF9mdF9wcmVfYXV0aF9zdGF0ZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJaWYgKHBTZXNzaW9uKQorCQlyZXR1cm4gcFNlc3Npb24tPmZ0U21lQ29udGV4dC5zZXRGVFByZUF1dGhTdGF0ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBzbWVfc2V0X2Z0X2llcygpIC0gdG8gc2V0IEZUIElFcworICogQGhhbF9wdHI6IHBvaW50ZXIgdG8gSEFMCisgKiBAc2Vzc2lvbl9pZDogc21lIHNlc3Npb24gaWQKKyAqIEBmdF9pZXM6IHBvaW50ZXIgdG8gRlQgSUVzCisgKiBAZnRfaWVzX2xlbmd0aDogbGVuZ3RoIG9mIEZUIElFcworICoKKyAqIEVhY2ggdGltZSB0aGUgc3VwcGxpY2FudCBzZW5kcyBkb3duIHRoZSBGVCBJRXMgdG8gdGhlIGRyaXZlci4gVGhpcyBmdW5jdGlvbgorICogaXMgY2FsbGVkIGluIFNNRS4gVGhpcyBmdWNudGlvbiBwYWNrYWdlcyBhbmQgc2VuZHMgdGhlIEZUIElFcyB0byBQRS4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBzbWVfc2V0X2Z0X2llcyh0SGFsSGFuZGxlIGhhbF9wdHIsIHVpbnQzMl90IHNlc3Npb25faWQsCisJCWNvbnN0IHVpbnQ4X3QgKmZ0X2llcywgdWludDE2X3QgZnRfaWVzX2xlbmd0aCkKK3sKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsX3B0cik7CisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25faWQpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAoTlVMTCA9PSBzZXNzaW9uIHx8IE5VTEwgPT0gZnRfaWVzKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIiBmdCBpZXMgb3Igc2Vzc2lvbiBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJm1hY19jdHgtPnNtZSk7CisJaWYgKCEoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpKQorCQlyZXR1cm47CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCAiRlQgSUVzIFJlcSBpcyByZWNlaXZlZCBpbiBzdGF0ZSAlZCIsCisJCQlzZXNzaW9uLT5mdFNtZUNvbnRleHQuRlRTdGF0ZSk7CisjZW5kaWYKKworCS8qIEdsb2JhbCBTdGF0aW9uIEZUIFN0YXRlICovCisJc3dpdGNoIChzZXNzaW9uLT5mdFNtZUNvbnRleHQuRlRTdGF0ZSkgeworCWNhc2UgZUZUX1NUQVJUX1JFQURZOgorCWNhc2UgZUZUX0FVVEhfUkVRX1JFQURZOgorCQlpZiAoKHNlc3Npb24tPmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llcykgJiYKKwkJCShzZXNzaW9uLT5mdFNtZUNvbnRleHQuYXV0aF9mdF9pZXNfbGVuZ3RoKSkgeworCQkJLyogRnJlZSB0aGUgb25lIHdlIHJlY3ZkIGxhc3QgZnJvbSBzdXBwbGljYW50ICovCisJCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzKTsKKwkJCXNlc3Npb24tPmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llc19sZW5ndGggPSAwOworCQkJc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzID0gTlVMTDsKKwkJfQorCQkvKiBTYXZlIHRoZSBGVCBJRXMgKi8KKwkJc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzID0KKwkJCQkJY2RmX21lbV9tYWxsb2MoZnRfaWVzX2xlbmd0aCk7CisJCWlmIChOVUxMID09IHNlc3Npb24tPmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llcykgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJNZW0gYWxsb2MgZmFpbGVkIGZvciBhdXRoX2Z0X2llcyIpKTsKKwkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZtYWNfY3R4LT5zbWUpOworCQkJcmV0dXJuOworCQl9CisJCXNlc3Npb24tPmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llc19sZW5ndGggPSBmdF9pZXNfbGVuZ3RoOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKilzZXNzaW9uLT5mdFNtZUNvbnRleHQuYXV0aF9mdF9pZXMsCisJCQkJZnRfaWVzLCBmdF9pZXNfbGVuZ3RoKTsKKwkJc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LkZUU3RhdGUgPSBlRlRfQVVUSF9SRVFfUkVBRFk7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJmdF9pZXNfbGVuZ3RoPSVkIiksIGZ0X2llc19sZW5ndGgpOworI2VuZGlmCisJCWJyZWFrOworCisJY2FzZSBlRlRfQVVUSF9DT01QTEVURToKKwkJLyoKKwkJICogV2Ugd2lsbCBuZWVkIHRvIHJlLXN0YXJ0IHByZWF1dGguIElmIHdlIHJlY2VpdmVkIEZUCisJCSAqIElFcyBpbiBlRlRfUFJFX0FVVEhfRE9ORSBzdGF0ZSwgaXQgaW1wbGllcyB0aGVyZSB3YXMKKwkJICogYSByZWtleSBpbiBvdXIgcHJlLWF1dGggc3RhdGUuIEhlbmNlIHRoaXMgaW1wbGllcyB3ZQorCQkgKiBuZWVkIFByZS1hdXRoIGFnYWluLiBPSyBub3cgaW5mb3JtIFNNRSB3ZSBoYXZlIG5vCisJCSAqIHByZS1hdXRoIGxpc3QuIERlbGV0ZSB0aGUgcHJlLWF1dGggbm9kZSBsb2NhbGx5LiBTZXQKKwkJICogeW91ciBzZWxmIGJhY2sgdG8gcmVzdGFydCBwcmUtYXV0aAorCQkgKi8KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJQcmVhdXRoIGRvbmUgJiByY3ZpbmcgQVVUSFJFUSBpbiBzdGF0ZSAlZCIpLAorCQkJc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LkZUU3RhdGUpOworCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiVW5oYW5kbGVkIHJlY2VwdGlvbiBvZiBGVCBJRVMgaW4gc3RhdGUgJWQiKSwKKwkJCXNlc3Npb24tPmZ0U21lQ29udGV4dC5GVFN0YXRlKTsKKyNlbmRpZgorCQlicmVhazsKKworCWNhc2UgZUZUX1JFQVNTT0NfUkVRX1dBSVQ6CisJCS8qCisJCSAqIFdlIGFyZSBkb25lIHdpdGggcHJlLWF1dGgsIGhlbmNlIG5vdyB3YWl0aW5nIGZvcgorCQkgKiByZWFzc29jIHJlcS4gVGhpcyBpcyB0aGUgbmV3IEZUIFJvYW1pbmcgaW4gcGxhY2UgQXQKKwkJICogdGhpcyBqdW5jdHVyZSB3ZSdyIHJlYWR5IHRvIHN0YXJ0IHNlbmRpbmcgUmVhc3NvYyByZXEKKwkJICovCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsIEZMKCJOZXcgUmVhc3NvYyBSZXE9JXAgaW4gc3RhdGUgJWQiKSwKKwkJCWZ0X2llcywgc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LkZUU3RhdGUpOworI2VuZGlmCisJCWlmICgoc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzKSAmJgorCQkJKHNlc3Npb24tPmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llc19sZW5ndGgpKSB7CisJCQkvKiBGcmVlIHRoZSBvbmUgd2UgcmVjdmQgbGFzdCBmcm9tIHN1cHBsaWNhbnQgKi8KKwkJCWNkZl9tZW1fZnJlZShzZXNzaW9uLT5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXMpOworCQkJc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzX2xlbmd0aCA9IDA7CisJCX0KKwkJLyogU2F2ZSB0aGUgRlQgSUVzICovCisJCXNlc3Npb24tPmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llcyA9CisJCQkJCWNkZl9tZW1fbWFsbG9jKGZ0X2llc19sZW5ndGgpOworCQlpZiAoTlVMTCA9PSBzZXNzaW9uLT5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXMpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiTWVtIGFsbG9jIGZhaWwgZm9yIHJlYXNzb2NfZnRfaWUiKSk7CisJCQlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmbWFjX2N0eC0+c21lKTsKKwkJCXJldHVybjsKKwkJfQorCQlzZXNzaW9uLT5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXNfbGVuZ3RoID0KKwkJCQkJCQlmdF9pZXNfbGVuZ3RoOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKilzZXNzaW9uLT5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXMsCisJCQkJZnRfaWVzLCBmdF9pZXNfbGVuZ3RoKTsKKworCQlzZXNzaW9uLT5mdFNtZUNvbnRleHQuRlRTdGF0ZSA9IGVGVF9TRVRfS0VZX1dBSVQ7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiZnRfaWVzX2xlbmd0aD0lZCBzdGF0ZT0lZCIpLCBmdF9pZXNfbGVuZ3RoLAorCQkJc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LkZUU3RhdGUpOworI2VuZGlmCisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJVbmhhbmRsZWQgc3RhdGU9JWQiKSwKKwkJCXNlc3Npb24tPmZ0U21lQ29udGV4dC5GVFN0YXRlKTsKKwkJYnJlYWs7CisJfQorCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZtYWNfY3R4LT5zbWUpOworfQorCisvKioKKyAqIHNtZV9mdF9zZW5kX3VwZGF0ZV9rZXlfaW5kKCkgLSBUbyBzZW5kIGtleSB1cGRhdGUgaW5kaWNhdGlvbiBmb3IgRlQgc2Vzc2lvbgorICogQGhhbDogcG9pbnRlciB0byBIQUwKKyAqIEBzZXNzaW9uX2lkOiBzbWUgc2Vzc2lvbiBpZAorICogQGZ0a2V5X2luZm86IEZUIGtleSBpbmZvcm1hdGlvbgorICoKKyAqIFRvIHNlbmQga2V5IHVwZGF0ZSBpbmRpY2F0aW9uIGZvciBGVCBzZXNzaW9uCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK3N0YXRpYworQ0RGX1NUQVRVUyBzbWVfZnRfc2VuZF91cGRhdGVfa2V5X2luZCh0SGFsSGFuZGxlIGhhbCwgdWludDMyX3Qgc2Vzc2lvbl9pZCwKKwkJCQkgICAgICB0Q3NyUm9hbVNldEtleSAqZnRrZXlfaW5mbykKK3sKKwl0U2lyRlRVcGRhdGVLZXlJbmZvICptc2c7CisJdWludDE2X3QgbXNnbGVuOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdFNpcktleU1hdGVyaWFsICprZXltYXRlcmlhbCA9IE5VTEw7CisJdEFuaUVkVHlwZSBlZF90eXBlOworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWwpOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwlpbnQgaSA9IDA7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsIEZMKCJrZXlMZW5ndGggJWQiKSwgZnRrZXlfaW5mby0+a2V5TGVuZ3RoKTsKKwlmb3IgKGkgPSAwOyBpIDwgZnRrZXlfaW5mby0+a2V5TGVuZ3RoOyBpKyspCisJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwgRkwoIiUwMngiKSwgZnRrZXlfaW5mby0+S2V5W2ldKTsKKyNlbmRpZgorCisJaWYgKGZ0a2V5X2luZm8tPmtleUxlbmd0aCA+IENTUl9NQVhfS0VZX0xFTikgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJpbnZhbGlkIGtleUxlbmd0aCAlZCIpLAorCQkJZnRrZXlfaW5mby0+a2V5TGVuZ3RoKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwltc2dsZW4gID0gc2l6ZW9mKHRTaXJGVFVwZGF0ZUtleUluZm8pOworCisJbXNnID0gY2RmX21lbV9tYWxsb2MobXNnbGVuKTsKKwlpZiAoTlVMTCA9PSBtc2cpCisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisKKwljZGZfbWVtX3NldChtc2csIG1zZ2xlbiwgMCk7CisJbXNnLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0ZUX1VQREFURV9LRVk7CisJbXNnLT5sZW5ndGggPSBtc2dsZW47CisKKwlrZXltYXRlcmlhbCA9ICZtc2ctPmtleU1hdGVyaWFsOworCWtleW1hdGVyaWFsLT5sZW5ndGggPSBmdGtleV9pbmZvLT5rZXlMZW5ndGg7CisJZWRfdHlwZSA9IGNzcl90cmFuc2xhdGVfZW5jcnlwdF90eXBlX3RvX2VkX3R5cGUoZnRrZXlfaW5mby0+ZW5jVHlwZSk7CisJa2V5bWF0ZXJpYWwtPmVkVHlwZSA9IGVkX3R5cGU7CisJa2V5bWF0ZXJpYWwtPm51bUtleXMgPSAxOworCWtleW1hdGVyaWFsLT5rZXlbMF0ua2V5SWQgPSBmdGtleV9pbmZvLT5rZXlJZDsKKwlrZXltYXRlcmlhbC0+a2V5WzBdLnVuaWNhc3QgPSAodWludDhfdCkgdHJ1ZTsKKwlrZXltYXRlcmlhbC0+a2V5WzBdLmtleURpcmVjdGlvbiA9IGZ0a2V5X2luZm8tPmtleURpcmVjdGlvbjsKKworCWNkZl9tZW1fY29weSgma2V5bWF0ZXJpYWwtPmtleVswXS5rZXlSc2MsCisJCQlmdGtleV9pbmZvLT5rZXlSc2MsIENTUl9NQVhfUlNDX0xFTik7CisJa2V5bWF0ZXJpYWwtPmtleVswXS5wYWVSb2xlID0gZnRrZXlfaW5mby0+cGFlUm9sZTsKKwlrZXltYXRlcmlhbC0+a2V5WzBdLmtleUxlbmd0aCA9IGZ0a2V5X2luZm8tPmtleUxlbmd0aDsKKworCWlmIChmdGtleV9pbmZvLT5rZXlMZW5ndGggJiYgZnRrZXlfaW5mby0+S2V5KSB7CisJCWNkZl9tZW1fY29weSgma2V5bWF0ZXJpYWwtPmtleVswXS5rZXksIGZ0a2V5X2luZm8tPktleSwKKwkJCQlmdGtleV9pbmZvLT5rZXlMZW5ndGgpOworCQlpZiAoZnRrZXlfaW5mby0+a2V5TGVuZ3RoID09IDE2KSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCQkJRkwoInNldCB1cGRhdGUgaW5kIGtleWlkeCglZCkgZW5jVHlwZSglZCkga2V5ID0gJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWCIpLAorCQkJCW1zZy0+a2V5TWF0ZXJpYWwua2V5WzBdLmtleUlkLAorCQkJCSh0QW5pRWRUeXBlKSBtc2ctPmtleU1hdGVyaWFsLmVkVHlwZSwKKwkJCQltc2ctPmtleU1hdGVyaWFsLmtleVswXS5rZXlbMF0sCisJCQkJbXNnLT5rZXlNYXRlcmlhbC5rZXlbMF0ua2V5WzFdLAorCQkJCW1zZy0+a2V5TWF0ZXJpYWwua2V5WzBdLmtleVsyXSwKKwkJCQltc2ctPmtleU1hdGVyaWFsLmtleVswXS5rZXlbM10sCisJCQkJbXNnLT5rZXlNYXRlcmlhbC5rZXlbMF0ua2V5WzRdLAorCQkJCW1zZy0+a2V5TWF0ZXJpYWwua2V5WzBdLmtleVs1XSwKKwkJCQltc2ctPmtleU1hdGVyaWFsLmtleVswXS5rZXlbNl0sCisJCQkJbXNnLT5rZXlNYXRlcmlhbC5rZXlbMF0ua2V5WzddLAorCQkJCW1zZy0+a2V5TWF0ZXJpYWwua2V5WzBdLmtleVs4XSwKKwkJCQltc2ctPmtleU1hdGVyaWFsLmtleVswXS5rZXlbOV0sCisJCQkJbXNnLT5rZXlNYXRlcmlhbC5rZXlbMF0ua2V5WzEwXSwKKwkJCQltc2ctPmtleU1hdGVyaWFsLmtleVswXS5rZXlbMTFdLAorCQkJCW1zZy0+a2V5TWF0ZXJpYWwua2V5WzBdLmtleVsxMl0sCisJCQkJbXNnLT5rZXlNYXRlcmlhbC5rZXlbMF0ua2V5WzEzXSwKKwkJCQltc2ctPmtleU1hdGVyaWFsLmtleVswXS5rZXlbMTRdLAorCQkJCW1zZy0+a2V5TWF0ZXJpYWwua2V5WzBdLmtleVsxNV0pOworCQl9CisJfQorCisJY2RmX21lbV9jb3B5KCZtc2ctPmJzc0lkWzBdLAorCQkJJmZ0a2V5X2luZm8tPnBlZXJNYWMuYnl0ZXNbMF0sIENERl9NQUNfQUREUl9TSVpFKTsKKwltc2ctPnNtZVNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCAiQlNTSUQgPSAiIE1BQ19BRERSRVNTX1NUUiwKKwkJTUFDX0FERFJfQVJSQVkobXNnLT5ic3NJZCkpOworCXN0YXR1cyA9IGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKG1zZyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitib29sIHNtZV9nZXRfZnRwdGtfc3RhdGUodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgicFNlc3Npb24gaXMgTlVMTCIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gcFNlc3Npb24tPmZ0U21lQ29udGV4dC5zZXRGVFBUS1N0YXRlOworfQorCit2b2lkIHNtZV9zZXRfZnRwdGtfc3RhdGUodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsIGJvb2wgc3RhdGUpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgicFNlc3Npb24gaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKwlwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnNldEZUUFRLU3RhdGUgPSBzdGF0ZTsKK30KKworQ0RGX1NUQVRVUyBzbWVfZnRfdXBkYXRlX2tleSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCSAgICAgdENzclJvYW1TZXRLZXkgKnBGVEtleUluZm8pCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJwU2Vzc2lvbiBpcyBOVUxMIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKHBGVEtleUluZm8gPT0gTlVMTCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsICIlczogcEZUS2V5SW5mbyBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKCEoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpKSB7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCXNtc19sb2cocE1hYywgTE9HMSwgInNtZV9mdF91cGRhdGVfa2V5IGlzIHJlY2VpdmVkIGluIHN0YXRlICVkIiwKKwkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5GVFN0YXRlKTsKKyNlbmRpZgorCisJLyogR2xvYmFsIFN0YXRpb24gRlQgU3RhdGUgKi8KKwlzd2l0Y2ggKHBTZXNzaW9uLT5mdFNtZUNvbnRleHQuRlRTdGF0ZSkgeworCWNhc2UgZUZUX1NFVF9LRVlfV0FJVDoKKwkJaWYgKHNtZV9nZXRfZnRfcHJlX2F1dGhfc3RhdGUoaEhhbCwgc2Vzc2lvbklkKSA9PSB0cnVlKSB7CisJCQlzdGF0dXMgPQorCQkJCXNtZV9mdF9zZW5kX3VwZGF0ZV9rZXlfaW5kKHBNYWMsIHNlc3Npb25JZCwgcEZUS2V5SW5mbyk7CisJCQlpZiAoc3RhdHVzICE9IDApIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR0UsICIlczogS2V5IHNldCBmYWlsdXJlICVkIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCQkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5zZXRGVFBUS1N0YXRlID0gZmFsc2U7CisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19GVF9QUkVBVVRIX0tFWV9GQUlMRUQ7CisJCQl9IGVsc2UgeworCQkJCXBTZXNzaW9uLT5mdFNtZUNvbnRleHQuc2V0RlRQVEtTdGF0ZSA9IHRydWU7CisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19GVF9QUkVBVVRIX0tFWV9TVUNDRVNTOworCQkJCXNtc19sb2cocE1hYywgTE9HMSwgIiVzOiBLZXkgc2V0IHN1Y2Nlc3MiLAorCQkJCQlfX2Z1bmNfXyk7CisJCQl9CisJCQlzbWVfc2V0X2Z0X3ByZV9hdXRoX3N0YXRlKGhIYWwsIHNlc3Npb25JZCwgZmFsc2UpOworCQl9CisKKwkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5GVFN0YXRlID0gZUZUX1NUQVJUX1JFQURZOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCXNtc19sb2cocE1hYywgTE9HMSwgIiVzOiBzdGF0ZSBjaGFuZ2VkIHRvICVkIHN0YXR1cyAlZCIsCisJCQlfX2Z1bmNfXywgcFNlc3Npb24tPmZ0U21lQ29udGV4dC5GVFN0YXRlLCBzdGF0dXMpOworI2VuZGlmCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCAiJXM6IFVuaGFuZGxlZCBzdGF0ZT0lZCIsIF9fZnVuY19fLAorCQkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5GVFN0YXRlKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWJyZWFrOworCX0KKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBIREQgSW50ZXJmYWNlIHRvIFNNRS4gU01FIG5vdyBzZW5kcyB0aGUgQXV0aCAyIGFuZCBSSUMgSUVzIHVwIHRvIHRoZSBzdXBwbGljYW50LgorICogVGhlIHN1cHBsaWNhbnQgd2lsbCB0aGVuIHByb2NlZWQgdG8gc2VuZCBkb3duIHRoZQorICogUmVhc3NvYyBSZXEuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfZ2V0X2Z0X3ByZV9hdXRoX3Jlc3BvbnNlKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgdWludDhfdCAqZnRfaWVzLCB1aW50MzJfdCBmdF9pZXNfaXBfbGVuLAorCQkJCSAgdWludDE2X3QgKmZ0X2llc19sZW5ndGgpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJwU2Vzc2lvbiBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJKmZ0X2llc19sZW5ndGggPSAwOworCisJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKCEoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpKQorCQlyZXR1cm47CisKKwkvKiBBbGwgb3Igbm90aGluZyAtIHByb2NlZWQgb25seSBpZiBib3RoIEJTU0lEIGFuZCBGVCBJRSBmaXQgKi8KKwlpZiAoKENERl9NQUNfQUREUl9TSVpFICsKKwkgICAgIHBTZXNzaW9uLT5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwLT5mdF9pZXNfbGVuZ3RoKSA+CisJICAgIGZ0X2llc19pcF9sZW4pIHsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCXJldHVybjsKKwl9CisJLyogaGRkIG5lZWRzIHRvIHBhY2sgdGhlIGJzc2lkIGFsc28gYWxvbmcgd2l0aCB0aGUgKi8KKwkvKiBhdXRoIHJlc3BvbnNlIHRvIHN1cHBsaWNhbnQgKi8KKwljZGZfbWVtX2NvcHkoZnRfaWVzLCBwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnByZUF1dGhic3NJZCwKKwkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisKKwkvKiBDb3B5IHRoZSBhdXRoIHJlc3AgRlRJRXMgKi8KKwljZGZfbWVtX2NvcHkoJihmdF9pZXNbQ0RGX01BQ19BRERSX1NJWkVdKSwKKwkJICAgICBwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcC0+ZnRfaWVzLAorCQkgICAgIHBTZXNzaW9uLT5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwLT5mdF9pZXNfbGVuZ3RoKTsKKworCSpmdF9pZXNfbGVuZ3RoID0gQ0RGX01BQ19BRERSX1NJWkUgKworCQkJIHBTZXNzaW9uLT5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwLT5mdF9pZXNfbGVuZ3RoOworCisJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5GVFN0YXRlID0gZUZUX1JFQVNTT0NfUkVRX1dBSVQ7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIiBGaWxsZWQgYXV0aCByZXNwID0gJWQiKSwgKmZ0X2llc19sZW5ndGgpOworI2VuZGlmCisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU01FIG5vdyBzZW5kcyB0aGUgUklDIElFcyB1cCB0byB0aGUgc3VwcGxpY2FudC4KKyAqIFRoZSBzdXBwbGljYW50IHdpbGwgdGhlbiBwcm9jZWVkIHRvIHNlbmQgZG93biB0aGUKKyAqIFJlYXNzb2MgUmVxLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX2dldF9yaWNpX2VzKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkLCB1aW50OF90ICpyaWNfaWVzLAorCQkgICAgIHVpbnQzMl90IHJpY19pZXNfaXBfbGVuLCB1aW50MzJfdCAqcmljX2llc19sZW5ndGgpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJwU2Vzc2lvbiBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJKnJpY19pZXNfbGVuZ3RoID0gMDsKKworCXN0YXR1cyA9IHNtZV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCWlmICghKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSkKKwkJcmV0dXJuOworCisJLyogQWxsIG9yIG5vdGhpbmcgKi8KKwlpZiAocFNlc3Npb24tPmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AtPnJpY19pZXNfbGVuZ3RoID4KKwkgICAgcmljX2llc19pcF9sZW4pIHsKKwkJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCXJldHVybjsKKwl9CisKKwljZGZfbWVtX2NvcHkocmljX2llcywKKwkJICAgICBwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcC0+cmljX2llcywKKwkJICAgICBwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcC0+cmljX2llc19sZW5ndGgpOworCisJKnJpY19pZXNfbGVuZ3RoID0KKwkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AtPnJpY19pZXNfbGVuZ3RoOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKwlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCIgRmlsbGVkIHJpYyBpZXMgPSAlZCIpLCAqcmljX2llc19sZW5ndGgpOworI2VuZGlmCisKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlyZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaW1lciBjYWxsYmFjayBmb3IgdGhlIHRpbWVyIHRoYXQgaXMgc3RhcnRlZCBiZXR3ZWVuIHRoZSBwcmVhdXRoIGNvbXBsZXRpb24gYW5kCisgKiByZWFzc29jIHJlcXVlc3QgdG8gdGhlIFBFLiBJbiB0aGlzIGludGVydmFsLCBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBwcmUtYXV0aCByZXNwb25zZQorICogYW5kIFJJQyBJRXMgYXJlIHBhc3NlZCB1cCB0byB0aGUgV1BBIHN1cHBsaWNhbnQgYW5kIHJlY2VpdmVkIGJhY2sgdGhlIG5lY2Vzc2FyeSBGVElFcworICogcmVxdWlyZWQgdG8gYmUgc2VudCBpbiB0aGUgcmVhc3NvYyByZXF1ZXN0CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfcHJlYXV0aF9yZWFzc29jX2ludHZsX3RpbWVyX2NhbGxiYWNrKHZvaWQgKmNvbnRleHQpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKwl0RlRSb2FtQ2FsbGJhY2tVc3JDdHggKnBVc3JDdHggPSAodEZUUm9hbUNhbGxiYWNrVXNyQ3R4ICopIGNvbnRleHQ7CisKKwlpZiAocFVzckN0eCkgeworCQljc3JfbmVpZ2hib3Jfcm9hbV9yZXF1ZXN0X2hhbmRvZmYocFVzckN0eC0+cE1hYywKKwkJCQkJCSAgcFVzckN0eC0+c2Vzc2lvbklkKTsKKwl9CisjZW5kaWYKKwlyZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFJlc2V0IHRoZSBGVCBjb250ZXh0LgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX2Z0X3Jlc2V0KHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gTlVMTDsKKworCWlmIChwTWFjID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJwTWFjIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCWlmIChOVUxMICE9IHBTZXNzaW9uKSB7CisJCWlmIChwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisJCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQkJRkwoIkZyZWVpbmcgRlQgQXV0aCBJRSAlcCBhbmQgc2V0dGluZyB0byBOVUxMIiksCisJCQkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llcyk7CisjZW5kaWYKKwkJCWNkZl9tZW1fZnJlZShwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzKTsKKwkJCXBTZXNzaW9uLT5mdFNtZUNvbnRleHQuYXV0aF9mdF9pZXMgPSBOVUxMOworCQl9CisJCXBTZXNzaW9uLT5mdFNtZUNvbnRleHQuYXV0aF9mdF9pZXNfbGVuZ3RoID0gMDsKKworCQlpZiAocFNlc3Npb24tPmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llcyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMCisJCQkJCSgiRnJlZWluZyBGVCBSZWFzc29jIElFICVwIGFuZCBzZXR0aW5nIHRvIE5VTEwiKSwKKwkJCQlwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzKTsKKyNlbmRpZgorCQkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXMpOworCQkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llcyA9IE5VTEw7CisJCX0KKwkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llc19sZW5ndGggPSAwOworCisJCWlmIChwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcCAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworCQkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMCisJCQkJCSgiRnJlZWluZyBGdFByZUF1dGhSc3AgJXAgYW5kIHNldHRpbmcgdG8gTlVMTCIpLAorCQkJCXBTZXNzaW9uLT5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwKTsKKyNlbmRpZgorCQkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwKTsKKwkJCXBTZXNzaW9uLT5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwID0gTlVMTDsKKwkJfQorCQlwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnNldEZUUHJlQXV0aFN0YXRlID0gZmFsc2U7CisJCXBTZXNzaW9uLT5mdFNtZUNvbnRleHQuc2V0RlRQVEtTdGF0ZSA9IGZhbHNlOworCisJCWNkZl9tZW1femVybyhwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnByZUF1dGhic3NJZCwKKwkJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCQlwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LkZUU3RhdGUgPSBlRlRfU1RBUlRfUkVBRFk7CisJfQorfQorCisvKiBFbmQgb2YgRmlsZSAqLworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9zcmMvY29tbW9uL3NtZV9wb3dlcl9zYXZlLmMgYi9jb3JlL3NtZS9zcmMvY29tbW9uL3NtZV9wb3dlcl9zYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4Y2UyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL3NyYy9jb21tb24vc21lX3Bvd2VyX3NhdmUuYwpAQCAtMCwwICsxLDEyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAic21lX3Bvd2VyX3NhdmUuaCIKKyNpbmNsdWRlICJzbWVfcG93ZXJfc2F2ZV9hcGkuaCIKKyNpbmNsdWRlICJzbXNfZGVidWcuaCIKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAid21tX2Fwc2QuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAiY3NyX2luc2lkZV9hcGkuaCIKKworLyoqCisgKiBzbWVfcG9zdF9wc19tc2dfdG9fd21hKCk6IHBvc3QgbWVzc2FnZSB0byBXTUEuCisgKiBAdHlwZTogdHlwZQorICogQGJvZHk6IGJvZHkgcG9pbnRlcgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9wb3N0X3BzX21zZ190b193bWEodWludDE2X3QgdHlwZSwgdm9pZCAqYm9keSkKK3sKKwljZHNfbXNnX3QgbXNnOworCisJbXNnLnR5cGUgPSB0eXBlOworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHlwdHIgPSBib2R5OworCW1zZy5ib2R5dmFsID0gMDsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RzX21xX3Bvc3RfbWVzc2FnZSgKKwkJCQlDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIiVzOiBQb3N0aW5nIG1lc3NhZ2UgJWQgZmFpbGVkIiwKKwkJCQlfX2Z1bmNfXywgdHlwZSk7CisJCWNkZl9tZW1fZnJlZShib2R5KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHNtZV9wc19lbmFibGVfcHNfcmVxX3BhcmFtcygpOiBlbmFibGVzIHBvd2VyIHNhdmUgcmVxIHBhcmFtcworICogQG1hY19jdHg6IGdsb2JhbCBtYWMgY29udGV4dAorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfcHNfZW5hYmxlX3BzX3JlcV9wYXJhbXModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwlzdHJ1Y3Qgc0VuYWJsZVBzUGFyYW1zICplbmFibGVfcHNfcmVxX3BhcmFtczsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWVuYWJsZV9wc19yZXFfcGFyYW1zID0gIGNkZl9tZW1fbWFsbG9jKHNpemVvZigqZW5hYmxlX3BzX3JlcV9wYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBlbmFibGVfcHNfcmVxX3BhcmFtcykgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBlbmFibGVfcHNfcmVxX3BhcmFtcyIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJZW5hYmxlX3BzX3JlcV9wYXJhbXMtPnBzU2V0dGluZyA9IGVTSVJfQURET05fTk9USElORzsKKwllbmFibGVfcHNfcmVxX3BhcmFtcy0+c2Vzc2lvbmlkID0gc2Vzc2lvbl9pZDsKKworCXN0YXR1cyA9IHNtZV9wb3N0X3BzX21zZ190b193bWEoV01BX0VOVEVSX1BTX1JFUSwgZW5hYmxlX3BzX3JlcV9wYXJhbXMpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQlGTCgiTWVzc2FnZSBXTUFfRU5URVJfUFNfUkVRIFN1Y2Nlc3NmdWxseSBzZW50IHRvIFdNQSIpKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHNtZV9wc19kaXNhYmxlX3BzX3JlcV9wYXJhbXMoKTogRGlzYWJsZSBwb3dlciBzYXZlIHJlcSBwYXJhbXMKKyAqIEBtYWNfY3R4OiBnbG9iYWwgbWFjIGNvbnRleHQKKyAqIEBzZXNzaW9uX2lkOiBzZXNzaW9uIGlkCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX3BzX2Rpc2FibGVfcHNfcmVxX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCXN0cnVjdCAgc0Rpc2FibGVQc1BhcmFtcyAqZGlzYWJsZV9wc19yZXFfcGFyYW1zOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJZGlzYWJsZV9wc19yZXFfcGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpkaXNhYmxlX3BzX3JlcV9wYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBkaXNhYmxlX3BzX3JlcV9wYXJhbXMpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3Igc0Rpc2FibGVQc1BhcmFtcyIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlkaXNhYmxlX3BzX3JlcV9wYXJhbXMtPnBzU2V0dGluZyA9IGVTSVJfQURET05fTk9USElORzsKKwlkaXNhYmxlX3BzX3JlcV9wYXJhbXMtPnNlc3Npb25pZCA9IHNlc3Npb25faWQ7CisKKwlzdGF0dXMgPSBzbWVfcG9zdF9wc19tc2dfdG9fd21hKFdNQV9FWElUX1BTX1JFUSwgZGlzYWJsZV9wc19yZXFfcGFyYW1zKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCUZMKCJNZXNzYWdlIFdNQV9FWElUX1BTX1JFUSBTdWNjZXNzZnVsbHkgc2VudCB0byBXTUEiKSk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzbWVfcHNfZW5hYmxlX3VhcHNkX3JlcV9wYXJhbXMoKTogZW5hYmxlcyBVQVNQRCByZXEgcGFyYW1zCisgKiBAbWFjX2N0eDogZ2xvYmFsIG1hYyBjb250ZXh0CisgKiBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBpZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9wc19lbmFibGVfdWFwc2RfcmVxX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCisJc3RydWN0IHNFbmFibGVVYXBzZFBhcmFtcyAqZW5hYmxlX3VhcHNkX3JlcV9wYXJhbXM7CisJdWludDhfdCB1YXBzZF9kZWxpdmVyeV9tYXNrID0gMDsKKwl1aW50OF90IHVhcHNkX3RyaWdnZXJfbWFzayA9IDA7CisJc3RydWN0IHBzX2dsb2JhbF9pbmZvICpwc19nbG9iYWxfaW5mbyA9ICZtYWNfY3R4LT5zbWUucHNfZ2xvYmFsX2luZm87CisJc3RydWN0IHBzX3BhcmFtcyAqcHNfcGFyYW0gPSAmcHNfZ2xvYmFsX2luZm8tPnBzX3BhcmFtc1tzZXNzaW9uX2lkXTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWVuYWJsZV91YXBzZF9yZXFfcGFyYW1zID0KKwkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCplbmFibGVfdWFwc2RfcmVxX3BhcmFtcykpOworCWlmIChOVUxMID09IGVuYWJsZV91YXBzZF9yZXFfcGFyYW1zKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIGVuYWJsZV91YXBzZF9yZXFfcGFyYW1zIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCisJdWFwc2RfZGVsaXZlcnlfbWFzayA9CisJCXBzX3BhcmFtLT51YXBzZF9wZXJfYWNfYml0X21hc2sgfAorCQlwc19wYXJhbS0+dWFwc2RfcGVyX2FjX2RlbGl2ZXJ5X2VuYWJsZV9tYXNrOworCisJdWFwc2RfdHJpZ2dlcl9tYXNrID0KKwkJcHNfcGFyYW0tPnVhcHNkX3Blcl9hY19iaXRfbWFzayB8CisJCXBzX3BhcmFtLT51YXBzZF9wZXJfYWNfdHJpZ2dlcl9lbmFibGVfbWFzazsKKworCisJZW5hYmxlX3VhcHNkX3JlcV9wYXJhbXMtPnVhcHNkUGFyYW1zLmJrRGVsaXZlcnlFbmFibGVkID0KKwkJTElNX1VBUFNEX0dFVChBQ0JLLCB1YXBzZF9kZWxpdmVyeV9tYXNrKTsKKworCWVuYWJsZV91YXBzZF9yZXFfcGFyYW1zLT51YXBzZFBhcmFtcy5iZURlbGl2ZXJ5RW5hYmxlZCA9CisJCUxJTV9VQVBTRF9HRVQoQUNCRSwgdWFwc2RfZGVsaXZlcnlfbWFzayk7CisKKwllbmFibGVfdWFwc2RfcmVxX3BhcmFtcy0+dWFwc2RQYXJhbXMudmlEZWxpdmVyeUVuYWJsZWQgPQorCQlMSU1fVUFQU0RfR0VUKEFDVkksIHVhcHNkX2RlbGl2ZXJ5X21hc2spOworCisJZW5hYmxlX3VhcHNkX3JlcV9wYXJhbXMtPnVhcHNkUGFyYW1zLnZvRGVsaXZlcnlFbmFibGVkID0KKwkJTElNX1VBUFNEX0dFVChBQ1ZPLCB1YXBzZF9kZWxpdmVyeV9tYXNrKTsKKworCWVuYWJsZV91YXBzZF9yZXFfcGFyYW1zLT51YXBzZFBhcmFtcy5ia1RyaWdnZXJFbmFibGVkID0KKwkJTElNX1VBUFNEX0dFVChBQ0JLLCB1YXBzZF90cmlnZ2VyX21hc2spOworCisJZW5hYmxlX3VhcHNkX3JlcV9wYXJhbXMtPnVhcHNkUGFyYW1zLmJlVHJpZ2dlckVuYWJsZWQgPQorCQlMSU1fVUFQU0RfR0VUKEFDQkUsIHVhcHNkX3RyaWdnZXJfbWFzayk7CisKKwllbmFibGVfdWFwc2RfcmVxX3BhcmFtcy0+dWFwc2RQYXJhbXMudmlUcmlnZ2VyRW5hYmxlZCA9CisJCUxJTV9VQVBTRF9HRVQoQUNWSSwgdWFwc2RfdHJpZ2dlcl9tYXNrKTsKKworCWVuYWJsZV91YXBzZF9yZXFfcGFyYW1zLT51YXBzZFBhcmFtcy52b1RyaWdnZXJFbmFibGVkID0KKwkJTElNX1VBUFNEX0dFVChBQ1ZPLCB1YXBzZF90cmlnZ2VyX21hc2spOworCisJZW5hYmxlX3VhcHNkX3JlcV9wYXJhbXMtPnNlc3Npb25pZCA9IHNlc3Npb25faWQ7CisKKwlzdGF0dXMgPSBzbWVfcG9zdF9wc19tc2dfdG9fd21hKFdNQV9FTkFCTEVfVUFQU0RfUkVRLAorCQkJCQllbmFibGVfdWFwc2RfcmVxX3BhcmFtcyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAgIEZMKCJNc2cgV01BX0VOQUJMRV9VQVBTRF9SRVEgU3VjY2Vzc2Z1bGx5IHNlbnQgdG8gV01BIikpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3BzX2Rpc2FibGVfdWFwc2RfcmVxX3BhcmFtcygpOiBkaXNhYmxlcyBVQVNQRCByZXEgcGFyYW1zCisgKiBAbWFjX2N0eDogZ2xvYmFsIG1hYyBjb250ZXh0CisgKiBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBpZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9wc19kaXNhYmxlX3VhcHNkX3JlcV9wYXJhbXModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwlzdHJ1Y3Qgc0Rpc2FibGVVYXBzZFBhcmFtcyAqZGlzYWJsZV91YXBzZF9yZXFfcGFyYW1zOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJZGlzYWJsZV91YXBzZF9yZXFfcGFyYW1zID0KKwkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpkaXNhYmxlX3VhcHNkX3JlcV9wYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBkaXNhYmxlX3VhcHNkX3JlcV9wYXJhbXMpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgZGlzYWJsZV91YXBzZF9yZXFfcGFyYW1zIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWRpc2FibGVfdWFwc2RfcmVxX3BhcmFtcy0+c2Vzc2lvbmlkID0gc2Vzc2lvbl9pZDsKKwlzdGF0dXMgPSBzbWVfcG9zdF9wc19tc2dfdG9fd21hKFdNQV9ESVNBQkxFX1VBUFNEX1JFUSwKKwkJCQkJZGlzYWJsZV91YXBzZF9yZXFfcGFyYW1zKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQlGTCgiTWVzc2FnZSBXTUFfRElTQUJMRV9VQVBTRF9SRVEgU3VjY2Vzc2Z1bGx5IHNlbnQgdG8gV01BIikpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3BzX2VudGVyX3dvd2xfcmVxX3BhcmFtcygpOiBlbmFibGUgV09XTCByZXEgUGFyYW1hCisgKiBAbWFjX2N0eDogZ2xvYmFsIG1hYyBjb250ZXh0CisgKiBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBpZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9wc19lbnRlcl93b3dsX3JlcV9wYXJhbXModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwlzdHJ1Y3Qgc1NpckhhbFdvd2xFbnRlclBhcmFtcyAqaGFsX3dvd2xfcGFyYW1zOworCXN0cnVjdCBzU2lyU21lV293bEVudGVyUGFyYW1zICpzbWVfd293bF9wYXJhbXM7CisJdWludDMyX3QgY2ZnX3ZhbHVlID0gMDsKKwlzdHJ1Y3QgcHNfZ2xvYmFsX2luZm8gKnBzX2dsb2JhbF9pbmZvID0gJm1hY19jdHgtPnNtZS5wc19nbG9iYWxfaW5mbzsKKworCXNtZV93b3dsX3BhcmFtcyA9CisJCSZwc19nbG9iYWxfaW5mby0+cHNfcGFyYW1zW3Nlc3Npb25faWRdLndvd2xfZW50ZXJfcGFyYW1zOworCisJaGFsX3dvd2xfcGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpoYWxfd293bF9wYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBoYWxfd293bF9wYXJhbXMpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJRkwoIkZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBFbnRlciBXb3dsIFJlcXVlc3QgIikpOworCQlyZXR1cm4gIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgaGFsX3dvd2xfcGFyYW1zLCBzaXplb2YoKmhhbF93b3dsX3BhcmFtcyksIDApOworCisJLyogZmlsbCBpbiB0aGUgbWVzc2FnZSBmaWVsZCAqLworCWhhbF93b3dsX3BhcmFtcy0+dWNNYWdpY1BrdEVuYWJsZSA9IHNtZV93b3dsX3BhcmFtcy0+dWNNYWdpY1BrdEVuYWJsZTsKKwloYWxfd293bF9wYXJhbXMtPnVjUGF0dGVybkZpbHRlcmluZ0VuYWJsZSA9CisJCXNtZV93b3dsX3BhcmFtcy0+dWNQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlOworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBoYWxfd293bF9wYXJhbXMtPm1hZ2ljUHRybiwKKwkJCSh1aW50OF90ICopIHNtZV93b3dsX3BhcmFtcy0+bWFnaWNQdHJuLAorCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKwloYWxfd293bF9wYXJhbXMtPnVjV29XRUFQSURSZXF1ZXN0RW5hYmxlID0KKwkJc21lX3dvd2xfcGFyYW1zLT51Y1dvV0VBUElEUmVxdWVzdEVuYWJsZTsKKwloYWxfd293bF9wYXJhbXMtPnVjV29XRUFQT0w0V2F5RW5hYmxlID0KKwkJc21lX3dvd2xfcGFyYW1zLT51Y1dvV0VBUE9MNFdheUVuYWJsZTsKKwloYWxfd293bF9wYXJhbXMtPnVjV293TmV0U2Nhbk9mZmxvYWRNYXRjaCA9CisJCXNtZV93b3dsX3BhcmFtcy0+dWNXb3dOZXRTY2FuT2ZmbG9hZE1hdGNoOworCWhhbF93b3dsX3BhcmFtcy0+dWNXb3dHVEtSZWtleUVycm9yID0KKwkJc21lX3dvd2xfcGFyYW1zLT51Y1dvd0dUS1Jla2V5RXJyb3I7CisJaGFsX3dvd2xfcGFyYW1zLT51Y1dvV0JTU0Nvbm5Mb3NzID0KKwkJc21lX3dvd2xfcGFyYW1zLT51Y1dvV0JTU0Nvbm5Mb3NzOworI2VuZGlmIC8qIFdMQU5fV0FLRVVQX0VWRU5UUyAqLworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQKKwkJCShtYWNfY3R4LCBXTklfQ0ZHX1dPV0xBTl9VQ0FTVF9QQVRURVJOX0ZJTFRFUl9FTkFCTEUsCisJCQkgJmNmZ192YWx1ZSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJjZmdHZXQgZmFpbGVkIGZvciBXTklfQ0ZHX1dPV0xBTl9VQ0FTVF9QQVRURVJOX0ZJTFRFUl9FTkFCTEUiKSk7CisJCWdvdG8gZW5kOworCX0KKwloYWxfd293bF9wYXJhbXMtPnVjVWNhc3RQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlID0gKHVpbnQ4X3QpIGNmZ192YWx1ZTsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50CisJCQkobWFjX2N0eCwgV05JX0NGR19XT1dMQU5fQ0hBTk5FTF9TV0lUQ0hfRU5BQkxFLAorCQkJICZjZmdfdmFsdWUpICE9IGVTSVJfU1VDQ0VTUykgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR1AsCisJCQlGTCgiY2ZnR2V0IGZhaWxlZCBmb3IgV05JX0NGR19XT1dMQU5fQ0hBTk5FTF9TV0lUQ0hfRU5BQkxFIikpOworCQlnb3RvIGVuZDsKKwl9CisJaGFsX3dvd2xfcGFyYW1zLT51Y1dvd0NobmxTd2l0Y2hSY3YgPSAodWludDhfdCkgY2ZnX3ZhbHVlOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQKKwkJCShtYWNfY3R4LCBXTklfQ0ZHX1dPV0xBTl9ERUFVVEhfRU5BQkxFLCAmY2ZnX3ZhbHVlKSAhPQorCQkJZVNJUl9TVUNDRVNTKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJjZmdHZXQgZmFpbGVkIGZvciBXTklfQ0ZHX1dPV0xBTl9ERUFVVEhfRU5BQkxFICIpKTsKKwkJZ290byBlbmQ7CisJfQorCWhhbF93b3dsX3BhcmFtcy0+dWNXb3dEZWF1dGhSY3YgPSAodWludDhfdCkgY2ZnX3ZhbHVlOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQKKwkJCShtYWNfY3R4LCBXTklfQ0ZHX1dPV0xBTl9ESVNBU1NPQ19FTkFCTEUsICZjZmdfdmFsdWUpICE9CisJCQllU0lSX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkgICAgICBGTCgiY2ZnR2V0IGZhaWxlZCBmb3IgV05JX0NGR19XT1dMQU5fRElTQVNTT0NfRU5BQkxFICIpKTsKKwkJZ290byBlbmQ7CisJfQorCWhhbF93b3dsX3BhcmFtcy0+dWNXb3dEaXNhc3NvY1JjdiA9ICh1aW50OF90KSBjZmdfdmFsdWU7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LCBXTklfQ0ZHX1dPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTiwKKwkJCQkmY2ZnX3ZhbHVlKSAhPQllU0lSX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkgICAgRkwoImNmZ0dldCBmYWlsZWQgZm9yIFdOSV9DRkdfV09XTEFOX01BWF9NSVNTRURfQkVBQ09OICIpKTsKKwkJZ290byBlbmQ7CisJfQorCWhhbF93b3dsX3BhcmFtcy0+dWNXb3dNYXhNaXNzZWRCZWFjb25zID0gKHVpbnQ4X3QpIGNmZ192YWx1ZTsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hY19jdHgsIFdOSV9DRkdfV09XTEFOX01BWF9TTEVFUF9QRVJJT0QsCisJCQkJJmNmZ192YWx1ZSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HUCwKKwkJICAgICBGTCgiY2ZnR2V0IGZhaWxlZCBmb3IgV05JX0NGR19XT1dMQU5fTUFYX1NMRUVQX1BFUklPRCAiKSk7CisJCWdvdG8gZW5kOworCX0KKwloYWxfd293bF9wYXJhbXMtPnVjV293TWF4U2xlZXBVc2VjID0gKHVpbnQ4X3QpIGNmZ192YWx1ZTsKKworCWhhbF93b3dsX3BhcmFtcy0+c2Vzc2lvbklkID0gc21lX3dvd2xfcGFyYW1zLT5zZXNzaW9uSWQ7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHNtZV9wb3N0X3BzX21zZ190b193bWEoV01BX1dPV0xfRU5URVJfUkVRLAorCQkJCQkJCWhhbF93b3dsX3BhcmFtcykpeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJRkwoIk1zZyBXTUFfV09XTF9FTlRFUl9SRVEgU3VjY2Vzc2Z1bGx5IHNlbnQgdG8gV01BIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0gZWxzZQorCQlnb3RvIGVuZDsKKworZW5kOgorCWlmIChoYWxfd293bF9wYXJhbXMgIT0gTlVMTCkKKwkJY2RmX21lbV9mcmVlKGhhbF93b3dsX3BhcmFtcyk7CisJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworfQorCisvKioKKyAqIHNtZV9wc19leGl0X3dvd2xfcmVxX3BhcmFtcygpOiBFeGl0IFdPV0wgcmVxIHBhcmFtcworICogQG1hY19jdHg6IGdsb2JhbCBtYWMgY29udGV4dAorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfcHNfZXhpdF93b3dsX3JlcV9wYXJhbXModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwlzdHJ1Y3Qgc1NpckhhbFdvd2xFeGl0UGFyYW1zICpoYWxfd293bF9tc2c7CisJaGFsX3dvd2xfbXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpoYWxfd293bF9tc2cpKTsKKwlpZiAoTlVMTCA9PSBoYWxfd293bF9tc2cpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJRkwoIkZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBXb1dMQU4gQWRkIEJjYXN0IFBhdHRlcm4gIikpOworCQlyZXR1cm4gIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJY2RmX21lbV9zZXQoKHVpbnQ4X3QgKikgaGFsX3dvd2xfbXNnLAorCQkJc2l6ZW9mKCpoYWxfd293bF9tc2cpLCAwKTsKKwloYWxfd293bF9tc2ctPnNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHNtZV9wb3N0X3BzX21zZ190b193bWEoV01BX1dPV0xfRVhJVF9SRVEsCisJCQkJCQkJaGFsX3dvd2xfbXNnKSl7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQlGTCgiTXNnIFdNQV9XT1dMX0VYSVRfUkVRIFN1Y2Nlc3NmdWxseSBzZW50IHRvIFdNQSIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJaWYgKGhhbF93b3dsX21zZyAhPSBOVUxMKQorCQljZGZfbWVtX2ZyZWUoaGFsX3dvd2xfbXNnKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKy8qKgorICogc21lX3BzX3Byb2Nlc3NfY29tbWFuZCgpOiBTbWUgcHJvY2VzcyBwb3dlciBzYXZlIG1lc3NhZ2VzCisgKgkJCWFuZCBwYXNzIG1lc3NhZ2VzIHRvIFdNQS4KKyAqIEBtYWNfY3R4OiBnbG9iYWwgbWFjIGNvbnRleHQKKyAqIEBzZXNzaW9uX2lkOiBzZXNzaW9uIGlkCisgKiBzbWVfcHNfY21kOiBwb3dlciBzYXZlIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfcHNfcHJvY2Vzc19jb21tYW5kKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQzMl90IHNlc3Npb25faWQsCisJCWVudW0gc21lX3BzX2NtZCBjb21tYW5kKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKCFDU1JfSVNfU0VTU0lPTl9WQUxJRChtYWNfY3R4LCBzZXNzaW9uX2lkKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsICJJbnZhbGlkIFNlc3Npb25faWQgJXgiLCBzZXNzaW9uX2lkKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCUZMKCJQb3dlciBTYXZlIGNvbW1hbmQgJWQiKSwgY29tbWFuZCk7CisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBTTUVfUFNfRU5BQkxFOgorCQlzdGF0dXMgPSBzbWVfcHNfZW5hYmxlX3BzX3JlcV9wYXJhbXMobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJCWJyZWFrOworCWNhc2UgU01FX1BTX0RJU0FCTEU6CisJCXN0YXR1cyA9IHNtZV9wc19kaXNhYmxlX3BzX3JlcV9wYXJhbXMobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJCWJyZWFrOworCWNhc2UgU01FX1BTX1VBUFNEX0VOQUJMRToKKwkJc3RhdHVzID0gc21lX3BzX2VuYWJsZV91YXBzZF9yZXFfcGFyYW1zKG1hY19jdHgsIHNlc3Npb25faWQpOworCQlicmVhazsKKwljYXNlIFNNRV9QU19VQVBTRF9ESVNBQkxFOgorCQlzdGF0dXMgPSBzbWVfcHNfZGlzYWJsZV91YXBzZF9yZXFfcGFyYW1zKG1hY19jdHgsIHNlc3Npb25faWQpOworCQlicmVhazsKKwljYXNlIFNNRV9QU19XT1dMX0VOVEVSOgorCQlzdGF0dXMgPSBzbWVfcHNfZW50ZXJfd293bF9yZXFfcGFyYW1zKG1hY19jdHgsIHNlc3Npb25faWQpOworCQlicmVhazsKKwljYXNlIFNNRV9QU19XT1dMX0VYSVQ6CisJCXN0YXR1cyA9IHNtZV9wc19leGl0X3dvd2xfcmVxX3BhcmFtcyhtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJJbnZhbGlkIGNvbW1hbmQgdHlwZSAlZCIpLAorCQkJCWNvbW1hbmQpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJYnJlYWs7CisJfQorCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIk5vdCBhYmxlIHRvIGVudGVyIGluIFBTLCBDb21tYW5kOiAlZCIpLCBjb21tYW5kKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfZW5hYmxlX3N0YV9wc19jaGVjaygpOiBDaGVja3MgaWYgaXQgaXMgb2sgdG8gZW5hYmxlIHBvd2VyIHNhdmUgb3Igbm90LgorICogQG1hY19jdHg6IGdsb2JhbCBtYWMgY29udGV4dAorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqCisgKlByZSBDb25kaXRpb24gZm9yIGVuYWJsaW5nIHN0YSBtb2RlIHBvd2VyIHNhdmUKKyAqMSkgU3RhIE1vZGUgUHMgc2hvdWxkIGJlIGVuYWJsZWQgaW4gaW5pIGZpbGUuCisgKjIpIFNlc3Npb24gc2hvdWxkIGJlIGluIGluZnJhIG1vZGUgYW5kIGluIGNvbm5lY3RlZCBzdGF0ZS4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfZW5hYmxlX3N0YV9wc19jaGVjayh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCXN0cnVjdCBwc19nbG9iYWxfaW5mbyAqcHNfZ2xvYmFsX2luZm8gPSAmbWFjX2N0eC0+c21lLnBzX2dsb2JhbF9pbmZvOworCisJLyogQ2hlY2sgaWYgU3RhIFBzIGlzIGVuYWJsZWQuICovCisJaWYgKCFwc19nbG9iYWxfaW5mby0+cHNfZW5hYmxlZCkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCQkiQ2Fubm90IGluaXRpYXRlIFBTLiBQUyBpcyBkaXNhYmxlZCBpbiBpbmkiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHNlc3Npb24gaXMgSW5mcmEgYW5kIGluIENvbm5lY3RlZCBTdGF0ZSAqLworCWlmICghY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2luZnJhKG1hY19jdHgsIHNlc3Npb25faWQpKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgIlN0YSBub3QgaW5mcmEvY29ubmVjdGVkIHN0YXRlICVkIiwKKwkJCQlzZXNzaW9uX2lkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCit9CisKKy8qKgorICogc21lX3BzX2VuYWJsZV9kaXNhYmxlKCk6IGZ1bmN0aW9uIHRvIGVuYWJsZS9kaXNhYmxlIFBTLgorICogQGhhbF9jdHg6IGdsb2JhbCBoYWxfaGFuZGxlCisgKiBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBpZAorICogc21lX3BzX2NtZDogcG93ZXIgc2F2ZSBtZXNzYWdlCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX3BzX2VuYWJsZV9kaXNhYmxlKHRIYWxIYW5kbGUgaGFsX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCwKKwkJZW51bSBzbWVfcHNfY21kIGNvbW1hbmQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsX2N0eCk7CisJc3RhdHVzID0gIHNtZV9lbmFibGVfc3RhX3BzX2NoZWNrKG1hY19jdHgsIHNlc3Npb25faWQpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IHNtZV9wc19wcm9jZXNzX2NvbW1hbmQobWFjX2N0eCwgc2Vzc2lvbl9pZCwgY29tbWFuZCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcHNfdWFwc2RfZW5hYmxlKCk6IGZ1bmN0aW9uIHRvIGVuYWJsZSBVQVBTRC4KKyAqIEBoYWxfY3R4OiBnbG9iYWwgaGFsX2hhbmRsZQorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfcHNfdWFwc2RfZW5hYmxlKHRIYWxIYW5kbGUgaGFsX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbF9jdHgpOworCXN0YXR1cyA9ICBzbWVfZW5hYmxlX3N0YV9wc19jaGVjayhtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKwlzdGF0dXMgPSBzbWVfcHNfcHJvY2Vzc19jb21tYW5kKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQlTTUVfUFNfVUFQU0RfRU5BQkxFKTsKKwlpZiAoc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJc21lX29mZmxvYWRfcW9zX3Byb2Nlc3NfaW50b191YXBzZF9tb2RlKG1hY19jdHgsIHNlc3Npb25faWQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcHNfdWFwc2RfZGlzYWJsZSgpOiBmdW5jdGlvbiB0byBkaXNhYmxlIFVBUFNELgorICogQGhhbF9jdHg6IGdsb2JhbCBoYWxfaGFuZGxlCisgKiBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBpZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9wc191YXBzZF9kaXNhYmxlKHRIYWxIYW5kbGUgaGFsX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbF9jdHgpOworCXN0YXR1cyA9ICBzbWVfZW5hYmxlX3N0YV9wc19jaGVjayhtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKwlzdGF0dXMgPSBzbWVfcHNfcHJvY2Vzc19jb21tYW5kKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQlTTUVfUFNfVUFQU0RfRElTQUJMRSk7CisJaWYgKHN0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCXNtZV9vZmZsb2FkX3Fvc19wcm9jZXNzX291dF9vZl91YXBzZF9tb2RlKG1hY19jdHgsIHNlc3Npb25faWQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfc2V0X3RzcGVjX3VhcHNkX21hc2tfcGVyX3Nlc3Npb24oKTogc2V0IHRzcGVjIFVBUFNEIG1hc2sgcGVyIHNlc3Npb24KKyAqIEBtYWNfY3R4OiBnbG9iYWwgbWFjIGNvbnRleHQKKyAqIEB0c19pbmZvOiB0c3BlYyBpbmZvLgorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLwordm9pZCBzbWVfc2V0X3RzcGVjX3VhcHNkX21hc2tfcGVyX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdFNpck1hY1RTSW5mbyAqdHNfaW5mbywKKwkJdWludDhfdCBzZXNzaW9uX2lkKQoreworCXVpbnQ4X3QgdXNlcl9wcmlvID0gKHVpbnQ4X3QpIHRzX2luZm8tPnRyYWZmaWMudXNlclByaW87CisJdWludDE2X3QgZGlyZWN0aW9uID0gdHNfaW5mby0+dHJhZmZpYy5kaXJlY3Rpb247CisJdWludDhfdCBhYyA9IHVwVG9BYyh1c2VyX3ByaW8pOworCXN0cnVjdCBwc19nbG9iYWxfaW5mbyAqcHNfZ2xvYmFsX2luZm8gPSAmbWFjX2N0eC0+c21lLnBzX2dsb2JhbF9pbmZvOworCXN0cnVjdCBwc19wYXJhbXMgKnBzX3BhcmFtID0gJnBzX2dsb2JhbF9pbmZvLT5wc19wYXJhbXNbc2Vzc2lvbl9pZF07CisJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiU2V0IFVBUFNEIG1hc2sgZm9yIEFDICVkLCBkaXIgJWQsIGFjdGlvbj0lZCIpCisJCQksIGFjLCBkaXJlY3Rpb24sIHRzX2luZm8tPnRyYWZmaWMucHNiKTsKKworCS8qIENvbnZlcnRpbmcgQUMgdG8gYXBwcm9wcmlhdGUgVWFwc2QgQml0IE1hc2sKKwkgKiBBQ19CRSgwKSAtLT4gVUFQU0RfQklUT0ZGU0VUX0FDVk8oMykKKwkgKiBBQ19CSygxKSAtLT4gVUFQU0RfQklUT0ZGU0VUX0FDVk8oMikKKwkgKiBBQ19WSSgyKSAtLT4gVUFQU0RfQklUT0ZGU0VUX0FDVk8oMSkKKwkgKiBBQ19WTygzKSAtLT4gVUFQU0RfQklUT0ZGU0VUX0FDVk8oMCkKKwkgKi8KKwlhYyA9ICgofmFjKSAmIDB4Myk7CisJaWYgKHRzX2luZm8tPnRyYWZmaWMucHNiKSB7CisJCWlmIChkaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LKQorCQkJcHNfcGFyYW0tPnVhcHNkX3Blcl9hY190cmlnZ2VyX2VuYWJsZV9tYXNrIHw9CisJCQkJKDEgPDwgYWMpOworCQllbHNlIGlmIChkaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LKQorCQkJcHNfcGFyYW0tPnVhcHNkX3Blcl9hY19kZWxpdmVyeV9lbmFibGVfbWFzayB8PQorCQkJCSgxIDw8IGFjKTsKKwkJZWxzZSBpZiAoZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX0JJRElSKSB7CisJCQlwc19wYXJhbS0+dWFwc2RfcGVyX2FjX3RyaWdnZXJfZW5hYmxlX21hc2sgfD0KKwkJCQkoMSA8PCBhYyk7CisJCQlwc19wYXJhbS0+dWFwc2RfcGVyX2FjX2RlbGl2ZXJ5X2VuYWJsZV9tYXNrIHw9CisJCQkJKDEgPDwgYWMpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9VUExJTkspCisJCQlwc19wYXJhbS0+dWFwc2RfcGVyX2FjX3RyaWdnZXJfZW5hYmxlX21hc2sgJj0KKwkJCQl+KDEgPDwgYWMpOworCQllbHNlIGlmIChkaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LKQorCQkJcHNfcGFyYW0tPnVhcHNkX3Blcl9hY19kZWxpdmVyeV9lbmFibGVfbWFzayAmPQorCQkJCX4oMSA8PCBhYyk7CisJCWVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9CSURJUikgeworCQkJcHNfcGFyYW0tPnVhcHNkX3Blcl9hY190cmlnZ2VyX2VuYWJsZV9tYXNrICY9CisJCQkJfigxIDw8IGFjKTsKKwkJCXBzX3BhcmFtLT51YXBzZF9wZXJfYWNfZGVsaXZlcnlfZW5hYmxlX21hc2sgJj0KKwkJCQl+KDEgPDwgYWMpOworCQl9CisJfQorCisJLyoKKwkgKiBBRERUUyBzdWNjZXNzLCBzbyBBQyBpcyBub3cgYWRtaXR0ZWQuIFdlIHNoYWxsIG5vdyB1c2UgdGhlIGRlZmF1bHQKKwkgKiBFRENBIHBhcmFtZXRlcnMgYXMgYWR2ZXJ0aXNlZCBieSBBUCBhbmQgc2VuZCB0aGUgdXBkYXRlZCBFRENBIHBhcmFtcworCSAqIHRvIEhBTC4KKwkgKi8KKwlpZiAoZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX1VQTElOSykgeworCQlwc19wYXJhbS0+YWNfYWRtaXRfbWFza1tTSVJfTUFDX0RJUkVDVElPTl9VUExJTktdIHw9CisJCQkoMSA8PCBhYyk7CisJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LKSB7CisJCXBzX3BhcmFtLT5hY19hZG1pdF9tYXNrW1NJUl9NQUNfRElSRUNUSU9OX0ROTElOS10gfD0KKwkJCSgxIDw8IGFjKTsKKwl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9CSURJUikgeworCQlwc19wYXJhbS0+YWNfYWRtaXRfbWFza1tTSVJfTUFDX0RJUkVDVElPTl9VUExJTktdIHw9CisJCQkoMSA8PCBhYyk7CisJCXBzX3BhcmFtLT5hY19hZG1pdF9tYXNrW1NJUl9NQUNfRElSRUNUSU9OX0ROTElOS10gfD0KKwkJCSgxIDw8IGFjKTsKKwl9CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJOZXcgcHNfcGFyYW0tPnVhcHNkX3Blcl9hY190cmlnZ2VyX2VuYWJsZV9tYXNrID0gMHgleCAiKSwKKwkJcHNfcGFyYW0tPnVhcHNkX3Blcl9hY190cmlnZ2VyX2VuYWJsZV9tYXNrKTsKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJOZXcgIHBzX3BhcmFtLT51YXBzZF9wZXJfYWNfZGVsaXZlcnlfZW5hYmxlX21hc2sgPSAweCV4ICIpLAorCQlwc19wYXJhbS0+dWFwc2RfcGVyX2FjX2RlbGl2ZXJ5X2VuYWJsZV9tYXNrKTsKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJOZXcgcHNfcGFyYW0tPmFjX2FkbWl0X21hc2tbU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LXSA9IDB4JXggIiksCisJCXBzX3BhcmFtLT5hY19hZG1pdF9tYXNrW1NJUl9NQUNfRElSRUNUSU9OX1VQTElOS10pOworCXJldHVybjsKK30KKworLyoqCisgKiBzbWVfcHNfc3RhcnRfdWFwc2QoKTogZnVuY3Rpb24gdG8gc3RhcnQgVUFQU0QuCisgKiBAaGFsX2N0eDogZ2xvYmFsIGhhbF9oYW5kbGUKKyAqIEBzZXNzaW9uX2lkOiBzZXNzaW9uIGlkCisgKiBAdWFwc2Rfc3RhcnRfaW5kX2NiOiB1YXBzZCBzdGFydCBpbmRpYXRpb24gY2IKKyAqIEBjYWxsYmFja19jb250ZXh0OiBjYWxsYmFjayBjb250ZXh0CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX3BzX3N0YXJ0X3VhcHNkKHRIYWxIYW5kbGUgaGFsX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCwKKwkJdWFwc2Rfc3RhcnRfaW5kaWNhdGlvbl9jYiB1YXBzZF9zdGFydF9pbmRfY2IsCisJCXZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwlzdGF0dXMgPSBzbWVfcHNfdWFwc2RfZW5hYmxlKGhhbF9jdHgsIHNlc3Npb25faWQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitzbWVfcG9wdWxhdGVfbWFjX2hlYWRlcih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJdWludDhfdCAqYmQsCisJCQl1aW50OF90IHR5cGUsCisJCQl1aW50OF90IHN1Yl90eXBlLAorCQkJdFNpck1hY0FkZHIgcGVlcl9hZGRyLCB0U2lyTWFjQWRkciBzZWxmX21hY19hZGRyKQoreworCXRTaXJSZXRTdGF0dXMgc3RhdHVzX2NvZGUgPSBlU0lSX1NVQ0NFU1M7CisJdHBTaXJNYWNNZ210SGRyIG1hY19oZHI7CisKKwkvKiAvIFByZXBhcmUgTUFDIG1hbmFnZW1lbnQgaGVhZGVyICovCisJbWFjX2hkciA9ICh0cFNpck1hY01nbXRIZHIpIChiZCk7CisKKwkvKiBQcmVwYXJlIEZDICovCisJbWFjX2hkci0+ZmMucHJvdFZlciA9IFNJUl9NQUNfUFJPVE9DT0xfVkVSU0lPTjsKKwltYWNfaGRyLT5mYy50eXBlID0gdHlwZTsKKwltYWNfaGRyLT5mYy5zdWJUeXBlID0gc3ViX3R5cGU7CisKKwkvKiBQcmVwYXJlIEFkZHJlc3MgMSAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBtYWNfaGRyLT5kYSwgKHVpbnQ4X3QgKikgcGVlcl9hZGRyLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJc2lyX2NvcHlfbWFjX2FkZHIobWFjX2hkci0+c2EsIHNlbGZfbWFjX2FkZHIpOworCisJLyogUHJlcGFyZSBBZGRyZXNzIDMgKi8KKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgbWFjX2hkci0+YnNzSWQsICh1aW50OF90ICopIHBlZXJfYWRkciwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlyZXR1cm4gc3RhdHVzX2NvZGU7Cit9IC8qKiogc21lX3BvcHVsYXRlX21hY19oZWFkZXIoKSAqKiovCisKK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitzbWVfcHJlcGFyZV9wcm9iZV9yZXFfdGVtcGxhdGUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCSAgICAgICB1aW50OF90IGNoYW5uZWxfbnVtLAorCQkJICAgICAgIHVpbnQzMl90IGRvdDExbW9kZSwKKwkJCSAgICAgICB0U2lyTWFjQWRkciBzZWxmX21hY19hZGRyLAorCQkJICAgICAgIHVpbnQ4X3QgKmZyYW1lLAorCQkJICAgICAgIHVpbnQxNl90ICpwdXNfbGVuLCB0Q3NyUm9hbVNlc3Npb24gKnBzZXNzaW9uKQoreworCXREb3QxMWZQcm9iZVJlcXVlc3QgcHI7CisJdWludDMyX3Qgc3RhdHVzLCBieXRlcywgcGF5bG9hZDsKKwl0U2lyUmV0U3RhdHVzIHNpcl9zdGF0dXM7CisJLypCY2FzdCB0eCAqLworCXRTaXJNYWNBZGRyIGJzc19pZCA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworCS8qKgorCSAqIFRoZSBzY2hlbWUgaGVyZSBpcyB0byBmaWxsIG91dCBhICd0RG90MTFmUHJvYmVSZXF1ZXN0JyBzdHJ1Y3R1cmUKKwkgKiBhbmQgdGhlbiBoYW5kIGl0IG9mZiB0byAnZG90MTFmX3BhY2tfcHJvYmVfcmVxdWVzdCcgKGZvcgorCSAqIHNlcmlhbGl6YXRpb24pLiAgV2Ugc3RhcnQgYnkgemVyby1pbml0aWFsaXppbmcgdGhlIHN0cnVjdHVyZToKKwkgKi8KKwljZGZfbWVtX3NldCgodWludDhfdCAqKSAmcHIsIHNpemVvZihwciksIDApOworCisJcG9wdWxhdGVfZG90MTFmX3N1cHBfcmF0ZXMobWFjX2N0eCwgY2hhbm5lbF9udW0sICZwci5TdXBwUmF0ZXMsIE5VTEwpOworCisJaWYgKFdOSV9DRkdfRE9UMTFfTU9ERV8xMUIgIT0gZG90MTFtb2RlKSB7CisJCXBvcHVsYXRlX2RvdDExZl9leHRfc3VwcF9yYXRlczEobWFjX2N0eCwgY2hhbm5lbF9udW0sCisJCQkJCQkmcHIuRXh0U3VwcFJhdGVzKTsKKwl9CisKKwlpZiAoSVNfRE9UMTFfTU9ERV9IVChkb3QxMW1vZGUpKSB7CisJCXBvcHVsYXRlX2RvdDExZl9odF9jYXBzKG1hY19jdHgsIE5VTEwsICZwci5IVENhcHMpOworCQlwci5IVENhcHMuYWR2Q29kaW5nQ2FwID0gcHNlc3Npb24tPmh0Q29uZmlnLmh0X3J4X2xkcGM7CisJCXByLkhUQ2Fwcy50eFNUQkMgPSBwc2Vzc2lvbi0+aHRDb25maWcuaHRfdHhfc3RiYzsKKwkJcHIuSFRDYXBzLnJ4U1RCQyA9IHBzZXNzaW9uLT5odENvbmZpZy5odF9yeF9zdGJjOworCQlpZiAoIXBzZXNzaW9uLT5odENvbmZpZy5odF9zZ2kpCisJCQlwci5IVENhcHMuc2hvcnRHSTIwTUh6ID0gcHIuSFRDYXBzLnNob3J0R0k0ME1IeiA9IDA7CisJfQorCS8qKgorCSAqIFRoYXQncyBpdC0tIG5vdyB3ZSBwYWNrIGl0LiAgRmlyc3QsIGhvdyBtdWNoIHNwYWNlIGFyZSB3ZSBnb2luZyB0bworCSAqIG5lZWQ/CisJICovCisJc3RhdHVzID0gZG90MTFmX2dldF9wYWNrZWRfcHJvYmVfcmVxdWVzdF9zaXplKG1hY19jdHgsICZwciwgJnBheWxvYWQpOworCWlmIChET1QxMUZfRkFJTEVEKHN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBQcm9iZSBSZXF1ZXN0ICgweCUwOHgpLiIpLAorCQkJCSAgc3RhdHVzKTsKKworCQkvKiBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86ICovCisJCXBheWxvYWQgPSBzaXplb2YodERvdDExZlByb2JlUmVxdWVzdCk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKHN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIHRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBQcm9iZSBSZXF1ZXN0ICgweCUwOHgpLiIpLAorCQkJICBzdGF0dXMpOworCX0KKworCWJ5dGVzID0gcGF5bG9hZCArIHNpemVvZih0U2lyTWFjTWdtdEhkcik7CisKKwkvKiBQcmVwYXJlIG91dGdvaW5nIGZyYW1lICovCisJY2RmX21lbV9zZXQoZnJhbWUsIGJ5dGVzLCAwKTsKKworCS8qIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjogKi8KKwlzaXJfc3RhdHVzID0gc21lX3BvcHVsYXRlX21hY19oZWFkZXIobWFjX2N0eCwgZnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKwkJCQkJICAgICBTSVJfTUFDX01HTVRfUFJPQkVfUkVRLCBic3NfaWQsCisJCQkJCSAgICAgc2VsZl9tYWNfYWRkcik7CisKKwlpZiAoZVNJUl9TVUNDRVNTICE9IHNpcl9zdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCUZMKCJGYWlsZWQgdG8gcG9wdWxhdGUgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yIGZvciBhIFByb2JlIFJlcXVlc3QgKCVkKS4iKSwKKwkJCXNpcl9zdGF0dXMpOworCQlyZXR1cm4gc2lyX3N0YXR1czsgICAgICAvKiBhbGxvY2F0ZWQhICovCisJfQorCS8qIFRoYXQgZG9uZSwgcGFjayB0aGUgUHJvYmUgUmVxdWVzdDogKi8KKwlzdGF0dXMgPSBkb3QxMWZfcGFja19wcm9iZV9yZXF1ZXN0KG1hY19jdHgsICZwciwgZnJhbWUgKworCQkJCQkgICAgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKwkJCQkJICAgIHBheWxvYWQsICZwYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiRmFpbGVkIHRvIHBhY2sgYSBQcm9iZSBSZXF1ZXN0ICgweCUwOHgpLiIsIHN0YXR1cyk7CisJCXJldHVybiBlU0lSX0ZBSUxVUkU7ICAgIC8qIGFsbG9jYXRlZCEgKi8KKwl9IGVsc2UgaWYgKERPVDExRl9XQVJORUQoc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIFByb2JlIFJlcXVlc3QiKTsKKwl9CisKKwkqcHVzX2xlbiA9IHBheWxvYWQgKyBzaXplb2YodFNpck1hY01nbXRIZHIpOworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qIEVuZCBzbWVfcHJlcGFyZV9wcm9iZV9yZXFfdGVtcGxhdGUuICovCisKK0NERl9TVEFUVVMgc21lX3NldF9wc19wcmVmZXJyZWRfbmV0d29ya19saXN0KHRIYWxIYW5kbGUgaGFsX2N0eCwKKwkJdHBTaXJQTk9TY2FuUmVxIHJlcXVlc3QsCisJCXVpbnQ4X3Qgc2Vzc2lvbl9pZCwKKwkJcHJlZmVycmVkX25ldHdvcmtfZm91bmRfaW5kX2NiIGNhbGxiYWNrX3JvdXRpbmUsCisJCXZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCit7CisJdHBTaXJQTk9TY2FuUmVxIHJlcXVlc3RfYnVmOworCWNkc19tc2dfdCBtc2c7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbF9jdHgpOworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwl1aW50OF90IHVjX2RvdDExX21vZGU7CisKKwlpZiAoTlVMTCA9PSBzZXNzaW9uKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSIlczogc2Vzc2lvbiBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkiJXM6IFNTSUQgPSAweCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4LCAweCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4IiwgX19mdW5jX18sCisJCQkqKCh1aW50MzJfdCAqKSAmcmVxdWVzdC0+YU5ldHdvcmtzWzBdLnNzSWQuc3NJZFswXSksCisJCQkqKCh1aW50MzJfdCAqKSAmcmVxdWVzdC0+YU5ldHdvcmtzWzBdLnNzSWQuc3NJZFs0XSksCisJCQkqKCh1aW50MzJfdCAqKSAmcmVxdWVzdC0+YU5ldHdvcmtzWzBdLnNzSWQuc3NJZFs4XSksCisJCQkqKCh1aW50MzJfdCAqKSAmcmVxdWVzdC0+YU5ldHdvcmtzWzBdLnNzSWQuc3NJZFsxMl0pLAorCQkJKigodWludDMyX3QgKikgJnJlcXVlc3QtPmFOZXR3b3Jrc1swXS5zc0lkLnNzSWRbMTZdKSwKKwkJCSooKHVpbnQzMl90ICopICZyZXF1ZXN0LT5hTmV0d29ya3NbMF0uc3NJZC5zc0lkWzIwXSksCisJCQkqKCh1aW50MzJfdCAqKSAmcmVxdWVzdC0+YU5ldHdvcmtzWzBdLnNzSWQuc3NJZFsyNF0pLAorCQkJKigodWludDMyX3QgKikgJnJlcXVlc3QtPmFOZXR3b3Jrc1swXS5zc0lkLnNzSWRbMjhdKSwKKwkJCSooKHVpbnQzMl90ICopICZyZXF1ZXN0LT5hTmV0d29ya3NbMV0uc3NJZC5zc0lkWzBdKSwKKwkJCSooKHVpbnQzMl90ICopICZyZXF1ZXN0LT5hTmV0d29ya3NbMV0uc3NJZC5zc0lkWzRdKSwKKwkJCSooKHVpbnQzMl90ICopICZyZXF1ZXN0LT5hTmV0d29ya3NbMV0uc3NJZC5zc0lkWzhdKSwKKwkJCSooKHVpbnQzMl90ICopICZyZXF1ZXN0LT5hTmV0d29ya3NbMV0uc3NJZC5zc0lkWzEyXSksCisJCQkqKCh1aW50MzJfdCAqKSAmcmVxdWVzdC0+YU5ldHdvcmtzWzFdLnNzSWQuc3NJZFsxNl0pLAorCQkJKigodWludDMyX3QgKikgJnJlcXVlc3QtPmFOZXR3b3Jrc1sxXS5zc0lkLnNzSWRbMjBdKSwKKwkJCSooKHVpbnQzMl90ICopICZyZXF1ZXN0LT5hTmV0d29ya3NbMV0uc3NJZC5zc0lkWzI0XSksCisJCQkqKCh1aW50MzJfdCAqKSAmcmVxdWVzdC0+YU5ldHdvcmtzWzFdLnNzSWQuc3NJZFsyOF0pKTsKKworCWlmICghc2Vzc2lvbikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiJXM6IHNlc3Npb24gaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJlcXVlc3RfYnVmID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJQTk9TY2FuUmVxKSk7CisJaWYgKE5VTEwgPT0gcmVxdWVzdF9idWYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBQTk8gcmVxdWVzdCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX2NvcHkocmVxdWVzdF9idWYsIHJlcXVlc3QsIHNpemVvZih0U2lyUE5PU2NhblJlcSkpOworCisJLypNdXN0IHRyYW5zbGF0ZSB0aGUgbW9kZSBmaXJzdCAqLworCXVjX2RvdDExX21vZGUgPSAodWludDhfdCkgY3NyX3RyYW5zbGF0ZV90b193bmlfY2ZnX2RvdDExX21vZGUobWFjX2N0eCwKKwkJCWNzcl9maW5kX2Jlc3RfcGh5X21vZGUKKwkJCShtYWNfY3R4LAorCQkJIG1hY19jdHgtPnJvYW0uCisJCQkgY29uZmlnUGFyYW0uCisJCQkgcGh5TW9kZSkpOworCisJLypQcmVwYXJlIGEgcHJvYmUgcmVxdWVzdCBmb3IgMi40R0h6IGJhbmQgYW5kIG9uZSBmb3IgNUdIeiBiYW5kICovCisJaWYgKGVTSVJfU1VDQ0VTUyA9PQorCQkJc21lX3ByZXBhcmVfcHJvYmVfcmVxX3RlbXBsYXRlKG1hY19jdHgsCisJCQkJU0lSX1BOT18yNEdfREVGQVVMVF9DSCwKKwkJCQl1Y19kb3QxMV9tb2RlLCBzZXNzaW9uLT5zZWxmTWFjQWRkci5ieXRlcywKKwkJCQlyZXF1ZXN0X2J1Zi0+cDI0R1Byb2JlVGVtcGxhdGUsCisJCQkJJnJlcXVlc3RfYnVmLT51czI0R1Byb2JlVGVtcGxhdGVMZW4sCisJCQkJc2Vzc2lvbikpIHsKKwkJLyogQXBwZW5kIElFIHBhc3NlZCBieSBzdXBwbGljYW50KGlmIGFueSkKKwkJICogdG8gcHJvYmUgcmVxdWVzdAorCQkgKi8KKwkJaWYgKCgwIDwgcmVxdWVzdC0+dXMyNEdQcm9iZVRlbXBsYXRlTGVuKSAmJgorCQkJCSgocmVxdWVzdF9idWYtPnVzMjRHUHJvYmVUZW1wbGF0ZUxlbiArCisJCQkJICByZXF1ZXN0LT51czI0R1Byb2JlVGVtcGxhdGVMZW4pIDwKKwkJCQkgU0lSX1BOT19NQVhfUEJfUkVRX1NJWkUpKSB7CisJCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnJlcXVlc3RfYnVmLT4KKwkJCQkJcDI0R1Byb2JlVGVtcGxhdGUgKworCQkJCQlyZXF1ZXN0X2J1Zi0+dXMyNEdQcm9iZVRlbXBsYXRlTGVuLAorCQkJCQkodWludDhfdCAqKSAmcmVxdWVzdC0+cDI0R1Byb2JlVGVtcGxhdGUsCisJCQkJCXJlcXVlc3QtPnVzMjRHUHJvYmVUZW1wbGF0ZUxlbik7CisJCQlyZXF1ZXN0X2J1Zi0+dXMyNEdQcm9iZVRlbXBsYXRlTGVuICs9CisJCQkJcmVxdWVzdC0+dXMyNEdQcm9iZVRlbXBsYXRlTGVuOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCUNERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCUZMKCJyZXF1ZXN0LT51czI0R1Byb2JlVGVtcGxhdGVMZW4gPSAlZCIpLAorCQkJCXJlcXVlc3QtPnVzMjRHUHJvYmVUZW1wbGF0ZUxlbik7CisJCX0gZWxzZSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJRkwoIkV4dHJhIGllIGRpc2NhcmRlZCBvbiAyLjRHLCBJRSBsZW4gPSAlZCIpLAorCQkJCXJlcXVlc3QtPnVzMjRHUHJvYmVUZW1wbGF0ZUxlbik7CisJCX0KKwl9CisKKwlpZiAoZVNJUl9TVUNDRVNTID09CisJCQlzbWVfcHJlcGFyZV9wcm9iZV9yZXFfdGVtcGxhdGUobWFjX2N0eCwKKwkJCQlTSVJfUE5PXzVHX0RFRkFVTFRfQ0gsIHVjX2RvdDExX21vZGUsCisJCQkJc2Vzc2lvbi0+c2VsZk1hY0FkZHIuYnl0ZXMsCisJCQkJcmVxdWVzdF9idWYtPnA1R1Byb2JlVGVtcGxhdGUsCisJCQkJJnJlcXVlc3RfYnVmLT51czVHUHJvYmVUZW1wbGF0ZUxlbiwKKwkJCQlzZXNzaW9uKSkgeworCQkvKiBBcHBlbmQgSUUgcGFzc2VkIGJ5IHN1cHBsaWNhbnQoaWYgYW55KQorCQkgKiB0byBwcm9iZSByZXF1ZXN0CisJCSAqLworCQlpZiAoKDAgPCByZXF1ZXN0LT51czVHUHJvYmVUZW1wbGF0ZUxlbikgJiYKKwkJCQkoKHJlcXVlc3RfYnVmLT51czVHUHJvYmVUZW1wbGF0ZUxlbiArCisJCQkJICByZXF1ZXN0LT51czVHUHJvYmVUZW1wbGF0ZUxlbikgPAorCQkJCSBTSVJfUE5PX01BWF9QQl9SRVFfU0laRSkpIHsKKwkJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcmVxdWVzdF9idWYtPgorCQkJCQlwNUdQcm9iZVRlbXBsYXRlICsKKwkJCQkJcmVxdWVzdF9idWYtPnVzNUdQcm9iZVRlbXBsYXRlTGVuLAorCQkJCQkodWludDhfdCAqKSAmcmVxdWVzdC0+cDVHUHJvYmVUZW1wbGF0ZSwKKwkJCQkJcmVxdWVzdC0+dXM1R1Byb2JlVGVtcGxhdGVMZW4pOworCQkJcmVxdWVzdF9idWYtPnVzNUdQcm9iZVRlbXBsYXRlTGVuICs9CisJCQkJcmVxdWVzdC0+dXM1R1Byb2JlVGVtcGxhdGVMZW47CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCUZMKCJyZXF1ZXN0X2J1Zi0+dXM1R1Byb2JlVGVtcGxhdGVMZW4gPSAlZCIpLAorCQkJCXJlcXVlc3QtPnVzNUdQcm9iZVRlbXBsYXRlTGVuKTsKKwkJfSBlbHNlIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJRkwoIkV4dHJhIElFIGRpc2NhcmRlZCBvbiA1RywgSUUgbGVuZ3RoID0gJWQiKSwKKwkJCQlyZXF1ZXN0LT51czVHUHJvYmVUZW1wbGF0ZUxlbik7CisJCX0KKwl9CisKKwlpZiAobWFjX2N0eC0+cG5vT2ZmbG9hZCkgeworCQlpZiAocmVxdWVzdF9idWYtPmVuYWJsZSkKKwkJCXNlc3Npb24tPnBub1N0YXJ0ZWQgPSB0cnVlOworCQllbHNlCisJCQlzZXNzaW9uLT5wbm9TdGFydGVkID0gZmFsc2U7CisKKwkJcmVxdWVzdF9idWYtPnNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisJfQorCisJbXNnLnR5cGUgPSBXTUFfU0VUX1BOT19SRVE7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHJlcXVlc3RfYnVmOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCQkoY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIk5vdCBhYmxlIHRvIHBvc3QgV01BX1NFVF9QTk9fUkVRIG1lc3NhZ2UgdG8gV01BIikpOworCQljZGZfbWVtX2ZyZWUocmVxdWVzdF9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyogQ2FjaGUgdGhlIFByZWZlcnJlZCBOZXR3b3JrIEZvdW5kIEluZGljYXRpb24gY2FsbGJhY2sgaW5mb3JtYXRpb24gKi8KKwltYWNfY3R4LT5zbWUucHJlZl9uZXR3X2ZvdW5kX2NiID0KKwkJY2FsbGJhY2tfcm91dGluZTsKKwltYWNfY3R4LT5zbWUucHJlZmVycmVkX25ldHdvcmtfZm91bmRfaW5kX2NiX2N0eCA9CisJCWNhbGxiYWNrX2NvbnRleHQ7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLCAiLSVzIiwgX19mdW5jX18pOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKworLyoqCisgKiBzbWVfc2V0X3BzX2hvc3Rfb2ZmbG9hZCgpOiBTZXQgdGhlIGhvc3Qgb2ZmbG9hZCBmZWF0dXJlLgorICogQGhhbF9jdHggLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQHJlcXVlc3QgLSBQb2ludGVyIHRvIHRoZSBvZmZsb2FkIHJlcXVlc3QuCisgKgorICogUmV0dXJuIENERl9TVEFUVVMKKyAqICAgICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgIENhbm5vdCBzZXQgdGhlIG9mZmxvYWQuCisgKiAgICAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUyAgUmVxdWVzdCBhY2NlcHRlZC4KKyAqLworQ0RGX1NUQVRVUyBzbWVfc2V0X3BzX2hvc3Rfb2ZmbG9hZCh0SGFsSGFuZGxlIGhhbF9jdHgsCisJCXRwU2lySG9zdE9mZmxvYWRSZXEgcmVxdWVzdCwKKwkJdWludDhfdCBzZXNzaW9uX2lkKQoreworCXRwU2lySG9zdE9mZmxvYWRSZXEgcmVxdWVzdF9idWY7CisJY2RzX21zZ190IG1zZzsKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsX2N0eCk7CisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25faWQpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSIlczogSVAgYWRkcmVzcyA9ICVkLiVkLiVkLiVkIiwgX19mdW5jX18sCisJCQlyZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjRBZGRyWzBdLAorCQkJcmVxdWVzdC0+cGFyYW1zLmhvc3RJcHY0QWRkclsxXSwKKwkJCXJlcXVlc3QtPnBhcmFtcy5ob3N0SXB2NEFkZHJbMl0sCisJCQlyZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjRBZGRyWzNdKTsKKworCWlmIChOVUxMID09IHNlc3Npb24pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIiVzOiBTRVNTSU9OIG5vdCBGb3VuZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJlcXVlc3RfYnVmID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJIb3N0T2ZmbG9hZFJlcSkpOworCWlmIChOVUxMID09IHJlcXVlc3RfYnVmKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICBGTCgiTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBob3N0IG9mZmxvYWQgcmVxdWVzdCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX2NvcHkocmVxdWVzdC0+YnNzSWQsIHNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQuYnl0ZXMsCisJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWNkZl9tZW1fY29weShyZXF1ZXN0X2J1ZiwgcmVxdWVzdCwgc2l6ZW9mKHRTaXJIb3N0T2ZmbG9hZFJlcSkpOworCisJbXNnLnR5cGUgPSBXTUFfU0VUX0hPU1RfT0ZGTE9BRDsKKwltc2cucmVzZXJ2ZWQgPSAwOworCW1zZy5ib2R5cHRyID0gcmVxdWVzdF9idWY7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQkJY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICAgIEZMKCJOb3QgYWJsZSB0byBwb3N0IFdNQV9TRVRfSE9TVF9PRkZMT0FEIG1zZyB0byBXTUEiKSk7CisJCWNkZl9tZW1fZnJlZShyZXF1ZXN0X2J1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgV0xBTl9OU19PRkZMT0FECisvKioKKyAqIHNtZV9zZXRfcHNfbnNfb2ZmbG9hZCgpOiBTZXQgdGhlIGhvc3Qgb2ZmbG9hZCBmZWF0dXJlLgorICogQGhhbF9jdHggLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQHJlcXVlc3QgLSBQb2ludGVyIHRvIHRoZSBvZmZsb2FkIHJlcXVlc3QuCisgKgorICogUmV0dXJuIENERl9TVEFUVVMKKyAqCQlDREZfU1RBVFVTX0VfRkFJTFVSRSAgQ2Fubm90IHNldCB0aGUgb2ZmbG9hZC4KKyAqCQlDREZfU1RBVFVTX1NVQ0NFU1MgIFJlcXVlc3QgYWNjZXB0ZWQuCisgKi8KK0NERl9TVEFUVVMgc21lX3NldF9wc19uc19vZmZsb2FkKHRIYWxIYW5kbGUgaGFsX2N0eCwKKwkJdHBTaXJIb3N0T2ZmbG9hZFJlcSByZXF1ZXN0LAorCQl1aW50OF90IHNlc3Npb25faWQpCit7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbF9jdHgpOworCXRwU2lySG9zdE9mZmxvYWRSZXEgcmVxdWVzdF9idWY7CisJY2RzX21zZ190IG1zZzsKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisKKwlpZiAoTlVMTCA9PSBzZXNzaW9uKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIlNlc3Npb24gbm90IGZvdW5kICIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNkZl9tZW1fY29weShyZXF1ZXN0LT5ic3NJZCwgc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZC5ieXRlcywKKwkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCisJcmVxdWVzdF9idWYgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnJlcXVlc3RfYnVmKSk7CisJaWYgKE5VTEwgPT0gcmVxdWVzdF9idWYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBOUyBvZmZsb2FkIHJlcXVlc3QiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCSpyZXF1ZXN0X2J1ZiA9ICpyZXF1ZXN0OworCisJbXNnLnR5cGUgPSBXTUFfU0VUX05TX09GRkxPQUQ7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHJlcXVlc3RfYnVmOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJCWNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIk5vdCBhYmxlIHRvIHBvc3QgU0lSX0hBTF9TRVRfSE9TVF9PRkZMT0FEIG1lc3NhZ2UgdG8gSEFMIikpOworCQljZGZfbWVtX2ZyZWUocmVxdWVzdF9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworI2VuZGlmIC8qIFdMQU5fTlNfT0ZGTE9BRCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogc21lX3Bvc3RfcGVfbWVzc2FnZQorICoKKyAqIEZVTkNUSU9OOgorICogUG9zdCBhIG1lc3NhZ2UgdG8gdGhlIHBtbSBtZXNzYWdlIHF1ZXVlCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gbXNnIHBvaW50ZXIgdG8gbWVzc2FnZQorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cyBzbWVfcG9zdF9wZV9tZXNzYWdlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRwU2lyTXNnUSBtc2cpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9QRSwgKGNkc19tc2dfdCAqKSBtc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HUCwKKwkJCUZMKCJjZHNfbXFfcG9zdF9tZXNzYWdlIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICVkIiksCisJCQljZGZfc3RhdHVzKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCitDREZfU1RBVFVTIHNtZV9wc19lbmFibGVfYXV0b19wc190aW1lcih0SGFsSGFuZGxlIGhhbF9jdHgsCisJCXVpbnQzMl90IHNlc3Npb25faWQsCisJCWJvb2wgaXNfcmVhc3NvYykKK3sKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsX2N0eCk7CisJc3RydWN0IHBzX2dsb2JhbF9pbmZvICpwc19nbG9iYWxfaW5mbyA9ICZtYWNfY3R4LT5zbWUucHNfZ2xvYmFsX2luZm87CisJc3RydWN0IHBzX3BhcmFtcyAqcHNfcGFyYW0gPSAmcHNfZ2xvYmFsX2luZm8tPnBzX3BhcmFtc1tzZXNzaW9uX2lkXTsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdWludDMyX3QgdGltZXJfdmFsdWU7CisKKwlpZiAoaXNfcmVhc3NvYykKKwkJdGltZXJfdmFsdWUgPSBBVVRPX1BTX0VOVFJZX1RJTUVSX0RFRkFVTFRfVkFMVUU7CisJZWxzZQorCQl0aW1lcl92YWx1ZSA9IEFVVE9fREVGRVJSRURfUFNfRU5UUllfVElNRVJfREVGQVVMVF9WQUxVRTsKKworCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIlN0YXJ0IGF1dG9fcHNfdGltZXIgZm9yICVkIGlzX3JlYXNzb2M6JWQgIiksCisJCQl0aW1lcl92YWx1ZSwgaXNfcmVhc3NvYyk7CisKKwljZGZfc3RhdHVzID0gY2RmX21jX3RpbWVyX3N0YXJ0KCZwc19wYXJhbS0+YXV0b19wc19lbmFibGVfdGltZXIsCisJCQl0aW1lcl92YWx1ZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJaWYgKENERl9TVEFUVVNfRV9BTFJFQURZID09IGNkZl9zdGF0dXMpIHsKKwkJCS8qIENvbnNpZGVyIHRoaXMgb2sgc2luY2UgdGhlIHRpbWVyIGlzIGFscmVhZHkgc3RhcnRlZCovCisJCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQkJCUZMKCJhdXRvX3BzX3RpbWVyIGlzIGFscmVhZHkgc3RhcnRlZCIpKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQkJRkwoIkNhbm5vdCBzdGFydCBhdXRvX3BzX3RpbWVyIikpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgc21lX3BzX2Rpc2FibGVfYXV0b19wc190aW1lcih0SGFsSGFuZGxlIGhhbF9jdHgsCisJCXVpbnQzMl90IHNlc3Npb25faWQpCit7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbF9jdHgpOworCXN0cnVjdCBwc19nbG9iYWxfaW5mbyAqcHNfZ2xvYmFsX2luZm8gPSAmbWFjX2N0eC0+c21lLnBzX2dsb2JhbF9pbmZvOworCXN0cnVjdCBwc19wYXJhbXMgKnBzX3BhcmFtID0gJnBzX2dsb2JhbF9pbmZvLT5wc19wYXJhbXNbc2Vzc2lvbl9pZF07CisJLyoKKwkgKiBTdG9wIHRoZSBhdXRvIHBzIGVudHJ5IHRpbWVyIGlmIHJ1bm5pbgorCSAqLworCWlmIChDREZfVElNRVJfU1RBVEVfUlVOTklORyA9PQorCQkJY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKAorCQkJCSZwc19wYXJhbS0+YXV0b19wc19lbmFibGVfdGltZXIpKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiU3RvcCBhdXRvX3BzX2VuYWJsZV90aW1lciBUaW1lciBmb3Igc2Vzc2lvbiBJRDolZCAiKSwKKwkJCQlzZXNzaW9uX2lkKTsKKwkJY2RmX21jX3RpbWVyX3N0b3AoJnBzX3BhcmFtLT5hdXRvX3BzX2VuYWJsZV90aW1lcik7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworQ0RGX1NUQVRVUyBzbWVfcHNfb3Blbih0SGFsSGFuZGxlIGhhbF9jdHgpCit7CisKKwl1aW50MzJfdCBpOworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWxfY3R4KTsKKworCXNtc19sb2cobWFjX2N0eCwgTE9HMSwgRkwoIkVudGVyIikpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9TTUVfU0VTU0lPTlM7IGkrKykgeworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHNtZV9wc19vcGVuX3Blcl9zZXNzaW9uKGhhbF9jdHgsIGkpKSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIlBNQyBJbml0IEZhaWxlZCBmb3Igc2Vzc2lvbiAlZCIpLCBpKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisKK0NERl9TVEFUVVMgc21lX3BzX29wZW5fcGVyX3Nlc3Npb24odEhhbEhhbmRsZSBoYWxfY3R4LCB1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWxfY3R4KTsKKwlzdHJ1Y3QgcHNfZ2xvYmFsX2luZm8gKnBzX2dsb2JhbF9pbmZvID0gJm1hY19jdHgtPnNtZS5wc19nbG9iYWxfaW5mbzsKKwlzdHJ1Y3QgcHNfcGFyYW1zICpwc19wYXJhbSA9ICZwc19nbG9iYWxfaW5mby0+cHNfcGFyYW1zW3Nlc3Npb25faWRdOworCXBzX3BhcmFtLT5zZXNzaW9uX2lkID0gc2Vzc2lvbl9pZDsKKwlwc19wYXJhbS0+bWFjX2N0eCA9IG1hY19jdHg7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsIEZMKCJFbnRlciIpKTsKKwkvKiBBbGxvY2F0ZSBhIHRpbWVyIHRvIGVuYWJsZSBwcyBhdXRvbWF0aWNhbGx5ICovCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX21jX3RpbWVyX2luaXQoCisJCQkJCSZwc19wYXJhbS0+YXV0b19wc19lbmFibGVfdGltZXIsCisJCQkJCUNERl9USU1FUl9UWVBFX1NXLAorCQkJCQlzbWVfYXV0b19wc19lbnRyeV90aW1lcl9leHBpcmVkLAorCQkJCQlwc19wYXJhbSkpKSAgICAgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIkNhbm5vdCBhbGxvY2F0ZSB0aW1lciBmb3IgYXV0byBwcyBlbnRyeSIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCit9CisKK3ZvaWQgc21lX2F1dG9fcHNfZW50cnlfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBwc19wYXJhbXMgKnBzX3BhcmFtcyA9ICAgKHN0cnVjdCBwc19wYXJhbXMgKilkYXRhOworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSAodHBBbmlTaXJHbG9iYWwpcHNfcGFyYW1zLT5tYWNfY3R4OworCXVpbnQzMl90IHNlc3Npb25faWQgPSBwc19wYXJhbXMtPnNlc3Npb25faWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJc3RhdHVzID0gc21lX2VuYWJsZV9zdGFfcHNfY2hlY2sobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQlzbWVfcHNfZW5hYmxlX2Rpc2FibGUoKHRIYWxIYW5kbGUpbWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCQlTTUVfUFNfRU5BQkxFKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPQorCQkJY2RmX21jX3RpbWVyX3N0YXJ0KCZwc19wYXJhbXMtPmF1dG9fcHNfZW5hYmxlX3RpbWVyLAorCQkJCQlBVVRPX1BTX0VOVFJZX1RJTUVSX0RFRkFVTFRfVkFMVUUpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpCisJCQkJJiYgKENERl9TVEFUVVNfRV9BTFJFQURZICE9IHN0YXR1cykpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQkJRkwoIkNhbm5vdCBzdGFydCB0cmFmZmljIHRpbWVyIikpOworCQl9CisJfQorfQorCitDREZfU1RBVFVTIHNtZV9wc19jbG9zZSh0SGFsSGFuZGxlIGhhbF9jdHgpCit7CisJdWludDMyX3QgaTsKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsX2N0eCk7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzIsIEZMKCJFbnRlciIpKTsKKworCWZvciAoaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrKQorCQlzbWVfcHNfY2xvc2VfcGVyX3Nlc3Npb24oaGFsX2N0eCwgaSk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBzbWVfcHNfY2xvc2VfcGVyX3Nlc3Npb24odEhhbEhhbmRsZSBoYWxfY3R4LCB1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbF9jdHgpOworCXN0cnVjdCBwc19nbG9iYWxfaW5mbyAqcHNfZ2xvYmFsX2luZm8gPSAmbWFjX2N0eC0+c21lLnBzX2dsb2JhbF9pbmZvOworCXN0cnVjdCBwc19wYXJhbXMgKnBzX3BhcmFtID0gJnBzX2dsb2JhbF9pbmZvLT5wc19wYXJhbXNbc2Vzc2lvbl9pZF07CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJLyoKKwkgKiBTdG9wIHRoZSBhdXRvIHBzIGVudHJ5IHRpbWVyIGlmIHJ1bm5pbmcKKwkgKi8KKwlpZiAoQ0RGX1RJTUVSX1NUQVRFX1JVTk5JTkcgPT0KKwkJCWNkZl9tY190aW1lcl9nZXRfY3VycmVudF9zdGF0ZSgKKwkJCQkmcHNfcGFyYW0tPmF1dG9fcHNfZW5hYmxlX3RpbWVyKSkgeworCQljZGZfbWNfdGltZXJfc3RvcCgmcHNfcGFyYW0tPmF1dG9fcHNfZW5hYmxlX3RpbWVyKTsKKwl9CisJY2RmX3N0YXR1cyA9CisJCWNkZl9tY190aW1lcl9kZXN0cm95KCZwc19wYXJhbS0+YXV0b19wc19lbmFibGVfdGltZXIpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJDYW5ub3QgZGVhbGxvY2F0ZSBzdXRvIFBTIHRpbWVyIikpOworCXJldHVybiBjZGZfc3RhdHVzOworfQorCitDREZfU1RBVFVTIHNtZV9pc19hdXRvX3BzX3RpbWVyX3J1bm5pbmcodEhhbEhhbmRsZSBoYWxfY3R4LAorCQl1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWxfY3R4KTsKKwlzdHJ1Y3QgcHNfZ2xvYmFsX2luZm8gKnBzX2dsb2JhbF9pbmZvID0gJm1hY19jdHgtPnNtZS5wc19nbG9iYWxfaW5mbzsKKwlzdHJ1Y3QgcHNfcGFyYW1zICpwc19wYXJhbSA9ICZwc19nbG9iYWxfaW5mby0+cHNfcGFyYW1zW3Nlc3Npb25faWRdOworCWJvb2wgc3RhdHVzID0gZmFsc2U7CisJLyoKKwkgKiBDaGVjayBpZiB0aGUgYXV0byBwcyBlbnRyeSB0aW1lciBpZiBydW5uaW5nCisJICovCisJaWYgKENERl9USU1FUl9TVEFURV9SVU5OSU5HID09CisJCQljZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoCisJCQkJJnBzX3BhcmFtLT5hdXRvX3BzX2VuYWJsZV90aW1lcikpIHsKKwkJc3RhdHVzID0gdHJ1ZTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKwpkaWZmIC0tZ2l0IGEvY29yZS9zbWUvc3JjL2NvbW1vbi9zbWVfdHJhY2UuYyBiL2NvcmUvc21lL3NyYy9jb21tb24vc21lX3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkODVmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL3NyYy9jb21tb24vc21lX3RyYWNlLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIHNtZVRyYWNlLmMKKworICAgXGJyaWVmIGltcGxlbWVudGF0aW9uIGZvciB0cmFjZSByZWxhdGVkIEFQSXMKKworICAgXGF1dGhvciBLaXJhbiBLdW1hciBSZWRkeSBDSCBMIFYKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiICAgICAgICAgIC8qIGZvciB0cEFuaVNpckdsb2JhbCAqLworI2luY2x1ZGUgInNtc19kZWJ1Zy5oIgorI2luY2x1ZGUgIm1hY190cmFjZS5oIgorI2luY2x1ZGUgInNtZV90cmFjZS5oIgorI2luY2x1ZGUgInNtZV9pbnRlcm5hbC5oIgorI2lmbmRlZiBTTUVfVFJBQ0VfUkVDT1JECit2b2lkIHNtZV90cmFjZV9pbml0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJcmV0dXJuOworfQorI2VuZGlmCisjaWZkZWYgU01FX1RSQUNFX1JFQ09SRAorCitzdGF0aWMgdWludDhfdCAqc21lX3RyYWNlX2dldF9yeF9tc2dfc3RyaW5nKHVpbnQzMl90IGNvZGUpCit7CisJc3dpdGNoIChjb2RlKSB7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX1NDQU5fUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfU0NBTl9HRVRfUkVTVUxUUyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX0NPTk5FQ1QpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TRVRfMTFESU5GTyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX0dFVF9TT0ZUQVBfRE9NQUlOKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfU0VUX1JFR0lORk8pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcKKwkJCShUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX1VQREFURV9DSEFOTkVMX0NPTkZJRyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX1VQREFURV9DT05GSUcpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19IRERSRUFEWUlORCk7CisJCUNBU0VfUkVUVVJOX1NUUklORworCQkJKFRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfU0NBTl9GTFVTSF9SRVNVTFRTKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HCisJCQkoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TQ0FOX0ZMVVNIX1AyUFJFU1VMVFMpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcKKwkJCShUUkFDRV9DT0RFX1NNRV9SWF9IRERfTVNHX1NDQU5fUkVTVUxUX0dFVEZJUlNUKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HCisJCQkoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX01TR19TQ0FOX1JFU1VMVF9HRVRORVhUKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9NU0dfU0NBTl9SRVNVTFRfUFVSR0UpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JPQU1fUkVBU1NPQyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfUk9BTV9ESVNDT05ORUNUKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HCisJCQkoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JPQU1fR0VUX0NPTk5FQ1RQUk9GSUxFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HCisJCQkoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JPQU1fRlJFRV9DT05ORUNUUFJPRklMRSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfUk9BTV9TRVRfUE1LSURDQUNIRSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfUk9BTV9HRVRfUE1LSURDQUNIRSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfR0VUX0NPTkZJR1BBUkFNKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9HRVRfTU9EUFJPRkZJRUxEUyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX0NPTkZJR19QV1JTQVZFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9HRVRfQ09ORklHX1BXUlNBVkUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0VOQUJMRV9QV1JTQVZFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9ESVNBQkxFX1BXUlNBVkUpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NJR05BTF9QT1dFUl9FVkVOVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfU1RBUlRfQVVUT19CTVBTVElNRVIpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NUT1BfQVVUT19CTVBTVElNRVIpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0lTX1BXUlNBVkVfRU5BQkxFRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfUkVRVUVTVF9GVUxMUE9XRVIpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1JFUVVFU1RfQk1QUyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX0RIQ1BfRkxBRyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfUkVRVUVTVF9TVEFOREJZKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9XT1dMX0FEREJDQVNUX1BBVFRFUk4pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1dPV0xfREVMQkNBU1RfUEFUVEVSTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfRU5URVJfV09XTCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfRVhJVF9XT1dMKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfS0VZKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9HRVRfU1RBVFMpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0dFVF9SU1NJKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9HRVRfQ05UUllDT0RFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfQ05UUllDT0RFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9DSEFOR0VfQ05UUllDT0RFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfQ0ZHUFJJVkFDWSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfTkVJR0hCT1JfUkVQT1JUUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9EQkdfUkVBRFJFRyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfREJHX1dSSVRFUkVHKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9EQkdfUkVBRE1FTSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfREJHX1dSSVRFTUVNKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9PUEVOX1NFU1NJT04pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0NMT1NFX1NFU1NJT04pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NFVF9IT1NUT0ZGTE9BRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX0dUS09GRkxPQUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0dFVF9HVEtPRkZMT0FEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9BQk9SVF9NQUNTQ0FOKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9SRUdJU1RFUl9NR01URlIpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0RFUkVHSVNURVJfTUdNVEZSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9SRU1BSU5fT05DSEFOKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9TRU5EX0FDVElPTik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ0FOQ0VMX1JFTUFJTl9PTkNIQU4pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0NPTkZJR19SWFBGSUwpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0NPTkZJR19TVVNQRU5ESU5EKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9DT05GSUdfUkVTVU1FUkVRKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRVhUV09XX1NVUFBPUlQKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9DT05GSUdfRVhUV09XKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9DT05GSUdfQVBQX1RZUEUxKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9DT05GSUdfQVBQX1RZUEUyKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NFVF9NQVhUWFBPVyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX1RYUE9XKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9TRVRfVE1MRVZFTCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfQ0FQU19FWENIKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9ESVNBQkxFX0NBUCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfR0VUX0RFRkNDTlYpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0dFVF9DVVJDQyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfUkVTRVRfUFc1Ryk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX1JQNUcpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1NFVF9ST0FNSUJBTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0dFVF9ST0FNSUJBTkQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1VQREFURV9SU1NJRElGRik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX0lNTVJTU0lESUZGKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9VUERBVEVfRlRFTkFCTEVEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9VUERBVEVfV0VTTU9ERSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfU0VUX1NDQU5DVFJMKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9VUERBVEVfUDJQX0lFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HCisJCQkoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX1VQREFURV9ST0FNX1NDQU5fTl9QUk9CRVMpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcKKwkJCShUUkFDRV9DT0RFX1NNRV9SWF9IRERfVVBEQVRFX1JPQU1fU0NBTl9IT01FX0FXQVlfVElNRSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhUUkFDRV9DT0RFX1NNRV9SWF9IRERfU1RPUkVfSk9JTl9SRVEpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoVFJBQ0VfQ09ERV9TTUVfUlhfSEREX0NMRUFSX0pPSU5fUkVRKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFRSQUNFX0NPREVfU01FX1JYX0hERF9JU1NVRV9KT0lOX1JFUSk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB1aW50OF90ICpzbWVfdHJhY2VfZ2V0X2NvbW1hbmRfc3RyaW5nKHVpbnQzMl90IGNvbW1hbmQpCit7CisJc3dpdGNoIChjb21tYW5kKSB7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU21lTm9Db21tYW5kKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTbWVEcm9wQ29tbWFuZCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU21lQ3NyQ29tbWFuZE1hc2spOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNtZUNvbW1hbmRTY2FuKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTbWVDb21tYW5kUm9hbSk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU21lQ29tbWFuZFdtU3RhdHVzQ2hhbmdlKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTbWVDb21tYW5kU2V0S2V5KTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTbWVDb21tYW5kQWRkU3RhU2Vzc2lvbik7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU21lQ29tbWFuZERlbFN0YVNlc3Npb24pOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNtZVBtY0NvbW1hbmRNYXNrKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTbWVDb21tYW5kRW50ZXJCbXBzKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTbWVDb21tYW5kRXhpdEJtcHMpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNtZUNvbW1hbmRFbnRlclVhcHNkKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTbWVDb21tYW5kRXhpdFVhcHNkKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTbWVDb21tYW5kRW50ZXJTdGFuZGJ5KTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTbWVRb3NDb21tYW5kTWFzayk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlU21lQ29tbWFuZEFkZFRzKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVTbWVDb21tYW5kRGVsVHMpOworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNtZUNvbW1hbmRPZW1EYXRhUmVxKTsKKyNlbmRpZgorCQlDQVNFX1JFVFVSTl9TVFJJTkcoZVNtZUNvbW1hbmRSZW1haW5PbkNoYW5uZWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTiI7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgc21lX3RyYWNlX2R1bXAodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBfY2RmX3RyYWNlX3JlY29yZCBwUmVjb3JkLAorCQkJICAgdWludDE2X3QgcmVjSW5kZXgpCit7CisJaWYgKFRSQUNFX0NPREVfU01FX0NPTU1BTkQgPT0gcFJlY29yZC0+Y29kZSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsICIlMDRkICUwMTJsbHUgUyVkICUtMTRzICUtMzBzKDB4JXgpIiwKKwkJCXJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorCQkJIlNNRSBDT01NQU5EOiIsIHNtZV90cmFjZV9nZXRfY29tbWFuZF9zdHJpbmcocFJlY29yZC0+ZGF0YSksCisJCQlwUmVjb3JkLT5kYXRhKTsKKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsICIlMDRkICUwMTJsbHUgUyVkICUtMTRzICUtMzBzKDB4JXgpIiwKKwkJCXJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLCAiUlggSEREIE1TRzoiLAorCQkJc21lX3RyYWNlX2dldF9yeF9tc2dfc3RyaW5nKHBSZWNvcmQtPmNvZGUpLCBwUmVjb3JkLT5kYXRhKTsKKwl9Cit9CisKK3ZvaWQgc21lX3RyYWNlX2luaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwljZGZfdHJhY2VfcmVnaXN0ZXIoQ0RGX01PRFVMRV9JRF9TTUUsICh0cF9jZGZfdHJhY2VfY2IpICYgc21lX3RyYWNlX2R1bXApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9zcmMvY3NyL2Nzcl9hcGlfcm9hbS5jIGIvY29yZS9zbWUvc3JjL2Nzci9jc3JfYXBpX3JvYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDc0ZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zbWUvc3JjL2Nzci9jc3JfYXBpX3JvYW0uYwpAQCAtMCwwICsxLDE4ODYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisKKyAgICBcZmlsZSBjc3JfYXBpX3JvYW0uYworCisgICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBDb21tb24gUm9hbWluZyBpbnRlcmZhY2VzLgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiICAgICAgICAgIC8qIGZvciB0cEFuaVNpckdsb2JhbCAqLworI2luY2x1ZGUgIndtYV90eXBlcy5oIgorI2luY2x1ZGUgIndtYV9pZi5oIiAgICAgICAgICAvKiBmb3IgU1RBX0lOVkFMSURfSURYLiAqLworI2luY2x1ZGUgImxpbV91dGlscy5oIgorI2luY2x1ZGUgImNkc19tcS5oIgorI2luY2x1ZGUgImNzcl9pbnNpZGVfYXBpLmgiCisjaW5jbHVkZSAic21zX2RlYnVnLmgiCisjaW5jbHVkZSAic21lX3Fvc19pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNtZV9pbnNpZGUuaCIKKyNpbmNsdWRlICJob3N0X2RpYWdfY29yZV9ldmVudC5oIgorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2luY2x1ZGUgImNzcl9hcGkuaCIKKyNpbmNsdWRlICJjc3JfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjZHNfcmVnX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJtYWNfdHJhY2UuaCIKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworI2luY2x1ZGUgImNzcl9uZWlnaGJvcl9yb2FtLmgiCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcgKi8KKyNpbmNsdWRlICJjZHNfcmVnZG9tYWluX2NvbW1vbi5oIgorI2luY2x1ZGUgImNkc191dGlscy5oIgorI2luY2x1ZGUgInNpcl90eXBlcy5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJzbWVfcG93ZXJfc2F2ZV9hcGkuaCIKKyNpbmNsdWRlICJ3bWEuaCIKKyNpbmNsdWRlICJjZHNfY29uY3VycmVuY3kuaCIKKworI2RlZmluZSBDU1JfTlVNX0lCU1NfU1RBUlRfQ0hBTk5FTFNfNTAgICAgICA0CisjZGVmaW5lIENTUl9OVU1fSUJTU19TVEFSVF9DSEFOTkVMU18yNCAgICAgIDMKKy8qIDUgc2Vjb25kcywgZm9yIFdQQSwgV1BBMiwgQ0NLTSAqLworI2RlZmluZSBDU1JfV0FJVF9GT1JfS0VZX1RJTUVPVVRfUEVSSU9EICAgICAoNSAqIENERl9NQ19USU1FUl9UT19TRUNfVU5JVCkKKy8qIDEyMCBzZWNvbmRzLCBmb3IgV1BTICovCisjZGVmaW5lIENTUl9XQUlUX0ZPUl9XUFNfS0VZX1RJTUVPVVRfUEVSSU9EICgxMjAgKiBDREZfTUNfVElNRVJfVE9fU0VDX1VOSVQpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBPQklXQU4gcmVjb21tZW5kcyBbOCAxMF0lIDogcGljayA5JQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ1NSX1ZDQ19VTF9NQUNfTE9TU19USFJFU0hPTEQgOQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIE9CSVdBTiByZWNvbW1lbmRzIC04NWRCbQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ1NSX1ZDQ19SU1NJX1RIUkVTSE9MRCA4MAorI2RlZmluZSBDU1JfTUlOX0dMT0JBTF9TVEFUX1FVRVJZX1BFUklPRCAgIDUwMCAgLyogbXMgKi8KKyNkZWZpbmUgQ1NSX01JTl9HTE9CQUxfU1RBVF9RVUVSWV9QRVJJT0RfSU5fQk1QUyAyMDAwICAgLyogbXMgKi8KKyNkZWZpbmUgQ1NSX01JTl9UTF9TVEFUX1FVRVJZX1BFUklPRCAgICAgICA1MDAgIC8qIG1zICovCisvKiBGbGFnIHRvIHNlbmQvZG8gbm90IHNlbmQgZGlzYXNzb2MgZnJhbWUgb3ZlciB0aGUgYWlyICovCisjZGVmaW5lIENTUl9ET05UX1NFTkRfRElTQVNTT0NfT1ZFUl9USEVfQUlSIDEKKyNkZWZpbmUgUlNTSV9IQUNLX0JNUFMgKC00MCkKKyNkZWZpbmUgTUFYX0NCX1ZBTFVFX0lOX0lOSSAoMikKKworI2RlZmluZSBNQVhfU09DSUFMX0NIQU5ORUxTICAzCisvKiBDaG9vc2UgdGhlIGxhcmdlc3QgcG9zc2libGUgdmFsdWUgdGhhdCBjYW4gYmUgYWNjb21vZGF0ZXMgaW4gOCBiaXQgc2lnbmVkICovCisvKiB2YXJpYWJsZS4gKi8KKyNkZWZpbmUgU05SX0hBQ0tfQk1QUyAgICAgICAgICAgICAgICAgICAgICAgICAoMTI3KQorCitzdGF0aWMgYm9vbCBiX3JvYW1fc2Nhbl9vZmZsb2FkX3N0YXJ0ZWQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFN0YXRpYyBUeXBlIGRlY2xhcmF0aW9ucworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB0Q3NyUm9hbVNlc3Npb24gY3NyX3JvYW1fcm9hbV9zZXNzaW9uW0NTUl9ST0FNX1NFU1NJT05fTUFYXTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKK2ludCBkaWFnX2F1dGhfdHlwZV9mcm9tX2Nzcl90eXBlKGVDc3JBdXRoVHlwZSBhdXRoVHlwZSkKK3sKKwlpbnQgbiA9IEFVVEhfT1BFTjsKKwlzd2l0Y2ggKGF1dGhUeXBlKSB7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOgorCQluID0gQVVUSF9TSEFSRUQ7CisJCWJyZWFrOworCWNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBOgorCQluID0gQVVUSF9XUEFfRUFQOworCQlicmVhazsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1dQQV9QU0s6CisJCW4gPSBBVVRIX1dQQV9QU0s7CisJCWJyZWFrOworCWNhc2UgZUNTUl9BVVRIX1RZUEVfUlNOOgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1JTTl84MDIxWF9TSEEyNTY6CisjZW5kaWYKKwkJbiA9IEFVVEhfV1BBMl9FQVA7CisJCWJyZWFrOworCWNhc2UgZUNTUl9BVVRIX1RZUEVfUlNOX1BTSzoKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLX1NIQTI1NjoKKyNlbmRpZgorCQluID0gQVVUSF9XUEEyX1BTSzsKKwkJYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1dBUElfV0FJX0NFUlRJRklDQVRFOgorCQluID0gQVVUSF9XQVBJX0NFUlQ7CisJCWJyZWFrOworCWNhc2UgZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfUFNLOgorCQluID0gQVVUSF9XQVBJX1BTSzsKKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIG47Cit9CisKK2ludCBkaWFnX2VuY190eXBlX2Zyb21fY3NyX3R5cGUoZUNzckVuY3J5cHRpb25UeXBlIGVuY1R5cGUpCit7CisJaW50IG4gPSBFTkNfTU9ERV9PUEVOOworCXN3aXRjaCAoZW5jVHlwZSkgeworCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOgorCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA6CisJCW4gPSBFTkNfTU9ERV9XRVA0MDsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OgorCQluID0gRU5DX01PREVfV0VQMTA0OworCQlicmVhazsKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1RLSVA6CisJCW4gPSBFTkNfTU9ERV9US0lQOworCQlicmVhazsKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX0FFUzoKKwkJbiA9IEVOQ19NT0RFX0FFUzsKKwkJYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dQSToKKwkJbiA9IEVOQ19NT0RFX1NNUzQ7CisJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBuOworfQorI2VuZGlmIC8qICNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QKKyBjc3Jfc3RhcnRfaWJzc19jaGFubmVsczUwW0NTUl9OVU1fSUJTU19TVEFSVF9DSEFOTkVMU181MF0gPSB7IDM2LCA0MCwgNDQsIDQ4IH07CitzdGF0aWMgY29uc3QgdWludDhfdAorIGNzcl9zdGFydF9pYnNzX2NoYW5uZWxzMjRbQ1NSX05VTV9JQlNTX1NUQVJUX0NIQU5ORUxTXzI0XSA9IHsgMSwgNiwgMTEgfTsKK3N0YXRpYyB2b2lkIGluaXRfY29uZmlnX3BhcmFtKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworc3RhdGljIGJvb2wgY3NyX3JvYW1fcHJvY2Vzc19yZXN1bHRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kLAorCQkJCSAgICAgZUNzclJvYW1Db21wbGV0ZVJlc3VsdCBSZXN1bHQsCisJCQkJICAgICB2b2lkICpDb250ZXh0KTsKK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9yb2FtX3N0YXJ0X2lic3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJICAgICAgYm9vbCAqcGZTYW1lSWJzcyk7CitzdGF0aWMgdm9pZCBjc3Jfcm9hbV91cGRhdGVfY29ubmVjdGVkX3Byb2ZpbGVfZnJvbV9uZXdfYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJICAgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkJCSAgIHRTaXJTbWVOZXdCc3NJbmZvICoKKwkJCQkJCQkgICBwTmV3QnNzKTsKK3N0YXRpYyB2b2lkIGNzcl9yb2FtX3ByZXBhcmVfYnNzX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCXRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsCisJCQkJCXRCc3NDb25maWdQYXJhbSAqcEJzc0NvbmZpZywKKwkJCQkJdERvdDExZkJlYWNvbklFcyAqcEllcyk7CitzdGF0aWMgZVBoeUNoYW5Cb25kU3RhdGUgY3NyX2dldF9jYl9tb2RlX2Zyb21faWVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgIHVpbnQ4X3QgcHJpbWFyeUNobiwKKwkJCQkJCSAgdERvdDExZkJlYWNvbklFcyAqcEllcyk7CisKK3N0YXRpYyB2b2lkIGNzcl9yb2FtaW5nX3N0YXRlX2NvbmZpZ19jbmZfcHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICB1aW50MzJfdCByZXN1bHQpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9vcGVuKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9jbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyX3JvYW1NSUNFcnJvclRpbWVySGFuZGxlcih2b2lkICpwdik7Cit2b2lkIGNzcl9yb2FtVEtJUENvdW50ZXJNZWFzdXJlVGltZXJIYW5kbGVyKHZvaWQgKnB2KTsKK2Jvb2wgY3NyX3JvYW1faXNfc2FtZV9wcm9maWxlX2tleXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBDb25uUHJvZmlsZSwKKwkJCQkgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlMik7CisKK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9yb2FtX3N0YXJ0X3JvYW1pbmdfdGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgIHVpbnQzMl90IGludGVydmFsKTsKK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9yb2FtX3N0b3Bfcm9hbWluZ190aW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICB1aW50MzJfdCBzZXNzaW9uSWQpOworc3RhdGljIHZvaWQgY3NyX3JvYW1fcm9hbWluZ190aW1lcl9oYW5kbGVyKHZvaWQgKnB2KTsKK0NERl9TVEFUVVMgY3NyX3JvYW1fc3RhcnRfd2FpdF9mb3Jfa2V5X3RpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IGludGVydmFsKTsKK0NERl9TVEFUVVMgY3NyX3JvYW1fc3RvcF93YWl0X2Zvcl9rZXlfdGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitzdGF0aWMgdm9pZCBjc3Jfcm9hbV93YWl0X2Zvcl9rZXlfdGltZV9vdXRfaGFuZGxlcih2b2lkICpwdik7CitzdGF0aWMgQ0RGX1NUQVRVUyBjc3JfaW5pdDExZF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3IxMWRpbmZvICpwczExZGluZm8pOworc3RhdGljIENERl9TVEFUVVMgY3NyX2luaXRfY2hhbm5lbF9wb3dlcl9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHRDc3IxMWRpbmZvICpwczExZGluZm8pOworc3RhdGljIENERl9TVEFUVVMgY3NyX3JvYW1fZnJlZV9jb25uZWN0ZWRfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICAgdENzclJvYW1Db25uZWN0ZWRJbmZvICoKKwkJCQkJICAgICAgIHBDb25uZWN0ZWRJbmZvKTsKK0NERl9TVEFUVVMgY3NyX3NlbmRfbWJfc2V0X2NvbnRleHRfcmVxX21zZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLCB1aW50OF90IG51bUtleXMsCisJCQkJCSAgIHRBbmlFZFR5cGUgZWRUeXBlLCBib29sIGZVbmljYXN0LAorCQkJCQkgICB0QW5pS2V5RGlyZWN0aW9uIGFuaUtleURpcmVjdGlvbiwKKwkJCQkJICAgdWludDhfdCBrZXlJZCwgdWludDhfdCBrZXlMZW5ndGgsCisJCQkJCSAgIHVpbnQ4X3QgKnBLZXksIHVpbnQ4X3QgcGFlUm9sZSwKKwkJCQkJICAgdWludDhfdCAqcEtleVJzYyk7CitzdGF0aWMgQ0RGX1NUQVRVUyBjc3Jfcm9hbV9pc3N1ZV9yZWFzc29jaWF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLAorCQkJCQkgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsCisJCQkJCSAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSk7Cit2b2lkIGNzcl9yb2FtU3RhdGlzdGljc1RpbWVySGFuZGxlcih2b2lkICpwdik7Cit2b2lkIGNzcl9yb2FtU3RhdHNHbG9iYWxDbGFzc0RUaW1lckhhbmRsZXIodm9pZCAqcHYpOworc3RhdGljIHZvaWQgY3NyX3JvYW1fbGlua191cCh0cEFuaVNpckdsb2JhbCBwTWFjLCBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkKTsKK3N0YXRpYyB2b2lkIGNzcl9yb2FtX2xpbmtfZG93bih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpOwordm9pZCBjc3Jfcm9hbV92Y2NfdHJpZ2dlcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK0NERl9TVEFUVVMgY3NyX3NlbmRfbWJfc3RhdHNfcmVxX21zZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzdGF0c01hc2ssCisJCQkJICAgICB1aW50OF90IHN0YUlkLCB1aW50OF90IHNlc3Npb25JZCk7CisvKgorICAgIHBTdGFFbnRyeSBpcyBubyBsb25nZXIgaW52YWxpZCB1cG9uIHRoZSByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgY3NyX3JvYW1fcmVtb3ZlX3N0YXRfbGlzdF9lbnRyeSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0TGlzdEVsZW0gKnBFbnRyeSk7CitzdGF0aWMgZUNzckNmZ0RvdDExTW9kZSBjc3Jfcm9hbV9nZXRfcGh5X21vZGVfYmFuZF9mb3JfYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCQkJCQkgICB1aW50OF90IG9wZXJhdGlvbkNobiwKKwkJCQkJCQkgICBlQ3NyQmFuZCAqcEJhbmQpOworc3RhdGljIENERl9TVEFUVVMgY3NyX3JvYW1fZ2V0X3Fvc19pbmZvX2Zyb21fYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYyk7Cit0Q3NyU3RhdHNDbGllbnRSZXFJbmZvICpjc3Jfcm9hbV9pbnNlcnRfZW50cnlfaW50b19saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJdERibExpbmtMaXN0ICpwU3RhTGlzdCwKKwkJCQkJCQl0Q3NyU3RhdHNDbGllbnRSZXFJbmZvICoKKwkJCQkJCQlwU3RhRW50cnkpOwordm9pZCBjc3Jfcm9hbV9zdGF0c19jbGllbnRfdGltZXJfaGFuZGxlcih2b2lkICpwdik7Cit0Q3NyUGVTdGF0c1JlcUluZm8gKmNzcl9yb2FtX2NoZWNrX3BlX3N0YXRzX3JlcV9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgIHVpbnQzMl90IHN0YXRzTWFzaywKKwkJCQkJCSAgICAgdWludDMyX3QgcGVyaW9kaWNpdHksCisJCQkJCQkgICAgIGJvb2wgKnBGb3VuZCwgdWludDhfdCBzdGFJZCwKKwkJCQkJCSAgICAgdWludDhfdCBzZXNzaW9uSWQpOwordm9pZCBjc3Jfcm9hbV9yZXBvcnRfc3RhdGlzdGljcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzdGF0c01hc2ssCisJCQkJdENzclN0YXRzQ2FsbGJhY2sgY2FsbGJhY2ssIHVpbnQ4X3Qgc3RhSWQsCisJCQkJdm9pZCAqcENvbnRleHQpOwordm9pZCBjc3Jfcm9hbV90bF9zdGF0c190aW1lcl9oYW5kbGVyKHZvaWQgKnB2KTsKK3ZvaWQgY3NyX3JvYW1fcGVfc3RhdHNfdGltZXJfaGFuZGxlcih2b2lkICpwdik7Cit0TGlzdEVsZW0gKmNzcl9yb2FtX2NoZWNrX2NsaWVudF9yZXFfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzdGF0c01hc2spOwordm9pZCBjc3Jfcm9hbV9yZW1vdmVfZW50cnlfZnJvbV9wZV9zdGF0c19yZXFfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICB0Q3NyUGVTdGF0c1JlcUluZm8gKnBQZVN0YUVudHJ5KTsKK3RMaXN0RWxlbSAqY3NyX3JvYW1fZmluZF9pbl9wZV9zdGF0c19yZXFfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzdGF0c01hc2spOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9kZXJlZ19zdGF0aXN0aWNzX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3N0YXRpYyB1aW50MzJfdCBjc3JfZmluZF9pYnNzX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYyk7CitzdGF0aWMgdWludDMyX3QgY3NyX2ZpbmRfc2Vzc2lvbl9ieV90eXBlKHRwQW5pU2lyR2xvYmFsLCB0Q0RGX0NPTl9NT0RFKTsKK3N0YXRpYyBib29sIGNzcl9pc19jb25uX2FsbG93XzJnX2JhbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgY2hubCk7CitzdGF0aWMgYm9vbCBjc3JfaXNfY29ubl9hbGxvd181Z19iYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IGNobmwpOworc3RhdGljIENERl9TVEFUVVMgY3NyX3JvYW1fc3RhcnRfd2RzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjKTsKK3N0YXRpYyB2b2lkIGNzcl9pbml0X3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9yb2FtX2lzc3VlX3NldF9rZXlfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJCSB0Q3NyUm9hbVNldEtleSAqcFNldEtleSwKKwkJCQkJCSB1aW50MzJfdCByb2FtSWQpOworc3RhdGljIENERl9TVEFUVVMgY3NyX3JvYW1fZ2V0X3Fvc19pbmZvX2Zyb21fYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYyk7Cit2b2lkIGNzcl9yb2FtX3JlaXNzdWVfcm9hbV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworc3RhdGljIHZvaWQgY3NyX3Nlcl9kZXNfdW5wYWNrX2RpYXNzb2NfcnNwKHVpbnQ4X3QgKnBCdWYsCisJCQkJCSAgIHRTaXJTbWVEaXNhc3NvY1JzcCAqcFJzcCk7Cit2b2lkIGNzcl9yZWluaXRfcHJlYXV0aF9jbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOwordm9pZCBjc3JfaW5pdF9vcGVyYXRpbmdfY2xhc3Nlcyh0SGFsSGFuZGxlIGhIYWwpOworCisvKiBJbml0aWFsaXplIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyB2b2lkIGNzcl9yb2FtX2luaXRfZ2xvYmFscyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCWlmIChwTWFjKSB7CisJCWNkZl9tZW1femVybygmY3NyX3JvYW1fcm9hbV9zZXNzaW9uLCBzaXplb2YoY3NyX3JvYW1fcm9hbV9zZXNzaW9uKSk7CisJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb24gPSBjc3Jfcm9hbV9yb2FtX3Nlc3Npb247CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY3NyX3JvYW1fZGVfaW5pdF9nbG9iYWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJaWYgKHBNYWMpIHsKKwkJcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbiA9IE5VTEw7CisJfQorCXJldHVybjsKK30KKworQ0RGX1NUQVRVUyBjc3Jfb3Blbih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVpbnQzMl90IGk7CisKKwlkbyB7CisJCS8qIEluaXRpYWxpemUgQ1NSIFJvYW0gR2xvYmFscyAqLworCQljc3Jfcm9hbV9pbml0X2dsb2JhbHMocE1hYyk7CisJCWZvciAoaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrKQorCQkJY3NyX3JvYW1fc3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9TVE9QLCBpKTsKKworCQlpbml0X2NvbmZpZ19wYXJhbShwTWFjKTsKKwkJc3RhdHVzID0gY3NyX3NjYW5fb3BlbihwTWFjKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBjc3Jfcm9hbV9vcGVuKHBNYWMpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJYnJlYWs7CisJCXBNYWMtPnJvYW0ubmV4dFJvYW1JZCA9IDE7ICAgICAgLyogTXVzdCBub3QgYmUgMCAqLworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgIChjc3JfbGxfb3BlbihwTWFjLT5oSGRkLAorCQkJCQkgJnBNYWMtPnJvYW0uc3RhdHNDbGllbnRSZXFMaXN0KSkpCisJCQlicmVhazsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJCSAgICAoY3NyX2xsX29wZW4ocE1hYy0+aEhkZCwKKwkJCQkJICZwTWFjLT5yb2FtLnBlU3RhdHNSZXFMaXN0KSkpCisJCQlicmVhazsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJCSAgICAoY3NyX2xsX29wZW4ocE1hYy0+aEhkZCwKKwkJCQkJICZwTWFjLT5yb2FtLnJvYW1DbWRQZW5kaW5nTGlzdCkpKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9pbml0X2NoYW5fbGlzdCh0cEFuaVNpckdsb2JhbCBtYWMsIHVpbnQ4X3QgKmFscGhhMikKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl2X1JFR0RPTUFJTl90IHJlZ19pZDsKKwl2X0NvdW50cnlJbmZvU291cmNlX3Qgc291cmNlID0gQ09VTlRSWV9JTklUOworCisJbWFjLT5zY2FuLmNvdW50cnlDb2RlRGVmYXVsdFswXSA9IGFscGhhMlswXTsKKwltYWMtPnNjYW4uY291bnRyeUNvZGVEZWZhdWx0WzFdID0gYWxwaGEyWzFdOworCW1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHRbMl0gPSBhbHBoYTJbMl07CisKKwlzbXNfbG9nKG1hYywgTE9HRSwgRkwoImluaXQgdGltZSBjb3VudHJ5IGNvZGUgJS4ycyIpLAorCQltYWMtPnNjYW4uY291bnRyeUNvZGVEZWZhdWx0KTsKKworCXN0YXR1cyA9IGNzcl9nZXRfcmVndWxhdG9yeV9kb21haW5fZm9yX2NvdW50cnkobWFjLAorCQkJCQkJICAgICAgIG1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsCisJCQkJCQkgICAgICAgJnJlZ19pZCwgc291cmNlKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJjc3JfZ2V0X3JlZ3VsYXRvcnlfZG9tYWluX2Zvcl9jb3VudHJ5IGZhaWxlZCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoY2RzX3NldF9yZWdfZG9tYWluKG1hYywgcmVnX2lkKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJjZHNfc2V0X3JlZ19kb21haW4gZmFpbGVkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCW1hYy0+c2Nhbi5kb21haW5JZERlZmF1bHQgPSByZWdfaWQ7CisJbWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCA9IG1hYy0+c2Nhbi5kb21haW5JZERlZmF1bHQ7CisJY2RmX21lbV9jb3B5KG1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnQsCisJCSAgICAgbWFjLT5zY2FuLmNvdW50cnlDb2RlRGVmYXVsdCwgV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKTsKKwljZGZfbWVtX2NvcHkobWFjLT5zY2FuLmNvdW50cnlDb2RlRWxlY3RlZCwKKwkJICAgICBtYWMtPnNjYW4uY291bnRyeUNvZGVEZWZhdWx0LCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCXN0YXR1cyA9IGNzcl9nZXRfY2hhbm5lbF9hbmRfcG93ZXJfbGlzdChtYWMpOworCWNzcl9jbGVhcl92b3Rlc19mb3JfY291bnRyeV9pbmZvKG1hYyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2V0X3JlZ19pbmZvKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCAqYXBDbnRyeUNvZGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXZfUkVHRE9NQUlOX3QgcmVnSWQ7CisJdWludDhfdCBjbnRyeUNvZGVMZW5ndGg7CisJaWYgKE5VTEwgPT0gYXBDbnRyeUNvZGUpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiIEludmFsaWQgY291bnRyeSBDb2RlIFBvaW50ZXIiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiIGNvdW50cnkgQ29kZSAlLjJzIiksIGFwQ250cnlDb2RlKTsKKworCWNudHJ5Q29kZUxlbmd0aCA9IFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTjsKKwlzdGF0dXMgPSBjc3JfZ2V0X3JlZ3VsYXRvcnlfZG9tYWluX2Zvcl9jb3VudHJ5KHBNYWMsIGFwQ250cnlDb2RlLCAmcmVnSWQsCisJCQkJCQkgICAgICAgQ09VTlRSWV9VU0VSKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiICBmYWlsIHRvIGdldCByZWdJZCBmb3IgY291bnRyeSBDb2RlICUuMnMiKSwKKwkJCWFwQ250cnlDb2RlKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJc3RhdHVzID0gd21hX3NldF9yZWdfZG9tYWluKGhIYWwsIHJlZ0lkKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiICBmYWlsIHRvIGdldCByZWdJZCBmb3IgY291bnRyeSBDb2RlICUuMnMiKSwKKwkJCWFwQ250cnlDb2RlKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJcE1hYy0+c2Nhbi5kb21haW5JZERlZmF1bHQgPSByZWdJZDsKKwlwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCA9IHBNYWMtPnNjYW4uZG9tYWluSWREZWZhdWx0OworCS8qIENsZWFyIENDIGZpZWxkICovCisJY2RmX21lbV9zZXQocE1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiwgMCk7CisKKwkvKiBDb3B5IDIgb3IgMyBieXRlcyBjb3VudHJ5IGNvZGUgKi8KKwljZGZfbWVtX2NvcHkocE1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsIGFwQ250cnlDb2RlLAorCQkgICAgIGNudHJ5Q29kZUxlbmd0aCk7CisKKwkvKiBJZiAyIGJ5dGVzIGNvdW50cnkgY29kZSwgM3JkIGJ5dGUgbXVzdCBiZSBmaWxsZWQgd2l0aCBzcGFjZSAqLworCWlmICgoV05JX0NGR19DT1VOVFJZX0NPREVfTEVOIC0gMSkgPT0gY250cnlDb2RlTGVuZ3RoKSB7CisJCWNkZl9tZW1fc2V0KHBNYWMtPnNjYW4uY291bnRyeUNvZGVEZWZhdWx0ICsgMiwgMSwgMHgyMCk7CisJfQorCWNkZl9tZW1fY29weShwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwKKwkJICAgICBwTWFjLT5zY2FuLmNvdW50cnlDb2RlRGVmYXVsdCwgV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKTsKKwlzdGF0dXMgPSBjc3JfZ2V0X2NoYW5uZWxfYW5kX3Bvd2VyX2xpc3QocE1hYyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2V0X2NoYW5uZWxzKHRIYWxIYW5kbGUgaEhhbCwgdENzckNvbmZpZ1BhcmFtICpwUGFyYW0pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXVpbnQ4X3QgaW5kZXggPSAwOworCWNkZl9tZW1fY29weShwUGFyYW0tPkNzcjExZGluZm8uY291bnRyeUNvZGUsCisJCSAgICAgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnQsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTik7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcE1hYy0+c2Nhbi5iYXNlX2NoYW5uZWxzLm51bUNoYW5uZWxzOworCSAgICAgaW5kZXgrKykgeworCQlwUGFyYW0tPkNzcjExZGluZm8uQ2hhbm5lbHMuY2hhbm5lbExpc3RbaW5kZXhdID0KKwkJCXBNYWMtPnNjYW4uYmFzZV9jaGFubmVscy5jaGFubmVsTGlzdFtpbmRleF07CisJCXBQYXJhbS0+Q3NyMTFkaW5mby5DaG5Qb3dlcltpbmRleF0uZmlyc3RDaGFubmVsID0KKwkJCXBNYWMtPnNjYW4uYmFzZV9jaGFubmVscy5jaGFubmVsTGlzdFtpbmRleF07CisJCXBQYXJhbS0+Q3NyMTFkaW5mby5DaG5Qb3dlcltpbmRleF0ubnVtQ2hhbm5lbHMgPSAxOworCQlwUGFyYW0tPkNzcjExZGluZm8uQ2huUG93ZXJbaW5kZXhdLm1heHR4UG93ZXIgPQorCQkJcE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZVtpbmRleF0ucHdyOworCX0KKwlwUGFyYW0tPkNzcjExZGluZm8uQ2hhbm5lbHMubnVtQ2hhbm5lbHMgPQorCQlwTWFjLT5zY2FuLmJhc2VfY2hhbm5lbHMubnVtQ2hhbm5lbHM7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9jbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJY3NyX3JvYW1fY2xvc2UocE1hYyk7CisJY3NyX3NjYW5fY2xvc2UocE1hYyk7CisJY3NyX2xsX2Nsb3NlKCZwTWFjLT5yb2FtLnN0YXRzQ2xpZW50UmVxTGlzdCk7CisJY3NyX2xsX2Nsb3NlKCZwTWFjLT5yb2FtLnBlU3RhdHNSZXFMaXN0KTsKKwljc3JfbGxfY2xvc2UoJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0KTsKKwkvKiBEZUluaXQgR2xvYmFscyAqLworCWNzcl9yb2FtX2RlX2luaXRfZ2xvYmFscyhwTWFjKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdFBvd2VyZEJtIGNzcl9maW5kX2NoYW5uZWxfcHdyKHRDaGFubmVsTGlzdFdpdGhQb3dlciAqCisJCQkJCSAgICAgcGRlZmF1bHRQb3dlclRhYmxlLAorCQkJCQkgICAgIHVpbnQ4X3QgQ2hhbm5lbE51bSkKK3sKKwl1aW50OF90IGk7CisJLyogVE9ETzogaWYgZGVmYXVsdFBvd2VyVGFibGUgaXMgZ3VhcmFudGVlZCB0byBiZSBpbiBhc2NlbmRpbmcgKi8KKwkvKiBvcmRlciBvZiBjaGFubmVsIG51bWJlcnMsIHdlIGNhbiBlbXBsb3kgYmluYXJ5IHNlYXJjaCAqLworCWZvciAoaSA9IDA7IGkgPCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU47IGkrKykgeworCQlpZiAocGRlZmF1bHRQb3dlclRhYmxlW2ldLmNoYW5JZCA9PSBDaGFubmVsTnVtKQorCQkJcmV0dXJuIHBkZWZhdWx0UG93ZXJUYWJsZVtpXS5wd3I7CisJfQorCS8qIGNvdWxkIG5vdCBmaW5kIHRoZSBjaGFubmVsIGxpc3QgaW4gZGVmYXVsdCBsaXN0ICovCisJLyogdGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJlZCAqLworCUNERl9BU1NFUlQoMCk7CisJcmV0dXJuIDA7Cit9CisKK0NERl9TVEFUVVMgY3NyX3VwZGF0ZV9jaGFubmVsX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl0U2lyVXBkYXRlQ2hhbkxpc3QgKnBDaGFuTGlzdDsKKwl0Q3NyU2NhblN0cnVjdCAqcFNjYW4gPSAmcE1hYy0+c2NhbjsKKwl1aW50OF90IG51bUNoYW4gPSBwU2Nhbi0+YmFzZV9jaGFubmVscy5udW1DaGFubmVsczsKKwl1aW50OF90IG51bV9jaGFubmVsID0gMDsKKwl1aW50MzJfdCBidWZMZW47CisJY2RzX21zZ190IG1zZzsKKwl1aW50OF90IGksIGosIHNvY2lhbF9jaGFubmVsW01BWF9TT0NJQUxfQ0hBTk5FTFNdID0geyAxLCA2LCAxMSB9OworCXVpbnQ4X3QgY2hhbm5lbF9zdGF0ZTsKKworCWlmIChDU1JfSVNfNUdfQkFORF9PTkxZKHBNYWMpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfU09DSUFMX0NIQU5ORUxTOyBpKyspIHsKKwkJCWlmIChjZHNfZ2V0X2NoYW5uZWxfc3RhdGUoc29jaWFsX2NoYW5uZWxbaV0pCisJCQkgICAgPT0gQ0hBTk5FTF9TVEFURV9FTkFCTEUpCisJCQkJbnVtQ2hhbisrOworCQl9CisJfQorCisJYnVmTGVuID0gc2l6ZW9mKHRTaXJVcGRhdGVDaGFuTGlzdCkgKworCQkgKHNpemVvZih0U2lyVXBkYXRlQ2hhblBhcmFtKSAqIChudW1DaGFuKSk7CisKKwljc3JfaW5pdF9vcGVyYXRpbmdfY2xhc3NlcygodEhhbEhhbmRsZSkgcE1hYyk7CisJcENoYW5MaXN0ID0gKHRTaXJVcGRhdGVDaGFuTGlzdCAqKSBjZGZfbWVtX21hbGxvYyhidWZMZW4pOworCWlmICghcENoYW5MaXN0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdFNpclVwZGF0ZUNoYW5MaXN0Iik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCWNkZl9tZW1femVybyhwQ2hhbkxpc3QsIGJ1Zkxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcFNjYW4tPmJhc2VfY2hhbm5lbHMubnVtQ2hhbm5lbHM7IGkrKykgeworCQkvKiBTY2FuIGlzIG5vdCBwZXJmb3JtZWQgb24gRFNSQyBjaGFubmVscyovCisJCWlmIChwU2Nhbi0+YmFzZV9jaGFubmVscy5jaGFubmVsTGlzdFtpXSA+PSBNSU5fMTFQX0NIQU5ORUwpCisJCQljb250aW51ZTsKKwkJaWYgKHBTY2FuLT5mY2NfY29uc3RyYWludCkgeworCQkJaWYgKHBTY2FuLT5iYXNlX2NoYW5uZWxzLmNoYW5uZWxMaXN0W2ldID09IDEyKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBTY2FuLT5iYXNlX2NoYW5uZWxzLmNoYW5uZWxMaXN0W2ldID09IDEzKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWNoYW5uZWxfc3RhdGUgPQorCQkJY2RzX2dldF9jaGFubmVsX3N0YXRlKAorCQkJCXBTY2FuLT5iYXNlX2NoYW5uZWxzLmNoYW5uZWxMaXN0W2ldKTsKKwkJaWYgKChDSEFOTkVMX1NUQVRFX0VOQUJMRSA9PSBjaGFubmVsX3N0YXRlKSB8fAorCQkgICAgcE1hYy0+c2Nhbi5mRW5hYmxlREZTQ2hubFNjYW4pIHsKKwkJCXBDaGFuTGlzdC0+Y2hhblBhcmFtW251bV9jaGFubmVsXS5jaGFuSWQgPQorCQkJCXBTY2FuLT5iYXNlX2NoYW5uZWxzLmNoYW5uZWxMaXN0W2ldOworCQkJcENoYW5MaXN0LT5jaGFuUGFyYW1bbnVtX2NoYW5uZWxdLnB3ciA9CisJCQkJY3NyX2ZpbmRfY2hhbm5lbF9wd3IocFNjYW4tPmRlZmF1bHRQb3dlclRhYmxlLAorCQkJCQkJICBwQ2hhbkxpc3QtPmNoYW5QYXJhbVtudW1fY2hhbm5lbF0uY2hhbklkKTsKKwkJCWlmIChDSEFOTkVMX1NUQVRFX0VOQUJMRSA9PSBjaGFubmVsX3N0YXRlKQorCQkJCXBDaGFuTGlzdC0+Y2hhblBhcmFtW251bV9jaGFubmVsXS5kZnNTZXQgPQorCQkJCQlmYWxzZTsKKwkJCWVsc2UKKwkJCQlwQ2hhbkxpc3QtPmNoYW5QYXJhbVtudW1fY2hhbm5lbF0uZGZzU2V0ID0KKwkJCQkJdHJ1ZTsKKwkJCW51bV9jaGFubmVsKys7CisJCX0KKwl9CisKKwlpZiAoQ1NSX0lTXzVHX0JBTkRfT05MWShwTWFjKSkgeworCQlmb3IgKGogPSAwOyBqIDwgTUFYX1NPQ0lBTF9DSEFOTkVMUzsgaisrKSB7CisJCQlpZiAoY2RzX2dldF9jaGFubmVsX3N0YXRlKHNvY2lhbF9jaGFubmVsW2pdKQorCQkJICAgID09IENIQU5ORUxfU1RBVEVfRU5BQkxFKSB7CisJCQkJcENoYW5MaXN0LT5jaGFuUGFyYW1bbnVtX2NoYW5uZWxdLmNoYW5JZCA9CisJCQkJCXNvY2lhbF9jaGFubmVsW2pdOworCQkJCXBDaGFuTGlzdC0+Y2hhblBhcmFtW251bV9jaGFubmVsXS5wd3IgPQorCQkJCQljc3JfZmluZF9jaGFubmVsX3B3cihwU2Nhbi0+ZGVmYXVsdFBvd2VyVGFibGUsCisJCQkJCQkJICBzb2NpYWxfY2hhbm5lbFtqXSk7CisJCQkJcENoYW5MaXN0LT5jaGFuUGFyYW1bbnVtX2NoYW5uZWxdLmRmc1NldCA9IGZhbHNlOworCQkJCW51bV9jaGFubmVsKys7CisJCQl9CisJCX0KKwl9CisKKwltc2cudHlwZSA9IFdNQV9VUERBVEVfQ0hBTl9MSVNUX1JFUTsKKwltc2cucmVzZXJ2ZWQgPSAwOworCW1zZy5ib2R5cHRyID0gcENoYW5MaXN0OworCXBDaGFuTGlzdC0+bnVtQ2hhbiA9IG51bV9jaGFubmVsOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBGYWlsZWQgdG8gcG9zdCBtc2cgdG8gV01BIiwgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUocENoYW5MaXN0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY3NyX3N0YXJ0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdWludDMyX3QgaTsKKworCWRvIHsKKwkJLyogc2F2ZSB0aGUgZ2xvYmFsIGNkcyBjb250ZXh0ICovCisJCXBNYWMtPnJvYW0uZ19jZHNfY29udGV4dCA9IGNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKTsKKwkJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspCisJCQljc3Jfcm9hbV9zdGF0ZV9jaGFuZ2UocE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0lETEUsIGkpOworCisJCXN0YXR1cyA9IGNzcl9yb2FtX3N0YXJ0KHBNYWMpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJYnJlYWs7CisKKwkJcE1hYy0+cm9hbS5zUGVuZGluZ0NvbW1hbmRzID0gMDsKKwkJY3NyX3NjYW5fZW5hYmxlKHBNYWMpOworI2lmICAgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworCQlmb3IgKGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKykKKwkJCXN0YXR1cyA9IGNzcl9uZWlnaGJvcl9yb2FtX2luaXQocE1hYywgaSk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcgKi8KKwkJcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5udW1DbGllbnQgPSAwOworCQlwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLnBlcmlvZGljaXR5ID0gMDsKKwkJcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby50aW1lclJ1bm5pbmcgPSBmYWxzZTsKKwkJLyogaW5pdCB0aGUgbGluayBxdWFsaXR5IGluZGljYXRpb24gYWxzbyAqLworCQlwTWFjLT5yb2FtLnZjY0xpbmtRdWFsaXR5ID0gZUNTUl9ST0FNX0xJTktfUVVBTF9NSU5fSU5EOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkJIiBjc3Jfc3RhcnQ6IENvdWxkbid0IEluaXQgSE8gY29udHJvbCBibGsgIik7CisJCQlicmVhazsKKwkJfQorCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICJTY2FuIG9mZmxvYWQgaXMgZW5hYmxlZCwgdXBkYXRlIGRlZmF1bHQgY2hhbiBsaXN0Iik7CisJCXN0YXR1cyA9IGNzcl91cGRhdGVfY2hhbm5lbF9saXN0KHBNYWMpOworCisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc3RvcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0SGFsU3RvcFR5cGUgc3RvcFR5cGUpCit7CisJdWludDMyX3Qgc2Vzc2lvbklkOworCisJZm9yIChzZXNzaW9uSWQgPSAwOyBzZXNzaW9uSWQgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgc2Vzc2lvbklkKyspIHsKKwkJY3NyX3JvYW1fY2xvc2Vfc2Vzc2lvbihwTWFjLCBzZXNzaW9uSWQsIHRydWUsIE5VTEwsIE5VTEwpOworCX0KKwljc3Jfc2Nhbl9kaXNhYmxlKHBNYWMpOworCXBNYWMtPnNjYW4uZkNhbmNlbElkbGVTY2FuID0gZmFsc2U7CisJcE1hYy0+c2Nhbi5mUmVzdGFydElkbGVTY2FuID0gZmFsc2U7CisJY3NyX2xsX3B1cmdlKCZwTWFjLT5yb2FtLnJvYW1DbWRQZW5kaW5nTGlzdCwgdHJ1ZSk7CisKKyNpZiAgIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKwlmb3IgKHNlc3Npb25JZCA9IDA7IHNlc3Npb25JZCA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBzZXNzaW9uSWQrKykKKwkJY3NyX25laWdoYm9yX3JvYW1fY2xvc2UocE1hYywgc2Vzc2lvbklkKTsKKyNlbmRpZgorCWZvciAoc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IHNlc3Npb25JZCsrKQorCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkKKwkJCWNzcl9zY2FuX2ZsdXNoX3Jlc3VsdChwTWFjKTsKKworCS8qIFJlc2V0IHRoZSBkb21haW4gYmFjayB0byB0aGUgZGVhdWx0ICovCisJcE1hYy0+c2Nhbi5kb21haW5JZEN1cnJlbnQgPSBwTWFjLT5zY2FuLmRvbWFpbklkRGVmYXVsdDsKKworCWZvciAoc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IHNlc3Npb25JZCsrKSB7CisJCWNzcl9yb2FtX3N0YXRlX2NoYW5nZShwTWFjLCBlQ1NSX1JPQU1JTkdfU1RBVEVfU1RPUCwgc2Vzc2lvbklkKTsKKwkJcE1hYy0+cm9hbS5jdXJTdWJTdGF0ZVtzZXNzaW9uSWRdID0gZUNTUl9ST0FNX1NVQlNUQVRFX05PTkU7CisJfQorCisJLyogV2hlbiBIQUwgcmVzZXRzIGFsbCB0aGUgY29udGV4dCBpbmZvcm1hdGlvbgorCSAqIGluIEhBTCBpcyBsb3N0LCBzbyB3ZSBtaWdodCBuZWVkIHRvIHNlbmQgdGhlCisJICogc2NhbiBvZmZsb2FkIHJlcXVlc3QgYWdhaW4gd2hlbiBpdCBjb21lcworCSAqIG91dCBvZiByZXNldCBmb3Igc2NhbiBvZmZsb2FkIHRvIGJlIGZ1bmN0aW9uYWwKKwkgKi8KKwlpZiAoSEFMX1NUT1BfVFlQRV9TWVNfUkVTRVQgPT0gc3RvcFR5cGUpIHsKKwkJYl9yb2FtX3NjYW5fb2ZmbG9hZF9zdGFydGVkID0gZmFsc2U7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBjc3JfcmVhZHkodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkvKiBJZiB0aGUgZ1NjYW5BZ2luZ1RpbWUgaXMgc2V0IHRvICcwJyB0aGVuIHNjYW4gcmVzdWx0cyBhZ2luZyB0aW1lb3V0CisJICAgYmFzZWQgIG9uIHRpbWVyIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQgKi8KKworCWlmICgwICE9IHBNYWMtPnNjYW4uc2NhblJlc3VsdENmZ0FnaW5nVGltZSkgeworCQljc3Jfc2Nhbl9zdGFydF9yZXN1bHRfY2ZnX2FnaW5nX3RpbWVyKHBNYWMpOworCX0KKwlzdGF0dXMgPSBjc3JfYXBwbHlfY2hhbm5lbF9hbmRfcG93ZXJfbGlzdChwTWFjKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJjc3JfYXBwbHlfY2hhbm5lbF9hbmRfcG93ZXJfbGlzdCBmYWlsZWQgZHVyaW5nIGNzcl9yZWFkeSB3aXRoIHN0YXR1cz0lZCIsCisJCQlzdGF0dXMpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGNzcl9zZXRfZGVmYXVsdF9kb3QxMV9tb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDMyX3Qgd25pRG90MTFtb2RlID0gMDsKKwl3bmlEb3QxMW1vZGUgPQorCQljc3JfdHJhbnNsYXRlX3RvX3duaV9jZmdfZG90MTFfbW9kZShwTWFjLAorCQkJCQkJICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSk7CisJY2ZnX3NldF9pbnQocE1hYywgV05JX0NGR19ET1QxMV9NT0RFLCB3bmlEb3QxMW1vZGUpOworfQorCit2b2lkIGNzcl9zZXRfZ2xvYmFsX2NmZ3ModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsCisJCQljc3JfZ2V0X2ZyYWdfdGhyZXNoKHBNYWMpKTsKKwljZmdfc2V0X2ludChwTWFjLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsIGNzcl9nZXRfcnRzX3RocmVzaChwTWFjKSk7CisJY2ZnX3NldF9pbnQocE1hYywgV05JX0NGR18xMURfRU5BQkxFRCwKKwkJCSgocE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExaFN1cHBvcnRFbmFibGVkKSA/IHBNYWMtPnJvYW0uCisJCQkgY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCA6IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uCisJCQkgSXMxMWRTdXBwb3J0RW5hYmxlZCkpOworCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfMTFIX0VOQUJMRUQsCisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFoU3VwcG9ydEVuYWJsZWQpOworCS8qIEZvciBub3cgd2Ugd2lsbCBqdXN0IHVzZSB0aGUgNUdIeiBDQiBtb2RlIGluaSBwYXJhbWV0ZXIgdG8gZGVjaWRlIHdoZXRoZXIgQ0Igc3VwcG9ydGVkIG9yIG5vdCBpbiBQcm9iZXMgd2hlbiB0aGVyZSBpcyBubyBzZXNzaW9uCisJICogT25jZSBzZXNzaW9uIGlzIGVzdGFibGlzaGVkIHdlIHdpbGwgdXNlIHRoZSBzZXNzaW9uIHJlbGF0ZWQgcGFyYW1zIHN0b3JlZCBpbiBQRSBzZXNzaW9uIGZvciBDQiBtb2RlCisJICovCisJY2ZnX3NldF9pbnQocE1hYywgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSwKKwkJCSEhKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlNUdIeikpOworCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQsCisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkhlYXJ0YmVhdFRocmVzaDI0KTsKKworCS8qIFVwZGF0ZSB0aGUgb3BlcmF0aW5nIG1vZGUgdG8gY29uZmlndXJlZCB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24sICovCisJLyogU28gdGhhdCBjbGllbnQgY2FuIGFkdmVydGlzZSBmdWxsIGNhcGFiaWxpdGllcyBpbiBQcm9iZSByZXF1ZXN0IGZyYW1lLiAqLworCWNzcl9zZXRfZGVmYXVsdF9kb3QxMV9tb2RlKHBNYWMpOworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX29wZW4odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl1aW50MzJfdCBpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisJZG8geworCQlmb3IgKGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKykgeworCQkJcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgaSk7CisJCQlwU2Vzc2lvbi0+cm9hbWluZ1RpbWVySW5mby5wTWFjID0gcE1hYzsKKwkJCXBTZXNzaW9uLT5yb2FtaW5nVGltZXJJbmZvLnNlc3Npb25JZCA9CisJCQkJQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKwkJfQorCQlwTWFjLT5yb2FtLldhaXRGb3JLZXlUaW1lckluZm8ucE1hYyA9IHBNYWM7CisJCXBNYWMtPnJvYW0uV2FpdEZvcktleVRpbWVySW5mby5zZXNzaW9uSWQgPQorCQkJQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKwkJc3RhdHVzID0KKwkJCWNkZl9tY190aW1lcl9pbml0KCZwTWFjLT5yb2FtLmhUaW1lcldhaXRGb3JLZXksCisJCQkJCSAgQ0RGX1RJTUVSX1RZUEVfU1csCisJCQkJCSAgY3NyX3JvYW1fd2FpdF9mb3Jfa2V5X3RpbWVfb3V0X2hhbmRsZXIsCisJCQkJCSAgJnBNYWMtPnJvYW0uV2FpdEZvcktleVRpbWVySW5mbyk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTAorCQkJCQkoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIFdhaXRGb3JLZXkgdGltZSBvdXQgdGltZXIiKSk7CisJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPQorCQkJY2RmX21jX3RpbWVyX2luaXQoJnBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8uaFRsU3RhdHNUaW1lciwKKwkJCQkJICBDREZfVElNRVJfVFlQRV9TVywKKwkJCQkJICBjc3Jfcm9hbV90bF9zdGF0c190aW1lcl9oYW5kbGVyLCBwTWFjKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMCisJCQkJCSgiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc3VtbWFyeSBTdGF0aXN0aWNzIHRpbWVyIikpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9jbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQzMl90IHNlc3Npb25JZDsKKwlmb3IgKHNlc3Npb25JZCA9IDA7IHNlc3Npb25JZCA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBzZXNzaW9uSWQrKykgeworCQljc3Jfcm9hbV9jbG9zZV9zZXNzaW9uKHBNYWMsIHNlc3Npb25JZCwgdHJ1ZSwgTlVMTCwgTlVMTCk7CisJfQorCWNkZl9tY190aW1lcl9zdG9wKCZwTWFjLT5yb2FtLmhUaW1lcldhaXRGb3JLZXkpOworCWNkZl9tY190aW1lcl9kZXN0cm95KCZwTWFjLT5yb2FtLmhUaW1lcldhaXRGb3JLZXkpOworCWNkZl9tY190aW1lcl9zdG9wKCZwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLmhUbFN0YXRzVGltZXIpOworCWNkZl9tY190aW1lcl9kZXN0cm95KCZwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLmhUbFN0YXRzVGltZXIpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fc3RhcnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwkodm9pZClwTWFjOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgY3NyX3JvYW1fc3RvcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJY3NyX3JvYW1fc3RvcF9yb2FtaW5nX3RpbWVyKHBNYWMsIHNlc3Npb25JZCk7CisJLyogZGVyZWdpc3RlciB0aGUgY2xpZW50cyByZXF1ZXN0aW5nIHN0YXRzIGZyb20gUEUvVEwgJiBhbHNvIHN0b3AgdGhlIGNvcnJlc3BvbmRpbmcgdGltZXJzICovCisJY3NyX3JvYW1fZGVyZWdfc3RhdGlzdGljc19yZXEocE1hYyk7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fZ2V0X2Nvbm5lY3Rfc3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgIGVDc3JDb25uZWN0U3RhdGUgKnBTdGF0ZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSAmJiAoTlVMTCAhPSBwU3RhdGUpKSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJKnBTdGF0ZSA9IHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGU7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fY29weV9jb25uZWN0X3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCXVpbnQzMl90IHNlc3Npb25JZCwgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXVpbnQzMl90IHNpemUgPSAwOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwl0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKmNvbm5lY3RlZF9wcm9mOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICghcFByb2ZpbGUpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgicHJvZmlsZSBub3QgZm91bmQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYykgeworCQlzaXplID0gcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+bGVuZ3RoICsKKwkJCXNpemVvZihwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5sZW5ndGgpOworCQlpZiAoc2l6ZSkgeworCQkJcFByb2ZpbGUtPnBCc3NEZXNjID0gY2RmX21lbV9tYWxsb2Moc2l6ZSk7CisJCQlpZiAoTlVMTCAhPSBwUHJvZmlsZS0+cEJzc0Rlc2MpIHsKKwkJCQljZGZfbWVtX2NvcHkocFByb2ZpbGUtPnBCc3NEZXNjLAorCQkJCQlwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLAorCQkJCQlzaXplKTsKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBQcm9maWxlLT5wQnNzRGVzYyA9IE5VTEw7CisJCX0KKwkJY29ubmVjdGVkX3Byb2YgPSAmKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKTsKKwkJcFByb2ZpbGUtPkF1dGhUeXBlID0gY29ubmVjdGVkX3Byb2YtPkF1dGhUeXBlOworCQlwUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUgPSBjb25uZWN0ZWRfcHJvZi0+RW5jcnlwdGlvblR5cGU7CisJCXBQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlID0gY29ubmVjdGVkX3Byb2YtPm1jRW5jcnlwdGlvblR5cGU7CisJCXBQcm9maWxlLT5CU1NUeXBlID0gY29ubmVjdGVkX3Byb2YtPkJTU1R5cGU7CisJCXBQcm9maWxlLT5vcGVyYXRpb25DaGFubmVsID0gY29ubmVjdGVkX3Byb2YtPm9wZXJhdGlvbkNoYW5uZWw7CisJCXBQcm9maWxlLT5DQk1vZGUgPSBjb25uZWN0ZWRfcHJvZi0+Q0JNb2RlOworCQljZGZfbWVtX2NvcHkoJnBQcm9maWxlLT5ic3NpZCwgJmNvbm5lY3RlZF9wcm9mLT5ic3NpZCwKKwkJCXNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJCWNkZl9tZW1fY29weSgmcFByb2ZpbGUtPlNTSUQsICZjb25uZWN0ZWRfcHJvZi0+U1NJRCwKKwkJCXNpemVvZih0U2lyTWFjU1NpZCkpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCWlmIChjb25uZWN0ZWRfcHJvZi0+TURJRC5tZGllUHJlc2VudCkgeworCQkJcFByb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQgPSAxOworCQkJcFByb2ZpbGUtPk1ESUQubW9iaWxpdHlEb21haW4gPQorCQkJCWNvbm5lY3RlZF9wcm9mLT5NRElELm1vYmlsaXR5RG9tYWluOworCQl9IGVsc2UgeworCQkJcFByb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQgPSAwOworCQkJcFByb2ZpbGUtPk1ESUQubW9iaWxpdHlEb21haW4gPSAwOworCQl9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCXBQcm9maWxlLT5pc0VTRUFzc29jID0gY29ubmVjdGVkX3Byb2YtPmlzRVNFQXNzb2M7CisJCWlmIChjc3JfaXNfYXV0aF90eXBlX2VzZShjb25uZWN0ZWRfcHJvZi0+QXV0aFR5cGUpKSB7CisJCQljZGZfbWVtX2NvcHkocFByb2ZpbGUtPmVzZUNja21JbmZvLmtyaywKKwkJCQljb25uZWN0ZWRfcHJvZi0+ZXNlQ2NrbUluZm8ua3JrLAorCQkJCVNJUl9LUktfS0VZX0xFTik7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQkJY2RmX21lbV9jb3B5KHBQcm9maWxlLT5lc2VDY2ttSW5mby5idGssCisJCQkJY29ubmVjdGVkX3Byb2YtPmVzZUNja21JbmZvLmJ0aywKKwkJCQlTSVJfQlRLX0tFWV9MRU4pOworI2VuZGlmCisJCQlwUHJvZmlsZS0+ZXNlQ2NrbUluZm8ucmVhc3NvY19yZXFfbnVtID0KKwkJCQljb25uZWN0ZWRfcHJvZi0+ZXNlQ2NrbUluZm8ucmVhc3NvY19yZXFfbnVtOworCQkJcFByb2ZpbGUtPmVzZUNja21JbmZvLmtya19wbHVtYmVkID0KKwkJCQljb25uZWN0ZWRfcHJvZi0+ZXNlQ2NrbUluZm8ua3JrX3BsdW1iZWQ7CisJCX0KKyNlbmRpZgorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX2dldF9jb25uZWN0X3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQl0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBQcm9maWxlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAoKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpKSB8fAorCSAgICAoY3NyX2lzX2Nvbm5fc3RhdGVfaWJzcyhwTWFjLCBzZXNzaW9uSWQpKSkgeworCQlpZiAocFByb2ZpbGUpIHsKKwkJCXN0YXR1cyA9CisJCQkJY3NyX3JvYW1fY29weV9jb25uZWN0X3Byb2ZpbGUocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCSAgICAgIHBQcm9maWxlKTsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX2ZyZWVfY29ubmVjdF9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBQcm9maWxlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKHBQcm9maWxlLT5wQnNzRGVzYykgeworCQljZGZfbWVtX2ZyZWUocFByb2ZpbGUtPnBCc3NEZXNjKTsKKwl9CisJaWYgKHBQcm9maWxlLT5wQWRkSUVBc3NvYykgeworCQljZGZfbWVtX2ZyZWUocFByb2ZpbGUtPnBBZGRJRUFzc29jKTsKKwl9CisJY2RmX21lbV9zZXQocFByb2ZpbGUsIHNpemVvZih0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUpLCAwKTsKKworCXBQcm9maWxlLT5BdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX1VOS05PV047CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIENERl9TVEFUVVMgY3NyX3JvYW1fZnJlZV9jb25uZWN0ZWRfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICAgdENzclJvYW1Db25uZWN0ZWRJbmZvICoKKwkJCQkJICAgICAgIHBDb25uZWN0ZWRJbmZvKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWlmIChwQ29ubmVjdGVkSW5mby0+cGJGcmFtZXMpIHsKKwkJY2RmX21lbV9mcmVlKHBDb25uZWN0ZWRJbmZvLT5wYkZyYW1lcyk7CisJCXBDb25uZWN0ZWRJbmZvLT5wYkZyYW1lcyA9IE5VTEw7CisJfQorCXBDb25uZWN0ZWRJbmZvLT5uQmVhY29uTGVuZ3RoID0gMDsKKwlwQ29ubmVjdGVkSW5mby0+bkFzc29jUmVxTGVuZ3RoID0gMDsKKwlwQ29ubmVjdGVkSW5mby0+bkFzc29jUnNwTGVuZ3RoID0gMDsKKwlwQ29ubmVjdGVkSW5mby0+c3RhSWQgPSAwOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJcENvbm5lY3RlZEluZm8tPm5SSUNSc3BMZW5ndGggPSAwOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXBDb25uZWN0ZWRJbmZvLT5uVHNwZWNJZUxlbmd0aCA9IDA7CisjZW5kaWYKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGNzcl9yZWxlYXNlX2NvbW1hbmRfcHJlYXV0aCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCkKK3sKKwljc3JfcmVpbml0X3ByZWF1dGhfY21kKHBNYWMsIHBDb21tYW5kKTsKKwljc3JfcmVsZWFzZV9jb21tYW5kKHBNYWMsIHBDb21tYW5kKTsKK30KKwordm9pZCBjc3JfcmVsZWFzZV9jb21tYW5kX3JvYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisJY3NyX3JlaW5pdF9yb2FtX2NtZChwTWFjLCBwQ29tbWFuZCk7CisJY3NyX3JlbGVhc2VfY29tbWFuZChwTWFjLCBwQ29tbWFuZCk7Cit9CisKK3ZvaWQgY3NyX3JlbGVhc2VfY29tbWFuZF9zY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCWNkZl9tY190aW1lcl9zdG9wKCZwQ29tbWFuZC0+dS5zY2FuQ21kLmNzcl9zY2FuX3RpbWVyKTsKKwljZGZfbWNfdGltZXJfZGVzdHJveSgmcENvbW1hbmQtPnUuc2NhbkNtZC5jc3Jfc2Nhbl90aW1lcik7CisJY3NyX3JlaW5pdF9zY2FuX2NtZChwTWFjLCBwQ29tbWFuZCk7CisJY3NyX3JlbGVhc2VfY29tbWFuZChwTWFjLCBwQ29tbWFuZCk7Cit9CisKK3ZvaWQgY3NyX3JlbGVhc2VfY29tbWFuZF93bV9zdGF0dXNfY2hhbmdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCWNzcl9yZWluaXRfd21fc3RhdHVzX2NoYW5nZV9jbWQocE1hYywgcENvbW1hbmQpOworCWNzcl9yZWxlYXNlX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworfQorCit2b2lkIGNzcl9yZWluaXRfc2V0X2tleV9jbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisJY2RmX21lbV9zZXQoJnBDb21tYW5kLT51LnNldEtleUNtZCwgc2l6ZW9mKHRTZXRLZXlDbWQpLCAwKTsKK30KKwordm9pZCBjc3JfcmVsZWFzZV9jb21tYW5kX3NldF9rZXkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisJY3NyX3JlaW5pdF9zZXRfa2V5X2NtZChwTWFjLCBwQ29tbWFuZCk7CisJY3NyX3JlbGVhc2VfY29tbWFuZChwTWFjLCBwQ29tbWFuZCk7Cit9CisKKy8qKgorICogY3NyX3JlbGVhc2Vfcm9jX3JlcV9jbWQoKSAtIFJlbGVhc2UgdGhlIGNvbW1hbmQKKyAqIEBtYWNfY3R4OiBHbG9iYWwgTUFDIENvbnRleHQKKyAqCisgKiBSZWxlYXNlIHRoZSByZW1haW4gb24gY2hhbm5lbCByZXF1ZXN0IGNvbW1hbmQgZnJvbSB0aGUgcXVldWUKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjc3JfcmVsZWFzZV9yb2NfcmVxX2NtZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4KQoreworCXRMaXN0RWxlbSAqZW50cnk7CisJdFNtZUNtZCAqY21kID0gTlVMTDsKKworCWVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmbWFjX2N0eC0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQlMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKGVudHJ5KSB7CisJCWNtZCA9IEdFVF9CQVNFX0FERFIoZW50cnksIHRTbWVDbWQsIExpbmspOworCQlpZiAoZVNtZUNvbW1hbmRSZW1haW5PbkNoYW5uZWwgPT0gY21kLT5jb21tYW5kKSB7CisJCQlyZW1haW5PbkNoYW5DYWxsYmFjayBjYWxsYmFjayA9CisJCQkJY21kLT51LnJlbWFpbkNobENtZC5jYWxsYmFjazsKKwkJCS8qIHByb2Nlc3MgdGhlIG1zZyAqLworCQkJaWYgKGNhbGxiYWNrKQorCQkJCWNhbGxiYWNrKG1hY19jdHgsCisJCQkJCWNtZC0+dS5yZW1haW5DaGxDbWQuY2FsbGJhY2tDdHgsIDAsCisJCQkJCWNtZC0+dS5yZW1haW5DaGxDbWQuc2Nhbl9pZCk7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoIlJlbW92ZSBSb0MgUmVxdWVzdCBmcm9tIEFjdGl2ZSBDbWQgTGlzdCIpKTsKKwkJCS8qIFB1dCB0aGlzIGNtZCBiYWNrIG9uIHRoZSBhdmFpbGFibGUgY29tbWFuZCBsaXN0ICovCisJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeSgmbWFjX2N0eC0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQkJCQllbnRyeSwgTExfQUNDRVNTX0xPQ0spKQorCQkJCXNtZV9yZWxlYXNlX2NvbW1hbmQobWFjX2N0eCwgY21kKTsKKwkJfQorCX0KK30KKwordm9pZCBjc3JfYWJvcnRfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwgYm9vbCBmU3RvcHBpbmcpCit7CisKKwlpZiAoZVNtZUNzckNvbW1hbmRNYXNrICYgcENvbW1hbmQtPmNvbW1hbmQpIHsKKwkJc3dpdGNoIChwQ29tbWFuZC0+Y29tbWFuZCkgeworCQljYXNlIGVTbWVDb21tYW5kU2NhbjoKKwkJCS8qIFdlIG5lZWQgdG8gaW5mb3JtIHRoZSByZXF1ZXN0ZXIgYmVmb3JlIGRyb3BwaW5nIHRoZSBzY2FuIGNvbW1hbmQgKi8KKwkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQkiJXM6IERyb3Agc2NhbiByZWFzb24gJWQgY2FsbGJhY2sgJXAiLCBfX2Z1bmNfXywKKwkJCQlwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiwKKwkJCQlwQ29tbWFuZC0+dS5zY2FuQ21kLmNhbGxiYWNrKTsKKwkJCWlmIChOVUxMICE9IHBDb21tYW5kLT51LnNjYW5DbWQuY2FsbGJhY2spIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR1csICIlcyBjYWxsYmFjayBzY2FuIHJlcXVlc3RlciIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQljc3Jfc2Nhbl9jYWxsX2NhbGxiYWNrKHBNYWMsIHBDb21tYW5kLAorCQkJCQkJICAgICAgIGVDU1JfU0NBTl9BQk9SVCk7CisJCQl9CisJCQljc3JfcmVsZWFzZV9jb21tYW5kX3NjYW4ocE1hYywgcENvbW1hbmQpOworCQkJYnJlYWs7CisJCWNhc2UgZVNtZUNvbW1hbmRSb2FtOgorCQkJY3NyX3JlbGVhc2VfY29tbWFuZF9yb2FtKHBNYWMsIHBDb21tYW5kKTsKKwkJCWJyZWFrOworCisJCWNhc2UgZVNtZUNvbW1hbmRXbVN0YXR1c0NoYW5nZToKKwkJCWNzcl9yZWxlYXNlX2NvbW1hbmRfd21fc3RhdHVzX2NoYW5nZShwTWFjLCBwQ29tbWFuZCk7CisJCQlicmVhazsKKworCQljYXNlIGVTbWVDb21tYW5kU2V0S2V5OgorCQkJY3NyX3JlbGVhc2VfY29tbWFuZF9zZXRfa2V5KHBNYWMsIHBDb21tYW5kKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzbXNfbG9nKHBNYWMsIExPR1csICIgQ1NSIGFib3J0IHN0YW5kYXJkIGNvbW1hbmQgJWQiLAorCQkJCXBDb21tYW5kLT5jb21tYW5kKTsKKwkJCWNzcl9yZWxlYXNlX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVDc3JSb2FtU3ViU3RhdGUgTmV3U3Vic3RhdGUsCisJCQkgICAgICB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiQ1NSIFJvYW1TdWJzdGF0ZTogWyAlcyA8PT0gJXMgXSIpLAorCQltYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3ViX3N0YXRlKE5ld1N1YnN0YXRlKSwKKwkJbWFjX3RyYWNlX2dldGNzcl9yb2FtX3N1Yl9zdGF0ZShwTWFjLT5yb2FtLmN1clN1YlN0YXRlW3Nlc3Npb25JZF0pKTsKKwlpZiAocE1hYy0+cm9hbS5jdXJTdWJTdGF0ZVtzZXNzaW9uSWRdID09IE5ld1N1YnN0YXRlKSB7CisJCXJldHVybjsKKwl9CisJcE1hYy0+cm9hbS5jdXJTdWJTdGF0ZVtzZXNzaW9uSWRdID0gTmV3U3Vic3RhdGU7Cit9CisKK2VDc3JSb2FtU3RhdGUgY3NyX3JvYW1fc3RhdGVfY2hhbmdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgIGVDc3JSb2FtU3RhdGUgTmV3Um9hbVN0YXRlLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwllQ3NyUm9hbVN0YXRlIFByZXZpb3VzU3RhdGU7CisKKwlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJDU1IgUm9hbVN0YXRlWyVodV06IFsgJXMgPD09ICVzIF0iKSwgc2Vzc2lvbklkLAorCQltYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3RhdGUoTmV3Um9hbVN0YXRlKSwKKwkJbWFjX3RyYWNlX2dldGNzcl9yb2FtX3N0YXRlKHBNYWMtPnJvYW0uY3VyU3RhdGVbc2Vzc2lvbklkXSkpOworCVByZXZpb3VzU3RhdGUgPSBwTWFjLT5yb2FtLmN1clN0YXRlW3Nlc3Npb25JZF07CisKKwlpZiAoTmV3Um9hbVN0YXRlICE9IHBNYWMtPnJvYW0uY3VyU3RhdGVbc2Vzc2lvbklkXSkgeworCQkvKiBXaGVuZXZlciB3ZSB0cmFuc2l0aW9uIE9VVCBvZiB0aGUgUm9hbWluZyBzdGF0ZSwgY2xlYXIgdGhlIFJvYW1pbmcgc3Vic3RhdGUuLi4gKi8KKwkJaWYgKENTUl9JU19ST0FNX0pPSU5JTkcocE1hYywgc2Vzc2lvbklkKSkgeworCQkJY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9OT05FLAorCQkJCQkJIHNlc3Npb25JZCk7CisJCX0KKworCQlwTWFjLT5yb2FtLmN1clN0YXRlW3Nlc3Npb25JZF0gPSBOZXdSb2FtU3RhdGU7CisJfQorCXJldHVybiBQcmV2aW91c1N0YXRlOworfQorCit2b2lkIGNzcl9hc3NpZ25fcnNzaV9mb3JfY2F0ZWdvcnkodHBBbmlTaXJHbG9iYWwgcE1hYywgaW50OF90IGJlc3RBcFJzc2ksCisJCQkJICB1aW50OF90IGNhdE9mZnNldCkKK3sKKwlpbnQgaTsKKwlpZiAoY2F0T2Zmc2V0KSB7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYkNhdFJzc2lPZmZzZXQgPSBjYXRPZmZzZXQ7CisJCWZvciAoaSA9IDA7IGkgPCBDU1JfTlVNX1JTU0lfQ0FUOyBpKyspIHsKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUlNTSUNhdFtDU1JfTlVNX1JTU0lfQ0FUIC0gaSAtCisJCQkJCQkgICAgICAgMV0gPQorCQkJCShpbnQpYmVzdEFwUnNzaSAtCisJCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uU2VsZWN0NUdIek1hcmdpbiAtCisJCQkJKGludCkoaSAqIGNhdE9mZnNldCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfY29uZmlnX3BhcmFtKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJaW50IGk7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5hZ2luZ0NvdW50ID0gQ1NSX0FHSU5HX0NPVU5UOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPQorCQlXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGU1R0h6ID0KKwkJV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9FTkFCTEU7CisKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfQVVUTzsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVCYW5kID0gZUNTUl9CQU5EX0FMTDsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnVDZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFX0FVVE87CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5GcmFnbWVudGF0aW9uVGhyZXNob2xkID0KKwkJZUNTUl9ET1QxMV9GUkFHX1RIUkVTSF9ERUZBVUxUOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSGVhcnRiZWF0VGhyZXNoMjQgPSA0MDsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkhlYXJ0YmVhdFRocmVzaDUwID0gNDA7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkID0gZmFsc2U7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkT3JpZ2luYWwgPSBmYWxzZTsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFlU3VwcG9ydEVuYWJsZWQgPSB0cnVlOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWhTdXBwb3J0RW5hYmxlZCA9IHRydWU7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5SVFNUaHJlc2hvbGQgPSAyMzQ2OworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2hvcnRTbG90VGltZSA9IHRydWU7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5XTU1TdXBwb3J0TW9kZSA9IGVDc3JSb2FtV21tQXV0bzsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlByb3ByaWV0YXJ5UmF0ZXNFbmFibGVkID0gdHJ1ZTsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlR4UmF0ZSA9IGVDU1JfVFhfUkFURV9BVVRPOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2NhbkFnZVRpbWVOQ05QUyA9CisJCUNTUl9TQ0FOX0FHSU5HX1RJTUVfTk9UX0NPTk5FQ1RfTk9fUFM7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zY2FuQWdlVGltZU5DUFMgPQorCQlDU1JfU0NBTl9BR0lOR19USU1FX05PVF9DT05ORUNUX1dfUFM7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zY2FuQWdlVGltZUNOUFMgPQorCQlDU1JfU0NBTl9BR0lOR19USU1FX0NPTk5FQ1RfTk9fUFM7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zY2FuQWdlVGltZUNQUyA9CisJCUNTUl9TQ0FOX0FHSU5HX1RJTUVfQ09OTkVDVF9XX1BTOworCWZvciAoaSA9IDA7IGkgPCBDU1JfTlVNX1JTU0lfQ0FUOyBpKyspIHsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5Cc3NQcmVmZXJWYWx1ZVtpXSA9IGk7CisJfQorCWNzcl9hc3NpZ25fcnNzaV9mb3JfY2F0ZWdvcnkocE1hYywgQ1NSX0JFU1RfUlNTSV9WQUxVRSwKKwkJCQkgICAgIENTUl9ERUZBVUxUX1JTU0lfREJfR0FQKTsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtaW5nVGltZSA9IENTUl9ERUZBVUxUX1JPQU1JTkdfVElNRTsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eSA9IGZhbHNlOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1heENoblRpbWUgPSBDU1JfQUNUSVZFX01BWF9DSEFOTkVMX1RJTUU7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWluQ2huVGltZSA9IENTUl9BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRTsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5QYXNzaXZlTWF4Q2huVGltZSA9CisJCUNTUl9QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUU7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1pbkNoblRpbWUgPQorCQlDU1JfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FOworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWF4Q2huVGltZUNvbmMgPQorCQlDU1JfQUNUSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQzsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNaW5DaG5UaW1lQ29uYyA9CisJCUNTUl9BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNYXhDaG5UaW1lQ29uYyA9CisJCUNTUl9QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQzsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5QYXNzaXZlTWluQ2huVGltZUNvbmMgPQorCQlDU1JfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX0NPTkM7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUmVzdFRpbWVDb25jID0gQ1NSX1JFU1RfVElNRV9DT05DOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubk51bVN0YUNoYW5Db21iaW5lZENvbmMgPQorCQlDU1JfTlVNX1NUQV9DSEFOX0NPTUJJTkVEX0NPTkM7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uTnVtUDJQQ2hhbkNvbWJpbmVkQ29uYyA9CisJCUNTUl9OVU1fUDJQX0NIQU5fQ09NQklORURfQ09OQzsKKyNlbmRpZgorCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublR4UG93ZXJDYXAgPSBDU1JfTUFYX1RYX1BPV0VSOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc3RhdHNSZXFQZXJpb2RpY2l0eSA9CisJCUNTUl9NSU5fR0xPQkFMX1NUQVRfUVVFUllfUEVSSU9EOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc3RhdHNSZXFQZXJpb2RpY2l0eUluUFMgPQorCQlDU1JfTUlOX0dMT0JBTF9TVEFUX1FVRVJZX1BFUklPRF9JTl9CTVBTOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jc3IxMXJDb25maWcuSXNGVFJlc291cmNlUmVxU3VwcG9ydGVkID0gMDsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubk1heE5laWdoYm9yUmV0cmllcyA9IDM7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZCA9CisJCTEyMDsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmYgPQorCQkzMDsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uUm9hbVJlc2NhblJzc2lEaWZmID0gNTsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JTY2FuTWluQ2hhblRpbWUgPSAyMDsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWUgPSA0MDsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JTY2FuVGltZXJQZXJpb2QgPQorCQkyMDA7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubmVpZ2hib3JTY2FuQ2hhbkxpc3QuCisJbnVtQ2hhbm5lbHMgPSAzOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5laWdoYm9yU2NhbkNoYW5MaXN0LgorCWNoYW5uZWxMaXN0WzBdID0gMTsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uZWlnaGJvclNjYW5DaGFuTGlzdC4KKwljaGFubmVsTGlzdFsxXSA9IDY7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubmVpZ2hib3JTY2FuQ2hhbkxpc3QuCisJY2hhbm5lbExpc3RbMl0gPSAxMTsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZCA9IDIwMDAwOyAgICAgICAgLyogMjAgc2Vjb25kcyAqLworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5FbXB0eVNjYW5SZWZyZXNoUGVyaW9kID0gMDsKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uUm9hbUJtaXNzRmlyc3RCY250ID0gMTA7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcublJvYW1CbWlzc0ZpbmFsQmNudCA9IDEwOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5Sb2FtQmVhY29uUnNzaVdlaWdodCA9IDE0OworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5WaHRDaGFubmVsV2lkdGggPQorCQlXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzgwTUhaICsgMTsKKyNlbmRpZgorCisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5hZGRUU1doZW5BQ01Jc09mZiA9IDA7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mU2NhblR3aWNlID0gZmFsc2U7CisKKwkvKiBSZW1vdmUgdGhpcyBjb2RlIG9uY2UgU0xNX1Nlc3Npb25pemF0aW9uIGlzIHN1cHBvcnRlZCAqLworCS8qIEJNUFNfV09SS0FST1VORF9OT1RfTkVFREVEICovCisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5kb0JNUFNXb3JrYXJvdW5kID0gMDsKKworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubkluaXRpYWxEd2VsbFRpbWUgPSAwOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaW5pdGlhbF9zY2FuX25vX2Rmc19jaG5sID0gMDsKK30KKworZUNzckJhbmQgY3NyX2dldF9jdXJyZW50X2JhbmQodEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5iYW5kQ2FwYWJpbGl0eTsKK30KKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKy8qCisgICBUaGlzIGZ1bmN0aW9uIGZsdXNoZXMgdGhlIHJvYW0gc2NhbiBjYWNoZQorICovCitDREZfU1RBVFVTIGNzcl9mbHVzaF9yb2FtX3NjYW5fcm9hbV9jaGFubmVsX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSB1aW50OF90IHNlc3Npb25JZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvCisJCT0gJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCS8qIEZyZWUgdXAgdGhlIG1lbW9yeSBmaXJzdCAoaWYgcmVxdWlyZWQpICovCisJaWYgKE5VTEwgIT0KKwkgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLgorCSAgICBDaGFubmVsTGlzdCkgeworCQljZGZfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby4KKwkJCSAgICAgY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdCk7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby4KKwkJQ2hhbm5lbExpc3QgPSBOVUxMOworCQlwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uCisJCW51bU9mQ2hhbm5lbHMgPSAwOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorLyoKKyAgIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyB0aGUgcm9hbSBzY2FuIGNhY2hlCisgKi8KK0NERl9TVEFUVVMgY3NyX2ZsdXNoX2NmZ19iZ19zY2FuX3JvYW1fY2hhbm5lbF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICB1aW50OF90IHNlc3Npb25JZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0KKwkJJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCisJLyogRnJlZSB1cCB0aGUgbWVtb3J5IGZpcnN0IChpZiByZXF1aXJlZCkgKi8KKwlpZiAoTlVMTCAhPSBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSB7CisJCWNkZl9tZW1fZnJlZShwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLgorCQkJICAgICBDaGFubmVsTGlzdCk7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgVGhpcyBmdW5jdGlvbiBmbHVzaGVzIHRoZSByb2FtIHNjYW4gY2FjaGUgYW5kIGNyZWF0ZXMgZnJlc2ggY2FjaGUKKyAgIGJhc2VkIG9uIHRoZSBpbnB1dCBjaGFubmVsIGxpc3QKKyAqLworQ0RGX1NUQVRVUyBjc3JfY3JlYXRlX2JnX3NjYW5fcm9hbV9jaGFubmVsX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCXVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkJY29uc3QgdWludDhfdCAqcENoYW5uZWxMaXN0LAorCQkJCQkJY29uc3QgdWludDhfdCBudW1DaGFubmVscykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0KKwkJJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCisJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gbnVtQ2hhbm5lbHM7CisKKwlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0KKwkJY2RmX21lbV9tYWxsb2MocE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby4KKwkJCSAgICAgICBudW1PZkNoYW5uZWxzKTsKKworCWlmIChOVUxMID09IHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIk1lbW9yeSBBbGxvY2F0aW9uIGZvciBDRkcgQ2hhbm5lbCBMaXN0IGZhaWxlZCIpKTsKKwkJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIHJvYW0gZ2xvYmFsIHN0cnVjdHVyZSAqLworCWNkZl9tZW1fY29weShwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LAorCQkgICAgIHBDaGFubmVsTGlzdCwKKwkJICAgICBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorLyoKKyAqIFRoaXMgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIHJvYW0gc2NhbiBjaGFubmVsIGxpc3QgYXMgcGVyIEFQIG5laWdoYm9yCisgKiByZXBvcnQ7IEFQIG5laWdoYm9yIHJlcG9ydCBtYXkgYmUgZW1wdHkgb3IgbWF5IGluY2x1ZGUgb25seSBvdGhlciBBUAorICogY2hhbm5lbHM7IGluIGFueSBjYXNlLCB3ZSBtZXJnZSB0aGUgY2hhbm5lbCBsaXN0IHdpdGggdGhlIGxlYXJuZWQgb2NjdXBpZWQKKyAqIGNoYW5uZWxzIGxpc3QuCisgKiBpZiB0aGUgYmFuZCBpcyAyLjRHLCB0aGVuIG1ha2Ugc3VyZSBjaGFubmVsIGxpc3QgY29udGFpbnMgb25seSAyLjRHCisgKiB2YWxpZCBjaGFubmVscyBpZiB0aGUgYmFuZCBpcyA1RywgdGhlbiBtYWtlIHN1cmUgY2hhbm5lbCBsaXN0IGNvbnRhaW5zCisgKiBvbmx5IDVHIHZhbGlkIGNoYW5uZWxzCisgKi8KK0NERl9TVEFUVVMgY3NyX2NyZWF0ZV9yb2FtX3NjYW5fY2hhbm5lbF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgdWludDhfdCAqcENoYW5uZWxMaXN0LAorCQkJCQkgICAgIHVpbnQ4X3QgbnVtQ2hhbm5lbHMsCisJCQkJCSAgICAgY29uc3QgZUNzckJhbmQgZUJhbmQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbworCQk9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKwl1aW50OF90IG91dE51bUNoYW5uZWxzID0gMDsKKwl1aW50OF90IGluTnVtQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKKwl1aW50OF90ICppblB0ciA9IHBDaGFubmVsTGlzdDsKKwl1aW50OF90IGkgPSAwOworCXVpbnQ4X3QgQ2hhbm5lbExpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXSA9IHsgMCB9OworCXVpbnQ4X3QgdG1wQ2hhbm5lbExpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXSA9IHsgMCB9OworCXVpbnQ4X3QgbWVyZ2VkT3V0cHV0TnVtT2ZDaGFubmVscyA9IDA7CisJdHBDc3JDaGFubmVsSW5mbyBjdXJyQ2hhbm5lbExpc3RJbmZvCisJCT0gJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mbzsKKwkvKgorCSAqIENyZWF0ZSBhIFVuaW9uIG9mIG9jY3VwaWVkIGNoYW5uZWwgbGlzdCBsZWFybnQgYnkgdGhlIERVVCBhbG9uZworCSAqIHdpdGggdGhlIE5laWdoYm9yIHJlcG9ydCBDaGFubmVscy4gVGhpcyBpbmNyZWFzZXMgdGhlIGNoYW5jZXMgb2YKKwkgKiB0aGUgRFVUIHRvIGdldCBhIGNhbmRpZGF0ZSBBUCB3aGlsZSByb2FtaW5nIGV2ZW4gaWYgdGhlIE5laWdoYm9yCisJICogUmVwb3J0IGlzIG5vdCBhYmxlIHRvIHByb3ZpZGUgc3VmZmljaWVudCBpbmZvcm1hdGlvbi4KKwkgKi8KKwlpZiAocE1hYy0+c2Nhbi5vY2N1cGllZENoYW5uZWxzW3Nlc3Npb25JZF0ubnVtQ2hhbm5lbHMpIHsKKwkJY3NyX25laWdoYm9yX3JvYW1fbWVyZ2VfY2hhbm5lbF9saXN0cyhwTWFjLAorCQkJCQkJICAgICAgJnBNYWMtPnNjYW4uCisJCQkJCQkgICAgICBvY2N1cGllZENoYW5uZWxzW3Nlc3Npb25JZF0uCisJCQkJCQkgICAgICBjaGFubmVsTGlzdFswXSwKKwkJCQkJCSAgICAgIHBNYWMtPnNjYW4uCisJCQkJCQkgICAgICBvY2N1cGllZENoYW5uZWxzW3Nlc3Npb25JZF0uCisJCQkJCQkgICAgICBudW1DaGFubmVscywgaW5QdHIsCisJCQkJCQkgICAgICBpbk51bUNoYW5uZWxzLAorCQkJCQkJICAgICAgJm1lcmdlZE91dHB1dE51bU9mQ2hhbm5lbHMpOworCQlpbk51bUNoYW5uZWxzID0gbWVyZ2VkT3V0cHV0TnVtT2ZDaGFubmVsczsKKwl9CisJaWYgKGVDU1JfQkFORF8yNCA9PSBlQmFuZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgaW5OdW1DaGFubmVsczsgaSsrKSB7CisJCQlpZiAoQ0RTX0lTX0NIQU5ORUxfMjRHSFooaW5QdHJbaV0pCisJCQkgICAgJiYgY3NyX3JvYW1faXNfY2hhbm5lbF92YWxpZChwTWFjLCBpblB0cltpXSkpIHsKKwkJCQlDaGFubmVsTGlzdFtvdXROdW1DaGFubmVscysrXSA9IGluUHRyW2ldOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChlQ1NSX0JBTkRfNUcgPT0gZUJhbmQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGluTnVtQ2hhbm5lbHM7IGkrKykgeworCQkJLyogQWRkIDVHIE5vbi1ERlMgY2hhbm5lbCAqLworCQkJaWYgKENEU19JU19DSEFOTkVMXzVHSFooaW5QdHJbaV0pICYmCisJCQkgICAgY3NyX3JvYW1faXNfY2hhbm5lbF92YWxpZChwTWFjLCBpblB0cltpXSkgJiYKKwkJCSAgICAhQ0RTX0lTX0RGU19DSChpblB0cltpXSkpIHsKKwkJCQlDaGFubmVsTGlzdFtvdXROdW1DaGFubmVscysrXSA9IGluUHRyW2ldOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChlQ1NSX0JBTkRfQUxMID09IGVCYW5kKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbk51bUNoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChjc3Jfcm9hbV9pc19jaGFubmVsX3ZhbGlkKHBNYWMsIGluUHRyW2ldKSAmJgorCQkJICAgICFDRFNfSVNfREZTX0NIKGluUHRyW2ldKSkgeworCQkJCUNoYW5uZWxMaXN0W291dE51bUNoYW5uZWxzKytdID0gaW5QdHJbaV07CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICAiSW52YWxpZCBiYW5kLCBObyBvcGVyYXRpb24gY2FycmllZCBvdXQgKEJhbmQgJWQpIiwKKwkJCSAgZUJhbmQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKwkvKgorCSAqIGlmIHJvYW1pbmcgd2l0aGluIGJhbmQgaXMgZW5hYmxlZCwgdGhlbiBzZWxlY3Qgb25seSB0aGUKKwkgKiBpbiBiYW5kIGNoYW5uZWxzIC4KKwkgKiBUaGlzIGlzIHJlcXVpcmVkIG9ubHkgaWYgdGhlIGJhbmQgY2FwYWJpbGl0eSBpcyBzZXQgdG8gQUxMLAorCSAqIEUuZy4sIGlmIGJhbmQgY2FwYWJpbGl0eSBpcyBvbmx5IDIuNEcgdGhlbiBhbGwgdGhlIGNoYW5uZWxzIGluIHRoZQorCSAqIGxpc3QgYXJlIGFscmVhZHkgZmlsdGVyZWQgZm9yIDIuNEcgY2hhbm5lbHMsIGhlbmNlIGlnbm9yZSB0aGlzIGNoZWNrCisJICovCisJaWYgKChlQ1NSX0JBTkRfQUxMID09IGVCYW5kKSAmJiBDU1JfSVNfUk9BTV9JTlRSQV9CQU5EX0VOQUJMRUQocE1hYykpIHsKKwkJY3NyX25laWdoYm9yX3JvYW1fY2hhbm5lbHNfZmlsdGVyX2J5X2N1cnJlbnRfYmFuZChwTWFjLAorCQkJCQkJCQkgIHNlc3Npb25JZCwKKwkJCQkJCQkJICBDaGFubmVsTGlzdCwKKwkJCQkJCQkJICBvdXROdW1DaGFubmVscywKKwkJCQkJCQkJICB0bXBDaGFubmVsTGlzdCwKKwkJCQkJCQkJICAmb3V0TnVtQ2hhbm5lbHMpOworCQljZGZfbWVtX2NvcHkoQ2hhbm5lbExpc3QsIHRtcENoYW5uZWxMaXN0LCBvdXROdW1DaGFubmVscyk7CisJfQorCS8qIFByZXBhcmUgZmluYWwgcm9hbSBzY2FuIGNoYW5uZWwgbGlzdCAqLworCWlmIChvdXROdW1DaGFubmVscykgeworCQkvKiBDbGVhciB0aGUgY2hhbm5lbCBsaXN0IGZpcnN0ICovCisJCWlmIChOVUxMICE9IGN1cnJDaGFubmVsTGlzdEluZm8tPkNoYW5uZWxMaXN0KSB7CisJCQljZGZfbWVtX2ZyZWUoY3VyckNoYW5uZWxMaXN0SW5mby0+Q2hhbm5lbExpc3QpOworCQkJY3VyckNoYW5uZWxMaXN0SW5mby0+Q2hhbm5lbExpc3QgPSBOVUxMOworCQkJY3VyckNoYW5uZWxMaXN0SW5mby0+bnVtT2ZDaGFubmVscyA9IDA7CisJCX0KKwkJY3VyckNoYW5uZWxMaXN0SW5mby0+Q2hhbm5lbExpc3QKKwkJCT0gY2RmX21lbV9tYWxsb2Mob3V0TnVtQ2hhbm5lbHMgKiBzaXplb2YodWludDhfdCkpOworCQlpZiAoTlVMTCA9PSBjdXJyQ2hhbm5lbExpc3RJbmZvLT5DaGFubmVsTGlzdCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igcm9hbSBzY2FuIGNoYW5uZWwgbGlzdCIpOworCQkJY3VyckNoYW5uZWxMaXN0SW5mby0+bnVtT2ZDaGFubmVscyA9IDA7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisJCWNkZl9tZW1fY29weShjdXJyQ2hhbm5lbExpc3RJbmZvLT5DaGFubmVsTGlzdCwKKwkJCSAgICAgQ2hhbm5lbExpc3QsIG91dE51bUNoYW5uZWxzKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisKK0NERl9TVEFUVVMgY3NyX3NldF9iYW5kKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsIGVDc3JCYW5kIGVCYW5kKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlpZiAoQ1NSX0lTX1BIWV9NT0RFX0FfT05MWShwTWFjKSAmJiAoZUJhbmQgPT0gZUNTUl9CQU5EXzI0KSkgeworCQkvKiBET1QxMSBtb2RlIGNvbmZpZ3VyZWQgdG8gMTFhIG9ubHkgYW5kIHJlY2VpdmVkCisJCSAgIHJlcXVlc3QgdG8gY2hhbmdlIHRoZSBiYW5kIHRvIDIuNCBHSHogKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJmYWlsZWQgdG8gc2V0IGJhbmQgY2ZnODAyMTEgPSAldSwgYmFuZCA9ICV1IiwKKwkJCSAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS51Q2ZnRG90MTFNb2RlLCBlQmFuZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCWlmICgoQ1NSX0lTX1BIWV9NT0RFX0JfT05MWShwTWFjKSB8fAorCSAgICAgQ1NSX0lTX1BIWV9NT0RFX0dfT05MWShwTWFjKSkgJiYgKGVCYW5kID09IGVDU1JfQkFORF81RykpIHsKKwkJLyogRE9UMTEgbW9kZSBjb25maWd1cmVkIHRvIDExYi8xMWcgb25seSBhbmQgcmVjZWl2ZWQKKwkJICAgcmVxdWVzdCB0byBjaGFuZ2UgdGhlIGJhbmQgdG8gNSBHSHogKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJmYWlsZWQgdG8gc2V0IGJhbmQgZG90MTFtb2RlID0gJXUsIGJhbmQgPSAldSIsCisJCQkgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSwgZUJhbmQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICJCYW5kIGNoYW5nZWQgdG8gJXUgKDAgLSBBTEwsIDEgLSAyLjQgR0haLCAyIC0gNUdIWikiLCBlQmFuZCk7CisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lQmFuZCA9IGVCYW5kOworCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYmFuZENhcGFiaWxpdHkgPSBlQmFuZDsKKworCXN0YXR1cyA9IGNzcl9nZXRfY2hhbm5lbF9hbmRfcG93ZXJfbGlzdChwTWFjKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykKKwkJY3NyX2FwcGx5X2NoYW5uZWxfYW5kX3Bvd2VyX2xpc3QocE1hYyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogVGhlIGZ1bmNucyBjc3JfY29udmVydF9jYl9pbmlfdmFsdWVfdG9fcGh5X2NiX3N0YXRlIGFuZCBjc3JfY29udmVydF9waHlfY2Jfc3RhdGVfdG9faW5pX3ZhbHVlIGhhdmUgYmVlbgorICogaW50cm9kdWNlZCB0byBjb252ZXJ0IHRoZSBpbmkgdmFsdWUgdG8gdGhlIEVOVU0gdXNlZCBpbiBjc3IgYW5kIE1BQyBmb3IgQ0Igc3RhdGUKKyAqIElkZWFsbHkgd2Ugc2hvdWxkIGhhdmUga2VwdCB0aGUgaW5pIHZhbHVlIGFuZCBlbnVtIHZhbHVlIHNhbWUgYW5kIHJlcHJlc2VudGluZyB0aGUgc2FtZQorICogY2IgdmFsdWVzIGFzIGluIDExbiBzdGFuZGFyZCBpLmUuCisgKiBTZXQgdG8gMSAoU0NBKSBpZiB0aGUgc2Vjb25kYXJ5IGNoYW5uZWwgaXMgYWJvdmUgdGhlIHByaW1hcnkgY2hhbm5lbAorICogU2V0IHRvIDMgKFNDQikgaWYgdGhlIHNlY29uZGFyeSBjaGFubmVsIGlzIGJlbG93IHRoZSBwcmltYXJ5IGNoYW5uZWwKKyAqIFNldCB0byAwIChTQ04pIGlmIG5vIHNlY29uZGFyeSBjaGFubmVsIGlzIHByZXNlbnQKKyAqIEhvd2V2ZXIsIHNpbmNlIG91ciBkcml2ZXIgaXMgYWxyZWFkeSBkaXN0cmlidXRlZCB3ZSB3aWxsIGtlZXAgdGhlIGluaSBkZWZpbml0aW9uIGFzIGl0IGlzIHdoaWNoIGlzOgorICogMCAtIHNlY29uZGFyeSBub25lCisgKiAxIC0gc2Vjb25kYXJ5IExPVworICogMiAtIHNlY29uZGFyeSBISUdICisgKiBhbmQgY29udmVydCB0byBlbnVtIHZhbHVlIHVzZWQgd2l0aGluIHRoZSBkcml2ZXIgaW4gY3NyX2NoYW5nZV9kZWZhdWx0X2NvbmZpZ19wYXJhbSB1c2luZyB0aGlzIGZ1bmNuCisgKiBUaGUgZW51bSB2YWx1ZXMgYXJlIGFzIGZvbGxvd3M6CisgKiBQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQgICAgICAgICAgPSAwCisgKiBQSFlfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlkgICA9IDEKKyAqIFBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlkgID0gMworICovCitlUGh5Q2hhbkJvbmRTdGF0ZSBjc3JfY29udmVydF9jYl9pbmlfdmFsdWVfdG9fcGh5X2NiX3N0YXRlKHVpbnQzMl90IGNiSW5pVmFsdWUpCit7CisKKwllUGh5Q2hhbkJvbmRTdGF0ZSBwaHlDYlN0YXRlOworCXN3aXRjaCAoY2JJbmlWYWx1ZSkgeworCS8qIHNlY29uZGFyeSBub25lICovCisJY2FzZSBlQ1NSX0lOSV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDoKKwkJcGh5Q2JTdGF0ZSA9IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKwkJYnJlYWs7CisJLyogc2Vjb25kYXJ5IExPVyAqLworCWNhc2UgZUNTUl9JTklfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOgorCQlwaHlDYlN0YXRlID0gUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWTsKKwkJYnJlYWs7CisJLyogc2Vjb25kYXJ5IEhJR0ggKi8KKwljYXNlIGVDU1JfSU5JX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZOgorCQlwaHlDYlN0YXRlID0gUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZOworCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWNhc2UgZUNTUl9JTklfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0NFTlRFUkVEOgorCQlwaHlDYlN0YXRlID0gUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9DRU5URVJFRDsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0lOSV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9DRU5URVJFRF80ME1IWl9DRU5URVJFRDoKKwkJcGh5Q2JTdGF0ZSA9CisJCQlQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfQ0VOVEVSRURfNDBNSFpfQ0VOVEVSRUQ7CisJCWJyZWFrOworCWNhc2UgZUNTUl9JTklfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9DRU5URVJFRDoKKwkJcGh5Q2JTdGF0ZSA9IFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0NFTlRFUkVEOworCQlicmVhazsKKwljYXNlIGVDU1JfSU5JX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9MT1c6CisJCXBoeUNiU3RhdGUgPSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0xPVzsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0lOSV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0xPVzoKKwkJcGh5Q2JTdGF0ZSA9IFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0xPVzsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0lOSV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfSElHSDoKKwkJcGh5Q2JTdGF0ZSA9IFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfSElHSDsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0lOSV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0hJR0g6CisJCXBoeUNiU3RhdGUgPSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9ISUdIOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCS8qIElmIGFuIGludmFsaWQgdmFsdWUgaXMgcGFzc2VkLCBkaXNhYmxlIENIQU5ORUwgQk9ORElORyAqLworCQlwaHlDYlN0YXRlID0gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCQlicmVhazsKKwl9CisJcmV0dXJuIHBoeUNiU3RhdGU7Cit9CisKK3VpbnQzMl90IGNzcl9jb252ZXJ0X3BoeV9jYl9zdGF0ZV90b19pbmlfdmFsdWUoZVBoeUNoYW5Cb25kU3RhdGUgcGh5Q2JTdGF0ZSkKK3sKKworCXVpbnQzMl90IGNiSW5pVmFsdWU7CisJc3dpdGNoIChwaHlDYlN0YXRlKSB7CisJLyogc2Vjb25kYXJ5IG5vbmUgKi8KKwljYXNlIFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDoKKwkJY2JJbmlWYWx1ZSA9IGVDU1JfSU5JX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCQlicmVhazsKKwkvKiBzZWNvbmRhcnkgTE9XICovCisJY2FzZSBQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOgorCQljYkluaVZhbHVlID0gZUNTUl9JTklfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOworCQlicmVhazsKKwkvKiBzZWNvbmRhcnkgSElHSCAqLworCWNhc2UgUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZOgorCQljYkluaVZhbHVlID0gZUNTUl9JTklfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlk7CisJCWJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0NFTlRFUkVEOgorCQljYkluaVZhbHVlID0KKwkJCWVDU1JfSU5JX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9DRU5URVJFRDsKKwkJYnJlYWs7CisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfQ0VOVEVSRURfNDBNSFpfQ0VOVEVSRUQ6CisJCWNiSW5pVmFsdWUgPQorCQkJZUNTUl9JTklfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfQ0VOVEVSRURfNDBNSFpfQ0VOVEVSRUQ7CisJCWJyZWFrOworCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfQ0VOVEVSRUQ6CisJCWNiSW5pVmFsdWUgPQorCQkJZUNTUl9JTklfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9DRU5URVJFRDsKKwkJYnJlYWs7CisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0xPVzoKKwkJY2JJbmlWYWx1ZSA9IGVDU1JfSU5JX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9MT1c7CisJCWJyZWFrOworCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfTE9XOgorCQljYkluaVZhbHVlID0gZUNTUl9JTklfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9MT1c7CisJCWJyZWFrOworCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9ISUdIOgorCQljYkluaVZhbHVlID0gZUNTUl9JTklfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0hJR0g7CisJCWJyZWFrOworCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfSElHSDoKKwkJY2JJbmlWYWx1ZSA9IGVDU1JfSU5JX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfSElHSDsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQkvKiByZXR1cm4gc29tZSBpbnZhbGlkIHZhbHVlICovCisJCWNiSW5pVmFsdWUgPSBlQ1NSX0lOSV9DSEFOTkVMX0JPTkRJTkdfU1RBVEVfTUFYOworCQlicmVhazsKKwl9CisJcmV0dXJuIGNiSW5pVmFsdWU7Cit9CisKK0NERl9TVEFUVVMgY3NyX2NoYW5nZV9kZWZhdWx0X2NvbmZpZ19wYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICB0Q3NyQ29uZmlnUGFyYW0gKnBQYXJhbSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWlmIChwUGFyYW0pIHsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5XTU1TdXBwb3J0TW9kZSA9IHBQYXJhbS0+V01NU3VwcG9ydE1vZGU7CisJCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfV01FX0VOQUJMRUQsCisJCQkocFBhcmFtLT5XTU1TdXBwb3J0TW9kZSA9PSBlQ3NyUm9hbVdtbU5vUW9zKSA/IDAgOiAxKTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZVN1cHBvcnRFbmFibGVkID0KKwkJCXBQYXJhbS0+SXMxMWVTdXBwb3J0RW5hYmxlZDsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5GcmFnbWVudGF0aW9uVGhyZXNob2xkID0KKwkJCXBQYXJhbS0+RnJhZ21lbnRhdGlvblRocmVzaG9sZDsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkID0KKwkJCXBQYXJhbS0+SXMxMWRTdXBwb3J0RW5hYmxlZDsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkT3JpZ2luYWwgPQorCQkJcFBhcmFtLT5JczExZFN1cHBvcnRFbmFibGVkOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFoU3VwcG9ydEVuYWJsZWQgPQorCQkJcFBhcmFtLT5JczExaFN1cHBvcnRFbmFibGVkOworCisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZmVuYWJsZU1DQ01vZGUgPSBwUGFyYW0tPmZFbmFibGVNQ0NNb2RlOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm1jY19ydHNfY3RzX3Byb3RfZW5hYmxlID0KKwkJCQkJCXBQYXJhbS0+bWNjX3J0c19jdHNfcHJvdF9lbmFibGU7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubWNjX2JjYXN0X3Byb2JfcmVzcF9lbmFibGUgPQorCQkJCQlwUGFyYW0tPm1jY19iY2FzdF9wcm9iX3Jlc3BfZW5hYmxlOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZBbGxvd01DQ0dPRGlmZkJJID0KKwkJCXBQYXJhbS0+ZkFsbG93TUNDR09EaWZmQkk7CisKKwkJLyogY2hhbm5lbEJvbmRpbmdNb2RlNUdIeiBwbGF5cyBhIGR1YWwgcm9sZSByaWdodCBub3cKKwkJICogSU5GUkEgU1RBIHdpbGwgdXNlIHRoaXMgbm9uIHplcm8gdmFsdWUgYXMgQ0IgZW5hYmxlZCBhbmQgU09GVEFQIHdpbGwgdXNlIHRoaXMgbm9uLXplcm8gdmFsdWUgdG8gZGV0ZXJtaW5lIHRoZSBzZWNvbmRhcnkgY2hhbm5lbCBvZmZzZXQKKwkJICogVGhpcyBpcyBob3cgY2hhbm5lbEJvbmRpbmdNb2RlNUdIeiB3b3JrcyBub3cgYW5kIHRoaXMgaXMga2VwdCBpbnRhY3QgdG8gYXZvaWQgYW55IGNmZy5pbmkgY2hhbmdlCisJCSAqLworCQlpZiAocFBhcmFtLT5jaGFubmVsQm9uZGluZ01vZGUyNEdIeiA+IE1BWF9DQl9WQUxVRV9JTl9JTkkpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQkiSW52YWxpZCBDQiB2YWx1ZSBmcm9tIGluaSBpbiAyLjRHSHogYmFuZCAlZCwgQ0IgRElTQUJMRUQiLAorCQkJCXBQYXJhbS0+Y2hhbm5lbEJvbmRpbmdNb2RlMjRHSHopOworCQl9CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPQorCQkJY3NyX2NvbnZlcnRfY2JfaW5pX3ZhbHVlX3RvX3BoeV9jYl9zdGF0ZShwUGFyYW0tPgorCQkJCQkJCQkgY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHopOworCQlpZiAocFBhcmFtLT5jaGFubmVsQm9uZGluZ01vZGU1R0h6ID4gTUFYX0NCX1ZBTFVFX0lOX0lOSSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCSJJbnZhbGlkIENCIHZhbHVlIGZyb20gaW5pIGluIDVHSHogYmFuZCAlZCwgQ0IgRElTQUJMRUQiLAorCQkJCXBQYXJhbS0+Y2hhbm5lbEJvbmRpbmdNb2RlNUdIeik7CisJCX0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGU1R0h6ID0KKwkJCWNzcl9jb252ZXJ0X2NiX2luaV92YWx1ZV90b19waHlfY2Jfc3RhdGUocFBhcmFtLT4KKwkJCQkJCQkJIGNoYW5uZWxCb25kaW5nTW9kZTVHSHopOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlJUU1RocmVzaG9sZCA9IHBQYXJhbS0+UlRTVGhyZXNob2xkOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUgPSBwUGFyYW0tPnBoeU1vZGU7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2hvcnRTbG90VGltZSA9IHBQYXJhbS0+c2hvcnRTbG90VGltZTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5IZWFydGJlYXRUaHJlc2gyNCA9CisJCQlwUGFyYW0tPkhlYXJ0YmVhdFRocmVzaDI0OworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkhlYXJ0YmVhdFRocmVzaDUwID0KKwkJCXBQYXJhbS0+SGVhcnRiZWF0VGhyZXNoNTA7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQgPQorCQkJcFBhcmFtLT5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZDsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5UeFJhdGUgPSBwUGFyYW0tPlR4UmF0ZTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5BZEhvY0NoYW5uZWwyNCA9IHBQYXJhbS0+QWRIb2NDaGFubmVsMjQ7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uQWRIb2NDaGFubmVsNUcgPSBwUGFyYW0tPkFkSG9jQ2hhbm5lbDVHOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmJhbmRDYXBhYmlsaXR5ID0gcFBhcmFtLT5iYW5kQ2FwYWJpbGl0eTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jYkNob2ljZSA9IHBQYXJhbS0+Y2JDaG9pY2U7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcCA9CisJCQlwUGFyYW0tPm5laWdoYm9yUm9hbUNvbmZpZy5kZWxheV9iZWZvcmVfdmRldl9zdG9wOworCisJCS8qIGlmIEhERCBwYXNzZWQgZG93biBub24gemVybyB2YWx1ZXMgdGhlbiBvbmx5IHVwZGF0ZSwgKi8KKwkJLyogb3RoZXJ3aXNlIGtlZXAgdXNpbmcgdGhlIGRlZmF1bHRzICovCisJCWlmIChwUGFyYW0tPmluaXRpYWxfc2Nhbl9ub19kZnNfY2hubCkgeworCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pbml0aWFsX3NjYW5fbm9fZGZzX2NobmwgPQorCQkJCXBQYXJhbS0+aW5pdGlhbF9zY2FuX25vX2Rmc19jaG5sOworCQl9CisJCWlmIChwUGFyYW0tPm5Jbml0aWFsRHdlbGxUaW1lKSB7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5Jbml0aWFsRHdlbGxUaW1lID0KKwkJCQlwUGFyYW0tPm5Jbml0aWFsRHdlbGxUaW1lOworCQl9CisJCWlmIChwUGFyYW0tPm5BY3RpdmVNYXhDaG5UaW1lKSB7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNYXhDaG5UaW1lID0KKwkJCQlwUGFyYW0tPm5BY3RpdmVNYXhDaG5UaW1lOworCQkJY2ZnX3NldF9pbnQocE1hYywgV05JX0NGR19BQ1RJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUUsCisJCQkJICAgIHBQYXJhbS0+bkFjdGl2ZU1heENoblRpbWUpOworCQl9CisJCWlmIChwUGFyYW0tPm5BY3RpdmVNaW5DaG5UaW1lKSB7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNaW5DaG5UaW1lID0KKwkJCQlwUGFyYW0tPm5BY3RpdmVNaW5DaG5UaW1lOworCQkJY2ZnX3NldF9pbnQocE1hYywgV05JX0NGR19BQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUsCisJCQkJICAgIHBQYXJhbS0+bkFjdGl2ZU1pbkNoblRpbWUpOworCQl9CisJCWlmIChwUGFyYW0tPm5QYXNzaXZlTWF4Q2huVGltZSkgeworCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1heENoblRpbWUgPQorCQkJCXBQYXJhbS0+blBhc3NpdmVNYXhDaG5UaW1lOworCQkJY2ZnX3NldF9pbnQocE1hYywgV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FLAorCQkJCSAgICBwUGFyYW0tPm5QYXNzaXZlTWF4Q2huVGltZSk7CisJCX0KKwkJaWYgKHBQYXJhbS0+blBhc3NpdmVNaW5DaG5UaW1lKSB7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5QYXNzaXZlTWluQ2huVGltZSA9CisJCQkJcFBhcmFtLT5uUGFzc2l2ZU1pbkNoblRpbWU7CisJCQljZmdfc2V0X2ludChwTWFjLCBXTklfQ0ZHX1BBU1NJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUsCisJCQkJICAgIHBQYXJhbS0+blBhc3NpdmVNaW5DaG5UaW1lKTsKKwkJfQorI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisJCWlmIChwUGFyYW0tPm5BY3RpdmVNYXhDaG5UaW1lQ29uYykgeworCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWF4Q2huVGltZUNvbmMgPQorCQkJCXBQYXJhbS0+bkFjdGl2ZU1heENoblRpbWVDb25jOworCQl9CisJCWlmIChwUGFyYW0tPm5BY3RpdmVNaW5DaG5UaW1lQ29uYykgeworCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWluQ2huVGltZUNvbmMgPQorCQkJCXBQYXJhbS0+bkFjdGl2ZU1pbkNoblRpbWVDb25jOworCQl9CisJCWlmIChwUGFyYW0tPm5QYXNzaXZlTWF4Q2huVGltZUNvbmMpIHsKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNYXhDaG5UaW1lQ29uYyA9CisJCQkJcFBhcmFtLT5uUGFzc2l2ZU1heENoblRpbWVDb25jOworCQl9CisJCWlmIChwUGFyYW0tPm5QYXNzaXZlTWluQ2huVGltZUNvbmMpIHsKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNaW5DaG5UaW1lQ29uYyA9CisJCQkJcFBhcmFtLT5uUGFzc2l2ZU1pbkNoblRpbWVDb25jOworCQl9CisJCWlmIChwUGFyYW0tPm5SZXN0VGltZUNvbmMpIHsKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublJlc3RUaW1lQ29uYyA9CisJCQkJcFBhcmFtLT5uUmVzdFRpbWVDb25jOworCQl9CisJCWlmIChwUGFyYW0tPm5OdW1TdGFDaGFuQ29tYmluZWRDb25jKSB7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5OdW1TdGFDaGFuQ29tYmluZWRDb25jID0KKwkJCQlwUGFyYW0tPm5OdW1TdGFDaGFuQ29tYmluZWRDb25jOworCQl9CisJCWlmIChwUGFyYW0tPm5OdW1QMlBDaGFuQ29tYmluZWRDb25jKSB7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5OdW1QMlBDaGFuQ29tYmluZWRDb25jID0KKwkJCQlwUGFyYW0tPm5OdW1QMlBDaGFuQ29tYmluZWRDb25jOworCQl9CisjZW5kaWYKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lQmFuZCA9IHBQYXJhbS0+ZUJhbmQ7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSA9CisJCQljc3JfZ2V0X2NmZ19kb3QxMV9tb2RlX2Zyb21fY3NyX3BoeV9tb2RlKE5VTEwsCisJCQkJCQkJCSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLgorCQkJCQkJCQkgcGh5TW9kZSwKKwkJCQkJCQkJIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uCisJCQkJCQkJCSBQcm9wcmlldGFyeVJhdGVzRW5hYmxlZCk7CisJCS8qIGlmIEhERCBwYXNzZWQgZG93biBub24gemVybyB2YWx1ZXMgZm9yIGFnZSBwYXJhbXMsIHRoZW4gb25seSB1cGRhdGUsICovCisJCS8qIG90aGVyd2lzZSBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0cyAqLworCQlpZiAocFBhcmFtLT5uU2NhblJlc3VsdEFnZUNvdW50KSB7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmFnaW5nQ291bnQgPQorCQkJCXBQYXJhbS0+blNjYW5SZXN1bHRBZ2VDb3VudDsKKwkJfQorCQlpZiAocFBhcmFtLT5zY2FuQWdlVGltZU5DTlBTKSB7CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNjYW5BZ2VUaW1lTkNOUFMgPQorCQkJCXBQYXJhbS0+c2NhbkFnZVRpbWVOQ05QUzsKKwkJfQorCQlpZiAocFBhcmFtLT5zY2FuQWdlVGltZU5DUFMpIHsKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2NhbkFnZVRpbWVOQ1BTID0KKwkJCQlwUGFyYW0tPnNjYW5BZ2VUaW1lTkNQUzsKKwkJfQorCQlpZiAocFBhcmFtLT5zY2FuQWdlVGltZUNOUFMpIHsKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2NhbkFnZVRpbWVDTlBTID0KKwkJCQlwUGFyYW0tPnNjYW5BZ2VUaW1lQ05QUzsKKwkJfQorCQlpZiAocFBhcmFtLT5zY2FuQWdlVGltZUNQUykgeworCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zY2FuQWdlVGltZUNQUyA9CisJCQkJcFBhcmFtLT5zY2FuQWdlVGltZUNQUzsKKwkJfQorCisJCWNzcl9hc3NpZ25fcnNzaV9mb3JfY2F0ZWdvcnkocE1hYywgQ1NSX0JFU1RfUlNTSV9WQUxVRSwKKwkJCQkJICAgICBwUGFyYW0tPmJDYXRSc3NpT2Zmc2V0KTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUm9hbWluZ1RpbWUgPSBwUGFyYW0tPm5Sb2FtaW5nVGltZTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mU3VwcGxpY2FudENvdW50cnlDb2RlSGFzUHJpb3JpdHkgPQorCQkJcFBhcmFtLT5mU3VwcGxpY2FudENvdW50cnlDb2RlSGFzUHJpb3JpdHk7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0udmNjUnNzaVRocmVzaG9sZCA9CisJCQlwUGFyYW0tPnZjY1Jzc2lUaHJlc2hvbGQ7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0udmNjVWxNYWNMb3NzVGhyZXNob2xkID0KKwkJCXBQYXJhbS0+dmNjVWxNYWNMb3NzVGhyZXNob2xkOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnN0YXRzUmVxUGVyaW9kaWNpdHkgPQorCQkJcFBhcmFtLT5zdGF0c1JlcVBlcmlvZGljaXR5OworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnN0YXRzUmVxUGVyaW9kaWNpdHlJblBTID0KKwkJCXBQYXJhbS0+c3RhdHNSZXFQZXJpb2RpY2l0eUluUFM7CisJCS8qIEFzc2lnbiB0aGlzIGJlZm9yZSBjYWxsaW5nIGNzcl9pbml0MTFkX2luZm8gKi8KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uVHhQb3dlckNhcCA9IHBQYXJhbS0+blR4UG93ZXJDYXA7CisJCWlmIChjc3JfaXMxMWRfc3VwcG9ydGVkKHBNYWMpKSB7CisJCQlzdGF0dXMgPSBjc3JfaW5pdDExZF9pbmZvKHBNYWMsICZwUGFyYW0tPkNzcjExZGluZm8pOworCQl9IGVsc2UgeworCQkJcE1hYy0+c2Nhbi5jdXJTY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisJCX0KKworCQkvKiBJbml0aWFsaXplIHRoZSBwb3dlciArIGNoYW5uZWwgaW5mb3JtYXRpb24gaWYgMTFoIGlzIGVuYWJsZWQuCisJCSAgIElmIDExZCBpcyBlbmFibGVkIHRoaXMgaW5mb3JtYXRpb24gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAqLworCQlpZiAoY3NyX2lzMTFoX3N1cHBvcnRlZChwTWFjKSAmJiAhY3NyX2lzMTFkX3N1cHBvcnRlZChwTWFjKSkgeworCQkJY3NyX2luaXRfY2hhbm5lbF9wb3dlcl9saXN0KHBNYWMsICZwUGFyYW0tPkNzcjExZGluZm8pOworCQl9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQljZGZfbWVtX2NvcHkoJnBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY3NyMTFyQ29uZmlnLAorCQkJICAgICAmcFBhcmFtLT5jc3IxMXJDb25maWcsCisJCQkgICAgIHNpemVvZih0Q3NyMTFyQ29uZmlnUGFyYW1zKSk7CisJCXNtc19sb2cocE1hYywgTE9HMSwgIklzRlRSZXNvdXJjZVJlcVN1cHAgPSAlZCIsCisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNzcjExckNvbmZpZy4KKwkJCUlzRlRSZXNvdXJjZVJlcVN1cHBvcnRlZCk7CisjZW5kaWYKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZCA9CisJCQlwUGFyYW0tPmlzRmFzdFRyYW5zaXRpb25FbmFibGVkOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlJvYW1Sc3NpRGlmZiA9IHBQYXJhbS0+Um9hbVJzc2lEaWZmOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtUHJlZmVyNUdIeiA9CisJCQlwUGFyYW0tPm5Sb2FtUHJlZmVyNUdIejsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUm9hbUludHJhQmFuZCA9IHBQYXJhbS0+blJvYW1JbnRyYUJhbmQ7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNXRVNNb2RlRW5hYmxlZCA9CisJCQlwUGFyYW0tPmlzV0VTTW9kZUVuYWJsZWQ7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublByb2JlcyA9IHBQYXJhbS0+blByb2JlczsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUm9hbVNjYW5Ib21lQXdheVRpbWUgPQorCQkJcFBhcmFtLT5uUm9hbVNjYW5Ib21lQXdheVRpbWU7CisjZW5kaWYKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQgPQorCQkJcFBhcmFtLT5pc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQ7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYkZhc3RSb2FtSW5Db25JbmlGZWF0dXJlRW5hYmxlZCA9CisJCQlwUGFyYW0tPmJGYXN0Um9hbUluQ29uSW5pRmVhdHVyZUVuYWJsZWQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCA9CisJCQlwUGFyYW0tPmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZDsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5NQVdDRW5hYmxlZCA9IHBQYXJhbS0+TUFXQ0VuYWJsZWQ7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0VzZUluaUZlYXR1cmVFbmFibGVkID0KKwkJCXBQYXJhbS0+aXNFc2VJbmlGZWF0dXJlRW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisJCWNkZl9tZW1fY29weSgmcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcsCisJCQkgICAgICZwUGFyYW0tPm5laWdoYm9yUm9hbUNvbmZpZywKKwkJCSAgICAgc2l6ZW9mKHRDc3JOZWlnaGJvclJvYW1Db25maWdQYXJhbXMpKTsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCAibk5laWdoYm9yU2NhblRpbWVyUGVyaW9pZCA9ICVkIiwKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJbk5laWdoYm9yU2NhblRpbWVyUGVyaW9kKTsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCAibk5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZCA9ICVkIiwKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJbk5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZCk7CisJCXNtc19sb2cocE1hYywgTE9HMSwgIm5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZiA9ICVkIiwKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmKTsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCAiblJvYW1SZXNjYW5Sc3NpRGlmZiA9ICVkIiwKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJblJvYW1SZXNjYW5Sc3NpRGlmZik7CisJCXNtc19sb2cocE1hYywgTE9HMSwgIm5OZWlnaGJvclNjYW5NaW5DaGFuVGltZSA9ICVkIiwKKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJbk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lKTsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCAibk5laWdoYm9yU2Nhbk1heENoYW5UaW1lID0gJWQiLAorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCQluTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWUpOworCQlzbXNfbG9nKHBNYWMsIExPRzEsICJuTWF4TmVpZ2hib3JSZXRyaWVzID0gJWQiLAorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCQluTWF4TmVpZ2hib3JSZXRyaWVzKTsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCAibk5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2QgPSAlZCIsCisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCW5OZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kKTsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCAibkVtcHR5U2NhblJlZnJlc2hQZXJpb2QgPSAlZCIsCisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCW5FbXB0eVNjYW5SZWZyZXNoUGVyaW9kKTsKKwkJeworCQkJaW50IGk7CisJCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQkJRkwoIk51bSBvZiBDaGFubmVscyBpbiBDRkcgQ2hhbm5lbCBMaXN0OiAlZCIpLAorCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJCW5laWdoYm9yU2NhbkNoYW5MaXN0Lm51bUNoYW5uZWxzKTsKKwkJCWZvciAoaSA9IDA7CisJCQkgICAgIGkgPAorCQkJICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCSAgICAgbmVpZ2hib3JTY2FuQ2hhbkxpc3QubnVtQ2hhbm5lbHM7IGkrKykgeworCQkJCXNtc19sb2cocE1hYywgTE9HMSwgIiVkICIsCisJCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uCisJCQkJCW5laWdoYm9yUm9hbUNvbmZpZy5uZWlnaGJvclNjYW5DaGFuTGlzdC4KKwkJCQkJY2hhbm5lbExpc3RbaV0pOworCQkJfQorCQl9CisJCXNtc19sb2cocE1hYywgTE9HMSwgIm5Sb2FtQm1pc3NGaXJzdEJjbnQgPSAlZCIsCisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCW5Sb2FtQm1pc3NGaXJzdEJjbnQpOworCQlzbXNfbG9nKHBNYWMsIExPRzEsICJuUm9hbUJtaXNzRmluYWxCY250ID0gJWQiLAorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCQluUm9hbUJtaXNzRmluYWxCY250KTsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCAiblJvYW1CZWFjb25Sc3NpV2VpZ2h0ID0gJWQiLAorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCQluUm9hbUJlYWNvblJzc2lXZWlnaHQpOworI2VuZGlmCisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYWRkVFNXaGVuQUNNSXNPZmYgPQorCQkJcFBhcmFtLT5hZGRUU1doZW5BQ01Jc09mZjsKKwkJcE1hYy0+c2Nhbi5mVmFsaWRhdGVMaXN0ID0gcFBhcmFtLT5mVmFsaWRhdGVMaXN0OworCQlwTWFjLT5zY2FuLmZFbmFibGVCeXBhc3MxMWQgPSBwUGFyYW0tPmZFbmFibGVCeXBhc3MxMWQ7CisJCXBNYWMtPnNjYW4uZkVuYWJsZURGU0NobmxTY2FuID0gcFBhcmFtLT5mRW5hYmxlREZTQ2hubFNjYW47CisJCXBNYWMtPnNjYW4uc2NhblJlc3VsdENmZ0FnaW5nVGltZSA9IHBQYXJhbS0+c2NhbkNmZ0FnaW5nVGltZTsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mU2NhblR3aWNlID0gcFBhcmFtLT5mU2NhblR3aWNlOworCQlwTWFjLT5zY2FuLmZGaXJzdFNjYW5Pbmx5MkdDaG5sID0gcFBhcmFtLT5mRmlyc3RTY2FuT25seTJHQ2hubDsKKwkJcE1hYy0+c2Nhbi5tYXhfc2Nhbl9jb3VudCA9IHBQYXJhbS0+bWF4X3NjYW5fY291bnQ7CisJCS8qIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBhdmFpbGFibGUgaW4gY2ZnIGFuZCBub3QgcGFzc2VkIGZyb20gdXBwZXIgbGF5ZXJzLiBJbnN0ZWFkIGl0IGlzIGluaXRpYWxpemVkIGhlcmUKKwkJICogVGhpcyBwYXJhbXRlcmUgaXMgdXNlZCBpbiBjb25jdXJyZW5jeSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIGNvbmN1cnJlbnQgYWN0aXZlIHNlc3Npb25zLgorCQkgKiBJcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IGZpeCB0byBkaXNjb25uZWN0IGFsbCBhY3RpdmUgc2Vzc2lvbnMgd2hlbiBCTVBTIGVuYWJsZWQgc28gdGhlIGFjdGl2ZSBzZXNzaW9uIGlmIEluZnJhIFNUQQorCQkgKiB3aWxsIGF1dG9tYXRpY2FsbHkgY29ubmVjdCBiYWNrIGFuZCByZXN1bWUgQk1QUyBzaW5jZSByZXN1bWUgQk1QUyBpcyBub3Qgd29ya2luZyB3aGVuIG1vdmluZyBmcm9tIGNvbmN1cnJlbnQgdG8KKwkJICogc2luZ2xlIHNlc3Npb24KKwkJICovCisJCS8qIFJlbW92ZSB0aGlzIGNvZGUgb25jZSBTTE1fU2Vzc2lvbml6YXRpb24gaXMgc3VwcG9ydGVkICovCisJCS8qIEJNUFNfV09SS0FST1VORF9OT1RfTkVFREVEICovCisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZG9CTVBTV29ya2Fyb3VuZCA9IDA7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5WaHRDaGFubmVsV2lkdGggPQorCQkJcFBhcmFtLT5uVmh0Q2hhbm5lbFdpZHRoOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnR4QkZFbmFibGUgPSBwUGFyYW0tPmVuYWJsZVR4QkY7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0udHhCRkNzblZhbHVlID0gcFBhcmFtLT50eEJGQ3NuVmFsdWU7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZW5hYmxlMngyID0gcFBhcmFtLT5lbmFibGUyeDI7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZW5hYmxlVmh0Rm9yMjRHSHogPQorCQkJcFBhcmFtLT5lbmFibGVWaHRGb3IyNEdIejsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS50eE11QmZvcm1lZSA9IHBQYXJhbS0+ZW5hYmxlTXVCZm9ybWVlOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVuYWJsZVZodHBBaWQgPSBwUGFyYW0tPmVuYWJsZVZodHBBaWQ7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZW5hYmxlVmh0R2lkID0gcFBhcmFtLT5lbmFibGVWaHRHaWQ7CisjZW5kaWYKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lbmFibGVBbXBkdVBzID0gcFBhcmFtLT5lbmFibGVBbXBkdVBzOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVuYWJsZUh0U21wcyA9IHBQYXJhbS0+ZW5hYmxlSHRTbXBzOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmh0U21wcyA9IHBQYXJhbS0+aHRTbXBzOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnR4TGRwY0VuYWJsZSA9IHBQYXJhbS0+ZW5hYmxlVHhMZHBjOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlnbm9yZV9wZWVyX2VycF9pbmZvID0KKwkJCXBQYXJhbS0+aWdub3JlX3BlZXJfZXJwX2luZm87CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNBbXNkdVN1cHBvcnRJbkFNUERVID0KKwkJCXBQYXJhbS0+aXNBbXNkdVN1cHBvcnRJbkFNUERVOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5TZWxlY3Q1R0h6TWFyZ2luID0KKwkJCXBQYXJhbS0+blNlbGVjdDVHSHpNYXJnaW47CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNDb2FsZXNpbmdJbklCU1NBbGxvd2VkID0KKwkJCXBQYXJhbS0+aXNDb2FsZXNpbmdJbklCU1NBbGxvd2VkOworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNjX3N3aXRjaF9tb2RlID0gcFBhcmFtLT5jY19zd2l0Y2hfbW9kZTsKKyNlbmRpZgorCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmFsbG93REZTQ2hhbm5lbFJvYW0gPQorCQkJcFBhcmFtLT5hbGxvd0RGU0NoYW5uZWxSb2FtOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc1JvYW1PZmZsb2FkRW5hYmxlZCA9CisJCQlwUGFyYW0tPmlzUm9hbU9mZmxvYWRFbmFibGVkOworI2VuZGlmCisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ub2Jzc0VuYWJsZWQgPSBwUGFyYW0tPm9ic3NFbmFibGVkOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNvbmNfY3VzdG9tX3J1bGUxID0KKwkJCXBQYXJhbS0+Y29uY19jdXN0b21fcnVsZTE7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY29uY19jdXN0b21fcnVsZTIgPQorCQkJcFBhcmFtLT5jb25jX2N1c3RvbV9ydWxlMjsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc19zdGFfY29ubmVjdGlvbl9pbl81Z3pfZW5hYmxlZCA9CisJCQlwUGFyYW0tPmlzX3N0YV9jb25uZWN0aW9uX2luXzVnel9lbmFibGVkOworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNlbmREZWF1dGhCZWZvcmVDb24gPQorCQkJcFBhcmFtLT5zZW5kRGVhdXRoQmVmb3JlQ29uOworCisJCXBNYWMtPmVuYWJsZV9kb3QxMXAgPSBwUGFyYW0tPmVuYWJsZV9kb3QxMXA7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3JfZ2V0X2NvbmZpZ19wYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQ29uZmlnUGFyYW0gKnBQYXJhbSkKK3sKKwlpbnQgaTsKKwl0Q3NyQ29uZmlnICpjZmdfcGFyYW1zID0gJnBNYWMtPnJvYW0uY29uZmlnUGFyYW07CisKKwlpZiAoIXBQYXJhbSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKworCXBQYXJhbS0+V01NU3VwcG9ydE1vZGUgPSBjZmdfcGFyYW1zLT5XTU1TdXBwb3J0TW9kZTsKKwlwUGFyYW0tPklzMTFlU3VwcG9ydEVuYWJsZWQgPSBjZmdfcGFyYW1zLT5JczExZVN1cHBvcnRFbmFibGVkOworCXBQYXJhbS0+RnJhZ21lbnRhdGlvblRocmVzaG9sZCA9IGNmZ19wYXJhbXMtPkZyYWdtZW50YXRpb25UaHJlc2hvbGQ7CisJcFBhcmFtLT5JczExZFN1cHBvcnRFbmFibGVkID0gY2ZnX3BhcmFtcy0+SXMxMWRTdXBwb3J0RW5hYmxlZDsKKwlwUGFyYW0tPklzMTFkU3VwcG9ydEVuYWJsZWRPcmlnaW5hbCA9CisJCWNmZ19wYXJhbXMtPklzMTFkU3VwcG9ydEVuYWJsZWRPcmlnaW5hbDsKKwlwUGFyYW0tPklzMTFoU3VwcG9ydEVuYWJsZWQgPSBjZmdfcGFyYW1zLT5JczExaFN1cHBvcnRFbmFibGVkOworCXBQYXJhbS0+Y2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPSBjc3JfY29udmVydF9waHlfY2Jfc3RhdGVfdG9faW5pX3ZhbHVlKAorCQkJCQljZmdfcGFyYW1zLT5jaGFubmVsQm9uZGluZ01vZGUyNEdIeik7CisJcFBhcmFtLT5jaGFubmVsQm9uZGluZ01vZGU1R0h6ID0gY3NyX2NvbnZlcnRfcGh5X2NiX3N0YXRlX3RvX2luaV92YWx1ZSgKKwkJCQkJY2ZnX3BhcmFtcy0+Y2hhbm5lbEJvbmRpbmdNb2RlNUdIeik7CisJcFBhcmFtLT5SVFNUaHJlc2hvbGQgPSBjZmdfcGFyYW1zLT5SVFNUaHJlc2hvbGQ7CisJcFBhcmFtLT5waHlNb2RlID0gY2ZnX3BhcmFtcy0+cGh5TW9kZTsKKwlwUGFyYW0tPnNob3J0U2xvdFRpbWUgPSBjZmdfcGFyYW1zLT5zaG9ydFNsb3RUaW1lOworCXBQYXJhbS0+SGVhcnRiZWF0VGhyZXNoMjQgPSBjZmdfcGFyYW1zLT5IZWFydGJlYXRUaHJlc2gyNDsKKwlwUGFyYW0tPkhlYXJ0YmVhdFRocmVzaDUwID0gY2ZnX3BhcmFtcy0+SGVhcnRiZWF0VGhyZXNoNTA7CisJcFBhcmFtLT5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZCA9IGNmZ19wYXJhbXMtPlByb3ByaWV0YXJ5UmF0ZXNFbmFibGVkOworCXBQYXJhbS0+VHhSYXRlID0gY2ZnX3BhcmFtcy0+VHhSYXRlOworCXBQYXJhbS0+QWRIb2NDaGFubmVsMjQgPSBjZmdfcGFyYW1zLT5BZEhvY0NoYW5uZWwyNDsKKwlwUGFyYW0tPkFkSG9jQ2hhbm5lbDVHID0gY2ZnX3BhcmFtcy0+QWRIb2NDaGFubmVsNUc7CisJcFBhcmFtLT5iYW5kQ2FwYWJpbGl0eSA9IGNmZ19wYXJhbXMtPmJhbmRDYXBhYmlsaXR5OworCXBQYXJhbS0+Y2JDaG9pY2UgPSBjZmdfcGFyYW1zLT5jYkNob2ljZTsKKwlwUGFyYW0tPm5BY3RpdmVNYXhDaG5UaW1lID0gY2ZnX3BhcmFtcy0+bkFjdGl2ZU1heENoblRpbWU7CisJcFBhcmFtLT5uQWN0aXZlTWluQ2huVGltZSA9IGNmZ19wYXJhbXMtPm5BY3RpdmVNaW5DaG5UaW1lOworCXBQYXJhbS0+blBhc3NpdmVNYXhDaG5UaW1lID0gY2ZnX3BhcmFtcy0+blBhc3NpdmVNYXhDaG5UaW1lOworCXBQYXJhbS0+blBhc3NpdmVNaW5DaG5UaW1lID0gY2ZnX3BhcmFtcy0+blBhc3NpdmVNaW5DaG5UaW1lOworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisJcFBhcmFtLT5uQWN0aXZlTWF4Q2huVGltZUNvbmMgPSBjZmdfcGFyYW1zLT5uQWN0aXZlTWF4Q2huVGltZUNvbmM7CisJcFBhcmFtLT5uQWN0aXZlTWluQ2huVGltZUNvbmMgPSBjZmdfcGFyYW1zLT5uQWN0aXZlTWluQ2huVGltZUNvbmM7CisJcFBhcmFtLT5uUGFzc2l2ZU1heENoblRpbWVDb25jID0gY2ZnX3BhcmFtcy0+blBhc3NpdmVNYXhDaG5UaW1lQ29uYzsKKwlwUGFyYW0tPm5QYXNzaXZlTWluQ2huVGltZUNvbmMgPSBjZmdfcGFyYW1zLT5uUGFzc2l2ZU1pbkNoblRpbWVDb25jOworCXBQYXJhbS0+blJlc3RUaW1lQ29uYyA9IGNmZ19wYXJhbXMtPm5SZXN0VGltZUNvbmM7CisJcFBhcmFtLT5uTnVtU3RhQ2hhbkNvbWJpbmVkQ29uYyA9IGNmZ19wYXJhbXMtPm5OdW1TdGFDaGFuQ29tYmluZWRDb25jOworCXBQYXJhbS0+bk51bVAyUENoYW5Db21iaW5lZENvbmMgPSBjZmdfcGFyYW1zLT5uTnVtUDJQQ2hhbkNvbWJpbmVkQ29uYzsKKyNlbmRpZgorCXBQYXJhbS0+ZUJhbmQgPSBjZmdfcGFyYW1zLT5lQmFuZDsKKwlwUGFyYW0tPm5TY2FuUmVzdWx0QWdlQ291bnQgPSBjZmdfcGFyYW1zLT5hZ2luZ0NvdW50OworCXBQYXJhbS0+c2NhbkFnZVRpbWVOQ05QUyA9IGNmZ19wYXJhbXMtPnNjYW5BZ2VUaW1lTkNOUFM7CisJcFBhcmFtLT5zY2FuQWdlVGltZU5DUFMgPSBjZmdfcGFyYW1zLT5zY2FuQWdlVGltZU5DUFM7CisJcFBhcmFtLT5zY2FuQWdlVGltZUNOUFMgPSBjZmdfcGFyYW1zLT5zY2FuQWdlVGltZUNOUFM7CisJcFBhcmFtLT5zY2FuQWdlVGltZUNQUyA9IGNmZ19wYXJhbXMtPnNjYW5BZ2VUaW1lQ1BTOworCXBQYXJhbS0+YkNhdFJzc2lPZmZzZXQgPSBjZmdfcGFyYW1zLT5iQ2F0UnNzaU9mZnNldDsKKwlwUGFyYW0tPm5Sb2FtaW5nVGltZSA9IGNmZ19wYXJhbXMtPm5Sb2FtaW5nVGltZTsKKwlwUGFyYW0tPmZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eSA9CisJCWNmZ19wYXJhbXMtPmZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eTsKKwlwUGFyYW0tPnZjY1Jzc2lUaHJlc2hvbGQgPSBjZmdfcGFyYW1zLT52Y2NSc3NpVGhyZXNob2xkOworCXBQYXJhbS0+dmNjVWxNYWNMb3NzVGhyZXNob2xkID0gY2ZnX3BhcmFtcy0+dmNjVWxNYWNMb3NzVGhyZXNob2xkOworCXBQYXJhbS0+blR4UG93ZXJDYXAgPSBjZmdfcGFyYW1zLT5uVHhQb3dlckNhcDsKKwlwUGFyYW0tPnN0YXRzUmVxUGVyaW9kaWNpdHkgPSBjZmdfcGFyYW1zLT5zdGF0c1JlcVBlcmlvZGljaXR5OworCXBQYXJhbS0+c3RhdHNSZXFQZXJpb2RpY2l0eUluUFMgPSBjZmdfcGFyYW1zLT5zdGF0c1JlcVBlcmlvZGljaXR5SW5QUzsKKwlwUGFyYW0tPmFkZFRTV2hlbkFDTUlzT2ZmID0gY2ZnX3BhcmFtcy0+YWRkVFNXaGVuQUNNSXNPZmY7CisJcFBhcmFtLT5mVmFsaWRhdGVMaXN0ID0gY2ZnX3BhcmFtcy0+ZlZhbGlkYXRlTGlzdDsKKwlwUGFyYW0tPmZFbmFibGVCeXBhc3MxMWQgPSBwTWFjLT5zY2FuLmZFbmFibGVCeXBhc3MxMWQ7CisJcFBhcmFtLT5mRW5hYmxlREZTQ2hubFNjYW4gPSBwTWFjLT5zY2FuLmZFbmFibGVERlNDaG5sU2NhbjsKKwlwUGFyYW0tPmZTY2FuVHdpY2UgPSBjZmdfcGFyYW1zLT5mU2NhblR3aWNlOworCXBQYXJhbS0+ZkZpcnN0U2Nhbk9ubHkyR0NobmwgPSBwTWFjLT5zY2FuLmZGaXJzdFNjYW5Pbmx5MkdDaG5sOworCXBQYXJhbS0+ZkVuYWJsZU1DQ01vZGUgPSBjZmdfcGFyYW1zLT5mZW5hYmxlTUNDTW9kZTsKKwlwUGFyYW0tPmZBbGxvd01DQ0dPRGlmZkJJID0gY2ZnX3BhcmFtcy0+ZkFsbG93TUNDR09EaWZmQkk7CisJcFBhcmFtLT5zY2FuQ2ZnQWdpbmdUaW1lID0gcE1hYy0+c2Nhbi5zY2FuUmVzdWx0Q2ZnQWdpbmdUaW1lOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisJY2RmX21lbV9jb3B5KCZwUGFyYW0tPm5laWdoYm9yUm9hbUNvbmZpZywKKwkJICAgICAmY2ZnX3BhcmFtcy0+bmVpZ2hib3JSb2FtQ29uZmlnLAorCQkgICAgIHNpemVvZih0Q3NyTmVpZ2hib3JSb2FtQ29uZmlnUGFyYW1zKSk7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCXBQYXJhbS0+blZodENoYW5uZWxXaWR0aCA9IGNmZ19wYXJhbXMtPm5WaHRDaGFubmVsV2lkdGg7CisJcFBhcmFtLT5lbmFibGVUeEJGID0gY2ZnX3BhcmFtcy0+dHhCRkVuYWJsZTsKKwlwUGFyYW0tPnR4QkZDc25WYWx1ZSA9IGNmZ19wYXJhbXMtPnR4QkZDc25WYWx1ZTsKKwlwUGFyYW0tPmVuYWJsZU11QmZvcm1lZSA9IGNmZ19wYXJhbXMtPnR4TXVCZm9ybWVlOworCXBQYXJhbS0+ZW5hYmxlVmh0Rm9yMjRHSHogPSBjZmdfcGFyYW1zLT5lbmFibGVWaHRGb3IyNEdIejsKKwlwUGFyYW0tPmlnbm9yZV9wZWVyX2VycF9pbmZvID0gY2ZnX3BhcmFtcy0+aWdub3JlX3BlZXJfZXJwX2luZm87CisJcFBhcmFtLT5lbmFibGUyeDIgPSBjZmdfcGFyYW1zLT5lbmFibGUyeDI7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWNkZl9tZW1fY29weSgmY2ZnX3BhcmFtcy0+Y3NyMTFyQ29uZmlnLCAmcFBhcmFtLT5jc3IxMXJDb25maWcsCisJCSAgICAgc2l6ZW9mKHRDc3IxMXJDb25maWdQYXJhbXMpKTsKKyNlbmRpZgorI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCXBQYXJhbS0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQgPSBjZmdfcGFyYW1zLT5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZDsKKwlwUGFyYW0tPlJvYW1Sc3NpRGlmZiA9IGNmZ19wYXJhbXMtPlJvYW1Sc3NpRGlmZjsKKwlwUGFyYW0tPm5Sb2FtUHJlZmVyNUdIeiA9IGNmZ19wYXJhbXMtPm5Sb2FtUHJlZmVyNUdIejsKKwlwUGFyYW0tPm5Sb2FtSW50cmFCYW5kID0gY2ZnX3BhcmFtcy0+blJvYW1JbnRyYUJhbmQ7CisJcFBhcmFtLT5pc1dFU01vZGVFbmFibGVkID0gY2ZnX3BhcmFtcy0+aXNXRVNNb2RlRW5hYmxlZDsKKwlwUGFyYW0tPm5Qcm9iZXMgPSBjZmdfcGFyYW1zLT5uUHJvYmVzOworCXBQYXJhbS0+blJvYW1TY2FuSG9tZUF3YXlUaW1lID0gY2ZnX3BhcmFtcy0+blJvYW1TY2FuSG9tZUF3YXlUaW1lOworI2VuZGlmCisJcFBhcmFtLT5pc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQgPSBjZmdfcGFyYW1zLT5pc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQ7CisJcFBhcmFtLT5iRmFzdFJvYW1JbkNvbkluaUZlYXR1cmVFbmFibGVkID0KKwkJY2ZnX3BhcmFtcy0+YkZhc3RSb2FtSW5Db25JbmlGZWF0dXJlRW5hYmxlZDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJcFBhcmFtLT5pc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQgPQorCQljZmdfcGFyYW1zLT5pc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJcFBhcmFtLT5pc0VzZUluaUZlYXR1cmVFbmFibGVkID0gY2ZnX3BhcmFtcy0+aXNFc2VJbmlGZWF0dXJlRW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisJY2RmX21lbV9jb3B5KCZwUGFyYW0tPm5laWdoYm9yUm9hbUNvbmZpZywKKwkJICAgICAmY2ZnX3BhcmFtcy0+bmVpZ2hib3JSb2FtQ29uZmlnLAorCQkgICAgIHNpemVvZih0Q3NyTmVpZ2hib3JSb2FtQ29uZmlnUGFyYW1zKSk7CisJc21zX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgiTnVtIG9mIENoYW5uZWxzIGluIENGRyBDaGFubmVsIExpc3Q6ICVkIiksCisJCWNmZ19wYXJhbXMtPm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJbmVpZ2hib3JTY2FuQ2hhbkxpc3QubnVtQ2hhbm5lbHMpOworCWZvciAoaSA9IDA7IGkgPCBjZmdfcGFyYW1zLT5uZWlnaGJvclJvYW1Db25maWcuCisJICAgICBuZWlnaGJvclNjYW5DaGFuTGlzdC5udW1DaGFubmVsczsgaSsrKSB7CisJCXNtc19sb2cocE1hYywgTE9HMSwgIiVkICIsCisJCQljZmdfcGFyYW1zLT5uZWlnaGJvclJvYW1Db25maWcuCisJCQluZWlnaGJvclNjYW5DaGFuTGlzdC5jaGFubmVsTGlzdFtpXSk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwlwUGFyYW0tPmNjX3N3aXRjaF9tb2RlID0gY2ZnX3BhcmFtcy0+Y2Nfc3dpdGNoX21vZGU7CisjZW5kaWYKKwlwUGFyYW0tPmVuYWJsZVR4TGRwYyA9IGNmZ19wYXJhbXMtPnR4TGRwY0VuYWJsZTsKKwlwUGFyYW0tPmlzQW1zZHVTdXBwb3J0SW5BTVBEVSA9IGNmZ19wYXJhbXMtPmlzQW1zZHVTdXBwb3J0SW5BTVBEVTsKKwlwUGFyYW0tPm5TZWxlY3Q1R0h6TWFyZ2luID0gY2ZnX3BhcmFtcy0+blNlbGVjdDVHSHpNYXJnaW47CisJcFBhcmFtLT5pc0NvYWxlc2luZ0luSUJTU0FsbG93ZWQgPSBjZmdfcGFyYW1zLT5pc0NvYWxlc2luZ0luSUJTU0FsbG93ZWQ7CisJcFBhcmFtLT5hbGxvd0RGU0NoYW5uZWxSb2FtID0gY2ZnX3BhcmFtcy0+YWxsb3dERlNDaGFubmVsUm9hbTsKKwlwUGFyYW0tPm5Jbml0aWFsRHdlbGxUaW1lID0gY2ZnX3BhcmFtcy0+bkluaXRpYWxEd2VsbFRpbWU7CisJcFBhcmFtLT5pbml0aWFsX3NjYW5fbm9fZGZzX2NobmwgPSBjZmdfcGFyYW1zLT5pbml0aWFsX3NjYW5fbm9fZGZzX2Nobmw7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCXBQYXJhbS0+aXNSb2FtT2ZmbG9hZEVuYWJsZWQgPSBjZmdfcGFyYW1zLT5pc1JvYW1PZmZsb2FkRW5hYmxlZDsKKyNlbmRpZgorCXBQYXJhbS0+ZW5hYmxlX2RvdDExcCA9IHBNYWMtPmVuYWJsZV9kb3QxMXA7CisJY3NyX3NldF9jaGFubmVscyhwTWFjLCBwUGFyYW0pOworCXBQYXJhbS0+b2Jzc0VuYWJsZWQgPSBjZmdfcGFyYW1zLT5vYnNzRW5hYmxlZDsKKwlwUGFyYW0tPmNvbmNfY3VzdG9tX3J1bGUxID0gY2ZnX3BhcmFtcy0+Y29uY19jdXN0b21fcnVsZTE7CisJcFBhcmFtLT5jb25jX2N1c3RvbV9ydWxlMiA9IGNmZ19wYXJhbXMtPmNvbmNfY3VzdG9tX3J1bGUyOworCXBQYXJhbS0+aXNfc3RhX2Nvbm5lY3Rpb25faW5fNWd6X2VuYWJsZWQgPQorCQljZmdfcGFyYW1zLT5pc19zdGFfY29ubmVjdGlvbl9pbl81Z3pfZW5hYmxlZDsKKwlwUGFyYW0tPnNlbmREZWF1dGhCZWZvcmVDb24gPQorCQljZmdfcGFyYW1zLT5zZW5kRGVhdXRoQmVmb3JlQ29uOworCXBQYXJhbS0+bWF4X3NjYW5fY291bnQgPSBwTWFjLT5zY2FuLm1heF9zY2FuX2NvdW50OworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NldF9waHlfbW9kZSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHBoeU1vZGUsIGVDc3JCYW5kIGVCYW5kLAorCQkJICAgIGJvb2wgKnBmUmVzdGFydE5lZWRlZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJYm9vbCBmUmVzdGFydE5lZWRlZCA9IGZhbHNlOworCWVDc3JQaHlNb2RlIG5ld1BoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfQVVUTzsKKwlpZiAoZUNTUl9CQU5EXzI0ID09IGVCYW5kKSB7CisJCWlmIChDU1JfSVNfUkFESU9fQV9PTkxZKHBNYWMpKQorCQkJZ290byBlbmQ7CisJCWlmIChlQ1NSX0RPVDExX01PREVfMTFhICYgcGh5TW9kZSkKKwkJCWdvdG8gZW5kOworCX0KKwlpZiAoZUNTUl9CQU5EXzVHID09IGVCYW5kKSB7CisJCWlmIChDU1JfSVNfUkFESU9fQkdfT05MWShwTWFjKSkKKwkJCWdvdG8gZW5kOworCQlpZiAoKGVDU1JfRE9UMTFfTU9ERV8xMWIgJiBwaHlNb2RlKQorCQkJfHwgKGVDU1JfRE9UMTFfTU9ERV8xMWJfT05MWSAmIHBoeU1vZGUpCisJCQl8fCAoZUNTUl9ET1QxMV9NT0RFXzExZyAmIHBoeU1vZGUpCisJCQl8fCAoZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZICYgcGh5TW9kZSkpCisJCQlnb3RvIGVuZDsKKwl9CisJaWYgKGVDU1JfRE9UMTFfTU9ERV9BVVRPICYgcGh5TW9kZSkKKwkJbmV3UGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV9BVVRPOworCWVsc2UgeworCQkvKiBDaGVjayBmb3IgZHVhbCBiYW5kIGFuZCBoaWdoZXIgY2FwYWJpbGl0eSBmaXJzdCAqLworCQlpZiAoZUNTUl9ET1QxMV9NT0RFXzExbl9PTkxZICYgcGh5TW9kZSkgeworCQkJaWYgKGVDU1JfRE9UMTFfTU9ERV8xMW5fT05MWSAhPSBwaHlNb2RlKQorCQkJCWdvdG8gZW5kOworCQkJbmV3UGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMW5fT05MWTsKKwkJfSBlbHNlIGlmIChlQ1NSX0RPVDExX01PREVfMTFnX09OTFkgJiBwaHlNb2RlKSB7CisJCQlpZiAoZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZICE9IHBoeU1vZGUpCisJCQkJZ290byBlbmQ7CisJCQlpZiAoZUNTUl9CQU5EXzVHID09IGVCYW5kKQorCQkJCWdvdG8gZW5kOworCQkJbmV3UGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWTsKKwkJCWVCYW5kID0gZUNTUl9CQU5EXzI0OworCQl9IGVsc2UgaWYgKGVDU1JfRE9UMTFfTU9ERV8xMWJfT05MWSAmIHBoeU1vZGUpIHsKKwkJCWlmIChlQ1NSX0RPVDExX01PREVfMTFiX09OTFkgIT0gcGh5TW9kZSkKKwkJCQlnb3RvIGVuZDsKKwkJCWlmIChlQ1NSX0JBTkRfNUcgPT0gZUJhbmQpCisJCQkJZ290byBlbmQ7CisJCQluZXdQaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZOworCQkJZUJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisJCX0gZWxzZSBpZiAoZUNTUl9ET1QxMV9NT0RFXzExbiAmIHBoeU1vZGUpIHsKKwkJCW5ld1BoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFuOworCQl9IGVsc2UgaWYgKGVDU1JfRE9UMTFfTU9ERV9hYmcgJiBwaHlNb2RlKSB7CisJCQluZXdQaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFX2FiZzsKKwkJfSBlbHNlIGlmIChlQ1NSX0RPVDExX01PREVfMTFhICYgcGh5TW9kZSkgeworCQkJaWYgKChlQ1NSX0RPVDExX01PREVfMTFnICYgcGh5TW9kZSkKKwkJCQl8fCAoZUNTUl9ET1QxMV9NT0RFXzExYiAmIHBoeU1vZGUpKSB7CisJCQkJaWYgKGVDU1JfQkFORF9BTEwgPT0gZUJhbmQpCisJCQkJCW5ld1BoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfYWJnOworCQkJCWVsc2UKKwkJCQkJZ290byBlbmQ7CisJCQl9IGVsc2UgeworCQkJCW5ld1BoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFhOworCQkJCWVCYW5kID0gZUNTUl9CQU5EXzVHOworCQkJfQorCQl9IGVsc2UgaWYgKGVDU1JfRE9UMTFfTU9ERV8xMWcgJiBwaHlNb2RlKSB7CisJCQluZXdQaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExZzsKKwkJCWVCYW5kID0gZUNTUl9CQU5EXzI0OworCQl9IGVsc2UgaWYgKGVDU1JfRE9UMTFfTU9ERV8xMWIgJiBwaHlNb2RlKSB7CisJCQluZXdQaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYjsKKwkJCWVCYW5kID0gZUNTUl9CQU5EXzI0OworCQl9IGVsc2UgeworCQkJLyogV2Ugd2lsbCBuZXZlciBiZSBoZXJlICovCisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMKCJjYW4ndCByZWNvZ25pemUgcGh5bW9kZSAweCUwOFgiKSwKKwkJCQkJcGh5TW9kZSk7CisJCQluZXdQaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFX0FVVE87CisJCX0KKwl9CisJLyogRG9uZSB2YWxpZGF0aW5nICovCisJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCS8qIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgYSByZXN0YXJ0IGlzIG5lZWRlZC4gKi8KKwlpZiAoZUJhbmQgIT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lQmFuZCkgeworCQlmUmVzdGFydE5lZWRlZCA9IHRydWU7CisJCWdvdG8gZW5kOworCX0KKwlpZiAobmV3UGh5TW9kZSAhPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUpIHsKKwkJZlJlc3RhcnROZWVkZWQgPSB0cnVlOworCQlnb3RvIGVuZDsKKwl9CitlbmQ6CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZUJhbmQgPSBlQmFuZDsKKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5waHlNb2RlID0gbmV3UGh5TW9kZTsKKwkJaWYgKHBmUmVzdGFydE5lZWRlZCkKKwkJCSpwZlJlc3RhcnROZWVkZWQgPSBmUmVzdGFydE5lZWRlZDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3JfcHJ1bmVfY2hfbGlzdCgpIC0gcHJ1bmVzIHRoZSBjaGFubmVsIGxpc3QgdG8ga2VlcCBvbmx5IGEgdHlwZSBvZiBjaGFubmVscworICogQGNoX2xzdDogICAgICAgIGV4aXN0aW5nIGNoYW5uZWwgbGlzdAorICogQGlzXzI0X0dIejogICAgIGluZGljYXRlcyBpZiAyLjUgR0h6IG9yIDUgR0h6IGNoYW5uZWxzIGFyZSByZXF1aXJlZAorICoKKyAqIFJldHVybjogdm9pZAorICovCit2b2lkIGNzcl9wcnVuZV9jaF9saXN0KHRDc3JDaGFubmVsICpjaF9sc3QsIGJvb2wgaXNfMjRfR0h6KQoreworCXVpbnQ4X3QgaWR4ID0gMCwgbnVtX2NoYW5uZWxzID0gMDsKKwlmb3IgKCA7IGlkeCA8IGNoX2xzdC0+bnVtQ2hhbm5lbHM7IGlkeCsrKSB7CisJCWlmIChpc18yNF9HSHopIHsKKwkJCWlmIChDRFNfSVNfQ0hBTk5FTF8yNEdIWihjaF9sc3QtPmNoYW5uZWxMaXN0W2lkeF0pKSB7CisJCQkJY2hfbHN0LT5jaGFubmVsTGlzdFtudW1fY2hhbm5lbHNdID0KKwkJCQkJY2hfbHN0LT5jaGFubmVsTGlzdFtpZHhdOworCQkJCW51bV9jaGFubmVscysrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKENEU19JU19DSEFOTkVMXzVHSFooY2hfbHN0LT5jaGFubmVsTGlzdFtpZHhdKSkgeworCQkJCWNoX2xzdC0+Y2hhbm5lbExpc3RbbnVtX2NoYW5uZWxzXSA9CisJCQkJCWNoX2xzdC0+Y2hhbm5lbExpc3RbaWR4XTsKKwkJCQludW1fY2hhbm5lbHMrKzsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIENsZWFudXAgdGhlIHJlc3Qgb2YgY2hhbm5lbHMuIE5vdGUgd2Ugb25seSBuZWVkIHRvIGNsZWFuIHVwIHRoZQorCSAqIGNoYW5uZWxzIGlmIHdlIGhhZCB0byB0cmltIHRoZSBsaXN0LiBDYWxsaW5nIGNkZl9tZW1fc2V0KCkgd2l0aCBhIDAKKwkgKiBzaXplIGlzIGdvaW5nIHRvIHRocm93IGFzc2VydHMgb24gdGhlIGRlYnVnIGJ1aWxkcyBzbyBsZXQncyBiZSBhIGJpdAorCSAqIHNtYXJ0ZXIgYWJvdXQgdGhhdC4gWmVybyBvdXQgdGhlIHJlc2V0IG9mIHRoZSBjaGFubmVscyBvbmx5IGlmIHdlCisJICogbmVlZCB0by4gVGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gY2xlYXIgaXMgdGhlIG51bWJlciBvZiBjaGFubmVzbCB0aGF0CisJICogd2UgdHJpbW1lZCAoY2hfbHN0LT5udW1DaGFubmVscyAtIG51bV9jaGFubmVscykgdGltZXMgdGhlIHNpemUgb2YgYQorCSAqIGNoYW5uZWwgaW4gdGhlIHN0cnVjdHVyZS4KKwkgKi8KKwlpZiAoY2hfbHN0LT5udW1DaGFubmVscyA+IG51bV9jaGFubmVscykgeworCQljZGZfbWVtX3NldCgmY2hfbHN0LT5jaGFubmVsTGlzdFtudW1fY2hhbm5lbHNdLAorCQkJICAgIHNpemVvZihjaF9sc3QtPmNoYW5uZWxMaXN0WzBdKSAqCisJCQkgICAgKGNoX2xzdC0+bnVtQ2hhbm5lbHMgLSBudW1fY2hhbm5lbHMpLCAwKTsKKwl9CisJY2hfbHN0LT5udW1DaGFubmVscyA9IG51bV9jaGFubmVsczsKK30KKworLyoqCisgKiBjc3JfcHJ1bmVfY2hhbm5lbF9saXN0X2Zvcl9tb2RlKCkgLSBwcnVuZXMgdGhlIGNoYW5uZWwgbGlzdAorICogQG1hY19jdHg6ICAgICAgIGdsb2JhbCBtYWMgY29udGV4dAorICogQGNoX2xzdDogICAgICAgIGV4aXN0aW5nIGNoYW5uZWwgbGlzdAorICoKKyAqIFBydW5lcyB0aGUgY2hhbm5lbCBsaXN0IGFjY29yZGluZyB0byBiYW5kIHN0b3JlZCBpbiBtYWNfY3R4CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgY3NyX3BydW5lX2NoYW5uZWxfbGlzdF9mb3JfbW9kZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCSAgICAgdENzckNoYW5uZWwgKmNoX2xzdCkKK3sKKwkvKiBmb3IgZHVhbCBiYW5kIE5JQ3MsIGRvbid0IG5lZWQgdG8gdHJpbSB0aGUgY2hhbm5lbCBsaXN0Li4uLiAqLworCWlmIChDU1JfSVNfT1BFQVJUSU5HX0RVQUxfQkFORChtYWNfY3R4KSkKKwkJcmV0dXJuOworCS8qCisJICogMi40IEdIeiBiYW5kIG9wZXJhdGlvbiByZXF1aXJlcyB0aGUgY2hhbm5lbCBsaXN0IHRvIGJlIHRyaW1tZWQgdG8KKwkgKiB0aGUgMi40IEdIeiBjaGFubmVscyBvbmx5CisJICovCisJaWYgKENTUl9JU18yNF9CQU5EX09OTFkobWFjX2N0eCkpCisJCWNzcl9wcnVuZV9jaF9saXN0KGNoX2xzdCwgdHJ1ZSk7CisJZWxzZSBpZiAoQ1NSX0lTXzVHX0JBTkRfT05MWShtYWNfY3R4KSkKKwkJY3NyX3BydW5lX2NoX2xpc3QoY2hfbHN0LCBmYWxzZSk7Cit9CisKKyNkZWZpbmUgSU5GUkFfQVBfREVGQVVMVF9DSEFOTkVMIDYKK0NERl9TVEFUVVMgY3NyX2lzX3ZhbGlkX2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBjaG5OdW0pCit7CisJdWludDhfdCBpbmRleCA9IDA7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9TVVBQT1JUOworCisJLyogcmVndWxhdG9yeSBjaGVjayAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBNYWMtPnNjYW4uYmFzZV9jaGFubmVscy5udW1DaGFubmVsczsKKwkgICAgIGluZGV4KyspIHsKKwkJaWYgKHBNYWMtPnNjYW4uYmFzZV9jaGFubmVscy5jaGFubmVsTGlzdFtpbmRleF0gPT0gY2huTnVtKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChzdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCS8qIGRmcyBub2wgKi8KKwkJZm9yIChpbmRleCA9IDA7CisJCSAgICAgaW5kZXggPAorCQkgICAgIHBNYWMtPnNhcC5TYXBEZnNJbmZvLm51bUN1cnJlbnRSZWdEb21haW5EZnNDaGFubmVsczsKKwkJICAgICBpbmRleCsrKSB7CisJCQl0U2FwRGZzTm9sSW5mbyAqZGZzQ2hhbiA9CisJCQkJJnBNYWMtPnNhcC5TYXBEZnNJbmZvLnNhcERmc0NoYW5uZWxOb2xMaXN0W2luZGV4XTsKKwkJCWlmICgoZGZzQ2hhbi0+ZGZzX2NoYW5uZWxfbnVtYmVyID09IGNobk51bSkKKwkJCSAgICAmJiAoZGZzQ2hhbi0+cmFkYXJfc3RhdHVzX2ZsYWcgPT0KKwkJCQllU0FQX0RGU19DSEFOTkVMX1VOQVZBSUxBQkxFKSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgRkwoImNoYW5uZWwgJWQgaXMgaW4gZGZzIG5vbCIpLAorCQkJCQkgIGNobk51bSk7CisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImNoYW5uZWwgJWQgaXMgbm90IGF2YWlsYWJsZSIpLCBjaG5OdW0pOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX2dldF9jaGFubmVsX2FuZF9wb3dlcl9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdWludDhfdCBudW0yME1IekNoYW5uZWxzRm91bmQgPSAwOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwl1aW50OF90IEluZGV4ID0gMDsKKwl1aW50OF90IG51bTQwTUh6Q2hhbm5lbHNGb3VuZCA9IDA7CisKKwkvKiBUT0RPOiB0aGlzIGludGVyZmFjZSBjaGFuZ2VkIHRvIGluY2x1ZGUgdGhlIDQwTUh6IGNoYW5uZWwgbGlzdCAqLworCS8qIHRoaXMgbmVlZHMgdG8gYmUgdGllZCBpbnRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZSBzb21laG93IGFuZCByZWZlcmVuY2VkIGFwcHJvcHJpYXRlbHkgZm9yIENCIG9wZXJhdGlvbiAqLworCS8qIFJlYWQgdGhlIHNjYW4gY2hhbm5lbCBsaXN0IChpbmNsdWRpbmcgdGhlIHBvd2VyIGxpbWl0KSBmcm9tIEVFUFJPTSAqLworCWNkZl9zdGF0dXMgPQorCQljZHNfZ2V0X2NoYW5uZWxfbGlzdF93aXRoX3Bvd2VyKHBNYWMtPnNjYW4uZGVmYXVsdFBvd2VyVGFibGUsCisJCQkJCQkgICAmbnVtMjBNSHpDaGFubmVsc0ZvdW5kLAorCQkJCQkJICAgcE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZTQwTUh6LAorCQkJCQkJICAgJm51bTQwTUh6Q2hhbm5lbHNGb3VuZCk7CisJaWYgKChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RmX3N0YXR1cykgfHwgKG51bTIwTUh6Q2hhbm5lbHNGb3VuZCA9PSAwKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJmYWlsZWQgdG8gZ2V0IGNoYW5uZWxzICIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfSBlbHNlIHsKKwkJaWYgKG51bTIwTUh6Q2hhbm5lbHNGb3VuZCA+IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTikgeworCQkJbnVtMjBNSHpDaGFubmVsc0ZvdW5kID0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOOworCQl9CisJCXBNYWMtPnNjYW4ubnVtQ2hhbm5lbHNEZWZhdWx0ID0gbnVtMjBNSHpDaGFubmVsc0ZvdW5kOworCQkvKiBNb3ZlIHRoZSBjaGFubmVsIGxpc3QgdG8gdGhlIGdsb2JhbCBkYXRhICovCisJCS8qIHN0cnVjdHVyZSAtLSB0aGlzIHdpbGwgYmUgdXNlZCBhcyB0aGUgc2NhbiBsaXN0ICovCisJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IG51bTIwTUh6Q2hhbm5lbHNGb3VuZDsgSW5kZXgrKykgeworCQkJcE1hYy0+c2Nhbi5iYXNlX2NoYW5uZWxzLmNoYW5uZWxMaXN0W0luZGV4XSA9CisJCQkJcE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZVtJbmRleF0uY2hhbklkOworCQl9CisJCXBNYWMtPnNjYW4uYmFzZV9jaGFubmVscy5udW1DaGFubmVscyA9CisJCQludW0yME1IekNoYW5uZWxzRm91bmQ7CisJCWlmIChudW00ME1IekNoYW5uZWxzRm91bmQgPiBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pIHsKKwkJCW51bTQwTUh6Q2hhbm5lbHNGb3VuZCA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKwkJfQorCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBudW00ME1IekNoYW5uZWxzRm91bmQ7IEluZGV4KyspIHsKKwkJCXBNYWMtPnNjYW4uYmFzZTQwTUh6Q2hhbm5lbHMuY2hhbm5lbExpc3RbSW5kZXhdID0KKwkJCQlwTWFjLT5zY2FuLmRlZmF1bHRQb3dlclRhYmxlNDBNSHpbSW5kZXhdLmNoYW5JZDsKKwkJfQorCQlwTWFjLT5zY2FuLmJhc2U0ME1IekNoYW5uZWxzLm51bUNoYW5uZWxzID0KKwkJCW51bTQwTUh6Q2hhbm5lbHNGb3VuZDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3JfYXBwbHlfY2hhbm5lbF9hbmRfcG93ZXJfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJY3NyX3BydW5lX2NoYW5uZWxfbGlzdF9mb3JfbW9kZShwTWFjLCAmcE1hYy0+c2Nhbi5iYXNlX2NoYW5uZWxzKTsKKwljc3Jfc2F2ZV9jaGFubmVsX3Bvd2VyX2Zvcl9iYW5kKHBNYWMsIGZhbHNlKTsKKwljc3Jfc2F2ZV9jaGFubmVsX3Bvd2VyX2Zvcl9iYW5kKHBNYWMsIHRydWUpOworCS8qIEFwcGx5IHRoZSBiYXNlIGNoYW5uZWwgbGlzdCwgcG93ZXIgaW5mbywgYW5kIHNldCB0aGUgQ291bnRyeSBjb2RlLi4uICovCisJY3NyX2FwcGx5X2NoYW5uZWxfcG93ZXJfaW5mb190b19mdyhwTWFjLAorCQkJCQkgICAmcE1hYy0+c2Nhbi5iYXNlX2NoYW5uZWxzLAorCQkJCQkgICBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCk7CisKKwljc3JfaW5pdF9vcGVyYXRpbmdfY2xhc3NlcygodEhhbEhhbmRsZSkgcE1hYyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3JfY2hhbmdlX2NvbmZpZ19wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgdENzclVwZGF0ZUNvbmZpZ1BhcmFtICpwVXBkYXRlQ29uZmlnUGFyYW0pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0Q3NyMTFkaW5mbyAqcHMxMWRpbmZvID0gTlVMTDsKKwlwczExZGluZm8gPSAmcFVwZGF0ZUNvbmZpZ1BhcmFtLT5Dc3IxMWRpbmZvOworCXN0YXR1cyA9IGNzcl9pbml0MTFkX2luZm8ocE1hYywgcHMxMWRpbmZvKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgQ0RGX1NUQVRVUyBjc3JfaW5pdDExZF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3IxMWRpbmZvICpwczExZGluZm8pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl1aW50OF90IGluZGV4OworCXVpbnQzMl90IGNvdW50ID0gMDsKKwl0U2lyTWFjQ2hhbkluZm8gKnBDaGFuSW5mbzsKKwl0U2lyTWFjQ2hhbkluZm8gKnBDaGFuSW5mb1N0YXJ0OworCWJvb2wgYXBwbHlDb25maWcgPSB0cnVlOworCisJcE1hYy0+c2Nhbi5jdXJyZW50Q291bnRyeVJTU0kgPSAtMTI4OworCWlmICghcHMxMWRpbmZvKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChwczExZGluZm8tPkNoYW5uZWxzLm51bUNoYW5uZWxzCisJICAgICYmIChXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4gPj0KKwkJcHMxMWRpbmZvLT5DaGFubmVscy5udW1DaGFubmVscykpIHsKKwkJcE1hYy0+c2Nhbi5iYXNlX2NoYW5uZWxzLm51bUNoYW5uZWxzID0KKwkJCXBzMTFkaW5mby0+Q2hhbm5lbHMubnVtQ2hhbm5lbHM7CisJCWNkZl9tZW1fY29weShwTWFjLT5zY2FuLmJhc2VfY2hhbm5lbHMuY2hhbm5lbExpc3QsCisJCQkgICAgIHBzMTFkaW5mby0+Q2hhbm5lbHMuY2hhbm5lbExpc3QsCisJCQkgICAgIHBzMTFkaW5mby0+Q2hhbm5lbHMubnVtQ2hhbm5lbHMpOworCX0gZWxzZSB7CisJCS8qIE5vIGNoYW5nZSAqLworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKwkvKiBsZWdhY3kgbWFpbnRlbmFuY2UgKi8KKworCWNkZl9tZW1fY29weShwTWFjLT5zY2FuLmNvdW50cnlDb2RlRGVmYXVsdCwgcHMxMWRpbmZvLT5jb3VudHJ5Q29kZSwKKwkJICAgICBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCisJLyogVHVzaDogYXQgY3Nyb3BlbiBnZXQgdGhpcyBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHQsIGR1cmluZyBjc3IgcmVzZXQgaWYgdGhpcyAqLworCS8qIGFscmVhZHkgc2V0IHdpdGggc29tZSB2YWx1ZSBubyBuZWVkIGluaXRpbGFpemUgd2l0aCBkZWZhdWx0IGFnYWluICovCisJaWYgKDAgPT0gcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnRbMF0pIHsKKwkJY2RmX21lbV9jb3B5KHBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LAorCQkJICAgICBwczExZGluZm8tPmNvdW50cnlDb2RlLCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCX0KKwkvKiBuZWVkIHRvIGFkZCB0aGUgbWF4IHBvd2VyIGNoYW5uZWwgbGlzdCAqLworCXBDaGFuSW5mbyA9CisJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyTWFjQ2hhbkluZm8pICoKKwkJCSAgICAgICBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pOworCWlmIChwQ2hhbkluZm8gIT0gTlVMTCkgeworCQljZGZfbWVtX3NldChwQ2hhbkluZm8sCisJCQkgICAgc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbykgKgorCQkJICAgIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTiwgMCk7CisKKwkJcENoYW5JbmZvU3RhcnQgPSBwQ2hhbkluZm87CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBzMTFkaW5mby0+Q2hhbm5lbHMubnVtQ2hhbm5lbHM7CisJCSAgICAgaW5kZXgrKykgeworCQkJcENoYW5JbmZvLT5maXJzdENoYW5OdW0gPQorCQkJCXBzMTFkaW5mby0+Q2huUG93ZXJbaW5kZXhdLmZpcnN0Q2hhbm5lbDsKKwkJCXBDaGFuSW5mby0+bnVtQ2hhbm5lbHMgPQorCQkJCXBzMTFkaW5mby0+Q2huUG93ZXJbaW5kZXhdLm51bUNoYW5uZWxzOworCQkJcENoYW5JbmZvLT5tYXhUeFBvd2VyID0KKwkJCQlDREZfTUlOKHBzMTFkaW5mby0+Q2huUG93ZXJbaW5kZXhdLm1heHR4UG93ZXIsCisJCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublR4UG93ZXJDYXApOworCQkJcENoYW5JbmZvKys7CisJCQljb3VudCsrOworCQl9CisJCWlmIChjb3VudCkgeworCQkJY3NyX3NhdmVfdG9fY2hhbm5lbF9wb3dlcjJfZ181X2cocE1hYywKKwkJCQkJCQkgY291bnQgKgorCQkJCQkJCSBzaXplb2YodFNpck1hY0NoYW5JbmZvKSwKKwkJCQkJCQkgcENoYW5JbmZvU3RhcnQpOworCQl9CisJCWNkZl9tZW1fZnJlZShwQ2hhbkluZm9TdGFydCk7CisJfQorCS8qIE9ubHkgYXBwbHkgdGhlbSB0byBDRkcgd2hlbiBub3QgaW4gU1RPUCBzdGF0ZS4gT3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBhcHBsaWVkIGxhdGVyICovCisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpbmRleCsrKSB7CisJCQlpZiAoKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIGluZGV4KSkKKwkJCSAgICAmJiBDU1JfSVNfUk9BTV9TVE9QKHBNYWMsIGluZGV4KSkgeworCQkJCWFwcGx5Q29uZmlnID0gZmFsc2U7CisJCQl9CisJCX0KKworCQlpZiAodHJ1ZSA9PSBhcHBseUNvbmZpZykgeworCQkJLyogQXBwbHkgdGhlIGJhc2UgY2hhbm5lbCBsaXN0LCBwb3dlciBpbmZvLCBhbmQgc2V0IHRoZSBDb3VudHJ5IGNvZGUuLi4gKi8KKwkJCWNzcl9hcHBseV9jaGFubmVsX3Bvd2VyX2luZm9fdG9fZncocE1hYywKKwkJCQkJCQkgICAmcE1hYy0+c2Nhbi4KKwkJCQkJCQkgICBiYXNlX2NoYW5uZWxzLAorCQkJCQkJCSAgIHBNYWMtPnNjYW4uCisJCQkJCQkJICAgY291bnRyeUNvZGVDdXJyZW50KTsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBJbml0aWFsaXplIHRoZSBDaGFubmVsICsgUG93ZXIgTGlzdCBpbiB0aGUgbG9jYWwgY2FjaGUgYW5kIGluIHRoZSBDRkcgKi8KK0NERl9TVEFUVVMgY3NyX2luaXRfY2hhbm5lbF9wb3dlcl9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3IxMWRpbmZvICpwczExZGluZm8pCit7CisJdWludDhfdCBpbmRleDsKKwl1aW50MzJfdCBjb3VudCA9IDA7CisJdFNpck1hY0NoYW5JbmZvICpwQ2hhbkluZm87CisJdFNpck1hY0NoYW5JbmZvICpwQ2hhbkluZm9TdGFydDsKKworCWlmICghcHMxMWRpbmZvIHx8ICFwTWFjKSB7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwQ2hhbkluZm8gPQorCQljZGZfbWVtX21hbGxvYyhzaXplb2YodFNpck1hY0NoYW5JbmZvKSAqCisJCQkgICAgICAgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOKTsKKwlpZiAocENoYW5JbmZvICE9IE5VTEwpIHsKKwkJY2RmX21lbV9zZXQocENoYW5JbmZvLAorCQkJICAgIHNpemVvZih0U2lyTWFjQ2hhbkluZm8pICoKKwkJCSAgICBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4sIDApOworCQlwQ2hhbkluZm9TdGFydCA9IHBDaGFuSW5mbzsKKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwczExZGluZm8tPkNoYW5uZWxzLm51bUNoYW5uZWxzOworCQkgICAgIGluZGV4KyspIHsKKwkJCXBDaGFuSW5mby0+Zmlyc3RDaGFuTnVtID0KKwkJCQlwczExZGluZm8tPkNoblBvd2VyW2luZGV4XS5maXJzdENoYW5uZWw7CisJCQlwQ2hhbkluZm8tPm51bUNoYW5uZWxzID0KKwkJCQlwczExZGluZm8tPkNoblBvd2VyW2luZGV4XS5udW1DaGFubmVsczsKKwkJCXBDaGFuSW5mby0+bWF4VHhQb3dlciA9CisJCQkJQ0RGX01JTihwczExZGluZm8tPkNoblBvd2VyW2luZGV4XS5tYXh0eFBvd2VyLAorCQkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwKTsKKwkJCXBDaGFuSW5mbysrOworCQkJY291bnQrKzsKKwkJfQorCQlpZiAoY291bnQpIHsKKwkJCWNzcl9zYXZlX3RvX2NoYW5uZWxfcG93ZXIyX2dfNV9nKHBNYWMsCisJCQkJCQkJIGNvdW50ICoKKwkJCQkJCQkgc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbyksCisJCQkJCQkJIHBDaGFuSW5mb1N0YXJ0KTsKKwkJfQorCQljZGZfbWVtX2ZyZWUocENoYW5JbmZvU3RhcnQpOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIHBDb21tYW5kIG1heSBiZSBOVUxMICovCisvKiBQYXNzIGluIHNlc3Npb25JZCBpbiBjYXNlIHBDb21tYW5kIGlzIE5VTEwuIHNlc3Npb25JZCBpcyBub3QgdXNlZCBpbiBjYXNlIHBDb21tYW5kIGlzIG5vdCBOVUxMLiAqLwordm9pZCBjc3Jfcm9hbV9yZW1vdmVfZHVwbGljYXRlX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgICB0U21lQ21kICpwQ29tbWFuZCwKKwkJCQkgICAgICAgZUNzclJvYW1SZWFzb24gZVJvYW1SZWFzb24pCit7CisJdExpc3RFbGVtICpwRW50cnksICpwTmV4dEVudHJ5OworCXRTbWVDbWQgKnBEdXBDb21tYW5kOworCXREYmxMaW5rTGlzdCBsb2NhbExpc3Q7CisKKwljZGZfbWVtX3plcm8oJmxvY2FsTGlzdCwgc2l6ZW9mKHREYmxMaW5rTGlzdCkpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9sbF9vcGVuKHBNYWMtPmhIZGQsICZsb2NhbExpc3QpKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbGVkIHRvIG9wZW4gbGlzdCIpKTsKKwkJcmV0dXJuOworCX0KKwljc3JfbGxfbG9jaygmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0KTsKKwlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCXdoaWxlIChwRW50cnkpIHsKKwkJcE5leHRFbnRyeSA9CisJCQljc3JfbGxfbmV4dCgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBwRW50cnksCisJCQkJICAgIExMX0FDQ0VTU19OT0xPQ0spOworCQlwRHVwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJLyogUmVtb3ZlIHRoZSBwcmV2aW91cyBjb21tYW5kIGlmLi4gKi8KKwkJLyogLSB0aGUgbmV3IHJvYW0gY29tbWFuZCBpcyBmb3IgdGhlIHNhbWUgUm9hbVJlYXNvbi4uLiAqLworCQkvKiAtIHRoZSBuZXcgcm9hbSBjb21tYW5kIGlzIGEgTmV3UHJvZmlsZUxpc3QuICovCisJCS8qIC0gdGhlIG5ldyByb2FtIGNvbW1hbmQgaXMgYSBGb3JjZWQgRGlzc29jICovCisJCS8qIC0gdGhlIG5ldyByb2FtIGNvbW1hbmQgaXMgZnJvbSBhbiA4MDIuMTEgT0lEIChPSURfU1NJRCBvciBPSURfQlNTSUQpLiAqLworCQlpZiAoKHBDb21tYW5kICYmIChwQ29tbWFuZC0+c2Vzc2lvbklkID09IHBEdXBDb21tYW5kLT5zZXNzaW9uSWQpCisJCSAgICAgJiYgKChwQ29tbWFuZC0+Y29tbWFuZCA9PSBwRHVwQ29tbWFuZC0+Y29tbWFuZCkgJiYKKwkJCS8qCisJCQkgKiBUaGlzIHBlZXJtYWMgY2hlY2sgaXMgcmVxdXJpZWQgZm9yIFNvZnRhcC9HTworCQkJICogc2NlbmFyaW9zLiBGb3IgU1RBIHNjZW5hcmlvIGJlbG93IE9SIGNoZWNrIHdpbGwKKwkJCSAqIHN1ZmZpY2UgYXMgcENvbW1hbmQgd2lsbCBhbHdheXMgYmUgTlVMTCBmb3IgU1RBCisJCQkgKiBzY2VuYXJpb3MKKwkJCSAqLworCQkJIChjZGZfbWVtX2NvbXBhcmUKKwkJCQkgIChwRHVwQ29tbWFuZC0+dS5yb2FtQ21kLnBlZXJNYWMsCisJCQkJICBwQ29tbWFuZC0+dS5yb2FtQ21kLnBlZXJNYWMsCisJCQkJICBDREZfTUFDX0FERFJfU0laRSkpCisJCQkgJiYgKHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9PQorCQkJICAgICBwRHVwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24KKwkJCSAgICAgfHwgZUNzckZvcmNlZERpc2Fzc29jID09CisJCQkgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbgorCQkJICAgICB8fCBlQ3NySGRkSXNzdWVkID09CisJCQkgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbikpKQorCQkgICAgfHwKKwkJICAgIC8qIGJlbG93IHRoZSBwQ29tbWFuZCBpcyBOVUxMICovCisJCSAgICAoKHNlc3Npb25JZCA9PSBwRHVwQ29tbWFuZC0+c2Vzc2lvbklkKSAmJgorCQkgICAgIChlU21lQ29tbWFuZFJvYW0gPT0gcER1cENvbW1hbmQtPmNvbW1hbmQpICYmCisJCSAgICAgKChlQ3NyRm9yY2VkRGlzYXNzb2MgPT0gZVJvYW1SZWFzb24pIHx8CisJCSAgICAgIChlQ3NySGRkSXNzdWVkID09IGVSb2FtUmVhc29uKSkKKwkJICAgICkKKwkJICAgICkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiICAgcm9hbVJlYXNvbiA9ICVkIiksCisJCQkJcER1cENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uKTsKKwkJCS8qIFJlbW92ZSB0aGUgJ3N0YWxlJyByb2FtIGNvbW1hbmQgZnJvbSB0aGUgcGVuZGluZyBsaXN0Li4uICovCisJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeQorCQkJCSAgICAoJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwgcEVudHJ5LAorCQkJCSAgICBMTF9BQ0NFU1NfTk9MT0NLKSkgeworCQkJCWNzcl9sbF9pbnNlcnRfdGFpbCgmbG9jYWxMaXN0LCBwRW50cnksCisJCQkJCQkgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCX0KKwkJfQorCQlwRW50cnkgPSBwTmV4dEVudHJ5OworCX0KKwljc3JfbGxfdW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QpOworCisJd2hpbGUgKChwRW50cnkgPSBjc3JfbGxfcmVtb3ZlX2hlYWQoJmxvY2FsTGlzdCwgTExfQUNDRVNTX05PTE9DSykpKSB7CisJCXBEdXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCQkvKiBUZWxsIGNhbGxlciB0aGF0IHRoZSBjb21tYW5kIGlzIGNhbmNlbGxlZCAqLworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHBEdXBDb21tYW5kLT5zZXNzaW9uSWQsIE5VTEwsCisJCQkJICAgICAgIHBEdXBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLAorCQkJCSAgICAgICBlQ1NSX1JPQU1fQ0FOQ0VMTEVELCBlQ1NSX1JPQU1fUkVTVUxUX05PTkUpOworCQljc3JfcmVsZWFzZV9jb21tYW5kX3JvYW0ocE1hYywgcER1cENvbW1hbmQpOworCX0KKwljc3JfbGxfY2xvc2UoJmxvY2FsTGlzdCk7Cit9CisKKy8qKgorICogY3NyX3JvYW1fcG9wdWxhdGVfY2hhbm5lbHMoKSAtIEhlbHBlciBmdW5jdGlvbiB0byBwb3B1bGF0ZSBjaGFubmVscworICogQGJlYWNvbl9pZXM6IHBvaW50ZXIgdG8gYmVhY29uIGllCisgKiBAcm9hbV9pbmZvOiBSb2FtaW5nIHJlbGF0ZWQgaW5mb3JtYXRpb24KKyAqIEBjaGFuMTogY2VudGVyIGZyZXEgMQorICogQGNoYW4yOiBjZW50ZXIgZnJlcTIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaXNzdWUgcG9wdWxhdGUgY2hhbjEgYW5kIGNoYW4yIGJhc2VkIG9uIGJlYWNvbiBpZQorICoKKyAqIFJldHVybjogbm9uZS4KKyAqLworc3RhdGljIHZvaWQgY3NyX3JvYW1fcG9wdWxhdGVfY2hhbm5lbHModERvdDExZkJlYWNvbklFcyAqYmVhY29uX2llcywKKwkJCXRDc3JSb2FtSW5mbyAqcm9hbV9pbmZvLAorCQkJdWludDhfdCAqY2hhbjEsIHVpbnQ4X3QgKmNoYW4yKQoreworCWVQaHlDaGFuQm9uZFN0YXRlIHBoeV9zdGF0ZTsKKwlpZiAoYmVhY29uX2llcy0+VkhUT3BlcmF0aW9uLnByZXNlbnQpIHsKKwkJKmNoYW4xID0gYmVhY29uX2llcy0+VkhUT3BlcmF0aW9uLmNoYW5DZW50ZXJGcmVxU2VnMTsKKwkJKmNoYW4yID0gYmVhY29uX2llcy0+VkhUT3BlcmF0aW9uLmNoYW5DZW50ZXJGcmVxU2VnMjsKKwkJcm9hbV9pbmZvLT5jaGFuX2luZm8uaW5mbyA9IE1PREVfMTFBQ19WSFQ4MDsKKwl9IGVsc2UgaWYgKGJlYWNvbl9pZXMtPkhUSW5mby5wcmVzZW50KSB7CisJCWlmIChiZWFjb25faWVzLT5IVEluZm8ucmVjb21tZW5kZWRUeFdpZHRoU2V0ID09CisJCQllSFRfQ0hBTk5FTF9XSURUSF80ME1IWikgeworCQkJcGh5X3N0YXRlID0gYmVhY29uX2llcy0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisJCQlpZiAocGh5X3N0YXRlID09IFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWSkKKwkJCQkqY2hhbjEgPSBiZWFjb25faWVzLT5IVEluZm8ucHJpbWFyeUNoYW5uZWwgKworCQkJCQkJQ1NSX0NCX0NFTlRFUl9DSEFOTkVMX09GRlNFVDsKKwkJCWVsc2UgaWYgKHBoeV9zdGF0ZSA9PSBQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZKQorCQkJCSpjaGFuMSA9IGJlYWNvbl9pZXMtPkhUSW5mby5wcmltYXJ5Q2hhbm5lbCAtCisJCQkJCQlDU1JfQ0JfQ0VOVEVSX0NIQU5ORUxfT0ZGU0VUOworCQkJZWxzZQorCQkJCSpjaGFuMSA9IGJlYWNvbl9pZXMtPkhUSW5mby5wcmltYXJ5Q2hhbm5lbDsKKworCQkJcm9hbV9pbmZvLT5jaGFuX2luZm8uaW5mbyA9IE1PREVfMTFOQV9IVDQwOworCQl9IGVsc2UgeworCQkJKmNoYW4xID0gYmVhY29uX2llcy0+SFRJbmZvLnByaW1hcnlDaGFubmVsOworCQkJcm9hbV9pbmZvLT5jaGFuX2luZm8uaW5mbyA9IE1PREVfMTFOQV9IVDIwOworCQl9CisJCSpjaGFuMiA9IDA7CisJfSBlbHNlIHsKKwkJKmNoYW4xID0gMDsKKwkJKmNoYW4yID0gMDsKKwkJcm9hbV9pbmZvLT5jaGFuX2luZm8uaW5mbyA9IE1PREVfMTFBOworCX0KK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLCB1aW50MzJfdCByb2FtSWQsCisJCQkJICBlUm9hbUNtZFN0YXR1cyB1MSwgZUNzclJvYW1SZXN1bHQgdTIpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKwl1aW50MzJfdCByc3NpID0gMDsKKwlXTEFOX0hPU1RfRElBR19FVkVOVF9ERUYoY29ubmVjdGlvblN0YXR1cywKKwkJCWhvc3RfZXZlbnRfd2xhbl9zdGF0dXNfcGF5bG9hZF90eXBlKTsKKyNlbmRpZgorCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisJdERvdDExZkJlYWNvbklFcyAqYmVhY29uX2llcyA9IE5VTEw7CisJdWludDhfdCBjaGFuMSwgY2hhbjI7CisKKwlpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiU2Vzc2lvbiBJRDolZCBpcyBub3QgdmFsaWQiLCBzZXNzaW9uSWQpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoZmFsc2UgPT0gcFNlc3Npb24tPnNlc3Npb25BY3RpdmUpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCAiJXMgU2Vzc2lvbiBpcyBub3QgQWN0aXZlIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJc21zX2xvZyhwTWFjLCBMT0c0LCAiUmVjZWl2ZWQgUm9hbUNtZFN0YXR1cyAlZCB3aXRoIFJvYW0gUmVzdWx0ICVkIiwgdTEsCisJCXUyKTsKKworCWlmIChlQ1NSX1JPQU1fQVNTT0NJQVRJT05fQ09NUExFVElPTiA9PSB1MSAmJgorCQkJZUNTUl9ST0FNX1JFU1VMVF9BU1NPQ0lBVEVEID09IHUyICYmIHBSb2FtSW5mbykgeworCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQlGTCgiQXNzb2MgY29tcGxldGUgcmVzdWx0PSVkIHN0YXR1cz0lZCByZWFzb249JWQiKSwKKwkJCXUyLCBwUm9hbUluZm8tPnN0YXR1c0NvZGUsIHBSb2FtSW5mby0+cmVhc29uQ29kZSk7CisJCWJlYWNvbl9pZXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodERvdDExZkJlYWNvbklFcykpOworCQlpZiAoKE5VTEwgIT0gYmVhY29uX2llcykgJiYgKE5VTEwgIT0gcFJvYW1JbmZvLT5wQnNzRGVzYykpIHsKKwkJCXN0YXR1cyA9IGNzcl9wYXJzZV9ic3NfZGVzY3JpcHRpb25faWVzKAorCQkJCQkodEhhbEhhbmRsZSkgcE1hYywgcFJvYW1JbmZvLT5wQnNzRGVzYywKKwkJCQkJYmVhY29uX2llcyk7CisJCQljc3Jfcm9hbV9wb3B1bGF0ZV9jaGFubmVscyhiZWFjb25faWVzLCBwUm9hbUluZm8sCisJCQkJCSZjaGFuMSwgJmNoYW4yKTsKKwkJCWlmICgwICE9IGNoYW4xKQorCQkJCXBSb2FtSW5mby0+Y2hhbl9pbmZvLmJhbmRfY2VudGVyX2ZyZXExID0KKwkJCQkJY2RzX2NoYW5fdG9fZnJlcShjaGFuMSk7CisJCQllbHNlCisJCQkJcFJvYW1JbmZvLT5jaGFuX2luZm8uYmFuZF9jZW50ZXJfZnJlcTEgPSAwOworCQkJaWYgKDAgIT0gY2hhbjIpCisJCQkJcFJvYW1JbmZvLT5jaGFuX2luZm8uYmFuZF9jZW50ZXJfZnJlcTIgPQorCQkJCQljZHNfY2hhbl90b19mcmVxKGNoYW4yKTsKKwkJCWVsc2UKKwkJCQlwUm9hbUluZm8tPmNoYW5faW5mby5iYW5kX2NlbnRlcl9mcmVxMiA9IDA7CisJCX0gZWxzZSB7CisJCQlwUm9hbUluZm8tPmNoYW5faW5mby5iYW5kX2NlbnRlcl9mcmVxMSA9IDA7CisJCQlwUm9hbUluZm8tPmNoYW5faW5mby5iYW5kX2NlbnRlcl9mcmVxMiA9IDA7CisJCQlwUm9hbUluZm8tPmNoYW5faW5mby5pbmZvID0gMDsKKwkJfQorCQlwUm9hbUluZm8tPmNoYW5faW5mby5jaGFuX2lkID0KKwkJCXBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbDsKKwkJcFJvYW1JbmZvLT5jaGFuX2luZm8ubWh6ID0KKwkJCWNkc19jaGFuX3RvX2ZyZXEocFJvYW1JbmZvLT5jaGFuX2luZm8uY2hhbl9pZCk7CisJCXBSb2FtSW5mby0+Y2hhbl9pbmZvLnJlZ19pbmZvXzEgPQorCQkJKGNzcl9nZXRfY2ZnX21heF90eF9wb3dlcihwTWFjLAorCQkJCXBSb2FtSW5mby0+Y2hhbl9pbmZvLmNoYW5faWQpIDw8IDE2KTsKKwkJcFJvYW1JbmZvLT5jaGFuX2luZm8ucmVnX2luZm9fMiA9CisJCQkoY3NyX2dldF9jZmdfbWF4X3R4X3Bvd2VyKHBNYWMsCisJCQkJcFJvYW1JbmZvLT5jaGFuX2luZm8uY2hhbl9pZCkgPDwgOCk7CisJCWNkZl9tZW1fZnJlZShiZWFjb25faWVzKTsKKwl9IGVsc2UgaWYgKCh1MSA9PSBlQ1NSX1JPQU1fRlRfUkVBU1NPQ19GQUlMRUQpCisJCQkmJiAocFNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250KSkgeworCQkvKgorCQkgKiBEZWNyZW1lbnQgYlJlZkFzc29jU3RhcnRDbnQgZm9yIEZUIHJlYXNzb2MgZmFpbHVyZS4KKwkJICogUmVhc29uOiBGb3IgRlQgcmVhc3NvYyBmYWlsdXJlcywgd2UgZmlyc3QgY2FsbAorCQkgKiBjc3Jfcm9hbV9jYWxsX2NhbGxiYWNrIGJlZm9yZSBub3RpZnlpbmcgYSBmYWlsZWQgcm9hbQorCQkgKiBjb21wbGV0aW9uIHRocm91Z2ggY3NyX3JvYW1fY29tcGxldGUuIFRoZSBsYXR0ZXIgaW4KKwkJICogdHVybiBjYWxscyBjc3Jfcm9hbV9wcm9jZXNzX3Jlc3VsdHMgd2hpY2ggdHJpZXMgdG8KKwkJICogb25jZSBhZ2FpbiBjYWxsIGNzcl9yb2FtX2NhbGxfY2FsbGJhY2sgaWYgYlJlZkFzc29jU3RhcnRDbnQKKwkJICogaXMgbm9uLXplcm8uIFNpbmNlIHRoaXMgaXMgcmVkdW5kYW50IGZvciBGVCByZWFzc29jCisJCSAqIGZhaWx1cmUsIGRlY3JlbWVudCBiUmVmQXNzb2NTdGFydENudC4KKwkJICovCisJCXBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudC0tOworCX0gZWxzZSBpZiAodTEgPT0gZUNTUl9ST0FNX1NFVF9DSEFOTkVMX1JTUCAmJiB1MiA9PQorCQkJCWVDU1JfUk9BTV9SRVNVTFRfQ0hBTk5FTF9DSEFOR0VfU1VDQ0VTUykKKwkJcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUub3BlcmF0aW9uQ2hhbm5lbCA9CisJCQlwUm9hbUluZm8tPmNoYW5uZWxDaGFuZ2VSZXNwRXZlbnQtPm5ld0NoYW5uZWxOdW1iZXI7CisKKwlpZiAoTlVMTCAhPSBwU2Vzc2lvbi0+Y2FsbGJhY2spIHsKKwkJaWYgKHBSb2FtSW5mbykgeworCQkJcFJvYW1JbmZvLT5zZXNzaW9uSWQgPSAodWludDhfdCkgc2Vzc2lvbklkOworCQkJLyoKKwkJCSAqIHRoZSByZWFzb25Db2RlIHdpbGwgYmUgcGFzc2VkIHRvIHN1cHBsaWNhbnQgYnkKKwkJCSAqIGNmZzgwMjExX2Rpc2Nvbm5lY3RlZC4gQmFzZWQgb24gdGhlIGRvY3VtZW50LAorCQkJICogdGhlIHJlYXNvbiBjb2RlIHBhc3NlZCB0byBzdXBwbGljYW50IG5lZWRzIHRvIHNldAorCQkJICogdG8gMCBpZiB1bmtub3cuIGVTSVJfQkVBQ09OX01JU1NFRCByZWFzb24gY29kZSBpcyBub3QKKwkJCSAqIHJlY29nbml6YWJsZSBzbyB0aGF0IHdlIHNldCB0byAwIGluc3RlYWQuCisJCQkgKi8KKwkJCXBSb2FtSW5mby0+cmVhc29uQ29kZSA9CisJCQkJKHBSb2FtSW5mby0+cmVhc29uQ29kZSA9PSBlU0lSX0JFQUNPTl9NSVNTRUQpID8KKwkJCQkwIDogcFJvYW1JbmZvLT5yZWFzb25Db2RlOworCQl9CisJCXN0YXR1cyA9IHBTZXNzaW9uLT5jYWxsYmFjayhwU2Vzc2lvbi0+cENvbnRleHQsIHBSb2FtSW5mbywKKwkJCQkJcm9hbUlkLCB1MSwgdTIpOworCX0KKwkvKgorCSAqIEVWRU5UX1dMQU5fU1RBVFVTOiBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fQ09NUExFVElPTiwKKwkgKiAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX0xPU1RMSU5LLAorCSAqICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fRElTQVNTT0NJQVRFRCwKKwkgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCWNkZl9tZW1fc2V0KCZjb25uZWN0aW9uU3RhdHVzLAorCQkJc2l6ZW9mKGhvc3RfZXZlbnRfd2xhbl9zdGF0dXNfcGF5bG9hZF90eXBlKSwgMCk7CisKKwlpZiAoKGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OID09IHUxKQorCQkJJiYgKGVDU1JfUk9BTV9SRVNVTFRfQVNTT0NJQVRFRCA9PSB1MikgJiYgcFJvYW1JbmZvKSB7CisJCWNvbm5lY3Rpb25TdGF0dXMuZXZlbnRJZCA9IGVDU1JfV0xBTl9TVEFUVVNfQ09OTkVDVDsKKwkJY29ubmVjdGlvblN0YXR1cy5ic3NUeXBlID0KKwkJCXBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZS0+QlNTVHlwZTsKKworCQlpZiAoTlVMTCAhPSBwUm9hbUluZm8tPnBCc3NEZXNjKSB7CisJCQljb25uZWN0aW9uU3RhdHVzLnJzc2kgPQorCQkJCXBSb2FtSW5mby0+cEJzc0Rlc2MtPnJzc2kgKiAoLTEpOworCQkJY29ubmVjdGlvblN0YXR1cy5jaGFubmVsID0KKwkJCQlwUm9hbUluZm8tPnBCc3NEZXNjLT5jaGFubmVsSWQ7CisJCX0KKwkJaWYgKGNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfQ1VSUkVOVF9SU1NJLAorCQkJCWNvbm5lY3Rpb25TdGF0dXMucnNzaSkgPT0gZVNJUl9GQUlMVVJFKQorCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJDYW4ndCBwYXNzIFdOSV9DRkdfQ1VSUkVOVF9SU1NJIHRvIGNmZyIpKTsKKworCQljb25uZWN0aW9uU3RhdHVzLnFvc0NhcGFiaWxpdHkgPQorCQkJcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5xb3NDb25uZWN0aW9uOworCQljb25uZWN0aW9uU3RhdHVzLmF1dGhUeXBlID0KKwkJCSh1aW50OF90KSBkaWFnX2F1dGhfdHlwZV9mcm9tX2Nzcl90eXBlKAorCQkJCXBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZS0+QXV0aFR5cGUpOworCQljb25uZWN0aW9uU3RhdHVzLmVuY3J5cHRpb25UeXBlID0KKwkJCSh1aW50OF90KSBkaWFnX2VuY190eXBlX2Zyb21fY3NyX3R5cGUoCisJCQkJcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5FbmNyeXB0aW9uVHlwZSk7CisJCWNkZl9tZW1fY29weShjb25uZWN0aW9uU3RhdHVzLnNzaWQsCisJCQkJcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5TU0lELnNzSWQsIDYpOworCisJCWNvbm5lY3Rpb25TdGF0dXMucmVhc29uID0gZUNTUl9SRUFTT05fVU5TUEVDSUZJRUQ7CisJCWNkZl9tZW1fY29weSgmcE1hYy0+c21lLmV2ZW50UGF5bG9hZCwgJmNvbm5lY3Rpb25TdGF0dXMsCisJCQkJc2l6ZW9mKGhvc3RfZXZlbnRfd2xhbl9zdGF0dXNfcGF5bG9hZF90eXBlKSk7CisJCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmY29ubmVjdGlvblN0YXR1cywKKwkJCQlFVkVOVF9XTEFOX1NUQVRVUyk7CisJfQorCWlmICgoZUNTUl9ST0FNX01JQ19FUlJPUl9JTkQgPT0gdTEpCisJCQl8fCAoZUNTUl9ST0FNX1JFU1VMVF9NSUNfRkFJTFVSRSA9PSB1MikpIHsKKwkJY2RmX21lbV9jb3B5KCZjb25uZWN0aW9uU3RhdHVzLCAmcE1hYy0+c21lLmV2ZW50UGF5bG9hZCwKKwkJCQlzaXplb2YoaG9zdF9ldmVudF93bGFuX3N0YXR1c19wYXlsb2FkX3R5cGUpKTsKKwkJaWYgKElTX1NJUl9TVEFUVVNfU1VDQ0VTUyh3bGFuX2NmZ19nZXRfaW50KHBNYWMsCisJCQkJV05JX0NGR19DVVJSRU5UX1JTU0ksICZyc3NpKSkpCisJCQljb25uZWN0aW9uU3RhdHVzLnJzc2kgPSByc3NpOworCisJCWNvbm5lY3Rpb25TdGF0dXMuZXZlbnRJZCA9IGVDU1JfV0xBTl9TVEFUVVNfRElTQ09OTkVDVDsKKwkJY29ubmVjdGlvblN0YXR1cy5yZWFzb24gPSBlQ1NSX1JFQVNPTl9NSUNfRVJST1I7CisJCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmY29ubmVjdGlvblN0YXR1cywKKwkJCQlFVkVOVF9XTEFOX1NUQVRVUyk7CisJfQorCWlmIChlQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCA9PSB1MikgeworCQljZGZfbWVtX2NvcHkoJmNvbm5lY3Rpb25TdGF0dXMsICZwTWFjLT5zbWUuZXZlbnRQYXlsb2FkLAorCQkJCXNpemVvZihob3N0X2V2ZW50X3dsYW5fc3RhdHVzX3BheWxvYWRfdHlwZSkpOworCQlpZiAoSVNfU0lSX1NUQVRVU19TVUNDRVNTKHdsYW5fY2ZnX2dldF9pbnQocE1hYywKKwkJCQlXTklfQ0ZHX0NVUlJFTlRfUlNTSSwgJnJzc2kpKSkKKwkJCWNvbm5lY3Rpb25TdGF0dXMucnNzaSA9IHJzc2k7CisKKwkJY29ubmVjdGlvblN0YXR1cy5ldmVudElkID0gZUNTUl9XTEFOX1NUQVRVU19ESVNDT05ORUNUOworCQljb25uZWN0aW9uU3RhdHVzLnJlYXNvbiA9IGVDU1JfUkVBU09OX1VTRVJfUkVRVUVTVEVEOworCQlXTEFOX0hPU1RfRElBR19FVkVOVF9SRVBPUlQoJmNvbm5lY3Rpb25TdGF0dXMsCisJCQkJRVZFTlRfV0xBTl9TVEFUVVMpOworCX0KKwlpZiAoZUNTUl9ST0FNX1JFU1VMVF9ESVNBU1NPQ19JTkQgPT0gdTIpIHsKKwkJY2RmX21lbV9jb3B5KCZjb25uZWN0aW9uU3RhdHVzLCAmcE1hYy0+c21lLmV2ZW50UGF5bG9hZCwKKwkJCQlzaXplb2YoaG9zdF9ldmVudF93bGFuX3N0YXR1c19wYXlsb2FkX3R5cGUpKTsKKwkJaWYgKElTX1NJUl9TVEFUVVNfU1VDQ0VTUyh3bGFuX2NmZ19nZXRfaW50KHBNYWMsCisJCQkJV05JX0NGR19DVVJSRU5UX1JTU0ksICZyc3NpKSkpCisJCQljb25uZWN0aW9uU3RhdHVzLnJzc2kgPSByc3NpOworCisJCWNvbm5lY3Rpb25TdGF0dXMuZXZlbnRJZCA9IGVDU1JfV0xBTl9TVEFUVVNfRElTQ09OTkVDVDsKKwkJY29ubmVjdGlvblN0YXR1cy5yZWFzb24gPSBlQ1NSX1JFQVNPTl9ESVNBU1NPQzsKKwkJaWYgKHBSb2FtSW5mbykKKwkJCWNvbm5lY3Rpb25TdGF0dXMucmVhc29uRGlzY29ubmVjdCA9CisJCQkJcFJvYW1JbmZvLT5yZWFzb25Db2RlOworCisJCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmY29ubmVjdGlvblN0YXR1cywKKwkJCQlFVkVOVF9XTEFOX1NUQVRVUyk7CisJfQorCWlmIChlQ1NSX1JPQU1fUkVTVUxUX0RFQVVUSF9JTkQgPT0gdTIpIHsKKwkJY2RmX21lbV9jb3B5KCZjb25uZWN0aW9uU3RhdHVzLCAmcE1hYy0+c21lLmV2ZW50UGF5bG9hZCwKKwkJCQlzaXplb2YoaG9zdF9ldmVudF93bGFuX3N0YXR1c19wYXlsb2FkX3R5cGUpKTsKKwkJaWYgKElTX1NJUl9TVEFUVVNfU1VDQ0VTUyh3bGFuX2NmZ19nZXRfaW50KHBNYWMsCisJCQkJV05JX0NGR19DVVJSRU5UX1JTU0ksICZyc3NpKSkpCisJCQljb25uZWN0aW9uU3RhdHVzLnJzc2kgPSByc3NpOworCisJCWNvbm5lY3Rpb25TdGF0dXMuZXZlbnRJZCA9IGVDU1JfV0xBTl9TVEFUVVNfRElTQ09OTkVDVDsKKwkJY29ubmVjdGlvblN0YXR1cy5yZWFzb24gPSBlQ1NSX1JFQVNPTl9ERUFVVEg7CisJCWlmIChwUm9hbUluZm8pCisJCQljb25uZWN0aW9uU3RhdHVzLnJlYXNvbkRpc2Nvbm5lY3QgPQorCQkJCXBSb2FtSW5mby0+cmVhc29uQ29kZTsKKwkJV0xBTl9IT1NUX0RJQUdfRVZFTlRfUkVQT1JUKCZjb25uZWN0aW9uU3RhdHVzLAorCQkJCUVWRU5UX1dMQU5fU1RBVFVTKTsKKwl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IgKi8KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBSZXR1cm5zIHdoZXRoZXIgaGFuZG9mZiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3Mgb3Igbm90ICovCitib29sIGNzcl9yb2FtX2lzX2hhbmRvZmZfaW5fcHJvZ3Jlc3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKwlyZXR1cm4gY3NyX25laWdoYm9yX3JvYW1faXNfaGFuZG9mZl9pbl9wcm9ncmVzcyhwTWFjLCBzZXNzaW9uSWQpOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9pc3N1ZV9kaXNhc3NvY2lhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgICBlQ3NyUm9hbVN1YlN0YXRlIE5ld1N1YnN0YXRlLAorCQkJCSAgICAgICBib29sIGZNSUNGYWlsdXJlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzSWQgPSBDREZfTUFDX0FERFJfQlJPQURDQVNUX0lOSVRJQUxJWkVSOworCXVpbnQxNl90IHJlYXNvbkNvZGU7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKGZNSUNGYWlsdXJlKSB7CisJCXJlYXNvbkNvZGUgPSBlU0lSX01BQ19NSUNfRkFJTFVSRV9SRUFTT047CisJfSBlbHNlIGlmIChOZXdTdWJzdGF0ZSA9PSBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfSEFORE9GRikgeworCQlyZWFzb25Db2RlID0gZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0ZUSEFORE9GRl9SRUFTT047CisJfSBlbHNlIGlmIChlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfU1RBX0hBU19MRUZUID09IE5ld1N1YnN0YXRlKSB7CisJCXJlYXNvbkNvZGUgPSBlU0lSX01BQ19ESVNBU1NPQ19MRUFWSU5HX0JTU19SRUFTT047CisJCU5ld1N1YnN0YXRlID0gZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0ZPUkNFRDsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwKKwkJCQkgICgic2V0IHRvIHJlYXNvbiBjb2RlIGVTSVJfTUFDX0RJU0FTU09DX0xFQVZJTkdfQlNTX1JFQVNPTiIKKwkJCQkgICIgYW5kIHNldCBiYWNrIE5ld1N1YnN0YXRlIikpOworCX0gZWxzZSB7CisJCXJlYXNvbkNvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT047CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJaWYgKChjc3Jfcm9hbV9pc19oYW5kb2ZmX2luX3Byb2dyZXNzKHBNYWMsIHNlc3Npb25JZCkpICYmCisJICAgIChOZXdTdWJzdGF0ZSAhPSBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfSEFORE9GRikpIHsKKwkJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9CisJCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisJCWNkZl9jb3B5X21hY2FkZHIoJmJzc0lkLAorCQkJICAgICAgcE5laWdoYm9yUm9hbUluZm8tPmNzck5laWdoYm9yUm9hbVByb2ZpbGUuQlNTSURzLgorCQkJICAgICAgYnNzaWQpOworCX0gZWxzZQorI2VuZGlmCisJaWYgKHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpIHsKKwkJY2RmX21lbV9jb3B5KCZic3NJZC5ieXRlcywgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+YnNzSWQsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJfQorCisJc21zX2xvZyhwTWFjLCBMT0cyLAorCQlGTCgiQ1NSIEF0dGVtcHRpbmcgdG8gRGlzYXNzb2NpYXRlIEJzc2lkPSIgTUFDX0FERFJFU1NfU1RSCisJCSAgICIgc3ViU3RhdGUgPSAlcyByZWFzb249JWQiKSwgTUFDX0FERFJfQVJSQVkoYnNzSWQuYnl0ZXMpLAorCQltYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3ViX3N0YXRlKE5ld1N1YnN0YXRlKSwgcmVhc29uQ29kZSk7CisKKwljc3Jfcm9hbV9zdWJzdGF0ZV9jaGFuZ2UocE1hYywgTmV3U3Vic3RhdGUsIHNlc3Npb25JZCk7CisKKwlzdGF0dXMgPSBjc3Jfc2VuZF9tYl9kaXNhc3NvY19yZXFfbXNnKHBNYWMsIHNlc3Npb25JZCwgYnNzSWQuYnl0ZXMsCisJCQkJCQlyZWFzb25Db2RlKTsKKworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljc3Jfcm9hbV9saW5rX2Rvd24ocE1hYywgc2Vzc2lvbklkKTsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisJCS8qIG5vIG5lZWQgdG8gdGVsbCBRb1MgdGhhdCB3ZSBhcmUgZGlzYXNzb2NpYXRpbmcsIGl0IHdpbGwgYmUgdGFrZW4gY2FyZSBvZmYgaW4gYXNzb2MgcmVxIGZvciBITyAqLworCQlpZiAoZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hBTkRPRkYgIT0gTmV3U3Vic3RhdGUpIHsKKwkJCS8qIG5vdGlmeSBRb1MgbW9kdWxlIHRoYXQgZGlzYXNzb2MgaGFwcGVuaW5nICovCisJCQlzbWVfcW9zX2Nzcl9ldmVudF9pbmQocE1hYywgKHVpbnQ4X3QpIHNlc3Npb25JZCwKKwkJCQkJICAgICAgU01FX1FPU19DU1JfRElTQ09OTkVDVF9SRVEsIE5VTEwpOworCQl9CisjZW5kaWYKKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQlGTCgiY3NyX3NlbmRfbWJfZGlzYXNzb2NfcmVxX21zZyBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiKSwKKwkJCXN0YXR1cyk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZV9zdGFfY21kCisgICAgXGJyaWVmIGNzciBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBkaXNhc3NvY2lhdGUgYSBhc3NvY2lhdGVkIHN0YXRpb24KKyAgICBccGFyYW0gc2Vzc2lvbklkICAgIC0gc2Vzc2lvbiBJZCBmb3IgU29mdCBBUAorICAgIFxwYXJhbSBwUGVlck1hY0FkZHIgLSBNQUMgb2YgYXNzb2NpYXRlZCBzdGF0aW9uIHRvIGRlbGV0ZQorICAgIFxwYXJhbSByZWFzb24gLSByZWFzb24gY29kZSwgYmUgb25lIG9mIHRoZSB0U2lyTWFjUmVhc29uQ29kZXMKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZV9zdGFfY21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgICBjb25zdCB1aW50OF90ICpwUGVlck1hY0FkZHIsCisJCQkJCSAgICAgICB1aW50MzJfdCByZWFzb24pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNtZUNtZCAqcENvbW1hbmQ7CisKKwlkbyB7CisJCXBDb21tYW5kID0gY3NyX2dldF9jb21tYW5kX2J1ZmZlcihwTWFjKTsKKwkJaWYgKCFwQ29tbWFuZCkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gZ2V0IGNvbW1hbmQgYnVmZmVyIikpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwkJCWJyZWFrOworCQl9CisJCXBDb21tYW5kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRSb2FtOworCQlwQ29tbWFuZC0+c2Vzc2lvbklkID0gKHVpbnQ4X3QpIHNlc3Npb25JZDsKKwkJcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uID0gZUNzckZvcmNlZERpc2Fzc29jU3RhOworCQljZGZfbWVtX2NvcHkocENvbW1hbmQtPnUucm9hbUNtZC5wZWVyTWFjLCBwUGVlck1hY0FkZHIsIDYpOworCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJlYXNvbiA9ICh0U2lyTWFjUmVhc29uQ29kZXMpIHJlYXNvbjsKKwkJc3RhdHVzID0gY3NyX3F1ZXVlX3NtZV9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCBmYWxzZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkIiksIHN0YXR1cyk7CisJCQljc3JfcmVsZWFzZV9jb21tYW5kX3JvYW0ocE1hYywgcENvbW1hbmQpOworCQl9CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNzcl9yb2FtX2lzc3VlX2RlYXV0aFN0YSgpIC0gZGVsZXRlIGEgYXNzb2NpYXRlZCBzdGF0aW9uCisgKiBAc2Vzc2lvbklkOiAgICAgU2Vzc2lvbiBJZCBmb3IgU29mdCBBUAorICogQHBEZWxTdGFQYXJhbXM6IFBvaW50ZXIgdG8gcGFyYW1ldGVycyBvZiB0aGUgc3RhdGlvbiB0byBkZWF1dGhlbnRpY2F0ZQorICoKKyAqIENTUiBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBkZWxldGUgYSBhc3NvY2lhdGVkIHN0YXRpb24KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzIG9yIGFub3RoZXIgQ0RGX1NUQVRVU18qIG9uIGVycm9yCisgKi8KK0NERl9TVEFUVVMgY3NyX3JvYW1faXNzdWVfZGVhdXRoX3N0YV9jbWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDMyX3Qgc2Vzc2lvbklkLAorCQlzdHJ1Y3QgdGFnQ3NyRGVsU3RhUGFyYW1zICpwRGVsU3RhUGFyYW1zKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTbWVDbWQgKnBDb21tYW5kOworCisJZG8geworCQlwQ29tbWFuZCA9IGNzcl9nZXRfY29tbWFuZF9idWZmZXIocE1hYyk7CisJCWlmICghcENvbW1hbmQpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIGdldCBjb21tYW5kIGJ1ZmZlciIpKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJCQlicmVhazsKKwkJfQorCQlwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kUm9hbTsKKwkJcENvbW1hbmQtPnNlc3Npb25JZCA9ICh1aW50OF90KSBzZXNzaW9uSWQ7CisJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IGVDc3JGb3JjZWREZWF1dGhTdGE7CisJCWNkZl9tZW1fY29weShwQ29tbWFuZC0+dS5yb2FtQ21kLnBlZXJNYWMsCisJCQkgICAgIHBEZWxTdGFQYXJhbXMtPnBlZXJNYWNBZGRyLmJ5dGVzLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcENvbW1hbmQtPnUucm9hbUNtZC5yZWFzb24gPQorCQkJKHRTaXJNYWNSZWFzb25Db2RlcylwRGVsU3RhUGFyYW1zLT5yZWFzb25fY29kZTsKKwkJc3RhdHVzID0gY3NyX3F1ZXVlX3NtZV9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCBmYWxzZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkIiksIHN0YXR1cyk7CisJCQljc3JfcmVsZWFzZV9jb21tYW5kX3JvYW0ocE1hYywgcENvbW1hbmQpOworCQl9CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTCitjc3Jfcm9hbV9pc3N1ZV90a2lwX2NvdW50ZXJfbWVhc3VyZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgYm9vbCBiRW5hYmxlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJc3RydWN0IGNkZl9tYWNfYWRkciBic3NJZCA9IENERl9NQUNfQUREUl9CUk9BRENBU1RfSU5JVElBTElaRVI7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJImNzcl9yb2FtX2lzc3VlX3RraXBfY291bnRlcl9tZWFzdXJlczpDU1IgU2Vzc2lvbiBub3QgZm91bmQiKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpIHsKKwkJY2RmX21lbV9jb3B5KGJzc0lkLmJ5dGVzLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5ic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiY3NyX3JvYW1faXNzdWVfdGtpcF9jb3VudGVyX21lYXN1cmVzOkNvbm5lY3RlZCBCU1MgRGVzY3JpcHRpb24gaW4gQ1NSIFNlc3Npb24gbm90IGZvdW5kIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXNtc19sb2cocE1hYywgTE9HMiwKKwkJIkNTUiBpc3N1aW5nIHRraXAgY291bnRlciBtZWFzdXJlcyBmb3IgQnNzaWQgPSAiIE1BQ19BRERSRVNTX1NUUgorCQkiLCBFbmFibGUgPSAlZCIsIE1BQ19BRERSX0FSUkFZKGJzc0lkLmJ5dGVzKSwgYkVuYWJsZSk7CisJc3RhdHVzID0KKwkJY3NyX3NlbmRfbWJfdGtpcF9jb3VudGVyX21lYXN1cmVzX3JlcV9tc2cocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCWJFbmFibGUsIGJzc0lkLmJ5dGVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTCitjc3Jfcm9hbV9nZXRfYXNzb2NpYXRlZF9zdGFzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCSAgICAgQ0RGX01PRFVMRV9JRCBtb2RJZCwgdm9pZCAqcFVzckNvbnRleHQsCisJCQkgICAgIHZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssIHVpbnQ4X3QgKnBBc3NvY1N0YXNCdWYpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJc3RydWN0IGNkZl9tYWNfYWRkciBic3NJZCA9IENERl9NQUNfQUREUl9CUk9BRENBU1RfSU5JVElBTElaRVI7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJImNzcl9yb2FtX2dldF9hc3NvY2lhdGVkX3N0YXM6Q1NSIFNlc3Npb24gbm90IGZvdW5kIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjKSB7CisJCWNkZl9tZW1fY29weShic3NJZC5ieXRlcywgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+YnNzSWQsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJImNzcl9yb2FtX2dldF9hc3NvY2lhdGVkX3N0YXM6Q29ubmVjdGVkIEJTUyBEZXNjcmlwdGlvbiBpbiBDU1IgU2Vzc2lvbiBub3QgZm91bmQiKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJc21zX2xvZyhwTWFjLCBMT0cyLAorCQkiQ1NSIGdldHRpbmcgYXNzb2NpYXRlZCBzdGF0aW9ucyBmb3IgQnNzaWQgPSAiIE1BQ19BRERSRVNTX1NUUiwKKwkJTUFDX0FERFJfQVJSQVkoYnNzSWQuYnl0ZXMpKTsKKwlzdGF0dXMgPQorCQljc3Jfc2VuZF9tYl9nZXRfYXNzb2NpYXRlZF9zdGFzX3JlcV9tc2cocE1hYywgc2Vzc2lvbklkLCBtb2RJZCwKKwkJCQkJCQlic3NJZC5ieXRlcywKKwkJCQkJCQlwVXNyQ29udGV4dCwKKwkJCQkJCQlwZm5TYXBFdmVudENhbGxiYWNrLAorCQkJCQkJCXBBc3NvY1N0YXNCdWYpOworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMKK2Nzcl9yb2FtX2dldF93cHNfc2Vzc2lvbl9vdmVybGFwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgdm9pZCAqcFVzckNvbnRleHQsIHZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssCisJCQkJIHN0cnVjdCBjZGZfbWFjX2FkZHIgcFJlbW92ZU1hYykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkID0gQ0RGX01BQ19BRERSX0JST0FEQ0FTVF9JTklUSUFMSVpFUjsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJjc3Jfcm9hbV9nZXRfd3BzX3Nlc3Npb25fb3ZlcmxhcDpDU1IgU2Vzc2lvbiBub3QgZm91bmQiKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpIHsKKwkJY2RmX21lbV9jb3B5KGJzc0lkLmJ5dGVzLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5ic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiY3NyX3JvYW1fZ2V0X3dwc19zZXNzaW9uX292ZXJsYXA6Q29ubmVjdGVkIEJTUyBEZXNjcmlwdGlvbiBpbiBDU1IgU2Vzc2lvbiBub3QgZm91bmQiKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJc21zX2xvZyhwTWFjLCBMT0cyLAorCQkiQ1NSIGdldHRpbmcgV1BTIFNlc3Npb24gT3ZlcmxhcCBmb3IgQnNzaWQgPSAiIE1BQ19BRERSRVNTX1NUUiwKKwkJTUFDX0FERFJfQVJSQVkoYnNzSWQuYnl0ZXMpKTsKKworCXN0YXR1cyA9CisJCWNzcl9zZW5kX21iX2dldF93cHNwYmNfc2Vzc2lvbnMocE1hYywgc2Vzc2lvbklkLCBic3NJZC5ieXRlcywgcFVzckNvbnRleHQsCisJCQkJCQlwZm5TYXBFdmVudENhbGxiYWNrLCBwUmVtb3ZlTWFjKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1faXNzdWVfZGVhdXRoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgZUNzclJvYW1TdWJTdGF0ZSBOZXdTdWJzdGF0ZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkID0gQ0RGX01BQ19BRERSX0JST0FEQ0FTVF9JTklUSUFMSVpFUjsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYykgeworCQljZGZfbWVtX2NvcHkoYnNzSWQuYnl0ZXMsIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MtPmJzc0lkLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCX0KKwlzbXNfbG9nKHBNYWMsIExPRzIsICJDU1IgQXR0ZW1wdGluZyB0byBEZWF1dGggQnNzaWQ9ICIgTUFDX0FERFJFU1NfU1RSLAorCQlNQUNfQUREUl9BUlJBWShic3NJZC5ieXRlcykpOworCWNzcl9yb2FtX3N1YnN0YXRlX2NoYW5nZShwTWFjLCBOZXdTdWJzdGF0ZSwgc2Vzc2lvbklkKTsKKworCXN0YXR1cyA9CisJCWNzcl9zZW5kX21iX2RlYXV0aF9yZXFfbXNnKHBNYWMsIHNlc3Npb25JZCwgYnNzSWQuYnl0ZXMsCisJCQkJCSAgIGVTSVJfTUFDX0RFQVVUSF9MRUFWSU5HX0JTU19SRUFTT04pOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJY3NyX3JvYW1fbGlua19kb3duKHBNYWMsIHNlc3Npb25JZCk7CisJZWxzZSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJjc3Jfc2VuZF9tYl9kZWF1dGhfcmVxX21zZyBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgU2Vzc2lvbiBJRDogJWQiCisJCQkJTUFDX0FERFJFU1NfU1RSKSwgc3RhdHVzLCBzZXNzaW9uSWQsCisJCQlNQUNfQUREUl9BUlJBWShic3NJZC5ieXRlcykpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fc2F2ZV9jb25uZWN0ZWRfYnNzX2Rlc2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJdWludDMyX3Qgc2l6ZTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwkvKiBJZiBubyBCU1MgZGVzY3JpcHRpb24gd2FzIGZvdW5kIGluIHRoaXMgY29ubmVjdGlvbiAoaGFwcGVucyB3aXRoIHN0YXJ0IElCU1MpLCB0aGVuICovCisJLyogbml4IHRoZSBCU1MgZGVzY3JpcHRpb24gdGhhdCB3ZSBrZWVwIGFyb3VuZCBmb3IgdGhlIGNvbm5lY3RlZCBCU1MpIGFuZCBnZXQgb3V0Li4uICovCisJaWYgKE5VTEwgPT0gcEJzc0Rlc2MpIHsKKwkJY3NyX2ZyZWVfY29ubmVjdF9ic3NfZGVzYyhwTWFjLCBzZXNzaW9uSWQpOworCX0gZWxzZSB7CisJCXNpemUgPSBwQnNzRGVzYy0+bGVuZ3RoICsgc2l6ZW9mKHBCc3NEZXNjLT5sZW5ndGgpOworCQlpZiAoTlVMTCAhPSBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjKSB7CisJCQlpZiAoKChwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5sZW5ndGgpICsKKwkJCSAgICAgc2l6ZW9mKHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MtPmxlbmd0aCkpIDwKKwkJCSAgICBzaXplKSB7CisJCQkJLyogbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV3IEJTUywgcE1hYy0+cm9hbS5wQ29ubmVjdEJzc0Rlc2MgaXMgZnJlZWQgaW5zaWRlICovCisJCQkJY3NyX2ZyZWVfY29ubmVjdF9ic3NfZGVzYyhwTWFjLCBzZXNzaW9uSWQpOworCQkJfQorCQl9CisJCWlmIChOVUxMID09IHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpIHsKKwkJCXBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MgPSBjZGZfbWVtX21hbGxvYyhzaXplKTsKKwkJfQorCQlpZiAoTlVMTCA9PSBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjKQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQllbHNlCisJCQljZGZfbWVtX2NvcHkocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYywgcEJzc0Rlc2MsIHNpemUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX3ByZXBhcmVfYnNzX2NvbmZpZyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJCSAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLAorCQkJCSAgICAgICB0QnNzQ29uZmlnUGFyYW0gKnBCc3NDb25maWcsCisJCQkJICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisJZUNzckNmZ0RvdDExTW9kZSBjZmdEb3QxMU1vZGU7CisJQ0RGX0FTU0VSVChwSWVzICE9IE5VTEwpOworCWlmIChwSWVzID09IE5VTEwpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWNkZl9tZW1fY29weSgmcEJzc0NvbmZpZy0+QnNzQ2FwLCAmcEJzc0Rlc2MtPmNhcGFiaWxpdHlJbmZvLAorCQkgICAgIHNpemVvZih0U2lyTWFjQ2FwYWJpbGl0eUluZm8pKTsKKwkvKiBnZXQgcW9zICovCisJcEJzc0NvbmZpZy0+cW9zVHlwZSA9IGNzcl9nZXRfcW9fc19mcm9tX2Jzc19kZXNjKHBNYWMsIHBCc3NEZXNjLCBwSWVzKTsKKwkvKiBnZXQgU1NJRCAqLworCWlmIChwSWVzLT5TU0lELnByZXNlbnQpIHsKKwkJY2RmX21lbV9jb3B5KCZwQnNzQ29uZmlnLT5TU0lELnNzSWQsIHBJZXMtPlNTSUQuc3NpZCwKKwkJCSAgICAgcEllcy0+U1NJRC5udW1fc3NpZCk7CisJCXBCc3NDb25maWctPlNTSUQubGVuZ3RoID0gcEllcy0+U1NJRC5udW1fc3NpZDsKKwl9IGVsc2UKKwkJcEJzc0NvbmZpZy0+U1NJRC5sZW5ndGggPSAwOworCWlmIChjc3JfaXNfbnVsbHNzaWQocEJzc0NvbmZpZy0+U1NJRC5zc0lkLCBwQnNzQ29uZmlnLT5TU0lELmxlbmd0aCkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiQlNTIGRlc2MgU1NJRCBpcyBhIHdpbGQgY2FyZCIpKTsKKwkJLyogUmV0dXJuIGZhaWxlZCBpZiBwcm9maWxlIGRvZXNuJ3QgaGF2ZSBhbiBTU0lEIGVpdGhlci4gKi8KKwkJaWYgKHBQcm9maWxlLT5TU0lEcy5udW1PZlNTSURzID09IDApIHsKKwkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQlGTCgiQlNTIGRlc2MgYW5kIHByb2ZpbGUgZG9lc24ndCBoYXZlIFNTSUQiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwl9CisJaWYgKENEU19JU19DSEFOTkVMXzVHSFoocEJzc0Rlc2MtPmNoYW5uZWxJZCkpCisJCXBCc3NDb25maWctPmVCYW5kID0gZUNTUl9CQU5EXzVHOworCWVsc2UKKwkJcEJzc0NvbmZpZy0+ZUJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisJCS8qIHBoeW1vZGUgKi8KKwlpZiAoY3NyX2lzX3BoeV9tb2RlX21hdGNoKHBNYWMsIHBQcm9maWxlLT5waHlNb2RlLCBwQnNzRGVzYywKKwkJCQkgIHBQcm9maWxlLCAmY2ZnRG90MTFNb2RlLCBwSWVzKSkgeworCQlwQnNzQ29uZmlnLT51Q2ZnRG90MTFNb2RlID0gY2ZnRG90MTFNb2RlOworCX0gZWxzZSB7CisJCXNtc19sb2cocE1hYywgTE9HVywgIkNhbiBub3QgZmluZCBtYXRjaCBwaHkgbW9kZSIpOworCQkvKiBmb3JjZSBpdCAqLworCQlpZiAoZUNTUl9CQU5EXzI0ID09IHBCc3NDb25maWctPmVCYW5kKQorCQkJcEJzc0NvbmZpZy0+dUNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFHOworCQllbHNlCisJCQlwQnNzQ29uZmlnLT51Q2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE7CisJfQorCS8qIFFvcyAqLworCWlmICgocEJzc0NvbmZpZy0+dUNmZ0RvdDExTW9kZSAhPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTikgJiYKKwkgICAgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uV01NU3VwcG9ydE1vZGUgPT0gZUNzclJvYW1XbW1Ob1FvcykpIHsKKwkJLyoKKwkJICogSm9pbmluZyBCU1MgaXMgbm90IDExbiBjYXBhYmxlIGFuZCBXTU0gaXMgZGlzYWJsZWQgb24gY2xpZW50LgorCQkgKiBEaXNhYmxlIFFvUyBhbmQgV01NCisJCSAqLworCQlwQnNzQ29uZmlnLT5xb3NUeXBlID0gZUNTUl9NRURJVU1fQUNDRVNTX0RDRjsKKwl9CisKKwlpZiAoKChwQnNzQ29uZmlnLT51Q2ZnRG90MTFNb2RlID09IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOKQorCSAgICB8fCAocEJzc0NvbmZpZy0+dUNmZ0RvdDExTW9kZSA9PSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQUMpKQorCQkmJiAoKHBCc3NDb25maWctPnFvc1R5cGUgIT0gZUNTUl9NRURJVU1fQUNDRVNTX1dNTV9lRENGX0RTQ1ApCisJCSAgICB8fCAocEJzc0NvbmZpZy0+cW9zVHlwZSAhPSBlQ1NSX01FRElVTV9BQ0NFU1NfMTFlX0hDRikKKwkJICAgIHx8IChwQnNzQ29uZmlnLT5xb3NUeXBlICE9IGVDU1JfTUVESVVNX0FDQ0VTU18xMWVfZURDRikpKSB7CisJCS8qIEpvaW5pbmcgQlNTIGlzIDExbiBjYXBhYmxlIGFuZCBXTU0gaXMgZGlzYWJsZWQgb24gQVAuICovCisJCS8qIEFzc3VtZSBhbGwgSFQgQVAncyBhcmUgUU9TIEFQJ3MgYW5kIGVuYWJsZSBXTU0gKi8KKwkJcEJzc0NvbmZpZy0+cW9zVHlwZSA9IGVDU1JfTUVESVVNX0FDQ0VTU19XTU1fZURDRl9EU0NQOworCX0KKwkvKiBhdXRoIHR5cGUgKi8KKwlzd2l0Y2ggKHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUpIHsKKwlkZWZhdWx0OgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBOgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBX1BTSzoKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1dQQV9OT05FOgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU06CisJCXBCc3NDb25maWctPmF1dGhUeXBlID0gZVNJUl9PUEVOX1NZU1RFTTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOgorCQlwQnNzQ29uZmlnLT5hdXRoVHlwZSA9IGVTSVJfU0hBUkVEX0tFWTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9BVVRPU1dJVENIOgorCQlwQnNzQ29uZmlnLT5hdXRoVHlwZSA9IGVTSVJfQVVUT19TV0lUQ0g7CisJCWJyZWFrOworCX0KKwkvKiBzaG9ydCBzbG90IHRpbWUgKi8KKwlpZiAoZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUIgIT0gY2ZnRG90MTFNb2RlKQorCQlwQnNzQ29uZmlnLT51U2hvcnRTbG90VGltZSA9CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNob3J0U2xvdFRpbWU7CisJZWxzZQorCQlwQnNzQ29uZmlnLT51U2hvcnRTbG90VGltZSA9IDA7CisKKwlpZiAocEJzc0NvbmZpZy0+QnNzQ2FwLmlic3MpCisJCS8qIFdlIGRvbid0IHN1cHBvcnQgMTFoIG9uIElCU1MgKi8KKwkJcEJzc0NvbmZpZy0+ZjExaFN1cHBvcnQgPSBmYWxzZTsKKwllbHNlCisJCXBCc3NDb25maWctPmYxMWhTdXBwb3J0ID0KKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWhTdXBwb3J0RW5hYmxlZDsKKwkvKiBwb3dlciBjb25zdHJhaW50ICovCisJcEJzc0NvbmZpZy0+dVBvd2VyTGltaXQgPQorCQljc3JfZ2V0MTFoX3Bvd2VyX2NvbnN0cmFpbnQocE1hYywgJnBJZXMtPlBvd2VyQ29uc3RyYWludHMpOworCS8qIGhlYXJ0YmVhdCAqLworCWlmIChDU1JfSVNfMTFBX0JTUyhwQnNzRGVzYykpCisJCXBCc3NDb25maWctPnVIZWFydEJlYXRUaHJlc2ggPQorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5IZWFydGJlYXRUaHJlc2g1MDsKKwllbHNlCisJCXBCc3NDb25maWctPnVIZWFydEJlYXRUaHJlc2ggPQorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5IZWFydGJlYXRUaHJlc2gyNDsKKworCS8qCisJICogSm9pbiB0aW1lb3V0OiBpZiB3ZSBmaW5kIGEgQmVhY29uSW50ZXJ2YWwgaW4gdGhlIEJzc0Rlc2NyaXB0aW9uLAorCSAqIHRoZW4gc2V0IHRoZSBKb2luIFRpbWVvdXQgdG8gYmUgMTAgeCB0aGUgQmVhY29uSW50ZXJ2YWwuCisJICovCisJaWYgKHBCc3NEZXNjLT5iZWFjb25JbnRlcnZhbCkKKwkJLyogTWFrZSBzdXJlIGl0IGlzIGJpZ2dlciB0aGFuIHRoZSBtaW5pbWFsICovCisJCXBCc3NDb25maWctPnVKb2luVGltZU91dCA9CisJCQlDREZfTUFYKDEwICogcEJzc0Rlc2MtPmJlYWNvbkludGVydmFsLAorCQkJCUNTUl9KT0lOX0ZBSUxVUkVfVElNRU9VVF9NSU4pOworCWVsc2UKKwkJcEJzc0NvbmZpZy0+dUpvaW5UaW1lT3V0ID0KKwkJCUNTUl9KT0lOX0ZBSUxVUkVfVElNRU9VVF9ERUZBVUxUOworCS8qIHZhbGlkYXRlIENCICovCisJcEJzc0NvbmZpZy0+Y2JNb2RlID0gY3NyX2dldF9jYl9tb2RlX2Zyb21faWVzKHBNYWMsIHBCc3NEZXNjLT5jaGFubmVsSWQsCisJCQkJCQkgICAgICBwSWVzKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9yb2FtX3ByZXBhcmVfYnNzX2NvbmZpZ19mcm9tX3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCQkgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJCQkJCSAgIHRCc3NDb25maWdQYXJhbSAqCisJCQkJCQkJICAgcEJzc0NvbmZpZywKKwkJCQkJCQkgICB0U2lyQnNzRGVzY3JpcHRpb24gKgorCQkJCQkJCSAgIHBCc3NEZXNjKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVpbnQ4X3Qgb3BlcmF0aW9uQ2hhbm5lbCA9IDA7CisJdWludDhfdCBxQVBpc0VuYWJsZWQgPSBmYWxzZTsKKwkvKiBTU0lEICovCisJcEJzc0NvbmZpZy0+U1NJRC5sZW5ndGggPSAwOworCWlmIChwUHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcykgeworCQkvKiBvbmx5IHVzZSB0aGUgZmlyc3Qgb25lICovCisJCWNkZl9tZW1fY29weSgmcEJzc0NvbmZpZy0+U1NJRCwKKwkJCSAgICAgJnBQcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5TU0lELAorCQkJICAgICBzaXplb2YodFNpck1hY1NTaWQpKTsKKwl9IGVsc2UgeworCQkvKiBTU0lEIG11c3QgcHJlc2VudCAqLworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIFNldHRvbWcgdXAgdGhlIGNhcGFiaWxpdGllcyAqLworCWlmIChjc3JfaXNfYnNzX3R5cGVfaWJzcyhwUHJvZmlsZS0+QlNTVHlwZSkpIHsKKwkJcEJzc0NvbmZpZy0+QnNzQ2FwLmlic3MgPSAxOworCX0gZWxzZSB7CisJCXBCc3NDb25maWctPkJzc0NhcC5lc3MgPSAxOworCX0KKwlpZiAoZUNTUl9FTkNSWVBUX1RZUEVfTk9ORSAhPQorCSAgICBwUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0pIHsKKwkJcEJzc0NvbmZpZy0+QnNzQ2FwLnByaXZhY3kgPSAxOworCX0KKwlwQnNzQ29uZmlnLT5lQmFuZCA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZUJhbmQ7CisJLyogcGh5bW9kZSAqLworCWlmIChwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpIHsKKwkJb3BlcmF0aW9uQ2hhbm5lbCA9IHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXTsKKwl9CisJcEJzc0NvbmZpZy0+dUNmZ0RvdDExTW9kZSA9CisJCWNzcl9yb2FtX2dldF9waHlfbW9kZV9iYW5kX2Zvcl9ic3MocE1hYywgcFByb2ZpbGUsIG9wZXJhdGlvbkNoYW5uZWwsCisJCQkJCQkgICAmcEJzc0NvbmZpZy0+ZUJhbmQpOworCS8qIFFPUyAqLworCS8qIElzIHRoaXMgY29ycmVjdCB0byBhbHdheXMgc2V0IHRvIHRoaXMgLy8gKioqICovCisJaWYgKHBCc3NDb25maWctPkJzc0NhcC5lc3MgPT0gMSkgeworCQkvKkZvciBTb2Z0YXAgY2FzZSBlbmFibGUgV01NICovCisJCWlmIChDU1JfSVNfSU5GUkFfQVAocFByb2ZpbGUpCisJCSAgICAmJiAoZUNzclJvYW1XbW1Ob1FvcyAhPQorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5XTU1TdXBwb3J0TW9kZSkpIHsKKwkJCXFBUGlzRW5hYmxlZCA9IHRydWU7CisJCX0gZWxzZQorCQlpZiAoY3NyX3JvYW1fZ2V0X3Fvc19pbmZvX2Zyb21fYnNzKHBNYWMsIHBCc3NEZXNjKSA9PQorCQkgICAgQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlxQVBpc0VuYWJsZWQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJcUFQaXNFbmFibGVkID0gZmFsc2U7CisJCX0KKwl9IGVsc2UgeworCQlxQVBpc0VuYWJsZWQgPSB0cnVlOworCX0KKwlpZiAoKGVDc3JSb2FtV21tTm9Rb3MgIT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5XTU1TdXBwb3J0TW9kZSAmJgorCSAgICAgcUFQaXNFbmFibGVkKSB8fAorCSAgICAoKGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOID09IHBCc3NDb25maWctPnVDZmdEb3QxMU1vZGUgJiYKKwkgICAgICBxQVBpc0VuYWJsZWQpKSkgeworCQlwQnNzQ29uZmlnLT5xb3NUeXBlID0gZUNTUl9NRURJVU1fQUNDRVNTX1dNTV9lRENGX0RTQ1A7CisJfSBlbHNlIHsKKwkJcEJzc0NvbmZpZy0+cW9zVHlwZSA9IGVDU1JfTUVESVVNX0FDQ0VTU19EQ0Y7CisJfQorCisJLyogYXV0aCB0eXBlICovCisJLyogVGFrZSB0aGUgcHJlZmVycmVkIEF1dGggdHlwZS4gKi8KKwlzd2l0Y2ggKHBQcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSkgeworCWRlZmF1bHQ6CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEE6CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLOgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBX05PTkU6CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTToKKwkJcEJzc0NvbmZpZy0+YXV0aFR5cGUgPSBlU0lSX09QRU5fU1lTVEVNOworCQlicmVhazsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk6CisJCXBCc3NDb25maWctPmF1dGhUeXBlID0gZVNJUl9TSEFSRURfS0VZOworCQlicmVhazsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX0FVVE9TV0lUQ0g6CisJCXBCc3NDb25maWctPmF1dGhUeXBlID0gZVNJUl9BVVRPX1NXSVRDSDsKKwkJYnJlYWs7CisJfQorCS8qIHNob3J0IHNsb3QgdGltZSAqLworCWlmIChXTklfQ0ZHX1BIWV9NT0RFXzExQiAhPSBwQnNzQ29uZmlnLT51Q2ZnRG90MTFNb2RlKSB7CisJCXBCc3NDb25maWctPnVTaG9ydFNsb3RUaW1lID0KKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2hvcnRTbG90VGltZTsKKwl9IGVsc2UgeworCQlwQnNzQ29uZmlnLT51U2hvcnRTbG90VGltZSA9IDA7CisJfQorCS8qIHBvd2VyIGNvbnN0cmFpbnQuIFdlIGRvbid0IHN1cHBvcnQgMTFoIG9uIElCU1MgKi8KKwlwQnNzQ29uZmlnLT5mMTFoU3VwcG9ydCA9IGZhbHNlOworCXBCc3NDb25maWctPnVQb3dlckxpbWl0ID0gMDsKKwkvKiBoZWFydGJlYXQgKi8KKwlpZiAoZUNTUl9CQU5EXzVHID09IHBCc3NDb25maWctPmVCYW5kKSB7CisJCXBCc3NDb25maWctPnVIZWFydEJlYXRUaHJlc2ggPQorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5IZWFydGJlYXRUaHJlc2g1MDsKKwl9IGVsc2UgeworCQlwQnNzQ29uZmlnLT51SGVhcnRCZWF0VGhyZXNoID0KKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSGVhcnRiZWF0VGhyZXNoMjQ7CisJfQorCS8qIEpvaW4gdGltZW91dCAqLworCXBCc3NDb25maWctPnVKb2luVGltZU91dCA9IENTUl9KT0lOX0ZBSUxVUkVfVElNRU9VVF9ERUZBVUxUOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIENERl9TVEFUVVMgY3NyX3JvYW1fZ2V0X3Fvc19pbmZvX2Zyb21fYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXREb3QxMWZCZWFjb25JRXMgKnBJZXMgPSBOVUxMOworCisJZG8geworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUygKKwkJCWNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMoCisJCQkJcE1hYywgcEJzc0Rlc2MsICZwSWVzKSkpIHsKKwkJCS8qIGVyciBtc2cgKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgImNzcl9yb2FtX2dldF9xb3NfaW5mb19mcm9tX2JzcygpIGZhaWxlZCIpOworCQkJYnJlYWs7CisJCX0KKwkJLyogY2hlY2sgaWYgdGhlIEFQIGlzIFFBUCAmIGl0IHN1cHBvcnRzIEFQU0QgKi8KKwkJaWYgKENTUl9JU19RT1NfQlNTKHBJZXMpKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9IHdoaWxlICgwKTsKKworCWlmIChOVUxMICE9IHBJZXMpIHsKKwkJY2RmX21lbV9mcmVlKHBJZXMpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgY3NyX3NldF9jZmdfcHJpdmFjeSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJIGJvb2wgZlByaXZhY3kpCit7CisJLyoKKwkgKiB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBmdW5jdGlvbiBhbmQKKwkgKiB0aGUgY3NyX3NldF9jZmdfcHJpdmFjeUZyb21Qcm9maWxlKCkgaXMgdGhlIHNldHRpbmcgb2YgdGhlIHByaXZhY3kKKwkgKiBDRkcgYmFzZWQgb24gdGhlIGFkdmVydGlzZWQgcHJpdmFjeSBzZXR0aW5nIGZyb20gdGhlIEFQIGZvciBXUEEKKwkgKiBhc3NvY2lhdGlvbnMuIFNlZSBub3RlIGJlbG93IGluIHRoaXMgZnVuY3Rpb24uLi4KKwkgKi8KKwl1aW50MzJfdCBQcml2YWN5RW5hYmxlZCA9IDAsIFJzbkVuYWJsZWQgPSAwLCBXZXBEZWZhdWx0S2V5SWQgPSAwOworCXVpbnQzMl90IFdlcEtleUxlbmd0aCA9IFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfNTsKKwl1aW50MzJfdCBLZXkwTGVuZ3RoID0gMCwgS2V5MUxlbmd0aCA9IDAsIEtleTJMZW5ndGggPSAwLCBLZXkzTGVuZ3RoID0gMDsKKworCS8qIFJlc2VydmUgZm9yIHRoZSBiaWdnZXN0IGtleSAqLworCXVpbnQ4X3QgS2V5MFtXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8xX0xFTl07CisJdWludDhfdCBLZXkxW1dOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzJfTEVOXTsKKwl1aW50OF90IEtleTJbV05JX0NGR19XRVBfREVGQVVMVF9LRVlfM19MRU5dOworCXVpbnQ4X3QgS2V5M1tXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV80X0xFTl07CisKKwlzd2l0Y2ggKHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSkgeworCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfTk9ORToKKwkJLyogZm9yIE5PIGVuY3J5cHRpb24sIHR1cm4gb2ZmIFByaXZhY3kgYW5kIFJzbi4gKi8KKwkJUHJpdmFjeUVuYWJsZWQgPSAwOworCQlSc25FbmFibGVkID0gMDsKKwkJLyogY2xlYXIgb3V0IHRoZSBXRVAga2V5cyB0aGF0IG1heSBiZSBoYW5naW5nIGFyb3VuZC4gKi8KKwkJS2V5MExlbmd0aCA9IDA7CisJCUtleTFMZW5ndGggPSAwOworCQlLZXkyTGVuZ3RoID0gMDsKKwkJS2V5M0xlbmd0aCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk6CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDoKKworCQkvKiBQcml2YWN5IGlzIE9OLiAgTk8gUlNOIGZvciBXZXA0MCBzdGF0aWMga2V5LiAqLworCQlQcml2YWN5RW5hYmxlZCA9IDE7CisJCVJzbkVuYWJsZWQgPSAwOworCQkvKiBTZXQgdGhlIFdlcCBkZWZhdWx0IGtleSBJRC4gKi8KKwkJV2VwRGVmYXVsdEtleUlkID0gcFByb2ZpbGUtPktleXMuZGVmYXVsdEluZGV4OworCQkvKiBXZXAga2V5IHNpemUgaWYgNSBieXRlcyAoNDAgYml0cykuICovCisJCVdlcEtleUxlbmd0aCA9IFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfNTsKKwkJLyoKKwkJICogc2V0IGVuY3J5cHRpb24ga2V5cyBpbiB0aGUgQ0ZHIGRhdGFiYXNlIG9yCisJCSAqIGNsZWFyIHRob3NlIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoaXMgcHJvZmlsZS4KKwkJICovCisJCWlmIChwUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhbMF0pIHsKKwkJCWNkZl9tZW1fY29weShLZXkwLAorCQkJCXBQcm9maWxlLT5LZXlzLktleU1hdGVyaWFsWzBdLAorCQkJCVdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfNSk7CisJCQlLZXkwTGVuZ3RoID0gV05JX0NGR19XRVBfS0VZX0xFTkdUSF81OworCQl9IGVsc2UgeworCQkJS2V5MExlbmd0aCA9IDA7CisJCX0KKworCQlpZiAocFByb2ZpbGUtPktleXMuS2V5TGVuZ3RoWzFdKSB7CisJCQljZGZfbWVtX2NvcHkoS2V5MSwKKwkJCQlwUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFsxXSwKKwkJCQlXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzUpOworCQkJS2V5MUxlbmd0aCA9IFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfNTsKKwkJfSBlbHNlIHsKKwkJCUtleTFMZW5ndGggPSAwOworCQl9CisKKwkJaWYgKHBQcm9maWxlLT5LZXlzLktleUxlbmd0aFsyXSkgeworCQkJY2RmX21lbV9jb3B5KEtleTIsCisJCQkJcFByb2ZpbGUtPktleXMuS2V5TWF0ZXJpYWxbMl0sCisJCQkJV05JX0NGR19XRVBfS0VZX0xFTkdUSF81KTsKKwkJCUtleTJMZW5ndGggPSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzU7CisJCX0gZWxzZSB7CisJCQlLZXkyTGVuZ3RoID0gMDsKKwkJfQorCisJCWlmIChwUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhbM10pIHsKKwkJCWNkZl9tZW1fY29weShLZXkzLAorCQkJCXBQcm9maWxlLT5LZXlzLktleU1hdGVyaWFsWzNdLAorCQkJCVdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfNSk7CisJCQlLZXkzTGVuZ3RoID0gV05JX0NGR19XRVBfS0VZX0xFTkdUSF81OworCQl9IGVsc2UgeworCQkJS2V5M0xlbmd0aCA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk6CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ6CisKKwkJLyogUHJpdmFjeSBpcyBPTi4gIE5PIFJTTiBmb3IgV2VwNDAgc3RhdGljIGtleS4gKi8KKwkJUHJpdmFjeUVuYWJsZWQgPSAxOworCQlSc25FbmFibGVkID0gMDsKKwkJLyogU2V0IHRoZSBXZXAgZGVmYXVsdCBrZXkgSUQuICovCisJCVdlcERlZmF1bHRLZXlJZCA9IHBQcm9maWxlLT5LZXlzLmRlZmF1bHRJbmRleDsKKwkJLyogV2VwIGtleSBzaXplIGlmIDEzIGJ5dGVzICgxMDQgYml0cykuICovCisJCVdlcEtleUxlbmd0aCA9IFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfMTM7CisJCS8qCisJCSAqIHNldCBlbmNyeXB0aW9uIGtleXMgaW4gdGhlIENGRyBkYXRhYmFzZSBvciBjbGVhcgorCQkgKiB0aG9zZSB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGlzIHByb2ZpbGUuCisJCSAqLworCQlpZiAocFByb2ZpbGUtPktleXMuS2V5TGVuZ3RoWzBdKSB7CisJCQljZGZfbWVtX2NvcHkoS2V5MCwKKwkJCQlwUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFswXSwKKwkJCQlXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzKTsKKwkJCUtleTBMZW5ndGggPSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzOworCQl9IGVsc2UgeworCQkJS2V5MExlbmd0aCA9IDA7CisJCX0KKworCQlpZiAocFByb2ZpbGUtPktleXMuS2V5TGVuZ3RoWzFdKSB7CisJCQljZGZfbWVtX2NvcHkoS2V5MSwKKwkJCQlwUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFsxXSwKKwkJCQlXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzKTsKKwkJCUtleTFMZW5ndGggPSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzOworCQl9IGVsc2UgeworCQkJS2V5MUxlbmd0aCA9IDA7CisJCX0KKworCQlpZiAocFByb2ZpbGUtPktleXMuS2V5TGVuZ3RoWzJdKSB7CisJCQljZGZfbWVtX2NvcHkoS2V5MiwKKwkJCQlwUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFsyXSwKKwkJCQlXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzKTsKKwkJCUtleTJMZW5ndGggPSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzOworCQl9IGVsc2UgeworCQkJS2V5Mkxlbmd0aCA9IDA7CisJCX0KKworCQlpZiAocFByb2ZpbGUtPktleXMuS2V5TGVuZ3RoWzNdKSB7CisJCQljZGZfbWVtX2NvcHkoS2V5MywKKwkJCQlwUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFszXSwKKwkJCQlXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzKTsKKwkJCUtleTNMZW5ndGggPSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzOworCQl9IGVsc2UgeworCQkJS2V5M0xlbmd0aCA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1RLSVA6CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM6CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dQSToKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCQkvKgorCQkgKiB0aGlzIGlzIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZAorCQkgKiB0aGUgY3NyX3NldF9jZmdfcHJpdmFjeUZyb21Qcm9maWxlKCkuCisJCSAqIChzZXR0aW5nIG9mIHRoZSBwcml2YWN5IENGRyBiYXNlZCBvbiB0aGUgYWR2ZXJ0aXNlZAorCQkgKiAgcHJpdmFjeSBzZXR0aW5nIGZyb20gQVAgZm9yIFdQQS9XQVBJIGFzc29jaWF0aW9ucykuCisJCSAqLworCQlQcml2YWN5RW5hYmxlZCA9ICgwICE9IGZQcml2YWN5KTsKKwkJLyogdHVybiBvbiBSU04gZW5hYmxlZCBmb3IgV1BBIGFzc29jaWF0aW9ucyAqLworCQlSc25FbmFibGVkID0gMTsKKwkJLyogY2xlYXIgc3RhdGljIFdFUCBrZXlzIHRoYXQgbWF5IGJlIGhhbmdpbmcgYXJvdW5kLiAqLworCQlLZXkwTGVuZ3RoID0gMDsKKwkJS2V5MUxlbmd0aCA9IDA7CisJCUtleTJMZW5ndGggPSAwOworCQlLZXkzTGVuZ3RoID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUHJpdmFjeUVuYWJsZWQgPSAwOworCQlSc25FbmFibGVkID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2ZnX3NldF9pbnQocE1hYywgV05JX0NGR19QUklWQUNZX0VOQUJMRUQsIFByaXZhY3lFbmFibGVkKTsKKwljZmdfc2V0X2ludChwTWFjLCBXTklfQ0ZHX1JTTl9FTkFCTEVELCBSc25FbmFibGVkKTsKKwljZmdfc2V0X3N0cihwTWFjLCBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8xLCBLZXkwLCBLZXkwTGVuZ3RoKTsKKwljZmdfc2V0X3N0cihwTWFjLCBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8yLCBLZXkxLCBLZXkxTGVuZ3RoKTsKKwljZmdfc2V0X3N0cihwTWFjLCBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8zLCBLZXkyLCBLZXkyTGVuZ3RoKTsKKwljZmdfc2V0X3N0cihwTWFjLCBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV80LCBLZXkzLCBLZXkzTGVuZ3RoKTsKKwljZmdfc2V0X2ludChwTWFjLCBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RILCBXZXBLZXlMZW5ndGgpOworCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSUQsIFdlcERlZmF1bHRLZXlJZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNzcl9zZXRfY2ZnX3NzaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY1NTaWQgKnBTU0lEKQoreworCXVpbnQzMl90IGxlbiA9IDA7CisJaWYgKHBTU0lELT5sZW5ndGggPD0gV05JX0NGR19TU0lEX0xFTikgeworCQlsZW4gPSBwU1NJRC0+bGVuZ3RoOworCX0KKwljZmdfc2V0X3N0cihwTWFjLCBXTklfQ0ZHX1NTSUQsICh1aW50OF90ICopIHBTU0lELT5zc0lkLCBsZW4pOworfQorCitDREZfU1RBVFVTIGNzcl9zZXRfcW9zX3RvX2NmZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgICAgICBlQ3NyTWVkaWFBY2Nlc3NUeXBlIHFvc1R5cGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdWludDMyX3QgUW9TRW5hYmxlZDsKKwl1aW50MzJfdCBXbWVFbmFibGVkOworCS8qIHNldCB0aGUgQ0ZHIGVuYWJsZS9kaXNhYmxlIHZhcmlhYmxlcyBiYXNlZCBvbiB0aGUgcW9zVHlwZSBiZWluZyBjb25maWd1cmVkLi4uICovCisJc3dpdGNoIChxb3NUeXBlKSB7CisJY2FzZSBlQ1NSX01FRElVTV9BQ0NFU1NfV01NX2VEQ0ZfODAyZG90MXA6CisJCVFvU0VuYWJsZWQgPSBmYWxzZTsKKwkJV21lRW5hYmxlZCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgZUNTUl9NRURJVU1fQUNDRVNTX1dNTV9lRENGX0RTQ1A6CisJCVFvU0VuYWJsZWQgPSBmYWxzZTsKKwkJV21lRW5hYmxlZCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgZUNTUl9NRURJVU1fQUNDRVNTX1dNTV9lRENGX05vQ2xhc3NpZnk6CisJCVFvU0VuYWJsZWQgPSBmYWxzZTsKKwkJV21lRW5hYmxlZCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgZUNTUl9NRURJVU1fQUNDRVNTXzExZV9lRENGOgorCQlRb1NFbmFibGVkID0gdHJ1ZTsKKwkJV21lRW5hYmxlZCA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIGVDU1JfTUVESVVNX0FDQ0VTU18xMWVfSENGOgorCQlRb1NFbmFibGVkID0gdHJ1ZTsKKwkJV21lRW5hYmxlZCA9IGZhbHNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgZUNTUl9NRURJVU1fQUNDRVNTX0RDRjoKKwkJUW9TRW5hYmxlZCA9IGZhbHNlOworCQlXbWVFbmFibGVkID0gZmFsc2U7CisJCWJyZWFrOworCX0KKwkvKiBzYXZlIHRoZSBXTU0gc2V0dGluZyBmb3IgbGF0ZXIgdXNlICovCisJcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmZXTU1Db25uZWN0aW9uID0gKGJvb2wpIFdtZUVuYWJsZWQ7CisJcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmZRT1NDb25uZWN0aW9uID0gKGJvb2wpIFFvU0VuYWJsZWQ7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIENERl9TVEFUVVMgY3NyX2dldF9yYXRlX3NldCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIGVDc3JQaHlNb2RlIHBoeU1vZGUsCisJCQkJdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywKKwkJCQl0RG90MTFmQmVhY29uSUVzICpwSWVzLAorCQkJCXRTaXJNYWNSYXRlU2V0ICpwT3BSYXRlU2V0LAorCQkJCXRTaXJNYWNSYXRlU2V0ICpwRXhSYXRlU2V0KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJaW50IGk7CisJZUNzckNmZ0RvdDExTW9kZSBjZmdEb3QxMU1vZGU7CisJdWludDhfdCAqcERzdFJhdGU7CisJdWludDE2X3QgcmF0ZUJpdG1hcCA9IDA7CisJY2RmX21lbV9zZXQocE9wUmF0ZVNldCwgc2l6ZW9mKHRTaXJNYWNSYXRlU2V0KSwgMCk7CisJY2RmX21lbV9zZXQocEV4UmF0ZVNldCwgc2l6ZW9mKHRTaXJNYWNSYXRlU2V0KSwgMCk7CisJQ0RGX0FTU0VSVChwSWVzICE9IE5VTEwpOworCisJaWYgKE5VTEwgPT0gcEllcykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJmYWlsZWQgdG8gcGFyc2UgQnNzRGVzYyIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwljc3JfaXNfcGh5X21vZGVfbWF0Y2gocE1hYywgcGh5TW9kZSwgcEJzc0Rlc2MsIHBQcm9maWxlLAorCQkJICAgICAgJmNmZ0RvdDExTW9kZSwgcEllcyk7CisJLyoKKwkgKiBPcmlnaW5hbGx5LCB3ZSB0aG91Z2h0IHRoYXQgZm9yIDExYSBuZXR3b3JrcywgdGhlIDExYSByYXRlcworCSAqIGFyZSBhbHdheXMgaW4gdGhlIE9wZXJhdGlvbmFsIFJhdGUgc2V0ICYgZm9yIDExYiBhbmQgMTFnCisJICogbmV0d29ya3MsIHRoZSAxMWIgcmF0ZXMgYXBwZWFyIGluIHRoZSBPcGVyYXRpb25hbCBSYXRlIHNldC4KKwkgKiBDb25zZXF1ZW50bHksIGluIGVpdGhlciBjYXNlLCB3ZSB3b3VsZCBibGluZGx5IHB1dCB0aGUgcmF0ZXMKKwkgKiB3ZSBzdXBwb3J0IGludG8gb3VyIE9wZXJhdGlvbmFsIFJhdGUgc2V0LgorCSAqIChpbmNsdWRpbmcgdGhlIGJhc2ljIHJhdGVzLCB3aGljaCB3ZSd2ZSBhbHJlYWR5IHZlcmlmaWVkIGFyZQorCSAqIHN1cHBvcnRlZCBlYXJsaWVyIGluIHRoZSByb2FtaW5nIGRlY2lzaW9uKS4KKwkgKiBIb3dldmVyLCBpdCB0dXJucyBvdXQgdGhhdCB0aGlzIGlzIG5vdCBhbHdheXMgdGhlIGNhc2UuCisJICogU29tZSBBUCdzIChlLmcuIEQtTGluayBESS03ODQpIHJhbSAxMWcgcmF0ZXMgaW50byB0aGUKKwkgKiBPcGVyYXRpb25hbCBSYXRlIHNldCB0b28uICBOb3csIHdlJ3JlIGEgbGl0dGxlIG1vcmUgY2FyZWZ1bC4KKwkgKi8KKwlwRHN0UmF0ZSA9IHBPcFJhdGVTZXQtPnJhdGU7CisJaWYgKHBJZXMtPlN1cHBSYXRlcy5wcmVzZW50KSB7CisJCWZvciAoaSA9IDA7IGkgPCBwSWVzLT5TdXBwUmF0ZXMubnVtX3JhdGVzOyBpKyspIHsKKwkJCWlmIChjc3JfcmF0ZXNfaXNfZG90MTFfcmF0ZV9zdXBwb3J0ZWQocE1hYywKKwkJCQlwSWVzLT5TdXBwUmF0ZXMucmF0ZXNbaV0pICYmCisJCQkJIWNzcl9jaGVja19yYXRlX2JpdG1hcCgKKwkJCQkJcEllcy0+U3VwcFJhdGVzLnJhdGVzW2ldLAorCQkJCQlyYXRlQml0bWFwKSkgeworCQkJCWNzcl9hZGRfcmF0ZV9iaXRtYXAocEllcy0+U3VwcFJhdGVzLgorCQkJCQkJICAgIHJhdGVzW2ldLCAmcmF0ZUJpdG1hcCk7CisJCQkJKnBEc3RSYXRlKysgPSBwSWVzLT5TdXBwUmF0ZXMucmF0ZXNbaV07CisJCQkJcE9wUmF0ZVNldC0+bnVtUmF0ZXMrKzsKKwkJCX0KKwkJfQorCX0KKwlpZiAoKGVDU1JfQ0ZHX0RPVDExX01PREVfMTFHID09IGNmZ0RvdDExTW9kZSB8fAorCSAgICBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTiA9PSBjZmdEb3QxMU1vZGUgfHwKKwkgICAgZUNTUl9DRkdfRE9UMTFfTU9ERV9BQkcgPT0gY2ZnRG90MTFNb2RlCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkgICAgfHwgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUFDID09IGNmZ0RvdDExTW9kZQorI2VuZGlmCisJICAgICkgJiYgcEllcy0+RXh0U3VwcFJhdGVzLnByZXNlbnQpIHsKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIGV4dGVuZGVkIHJhdGVzIGluIHRoZSBiZWFjb24sCisJCSAqIHdlIHdpbGwgcmVmbGVjdCB0aG9zZSBleHRlbmRlZCByYXRlcyB0aGF0IHdlIHN1cHBvcnQgaW4gb3VyCisJCSAqIGV4dGVuZGVkIG9wZXJhdGlvbmFsIHJhdGUKKwkJICovCisJCXBEc3RSYXRlID0gcEV4UmF0ZVNldC0+cmF0ZTsKKwkJZm9yIChpID0gMDsgaSA8IHBJZXMtPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXM7IGkrKykgeworCQkJaWYgKGNzcl9yYXRlc19pc19kb3QxMV9yYXRlX3N1cHBvcnRlZChwTWFjLAorCQkJCXBJZXMtPkV4dFN1cHBSYXRlcy5yYXRlc1tpXSkgJiYKKwkJCQkhY3NyX2NoZWNrX3JhdGVfYml0bWFwKAorCQkJCQlwSWVzLT5FeHRTdXBwUmF0ZXMucmF0ZXNbaV0sCisJCQkJCXJhdGVCaXRtYXApKSB7CisJCQkJKnBEc3RSYXRlKysgPSBwSWVzLT5FeHRTdXBwUmF0ZXMucmF0ZXNbaV07CisJCQkJcEV4UmF0ZVNldC0+bnVtUmF0ZXMrKzsKKwkJCX0KKwkJfQorCX0KKwlpZiAocE9wUmF0ZVNldC0+bnVtUmF0ZXMgPiAwIHx8IHBFeFJhdGVTZXQtPm51bVJhdGVzID4gMCkKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGNzcl9zZXRfY2ZnX3JhdGVfc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVDc3JQaHlNb2RlIHBoeU1vZGUsCisJCQkJIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsCisJCQkJIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisJaW50IGk7CisJdWludDhfdCAqcERzdFJhdGU7CisJZUNzckNmZ0RvdDExTW9kZSBjZmdEb3QxMU1vZGU7CisJdWludDhfdCBPcGVyYXRpb25hbFJhdGVzW0NTUl9ET1QxMV9TVVBQT1JURURfUkFURVNfTUFYXTsgICAgICAgIC8qIGxlYXZlIGVub3VnaCByb29tIGZvciB0aGUgbWF4IG51bWJlciBvZiByYXRlcyAqLworCXVpbnQzMl90IE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSAwOworCXVpbnQ4X3QgRXh0ZW5kZWRPcGVyYXRpb25hbFJhdGVzW0NTUl9ET1QxMV9FWFRFTkRFRF9TVVBQT1JURURfUkFURVNfTUFYXTsgICAgICAgLyogbGVhdmUgZW5vdWdoIHJvb20gZm9yIHRoZSBtYXggbnVtYmVyIG9mIHJhdGVzICovCisJdWludDMyX3QgRXh0ZW5kZWRPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0gMDsKKwl1aW50OF90IE1DU1JhdGVJZHhTZXRbU0laRV9PRl9TVVBQT1JURURfTUNTX1NFVF07CisJdWludDMyX3QgTUNTUmF0ZUxlbmd0aCA9IDA7CisJQ0RGX0FTU0VSVChwSWVzICE9IE5VTEwpOworCWlmIChOVUxMICE9IHBJZXMpIHsKKwkJY3NyX2lzX3BoeV9tb2RlX21hdGNoKHBNYWMsIHBoeU1vZGUsIHBCc3NEZXNjLCBwUHJvZmlsZSwKKwkJCQkgICAgICAmY2ZnRG90MTFNb2RlLCBwSWVzKTsKKwkJLyogT3JpZ2luYWxseSwgd2UgdGhvdWdodCB0aGF0IGZvciAxMWEgbmV0d29ya3MsIHRoZSAxMWEgcmF0ZXMgYXJlIGFsd2F5cyAqLworCQkvKiBpbiB0aGUgT3BlcmF0aW9uYWwgUmF0ZSBzZXQgJiBmb3IgMTFiIGFuZCAxMWcgbmV0d29ya3MsIHRoZSAxMWIgcmF0ZXMgKi8KKwkJLyogYXBwZWFyIGluIHRoZSBPcGVyYXRpb25hbCBSYXRlIHNldC4gIENvbnNlcXVlbnRseSwgaW4gZWl0aGVyIGNhc2UsIHdlICovCisJCS8qIHdvdWxkIGJsaW5kbHkgcHV0IHRoZSByYXRlcyB3ZSBzdXBwb3J0IGludG8gb3VyIE9wZXJhdGlvbmFsIFJhdGUgc2V0ICovCisJCS8qIChpbmNsdWRpbmcgdGhlIGJhc2ljIHJhdGVzLCB3aGljaCB3ZSBoYXZlIGFscmVhZHkgdmVyaWZpZWQgYXJlICovCisJCS8qIHN1cHBvcnRlZCBlYXJsaWVyIGluIHRoZSByb2FtaW5nIGRlY2lzaW9uKS4gKi8KKwkJLyogSG93ZXZlciwgaXQgdHVybnMgb3V0IHRoYXQgdGhpcyBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLiAgU29tZSBBUCdzICovCisJCS8qIChlLmcuIEQtTGluayBESS03ODQpIHJhbSAxMWcgcmF0ZXMgaW50byB0aGUgT3BlcmF0aW9uYWwgUmF0ZSBzZXQsICovCisJCS8qIHRvby4gIE5vdywgd2UncmUgYSBsaXR0bGUgbW9yZSBjYXJlZnVsOiAqLworCQlwRHN0UmF0ZSA9IE9wZXJhdGlvbmFsUmF0ZXM7CisJCWlmIChwSWVzLT5TdXBwUmF0ZXMucHJlc2VudCkgeworCQkJZm9yIChpID0gMDsgaSA8IHBJZXMtPlN1cHBSYXRlcy5udW1fcmF0ZXM7IGkrKykgeworCQkJCWlmIChjc3JfcmF0ZXNfaXNfZG90MTFfcmF0ZV9zdXBwb3J0ZWQKKwkJCQkJICAgIChwTWFjLCBwSWVzLT5TdXBwUmF0ZXMucmF0ZXNbaV0pCisJCQkJICAgICYmIChPcGVyYXRpb25hbFJhdGVzTGVuZ3RoIDwKKwkJCQkJQ1NSX0RPVDExX1NVUFBPUlRFRF9SQVRFU19NQVgpKSB7CisJCQkJCSpwRHN0UmF0ZSsrID0gcEllcy0+U3VwcFJhdGVzLnJhdGVzW2ldOworCQkJCQlPcGVyYXRpb25hbFJhdGVzTGVuZ3RoKys7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChlQ1NSX0NGR19ET1QxMV9NT0RFXzExRyA9PSBjZmdEb3QxMU1vZGUgfHwKKwkJICAgIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOID09IGNmZ0RvdDExTW9kZSB8fAorCQkgICAgZUNTUl9DRkdfRE9UMTFfTU9ERV9BQkcgPT0gY2ZnRG90MTFNb2RlKSB7CisJCQkvKiBJZiB0aGVyZSBhcmUgRXh0ZW5kZWQgUmF0ZXMgaW4gdGhlIGJlYWNvbiwgd2Ugd2lsbCByZWZsZWN0IHRob3NlICovCisJCQkvKiBleHRlbmRlZCByYXRlcyB0aGF0IHdlIHN1cHBvcnQgaW4gb3V0IEV4dGVuZGVkIE9wZXJhdGlvbmFsIFJhdGUgKi8KKwkJCS8qIHNldDogKi8KKwkJCXBEc3RSYXRlID0gRXh0ZW5kZWRPcGVyYXRpb25hbFJhdGVzOworCQkJaWYgKHBJZXMtPkV4dFN1cHBSYXRlcy5wcmVzZW50KSB7CisJCQkJZm9yIChpID0gMDsgaSA8IHBJZXMtPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXM7CisJCQkJICAgICBpKyspIHsKKwkJCQkJaWYgKGNzcl9yYXRlc19pc19kb3QxMV9yYXRlX3N1cHBvcnRlZAorCQkJCQkJICAgIChwTWFjLCBwSWVzLT5FeHRTdXBwUmF0ZXMucmF0ZXNbaV0pCisJCQkJCSAgICAmJiAoRXh0ZW5kZWRPcGVyYXRpb25hbFJhdGVzTGVuZ3RoIDwKKwkJCQkJCUNTUl9ET1QxMV9FWFRFTkRFRF9TVVBQT1JURURfUkFURVNfTUFYKSkgeworCQkJCQkJKnBEc3RSYXRlKysgPQorCQkJCQkJCXBJZXMtPkV4dFN1cHBSYXRlcy5yYXRlc1tpXTsKKwkJCQkJCUV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCsrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8qIEVuYWJsZSBwcm9wcmlldGFyeSBNQUMgZmVhdHVyZXMgaWYgcGVlciBub2RlIGlzIEFpcmdvIG5vZGUgYW5kIFNUQSAqLworCQkvKiB1c2VyIHdhbnRzIHRvIHVzZSB0aGVtICovCisJCS8qIEZvciBBTkkgbmV0d29yayBjb21wYW5pb25zLCB3ZSBuZWVkIHRvIHBvcHVsYXRlIHRoZSBwcm9wcmlldGFyeSByYXRlICovCisJCS8qIHNldCB3aXRoIGFueSBwcm9wcmlldGFyeSByYXRlcyB3ZSBmb3VuZCBpbiB0aGUgYmVhY29uLCBvbmx5IGlmIHVzZXIgKi8KKwkJLyogYWxsb3dzIHRoZW0uLi4gKi8KKwkJCS8qIE5vIHByb3ByaWV0YXJ5IG1vZGVzLi4uICovCisJCS8qIEdldCBNQ1MgUmF0ZSAqLworCQlwRHN0UmF0ZSA9IE1DU1JhdGVJZHhTZXQ7CisJCWlmIChwSWVzLT5IVENhcHMucHJlc2VudCkgeworCQkJZm9yIChpID0gMDsgaSA8IFZBTElEX01BWF9NQ1NfSU5ERVg7IGkrKykgeworCQkJCWlmICgodW5zaWduZWQgaW50KXBJZXMtPkhUQ2Fwcy4KKwkJCQkgICAgc3VwcG9ydGVkTUNTU2V0WzBdICYgKDEgPDwgaSkpIHsKKwkJCQkJTUNTUmF0ZUxlbmd0aCsrOworCQkJCQkqcERzdFJhdGUrKyA9IGk7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIFNldCB0aGUgb3BlcmF0aW9uYWwgcmF0ZSBzZXQgQ0ZHIHZhcmlhYmxlcy4uLiAqLworCQljZmdfc2V0X3N0cihwTWFjLCBXTklfQ0ZHX09QRVJBVElPTkFMX1JBVEVfU0VULAorCQkJCU9wZXJhdGlvbmFsUmF0ZXMsIE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGgpOworCQljZmdfc2V0X3N0cihwTWFjLCBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VULAorCQkJCUV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlcywKKwkJCQlFeHRlbmRlZE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGgpOworCQljZmdfc2V0X3N0cihwTWFjLCBXTklfQ0ZHX0NVUlJFTlRfTUNTX1NFVCwgTUNTUmF0ZUlkeFNldCwKKwkJCQlNQ1NSYXRlTGVuZ3RoKTsKKwl9IC8qIFBhcnNpbmcgQlNTRGVzYyAqLworCWVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJmYWlsZWQgdG8gcGFyc2UgQnNzRGVzYyIpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNzcl9zZXRfY2ZnX3JhdGVfc2V0X2Zyb21fcHJvZmlsZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlKQoreworCXRTaXJNYWNSYXRlU2V0SUUgRGVmYXVsdFN1cHBvcnRlZFJhdGVzMTFhID0geyBTSVJfTUFDX1JBVEVTRVRfRUlELAorCQkJCQkJICAgICAgezgsCisJCQkJCQkgICAgICAge1NJUl9NQUNfUkFURV82LAorCQkJCQkJCVNJUl9NQUNfUkFURV85LAorCQkJCQkJCVNJUl9NQUNfUkFURV8xMiwKKwkJCQkJCQlTSVJfTUFDX1JBVEVfMTgsCisJCQkJCQkJU0lSX01BQ19SQVRFXzI0LAorCQkJCQkJCVNJUl9NQUNfUkFURV8zNiwKKwkJCQkJCQlTSVJfTUFDX1JBVEVfNDgsCisJCQkJCQkJU0lSX01BQ19SQVRFXzU0fSB9IH07CisJdFNpck1hY1JhdGVTZXRJRSBEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWIgPSB7IFNJUl9NQUNfUkFURVNFVF9FSUQsCisJCQkJCQkgICAgICB7NCwKKwkJCQkJCSAgICAgICB7U0lSX01BQ19SQVRFXzEsCisJCQkJCQkJU0lSX01BQ19SQVRFXzIsCisJCQkJCQkJU0lSX01BQ19SQVRFXzVfNSwKKwkJCQkJCQlTSVJfTUFDX1JBVEVfMTF9IH0gfTsKKworCXRTaXJNYWNQcm9wUmF0ZVNldCBEZWZhdWx0U3VwcG9ydGVkUHJvcFJhdGVzID0geyAzLAorCQkJCQkJCSB7U0lSX01BQ19SQVRFXzcyLAorCQkJCQkJCSAgU0lSX01BQ19SQVRFXzk2LAorCQkJCQkJCSAgU0lSX01BQ19SQVRFXzEwOH0gfTsKKwllQ3NyQ2ZnRG90MTFNb2RlIGNmZ0RvdDExTW9kZTsKKwllQ3NyQmFuZCBlQmFuZDsKKwkvKiBsZWF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIG1heCBudW1iZXIgb2YgcmF0ZXMgKi8KKwl1aW50OF90IE9wZXJhdGlvbmFsUmF0ZXNbQ1NSX0RPVDExX1NVUFBPUlRFRF9SQVRFU19NQVhdOworCXVpbnQzMl90IE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSAwOworCS8qIGxlYXZlIGVub3VnaCByb29tIGZvciB0aGUgbWF4IG51bWJlciBvZiByYXRlcyAqLworCXVpbnQ4X3QgRXh0ZW5kZWRPcGVyYXRpb25hbFJhdGVzW0NTUl9ET1QxMV9FWFRFTkRFRF9TVVBQT1JURURfUkFURVNfTUFYXTsKKwl1aW50MzJfdCBFeHRlbmRlZE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSAwOworCS8qIGxlYXZlIGVub3VnaCByb29tIGZvciB0aGUgbWF4IG51bWJlciBvZiBwcm9wcmlldGFyeSByYXRlcyAqLworCXVpbnQ4X3QgUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzWzRdOworCXVpbnQzMl90IFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9IDA7CisJdWludDMyX3QgUHJvcFJhdGVzRW5hYmxlID0gMDsKKwl1aW50OF90IG9wZXJhdGlvbkNoYW5uZWwgPSAwOworCWlmIChwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpIHsKKwkJb3BlcmF0aW9uQ2hhbm5lbCA9IHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXTsKKwl9CisJY2ZnRG90MTFNb2RlID0KKwkJY3NyX3JvYW1fZ2V0X3BoeV9tb2RlX2JhbmRfZm9yX2JzcyhwTWFjLCBwUHJvZmlsZSwgb3BlcmF0aW9uQ2hhbm5lbCwKKwkJCQkJCSAgICZlQmFuZCk7CisJLyogRm9yIDExYSBuZXR3b3JrcywgdGhlIDExYSByYXRlcyBnbyBpbnRvIHRoZSBPcGVyYXRpb25hbCBSYXRlIHNldC4gIEZvciAxMWIgYW5kIDExZyAqLworCS8qIG5ldHdvcmtzLCB0aGUgMTFiIHJhdGVzIGFwcGVhciBpbiB0aGUgT3BlcmF0aW9uYWwgUmF0ZSBzZXQuICBJbiBlaXRoZXIgY2FzZSwgKi8KKwkvKiB3ZSBjYW4gYmxpbmRseSBwdXQgdGhlIHJhdGVzIHdlIHN1cHBvcnQgaW50byBvdXIgT3BlcmF0aW9uYWwgUmF0ZSBzZXQgKi8KKwkvKiAoaW5jbHVkaW5nIHRoZSBiYXNpYyByYXRlcywgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IHZlcmlmaWVkIGFyZSBzdXBwb3J0ZWQgKi8KKwkvKiBlYXJsaWVyIGluIHRoZSByb2FtaW5nIGRlY2lzaW9uKS4gKi8KKwlpZiAoZUNTUl9CQU5EXzVHID09IGVCYW5kKSB7CisJCS8qIDExYSByYXRlcyBpbnRvIHRoZSBPcGVyYXRpb25hbCBSYXRlIFNldC4gKi8KKwkJT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9CisJCQlEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWEuc3VwcG9ydGVkUmF0ZVNldC5udW1SYXRlcyAqCisJCQlzaXplb2YoKkRlZmF1bHRTdXBwb3J0ZWRSYXRlczExYS5zdXBwb3J0ZWRSYXRlU2V0LnJhdGUpOworCQljZGZfbWVtX2NvcHkoT3BlcmF0aW9uYWxSYXRlcywKKwkJCSAgICAgRGVmYXVsdFN1cHBvcnRlZFJhdGVzMTFhLnN1cHBvcnRlZFJhdGVTZXQucmF0ZSwKKwkJCSAgICAgT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCk7CisKKwkJLyogTm90aGluZyBpbiB0aGUgRXh0ZW5kZWQgcmF0ZSBzZXQuICovCisJCUV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9IDA7CisJCS8qIHBvcHVsYXRlIHByb3ByaWV0YXJ5IHJhdGVzIGlmIHVzZXIgYWxsb3dzIHRoZW0gKi8KKwkJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQpIHsKKwkJCVByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9CisJCQkJRGVmYXVsdFN1cHBvcnRlZFByb3BSYXRlcy5udW1Qcm9wUmF0ZXMgKgorCQkJCXNpemVvZigqRGVmYXVsdFN1cHBvcnRlZFByb3BSYXRlcy5wcm9wUmF0ZSk7CisJCQljZGZfbWVtX2NvcHkoUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzLAorCQkJCSAgICAgRGVmYXVsdFN1cHBvcnRlZFByb3BSYXRlcy5wcm9wUmF0ZSwKKwkJCQkgICAgIFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCk7CisJCX0gZWxzZSB7CisJCQkvKiBObyBwcm9wcmlldGFyeSBtb2RlcyAqLworCQkJUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0gMDsKKwkJfQorCX0gZWxzZSBpZiAoZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUIgPT0gY2ZnRG90MTFNb2RlKSB7CisJCS8qIDExYiByYXRlcyBpbnRvIHRoZSBPcGVyYXRpb25hbCBSYXRlIFNldC4gKi8KKwkJT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9CisJCQlEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWIuc3VwcG9ydGVkUmF0ZVNldC5udW1SYXRlcyAqCisJCQlzaXplb2YoKkRlZmF1bHRTdXBwb3J0ZWRSYXRlczExYi5zdXBwb3J0ZWRSYXRlU2V0LnJhdGUpOworCQljZGZfbWVtX2NvcHkoT3BlcmF0aW9uYWxSYXRlcywKKwkJCSAgICAgRGVmYXVsdFN1cHBvcnRlZFJhdGVzMTFiLnN1cHBvcnRlZFJhdGVTZXQucmF0ZSwKKwkJCSAgICAgT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCk7CisJCS8qIE5vdGhpbmcgaW4gdGhlIEV4dGVuZGVkIHJhdGUgc2V0LiAqLworCQlFeHRlbmRlZE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSAwOworCQkvKiBObyBwcm9wcmlldGFyeSBtb2RlcyAqLworCQlQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSAwOworCX0gZWxzZSB7CisJCS8qIDExRyAqLworCisJCS8qIDExYiByYXRlcyBpbnRvIHRoZSBPcGVyYXRpb25hbCBSYXRlIFNldC4gKi8KKwkJT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9CisJCQlEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWIuc3VwcG9ydGVkUmF0ZVNldC5udW1SYXRlcyAqCisJCQlzaXplb2YoKkRlZmF1bHRTdXBwb3J0ZWRSYXRlczExYi5zdXBwb3J0ZWRSYXRlU2V0LnJhdGUpOworCQljZGZfbWVtX2NvcHkoT3BlcmF0aW9uYWxSYXRlcywKKwkJCSAgICAgRGVmYXVsdFN1cHBvcnRlZFJhdGVzMTFiLnN1cHBvcnRlZFJhdGVTZXQucmF0ZSwKKwkJCSAgICAgT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCk7CisKKwkJLyogMTFhIHJhdGVzIGdvIGluIHRoZSBFeHRlbmRlZCByYXRlIHNldC4gKi8KKwkJRXh0ZW5kZWRPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0KKwkJCURlZmF1bHRTdXBwb3J0ZWRSYXRlczExYS5zdXBwb3J0ZWRSYXRlU2V0Lm51bVJhdGVzICoKKwkJCXNpemVvZigqRGVmYXVsdFN1cHBvcnRlZFJhdGVzMTFhLnN1cHBvcnRlZFJhdGVTZXQucmF0ZSk7CisJCWNkZl9tZW1fY29weShFeHRlbmRlZE9wZXJhdGlvbmFsUmF0ZXMsCisJCQkgICAgIERlZmF1bHRTdXBwb3J0ZWRSYXRlczExYS5zdXBwb3J0ZWRSYXRlU2V0LnJhdGUsCisJCQkgICAgIEV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCk7CisKKwkJLyogcG9wdWxhdGUgcHJvcHJpZXRhcnkgcmF0ZXMgaWYgdXNlciBhbGxvd3MgdGhlbSAqLworCQlpZiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZCkgeworCQkJUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0KKwkJCQlEZWZhdWx0U3VwcG9ydGVkUHJvcFJhdGVzLm51bVByb3BSYXRlcyAqCisJCQkJc2l6ZW9mKCpEZWZhdWx0U3VwcG9ydGVkUHJvcFJhdGVzLnByb3BSYXRlKTsKKwkJCWNkZl9tZW1fY29weShQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXMsCisJCQkJICAgICBEZWZhdWx0U3VwcG9ydGVkUHJvcFJhdGVzLnByb3BSYXRlLAorCQkJCSAgICAgUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzTGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vIHByb3ByaWV0YXJ5IG1vZGVzICovCisJCQlQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSAwOworCQl9CisJfQorCS8qIHNldCB0aGlzIHRvIDEgaWYgcHJvcC4gcmF0ZXMgbmVlZCB0byBiZSBhZHZlcnRpc2VkIGluIHRvIHRoZSBJQlNTIGJlYWNvbiBhbmQgdXNlciB3YW50cyB0byB1c2UgdGhlbSAqLworCWlmIChQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXNMZW5ndGgKKwkgICAgJiYgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZCkgeworCQlQcm9wUmF0ZXNFbmFibGUgPSAxOworCX0gZWxzZSB7CisJCVByb3BSYXRlc0VuYWJsZSA9IDA7CisJfQorCisJLyogU2V0IHRoZSBvcGVyYXRpb25hbCByYXRlIHNldCBDRkcgdmFyaWFibGVzLi4uICovCisJY2ZnX3NldF9zdHIocE1hYywgV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVCwgT3BlcmF0aW9uYWxSYXRlcywKKwkJCU9wZXJhdGlvbmFsUmF0ZXNMZW5ndGgpOworCWNmZ19zZXRfc3RyKHBNYWMsIFdOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVQsCisJCQlFeHRlbmRlZE9wZXJhdGlvbmFsUmF0ZXMsIEV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCk7CisJY2ZnX3NldF9zdHIocE1hYywgV05JX0NGR19QUk9QUklFVEFSWV9PUEVSQVRJT05BTF9SQVRFX1NFVCwKKwkJCVByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlcywKKwkJCVByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCk7Cit9CisKK3ZvaWQgY3NyX3JvYW1fY2NtX2NmZ19zZXRfY2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywgaW50MzJfdCByZXN1bHQpCit7CisJdExpc3RFbGVtICpwRW50cnkgPQorCQljc3JfbGxfcGVla19oZWFkKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0spOworCXVpbnQzMl90IHNlc3Npb25JZDsKKwl0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBOVUxMOworI2VuZGlmCisJaWYgKE5VTEwgPT0gcEVudHJ5KSB7CisJCXNtc19sb2cocE1hYywgTE9HVywgIkNGR19DTkYgd2l0aCBhY3RpdmUgbGlzdCBlbXB0eSIpOworCQlyZXR1cm47CisJfQorCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCXNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCXBTZXNzaW9uID0gJnBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXTsKKwlpZiAocFNlc3Npb24tPnJvYW1PZmZsb2FkU3luY2hQYXJhbXMuYlJvYW1TeW5jaEluUHJvZ3Jlc3MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkgICJMRlIzOmNzcl9yb2FtX2NmZ19zZXRfY2FsbGJhY2siKTsKKwl9CisjZW5kaWYKKworCWlmIChDU1JfSVNfUk9BTV9KT0lOSU5HKHBNYWMsIHNlc3Npb25JZCkKKwkgICAgJiYgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfQ09ORklHKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJY3NyX3JvYW1pbmdfc3RhdGVfY29uZmlnX2NuZl9wcm9jZXNzb3IocE1hYywgKHVpbnQzMl90KSByZXN1bHQpOworCX0KK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB2ZXJ5IGR1bXAuIEl0IGlzIGhlcmUgYmVjYXVzZSBQRSBzdGlsbCBuZWVkIFdOSV9DRkdfUEhZX01PREUgKi8KK3VpbnQzMl90IGNzcl9yb2FtX2dldF9waHlfbW9kZV9mcm9tX2RvdDExX21vZGUoZUNzckNmZ0RvdDExTW9kZSBkb3QxMU1vZGUsCisJCQkJCSAgICAgICBlQ3NyQmFuZCBiYW5kKQoreworCWlmIChlQ1NSX0NGR19ET1QxMV9NT0RFXzExQiA9PSBkb3QxMU1vZGUpIHsKKwkJcmV0dXJuIFdOSV9DRkdfUEhZX01PREVfMTFCOworCX0gZWxzZSB7CisJCWlmIChlQ1NSX0JBTkRfMjQgPT0gYmFuZCkKKwkJCXJldHVybiBXTklfQ0ZHX1BIWV9NT0RFXzExRzsKKwl9CisJcmV0dXJuIFdOSV9DRkdfUEhZX01PREVfMTFBOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKK2VQaHlDaGFuQm9uZFN0YXRlIGNzcl9nZXRfaHRjYl9zdGF0ZV9mcm9tX3ZodGNiX3N0YXRlKGVQaHlDaGFuQm9uZFN0YXRlIGFuaUNCTW9kZSkKK3sKKwlzd2l0Y2ggKGFuaUNCTW9kZSkgeworCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfTE9XOgorCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfQ0VOVEVSRUQ6CisJY2FzZSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfSElHSF80ME1IWl9ISUdIOgorCQlyZXR1cm4gUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWTsKKwljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfTE9XOgorCWNhc2UgUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9DRU5URVJFRDoKKwljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfSElHSDoKKwkJcmV0dXJuIFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWTsKKwljYXNlIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9DRU5URVJFRF80ME1IWl9DRU5URVJFRDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCX0KK30KKyNlbmRpZgorCisvKiBwSWVzIG1heSBiZSBOVUxMICovCitDREZfU1RBVFVTIGNzcl9yb2FtX3NldF9ic3NfY29uZmlnX2NmZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsCisJCQkJICAgICAgIHRCc3NDb25maWdQYXJhbSAqcEJzc0NvbmZpZywKKwkJCQkgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywgYm9vbCByZXNldENvdW50cnkpCit7CisJdFNpclJldFN0YXR1cyBzdGF0dXM7CisJdWludDMyX3QgY2ZnQ2IgPSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisJdWludDhfdCBjaGFubmVsID0gMDsKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgZG9tYWluIGluZm8gZm9yIHRoZSBCU1Mgd2UgdHJ5IHRvIGNvbm5lY3QgdG8uICovCisJLyogRG8gd2UgbmVlZCB0byB3b3JyeSBhYm91dCBzZXF1ZW5jZSBmb3IgT1NzIHRoYXQgYXJlIG5vdCBXaW5kb3dzPz8gKi8KKwlpZiAocEJzc0Rlc2MpIHsKKwkJaWYgKGNzcl9sZWFybl8xMWRjb3VudHJ5X2luZm9ybWF0aW9uKHBNYWMsIHBCc3NEZXNjLCBwSWVzLCB0cnVlKSkgeworCQkJCWNzcl9hcHBseV9jb3VudHJ5X2luZm9ybWF0aW9uKHBNYWMpOworCQl9CisJCWlmICgoY3NyX2lzMTFkX3N1cHBvcnRlZChwTWFjKSkgJiYgcEllcykgeworCQkJaWYgKCFwSWVzLT5Db3VudHJ5LnByZXNlbnQpIHsKKwkJCQljc3JfYXBwbHlfY2hhbm5lbF9wb3dlcl9pbmZvX3dyYXBwZXIocE1hYyk7CisJCQl9IGVsc2UgeworCQkJCS8qIExldCdzIGFsc28gdXBkYXRlIHRoZSBiZWxvdyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgdXBkYXRlIENDIHdoaWxlICovCisJCQkJLyogY29ubmVjdGVkIHRvIGFuIEFQIHdoaWNoIGlzIGFkdmVydGlzaW5nIHNvbWUgQ0MgKi8KKwkJCQljZGZfbWVtX2NvcHkocE1hYy0+c2Nhbi5jdXJyZW50Q291bnRyeUJzc2lkLmJ5dGVzLAorCQkJCQkgICAgIHBCc3NEZXNjLT5ic3NJZCwKKwkJCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBRb3MgKi8KKwljc3Jfc2V0X3Fvc190b19jZmcocE1hYywgc2Vzc2lvbklkLCBwQnNzQ29uZmlnLT5xb3NUeXBlKTsKKwkvKiBTU0lEICovCisJY3NyX3NldF9jZmdfc3NpZChwTWFjLCAmcEJzc0NvbmZpZy0+U1NJRCk7CisKKwkvKiBBdXRoIHR5cGUgKi8KKwljZmdfc2V0X2ludChwTWFjLCBXTklfQ0ZHX0FVVEhFTlRJQ0FUSU9OX1RZUEUsIHBCc3NDb25maWctPmF1dGhUeXBlKTsKKwkvKiBlbmNyeXB0aW9uIHR5cGUgKi8KKwljc3Jfc2V0X2NmZ19wcml2YWN5KHBNYWMsIHBQcm9maWxlLCAoYm9vbCkgcEJzc0NvbmZpZy0+QnNzQ2FwLnByaXZhY3kpOworCS8qIHNob3J0IHNsb3QgdGltZSAqLworCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVELAorCQkJcEJzc0NvbmZpZy0+dVNob3J0U2xvdFRpbWUpOworCS8qIDExZCAqLworCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfMTFEX0VOQUJMRUQsCisJCQkoKHBCc3NDb25maWctPmYxMWhTdXBwb3J0KSA/IHBCc3NDb25maWctPmYxMWhTdXBwb3J0IDoKKwkJCSBwUHJvZmlsZS0+aWVlZTgwMjExZCkpOworCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCwKKwkJCXBCc3NDb25maWctPnVQb3dlckxpbWl0KTsKKwkvKiBDQiAqLworCisJaWYgKENTUl9JU19JTkZSQV9BUChwUHJvZmlsZSkgfHwgQ1NSX0lTX1dEU19BUChwUHJvZmlsZSkKKwkgICAgfHwgQ1NSX0lTX0lCU1MocFByb2ZpbGUpKSB7CisJCWNoYW5uZWwgPSBwUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbDsKKwl9IGVsc2UgeworCQlpZiAocEJzc0Rlc2MpIHsKKwkJCWNoYW5uZWwgPSBwQnNzRGVzYy0+Y2hhbm5lbElkOworCQl9CisJfQorCWlmICgwICE9IGNoYW5uZWwpIHsKKwkJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKGNoYW5uZWwpKSB7ICAgIC8qIGZvciBub3cgaWYgd2UgYXJlIG9uIDIuNCBHaHosIENCIHdpbGwgYmUgYWx3YXlzIGRpc2FibGVkICovCisJCQljZmdDYiA9IFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRTsKKwkJfSBlbHNlIHsKKwkJCWNmZ0NiID0gcEJzc0NvbmZpZy0+Y2JNb2RlOworCQl9CisJfQorCS8qIFJhdGUgKi8KKwkvKiBGaXhlZCBSYXRlICovCisJaWYgKHBCc3NEZXNjKSB7CisJCWNzcl9zZXRfY2ZnX3JhdGVfc2V0KHBNYWMsIChlQ3NyUGh5TW9kZSkgcFByb2ZpbGUtPnBoeU1vZGUsCisJCQkJICAgICBwUHJvZmlsZSwgcEJzc0Rlc2MsIHBJZXMpOworCX0gZWxzZSB7CisJCWNzcl9zZXRfY2ZnX3JhdGVfc2V0X2Zyb21fcHJvZmlsZShwTWFjLCBwUHJvZmlsZSk7CisJfQorCS8qIE1ha2UgdGhpcyB0aGUgbGFzdCBDRkcgdG8gc2V0LiBUaGUgY2FsbGJhY2sgd2lsbCB0cmlnZ2VyIGEgam9pbl9yZXEgKi8KKwkvKiBKb2luIHRpbWUgb3V0ICovCisJY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9DT05GSUcsIHNlc3Npb25JZCk7CisKKwlzdGF0dXMgPSBjZmdfc2V0X2ludChwTWFjLCBXTklfQ0ZHX0pPSU5fRkFJTFVSRV9USU1FT1VULAorCQkJcEJzc0NvbmZpZy0+dUpvaW5UaW1lT3V0KTsKKwljc3Jfcm9hbV9jY21fY2ZnX3NldF9jYWxsYmFjayhwTWFjLCBzdGF0dXMpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fc3RvcF9uZXR3b3JrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCQkgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywKKwkJCQkgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0QnNzQ29uZmlnUGFyYW0gKnBCc3NDb25maWc7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcEJzc0NvbmZpZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0QnNzQ29uZmlnUGFyYW0pKTsKKwlpZiAoTlVMTCA9PSBwQnNzQ29uZmlnKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCisJY2RmX21lbV9zZXQocEJzc0NvbmZpZywgc2l6ZW9mKHRCc3NDb25maWdQYXJhbSksIDApOworCXN0YXR1cyA9IGNzcl9yb2FtX3ByZXBhcmVfYnNzX2NvbmZpZyhwTWFjLCBwUHJvZmlsZSwgcEJzc0Rlc2MsCisJCQlwQnNzQ29uZmlnLCBwSWVzKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJZUNzclJvYW1TdWJTdGF0ZSBzdWJzdGF0ZTsKKwkJc3Vic3RhdGUgPSBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQ09OTkVDVF9DT05USU5VRV9ST0FNSU5HOworCQlwU2Vzc2lvbi0+YnNzUGFyYW1zLnVDZmdEb3QxMU1vZGUgPSBwQnNzQ29uZmlnLT51Q2ZnRG90MTFNb2RlOworCQkvKiBUaGlzIHdpbGwgYWxsb3cgdG8gcGFzcyBjYk1vZGUgZHVyaW5nIGpvaW4gcmVxICovCisJCXBTZXNzaW9uLT5ic3NQYXJhbXMuY2JNb2RlID0gcEJzc0NvbmZpZy0+Y2JNb2RlOworCQkvKiBGb3IgSUJTUywgd2UgbmVlZCB0byBwcmVwYXJlIHNvbWUgbW9yZSBpbmZvcm1hdGlvbiAqLworCQlpZiAoY3NyX2lzX2Jzc190eXBlX2lic3MocFByb2ZpbGUtPkJTU1R5cGUpIHx8CisJCQkJQ1NSX0lTX1dEUyhwUHJvZmlsZSkgfHwKKwkJCQlDU1JfSVNfSU5GUkFfQVAocFByb2ZpbGUpKQorCQkJY3NyX3JvYW1fcHJlcGFyZV9ic3NfcGFyYW1zKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsCisJCQkJcEJzc0Rlc2MsIHBCc3NDb25maWcsIHBJZXMpOworCisJCS8qCisJCSAqIElmIHdlIGFyZSBpbiBhbiBJQlNTLCB0aGVuIHN0b3AgdGhlIElCU1MuLi4KKwkJICogTm90IHdvcnJ5IGFib3V0IFdEUyBjb25uZWN0aW9uIGZvciBub3cKKwkJICovCisJCWlmIChjc3JfaXNfY29ubl9zdGF0ZV9pYnNzKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX3N0b3BfYnNzKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJc3Vic3RhdGUpOworCQl9IGVsc2UgaWYgKGNzcl9pc19jb25uX3N0YXRlX2luZnJhKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCS8qCisJCQkgKiB0aGUgbmV3IEJzcyBpcyBhbiBJYnNzIE9SIHdlIGFyZSByb2FtaW5nIGZyb20KKwkJCSAqIEluZnJhIHRvIEluZnJhIGFjcm9zcyBTU0lEcworCQkJICogKHJvYW1pbmcgdG8gYSBuZXcgU1NJRCkuLi4KKwkJCSAqIE5vdCB3b3JyeSBhYm91dCBXRFMgY29ubmVjdGlvbiBmb3Igbm93CisJCQkgKi8KKwkJCWlmIChwQnNzRGVzYyAmJiAoY3NyX2lzX2lic3NfYnNzX2Rlc2MocEJzc0Rlc2MpIHx8CisJCQkJIWNzcl9pc19zc2lkX2VxdWFsKHBNYWMsCisJCQkJCXBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MsCisJCQkJCXBCc3NEZXNjLCBwSWVzKSkpCisJCQkJc3RhdHVzID0gY3NyX3JvYW1faXNzdWVfZGlzYXNzb2NpYXRlKHBNYWMsCisJCQkJCQlzZXNzaW9uSWQsIHN1YnN0YXRlLCBmYWxzZSk7CisJCQllbHNlIGlmIChwQnNzRGVzYykKKwkJCQkvKgorCQkJCSAqIEluIGFuIGluZnJhICYgZ29pbmcgdG8gYW4gaW5mcmEgbmV0d29yayB3aXRoCisJCQkJICogdGhlIHNhbWUgU1NJRC4gIFRoaXMgY2FsbHMgZm9yIGEgcmVhc3NvYyBzZXEuCisJCQkJICogU28gaXNzdWUgdGhlIENGRyBzZXRzIGZvciB0aGlzIG5ldyBBUC4gU2V0CisJCQkJICogcGFyYW1ldGVycyBmb3IgdGhpcyBCc3MuCisJCQkJICovCisJCQkJc3RhdHVzID0gY3NyX3JvYW1fc2V0X2Jzc19jb25maWdfY2ZnKHBNYWMsCisJCQkJCQlzZXNzaW9uSWQsIHBQcm9maWxlLCBwQnNzRGVzYywKKwkJCQkJCXBCc3NDb25maWcsIHBJZXMsIGZhbHNlKTsKKwkJfSBlbHNlIGlmIChwQnNzRGVzYyB8fCBDU1JfSVNfV0RTX0FQKHBQcm9maWxlKSB8fAorCQkJCQlDU1JfSVNfSU5GUkFfQVAocFByb2ZpbGUpKSB7CisJCQkvKgorCQkJICogTmVpdGhlciBpbiBJQlNTIG5vciBpbiBJbmZyYS4gV2UgY2FuIGdvIGFoZWFkIGFuZCBzZXQKKwkJCSAqIHRoZSBjZmcgZm9yIHRuZSBuZXcgbmV0d29yay4uLiBub3RoaW5nIHRvIHN0b3AuCisJCQkgKi8KKwkJCWJvb2wgaXMxMXJSb2FtaW5nRmxhZyA9IGZhbHNlOworCQkJaXMxMXJSb2FtaW5nRmxhZyA9IGNzcl9yb2FtX2lzMTFyX2Fzc29jKHBNYWMsCisJCQkJCQkJc2Vzc2lvbklkKTsKKwkJCS8qIFNldCBwYXJhbWV0ZXJzIGZvciB0aGlzIEJzcy4gKi8KKwkJCXN0YXR1cyA9IGNzcl9yb2FtX3NldF9ic3NfY29uZmlnX2NmZyhwTWFjLCBzZXNzaW9uSWQsCisJCQkJCXBQcm9maWxlLCBwQnNzRGVzYywgcEJzc0NvbmZpZywgcEllcywKKwkJCQkJaXMxMXJSb2FtaW5nRmxhZyk7CisJCX0KKwl9IC8qIFN1Y2Nlc3MgZ2V0dGluZyBCU1MgY29uZmlnIGluZm8gKi8KKwljZGZfbWVtX2ZyZWUocEJzc0NvbmZpZyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3Jfcm9hbV9zdGF0ZV9mb3Jfc2FtZV9wcm9maWxlKCkgLSBEZXRlcm1pbmUgcm9hbSBzdGF0ZSBmb3Igc2FtZSBwcm9maWxlCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBtYWMgY29udGV4dAorICogQHByb2ZpbGU6IFJvYW0gcHJvZmlsZQorICogQHNlc3Npb246IFJvYW0gc2Vzc2lvbgorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqIEBpZXNfbG9jYWw6IGxvY2FsIGllcworICogQGJzc19kZXNjcjogYnNzIGRlc2NyaXB0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGRldGVybWluZSB0aGUgcm9hbSBzdGF0ZSBmb3Igc2FtZSBwcm9maWxlCisgKgorICogUmV0dXJuOiBSb2FtaW5nIHN0YXRlLgorICovCitzdGF0aWMgZUNzckpvaW5TdGF0ZSBjc3Jfcm9hbV9zdGF0ZV9mb3Jfc2FtZV9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQl0Q3NyUm9hbVByb2ZpbGUgKnByb2ZpbGUsIHRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCXVpbnQzMl90IHNlc3Npb25faWQsIHREb3QxMWZCZWFjb25JRXMgKmllc19sb2NhbCwKKwkJCXRTaXJCc3NEZXNjcmlwdGlvbiAqYnNzX2Rlc2NyKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRCc3NDb25maWdQYXJhbSBic3NDb25maWc7CisJaWYgKGNzcl9yb2FtX2lzX3NhbWVfcHJvZmlsZV9rZXlzKG1hY19jdHgsICZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLAorCQkJCXByb2ZpbGUpKQorCQlyZXR1cm4gZUNzclJlYXNzb2NUb1NlbGZOb0NhcENoYW5nZTsKKwkvKiBUaGUga2V5IGNoYW5nZXMgKi8KKwljZGZfbWVtX3NldCgmYnNzQ29uZmlnLCBzaXplb2YoYnNzQ29uZmlnKSwgMCk7CisJc3RhdHVzID0gY3NyX3JvYW1fcHJlcGFyZV9ic3NfY29uZmlnKG1hY19jdHgsIHByb2ZpbGUsIGJzc19kZXNjciwKKwkJCQkmYnNzQ29uZmlnLCBpZXNfbG9jYWwpOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzZXNzaW9uLT5ic3NQYXJhbXMudUNmZ0RvdDExTW9kZSA9CisJCQkJYnNzQ29uZmlnLnVDZmdEb3QxMU1vZGU7CisJCXNlc3Npb24tPmJzc1BhcmFtcy5jYk1vZGUgPQorCQkJCWJzc0NvbmZpZy5jYk1vZGU7CisJCS8qIHJlYXBwbHkgdGhlIGNmZyBpbmNsdWRpbmcga2V5cyBzbyByZWFzc29jIGhhcHBlbnMuICovCisJCXN0YXR1cyA9IGNzcl9yb2FtX3NldF9ic3NfY29uZmlnX2NmZyhtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQkJCXByb2ZpbGUsIGJzc19kZXNjciwgJmJzc0NvbmZpZywKKwkJCQlpZXNfbG9jYWwsIGZhbHNlKTsKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJcmV0dXJuIGVDc3JDb250aW51ZVJvYW1pbmc7CisJfQorCisJcmV0dXJuIGVDc3JTdG9wUm9hbWluZzsKKworfQorCitlQ3NySm9pblN0YXRlIGNzcl9yb2FtX2pvaW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJICAgIHRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQsCisJCQkgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSkKK3sKKwllQ3NySm9pblN0YXRlIGVSb2FtU3RhdGUgPSBlQ3NyQ29udGludWVSb2FtaW5nOworCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MgPSAmcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3I7CisJdERvdDExZkJlYWNvbklFcyAqcEllc0xvY2FsID0gKHREb3QxMWZCZWFjb25JRXMgKikgKHBTY2FuUmVzdWx0LT5wdkllcyk7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gZUNzclN0b3BSb2FtaW5nOworCX0KKworCWlmIChDU1JfSVNfV0RTX1NUQShwUHJvZmlsZSkgJiYKKwkJIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjc3Jfcm9hbV9zdGFydF93ZHMocE1hYywgc2Vzc2lvbklkLAorCQkJCXBQcm9maWxlLCBwQnNzRGVzYykpKQorCQlyZXR1cm4gZUNzclN0b3BSb2FtaW5nOworCWlmICghcEllc0xvY2FsICYmCisJCSFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcyhwTWFjLAorCQkJCXBCc3NEZXNjLCAmcEllc0xvY2FsKSkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiZmFpbCB0byBwYXJzZSBJRXMiKSk7CisJCXJldHVybiBlQ3NyU3RvcFJvYW1pbmc7CisJfQorCWlmIChjc3JfaXNfaW5mcmFfYnNzX2Rlc2MocEJzc0Rlc2MpKSB7CisJCS8qCisJCSAqIElmIHdlIGFyZSBjb25uZWN0ZWQgaW4gaW5mcmEgbW9kZSBhbmQgdGhlIGpvaW4gYnNzIGRlc2NyIGlzCisJCSAqIGZvciB0aGUgc2FtZSBCc3NJRCwgdGhlbiB3ZSBhcmUgYXR0ZW1wdGluZyB0byBqb2luIHRoZSBBUCB3ZQorCQkgKiBhcmUgYWxyZWFkeSBjb25uZWN0ZWQgd2l0aC4gIEluIHRoYXQgY2FzZSwgc2VlIGlmIHRoZSBCc3Mgb3IKKwkJICogc3RhIGNhcGFiaWxpdGllcyBoYXZlIGNoYW5nZWQgYW5kIGhhbmRsZSB0aGUgY2hhbmdlcworCQkgKiB3aXRob3V0IGRpc3R1cmJpbmcgdGhlIGN1cnJlbnQgYXNzb2NpYXRpb24KKwkJICovCisKKwkJaWYgKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYShwTWFjLCBzZXNzaW9uSWQpICYmCisJCQljc3JfaXNfYnNzX2lkX2VxdWFsKHBNYWMsCisJCQkJcEJzc0Rlc2MsIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpICYmCisJCQljc3JfaXNfc3NpZF9lcXVhbChwTWFjLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLAorCQkJCXBCc3NEZXNjLCBwSWVzTG9jYWwpKSB7CisJCQkvKgorCQkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBBdXRoIHR5cGUgaGFzIGNoYW5nZWQgaW4gdGhlCisJCQkgKiBwcm9maWxlLiAgSWYgc28sIHdlIGRvbid0IHdhbnQgdG8gcmVhc3NvY2lhdGUgd2l0aAorCQkJICogYXV0aGVudGljYXRpbmcgZmlyc3QuICBUbyBmb3JjZSB0aGlzLCBzdG9wIHRoZQorCQkJICogY3VycmVudCBhc3NvY2lhdGlvbiAoRGlzYXNzb2NpYXRlKSBhbmQgdGhlbiByZSAnSm9pbicKKwkJCSAqIHRoZSBBUCwgd2loY2ggd2lsbCBmb3JjZSBhbiBBdXRoZW50aWNhdGlvbiAod2l0aCB0aGUKKwkJCSAqIG5ldyBBdXRoIHR5cGUpIGZvbGxvd2VkIGJ5IGEgbmV3IEFzc29jaWF0aW9uLgorCQkJICovCisJCQlpZiAoY3NyX2lzX3NhbWVfcHJvZmlsZShwTWFjLAorCQkJCSZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSwgcFByb2ZpbGUpKSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCQlGTCgiZGV0ZWN0IHNhbWUgcHJvZmlsZSIpKTsKKwkJCQllUm9hbVN0YXRlID0KKwkJCQkJY3NyX3JvYW1fc3RhdGVfZm9yX3NhbWVfcHJvZmlsZShwTWFjLAorCQkJCQkJcFByb2ZpbGUsIHBTZXNzaW9uLCBzZXNzaW9uSWQsCisJCQkJCQlwSWVzTG9jYWwsIHBCc3NEZXNjKTsKKwkJCX0gZWxzZSBpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUygKKwkJCQkJY3NyX3JvYW1faXNzdWVfZGlzYXNzb2NpYXRlKHBNYWMsCisJCQkJCQlzZXNzaW9uSWQsCisJCQkJCQllQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfUkVRLAorCQkJCQkJZmFsc2UpKSkgeworCQkJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJCQlGTCgiZmFpbCBkaXNhc3NvYyBzZXNzaW9uICVkIiksCisJCQkJCQlzZXNzaW9uSWQpOworCQkJCQllUm9hbVN0YXRlID0gZUNzclN0b3BSb2FtaW5nOworCQkJfQorCQl9IGVsc2UgaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY3NyX3JvYW1fc3RvcF9uZXR3b3JrKHBNYWMsCisJCQkJc2Vzc2lvbklkLCBwUHJvZmlsZSwgcEJzc0Rlc2MsIHBJZXNMb2NhbCkpKSB7CisJCQkJLyogd2UgdXNlZCB0byBwcmUtYXV0aCBoZXJlIHdpdGggb3BlbiBhdXRoCisJCQkJICogbmV0d29ya3MgYnV0IHRoYXQgd2Fzbid0IHdvcmtpbmcgc28gd2VsbC4KKwkJCQkgKiBzdG9wIHRoZSBleGlzdGluZyBuZXR3b3JrIGJlZm9yZSBhdHRlbXB0aW5nCisJCQkJICogdG8gam9pbiB0aGUgbmV3IG5ldHdvcmsuLi4gKi8KKwkJCQllUm9hbVN0YXRlID0gZUNzclN0b3BSb2FtaW5nOworCQl9CisJfSBlbHNlIGlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9yb2FtX3N0b3BfbmV0d29yayhwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQlwUHJvZmlsZSwgcEJzc0Rlc2MsCisJCQkJCQlwSWVzTG9jYWwpKSkgeworCQkJZVJvYW1TdGF0ZSA9IGVDc3JTdG9wUm9hbWluZzsKKwl9CisKKwlpZiAocEllc0xvY2FsICYmICFwU2NhblJlc3VsdC0+cHZJZXMpCisJCWNkZl9tZW1fZnJlZShwSWVzTG9jYWwpOworCXJldHVybiBlUm9hbVN0YXRlOworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX3Nob3VsZF9yb2FtKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQl0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB1aW50MzJfdCByb2FtSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1JbmZvIHJvYW1JbmZvOworCWNkZl9tZW1fc2V0KCZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbyksIDApOworCXJvYW1JbmZvLnBCc3NEZXNjID0gcEJzc0Rlc2M7CisJc3RhdHVzID0KKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgcm9hbUlkLAorCQkJCSAgICAgICBlQ1NSX1JPQU1fU0hPVUxEX1JPQU0sIGVDU1JfUk9BTV9SRVNVTFRfTk9ORSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogSW4gY2FzZSBubyBtYXRjaGluZyBCU1MgaXMgZm91bmQsIHVzZSB3aGF0ZXZlciBkZWZhdWx0IHdlIGNhbiBmaW5kICovCitzdGF0aWMgdm9pZCBjc3Jfcm9hbV9hc3NpZ25fZGVmYXVsdF9wYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCkKK3sKKwkvKiBOZWVkIHRvIGdldCBhbGwgbmVnb3RpYXRlZCB0eXBlcyBpbiBwbGFjZSBmaXJzdCAqLworCS8qIGF1dGggdHlwZSAqLworCS8qIFRha2UgdGhlIHByZWZlcnJlZCBBdXRoIHR5cGUuICovCisJc3dpdGNoIChwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLkF1dGhUeXBlLmF1dGhUeXBlWzBdKSB7CisJZGVmYXVsdDoKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1dQQToKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1dQQV9QU0s6CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfTk9ORToKKwljYXNlIGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOgorCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLm5lZ290aWF0ZWRBdXRoVHlwZSA9CisJCQllQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk6CisJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUubmVnb3RpYXRlZEF1dGhUeXBlID0KKwkJCWVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk7CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9BVVRPU1dJVENIOgorCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLm5lZ290aWF0ZWRBdXRoVHlwZSA9CisJCQllQ1NSX0FVVEhfVFlQRV9BVVRPU1dJVENIOworCQlicmVhazsKKwl9CisJcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSA9CisJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF07CisJLyogSW4gdGhpcyBjYXNlLCB0aGUgbXVsdGljYXN0IGVuY3J5cHRpb24gbmVlZHMgdG8gZm9sbG93IHRoZSB1bmNhc3Qgb25lcy4gKi8KKwlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLm5lZ290aWF0ZWRNQ0VuY3J5cHRpb25UeXBlID0KKwkJcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXTsKK30KKworc3RhdGljIHZvaWQgY3NyX3NldF9hYm9ydF9yb2FtaW5nX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisJc3dpdGNoIChwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pIHsKKwljYXNlIGVDc3JMb3N0TGluazE6CisJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IGVDc3JMb3N0TGluazFBYm9ydDsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyTG9zdExpbmsyOgorCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSBlQ3NyTG9zdExpbmsyQWJvcnQ7CisJCWJyZWFrOworCWNhc2UgZUNzckxvc3RMaW5rMzoKKwkJcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uID0gZUNzckxvc3RMaW5rM0Fib3J0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiIGFib3J0aW5nIHJvYW1pbmcgcmVhc29uICVkIG5vdCByZWNvZ25pemVkIiksCisJCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogY3NyX3JvYW1fc2VsZWN0X2JzcygpIC0gSGFuZGxlIGpvaW4gc2NlbmFyaW8gYmFzZWQgb24gcHJvZmlsZQorICogQG1hY19jdHg6ICAgICAgICAgICAgIEdsb2JhbCBNQUMgQ29udGV4dAorICogQHJvYW1fYnNzX2VudHJ5OiAgICAgIFRoZSBuZXh0IEJTUyB0byBqb2luCisgKiBAY3NyX3Jlc3VsdF9pbmZvOiAgICAgUmVzdWx0IG9mIGpvaW4KKyAqIEBjc3Jfc2Nhbl9yZXN1bHQ6ICAgICBHbG9iYWwgc2NhbiByZXN1bHQKKyAqIEBzZXNzaW9uX2lkOiAgICAgICAgICBTTUUgU2Vzc2lvbiBJRAorICogQHJvYW1faWQ6ICAgICAgICAgICAgIFJvYW1pbmcgSUQKKyAqIEByb2FtX3N0YXRlOiAgICAgICAgICBDdXJyZW50IHJvYW1pbmcgc3RhdGUKKyAqIEBic3NfbGlzdDogICAgICAgICAgICBCU1MgTGlzdAorICoKKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgZW50aXJlIEJTUyBsaXN0IGlzIGRvbmUsIGZhbHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGJvb2wgY3NyX3JvYW1fc2VsZWN0X2Jzcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl0TGlzdEVsZW0gKnJvYW1fYnNzX2VudHJ5LCB0Q3NyU2NhblJlc3VsdEluZm8gKipjc3JfcmVzdWx0X2luZm8sCisJCXRDc3JTY2FuUmVzdWx0ICoqY3NyX3NjYW5fcmVzdWx0LCB1aW50MzJfdCBzZXNzaW9uX2lkLAorCQl1aW50MzJfdCByb2FtX2lkLCBlQ3NySm9pblN0YXRlICpyb2FtX3N0YXRlLAorCQl0U2NhblJlc3VsdExpc3QgKmJzc19saXN0KQoreworCXVpbnQ4X3QgY29uY19jaGFubmVsID0gMDsKKwlib29sIHN0YXR1cyA9IGZhbHNlOworCXRDc3JTY2FuUmVzdWx0ICpzY2FuX3Jlc3VsdCA9IE5VTEw7CisJdENzclNjYW5SZXN1bHRJbmZvICpyZXN1bHQgPSBOVUxMOworCisJd2hpbGUgKHJvYW1fYnNzX2VudHJ5KSB7CisJCXNjYW5fcmVzdWx0ID0gR0VUX0JBU0VfQUREUihyb2FtX2Jzc19lbnRyeSwgdENzclNjYW5SZXN1bHQsCisJCQkJTGluayk7CisJCS8qCisJCSAqIElmIGNvbmN1cnJlbmN5IGVuYWJsZWQgdGFrZSB0aGUKKwkJICogY29uY3VycmVudCBjb25uZWN0ZWQgY2hhbm5lbCBmaXJzdC4KKwkJICogVmFsaWQgbXVsdGljaGFubmVsIGNvbmN1cnJlbnQKKwkJICogc2Vzc2lvbnMgZXhlbXB0ZWQKKwkJICovCisJCXJlc3VsdCA9ICZzY2FuX3Jlc3VsdC0+UmVzdWx0OworCQlpZiAoY2RzX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKCkgJiYKKwkJCSFjc3JfaXNfdmFsaWRfbWNfY29uY3VycmVudF9zZXNzaW9uKG1hY19jdHgsCisJCQkJCXNlc3Npb25faWQsICZyZXN1bHQtPkJzc0Rlc2NyaXB0b3IpKSB7CisJCQljb25jX2NoYW5uZWwgPSBjc3JfZ2V0X2NvbmN1cnJlbnRfb3BlcmF0aW9uX2NoYW5uZWwoCisJCQkJCW1hY19jdHgpOworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiY3NyIENvbmMgQ2hhbm5lbCA9ICVkIiksCisJCQkJY29uY19jaGFubmVsKTsKKwkJCWlmICgoY29uY19jaGFubmVsKSAmJiAoY29uY19jaGFubmVsID09CisJCQkJcmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCkpIHsKKwkJCQkvKgorCQkJCSAqIG1ha2UgdGhpcyAwIGJlY2F1c2Ugd2UgZG8gbm90IHdhbnQgdGhlIGJlbG93CisJCQkJICogY2hlY2sgdG8gcGFzcyBhcyB3ZSBkb24ndCB3YW50IHRvIGNvbm5lY3Qgb24KKwkJCQkgKiBvdGhlciBjaGFubmVsCisJCQkJICovCisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiQ29uYyBjaG5sIG1hdGNoPSVkIiksCisJCQkJCWNvbmNfY2hhbm5lbCk7CisJCQkJY29uY19jaGFubmVsID0gMDsKKwkJCX0KKwkJfQorCisJCS8qIE9rIHRvIHJvYW0gdGhpcyAqLworCQlpZiAoIWNvbmNfY2hhbm5lbCAmJgorCQkJQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9yb2FtX3Nob3VsZF9yb2FtKG1hY19jdHgsCisJCQkJc2Vzc2lvbl9pZCwgJnJlc3VsdC0+QnNzRGVzY3JpcHRvciwgcm9hbV9pZCkpKSB7CisJCQlzdGF0dXMgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJKnJvYW1fc3RhdGUgPSBlQ3NyU3RvcFJvYW1pbmdEdWVUb0NvbmN1cnJlbmN5OworCQkJc3RhdHVzID0gdHJ1ZTsKKwkJfQorCQlyb2FtX2Jzc19lbnRyeSA9IGNzcl9sbF9uZXh0KCZic3NfbGlzdC0+TGlzdCwgcm9hbV9ic3NfZW50cnksCisJCQkJCUxMX0FDQ0VTU19MT0NLKTsKKwl9CisJKmNzcl9yZXN1bHRfaW5mbyA9IHJlc3VsdDsKKwkqY3NyX3NjYW5fcmVzdWx0ID0gc2Nhbl9yZXN1bHQ7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3Jfcm9hbV9qb2luX2hhbmRsZV9wcm9maWxlKCkgLSBIYW5kbGUgam9pbiBzY2VuYXJpbyBiYXNlZCBvbiBwcm9maWxlCisgKiBAbWFjX2N0eDogICAgICAgICAgICAgR2xvYmFsIE1BQyBDb250ZXh0CisgKiBAc2Vzc2lvbl9pZDogICAgICAgICAgU01FIFNlc3Npb24gSUQKKyAqIEBjbWQ6ICAgICAgICAgICAgICAgICBDb21tYW5kCisgKiBAcm9hbV9pbmZvX3B0cjogICAgICAgUG9pbnRlZCB0byB0aGUgcm9hbWluZyBpbmZvIGZvciBqb2luCisgKiBAcm9hbV9zdGF0ZTogICAgICAgICAgQ3VycmVudCByb2FtaW5nIHN0YXRlCisgKiBAcmVzdWx0OiAgICAgICAgICAgICAgUmVzdWx0IG9mIGpvaW4KKyAqIEBzY2FuX3Jlc3VsdDogICAgICAgICBHbG9iYWwgc2NhbiByZXN1bHQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY3NyX3JvYW1fam9pbl9oYW5kbGVfcHJvZmlsZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl1aW50MzJfdCBzZXNzaW9uX2lkLCB0U21lQ21kICpjbWQsIHRDc3JSb2FtSW5mbyAqcm9hbV9pbmZvX3B0ciwKKwkJZUNzckpvaW5TdGF0ZSAqcm9hbV9zdGF0ZSwgdENzclNjYW5SZXN1bHRJbmZvICpyZXN1bHQsCisJCXRDc3JTY2FuUmVzdWx0ICpzY2FuX3Jlc3VsdCkKK3sKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisJdWludDhfdCBhY21fbWFzayA9IDA7CisjZW5kaWYKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJdENzclJvYW1Qcm9maWxlICpwcm9maWxlID0gJmNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlOworCXREb3QxMWZCZWFjb25JRXMgKmllc19sb2NhbCA9IE5VTEw7CisJLyoKKwkgKiBXZSBoYXZlIHNvbWV0aGluZyB0byByb2FtLCB0ZWxsIEhERCB3aGVuIGl0IGlzIGluZnJhLgorCSAqIEZvciBJQlNTLCB0aGUgaW5kaWNhdGlvbiBnb2VzIGJhY2sgdG8gSEREIHZpYSBlQ1NSX1JPQU1fSUJTU19JTkQKKwkgKiBGb3IgV0RTLCB0aGUgaW5kaWNhdGlvbiBpcyBlQ1NSX1JPQU1fV0RTX0lORAorCSAqLworCWlmIChDU1JfSVNfSU5GUkFTVFJVQ1RVUkUocHJvZmlsZSkpIHsKKwkJaWYgKHJvYW1faW5mb19wdHIgJiYgc2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQpIHsKKwkJCXNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250LS07CisJCQlyb2FtX2luZm9fcHRyLT5wUHJvZmlsZSA9IHByb2ZpbGU7CisJCQkvKgorCQkJICogQ29tcGxldGUgdGhlIGxhc3QgYXNzb2MgYXR0ZW1wdCBhcyBhCisJCQkgKiBuZXcgb25lIGlzIGFib3V0IHRvIGJlIHRyaWVkCisJCQkgKi8KKwkJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCQlyb2FtX2luZm9fcHRyLCBjbWQtPnUucm9hbUNtZC5yb2FtSWQsCisJCQkJZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04sCisJCQkJZUNTUl9ST0FNX1JFU1VMVF9OT1RfQVNTT0NJQVRFRCk7CisJCX0KKwkJLyogSWYgcm9hbWluZyBoYXMgc3RvcHBlZCwgZG9uJ3QgY29udGludWUgdGhlIHJvYW1pbmcgY29tbWFuZCAqLworCQlpZiAoIUNTUl9JU19ST0FNSU5HKHNlc3Npb24pICYmIENTUl9JU19ST0FNSU5HX0NPTU1BTkQoY21kKSkgeworCQkJLyogTm8gbmVlZCB0byBjb21wbGV0ZSByb2FtaW5nIGFzIGl0IGFscmVhZHkgY29tcGxldGUgKi8KKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgKKwkJCQkiUm9hbSBjbWQocmVhc29uICVkKWFib3J0ZWQgYXMgcm9hbSBjb21wbGV0ZSIpLAorCQkJCWNtZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pOworCQkJKnJvYW1fc3RhdGUgPSBlQ3NyU3RvcFJvYW1pbmc7CisJCQljc3Jfc2V0X2Fib3J0X3JvYW1pbmdfY29tbWFuZChtYWNfY3R4LCBjbWQpOworCQkJcmV0dXJuOworCQl9CisJCWNkZl9tZW1fc2V0KHJvYW1faW5mb19wdHIsIHNpemVvZih0Q3NyUm9hbUluZm8pLCAwKTsKKwkJaWYgKCFzY2FuX3Jlc3VsdCkKKwkJCWNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLnVhcHNkX21hc2sgPSAwOworCQllbHNlCisJCQlpZXNfbG9jYWwgPSBzY2FuX3Jlc3VsdC0+UmVzdWx0LnB2SWVzOworCisJCWlmIChzY2FuX3Jlc3VsdCAmJiAhaWVzX2xvY2FsICYmCisJCQkoIUNERl9JU19TVEFUVVNfU1VDQ0VTUygKKwkJCQkJY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcygKKwkJCQkJCW1hY19jdHgsCisJCQkJCQkmcmVzdWx0LT5Cc3NEZXNjcmlwdG9yLAorCQkJCQkJJmllc19sb2NhbCkpKSkgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiIGNhbm5vdCBwYXJzZSBJRXMiKSk7CisJCQkqcm9hbV9zdGF0ZSA9IGVDc3JTdG9wUm9hbWluZzsKKwkJCXJldHVybjsKKwkJfQorCQlyb2FtX2luZm9fcHRyLT5wQnNzRGVzYyA9ICZyZXN1bHQtPkJzc0Rlc2NyaXB0b3I7CisJCWNtZC0+dS5yb2FtQ21kLnBMYXN0Um9hbUJzcyA9IHJvYW1faW5mb19wdHItPnBCc3NEZXNjOworCQkvKiBkb250IHB1dCB1YXBzZF9tYXNrIGlmIEJTUyBkb2Vzbid0IHN1cHBvcnQgdUFQU0QgKi8KKwkJaWYgKHNjYW5fcmVzdWx0ICYmIGNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLnVhcHNkX21hc2sKKwkJCQkmJiBDU1JfSVNfUU9TX0JTUyhpZXNfbG9jYWwpCisJCQkJJiYgQ1NSX0lTX1VBUFNEX0JTUyhpZXNfbG9jYWwpKSB7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCQkJYWNtX21hc2sgPSBzbWVfcW9zX2dldF9hY21fbWFzayhtYWNfY3R4LAorCQkJCQkmcmVzdWx0LT5Cc3NEZXNjcmlwdG9yLCBpZXNfbG9jYWwpOworI2VuZGlmIC8qIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVCAqLworCQl9IGVsc2UgeworCQkJY21kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUudWFwc2RfbWFzayA9IDA7CisJCX0KKwkJaWYgKGllc19sb2NhbCAmJiAhcmVzdWx0LT5wdkllcykKKwkJCWNkZl9tZW1fZnJlZShpZXNfbG9jYWwpOworCQlyb2FtX2luZm9fcHRyLT5wUHJvZmlsZSA9IHByb2ZpbGU7CisJCXNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250Kys7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbl9pZCwgcm9hbV9pbmZvX3B0ciwKKwkJCWNtZC0+dS5yb2FtQ21kLnJvYW1JZCwgZUNTUl9ST0FNX0FTU09DSUFUSU9OX1NUQVJULAorCQkJZUNTUl9ST0FNX1JFU1VMVF9OT05FKTsKKwl9CisJaWYgKE5VTEwgIT0gY21kLT51LnJvYW1DbWQucFJvYW1Cc3NFbnRyeSkgeworCQkvKgorCQkgKiBXZSBoYXZlIEJTUworCQkgKiBOZWVkIHRvIGFzc2lnbiB0aGVzZSB2YWx1ZSBiZWNhdXNlCisJCSAqIHRoZXkgYXJlIHVzZWQgaW4gY3NyX2lzX3NhbWVfcHJvZmlsZQorCQkgKi8KKwkJc2Nhbl9yZXN1bHQgPSBHRVRfQkFTRV9BRERSKGNtZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnksCisJCQkJdENzclNjYW5SZXN1bHQsIExpbmspOworCQkvKgorCQkgKiBUaGUgT1NFTiBJRSBkb2Vzbid0IHByb3ZpZGUgdGhlIGNpcGhlciBzdWl0ZS5UaGVyZWZvcmUgc2V0CisJCSAqIHRvIGNvbnN0YW50IHZhbHVlIG9mIEFFUworCQkgKi8KKwkJaWYgKGNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLmJPU0VOQXNzb2NpYXRpb24pIHsKKwkJCWNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlID0KKwkJCQllQ1NSX0VOQ1JZUFRfVFlQRV9BRVM7CisJCQljbWQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS5uZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZSA9CisJCQkJZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworCQl9IGVsc2UgeworCQkJLyogTmVnb3RpYXRlZCB3aGlsZSBidWlsZGluZyBzY2FuIHJlc3VsdC4gKi8KKwkJCWNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlID0KKwkJCQlzY2FuX3Jlc3VsdC0+dWNFbmNyeXB0aW9uVHlwZTsKKwkJCWNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLm5lZ290aWF0ZWRNQ0VuY3J5cHRpb25UeXBlID0KKwkJCQlzY2FuX3Jlc3VsdC0+bWNFbmNyeXB0aW9uVHlwZTsKKwkJfQorCQljbWQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS5uZWdvdGlhdGVkQXV0aFR5cGUgPQorCQkJc2Nhbl9yZXN1bHQtPmF1dGhUeXBlOworCQlpZiAoQ1NSX0lTX1NUQVJUX0lCU1MoJmNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlKSkgeworCQkJaWYgKGNzcl9pc19zYW1lX3Byb2ZpbGUobWFjX2N0eCwKKwkJCQkmc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSwgcHJvZmlsZSkpIHsKKwkJCQkqcm9hbV9zdGF0ZSA9IGVDc3JTdGFydElic3NTYW1lSWJzczsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJaWYgKGNtZC0+dS5yb2FtQ21kLmZSZWFzc29jVG9TZWxmTm9DYXBDaGFuZ2UpIHsKKwkJCS8qIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBvbmUgYWxyZWFkeSBjb25uZWN0ZWQgKi8KKwkJCWNtZC0+dS5yb2FtQ21kLmZSZWFzc29jVG9TZWxmTm9DYXBDaGFuZ2UgPSBmYWxzZTsKKwkJCSpyb2FtX3N0YXRlID0gZUNzclJlYXNzb2NUb1NlbGZOb0NhcENoYW5nZTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBBdHRlbXB0IHRvIEpvaW4gdGhpcyBCc3MuLi4gKi8KKwkJKnJvYW1fc3RhdGUgPSBjc3Jfcm9hbV9qb2luKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJJnNjYW5fcmVzdWx0LT5SZXN1bHQsIHByb2ZpbGUpOworCQlyZXR1cm47CisJfQorCisJLyogRm9yIGFuIElCU1MgcHJvZmlsZSwgdGhlbiB3ZSBuZWVkIHRvIHN0YXJ0IHRoZSBJQlNTLiAqLworCWlmIChDU1JfSVNfU1RBUlRfSUJTUyhwcm9maWxlKSkgeworCQlib29sIHNhbWVfaWJzcyA9IGZhbHNlOworCQkvKiBBdHRlbXB0IHRvIHN0YXJ0IHRoaXMgSUJTUy4uLiAqLworCQljc3Jfcm9hbV9hc3NpZ25fZGVmYXVsdF9wYXJhbShtYWNfY3R4LCBjbWQpOworCQlzdGF0dXMgPSBjc3Jfcm9hbV9zdGFydF9pYnNzKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJcHJvZmlsZSwgJnNhbWVfaWJzcyk7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJaWYgKHNhbWVfaWJzcykKKwkJCQkqcm9hbV9zdGF0ZSA9IGVDc3JTdGFydElic3NTYW1lSWJzczsKKwkJCWVsc2UKKwkJCQkqcm9hbV9zdGF0ZSA9IGVDc3JDb250aW51ZVJvYW1pbmc7CisJCX0gZWxzZSB7CisJCQkvKiBpdCBzb21laG93IGZhaWwgbmVlZCB0byBzdG9wICovCisJCQkqcm9hbV9zdGF0ZSA9IGVDc3JTdG9wUm9hbWluZzsKKwkJfQorCQlyZXR1cm47CisJfSBlbHNlIGlmICgoQ1NSX0lTX1dEU19BUChwcm9maWxlKSkgfHwKKwkJCShDU1JfSVNfSU5GUkFfQVAocHJvZmlsZSkpKSB7CisJCS8qIEF0dGVtcHQgdG8gc3RhcnQgdGhpcyBXRFMuLi4gKi8KKwkJY3NyX3JvYW1fYXNzaWduX2RlZmF1bHRfcGFyYW0obWFjX2N0eCwgY21kKTsKKwkJLyogRm9yIEFQIFdEUywgd2UgZG9udCBoYXZlIGFueSBCU1NEZXNjcmlwdGlvbiAqLworCQlzdGF0dXMgPSBjc3Jfcm9hbV9zdGFydF93ZHMobWFjX2N0eCwgc2Vzc2lvbl9pZCwgcHJvZmlsZSwgTlVMTCk7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCSpyb2FtX3N0YXRlID0gZUNzckNvbnRpbnVlUm9hbWluZzsKKwkJZWxzZQorCQkJKnJvYW1fc3RhdGUgPSBlQ3NyU3RvcFJvYW1pbmc7CisJfSBlbHNlIHsKKwkJLyogTm90aGluZyB3ZSBjYW4gZG8gKi8KKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiY2Fubm90IGNvbnRpbnVlIHdpdGhvdXQgQlNTIGxpc3QiKSk7CisJCSpyb2FtX3N0YXRlID0gZUNzclN0b3BSb2FtaW5nOworCQlyZXR1cm47CisJfQorCit9CisvKioKKyAqIGNzcl9yb2FtX2pvaW5fbmV4dF9ic3MoKSAtIFBpY2sgdGhlIG5leHQgQlNTIGZvciBqb2luCisgKiBAbWFjX2N0eDogICAgICAgICAgICAgR2xvYmFsIE1BQyBDb250ZXh0CisgKiBAY21kOiAgICAgICAgICAgICAgICAgQ29tbWFuZAorICogQHVzZV9zYW1lX2JzczogICAgICAgIFVzZSBTYW1lIEJTUyB0byBKb2luCisgKgorICogUmV0dXJuOiBUaGUgSm9pbiBTdGF0ZQorICovCitzdGF0aWMgZUNzckpvaW5TdGF0ZSBjc3Jfcm9hbV9qb2luX25leHRfYnNzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXRTbWVDbWQgKmNtZCwgYm9vbCB1c2Vfc2FtZV9ic3MpCit7CisJdENzclNjYW5SZXN1bHQgKnNjYW5fcmVzdWx0ID0gTlVMTDsKKwllQ3NySm9pblN0YXRlIHJvYW1fc3RhdGUgPSBlQ3NyU3RvcFJvYW1pbmc7CisJdFNjYW5SZXN1bHRMaXN0ICpic3NfbGlzdCA9CisJCSh0U2NhblJlc3VsdExpc3QgKikgY21kLT51LnJvYW1DbWQuaEJTU0xpc3Q7CisJYm9vbCBkb25lID0gZmFsc2U7CisJdENzclJvYW1JbmZvIHJvYW1faW5mbywgKnJvYW1faW5mb19wdHIgPSBOVUxMOworCXVpbnQzMl90IHNlc3Npb25faWQgPSBjbWQtPnNlc3Npb25JZDsKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJdENzclJvYW1Qcm9maWxlICpwcm9maWxlID0gJmNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlOworCXRDc3JSb2FtSm9pblN0YXR1cyAqam9pbl9zdGF0dXM7CisJdENzclNjYW5SZXN1bHRJbmZvICpyZXN1bHQgPSBOVUxMOworCisJaWYgKCFzZXNzaW9uKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25faWQpOworCQlyZXR1cm4gZUNzclN0b3BSb2FtaW5nOworCX0KKworCWNkZl9tZW1fc2V0KCZyb2FtX2luZm8sIHNpemVvZihyb2FtX2luZm8pLCAwKTsKKwljZGZfbWVtX2NvcHkoJnJvYW1faW5mby5ic3NpZCwgJnNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5ic3NJZCwKKwkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCS8qCisJICogV2hlbiBoYW5kbGluZyBBUCdzIGNhcGFiaWxpdHkgY2hhbmdlLCBjb250aW51ZSB0byBhc3NvY2lhdGUKKwkgKiB0byBzYW1lIEJTUyBhbmQgbWFrZSBzdXJlIHBSb2FtQnNzRW50cnkgaXMgbm90IE51bGwuCisJICovCisJaWYgKChOVUxMICE9IGJzc19saXN0KSAmJgorCQkoKGZhbHNlID09IHVzZV9zYW1lX2JzcykgfHwKKwkJIChjbWQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5ID09IE5VTEwpKSkgeworCQlpZiAoY21kLT51LnJvYW1DbWQucFJvYW1Cc3NFbnRyeSA9PSBOVUxMKSB7CisJCQkvKiBUcnkgdGhlIGZpcnN0IEJTUyAqLworCQkJY21kLT51LnJvYW1DbWQucExhc3RSb2FtQnNzID0gTlVMTDsKKwkJCWNtZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnkgPQorCQkJCWNzcl9sbF9wZWVrX2hlYWQoJmJzc19saXN0LT5MaXN0LAorCQkJCQlMTF9BQ0NFU1NfTE9DSyk7CisJCX0gZWxzZSB7CisJCQljbWQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5ID0KKwkJCQljc3JfbGxfbmV4dCgmYnNzX2xpc3QtPkxpc3QsCisJCQkJCWNtZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnksCisJCQkJCUxMX0FDQ0VTU19MT0NLKTsKKwkJCS8qCisJCQkgKiBEb25lIHdpdGggYWxsIHRoZSBCU1NzLgorCQkJICogSW4gdGhpcyBjYXNlLCB3aWxsIHRlbGwgSEREIHRoZQorCQkJICogY29tcGxldGlvbgorCQkJICovCisJCQlpZiAoTlVMTCA9PSBjbWQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5KQorCQkJCWdvdG8gZW5kOworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gaW5kaWNhdGUgdG8gSEREIHRoYXQgd2UKKwkJCSAqIGFyZSBkb25lIHdpdGggdGhpcyBvbmUuCisJCQkgKi8KKwkJCXJvYW1faW5mby5wQnNzRGVzYyA9IGNtZC0+dS5yb2FtQ21kLnBMYXN0Um9hbUJzczsKKwkJCWpvaW5fc3RhdHVzID0gJnNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZTsKKwkJCXJvYW1faW5mby5zdGF0dXNDb2RlID0gam9pbl9zdGF0dXMtPnN0YXR1c0NvZGU7CisJCQlyb2FtX2luZm8ucmVhc29uQ29kZSA9IGpvaW5fc3RhdHVzLT5yZWFzb25Db2RlOworCQkJcm9hbV9pbmZvX3B0ciA9ICZyb2FtX2luZm87CisJCX0KKwkJZG9uZSA9IGNzcl9yb2FtX3NlbGVjdF9ic3MobWFjX2N0eCwKKwkJCQljbWQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5LCAmcmVzdWx0LAorCQkJCSZzY2FuX3Jlc3VsdCwgc2Vzc2lvbl9pZCwgY21kLT51LnJvYW1DbWQucm9hbUlkLAorCQkJCSZyb2FtX3N0YXRlLCBic3NfbGlzdCk7CisJCWlmIChkb25lKQorCQkJZ290byBlbmQ7CisJfQorCWlmICghcm9hbV9pbmZvX3B0cikKKwkJcm9hbV9pbmZvX3B0ciA9ICZyb2FtX2luZm87CisJcm9hbV9pbmZvX3B0ci0+dS5wQ29ubmVjdGVkUHJvZmlsZSA9ICZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCWNzcl9yb2FtX2pvaW5faGFuZGxlX3Byb2ZpbGUobWFjX2N0eCwgc2Vzc2lvbl9pZCwgY21kLCByb2FtX2luZm9fcHRyLAorCQkmcm9hbV9zdGF0ZSwgcmVzdWx0LCBzY2FuX3Jlc3VsdCk7CitlbmQ6CisJaWYgKChlQ3NyU3RvcFJvYW1pbmcgPT0gcm9hbV9zdGF0ZSkgJiYgQ1NSX0lTX0lORlJBU1RSVUNUVVJFKHByb2ZpbGUpICYmCisJCShzZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudCA+IDApKSB7CisJCS8qCisJCSAqIE5lZWQgdG8gaW5kaWNhdGUgYXNzb2NpYXRpb25fY29tcGxldGlvbiBpZiBhc3NvY2lhdGlvbl9zdGFydAorCQkgKiBoYXMgYmVlbiBkb25lCisJCSAqLworCQlzZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudC0tOworCQkvKgorCQkgKiBDb21wbGV0ZSB0aGUgbGFzdCBhc3NvYyBhdHRlbXB0ZSBhcyBhCisJCSAqIG5ldyBvbmUgaXMgYWJvdXQgdG8gYmUgdHJpZWQKKwkJICovCisJCXJvYW1faW5mb19wdHIgPSAmcm9hbV9pbmZvOworCQlyb2FtX2luZm9fcHRyLT5wUHJvZmlsZSA9IHByb2ZpbGU7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCXJvYW1faW5mb19wdHIsIGNtZC0+dS5yb2FtQ21kLnJvYW1JZCwKKwkJCWVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OLAorCQkJZUNTUl9ST0FNX1JFU1VMVF9OT1RfQVNTT0NJQVRFRCk7CisJfQorCisJcmV0dXJuIHJvYW1fc3RhdGU7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9yb2FtKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWVDc3JKb2luU3RhdGUgUm9hbVN0YXRlOworCWVDc3JSb2FtU3ViU3RhdGUgc3Vic3RhdGU7CisJdWludDMyX3Qgc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsKKworCS8qIEF0dGVwdCB0byBqb2luIGEgQnNzLi4uICovCisJUm9hbVN0YXRlID0gY3NyX3JvYW1fam9pbl9uZXh0X2JzcyhwTWFjLCBwQ29tbWFuZCwgZmFsc2UpOworCisJLyogaWYgbm90aGluZyB0byBqb2luLi4gKi8KKwlpZiAoKGVDc3JTdG9wUm9hbWluZyA9PSBSb2FtU3RhdGUpIHx8CisJCShlQ3NyU3RvcFJvYW1pbmdEdWVUb0NvbmN1cnJlbmN5ID09IFJvYW1TdGF0ZSkpIHsKKwkJYm9vbCBmQ29tcGxldGUgPSBmYWxzZTsKKwkJLyogYW5kIGlmIGNvbm5lY3RlZCBpbiBJbmZyYXN0cnVjdHVyZSBtb2RlLi4uICovCisJCWlmIChjc3JfaXNfY29ubl9zdGF0ZV9pbmZyYShwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQkvKiAuLi4gdGhlbiB3ZSBuZWVkIHRvIGlzc3VlIGEgZGlzYXNzb2NpYXRpb24gKi8KKwkJCXN1YnN0YXRlID0gZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX05PVEhJTkdfVE9fSk9JTjsKKwkJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZShwTWFjLCBzZXNzaW9uSWQsCisJCQkJCXN1YnN0YXRlLCBmYWxzZSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCQlGTCgiZmFpbCBpc3N1aW5nIGRpc2Fzc29jIHN0YXR1cyA9ICVkIiksCisJCQkJCXN0YXR1cyk7CisJCQkJLyoKKwkJCQkgKiByb2FtIGNvbW1hbmQgaXMgY29tcGxldGVkIGJ5IGNhbGxlciBpbiB0aGUKKwkJCQkgKiBmYWlsZWQgY2FzZQorCQkJCSAqLworCQkJCWZDb21wbGV0ZSA9IHRydWU7CisJCQl9CisJCX0gZWxzZSBpZiAoY3NyX2lzX2Nvbm5fc3RhdGVfaWJzcyhwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9pc3N1ZV9zdG9wX2JzcyhwTWFjLCBzZXNzaW9uSWQsCisJCQkJCWVDU1JfUk9BTV9TVUJTVEFURV9TVE9QX0JTU19SRVEpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQkJRkwoImZhaWwgaXNzdWluZyBzdG9wIGJzcyBzdGF0dXMgPSAlZCIpLAorCQkJCQlzdGF0dXMpOworCQkJCS8qCisJCQkJICogcm9hbSBjb21tYW5kIGlzIGNvbXBsZXRlZCBieSBjYWxsZXIgaW4gdGhlCisJCQkJICogZmFpbGVkIGNhc2UKKwkJCQkgKi8KKwkJCQlmQ29tcGxldGUgPSB0cnVlOworCQkJfQorCQl9IGVsc2UgaWYgKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYV9hcChwTWFjLAorCQkJCQlzZXNzaW9uSWQpKSB7CisJCQlzdWJzdGF0ZSA9IGVDU1JfUk9BTV9TVUJTVEFURV9TVE9QX0JTU19SRVE7CisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9pc3N1ZV9zdG9wX2JzcyhwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQlzdWJzdGF0ZSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCQlGTCgiZmFpbCBpc3N1aW5nIHN0b3AgYnNzIHN0YXR1cyA9ICVkIiksCisJCQkJCXN0YXR1cyk7CisJCQkJLyoKKwkJCQkgKiByb2FtIGNvbW1hbmQgaXMgY29tcGxldGVkIGJ5IGNhbGxlciBpbiB0aGUKKwkJCQkgKiBmYWlsZWQgY2FzZQorCQkJCSAqLworCQkJCWZDb21wbGV0ZSA9IHRydWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmQ29tcGxldGUgPSB0cnVlOworCQl9CisKKwkJaWYgKGZDb21wbGV0ZSkgeworCQkJLyogb3RoZXJ3aXNlLCB3ZSBjYW4gY29tcGxldGUgdGhlIFJvYW0gY29tbWFuZCBoZXJlLiAqLworCQkJaWYgKGVDc3JTdG9wUm9hbWluZ0R1ZVRvQ29uY3VycmVuY3kgPT0gUm9hbVN0YXRlKQorCQkJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsCisJCQkJCWVDc3JKb2luRmFpbHVyZUR1ZVRvQ29uY3VycmVuY3ksIE5VTEwpOworCQkJZWxzZQorCQkJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsCisJCQkJCWVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMKTsKKwkJfQorCX0gZWxzZSBpZiAoZUNzclJlYXNzb2NUb1NlbGZOb0NhcENoYW5nZSA9PSBSb2FtU3RhdGUpIHsKKwkJY3NyX3JvYW1fY29tcGxldGUocE1hYywgZUNzclNpbGVudGx5U3RvcFJvYW1pbmdTYXZlU3RhdGUsCisJCQkJTlVMTCk7CisJfSBlbHNlIGlmIChlQ3NyU3RhcnRJYnNzU2FtZUlic3MgPT0gUm9hbVN0YXRlKSB7CisJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsIGVDc3JTaWxlbnRseVN0b3BSb2FtaW5nLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9wcm9jZXNzX2Z0X3JlYXNzb2Nfcm9hbV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB0U21lQ21kICpwQ29tbWFuZCkKK3sKKwl1aW50MzJfdCBzZXNzaW9uSWQ7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKwl0Q3NyU2NhblJlc3VsdCAqcFNjYW5SZXN1bHQgPSBOVUxMOworCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisJcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChDU1JfSVNfUk9BTUlORyhwU2Vzc2lvbikgJiYgcFNlc3Npb24tPmZDYW5jZWxSb2FtaW5nKSB7CisJCS8qIHRoZSByb2FtaW5nIGlzIGNhbmNlbGxlZC4gU2ltcGx5IGNvbXBsZXRlIHRoZSBjb21tYW5kICovCisJCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIlJvYW0gY29tbWFuZCBjYW5jZWxlZCIpKTsKKwkJY3NyX3JvYW1fY29tcGxldGUocE1hYywgZUNzck5vdGhpbmdUb0pvaW4sIE5VTEwpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmIChwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnkpIHsKKwkJcFNjYW5SZXN1bHQgPQorCQkJR0VUX0JBU0VfQUREUihwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnksCisJCQkJICAgICAgdENzclNjYW5SZXN1bHQsIExpbmspOworCQlwQnNzRGVzYyA9ICZwU2NhblJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3I7CisJfSBlbHNlIHsKKwkJLyogdGhlIHJvYW1pbmcgaXMgY2FuY2VsbGVkLiBTaW1wbHkgY29tcGxldGUgdGhlIGNvbW1hbmQgKi8KKwkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiUm9hbSBjb21tYW5kIGNhbmNlbGVkIikpOworCQljc3Jfcm9hbV9jb21wbGV0ZShwTWFjLCBlQ3NyTm90aGluZ1RvSm9pbiwgTlVMTCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJc3RhdHVzID0gY3NyX3JvYW1faXNzdWVfcmVhc3NvY2lhdGUocE1hYywgc2Vzc2lvbklkLCBwQnNzRGVzYywKKwkJCQkJICAgICh0RG90MTFmQmVhY29uSUVzICopIChwU2NhblJlc3VsdC0+CisJCQkJCQkJCSAgUmVzdWx0LnB2SWVzKSwKKwkJCQkJICAgICZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNzcl9yb2FtX3RyaWdnZXJfcmVhc3NvY2lhdGUoKSAtIEhlbHBlciBmdW5jdGlvbiB0byB0cmlnZ2VyIHJlYXNzb2NpYXRlCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBtYWMgY29udGV4dAorICogQGNtZDogc21lIGNvbW1hbmQKKyAqIEByb2FtX2luZm86IFJvYW1pbmcgaW5mb3Igc3RydWN0dXJlCisgKiBAc2Vzc2lvbl9wdHI6IHNlc3Npb24gcG9pbnRlcgorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJpZ2dlciByZWFzc29jaWF0ZS4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZm9yIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIENERl9TVEFUVVMgY3NyX3JvYW1fdHJpZ2dlcl9yZWFzc29jaWF0ZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJdFNtZUNtZCAqY21kLCB0Q3NyUm9hbUluZm8gKnJvYW1faW5mbywKKwkJCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbl9wdHIsIHVpbnQzMl90IHNlc3Npb25faWQpCit7CisJdERvdDExZkJlYWNvbklFcyAqcEllcyA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlpZiAoc2Vzc2lvbl9wdHItPnBDb25uZWN0QnNzRGVzYykgeworCQlzdGF0dXMgPSBjc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzKG1hY19jdHgsCisJCQkJc2Vzc2lvbl9wdHItPnBDb25uZWN0QnNzRGVzYywgJnBJZXMpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJmYWlsIHRvIHBhcnNlIElFcyIpKTsKKwkJfSBlbHNlIHsKKwkJCXJvYW1faW5mby0+cmVhc29uQ29kZSA9CisJCQkJCWVDc3JSb2FtUmVhc29uU3RhQ2FwYWJpbGl0eUNoYW5nZWQ7CisJCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25fcHRyLT5zZXNzaW9uSWQsCisJCQkJCXJvYW1faW5mbywgMCwgZUNTUl9ST0FNX1JPQU1JTkdfU1RBUlQsCisJCQkJCWVDU1JfUk9BTV9SRVNVTFRfTk9ORSk7CisJCQlzZXNzaW9uX3B0ci0+cm9hbWluZ1JlYXNvbiA9IGVDc3JSZWFzc29jUm9hbWluZzsKKwkJCXJvYW1faW5mby0+cEJzc0Rlc2MgPSBzZXNzaW9uX3B0ci0+cENvbm5lY3RCc3NEZXNjOworCQkJcm9hbV9pbmZvLT5wUHJvZmlsZSA9ICZjbWQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZTsKKwkJCXNlc3Npb25fcHRyLT5iUmVmQXNzb2NTdGFydENudCsrOworCQkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uX2lkLCByb2FtX2luZm8sCisJCQkJY21kLT51LnJvYW1DbWQucm9hbUlkLAorCQkJCWVDU1JfUk9BTV9BU1NPQ0lBVElPTl9TVEFSVCwKKwkJCQllQ1NSX1JPQU1fUkVTVUxUX05PTkUpOworCisJCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCQkJRkwoImNhbGxpbmcgY3NyX3JvYW1faXNzdWVfcmVhc3NvY2lhdGUiKSk7CisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9pc3N1ZV9yZWFzc29jaWF0ZShtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQkJCQlzZXNzaW9uX3B0ci0+cENvbm5lY3RCc3NEZXNjLCBwSWVzLAorCQkJCQkmY21kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoImZhaWxlZCBzdGF0dXMgJWQiKSwKKwkJCQkJc3RhdHVzKTsKKwkJCQljc3JfcmVsZWFzZV9jb21tYW5kX3JvYW0obWFjX2N0eCwgY21kKTsKKwkJCX0KKworCQkJY2RmX21lbV9mcmVlKHBJZXMpOworCQkJcEllcyA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMCisJCQkoInJlYXNzb2MgdG8gc2FtZSBBUCBmYWlsZWQgYXMgY29ubmVjdGVkIEJTUyBpcyBOVUxMIikpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9wcm9jZXNzX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1JbmZvIHJvYW1JbmZvOworCXVpbnQzMl90IHNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIlJvYW0gUmVhc29uIDogJWQsIHNlc3Npb25JZDogJWQiKSwKKwkJcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uLCBzZXNzaW9uSWQpOworCisJc3dpdGNoIChwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pIHsKKwljYXNlIGVDc3JGb3JjZWREaXNhc3NvYzoKKwkJaWYgKGVDU1JfUk9BTUlOR19TVEFURV9JRExFID09IHBNYWMtPnJvYW0uY3VyU3RhdGVbc2Vzc2lvbklkXSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJJZ25vcmUgZUNzckZvcmNlZERpc2Fzc29jIGNtZCBvbiByb2FtIHN0YXRlIgorCQkJCSAgICIgJWQiKSwgZUNTUl9ST0FNSU5HX1NUQVRFX0lETEUpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisKKwkJc3RhdHVzID0gY3NyX3JvYW1fcHJvY2Vzc19kaXNhc3NvY19kZWF1dGgocE1hYywgcENvbW1hbmQsCisJCQkJdHJ1ZSwgZmFsc2UpOworCQljc3JfZnJlZV9yb2FtX3Byb2ZpbGUocE1hYywgc2Vzc2lvbklkKTsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyU21lSXNzdWVkRGlzYXNzb2NGb3JIYW5kb2ZmOgorCQkvKiBOb3QgdG8gZnJlZSBwTWFjLT5yb2FtLnBDdXJSb2FtUHJvZmlsZSAodmlhCisJCSAqIGNzcl9mcmVlX3JvYW1fcHJvZmlsZSkgYmVjYXVzZSBpdHMgbmVlZGVkIGFmdGVyIGRpc2Nvbm5lY3QgKi8KKwkJc3RhdHVzID0gY3NyX3JvYW1fcHJvY2Vzc19kaXNhc3NvY19kZWF1dGgocE1hYywgcENvbW1hbmQsCisJCQkJdHJ1ZSwgZmFsc2UpOworCisJCWJyZWFrOworCWNhc2UgZUNzckZvcmNlZERpc2Fzc29jTUlDRmFpbHVyZToKKwkJc3RhdHVzID0gY3NyX3JvYW1fcHJvY2Vzc19kaXNhc3NvY19kZWF1dGgocE1hYywgcENvbW1hbmQsCisJCQkJdHJ1ZSwgdHJ1ZSk7CisJCWNzcl9mcmVlX3JvYW1fcHJvZmlsZShwTWFjLCBzZXNzaW9uSWQpOworCQlicmVhazsKKwljYXNlIGVDc3JGb3JjZWREZWF1dGg6CisJCXN0YXR1cyA9IGNzcl9yb2FtX3Byb2Nlc3NfZGlzYXNzb2NfZGVhdXRoKHBNYWMsIHBDb21tYW5kLAorCQkJCWZhbHNlLCBmYWxzZSk7CisJCWNzcl9mcmVlX3JvYW1fcHJvZmlsZShwTWFjLCBzZXNzaW9uSWQpOworCQlicmVhazsKKwljYXNlIGVDc3JIZGRJc3N1ZWRSZWFzc29jVG9TYW1lQVA6CisJY2FzZSBlQ3NyU21lSXNzdWVkUmVhc3NvY1RvU2FtZUFQOgorCQlzdGF0dXMgPSBjc3Jfcm9hbV90cmlnZ2VyX3JlYXNzb2NpYXRlKHBNYWMsIHBDb21tYW5kLCAmcm9hbUluZm8sCisJCQkJcFNlc3Npb24sIHNlc3Npb25JZCk7CisJCWJyZWFrOworCWNhc2UgZUNzckNhcHNDaGFuZ2U6CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoInJlY2VpdmVkIGVDc3JDYXBzQ2hhbmdlICIpKTsKKwkJY3NyX3JvYW1fc3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HLAorCQkJCXNlc3Npb25JZCk7CisJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZShwTWFjLCBzZXNzaW9uSWQsCisJCQkJZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0NPTk5FQ1RfQ09OVElOVUVfUk9BTUlORywKKwkJCQlmYWxzZSk7CisJCWJyZWFrOworCWNhc2UgZUNzclNtZUlzc3VlZEZUUmVhc3NvYzoKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgicmVjZWl2ZWQgRlQgUmVhc3NvYyBSZXEgIikpOworCQlzdGF0dXMgPSBjc3JfcHJvY2Vzc19mdF9yZWFzc29jX3JvYW1fY29tbWFuZChwTWFjLCBwQ29tbWFuZCk7CisJCWJyZWFrOworCisJY2FzZSBlQ3NyU3RvcEJzczoKKwkJY3NyX3JvYW1fc3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HLAorCQkJCXNlc3Npb25JZCk7CisJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX3N0b3BfYnNzKHBNYWMsIHNlc3Npb25JZCwKKwkJCQllQ1NSX1JPQU1fU1VCU1RBVEVfU1RPUF9CU1NfUkVRKTsKKwkJYnJlYWs7CisKKwljYXNlIGVDc3JGb3JjZWREaXNhc3NvY1N0YToKKwkJY3NyX3JvYW1fc3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HLAorCQkJCXNlc3Npb25JZCk7CisJCWNzcl9yb2FtX3N1YnN0YXRlX2NoYW5nZShwTWFjLCBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfUkVRLAorCQkJCXNlc3Npb25JZCk7CisJCXN0YXR1cyA9IGNzcl9zZW5kX21iX2Rpc2Fzc29jX3JlcV9tc2cocE1hYywgc2Vzc2lvbklkLAorCQkJCXBDb21tYW5kLT51LnJvYW1DbWQucGVlck1hYywKKwkJCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJlYXNvbik7CisJCWJyZWFrOworCisJY2FzZSBlQ3NyRm9yY2VkRGVhdXRoU3RhOgorCQljc3Jfcm9hbV9zdGF0ZV9jaGFuZ2UocE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5JTkcsCisJCQkJc2Vzc2lvbklkKTsKKwkJY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9ERUFVVEhfUkVRLAorCQkJCXNlc3Npb25JZCk7CisJCXN0YXR1cyA9IGNzcl9zZW5kX21iX2RlYXV0aF9yZXFfbXNnKHBNYWMsIHNlc3Npb25JZCwKKwkJCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnBlZXJNYWMsCisJCQkJcENvbW1hbmQtPnUucm9hbUNtZC5yZWFzb24pOworCQlicmVhazsKKworCWNhc2UgZUNzclBlcmZvcm1QcmVhdXRoOgorCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJBdHRlbXB0aW5nIEZUIFByZUF1dGggUmVxIikpOworCQlzdGF0dXMgPSBjc3Jfcm9hbV9pc3N1ZV9mdF9wcmVhdXRoX3JlcShwTWFjLCBzZXNzaW9uSWQsCisJCQkJcENvbW1hbmQtPnUucm9hbUNtZC5wTGFzdFJvYW1Cc3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljc3Jfcm9hbV9zdGF0ZV9jaGFuZ2UocE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5JTkcsCisJCQkJc2Vzc2lvbklkKTsKKworCQlpZiAocENvbW1hbmQtPnUucm9hbUNtZC5mVXBkYXRlQ3VyUm9hbVByb2ZpbGUpIHsKKwkJCS8qIFJlbWVtYmVyIHRoZSByb2FtaW5nIHByb2ZpbGUgKi8KKwkJCWNzcl9mcmVlX3JvYW1fcHJvZmlsZShwTWFjLCBzZXNzaW9uSWQpOworCQkJcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSA9CisJCQkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0Q3NyUm9hbVByb2ZpbGUpKTsKKwkJCWlmIChOVUxMICE9IHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpIHsKKwkJCQljZGZfbWVtX3NldChwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLAorCQkJCQlzaXplb2YodENzclJvYW1Qcm9maWxlKSwgMCk7CisJCQkJY3NyX3JvYW1fY29weV9wcm9maWxlKHBNYWMsCisJCQkJCXBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUsCisJCQkJCSZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlKTsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBBdCB0aGlzIHBvaW50IG9yaWdpbmFsIHVhcHNkX21hc2sgaXMgc2F2ZWQgaW4KKwkJICogcEN1clJvYW1Qcm9maWxlLiB1YXBzZF9tYXNrIGluIHRoZSBwQ29tbWFuZCBtYXkgY2hhbmdlIGZyb20KKwkJICogdGhpcyBwb2ludCBvbi4gQXR0ZW1wdCB0byByb2FtIHdpdGggdGhlIG5ldyBzY2FuIHJlc3VsdHMKKwkJICogKGlmIHdlIG5lZWQgdG8uLikKKwkJICovCisJCXN0YXR1cyA9IGNzcl9yb2FtKHBNYWMsIHBDb21tYW5kKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQlGTCgiY3NyX3JvYW0oKSBmYWlsZWQgd2l0aCBzdGF0dXMgPSAweCUwOFgiKSwKKwkJCQlzdGF0dXMpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBjc3JfcmVpbml0X3ByZWF1dGhfY21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCXBDb21tYW5kLT51LnJvYW1DbWQucExhc3RSb2FtQnNzID0gTlVMTDsKKwlwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnkgPSBOVUxMOworCS8qIEJlY2F1c2UgdS5yb2FtQ21kIGlzIHVuaW9uIGFuZCBzaGFyZSB3aXRoIHNjYW5DbWQgYW5kIFN0YXR1c0NoYW5nZSAqLworCWNkZl9tZW1fc2V0KCZwQ29tbWFuZC0+dS5yb2FtQ21kLCBzaXplb2YodFJvYW1DbWQpLCAwKTsKK30KKwordm9pZCBjc3JfcmVpbml0X3JvYW1fY21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCWlmIChwQ29tbWFuZC0+dS5yb2FtQ21kLmZSZWxlYXNlQnNzTGlzdCkgeworCQljc3Jfc2Nhbl9yZXN1bHRfcHVyZ2UocE1hYywgcENvbW1hbmQtPnUucm9hbUNtZC5oQlNTTGlzdCk7CisJCXBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VCc3NMaXN0ID0gZmFsc2U7CisJCXBDb21tYW5kLT51LnJvYW1DbWQuaEJTU0xpc3QgPSBDU1JfSU5WQUxJRF9TQ0FOUkVTVUxUX0hBTkRMRTsKKwl9CisJaWYgKHBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VQcm9maWxlKSB7CisJCWNzcl9yZWxlYXNlX3Byb2ZpbGUocE1hYywgJnBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUpOworCQlwQ29tbWFuZC0+dS5yb2FtQ21kLmZSZWxlYXNlUHJvZmlsZSA9IGZhbHNlOworCX0KKwlwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnkgPSBOVUxMOworCS8qIEJlY2F1c2UgdS5yb2FtQ21kIGlzIHVuaW9uIGFuZCBzaGFyZSB3aXRoIHNjYW5DbWQgYW5kIFN0YXR1c0NoYW5nZSAqLworCWNkZl9tZW1fc2V0KCZwQ29tbWFuZC0+dS5yb2FtQ21kLCBzaXplb2YodFJvYW1DbWQpLCAwKTsKK30KKwordm9pZCBjc3JfcmVpbml0X3dtX3N0YXR1c19jaGFuZ2VfY21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCWNkZl9tZW1fc2V0KCZwQ29tbWFuZC0+dS53bVN0YXR1c0NoYW5nZUNtZCwgc2l6ZW9mKHRXbVN0YXR1c0NoYW5nZUNtZCksCisJCSAgICAwKTsKK30KKwordm9pZCBjc3Jfcm9hbV9jb21wbGV0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCBlQ3NyUm9hbUNvbXBsZXRlUmVzdWx0IFJlc3VsdCwKKwkJICAgICAgIHZvaWQgKkNvbnRleHQpCit7CisJdExpc3RFbGVtICpwRW50cnk7CisJdFNtZUNtZCAqcENvbW1hbmQ7CisJYm9vbCBmUmVsZWFzZUNvbW1hbmQgPSB0cnVlOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkgICIlczogUm9hbSBDb21wbGV0aW9uIC4uLiIsIF9fZnVuY19fKTsKKwlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0spOworCWlmIChwRW50cnkpIHsKKwkJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisJCS8qIElmIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBpcyBBY3RpdmUgYW5kIGl0IGlzIGEgUk9BTSBjb21tYW5kLCByZW1vdmUgKi8KKwkJLyogYW5kIHB1dCB0aGlzIG9uIHRoZSBGcmVlIHF1ZXVlLiAqLworCQlpZiAoZVNtZUNvbW1hbmRSb2FtID09IHBDb21tYW5kLT5jb21tYW5kKSB7CisJCQkvKiB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHJlc3VsdCBmaXJzdCBiZWZvcmUgcmVtb3ZpbmcgaXQgZnJvbSBhY3RpdmUgbGlzdCBiZWNhdXNlIHN0YXRlIGNoYW5nZXMgKi8KKwkJCS8qIHN0aWxsIGhhcHBlbmluZyBpbnNpZGVzIHJvYW1RUHJvY2Vzc1JvYW1SZXN1bHRzIHNvIG5vIG90aGVyIHJvYW0gY29tbWFuZCBzaG91bGQgYmUgaXNzdWVkICovCisJCQlmUmVsZWFzZUNvbW1hbmQgPQorCQkJCWNzcl9yb2FtX3Byb2Nlc3NfcmVzdWx0cyhwTWFjLCBwQ29tbWFuZCwgUmVzdWx0LAorCQkJCQkJCSBDb250ZXh0KTsKKwkJCWlmIChmUmVsZWFzZUNvbW1hbmQpIHsKKwkJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeQorCQkJCQkgICAgKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgcEVudHJ5LAorCQkJCQkgICAgTExfQUNDRVNTX0xPQ0spKSB7CisJCQkJCWNzcl9yZWxlYXNlX2NvbW1hbmRfcm9hbShwTWFjLCBwQ29tbWFuZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkJIiAqKioqKioqKioqY3NyX3JvYW1fY29tcGxldGUgZmFpbCB0byByZWxlYXNlIGNvbW1hbmQgcmVhc29uICVkIiwKKwkJCQkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJCSIgKioqKioqKioqKmNzcl9yb2FtX2NvbXBsZXRlIGZhaWwgdG8gcmVsZWFzZSBjb21tYW5kIHJlYXNvbiAlZCIsCisJCQkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkJIkNTUjogUm9hbSBDb21wbGV0aW9uIGNhbGxlZCBidXQgUk9BTSBjb21tYW5kIGlzIG5vdCBBQ1RJVkUgLi4uIik7CisJCX0KKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkiQ1NSOiBSb2FtIENvbXBsZXRpb24gY2FsbGVkIGJ1dCBOTyBjb21tYW5kcyBhcmUgQUNUSVZFIC4uLiIpOworCX0KKwlpZiAoZlJlbGVhc2VDb21tYW5kKSB7CisJCXNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUocE1hYyk7CisJfQorfQorCit2b2lkIGNzcl9yZXNldF9wbWtpZF9jYW5kaWRhdGVfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKwljZGZfbWVtX3NldCgmKHBTZXNzaW9uLT5QbWtpZENhbmRpZGF0ZUluZm9bMF0pLAorCQkgICAgc2l6ZW9mKHRQbWtpZENhbmRpZGF0ZUluZm8pICogQ1NSX01BWF9QTUtJRF9BTExPV0VELCAwKTsKKwlwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUgPSAwOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKK3ZvaWQgY3NyX3Jlc2V0X2JraWRfY2FuZGlkYXRlX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV9zZXQoJihwU2Vzc2lvbi0+QmtpZENhbmRpZGF0ZUluZm9bMF0pLAorCQkgICAgc2l6ZW9mKHRCa2lkQ2FuZGlkYXRlSW5mbykgKiBDU1JfTUFYX0JLSURfQUxMT1dFRCwgMCk7CisJcFNlc3Npb24tPk51bUJraWRDYW5kaWRhdGUgPSAwOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCitleHRlcm4gdWludDhfdCBjc3Jfd3BhX291aVtdW0NTUl9XUEFfT1VJX1NJWkVdOworCisvKioKKyAqIGNzcl9yb2FtX3NhdmVfcGFyYW1zKCkgLSBIZWxwZXIgZnVuY3Rpb24gdG8gc2F2ZSBwYXJhbXMKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKiBAc2Vzc2lvbl9wdHI6IFNlc3Npb24gcG9pbnRlcgorICogQGF1dGhfdHlwZTogYXV0aCB0eXBlCisgKiBAaWVfcHRyOiBwb2ludGVyIHRvIGllCisgKiBAaWVfbG9jYWw6IHBvaW50ciB0byBsb2NhbCBpZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzYXZlIHBhcmFtcyB0byBzZXNzaW9uCisgKgorICogUmV0dXJuOiBub25lLgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBjc3Jfcm9hbV9zYXZlX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbl9wdHIsCisJCQkJZUNzckF1dGhUeXBlIGF1dGhfdHlwZSwKKwkJCQl0RG90MTFmQmVhY29uSUVzICppZV9wdHIsCisJCQkJdERvdDExZkJlYWNvbklFcyAqaWVfbG9jYWwpCit7CisJdWludDMyX3QgbkllTGVuOworCXVpbnQ4X3QgKnBJZUJ1ZjsKKworCWlmICgoZUNTUl9BVVRIX1RZUEVfUlNOID09IGF1dGhfdHlwZSkgfHwKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCShlQ1NSX0FVVEhfVFlQRV9GVF9SU04gPT0gYXV0aF90eXBlKSB8fAorCQkoZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSyA9PSBhdXRoX3R5cGUpIHx8CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV8xMVcKKwkJKGVDU1JfQVVUSF9UWVBFX1JTTl9QU0tfU0hBMjU2ID09IGF1dGhfdHlwZSkgfHwKKwkJKGVDU1JfQVVUSF9UWVBFX1JTTl84MDIxWF9TSEEyNTYgPT0gYXV0aF90eXBlKSB8fAorI2VuZGlmCisJCShlQ1NSX0FVVEhfVFlQRV9SU05fUFNLID09IGF1dGhfdHlwZSkpIHsKKwkJaWYgKGllX2xvY2FsLT5SU04ucHJlc2VudCkgeworCQkJdERvdDExZklFUlNOICpyc25pZSA9ICZpZV9sb2NhbC0+UlNOOworCQkJLyoKKwkJCSAqIENhbGN1bGF0ZSB0aGUgYWN0dWFsIGxlbmd0aAorCQkJICogdmVyc2lvbiArIGdwX2NpcGhlcl9zdWl0ZSArIHB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudAorCQkJICogKyBha21fc3VpdGVfY291bnQgKyByZXNlcnZlZCArIHB3aXNlX2NpcGhlcl9zdWl0ZXMKKwkJCSAqLworCQkJbkllTGVuID0gOCArIDIgKyAyCisJCQkJKyAocnNuaWUtPnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQpCisJCQkJKyAocnNuaWUtPmFrbV9zdWl0ZV9jb3VudCAqIDQpOworCQkJaWYgKHJzbmllLT5wbWtpZF9jb3VudCkKKwkJCQkvKiBwbWtpZCAqLworCQkJCW5JZUxlbiArPSAyICsgcnNuaWUtPnBta2lkX2NvdW50ICogNDsKKworCQkJLyogbkllTGVuIGRvZXNuJ3QgY291bnQgRUlEIGFuZCBsZW5ndGggZmllbGRzICovCisJCQlzZXNzaW9uX3B0ci0+cFdwYVJzblJzcElFID0gY2RmX21lbV9tYWxsb2MobkllTGVuICsgMik7CisJCQlpZiAoTlVMTCA9PSBzZXNzaW9uX3B0ci0+cFdwYVJzblJzcElFKQorCQkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisKKwkJCWNkZl9tZW1fc2V0KHNlc3Npb25fcHRyLT5wV3BhUnNuUnNwSUUsCisJCQkJCW5JZUxlbiArIDIsIDApOworCQkJc2Vzc2lvbl9wdHItPnBXcGFSc25Sc3BJRVswXSA9IERPVDExRl9FSURfUlNOOworCQkJc2Vzc2lvbl9wdHItPnBXcGFSc25Sc3BJRVsxXSA9ICh1aW50OF90KSBuSWVMZW47CisJCQkvKiBjb3B5IHVwdG8gYWttX3N1aXRlcyAqLworCQkJcEllQnVmID0gc2Vzc2lvbl9wdHItPnBXcGFSc25Sc3BJRSArIDI7CisJCQljZGZfbWVtX2NvcHkocEllQnVmLCAmcnNuaWUtPnZlcnNpb24sCisJCQkJCXNpemVvZihyc25pZS0+dmVyc2lvbikpOworCQkJcEllQnVmICs9IHNpemVvZihyc25pZS0+dmVyc2lvbik7CisJCQljZGZfbWVtX2NvcHkocEllQnVmLCAmcnNuaWUtPmdwX2NpcGhlcl9zdWl0ZSwKKwkJCQlzaXplb2YocnNuaWUtPmdwX2NpcGhlcl9zdWl0ZSkpOworCQkJcEllQnVmICs9IHNpemVvZihyc25pZS0+Z3BfY2lwaGVyX3N1aXRlKTsKKwkJCWNkZl9tZW1fY29weShwSWVCdWYsICZyc25pZS0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50LAorCQkJCXNpemVvZihyc25pZS0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50KSk7CisJCQlwSWVCdWYgKz0gc2l6ZW9mKHJzbmllLT5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQpOworCQkJaWYgKHJzbmllLT5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQpIHsKKwkJCQkvKiBjb3B5IHB3aXNlX2NpcGhlcl9zdWl0ZXMgKi8KKwkJCQljZGZfbWVtX2NvcHkocEllQnVmLCByc25pZS0+cHdpc2VfY2lwaGVyX3N1aXRlcywKKwkJCQkJcnNuaWUtPnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQpOworCQkJCXBJZUJ1ZiArPSByc25pZS0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ICogNDsKKwkJCX0KKwkJCWNkZl9tZW1fY29weShwSWVCdWYsICZyc25pZS0+YWttX3N1aXRlX2NvdW50LCAyKTsKKwkJCXBJZUJ1ZiArPSAyOworCQkJaWYgKHJzbmllLT5ha21fc3VpdGVfY291bnQpIHsKKwkJCQkvKiBjb3B5IGFrbV9zdWl0ZXMgKi8KKwkJCQljZGZfbWVtX2NvcHkocEllQnVmLCByc25pZS0+YWttX3N1aXRlcywKKwkJCQkJcnNuaWUtPmFrbV9zdWl0ZV9jb3VudCAqIDQpOworCQkJCXBJZUJ1ZiArPSByc25pZS0+YWttX3N1aXRlX2NvdW50ICogNDsKKwkJCX0KKwkJCS8qIGNvcHkgdGhlIHJlc3QgKi8KKwkJCWNkZl9tZW1fY29weShwSWVCdWYsIHJzbmllLT5ha21fc3VpdGVzICsKKwkJCQlyc25pZS0+YWttX3N1aXRlX2NvdW50ICogNCwKKwkJCQkyICsgcnNuaWUtPnBta2lkX2NvdW50ICogNCk7CisJCQlzZXNzaW9uX3B0ci0+bldwYVJzblJzcEllTGVuZ3RoID0gbkllTGVuICsgMjsKKwkJfQorCX0gZWxzZSBpZiAoKGVDU1JfQVVUSF9UWVBFX1dQQSA9PSBhdXRoX3R5cGUpIHx8CisJCQkoZUNTUl9BVVRIX1RZUEVfV1BBX1BTSyA9PSBhdXRoX3R5cGUpKSB7CisJCWlmIChpZV9sb2NhbC0+V1BBLnByZXNlbnQpIHsKKwkJCXREb3QxMWZJRVdQQSAqd3BhaWUgPSAmaWVfbG9jYWwtPldQQTsKKwkJCS8qIENhbGN1bGF0ZSB0aGUgYWN0dWFsIGxlbmd0aCB3cGFpZSAqLworCQkJbkllTGVuID0gMTIgKyAyIC8qIGF1dGhfc3VpdGVfY291bnQgKi8KKwkJCQkrIHdwYWllLT51bmljYXN0X2NpcGhlcl9jb3VudCAqIDQKKwkJCQkrIHdwYWllLT5hdXRoX3N1aXRlX2NvdW50ICogNDsKKworCQkJLyogVGhlIFdQQSBjYXBhYmlsaXRpZXMgZm9sbG93cyB0aGUgQXV0aCBTdWl0ZQorCQkJICogKHR3byBvY3RlY3RzKS0tIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGFuZAorCQkJICogd2UgYWx3YXlzICJzZW5kIiB6ZXJvLCBzbyBqdXN0IHJlbW92ZSBpdC4gIFRoaXMgaXMKKwkJCSAqIGNvbnNpc3RlbnQgd2l0aCBvdXIgYXNzdW1wdGlvbnMgaW4gdGhlIGZyYW1lcworCQkJICogY29tcGlsZXI7IG5JZUxlbiBkb2Vzbid0IGNvdW50IEVJRCAmIGxlbmd0aCBmaWVsZHMgKi8KKwkJCXNlc3Npb25fcHRyLT5wV3BhUnNuUnNwSUUgPSBjZGZfbWVtX21hbGxvYyhuSWVMZW4gKyAyKTsKKwkJCWlmIChOVUxMID09IHNlc3Npb25fcHRyLT5wV3BhUnNuUnNwSUUpCisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJCXNlc3Npb25fcHRyLT5wV3BhUnNuUnNwSUVbMF0gPSBET1QxMUZfRUlEX1dQQTsKKwkJCXNlc3Npb25fcHRyLT5wV3BhUnNuUnNwSUVbMV0gPSAodWludDhfdCkgbkllTGVuOworCQkJcEllQnVmID0gc2Vzc2lvbl9wdHItPnBXcGFSc25Sc3BJRSArIDI7CisJCQkvKiBDb3B5IFdQQSBPVUkgKi8KKwkJCWNkZl9tZW1fY29weShwSWVCdWYsICZjc3Jfd3BhX291aVsxXSwgNCk7CisJCQlwSWVCdWYgKz0gNDsKKwkJCWNkZl9tZW1fY29weShwSWVCdWYsICZ3cGFpZS0+dmVyc2lvbiwKKwkJCQk4ICsgd3BhaWUtPnVuaWNhc3RfY2lwaGVyX2NvdW50ICogNCk7CisJCQlwSWVCdWYgKz0gOCArIHdwYWllLT51bmljYXN0X2NpcGhlcl9jb3VudCAqIDQ7CisJCQljZGZfbWVtX2NvcHkocEllQnVmLCAmd3BhaWUtPmF1dGhfc3VpdGVfY291bnQsCisJCQkJMiArIHdwYWllLT5hdXRoX3N1aXRlX2NvdW50ICogNCk7CisJCQlwSWVCdWYgKz0gd3BhaWUtPmF1dGhfc3VpdGVfY291bnQgKiA0OworCQkJc2Vzc2lvbl9wdHItPm5XcGFSc25Sc3BJZUxlbmd0aCA9IG5JZUxlbiArIDI7CisJCX0KKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwllbHNlIGlmICgoZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfUFNLID09IGF1dGhfdHlwZSkgfHwKKwkJCShlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9DRVJUSUZJQ0FURSA9PQorCQkJIGF1dGhfdHlwZSkpIHsKKwkJaWYgKGllX2xvY2FsLT5XQVBJLnByZXNlbnQpIHsKKwkJCXREb3QxMWZJRVdBUEkgKndhcGlfaWUgPSAmaWVfbG9jYWwtPldBUEk7CisJCQkvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCBsZW5ndGggb2Ygd2FwaSBpZSovCisJCQluSWVMZW4gPSA0ICsgMiAvKiBwd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKi8KKwkJCQkrIHdhcGlfaWUtPmFrbV9zdWl0ZV9jb3VudCAqIDQKKwkJCQkrIHdhcGlfaWUtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50ICogNAorCQkJCSsgNjsgIC8qIGdwX2NpcGhlcl9zdWl0ZSArIHByZWF1dGggKyByZXNlcnZlZCAqLworCisJCQlpZiAod2FwaV9pZS0+YmtpZF9jb3VudCkKKwkJCQluSWVMZW4gKz0gMiArIHdhcGlfaWUtPmJraWRfY291bnQgKiA0OworCisJCQkvKiBuSWVMZW4gZG9lc24ndCBjb3VudCBFSUQgYW5kIGxlbmd0aCBmaWVsZHMgKi8KKwkJCXNlc3Npb25fcHRyLT5wV2FwaVJzcElFID0KKwkJCQljZGZfbWVtX21hbGxvYyhuSWVMZW4gKyAyKTsKKwkJCWlmIChOVUxMID09IHNlc3Npb25fcHRyLT5wV2FwaVJzcElFKQorCQkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCQlzZXNzaW9uX3B0ci0+cFdhcGlSc3BJRVswXSA9IERPVDExRl9FSURfV0FQSTsKKwkJCXNlc3Npb25fcHRyLT5wV2FwaVJzcElFWzFdID0gKHVpbnQ4X3QpIG5JZUxlbjsKKwkJCXBJZUJ1ZiA9IHNlc3Npb25fcHRyLT5wV2FwaVJzcElFICsgMjsKKwkJCS8qIGNvcHkgdXB0byBha21fc3VpdGVfY291bnQgKi8KKwkJCWNkZl9tZW1fY29weShwSWVCdWYsICZ3YXBpX2llLT52ZXJzaW9uLCAyKTsKKwkJCXBJZUJ1ZiArPSA0OworCQkJaWYgKHdhcGlfaWUtPmFrbV9zdWl0ZV9jb3VudCkgeworCQkJCS8qIGNvcHkgYWttX3N1aXRlcyAqLworCQkJCWNkZl9tZW1fY29weShwSWVCdWYsCisJCQkJCXdhcGlfaWUtPmFrbV9zdWl0ZXMsCisJCQkJCXdhcGlfaWUtPmFrbV9zdWl0ZV9jb3VudCAqIDQpOworCQkJCXBJZUJ1ZiArPSB3YXBpX2llLT5ha21fc3VpdGVfY291bnQgKiA0OworCQkJfQorCQkJY2RmX21lbV9jb3B5KHBJZUJ1ZiwKKwkJCQkmd2FwaV9pZS0+dW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQsIDIpOworCQkJcEllQnVmICs9IDI7CisJCQlpZiAod2FwaV9pZS0+dW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQpIHsKKwkJCQl1aW50MTZfdCBzdWl0ZV9zaXplID0KKwkJCQkJd2FwaV9pZS0+dW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQgKiA0OworCQkJCS8qIGNvcHkgcHdpc2VfY2lwaGVyX3N1aXRlcyAqLworCQkJCWNkZl9tZW1fY29weShwSWVCdWYsCisJCQkJCXdhcGlfaWUtPnVuaWNhc3RfY2lwaGVyX3N1aXRlcywKKwkJCQkJc3VpdGVfc2l6ZSk7CisJCQkJcEllQnVmICs9IHN1aXRlX3NpemU7CisJCQl9CisJCQkvKiBncF9jaXBoZXJfc3VpdGUgKi8KKwkJCWNkZl9tZW1fY29weShwSWVCdWYsCisJCQkJd2FwaV9pZS0+bXVsdGljYXN0X2NpcGhlcl9zdWl0ZSwgNCk7CisJCQlwSWVCdWYgKz0gNDsKKwkJCS8qIHByZWF1dGggKyByZXNlcnZlZCAqLworCQkJY2RmX21lbV9jb3B5KHBJZUJ1ZiwKKwkJCQl3YXBpX2llLT5tdWx0aWNhc3RfY2lwaGVyX3N1aXRlICsgNCwgMik7CisJCQlwSWVCdWYgKz0gMjsKKwkJCWlmICh3YXBpX2llLT5ia2lkX2NvdW50KSB7CisJCQkJLyogYmtpZF9jb3VudCAqLworCQkJCWNkZl9tZW1fY29weShwSWVCdWYsICZ3YXBpX2llLT5ia2lkX2NvdW50LCAyKTsKKwkJCQlwSWVCdWYgKz0gMjsKKwkJCQkvKiBjb3B5IGFrbV9zdWl0ZXMgKi8KKwkJCQljZGZfbWVtX2NvcHkocEllQnVmLCB3YXBpX2llLT5ia2lkLAorCQkJCQl3YXBpX2llLT5ia2lkX2NvdW50ICogNCk7CisJCQkJcEllQnVmICs9IHdhcGlfaWUtPmJraWRfY291bnQgKiA0OworCQkJfQorCQkJc2Vzc2lvbl9wdHItPm5XYXBpUnNwSWVMZW5ndGggPSBuSWVMZW4gKyAyOworCQl9CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIENERl9TVEFUVVMgY3NyX3JvYW1fc2F2ZV9zZWN1cml0eV9yc3BfaWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCXVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJCWVDc3JBdXRoVHlwZSBhdXRoVHlwZSwKKwkJCQkJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCQkJCQl0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzTG9jYWwgPSBwSWVzOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlpZiAocFNlc3Npb24tPnJvYW1PZmZsb2FkU3luY2hQYXJhbXMuYlJvYW1TeW5jaEluUHJvZ3Jlc3MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJRkwoIkxGUjM6Y3NyX3JvYW1fc2F2ZV9zZWN1cml0eV9yc3BfaWUiKSk7CisJfQorI2VuZGlmCisKKwlpZiAoKGVDU1JfQVVUSF9UWVBFX1dQQSA9PSBhdXRoVHlwZSkgfHwKKwkJKGVDU1JfQVVUSF9UWVBFX1dQQV9QU0sgPT0gYXV0aFR5cGUpIHx8CisJCShlQ1NSX0FVVEhfVFlQRV9SU04gPT0gYXV0aFR5cGUpIHx8CisJCShlQ1NSX0FVVEhfVFlQRV9SU05fUFNLID09IGF1dGhUeXBlKQorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJfHwgKGVDU1JfQVVUSF9UWVBFX0ZUX1JTTiA9PSBhdXRoVHlwZSkgfHwKKwkJKGVDU1JfQVVUSF9UWVBFX0ZUX1JTTl9QU0sgPT0gYXV0aFR5cGUpCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCQl8fCAoZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfUFNLID09IGF1dGhUeXBlKSB8fAorCQkoZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfQ0VSVElGSUNBVEUgPT0gYXV0aFR5cGUpCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJCXx8IChlQ1NSX0FVVEhfVFlQRV9SU05fUFNLX1NIQTI1NiA9PSBhdXRoVHlwZSkgfHwKKwkJKGVDU1JfQVVUSF9UWVBFX1JTTl84MDIxWF9TSEEyNTYgPT0gYXV0aFR5cGUpCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKwkpIHsKKwkJaWYgKCFwSWVzTG9jYWwgJiYgIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJCShjc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzKHBNYWMsCisJCQkJcFNpckJzc0Rlc2MsICZwSWVzTG9jYWwpKSkKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiBjYW5ub3QgcGFyc2UgSUVzIikpOworCQlpZiAocEllc0xvY2FsKSB7CisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9zYXZlX3BhcmFtcyhwTWFjLCBwU2Vzc2lvbiwgYXV0aFR5cGUsCisJCQkJCXBJZXMsIHBJZXNMb2NhbCk7CisJCQlpZiAoIXBJZXMpCisJCQkJLyogbG9jYWxseSBhbGxvY2F0ZWQgKi8KKwkJCQljZGZfbWVtX2ZyZWUocEllc0xvY2FsKTsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBhc3NvY2lhdGlvbiBpcyBhIDExciBhc3NvYyBvciBub3QgKi8KK2Jvb2wgY3NyX3JvYW1faXMxMXJfYXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKwlyZXR1cm4gY3NyX25laWdoYm9yX3JvYW1faXMxMXJfYXNzb2MocE1hYywgc2Vzc2lvbklkKTsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisvKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgYXNzb2NpYXRpb24gaXMgYSBFU0UgYXNzb2Mgb3Igbm90ICovCitib29sIGNzcl9yb2FtX2lzX2VzZV9hc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworCXJldHVybiBjc3JfbmVpZ2hib3Jfcm9hbV9pc19lc2VfYXNzb2MocE1hYywgc2Vzc2lvbklkKTsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisvKiBSZXR1cm5zIHdoZXRoZXIgIkxlZ2FjeSBGYXN0IFJvYW1pbmciIGlzIGN1cnJlbnRseSBlbmFibGVkLi4ub3Igbm90ICovCitib29sIGNzcl9yb2FtX2lzX2Zhc3Rfcm9hbV9lbmFibGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gTlVMTDsKKworCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJCWlmIChOVUxMICE9IHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpIHsKKwkJCWlmIChwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hICE9CisJCQkgICAgQ0RGX1NUQV9NT0RFKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJfQorCWlmICh0cnVlID09IENTUl9JU19GQVNUUk9BTV9JTl9DT05DVVJSRU5DWV9JTklfRkVBVFVSRV9FTkFCTEVEKHBNYWMpKSB7CisJCXJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZDsKKwl9IGVsc2UgeworCQlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQgJiYKKwkJCSghY3NyX2lzX2NvbmN1cnJlbnRfc2Vzc2lvbl9ydW5uaW5nKHBNYWMpKTsKKwl9Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisvKioKKyAqIGNzcl9uZWlnaGJvcl9yb2FtX2lzX2VzZV9hc3NvYygpIC0gQ2hlY2sgdGhlIEFzc29jaWF0aW9uIHR5cGUKKyAqIEBtYWNfY3R4OiBHbG9iYWwgTUFDIENvbnRleHQKKyAqIEBzZXNzaW9uX2lkOiBTZXNzaW9uIElEIG9uIHdoaWNoIHRoZSBjaGVjayBzaG91bGQgYmUgZG9uZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uCisgKiBpcyBhIEVTRSBhc3NvYyBvciBub3QKKyAqCisgKiBSZXR1cm46IFRydWUgaWYgRVNFIGFzc29jaWF0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgKiovCitib29sIGNzcl9uZWlnaGJvcl9yb2FtX2lzX2VzZV9hc3NvYyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50OF90IHNlc3Npb25faWQpCit7CisJcmV0dXJuIG1hY19jdHgtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uX2lkXS5pc0VTRUFzc29jOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKworLyogUmV0dXJucyB3aGV0aGVyICJGVyBiYXNlZCBCRyBzY2FuIiBpcyBjdXJyZW50bHkgZW5hYmxlZC4uLm9yIG5vdCAqLworYm9vbCBjc3Jfcm9hbV9pc19yb2FtX29mZmxvYWRfc2Nhbl9lbmFibGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJcmV0dXJuIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNSb2FtT2ZmbG9hZFNjYW5FbmFibGVkOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpCitib29sIGNzcl9yb2FtX2lzX2VzZV9pbmlfZmVhdHVyZV9lbmFibGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJcmV0dXJuIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNFc2VJbmlGZWF0dXJlRW5hYmxlZDsKK30KKyNlbmRpZiAvKkZFQVRVUkVfV0xBTl9FU0UgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorZUNzclBoeU1vZGUgY3NyX3JvYW1kb3QxMW1vZGVfdG9fcGh5bW9kZSh1aW50OF90IGRvdDExbW9kZSkKK3sKKwllQ3NyUGh5TW9kZSBwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFX2FiZzsKKworCXN3aXRjaCAoZG90MTFtb2RlKSB7CisJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfQUxMOgorCQlwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFX2FiZzsKKwkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFBOgorCQlwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYTsKKwkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFCOgorCQlwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYjsKKwkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFHOgorCQlwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExZzsKKwkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFOOgorCQlwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExbjsKKwkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFHX09OTFk6CisJCXBoeW1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFnX09OTFk7CisJCWJyZWFrOworCWNhc2UgV05JX0NGR19ET1QxMV9NT0RFXzExTl9PTkxZOgorCQlwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExbl9PTkxZOworCQlicmVhazsKKwljYXNlIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUFDOgorCQlwaHltb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYWM7CisJCWJyZWFrOworCWNhc2UgV05JX0NGR19ET1QxMV9NT0RFXzExQUNfT05MWToKKwkJcGh5bW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWFjX09OTFk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBwaHltb2RlOworfQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECitDREZfU1RBVFVTIGNzcl9yb2FtX29mZmxvYWRfc2VuZF9zeW5jaF9jbmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBTaXJTbWVSb2FtT2ZmbG9hZFN5bmNoQ25mIHBSb2FtT2ZmbG9hZFN5bmNoQ25mOworCWNkc19tc2dfdCBtc2c7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9ICZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF07CisJcFJvYW1PZmZsb2FkU3luY2hDbmYgPQorCQljZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclNtZVJvYW1PZmZsb2FkU3luY2hDbmYpKTsKKwlpZiAoTlVMTCA9PSBwUm9hbU9mZmxvYWRTeW5jaENuZikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBub3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJvYW0iCisJCQkgICJvZmZsb2FkIHN5bmNoIGNvbmZpcm1hdGlvbiBkYXRhIiwgX19mdW5jX18pOworCQlwU2Vzc2lvbi0+cm9hbU9mZmxvYWRTeW5jaFBhcmFtcy5iUm9hbVN5bmNoSW5Qcm9ncmVzcyA9CisJCQlmYWxzZTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJcFJvYW1PZmZsb2FkU3luY2hDbmYtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwltc2cudHlwZSA9IFdNQV9ST0FNX09GRkxPQURfU1lOQ0hfQ05GOworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHlwdHIgPSBwUm9hbU9mZmxvYWRTeW5jaENuZjsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiTEZSMzogUG9zdGluZyBXTUFfUk9BTV9PRkZMT0FEX1NZTkNIX0NORiIpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCSAgICAoY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1dNQSwgJm1zZykpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJICAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV01BX1JPQU1fT0ZGTE9BRF9TWU5DSF9DTkYgbWVzc2FnZSB0byBXTUEiLAorCQkJICBfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShwUm9hbU9mZmxvYWRTeW5jaENuZik7CisJCXBTZXNzaW9uLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLmJSb2FtU3luY2hJblByb2dyZXNzID0KKwkJCWZhbHNlOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXBTZXNzaW9uLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLmJSb2FtU3luY2hJblByb2dyZXNzID0gZmFsc2U7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBjc3Jfcm9hbV9zeW5jaF9jbGVhbl91cCAodHBBbmlTaXJHbG9iYWwgbWFjLCB1aW50OF90IHNlc3Npb25faWQpCit7CisJY2RzX21zZ190IG1zZzsKKwlzdHJ1Y3Qgcm9hbV9vZmZsb2FkX3N5bmNoX2ZhaWwgKnJvYW1fb2ZmbG9hZF9mYWlsZWQgPSBOVUxMOworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiA9ICZtYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbl9pZF07CisKKwkvKiBDbGVhbiB1cCB0aGUgcm9hbSBzeW5jaCBpbiBwcm9ncmVzcyBmb3IgTEZSMyAqLworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkgICIlczogUm9hbSBTeW5jaCBGYWlsZWQsIENsZWFuIFVwIiwgX19mdW5jX18pOworCXNlc3Npb24tPnJvYW1PZmZsb2FkU3luY2hQYXJhbXMuYlJvYW1TeW5jaEluUHJvZ3Jlc3MgPSBmYWxzZTsKKworCXJvYW1fb2ZmbG9hZF9mYWlsZWQgPSBjZGZfbWVtX21hbGxvYygKKwkJCQlzaXplb2Yoc3RydWN0IHJvYW1fb2ZmbG9hZF9zeW5jaF9mYWlsKSk7CisJaWYgKE5VTEwgPT0gcm9hbV9vZmZsb2FkX2ZhaWxlZCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByb2FtIHN5bmNoIGZhaWwiICwKKwkJCSAgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcm9hbV9vZmZsb2FkX2ZhaWxlZC0+c2Vzc2lvbl9pZCA9IHNlc3Npb25faWQ7CisJbXNnLnR5cGUgICAgID0gV01BX1JPQU1fT0ZGTE9BRF9TWU5DSF9GQUlMOworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHlwdHIgID0gcm9hbV9vZmZsb2FkX2ZhaWxlZDsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLAorCQkJCQkJICAgICAgICZtc2cpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSIlczogVW5hYmxlIHRvIHBvc3QgV01BX1JPQU1fT0ZGTE9BRF9TWU5DSF9GQUlMIHRvIFdNQSIsCisJCQlfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShyb2FtX29mZmxvYWRfZmFpbGVkKTsKKwl9Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorLyoqCisgKiBjc3Jfcm9hbV9jb3B5X2h0X3Byb2ZpbGUoKSAtIENvcHkgZnJvbSBzcmMgdG8gZHN0CisgKiBAZHN0X3Byb2ZpbGU6ICAgICAgICAgIERlc3RpbmF0aW9uIEhUIHByb2ZpbGUKKyAqIEBzcmNfcHJvZmlsZTogICAgICAgICAgU291cmNlIEhUIHByb2ZpbGUKKyAqCisgKiBDb3B5IHRoZSBIVCBwcm9maWxlIGZyb20gdGhlIGdpdmVuIHNvdXJjZSB0byBkZXN0aW5hdGlvbgorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBjc3Jfcm9hbV9jb3B5X2h0X3Byb2ZpbGUodENzclJvYW1IVFByb2ZpbGUgKmRzdF9wcm9maWxlLAorCQl0U2lyU21lSFRQcm9maWxlICpzcmNfcHJvZmlsZSkKK3sKKwlkc3RfcHJvZmlsZS0+cGh5bW9kZSA9CisJCWNzcl9yb2FtZG90MTFtb2RlX3RvX3BoeW1vZGUoc3JjX3Byb2ZpbGUtPmRvdDExbW9kZSk7CisJZHN0X3Byb2ZpbGUtPmh0Q2FwYWJpbGl0eSA9IHNyY19wcm9maWxlLT5odENhcGFiaWxpdHk7CisJZHN0X3Byb2ZpbGUtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0KKwkJc3JjX3Byb2ZpbGUtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworCWRzdF9wcm9maWxlLT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCA9CisJCXNyY19wcm9maWxlLT5odFJlY29tbWVuZGVkVHhXaWR0aFNldDsKKwlkc3RfcHJvZmlsZS0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0KKwkJc3JjX3Byb2ZpbGUtPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWRzdF9wcm9maWxlLT52aHRDYXBhYmlsaXR5ID0gc3JjX3Byb2ZpbGUtPnZodENhcGFiaWxpdHk7CisJZHN0X3Byb2ZpbGUtPnZodFR4Q2hhbm5lbFdpZHRoU2V0ID0gc3JjX3Byb2ZpbGUtPnZodFR4Q2hhbm5lbFdpZHRoU2V0OworCWRzdF9wcm9maWxlLT5hcENlbnRlckNoYW4gPSBzcmNfcHJvZmlsZS0+YXBDZW50ZXJDaGFuOworCWRzdF9wcm9maWxlLT5hcENoYW5XaWR0aCA9IHNyY19wcm9maWxlLT5hcENoYW5XaWR0aDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKgorICogY3NyX3JvYW1fcHJvY2Vzc19yZXN1bHRzX2RlZmF1bHQoKSAtIFByb2Nlc3MgdGhlIHJlc3VsdCBmb3Igc3RhcnQgYnNzCisgKiBAbWFjX2N0eDogICAgICAgICAgR2xvYmFsIE1BQyBDb250ZXh0CisgKiBAY21kOiAgICAgICAgICAgICAgQ29tbWFuZCB0byBiZSBwcm9jZXNzZWQKKyAqIEBjb250ZXh0OiAgICAgICAgICBBZGRpdGlvbmFsIGRhdGEgaW4gY29udGV4dCBvZiB0aGUgY21kCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGNzcl9yb2FtX3Byb2Nlc3NfcmVzdWx0c19kZWZhdWx0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCSAgICAgdFNtZUNtZCAqY21kLCB2b2lkICpjb250ZXh0LCBlQ3NyUm9hbUNvbXBsZXRlUmVzdWx0IHJlcykKK3sKKwl1aW50MzJfdCBzZXNzaW9uX2lkID0gY21kLT5zZXNzaW9uSWQ7CisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25faWQpOworCXRDc3JSb2FtSW5mbyByb2FtX2luZm87CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPR1csIEZMKCJyZWNlaXZlcyBubyBhc3NvY2lhdGlvbiBpbmRpY2F0aW9uIikpOworCXNtc19sb2cobWFjX2N0eCwgTE9HMSwgRkwoIkFzc29jIHJlZiBjb3VudCAlZCIpLAorCQkJc2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQpOworCWlmIChDU1JfSVNfSU5GUkFTVFJVQ1RVUkUoJnNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpCisJCXx8IENTUl9JU19ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUShtYWNfY3R4LCBzZXNzaW9uX2lkKSkgeworCQkvKgorCQkgKiBkbyBub3QgZnJlZSBmb3IgdGhlIG90aGVyIHByb2ZpbGVzIGFzIHdlIG5lZWQKKwkJICogdG8gc2VuZCBkb3duIHN0b3AgQlNTIGxhdGVyCisJCSAqLworCQljc3JfZnJlZV9jb25uZWN0X2Jzc19kZXNjKG1hY19jdHgsIHNlc3Npb25faWQpOworCQljc3Jfcm9hbV9mcmVlX2Nvbm5lY3RfcHJvZmlsZShtYWNfY3R4LAorCQkJJnNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpOworCQljc3Jfcm9hbV9mcmVlX2Nvbm5lY3RlZF9pbmZvKG1hY19jdHgsICZzZXNzaW9uLT5jb25uZWN0ZWRJbmZvKTsKKwkJY3NyX3NldF9kZWZhdWx0X2RvdDExX21vZGUobWFjX2N0eCk7CisJfQorCisJc3dpdGNoIChjbWQtPnUucm9hbUNtZC5yb2FtUmVhc29uKSB7CisJLyoKKwkgKiBJZiB0aGlzIHRyYW5zaXRpb24gaXMgYmVjYXVzZSBvZiBhbiA4MDIuMTEgT0lELCB0aGVuIHdlCisJICogdHJhbnNpdGlvbiBiYWNrIHRvIElOSVQgc3RhdGUgc28gd2Ugc2l0IHdhaXRpbmcgZm9yIG1vcmUKKwkgKiBPSURzIHRvIGJlIGlzc3VlZCBhbmQgd2UgZG9uJ3Qgc3RhcnQgdGhlIElETEUgdGltZXIuCisJICovCisJY2FzZSBlQ3NyU21lSXNzdWVkRlRSZWFzc29jOgorCWNhc2UgZUNzclNtZUlzc3VlZEFzc29jVG9TaW1pbGFyQVA6CisJY2FzZSBlQ3NySGRkSXNzdWVkOgorCWNhc2UgZUNzclNtZUlzc3VlZERpc2Fzc29jRm9ySGFuZG9mZjoKKwkJY3NyX3JvYW1fc3RhdGVfY2hhbmdlKG1hY19jdHgsIGVDU1JfUk9BTUlOR19TVEFURV9JRExFLAorCQkJc2Vzc2lvbl9pZCk7CisJCWNkZl9tZW1fc2V0KCZyb2FtX2luZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pLCAwKTsKKwkJcm9hbV9pbmZvLnBCc3NEZXNjID0gY21kLT51LnJvYW1DbWQucExhc3RSb2FtQnNzOworCQlyb2FtX2luZm8ucFByb2ZpbGUgPSAmY21kLT51LnJvYW1DbWQucm9hbVByb2ZpbGU7CisJCXJvYW1faW5mby5zdGF0dXNDb2RlID0gc2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnN0YXR1c0NvZGU7CisJCXJvYW1faW5mby5yZWFzb25Db2RlID0gc2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisJCWNkZl9tZW1fY29weSgmcm9hbV9pbmZvLmJzc2lkLAorCQkJJnNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5ic3NJZCwKKwkJCXNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworCQkvKgorCQkgKiBJZiBKb2luIGZhaWxzIHdoaWxlIEhhbmRvZmYgaXMgaW4gcHJvZ3Jlc3MsIGluZGljYXRlCisJCSAqIGRpc2Fzc29jaWF0ZWQgZXZlbnQgdG8gc3VwcGxpY2FudCB0byByZWNvbm5lY3QKKwkJICovCisJCWlmIChjc3Jfcm9hbV9pc19oYW5kb2ZmX2luX3Byb2dyZXNzKG1hY19jdHgsIHNlc3Npb25faWQpKSB7CisJCQljc3JfbmVpZ2hib3Jfcm9hbV9pbmRpY2F0ZV9jb25uZWN0KG1hY19jdHgsCisJCQkJKHVpbnQ4X3Qpc2Vzc2lvbl9pZCwgQ0RGX1NUQVRVU19FX0ZBSUxVUkUpOworCQl9CisjZW5kaWYKKwkJaWYgKHNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250ID4gMCkgeworCQkJc2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQtLTsKKwkJCWlmIChlQ3NySm9pbkZhaWx1cmVEdWVUb0NvbmN1cnJlbmN5ID09IHJlcykKKwkJCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJCSZyb2FtX2luZm8sIGNtZC0+dS5yb2FtQ21kLnJvYW1JZCwKKwkJCQkJZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04sCisJCQkJCWVDU1JfUk9BTV9SRVNVTFRfQVNTT0NfRkFJTF9DT05fQ0hBTk5FTCk7CisJCQllbHNlCisJCQkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQkJCQkmcm9hbV9pbmZvLCBjbWQtPnUucm9hbUNtZC5yb2FtSWQsCisJCQkJCWVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OLAorCQkJCQllQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGJSZWZBc3NvY1N0YXJ0Q250IGlzIG5vdCBpbmNyZW1lbnRlZCB3aGVuCisJCQkgKiBlUm9hbVN0YXRlID09IGVDc3JTdG9wUm9hbWluZ0R1ZVRvQ29uY3VycmVuY3kKKwkJCSAqIGluIGNzcl9yb2FtX2pvaW5fbmV4dF9ic3MgQVBJLiBzbyBoYW5kbGUgdGhpcyBpbgorCQkJICogZWxzZSBjYXNlIGJ5IHNlbmRpbmcgYXNzb2MgZmFpbHVyZQorCQkJICovCisJCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJJnJvYW1faW5mbywgY21kLT51LnNjYW5DbWQucm9hbUlkLAorCQkJCWVDU1JfUk9BTV9BU1NPQ0lBVElPTl9GQUlMVVJFLAorCQkJCWVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSk7CisJCX0KKwkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgicm9hbShyZWFzb24gJWQpIGZhaWxlZCIpLAorCQkJY21kLT51LnJvYW1DbWQucm9hbVJlYXNvbik7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCQlzbWVfcW9zX3VwZGF0ZV9oYW5kX29mZigodWludDhfdCkgc2Vzc2lvbl9pZCwgZmFsc2UpOworCQlzbWVfcW9zX2Nzcl9ldmVudF9pbmQobWFjX2N0eCwgKHVpbnQ4X3QpIHNlc3Npb25faWQsCisJCQlTTUVfUU9TX0NTUl9ESVNDT05ORUNUX0lORCwgTlVMTCk7CisjZW5kaWYKKwkJY3NyX3JvYW1fY29tcGxldGlvbihtYWNfY3R4LCBzZXNzaW9uX2lkLCBOVUxMLCBjbWQsCisJCQllQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUsIGZhbHNlKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQlRBTVBfVVRfUkYKKwkJLyoKKwkJICogRm9yIFdEUyBTVEEuIFRvIGZpeCB0aGUgaXNzdWUgd2hlcmUgdGhlIFdEUyBBUCBzaWRlIG1heQorCQkgKiBiZSB0b28gYnVzeSBieSBCVCBhY3Rpdml0eSBhbmQgbm90IGFibGUgdG8gcmVjZWl2ZQorCQkgKiBXTEFOIHRyYWZmaWMuIFJldHJ5IHRoZSBqb2luCisJCSAqLworCQlpZiAoQ1NSX0lTX1dEU19TVEEocHJvZmlsZSkpCisJCQljc3Jfcm9hbV9zdGFydF9qb2luX3JldHJ5X3RpbWVyKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJQ1NSX0pPSU5fUkVUUllfVElNRU9VVF9QRVJJT0QpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgZUNzckhkZElzc3VlZFJlYXNzb2NUb1NhbWVBUDoKKwljYXNlIGVDc3JTbWVJc3N1ZWRSZWFzc29jVG9TYW1lQVA6CisJCWNzcl9yb2FtX3N0YXRlX2NoYW5nZShtYWNfY3R4LCBlQ1NSX1JPQU1JTkdfU1RBVEVfSURMRSwKKwkJCXNlc3Npb25faWQpOworCisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbl9pZCwgTlVMTCwKKwkJCWNtZC0+dS5yb2FtQ21kLnJvYW1JZCwgZUNTUl9ST0FNX0RJU0FTU09DSUFURUQsCisJCQllQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCk7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCQlzbWVfcW9zX2Nzcl9ldmVudF9pbmQobWFjX2N0eCwgKHVpbnQ4X3QpIHNlc3Npb25faWQsCisJCQlTTUVfUU9TX0NTUl9ESVNDT05ORUNUX0lORCwgTlVMTCk7CisjZW5kaWYKKwkJY3NyX3JvYW1fY29tcGxldGlvbihtYWNfY3R4LCBzZXNzaW9uX2lkLCBOVUxMLCBjbWQsCisJCQllQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUsIGZhbHNlKTsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyRm9yY2VkRGlzYXNzb2M6CisJY2FzZSBlQ3NyRm9yY2VkRGVhdXRoOgorCWNhc2UgZUNzclNtZUlzc3VlZElic3NKb2luRmFpbHVyZToKKwkJY3NyX3JvYW1fc3RhdGVfY2hhbmdlKG1hY19jdHgsIGVDU1JfUk9BTUlOR19TVEFURV9JRExFLAorCQkJc2Vzc2lvbl9pZCk7CisKKwkJaWYgKGVDc3JTbWVJc3N1ZWRJYnNzSm9pbkZhaWx1cmUgPT0gY21kLT51LnJvYW1DbWQucm9hbVJlYXNvbikKKwkJCS8qIG5vdGlmeSBIREQgdGhhdCBJQlNTIGpvaW4gZmFpbGVkICovCisJCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsIE5VTEwsIDAsCisJCQkJZUNTUl9ST0FNX0lCU1NfSU5ELAorCQkJCWVDU1JfUk9BTV9SRVNVTFRfSUJTU19KT0lOX0ZBSUxFRCk7CisJCWVsc2UKKwkJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbl9pZCwgTlVMTCwKKwkJCQljbWQtPnUucm9hbUNtZC5yb2FtSWQsIGVDU1JfUk9BTV9ESVNBU1NPQ0lBVEVELAorCQkJCWVDU1JfUk9BTV9SRVNVTFRfRk9SQ0VEKTsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisJCXNtZV9xb3NfY3NyX2V2ZW50X2luZChtYWNfY3R4LCAodWludDhfdCkgc2Vzc2lvbl9pZCwKKwkJCQlTTUVfUU9TX0NTUl9ESVNDT05ORUNUX0lORCwKKwkJCQlOVUxMKTsKKyNlbmRpZgorCQljc3Jfcm9hbV9saW5rX2Rvd24obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisKKwkJaWYgKG1hY19jdHgtPnJvYW0uZGVhdXRoUnNwU3RhdHVzID09IGVTSVJfU01FX0RFQVVUSF9TVEFUVVMpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiRlcgc3RpbGwgaW4gY29ubmVjdGVkIHN0YXRlIikpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlQ3NyRm9yY2VkSWJzc0xlYXZlOgorCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsIE5VTEwsCisJCQljbWQtPnUucm9hbUNtZC5yb2FtSWQsIGVDU1JfUk9BTV9JQlNTX0xFQVZFLAorCQkJZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1NUT1ApOworCQlicmVhazsKKwljYXNlIGVDc3JGb3JjZWREaXNhc3NvY01JQ0ZhaWx1cmU6CisJCWNzcl9yb2FtX3N0YXRlX2NoYW5nZShtYWNfY3R4LCBlQ1NSX1JPQU1JTkdfU1RBVEVfSURMRSwKKwkJCXNlc3Npb25faWQpOworCisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbl9pZCwgTlVMTCwKKwkJCWNtZC0+dS5yb2FtQ21kLnJvYW1JZCwgZUNTUl9ST0FNX0RJU0FTU09DSUFURUQsCisJCQllQ1NSX1JPQU1fUkVTVUxUX01JQ19GQUlMVVJFKTsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisJCXNtZV9xb3NfY3NyX2V2ZW50X2luZChtYWNfY3R4LCAodWludDhfdCkgc2Vzc2lvbl9pZCwKKwkJCVNNRV9RT1NfQ1NSX0RJU0NPTk5FQ1RfUkVRLCBOVUxMKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIGVDc3JTdG9wQnNzOgorCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsIE5VTEwsCisJCQljbWQtPnUucm9hbUNtZC5yb2FtSWQsIGVDU1JfUk9BTV9JTkZSQV9JTkQsCisJCQllQ1NSX1JPQU1fUkVTVUxUX0lORlJBX1NUT1BQRUQpOworCQlicmVhazsKKwljYXNlIGVDc3JGb3JjZWREaXNhc3NvY1N0YToKKwljYXNlIGVDc3JGb3JjZWREZWF1dGhTdGE6CisJCWNzcl9yb2FtX3N0YXRlX2NoYW5nZShtYWNfY3R4LCBlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTkVELAorCQkJc2Vzc2lvbl9pZCk7CisJCXNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChtYWNfY3R4LCBzZXNzaW9uX2lkKSAmJgorCQkJQ1NSX0lTX0lORlJBX0FQKCZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKSkgeworCQkJcm9hbV9pbmZvLnUucENvbm5lY3RlZFByb2ZpbGUgPQorCQkJCSZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCQkJY2RmX21lbV9jb3B5KHJvYW1faW5mby5wZWVyTWFjLmJ5dGVzLAorCQkJCQljbWQtPnUucm9hbUNtZC5wZWVyTWFjLAorCQkJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJCXJvYW1faW5mby5yZWFzb25Db2RlID0gZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQ7CisJCQlyb2FtX2luZm8uc3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJCSZyb2FtX2luZm8sIGNtZC0+dS5yb2FtQ21kLnJvYW1JZCwKKwkJCQkJZUNTUl9ST0FNX0xPU1RMSU5LLAorCQkJCQllQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlQ3NyTG9zdExpbmsxOgorCQkvKiBpZiBsb3N0IGxpbmsgcm9hbTEgZmFpbGVkLCB0aGVuIGlzc3VlIGxvc3QgbGluayBTY2FuMiAuLi4gKi8KKwkJY3NyX3NjYW5fcmVxdWVzdF9sb3N0X2xpbmsyKG1hY19jdHgsIHNlc3Npb25faWQpOworCQlicmVhazsKKwljYXNlIGVDc3JMb3N0TGluazI6CisJCS8qIGlmIGxvc3QgbGluayByb2FtMiBmYWlsZWQsIHRoZW4gaXNzdWUgbG9zdCBsaW5rIHNjYW4zIC4uLiAqLworCQljc3Jfc2Nhbl9yZXF1ZXN0X2xvc3RfbGluazMobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJCWJyZWFrOworCWNhc2UgZUNzckxvc3RMaW5rMzoKKwlkZWZhdWx0OgorCQljc3Jfcm9hbV9zdGF0ZV9jaGFuZ2UobWFjX2N0eCwKKwkJCWVDU1JfUk9BTUlOR19TVEFURV9JRExFLCBzZXNzaW9uX2lkKTsKKworCQkvKiBXZSBhcmUgZG9uZSB3aXRoIG9uZSByb3VuZCBvZiBsb3N0bGluayByb2FtaW5nIGhlcmUgKi8KKwkJY3NyX3NjYW5faGFuZGxlX2ZhaWxlZF9sb3N0bGluazMobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBjc3Jfcm9hbV9wcm9jZXNzX3N0YXJ0X2Jzc19zdWNjZXNzKCkgLSBQcm9jZXNzIHRoZSByZXN1bHQgZm9yIHN0YXJ0IGJzcworICogQG1hY19jdHg6ICAgICAgICAgIEdsb2JhbCBNQUMgQ29udGV4dAorICogQGNtZDogICAgICAgICAgICAgIENvbW1hbmQgdG8gYmUgcHJvY2Vzc2VkCisgKiBAY29udGV4dDogICAgICAgICAgQWRkaXRpb25hbCBkYXRhIGluIGNvbnRleHQgb2YgdGhlIGNtZAorICoKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBjc3Jfcm9hbV9wcm9jZXNzX3N0YXJ0X2Jzc19zdWNjZXNzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCSAgICAgdFNtZUNtZCAqY21kLCB2b2lkICpjb250ZXh0KQoreworCXVpbnQzMl90IHNlc3Npb25faWQgPSBjbWQtPnNlc3Npb25JZDsKKwl0Q3NyUm9hbVByb2ZpbGUgKnByb2ZpbGUgPSAmY21kLT51LnJvYW1DbWQucm9hbVByb2ZpbGU7CisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25faWQpOworCXRTaXJCc3NEZXNjcmlwdGlvbiAqYnNzX2Rlc2MgPSBOVUxMOworCXRDc3JSb2FtSW5mbyByb2FtX2luZm87CisJdFNpclNtZVN0YXJ0QnNzUnNwICpzdGFydF9ic3NfcnNwID0gTlVMTDsKKwl0Q3NyU2NhblJlc3VsdCAqc2Nhbl9yZXMgPSBOVUxMOworCWVSb2FtQ21kU3RhdHVzIHJvYW1fc3RhdHVzOworCWVDc3JSb2FtUmVzdWx0IHJvYW1fcmVzdWx0OworCXREb3QxMWZCZWFjb25JRXMgKmllc19wdHIgPSBOVUxMOworCXRTaXJNYWNBZGRyIGJjYXN0X21hYyA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OworCUNERl9TVEFUVVMgc3RhdHVzOworCWhvc3RfbG9nX2lic3NfcGt0X3R5cGUgKmlic3NfbG9nOworCXVpbnQzMl90IGJpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCXRTaXJTbWVIVFByb2ZpbGUgKnNyY19wcm9maWxlID0gTlVMTDsKKwl0Q3NyUm9hbUhUUHJvZmlsZSAqZHN0X3Byb2ZpbGUgPSBOVUxMOworI2VuZGlmCisKKwkvKgorCSAqIG9uIHRoZSBTdGFydEJzcyBSZXNwb25zZSwgTElNIGlzIHJldHVybmluZyB0aGUgQnNzIERlc2NyaXB0aW9uIHRoYXQKKwkgKiB3ZSBhcmUgYmVhY29uaW5nLiAgQWRkIHRoaXMgQnNzIERlc2NyaXB0aW9uIHRvIG91ciBzY2FuIHJlc3VsdHMgYW5kCisJICogY2hhaW4gdGhlIFByb2ZpbGUgdG8gdGhpcyBCc3MgRGVzY3JpcHRpb24uICBPbiBhIFN0YXJ0IEJTUywgdGhlcmUgd2FzCisJICogbm8gZGV0ZWN0ZWQgQnNzIGRlc2NyaXB0aW9uIChubyBwYXJ0bmVyKSBzbyB3ZSBpc3N1ZWQgdGhlIFN0YXJ0IEJzcworCSAqIHRvIHN0YXJ0IHRoZSBJYnNzIHdpdGhvdXQgYW55IEJzcyBkZXNjcmlwdGlvbi4gIExpbSB3YXMga2luZCBlbm91Z2gKKwkgKiB0byByZXR1cm4gdGhlIEJzcyBEZXNjcmlwdGlvbiB0aGF0IHdlIHN0YXJ0IGJlYWNvbmluZyBmb3IgdGhlIG5ld2x5CisJICogc3RhcnRlZCBJYnNzLgorCSAqLworCXNtc19sb2cobWFjX2N0eCwgTE9HMiwgRkwoInJlY2VpdmVzIHN0YXJ0IEJTUyBvayBpbmRpY2F0aW9uIikpOworCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXN0YXJ0X2Jzc19yc3AgPSAodFNpclNtZVN0YXJ0QnNzUnNwICopIGNvbnRleHQ7CisJY2RmX21lbV9zZXQoJnJvYW1faW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbyksIDApOworCWlmIChDU1JfSVNfSUJTUyhwcm9maWxlKSkKKwkJc2Vzc2lvbi0+Y29ubmVjdFN0YXRlID0gZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lCU1NfRElTQ09OTkVDVEVEOworCWVsc2UgaWYgKENTUl9JU19JTkZSQV9BUChwcm9maWxlKSkKKwkJc2Vzc2lvbi0+Y29ubmVjdFN0YXRlID0KKwkJCWVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JTkZSQV9ESVNDT05ORUNURUQ7CisJZWxzZQorCQlzZXNzaW9uLT5jb25uZWN0U3RhdGUgPSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfV0RTX0RJU0NPTk5FQ1RFRDsKKwlpZiAoIUNTUl9JU19XRFNfU1RBKHByb2ZpbGUpKSB7CisJCWNzcl9yb2FtX3N0YXRlX2NoYW5nZShtYWNfY3R4LCBlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTkVELAorCQkJc2Vzc2lvbl9pZCk7CisJCWJzc19kZXNjID0gJnN0YXJ0X2Jzc19yc3AtPmJzc0Rlc2NyaXB0aW9uOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJKGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMobWFjX2N0eCwgYnNzX2Rlc2MsCisJCQkJCQkJICAgICZpZXNfcHRyKSkpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HVywgRkwoImNhbm5vdCBwYXJzZSBJQlNTIElFcyIpKTsKKwkJCXJvYW1faW5mby5wQnNzRGVzYyA9IGJzc19kZXNjOworCQkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uX2lkLCAmcm9hbV9pbmZvLAorCQkJCWNtZC0+dS5yb2FtQ21kLnJvYW1JZCwgZUNTUl9ST0FNX0lCU1NfSU5ELAorCQkJCWVDU1JfUk9BTV9SRVNVTFRfSUJTU19TVEFSVF9GQUlMRUQpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghQ1NSX0lTX0lORlJBX0FQKHByb2ZpbGUpKSB7CisJCQlzY2FuX3JlcyA9CisJCQkJY3NyX3NjYW5fYXBwZW5kX2Jzc19kZXNjcmlwdGlvbihtYWNfY3R4LAorCQkJCQkJYnNzX2Rlc2MsIGllc19wdHIsIGZhbHNlLAorCQkJCQkJc2Vzc2lvbl9pZCk7CisJCX0KKwkJY3NyX3JvYW1fc2F2ZV9jb25uZWN0ZWRfYnNzX2Rlc2MobWFjX2N0eCwgc2Vzc2lvbl9pZCwgYnNzX2Rlc2MpOworCQljc3Jfcm9hbV9mcmVlX2Nvbm5lY3RfcHJvZmlsZShtYWNfY3R4LAorCQkJCSZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKTsKKwkJY3NyX3JvYW1fZnJlZV9jb25uZWN0ZWRfaW5mbyhtYWNfY3R4LAorCQkJCSZzZXNzaW9uLT5jb25uZWN0ZWRJbmZvKTsKKwkJaWYgKGJzc19kZXNjKSB7CisJCQljc3Jfcm9hbV9zYXZlX2Nvbm5lY3RlZF9pbmZvbWF0aW9uKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJCXByb2ZpbGUsIGJzc19kZXNjLCBpZXNfcHRyKTsKKwkJCWNkZl9tZW1fY29weSgmcm9hbV9pbmZvLmJzc2lkLCAmYnNzX2Rlc2MtPmJzc0lkLAorCQkJCXNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJCX0KKwkJLyogV2UgYXJlIGRvbmUgd2l0aCB0aGUgSUVzIHNvIGZyZWUgaXQgKi8KKwkJY2RmX21lbV9mcmVlKGllc19wdHIpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisJCVdMQU5fSE9TVF9ESUFHX0xPR19BTExPQyhpYnNzX2xvZywKKwkJCWhvc3RfbG9nX2lic3NfcGt0X3R5cGUsIExPR19XTEFOX0lCU1NfQyk7CisJCWlmIChpYnNzX2xvZykgeworCQkJaWYgKENTUl9JTlZBTElEX1NDQU5SRVNVTFRfSEFORExFID09CisJCQkJCWNtZC0+dS5yb2FtQ21kLmhCU1NMaXN0KSB7CisJCQkJLyoKKwkJCQkgKiBXZSBzdGFydCB0aGUgSUJTUyAoZGlkbid0IGZpbmQgYW55CisJCQkJICogbWF0Y2hlZCBJQlNTIG91dCB0aGVyZSkKKwkJCQkgKi8KKwkJCQlpYnNzX2xvZy0+ZXZlbnRJZCA9CisJCQkJCVdMQU5fSUJTU19FVkVOVF9TVEFSVF9JQlNTX1JTUDsKKwkJCX0gZWxzZSB7CisJCQkJaWJzc19sb2ctPmV2ZW50SWQgPQorCQkJCQlXTEFOX0lCU1NfRVZFTlRfSk9JTl9JQlNTX1JTUDsKKwkJCX0KKwkJCWlmIChic3NfZGVzYykgeworCQkJCWNkZl9tZW1fY29weShpYnNzX2xvZy0+YnNzaWQsCisJCQkJCWJzc19kZXNjLT5ic3NJZCwgNik7CisJCQkJaWJzc19sb2ctPm9wZXJhdGluZ0NoYW5uZWwgPQorCQkJCQlic3NfZGVzYy0+Y2hhbm5lbElkOworCQkJfQorCQkJaWYgKElTX1NJUl9TVEFUVVNfU1VDQ0VTUyh3bGFuX2NmZ19nZXRfaW50KAorCQkJCQkJbWFjX2N0eCwKKwkJCQkJCVdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMLAorCQkJCQkJJmJpKSkpCisJCQkJLyogVTggaXMgbm90IGVub3VnaCBmb3IgQkkgKi8KKwkJCQlpYnNzX2xvZy0+YmVhY29uSW50ZXJ2YWwgPSAodWludDhfdCkgYmk7CisJCQlXTEFOX0hPU1RfRElBR19MT0dfUkVQT1JUKGlic3NfbG9nKTsKKwkJfQorI2VuZGlmCisJCS8qCisJCSAqIE9ubHkgc2V0IGNvbnRleHQgZm9yIG5vbi1XRFNfU1RBLiBXZSBkb24ndCBldmVuIG5lZWQgaXQgZm9yCisJCSAqIFdEU19BUC4gQnV0IHNpbmNlIHRoZSBlbmNyeXB0aW9uLgorCQkgKiBpcyBXUEEyLVBTSyBzbyBpdCB3b24ndCBtYXR0ZXIuCisJCSAqLworCQlpZiAoQ1NSX0lTX0VOQ19UWVBFX1NUQVRJQyhwcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSkKKwkJCQkmJiBzZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUKKwkJCQkmJiAhQ1NSX0lTX0lORlJBX0FQKHNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkpIHsKKwkJCS8qCisJCQkgKiBJc3N1ZSB0aGUgc2V0IENvbnRleHQgcmVxdWVzdCB0byBMSU0gdG8gZXN0YWJsaXNoCisJCQkgKiB0aGUgQnJvYWRjYXN0IFNUQSBjb250ZXh0IGZvciB0aGUgSWJzcy4gSW4gUm9tZSBJQlNTCisJCQkgKiBjYXNlLCBkdW1teSBrZXkgaW5zdGFsbGF0aW9uIHdpbGwgYnJlYWsgcHJvcGVyIEJTUworCQkJICoga2V5IGluc3RhbGxhdGlvbiwgc28gc2tpcCBpdC4KKwkJCSAqLworCQkJaWYgKCFDU1JfSVNfSUJTUyhzZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpKSB7CisJCQkJLyogTk8ga2V5cy4gdGhlc2Uga2V5IHBhcmFtZXRlcnMgZG9uJ3QgbWF0dGVyICovCisJCQkJY3NyX3JvYW1faXNzdWVfc2V0X2NvbnRleHRfcmVxKG1hY19jdHgsCisJCQkJCXNlc3Npb25faWQsCisJCQkJCXByb2ZpbGUtPm5lZ290aWF0ZWRNQ0VuY3J5cHRpb25UeXBlLAorCQkJCQlic3NfZGVzYywgJmJjYXN0X21hYywgZmFsc2UsCisJCQkJCWZhbHNlLCBlU0lSX1RYX1JYLCAwLCAwLCBOVUxMLCAwKTsKKwkJCX0KKworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogS2VlcCB0aGUgc3RhdGUgdG8gZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5JTkcuCisJCSAqIE5lZWQgdG8gc2VuZCBqb2luX3JlcS4KKwkJICovCisJCWlmIChjbWQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5KSB7CisJCQlzY2FuX3JlcyA9IEdFVF9CQVNFX0FERFIoY21kLT51LnJvYW1DbWQuCisJCQkJCXBSb2FtQnNzRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKwkJCWlmIChzY2FuX3JlcykgeworCQkJCWJzc19kZXNjID0gJnNjYW5fcmVzLT5SZXN1bHQuQnNzRGVzY3JpcHRvcjsKKwkJCQlpZXNfcHRyID0gKHREb3QxMWZCZWFjb25JRXMgKikKKwkJCQkJKHNjYW5fcmVzLT5SZXN1bHQucHZJZXMpOworCQkJCS8qIFNldCB0aGUgcm9hbWluZyBzdWJzdGF0ZSB0byBqb2luIGF0dGVtcHQgKi8KKwkJCQljc3Jfcm9hbV9zdWJzdGF0ZV9jaGFuZ2UobWFjX2N0eCwKKwkJCQkJZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5fUkVRLAorCQkJCQlzZXNzaW9uX2lkKTsKKwkJCQlzdGF0dXMgPSBjc3Jfc2VuZF9qb2luX3JlcV9tc2cobWFjX2N0eCwKKwkJCQkJCXNlc3Npb25faWQsIGJzc19kZXNjLAorCQkJCQkJcHJvZmlsZSwgaWVzX3B0ciwKKwkJCQkJCWVXTklfU01FX0pPSU5fUkVRKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkiU3RhcnRCU1MgZm9yIFdEUyBzdGF0aW9uIHdpdGggbm8gQnNzRGVzYyIpOworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJfQorCX0KKwkvKgorCSAqIE9ubHkgdGVsbCB1cHBlciBsYXllciBpcyB3ZSBzdGFydCB0aGUgQlNTIGJlY2F1c2UgVmlzdGEgZG9lc24ndCBsaWtlCisJICogbXVsdGlwbGUgY29ubmVjdGlvbiBpbmRpY2F0aW9ucy4gSWYgd2UgZG9uJ3Qgc3RhcnQgdGhlIEJTUyBvdXJzZWxmLAorCSAqIGhhbmRsZXIgb2YgZVNJUl9TTUVfSk9JTkVEX05FV19CU1Mgd2lsbCB0cmlnZ2VyIHRoZSBjb25uZWN0aW9uIHN0YXJ0CisJICogaW5kaWNhdGlvbiBpbiBWaXN0YQorCSAqLworCWlmICghQ1NSX0lTX0pPSU5fVE9fSUJTUyhwcm9maWxlKSkgeworCQlyb2FtX3N0YXR1cyA9IGVDU1JfUk9BTV9JQlNTX0lORDsKKwkJcm9hbV9yZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfU1RBUlRFRDsKKwkJaWYgKENTUl9JU19XRFMocHJvZmlsZSkpIHsKKwkJCXJvYW1fc3RhdHVzID0gZUNTUl9ST0FNX1dEU19JTkQ7CisJCQlyb2FtX3Jlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUQVJURUQ7CisJCX0KKwkJaWYgKENTUl9JU19JTkZSQV9BUChwcm9maWxlKSkgeworCQkJcm9hbV9zdGF0dXMgPSBlQ1NSX1JPQU1fSU5GUkFfSU5EOworCQkJcm9hbV9yZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX1NUQVJURUQ7CisJCX0KKwkJLyoKKwkJICogT25seSB0ZWxsIHVwcGVyIGxheWVyIGlzIHdlIHN0YXJ0IHRoZSBCU1MgYmVjYXVzZSBWaXN0YQorCQkgKiBkb2Vzbid0IGxpa2UgbXVsdGlwbGUgY29ubmVjdGlvbiBpbmRpY2F0aW9ucy4gSWYgd2UgZG9uJ3QKKwkJICogc3RhcnQgdGhlIEJTUyBvdXJzZWxmLCBoYW5kbGVyIG9mIGVTSVJfU01FX0pPSU5FRF9ORVdfQlNTCisJCSAqIHdpbGwgdHJpZ2dlciB0aGUgY29ubmVjdGlvbiBzdGFydCBpbmRpY2F0aW9uIGluIFZpc3RhCisJCSAqLworCQljZGZfbWVtX3NldCgmcm9hbV9pbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSwgMCk7CisJCXJvYW1faW5mby5zdGF0dXNDb2RlID0gc2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnN0YXR1c0NvZGU7CisJCXJvYW1faW5mby5yZWFzb25Db2RlID0gc2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisJCS8qIFdlIHN0YXJ0IHRoZSBJQlNTIChkaWRuJ3QgZmluZCBhbnkgbWF0Y2hlZCBJQlNTIG91dCB0aGVyZSkgKi8KKwkJcm9hbV9pbmZvLnBCc3NEZXNjID0gYnNzX2Rlc2M7CisJCXJvYW1faW5mby5zdGFJZCA9ICh1aW50OF90KSBzdGFydF9ic3NfcnNwLT5zdGFJZDsKKwkJY2RmX21lbV9jb3B5KHJvYW1faW5mby5ic3NpZC5ieXRlcywgYnNzX2Rlc2MtPmJzc0lkLAorCQkJCXNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJCWlmICghSVNfRkVBVFVSRV9TVVBQT1JURURfQllfRlcoU0xNX1NFU1NJT05JWkFUSU9OKSAmJgorCQkJCShjc3JfaXNfY29uY3VycmVudF9zZXNzaW9uX3J1bm5pbmcobWFjX2N0eCkpKSB7CisJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmRvQk1QU1dvcmthcm91bmQgPSAxOworCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX01DQ19UT19TQ0NfU1dJVENICisJCWRzdF9wcm9maWxlID0gJnNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuSFRQcm9maWxlOworCQlzcmNfcHJvZmlsZSA9ICZzdGFydF9ic3NfcnNwLT5IVFByb2ZpbGU7CisJCWlmIChtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmNjX3N3aXRjaF9tb2RlCisJCQkJIT0gQ0RGX01DQ19UT19TQ0NfU1dJVENIX0RJU0FCTEUpCisJCQljc3Jfcm9hbV9jb3B5X2h0X3Byb2ZpbGUoZHN0X3Byb2ZpbGUsIHNyY19wcm9maWxlKTsKKyNlbmRpZgorCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsICZyb2FtX2luZm8sCisJCQkJY21kLT51LnJvYW1DbWQucm9hbUlkLAorCQkJCXJvYW1fc3RhdHVzLCByb2FtX3Jlc3VsdCk7CisJfQorCisKKwlpZiAoQ1NSX0lTX1dEU19TVEEocHJvZmlsZSkpIHsKKwkJLyogbmVlZCB0byBzZW5kIHN0b3AgQlNTIGJlY2F1c2Ugd2UgZmFpbCB0byBzZW5kIGpvaW5fcmVxICovCisJCWNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZV9jbWQobWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCQllQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uX2lkLCAmcm9hbV9pbmZvLAorCQkJCWNtZC0+dS5yb2FtQ21kLnJvYW1JZCwKKwkJCQllQ1NSX1JPQU1fV0RTX0lORCwKKwkJCQllQ1NSX1JPQU1fUkVTVUxUX1dEU19TVE9QUEVEKTsKKwl9Cit9CisKKy8qKgorICogY3NyX3JvYW1fcHJvY2Vzc19qb2luX3JlcygpIC0gUHJvY2VzcyB0aGUgSm9pbiByZXN1bHRzCisgKiBAbWFjX2N0eDogICAgICAgICAgR2xvYmFsIE1BQyBDb250ZXh0CisgKiBAcmVzdWx0OiAgICAgICAgICAgUmVzdWx0IGFmdGVyIHRoZSBjb21tYW5kIHdhcyBwcm9jZXNzZWQKKyAqIEBjbWQ6ICAgICAgICAgICAgICBDb21tYW5kIHRvIGJlIHByb2Nlc3NlZAorICogQGNvbnRleHQ6ICAgICAgICAgIEFkZGl0aW9uYWwgZGF0YSBpbiBjb250ZXh0IG9mIHRoZSBjbWQKKyAqCisgKiBQcm9jZXNzIHRoZSBqb2luIHJlc3VsdHMgd2hpY2ggYXJlIG9idGFpbmVkIGluIGEgc3VjY2VzZnVsIGpvaW4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY3NyX3JvYW1fcHJvY2Vzc19qb2luX3Jlcyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCWVDc3JSb2FtQ29tcGxldGVSZXN1bHQgcmVzLCB0U21lQ21kICpjbWQsIHZvaWQgKmNvbnRleHQpCit7CisJdFNpck1hY0FkZHIgYmNhc3RfbWFjID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisJc21lX1Fvc0Fzc29jSW5mbyBhc3NvY19pbmZvOworCXVpbnQzMl90IGtleV90aW1lb3V0X2ludGVydmFsID0gMDsKKwl1aW50OF90IGFjbV9tYXNrID0gMDsgICAvKiBIREQgbmVlZHMgQUNNIG1hc2sgaW4gYXNzb2MgcnNwIGNhbGxiYWNrICovCisJdWludDMyX3Qgc2Vzc2lvbl9pZCA9IGNtZC0+c2Vzc2lvbklkOworCXRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSA9ICZjbWQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZTsKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJdFNpckJzc0Rlc2NyaXB0aW9uICpic3NfZGVzYyA9IE5VTEw7CisJdENzclNjYW5SZXN1bHQgKnNjYW5fcmVzID0gTlVMTDsKKwlzbWVfcW9zX2Nzcl9ldmVudF9pbmRUeXBlIGluZF9xb3M7CisJY3NyX3JvYW1fb2ZmbG9hZF9zeW5jaF9wYXJhbXMgKnJvYW1fb2ZmbG9hZF9wYXJhbXMgPSBOVUxMOworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCXRTaXJTbWVIVFByb2ZpbGUgKnNyY19wcm9maWxlID0gTlVMTDsKKwl0Q3NyUm9hbUhUUHJvZmlsZSAqZHN0X3Byb2ZpbGUgPSBOVUxMOworI2VuZGlmCisJdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpjb25uX3Byb2ZpbGUgPSBOVUxMOworCXREb3QxMWZCZWFjb25JRXMgKmllc19wdHIgPSBOVUxMOworCXRDc3JSb2FtSW5mbyByb2FtX2luZm87CisJc3RydWN0IHBzX2dsb2JhbF9pbmZvICpwc19nbG9iYWxfaW5mbyA9ICZtYWNfY3R4LT5zbWUucHNfZ2xvYmFsX2luZm87CisJdFNpclNtZUpvaW5Sc3AgKmpvaW5fcnNwID0gKHRTaXJTbWVKb2luUnNwICopIGNvbnRleHQ7CisJdWludDMyX3QgbGVuOworCisJcm9hbV9vZmZsb2FkX3BhcmFtcyA9ICZzZXNzaW9uLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zOworCWNvbm5fcHJvZmlsZSA9ICZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCWlmIChlQ3NyUmVhc3NvY1N1Y2Nlc3MgPT0gcmVzKQorCQlpbmRfcW9zID0gU01FX1FPU19DU1JfUkVBU1NPQ19DT01QTEVURTsKKwllbHNlCisJCWluZF9xb3MgPSBTTUVfUU9TX0NTUl9BU1NPQ19DT01QTEVURTsKKwlzbXNfbG9nKG1hY19jdHgsIExPR1csIEZMKCJyZWNlaXZlcyBhc3NvY2lhdGlvbiBpbmRpY2F0aW9uIikpOworCWNkZl9tZW1fc2V0KCZyb2FtX2luZm8sIHNpemVvZihyb2FtX2luZm8pLCAwKTsKKwkvKiBhbHdheXMgZnJlZSB0aGUgbWVtb3J5IGhlcmUgKi8KKwlpZiAoc2Vzc2lvbi0+cFdwYVJzblJzcElFKSB7CisJCXNlc3Npb24tPm5XcGFSc25Sc3BJZUxlbmd0aCA9IDA7CisJCWNkZl9tZW1fZnJlZShzZXNzaW9uLT5wV3BhUnNuUnNwSUUpOworCQlzZXNzaW9uLT5wV3BhUnNuUnNwSUUgPSBOVUxMOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCWlmIChzZXNzaW9uLT5wV2FwaVJzcElFKSB7CisJCXNlc3Npb24tPm5XYXBpUnNwSWVMZW5ndGggPSAwOworCQljZGZfbWVtX2ZyZWUoc2Vzc2lvbi0+cFdhcGlSc3BJRSk7CisJCXNlc3Npb24tPnBXYXBpUnNwSUUgPSBOVUxMOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorCXNlc3Npb24tPm1heFJldHJ5Q291bnQgPSAwOworCWNzcl9yb2FtX3N0b3Bfam9pbl9yZXRyeV90aW1lcihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKyNlbmRpZgorCS8qCisJICogUmVzZXQgcmVtYWluX2luX3Bvd2VyX2FjdGl2ZV90aWxsX2RoY3AgYXMKKwkgKiBpdCBtaWdodCBoYXZlIGJlZW4gc2V0IGJ5IGxhc3QgZmFpbGVkIHNlY3VyZWQgY29ubmVjdGlvbi4KKwkgKiBJdCBzaG91bGQgYmUgc2V0IG9ubHkgZm9yIHNlY3VyZWQgY29ubmVjdGlvbi4KKwkgKi8KKwlwc19nbG9iYWxfaW5mby0+cmVtYWluX2luX3Bvd2VyX2FjdGl2ZV90aWxsX2RoY3AgPSBmYWxzZTsKKwlpZiAoQ1NSX0lTX0lORlJBU1RSVUNUVVJFKHByb2ZpbGUpKQorCQlzZXNzaW9uLT5jb25uZWN0U3RhdGUgPSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfSU5GUkFfQVNTT0NJQVRFRDsKKwllbHNlCisJCXNlc3Npb24tPmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9XRFNfQ09OTkVDVEVEOworCS8qCisJICogVXNlIHRoZSBsYXN0IGNvbm5lY3RlZCBic3NkZXNjIGZvciByZWFzc29jLWluZyB0byB0aGUgc2FtZSBBUC4KKwkgKiBOT1RFOiBXaGF0IHRvIGRvIHdoZW4gcmVhc3NvYyB0byBhIGRpZmZlcmVudCBBUD8/PworCSAqLworCWlmICgoZUNzckhkZElzc3VlZFJlYXNzb2NUb1NhbWVBUCA9PSBjbWQtPnUucm9hbUNtZC5yb2FtUmVhc29uKQorCQl8fCAoZUNzclNtZUlzc3VlZFJlYXNzb2NUb1NhbWVBUCA9PQorCQkJY21kLT51LnJvYW1DbWQucm9hbVJlYXNvbikpIHsKKwkJYnNzX2Rlc2MgPSBzZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2M7CisJCWlmIChic3NfZGVzYykKKwkJCWNkZl9tZW1fY29weSgmcm9hbV9pbmZvLmJzc2lkLCAmYnNzX2Rlc2MtPmJzc0lkLAorCQkJCQlzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCX0gZWxzZSB7CisJCWlmIChjbWQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5KSB7CisJCQlzY2FuX3JlcyA9IEdFVF9CQVNFX0FERFIoY21kLT51LnJvYW1DbWQucFJvYW1Cc3NFbnRyeSwKKwkJCQkJdENzclNjYW5SZXN1bHQsIExpbmspOworCQkJaWYgKHNjYW5fcmVzICE9IE5VTEwpIHsKKwkJCQlic3NfZGVzYyA9ICZzY2FuX3Jlcy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3I7CisJCQkJaWVzX3B0ciA9ICh0RG90MTFmQmVhY29uSUVzICopCisJCQkJCShzY2FuX3Jlcy0+UmVzdWx0LnB2SWVzKTsKKwkJCQljZGZfbWVtX2NvcHkoJnJvYW1faW5mby5ic3NpZCwgJmJzc19kZXNjLT5ic3NJZCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoYnNzX2Rlc2MpIHsKKwkJcm9hbV9pbmZvLnN0YUlkID0gU1RBX0lOVkFMSURfSURYOworCQljc3Jfcm9hbV9zYXZlX2Nvbm5lY3RlZF9pbmZvbWF0aW9uKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQlwcm9maWxlLCBic3NfZGVzYywgaWVzX3B0cik7CisJCS8qIFNhdmUgV1BBL1JTTiBJRSAqLworCQljc3Jfcm9hbV9zYXZlX3NlY3VyaXR5X3JzcF9pZShtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQkJcHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlLCBic3NfZGVzYywgaWVzX3B0cik7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQlyb2FtX2luZm8uaXNFU0VBc3NvYyA9IGNvbm5fcHJvZmlsZS0+aXNFU0VBc3NvYzsKKyNlbmRpZgorCisJCS8qCisJCSAqIGNzcl9yb2FtX3N0YXRlX2NoYW5nZSBhbHNvIGFmZmVjdHMgc3ViLXN0YXRlLgorCQkgKiBIZW5jZSwgY3NyX3JvYW1fc3RhdGVfY2hhbmdlIGhhcHBlbnMgZmlyc3QgYW5kIHRoZW4KKwkJICogc3Vic3RhdGUgY2hhbmdlLgorCQkgKiBNb3ZpbmcgZXZlbiBzYXZlIHByb2ZpbGUgYWJvdmUgc28gdGhhdCBiZWxvdworCQkgKiBtZW50aW9uZWQgY29uZGl0b24gaXMgYWxzbyBtZXQuCisJCSAqIEpFWjEwMDIyNTogTW92ZWQgdG8gYWZ0ZXIgc2F2aW5nIHRoZSBwcm9maWxlLgorCQkgKiBGaXggbmVlZGVkIGluIG1haW4vbGF0ZXN0CisJCSAqLworCQljc3Jfcm9hbV9zdGF0ZV9jaGFuZ2UobWFjX2N0eCwKKwkJCWVDU1JfUk9BTUlOR19TVEFURV9KT0lORUQsIHNlc3Npb25faWQpOworCisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgU2V0IENvbnRleHQgaXMgaXNzdWVkIGJlZm9yZSBsaW5rCisJCSAqIGluZGljYXRpb24gdG8gTkRJUy4gIEFmdGVyIGxpbmsgaW5kaWNhdGlvbiBpcworCQkgKiBtYWRlIHRvIE5ESVMsIGZyYW1lcyBjb3VsZCBzdGFydCBmbG93aW5nLgorCQkgKiBJZiB3ZSBoYXZlIG5vdCBzZXQgY29udGV4dCB3aXRoIExJTSwgdGhlIGZyYW1lcworCQkgKiB3aWxsIGJlIGRyb3BwZWQgZm9yIHRoZSBzZWN1cml0eSBjb250ZXh0IG1heSBub3QKKwkJICogYmUgc2V0IHByb3Blcmx5LgorCQkgKgorCQkgKiB0aGlzIHdhcyBjYXVzaW5nIGlzc3VlcyBpbiB0aGUgMmNfd2xhbl93ZXAgV0hRTCB0ZXN0CisJCSAqIHdoZW4gdGhlIFNldENvbnRleHQgd2FzIGlzc3VlZCBhZnRlciB0aGUgbGluaworCQkgKiBpbmRpY2F0aW9uLiAoTGluayBJbmRpY2F0aW9uIGhhcHBlbnMgaW4gdGhlCisJCSAqIHByb2ZGU01TZXRDb25uZWN0ZWRJbmZyYSBjYWxsKS4KKwkJICoKKwkJICogdGhpcyByZW9yZGVyaW5nIHdhcyBkb25lIG9uIHRpdGFuX3Byb2RfdXNiIGJyYW5jaAorCQkgKiBhbmQgaXMgYmVpbmcgcmVwbGljYXRlZCBoZXJlLgorCQkgKi8KKworCQlpZiAoQ1NSX0lTX0VOQ19UWVBFX1NUQVRJQworCQkJKHByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlKSAmJgorCQkJIXByb2ZpbGUtPmJXUFNBc3NvY2lhdGlvbikgeworCQkJLyoKKwkJCSAqIElzc3VlIHRoZSBzZXQgQ29udGV4dCByZXF1ZXN0IHRvIExJTSB0byBlc3RhYmxpc2gKKwkJCSAqIHRoZSBVbmljYXN0IFNUQSBjb250ZXh0CisJCQkgKi8KKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKAorCQkJCWNzcl9yb2FtX2lzc3VlX3NldF9jb250ZXh0X3JlcShtYWNfY3R4LAorCQkJCQlzZXNzaW9uX2lkLAorCQkJCQlwcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSwKKwkJCQkJYnNzX2Rlc2MsICYoYnNzX2Rlc2MtPmJzc0lkKSwKKwkJCQkJZmFsc2UsIHRydWUsCisJCQkJCWVTSVJfVFhfUlgsIDAsIDAsIE5VTEwsIDApKSkgeworCQkJCS8qIE5PIGtleXMuIHRoZXNlIGtleSBwYXJhbWV0ZXJzIGRvbid0IG1hdHRlciAqLworCQkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJRkwoIlNldCBjb250ZXh0IGZvciB1bmljYXN0IGZhaWwiKSk7CisJCQkJY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKG1hY19jdHgsCisJCQkJCWVDU1JfUk9BTV9TVUJTVEFURV9OT05FLCBzZXNzaW9uX2lkKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBJc3N1ZSB0aGUgc2V0IENvbnRleHQgcmVxdWVzdCB0byBMSU0KKwkJCSAqIHRvIGVzdGFibGlzaCB0aGUgQnJvYWRjYXN0IFNUQSBjb250ZXh0CisJCQkgKiBOTyBrZXlzLiB0aGVzZSBrZXkgcGFyYW1ldGVycyBkb24ndCBtYXR0ZXIKKwkJCSAqLworCQkJY3NyX3JvYW1faXNzdWVfc2V0X2NvbnRleHRfcmVxKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJcHJvZmlsZS0+bmVnb3RpYXRlZE1DRW5jcnlwdGlvblR5cGUsCisJCQkJYnNzX2Rlc2MsICZiY2FzdF9tYWMsIGZhbHNlLCBmYWxzZSwKKwkJCQllU0lSX1RYX1JYLCAwLCAwLCBOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJCQlpZiAocm9hbV9vZmZsb2FkX3BhcmFtcy0+YlJvYW1TeW5jaEluUHJvZ3Jlc3MKKwkJCQkmJiAocm9hbV9vZmZsb2FkX3BhcmFtcy0+YXV0aFN0YXR1cworCQkJCT09IENTUl9ST0FNX0FVVEhfU1RBVFVTX0FVVEhFTlRJQ0FURUQpKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQlDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJCUZMKCJMRlIzOkRvbid0IHN0YXJ0IHdhaXRmb3JrZXkgdGltZXIiKSk7CisJCQkJY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKG1hY19jdHgsCisJCQkJCWVDU1JfUk9BTV9TVUJTVEFURV9OT05FLCBzZXNzaW9uX2lkKTsKKwkJCX0gZWxzZSB7CisjZW5kaWYKKwkJCQkvKiBOZWVkIHRvIHdhaXQgZm9yIHN1cHBsaWNhbnQgYXV0aHRpY2F0aW9uICovCisJCQkJcm9hbV9pbmZvLmZBdXRoUmVxdWlyZWQgPSB0cnVlOworCQkJCS8qCisJCQkJICogU2V0IHRoZSBzdWJzdGF0ZSB0byBXYWl0Rm9yS2V5IGluIGNhc2UKKwkJCQkgKiBhdXRoZW50aWF0aW9uIGlzIG5lZWRlZAorCQkJCSAqLworCQkJCWNzcl9yb2FtX3N1YnN0YXRlX2NoYW5nZShtYWNfY3R4LAorCQkJCQllQ1NSX1JPQU1fU1VCU1RBVEVfV0FJVF9GT1JfS0VZLAorCQkJCQlzZXNzaW9uX2lkKTsKKworCQkJCS8qCisJCQkJICogU2V0IHJlbWFpbl9pbl9wb3dlcl9hY3RpdmVfdGlsbF9kaGNwIHRvIG1ha2UKKwkJCQkgKiBzdXJlIHdlIHdhaXQgZm9yIHVudGlsIGtleXMgYXJlIHNldCBiZWZvcmUKKwkJCQkgKiBnb2luZyBpbnRvIEJNUFMuCisJCQkJICovCisJCQkJcHNfZ2xvYmFsX2luZm8tPnJlbWFpbl9pbl9wb3dlcl9hY3RpdmVfdGlsbF9kaGNwCisJCQkJCT0gdHJ1ZTsKKworCQkJCWlmIChwcm9maWxlLT5iV1BTQXNzb2NpYXRpb24pCisJCQkJCWtleV90aW1lb3V0X2ludGVydmFsID0KKwkJCQkJCUNTUl9XQUlUX0ZPUl9XUFNfS0VZX1RJTUVPVVRfUEVSSU9EOworCQkJCWVsc2UKKwkJCQkJa2V5X3RpbWVvdXRfaW50ZXJ2YWwgPQorCQkJCQkJQ1NSX1dBSVRfRk9SX0tFWV9USU1FT1VUX1BFUklPRDsKKworCQkJCS8qIFNhdmUgc2Vzc2lvbl9pZCBpbiBjYXNlIG9mIHRpbWVvdXQgKi8KKwkJCQltYWNfY3R4LT5yb2FtLldhaXRGb3JLZXlUaW1lckluZm8uc2Vzc2lvbklkID0KKwkJCQkJKHVpbnQ4X3QpIHNlc3Npb25faWQ7CisJCQkJLyoKKwkJCQkgKiBUaGlzIHRpbWUgc2hvdWxkIGJlIGxvbmcgZW5vdWdoIGZvciB0aGUgcmVzdAorCQkJCSAqIG9mIHRoZSBwcm9jZXNzIHBsdXMgc2V0dGluZyBrZXkKKwkJCQkgKi8KKwkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJCQkoY3NyX3JvYW1fc3RhcnRfd2FpdF9mb3Jfa2V5X3RpbWVyKAorCQkJCQkJbWFjX2N0eCwga2V5X3RpbWVvdXRfaW50ZXJ2YWwpKQorCQkJCQkpIHsKKwkJCQkJLyogUmVzZXQgc3RhdGUgc28gbm90aGluZyBpcyBibG9ja2VkLiAqLworCQkJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMCisJCQkJCQkoIkZhaWxlZCBwcmVhdXRoIHRpbWVyIHN0YXJ0IikpOworCQkJCQljc3Jfcm9hbV9zdWJzdGF0ZV9jaGFuZ2UobWFjX2N0eCwKKwkJCQkJCWVDU1JfUk9BTV9TVUJTVEFURV9OT05FLAorCQkJCQkJc2Vzc2lvbl9pZCk7CisJCQkJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJYXNzb2NfaW5mby5wQnNzRGVzYyA9IGJzc19kZXNjOyAgICAgICAvKiBjb3VsZCBiZSBOVUxMICovCisJCWFzc29jX2luZm8ucFByb2ZpbGUgPSBwcm9maWxlOworCQlpZiAoY29udGV4dCkgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJCWlmIChyb2FtX29mZmxvYWRfcGFyYW1zLT5iUm9hbVN5bmNoSW5Qcm9ncmVzcykKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkJRkwoIkxGUjM6Q2xlYXIgQ29ubmVjdGVkIGluZm8iKSk7CisjZW5kaWYKKwkJCWNzcl9yb2FtX2ZyZWVfY29ubmVjdGVkX2luZm8obWFjX2N0eCwKKwkJCQkmc2Vzc2lvbi0+Y29ubmVjdGVkSW5mbyk7CisJCQlsZW4gPSBqb2luX3JzcC0+YXNzb2NSZXFMZW5ndGggKworCQkJCWpvaW5fcnNwLT5hc3NvY1JzcExlbmd0aCArCisJCQkJam9pbl9yc3AtPmJlYWNvbkxlbmd0aDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQkJbGVuICs9IGpvaW5fcnNwLT5wYXJzZWRSaWNSc3BMZW47CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCQlsZW4gKz0gam9pbl9yc3AtPnRzcGVjSWVMZW47CisjZW5kaWYKKwkJCWlmIChsZW4pIHsKKwkJCQlzZXNzaW9uLT5jb25uZWN0ZWRJbmZvLnBiRnJhbWVzID0KKwkJCQkJY2RmX21lbV9tYWxsb2MobGVuKTsKKwkJCQlpZiAoc2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5wYkZyYW1lcyAhPQorCQkJCQkJTlVMTCkgeworCQkJCQljZGZfbWVtX2NvcHkoCisJCQkJCQlzZXNzaW9uLT5jb25uZWN0ZWRJbmZvLnBiRnJhbWVzLAorCQkJCQkJam9pbl9yc3AtPmZyYW1lcywgbGVuKTsKKwkJCQkJc2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5uQXNzb2NSZXFMZW5ndGggPQorCQkJCQkJam9pbl9yc3AtPmFzc29jUmVxTGVuZ3RoOworCQkJCQlzZXNzaW9uLT5jb25uZWN0ZWRJbmZvLm5Bc3NvY1JzcExlbmd0aCA9CisJCQkJCQlqb2luX3JzcC0+YXNzb2NSc3BMZW5ndGg7CisJCQkJCXNlc3Npb24tPmNvbm5lY3RlZEluZm8ubkJlYWNvbkxlbmd0aCA9CisJCQkJCQlqb2luX3JzcC0+YmVhY29uTGVuZ3RoOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCQkJCXNlc3Npb24tPmNvbm5lY3RlZEluZm8ublJJQ1JzcExlbmd0aCA9CisJCQkJCQlqb2luX3JzcC0+cGFyc2VkUmljUnNwTGVuOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQkJCQlzZXNzaW9uLT5jb25uZWN0ZWRJbmZvLm5Uc3BlY0llTGVuZ3RoID0KKwkJCQkJCWpvaW5fcnNwLT50c3BlY0llTGVuOworI2VuZGlmCisJCQkJCXJvYW1faW5mby5uQXNzb2NSZXFMZW5ndGggPQorCQkJCQkJam9pbl9yc3AtPmFzc29jUmVxTGVuZ3RoOworCQkJCQlyb2FtX2luZm8ubkFzc29jUnNwTGVuZ3RoID0KKwkJCQkJCWpvaW5fcnNwLT5hc3NvY1JzcExlbmd0aDsKKwkJCQkJcm9hbV9pbmZvLm5CZWFjb25MZW5ndGggPQorCQkJCQkJam9pbl9yc3AtPmJlYWNvbkxlbmd0aDsKKwkJCQkJcm9hbV9pbmZvLnBiRnJhbWVzID0KKwkJCQkJCXNlc3Npb24tPmNvbm5lY3RlZEluZm8ucGJGcmFtZXM7CisJCQkJfQorCQkJfQorCQkJaWYgKGNtZC0+dS5yb2FtQ21kLmZSZWFzc29jKQorCQkJCXJvYW1faW5mby5mUmVhc3NvY1JlcSA9CisJCQkJCXJvYW1faW5mby5mUmVhc3NvY1JzcCA9IHRydWU7CisJCQljb25uX3Byb2ZpbGUtPnZodF9jaGFubmVsX3dpZHRoID0KKwkJCQlqb2luX3JzcC0+dmh0X2NoYW5uZWxfd2lkdGg7CisJCQlzZXNzaW9uLT5jb25uZWN0ZWRJbmZvLnN0YUlkID0KKwkJCQkodWludDhfdCkgam9pbl9yc3AtPnN0YUlkOworCQkJcm9hbV9pbmZvLnN0YUlkID0gKHVpbnQ4X3QpIGpvaW5fcnNwLT5zdGFJZDsKKwkJCXJvYW1faW5mby51Y2FzdFNpZyA9ICh1aW50OF90KSBqb2luX3JzcC0+dWNhc3RTaWc7CisJCQlyb2FtX2luZm8uYmNhc3RTaWcgPSAodWludDhfdCkgam9pbl9yc3AtPmJjYXN0U2lnOworCQkJcm9hbV9pbmZvLnRpbWluZ01lYXNDYXAgPSBqb2luX3JzcC0+dGltaW5nTWVhc0NhcDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCQkJcm9hbV9pbmZvLnRkbHNfcHJvaGliaXRlZCA9IGpvaW5fcnNwLT50ZGxzX3Byb2hpYml0ZWQ7CisJCQlyb2FtX2luZm8udGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZCA9CisJCQkJam9pbl9yc3AtPnRkbHNfY2hhbl9zd2l0X3Byb2hpYml0ZWQ7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCQkJRkwoInRkbHM6cHJvaGliaXQ6ICVkLCBjaGFuX3N3aXRfcHJvaGliaXQ6ICVkIiksCisJCQkJcm9hbV9pbmZvLnRkbHNfcHJvaGliaXRlZCwKKwkJCQlyb2FtX2luZm8udGRsc19jaGFuX3N3aXRfcHJvaGliaXRlZCk7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwkJCXNyY19wcm9maWxlID0gJmpvaW5fcnNwLT5IVFByb2ZpbGU7CisJCQlkc3RfcHJvZmlsZSA9ICZjb25uX3Byb2ZpbGUtPkhUUHJvZmlsZTsKKwkJCWlmIChtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmNjX3N3aXRjaF9tb2RlCisJCQkJIT0gQ0RGX01DQ19UT19TQ0NfU1dJVENIX0RJU0FCTEUpCisJCQkJY3NyX3JvYW1fY29weV9odF9wcm9maWxlKGRzdF9wcm9maWxlLAorCQkJCQkJc3JjX3Byb2ZpbGUpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlpZiAoY21kLT51LnJvYW1DbWQuZlJlYXNzb2MpIHsKKwkJCQlyb2FtX2luZm8uZlJlYXNzb2NSZXEgPQorCQkJCQlyb2FtX2luZm8uZlJlYXNzb2NSc3AgPSB0cnVlOworCQkJCXJvYW1faW5mby5uQXNzb2NSZXFMZW5ndGggPQorCQkJCQlzZXNzaW9uLT5jb25uZWN0ZWRJbmZvLm5Bc3NvY1JlcUxlbmd0aDsKKwkJCQlyb2FtX2luZm8ubkFzc29jUnNwTGVuZ3RoID0KKwkJCQkJc2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5uQXNzb2NSc3BMZW5ndGg7CisJCQkJcm9hbV9pbmZvLm5CZWFjb25MZW5ndGggPQorCQkJCQlzZXNzaW9uLT5jb25uZWN0ZWRJbmZvLm5CZWFjb25MZW5ndGg7CisJCQkJcm9hbV9pbmZvLnBiRnJhbWVzID0KKwkJCQkJc2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5wYkZyYW1lczsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgc3RhSWQgZnJvbSB0aGUgcHJldmlvdXMgY29ubmVjdGVkIHByb2ZpbGUgaW5mbworCQkgKiBhcyB0aGUgcmVhc3NvY2lhdGlvbiBpcyB0cmlnZ3JlZCBhdCBTTUUvSERECisJCSAqLworCisJCWlmICgoZUNzckhkZElzc3VlZFJlYXNzb2NUb1NhbWVBUCA9PQorCQkJCWNtZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pIHx8CisJCQkoZUNzclNtZUlzc3VlZFJlYXNzb2NUb1NhbWVBUCA9PQorCQkJCWNtZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pKQorCQkJcm9hbV9pbmZvLnN0YUlkID0gc2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5zdGFJZDsKKworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKwkJLyoKKwkJICogSW5kaWNhdGUgU01FLVFPUyB3aXRoIHJlYXNzb2Mgc3VjY2VzcyBldmVudCwKKwkJICogb25seSBhZnRlciBjb3B5aW5nIHRoZSBmcmFtZXMKKwkJICovCisJCXNtZV9xb3NfY3NyX2V2ZW50X2luZChtYWNfY3R4LCAodWludDhfdCkgc2Vzc2lvbl9pZCwgaW5kX3FvcywKKwkJCQkmYXNzb2NfaW5mbyk7CisjZW5kaWYKKwkJcm9hbV9pbmZvLnBCc3NEZXNjID0gYnNzX2Rlc2M7CisJCXJvYW1faW5mby5zdGF0dXNDb2RlID0KKwkJCXNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5zdGF0dXNDb2RlOworCQlyb2FtX2luZm8ucmVhc29uQ29kZSA9CisJCQlzZXNzaW9uLT5qb2luRmFpbFN0YXR1c0NvZGUucmVhc29uQ29kZTsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisJCWFjbV9tYXNrID0gc21lX3Fvc19nZXRfYWNtX21hc2sobWFjX2N0eCwgYnNzX2Rlc2MsIE5VTEwpOworI2VuZGlmCisJCWNvbm5fcHJvZmlsZS0+YWNtX21hc2sgPSBhY21fbWFzazsKKwkJLyoKKwkJICogc3RhcnQgVUFQU0QgaWYgdWFwc2RfbWFzayBpcyBub3QgMCBiZWNhdXNlIEhERCB3aWxsCisJCSAqIGNvbmZpZ3VyZSBmb3IgdHJpZ2dlciBmcmFtZSBJdCBtYXkgYmUgYmV0dGVyIHRvIGxldCBRb1MgZG8KKwkJICogdGhpcz8/Pz8KKwkJICovCisJCWlmIChjb25uX3Byb2ZpbGUtPm1vZGlmeVByb2ZpbGVGaWVsZHMudWFwc2RfbWFzaykgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCSIgdWFwc2RfbWFzayAoMHglWCkgc2V0LCByZXF1ZXN0IFVBUFNEIG5vdyIsCisJCQkJY29ubl9wcm9maWxlLT5tb2RpZnlQcm9maWxlRmllbGRzLnVhcHNkX21hc2spOworCQkJc21lX3BzX3N0YXJ0X3VhcHNkKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJTlVMTCwgTlVMTCk7CisJCX0KKwkJY29ubl9wcm9maWxlLT5kb3QxMU1vZGUgPSBzZXNzaW9uLT5ic3NQYXJhbXMudUNmZ0RvdDExTW9kZTsKKwkJcm9hbV9pbmZvLnUucENvbm5lY3RlZFByb2ZpbGUgPSBjb25uX3Byb2ZpbGU7CisKKwkJaWYgKHNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250ID4gMCkgeworCQkJc2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQtLTsKKwkJCWlmICghSVNfRkVBVFVSRV9TVVBQT1JURURfQllfRlcKKwkJCQkoU0xNX1NFU1NJT05JWkFUSU9OKSAmJgorCQkJCShjc3JfaXNfY29uY3VycmVudF9zZXNzaW9uX3J1bm5pbmcobWFjX2N0eCkpKSB7CisJCQkJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5kb0JNUFNXb3JrYXJvdW5kID0gMTsKKwkJCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJCQlpZiAocm9hbV9vZmZsb2FkX3BhcmFtcy0+YlJvYW1TeW5jaEluUHJvZ3Jlc3MpIHsKKwkJCQlyb2FtX2luZm8ucm9hbVN5bmNoSW5Qcm9ncmVzcyA9IDE7CisJCQkJcm9hbV9pbmZvLnN5bmNoQXV0aFN0YXR1cyA9CisJCQkJCXJvYW1fb2ZmbG9hZF9wYXJhbXMtPmF1dGhTdGF0dXM7CisJCQkJY2RmX21lbV9jb3B5KHJvYW1faW5mby5rY2ssCisJCQkJCXJvYW1fb2ZmbG9hZF9wYXJhbXMtPmtjaywKKwkJCQkJU0lSX0tDS19LRVlfTEVOKTsKKwkJCQljZGZfbWVtX2NvcHkocm9hbV9pbmZvLmtlaywKKwkJCQkJcm9hbV9vZmZsb2FkX3BhcmFtcy0+a2VrLAorCQkJCQlTSVJfS0VLX0tFWV9MRU4pOworCQkJCWNkZl9tZW1fY29weShyb2FtX2luZm8ucmVwbGF5X2N0ciwKKwkJCQkJcm9hbV9vZmZsb2FkX3BhcmFtcy0+cmVwbGF5X2N0ciwKKwkJCQkJU0lSX1JFUExBWV9DVFJfTEVOKTsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkJRkwKKwkJCQkJKCJMRlIzOiBDb3B5IEtDSywgS0VLIGFuZCBSZXBsYXkgQ3RyIikpOworCQkJfQorI2VuZGlmCisJCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsICZyb2FtX2luZm8sCisJCQkJY21kLT51LnJvYW1DbWQucm9hbUlkLAorCQkJCWVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OLAorCQkJCWVDU1JfUk9BTV9SRVNVTFRfQVNTT0NJQVRFRCk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQkJaWYgKHJvYW1fb2ZmbG9hZF9wYXJhbXMtPmJSb2FtU3luY2hJblByb2dyZXNzCisJCQkJJiYgKHJvYW1fb2ZmbG9hZF9wYXJhbXMtPmF1dGhTdGF0dXMKKwkJCQkgICAgPT0gQ1NSX1JPQU1fQVVUSF9TVEFUVVNfQ09OTkVDVEVEKSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCQlGTCgiTEZSMzpTZW5kIFN5bmNoIENuZiBmb3IgQXV0aCBzdGF0dXMgY29ubmVjdGVkIikpOworCQkJCWNzcl9yb2FtX29mZmxvYWRfc2VuZF9zeW5jaF9jbmYobWFjX2N0eCwKKwkJCQkJc2Vzc2lvbl9pZCk7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCWNzcl9yb2FtX2NvbXBsZXRpb24obWFjX2N0eCwgc2Vzc2lvbl9pZCwgTlVMTCwgY21kLAorCQkJCWVDU1JfUk9BTV9SRVNVTFRfTk9ORSwgdHJ1ZSk7CisJCWNzcl9yZXNldF9wbWtpZF9jYW5kaWRhdGVfbGlzdChtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCQljc3JfcmVzZXRfYmtpZF9jYW5kaWRhdGVfbGlzdChtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HVywKKwkJCSJSb2FtIGNvbW1hbmQgZG9lc24ndCBoYXZlIGEgQlNTIGRlc2MiKTsKKwl9CisJLyogTm90IHRvIHNpZ25hbCBsaW5rIHVwIGJlY2F1c2Uga2V5cyBhcmUgeWV0IHRvIGJlIHNldC4KKwkgKiBUaGUgbGlua3VwIGZ1bmN0aW9uIHdpbGwgb3ZlcndyaXRlIHRoZSBzdWItc3RhdGUgdGhhdAorCSAqIHdlIG5lZWQgdG8ga2VlcCBhdCB0aGlzIHBvaW50LgorCSAqLworCWlmICghQ1NSX0lTX1dBSVRfRk9SX0tFWShtYWNfY3R4LCBzZXNzaW9uX2lkKSkgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJaWYgKHJvYW1fb2ZmbG9hZF9wYXJhbXMtPmJSb2FtU3luY2hJblByb2dyZXNzKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCUZMCisJCQkJKCJOTyBDU1JfSVNfV0FJVF9GT1JfS0VZIC0+IGNzcl9yb2FtX2xpbmtfdXAiKSk7CisJCX0KKyNlbmRpZgorCQljc3Jfcm9hbV9saW5rX3VwKG1hY19jdHgsIGNvbm5fcHJvZmlsZS0+YnNzaWQpOworCX0KK30KKworLyoqCisgKiBjc3Jfcm9hbV9wcm9jZXNzX3Jlc3VsdHMoKSAtIFByb2Nlc3MgdGhlIFJvYW0gUmVzdWx0cworICogQG1hY19jdHg6ICAgICAgR2xvYmFsIE1BQyBDb250ZXh0CisgKiBAY21kOiAgICAgICAgICBDb21tYW5kIHRoYXQgaGFzIGJlZW4gcHJvY2Vzc2VkCisgKiBAcmVzOiAgICAgICAgICBSZXN1bHRzIGF2YWlsYWJsZSBhZnRlciBwcm9jZXNzaW5nIHRoZSBjb21tYW5kCisgKiBAY29udGV4dDogICAgICBDb250ZXh0CisgKgorICogUHJvY2VzcyB0aGUgYXZhaWxhYmxlIHJlc3VsdHMgYW5kIG1ha2UgYW4gYXBwcm9wcmlhdGUgZGVjaXNpb24KKyAqCisgKiBSZXR1cm46IHRydWUgaWYgdGhlIGNvbW1hbmQgY2FuIGJlIHJlbGVhc2VkLCBlbHNlIG5vdC4KKyAqLworc3RhdGljIGJvb2wgY3NyX3JvYW1fcHJvY2Vzc19yZXN1bHRzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRTbWVDbWQgKmNtZCwKKwkJCQkgICAgIGVDc3JSb2FtQ29tcGxldGVSZXN1bHQgcmVzLCB2b2lkICpjb250ZXh0KQoreworCWJvb2wgcmVsZWFzZV9jbWQgPSB0cnVlOworCXRTaXJCc3NEZXNjcmlwdGlvbiAqYnNzX2Rlc2MgPSBOVUxMOworCXRDc3JSb2FtSW5mbyByb2FtX2luZm87CisJdWludDMyX3Qgc2Vzc2lvbl9pZCA9IGNtZC0+c2Vzc2lvbklkOworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwl0Q3NyUm9hbVByb2ZpbGUgKnByb2ZpbGUgPSAmY21kLT51LnJvYW1DbWQucm9hbVByb2ZpbGU7CisJZVJvYW1DbWRTdGF0dXMgcm9hbV9zdGF0dXM7CisJZUNzclJvYW1SZXN1bHQgcm9hbV9yZXN1bHQ7CisJaG9zdF9sb2dfaWJzc19wa3RfdHlwZSAqaWJzc19sb2c7CisKKwlpZiAoIXNlc3Npb24pIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25faWQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXNtc19sb2cobWFjX2N0eCwgTE9HMSwgRkwoIlByb2Nlc3NpbmcgUk9BTSByZXN1bHRzLi4uIikpOworCXN3aXRjaCAocmVzKSB7CisJY2FzZSBlQ3NySm9pblN1Y2Nlc3M6CisJY2FzZSBlQ3NyUmVhc3NvY1N1Y2Nlc3M6CisJCWNzcl9yb2FtX3Byb2Nlc3Nfam9pbl9yZXMobWFjX2N0eCwgcmVzLCBjbWQsIGNvbnRleHQpOworCQlicmVhazsKKwljYXNlIGVDc3JTdGFydEJzc1N1Y2Nlc3M6CisJCWNzcl9yb2FtX3Byb2Nlc3Nfc3RhcnRfYnNzX3N1Y2Nlc3MobWFjX2N0eCwgY21kLCBjb250ZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyU3RhcnRCc3NGYWlsdXJlOgorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisJCVdMQU5fSE9TVF9ESUFHX0xPR19BTExPQyhpYnNzX2xvZywKKwkJCWhvc3RfbG9nX2lic3NfcGt0X3R5cGUsIExPR19XTEFOX0lCU1NfQyk7CisJCWlmIChpYnNzX2xvZykgeworCQkJaWJzc19sb2ctPnN0YXR1cyA9IFdMQU5fSUJTU19TVEFUVVNfRkFJTFVSRTsKKwkJCVdMQU5fSE9TVF9ESUFHX0xPR19SRVBPUlQoaWJzc19sb2cpOworCQl9CisjZW5kaWYKKwkJcm9hbV9zdGF0dXMgPSBlQ1NSX1JPQU1fSUJTU19JTkQ7CisJCXJvYW1fcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1NUQVJURUQ7CisJCWlmIChDU1JfSVNfV0RTKHByb2ZpbGUpKSB7CisJCQlyb2FtX3N0YXR1cyA9IGVDU1JfUk9BTV9XRFNfSU5EOworCQkJcm9hbV9yZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX1dEU19TVEFSVEVEOworCQl9CisJCWlmIChDU1JfSVNfSU5GUkFfQVAocHJvZmlsZSkpIHsKKwkJCXJvYW1fc3RhdHVzID0gZUNTUl9ST0FNX0lORlJBX0lORDsKKwkJCXJvYW1fcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9TVEFSVF9GQUlMRUQ7CisJCX0KKwkJaWYgKGNvbnRleHQpIHsKKwkJCWJzc19kZXNjID0gKHRTaXJCc3NEZXNjcmlwdGlvbiAqKSBjb250ZXh0OworCQl9IGVsc2UgeworCQkJYnNzX2Rlc2MgPSBOVUxMOworCQl9CisJCWNkZl9tZW1fc2V0KCZyb2FtX2luZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pLCAwKTsKKwkJcm9hbV9pbmZvLnBCc3NEZXNjID0gYnNzX2Rlc2M7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbl9pZCwgJnJvYW1faW5mbywKKwkJCQljbWQtPnUucm9hbUNtZC5yb2FtSWQsIHJvYW1fc3RhdHVzLAorCQkJCXJvYW1fcmVzdWx0KTsKKwkJY3NyX3NldF9kZWZhdWx0X2RvdDExX21vZGUobWFjX2N0eCk7CisJCWJyZWFrOworCWNhc2UgZUNzclNpbGVudGx5U3RvcFJvYW1pbmc6CisJCS8qCisJCSAqIFdlIGFyZSBoZXJlIGJlY2F1c2Ugd2UgdHJ5IHRvIHN0YXJ0IHRoZSBzYW1lIElCU1MuCisJCSAqIE5vIG1lc3NhZ2UgdG8gUEUuIHJldHVybiB0aGUgcm9hbWluZyBzdGF0ZSB0byBKb2luZWQuCisJCSAqLworCQlzbXNfbG9nKG1hY19jdHgsIExPR1csIEZMKCJyZWNlaXZlcyBzaWxlbnRseSBzdG9wIHJvYW0gaW5kIikpOworCQljc3Jfcm9hbV9zdGF0ZV9jaGFuZ2UobWFjX2N0eCwgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5FRCwKKwkJCXNlc3Npb25faWQpOworCQljc3Jfcm9hbV9zdWJzdGF0ZV9jaGFuZ2UobWFjX2N0eCwgZUNTUl9ST0FNX1NVQlNUQVRFX05PTkUsCisJCQlzZXNzaW9uX2lkKTsKKwkJY2RmX21lbV9zZXQoJnJvYW1faW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbyksIDApOworCQlyb2FtX2luZm8ucEJzc0Rlc2MgPSBzZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2M7CisJCWlmIChyb2FtX2luZm8ucEJzc0Rlc2MpCisJCQljZGZfbWVtX2NvcHkoJnJvYW1faW5mby5ic3NpZCwKKwkJCQkmcm9hbV9pbmZvLnBCc3NEZXNjLT5ic3NJZCwKKwkJCQlzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCQkvKgorCQkgKiBTaW5jZSB0aGVyZSBpcyBubyBjaGFuZ2UgaW4gdGhlIGN1cnJlbnQgc3RhdGUsIHNpbXBseSBwYXNzCisJCSAqIGJhY2sgbm8gcmVzdWx0IG90aGVyd2lzZSBIREQgbWF5IGJlIG1pc3Rha2VubHkgbWFyayB0bworCQkgKiBkaXNjb25uZWN0ZWQgc3RhdGUuCisJCSAqLworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsICZyb2FtX2luZm8sCisJCQkJY21kLT51LnJvYW1DbWQucm9hbUlkLAorCQkJCWVDU1JfUk9BTV9JQlNTX0lORCwgZUNTUl9ST0FNX1JFU1VMVF9OT05FKTsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyU2lsZW50bHlTdG9wUm9hbWluZ1NhdmVTdGF0ZToKKwkJLyogV2UgYXJlIGhlcmUgYmVjYXVzZSB3ZSB0cnkgdG8gY29ubmVjdCB0byB0aGUgc2FtZSBBUCAqLworCQkvKiBObyBtZXNzYWdlIHRvIFBFICovCisJCXNtc19sb2cobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJyZWNlaXZlcyBzaWxlbnRseSBzdG9wIHJvYW1pbmcgaW5kaWNhdGlvbiIpKTsKKwkJY2RmX21lbV9zZXQoJnJvYW1faW5mbywgc2l6ZW9mKHJvYW1faW5mbyksIDApOworCisJCS8qIHRvIGF2aW9kIHJlc2V0dGluZyB0aGUgc3Vic3RhdGUgdG8gTk9ORSAqLworCQltYWNfY3R4LT5yb2FtLmN1clN0YXRlW3Nlc3Npb25faWRdID0gZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5FRDsKKwkJLyoKKwkJICogTm8gbmVlZCB0byBjaGFuZ2Ugc3Vic3RhdGUgdG8gd2FpX2Zvcl9rZXkgYmVjYXVzZSB0aGVyZQorCQkgKiBpcyBubyBzdGF0ZSBjaGFuZ2UKKwkJICovCisJCXJvYW1faW5mby5wQnNzRGVzYyA9IHNlc3Npb24tPnBDb25uZWN0QnNzRGVzYzsKKwkJaWYgKHJvYW1faW5mby5wQnNzRGVzYykKKwkJCWNkZl9tZW1fY29weSgmcm9hbV9pbmZvLmJzc2lkLAorCQkJCSZyb2FtX2luZm8ucEJzc0Rlc2MtPmJzc0lkLAorCQkJCXNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJCXJvYW1faW5mby5zdGF0dXNDb2RlID0gc2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnN0YXR1c0NvZGU7CisJCXJvYW1faW5mby5yZWFzb25Db2RlID0gc2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisJCXJvYW1faW5mby5uQmVhY29uTGVuZ3RoID0gc2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5uQmVhY29uTGVuZ3RoOworCQlyb2FtX2luZm8ubkFzc29jUmVxTGVuZ3RoID0KKwkJCXNlc3Npb24tPmNvbm5lY3RlZEluZm8ubkFzc29jUmVxTGVuZ3RoOworCQlyb2FtX2luZm8ubkFzc29jUnNwTGVuZ3RoID0KKwkJCXNlc3Npb24tPmNvbm5lY3RlZEluZm8ubkFzc29jUnNwTGVuZ3RoOworCQlyb2FtX2luZm8ucGJGcmFtZXMgPSBzZXNzaW9uLT5jb25uZWN0ZWRJbmZvLnBiRnJhbWVzOworCQlyb2FtX2luZm8uc3RhSWQgPSBzZXNzaW9uLT5jb25uZWN0ZWRJbmZvLnN0YUlkOworCQlyb2FtX2luZm8udS5wQ29ubmVjdGVkUHJvZmlsZSA9ICZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCQlpZiAoMCA9PSByb2FtX2luZm8uc3RhSWQpIHsKKwkJCUNERl9BU1NFUlQoMCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJc2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQtLTsKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uX2lkLCAmcm9hbV9pbmZvLAorCQkJCWNtZC0+dS5yb2FtQ21kLnJvYW1JZCwKKwkJCQllQ1NSX1JPQU1fQVNTT0NJQVRJT05fQ09NUExFVElPTiwKKwkJCQllQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQpOworCQljc3Jfcm9hbV9jb21wbGV0aW9uKG1hY19jdHgsIHNlc3Npb25faWQsIE5VTEwsIGNtZCwKKwkJCQllQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQsIHRydWUpOworCQlicmVhazsKKwljYXNlIGVDc3JSZWFzc29jRmFpbHVyZToKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisJCXNtZV9xb3NfY3NyX2V2ZW50X2luZChtYWNfY3R4LCAodWludDhfdCkgc2Vzc2lvbl9pZCwKKwkJCQlTTUVfUU9TX0NTUl9SRUFTU09DX0ZBSUxVUkUsIE5VTEwpOworI2VuZGlmCisJY2FzZSBlQ3NySm9pbldkc0ZhaWx1cmU6CisJCXNtc19sb2cobWFjX2N0eCwgTE9HVywgRkwoImZhaWxlZCB0byBqb2luIFdEUyIpKTsKKwkJY3NyX2ZyZWVfY29ubmVjdF9ic3NfZGVzYyhtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwkJY3NyX3JvYW1fZnJlZV9jb25uZWN0X3Byb2ZpbGUobWFjX2N0eCwKKwkJCSZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKTsKKwkJY3NyX3JvYW1fZnJlZV9jb25uZWN0ZWRfaW5mbyhtYWNfY3R4LCAmc2Vzc2lvbi0+Y29ubmVjdGVkSW5mbyk7CisJCWNkZl9tZW1fc2V0KCZyb2FtX2luZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pLCAwKTsKKwkJcm9hbV9pbmZvLnBCc3NEZXNjID0gY21kLT51LnJvYW1DbWQucExhc3RSb2FtQnNzOworCQlyb2FtX2luZm8uc3RhdHVzQ29kZSA9IHNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5zdGF0dXNDb2RlOworCQlyb2FtX2luZm8ucmVhc29uQ29kZSA9IHNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5yZWFzb25Db2RlOworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsICZyb2FtX2luZm8sCisJCQljbWQtPnUucm9hbUNtZC5yb2FtSWQsIGVDU1JfUk9BTV9XRFNfSU5ELAorCQkJZUNTUl9ST0FNX1JFU1VMVF9XRFNfTk9UX0FTU09DSUFURUQpOworCQkvKiBOZWVkIHRvIGlzc3VlIHN0b3BfYnNzICovCisJCWJyZWFrOworCWNhc2UgZUNzckpvaW5GYWlsdXJlOgorCWNhc2UgZUNzck5vdGhpbmdUb0pvaW46CisJY2FzZSBlQ3NySm9pbkZhaWx1cmVEdWVUb0NvbmN1cnJlbmN5OgorCWRlZmF1bHQ6CisJCWNzcl9yb2FtX3Byb2Nlc3NfcmVzdWx0c19kZWZhdWx0KG1hY19jdHgsIGNtZCwgY29udGV4dCwgcmVzKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZWxlYXNlX2NtZDsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9jb3B5X3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgdENzclJvYW1Qcm9maWxlICpwRHN0UHJvZmlsZSwKKwkJCQkgdENzclJvYW1Qcm9maWxlICpwU3JjUHJvZmlsZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl1aW50MzJfdCBzaXplID0gMDsKKworCWNkZl9tZW1fc2V0KHBEc3RQcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSwgMCk7CisJaWYgKHBTcmNQcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHMpIHsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSAqIHBTcmNQcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHM7CisJCXBEc3RQcm9maWxlLT5CU1NJRHMuYnNzaWQgPSBjZGZfbWVtX21hbGxvYyhzaXplKTsKKwkJaWYgKE5VTEwgPT0gcERzdFByb2ZpbGUtPkJTU0lEcy5ic3NpZCkgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQkJZ290byBlbmQ7CisJCX0KKwkJcERzdFByb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEcyA9CisJCQlwU3JjUHJvZmlsZS0+QlNTSURzLm51bU9mQlNTSURzOworCQljZGZfbWVtX2NvcHkocERzdFByb2ZpbGUtPkJTU0lEcy5ic3NpZCwKKwkJCXBTcmNQcm9maWxlLT5CU1NJRHMuYnNzaWQsIHNpemUpOworCX0KKwlpZiAocFNyY1Byb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMpIHsKKwkJc2l6ZSA9IHNpemVvZih0Q3NyU1NJREluZm8pICogcFNyY1Byb2ZpbGUtPlNTSURzLm51bU9mU1NJRHM7CisJCXBEc3RQcm9maWxlLT5TU0lEcy5TU0lETGlzdCA9IGNkZl9tZW1fbWFsbG9jKHNpemUpOworCQlpZiAoTlVMTCA9PSBwRHN0UHJvZmlsZS0+U1NJRHMuU1NJRExpc3QpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWdvdG8gZW5kOworCQl9CisJCXBEc3RQcm9maWxlLT5TU0lEcy5udW1PZlNTSURzID0KKwkJCXBTcmNQcm9maWxlLT5TU0lEcy5udW1PZlNTSURzOworCQljZGZfbWVtX2NvcHkocERzdFByb2ZpbGUtPlNTSURzLlNTSURMaXN0LAorCQkJcFNyY1Byb2ZpbGUtPlNTSURzLlNTSURMaXN0LCBzaXplKTsKKwl9CisJaWYgKHBTcmNQcm9maWxlLT5uV1BBUmVxSUVMZW5ndGgpIHsKKwkJcERzdFByb2ZpbGUtPnBXUEFSZXFJRSA9CisJCQljZGZfbWVtX21hbGxvYyhwU3JjUHJvZmlsZS0+bldQQVJlcUlFTGVuZ3RoKTsKKwkJaWYgKE5VTEwgPT0gcERzdFByb2ZpbGUtPnBXUEFSZXFJRSkgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQkJZ290byBlbmQ7CisJCX0KKwkJcERzdFByb2ZpbGUtPm5XUEFSZXFJRUxlbmd0aCA9CisJCQlwU3JjUHJvZmlsZS0+bldQQVJlcUlFTGVuZ3RoOworCQljZGZfbWVtX2NvcHkocERzdFByb2ZpbGUtPnBXUEFSZXFJRSwgcFNyY1Byb2ZpbGUtPnBXUEFSZXFJRSwKKwkJCXBTcmNQcm9maWxlLT5uV1BBUmVxSUVMZW5ndGgpOworCX0KKwlpZiAocFNyY1Byb2ZpbGUtPm5SU05SZXFJRUxlbmd0aCkgeworCQlwRHN0UHJvZmlsZS0+cFJTTlJlcUlFID0KKwkJCWNkZl9tZW1fbWFsbG9jKHBTcmNQcm9maWxlLT5uUlNOUmVxSUVMZW5ndGgpOworCQlpZiAoTlVMTCA9PSBwRHN0UHJvZmlsZS0+cFJTTlJlcUlFKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCQlnb3RvIGVuZDsKKwkJfQorCQlwRHN0UHJvZmlsZS0+blJTTlJlcUlFTGVuZ3RoID0KKwkJCXBTcmNQcm9maWxlLT5uUlNOUmVxSUVMZW5ndGg7CisJCWNkZl9tZW1fY29weShwRHN0UHJvZmlsZS0+cFJTTlJlcUlFLCBwU3JjUHJvZmlsZS0+cFJTTlJlcUlFLAorCQkJcFNyY1Byb2ZpbGUtPm5SU05SZXFJRUxlbmd0aCk7CisJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJaWYgKHBTcmNQcm9maWxlLT5uV0FQSVJlcUlFTGVuZ3RoKSB7CisJCXBEc3RQcm9maWxlLT5wV0FQSVJlcUlFID0KKwkJCWNkZl9tZW1fbWFsbG9jKHBTcmNQcm9maWxlLT5uV0FQSVJlcUlFTGVuZ3RoKTsKKwkJaWYgKE5VTEwgPT0gcERzdFByb2ZpbGUtPnBXQVBJUmVxSUUpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWdvdG8gZW5kOworCQl9CisJCXBEc3RQcm9maWxlLT5uV0FQSVJlcUlFTGVuZ3RoID0KKwkJCXBTcmNQcm9maWxlLT5uV0FQSVJlcUlFTGVuZ3RoOworCQljZGZfbWVtX2NvcHkocERzdFByb2ZpbGUtPnBXQVBJUmVxSUUsIHBTcmNQcm9maWxlLT5wV0FQSVJlcUlFLAorCQkJcFNyY1Byb2ZpbGUtPm5XQVBJUmVxSUVMZW5ndGgpOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCWlmIChwU3JjUHJvZmlsZS0+bkFkZElFU2Nhbkxlbmd0aCkgeworCQlwRHN0UHJvZmlsZS0+cEFkZElFU2NhbiA9CisJCQljZGZfbWVtX21hbGxvYyhwU3JjUHJvZmlsZS0+bkFkZElFU2Nhbkxlbmd0aCk7CisJCWlmIChOVUxMID09IHBEc3RQcm9maWxlLT5wQWRkSUVTY2FuKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCQlnb3RvIGVuZDsKKwkJfQorCQlwRHN0UHJvZmlsZS0+bkFkZElFU2Nhbkxlbmd0aCA9CisJCQlwU3JjUHJvZmlsZS0+bkFkZElFU2Nhbkxlbmd0aDsKKwkJY2RmX21lbV9jb3B5KHBEc3RQcm9maWxlLT5wQWRkSUVTY2FuLCBwU3JjUHJvZmlsZS0+cEFkZElFU2NhbiwKKwkJCXBTcmNQcm9maWxlLT5uQWRkSUVTY2FuTGVuZ3RoKTsKKwl9CisJaWYgKHBTcmNQcm9maWxlLT5uQWRkSUVBc3NvY0xlbmd0aCkgeworCQlwRHN0UHJvZmlsZS0+cEFkZElFQXNzb2MgPQorCQkJY2RmX21lbV9tYWxsb2MocFNyY1Byb2ZpbGUtPm5BZGRJRUFzc29jTGVuZ3RoKTsKKwkJaWYgKE5VTEwgPT0gcERzdFByb2ZpbGUtPnBBZGRJRUFzc29jKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCQlnb3RvIGVuZDsKKwkJfQorCQlwRHN0UHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGggPQorCQkJcFNyY1Byb2ZpbGUtPm5BZGRJRUFzc29jTGVuZ3RoOworCQljZGZfbWVtX2NvcHkocERzdFByb2ZpbGUtPnBBZGRJRUFzc29jLCBwU3JjUHJvZmlsZS0+cEFkZElFQXNzb2MsCisJCQlwU3JjUHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGgpOworCX0KKwlpZiAocFNyY1Byb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSB7CisJCXBEc3RQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9CisJCQljZGZfbWVtX21hbGxvYyhwU3JjUHJvZmlsZS0+Q2hhbm5lbEluZm8uCisJCQkJCW51bU9mQ2hhbm5lbHMpOworCQlpZiAoTlVMTCA9PSBwRHN0UHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWdvdG8gZW5kOworCQl9CisJCXBEc3RQcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0KKwkJCXBTcmNQcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOworCQljZGZfbWVtX2NvcHkocERzdFByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LAorCQkJcFNyY1Byb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LAorCQkJcFNyY1Byb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMpOworCX0KKwlwRHN0UHJvZmlsZS0+QXV0aFR5cGUgPSBwU3JjUHJvZmlsZS0+QXV0aFR5cGU7CisJcERzdFByb2ZpbGUtPkVuY3J5cHRpb25UeXBlID0gcFNyY1Byb2ZpbGUtPkVuY3J5cHRpb25UeXBlOworCXBEc3RQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlID0gcFNyY1Byb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGU7CisJcERzdFByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlID0KKwkJcFNyY1Byb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlOworCXBEc3RQcm9maWxlLT5uZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZSA9CisJCXBTcmNQcm9maWxlLT5uZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZTsKKwlwRHN0UHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlID0gcFNyY1Byb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJcERzdFByb2ZpbGUtPk1GUEVuYWJsZWQgPSBwU3JjUHJvZmlsZS0+TUZQRW5hYmxlZDsKKwlwRHN0UHJvZmlsZS0+TUZQUmVxdWlyZWQgPSBwU3JjUHJvZmlsZS0+TUZQUmVxdWlyZWQ7CisJcERzdFByb2ZpbGUtPk1GUENhcGFibGUgPSBwU3JjUHJvZmlsZS0+TUZQQ2FwYWJsZTsKKyNlbmRpZgorCXBEc3RQcm9maWxlLT5CU1NUeXBlID0gcFNyY1Byb2ZpbGUtPkJTU1R5cGU7CisJcERzdFByb2ZpbGUtPnBoeU1vZGUgPSBwU3JjUHJvZmlsZS0+cGh5TW9kZTsKKwlwRHN0UHJvZmlsZS0+Y3NyUGVyc29uYSA9IHBTcmNQcm9maWxlLT5jc3JQZXJzb25hOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwlpZiAoY3NyX2lzX3Byb2ZpbGVfd2FwaShwU3JjUHJvZmlsZSkpCisJCWlmIChwRHN0UHJvZmlsZS0+cGh5TW9kZSAmIGVDU1JfRE9UMTFfTU9ERV8xMW4pCisJCQlwRHN0UHJvZmlsZS0+cGh5TW9kZSAmPSB+ZUNTUl9ET1QxMV9NT0RFXzExbjsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCXBEc3RQcm9maWxlLT5DQk1vZGUgPSBwU3JjUHJvZmlsZS0+Q0JNb2RlOworCXBEc3RQcm9maWxlLT5jaF9wYXJhbXMuY2hfd2lkdGggPSBwU3JjUHJvZmlsZS0+Y2hfcGFyYW1zLmNoX3dpZHRoOworCXBEc3RQcm9maWxlLT5jaF9wYXJhbXMuY2VudGVyX2ZyZXFfc2VnMCA9CisJCXBTcmNQcm9maWxlLT5jaF9wYXJhbXMuY2VudGVyX2ZyZXFfc2VnMDsKKwlwRHN0UHJvZmlsZS0+Y2hfcGFyYW1zLmNlbnRlcl9mcmVxX3NlZzEgPQorCQlwU3JjUHJvZmlsZS0+Y2hfcGFyYW1zLmNlbnRlcl9mcmVxX3NlZzE7CisJcERzdFByb2ZpbGUtPmNoX3BhcmFtcy5zZWNfY2hfb2Zmc2V0ID0KKwkJcFNyY1Byb2ZpbGUtPmNoX3BhcmFtcy5zZWNfY2hfb2Zmc2V0OworCS8qU2F2ZSB0aGUgV1BTIGluZm8gKi8KKwlwRHN0UHJvZmlsZS0+YldQU0Fzc29jaWF0aW9uID0gcFNyY1Byb2ZpbGUtPmJXUFNBc3NvY2lhdGlvbjsKKwlwRHN0UHJvZmlsZS0+Yk9TRU5Bc3NvY2lhdGlvbiA9IHBTcmNQcm9maWxlLT5iT1NFTkFzc29jaWF0aW9uOworCXBEc3RQcm9maWxlLT51YXBzZF9tYXNrID0gcFNyY1Byb2ZpbGUtPnVhcHNkX21hc2s7CisJcERzdFByb2ZpbGUtPmJlYWNvbkludGVydmFsID0gcFNyY1Byb2ZpbGUtPmJlYWNvbkludGVydmFsOworCXBEc3RQcm9maWxlLT5wcml2YWN5ID0gcFNyY1Byb2ZpbGUtPnByaXZhY3k7CisJcERzdFByb2ZpbGUtPmZ3ZFdQU1BCQ1Byb2JlUmVxID0gcFNyY1Byb2ZpbGUtPmZ3ZFdQU1BCQ1Byb2JlUmVxOworCXBEc3RQcm9maWxlLT5jc3I4MDIxMUF1dGhUeXBlID0gcFNyY1Byb2ZpbGUtPmNzcjgwMjExQXV0aFR5cGU7CisJcERzdFByb2ZpbGUtPmR0aW1QZXJpb2QgPSBwU3JjUHJvZmlsZS0+ZHRpbVBlcmlvZDsKKwlwRHN0UHJvZmlsZS0+QXBVYXBzZEVuYWJsZSA9IHBTcmNQcm9maWxlLT5BcFVhcHNkRW5hYmxlOworCXBEc3RQcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5zc2lkSGlkZGVuID0KKwkJcFNyY1Byb2ZpbGUtPlNTSURzLlNTSURMaXN0WzBdLnNzaWRIaWRkZW47CisJcERzdFByb2ZpbGUtPnByb3RFbmFibGVkID0gcFNyY1Byb2ZpbGUtPnByb3RFbmFibGVkOworCXBEc3RQcm9maWxlLT5vYnNzUHJvdEVuYWJsZWQgPSBwU3JjUHJvZmlsZS0+b2Jzc1Byb3RFbmFibGVkOworCXBEc3RQcm9maWxlLT5jZmdfcHJvdGVjdGlvbiA9IHBTcmNQcm9maWxlLT5jZmdfcHJvdGVjdGlvbjsKKwlwRHN0UHJvZmlsZS0+d3BzX3N0YXRlID0gcFNyY1Byb2ZpbGUtPndwc19zdGF0ZTsKKwlwRHN0UHJvZmlsZS0+aWVlZTgwMjExZCA9IHBTcmNQcm9maWxlLT5pZWVlODAyMTFkOworCXBEc3RQcm9maWxlLT5zYXBfZG90MTFtYyA9IHBTcmNQcm9maWxlLT5zYXBfZG90MTFtYzsKKwljZGZfbWVtX2NvcHkoJnBEc3RQcm9maWxlLT5LZXlzLCAmcFNyY1Byb2ZpbGUtPktleXMsCisJCXNpemVvZihwRHN0UHJvZmlsZS0+S2V5cykpOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwlwRHN0UHJvZmlsZS0+TUZQRW5hYmxlZCA9IHBTcmNQcm9maWxlLT5NRlBFbmFibGVkOworCXBEc3RQcm9maWxlLT5NRlBSZXF1aXJlZCA9IHBTcmNQcm9maWxlLT5NRlBSZXF1aXJlZDsKKwlwRHN0UHJvZmlsZS0+TUZQQ2FwYWJsZSA9IHBTcmNQcm9maWxlLT5NRlBDYXBhYmxlOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAocFNyY1Byb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQpIHsKKwkJcERzdFByb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQgPSAxOworCQlwRHN0UHJvZmlsZS0+TURJRC5tb2JpbGl0eURvbWFpbiA9CisJCQlwU3JjUHJvZmlsZS0+TURJRC5tb2JpbGl0eURvbWFpbjsKKwl9CisjZW5kaWYKKwljZGZfbWVtX2NvcHkoJnBEc3RQcm9maWxlLT5hZGRJZVBhcmFtcywgJnBTcmNQcm9maWxlLT5hZGRJZVBhcmFtcywKKwkJCXNpemVvZih0U2lyQWRkSWVQYXJhbXMpKTsKK2VuZDoKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWNzcl9yZWxlYXNlX3Byb2ZpbGUocE1hYywgcERzdFByb2ZpbGUpOworCQlwRHN0UHJvZmlsZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9jb3B5X2Nvbm5lY3RlZF9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQl1aW50MzJfdCBzZXNzaW9uSWQsIHRDc3JSb2FtUHJvZmlsZSAqcERzdFByb2ZpbGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwU3JjUHJvZmlsZSA9CisJCSZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdGVkUHJvZmlsZTsKKworCWNkZl9tZW1fc2V0KHBEc3RQcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSwgMCk7CisKKwlwRHN0UHJvZmlsZS0+QlNTSURzLmJzc2lkID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwlpZiAoTlVMTCA9PSBwRHN0UHJvZmlsZS0+QlNTSURzLmJzc2lkKSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEJTU0lEICIKKwkJCU1BQ19BRERSRVNTX1NUUiksCisJCQlNQUNfQUREUl9BUlJBWShwU3JjUHJvZmlsZS0+YnNzaWQuYnl0ZXMpKTsKKwkJZ290byBlbmQ7CisJfQorCXBEc3RQcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSAxOworCWNkZl9jb3B5X21hY2FkZHIocERzdFByb2ZpbGUtPkJTU0lEcy5ic3NpZCwgJnBTcmNQcm9maWxlLT5ic3NpZCk7CisKKwlpZiAocFNyY1Byb2ZpbGUtPlNTSUQuc3NJZCkgeworCQlwRHN0UHJvZmlsZS0+U1NJRHMuU1NJRExpc3QgPQorCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JTU0lESW5mbykpOworCQlpZiAoTlVMTCA9PSBwRHN0UHJvZmlsZS0+U1NJRHMuU1NJRExpc3QpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgU1NJRCAiCisJCQkJTUFDX0FERFJFU1NfU1RSKSwKKwkJCQlNQUNfQUREUl9BUlJBWShwU3JjUHJvZmlsZS0+YnNzaWQuYnl0ZXMpKTsKKwkJCWdvdG8gZW5kOworCQl9CisJCXBEc3RQcm9maWxlLT5TU0lEcy5udW1PZlNTSURzID0gMTsKKwkJcERzdFByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzBdLmhhbmRvZmZQZXJtaXR0ZWQgPQorCQkJcFNyY1Byb2ZpbGUtPmhhbmRvZmZQZXJtaXR0ZWQ7CisJCXBEc3RQcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5zc2lkSGlkZGVuID0KKwkJCXBTcmNQcm9maWxlLT5zc2lkSGlkZGVuOworCQljZGZfbWVtX2NvcHkoJnBEc3RQcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5TU0lELAorCQkJJnBTcmNQcm9maWxlLT5TU0lELCBzaXplb2YodFNpck1hY1NTaWQpKTsKKwl9CisJaWYgKHBTcmNQcm9maWxlLT5uQWRkSUVBc3NvY0xlbmd0aCkgeworCQlwRHN0UHJvZmlsZS0+cEFkZElFQXNzb2MgPQorCQkJY2RmX21lbV9tYWxsb2MocFNyY1Byb2ZpbGUtPm5BZGRJRUFzc29jTGVuZ3RoKTsKKwkJaWYgKE5VTEwgPT0gcERzdFByb2ZpbGUtPnBBZGRJRUFzc29jKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoImZhaWxlZCB0byBhbGxvY2F0ZSBtZW0gZm9yIGFkZGl0aW9uYWwgaWUiKSk7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlwRHN0UHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGggPSBwU3JjUHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGg7CisJCWNkZl9tZW1fY29weShwRHN0UHJvZmlsZS0+cEFkZElFQXNzb2MsIHBTcmNQcm9maWxlLT5wQWRkSUVBc3NvYywKKwkJCXBTcmNQcm9maWxlLT5uQWRkSUVBc3NvY0xlbmd0aCk7CisJfQorCXBEc3RQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IGNkZl9tZW1fbWFsbG9jKDEpOworCWlmIChOVUxMID09IHBEc3RQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCkgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gZW5kOworCX0KKwlwRHN0UHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDE7CisJcERzdFByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0WzBdID0gcFNyY1Byb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWw7CisJcERzdFByb2ZpbGUtPkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworCXBEc3RQcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9IHBTcmNQcm9maWxlLT5BdXRoVHlwZTsKKwlwRHN0UHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlID0gcFNyY1Byb2ZpbGUtPkF1dGhUeXBlOworCXBEc3RQcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKwlwRHN0UHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPQorCQlwU3JjUHJvZmlsZS0+RW5jcnlwdGlvblR5cGU7CisJcERzdFByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlID0KKwkJcFNyY1Byb2ZpbGUtPkVuY3J5cHRpb25UeXBlOworCXBEc3RQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCXBEc3RQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0KKwkJcFNyY1Byb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGU7CisJcERzdFByb2ZpbGUtPm5lZ290aWF0ZWRNQ0VuY3J5cHRpb25UeXBlID0KKwkJcFNyY1Byb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGU7CisJcERzdFByb2ZpbGUtPkJTU1R5cGUgPSBwU3JjUHJvZmlsZS0+QlNTVHlwZTsKKwlwRHN0UHJvZmlsZS0+Q0JNb2RlID0gcFNyY1Byb2ZpbGUtPkNCTW9kZTsKKwljZGZfbWVtX2NvcHkoJnBEc3RQcm9maWxlLT5LZXlzLCAmcFNyY1Byb2ZpbGUtPktleXMsCisJCXNpemVvZihwRHN0UHJvZmlsZS0+S2V5cykpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJaWYgKHBTcmNQcm9maWxlLT5NRElELm1kaWVQcmVzZW50KSB7CisJCXBEc3RQcm9maWxlLT5NRElELm1kaWVQcmVzZW50ID0gMTsKKwkJcERzdFByb2ZpbGUtPk1ESUQubW9iaWxpdHlEb21haW4gPQorCQkJcFNyY1Byb2ZpbGUtPk1ESUQubW9iaWxpdHlEb21haW47CisJfQorI2VuZGlmCisKK2VuZDoKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWNzcl9yZWxlYXNlX3Byb2ZpbGUocE1hYywgcERzdFByb2ZpbGUpOworCQlwRHN0UHJvZmlsZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9pc3N1ZV9jb25uZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJICB0U2NhblJlc3VsdEhhbmRsZSBoQlNTTGlzdCwKKwkJCQkgIGVDc3JSb2FtUmVhc29uIHJlYXNvbiwgdWludDMyX3Qgcm9hbUlkLAorCQkJCSAgYm9vbCBmSW1lZGlhdGUsIGJvb2wgZkNsZWFyU2NhbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U21lQ21kICpwQ29tbWFuZDsKKworCXBDb21tYW5kID0gY3NyX2dldF9jb21tYW5kX2J1ZmZlcihwTWFjKTsKKwlpZiAoTlVMTCA9PSBwQ29tbWFuZCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXIiKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfSBlbHNlIHsKKwkJaWYgKGZDbGVhclNjYW4pIHsKKwkJCWNzcl9zY2FuX2Fib3J0X21hY19zY2FuX25vdF9mb3JfY29ubmVjdChwTWFjLCBzZXNzaW9uSWQpOworCQl9CisJCXBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VQcm9maWxlID0gZmFsc2U7CisJCWlmIChOVUxMID09IHBQcm9maWxlKSB7CisJCQkvKiBXZSBjYW4gcm9hbSBub3cgKi8KKwkJCS8qIFNpbmNlIHBQcm9maWxlIGlzIE5VTEwsIHdlIG5lZWQgdG8gYnVpbGQgb3VyIG93biBwcm9maWxlLCBzZXQgZXZlcnl0aGluZyB0byBkZWZhdWx0ICovCisJCQkvKiBXZSBjYW4gb25seSBzdXBwb3J0IG9wZW4gYW5kIG5vIGVuY3J5cHRpb24gKi8KKwkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuQXV0aFR5cGUubnVtRW50cmllcyA9IDE7CisJCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLkF1dGhUeXBlLmF1dGhUeXBlWzBdID0KKwkJCQllQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKwkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUuCisJCQludW1FbnRyaWVzID0gMTsKKwkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUuCisJCQllbmNyeXB0aW9uVHlwZVswXSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisJCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLmNzclBlcnNvbmEgPQorCQkJCUNERl9TVEFfTU9ERTsKKwkJfSBlbHNlIHsKKwkJCS8qIG1ha2UgYSBjb3B5IG9mIHRoZSBwcm9maWxlICovCisJCQlzdGF0dXMgPQorCQkJCWNzcl9yb2FtX2NvcHlfcHJvZmlsZShwTWFjLAorCQkJCQkJICAgICAgJnBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUsCisJCQkJCQkgICAgICBwUHJvZmlsZSk7CisJCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQlwQ29tbWFuZC0+dS5yb2FtQ21kLmZSZWxlYXNlUHJvZmlsZSA9IHRydWU7CisJCQl9CisJCX0KKworCQlwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kUm9hbTsKKwkJcENvbW1hbmQtPnNlc3Npb25JZCA9ICh1aW50OF90KSBzZXNzaW9uSWQ7CisJCXBDb21tYW5kLT51LnJvYW1DbWQuaEJTU0xpc3QgPSBoQlNTTGlzdDsKKwkJcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQgPSByb2FtSWQ7CisJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IHJlYXNvbjsKKwkJLyogV2UgbmVlZCB0byBmcmVlIHRoZSBCc3NMaXN0IHdoZW4gdGhlIGNvbW1hbmQgaXMgZG9uZSAqLworCQlwQ29tbWFuZC0+dS5yb2FtQ21kLmZSZWxlYXNlQnNzTGlzdCA9IHRydWU7CisJCXBDb21tYW5kLT51LnJvYW1DbWQuZlVwZGF0ZUN1clJvYW1Qcm9maWxlID0gdHJ1ZTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoIkNTUiBQRVJTT05BPSVkIiksCisJCQkgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuY3NyUGVyc29uYSk7CisJCXN0YXR1cyA9IGNzcl9xdWV1ZV9zbWVfY29tbWFuZChwTWFjLCBwQ29tbWFuZCwgZkltZWRpYXRlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCIgZmFpbCB0byBzZW5kIG1lc3NhZ2Ugc3RhdHVzID0gJWQiKSwgc3RhdHVzKTsKKwkJCWNzcl9yZWxlYXNlX2NvbW1hbmRfcm9hbShwTWFjLCBwQ29tbWFuZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX2lzc3VlX3JlYXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCQkgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqcE1tb2RQcm9maWxlRmllbGRzLAorCQkJCSAgZUNzclJvYW1SZWFzb24gcmVhc29uLCB1aW50MzJfdCByb2FtSWQsCisJCQkJICBib29sIGZJbWVkaWF0ZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U21lQ21kICpwQ29tbWFuZDsKKworCXBDb21tYW5kID0gY3NyX2dldF9jb21tYW5kX2J1ZmZlcihwTWFjKTsKKwlpZiAoTlVMTCA9PSBwQ29tbWFuZCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXIiKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfSBlbHNlIHsKKwkJY3NyX3NjYW5fYWJvcnRfbWFjX3NjYW5fbm90X2Zvcl9jb25uZWN0KHBNYWMsIHNlc3Npb25JZCk7CisJCWlmIChwUHJvZmlsZSkgeworCQkJLyogVGhpcyBpcyBsaWtlbHkgdHJ5aW5nIHRvIHJlYXNzb2MgdG8gZGlmZmVyZW50IHByb2ZpbGUgKi8KKwkJCXBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VQcm9maWxlID0gZmFsc2U7CisJCQkvKiBtYWtlIGEgY29weSBvZiB0aGUgcHJvZmlsZSAqLworCQkJc3RhdHVzID0KKwkJCQljc3Jfcm9hbV9jb3B5X3Byb2ZpbGUocE1hYywKKwkJCQkJCSAgICAgICZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLAorCQkJCQkJICAgICAgcFByb2ZpbGUpOworCQkJcENvbW1hbmQtPnUucm9hbUNtZC5mVXBkYXRlQ3VyUm9hbVByb2ZpbGUgPSB0cnVlOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0KKwkJCQljc3Jfcm9hbV9jb3B5X2Nvbm5lY3RlZF9wcm9maWxlKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQkJJnBDb21tYW5kLT51LnJvYW1DbWQuCisJCQkJCQkJCXJvYW1Qcm9maWxlKTsKKwkJCS8qIGhvdyB0byB1cGRhdGUgV1BBL1dQQTIgaW5mbyBpbiByb2FtUHJvZmlsZT8/ICovCisJCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLnVhcHNkX21hc2sgPQorCQkJCXBNbW9kUHJvZmlsZUZpZWxkcy0+dWFwc2RfbWFzazsKKwkJfQorCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VQcm9maWxlID0gdHJ1ZTsKKwkJfQorCQlwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kUm9hbTsKKwkJcENvbW1hbmQtPnNlc3Npb25JZCA9ICh1aW50OF90KSBzZXNzaW9uSWQ7CisJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkID0gcm9hbUlkOworCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSByZWFzb247CisJCS8qIFdlIG5lZWQgdG8gZnJlZSB0aGUgQnNzTGlzdCB3aGVuIHRoZSBjb21tYW5kIGlzIGRvbmUgKi8KKwkJLyogRm9yIHJlYXNzb2MgdGhlcmUgaXMgbm8gQlNTIGxpc3QsIHNvIHRoZSBib29sIHNldCB0byBmYWxzZSAqLworCQlwQ29tbWFuZC0+dS5yb2FtQ21kLmhCU1NMaXN0ID0gQ1NSX0lOVkFMSURfU0NBTlJFU1VMVF9IQU5ETEU7CisJCXBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VCc3NMaXN0ID0gZmFsc2U7CisJCXBDb21tYW5kLT51LnJvYW1DbWQuZlJlYXNzb2MgPSB0cnVlOworCQljc3Jfcm9hbV9yZW1vdmVfZHVwbGljYXRlX2NvbW1hbmQocE1hYywgc2Vzc2lvbklkLCBwQ29tbWFuZCwKKwkJCQkJCSAgcmVhc29uKTsKKwkJc3RhdHVzID0gY3NyX3F1ZXVlX3NtZV9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCBmSW1lZGlhdGUpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZCIpLCBzdGF0dXMpOworCQkJY3NyX3JvYW1fY29tcGxldGlvbihwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIHBDb21tYW5kLAorCQkJCQkgICAgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFLCBmYWxzZSk7CisJCQljc3JfcmVsZWFzZV9jb21tYW5kX3JvYW0ocE1hYywgcENvbW1hbmQpOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fZW5xdWV1ZV9wcmVhdXRoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgdHBTaXJCc3NEZXNjcmlwdGlvbiBwQnNzRGVzY3JpcHRpb24sCisJCQkJICAgIGVDc3JSb2FtUmVhc29uIHJlYXNvbiwgYm9vbCBmSW1tZWRpYXRlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTbWVDbWQgKnBDb21tYW5kOworCisJcENvbW1hbmQgPSBjc3JfZ2V0X2NvbW1hbmRfYnVmZmVyKHBNYWMpOworCWlmIChOVUxMID09IHBDb21tYW5kKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIGdldCBjb21tYW5kIGJ1ZmZlciIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwl9IGVsc2UgeworCQlpZiAocEJzc0Rlc2NyaXB0aW9uKSB7CisJCQkvKiBjb3B5IG92ZXIgdGhlIHBhcmFtZXRlcnMgd2UgbmVlZCBsYXRlciAqLworCQkJcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFJvYW07CisJCQlwQ29tbWFuZC0+c2Vzc2lvbklkID0gKHVpbnQ4X3QpIHNlc3Npb25JZDsKKwkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IHJlYXNvbjsKKwkJCS8qIHRoaXMgaXMgdGhlIGltcG9ydGFudCBwYXJhbWV0ZXIgKi8KKwkJCS8qIGluIHRoaXMgY2FzZSB3ZSBhcmUgdXNpbmcgdGhpcyBmaWVsZCBmb3IgdGhlICJuZXh0IiBCU1MgKi8KKwkJCXBDb21tYW5kLT51LnJvYW1DbWQucExhc3RSb2FtQnNzID0gcEJzc0Rlc2NyaXB0aW9uOworCQkJc3RhdHVzID0gY3NyX3F1ZXVlX3NtZV9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCBmSW1tZWRpYXRlKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMCisJCQkJCQkoIiBmYWlsIHRvIGVucXVldWUgcHJlYXV0aCBjb21tYW5kLCBzdGF0dXMgPSAlZCIpLAorCQkJCQlzdGF0dXMpOworCQkJCWNzcl9yZWxlYXNlX2NvbW1hbmRfcHJlYXV0aChwTWFjLCBwQ29tbWFuZCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBSZXR1cm4gZmFpbHVyZSAqLworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9kZXF1ZXVlX3JvYW1fY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCBlQ3NyUm9hbVJlYXNvbiByZWFzb24pCit7CisJdExpc3RFbGVtICpwRW50cnk7CisJdFNtZUNtZCAqcENvbW1hbmQ7CisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKwlpZiAocEVudHJ5KSB7CisJCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCQlpZiAoKGVTbWVDb21tYW5kUm9hbSA9PSBwQ29tbWFuZC0+Y29tbWFuZCkgJiYKKwkJICAgIChlQ3NyUGVyZm9ybVByZWF1dGggPT0gcmVhc29uKSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiRFEtQ29tbWFuZCA9ICVkLCBSZWFzb24gPSAlZCIpLAorCQkJCXBDb21tYW5kLT5jb21tYW5kLAorCQkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbik7CisJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeQorCQkJCSAgICAoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBwRW50cnksCisJCQkJICAgIExMX0FDQ0VTU19MT0NLKSkgeworCQkJCWNzcl9yZWxlYXNlX2NvbW1hbmRfcHJlYXV0aChwTWFjLCBwQ29tbWFuZCk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGVTbWVDb21tYW5kUm9hbSA9PSBwQ29tbWFuZC0+Y29tbWFuZCkgJiYKKwkJCSAgIChlQ3NyU21lSXNzdWVkRlRSZWFzc29jID09IHJlYXNvbikpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIkRRLUNvbW1hbmQgPSAlZCwgUmVhc29uID0gJWQiKSwKKwkJCQlwQ29tbWFuZC0+Y29tbWFuZCwKKwkJCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pOworCQkJaWYgKGNzcl9sbF9yZW1vdmVfZW50cnkKKwkJCQkgICAgKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgcEVudHJ5LAorCQkJCSAgICBMTF9BQ0NFU1NfTE9DSykpIHsKKwkJCQljc3JfcmVsZWFzZV9jb21tYW5kX3JvYW0ocE1hYywgcENvbW1hbmQpOworCQkJfQorCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiQ29tbWFuZCA9ICVkLCBSZWFzb24gPSAlZCAiKSwKKwkJCQlwQ29tbWFuZC0+Y29tbWFuZCwKKwkJCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pOworCQl9CisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInBFbnRyeSBOVUxMIGZvciBlV05JX1NNRV9GVF9QUkVfQVVUSF9SU1AiKSk7CisJfQorCXNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUocE1hYyk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9jb25uZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJdWludDMyX3QgKnBSb2FtSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNjYW5SZXN1bHRIYW5kbGUgaEJTU0xpc3Q7CisJdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyOworCXVpbnQzMl90IHJvYW1JZCA9IDA7CisJYm9vbCBmQ2FsbENhbGxiYWNrID0gZmFsc2U7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCXRTaXJCc3NEZXNjcmlwdGlvbiBmaXJzdF9hcF9wcm9maWxlOworCisJaWYgKE5VTEwgPT0gcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JZDolZCIpLAorCQkJc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChOVUxMID09IHBQcm9maWxlKSB7CisJCXNtc19sb2cocE1hYywgTE9HUCwgRkwoIk5vIHByb2ZpbGUgc3BlY2lmaWVkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIEluaXRpYWxpemUgdGhlIGNvdW50IGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggdGhlIEpvaW4gcmVxdWVzdHMgKi8KKwlwU2Vzc2lvbi0+am9pbl9ic3NpZF9jb3VudCA9IDA7CisJc21zX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgiY2FsbGVkICBCU1NUeXBlID0gJWQgYXV0aHR5cGUgPSAlZCAgZW5jcnlUeXBlID0gJWQiKSwKKwkJcFByb2ZpbGUtPkJTU1R5cGUsIHBQcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSwKKwkJcFByb2ZpbGUtPkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdKTsKKwljc3Jfcm9hbV9jYW5jZWxfcm9hbWluZyhwTWFjLCBzZXNzaW9uSWQpOworCWNzcl9zY2FuX3JlbW92ZV9mcmVzaF9zY2FuX2NvbW1hbmQocE1hYywgc2Vzc2lvbklkKTsKKwkvKiBPbmx5IGFib3J0IHRoZSBzY2FuIGlmIGl0cyBub3QgdXNlZCBmb3Igb3RoZXIgcm9hbS9jb25uZWN0IHB1cnBvc2UgKi8KKwljc3Jfc2Nhbl9hYm9ydF9tYWNfc2NhbihwTWFjLCBzZXNzaW9uSWQsIGVDU1JfU0NBTl9BQk9SVF9ERUZBVUxUKTsKKwljc3Jfcm9hbV9yZW1vdmVfZHVwbGljYXRlX2NvbW1hbmQocE1hYywgc2Vzc2lvbklkLCBOVUxMLCBlQ3NySGRkSXNzdWVkKTsKKwkvKiBDaGVjayB3aGV0aGVyIHNzaWQgY2hhbmdlcyAqLworCWlmIChjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWQocE1hYywgc2Vzc2lvbklkKSAmJgorCQlwUHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcyAmJiAhY3NyX2lzX3NzaWRfaW5fbGlzdChwTWFjLAorCQkJJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLlNTSUQsICZwUHJvZmlsZS0+U1NJRHMpKQorCQkJY3NyX3JvYW1faXNzdWVfZGlzYXNzb2NpYXRlX2NtZChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCWVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorCXBTZXNzaW9uLT5tYXhSZXRyeUNvdW50ID0gQ1NSX0pPSU5fTUFYX1JFVFJZX0NPVU5UOworI2VuZGlmCisJcFNjYW5GaWx0ZXIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKwlpZiAoTlVMTCA9PSBwU2NhbkZpbHRlcikgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCWNkZl9tZW1fc2V0KHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpLAorCQkJMCk7CisJLyogVHJ5IHRvIGNvbm5lY3QgdG8gYW55IEJTUyAqLworCWlmIChOVUxMID09IHBQcm9maWxlKSB7CisJCS8qIE5vIGVuY3J5cHRpb24gKi8KKwkJcFNjYW5GaWx0ZXItPkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCQlwU2NhbkZpbHRlci0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPQorCQkJZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwl9IGVsc2UgeworCQkvKiBIZXJlIGlzIHRoZSBwcm9maWxlIHdlIG5lZWQgdG8gY29ubmVjdCB0byAqLworCQlzdGF0dXMgPSBjc3Jfcm9hbV9wcmVwYXJlX2ZpbHRlcl9mcm9tX3Byb2ZpbGUocE1hYywKKwkJCQlwUHJvZmlsZSwgcFNjYW5GaWx0ZXIpOworCX0KKwlyb2FtSWQgPSBHRVRfTkVYVF9ST0FNX0lEKCZwTWFjLT5yb2FtKTsKKwlpZiAocFJvYW1JZCkKKwkJKnBSb2FtSWQgPSByb2FtSWQ7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljZGZfbWVtX2ZyZWUocFNjYW5GaWx0ZXIpOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKlNhdmUgdGhlIFdQUyBpbmZvICovCisJaWYgKE5VTEwgIT0gcFByb2ZpbGUpIHsKKwkJcFNjYW5GaWx0ZXItPmJXUFNBc3NvY2lhdGlvbiA9CisJCQlwUHJvZmlsZS0+YldQU0Fzc29jaWF0aW9uOworCQlwU2NhbkZpbHRlci0+Yk9TRU5Bc3NvY2lhdGlvbiA9CisJCQlwUHJvZmlsZS0+Yk9TRU5Bc3NvY2lhdGlvbjsKKwl9IGVsc2UgeworCQlwU2NhbkZpbHRlci0+YldQU0Fzc29jaWF0aW9uID0gMDsKKwkJcFNjYW5GaWx0ZXItPmJPU0VOQXNzb2NpYXRpb24gPSAwOworCX0KKwlpZiAoKHBQcm9maWxlICYmIENTUl9JU19XRFNfQVAocFByb2ZpbGUpKSB8fCAocFByb2ZpbGUKKwkJCQkmJiBDU1JfSVNfSU5GUkFfQVAocFByb2ZpbGUpKSkgeworCQkvKiBUaGlzIGNhbiBiZSBzdGFydGVkIHJpZ2h0IGF3YXkgKi8KKwkJc3RhdHVzID0gY3NyX3JvYW1faXNzdWVfY29ubmVjdChwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCBOVUxMLAorCQkJCSBlQ3NySGRkSXNzdWVkLCByb2FtSWQsIGZhbHNlLCBmYWxzZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiQ1NSIGZhaWxlZCB0byBpc3N1ZSBzdGFydCBCU1MgY21kIHdpdGggc3RhdHVzID0gMHglMDhYIiksCisJCQkJc3RhdHVzKTsKKwkJCWZDYWxsQ2FsbGJhY2sgPSB0cnVlOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMKCJDb25uZWN0IHJlcXVlc3QgdG8gcHJvY2VlZCBmb3Igc2FwIG1vZGUiKSk7CisJCX0KKworCQljc3JfZnJlZV9zY2FuX2ZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisJCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlcik7CisJCWdvdG8gZW5kOworCX0KKwlzdGF0dXMgPSBjc3Jfc2Nhbl9nZXRfcmVzdWx0KHBNYWMsIHBTY2FuRmlsdGVyLCAmaEJTU0xpc3QpOworCXNtc19sb2cocE1hYywgTE9HMSwKKwkJRkwoIioqKioqKiogY3NyX3NjYW5fZ2V0X3Jlc3VsdCBTdGF0dXMgKioqKioqICVkIiksIHN0YXR1cyk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCS8qIGNoZWNrIGlmIHNldCBodyBtb2RlIG5lZWRzIHRvIGJlIGRvbmUgKi8KKwkJaWYgKChwTWFjLT5wb2xpY3lfbWFuYWdlcl9lbmFibGVkKSAmJgorCQkJKHBTY2FuRmlsdGVyLT5jc3JQZXJzb25hID09IENERl9TVEFfTU9ERSkpIHsKKwkJCWNzcl9nZXRfYnNzZGVzY3JfZnJvbV9zY2FuX2hhbmRsZShoQlNTTGlzdCwKKwkJCQkJJmZpcnN0X2FwX3Byb2ZpbGUpOworCQkJaWYgKCFjZHNfaGFuZGxlX2NvbmNfbXVsdGlwb3J0KHNlc3Npb25JZCwKKwkJCQkJCWZpcnN0X2FwX3Byb2ZpbGUuY2hhbm5lbElkKSkgeworCQkJCXNtc19sb2cocE1hYywgTE9HMSwgRkwoImNvbmMgbXVsdGlwb3J0IGVycm9yIikpOworCQkJCWNzcl9zY2FuX3Jlc3VsdF9wdXJnZShwTWFjLCBoQlNTTGlzdCk7CisJCQkJZkNhbGxDYWxsYmFjayA9IHRydWU7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCisJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX2Nvbm5lY3QocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwKKwkJCQloQlNTTGlzdCwgZUNzckhkZElzc3VlZCwgcm9hbUlkLCBmYWxzZSwgZmFsc2UpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIkNTUiBmYWlsZWQgdG8gaXNzdWUgY29ubmVjdCBjbWQgd2l0aCBzdGF0dXMgPSAweCUwOFgiKSwKKwkJCQlzdGF0dXMpOworCQkJY3NyX3NjYW5fcmVzdWx0X3B1cmdlKHBNYWMsIGhCU1NMaXN0KTsKKwkJCWZDYWxsQ2FsbGJhY2sgPSB0cnVlOworCQl9CisJfSBlbHNlIGlmIChOVUxMICE9IHBQcm9maWxlKSB7CisJCS8qIENoZWNrIHdoZXRoZXIgaXQgaXMgZm9yIHN0YXJ0IGlic3MgKi8KKwkJaWYgKENTUl9JU19TVEFSVF9JQlNTKHBQcm9maWxlKSkgeworCQkJc3RhdHVzID0gY3NyX3JvYW1faXNzdWVfY29ubmVjdChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCXBQcm9maWxlLCBOVUxMLCBlQ3NySGRkSXNzdWVkLAorCQkJCQlyb2FtSWQsIGZhbHNlLCBmYWxzZSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTCgiQ1NSIGZhaWxlZCB0byBpc3N1ZSBzdGFydElCU1MgY21kIHdpdGggc3RhdHVzID0gMHglMDhYIiksCisJCQkJCXN0YXR1cyk7CisJCQkJZkNhbGxDYWxsYmFjayA9IHRydWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBzY2FuIGZvciB0aGlzIFNTSUQgKi8KKwkJCXN0YXR1cyA9IGNzcl9zY2FuX2Zvcl9zc2lkKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsCisJCQkJCQlyb2FtSWQsIHRydWUpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwoIkNTUiBmYWlsZWQgdG8gaXNzdWUgU1NJRCBzY2FuIGNtZCB3aXRoIHN0YXR1cyA9IDB4JTA4WCIpLAorCQkJCQlzdGF0dXMpOworCQkJCWZDYWxsQ2FsbGJhY2sgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQkJCUZMKCJTU0lEIHNjYW4gcmVxdWVzdGVkIikpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZkNhbGxDYWxsYmFjayA9IHRydWU7CisJfQorCitlcnJvcjoKKwlpZiAoTlVMTCAhPSBwUHJvZmlsZSkKKwkJLyoKKwkJICogd2UgbmVlZCB0byBmcmVlIG1lbW9yeSBmb3IgZmlsdGVyCisJCSAqIGlmIHByb2ZpbGUgZXhpc3RzCisJCSAqLworCQljc3JfZnJlZV9zY2FuX2ZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisKKwljZGZfbWVtX2ZyZWUocFNjYW5GaWx0ZXIpOworZW5kOgorCS8qIHRlbGwgdGhlIGNhbGxlciBpZiB3ZSBmYWlsIHRvIHRyaWdnZXIgYSBqb2luIHJlcXVlc3QgKi8KKwlpZiAoZkNhbGxDYWxsYmFjaykgeworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgcm9hbUlkLAorCQkJCWVDU1JfUk9BTV9GQUlMRUQsIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY3NyX3JvYW1fcmVhc3NvYygpIC0gcHJvY2VzcyByZWFzc29jIGNvbW1hbmQKKyAqIEBtYWNfY3R4OiAgICAgICBtYWMgZ2xvYmFsIGNvbnRleHQKKyAqIEBzZXNzaW9uX2lkOiAgICBzZXNzaW9uIGlkCisgKiBAcHJvZmlsZTogICAgICAgcm9hbSBwcm9maWxlCisgKiBAbW9kX2ZpZWxkczogICAgQUMgaW5mbyBiZWluZyBtb2RpZmllZCBpbiByZWFzc29jCisgKiBAcm9hbV9pZDogICAgICAgcm9hbSBpZCB0byBiZSBwb3B1bGF0ZWQKKyAqCisgKiBSZXR1cm46IHN0YXR1cyBvZiBvcGVyYXRpb24KKyAqLworQ0RGX1NUQVRVUworY3NyX3JvYW1fcmVhc3NvYyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCBzZXNzaW9uX2lkLAorCQkgdENzclJvYW1Qcm9maWxlICpwcm9maWxlLAorCQkgdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzIG1vZF9maWVsZHMsCisJCSB1aW50MzJfdCAqcm9hbV9pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlib29sIGZDYWxsQ2FsbGJhY2sgPSB0cnVlOworCXVpbnQzMl90IHJvYW1JZCA9IDA7CisKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJaWYgKE5VTEwgPT0gcHJvZmlsZSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR1AsIEZMKCJObyBwcm9maWxlIHNwZWNpZmllZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJjYWxsZWQgIEJTU1R5cGUgPSAlZCBhdXRodHlwZSA9ICVkICBlbmNyeVR5cGUgPSAlZCIpLAorCQlwcm9maWxlLT5CU1NUeXBlLCBwcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSwKKwkJcHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0pOworCWNzcl9yb2FtX2NhbmNlbF9yb2FtaW5nKG1hY19jdHgsIHNlc3Npb25faWQpOworCWNzcl9zY2FuX3JlbW92ZV9mcmVzaF9zY2FuX2NvbW1hbmQobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJY3NyX3NjYW5fYWJvcnRfbWFjX3NjYW5fbm90X2Zvcl9jb25uZWN0KG1hY19jdHgsIHNlc3Npb25faWQpOworCWNzcl9yb2FtX3JlbW92ZV9kdXBsaWNhdGVfY29tbWFuZChtYWNfY3R4LCBzZXNzaW9uX2lkLCBOVUxMLAorCQkJCQkgIGVDc3JIZGRJc3N1ZWRSZWFzc29jVG9TYW1lQVApOworCWlmIChjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWQobWFjX2N0eCwgc2Vzc2lvbl9pZCkpIHsKKwkJaWYgKHByb2ZpbGUpIHsKKwkJCWlmIChwcm9maWxlLT5TU0lEcy5udW1PZlNTSURzICYmCisJCQkgICAgY3NyX2lzX3NzaWRfaW5fbGlzdChtYWNfY3R4LAorCQkJCQkJJnNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuU1NJRCwKKwkJCQkJCSZwcm9maWxlLT5TU0lEcykpIHsKKwkJCQlmQ2FsbENhbGxiYWNrID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogQ29ubmVjdGVkIFNTSUQgZGlkIG5vdCBtYXRjaCB3aXRoIHdoYXQgaXMKKwkJCQkgKiBhc2tlZCBpbiBwcm9maWxlCisJCQkJICovCisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiU1NJRCBtaXNtYXRjaCIpKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghY2RmX21lbV9jb21wYXJlKCZtb2RfZmllbGRzLAorCQkJCSZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm1vZGlmeVByb2ZpbGVGaWVsZHMsCisJCQkJc2l6ZW9mKHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcykpKSB7CisJCQlmQ2FsbENhbGxiYWNrID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCQkJLyoKKwkJCQkgKiBFaXRoZXIgdGhlIHByb2ZpbGUgaXMgTlVMTCBvciBub25lIG9mIHRoZQorCQkJCSAqIGZpZWxkcyBpbiB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgZ290CisJCQkJICogbW9kaWZpZWQKKwkJCQkgKi8KKwkJCQlGTCgiUHJvZmlsZSBOVUxMIG9yIG5vdGhpbmcgdG8gbW9kaWZ5LiIpKTsKKwkJfQorCX0gZWxzZSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwgRkwoIk5vdCBjb25uZWN0ZWQhIE5vIG5lZWQgdG8gcmVhc3NvYyIpKTsKKwl9CisJaWYgKCFmQ2FsbENhbGxiYWNrKSB7CisJCXJvYW1JZCA9IEdFVF9ORVhUX1JPQU1fSUQoJm1hY19jdHgtPnJvYW0pOworCQlpZiAocm9hbV9pZCkKKwkJCSpyb2FtX2lkID0gcm9hbUlkOworCQlzdGF0dXMgPSBjc3Jfcm9hbV9pc3N1ZV9yZWFzc29jKG1hY19jdHgsIHNlc3Npb25faWQsIHByb2ZpbGUsCisJCQkJJm1vZF9maWVsZHMsIGVDc3JIZGRJc3N1ZWRSZWFzc29jVG9TYW1lQVAsCisJCQkJcm9hbUlkLCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uX2lkLCBOVUxMLAorCQkJCQkJcm9hbUlkLCBlQ1NSX1JPQU1fRkFJTEVELAorCQkJCQkJZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9qb2luX2xhc3RfcHJvZmlsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0U2NhblJlc3VsdEhhbmRsZSBoQlNTTGlzdCA9IE5VTEw7CisJdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyID0gTlVMTDsKKwl1aW50MzJfdCByb2FtSWQ7CisJdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSA9IE5VTEw7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpIHsKKwkJY3NyX3NjYW5fYWJvcnRfbWFjX3NjYW5fbm90X2Zvcl9jb25uZWN0KHBNYWMsIHNlc3Npb25JZCk7CisJCS8qIFdlIGhhdmUgdG8gbWFrZSBhIGNvcHkgb2YgcEN1clJvYW1Qcm9maWxlIGJlY2F1c2UgaXQKKwkJICogd2lsbCBiZSBmcmVlIGluc2lkZSBjc3Jfcm9hbV9pc3N1ZV9jb25uZWN0ICovCisJCXBQcm9maWxlID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JSb2FtUHJvZmlsZSkpOworCQlpZiAoTlVMTCA9PSBwUHJvZmlsZSkgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQkJZ290byBlbmQ7CisJCX0KKwkJY2RmX21lbV9zZXQocFByb2ZpbGUsIHNpemVvZih0Q3NyUm9hbVByb2ZpbGUpLCAwKTsKKwkJc3RhdHVzID0gY3NyX3JvYW1fY29weV9wcm9maWxlKHBNYWMsIHBQcm9maWxlLAorCQkJcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQlnb3RvIGVuZDsKKwkJcFNjYW5GaWx0ZXIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKwkJaWYgKE5VTEwgPT0gcFNjYW5GaWx0ZXIpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWdvdG8gZW5kOworCQl9CisJCWNkZl9tZW1fc2V0KHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpLCAwKTsKKwkJc3RhdHVzID0gY3NyX3JvYW1fcHJlcGFyZV9maWx0ZXJfZnJvbV9wcm9maWxlKHBNYWMsIHBQcm9maWxlLAorCQkJCQlwU2NhbkZpbHRlcik7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQlnb3RvIGVuZDsKKwkJcm9hbUlkID0gR0VUX05FWFRfUk9BTV9JRCgmcE1hYy0+cm9hbSk7CisJCXN0YXR1cyA9IGNzcl9zY2FuX2dldF9yZXN1bHQocE1hYywgcFNjYW5GaWx0ZXIsICZoQlNTTGlzdCk7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJLyogd2Ugd2FudCB0byBwdXQgdGhlIGxhc3QgY29ubmVjdGVkIEJTUyB0byB0aGUKKwkJCSAqIHZlcnkgYmVnaW5uaW5nLCBpZiBwb3NzaWJsZSAqLworCQkJY3NyX21vdmVfYnNzX3RvX2hlYWRfZnJvbV9ic3NpZChwTWFjLAorCQkJCSZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCwgaEJTU0xpc3QpOworCQkJc3RhdHVzID0gY3NyX3JvYW1faXNzdWVfY29ubmVjdChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCXBQcm9maWxlLCBoQlNTTGlzdCwgZUNzckhkZElzc3VlZCwKKwkJCQkJcm9hbUlkLCBmYWxzZSwgZmFsc2UpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCWNzcl9zY2FuX3Jlc3VsdF9wdXJnZShwTWFjLCBoQlNTTGlzdCk7CisJCQkJZ290byBlbmQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBzY2FuIGZvciB0aGlzIFNTSUQgb25seSBpbmNhc2UgQVAgc3VwcHJlc3NlcyBTU0lEICovCisJCQlzdGF0dXMgPSBjc3Jfc2Nhbl9mb3Jfc3NpZChwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLAorCQkJCQlyb2FtSWQsIHRydWUpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCQlnb3RvIGVuZDsKKwkJfQorCX0gLyogV2UgaGF2ZSBhIHByb2ZpbGUgKi8KKwllbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiY2Fubm90IGZpbmQgYSByb2FtaW5nIHByb2ZpbGUiKSk7CisJCWdvdG8gZW5kOworCX0KK2VuZDoKKwlpZiAocFNjYW5GaWx0ZXIpIHsKKwkJY3NyX2ZyZWVfc2Nhbl9maWx0ZXIocE1hYywgcFNjYW5GaWx0ZXIpOworCQljZGZfbWVtX2ZyZWUocFNjYW5GaWx0ZXIpOworCX0KKwlpZiAoTlVMTCAhPSBwUHJvZmlsZSkgeworCQljc3JfcmVsZWFzZV9wcm9maWxlKHBNYWMsIHBQcm9maWxlKTsKKwkJY2RmX21lbV9mcmVlKHBQcm9maWxlKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9yZWNvbm5lY3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJaWYgKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCXN0YXR1cyA9CisJCQljc3Jfcm9hbV9pc3N1ZV9kaXNhc3NvY2lhdGVfY21kKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQllQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9qb2luX2xhc3RfcHJvZmlsZShwTWFjLCBzZXNzaW9uSWQpOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fY29ubmVjdF90b19sYXN0X3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiaXMgY2FsbGVkIikpOworCWNzcl9yb2FtX2NhbmNlbF9yb2FtaW5nKHBNYWMsIHNlc3Npb25JZCk7CisJY3NyX3JvYW1fcmVtb3ZlX2R1cGxpY2F0ZV9jb21tYW5kKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgZUNzckhkZElzc3VlZCk7CisJaWYgKGNzcl9pc19jb25uX3N0YXRlX2Rpc2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCXN0YXR1cyA9IGNzcl9yb2FtX2pvaW5fbGFzdF9wcm9maWxlKHBNYWMsIHNlc3Npb25JZCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fcHJvY2Vzc19kaXNhc3NvY19kZWF1dGgodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsCisJCQkJCSAgICBib29sIGZEaXNhc3NvYywgYm9vbCBmTUlDRmFpbHVyZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlib29sIGZDb21wbGV0ZSA9IGZhbHNlOworCWVDc3JSb2FtU3ViU3RhdGUgTmV3U3Vic3RhdGU7CisJdWludDMyX3Qgc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsKKworCWlmIChDU1JfSVNfV0FJVF9GT1JfS0VZKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIiBTdG9wIFdhaXQgZm9yIGtleSB0aW1lciBhbmQgY2hhbmdlIHN1YnN0YXRlIHRvIgorCQkJICAgIiBlQ1NSX1JPQU1fU1VCU1RBVEVfTk9ORSIpKTsKKwkJY3NyX3JvYW1fc3RvcF93YWl0X2Zvcl9rZXlfdGltZXIocE1hYyk7CisJCWNzcl9yb2FtX3N1YnN0YXRlX2NoYW5nZShwTWFjLCBlQ1NSX1JPQU1fU1VCU1RBVEVfTk9ORSwgc2Vzc2lvbklkKTsKKwl9CisJLyogY2hhbmdlIHN0YXRlIHRvICdSb2FtaW5nJy4uLiAqLworCWNzcl9yb2FtX3N0YXRlX2NoYW5nZShwTWFjLCBlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTklORywgc2Vzc2lvbklkKTsKKworCWlmIChjc3JfaXNfY29ubl9zdGF0ZV9pYnNzKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJLyogSWYgd2UgYXJlIGluIGFuIElCU1MsIHRoZW4gc3RvcCB0aGUgSUJTUy4uLiAqLworCQlzdGF0dXMgPQorCQkJY3NyX3JvYW1faXNzdWVfc3RvcF9ic3MocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJZUNTUl9ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUSk7CisJCWZDb21wbGV0ZSA9ICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpOworCX0gZWxzZSBpZiAoY3NyX2lzX2Nvbm5fc3RhdGVfaW5mcmEocE1hYywgc2Vzc2lvbklkKSkgeworCQkvKgorCQkgKiBpbiBJbmZyYXN0cnVjdHVyZSwgd2UgbmVlZCB0byBkaXNhc3NvY2lhdGUgZnJvbSB0aGUKKwkJICogSW5mcmFzdHJ1Y3R1cmUgbmV0d29yay4uLgorCQkgKi8KKwkJTmV3U3Vic3RhdGUgPSBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfRk9SQ0VEOworCQlpZiAoZUNzclNtZUlzc3VlZERpc2Fzc29jRm9ySGFuZG9mZiA9PQorCQkgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uKSB7CisJCQlOZXdTdWJzdGF0ZSA9IGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19IQU5ET0ZGOworCQl9IGVsc2UKKwkJaWYgKChlQ3NyRm9yY2VkRGlzYXNzb2MgPT0gcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uKQorCQkgICAgJiYgKGVTSVJfTUFDX0RJU0FTU09DX0xFQVZJTkdfQlNTX1JFQVNPTiA9PQorCQkJcENvbW1hbmQtPnUucm9hbUNtZC5yZWFzb24pKSB7CisJCQlOZXdTdWJzdGF0ZSA9IGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19TVEFfSEFTX0xFRlQ7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgRkwKKwkJCQkJICAoInNldCB0byBzdWJzdGF0ZSBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfU1RBX0hBU19MRUZUIikpOworCQl9CisJCWlmIChmRGlzYXNzb2MpIHsKKwkJCXN0YXR1cyA9CisJCQkJY3NyX3JvYW1faXNzdWVfZGlzYXNzb2NpYXRlKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQkgICAgTmV3U3Vic3RhdGUsIGZNSUNGYWlsdXJlKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9CisJCQkJY3NyX3JvYW1faXNzdWVfZGVhdXRoKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCSAgICAgIGVDU1JfUk9BTV9TVUJTVEFURV9ERUFVVEhfUkVRKTsKKwkJfQorCQlmQ29tcGxldGUgPSAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKTsKKwl9IGVsc2UgaWYgKGNzcl9pc19jb25uX3N0YXRlX3dkcyhwTWFjLCBzZXNzaW9uSWQpKSB7CisJCWlmIChDU1JfSVNfV0RTX0FQCisJCQkgICAgKCZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdGVkUHJvZmlsZSkpIHsKKwkJCXN0YXR1cyA9CisJCQkJY3NyX3JvYW1faXNzdWVfc3RvcF9ic3MocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCWVDU1JfUk9BTV9TVUJTVEFURV9TVE9QX0JTU19SRVEpOworCQkJZkNvbXBsZXRlID0gKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSk7CisJCX0KKwkJLyogVGhpcyBoYXMgdG8gYmUgV0RTIHN0YXRpb24gKi8KKwkJZWxzZSBpZiAoY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX3dkcyhwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQkvKiBUaGlzIGhhcyB0byBiZSBXRFMgc3RhdGlvbiAqLworCQkJcENvbW1hbmQtPnUucm9hbUNtZC5mU3RvcFdkcyA9IHRydWU7CisJCQlpZiAoZkRpc2Fzc29jKSB7CisJCQkJc3RhdHVzID0KKwkJCQkJY3NyX3JvYW1faXNzdWVfZGlzYXNzb2NpYXRlKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQkJICAgIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNDT05ORUNUX0NPTlRJTlVFX1JPQU1JTkcsCisJCQkJCQkJCSAgICBmTUlDRmFpbHVyZSk7CisJCQkJZkNvbXBsZXRlID0gKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiB3ZSBnb3QgYSBkaXMtYXNzb2MgcmVxdWVzdCB3aGlsZSBub3QgY29ubmVjdGVkIHRvIGFueSBwZWVyICovCisJCS8qIGp1c3QgY29tcGxldGUgdGhlIGNvbW1hbmQgKi8KKwkJZkNvbXBsZXRlID0gdHJ1ZTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmIChmQ29tcGxldGUpIHsKKwkJY3NyX3JvYW1fY29tcGxldGUocE1hYywgZUNzck5vdGhpbmdUb0pvaW4sIE5VTEwpOworCX0KKworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlpZiAoY3NyX2lzX2Nvbm5fc3RhdGVfaW5mcmEocE1hYywgc2Vzc2lvbklkKSkgeworCQkJLyogU2V0IHRoZSBzdGF0ZSB0byBkaXNjb25uZWN0IGhlcmUgKi8KKwkJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGUgPQorCQkJCWVDU1JfQVNTT0NfU1RBVEVfVFlQRV9OT1RfQ09OTkVDVEVEOworCQl9CisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIpLCBzdGF0dXMpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNzcl9wcmVwYXJlX2Rpc2Nvbm5lY3RfY29tbWFuZCgpIC0gZnVuY3Rpb24gdG8gcHJlcGFyZSBkaXNjb25uZWN0IGNvbW1hbmQKKyAqIEBtYWM6IHBvaW50ZXIgdG8gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAqIEBzZXNzaW9uX2lkOiBzbWUgc2Vzc2lvbiBpbmRleAorICogQHNtZV9jbWQ6IHBvaW50ZXIgdG8gc21lIGNvbW1hbmQgYmVpbmcgcHJlcGFyZWQKKyAqCisgKiBGdW5jdGlvbiB0byBwcmVwYXJlIGludGVybmFsIHNtZSBkaXNjb25uZWN0IGNvbW1hbmQKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MgZWxzZSBDREZfU1RBVFVTX0VfUkVTT1VSQ0VTIG9uIGZhaWx1cmUKKyAqLworCitDREZfU1RBVFVTIGNzcl9wcmVwYXJlX2Rpc2Nvbm5lY3RfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBtYWMsCisJCQl1aW50MzJfdCBzZXNzaW9uX2lkLCB0U21lQ21kICoqc21lX2NtZCkKK3sKKwl0U21lQ21kICpjb21tYW5kOworCisJY29tbWFuZCA9IGNzcl9nZXRfY29tbWFuZF9idWZmZXIobWFjKTsKKwlpZiAoIWNvbW1hbmQpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJmYWlsIHRvIGdldCBjb21tYW5kIGJ1ZmZlciIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfQorCisJY29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kUm9hbTsKKwljb21tYW5kLT5zZXNzaW9uSWQgPSAodWludDhfdClzZXNzaW9uX2lkOworCWNvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uID0gZUNzckZvcmNlZERpc2Fzc29jOworCisJKnNtZV9jbWQgPSBjb21tYW5kOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1faXNzdWVfZGlzYXNzb2NpYXRlX2NtZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgIGVDc3JSb2FtRGlzY29ubmVjdFJlYXNvbiByZWFzb24pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNtZUNtZCAqcENvbW1hbmQ7CisJYm9vbCBmSGlnaFByaW9yaXR5ID0gZmFsc2U7CisJZG8geworCQlwQ29tbWFuZCA9IGNzcl9nZXRfY29tbWFuZF9idWZmZXIocE1hYyk7CisJCWlmICghcENvbW1hbmQpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIGdldCBjb21tYW5kIGJ1ZmZlciIpKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJCQlicmVhazsKKwkJfQorCQkvKiBDaGFuZ2UgdGhlIHN1YnN0YXRlIGluIGNhc2UgaXQgaXMgd2FpdC1mb3Ita2V5ICovCisJCWlmIChDU1JfSVNfV0FJVF9GT1JfS0VZKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCWNzcl9yb2FtX3N0b3Bfd2FpdF9mb3Jfa2V5X3RpbWVyKHBNYWMpOworCQkJY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9OT05FLAorCQkJCQkJIHNlc3Npb25JZCk7CisJCX0KKwkJcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFJvYW07CisJCXBDb21tYW5kLT5zZXNzaW9uSWQgPSAodWludDhfdCkgc2Vzc2lvbklkOworCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQlGTCgiRGlzYXNzb2NpYXRlIHJlYXNvbjogJWQsIHNlc3Npb25JZDogJWQiKSwKKwkJCXJlYXNvbiwgc2Vzc2lvbklkKTsKKwkJc3dpdGNoIChyZWFzb24pIHsKKwkJY2FzZSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX01JQ19FUlJPUjoKKwkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9CisJCQkJZUNzckZvcmNlZERpc2Fzc29jTUlDRmFpbHVyZTsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fREVBVVRIOgorCQkJcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uID0gZUNzckZvcmNlZERlYXV0aDsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fSEFORE9GRjoKKwkJCWZIaWdoUHJpb3JpdHkgPSB0cnVlOworCQkJcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uID0KKwkJCQllQ3NyU21lSXNzdWVkRGlzYXNzb2NGb3JIYW5kb2ZmOworCQkJYnJlYWs7CisJCWNhc2UgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRDoKKwkJY2FzZSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0RJU0FTU09DOgorCQkJcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uID0gZUNzckZvcmNlZERpc2Fzc29jOworCQkJYnJlYWs7CisJCWNhc2UgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9JQlNTX0pPSU5fRkFJTFVSRToKKwkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9CisJCQkJZUNzclNtZUlzc3VlZElic3NKb2luRmFpbHVyZTsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fSUJTU19MRUFWRToKKwkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IGVDc3JGb3JjZWRJYnNzTGVhdmU7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1NUQV9IQVNfTEVGVDoKKwkJCXBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IGVDc3JGb3JjZWREaXNhc3NvYzsKKwkJCXBDb21tYW5kLT51LnJvYW1DbWQucmVhc29uID0KKwkJCQllU0lSX01BQ19ESVNBU1NPQ19MRUFWSU5HX0JTU19SRUFTT047CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgRkwKKwkJCQkJICAoIlNNRSBjb252ZXJ0IHRvIGludGVybmFsIHJlYXNvbiBjb2RlIGVDc3JTdGFIYXNMZWZ0IikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPSBjc3JfcXVldWVfc21lX2NvbW1hbmQocE1hYywgcENvbW1hbmQsIGZIaWdoUHJpb3JpdHkpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZCIpLCBzdGF0dXMpOworCQkJY3NyX3JlbGVhc2VfY29tbWFuZF9yb2FtKHBNYWMsIHBDb21tYW5kKTsKKwkJfQorCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1faXNzdWVfc3RvcF9ic3NfY21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgICAgYm9vbCBmSGlnaFByaW9yaXR5KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTbWVDbWQgKnBDb21tYW5kOworCXBDb21tYW5kID0gY3NyX2dldF9jb21tYW5kX2J1ZmZlcihwTWFjKTsKKwlpZiAoTlVMTCAhPSBwQ29tbWFuZCkgeworCQkvKiBDaGFuZ2UgdGhlIHN1YnN0YXRlIGluIGNhc2UgaXQgaXMgd2FpdC1mb3Ita2V5ICovCisJCWlmIChDU1JfSVNfV0FJVF9GT1JfS0VZKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCWNzcl9yb2FtX3N0b3Bfd2FpdF9mb3Jfa2V5X3RpbWVyKHBNYWMpOworCQkJY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9OT05FLAorCQkJCQkJIHNlc3Npb25JZCk7CisJCX0KKwkJcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFJvYW07CisJCXBDb21tYW5kLT5zZXNzaW9uSWQgPSAodWludDhfdCkgc2Vzc2lvbklkOworCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSBlQ3NyU3RvcEJzczsKKwkJc3RhdHVzID0gY3NyX3F1ZXVlX3NtZV9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCBmSGlnaFByaW9yaXR5KTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCIgZmFpbCB0byBzZW5kIG1lc3NhZ2Ugc3RhdHVzID0gJWQiKSwgc3RhdHVzKTsKKwkJCWNzcl9yZWxlYXNlX2NvbW1hbmRfcm9hbShwTWFjLCBwQ29tbWFuZCk7CisJCX0KKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXIiKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fZGlzY29ubmVjdF9pbnRlcm5hbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCWVDc3JSb2FtRGlzY29ubmVjdFJlYXNvbiByZWFzb24pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorCS8qIFN0b3AgdGhlIHJldHJ5ICovCisJcFNlc3Npb24tPm1heFJldHJ5Q291bnQgPSAwOworCWNzcl9yb2FtX3N0b3Bfam9pbl9yZXRyeV90aW1lcihwTWFjLCBzZXNzaW9uSWQpOworI2VuZGlmCisJLyogTm90IHRvIGNhbGwgY2FuY2VsIHJvYW1pbmcgaGVyZSAqLworCS8qIE9ubHkgaXNzdWUgZGlzY29ubmVjdCB3aGVuIG5lY2Vzc2FyeSAqLworCWlmIChjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWQocE1hYywgc2Vzc2lvbklkKQorCSAgICB8fCBjc3JfaXNfYnNzX3R5cGVfaWJzcyhwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5CU1NUeXBlKQorCSAgICB8fCBjc3JfaXNfYnNzX3R5cGVfd2RzKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGUpCisJICAgIHx8IGNzcl9pc19yb2FtX2NvbW1hbmRfd2FpdGluZ19mb3Jfc2Vzc2lvbihwTWFjLCBzZXNzaW9uSWQpKSB7CisJCXNtc19sb2cocE1hYywgTE9HMiwgRkwoImNhbGxlZCIpKTsKKwkJc3RhdHVzID0gY3NyX3JvYW1faXNzdWVfZGlzYXNzb2NpYXRlX2NtZChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJIHJlYXNvbik7CisJfSBlbHNlIHsKKwkJY3NyX3NjYW5fYWJvcnRfc2Nhbl9mb3Jfc3NpZChwTWFjLCBzZXNzaW9uSWQpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0NNRF9OT1RfUVVFVUVEOworCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQlGTAorCQkJKCIgRGlzY29ubmVjdCBjbWQgbm90IHF1ZXVlZCwgUm9hbSBjb21tYW5kIGlzIG5vdCBwcmVzZW50IgorCQkJIiByZXR1cm4gd2l0aCBzdGF0dXMgJWQiKSwgc3RhdHVzKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9kaXNjb25uZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCSAgICAgICBlQ3NyUm9hbURpc2Nvbm5lY3RSZWFzb24gcmVhc29uKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNzcl9yb2FtX2NhbmNlbF9yb2FtaW5nKHBNYWMsIHNlc3Npb25JZCk7CisJY3NyX3JvYW1fcmVtb3ZlX2R1cGxpY2F0ZV9jb21tYW5kKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwKKwkJCQkJICBlQ3NyRm9yY2VkRGlzYXNzb2MpOworCisJcmV0dXJuIGNzcl9yb2FtX2Rpc2Nvbm5lY3RfaW50ZXJuYWwocE1hYywgc2Vzc2lvbklkLCByZWFzb24pOworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX3NhdmVfY29ubmVjdGVkX2luZm9tYXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJCQkgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLAorCQkJCQkgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXREb3QxMWZCZWFjb25JRXMgKnBJZXNUZW1wID0gcEllczsKKwl1aW50OF90IGluZGV4OworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBOVUxMOworCXRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcENvbm5lY3RQcm9maWxlID0gTlVMTDsKKworCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJaWYgKE5VTEwgPT0gcFNlc3Npb24pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXBDb25uZWN0UHJvZmlsZSA9ICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJaWYgKHBTZXNzaW9uLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLmJSb2FtU3luY2hJblByb2dyZXNzKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJICBGTCgiY3NyX3JvYW1fc2F2ZV9jb25uZWN0ZWRfaW5mb21hdGlvbiIpKTsKKwl9CisjZW5kaWYKKwlpZiAocENvbm5lY3RQcm9maWxlLT5wQWRkSUVBc3NvYykgeworCQljZGZfbWVtX2ZyZWUocENvbm5lY3RQcm9maWxlLT5wQWRkSUVBc3NvYyk7CisJCXBDb25uZWN0UHJvZmlsZS0+cEFkZElFQXNzb2MgPSBOVUxMOworCX0KKwljZGZfbWVtX3NldCgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUsCisJCSAgICBzaXplb2YodENzclJvYW1Db25uZWN0ZWRQcm9maWxlKSwgMCk7CisJcENvbm5lY3RQcm9maWxlLT5BdXRoVHlwZSA9IHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGU7CisJcENvbm5lY3RQcm9maWxlLT5BdXRoSW5mbyA9IHBQcm9maWxlLT5BdXRoVHlwZTsKKwlwQ29ubmVjdFByb2ZpbGUtPkNCTW9kZSA9IHBQcm9maWxlLT5DQk1vZGU7ICAgICAvKiAqKiogdGhpcyBtYXkgbm90IGJlIHZhbGlkICovCisJcENvbm5lY3RQcm9maWxlLT5FbmNyeXB0aW9uVHlwZSA9IHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZTsKKwlwQ29ubmVjdFByb2ZpbGUtPkVuY3J5cHRpb25JbmZvID0gcFByb2ZpbGUtPkVuY3J5cHRpb25UeXBlOworCXBDb25uZWN0UHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZSA9CisJCXBQcm9maWxlLT5uZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZTsKKwlwQ29ubmVjdFByb2ZpbGUtPm1jRW5jcnlwdGlvbkluZm8gPSBwUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZTsKKwlwQ29ubmVjdFByb2ZpbGUtPkJTU1R5cGUgPSBwUHJvZmlsZS0+QlNTVHlwZTsKKwlwQ29ubmVjdFByb2ZpbGUtPm1vZGlmeVByb2ZpbGVGaWVsZHMudWFwc2RfbWFzayA9IHBQcm9maWxlLT51YXBzZF9tYXNrOworCXBDb25uZWN0UHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbCA9IHBTaXJCc3NEZXNjLT5jaGFubmVsSWQ7CisJcENvbm5lY3RQcm9maWxlLT5iZWFjb25JbnRlcnZhbCA9IHBTaXJCc3NEZXNjLT5iZWFjb25JbnRlcnZhbDsKKwlpZiAoIXBDb25uZWN0UHJvZmlsZS0+YmVhY29uSW50ZXJ2YWwpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiRVJST1I6IEJlYWNvbiBpbnRlcnZhbCBpcyBaRVJPIikpOworCX0KKwljZGZfbWVtX2NvcHkoJnBDb25uZWN0UHJvZmlsZS0+S2V5cywgJnBQcm9maWxlLT5LZXlzLCBzaXplb2YodENzcktleXMpKTsKKwkvKiBzYXZpbmcgdGhlIGFkZGlvbmFsIElFYHMgbGlrZSBIb3Qgc3BvdCBpbmRpY2F0aW9uIGVsZW1lbnQgYW5kIGV4dGVuZGVkIGNhcGFiaWxpdGllcyAqLworCWlmIChwUHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGgpIHsKKwkJcENvbm5lY3RQcm9maWxlLT5wQWRkSUVBc3NvYyA9CisJCQljZGZfbWVtX21hbGxvYyhwUHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGgpOworCQlpZiAoTlVMTCA9PSBwQ29ubmVjdFByb2ZpbGUtPnBBZGRJRUFzc29jKQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQllbHNlCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTAorCQkJCQkoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFkZGl0aW9uYWwgSUVzIikpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXBDb25uZWN0UHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGggPQorCQkJcFByb2ZpbGUtPm5BZGRJRUFzc29jTGVuZ3RoOworCQljZGZfbWVtX2NvcHkocENvbm5lY3RQcm9maWxlLT5wQWRkSUVBc3NvYywKKwkJCSAgICAgcFByb2ZpbGUtPnBBZGRJRUFzc29jLAorCQkJICAgICBwUHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGgpOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJcENvbm5lY3RQcm9maWxlLT5NRlBFbmFibGVkID0gcFByb2ZpbGUtPk1GUEVuYWJsZWQ7CisJcENvbm5lY3RQcm9maWxlLT5NRlBSZXF1aXJlZCA9IHBQcm9maWxlLT5NRlBSZXF1aXJlZDsKKwlwQ29ubmVjdFByb2ZpbGUtPk1GUENhcGFibGUgPSBwUHJvZmlsZS0+TUZQQ2FwYWJsZTsKKyNlbmRpZgorCS8qIFNhdmUgYnNzaWQgKi8KKwljc3JfZ2V0X2Jzc19pZF9ic3NfZGVzYyhwTWFjLCBwU2lyQnNzRGVzYywgJnBDb25uZWN0UHJvZmlsZS0+YnNzaWQpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJaWYgKHBTaXJCc3NEZXNjLT5tZGllUHJlc2VudCkgeworCQlwQ29ubmVjdFByb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQgPSAxOworCQlwQ29ubmVjdFByb2ZpbGUtPk1ESUQubW9iaWxpdHlEb21haW4gPQorCQkJKHBTaXJCc3NEZXNjLT5tZGllWzFdIDw8IDgpIHwgKHBTaXJCc3NEZXNjLT5tZGllWzBdKTsKKwl9CisjZW5kaWYKKwlpZiAoTlVMTCA9PSBwSWVzVGVtcCkgeworCQlzdGF0dXMgPQorCQkJY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcyhwTWFjLCBwU2lyQnNzRGVzYywKKwkJCQkJCQkgICAmcEllc1RlbXApOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJaWYgKChjc3JfaXNfcHJvZmlsZV9lc2UocFByb2ZpbGUpIHx8CisJICAgICAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgJiYgKHBJZXNUZW1wLT5FU0VWZXJzaW9uLnByZXNlbnQpCisJICAgICAgJiYgKHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0pKSkKKwkgICAgJiYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNFc2VJbmlGZWF0dXJlRW5hYmxlZCkpIHsKKwkJcENvbm5lY3RQcm9maWxlLT5pc0VTRUFzc29jID0gMTsKKwl9CisjZW5kaWYKKwkvKiBzYXZlIHNzaWQgKi8KKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKHBJZXNUZW1wLT5TU0lELnByZXNlbnQpIHsKKwkJCXBDb25uZWN0UHJvZmlsZS0+U1NJRC5sZW5ndGggPSBwSWVzVGVtcC0+U1NJRC5udW1fc3NpZDsKKwkJCWNkZl9tZW1fY29weShwQ29ubmVjdFByb2ZpbGUtPlNTSUQuc3NJZCwKKwkJCQkgICAgIHBJZXNUZW1wLT5TU0lELnNzaWQsCisJCQkJICAgICBwSWVzVGVtcC0+U1NJRC5udW1fc3NpZCk7CisJCX0KKwkJLyogU2F2ZSB0aGUgYnNzIGRlc2MgKi8KKwkJc3RhdHVzID0KKwkJCWNzcl9yb2FtX3NhdmVfY29ubmVjdGVkX2Jzc19kZXNjKHBNYWMsIHNlc3Npb25JZCwgcFNpckJzc0Rlc2MpOworCisJCWlmIChDU1JfSVNfUU9TX0JTUyhwSWVzVGVtcCkgfHwgcEllc1RlbXAtPkhUQ2Fwcy5wcmVzZW50KSB7CisJCQkvKiBTb21lIEhUIEFQJ3MgZG9udCBzZW5kIFdNTSBJRSBzbyBpbiB0aGF0IGNhc2Ugd2UgYXNzdW1lIGFsbCBIVCBBcCdzIGFyZSBRb3MgRW5hYmxlZCBBUCdzICovCisJCQlwQ29ubmVjdFByb2ZpbGUtPnFhcCA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlwQ29ubmVjdFByb2ZpbGUtPnFhcCA9IGZhbHNlOworCQl9CisKKwkJaWYgKHBJZXNUZW1wLT5FeHRDYXAucHJlc2VudCkgeworCQkJc3RydWN0IHNfZXh0X2NhcCAqcF9leHRfY2FwID0gKHN0cnVjdCBzX2V4dF9jYXAgKikKKwkJCQkJCQlwSWVzVGVtcC0+RXh0Q2FwLmJ5dGVzOworCQkJcENvbm5lY3RQcm9maWxlLT5wcm94eUFSUFNlcnZpY2UgPSBwX2V4dF9jYXAtPgorCQkJCQkJCSAgICBwcm94eV9hcnBfc2VydmljZTsKKwkJfQorCisJCWlmIChOVUxMID09IHBJZXMpIHsKKwkJCS8qIEZyZWUgbWVtb3J5IGlmIGl0IGFsbG9jYXRlZCBsb2NhbGx5ICovCisJCQljZGZfbWVtX2ZyZWUocEllc1RlbXApOworCQl9CisJfQorCS8qIFNhdmUgUW9zIGNvbm5lY3Rpb24gKi8KKwlwQ29ubmVjdFByb2ZpbGUtPnFvc0Nvbm5lY3Rpb24gPQorCQlwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uZldNTUNvbm5lY3Rpb247CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWNzcl9mcmVlX2Nvbm5lY3RfYnNzX2Rlc2MocE1hYywgc2Vzc2lvbklkKTsKKwl9CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcFByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHM7IGluZGV4KyspIHsKKwkJaWYgKChwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbaW5kZXhdLlNTSUQubGVuZ3RoID09CisJCSAgICAgcENvbm5lY3RQcm9maWxlLT5TU0lELmxlbmd0aCkKKwkJICAgICYmIGNkZl9tZW1fY29tcGFyZShwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbaW5kZXhdLlNTSUQuCisJCQkJICAgICAgIHNzSWQsIHBDb25uZWN0UHJvZmlsZS0+U1NJRC5zc0lkLAorCQkJCSAgICAgICBwQ29ubmVjdFByb2ZpbGUtPlNTSUQubGVuZ3RoKSkgeworCQkJcENvbm5lY3RQcm9maWxlLT5oYW5kb2ZmUGVybWl0dGVkID0KKwkJCQlwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbaW5kZXhdLmhhbmRvZmZQZXJtaXR0ZWQ7CisJCQlicmVhazsKKwkJfQorCQlwQ29ubmVjdFByb2ZpbGUtPmhhbmRvZmZQZXJtaXR0ZWQgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBib29sIGlzX2Rpc2Nvbm5lY3RfcGVuZGluZyh0cEFuaVNpckdsb2JhbCBwbWFjLAorCQkJCXVpbnQ4X3Qgc2Vzc2lvbmlkKQoreworCXRMaXN0RWxlbSAqZW50cnkgPSBOVUxMOworCXRMaXN0RWxlbSAqbmV4dF9lbnRyeSA9IE5VTEw7CisJdFNtZUNtZCAqY29tbWFuZCA9IE5VTEw7CisJYm9vbCBkaXNjb25uZWN0X2NtZF9leGlzdCA9IGZhbHNlOworCisJY3NyX2xsX2xvY2soJnBtYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCk7CisJZW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwbWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCXdoaWxlIChlbnRyeSkgeworCQluZXh0X2VudHJ5ID0gY3NyX2xsX25leHQoJnBtYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwKKwkJCQkJZW50cnksIExMX0FDQ0VTU19OT0xPQ0spOworCisJCWNvbW1hbmQgPSBHRVRfQkFTRV9BRERSKGVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJaWYgKGNvbW1hbmQgJiYgQ1NSX0lTX0RJU0NPTk5FQ1RfQ09NTUFORChjb21tYW5kKSAmJgorCQkJCWNvbW1hbmQtPnNlc3Npb25JZCA9PSBzZXNzaW9uaWQpeworCQkJZGlzY29ubmVjdF9jbWRfZXhpc3QgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwkJZW50cnkgPSBuZXh0X2VudHJ5OworCX0KKwljc3JfbGxfdW5sb2NrKCZwbWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QpOworCXJldHVybiBkaXNjb25uZWN0X2NtZF9leGlzdDsKK30KKworc3RhdGljIHZvaWQgY3NyX3JvYW1fam9pbl9yc3BfcHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXRTaXJTbWVKb2luUnNwICpwU21lSm9pblJzcCkKK3sKKwl0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisJdFNtZUNtZCAqcENvbW1hbmQgPSBOVUxMOworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbl9wdHI7CisKKwlpZiAocFNtZUpvaW5Sc3ApIHsKKwkJc2Vzc2lvbl9wdHIgPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgcFNtZUpvaW5Sc3AtPnNlc3Npb25JZCk7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoIlNtZSBKb2luIFJlc3BvbnNlIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisJaWYgKCFzZXNzaW9uX3B0cikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCUZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBwU21lSm9pblJzcC0+c2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKwkvKiBUaGUgaGVhZCBvZiB0aGUgYWN0aXZlIGxpc3QgaXMgdGhlIHJlcXVlc3Qgd2Ugc2VudCAqLworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKHBFbnRyeSkgeworCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwl9CisJaWYgKGVTSVJfU01FX1NVQ0NFU1MgPT0gcFNtZUpvaW5Sc3AtPnN0YXR1c0NvZGUpIHsKKwkJaWYgKHBDb21tYW5kCisJCSAgICAmJiBlQ3NyU21lSXNzdWVkQXNzb2NUb1NpbWlsYXJBUCA9PQorCQkgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uKSB7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCQkJc21lX3Fvc19jc3JfZXZlbnRfaW5kKHBNYWMsIHBTbWVKb2luUnNwLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgIFNNRV9RT1NfQ1NSX0hBTkRPRkZfQ09NUExFVEUsIE5VTEwpOworI2VuZGlmCisJCX0KKwkJLyogKgorCQkgKiBUaGUgam9pbiBic3NpZCBjb3VudCBjYW4gYmUgcmVzZXQgYXMgc29vbiBhcworCQkgKiB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBqb2luIHJlcXVlc3RzIGFuZCByZXR1cm5pbmcKKwkJICogdGhlIHJlc3BvbnNlIHRvIHVwcGVyIGxheWVycworCQkgKiAqLworCQlzZXNzaW9uX3B0ci0+am9pbl9ic3NpZF9jb3VudCA9IDA7CisJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsIGVDc3JKb2luU3VjY2VzcywgKHZvaWQgKilwU21lSm9pblJzcCk7CisJfSBlbHNlIHsKKwkJdWludDMyX3Qgcm9hbUlkID0gMDsKKwkJYm9vbCBpc19kaXNfcGVuZGluZzsKKworCQkvKiBUaGUgaGVhZCBvZiB0aGUgYWN0aXZlIGxpc3QgaXMgdGhlIHJlcXVlc3Qgd2Ugc2VudCAqLworCQkvKiBUcnkgdG8gZ2V0IGJhY2sgdGhlIHNhbWUgcHJvZmlsZSBhbmQgcm9hbSBhZ2FpbiAqLworCQlpZiAocENvbW1hbmQpIHsKKwkJCXJvYW1JZCA9IHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkOworCQl9CisJCXNlc3Npb25fcHRyLT5qb2luRmFpbFN0YXR1c0NvZGUuc3RhdHVzQ29kZSA9CisJCQlwU21lSm9pblJzcC0+c3RhdHVzQ29kZTsKKwkJc2Vzc2lvbl9wdHItPmpvaW5GYWlsU3RhdHVzQ29kZS5yZWFzb25Db2RlID0KKwkJCXBTbWVKb2luUnNwLT5wcm90U3RhdHVzQ29kZTsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJIlNtZUpvaW5SZXEgZmFpbGVkIHdpdGggc3RhdHVzQ29kZT0gMHglMDhYIFslZF0iLAorCQkJcFNtZUpvaW5Sc3AtPnN0YXR1c0NvZGUsIHBTbWVKb2luUnNwLT5zdGF0dXNDb2RlKTsKKyNpZiAgIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKwkJLyogSWYgSm9pbiBmYWlscyB3aGlsZSBIYW5kb2ZmIGlzIGluIHByb2dyZXNzLCBpbmRpY2F0ZSBkaXNhc3NvY2lhdGVkIGV2ZW50IHRvIHN1cHBsaWNhbnQgdG8gcmVjb25uZWN0ICovCisJCWlmIChjc3Jfcm9hbV9pc19oYW5kb2ZmX2luX3Byb2dyZXNzKHBNYWMsIHBTbWVKb2luUnNwLT5zZXNzaW9uSWQpKSB7CisJCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHBTbWVKb2luUnNwLT5zZXNzaW9uSWQsIE5VTEwsCisJCQkJCSAgICAgICByb2FtSWQsIGVDU1JfUk9BTV9ESVNBU1NPQ0lBVEVELAorCQkJCQkgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQpOworCQkJLyogU2hvdWxkIGluZGljYXRlIG5laWdoYm9yIHJvYW0gYWxnb3JpdGhtIGFib3V0IHRoZSBjb25uZWN0IGZhaWx1cmUgaGVyZSAqLworCQkJY3NyX25laWdoYm9yX3JvYW1faW5kaWNhdGVfY29ubmVjdChwTWFjLAorCQkJCQkJCSAgIHBTbWVKb2luUnNwLT5zZXNzaW9uSWQsCisJCQkJCQkJICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUpOworCQl9CisjZW5kaWYKKwkJLyoKKwkJICogaWYgdXNlcnNwYWNlIGhhcyBpc3N1ZWQgZGlzY29ubmVjdGlvbiwKKwkJICogZHJpdmVyIHNob3VsZCBub3QgY29udGludWUgY29ubmVjdGluZworCQkgKi8KKwkJaXNfZGlzX3BlbmRpbmcgPSBpc19kaXNjb25uZWN0X3BlbmRpbmcocE1hYywgc2Vzc2lvbl9wdHItPnNlc3Npb25JZCk7CisJCWlmIChwQ29tbWFuZCAmJiAoc2Vzc2lvbl9wdHItPmpvaW5fYnNzaWRfY291bnQgPAorCQkJCUNTUl9NQVhfQlNTSURfQ09VTlQpICYmICFpc19kaXNfcGVuZGluZykgeworCQkJaWYgKENTUl9JU19XRFNfU1RBKCZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlKSkgeworCQkJCXBDb21tYW5kLT51LnJvYW1DbWQuZlN0b3BXZHMgPSB0cnVlOworCQkJCXNlc3Npb25fcHRyLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGUgPQorCQkJCQllQ1NSX0JTU19UWVBFX1dEU19TVEE7CisJCQkJY3NyX3JvYW1fcmVpc3N1ZV9yb2FtX2NvbW1hbmQocE1hYyk7CisJCQl9IGVsc2UgaWYgKENTUl9JU19XRFMoJnBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUpKSB7CisJCQkJc2Vzc2lvbl9wdHItPmpvaW5fYnNzaWRfY291bnQgPSAwOworCQkJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJY3NyX3JvYW0ocE1hYywgcENvbW1hbmQpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJICogV2hlbiB0aGUgdXBwZXIgbGF5ZXJzIGlzc3VlIGEgY29ubmVjdCBjb21tYW5kLCB0aGVyZQorCQkJICogaXMgYSByb2FtIGNvbW1hbmQgd2l0aCByZWFzb24gZUNzckhkZElzc3VlZCB0aGF0CisJCQkgKiBnZXRzIGVucXVldWVkIGFuZCBhbiBhc3NvY2lhdGVkIHRpbWVyIGZvciB0aGUgU01FCisJCQkgKiBjb21tYW5kIHRpbWVvdXQgaXMgc3RhcnRlZCB3aGljaCBpcyBjdXJyZW50bHkgMTIwCisJCQkgKiBzZWNvbmRzLiBUaGlzIGNvbW1hbmQgd291bGQgYmUgZGVxdWV1ZWQgb25seSB1cG9uCisJCQkgKiBzdWNjZXNmdWxsIGNvbm5lY3Rpb25zLiBJbiBjYXNlIG9mIGpvaW4gZmFpbHVyZXMsIGlmCisJCQkgKiB0aGVyZSBhcmUgdG9vIG1hbnkgQlNTIGluIHRoZSBjYWNoZSwgYW5kIGlmIHdlIGZhaWwKKwkJCSAqIEpvaW4gcmVxdWVzdHMgd2l0aCBhbGwgb2YgdGhlbSwgdGhlcmUgaXMgYSBjaGFuY2Ugb2YKKwkJCSAqIHRpbWluZyBvdXQgdGhlIGFib3ZlIHRpbWVyLgorCQkJICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkJaWYgKHNlc3Npb25fcHRyLT5qb2luX2Jzc2lkX2NvdW50ID49CisJCQkJCUNTUl9NQVhfQlNTSURfQ09VTlQpCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTCgiRXhjZXNzaXZlIEpvaW4gUmVxIEZhaWx1cmVzIikpOworCisJCQlpZiAoaXNfZGlzX3BlbmRpbmcpCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQlDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCUZMKCJkaXNjb25uZWN0IGlzIHBlbmRpbmcsIGNvbXBsZXRlIHJvYW0iKSk7CisKKwkJCXNlc3Npb25fcHRyLT5qb2luX2Jzc2lkX2NvdW50ID0gMDsKKwkJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMKTsKKwkJfQorCX0gLyplbHNlOiAoIGVTSVJfU01FX1NVQ0NFU1MgPT0gcFNtZUpvaW5Sc3AtPnN0YXR1c0NvZGUgKSAqLworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX2lzc3VlX2pvaW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCQkgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCSAgICAgICB1aW50MzJfdCByb2FtSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJc21zX2xvZyhwTWFjLCBMT0cxLCAiQXR0ZW1wdGluZyB0byBKb2luIEJzc2lkPSAiIE1BQ19BRERSRVNTX1NUUiwKKwkJTUFDX0FERFJfQVJSQVkocFNpckJzc0Rlc2MtPmJzc0lkKSk7CisKKwkvKiBTZXQgdGhlIHJvYW1pbmcgc3Vic3RhdGUgdG8gJ2pvaW4gYXR0ZW1wdCcuLi4gKi8KKwljc3Jfcm9hbV9zdWJzdGF0ZV9jaGFuZ2UocE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5fUkVRLCBzZXNzaW9uSWQpOworCS8qIGF0dGVtcHQgdG8gSm9pbiB0aGlzIEJTUy4uLiAqLworCXN0YXR1cyA9CisJCWNzcl9zZW5kX2pvaW5fcmVxX21zZyhwTWFjLCBzZXNzaW9uSWQsIHBTaXJCc3NEZXNjLCBwUHJvZmlsZSwgcEllcywKKwkJCQkgICAgICBlV05JX1NNRV9KT0lOX1JFUSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIENERl9TVEFUVVMgY3NyX3JvYW1faXNzdWVfcmVhc3NvY2lhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJCQkJICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLAorCQkJCQkgICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUpCit7CisJY3NyX3JvYW1fc3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HLCBzZXNzaW9uSWQpOworCS8qIFNldCB0aGUgcm9hbWluZyBzdWJzdGF0ZSB0byAnam9pbiBhdHRlbXB0Jy4uLiAqLworCWNzcl9yb2FtX3N1YnN0YXRlX2NoYW5nZShwTWFjLCBlQ1NSX1JPQU1fU1VCU1RBVEVfUkVBU1NPQ19SRVEsIHNlc3Npb25JZCk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICBGTCgiIGNhbGxpbmcgY3NyX3NlbmRfam9pbl9yZXFfbXNnIChlV05JX1NNRV9SRUFTU09DX1JFUSkiKSk7CisJLyogYXR0ZW1wdCB0byBKb2luIHRoaXMgQlNTLi4uICovCisJcmV0dXJuIGNzcl9zZW5kX2pvaW5fcmVxX21zZyhwTWFjLCBzZXNzaW9uSWQsIHBTaXJCc3NEZXNjLCBwUHJvZmlsZSwgcEllcywKKwkJCQkgICAgIGVXTklfU01FX1JFQVNTT0NfUkVRKTsKK30KKwordm9pZCBjc3Jfcm9hbV9yZWlzc3VlX3JvYW1fY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRTbWVDbWQgKnBDb21tYW5kOworCXRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKwl1aW50MzJfdCBzZXNzaW9uSWQ7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKE5VTEwgPT0gcEVudHJ5KSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJEaXNhc3NvYyByc3AgY2FuJ3QgY29udGludWUsIG5vIGFjdGl2ZSBDTUQiKSk7CisJCXJldHVybjsKKwl9CisJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisJaWYgKGVTbWVDb21tYW5kUm9hbSAhPSBwQ29tbWFuZC0+Y29tbWFuZCkgeworCQlzbXNfbG9nKHBNYWMsIExPR1csIEZMKCJBY3RpdmUgY21kLCBpcyBub3QgYSByb2FtaW5nIENNRCIpKTsKKwkJcmV0dXJuOworCX0KKwlzZXNzaW9uSWQgPSBwQ29tbWFuZC0+c2Vzc2lvbklkOworCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXBDb21tYW5kLT51LnJvYW1DbWQuZlN0b3BXZHMpIHsKKwkJaWYgKHBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudCA+IDApIHsKKwkJCS8qCisJCQkgKiBiUmVmQXNzb2NTdGFydENudCB3YXMgaW5jcmVtZW50ZWQgaW4KKwkJCSAqIGNzcl9yb2FtX2pvaW5fbmV4dF9ic3Mgd2hlbiB0aGUgcm9hbSBjb21tYW5kIGlzc3VlZAorCQkJICogcHJldmlvdXNseS4gQXMgcGFydCBvZiByZWlzc3VpbmcgdGhlIHJvYW0gY29tbWFuZAorCQkJICogYWdhaW4gY3NyX3JvYW1fam9pbl9uZXh0X2JzcyBpcyBnb2luZyBpbmNyZW1lbnQKKwkJCSAqIFJlZkFzc29jU3RhcnRDbnQuIFNvIG1ha2Ugc3VyZSB0byBkZWNyZW1lbnQgdGhlCisJCQkgKiBiUmVmQXNzb2NTdGFydENudAorCQkJICovCisJCQlwU2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQtLTsKKwkJfQorCQlpZiAoZUNzclN0b3BSb2FtaW5nID09IGNzcl9yb2FtX2pvaW5fbmV4dF9ic3MocE1hYywgcENvbW1hbmQsCisJCQkJCQkJICAgICAgdHJ1ZSkpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQlGTCgiRmFpbGVkIHRvIHJlaXNzdWUgam9pbiBjb21tYW5kIikpOworCQkJY3NyX3JvYW1fY29tcGxldGUocE1hYywgZUNzck5vdGhpbmdUb0pvaW4sIE5VTEwpOworCQl9CisJCXJldHVybjsKKwl9CisJY2RmX21lbV9zZXQoJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSwgMCk7CisJcm9hbUluZm8ucEJzc0Rlc2MgPSBwQ29tbWFuZC0+dS5yb2FtQ21kLnBMYXN0Um9hbUJzczsKKwlyb2FtSW5mby5zdGF0dXNDb2RlID0gcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5zdGF0dXNDb2RlOworCXJvYW1JbmZvLnJlYXNvbkNvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisJaWYgKENTUl9JU19XRFMoJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKSkgeworCQlwU2Vzc2lvbi0+Y29ubmVjdFN0YXRlID0gZUNTUl9BU1NPQ19TVEFURV9UWVBFX1dEU19ESVNDT05ORUNURUQ7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sCisJCQkJICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLAorCQkJCSAgICAgICBlQ1NSX1JPQU1fV0RTX0lORCwKKwkJCQkgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9XRFNfRElTQVNTT0NJQVRFRCk7CisJfSBlbHNlIGlmIChDU1JfSVNfSU5GUkFfQVAoJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKSkgeworCQlwU2Vzc2lvbi0+Y29ubmVjdFN0YXRlID0KKwkJCWVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JTkZSQV9ESVNDT05ORUNURUQ7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sCisJCQkJICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLAorCQkJCSAgICAgICBlQ1NSX1JPQU1fSU5GUkFfSU5ELAorCQkJCSAgICAgICBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0RJU0FTU09DSUFURUQpOworCX0KKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9yb2FtX2lzc3VlX3N0b3BfYnNzKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJZUNTUl9ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUSkpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gcmVpc3N1ZSBzdG9wX2JzcyBjb21tYW5kIGZvciBXRFMiKSk7CisJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMKTsKKwl9Cit9CisKK2Jvb2wgY3NyX2lzX3JvYW1fY29tbWFuZF93YWl0aW5nX2Zvcl9zZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlib29sIGZSZXQgPSBmYWxzZTsKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwl0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisJLyogYWx3YXN5IGxvY2sgYWN0aXZlIGxpc3QgYmVmb3JlIGxvY2tpbmcgcGVuZGluZyBsaXN0ICovCisJY3NyX2xsX2xvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisJaWYgKHBFbnRyeSkgeworCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJaWYgKChlU21lQ29tbWFuZFJvYW0gPT0gcENvbW1hbmQtPmNvbW1hbmQpCisJCSAgICAmJiAoc2Vzc2lvbklkID09IHBDb21tYW5kLT5zZXNzaW9uSWQpKSB7CisJCQlmUmV0ID0gdHJ1ZTsKKwkJfQorCX0KKwlpZiAoZmFsc2UgPT0gZlJldCkgeworCQljc3JfbGxfbG9jaygmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0KTsKKwkJcEVudHJ5ID0KKwkJCWNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwKKwkJCQkJIExMX0FDQ0VTU19OT0xPQ0spOworCQl3aGlsZSAocEVudHJ5KSB7CisJCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJCWlmICgoZVNtZUNvbW1hbmRSb2FtID09IHBDb21tYW5kLT5jb21tYW5kKQorCQkJICAgICYmIChzZXNzaW9uSWQgPT0gcENvbW1hbmQtPnNlc3Npb25JZCkpIHsKKwkJCQlmUmV0ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBFbnRyeSA9CisJCQkJY3NyX2xsX25leHQoJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwgcEVudHJ5LAorCQkJCQkgICAgTExfQUNDRVNTX05PTE9DSyk7CisJCX0KKwkJY3NyX2xsX3VubG9jaygmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0KTsKKwl9CisJaWYgKGZhbHNlID09IGZSZXQpIHsKKwkJY3NyX2xsX2xvY2soJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0KTsKKwkJcEVudHJ5ID0KKwkJCWNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0LAorCQkJCQkgTExfQUNDRVNTX05PTE9DSyk7CisJCXdoaWxlIChwRW50cnkpIHsKKwkJCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCQkJaWYgKChlU21lQ29tbWFuZFJvYW0gPT0gcENvbW1hbmQtPmNvbW1hbmQpCisJCQkgICAgJiYgKHNlc3Npb25JZCA9PSBwQ29tbWFuZC0+c2Vzc2lvbklkKSkgeworCQkJCWZSZXQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQkJcEVudHJ5ID0KKwkJCQljc3JfbGxfbmV4dCgmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QsIHBFbnRyeSwKKwkJCQkJICAgIExMX0FDQ0VTU19OT0xPQ0spOworCQl9CisJCWNzcl9sbF91bmxvY2soJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0KTsKKwl9CisJY3NyX2xsX3VubG9jaygmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QpOworCXJldHVybiBmUmV0OworfQorCitib29sIGNzcl9pc19yb2FtX2NvbW1hbmRfd2FpdGluZyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCWJvb2wgZlJldCA9IGZhbHNlOworCXVpbnQzMl90IGk7CisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJZlJldCA9IGNzcl9pc19yb2FtX2NvbW1hbmRfd2FpdGluZ19mb3Jfc2Vzc2lvbihwTWFjLCBpKTsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIGkpCisJCSAgICAmJiAoZlJldCkpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBmUmV0OworfQorCitib29sIGNzcl9pc19jb21tYW5kX3dhaXRpbmcodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlib29sIGZSZXQgPSBmYWxzZTsKKwkvKiBhbHdhc3kgbG9jayBhY3RpdmUgbGlzdCBiZWZvcmUgbG9ja2luZyBwZW5kaW5nIGxpc3QgKi8KKwljc3JfbGxfbG9jaygmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QpOworCWZSZXQgPSBjc3JfbGxfaXNfbGlzdF9lbXB0eSgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCWlmIChmYWxzZSA9PSBmUmV0KSB7CisJCWZSZXQgPQorCQkJY3NyX2xsX2lzX2xpc3RfZW1wdHkoJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwKKwkJCQkJICAgICBMTF9BQ0NFU1NfTE9DSyk7CisJfQorCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwlyZXR1cm4gZlJldDsKK30KKworYm9vbCBjc3JfaXNfc2Nhbl9mb3Jfcm9hbV9jb21tYW5kX2FjdGl2ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCWJvb2wgZlJldCA9IGZhbHNlOworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRDc3JDbWQgKnBDb21tYW5kOworCS8qIGFsd2FzeSBsb2NrIGFjdGl2ZSBsaXN0IGJlZm9yZSBsb2NraW5nIHBlbmRpbmcgbGlzdCAqLworCWNzcl9sbF9sb2NrKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCk7CisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCWlmIChwRW50cnkpIHsKKwkJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzckNtZCwgTGluayk7CisJCWlmICgoZUNzclJvYW1Db21tYW5kU2NhbiA9PSBwQ29tbWFuZC0+Y29tbWFuZCkgJiYKKwkJICAgICgoZUNzclNjYW5Gb3JTc2lkID09IHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uKSB8fAorCQkgICAgIChlQ3NyU2NhblAyUEZpbmRQZWVyID09IHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uKSkpIHsKKwkJCWZSZXQgPSB0cnVlOworCQl9CisJfQorCWNzcl9sbF91bmxvY2soJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKwlyZXR1cm4gZlJldDsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9pc3N1ZV9yZWFzc29jaWF0ZV9jbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKwlib29sIGZIaWdoUHJpb3JpdHkgPSB0cnVlOworCWJvb2wgZlJlbW92ZUNtZCA9IGZhbHNlOworCXRMaXN0RWxlbSAqcEVudHJ5OworCS8qIERlbGV0ZSB0aGUgb2xkIGFzc29jIGNvbW1hbmQuIEFsbCBpcyBzZXR1cCBmb3IgcmVhc3NvYyB0byBiZSBzZXJpYWxpemVkICovCisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKwlpZiAocEVudHJ5KSB7CisJCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCQlpZiAoIXBDb21tYW5kKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXIiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwkJfQorCQlpZiAoZVNtZUNvbW1hbmRSb2FtID09IHBDb21tYW5kLT5jb21tYW5kKSB7CisJCQlpZiAocENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uID09CisJCQkgICAgZUNzclNtZUlzc3VlZEFzc29jVG9TaW1pbGFyQVApIHsKKwkJCQlmUmVtb3ZlQ21kID0KKwkJCQkJY3NyX2xsX3JlbW92ZV9lbnRyeSgmcE1hYy0+c21lLgorCQkJCQkJCSAgICBzbWVDbWRBY3RpdmVMaXN0LCBwRW50cnksCisJCQkJCQkJICAgIExMX0FDQ0VTU19MT0NLKTsKKwkJCX0gZWxzZSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTAorCQkJCQkJKCIgVW5leHBlY3RlZCBhY3RpdmUgcm9hbSBjb21tYW5kIHByZXNlbnQgIikpOworCQkJfQorCQkJaWYgKGZSZW1vdmVDbWQgPT0gZmFsc2UpIHsKKwkJCQkvKiBJbXBsaWVzIHdlIGRpZCBub3QgZ2V0IHRoZSBzZXJpYWxpemVkIGFzc29jIGNvbW1hbmQgd2UgKi8KKwkJCQkvKiB3ZXJlIGV4cGVjdGluZyAqLworCQkJCXBDb21tYW5kID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoTlVMTCA9PSBwQ29tbWFuZCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkJCSgiIGZhaWwgdG8gZ2V0IGNvbW1hbmQgYnVmZmVyIGFzIGV4cGVjdGVkIGJhc2VkIG9uIHByZXZpb3VzIGNvbm5lY3Qgcm9hbSBjb21tYW5kIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwl9CisJZG8geworCQkvKiBDaGFuZ2UgdGhlIHN1YnN0YXRlIGluIGNhc2UgaXQgaXMgd2FpdC1mb3Ita2V5ICovCisJCWlmIChDU1JfSVNfV0FJVF9GT1JfS0VZKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCWNzcl9yb2FtX3N0b3Bfd2FpdF9mb3Jfa2V5X3RpbWVyKHBNYWMpOworCQkJY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9OT05FLAorCQkJCQkJIHNlc3Npb25JZCk7CisJCX0KKwkJcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFJvYW07CisJCXBDb21tYW5kLT5zZXNzaW9uSWQgPSAodWludDhfdCkgc2Vzc2lvbklkOworCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSBlQ3NyU21lSXNzdWVkRlRSZWFzc29jOworCQlzdGF0dXMgPSBjc3JfcXVldWVfc21lX2NvbW1hbmQocE1hYywgcENvbW1hbmQsIGZIaWdoUHJpb3JpdHkpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZCIpLCBzdGF0dXMpOworCQkJY3NyX3JlbGVhc2VfY29tbWFuZF9yb2FtKHBNYWMsIHBDb21tYW5kKTsKKwkJfQorCX0gd2hpbGUgKDApOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQKK2Nzcl9yb2FtaW5nX3N0YXRlX2NvbmZpZ19jbmZfcHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJICAgICAgIHVpbnQzMl90IHJlc3VsdCkKK3sKKwl0TGlzdEVsZW0gKmVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmbWFjX2N0eC0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQkJCSAgICAgTExfQUNDRVNTX0xPQ0spOworCXRDc3JTY2FuUmVzdWx0ICpzY2FuX3Jlc3VsdCA9IE5VTEw7CisJdFNpckJzc0Rlc2NyaXB0aW9uICpic3NfZGVzYyA9IE5VTEw7CisJdFNtZUNtZCAqY21kID0gTlVMTDsKKwl1aW50MzJfdCBzZXNzaW9uX2lkOworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbjsKKwl0RG90MTFmQmVhY29uSUVzICpsb2NhbF9pZXMgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAoTlVMTCA9PSBlbnRyeSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJDRkdfQ05GIHdpdGggYWN0aXZlIGxpc3QgZW1wdHkiKSk7CisJCXJldHVybjsKKwl9CisJY21kID0gR0VUX0JBU0VfQUREUihlbnRyeSwgdFNtZUNtZCwgTGluayk7CisJc2Vzc2lvbl9pZCA9IGNtZC0+c2Vzc2lvbklkOworCXNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisKKwlpZiAoIXNlc3Npb24pIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQiKSwgc2Vzc2lvbl9pZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoQ1NSX0lTX1JPQU1JTkcoc2Vzc2lvbikgJiYgc2Vzc2lvbi0+ZkNhbmNlbFJvYW1pbmcpIHsKKwkJLyogdGhlIHJvYW1pbmcgaXMgY2FuY2VsbGVkLiBTaW1wbHkgY29tcGxldGUgdGhlIGNvbW1hbmQgKi8KKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiUm9hbSBjb21tYW5kIGNhbmNlbGVkIikpOworCQljc3Jfcm9hbV9jb21wbGV0ZShtYWNfY3R4LCBlQ3NyTm90aGluZ1RvSm9pbiwgTlVMTCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiB0aGUgcm9hbWluZyBoYXMgc3RvcHBlZCwgbm90IHRvIGNvbnRpbnVlIHRoZSByb2FtaW5nIGNvbW1hbmQgKi8KKwlpZiAoIUNTUl9JU19ST0FNSU5HKHNlc3Npb24pICYmIENTUl9JU19ST0FNSU5HX0NPTU1BTkQoY21kKSkgeworCQkvKiBObyBuZWVkIHRvIGNvbXBsZXRlIHJvYW1pbmcgaGVyZSBhcyBpdCBhbHJlYWR5IGNvbXBsZXRlcyAqLworCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiUm9hbSBjbWQgKHJlYXNvbiAlZCkgYWJvcnRlZChyb2FtaW5nIGNvbXBsZXRlZCkiKSwKKwkJCWNtZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pOworCQljc3Jfc2V0X2Fib3J0X3JvYW1pbmdfY29tbWFuZChtYWNfY3R4LCBjbWQpOworCQljc3Jfcm9hbV9jb21wbGV0ZShtYWNfY3R4LCBlQ3NyTm90aGluZ1RvSm9pbiwgTlVMTCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIUlTX1NJUl9TVEFUVVNfU1VDQ0VTUyhyZXN1bHQpKSB7CisJCS8qCisJCSAqIEluIHRoZSBldmVudCB0aGUgY29uZmlndXJhdGlvbiBmYWlsZWQsIGZvciBpbmZyYSBsZXQgdGhlIHJvYW0KKwkJICogcHJvY2Vzc29yIGF0dGVtcHQgdG8gam9pbiBzb21ldGhpbmcgZWxzZS4uLgorCQkgKi8KKwkJaWYgKGNtZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnkKKwkJICAgICYmIENTUl9JU19JTkZSQVNUUlVDVFVSRSgmY21kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUpKSB7CisJCQljc3Jfcm9hbShtYWNfY3R4LCBjbWQpOworCQl9IGVsc2UgeworCQkJLyogV2UgbmVlZCB0byBjb21wbGV0ZSB0aGUgY29tbWFuZCAqLworCQkJaWYgKGNzcl9pc19ic3NfdHlwZV9pYnNzCisJCQkJICAgIChjbWQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS5CU1NUeXBlKSkgeworCQkJCWNzcl9yb2FtX2NvbXBsZXRlKG1hY19jdHgsIGVDc3JTdGFydEJzc0ZhaWx1cmUsCisJCQkJCQkgIE5VTEwpOworCQkJfSBlbHNlIHsKKwkJCQljc3Jfcm9hbV9jb21wbGV0ZShtYWNfY3R4LCBlQ3NyTm90aGluZ1RvSm9pbiwKKwkJCQkJCSAgTlVMTCk7CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIHdlIGhhdmUgYWN0aXZlIGVudHJ5ICovCisJc21zX2xvZyhtYWNfY3R4LCBMT0cyLCAiQ2ZnIHNlcXVlbmNlIGNvbXBsZXRlIik7CisJLyoKKwkgKiBTdWNjZXNzZnVsbHkgc2V0IHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBuZXcgQnNzLgorCSAqIEF0dGVtcHQgdG8gam9pbiB0aGUgcm9hbWluZyBCc3MKKwkgKi8KKwlpZiAoY21kLT51LnJvYW1DbWQucFJvYW1Cc3NFbnRyeSkgeworCQlzY2FuX3Jlc3VsdCA9IEdFVF9CQVNFX0FERFIoY21kLT51LnJvYW1DbWQucFJvYW1Cc3NFbnRyeSwKKwkJCQkJICAgIHRDc3JTY2FuUmVzdWx0LAorCQkJCQkgICAgTGluayk7CisJCWJzc19kZXNjID0gJnNjYW5fcmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvcjsKKwl9CisJaWYgKGNzcl9pc19ic3NfdHlwZV9pYnNzKGNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLkJTU1R5cGUpCisJICAgIHx8IENTUl9JU19XRFMoJmNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlKQorCSAgICB8fCBDU1JfSVNfSU5GUkFfQVAoJmNtZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlKSkgeworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjc3Jfcm9hbV9pc3N1ZV9zdGFydF9ic3MobWFjX2N0eCwKKwkJCQkJCXNlc3Npb25faWQsICZzZXNzaW9uLT5ic3NQYXJhbXMsCisJCQkJCQkmY21kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUsCisJCQkJCQlic3NfZGVzYywKKwkJCQkJCWNtZC0+dS5yb2FtQ21kLnJvYW1JZCkpKSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJDU1Igc3RhcnQgQlNTIGZhaWxlZCIpKTsKKwkJCS8qIFdlIG5lZWQgdG8gY29tcGxldGUgdGhlIGNvbW1hbmQgKi8KKwkJCWNzcl9yb2FtX2NvbXBsZXRlKG1hY19jdHgsIGVDc3JTdGFydEJzc0ZhaWx1cmUsIE5VTEwpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWNtZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnkpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgicFJvYW1Cc3NFbnRyeSBpcyBOVUxMIikpOworCQkvKiBXZSBuZWVkIHRvIGNvbXBsZXRlIHRoZSBjb21tYW5kICovCisJCWNzcl9yb2FtX2NvbXBsZXRlKG1hY19jdHgsIGVDc3JKb2luRmFpbHVyZSwgTlVMTCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTlVMTCA9PSBzY2FuX3Jlc3VsdCkgeworCQkvKiBJZiB3ZSBhcmUgcm9hbWluZyBUTyBhbiBJbmZyYXN0cnVjdHVyZSBCU1MuLi4gKi8KKwkJQ0RGX0FTU0VSVChzY2FuX3Jlc3VsdCAhPSBOVUxMKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghY3NyX2lzX2luZnJhX2Jzc19kZXNjKGJzc19kZXNjKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiZm91bmQgQlNTVHlwZSBtaXNtYXRjaGluZyB0aGUgb25lIGluIEJTUyBkZXNjcCIpKTsKKwkJcmV0dXJuOworCX0KKworCWxvY2FsX2llcyA9ICh0RG90MTFmQmVhY29uSUVzICopIHNjYW5fcmVzdWx0LT5SZXN1bHQucHZJZXM7CisJaWYgKCFsb2NhbF9pZXMpIHsKKwkJc3RhdHVzID0gY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcyhtYWNfY3R4LCBic3NfZGVzYywKKwkJCQkJCQkgICAgJmxvY2FsX2llcyk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQlyZXR1cm47CisJfQorCisJaWYgKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYShtYWNfY3R4LCBzZXNzaW9uX2lkKSkgeworCQlpZiAoY3NyX2lzX3NzaWRfZXF1YWwobWFjX2N0eCwgc2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLAorCQkJCSAgICAgIGJzc19kZXNjLCBsb2NhbF9pZXMpKSB7CisJCQljbWQtPnUucm9hbUNtZC5mUmVhc3NvYyA9IHRydWU7CisJCQljc3Jfcm9hbV9pc3N1ZV9yZWFzc29jaWF0ZShtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQkJCQkJICAgYnNzX2Rlc2MsIGxvY2FsX2llcywKKwkJCQkJCSAgICZjbWQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogb3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGlzc3VlIGEgbmV3IEpvaW4gcmVxdWVzdCB0byBMSU0KKwkJCSAqIGJlY2F1c2Ugd2UgZGlzYXNzb2NpYXRlZCBmcm9tIHRoZSBwcmV2aW91c2x5CisJCQkgKiBhc3NvY2lhdGVkIEFQLgorCQkJICovCisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9pc3N1ZV9qb2luKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJCWJzc19kZXNjLCBsb2NhbF9pZXMsCisJCQkJCSZjbWQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSwKKwkJCQkJY21kLT51LnJvYW1DbWQucm9hbUlkKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQkvKiB0cnkgc29tZXRoaW5nIGVsc2UgKi8KKwkJCQljc3Jfcm9hbShtYWNfY3R4LCBjbWQpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGNvbWUgd2l0aCBvdGhlciB3YXkgdG8gZmlndXJlIG91dCB0aGF0IHRoaXMgaXMKKwkJICogYmVjYXVzZSBvZiBITyBpbiBCTVAgVGhlIGJlbG93IEFQSSB3aWxsIGJlIG9ubHkgYXZhaWxhYmxlIGZvcgorCQkgKiBBbmRyb2lkIGFzIGl0IHVzZXMgYSBkaWZmZXJlbnQgSE8gYWxnb3JpdGhtLiBSZWFzc29jIHJlcXVlc3QKKwkJICogd2lsbCBiZSB1c2VkIG9ubHkgZm9yIEVTRSBhbmQgMTFyIGhhbmRvZmYgd2hlcmVhcyBvdGhlcgorCQkgKiBsZWdhY3kgcm9hbWluZyBzaG91bGQgdXNlIGpvaW4gcmVxdWVzdAorCQkgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQlpZiAoY3NyX3JvYW1faXNfaGFuZG9mZl9pbl9wcm9ncmVzcyhtYWNfY3R4LCBzZXNzaW9uX2lkKQorCQkgICAgJiYgY3NyX3JvYW1faXMxMXJfYXNzb2MobWFjX2N0eCwgc2Vzc2lvbl9pZCkpIHsKKwkJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX3JlYXNzb2NpYXRlKG1hY19jdHgsCisJCQkJCXNlc3Npb25faWQsIGJzc19kZXNjLAorCQkJCQkodERvdDExZkJlYWNvbklFcyAqKQorCQkJCQkoc2Nhbl9yZXN1bHQtPlJlc3VsdC5wdkllcyksCisJCQkJCSZjbWQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSk7CisJCX0gZWxzZQorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQlpZiAoY3NyX3JvYW1faXNfaGFuZG9mZl9pbl9wcm9ncmVzcyhtYWNfY3R4LCBzZXNzaW9uX2lkKQorCQkgICAmJiBjc3Jfcm9hbV9pc19lc2VfYXNzb2MobWFjX2N0eCwgc2Vzc2lvbl9pZCkpIHsKKwkJCS8qIE5vdyBzZXJpYWxpemUgdGhlIHJlYXNzb2MgY29tbWFuZC4gKi8KKwkJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX3JlYXNzb2NpYXRlX2NtZChtYWNfY3R4LAorCQkJCQkJCQlzZXNzaW9uX2lkKTsKKwkJfSBlbHNlCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJCWlmIChjc3Jfcm9hbV9pc19oYW5kb2ZmX2luX3Byb2dyZXNzKG1hY19jdHgsIHNlc3Npb25faWQpCisJCSAgICYmIGNzcl9yb2FtX2lzX2Zhc3Rfcm9hbV9lbmFibGVkKG1hY19jdHgsIHNlc3Npb25faWQpKSB7CisJCQkvKiBOb3cgc2VyaWFsaXplIHRoZSByZWFzc29jIGNvbW1hbmQuICovCisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9pc3N1ZV9yZWFzc29jaWF0ZV9jbWQobWFjX2N0eCwKKwkJCQkJCQkJc2Vzc2lvbl9pZCk7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJLyoKKwkJICogZWxzZSB3ZSBhcmUgbm90IGNvbm5lY3RlZCBhbmQgYXR0ZW1wdGluZyB0byBKb2luLiBJc3N1ZSB0aGUKKwkJICogSm9pbiByZXF1ZXN0LgorCQkgKi8KKwkJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX2pvaW4obWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCQkJCSAgICBic3NfZGVzYywKKwkJCQkJCSAgICAodERvdDExZkJlYWNvbklFcyAqKQorCQkJCQkJICAgIChzY2FuX3Jlc3VsdC0+UmVzdWx0LnB2SWVzKSwKKwkJCQkJCSAgICAmY21kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUsCisJCQkJCQkgICAgY21kLT51LnJvYW1DbWQucm9hbUlkKTsKKwkJfQorCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkvKiB0cnkgc29tZXRoaW5nIGVsc2UgKi8KKwkJCWNzcl9yb2FtKG1hY19jdHgsIGNtZCk7CisJCX0KKwl9CisJaWYgKCFzY2FuX3Jlc3VsdC0+UmVzdWx0LnB2SWVzKSB7CisJCS8qIExvY2FsbHkgYWxsb2NhdGVkICovCisJCWNkZl9tZW1fZnJlZShsb2NhbF9pZXMpOworCX0KK30KKworc3RhdGljIHZvaWQgY3NyX3JvYW1fcm9hbWluZ19zdGF0ZV9yZWFzc29jX3JzcF9wcm9jZXNzb3IodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCQkgdHBTaXJTbWVKb2luUnNwIHBTbWVKb2luUnNwKQoreworCWVDc3JSb2FtQ29tcGxldGVSZXN1bHQgcmVzdWx0OworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3BTbWVKb2luUnNwLT5zZXNzaW9uSWRdOworCXRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKwl1aW50MzJfdCByb2FtSWQgPSAwOworCisJaWYgKGVTSVJfU01FX1NVQ0NFU1MgPT0gcFNtZUpvaW5Sc3AtPnN0YXR1c0NvZGUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkgIEZMKCJDU1IgU21lUmVhc3NvY1JlcSBTdWNjZXNzZnVsIikpOworCQlyZXN1bHQgPSBlQ3NyUmVhc3NvY1N1Y2Nlc3M7CisJCS8qIERlZmVhdHVyaXplIHRoaXMgcGFydCBsYXRlciBpZiBuZWVkZWQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworCQkvKiBTaW5jZSB0aGUgbmVpZ2hib3Igcm9hbSBhbGdvcml0aG0gdXNlcyByZWFzc29jIHJlcSBmb3IgaGFuZG9mZiBpbnN0ZWFkIG9mIGpvaW4sCisJCSAqIHdlIG5lZWQgdGhlIHJlc3BvbnNlIGNvbnRlbnRzIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJlc3VsdCBpbiBjc3Jfcm9hbV9wcm9jZXNzX3Jlc3VsdHMoKSAqLworCQlpZiAoY3NyX3JvYW1faXNfaGFuZG9mZl9pbl9wcm9ncmVzcyhwTWFjLCBwU21lSm9pblJzcC0+c2Vzc2lvbklkKSkgeworCQkJLyogTmVlZCB0byBkaWcgbW9yZSBvbiBpbmRpY2F0aW5nIGV2ZW50cyB0byBTTUUgUW9TIG1vZHVsZSAqLworCQkJc21lX3Fvc19jc3JfZXZlbnRfaW5kKHBNYWMsIHBTbWVKb2luUnNwLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgIFNNRV9RT1NfQ1NSX0hBTkRPRkZfQ09NUExFVEUsIE5VTEwpOworCQkJY3NyX3JvYW1fY29tcGxldGUocE1hYywgcmVzdWx0LCBwU21lSm9pblJzcCk7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsIHJlc3VsdCwgTlVMTCk7CisJCX0KKwl9CisJLyogU2hvdWxkIHdlIGhhbmRsZSB0aGlzIHNpbWlsYXIgdG8gaGFuZGxpbmcgdGhlIGpvaW4gZmFpbHVyZT8gSXMgaXQgb2sKKwkgKiB0byBjYWxsIGNzcl9yb2FtX2NvbXBsZXRlKCkgd2l0aCBzdGF0ZSBhcyBDc3JKb2luRmFpbHVyZSAqLworCWVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkiQ1NSIFNtZVJlYXNzb2NSZXEgZmFpbGVkIHdpdGggc3RhdHVzQ29kZT0gMHglMDhYIFslZF0iLAorCQkJcFNtZUpvaW5Sc3AtPnN0YXR1c0NvZGUsIHBTbWVKb2luUnNwLT5zdGF0dXNDb2RlKTsKKwkJcmVzdWx0ID0gZUNzclJlYXNzb2NGYWlsdXJlOworI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgXAorCQlkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJCWlmICgoZVNJUl9TTUVfRlRfUkVBU1NPQ19USU1FT1VUX0ZBSUxVUkUgPT0KKwkJICAgICBwU21lSm9pblJzcC0+c3RhdHVzQ29kZSkKKwkJICAgIHx8IChlU0lSX1NNRV9GVF9SRUFTU09DX0ZBSUxVUkUgPT0KKwkJCXBTbWVKb2luUnNwLT5zdGF0dXNDb2RlKQorCQkgICAgfHwgKGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUyA9PQorCQkJcFNtZUpvaW5Sc3AtPnN0YXR1c0NvZGUpKSB7CisJCQkvKiBJbmZvcm0gSEREIHRvIHR1cm4gb2ZmIEZUIGZsYWcgaW4gSEREICovCisJCQlpZiAocE5laWdoYm9yUm9hbUluZm8pIHsKKwkJCQljZGZfbWVtX3plcm8oJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisJCQkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLAorCQkJCQkJICAgICAgIHBTbWVKb2luUnNwLT5zZXNzaW9uSWQsCisJCQkJCQkgICAgICAgJnJvYW1JbmZvLCByb2FtSWQsCisJCQkJCQkgICAgICAgZUNTUl9ST0FNX0ZUX1JFQVNTT0NfRkFJTEVELAorCQkJCQkJICAgICAgIGVTSVJfU01FX1NVQ0NFU1MpOworCQkJCS8qCisJCQkJICogU2luY2UgdGhlIGFib3ZlIGNhbGxiYWNrIHNlbmRzIGEgZGlzY29ubmVjdAorCQkJCSAqIHRvIEhERCwgd2Ugc2hvdWxkIGNsZWFuLXVwIG91ciBzdGF0ZQorCQkJCSAqIG1hY2hpbmUgYXMgd2VsbCB0byBiZSBpbiBzeW5jIHdpdGggdGhlIHVwcGVyCisJCQkJICogbGF5ZXJzLiBUaGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgYSBkaXNhc3NvYworCQkJCSAqIHNpbmNlOiAxKSB3ZSB3aWxsIG5ldmVyIHJlYXNzb2MgdG8gdGhlIGN1cnJlbnQKKwkJCQkgKiBBUCBpbiBMRlIsIGFuZCAyKSB0aGVyZSBpcyBubyBuZWVkIHRvIGlzc3VlIGEKKwkJCQkgKiBkaXNhc3NvYyB0byB0aGUgQVAgd2l0aCB3aGljaCB3ZSB3ZXJlIHRyeWluZworCQkJCSAqIHRvIHJlYXNzb2MuCisJCQkJICovCisJCQkJY3NyX3JvYW1fY29tcGxldGUocE1hYywgZUNzckpvaW5GYWlsdXJlLCBOVUxMKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKyNlbmRpZgorCQkvKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgUmVhc3NvY2lhdGlvbiBmYWlscywgdGhlbiB3ZSBuZWVkIHRvIERpc2Fzc29jaWF0ZSB0aGUgY3VycmVudCBhc3NvY2lhdGlvbiBhbmQga2VlcCAqLworCQkvKiByb2FtaW5nLiAgTm90ZSB0aGF0IHdlIHdpbGwgYXR0ZW1wdCB0byBKb2luIHRoZSBBUCBpbnN0ZWFkIG9mIGEgUmVhc3NvYyBzaW5jZSB3ZSBtYXkgaGF2ZSBhdHRlbXB0ZWQgYSAqLworCQkvKiAnUmVhc3NvYyB0byBzZWxmJywgd2hpY2ggQVAncyB0aGF0IGRvbid0IHN1cHBvcnQgUmVhc3NvYyB3aWxsIGZvcmNlIGEgRGlzYXNzb2MuICovCisJCS8qIFRoZSBkaXNhc3NvYyByc3AgbWVzc2FnZSB3aWxsIHJlbW92ZSB0aGUgY29tbWFuZCBmcm9tIGFjdGl2ZSBsaXN0ICovCisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCQkgICAgKGNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZQorCQkJCSAgICAocE1hYywgcFNtZUpvaW5Sc3AtPnNlc3Npb25JZCwKKwkJCQkgICAgZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX1JFQVNTT0NfRkFJTFVSRSwgZmFsc2UpKSkgeworCQkJY3NyX3JvYW1fY29tcGxldGUocE1hYywgZUNzckpvaW5GYWlsdXJlLCBOVUxMKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY3NyX3JvYW1fcm9hbWluZ19zdGF0ZV9zdG9wX2Jzc19yc3BfcHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJICB0U2lyU21lUnNwICpwU21lUnNwKQoreworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisJeworCQlob3N0X2xvZ19pYnNzX3BrdF90eXBlICpwSWJzc0xvZzsKKwkJV0xBTl9IT1NUX0RJQUdfTE9HX0FMTE9DKHBJYnNzTG9nLCBob3N0X2xvZ19pYnNzX3BrdF90eXBlLAorCQkJCQkgTE9HX1dMQU5fSUJTU19DKTsKKwkJaWYgKHBJYnNzTG9nKSB7CisJCQlwSWJzc0xvZy0+ZXZlbnRJZCA9IFdMQU5fSUJTU19FVkVOVF9TVE9QX1JTUDsKKwkJCWlmIChlU0lSX1NNRV9TVUNDRVNTICE9IHBTbWVSc3AtPnN0YXR1c0NvZGUpIHsKKwkJCQlwSWJzc0xvZy0+c3RhdHVzID0gV0xBTl9JQlNTX1NUQVRVU19GQUlMVVJFOworCQkJfQorCQkJV0xBTl9IT1NUX0RJQUdfTE9HX1JFUE9SVChwSWJzc0xvZyk7CisJCX0KKwl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IgKi8KKwlwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3BTbWVSc3AtPnNlc3Npb25JZF0uY29ubmVjdFN0YXRlID0KKwkJZUNTUl9BU1NPQ19TVEFURV9UWVBFX05PVF9DT05ORUNURUQ7CisJaWYgKENTUl9JU19ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUShwTWFjLCBwU21lUnNwLT5zZXNzaW9uSWQpKSB7CisJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMKTsKKwl9IGVsc2UKKwlpZiAoQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQ09OTkVDVF9DT05USU5VRQorCQkgICAgKHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCkpIHsKKwkJY3NyX3JvYW1fcmVpc3N1ZV9yb2FtX2NvbW1hbmQocE1hYyk7CisJfQorfQorCisvKioKKyAqIGNzcl9kZXF1ZXVlX2NvbW1hbmQoKSAtIHJlbW92ZXMgYSBjb21tYW5kIGZyb20gYWN0aXZlIGNtZCBsaXN0CisgKiBAcE1hYzogICAgICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitjc3JfZGVxdWV1ZV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJYm9vbCBmUmVtb3ZlQ21kOworCXRTbWVDbWQgKmNtZCA9IE5VTEw7CisJdExpc3RFbGVtICplbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJm1hY19jdHgtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LAorCQkJCQkgICAgTExfQUNDRVNTX0xPQ0spOworCWlmICghZW50cnkpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiTk8gY29tbWFuZHMgYXJlIGFjdGl2ZSIpKTsKKwkJcmV0dXJuOworCX0KKworCWNtZCA9IEdFVF9CQVNFX0FERFIoZW50cnksIHRTbWVDbWQsIExpbmspOworCS8qCisJICogSWYgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGlzIEFjdGl2ZSBhbmQgaXQgaXMgYSBnaXZlbiBjbWQgdHlwZSwgcmVtb3ZlCisJICogYW5kIHB1dCB0aGlzIG9uIHRoZSBGcmVlIHF1ZXVlLgorCSAqLworCWlmIChlU21lQ29tbWFuZFJvYW0gIT0gY21kLT5jb21tYW5kKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIlJvYW0gY29tbWFuZCBub3QgYWN0aXZlIikpOworCQlyZXR1cm47CisJfQorCS8qCisJICogd2UgbmVlZCB0byBwcm9jZXNzIHRoZSByZXN1bHQgZmlyc3QgYmVmb3JlIHJlbW92aW5nIGl0IGZyb20gYWN0aXZlCisJICogbGlzdCBiZWNhdXNlIHN0YXRlIGNoYW5nZXMgc3RpbGwgaGFwcGVuaW5nIGluc2lkZXMKKwkgKiByb2FtUVByb2Nlc3NSb2FtUmVzdWx0cyBzbyBubyBvdGhlciByb2FtIGNvbW1hbmQgc2hvdWxkIGJlIGlzc3VlZC4KKwkgKi8KKwlmUmVtb3ZlQ21kID0gY3NyX2xsX3JlbW92ZV9lbnRyeSgmbWFjX2N0eC0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIGVudHJ5LAorCQkJCQkgTExfQUNDRVNTX0xPQ0spOworCWlmIChjbWQtPnUucm9hbUNtZC5mUmVsZWFzZVByb2ZpbGUpIHsKKwkJY3NyX3JlbGVhc2VfcHJvZmlsZShtYWNfY3R4LCAmY21kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUpOworCQljbWQtPnUucm9hbUNtZC5mUmVsZWFzZVByb2ZpbGUgPSBmYWxzZTsKKwl9CisJaWYgKGZSZW1vdmVDbWQpCisJCWNzcl9yZWxlYXNlX2NvbW1hbmRfcm9hbShtYWNfY3R4LCBjbWQpOworCWVsc2UKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiZmFpbCB0byByZW1vdmUgY21kIHJlYXNvbiAlZCIpLAorCQkJY21kLT51LnJvYW1DbWQucm9hbVJlYXNvbik7Cit9CisKKy8qKgorICogY3NyX3Bvc3Rfcm9hbV9mYWlsdXJlKCkgLSBwb3N0IHJvYW0gZmFpbHVyZSBiYWNrIHRvIGNzciBhbmQgaXNzdWVzIGEgZGlzYXNzb2MKKyAqIEBwTWFjOiAgICAgICAgICAgICAgIG1hYyBnbG9iYWwgY29udGV4dAorICogQHNlc3Npb25faWQ6ICAgICAgICAgc2Vzc2lvbiBpZAorICogQHJvYW1faW5mbzogICAgICAgICAgcm9hbSBpbmZvIHN0cnVjdAorICogQHNjYW5fZmlsdGVyOiAgICAgICAgc2NhbiBmaWx0ZXIgdG8gZnJlZQorICogQGN1cl9yb2FtX3Byb2ZpbGU6ICAgY3VycmVudCBjc3Igcm9hbSBwcm9maWxlCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitjc3JfcG9zdF9yb2FtX2ZhaWx1cmUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJICAgICAgdWludDMyX3Qgc2Vzc2lvbl9pZCwKKwkJICAgICAgdENzclJvYW1JbmZvICpyb2FtX2luZm8sCisJCSAgICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpzY2FuX2ZpbHRlciwKKwkJICAgICAgdENzclJvYW1Qcm9maWxlICpjdXJfcm9hbV9wcm9maWxlKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKHNjYW5fZmlsdGVyKSB7CisJCWNzcl9mcmVlX3NjYW5fZmlsdGVyKG1hY19jdHgsIHNjYW5fZmlsdGVyKTsKKwkJY2RmX21lbV9mcmVlKHNjYW5fZmlsdGVyKTsKKwl9CisJaWYgKGN1cl9yb2FtX3Byb2ZpbGUpCisJCWNkZl9tZW1fZnJlZShjdXJfcm9hbV9wcm9maWxlKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJY3NyX3JvYW1fc3luY2hfY2xlYW5fdXAobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisjZW5kaWYKKwkvKiBJbmZvcm0gdGhlIHVwcGVyIGxheWVycyB0aGF0IHRoZSByZWFzc29jIGZhaWxlZCAqLworCWNkZl9tZW1femVybyhyb2FtX2luZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pKTsKKwljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsIHJvYW1faW5mbywgMCwKKwkJCSAgICAgICBlQ1NSX1JPQU1fRlRfUkVBU1NPQ19GQUlMRUQsIGVTSVJfU01FX1NVQ0NFU1MpOworCS8qCisJICogSXNzdWUgYSBkaXNhc3NvYyByZXF1ZXN0IHNvIHRoYXQgUEUvTElNIHVzZXMgdGhpcyB0byBjbGVhbi11cCB0aGUgRlQKKwkgKiBzZXNzaW9uLiBVcG9uIHN1Y2Nlc3MsIHdlIHdvdWxkIHJlLWVudGVyIHRoaXMgcm91dGluZSBhZnRlciByZWNlaXZpbmcKKwkgKiB0aGUgZGlzYXNzb2MgcmVzcG9uc2UgYW5kIHdpbGwgZmFsbCBpbnRvIHRoZSByZWFzc29jIGZhaWwgc3ViLXN0YXRlLgorCSAqIEFuZCwgZXZlbnR1YWxseSBjYWxsIGNzcl9yb2FtX2NvbXBsZXRlIHdoaWNoIHdvdWxkIHJlbW92ZSB0aGUgcm9hbQorCSAqIGNvbW1hbmQgZnJvbSBTTUUgYWN0aXZlIHF1ZXVlLgorCSAqLworCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZShtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQkJZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX1JFQVNTT0NfRkFJTFVSRSwgZmFsc2UpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoImNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZSBmYWlsZWQsIHN0YXR1cyAlZCIpLAorCQkJc3RhdHVzKTsKKwkJY3NyX3JvYW1fY29tcGxldGUobWFjX2N0eCwgZUNzckpvaW5GYWlsdXJlLCBOVUxMKTsKKwl9Cit9CisKKy8qKgorICogY3NyX2NoZWNrX3Byb2ZpbGVfaW5fc2Nhbl9jYWNoZSgpIC0gZmluZHMgaWYgcm9hbSBwcm9maWxlIGlzIHByZXNlbnQgaW4gc2NhbgorICogY2FjaGUgb3Igbm90CisgKiBAcE1hYzogICAgICAgICAgICAgICAgICBtYWMgZ2xvYmFsIGNvbnRleHQKKyAqIEBzY2FuX2ZpbHRlcjogICAgICAgICAgIG91dCBwYXJhbSwgc2NhbiBmaWx0ZXIKKyAqIEBuZWlnaGJvcl9yb2FtX2luZm86ICAgIHJvYW0gaW5mbyBzdHJ1Y3QKKyAqIEBoQlNTTGlzdDogICAgICAgICAgICAgIHNjYW4gcmVzdWx0CisgKgorICogUmV0dXJuOiB0cnVlIGlmIGZvdW5kIGVsc2UgZmFsc2UuCisgKi8KK3N0YXRpYyBib29sCitjc3JfY2hlY2tfcHJvZmlsZV9pbl9zY2FuX2NhY2hlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJdENzclNjYW5SZXN1bHRGaWx0ZXIgKipzY2FuX2ZpbHRlciwKKwkJCQl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIG5laWdoYm9yX3JvYW1faW5mbywKKwkJCQl0U2NhblJlc3VsdEhhbmRsZSAqaEJTU0xpc3QpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJKnNjYW5fZmlsdGVyID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisJaWYgKE5VTEwgPT0gKnNjYW5fZmlsdGVyKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoImFsbG9jIGZvciBTY2FuRmlsdGVyIGZhaWxlZC4iKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJY2RmX21lbV9zZXQoKnNjYW5fZmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpLCAwKTsKKwkoKnNjYW5fZmlsdGVyKS0+c2Nhbl9maWx0ZXJfZm9yX3JvYW0gPSAxOworCXN0YXR1cyA9IGNzcl9yb2FtX3ByZXBhcmVfZmlsdGVyX2Zyb21fcHJvZmlsZShtYWNfY3R4LAorCQkJJm5laWdoYm9yX3JvYW1faW5mby0+Y3NyTmVpZ2hib3JSb2FtUHJvZmlsZSwKKwkJCSpzY2FuX2ZpbHRlcik7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiZmFpbGVkIHRvIHByZXBhcmUgc2NhbiBmaWx0ZXIsIHN0YXR1cyAlZCIpLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlzdGF0dXMgPSBjc3Jfc2Nhbl9nZXRfcmVzdWx0KG1hY19jdHgsICpzY2FuX2ZpbHRlciwgaEJTU0xpc3QpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoImNzcl9zY2FuX2dldF9yZXN1bHQgZmFpbGVkLCBzdGF0dXMgJWQiKSwKKwkJCXN0YXR1cyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgY3NyX3JvYW1fcm9hbWluZ19zdGF0ZV9kaXNhc3NvY19yc3BfcHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICB0U2lyU21lRGlzYXNzb2NSc3AgKnBTbWVSc3ApCit7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworCXRTY2FuUmVzdWx0SGFuZGxlIGhCU1NMaXN0OworCXRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKwl0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXIgPSBOVUxMOworCXVpbnQzMl90IHJvYW1JZCA9IDA7CisJdENzclJvYW1Qcm9maWxlICpwQ3VyUm9hbVByb2ZpbGUgPSBOVUxMOworI2VuZGlmCisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3Qgc2Vzc2lvbklkOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9IE5VTEw7CisJdFNpclNtZURpc2Fzc29jUnNwIFNtZURpc2Fzc29jUnNwOworCisJY3NyX3Nlcl9kZXNfdW5wYWNrX2RpYXNzb2NfcnNwKCh1aW50OF90ICopIHBTbWVSc3AsICZTbWVEaXNhc3NvY1JzcCk7CisJc2Vzc2lvbklkID0gU21lRGlzYXNzb2NSc3Auc2Vzc2lvbklkOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBGTCgic2Vzc2lvbklkICVkIiksCisJCSAgc2Vzc2lvbklkKTsKKworCWlmIChjc3JfaXNfY29ubl9zdGF0ZV9pbmZyYShwTWFjLCBzZXNzaW9uSWQpKSB7CisJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGUgPQorCQkJZUNTUl9BU1NPQ19TVEFURV9UWVBFX05PVF9DT05ORUNURUQ7CisJfQorCisJcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfTk9fSk9JTihwTWFjLCBzZXNzaW9uSWQpKSB7CisJCXNtc19sb2cocE1hYywgTE9HMiwgIioqKmVDc3JOb3RoaW5nVG9Kb2luKioqIik7CisJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMKTsKKwl9IGVsc2UgaWYgKENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0ZPUkNFRChwTWFjLCBzZXNzaW9uSWQpIHx8CisJCSAgIENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX1JFUShwTWFjLCBzZXNzaW9uSWQpKSB7CisJCWlmIChlU0lSX1NNRV9TVUNDRVNTID09IFNtZURpc2Fzc29jUnNwLnN0YXR1c0NvZGUpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HMiwKKwkJCQlGTCgiQ1NSIGZvcmNlIGRpc2Fzc29jaWF0ZWQgc3VjY2Vzc2Z1bCIpKTsKKwkJCS8qCisJCQkgKiBBIGNhbGxiYWNrIHRvIEhERCB3aWxsIGJlIGlzc3VlZCBmcm9tCisJCQkgKiBjc3Jfcm9hbV9jb21wbGV0ZSBzbyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUKKwkJCSAqLworCQl9CisJCWNzcl9yb2FtX2NvbXBsZXRlKHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMKTsKKwl9IGVsc2UgaWYgKENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hPKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkgIEZMKCJDU1IgU21lRGlzYXNzb2NSZXEgZHVlIHRvIEhPIG9uIHNlc3Npb24gJWQiKSwKKwkJCSAgc2Vzc2lvbklkKTsKKwkJcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKwkJLyoKKwkJICogRmlyc3QgZW5zdXJlIGlmIHRoZSByb2FtIHByb2ZpbGUgaXMgaW4gdGhlIHNjYW4gY2FjaGUuCisJCSAqIElmIG5vdCwgcG9zdCBhIHJlYXNzb2MgZmFpbHVyZSBhbmQgZGlzY29ubmVjdC4KKwkJICovCisJCWlmICghY3NyX2NoZWNrX3Byb2ZpbGVfaW5fc2Nhbl9jYWNoZShwTWFjLCAmcFNjYW5GaWx0ZXIsCisJCQkJCQlwTmVpZ2hib3JSb2FtSW5mbywgJmhCU1NMaXN0KSkKKwkJCWdvdG8gUE9TVF9ST0FNX0ZBSUxVUkU7CisKKwkJLyoKKwkJICogQWZ0ZXIgZW5zdXJpbmcgdGhhdCB0aGUgcm9hbSBwcm9maWxlIGlzIGluIHRoZSBzY2FuIHJlc3VsdAorCQkgKiBsaXN0LCBkZXF1ZXVlIHRoZSBjb21tYW5kIGZyb20gdGhlIGFjdGl2ZSBsaXN0LgorCQkgKi8KKwkJY3NyX2RlcXVldWVfY29tbWFuZChwTWFjKTsKKworCQkvKiBub3RpZnkgSEREIGFib3V0IGhhbmRvZmYgYW5kIHByb3ZpZGUgdGhlIEJTU0lEIHRvbyAqLworCQlyb2FtSW5mby5yZWFzb25Db2RlID0gZUNzclJvYW1SZWFzb25CZXR0ZXJBUDsKKworCQljZGZfY29weV9tYWNhZGRyKCZyb2FtSW5mby5ic3NpZCwKKwkJCXBOZWlnaGJvclJvYW1JbmZvLT5jc3JOZWlnaGJvclJvYW1Qcm9maWxlLkJTU0lEcy5ic3NpZCk7CisKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgMCwKKwkJCQkgICAgICAgZUNTUl9ST0FNX1JPQU1JTkdfU1RBUlQsCisJCQkJICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfTk9ORSk7CisKKwkJLyoKKwkJICogQ29weSB0aGUgY29ubmVjdGVkIHByb2ZpbGUgdG8gYXBwbHkgdGhlIHNhbWUgZm9yIHRoaXMKKwkJICogY29ubmVjdGlvbiBhcyB3ZWxsCisJCSAqLworCQlwQ3VyUm9hbVByb2ZpbGUgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclJvYW1Qcm9maWxlKSk7CisJCWlmIChwQ3VyUm9hbVByb2ZpbGUgIT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIG5vdGlmeSBzdWItbW9kdWxlcyBsaWtlIFFvUyBldGMuIHRoYXQgaGFuZG9mZgorCQkJICogaGFwcGVuaW5nCisJCQkgKi8KKwkJCXNtZV9xb3NfY3NyX2V2ZW50X2luZChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCSAgICAgIFNNRV9RT1NfQ1NSX0hBTkRPRkZfQVNTT0NfUkVRLAorCQkJCQkgICAgICBOVUxMKTsKKwkJCWNkZl9tZW1fc2V0KHBDdXJSb2FtUHJvZmlsZSwgc2l6ZW9mKHRDc3JSb2FtUHJvZmlsZSksCisJCQkJICAgIDApOworCQkJY3NyX3JvYW1fY29weV9wcm9maWxlKHBNYWMsIHBDdXJSb2FtUHJvZmlsZSwKKwkJCQkJICAgICAgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSk7CisJCQkvKiBtYWtlIHN1cmUgdG8gcHV0IGl0IGF0IHRoZSBoZWFkIG9mIHRoZSBjbWQgcXVldWUgKi8KKwkJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX2Nvbm5lY3QocE1hYywgc2Vzc2lvbklkLAorCQkJCQlwQ3VyUm9hbVByb2ZpbGUsIGhCU1NMaXN0LAorCQkJCQllQ3NyU21lSXNzdWVkQXNzb2NUb1NpbWlsYXJBUCwKKwkJCQkJcm9hbUlkLCB0cnVlLCBmYWxzZSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwoImlzc3VlX2Nvbm5lY3QgZmFpbGVkLiBzdGF0dXMgJWQiKSwKKwkJCQkJc3RhdHVzKTsKKworCQkJY3NyX3JlbGVhc2VfcHJvZmlsZShwTWFjLCBwQ3VyUm9hbVByb2ZpbGUpOworCQkJY2RmX21lbV9mcmVlKHBDdXJSb2FtUHJvZmlsZSk7CisJCQljc3JfZnJlZV9zY2FuX2ZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisJCQljZGZfbWVtX2ZyZWUocFNjYW5GaWx0ZXIpOworCQkJcmV0dXJuOworCQl9CisKK1BPU1RfUk9BTV9GQUlMVVJFOgorCWNzcl9wb3N0X3JvYW1fZmFpbHVyZShwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywKKwkJCSAgICAgIHBTY2FuRmlsdGVyLCBwQ3VyUm9hbVByb2ZpbGUpOworI2VuZGlmCisJfSAvKiBlbHNlIGlmICggQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfSE8oIHBNYWMgKSApICovCisJZWxzZSBpZiAoQ1NSX0lTX1JPQU1fU1VCU1RBVEVfUkVBU1NPQ19GQUlMKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJLyogRGlzYXNzb2MgZHVlIHRvIFJlYXNzb2MgZmFpbHVyZSBmYWxscyBpbnRvIHRoaXMgY29kZXBhdGggKi8KKwkJY3NyX3JvYW1fY29tcGxldGUocE1hYywgZUNzckpvaW5GYWlsdXJlLCBOVUxMKTsKKwl9IGVsc2UgeworCQlpZiAoZVNJUl9TTUVfU1VDQ0VTUyA9PSBTbWVEaXNhc3NvY1JzcC5zdGF0dXNDb2RlKSB7CisJCQkvKgorCQkJICogU3VjY2Vzc2Z1bGx5IGRpc2Fzc29jaWF0ZWQgZnJvbSB0aGUgJ29sZCcgQnNzLgorCQkJICogV2UgZ2V0IERpc2Fzc29jaWF0ZSByZXNwb25zZSBpbiB0aHJlZSBjb25kaXRpb25zLgorCQkJICogMSkgVGhlIGNhc2Ugd2hlcmUgd2UgYXJlIGRpc2Fzb2NpYXRpbmcgZnJvbSBhbiBJbmZyYQorCQkJICogICAgQnNzIHRvIHN0YXJ0IGFuIElCU1MuCisJCQkgKiAyKSBXaGVuIHdlIGFyZSBkaXNhc3NvY2lhdGluZyBmcm9tIGFuIEluZnJhIEJzcyB0bworCQkJICogICAgam9pbiBhbiBJQlNTIG9yIGEgbmV3IGluZnJhIG5ldHdvcmsuCisJCQkgKiAzKSBXaGVyZSB3ZSBhcmUgZG9pbmcgYW4gSW5mcmEgdG8gSW5mcmEgcm9hbSBiZXR3ZWVuCisJCQkgKiAgICBuZXR3b3JrcyB3aXRoIGRpZmZlcmVudCBTU0lEcy4KKwkJCSAqIEluIGFsbCBjYXNlcywgd2Ugc2V0IHRoZSBuZXcgQnNzIGNvbmZpZ3VyYXRpb24gaGVyZQorCQkJICogYW5kIGF0dGVtcHQgdG8gam9pbgorCQkJICovCisJCQlzbXNfbG9nKHBNYWMsIExPRzIsCisJCQkJRkwoIkRpc2Fzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5IikpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJEaXNhc3NvY1JlcSBmYWlsZWQsIHN0YXR1c0NvZGU9IDB4JTA4WCIpLAorCQkJCVNtZURpc2Fzc29jUnNwLnN0YXR1c0NvZGUpOworCQl9CisJCS8qIFdlIGFyZSBub3QgZG9uZSB5ZXQuIEdldCB0aGUgZGF0YSBhbmQgY29udGludWUgcm9hbWluZyAqLworCQljc3Jfcm9hbV9yZWlzc3VlX3JvYW1fY29tbWFuZChwTWFjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNzcl9yb2FtX3JvYW1pbmdfc3RhdGVfZGVhdXRoX3JzcF9wcm9jZXNzb3IodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCQl0U2lyU21lRGVhdXRoUnNwICpwU21lUnNwKQoreworCXRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlOworCS8qIE5vIG9uZSBpcyBzZW5kaW5nIGVXTklfU01FX0RFQVVUSF9SRVEgdG8gUEUuICovCisJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiaXMgbm8tb3AiKSk7CisJc3RhdHVzQ29kZSA9IGNzcl9nZXRfZGVfYXV0aF9yc3Bfc3RhdHVzX2NvZGUocFNtZVJzcCk7CisJcE1hYy0+cm9hbS5kZWF1dGhSc3BTdGF0dXMgPSBzdGF0dXNDb2RlOworCWlmIChDU1JfSVNfUk9BTV9TVUJTVEFURV9ERUFVVEhfUkVRKHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCkpIHsKKwkJY3NyX3JvYW1fY29tcGxldGUocE1hYywgZUNzck5vdGhpbmdUb0pvaW4sIE5VTEwpOworCX0gZWxzZSB7CisJCWlmIChlU0lSX1NNRV9TVUNDRVNTID09IHN0YXR1c0NvZGUpIHsKKwkJCS8qIFN1Y2Nlc3NmdWxseSBkZWF1dGggZnJvbSB0aGUgJ29sZCcgQnNzLi4uICovCisJCQkvKiAqLworCQkJc21zX2xvZyhwTWFjLCBMT0cyLAorCQkJCSJDU1IgU21lRGVhdXRoUmVxIGRpc2Fzc29jaWF0ZWQgU3VjY2Vzc2Z1bGx5Iik7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkJIlNtZURlYXV0aFJlcSBmYWlsZWQgd2l0aCBzdGF0dXNDb2RlPSAweCUwOFgiLAorCQkJCXN0YXR1c0NvZGUpOworCQl9CisJCS8qIFdlIGFyZSBub3QgZG9uZSB5ZXQuIEdldCB0aGUgZGF0YSBhbmQgY29udGludWUgcm9hbWluZyAqLworCQljc3Jfcm9hbV9yZWlzc3VlX3JvYW1fY29tbWFuZChwTWFjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNzcl9yb2FtX3JvYW1pbmdfc3RhdGVfc3RhcnRfYnNzX3JzcF9wcm9jZXNzb3IodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCQkgICB0U2lyU21lU3RhcnRCc3NSc3AgKgorCQkJCQkJCSAgIHBTbWVTdGFydEJzc1JzcCkKK3sKKwllQ3NyUm9hbUNvbXBsZXRlUmVzdWx0IHJlc3VsdDsKKworCWlmIChlU0lSX1NNRV9TVUNDRVNTID09IHBTbWVTdGFydEJzc1JzcC0+c3RhdHVzQ29kZSkgeworCQlzbXNfbG9nKHBNYWMsIExPR1csICJTbWVTdGFydEJzc1JlcSBTdWNjZXNzZnVsIik7CisJCXJlc3VsdCA9IGVDc3JTdGFydEJzc1N1Y2Nlc3M7CisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJIlNtZVN0YXJ0QnNzUmVxIGZhaWxlZCB3aXRoIHN0YXR1c0NvZGU9IDB4JTA4WCIsCisJCQlwU21lU3RhcnRCc3NSc3AtPnN0YXR1c0NvZGUpOworCQkvKiBMZXQgY3NyX3JvYW1fY29tcGxldGUgZGVjaWRlIHdoYXQgdG8gZG8gKi8KKwkJcmVzdWx0ID0gZUNzclN0YXJ0QnNzRmFpbHVyZTsKKwl9CisJY3NyX3JvYW1fY29tcGxldGUocE1hYywgcmVzdWx0LCBwU21lU3RhcnRCc3NSc3ApOworfQorCisvKioKKyAqIGNzcl9yb2FtaW5nX3N0YXRlX21zZ19wcm9jZXNzb3IoKSAtIHByb2Nlc3Mgcm9hbWluZyBtZXNzYWdlcworICogQHBNYWM6ICAgICAgIG1hYyBnbG9iYWwgY29udGV4dAorICogQHBNc2dCdWY6ICAgIG1lc3NhZ2UgYnVmZmVyCisgKgorICogV2UgbmVlZCB0byBiZSBjYXJlZnVsIG9uIHdoZXRoZXIgdG8gY2FzdCBwTXNnQnVmIChwU21lUnNwKSB0byBvdGhlciB0eXBlIG9mCisgKiBzdHJ1Y3V0cmVzLiBJdCBkZXBlbmRzIG9uIGhvdyB0aGUgbWVzc2FnZSBpcyBjb25zdHJ1Y3RlZC4gSWYgdGhlIG1lc3NhZ2UgaXMKKyAqIHNlbnQgYnkgbGltX3NlbmRfc21lX3JzcCwgdGhlIHBNc2dCdWYgaXMgb25seSBhIGdlbmVyaWMgcmVzcG9uc2UgYW5kIGNhbiBvbmx5CisgKiBiZSB1c2VkIGFzIHBvaW50ZXIgdG8gdFNpclNtZVJzcC4gRm9yIHRoZSBtZXNzYWdlcyB3aGVyZSBzZW5kZXIgYWxsb2NhdGVzCisgKiBtZW1vcnkgZm9yIHNwZWNpZmljIHN0cnVjdHVyZXMsIHRoZW4gaXQgY2FuIGJlIGNhc3QgYWNjb3JkaW5nbHkuCisgKgorICogUmV0dXJuOiBzdGF0dXMgb2Ygb3BlcmF0aW9uCisgKi8KK3ZvaWQgY3NyX3JvYW1pbmdfc3RhdGVfbXNnX3Byb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKQoreworCXRTaXJTbWVSc3AgKnBTbWVSc3A7CisJdFNtZUlic3NQZWVySW5kICpwSWJzc1BlZXJJbmQ7CisJdENzclJvYW1JbmZvIHJvYW1JbmZvOworCXBTbWVSc3AgPSAodFNpclNtZVJzcCAqKSBwTXNnQnVmOworCXNtc19sb2cocE1hYywgTE9HMiwgRkwoIk1lc3NhZ2UgJWRbMHglMDRYXSByZWNlaXZlZCBpbiBzdWJzdGF0ZSAlcyIpLAorCQlwU21lUnNwLT5tZXNzYWdlVHlwZSwgcFNtZVJzcC0+bWVzc2FnZVR5cGUsCisJCW1hY190cmFjZV9nZXRjc3Jfcm9hbV9zdWJfc3RhdGUoCisJCQlwTWFjLT5yb2FtLmN1clN1YlN0YXRlW3BTbWVSc3AtPnNlc3Npb25JZF0pKTsKKwlwU21lUnNwLT5tZXNzYWdlVHlwZSA9IHBTbWVSc3AtPm1lc3NhZ2VUeXBlOworCXBTbWVSc3AtPmxlbmd0aCA9IHBTbWVSc3AtPmxlbmd0aDsKKwlwU21lUnNwLT5zdGF0dXNDb2RlID0gcFNtZVJzcC0+c3RhdHVzQ29kZTsKKworCXN3aXRjaCAocFNtZVJzcC0+bWVzc2FnZVR5cGUpIHsKKworCWNhc2UgZVdOSV9TTUVfSk9JTl9SU1A6CisJCS8qIGluIFJvYW1pbmcgc3RhdGUsIHByb2Nlc3MgdGhlIEpvaW4gcmVzcG9uc2UgbWVzc2FnZS4uLiAqLworCQlpZiAoQ1NSX0lTX1JPQU1fU1VCU1RBVEVfSk9JTl9SRVEocE1hYywgcFNtZVJzcC0+c2Vzc2lvbklkKSkKKwkJCS8qIFdlIHNlbnQgYSBKT0lOX1JFUSAqLworCQkJY3NyX3JvYW1fam9pbl9yc3BfcHJvY2Vzc29yKHBNYWMsCisJCQkJCQkgICAgKHRTaXJTbWVKb2luUnNwICopIHBTbWVSc3ApOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX1JFQVNTT0NfUlNQOgorCQkvKiBvciB0aGUgUmVhc3NvY2lhdGlvbiByZXNwb25zZSBtZXNzYWdlLi4uICovCisJCWlmIChDU1JfSVNfUk9BTV9TVUJTVEFURV9SRUFTU09DX1JFUShwTWFjLCBwU21lUnNwLT5zZXNzaW9uSWQpKQorCQkJY3NyX3JvYW1fcm9hbWluZ19zdGF0ZV9yZWFzc29jX3JzcF9wcm9jZXNzb3IocE1hYywKKwkJCQkJCSh0cFNpclNtZUpvaW5Sc3ApIHBTbWVSc3ApOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX1NUT1BfQlNTX1JTUDoKKwkJLyogb3IgdGhlIFN0b3AgQnNzIHJlc3BvbnNlIG1lc3NhZ2UuLi4gKi8KKwkJY3NyX3JvYW1fcm9hbWluZ19zdGF0ZV9zdG9wX2Jzc19yc3BfcHJvY2Vzc29yKHBNYWMsIHBTbWVSc3ApOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0RJU0FTU09DX1JTUDoKKwkJLyogb3IgdGhlIERpc2Fzc29jaWF0ZSByZXNwb25zZSBtZXNzYWdlLi4uICovCisJCWlmIChDU1JfSVNfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRVEocE1hYywgcFNtZVJzcC0+c2Vzc2lvbklkKQorCQkgICAgfHwgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfTk9fSk9JTihwTWFjLAorCQkJCQkJCXBTbWVSc3AtPnNlc3Npb25JZCkKKwkJICAgIHx8IENTUl9JU19ST0FNX1NVQlNUQVRFX1JFQVNTT0NfRkFJTChwTWFjLAorCQkJCQkJCXBTbWVSc3AtPnNlc3Npb25JZCkKKwkJICAgIHx8IENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0ZPUkNFRChwTWFjLAorCQkJCQkJCXBTbWVSc3AtPnNlc3Npb25JZCkKKwkJICAgIHx8IENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0NPTk5FQ1RfQ09OVElOVUUocE1hYywKKwkJCQkJCQlwU21lUnNwLT5zZXNzaW9uSWQpCisJCSAgICB8fCBDU1JfSVNfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19ITyhwTWFjLAorCQkJCQkJCXBTbWVSc3AtPnNlc3Npb25JZCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCSAgRkwoImVXTklfU01FX0RJU0FTU09DX1JTUCBzdWJTdGF0ZSA9ICVzIiksCisJCQkJICBtYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3ViX3N0YXRlKAorCQkJCSAgcE1hYy0+cm9hbS5jdXJTdWJTdGF0ZVtwU21lUnNwLT5zZXNzaW9uSWRdKSk7CisJCQljc3Jfcm9hbV9yb2FtaW5nX3N0YXRlX2Rpc2Fzc29jX3JzcF9wcm9jZXNzb3IocE1hYywKKwkJCQkJCSh0U2lyU21lRGlzYXNzb2NSc3AgKikgcFNtZVJzcCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9ERUFVVEhfUlNQOgorCQkvKiBvciB0aGUgRGVhdXRoZW50aWNhdGlvbiByZXNwb25zZSBtZXNzYWdlLi4uICovCisJCWlmIChDU1JfSVNfUk9BTV9TVUJTVEFURV9ERUFVVEhfUkVRKHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCkpCisJCQljc3Jfcm9hbV9yb2FtaW5nX3N0YXRlX2RlYXV0aF9yc3BfcHJvY2Vzc29yKHBNYWMsCisJCQkJCQkodFNpclNtZURlYXV0aFJzcCAqKSBwU21lUnNwKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9TVEFSVF9CU1NfUlNQOgorCQkvKiBvciB0aGUgU3RhcnQgQlNTIHJlc3BvbnNlIG1lc3NhZ2UuLi4gKi8KKwkJaWYgKENTUl9JU19ST0FNX1NVQlNUQVRFX1NUQVJUX0JTU19SRVEocE1hYywKKwkJCQkJCSAgICAgICBwU21lUnNwLT5zZXNzaW9uSWQpKQorCQkJY3NyX3JvYW1fcm9hbWluZ19zdGF0ZV9zdGFydF9ic3NfcnNwX3Byb2Nlc3NvcihwTWFjLAorCQkJCQkJKHRTaXJTbWVTdGFydEJzc1JzcCAqKSBwU21lUnNwKTsKKwkJYnJlYWs7CisJLyogSW4gY2FzZSBDU1IgaXNzdWVzIFNUT1BfQlNTLCB3ZSBuZWVkIHRvIHRlbGwgSEREIGFib3V0IHBlZXIgZGVwYXJ0ZWQKKwkgKiBiZWNhc3VlIFBFIGlzIHJlbW92aW5nIHRoZW0KKwkgKi8KKwljYXNlIGVXTklfU01FX0lCU1NfUEVFUl9ERVBBUlRFRF9JTkQ6CisJCXBJYnNzUGVlckluZCA9ICh0U21lSWJzc1BlZXJJbmQgKikgcFNtZVJzcDsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlBlZXIgZGVwYXJ0ZWQgbnRmIGZyb20gTElNIGluIGpvaW5pbmcgc3RhdGUiKSk7CisJCWNkZl9tZW1fc2V0KCZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbyksIDApOworCQlyb2FtSW5mby5zdGFJZCA9ICh1aW50OF90KSBwSWJzc1BlZXJJbmQtPnN0YUlkOworCQlyb2FtSW5mby51Y2FzdFNpZyA9ICh1aW50OF90KSBwSWJzc1BlZXJJbmQtPnVjYXN0U2lnOworCQlyb2FtSW5mby5iY2FzdFNpZyA9ICh1aW50OF90KSBwSWJzc1BlZXJJbmQtPmJjYXN0U2lnOworCQljZGZfbWVtX2NvcHkoJnJvYW1JbmZvLnBlZXJNYWMsIHBJYnNzUGVlckluZC0+cGVlckFkZHIsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgcFNtZVJzcC0+c2Vzc2lvbklkLCAmcm9hbUluZm8sIDAsCisJCQkJICAgICAgIGVDU1JfUk9BTV9DT05ORUNUX1NUQVRVU19VUERBVEUsCisJCQkJICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19QRUVSX0RFUEFSVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9HRVRfUlNTSV9SRVE6CisJeworCQl0QW5pR2V0UnNzaVJlcSAqcEdldFJzc2lSZXEgPSAodEFuaUdldFJzc2lSZXEgKikgcE1zZ0J1ZjsKKwkJaWYgKE5VTEwgIT0gcEdldFJzc2lSZXEtPnJzc2lDYWxsYmFjaykKKwkJCSgodENzclJzc2lDYWxsYmFjaykgcEdldFJzc2lSZXEtPnJzc2lDYWxsYmFjaykKKwkJCQkocEdldFJzc2lSZXEtPmxhc3RSU1NJLCBwR2V0UnNzaVJlcS0+c3RhSWQsCisJCQkJcEdldFJzc2lSZXEtPnBEZXZDb250ZXh0KTsKKwkJZWxzZQorCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJwR2V0UnNzaVJlcS0+cnNzaUNhbGxiYWNrIGlzIE5VTEwiKSk7CisJfQorCWJyZWFrOworCWRlZmF1bHQ6CisJCXNtc19sb2cocE1hYywgTE9HMSwKKwkJCUZMKCJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSA9ICVkWzB4JVhdIHJlY2VpdmVkIGluIHN1YnN0YXRlICVzIiksCisJCQlwU21lUnNwLT5tZXNzYWdlVHlwZSwgcFNtZVJzcC0+bWVzc2FnZVR5cGUsCisJCQltYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3ViX3N0YXRlKAorCQkJCXBNYWMtPnJvYW0uY3VyU3ViU3RhdGVbcFNtZVJzcC0+c2Vzc2lvbklkXSkpOworCQkvKiBJZiB3ZSBhcmUgY29ubmVjdGVkLCBjaGVjayB0aGUgbGluayBzdGF0dXMgY2hhbmdlICovCisJCWlmICghY3NyX2lzX2Nvbm5fc3RhdGVfZGlzY29ubmVjdGVkKHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCkpCisJCQljc3Jfcm9hbV9jaGVja19mb3JfbGlua19zdGF0dXNfY2hhbmdlKHBNYWMsIHBTbWVSc3ApOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgY3NyX3JvYW1fam9pbmVkX3N0YXRlX21zZ19wcm9jZXNzb3IodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqcE1zZ0J1ZikKK3sKKwl0U2lyU21lUnNwICpwU2lyTXNnID0gKHRTaXJTbWVSc3AgKikgcE1zZ0J1ZjsKKwlzd2l0Y2ggKHBTaXJNc2ctPm1lc3NhZ2VUeXBlKSB7CisJY2FzZSBlV05JX1NNRV9HRVRfU1RBVElTVElDU19SU1A6CisJCXNtc19sb2cocE1hYywgTE9HMiwgRkwoIlN0YXRzIHJzcCBmcm9tIFBFIikpOworCQljc3Jfcm9hbV9zdGF0c19yc3BfcHJvY2Vzc29yKHBNYWMsIHBTaXJNc2cpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX1VQUEVSX0xBWUVSX0FTU09DX0NORjoKKwl7CisJCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisJCXRTaXJTbWVBc3NvY0luZFRvVXBwZXJMYXllckNuZiAqcFVwcGVyTGF5ZXJBc3NvY0NuZjsKKwkJdENzclJvYW1JbmZvIHJvYW1JbmZvOworCQl0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbyA9IE5VTEw7CisJCXVpbnQzMl90IHNlc3Npb25JZDsKKwkJQ0RGX1NUQVRVUyBzdGF0dXM7CisJCXNtc19sb2cocE1hYywgTE9HMSwKKwkJCUZMCisJCQkJKCJBU1NPQ0lBVElPTiBjb25maXJtYXRpb24gY2FuIGJlIGdpdmVuIHRvIHVwcGVyIGxheWVyICIpKTsKKwkJY2RmX21lbV9zZXQoJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSwgMCk7CisJCXBSb2FtSW5mbyA9ICZyb2FtSW5mbzsKKwkJcFVwcGVyTGF5ZXJBc3NvY0NuZiA9CisJCQkodFNpclNtZUFzc29jSW5kVG9VcHBlckxheWVyQ25mICopIHBNc2dCdWY7CisJCXN0YXR1cyA9CisJCQljc3Jfcm9hbV9nZXRfc2Vzc2lvbl9pZF9mcm9tX2Jzc2lkKHBNYWMsCisJCQkJCQkJICAgKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikKKwkJCQkJCQkgICBwVXBwZXJMYXllckFzc29jQ25mLT4KKwkJCQkJCQkgICBic3NJZCwgJnNlc3Npb25JZCk7CisJCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwkJaWYgKCFwU2Vzc2lvbikgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLAorCQkJCXNlc3Npb25JZCk7CisJCQlyZXR1cm47CisJCX0KKworCQlwUm9hbUluZm8tPnN0YXR1c0NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOyAgICAgICAgICAgICAgIC8qIHNlbmQgdGhlIHN0YXR1cyBjb2RlIGFzIFN1Y2Nlc3MgKi8KKwkJcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlID0KKwkJCSZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZTsKKwkJcFJvYW1JbmZvLT5zdGFJZCA9ICh1aW50OF90KSBwVXBwZXJMYXllckFzc29jQ25mLT5haWQ7CisJCXBSb2FtSW5mby0+cnNuSUVMZW4gPQorCQkJKHVpbnQ4X3QpIHBVcHBlckxheWVyQXNzb2NDbmYtPnJzbklFLmxlbmd0aDsKKwkJcFJvYW1JbmZvLT5wcnNuSUUgPQorCQkJcFVwcGVyTGF5ZXJBc3NvY0NuZi0+cnNuSUUucnNuSUVkYXRhOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJCXBSb2FtSW5mby0+d2FwaUlFTGVuID0KKwkJCSh1aW50OF90KSBwVXBwZXJMYXllckFzc29jQ25mLT53YXBpSUUubGVuZ3RoOworCQlwUm9hbUluZm8tPnB3YXBpSUUgPQorCQkJcFVwcGVyTGF5ZXJBc3NvY0NuZi0+d2FwaUlFLndhcGlJRWRhdGE7CisjZW5kaWYKKwkJcFJvYW1JbmZvLT5hZGRJRUxlbiA9CisJCQkodWludDhfdCkgcFVwcGVyTGF5ZXJBc3NvY0NuZi0+YWRkSUUubGVuZ3RoOworCQlwUm9hbUluZm8tPnBhZGRJRSA9CisJCQlwVXBwZXJMYXllckFzc29jQ25mLT5hZGRJRS5hZGRJRWRhdGE7CisJCWNkZl9tZW1fY29weShwUm9hbUluZm8tPnBlZXJNYWMuYnl0ZXMsCisJCQkgICAgIHBVcHBlckxheWVyQXNzb2NDbmYtPnBlZXJNYWNBZGRyLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJY2RmX21lbV9jb3B5KCZwUm9hbUluZm8tPmJzc2lkLAorCQkJICAgICBwVXBwZXJMYXllckFzc29jQ25mLT5ic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwkJcFJvYW1JbmZvLT53bW1FbmFibGVkU3RhID0KKwkJCXBVcHBlckxheWVyQXNzb2NDbmYtPndtbUVuYWJsZWRTdGE7CisJCXBSb2FtSW5mby0+dGltaW5nTWVhc0NhcCA9CisJCQlwVXBwZXJMYXllckFzc29jQ25mLT50aW1pbmdNZWFzQ2FwOworCQljZGZfbWVtX2NvcHkoJnBSb2FtSW5mby0+Y2hhbl9pbmZvLAorCQkJICAgICAmcFVwcGVyTGF5ZXJBc3NvY0NuZi0+Y2hhbl9pbmZvLAorCQkJICAgICBzaXplb2YodFNpclNtZUNoYW5JbmZvKSk7CisJCWlmIChDU1JfSVNfSU5GUkFfQVAocFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlKSkgeworCQkJcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RTdGF0ZSA9CisJCQkJZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lORlJBX0NPTk5FQ1RFRDsKKwkJCXBSb2FtSW5mby0+ZlJlYXNzb2NSZXEgPQorCQkJCXBVcHBlckxheWVyQXNzb2NDbmYtPnJlYXNzb2NSZXE7CisJCQlzdGF0dXMgPQorCQkJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgc2Vzc2lvbklkLAorCQkJCQkJICAgICAgIHBSb2FtSW5mbywgMCwKKwkJCQkJCSAgICAgICBlQ1NSX1JPQU1fSU5GUkFfSU5ELAorCQkJCQkJICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfQVNTT0NJQVRJT05fQ05GKTsKKwkJfQorCQlpZiAoQ1NSX0lTX1dEU19BUChwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUpKSB7CisJCQljZGZfc2xlZXAoMTAwKTsKKwkJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGUgPSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfV0RTX0NPTk5FQ1RFRDsgICAgICAgICAgIC8qIFN0YSAqLworCQkJc3RhdHVzID0gY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIHBSb2FtSW5mbywgMCwgZUNTUl9ST0FNX1dEU19JTkQsIGVDU1JfUk9BTV9SRVNVTFRfV0RTX0FTU09DSUFUSU9OX0lORCk7ICAgICAgICAgICAvKiBTdGEgKi8KKwkJfQorCisJfQorCWJyZWFrOworCWRlZmF1bHQ6CisJCWNzcl9yb2FtX2NoZWNrX2Zvcl9saW5rX3N0YXR1c19jaGFuZ2UocE1hYywgcFNpck1zZyk7CisJCWJyZWFrOworCX0KK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9pc3N1ZV9zZXRfY29udGV4dF9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgZUNzckVuY3J5cHRpb25UeXBlIEVuY3J5cHRUeXBlLAorCQkJCQkgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyaXB0aW9uLAorCQkJCQkgIHRTaXJNYWNBZGRyICpic3NJZCwgYm9vbCBhZGRLZXksCisJCQkJCSAgYm9vbCBmVW5pY2FzdCwKKwkJCQkJICB0QW5pS2V5RGlyZWN0aW9uIGFuaUtleURpcmVjdGlvbiwKKwkJCQkJICB1aW50OF90IGtleUlkLCB1aW50MTZfdCBrZXlMZW5ndGgsCisJCQkJCSAgdWludDhfdCAqcEtleSwgdWludDhfdCBwYWVSb2xlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRBbmlFZFR5cGUgZWRUeXBlOworCisJaWYgKGVDU1JfRU5DUllQVF9UWVBFX1VOS05PV04gPT0gRW5jcnlwdFR5cGUpIHsKKwkJRW5jcnlwdFR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworCX0KKworCWVkVHlwZSA9IGNzcl90cmFuc2xhdGVfZW5jcnlwdF90eXBlX3RvX2VkX3R5cGUoRW5jcnlwdFR5cGUpOworCisJLyoKKwkgKiBBbGxvdyAwIGtleXMgdG8gYmUgc2V0IGZvciB0aGUgbm9uLVdQQSBlbmNyeXB0IHR5cGVzLiBGb3IgV1BBIGVuY3J5cHQKKwkgKiB0eXBlcywgdGhlIG51bSBrZXlzIG11c3QgYmUgbm9uLXplcm8gb3IgTElNIHdpbGwgcmVqZWN0IHRoZSBzZXQKKwkgKiBjb250ZXh0IChhc3N1bWVzIHRoZSBTRVRfQ09OVEVYVCBkb2VzIG5vdCBvY2N1ciB1bnRpbCB0aGUga2V5cyBhcmUKKwkgKiBkaXN0cnVidXRlZCkuCisJICovCisJaWYgKENTUl9JU19FTkNfVFlQRV9TVEFUSUMoRW5jcnlwdFR5cGUpIHx8IGFkZEtleSkgeworCQl0Q3NyUm9hbVNldEtleSBzZXRLZXk7CisJCXNldEtleS5lbmNUeXBlID0gRW5jcnlwdFR5cGU7CisJCXNldEtleS5rZXlEaXJlY3Rpb24gPSBhbmlLZXlEaXJlY3Rpb247CisJCWNkZl9tZW1fY29weSgmc2V0S2V5LnBlZXJNYWMsIGJzc0lkLCBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCQkvKiAwIGZvciBzdXBwbGljYW50ICovCisJCXNldEtleS5wYWVSb2xlID0gcGFlUm9sZTsKKwkJLyogS2V5IGluZGV4ICovCisJCXNldEtleS5rZXlJZCA9IGtleUlkOworCQlzZXRLZXkua2V5TGVuZ3RoID0ga2V5TGVuZ3RoOworCQlpZiAoa2V5TGVuZ3RoKSB7CisJCQljZGZfbWVtX2NvcHkoc2V0S2V5LktleSwgcEtleSwga2V5TGVuZ3RoKTsKKwkJfQorCQlzdGF0dXMgPSBjc3Jfcm9hbV9pc3N1ZV9zZXRfa2V5X2NvbW1hbmQocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCSZzZXRLZXksIDApOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNzcl91cGRhdGVfa2V5X2NtZCgpIC0gdXBkYXRlIGtleSBpbmZvIGluIHNldCBrZXkgY29tbWFuZAorICogQG1hY19jdHg6ICAgICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAc2Vzc2lvbjogICAgICAgICByb2FtIHNlc3Npb24KKyAqIEBzZXRfa2V5OiAgICAgICAgIGlucHV0IHNldCBrZXkgY29tbWFuZAorICogQHNldF9rZXlfY21kOiAgICAgc2V0IGtleSBjb21tYW5kIHRvIHVwZGF0ZQorICogQGVucXVldWVfY21kOiAgICAgaW5kaWNhdGVzIGlmIGNvbW1hbmQgbmVlZCB0byBiZSBlbnF1ZXVlZCB0byBzbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdmFsaWRhdGUgdGhlIGtleSBsZW5ndGgsIGFkanVzdCBpZiB0b28gbG9uZy4gVHQgd2lsbAorICogdXBkYXRlIGJvb2wgZW5xdWV1ZV9jbWQsIHRvIGZhbHNlIGlmIHNvbWUgZXJyb3IgaGFzIG9jY3VyZWQga2V5IGFyZSBsb2NhbC4KKyAqCisgKiBSZXR1cm46IHN0YXR1cyBvZiBvcGVyYXRpb24KKyAqLworc3RhdGljIENERl9TVEFUVVMKK2Nzcl91cGRhdGVfa2V5X2NtZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb24sCisJCSAgIHRDc3JSb2FtU2V0S2V5ICpzZXRfa2V5LCB0U21lQ21kICpzZXRfa2V5X2NtZCwKKwkJICAgYm9vbCAqZW5xdWV1ZV9jbWQpCit7CisJc3dpdGNoIChzZXRfa2V5LT5lbmNUeXBlKSB7CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDoKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWToKKwkJLyogS2V5TGVuZ3RoIG1heWJlIDAgZm9yIHN0YXRpYyBXRVAgKi8KKwkJaWYgKHNldF9rZXktPmtleUxlbmd0aCkgeworCQkJaWYgKHNldF9rZXktPmtleUxlbmd0aCA8IENTUl9XRVA0MF9LRVlfTEVOKSB7CisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCQlGTCgiSW52YWxpZCBXRVA0MCBrZXlsZW5ndGggWz0gJWRdIiksCisJCQkJCXNldF9rZXktPmtleUxlbmd0aCk7CisJCQkJKmVucXVldWVfY21kID0gZmFsc2U7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwkJCX0KKworCQkJc2V0X2tleV9jbWQtPnUuc2V0S2V5Q21kLmtleUxlbmd0aCA9IENTUl9XRVA0MF9LRVlfTEVOOworCQkJY2RmX21lbV9jb3B5KHNldF9rZXlfY21kLT51LnNldEtleUNtZC5LZXksIHNldF9rZXktPktleSwKKwkJCQkgICAgIENTUl9XRVA0MF9LRVlfTEVOKTsKKwkJfQorCQkqZW5xdWV1ZV9jbWQgPSB0cnVlOworCQlicmVhazsKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDoKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk6CisJCS8qIEtleUxlbmd0aCBtYXliZSAwIGZvciBzdGF0aWMgV0VQICovCisJCWlmIChzZXRfa2V5LT5rZXlMZW5ndGgpIHsKKwkJCWlmIChzZXRfa2V5LT5rZXlMZW5ndGggPCBDU1JfV0VQMTA0X0tFWV9MRU4pIHsKKwkJCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQkJCUZMKCJJbnZhbGlkIFdFUDEwNCBrZXlsZW5ndGggWz0gJWRdIiksCisJCQkJCXNldF9rZXktPmtleUxlbmd0aCk7CisJCQkJKmVucXVldWVfY21kID0gZmFsc2U7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwkJCX0KKworCQkJc2V0X2tleV9jbWQtPnUuc2V0S2V5Q21kLmtleUxlbmd0aCA9IENTUl9XRVAxMDRfS0VZX0xFTjsKKwkJCWNkZl9tZW1fY29weShzZXRfa2V5X2NtZC0+dS5zZXRLZXlDbWQuS2V5LCBzZXRfa2V5LT5LZXksCisJCQkJICAgICBDU1JfV0VQMTA0X0tFWV9MRU4pOworCQl9CisJCSplbnF1ZXVlX2NtZCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDoKKwkJaWYgKHNldF9rZXktPmtleUxlbmd0aCA8IENTUl9US0lQX0tFWV9MRU4pIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiSW52YWxpZCBUS0lQIGtleWxlbmd0aCBbPSAlZF0iKSwKKwkJCQlzZXRfa2V5LT5rZXlMZW5ndGgpOworCQkJKmVucXVldWVfY21kID0gZmFsc2U7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCXNldF9rZXlfY21kLT51LnNldEtleUNtZC5rZXlMZW5ndGggPSBDU1JfVEtJUF9LRVlfTEVOOworCQljZGZfbWVtX2NvcHkoc2V0X2tleV9jbWQtPnUuc2V0S2V5Q21kLktleSwgc2V0X2tleS0+S2V5LAorCQkJICAgICBDU1JfVEtJUF9LRVlfTEVOKTsKKwkJKmVucXVldWVfY21kID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM6CisJCWlmIChzZXRfa2V5LT5rZXlMZW5ndGggPCBDU1JfQUVTX0tFWV9MRU4pIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiSW52YWxpZCBBRVMvQ0NNUCBrZXlsZW5ndGggWz0gJWRdIiksCisJCQkJc2V0X2tleS0+a2V5TGVuZ3RoKTsKKwkJCSplbnF1ZXVlX2NtZCA9IGZhbHNlOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwkJfQorCQlzZXRfa2V5X2NtZC0+dS5zZXRLZXlDbWQua2V5TGVuZ3RoID0gQ1NSX0FFU19LRVlfTEVOOworCQljZGZfbWVtX2NvcHkoc2V0X2tleV9jbWQtPnUuc2V0S2V5Q21kLktleSwgc2V0X2tleS0+S2V5LAorCQkJICAgICBDU1JfQUVTX0tFWV9MRU4pOworCQkqZW5xdWV1ZV9jbWQgPSB0cnVlOworCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV1BJOgorCQlpZiAoc2V0X2tleS0+a2V5TGVuZ3RoIDwgQ1NSX1dBUElfS0VZX0xFTikgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJJbnZhbGlkIFdBUEkga2V5bGVuZ3RoIFs9ICVkXSIpLAorCQkJCXNldF9rZXktPmtleUxlbmd0aCk7CisJCQkqZW5xdWV1ZV9jbWQgPSBmYWxzZTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJCX0KKwkJc2V0X2tleV9jbWQtPnUuc2V0S2V5Q21kLmtleUxlbmd0aCA9IENTUl9XQVBJX0tFWV9MRU47CisJCWNkZl9tZW1fY29weShzZXRfa2V5X2NtZC0+dS5zZXRLZXlDbWQuS2V5LCBzZXRfa2V5LT5LZXksCisJCQkgICAgIENTUl9XQVBJX0tFWV9MRU4pOworCQlpZiAoc2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKSB7CisJCQlzZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlID0KKwkJCQllQ1NSX0VOQ1JZUFRfVFlQRV9XUEk7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoInBDdXJSb2FtUHJvZmlsZSBpcyBOVUxMLiIpKTsKKwkJCSplbnF1ZXVlX2NtZCA9IGZhbHNlOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwkJfQorCQkqZW5xdWV1ZV9jbWQgPSB0cnVlOworCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX0tSSzoKKwkJLyogbm8gbmVlZCB0byBlbnF1ZXVlIEtSSyBrZXkgcmVxdWVzdCwgc2luY2UgdGhleSBhcmUgbG9jYWwgKi8KKwkJKmVucXVldWVfY21kID0gZmFsc2U7CisJCWlmIChzZXRfa2V5LT5rZXlMZW5ndGggPCBDU1JfS1JLX0tFWV9MRU4pIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiSW52YWxpZCBLUksga2V5bGVuZ3RoIFs9ICVkXSIpLAorCQkJCXNldF9rZXktPmtleUxlbmd0aCk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCWNkZl9tZW1fY29weShzZXNzaW9uLT5lc2VDY2ttSW5mby5rcmssIHNldF9rZXktPktleSwKKwkJCSAgICAgQ1NSX0tSS19LRVlfTEVOKTsKKwkJc2Vzc2lvbi0+ZXNlQ2NrbUluZm8ucmVhc3NvY19yZXFfbnVtID0gMTsKKwkJc2Vzc2lvbi0+ZXNlQ2NrbUluZm8ua3JrX3BsdW1iZWQgPSB0cnVlOworCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9CVEs6CisJCS8qIG5vIG5lZWQgdG8gZW5xdWV1ZSBLUksga2V5IHJlcXVlc3QsIHNpbmNlIHRoZXkgYXJlIGxvY2FsICovCisJCSplbnF1ZXVlX2NtZCA9IGZhbHNlOworCQlpZiAoc2V0X2tleS0+a2V5TGVuZ3RoIDwgU0lSX0JUS19LRVlfTEVOKSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoIkxGUjM6SW52YWxpZCBCVEsga2V5bGVuZ3RoIFs9ICVkXSIpLAorCQkJCXNldF9rZXktPmtleUxlbmd0aCk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCWNkZl9tZW1fY29weShzZXNzaW9uLT5lc2VDY2ttSW5mby5idGssIHNldF9rZXktPktleSwKKwkJCSAgICAgU0lSX0JUS19LRVlfTEVOKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCS8qIENoZWNrIGZvciAxMXcgQklQICovCisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVNfQ01BQzoKKwkJaWYgKHNldF9rZXktPmtleUxlbmd0aCA8IENTUl9BRVNfS0VZX0xFTikgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJJbnZhbGlkIEFFUy9DQ01QIGtleWxlbmd0aCBbPSAlZF0iKSwKKwkJCQlzZXRfa2V5LT5rZXlMZW5ndGgpOworCQkJKmVucXVldWVfY21kID0gZmFsc2U7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCQl9CisJCXNldF9rZXlfY21kLT51LnNldEtleUNtZC5rZXlMZW5ndGggPSBDU1JfQUVTX0tFWV9MRU47CisJCWNkZl9tZW1fY29weShzZXRfa2V5X2NtZC0+dS5zZXRLZXlDbWQuS2V5LCBzZXRfa2V5LT5LZXksCisJCQkgICAgIENTUl9BRVNfS0VZX0xFTik7CisJCSplbnF1ZXVlX2NtZCA9IHRydWU7CisJCWJyZWFrOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMVcgKi8KKwlkZWZhdWx0OgorCQkvKiBmb3Igb3BlbiBzZWN1cml0eSBhbHNvIHdlIHdhbnQgdG8gZW5xdWV1ZSBjb21tYW5kICovCisJCSplbnF1ZXVlX2NtZCA9IHRydWU7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfSAvKiBlbmQgb2Ygc3dpdGNoICovCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgQ0RGX1NUQVRVUyBjc3Jfcm9hbV9pc3N1ZV9zZXRfa2V5X2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCQkgdENzclJvYW1TZXRLZXkgKnBTZXRLZXksCisJCQkJCQkgdWludDMyX3Qgcm9hbUlkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCWJvb2wgZW5xdWV1ZV9jbWQgPSB0cnVlOworCXRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9XQVBJKQorCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAqLworCisJcENvbW1hbmQgPSBjc3JfZ2V0X2NvbW1hbmRfYnVmZmVyKHBNYWMpOworCWlmIChOVUxMID09IHBDb21tYW5kKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIGdldCBjb21tYW5kIGJ1ZmZlciIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfQorCWNkZl9tZW1femVybyhwQ29tbWFuZCwgc2l6ZW9mKHRTbWVDbWQpKTsKKwlwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kU2V0S2V5OworCXBDb21tYW5kLT5zZXNzaW9uSWQgPSAodWludDhfdCkgc2Vzc2lvbklkOworCS8qCisJICogZm9sbG93aW5nIGZ1bmN0aW9uIHdpbGwgdmFsaWRhdGUgdGhlIGtleSBsZW5ndGgsIEFkanVzdCBpZiB0b28gbG9uZy4KKwkgKiBmb3Igc3RhdGljIFdFUCB0aGUga2V5cyBhcmUgbm90IHNldCB0aHJ1JyBTZXRDb250ZXh0UmVxCisJICoKKwkgKiBpdCB3aWxsIHVwZGF0ZSBib29sIGVucXVldWVfY21kLCB0byBmYWxzZSBpZiBzb21lIGVycm9yIGhhcyBvY2N1cmVkCisJICoga2V5IGFyZSBsb2NhbC4gZW5xdWV1ZSBzbWUgY29tbWFuZCBvbmx5IGlmIGVucXVldWVfY21kIGlzIHRydWUKKwkgKiBzdGF0dXMgaXMgaW5kaWNhdGlvbiBvZiBzdWNjZXNzIG9yIGZhaWx1cmUgYW5kIHdpbGwgYmUgcmV0dXJuZWQgdG8KKwkgKiBjYWxsZWQgb2YgY3VycmVudCBmdW5jdGlvbiBpZiBjb21tYW5kIGlzIG5vdCBlbnF1ZXVlZCBkdWUgdG8ga2V5IHJlcQorCSAqIGJlaW5nIGxvY2FsCisJICovCisJc3RhdHVzID0gY3NyX3VwZGF0ZV9rZXlfY21kKHBNYWMsIHBTZXNzaW9uLCBwU2V0S2V5LAorCQkJCSAgICBwQ29tbWFuZCwgJmVucXVldWVfY21kKTsKKwlpZiAoZW5xdWV1ZV9jbWQpIHsKKwkJcENvbW1hbmQtPnUuc2V0S2V5Q21kLnJvYW1JZCA9IHJvYW1JZDsKKwkJcENvbW1hbmQtPnUuc2V0S2V5Q21kLmVuY1R5cGUgPSBwU2V0S2V5LT5lbmNUeXBlOworCQlwQ29tbWFuZC0+dS5zZXRLZXlDbWQua2V5RGlyZWN0aW9uID0gcFNldEtleS0+a2V5RGlyZWN0aW9uOworCQljZGZfbWVtX2NvcHkoJnBDb21tYW5kLT51LnNldEtleUNtZC5wZWVyTWFjLCAmcFNldEtleS0+cGVlck1hYywKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwkJLyogMCBmb3Igc3VwcGxpY2FudCAqLworCQlwQ29tbWFuZC0+dS5zZXRLZXlDbWQucGFlUm9sZSA9IHBTZXRLZXktPnBhZVJvbGU7CisJCXBDb21tYW5kLT51LnNldEtleUNtZC5rZXlJZCA9IHBTZXRLZXktPmtleUlkOworCQljZGZfbWVtX2NvcHkocENvbW1hbmQtPnUuc2V0S2V5Q21kLmtleVJzYywgcFNldEtleS0+a2V5UnNjLAorCQkJICAgICBDU1JfTUFYX1JTQ19MRU4pOworCQkvKgorCQkgKiBBbHdheXMgcHV0IHNldCBrZXkgdG8gdGhlIGhlYWQgb2YgdGhlIFEgYmVjYXVzZSBpdCBpcyB0aGUKKwkJICogb25seSB0aGluZyB0byBnZXQgZXhlY3V0ZWQgaW4gY2FzZSBvZiBXVF9LRVkgc3RhdGUKKwkJICovCisKKwkJc3RhdHVzID0gY3NyX3F1ZXVlX3NtZV9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCB0cnVlKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZCIpLCBzdGF0dXMpOworCQkJLyogdXBkYXRlIHRvIGZhbHNlIHNvIHRoYXQgY29tbWFuZCBjYW4gYmUgZnJlZWQgKi8KKwkJCWVucXVldWVfY21kID0gZmFsc2U7CisJCX0KKwl9CisKKwkvKgorCSAqIEZyZWUgdGhlIGNvbW1hbmQgaWYgZW5xdWV1ZV9jbWQgPT0gZmFsc2U6CisJICogdGhpcyBtZWFucyB0aGF0IGNvbW1hbmQgd2FzIG5vdCBlbnF1ZXVlZCBiZWNhdXNlIGVpdGhlciB0aGVyZSBoYXMKKwkgKiBiZWVuIGEgZmFpbHVyZSwgb3IgaXQgaXMgYSAibG9jYWwiIG9wZXJhdGlvbiBsaWtlIHRoZSBzZXQgRVNFIENDS00KKwkgKiBLUksga2V5LgorCSAqLworCWlmIChmYWxzZSA9PSBlbnF1ZXVlX2NtZCkKKwkJY3NyX3JlbGVhc2VfY29tbWFuZF9zZXRfa2V5KHBNYWMsIHBDb21tYW5kKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fcHJvY2Vzc19zZXRfa2V5X2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCBudW1LZXlzID0gKHBDb21tYW5kLT51LnNldEtleUNtZC5rZXlMZW5ndGgpID8gMSA6IDA7CisJdEFuaUVkVHlwZSBlZFR5cGUgPQorCQljc3JfdHJhbnNsYXRlX2VuY3J5cHRfdHlwZV90b19lZF90eXBlKHBDb21tYW5kLT51LnNldEtleUNtZC5lbmNUeXBlKTsKKwlib29sIGZVbmljYXN0ID0KKwkJKHBDb21tYW5kLT51LnNldEtleUNtZC5wZWVyTWFjWzBdID09IDB4RkYpID8gZmFsc2UgOiB0cnVlOworCXVpbnQzMl90IHNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfREVGKHNldEtleUV2ZW50LAorCQkJCSBob3N0X2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlKTsKKworCWlmIChOVUxMID09IHBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoZVNJUl9FRF9OT05FICE9IGVkVHlwZSkgeworCQljZGZfbWVtX3NldCgmc2V0S2V5RXZlbnQsCisJCQkgICAgc2l6ZW9mKGhvc3RfZXZlbnRfd2xhbl9zZWN1cml0eV9wYXlsb2FkX3R5cGUpLCAwKTsKKwkJaWYgKCooKHVpbnQ4X3QgKikgJnBDb21tYW5kLT51LnNldEtleUNtZC5wZWVyTWFjKSAmIDB4MDEpIHsKKwkJCXNldEtleUV2ZW50LmV2ZW50SWQgPSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1NFVF9HVEtfUkVROworCQkJc2V0S2V5RXZlbnQuZW5jcnlwdGlvbk1vZGVNdWx0aWNhc3QgPQorCQkJCSh1aW50OF90KSBkaWFnX2VuY190eXBlX2Zyb21fY3NyX3R5cGUocENvbW1hbmQtPnUuCisJCQkJCQkJCSAgICAgIHNldEtleUNtZC5lbmNUeXBlKTsKKwkJCXNldEtleUV2ZW50LmVuY3J5cHRpb25Nb2RlVW5pY2FzdCA9CisJCQkJKHVpbnQ4X3QpIGRpYWdfZW5jX3R5cGVfZnJvbV9jc3JfdHlwZShwU2Vzc2lvbi0+CisJCQkJCQkJCSAgICAgIGNvbm5lY3RlZFByb2ZpbGUuCisJCQkJCQkJCSAgICAgIEVuY3J5cHRpb25UeXBlKTsKKwkJfSBlbHNlIHsKKwkJCXNldEtleUV2ZW50LmV2ZW50SWQgPSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1NFVF9QVEtfUkVROworCQkJc2V0S2V5RXZlbnQuZW5jcnlwdGlvbk1vZGVVbmljYXN0ID0KKwkJCQkodWludDhfdCkgZGlhZ19lbmNfdHlwZV9mcm9tX2Nzcl90eXBlKHBDb21tYW5kLT51LgorCQkJCQkJCQkgICAgICBzZXRLZXlDbWQuZW5jVHlwZSk7CisJCQlzZXRLZXlFdmVudC5lbmNyeXB0aW9uTW9kZU11bHRpY2FzdCA9CisJCQkJKHVpbnQ4X3QpIGRpYWdfZW5jX3R5cGVfZnJvbV9jc3JfdHlwZShwU2Vzc2lvbi0+CisJCQkJCQkJCSAgICAgIGNvbm5lY3RlZFByb2ZpbGUuCisJCQkJCQkJCSAgICAgIG1jRW5jcnlwdGlvblR5cGUpOworCQl9CisJCWNkZl9tZW1fY29weShzZXRLZXlFdmVudC5ic3NpZCwKKwkJCSAgICAgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQuYnl0ZXMsCisJCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKwkJaWYgKENTUl9JU19FTkNfVFlQRV9TVEFUSUMocENvbW1hbmQtPnUuc2V0S2V5Q21kLmVuY1R5cGUpKSB7CisJCQl1aW50MzJfdCBkZWZLZXlJZDsKKwkJCS8qIEl0IGhhcyB0byBiZSBzdGF0aWMgV0VQIGhlcmUgKi8KKwkJCWlmIChJU19TSVJfU1RBVFVTX1NVQ0NFU1MKKwkJCQkgICAgKHdsYW5fY2ZnX2dldF9pbnQKKwkJCQkJICAgIChwTWFjLCBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlELCAmZGVmS2V5SWQpKSkgeworCQkJCXNldEtleUV2ZW50LmtleUlkID0gKHVpbnQ4X3QpIGRlZktleUlkOworCQkJfQorCQl9IGVsc2UgeworCQkJc2V0S2V5RXZlbnQua2V5SWQgPSBwQ29tbWFuZC0+dS5zZXRLZXlDbWQua2V5SWQ7CisJCX0KKwkJc2V0S2V5RXZlbnQuYXV0aE1vZGUgPQorCQkJKHVpbnQ4X3QpIGRpYWdfYXV0aF90eXBlX2Zyb21fY3NyX3R5cGUocFNlc3Npb24tPgorCQkJCQkJCSAgICAgICBjb25uZWN0ZWRQcm9maWxlLgorCQkJCQkJCSAgICAgICBBdXRoVHlwZSk7CisJCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmc2V0S2V5RXZlbnQsIEVWRU5UX1dMQU5fU0VDVVJJVFkpOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAqLworCWlmIChjc3JfaXNfc2V0X2tleV9hbGxvd2VkKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJc3RhdHVzID0gY3NyX3NlbmRfbWJfc2V0X2NvbnRleHRfcmVxX21zZyhwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICh1aW50OF90ICopICZwQ29tbWFuZC0+dS4KKwkJCQkJCQkgc2V0S2V5Q21kLnBlZXJNYWMsIG51bUtleXMsCisJCQkJCQkJIGVkVHlwZSwgZlVuaWNhc3QsCisJCQkJCQkJIHBDb21tYW5kLT51LnNldEtleUNtZC4KKwkJCQkJCQkga2V5RGlyZWN0aW9uLAorCQkJCQkJCSBwQ29tbWFuZC0+dS5zZXRLZXlDbWQua2V5SWQsCisJCQkJCQkJIHBDb21tYW5kLT51LnNldEtleUNtZC4KKwkJCQkJCQkga2V5TGVuZ3RoLAorCQkJCQkJCSBwQ29tbWFuZC0+dS5zZXRLZXlDbWQuS2V5LAorCQkJCQkJCSBwQ29tbWFuZC0+dS5zZXRLZXlDbWQuCisJCQkJCQkJIHBhZVJvbGUsCisJCQkJCQkJIHBDb21tYW5kLT51LnNldEtleUNtZC4KKwkJCQkJCQkga2V5UnNjKTsKKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR1csIEZMKCIgY2Fubm90IHByb2Nlc3Mgbm90IGNvbm5lY3RlZCIpKTsKKwkJLyogU2V0IHRoaXMgc3RhdHVzIHNvIHRoZSBlcnJvciBoYW5kbGluZyB0YWtlIGNhcmUgb2YgdGhlIGNhc2UuICovCisJCXN0YXR1cyA9IENERl9TVEFUVVNfQ1NSX1dST05HX1NUQVRFOworCX0KKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgZXJyb3Igc3RhdHVzICVkIiksIHN0YXR1cyk7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBOVUxMLAorCQkJCSAgICAgICBwQ29tbWFuZC0+dS5zZXRLZXlDbWQucm9hbUlkLAorCQkJCSAgICAgICBlQ1NSX1JPQU1fU0VUX0tFWV9DT01QTEVURSwKKwkJCQkgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCQlpZiAoZVNJUl9FRF9OT05FICE9IGVkVHlwZSkgeworCQkJaWYgKCooKHVpbnQ4X3QgKikgJnBDb21tYW5kLT51LnNldEtleUNtZC5wZWVyTWFjKSAmCisJCQkgICAgMHgwMSkgeworCQkJCXNldEtleUV2ZW50LmV2ZW50SWQgPQorCQkJCQlXTEFOX1NFQ1VSSVRZX0VWRU5UX1NFVF9HVEtfUlNQOworCQkJfSBlbHNlIHsKKwkJCQlzZXRLZXlFdmVudC5ldmVudElkID0KKwkJCQkJV0xBTl9TRUNVUklUWV9FVkVOVF9TRVRfUFRLX1JTUDsKKwkJCX0KKwkJCXNldEtleUV2ZW50LnN0YXR1cyA9IFdMQU5fU0VDVVJJVFlfU1RBVFVTX0ZBSUxVUkU7CisJCQlXTEFOX0hPU1RfRElBR19FVkVOVF9SRVBPUlQoJnNldEtleUV2ZW50LAorCQkJCQkJICAgIEVWRU5UX1dMQU5fU0VDVVJJVFkpOworCQl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IgKi8KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9zZXRfa2V5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCSAgICB0Q3NyUm9hbVNldEtleSAqcFNldEtleSwgdWludDMyX3Qgcm9hbUlkKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKCFjc3JfaXNfc2V0X2tleV9hbGxvd2VkKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19DU1JfV1JPTkdfU1RBVEU7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0KKwkJCWNzcl9yb2FtX2lzc3VlX3NldF9rZXlfY29tbWFuZChwTWFjLCBzZXNzaW9uSWQsIHBTZXRLZXksIHJvYW1JZCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICBQcmVwYXJlIGEgZmlsdGVyIGJhc2Ugb24gYSBwcm9maWxlIGZvciBwYXJzaW5nIHRoZSBzY2FuIHJlc3VsdHMuCisgICBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBjYWxsZXIgTVVTVCBjYWxsIGNzcl9mcmVlX3NjYW5fZmlsdGVyIG9uCisgICBwU2NhbkZpbHRlciB3aGVuIGl0IGlzIGRvbmUgd2l0aCB0aGUgZmlsdGVyLgorICovCitDREZfU1RBVFVTCitjc3Jfcm9hbV9wcmVwYXJlX2ZpbHRlcl9mcm9tX3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgICAgIHRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSwKKwkJCQkgICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpzY2FuX2ZsdHIpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdWludDMyX3Qgc2l6ZSA9IDA7CisJdWludDhfdCBpZHggPSAwOworCXRDc3JDaGFubmVsSW5mbyAqZmx0cl9jaF9pbmZvID0gJnNjYW5fZmx0ci0+Q2hhbm5lbEluZm87CisJdENzckNoYW5uZWxJbmZvICpwcm9maWxlX2NoX2luZm8gPSAmcHJvZmlsZS0+Q2hhbm5lbEluZm87CisJc3RydWN0IHJvYW1fZXh0X3BhcmFtcyAqcm9hbV9wYXJhbXM7CisJdWludDhfdCBpOworCisJcm9hbV9wYXJhbXMgPSAmbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5yb2FtX3BhcmFtczsKKworCWlmIChwcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHMpIHsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSAqIHByb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEczsKKwkJc2Nhbl9mbHRyLT5CU1NJRHMuYnNzaWQgPSBjZGZfbWVtX21hbGxvYyhzaXplKTsKKwkJaWYgKE5VTEwgPT0gc2Nhbl9mbHRyLT5CU1NJRHMuYnNzaWQpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWdvdG8gZnJlZV9maWx0ZXI7CisJCX0KKwkJc2Nhbl9mbHRyLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSBwcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHM7CisJCWNkZl9tZW1fY29weShzY2FuX2ZsdHItPkJTU0lEcy5ic3NpZCwKKwkJCSAgICAgcHJvZmlsZS0+QlNTSURzLmJzc2lkLCBzaXplKTsKKwl9CisKKwlpZiAocHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcykgeworCQlpZiAoIUNTUl9JU19XRFNfU1RBKHByb2ZpbGUpKSB7CisJCQlzY2FuX2ZsdHItPlNTSURzLm51bU9mU1NJRHMgPSBwcm9maWxlLT5TU0lEcy5udW1PZlNTSURzOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEZvciBXRFMgc3RhdGlvbiB3ZSBhbHdheXMgdXNlIGlkeCAxIGZvciBzZWxmIFNTSUQuCisJCQkgKiBJbmRleCAwIGZvciBwZWVyJ3MgU1NJRCB0aGF0IHdlIHdhbnQgdG8gam9pbgorCQkJICovCisJCQlzY2FuX2ZsdHItPlNTSURzLm51bU9mU1NJRHMgPSAxOworCQl9CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJRkwoIk5vIG9mIEFsbG93ZWQgTGlzdDolZCIpLAorCQkJcm9hbV9wYXJhbXMtPm51bV9zc2lkX2FsbG93ZWRfbGlzdCk7CisJCWlmIChzY2FuX2ZsdHItPnNjYW5fZmlsdGVyX2Zvcl9yb2FtCisJCQkmJiByb2FtX3BhcmFtcy0+bnVtX3NzaWRfYWxsb3dlZF9saXN0KSB7CisJCQlzY2FuX2ZsdHItPlNTSURzLm51bU9mU1NJRHMgPQorCQkJCXJvYW1fcGFyYW1zLT5udW1fc3NpZF9hbGxvd2VkX2xpc3Q7CisJCQlzaXplID0gc2l6ZW9mKHRDc3JTU0lESW5mbykgKgorCQkJCXNjYW5fZmx0ci0+U1NJRHMubnVtT2ZTU0lEczsKKwkJCXNjYW5fZmx0ci0+U1NJRHMuU1NJRExpc3QgPSBjZGZfbWVtX21hbGxvYyhzaXplKTsKKwkJCWlmIChOVUxMID09IHNjYW5fZmx0ci0+U1NJRHMuU1NJRExpc3QpCisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQllbHNlCisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCQlnb3RvIGZyZWVfZmlsdGVyOworCQkJZm9yICAoaSA9IDA7CisJCQkJaSA8IHJvYW1fcGFyYW1zLT5udW1fc3NpZF9hbGxvd2VkX2xpc3Q7CisJCQkJaSsrKSB7CisJCQkJY2RmX21lbV9jb3B5KCh2b2lkICopCisJCQkJICAgIHNjYW5fZmx0ci0+U1NJRHMuU1NJRExpc3RbaV0uU1NJRC5zc0lkLAorCQkJCSAgICByb2FtX3BhcmFtcy0+c3NpZF9hbGxvd2VkX2xpc3RbaV0uc3NJZCwKKwkJCQkgICAgcm9hbV9wYXJhbXMtPnNzaWRfYWxsb3dlZF9saXN0W2ldLmxlbmd0aCk7CisJCQkJc2Nhbl9mbHRyLT5TU0lEcy5TU0lETGlzdFtpXS5TU0lELmxlbmd0aCA9CisJCQkJICAgIHJvYW1fcGFyYW1zLT5zc2lkX2FsbG93ZWRfbGlzdFtpXS5sZW5ndGg7CisJCQkJc2Nhbl9mbHRyLT5TU0lEcy5TU0lETGlzdFtpXS5oYW5kb2ZmUGVybWl0dGVkID0KKwkJCQkJMTsKKwkJCQlzY2FuX2ZsdHItPlNTSURzLlNTSURMaXN0W2ldLnNzaWRIaWRkZW4gPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJc2l6ZSA9IHNpemVvZih0Q3NyU1NJREluZm8pICoKKwkJCQlwcm9maWxlLT5TU0lEcy5udW1PZlNTSURzOworCQkJc2Nhbl9mbHRyLT5TU0lEcy5TU0lETGlzdCA9IGNkZl9tZW1fbWFsbG9jKHNpemUpOworCQkJaWYgKE5VTEwgPT0gc2Nhbl9mbHRyLT5TU0lEcy5TU0lETGlzdCkgeworCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCQlnb3RvIGZyZWVfZmlsdGVyOworCQkJfQorCQkJY2RmX21lbV9jb3B5KHNjYW5fZmx0ci0+U1NJRHMuU1NJRExpc3QsCisJCQkJCXByb2ZpbGUtPlNTSURzLlNTSURMaXN0LCBzaXplKTsKKwkJfQorCX0KKworCWlmICghcHJvZmlsZV9jaF9pbmZvLT5DaGFubmVsTGlzdAorCSAgICB8fCAocHJvZmlsZV9jaF9pbmZvLT5DaGFubmVsTGlzdFswXSA9PSAwKSkgeworCQlmbHRyX2NoX2luZm8tPm51bU9mQ2hhbm5lbHMgPSAwOworCQlmbHRyX2NoX2luZm8tPkNoYW5uZWxMaXN0ID0gTlVMTDsKKwl9IGVsc2UgaWYgKHByb2ZpbGVfY2hfaW5mby0+bnVtT2ZDaGFubmVscykgeworCQlmbHRyX2NoX2luZm8tPm51bU9mQ2hhbm5lbHMgPSAwOworCQlmbHRyX2NoX2luZm8tPkNoYW5uZWxMaXN0ID0KKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZigqKGZsdHJfY2hfaW5mby0+Q2hhbm5lbExpc3QpKSAqCisJCQkJICAgICAgIHByb2ZpbGVfY2hfaW5mby0+bnVtT2ZDaGFubmVscyk7CisJCWlmIChOVUxMID09IGZsdHJfY2hfaW5mby0+Q2hhbm5lbExpc3QpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWdvdG8gZnJlZV9maWx0ZXI7CisJCX0KKworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHByb2ZpbGVfY2hfaW5mby0+bnVtT2ZDaGFubmVsczsgaWR4KyspIHsKKwkJCWlmIChjc3Jfcm9hbV9pc19jaGFubmVsX3ZhbGlkKG1hY19jdHgsCisJCQkJcHJvZmlsZV9jaF9pbmZvLT5DaGFubmVsTGlzdFtpZHhdKSkgeworCQkJCWZsdHJfY2hfaW5mby0+CisJCQkJQ2hhbm5lbExpc3RbZmx0cl9jaF9pbmZvLT5udW1PZkNoYW5uZWxzXQorCQkJCQk9IHByb2ZpbGVfY2hfaW5mby0+Q2hhbm5lbExpc3RbaWR4XTsKKwkJCQlmbHRyX2NoX2luZm8tPm51bU9mQ2hhbm5lbHMrKzsKKwkJCX0gZWxzZSB7CisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJCQlGTCgiQ2hhbm5lbCAoJWQpIGlzIGludmFsaWQiKSwKKwkJCQkJcHJvZmlsZV9jaF9pbmZvLT5DaGFubmVsTGlzdFtpZHhdKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkNoYW5uZWwgbGlzdCBlbXB0eSIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZnJlZV9maWx0ZXI7CisJfQorCXNjYW5fZmx0ci0+dWFwc2RfbWFzayA9IHByb2ZpbGUtPnVhcHNkX21hc2s7CisJc2Nhbl9mbHRyLT5hdXRoVHlwZSA9IHByb2ZpbGUtPkF1dGhUeXBlOworCXNjYW5fZmx0ci0+RW5jcnlwdGlvblR5cGUgPSBwcm9maWxlLT5FbmNyeXB0aW9uVHlwZTsKKwlzY2FuX2ZsdHItPm1jRW5jcnlwdGlvblR5cGUgPSBwcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlOworCXNjYW5fZmx0ci0+QlNTVHlwZSA9IHByb2ZpbGUtPkJTU1R5cGU7CisJc2Nhbl9mbHRyLT5waHlNb2RlID0gcHJvZmlsZS0+cGh5TW9kZTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCS8qCisJICogY2hlY2sgaWYgdXNlciBhc2tlZCBmb3IgV0FQSSB3aXRoIDExbiBvciBhdXRvIG1vZGUsIGluIHRoYXQKKwkgKiBjYXNlIG1vZGlmeSB0aGUgcGh5bW9kZSB0byAxMWcKKwkgKi8KKwlpZiAoY3NyX2lzX3Byb2ZpbGVfd2FwaShwcm9maWxlKSkgeworCQlpZiAoc2Nhbl9mbHRyLT5waHlNb2RlICYgZUNTUl9ET1QxMV9NT0RFXzExbikKKwkJCXNjYW5fZmx0ci0+cGh5TW9kZSAmPSB+ZUNTUl9ET1QxMV9NT0RFXzExbjsKKwkJaWYgKHNjYW5fZmx0ci0+cGh5TW9kZSAmIGVDU1JfRE9UMTFfTU9ERV9BVVRPKQorCQkJc2Nhbl9mbHRyLT5waHlNb2RlICY9IH5lQ1NSX0RPVDExX01PREVfQVVUTzsKKwkJaWYgKCFzY2FuX2ZsdHItPnBoeU1vZGUpCisJCQlzY2FuX2ZsdHItPnBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFnOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCS8qU2F2ZSB0aGUgV1BTIGluZm8gKi8KKwlzY2FuX2ZsdHItPmJXUFNBc3NvY2lhdGlvbiA9IHByb2ZpbGUtPmJXUFNBc3NvY2lhdGlvbjsKKwlzY2FuX2ZsdHItPmJPU0VOQXNzb2NpYXRpb24gPSBwcm9maWxlLT5iT1NFTkFzc29jaWF0aW9uOworCWlmIChwcm9maWxlLT5jb3VudHJ5Q29kZVswXSkgeworCQkvKgorCQkgKiBUaGlzIGNhdXNlcyB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24gdG8gdXNlIGNvdW50cnlDb2RlIGFzIG9uZQorCQkgKiBvZiB0aGUgY3JpdGVyaWEuCisJCSAqLworCQljZGZfbWVtX2NvcHkoc2Nhbl9mbHRyLT5jb3VudHJ5Q29kZSwgcHJvZmlsZS0+Y291bnRyeUNvZGUsCisJCQkgICAgIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTik7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJaWYgKHByb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQpIHsKKwkJc2Nhbl9mbHRyLT5NRElELm1kaWVQcmVzZW50ID0gMTsKKwkJc2Nhbl9mbHRyLT5NRElELm1vYmlsaXR5RG9tYWluID0gcHJvZmlsZS0+TURJRC5tb2JpbGl0eURvbWFpbjsKKwl9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkvKiBNYW5hZ2VtZW50IEZyYW1lIFByb3RlY3Rpb24gKi8KKwlzY2FuX2ZsdHItPk1GUEVuYWJsZWQgPSBwcm9maWxlLT5NRlBFbmFibGVkOworCXNjYW5fZmx0ci0+TUZQUmVxdWlyZWQgPSBwcm9maWxlLT5NRlBSZXF1aXJlZDsKKwlzY2FuX2ZsdHItPk1GUENhcGFibGUgPSBwcm9maWxlLT5NRlBDYXBhYmxlOworI2VuZGlmCisJc2Nhbl9mbHRyLT5jc3JQZXJzb25hID0gcHJvZmlsZS0+Y3NyUGVyc29uYTsKKworZnJlZV9maWx0ZXI6CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJY3NyX2ZyZWVfc2Nhbl9maWx0ZXIobWFjX2N0eCwgc2Nhbl9mbHRyKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2Jvb2wgY3NyX3JvYW1faXNzdWVfd21fc3RhdHVzX2NoYW5nZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgICBlQ3NyUm9hbVdtU3RhdHVzQ2hhbmdlVHlwZXMgVHlwZSwKKwkJCQkgICAgIHRTaXJTbWVSc3AgKnBTbWVSc3ApCit7CisJYm9vbCBmQ29tbWFuZFF1ZXVlZCA9IGZhbHNlOworCXRTbWVDbWQgKnBDb21tYW5kOworCWRvIHsKKwkJLyogVmFsaWRhdGUgdGhlIHR5cGUgaXMgb2suLi4gKi8KKwkJaWYgKChlQ3NyRGlzYXNzb2NpYXRlZCAhPSBUeXBlKQorCQkgICAgJiYgKGVDc3JEZWF1dGhlbnRpY2F0ZWQgIT0gVHlwZSkpCisJCQlicmVhazsKKwkJcENvbW1hbmQgPSBjc3JfZ2V0X2NvbW1hbmRfYnVmZmVyKHBNYWMpOworCQlpZiAoIXBDb21tYW5kKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXIiKSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBDaGFuZ2UgdGhlIHN1YnN0YXRlIGluIGNhc2UgaXQgaXMgd2FpdGluZyBmb3Iga2V5ICovCisJCWlmIChDU1JfSVNfV0FJVF9GT1JfS0VZKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCWNzcl9yb2FtX3N0b3Bfd2FpdF9mb3Jfa2V5X3RpbWVyKHBNYWMpOworCQkJY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9OT05FLAorCQkJCQkJIHNlc3Npb25JZCk7CisJCX0KKwkJcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFdtU3RhdHVzQ2hhbmdlOworCQlwQ29tbWFuZC0+c2Vzc2lvbklkID0gKHVpbnQ4X3QpIHNlc3Npb25JZDsKKwkJcENvbW1hbmQtPnUud21TdGF0dXNDaGFuZ2VDbWQuVHlwZSA9IFR5cGU7CisJCWlmIChlQ3NyRGlzYXNzb2NpYXRlZCA9PSBUeXBlKSB7CisJCQljZGZfbWVtX2NvcHkoJnBDb21tYW5kLT51LndtU3RhdHVzQ2hhbmdlQ21kLnUuCisJCQkJICAgICBEaXNhc3NvY0luZE1zZywgcFNtZVJzcCwKKwkJCQkgICAgIHNpemVvZihwQ29tbWFuZC0+dS53bVN0YXR1c0NoYW5nZUNtZC51LgorCQkJCQkgICAgRGlzYXNzb2NJbmRNc2cpKTsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fY29weSgmcENvbW1hbmQtPnUud21TdGF0dXNDaGFuZ2VDbWQudS4KKwkJCQkgICAgIERlYXV0aEluZE1zZywgcFNtZVJzcCwKKwkJCQkgICAgIHNpemVvZihwQ29tbWFuZC0+dS53bVN0YXR1c0NoYW5nZUNtZC51LgorCQkJCQkgICAgRGVhdXRoSW5kTXNnKSk7CisJCX0KKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgIChjc3JfcXVldWVfc21lX2NvbW1hbmQocE1hYywgcENvbW1hbmQsIHRydWUpKSkgeworCQkJZkNvbW1hbmRRdWV1ZWQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlICIpKTsKKwkJCWNzcl9yZWxlYXNlX2NvbW1hbmRfd21fc3RhdHVzX2NoYW5nZShwTWFjLCBwQ29tbWFuZCk7CisJCX0KKworCQkvKiBBUCBoYXMgaXNzdWVkIERpc3NhYy9EZWF1dGgsIFNldCB0aGUgb3BlcmF0aW5nIG1vZGUgdmFsdWUgdG8gY29uZmlndXJlZCB2YWx1ZSAqLworCQljc3Jfc2V0X2RlZmF1bHRfZG90MTFfbW9kZShwTWFjKTsKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gZkNvbW1hbmRRdWV1ZWQ7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9zZW5kX3Nucl9yZXF1ZXN0KHZvaWQgKnBHZXRSc3NpUmVxKQoreworCXZvaWQgKndtYV9oYW5kbGU7CisKKwl3bWFfaGFuZGxlID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoIXdtYV9oYW5kbGUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIndtYV9oYW5kbGUgaXMgTlVMTCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQl3bWFfc2VuZF9zbnJfcmVxdWVzdCh3bWFfaGFuZGxlLCBwR2V0UnNzaVJlcSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiRmFpbGVkIHRvIFRyaWdnZXIgd21hIHN0YXRzIHJlcXVlc3QiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIGRvbnQgc2VuZCBzdWNjZXNzLCBvdGhlcndpc2UgY2FsbCBiYWNrCisJICogd2lsbCByZWxlYXNlZCB3aXRoIG91dCB2YWx1ZXMgKi8KKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0JVU1k7Cit9CisKK3N0YXRpYyB2b2lkIGNzcl91cGRhdGVfcnNzaSh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnKQoreworCWludDhfdCByc3NpID0gMDsKKwl0QW5pR2V0UnNzaVJlcSAqcEdldFJzc2lSZXEgPSAodEFuaUdldFJzc2lSZXEgKikgcE1zZzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaWYgKHBHZXRSc3NpUmVxKSB7CisJCWlmIChOVUxMICE9IHBHZXRSc3NpUmVxLT5wX2Nkc19jb250ZXh0KSB7CisJCQljZGZfc3RhdHVzID0gY3NyX3NlbmRfc25yX3JlcXVlc3QocEdldFJzc2lSZXEpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJwR2V0UnNzaVJlcS0+cF9jZHNfY29udGV4dCBpcyBOVUxMIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKE5VTEwgIT0gcEdldFJzc2lSZXEtPnJzc2lDYWxsYmFjaykgeworCQkJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19FX0JVU1kpCisJCQkJKCh0Q3NyUnNzaUNhbGxiYWNrKSAocEdldFJzc2lSZXEtPnJzc2lDYWxsYmFjaykpCisJCQkJCShyc3NpLCBwR2V0UnNzaVJlcS0+c3RhSWQsCisJCQkJCXBHZXRSc3NpUmVxLT5wRGV2Q29udGV4dCk7CisJCQllbHNlCisJCQkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJCQlGTAorCQkJCQkJKCJyc3NpIHJlcXVlc3QgaXMgcG9zdGVkLiB3YWl0aW5nIGZvciByZXBseSIpKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgicEdldFJzc2lSZXEtPnJzc2lDYWxsYmFjayBpcyBOVUxMIikpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgicEdldFJzc2lSZXEgaXMgTlVMTCIpKTsKKwl9CisJcmV0dXJuOworCit9CisKK3N0YXRpYyB2b2lkIGNzcl91cGRhdGVfc25yKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2cpCit7CisJdEFuaUdldFNuclJlcSAqcEdldFNuclJlcSA9ICh0QW5pR2V0U25yUmVxICopIHBNc2c7CisKKwlpZiAocEdldFNuclJlcSkgeworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHdtYV9nZXRfc25yKHBHZXRTbnJSZXEpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJFcnJvciBpbiB3bWFfZ2V0X3NuciIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgicEdldFNuclJlcSBpcyBOVUxMIikpOworCX0KKwlyZXR1cm47Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCit2b2lkIGNzcl90c21fc3RhdHNfcnNwX3Byb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnKQoreworCXRBbmlHZXRUc21TdGF0c1JzcCAqcFRzbVN0YXRzUnNwID0gKHRBbmlHZXRUc21TdGF0c1JzcCAqKSBwTXNnOworCisJaWYgKE5VTEwgIT0gcFRzbVN0YXRzUnNwKSB7CisJCS8qIEdldCByb2FtIFJzc2kgcmVxdWVzdCBpcyBiYWNrZWQgdXAgYW5kIHBhc3NlZCBiYWNrIHRvIHRoZSByZXNwb25zZSwKKwkJICAgRXh0cmFjdCB0aGUgcmVxdWVzdCBtZXNzYWdlIHRvIGZldGNoIGNhbGxiYWNrICovCisJCXRwQW5pR2V0VHNtU3RhdHNSZXEgcmVxQmtwCisJCQk9ICh0QW5pR2V0VHNtU3RhdHNSZXEgKikgcFRzbVN0YXRzUnNwLT50c21TdGF0c1JlcTsKKworCQlpZiAoTlVMTCAhPSByZXFCa3ApIHsKKwkJCWlmIChOVUxMICE9IHJlcUJrcC0+dHNtU3RhdHNDYWxsYmFjaykgeworCQkJCSgodENzclRzbVN0YXRzQ2FsbGJhY2spCisJCQkJIChyZXFCa3AtPnRzbVN0YXRzQ2FsbGJhY2spKShwVHNtU3RhdHNSc3AtPgorCQkJCQkJCSAgICAgdHNtTWV0cmljcywKKwkJCQkJCQkgICAgIHBUc21TdGF0c1JzcC0+CisJCQkJCQkJICAgICBzdGFJZCwKKwkJCQkJCQkgICAgIHJlcUJrcC0+CisJCQkJCQkJICAgICBwRGV2Q29udGV4dCk7CisJCQkJcmVxQmtwLT50c21TdGF0c0NhbGxiYWNrID0gTlVMTDsKKwkJCX0KKwkJCWNkZl9tZW1fZnJlZShyZXFCa3ApOworCQkJcFRzbVN0YXRzUnNwLT50c21TdGF0c1JlcSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJyZXFCa3AgaXMgTlVMTCIpKTsKKwkJCWlmIChOVUxMICE9IHJlcUJrcCkgeworCQkJCWNkZl9tZW1fZnJlZShyZXFCa3ApOworCQkJCXBUc21TdGF0c1JzcC0+dHNtU3RhdHNSZXEgPSBOVUxMOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgicFRzbVN0YXRzUnNwIGlzIE5VTEwiKSk7CisJfQorCXJldHVybjsKK30KKwordm9pZCBjc3Jfc2VuZF9lc2VfYWRqYWNlbnRfYXBfcmVwX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uKQoreworCXVpbnQzMl90IHJvYW1UUzIgPSAwOworCXRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKwl0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5ID0gTlVMTDsKKwl1aW50OF90IHNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJwU2Vzc2lvbiBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJcm9hbVRTMiA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKKwlyb2FtSW5mby50c21Sb2FtRGVsYXkgPSByb2FtVFMyIC0gcFNlc3Npb24tPnJvYW1UUzE7CisJc21zX2xvZyhwTWFjLCBMT0cxLCAiQnNzaWQoIiBNQUNfQUREUkVTU19TVFIgIikgUm9hbWluZyBEZWxheSgldSBtcykiLAorCQlNQUNfQUREUl9BUlJBWShwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZC5ieXRlcyksCisJCXJvYW1JbmZvLnRzbVJvYW1EZWxheSk7CisKKwlwU2Vzc2lvbkVudHJ5ID0gcGVfZmluZF9zZXNzaW9uX2J5X2Jzc2lkKHBNYWMsCisJCQkJCSBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZC5ieXRlcywKKwkJCQkJICZzZXNzaW9uSWQpOworCWlmIChOVUxMID09IHBTZXNzaW9uRW50cnkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCXBTZXNzaW9uRW50cnktPmVzZUNvbnRleHQudHNtLnRzbU1ldHJpY3MuUm9hbWluZ0RseQorCQk9IHJvYW1JbmZvLnRzbVJvYW1EZWxheTsKKworCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgcFNlc3Npb24tPnNlc3Npb25JZCwgJnJvYW1JbmZvLAorCQkJICAgICAgIDAsIGVDU1JfUk9BTV9FU0VfQURKX0FQX1JFUE9SVF9JTkQsIDApOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKworQ0RGX1NUQVRVUyBjc3Jfc2VuZF9yZXNldF9hcF9jYXBzX2NoYW5nZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgKmJzc0lkKQoreworCXRwU2lyUmVzZXRBUENhcHNDaGFuZ2UgcE1zZzsKKwl1aW50MTZfdCBsZW47CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkvKiBDcmVhdGUgdGhlIG1lc3NhZ2UgYW5kIHNlbmQgdG8gbGltICovCisJbGVuID0gc2l6ZW9mKHRTaXJSZXNldEFQQ2Fwc0NoYW5nZSk7CisJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKGxlbik7CisJaWYgKE5VTEwgPT0gcE1zZykKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCWVsc2UKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljZGZfbWVtX3NldChwTXNnLCBzaXplb2YodFNpclJlc2V0QVBDYXBzQ2hhbmdlKSwgMCk7CisJCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfUkVTRVRfQVBfQ0FQU19DSEFOR0VEOworCQlwTXNnLT5sZW5ndGggPSBsZW47CisJCWNkZl9tZW1fY29weShwTXNnLT5ic3NJZCwgYnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQlGTCgiQ1NSIHJlc2V0IGNhcHMgY2hhbmdlIGZvciBCc3NpZD0gIiBNQUNfQUREUkVTU19TVFIpLAorCQkJTUFDX0FERFJfQVJSQVkocE1zZy0+YnNzSWQpKTsKKwkJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkCitjc3Jfcm9hbV9jaGtfbG5rX2Fzc29jX2luZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U2lyU21lUnNwICptc2dfcHRyKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbjsKKwl1aW50MzJfdCBzZXNzaW9uSWQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworCUNERl9TVEFUVVMgc3RhdHVzOworCXRDc3JSb2FtSW5mbyAqcm9hbV9pbmZvX3B0ciA9IE5VTEw7CisJdFNpclNtZUFzc29jSW5kICpwQXNzb2NJbmQ7CisJdENzclJvYW1JbmZvIHJvYW1faW5mbzsKKwljZGZfbWVtX3NldCgmcm9hbV9pbmZvLCBzaXplb2Yocm9hbV9pbmZvKSwgMCk7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsIEZMKCJSZWNlaXZlIFdOSV9TTUVfQVNTT0NfSU5EIGZyb20gU01FIikpOworCXBBc3NvY0luZCA9ICh0U2lyU21lQXNzb2NJbmQgKikgbXNnX3B0cjsKKwlzdGF0dXMgPSBjc3Jfcm9hbV9nZXRfc2Vzc2lvbl9pZF9mcm9tX2Jzc2lkKG1hY19jdHgsCisJCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgcEFzc29jSW5kLT5ic3NJZCwgJnNlc3Npb25JZCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCQlGTCgiQ291bGRuJ3QgZmluZCBzZXNzaW9uX2lkIGZvciBnaXZlbiBCU1NJRCIpKTsKKwkJcmV0dXJuOworCX0KKwlzZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25JZCk7CisJaWYgKCFzZXNzaW9uKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisJcm9hbV9pbmZvX3B0ciA9ICZyb2FtX2luZm87CisJLyogUmVxdWlyZWQgZm9yIGluZGljYXRpbmcgdGhlIGZyYW1lcyB0byB1cHBlciBsYXllciAqLworCXJvYW1faW5mb19wdHItPmFzc29jUmVxTGVuZ3RoID0gcEFzc29jSW5kLT5hc3NvY1JlcUxlbmd0aDsKKwlyb2FtX2luZm9fcHRyLT5hc3NvY1JlcVB0ciA9IHBBc3NvY0luZC0+YXNzb2NSZXFQdHI7CisJcm9hbV9pbmZvX3B0ci0+YmVhY29uUHRyID0gcEFzc29jSW5kLT5iZWFjb25QdHI7CisJcm9hbV9pbmZvX3B0ci0+YmVhY29uTGVuZ3RoID0gcEFzc29jSW5kLT5iZWFjb25MZW5ndGg7CisJcm9hbV9pbmZvX3B0ci0+c3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJcm9hbV9pbmZvX3B0ci0+dS5wQ29ubmVjdGVkUHJvZmlsZSA9ICZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCXJvYW1faW5mb19wdHItPnN0YUlkID0gKHVpbnQ4X3QpIHBBc3NvY0luZC0+c3RhSWQ7CisJcm9hbV9pbmZvX3B0ci0+cnNuSUVMZW4gPSAodWludDhfdCkgcEFzc29jSW5kLT5yc25JRS5sZW5ndGg7CisJcm9hbV9pbmZvX3B0ci0+cHJzbklFID0gcEFzc29jSW5kLT5yc25JRS5yc25JRWRhdGE7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwlyb2FtX2luZm9fcHRyLT53YXBpSUVMZW4gPSAodWludDhfdCkgcEFzc29jSW5kLT53YXBpSUUubGVuZ3RoOworCXJvYW1faW5mb19wdHItPnB3YXBpSUUgPSBwQXNzb2NJbmQtPndhcGlJRS53YXBpSUVkYXRhOworI2VuZGlmCisJcm9hbV9pbmZvX3B0ci0+YWRkSUVMZW4gPSAodWludDhfdCkgcEFzc29jSW5kLT5hZGRJRS5sZW5ndGg7CisJcm9hbV9pbmZvX3B0ci0+cGFkZElFID0gcEFzc29jSW5kLT5hZGRJRS5hZGRJRWRhdGE7CisJY2RmX21lbV9jb3B5KHJvYW1faW5mb19wdHItPnBlZXJNYWMuYnl0ZXMsCisJCSAgICAgcEFzc29jSW5kLT5wZWVyTWFjQWRkciwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwljZGZfbWVtX2NvcHkocm9hbV9pbmZvX3B0ci0+YnNzaWQuYnl0ZXMsCisJCSAgICAgcEFzc29jSW5kLT5ic3NJZCwKKwkJICAgICBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCXJvYW1faW5mb19wdHItPndtbUVuYWJsZWRTdGEgPSBwQXNzb2NJbmQtPndtbUVuYWJsZWRTdGE7CisJcm9hbV9pbmZvX3B0ci0+dGltaW5nTWVhc0NhcCA9IHBBc3NvY0luZC0+dGltaW5nTWVhc0NhcDsKKwljZGZfbWVtX2NvcHkoJnJvYW1faW5mb19wdHItPmNoYW5faW5mbywKKwkJICAgICAmcEFzc29jSW5kLT5jaGFuX2luZm8sCisJCSAgICAgc2l6ZW9mKHRTaXJTbWVDaGFuSW5mbykpOworCWlmIChDU1JfSVNfV0RTX0FQKHJvYW1faW5mb19wdHItPnUucENvbm5lY3RlZFByb2ZpbGUpKQorCQlzdGF0dXMgPSBjc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25JZCwKKwkJCQkJcm9hbV9pbmZvX3B0ciwgMCwgZUNTUl9ST0FNX1dEU19JTkQsCisJCQkJCWVDU1JfUk9BTV9SRVNVTFRfV0RTX0FTU09DSUFUSU9OX0lORCk7CisJaWYgKENTUl9JU19JTkZSQV9BUChyb2FtX2luZm9fcHRyLT51LnBDb25uZWN0ZWRQcm9maWxlKSkgeworCQlpZiAoc2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlICYmCisJCSAgICBDU1JfSVNfRU5DX1RZUEVfU1RBVElDKAorCQkJc2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSkpIHsKKwkJCS8qIE5PIGtleXMuLi4gdGhlc2Uga2V5IHBhcmFtZXRlcnMgZG9uJ3QgbWF0dGVyLiAqLworCQkJY3NyX3JvYW1faXNzdWVfc2V0X2NvbnRleHRfcmVxKG1hY19jdHgsIHNlc3Npb25JZCwKKwkJCXNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUsCisJCQlzZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MsCisJCQkmKHJvYW1faW5mb19wdHItPnBlZXJNYWMuYnl0ZXMpLAorCQkJZmFsc2UsIHRydWUsIGVTSVJfVFhfUlgsIDAsIDAsIE5VTEwsIDApOworCQkJcm9hbV9pbmZvX3B0ci0+ZkF1dGhSZXF1aXJlZCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJcm9hbV9pbmZvX3B0ci0+ZkF1dGhSZXF1aXJlZCA9IHRydWU7CisJCX0KKwkJc3RhdHVzID0gY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uSWQsCisJCQkJCXJvYW1faW5mb19wdHIsIDAsIGVDU1JfUk9BTV9JTkZSQV9JTkQsCisJCQkJCWVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfQVNTT0NJQVRJT05fSU5EKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCS8qIFJlZnVzZWQgZHVlIHRvIE1hYyBmaWx0ZXJpbmcgKi8KKwkJCXJvYW1faW5mb19wdHItPnN0YXR1c0NvZGUgPSBlU0lSX1NNRV9BU1NPQ19SRUZVU0VEOworCX0KKworCS8qIFNlbmQgQXNzb2NpYXRpb24gY29tcGxldGlvbiBtZXNzYWdlIHRvIFBFICovCisJc3RhdHVzID0gY3NyX3NlbmRfYXNzb2NfY25mX21zZyhtYWNfY3R4LCBwQXNzb2NJbmQsIHN0YXR1cyk7CisJLyoKKwkgKiBzZW5kIGEgbWVzc2FnZSB0byBDU1IgaXRzZWxmIGp1c3QgdG8gYXZvaWQgdGhlIEVBUE9MIGZyYW1lcyBnb2luZworCSAqIE9UQSBiZWZvcmUgYXNzb2NpYXRpb24gcmVzcG9uc2UKKwkgKi8KKwlpZiAoQ1NSX0lTX1dEU19BUChyb2FtX2luZm9fcHRyLT51LnBDb25uZWN0ZWRQcm9maWxlKSkgeworCQlzdGF0dXMgPSBjc3Jfc2VuZF9hc3NvY19pbmRfdG9fdXBwZXJfbGF5ZXJfY25mX21zZyhtYWNfY3R4LAorCQkJCQkJcEFzc29jSW5kLCBzdGF0dXMsIHNlc3Npb25JZCk7CisJfSBlbHNlIGlmIChDU1JfSVNfSU5GUkFfQVAocm9hbV9pbmZvX3B0ci0+dS5wQ29ubmVjdGVkUHJvZmlsZSkKKwkgICAgJiYgKHJvYW1faW5mb19wdHItPnN0YXR1c0NvZGUgIT0gZVNJUl9TTUVfQVNTT0NfUkVGVVNFRCkpIHsKKwkJcm9hbV9pbmZvX3B0ci0+ZlJlYXNzb2NSZXEgPSBwQXNzb2NJbmQtPnJlYXNzb2NSZXE7CisJCXN0YXR1cyA9IGNzcl9zZW5kX2Fzc29jX2luZF90b191cHBlcl9sYXllcl9jbmZfbXNnKG1hY19jdHgsCisJCQkJCQlwQXNzb2NJbmQsIHN0YXR1cywgc2Vzc2lvbklkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjc3Jfcm9hbV9jaGtfbG5rX2Rpc2Fzc29jX2luZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U2lyU21lUnNwICptc2dfcHRyKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbjsKKwl1aW50MzJfdCBzZXNzaW9uSWQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworCUNERl9TVEFUVVMgc3RhdHVzOworCXRDc3JSb2FtSW5mbyAqcm9hbV9pbmZvX3B0ciA9IE5VTEw7CisJdFNpclNtZURpc2Fzc29jSW5kICpwRGlzYXNzb2NJbmQ7CisJdFNtZUNtZCBjbWQ7CisJdENzclJvYW1JbmZvIHJvYW1faW5mbzsKKworCS8qCisJICogQ2hlY2sgaWYgQVAgZGlzLWFzc29jaWF0ZWQgdXMgYmVjYXVzZSBvZiBNSUMgZmFpbHVyZS4gSWYgc28sCisJICogdGhlbiB3ZSBuZWVkIHRvIHRha2UgYWN0aW9uIGltbWVkaWF0ZWx5IGFuZCBub3Qgd2FpdCB0aWxsIHRoZQorCSAqIHRoZSBXbVN0YXR1c0NoYW5nZSByZXF1ZXN0cyBpcyBwdXNoZWQgYW5kIHByb2Nlc3NlZAorCSAqLworCXBEaXNhc3NvY0luZCA9ICh0U2lyU21lRGlzYXNzb2NJbmQgKikgbXNnX3B0cjsKKwljZGZfbWVtX3NldCgmcm9hbV9pbmZvLCBzaXplb2Yocm9hbV9pbmZvKSwgMCk7CisJc3RhdHVzID0gY3NyX3JvYW1fZ2V0X3Nlc3Npb25faWRfZnJvbV9ic3NpZChtYWNfY3R4LAorCQkJCShzdHJ1Y3QgY2RmX21hY19hZGRyICopIHBEaXNhc3NvY0luZC0+YnNzSWQsICZzZXNzaW9uSWQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiU2Vzc2lvbiBJZCBub3QgZm91bmQgZm9yIEJTU0lEICIKKwkJCU1BQ19BRERSRVNTX1NUUiksIE1BQ19BRERSX0FSUkFZKHBEaXNhc3NvY0luZC0+YnNzSWQpKTsKKwkJcmV0dXJuOworCX0KKworCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJRkwoIkRJU0FTU09DSUFUSU9OIEluZGljYXRpb24gZnJvbSBNQUMgZm9yIHNlc3Npb24gJWQgIiksCisJCXNlc3Npb25JZCk7CisJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQlGTCgiRElTQVNTT0NJQVRJT04gZnJvbSBwZWVyID0iIE1BQ19BRERSRVNTX1NUUgorCQkgICAiICIgIiByZWFzb24gPSAlZCBzdGF0dXMgPSAlZCAiKSwKKwkJTUFDX0FERFJfQVJSQVkocERpc2Fzc29jSW5kLT5wZWVyTWFjQWRkciksCisJCXBEaXNhc3NvY0luZC0+cmVhc29uQ29kZSwKKwkJcERpc2Fzc29jSW5kLT5zdGF0dXNDb2RlKTsKKwkvKgorCSAqIElmIHdlIGFyZSBpbiBuZWlnaGJvciBwcmVhdXRoIGRvbmUgc3RhdGUgdGhlbiBvbiByZWNlaXZpbmcKKwkgKiBkaXNhc3NvYyBvciBkZWF1dGggd2UgZG9udCByb2FtIGluc3RlYWQgd2UganVzdCBkaXNhc3NvYworCSAqIGZyb20gY3VycmVudCBhcCBhbmQgdGhlbiBnbyB0byBkaXNjb25uZWN0ZWQgc3RhdGUKKwkgKiBUaGlzIGhhcHBlbnMgZm9yIEVTRSBhbmQgMTFyIEZUIGNvbm5lY3Rpb25zIE9OTFkuCisJICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAoY3NyX3JvYW1faXMxMXJfYXNzb2MobWFjX2N0eCwgc2Vzc2lvbklkKSAmJgorCSAgICAoY3NyX25laWdoYm9yX3JvYW1fc3RhdGVfcHJlYXV0aF9kb25lKG1hY19jdHgsIHNlc3Npb25JZCkpKQorCQljc3JfbmVpZ2hib3Jfcm9hbV90cmFuaXN0aW9uX3ByZWF1dGhfZG9uZV90b19kaXNjb25uZWN0ZWQoCisJCQkJCQkJbWFjX2N0eCwgc2Vzc2lvbklkKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwlpZiAoY3NyX3JvYW1faXNfZXNlX2Fzc29jKG1hY19jdHgsIHNlc3Npb25JZCkgJiYKKwkgICAgKGNzcl9uZWlnaGJvcl9yb2FtX3N0YXRlX3ByZWF1dGhfZG9uZShtYWNfY3R4LCBzZXNzaW9uSWQpKSkKKwkJY3NyX25laWdoYm9yX3JvYW1fdHJhbmlzdGlvbl9wcmVhdXRoX2RvbmVfdG9fZGlzY29ubmVjdGVkKAorCQkJCQkJCW1hY19jdHgsIHNlc3Npb25JZCk7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJaWYgKGNzcl9yb2FtX2lzX2Zhc3Rfcm9hbV9lbmFibGVkKG1hY19jdHgsIHNlc3Npb25JZCkgJiYKKwkgICAgKGNzcl9uZWlnaGJvcl9yb2FtX3N0YXRlX3ByZWF1dGhfZG9uZShtYWNfY3R4LCBzZXNzaW9uSWQpKSkKKwkJY3NyX25laWdoYm9yX3JvYW1fdHJhbmlzdGlvbl9wcmVhdXRoX2RvbmVfdG9fZGlzY29ubmVjdGVkKAorCQkJCQkJCW1hY19jdHgsIHNlc3Npb25JZCk7CisjZW5kaWYKKwlzZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25JZCk7CisJaWYgKCFzZXNzaW9uKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisJaWYgKGNzcl9pc19jb25uX3N0YXRlX2luZnJhKG1hY19jdHgsIHNlc3Npb25JZCkpCisJCXNlc3Npb24tPmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9OT1RfQ09OTkVDVEVEOworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKwlzbWVfcW9zX2Nzcl9ldmVudF9pbmQobWFjX2N0eCwgKHVpbnQ4X3QpIHNlc3Npb25JZCwKKwkJCSAgICAgIFNNRV9RT1NfQ1NSX0RJU0NPTk5FQ1RfSU5ELCBOVUxMKTsKKyNlbmRpZgorCWNzcl9yb2FtX2xpbmtfZG93bihtYWNfY3R4LCBzZXNzaW9uSWQpOworCWNzcl9yb2FtX2lzc3VlX3dtX3N0YXR1c19jaGFuZ2UobWFjX2N0eCwgc2Vzc2lvbklkLAorCQkJCQllQ3NyRGlzYXNzb2NpYXRlZCwgbXNnX3B0cik7CisJaWYgKENTUl9JU19JTkZSQV9BUCgmc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSkpIHsKKwkJcm9hbV9pbmZvX3B0ciA9ICZyb2FtX2luZm87CisJCXJvYW1faW5mb19wdHItPnN0YXR1c0NvZGUgPSBwRGlzYXNzb2NJbmQtPnN0YXR1c0NvZGU7CisJCXJvYW1faW5mb19wdHItPnJlYXNvbkNvZGUgPSBwRGlzYXNzb2NJbmQtPnJlYXNvbkNvZGU7CisJCXJvYW1faW5mb19wdHItPnUucENvbm5lY3RlZFByb2ZpbGUgPSAmc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZTsKKwkJcm9hbV9pbmZvX3B0ci0+c3RhSWQgPSAodWludDhfdCkgcERpc2Fzc29jSW5kLT5zdGFJZDsKKwkJY2RmX21lbV9jb3B5KHJvYW1faW5mb19wdHItPnBlZXJNYWMuYnl0ZXMsCisJCQkgICAgIHBEaXNhc3NvY0luZC0+cGVlck1hY0FkZHIsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQljZGZfbWVtX2NvcHkoJnJvYW1faW5mb19wdHItPmJzc2lkLmJ5dGVzLAorCQkJICAgICBwRGlzYXNzb2NJbmQtPmJzc0lkLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCQlzdGF0dXMgPSBjc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25JZCwKKwkJCQkJCXJvYW1faW5mb19wdHIsIDAsCisJCQkJCQllQ1NSX1JPQU1fSU5GUkFfSU5ELAorCQkJCQkJZUNTUl9ST0FNX1JFU1VMVF9ESVNBU1NPQ19JTkQpOworCQkvKgorCQkgKiBTVEEvUDJQIGNsaWVudCBnb3QgIGRpc2Fzc29jaWF0ZWQgc28gcmVtb3ZlIGFueSBwZW5kaW5nCisJCSAqIGRlYXV0aCBjb21tYW5kcyBpbiBzbWUgcGVuZGluZyBsaXN0CisJCSAqLworCQljbWQuY29tbWFuZCA9IGVTbWVDb21tYW5kUm9hbTsKKwkJY21kLnNlc3Npb25JZCA9ICh1aW50OF90KSBzZXNzaW9uSWQ7CisJCWNtZC51LnJvYW1DbWQucm9hbVJlYXNvbiA9IGVDc3JGb3JjZWREZWF1dGhTdGE7CisJCWNkZl9tZW1fY29weShjbWQudS5yb2FtQ21kLnBlZXJNYWMsCisJCQkgICAgIHBEaXNhc3NvY0luZC0+cGVlck1hY0FkZHIsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQljc3Jfcm9hbV9yZW1vdmVfZHVwbGljYXRlX2NvbW1hbmQobWFjX2N0eCwgc2Vzc2lvbklkLCAmY21kLAorCQkJCQkJICBlQ3NyRm9yY2VkRGVhdXRoU3RhKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjc3Jfcm9hbV9jaGtfbG5rX2RlYXV0aF9pbmQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdFNpclNtZVJzcCAqbXNnX3B0cikKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb247CisJdWludDMyX3Qgc2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0Q3NyUm9hbUluZm8gKnJvYW1faW5mb19wdHIgPSBOVUxMOworCXRTaXJTbWVEZWF1dGhJbmQgKnBEZWF1dGhJbmQ7CisJdENzclJvYW1JbmZvIHJvYW1faW5mbzsKKworCWNkZl9tZW1fc2V0KCZyb2FtX2luZm8sIHNpemVvZihyb2FtX2luZm8pLCAwKTsKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsIEZMKCJERUFVVEhFTlRJQ0FUSU9OIEluZGljYXRpb24gZnJvbSBNQUMiKSk7CisJcERlYXV0aEluZCA9ICh0cFNpclNtZURlYXV0aEluZCkgbXNnX3B0cjsKKwlzdGF0dXMgPSBjc3Jfcm9hbV9nZXRfc2Vzc2lvbl9pZF9mcm9tX2Jzc2lkKG1hY19jdHgsCisJCQkJCQkgICAoc3RydWN0IGNkZl9tYWNfYWRkciAqKSBwRGVhdXRoSW5kLT4KKwkJCQkJCSAgIGJzc0lkLCAmc2Vzc2lvbklkKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm47CisJLyogSWYgd2UgYXJlIGluIG5laWdoYm9yIHByZWF1dGggZG9uZSBzdGF0ZSB0aGVuIG9uIHJlY2VpdmluZworCSAqIGRpc2Fzc29jIG9yIGRlYXV0aCB3ZSBkb250IHJvYW0gaW5zdGVhZCB3ZSBqdXN0IGRpc2Fzc29jCisJICogZnJvbSBjdXJyZW50IGFwIGFuZCB0aGVuIGdvIHRvIGRpc2Nvbm5lY3RlZCBzdGF0ZQorCSAqIFRoaXMgaGFwcGVucyBmb3IgRVNFIGFuZCAxMXIgRlQgY29ubmVjdGlvbnMgT05MWS4KKwkgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWlmIChjc3Jfcm9hbV9pczExcl9hc3NvYyhtYWNfY3R4LCBzZXNzaW9uSWQpICYmCisJICAgIChjc3JfbmVpZ2hib3Jfcm9hbV9zdGF0ZV9wcmVhdXRoX2RvbmUobWFjX2N0eCwgc2Vzc2lvbklkKSkpCisJCWNzcl9uZWlnaGJvcl9yb2FtX3RyYW5pc3Rpb25fcHJlYXV0aF9kb25lX3RvX2Rpc2Nvbm5lY3RlZCgKKwkJCQkJCQltYWNfY3R4LCBzZXNzaW9uSWQpOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCWlmIChjc3Jfcm9hbV9pc19lc2VfYXNzb2MobWFjX2N0eCwgc2Vzc2lvbklkKSAmJgorCSAgICAoY3NyX25laWdoYm9yX3JvYW1fc3RhdGVfcHJlYXV0aF9kb25lKG1hY19jdHgsIHNlc3Npb25JZCkpKQorCQljc3JfbmVpZ2hib3Jfcm9hbV90cmFuaXN0aW9uX3ByZWF1dGhfZG9uZV90b19kaXNjb25uZWN0ZWQoCisJCQkJCQkJbWFjX2N0eCwgc2Vzc2lvbklkKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwlpZiAoY3NyX3JvYW1faXNfZmFzdF9yb2FtX2VuYWJsZWQobWFjX2N0eCwgc2Vzc2lvbklkKSAmJgorCSAgICAoY3NyX25laWdoYm9yX3JvYW1fc3RhdGVfcHJlYXV0aF9kb25lKG1hY19jdHgsIHNlc3Npb25JZCkpKQorCQljc3JfbmVpZ2hib3Jfcm9hbV90cmFuaXN0aW9uX3ByZWF1dGhfZG9uZV90b19kaXNjb25uZWN0ZWQoCisJCQkJCQkJbWFjX2N0eCwgc2Vzc2lvbklkKTsKKyNlbmRpZgorCXNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbklkKTsKKwlpZiAoIXNlc3Npb24pIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjc3JfaXNfY29ubl9zdGF0ZV9pbmZyYShtYWNfY3R4LCBzZXNzaW9uSWQpKQorCQlzZXNzaW9uLT5jb25uZWN0U3RhdGUgPSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfTk9UX0NPTk5FQ1RFRDsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisJc21lX3Fvc19jc3JfZXZlbnRfaW5kKG1hY19jdHgsICh1aW50OF90KSBzZXNzaW9uSWQsCisJCQkgICAgICBTTUVfUU9TX0NTUl9ESVNDT05ORUNUX0lORCwgTlVMTCk7CisjZW5kaWYKKwljc3Jfcm9hbV9saW5rX2Rvd24obWFjX2N0eCwgc2Vzc2lvbklkKTsKKwljc3Jfcm9hbV9pc3N1ZV93bV9zdGF0dXNfY2hhbmdlKG1hY19jdHgsIHNlc3Npb25JZCwKKwkJCQkJZUNzckRlYXV0aGVudGljYXRlZCwKKwkJCQkJbXNnX3B0cik7CisJaWYgKENTUl9JU19JTkZSQV9BUCgmc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSkpIHsKKwkJcm9hbV9pbmZvX3B0ciA9ICZyb2FtX2luZm87CisJCXJvYW1faW5mb19wdHItPnN0YXR1c0NvZGUgPSBwRGVhdXRoSW5kLT5zdGF0dXNDb2RlOworCQlyb2FtX2luZm9fcHRyLT5yZWFzb25Db2RlID0gcERlYXV0aEluZC0+cmVhc29uQ29kZTsKKwkJcm9hbV9pbmZvX3B0ci0+dS5wQ29ubmVjdGVkUHJvZmlsZSA9ICZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCQlyb2FtX2luZm9fcHRyLT5zdGFJZCA9ICh1aW50OF90KSBwRGVhdXRoSW5kLT5zdGFJZDsKKwkJY2RmX21lbV9jb3B5KHJvYW1faW5mb19wdHItPnBlZXJNYWMuYnl0ZXMsCisJCQkgICAgIHBEZWF1dGhJbmQtPnBlZXJNYWNBZGRyLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJY2RmX21lbV9jb3B5KCZyb2FtX2luZm9fcHRyLT5ic3NpZC5ieXRlcywKKwkJCSAgICAgcERlYXV0aEluZC0+YnNzSWQsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJCXN0YXR1cyA9IGNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbklkLAorCQkJCQkJcm9hbV9pbmZvX3B0ciwgMCwKKwkJCQkJCWVDU1JfUk9BTV9JTkZSQV9JTkQsCisJCQkJCQllQ1NSX1JPQU1fUkVTVUxUX0RFQVVUSF9JTkQpOworCX0KK30KKworc3RhdGljIHZvaWQKK2Nzcl9yb2FtX2Noa19sbmtfc3d0X2NoX2luZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U2lyU21lUnNwICptc2dfcHRyKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbjsKKwl1aW50MzJfdCBzZXNzaW9uSWQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworCUNERl9TVEFUVVMgc3RhdHVzOworCXRwU2lyU21lU3dpdGNoQ2hhbm5lbEluZCBwU3dpdGNoQ2huSW5kOworCisJLyogaW4gY2FzZSBvZiBTVEEsIHRoZSBTV0lUQ0hfQ0hBTk5FTCBvcmlnaW5hdGVzIGZyb20gaXRzIEFQICovCisJc21zX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiZVdOSV9TTUVfU1dJVENIX0NITF9JTkQgZnJvbSBTTUUiKSk7CisJcFN3aXRjaENobkluZCA9ICh0cFNpclNtZVN3aXRjaENoYW5uZWxJbmQpIG1zZ19wdHI7CisJLyogVXBkYXRlIHdpdGggdGhlIG5ldyBjaGFubmVsIGlkLiBUaGUgY2hhbm5lbCBpZCBpcyBoaWRkZW4gaW4gdGhlCisJICogc3RhdHVzQ29kZS4KKwkgKi8KKwlzdGF0dXMgPSBjc3Jfcm9hbV9nZXRfc2Vzc2lvbl9pZF9mcm9tX2Jzc2lkKG1hY19jdHgsCisJCQkoc3RydWN0IGNkZl9tYWNfYWRkciAqKSBwU3dpdGNoQ2huSW5kLT5ic3NJZCwgJnNlc3Npb25JZCk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbklkKTsKKwkJaWYgKCFzZXNzaW9uKSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCQlyZXR1cm47CisJCX0KKwkJc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsID0KKwkJCSh1aW50OF90KSBwU3dpdGNoQ2huSW5kLT5uZXdDaGFubmVsSWQ7CisJCWlmIChzZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpIHsKKwkJCXNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+Y2hhbm5lbElkID0KKwkJCQkodWludDhfdCkgcFN3aXRjaENobkluZC0+bmV3Q2hhbm5lbElkOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorY3NyX3JvYW1fY2hrX2xua19kZWF1dGhfcnNwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRTaXJTbWVSc3AgKm1zZ19wdHIpCit7CisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uOworCXVpbnQzMl90IHNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdENzclJvYW1JbmZvICpyb2FtX2luZm9fcHRyID0gTlVMTDsKKwl0U2lyU21lRGVhdXRoUnNwICpwRGVhdXRoUnNwID0gKHRTaXJTbWVEZWF1dGhSc3AgKikgbXNnX3B0cjsKKwl0Q3NyUm9hbUluZm8gcm9hbV9pbmZvOworCisJY2RmX21lbV9zZXQoJnJvYW1faW5mbywgc2l6ZW9mKHJvYW1faW5mbyksIDApOworCXNtc19sb2cobWFjX2N0eCwgTE9HVywgRkwoImVXTklfU01FX0RFQVVUSF9SU1AgZnJvbSBTTUUiKSk7CisJc2Vzc2lvbklkID0gcERlYXV0aFJzcC0+c2Vzc2lvbklkOworCWlmICghQ1NSX0lTX1NFU1NJT05fVkFMSUQobWFjX2N0eCwgc2Vzc2lvbklkKSkKKwkJcmV0dXJuOworCXNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbklkKTsKKwlpZiAoQ1NSX0lTX0lORlJBX0FQKCZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKSkgeworCQlyb2FtX2luZm9fcHRyID0gJnJvYW1faW5mbzsKKwkJcm9hbV9pbmZvX3B0ci0+dS5wQ29ubmVjdGVkUHJvZmlsZSA9ICZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCQljZGZfbWVtX2NvcHkocm9hbV9pbmZvX3B0ci0+cGVlck1hYy5ieXRlcywKKwkJCSAgICAgcERlYXV0aFJzcC0+cGVlck1hY0FkZHIsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlyb2FtX2luZm9fcHRyLT5yZWFzb25Db2RlID0gZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQ7CisJCXJvYW1faW5mb19wdHItPnN0YXR1c0NvZGUgPSBwRGVhdXRoUnNwLT5zdGF0dXNDb2RlOworCQlzdGF0dXMgPSBjc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25JZCwKKwkJCQkJCXJvYW1faW5mb19wdHIsIDAsCisJCQkJCQllQ1NSX1JPQU1fTE9TVExJTkssCisJCQkJCQllQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorY3NyX3JvYW1fY2hrX2xua19kaXNhc3NvY19yc3AodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdFNpclNtZVJzcCAqbXNnX3B0cikKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb247CisJdWludDMyX3Qgc2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0Q3NyUm9hbUluZm8gKnJvYW1faW5mb19wdHIgPSBOVUxMOworCXRDc3JSb2FtSW5mbyByb2FtX2luZm87CisJLyoKKwkgKiBzZXNzaW9uIGlkIGlzIGludmFsaWQgaGVyZSBzbyBjYW50IHVzZSBpdCB0byBhY2Nlc3MgdGhlIGFycmF5CisJICogY3VyU3Vic3RhdGUgYXMgaW5kZXgKKwkgKi8KKwl0U2lyU21lRGlzYXNzb2NSc3AgKnBEaXNhc3NvY1JzcCA9ICh0U2lyU21lRGlzYXNzb2NSc3AgKikgbXNnX3B0cjsKKworCWNkZl9tZW1fc2V0KCZyb2FtX2luZm8sIHNpemVvZihyb2FtX2luZm8pLCAwKTsKKwlzbXNfbG9nKG1hY19jdHgsIExPR1csIEZMKCJlV05JX1NNRV9ESVNBU1NPQ19SU1AgZnJvbSBTTUUgIikpOworCXNlc3Npb25JZCA9IHBEaXNhc3NvY1JzcC0+c2Vzc2lvbklkOworCWlmICghQ1NSX0lTX1NFU1NJT05fVkFMSUQobWFjX2N0eCwgc2Vzc2lvbklkKSkKKwkJcmV0dXJuOworCXNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbklkKTsKKwlpZiAoQ1NSX0lTX0lORlJBX0FQKCZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKSkgeworCQlyb2FtX2luZm9fcHRyID0gJnJvYW1faW5mbzsKKwkJcm9hbV9pbmZvX3B0ci0+dS5wQ29ubmVjdGVkUHJvZmlsZSA9ICZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCQljZGZfbWVtX2NvcHkocm9hbV9pbmZvX3B0ci0+cGVlck1hYy5ieXRlcywKKwkJCSAgICAgcERpc2Fzc29jUnNwLT5wZWVyTWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCXJvYW1faW5mb19wdHItPnJlYXNvbkNvZGUgPSBlQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRDsKKwkJcm9hbV9pbmZvX3B0ci0+c3RhdHVzQ29kZSA9IHBEaXNhc3NvY1JzcC0+c3RhdHVzQ29kZTsKKwkJc3RhdHVzID0gY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uSWQsCisJCQkJCQlyb2FtX2luZm9fcHRyLCAwLAorCQkJCQkJZUNTUl9ST0FNX0xPU1RMSU5LLAorCQkJCQkJZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQpOworCX0KK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCitzdGF0aWMgdm9pZAorY3NyX3JvYW1fZGlhZ19taWNfZmFpbCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfREVGKHNlY0V2ZW50LAorCQkJCSBob3N0X2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlKTsKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbklkKTsKKwlpZiAoIXNlc3Npb24pIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKwljZGZfbWVtX3NldCgmc2VjRXZlbnQsIHNpemVvZihob3N0X2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlKSwKKwkJICAgIDApOworCXNlY0V2ZW50LmV2ZW50SWQgPSBXTEFOX1NFQ1VSSVRZX0VWRU5UX01JQ19FUlJPUjsKKwlzZWNFdmVudC5lbmNyeXB0aW9uTW9kZU11bHRpY2FzdCA9CisJCSh1aW50OF90KSBkaWFnX2VuY190eXBlX2Zyb21fY3NyX3R5cGUoCisJCQkJc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlKTsKKwlzZWNFdmVudC5lbmNyeXB0aW9uTW9kZVVuaWNhc3QgPQorCQkodWludDhfdCkgZGlhZ19lbmNfdHlwZV9mcm9tX2Nzcl90eXBlKAorCQkJCXNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuRW5jcnlwdGlvblR5cGUpOworCXNlY0V2ZW50LmF1dGhNb2RlID0KKwkJKHVpbnQ4X3QpIGRpYWdfYXV0aF90eXBlX2Zyb21fY3NyX3R5cGUoCisJCQkJc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5BdXRoVHlwZSk7CisJY2RmX21lbV9jb3B5KHNlY0V2ZW50LmJzc2lkLCBzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLmJ5dGVzLAorCQkJQ0RGX01BQ19BRERSX1NJWkUpOworCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmc2VjRXZlbnQsIEVWRU5UX1dMQU5fU0VDVVJJVFkpOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSICovCisKK3N0YXRpYyB2b2lkCitjc3Jfcm9hbV9jaGtfbG5rX21pY19mYWlsX2luZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U2lyU21lUnNwICptc2dfcHRyKQoreworCXVpbnQzMl90IHNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdENzclJvYW1JbmZvICpyb2FtX2luZm9fcHRyID0gTlVMTDsKKwl0Q3NyUm9hbUluZm8gcm9hbV9pbmZvOworCXRwU2lyU21lTWljRmFpbHVyZUluZCBwTWljSW5kID0gKHRwU2lyU21lTWljRmFpbHVyZUluZCkgbXNnX3B0cjsKKwllQ3NyUm9hbVJlc3VsdCByZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9VTklDQVNUOworCisJY2RmX21lbV9zZXQoJnJvYW1faW5mbywgc2l6ZW9mKHJvYW1faW5mbyksIDApOworCXN0YXR1cyA9IGNzcl9yb2FtX2dldF9zZXNzaW9uX2lkX2Zyb21fYnNzaWQobWFjX2N0eCwKKwkJCQkoc3RydWN0IGNkZl9tYWNfYWRkciAqKSBwTWljSW5kLT5ic3NJZCwgJnNlc3Npb25JZCk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWNkZl9tZW1fc2V0KCZyb2FtX2luZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pLCAwKTsKKwkJcm9hbV9pbmZvLnUucE1JQ0ZhaWx1cmVJbmZvID0gJnBNaWNJbmQtPmluZm87CisJCXJvYW1faW5mb19wdHIgPSAmcm9hbV9pbmZvOworCQlpZiAocE1pY0luZC0+aW5mby5tdWx0aWNhc3QpCisJCQlyZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9HUk9VUDsKKwkJZWxzZQorCQkJcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfVU5JQ0FTVDsKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uSWQsIHJvYW1faW5mb19wdHIsIDAsCisJCQkJICAgICAgIGVDU1JfUk9BTV9NSUNfRVJST1JfSU5ELCByZXN1bHQpOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCWNzcl9yb2FtX2RpYWdfbWljX2ZhaWwobWFjX2N0eCwgc2Vzc2lvbklkKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAqLworfQorCitzdGF0aWMgdm9pZAorY3NyX3JvYW1fY2hrX2xua19wYnNfcHJvYmVfcmVxX2luZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U2lyU21lUnNwICptc2dfcHRyKQoreworCXVpbnQzMl90IHNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdENzclJvYW1JbmZvIHJvYW1faW5mbzsKKwl0cFNpclNtZVByb2JlUmVxSW5kIHBQcm9iZVJlcUluZCA9ICh0cFNpclNtZVByb2JlUmVxSW5kKSBtc2dfcHRyOworCisJY2RmX21lbV9zZXQoJnJvYW1faW5mbywgc2l6ZW9mKHJvYW1faW5mbyksIDApOworCXNtc19sb2cobWFjX2N0eCwgTE9HMSwgRkwoIldQUyBQQkMgUHJvYmUgcmVxdWVzdCBJbmRpY2F0aW9uIGZyb20gU01FIikpOworCisJc3RhdHVzID0gY3NyX3JvYW1fZ2V0X3Nlc3Npb25faWRfZnJvbV9ic3NpZChtYWNfY3R4LAorCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKilwUHJvYmVSZXFJbmQtPmJzc0lkLCAmc2Vzc2lvbklkKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJY2RmX21lbV9zZXQoJnJvYW1faW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbyksIDApOworCQlyb2FtX2luZm8udS5wV1BTUEJDUHJvYmVSZXEgPSAmcFByb2JlUmVxSW5kLT5XUFNQQkNQcm9iZVJlcTsKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uSWQsICZyb2FtX2luZm8sCisJCQkJICAgICAgIDAsIGVDU1JfUk9BTV9XUFNfUEJDX1BST0JFX1JFUV9JTkQsCisJCQkJICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfV1BTX1BCQ19QUk9CRV9SRVFfSU5EKTsKKwl9Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorc3RhdGljIHZvaWQKK2Nzcl9yb2FtX2RpYWdfam9pbmVkX25ld19ic3ModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgICAgIHRTaXJTbWVOZXdCc3NJbmZvICpwTmV3QnNzKQoreworCWhvc3RfbG9nX2lic3NfcGt0X3R5cGUgKnBJYnNzTG9nOworCXVpbnQzMl90IGJpOworCVdMQU5fSE9TVF9ESUFHX0xPR19BTExPQyhwSWJzc0xvZywgaG9zdF9sb2dfaWJzc19wa3RfdHlwZSwKKwkJCQkgTE9HX1dMQU5fSUJTU19DKTsKKwlpZiAoIXBJYnNzTG9nKQorCQlyZXR1cm47CisJcElic3NMb2ctPmV2ZW50SWQgPSBXTEFOX0lCU1NfRVZFTlRfQ09BTEVTQ0lORzsKKwlpZiAocE5ld0JzcykgeworCQljZGZfbWVtX2NvcHkocElic3NMb2ctPmJzc2lkLCBwTmV3QnNzLT5ic3NJZCwgNik7CisJCWlmIChwTmV3QnNzLT5zc0lkLmxlbmd0aCkKKwkJCWNkZl9tZW1fY29weShwSWJzc0xvZy0+c3NpZCwgcE5ld0Jzcy0+c3NJZC5zc0lkLAorCQkJCSAgICAgcE5ld0Jzcy0+c3NJZC5sZW5ndGgpOworCQlwSWJzc0xvZy0+b3BlcmF0aW5nQ2hhbm5lbCA9IHBOZXdCc3MtPmNoYW5uZWxOdW1iZXI7CisJfQorCWlmIChJU19TSVJfU1RBVFVTX1NVQ0NFU1Mod2xhbl9jZmdfZ2V0X2ludChtYWNfY3R4LAorCQkJCQkJICAgV05JX0NGR19CRUFDT05fSU5URVJWQUwsCisJCQkJCQkgICAmYmkpKSkKKwkJLyogVTggaXMgbm90IGVub3VnaCBmb3IgYmVhY29uIGludGVydmFsICovCisJCXBJYnNzTG9nLT5iZWFjb25JbnRlcnZhbCA9ICh1aW50OF90KSBiaTsKKwlXTEFOX0hPU1RfRElBR19MT0dfUkVQT1JUKHBJYnNzTG9nKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAqLworCitzdGF0aWMgdm9pZAorY3NyX3JvYW1fY2hrX2xua193bV9zdGF0dXNfY2hhbmdlX250Zih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCSAgICAgIHRTaXJTbWVSc3AgKm1zZ19wdHIpCit7CisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uOworCXVpbnQzMl90IHNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdENzclJvYW1JbmZvICpyb2FtX2luZm9fcHRyID0gTlVMTDsKKwl0U2lyU21lV21TdGF0dXNDaGFuZ2VOdGYgKnBTdGF0dXNDaGFuZ2VNc2c7CisJdENzclJvYW1JbmZvIHJvYW1faW5mbzsKKwl0U2lyU21lQXBOZXdDYXBzICpwQXBOZXdDYXBzOworCWVDc3JSb2FtUmVzdWx0IHJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfTk9ORTsKKwl0U2lyTWFjQWRkciBCcm9hZGNhc3RhZGRyID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CisJdFNpclNtZU5ld0Jzc0luZm8gKnBOZXdCc3M7CisJZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1cyA9IGVDU1JfUk9BTV9GQUlMRUQ7CisKKwljZGZfbWVtX3NldCgmcm9hbV9pbmZvLCBzaXplb2Yocm9hbV9pbmZvKSwgMCk7CisJcFN0YXR1c0NoYW5nZU1zZyA9ICh0U2lyU21lV21TdGF0dXNDaGFuZ2VOdGYgKikgbXNnX3B0cjsKKwlzd2l0Y2ggKHBTdGF0dXNDaGFuZ2VNc2ctPnN0YXR1c0NoYW5nZUNvZGUpIHsKKwljYXNlIGVTSVJfU01FX0lCU1NfQUNUSVZFOgorCQlzZXNzaW9uSWQgPSBjc3JfZmluZF9pYnNzX3Nlc3Npb24obWFjX2N0eCk7CisJCWlmIChDU1JfU0VTU0lPTl9JRF9JTlZBTElEID09IHNlc3Npb25JZCkKKwkJCWJyZWFrOworCQlzZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25JZCk7CisJCWlmICghc2Vzc2lvbikgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQiKSwKKwkJCQlzZXNzaW9uSWQpOworCQkJcmV0dXJuOworCQl9CisJCXNlc3Npb24tPmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JQlNTX0NPTk5FQ1RFRDsKKwkJaWYgKHNlc3Npb24tPnBDb25uZWN0QnNzRGVzYykgeworCQkJY2RmX21lbV9jb3B5KCZyb2FtX2luZm8uYnNzaWQsCisJCQkJICAgICBzZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MtPmJzc0lkLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwkJCXJvYW1faW5mby51LnBDb25uZWN0ZWRQcm9maWxlID0KKwkJCQkmc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZTsKKwkJCXJvYW1faW5mb19wdHIgPSAmcm9hbV9pbmZvOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJDU1I6IGNvbm5lY3RlZCBCU1MgaXMgZW1wdHkiKSk7CisJCX0KKwkJcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9JQlNTX0NPTk5FQ1Q7CisJCXJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fQ09OTkVDVF9TVEFUVVNfVVBEQVRFOworCQlicmVhazsKKworCWNhc2UgZVNJUl9TTUVfSUJTU19JTkFDVElWRToKKwkJc2Vzc2lvbklkID0gY3NyX2ZpbmRfaWJzc19zZXNzaW9uKG1hY19jdHgpOworCQlpZiAoQ1NSX1NFU1NJT05fSURfSU5WQUxJRCAhPSBzZXNzaW9uSWQpIHsKKwkJCXNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbklkKTsKKwkJCWlmICghc2Vzc2lvbikgeworCQkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJc2Vzc2lvbi0+Y29ubmVjdFN0YXRlID0KKwkJCQllQ1NSX0FTU09DX1NUQVRFX1RZUEVfSUJTU19ESVNDT05ORUNURUQ7CisJCQlyZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfSU5BQ1RJVkU7CisJCQlyb2FtU3RhdHVzID0gZUNTUl9ST0FNX0NPTk5FQ1RfU1RBVFVTX1VQREFURTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgZVNJUl9TTUVfSk9JTkVEX05FV19CU1M6CisJCS8qIElCU1MgY29hbGVzY2luZy4gKi8KKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIkNTUjogZVNJUl9TTUVfSk9JTkVEX05FV19CU1MgcmVjZWl2ZWQgZnJvbSBQRSIpKTsKKwkJc2Vzc2lvbklkID0gY3NyX2ZpbmRfaWJzc19zZXNzaW9uKG1hY19jdHgpOworCQlpZiAoQ1NSX1NFU1NJT05fSURfSU5WQUxJRCA9PSBzZXNzaW9uSWQpCisJCQlicmVhazsKKwkJc2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBzZXNzaW9uSWQpOworCQlpZiAoIXNlc3Npb24pIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksCisJCQkJc2Vzc2lvbklkKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiB1cGRhdGUgdGhlIGNvbm5lY3Rpb24gc3RhdGUgaW5mb3JtYXRpb24gKi8KKwkJcE5ld0JzcyA9ICZwU3RhdHVzQ2hhbmdlTXNnLT5zdGF0dXNDaGFuZ2VJbmZvLm5ld0Jzc0luZm87CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKwkJY3NyX3JvYW1fZGlhZ19qb2luZWRfbmV3X2JzcyhtYWNfY3R4LCBwTmV3QnNzKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAqLworCQljc3Jfcm9hbV91cGRhdGVfY29ubmVjdGVkX3Byb2ZpbGVfZnJvbV9uZXdfYnNzKG1hY19jdHgsCisJCQkJCQkJICAgICAgIHNlc3Npb25JZCwKKwkJCQkJCQkgICAgICAgcE5ld0Jzcyk7CisKKwkJaWYgKChlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FID09CisJCSAgICAgc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5FbmNyeXB0aW9uVHlwZSkpIHsKKwkJCWNzcl9yb2FtX2lzc3VlX3NldF9jb250ZXh0X3JlcShtYWNfY3R4LAorCQkJICAgIHNlc3Npb25JZCwKKwkJCSAgICBzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlLAorCQkJICAgIHNlc3Npb24tPnBDb25uZWN0QnNzRGVzYywKKwkJCSAgICAmQnJvYWRjYXN0YWRkciwgZmFsc2UsIGZhbHNlLAorCQkJICAgIGVTSVJfVFhfUlgsIDAsIDAsIE5VTEwsIDApOworCQl9CisJCXJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfSUJTU19DT0FMRVNDRUQ7CisJCXJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fSUJTU19JTkQ7CisJCWNkZl9tZW1fY29weSgmcm9hbV9pbmZvLmJzc2lkLCAmcE5ld0Jzcy0+YnNzSWQsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJCXJvYW1faW5mb19wdHIgPSAmcm9hbV9pbmZvOworCQkvKiBUaGlzIEJTU0lEIGlzIHRoZSByZWFsIEJTU0lELCBzYXZlIGl0ICovCisJCWlmIChzZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpCisJCQljZGZfbWVtX2NvcHkoc2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5ic3NJZCwKKwkJCQkgICAgICZwTmV3QnNzLT5ic3NJZCwgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwkJYnJlYWs7CisKKwkvKgorCSAqIGRldGVjdGlvbiBieSBMSU0gdGhhdCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBhc3NvY2lhdGVkCisJICogQVAgaGF2ZSBjaGFuZ2VkLgorCSAqLworCWNhc2UgZVNJUl9TTUVfQVBfQ0FQU19DSEFOR0VEOgorCQlwQXBOZXdDYXBzID0gJnBTdGF0dXNDaGFuZ2VNc2ctPnN0YXR1c0NoYW5nZUluZm8uYXBOZXdDYXBzOworCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiQ1NSIGhhbmRsaW5nIGVTSVJfU01FX0FQX0NBUFNfQ0hBTkdFRCIpKTsKKwkJc3RhdHVzID0gY3NyX3JvYW1fZ2V0X3Nlc3Npb25faWRfZnJvbV9ic3NpZChtYWNfY3R4LAorCQkJCShzdHJ1Y3QgY2RmX21hY19hZGRyICopcEFwTmV3Q2Fwcy0+YnNzSWQsICZzZXNzaW9uSWQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJYnJlYWs7CisJCWlmIChlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTkVEID09CisJCQltYWNfY3R4LT5yb2FtLmN1clN0YXRlW3Nlc3Npb25JZF0KKwkJICAgICYmICgoZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5FRF9SRUFMVElNRV9UUkFGRklDCisJCQk9PSBtYWNfY3R4LT5yb2FtLmN1clN1YlN0YXRlW3Nlc3Npb25JZF0pCisJCSAgICB8fCAoZUNTUl9ST0FNX1NVQlNUQVRFX05PTkUgPT0KKwkJCW1hY19jdHgtPnJvYW0uY3VyU3ViU3RhdGVbc2Vzc2lvbklkXSkKKwkJICAgIHx8IChlQ1NSX1JPQU1fU1VCU1RBVEVfSk9JTkVEX05PTl9SRUFMVElNRV9UUkFGRklDCisJCQk9PSBtYWNfY3R4LT5yb2FtLmN1clN1YlN0YXRlW3Nlc3Npb25JZF0pCisJCSAgICB8fCAoZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5FRF9OT19UUkFGRklDID09CisJCQkgbWFjX2N0eC0+cm9hbS5jdXJTdWJTdGF0ZVtzZXNzaW9uSWRdKSkpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HVywKKwkJCQlGTCgiQ2FsbGluZyBjc3Jfcm9hbV9kaXNjb25uZWN0X2ludGVybmFsIikpOworCQkJY3NyX3JvYW1fZGlzY29ubmVjdF9pbnRlcm5hbChtYWNfY3R4LCBzZXNzaW9uSWQsCisJCQkJCWVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCJTa2lwcGluZyB0aGUgbmV3IHNjYW4gYXMgQ1NSIGlzIGluIHN0YXRlICVzIGFuZCBzdWItc3RhdGUgJXMiKSwKKwkJCQltYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3RhdGUoCisJCQkJCW1hY19jdHgtPnJvYW0uY3VyU3RhdGVbc2Vzc2lvbklkXSksCisJCQkJbWFjX3RyYWNlX2dldGNzcl9yb2FtX3N1Yl9zdGF0ZSgKKwkJCQkJbWFjX2N0eC0+cm9hbS5jdXJTdWJTdGF0ZVtzZXNzaW9uSWRdKSk7CisJCQkvKiBXZSBpZ25vcmUgdGhlIGNhcHMgY2hhbmdlIGV2ZW50IGlmIENTUiBpcyBub3QgaW4gZnVsbAorCQkJICogY29ubmVjdGVkIHN0YXRlLiBTZW5kIG9uZSBldmVudCB0byBQRSB0byByZXNldAorCQkJICogbGltU2VudENhcHNDaGFuZ2VOdGYgT25jZSBsaW1TZW50Q2Fwc0NoYW5nZU50ZiBzZXQKKwkJCSAqIDAsIGxpbSBjYW4gc2VuZCBzdWIgc2VxdWVudCBDQVBTIGNoYW5nZSBldmVudAorCQkJICogb3RoZXJ3aXNlIGxpbSBjYW5ub3Qgc2VuZCBhbnkgQ0FQUyBjaGFuZ2UgZXZlbnRzIHRvCisJCQkgKiBTTUUKKwkJCSAqLworCQkJY3NyX3NlbmRfcmVzZXRfYXBfY2Fwc19jaGFuZ2VkKG1hY19jdHgsCisJCQkJCQkgICAgICAgJnBBcE5ld0NhcHMtPmJzc0lkKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fRkFJTEVEOworCQlyZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX05PTkU7CisJCWJyZWFrOworCX0gLyogZW5kIHN3aXRjaCBvbiBzdGF0dXNDaGFuZ2VDb2RlICovCisJaWYgKGVDU1JfUk9BTV9SRVNVTFRfTk9ORSAhPSByZXN1bHQpIHsKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uSWQsIHJvYW1faW5mb19wdHIsIDAsCisJCQkJICAgICAgIHJvYW1TdGF0dXMsIHJlc3VsdCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorY3NyX3JvYW1fY2hrX2xua19pYnNzX25ld19wZWVyX2luZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U2lyU21lUnNwICptc2dfcHRyKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbjsKKwl1aW50MzJfdCBzZXNzaW9uSWQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworCUNERl9TVEFUVVMgc3RhdHVzOworCXRDc3JSb2FtSW5mbyAqcm9hbV9pbmZvX3B0ciA9IE5VTEw7CisJdFNtZUlic3NQZWVySW5kICpwSWJzc1BlZXJJbmQgPSAodFNtZUlic3NQZWVySW5kICopIG1zZ19wdHI7CisJdENzclJvYW1JbmZvIHJvYW1faW5mbzsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCWhvc3RfbG9nX2lic3NfcGt0X3R5cGUgKnBJYnNzTG9nOworCVdMQU5fSE9TVF9ESUFHX0xPR19BTExPQyhwSWJzc0xvZywgaG9zdF9sb2dfaWJzc19wa3RfdHlwZSwKKwkJCQkgTE9HX1dMQU5fSUJTU19DKTsKKwlpZiAocElic3NMb2cpIHsKKwkJcElic3NMb2ctPmV2ZW50SWQgPSBXTEFOX0lCU1NfRVZFTlRfUEVFUl9KT0lOOworCQljZGZfbWVtX2NvcHkocElic3NMb2ctPnBlZXJNYWNBZGRyLCAmcElic3NQZWVySW5kLT5wZWVyQWRkciwgNik7CisJCVdMQU5fSE9TVF9ESUFHX0xPR19SRVBPUlQocElic3NMb2cpOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAqLworCisJY2RmX21lbV9zZXQoJnJvYW1faW5mbywgc2l6ZW9mKHJvYW1faW5mbyksIDApOworCXNlc3Npb25JZCA9IGNzcl9maW5kX2lic3Nfc2Vzc2lvbihtYWNfY3R4KTsKKwlpZiAoQ1NSX1NFU1NJT05fSURfSU5WQUxJRCA9PSBzZXNzaW9uSWQpCisJCXJldHVybjsKKwlzZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25JZCk7CisJaWYgKCFzZXNzaW9uKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBJc3N1ZSB0aGUgc2V0IENvbnRleHQgcmVxdWVzdCB0byBMSU0gdG8gZXN0YWJsaXNoIHRoZSBVbmljYXN0IFNUQQorCSAqIGNvbnRleHQgZm9yIHRoZSBuZXcgcGVlci4uLgorCSAqLworCWlmICghc2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HVywgRkwoIkNTUjogY29ubmVjdGVkIEJTUyBpcyBlbXB0eSIpKTsKKwkJZ290byBjYWxsYmFja19hbmRfZnJlZTsKKwl9CisJY2RmX21lbV9jb3B5KCZyb2FtX2luZm8ucGVlck1hYywgcElic3NQZWVySW5kLT5wZWVyQWRkciwKKwkJICAgICBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCWNkZl9tZW1fY29weSgmcm9hbV9pbmZvLmJzc2lkLCBzZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MtPmJzc0lkLAorCQkgICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJaWYgKHBJYnNzUGVlckluZC0+bWVzZ0xlbiA+IHNpemVvZih0U21lSWJzc1BlZXJJbmQpKSB7CisJCXJvYW1faW5mby5wYkZyYW1lcyA9IGNkZl9tZW1fbWFsbG9jKChwSWJzc1BlZXJJbmQtPm1lc2dMZW4gLQorCQkJCQlzaXplb2YodFNtZUlic3NQZWVySW5kKSkpOworCQlpZiAoTlVMTCA9PSByb2FtX2luZm8ucGJGcmFtZXMpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCXJvYW1faW5mby5uQmVhY29uTGVuZ3RoID0gcElic3NQZWVySW5kLT5tZXNnTGVuIC0KKwkJCQkJCQlzaXplb2YodFNtZUlic3NQZWVySW5kKTsKKwkJCWNkZl9tZW1fY29weShyb2FtX2luZm8ucGJGcmFtZXMsCisJCQkJKCh1aW50OF90ICopIHBJYnNzUGVlckluZCkgKworCQkJCXNpemVvZih0U21lSWJzc1BlZXJJbmQpLAorCQkJCXJvYW1faW5mby5uQmVhY29uTGVuZ3RoKTsKKwkJfQorCQlyb2FtX2luZm8uc3RhSWQgPSAodWludDhfdCkgcElic3NQZWVySW5kLT5zdGFJZDsKKwkJcm9hbV9pbmZvLnVjYXN0U2lnID0gKHVpbnQ4X3QpIHBJYnNzUGVlckluZC0+dWNhc3RTaWc7CisJCXJvYW1faW5mby5iY2FzdFNpZyA9ICh1aW50OF90KSBwSWJzc1BlZXJJbmQtPmJjYXN0U2lnOworCQlyb2FtX2luZm8ucEJzc0Rlc2MgPSBjZGZfbWVtX21hbGxvYygKKwkJCQkJc2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5sZW5ndGgpOworCQlpZiAoTlVMTCA9PSByb2FtX2luZm8ucEJzc0Rlc2MpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWlmIChyb2FtX2luZm8ucGJGcmFtZXMpCisJCQkJY2RmX21lbV9mcmVlKHJvYW1faW5mby5wYkZyYW1lcyk7CisJCQlpZiAocm9hbV9pbmZvLnBCc3NEZXNjKQorCQkJCWNkZl9tZW1fZnJlZShyb2FtX2luZm8ucEJzc0Rlc2MpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJY2RmX21lbV9jb3B5KHJvYW1faW5mby5wQnNzRGVzYywKKwkJCQkgICAgIHNlc3Npb24tPnBDb25uZWN0QnNzRGVzYywKKwkJCQkgICAgIHNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+bGVuZ3RoKTsKKwkJCXJvYW1faW5mb19wdHIgPSAmcm9hbV9pbmZvOworCQl9CisJfSBlbHNlIHsKKwkJcm9hbV9pbmZvX3B0ciA9ICZyb2FtX2luZm87CisJfQorCWlmICgoZUNTUl9FTkNSWVBUX1RZUEVfTk9ORSA9PQorCQlzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlKSkgeworCQkvKiBOTyBrZXlzLiB0aGVzZSBrZXkgcGFyYW1ldGVycyBkb24ndCBtYXR0ZXIgKi8KKwkJY3NyX3JvYW1faXNzdWVfc2V0X2NvbnRleHRfcmVxKG1hY19jdHgsIHNlc3Npb25JZCwKKwkJCXNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuRW5jcnlwdGlvblR5cGUsCisJCQlzZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MsICYocElic3NQZWVySW5kLT5wZWVyQWRkciksCisJCQlmYWxzZSwgdHJ1ZSwgZVNJUl9UWF9SWCwgMCwgMCwgTlVMTCwgMCk7CisJfQorCitjYWxsYmFja19hbmRfZnJlZToKKwkvKiBzZW5kIHVwIHRoZSBzZWMgdHlwZSBmb3IgdGhlIG5ldyBwZWVyICovCisJaWYgKHJvYW1faW5mb19wdHIpCisJCXJvYW1faW5mb19wdHItPnUucENvbm5lY3RlZFByb2ZpbGUgPSAmc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZTsKKwljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25JZCwgcm9hbV9pbmZvX3B0ciwgMCwKKwkJCSAgICAgICBlQ1NSX1JPQU1fQ09OTkVDVF9TVEFUVVNfVVBEQVRFLAorCQkJICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19ORVdfUEVFUik7CisJaWYgKHJvYW1faW5mb19wdHIpIHsKKwkJaWYgKHJvYW1faW5mby5wYkZyYW1lcykKKwkJCWNkZl9tZW1fZnJlZShyb2FtX2luZm8ucGJGcmFtZXMpOworCQlpZiAocm9hbV9pbmZvLnBCc3NEZXNjKQorCQkJY2RmX21lbV9mcmVlKHJvYW1faW5mby5wQnNzRGVzYyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorY3NyX3JvYW1fY2hrX2xua19pYnNzX3BlZXJfZGVwYXJ0ZWRfaW5kKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJCXRTaXJTbWVSc3AgKm1zZ19wdHIpCit7CisJdWludDMyX3Qgc2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKwl0Q3NyUm9hbUluZm8gcm9hbV9pbmZvOworCXRTbWVJYnNzUGVlckluZCAqcElic3NQZWVySW5kOworCisJaWYgKE5VTEwgPT0gbXNnX3B0cikgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJJQlNTIHBlZXIgaW5kLiBtZXNzYWdlIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV9zZXQoJnJvYW1faW5mbywgc2l6ZW9mKHJvYW1faW5mbyksIDApOworCXBJYnNzUGVlckluZCA9ICh0U21lSWJzc1BlZXJJbmQgKikgbXNnX3B0cjsKKwlzZXNzaW9uSWQgPSBjc3JfZmluZF9pYnNzX3Nlc3Npb24obWFjX2N0eCk7CisJaWYgKENTUl9TRVNTSU9OX0lEX0lOVkFMSUQgIT0gc2Vzc2lvbklkKSB7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKwkJaG9zdF9sb2dfaWJzc19wa3RfdHlwZSAqcElic3NMb2c7CisJCVdMQU5fSE9TVF9ESUFHX0xPR19BTExPQyhwSWJzc0xvZywgaG9zdF9sb2dfaWJzc19wa3RfdHlwZSwKKwkJCQkJIExPR19XTEFOX0lCU1NfQyk7CisJCWlmIChwSWJzc0xvZykgeworCQkJcElic3NMb2ctPmV2ZW50SWQgPSBXTEFOX0lCU1NfRVZFTlRfUEVFUl9MRUFWRTsKKwkJCWlmIChwSWJzc1BlZXJJbmQpIHsKKwkJCQljZGZfbWVtX2NvcHkocElic3NMb2ctPnBlZXJNYWNBZGRyLAorCQkJCQkgICAgICZwSWJzc1BlZXJJbmQtPnBlZXJBZGRyLCA2KTsKKwkJCX0KKwkJCVdMQU5fSE9TVF9ESUFHX0xPR19SRVBPUlQocElic3NMb2cpOworCQl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IgKi8KKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIkNTUjogUGVlciBkZXBhcnRlZCBub3RpZmljYXRpb24gZnJvbSBMSU0iKSk7CisJCXJvYW1faW5mby5zdGFJZCA9ICh1aW50OF90KSBwSWJzc1BlZXJJbmQtPnN0YUlkOworCQlyb2FtX2luZm8udWNhc3RTaWcgPSAodWludDhfdCkgcElic3NQZWVySW5kLT51Y2FzdFNpZzsKKwkJcm9hbV9pbmZvLmJjYXN0U2lnID0gKHVpbnQ4X3QpIHBJYnNzUGVlckluZC0+YmNhc3RTaWc7CisJCWNkZl9tZW1fY29weSgmcm9hbV9pbmZvLnBlZXJNYWMsIHBJYnNzUGVlckluZC0+cGVlckFkZHIsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbklkLCAmcm9hbV9pbmZvLCAwLAorCQkJCSAgICAgICBlQ1NSX1JPQU1fQ09OTkVDVF9TVEFUVVNfVVBEQVRFLAorCQkJCSAgICAgICBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfUEVFUl9ERVBBUlRFRCk7CisJfQorfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKK3N0YXRpYyB2b2lkCitjc3Jfcm9hbV9kaWFnX3NldF9jdHhfcnNwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkgIHRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCSAgdFNpclNtZVNldENvbnRleHRSc3AgKnBSc3ApCit7CisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfREVGKHNldEtleUV2ZW50LAorCQkJCSBob3N0X2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlKTsKKwlpZiAoZUNTUl9FTkNSWVBUX1RZUEVfTk9ORSA9PQorCQlzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlKQorCQlyZXR1cm47CisJY2RmX21lbV9zZXQoJnNldEtleUV2ZW50LAorCQkgICAgc2l6ZW9mKGhvc3RfZXZlbnRfd2xhbl9zZWN1cml0eV9wYXlsb2FkX3R5cGUpLCAwKTsKKwlpZiAocFJzcC0+cGVlck1hY0FkZHJbMF0gJiAweDAxKQorCQlzZXRLZXlFdmVudC5ldmVudElkID0gV0xBTl9TRUNVUklUWV9FVkVOVF9TRVRfR1RLX1JTUDsKKwllbHNlCisJCXNldEtleUV2ZW50LmV2ZW50SWQgPSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1NFVF9QVEtfUlNQOworCXNldEtleUV2ZW50LmVuY3J5cHRpb25Nb2RlTXVsdGljYXN0ID0KKwkJKHVpbnQ4X3QpIGRpYWdfZW5jX3R5cGVfZnJvbV9jc3JfdHlwZSgKKwkJCQlzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm1jRW5jcnlwdGlvblR5cGUpOworCXNldEtleUV2ZW50LmVuY3J5cHRpb25Nb2RlVW5pY2FzdCA9CisJCSh1aW50OF90KSBkaWFnX2VuY190eXBlX2Zyb21fY3NyX3R5cGUoCisJCQkJc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5FbmNyeXB0aW9uVHlwZSk7CisJY2RmX21lbV9jb3B5KHNldEtleUV2ZW50LmJzc2lkLCBzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLmJ5dGVzLAorCQkJQ0RGX01BQ19BRERSX1NJWkUpOworCXNldEtleUV2ZW50LmF1dGhNb2RlID0KKwkJKHVpbnQ4X3QpIGRpYWdfYXV0aF90eXBlX2Zyb21fY3NyX3R5cGUoCisJCQkJCXNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuQXV0aFR5cGUpOworCWlmIChlU0lSX1NNRV9TVUNDRVNTICE9IHBSc3AtPnN0YXR1c0NvZGUpCisJCXNldEtleUV2ZW50LnN0YXR1cyA9IFdMQU5fU0VDVVJJVFlfU1RBVFVTX0ZBSUxVUkU7CisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfUkVQT1JUKCZzZXRLZXlFdmVudCwgRVZFTlRfV0xBTl9TRUNVUklUWSk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IgKi8KKworc3RhdGljIHZvaWQKK2Nzcl9yb2FtX2Noa19sbmtfc2V0X2N0eF9yc3AodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdFNpclNtZVJzcCAqbXNnX3B0cikKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb247CisJdWludDMyX3Qgc2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0Q3NyUm9hbUluZm8gKnJvYW1faW5mb19wdHIgPSBOVUxMOworCXRTbWVDbWQgKmNtZDsKKwl0Q3NyUm9hbUluZm8gcm9hbV9pbmZvOworCWVDc3JSb2FtUmVzdWx0IHJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfTk9ORTsKKwl0U2lyU21lU2V0Q29udGV4dFJzcCAqcFJzcCA9ICh0U2lyU21lU2V0Q29udGV4dFJzcCAqKSBtc2dfcHRyOworCXRMaXN0RWxlbSAqZW50cnk7CisJdFNpck1hY0FkZHIgQnJvYWRjYXN0YWRkciA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworCisJY2RmX21lbV9zZXQoJnJvYW1faW5mbywgc2l6ZW9mKHJvYW1faW5mbyksIDApOworCWVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmbWFjX2N0eC0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQkJIExMX0FDQ0VTU19MT0NLKTsKKwlpZiAoIWVudHJ5KSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkNTUjogTk8gY29tbWFuZHMgYXJlIEFDVElWRSAuLi4iKSk7CisJCWdvdG8gcHJvY2Vzc19wZW5kaW5nX25fZXhpdDsKKwl9CisKKwljbWQgPSBHRVRfQkFTRV9BRERSKGVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwlpZiAoZVNtZUNvbW1hbmRTZXRLZXkgIT0gY21kLT5jb21tYW5kKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkNTUjogc2V0a2V5IGNtZCBpcyBub3QgQUNUSVZFIC4uLiIpKTsKKwkJZ290byBwcm9jZXNzX3BlbmRpbmdfbl9leGl0OworCX0KKwlzZXNzaW9uSWQgPSBjbWQtPnNlc3Npb25JZDsKKwlzZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25JZCk7CisJaWYgKCFzZXNzaW9uKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKwljc3Jfcm9hbV9kaWFnX3NldF9jdHhfcnNwKG1hY19jdHgsIHNlc3Npb24sIHBSc3ApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSICovCisJaWYgKENTUl9JU19XQUlUX0ZPUl9LRVkobWFjX2N0eCwgc2Vzc2lvbklkKSkgeworCQljc3Jfcm9hbV9zdG9wX3dhaXRfZm9yX2tleV90aW1lcihtYWNfY3R4KTsKKwkJLyogV2UgYXJlIGRvbmUgd2l0aCBhdXRoZW50aWNhdGlvbiwgd2hldGhlcmUgc3VjY2VlZCBvciBub3QgKi8KKwkJY3NyX3JvYW1fc3Vic3RhdGVfY2hhbmdlKG1hY19jdHgsIGVDU1JfUk9BTV9TVUJTVEFURV9OT05FLAorCQkJCQkgc2Vzc2lvbklkKTsKKwkJLyogV2UgZG8gaXQgaGVyZSBiZWNhdXNlIHRoaXMgbGlua3VwIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQKKwkJICogYWZ0ZXIgYXNzb2NpYXRpb24gIHdoZW4gYSBrZXkgbmVlZHMgdG8gYmUgc2V0LgorCQkgKi8KKwkJaWYgKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYShtYWNfY3R4LCBzZXNzaW9uSWQpKQorCQkJY3NyX3JvYW1fbGlua191cChtYWNfY3R4LAorCQkJCQkgc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCk7CisJfQorCWlmIChlU0lSX1NNRV9TVUNDRVNTID09IHBSc3AtPnN0YXR1c0NvZGUpIHsKKwkJY2RmX21lbV9jb3B5KCZyb2FtX2luZm8ucGVlck1hYywgJnBSc3AtPnBlZXJNYWNBZGRyLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCQkvKiBNYWtlIHN1cmUgd2UgaW5zdGFsbCB0aGUgR1RLIGJlZm9yZSBpbmRpY2F0aW5nIHRvIEhERCBhcworCQkgKiBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHRvIHByZXZlbnQgYnJvYWRjYXN0IHBhY2tldHMgZ28gb3V0CisJCSAqIGFmdGVyIFBUSyBhbmQgYmVmb3JlIEdUSy4KKwkJICovCisJCWlmIChjZGZfbWVtX2NvbXBhcmUoJkJyb2FkY2FzdGFkZHIsIHBSc3AtPnBlZXJNYWNBZGRyLAorCQkJCSAgICBzaXplb2YodFNpck1hY0FkZHIpKSkgeworCQkJdHBTaXJTZXRBY3RpdmVNb2RlU2V0Qm5jRmlsdGVyUmVxIHBNc2c7CisJCQlwTXNnID0gY2RmX21lbV9tYWxsb2MoCisJCQkJICAgIHNpemVvZih0U2lyU2V0QWN0aXZlTW9kZVNldEJuY0ZpbHRlclJlcSkpOworCQkJcE1zZy0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9TRVRfQkNOX0ZJTFRFUl9SRVE7CisJCQlwTXNnLT5sZW5ndGggPSBzaXplb2YodWludDhfdCk7CisJCQlwTXNnLT5zZWVzaW9uSWQgPSBzZXNzaW9uSWQ7CisJCQlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKwkJCXJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfQVVUSEVOVElDQVRFRDsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfTk9ORTsKKwkJfQorCQlyb2FtX2luZm9fcHRyID0gJnJvYW1faW5mbzsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkU7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJDU1I6IHNldGtleSBjb21tYW5kIGZhaWxlZCglZCkgUGVlck1hYyAiCisJCQlNQUNfQUREUkVTU19TVFIpLAorCQkJcFJzcC0+c3RhdHVzQ29kZSwgTUFDX0FERFJfQVJSQVkocFJzcC0+cGVlck1hY0FkZHIpKTsKKwl9CisJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uSWQsICZyb2FtX2luZm8sCisJCQkgICAgICAgY21kLT51LnNldEtleUNtZC5yb2FtSWQsCisJCQkgICAgICAgZUNTUl9ST0FNX1NFVF9LRVlfQ09NUExFVEUsIHJlc3VsdCk7CisJLyogSW5kaWNhdGUgU01FX1FPUyB0aGF0IHRoZSBTRVRfS0VZIGlzIGNvbXBsZXRlZCwgc28gdGhhdCBTTUVfUU9TCisJICogY2FuIGdvIGFoZWFkIGFuZCBpbml0aWF0ZSB0aGUgVFNQRUMgaWYgYW55IGFyZSBwZW5kaW5nCisJICovCisJc21lX3Fvc19jc3JfZXZlbnRfaW5kKG1hY19jdHgsICh1aW50OF90KSBzZXNzaW9uSWQsCisJCQkgICAgICBTTUVfUU9TX0NTUl9TRVRfS0VZX1NVQ0NFU1NfSU5ELCBOVUxMKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJLyogU2VuZCBBZGphY2VudCBBUCByZXBvdCB0byBuZXcgQVAuICovCisJaWYgKHJlc3VsdCA9PSBlQ1NSX1JPQU1fUkVTVUxUX0FVVEhFTlRJQ0FURUQKKwkgICAgJiYgc2Vzc2lvbi0+aXNQcmV2QXBJbmZvVmFsaWQKKwkgICAgJiYgc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5pc0VTRUFzc29jKSB7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKKwkJY3NyX3NlbmRfZXNlX2FkamFjZW50X2FwX3JlcF9pbmQobWFjX2N0eCwgc2Vzc2lvbik7CisjZWxzZQorCQljc3JfZXNlX3NlbmRfYWRqYWNlbnRfYXBfcmVwX21zZyhtYWNfY3R4LCBzZXNzaW9uKTsKKyNlbmRpZgorCQlzZXNzaW9uLT5pc1ByZXZBcEluZm9WYWxpZCA9IGZhbHNlOworCX0KKyNlbmRpZgorCWlmIChjc3JfbGxfcmVtb3ZlX2VudHJ5KCZtYWNfY3R4LT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgZW50cnksCisJCQkJTExfQUNDRVNTX0xPQ0spKQorCQljc3JfcmVsZWFzZV9jb21tYW5kX3NldF9rZXkobWFjX2N0eCwgY21kKTsKKworcHJvY2Vzc19wZW5kaW5nX25fZXhpdDoKKwlzbWVfcHJvY2Vzc19wZW5kaW5nX3F1ZXVlKG1hY19jdHgpOworfQorCisKK3N0YXRpYyB2b2lkCitjc3Jfcm9hbV9jaGtfbG5rX21heF9hc3NvY19leGNlZWRlZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U2lyU21lUnNwICptc2dfcHRyKQoreworCXVpbnQzMl90IHNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisJdFNtZU1heEFzc29jSW5kICpwU21lTWF4QXNzb2NJbmQ7CisJdENzclJvYW1JbmZvIHJvYW1faW5mbzsKKworCWNkZl9tZW1fc2V0KCZyb2FtX2luZm8sIHNpemVvZihyb2FtX2luZm8pLCAwKTsKKwlwU21lTWF4QXNzb2NJbmQgPSAodFNtZU1heEFzc29jSW5kICopIG1zZ19wdHI7CisJc21zX2xvZyhtYWNfY3R4LCBMT0cxLAorCQlGTCgibWF4IGFzc29jIGhhdmUgYmVlbiByZWFjaGVkLCBuZXcgcGVlciBjYW5ub3QgYmUgYWNjZXB0ZWQiKSk7CisJc2Vzc2lvbklkID0gcFNtZU1heEFzc29jSW5kLT5zZXNzaW9uSWQ7CisJcm9hbV9pbmZvLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwljZGZfbWVtX2NvcHkoJnJvYW1faW5mby5wZWVyTWFjLCBwU21lTWF4QXNzb2NJbmQtPnBlZXJNYWMsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25JZCwgJnJvYW1faW5mbywgMCwKKwkJCSAgICAgICBlQ1NSX1JPQU1fSU5GUkFfSU5ELAorCQkJICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfTUFYX0FTU09DX0VYQ0VFREVEKTsKK30KKwordm9pZCBjc3Jfcm9hbV9jaGVja19mb3JfbGlua19zdGF0dXNfY2hhbmdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVSc3AgKnBTaXJNc2cpCit7CisJaWYgKE5VTEwgPT0gcFNpck1zZykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJwU2lyTXNnIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisJc3dpdGNoIChwU2lyTXNnLT5tZXNzYWdlVHlwZSkgeworCWNhc2UgZVdOSV9TTUVfQVNTT0NfSU5EOgorCQljc3Jfcm9hbV9jaGtfbG5rX2Fzc29jX2luZChwTWFjLCBwU2lyTXNnKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9ESVNBU1NPQ19JTkQ6CisJCWNzcl9yb2FtX2Noa19sbmtfZGlzYXNzb2NfaW5kKHBNYWMsIHBTaXJNc2cpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0RFQVVUSF9JTkQ6CisJCWNzcl9yb2FtX2Noa19sbmtfZGVhdXRoX2luZChwTWFjLCBwU2lyTXNnKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9TV0lUQ0hfQ0hMX0lORDoKKwkJY3NyX3JvYW1fY2hrX2xua19zd3RfY2hfaW5kKHBNYWMsIHBTaXJNc2cpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0RFQVVUSF9SU1A6CisJCWNzcl9yb2FtX2Noa19sbmtfZGVhdXRoX3JzcChwTWFjLCBwU2lyTXNnKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9ESVNBU1NPQ19SU1A6CisJCWNzcl9yb2FtX2Noa19sbmtfZGlzYXNzb2NfcnNwKHBNYWMsIHBTaXJNc2cpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX01JQ19GQUlMVVJFX0lORDoKKwkJY3NyX3JvYW1fY2hrX2xua19taWNfZmFpbF9pbmQocE1hYywgcFNpck1zZyk7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfV1BTX1BCQ19QUk9CRV9SRVFfSU5EOgorCQljc3Jfcm9hbV9jaGtfbG5rX3Bic19wcm9iZV9yZXFfaW5kKHBNYWMsIHBTaXJNc2cpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX1dNX1NUQVRVU19DSEFOR0VfTlRGOgorCQljc3Jfcm9hbV9jaGtfbG5rX3dtX3N0YXR1c19jaGFuZ2VfbnRmKHBNYWMsIHBTaXJNc2cpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0lCU1NfTkVXX1BFRVJfSU5EOgorCQljc3Jfcm9hbV9jaGtfbG5rX2lic3NfbmV3X3BlZXJfaW5kKHBNYWMsIHBTaXJNc2cpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0lCU1NfUEVFUl9ERVBBUlRFRF9JTkQ6CisJCWNzcl9yb2FtX2Noa19sbmtfaWJzc19wZWVyX2RlcGFydGVkX2luZChwTWFjLCBwU2lyTXNnKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9TRVRDT05URVhUX1JTUDoKKwkJY3NyX3JvYW1fY2hrX2xua19zZXRfY3R4X3JzcChwTWFjLCBwU2lyTXNnKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9HRVRfU1RBVElTVElDU19SU1A6CisJCXNtc19sb2cocE1hYywgTE9HMiwgRkwoIlN0YXRzIHJzcCBmcm9tIFBFIikpOworCQljc3Jfcm9hbV9zdGF0c19yc3BfcHJvY2Vzc29yKHBNYWMsIHBTaXJNc2cpOworCQlicmVhazsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisJY2FzZSBlV05JX1NNRV9HRVRfVFNNX1NUQVRTX1JTUDoKKwkJc21zX2xvZyhwTWFjLCBMT0cyLCBGTCgiVFNNIFN0YXRzIHJzcCBmcm9tIFBFIikpOworCQljc3JfdHNtX3N0YXRzX3JzcF9wcm9jZXNzb3IocE1hYywgcFNpck1zZyk7CisJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgJiYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKwljYXNlIGVXTklfU01FX0dFVF9SU1NJX1JFUToKKwkJc21zX2xvZyhwTWFjLCBMT0cyLCBGTCgiR2V0UnNzaVJlcSBmcm9tIHNlbGYiKSk7CisJCWNzcl91cGRhdGVfcnNzaShwTWFjLCBwU2lyTXNnKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9HRVRfU05SX1JFUToKKwkJc21zX2xvZyhwTWFjLCBMT0cyLCBGTCgiR2V0U25yUmVxIGZyb20gc2VsZiIpKTsKKwkJY3NyX3VwZGF0ZV9zbnIocE1hYywgcFNpck1zZyk7CisJCWJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJY2FzZSBlV05JX1NNRV9GVF9QUkVfQVVUSF9SU1A6CisJCWNzcl9yb2FtX2Z0X3ByZV9hdXRoX3JzcF9wcm9jZXNzb3IocE1hYywgKHRwU2lyRlRQcmVBdXRoUnNwKSBwU2lyTXNnKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIGVXTklfU01FX01BWF9BU1NPQ19FWENFRURFRDoKKwkJY3NyX3JvYW1fY2hrX2xua19tYXhfYXNzb2NfZXhjZWVkZWQocE1hYywgcFNpck1zZyk7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfQ0FORElEQVRFX0ZPVU5EX0lORDoKKwkJc21zX2xvZyhwTWFjLCBMT0cyLCBGTCgiQ2FuZGlkYXRlIGZvdW5kIGluZGljYXRpb24gZnJvbSBQRSIpKTsKKwkJY3NyX25laWdoYm9yX3JvYW1fY2FuZGlkYXRlX2ZvdW5kX2luZF9oZGxyKHBNYWMsIHBTaXJNc2cpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX0hBTkRPRkZfUkVROgorCQlzbXNfbG9nKHBNYWMsIExPRzIsIEZMKCJIYW5kb2ZmIFJlcSBmcm9tIHNlbGYiKSk7CisJCWNzcl9uZWlnaGJvcl9yb2FtX2hhbmRvZmZfcmVxX2hkbHIocE1hYywgcFNpck1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0gLyogZW5kIHN3aXRjaCBvbiBtZXNzYWdlIHR5cGUgKi8KK30KKwordm9pZCBjc3JfY2FsbF9yb2FtaW5nX2NvbXBsZXRpb25fY2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uLAorCQkJCQkgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLCB1aW50MzJfdCByb2FtSWQsCisJCQkJCSAgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCkKK3sKKwlpZiAocFNlc3Npb24pIHsKKwkJaWYgKHBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudCkgeworCQkJcFNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250LS07CisKKwkJCWlmICgwICE9IHBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudCkgeworCQkJCUNERl9BU1NFUlQocFNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250ID09IDApOworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8qIE5lZWQgdG8gY2FsbCBhc3NvY2lhdGlvbl9jb21wbGV0aW9uIGJlY2F1c2UgdGhlcmUgaXMgYW4gYXNzb2Nfc3RhcnQgcGVuZGluZy4gKi8KKwkJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgcFNlc3Npb24tPnNlc3Npb25JZCwgTlVMTCwKKwkJCQkJICAgICAgIHJvYW1JZCwKKwkJCQkJICAgICAgIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OLAorCQkJCQkgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFKTsKKwkJfQorCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHBTZXNzaW9uLT5zZXNzaW9uSWQsIHBSb2FtSW5mbywKKwkJCQkgICAgICAgcm9hbUlkLCBlQ1NSX1JPQU1fUk9BTUlOR19DT01QTEVUSU9OLAorCQkJCSAgICAgICByb2FtUmVzdWx0KTsKKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR1csIEZMKCIgIHBTZXNzaW9uIGlzIE5VTEwiKSk7CisJfQorfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX3N0YXJ0X3JvYW1pbmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgZUNzclJvYW1pbmdSZWFzb24gcm9hbWluZ1JlYXNvbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCWlmIChDU1JfSVNfTE9TVExJTktfUk9BTUlORyhyb2FtaW5nUmVhc29uKSAmJgorCSAgICAoZmFsc2UgPT0gcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmZDYW5jZWxSb2FtaW5nKSkgeworCQlzdGF0dXMgPSBjc3Jfc2Nhbl9yZXF1ZXN0X2xvc3RfbGluazEocE1hYywgc2Vzc2lvbklkKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogcmV0dXJuIGEgYm9vbCB0byBpbmRpY2F0ZSB3aGV0aGVyIHJvYW1pbmcgY29tcGxldGVkIG9yIGNvbnRpbnVlLiAqLworYm9vbCBjc3Jfcm9hbV9jb21wbGV0ZV9yb2FtaW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCSAgICAgICBib29sIGZGb3JjZSwgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCkKK3sKKwlib29sIGZDb21wbGV0ZWQgPSB0cnVlOworCXVpbnQzMl90IHJvYW1UaW1lID0KKwkJKHVpbnQzMl90KSAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUm9hbWluZ1RpbWUgKgorCQkJICAgIENERl9USUNLU19QRVJfU0VDT05EKTsKKwl1aW50MzJfdCBjdXJUaW1lID0gKHVpbnQzMl90KSBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJLyogQ2hlY2sgd2hldGhlciB0aW1lIGlzIHVwICovCisJaWYgKHBTZXNzaW9uLT5mQ2FuY2VsUm9hbWluZyB8fCBmRm9yY2UgfHwKKwkgICAgKChjdXJUaW1lIC0gcFNlc3Npb24tPnJvYW1pbmdTdGFydFRpbWUpID4gcm9hbVRpbWUpIHx8CisJICAgIGVDc3JSZWFzc29jUm9hbWluZyA9PSBwU2Vzc2lvbi0+cm9hbWluZ1JlYXNvbiB8fAorCSAgICBlQ3NyRHluYW1pY1JvYW1pbmcgPT0gcFNlc3Npb24tPnJvYW1pbmdSZWFzb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiICBpbmRpY2F0ZXMgcm9hbWluZyBjb21wbGV0aW9uIikpOworCQlpZiAocFNlc3Npb24tPmZDYW5jZWxSb2FtaW5nCisJCSAgICAmJiBDU1JfSVNfTE9TVExJTktfUk9BTUlORyhwU2Vzc2lvbi0+cm9hbWluZ1JlYXNvbikpIHsKKwkJCS8qIHJvYW1pbmcgaXMgY2FuY2VsbGVkLCB0ZWxsIEhERCB0byBpbmRpY2F0ZSBkaXNjb25uZWN0ICovCisJCQkvKiBCZWNhdXNlIExJTSBvdmVybG9hZCBkZWF1dGhfaW5kIGZvciBib3RoIGRlYXV0aCBmcmFtZSBhbmQgbWlzc2VkIGJlYWNvbiAqLworCQkJLyogd2UgbmVlZCB0byB1c2UgdGhpcyBsb2dpYyB0byBkZXRpbmd1aXNoIGl0LiBGb3IgbWlzc2VkIGJlYWNvbiwgTElNIHNldCByZWFzb24gKi8KKwkJCS8qIHRvIGJlIGVTSVJfQkVBQ09OX01JU1NFRCAqLworCQkJaWYgKGVTSVJfQkVBQ09OX01JU1NFRCA9PSBwU2Vzc2lvbi0+cm9hbWluZ1N0YXR1c0NvZGUpIHsKKwkJCQlyb2FtUmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9MT1NUTElOSzsKKwkJCX0gZWxzZSBpZiAoZUNzckxvc3RsaW5rUm9hbWluZ0Rpc2Fzc29jID09CisJCQkJICAgcFNlc3Npb24tPnJvYW1pbmdSZWFzb24pIHsKKwkJCQlyb2FtUmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9ESVNBU1NPQ19JTkQ7CisJCQl9IGVsc2UgaWYgKGVDc3JMb3N0bGlua1JvYW1pbmdEZWF1dGggPT0KKwkJCQkgICBwU2Vzc2lvbi0+cm9hbWluZ1JlYXNvbikgeworCQkJCXJvYW1SZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0RFQVVUSF9JTkQ7CisJCQl9IGVsc2UgeworCQkJCXJvYW1SZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0xPU1RMSU5LOworCQkJfQorCQl9CisJCWNzcl9jYWxsX3JvYW1pbmdfY29tcGxldGlvbl9jYWxsYmFjayhwTWFjLCBwU2Vzc2lvbiwgTlVMTCwgMCwKKwkJCQkJCSAgICAgcm9hbVJlc3VsdCk7CisJCXBTZXNzaW9uLT5yb2FtaW5nUmVhc29uID0gZUNzck5vdFJvYW1pbmc7CisJfSBlbHNlIHsKKwkJcFNlc3Npb24tPnJvYW1SZXN1bHQgPSByb2FtUmVzdWx0OworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgIChjc3Jfcm9hbV9zdGFydF9yb2FtaW5nX3RpbWVyCisJCQkJICAgIChwTWFjLCBzZXNzaW9uSWQsIENERl9NQ19USU1FUl9UT19TRUNfVU5JVCkpKSB7CisJCQljc3JfY2FsbF9yb2FtaW5nX2NvbXBsZXRpb25fY2FsbGJhY2socE1hYywgcFNlc3Npb24sIE5VTEwsCisJCQkJCQkJICAgICAwLCByb2FtUmVzdWx0KTsKKwkJCXBTZXNzaW9uLT5yb2FtaW5nUmVhc29uID0gZUNzck5vdFJvYW1pbmc7CisJCX0gZWxzZSB7CisJCQlmQ29tcGxldGVkID0gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIGZDb21wbGV0ZWQ7Cit9CisKK3ZvaWQgY3NyX3JvYW1fY2FuY2VsX3JvYW1pbmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChDU1JfSVNfUk9BTUlORyhwU2Vzc2lvbikpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCAiQ2FuY2VsIHJvYW1pbmciKTsKKwkJcFNlc3Npb24tPmZDYW5jZWxSb2FtaW5nID0gdHJ1ZTsKKwkJaWYgKENTUl9JU19ST0FNX0pPSU5JTkcocE1hYywgc2Vzc2lvbklkKQorCQkgICAgJiYgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfQ09ORklHKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCS8qIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaW4gaGVyZSBiZWNhdXNlIHRoZSBoYW5kbGVyIHRha2VzIGNhcmUgb2YgaXQgKi8KKwkJfSBlbHNlIHsKKwkJCWVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQgPQorCQkJCUNTUl9JU19MT1NUTElOS19ST0FNSU5HKHBTZXNzaW9uLT4KKwkJCQkJCQlyb2FtaW5nUmVhc29uKSA/CisJCQkJZUNTUl9ST0FNX1JFU1VMVF9MT1NUTElOSyA6IGVDU1JfUk9BTV9SRVNVTFRfTk9ORTsKKwkJCS8qIFJvYW1pbmcgaXMgc3RvcHBlZCBhZnRlciBoZXJlICovCisJCQljc3Jfcm9hbV9jb21wbGV0ZV9yb2FtaW5nKHBNYWMsIHNlc3Npb25JZCwgdHJ1ZSwKKwkJCQkJCSAgcm9hbVJlc3VsdCk7CisJCQkvKiBTaW5jZSBDU1IgbWF5IGJlIGluIGxvc3RsaW5rIHJvYW1pbmcgc2l0dWF0aW9uLCBhYm9ydCBhbGwgcm9hbWluZyByZWxhdGVkIGFjdGl2aXRpZXMgKi8KKwkJCWNzcl9zY2FuX2Fib3J0X21hY19zY2FuKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCWVDU1JfU0NBTl9BQk9SVF9ERUZBVUxUKTsKKwkJCWNzcl9yb2FtX3N0b3Bfcm9hbWluZ190aW1lcihwTWFjLCBzZXNzaW9uSWQpOworCQl9CisJfQorfQorCit2b2lkIGNzcl9yb2FtX3JvYW1pbmdfdGltZXJfaGFuZGxlcih2b2lkICpwdikKK3sKKwl0Q3NyVGltZXJJbmZvICpwSW5mbyA9ICh0Q3NyVGltZXJJbmZvICopIHB2OworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBwSW5mby0+cE1hYzsKKwl1aW50MzJfdCBzZXNzaW9uSWQgPSBwSW5mby0+c2Vzc2lvbklkOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmYWxzZSA9PSBwU2Vzc2lvbi0+ZkNhbmNlbFJvYW1pbmcpIHsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJCSAgICAoY3NyX3JvYW1fc3RhcnRfcm9hbWluZworCQkJCSAgICAocE1hYywgc2Vzc2lvbklkLCBwU2Vzc2lvbi0+cm9hbWluZ1JlYXNvbikpKSB7CisJCQljc3JfY2FsbF9yb2FtaW5nX2NvbXBsZXRpb25fY2FsbGJhY2socE1hYywgcFNlc3Npb24sIE5VTEwsCisJCQkJCQkJICAgICAwLAorCQkJCQkJCSAgICAgcFNlc3Npb24tPnJvYW1SZXN1bHQpOworCQkJcFNlc3Npb24tPnJvYW1pbmdSZWFzb24gPSBlQ3NyTm90Um9hbWluZzsKKwkJfQorCX0KK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9zdGFydF9yb2FtaW5nX3RpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJdWludDMyX3QgaW50ZXJ2YWwpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlzbXNfbG9nKHBNYWMsIExPRzEsICIgY3NyU2NhblN0YXJ0Um9hbWluZ1RpbWVyIik7CisJcFNlc3Npb24tPnJvYW1pbmdUaW1lckluZm8uc2Vzc2lvbklkID0gKHVpbnQ4X3QpIHNlc3Npb25JZDsKKwlzdGF0dXMgPSBjZGZfbWNfdGltZXJfc3RhcnQoJnBTZXNzaW9uLT5oVGltZXJSb2FtaW5nLAorCQkJCSAgICBpbnRlcnZhbCAvIENERl9NQ19USU1FUl9UT19NU19VTklUKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fc3RvcF9yb2FtaW5nX3RpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlyZXR1cm4gY2RmX21jX3RpbWVyX3N0b3AKKwkJCSgmcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmhUaW1lclJvYW1pbmcpOworfQorCit2b2lkIGNzcl9yb2FtX3dhaXRfZm9yX2tleV90aW1lX291dF9oYW5kbGVyKHZvaWQgKnB2KQoreworCXRDc3JUaW1lckluZm8gKnBJbmZvID0gKHRDc3JUaW1lckluZm8gKikgcHY7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IHBJbmZvLT5wTWFjOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgcEluZm8tPnNlc3Npb25JZCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWlmIChwU2Vzc2lvbiA9PSBOVUxMKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgIiVzOiBzZXNzaW9uIG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXNtc19sb2cocE1hYywgTE9HVywKKwkJRkwoIldhaXRGb3JLZXkgdGltZXIgZXhwaXJlZCBpbiBzdGF0ZT0lcyBzdWItc3RhdGU9JXMiKSwKKwkJbWFjX3RyYWNlX2dldF9uZWlnaGJvdXJfcm9hbV9zdGF0ZShwTWFjLT5yb2FtLgorCQkJCQkJICAgbmVpZ2hib3JSb2FtSW5mb1twSW5mby0+c2Vzc2lvbklkXS4KKwkJCQkJCSAgIG5laWdoYm9yUm9hbVN0YXRlKSwKKwkJbWFjX3RyYWNlX2dldGNzcl9yb2FtX3N1Yl9zdGF0ZShwTWFjLT5yb2FtLgorCQkJCQkJY3VyU3ViU3RhdGVbcEluZm8tPnNlc3Npb25JZF0pKTsKKworCWlmIChDU1JfSVNfV0FJVF9GT1JfS0VZKHBNYWMsIHBJbmZvLT5zZXNzaW9uSWQpKSB7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCQlpZiAoY3NyX25laWdoYm9yX3JvYW1faXNfaGFuZG9mZl9pbl9wcm9ncmVzcyhwTWFjLCBwSW5mby0+c2Vzc2lvbklkKSkgeworCQkJLyoKKwkJCSAqIEVuYWJsZSBoZWFydGJlYXQgdGltZXIgd2hlbiBoYW5kLW9mZiBpcyBpbiBwcm9ncmVzcworCQkJICogYW5kIEtleSBXYWl0IHRpbWVyIGV4cGlyZWQuCisJCQkgKi8KKwkJCXNtc19sb2cocE1hYywgTE9HMiwKKwkJCQkiRW5hYmxpbmcgSEIgdGltZXIgYWZ0ZXIgV2FpdEtleSBleHBpcnkiCisJCQkJIiAobkhCQ291bnQ9JWQpIiwKKwkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkhlYXJ0YmVhdFRocmVzaDI0KTsKKwkJCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQsCisJCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSGVhcnRiZWF0VGhyZXNoMjQpOworCQl9CisjZW5kaWYKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiIFNNRSBwcmUtYXV0aCBzdGF0ZSB0aW1lb3V0LiAiKTsKKworCQkvKiBDaGFuZ2UgdGhlIHN1YnN0YXRlIHNvIGNvbW1hbmQgcXVldWUgaXMgdW5ibG9ja2VkLiAqLworCQlpZiAoQ1NSX1JPQU1fU0VTU0lPTl9NQVggPiBwSW5mby0+c2Vzc2lvbklkKSB7CisJCQljc3Jfcm9hbV9zdWJzdGF0ZV9jaGFuZ2UocE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX05PTkUsCisJCQkJCQkgcEluZm8tPnNlc3Npb25JZCk7CisJCX0KKworCQlpZiAoY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2luZnJhKHBNYWMsIHBJbmZvLT5zZXNzaW9uSWQpKSB7CisJCQljc3Jfcm9hbV9saW5rX3VwKHBNYWMsCisJCQkJCSBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCk7CisJCQlzbWVfcHJvY2Vzc19wZW5kaW5nX3F1ZXVlKHBNYWMpOworCQkJc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQljc3Jfcm9hbV9kaXNjb25uZWN0KHBNYWMsIHBJbmZvLT5zZXNzaW9uSWQsCisJCQkJCWVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworCQkJCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCQkJfQorCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCAiJXM6IHNlc3Npb24gbm90IGZvdW5kIiwgX19mdW5jX18pOworCQl9CisJfQorCit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fc3RhcnRfd2FpdF9mb3Jfa2V5X3RpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IGludGVydmFsKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3BNYWMtPnJvYW0uV2FpdEZvcktleVRpbWVySW5mby4KKwkJCQkJICAgICBzZXNzaW9uSWRdOworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwlpZiAoY3NyX25laWdoYm9yX3JvYW1faXNfaGFuZG9mZl9pbl9wcm9ncmVzcyhwTWFjLAorCQkJCQkJICAgICBwTWFjLT5yb2FtLldhaXRGb3JLZXlUaW1lckluZm8uCisJCQkJCQkgICAgIHNlc3Npb25JZCkpIHsKKwkJLyogRGlzYWJsZSBoZWFydGJlYXQgdGltZXIgd2hlbiBoYW5kLW9mZiBpcyBpbiBwcm9ncmVzcyAqLworCQlzbXNfbG9nKHBNYWMsIExPRzIsCisJCQlGTCgiZGlzYWJsaW5nIEhCIHRpbWVyIGluIHN0YXRlPSVzIHN1Yi1zdGF0ZT0lcyIpLAorCQkJbWFjX3RyYWNlX2dldF9uZWlnaGJvdXJfcm9hbV9zdGF0ZShwTmVpZ2hib3JSb2FtSW5mby0+CisJCQkJCQkJICAgbmVpZ2hib3JSb2FtU3RhdGUpLAorCQkJbWFjX3RyYWNlX2dldGNzcl9yb2FtX3N1Yl9zdGF0ZShwTWFjLT5yb2FtLgorCQkJCQkJCWN1clN1YlN0YXRlW3BNYWMtPnJvYW0uCisJCQkJCQkJCSAgICBXYWl0Rm9yS2V5VGltZXJJbmZvLgorCQkJCQkJCQkgICAgc2Vzc2lvbklkXQorCQkJCQkJCSkpOworCQljZmdfc2V0X2ludChwTWFjLCBXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xELCAwKTsKKwl9CisjZW5kaWYKKwlzbXNfbG9nKHBNYWMsIExPRzEsICIgY3NyU2NhblN0YXJ0V2FpdEZvcktleVRpbWVyIik7CisJc3RhdHVzID0gY2RmX21jX3RpbWVyX3N0YXJ0KCZwTWFjLT5yb2FtLmhUaW1lcldhaXRGb3JLZXksCisJCQkJICAgIGludGVydmFsIC8gQ0RGX01DX1RJTUVSX1RPX01TX1VOSVQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9zdG9wX3dhaXRfZm9yX2tleV90aW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3BNYWMtPnJvYW0uV2FpdEZvcktleVRpbWVySW5mby4KKwkJCQkJICAgICBzZXNzaW9uSWRdOworCisJc21zX2xvZyhwTWFjLCBMT0cyLAorCQlGTCgiV2FpdEZvcktleSB0aW1lciBzdG9wcGVkIGluIHN0YXRlPSVzIHN1Yi1zdGF0ZT0lcyIpLAorCQltYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlKHBOZWlnaGJvclJvYW1JbmZvLT4KKwkJCQkJCSAgIG5laWdoYm9yUm9hbVN0YXRlKSwKKwkJbWFjX3RyYWNlX2dldGNzcl9yb2FtX3N1Yl9zdGF0ZShwTWFjLT5yb2FtLgorCQkJCQkJY3VyU3ViU3RhdGVbcE1hYy0+cm9hbS4KKwkJCQkJCQkgICAgV2FpdEZvcktleVRpbWVySW5mby4KKwkJCQkJCQkgICAgc2Vzc2lvbklkXSkpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwlpZiAoY3NyX25laWdoYm9yX3JvYW1faXNfaGFuZG9mZl9pbl9wcm9ncmVzcyhwTWFjLAorCQkJCQkJICAgICBwTWFjLT5yb2FtLldhaXRGb3JLZXlUaW1lckluZm8uCisJCQkJCQkgICAgIHNlc3Npb25JZCkpIHsKKwkJLyoKKwkJICogRW5hYmxlIGhlYXJ0YmVhdCB0aW1lciB3aGVuIGhhbmQtb2ZmIGlzIGluIHByb2dyZXNzCisJCSAqIGFuZCBLZXkgV2FpdCB0aW1lciBnb3Qgc3RvcHBlZCBmb3Igc29tZSByZWFzb24KKwkJICovCisJCXNtc19sb2cocE1hYywgTE9HMiwgIkVuYWJsaW5nIEhCIHRpbWVyIGFmdGVyIFdhaXRLZXkgc3RvcCIKKwkJCSIgKG5IQkNvdW50PSVkKSIsCisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkhlYXJ0YmVhdFRocmVzaDI0KTsKKwkJY2ZnX3NldF9pbnQocE1hYywgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCwKKwkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkhlYXJ0YmVhdFRocmVzaDI0KTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gY2RmX21jX3RpbWVyX3N0b3AoJnBNYWMtPnJvYW0uaFRpbWVyV2FpdEZvcktleSk7Cit9CisKK3ZvaWQgY3NyX3JvYW1fY29tcGxldGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgdENzclJvYW1JbmZvICpwUm9hbUluZm8sIHRTbWVDbWQgKnBDb21tYW5kLAorCQkJIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQsIGJvb2wgZlN1Y2Nlc3MpCit7CisJZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1cyA9IGNzcl9nZXRfcm9hbV9jb21wbGV0ZV9zdGF0dXMocE1hYywgc2Vzc2lvbklkKTsKKwl1aW50MzJfdCByb2FtSWQgPSAwOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQ29tbWFuZCkgeworCQlyb2FtSWQgPSBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1JZDsKKwkJaWYgKHNlc3Npb25JZCAhPSBwQ29tbWFuZC0+c2Vzc2lvbklkKSB7CisJCQlDREZfQVNTRVJUKHNlc3Npb25JZCA9PSBwQ29tbWFuZC0+c2Vzc2lvbklkKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoZUNTUl9ST0FNX1JPQU1JTkdfQ09NUExFVElPTiA9PSByb2FtU3RhdHVzKSB7CisJCS8qIGlmIHN1Y2Nlc3MsIGZvcmNlIHJvYW1pbmcgY29tcGxldGlvbiAqLworCQljc3Jfcm9hbV9jb21wbGV0ZV9yb2FtaW5nKHBNYWMsIHNlc3Npb25JZCwgZlN1Y2Nlc3MsIHJvYW1SZXN1bHQpOworCX0gZWxzZSB7CisJCWlmIChwU2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQgIT0gMCkgeworCQkJQ0RGX0FTU0VSVChwU2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQgPT0gMCk7CisJCQlyZXR1cm47CisJCX0KKwkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwKKwkJCQkoIiAgaW5kaWNhdGVzIGFzc29jaWF0aW9uIGNvbXBsZXRpb24uIHJvYW1SZXN1bHQgPSAlZCIpLAorCQkJcm9hbVJlc3VsdCk7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIHJvYW1JZCwKKwkJCQkgICAgICAgcm9hbVN0YXR1cywgcm9hbVJlc3VsdCk7CisJfQorfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX2xvc3RfbGluayh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgICAgICB1aW50MzJfdCB0eXBlLCB0U2lyU21lUnNwICpwU2lyTXNnKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTaXJTbWVEZWF1dGhJbmQgKnBEZWF1dGhJbmRNc2cgPSBOVUxMOworCXRTaXJTbWVEaXNhc3NvY0luZCAqcERpc2Fzc29jSW5kTXNnID0gTlVMTDsKKwllQ3NyUm9hbVJlc3VsdCByZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0xPU1RMSU5LOworCXRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvID0gTlVMTDsKKwl0Q3NyUm9hbUluZm8gcm9hbUluZm87CisJYm9vbCBmVG9Sb2FtOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwkvKiBPbmx5IG5lZWQgdG8gcm9hbSBmb3IgaW5mcmEgc3RhdGlvbi4gSW4gdGhpcyBjYXNlIFAyUCBjbGllbnQgd2lsbCByb2FtIGFzIHdlbGwgKi8KKwlmVG9Sb2FtID0gQ1NSX0lTX0lORlJBU1RSVUNUVVJFKCZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSk7CisJcFNlc3Npb24tPmZDYW5jZWxSb2FtaW5nID0gZmFsc2U7CisJaWYgKGVXTklfU01FX0RJU0FTU09DX0lORCA9PSB0eXBlKSB7CisJCXJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfRElTQVNTT0NfSU5EOworCQlwRGlzYXNzb2NJbmRNc2cgPSAodFNpclNtZURpc2Fzc29jSW5kICopIHBTaXJNc2c7CisJCXBTZXNzaW9uLT5yb2FtaW5nU3RhdHVzQ29kZSA9IHBEaXNhc3NvY0luZE1zZy0+c3RhdHVzQ29kZTsKKwkJcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5yZWFzb25Db2RlID0KKwkJCXBEaXNhc3NvY0luZE1zZy0+cmVhc29uQ29kZTsKKwl9IGVsc2UgaWYgKGVXTklfU01FX0RFQVVUSF9JTkQgPT0gdHlwZSkgeworCQlyZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0RFQVVUSF9JTkQ7CisJCXBEZWF1dGhJbmRNc2cgPSAodFNpclNtZURlYXV0aEluZCAqKSBwU2lyTXNnOworCQlwU2Vzc2lvbi0+cm9hbWluZ1N0YXR1c0NvZGUgPSBwRGVhdXRoSW5kTXNnLT5zdGF0dXNDb2RlOworCQkvKiBDb252ZXJ0IGludG8gcHJvcGVyIHJlYXNvbiBjb2RlICovCisJCWlmICgocERlYXV0aEluZE1zZy0+cmVhc29uQ29kZSA9PSBlU0lSX0JFQUNPTl9NSVNTRUQpIHx8CisJCQkJKHBEZWF1dGhJbmRNc2ctPnJlYXNvbkNvZGUgPT0KKwkJCQllU0lSX01BQ19ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWV9SRUFTT04pKQorCQkJcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5yZWFzb25Db2RlID0gMDsKKwkJZWxzZQorCQkJcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5yZWFzb25Db2RlID0KKwkJCQlwRGVhdXRoSW5kTXNnLT5yZWFzb25Db2RlOworCQkvKgorCQkgKiBjZmcgbGF5ZXIgZXhwZWN0cyAwIGFzIHJlYXNvbiBjb2RlIGlmCisJCSAqIHRoZSBkcml2ZXIgZG9zZW50IGtub3cgdGhlIHJlYXNvbiBjb2RlCisJCSAqIGVTSVJfQkVBQ09OX01JU1NFRCBpcyBkZWZpbmVkIGFzIGxvY2FsbHkKKwkJICovCisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiZ2V0cyBhbiB1bmtub3duIHR5cGUgKCVkKSIpLCB0eXBlKTsKKwkJcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9OT05FOworCQlwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGUgPSAxOworCX0KKworCS8qIGNhbGwgcHJvZmlsZSBsb3N0IGxpbmsgcm91dGluZSBoZXJlICovCisJaWYgKCFDU1JfSVNfSU5GUkFfQVAoJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKSkgeworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgMCwKKwkJCQkgICAgICAgZUNTUl9ST0FNX0xPU1RMSU5LX0RFVEVDVEVELCByZXN1bHQpOworCQkvKk1vdmUgdGhlIHN0YXRlIHRvIElkbGUgYWZ0ZXIgZGlzY29ubmVjdGlvbiAqLworCQljc3Jfcm9hbV9zdGF0ZV9jaGFuZ2UocE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0lETEUsIHNlc3Npb25JZCk7CisKKwl9CisKKwlpZiAoZVdOSV9TTUVfRElTQVNTT0NfSU5EID09IHR5cGUpIHsKKwkJc3RhdHVzID0gY3NyX3NlbmRfbWJfZGlzYXNzb2NfY25mX21zZyhwTWFjLCBwRGlzYXNzb2NJbmRNc2cpOworCX0gZWxzZSBpZiAoZVdOSV9TTUVfREVBVVRIX0lORCA9PSB0eXBlKSB7CisJCXN0YXR1cyA9IGNzcl9zZW5kX21iX2RlYXV0aF9jbmZfbXNnKHBNYWMsIHBEZWF1dGhJbmRNc2cpOworCX0KKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCS8qIElmIGZhaWwgdG8gc2VuZCBjb25maXJtYXRpb24gdG8gUEUsIG5vdCB0byB0cmlnZ2VyIHJvYW1pbmcgKi8KKwkJZlRvUm9hbSA9IGZhbHNlOworCX0KKwkvKiBwcmVwYXJlIHRvIHRlbGwgSEREIHRvIGRpc2Nvbm5lY3QgKi8KKwljZGZfbWVtX3NldCgmcm9hbUluZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pLCAwKTsKKwlyb2FtSW5mby5zdGF0dXNDb2RlID0gKHRTaXJSZXN1bHRDb2RlcykgcFNlc3Npb24tPnJvYW1pbmdTdGF0dXNDb2RlOworCXJvYW1JbmZvLnJlYXNvbkNvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisJaWYgKGVXTklfU01FX0RJU0FTU09DX0lORCA9PSB0eXBlKSB7CisJCS8qIHN0YU1hY0FkZHIgKi8KKwkJY2RmX21lbV9jb3B5KHJvYW1JbmZvLnBlZXJNYWMuYnl0ZXMsCisJCQkJcERpc2Fzc29jSW5kTXNnLT5wZWVyTWFjQWRkciwKKwkJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcm9hbUluZm8uc3RhSWQgPSAodWludDhfdCkgcERpc2Fzc29jSW5kTXNnLT5zdGFJZDsKKwkJcm9hbUluZm8ucmVhc29uQ29kZSA9IHBEaXNhc3NvY0luZE1zZy0+cmVhc29uQ29kZTsKKwl9IGVsc2UgaWYgKGVXTklfU01FX0RFQVVUSF9JTkQgPT0gdHlwZSkgeworCQkvKiBzdGFNYWNBZGRyICovCisJCWNkZl9tZW1fY29weShyb2FtSW5mby5wZWVyTWFjLmJ5dGVzLAorCQkJCXBEZWF1dGhJbmRNc2ctPnBlZXJNYWNBZGRyLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQlyb2FtSW5mby5zdGFJZCA9ICh1aW50OF90KSBwRGVhdXRoSW5kTXNnLT5zdGFJZDsKKwkJcm9hbUluZm8ucmVhc29uQ29kZSA9IHBEZWF1dGhJbmRNc2ctPnJlYXNvbkNvZGU7CisJfQorCXNtc19sb2cocE1hYywgTE9HVywgRkwoInJvYW1JbmZvLnN0YUlkICglZCkiKSwgcm9hbUluZm8uc3RhSWQpOworCisJLyogU2VlIGlmIHdlIGNhbiBwb3NzaWJseSByb2FtLiAgSWYgc28sIHN0YXJ0IHRoZSByb2FtaW5nIHByb2Nlc3MgYW5kIG5vdGlmeSBIREQKKwkgICB0aGF0IHdlIGFyZSByb2FtaW5nLiAgQnV0IGlmIHdlIGNhbm5vdCBwb3NzaWJseSByb2FtLCBvciBpZiB3ZSBhcmUgdW5hYmxlIHRvCisJICAgY3VycmVudGx5IHJvYW0sIHRoZW4gbm90aWZ5IEhERCBvZiB0aGUgbG9zdCBsaW5rICovCisJaWYgKGZUb1JvYW0pIHsKKwkJLyogT25seSByZW1vdmUgdGhlIGNvbm5lY3RlZCBCU1MgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSAqLworCQljc3Jfcm9hbV9yZW1vdmVfY29ubmVjdGVkX2Jzc19mcm9tX3NjYW5fY2FjaGUocE1hYywKKwkJCQkJCQkgICAgICAmcFNlc3Npb24tPgorCQkJCQkJCSAgICAgIGNvbm5lY3RlZFByb2ZpbGUpOworCQkvKiBOb3QgdG8gZG8gYW55aW5nIGZvciBsb3N0bGluayB3aXRoIFdEUyAqLworCQlzdGF0dXMgPSBjc3Jfcm9hbV9zdGFydF9yb2FtaW5nKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkoZVdOSV9TTUVfREVBVVRIX0lORCA9PSB0eXBlKSA/CisJCQkJZUNzckxvc3RsaW5rUm9hbWluZ0RlYXV0aCA6CisJCQkJZUNzckxvc3RsaW5rUm9hbWluZ0Rpc2Fzc29jKTsKKwkJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublJvYW1pbmdUaW1lKSB7CisJCQlzdGF0dXMgPSBjc3Jfcm9hbV9zdGFydF9yb2FtaW5nKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJKGVXTklfU01FX0RFQVVUSF9JTkQgPT0gdHlwZSkgPworCQkJCQllQ3NyTG9zdGxpbmtSb2FtaW5nRGVhdXRoIDoKKwkJCQkJZUNzckxvc3RsaW5rUm9hbWluZ0Rpc2Fzc29jKTsKKwkJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCWNkZl9tZW1fc2V0KCZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbyksIDApOworCQkJCS8qIEZvciBJQlNTLCB3ZSBuZWVkIHRvIGdpdmUgc29tZSBtb3JlIGluZm8gdG8gSEREICovCisJCQkJaWYgKGNzcl9pc19ic3NfdHlwZV9pYnNzCisJCQkJCShwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5CU1NUeXBlKSkgeworCQkJCQlyb2FtSW5mby51LnBDb25uZWN0ZWRQcm9maWxlID0KKwkJCQkJCSZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZTsKKwkJCQkJcm9hbUluZm8uc3RhdHVzQ29kZSA9CisJCQkJCQkodFNpclJlc3VsdENvZGVzKSBwU2Vzc2lvbi0+CisJCQkJCQlyb2FtaW5nU3RhdHVzQ29kZTsKKwkJCQkJcm9hbUluZm8ucmVhc29uQ29kZSA9CisJCQkJCQlwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLgorCQkJCQkJcmVhc29uQ29kZTsKKwkJCQl9IGVsc2UgeworCQkJCQlyb2FtSW5mby5yZWFzb25Db2RlID0KKwkJCQkJCWVDc3JSb2FtUmVhc29uU21lSXNzdWVkRm9yTG9zdExpbms7CisJCQkJfQorCQkJCXBSb2FtSW5mbyA9ICZyb2FtSW5mbzsKKwkJCQlwU2Vzc2lvbi0+cm9hbWluZ1JlYXNvbiA9CisJCQkJCShlV05JX1NNRV9ERUFVVEhfSU5EID09CisJCQkJCSB0eXBlKSA/IGVDc3JMb3N0bGlua1JvYW1pbmdEZWF1dGggOgorCQkJCQllQ3NyTG9zdGxpbmtSb2FtaW5nRGlzYXNzb2M7CisJCQkJcFNlc3Npb24tPnJvYW1pbmdTdGFydFRpbWUgPQorCQkJCQkodWludDMyX3QpIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisJCQkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIHBSb2FtSW5mbywKKwkJCQkJCSAgICAgICAwLCBlQ1NSX1JPQU1fUk9BTUlOR19TVEFSVCwKKwkJCQkJCSAgICAgICBlQ1NSX1JPQU1fUkVTVUxUX0xPU1RMSU5LKTsKKwkJCX0gZWxzZSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCQkiICVzIEZhaWwgdG8gc3RhcnQgcm9hbWluZywgc3RhdHVzID0gJWQiLAorCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCQlmVG9Sb2FtID0gZmFsc2U7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBXZSBhcmUgdG9sZCBub3QgdG8gcm9hbSwgaW5kaWNhdGUgbG9zdGxpbmsgKi8KKwkJCWZUb1JvYW0gPSBmYWxzZTsKKwkJfQorCX0KKwlpZiAoIWZUb1JvYW0pIHsKKwkJLyogVGVsbCBIREQgYWJvdXQgdGhlIGxvc3QgbGluayAqLworCQlpZiAoIUNTUl9JU19JTkZSQV9BUCgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpKSB7CisJCQkvKiBEb24ndCBjYWxsIGNzcl9yb2FtX2NhbGxfY2FsbGJhY2sgZm9yIEdPL1NvZnRBcCBjYXNlIGFzIHRoaXMgaW5kaWNhdGlvbgorCQkJICogd2FzIGFscmVhZHkgZ2l2ZW4gYXMgcGFydCBvZiBlV05JX1NNRV9ESVNBU1NPQ19JTkQgbXNnIGhhbmRsaW5nIGluCisJCQkgKiBjc3Jfcm9hbV9jaGVja19mb3JfbGlua19zdGF0dXNfY2hhbmdlIEFQSS4KKwkJCSAqLworCQkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgMCwKKwkJCQkJICAgICAgIGVDU1JfUk9BTV9MT1NUTElOSywgcmVzdWx0KTsKKwkJfQorCisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9sb3N0X2xpbmtfYWZ0ZXJoYW5kb2ZmX2ZhaWx1cmUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisJdFNtZUNtZCAqcENvbW1hbmQgPSBOVUxMOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBTZXNzaW9uLT5mQ2FuY2VsUm9hbWluZyA9IGZhbHNlOworCS8qIE9ubHkgcmVtb3ZlIHRoZSBjb25uZWN0ZWQgQlNTIGluIGluZnJhc3RydWN0dXJlIG1vZGUgKi8KKwljc3Jfcm9hbV9yZW1vdmVfY29ubmVjdGVkX2Jzc19mcm9tX3NjYW5fY2FjaGUocE1hYywKKwkJCQkJCSAgICAgICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSk7CisJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublJvYW1pbmdUaW1lKSB7CisJCXN0YXR1cyA9IGNzcl9yb2FtX3N0YXJ0X3JvYW1pbmcocE1hYywgc2Vzc2lvbklkLAorCQkJCXBTZXNzaW9uLT5yb2FtaW5nUmVhc29uKTsKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkvKgorCQkJICogYmVmb3JlIHN0YXJ0aW5nIHRoZSBsb3N0IGxpbmsgbG9naWMgcmVsZWFzZQorCQkJICogdGhlIHJvYW0gY29tbWFuZCBmb3IgaGFuZG9mZgorCQkJICovCisJCQlwRW50cnkgPQorCQkJCWNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LAorCQkJCQkJIExMX0FDQ0VTU19MT0NLKTsKKwkJCWlmIChwRW50cnkpIHsKKwkJCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJCX0KKwkJCWlmIChwQ29tbWFuZCkgeworCQkJCWlmICgoZVNtZUNvbW1hbmRSb2FtID09IHBDb21tYW5kLT5jb21tYW5kKSAmJgorCQkJCSAgICAoZUNzclNtZUlzc3VlZEFzc29jVG9TaW1pbGFyQVAgPT0KKwkJCQkgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbikpIHsKKwkJCQkJaWYgKGNzcl9sbF9yZW1vdmVfZW50cnkKKwkJCQkJCSAgICAoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LAorCQkJCQkJICAgIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0spKSB7CisJCQkJCQljc3JfcmVsZWFzZV9jb21tYW5kX3JvYW0ocE1hYywKKwkJCQkJCQkJCSBwQ29tbWFuZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzbXNfbG9nKHBNYWMsIExPR1csICJMb3N0IGxpbmsgcm9hbWluZyBzdGFydGVkIC4uLiIpOworCQl9CisJfSBlbHNlIHsKKwkJLyogV2UgYXJlIHRvbGQgbm90IHRvIHJvYW0sIGluZGljYXRlIGxvc3RsaW5rICovCisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgY3NyX3JvYW1fd21fc3RhdHVzX2NoYW5nZV9jb21wbGV0ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRTbWVDbWQgKnBDb21tYW5kOworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKHBFbnRyeSkgeworCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJaWYgKGVTbWVDb21tYW5kV21TdGF0dXNDaGFuZ2UgPT0gcENvbW1hbmQtPmNvbW1hbmQpIHsKKwkJCS8qIE5vdGhpbmcgdG8gcHJvY2VzcyBpbiBhIExvc3QgTGluayBjb21wbGV0aW9uLi4uLiAgSXQganVzdCBraWNrcyBvZmYgYSAqLworCQkJLyogcm9hbWluZyBzZXF1ZW5jZS4gKi8KKwkJCWlmIChjc3JfbGxfcmVtb3ZlX2VudHJ5CisJCQkJICAgICgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIHBFbnRyeSwKKwkJCQkgICAgTExfQUNDRVNTX0xPQ0spKSB7CisJCQkJY3NyX3JlbGVhc2VfY29tbWFuZF93bV9zdGF0dXNfY2hhbmdlKHBNYWMsIHBDb21tYW5kKTsKKwkJCX0gZWxzZSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkiICoqKioqKmNzcl9yb2FtX3dtX3N0YXR1c19jaGFuZ2VfY29tcGxldGUgZmFpbCB0byByZWxlYXNlIGNvbW1hbmQiKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCSJDU1I6IFdtU3RhdHVzQ2hhbmdlIENvbXBsZXRpb24gY2FsbGVkIGJ1dCBMT1NUIExJTksgY29tbWFuZCBpcyBub3QgQUNUSVZFIC4uLiIpOworCQl9CisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJIkNTUjogV21TdGF0dXNDaGFuZ2UgQ29tcGxldGlvbiBjYWxsZWQgYnV0IE5PIGNvbW1hbmRzIGFyZSBBQ1RJVkUgLi4uIik7CisJfQorCXNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUocE1hYyk7Cit9CisKK3ZvaWQgY3NyX3JvYW1fcHJvY2Vzc193bV9zdGF0dXNfY2hhbmdlX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgIHRTbWVDbWQgKnBDb21tYW5kKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdFNpclNtZVJzcCAqcFNpclNtZU1zZzsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHBDb21tYW5kLT5zZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLAorCQkJcENvbW1hbmQtPnNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgic2Vzc2lvbjolZCwgQ21kVHlwZSA6ICVkIiksCisJCXBDb21tYW5kLT5zZXNzaW9uSWQsIHBDb21tYW5kLT51LndtU3RhdHVzQ2hhbmdlQ21kLlR5cGUpOworCisJc3dpdGNoIChwQ29tbWFuZC0+dS53bVN0YXR1c0NoYW5nZUNtZC5UeXBlKSB7CisJY2FzZSBlQ3NyRGlzYXNzb2NpYXRlZDoKKwkJcFNpclNtZU1zZyA9CisJCQkodFNpclNtZVJzcCAqKSAmcENvbW1hbmQtPnUud21TdGF0dXNDaGFuZ2VDbWQudS4KKwkJCURpc2Fzc29jSW5kTXNnOworCQlzdGF0dXMgPQorCQkJY3NyX3JvYW1fbG9zdF9saW5rKHBNYWMsIHBDb21tYW5kLT5zZXNzaW9uSWQsCisJCQkJCSAgIGVXTklfU01FX0RJU0FTU09DX0lORCwgcFNpclNtZU1zZyk7CisJCWJyZWFrOworCWNhc2UgZUNzckRlYXV0aGVudGljYXRlZDoKKwkJcFNpclNtZU1zZyA9CisJCQkodFNpclNtZVJzcCAqKSAmcENvbW1hbmQtPnUud21TdGF0dXNDaGFuZ2VDbWQudS4KKwkJCURlYXV0aEluZE1zZzsKKwkJc3RhdHVzID0KKwkJCWNzcl9yb2FtX2xvc3RfbGluayhwTWFjLCBwQ29tbWFuZC0+c2Vzc2lvbklkLAorCQkJCQkgICBlV05JX1NNRV9ERUFVVEhfSU5ELCBwU2lyU21lTXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiZ2V0cyBhbiB1bmtub3duIGNvbW1hbmQgJWQiKSwKKwkJCXBDb21tYW5kLT51LndtU3RhdHVzQ2hhbmdlQ21kLlR5cGUpOworCQlicmVhazsKKwl9CisJLyogRm9yIFdEUywgd2Ugd2FudCB0byBzdG9wIEJTUyBhcyB3ZWxsIHdoZW4gaXQgaXMgaW5kaWNhdGVkIHRoYXQgaXQgaXMgZGlzY29ubmVjdGVkLiAqLworCWlmIChDU1JfSVNfQ09OTl9XRFMoJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKSkgeworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgIChjc3Jfcm9hbV9pc3N1ZV9zdG9wX2Jzc19jbWQocE1hYywgcENvbW1hbmQtPnNlc3Npb25JZCwgdHJ1ZSkpKSB7CisJCQkvKiBUaGlzIGlzIG5vdCBnb29kICovCisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIiAgZmFpbGVkIHRvIGlzc3VlIHN0b3BCU1MgY29tbWFuZCIpKTsKKwkJfQorCX0KKwkvKiBMb3N0IExpbmsganVzdCB0cmlnZ2VycyBhIHJvYW1pbmcgc2VxdWVuY2UuICBXZSBjYW4gY29tcGx0ZSB0aGUgTG9zdCBMaW5rICovCisJLyogY29tbWFuZCBoZXJlIHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkby4gKi8KKwljc3Jfcm9hbV93bV9zdGF0dXNfY2hhbmdlX2NvbXBsZXRlKHBNYWMpOworfQorCisKKy8qKgorICogY3NyX2NvbXB1dGVfbW9kZV9hbmRfYmFuZCgpIC0gY29tcHV0ZXMgZG90MTFtb2RlCisgKiBAcE1hYzogICAgICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAZG90MTFfbW9kZTogICAgb3V0IHBhcmFtLCBkbzExIG1vZGUgY2FsY3VsYXRlZAorICogQGJhbmQ6ICAgICAgICAgIG91dCBwYXJhbSwgYmFuZCBjYWNsY3VsYXRlZAorICogQG9wcl9jaDogICAgICAgIG9wZXJhdGluZyBjaGFubmVscworICoKKyAqIFRoaXMgZnVuY3Rpb24gZmluZHMgZG90MTEgbW9kZSBiYXNlZCBvbiBjdXJyZW50IG1vZGUsIG9wZXJhdGluZyBjaGFubmVsIGFuZAorICogZncgc3VwcG9ydGVkIG1vZGVzLgorICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgdm9pZAorY3NyX2NvbXB1dGVfbW9kZV9hbmRfYmFuZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJICBlQ3NyQ2ZnRG90MTFNb2RlICpkb3QxMV9tb2RlLAorCQkJICBlQ3NyQmFuZCAqYmFuZCwKKwkJCSAgdWludDhfdCBvcHJfY2gpCit7CisJYm9vbCB2aHRfMjRfZ2h6ID0gbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5lbmFibGVWaHRGb3IyNEdIejsKKwlzd2l0Y2ggKG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSkgeworCWNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE6CisJCSpkb3QxMV9tb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE7CisJCSpiYW5kID0gZUNTUl9CQU5EXzVHOworCQlicmVhazsKKwljYXNlIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOgorCQkqZG90MTFfbW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOworCQkqYmFuZCA9IGVDU1JfQkFORF8yNDsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzoKKwkJKmRvdDExX21vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKwkJKmJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisJCWJyZWFrOworCWNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU46CisJCSpkb3QxMV9tb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisJCSpiYW5kID0gQ1NSX0dFVF9CQU5EKG9wcl9jaCk7CisJCWJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQUM6CisJCWlmIChJU19GRUFUVVJFX1NVUFBPUlRFRF9CWV9GVyhET1QxMUFDKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBpcyBpbiAyLjQgR0h6IGJhbmQsIGNoZWNrCisJCQkgKiBmb3IgSU5JIGl0ZW0gdG8gZGlzYWJsZSBWSFQgb3BlcmF0aW9uIGluIDIuNCBHSHogYmFuZAorCQkJICovCisJCQlpZiAoQ0RTX0lTX0NIQU5ORUxfMjRHSFoob3ByX2NoKSAmJiAhdmh0XzI0X2doeikKKwkJCQkvKiBEaXNhYmxlIDExQUMgb3BlcmF0aW9uICovCisJCQkJKmRvdDExX21vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTjsKKwkJCWVsc2UKKwkJCQkqZG90MTFfbW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBQzsKKwkJfSBlbHNlIHsKKwkJCSpkb3QxMV9tb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisJCX0KKwkJKmJhbmQgPSBDU1JfR0VUX0JBTkQob3ByX2NoKTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQUNfT05MWToKKwkJaWYgKElTX0ZFQVRVUkVfU1VQUE9SVEVEX0JZX0ZXKERPVDExQUMpKSB7CisJCQkvKgorCQkJICogSWYgdGhlIG9wZXJhdGluZyBjaGFubmVsIGlzIGluIDIuNCBHSHogYmFuZCwgY2hlY2sKKwkJCSAqIGZvciBJTkkgaXRlbSB0byBkaXNhYmxlIFZIVCBvcGVyYXRpb24gaW4gMi40IEdIeiBiYW5kCisJCQkgKi8KKwkJCWlmIChDRFNfSVNfQ0hBTk5FTF8yNEdIWihvcHJfY2gpICYmICF2aHRfMjRfZ2h6KQorCQkJCS8qIERpc2FibGUgMTFBQyBvcGVyYXRpb24gKi8KKwkJCQkqZG90MTFfbW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOworCQkJZWxzZQorCQkJCSpkb3QxMV9tb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUFDX09OTFk7CisJCX0gZWxzZSB7CisJCQkqZG90MTFfbW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOworCQl9CisJCSpiYW5kID0gQ1NSX0dFVF9CQU5EKG9wcl9jaCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFX0FVVE86CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJaWYgKElTX0ZFQVRVUkVfU1VQUE9SVEVEX0JZX0ZXKERPVDExQUMpKSB7CisJCQkvKgorCQkJICogSWYgdGhlIG9wZXJhdGluZyBjaGFubmVsIGlzIGluIDIuNCBHSHogYmFuZCwKKwkJCSAqIGNoZWNrIGZvciBJTkkgaXRlbSB0byBkaXNhYmxlIFZIVCBvcGVyYXRpb24KKwkJCSAqIGluIDIuNCBHSHogYmFuZAorCQkJICovCisJCQlpZiAoQ0RTX0lTX0NIQU5ORUxfMjRHSFoob3ByX2NoKQorCQkJCSYmICF2aHRfMjRfZ2h6KQorCQkJCS8qIERpc2FibGUgMTFBQyBvcGVyYXRpb24gKi8KKwkJCQkqZG90MTFfbW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOworCQkJZWxzZQorCQkJCSpkb3QxMV9tb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUFDOworCQl9IGVsc2UgeworCQkJKmRvdDExX21vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTjsKKwkJfQorI2Vsc2UKKwkJKmRvdDExX21vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTjsKKyNlbmRpZgorCQkqYmFuZCA9IENTUl9HRVRfQkFORChvcHJfY2gpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBHbG9iYWwgZG90MTEgTW9kZSBzZXR0aW5nIGlzIDExYS9iL2cuIHVzZSB0aGUgY2hhbm5lbCBudW1iZXIKKwkJICogdG8gZGV0ZXJtaW5lIHRoZSBNb2RlIHNldHRpbmcuCisJCSAqLworCQlpZiAoZUNTUl9PUEVSQVRJTkdfQ0hBTk5FTF9BVVRPID09IG9wcl9jaCkgeworCQkJKmJhbmQgPSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmVCYW5kOworCQkJaWYgKGVDU1JfQkFORF8yNCA9PSAqYmFuZCkgeworCQkJCS8qCisJCQkJICogU2VlIHJlYXNvbiBpbiBlbHNlIGlmICggQ0RTX0lTX0NIQU5ORUxfMjRHSFoKKwkJCQkgKiAob3ByX2NoKSApIHRvIHBpY2sgMTFCCisJCQkJICovCisJCQkJKmRvdDExX21vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKwkJCX0gZWxzZSB7CisJCQkJLyogcHJlZmVyIDVHSHogKi8KKwkJCQkqYmFuZCA9IGVDU1JfQkFORF81RzsKKwkJCQkqZG90MTFfbW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOworCQkJfQorCQl9IGVsc2UgaWYgKENEU19JU19DSEFOTkVMXzI0R0haKG9wcl9jaCkpIHsKKwkJCS8qCisJCQkgKiBXaUZpIHRlc3RzIHJlcXVpcmUgSUJTUyBuZXR3b3JrcyB0byBzdGFydCBpbiAxMWIgbW9kZQorCQkJICogd2l0aG91dCBhbnkgY2hhbmdlIHRvIHRoZSBkZWZhdWx0IHBhcmFtZXRlciBzZXR0aW5ncworCQkJICogb24gdGhlIGFkYXB0ZXIuIFdlIHVzZSBBQ1UgdG8gc3RhcnQgYW4gSUJTUyB0aHJvdWdoCisJCQkgKiBjcmVhdGlvbiBvZiBhIHN0YXJ0SUJTUyBwcm9maWxlLiBUaGlzIHN0YXJ0SUJTUworCQkJICogcHJvZmlsZSBoYXMgQXV0byBNQUNQcm90b2NvbCBhbmQgdGhlIGFkYXB0ZXIgcHJvcGVydHkKKwkJCSAqIHNldHRpbmcgZm9yIGRvdDExTW9kZSBpcyBhbHNvIEFVVE8uIFNvIGluIHRoaXMgY2FzZSwKKwkJCSAqIGxldCdzIHN0YXJ0IHRoZSBJQlNTIG5ldHdvcmsgaW4gMTFiIG1vZGUgaW5zdGVhZCBvZgorCQkJICogMTFnIG1vZGUuIFNvIHRoaXMgaXMgZm9yIEF1dG89cHJvZmlsZS0+TWFjUHJvdG9jb2wgJiYKKwkJCSAqIEF1dG89R2xvYmFsLiBkb3QxMU1vZGUgJiYgcHJvZmlsZS0+Y2hhbm5lbCBpcyA8IDE0LAorCQkJICogdGhlbiBzdGFydCB0aGUgSUJTUyBpbiBiIG1vZGUuCisJCQkgKgorCQkJICogTm90ZTogd2UgdXNlZCB0byBoYXZlIHRoaXMgc3RhcnQgYXMgYW4gMTFnIElCU1MgZm9yCisJCQkgKiBiZXN0IHBlcmZvcm1hbmNlLiBub3cgdG8gc3BlY2lmeSB0aGF0IHRoZSB1c2VyIHdpbGwKKwkJCSAqIGhhdmUgdG8gc2V0IHRoZSBkbzExTW9kZSBpbiB0aGUgcHJvcGVydHkgcGFnZSB0byAxMWcKKwkJCSAqIHRvIGZvcmNlIGl0LgorCQkJICovCisJCQkqZG90MTFfbW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOworCQkJKmJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisJCX0gZWxzZSB7CisJCQkvKiBlbHNlLCBpdCdzIGEgNS4wR0h6IGNoYW5uZWwuICBTZXQgbW9kZSB0byAxMWEuICovCisJCQkqZG90MTFfbW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOworCQkJKmJhbmQgPSBlQ1NSX0JBTkRfNUc7CisJCX0KKwkJYnJlYWs7CisJfSAvKiBzd2l0Y2ggKi8KK30KKworLyoqCisgKiBjc3Jfcm9hbV9nZXRfcGh5X21vZGVfYmFuZF9mb3JfYnNzKCkgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYmFuZCBhbmQgbW9kZQorICogaW5mb3JtYXRpb24uCisgKiBAbWFjX2N0eDogICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAcHJvZmlsZTogICAgICAgYnNzIHByb2ZpbGUKKyAqIEBiYW5kOiAgICAgICAgICBvdXQgcGFyYW0sIGJhbmQgY2FjbGN1bGF0ZWQKKyAqIEBvcHJfY2g6ICAgICAgICBvcGVyYXRpbmcgY2hhbm5lbHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIGRvdDExIG1vZGUgYmFzZWQgb24gY3VycmVudCBtb2RlLCBvcGVyYXRpbmcgY2hhbm5lbCBhbmQKKyAqIGZ3IHN1cHBvcnRlZCBtb2Rlcy4gVGhlIG9ubHkgdHJpY2t5IHBhcnQgaXMgdGhhdCBpZiBwaHlNb2RlIGlzIHNldCB0byAxMWFiZywKKyAqIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQiBpbnN0ZWFkIG9mCisgKiBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRyBpZiBldmVyeXRoaW5nIGlzIHNldCB0byBhdXRvLXBpY2suCisgKgorICogUmV0dXJuOiBkb3QxMW1vZGUKKyAqLworc3RhdGljIGVDc3JDZmdEb3QxMU1vZGUKK2Nzcl9yb2FtX2dldF9waHlfbW9kZV9iYW5kX2Zvcl9ic3ModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgICB0Q3NyUm9hbVByb2ZpbGUgKnByb2ZpbGUsCisJCQkJICAgdWludDhfdCBvcHJfY2huLAorCQkJCSAgIGVDc3JCYW5kICpwX2JhbmQpCit7CisJZUNzckJhbmQgYmFuZDsKKwllQ3NyQ2ZnRG90MTFNb2RlIGN1cnJfbW9kZSA9IG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZTsKKwllQ3NyQ2ZnRG90MTFNb2RlIGNmZ19kb3QxMV9tb2RlID0KKwkJY3NyX2dldF9jZmdfZG90MTFfbW9kZV9mcm9tX2Nzcl9waHlfbW9kZShwcm9maWxlLAorCQkJKGVDc3JQaHlNb2RlKSBwcm9maWxlLT5waHlNb2RlLAorCQkJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZCk7CisKKwkvKgorCSAqIElmIHRoZSBnbG9iYWwgc2V0dGluZyBmb3IgZG90MTFNb2RlIGlzIHNldCB0byBhdXRvL2FiZywgd2Ugb3ZlcndyaXRlCisJICogdGhlIHNldHRpbmcgaW4gdGhlIHByb2ZpbGUuCisJICovCisJaWYgKCgoIUNTUl9JU19JTkZSQV9BUChwcm9maWxlKSAmJiAhQ1NSX0lTX1dEUyhwcm9maWxlKSkKKwkgICAgJiYgKChlQ1NSX0NGR19ET1QxMV9NT0RFX0FVVE8gPT0gY3Vycl9tb2RlKQorCSAgICB8fCAoZUNTUl9DRkdfRE9UMTFfTU9ERV9BQkcgPT0gY3Vycl9tb2RlKSkpCisJICAgIHx8IChlQ1NSX0NGR19ET1QxMV9NT0RFX0FVVE8gPT0gY2ZnX2RvdDExX21vZGUpCisJICAgIHx8IChlQ1NSX0NGR19ET1QxMV9NT0RFX0FCRyA9PSBjZmdfZG90MTFfbW9kZSkpIHsKKwkJY3NyX2NvbXB1dGVfbW9kZV9hbmRfYmFuZChtYWNfY3R4LCAmY2ZnX2RvdDExX21vZGUsCisJCQkJCSAgJmJhbmQsIG9wcl9jaG4pOworCX0gLyogaWYoIGVDU1JfQ0ZHX0RPVDExX01PREVfQUJHID09IGNmZ19kb3QxMV9tb2RlICkgKi8KKwllbHNlIHsKKwkJLyogZG90MTEgbW9kZSBpcyBzZXQsIGxldHMgcGljayB0aGUgYmFuZCAqLworCQlpZiAoZUNTUl9PUEVSQVRJTkdfQ0hBTk5FTF9BVVRPID09IG9wcl9jaG4pIHsKKwkJCS8qIGNoYW5uZWwgaXMgQXV0byBhbHNvLiAqLworCQkJYmFuZCA9IG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uZUJhbmQ7CisJCQlpZiAoZUNTUl9CQU5EX0FMTCA9PSBiYW5kKSB7CisJCQkJLyogcHJlZmVyIDVHSHogKi8KKwkJCQliYW5kID0gZUNTUl9CQU5EXzVHOworCQkJfQorCQl9IGVsc2V7CisJCQliYW5kID0gQ1NSX0dFVF9CQU5EKG9wcl9jaG4pOworCQl9CisJfQorCWlmIChwX2JhbmQpCisJCSpwX2JhbmQgPSBiYW5kOworCisJaWYgKG9wcl9jaG4gPT0gMTQpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiU3dpdGNoaW5nIHRvIERvdDExQiBtb2RlIikpOworCQljZmdfZG90MTFfbW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOworCX0KKworCS8qCisJICogSW5jYXNlIG9mIFdFUCBTZWN1cml0eSBlbmNyeXB0aW9uIHR5cGUgaXMgY29taW5nIGFzIHBhcnQgb2YgYWRkIGtleS4KKwkgKiBTbyB3aGlsZSBTVGFydCBCU1MgZG9udCBoYXZlIGluZm9ybWF0aW9uCisJICovCisJaWYgKCghQ1NSX0lTXzExbl9BTExPV0VEKHByb2ZpbGUtPkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdKQorCSAgICB8fCAoKHByb2ZpbGUtPnByaXZhY3kgPT0gMSkKKwkJJiYgKHByb2ZpbGUtPkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID09CisJCWVDU1JfRU5DUllQVF9UWVBFX05PTkUpKSkKKwkJJiYgKChlQ1NSX0NGR19ET1QxMV9NT0RFXzExTiA9PSBjZmdfZG90MTFfbW9kZSkgfHwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCSAgICAgKGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBQyA9PSBjZmdfZG90MTFfbW9kZSkKKyNlbmRpZgorCSAgICAgKSkgeworCQkvKiBXZSBjYW5ub3QgZG8gMTFuIGhlcmUgKi8KKwkJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKG9wcl9jaG4pKQorCQkJY2ZnX2RvdDExX21vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKwkJZWxzZQorCQkJY2ZnX2RvdDExX21vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQTsKKwl9CisJcmV0dXJuIGNmZ19kb3QxMV9tb2RlOworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX2lzc3VlX3N0b3BfYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICBlQ3NyUm9hbVN1YlN0YXRlIE5ld1N1YnN0YXRlKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCXsKKwkJaG9zdF9sb2dfaWJzc19wa3RfdHlwZSAqcElic3NMb2c7CisJCVdMQU5fSE9TVF9ESUFHX0xPR19BTExPQyhwSWJzc0xvZywgaG9zdF9sb2dfaWJzc19wa3RfdHlwZSwKKwkJCQkJIExPR19XTEFOX0lCU1NfQyk7CisJCWlmIChwSWJzc0xvZykgeworCQkJcElic3NMb2ctPmV2ZW50SWQgPSBXTEFOX0lCU1NfRVZFTlRfU1RPUF9SRVE7CisJCQlXTEFOX0hPU1RfRElBR19MT0dfUkVQT1JUKHBJYnNzTG9nKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAqLworCS8qIFNldCB0aGUgcm9hbWluZyBzdWJzdGF0ZSB0byAnc3RvcCBCc3MgcmVxdWVzdCcuLi4gKi8KKwljc3Jfcm9hbV9zdWJzdGF0ZV9jaGFuZ2UocE1hYywgTmV3U3Vic3RhdGUsIHNlc3Npb25JZCk7CisKKwkvKiBhdHRlbXB0IHRvIHN0b3AgdGhlIEJzcyAocmVhc29uIGNvZGUgaXMgaWdub3JlZC4uLikgKi8KKwlzdGF0dXMgPSBjc3Jfc2VuZF9tYl9zdG9wX2Jzc19yZXFfbXNnKHBNYWMsIHNlc3Npb25JZCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQlGTCgiY3NyX3NlbmRfbWJfc3RvcF9ic3NfcmVxX21zZyBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiKSwKKwkJCXN0YXR1cyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIHBOdW1DaGFuIGlzIGEgY2FsbGVyIGFsbG9jYXRlZCBzcGFjZSB3aXRoIHRoZSBzaXplb2YgcENoYW5uZWxzICovCitDREZfU1RBVFVTIGNzcl9nZXRfY2ZnX3ZhbGlkX2NoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBDaGFubmVscywKKwkJCQkgICAgICB1aW50MzJfdCAqcE51bUNoYW4pCit7CisJaWYgKCFJU19TSVJfU1RBVFVTX1NVQ0NFU1Mod2xhbl9jZmdfZ2V0X3N0cihwTWFjLAorCQkJCQlXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCwKKwkJCQkJKHVpbnQ4X3QgKikgcENoYW5uZWxzLCBwTnVtQ2hhbikpKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKwordFBvd2VyZEJtIGNzcl9nZXRfY2ZnX21heF90eF9wb3dlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNoYW5uZWwpCit7CisJdWludDMyX3QgY2ZnTGVuZ3RoID0gMDsKKwl1aW50MTZfdCBjZmdJZCA9IDA7CisJdFBvd2VyZEJtIG1heFR4UHdyID0gMDsKKwl1aW50OF90ICpwQ291bnRyeUluZm8gPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQ4X3QgY291bnQgPSAwOworCXVpbnQ4X3QgZmlyc3RDaGFubmVsOworCXVpbnQ4X3QgbWF4Q2hhbm5lbHM7CisKKwlpZiAoQ0RTX0lTX0NIQU5ORUxfNUdIWihjaGFubmVsKSkgeworCQljZmdJZCA9IFdOSV9DRkdfTUFYX1RYX1BPV0VSXzU7CisJCWNmZ0xlbmd0aCA9IFdOSV9DRkdfTUFYX1RYX1BPV0VSXzVfTEVOOworCX0gZWxzZSBpZiAoQ0RTX0lTX0NIQU5ORUxfMjRHSFooY2hhbm5lbCkpIHsKKwkJY2ZnSWQgPSBXTklfQ0ZHX01BWF9UWF9QT1dFUl8yXzQ7CisJCWNmZ0xlbmd0aCA9IFdOSV9DRkdfTUFYX1RYX1BPV0VSXzJfNF9MRU47CisJfSBlbHNlCisJCXJldHVybiBtYXhUeFB3cjsKKworCXBDb3VudHJ5SW5mbyA9IGNkZl9tZW1fbWFsbG9jKGNmZ0xlbmd0aCk7CisJaWYgKE5VTEwgPT0gcENvdW50cnlJbmZvKQorCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJZWxzZQorCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSwgc3RhdHVzID0gJWQiKSwKKwkJCSAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAod2xhbl9jZmdfZ2V0X3N0cihwTWFjLCBjZmdJZCwgKHVpbnQ4X3QgKilwQ291bnRyeUluZm8sCisJCQkmY2ZnTGVuZ3RoKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogSWRlbnRpZnkgdGhlIGNoYW5uZWwgYW5kIG1heHR4cG93ZXIgKi8KKwl3aGlsZSAoY291bnQgPD0gKGNmZ0xlbmd0aCAtIChzaXplb2YodFNpck1hY0NoYW5JbmZvKSkpKSB7CisJCWZpcnN0Q2hhbm5lbCA9IHBDb3VudHJ5SW5mb1tjb3VudCsrXTsKKwkJbWF4Q2hhbm5lbHMgPSBwQ291bnRyeUluZm9bY291bnQrK107CisJCW1heFR4UHdyID0gcENvdW50cnlJbmZvW2NvdW50KytdOworCisJCWlmICgoY2hhbm5lbCA+PSBmaXJzdENoYW5uZWwpICYmCisJCSAgICAoY2hhbm5lbCA8IChmaXJzdENoYW5uZWwgKyBtYXhDaGFubmVscykpKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworZXJyb3I6CisJaWYgKE5VTEwgIT0gcENvdW50cnlJbmZvKQorCQljZGZfbWVtX2ZyZWUocENvdW50cnlJbmZvKTsKKworCXJldHVybiBtYXhUeFB3cjsKK30KKworYm9vbCBjc3Jfcm9hbV9pc19jaGFubmVsX3ZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgY2hhbm5lbCkKK3sKKwlib29sIGZWYWxpZCA9IGZhbHNlOworCXVpbnQzMl90IGlkeFZhbGlkQ2hhbm5lbHM7CisJdWludDMyX3QgbGVuID0gc2l6ZW9mKHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCk7CisKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCSAgICAoY3NyX2dldF9jZmdfdmFsaWRfY2hhbm5lbHMocE1hYywgcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCAmbGVuKSkpIHsKKwkJZm9yIChpZHhWYWxpZENoYW5uZWxzID0gMDsgKGlkeFZhbGlkQ2hhbm5lbHMgPCBsZW4pOworCQkgICAgIGlkeFZhbGlkQ2hhbm5lbHMrKykgeworCQkJaWYgKGNoYW5uZWwgPT0KKwkJCSAgICBwTWFjLT5yb2FtLnZhbGlkQ2hhbm5lbExpc3RbaWR4VmFsaWRDaGFubmVsc10pIHsKKwkJCQlmVmFsaWQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXBNYWMtPnJvYW0ubnVtVmFsaWRDaGFubmVscyA9IGxlbjsKKwlyZXR1cm4gZlZhbGlkOworfQorCitib29sIGNzcl9yb2FtX2lzX3ZhbGlkNDBfbWh6X2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBjaGFubmVsKQoreworCWJvb2wgZlZhbGlkID0gZmFsc2U7CisJdWludDhfdCBpOworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5zY2FuLmJhc2U0ME1IekNoYW5uZWxzLm51bUNoYW5uZWxzOyBpKyspIHsKKwkJaWYgKGNoYW5uZWwgPT0gcE1hYy0+c2Nhbi5iYXNlNDBNSHpDaGFubmVscy5jaGFubmVsTGlzdFtpXSkgeworCQkJZlZhbGlkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBmVmFsaWQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY2hlY2sgYW5kIHZhbGlkYXRlIHdoZXRoZXIgdGhlIE5JQyBjYW4gZG8gQ0IgKDQwTUh6KSAqLworc3RhdGljIGVQaHlDaGFuQm9uZFN0YXRlIGNzcl9nZXRfY2JfbW9kZV9mcm9tX2llcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICB1aW50OF90IHByaW1hcnlDaG4sCisJCQkJCQkgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisJZVBoeUNoYW5Cb25kU3RhdGUgZVJldCA9IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKwl1aW50OF90IGNlbnRlckNobjsKKwl1aW50MzJfdCBDaGFubmVsQm9uZGluZ01vZGU7CisJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKHByaW1hcnlDaG4pKSB7CisJCS8qCisJCSAqIGdDaGFubmVsQm9uZGluZ01vZGUyNEdIeiBjb25maWd1cmF0aW9uIGl0ZW0gaXMgY29tbW9uIGZvcgorCQkgKiBTQVAgYW5kIFNUQSBtb2RlIGFuZCBjdXJyZW50bHkgTURNIGRvZXMgbm90IHN1cHBvcnQKKwkJICogSFQ0MCBpbiAyLjRHaHogU1RBIG1vZGUuCisJCSAqIFNvIGRpc2FibGluZyB0aGUgSFQ0MCBpbiAyLjRHSHogc3RhdGlvbiBtb2RlCisJCSAqLworI2lmZGVmIFFDQV9IVF8yMF8yNEdfU1RBX09OTFkKKwkJQ2hhbm5lbEJvbmRpbmdNb2RlID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworI2Vsc2UKKwkJQ2hhbm5lbEJvbmRpbmdNb2RlID0KKwkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHo7CisjZW5kaWYKKwl9IGVsc2UgeworCQlDaGFubmVsQm9uZGluZ01vZGUgPQorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGU1R0h6OworCX0KKworCWlmIChXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEUgPT0gQ2hhbm5lbEJvbmRpbmdNb2RlKQorCQlyZXR1cm4gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCisJLyogRmlndXJlIHdoYXQgdGhlIG90aGVyIHNpZGUncyBDQiBtb2RlICovCisJaWYgKCEocEllcy0+SFRDYXBzLnByZXNlbnQgJiYgKGVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaID09CisJCXBJZXMtPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpKSkgeworCQlyZXR1cm4gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCX0KKworCS8qIENoZWNrIHNldCBhcyBUS0lQIG9yIG5vdC4gKi8KKwlpZiAoKChOVUxMICE9ICYocEllcy0+UlNOLnB3aXNlX2NpcGhlcl9zdWl0ZXNbMF1bMF0pICYmCisJCShwSWVzLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ID09IDEpKSAmJgorCQkhbWVtY21wKCYocEllcy0+UlNOLnB3aXNlX2NpcGhlcl9zdWl0ZXNbMF1bMF0pLAorCQkgICAgICJceDAwXHgwZlx4YWNceDAyIiwgNCkpCisJICAgIHx8ICgoKE5VTEwgIT0gJihwSWVzLT5XUEEpKSAmJgorCQkgKHBJZXMtPldQQS51bmljYXN0X2NpcGhlcl9jb3VudCA9PSAxKSkKKwkJJiYgKChOVUxMICE9ICYocEllcy0+V1BBLnVuaWNhc3RfY2lwaGVyc1swXSkpCisJCSAgICAmJiAhbWVtY21wKCYocEllcy0+V1BBLnVuaWNhc3RfY2lwaGVyc1swXSksCisJCQkgICAgICAgIlx4MDBceDBmXHhhY1x4MDIiLCA0KSkpKSB7CisJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCSIgTm8gY2hhbm5lbCBib25kaW5nIGluIFRLSVAgbW9kZSAiKTsKKwkJcmV0dXJuIFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKwl9CisKKwlpZiAoIXBJZXMtPkhUSW5mby5wcmVzZW50KQorCQlyZXR1cm4gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCisJLyoKKwkgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgSU5GUkEgU1RBL0NMSUVOVCBhbmQgc2hvdWxkIHVzZSB0aGUgbWVyZ2VkCisJICogdmFsdWUgb2Ygc3VwcG9ydGVkIGNoYW5uZWwgd2lkdGggYW5kIHJlY29tbWVuZGVkIHR4IHdpZHRoIGFzIHBlcgorCSAqIHN0YW5kYXJkCisJICovCisJc21zX2xvZyhwTWFjLCBMT0cxLCAic2N3cyAldSBydHdzICV1IHNjbyAldSIsCisJCXBJZXMtPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQsCisJCXBJZXMtPkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQsCisJCXBJZXMtPkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKKworCWlmIChwSWVzLT5IVEluZm8ucmVjb21tZW5kZWRUeFdpZHRoU2V0ID09IGVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaKQorCQllUmV0ID0gKGVQaHlDaGFuQm9uZFN0YXRlKXBJZXMtPkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworCWVsc2UKKwkJZVJldCA9IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKworCXN3aXRjaCAoZVJldCkgeworCWNhc2UgUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZOgorCQljZW50ZXJDaG4gPSBwcmltYXJ5Q2huICsgQ1NSX0NCX0NFTlRFUl9DSEFOTkVMX09GRlNFVDsKKwkJYnJlYWs7CisJY2FzZSBQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOgorCQljZW50ZXJDaG4gPSBwcmltYXJ5Q2huIC0gQ1NSX0NCX0NFTlRFUl9DSEFOTkVMX09GRlNFVDsKKwkJYnJlYWs7CisJY2FzZSBQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQ6CisJZGVmYXVsdDoKKwkJY2VudGVyQ2huID0gcHJpbWFyeUNobjsKKwkJYnJlYWs7CisJfQorCisJaWYgKChQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQgIT0gZVJldCkKKwkgICAgJiYgIWNzcl9yb2FtX2lzX3ZhbGlkNDBfbWh6X2NoYW5uZWwocE1hYywgY2VudGVyQ2huKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiSW52YWxpZCBjZW50ZXIgY2hhbm5lbCAoJWQpLCBkaXNhYmxlIDQwTUh6IG1vZGUiLAorCQkJY2VudGVyQ2huKTsKKwkJZVJldCA9IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKwl9CisJcmV0dXJuIGVSZXQ7Cit9CisKK2Jvb2wgY3NyX2lzX2VuY3J5cHRpb25faW5fbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgIHRDc3JFbmNyeXB0aW9uTGlzdCAqcENpcGhlckxpc3QsCisJCQkgICAgICAgZUNzckVuY3J5cHRpb25UeXBlIGVuY3J5cHRpb25UeXBlKQoreworCWJvb2wgZkZvdW5kID0gZmFsc2U7CisJdWludDMyX3QgaWR4OworCWZvciAoaWR4ID0gMDsgaWR4IDwgcENpcGhlckxpc3QtPm51bUVudHJpZXM7IGlkeCsrKSB7CisJCWlmIChwQ2lwaGVyTGlzdC0+ZW5jcnlwdGlvblR5cGVbaWR4XSA9PSBlbmNyeXB0aW9uVHlwZSkgeworCQkJZkZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBmRm91bmQ7Cit9CisKK2Jvb2wgY3NyX2lzX2F1dGhfaW5fbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQXV0aExpc3QgKnBBdXRoTGlzdCwKKwkJCSBlQ3NyQXV0aFR5cGUgYXV0aFR5cGUpCit7CisJYm9vbCBmRm91bmQgPSBmYWxzZTsKKwl1aW50MzJfdCBpZHg7CisJZm9yIChpZHggPSAwOyBpZHggPCBwQXV0aExpc3QtPm51bUVudHJpZXM7IGlkeCsrKSB7CisJCWlmIChwQXV0aExpc3QtPmF1dGhUeXBlW2lkeF0gPT0gYXV0aFR5cGUpIHsKKwkJCWZGb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gZkZvdW5kOworfQorCitib29sIGNzcl9pc19zYW1lX3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBQcm9maWxlMSwKKwkJCSB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlMikKK3sKKwl1aW50MzJfdCBpOworCWJvb2wgZkNoZWNrID0gZmFsc2U7CisJdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWlmICghKHBQcm9maWxlMSAmJiBwUHJvZmlsZTIpKQorCQlyZXR1cm4gZkNoZWNrOworCXBTY2FuRmlsdGVyID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisJaWYgKE5VTEwgPT0gcFNjYW5GaWx0ZXIpCisJCXJldHVybiBmQ2hlY2s7CisKKwljZGZfbWVtX3NldChwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSwgMCk7CisJc3RhdHVzID0gY3NyX3JvYW1fcHJlcGFyZV9maWx0ZXJfZnJvbV9wcm9maWxlKHBNYWMsIHBQcm9maWxlMiwKKwkJCQkJCSAgICAgIHBTY2FuRmlsdGVyKTsKKwlpZiAoIShDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkpCisJCWdvdG8gZnJlZV9zY2FuX2ZpbHRlcjsKKworCWZvciAoaSA9IDA7IGkgPCBwU2NhbkZpbHRlci0+U1NJRHMubnVtT2ZTU0lEczsgaSsrKSB7CisJCWZDaGVjayA9IGNzcl9pc19zc2lkX21hdGNoKHBNYWMsCisJCQkJcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0W2ldLlNTSUQuc3NJZCwKKwkJCQlwU2NhbkZpbHRlci0+U1NJRHMuU1NJRExpc3RbaV0uU1NJRC5sZW5ndGgsCisJCQkJcFByb2ZpbGUxLT5TU0lELnNzSWQsCisJCQkJcFByb2ZpbGUxLT5TU0lELmxlbmd0aCwKKwkJCQlmYWxzZSk7CisJCWlmIChmQ2hlY2spCisJCQlicmVhazsKKwl9CisJaWYgKCFmQ2hlY2spCisJCWdvdG8gZnJlZV9zY2FuX2ZpbHRlcjsKKworCWlmICghY3NyX2lzX2F1dGhfaW5fbGlzdChwTWFjLCAmcFByb2ZpbGUyLT5BdXRoVHlwZSwKKwkJCQkgcFByb2ZpbGUxLT5BdXRoVHlwZSkKKwkgICAgfHwgKHBQcm9maWxlMi0+QlNTVHlwZSAhPSBwUHJvZmlsZTEtPkJTU1R5cGUpCisJICAgIHx8ICFjc3JfaXNfZW5jcnlwdGlvbl9pbl9saXN0KHBNYWMsICZwUHJvZmlsZTItPkVuY3J5cHRpb25UeXBlLAorCQkJCQkgIHBQcm9maWxlMS0+RW5jcnlwdGlvblR5cGUpKSB7CisJCWZDaGVjayA9IGZhbHNlOworCQlnb3RvIGZyZWVfc2Nhbl9maWx0ZXI7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJaWYgKHBQcm9maWxlMS0+TURJRC5tZGllUHJlc2VudCB8fCBwUHJvZmlsZTItPk1ESUQubWRpZVByZXNlbnQpIHsKKwkJaWYgKHBQcm9maWxlMS0+TURJRC5tb2JpbGl0eURvbWFpbgorCQkJIT0gcFByb2ZpbGUyLT5NRElELm1vYmlsaXR5RG9tYWluKSB7CisJCQlmQ2hlY2sgPSBmYWxzZTsKKwkJCWdvdG8gZnJlZV9zY2FuX2ZpbHRlcjsKKwkJfQorCX0KKyNlbmRpZgorCS8qIE1hdGNoIGZvdW5kICovCisJZkNoZWNrID0gdHJ1ZTsKK2ZyZWVfc2Nhbl9maWx0ZXI6CisJY3NyX2ZyZWVfc2Nhbl9maWx0ZXIocE1hYywgcFNjYW5GaWx0ZXIpOworCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlcik7CisJcmV0dXJuIGZDaGVjazsKK30KKworYm9vbCBjc3Jfcm9hbV9pc19zYW1lX3Byb2ZpbGVfa2V5cyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcENvbm5Qcm9maWxlLAorCQkJCSAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUyKQoreworCWJvb2wgZkNoZWNrID0gZmFsc2U7CisJaW50IGk7CisJZG8geworCQkvKiBPbmx5IGNoZWNrIGZvciBzdGF0aWMgV0VQICovCisJCWlmICghY3NyX2lzX2VuY3J5cHRpb25faW5fbGlzdAorCQkJICAgIChwTWFjLCAmcFByb2ZpbGUyLT5FbmNyeXB0aW9uVHlwZSwKKwkJCSAgICBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVkpCisJCSAgICAmJiAhY3NyX2lzX2VuY3J5cHRpb25faW5fbGlzdChwTWFjLAorCQkJCSZwUHJvZmlsZTItPkVuY3J5cHRpb25UeXBlLAorCQkJCWVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVkpKSB7CisJCQlmQ2hlY2sgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFjc3JfaXNfZW5jcnlwdGlvbl9pbl9saXN0CisJCQkgICAgKHBNYWMsICZwUHJvZmlsZTItPkVuY3J5cHRpb25UeXBlLAorCQkJICAgIHBDb25uUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUpKQorCQkJYnJlYWs7CisJCWlmIChwQ29ublByb2ZpbGUtPktleXMuZGVmYXVsdEluZGV4ICE9CisJCSAgICBwUHJvZmlsZTItPktleXMuZGVmYXVsdEluZGV4KQorCQkJYnJlYWs7CisJCWZvciAoaSA9IDA7IGkgPCBDU1JfTUFYX05VTV9LRVk7IGkrKykgeworCQkJaWYgKHBDb25uUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhbaV0gIT0KKwkJCSAgICBwUHJvZmlsZTItPktleXMuS2V5TGVuZ3RoW2ldKQorCQkJCWJyZWFrOworCQkJaWYgKCFjZGZfbWVtX2NvbXBhcmUoJnBDb25uUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFtpXSwKKwkJCQkJICAgICAmcFByb2ZpbGUyLT5LZXlzLktleU1hdGVyaWFsW2ldLAorCQkJCQkgICAgIHBQcm9maWxlMi0+S2V5cy5LZXlMZW5ndGhbaV0pKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gQ1NSX01BWF9OVU1fS0VZKSB7CisJCQlmQ2hlY2sgPSB0cnVlOworCQl9CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIGZDaGVjazsKK30KKworLyogSUJTUyAqLworCit1aW50OF90IGNzcl9yb2FtX2dldF9pYnNzX3N0YXJ0X2NoYW5uZWxfbnVtYmVyNTAodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl1aW50OF90IGNoYW5uZWwgPSAwOworCXVpbnQzMl90IGlkeDsKKwl1aW50MzJfdCBpZHhWYWxpZENoYW5uZWxzOworCWJvb2wgZkZvdW5kID0gZmFsc2U7CisJdWludDMyX3QgbGVuID0gc2l6ZW9mKHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCk7CisKKwlpZiAoZUNTUl9PUEVSQVRJTkdfQ0hBTk5FTF9BTlkgIT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5BZEhvY0NoYW5uZWw1RykgeworCQljaGFubmVsID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5BZEhvY0NoYW5uZWw1RzsKKwkJaWYgKCFjc3Jfcm9hbV9pc19jaGFubmVsX3ZhbGlkKHBNYWMsIGNoYW5uZWwpKSB7CisJCQljaGFubmVsID0gMDsKKwkJfQorCX0KKwlpZiAoMCA9PSBjaGFubmVsCisJICAgICYmCisJICAgIENERl9JU19TVEFUVVNfU1VDQ0VTUyhjc3JfZ2V0X2NmZ192YWxpZF9jaGFubmVscworCQkJCQkgIChwTWFjLAorCQkJCQkgICh1aW50OF90ICopIHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCwKKwkJCQkJICAmbGVuKSkpIHsKKwkJZm9yIChpZHggPSAwOyAoaWR4IDwgQ1NSX05VTV9JQlNTX1NUQVJUX0NIQU5ORUxTXzUwKSAmJiAhZkZvdW5kOworCQkgICAgIGlkeCsrKSB7CisJCQlmb3IgKGlkeFZhbGlkQ2hhbm5lbHMgPSAwOworCQkJICAgICAoaWR4VmFsaWRDaGFubmVscyA8IGxlbikgJiYgIWZGb3VuZDsKKwkJCSAgICAgaWR4VmFsaWRDaGFubmVscysrKSB7CisJCQkJaWYgKGNzcl9zdGFydF9pYnNzX2NoYW5uZWxzNTBbaWR4XSA9PQorCQkJCSAgICBwTWFjLT5yb2FtLgorCQkJCSAgICB2YWxpZENoYW5uZWxMaXN0W2lkeFZhbGlkQ2hhbm5lbHNdKSB7CisJCQkJCWZGb3VuZCA9IHRydWU7CisJCQkJCWNoYW5uZWwgPSBjc3Jfc3RhcnRfaWJzc19jaGFubmVsczUwW2lkeF07CisJCQkJfQorCQkJfQorCQl9CisJCS8qCisJCSAqIHRoaXMgaXMgcmFyZSwgYnV0IGlmIGl0IGRvZXMgaGFwcGVuLAorCQkgKiB3ZSBmaW5kIGFueW9uZSBpbiAxMWEgYmFuZHdpZHRoIGFuZAorCQkgKiByZXR1cm4gdGhlIGZpcnN0IDExYSBjaGFubmVsIGZvdW5kIQorCQkgKi8KKwkJaWYgKCFmRm91bmQpIHsKKwkJCWZvciAoaWR4VmFsaWRDaGFubmVscyA9IDA7IGlkeFZhbGlkQ2hhbm5lbHMgPCBsZW47CisJCQkgICAgIGlkeFZhbGlkQ2hhbm5lbHMrKykgeworCQkJCWlmIChDRFNfSVNfQ0hBTk5FTF81R0haKHBNYWMtPnJvYW0uCisJCQkJCXZhbGlkQ2hhbm5lbExpc3RbaWR4VmFsaWRDaGFubmVsc10pKSB7CisJCQkJCS8qIHRoZSBtYXggY2hhbm5lbCMgaW4gMTFnIGlzIDE0ICovCisJCQkJCWlmIChpZHhWYWxpZENoYW5uZWxzIDwKKwkJCQkJICAgIENTUl9OVU1fSUJTU19TVEFSVF9DSEFOTkVMU181MCkgeworCQkJCQkJY2hhbm5lbCA9CisJCQkJCQlwTWFjLT5yb2FtLnZhbGlkQ2hhbm5lbExpc3QKKwkJCQkJCVtpZHhWYWxpZENoYW5uZWxzXTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9IC8qIGlmICovCisKKwlyZXR1cm4gY2hhbm5lbDsKK30KKwordWludDhfdCBjc3Jfcm9hbV9nZXRfaWJzc19zdGFydF9jaGFubmVsX251bWJlcjI0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDhfdCBjaGFubmVsID0gMTsKKwl1aW50MzJfdCBpZHg7CisJdWludDMyX3QgaWR4VmFsaWRDaGFubmVsczsKKwlib29sIGZGb3VuZCA9IGZhbHNlOworCXVpbnQzMl90IGxlbiA9IHNpemVvZihwTWFjLT5yb2FtLnZhbGlkQ2hhbm5lbExpc3QpOworCisJaWYgKGVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQU5ZICE9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uQWRIb2NDaGFubmVsMjQpIHsKKwkJY2hhbm5lbCA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uQWRIb2NDaGFubmVsMjQ7CisJCWlmICghY3NyX3JvYW1faXNfY2hhbm5lbF92YWxpZChwTWFjLCBjaGFubmVsKSkgeworCQkJY2hhbm5lbCA9IDA7CisJCX0KKwl9CisKKwlpZiAoMCA9PSBjaGFubmVsCisJICAgICYmCisJICAgIENERl9JU19TVEFUVVNfU1VDQ0VTUyhjc3JfZ2V0X2NmZ192YWxpZF9jaGFubmVscworCQkJCQkgIChwTWFjLAorCQkJCQkgICh1aW50OF90ICopIHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCwKKwkJCQkJICAmbGVuKSkpIHsKKwkJZm9yIChpZHggPSAwOyAoaWR4IDwgQ1NSX05VTV9JQlNTX1NUQVJUX0NIQU5ORUxTXzI0KSAmJiAhZkZvdW5kOworCQkgICAgIGlkeCsrKSB7CisJCQlmb3IgKGlkeFZhbGlkQ2hhbm5lbHMgPSAwOworCQkJICAgICAoaWR4VmFsaWRDaGFubmVscyA8IGxlbikgJiYgIWZGb3VuZDsKKwkJCSAgICAgaWR4VmFsaWRDaGFubmVscysrKSB7CisJCQkJaWYgKGNzcl9zdGFydF9pYnNzX2NoYW5uZWxzMjRbaWR4XSA9PQorCQkJCSAgICBwTWFjLT5yb2FtLgorCQkJCSAgICB2YWxpZENoYW5uZWxMaXN0W2lkeFZhbGlkQ2hhbm5lbHNdKSB7CisJCQkJCWZGb3VuZCA9IHRydWU7CisJCQkJCWNoYW5uZWwgPSBjc3Jfc3RhcnRfaWJzc19jaGFubmVsczI0W2lkeF07CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGNoYW5uZWw7Cit9CisKKy8qKgorICogY3NyX3BvcHVsYXRlX2Jhc2ljX3JhdGVzKCkgLSBwb3B1bGF0ZXMgT0ZETSBvciBDQ0sgcmF0ZXMKKyAqIEByYXRlczogICAgICAgICByYXRlIHN0cnVjdCB0byBwb3B1bGF0ZQorICogQHR5cGU6ICAgICAgICAgIHRydWU6IG9mZG0gcmF0ZXMsIGZhbHNlOiBjY2sgcmF0ZXMKKyAqIEBtYXNrZWQ6ICAgICAgICBpbmRpY2F0ZXMgaWYgcmF0ZXMgYXJlIHRvIGJlIG1hc2tlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSworICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBwb3B1bGF0ZSBPRkRNIG9yIENDSyByYXRlcworICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgdm9pZAorY3NyX3BvcHVsYXRlX2Jhc2ljX3JhdGVzKHRTaXJNYWNSYXRlU2V0ICpyYXRlX3NldCwgYm9vbCB0eXBlLCBib29sIG1hc2tlZCkKK3sKKwl1aW50OF90IG9mZG1fcmF0ZXNbOF0gPSB7CisJCVNJUl9NQUNfUkFURV82LAorCQlTSVJfTUFDX1JBVEVfOSwKKwkJU0lSX01BQ19SQVRFXzEyLAorCQlTSVJfTUFDX1JBVEVfMTgsCisJCVNJUl9NQUNfUkFURV8yNCwKKwkJU0lSX01BQ19SQVRFXzM2LAorCQlTSVJfTUFDX1JBVEVfNDgsCisJCVNJUl9NQUNfUkFURV81NAorCX07CisJdWludDhfdCBjY2tfcmF0ZXNbNF0gPSB7CisJCVNJUl9NQUNfUkFURV8xLAorCQlTSVJfTUFDX1JBVEVfMiwKKwkJU0lSX01BQ19SQVRFXzVfNSwKKwkJU0lSX01BQ19SQVRFXzExCisJfTsKKworCWlmICh0eXBlID09IHRydWUpIHsKKwkJcmF0ZV9zZXQtPm51bVJhdGVzID0gODsKKwkJY2RmX21lbV9jb3B5KHJhdGVfc2V0LT5yYXRlLCBvZmRtX3JhdGVzLCBzaXplb2Yob2ZkbV9yYXRlcykpOworCQlpZiAobWFza2VkKSB7CisJCQlyYXRlX3NldC0+cmF0ZVswXSB8PSBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLOworCQkJcmF0ZV9zZXQtPnJhdGVbMl0gfD0gQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSzsKKwkJCXJhdGVfc2V0LT5yYXRlWzRdIHw9IENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0s7CisJCX0KKwl9IGVsc2UgeworCQlyYXRlX3NldC0+bnVtUmF0ZXMgPSA0OworCQljZGZfbWVtX2NvcHkocmF0ZV9zZXQtPnJhdGUsIGNja19yYXRlcywgc2l6ZW9mKGNja19yYXRlcykpOworCQlpZiAobWFza2VkKSB7CisJCQlyYXRlX3NldC0+cmF0ZVswXSB8PSBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLOworCQkJcmF0ZV9zZXQtPnJhdGVbMV0gfD0gQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSzsKKwkJCXJhdGVfc2V0LT5yYXRlWzJdIHw9IENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0s7CisJCQlyYXRlX3NldC0+cmF0ZVszXSB8PSBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLOworCQl9CisJfQorfQorCisvKioKKyAqIGNzcl9jb252ZXJ0X21vZGVfdG9fbndfdHlwZSgpIC0gY29udmVydCBtb2RlIGludG8gbmV0d29yayB0eXBlCisgKiBAZG90MTFfbW9kZTogICAgZG90MTFfbW9kZQorICogQGJhbmQ6ICAgICAgICAgIDIuNCBvciA1IEdIegorICoKKyAqIFJldHVybjogdFNpck53VHlwZQorICovCitzdGF0aWMgdFNpck53VHlwZQorY3NyX2NvbnZlcnRfbW9kZV90b19ud190eXBlKGVDc3JDZmdEb3QxMU1vZGUgZG90MTFfbW9kZSwgZUNzckJhbmQgYmFuZCkKK3sKKwlzd2l0Y2ggKGRvdDExX21vZGUpIHsKKwljYXNlIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFHOgorCQlyZXR1cm4gZVNJUl8xMUdfTldfVFlQRTsKKwljYXNlIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOgorCQlyZXR1cm4gZVNJUl8xMUJfTldfVFlQRTsKKwljYXNlIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOgorCQlyZXR1cm4gZVNJUl8xMUFfTldfVFlQRTsKKwljYXNlIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOgorCWRlZmF1bHQ6CisJCS8qCisJCSAqIEJlY2F1c2UgTElNIG9ubHkgdmVyaWZpZXMgaXQgYWdhaW5zdCAxMWEsIDExYiBvciAxMWcsIHNldAorCQkgKiBvbmx5IDExZyBvciAxMWEgaGVyZQorCQkgKi8KKwkJaWYgKGVDU1JfQkFORF8yNCA9PSBiYW5kKQorCQkJcmV0dXJuIGVTSVJfMTFHX05XX1RZUEU7CisJCWVsc2UKKwkJCXJldHVybiBlU0lSXzExQV9OV19UWVBFOworCX0KKwlyZXR1cm4gZVNJUl9ET05PVF9VU0VfTldfVFlQRTsKK30KKworLyoqCisgKiBjc3Jfcm9hbV9nZXRfYnNzX3N0YXJ0X3Bhcm1zKCkgLSBnZXQgYnNzIHN0YXJ0IHBhcmFtIGZyb20gcHJvZmlsZQorICogQHBNYWM6ICAgICAgICAgIG1hYyBnbG9iYWwgY29udGV4dAorICogQHBQcm9maWxlOiAgICAgIHJvYW0gcHJvZmlsZQorICogQHBQYXJhbTogICAgICAgIG91dCBwYXJhbSwgc3RhcnQgYnNzIHBhcmFtcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcG9wdWxhdGVzIHN0YXJ0IGJzcyBwYXJhbSBmcm9tIHJvYW0gcHJvZmlsZQorICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgdm9pZAorY3NyX3JvYW1fZ2V0X2Jzc19zdGFydF9wYXJtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJICAgICB0Q3NyUm9hbVN0YXJ0QnNzUGFyYW1zICpwUGFyYW0pCit7CisJZUNzckJhbmQgYmFuZDsKKwl1aW50OF90IG9wcl9jaCA9IDA7CisJdFNpck53VHlwZSBud190eXBlOworCXVpbnQ4X3QgdG1wX29wcl9jaCA9IDA7CisJdFNpck1hY1JhdGVTZXQgKm9wcl9yYXRlcyA9ICZwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldDsKKwl0U2lyTWFjUmF0ZVNldCAqZXh0X3JhdGVzID0gJnBQYXJhbS0+ZXh0ZW5kZWRSYXRlU2V0OworCisJaWYgKHBQcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzCisJICAgICYmIHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCkgeworCQl0bXBfb3ByX2NoID0gcFByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0WzBdOworCX0KKworCXBQYXJhbS0+dUNmZ0RvdDExTW9kZSA9IGNzcl9yb2FtX2dldF9waHlfbW9kZV9iYW5kX2Zvcl9ic3MocE1hYywKKwkJCQkJIHBQcm9maWxlLCB0bXBfb3ByX2NoLCAmYmFuZCk7CisKKwlpZiAoKChwUHJvZmlsZS0+Y3NyUGVyc29uYSA9PSBDREZfUDJQX0NMSUVOVF9NT0RFKQorCSAgICB8fCAocFByb2ZpbGUtPmNzclBlcnNvbmEgPT0gQ0RGX1AyUF9HT19NT0RFKSkKKwkgICAgJiYgKHBQYXJhbS0+dUNmZ0RvdDExTW9kZSA9PSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQikpIHsKKwkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICBGTCgiRm9yIFAyUCAocGVyc29uYSAlZCkgZG90MTFfbW9kZSBpcyAxMUIiKSwKKwkJCSAgcFByb2ZpbGUtPmNzclBlcnNvbmEpOworCQlDREZfQVNTRVJUKDApOworCX0KKworCW53X3R5cGUgPSBjc3JfY29udmVydF9tb2RlX3RvX253X3R5cGUocFBhcmFtLT51Q2ZnRG90MTFNb2RlLCBiYW5kKTsKKwlleHRfcmF0ZXMtPm51bVJhdGVzID0gMDsKKworCXN3aXRjaCAobndfdHlwZSkgeworCWRlZmF1bHQ6CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoInNlZXMgYW4gdW5rbm93biBwU2lyTndUeXBlICglZCkiKSwKKwkJCW53X3R5cGUpOworCWNhc2UgZVNJUl8xMUFfTldfVFlQRToKKwkJY3NyX3BvcHVsYXRlX2Jhc2ljX3JhdGVzKG9wcl9yYXRlcywgdHJ1ZSwgdHJ1ZSk7CisJCWlmIChlQ1NSX09QRVJBVElOR19DSEFOTkVMX0FOWSAhPSB0bXBfb3ByX2NoKSB7CisJCQlvcHJfY2ggPSB0bXBfb3ByX2NoOworCQkJYnJlYWs7CisJCX0KKwkJb3ByX2NoID0gY3NyX3JvYW1fZ2V0X2lic3Nfc3RhcnRfY2hhbm5lbF9udW1iZXI1MChwTWFjKTsKKwkJaWYgKDAgPT0gb3ByX2NoICYmCisJCSAgICBDU1JfSVNfUEhZX01PREVfRFVBTF9CQU5EKHBQcm9maWxlLT5waHlNb2RlKSAmJgorCQkgICAgQ1NSX0lTX1BIWV9NT0RFX0RVQUxfQkFORChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUpKSB7CisJCQkvKgorCQkJICogV2UgY291bGQgbm90IGZpbmQgYSA1RyBjaGFubmVsIGJ5IGF1dG8gcGljaywgbGV0J3MKKwkJCSAqIHRyeSAyLjRHIGNoYW5uZWxzLiBXZSBvbmx5IGRvIHRoaXMgaGVyZSBiZWNhdXNlCisJCQkgKiBjc3Jfcm9hbV9nZXRfcGh5X21vZGVfYmFuZF9mb3JfYnNzIGFsd2F5cyBwaWNrcyAxMWEKKwkJCSAqIGZvciBBVVRPCisJCQkgKi8KKwkJCW53X3R5cGUgPSBlU0lSXzExQl9OV19UWVBFOworCQkJb3ByX2NoID0gY3NyX3JvYW1fZ2V0X2lic3Nfc3RhcnRfY2hhbm5lbF9udW1iZXIyNChwTWFjKTsKKwkJCWNzcl9wb3B1bGF0ZV9iYXNpY19yYXRlcyhvcHJfcmF0ZXMsIGZhbHNlLCB0cnVlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGVTSVJfMTFCX05XX1RZUEU6CisJCWNzcl9wb3B1bGF0ZV9iYXNpY19yYXRlcyhvcHJfcmF0ZXMsIGZhbHNlLCB0cnVlKTsKKwkJaWYgKGVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQU5ZID09IHRtcF9vcHJfY2gpCisJCQlvcHJfY2ggPSBjc3Jfcm9hbV9nZXRfaWJzc19zdGFydF9jaGFubmVsX251bWJlcjI0KHBNYWMpOworCQllbHNlCisJCQlvcHJfY2ggPSB0bXBfb3ByX2NoOworCQlicmVhazsKKwljYXNlIGVTSVJfMTFHX05XX1RZUEU6CisJCS8qIEZvciBQMlAgQ2xpZW50IGFuZCBQMlAgR08sIGRpc2FibGUgMTFiIHJhdGVzICovCisJCWlmICgocFByb2ZpbGUtPmNzclBlcnNvbmEgPT0gQ0RGX1AyUF9DTElFTlRfTU9ERSkKKwkJICAgIHx8IChwUHJvZmlsZS0+Y3NyUGVyc29uYSA9PSBDREZfUDJQX0dPX01PREUpCisJCSAgICB8fCAoZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUdfT05MWSA9PQorCQkJCQlwUGFyYW0tPnVDZmdEb3QxMU1vZGUpKSB7CisJCQljc3JfcG9wdWxhdGVfYmFzaWNfcmF0ZXMob3ByX3JhdGVzLCB0cnVlLCB0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCWNzcl9wb3B1bGF0ZV9iYXNpY19yYXRlcyhvcHJfcmF0ZXMsIGZhbHNlLCB0cnVlKTsKKwkJCWNzcl9wb3B1bGF0ZV9iYXNpY19yYXRlcyhleHRfcmF0ZXMsIHRydWUsIGZhbHNlKTsKKwkJfQorCisJCWlmIChlQ1NSX09QRVJBVElOR19DSEFOTkVMX0FOWSA9PSB0bXBfb3ByX2NoKQorCQkJb3ByX2NoID0gY3NyX3JvYW1fZ2V0X2lic3Nfc3RhcnRfY2hhbm5lbF9udW1iZXIyNChwTWFjKTsKKwkJZWxzZQorCQkJb3ByX2NoID0gdG1wX29wcl9jaDsKKwkJYnJlYWs7CisJfQorCXBQYXJhbS0+b3BlcmF0aW9uQ2huID0gb3ByX2NoOworCXBQYXJhbS0+c2lyTndUeXBlID0gbndfdHlwZTsKKwlwUGFyYW0tPmNoX3BhcmFtcy5jaF93aWR0aCA9IHBQcm9maWxlLT5jaF9wYXJhbXMuY2hfd2lkdGg7CisJcFBhcmFtLT5jaF9wYXJhbXMuY2VudGVyX2ZyZXFfc2VnMCA9CisJCXBQcm9maWxlLT5jaF9wYXJhbXMuY2VudGVyX2ZyZXFfc2VnMDsKKwlwUGFyYW0tPmNoX3BhcmFtcy5jZW50ZXJfZnJlcV9zZWcxID0KKwkJcFByb2ZpbGUtPmNoX3BhcmFtcy5jZW50ZXJfZnJlcV9zZWcxOworCXBQYXJhbS0+Y2hfcGFyYW1zLnNlY19jaF9vZmZzZXQgPQorCQlwUHJvZmlsZS0+Y2hfcGFyYW1zLnNlY19jaF9vZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitjc3Jfcm9hbV9nZXRfYnNzX3N0YXJ0X3Bhcm1zX2Zyb21fYnNzX2Rlc2ModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywKKwkJCQkJICAgdERvdDExZkJlYWNvbklFcyAqcEllcywKKwkJCQkJICAgdENzclJvYW1TdGFydEJzc1BhcmFtcyAqcFBhcmFtKQoreworCWlmICghcFBhcmFtKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkJTUyBwYXJhbSdzIHBvaW50ZXIgaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCXBQYXJhbS0+c2lyTndUeXBlID0gcEJzc0Rlc2MtPm53VHlwZTsKKwlwUGFyYW0tPmNiTW9kZSA9IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKwlwUGFyYW0tPm9wZXJhdGlvbkNobiA9IHBCc3NEZXNjLT5jaGFubmVsSWQ7CisJY2RmX21lbV9jb3B5KCZwUGFyYW0tPmJzc2lkLCBwQnNzRGVzYy0+YnNzSWQsIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisKKwlpZiAoIXBJZXMpIHsKKwkJcFBhcmFtLT5zc0lkLmxlbmd0aCA9IDA7CisJCXBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID0gMDsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiSUVzIHN0cnVjdCBwb2ludGVyIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEllcy0+U3VwcFJhdGVzLnByZXNlbnQpIHsKKwkJcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMgPSBwSWVzLT5TdXBwUmF0ZXMubnVtX3JhdGVzOworCQlpZiAocEllcy0+U3VwcFJhdGVzLm51bV9yYXRlcyA+IFNJUl9NQUNfUkFURVNFVF9FSURfTUFYKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIm51bV9yYXRlczogJWQgPiBtYXggdmFsLCByZXNldHRpbmciKSwKKwkJCQlwSWVzLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKwkJCXBJZXMtPlN1cHBSYXRlcy5udW1fcmF0ZXMgPSBTSVJfTUFDX1JBVEVTRVRfRUlEX01BWDsKKwkJfQorCQljZGZfbWVtX2NvcHkocFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZSwKKwkJCSAgICAgcEllcy0+U3VwcFJhdGVzLnJhdGVzLAorCQkJICAgICBzaXplb2YoKnBJZXMtPlN1cHBSYXRlcy5yYXRlcykgKgorCQkJICAgICBwSWVzLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKwl9CisJaWYgKHBJZXMtPkV4dFN1cHBSYXRlcy5wcmVzZW50KSB7CisJCXBQYXJhbS0+ZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzID0gcEllcy0+RXh0U3VwcFJhdGVzLm51bV9yYXRlczsKKwkJaWYgKHBJZXMtPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXMgPiBTSVJfTUFDX1JBVEVTRVRfRUlEX01BWCkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJudW1fcmF0ZXM6ICVkID4gbWF4IHZhbCwgcmVzZXR0aW5nIiksCisJCQkJcEllcy0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisJCQlwSWVzLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzID0gU0lSX01BQ19SQVRFU0VUX0VJRF9NQVg7CisJCX0KKwkJY2RmX21lbV9jb3B5KHBQYXJhbS0+ZXh0ZW5kZWRSYXRlU2V0LnJhdGUsCisJCQkgICAgIHBJZXMtPkV4dFN1cHBSYXRlcy5yYXRlcywKKwkJCSAgICAgc2l6ZW9mKCpwSWVzLT5FeHRTdXBwUmF0ZXMucmF0ZXMpICoKKwkJCSAgICAgcEllcy0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisJfQorCWlmIChwSWVzLT5TU0lELnByZXNlbnQpIHsKKwkJcFBhcmFtLT5zc0lkLmxlbmd0aCA9IHBJZXMtPlNTSUQubnVtX3NzaWQ7CisJCWNkZl9tZW1fY29weShwUGFyYW0tPnNzSWQuc3NJZCwgcEllcy0+U1NJRC5zc2lkLAorCQkJICAgICBwUGFyYW0tPnNzSWQubGVuZ3RoKTsKKwl9CisJcFBhcmFtLT5jYk1vZGUgPSBjc3JfZ2V0X2NiX21vZGVfZnJvbV9pZXMocE1hYywgcFBhcmFtLT5vcGVyYXRpb25DaG4sCisJCQkJCQkgIHBJZXMpOworfQorCitzdGF0aWMgdm9pZCBjc3Jfcm9hbV9kZXRlcm1pbmVfbWF4X3JhdGVfZm9yX2FkX2hvYyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgdFNpck1hY1JhdGVTZXQgKnBTaXJSYXRlU2V0KQoreworCXVpbnQ4X3QgTWF4UmF0ZSA9IDA7CisJdWludDMyX3QgaTsKKwl1aW50OF90ICpwUmF0ZTsKKworCXBSYXRlID0gcFNpclJhdGVTZXQtPnJhdGU7CisJZm9yIChpID0gMDsgaSA8IHBTaXJSYXRlU2V0LT5udW1SYXRlczsgaSsrKSB7CisJCU1heFJhdGUgPQorCQkJQ1NSX01BWChNYXhSYXRlLCAocFJhdGVbaV0gJiAofkNTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0spKSk7CisJfQorCisJLyogU2F2ZSB0aGUgbWF4IHJhdGUgaW4gdGhlIGNvbm5lY3RlZCBzdGF0ZSBpbmZvcm1hdGlvbi4uLiAqLworCisJLyogbW9kaWZ5IExhc3RSYXRlcyB2YXJpYWJsZSBhcyB3ZWxsICovCisKKwlyZXR1cm47Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1faXNzdWVfc3RhcnRfYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgdENzclJvYW1TdGFydEJzc1BhcmFtcyAqcFBhcmFtLAorCQkJCSAgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJCSAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB1aW50MzJfdCByb2FtSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJZUNzckJhbmQgZUJhbmQ7CisJLyogU2V0IHRoZSByb2FtaW5nIHN1YnN0YXRlIHRvICdTdGFydCBCU1MgYXR0ZW1wdCcuLi4gKi8KKwljc3Jfcm9hbV9zdWJzdGF0ZV9jaGFuZ2UocE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX1NUQVJUX0JTU19SRVEsCisJCQkJIHNlc3Npb25JZCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKwkvKiBOZWVkIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSBuZWVkIHRvIGxvZyBXRFM/Pz8gKi8KKwlpZiAoQ1NSX0lTX0lCU1MocFByb2ZpbGUpKSB7CisJCWhvc3RfbG9nX2lic3NfcGt0X3R5cGUgKnBJYnNzTG9nOworCQlXTEFOX0hPU1RfRElBR19MT0dfQUxMT0MocElic3NMb2csIGhvc3RfbG9nX2lic3NfcGt0X3R5cGUsCisJCQkJCSBMT0dfV0xBTl9JQlNTX0MpOworCQlpZiAocElic3NMb2cpIHsKKwkJCWlmIChwQnNzRGVzYykgeworCQkJCXBJYnNzTG9nLT5ldmVudElkID0KKwkJCQkJV0xBTl9JQlNTX0VWRU5UX0pPSU5fSUJTU19SRVE7CisJCQkJY2RmX21lbV9jb3B5KHBJYnNzTG9nLT5ic3NpZCwgcEJzc0Rlc2MtPmJzc0lkLAorCQkJCQkgICAgIDYpOworCQkJfSBlbHNlIHsKKwkJCQlwSWJzc0xvZy0+ZXZlbnRJZCA9CisJCQkJCVdMQU5fSUJTU19FVkVOVF9TVEFSVF9JQlNTX1JFUTsKKwkJCX0KKwkJCWNkZl9tZW1fY29weShwSWJzc0xvZy0+c3NpZCwgcFBhcmFtLT5zc0lkLnNzSWQsCisJCQkJICAgICBwUGFyYW0tPnNzSWQubGVuZ3RoKTsKKwkJCWlmIChwUHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9PSAwKSB7CisJCQkJcElic3NMb2ctPmNoYW5uZWxTZXR0aW5nID0gQVVUT19QSUNLOworCQkJfSBlbHNlIHsKKwkJCQlwSWJzc0xvZy0+Y2hhbm5lbFNldHRpbmcgPSBTUEVDSUZJRUQ7CisJCQl9CisJCQlwSWJzc0xvZy0+b3BlcmF0aW5nQ2hhbm5lbCA9IHBQYXJhbS0+b3BlcmF0aW9uQ2huOworCQkJV0xBTl9IT1NUX0RJQUdfTE9HX1JFUE9SVChwSWJzc0xvZyk7CisJCX0KKwl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IgKi8KKwkvKiBQdXQgUlNOIGluZm9ybWF0aW9uIGluIGZvciBTdGFydGluZyBCU1MgKi8KKwlwUGFyYW0tPm5SU05JRUxlbmd0aCA9ICh1aW50MTZfdCkgcFByb2ZpbGUtPm5SU05SZXFJRUxlbmd0aDsKKwlwUGFyYW0tPnBSU05JRSA9IHBQcm9maWxlLT5wUlNOUmVxSUU7CisKKwlwUGFyYW0tPnByaXZhY3kgPSBwUHJvZmlsZS0+cHJpdmFjeTsKKwlwUGFyYW0tPmZ3ZFdQU1BCQ1Byb2JlUmVxID0gcFByb2ZpbGUtPmZ3ZFdQU1BCQ1Byb2JlUmVxOworCXBQYXJhbS0+YXV0aFR5cGUgPSBwUHJvZmlsZS0+Y3NyODAyMTFBdXRoVHlwZTsKKwlwUGFyYW0tPmJlYWNvbkludGVydmFsID0gcFByb2ZpbGUtPmJlYWNvbkludGVydmFsOworCXBQYXJhbS0+ZHRpbVBlcmlvZCA9IHBQcm9maWxlLT5kdGltUGVyaW9kOworCXBQYXJhbS0+QXBVYXBzZEVuYWJsZSA9IHBQcm9maWxlLT5BcFVhcHNkRW5hYmxlOworCXBQYXJhbS0+c3NpZEhpZGRlbiA9IHBQcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5zc2lkSGlkZGVuOworCWlmIChDU1JfSVNfSU5GUkFfQVAocFByb2ZpbGUpICYmIChwUGFyYW0tPm9wZXJhdGlvbkNobiAhPSAwKSkgeworCQlpZiAoY3NyX2lzX3ZhbGlkX2NoYW5uZWwocE1hYywgcFBhcmFtLT5vcGVyYXRpb25DaG4pICE9CisJCSAgICBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXBQYXJhbS0+b3BlcmF0aW9uQ2huID0gSU5GUkFfQVBfREVGQVVMVF9DSEFOTkVMOworCQl9CisJfQorCXBQYXJhbS0+cHJvdEVuYWJsZWQgPSBwUHJvZmlsZS0+cHJvdEVuYWJsZWQ7CisJcFBhcmFtLT5vYnNzUHJvdEVuYWJsZWQgPSBwUHJvZmlsZS0+b2Jzc1Byb3RFbmFibGVkOworCXBQYXJhbS0+aHRfcHJvdGVjdGlvbiA9IHBQcm9maWxlLT5jZmdfcHJvdGVjdGlvbjsKKwlwUGFyYW0tPndwc19zdGF0ZSA9IHBQcm9maWxlLT53cHNfc3RhdGU7CisKKwlwUGFyYW0tPnVDZmdEb3QxMU1vZGUgPQorCQljc3Jfcm9hbV9nZXRfcGh5X21vZGVfYmFuZF9mb3JfYnNzKHBNYWMsIHBQcm9maWxlLAorCQkJCQkJICAgcFBhcmFtLT4KKwkJCQkJCSAgIG9wZXJhdGlvbkNobiwKKwkJCQkJCSAgICZlQmFuZCk7CisJcFBhcmFtLT5ic3NQZXJzb25hID0gcFByb2ZpbGUtPmNzclBlcnNvbmE7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJcFBhcmFtLT5tZnBDYXBhYmxlID0gKDAgIT0gcFByb2ZpbGUtPk1GUENhcGFibGUpOworCXBQYXJhbS0+bWZwUmVxdWlyZWQgPSAoMCAhPSBwUHJvZmlsZS0+TUZQUmVxdWlyZWQpOworI2VuZGlmCisKKwlwUGFyYW0tPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFMZW4gPQorCQlwUHJvZmlsZS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwRGF0YUxlbjsKKwlwUGFyYW0tPmFkZEllUGFyYW1zLnByb2JlUmVzcERhdGFfYnVmZiA9CisJCXBQcm9maWxlLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BEYXRhX2J1ZmY7CisKKwlwUGFyYW0tPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFMZW4gPQorCQlwUHJvZmlsZS0+YWRkSWVQYXJhbXMuYXNzb2NSZXNwRGF0YUxlbjsKKwlwUGFyYW0tPmFkZEllUGFyYW1zLmFzc29jUmVzcERhdGFfYnVmZiA9CisJCXBQcm9maWxlLT5hZGRJZVBhcmFtcy5hc3NvY1Jlc3BEYXRhX2J1ZmY7CisKKwlpZiAoQ1NSX0lTX0lCU1MocFByb2ZpbGUpKSB7CisJCXBQYXJhbS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwQkNORGF0YUxlbiA9CisJCQlwUHJvZmlsZS0+bldQQVJlcUlFTGVuZ3RoOworCQlwUGFyYW0tPmFkZEllUGFyYW1zLnByb2JlUmVzcEJDTkRhdGFfYnVmZiA9IHBQcm9maWxlLT5wV1BBUmVxSUU7CisJfSBlbHNlIHsKKwkJcFBhcmFtLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BCQ05EYXRhTGVuID0KKwkJCXBQcm9maWxlLT5hZGRJZVBhcmFtcy5wcm9iZVJlc3BCQ05EYXRhTGVuOworCQlwUGFyYW0tPmFkZEllUGFyYW1zLnByb2JlUmVzcEJDTkRhdGFfYnVmZiA9CisJCQlwUHJvZmlsZS0+YWRkSWVQYXJhbXMucHJvYmVSZXNwQkNORGF0YV9idWZmOworCX0KKwlwUGFyYW0tPnNhcF9kb3QxMW1jID0gcFByb2ZpbGUtPnNhcF9kb3QxMW1jOworCisJLyogV2hlbiBzdGFydGluZyBhbiBJQlNTLCBzdGFydCBvbiB0aGUgY2hhbm5lbCBmcm9tIHRoZSBQcm9maWxlLiAqLworCXN0YXR1cyA9CisJCWNzcl9zZW5kX21iX3N0YXJ0X2Jzc19yZXFfbXNnKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUtPkJTU1R5cGUsIHBQYXJhbSwKKwkJCQkJICAgICAgcEJzc0Rlc2MpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGNzcl9yb2FtX3ByZXBhcmVfYnNzX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCXRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsCisJCQkJCXRCc3NDb25maWdQYXJhbSAqcEJzc0NvbmZpZywKKwkJCQkJdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKwl1aW50OF90IENoYW5uZWw7CisJZVBoeUNoYW5Cb25kU3RhdGUgY2JNb2RlID0gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQnNzRGVzYykgeworCQljc3Jfcm9hbV9nZXRfYnNzX3N0YXJ0X3Bhcm1zX2Zyb21fYnNzX2Rlc2MocE1hYywgcEJzc0Rlc2MsIHBJZXMsCisJCQkJCQkJICAgJnBTZXNzaW9uLT5ic3NQYXJhbXMpOworCQkvKiBTaW5jZSBjc3Jfcm9hbV9nZXRfYnNzX3N0YXJ0X3Bhcm1zX2Zyb21fYnNzX2Rlc2MgZmlsbHMgaW4gdGhlIGJzc2lkIGZvciBwU2Vzc2lvbi0+YnNzUGFyYW1zICovCisJCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBoYXMgdG8gYmUgZG8gYWZ0ZXIgdGhhdC4gKi8KKwkJLyogRm9yIFdEUyBzdGF0aW9uLCB1c2Ugc2VsZk1hYyBhcyB0aGUgc2VsZiBCU1NJRCAqLworCQlpZiAoQ1NSX0lTX1dEU19TVEEocFByb2ZpbGUpKSB7CisJCQljZGZfbWVtX2NvcHkoJnBTZXNzaW9uLT5ic3NQYXJhbXMuYnNzaWQsCisJCQkJICAgICAmcFNlc3Npb24tPnNlbGZNYWNBZGRyLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwkJfQorCX0gZWxzZSB7CisJCWNzcl9yb2FtX2dldF9ic3Nfc3RhcnRfcGFybXMocE1hYywgcFByb2ZpbGUsICZwU2Vzc2lvbi0+YnNzUGFyYW1zKTsKKwkJLyogVXNlIHRoZSBmaXJzdCBTU0lEICovCisJCWlmIChwUHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcykgeworCQkJY2RmX21lbV9jb3B5KCZwU2Vzc2lvbi0+YnNzUGFyYW1zLnNzSWQsCisJCQkJICAgICBwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3QsCisJCQkJICAgICBzaXplb2YodFNpck1hY1NTaWQpKTsKKwkJfQorCQkvKiBGb3IgV0RTIHN0YXRpb24sIHVzZSBzZWxmTWFjIGFzIHRoZSBzZWxmIEJTU0lEICovCisJCWlmIChDU1JfSVNfV0RTX1NUQShwUHJvZmlsZSkpIHsKKwkJCWNkZl9tZW1fY29weSgmcFNlc3Npb24tPmJzc1BhcmFtcy5ic3NpZCwKKwkJCQkgICAgICZwU2Vzc2lvbi0+c2VsZk1hY0FkZHIsCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCQl9CisJCS8qIFVzZSB0aGUgZmlyc3QgQlNTSUQgKi8KKwkJZWxzZSBpZiAocFByb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEcykgeworCQkJY2RmX21lbV9jb3B5KCZwU2Vzc2lvbi0+YnNzUGFyYW1zLmJzc2lkLAorCQkJCSAgICAgcFByb2ZpbGUtPkJTU0lEcy5ic3NpZCwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJCX0gZWxzZSB7CisJCQljZGZfbWVtX3NldCgmcFNlc3Npb24tPmJzc1BhcmFtcy5ic3NpZCwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpLCAwKTsKKwkJfQorCX0KKwlDaGFubmVsID0gcFNlc3Npb24tPmJzc1BhcmFtcy5vcGVyYXRpb25DaG47CisJLyogU2V0IG9wZXJhdGluZyBjaGFubmVsIGluIHBQcm9maWxlIHdoaWNoIHdpbGwgYmUgdXNlZCAqLworCS8qIGluIGNzcl9yb2FtX3NldF9ic3NfY29uZmlnX2NmZygpIHRvIGRldGVybWluZSBjaGFubmVsIGJvbmRpbmcgKi8KKwkvKiBtb2RlIGFuZCB3aWxsIGJlIGNvbmZpZ3VyZWQgaW4gQ0ZHIGxhdGVyICovCisJcFByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWwgPSBDaGFubmVsOworCisJaWYgKENoYW5uZWwgPT0gMCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiICAgQ1NSIGNhbm5vdCBmaW5kIGEgY2hhbm5lbCB0byBzdGFydCBJQlNTIik7CisJfSBlbHNlIHsKKworCQljc3Jfcm9hbV9kZXRlcm1pbmVfbWF4X3JhdGVfZm9yX2FkX2hvYyhwTWFjLAorCQkJCQkJICAgICAgICZwU2Vzc2lvbi0+YnNzUGFyYW1zLgorCQkJCQkJICAgICAgIG9wZXJhdGlvbmFsUmF0ZVNldCk7CisJCWlmIChDU1JfSVNfSU5GUkFfQVAocFByb2ZpbGUpIHx8IENTUl9JU19TVEFSVF9JQlNTKHBQcm9maWxlKSkgeworCQkJaWYgKENEU19JU19DSEFOTkVMXzI0R0haKENoYW5uZWwpKSB7CisJCQkJY2JNb2RlID0KKwkJCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS4KKwkJCQkJY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHo7CisJCQl9IGVsc2UgeworCQkJCWNiTW9kZSA9CisJCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uCisJCQkJCWNoYW5uZWxCb25kaW5nTW9kZTVHSHo7CisJCQl9CisJCQlzbXNfbG9nKHBNYWMsIExPRzEsICIjIyBjYk1vZGUgJWQiLCBjYk1vZGUpOworCQkJcEJzc0NvbmZpZy0+Y2JNb2RlID0gY2JNb2RlOworCQkJcFNlc3Npb24tPmJzc1BhcmFtcy5jYk1vZGUgPSBjYk1vZGU7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9yb2FtX3N0YXJ0X2lic3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJICAgICAgYm9vbCAqcGZTYW1lSWJzcykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlib29sIGZTYW1lSWJzcyA9IGZhbHNlOworCisJaWYgKGNzcl9pc19jb25uX3N0YXRlX2lic3MocE1hYywgc2Vzc2lvbklkKSkgeworCQkvKiBDaGVjayBpZiBhbnkgcHJvZmlsZSBwYXJhbWV0ZXIgaGFzIGNoYW5nZWQgPyBJZiBhbnkgcHJvZmlsZSBwYXJhbWV0ZXIgKi8KKwkJLyogaGFzIGNoYW5nZWQgdGhlbiBzdG9wIG9sZCBCU1MgYW5kIHN0YXJ0IGEgbmV3IG9uZSB3aXRoIG5ldyBwYXJhbWV0ZXJzICovCisJCWlmIChjc3JfaXNfc2FtZV9wcm9maWxlCisJCQkgICAgKHBNYWMsICZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdGVkUHJvZmlsZSwKKwkJCSAgICBwUHJvZmlsZSkpIHsKKwkJCWZTYW1lSWJzcyA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPQorCQkJCWNzcl9yb2FtX2lzc3VlX3N0b3BfYnNzKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQllQ1NSX1JPQU1fU1VCU1RBVEVfRElTQ09OTkVDVF9DT05USU5VRV9ST0FNSU5HKTsKKwkJfQorCX0gZWxzZSBpZiAoY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2luZnJhKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJLyogRGlzYXNzb2NpYXRlIGZyb20gdGhlIGNvbm5lY3RlZCBJbmZyYXN0cnVjdHVyZSBuZXR3b3JrLi4uICovCisJCXN0YXR1cyA9CisJCQljc3Jfcm9hbV9pc3N1ZV9kaXNhc3NvY2lhdGUocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJICAgIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNDT05ORUNUX0NPTlRJTlVFX1JPQU1JTkcsCisJCQkJCQkgICAgZmFsc2UpOworCX0gZWxzZSB7CisJCXRCc3NDb25maWdQYXJhbSAqcEJzc0NvbmZpZzsKKworCQlwQnNzQ29uZmlnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRCc3NDb25maWdQYXJhbSkpOworCQlpZiAoTlVMTCA9PSBwQnNzQ29uZmlnKQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQllbHNlCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJY2RmX21lbV9zZXQocEJzc0NvbmZpZywgc2l6ZW9mKHRCc3NDb25maWdQYXJhbSksIDApOworCQkJLyogdGhlcmUgaXMgbm8gQnNzIGRlc2NyaXB0aW9uIGJlZm9yZSB3ZSBzdGFydCBhbiBJQlNTIHNvIHdlIG5lZWQgdG8gYWRvcHQgKi8KKwkJCS8qIGFsbCBCc3MgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZyb20gdGhlIFByb2ZpbGUuICovCisJCQlzdGF0dXMgPQorCQkJCWNzcl9yb2FtX3ByZXBhcmVfYnNzX2NvbmZpZ19mcm9tX3Byb2ZpbGUocE1hYywgcFByb2ZpbGUsCisJCQkJCQkJCQkgcEJzc0NvbmZpZywKKwkJCQkJCQkJCSBOVUxMKTsKKwkJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCS8qIHNhdmUgZG90TW9kZSAqLworCQkJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5ic3NQYXJhbXMuCisJCQkJdUNmZ0RvdDExTW9kZSA9IHBCc3NDb25maWctPnVDZmdEb3QxMU1vZGU7CisJCQkJLyogUHJlcGFyZSBzb21lIG1vcmUgcGFyYW1ldGVycyBmb3IgdGhpcyBJQlNTICovCisJCQkJY3NyX3JvYW1fcHJlcGFyZV9ic3NfcGFyYW1zKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQkgICAgcFByb2ZpbGUsIE5VTEwsCisJCQkJCQkJICAgIHBCc3NDb25maWcsIE5VTEwpOworCQkJCXN0YXR1cyA9CisJCQkJCWNzcl9yb2FtX3NldF9ic3NfY29uZmlnX2NmZyhwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJCSAgICBwUHJvZmlsZSwgTlVMTCwKKwkJCQkJCQkJICAgIHBCc3NDb25maWcsIE5VTEwsCisJCQkJCQkJCSAgICBmYWxzZSk7CisJCQl9CisKKwkJCWNkZl9tZW1fZnJlZShwQnNzQ29uZmlnKTsKKwkJfSAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KKwl9CisKKwlpZiAocGZTYW1lSWJzcykgeworCQkqcGZTYW1lSWJzcyA9IGZTYW1lSWJzczsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgY3NyX3JvYW1fdXBkYXRlX2Nvbm5lY3RlZF9wcm9maWxlX2Zyb21fbmV3X2Jzcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJCSAgIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJCQkgICB0U2lyU21lTmV3QnNzSW5mbyAqcE5ld0JzcykKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocE5ld0JzcykgeworCQkvKiBTZXQgdGhlIG9wZXJhdGluZyBjaGFubmVsLiAqLworCQlwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsID0KKwkJCXBOZXdCc3MtPmNoYW5uZWxOdW1iZXI7CisJCS8qIG1vdmUgdGhlIEJTU0lkIGZyb20gdGhlIEJTUyBkZXNjcmlwdGlvbiBpbnRvIHRoZSBjb25uZWN0ZWQgc3RhdGUgaW5mb3JtYXRpb24uICovCisJCWNkZl9tZW1fY29weSgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQuYnl0ZXMsCisJCQkgICAgICYocE5ld0Jzcy0+YnNzSWQpLCBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCX0KKwlyZXR1cm47Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECitDREZfU1RBVFVTIGNzcl9yb2FtX3NldF9wc2tfcG1rKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQl1aW50OF90ICpwUFNLX1BNSywgc2l6ZV90IHBta19sZW4pCit7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwljZGZfbWVtX2NvcHkocFNlc3Npb24tPnBza19wbWssIHBQU0tfUE1LLCBzaXplb2YocFNlc3Npb24tPnBza19wbWspKTsKKwlwU2Vzc2lvbi0+cG1rX2xlbiA9IHBta19sZW47CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FEICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorc3RhdGljIHZvaWQKK2Nzcl9yb2FtX2RpYWdfc2V0X3Bta2lkKHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24pCit7CisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfREVGKHNlY0V2ZW50LAorCQkJCSBob3N0X2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlKTsKKwljZGZfbWVtX3NldCgmc2VjRXZlbnQsCisJICAgIHNpemVvZihob3N0X2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlKSwgMCk7CisJc2VjRXZlbnQuZXZlbnRJZCA9IFdMQU5fU0VDVVJJVFlfRVZFTlRfUE1LSURfVVBEQVRFOworCXNlY0V2ZW50LmVuY3J5cHRpb25Nb2RlTXVsdGljYXN0ID0KKwkJKHVpbnQ4X3QpIGRpYWdfZW5jX3R5cGVfZnJvbV9jc3JfdHlwZSgKKwkJCXBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm1jRW5jcnlwdGlvblR5cGUpOworCXNlY0V2ZW50LmVuY3J5cHRpb25Nb2RlVW5pY2FzdCA9CisJCSh1aW50OF90KSBkaWFnX2VuY190eXBlX2Zyb21fY3NyX3R5cGUoCisJCQlwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5FbmNyeXB0aW9uVHlwZSk7CisJY2RmX21lbV9jb3B5KHNlY0V2ZW50LmJzc2lkLAorCQkgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLmJ5dGVzLAorCQkJQ0RGX01BQ19BRERSX1NJWkUpOworCXNlY0V2ZW50LmF1dGhNb2RlID0gKHVpbnQ4X3QpIGRpYWdfYXV0aF90eXBlX2Zyb21fY3NyX3R5cGUoCisJCQkJcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuQXV0aFR5cGUpOworCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmc2VjRXZlbnQsIEVWRU5UX1dMQU5fU0VDVVJJVFkpOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSICovCisKK0NERl9TVEFUVVMKK2Nzcl9yb2FtX3NldF9wbWtpZF9jYWNoZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgdFBta2lkQ2FjaGVJbmZvICpwUE1LSURDYWNoZSwgdWludDMyX3QgbnVtSXRlbXMsCisJCQkgYm9vbCB1cGRhdGVfZW50aXJlX2NhY2hlKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwl1aW50MzJfdCBpID0gMDsKKwl0UG1raWRDYWNoZUluZm8gKnBta3NhOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgibnVtSXRlbXMgPSAlZCIpLCBudW1JdGVtcyk7CisKKwlpZiAobnVtSXRlbXMgPiBDU1JfTUFYX1BNS0lEX0FMTE9XRUQpCisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCWNzcl9yb2FtX2RpYWdfc2V0X3Bta2lkKHBTZXNzaW9uKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAqLworCisJaWYgKHVwZGF0ZV9lbnRpcmVfY2FjaGUpIHsKKwkJaWYgKG51bUl0ZW1zICYmIHBQTUtJRENhY2hlKSB7CisJCQlwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZSA9ICh1aW50MTZfdCkgbnVtSXRlbXM7CisJCQljZGZfbWVtX2NvcHkocFNlc3Npb24tPlBta2lkQ2FjaGVJbmZvLCBwUE1LSURDYWNoZSwKKwkJCQlzaXplb2YodFBta2lkQ2FjaGVJbmZvKSAqIG51bUl0ZW1zKTsKKwkJCXBTZXNzaW9uLT5jdXJyX2NhY2hlX2lkeCA9ICh1aW50MTZfdCludW1JdGVtczsKKwkJfQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKSB7CisJCXBta3NhID0gJnBQTUtJRENhY2hlW2ldOworCisJCS8qIERlbGV0ZSB0aGUgZW50cnkgaWYgcHJlc2VudCAqLworCQljc3Jfcm9hbV9kZWxfcG1raWRfZnJvbV9jYWNoZShwTWFjLCBzZXNzaW9uSWQsCisJCQkJcG1rc2EtPkJTU0lELmJ5dGVzLCBmYWxzZSk7CisKKwkJLyogQWRkIGVudHJ5IHRvIHRoZSBjYWNoZSAqLworCQljZGZfY29weV9tYWNhZGRyKAorCQkgICAgJnBTZXNzaW9uLT5QbWtpZENhY2hlSW5mb1twU2Vzc2lvbi0+Y3Vycl9jYWNoZV9pZHhdLkJTU0lELAorCQkgICAgJnBta3NhLT5CU1NJRCk7CisJCWNkZl9tZW1fY29weSgKKwkJICAgIHBTZXNzaW9uLT5QbWtpZENhY2hlSW5mb1twU2Vzc2lvbi0+Y3Vycl9jYWNoZV9pZHhdLlBNS0lELAorCQkgICAgcG1rc2EtPlBNS0lELCBDU1JfUlNOX1BNS0lEX1NJWkUpOworCisJCS8qIEluY3JlbWVudCB0aGUgQ1NSIGxvY2FsIGNhY2hlIGluZGV4ICovCisJCWlmIChwU2Vzc2lvbi0+Y3Vycl9jYWNoZV9pZHggPCAoQ1NSX01BWF9QTUtJRF9BTExPV0VEIC0gMSkpCisJCQlwU2Vzc2lvbi0+Y3Vycl9jYWNoZV9pZHgrKzsKKwkJZWxzZQorCQkJcFNlc3Npb24tPmN1cnJfY2FjaGVfaWR4ID0gMDsKKworCQlwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZSsrOworCQlpZiAocFNlc3Npb24tPk51bVBta2lkQ2FjaGUgPiBDU1JfTUFYX1BNS0lEX0FMTE9XRUQpCisJCQlwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZSA9IENTUl9NQVhfUE1LSURfQUxMT1dFRDsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9kZWxfcG1raWRfZnJvbV9jYWNoZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgY29uc3QgdWludDhfdCAqcEJTU0lkLAorCQkJCQkgYm9vbCBmbHVzaF9jYWNoZSkKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJYm9vbCBmTWF0Y2hGb3VuZCA9IGZhbHNlOworCXVpbnQzMl90IEluZGV4OworCXVpbnQzMl90IGN1cnJfaWR4OworCXVpbnQzMl90IGk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGVyZSBhcmUgbm8gZW50cmllcyB0byBkZWxldGUgKi8KKwlpZiAoMCA9PSBwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZSkgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJObyBlbnRyaWVzIHRvIGRlbGV0ZS9GbHVzaCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlpZiAoZmx1c2hfY2FjaGUpIHsKKwkJLyogRmx1c2ggdGhlIGVudGlyZSBjYWNoZSAqLworCQljZGZfbWVtX3plcm8ocFNlc3Npb24tPlBta2lkQ2FjaGVJbmZvLAorCQkJICAgICBzaXplb2YodFBta2lkQ2FjaGVJbmZvKSAqIENTUl9NQVhfUE1LSURfQUxMT1dFRCk7CisJCXBTZXNzaW9uLT5OdW1QbWtpZENhY2hlID0gMDsKKwkJcFNlc3Npb24tPmN1cnJfY2FjaGVfaWR4ID0gMDsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwkvKiAhZmx1c2hfY2FjaGUgLSBzbyBsb29rIHVwIGluIHRoZSBjYWNoZSAqLworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IENTUl9NQVhfUE1LSURfQUxMT1dFRDsgSW5kZXgrKykgeworCQlpZiAoY2RmX21lbV9jb21wYXJlKHBTZXNzaW9uLT5QbWtpZENhY2hlSW5mb1tJbmRleF0uQlNTSUQuYnl0ZXMsCisJCQkJICAgIHBCU1NJZCwgQ0RGX01BQ19BRERSX1NJWkUpKSB7CisJCQlmTWF0Y2hGb3VuZCA9IDE7CisKKwkJCS8qIENsZWFyIHRoaXMgLSB0aGUgbWF0Y2hlZCBlbnRyeSAqLworCQkJY2RmX21lbV96ZXJvKCZwU2Vzc2lvbi0+UG1raWRDYWNoZUluZm9bSW5kZXhdLAorCQkJCSAgICAgc2l6ZW9mKHRQbWtpZENhY2hlSW5mbykpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoSW5kZXggPT0gQ1NSX01BWF9QTUtJRF9BTExPV0VEICYmICFmTWF0Y2hGb3VuZCkgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJObyBzdWNoIFBNS1NBIGVudHJ5IGV4aXN0cyIKKwkJCU1BQ19BRERSRVNTX1NUUiksIE1BQ19BRERSX0FSUkFZKHBCU1NJZCkpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCS8qIE1hdGNoIEZvdW5kLCBSZWFkanVzdCB0aGUgb3RoZXIgZW50cmllcyAqLworCWN1cnJfaWR4ID0gcFNlc3Npb24tPmN1cnJfY2FjaGVfaWR4OworCWlmIChJbmRleCA8IGN1cnJfaWR4KSB7CisJCWZvciAoaSA9IEluZGV4OyBpIDwgKGN1cnJfaWR4IC0gMSk7IGkrKykgeworCQkJY2RmX21lbV9jb3B5KCZwU2Vzc2lvbi0+UG1raWRDYWNoZUluZm9baV0sCisJCQkJICAgICAmcFNlc3Npb24tPlBta2lkQ2FjaGVJbmZvW2kgKyAxXSwKKwkJCQkgICAgIHNpemVvZih0UG1raWRDYWNoZUluZm8pKTsKKwkJfQorCisJCXBTZXNzaW9uLT5jdXJyX2NhY2hlX2lkeC0tOworCQljZGZfbWVtX3plcm8oJnBTZXNzaW9uLT5QbWtpZENhY2hlSW5mbworCQkJICAgICBbcFNlc3Npb24tPmN1cnJfY2FjaGVfaWR4XSwKKwkJCSAgICAgc2l6ZW9mKHRQbWtpZENhY2hlSW5mbykpOworCX0gZWxzZSBpZiAoSW5kZXggPiBjdXJyX2lkeCkgeworCQlmb3IgKGkgPSBJbmRleDsgaSA+IChjdXJyX2lkeCk7IGktLSkgeworCQkJY2RmX21lbV9jb3B5KCZwU2Vzc2lvbi0+UG1raWRDYWNoZUluZm9baV0sCisJCQkJICAgICAmcFNlc3Npb24tPlBta2lkQ2FjaGVJbmZvW2kgLSAxXSwKKwkJCQkgICAgIHNpemVvZih0UG1raWRDYWNoZUluZm8pKTsKKwkJfQorCisJCWNkZl9tZW1femVybygmcFNlc3Npb24tPlBta2lkQ2FjaGVJbmZvCisJCQkgICAgIFtwU2Vzc2lvbi0+Y3Vycl9jYWNoZV9pZHhdLAorCQkJICAgICBzaXplb2YodFBta2lkQ2FjaGVJbmZvKSk7CisJfQorCisJLyogRGVjcmVtZW50IHRoZSBjb3VudCBzaW5jZSBhbiBlbnRyeSBoYXMgYmVlbiBkZWxldGVkICovCisJcFNlc3Npb24tPk51bVBta2lkQ2FjaGUtLTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCit1aW50MzJfdCBjc3Jfcm9hbV9nZXRfbnVtX3Bta2lkX2NhY2hlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlyZXR1cm4gcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLk51bVBta2lkQ2FjaGU7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fZ2V0X3Bta2lkX2NhY2hlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgdWludDMyX3QgKnBOdW0sIHRQbWtpZENhY2hlSW5mbyAqcFBta2lkQ2FjaGUpCit7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCXRQbWtpZENhY2hlSW5mbyAqcG1rc2E7CisJdWludDE2X3QgaSwgajsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoIXBOdW0gfHwgIXBQbWtpZENhY2hlKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkVpdGhlciBwTnVtIG9yIHBQbWtpZENhY2hlIGlzIE5VTEwiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAocFNlc3Npb24tPk51bVBta2lkQ2FjaGUgPT0gMCkgeworCQkqcE51bSA9IDA7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJaWYgKCpwTnVtIDwgcFNlc3Npb24tPk51bVBta2lkQ2FjaGUpIHsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZSA+IENTUl9NQVhfUE1LSURfQUxMT1dFRCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgKKwkJCSJOdW1QbWtpZENhY2hlIDolZCBpcyBtb3JlIHRoYW4gQ1NSX01BWF9QTUtJRF9BTExPV0VELCByZXNldHRpbmcgdG8gQ1NSX01BWF9QTUtJRF9BTExPV0VEIiksCisJCQlwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZSk7CisJCXBTZXNzaW9uLT5OdW1QbWtpZENhY2hlID0gQ1NSX01BWF9QTUtJRF9BTExPV0VEOworCX0KKworCWZvciAoaSA9IDAsIGogPSAwOyAoKGogPCBwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZSkgJiYKKwkJKGkgPCBDU1JfTUFYX1BNS0lEX0FMTE9XRUQpKTsgaSsrKSB7CisJCS8qIEZpbGwgdGhlIHZhbGlkIGVudHJpZXMgKi8KKwkJcG1rc2EgPSAmcFNlc3Npb24tPlBta2lkQ2FjaGVJbmZvW2ldOworCQlpZiAoIWNkZl9pc19tYWNhZGRyX3plcm8oJnBta3NhLT5CU1NJRCkpIHsKKwkJCWNkZl9tZW1fY29weShwUG1raWRDYWNoZSwgcG1rc2EsCisJCQkJICAgICBzaXplb2YodFBta2lkQ2FjaGVJbmZvKSk7CisJCQlwUG1raWRDYWNoZSsrOworCQkJaisrOworCQl9CisJfQorCisJKnBOdW0gPSBwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX2dldF93cGFfcnNuX3JlcV9pZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgICAgIHVpbnQzMl90ICpwTGVuLCB1aW50OF90ICpwQnVmKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCXVpbnQzMl90IGxlbjsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAocExlbikgeworCQlsZW4gPSAqcExlbjsKKwkJKnBMZW4gPSBwU2Vzc2lvbi0+bldwYVJzblJlcUllTGVuZ3RoOworCQlpZiAocEJ1ZikgeworCQkJaWYgKGxlbiA+PSBwU2Vzc2lvbi0+bldwYVJzblJlcUllTGVuZ3RoKSB7CisJCQkJY2RmX21lbV9jb3B5KHBCdWYsIHBTZXNzaW9uLT5wV3BhUnNuUmVxSUUsCisJCQkJCSAgICAgcFNlc3Npb24tPm5XcGFSc25SZXFJZUxlbmd0aCk7CisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJfQorCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fZ2V0X3dwYV9yc25fcnNwX2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgICAgdWludDMyX3QgKnBMZW4sIHVpbnQ4X3QgKnBCdWYpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJdWludDMyX3QgbGVuOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChwTGVuKSB7CisJCWxlbiA9ICpwTGVuOworCQkqcExlbiA9IHBTZXNzaW9uLT5uV3BhUnNuUnNwSWVMZW5ndGg7CisJCWlmIChwQnVmKSB7CisJCQlpZiAobGVuID49IHBTZXNzaW9uLT5uV3BhUnNuUnNwSWVMZW5ndGgpIHsKKwkJCQljZGZfbWVtX2NvcHkocEJ1ZiwgcFNlc3Npb24tPnBXcGFSc25Sc3BJRSwKKwkJCQkJICAgICBwU2Vzc2lvbi0+bldwYVJzblJzcEllTGVuZ3RoKTsKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCitDREZfU1RBVFVTIGNzcl9yb2FtX2dldF93YXBpX3JlcV9pZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgIHVpbnQzMl90ICpwTGVuLCB1aW50OF90ICpwQnVmKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCXVpbnQzMl90IGxlbjsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAocExlbikgeworCQlsZW4gPSAqcExlbjsKKwkJKnBMZW4gPSBwU2Vzc2lvbi0+bldhcGlSZXFJZUxlbmd0aDsKKwkJaWYgKHBCdWYpIHsKKwkJCWlmIChsZW4gPj0gcFNlc3Npb24tPm5XYXBpUmVxSWVMZW5ndGgpIHsKKwkJCQljZGZfbWVtX2NvcHkocEJ1ZiwgcFNlc3Npb24tPnBXYXBpUmVxSUUsCisJCQkJCSAgICAgcFNlc3Npb24tPm5XYXBpUmVxSWVMZW5ndGgpOworCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX2dldF93YXBpX3JzcF9pZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgIHVpbnQzMl90ICpwTGVuLCB1aW50OF90ICpwQnVmKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCXVpbnQzMl90IGxlbjsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAocExlbikgeworCQlsZW4gPSAqcExlbjsKKwkJKnBMZW4gPSBwU2Vzc2lvbi0+bldhcGlSc3BJZUxlbmd0aDsKKwkJaWYgKHBCdWYpIHsKKwkJCWlmIChsZW4gPj0gcFNlc3Npb24tPm5XYXBpUnNwSWVMZW5ndGgpIHsKKwkJCQljZGZfbWVtX2NvcHkocEJ1ZiwgcFNlc3Npb24tPnBXYXBpUnNwSUUsCisJCQkJCSAgICAgcFNlc3Npb24tPm5XYXBpUnNwSWVMZW5ndGgpOworCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCitlUm9hbUNtZFN0YXR1cyBjc3JfZ2V0X3JvYW1fY29tcGxldGVfc3RhdHVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwllUm9hbUNtZFN0YXR1cyByZXRTdGF0dXMgPSBlQ1NSX1JPQU1fQ09OTkVDVF9DT01QTEVUSU9OOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIHJldFN0YXR1czsKKwl9CisKKwlpZiAoQ1NSX0lTX1JPQU1JTkcocFNlc3Npb24pKSB7CisJCXJldFN0YXR1cyA9IGVDU1JfUk9BTV9ST0FNSU5HX0NPTVBMRVRJT047CisJCXBTZXNzaW9uLT5mUm9hbWluZyA9IGZhbHNlOworCX0KKwlyZXR1cm4gcmV0U3RhdHVzOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZSB0aGUgY29ubmVjdGVkIEJTUyBmcm9tIHRlIGNhY2hlZCBzY2FuIHJlc3VsdCAqLworQ0RGX1NUQVRVUworY3NyX3JvYW1fcmVtb3ZlX2Nvbm5lY3RlZF9ic3NfZnJvbV9zY2FuX2NhY2hlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcENvbm5Qcm9maWxlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyID0gTlVMTDsKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwl0Q3NyU2NhblJlc3VsdCAqcFJlc3VsdDsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzOworCWJvb2wgZk1hdGNoOworCisJaWYgKChjZGZfaXNfbWFjYWRkcl96ZXJvKCZwQ29ublByb2ZpbGUtPmJzc2lkKSB8fAorCSAgICAgY2RmX2lzX21hY2FkZHJfYnJvYWRjYXN0KCZwQ29ublByb2ZpbGUtPmJzc2lkKSkpCisJCXJldHVybiBzdGF0dXM7CisJLyoKKwkgKiBQcmVwYXJlIHRoZSBmaWx0ZXIuIE9ubHkgZmlsbCBpbiB0aGUgbmVjZXNzYXJ5IGZpZWxkcy4gTm90IGFsbCBmaWVsZHMKKwkgKiBhcmUgbmVlZGVkCisJICovCisJcFNjYW5GaWx0ZXIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKwlpZiAoTlVMTCA9PSBwU2NhbkZpbHRlcikKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKworCWNkZl9tZW1fc2V0KHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpLCAwKTsKKwlwU2NhbkZpbHRlci0+QlNTSURzLmJzc2lkID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwlpZiAoTlVMTCA9PSBwU2NhbkZpbHRlci0+QlNTSURzLmJzc2lkKSB7CisJCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlcik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCWNkZl9tZW1fY29weShwU2NhbkZpbHRlci0+QlNTSURzLmJzc2lkLAorCQkgICAgICZwQ29ublByb2ZpbGUtPmJzc2lkLCBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCXBTY2FuRmlsdGVyLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSAxOworCWlmICghY3NyX2lzX251bGxzc2lkKHBDb25uUHJvZmlsZS0+U1NJRC5zc0lkLAorCQkJcENvbm5Qcm9maWxlLT5TU0lELmxlbmd0aCkpIHsKKwkJcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0ID0gY2RmX21lbV9tYWxsb2MoCisJCQkJCQkJc2l6ZW9mKHRDc3JTU0lESW5mbykpOworCQlpZiAoTlVMTCA9PSBwU2NhbkZpbHRlci0+U1NJRHMuU1NJRExpc3QpIHsKKwkJCWNzcl9mcmVlX3NjYW5fZmlsdGVyKHBNYWMsIHBTY2FuRmlsdGVyKTsKKwkJCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlcik7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisJCWNkZl9tZW1fY29weSgmcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0WzBdLlNTSUQsCisJCQkmcENvbm5Qcm9maWxlLT5TU0lELCBzaXplb2YodFNpck1hY1NTaWQpKTsKKwl9CisJcFNjYW5GaWx0ZXItPmF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworCXBTY2FuRmlsdGVyLT5hdXRoVHlwZS5hdXRoVHlwZVswXSA9IHBDb25uUHJvZmlsZS0+QXV0aFR5cGU7CisJcFNjYW5GaWx0ZXItPkJTU1R5cGUgPSBwQ29ublByb2ZpbGUtPkJTU1R5cGU7CisJcFNjYW5GaWx0ZXItPkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCXBTY2FuRmlsdGVyLT5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCXBDb25uUHJvZmlsZS0+RW5jcnlwdGlvblR5cGU7CisJcFNjYW5GaWx0ZXItPm1jRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisJcFNjYW5GaWx0ZXItPm1jRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPQorCQlwQ29ublByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGU7CisJLyogV2UgaWdub3JlIHRoZSBjaGFubmVsIGZvciBub3csIEJTU0lEIHNob3VsZCBiZSBlbm91Z2ggKi8KKwlwU2NhbkZpbHRlci0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDA7CisJLyogQWxzbyBpZ25vcmUgdGhlIGZvbGxvd2luZyBmaWVsZHMgKi8KKwlwU2NhbkZpbHRlci0+dWFwc2RfbWFzayA9IDA7CisJcFNjYW5GaWx0ZXItPmJXUFNBc3NvY2lhdGlvbiA9IGZhbHNlOworCXBTY2FuRmlsdGVyLT5iT1NFTkFzc29jaWF0aW9uID0gZmFsc2U7CisJcFNjYW5GaWx0ZXItPmNvdW50cnlDb2RlWzBdID0gMDsKKwlwU2NhbkZpbHRlci0+cGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV9BVVRPOworCWNzcl9sbF9sb2NrKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0KTsKKwlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl3aGlsZSAocEVudHJ5KSB7CisJCXBSZXN1bHQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQlwSWVzID0gKHREb3QxMWZCZWFjb25JRXMgKikgKHBSZXN1bHQtPlJlc3VsdC5wdkllcyk7CisJCWZNYXRjaCA9IGNzcl9tYXRjaF9ic3MocE1hYywgJnBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLAorCQkJCSAgICAgICBwU2NhbkZpbHRlciwgTlVMTCwgTlVMTCwgTlVMTCwgJnBJZXMpOworCQkvKiBSZWxlYXNlIHRoZSBJRXMgYWxsb2NhdGVkIGJ5IGNzcl9tYXRjaF9ic3MgaXMgbmVlZGVkICovCisJCWlmICghcFJlc3VsdC0+UmVzdWx0LnB2SWVzKSB7CisJCQkvKgorCQkJICogbmVlZCB0byBmcmVlIHRoZSBJRXMgc2luY2UgaXQgaXMgYWxsb2NhdGVkCisJCQkgKiBieSBjc3JfbWF0Y2hfYnNzCisJCQkgKi8KKwkJCWNkZl9tZW1fZnJlZShwSWVzKTsKKwkJfQorCQlpZiAoZk1hdGNoKSB7CisJCQkvKiBXZSBmb3VuZCB0aGUgb25lICovCisJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeSgmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwKKwkJCQkJCXBFbnRyeSwgTExfQUNDRVNTX05PTE9DSykpCisJCQkJLyogRnJlZSB0aGUgbWVtb3J5ICovCisJCQkJY3NyX2ZyZWVfc2Nhbl9yZXN1bHRfZW50cnkocE1hYywgcFJlc3VsdCk7CisJCQlicmVhazsKKwkJfQorCQlwRW50cnkgPSBjc3JfbGxfbmV4dCgmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwKKwkJCQkgICAgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl9IC8qIHdoaWxlICovCisJY3NyX2xsX3VubG9jaygmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisJY3NyX2ZyZWVfc2Nhbl9maWx0ZXIocE1hYywgcFNjYW5GaWx0ZXIpOworCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlcik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIENERl9TVEFUVVMgY3NyX3JvYW1fc3RhcnRfd2RzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwl0QnNzQ29uZmlnUGFyYW0gYnNzQ29uZmlnOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKGNzcl9pc19jb25uX3N0YXRlX2lic3MocE1hYywgc2Vzc2lvbklkKSkgeworCQlzdGF0dXMgPQorCQkJY3NyX3JvYW1faXNzdWVfc3RvcF9ic3MocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0NPTk5FQ1RfQ09OVElOVUVfUk9BTUlORyk7CisJfSBlbHNlIGlmIChjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWRfaW5mcmEocE1hYywgc2Vzc2lvbklkKSkgeworCQkvKiBEaXNhc3NvY2lhdGUgZnJvbSB0aGUgY29ubmVjdGVkIEluZnJhc3RydWN0dXJlIG5ldHdvcmsuLi4gKi8KKwkJc3RhdHVzID0KKwkJCWNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZShwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkgICAgZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0NPTk5FQ1RfQ09OVElOVUVfUk9BTUlORywKKwkJCQkJCSAgICBmYWxzZSk7CisJfSBlbHNlIHsKKwkJLyogV2UgZG9uJ3QgZXhwZWN0IEJ0LUFNUCBIREQgbm90IHRvIGRpc2Nvbm5lY3QgdGhlIGxhc3QgY29ubmVjdGlvbiBmaXJzdCBhdCB0aGlzIHRpbWUuICovCisJCS8qIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGFkZCBjb2RlIHRvIGhhbmRsZSB0aGUgKi8KKwkJLyogc2l0dWF0aW9uIGp1c3QgbGlrZSBJQlNTLiBUaG91Z2ggZm9yIFdEUyBzdGF0aW9uLCB3ZSBuZWVkIHRvIHNlbmQgZGlzYXNzb2MgdG8gUEUgZmlyc3QgdGhlbiAqLworCQkvKiBzZW5kIHN0b3BfYnNzIHRvIFBFLCBiZWZvcmUgd2UgY2FuIGNvbnRpbnVlLiAqLworCisJCWlmIChjc3JfaXNfY29ubl9zdGF0ZV93ZHMocE1hYywgc2Vzc2lvbklkKSkgeworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQljZGZfbWVtX3NldCgmYnNzQ29uZmlnLCBzaXplb2YodEJzc0NvbmZpZ1BhcmFtKSwgMCk7CisJCS8qIEFzc3VtZSBIREQgcHJvdmlkZSBic3NpZCBpbiBwcm9maWxlICovCisJCWNkZl9jb3B5X21hY2FkZHIoJnBTZXNzaW9uLT5ic3NQYXJhbXMuYnNzaWQsCisJCQkJIHBQcm9maWxlLT5CU1NJRHMuYnNzaWQpOworCQkvKiB0aGVyZSBpcyBubyBCc3MgZGVzY3JpcHRpb24gYmVmb3JlIHdlIHN0YXJ0IGFuIFdEUyBzbyB3ZSBuZWVkICovCisJCS8qIHRvIGFkb3B0IGFsbCBCc3MgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZyb20gdGhlIFByb2ZpbGUuICovCisJCXN0YXR1cyA9CisJCQljc3Jfcm9hbV9wcmVwYXJlX2Jzc19jb25maWdfZnJvbV9wcm9maWxlKHBNYWMsIHBQcm9maWxlLAorCQkJCQkJCQkgJmJzc0NvbmZpZywgcEJzc0Rlc2MpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCS8qIFNhdmUgcHJvZmlsZSBmb3IgbGF0ZSB1c2UgKi8KKwkJCWNzcl9mcmVlX3JvYW1fcHJvZmlsZShwTWFjLCBzZXNzaW9uSWQpOworCQkJcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSA9CisJCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JSb2FtUHJvZmlsZSkpOworCQkJaWYgKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUgIT0gTlVMTCkgeworCQkJCWNkZl9tZW1fc2V0KHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUsCisJCQkJCSAgICBzaXplb2YodENzclJvYW1Qcm9maWxlKSwgMCk7CisJCQkJY3NyX3JvYW1fY29weV9wcm9maWxlKHBNYWMsCisJCQkJCQkgICAgICBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLAorCQkJCQkJICAgICAgcFByb2ZpbGUpOworCQkJfQorCQkJLyogUHJlcGFyZSBzb21lIG1vcmUgcGFyYW1ldGVycyBmb3IgdGhpcyBXRFMgKi8KKwkJCWNzcl9yb2FtX3ByZXBhcmVfYnNzX3BhcmFtcyhwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCBOVUxMLAorCQkJCQkJICAgICZic3NDb25maWcsIE5VTEwpOworCQkJc3RhdHVzID0KKwkJCQljc3Jfcm9hbV9zZXRfYnNzX2NvbmZpZ19jZmcocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwKKwkJCQkJCQkgICAgTlVMTCwgJmJzc0NvbmZpZywgTlVMTCwKKwkJCQkJCQkgICAgZmFsc2UpOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3JfYWRkX3N1cHBvcnRlZF81R2h6X2NoYW5uZWxzKCktIEFkZCB2YWxpZCA1R2h6IGNoYW5uZWxzCisgKiBpbiBKb2luIHJlcS4KKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgKiBAY3NyX2pvaW5fcmVxOiBqb2luIHJlcSBzZW50IHRvIGxpbQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHVwZGF0ZSB2YWxpZCA1R2h6IGNoYW5uZWxzCisgKiBpbiBKb2luIHJlcS4KKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIHZvaWQgY3NyX2FkZF9zdXBwb3J0ZWRfNUdoel9jaGFubmVscyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQl0U2lyU21lSm9pblJlcSAqY3NyX2pvaW5fcmVxKQoreworCXVpbnQxNl90IGksIGo7CisJdWludDMyX3Qgc2l6ZSA9IDA7CisKKwlpZiAoIWNzcl9qb2luX3JlcSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCIgIGNzcl9qb2luX3JlcWlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlzaXplID0gc2l6ZW9mKG1hY19jdHgtPnJvYW0udmFsaWRDaGFubmVsTGlzdCk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUworCQkoY3NyX2dldF9jZmdfdmFsaWRfY2hhbm5lbHMobWFjX2N0eCwKKwkJKHVpbnQ4X3QgKikgbWFjX2N0eC0+cm9hbS52YWxpZENoYW5uZWxMaXN0LAorCQkJCSZzaXplKSkpIHsKKwkJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCS8qIE9ubHkgYWRkIDVnaHogY2hhbm5lbHMuKi8KKwkJCWlmIChDRFNfSVNfQ0hBTk5FTF81R0haCisJCQkJCShtYWNfY3R4LT5yb2FtLnZhbGlkQ2hhbm5lbExpc3RbaV0pKSB7CisJCQkJY3NyX2pvaW5fcmVxLT5zdXBwb3J0ZWRDaGFubmVscy5jaGFubmVsTGlzdFtqXSA9CisJCQkJCW1hY19jdHgtPnJvYW0udmFsaWRDaGFubmVsTGlzdFtpXTsKKwkJCQlqKys7CisJCQl9CisJCX0KKwkJY3NyX2pvaW5fcmVxLT5zdXBwb3J0ZWRDaGFubmVscy5udW1DaG5sID0gajsKKwl9IGVsc2UgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiY2FuIG5vdCBmaW5kIGFueSB2YWxpZCBjaGFubmVsIikpOworCQljc3Jfam9pbl9yZXEtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmwgPSAwOworCX0KK30KKworLyoqCisgKiBUaGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEhERCBhbmQgTElNIGlzIHRocnUgbWFpbGJveCAoTUIpLgorICogQm90aCBzaWRlcyB3aWxsIGFjY2VzcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgInRTaXJTbWVKb2luUmVxIi4KKyAqIFRoZSBydWxlIGlzLCB3aGlsZSB0aGUgY29tcG9uZW50cyBvZiAidFNpclNtZUpvaW5SZXEiIGNhbiBiZSBhY2Nlc3NlZCBpbiB0aGUKKyAqIHJlZ3VsYXIgd2F5IGxpa2UgdFNpclNtZUpvaW5SZXEuYXNzb2NUeXBlLCB0aGlzIGd1aWRlbGluZSBzdG9wcyBhdCBjb21wb25lbnQKKyAqIHRTaXJSU05pZTsKKyAqIGFueSBhY2NlcyB0byB0aGUgY29tcG9uZW50cyBhZnRlciB0U2lyUlNOaWUgaXMgZm9yYmlkZGVuIGJlY2F1c2UgdGhlIHNwYWNlCisgKiBmcm9tIHRTaXJSU05pZSBpcyBzcXVlZXplZCB3aXRoIHRoZSBjb21wb25lbnQgInRTaXJCc3NEZXNjcmlwdGlvbiIgYW5kIHNpbmNlCisgKiB0aGUgc2l6ZSBvZiBhY3R1YWwgJ3RTaXJCc3NEZXNjcmlwdGlvbicgdmFyaWVzLCB0aGUgcmVjZWl2aW5nIHNpZGUgc2hvdWxkCisgKiBrZWVwIGluIG1pbmQgbm90IHRvIGFjY2VzcyB0aGUgY29tcG9uZW50cyBESVJFQ1RMWSBhZnRlciB0U2lyUlNOaWUuCisgKi8KK0NERl9TVEFUVVMgY3NyX3NlbmRfam9pbl9yZXFfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzY3JpcHRpb24sCisJCQkJIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHVpbnQxNl90IG1lc3NhZ2VUeXBlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVpbnQ4X3QgYWNtX21hc2sgPSAwLCB1YXBzZF9tYXNrOworCXVpbnQxNl90IG1zZ0xlbiwgaWVMZW47CisJdFNpck1hY1JhdGVTZXQgT3BSYXRlU2V0OworCXRTaXJNYWNSYXRlU2V0IEV4UmF0ZVNldDsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJdWludDMyX3QgZHdUbXAsIHVjRG90MTFNb2RlID0gMDsKKwkvKiBSU04gTUFYIGlzIGJpZ2dlciB0aGFuIFdQQSBNQVggKi8KKwl1aW50OF90IHdwYVJzbklFW0RPVDExRl9JRV9SU05fTUFYX0xFTl07CisJdWludDhfdCB0eEJGQ3NuVmFsdWUgPSAwOworCXRTaXJTbWVKb2luUmVxICpjc3Jfam9pbl9yZXE7CisJdFNpck1hY0NhcGFiaWxpdHlJbmZvICpwQVBfY2FwYWJpbGl0eUluZm87CisJdEFuaUJvb2wgZlRtcDsKKwlpbnQ4X3QgcHdyTGltaXQgPSAwOworCXN0cnVjdCBwc19nbG9iYWxfaW5mbyAqcHNfZ2xvYmFsX2luZm8gPSAmcE1hYy0+c21lLnBzX2dsb2JhbF9pbmZvOworCXN0cnVjdCBwc19wYXJhbXMgKnBzX3BhcmFtID0gJnBzX2dsb2JhbF9pbmZvLT5wc19wYXJhbXNbc2Vzc2lvbklkXTsKKwl1aW50OF90IGVzZV9jb25maWcgPSAwOworCisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyogVG8gc2F0aXNmeSBrbG9ja3dvcmtzICovCisJaWYgKE5VTEwgPT0gcEJzc0Rlc2NyaXB0aW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiBwQnNzRGVzY3JpcHRpb24gaXMgTlVMTCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWRvIHsKKwkJcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5zdGF0dXNDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKwkJcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5yZWFzb25Db2RlID0gMDsKKwkJY2RmX21lbV9jb3B5KCZwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLmJzc0lkLAorCQkgICAgICAgJnBCc3NEZXNjcmlwdGlvbi0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkvKgorCQkgKiB0aGUgdFNpclNtZUpvaW5SZXEgd2hpY2ggaW5jbHVkZXMgYSBzaW5nbGUKKwkJICogYnNzRGVzY3JpcHRpb24uIGl0IGluY2x1ZGVzIGEgc2luZ2xlIHVpbnQzMl90IGZvciB0aGUKKwkJICogSUUgZmllbGRzLCBidXQgdGhlIGxlbmd0aCBmaWVsZCBpbiB0aGUgYnNzRGVzY3JpcHRpb24KKwkJICogbmVlZHMgdG8gYmUgaW50ZXJwcmV0ZWQgdG8gZGV0ZXJtaW5lIGxlbmd0aCBvZiBJRSBmaWVsZHMKKwkJICogU28sIHRha2UgdGhlIHNpemUgb2YgdGhlIHRTaXJTbWVKb2luUmVxLCBzdWJ0cmFjdCAgc2l6ZSBvZgorCQkgKiBic3NEZXNjcmlwdGlvbiwgYWRkIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW5kaWNhdGVkIGJ5IHRoZQorCQkgKiBsZW5ndGggZmllbGQgb2YgdGhlIGJzc0Rlc2NyaXB0aW9uLCBhZGQgdGhlIHNpemUgb2YgbGVuZ3RoCisJCSAqIGZpZWxkICBiZWNhdXNlIGl0IG5vdCBpbmNsdWRlZCBpbiB0aGUgbGVuZ2h0aCBmaWVsZC4KKwkJICovCisJCW1zZ0xlbiA9IHNpemVvZih0U2lyU21lSm9pblJlcSkgLSBzaXplb2YoKnBCc3NEZXNjcmlwdGlvbikgKworCQkJCXBCc3NEZXNjcmlwdGlvbi0+bGVuZ3RoICsKKwkJCQlzaXplb2YocEJzc0Rlc2NyaXB0aW9uLT5sZW5ndGgpICsKKwkJCQkvKgorCQkJCSAqIGFkZCBpbiB0aGUgc2l6ZSBvZiB0aGUgV1BBIElFIHRoYXQKKwkJCQkgKiB3ZSBtYXkgYnVpbGQuCisJCQkJICovCisJCQkJc2l6ZW9mKHRDc3JXcGFJZSkgKyBzaXplb2YodENzcldwYUF1dGhJZSkgKworCQkJCXNpemVvZih1aW50MTZfdCk7CisJCWNzcl9qb2luX3JlcSA9IGNkZl9tZW1fbWFsbG9jKG1zZ0xlbik7CisJCWlmIChOVUxMID09IGNzcl9qb2luX3JlcSkKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZWxzZQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJYnJlYWs7CisJCWNkZl9tZW1fc2V0KGNzcl9qb2luX3JlcSwgbXNnTGVuLCAwKTsKKwkJY3NyX2pvaW5fcmVxLT5tZXNzYWdlVHlwZSA9IG1lc3NhZ2VUeXBlOworCQljc3Jfam9pbl9yZXEtPmxlbmd0aCA9IG1zZ0xlbjsKKwkJY3NyX2pvaW5fcmVxLT5zZXNzaW9uSWQgPSAodWludDhfdCkgc2Vzc2lvbklkOworCQljc3Jfam9pbl9yZXEtPnRyYW5zYWN0aW9uSWQgPSAwOworCQlpZiAocEllcy0+U1NJRC5wcmVzZW50ICYmIHBJZXMtPlNTSUQubnVtX3NzaWQpIHsKKwkJCWNzcl9qb2luX3JlcS0+c3NJZC5sZW5ndGggPSBwSWVzLT5TU0lELm51bV9zc2lkOworCQkJY2RmX21lbV9jb3B5KCZjc3Jfam9pbl9yZXEtPnNzSWQuc3NJZCwgcEllcy0+U1NJRC5zc2lkLAorCQkJCSAgICAgcEllcy0+U1NJRC5udW1fc3NpZCk7CisJCX0gZWxzZQorCQkJY3NyX2pvaW5fcmVxLT5zc0lkLmxlbmd0aCA9IDA7CisJCWNkZl9tZW1fY29weSgmY3NyX2pvaW5fcmVxLT5zZWxmTWFjQWRkciwgJnBTZXNzaW9uLT5zZWxmTWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCS8qIGJzc3R5cGUgKi8KKwkJZHdUbXAgPSBjc3JfdHJhbnNsYXRlX2Jzc3R5cGVfdG9fbWFjX3R5cGUKKwkJCQkJCShwUHJvZmlsZS0+QlNTVHlwZSk7CisJCS8qIE92ZXJyaWRlIEJzc1R5cGUgZm9yIEJUQU1QICovCisJCWlmIChkd1RtcCA9PSBlU0lSX0JUQU1QX1NUQV9NT0RFKQorCQkJZHdUbXAgPSBlU0lSX0JUQU1QX0FQX01PREU7CisJCQljc3Jfam9pbl9yZXEtPmJzc3R5cGUgPSBkd1RtcDsKKwkJLyogZG90MTFtb2RlICovCisJCXVjRG90MTFNb2RlID0KKwkJCWNzcl90cmFuc2xhdGVfdG9fd25pX2NmZ19kb3QxMV9tb2RlKHBNYWMsCisJCQkJCQkJICAgIHBTZXNzaW9uLT5ic3NQYXJhbXMuCisJCQkJCQkJICAgIHVDZmdEb3QxMU1vZGUpOworCQlpZiAocEJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQgPD0gMTQKKwkJICAgICYmIGZhbHNlID09IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZW5hYmxlVmh0Rm9yMjRHSHoKKwkJICAgICYmIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUFDID09IHVjRG90MTFNb2RlKSB7CisJCQkvKiBOZWVkIHRvIGRpc2FibGUgVkhUIG9wZXJhdGlvbiBpbiAyLjQgR0h6IGJhbmQgKi8KKwkJCXVjRG90MTFNb2RlID0gV05JX0NGR19ET1QxMV9NT0RFXzExTjsKKwkJfQorCQljc3Jfam9pbl9yZXEtPmRvdDExbW9kZSA9ICh1aW50OF90KSB1Y0RvdDExTW9kZTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwkJY3NyX2pvaW5fcmVxLT5jY19zd2l0Y2hfbW9kZSA9CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNjX3N3aXRjaF9tb2RlOworI2VuZGlmCisJCWNzcl9qb2luX3JlcS0+c3RhUGVyc29uYSA9ICh1aW50OF90KSBwUHJvZmlsZS0+Y3NyUGVyc29uYTsKKwkJY3NyX2pvaW5fcmVxLT5jYk1vZGUgPSAodWludDhfdCkgcFNlc3Npb24tPmJzc1BhcmFtcy5jYk1vZGU7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgIEZMKCJDU1IgUEVSU09OQT0lZCBDU1IgQ2JNb2RlICVkIiksCisJCQkgIHBQcm9maWxlLT5jc3JQZXJzb25hLCBwU2Vzc2lvbi0+YnNzUGFyYW1zLmNiTW9kZSk7CisJCWNzcl9qb2luX3JlcS0+dWFwc2RQZXJBY0JpdG1hc2sgPSBwUHJvZmlsZS0+dWFwc2RfbWFzazsKKwkJc3RhdHVzID0KKwkJCWNzcl9nZXRfcmF0ZV9zZXQocE1hYywgcFByb2ZpbGUsCisJCQkJCSAoZUNzclBoeU1vZGUpIHBQcm9maWxlLT5waHlNb2RlLAorCQkJCQkgcEJzc0Rlc2NyaXB0aW9uLCBwSWVzLCAmT3BSYXRlU2V0LAorCQkJCQkgJkV4UmF0ZVNldCk7CisJCXBzX3BhcmFtLT51YXBzZF9wZXJfYWNfYml0X21hc2sgPQorCQkJcFByb2ZpbGUtPnVhcHNkX21hc2s7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJLyogT3BlcmF0aW9uYWxSYXRlU2V0ICovCisJCQlpZiAoT3BSYXRlU2V0Lm51bVJhdGVzKSB7CisJCQkJY3NyX2pvaW5fcmVxLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMgPQorCQkJCQlPcFJhdGVTZXQubnVtUmF0ZXM7CisJCQkJY2RmX21lbV9jb3B5KCZjc3Jfam9pbl9yZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC4KKwkJCQkJCXJhdGUsIE9wUmF0ZVNldC5yYXRlLAorCQkJCQkJT3BSYXRlU2V0Lm51bVJhdGVzKTsKKwkJCX0gZWxzZQorCQkJCWNzcl9qb2luX3JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID0gMDsKKworCQkJLyogRXh0ZW5kZWRSYXRlU2V0ICovCisJCQlpZiAoRXhSYXRlU2V0Lm51bVJhdGVzKSB7CisJCQkJY3NyX2pvaW5fcmVxLT5leHRlbmRlZFJhdGVTZXQubnVtUmF0ZXMgPQorCQkJCQlFeFJhdGVTZXQubnVtUmF0ZXM7CisJCQkJY2RmX21lbV9jb3B5KCZjc3Jfam9pbl9yZXEtPmV4dGVuZGVkUmF0ZVNldC4KKwkJCQkJCXJhdGUsIEV4UmF0ZVNldC5yYXRlLAorCQkJCQkJRXhSYXRlU2V0Lm51bVJhdGVzKTsKKwkJCX0gZWxzZQorCQkJCWNzcl9qb2luX3JlcS0+ZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzID0gMDsKKwkJfSBlbHNlIHsKKwkJCWNzcl9qb2luX3JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID0gMDsKKwkJCWNzcl9qb2luX3JlcS0+ZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzID0gMDsKKwkJfQorCQkvKiByc25JRSAqLworCQlpZiAoY3NyX2lzX3Byb2ZpbGVfd3BhKHBQcm9maWxlKSkgeworCQkJLyogSW5zZXJ0IHRoZSBXcGEgSUUgaW50byB0aGUgam9pbiByZXF1ZXN0ICovCisJCQlpZUxlbiA9CisJCQkJY3NyX3JldHJpZXZlX3dwYV9pZShwTWFjLCBwUHJvZmlsZSwKKwkJCQkJCXBCc3NEZXNjcmlwdGlvbiwgcEllcywKKwkJCQkJCSh0Q3NyV3BhSWUgKikgKHdwYVJzbklFKSk7CisJCX0gZWxzZSBpZiAoY3NyX2lzX3Byb2ZpbGVfcnNuKHBQcm9maWxlKSkgeworCQkJLyogSW5zZXJ0IHRoZSBSU04gSUUgaW50byB0aGUgam9pbiByZXF1ZXN0ICovCisJCQlpZUxlbiA9CisJCQkJY3NyX3JldHJpZXZlX3Jzbl9pZShwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLAorCQkJCQkJICAgIHBCc3NEZXNjcmlwdGlvbiwgcEllcywKKwkJCQkJCSAgICAodENzclJTTkllICopICh3cGFSc25JRSkpOworCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwkJZWxzZSBpZiAoY3NyX2lzX3Byb2ZpbGVfd2FwaShwUHJvZmlsZSkpIHsKKwkJCS8qIEluc2VydCB0aGUgV0FQSSBJRSBpbnRvIHRoZSBqb2luIHJlcXVlc3QgKi8KKwkJCWllTGVuID0KKwkJCQljc3JfcmV0cmlldmVfd2FwaV9pZShwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLAorCQkJCQkJICAgICBwQnNzRGVzY3JpcHRpb24sIHBJZXMsCisJCQkJCQkgICAgICh0Q3NyV2FwaUllICopICh3cGFSc25JRSkpOworCQl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKwkJZWxzZSB7CisJCQlpZUxlbiA9IDA7CisJCX0KKwkJLyogcmVtZW1iZXIgdGhlIElFIGZvciBmdXR1cmUgdXNlICovCisJCWlmIChpZUxlbikgeworCQkJaWYgKGllTGVuID4gRE9UMTFGX0lFX1JTTl9NQVhfTEVOKSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTAorCQkJCQkoIiBXUEEgUlNOIElFIGxlbmd0aCA6JWQgaXMgbW9yZSB0aGFuIERPVDExRl9JRV9SU05fTUFYX0xFTiwgcmVzZXR0aW5nIHRvICVkIiksCisJCQkJCWllTGVuLCBET1QxMUZfSUVfUlNOX01BWF9MRU4pOworCQkJCWllTGVuID0gRE9UMTFGX0lFX1JTTl9NQVhfTEVOOworCQkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJCQlpZiAoY3NyX2lzX3Byb2ZpbGVfd2FwaShwUHJvZmlsZSkpIHsKKwkJCQkvKiBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gYWxsb2NhdGUgbW9yZSBtZW0gKi8KKwkJCQlpZiAoaWVMZW4gPiBwU2Vzc2lvbi0+bldhcGlSZXFJZUxlbmd0aCkgeworCQkJCQlpZiAocFNlc3Npb24tPnBXYXBpUmVxSUUKKwkJCQkJICAgICYmIHBTZXNzaW9uLT5uV2FwaVJlcUllTGVuZ3RoKSB7CisJCQkJCQljZGZfbWVtX2ZyZWUocFNlc3Npb24tPgorCQkJCQkJCSAgICAgcFdhcGlSZXFJRSk7CisJCQkJCX0KKwkJCQkJcFNlc3Npb24tPnBXYXBpUmVxSUUgPQorCQkJCQkJY2RmX21lbV9tYWxsb2MoaWVMZW4pOworCQkJCQlpZiAoTlVMTCA9PSBwU2Vzc2lvbi0+cFdhcGlSZXFJRSkKKwkJCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCQkJZWxzZQorCQkJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBTZXNzaW9uLT5uV2FwaVJlcUllTGVuZ3RoID0gaWVMZW47CisJCQkJY2RmX21lbV9jb3B5KHBTZXNzaW9uLT5wV2FwaVJlcUlFLCB3cGFSc25JRSwKKwkJCQkJICAgICBpZUxlbik7CisJCQkJY3NyX2pvaW5fcmVxLT5yc25JRS5sZW5ndGggPSBpZUxlbjsKKwkJCQljZGZfbWVtX2NvcHkoJmNzcl9qb2luX3JlcS0+cnNuSUUucnNuSUVkYXRhLAorCQkJCQkJIHdwYVJzbklFLCBpZUxlbik7CisJCQl9IGVsc2UgIC8qIHNob3VsZCBiZSBXUEEvV1BBMiBvdGhlcndpc2UgKi8KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCQkJeworCQkJCS8qIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBhbGxvY2F0ZSBtb3JlIG1lbSAqLworCQkJCWlmIChpZUxlbiA+IHBTZXNzaW9uLT5uV3BhUnNuUmVxSWVMZW5ndGgpIHsKKwkJCQkJaWYgKHBTZXNzaW9uLT5wV3BhUnNuUmVxSUUKKwkJCQkJICAgICYmIHBTZXNzaW9uLT5uV3BhUnNuUmVxSWVMZW5ndGgpIHsKKwkJCQkJCWNkZl9tZW1fZnJlZShwU2Vzc2lvbi0+CisJCQkJCQkJICAgICBwV3BhUnNuUmVxSUUpOworCQkJCQl9CisJCQkJCXBTZXNzaW9uLT5wV3BhUnNuUmVxSUUgPQorCQkJCQkJY2RmX21lbV9tYWxsb2MoaWVMZW4pOworCQkJCQlpZiAoTlVMTCA9PSBwU2Vzc2lvbi0+cFdwYVJzblJlcUlFKQorCQkJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQkJCQllbHNlCisJCQkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcFNlc3Npb24tPm5XcGFSc25SZXFJZUxlbmd0aCA9IGllTGVuOworCQkJCWNkZl9tZW1fY29weShwU2Vzc2lvbi0+cFdwYVJzblJlcUlFLCB3cGFSc25JRSwKKwkJCQkJICAgICBpZUxlbik7CisJCQkJY3NyX2pvaW5fcmVxLT5yc25JRS5sZW5ndGggPSBpZUxlbjsKKwkJCQljZGZfbWVtX2NvcHkoJmNzcl9qb2luX3JlcS0+cnNuSUUucnNuSUVkYXRhLAorCQkJCQkJIHdwYVJzbklFLCBpZUxlbik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBmcmVlIHdoYXRldmVyIG9sZCBpbmZvICovCisJCQlwU2Vzc2lvbi0+bldwYVJzblJlcUllTGVuZ3RoID0gMDsKKwkJCWlmIChwU2Vzc2lvbi0+cFdwYVJzblJlcUlFKSB7CisJCQkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5wV3BhUnNuUmVxSUUpOworCQkJCXBTZXNzaW9uLT5wV3BhUnNuUmVxSUUgPSBOVUxMOworCQkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJCQlwU2Vzc2lvbi0+bldhcGlSZXFJZUxlbmd0aCA9IDA7CisJCQlpZiAocFNlc3Npb24tPnBXYXBpUmVxSUUpIHsKKwkJCQljZGZfbWVtX2ZyZWUocFNlc3Npb24tPnBXYXBpUmVxSUUpOworCQkJCXBTZXNzaW9uLT5wV2FwaVJlcUlFID0gTlVMTDsKKwkJCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCQkJY3NyX2pvaW5fcmVxLT5yc25JRS5sZW5ndGggPSAwOworCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQlpZiAoZVdOSV9TTUVfSk9JTl9SRVEgPT0gbWVzc2FnZVR5cGUpCisJCQljc3Jfam9pbl9yZXEtPmNja21JRS5sZW5ndGggPSAwOworCQllbHNlIGlmIChlV05JX1NNRV9SRUFTU09DX1JFUSA9PSBtZXNzYWdlVHlwZSkgeworCQkJLyogY2NrbUlFICovCisJCQlpZiAoY3NyX2lzX3Byb2ZpbGVfZXNlKHBQcm9maWxlKSkgeworCQkJCS8qIEluc2VydCB0aGUgQ0NLTSBJRSBpbnRvIHRoZSBqb2luIHJlcXVlc3QgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAorCQkJCWllTGVuID0gcFNlc3Npb24tPnN1cHBDY2ttSWVJbmZvLmNja21JZUxlbjsKKwkJCQljZGZfbWVtX2NvcHkoKHZvaWQgKikod3BhUnNuSUUpLAorCQkJCQkJcFNlc3Npb24tPnN1cHBDY2ttSWVJbmZvLmNja21JZSwKKwkJCQkJCWllTGVuKTsKKyNlbHNlCisJCQkJaWVMZW4gPSBjc3JDb25zdHJ1Y3RFc2VDY2ttSWUocE1hYywKKwkJCQkJCXBTZXNzaW9uLAorCQkJCQkJcFByb2ZpbGUsCisJCQkJCQlwQnNzRGVzY3JpcHRpb24sCisJCQkJCQlwU2Vzc2lvbi0+CisJCQkJCQlwV3BhUnNuUmVxSUUsCisJCQkJCQlwU2Vzc2lvbi0+CisJCQkJCQluV3BhUnNuUmVxSWVMZW5ndGgsCisJCQkJCQkodm9pZCAqKSh3cGFSc25JRSkpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisJCQl9IGVsc2UKKwkJCQlpZUxlbiA9IDA7CisJCQkvKgorCQkJICogSWYgcHJlc2VudCwgY29weSB0aGUgSUUgaW50byB0aGUKKwkJCSAqIGVXTklfU01FX1JFQVNTT0NfUkVRIG1lc3NhZ2UgYnVmZmVyCisJCQkgKi8KKwkJCWlmIChpZUxlbikgeworCQkJCS8qCisJCQkJICogQ29weSB0aGUgQ0NLTSBJRSBvdmVyIGZyb20gdGhlIHRlbXAKKwkJCQkgKiBidWZmZXIgKHdwYVJzbklFKQorCQkJCSAqLworCQkJCWNzcl9qb2luX3JlcS0+Y2NrbUlFLmxlbmd0aCA9IGllTGVuOworCQkJCWNkZl9tZW1fY29weSgmY3NyX2pvaW5fcmVxLT5jY2ttSUUuY2NrbUlFZGF0YSwKKwkJCQkJCXdwYVJzbklFLCBpZUxlbik7CisJCQl9IGVsc2UKKwkJCQljc3Jfam9pbl9yZXEtPmNja21JRS5sZW5ndGggPSAwOworCQl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAqLworCQkvKiBhZGRJRVNjYW4gKi8KKwkJaWYgKHBQcm9maWxlLT5uQWRkSUVTY2FuTGVuZ3RoICYmIHBQcm9maWxlLT5wQWRkSUVTY2FuKSB7CisJCQlpZUxlbiA9IHBQcm9maWxlLT5uQWRkSUVTY2FuTGVuZ3RoOworCQkJaWYgKGllTGVuID4gcFNlc3Npb24tPm5BZGRJRVNjYW5MZW5ndGgpIHsKKwkJCQlpZiAocFNlc3Npb24tPnBBZGRJRVNjYW4KKwkJCQkJJiYgcFNlc3Npb24tPm5BZGRJRVNjYW5MZW5ndGgpIHsKKwkJCQkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5wQWRkSUVTY2FuKTsKKwkJCQl9CisJCQkJcFNlc3Npb24tPnBBZGRJRVNjYW4gPSBjZGZfbWVtX21hbGxvYyhpZUxlbik7CisJCQkJaWYgKE5VTEwgPT0gcFNlc3Npb24tPnBBZGRJRVNjYW4pCisJCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCQllbHNlCisJCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXBTZXNzaW9uLT5uQWRkSUVTY2FuTGVuZ3RoID0gaWVMZW47CisJCQljZGZfbWVtX2NvcHkocFNlc3Npb24tPnBBZGRJRVNjYW4sIHBQcm9maWxlLT5wQWRkSUVTY2FuLAorCQkJCQlpZUxlbik7CisJCQljc3Jfam9pbl9yZXEtPmFkZElFU2Nhbi5sZW5ndGggPSBpZUxlbjsKKwkJCWNkZl9tZW1fY29weSgmY3NyX2pvaW5fcmVxLT5hZGRJRVNjYW4uYWRkSUVkYXRhLAorCQkJCQlwUHJvZmlsZS0+cEFkZElFU2NhbiwgaWVMZW4pOworCQl9IGVsc2UgeworCQkJcFNlc3Npb24tPm5BZGRJRVNjYW5MZW5ndGggPSAwOworCQkJaWYgKHBTZXNzaW9uLT5wQWRkSUVTY2FuKSB7CisJCQkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5wQWRkSUVTY2FuKTsKKwkJCQlwU2Vzc2lvbi0+cEFkZElFU2NhbiA9IE5VTEw7CisJCQl9CisJCQljc3Jfam9pbl9yZXEtPmFkZElFU2Nhbi5sZW5ndGggPSAwOworCQl9CisJCS8qIGFkZElFQXNzb2MgKi8KKwkJaWYgKHBQcm9maWxlLT5uQWRkSUVBc3NvY0xlbmd0aCAmJiBwUHJvZmlsZS0+cEFkZElFQXNzb2MpIHsKKwkJCWllTGVuID0gcFByb2ZpbGUtPm5BZGRJRUFzc29jTGVuZ3RoOworCQkJaWYgKGllTGVuID4gcFNlc3Npb24tPm5BZGRJRUFzc29jTGVuZ3RoKSB7CisJCQkJaWYgKHBTZXNzaW9uLT5wQWRkSUVBc3NvYworCQkJCSAgICAmJiBwU2Vzc2lvbi0+bkFkZElFQXNzb2NMZW5ndGgpIHsKKwkJCQkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5wQWRkSUVBc3NvYyk7CisJCQkJfQorCQkJCXBTZXNzaW9uLT5wQWRkSUVBc3NvYyA9IGNkZl9tZW1fbWFsbG9jKGllTGVuKTsKKwkJCQlpZiAoTlVMTCA9PSBwU2Vzc2lvbi0+cEFkZElFQXNzb2MpCisJCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCQllbHNlCisJCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXBTZXNzaW9uLT5uQWRkSUVBc3NvY0xlbmd0aCA9IGllTGVuOworCQkJY2RmX21lbV9jb3B5KHBTZXNzaW9uLT5wQWRkSUVBc3NvYywKKwkJCQkgICAgIHBQcm9maWxlLT5wQWRkSUVBc3NvYywgaWVMZW4pOworCQkJY3NyX2pvaW5fcmVxLT5hZGRJRUFzc29jLmxlbmd0aCA9IGllTGVuOworCQkJY2RmX21lbV9jb3B5KCZjc3Jfam9pbl9yZXEtPmFkZElFQXNzb2MuYWRkSUVkYXRhLAorCQkJCQkgcFByb2ZpbGUtPnBBZGRJRUFzc29jLCBpZUxlbik7CisJCX0gZWxzZSB7CisJCQlwU2Vzc2lvbi0+bkFkZElFQXNzb2NMZW5ndGggPSAwOworCQkJaWYgKHBTZXNzaW9uLT5wQWRkSUVBc3NvYykgeworCQkJCWNkZl9tZW1fZnJlZShwU2Vzc2lvbi0+cEFkZElFQXNzb2MpOworCQkJCXBTZXNzaW9uLT5wQWRkSUVBc3NvYyA9IE5VTEw7CisJCQl9CisJCQljc3Jfam9pbl9yZXEtPmFkZElFQXNzb2MubGVuZ3RoID0gMDsKKwkJfQorCisJCWlmIChlV05JX1NNRV9SRUFTU09DX1JFUSA9PSBtZXNzYWdlVHlwZSkgeworCQkJLyogVW5tYXNrIGFueSBBQyBpbiByZWFzc29jIHRoYXQgaXMgQUNNLXNldCAqLworCQkJdWFwc2RfbWFzayA9ICh1aW50OF90KSBwUHJvZmlsZS0+dWFwc2RfbWFzazsKKwkJCWlmICh1YXBzZF9tYXNrICYmIChOVUxMICE9IHBCc3NEZXNjcmlwdGlvbikpIHsKKwkJCQlpZiAoQ1NSX0lTX1FPU19CU1MocEllcykKKwkJCQkJCSYmIENTUl9JU19VQVBTRF9CU1MocEllcykpCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCQkJCQlhY21fbWFzayA9CisJCQkJCQlzbWVfcW9zX2dldF9hY21fbWFzayhwTWFjLAorCQkJCQkJCQlwQnNzRGVzY3JpcHRpb24sCisJCQkJCQkJCXBJZXMpOworI2VuZGlmIC8qIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVCAqLworCQkJCWVsc2UKKwkJCQkJdWFwc2RfbWFzayA9IDA7CisJCQl9CisJCX0KKworCQljc3Jfam9pbl9yZXEtPlVDRW5jcnlwdGlvblR5cGUgPQorCQkJCWNzcl90cmFuc2xhdGVfZW5jcnlwdF90eXBlX3RvX2VkX3R5cGUKKwkJCQkJKHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSk7CisKKwkJY3NyX2pvaW5fcmVxLT5NQ0VuY3J5cHRpb25UeXBlID0KKwkJCQljc3JfdHJhbnNsYXRlX2VuY3J5cHRfdHlwZV90b19lZF90eXBlCisJCQkJCShwUHJvZmlsZS0+bmVnb3RpYXRlZE1DRW5jcnlwdGlvblR5cGUpOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJaWYgKHBQcm9maWxlLT5NRlBFbmFibGVkKQorCQkJY3NyX2pvaW5fcmVxLT5NZ210RW5jcnlwdGlvblR5cGUgPSBlU0lSX0VEX0FFU18xMjhfQ01BQzsKKwkJZWxzZQorCQkJY3NyX2pvaW5fcmVxLT5NZ210RW5jcnlwdGlvblR5cGUgPSBlU0lSX0VEX05PTkU7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCWVzZV9jb25maWcgPSAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0VzZUluaUZlYXR1cmVFbmFibGVkOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJcFByb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQgPSBwQnNzRGVzY3JpcHRpb24tPm1kaWVQcmVzZW50OworCQlpZiAoY3NyX2lzX3Byb2ZpbGUxMXIocFByb2ZpbGUpCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQkgICAgJiYKKwkJICAgICEoKHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgPT0KKwkJICAgICAgIGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNKSAmJiAocEllcy0+RVNFVmVyc2lvbi5wcmVzZW50KQorCQkgICAgICAmJiAoZXNlX2NvbmZpZykpCisjZW5kaWYKKwkJCSkKKwkJCWNzcl9qb2luX3JlcS0+aXMxMVJjb25uZWN0aW9uID0gdHJ1ZTsKKwkJZWxzZQorCQkJY3NyX2pvaW5fcmVxLT5pczExUmNvbm5lY3Rpb24gPSBmYWxzZTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJaWYgKHRydWUgPT0gZXNlX2NvbmZpZykKKwkJCWNzcl9qb2luX3JlcS0+aXNFU0VGZWF0dXJlSW5pRW5hYmxlZCA9IHRydWU7CisJCWVsc2UKKwkJCWNzcl9qb2luX3JlcS0+aXNFU0VGZWF0dXJlSW5pRW5hYmxlZCA9IGZhbHNlOworCisJCS8qIEEgcHJvZmlsZSBjYW4gbm90IGJlIGJvdGggRVNFIGFuZCAxMVIuIEJ1dCBhbiA4MDIuMTFSIEFQCisJCSAqIG1heSBiZSBhZHZlcnRpc2luZyBzdXBwb3J0IGZvciBFU0UgYXMgd2VsbC4gU28gaWYgd2UgYXJlCisJCSAqIGFzc29jaWF0aW5nIE9wZW4gb3IgZXhwbGljaXRseSBFU0UgdGhlbiB3ZSB3aWxsIGdldCBFU0UuCisJCSAqIElmIHdlIGFyZSBhc3NvY2lhdGluZyBleHBsaWN0bHkgMTFSIG9ubHkgdGhlbiB3ZSB3aWxsIGdldAorCQkgKiAxMVIuCisJCSAqLworCQlpZiAoKGNzcl9pc19wcm9maWxlX2VzZShwUHJvZmlsZSkgfHwKKwkJCSgocEllcy0+RVNFVmVyc2lvbi5wcmVzZW50KSAmJgorCQkJKHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgPT0KKwkJCQllQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSkpKQorCQkJJiYgKGVzZV9jb25maWcpKQorCQkJY3NyX2pvaW5fcmVxLT5pc0VTRWNvbm5lY3Rpb24gPSB0cnVlOworCQllbHNlCisJCQljc3Jfam9pbl9yZXEtPmlzRVNFY29ubmVjdGlvbiA9IGZhbHNlOworCisJCWlmIChlV05JX1NNRV9KT0lOX1JFUSA9PSBtZXNzYWdlVHlwZSkgeworCQkJdEVTRVRzcGVjSW5mbyBlc2VUc3BlYzsKKwkJCS8qCisJCQkgKiBFU0UtVHNwZWMgSUVzIGluIHRoZSBBU1NPQyByZXF1ZXN0IGlzIHByZXNlbnRseSBub3QKKwkJCSAqIHN1cHBvcnRlZC4gc28gbnVsbGlmeSB0aGUgVFNQRUMgcGFyYW1ldGVycworCQkJICovCisJCQljZGZfbWVtX3NldCgmZXNlVHNwZWMsIHNpemVvZih0RVNFVHNwZWNJbmZvKSwgMCk7CisJCQljZGZfbWVtX2NvcHkoJmNzcl9qb2luX3JlcS0+ZXNlVHNwZWNJbmZvLAorCQkJCQkmZXNlVHNwZWMsIHNpemVvZih0RVNFVHNwZWNJbmZvKSk7CisJCX0gZWxzZSBpZiAoZVdOSV9TTUVfUkVBU1NPQ19SRVEgPT0gbWVzc2FnZVR5cGUpIHsKKwkJCWlmICgoY3NyX2lzX3Byb2ZpbGVfZXNlKHBQcm9maWxlKSB8fAorCQkJCSgocEllcy0+RVNFVmVyc2lvbi5wcmVzZW50KQorCQkJCSYmIChwUHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlID09CisJCQkJCWVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNKSkpICYmCisJCQkJKGVzZV9jb25maWcpKSB7CisJCQkJdEVTRVRzcGVjSW5mbyBlc2VUc3BlYzsKKwkJCQljZGZfbWVtX3NldCgmZXNlVHNwZWMsIHNpemVvZih0RVNFVHNwZWNJbmZvKSwKKwkJCQkJCTApOworCQkJCWVzZVRzcGVjLm51bVRzcGVjcyA9CisJCQkJCXNtZV9xb3NfZXNlX3JldHJpZXZlX3RzcGVjX2luZm8ocE1hYywKKwkJCQkJCXNlc3Npb25JZCwKKwkJCQkJCSh0VHNwZWNJbmZvICopICZlc2VUc3BlYy4KKwkJCQkJCQl0c3BlY1swXSk7CisJCQkJY3NyX2pvaW5fcmVxLT5lc2VUc3BlY0luZm8ubnVtVHNwZWNzID0KKwkJCQkJZXNlVHNwZWMubnVtVHNwZWNzOworCQkJCWlmIChlc2VUc3BlYy5udW1Uc3BlY3MpIHsKKwkJCQkJY2RmX21lbV9jb3B5KCZjc3Jfam9pbl9yZXEtPmVzZVRzcGVjSW5mbworCQkJCQkJLnRzcGVjWzBdLAorCQkJCQkJJmVzZVRzcGVjLnRzcGVjWzBdLAorCQkJCQkJKGVzZVRzcGVjLm51bVRzcGVjcyAqCisJCQkJCQkJc2l6ZW9mKHRUc3BlY0luZm8pKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl0RVNFVHNwZWNJbmZvIGVzZVRzcGVjOworCQkJCS8qKgorCQkJCSAqIEVTRS1Uc3BlYyBJRXMgaW4gdGhlIEFTU09DIHJlcXVlc3QgaXMKKwkJCQkgKiBwcmVzZW50bHkgbm90IHN1cHBvcnRlZC4gc28gbnVsbGlmeSB0aGUgVFNQRUMKKwkJCQkgKiBwYXJhbWV0ZXJzCisJCQkJICovCisJCQkJY2RmX21lbV9zZXQoJmVzZVRzcGVjLCBzaXplb2YodEVTRVRzcGVjSW5mbyksCisJCQkJCQkwKTsKKwkJCQljZGZfbWVtX2NvcHkoJmNzcl9qb2luX3JlcS0+ZXNlVHNwZWNJbmZvLAorCQkJCQkJJmVzZVRzcGVjLAorCQkJCQkJc2l6ZW9mKHRFU0VUc3BlY0luZm8pKTsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSIHx8IGRlZmluZWQgRkVBVFVSRV9XTEFOX0VTRSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJCWlmIChlc2VfY29uZmlnCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCQkgICAgfHwgY3NyX3JvYW1faXNfZmFzdF9yb2FtX2VuYWJsZWQocE1hYywgc2Vzc2lvbklkKQorI2VuZGlmCisJCSAgICApIHsKKwkJCWNzcl9qb2luX3JlcS0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJY3NyX2pvaW5fcmVxLT5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZCA9IGZhbHNlOworCQl9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJCWlmIChjc3Jfcm9hbV9pc19mYXN0X3JvYW1fZW5hYmxlZChwTWFjLCBzZXNzaW9uSWQpKQorCQkJY3NyX2pvaW5fcmVxLT5pc0Zhc3RSb2FtSW5pRmVhdHVyZUVuYWJsZWQgPSB0cnVlOworCQllbHNlCisJCQljc3Jfam9pbl9yZXEtPmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCA9IGZhbHNlOworI2VuZGlmCisKKwkJY3NyX2pvaW5fcmVxLT50eExkcGNJbmlGZWF0dXJlRW5hYmxlZCA9CisJCQkodWludDhfdCkgcE1hYy0+cm9hbS5jb25maWdQYXJhbS50eExkcGNFbmFibGU7CisKKwkJaWYgKChjc3JfaXMxMWhfc3VwcG9ydGVkKHBNYWMpKQorCQkgICAgJiYgKENEU19JU19DSEFOTkVMXzVHSFoocEJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQpKQorCQkgICAgJiYgKHBJZXMtPkNvdW50cnkucHJlc2VudCkKKwkJICAgICYmICghcE1hYy0+cm9hbS5jb25maWdQYXJhbS4KKwkJCWZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eSkpIHsKKwkJCWNzcl9zYXZlX3RvX2NoYW5uZWxfcG93ZXIyX2dfNV9nKHBNYWMsCisJCQkJcEllcy0+Q291bnRyeS5udW1fdHJpcGxldHMgKgorCQkJCXNpemVvZih0U2lyTWFjQ2hhbkluZm8pLAorCQkJCSh0U2lyTWFjQ2hhbkluZm8gKikKKwkJCQkoJnBJZXMtPkNvdW50cnkudHJpcGxldHNbMF0pKTsKKwkJCWNzcl9hcHBseV9wb3dlcjJfY3VycmVudChwTWFjKTsKKwkJfQorCQljZGZfbWVtX2NvcHkoJmNzcl9qb2luX3JlcS0+aHRDb25maWcsCisJCQkJJnBTZXNzaW9uLT5odENvbmZpZywgc2l6ZW9mKHRTaXJIVENvbmZpZykpOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJCWNzcl9qb2luX3JlcS0+dHhCRkluaUZlYXR1cmVFbmFibGVkID0KKwkJCQkodWludDhfdCkgcE1hYy0+cm9hbS5jb25maWdQYXJhbS50eEJGRW5hYmxlOworCisJCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnR4QkZFbmFibGUpIHsKKwkJCXR4QkZDc25WYWx1ZSA9CisJCQkJKHVpbnQ4X3QpcE1hYy0+cm9hbS5jb25maWdQYXJhbS50eEJGQ3NuVmFsdWU7CisJCQlpZiAoSVNfQlNTX1ZIVF9DQVBBQkxFKHBJZXMtPlZIVENhcHMpICYmCisJCQkJCXBJZXMtPlZIVENhcHMubnVtU291bmRpbmdEaW0pCisJCQkJdHhCRkNzblZhbHVlID0gQ0RGX01JTih0eEJGQ3NuVmFsdWUsCisJCQkJCQlwSWVzLT5WSFRDYXBzLm51bVNvdW5kaW5nRGltKTsKKwkJCWVsc2UgaWYgKElTX0JTU19WSFRfQ0FQQUJMRShwSWVzLT52ZW5kb3IyX2llLlZIVENhcHMpCisJCQkJJiYgcEllcy0+dmVuZG9yMl9pZS5WSFRDYXBzLm51bVNvdW5kaW5nRGltKQorCQkJCXR4QkZDc25WYWx1ZSA9IENERl9NSU4odHhCRkNzblZhbHVlLAorCQkJCQlwSWVzLT52ZW5kb3IyX2llLlZIVENhcHMubnVtU291bmRpbmdEaW0pOworCQl9CisJCWNzcl9qb2luX3JlcS0+dHhCRkNzblZhbHVlID0gdHhCRkNzblZhbHVlOworCisJCWNzcl9qb2luX3JlcS0+dHhNdUJmb3JtZWUgPQorCQkJKHVpbnQ4X3QpIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udHhNdUJmb3JtZWU7CisKKwkJY3NyX2pvaW5fcmVxLT5lbmFibGVWaHRwQWlkID0KKwkJCSh1aW50OF90KSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVuYWJsZVZodHBBaWQ7CisKKwkJY3NyX2pvaW5fcmVxLT5lbmFibGVWaHRHaWQgPQorCQkJKHVpbnQ4X3QpIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZW5hYmxlVmh0R2lkOworCisjZW5kaWYKKwkJY3NyX2pvaW5fcmVxLT5lbmFibGVBbXBkdVBzID0KKwkJCSh1aW50OF90KSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVuYWJsZUFtcGR1UHM7CisKKwkJY3NyX2pvaW5fcmVxLT5lbmFibGVIdFNtcHMgPQorCQkJKHVpbnQ4X3QpIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZW5hYmxlSHRTbXBzOworCisJCWNzcl9qb2luX3JlcS0+aHRTbXBzID0gKHVpbnQ4X3QpIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaHRTbXBzOworCisJCWNzcl9qb2luX3JlcS0+aXNBbXNkdVN1cHBvcnRJbkFNUERVID0KKwkJCSh1aW50OF90KSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzQW1zZHVTdXBwb3J0SW5BTVBEVTsKKworCQlpZiAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmZXTU1Db25uZWN0aW9uKQorCQkJY3NyX2pvaW5fcmVxLT5pc1dNRWVuYWJsZWQgPSB0cnVlOworCQllbHNlCisJCQljc3Jfam9pbl9yZXEtPmlzV01FZW5hYmxlZCA9IGZhbHNlOworCisJCWlmIChwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uZlFPU0Nvbm5lY3Rpb24pCisJCQljc3Jfam9pbl9yZXEtPmlzUW9zRW5hYmxlZCA9IHRydWU7CisJCWVsc2UKKwkJCWNzcl9qb2luX3JlcS0+aXNRb3NFbmFibGVkID0gZmFsc2U7CisKKwkJaWYgKHBQcm9maWxlLT5iT1NFTkFzc29jaWF0aW9uKQorCQkJY3NyX2pvaW5fcmVxLT5pc09TRU5Db25uZWN0aW9uID0gdHJ1ZTsKKwkJZWxzZQorCQkJY3NyX2pvaW5fcmVxLT5pc09TRU5Db25uZWN0aW9uID0gZmFsc2U7CisKKwkJcEFQX2NhcGFiaWxpdHlJbmZvID0KKwkJCSh0U2lyTWFjQ2FwYWJpbGl0eUluZm8gKikKKwkJCQkmcEJzc0Rlc2NyaXB0aW9uLT5jYXBhYmlsaXR5SW5mbzsKKwkJLyoKKwkJICogdGVsbCB0aGUgdGFyZ2V0IEFQIG15IDExSCBjYXBhYmlsaXR5IG9ubHkgaWYgYm90aCBBUCBhbmQgU1RBCisJCSAqIHN1cHBvcnQKKwkJICogMTFIIGFuZCB0aGUgY2hhbm5lbCBiZWluZyB1c2VkIGlzIDExYQorCQkgKi8KKwkJaWYgKGNzcl9pczExaF9zdXBwb3J0ZWQocE1hYykgJiYgcEFQX2NhcGFiaWxpdHlJbmZvLT5zcGVjdHJ1bU1ndAorCQkJJiYgZVNJUl8xMUFfTldfVFlQRSA9PSBwQnNzRGVzY3JpcHRpb24tPm53VHlwZSkgeworCQkJZlRtcCA9ICh0QW5pQm9vbCkgMTsKKwkJfSBlbHNlCisJCQlmVG1wID0gKHRBbmlCb29sKSAwOworCisJCWNzcl9qb2luX3JlcS0+c3BlY3RydW1NZ3RJbmRpY2F0b3IgPSBmVG1wOworCQljc3Jfam9pbl9yZXEtPnBvd2VyQ2FwLm1pblR4UG93ZXIgPSBNSU5fVFhfUFdSX0NBUDsKKwkJLyoKKwkJICogVGhpcyBpcyByZXF1aXJlZCBmb3IgMTFrIHRlc3QgVm9XaUZpIEVudDogVGVzdCAyLgorCQkgKiBXZSBuZWVkIHRoZSBwb3dlciBjYXBhYmlsaXRpZXMgZm9yIEFzc29jIFJlcS4KKwkJICogVGhpcyBtYWNybyBpcyBwcm92aWRlZCBieSB0aGUgaGFsUGh5Q2ZnLmguIFdlIHBpY2sgb3VyCisJCSAqIG1heCBhbmQgbWluIGNhcGFiaWxpdHkgYnkgdGhlIGhhbFBoeSBwcm92aWRlZCBtYWNyb3MKKwkJICovCisJCXB3ckxpbWl0ID0gY3NyX2dldF9jZmdfbWF4X3R4X3Bvd2VyKHBNYWMsCisJCQkJCXBCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbElkKTsKKwkJaWYgKDAgIT0gcHdyTGltaXQpCisJCQljc3Jfam9pbl9yZXEtPnBvd2VyQ2FwLm1heFR4UG93ZXIgPSBwd3JMaW1pdDsKKwkJZWxzZQorCQkJY3NyX2pvaW5fcmVxLT5wb3dlckNhcC5tYXhUeFBvd2VyID0gTUFYX1RYX1BXUl9DQVA7CisKKwkJY3NyX2FkZF9zdXBwb3J0ZWRfNUdoel9jaGFubmVscyhwTWFjLCBjc3Jfam9pbl9yZXEpOworCisJCWNzcl9qb2luX3JlcS0+dWFwc2RQZXJBY0JpdG1hc2sgPSAodWludDhfdClwUHJvZmlsZS0+dWFwc2RfbWFzazsKKwkJLyogTW92ZSB0aGUgZW50aXJlIEJzc0Rlc2NyaXB0aW9uIGludG8gdGhlIGpvaW4gcmVxdWVzdC4gKi8KKwkJY2RmX21lbV9jb3B5KCZjc3Jfam9pbl9yZXEtPmJzc0Rlc2NyaXB0aW9uLCBwQnNzRGVzY3JpcHRpb24sCisJCQkJcEJzc0Rlc2NyaXB0aW9uLT5sZW5ndGggKworCQkJCXNpemVvZihwQnNzRGVzY3JpcHRpb24tPmxlbmd0aCkpOworCisJCS8qCisJCSAqIGNvbmNfY3VzdG9tX3J1bGUxOgorCQkgKiBJZiBTQVAgY29tZXMgdXAgZmlyc3QgYW5kIFNUQSBjb21lcyB1cCBsYXRlciB0aGVuIFNBUAorCQkgKiBuZWVkIHRvIGZvbGxvdyBTVEEncyBjaGFubmVsIGluIDIuNEdoei4gSW4gZm9sbG93aW5nIGlmCisJCSAqIGNvbmRpdGlvbiB3ZSBhcmUgYWRkaW5nIHNhbml0eSBjaGVjaywganVzdCB0byBtYWtlIHN1cmUgdGhhdAorCQkgKiBpZiB0aGlzIHJ1bGUgaXMgZW5hYmxlZCB0aGVuIGRvbid0IGFsbG93IFNUQSB0byBjb25uZWN0IG9uCisJCSAqIDVneiBjaGFubmVsIGFuZCBhbHNvIGJ5IHRoaXMgdGltZSBTQVAncyBjaGFubmVsIHNob3VsZCBiZSB0aGUKKwkJICogc2FtZSBhcyBTVEEncyBjaGFubmVsLgorCQkgKi8KKwkJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY29uY19jdXN0b21fcnVsZTEpIHsKKwkJCWlmICgoMCA9PQorCQkJICAgICBwTWFjLT4KKwkJCSAgICAgIHJvYW0uY29uZmlnUGFyYW0uaXNfc3RhX2Nvbm5lY3Rpb25faW5fNWd6X2VuYWJsZWQpCisJCQkgICAgICYmIENEU19JU19DSEFOTkVMXzVHSFoocEJzc0Rlc2NyaXB0aW9uLT4KKwkJCQkJCQljaGFubmVsSWQpKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTCgiU1RBLWNvbm4gb24gNUcgaXNuJ3QgYWxsb3dlZCIpKTsKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghQ0RTX0lTX0NIQU5ORUxfNUdIWihwQnNzRGVzY3JpcHRpb24tPmNoYW5uZWxJZCkgJiYKKwkJCQkoZmFsc2UgPT0gY3NyX2lzX2Nvbm5fYWxsb3dfMmdfYmFuZChwTWFjLAorCQkJCQkJcEJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQpKSkgeworCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogY29uY19jdXN0b21fcnVsZTI6CisJCSAqIElmIFAyUEdPIGNvbWVzIHVwIGZpcnN0IGFuZCBTVEEgY29tZXMgdXAgbGF0ZXIgdGhlbiBQMlBHTworCQkgKiBuZWVkIHRvIGZvbGxvdyBTVEEncyBjaGFubmVsIGluIDVHaHouIEluIGZvbGxvd2luZyBpZgorCQkgKiBjb25kaXRpb24gd2UgYXJlIGp1c3QgYWRkaW5nIHNhbml0eSBjaGVjayB0byBtYWtlIHN1cmUgdGhhdAorCQkgKiBieSB0aGlzIHRpbWUgUDJQR08ncyBjaGFubmVsIGlzIHNhbWUgYXMgU1RBJ3MgY2hhbm5lbC4KKwkJICovCisJCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNvbmNfY3VzdG9tX3J1bGUyKSB7CisJCQlpZiAoIUNEU19JU19DSEFOTkVMXzI0R0haKHBCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbElkKSAmJgorCQkJCShmYWxzZSA9PSBjc3JfaXNfY29ubl9hbGxvd181Z19iYW5kKHBNYWMsCisJCQkJcEJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQpKSkgeworCQkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMoY3NyX2pvaW5fcmVxKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJLyoKKwkJCSAqIGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjIHdvdWxkJ3ZlIHJlbGVhc2VkIHRoZSBtZW0KKwkJCSAqIGFsbG9jYXRlZCBieSBjc3Jfam9pbl9yZXEuIExldCdzIG1ha2UgaXQgZGVmZW5zaXZlIGJ5CisJCQkgKiBhc3NpZ25pbmcgTlVMTCB0byB0aGUgcG9pbnRlci4KKwkJCSAqLworCQkJY3NyX2pvaW5fcmVxID0gTlVMTDsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKwkJCWlmIChlV05JX1NNRV9KT0lOX1JFUSA9PSBtZXNzYWdlVHlwZSkgeworCQkJCS8qIE5vdGlmeSBRb1MgbW9kdWxlIHRoYXQgam9pbiBoYXBwZW5pbmcgKi8KKwkJCQlwU2Vzc2lvbi0+am9pbl9ic3NpZF9jb3VudCsrOworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJCUNERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkJCSJCU1NJRCBDb3VudCA9ICVkIiwKKwkJCQkJCXBTZXNzaW9uLT5qb2luX2Jzc2lkX2NvdW50KTsKKwkJCQlzbWVfcW9zX2Nzcl9ldmVudF9pbmQocE1hYywgKHVpbnQ4X3QpIHNlc3Npb25JZCwKKwkJCQkJCVNNRV9RT1NfQ1NSX0pPSU5fUkVRLCBOVUxMKTsKKwkJCX0gZWxzZSBpZiAoZVdOSV9TTUVfUkVBU1NPQ19SRVEgPT0gbWVzc2FnZVR5cGUpIHsKKwkJCQkvKiBOb3RpZnkgUW9TIG1vZHVsZSB0aGF0IHJlYXNzb2MgaGFwcGVuaW5nICovCisJCQkJc21lX3Fvc19jc3JfZXZlbnRfaW5kKHBNYWMsICh1aW50OF90KSBzZXNzaW9uSWQsCisJCQkJCQlTTUVfUU9TX0NTUl9SRUFTU09DX1JFUSwKKwkJCQkJCU5VTEwpOworCQkJfQorI2VuZGlmCisJCX0KKwl9IHdoaWxlICgwKTsKKworCS8qIENsZWFuIHVwIHRoZSBtZW1vcnkgaW4gY2FzZSBvZiBhbnkgZmFpbHVyZSAqLworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgJiYgKE5VTEwgIT0gY3NyX2pvaW5fcmVxKSkKKwkJY2RmX21lbV9mcmVlKGNzcl9qb2luX3JlcSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAqLworQ0RGX1NUQVRVUyBjc3Jfc2VuZF9tYl9kaXNhc3NvY19yZXFfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJdFNpck1hY0FkZHIgYnNzSWQsIHVpbnQxNl90IHJlYXNvbkNvZGUpCit7CisJdFNpclNtZURpc2Fzc29jUmVxICpwTXNnOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU21lRGlzYXNzb2NSZXEpKTsKKwlpZiAoTlVMTCA9PSBwTXNnKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCisJY2RmX21lbV9zZXQocE1zZywgc2l6ZW9mKHRTaXJTbWVEaXNhc3NvY1JlcSksIDApOworCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfRElTQVNTT0NfUkVROworCXBNc2ctPmxlbmd0aCA9IHNpemVvZih0U2lyU21lRGlzYXNzb2NSZXEpOworCXBNc2ctPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwlwTXNnLT50cmFuc2FjdGlvbklkID0gMDsKKwlpZiAoKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUgIT0gTlVMTCkKKwkJJiYgKChDU1JfSVNfSU5GUkFfQVAocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkpCisJCXx8IChDU1JfSVNfV0RTX0FQKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpKSkpIHsKKwkJY2RmX21lbV9jb3B5KCZwTXNnLT5ic3NJZCwKKwkJCSAgICAgJnBTZXNzaW9uLT5zZWxmTWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCWNkZl9tZW1fY29weSgmcE1zZy0+cGVlck1hY0FkZHIsCisJCQkgICAgIGJzc0lkLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwl9IGVsc2UgeworCQljZGZfbWVtX2NvcHkoJnBNc2ctPmJzc0lkLAorCQkJICAgICBic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCWNkZl9tZW1fY29weSgmcE1zZy0+cGVlck1hY0FkZHIsCisJCQkgICAgIGJzc0lkLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwl9CisJcE1zZy0+cmVhc29uQ29kZSA9IHJlYXNvbkNvZGU7CisJLyoKKwkgKiBUaGUgc3RhdGUgd2lsbCBiZSBESVNBU1NPQ19IQU5ET0ZGIG9ubHkgd2hlbiB3ZSBhcmUgZG9pbmcKKwkgKiBoYW5kb2ZmLiBIZXJlIHdlIHNob3VsZCBub3Qgc2VuZCB0aGUgZGlzYXNzb2Mgb3ZlciB0aGUgYWlyCisJICogdG8gdGhlIEFQCisJICovCisJaWYgKENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hPKHBNYWMsIHNlc3Npb25JZCkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCSAgICAmJiBjc3Jfcm9hbV9pczExcl9hc3NvYyhwTWFjLCBzZXNzaW9uSWQpCisjZW5kaWYKKwkgICAgKSB7CisJCS8qIFNldCBEb05vdFNlbmRPdmVyVGhlQWlyIGZsYWcgdG8gMSBvbmx5IGZvciBoYW5kb2ZmIGNhc2UgKi8KKwkJcE1zZy0+ZG9Ob3RTZW5kT3ZlclRoZUFpciA9IENTUl9ET05UX1NFTkRfRElTQVNTT0NfT1ZFUl9USEVfQUlSOworCX0KKwlyZXR1cm4gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NlbmRfbWJfdGtpcF9jb3VudGVyX21lYXN1cmVzX3JlcV9tc2codHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgICAgdWludDMyX3Qgc2Vzc2lvbklkLCBib29sIGJFbmFibGUsCisJCQkJCQkgICAgIHRTaXJNYWNBZGRyIGJzc0lkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTaXJTbWVUa2lwQ250ck1lYXNSZXEgKnBNc2c7CisJZG8geworCQlwTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVUa2lwQ250ck1lYXNSZXEpKTsKKwkJaWYgKE5VTEwgPT0gcE1zZykKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZWxzZQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJYnJlYWs7CisJCWNkZl9tZW1fc2V0KHBNc2csIHNpemVvZih0U2lyU21lVGtpcENudHJNZWFzUmVxKSwgMCk7CisJCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfVEtJUF9DTlRSX01FQVNfUkVROworCQlwTXNnLT5sZW5ndGggPSBzaXplb2YodFNpclNtZVRraXBDbnRyTWVhc1JlcSk7CisJCXBNc2ctPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJcE1zZy0+dHJhbnNhY3Rpb25JZCA9IDA7CisJCWNkZl9tZW1fY29weShwTXNnLT5ic3NJZCwgYnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwTXNnLT5iRW5hYmxlID0gYkVuYWJsZTsKKwkJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUworY3NyX3NlbmRfbWJfZ2V0X2Fzc29jaWF0ZWRfc3Rhc19yZXFfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJQ0RGX01PRFVMRV9JRCBtb2RJZCwgdFNpck1hY0FkZHIgYnNzSWQsCisJCQkJCXZvaWQgKnBVc3JDb250ZXh0LCB2b2lkICpwZm5TYXBFdmVudENhbGxiYWNrLAorCQkJCQl1aW50OF90ICpwQXNzb2NTdGFzQnVmKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTaXJTbWVHZXRBc3NvY1NUQXNSZXEgKnBNc2c7CisJZG8geworCQlwTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVHZXRBc3NvY1NUQXNSZXEpKTsKKwkJaWYgKE5VTEwgPT0gcE1zZykKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZWxzZQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJYnJlYWs7CisJCWNkZl9tZW1fc2V0KHBNc2csIHNpemVvZih0U2lyU21lR2V0QXNzb2NTVEFzUmVxKSwgMCk7CisJCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfR0VUX0FTU09DX1NUQVNfUkVROworCQljZGZfbWVtX2NvcHkocE1zZy0+YnNzSWQsIGJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcE1zZy0+bW9kSWQgPSBtb2RJZDsKKwkJY2RmX21lbV9jb3B5KHBNc2ctPnBVc3JDb250ZXh0LAorCQkJCXBVc3JDb250ZXh0LCBzaXplb2Yodm9pZCAqKSk7CisJCWNkZl9tZW1fY29weShwTXNnLT5wU2FwRXZlbnRDYWxsYmFjaywKKwkJCQlwZm5TYXBFdmVudENhbGxiYWNrLCBzaXplb2Yodm9pZCAqKSk7CisJCWNkZl9tZW1fY29weShwTXNnLT5wQXNzb2NTdGFzQXJyYXksCisJCQkJcEFzc29jU3Rhc0J1Ziwgc2l6ZW9mKHZvaWQgKikpOworCQlwTXNnLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHNTaXJTbWVHZXRBc3NvY1NUQXNSZXEpOworCQlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTCitjc3Jfc2VuZF9tYl9nZXRfd3BzcGJjX3Nlc3Npb25zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQl0U2lyTWFjQWRkciBic3NJZCwgdm9pZCAqcFVzckNvbnRleHQsCisJCQkJdm9pZCAqcGZuU2FwRXZlbnRDYWxsYmFjaywKKwkJCQlzdHJ1Y3QgY2RmX21hY19hZGRyIHBSZW1vdmVNYWMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNpclNtZUdldFdQU1BCQ1Nlc3Npb25zUmVxICpwTXNnOworCisJZG8geworCQlwTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcSkpOworCQlpZiAoTlVMTCA9PSBwTXNnKQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQllbHNlCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQlicmVhazsKKwkJY2RmX21lbV9zZXQocE1zZywgc2l6ZW9mKHRTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcSksIDApOworCQlwTXNnLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0dFVF9XUFNQQkNfU0VTU0lPTl9SRVE7CisJCWNkZl9tZW1fY29weShwTXNnLT5wVXNyQ29udGV4dCwgcFVzckNvbnRleHQsIHNpemVvZih2b2lkICopKTsKKwkJY2RmX21lbV9jb3B5KHBNc2ctPnBTYXBFdmVudENhbGxiYWNrLCBwZm5TYXBFdmVudENhbGxiYWNrLAorCQkJICAgICBzaXplb2Yodm9pZCAqKSk7CisJCWNkZl9tZW1fY29weShwTXNnLT5ic3NJZCwgYnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQljZGZfbWVtX2NvcHkocE1zZy0+cFJlbW92ZU1hYywgcFJlbW92ZU1hYy5ieXRlcywKKwkJCSAgICAgQ0RGX01BQ19BRERSX1NJWkUpOworCQlwTXNnLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHNTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcSk7CisJCXN0YXR1cyA9IGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKHBNc2cpOworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NlbmRfY2huZ19tY2NfYmVhY29uX2ludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwl0cFNpckNoYW5nZUJJUGFyYW1zIHBNc2c7CisJdWludDE2X3QgbGVuID0gMDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyogTk8gbmVlZCB0byB1cGRhdGUgdGhlIEJlYWNvbiBQYXJhbXMgaWYgdXBkYXRlIGJlYWNvbiBwYXJhbWV0ZXIgZmxhZyBpcyBub3Qgc2V0ICovCisJaWYgKCFwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uYnNzUGFyYW1zLnVwZGF0ZWJlYWNvbkludGVydmFsKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmJzc1BhcmFtcy51cGRhdGViZWFjb25JbnRlcnZhbCA9CisJCWZhbHNlOworCisJLyogQ3JlYXRlIHRoZSBtZXNzYWdlIGFuZCBzZW5kIHRvIGxpbSAqLworCWxlbiA9IHNpemVvZih0U2lyQ2hhbmdlQklQYXJhbXMpOworCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCWlmIChOVUxMID09IHBNc2cpCisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwllbHNlCisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJY2RmX21lbV9zZXQocE1zZywgc2l6ZW9mKHRTaXJDaGFuZ2VCSVBhcmFtcyksIDApOworCQlwTXNnLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0NITkdfTUNDX0JFQUNPTl9JTlRFUlZBTDsKKwkJcE1zZy0+bGVuZ3RoID0gbGVuOworCisJCS8qIGJzc0lkICovCisJCWNkZl9tZW1fY29weSgodFNpck1hY0FkZHIgKikgcE1zZy0+YnNzSWQsCisJCQkgICAgICZwU2Vzc2lvbi0+c2VsZk1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQlGTCgiQ1NSIEF0dGVtcHRpbmcgdG8gY2hhbmdlIEJJIGZvciBCc3NpZD0gIgorCQkJICAgTUFDX0FERFJFU1NfU1RSKSwgTUFDX0FERFJfQVJSQVkocE1zZy0+YnNzSWQpKTsKKwkJcE1zZy0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCIgIHNlc3Npb24gJWQgQmVhY29uSW50ZXJ2YWwgJWQiKSwKKwkJCXNlc3Npb25JZCwKKwkJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5ic3NQYXJhbXMuCisJCQliZWFjb25JbnRlcnZhbCk7CisJCXBNc2ctPmJlYWNvbkludGVydmFsID0KKwkJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5ic3NQYXJhbXMuYmVhY29uSW50ZXJ2YWw7CisJCXN0YXR1cyA9IGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKHBNc2cpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgUUNBX0hUXzIwNDBfQ09FWAorQ0RGX1NUQVRVUyBjc3Jfc2V0X2h0MjA0MF9tb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCSAgICAgICBlUGh5Q2hhbkJvbmRTdGF0ZSBjYk1vZGUsIGJvb2wgb2Jzc0VuYWJsZWQpCit7CisJdHBTaXJTZXRIVDIwNDBNb2RlIHBNc2c7CisJdWludDE2X3QgbGVuID0gMDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIG1lc3NhZ2UgYW5kIHNlbmQgdG8gbGltICovCisJbGVuID0gc2l6ZW9mKHRTaXJTZXRIVDIwNDBNb2RlKTsKKwlwTXNnID0gY2RmX21lbV9tYWxsb2MobGVuKTsKKwlpZiAoTlVMTCA9PSBwTXNnKQorCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJZWxzZQorCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWNkZl9tZW1fc2V0KHBNc2csIHNpemVvZih0U2lyU2V0SFQyMDQwTW9kZSksIDApOworCQlwTXNnLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1NFVF9IVF8yMDQwX01PREU7CisJCXBNc2ctPmxlbmd0aCA9IGxlbjsKKworCQkvKiBic3NJZCAqLworCQljZGZfbWVtX2NvcHkoKHRTaXJNYWNBZGRyICopIHBNc2ctPmJzc0lkLAorCQkJICAgICAmcFNlc3Npb24tPnNlbGZNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIkNTUiBBdHRlbXB0aW5nIHRvIHNldCBIVDIwLzQwIG1vZGUgZm9yIEJzc2lkPSAiCisJCQkgICBNQUNfQUREUkVTU19TVFIpLCBNQUNfQUREUl9BUlJBWShwTXNnLT5ic3NJZCkpOworCQlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIiAgc2Vzc2lvbiAlZCBIVDIwLzQwIG1vZGUgJWQiKSwKKwkJCXNlc3Npb25JZCwgY2JNb2RlKTsKKwkJcE1zZy0+Y2JNb2RlID0gY2JNb2RlOworCQlwTXNnLT5vYnNzRW5hYmxlZCA9IG9ic3NFbmFibGVkOworCQlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCitDREZfU1RBVFVTIGNzcl9zZW5kX21iX2RlYXV0aF9yZXFfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgICB0U2lyTWFjQWRkciBic3NJZCwgdWludDE2X3QgcmVhc29uQ29kZSkKK3sKKwl0U2lyU21lRGVhdXRoUmVxICpwTXNnOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU21lRGVhdXRoUmVxKSk7CisJaWYgKE5VTEwgPT0gcE1zZykKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKworCWNkZl9tZW1fc2V0KHBNc2csIHNpemVvZih0U2lyU21lRGVhdXRoUmVxKSwgMCk7CisJcE1zZy0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9ERUFVVEhfUkVROworCXBNc2ctPmxlbmd0aCA9IHNpemVvZih0U2lyU21lRGVhdXRoUmVxKTsKKwlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJcE1zZy0+dHJhbnNhY3Rpb25JZCA9IDA7CisKKwlpZiAoKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUgIT0gTlVMTCkKKwkgICAgICYmICgoQ1NSX0lTX0lORlJBX0FQKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpKQorCSAgICAgfHwgKENTUl9JU19XRFNfQVAocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkpKSkgeworCQljZGZfbWVtX2NvcHkoJnBNc2ctPmJzc0lkLAorCQkJICAgICAmcFNlc3Npb24tPnNlbGZNYWNBZGRyLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwl9IGVsc2UgeworCQljZGZfbWVtX2NvcHkoJnBNc2ctPmJzc0lkLAorCQkJICAgICBic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJfQorCisJLyogU2V0IHRoZSBwZWVyIE1BQyBhZGRyZXNzIGJlZm9yZSBzZW5kaW5nIHRoZSBtZXNzYWdlIHRvIExJTSAqLworCWNkZl9tZW1fY29weSgmcE1zZy0+cGVlck1hY0FkZHIsCisJCSAgICAgYnNzSWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJcE1zZy0+cmVhc29uQ29kZSA9IHJlYXNvbkNvZGU7CisKKwlyZXR1cm4gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NlbmRfbWJfZGlzYXNzb2NfY25mX21zZyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl0cFNpclNtZURpc2Fzc29jSW5kIHBEaXNhc3NvY0luZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U2lyU21lRGlzYXNzb2NDbmYgKnBNc2c7CisJZG8geworCQlwTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVEaXNhc3NvY0NuZikpOworCQlpZiAoTlVMTCA9PSBwTXNnKQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQllbHNlCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQlicmVhazsKKwkJY2RmX21lbV9zZXQocE1zZywgc2l6ZW9mKHRTaXJTbWVEaXNhc3NvY0NuZiksIDApOworCQlwTXNnLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0RJU0FTU09DX0NORjsKKwkJcE1zZy0+c3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJCXBNc2ctPmxlbmd0aCA9IHNpemVvZih0U2lyU21lRGlzYXNzb2NDbmYpOworCQljZGZfbWVtX2NvcHkocE1zZy0+cGVlck1hY0FkZHIsIHBEaXNhc3NvY0luZC0+cGVlck1hY0FkZHIsCisJCQkgICAgIHNpemVvZihwTXNnLT5wZWVyTWFjQWRkcikpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWNkZl9tZW1fZnJlZShwTXNnKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2RmX21lbV9jb3B5KHBNc2ctPmJzc0lkLCBwRGlzYXNzb2NJbmQtPmJzc0lkLAorCQkJICAgICBzaXplb2YocE1zZy0+cGVlck1hY0FkZHIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQljZGZfbWVtX2ZyZWUocE1zZyk7CisJCQlicmVhazsKKwkJfQorCisJCXN0YXR1cyA9IGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKHBNc2cpOworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NlbmRfbWJfZGVhdXRoX2NuZl9tc2codHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICB0cFNpclNtZURlYXV0aEluZCBwRGVhdXRoSW5kKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTaXJTbWVEZWF1dGhDbmYgKnBNc2c7CisJZG8geworCQlwTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVEZWF1dGhDbmYpKTsKKwkJaWYgKE5VTEwgPT0gcE1zZykKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZWxzZQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJYnJlYWs7CisJCWNkZl9tZW1fc2V0KHBNc2csIHNpemVvZih0U2lyU21lRGVhdXRoQ25mKSwgMCk7CisJCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfREVBVVRIX0NORjsKKwkJcE1zZy0+c3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJCXBNc2ctPmxlbmd0aCA9IHNpemVvZih0U2lyU21lRGVhdXRoQ25mKTsKKwkJY2RmX21lbV9jb3B5KHBNc2ctPmJzc0lkLCBwRGVhdXRoSW5kLT5ic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHBNc2ctPmJzc0lkKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJY2RmX21lbV9mcmVlKHBNc2cpOworCQkJYnJlYWs7CisJCX0KKwkJY2RmX21lbV9jb3B5KHBNc2ctPnBlZXJNYWNBZGRyLCBwRGVhdXRoSW5kLT5wZWVyTWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHBNc2ctPnBlZXJNYWNBZGRyKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJY2RmX21lbV9mcmVlKHBNc2cpOworCQkJYnJlYWs7CisJCX0KKwkJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2VuZF9hc3NvY19jbmZfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyU21lQXNzb2NJbmQgcEFzc29jSW5kLAorCQkJCSAgQ0RGX1NUQVRVUyBIYWxzdGF0dXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNpclNtZUFzc29jQ25mICpwTXNnOworCisJc21zX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgiUG9zdGluZyBlV05JX1NNRV9BU1NPQ19DTkYgdG8gTElNLkhhbFN0YXR1cyA6JWQiKSwKKwkJSGFsc3RhdHVzKTsKKwlkbyB7CisJCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclNtZUFzc29jQ25mKSk7CisJCWlmIChOVUxMID09IHBNc2cpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQljZGZfbWVtX3NldChwTXNnLCBzaXplb2YodFNpclNtZUFzc29jQ25mKSwgMCk7CisJCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfQVNTT0NfQ05GOworCQlwTXNnLT5sZW5ndGggPSBzaXplb2YodFNpclNtZUFzc29jQ25mKTsKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhIYWxzdGF0dXMpKQorCQkJcE1zZy0+c3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJCWVsc2UKKwkJCXBNc2ctPnN0YXR1c0NvZGUgPSBlU0lSX1NNRV9BU1NPQ19SRUZVU0VEOworCQkvKiBic3NJZCAqLworCQljZGZfbWVtX2NvcHkocE1zZy0+YnNzSWQsIHBBc3NvY0luZC0+YnNzSWQsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkvKiBwZWVyTWFjQWRkciAqLworCQljZGZfbWVtX2NvcHkocE1zZy0+cGVlck1hY0FkZHIsIHBBc3NvY0luZC0+cGVlck1hY0FkZHIsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkvKiBhaWQgKi8KKwkJcE1zZy0+YWlkID0gcEFzc29jSW5kLT5haWQ7CisJCS8qIGFsdGVybmF0ZUJzc0lkICovCisJCWNkZl9tZW1fY29weShwTXNnLT5hbHRlcm5hdGVCc3NJZCwgcEFzc29jSW5kLT5ic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCS8qIGFsdGVybmF0ZUNoYW5uZWxJZCAqLworCQlwTXNnLT5hbHRlcm5hdGVDaGFubmVsSWQgPSAxMTsKKwkJLyogcE1zZyBpcyBmcmVlZCBieSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyBpbiBhbnljYXNlKi8KKwkJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2VuZF9hc3NvY19pbmRfdG9fdXBwZXJfbGF5ZXJfY25mX21zZyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgICB0cFNpclNtZUFzc29jSW5kIHBBc3NvY0luZCwKKwkJCQkJCSAgICAgQ0RGX1NUQVRVUyBIYWxzdGF0dXMsCisJCQkJCQkgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRTaXJNc2dRIG1zZ1E7CisJdFNpclNtZUFzc29jSW5kVG9VcHBlckxheWVyQ25mICpwTXNnOworCXVpbnQ4X3QgKnBCdWY7CisJdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisJdWludDE2X3Qgd1RtcDsKKwlkbyB7CisJCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclNtZUFzc29jSW5kVG9VcHBlckxheWVyQ25mKSk7CisJCWlmIChOVUxMID09IHBNc2cpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQljZGZfbWVtX3NldChwTXNnLCBzaXplb2YodFNpclNtZUFzc29jSW5kVG9VcHBlckxheWVyQ25mKSwgMCk7CisKKwkJcE1zZy0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9VUFBFUl9MQVlFUl9BU1NPQ19DTkY7CisJCXBNc2ctPmxlbmd0aCA9IHNpemVvZih0U2lyU21lQXNzb2NJbmRUb1VwcGVyTGF5ZXJDbmYpOworCisJCXBNc2ctPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworCQlwQnVmID0gKHVpbnQ4X3QgKikgJnBNc2ctPnN0YXR1c0NvZGU7CisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoSGFsc3RhdHVzKSkKKwkJCXN0YXR1c0NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCQllbHNlCisJCQlzdGF0dXNDb2RlID0gZVNJUl9TTUVfQVNTT0NfUkVGVVNFRDsKKwkJY2RmX21lbV9jb3B5KHBCdWYsICZzdGF0dXNDb2RlLCBzaXplb2YodFNpclJlc3VsdENvZGVzKSk7CisJCXBCdWYgKz0gc2l6ZW9mKHRTaXJSZXN1bHRDb2Rlcyk7CisJCS8qIGJzc0lkICovCisJCWNkZl9tZW1fY29weSgodFNpck1hY0FkZHIgKikgcEJ1ZiwgcEFzc29jSW5kLT5ic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCXBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKwkJLyogcGVlck1hY0FkZHIgKi8KKwkJY2RmX21lbV9jb3B5KCh0U2lyTWFjQWRkciAqKSBwQnVmLCBwQXNzb2NJbmQtPnBlZXJNYWNBZGRyLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCQkvKiBTdGFJZCAqLworCQl3VG1wID0gcEFzc29jSW5kLT5zdGFJZDsKKwkJY2RmX21lbV9jb3B5KHBCdWYsICZ3VG1wLCBzaXplb2YodWludDE2X3QpKTsKKwkJcEJ1ZiArPSBzaXplb2YodWludDE2X3QpOworCQkvKiBhbHRlcm5hdGVCc3NJZCAqLworCQljZGZfbWVtX2NvcHkoKHRTaXJNYWNBZGRyICopIHBCdWYsIHBBc3NvY0luZC0+YnNzSWQsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisJCS8qIGFsdGVybmF0ZUNoYW5uZWxJZCAqLworCQkqcEJ1ZiA9IDExOworCQlwQnVmICs9IHNpemVvZih1aW50OF90KTsKKwkJLyogSW5zdGVhZCBvZiBjb3B5aW5nIHJvYW0gSW5mbywgd2UganVzdCBjb3B5IG9ubHkgV21tRW5hYmxlZCwgUnNuSUUgaW5mb3JtYXRpb24gKi8KKwkJLyogV21tICovCisJCSpwQnVmID0gcEFzc29jSW5kLT53bW1FbmFibGVkU3RhOworCQlwQnVmICs9IHNpemVvZih1aW50OF90KTsKKwkJLyogUlNOIElFICovCisJCWNkZl9tZW1fY29weSgodFNpclJTTmllICopIHBCdWYsICZwQXNzb2NJbmQtPnJzbklFLAorCQkJICAgICBzaXplb2YodFNpclJTTmllKSk7CisJCXBCdWYgKz0gc2l6ZW9mKHRTaXJSU05pZSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwkJLyogV0FQSSBJRSAqLworCQljZGZfbWVtX2NvcHkoKHRTaXJXQVBJaWUgKikgcEJ1ZiwgJnBBc3NvY0luZC0+d2FwaUlFLAorCQkJICAgICBzaXplb2YodFNpcldBUElpZSkpOworCQlwQnVmICs9IHNpemVvZih0U2lyV0FQSWllKTsKKyNlbmRpZgorCQkvKiBBZGRpdGlvbmFsIElFICovCisJCWNkZl9tZW1fY29weSgodm9pZCAqKXBCdWYsICZwQXNzb2NJbmQtPmFkZElFLAorCQkJICAgICBzaXplb2YodFNpckFkZGllKSk7CisJCXBCdWYgKz0gc2l6ZW9mKHRTaXJBZGRpZSk7CisJCS8qIHJlYXNzb2NSZXEgKi8KKwkJKnBCdWYgPSBwQXNzb2NJbmQtPnJlYXNzb2NSZXE7CisJCXBCdWYgKz0gc2l6ZW9mKHVpbnQ4X3QpOworCQkvKiB0aW1pbmdNZWFzQ2FwICovCisJCSpwQnVmID0gcEFzc29jSW5kLT50aW1pbmdNZWFzQ2FwOworCQlwQnVmICs9IHNpemVvZih1aW50OF90KTsKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopcEJ1ZiwgJnBBc3NvY0luZC0+Y2hhbl9pbmZvLAorCQkJICAgICBzaXplb2YodFNpclNtZUNoYW5JbmZvKSk7CisJCW1zZ1EudHlwZSA9IGVXTklfU01FX1VQUEVSX0xBWUVSX0FTU09DX0NORjsKKwkJbXNnUS5ib2R5cHRyID0gcE1zZzsKKwkJbXNnUS5ib2R5dmFsID0gMDsKKwkJc3lzX3Byb2Nlc3NfbW1oX21zZyhwTWFjLCAmbXNnUSk7CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2VuZF9tYl9zZXRfY29udGV4dF9yZXFfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsIHVpbnQ4X3QgbnVtS2V5cywKKwkJCQkJICAgdEFuaUVkVHlwZSBlZFR5cGUsIGJvb2wgZlVuaWNhc3QsCisJCQkJCSAgIHRBbmlLZXlEaXJlY3Rpb24gYW5pS2V5RGlyZWN0aW9uLAorCQkJCQkgICB1aW50OF90IGtleUlkLCB1aW50OF90IGtleUxlbmd0aCwKKwkJCQkJICAgdWludDhfdCAqcEtleSwgdWludDhfdCBwYWVSb2xlLAorCQkJCQkgICB1aW50OF90ICpwS2V5UnNjKQoreworCXRTaXJTbWVTZXRDb250ZXh0UmVxICpwTXNnOworCXVpbnQxNl90IG1zZ0xlbjsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJrZXlsZW5ndGggaXMgJWQsIEVuY3J5IHR5cGUgaXMgOiAlZCIpLAorCQlrZXlMZW5ndGgsIGVkVHlwZSk7CisJZG8geworCQlpZiAoKDEgIT0gbnVtS2V5cykgJiYgKDAgIT0gbnVtS2V5cykpCisJCQlicmVhazsKKwkJLyoKKwkJICogQWxsIG9mIHRoZXNlIGZpZWxkcyBhcHBlYXIgaW4gZXZlcnkgU0VUX0NPTlRFWFQgbWVzc2FnZS4KKwkJICogQmVsb3cgd2UnbGwgYWRkIGluIHRoZSBzaXplIGZvciBlYWNoIGtleSBzZXQuIFNpbmNlIHdlIG9ubHkgc3VwcG9ydAorCQkgKiB1cCB0byBvbmUga2V5LCB3ZSBhbHdheXMgYWxsb2NhdGUgbWVtb3J5IGZvciAxIGtleS4KKwkJICovCisJCW1zZ0xlbiA9IHNpemVvZihzdHJ1Y3Qgc1NpclNtZVNldENvbnRleHRSZXEpOworCisJCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhtc2dMZW4pOworCQlpZiAoTlVMTCA9PSBwTXNnKQorCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJY2RmX21lbV9zZXQocE1zZywgbXNnTGVuLCAwKTsKKwkJcE1zZy0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9TRVRDT05URVhUX1JFUTsKKwkJcE1zZy0+bGVuZ3RoID0gbXNnTGVuOworCQlwTXNnLT5zZXNzaW9uSWQgPSAodWludDhfdCkgc2Vzc2lvbklkOworCQlwTXNnLT50cmFuc2FjdGlvbklkID0gMDsKKwkJY2RmX21lbV9jb3B5KHBNc2ctPnBlZXJNYWNBZGRyLCBwZWVyTWFjQWRkciwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCWNkZl9tZW1fY29weShwTXNnLT5ic3NJZCwKKwkJCSAgICAgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQuYnl0ZXMsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJCS8qKgorCQkgKiBTZXQgdGhlIHBNc2ctPmtleU1hdGVyaWFsLmxlbmd0aCBmaWVsZAorCQkgKiAodGhpcyBsZW5ndGggaXMgZGVmaW5lZCBhcyBhbGwgZGF0YSB0aGF0IGZvbGxvd3MgdGhlCisJCSAqIGVkVHlwZSBmaWVsZCBpbiB0aGUgdFNpcktleU1hdGVyaWFsIGtleU1hdGVyaWFsOyBmaWVsZCkuCisJCSAqCisJCSAqIE5PVEU6ICBUaGlzIGtleU1hdGVyaWFsLmxlbmd0aCBjb250YWlucyB0aGUgbGVuZ3RoIG9mIGEKKwkJICogTUFYIHNpemUga2V5LCB0aG91Z2ggdGhlIGtleUxlbmd0aCBjYW4gYmUgc2hvcnRlciB0aGFuIHRoaXMKKwkJICogbWF4IHNpemUuICBJcyBMSU0gaW50ZXJwcmV0aW5nIHRoaXMgb2sgPworCQkgKi8KKwkJcE1zZy0+a2V5TWF0ZXJpYWwubGVuZ3RoID0KKwkJCQlzaXplb2YocE1zZy0+a2V5TWF0ZXJpYWwubnVtS2V5cykgKworCQkJCShudW1LZXlzICogc2l6ZW9mKHBNc2ctPmtleU1hdGVyaWFsLmtleSkpOworCQlwTXNnLT5rZXlNYXRlcmlhbC5lZFR5cGUgPSBlZFR5cGU7CisJCXBNc2ctPmtleU1hdGVyaWFsLm51bUtleXMgPSBudW1LZXlzOworCQlwTXNnLT5rZXlNYXRlcmlhbC5rZXlbMF0ua2V5SWQgPSBrZXlJZDsKKwkJcE1zZy0+a2V5TWF0ZXJpYWwua2V5WzBdLnVuaWNhc3QgPSBmVW5pY2FzdDsKKwkJcE1zZy0+a2V5TWF0ZXJpYWwua2V5WzBdLmtleURpcmVjdGlvbiA9IGFuaUtleURpcmVjdGlvbjsKKwkJY2RmX21lbV9jb3B5KHBNc2ctPmtleU1hdGVyaWFsLmtleVswXS5rZXlSc2MsCisJCQkJcEtleVJzYywgQ1NSX01BWF9SU0NfTEVOKTsKKwkJLyogMCBpcyBTdXBwbGljYW50ICovCisJCXBNc2ctPmtleU1hdGVyaWFsLmtleVswXS5wYWVSb2xlID0gcGFlUm9sZTsKKwkJcE1zZy0+a2V5TWF0ZXJpYWwua2V5WzBdLmtleUxlbmd0aCA9IGtleUxlbmd0aDsKKwkJaWYgKGtleUxlbmd0aCAmJiBwS2V5KSB7CisJCQljZGZfbWVtX2NvcHkocE1zZy0+a2V5TWF0ZXJpYWwua2V5WzBdLmtleSwKKwkJCQkJcEtleSwga2V5TGVuZ3RoKTsKKwkJCXNtc19sb2cocE1hYywgTE9HMSwKKwkJCQlGTCgiU01FIHNldCBrZXlJbmR4ICglZCkgZW5jVHlwZSAoJWQpIGtleSIpLAorCQkJCWtleUlkLCBlZFR5cGUpOworCQkJc2lyX2R1bXBfYnVmKHBNYWMsIFNJUl9TTVNfTU9EVUxFX0lELCBMT0cxLCBwS2V5LAorCQkJCSAgICAga2V5TGVuZ3RoKTsKKwkJfQorCQlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9zZW5kX21iX3N0YXJ0X2Jzc19yZXFfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJIGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlLAorCQkJCQkgdENzclJvYW1TdGFydEJzc1BhcmFtcyAqcFBhcmFtLAorCQkJCQkgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYykKK3sKKwl0U2lyU21lU3RhcnRCc3NSZXEgKnBNc2c7CisJdWludDE2X3Qgd1RtcDsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnN0YXR1c0NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCXBTZXNzaW9uLT5qb2luRmFpbFN0YXR1c0NvZGUucmVhc29uQ29kZSA9IDA7CisJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU21lU3RhcnRCc3NSZXEpKTsKKwlpZiAoTlVMTCA9PSBwTXNnKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCisJY2RmX21lbV9zZXQocE1zZywgc2l6ZW9mKHRTaXJTbWVTdGFydEJzc1JlcSksIDApOworCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfU1RBUlRfQlNTX1JFUTsKKwlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJcE1zZy0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJTbWVTdGFydEJzc1JlcSk7CisJcE1zZy0+dHJhbnNhY3Rpb25JZCA9IDA7CisJY2RmX21lbV9jb3B5KHBNc2ctPmJzc0lkLCBwUGFyYW0tPmJzc2lkLmJ5dGVzLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkvKiBzZWxmTWFjQWRkciAqLworCWNkZl9tZW1fY29weShwTXNnLT5zZWxmTWFjQWRkciwKKwkJICAgICBwU2Vzc2lvbi0+c2VsZk1hY0FkZHIuYnl0ZXMsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJLyogYmVhY29uSW50ZXJ2YWwgKi8KKwlpZiAocEJzc0Rlc2MgJiYgcEJzc0Rlc2MtPmJlYWNvbkludGVydmFsKQorCQl3VG1wID0gcEJzc0Rlc2MtPmJlYWNvbkludGVydmFsOworCWVsc2UgaWYgKHBQYXJhbS0+YmVhY29uSW50ZXJ2YWwpCisJCXdUbXAgPSBwUGFyYW0tPmJlYWNvbkludGVydmFsOworCWVsc2UKKwkJd1RtcCA9IFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMX1NUQURFRjsKKworCWlmIChjc3JfaXNjb25jdXJyZW50c2Vzc2lvbl92YWxpZChwTWFjLCBzZXNzaW9uSWQsIHBQYXJhbS0+YnNzUGVyc29uYSkKKwkJPT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWNzcl92YWxpZGF0ZV9tY2NfYmVhY29uX2ludGVydmFsKHBNYWMsCisJCQkJCQkgcFBhcmFtLT5vcGVyYXRpb25DaG4sCisJCQkJCQkgJndUbXAsCisJCQkJCQkgc2Vzc2lvbklkLAorCQkJCQkJIHBQYXJhbS0+YnNzUGVyc29uYSk7CisJCS8qIFVwZGF0ZSB0aGUgYmVhY29uIEludGVydmFsICovCisJCXBQYXJhbS0+YmVhY29uSW50ZXJ2YWwgPSB3VG1wOworCX0gZWxzZSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCIqKioqU3RhcnQgQlNTIGZhaWxlZCBwZXJzb25hIGFscmVhZHkgZXhpc3RzKioqIikpOworCQljZGZfbWVtX2ZyZWUocE1zZyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcE1zZy0+YmVhY29uSW50ZXJ2YWwgPSB3VG1wOworCXBNc2ctPmRvdDExbW9kZSA9CisJCWNzcl90cmFuc2xhdGVfdG9fd25pX2NmZ19kb3QxMV9tb2RlKHBNYWMsCisJCQkJCQkgICAgcFBhcmFtLT51Q2ZnRG90MTFNb2RlKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTUNDX1RPX1NDQ19TV0lUQ0gKKwlwTXNnLT5jY19zd2l0Y2hfbW9kZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2Nfc3dpdGNoX21vZGU7CisjZW5kaWYKKwlwTXNnLT5ic3NUeXBlID0gY3NyX3RyYW5zbGF0ZV9ic3N0eXBlX3RvX21hY190eXBlKGJzc1R5cGUpOworCWNkZl9tZW1fY29weSgmcE1zZy0+c3NJZCwgJnBQYXJhbS0+c3NJZCwgc2l6ZW9mKHBQYXJhbS0+c3NJZCkpOworCXBNc2ctPmNoYW5uZWxJZCA9IHBQYXJhbS0+b3BlcmF0aW9uQ2huOworCS8qIFdoYXQgc2hvdWxkIHdlIHJlYWxseSBkbyBmb3IgdGhlIGNibW9kZS4gKi8KKwlwTXNnLT5jYk1vZGUgPSAoZVBoeUNoYW5Cb25kU3RhdGUpIHBQYXJhbS0+Y2JNb2RlOworCXBNc2ctPnZodF9jaGFubmVsX3dpZHRoID0gcFBhcmFtLT5jaF9wYXJhbXMuY2hfd2lkdGg7CisJcE1zZy0+Y2VudGVyX2ZyZXFfc2VnMCA9IHBQYXJhbS0+Y2hfcGFyYW1zLmNlbnRlcl9mcmVxX3NlZzA7CisJcE1zZy0+Y2VudGVyX2ZyZXFfc2VnMSA9IHBQYXJhbS0+Y2hfcGFyYW1zLmNlbnRlcl9mcmVxX3NlZzE7CisJcE1zZy0+c2VjX2NoX29mZnNldCA9IHBQYXJhbS0+Y2hfcGFyYW1zLnNlY19jaF9vZmZzZXQ7CisJcE1zZy0+cHJpdmFjeSA9IHBQYXJhbS0+cHJpdmFjeTsKKwlwTXNnLT5hcFVhcHNkRW5hYmxlID0gcFBhcmFtLT5BcFVhcHNkRW5hYmxlOworCXBNc2ctPnNzaWRIaWRkZW4gPSBwUGFyYW0tPnNzaWRIaWRkZW47CisJcE1zZy0+ZndkV1BTUEJDUHJvYmVSZXEgPSAodWludDhfdCkgcFBhcmFtLT5md2RXUFNQQkNQcm9iZVJlcTsKKwlwTXNnLT5wcm90RW5hYmxlZCA9ICh1aW50OF90KSBwUGFyYW0tPnByb3RFbmFibGVkOworCXBNc2ctPm9ic3NQcm90RW5hYmxlZCA9ICh1aW50OF90KSBwUGFyYW0tPm9ic3NQcm90RW5hYmxlZDsKKwkvKiBzZXQgY2ZnIHJlbGF0ZWQgdG8gcHJvdGVjdGlvbiAqLworCXBNc2ctPmh0X2NhcGFiID0gcFBhcmFtLT5odF9wcm90ZWN0aW9uOworCXBNc2ctPmF1dGhUeXBlID0gcFBhcmFtLT5hdXRoVHlwZTsKKwlwTXNnLT5kdGltUGVyaW9kID0gcFBhcmFtLT5kdGltUGVyaW9kOworCXBNc2ctPndwc19zdGF0ZSA9IHBQYXJhbS0+d3BzX3N0YXRlOworCXBNc2ctPmlzQ29hbGVzaW5nSW5JQlNTQWxsb3dlZCA9IHBNYWMtPmlzQ29hbGVzaW5nSW5JQlNTQWxsb3dlZDsKKwlwTXNnLT5ic3NQZXJzb25hID0gcFBhcmFtLT5ic3NQZXJzb25hOworCXBNc2ctPnR4TGRwY0luaUZlYXR1cmVFbmFibGVkID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS50eExkcGNFbmFibGU7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXBNc2ctPnBtZkNhcGFibGUgPSBwUGFyYW0tPm1mcENhcGFibGU7CisJcE1zZy0+cG1mUmVxdWlyZWQgPSBwUGFyYW0tPm1mcFJlcXVpcmVkOworI2VuZGlmCisKKwlpZiAocFBhcmFtLT5uUlNOSUVMZW5ndGggPiBzaXplb2YocE1zZy0+cnNuSUUucnNuSUVkYXRhKSkgeworCQljZGZfbWVtX2ZyZWUocE1zZyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCXBNc2ctPnJzbklFLmxlbmd0aCA9IHBQYXJhbS0+blJTTklFTGVuZ3RoOworCWNkZl9tZW1fY29weShwTXNnLT5yc25JRS5yc25JRWRhdGEsCisJCSAgICAgcFBhcmFtLT5wUlNOSUUsCisJCSAgICAgcFBhcmFtLT5uUlNOSUVMZW5ndGgpOworCXBNc2ctPm53VHlwZSA9ICh0U2lyTndUeXBlKXBQYXJhbS0+c2lyTndUeXBlOworCWNkZl9tZW1fY29weSgmcE1zZy0+b3BlcmF0aW9uYWxSYXRlU2V0LAorCQkgICAgICZwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldCwKKwkJICAgICBzaXplb2YodFNpck1hY1JhdGVTZXQpKTsKKwljZGZfbWVtX2NvcHkoJnBNc2ctPmV4dGVuZGVkUmF0ZVNldCwKKwkJICAgICAmcFBhcmFtLT5leHRlbmRlZFJhdGVTZXQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNSYXRlU2V0KSk7CisJY2RmX21lbV9jb3B5KCZwTXNnLT5odENvbmZpZywKKwkJICAgICAmcFNlc3Npb24tPmh0Q29uZmlnLAorCQkgICAgIHNpemVvZih0U2lySFRDb25maWcpKTsKKwljZGZfbWVtX2NvcHkoJnBNc2ctPmFkZEllUGFyYW1zLAorCQkgICAgICZwUGFyYW0tPmFkZEllUGFyYW1zLAorCQkgICAgIHNpemVvZihwUGFyYW0tPmFkZEllUGFyYW1zKSk7CisJcE1zZy0+b2Jzc0VuYWJsZWQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm9ic3NFbmFibGVkOworCXBNc2ctPnNhcF9kb3QxMW1jID0gcFBhcmFtLT5zYXBfZG90MTFtYzsKKworCXJldHVybiBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2VuZF9tYl9zdG9wX2Jzc19yZXFfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwl0U2lyU21lU3RvcEJzc1JlcSAqcE1zZzsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVTdG9wQnNzUmVxKSk7CisJaWYgKE5VTEwgPT0gcE1zZykKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwljZGZfbWVtX3NldChwTXNnLCBzaXplb2YodFNpclNtZVN0b3BCc3NSZXEpLCAwKTsKKwlwTXNnLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1NUT1BfQlNTX1JFUTsKKwlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJcE1zZy0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJTbWVTdG9wQnNzUmVxKTsKKwlwTXNnLT50cmFuc2FjdGlvbklkID0gMDsKKwlwTXNnLT5yZWFzb25Db2RlID0gMDsKKwkvKgorCSAqIGlmIEJTU1R5cGUgaXMgV0RTIHN0YSwgdXNlIHNlbGZtYWNBZGRyIGFzIGJzc2lkLAorCSAqIGVsc2UgdXNlIGJzc2lkIGluIGNvbm5lY3RlZFByb2ZpbGUKKwkgKi8KKwlpZiAoQ1NSX0lTX0NPTk5fV0RTX1NUQSgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpKQorCQljZGZfbWVtX2NvcHkoJnBNc2ctPmJzc0lkLAorCQkJICAgICAmcFNlc3Npb24tPnNlbGZNYWNBZGRyLmJ5dGVzLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwllbHNlCisJCWNkZl9tZW1fY29weSgmcE1zZy0+YnNzSWQsCisJCQkgICAgICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZC5ieXRlcywKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJcmV0dXJuIGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKHBNc2cpOworfQorCitDREZfU1RBVFVTIGNzcl9yZWFzc29jKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJICAgICAgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqcE1vZFByb2ZpbGVGaWVsZHMsCisJCSAgICAgICB1aW50MzJfdCAqcFJvYW1JZCwgYm9vbCBmRm9yY2UpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl1aW50MzJfdCByb2FtSWQgPSAwOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlpZiAoKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpKSAmJgorCSAgICAoZkZvcmNlIHx8ICghY2RmX21lbV9jb21wYXJlKCZwTW9kUHJvZmlsZUZpZWxkcywKKwkJCQkgICAgICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS4KKwkJCQkgICAgIG1vZGlmeVByb2ZpbGVGaWVsZHMsCisJCQkJICAgICBzaXplb2YodENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzKSkpKSkgeworCQlyb2FtSWQgPSBHRVRfTkVYVF9ST0FNX0lEKCZwTWFjLT5yb2FtKTsKKwkJaWYgKHBSb2FtSWQpIHsKKwkJCSpwUm9hbUlkID0gcm9hbUlkOworCQl9CisKKwkJc3RhdHVzID0KKwkJCWNzcl9yb2FtX2lzc3VlX3JlYXNzb2MocE1hYywgc2Vzc2lvbklkLCBOVUxMLAorCQkJCQkgICAgICAgcE1vZFByb2ZpbGVGaWVsZHMsCisJCQkJCSAgICAgICBlQ3NyU21lSXNzdWVkUmVhc3NvY1RvU2FtZUFQLAorCQkJCQkgICAgICAgcm9hbUlkLCBmYWxzZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9yb2FtX3Nlc3Npb25fb3BlbmVkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKwljZGZfbWVtX3NldCgmcm9hbUluZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pLCAwKTsKKwlzdGF0dXMgPSBjc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgJnJvYW1JbmZvLCAwLAorCQkJCQllQ1NSX1JPQU1fU0VTU0lPTl9PUEVORUQsCisJCQkJCWVDU1JfUk9BTV9SRVNVTFRfTk9ORSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3JfcHJvY2Vzc19hZGRfc3RhX3Nlc3Npb25fcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBNc2cpCit7CisJdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworCXRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKwlzdHJ1Y3QgYWRkX3N0YV9zZWxmX3BhcmFtcyAqcnNwOworCXN0cnVjdCBzZW5kX2V4dGNhcF9pZSAqbXNnOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKHBNc2cgPT0gTlVMTCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsICJpbiAlcyBtc2cgcHRyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKwlpZiAoIXBFbnRyeSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsICJpbiAlcyBOTyBjb21tYW5kcyBhcmUgQUNUSVZFIC4uLiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisJaWYgKGVTbWVDb21tYW5kQWRkU3RhU2Vzc2lvbiAhPSBwQ29tbWFuZC0+Y29tbWFuZCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsICJpbiAlcyBDbWQgbm90IGluIGFjdGl2ZSBsaXN0IC4uLiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcnNwID0gKHN0cnVjdCBhZGRfc3RhX3NlbGZfcGFyYW1zICopIHBNc2c7CisJc21zX2xvZyhwTWFjLCBMT0cxLCAiQWRkIFN0YSBzZWxmIHJzcCBzdGF0dXMgPSAlZCIsIHJzcC0+c3RhdHVzKTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gcnNwLT5zdGF0dXMgJiYKKwkJKFdNSV9WREVWX1RZUEVfU1RBID09IHJzcC0+dHlwZSB8fAorCQkoV01JX1ZERVZfVFlQRV9BUCA9PSByc3AtPnR5cGUgJiYKKwkJIFdNSV9VTklGSUVEX1ZERVZfU1VCVFlQRV9QMlBfREVWSUNFID09IHJzcC0+c3ViX3R5cGUpKSkgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJzZW5kIFNFVCBJRSBtc2cgdG8gUEUiKSk7CisJCW1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqbXNnKSk7CisJCWlmIChOVUxMID09IG1zZykgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIikpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCisJCWNkZl9tZW1fc2V0KG1zZywgc2l6ZW9mKCptc2cpLCAwKTsKKwkJbXNnLT5tc2dfdHlwZSA9IGVXTklfU01FX1NFVF9JRV9SRVE7CisJCW1zZy0+c2Vzc2lvbl9pZCA9IHJzcC0+c2Vzc2lvbl9pZDsKKwkJbXNnLT5sZW5ndGggPSBzaXplb2YoKm1zZyk7CisJCXN0YXR1cyA9IGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKG1zZyk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIkZhaWxlZCB0byBzZW5kIGRvd24gdGhlIHNldCBJRSByZXEgIikpOworCX0KKworCWNzcl9yb2FtX3Nlc3Npb25fb3BlbmVkKHBNYWMsIHBDb21tYW5kLT5zZXNzaW9uSWQpOworCS8qIFJlbW92ZSB0aGlzIGNvbW1hbmQgb3V0IG9mIHRoZSBhY3RpdmUgbGlzdCAqLworCWlmIChjc3JfbGxfcmVtb3ZlX2VudHJ5KCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgcEVudHJ5LAorCQkgTExfQUNDRVNTX0xPQ0spKSB7CisJLyogTm93IHB1dCB0aGlzIGNvbW1hbmQgYmFjayBvbiB0aGUgYXZpbGFibGUgY29tbWFuZCBsaXN0ICovCisJCWNzcl9yZWxlYXNlX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworCX0KKwlzbWVfcHJvY2Vzc19wZW5kaW5nX3F1ZXVlKHBNYWMpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY3NyX2lzc3VlX2FkZF9zdGFfZm9yX3Nlc3Npb25fcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJICAgICB0U2lyTWFjQWRkciBzZXNzaW9uTWFjQWRkciwKKwkJCQkJICAgICB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzdWJUeXBlKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTbWVDbWQgKnBDb21tYW5kOworCXBDb21tYW5kID0gY3NyX2dldF9jb21tYW5kX2J1ZmZlcihwTWFjKTsKKwlpZiAoTlVMTCA9PSBwQ29tbWFuZCkgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfUkVTT1VSQ0VTOworCX0gZWxzZSB7CisJCXBDb21tYW5kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRBZGRTdGFTZXNzaW9uOworCQlwQ29tbWFuZC0+c2Vzc2lvbklkID0gKHVpbnQ4X3QpIHNlc3Npb25JZDsKKwkJY2RmX21lbV9jb3B5KHBDb21tYW5kLT51LmFkZFN0YVNlc3Npb25DbWQuc2VsZk1hY0FkZHIsCisJCQkgICAgIHNlc3Npb25NYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcENvbW1hbmQtPnUuYWRkU3RhU2Vzc2lvbkNtZC5jdXJyRGV2aWNlTW9kZSA9CisJCQlwTWFjLT5zbWUuY3VyckRldmljZU1vZGU7CisJCXBDb21tYW5kLT51LmFkZFN0YVNlc3Npb25DbWQudHlwZSA9IHR5cGU7CisJCXBDb21tYW5kLT51LmFkZFN0YVNlc3Npb25DbWQuc3ViVHlwZSA9IHN1YlR5cGU7CisJCXN0YXR1cyA9IGNzcl9xdWV1ZV9zbWVfY29tbWFuZChwTWFjLCBwQ29tbWFuZCwgdHJ1ZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCS8qIFNob3VsZCBiZSBwYW5pYz8/ICovCisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZCIpLCBzdGF0dXMpOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3Byb2Nlc3NfYWRkX3N0YV9zZXNzaW9uX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgIHRTbWVDbWQgKnBDb21tYW5kKQoreworCXRBZGRTdGFGb3JTZXNzaW9uQ21kICpwQWRkU3RhUmVxID0KKwkJJnBDb21tYW5kLT51LmFkZFN0YVNlc3Npb25DbWQ7CisJdWludDhfdCBzZXNzaW9uSWQgPSBwQ29tbWFuZC0+c2Vzc2lvbklkOworCXN0cnVjdCBhZGRfc3RhX3NlbGZfcGFyYW1zICphZGRfc3RhX3NlbGZfcmVxOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCXRTaXJNc2dRIG1zZzsKKworCWFkZF9zdGFfc2VsZl9yZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IGFkZF9zdGFfc2VsZl9wYXJhbXMpKTsKKwlpZiAoTlVMTCA9PSBhZGRfc3RhX3NlbGZfcmVxKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwKKwkJCUZMCisJCQkoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRBZGRTZWxmU3RhUGFyYW1zIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWNkZl9tZW1fY29weShhZGRfc3RhX3NlbGZfcmVxLT5zZWxmX21hY19hZGRyLCBwQWRkU3RhUmVxLT5zZWxmTWFjQWRkciwKKwkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCWFkZF9zdGFfc2VsZl9yZXEtPmN1cnJfZGV2aWNlX21vZGUgPSBwQWRkU3RhUmVxLT5jdXJyRGV2aWNlTW9kZTsKKwlhZGRfc3RhX3NlbGZfcmVxLT5zZXNzaW9uX2lkID0gc2Vzc2lvbklkOworCWFkZF9zdGFfc2VsZl9yZXEtPnR5cGUgPSBwQWRkU3RhUmVxLT50eXBlOworCWFkZF9zdGFfc2VsZl9yZXEtPnN1Yl90eXBlID0gcEFkZFN0YVJlcS0+c3ViVHlwZTsKKworCW1zZy50eXBlID0gV01BX0FERF9TVEFfU0VMRl9SRVE7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IGFkZF9zdGFfc2VsZl9yZXE7CisJbXNnLmJvZHl2YWwgPSAwOworCisJbGltX2xvZyhwTWFjLCBMT0cxLAorCQkgRkwKKwkJICgiU2VuZCBXTUFfQUREX1NUQV9TRUxGX1JFUSBmb3Igc2VsZk1hYz0iIE1BQ19BRERSRVNTX1NUUiksCisJCSBNQUNfQUREUl9BUlJBWShhZGRfc3RhX3NlbGZfcmVxLT5zZWxmX21hY19hZGRyKSk7CisJTVRSQUNFKG1hY190cmFjZV9tc2dfdHgocE1hYywgTk9fU0VTU0lPTiwgbXNnLnR5cGUpKTsKKwlzdGF0dXMgPSB3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnKTsKKworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWxpbV9sb2cocE1hYywgTE9HUCwgRkwoIndtYV9wb3N0X2N0cmxfbXNnIGZhaWxlZCIpKTsKKwkJY2RmX21lbV9mcmVlKGFkZF9zdGFfc2VsZl9yZXEpOworCQlhZGRfc3RhX3NlbGZfcmVxID0gTlVMTDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9vcGVuX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgY3NyX3JvYW1fY29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgdm9pZCAqcENvbnRleHQsCisJCQkJIHVpbnQ4X3QgKnBTZWxmTWFjQWRkciwgdWludDhfdCAqcGJTZXNzaW9uSWQsCisJCQkJIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHN1YlR5cGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdWludDMyX3QgaSwgdmFsdWUgPSAwOworCXVuaW9uIHsKKwkJdWludDE2X3QgbkNmZ1ZhbHVlMTY7CisJCXRTaXJNYWNIVENhcGFiaWxpdHlJbmZvIGh0Q2FwSW5mbzsKKwl9IHVIVENhcGFiaWxpdHlJbmZvOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisJKnBiU2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5zbWUubWF4X2ludGZfY291bnQ7IGkrKykgeworCQlpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIGkpKSB7CisJCQlwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBpKTsKKwkJCWlmICghcFNlc3Npb24pIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMCisJCQkJCQkoIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGludGVyZmFjZSAlZCIpLAorCQkJCQlpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCXBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlID0gdHJ1ZTsKKwkJCXBTZXNzaW9uLT5zZXNzaW9uSWQgPSAodWludDhfdCkgaTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCQkvKiBJbml0aWFsaXplIEZUIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzIG9ubHkgaW4gU1RBIG1vZGUgKi8KKwkJCXNtZV9mdF9vcGVuKHBNYWMsIHBTZXNzaW9uLT5zZXNzaW9uSWQpOworI2VuZGlmCisKKwkJCXBTZXNzaW9uLT5jYWxsYmFjayA9IGNhbGxiYWNrOworCQkJcFNlc3Npb24tPnBDb250ZXh0ID0gcENvbnRleHQ7CisJCQljZGZfbWVtX2NvcHkoJnBTZXNzaW9uLT5zZWxmTWFjQWRkciwgcFNlbGZNYWNBZGRyLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwkJCSpwYlNlc3Npb25JZCA9ICh1aW50OF90KSBpOworCQkJc3RhdHVzID0KKwkJCQljZGZfbWNfdGltZXJfaW5pdCgmcFNlc3Npb24tPmhUaW1lclJvYW1pbmcsCisJCQkJCQkgIENERl9USU1FUl9UWVBFX1NXLAorCQkJCQkJICBjc3Jfcm9hbV9yb2FtaW5nX3RpbWVyX2hhbmRsZXIsCisJCQkJCQkgICZwU2Vzc2lvbi0+cm9hbWluZ1RpbWVySW5mbyk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTAorCQkJCQkJKCJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBSb2FtaW5nIHRpbWVyIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZ2V0IHRoZSBIVCBjYXBhYmlsaXR5IGluZm8gKi8KKwkJCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWx1ZSkKKwkJCQkJIT0gZVNJUl9TVUNDRVNTKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiJXM6IGNvdWxkIG5vdCBnZXQgSFQgY2FwYWJpbGl0eSBpbmZvIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQkJYnJlYWs7CisJCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0JUQU1QX1VUX1JGCisJCQlzdGF0dXMgPSBjZGZfbWNfdGltZXJfaW5pdCgmcFNlc3Npb24tPmhUaW1lckpvaW5SZXRyeSwKKwkJCQkJCSAgIENERl9USU1FUl9UWVBFX1NXLAorCQkJCQkJICAgY3NyX3JvYW1fam9pbl9yZXRyeV90aW1lcl9oYW5kbGVyLAorCQkJCQkJICAgJnBTZXNzaW9uLT4KKwkJCQkJCSAgIGpvaW5SZXRyeVRpbWVySW5mbyk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTAorCQkJCQkJKCJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBqb2luIHJldHJ5IHRpbWVyIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisJCQl1SFRDYXBhYmlsaXR5SW5mby5uQ2ZnVmFsdWUxNiA9IDB4RkZGRiAmIHZhbHVlOworCQkJcFNlc3Npb24tPmh0Q29uZmlnLmh0X3J4X2xkcGMgPQorCQkJCXVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby5hZHZDb2RpbmdDYXA7CisJCQlwU2Vzc2lvbi0+aHRDb25maWcuaHRfdHhfc3RiYyA9CisJCQkJdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnR4U1RCQzsKKwkJCXBTZXNzaW9uLT5odENvbmZpZy5odF9yeF9zdGJjID0KKwkJCQl1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8ucnhTVEJDOworCQkJcFNlc3Npb24tPmh0Q29uZmlnLmh0X3NnaSA9IHRydWU7CisJCQlzdGF0dXMgPQorCQkJCWNzcl9pc3N1ZV9hZGRfc3RhX2Zvcl9zZXNzaW9uX3JlcShwTWFjLCBpLCBwU2VsZk1hY0FkZHIsCisJCQkJCQkJCSAgdHlwZSwgc3ViVHlwZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAocE1hYy0+c21lLm1heF9pbnRmX2NvdW50ID09IGkpIHsKKwkJLyogTm8gc2Vzc2lvbiBpcyBhdmFpbGFibGUgKi8KKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJIiVzOiBSZWFjaGVkIG1heCBpbnRlcmZhY2VzOiAlZCEgU2Vzc2lvbiBjcmVhdGlvbiB3aWxsIGZhaWwiLAorCQkJX19mdW5jX18sIHBNYWMtPnNtZS5tYXhfaW50Zl9jb3VudCk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3Byb2Nlc3NfZGVsX3N0YV9zZXNzaW9uX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwTXNnKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworCXRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKwlzdHJ1Y3QgZGVsX3N0YV9zZWxmX3BhcmFtcyAqcnNwOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCisJaWYgKHBNc2cgPT0gTlVMTCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJtc2cgcHRyIGlzIE5VTEwiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKCFwRW50cnkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiTk8gY29tbWFuZHMgYXJlIEFDVElWRSAuLi4iKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCXNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisJaWYgKGVTbWVDb21tYW5kRGVsU3RhU2Vzc2lvbiAhPSBwQ29tbWFuZC0+Y29tbWFuZCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJOTyBEZWwgc3RhIHNlc3Npb24gY29tbWFuZCBBQ1RJVkUiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXJzcCA9IChzdHJ1Y3QgZGVsX3N0YV9zZWxmX3BhcmFtcyAqKSBwTXNnOworCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIkRlbCBTdGEgcnNwIHN0YXR1cyA9ICVkIiksIHJzcC0+c3RhdHVzKTsKKwkvKiBUaGlzIHNlc3Npb24gaXMgZG9uZS4gKi8KKwljc3JfY2xlYW51cF9zZXNzaW9uKHBNYWMsIHNlc3Npb25JZCk7CisJaWYgKHBDb21tYW5kLT51LmRlbFN0YVNlc3Npb25DbWQuY2FsbGJhY2spIHsKKwkJc3RhdHVzID0gc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJGYWlsZWQgdG8gUmVsZWFzZSBMb2NrIikpOworCQllbHNlIHsKKwkJCXBDb21tYW5kLT51LmRlbFN0YVNlc3Npb25DbWQuCisJCQkJY2FsbGJhY2socENvbW1hbmQtPnUuZGVsU3RhU2Vzc2lvbkNtZC5wQ29udGV4dCk7CisJCQlzdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJGYWlsZWQgdG8gZ2V0IExvY2siKSk7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKwkJfQorCX0KKwkvKiBSZW1vdmUgdGhpcyBjb21tYW5kIG91dCBvZiB0aGUgYWN0aXZlIGxpc3QgKi8KKwlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeSgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIHBFbnRyeSwKKwkJTExfQUNDRVNTX0xPQ0spKSB7CisJCS8qIE5vdyBwdXQgdGhpcyBjb21tYW5kIGJhY2sgb24gdGhlIGF2aWxhYmxlIGNvbW1hbmQgbGlzdCAqLworCQljc3JfcmVsZWFzZV9jb21tYW5kKHBNYWMsIHBDb21tYW5kKTsKKwl9CisJc21lX3Byb2Nlc3NfcGVuZGluZ19xdWV1ZShwTWFjKTsKKwlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIHN0YXR1czsKK30KKworCitDREZfU1RBVFVTIGNzcl9pc3N1ZV9kZWxfc3RhX2Zvcl9zZXNzaW9uX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgdFNpck1hY0FkZHIgc2Vzc2lvbk1hY0FkZHIsCisJCQkJCSAgICAgY3NyX3JvYW1TZXNzaW9uQ2xvc2VDYWxsYmFjayBjYWxsYmFjaywKKwkJCQkJICAgICB2b2lkICpwQ29udGV4dCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U21lQ21kICpwQ29tbWFuZDsKKwlwQ29tbWFuZCA9IGNzcl9nZXRfY29tbWFuZF9idWZmZXIocE1hYyk7CisJaWYgKE5VTEwgPT0gcENvbW1hbmQpIHsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwl9IGVsc2UgeworCQlwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kRGVsU3RhU2Vzc2lvbjsKKwkJcENvbW1hbmQtPnNlc3Npb25JZCA9ICh1aW50OF90KSBzZXNzaW9uSWQ7CisJCXBDb21tYW5kLT51LmRlbFN0YVNlc3Npb25DbWQuY2FsbGJhY2sgPSBjYWxsYmFjazsKKwkJcENvbW1hbmQtPnUuZGVsU3RhU2Vzc2lvbkNtZC5wQ29udGV4dCA9IHBDb250ZXh0OworCQljZGZfbWVtX2NvcHkocENvbW1hbmQtPnUuZGVsU3RhU2Vzc2lvbkNtZC5zZWxmTWFjQWRkciwKKwkJCSAgICAgc2Vzc2lvbk1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlzdGF0dXMgPSBjc3JfcXVldWVfc21lX2NvbW1hbmQocE1hYywgcENvbW1hbmQsIHRydWUpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkvKiBTaG91bGQgYmUgcGFuaWM/PyAqLworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCIgZmFpbCB0byBzZW5kIG1lc3NhZ2Ugc3RhdHVzID0gJWQiKSwgc3RhdHVzKTsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9wcm9jZXNzX2RlbF9zdGFfc2Vzc2lvbl9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB0U21lQ21kICpwQ29tbWFuZCkKK3sKKwlzdHJ1Y3QgZGVsX3N0YV9zZWxmX3BhcmFtcyAqZGVsX3N0YV9zZWxmX3JlcTsKKwl0U2lyTXNnUSBtc2c7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwlkZWxfc3RhX3NlbGZfcmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWxfc3RhX3NlbGZfcGFyYW1zKSk7CisJaWYgKE5VTEwgPT0gZGVsX3N0YV9zZWxmX3JlcSkgeworCQlsaW1fbG9nKHBNYWMsIExPR1AsCisJCQlGTCgiIG1lbSBhbGxvYyBmYWlsZWQgZm9yIHREZWxTdGFTZWxmUGFyYW1zIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1fY29weShkZWxfc3RhX3NlbGZfcmVxLT5zZWxmX21hY19hZGRyLAorCQlwQ29tbWFuZC0+dS5kZWxTdGFTZXNzaW9uQ21kLnNlbGZNYWNBZGRyLAorCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWRlbF9zdGFfc2VsZl9yZXEtPnNlc3Npb25faWQgPSBwQ29tbWFuZC0+c2Vzc2lvbklkOworCW1zZy50eXBlID0gV01BX0RFTF9TVEFfU0VMRl9SRVE7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IGRlbF9zdGFfc2VsZl9yZXE7CisJbXNnLmJvZHl2YWwgPSAwOworCisJc21zX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgic2VuZGluZyBXTUFfREVMX1NUQV9TRUxGX1JFUSIpKTsKKwlNVFJBQ0UobWFjX3RyYWNlX21zZ190eChwTWFjLCBOT19TRVNTSU9OLCBtc2cudHlwZSkpOworCXN0YXR1cyA9IHdtYV9wb3N0X2N0cmxfbXNnKHBNYWMsICZtc2cpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCXNtc19sb2cocE1hYywgTE9HUCwgRkwoIndtYV9wb3N0X2N0cmxfbXNnIGZhaWxlZCIpKTsKKwkJY2RmX21lbV9mcmVlKGRlbF9zdGFfc2VsZl9yZXEpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBwdXJnZV9jc3Jfc2Vzc2lvbl9jbWRfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJdERibExpbmtMaXN0ICpwTGlzdCA9ICZwTWFjLT5yb2FtLnJvYW1DbWRQZW5kaW5nTGlzdDsKKwl0TGlzdEVsZW0gKnBFbnRyeSwgKnBOZXh0OworCXRTbWVDbWQgKnBDb21tYW5kOworCXREYmxMaW5rTGlzdCBsb2NhbExpc3Q7CisKKwljZGZfbWVtX3plcm8oJmxvY2FsTGlzdCwgc2l6ZW9mKHREYmxMaW5rTGlzdCkpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9sbF9vcGVuKHBNYWMtPmhIZGQsICZsb2NhbExpc3QpKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbGVkIHRvIG9wZW4gbGlzdCIpKTsKKwkJcmV0dXJuOworCX0KKwljc3JfbGxfbG9jayhwTGlzdCk7CisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZChwTGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisJd2hpbGUgKHBFbnRyeSAhPSBOVUxMKSB7CisJCXBOZXh0ID0gY3NyX2xsX25leHQocExpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyk7CisJCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCQlpZiAocENvbW1hbmQtPnNlc3Npb25JZCA9PSBzZXNzaW9uSWQpIHsKKwkJCWlmIChjc3JfbGxfcmVtb3ZlX2VudHJ5KHBMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spKSB7CisJCQkJY3NyX2xsX2luc2VydF90YWlsKCZsb2NhbExpc3QsIHBFbnRyeSwKKwkJCQkJCSAgIExMX0FDQ0VTU19OT0xPQ0spOworCQkJfQorCQl9CisJCXBFbnRyeSA9IHBOZXh0OworCX0KKwljc3JfbGxfdW5sb2NrKHBMaXN0KTsKKworCXdoaWxlICgocEVudHJ5ID0gY3NyX2xsX3JlbW92ZV9oZWFkKCZsb2NhbExpc3QsIExMX0FDQ0VTU19OT0xPQ0spKSkgeworCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJY3NyX2Fib3J0X2NvbW1hbmQocE1hYywgcENvbW1hbmQsIHRydWUpOworCX0KKwljc3JfbGxfY2xvc2UoJmxvY2FsTGlzdCk7Cit9CisKK3ZvaWQgY3NyX2NsZWFudXBfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJCWNzcl9yb2FtX3N0b3AocE1hYywgc2Vzc2lvbklkKTsKKworCQkvKiBDbGVhbiB1cCBGVCByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyAqLworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJc21lX2Z0X2Nsb3NlKHBNYWMsIHNlc3Npb25JZCk7CisjZW5kaWYKKwkJY3NyX2ZyZWVfY29ubmVjdF9ic3NfZGVzYyhwTWFjLCBzZXNzaW9uSWQpOworCQljc3Jfcm9hbV9mcmVlX2Nvbm5lY3RfcHJvZmlsZShwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpOworCQljc3Jfcm9hbV9mcmVlX2Nvbm5lY3RlZF9pbmZvKHBNYWMsICZwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mbyk7CisJCWNkZl9tY190aW1lcl9kZXN0cm95KCZwU2Vzc2lvbi0+aFRpbWVyUm9hbWluZyk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0JUQU1QX1VUX1JGCisJCWNkZl9tY190aW1lcl9kZXN0cm95KCZwU2Vzc2lvbi0+aFRpbWVySm9pblJldHJ5KTsKKyNlbmRpZgorCQlwdXJnZV9zbWVfc2Vzc2lvbl9jbWRfbGlzdChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCSAgICZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QpOworCQlwdXJnZV9zbWVfc2Vzc2lvbl9jbWRfbGlzdChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkgICAmcE1hYy0+c21lLgorCQkJCQkJICAgc21lU2NhbkNtZFBlbmRpbmdMaXN0KTsKKworCQlwdXJnZV9jc3Jfc2Vzc2lvbl9jbWRfbGlzdChwTWFjLCBzZXNzaW9uSWQpOworCQljc3JfaW5pdF9zZXNzaW9uKHBNYWMsIHNlc3Npb25JZCk7CisJfQorfQorCitDREZfU1RBVFVTIGNzcl9yb2FtX2Nsb3NlX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgYm9vbCBmU3luYywKKwkJCQkgIGNzcl9yb2FtU2Vzc2lvbkNsb3NlQ2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJICB2b2lkICpwQ29udGV4dCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJCWlmIChmU3luYykgeworCQkJY3NyX2NsZWFudXBfc2Vzc2lvbihwTWFjLCBzZXNzaW9uSWQpOworCQl9IGVsc2UgeworCQkJcHVyZ2Vfc21lX3Nlc3Npb25fY21kX2xpc3QocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJICAgJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCk7CisJCQlwdXJnZV9zbWVfc2Vzc2lvbl9jbWRfbGlzdChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCSAgICZwTWFjLT5zbWUuc21lU2NhbkNtZFBlbmRpbmdMaXN0KTsKKworCQkJcHVyZ2VfY3NyX3Nlc3Npb25fY21kX2xpc3QocE1hYywgc2Vzc2lvbklkKTsKKwkJCXN0YXR1cyA9IGNzcl9pc3N1ZV9kZWxfc3RhX2Zvcl9zZXNzaW9uX3JlcShwTWFjLAorCQkJCQkJIHNlc3Npb25JZCwKKwkJCQkJCSBwU2Vzc2lvbi0+c2VsZk1hY0FkZHIuYnl0ZXMsCisJCQkJCQkgY2FsbGJhY2ssIHBDb250ZXh0KTsKKwkJfQorCX0gZWxzZSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgY3NyX2luaXRfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm47CisJfQorCisJcFNlc3Npb24tPnNlc3Npb25BY3RpdmUgPSBmYWxzZTsKKwlwU2Vzc2lvbi0+c2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKwlwU2Vzc2lvbi0+Y2FsbGJhY2sgPSBOVUxMOworCXBTZXNzaW9uLT5wQ29udGV4dCA9IE5VTEw7CisJcFNlc3Npb24tPmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9OT1RfQ09OTkVDVEVEOworCWNzcl9mcmVlX3JvYW1fcHJvZmlsZShwTWFjLCBzZXNzaW9uSWQpOworCWNzcl9yb2FtX2ZyZWVfY29ubmVjdF9wcm9maWxlKHBNYWMsICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSk7CisJY3NyX3JvYW1fZnJlZV9jb25uZWN0ZWRfaW5mbyhwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZEluZm8pOworCWNzcl9mcmVlX2Nvbm5lY3RfYnNzX2Rlc2MocE1hYywgc2Vzc2lvbklkKTsKKwljc3Jfc2Nhbl9lbmFibGUocE1hYyk7CisJY2RmX21lbV9zZXQoJnBTZXNzaW9uLT5zZWxmTWFjQWRkciwgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpLCAwKTsKKwlpZiAocFNlc3Npb24tPnBXcGFSc25SZXFJRSkgeworCQljZGZfbWVtX2ZyZWUocFNlc3Npb24tPnBXcGFSc25SZXFJRSk7CisJCXBTZXNzaW9uLT5wV3BhUnNuUmVxSUUgPSBOVUxMOworCX0KKwlwU2Vzc2lvbi0+bldwYVJzblJlcUllTGVuZ3RoID0gMDsKKwlpZiAocFNlc3Npb24tPnBXcGFSc25Sc3BJRSkgeworCQljZGZfbWVtX2ZyZWUocFNlc3Npb24tPnBXcGFSc25Sc3BJRSk7CisJCXBTZXNzaW9uLT5wV3BhUnNuUnNwSUUgPSBOVUxMOworCX0KKwlwU2Vzc2lvbi0+bldwYVJzblJzcEllTGVuZ3RoID0gMDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCWlmIChwU2Vzc2lvbi0+cFdhcGlSZXFJRSkgeworCQljZGZfbWVtX2ZyZWUocFNlc3Npb24tPnBXYXBpUmVxSUUpOworCQlwU2Vzc2lvbi0+cFdhcGlSZXFJRSA9IE5VTEw7CisJfQorCXBTZXNzaW9uLT5uV2FwaVJlcUllTGVuZ3RoID0gMDsKKwlpZiAocFNlc3Npb24tPnBXYXBpUnNwSUUpIHsKKwkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5wV2FwaVJzcElFKTsKKwkJcFNlc3Npb24tPnBXYXBpUnNwSUUgPSBOVUxMOworCX0KKwlwU2Vzc2lvbi0+bldhcGlSc3BJZUxlbmd0aCA9IDA7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKwlpZiAocFNlc3Npb24tPnBBZGRJRVNjYW4pIHsKKwkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5wQWRkSUVTY2FuKTsKKwkJcFNlc3Npb24tPnBBZGRJRVNjYW4gPSBOVUxMOworCX0KKwlwU2Vzc2lvbi0+bkFkZElFU2Nhbkxlbmd0aCA9IDA7CisJaWYgKHBTZXNzaW9uLT5wQWRkSUVBc3NvYykgeworCQljZGZfbWVtX2ZyZWUocFNlc3Npb24tPnBBZGRJRUFzc29jKTsKKwkJcFNlc3Npb24tPnBBZGRJRUFzc29jID0gTlVMTDsKKwl9CisJcFNlc3Npb24tPm5BZGRJRUFzc29jTGVuZ3RoID0gMDsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9nZXRfc2Vzc2lvbl9pZF9mcm9tX2Jzc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHN0cnVjdCBjZGZfbWFjX2FkZHIgKmJzc2lkLAorCQkJCQkgICAgICB1aW50MzJfdCAqcFNlc3Npb25JZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXVpbnQzMl90IGk7CisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIGkpKSB7CisJCQlpZiAoY2RmX2lzX21hY2FkZHJfZXF1YWwoYnNzaWQsCisJCQkJICAgICZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW2ldLmNvbm5lY3RlZFByb2ZpbGUuCisJCQkJICAgIGJzc2lkKSkgeworCQkJCS8qIEZvdW5kIGl0ICovCisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJCSpwU2Vzc2lvbklkID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB3ZSBvbmx5IHN1cHBvcnQgb25lIElCU1Mgc2Vzc2lvbi4gV2UgY2Fubm90IHVzZSBCU1NJRCB0byBpZGVudGlmeSAqLworLyogc2Vzc2lvbiBiZWNhdXNlIGZvciBJQlNTLCB0aGUgYnNzaWQgY2hhbmdlcy4gKi8KK3N0YXRpYyB1aW50MzJfdCBjc3JfZmluZF9pYnNzX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl1aW50MzJfdCBpLCBuUmV0ID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uOworCWZvciAoaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBpKSkgeworCQkJcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgaSk7CisJCQlpZiAocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZQorCQkJICAgICYmCisJCQkgICAgKGNzcl9pc19ic3NfdHlwZV9pYnNzCisJCQkJICAgICAocFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuQlNTVHlwZSkpKSB7CisJCQkJLyogRm91bmQgaXQgKi8KKwkJCQluUmV0ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gblJldDsKK30KKworc3RhdGljIHZvaWQgY3NyX3JvYW1fbGlua191cCh0cEFuaVNpckdsb2JhbCBwTWFjLCBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkKQoreworCS8qIFVwZGF0ZSB0aGUgY3VycmVudCBCU1MgaW5mbyBpbiBobyBjb250cm9sIGJsb2NrIGJhc2VkIG9uIGNvbm5lY3RlZAorCSAgIHByb2ZpbGUgaW5mbyBmcm9tIHBtYWMgZ2xvYmFsIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwlzbXNfbG9nKHBNYWMsIExPR1csCisJCSIgY3NyX3JvYW1fbGlua191cDogV0xBTiBsaW5rIFVQIHdpdGggQVA9ICIgTUFDX0FERFJFU1NfU1RSLAorCQlNQUNfQUREUl9BUlJBWShic3NpZC5ieXRlcykpOworCS8qIENoZWNrIGZvciB1c2VyIG1pc2NvbmZpZyBvZiBSU1NJIHRyaWdnZXIgdGhyZXNob2xkICAgICAgICAgICAgICAgICAgKi8KKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnZjY1Jzc2lUaHJlc2hvbGQgPQorCQkoMCA9PSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnZjY1Jzc2lUaHJlc2hvbGQpID8KKwkJQ1NSX1ZDQ19SU1NJX1RIUkVTSE9MRCA6IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udmNjUnNzaVRocmVzaG9sZDsKKwlwTWFjLT5yb2FtLnZjY0xpbmtRdWFsaXR5ID0gZUNTUl9ST0FNX0xJTktfUVVBTF9QT09SX0lORDsKKwkvKiBDaGVjayBmb3IgdXNlciBtaXNjb25maWcgb2YgVUwgTUFDIExvc3MgdHJpZ2dlciB0aHJlc2hvbGQgICAgICAgICAgICovCisJcE1hYy0+cm9hbS5jb25maWdQYXJhbS52Y2NVbE1hY0xvc3NUaHJlc2hvbGQgPQorCQkoMCA9PSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnZjY1VsTWFjTG9zc1RocmVzaG9sZCkgPworCQlDU1JfVkNDX1VMX01BQ19MT1NTX1RIUkVTSE9MRCA6IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uCisJCXZjY1VsTWFjTG9zc1RocmVzaG9sZDsKKyNpZiAgIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKwl7CisJCXVpbnQzMl90IHNlc3Npb25JZCA9IDA7CisJCS8qIEluZGljYXRlIHRoZSBuZWlnaGJvciByb2FsIGFsZ29yaXRobSBhYm91dCB0aGUgY29ubmVjdCBpbmRpY2F0aW9uICovCisJCWNzcl9yb2FtX2dldF9zZXNzaW9uX2lkX2Zyb21fYnNzaWQocE1hYywgJmJzc2lkLAorCQkJCQkJICAgJnNlc3Npb25JZCk7CisJCWNzcl9uZWlnaGJvcl9yb2FtX2luZGljYXRlX2Nvbm5lY3QocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJICAgQ0RGX1NUQVRVU19TVUNDRVNTKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgY3NyX3JvYW1fbGlua19kb3duKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisJLyogT25seSB0byBoYW5kbGUgdGhlIGNhc2UgZm9yIEhhbmRvdmVyIG9uIGluZnJhIGxpbmsgKi8KKwlpZiAoZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSAhPSBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5CU1NUeXBlKSB7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBJbmNhc2Ugb2Ygc3RhdGlvbiBtb2RlLCBpbW1lZGlhdGVseSBzdG9wIGRhdGEgdHJhbnNtaXNzaW9uIHdoZW5ldmVyCisJICogbGluayBkb3duIGlzIGRldGVjdGVkLgorCSAqLworCWlmIChjc3Jfcm9hbV9pc19zdGFfbW9kZShwTWFjLCBzZXNzaW9uSWQpCisJICAgICYmICFDU1JfSVNfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19ITyhwTWFjLCBzZXNzaW9uSWQpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkgICAgJiYgIWNzcl9yb2FtX2lzMTFyX2Fzc29jKHBNYWMsIHNlc3Npb25JZCkKKyNlbmRpZgorCSAgICApIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiSW5mb3JtIExpbmsgbG9zdCBmb3Igc2Vzc2lvbiAlZCIpLAorCQkJc2Vzc2lvbklkKTsKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIDAsCisJCQkJICAgICAgIGVDU1JfUk9BTV9MT1NUTElOSywKKwkJCQkgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9MT1NUTElOSyk7CisJfQorCS8qIGRlcmVnaXN0ZXIgdGhlIGNsaWVudHMgcmVxdWVzdGluZyBzdGF0cyBmcm9tIFBFL1RMICYgYWxzbyBzdG9wIHRoZSBjb3JyZXNwb25kaW5nIHRpbWVycyAqLworCWNzcl9yb2FtX2RlcmVnX3N0YXRpc3RpY3NfcmVxKHBNYWMpOworCXBNYWMtPnJvYW0udmNjTGlua1F1YWxpdHkgPSBlQ1NSX1JPQU1fTElOS19RVUFMX1BPT1JfSU5EOworI2lmICAgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworCS8qIEluZGljYXRlIHRoZSBuZWlnaGJvciByb2FsIGFsZ29yaXRobSBhYm91dCB0aGUgZGlzY29ubmVjdCBpbmRpY2F0aW9uICovCisJY3NyX25laWdoYm9yX3JvYW1faW5kaWNhdGVfZGlzY29ubmVjdChwTWFjLCBzZXNzaW9uSWQpOworI2VuZGlmCisKKwkvKiBSZW1vdmUgdGhpcyBjb2RlIG9uY2UgU0xNX1Nlc3Npb25pemF0aW9uIGlzIHN1cHBvcnRlZCAqLworCS8qIEJNUFNfV09SS0FST1VORF9OT1RfTkVFREVEICovCisJaWYgKCFJU19GRUFUVVJFX1NVUFBPUlRFRF9CWV9GVyhTTE1fU0VTU0lPTklaQVRJT04pICYmCisJICAgIGNzcl9pc19pbmZyYV9hcF9zdGFydGVkKHBNYWMpICYmCisJICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZG9CTVBTV29ya2Fyb3VuZCkgeworCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmRvQk1QU1dvcmthcm91bmQgPSAwOworCX0KKworfQorCit2b2lkIGNzcl9yb2FtX3RsX3N0YXRzX3RpbWVyX2hhbmRsZXIodm9pZCAqcHYpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKHB2KTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLnRpbWVyUnVubmluZyA9IGZhbHNlOworCisJc21zX2xvZyhwTWFjLCBMT0cxLAorCQlGTAorCQkJKCIgVEwgc3RhdCB0aW1lciBpcyBuby1vcC4gSXQgbmVlZHMgdG8gc3VwcG9ydCBtdWx0aXBsZSBzdGF0aW9ucyIpKTsKKworCWlmICghcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby50aW1lclJ1bm5pbmcpIHsKKwkJaWYgKHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8ucGVyaW9kaWNpdHkpIHsKKwkJCS8qIHN0YXJ0IHRpbWVyICovCisJCQlzdGF0dXMgPQorCQkJCWNkZl9tY190aW1lcl9zdGFydCgmcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby4KKwkJCQkJCSAgIGhUbFN0YXRzVGltZXIsCisJCQkJCQkgICBwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLgorCQkJCQkJICAgcGVyaW9kaWNpdHkpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwKKwkJCQkJCSgiY3NyX3JvYW1fdGxfc3RhdHNfdGltZXJfaGFuZGxlcjpjYW5ub3Qgc3RhcnQgVGxTdGF0c1RpbWVyIHRpbWVyIikpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8udGltZXJSdW5uaW5nID0gdHJ1ZTsKKwkJfQorCX0KK30KKwordm9pZCBjc3Jfcm9hbV9wZV9zdGF0c190aW1lcl9oYW5kbGVyKHZvaWQgKnB2KQoreworCXRDc3JQZVN0YXRzUmVxSW5mbyAqcFBlU3RhdHNSZXFMaXN0RW50cnkgPSAodENzclBlU3RhdHNSZXFJbmZvICopIHB2OworCUNERl9TVEFUVVMgc3RhdHVzOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBwUGVTdGF0c1JlcUxpc3RFbnRyeS0+cE1hYzsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJcFBlU3RhdHNSZXFMaXN0RW50cnktPnRpbWVyUnVubmluZyA9IGZhbHNlOworCWlmIChwUGVTdGF0c1JlcUxpc3RFbnRyeS0+dGltZXJTdG9wRmFpbGVkID09IHRydWUpIHsKKwkJLyogSWYgd2UgZW50ZXJlZCBoZXJlLCBtZWFuaW5nIHRoZSB0aW1lciBjb3VsZCBub3QgYmUgc3VjY2Vzc2Z1bGx5ICovCisJCS8qIHN0b3BwZWQgaW4gY3NyX3JvYW1fcmVtb3ZlX2VudHJ5X2Zyb21fcGVfc3RhdHNfcmVxX2xpc3QoKS4gU28gZG8gaXQgaGVyZS4gKi8KKworCQkvKiBEZXN0cm95IHRoZSB0aW1lciAqLworCQljZGZfc3RhdHVzID0KKwkJCWNkZl9tY190aW1lcl9kZXN0cm95KCZwUGVTdGF0c1JlcUxpc3RFbnRyeS0+aFBlU3RhdHNUaW1lcik7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwKKwkJCQkJKCJjc3Jfcm9hbV9wZV9zdGF0c190aW1lcl9oYW5kbGVyOmZhaWxlZCB0byBkZXN0cm95IGhQZVN0YXRzVGltZXIgdGltZXIiKSk7CisJCX0KKwkJLyogRnJlZSB0aGUgZW50cnkgKi8KKwkJY2RmX21lbV9mcmVlKHBQZVN0YXRzUmVxTGlzdEVudHJ5KTsKKwkJcFBlU3RhdHNSZXFMaXN0RW50cnkgPSBOVUxMOworCX0gZWxzZSB7CisJCWlmICghcFBlU3RhdHNSZXFMaXN0RW50cnktPnJzcFBlbmRpbmcpIHsKKwkJCXN0YXR1cyA9CisJCQkJY3NyX3NlbmRfbWJfc3RhdHNfcmVxX21zZyhwTWFjLAorCQkJCQkJCSAgcFBlU3RhdHNSZXFMaXN0RW50cnktPgorCQkJCQkJCSAgc3RhdHNNYXNrICYgfigxIDw8CisJCQkJCQkJCQllQ3NyR2xvYmFsQ2xhc3NEU3RhdHMpLAorCQkJCQkJCSAgcFBlU3RhdHNSZXFMaXN0RW50cnktPnN0YUlkLAorCQkJCQkJCSAgcFBlU3RhdHNSZXFMaXN0RW50cnktPgorCQkJCQkJCSAgc2Vzc2lvbklkKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMCisJCQkJCQkoImNzcl9yb2FtX3BlX3N0YXRzX3RpbWVyX2hhbmRsZXI6ZmFpbGVkIHRvIHNlbmQgZG93biBzdGF0cyByZXEgdG8gUEUiKSk7CisJCQl9IGVsc2UgeworCQkJCXBQZVN0YXRzUmVxTGlzdEVudHJ5LT5yc3BQZW5kaW5nID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQkvKiBzZW5kIGRvd24gYSByZXEgKi8KKwkJaWYgKHBQZVN0YXRzUmVxTGlzdEVudHJ5LT5wZXJpb2RpY2l0eSAmJgorCQkgICAgKENERl9USU1FUl9TVEFURV9TVE9QUEVEID09CisJCSAgICAgY2RmX21jX3RpbWVyX2dldF9jdXJyZW50X3N0YXRlKCZwUGVTdGF0c1JlcUxpc3RFbnRyeS0+CisJCQkJCQkgICAgaFBlU3RhdHNUaW1lcikpKSB7CisJCQlpZiAocFBlU3RhdHNSZXFMaXN0RW50cnktPnBlcmlvZGljaXR5IDwKKwkJCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS4KKwkJCQkJc3RhdHNSZXFQZXJpb2RpY2l0eUluUFMpIHsKKwkJCQlwUGVTdGF0c1JlcUxpc3RFbnRyeS0+cGVyaW9kaWNpdHkgPQorCQkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLgorCQkJCQlzdGF0c1JlcVBlcmlvZGljaXR5SW5QUzsKKwkJCX0KKwkJCS8qIHN0YXJ0IHRpbWVyICovCisJCQljZGZfc3RhdHVzID0KKwkJCQljZGZfbWNfdGltZXJfc3RhcnQoJnBQZVN0YXRzUmVxTGlzdEVudHJ5LT4KKwkJCQkJCSAgIGhQZVN0YXRzVGltZXIsCisJCQkJCQkgICBwUGVTdGF0c1JlcUxpc3RFbnRyeS0+CisJCQkJCQkgICBwZXJpb2RpY2l0eSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwKKwkJCQkJCSgiY3NyX3JvYW1fcGVfc3RhdHNfdGltZXJfaGFuZGxlcjpjYW5ub3Qgc3RhcnQgaFBlU3RhdHNUaW1lciB0aW1lciIpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlwUGVTdGF0c1JlcUxpc3RFbnRyeS0+dGltZXJSdW5uaW5nID0gdHJ1ZTsKKworCQl9CisKKwl9Cit9CisKK3ZvaWQgY3NyX3JvYW1fc3RhdHNfY2xpZW50X3RpbWVyX2hhbmRsZXIodm9pZCAqcHYpCit7CisJdENzclN0YXRzQ2xpZW50UmVxSW5mbyAqcFN0YUVudHJ5ID0gKHRDc3JTdGF0c0NsaWVudFJlcUluZm8gKikgcHY7CisJaWYgKENERl9USU1FUl9TVEFURV9TVE9QUEVEID09CisJICAgIGNkZl9tY190aW1lcl9nZXRfY3VycmVudF9zdGF0ZSgmcFN0YUVudHJ5LT50aW1lcikpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoInJvYW0gc3RhdHMgY2xpZW50IHRpbWVyIGlzIHN0b3BwZWQiKSk7CisJfQorfQorCitDREZfU1RBVFVTIGNzcl9zZW5kX21iX3N0YXRzX3JlcV9tc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc3RhdHNNYXNrLAorCQkJCSAgICAgdWludDhfdCBzdGFJZCwgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdEFuaUdldFBFU3RhdHNSZXEgKnBNc2c7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0QW5pR2V0UEVTdGF0c1JlcSkpOworCWlmIChOVUxMID09IHBNc2cpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbSBmb3Igc3RhdHMgcmVxICIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJLyogbmVlZCB0byBpbml0aWF0ZSBhIHN0YXRzIHJlcXVlc3QgdG8gUEUgKi8KKwlwTXNnLT5tc2dUeXBlID0gZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUkVROworCXBNc2ctPm1zZ0xlbiA9ICh1aW50MTZfdCkgc2l6ZW9mKHRBbmlHZXRQRVN0YXRzUmVxKTsKKwlwTXNnLT5zdGFJZCA9IHN0YUlkOworCXBNc2ctPnN0YXRzTWFzayA9IHN0YXRzTWFzazsKKwlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJGYWlsZWQgdG8gc2VuZCBkb3duIHRoZSBzdGF0cyByZXEgIikpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNzcl91cGRhdGVfc3RhdHMoKSAtIHVwZGF0ZXMgY29ycmVjdCBzdGF0cyBzdHJ1Y3QgaW4gbWFjX2N0eAorICogQG1hYzogICAgICAgICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAc3RhdHNfdHlwZTogICAgICBzdGF0cyB0eXBlCisgKiBAc21lX3N0YXRzX3JzcDogICBzdGF0cyByc3AgbXNnIHBhY2tldAorICogQHN0YXRzOiAgICAgICAgICAgaW5wdXQgc3RhdHMgZGF0YSBidWZmZXIgdG8gZmlsbCBpbiBtYWNfY3R4IHN0cnVjdAorICogQGxlbmd0aDogICAgICAgICAgb3V0IHBhcmFtIC0gc3RhdHMgbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiBmaWxscyBjb3JyZXNwb25kaW5nIHN0YXRzIHN0cnVjdCBpbiBtYWNfY3RzIGJhc2VkIG9uIHN0YXRzIHR5cGUKKyAqIHBhc3NlZAorICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgdm9pZAorY3NyX3VwZGF0ZV9zdGF0cyh0cEFuaVNpckdsb2JhbCBtYWMsIHVpbnQ4X3Qgc3RhdHNfdHlwZSwKKwkJIHRBbmlHZXRQRVN0YXRzUnNwICpzbWVfc3RhdHNfcnNwLAorCQkgdWludDhfdCAqKnN0YXRzLCB1aW50MzJfdCAqbGVuZ3RoKQoreworCXN3aXRjaCAoc3RhdHNfdHlwZSkgeworCWNhc2UgZUNzclN1bW1hcnlTdGF0czoKKwkJc21zX2xvZyhtYWMsIExPRzIsIEZMKCJzdW1tYXJ5IHN0YXRzIikpOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJm1hYy0+cm9hbS5zdW1tYXJ5U3RhdHNJbmZvLCAqc3RhdHMsCisJCQkgICAgIHNpemVvZih0Q3NyU3VtbWFyeVN0YXRzSW5mbykpOworCQkqc3RhdHMgKz0gc2l6ZW9mKHRDc3JTdW1tYXJ5U3RhdHNJbmZvKTsKKwkJKmxlbmd0aCAtPSBzaXplb2YodENzclN1bW1hcnlTdGF0c0luZm8pOworCQlicmVhazsKKwljYXNlIGVDc3JHbG9iYWxDbGFzc0FTdGF0czoKKwkJc21zX2xvZyhtYWMsIExPRzIsIEZMKCJDbGFzc0Egc3RhdHMiKSk7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmbWFjLT5yb2FtLmNsYXNzQVN0YXRzSW5mbywgKnN0YXRzLAorCQkJICAgICBzaXplb2YodENzckdsb2JhbENsYXNzQVN0YXRzSW5mbykpOworCQkqc3RhdHMgKz0gc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0FTdGF0c0luZm8pOworCQkqbGVuZ3RoIC09IHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NBU3RhdHNJbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyR2xvYmFsQ2xhc3NCU3RhdHM6CisJCXNtc19sb2cobWFjLCBMT0cyLCBGTCgiQ2xhc3NCIHN0YXRzIikpOworCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJm1hYy0+cm9hbS5jbGFzc0JTdGF0c0luZm8sICpzdGF0cywKKwkJCSAgICAgc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0JTdGF0c0luZm8pKTsKKwkJKnN0YXRzICs9IHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NCU3RhdHNJbmZvKTsKKwkJKmxlbmd0aCAtPSBzaXplb2YodENzckdsb2JhbENsYXNzQlN0YXRzSW5mbyk7CisJCWJyZWFrOworCWNhc2UgZUNzckdsb2JhbENsYXNzQ1N0YXRzOgorCQlzbXNfbG9nKG1hYywgTE9HMiwgRkwoIkNsYXNzQyBzdGF0cyIpKTsKKwkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZtYWMtPnJvYW0uY2xhc3NDU3RhdHNJbmZvLCAqc3RhdHMsCisJCQkgICAgIHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NDU3RhdHNJbmZvKSk7CisJCSpzdGF0cyArPSBzaXplb2YodENzckdsb2JhbENsYXNzQ1N0YXRzSW5mbyk7CisJCSpsZW5ndGggLT0gc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0NTdGF0c0luZm8pOworCQlicmVhazsKKwljYXNlIGVDc3JQZXJTdGFTdGF0czoKKwkJc21zX2xvZyhtYWMsIExPRzIsIEZMKCJQZXJTdGEgc3RhdHMiKSk7CisJCWlmIChDU1JfTUFYX1NUQSA+IHNtZV9zdGF0c19yc3AtPnN0YUlkKSB7CisJCQljZGZfbWVtX2NvcHkoCisJCQkJJm1hYy0+cm9hbS5wZXJTdGFTdGF0c0luZm9bc21lX3N0YXRzX3JzcC0+c3RhSWRdLAorCQkJCSpzdGF0cywgc2l6ZW9mKHRDc3JQZXJTdGFTdGF0c0luZm8pKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgib3V0IGJvdW5kIHN0YUlkOiVkLiBmYWlsZWQgdG8gY29weSBQZXJTdGEgc3RhdHMiKSwKKwkJCQlzbWVfc3RhdHNfcnNwLT5zdGFJZCk7CisJCQlDREZfQVNTRVJUKDApOworCQl9CisJCSpzdGF0cyArPSBzaXplb2YodENzclBlclN0YVN0YXRzSW5mbyk7CisJCSpsZW5ndGggLT0gc2l6ZW9mKHRDc3JQZXJTdGFTdGF0c0luZm8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbXNfbG9nKG1hYywgTE9HVywgRkwoInVua25vd24gc3RhdHMgdHlwZSIpKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGNzcl9yb2FtX3N0YXRzX3JzcF9wcm9jZXNzb3IoKSAtIHByb2Nlc3NlcyBzdGF0cyByc3AgbXNnCisgKiBAcE1hYyAgICAgICAgICAgICBtYWMgZ2xvYmFsIGNvbnRleHQKKyAqIEBwU2lyTXNnOiAgICAgICAgIGluY29taW5nIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLwordm9pZCBjc3Jfcm9hbV9zdGF0c19yc3BfcHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVSc3AgKnBTaXJNc2cpCit7CisJdEFuaUdldFBFU3RhdHNSc3AgKnBTbWVTdGF0c1JzcDsKKwl0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisJdENzclN0YXRzQ2xpZW50UmVxSW5mbyAqcFRlbXBTdGFFbnRyeSA9IE5VTEw7CisJdENzclBlU3RhdHNSZXFJbmZvICpwUGVTdGFFbnRyeSA9IE5VTEw7CisJdWludDMyX3QgdGVtcE1hc2sgPSAwOworCXVpbnQ4X3QgY291bnRlciA9IDA7CisJdWludDhfdCAqcFN0YXRzID0gTlVMTDsKKwl1aW50MzJfdCBsZW5ndGggPSAwOworCXZvaWQgKnBfY2RzX2djdHg7CisJaW50OF90IHJzc2kgPSAwLCBzbnIgPSAwOworCXVpbnQzMl90ICpwUnNzaSA9IE5VTEwsICpwU25yID0gTlVMTDsKKwl1aW50MzJfdCBsaW5rQ2FwYWNpdHk7CisJcFNtZVN0YXRzUnNwID0gKHRBbmlHZXRQRVN0YXRzUnNwICopIHBTaXJNc2c7CisKKwlpZiAocFNtZVN0YXRzUnNwLT5yYykgeworCQlzbXNfbG9nKHBNYWMsIExPR1csIEZMKCJzdGF0cyByc3AgZnJvbSBQRSBzaG93cyBmYWlsdXJlIikpOworCQlnb3RvIHBvc3RfdXBkYXRlOworCX0KKwl0ZW1wTWFzayA9IHBTbWVTdGF0c1JzcC0+c3RhdHNNYXNrOworCXBTdGF0cyA9ICgodWludDhfdCAqKSAmcFNtZVN0YXRzUnNwLT5zdGF0c01hc2spICsKKwkJc2l6ZW9mKHBTbWVTdGF0c1JzcC0+c3RhdHNNYXNrKTsKKwkvKgorCSAqIHN1YnRyYWN0IGFsbCBzdGF0aXN0aWNzIGZyb20gdGhpcyBsZW5ndGgsIGFuZCBhZnRlciBwcm9jZXNzaW5nIHRoZQorCSAqIGVudGlyZSAnc3RhdCcgcGFydCBvZiB0aGUgbWVzc2FnZSwgaWYgdGhlIGxlbmd0aCBpcyBub3QgemVybywgdGhlbgorCSAqIHJzc2kgaXMgcGlnZ3kgcGFja2VkIGluIHRoaXMgJ3N0YXRzJyBtZXNzYWdlLgorCSAqLworCWxlbmd0aCA9IHBTbWVTdGF0c1JzcC0+bXNnTGVuIC0gc2l6ZW9mKHRBbmlHZXRQRVN0YXRzUnNwKTsKKwkvKiBuZXcgc3RhdHMgaW5mbyBmcm9tIFBFLCBmaWxsIHVwIHRoZSBzdGF0cyBzdHJ1Y3V0cmVzIGluIFBNQUMgKi8KKwl3aGlsZSAodGVtcE1hc2spIHsKKwkJaWYgKHRlbXBNYXNrICYgMSkgeworCQkJY3NyX3VwZGF0ZV9zdGF0cyhwTWFjLCBjb3VudGVyLCBwU21lU3RhdHNSc3AsCisJCQkJCSAmcFN0YXRzLCAmbGVuZ3RoKTsKKwkJfQorCQl0ZW1wTWFzayA+Pj0gMTsKKwkJY291bnRlcisrOworCX0KKwlwX2Nkc19nY3R4ID0gY2RzX2dldF9nbG9iYWxfY29udGV4dCgpOworCWlmIChsZW5ndGggIT0gMCkgeworCQlwUnNzaSA9ICh1aW50MzJfdCAqKSBwU3RhdHM7CisJCXJzc2kgPSAoaW50OF90KSAqcFJzc2k7CisJCXBTdGF0cyArPSBzaXplb2YodWludDMyX3QpOworCQlsZW5ndGggLT0gc2l6ZW9mKHVpbnQzMl90KTsKKwl9IGVsc2UgeworCQkvKiBJZiByaXZhIGlzIG5vdCBzZW5kaW5nIHJzc2ksIGNvbnRpbnVlIHRvIHVzZSB0aGUgaGFjayAqLworCQlyc3NpID0gUlNTSV9IQUNLX0JNUFM7CisJfQorCisJaWYgKGxlbmd0aCAhPSAwKSB7CisJCWxpbmtDYXBhY2l0eSA9ICoodWludDMyX3QgKikgcFN0YXRzOworCQlwU3RhdHMgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJbGVuZ3RoIC09IHNpemVvZih1aW50MzJfdCk7CisJfSBlbHNlIHsKKwkJbGlua0NhcGFjaXR5ID0gMDsKKwl9CisKKwlpZiAobGVuZ3RoICE9IDApIHsKKwkJcFNuciA9ICh1aW50MzJfdCAqKSBwU3RhdHM7CisJCXNuciA9IChpbnQ4X3QpICpwU25yOworCX0gZWxzZSB7CisJCXNuciA9IFNOUl9IQUNLX0JNUFM7CisJfQorCitwb3N0X3VwZGF0ZToKKwkvKiBtYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSBwZSBzdGF0cyByZXEgbGlzdCAqLworCXBFbnRyeSA9IGNzcl9yb2FtX2ZpbmRfaW5fcGVfc3RhdHNfcmVxX2xpc3QocE1hYywgcFNtZVN0YXRzUnNwLT5zdGF0c01hc2spOworCWlmIChwRW50cnkpIHsKKwkJcFBlU3RhRW50cnkgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclBlU3RhdHNSZXFJbmZvLCBsaW5rKTsKKwkJcFBlU3RhRW50cnktPnJzcFBlbmRpbmcgPSBmYWxzZTsKKworCX0KKwkvKiBjaGVjayB0aGUgb25lIHRpbWVyIGNhc2VzICovCisJcEVudHJ5ID0gY3NyX3JvYW1fY2hlY2tfY2xpZW50X3JlcV9saXN0KHBNYWMsIHBTbWVTdGF0c1JzcC0+c3RhdHNNYXNrKTsKKwlpZiAocEVudHJ5KSB7CisJCXBUZW1wU3RhRW50cnkgPQorCQkJR0VUX0JBU0VfQUREUihwRW50cnksIHRDc3JTdGF0c0NsaWVudFJlcUluZm8sIGxpbmspOworCQlpZiAocFRlbXBTdGFFbnRyeS0+dGltZXJFeHBpcmVkKSB7CisJCQkvKiBzZW5kIHVwIHRoZSBzdGF0cyByZXBvcnQgKi8KKwkJCWNzcl9yb2FtX3JlcG9ydF9zdGF0aXN0aWNzKHBNYWMsIHBUZW1wU3RhRW50cnktPnN0YXRzTWFzaywKKwkJCQkJCSAgIHBUZW1wU3RhRW50cnktPmNhbGxiYWNrLAorCQkJCQkJICAgcFRlbXBTdGFFbnRyeS0+c3RhSWQsCisJCQkJCQkgICBwVGVtcFN0YUVudHJ5LT5wQ29udGV4dCk7CisJCQkvKiBhbHNvIHJlbW92ZSBmcm9tIHRoZSBjbGllbnQgbGlzdCAqLworCQkJY3NyX3JvYW1fcmVtb3ZlX3N0YXRfbGlzdF9lbnRyeShwTWFjLCBwRW50cnkpOworCQkJcFRlbXBTdGFFbnRyeSA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3RMaXN0RWxlbSAqY3NyX3JvYW1fZmluZF9pbl9wZV9zdGF0c19yZXFfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzdGF0c01hc2spCit7CisJdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworCXRDc3JQZVN0YXRzUmVxSW5mbyAqcFRlbXBTdGFFbnRyeSA9IE5VTEw7CisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+cm9hbS5wZVN0YXRzUmVxTGlzdCwgTExfQUNDRVNTX0xPQ0spOworCWlmICghcEVudHJ5KSB7CisJCS8qIGxpc3QgZW1wdHkgKi8KKwkJc21zX2xvZyhwTWFjLCBMT0cyLAorCQkJImNzcl9yb2FtX2ZpbmRfaW5fcGVfc3RhdHNfcmVxX2xpc3Q6IExpc3QgZW1wdHksIG5vIHJlcXVlc3QgdG8gUEUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXdoaWxlIChwRW50cnkpIHsKKwkJcFRlbXBTdGFFbnRyeSA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0Q3NyUGVTdGF0c1JlcUluZm8sIGxpbmspOworCQlpZiAocFRlbXBTdGFFbnRyeS0+c3RhdHNNYXNrID09IHN0YXRzTWFzaykgeworCQkJc21zX2xvZyhwTWFjLCBMT0czLAorCQkJCSJjc3Jfcm9hbV9maW5kX2luX3BlX3N0YXRzX3JlcV9saXN0OiBtYXRjaCBmb3VuZCIpOworCQkJYnJlYWs7CisJCX0KKwkJcEVudHJ5ID0KKwkJCWNzcl9sbF9uZXh0KCZwTWFjLT5yb2FtLnBlU3RhdHNSZXFMaXN0LCBwRW50cnksCisJCQkJICAgIExMX0FDQ0VTU19OT0xPQ0spOworCX0KKwlyZXR1cm4gcEVudHJ5OworfQorCit0TGlzdEVsZW0gKmNzcl9yb2FtX2NoZWNrbl91cGRhdGVfY2xpZW50X3JlcV9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgIHRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnBTdGFFbnRyeSwKKwkJCQkJCSAgYm9vbCB1cGRhdGUpCit7CisJdExpc3RFbGVtICpwRW50cnk7CisJdENzclN0YXRzQ2xpZW50UmVxSW5mbyAqcFRlbXBTdGFFbnRyeTsKKwlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwTWFjLT5yb2FtLnN0YXRzQ2xpZW50UmVxTGlzdCwgTExfQUNDRVNTX0xPQ0spOworCWlmICghcEVudHJ5KSB7CisJCS8qIGxpc3QgZW1wdHkgKi8KKwkJc21zX2xvZyhwTWFjLCBMT0cyLAorCQkJImNzcl9yb2FtX2NoZWNrbl91cGRhdGVfY2xpZW50X3JlcV9saXN0OiBMaXN0IGVtcHR5LCBubyByZXF1ZXN0IGZyb20gIgorCQkJInVwcGVyIGxheWVyIGNsaWVudChzKSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJd2hpbGUgKHBFbnRyeSkgeworCQlwVGVtcFN0YUVudHJ5ID0KKwkJCUdFVF9CQVNFX0FERFIocEVudHJ5LCB0Q3NyU3RhdHNDbGllbnRSZXFJbmZvLCBsaW5rKTsKKwkJaWYgKChwVGVtcFN0YUVudHJ5LT5yZXF1ZXN0ZXJJZCA9PSBwU3RhRW50cnktPnJlcXVlc3RlcklkKQorCQkgICAgJiYgKHBUZW1wU3RhRW50cnktPnN0YXRzTWFzayA9PSBwU3RhRW50cnktPnN0YXRzTWFzaykpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HMywKKwkJCQkiY3NyX3JvYW1fY2hlY2tuX3VwZGF0ZV9jbGllbnRfcmVxX2xpc3Q6IG1hdGNoIGZvdW5kIik7CisJCQlpZiAodXBkYXRlKSB7CisJCQkJcFRlbXBTdGFFbnRyeS0+cGVyaW9kaWNpdHkgPQorCQkJCQlwU3RhRW50cnktPnBlcmlvZGljaXR5OworCQkJCXBUZW1wU3RhRW50cnktPmNhbGxiYWNrID0gcFN0YUVudHJ5LT5jYWxsYmFjazsKKwkJCQlwVGVtcFN0YUVudHJ5LT5wQ29udGV4dCA9IHBTdGFFbnRyeS0+cENvbnRleHQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlwRW50cnkgPQorCQkJY3NyX2xsX25leHQoJnBNYWMtPnJvYW0uc3RhdHNDbGllbnRSZXFMaXN0LCBwRW50cnksCisJCQkJICAgIExMX0FDQ0VTU19OT0xPQ0spOworCX0KKwlyZXR1cm4gcEVudHJ5OworfQorCit0TGlzdEVsZW0gKmNzcl9yb2FtX2NoZWNrX2NsaWVudF9yZXFfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzdGF0c01hc2spCit7CisJdExpc3RFbGVtICpwRW50cnk7CisJdENzclN0YXRzQ2xpZW50UmVxSW5mbyAqcFRlbXBTdGFFbnRyeTsKKwlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwTWFjLT5yb2FtLnN0YXRzQ2xpZW50UmVxTGlzdCwgTExfQUNDRVNTX0xPQ0spOworCWlmICghcEVudHJ5KSB7CisJCS8qIGxpc3QgZW1wdHkgKi8KKwkJc21zX2xvZyhwTWFjLCBMT0cyLAorCQkJImNzcl9yb2FtX2NoZWNrX2NsaWVudF9yZXFfbGlzdDogTGlzdCBlbXB0eSwgbm8gcmVxdWVzdCBmcm9tICIKKwkJCSJ1cHBlciBsYXllciBjbGllbnQocykiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXdoaWxlIChwRW50cnkpIHsKKwkJcFRlbXBTdGFFbnRyeSA9CisJCQlHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclN0YXRzQ2xpZW50UmVxSW5mbywgbGluayk7CisJCWlmICgocFRlbXBTdGFFbnRyeS0+CisJCSAgICAgc3RhdHNNYXNrICYgfigxIDw8IGVDc3JHbG9iYWxDbGFzc0RTdGF0cykpID09IHN0YXRzTWFzaykgeworCQkJc21zX2xvZyhwTWFjLCBMT0czLAorCQkJCSJjc3Jfcm9hbV9jaGVja19jbGllbnRfcmVxX2xpc3Q6IG1hdGNoIGZvdW5kIik7CisJCQlicmVhazsKKwkJfQorCQlwRW50cnkgPQorCQkJY3NyX2xsX25leHQoJnBNYWMtPnJvYW0uc3RhdHNDbGllbnRSZXFMaXN0LCBwRW50cnksCisJCQkJICAgIExMX0FDQ0VTU19OT0xPQ0spOworCX0KKwlyZXR1cm4gcEVudHJ5OworfQorCit2b2lkIGNzcl9yb2FtX3ZjY190cmlnZ2VyKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJZUNzclJvYW1MaW5rUXVhbGl0eUluZCBuZXdWY2NMaW5rUXVhbGl0eTsKKwl1aW50MzJfdCB1bF9tYWNfbG9zcyA9IDA7CisJdWludDMyX3QgdWxfbWFjX2xvc3NfdHJpZ2dlcl90aHJlc2hvbGQ7CisJLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICBMaW5rIHF1YWxpdHkgaXMgY3VycmVudGx5IGJpbmFyeSBiYXNlZCBvbiBPQklXQU4gcmVjb21tZW5kZWQgdHJpZ2dlcnMKKwkgICBDaGVjayBmb3IgYSBjaGFuZ2UgaW4gbGluayBxdWFsaXR5IGFuZCBub3RpZnkgY2xpZW50IGlmIG5lY2Vzc2FyeQorCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXVsX21hY19sb3NzX3RyaWdnZXJfdGhyZXNob2xkID0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS52Y2NVbE1hY0xvc3NUaHJlc2hvbGQ7CisJaWYgKDAgPT0gdWxfbWFjX2xvc3NfdHJpZ2dlcl90aHJlc2hvbGQpIHsKKwkJQ0RGX0FTU0VSVCh1bF9tYWNfbG9zc190cmlnZ2VyX3RocmVzaG9sZCAhPSAwKTsKKwkJcmV0dXJuOworCX0KKwlzbXNfbG9nKHBNYWMsIExPR1csICJjc3Jfcm9hbV92Y2NfdHJpZ2dlcjogVUxfTUFDX0xPU1NfVEhSRVNIT0xEIGlzICVkIiwKKwkJdWxfbWFjX2xvc3NfdHJpZ2dlcl90aHJlc2hvbGQpOworCWlmICh1bF9tYWNfbG9zc190cmlnZ2VyX3RocmVzaG9sZCA8IHVsX21hY19sb3NzKSB7CisJCXNtc19sb2cocE1hYywgTE9HVywgImNzcl9yb2FtX3ZjY190cmlnZ2VyOiBsaW5rIHF1YWxpdHkgaXMgUE9PUiAiKTsKKwkJbmV3VmNjTGlua1F1YWxpdHkgPSBlQ1NSX1JPQU1fTElOS19RVUFMX1BPT1JfSU5EOworCX0gZWxzZSB7CisJCXNtc19sb2cocE1hYywgTE9HVywgImNzcl9yb2FtX3ZjY190cmlnZ2VyOiBsaW5rIHF1YWxpdHkgaXMgR09PRCIpOworCQluZXdWY2NMaW5rUXVhbGl0eSA9IGVDU1JfUk9BTV9MSU5LX1FVQUxfR09PRF9JTkQ7CisJfQorCXNtc19sb2cocE1hYywgTE9HVywKKwkJImNzcl9yb2FtX3ZjY190cmlnZ2VyOiBsaW5rIHF1YWwgOiAqKiogVUxfTUFDX0xPU1MgJWQgKioqICIsCisJCXVsX21hY19sb3NzKTsKKwlpZiAobmV3VmNjTGlua1F1YWxpdHkgIT0gcE1hYy0+cm9hbS52Y2NMaW5rUXVhbGl0eSkgeworCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkiY3NyX3JvYW1fdmNjX3RyaWdnZXI6IGxpbmsgcXVhbGl0eSBjaGFuZ2VkOiB0cmlnZ2VyIG5lY2Vzc2FyeSIpOworCQlpZiAoTlVMTCAhPSBwTWFjLT5yb2FtLmxpbmtRdWFsaXR5SW5kSW5mby5jYWxsYmFjaykgeworCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCSJjc3Jfcm9hbV92Y2NfdHJpZ2dlcjogbGluayBxdWFsaXR5IGluZGljYXRpb24gJWQiLAorCQkJCW5ld1ZjY0xpbmtRdWFsaXR5KTsKKworCQkJLyogd2Ugbm93IGludm9rZSB0aGUgY2FsbGJhY2sgb25jZSB0byBub3RpZnkgY2xpZW50IG9mIGluaXRpYWwgdmFsdWUgICAqLworCQkJcE1hYy0+cm9hbS5saW5rUXVhbGl0eUluZEluZm8uCisJCQljYWxsYmFjayhuZXdWY2NMaW5rUXVhbGl0eSwKKwkJCQkgcE1hYy0+cm9hbS5saW5rUXVhbGl0eUluZEluZm8uY29udGV4dCk7CisJCQkvKiBldmVudDogRVZFTlRfV0xBTl9WQ0MgKi8KKwkJfQorCX0KKwlwTWFjLT5yb2FtLnZjY0xpbmtRdWFsaXR5ID0gbmV3VmNjTGlua1F1YWxpdHk7CisKK30KKwordENzclN0YXRzQ2xpZW50UmVxSW5mbyAqY3NyX3JvYW1faW5zZXJ0X2VudHJ5X2ludG9fbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJCXREYmxMaW5rTGlzdCAqcFN0YUxpc3QsCisJCQkJCQkJdENzclN0YXRzQ2xpZW50UmVxSW5mbyAqCisJCQkJCQkJcFN0YUVudHJ5KQoreworCXRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnBOZXdTdGFFbnRyeSA9IE5VTEw7CisJLyogaWYgc2FtZSBlbnRpdHkgcmVxdWVzdGVkIGZvciBzYW1lIHNldCBvZiBzdGF0cyB3aXRoIGRpZmZlcmVudCBwZXJpb2RpY2l0eSAmICovCisJLyogY2FsbGJhY2sgdXBkYXRlIGl0ICovCisJaWYgKE5VTEwgPT0gY3NyX3JvYW1fY2hlY2tuX3VwZGF0ZV9jbGllbnRfcmVxX2xpc3QocE1hYywgcFN0YUVudHJ5LCB0cnVlKSkgeworCisJCXBOZXdTdGFFbnRyeSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0Q3NyU3RhdHNDbGllbnRSZXFJbmZvKSk7CisJCWlmIChOVUxMID09IHBOZXdTdGFFbnRyeSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCSJjc3Jfcm9hbV9pbnNlcnRfZW50cnlfaW50b19saXN0OiBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSAiCisJCQkJImVudHJ5Iik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCXBOZXdTdGFFbnRyeS0+Y2FsbGJhY2sgPSBwU3RhRW50cnktPmNhbGxiYWNrOworCQlwTmV3U3RhRW50cnktPnBDb250ZXh0ID0gcFN0YUVudHJ5LT5wQ29udGV4dDsKKwkJcE5ld1N0YUVudHJ5LT5wZXJpb2RpY2l0eSA9IHBTdGFFbnRyeS0+cGVyaW9kaWNpdHk7CisJCXBOZXdTdGFFbnRyeS0+cmVxdWVzdGVySWQgPSBwU3RhRW50cnktPnJlcXVlc3RlcklkOworCQlwTmV3U3RhRW50cnktPnN0YXRzTWFzayA9IHBTdGFFbnRyeS0+c3RhdHNNYXNrOworCQlwTmV3U3RhRW50cnktPnBQZVN0YUVudHJ5ID0gcFN0YUVudHJ5LT5wUGVTdGFFbnRyeTsKKwkJcE5ld1N0YUVudHJ5LT5wTWFjID0gcFN0YUVudHJ5LT5wTWFjOworCQlwTmV3U3RhRW50cnktPnN0YUlkID0gcFN0YUVudHJ5LT5zdGFJZDsKKwkJcE5ld1N0YUVudHJ5LT50aW1lckV4cGlyZWQgPSBwU3RhRW50cnktPnRpbWVyRXhwaXJlZDsKKworCQljc3JfbGxfaW5zZXJ0X3RhaWwocFN0YUxpc3QsICZwTmV3U3RhRW50cnktPmxpbmssIExMX0FDQ0VTU19MT0NLKTsKKwl9CisJcmV0dXJuIHBOZXdTdGFFbnRyeTsKK30KKwordENzclBlU3RhdHNSZXFJbmZvICpjc3Jfcm9hbV9pbnNlcnRfZW50cnlfaW50b19wZV9zdGF0c19yZXFfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJCQkgdERibExpbmtMaXN0ICoKKwkJCQkJCQkJIHBTdGFMaXN0LAorCQkJCQkJCQkgdENzclBlU3RhdHNSZXFJbmZvICoKKwkJCQkJCQkJIHBTdGFFbnRyeSkKK3sKKwl0Q3NyUGVTdGF0c1JlcUluZm8gKnBOZXdTdGFFbnRyeSA9IE5VTEw7CisJcE5ld1N0YUVudHJ5ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JQZVN0YXRzUmVxSW5mbykpOworCWlmIChOVUxMID09IHBOZXdTdGFFbnRyeSkgeworCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkiY3NyX3JvYW1faW5zZXJ0X2VudHJ5X2ludG9fcGVfc3RhdHNfcmVxX2xpc3Q6IGNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlICIKKwkJCSJlbnRyeSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwTmV3U3RhRW50cnktPmhQZVN0YXRzVGltZXIgPSBwU3RhRW50cnktPmhQZVN0YXRzVGltZXI7CisJcE5ld1N0YUVudHJ5LT5udW1DbGllbnQgPSBwU3RhRW50cnktPm51bUNsaWVudDsKKwlwTmV3U3RhRW50cnktPnBlcmlvZGljaXR5ID0gcFN0YUVudHJ5LT5wZXJpb2RpY2l0eTsKKwlwTmV3U3RhRW50cnktPnN0YXRzTWFzayA9IHBTdGFFbnRyeS0+c3RhdHNNYXNrOworCXBOZXdTdGFFbnRyeS0+cE1hYyA9IHBTdGFFbnRyeS0+cE1hYzsKKwlwTmV3U3RhRW50cnktPnN0YUlkID0gcFN0YUVudHJ5LT5zdGFJZDsKKwlwTmV3U3RhRW50cnktPnRpbWVyUnVubmluZyA9IHBTdGFFbnRyeS0+dGltZXJSdW5uaW5nOworCXBOZXdTdGFFbnRyeS0+cnNwUGVuZGluZyA9IHBTdGFFbnRyeS0+cnNwUGVuZGluZzsKKworCWNzcl9sbF9pbnNlcnRfdGFpbChwU3RhTGlzdCwgJnBOZXdTdGFFbnRyeS0+bGluaywgTExfQUNDRVNTX0xPQ0spOworCXJldHVybiBwTmV3U3RhRW50cnk7Cit9CisKK0NERl9TVEFUVVMgY3NyX2dldF9yc3NpKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQl0Q3NyUnNzaUNhbGxiYWNrIGNhbGxiYWNrLAorCQkJdWludDhfdCBzdGFJZCwKKwkJCXN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzSWQsCisJCQlpbnQ4X3QgbGFzdFJTU0ksIHZvaWQgKnBDb250ZXh0LCB2b2lkICpwX2Nkc19jb250ZXh0KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWNkc19tc2dfdCBtc2c7CisJdWludDMyX3Qgc2Vzc2lvbklkOworCisJdEFuaUdldFJzc2lSZXEgKnBNc2c7CisJc21zX2xvZyhwTWFjLCBMT0cyLCBGTCgiY2FsbGVkIikpOworCisJc3RhdHVzID0gY3NyX3JvYW1fZ2V0X3Nlc3Npb25faWRfZnJvbV9ic3NpZChwTWFjLCAmYnNzSWQsICZzZXNzaW9uSWQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJY2FsbGJhY2sobGFzdFJTU0ksIHN0YUlkLCBwQ29udGV4dCk7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBnZXQgU2Vzc2lvbklkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0QW5pR2V0UnNzaVJlcSkpOworCWlmIChOVUxMID09IHBNc2cpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJIiBjc3JfZ2V0X3Jzc2k6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW0gZm9yIHJlcSAiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlwTXNnLT5tc2dUeXBlID0gZVdOSV9TTUVfR0VUX1JTU0lfUkVROworCXBNc2ctPm1zZ0xlbiA9ICh1aW50MTZfdCkgc2l6ZW9mKHRBbmlHZXRSc3NpUmVxKTsKKwlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJcE1zZy0+c3RhSWQgPSBzdGFJZDsKKwlwTXNnLT5yc3NpQ2FsbGJhY2sgPSBjYWxsYmFjazsKKwlwTXNnLT5wRGV2Q29udGV4dCA9IHBDb250ZXh0OworCXBNc2ctPnBfY2RzX2NvbnRleHQgPSBwX2Nkc19jb250ZXh0OworCS8qCisJICogc3RvcmUgUlNTSSBhdCB0aW1lIG9mIGNhbGxpbmcsIHNvIHRoYXQgaWYgUlNTSSByZXF1ZXN0IGNhbm5vdAorCSAqIGJlIHNlbnQgdG8gZmlybXdhcmUsIHRoaXMgdmFsdWUgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5CisJICovCisJcE1zZy0+bGFzdFJTU0kgPSBsYXN0UlNTSTsKKwltc2cudHlwZSA9IGVXTklfU01FX0dFVF9SU1NJX1JFUTsKKwltc2cuYm9keXB0ciA9IHBNc2c7CisJbXNnLnJlc2VydmVkID0gMDsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1NNRSwgJm1zZykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCAiIGNzcl9nZXRfcnNzaSBmYWlsZWQgdG8gcG9zdCBtc2cgdG8gc2VsZiAiKTsKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopcE1zZyk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlzbXNfbG9nKHBNYWMsIExPRzIsIEZMKCJyZXR1cm5lZCIpKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9nZXRfc25yKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCSAgICAgICB0Q3NyU25yQ2FsbGJhY2sgY2FsbGJhY2ssCisJCSAgICAgICB1aW50OF90IHN0YUlkLCBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkLCB2b2lkICpwQ29udGV4dCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwljZHNfbXNnX3QgbXNnOworCXVpbnQzMl90IHNlc3Npb25JZDsKKworCXRBbmlHZXRTbnJSZXEgKnBNc2c7CisKKwlzbXNfbG9nKHBNYWMsIExPRzIsIEZMKCJjYWxsZWQiKSk7CisKKwlwTXNnID0gKHRBbmlHZXRTbnJSZXEgKikgY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBbmlHZXRTbnJSZXEpKTsKKwlpZiAoTlVMTCA9PSBwTXNnKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtIGZvciByZXEiLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNzcl9yb2FtX2dldF9zZXNzaW9uX2lkX2Zyb21fYnNzaWQocE1hYywgJmJzc0lkLCAmc2Vzc2lvbklkKTsKKworCXBNc2ctPm1zZ1R5cGUgPSBlV05JX1NNRV9HRVRfU05SX1JFUTsKKwlwTXNnLT5tc2dMZW4gPSAodWludDE2X3QpIHNpemVvZih0QW5pR2V0U25yUmVxKTsKKwlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJcE1zZy0+c3RhSWQgPSBzdGFJZDsKKwlwTXNnLT5zbnJDYWxsYmFjayA9IGNhbGxiYWNrOworCXBNc2ctPnBEZXZDb250ZXh0ID0gcENvbnRleHQ7CisJbXNnLnR5cGUgPSBlV05JX1NNRV9HRVRfU05SX1JFUTsKKwltc2cuYm9keXB0ciA9IHBNc2c7CisJbXNnLnJlc2VydmVkID0gMDsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfU01FLCAmbXNnKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsICIlcyBmYWlsZWQgdG8gcG9zdCBtc2cgdG8gc2VsZiIsIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopcE1zZyk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXNtc19sb2cocE1hYywgTE9HMiwgRkwoInJldHVybmVkIikpOworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCitDREZfU1RBVFVTIGNzcl9nZXRfdHNtX3N0YXRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgIHRDc3JUc21TdGF0c0NhbGxiYWNrIGNhbGxiYWNrLAorCQkJICAgICB1aW50OF90IHN0YUlkLAorCQkJICAgICBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkLAorCQkJICAgICB2b2lkICpwQ29udGV4dCwgdm9pZCAqcF9jZHNfY29udGV4dCwgdWludDhfdCB0aWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdEFuaUdldFRzbVN0YXRzUmVxICpwTXNnID0gTlVMTDsKKwlwTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBbmlHZXRUc21TdGF0c1JlcSkpOworCWlmICghcE1zZykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiY3NyX2dldF90c21fc3RhdHM6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW0gZm9yIHJlcSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwkvKiBuZWVkIHRvIGluaXRpYXRlIGEgc3RhdHMgcmVxdWVzdCB0byBQRSAqLworCXBNc2ctPm1zZ1R5cGUgPSBlV05JX1NNRV9HRVRfVFNNX1NUQVRTX1JFUTsKKwlwTXNnLT5tc2dMZW4gPSAodWludDE2X3QpIHNpemVvZih0QW5pR2V0VHNtU3RhdHNSZXEpOworCXBNc2ctPnN0YUlkID0gc3RhSWQ7CisJcE1zZy0+dGlkID0gdGlkOworCWNkZl9tZW1fY29weShwTXNnLT5ic3NJZCwgYnNzSWQuYnl0ZXMsIHNpemVvZih0U2lyTWFjQWRkcikpOworCXBNc2ctPnRzbVN0YXRzQ2FsbGJhY2sgPSBjYWxsYmFjazsKKwlwTXNnLT5wRGV2Q29udGV4dCA9IHBDb250ZXh0OworCXBNc2ctPnBfY2RzX2NvbnRleHQgPSBwX2Nkc19jb250ZXh0OworCXN0YXR1cyA9IGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKHBNc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJIiBjc3JfZ2V0X3RzbV9zdGF0czogZmFpbGVkIHRvIHNlbmQgZG93biB0aGUgcnNzaSByZXEiKTsKKwkJLyogcE1zZyBpcyBmcmVlZCBieSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyAqLworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisKKy8qKgorICogY3NyX2RlcmVnaXN0ZXJfY2xpZW50X3JlcXVlc3QoKSAtIGRlcmVnaXN0ZXJzIGEgZ2V0IHN0YXRzIHJlcXVlc3QKKyAqIEBtYWNfY3R4OiAgICAgICBtYWMgZ2xvYmFsIGNvbnRleHQKKyAqIEBzdGFfZW50cnk6ICAgICBzdGF0cyByZXF1ZXN0IGVudHJ5CisgKgorICogUmV0dXJuOiBzdGF0dXMgb2Ygb3BlcmF0aW9uCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTCitjc3JfZGVyZWdpc3Rlcl9jbGllbnRfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJICAgICAgdENzclN0YXRzQ2xpZW50UmVxSW5mbyAqc3RhX2VudHJ5KQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRMaXN0RWxlbSAqZW50cnkgPSBOVUxMOworCXRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnB0cl9zdGFfZW50cnkgPSBOVUxMOworCisJZW50cnkgPSBjc3Jfcm9hbV9jaGVja25fdXBkYXRlX2NsaWVudF9yZXFfbGlzdChtYWNfY3R4LCBzdGFfZW50cnksCisJCQkJCQkgICAgICBmYWxzZSk7CisJaWYgKCFlbnRyeSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiY2FsbGJhY2sgaXMgZW1wdHkgaW4gdGhlIHJlcXVlc3QgJiBjb3VsZG4ndCBmaW5kIGFueSBleGlzdGluZyByZXF1ZXN0IGluIHN0YXRzQ2xpZW50UmVxTGlzdCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwkvKiBjbGVhbiB1cCAmIHJldHVybiAqLworCXB0cl9zdGFfZW50cnkgPSBHRVRfQkFTRV9BRERSKGVudHJ5LCB0Q3NyU3RhdHNDbGllbnRSZXFJbmZvLCBsaW5rKTsKKwlpZiAoTlVMTCAhPSBwdHJfc3RhX2VudHJ5LT5wUGVTdGFFbnRyeSkgeworCQlwdHJfc3RhX2VudHJ5LT5wUGVTdGFFbnRyeS0+bnVtQ2xpZW50LS07CisJCS8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBlbnRyeSBmcm9tIHBlU3RhdHNSZXFMaXN0ICovCisJCWlmICghcHRyX3N0YV9lbnRyeS0+cFBlU3RhRW50cnktPm51bUNsaWVudCkKKwkJCWNzcl9yb2FtX3JlbW92ZV9lbnRyeV9mcm9tX3BlX3N0YXRzX3JlcV9saXN0KG1hY19jdHgsCisJCQkJCQlwdHJfc3RhX2VudHJ5LT5wUGVTdGFFbnRyeSk7CisJfQorCS8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gc3RvcCB0aGUgdGwgc3RhdHMgdGltZXIgdG9vICovCisJbWFjX2N0eC0+cm9hbS50bFN0YXRzUmVxSW5mby5udW1DbGllbnQtLTsKKwlpZiAoIW1hY19jdHgtPnJvYW0udGxTdGF0c1JlcUluZm8ubnVtQ2xpZW50KSB7CisJCWlmIChtYWNfY3R4LT5yb2FtLnRsU3RhdHNSZXFJbmZvLnRpbWVyUnVubmluZykgeworCQkJc3RhdHVzID0gY2RmX21jX3RpbWVyX3N0b3AoCisJCQkJJm1hY19jdHgtPnJvYW0udGxTdGF0c1JlcUluZm8uaFRsU3RhdHNUaW1lcik7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiY2Fubm90IHN0b3AgVGxTdGF0c1RpbWVyIHRpbWVyIikpOworCQkJCXJldHVybiBzdGF0dXM7CisJCQl9CisJCX0KKwkJbWFjX2N0eC0+cm9hbS50bFN0YXRzUmVxSW5mby5wZXJpb2RpY2l0eSA9IDA7CisJCW1hY19jdHgtPnJvYW0udGxTdGF0c1JlcUluZm8udGltZXJSdW5uaW5nID0gZmFsc2U7CisJfQorCWNkZl9tY190aW1lcl9zdG9wKCZwdHJfc3RhX2VudHJ5LT50aW1lcik7CisJLyogRGVzdHJveSB0aGUgY2RmIHRpbWVyLi4uICovCisJc3RhdHVzID0gY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnB0cl9zdGFfZW50cnktPnRpbWVyKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiZmFpbGVkIHRvIGRlc3Ryb3kgQ2xpZW50IHJlcSB0aW1lciIpKTsKKworCWNzcl9yb2FtX3JlbW92ZV9zdGF0X2xpc3RfZW50cnkobWFjX2N0eCwgZW50cnkpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY3NyX2luc2VydF9zdGF0c19yZXF1ZXN0X3RvX2xpc3QoKSAtIGluc2VydHMgcmVxdWVzdCB0byBleGlzdGluZyBsaXN0CisgKiBAbWFjX2N0eDogICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAc3RhX2VudHJ5OiAgICAgc3RhdHMgcmVxdWVzdCBlbnRyeQorICogQHBlcmlvZGljaXR5OiAgIHBlcmlvZGljaXR5IG9mIHN0YXRzCisgKgorICogUmV0dXJuOiBzdGF0dXMgb2Ygb3BlcmF0aW9uCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTCitjc3JfaW5zZXJ0X3N0YXRzX3JlcXVlc3RfdG9fbGlzdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCSB0Q3NyU3RhdHNDbGllbnRSZXFJbmZvICpzdGFfZW50cnksCisJCQkJIHVpbnQzMl90IHBlcmlvZGljaXR5KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnB0cl9zdGFfZW50cnkgPSBjc3Jfcm9hbV9pbnNlcnRfZW50cnlfaW50b19saXN0KAorCQkJCW1hY19jdHgsICZtYWNfY3R4LT5yb2FtLnN0YXRzQ2xpZW50UmVxTGlzdCwKKwkJCQlzdGFfZW50cnkpOworCWlmICghcHRyX3N0YV9lbnRyeSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQlGTCgiRmFpbGVkIHRvIGluc2VydCByZXEgaW4gc3RhdHNDbGllbnRSZXFMaXN0IikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIEluaXQgJiBzdGFydCB0aW1lciBpZiBuZWVkZWQgKi8KKwlwdHJfc3RhX2VudHJ5LT5wZXJpb2RpY2l0eSA9IHBlcmlvZGljaXR5OworCWlmIChwdHJfc3RhX2VudHJ5LT5wZXJpb2RpY2l0eSkgeworCQlzdGF0dXMgPSBjZGZfbWNfdGltZXJfaW5pdCgmcHRyX3N0YV9lbnRyeS0+dGltZXIsCisJCQkJCUNERl9USU1FUl9UWVBFX1NXLAorCQkJCQljc3Jfcm9hbV9zdGF0c19jbGllbnRfdGltZXJfaGFuZGxlciwKKwkJCQkJcHRyX3N0YV9lbnRyeSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiY2Fubm90IGluaXQgU3RhdHNDbGllbnQgdGltZXIiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJc3RhdHVzID0gY2RmX21jX3RpbWVyX3N0YXJ0KCZwdHJfc3RhX2VudHJ5LT50aW1lciwKKwkJCQkJICAgIHB0cl9zdGFfZW50cnktPnBlcmlvZGljaXR5KTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJjYW5ub3Qgc3RhcnQgU3RhdHNDbGllbnQgdGltZXIiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3JfZ2V0X3N0YXRpc3RpY3NfZnJvbV90bCgpIC0gZmV0Y2ggc3RhdHMgZnJvbSB0bCBsYXllcgorICogQG1hY19jdHg6ICAgICAgIG1hYyBnbG9iYWwgY29udGV4dAorICogQGNhY2hlOiAgICAgICAgIGluZGljYXRlIGlmIGNhY2hlZCBzdGF0cyBhcmUgcmVxdWlyZWQKKyAqIEBzdGFJZDogICAgICAgICBzdGF0aW9uIGlkCisgKiBAcGVyaW9kaWNpdHk6ICAgcGVyaW9kaWNpdHkgb2Ygc3RhdHMKKyAqCisgKiBSZXR1cm46IHN0YXR1cyBvZiBvcGVyYXRpb24KKyAqLworc3RhdGljIENERl9TVEFUVVMKK2Nzcl9nZXRfc3RhdGlzdGljc19mcm9tX3RsKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkgICBib29sIGNhY2hlLAorCQkJICAgdWludDhfdCBzdGFJZCwKKwkJCSAgIHVpbnQzMl90IHBlcmlvZGljaXR5KQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKGNhY2hlICYmIG1hY19jdHgtPnJvYW0udGxTdGF0c1JlcUluZm8ubnVtQ2xpZW50KSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkxvb2tpbmcgZm9yIGNhY2hlZCBzdGF0cyBmcm9tIFRMIikpOworCQltYWNfY3R4LT5yb2FtLnRsU3RhdHNSZXFJbmZvLm51bUNsaWVudCsrOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCS8qIHVwZGF0ZSBwZXJpb2RpY2l0eSAqLworCWlmIChtYWNfY3R4LT5yb2FtLnRsU3RhdHNSZXFJbmZvLnBlcmlvZGljaXR5KQorCQltYWNfY3R4LT5yb2FtLnRsU3RhdHNSZXFJbmZvLnBlcmlvZGljaXR5ID0KKwkJICAgIENERl9NSU4ocGVyaW9kaWNpdHksCisJCQkgICAgbWFjX2N0eC0+cm9hbS50bFN0YXRzUmVxSW5mby5wZXJpb2RpY2l0eSk7CisJZWxzZQorCQltYWNfY3R4LT5yb2FtLnRsU3RhdHNSZXFJbmZvLnBlcmlvZGljaXR5ID0gcGVyaW9kaWNpdHk7CisKKwlpZiAobWFjX2N0eC0+cm9hbS50bFN0YXRzUmVxSW5mby5wZXJpb2RpY2l0eQorCSAgICA8IENTUl9NSU5fVExfU1RBVF9RVUVSWV9QRVJJT0QpIHsKKwkJbWFjX2N0eC0+cm9hbS50bFN0YXRzUmVxSW5mby5wZXJpb2RpY2l0eSA9CisJCUNTUl9NSU5fVExfU1RBVF9RVUVSWV9QRVJJT0Q7CisJfQorCisJaWYgKCFtYWNfY3R4LT5yb2FtLnRsU3RhdHNSZXFJbmZvLnRpbWVyUnVubmluZykgeworCisJCWlmIChtYWNfY3R4LT5yb2FtLnRsU3RhdHNSZXFJbmZvLnBlcmlvZGljaXR5KSB7CisJCQkvKiBzdGFydCB0aW1lciAqLworCQkJc3RhdHVzID0gY2RmX21jX3RpbWVyX3N0YXJ0KAorCQkJCSZtYWNfY3R4LT5yb2FtLnRsU3RhdHNSZXFJbmZvLmhUbFN0YXRzVGltZXIsCisJCQkJbWFjX2N0eC0+cm9hbS50bFN0YXRzUmVxSW5mby5wZXJpb2RpY2l0eSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiY2Fubm90IHN0YXJ0IFRsU3RhdHNUaW1lciB0aW1lciIpKTsKKwkJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQl9CisJCQltYWNfY3R4LT5yb2FtLnRsU3RhdHNSZXFJbmZvLnRpbWVyUnVubmluZyA9IHRydWU7CisJCX0KKwl9CisJbWFjX2N0eC0+cm9hbS50bFN0YXRzUmVxSW5mby5udW1DbGllbnQrKzsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitDREZfU1RBVFVTIGNzcl9nZXRfc3RhdGlzdGljcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgZUNzclN0YXRzUmVxdWVzdGVyVHlwZSByZXF1ZXN0ZXJJZCwKKwkJCSAgICAgIHVpbnQzMl90IHN0YXRzTWFzaywKKwkJCSAgICAgIHRDc3JTdGF0c0NhbGxiYWNrIGNhbGxiYWNrLAorCQkJICAgICAgdWludDMyX3QgcGVyaW9kaWNpdHksCisJCQkgICAgICBib29sIGNhY2hlLAorCQkJICAgICAgdWludDhfdCBzdGFJZCwKKwkJCSAgICAgIHZvaWQgKnBDb250ZXh0LAorCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdENzclN0YXRzQ2xpZW50UmVxSW5mbyBzdGFFbnRyeTsKKwl0Q3NyUGVTdGF0c1JlcUluZm8gKnBQZVN0YUVudHJ5ID0gTlVMTDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJYm9vbCBpbnNlcnRJbkNsaWVudExpc3QgPSBmYWxzZTsKKwl1aW50MzJfdCB0ZW1wX21hc2sgPSAwOworCisJaWYgKGNzcl9pc19hbGxfc2Vzc2lvbl9kaXNjb25uZWN0ZWQocE1hYykpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWlmIChjc3JfbmVpZ2hib3JfbWlkZGxlX29mX3JvYW1pbmcocE1hYywgc2Vzc2lvbklkKSkgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJpbiB0aGUgbWlkZGxlIG9mIHJvYW1pbmcgc3RhdGVzIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKCghc3RhdHNNYXNrKSAmJiAoIWNhbGxiYWNrKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQlGTCgic3RhdHNNYXNrICYgY2FsbGJhY2sgZW1wdHkgaW4gdGhlIHJlcXVlc3QiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyogZm9yIHRoZSBzZWFyY2ggbGlzdCBtZXRob2QgZm9yIGRlcmVnaXN0ZXIgKi8KKwlzdGFFbnRyeS5yZXF1ZXN0ZXJJZCA9IHJlcXVlc3RlcklkOworCXN0YUVudHJ5LnN0YXRzTWFzayA9IHN0YXRzTWFzazsKKwkvKiByZXF1ZXN0ZXIgd2FudHMgdG8gZGVyZWdpc3RlciBvciBqdXN0IGFuIGVycm9yICovCisJaWYgKChzdGF0c01hc2spICYmICghY2FsbGJhY2spKQorCQlyZXR1cm4gY3NyX2RlcmVnaXN0ZXJfY2xpZW50X3JlcXVlc3QocE1hYywgJnN0YUVudHJ5KTsKKworCWlmIChjYWNoZSAmJiAhcGVyaW9kaWNpdHkpIHsKKwkJLyogcmV0dXJuIHRoZSBjYWNoZWQgc3RhdHMgKi8KKwkJY3NyX3JvYW1fcmVwb3J0X3N0YXRpc3RpY3MocE1hYywgc3RhdHNNYXNrLCBjYWxsYmFjaywgc3RhSWQsCisJCQkJCSAgIHBDb250ZXh0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJLyogYWRkIHRoZSByZXF1ZXN0IGluIHRoZSBjbGllbnQgcmVxIGxpc3QgKi8KKwlzdGFFbnRyeS5jYWxsYmFjayA9IGNhbGxiYWNrOworCXN0YUVudHJ5LnBDb250ZXh0ID0gcENvbnRleHQ7CisJc3RhRW50cnkucGVyaW9kaWNpdHkgPSBwZXJpb2RpY2l0eTsKKwlzdGFFbnRyeS5wUGVTdGFFbnRyeSA9IE5VTEw7CisJc3RhRW50cnkuc3RhSWQgPSBzdGFJZDsKKwlzdGFFbnRyeS5wTWFjID0gcE1hYzsKKwlzdGFFbnRyeS50aW1lckV4cGlyZWQgPSBmYWxzZTsKKwlzdGFFbnRyeS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKwkvKiBpZiBwZXJpb2RpYyByZXBvcnQgcmVxdWVzdGVkIHdpdGggbm9uIGNhY2hlZCByZXN1bHQgZnJvbSBQRS9UTCAqLworCWlmIChwZXJpb2RpY2l0eSkgeworCQkvKiBpZiBsb29raW5nIGZvciBzdGF0cyBmcm9tIFBFICovCisJCXRlbXBfbWFzayA9IHN0YXRzTWFzayAmIH4oMSA8PCBlQ3NyR2xvYmFsQ2xhc3NEU3RhdHMpOworCQlpZiAodGVtcF9tYXNrKSB7CisJCQkvKiBjaGVjayBpZiBzYW1lIHJlcSBtYWRlIGFscmVhZHkgJiB3YWl0aW5nIGZvciByc3AgKi8KKwkJCXBQZVN0YUVudHJ5ID0gY3NyX3JvYW1fY2hlY2tfcGVfc3RhdHNfcmVxX2xpc3QocE1hYywKKwkJCQkJdGVtcF9tYXNrLCBwZXJpb2RpY2l0eSwgJmZvdW5kLAorCQkJCQlzdGFJZCwgc2Vzc2lvbklkKTsKKwkJCWlmICghcFBlU3RhRW50cnkpCisJCQkJLyogYmFpbCBvdXQsIG1heGVkIG91dCBvbiBudW0gb2YgcmVxIGZvciBQRSAqLworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWVsc2UKKwkJCQlzdGFFbnRyeS5wUGVTdGFFbnRyeSA9IHBQZVN0YUVudHJ5OworCQl9CisJCS8qCisJCSAqIHJlcXVlc3Qgc3RhdHMgZnJvbSBUTCByaWdodGF3YXkgaWYgcmVxdWVzdGVkIGJ5IGNsaWVudCwKKwkJICogdXBkYXRlIHRsU3RhdHNSZXFJbmZvIGlmIG5lZWRlZAorCQkgKi8KKwkJdGVtcF9tYXNrID0gc3RhdHNNYXNrICYgKDEgPDwgZUNzckdsb2JhbENsYXNzRFN0YXRzKTsKKwkJaWYgKHRlbXBfbWFzaykgeworCQkJc3RhdHVzID0gY3NyX2dldF9zdGF0aXN0aWNzX2Zyb21fdGwocE1hYywgY2FjaGUsIHN0YUlkLAorCQkJCQkJCSAgICBwZXJpb2RpY2l0eSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJaW5zZXJ0SW5DbGllbnRMaXN0ID0gdHJ1ZTsKKwl9CisJLyogaWYgb25lIHRpbWUgcmVwb3J0IHJlcXVlc3RlZCB3aXRoIG5vbiBjYWNoZWQgcmVzdWx0IGZyb20gUEUvVEwgKi8KKwllbHNlIGlmICghY2FjaGUgJiYgIXBlcmlvZGljaXR5KSB7CisJCXRlbXBfbWFzayA9IHN0YXRzTWFzayAmIH4oMSA8PCBlQ3NyR2xvYmFsQ2xhc3NEU3RhdHMpOworCQlpZiAodGVtcF9tYXNrKSB7CisJCQkvKiBzZW5kIGRvd24gYSByZXEgKi8KKwkJCXN0YXR1cyA9IGNzcl9zZW5kX21iX3N0YXRzX3JlcV9tc2cocE1hYywKKwkJCQkJCXRlbXBfbWFzaywgc3RhSWQsIHNlc3Npb25JZCk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwoImZhaWxlZCB0byBzZW5kIGRvd24gc3RhdHMgcmVxIikpOworCQkJLyoKKwkJCSAqIHNvIHRoYXQgd2hlbiB0aGUgc3RhdHMgcnNwIGNvbWVzIGJhY2sgZnJvbSBQRSB3ZQorCQkJICogcmVzcG9uZCB0byB1cHBlciBsYXllciByaWdodCBhd2F5CisJCQkgKi8KKwkJCXN0YUVudHJ5LnRpbWVyRXhwaXJlZCA9IHRydWU7CisJCQlpbnNlcnRJbkNsaWVudExpc3QgPSB0cnVlOworCQl9CisJCS8qIGlmIGxvb2tpbmcgZm9yIHN0YXRzIGZyb20gVEwgb25seSAqLworCQlpZiAoIWluc2VydEluQ2xpZW50TGlzdCkgeworCQkJLyogcmV0dXJuIHRoZSBzdGF0cyAqLworCQkJY3NyX3JvYW1fcmVwb3J0X3N0YXRpc3RpY3MocE1hYywgc3RhdHNNYXNrLCBjYWxsYmFjaywKKwkJCQkJCSAgIHN0YUlkLCBwQ29udGV4dCk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9CisJfQorCWlmIChpbnNlcnRJbkNsaWVudExpc3QpCisJCXJldHVybiBjc3JfaW5zZXJ0X3N0YXRzX3JlcXVlc3RfdG9fbGlzdChwTWFjLCAmc3RhRW50cnksCisJCQkJCQkJcGVyaW9kaWNpdHkpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2Nzcl9yb2FtX3NjYW5fb2ZmbG9hZF9wb3B1bGF0ZV9tYWNfaGVhZGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgdWludDhfdCAqcEJELAorCQkJCQkgIHVpbnQ4X3QgdHlwZSwKKwkJCQkJICB1aW50OF90IHN1YlR5cGUsCisJCQkJCSAgdFNpck1hY0FkZHIgcGVlckFkZHIsCisJCQkJCSAgdFNpck1hY0FkZHIgc2VsZk1hY0FkZHIpCit7CisJdFNpclJldFN0YXR1cyBzdGF0dXNDb2RlID0gZVNJUl9TVUNDRVNTOworCXRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworCisJLyogUHJlcGFyZSBNQUMgbWFuYWdlbWVudCBoZWFkZXIgKi8KKwlwTWFjSGRyID0gKHRwU2lyTWFjTWdtdEhkcikgKHBCRCk7CisKKwkvKiBQcmVwYXJlIEZDICovCisJcE1hY0hkci0+ZmMucHJvdFZlciA9IFNJUl9NQUNfUFJPVE9DT0xfVkVSU0lPTjsKKwlwTWFjSGRyLT5mYy50eXBlID0gdHlwZTsKKwlwTWFjSGRyLT5mYy5zdWJUeXBlID0gc3ViVHlwZTsKKworCS8qIFByZXBhcmUgQWRkcmVzcyAxICovCisJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBNYWNIZHItPmRhLCAodWludDhfdCAqKSBwZWVyQWRkciwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCXNpcl9jb3B5X21hY19hZGRyKHBNYWNIZHItPnNhLCBzZWxmTWFjQWRkcik7CisKKwkvKiBQcmVwYXJlIEFkZHJlc3MgMyAqLworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwTWFjSGRyLT5ic3NJZCwgKHVpbnQ4X3QgKikgcGVlckFkZHIsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJcmV0dXJuIHN0YXR1c0NvZGU7Cit9IC8qKiogY3NyX3JvYW1fc2Nhbl9vZmZsb2FkX3BvcHVsYXRlX21hY19oZWFkZXIoKSAqKiovCisKK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitjc3Jfcm9hbV9zY2FuX29mZmxvYWRfcHJlcGFyZV9wcm9iZV9yZXFfdGVtcGxhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSB1aW50OF90IG5DaGFubmVsTnVtLAorCQkJCQkJIHVpbnQzMl90IGRvdDExbW9kZSwKKwkJCQkJCSB0U2lyTWFjQWRkciBzZWxmTWFjQWRkciwKKwkJCQkJCSB1aW50OF90ICpwRnJhbWUsCisJCQkJCQkgdWludDE2X3QgKnB1c0xlbiwKKwkJCQkJCSB0Q3NyUm9hbVNlc3Npb24gKnBzZXNzaW9uKQoreworCXREb3QxMWZQcm9iZVJlcXVlc3QgcHI7CisJdWludDMyX3QgblN0YXR1cywgbkJ5dGVzLCBuUGF5bG9hZDsKKwl0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisJLypCY2FzdCB0eCAqLworCXRTaXJNYWNBZGRyIGJzc0lkID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CisJLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworCWNkZl9tZW1fc2V0KCh1aW50OF90ICopICZwciwgc2l6ZW9mKHByKSwgMCk7CisKKwlwb3B1bGF0ZV9kb3QxMWZfc3VwcF9yYXRlcyhwTWFjLCBuQ2hhbm5lbE51bSwgJnByLlN1cHBSYXRlcywgTlVMTCk7CisKKwlpZiAoV05JX0NGR19ET1QxMV9NT0RFXzExQiAhPSBkb3QxMW1vZGUpIHsKKwkJcG9wdWxhdGVfZG90MTFmX2V4dF9zdXBwX3JhdGVzMShwTWFjLCBuQ2hhbm5lbE51bSwKKwkJCQkJCSZwci5FeHRTdXBwUmF0ZXMpOworCX0KKworCWlmIChJU19ET1QxMV9NT0RFX0hUKGRvdDExbW9kZSkpIHsKKwkJcG9wdWxhdGVfZG90MTFmX2h0X2NhcHMocE1hYywgTlVMTCwgJnByLkhUQ2Fwcyk7CisJCXByLkhUQ2Fwcy5hZHZDb2RpbmdDYXAgPSBwc2Vzc2lvbi0+aHRDb25maWcuaHRfcnhfbGRwYzsKKwkJcHIuSFRDYXBzLnR4U1RCQyA9IHBzZXNzaW9uLT5odENvbmZpZy5odF90eF9zdGJjOworCQlwci5IVENhcHMucnhTVEJDID0gcHNlc3Npb24tPmh0Q29uZmlnLmh0X3J4X3N0YmM7CisJCWlmICghcHNlc3Npb24tPmh0Q29uZmlnLmh0X3NnaSkgeworCQkJcHIuSFRDYXBzLnNob3J0R0kyME1IeiA9IHByLkhUQ2Fwcy5zaG9ydEdJNDBNSHogPSAwOworCQl9CisJfQorCisJblN0YXR1cyA9IGRvdDExZl9nZXRfcGFja2VkX3Byb2JlX3JlcXVlc3Rfc2l6ZShwTWFjLCAmcHIsICZuUGF5bG9hZCk7CisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorCQkJICAib3IgYSBQcm9iZSBSZXF1ZXN0ICgweCUwOHgpLlxuIiwgblN0YXR1cyk7CisKKwkJblBheWxvYWQgPSBzaXplb2YodERvdDExZlByb2JlUmVxdWVzdCk7CisJfSBlbHNlIGlmIChET1QxMUZfV0FSTkVEKG5TdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyIKKwkJCSAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBQcm9iZSBSZXF1ZXN0ICgiCisJCQkgICIweCUwOHgpLlxuIiwgblN0YXR1cyk7CisJfQorCisJbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YodFNpck1hY01nbXRIZHIpOworCisJLyogUHJlcGFyZSBvdXRnb2luZyBmcmFtZSAqLworCWNkZl9tZW1fc2V0KHBGcmFtZSwgbkJ5dGVzLCAwKTsKKworCW5TaXJTdGF0dXMgPQorCQljc3Jfcm9hbV9zY2FuX29mZmxvYWRfcG9wdWxhdGVfbWFjX2hlYWRlcihwTWFjLCBwRnJhbWUsCisJCQkJCQkJICBTSVJfTUFDX01HTVRfRlJBTUUsCisJCQkJCQkJICBTSVJfTUFDX01HTVRfUFJPQkVfUkVRLCBic3NJZCwKKwkJCQkJCQkgIHNlbGZNYWNBZGRyKTsKKworCWlmIChlU0lSX1NVQ0NFU1MgIT0gblNpclN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBwb3B1bGF0ZSB0aGUgYnVmZmVyIGRlc2NyaXB0b3IgZm9yIGEgUHJvYmUgUmVxdWVzdCAoJWQpLlxuIiwKKwkJCSAgblNpclN0YXR1cyk7CisJCXJldHVybiBuU2lyU3RhdHVzOworCX0KKworCW5TdGF0dXMgPSBkb3QxMWZfcGFja19wcm9iZV9yZXF1ZXN0KHBNYWMsICZwciwgcEZyYW1lICsKKwkJCQkJICAgIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisJCQkJCSAgICBuUGF5bG9hZCwgJm5QYXlsb2FkKTsKKwlpZiAoRE9UMTFGX0ZBSUxFRChuU3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBwYWNrIGEgUHJvYmUgUmVxdWVzdCAoMHglMDh4KS5cbiIsCisJCQkgIG5TdGF0dXMpOworCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCX0gZWxzZSBpZiAoRE9UMTFGX1dBUk5FRChuU3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIFByb2JlIFJlcXVlc3QgKDB4JTA4eCkuXG4iLAorCQkJICBuU3RhdHVzKTsKKwl9CisKKwkqcHVzTGVuID0gblBheWxvYWQgKyBzaXplb2YodFNpck1hY01nbXRIZHIpOworCXJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECitDREZfU1RBVFVTIGNzcl9yb2FtX3NldF9rZXlfbWdtdF9vZmZsb2FkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSBib29sIG5Sb2FtS2V5TWdtdE9mZmxvYWRFbmFibGVkKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcFNlc3Npb24tPlJvYW1LZXlNZ210T2ZmbG9hZEVuYWJsZWQgPSBuUm9hbUtleU1nbXRPZmZsb2FkRW5hYmxlZDsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNzcl91cGRhdGVfcm9hbV9zY2FuX29mZmxvYWRfcmVxdWVzdCgpIC0gdXBkYXRlcyByZXEgbXNnIHdpdGggcm9hbSBvZmZsb2FkCisgKiBwYXJhbXRlcnMKKyAqIEBwTWFjOiAgICAgICAgICBtYWMgZ2xvYmFsIGNvbnRleHQKKyAqIEByZXFfYnVmOiAgICAgICBvdXQgcGFyYW0sIHJvYW0gb2ZmbG9hZCBzY2FuIHJlcXVlc3QgcGFja2V0CisgKiBAc2Vzc2lvbjogICAgICAgcm9hbSBzZXNzaW9uCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitjc3JfdXBkYXRlX3JvYW1fc2Nhbl9vZmZsb2FkX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgICAgIHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgKnJlcV9idWYsCisJCQkJICAgICB0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb24pCit7CisJY2RmX21lbV9jb3B5KHJlcV9idWYtPlBTS19QTUssIHNlc3Npb24tPnBza19wbWssCisJCSAgICAgc2l6ZW9mKHJlcV9idWYtPlBTS19QTUspKTsKKwlyZXFfYnVmLT5wbWtfbGVuID0gc2Vzc2lvbi0+cG1rX2xlbjsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJICAiTEZSMzogUE1LIExlbmd0aCA9ICVkIiwgcmVxX2J1Zi0+cG1rX2xlbik7CisJcmVxX2J1Zi0+UjBLSF9JRF9MZW5ndGggPSBzZXNzaW9uLT5mdFNtZUNvbnRleHQucjBraF9pZF9sZW47CisJY2RmX21lbV9jb3B5KHJlcV9idWYtPlIwS0hfSUQsCisJCSAgICAgc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnIwa2hfaWQsCisJCSAgICAgcmVxX2J1Zi0+UjBLSF9JRF9MZW5ndGgpOworCXJlcV9idWYtPlByZWZlcjVHSHogPSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtUHJlZmVyNUdIejsKKwlyZXFfYnVmLT5Sb2FtUnNzaUNhdEdhcCA9IG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uYkNhdFJzc2lPZmZzZXQ7CisJcmVxX2J1Zi0+U2VsZWN0NUdIek1hcmdpbiA9IG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0ublNlbGVjdDVHSHpNYXJnaW47CisJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjX2N0eCwgV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVCwKKwkJCSAgICAgKHVpbnQzMl90ICopICZyZXFfYnVmLT5SZWFzc29jRmFpbHVyZVRpbWVvdXQpCisJICAgICE9IGVTSVJfU1VDQ0VTUykgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiY291bGQgbm90IHJldHJpZXZlIFJlYXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZSIpKTsKKwkJcmVxX2J1Zi0+UmVhc3NvY0ZhaWx1cmVUaW1lb3V0ID0KKwkJCURFRkFVTFRfUkVBU1NPQ19GQUlMVVJFX1RJTUVPVVQ7CisJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwlpZiAoY3NyX2lzX2F1dGhfdHlwZV9lc2UocmVxX2J1Zi0+Q29ubmVjdGVkTmV0d29yay5hdXRoZW50aWNhdGlvbikpIHsKKwkJY2RmX21lbV9jb3B5KHJlcV9idWYtPktSSywgc2Vzc2lvbi0+ZXNlQ2NrbUluZm8ua3JrLAorCQkJICAgICBTSVJfS1JLX0tFWV9MRU4pOworCQljZGZfbWVtX2NvcHkocmVxX2J1Zi0+QlRLLCBzZXNzaW9uLT5lc2VDY2ttSW5mby5idGssCisJCQkgICAgIFNJUl9CVEtfS0VZX0xFTik7CisJfQorI2VuZGlmCisJcmVxX2J1Zi0+QWNVYXBzZC5hY2JlX3VhcHNkID0KKwkJU0lSX1VBUFNEX0dFVChBQ0JFLCBtYWNfY3R4LT5saW0uZ1VhcHNkUGVyQWNCaXRtYXNrKTsKKwlyZXFfYnVmLT5BY1VhcHNkLmFjYmtfdWFwc2QgPQorCQlTSVJfVUFQU0RfR0VUKEFDQkssIG1hY19jdHgtPmxpbS5nVWFwc2RQZXJBY0JpdG1hc2spOworCXJlcV9idWYtPkFjVWFwc2QuYWN2aV91YXBzZCA9CisJCVNJUl9VQVBTRF9HRVQoQUNWSSwgbWFjX2N0eC0+bGltLmdVYXBzZFBlckFjQml0bWFzayk7CisJcmVxX2J1Zi0+QWNVYXBzZC5hY3ZvX3VhcHNkID0KKwkJU0lSX1VBUFNEX0dFVChBQ1ZPLCBtYWNfY3R4LT5saW0uZ1VhcHNkUGVyQWNCaXRtYXNrKTsKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FEICovCisKKy8qKgorICogY3NyX2NoZWNrX2JhbmRfY2hhbm5lbF9tYXRjaCgpIC0gY2hlY2sgaWYgcGFzc2VkIGJhbmQgYW5kIGNoYW5uZWwgbWF0Y2gKKyAqIHBhcmFtdGVycworICogQGJhbmQ6ICAgICAgIGJhbmQgdG8gbWF0Y2ggd2l0aCBjaGFubmVsCisgKiBAY2hhbm5lbDogICAgY2hhbm5lbCB0byBtYXRjaCB3aXRoIGJhbmQKKyAqCisgKiBSZXR1cm46IGJvb2wgaWYgbWF0Y2ggZWxzZSBmYWxzZQorICovCitzdGF0aWMgYm9vbAorY3NyX2NoZWNrX2JhbmRfY2hhbm5lbF9tYXRjaChlQ3NyQmFuZCBiYW5kLCB1aW50OF90IGNoYW5uZWwpCit7CisJaWYgKGVDU1JfQkFORF9BTEwgPT0gYmFuZCkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoZUNTUl9CQU5EXzI0ID09IGJhbmQgJiYgQ0RTX0lTX0NIQU5ORUxfMjRHSFooY2hhbm5lbCkpCisJCXJldHVybiB0cnVlOworCisJaWYgKGVDU1JfQkFORF81RyA9PSBiYW5kICYmIENEU19JU19DSEFOTkVMXzVHSFooY2hhbm5lbCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIGNzcl9mZXRjaF9jaF9sc3RfZnJvbV9pbmkoKSAtIGZldGNoIGNoYW5uZWwgbGlzdCBmcm9tIGluaSBhbmQgdXBkYXRlIHJlcSBtc2cKKyAqIHBhcmFtdGVycworICogQG1hY19jdHg6ICAgICAgZ2xvYmFsIG1hYyBjdHgKKyAqIEByb2FtX2luZm86ICAgIHJvYW0gaW5mbyBzdHJ1Y3QKKyAqIEByZXFfYnVmOiAgICAgIG91dCBwYXJhbSwgcm9hbSBvZmZsb2FkIHNjYW4gcmVxdWVzdCBwYWNrZXQKKyAqCisgKiBSZXR1cm46IHJlc3VsdCBvZiBvcGVyYXRpb24KKyAqLworc3RhdGljIENERl9TVEFUVVMKK2Nzcl9mZXRjaF9jaF9sc3RfZnJvbV9pbmkodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCSAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyByb2FtX2luZm8sCisJCQkgIHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgKnJlcV9idWYpCit7CisJZUNzckJhbmQgYmFuZDsKKwl1aW50OF90IGkgPSAwOworCXVpbnQ4X3QgbnVtX2NoYW5uZWxzID0gMDsKKwl1aW50OF90ICpjaF9sc3QgPSByb2FtX2luZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5DaGFubmVsTGlzdDsKKwkvKgorCSAqIFRoZSBJTkkgY2hhbm5lbHMgbmVlZCB0byBiZSBmaWx0ZXJlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgYmFuZAorCSAqIHRoYXQgaXMgc3VwcG9ydGVkLgorCSAqLworCWJhbmQgPSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmJhbmRDYXBhYmlsaXR5OworCWlmICgoZUNTUl9CQU5EXzI0ICE9IGJhbmQpICYmIChlQ1NSX0JBTkRfNUcgIT0gYmFuZCkKKwkgICAgJiYgKGVDU1JfQkFORF9BTEwgIT0gYmFuZCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJJbnZhbGlkIGJhbmQoJWQpLCByb2FtIHNjYW4gb2ZmbG9hZCByZXEgYWJvcnRlZCIpLAorCQkJICBiYW5kKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByb2FtX2luZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOyBpKyspIHsKKwkJaWYgKCFjc3JfY2hlY2tfYmFuZF9jaGFubmVsX21hdGNoKGJhbmQsICpjaF9sc3QpKQorCQkJY29udGludWU7CisJCS8qIEFsbG93IERGUyBjaGFubmVscyBvbmx5IGlmIHRoZSBERlMgcm9hbWluZyBpcyBlbmFibGVkICovCisJCWlmICgoKG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uYWxsb3dERlNDaGFubmVsUm9hbSAhPQorCQkgICAgIENTUl9ST0FNSU5HX0RGU19DSEFOTkVMX0RJU0FCTEVEKQorCQkgICAgIHx8ICghQ0RTX0lTX0RGU19DSCgqY2hfbHN0KSkpCisJCSAgICAmJiBjc3Jfcm9hbV9pc19jaGFubmVsX3ZhbGlkKG1hY19jdHgsICpjaF9sc3QpCisJCSAgICAmJiAqY2hfbHN0ICYmIChudW1fY2hhbm5lbHMgPCBTSVJfUk9BTV9NQVhfQ0hBTk5FTFMpKSB7CisJCQlyZXFfYnVmLT5Db25uZWN0ZWROZXR3b3JrLkNoYW5uZWxDYWNoZVtudW1fY2hhbm5lbHMrK10gPQorCQkJCSpjaF9sc3Q7CisJCX0KKwkJY2hfbHN0Kys7CisJfQorCXJlcV9idWYtPkNvbm5lY3RlZE5ldHdvcmsuQ2hhbm5lbENvdW50ID0gbnVtX2NoYW5uZWxzOworCXJlcV9idWYtPkNoYW5uZWxDYWNoZVR5cGUgPSBDSEFOTkVMX0xJU1RfU1RBVElDOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY3NyX2ZldGNoX2NoX2xzdF9mcm9tX29jY3VwaWVkX2xzdCgpIC0gZmV0Y2ggY2hhbm5lbCBsaXN0IGZyb20gb2NjdXBpZWQgbGlzdAorICogYW5kIHVwZGF0ZSByZXEgbXNnCisgKiBwYXJhbXRlcnMKKyAqIEBtYWNfY3R4OiAgICAgIGdsb2JhbCBtYWMgY3R4CisgKiBAc2Vzc2lvbl9pZDogICBzZXNzaW9uIGlkCisgKiBAcmVhc29uOiAgICAgICByZWFzb24gdG8gcm9hbQorICogQHJlcV9idWY6ICAgICAgb3V0IHBhcmFtLCByb2FtIG9mZmxvYWQgc2NhbiByZXF1ZXN0IHBhY2tldAorICogQHJvYW1faW5mbzogICAgcm9hbSBpbmZvIHN0cnVjdAorICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgdm9pZAorY3NyX2ZldGNoX2NoX2xzdF9mcm9tX29jY3VwaWVkX2xzdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCSAgIHVpbnQ4X3Qgc2Vzc2lvbl9pZCwKKwkJCQkgICB1aW50OF90IHJlYXNvbiwKKwkJCQkgICB0U2lyUm9hbU9mZmxvYWRTY2FuUmVxICpyZXFfYnVmLAorCQkJCSAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcm9hbV9pbmZvKQoreworCXVpbnQ4X3QgaSA9IDA7CisJdWludDhfdCBudW1fY2hhbm5lbHMgPSAwOworCXVpbnQ4X3QgKmNoX2xzdCA9CisJCW1hY19jdHgtPnNjYW4ub2NjdXBpZWRDaGFubmVsc1tzZXNzaW9uX2lkXS5jaGFubmVsTGlzdDsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJIk51bSBvZiBjaGFubmVscyBiZWZvcmUgZmlsdGVyaW5nPSVkIiwKKwkJbWFjX2N0eC0+c2Nhbi5vY2N1cGllZENoYW5uZWxzW3Nlc3Npb25faWRdLm51bUNoYW5uZWxzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWFjX2N0eC0+c2Nhbi5vY2N1cGllZENoYW5uZWxzW3Nlc3Npb25faWRdLm51bUNoYW5uZWxzOworCSAgICAgaSsrKSB7CisJCWlmICgoKG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uYWxsb3dERlNDaGFubmVsUm9hbSAhPQorCQkgICAgQ1NSX1JPQU1JTkdfREZTX0NIQU5ORUxfRElTQUJMRUQpCisJCQl8fCAoIUNEU19JU19ERlNfQ0goKmNoX2xzdCkpKQorCQkJJiYgKmNoX2xzdCAmJiAobnVtX2NoYW5uZWxzIDwgU0lSX1JPQU1fTUFYX0NIQU5ORUxTKSkgeworCQkJcmVxX2J1Zi0+Q29ubmVjdGVkTmV0d29yay5DaGFubmVsQ2FjaGVbbnVtX2NoYW5uZWxzKytdID0KKwkJCQkqY2hfbHN0OworCQl9CisJCWlmICgqY2hfbHN0KQorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJIkRGU1JvYW09JWQsIENobmxTdGF0ZT0lZCwgQ2hubD0lZCwgbnVtX2NoPSVkIiwKKwkJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmFsbG93REZTQ2hhbm5lbFJvYW0sCisJCQkJY2RzX2dldF9jaGFubmVsX3N0YXRlKCpjaF9sc3QpLCAqY2hfbHN0LAorCQkJCW51bV9jaGFubmVscyk7CisJCWNoX2xzdCsrOworCX0KKwlyZXFfYnVmLT5Db25uZWN0ZWROZXR3b3JrLkNoYW5uZWxDb3VudCA9IG51bV9jaGFubmVsczsKKwkvKgorCSAqIElmIHRoZSBwcm9maWxlIGNoYW5nZXMgYXMgdG8gd2hhdCBpdCB3YXMgZWFybGllciwgaW5mb3JtIHRoZSBGVworCSAqIHRocm91Z2ggRkxVU0ggYXMgQ2hhbm5lbENhY2hlVHlwZSBpbiB3aGljaCBjYXNlLCB0aGUgRlcgd2lsbCBmbHVzaAorCSAqIHRoZSBvY2N1cGllZCBjaGFubmVscyBmb3IgdGhlIGVhcmxpZXIgcHJvZmlsZSBhbmQgdHJ5IHRvIGxlYXJuIHRoZW0KKwkgKiBhZnJlc2gKKwkgKi8KKwlpZiAocmVhc29uID09IFJFQVNPTl9GTFVTSF9DSEFOTkVMX0xJU1QpCisJCXJlcV9idWYtPkNoYW5uZWxDYWNoZVR5cGUgPSBDSEFOTkVMX0xJU1RfRFlOQU1JQ19GTFVTSDsKKwllbHNlIHsKKwkJaWYgKGNzcl9uZWlnaGJvcl9yb2FtX2lzX25ld19jb25uZWN0ZWRfcHJvZmlsZShtYWNfY3R4LAorCQkJCQkJCSAgICAgICBzZXNzaW9uX2lkKSkKKwkJCXJlcV9idWYtPkNoYW5uZWxDYWNoZVR5cGUgPSBDSEFOTkVMX0xJU1RfRFlOQU1JQ19JTklUOworCQllbHNlCisJCQlyZXFfYnVmLT5DaGFubmVsQ2FjaGVUeXBlID0gQ0hBTk5FTF9MSVNUX0RZTkFNSUNfVVBEQVRFOworCX0KK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKy8qKgorICogY3NyX2ZldGNoX2NoX2xzdF9mcm9tX3JlY2VpdmVkX2xpc3QoKSAtIGZldGNoIGNoYW5uZWwgbGlzdCBmcm9tIHJlY2VpdmVkIGxpc3QKKyAqIGFuZCB1cGRhdGUgcmVxIG1zZworICogcGFyYW10ZXJzCisgKiBAbWFjX2N0eDogICAgICAgICAgICBnbG9iYWwgbWFjIGN0eAorICogQHJvYW1faW5mbzogICAgICAgICAgcm9hbSBpbmZvIHN0cnVjdAorICogQGN1cnJfY2hfbHN0X2luZm86ICAgY3VycmVudCBjaGFubmVsIGxpc3QgaW5mbworICogQHJlcV9idWY6ICAgICAgICAgICAgb3V0IHBhcmFtLCByb2FtIG9mZmxvYWQgc2NhbiByZXF1ZXN0IHBhY2tldAorICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgdm9pZAorY3NyX2ZldGNoX2NoX2xzdF9mcm9tX3JlY2VpdmVkX2xpc3QodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyByb2FtX2luZm8sCisJCQkJICAgIHRwQ3NyQ2hhbm5lbEluZm8gY3Vycl9jaF9sc3RfaW5mbywKKwkJCQkgICAgdFNpclJvYW1PZmZsb2FkU2NhblJlcSAqcmVxX2J1ZikKK3sKKwl1aW50OF90IGkgPSAwOworCXVpbnQ4X3QgbnVtX2NoYW5uZWxzID0gMDsKKwl1aW50OF90ICpjaF9sc3QgPSBOVUxMOworCisJaWYgKGN1cnJfY2hfbHN0X2luZm8tPm51bU9mQ2hhbm5lbHMgPT0gMCkKKwkJcmV0dXJuOworCisJY2hfbHN0ID0gY3Vycl9jaF9sc3RfaW5mby0+Q2hhbm5lbExpc3Q7CisJZm9yIChpID0gMDsgaSA8IGN1cnJfY2hfbHN0X2luZm8tPm51bU9mQ2hhbm5lbHM7IGkrKykgeworCQlpZiAoKChtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmFsbG93REZTQ2hhbm5lbFJvYW0KKwkJICAgICAgIT0gQ1NSX1JPQU1JTkdfREZTX0NIQU5ORUxfRElTQUJMRUQpIHx8CisJCSAgICAgKCFDRFNfSVNfREZTX0NIKCpjaF9sc3QpKSkgJiYgKmNoX2xzdCkgeworCQkJcmVxX2J1Zi0+Q29ubmVjdGVkTmV0d29yay5DaGFubmVsQ2FjaGVbbnVtX2NoYW5uZWxzKytdID0KKwkJCQkqY2hfbHN0OworCQl9CisJCWNoX2xzdCsrOworCX0KKwlyZXFfYnVmLT5Db25uZWN0ZWROZXR3b3JrLkNoYW5uZWxDb3VudCA9IG51bV9jaGFubmVsczsKKwlyZXFfYnVmLT5DaGFubmVsQ2FjaGVUeXBlID0gQ0hBTk5FTF9MSVNUX0RZTkFNSUNfVVBEQVRFOworfQorI2VuZGlmCisKKy8qKgorICogY3NyX2ZldGNoX3ZhbGlkX2NoX2xzdCgpIC0gZmV0Y2ggY2hhbm5lbCBsaXN0IGZyb20gdmFsaWQgY2hhbm5lbCBsaXN0IGFuZAorICogdXBkYXRlIHJlcSBtc2cKKyAqIHBhcmFtdGVycworICogQG1hY19jdHg6ICAgICAgICAgICAgZ2xvYmFsIG1hYyBjdHgKKyAqIEByZXFfYnVmOiAgICAgICAgICAgIG91dCBwYXJhbSwgcm9hbSBvZmZsb2FkIHNjYW4gcmVxdWVzdCBwYWNrZXQKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIENERl9TVEFUVVMKK2Nzcl9mZXRjaF92YWxpZF9jaF9sc3QodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJICAgICAgIHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgKnJlcV9idWYpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3QgaG9zdF9jaGFubmVscyA9IDA7CisJdWludDhfdCAqY2hfbHN0ID0gTlVMTDsKKwl1aW50OF90IGkgPSAwLCBudW1fY2hhbm5lbHMgPSAwOworCisJaG9zdF9jaGFubmVscyA9IHNpemVvZihtYWNfY3R4LT5yb2FtLnZhbGlkQ2hhbm5lbExpc3QpOworCXN0YXR1cyA9IGNzcl9nZXRfY2ZnX3ZhbGlkX2NoYW5uZWxzKG1hY19jdHgsCisJCQkJCSAgICBtYWNfY3R4LT5yb2FtLnZhbGlkQ2hhbm5lbExpc3QsCisJCQkJCSAgICAmaG9zdF9jaGFubmVscyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIkZhaWxlZCB0byBnZXQgdGhlIHZhbGlkIGNoYW5uZWwgbGlzdCIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJY2hfbHN0ID0gbWFjX2N0eC0+cm9hbS52YWxpZENoYW5uZWxMaXN0OworCW1hY19jdHgtPnJvYW0ubnVtVmFsaWRDaGFubmVscyA9IGhvc3RfY2hhbm5lbHM7CisJZm9yIChpID0gMDsgaSA8IG1hY19jdHgtPnJvYW0ubnVtVmFsaWRDaGFubmVsczsgaSsrKSB7CisJCWlmICgoKG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uYWxsb3dERlNDaGFubmVsUm9hbQorCQkgICAgICAhPSBDU1JfUk9BTUlOR19ERlNfQ0hBTk5FTF9ESVNBQkxFRCkgfHwKKwkJICAgICAoIUNEU19JU19ERlNfQ0goKmNoX2xzdCkpKSAmJiAqY2hfbHN0KSB7CisJCQlyZXFfYnVmLT5WYWxpZENoYW5uZWxMaXN0W251bV9jaGFubmVscysrXSA9ICpjaF9sc3Q7CisJCX0KKwkJY2hfbHN0Kys7CisJfQorCXJlcV9idWYtPlZhbGlkQ2hhbm5lbENvdW50ID0gbnVtX2NoYW5uZWxzOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY3NyX2NyZWF0ZV9yb2FtX3NjYW5fb2ZmbG9hZF9yZXF1ZXN0KCkgLSBpbml0IHJvYW0gb2ZmbG9hZCBzY2FuIHJlcXVlc3QKKyAqCisgKiBwYXJhbXRlcnMKKyAqIEBtYWNfY3R4OiAgICAgIGdsb2JhbCBtYWMgY3R4CisgKiBAY29tbWFuZDogICAgICByb2FtIHNjYW4gb2ZmbG9hZCBjb21tYW5kIGlucHV0CisgKiBAc2Vzc2lvbl9pZDogICBzZXNzaW9uIGlkCisgKiBAcmVhc29uOiAgICAgICByZWFzb24gdG8gcm9hbQorICogQHNlc3Npb246ICAgICAgcm9hbSBzZXNzaW9uCisgKiBAcm9hbV9pbmZvOiAgICByb2FtIGluZm8gc3RydWN0CisgKgorICogUmV0dXJuOiByb2FtIG9mZmxvYWQgc2NhbiByZXF1ZXN0IHBhY2tldCBidWZmZXIKKyAqLworc3RhdGljIHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgKgorY3NyX2NyZWF0ZV9yb2FtX3NjYW5fb2ZmbG9hZF9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJICAgICB1aW50OF90IGNvbW1hbmQsCisJCQkJICAgICB1aW50OF90IHNlc3Npb25faWQsCisJCQkJICAgICB1aW50OF90IHJlYXNvbiwKKwkJCQkgICAgIHRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkgICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcm9hbV9pbmZvKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQ4X3QgaSwgaiwgZG90MTFfbW9kZTsKKwlib29sIGVzZV9uZWlnaGJvcl9saXN0X3JlY3ZkID0gZmFsc2U7CisJdWludDhfdCBjaF9jYWNoZV9zdHJbMTI4XSA9IHsgMCB9OworCXRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgKnJlcV9idWYgPSBOVUxMOworCXRwQ3NyQ2hhbm5lbEluZm8gY3Vycl9jaF9sc3RfaW5mbyA9CisJCSZyb2FtX2luZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkvKgorCSAqIHRoaXMgZmxhZyB3aWxsIGJlIHRydWUgaWYgY29ubmVjdGlvbiBpcyBFU0UgYW5kIG5vIG5laWdoYm9yCisJICogbGlzdCByZWNlaXZlZCBvciBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgRVNFCisJICovCisJZXNlX25laWdoYm9yX2xpc3RfcmVjdmQgPSAoKHJvYW1faW5mby0+aXNFU0VBc3NvYykKKwkJJiYgKHJvYW1faW5mby0+cm9hbUNoYW5uZWxJbmZvLklBUFBOZWlnaGJvckxpc3RSZWNlaXZlZAorCQkgICAgPT0gZmFsc2UpKQorCQl8fCAocm9hbV9pbmZvLT5pc0VTRUFzc29jID09IGZhbHNlKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICovCisKKwlyZXFfYnVmID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEpKTsKKwlpZiAoTlVMTCA9PSByZXFfYnVmKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiTWVtIGFsbG9jIGZvciByb2FtIHNjYW4gb2ZmbG9hZCByZXEgZmFpbGVkLiIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNkZl9tZW1femVybyhyZXFfYnVmLCBzaXplb2YodFNpclJvYW1PZmZsb2FkU2NhblJlcSkpOworCXJlcV9idWYtPkNvbW1hbmQgPSBjb21tYW5kOworCS8qCisJICogSWYgY29tbWFuZCBpcyBTVE9QLCB0aGVuIHBhc3MgZG93biBTY2FuT2ZmbG9hZEVuYWJsZWQgYXMgWmVyby4gVGhpcworCSAqIHdpbGwgaGFuZGxlIHRoZSBjYXNlIG9mIGhvc3QgZHJpdmVyIHJlbG9hZHMsIGJ1dCBSaXZhIHN0aWxsIHVwIGFuZAorCSAqIHJ1bm5pbmcKKwkgKi8KKwlpZiAoY29tbWFuZCA9PSBST0FNX1NDQU5fT0ZGTE9BRF9TVE9QKSB7CisJCS8qCisJCSAqIGNsZWFyIHRoZSByb2FtaW5nIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGVyIGNvbm5lY3Rpb24uCisJCSAqIEZvciBhIG5ldyBjb25uZWN0aW9uLCB0aGV5IGhhdmUgdG8gYmUgcHJvZ3JhbW1lZCBhZ2Fpbi4KKwkJICovCisJCWlmIChjc3JfbmVpZ2hib3JfbWlkZGxlX29mX3JvYW1pbmcoKHRIYWxIYW5kbGUpbWFjX2N0eCwKKwkJCQlzZXNzaW9uX2lkKSkKKwkJCXJlcV9idWYtPm1pZGRsZV9vZl9yb2FtaW5nID0gMTsKKwkJZWxzZQorCQkJY3NyX3JvYW1fcmVzZXRfcm9hbV9wYXJhbXMobWFjX2N0eCk7CisJCXJlcV9idWYtPlJvYW1TY2FuT2ZmbG9hZEVuYWJsZWQgPSAwOworCX0gZWxzZSB7CisJCXJlcV9idWYtPlJvYW1TY2FuT2ZmbG9hZEVuYWJsZWQgPQorCQkJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5pc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQ7CisJfQorCWNkZl9tZW1fY29weShyZXFfYnVmLT5Db25uZWN0ZWROZXR3b3JrLmN1cnJBUGJzc2lkLAorCQkgICAgIHJvYW1faW5mby0+Y3VyckFQYnNzaWQuYnl0ZXMsIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJcmVxX2J1Zi0+Q29ubmVjdGVkTmV0d29yay5zc0lkLmxlbmd0aCA9CisJCW1hY19jdHgtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbl9pZF0uCisJCWNvbm5lY3RlZFByb2ZpbGUuU1NJRC5sZW5ndGg7CisJY2RmX21lbV9jb3B5KHJlcV9idWYtPkNvbm5lY3RlZE5ldHdvcmsuc3NJZC5zc0lkLAorCQltYWNfY3R4LT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25faWRdLgorCQljb25uZWN0ZWRQcm9maWxlLlNTSUQuc3NJZCwKKwkJcmVxX2J1Zi0+Q29ubmVjdGVkTmV0d29yay5zc0lkLmxlbmd0aCk7CisJcmVxX2J1Zi0+Q29ubmVjdGVkTmV0d29yay5hdXRoZW50aWNhdGlvbiA9CisJCW1hY19jdHgtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbl9pZF0uY29ubmVjdGVkUHJvZmlsZS5BdXRoVHlwZTsKKwlyZXFfYnVmLT5Db25uZWN0ZWROZXR3b3JrLmVuY3J5cHRpb24gPQorCQltYWNfY3R4LT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25faWRdLgorCQljb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlOworCXJlcV9idWYtPkNvbm5lY3RlZE5ldHdvcmsubWNlbmNyeXB0aW9uID0KKwkJbWFjX2N0eC0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uX2lkXS4KKwkJY29ubmVjdGVkUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwlyZXFfYnVmLT5Db25uZWN0ZWROZXR3b3JrLm1mcF9lbmFibGVkID0KKwkgICAgbWFjX2N0eC0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uX2lkXS5jb25uZWN0ZWRQcm9maWxlLk1GUEVuYWJsZWQ7CisjZW5kaWYKKwlyZXFfYnVmLT5kZWxheV9iZWZvcmVfdmRldl9zdG9wID0KKwkJcm9hbV9pbmZvLT5jZmdQYXJhbXMuZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcDsKKwlyZXFfYnVmLT5PcHBvcnR1bmlzdGljU2NhblRocmVzaG9sZERpZmYgPQorCQlyb2FtX2luZm8tPmNmZ1BhcmFtcy5uT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmY7CisJcmVxX2J1Zi0+Um9hbVJlc2NhblJzc2lEaWZmID0KKwkJcm9hbV9pbmZvLT5jZmdQYXJhbXMublJvYW1SZXNjYW5Sc3NpRGlmZjsKKwlyZXFfYnVmLT5Sb2FtUnNzaURpZmYgPSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLlJvYW1Sc3NpRGlmZjsKKwlyZXFfYnVmLT5yZWFzb24gPSByZWFzb247CisJcmVxX2J1Zi0+TmVpZ2hib3JTY2FuVGltZXJQZXJpb2QgPQorCQlyb2FtX2luZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclNjYW5QZXJpb2Q7CisJcmVxX2J1Zi0+TmVpZ2hib3JSb2FtU2NhblJlZnJlc2hQZXJpb2QgPQorCQlyb2FtX2luZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kOworCXJlcV9idWYtPk5laWdoYm9yU2NhbkNoYW5uZWxNaW5UaW1lID0KKwkJcm9hbV9pbmZvLT5jZmdQYXJhbXMubWluQ2hhbm5lbFNjYW5UaW1lOworCXJlcV9idWYtPk5laWdoYm9yU2NhbkNoYW5uZWxNYXhUaW1lID0KKwkJcm9hbV9pbmZvLT5jZmdQYXJhbXMubWF4Q2hhbm5lbFNjYW5UaW1lOworCXJlcV9idWYtPkVtcHR5UmVmcmVzaFNjYW5QZXJpb2QgPQorCQlyb2FtX2luZm8tPmNmZ1BhcmFtcy5lbXB0eVNjYW5SZWZyZXNoUGVyaW9kOworCXJlcV9idWYtPlJvYW1CbWlzc0ZpcnN0QmNudCA9CisJCXJvYW1faW5mby0+Y2ZnUGFyYW1zLm5Sb2FtQm1pc3NGaXJzdEJjbnQ7CisJcmVxX2J1Zi0+Um9hbUJtaXNzRmluYWxCY250ID0KKwkJcm9hbV9pbmZvLT5jZmdQYXJhbXMublJvYW1CbWlzc0ZpbmFsQmNudDsKKwlyZXFfYnVmLT5Sb2FtQmVhY29uUnNzaVdlaWdodCA9CisJCXJvYW1faW5mby0+Y2ZnUGFyYW1zLm5Sb2FtQmVhY29uUnNzaVdlaWdodDsKKwkvKiBNQVdDIGZlYXR1cmUgKi8KKwlyZXFfYnVmLT5NQVdDRW5hYmxlZCA9IG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uTUFXQ0VuYWJsZWQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXJlcV9idWYtPklzRVNFQXNzb2MgPQorCQljc3JfbmVpZ2hib3Jfcm9hbV9pc19lc2VfYXNzb2MobWFjX2N0eCwgc2Vzc2lvbl9pZCkgJiYKKwkJKChyZXFfYnVmLT5Db25uZWN0ZWROZXR3b3JrLmF1dGhlbnRpY2F0aW9uID09CisJCQllQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSkgIHx8CisJCShjc3JfaXNfYXV0aF90eXBlX2VzZShyZXFfYnVmLT4KKwkJCUNvbm5lY3RlZE5ldHdvcmsuYXV0aGVudGljYXRpb24pKSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQlGTCgiTEZSMzpJc0VzZUFzc29jPSVkXG4iKSwgcmVxX2J1Zi0+SXNFU0VBc3NvYyk7CisjZW5kaWYKKwlpZiAoZXNlX25laWdoYm9yX2xpc3RfcmVjdmQgfHwgY3Vycl9jaF9sc3RfaW5mby0+bnVtT2ZDaGFubmVscyA9PSAwKSB7CisJCS8qCisJCSAqIFJldHJpZXZlIHRoZSBDaGFubmVsIENhY2hlIGVpdGhlciBmcm9tIGluaSBvciBmcm9tIHRoZQorCQkgKiBvY2N1cGllZCBjaGFubmVscyBsaXN0LiBHaXZlIFByZWZlcmVuY2UgdG8gSU5JIENoYW5uZWxzCisJCSAqLworCQlpZiAocm9hbV9pbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscykgeworCQkJc3RhdHVzID0gY3NyX2ZldGNoX2NoX2xzdF9mcm9tX2luaShtYWNfY3R4LCByb2FtX2luZm8sCisJCQkJCQkJICAgcmVxX2J1Zik7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJY2RmX21lbV9mcmVlKHJlcV9idWYpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9IGVsc2UgeworCQkJY3NyX2ZldGNoX2NoX2xzdF9mcm9tX29jY3VwaWVkX2xzdChtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQkJCQkJcmVhc29uLCByZXFfYnVmLCByb2FtX2luZm8pOworCQl9CisJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwllbHNlIHsKKwkJLyoKKwkJICogSWYgRVNFIGlzIGVuYWJsZWQsIGFuZCBhIG5laWdoYm9yIFJlcG9ydCBpcyByZWNlaXZlZCx0aGVuCisJCSAqIElnbm9yZSB0aGUgSU5JIENoYW5uZWxzIG9yIHRoZSBPY2N1cGllZCBDaGFubmVsIExpc3QuCisJCSAqIENvbnNpZGVyIHRoZSBjaGFubmVscyBpbiB0aGUgbmVpZ2hib3IgbGlzdCBzZW50IGJ5IHRoZSBFU0UgQVAKKwkJICovCisJCSBjc3JfZmV0Y2hfY2hfbHN0X2Zyb21fcmVjZWl2ZWRfbGlzdChtYWNfY3R4LCByb2FtX2luZm8sCisJCQkJCQljdXJyX2NoX2xzdF9pbmZvLCByZXFfYnVmKTsKKwl9CisjZW5kaWYKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHJlcV9idWYtPkNvbm5lY3RlZE5ldHdvcmsuQ2hhbm5lbENvdW50OyBpKyspIHsKKwkJaWYgKGogPCBzaXplb2YoY2hfY2FjaGVfc3RyKSkgeworCQkJaiArPSBzbnByaW50ZihjaF9jYWNoZV9zdHIgKyBqLAorCQkJCSAgICAgIHNpemVvZihjaF9jYWNoZV9zdHIpIC0gaiwgIiAlZCIsCisJCQkJICAgICAgcmVxX2J1Zi0+Q29ubmVjdGVkTmV0d29yay4KKwkJCQkgICAgICBDaGFubmVsQ2FjaGVbaV0pOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJICBGTCgiQ2hubENhY2hlVHlwZTolZCwgTm8gb2YgQ2hubHM6JWQsQ2hhbm5lbHM6ICVzIiksCisJCSAgcmVxX2J1Zi0+Q2hhbm5lbENhY2hlVHlwZSwKKwkJICByZXFfYnVmLT5Db25uZWN0ZWROZXR3b3JrLkNoYW5uZWxDb3VudCwgY2hfY2FjaGVfc3RyKTsKKworCS8qIE1haW50YWluIHRoZSBWYWxpZCBDaGFubmVscyBMaXN0ICovCisJc3RhdHVzID0gY3NyX2ZldGNoX3ZhbGlkX2NoX2xzdChtYWNfY3R4LCByZXFfYnVmKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWNkZl9tZW1fZnJlZShyZXFfYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmVxX2J1Zi0+TURJRC5tZGllUHJlc2VudCA9CisJCW1hY19jdHgtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbl9pZF0uCisJCWNvbm5lY3RlZFByb2ZpbGUuTURJRC5tZGllUHJlc2VudDsKKwlyZXFfYnVmLT5NRElELm1vYmlsaXR5RG9tYWluID0KKwkJbWFjX2N0eC0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uX2lkXS4KKwkJY29ubmVjdGVkUHJvZmlsZS5NRElELm1vYmlsaXR5RG9tYWluOworCXJlcV9idWYtPnNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisJcmVxX2J1Zi0+blByb2JlcyA9IG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0ublByb2JlczsKKwlyZXFfYnVmLT5Ib21lQXdheVRpbWUgPSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtU2NhbkhvbWVBd2F5VGltZTsKKworCS8qCisJICogSG9tZSBBd2F5IFRpbWUgc2hvdWxkIGJlIGF0IGxlYXN0IGVxdWFsIHRvIChNYXhEd2VsbCB0aW1lICsgKDIqUkZTKSksCisJICogd2hlcmUgUkZTIGlzIHRoZSBSRiBTd2l0Y2hpbmcgdGltZS4gSXQgaXMgdHdpY2UgUkZTIHRvIGNvbnNpZGVyIHRoZQorCSAqIHRpbWUgdG8gZ28gb2ZmIGNoYW5uZWwgYW5kIHJldHVybiB0byB0aGUgaG9tZSBjaGFubmVsLgorCSAqLworCWlmIChyZXFfYnVmLT5Ib21lQXdheVRpbWUgPCAocmVxX2J1Zi0+TmVpZ2hib3JTY2FuQ2hhbm5lbE1heFRpbWUgKworCSAgICAgKDIgKiBDU1JfUk9BTV9TQ0FOX0NIQU5ORUxfU1dJVENIX1RJTUUpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICBGTCgiSW52YWxpZCBjb25maWcsIEhvbWUgYXdheSB0aW1lKCVkKSBpcyBsZXNzIHRoYW4gKHR3aWNlIFJGIHN3aXRjaGluZyB0aW1lICsgY2hhbm5lbCBtYXggdGltZSkoJWQpLiBIZW5jZSBlbmZvcmNpbmcgaG9tZSBhd2F5IHRpbWUgdG8gZGlzYWJsZSAoMCkiKSwKKwkJCSAgcmVxX2J1Zi0+SG9tZUF3YXlUaW1lLAorCQkJICAocmVxX2J1Zi0+TmVpZ2hib3JTY2FuQ2hhbm5lbE1heFRpbWUgKworCQkJICAgKDIgKiBDU1JfUk9BTV9TQ0FOX0NIQU5ORUxfU1dJVENIX1RJTUUpKSk7CisJCXJlcV9idWYtPkhvbWVBd2F5VGltZSA9IDA7CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkgIEZMKCJIb21lQXdheVRpbWU6JWQiKSwgcmVxX2J1Zi0+SG9tZUF3YXlUaW1lKTsKKworCS8qUHJlcGFyZSBhIHByb2JlIHJlcXVlc3QgZm9yIDIuNEdIeiBiYW5kIGFuZCBvbmUgZm9yIDVHSHogYmFuZCAqLworCWRvdDExX21vZGUgPSAodWludDhfdCkgY3NyX3RyYW5zbGF0ZV90b193bmlfY2ZnX2RvdDExX21vZGUobWFjX2N0eCwKKwkJCQljc3JfZmluZF9iZXN0X3BoeV9tb2RlKG1hY19jdHgsCisJCQkJCW1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSkpOworCWNzcl9yb2FtX3NjYW5fb2ZmbG9hZF9wcmVwYXJlX3Byb2JlX3JlcV90ZW1wbGF0ZShtYWNfY3R4LAorCQlTSVJfUk9BTV9TQ0FOXzI0R19ERUZBVUxUX0NILCBkb3QxMV9tb2RlLAorCQlzZXNzaW9uLT5zZWxmTWFjQWRkci5ieXRlcywgcmVxX2J1Zi0+cDI0R1Byb2JlVGVtcGxhdGUsCisJCSZyZXFfYnVmLT51czI0R1Byb2JlVGVtcGxhdGVMZW4sIHNlc3Npb24pOworCisJY3NyX3JvYW1fc2Nhbl9vZmZsb2FkX3ByZXBhcmVfcHJvYmVfcmVxX3RlbXBsYXRlKG1hY19jdHgsCisJCVNJUl9ST0FNX1NDQU5fNUdfREVGQVVMVF9DSCwgZG90MTFfbW9kZSwKKwkJc2Vzc2lvbi0+c2VsZk1hY0FkZHIuYnl0ZXMsCisJCXJlcV9idWYtPnA1R1Byb2JlVGVtcGxhdGUsICZyZXFfYnVmLT51czVHUHJvYmVUZW1wbGF0ZUxlbiwKKwkJc2Vzc2lvbik7CisJcmVxX2J1Zi0+YWxsb3dERlNDaGFubmVsUm9hbSA9CisJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5hbGxvd0RGU0NoYW5uZWxSb2FtOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlyZXFfYnVmLT5Sb2FtT2ZmbG9hZEVuYWJsZWQgPSBjc3Jfcm9hbUlzUm9hbU9mZmxvYWRFbmFibGVkKG1hY19jdHgpOworCXJlcV9idWYtPlJvYW1LZXlNZ210T2ZmbG9hZEVuYWJsZWQgPSBzZXNzaW9uLT5Sb2FtS2V5TWdtdE9mZmxvYWRFbmFibGVkOworCS8qIFJvYW0gT2ZmbG9hZCBwaWdneWJhY2tzIHVwb24gdGhlIFJvYW0gU2NhbiBvZmZsb2FkIGNvbW1hbmQuICovCisJaWYgKHJlcV9idWYtPlJvYW1PZmZsb2FkRW5hYmxlZCkKKwkJY3NyX3VwZGF0ZV9yb2FtX3NjYW5fb2ZmbG9hZF9yZXF1ZXN0KG1hY19jdHgsIHJlcV9idWYsIHNlc3Npb24pOworCWNkZl9tZW1fY29weSgmcmVxX2J1Zi0+cm9hbV9wYXJhbXMsCisJCSZtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLnJvYW1fcGFyYW1zLAorCQlzaXplb2YocmVxX2J1Zi0+cm9hbV9wYXJhbXMpKTsKKyNlbmRpZgorCXJldHVybiByZXFfYnVmOworfQorLyoqCisgKiBjaGVja19hbGxvd2VkX3NzaWRfbGlzdCgpIC0gQ2hlY2sgdGhlIFdoaXRlTGlzdAorICogQHJlcV9idWZmZXI6ICAgICAgQnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25uZWN0ZWQgcHJvZmlsZSBTU0lELgorICogQHJvYW1fcGFyYW1zOiAgICAgQnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSB3aGl0ZWxpc3QgU1NJRCdzLgorICoKKyAqIENoZWNrIGlmIHRoZSBjb25uZWN0ZWQgcHJvZmlsZSBTU0lEIGV4aXN0cyBpbiB0aGUgd2hpdGVsaXN0LgorICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgcHJvdmlkZXMgdGhpcyBhbHNvIGluIHRoZSB3aGl0ZWxpc3QuCisgKiBJZiBpdCBleGlzdHMgdGhlcmUgaXMgbm8gaXNzdWUuIE90aGVyd2lzZSBhZGQgaXQgdG8gdGhlIGxpc3QuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2FsbG93ZWRfc3NpZF9saXN0KHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgKnJlcV9idWZmZXIsCisJCXN0cnVjdCByb2FtX2V4dF9wYXJhbXMgKnJvYW1fcGFyYW1zKQoreworCWludCBpID0gMDsKKwlib29sIG1hdGNoID0gZmFsc2U7CisJZm9yIChpID0gMDsgaSA8IHJvYW1fcGFyYW1zLT5udW1fc3NpZF9hbGxvd2VkX2xpc3Q7IGkrKykgeworCQlpZiAoKHJvYW1fcGFyYW1zLT5zc2lkX2FsbG93ZWRfbGlzdFtpXS5sZW5ndGggPT0KKwkJCXJlcV9idWZmZXItPkNvbm5lY3RlZE5ldHdvcmsuc3NJZC5sZW5ndGgpICYmCisJCQljZGZfbWVtX2NvbXBhcmUocm9hbV9wYXJhbXMtPnNzaWRfYWxsb3dlZF9saXN0W2ldLnNzSWQsCisJCQkJcmVxX2J1ZmZlci0+Q29ubmVjdGVkTmV0d29yay5zc0lkLnNzSWQsCisJCQkJcm9hbV9wYXJhbXMtPnNzaWRfYWxsb3dlZF9saXN0W2ldLmxlbmd0aCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCSJXaGl0ZWxpc3QgY29udGFpbnMgY29ubmVjdGVkIHByb2ZpbGUgU1NJRCIpOworCQkJbWF0Y2ggPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFtYXRjaCkgeworCQlpZiAocm9hbV9wYXJhbXMtPm51bV9zc2lkX2FsbG93ZWRfbGlzdCA+PQorCQkJCU1BWF9TU0lEX0FMTE9XRURfTElTVCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkJIldoaXRlbGlzdCBpcyBGVUxMLiBDYW5ub3QgQWRkIGFub3RoZXIgZW50cnkiKTsKKwkJCXJldHVybjsKKwkJfQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkiQWRkaW5nIENvbm5lY3RlZCBwcm9maWxlIFNTSUQgdG8gd2hpdGVsaXN0Iik7CisJCS8qIGkgaXMgdGhlIG5leHQgYXZhaWxhYmxlIGluZGV4IHRvIGFkZCB0aGUgZW50cnkuKi8KKwkJaSA9IHJvYW1fcGFyYW1zLT5udW1fc3NpZF9hbGxvd2VkX2xpc3Q7CisJCWNkZl9tZW1fY29weShyb2FtX3BhcmFtcy0+c3NpZF9hbGxvd2VkX2xpc3RbaV0uc3NJZCwKKwkJCQlyZXFfYnVmZmVyLT5Db25uZWN0ZWROZXR3b3JrLnNzSWQuc3NJZCwKKwkJCQlyZXFfYnVmZmVyLT5Db25uZWN0ZWROZXR3b3JrLnNzSWQubGVuZ3RoKTsKKwkJcm9hbV9wYXJhbXMtPnNzaWRfYWxsb3dlZF9saXN0W2ldLmxlbmd0aCA9CisJCQlyZXFfYnVmZmVyLT5Db25uZWN0ZWROZXR3b3JrLnNzSWQubGVuZ3RoOworCQlyb2FtX3BhcmFtcy0+bnVtX3NzaWRfYWxsb3dlZF9saXN0Kys7CisJfQorfQorCisvKgorICogQmVsb3cgVGFibGUgZGVzY3JpYmUgd2hldGhlciBSU08gY29tbWFuZCBjYW4gYmUgc2VuZCBkb3duIHRvIGZpbXJ3YXJlIG9yIG5vdC4KKyAqIEhvc3QgY2hlY2sgaXQgb24gdGhlIGJhc2lzIG9mIHByZXZpb3VzIFJTTyBjb21tYW5kIHNlbnQgZG93biB0byBmaXJtd2FyZS4KKyAqfHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXx8CisgKnx8IE5ldyBjbWQgICAgICAgIHwgICAgICAgICAgICBMQVNUIFNFTlQgQ09NTUFORCAtLS0+ICAgICAgICAgICAgICAgICAgICAgICB8fAorICp8fD09PT18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fHwKKyAqfHwgICAgViAgICAgICAgICAgfCAgUlNPX1NUQVJUICB8ICBSU09fU1RPUCAgfCAgUlNPX1JFU1RBUlQgfCBSU09fVVBEQVRFX0NGR3x8CisgKnx8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18fAorICp8fCBSU09fU1RBUlQgICAgICB8ICAgICBOTyAgICAgIHwgICBZRVMgICAgICB8ICAgICBOTyAgICAgICB8ICAgICAgTk8gICAgICAgfHwKKyAqfHwgUlNPX1NUT1AgICAgICAgfCAgICBZRVMgICAgICB8ICAgWUVTICAgICAgfCAgICAgWUVTICAgICAgfCAgICAgIFlFUyAgICAgIHx8CisgKnx8IFJTT19SRVNUQVJUICAgIHwgICAgWUVTICAgICAgfCAgIE5PICAgICAgIHwgICAgIE5PICAgICAgIHwgICAgICBZRVMgICAgICB8fAorICp8fCBSU09fVVBEQVRFX0NGRyB8ICAgIFlFUyAgICAgIHwgICBOTyAgICAgICB8ICAgICBZRVMgICAgICB8ICAgICAgWUVTICAgICAgfHwKKyAqfHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXx8CisgKiovCisjZGVmaW5lIFJTT19TVEFSVF9CSVQgICAgICAgKDE8PFJPQU1fU0NBTl9PRkZMT0FEX1NUQVJUKQorI2RlZmluZSBSU09fU1RPUF9CSVQgICAgICAgICgxPDxST0FNX1NDQU5fT0ZGTE9BRF9TVE9QKQorI2RlZmluZSBSU09fUkVTVEFSVF9CSVQgICAgICgxPDxST0FNX1NDQU5fT0ZGTE9BRF9SRVNUQVJUKQorI2RlZmluZSBSU09fVVBEQVRFX0NGR19CSVQgICgxPDxST0FNX1NDQU5fT0ZGTE9BRF9VUERBVEVfQ0ZHKQorI2RlZmluZSBSU09fU1RBUlRfQUxMT1dfTUFTSyAgIChSU09fU1RPUF9CSVQpCisjZGVmaW5lIFJTT19TVE9QX0FMTE9XX01BU0sgICAgKFJTT19VUERBVEVfQ0ZHX0JJVCB8IFJTT19SRVNUQVJUX0JJVCB8IFwKKwkJUlNPX1NUT1BfQklUIHwgUlNPX1NUQVJUX0JJVCkKKyNkZWZpbmUgUlNPX1JFU1RBUlRfQUxMT1dfTUFTSyAoUlNPX1VQREFURV9DRkdfQklUIHwgUlNPX1NUQVJUX0JJVCkKKyNkZWZpbmUgUlNPX1VQREFURV9DRkdfQUxMT1dfTUFTSyAgKFJTT19VUERBVEVfQ0ZHX0JJVCB8IFJTT19TVE9QX0JJVCB8IFwKKwkJUlNPX1NUQVJUX0JJVCkKKworYm9vbCBjc3JfaXNfUlNPX2NtZF9hbGxvd2VkKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3QgY29tbWFuZCwKKwkJdWludDhfdCBzZXNzaW9uX2lkKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gbmVpZ2hfcm9hbV9pbmZvID0KKwkJJm1hY19jdHgtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uX2lkXTsKKwl1aW50OF90IGRlc2lyZWRNYXNrID0gMDsKKwlib29sIHJldF92YWw7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFJPQU1fU0NBTl9PRkZMT0FEX1NUQVJUOgorCQlkZXNpcmVkTWFzayA9IFJTT19TVEFSVF9BTExPV19NQVNLOworCQlicmVhazsKKwljYXNlIFJPQU1fU0NBTl9PRkZMT0FEX1NUT1A6CisJCWRlc2lyZWRNYXNrID0gUlNPX1NUT1BfQUxMT1dfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBST0FNX1NDQU5fT0ZGTE9BRF9SRVNUQVJUOgorCQlkZXNpcmVkTWFzayA9IFJTT19SRVNUQVJUX0FMTE9XX01BU0s7CisJCWJyZWFrOworCWNhc2UgUk9BTV9TQ0FOX09GRkxPQURfVVBEQVRFX0NGRzoKKwkJZGVzaXJlZE1hc2sgPSBSU09fVVBEQVRFX0NGR19BTExPV19NQVNLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCUZMKCJXcm9uZyBSU08gY29tbWFuZCAlZCwgbm90IGFsbG93ZWQiKSwgY29tbWFuZCk7CisJCXJldHVybiAwOy8qQ21kIE5vdCBhbGxvd2VkKi8KKwl9CisJcmV0X3ZhbCA9IGRlc2lyZWRNYXNrICYgKDEgPDwgbmVpZ2hfcm9hbV9pbmZvLT5sYXN0X3NlbnRfY21kKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCisgKiBjc3Jfcm9hbV9vZmZsb2FkX3NjYW4oKSAtIHBvcHVsYXRlcyByb2FtIG9mZmxvYWQgc2NhbiByZXF1ZXN0IGFuZCBzZW5kcyB0bworICogV01BCisgKgorICogcGFyYW10ZXJzCisgKiBAbWFjX2N0eDogICAgICBnbG9iYWwgbWFjIGN0eAorICogQHNlc3Npb25faWQ6ICAgc2Vzc2lvbiBpZAorICogQGNvbW1hbmQ6ICAgICAgcm9hbSBzY2FuIG9mZmxvYWQgY29tbWFuZCBpbnB1dAorICogQHJlYXNvbjogICAgICAgcmVhc29uIHRvIHJvYW0KKyAqCisgKiBSZXR1cm46IHJlc3VsdCBvZiBvcGVyYXRpb24KKyAqLworQ0RGX1NUQVRVUworY3NyX3JvYW1fb2ZmbG9hZF9zY2FuKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3Qgc2Vzc2lvbl9pZCwKKwkJICAgICAgdWludDhfdCBjb21tYW5kLCB1aW50OF90IHJlYXNvbikKK3sKKwl1aW50OF90ICpzdGF0ZSA9IE5VTEw7CisJY2RzX21zZ190IG1zZzsKKwl0U2lyUm9hbU9mZmxvYWRTY2FuUmVxICpyZXFfYnVmOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHJvYW1faW5mbyA9CisJCSZtYWNfY3R4LT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbl9pZF07CisJc3RydWN0IHJvYW1fZXh0X3BhcmFtcyAqcm9hbV9wYXJhbXNfZHN0OworCXN0cnVjdCByb2FtX2V4dF9wYXJhbXMgKnJvYW1fcGFyYW1zX3NyYzsKKwl1aW50OF90IGk7CisKKwlpZiAoTlVMTCA9PSBzZXNzaW9uKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgic2Vzc2lvbiBpcyBudWxsIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlpZiAoc2Vzc2lvbi0+cm9hbU9mZmxvYWRTeW5jaFBhcmFtcy5iUm9hbVN5bmNoSW5Qcm9ncmVzcworCSAgICAmJiAoUk9BTV9TQ0FOX09GRkxPQURfU1RPUCA9PSBjb21tYW5kKSkgeworCQkvKgorCQkgKiBXaGVuIHJvYW0gc3luY2ggaXMgaW4gcHJvZ3Jlc3MgZm9yIHByb3BhZ2F0aW9uLCB0aGVyZSBpcyBubworCQkgKiBuZWVkIHRvIHNlbmQgZG93biB0aGUgU1RPUCBjb21tYW5kIHNpbmNlIHRoZSBmaXJtd2FyZSBpcyBub3QKKwkJICogZXhwZWN0aW5nIGFueSBXTUkgY29tbWFuZHMgd2hlbiB0aGUgcm9hbSBzeW5jaCBpcyBpbiBwcm9ncmVzcworCQkgKi8KKwkJYl9yb2FtX3NjYW5fb2ZmbG9hZF9zdGFydGVkID0gZmFsc2U7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorI2VuZGlmCisJaWYgKDAgPT0gY3NyX3JvYW1faXNfcm9hbV9vZmZsb2FkX3NjYW5fZW5hYmxlZChtYWNfY3R4KSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsICJpc1JvYW1PZmZsb2FkU2NhbkVuYWJsZWQgbm90IHNldCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICghY3NyX2lzX1JTT19jbWRfYWxsb3dlZChtYWNfY3R4LCBjb21tYW5kLCBzZXNzaW9uX2lkKSAmJgorCQkJcmVhc29uICE9IFJFQVNPTl9ST0FNX1NFVF9CTEFDS0xJU1RfQlNTSUQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiUlNPIG91dC1vZi1zeW5jIGNvbW1hbmQgJWQgbGFzdFNlbnRDbWQgJWQiKSwKKwkJCWNvbW1hbmQsIHJvYW1faW5mby0+bGFzdF9zZW50X2NtZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoKHRydWUgPT0gYl9yb2FtX3NjYW5fb2ZmbG9hZF9zdGFydGVkKQorCSAgICAmJiAoUk9BTV9TQ0FOX09GRkxPQURfU1RBUlQgPT0gY29tbWFuZCkpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCAiUm9hbSBTY2FuIE9mZmxvYWQgaXMgYWxyZWFkeSBzdGFydGVkIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyoKKwkgKiBUaGUgRHluYW1pYyBDb25maWcgSXRlbXMgVXBkYXRlIG1heSBoYXBwZW4gZXZlbiBpZiB0aGUgc3RhdGUgaXMgaW4KKwkgKiBJTklULiBJdCBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbW1hbmQgaXMgcGFzc2VkIGRvd24gdG8KKwkgKiB0aGUgRlcgb25seSBpZiB0aGUgSW5mcmEgU3RhdGlvbiBpcyBpbiBhIGNvbm5lY3RlZCBzdGF0ZS5BIGNvbm5lY3RlZAorCSAqIHN0YXRpb24gY291bGQgYWxzbyBiZSBpbiBhIFBSRUFVVEggb3IgUkVBU1NPQyBzdGF0ZXMuU28sIGNvbnNpZGVyIG5vdAorCSAqIHNlbmRpbmcgdGhlIGNvbW1hbmQgZG93biBpbiBJTklUIHN0YXRlLiBXZSBhbHNvIGhhdmUgdG8gZW5zdXJlIHRoYXQKKwkgKiBpZiB0aGVyZSBpcyBhIFNUT1AgY29tbWFuZCB3ZSBhbHdheXMgaGF2ZSB0byBpbmZvcm0gUml2YSwKKwkgKiBpcnJlc3BlY3RpdmUgb2Ygd2hpY2hldmVyIHN0YXRlIHdlIGFyZSBpbgorCSAqLworCisJaWYgKChyb2FtX2luZm8tPm5laWdoYm9yUm9hbVN0YXRlID09CisJICAgICBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfSU5JVCkgJiYKKwkgICAgKGNvbW1hbmQgIT0gUk9BTV9TQ0FOX09GRkxPQURfU1RPUCkgJiYKKwkgICAgKHJlYXNvbiAhPSBSRUFTT05fUk9BTV9TRVRfQkxBQ0tMSVNUX0JTU0lEKSkgeworCQlzdGF0ZSA9IG1hY190cmFjZV9nZXRfbmVpZ2hib3VyX3JvYW1fc3RhdGUoCisJCQkJcm9hbV9pbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSk7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJICBGTCgiU2NhbiBDb21tYW5kIG5vdCBzZW50IHRvIEZXIHN0YXRlPSVzIGFuZCBjbWQ9JWQiKSwKKwkJCSAgc3RhdGUsICBjb21tYW5kKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJlcV9idWYgPSBjc3JfY3JlYXRlX3JvYW1fc2Nhbl9vZmZsb2FkX3JlcXVlc3QobWFjX2N0eCwgY29tbWFuZCwKKwkJCQkJCSAgICAgICBzZXNzaW9uX2lkLCByZWFzb24sCisJCQkJCQkgICAgICAgc2Vzc2lvbiwgcm9hbV9pbmZvKTsKKwlpZiAoIXJlcV9idWYpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJGYWlsZWQgdG8gY3JlYXRlIHJlcSBwYWNrZXQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcm9hbV9wYXJhbXNfZHN0ID0gJnJlcV9idWYtPnJvYW1fcGFyYW1zOworCXJvYW1fcGFyYW1zX3NyYyA9ICZtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLnJvYW1fcGFyYW1zOworCWlmIChyZWFzb24gPT0gUkVBU09OX1JPQU1fU0VUX1NTSURfQUxMT1dFRCkKKwkJY2hlY2tfYWxsb3dlZF9zc2lkX2xpc3QocmVxX2J1Ziwgcm9hbV9wYXJhbXNfc3JjKTsKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgbG9va3VwIHRocmVzaG9sZCBlaXRoZXIgZnJvbSBJTkkgb3IgZnJvbSBmcmFtZXdvcmsuCisJICogSWYgYm90aCBhcmUgcHJlc2VudCwgZ2l2ZSBoaWdoZXIgcHJpb3JpdHkgdG8gdGhlIG9uZSBmcm9tIGZyYW1ld29yay4KKwkgKi8KKwlpZiAocm9hbV9wYXJhbXNfc3JjLT5hbGVydF9yc3NpX3RocmVzaG9sZCkKKwkJcmVxX2J1Zi0+TG9va3VwVGhyZXNob2xkID0KKwkJCXJvYW1fcGFyYW1zX3NyYy0+YWxlcnRfcnNzaV90aHJlc2hvbGQ7CisJZWxzZQorCQlyZXFfYnVmLT5Mb29rdXBUaHJlc2hvbGQgPQorCQkJKGludDhfdClyb2FtX2luZm8tPmNmZ1BhcmFtcy5uZWlnaGJvckxvb2t1cFRocmVzaG9sZCAqCisJCQkoLTEpOworCWNkZl9tZW1fY29weShyb2FtX3BhcmFtc19kc3QsIHJvYW1fcGFyYW1zX3NyYywKKwkJc2l6ZW9mKHN0cnVjdCByb2FtX2V4dF9wYXJhbXMpKTsKKwkvKgorCSAqIHJzc2lfZGlmZiB3aGljaCBpcyB1cGRhdGVkIHZpYSBmcmFtZXdvcmsgaXMgZXF1aXZhbGVudCB0byB0aGUKKwkgKiBJTkkgUm9hbVJzc2lEaWZmIHBhcmFtZXRlciBhbmQgaGVuY2Ugc2hvdWxkIGJlIHVwZGF0ZWQuCisJICovCisJaWYgKHJvYW1fcGFyYW1zX3NyYy0+cnNzaV9kaWZmKQorCQlyZXFfYnVmLT5Sb2FtUnNzaURpZmYgPSByb2FtX3BhcmFtc19zcmMtPnJzc2lfZGlmZjsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJIm51bV9ic3NpZF9hdm9pZF9saXN0OiAlZCwgbnVtX3NzaWRfYWxsb3dlZF9saXN0OiAlZCwgIgorCQkibnVtX2Jzc2lkX2Zhdm9yZWQ6ICVkLCByYWlzZV9yc3NpX3RocmVzaF81ZzogJWQsICIKKwkJImRyb3BfcnNzaV90aHJlc2hfNWc6ICVkLCByYWlzZV9yc3NpX3R5cGVfNWc6ICVkLCAiCisJCSJyYWlzZV9mYWN0b3JfNWc6ICVkLCBkcm9wX3Jzc2lfdHlwZV81ZzogJWQsICIKKwkJImRyb3BfZmFjdG9yXzVnOiAlZCwgbWF4X3JhaXNlX3Jzc2lfNWc6ICVkLCAiCisJCSJtYXhfZHJvcF9yc3NpXzVnOiAlZCwgcnNzaV9kaWZmOiAlZCwgYWxlcnRfcnNzaV90aHJlc2hvbGQ6JWQiLAorCQlyb2FtX3BhcmFtc19kc3QtPm51bV9ic3NpZF9hdm9pZF9saXN0LAorCQlyb2FtX3BhcmFtc19kc3QtPm51bV9zc2lkX2FsbG93ZWRfbGlzdCwKKwkJcm9hbV9wYXJhbXNfZHN0LT5udW1fYnNzaWRfZmF2b3JlZCwKKwkJcm9hbV9wYXJhbXNfZHN0LT5yYWlzZV9yc3NpX3RocmVzaF81ZywKKwkJcm9hbV9wYXJhbXNfZHN0LT5kcm9wX3Jzc2lfdGhyZXNoXzVnLAorCQlyb2FtX3BhcmFtc19kc3QtPnJhaXNlX3Jzc2lfdHlwZV81ZywKKwkJcm9hbV9wYXJhbXNfZHN0LT5yYWlzZV9mYWN0b3JfNWcsCisJCXJvYW1fcGFyYW1zX2RzdC0+ZHJvcF9yc3NpX3R5cGVfNWcsCisJCXJvYW1fcGFyYW1zX2RzdC0+ZHJvcF9mYWN0b3JfNWcsCisJCXJvYW1fcGFyYW1zX2RzdC0+bWF4X3JhaXNlX3Jzc2lfNWcsCisJCXJvYW1fcGFyYW1zX2RzdC0+bWF4X2Ryb3BfcnNzaV81ZywKKwkJcmVxX2J1Zi0+Um9hbVJzc2lEaWZmLCByb2FtX3BhcmFtc19kc3QtPmFsZXJ0X3Jzc2lfdGhyZXNob2xkKTsKKworCWZvciAoaSA9IDA7IGkgPCByb2FtX3BhcmFtc19kc3QtPm51bV9ic3NpZF9hdm9pZF9saXN0OyBpKyspIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkiQmxhY2tsaXN0IEJzc2lkOiAoIk1BQ19BRERSRVNTX1NUUiIpIiwKKwkJCU1BQ19BRERSX0FSUkFZKHJvYW1fcGFyYW1zX2RzdC0+YnNzaWRfYXZvaWRfbGlzdFtpXSkpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcm9hbV9wYXJhbXNfZHN0LT5udW1fc3NpZF9hbGxvd2VkX2xpc3Q7IGkrKykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSJXaGl0ZWxpc3Q6ICUuKnMiLAorCQkJcm9hbV9wYXJhbXNfZHN0LT5zc2lkX2FsbG93ZWRfbGlzdFtpXS5sZW5ndGgsCisJCQlyb2FtX3BhcmFtc19kc3QtPnNzaWRfYWxsb3dlZF9saXN0W2ldLnNzSWQpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcm9hbV9wYXJhbXNfZHN0LT5udW1fYnNzaWRfZmF2b3JlZDsgaSsrKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJIlByZWZlcnJlZCBCc3NpZDogKCJNQUNfQUREUkVTU19TVFIiKSBzY29yZTogJWQiLAorCQkJTUFDX0FERFJfQVJSQVkocm9hbV9wYXJhbXNfZHN0LT5ic3NpZF9mYXZvcmVkW2ldKSwKKwkJCXJvYW1fcGFyYW1zX2RzdC0+YnNzaWRfZmF2b3JlZF9mYWN0b3JbaV0pOworCX0KKworCXJlcV9idWYtPmhpX3Jzc2lfc2Nhbl9tYXhfY291bnQgPQorCQlyb2FtX2luZm8tPmNmZ1BhcmFtcy5oaV9yc3NpX3NjYW5fbWF4X2NvdW50OworCXJlcV9idWYtPmhpX3Jzc2lfc2Nhbl9yc3NpX2RlbHRhID0KKwkJcm9hbV9pbmZvLT5jZmdQYXJhbXMuaGlfcnNzaV9zY2FuX3Jzc2lfZGVsdGE7CisJcmVxX2J1Zi0+aGlfcnNzaV9zY2FuX2RlbGF5ID0KKwkJcm9hbV9pbmZvLT5jZmdQYXJhbXMuaGlfcnNzaV9zY2FuX2RlbGF5OworCXJlcV9idWYtPmhpX3Jzc2lfc2Nhbl9yc3NpX3ViID0KKwkJcm9hbV9pbmZvLT5jZmdQYXJhbXMuaGlfcnNzaV9zY2FuX3Jzc2lfdWI7CisKKwltc2cudHlwZSA9IFdNQV9ST0FNX1NDQU5fT0ZGTE9BRF9SRVE7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IHJlcV9idWY7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJICAgIChjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogTm90IGFibGUgdG8gcG9zdCBtZXNzYWdlIHRvIFdNQSIsCisJCQkgIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKHJlcV9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfSBlbHNlIHsKKwkJaWYgKFJPQU1fU0NBTl9PRkZMT0FEX1NUQVJUID09IGNvbW1hbmQpCisJCQliX3JvYW1fc2Nhbl9vZmZsb2FkX3N0YXJ0ZWQgPSB0cnVlOworCQllbHNlIGlmIChST0FNX1NDQU5fT0ZGTE9BRF9TVE9QID09IGNvbW1hbmQpCisJCQliX3JvYW1fc2Nhbl9vZmZsb2FkX3N0YXJ0ZWQgPSBmYWxzZTsKKwl9CisJLyogdXBkYXRlIHRoZSBsYXN0IHNlbnQgY21kICovCisJcm9hbV9pbmZvLT5sYXN0X3NlbnRfY21kID0gY29tbWFuZDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkgICJSb2FtIFNjYW4gT2ZmbG9hZCBDb21tYW5kICVkLCBSZWFzb24gJWQiLCBjb21tYW5kLCByZWFzb24pOworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fb2ZmbG9hZF9zY2FuX3JzcF9oZGxyKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgdHBTaXJSb2FtT2ZmbG9hZFNjYW5Sc3Agc2Nhbk9mZmxvYWRSc3ApCit7CisJc3dpdGNoIChzY2FuT2ZmbG9hZFJzcC0+cmVhc29uKSB7CisJY2FzZSAwOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCSAgIlJzcCBmb3IgUm9hbSBTY2FuIE9mZmxvYWQgd2l0aCBmYWlsdXJlIHN0YXR1cyIpOworCQlicmVhazsKKwljYXNlIFJFQVNPTl9PU19SRVFVRVNURURfUk9BTUlOR19OT1c6CisJCWNzcl9uZWlnaGJvcl9yb2FtX3Byb2NlZWRfd2l0aF9oYW5kb2ZmX3JlcShwTWFjLAorCQkJCQkJCSAgIHNjYW5PZmZsb2FkUnNwLT5zZXNzaW9uSWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICJSc3AgZm9yIFJvYW0gU2NhbiBPZmZsb2FkIHdpdGggcmVhc29uICVkIiwKKwkJCSAgc2Nhbk9mZmxvYWRSc3AtPnJlYXNvbik7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3RDc3JQZVN0YXRzUmVxSW5mbyAqY3NyX3JvYW1fY2hlY2tfcGVfc3RhdHNfcmVxX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgICAgdWludDMyX3Qgc3RhdHNNYXNrLAorCQkJCQkJICAgICB1aW50MzJfdCBwZXJpb2RpY2l0eSwKKwkJCQkJCSAgICAgYm9vbCAqcEZvdW5kLAorCQkJCQkJICAgICB1aW50OF90IHN0YUlkLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwlib29sIGZvdW5kID0gZmFsc2U7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclBlU3RhdHNSZXFJbmZvIHN0YUVudHJ5OworCXRDc3JQZVN0YXRzUmVxSW5mbyAqcFRlbXBTdGFFbnRyeSA9IE5VTEw7CisJdExpc3RFbGVtICpwU3RhRW50cnkgPSBOVUxMOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwkqcEZvdW5kID0gZmFsc2U7CisKKwlwU3RhRW50cnkgPSBjc3Jfcm9hbV9maW5kX2luX3BlX3N0YXRzX3JlcV9saXN0KHBNYWMsIHN0YXRzTWFzayk7CisJaWYgKHBTdGFFbnRyeSkgeworCQlwVGVtcFN0YUVudHJ5ID0KKwkJCUdFVF9CQVNFX0FERFIocFN0YUVudHJ5LCB0Q3NyUGVTdGF0c1JlcUluZm8sIGxpbmspOworCQlpZiAocFRlbXBTdGFFbnRyeS0+cGVyaW9kaWNpdHkpIHsKKwkJCXBUZW1wU3RhRW50cnktPnBlcmlvZGljaXR5ID0KKwkJCQlDREZfTUlOKHBlcmlvZGljaXR5LAorCQkJCQlwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSk7CisJCX0gZWxzZSB7CisJCQlwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSA9IHBlcmlvZGljaXR5OworCQl9CisJCXBUZW1wU3RhRW50cnktPm51bUNsaWVudCsrOworCQlmb3VuZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJY2RmX21lbV9zZXQoJnN0YUVudHJ5LCBzaXplb2YodENzclBlU3RhdHNSZXFJbmZvKSwgMCk7CisJCXN0YUVudHJ5Lm51bUNsaWVudCA9IDE7CisJCXN0YUVudHJ5LnBlcmlvZGljaXR5ID0gcGVyaW9kaWNpdHk7CisJCXN0YUVudHJ5LnBNYWMgPSBwTWFjOworCQlzdGFFbnRyeS5yc3BQZW5kaW5nID0gZmFsc2U7CisJCXN0YUVudHJ5LnN0YUlkID0gc3RhSWQ7CisJCXN0YUVudHJ5LnN0YXRzTWFzayA9IHN0YXRzTWFzazsKKwkJc3RhRW50cnkudGltZXJSdW5uaW5nID0gZmFsc2U7CisJCXN0YUVudHJ5LnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJcFRlbXBTdGFFbnRyeSA9CisJCQljc3Jfcm9hbV9pbnNlcnRfZW50cnlfaW50b19wZV9zdGF0c19yZXFfbGlzdChwTWFjLAorCQkJCQkJCQkgICAgICZwTWFjLT5yb2FtLgorCQkJCQkJCQkgICAgIHBlU3RhdHNSZXFMaXN0LAorCQkJCQkJCQkgICAgICZzdGFFbnRyeSk7CisJCWlmICghcFRlbXBTdGFFbnRyeSkgeworCQkJLyogbXNnICovCisJCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkJImNzcl9yb2FtX2NoZWNrX3BlX3N0YXRzX3JlcV9saXN0OiBGYWlsZWQgdG8gaW5zZXJ0IHJlcSBpbiBwZVN0YXRzUmVxTGlzdCIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJcFRlbXBTdGFFbnRyeS0+cGVyaW9kaWNpdHkgPQorCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnN0YXRzUmVxUGVyaW9kaWNpdHlJblBTOworCisJaWYgKCFwVGVtcFN0YUVudHJ5LT50aW1lclJ1bm5pbmcpIHsKKwkJLyogc2VuZCBkb3duIGEgcmVxIGluIGNhc2Ugb2Ygb25lIHRpbWUgcmVxLCBmb3IgcGVyaW9kaWMgb25lcyB3YWl0IGZvciB0aW1lciB0byBleHBpcmUgKi8KKwkJaWYgKCFwVGVtcFN0YUVudHJ5LT5yc3BQZW5kaW5nICYmICFwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSkgeworCQkJc3RhdHVzID0gY3NyX3NlbmRfbWJfc3RhdHNfcmVxX21zZyhwTWFjLAorCQkJCQkJCSAgIHN0YXRzTWFzayAmIH4oMSA8PAorCQkJCQkJCQkJIGVDc3JHbG9iYWxDbGFzc0RTdGF0cyksCisJCQkJCQkJICAgc3RhSWQsIHNlc3Npb25JZCk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTAorCQkJCQkJKCJjc3Jfcm9hbV9jaGVja19wZV9zdGF0c19yZXFfbGlzdDpmYWlsZWQgdG8gc2VuZCBkb3duIHN0YXRzIHJlcSB0byBQRSIpKTsKKwkJCX0gZWxzZSB7CisJCQkJcFRlbXBTdGFFbnRyeS0+cnNwUGVuZGluZyA9IHRydWU7CisJCQl9CisJCX0KKwkJaWYgKHBUZW1wU3RhRW50cnktPnBlcmlvZGljaXR5KSB7CisJCQlpZiAoIWZvdW5kKSB7CisKKwkJCQljZGZfc3RhdHVzID0KKwkJCQkJY2RmX21jX3RpbWVyX2luaXQoJnBUZW1wU3RhRW50cnktPgorCQkJCQkJCSAgaFBlU3RhdHNUaW1lciwKKwkJCQkJCQkgIENERl9USU1FUl9UWVBFX1NXLAorCQkJCQkJCSAgY3NyX3JvYW1fcGVfc3RhdHNfdGltZXJfaGFuZGxlciwKKwkJCQkJCQkgIHBUZW1wU3RhRW50cnkpOworCQkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJCUZMCisJCQkJCQkJKCJjc3Jfcm9hbV9jaGVja19wZV9zdGF0c19yZXFfbGlzdDpjYW5ub3QgaW5pdCBoUGVTdGF0c1RpbWVyIHRpbWVyIikpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9CisJCQkvKiBzdGFydCB0aW1lciAqLworCQkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJCSJjc3Jfcm9hbV9jaGVja19wZV9zdGF0c19yZXFfbGlzdDpwZVN0YXRzVGltZXIgcGVyaW9kICVkIiwKKwkJCQlwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSk7CisJCQljZGZfc3RhdHVzID0KKwkJCQljZGZfbWNfdGltZXJfc3RhcnQoJnBUZW1wU3RhRW50cnktPmhQZVN0YXRzVGltZXIsCisJCQkJCQkgICBwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwKKwkJCQkJCSgiY3NyX3JvYW1fY2hlY2tfcGVfc3RhdHNfcmVxX2xpc3Q6Y2Fubm90IHN0YXJ0IGhQZVN0YXRzVGltZXIgdGltZXIiKSk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlwVGVtcFN0YUVudHJ5LT50aW1lclJ1bm5pbmcgPSB0cnVlOworCQl9CisJfQorCSpwRm91bmQgPSBmb3VuZDsKKwlyZXR1cm4gcFRlbXBTdGFFbnRyeTsKK30KKworLyoKKyAgICBwU3RhRW50cnkgaXMgbm8gbG9uZ2VyIGludmFsaWQgdXBvbiB0aGUgcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGNzcl9yb2FtX3JlbW92ZV9zdGF0X2xpc3RfZW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpCit7CisJaWYgKHBFbnRyeSkgeworCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeQorCQkJICAgICgmcE1hYy0+cm9hbS5zdGF0c0NsaWVudFJlcUxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0spKSB7CisJCQljZGZfbWVtX2ZyZWUoR0VUX0JBU0VfQUREUgorCQkJCQkgICAgIChwRW50cnksIHRDc3JTdGF0c0NsaWVudFJlcUluZm8sIGxpbmspKTsKKwkJfQorCX0KK30KKwordm9pZCBjc3Jfcm9hbV9yZW1vdmVfZW50cnlfZnJvbV9wZV9zdGF0c19yZXFfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdENzclBlU3RhdHNSZXFJbmZvICpwUGVTdGFFbnRyeSkKK3sKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwl0Q3NyUGVTdGF0c1JlcUluZm8gKnBUZW1wU3RhRW50cnk7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnJvYW0ucGVTdGF0c1JlcUxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKwlpZiAoIXBFbnRyeSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgTGlzdCBlbXB0eSwgbm8gc3RhdHMgcmVxIGZvciBQRSIpKTsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAocEVudHJ5KSB7CisJCXBUZW1wU3RhRW50cnkgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclBlU3RhdHNSZXFJbmZvLCBsaW5rKTsKKwkJaWYgKE5VTEwgPT0gcFRlbXBTdGFFbnRyeQorCQkJfHwgKHBUZW1wU3RhRW50cnktPnN0YXRzTWFzayAhPQorCQkJCXBQZVN0YUVudHJ5LT5zdGF0c01hc2spKSB7CisJCQlwRW50cnkgPSBjc3JfbGxfbmV4dCgmcE1hYy0+cm9hbS5wZVN0YXRzUmVxTGlzdCwgcEVudHJ5LAorCQkJCQlMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNtc19sb2cocE1hYywgTE9HVywgRkwoIk1hdGNoIGZvdW5kIikpOworCQlpZiAocFRlbXBTdGFFbnRyeS0+dGltZXJSdW5uaW5nKSB7CisJCQljZGZfc3RhdHVzID0gY2RmX21jX3RpbWVyX3N0b3AoCisJCQkJCSZwVGVtcFN0YUVudHJ5LT5oUGVTdGF0c1RpbWVyKTsKKwkJCS8qCisJCQkgKiBJZiB3ZSBhcmUgbm90IGFibGUgdG8gc3RvcCB0aGUgdGltZXIgaGVyZSwganVzdAorCQkJICogcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaW5rZWQgbGlzdC4gRGVzdHJveSB0aGUKKwkJCSAqIHRpbWVyIG9iamVjdCBhbmQgZnJlZSB0aGUgbWVtb3J5IGluIHRoZSB0aW1lciBDQgorCQkJICovCisJCQlpZiAoY2RmX3N0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkvKiB0aGUgdGltZXIgaXMgc3VjY2Vzc2Z1bGx5IHN0b3BwZWQgKi8KKwkJCQlwVGVtcFN0YUVudHJ5LT50aW1lclJ1bm5pbmcgPSBmYWxzZTsKKwkJCQkvKiBEZXN0cm95IHRoZSB0aW1lciAqLworCQkJCWNkZl9zdGF0dXMgPSBjZGZfbWNfdGltZXJfZGVzdHJveSgKKwkJCQkJCSZwVGVtcFN0YUVudHJ5LT5oUGVTdGF0c1RpbWVyKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiB0aGUgdGltZXIgY291bGQgbm90IGJlIHN0b3BwZWQuIEhlbmNlIGRlc3Ryb3kKKwkJCQkgKiBhbmQgZnJlZSB0aGUgbWVtb3J5IGZvciB0aGUgUEUgc3RhdCBlbnRyeSBpbgorCQkJCSAqIHRoZSB0aW1lciBDQi4KKwkJCQkgKi8KKwkJCQlwVGVtcFN0YUVudHJ5LT50aW1lclN0b3BGYWlsZWQgPSB0cnVlOworCQkJfQorCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMKCJmYWlsZWQgdG8gc3RvcC9kZXN0cm95IHRpbWVyIikpOworCQkJfQorCQl9CisKKwkJaWYgKGNzcl9sbF9yZW1vdmVfZW50cnkoJnBNYWMtPnJvYW0ucGVTdGF0c1JlcUxpc3QsIHBFbnRyeSwKKwkJCQkJTExfQUNDRVNTX0xPQ0spKSB7CisJCQkvKgorCQkJICogT25seSBmcmVlIHRoZSBtZW1vcnkgaWYgd2UgY291bGQgc3RvcCB0aGUgdGltZXIKKwkJCSAqIHN1Y2Nlc3NmdWxseQorCQkJICovCisJCQlpZiAoIXBUZW1wU3RhRW50cnktPnRpbWVyU3RvcEZhaWxlZCkgeworCQkJCWNkZl9tZW1fZnJlZShwVGVtcFN0YUVudHJ5KTsKKwkJCQlwVGVtcFN0YUVudHJ5ID0gTlVMTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCXBFbnRyeSA9IGNzcl9sbF9uZXh0KCZwTWFjLT5yb2FtLnBlU3RhdHNSZXFMaXN0LCBwRW50cnksCisJCQkJICAgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl9IC8qIGVuZCBvZiB3aGlsZSBsb29wICovCisJcmV0dXJuOworfQorCit2b2lkIGNzcl9yb2FtX3JlcG9ydF9zdGF0aXN0aWNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHN0YXRzTWFzaywKKwkJCQl0Q3NyU3RhdHNDYWxsYmFjayBjYWxsYmFjaywgdWludDhfdCBzdGFJZCwKKwkJCQl2b2lkICpwQ29udGV4dCkKK3sKKwl1aW50OF90IHN0YXRzWzUwMF07CisJdWludDhfdCAqcFN0YXRzID0gTlVMTDsKKwl1aW50MzJfdCB0ZW1wTWFzayA9IDA7CisJdWludDhfdCBjb3VudGVyID0gMDsKKwlpZiAoIWNhbGxiYWNrKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCByZXBvcnQgY2FsbGJhY2sgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXN0YXRzTWFzaykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgcmVwb3J0IHN0YXRzTWFzayBpcyAwIikpOworCQlyZXR1cm47CisJfQorCXBTdGF0cyA9IHN0YXRzOworCXRlbXBNYXNrID0gc3RhdHNNYXNrOworCXdoaWxlICh0ZW1wTWFzaykgeworCQlpZiAodGVtcE1hc2sgJiAxKSB7CisJCQkvKiBuZXcgc3RhdHMgaW5mbyBmcm9tIFBFLCBmaWxsIHVwIHRoZSBzdGF0cyBzdHJ1Y3V0cmVzIGluIFBNQUMgKi8KKwkJCXN3aXRjaCAoY291bnRlcikgeworCQkJY2FzZSBlQ3NyU3VtbWFyeVN0YXRzOgorCQkJCXNtc19sb2cocE1hYywgTE9HMiwgRkwoIlN1bW1hcnkgc3RhdHMiKSk7CisJCQkJY2RmX21lbV9jb3B5KHBTdGF0cywKKwkJCQkJICAgICAodWludDhfdCAqKSAmcE1hYy0+cm9hbS4KKwkJCQkJICAgICBzdW1tYXJ5U3RhdHNJbmZvLAorCQkJCQkgICAgIHNpemVvZih0Q3NyU3VtbWFyeVN0YXRzSW5mbykpOworCQkJCXBTdGF0cyArPSBzaXplb2YodENzclN1bW1hcnlTdGF0c0luZm8pOworCQkJCWJyZWFrOworCQkJY2FzZSBlQ3NyR2xvYmFsQ2xhc3NBU3RhdHM6CisJCQkJc21zX2xvZyhwTWFjLCBMT0cyLCBGTCgiQ2xhc3NBIHN0YXRzIikpOworCQkJCWNkZl9tZW1fY29weShwU3RhdHMsCisJCQkJCSAgICAgKHVpbnQ4X3QgKikgJnBNYWMtPnJvYW0uCisJCQkJCSAgICAgY2xhc3NBU3RhdHNJbmZvLAorCQkJCQkgICAgIHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NBU3RhdHNJbmZvKSk7CisJCQkJcFN0YXRzICs9IHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NBU3RhdHNJbmZvKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgZUNzckdsb2JhbENsYXNzQlN0YXRzOgorCQkJCXNtc19sb2cocE1hYywgTE9HMiwgRkwoIkNsYXNzQiBzdGF0cyIpKTsKKwkJCQljZGZfbWVtX2NvcHkocFN0YXRzLAorCQkJCQkgICAgICh1aW50OF90ICopICZwTWFjLT5yb2FtLgorCQkJCQkgICAgIGNsYXNzQlN0YXRzSW5mbywKKwkJCQkJICAgICBzaXplb2YodENzckdsb2JhbENsYXNzQlN0YXRzSW5mbykpOworCQkJCXBTdGF0cyArPSBzaXplb2YodENzckdsb2JhbENsYXNzQlN0YXRzSW5mbyk7CisJCQkJYnJlYWs7CisJCQljYXNlIGVDc3JHbG9iYWxDbGFzc0NTdGF0czoKKwkJCQlzbXNfbG9nKHBNYWMsIExPRzIsIEZMKCJDbGFzc0Mgc3RhdHMiKSk7CisJCQkJY2RmX21lbV9jb3B5KHBTdGF0cywKKwkJCQkJICAgICAodWludDhfdCAqKSAmcE1hYy0+cm9hbS4KKwkJCQkJICAgICBjbGFzc0NTdGF0c0luZm8sCisJCQkJCSAgICAgc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0NTdGF0c0luZm8pKTsKKwkJCQlwU3RhdHMgKz0gc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0NTdGF0c0luZm8pOworCQkJCWJyZWFrOworCQkJY2FzZSBlQ3NyR2xvYmFsQ2xhc3NEU3RhdHM6CisJCQkJc21zX2xvZyhwTWFjLCBMT0cyLCBGTCgiQ2xhc3NEIHN0YXRzIikpOworCQkJCWNkZl9tZW1fY29weShwU3RhdHMsCisJCQkJCSAgICAgKHVpbnQ4X3QgKikgJnBNYWMtPnJvYW0uCisJCQkJCSAgICAgY2xhc3NEU3RhdHNJbmZvLAorCQkJCQkgICAgIHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NEU3RhdHNJbmZvKSk7CisJCQkJcFN0YXRzICs9IHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NEU3RhdHNJbmZvKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgZUNzclBlclN0YVN0YXRzOgorCQkJCXNtc19sb2cocE1hYywgTE9HMiwgRkwoIlBlclN0YSBzdGF0cyIpKTsKKwkJCQljZGZfbWVtX2NvcHkocFN0YXRzLAorCQkJCQkgICAgICh1aW50OF90ICopICZwTWFjLT5yb2FtLgorCQkJCQkgICAgIHBlclN0YVN0YXRzSW5mb1tzdGFJZF0sCisJCQkJCSAgICAgc2l6ZW9mKHRDc3JQZXJTdGFTdGF0c0luZm8pKTsKKwkJCQlwU3RhdHMgKz0gc2l6ZW9mKHRDc3JQZXJTdGFTdGF0c0luZm8pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJCUZMKCJVbmtub3duIHN0YXRzIHR5cGUgYW5kIGNvdW50ZXIgJWQiKSwKKwkJCQkJY291bnRlcik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJdGVtcE1hc2sgPj49IDE7CisJCWNvdW50ZXIrKzsKKwl9CisJY2FsbGJhY2soc3RhdHMsIHBDb250ZXh0KTsKK30KKworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9kZXJlZ19zdGF0aXN0aWNzX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKwl0TGlzdEVsZW0gKnBQcmV2RW50cnkgPSBOVUxMOworCXRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnBUZW1wU3RhRW50cnkgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwTWFjLT5yb2FtLnN0YXRzQ2xpZW50UmVxTGlzdCwgTExfQUNDRVNTX0xPQ0spOworCWlmICghcEVudHJ5KSB7CisJCS8qIGxpc3QgZW1wdHkgKi8KKwkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJImNzcl9yb2FtX2RlcmVnX3N0YXRpc3RpY3NfcmVxOiBMaXN0IGVtcHR5LCBubyByZXF1ZXN0IGZyb20gIgorCQkJInVwcGVyIGxheWVyIGNsaWVudChzKSIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwl3aGlsZSAocEVudHJ5KSB7CisJCWlmIChwUHJldkVudHJ5KSB7CisJCQlwVGVtcFN0YUVudHJ5ID0KKwkJCQlHRVRfQkFTRV9BRERSKHBQcmV2RW50cnksIHRDc3JTdGF0c0NsaWVudFJlcUluZm8sCisJCQkJCSAgICAgIGxpbmspOworCQkJLyogc2VuZCB1cCB0aGUgc3RhdHMgcmVwb3J0ICovCisJCQljc3Jfcm9hbV9yZXBvcnRfc3RhdGlzdGljcyhwTWFjLCBwVGVtcFN0YUVudHJ5LT5zdGF0c01hc2ssCisJCQkJCQkgICBwVGVtcFN0YUVudHJ5LT5jYWxsYmFjaywKKwkJCQkJCSAgIHBUZW1wU3RhRW50cnktPnN0YUlkLAorCQkJCQkJICAgcFRlbXBTdGFFbnRyeS0+cENvbnRleHQpOworCQkJY3NyX3JvYW1fcmVtb3ZlX3N0YXRfbGlzdF9lbnRyeShwTWFjLCBwUHJldkVudHJ5KTsKKwkJfQorCQlwVGVtcFN0YUVudHJ5ID0KKwkJCUdFVF9CQVNFX0FERFIocEVudHJ5LCB0Q3NyU3RhdHNDbGllbnRSZXFJbmZvLCBsaW5rKTsKKwkJaWYgKHBUZW1wU3RhRW50cnktPnBQZVN0YUVudHJ5KSB7CisJCQkvKiBwUGVTdGFFbnRyeSBjYW4gYmUgTlVMTCAqLworCQkJcFRlbXBTdGFFbnRyeS0+cFBlU3RhRW50cnktPm51bUNsaWVudC0tOworCQkJLyogY2hlY2sgaWYgd2UgbmVlZCB0byBkZWxldGUgdGhlIGVudHJ5IGZyb20gcGVTdGF0c1JlcUxpc3QgdG9vICovCisJCQlpZiAoIXBUZW1wU3RhRW50cnktPnBQZVN0YUVudHJ5LT5udW1DbGllbnQpIHsKKwkJCQljc3Jfcm9hbV9yZW1vdmVfZW50cnlfZnJvbV9wZV9zdGF0c19yZXFfbGlzdChwTWFjLAorCQkJCQkJCQkJICAgICBwVGVtcFN0YUVudHJ5LT4KKwkJCQkJCQkJCSAgICAgcFBlU3RhRW50cnkpOworCQkJfQorCQl9CisJCS8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gc3RvcCB0aGUgdGwgc3RhdHMgdGltZXIgdG9vICovCisJCXBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8ubnVtQ2xpZW50LS07CisJCWlmICghcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5udW1DbGllbnQpIHsKKwkJCWlmIChwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLnRpbWVyUnVubmluZykgeworCQkJCXN0YXR1cyA9CisJCQkJCWNkZl9tY190aW1lcl9zdG9wKCZwTWFjLT5yb2FtLgorCQkJCQkJCSAgdGxTdGF0c1JlcUluZm8uCisJCQkJCQkJICBoVGxTdGF0c1RpbWVyKTsKKwkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJCUZMCisJCQkJCQkJKCJjc3Jfcm9hbV9kZXJlZ19zdGF0aXN0aWNzX3JlcTpjYW5ub3Qgc3RvcCBUbFN0YXRzVGltZXIgdGltZXIiKSk7CisJCQkJCS8qIHdlIHdpbGwgY29udGludWUgKi8KKwkJCQl9CisJCQl9CisJCQlwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLnBlcmlvZGljaXR5ID0gMDsKKwkJCXBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8udGltZXJSdW5uaW5nID0gZmFsc2U7CisJCX0KKwkJaWYgKHBUZW1wU3RhRW50cnktPnBlcmlvZGljaXR5KSB7CisJCQkvKiBXaGlsZSBjcmVhdGluZyBTdGFFbnRyeSBpbiBjc3JfZ2V0X3N0YXRpc3RpY3MsICovCisJCQkvKiBJbml0aWFsaXppbmcgYW5kIHN0YXJ0aW5nIHRpbWVyIG9ubHkgd2hlbiBwZXJpb2RpY2l0eSBpcyBzZXQuICovCisJCQkvKiBTbyBTdG9wIGFuZCBEZXN0cm95IHRpbWVyIG9ubHkgd2hlbiBwZXJpb2RpY2l0eSBpcyBzZXQuICovCisKKwkJCWNkZl9tY190aW1lcl9zdG9wKCZwVGVtcFN0YUVudHJ5LT50aW1lcik7CisJCQkvKiBEZXN0cm95IHRoZSBjZGYgdGltZXIuLi4gKi8KKwkJCWNkZl9zdGF0dXMgPQorCQkJCWNkZl9tY190aW1lcl9kZXN0cm95KCZwVGVtcFN0YUVudHJ5LT50aW1lcik7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwKKwkJCQkJCSgiY3NyX3JvYW1fZGVyZWdfc3RhdGlzdGljc19yZXE6ZmFpbGVkIHRvIGRlc3Ryb3kgQ2xpZW50IHJlcSB0aW1lciIpKTsKKwkJCX0KKwkJfQorCisJCXBQcmV2RW50cnkgPSBwRW50cnk7CisJCXBFbnRyeSA9CisJCQljc3JfbGxfbmV4dCgmcE1hYy0+cm9hbS5zdGF0c0NsaWVudFJlcUxpc3QsIHBFbnRyeSwKKwkJCQkgICAgTExfQUNDRVNTX05PTE9DSyk7CisJfQorCS8qIHRoZSBsYXN0IG9uZSAqLworCWlmIChwUHJldkVudHJ5KSB7CisJCXBUZW1wU3RhRW50cnkgPQorCQkJR0VUX0JBU0VfQUREUihwUHJldkVudHJ5LCB0Q3NyU3RhdHNDbGllbnRSZXFJbmZvLCBsaW5rKTsKKwkJLyogc2VuZCB1cCB0aGUgc3RhdHMgcmVwb3J0ICovCisJCWNzcl9yb2FtX3JlcG9ydF9zdGF0aXN0aWNzKHBNYWMsIHBUZW1wU3RhRW50cnktPnN0YXRzTWFzaywKKwkJCQkJICAgcFRlbXBTdGFFbnRyeS0+Y2FsbGJhY2ssCisJCQkJCSAgIHBUZW1wU3RhRW50cnktPnN0YUlkLAorCQkJCQkgICBwVGVtcFN0YUVudHJ5LT5wQ29udGV4dCk7CisJCWNzcl9yb2FtX3JlbW92ZV9zdGF0X2xpc3RfZW50cnkocE1hYywgcFByZXZFbnRyeSk7CisJfQorCXJldHVybiBzdGF0dXM7CisKK30KKwordFNtZUNtZCAqY3NyX2dldF9jb21tYW5kX2J1ZmZlcih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRTbWVDbWQgKnBDbWQgPSBzbWVfZ2V0X2NvbW1hbmRfYnVmZmVyKHBNYWMpOworCWlmIChwQ21kKSB7CisJCXBNYWMtPnJvYW0uc1BlbmRpbmdDb21tYW5kcysrOworCX0KKwlyZXR1cm4gcENtZDsKK30KKwordm9pZCBjc3JfcmVsZWFzZV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCWlmIChwTWFjLT5yb2FtLnNQZW5kaW5nQ29tbWFuZHMgPiAwKSB7CisJCS8qIEFsbCBjb21tYW5kIGFsbG9jYXRlZCB0aHJvdWdoIGNzcl9nZXRfY29tbWFuZF9idWZmZXIgbmVlZCB0byAqLworCQkvKiBkZWNyZW1lbnQgdGhlIHBlbmRpbmcgY291bnQgd2hlbiByZWxlYXNpbmcuICovCisJCXBNYWMtPnJvYW0uc1BlbmRpbmdDb21tYW5kcy0tOworCQlzbWVfcmVsZWFzZV9jb21tYW5kKHBNYWMsIHBDb21tYW5kKTsKKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJubyBwZW5kaW5nIGNvbW1hbmRzIikpOworCQlDREZfQVNTRVJUKDApOworCX0KK30KKworLyogUmV0dXJuIFNVQ0NFU1MgaXMgdGhlIGNvbW1hbmQgaXMgcXVldWVkLCBmYWlsZWQgKi8KK0NERl9TVEFUVVMgY3NyX3F1ZXVlX3NtZV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kLAorCQkJCSBib29sIGZIaWdoUHJpb3JpdHkpCit7CisJYm9vbCBmTm9DbWRQZW5kaW5nOworCisJaWYgKCFTTUVfSVNfU1RBUlQocE1hYykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiU21lIGluIHN0b3Agc3RhdGUiKSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUEVSTTsKKwl9CisKKwlpZiAoKGVTbWVDb21tYW5kU2NhbiA9PSBwQ29tbWFuZC0+Y29tbWFuZCkgJiYgcE1hYy0+c2Nhbi5mRHJvcFNjYW5DbWQpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiIGRyb3Agc2NhbiAoc2NhbiByZWFzb24gJWQpIGNvbW1hbmQiKSwKKwkJCXBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfQ1NSX1dST05HX1NUQVRFOworCX0KKworCWlmICgocENvbW1hbmQtPmNvbW1hbmQgPT0gZVNtZUNvbW1hbmRTY2FuKQorCSAgICB8fCAocENvbW1hbmQtPmNvbW1hbmQgPT0gZVNtZUNvbW1hbmRSZW1haW5PbkNoYW5uZWwpKSB7CisJCXNtc19sb2cocE1hYywgTE9HVywKKwkJRkwoInNjYW4gcGVuZGluZyBsaXN0IGNvdW50ICVkIHNjYW5faWQgJWQiKSwKKwkJCXBNYWMtPnNtZS5zbWVTY2FuQ21kUGVuZGluZ0xpc3QuQ291bnQsCisJCQlwQ29tbWFuZC0+dS5zY2FuQ21kLnNjYW5JRCk7CisJCWNzcl9sbF9pbnNlcnRfdGFpbCgmcE1hYy0+c21lLnNtZVNjYW5DbWRQZW5kaW5nTGlzdCwKKwkJCQkgICAmcENvbW1hbmQtPkxpbmssIExMX0FDQ0VTU19MT0NLKTsKKwkJLyogcHJvY2VzcyB0aGUgY29tbWFuZCBxdWV1ZS4uLiAqLworCQlzbWVfcHJvY2Vzc19wZW5kaW5nX3F1ZXVlKHBNYWMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKwkvKiBNYWtlIHN1cmUgcm9hbUNtZFBlbmRpbmdMaXN0IGlzIG5vdCBlbXB0eSBmaXJzdCAqLworCWZOb0NtZFBlbmRpbmcgPQorCQljc3JfbGxfaXNfbGlzdF9lbXB0eSgmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QsIGZhbHNlKTsKKwlpZiAoZk5vQ21kUGVuZGluZykgeworCQlzbWVfcHVzaF9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCBmSGlnaFByaW9yaXR5KTsKKwl9IGVsc2UgeworCQkvKiBubyBsaXN0IGxvY2sgaXMgbmVlZGVkIHNpbmNlIFNNRSBsb2NrIGlzIGhlbGQgKi8KKwkJaWYgKCFmSGlnaFByaW9yaXR5KSB7CisJCQljc3JfbGxfaW5zZXJ0X3RhaWwoJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0LAorCQkJCQkmcENvbW1hbmQtPkxpbmssIGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCWNzcl9sbF9pbnNlcnRfaGVhZCgmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QsCisJCQkJCSZwQ29tbWFuZC0+TGluaywgZmFsc2UpOworCQl9CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fdXBkYXRlX2Fwd3BzaWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgIHRTaXJBUFdQU0lFcyAqcEFQV1BTSUVTKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTaXJVcGRhdGVBUFdQU0lFc1JlcSAqcE1zZzsKKworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiICBTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBzZXNzaW9uIGlkICVkIiksCisJCQlzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJZG8geworCQlwTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJVcGRhdGVBUFdQU0lFc1JlcSkpOworCQlpZiAoTlVMTCA9PSBwTXNnKQorCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJY2RmX21lbV9zZXQocE1zZywgc2l6ZW9mKHRTaXJVcGRhdGVBUFdQU0lFc1JlcSksIDApOworCQlwTXNnLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1VQREFURV9BUFdQU0lFX1JFUTsKKwkJcE1zZy0+dHJhbnNhY3Rpb25JZCA9IDA7CisJCWNkZl9tZW1fY29weShwTXNnLT5ic3NJZCwgJnBTZXNzaW9uLT5zZWxmTWFjQWRkciwKKwkJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcE1zZy0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCQljZGZfbWVtX2NvcHkoJnBNc2ctPkFQV1BTSUVzLCBwQVBXUFNJRVMsCisJCQkJc2l6ZW9mKHRTaXJBUFdQU0lFcykpOworCQlwTXNnLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHNTaXJVcGRhdGVBUFdQU0lFc1JlcSk7CisJCXN0YXR1cyA9IGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKHBNc2cpOworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fdXBkYXRlX3dwYXJzbmlfZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgIHRTaXJSU05pZSAqcEFQU2lyUlNOaWUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNpclVwZGF0ZUFQV1BBUlNOSUVzUmVxICpwTXNnOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiICBTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBzZXNzaW9uIGlkICVkIiksCisJCQlzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWRvIHsKKwkJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyVXBkYXRlQVBXUEFSU05JRXNSZXEpKTsKKwkJaWYgKE5VTEwgPT0gcE1zZykKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCWNkZl9tZW1fc2V0KHBNc2csIHNpemVvZih0U2lyVXBkYXRlQVBXUEFSU05JRXNSZXEpLCAwKTsKKwkJcE1zZy0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9TRVRfQVBXUEFSU05JRXNfUkVROworCQlwTXNnLT50cmFuc2FjdGlvbklkID0gMDsKKwkJY2RmX21lbV9jb3B5KHBNc2ctPmJzc0lkLCAmcFNlc3Npb24tPnNlbGZNYWNBZGRyLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJCWNkZl9tZW1fY29weSgmcE1zZy0+QVBXUEFSU05JRXMsIHBBUFNpclJTTmllLAorCQkJICAgICBzaXplb2YodFNpclJTTmllKSk7CisJCXBNc2ctPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc1NpclVwZGF0ZUFQV1BBUlNOSUVzUmVxKTsKKwkJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCitDREZfU1RBVFVTCitjc3Jfcm9hbV9pc3N1ZV9mdF9wcmVhdXRoX3JlcSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCSAgICAgIHRwU2lyQnNzRGVzY3JpcHRpb24gcEJzc0Rlc2NyaXB0aW9uKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0cFNpckZUUHJlQXV0aFJlcSBwZnRQcmVBdXRoUmVxOworCXVpbnQxNl90IGF1dGhfcmVxX2xlbiA9IDA7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKE5VTEwgPT0gcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIHNlc3Npb24gaWQoJWQpIiksCisJCQlzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJYXV0aF9yZXFfbGVuID0gc2l6ZW9mKHRTaXJGVFByZUF1dGhSZXEpOworCXBmdFByZUF1dGhSZXEgPSAodHBTaXJGVFByZUF1dGhSZXEpIGNkZl9tZW1fbWFsbG9jKGF1dGhfcmVxX2xlbik7CisJaWYgKE5VTEwgPT0gcGZ0UHJlQXV0aFJlcSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiTWVtb3J5IGFsbG9jYXRpb24gZm9yIEZUIFByZWF1dGggcmVxdWVzdCBmYWlsZWQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCS8qIFNhdmUgdGhlIFNNRSBTZXNzaW9uIElEIGhlcmUuIFdlIG5lZWQgaXQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgcHJlYXV0aCByZXNwb25zZSAqLworCXBTZXNzaW9uLT5mdFNtZUNvbnRleHQuc21lU2Vzc2lvbklkID0gc2Vzc2lvbklkOworCWNkZl9tZW1femVybyhwZnRQcmVBdXRoUmVxLCBhdXRoX3JlcV9sZW4pOworCisJcGZ0UHJlQXV0aFJlcS0+cGJzc0Rlc2NyaXB0aW9uID0KKwkJKHRwU2lyQnNzRGVzY3JpcHRpb24pIGNkZl9tZW1fbWFsbG9jKHNpemVvZihwQnNzRGVzY3JpcHRpb24tPmxlbmd0aCkKKwkJCQkJCSAgICAgKyBwQnNzRGVzY3JpcHRpb24tPmxlbmd0aCk7CisJaWYgKE5VTEwgPT0gcGZ0UHJlQXV0aFJlcS0+cGJzc0Rlc2NyaXB0aW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgRlQgUHJlYXV0aCByZXF1ZXN0IGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlwZnRQcmVBdXRoUmVxLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0ZUX1BSRV9BVVRIX1JFUTsKKworCXBmdFByZUF1dGhSZXEtPnByZUF1dGhjaGFubmVsTnVtID0gcEJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQ7CisKKwljZGZfbWVtX2NvcHkoKHZvaWQgKikmcGZ0UHJlQXV0aFJlcS0+Y3VycmJzc0lkLAorCQkgICAgICh2b2lkICopcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQuYnl0ZXMsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJY2RmX21lbV9jb3B5KCh2b2lkICopJnBmdFByZUF1dGhSZXEtPnByZUF1dGhic3NJZCwKKwkJICAgICAodm9pZCAqKXBCc3NEZXNjcmlwdGlvbi0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAoY3NyX3JvYW1faXMxMXJfYXNzb2MocE1hYywgc2Vzc2lvbklkKSAmJgorCSAgICAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGUuQXV0aFR5cGUgIT0KKwkgICAgIGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNKSkgeworCQlwZnRQcmVBdXRoUmVxLT5mdF9pZXNfbGVuZ3RoID0KKwkJCSh1aW50MTZfdCkgcFNlc3Npb24tPmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llc19sZW5ndGg7CisJCWNkZl9tZW1fY29weShwZnRQcmVBdXRoUmVxLT5mdF9pZXMsCisJCQkgICAgIHBTZXNzaW9uLT5mdFNtZUNvbnRleHQuYXV0aF9mdF9pZXMsCisJCQkgICAgIHBTZXNzaW9uLT5mdFNtZUNvbnRleHQuYXV0aF9mdF9pZXNfbGVuZ3RoKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJcGZ0UHJlQXV0aFJlcS0+ZnRfaWVzX2xlbmd0aCA9IDA7CisJfQorCWNkZl9tZW1fY29weShwZnRQcmVBdXRoUmVxLT5wYnNzRGVzY3JpcHRpb24sIHBCc3NEZXNjcmlwdGlvbiwKKwkJICAgICBzaXplb2YocEJzc0Rlc2NyaXB0aW9uLT5sZW5ndGgpICsgcEJzc0Rlc2NyaXB0aW9uLT5sZW5ndGgpOworCXBmdFByZUF1dGhSZXEtPmxlbmd0aCA9IGF1dGhfcmVxX2xlbjsKKwlyZXR1cm4gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocGZ0UHJlQXV0aFJlcSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgd2lsbCByZWNlaXZlIGFuZCBwcm9jZXNzIHRoZSBGVCBQcmUgQXV0aCBSc3AgZnJvbSB0aGUgY3VycmVudAorICogYXNzb2NpYXRlZCBhcC4KKyAqCisgKiBUaGlzIHdpbGwgaW52b2tlIHRoZSBoZGQgY2FsbCBiYWNrLiBUaGlzIGlzIHNvIHRoYXQgaGRkIGNhbiBub3cKKyAqIHNlbmQgdGhlIEZUSUVzIGZyb20gdGhlIEF1dGggUnNwIChBdXRoIFNlcSAyKSB0byB0aGUgc3VwcGxpY2FudC4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNzcl9yb2FtX2Z0X3ByZV9hdXRoX3JzcF9wcm9jZXNzb3IodEhhbEhhbmRsZSBoSGFsLAorCQkJCQl0cFNpckZUUHJlQXV0aFJzcCBwRlRQcmVBdXRoUnNwKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKwl0Q3NyUm9hbUluZm8gcm9hbUluZm87CisjZW5kaWYKKwllQ3NyQXV0aFR5cGUgY29ubl9BdXRoX3R5cGU7CisJdWludDMyX3Qgc2Vzc2lvbklkID0gcEZUUHJlQXV0aFJzcC0+c21lU2Vzc2lvbklkOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmIChOVUxMID09IHBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoInBTZXNzaW9uIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKwlzdGF0dXMgPQorCQljc3JfbmVpZ2hib3Jfcm9hbV9wcmVhdXRoX3JzcF9oYW5kbGVyKHBNYWMsIHBGVFByZUF1dGhSc3AtPnNtZVNlc3Npb25JZCwKKwkJCQkJCSAgICAgIHBGVFByZUF1dGhSc3AtPnN0YXR1cyk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJLyoKKwkJICogQmFpbCBvdXQgaWYgcHJlLWF1dGggd2FzIG5vdCBldmVuIHByb2Nlc3NlZC4KKwkJICovCisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJQcmVhdXRoIHdhcyBub3QgcHJvY2Vzc2VkOiAlZCBTZXNzaW9uSUQ6ICVkIiksCisJCQlzdGF0dXMsIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCS8qIFRoZSBiZWxvdyBmdW5jdGlvbiBjYWxscy90aW1lcnMgc2hvdWxkIGJlIGludm9rZWQgb25seSBpZiB0aGUgcHJlLWF1dGggaXMgc3VjY2Vzc2Z1bCAqLworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gKENERl9TVEFUVVMpIHBGVFByZUF1dGhSc3AtPnN0YXR1cykKKwkJcmV0dXJuOworCS8qIEltcGxpZXMgYSBzdWNjZXNzICovCisJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5GVFN0YXRlID0gZUZUX0FVVEhfQ09NUExFVEU7CisJLyogSW5kaWNhdGUgU01FIFFvUyBtb2R1bGUgdGhlIGNvbXBsZXRpb24gb2YgUHJlYXV0aCBzdWNjZXNzLiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgUklDIElFcyAqLworCXBTZXNzaW9uLT5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwID0gcEZUUHJlQXV0aFJzcDsKKwkvKiBObyBuZWVkIHRvIG5vdGlmeSBxb3MgbW9kdWxlIGlmIHRoaXMgaXMgYSBub24gMTFyICYgRVNFIHJvYW0gKi8KKwlpZiAoY3NyX3JvYW1faXMxMXJfYXNzb2MocE1hYywgcEZUUHJlQXV0aFJzcC0+c21lU2Vzc2lvbklkKQorI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKwkJIHx8IGNzcl9yb2FtX2lzX2VzZV9hc3NvYyhwTWFjLCBwRlRQcmVBdXRoUnNwLT5zbWVTZXNzaW9uSWQpCisjZW5kaWYKKwkpIHsKKwkJc21lX3Fvc19jc3JfZXZlbnRfaW5kKHBNYWMsCisJCQkJICAgICAgcFNlc3Npb24tPmZ0U21lQ29udGV4dC5zbWVTZXNzaW9uSWQsCisJCQkJICAgICAgU01FX1FPU19DU1JfUFJFQVVUSF9TVUNDRVNTX0lORCwgTlVMTCk7CisJfQorCS8qIFN0YXJ0IHRoZSBwcmUtYXV0aCByZWFzc29jIGludGVydmFsIHRpbWVyIHdpdGggYSBwZXJpb2Qgb2YgNDAwbXMuIFdoZW4gdGhpcyBleHBpcmVzLAorCSAqIGFjdHVhbCB0cmFuc2l0aW9uIGZyb20gdGhlIGN1cnJlbnQgdG8gaGFuZG9mZiBBUCBpcyB0cmlnZ2VyZWQgKi8KKwlzdGF0dXMgPQorCQljZGZfbWNfdGltZXJfc3RhcnQoJnBTZXNzaW9uLT5mdFNtZUNvbnRleHQucHJlQXV0aFJlYXNzb2NJbnR2bFRpbWVyLAorCQkJCSAgIDYwKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkJCSgiUHJlYXV0aCByZWFzc29jIGludGVydmFsIHRpbWVyIHN0YXJ0IGZhaWxlZCB0byBzdGFydCB3aXRoIHN0YXR1cyAlZCIpLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKwkvKiBTYXZlIHRoZSByZWNlaXZlZCByZXNwb25zZSAqLworCWNkZl9tZW1fY29weSgodm9pZCAqKSZwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnByZUF1dGhic3NJZCwKKwkJICAgICAodm9pZCAqKXBGVFByZUF1dGhSc3AtPnByZUF1dGhic3NJZCwgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwlpZiAoY3NyX3JvYW1faXMxMXJfYXNzb2MocE1hYywgcEZUUHJlQXV0aFJzcC0+c21lU2Vzc2lvbklkKSkKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBwRlRQcmVBdXRoUnNwLT5zbWVTZXNzaW9uSWQsIE5VTEwsIDAsCisJCQkJICAgICAgIGVDU1JfUk9BTV9GVF9SRVNQT05TRSwKKwkJCQkgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9OT05FKTsKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKwlpZiAoY3NyX3JvYW1faXNfZXNlX2Fzc29jKHBNYWMsIHBGVFByZUF1dGhSc3AtPnNtZVNlc3Npb25JZCkpIHsKKwkJLyogcmVhZCBUU0YgKi8KKwkJY3NyX3JvYW1fcmVhZF90c2YocE1hYywgKHVpbnQ4X3QgKikgcm9hbUluZm8udGltZXN0YW1wLAorCQkJCSAgcEZUUHJlQXV0aFJzcC0+c21lU2Vzc2lvbklkKTsKKwkJLyogU2F2ZSB0aGUgYnNzaWQgZnJvbSB0aGUgcmVjZWl2ZWQgcmVzcG9uc2UgKi8KKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJnJvYW1JbmZvLmJzc2lkLAorCQkJICAgICAodm9pZCAqKXBGVFByZUF1dGhSc3AtPnByZUF1dGhic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBwRlRQcmVBdXRoUnNwLT5zbWVTZXNzaW9uSWQsCisJCQkJICAgICAgICZyb2FtSW5mbywgMCwgZUNTUl9ST0FNX0NDS01fUFJFQVVUSF9OT1RJRlksCisJCQkJICAgICAgIDApOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICYmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJLyogSWYgTGVnYWN5IEZhc3QgUm9hbWluZyBpcyBlbmFibGVkLCBzaWduYWwgdGhlIHN1cHBsaWNhbnQgKi8KKwkvKiBTbyBoZSBjYW4gc2VuZCB1cyBhIFBNSy1JRCBmb3IgdGhpcyBjYW5kaWRhdGUgQVAuICovCisJaWYgKGNzcl9yb2FtX2lzX2Zhc3Rfcm9hbV9lbmFibGVkKHBNYWMsIHBGVFByZUF1dGhSc3AtPnNtZVNlc3Npb25JZCkpIHsKKwkJLyogU2F2ZSB0aGUgYnNzaWQgZnJvbSB0aGUgcmVjZWl2ZWQgcmVzcG9uc2UgKi8KKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJnJvYW1JbmZvLmJzc2lkLAorCQkJICAgICAodm9pZCAqKXBGVFByZUF1dGhSc3AtPnByZUF1dGhic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBwRlRQcmVBdXRoUnNwLT5zbWVTZXNzaW9uSWQsCisJCQkJICAgICAgICZyb2FtSW5mbywgMCwgZUNTUl9ST0FNX1BNS19OT1RJRlksIDApOworCX0KKyNlbmRpZgorCisJLyogSWYgaXRzIGFuIE9wZW4gQXV0aCwgRlQgSUVzIGFyZSBub3QgcHJvdmlkZWQgYnkgc3VwcGxpY2FudCAqLworCS8qIEhlbmNlIHBvcHVsYXRlIHRoZW0gaGVyZSAqLworCWNvbm5fQXV0aF90eXBlID0KKwkJcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGUuQXV0aFR5cGU7CisKKwlwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LmFkZE1ESUUgPSBmYWxzZTsKKwlpZiAoY3NyX3JvYW1faXMxMXJfYXNzb2MocE1hYywgcEZUUHJlQXV0aFJzcC0+c21lU2Vzc2lvbklkKSAmJgorCSAgICAoY29ubl9BdXRoX3R5cGUgPT0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0pKSB7CisJCXVpbnQxNl90IGZ0X2llc19sZW5ndGg7CisJCWZ0X2llc19sZW5ndGggPSBwRlRQcmVBdXRoUnNwLT5yaWNfaWVzX2xlbmd0aDsKKworCQlpZiAoKHBTZXNzaW9uLT5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXMpICYmCisJCSAgICAocFNlc3Npb24tPmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llc19sZW5ndGgpKSB7CisJCQljZGZfbWVtX2ZyZWUocFNlc3Npb24tPmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llcyk7CisJCQlwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzX2xlbmd0aCA9IDA7CisJCQlwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzID0gTlVMTDsKKwkJfQorCisJCXBTZXNzaW9uLT5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXMgPQorCQkJY2RmX21lbV9tYWxsb2MoZnRfaWVzX2xlbmd0aCk7CisJCWlmIChOVUxMID09IHBTZXNzaW9uLT5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXMpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBmdF9pZXMiKSk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQkvKiBDb3B5IHRoZSBSSUMgSUVzIHRvIHJlYXNzb2MgSUVzICovCisJCQljZGZfbWVtX2NvcHkoKCh1aW50OF90ICopIHBTZXNzaW9uLT5mdFNtZUNvbnRleHQuCisJCQkJICAgICAgcmVhc3NvY19mdF9pZXMpLAorCQkJCSAgICAgKHVpbnQ4X3QgKikgcEZUUHJlQXV0aFJzcC0+cmljX2llcywKKwkJCQkgICAgIHBGVFByZUF1dGhSc3AtPnJpY19pZXNfbGVuZ3RoKTsKKwkJCXBTZXNzaW9uLT5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXNfbGVuZ3RoID0KKwkJCQlmdF9pZXNfbGVuZ3RoOworCQkJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5hZGRNRElFID0gdHJ1ZTsKKwkJfQorCX0KKwkvKiBEb25lIHdpdGggaXQsIGluaXQgaXQuICovCisJcFNlc3Npb24tPmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AgPSBOVUxMOworfQorI2VuZGlmCisKKworLyoKKyAgIHBCdWYgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UKKyAgIExJTSBwYWNrcyBkaXNhc3NvYyByc3AgYXMgYmVsb3csCisgICAgICBtZXNzYWdlVHlwZSAtIDIgYnl0ZXMKKyAgICAgIG1lc3NhZ2VMZW5ndGggLSAyIGJ5dGVzCisgICAgICBzZXNzaW9uSWQgLSAxIGJ5dGUKKyAgICAgIHRyYW5zYWN0aW9uSWQgLSAyIGJ5dGVzICh1aW50MTZfdCkKKyAgICAgIHJlYXNvbkNvZGUgLSA0IGJ5dGVzIChzaXplb2YodFNpclJlc3VsdENvZGVzKSkKKyAgICAgIHBlZXJNYWNBZGRyIC0gNiBieXRlcworICAgICAgVGhlIHJlc3QgaXMgY29uZGl0aW9uYWxseSBkZWZpbmVkIG9mIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKSBhbmQgbm90IHVzZWQKKyAqLworc3RhdGljIHZvaWQgY3NyX3Nlcl9kZXNfdW5wYWNrX2RpYXNzb2NfcnNwKHVpbnQ4X3QgKnBCdWYsIHRTaXJTbWVEaXNhc3NvY1JzcCAqcFJzcCkKK3sKKwlpZiAocEJ1ZiAmJiBwUnNwKSB7CisJCXBCdWYgKz0gNDsgICAgICAvKiBza2lwIHR5cGUgYW5kIGxlbmd0aCAqLworCQlwUnNwLT5zZXNzaW9uSWQgPSAqcEJ1ZisrOworCQljZGZfZ2V0X3UxNihwQnVmLCAodWludDE2X3QgKikgJnBSc3AtPnRyYW5zYWN0aW9uSWQpOworCQlwQnVmICs9IDI7CisJCWNkZl9nZXRfdTMyKHBCdWYsICh1aW50MzJfdCAqKSAmcFJzcC0+c3RhdHVzQ29kZSk7CisJCXBCdWYgKz0gNDsKKwkJY2RmX21lbV9jb3B5KHBSc3AtPnBlZXJNYWNBZGRyLCBwQnVmLCA2KTsKKwl9Cit9CisKKy8qIFJldHVybnMgd2hldGhlciBhIHNlc3Npb24gaXMgaW4gQ0RGX1NUQV9NT0RFLi4ub3Igbm90ICovCitib29sIGNzcl9yb2FtX2lzX3N0YV9tb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gTlVMTDsKKwlwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICVzOiBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgX19mdW5jX18sCisJCQlzZXNzaW9uSWQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICghQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgJXM6IEluYWN0aXZlIHNlc3Npb24iKSwgX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFICE9IHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGUpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGFib3ZlIGNoZWNrIG1heSBmYWlsLGJlY2F1c2UKKwkgKiBQMlAgQ0xJIGFsc28gdXNlcyB0aGUgc2FtZSBCU1NUeXBlIChlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFKQorCSAqIHdoZW4gaXQgaXMgY29ubmVjdGVkLlNvLHdlIG1heSBzbmVhayB0aHJvdWdoIHRoZSBhYm92ZSBjaGVjayBldmVuCisJICogaWYgd2UgYXJlIG5vdCBhIFNUQSBtb2RlIElORlJBIHN0YXRpb24uIFNvLCBpZiB3ZSBzbmVhayB0aHJvdWdoCisJICogdGhlIGFib3ZlIGNvbmRpdGlvbiwgd2UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNoZWNrIGlmIHdlIGFyZQorCSAqIHJlYWxseSBpbiBTVEEgTW9kZS4qLworCisJaWYgKE5VTEwgIT0gcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkgeworCQlpZiAocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+Y3NyUGVyc29uYSA9PSBDREZfU1RBX01PREUpIHsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICVzOiBwQ3VyUm9hbVByb2ZpbGUgaXMgTlVMTFxuIiksCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitDREZfU1RBVFVTIGNzcl9oYW5kb2ZmX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCSAgICAgICB0Q3NySGFuZG9mZlJlcXVlc3QgKnBIYW5kb2ZmSW5mbykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwljZHNfbXNnX3QgbXNnOworCisJdEFuaUhhbmRvZmZSZXEgKnBNc2c7CisJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0QW5pSGFuZG9mZlJlcSkpOworCWlmIChOVUxMID09IHBNc2cpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJIiBjc3JfaGFuZG9mZl9yZXF1ZXN0OiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtIGZvciByZXEgIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCXBNc2ctPm1zZ1R5cGUgPSBlV05JX1NNRV9IQU5ET0ZGX1JFUTsKKwlwTXNnLT5tc2dMZW4gPSAodWludDE2X3QpIHNpemVvZih0QW5pSGFuZG9mZlJlcSk7CisJcE1zZy0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCXBNc2ctPmNoYW5uZWwgPSBwSGFuZG9mZkluZm8tPmNoYW5uZWw7CisJcE1zZy0+aGFuZG9mZl9zcmMgPSBwSGFuZG9mZkluZm8tPnNyYzsKKwljZGZfbWVtX2NvcHkocE1zZy0+YnNzaWQsIHBIYW5kb2ZmSW5mby0+YnNzaWQuYnl0ZXMsIENERl9NQUNfQUREUl9TSVpFKTsKKwltc2cudHlwZSA9IGVXTklfU01FX0hBTkRPRkZfUkVROworCW1zZy5ib2R5cHRyID0gcE1zZzsKKwltc2cucmVzZXJ2ZWQgPSAwOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfU01FLCAmbXNnKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkiIGNzcl9oYW5kb2ZmX3JlcXVlc3QgZmFpbGVkIHRvIHBvc3QgbXNnIHRvIHNlbGYgIik7CisJCWNkZl9tZW1fZnJlZSgodm9pZCAqKXBNc2cpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfc2V0X2Nja21faWUKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gc3RvcmVzIHRoZSBDQ0tNIElFIHBhc3NlZCBieSB0aGUgc3VwcGxpY2FudAorICAgIGluIGEgcGxhY2UgaG9sZGVyIGRhdGEgc3RydWN0dXJlIGFuZCB0aGlzIElFIHdpbGwgYmUgcGFja2VkIGluc2lkZQorICAgIHJlYXNzb2NpYXRpb24gcmVxdWVzdAorICAgIFxwYXJhbSAgcE1hYyAtIHBNYWMgZ2xvYmFsIHN0cnVjdHVyZQorICAgIFxwYXJhbSAgc2Vzc2lvbklkIC0gQ3VycmVudCBzZXNzaW9uIGlkCisgICAgXHBhcmFtICBwQ2NrbUllIC0gcG9pbnRlciB0byBDQ0tNIElFIGRhdGEKKyAgICBccGFyYW0gIGNjS21JZUxlbiAtIGxlbmd0aCBvZiB0aGUgQ0NLTSBJRQorICAgXC0gcmV0dXJuIFN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3Jfc2V0X2Nja21faWUodHBBbmlTaXJHbG9iYWwgcE1hYywgY29uc3QgdWludDhfdCBzZXNzaW9uSWQsCisJCQkgICBjb25zdCB1aW50OF90ICpwQ2NrbUllLCBjb25zdCB1aW50OF90IGNjS21JZUxlbikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWNkZl9tZW1fY29weShwU2Vzc2lvbi0+c3VwcENja21JZUluZm8uY2NrbUllLCBwQ2NrbUllLCBjY0ttSWVMZW4pOworCXBTZXNzaW9uLT5zdXBwQ2NrbUllSW5mby5jY2ttSWVMZW4gPSBjY0ttSWVMZW47CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9yb2FtX3JlYWRfdHNmCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBUU0Y7IGFuZCBhbHNvIGFkZCB0aGUgdGltZSBlbGFwc2VkIHNpbmNlCisgICAgbGFzdCBiZWFjb24gb3IgcHJvYmUgcmVzcG9uc2UgcmVjZXB0aW9uIGZyb20gdGhlIGhhbmQgb2ZmIEFQIHRvIGFycml2ZSBhdAorICAgIHRoZSBsYXRlc3QgVFNGIHZhbHVlLgorICAgIFxwYXJhbSAgcE1hYyAtIHBNYWMgZ2xvYmFsIHN0cnVjdHVyZQorICAgIFxwYXJhbSAgcFRpbWVzdGFtcCAtIG91dHB1dCBUU0YgdGltZXN0YW1wCisgICBcLSByZXR1cm4gU3VjY2VzcyBvciBmYWlsdXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9yb2FtX3JlYWRfdHNmKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBUaW1lc3RhbXAsCisJCQkgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRDc3JOZWlnaGJvclJvYW1CU1NJbmZvIGhhbmRvZmZOb2RlOworCXVpbnQzMl90IHRpbWVyX2RpZmYgPSAwOworCXVpbnQzMl90IHRpbWVTdGFtcFsyXTsKKwl0cFNpckJzc0Rlc2NyaXB0aW9uIHBCc3NEZXNjcmlwdGlvbiA9IE5VTEw7CisJY3NyX25laWdoYm9yX3JvYW1fZ2V0X2hhbmRvZmZfYXBfaW5mbyhwTWFjLCAmaGFuZG9mZk5vZGUsIHNlc3Npb25JZCk7CisJcEJzc0Rlc2NyaXB0aW9uID0gaGFuZG9mZk5vZGUucEJzc0Rlc2NyaXB0aW9uOworCS8qIEdldCB0aGUgdGltZSBkaWZmIGluIG1pbGxpIHNlY29uZHMgKi8KKwl0aW1lcl9kaWZmID0KKwkJY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpIC0gcEJzc0Rlc2NyaXB0aW9uLT5zY2FuU3lzVGltZU1zZWM7CisJLyogQ29udmVydCBtc2VjIHRvIG1pY3JvIHNlYyB0aW1lciAqLworCXRpbWVyX2RpZmYgPSAodWludDMyX3QpICh0aW1lcl9kaWZmICogU1lTVEVNX1RJTUVfTVNFQ19UT19VU0VDKTsKKwl0aW1lU3RhbXBbMF0gPSBwQnNzRGVzY3JpcHRpb24tPnRpbWVTdGFtcFswXTsKKwl0aW1lU3RhbXBbMV0gPSBwQnNzRGVzY3JpcHRpb24tPnRpbWVTdGFtcFsxXTsKKwl1cGRhdGVfY2NrbXRzZigmKHRpbWVTdGFtcFswXSksICYodGltZVN0YW1wWzFdKSwgJnRpbWVyX2RpZmYpOworCWNkZl9tZW1fY29weShwVGltZXN0YW1wLCAodm9pZCAqKSZ0aW1lU3RhbXBbMF0sIHNpemVvZih1aW50MzJfdCkgKiAyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qRkVBVFVSRV9XTEFOX0VTRSAmJiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworCisvKgorICogUG9zdCBDaGFubmVsIENoYW5nZSBSZXF1ZXN0IHRvIExJTQorICogVGhpcyBBUEkgaXMgcHJpbWFyaWx5IHVzZWQgdG8gcG9zdAorICogQ2hhbm5lbCBDaGFuZ2UgUmVxIGZvciBTQVAKKyAqLworQ0RGX1NUQVRVUworY3NyX3JvYW1fY2hhbm5lbF9jaGFuZ2VfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzaWQsCisJCQkgICAgdWludDhfdCBjYk1vZGUsIHRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U2lyQ2hhbkNoYW5nZVJlcXVlc3QgKnBNc2c7CisJdENzclJvYW1TdGFydEJzc1BhcmFtcyBwYXJhbTsKKworCWNzcl9yb2FtX2dldF9ic3Nfc3RhcnRfcGFybXMocE1hYywgcHJvZmlsZSwgJnBhcmFtKTsKKwlwTXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJDaGFuQ2hhbmdlUmVxdWVzdCkpOworCWlmICghcE1zZykgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1fc2V0KCh2b2lkICopcE1zZywgc2l6ZW9mKHRTaXJDaGFuQ2hhbmdlUmVxdWVzdCksIDApOworCisJcE1zZy0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9DSEFOTkVMX0NIQU5HRV9SRVE7CisJcE1zZy0+bWVzc2FnZUxlbiA9IHNpemVvZih0U2lyQ2hhbkNoYW5nZVJlcXVlc3QpOworCXBNc2ctPnRhcmdldENoYW5uZWwgPSBwcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXTsKKwlwTXNnLT5jYk1vZGUgPSBjYk1vZGU7CisJcE1zZy0+Y2hhbm5lbF93aWR0aCA9IHByb2ZpbGUtPmNoX3BhcmFtcy5jaF93aWR0aDsKKwlwTXNnLT5kb3QxMW1vZGUgPSBjc3JfdHJhbnNsYXRlX3RvX3duaV9jZmdfZG90MTFfbW9kZShwTWFjLAorCQkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnVDZmdEb3QxMU1vZGUpOworCXBNc2ctPmNlbnRlcl9mcmVxX3NlZ18wID0gcE1zZy0+dGFyZ2V0Q2hhbm5lbDsKKwlwTXNnLT5jZW50ZXJfZnJlcV9zZWdfMSA9IDA7CisJY2RmX21lbV9jb3B5KHBNc2ctPmJzc2lkLCBic3NpZC5ieXRlcywgQ0RGX01BQ19BRERSX1NJWkUpOworCWNkZl9tZW1fY29weSgmcE1zZy0+b3BlcmF0aW9uYWxfcmF0ZXNldCwKKwkJJnBhcmFtLm9wZXJhdGlvbmFsUmF0ZVNldCwgc2l6ZW9mKHBNc2ctPm9wZXJhdGlvbmFsX3JhdGVzZXQpKTsKKwljZGZfbWVtX2NvcHkoJnBNc2ctPmV4dGVuZGVkX3JhdGVzZXQsCisJCSZwYXJhbS5leHRlbmRlZFJhdGVTZXQsIHNpemVvZihwTXNnLT5leHRlbmRlZF9yYXRlc2V0KSk7CisJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogUG9zdCBCZWFjb24gVHggU3RhcnQgcmVxdWVzdCB0byBMSU0KKyAqIGltbWVkaWF0ZWx5IGFmdGVyIFNBUCBDQUMgV0FJVCBpcworICogY29tcGxldGVkIHdpdGhvdXQgYW55IFJBREFSIGluZGljYXRpb25zLgorICovCitDREZfU1RBVFVTIGNzcl9yb2FtX3N0YXJ0X2JlYWNvbl9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgIHN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzaWQsCisJCQkJICAgICB1aW50OF90IGRmc0NhY1dhaXRTdGF0dXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNpclN0YXJ0QmVhY29uSW5kaWNhdGlvbiAqcE1zZzsKKworCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclN0YXJ0QmVhY29uSW5kaWNhdGlvbikpOworCisJaWYgKCFwTXNnKSB7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV9zZXQoKHZvaWQgKilwTXNnLCBzaXplb2YodFNpclN0YXJ0QmVhY29uSW5kaWNhdGlvbiksIDApOworCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfU1RBUlRfQkVBQ09OX1JFUTsKKwlwTXNnLT5tZXNzYWdlTGVuID0gc2l6ZW9mKHRTaXJTdGFydEJlYWNvbkluZGljYXRpb24pOworCXBNc2ctPmJlYWNvblN0YXJ0U3RhdHVzID0gZGZzQ2FjV2FpdFN0YXR1czsKKwljZGZfbWVtX2NvcHkocE1zZy0+YnNzaWQsIGJzc2lkLmJ5dGVzLCBDREZfTUFDX0FERFJfU0laRSk7CisKKwlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIGNzcl9yb2FtX21vZGlmeV9hZGRfaWVzCisgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gc2VuZHMgbXNnIHRvIG1vZGlmeSB0aGUgYWRkaXRpb25hbCBJRSBidWZmZXJzIGluIFBFCisgICBccGFyYW0gIHBNYWMgLSBwTWFjIGdsb2JhbCBzdHJ1Y3R1cmUKKyAgIFxwYXJhbSAgcE1vZGlmeUlFIC0gcG9pbnRlciB0byB0U2lyTW9kaWZ5SUUgc3RydWN0dXJlCisgICBccGFyYW0gIHVwZGF0ZVR5cGUgLSBUeXBlIG9mIGJ1ZmZlcgorICAgXC0gcmV0dXJuIFN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUworY3NyX3JvYW1fbW9kaWZ5X2FkZF9pZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSB0U2lyTW9kaWZ5SUUgKnBNb2RpZnlJRSwgZVVwZGF0ZUlFc1R5cGUgdXBkYXRlVHlwZSkKK3sKKwl0cFNpck1vZGlmeUlFc0luZCBwTW9kaWZ5QWRkSUVJbmQgPSBOVUxMOworCXVpbnQ4X3QgKnBMb2NhbEJ1ZmZlciA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwkvKiBmb2xsb3dpbmcgYnVmZmVyIHdpbGwgYmUgZnJlZWQgYnkgY29uc3VtZXIgKFBFKSAqLworCXBMb2NhbEJ1ZmZlciA9IGNkZl9tZW1fbWFsbG9jKHBNb2RpZnlJRS0+aWVCdWZmZXJsZW5ndGgpOworCisJaWYgKE5VTEwgPT0gcExvY2FsQnVmZmVyKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIk1lbW9yeSBBbGxvY2F0aW9uIEZhaWx1cmUhISEiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJcE1vZGlmeUFkZElFSW5kID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJNb2RpZnlJRXNJbmQpKTsKKwlpZiAoTlVMTCA9PSBwTW9kaWZ5QWRkSUVJbmQpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiTWVtb3J5IEFsbG9jYXRpb24gRmFpbHVyZSEhISIpKTsKKwkJY2RmX21lbV9mcmVlKHBMb2NhbEJ1ZmZlcik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJLypjb3B5IHRoZSBJRSBidWZmZXIgKi8KKwljZGZfbWVtX2NvcHkocExvY2FsQnVmZmVyLCBwTW9kaWZ5SUUtPnBJRUJ1ZmZlciwKKwkJICAgICBwTW9kaWZ5SUUtPmllQnVmZmVybGVuZ3RoKTsKKwljZGZfbWVtX3plcm8ocE1vZGlmeUFkZElFSW5kLCBzaXplb2YodFNpck1vZGlmeUlFc0luZCkpOworCisJcE1vZGlmeUFkZElFSW5kLT5tc2dUeXBlID0gZVdOSV9TTUVfTU9ESUZZX0FERElUSU9OQUxfSUVTOworCXBNb2RpZnlBZGRJRUluZC0+bXNnTGVuID0gc2l6ZW9mKHRTaXJNb2RpZnlJRXNJbmQpOworCisJY2RmX21lbV9jb3B5KHBNb2RpZnlBZGRJRUluZC0+bW9kaWZ5SUUuYnNzaWQsIHBNb2RpZnlJRS0+YnNzaWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlwTW9kaWZ5QWRkSUVJbmQtPm1vZGlmeUlFLnNtZVNlc3Npb25JZCA9IHBNb2RpZnlJRS0+c21lU2Vzc2lvbklkOworCXBNb2RpZnlBZGRJRUluZC0+bW9kaWZ5SUUubm90aWZ5ID0gcE1vZGlmeUlFLT5ub3RpZnk7CisJcE1vZGlmeUFkZElFSW5kLT5tb2RpZnlJRS5pZUlEID0gcE1vZGlmeUlFLT5pZUlEOworCXBNb2RpZnlBZGRJRUluZC0+bW9kaWZ5SUUuaWVJRExlbiA9IHBNb2RpZnlJRS0+aWVJRExlbjsKKwlwTW9kaWZ5QWRkSUVJbmQtPm1vZGlmeUlFLnBJRUJ1ZmZlciA9IHBMb2NhbEJ1ZmZlcjsKKwlwTW9kaWZ5QWRkSUVJbmQtPm1vZGlmeUlFLmllQnVmZmVybGVuZ3RoID0gcE1vZGlmeUlFLT5pZUJ1ZmZlcmxlbmd0aDsKKworCXBNb2RpZnlBZGRJRUluZC0+dXBkYXRlVHlwZSA9IHVwZGF0ZVR5cGU7CisKKwlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTW9kaWZ5QWRkSUVJbmQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBzZW5kIGVXTklfU01FX1VQREFURV9BRERUSU9OQUxfSUVTIG1zZyIKKwkJCSAgICIhISEgc3RhdHVzICVkIiksIHN0YXR1cyk7CisJCWNkZl9tZW1fZnJlZShwTG9jYWxCdWZmZXIpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxmbiBjc3Jfcm9hbV91cGRhdGVfYWRkX2llcworICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHNlbmRzIG1zZyB0byB1cGRhdGVzIHRoZSBhZGRpdGlvbmFsIElFIGJ1ZmZlcnMgaW4gUEUKKyAgIFxwYXJhbSAgcE1hYyAtIHBNYWMgZ2xvYmFsIHN0cnVjdHVyZQorICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTTUUgc2Vzc2lvbiBpZAorICAgXHBhcmFtICBic3NpZCAtIEJTU0lECisgICBccGFyYW0gIGFkZGl0aW9uSUVCdWZmZXIgLSBidWZmZXIgY29udGFpbmluZyBhZGRpdGlvbiBJRSBmcm9tIGhvc3RhcGQKKyAgIFxwYXJhbSAgbGVuZ3RoIC0gbGVuZ3RoIG9mIGJ1ZmZlcgorICAgXHBhcmFtICB1cGRhdGVUeXBlIC0gVHlwZSBvZiBidWZmZXIKKyAgIFxwYXJhbSAgYXBwZW5kIC0gYXBwZW5kIG9yIHJlcGxhY2UgY29tcGxldGVseQorICAgXC0gcmV0dXJuIFN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUworY3NyX3JvYW1fdXBkYXRlX2FkZF9pZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSB0U2lyVXBkYXRlSUUgKnBVcGRhdGVJRSwgZVVwZGF0ZUlFc1R5cGUgdXBkYXRlVHlwZSkKK3sKKwl0cFNpclVwZGF0ZUlFc0luZCBwVXBkYXRlQWRkSUVzID0gTlVMTDsKKwl1aW50OF90ICpwTG9jYWxCdWZmZXIgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKHBVcGRhdGVJRS0+aWVCdWZmZXJsZW5ndGggIT0gMCkgeworCQkvKiBGb2xsb3dpbmcgYnVmZmVyIHdpbGwgYmUgZnJlZWQgYnkgY29uc3VtZXIgKFBFKSAqLworCQlwTG9jYWxCdWZmZXIgPSBjZGZfbWVtX21hbGxvYyhwVXBkYXRlSUUtPmllQnVmZmVybGVuZ3RoKTsKKwkJaWYgKE5VTEwgPT0gcExvY2FsQnVmZmVyKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJNZW1vcnkgQWxsb2NhdGlvbiBGYWlsdXJlISEhIikpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCQljZGZfbWVtX2NvcHkocExvY2FsQnVmZmVyLCBwVXBkYXRlSUUtPnBBZGRpdGlvbklFQnVmZmVyLAorCQkJICAgICBwVXBkYXRlSUUtPmllQnVmZmVybGVuZ3RoKTsKKwl9CisKKwlwVXBkYXRlQWRkSUVzID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJVcGRhdGVJRXNJbmQpKTsKKwlpZiAoTlVMTCA9PSBwVXBkYXRlQWRkSUVzKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIk1lbW9yeSBBbGxvY2F0aW9uIEZhaWx1cmUhISEiKSk7CisJCWlmIChwTG9jYWxCdWZmZXIgIT0gTlVMTCkgeworCQkJY2RmX21lbV9mcmVlKHBMb2NhbEJ1ZmZlcik7CisJCX0KKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX3plcm8ocFVwZGF0ZUFkZElFcywgc2l6ZW9mKHRTaXJVcGRhdGVJRXNJbmQpKTsKKworCXBVcGRhdGVBZGRJRXMtPm1zZ1R5cGUgPSBlV05JX1NNRV9VUERBVEVfQURESVRJT05BTF9JRVM7CisJcFVwZGF0ZUFkZElFcy0+bXNnTGVuID0gc2l6ZW9mKHRTaXJVcGRhdGVJRXNJbmQpOworCisJY2RmX21lbV9jb3B5KHBVcGRhdGVBZGRJRXMtPnVwZGF0ZUlFLmJzc2lkLCBwVXBkYXRlSUUtPmJzc2lkLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisJcFVwZGF0ZUFkZElFcy0+dXBkYXRlSUUuc21lU2Vzc2lvbklkID0gcFVwZGF0ZUlFLT5zbWVTZXNzaW9uSWQ7CisJcFVwZGF0ZUFkZElFcy0+dXBkYXRlSUUuYXBwZW5kID0gcFVwZGF0ZUlFLT5hcHBlbmQ7CisJcFVwZGF0ZUFkZElFcy0+dXBkYXRlSUUubm90aWZ5ID0gcFVwZGF0ZUlFLT5ub3RpZnk7CisJcFVwZGF0ZUFkZElFcy0+dXBkYXRlSUUuaWVCdWZmZXJsZW5ndGggPSBwVXBkYXRlSUUtPmllQnVmZmVybGVuZ3RoOworCXBVcGRhdGVBZGRJRXMtPnVwZGF0ZUlFLnBBZGRpdGlvbklFQnVmZmVyID0gcExvY2FsQnVmZmVyOworCisJcFVwZGF0ZUFkZElFcy0+dXBkYXRlVHlwZSA9IHVwZGF0ZVR5cGU7CisKKwlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwVXBkYXRlQWRkSUVzKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gc2VuZCBlV05JX1NNRV9VUERBVEVfQUREVElPTkFMX0lFUyBtc2ciCisJCQkgICAiISEhIHN0YXR1cyAlZCIpLCBzdGF0dXMpOworCQljZGZfbWVtX2ZyZWUocExvY2FsQnVmZmVyKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3Jfcm9hbV9zZW5kX2NoYW5fc3dfaWVfcmVxdWVzdCgpIC0gUmVxdWVzdCB0byB0cmFuc21pdCBDU0EgSUUKKyAqIEBtYWNfY3R4OiAgICAgICAgR2xvYmFsIE1BQyBjb250ZXh0CisgKiBAYnNzaWQ6ICAgICAgICAgIEJTU0lECisgKiBAdGFyZ2V0X2NoYW5uZWw6IENoYW5uZWwgb24gd2hpY2ggdG8gc2VuZCB0aGUgSUUKKyAqIEBjc2FfaWVfcmVxZDogICAgSW5jbHVkZS9FeGNsdWRlIENTQSBJRS4KKyAqIEBjaF9iYW5kd2lkdGg6ICAgQ2hhbm5lbCBvZmZzZXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIHJlcXVlc3QgdG8gdHJhbnNtaXQgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50CisgKiBJRSB0byBsb3dlciBsYXllcnMKKyAqCisgKiBSZXR1cm46IHN1Y2Nlc3Mgb3IgZmFpbHVyZQorICoqLworQ0RGX1NUQVRVUworY3NyX3JvYW1fc2VuZF9jaGFuX3N3X2llX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJc3RydWN0IGNkZl9tYWNfYWRkciBic3NpZCwgdWludDhfdCB0YXJnZXRfY2hhbm5lbCwKKwkJdWludDhfdCBjc2FfaWVfcmVxZCwgdWludDhfdCBjaF9iYW5kd2lkdGgpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNpckRmc0NzYUllUmVxdWVzdCAqbXNnOworCisJbXNnID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJEZnNDc2FJZVJlcXVlc3QpKTsKKwlpZiAoIW1zZykgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1fc2V0KCh2b2lkICopbXNnLCBzaXplb2YodFNpckRmc0NzYUllUmVxdWVzdCksIDApOworCW1zZy0+bXNnVHlwZSA9IGVXTklfU01FX0RGU19CRUFDT05fQ0hBTl9TV19JRV9SRVE7CisJbXNnLT5tc2dMZW4gPSBzaXplb2YodFNpckRmc0NzYUllUmVxdWVzdCk7CisKKwltc2ctPnRhcmdldENoYW5uZWwgPSB0YXJnZXRfY2hhbm5lbDsKKwltc2ctPmNzYUllUmVxdWlyZWQgPSBjc2FfaWVfcmVxZDsKKwljZGZfbWVtX2NvcHkobXNnLT5ic3NpZCwgYnNzaWQuYnl0ZXMsIENERl9NQUNfQUREUl9TSVpFKTsKKwltc2ctPmNoX2JhbmR3aWR0aCA9IGNoX2JhbmR3aWR0aDsKKworCXN0YXR1cyA9IGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKG1zZyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIGZuICAgICBjc3JfcHJvY2Vzc19yb2FtX29mZmxvYWRfc3luY2hfaW5kCisqIGJyaWVmICBUaGlzIHdpbGwgcHJvY2VzcyB0aGUgcm9hbSBzeW5jaCBpbmRpY2F0aW9uIHJlY2VpdmVkIGZyb20KKyogICAgICAgIGxvd2VyIGxheWVycy5UaGlzIGZ1bmN0aW9uIGFsc28gY2FsbHMgYW5vdGhlciBBUEkgdG8KKyogICAgICAgIHBhcnNlIHRoZSBiZWFjb24gSUUgYW5kIGZpbGwgdGhlIGFwcHJvcHJpYXRlIGZpZWxkcworKiBwYXJhbSAgcE1hYyAtIHBNYWMgZ2xvYmFsIHN0cnVjdHVyZQorKiBwYXJhbSAgcE1zZ0J1ZiAtIE1lc3NhZ2UgYnVmZmVyIHJlY2VpdmVkIGZyb20gbG93ZXIgbGF5ZXJzCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyX3Byb2Nlc3Nfcm9hbV9vZmZsb2FkX3N5bmNoX2luZCh0SGFsSGFuZGxlIGhIYWwsCisJCXJvYW1fb2ZmbG9hZF9zeW5jaF9pbmQgKnJvYW1fc3luY2hfaW5kX3B0cikKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uX3B0ciA9IE5VTEw7CisJdWludDhfdCBzZXNzaW9uX2lkID0gcm9hbV9zeW5jaF9pbmRfcHRyLT5yb2FtZWRWZGV2SWQ7CisJc2Vzc2lvbl9wdHIgPSAgQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHJvYW1fc3luY2hfaW5kX3B0ci0+cm9hbWVkVmRldklkKTsKKwlpZiAoIXNlc3Npb25fcHRyKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkxGUjM6IHNlc3Npb24gJWQgbm90IGZvdW5kICIpLAorCQkJCXJvYW1fc3luY2hfaW5kX3B0ci0+cm9hbWVkVmRldklkKTsKKwkJZ290byBlcnJfc3luY2hfcnNwOworCX0KKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjc3Jfc2Nhbl9zYXZlX3JvYW1fb2ZmbG9hZF9hcF90b19zY2FuX2NhY2hlKAorCQkJCQlwTWFjLCByb2FtX3N5bmNoX2luZF9wdHIpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiZmFpbCB0byBzYXZlIHJvYW0gb2ZmbG9hZCBBUCB0byBzY2FuIGNhY2hlIik7CisJCWdvdG8gZXJyX3N5bmNoX3JzcDsKKwl9CisJc2Vzc2lvbl9wdHItPnJvYW1PZmZsb2FkU3luY2hQYXJhbXMucnNzaSA9IHJvYW1fc3luY2hfaW5kX3B0ci0+cnNzaTsKKwlzZXNzaW9uX3B0ci0+cm9hbU9mZmxvYWRTeW5jaFBhcmFtcy5yb2FtUmVhc29uID0KKwkJcm9hbV9zeW5jaF9pbmRfcHRyLT5yb2FtUmVhc29uOworCXNlc3Npb25fcHRyLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLnJvYW1lZFZkZXZJZCA9CisJCXJvYW1fc3luY2hfaW5kX3B0ci0+cm9hbWVkVmRldklkOworCWNkZl9tZW1fY29weShzZXNzaW9uX3B0ci0+cm9hbU9mZmxvYWRTeW5jaFBhcmFtcy5ic3NpZCwKKwkJCXJvYW1fc3luY2hfaW5kX3B0ci0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCXNlc3Npb25fcHRyLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLnR4TWdtdFBvd2VyID0KKwkJcm9hbV9zeW5jaF9pbmRfcHRyLT50eE1nbXRQb3dlcjsKKwlzZXNzaW9uX3B0ci0+cm9hbU9mZmxvYWRTeW5jaFBhcmFtcy5hdXRoU3RhdHVzID0KKwkJcm9hbV9zeW5jaF9pbmRfcHRyLT5hdXRoU3RhdHVzOworCXNlc3Npb25fcHRyLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLmJSb2FtU3luY2hJblByb2dyZXNzID0gdHJ1ZTsKKwkvKlNhdmUgdGhlIEJTUyBkZXNjcmlwdG9yIGZvciBsYXRlciB1c2UqLworCXNlc3Npb25fcHRyLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLmJzc19kZXNjX3B0ciA9CisJCXJvYW1fc3luY2hfaW5kX3B0ci0+YnNzX2Rlc2NfcHRyOworCXBNYWMtPnJvYW0ucmVhc3NvY1Jlc3BMZW4gPSByb2FtX3N5bmNoX2luZF9wdHItPnJlYXNzb2NSZXNwTGVuZ3RoOworCXBNYWMtPnJvYW0ucFJlYXNzb2NSZXNwID0KKwkJY2RmX21lbV9tYWxsb2MocE1hYy0+cm9hbS5yZWFzc29jUmVzcExlbik7CisJaWYgKE5VTEwgPT0gcE1hYy0+cm9hbS5wUmVhc3NvY1Jlc3ApIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIk1lbW9yeSBhbGxvY2F0aW9uIGZvciByZWFzc29jIHJlc3BvbnNlIGZhaWxlZCIpOworCQlnb3RvIGVycl9zeW5jaF9yc3A7CisJfQorCWNkZl9tZW1fY29weShwTWFjLT5yb2FtLnBSZWFzc29jUmVzcCwKKwkJCSh1aW50OF90ICopcm9hbV9zeW5jaF9pbmRfcHRyICsKKwkJCXJvYW1fc3luY2hfaW5kX3B0ci0+cmVhc3NvY1Jlc3BPZmZzZXQsCisJCQlwTWFjLT5yb2FtLnJlYXNzb2NSZXNwTGVuKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkiTEZSMzolczogdGhlIHJlYXNzb2MgcmVzcCBmcmFtZSBkYXRhOiIsIF9fZnVuY19fKTsKKwlDREZfVFJBQ0VfSEVYX0RVTVAoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJcE1hYy0+cm9hbS5wUmVhc3NvY1Jlc3AsIHBNYWMtPnJvYW0ucmVhc3NvY1Jlc3BMZW4pOworCisJY2RmX21lbV9jb3B5KHNlc3Npb25fcHRyLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLmtjaywKKwkJCXJvYW1fc3luY2hfaW5kX3B0ci0+a2NrLCBTSVJfS0NLX0tFWV9MRU4pOworCWNkZl9tZW1fY29weShzZXNzaW9uX3B0ci0+cm9hbU9mZmxvYWRTeW5jaFBhcmFtcy5rZWssCisJCQlyb2FtX3N5bmNoX2luZF9wdHItPmtlaywgU0lSX0tFS19LRVlfTEVOKTsKKwljZGZfbWVtX2NvcHkoc2Vzc2lvbl9wdHItPnJvYW1PZmZsb2FkU3luY2hQYXJhbXMucmVwbGF5X2N0ciwKKwkJCXJvYW1fc3luY2hfaW5kX3B0ci0+cmVwbGF5X2N0ciwgU0lSX1JFUExBWV9DVFJfTEVOKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNzcl9uZWlnaGJvcl9yb2FtX29mZmxvYWRfdXBkYXRlX3ByZWF1dGhfbGlzdCgKKwkJCQkJcE1hYywgcm9hbV9zeW5jaF9pbmRfcHRyLCBzZXNzaW9uX2lkKSkgeworCQkvKioKKwkJICpCYWlsIG91dCBpZiBSb2FtIE9mZmxvYWQgU3luY2ggUmVzcG9uc2Ugd2FzIG5vdCBldmVuIGhhbmRsZWQuCisJCSAqKi8KKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiUm9hbSBPZmZsb2FkIFN5bmNoIFJlc3BvbnNlICIKKwkJCQkJIndhcyBub3QgcHJvY2Vzc2VkIikpOworCQlnb3RvIGVycl9zeW5jaF9yc3A7CisJfQorCisJY3NyX25laWdoYm9yX3JvYW1fcmVxdWVzdF9oYW5kb2ZmKHBNYWMsIHNlc3Npb25faWQpOworCitlcnJfc3luY2hfcnNwOgorCWNkZl9tZW1fZnJlZShyb2FtX3N5bmNoX2luZF9wdHItPmJzc19kZXNjX3B0cik7CisJcm9hbV9zeW5jaF9pbmRfcHRyLT5ic3NfZGVzY19wdHIgPSBOVUxMOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogZm4gY3NyX3Byb2Nlc3NfaG9fZmFpbF9pbmQKKyogYnJpZWYgIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9jZXNzIHRoZSBIYW5kIE9mZiBGYWlsdXJlIGluZGljYXRpb24KKyogICAgICAgIHJlY2VpdmVkIGZyb20gdGhlIGZpcm13YXJlLiBJdCB3aWxsIHRyaWdnZXIgYSBkaXNjb25uZWN0IG9uCisqICAgICAgICB0aGUgc2Vzc2lvbiB3aGljaCB0aGUgZmlybXdhcmUgcmVwb3J0ZWQgYSBoYW5kIG9mZiBmYWlsdXJlCisqIHBhcmFtICBwTWFjIGdsb2JhbCBzdHJ1Y3R1cmUKKyogcGFyYW0gIHBNc2dCdWYgLSBDb250YWlucyB0aGUgc2Vzc2lvbiBJRCBmb3Igd2hpY2ggdGhlIGhhbmRsZXIgc2hvdWxkIGFwcGx5CisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyX3Byb2Nlc3NfaG9fZmFpbF9pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqcE1zZ0J1ZikKK3sKKwl0U2lyU21lSE9GYWlsdXJlSW5kICpwU21lSE9GYWlsSW5kID0gKHRTaXJTbWVIT0ZhaWx1cmVJbmQgKikgcE1zZ0J1ZjsKKwl1aW50MzJfdCBzZXNzaW9uSWQ7CisKKwlpZiAocFNtZUhPRmFpbEluZCkKKwkJc2Vzc2lvbklkID0gcFNtZUhPRmFpbEluZC0+c2Vzc2lvbklkOworCWVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkxGUjM6IEhhbmQtT2ZmIEZhaWx1cmUgSW5kIGlzIE5VTEwiKTsKKwkJcmV0dXJuOworCX0KKwkvKiBSb2FtaW5nIGlzIHN1cHBvcnRlZCBvbmx5IG9uIEluZnJhIFNUQSBNb2RlLiAqLworCWlmICghY3NyX3JvYW1faXNfc3RhX21vZGUocE1hYywgc2Vzc2lvbklkKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkxGUjM6SE8gRmFpbCBjYW5ub3QgYmUgaGFuZGxlZCBmb3Igc2Vzc2lvbiAlZCIsCisJCQkgIHNlc3Npb25JZCk7CisJCXJldHVybjsKKwl9CisJY3NyX3JvYW1fc3luY2hfY2xlYW5fdXAocE1hYywgc2Vzc2lvbklkKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJICAiTEZSMzpJc3N1ZSBEaXNjb25uZWN0IG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uSWQpOworCWNzcl9yb2FtX2Rpc2Nvbm5lY3QocE1hYywgc2Vzc2lvbklkLCBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FEICovCisKKy8qKgorICogY3NyX3VwZGF0ZV9vcF9jbGFzc19hcnJheSgpIC0gdXBkYXRlIG9wIGNsYXNzIGZvciBlYWNoIGJhbmQKKyAqIEBtYWNfY3R4OiAgICAgICAgICBtYWMgZ2xvYmFsIGNvbnRleHQKKyAqIEBvcF9jbGFzc2VzOiAgICAgICBvdXQgcGFyYW0sIG9wZXJhdGluZyBjbGFzcyBhcnJheSB0byB1cGRhdGUKKyAqIEBjaGFubmVsX2luZm86ICAgICBjaGFubmVsIGluZm8KKyAqIEBjaF9uYW1lOiAgICAgICAgICBjaGFubmVsIGJhbmQgbmFtZSB0byBkaXNwbGF5IGluIGRlYnVnIG1lc3NhZ2VzCisgKiBAaTogICAgICAgICAgICAgICAgb3V0IHBhcmFtLCBzdG9yZXMgbnVtYmVyIG9mIG9wZXJhdGluZyBjbGFzc2VzCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitjc3JfdXBkYXRlX29wX2NsYXNzX2FycmF5KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkgIHVpbnQ4X3QgKm9wX2NsYXNzZXMsCisJCQkgIHRDc3JDaGFubmVsICpjaGFubmVsX2luZm8sCisJCQkgIGNoYXIgKmNoX25hbWUsCisJCQkgIHVpbnQ4X3QgKmkpCit7CisJdWludDhfdCBqID0gMCwgaWR4ID0gMCwgY2xhc3MgPSAwOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwl1aW50OF90IG51bV9jaGFubmVscyA9IGNoYW5uZWxfaW5mby0+bnVtQ2hhbm5lbHM7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCUZMKCJOdW0gb2YgJXMgY2hhbm5lbHMsICAlZCIpLAorCQljaF9uYW1lLCBudW1fY2hhbm5lbHMpOworCisJZm9yIChpZHggPSAwOyBpZHggPCBudW1fY2hhbm5lbHMKKwkJJiYgKmkgPCAoU0lSX01BQ19NQVhfU1VQUF9PUEVSX0NMQVNTRVMgLSAxKTsgaWR4KyspIHsKKwkJY2xhc3MgPSBjZHNfcmVnZG1fZ2V0X29wY2xhc3NfZnJvbV9jaGFubmVsKAorCQkJCW1hY19jdHgtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LAorCQkJCWNoYW5uZWxfaW5mby0+Y2hhbm5lbExpc3RbaWR4XSwKKwkJCQlCV0FMTCk7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HNCwgRkwoImZvciBjaGFuICVkLCBvcCBjbGFzczogJWQiKSwKKwkJCWNoYW5uZWxfaW5mby0+Y2hhbm5lbExpc3RbaWR4XSwgY2xhc3MpOworCisJCWZvdW5kID0gZmFsc2U7CisJCWZvciAoaiA9IDA7IGogPCBTSVJfTUFDX01BWF9TVVBQX09QRVJfQ0xBU1NFUyAtIDE7IGorKykgeworCQkJaWYgKG9wX2NsYXNzZXNbal0gPT0gY2xhc3MpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFmb3VuZCkgeworCQkJb3BfY2xhc3Nlc1sqaV0gPSBjbGFzczsKKwkJCSppID0gKmkgKyAxOworCQl9CisJfQorfQorCisvKioKKyAqIGNzcl91cGRhdGVfb3BfY2xhc3NfYXJyYXkoKSAtIHVwZGF0ZSBvcCBjbGFzcyBmb3IgYWxsIGJhbmRzCisgKiBAaEhhbDogICAgICAgICAgZ2xvYmFsIGhhbCBjb250ZXh0CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgY3NyX2luaXRfb3BlcmF0aW5nX2NsYXNzZXModEhhbEhhbmRsZSBoSGFsKQoreworCXVpbnQ4X3QgaSA9IDA7CisJdWludDhfdCBqID0gMDsKKwl1aW50OF90IHN3YXAgPSAwOworCXVpbnQ4X3QgbnVtQ2xhc3NlcyA9IDA7CisJdWludDhfdCBvcENsYXNzZXNbU0lSX01BQ19NQVhfU1VQUF9PUEVSX0NMQVNTRVNdID0gezAsfTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJDdXJyZW50IENvdW50cnkgPSAlYyVjIiksCisJCXBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50WzBdLAorCQlwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudFsxXSk7CisKKwljc3JfdXBkYXRlX29wX2NsYXNzX2FycmF5KHBNYWMsIG9wQ2xhc3NlcywKKwkJCQkgICZwTWFjLT5zY2FuLmJhc2VfY2hhbm5lbHMsICIyME1IeiIsICZpKTsKKwljc3JfdXBkYXRlX29wX2NsYXNzX2FycmF5KHBNYWMsIG9wQ2xhc3NlcywKKwkJCQkgICZwTWFjLT5zY2FuLmJhc2U0ME1IekNoYW5uZWxzLCAiNDBNSHoiLCAmaSk7CisJbnVtQ2xhc3NlcyA9IGk7CisKKwkvKiBBcyBwZXIgc3BlYyB0aGUgb3BlcmF0aW5nIGNsYXNzZXMgc2hvdWxkIGJlIGluIGFzY2VuZGluZyBvcmRlci4KKwkgKiBCdWJibGUgc29ydCBpcyBmaW5lIHNpbmNlIHdlIGRvbid0IGhhdmUgbWFueSBjbGFzc2VzCisJICovCisJZm9yIChpID0gMDsgaSA8IChudW1DbGFzc2VzIC0gMSk7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgKG51bUNsYXNzZXMgLSBpIC0gMSk7IGorKykgeworCQkJLyogRm9yIGRlY3JlYXNpbmcgb3JkZXIgdXNlIDwgKi8KKwkJCWlmIChvcENsYXNzZXNbal0gPiBvcENsYXNzZXNbaiArIDFdKSB7CisJCQkJc3dhcCA9IG9wQ2xhc3Nlc1tqXTsKKwkJCQlvcENsYXNzZXNbal0gPSBvcENsYXNzZXNbaiArIDFdOworCQkJCW9wQ2xhc3Nlc1tqICsgMV0gPSBzd2FwOworCQkJfQorCQl9CisJfQorCisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiTnVtYmVyIG9mIHVuaXF1ZSBzdXBwb3J0ZWQgb3AgY2xhc3NlcyAlZCIpLAorCQludW1DbGFzc2VzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtQ2xhc3NlczsgaSsrKSB7CisJCXNtc19sb2cocE1hYywgTE9HMSwgRkwoInN1cHBvcnRlZCBvcENsYXNzZXNbJWRdID0gJWQiKSwgaSwKKwkJCW9wQ2xhc3Nlc1tpXSk7CisJfQorCisJLyogU2V0IHRoZSBvcmRlcmVkIGxpc3Qgb2Ygb3AgY2xhc3NlcyBpbiByZWdkb21haW4KKwkgKiBmb3IgdXNlIGJ5IG90aGVyIG1vZHVsZXMKKwkgKi8KKwljZHNfcmVnZG1fc2V0X2N1cnJfb3BjbGFzc2VzKG51bUNsYXNzZXMsICZvcENsYXNzZXNbMF0pOworfQorCisvKioKKyAqIGNzcl9maW5kX3Nlc3Npb25fYnlfdHlwZSgpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGZpbmQgZ2l2ZW4gc2Vzc2lvbiB0eXBlIGZyb20KKyAqIGFsbCBzZXNzaW9ucy4KKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIG1hYyBjb250ZXh0LgorICogQHR5cGU6ICAgIHNlc3Npb24gdHlwZQorICoKKyAqIFJldHVybjogc2Vzc2lvbiBpZCBmb3IgZ2l2ZSBzZXNzaW9uIHR5cGUuCisgKiovCitzdGF0aWMgdWludDMyX3QKK2Nzcl9maW5kX3Nlc3Npb25fYnlfdHlwZSh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0Q0RGX0NPTl9NT0RFIHR5cGUpCit7CisJdWludDMyX3QgaSwgc2Vzc2lvbl9pZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uX3B0cjsKKwlmb3IgKGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKykgeworCQlpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKG1hY19jdHgsIGkpKQorCQkJY29udGludWU7CisKKwkJc2Vzc2lvbl9wdHIgPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgaSk7CisJCWlmICh0eXBlID09IHNlc3Npb25fcHRyLT5ic3NQYXJhbXMuYnNzUGVyc29uYSkgeworCQkJc2Vzc2lvbl9pZCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gc2Vzc2lvbl9pZDsKK30KKy8qKgorICogY3NyX2lzX2Nvbm5fYWxsb3dfMmdfYmFuZCgpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIHN0YXRpb24ncyBjb25uCisgKiBpcyBhbGxvd2VkIGluIDIuNEdoeiBiYW5kLgorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gbWFjIGNvbnRleHQuCisgKiBAY2hubDogc3RhdGlvbidzIGNoYW5uZWwuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIHN0YXRpb24ncyBjb25uZWN0aW9uIGlzIGFsbG93ZWQgaW4gNUdoeiBiYW5kCisgKiBhZnRlciBjb21wYXJpbmcgaXQgd2l0aCBTQVAncyBvcGVyYXRpbmcgY2hhbm5lbC4gSWYgU0FQJ3Mgb3BlcmF0aW5nCisgKiBjaGFubmVsIGFuZCBTdGF0aW9uJ3MgY2hhbm5lbCBpcyBkaWZmZXJlbnQgdGhhbiB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisgKiBmYWxzZSBlbHNlIHRydWUuCisgKgorICogUmV0dXJuOiB0cnVlIG9yIGZhbHNlLgorICoqLworc3RhdGljIGJvb2wgY3NyX2lzX2Nvbm5fYWxsb3dfMmdfYmFuZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCBjaG5sKQoreworCXVpbnQzMl90IHNhcF9zZXNzaW9uX2lkOworCXRDc3JSb2FtU2Vzc2lvbiAqc2FwX3Nlc3Npb247CisKKwlpZiAoMCA9PSBjaG5sKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMKCJjaGFubmVsIGlzIHplcm8sIGNvbm5lY3Rpb24gbm90IGFsbG93ZWQiKSk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXNhcF9zZXNzaW9uX2lkID0gY3NyX2ZpbmRfc2Vzc2lvbl9ieV90eXBlKG1hY19jdHgsIENERl9TQVBfTU9ERSk7CisJaWYgKENTUl9TRVNTSU9OX0lEX0lOVkFMSUQgIT0gc2FwX3Nlc3Npb25faWQpIHsKKwkJc2FwX3Nlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2FwX3Nlc3Npb25faWQpOworCQlpZiAoKDAgIT0gc2FwX3Nlc3Npb24tPmJzc1BhcmFtcy5vcGVyYXRpb25DaG4pICYmCisJCQkJKHNhcF9zZXNzaW9uLT5ic3NQYXJhbXMub3BlcmF0aW9uQ2huICE9IGNobmwpKSB7CisKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMCisJCQkJKCJDYW4ndCBhbGxvdyBTVEEgdG8gY29ubmVjdCwgY2hubHMgbm90IHNhbWUiKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogY3NyX2lzX2Nvbm5fYWxsb3dfNWdfYmFuZCgpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIHN0YXRpb24ncyBjb25uCisgKiBpcyBhbGxvd2VkIGluIDVHaHogYmFuZC4KKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIG1hYyBjb250ZXh0LgorICogQGNobmw6IHN0YXRpb24ncyBjaGFubmVsLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayBpZiBzdGF0aW9uJ3MgY29ubmVjdGlvbiBpcyBhbGxvd2VkIGluIDVHaHogYmFuZAorICogYWZ0ZXIgY29tcGFyaW5nIGl0IHdpdGggUDJQR08ncyBvcGVyYXRpbmcgY2hhbm5lbC4gSWYgUDJQR08ncyBvcGVyYXRpbmcKKyAqIGNoYW5uZWwgYW5kIFN0YXRpb24ncyBjaGFubmVsIGlzIGRpZmZlcmVudCB0aGFuIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KKyAqIGZhbHNlIGVsc2UgdHJ1ZS4KKyAqCisgKiBSZXR1cm46IHRydWUgb3IgZmFsc2UuCisgKiovCitzdGF0aWMgYm9vbCBjc3JfaXNfY29ubl9hbGxvd181Z19iYW5kKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQzMl90IGNobmwpCit7CisJdWludDMyX3QgcDJwZ29fc2Vzc2lvbl9pZDsKKwl0Q3NyUm9hbVNlc3Npb24gKnAycGdvX3Nlc3Npb247CisKKwlpZiAoMCA9PSBjaG5sKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMCisJCQkJKCJjaGFubmVsIGlzIHplcm8sIGNvbm5lY3Rpb24gbm90IGFsbG93ZWQiKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwMnBnb19zZXNzaW9uX2lkID0gY3NyX2ZpbmRfc2Vzc2lvbl9ieV90eXBlKG1hY19jdHgsIENERl9QMlBfR09fTU9ERSk7CisJaWYgKENTUl9TRVNTSU9OX0lEX0lOVkFMSUQgIT0gcDJwZ29fc2Vzc2lvbl9pZCkgeworCQlwMnBnb19zZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHAycGdvX3Nlc3Npb25faWQpOworCQlpZiAoKDAgIT0gcDJwZ29fc2Vzc2lvbi0+YnNzUGFyYW1zLm9wZXJhdGlvbkNobikgJiYKKwkJCQkoZUNTUl9BU1NPQ19TVEFURV9UWVBFX05PVF9DT05ORUNURUQgIT0KKwkJCQkgcDJwZ29fc2Vzc2lvbi0+Y29ubmVjdFN0YXRlKSAmJgorCQkJCShwMnBnb19zZXNzaW9uLT5ic3NQYXJhbXMub3BlcmF0aW9uQ2huICE9CisJCQkJIGNobmwpKSB7CisKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMCisJCQkJKCJDYW4ndCBhbGxvdyBTVEEgdG8gY29ubmVjdCwgY2hubHMgbm90IHNhbWUiKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogY3NyX2NsZWFyX2pvaW5yZXFfcGFyYW0oKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBjbGVhciBzdGF0aW9uJ3MgcGFyYW1zCisgKiBmb3Igc3RvcmVkIGpvaW4gcmVxdWVzdCB0byBjc3IuCisgKiBAaGFsX2hhbmRsZTogcG9pbnRlciB0byBoYWwgY29udGV4dC4KKyAqIEBzZXNzaW9uX2lkOiBzdGF0aW9uJ3Mgc2Vzc2lvbiBpZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2xlYXIgc3RhdGlvbidzIGFsbG9jYXRlZCBtZW1vcnkgZm9yIGNhY2hlZCBqb2luCisgKiByZXF1ZXN0LgorICoKKyAqIFJldHVybjogdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBmdW5jdGlvbidzIG92ZXJhbGwgc3VjY2Vzcy4KKyAqKi8KK2Jvb2wgY3NyX2NsZWFyX2pvaW5yZXFfcGFyYW0odHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnN0YV9zZXNzaW9uOworCXRTY2FuUmVzdWx0TGlzdCAqYnNzX2xpc3Q7CisKKwlpZiAoTlVMTCA9PSBtYWNfY3R4KQorCQlyZXR1cm4gZmFsc2U7CisKKwlzdGFfc2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwlpZiAoTlVMTCA9PSBzdGFfc2Vzc2lvbikKKwkJcmV0dXJuIGZhbHNlOworCisJLyogUmVsZWFzZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSBwcmV2aW91cyBqb2luIHJlcXVlc3QgKi8KKwlic3NfbGlzdCA9CisJCSh0U2NhblJlc3VsdExpc3QgKikmc3RhX3Nlc3Npb24tPnN0b3JlZF9yb2FtX3Byb2ZpbGUuCisJCWJzc2xpc3RfaGFuZGxlOworCWlmIChOVUxMICE9IGJzc19saXN0KSB7CisJCWNzcl9zY2FuX3Jlc3VsdF9wdXJnZShtYWNfY3R4LAorCQkJc3RhX3Nlc3Npb24tPnN0b3JlZF9yb2FtX3Byb2ZpbGUuYnNzbGlzdF9oYW5kbGUpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJRkwoImJzcyBsaXN0IGlzIHJlbGVhc2VkIGZvciBzZXNzaW9uICVkIiksIHNlc3Npb25faWQpOworCQlzdGFfc2Vzc2lvbi0+c3RvcmVkX3JvYW1fcHJvZmlsZS5ic3NsaXN0X2hhbmRsZSA9IE5VTEw7CisJfQorCXN0YV9zZXNzaW9uLT5zdG9yZWRfcm9hbV9wcm9maWxlLmJzc2xpc3RfaGFuZGxlID0gTlVMTDsKKwljc3JfcmVsZWFzZV9wcm9maWxlKG1hY19jdHgsICZzdGFfc2Vzc2lvbi0+c3RvcmVkX3JvYW1fcHJvZmlsZS5wcm9maWxlKTsKKwlzdGFfc2Vzc2lvbi0+c3RvcmVkX3JvYW1fcHJvZmlsZS5yZWFzb24gPSAwOworCXN0YV9zZXNzaW9uLT5zdG9yZWRfcm9hbV9wcm9maWxlLnJvYW1faWQgPSAwOworCXN0YV9zZXNzaW9uLT5zdG9yZWRfcm9hbV9wcm9maWxlLmltZWRpYXRlX2ZsYWcgPSBmYWxzZTsKKwlzdGFfc2Vzc2lvbi0+c3RvcmVkX3JvYW1fcHJvZmlsZS5jbGVhcl9mbGFnID0gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogY3NyX3N0b3JlX2pvaW5yZXFfcGFyYW0oKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBzdGF0aW9uJ3Mgam9pbgorICogcmVxdWVzdCB0byB0aGF0IHN0YXRpb24ncyBzZXNzaW9uLgorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gbWFjIGNvbnRleHQuCisgKiBAcHJvZmlsZTogcG9pbnRlciB0byBzdGF0aW9uJ3Mgcm9hbSBwcm9maWxlLgorICogQHNjYW5fY2FjaGU6IHBvaW50ZXIgdG8gc3RhdGlvbidzIHNjYW4gY2FjaGUuCisgKiBAcm9hbV9pZDogcmVmZXJlbmNlIHRvIHJvYW1faWQgdmFyaWFibGUgYmVpbmcgcGFzc2VkLgorICogQHNlc3Npb25faWQ6IHN0YXRpb24ncyBzZXNzaW9uIGlkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBzdGF0aW9uJ3Mgam9pbiByZXF1ZXN0IHRvIG9uZSBvZiB0aGUKKyAqIGNzciBzdHJ1Y3R1cmUgYW5kIGFkZCBpdCB0byBzdGF0aW9uJ3Mgc2Vzc2lvbi4KKyAqCisgKiBSZXR1cm46IHRydWUgb3IgZmFsc2UgYmFzZWQgb24gZnVuY3Rpb24ncyBvdmVyYWxsIHN1Y2Nlc3MuCisgKiovCitib29sIGNzcl9zdG9yZV9qb2lucmVxX3BhcmFtKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSwKKwkJdFNjYW5SZXN1bHRIYW5kbGUgc2Nhbl9jYWNoZSwKKwkJdWludDMyX3QgKnJvYW1faWQsCisJCXVpbnQzMl90IHNlc3Npb25faWQpCit7CisJdENzclJvYW1TZXNzaW9uICpzdGFfc2Vzc2lvbjsKKworCWlmIChOVUxMID09IG1hY19jdHgpCisJCXJldHVybiBmYWxzZTsKKworCXN0YV9zZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25faWQpOworCWlmIChOVUxMID09IHN0YV9zZXNzaW9uKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzdGFfc2Vzc2lvbi0+c3RvcmVkX3JvYW1fcHJvZmlsZS5zZXNzaW9uX2lkID0gc2Vzc2lvbl9pZDsKKwljc3Jfcm9hbV9jb3B5X3Byb2ZpbGUobWFjX2N0eCwKKwkJCSZzdGFfc2Vzc2lvbi0+c3RvcmVkX3JvYW1fcHJvZmlsZS5wcm9maWxlLCBwcm9maWxlKTsKKwkvKiBuZXcgYnNzbGlzdF9oYW5kbGUncyBtZW1vcnkgd2lsbCBiZSByZWxhc2VkIGxhdGVyICovCisJc3RhX3Nlc3Npb24tPnN0b3JlZF9yb2FtX3Byb2ZpbGUuYnNzbGlzdF9oYW5kbGUgPSBzY2FuX2NhY2hlOworCXN0YV9zZXNzaW9uLT5zdG9yZWRfcm9hbV9wcm9maWxlLnJlYXNvbiA9IGVDc3JIZGRJc3N1ZWQ7CisJc3RhX3Nlc3Npb24tPnN0b3JlZF9yb2FtX3Byb2ZpbGUucm9hbV9pZCA9ICpyb2FtX2lkOworCXN0YV9zZXNzaW9uLT5zdG9yZWRfcm9hbV9wcm9maWxlLmltZWRpYXRlX2ZsYWcgPSBmYWxzZTsKKwlzdGFfc2Vzc2lvbi0+c3RvcmVkX3JvYW1fcHJvZmlsZS5jbGVhcl9mbGFnID0gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBjc3JfaXNzdWVfc3RvcmVkX2pvaW5yZXEoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBpc3N1ZXMgc3RhdGlvbidzIHN0b3JlZAorICogdGhlIGpvaW4gcmVxdWVzdC4KKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIG1hYyBjb250ZXh0LgorICogQHJvYW1faWQ6IHJlZmVyZW5jZSB0byByb2FtX2lkIHZhcmlhYmxlIGJlaW5nIHBhc3NlZC4KKyAqIEBzZXNzaW9uX2lkOiBzdGF0aW9uJ3Mgc2Vzc2lvbiBpZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaXNzdWUgc3RhdGlvbidzIHN0b3JlZCBqb2luIHJlcXVlc3QsIGZyb20gdGhpcyBwb2ludAorICogb253YXJkcyB0aGUgZmxvdyB3aWxsIGJlIGp1c3QgbGlrZSBub3JtYWwgY29ubmVjdCByZXF1ZXN0LgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9yIENERl9TVEFUVVNfRV9GQUlMVVJFLgorICoqLworQ0RGX1NUQVRVUyBjc3JfaXNzdWVfc3RvcmVkX2pvaW5yZXEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDMyX3QgKnJvYW1faWQsCisJCXVpbnQzMl90IHNlc3Npb25faWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1TZXNzaW9uICpzdGFfc2Vzc2lvbjsKKwl1aW50MzJfdCBuZXdfcm9hbV9pZDsKKworCXN0YV9zZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25faWQpOworCWlmIChOVUxMID09IHN0YV9zZXNzaW9uKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJbmV3X3JvYW1faWQgPSBHRVRfTkVYVF9ST0FNX0lEKCZtYWNfY3R4LT5yb2FtKTsKKwkqcm9hbV9pZCA9IG5ld19yb2FtX2lkOworCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX2Nvbm5lY3QobWFjX2N0eCwKKwkJCXN0YV9zZXNzaW9uLT5zdG9yZWRfcm9hbV9wcm9maWxlLnNlc3Npb25faWQsCisJCQkmc3RhX3Nlc3Npb24tPnN0b3JlZF9yb2FtX3Byb2ZpbGUucHJvZmlsZSwKKwkJCXN0YV9zZXNzaW9uLT5zdG9yZWRfcm9hbV9wcm9maWxlLmJzc2xpc3RfaGFuZGxlLAorCQkJc3RhX3Nlc3Npb24tPnN0b3JlZF9yb2FtX3Byb2ZpbGUucmVhc29uLAorCQkJbmV3X3JvYW1faWQsCisJCQlzdGFfc2Vzc2lvbi0+c3RvcmVkX3JvYW1fcHJvZmlsZS5pbWVkaWF0ZV9mbGFnLAorCQkJc3RhX3Nlc3Npb24tPnN0b3JlZF9yb2FtX3Byb2ZpbGUuY2xlYXJfZmxhZyk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTAorCQkJKCJDU1IgZmFpbGVkIGlzc3VpbmcgY29ubmVjdCBjbWQgd2l0aCBzdGF0dXMgPSAweCUwOFgiKSwKKwkJCQlzdGF0dXMpOworCQljc3JfY2xlYXJfam9pbnJlcV9wYXJhbShtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3JfcHJvY2Vzc19zZXRfaHdfbW9kZSgpIC0gU2V0IEhXIG1vZGUgY29tbWFuZCB0byBQRQorICogQG1hYzogR2xvYmFjbCBNQUMgcG9pbnRlcgorICogQGNvbW1hbmQ6IENvbW1hbmQgcmVjZWl2ZWQgZnJvbSBTTUUKKyAqCisgKiBQb3N0cyB0aGUgc2V0IEhXIG1vZGUgY29tbWFuZCB0byBQRS4gVGhpcyBtZXNzYWdlIHBhc3NpbmcKKyAqIHRocm91Z2ggUEUgaXMgcmVxdWlyZWQgZm9yIFBFJ3MgaW50ZXJuYWwgbWFuYWdlbWVudAorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNzcl9wcm9jZXNzX3NldF9od19tb2RlKHRwQW5pU2lyR2xvYmFsIG1hYywgdFNtZUNtZCAqY29tbWFuZCkKK3sKKwl1aW50MzJfdCBsZW47CisJc3RydWN0IHNfc2lyX3NldF9od19tb2RlICpjbWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdFNpck1zZ1EgbXNnOworCXN0cnVjdCBzaXJfc2V0X2h3X21vZGVfcmVzcCAqcGFyYW07CisKKwkvKiBTZXR0aW5nIEhXIG1vZGUgaXMgZm9yIHRoZSBlbnRpcmUgc3lzdGVtLgorCSAqIFNvLCBubyBuZWVkIHRvIGNoZWNrIHNlc3Npb24KKwkgKi8KKworCWlmICghY29tbWFuZCkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIlNldCBIVyBtb2RlIHBhcmFtIGlzIE5VTEwiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlsZW4gPSBzaXplb2YoKmNtZCk7CisJY21kID0gY2RmX21lbV9tYWxsb2MobGVuKTsKKwlpZiAoIWNtZCkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJLyogUHJvYmFibHkgdGhlIGZhaWwgcmVzcG9uc2Ugd2lsbCBhbHNvIGZhaWwgZHVyaW5nIG1hbGxvYy4KKwkJICogU3RpbGwgcHJvY2VlZGluZyB0byBzZW5kIHJlc3BvbnNlIQorCQkgKi8KKwkJZ290byBmYWlsOworCX0KKworCWNkZl9tZW1fc2V0KGNtZCwgbGVuLCAwKTsKKworCWNtZC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9TRVRfSFdfTU9ERV9SRVE7CisJY21kLT5sZW5ndGggPSBsZW47CisJY21kLT5zZXRfaHcuaHdfbW9kZV9pbmRleCA9IGNvbW1hbmQtPnUuc2V0X2h3X21vZGVfY21kLmh3X21vZGVfaW5kZXg7CisJLyoKKwkgKiBCZWxvdyBjYWxsYmFjayBhbmQgY29udGV4dCBpbmZvIGFyZSBub3QgbmVlZGVkIGZvciBQRSBhcyBvZiBub3cuCisJICogU3RvcmluZyB0aGUgcGFzc2VkIHZhbHVlIGluIHRoZSBzYW1lIHNfc2lyX3NldF9od19tb2RlIGZvcm1hdC4KKwkgKi8KKwljbWQtPnNldF9ody5zZXRfaHdfbW9kZV9jYiA9IGNvbW1hbmQtPnUuc2V0X2h3X21vZGVfY21kLnNldF9od19tb2RlX2NiOworCisJc21zX2xvZyhtYWMsIExPRzEsCisJCUZMKCJQb3N0aW5nIGVXTklfU01FX1NFVF9IV19NT0RFX1JFUSB0byBQRSIpKTsKKworCXN0YXR1cyA9IGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKGNtZCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJQb3N0aW5nIHRvIFBFIGZhaWxlZCIpKTsKKwkJcmV0dXJuOworCX0KKwlyZXR1cm47CitmYWlsOgorCXBhcmFtID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwYXJhbSkpOworCWlmICghcGFyYW0pIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsCisJCQlGTCgiTWFsbG9jIGZhaWw6IEZhaWwgdG8gc2VuZCByZXNwb25zZSB0byBTTUUiKSk7CisJCXJldHVybjsKKwl9CisJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJTZW5kaW5nIHNldCBIVyBmYWlsIHJlc3BvbnNlIHRvIFNNRSIpKTsKKwlwYXJhbS0+c3RhdHVzID0gU0VUX0hXX01PREVfU1RBVFVTX0VDQU5DRUxFRDsKKwlwYXJhbS0+Y2ZnZF9od19tb2RlX2luZGV4ID0gMDsKKwlwYXJhbS0+bnVtX3ZkZXZfbWFjX2VudHJpZXMgPSAwOworCW1zZy50eXBlID0gZVdOSV9TTUVfU0VUX0hXX01PREVfUkVTUDsKKwltc2cuYm9keXB0ciA9IHBhcmFtOworCW1zZy5ib2R5dmFsID0gMDsKKwlzeXNfcHJvY2Vzc19tbWhfbXNnKG1hYywgJm1zZyk7Cit9CisKKy8qKgorICogY3NyX3Byb2Nlc3Nfc2V0X2R1YWxfbWFjX2NvbmZpZygpIC0gU2V0IEhXIG1vZGUgY29tbWFuZCB0byBQRQorICogQG1hYzogR2xvYmFsIE1BQyBwb2ludGVyCisgKiBAY29tbWFuZDogQ29tbWFuZCByZWNlaXZlZCBmcm9tIFNNRQorICoKKyAqIFBvc3RzIHRoZSBzZXQgZHVhbCBtYWMgY29uZmlnIGNvbW1hbmQgdG8gUEUuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgY3NyX3Byb2Nlc3Nfc2V0X2R1YWxfbWFjX2NvbmZpZyh0cEFuaVNpckdsb2JhbCBtYWMsIHRTbWVDbWQgKmNvbW1hbmQpCit7CisJdWludDMyX3QgbGVuOworCXN0cnVjdCBzaXJfc2V0X2R1YWxfbWFjX2NmZyAqY21kOworCUNERl9TVEFUVVMgc3RhdHVzOworCXRTaXJNc2dRIG1zZzsKKwlzdHJ1Y3Qgc2lyX2R1YWxfbWFjX2NvbmZpZ19yZXNwICpwYXJhbTsKKworCS8qIFNldHRpbmcgTUFDIGNvbmZpZ3VyYXRpb24gaXMgZm9yIHRoZSBlbnRpcmUgc3lzdGVtLgorCSAqIFNvLCBubyBuZWVkIHRvIGNoZWNrIHNlc3Npb24KKwkgKi8KKworCWlmICghY29tbWFuZCkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIlNldCBIVyBtb2RlIHBhcmFtIGlzIE5VTEwiKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlsZW4gPSBzaXplb2YoKmNtZCk7CisJY21kID0gY2RmX21lbV9tYWxsb2MobGVuKTsKKwlpZiAoIWNtZCkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKwkJLyogUHJvYmFibHkgdGhlIGZhaWwgcmVzcG9uc2Ugd2lsbCBhbHNvIGZhaWwgZHVyaW5nIG1hbGxvYy4KKwkJICogU3RpbGwgcHJvY2VlZGluZyB0byBzZW5kIHJlc3BvbnNlIQorCQkgKi8KKwkJZ290byBmYWlsOworCX0KKworCWNtZC0+bWVzc2FnZV90eXBlID0gZVdOSV9TTUVfU0VUX0RVQUxfTUFDX0NGR19SRVE7CisJY21kLT5sZW5ndGggPSBsZW47CisJY21kLT5zZXRfZHVhbF9tYWMuc2Nhbl9jb25maWcgPSBjb21tYW5kLT51LnNldF9kdWFsX21hY19jbWQuc2Nhbl9jb25maWc7CisJY21kLT5zZXRfZHVhbF9tYWMuZndfbW9kZV9jb25maWcgPQorCQljb21tYW5kLT51LnNldF9kdWFsX21hY19jbWQuZndfbW9kZV9jb25maWc7CisJLyoKKwkgKiBCZWxvdyBjYWxsYmFjayBhbmQgY29udGV4dCBpbmZvIGFyZSBub3QgbmVlZGVkIGZvciBQRSBhcyBvZiBub3cuCisJICogU3RvcmluZyB0aGUgcGFzc2VkIHZhbHVlIGluIHRoZSBzYW1lIHNpcl9zZXRfZHVhbF9tYWNfY2ZnIGZvcm1hdC4KKwkgKi8KKwljbWQtPnNldF9kdWFsX21hYy5zZXRfZHVhbF9tYWNfY2IgPQorCQljb21tYW5kLT51LnNldF9kdWFsX21hY19jbWQuc2V0X2R1YWxfbWFjX2NiOworCisJc21zX2xvZyhtYWMsIExPRzEsCisJCUZMKCJQb3N0aW5nIGVXTklfU01FX1NFVF9EVUFMX01BQ19DRkdfUkVRIHRvIFBFOiAleCAleCIpLAorCQljbWQtPnNldF9kdWFsX21hYy5zY2FuX2NvbmZpZywKKwkJY21kLT5zZXRfZHVhbF9tYWMuZndfbW9kZV9jb25maWcpOworCisJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMoY21kKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIlBvc3RpbmcgdG8gUEUgZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCXJldHVybjsKK2ZhaWw6CisJcGFyYW0gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnBhcmFtKSk7CisJaWYgKCFwYXJhbSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJNYWxsb2MgZmFpbDogRmFpbCB0byBzZW5kIHJlc3BvbnNlIHRvIFNNRSIpKTsKKwkJcmV0dXJuOworCX0KKwlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIlNlbmRpbmcgc2V0IGR1YWwgbWFjIGZhaWwgcmVzcG9uc2UgdG8gU01FIikpOworCXBhcmFtLT5zdGF0dXMgPSBTRVRfSFdfTU9ERV9TVEFUVVNfRUNBTkNFTEVEOworCW1zZy50eXBlID0gZVdOSV9TTUVfU0VUX0RVQUxfTUFDX0NGR19SRVNQOworCW1zZy5ib2R5cHRyID0gcGFyYW07CisJbXNnLmJvZHl2YWwgPSAwOworCXN5c19wcm9jZXNzX21taF9tc2cobWFjLCAmbXNnKTsKK30KKworLyoqCisgKiBjc3JfcHJvY2Vzc19uc3NfdXBkYXRlX3JlcSgpIC0gVXBkYXRlIG5zcyBjb21tYW5kIHRvIFBFCisgKiBAbWFjOiBHbG9iYWNsIE1BQyBwb2ludGVyCisgKiBAY29tbWFuZDogQ29tbWFuZCByZWNlaXZlZCBmcm9tIFNNRQorICoKKyAqIFBvc3RzIHRoZSBuc3MgdXBkYXRlIGNvbW1hbmQgdG8gUEUuIFRoaXMgbWVzc2FnZSBwYXNzaW5nCisgKiB0aHJvdWdoIFBFIGlzIHJlcXVpcmVkIGZvciBQRSdzIGludGVybmFsIG1hbmFnZW1lbnQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjc3JfcHJvY2Vzc19uc3NfdXBkYXRlX3JlcSh0cEFuaVNpckdsb2JhbCBtYWMsIHRTbWVDbWQgKmNvbW1hbmQpCit7CisJdWludDMyX3QgbGVuOworCXN0cnVjdCBzaXJfbnNzX3VwZGF0ZV9yZXF1ZXN0ICptc2c7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdFNpck1zZ1EgbXNnX3JldHVybjsKKwlzdHJ1Y3Qgc2lyX2JlYWNvbl90eF9jb21wbGV0ZV9yc3AgKnBhcmFtOworCisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uID0KKwkJQ1NSX0dFVF9TRVNTSU9OKG1hYywgY29tbWFuZC0+c2Vzc2lvbklkKTsKKworCWlmICghc2Vzc2lvbikgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIlNlc3Npb24gbm90IGZvdW5kIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCFjb21tYW5kKSB7CisJCXNtc19sb2cobWFjLCBMT0dFLCBGTCgibnNzIHVwZGF0ZSBwYXJhbSBpcyBOVUxMIikpOworCQlnb3RvIGZhaWw7CisJfQorCisJbGVuID0gc2l6ZW9mKCptc2cpOworCW1zZyA9IGNkZl9tZW1fbWFsbG9jKGxlbik7CisJaWYgKCFtc2cpIHsKKwkJc21zX2xvZyhtYWMsIExPR0UsIEZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKSk7CisJCS8qIFByb2JhYmx5IHRoZSBmYWlsIHJlc3BvbnNlIGlzIGFsc28gZmFpbCBkdXJpbmcgbWFsbG9jLgorCQkgKiBTdGlsbCBwcm9jZWVkaW5nIHRvIHNlbmQgcmVzcG9uc2UhCisJCSAqLworCQlnb3RvIGZhaWw7CisJfQorCisJY2RmX21lbV9zZXQoKHZvaWQgKiltc2csIHNpemVvZigqbXNnKSwgMCk7CisJbXNnLT5tc2dUeXBlID0gZVdOSV9TTUVfTlNTX1VQREFURV9SRVE7CisJbXNnLT5tc2dMZW4gPSBzaXplb2YoKm1zZyk7CisKKwltc2ctPm5ld19uc3MgPSBjb21tYW5kLT51Lm5zc191cGRhdGVfY21kLm5ld19uc3M7CisJbXNnLT52ZGV2X2lkID0gY29tbWFuZC0+dS5uc3NfdXBkYXRlX2NtZC5zZXNzaW9uX2lkOworCisJc21zX2xvZyhtYWMsIExPRzEsCisJCUZMKCJQb3N0aW5nIGVXTklfU01FX05TU19VUERBVEVfUkVRIHRvIFBFIikpOworCisJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMobXNnKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIlBvc3RpbmcgdG8gUEUgZmFpbGVkIikpOworCQlyZXR1cm47CisJfQorCXJldHVybjsKK2ZhaWw6CisJcGFyYW0gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnBhcmFtKSk7CisJaWYgKCFwYXJhbSkgeworCQlzbXNfbG9nKG1hYywgTE9HRSwKKwkJCUZMKCJNYWxsb2MgZmFpbDogRmFpbCB0byBzZW5kIHJlc3BvbnNlIHRvIFNNRSIpKTsKKwkJcmV0dXJuOworCX0KKwlzbXNfbG9nKG1hYywgTE9HRSwgRkwoIlNlbmRpbmcgbnNzIHVwZGF0ZSBmYWlsIHJlc3BvbnNlIHRvIFNNRSIpKTsKKwlwYXJhbS0+dHhfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJcGFyYW0tPnNlc3Npb25faWQgPSBjb21tYW5kLT51Lm5zc191cGRhdGVfY21kLnNlc3Npb25faWQ7CisJbXNnX3JldHVybi50eXBlID0gZVdOSV9TTUVfTlNTX1VQREFURV9SU1A7CisJbXNnX3JldHVybi5ib2R5cHRyID0gcGFyYW07CisJbXNnX3JldHVybi5ib2R5dmFsID0gMDsKKwlzeXNfcHJvY2Vzc19tbWhfbXNnKG1hYywgJm1zZ19yZXR1cm4pOworfQpkaWZmIC0tZ2l0IGEvY29yZS9zbWUvc3JjL2Nzci9jc3JfYXBpX3NjYW4uYyBiL2NvcmUvc21lL3NyYy9jc3IvY3NyX2FwaV9zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmMGFlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL3NyYy9jc3IvY3NyX2FwaV9zY2FuLmMKQEAgLTAsMCArMSw2OTQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisKKyAgICBcZmlsZSBjc3JfYXBpX3NjYW4uYworCisgICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBDb21tb24gU2NhbiBpbnRlcmZhY2VzLgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKworI2luY2x1ZGUgImNkc19tcS5oIgorI2luY2x1ZGUgImNzcl9pbnNpZGVfYXBpLmgiCisjaW5jbHVkZSAic21lX2luc2lkZS5oIgorI2luY2x1ZGUgInNtc19kZWJ1Zy5oIgorCisjaW5jbHVkZSAiY3NyX3N1cHBvcnQuaCIKKworI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2V2ZW50LmgiCisKKyNpbmNsdWRlICJjZHNfcmVnX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJjZHNfdXRpbHMuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAibGltX2FwaS5oIgorI2luY2x1ZGUgIndtYS5oIgorCisjaW5jbHVkZSAiY2RzX2NvbmN1cnJlbmN5LmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorCisjZGVmaW5lIE1JTl9DSE5fVElNRV9UT19GSU5EX0dPIDEwMAorI2RlZmluZSBNQVhfQ0hOX1RJTUVfVE9fRklORF9HTyAxMDAKKyNkZWZpbmUgRElSRUNUX1NTSURfTEVOIDcKKworLyogUHVycG9zZSBvZiBISURERU5fVElNRVIKKyoqIFdoZW4gd2UgcmVtb3ZlIGhpZGRlbiBzc2lkIGZyb20gdGhlIHByb2ZpbGUgaS5lLiwgZm9yZ2V0IHRoZSBTU0lEIHZpYSBHVUkgdGhhdCBTU0lEIHNob3VsZG4ndCBzZWUgaW4gdGhlIHByb2ZpbGUKKyoqIEZvciBhYm92ZSByZXF1aXJlbWVudCB3ZSB1c2VkIHRpbWVyIGxpbWl0LCBsb2dpYyBpcyBleHBsYWluZWQgYmVsb3cKKyoqIFRpbWVyIHZhbHVlIGlzIGluaXRpYWxzZWQgdG8gY3VycmVudCB0aW1lICB3aGVuIGl0IHJlY2VpdmVzIGNvcnJlc3BvbmRpbmcgcHJvYmUgcmVzcG9uc2Ugb2YgaGlkZGVuIFNTSUQgKFRoZSBwcm9iZSByZXF1ZXN0IGlzCisqKiByZWNlaXZlZCByZWd1bGFybHkgdGlsbCBTU0lEIGluIHRoZSBwcm9maWxlLiBPbmNlIGl0IGlzIHJlbW92ZWQgZnJvbSBwcm9maWxlIHByb2JlIHJlcXVlc3QgaXMgbm90IHNlbnQuKSB3aGVuIHdlIHJlY2VpdmUgcHJvYmUgcmVzcG9uc2UKKyoqIGZvciBicm9hZGNhc3QgcHJvYmUgcmVxdWVzdCwgZHVyaW5nIHVwZGF0ZSBTU0lEIHdpdGggc2F2ZWQgU1NJRCB3ZSB3aWxsIGRpZmYgY3VycmVudCB0aW1lIHdpdGggc2F2ZWQgU1NJRCB0aW1lIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxIG1pbgorKiogdGhlbiB3ZSBhcmUgbm90IHVwZGF0aW5nIHdpdGggb2xkIG9uZQorKi8KKworI2RlZmluZSBISURERU5fVElNRVIgKDEqNjAqMTAwMCkKKyNkZWZpbmUgQ1NSX1NDQU5fUkVTVUxUX1JTU0lfV0VJR0hUICAgICA4MCAgICAgIC8qIG11c3QgYmUgbGVzcyB0aGFuIDEwMCwgcmVwcmVzZW50IHRoZSBwZXJzZW50YWdlIG9mIG5ldyBSU1NJICovCisKKyNkZWZpbmUgTUFYX0FDVElWRV9TQ0FOX0ZPUl9PTkVfQ0hBTk5FTCAxNDAKKyNkZWZpbmUgTUlOX0FDVElWRV9TQ0FOX0ZPUl9PTkVfQ0hBTk5FTCAxMjAKKworI2RlZmluZSBNQVhfQUNUSVZFX1NDQU5fRk9SX09ORV9DSEFOTkVMX0ZBU1RSRUFTU09DIDMwCisjZGVmaW5lIE1JTl9BQ1RJVkVfU0NBTl9GT1JfT05FX0NIQU5ORUxfRkFTVFJFQVNTT0MgMjAKKworI2RlZmluZSBQQ0xfQURWQU5UQUdFIDMwCisjZGVmaW5lIFBDTF9SU1NJX1RIUkVTSE9MRCAtNzUKKworI2RlZmluZSBDU1JfU0NBTl9JU19PVkVSX0JTU19MSU1JVChwTWFjKSAgXAorCSgocE1hYyktPnNjYW4ubkJzc0xpbWl0IDw9IChjc3JfbGxfY291bnQoJihwTWFjKS0+c2Nhbi5zY2FuUmVzdWx0TGlzdCkpKQorCit2b2lkIGNzcl9zY2FuX2dldF9yZXN1bHRfdGltZXJfaGFuZGxlcih2b2lkICopOworc3RhdGljIHZvaWQgY3NyX3NjYW5fcmVzdWx0X2NmZ19hZ2luZ190aW1lcl9oYW5kbGVyKHZvaWQgKnB2KTsKK3N0YXRpYyB2b2lkIGNzcl9zZXRfZGVmYXVsdF9zY2FuX3RpbWluZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyU2NhblR5cGUgc2NhblR5cGUsCisJCQkJCXRDc3JTY2FuUmVxdWVzdCAqcFNjYW5SZXF1ZXN0KTsKKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorc3RhdGljIHZvaWQgY3NyX3N0YV9hcF9jb25jX3RpbWVyX2hhbmRsZXIodm9pZCAqKTsKKyNlbmRpZgorYm9vbCBjc3JfaXNfc3VwcG9ydGVkX2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBjaGFubmVsSWQpOworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9jaGFubmVscyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCk7Cit2b2lkIGNzcl9zZXRfY2ZnX3ZhbGlkX2NoYW5uZWxfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwQ2hhbm5lbExpc3QsCisJCQkJICAgIHVpbnQ4X3QgTnVtQ2hhbm5lbHMpOwordm9pZCBjc3Jfc2F2ZV90eF9wb3dlcl90b19jZmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdERibExpbmtMaXN0ICpwTGlzdCwKKwkJCSAgICAgIHVpbnQzMl90IGNmZ0lkKTsKK3ZvaWQgY3NyX3NldF9jZmdfY291bnRyeV9jb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKmNvdW50cnlDb2RlKTsKK3ZvaWQgY3NyX3B1cmdlX2NoYW5uZWxfcG93ZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdERibExpbmtMaXN0ICpwQ2hhbm5lbExpc3QpOwordm9pZCBjc3JfcmVsZWFzZV9zY2FuX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsCisJCQkgICAgICBlQ3NyU2NhblN0YXR1cyBzY2FuU3RhdHVzKTsKK3N0YXRpYyBib29sIGNzcl9zY2FuX3ZhbGlkYXRlX3NjYW5fcmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBDaGFubmVscywKKwkJCQkJICB1aW50OF90IG51bUNobiwKKwkJCQkJICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLAorCQkJCQkgIHREb3QxMWZCZWFjb25JRXMgKipwcEllcyk7Citib29sIGNzcl9yb2FtX2lzX3ZhbGlkX2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBjaGFubmVsKTsKK3ZvaWQgY3NyX3BydW5lX2NoYW5uZWxfbGlzdF9mb3JfbW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgdENzckNoYW5uZWwgKnBDaGFubmVsTGlzdCk7CisKKyNkZWZpbmUgQ1NSX0lTX1NPQ0lBTF9DSEFOTkVMKGNoYW5uZWwpIFwKKwkoKChjaGFubmVsKSA9PSAxKSB8fCAoKGNoYW5uZWwpID09IDYpIHx8ICgoY2hhbm5lbCkgPT0gMTEpKQorCitzdGF0aWMgdm9pZCBjc3JfcmVsZWFzZV9zY2FuX2NtZF9wZW5kaW5nX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwl0U21lQ21kICpwQ29tbWFuZDsKKworCXdoaWxlICgocEVudHJ5ID0KKwkJCWNzcl9sbF9yZW1vdmVfaGVhZCgmcE1hYy0+c2Nhbi5zY2FuQ21kUGVuZGluZ0xpc3QsCisJCQkJCSAgIExMX0FDQ0VTU19MT0NLKSkgIT0gTlVMTCkgeworCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJaWYgKGVTbWVDc3JDb21tYW5kTWFzayAmIHBDb21tYW5kLT5jb21tYW5kKSB7CisJCQljc3JfYWJvcnRfY29tbWFuZChwTWFjLCBwQ29tbWFuZCwgdHJ1ZSk7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJFcnJvcjogUmVjZWl2ZWQgY29tbWFuZCA6ICVkIiksCisJCQkJcENvbW1hbmQtPmNvbW1hbmQpOworCQl9CisJfQorfQorCisvKiBwUmVzdWx0IGlzIGludmFsaWQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAqLwordm9pZCBjc3JfZnJlZV9zY2FuX3Jlc3VsdF9lbnRyeSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlc3VsdCAqcFJlc3VsdCkKK3sKKwlpZiAoTlVMTCAhPSBwUmVzdWx0LT5SZXN1bHQucHZJZXMpIHsKKwkJY2RmX21lbV9mcmVlKHBSZXN1bHQtPlJlc3VsdC5wdkllcyk7CisJfQorCWNkZl9tZW1fZnJlZShwUmVzdWx0KTsKK30KKworc3RhdGljIENERl9TVEFUVVMgY3NyX2xsX3NjYW5fcHVyZ2VfcmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgIHREYmxMaW5rTGlzdCAqcExpc3QpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdExpc3RFbGVtICpwRW50cnk7CisJdENzclNjYW5SZXN1bHQgKnBCc3NEZXNjOworCisJY3NyX2xsX2xvY2socExpc3QpOworCisJd2hpbGUgKChwRW50cnkgPSBjc3JfbGxfcmVtb3ZlX2hlYWQocExpc3QsIExMX0FDQ0VTU19OT0xPQ0spKSAhPSBOVUxMKSB7CisJCXBCc3NEZXNjID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKwkJY3NyX2ZyZWVfc2Nhbl9yZXN1bHRfZW50cnkocE1hYywgcEJzc0Rlc2MpOworCX0KKworCWNzcl9sbF91bmxvY2socExpc3QpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9vcGVuKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwljc3JfbGxfb3BlbihtYWNfY3R4LT5oSGRkLCAmbWFjX2N0eC0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisJY3NyX2xsX29wZW4obWFjX2N0eC0+aEhkZCwgJm1hY19jdHgtPnNjYW4udGVtcFNjYW5SZXN1bHRzKTsKKwljc3JfbGxfb3BlbihtYWNfY3R4LT5oSGRkLCAmbWFjX2N0eC0+c2Nhbi5jaGFubmVsUG93ZXJJbmZvTGlzdDI0KTsKKwljc3JfbGxfb3BlbihtYWNfY3R4LT5oSGRkLCAmbWFjX2N0eC0+c2Nhbi5jaGFubmVsUG93ZXJJbmZvTGlzdDVHKTsKKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorCWNzcl9sbF9vcGVuKG1hY19jdHgtPmhIZGQsICZtYWNfY3R4LT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCk7CisjZW5kaWYKKwltYWNfY3R4LT5zY2FuLmZGdWxsU2Nhbklzc3VlZCA9IGZhbHNlOworCW1hY19jdHgtPnNjYW4ubkJzc0xpbWl0ID0gQ1NSX01BWF9CU1NfU1VQUE9SVDsKKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorCXN0YXR1cyA9IGNkZl9tY190aW1lcl9pbml0KCZtYWNfY3R4LT5zY2FuLmhUaW1lclN0YUFwQ29uY1RpbWVyLAorCQkJCSAgIENERl9USU1FUl9UWVBFX1NXLAorCQkJCSAgIGNzcl9zdGFfYXBfY29uY190aW1lcl9oYW5kbGVyLAorCQkJCSAgIG1hY19jdHgpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIk1lbSBBbGxvYyBmYWlsZWQgZm9yIGhUaW1lclN0YUFwQ29uY1RpbWVyIHRpbWVyIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKyNlbmRpZgorCXN0YXR1cyA9IGNkZl9tY190aW1lcl9pbml0KCZtYWNfY3R4LT5zY2FuLmhUaW1lclJlc3VsdENmZ0FnaW5nLAorCQkJCSAgIENERl9USU1FUl9UWVBFX1NXLAorCQkJCSAgIGNzcl9zY2FuX3Jlc3VsdF9jZmdfYWdpbmdfdGltZXJfaGFuZGxlciwKKwkJCQkgICBtYWNfY3R4KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiTWVtIEFsbG9jIGZhaWxlZCBmb3IgQ0ZHIFJlc3VsdEFnaW5nIHRpbWVyIikpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9jbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCWNzcl9sbF9zY2FuX3B1cmdlX3Jlc3VsdChwTWFjLCAmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMpOworCWNzcl9sbF9zY2FuX3B1cmdlX3Jlc3VsdChwTWFjLCAmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisjaWZkZWYgV0xBTl9BUF9TVEFfQ09OQ1VSUkVOQ1kKKwljc3JfcmVsZWFzZV9zY2FuX2NtZF9wZW5kaW5nX2xpc3QocE1hYyk7CisjZW5kaWYKKwljc3JfbGxfY2xvc2UoJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QpOworCWNzcl9sbF9jbG9zZSgmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMpOworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisJY3NyX2xsX2Nsb3NlKCZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCk7CisjZW5kaWYKKwljc3JfcHVyZ2VfY2hhbm5lbF9wb3dlcihwTWFjLCAmcE1hYy0+c2Nhbi5jaGFubmVsUG93ZXJJbmZvTGlzdDI0KTsKKwljc3JfcHVyZ2VfY2hhbm5lbF9wb3dlcihwTWFjLCAmcE1hYy0+c2Nhbi5jaGFubmVsUG93ZXJJbmZvTGlzdDVHKTsKKwljc3JfbGxfY2xvc2UoJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3QyNCk7CisJY3NyX2xsX2Nsb3NlKCZwTWFjLT5zY2FuLmNoYW5uZWxQb3dlckluZm9MaXN0NUcpOworCWNzcl9zY2FuX2Rpc2FibGUocE1hYyk7CisJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnBNYWMtPnNjYW4uaFRpbWVyUmVzdWx0Q2ZnQWdpbmcpOworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnBNYWMtPnNjYW4uaFRpbWVyU3RhQXBDb25jVGltZXIpOworI2VuZGlmCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9lbmFibGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworCXBNYWMtPnNjYW4uZlNjYW5FbmFibGUgPSB0cnVlOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9kaXNhYmxlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisKKwljc3Jfc2Nhbl9zdG9wX3RpbWVycyhwTWFjKTsKKwlwTWFjLT5zY2FuLmZTY2FuRW5hYmxlID0gZmFsc2U7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiBTZXQgc2NhbiB0aW1pbmcgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gc3RhdGUgb2Ygb3RoZXIgZHJpdmVyIHNlc3Npb25zICovCisvKiBObyB2YWxpZGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIHBlcmZvcm1lZC4gKi8KK3N0YXRpYyB2b2lkIGNzcl9zZXRfZGVmYXVsdF9zY2FuX3RpbWluZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyU2NhblR5cGUgc2NhblR5cGUsCisJCQkJCXRDc3JTY2FuUmVxdWVzdCAqcFNjYW5SZXF1ZXN0KQoreworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisJaWYgKGNzcl9pc19hbnlfc2Vzc2lvbl9jb25uZWN0ZWQocE1hYykpIHsKKwkJLyogUmVzZXQgcGFzc2l2ZSBzY2FuIHRpbWUgYXMgcGVyIGluaSBwYXJhbWV0ZXIuICovCisJCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSwKKwkJCSAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5QYXNzaXZlTWF4Q2huVGltZUNvbmMpOworCQkvKiBJZiBtdWx0aS1zZXNzaW9uLCB1c2UgdGhlIGFwcHJvcHJpYXRlIGRlZmF1bHQgc2NhbiB0aW1lcyAqLworCQlpZiAoc2NhblR5cGUgPT0gZVNJUl9BQ1RJVkVfU0NBTikgeworCQkJcFNjYW5SZXF1ZXN0LT5tYXhDaG5UaW1lID0KKwkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNYXhDaG5UaW1lQ29uYzsKKwkJCXBTY2FuUmVxdWVzdC0+bWluQ2huVGltZSA9CisJCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWluQ2huVGltZUNvbmM7CisJCX0gZWxzZSB7CisJCQlwU2NhblJlcXVlc3QtPm1heENoblRpbWUgPQorCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNYXhDaG5UaW1lQ29uYzsKKwkJCXBTY2FuUmVxdWVzdC0+bWluQ2huVGltZSA9CisJCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1pbkNoblRpbWVDb25jOworCQl9CisJCXBTY2FuUmVxdWVzdC0+cmVzdFRpbWUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5SZXN0VGltZUNvbmM7CisKKwkJLyogUmV0dXJuIHNvIHRoYXQgZmllbGRzIHNldCBhYm92ZSB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbi4gKi8KKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJLyogVGhpcyBwb3J0aW9uIG9mIHRoZSBjb2RlIGV4ZWN1dGVkIGlmIG11bHRpLXNlc3Npb24gbm90IHN1cHBvcnRlZCAqLworCS8qIChXTEFOX0FQX1NUQV9DT05DVVJSRU5DWSBub3QgZGVmaW5lZCkgb3Igbm8gbXVsdGktc2Vzc2lvbi4gKi8KKwkvKiBVc2UgdGhlICJyZWd1bGFyIiAobm9uLWNvbmN1cnJlbmN5KSBkZWZhdWx0IHNjYW4gdGltaW5nLiAqLworCWNmZ19zZXRfaW50KHBNYWMsIFdOSV9DRkdfUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSwKKwkJICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNYXhDaG5UaW1lKTsKKwlpZiAocFNjYW5SZXF1ZXN0LT5zY2FuVHlwZSA9PSBlU0lSX0FDVElWRV9TQ0FOKSB7CisJCXBTY2FuUmVxdWVzdC0+bWF4Q2huVGltZSA9CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNYXhDaG5UaW1lOworCQlwU2NhblJlcXVlc3QtPm1pbkNoblRpbWUgPQorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWluQ2huVGltZTsKKwl9IGVsc2UgeworCQlwU2NhblJlcXVlc3QtPm1heENoblRpbWUgPQorCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1heENoblRpbWU7CisJCXBTY2FuUmVxdWVzdC0+bWluQ2huVGltZSA9CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5QYXNzaXZlTWluQ2huVGltZTsKKwl9CisjaWZkZWYgV0xBTl9BUF9TVEFfQ09OQ1VSUkVOQ1kKKwkvKiBObyByZXN0IHRpbWUgaWYgbm8gc2Vzc2lvbnMgYXJlIGNvbm5lY3RlZC4gKi8KKwlwU2NhblJlcXVlc3QtPnJlc3RUaW1lID0gMDsKKyNlbmRpZgorfQorCisvKioKKyAqIGNzcl9zY2FuXzJnX29ubHlfcmVxdWVzdCgpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIHVwZGF0ZSB0aGUgc2NhbiByZXF1ZXN0IHdpdGgKKyAqIG9ubHkgMi40R0h6IHZhbGlkIGNoYW5uZWwgbGlzdC4KKyAqIEBtYWNfY3R4OiAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBzY2FuX2NtZCAgICAgIHNjYW4gY21kCisgKiBAc2Nhbl9yZXEgICAgICBzY2FuIHJlcQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgdGhlIHNjYW4gcmVxdWVzdCB3aXRoICBvbmx5IDIuNEdIeiB2YWxpZCBjaGFubmVsCisgKiBsaXN0LgorICoKKyAqIEBSZXR1cm46IHN0YXR1cyBvZiBvcGVyYXRpb24KKyAqLworc3RhdGljIENERl9TVEFUVVMKK2Nzcl9zY2FuXzJnX29ubHlfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJIHRTbWVDbWQgKnNjYW5fY21kLAorCQkJIHRDc3JTY2FuUmVxdWVzdCAqc2Nhbl9yZXEpCit7CisJdWludDhfdCBpZHgsIGxzdF9zeiA9IDA7CisKKwlDREZfQVNTRVJUKHNjYW5fY21kICYmIHNjYW5fcmVxKTsKKwkvKiBUbyBzaWxlbmNlIHRoZSBLVyB0b29sIG51bGwgY2hlY2sgaXMgYWRkZWQgKi8KKwlpZiAoKHNjYW5fY21kID09IE5VTEwpIHx8IChzY2FuX3JlcSA9PSBOVUxMKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiIFNjYW4gQ21kIG9yIFNjYW4gUmVxdWVzdCBpcyBOVUxMICIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwlpZiAoZUNTUl9TQ0FOX1JFUVVFU1RfRlVMTF9TQ0FOICE9IHNjYW5fcmVxLT5yZXF1ZXN0VHlwZSkKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXNtc19sb2cobWFjX2N0eCwgTE9HMSwKKwkJRkwoIlNjYW5uaW5nIG9ubHkgMkcgQ2hhbm5lbHMgZHVyaW5nIGZpcnN0IHNjYW4iKSk7CisKKwkvKiBDb250c3J1Y3QgdmFsaWQgU3VwcG9ydGVkIDIuNCBHSHogQ2hhbm5lbCBMaXN0ICovCisJaWYgKE5VTEwgPT0gc2Nhbl9yZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSB7CisJCXNjYW5fcmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9CisJCQljZGZfbWVtX21hbGxvYyhOVU1fMjRHSFpfQ0hBTk5FTFMpOworCQlpZiAoTlVMTCA9PSBzY2FuX3JlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4iKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisJCWZvciAoaWR4ID0gMTsgaWR4IDw9IE5VTV8yNEdIWl9DSEFOTkVMUzsgaWR4KyspIHsKKwkJCWlmIChjc3JfaXNfc3VwcG9ydGVkX2NoYW5uZWwobWFjX2N0eCwgaWR4KSkgeworCQkJCXNjYW5fcmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtsc3Rfc3pdID0gaWR4OworCQkJCWxzdF9zeisrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpZHggPSAwOworCQkgICAgIGlkeCA8IHNjYW5fcmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOworCQkgICAgIGlkeCsrKSB7CisJCQlpZiAoc2Nhbl9yZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W2lkeF0gPD0KKwkJCQlDRFNfMjRfR0haX0NIQU5ORUxfMTQKKwkJCSAgICAmJiBjc3JfaXNfc3VwcG9ydGVkX2NoYW5uZWwobWFjX2N0eCwKKwkJCQlzY2FuX3JlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaWR4XSkpIHsKKwkJCQlzY2FuX3JlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbbHN0X3N6XSA9CisJCQkJCXNjYW5fcmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpZHhdOworCQkJCWxzdF9zeisrOworCQkJfQorCQl9CisJfQorCXNjYW5fcmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gbHN0X3N6OworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkCitjc3Jfc2V0X3NjYW5fcmVhc29uKHRTbWVDbWQgKnNjYW5fY21kLCBlQ3NyUmVxdWVzdFR5cGUgcmVxX3R5cGUpCit7CisJc3dpdGNoIChyZXFfdHlwZSkgeworCWNhc2UgZUNTUl9TQ0FOX1JFUVVFU1RfMTFEX1NDQU46CisJCXNjYW5fY21kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW4xMWQxOworCQlicmVhazsKKyNpZmRlZiBTT0ZUQVBfQ0hBTk5FTF9SQU5HRQorCWNhc2UgZUNTUl9TQ0FOX1NPRlRBUF9DSEFOTkVMX1JBTkdFOgorI2VuZGlmCisJY2FzZSBlQ1NSX1NDQU5fUkVRVUVTVF9GVUxMX1NDQU46CisJY2FzZSBlQ1NSX1NDQU5fUDJQX0RJU0NPVkVSWToKKwkJc2Nhbl9jbWQtPnUuc2NhbkNtZC5yZWFzb24gPSBlQ3NyU2NhblVzZXJSZXF1ZXN0OworCQlicmVhazsKKwljYXNlIGVDU1JfU0NBTl9IT19QUk9CRV9TQ0FOOgorCQlzY2FuX2NtZC0+dS5zY2FuQ21kLnJlYXNvbiA9IGVDc3JTY2FuUHJvYmVCc3M7CisJCWJyZWFrOworCWNhc2UgZUNTUl9TQ0FOX1AyUF9GSU5EX1BFRVI6CisJCXNjYW5fY21kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW5QMlBGaW5kUGVlcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgQ0RGX1NUQVRVUworY3NyX2lzc3VlXzExZF9zY2FuKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRTbWVDbWQgKnNjYW5fY21kLAorCQkgICB0Q3NyU2NhblJlcXVlc3QgKnNjYW5fcmVxLCB1aW50MTZfdCBzZXNzaW9uX2lkKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRTbWVDbWQgKnNjYW5fMTFkX2NtZCA9IE5VTEw7CisJdENzclNjYW5SZXF1ZXN0IHRtcF9ycTsKKwl0Q3NyQ2hhbm5lbEluZm8gKnBDaG5JbmZvID0gJnRtcF9ycS5DaGFubmVsSW5mbzsKKwl1aW50MzJfdCBudW1DaG4gPSBtYWNfY3R4LT5zY2FuLmJhc2VfY2hhbm5lbHMubnVtQ2hhbm5lbHM7CisJdENzclJvYW1TZXNzaW9uICpjc3Jfc2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKworCWlmIChjc3Jfc2Vzc2lvbiA9PSBOVUxMKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksCisJCQlzZXNzaW9uX2lkKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmICghKCgoZmFsc2UgPT0gbWFjX2N0eC0+Zmlyc3Rfc2Nhbl9kb25lKQorCSAgICAgJiYgKGVDU1JfU0NBTl9SRVFVRVNUXzExRF9TQ0FOICE9IHNjYW5fcmVxLT5yZXF1ZXN0VHlwZSkpCisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKwkgICAgJiYgKGVDU1JfU0NBTl9TT0ZUQVBfQ0hBTk5FTF9SQU5HRSAhPSBzY2FuX3JlcS0+cmVxdWVzdFR5cGUpCisjZW5kaWYKKwkgICAgJiYgKGZhbHNlID09IG1hY19jdHgtPnNjYW4uZkVuYWJsZUJ5cGFzczExZCkpKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJY2RmX21lbV9zZXQoJnRtcF9ycSwgc2l6ZW9mKHRDc3JTY2FuUmVxdWVzdCksIDApOworCXNjYW5fMTFkX2NtZCA9IGNzcl9nZXRfY29tbWFuZF9idWZmZXIobWFjX2N0eCk7CisJaWYgKCFzY2FuXzExZF9jbWQpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgic2Nhbl8xMWRfY21kIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNkZl9tZW1fc2V0KCZzY2FuXzExZF9jbWQtPnUuc2NhbkNtZCwgc2l6ZW9mKHRTY2FuQ21kKSwgMCk7CisJcENobkluZm8tPkNoYW5uZWxMaXN0ID0gY2RmX21lbV9tYWxsb2MobnVtQ2huKTsKKwlpZiAoTlVMTCA9PSBwQ2huSW5mby0+Q2hhbm5lbExpc3QpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJY2RmX21lbV9jb3B5KHBDaG5JbmZvLT5DaGFubmVsTGlzdCwKKwkJICAgICBtYWNfY3R4LT5zY2FuLmJhc2VfY2hhbm5lbHMuY2hhbm5lbExpc3QsIG51bUNobik7CisKKwlwQ2huSW5mby0+bnVtT2ZDaGFubmVscyA9ICh1aW50OF90KSBudW1DaG47CisJc2Nhbl8xMWRfY21kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRTY2FuOworCXNjYW5fMTFkX2NtZC0+dS5zY2FuQ21kLmNhbGxiYWNrID0gbWFjX2N0eC0+c2Nhbi5jYWxsYmFjazExZFNjYW5Eb25lOworCXNjYW5fMTFkX2NtZC0+dS5zY2FuQ21kLnBDb250ZXh0ID0gTlVMTDsKKwl3bWFfZ2V0X3NjYW5faWQoJnNjYW5fMTFkX2NtZC0+dS5zY2FuQ21kLnNjYW5JRCk7CisJdG1wX3JxLkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0FOWTsKKwl0bXBfcnEuc2Nhbl9pZCA9IHNjYW5fMTFkX2NtZC0+dS5zY2FuQ21kLnNjYW5JRDsKKworCXN0YXR1cyA9IGNkZl9tY190aW1lcl9pbml0KCZzY2FuX2NtZC0+dS5zY2FuQ21kLmNzcl9zY2FuX3RpbWVyLAorCQkJQ0RGX1RJTUVSX1RZUEVfU1csCisJCQljc3Jfc2Nhbl9hY3RpdmVfbGlzdF90aW1lb3V0X2hhbmRsZSwgJnNjYW5fMTFkX2NtZCk7CisKKwlpZiAoY3NyX2lzMTFkX3N1cHBvcnRlZChtYWNfY3R4KSkgeworCQl0bXBfcnEuYmNuUnB0UmVxU2NhbiA9IHNjYW5fcmVxLT5iY25ScHRSZXFTY2FuOworCQlpZiAoc2Nhbl9yZXEtPmJjblJwdFJlcVNjYW4pCisJCQl0bXBfcnEuc2NhblR5cGUgPSBzY2FuX3JlcS0+c2NhblR5cGUgPworCQkJCWVTSVJfUEFTU0lWRV9TQ0FOIDogc2Nhbl9yZXEtPnNjYW5UeXBlOworCQllbHNlCisJCQl0bXBfcnEuc2NhblR5cGUgPSBlU0lSX1BBU1NJVkVfU0NBTjsKKwkJdG1wX3JxLnJlcXVlc3RUeXBlID0gZUNTUl9TQ0FOX1JFUVVFU1RfMTFEX1NDQU47CisJCXNjYW5fMTFkX2NtZC0+dS5zY2FuQ21kLnJlYXNvbiA9IGVDc3JTY2FuMTFkMTsKKwkJdG1wX3JxLm1heENoblRpbWUgPQorCQkJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1heENoblRpbWU7CisJCXRtcF9ycS5taW5DaG5UaW1lID0KKwkJCW1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNaW5DaG5UaW1lOworCX0gZWxzZSB7CisJCXRtcF9ycS5iY25ScHRSZXFTY2FuID0gc2Nhbl9yZXEtPmJjblJwdFJlcVNjYW47CisJCWlmIChzY2FuX3JlcS0+YmNuUnB0UmVxU2NhbikKKwkJCXRtcF9ycS5zY2FuVHlwZSA9IHNjYW5fcmVxLT5zY2FuVHlwZTsKKwkJZWxzZQorCQkJdG1wX3JxLnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKwkJdG1wX3JxLnJlcXVlc3RUeXBlID0gc2Nhbl9yZXEtPnJlcXVlc3RUeXBlOworCQlzY2FuXzExZF9jbWQtPnUuc2NhbkNtZC5yZWFzb24gPSBzY2FuX2NtZC0+dS5zY2FuQ21kLnJlYXNvbjsKKwkJdG1wX3JxLm1heENoblRpbWUgPSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNYXhDaG5UaW1lOworCQl0bXBfcnEubWluQ2huVGltZSA9IG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1pbkNoblRpbWU7CisJfQorCWlmIChtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5Jbml0aWFsRHdlbGxUaW1lKSB7CisJCXRtcF9ycS5tYXhDaG5UaW1lID0gbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5uSW5pdGlhbER3ZWxsVGltZTsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiMTFkIHNjYW4sIHVwZGF0aW5nIGR3ZWxsIHRpbWUgZm9yIGZpcnN0IHNjYW4gJXUiKSwKKwkJCXRtcF9ycS5tYXhDaG5UaW1lKTsKKwl9CisKKwlzdGF0dXMgPSBjc3Jfc2Nhbl9jb3B5X3JlcXVlc3QobWFjX2N0eCwKKwkJCSZzY2FuXzExZF9jbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LCAmdG1wX3JxKTsKKwkvKiBGcmVlIHRoZSBjaGFubmVsIGxpc3QgKi8KKwljZGZfbWVtX2ZyZWUocENobkluZm8tPkNoYW5uZWxMaXN0KTsKKwlwQ2huSW5mby0+Q2hhbm5lbExpc3QgPSBOVUxMOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiY3NyX3NjYW5fY29weV9yZXF1ZXN0IGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCW1hY19jdHgtPnNjYW4uc2NhblByb2ZpbGUubnVtT2ZDaGFubmVscyA9CisJCXNjYW5fMTFkX2NtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKworCisJc3RhdHVzID0gY3NyX3F1ZXVlX3NtZV9jb21tYW5kKG1hY19jdHgsIHNjYW5fMTFkX2NtZCwgZmFsc2UpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiRmFpbGVkIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZCIpLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitDREZfU1RBVFVTIGNzcl9zY2FuX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3Qgc2Vzc2lvbklkLAorCQkJICAgIHRDc3JTY2FuUmVxdWVzdCAqc2Nhbl9yZXEsCisJCQkgICAgY3NyX3NjYW5fY29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqcENvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0U21lQ21kICpzY2FuX2NtZCA9IE5VTEw7CisJdENzclNjYW5SZXF1ZXN0ICpwVGVtcFNjYW5SZXEgPSBOVUxMOworCXRDc3JDb25maWcgKmNmZ19wcm0gPSAmcE1hYy0+cm9hbS5jb25maWdQYXJhbTsKKworCWlmIChzY2FuX3JlcSA9PSBOVUxMKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoInNjYW5fcmVxIGlzIE5VTEwiKSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyoKKwkgKiBEdXJpbmcgZ3JvdXAgZm9ybWF0aW9uLCB0aGUgUDJQIGNsaWVudCBzY2FucyBmb3IgR08gd2l0aCB0aGUgc3BlY2lmaWMKKwkgKiBTU0lELiBUaGVyZSB3aWxsIGJlIGNoYW5jZXMgb2YgR08gc3dpdGNoaW5nIHRvIG90aGVyIGNoYW5uZWxzIGJlY2F1c2UKKwkgKiBvZiBzY2FuIG9yIHRvIFNUQSBjaGFubmVsIGluIGNhc2Ugb2YgU1RBK0dPIE1DQyBzY2VuYXJpby4gU28gdG8KKwkgKiBpbmNyZWFzZSB0aGUgcG9zc2liaWxpdHkgb2YgY2xpZW50IHRvIGZpbmQgdGhlIEdPLCB0aGUgZHdlbGwgdGltZSBvZgorCSAqIHNjYW4gaXMgaW5jcmVhc2VkIHRvIDEwMG1zLgorCSAqIElmIHRoZSBzY2FuIHJlcXVlc3QgaXMgZm9yIHNwZWNpZmljIFNTSWQgdGhlIGxlbmd0aCBvZiBTU0lEIHdpbGwgYmUKKwkgKiBncmVhdGVyIHRoYW4gNyBhcyBTU0lEIGZvciBwMnAgc2VhcmNoIGNvbnRhaW5zICJESVJFQ1QtIikKKwkgKi8KKwlpZiAoc2Nhbl9yZXEtPnAycFNlYXJjaAorCSAgICAmJiBzY2FuX3JlcS0+U1NJRHMubnVtT2ZTU0lEcworCSAgICAmJiAoTlVMTCAhPSBzY2FuX3JlcS0+U1NJRHMuU1NJRExpc3QpCisJICAgICYmIChzY2FuX3JlcS0+U1NJRHMuU1NJRExpc3QtPlNTSUQubGVuZ3RoID4gRElSRUNUX1NTSURfTEVOKSkgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJQMlA6IEluY3JlYXNpbmcgdGhlIG1pbiBhbmQgbWF4IER3ZWxsIHRpbWUgdG8gJWQgZm9yIHNwZWNpZmljIFNTSUQgc2NhbiAlLipzIiksCisJCQlNQVhfQ0hOX1RJTUVfVE9fRklORF9HTywKKwkJCXNjYW5fcmVxLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5sZW5ndGgsCisJCQlzY2FuX3JlcS0+U1NJRHMuU1NJRExpc3QtPlNTSUQuc3NJZCk7CisJCXNjYW5fcmVxLT5tYXhDaG5UaW1lID0gTUFYX0NITl9USU1FX1RPX0ZJTkRfR087CisJCXNjYW5fcmVxLT5taW5DaG5UaW1lID0gTUlOX0NITl9USU1FX1RPX0ZJTkRfR087CisJfQorCisJaWYgKCFwTWFjLT5zY2FuLmZTY2FuRW5hYmxlKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIlNJZDogJWQgU2Nhbm5pbmcgbm90IGVuYWJsZWQgU2NhbiB0eXBlPSV1LCBudW1PZlNTSURzPSVkIFAyUCBzZWFyY2g9JWQiKSwKKwkJCXNlc3Npb25JZCwgc2Nhbl9yZXEtPnJlcXVlc3RUeXBlLAorCQkJc2Nhbl9yZXEtPlNTSURzLm51bU9mU1NJRHMsCisJCQlzY2FuX3JlcS0+cDJwU2VhcmNoKTsKKwkJZ290byByZWxlYXNlX2NtZDsKKwl9CisKKwlzY2FuX2NtZCA9IGNzcl9nZXRfY29tbWFuZF9idWZmZXIocE1hYyk7CisJaWYgKCFzY2FuX2NtZCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJzY2FuX2NtZCBpcyBOVUxMIikpOworCQlnb3RvIHJlbGVhc2VfY21kOworCX0KKworCWNkZl9tZW1fc2V0KCZzY2FuX2NtZC0+dS5zY2FuQ21kLCBzaXplb2YodFNjYW5DbWQpLCAwKTsKKwlzY2FuX2NtZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kU2NhbjsKKwlzY2FuX2NtZC0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCWlmIChzY2FuX2NtZC0+c2Vzc2lvbklkID49IENTUl9ST0FNX1NFU1NJT05fTUFYKQorCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIFNtZSBTZXNzaW9uSUQ6ICVkIiksIHNlc3Npb25JZCk7CisJc2Nhbl9jbWQtPnUuc2NhbkNtZC5jYWxsYmFjayA9IGNhbGxiYWNrOworCXNjYW5fY21kLT51LnNjYW5DbWQucENvbnRleHQgPSBwQ29udGV4dDsKKwljc3Jfc2V0X3NjYW5fcmVhc29uKHNjYW5fY21kLCBzY2FuX3JlcS0+cmVxdWVzdFR5cGUpOworCWlmIChzY2FuX3JlcS0+bWluQ2huVGltZSA9PSAwICYmIHNjYW5fcmVxLT5tYXhDaG5UaW1lID09IDApIHsKKwkJLyogVGhlIGNhbGxlciBkb2Vzbid0IHNldCB0aGUgdGltZSBjb3JyZWN0bHkuIFNldCBpdCBoZXJlICovCisJCWNzcl9zZXRfZGVmYXVsdF9zY2FuX3RpbWluZyhwTWFjLCBzY2FuX3JlcS0+c2NhblR5cGUsIHNjYW5fcmVxKTsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIlNldHRpbmcgZGVmYXVsdCBtaW4gJWQgYW5kIG1heCAlZCBDaG5UaW1lIiksCisJCQlzY2FuX3JlcS0+bWluQ2huVGltZSwgc2Nhbl9yZXEtPm1heENoblRpbWUpOworCX0KKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorCS8qIE5lZWQgdG8gc2V0IHJlc3RUaW1lIG9ubHkgaWYgYXQgbGVhc3Qgb25lIHNlc3Npb24gaXMgY29ubmVjdGVkICovCisJaWYgKHNjYW5fcmVxLT5yZXN0VGltZSA9PSAwICYmIGNzcl9pc19hbnlfc2Vzc2lvbl9jb25uZWN0ZWQocE1hYykpIHsKKwkJc2Nhbl9yZXEtPnJlc3RUaW1lID0gY2ZnX3BybS0+blJlc3RUaW1lQ29uYzsKKwkJaWYgKHNjYW5fcmVxLT5zY2FuVHlwZSA9PSBlU0lSX0FDVElWRV9TQ0FOKSB7CisJCQlzY2FuX3JlcS0+bWF4Q2huVGltZSA9IGNmZ19wcm0tPm5BY3RpdmVNYXhDaG5UaW1lQ29uYzsKKwkJCXNjYW5fcmVxLT5taW5DaG5UaW1lID0gY2ZnX3BybS0+bkFjdGl2ZU1pbkNoblRpbWVDb25jOworCQl9IGVsc2UgeworCQkJc2Nhbl9yZXEtPm1heENoblRpbWUgPSBjZmdfcHJtLT5uUGFzc2l2ZU1heENoblRpbWVDb25jOworCQkJc2Nhbl9yZXEtPm1pbkNoblRpbWUgPSBjZmdfcHJtLT5uUGFzc2l2ZU1pbkNoblRpbWVDb25jOworCQl9CisJfQorI2VuZGlmCisJLyogSW5jcmVhc2UgZHdlbGwgdGltZSBpbiBjYXNlIFAyUCBTZWFyY2ggYW5kIE1pcmFjYXN0IGlzIG5vdCBwcmVzZW50ICovCisJaWYgKHNjYW5fcmVxLT5wMnBTZWFyY2ggJiYgc2Nhbl9yZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMKKwkgICAgPT0gUDJQX1NPQ0lBTF9DSEFOTkVMUyAmJiAoIShwTWFjLT5zbWUubWlyYWNhc3RfdmFsdWUpKSkgeworCQlzY2FuX3JlcS0+bWF4Q2huVGltZSArPSBQMlBfU0VBUkNIX0RXRUxMX1RJTUVfSU5DUkVBU0U7CisJfQorCXNjYW5fY21kLT51LnNjYW5DbWQuc2NhbklEID0gc2Nhbl9yZXEtPnNjYW5faWQ7CisJLyoKKwkgKiBJZiBpdCBpcyB0aGUgZmlyc3Qgc2NhbiByZXF1ZXN0IGZyb20gSERELCBDU1IgY2hlY2tzIGlmIGl0IGlzIGZvciAxMWQKKwkgKiBJZiBpdCBpcyBub3QsIENTUiB3aWxsIHNhdmUgdGhlIHNjYW4gcmVxdWVzdCBpbiB0aGUgcGVuZGluZyBjbWQgcXVldWUKKwkgKiAmIGlzc3VlIGFuIDExZCBzY2FuIHJlcXVlc3QgdG8gUEUuCisJICovCisJc3RhdHVzID0gY3NyX2lzc3VlXzExZF9zY2FuKHBNYWMsIHNjYW5fY21kLCBzY2FuX3JlcSwgc2Vzc2lvbklkKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJZ290byByZWxlYXNlX2NtZDsKKworCS8qCisJICogU2NhbiBvbmx5IDJHIENoYW5uZWxzIGlmIHNldCBpbiBpbmkgZmlsZS4gVGhpcyBpcyBtYWlubHkgdG8gcmVkdWNlCisJICogdGhlIEZpcnN0IFNjYW4gZHVyYXRpb24gb25jZSB3ZSB0dXJuIG9uIFdpZmkKKwkgKi8KKwlpZiAocE1hYy0+c2Nhbi5mRmlyc3RTY2FuT25seTJHQ2hubAorCSAgICAmJiBmYWxzZSA9PSBwTWFjLT5maXJzdF9zY2FuX2RvbmUpIHsKKwkJY3NyX3NjYW5fMmdfb25seV9yZXF1ZXN0KHBNYWMsIHNjYW5fY21kLCBzY2FuX3JlcSk7CisJCXBNYWMtPmZpcnN0X3NjYW5fZG9uZSA9IHRydWU7CisJfQorCisKKwlpZiAoY2ZnX3BybS0+bkluaXRpYWxEd2VsbFRpbWUpIHsKKwkJc2Nhbl9yZXEtPm1heENoblRpbWUgPSBjZmdfcHJtLT5uSW5pdGlhbER3ZWxsVGltZTsKKwkJY2ZnX3BybS0+bkluaXRpYWxEd2VsbFRpbWUgPSAwOworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJ1cGRhdGluZyBkd2VsbCB0aW1lIGZvciBmaXJzdCBzY2FuICV1IiksCisJCQlzY2FuX3JlcS0+bWF4Q2huVGltZSk7CisJfQorCisJc3RhdHVzID0gY3NyX3NjYW5fY29weV9yZXF1ZXN0KHBNYWMsICZzY2FuX2NtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QsCisJCQkJICAgICAgIHNjYW5fcmVxKTsKKwkvKgorCSAqIFJlc2V0IHRoZSB2YXJpYWJsZSBhZnRlciB0aGUgZmlyc3Qgc2NhbiBpcyAgcXVldWVkIGFmdGVyIGxvYWRpbmcgdGhlCisJICogZHJpdmVyLiBUaGUgcHVycG9zZSBvZiB0aGlzIHBhcmFtZXRlciBpcyB0aGF0IERGUyBjaGFubmVscyBhcmUKKwkgKiBza2lwcGVkIGR1cmluZyB0aGUgZmlyc3Qgc2NhbiBhZnRlciBsb2FkaW5nIHRoZSBkcml2ZXIuIFRoZSBhYm92ZSBBUEkKKwkgKiBidWlsZHMgdGhlIHRhcmdldCBzY2FuIHJlcXVlc3QgaW4gd2hpY2ggdGhpcyB2YXJpYWJsZSBpcyB1c2VkLgorCSAqLworCWNmZ19wcm0tPmluaXRpYWxfc2Nhbl9ub19kZnNfY2hubCA9IDA7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiZmFpbCB0byBjb3B5IHJlcXVlc3Qgc3RhdHVzID0gJWQiKSwgc3RhdHVzKTsKKwkJZ290byByZWxlYXNlX2NtZDsKKwl9CisKKwlwVGVtcFNjYW5SZXEgPSAmc2Nhbl9jbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0OworCXBNYWMtPnNjYW4uc2NhblByb2ZpbGUubnVtT2ZDaGFubmVscyA9CisJCXBUZW1wU2NhblJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKwlzdGF0dXMgPSBjZGZfbWNfdGltZXJfaW5pdCgmc2Nhbl9jbWQtPnUuc2NhbkNtZC5jc3Jfc2Nhbl90aW1lciwKKwkJCQlDREZfVElNRVJfVFlQRV9TVywKKwkJCQljc3Jfc2Nhbl9hY3RpdmVfbGlzdF90aW1lb3V0X2hhbmRsZSwgc2Nhbl9jbWQpOworCXNtc19sb2cocE1hYywgTE9HMSwKKwkJRkwoIlNJZD0lZCBzY2FuSWQ9JWQgU2NhbiByZWFzb249JXUgbnVtU1NJRHM9JWQgbnVtQ2hhbj0lZCBQMlAgc2VhcmNoPSVkIG1pbkNUPSVkIG1heENUPSVkIHVJRUZpZWxkTGVuPSVkIiksCisJCXNlc3Npb25JZCwgc2Nhbl9jbWQtPnUuc2NhbkNtZC5zY2FuSUQsCisJCXNjYW5fY21kLT51LnNjYW5DbWQucmVhc29uLCBwVGVtcFNjYW5SZXEtPlNTSURzLm51bU9mU1NJRHMsCisJCXBUZW1wU2NhblJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscywKKwkJcFRlbXBTY2FuUmVxLT5wMnBTZWFyY2gsIHBUZW1wU2NhblJlcS0+bWluQ2huVGltZSwKKwkJcFRlbXBTY2FuUmVxLT5tYXhDaG5UaW1lLCBwVGVtcFNjYW5SZXEtPnVJRUZpZWxkTGVuKTsKKworCXN0YXR1cyA9IGNzcl9xdWV1ZV9zbWVfY29tbWFuZChwTWFjLCBzY2FuX2NtZCwgZmFsc2UpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoImZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkIiksIHN0YXR1cyk7CisJfQorCityZWxlYXNlX2NtZDoKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICYmIHNjYW5fY21kKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiBTSWQ6ICVkIEZhaWxlZCB3aXRoIHN0YXR1cz0lZCIKKwkJCQkgICAgICAgIiBTY2FuIHJlYXNvbj0ldSBudW1PZlNTSURzPSVkIgorCQkJCSAgICAgICAiIFAyUCBzZWFyY2g9JWQgc2NhbklkPSVkIiksCisJCQlzZXNzaW9uSWQsIHN0YXR1cywgc2Nhbl9jbWQtPnUuc2NhbkNtZC5yZWFzb24sCisJCQlzY2FuX3JlcS0+U1NJRHMubnVtT2ZTU0lEcywgc2Nhbl9yZXEtPnAycFNlYXJjaCwKKwkJCXNjYW5fY21kLT51LnNjYW5DbWQuc2NhbklEKTsKKwkJY3NyX3JlbGVhc2VfY29tbWFuZF9zY2FuKHBNYWMsIHNjYW5fY21kKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9pc3N1ZV9yb2FtX2FmdGVyX2xvc3RsaW5rX3NjYW4odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgICBlQ3NyUm9hbVJlYXNvbiByZWFzb24pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0U2NhblJlc3VsdEhhbmRsZSBoQlNTTGlzdCA9IE5VTEw7CisJdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyID0gTlVMTDsKKwl1aW50MzJfdCByb2FtSWQgPSAwOworCXRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUgPSBOVUxMOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIkVudHJ5IikpOworCWlmIChwU2Vzc2lvbi0+ZkNhbmNlbFJvYW1pbmcpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgibG9zdCBsaW5rIHJvYW1pbmcgY2FuY2VsZWQiKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJZ290byBmcmVlX2ZpbHRlcjsKKwl9CisJLyogSGVyZSBpcyB0aGUgcHJvZmlsZSB3ZSBuZWVkIHRvIGNvbm5lY3QgdG8gKi8KKwlwU2NhbkZpbHRlciA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0Q3NyU2NhblJlc3VsdEZpbHRlcikpOworCWlmIChOVUxMID09IHBTY2FuRmlsdGVyKSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZ290byBmcmVlX2ZpbHRlcjsKKwl9CisJY2RmX21lbV9zZXQocFNjYW5GaWx0ZXIsIHNpemVvZih0Q3NyU2NhblJlc3VsdEZpbHRlciksIDApOworCWlmIChOVUxMID09IHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpIHsKKwkJcFNjYW5GaWx0ZXItPkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCQlwU2NhbkZpbHRlci0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPQorCQkJZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBoYXZlIHRvIG1ha2UgYSBjb3B5IG9mIHBDdXJSb2FtUHJvZmlsZSBiZWNhdXNlIGl0IHdpbGwKKwkJICogYmUgZnJlZSBpbnNpZGUgY3NyX3JvYW1faXNzdWVfY29ubmVjdAorCQkgKi8KKwkJcFByb2ZpbGUgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclJvYW1Qcm9maWxlKSk7CisJCWlmIChOVUxMID09IHBQcm9maWxlKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCQlnb3RvIGZyZWVfZmlsdGVyOworCQl9CisJCWNkZl9tZW1fc2V0KHBQcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSwgMCk7CisJCXN0YXR1cyA9IGNzcl9yb2FtX2NvcHlfcHJvZmlsZShwTWFjLCBwUHJvZmlsZSwKKwkJCQkJICAgICAgIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJZ290byBmcmVlX2ZpbHRlcjsKKwkJc3RhdHVzID0gY3NyX3JvYW1fcHJlcGFyZV9maWx0ZXJfZnJvbV9wcm9maWxlKHBNYWMsIHBQcm9maWxlLAorCQkJCQkJCSAgICAgIHBTY2FuRmlsdGVyKTsKKwl9IC8qIFdlIGhhdmUgYSBwcm9maWxlICovCisJcm9hbUlkID0gR0VUX05FWFRfUk9BTV9JRCgmcE1hYy0+cm9hbSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJZ290byBmcmVlX2ZpbHRlcjsKKworCXN0YXR1cyA9IGNzcl9zY2FuX2dldF9yZXN1bHQocE1hYywgcFNjYW5GaWx0ZXIsICZoQlNTTGlzdCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJZ290byBmcmVlX2ZpbHRlcjsKKworCWlmIChlQ3NyTG9zdExpbmsxID09IHJlYXNvbikgeworCQkvKiBpZiBwb3NzaWJsZSBwdXQgdGhlIGxhc3QgY29ubmVjdGVkIEJTUyBpbiBiZWdpbm5pbmcgKi8KKwkJY3NyX21vdmVfYnNzX3RvX2hlYWRfZnJvbV9ic3NpZChwTWFjLAorCQkJCSZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCwgaEJTU0xpc3QpOworCX0KKwlzdGF0dXMgPSBjc3Jfcm9hbV9pc3N1ZV9jb25uZWN0KHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIGhCU1NMaXN0LAorCQkJCQlyZWFzb24sIHJvYW1JZCwgdHJ1ZSwgdHJ1ZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljc3Jfc2Nhbl9yZXN1bHRfcHVyZ2UocE1hYywgaEJTU0xpc3QpOworCX0KKworZnJlZV9maWx0ZXI6CisJaWYgKHBTY2FuRmlsdGVyKSB7CisJCS8qIHdlIG5lZWQgdG8gZnJlZSBtZW1vcnkgZm9yIGZpbHRlciBpZiBwcm9maWxlIGV4aXN0cyAqLworCQljc3JfZnJlZV9zY2FuX2ZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisJCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlcik7CisJfQorCWlmIChOVUxMICE9IHBQcm9maWxlKSB7CisJCWNzcl9yZWxlYXNlX3Byb2ZpbGUocE1hYywgcFByb2ZpbGUpOworCQljZGZfbWVtX2ZyZWUocFByb2ZpbGUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9zY2FuX2hhbmRsZV9mYWlsZWRfbG9zdGxpbmsxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXNtc19sb2cocE1hYywgTE9HVywgIkxvc3QgbGluayBzY2FuIDEgZmFpbGVkIik7CisJaWYgKHBTZXNzaW9uLT5mQ2FuY2VsUm9hbWluZykKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCWlmICghcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkKKwkJcmV0dXJuIGNzcl9zY2FuX3JlcXVlc3RfbG9zdF9saW5rMyhwTWFjLCBzZXNzaW9uSWQpOworCS8qCisJICogV2UgZmFpbCBsb3N0bGluazEgYnV0IHRoZXJlIG1heSBiZSBvdGhlciBCU1MgaW4gdGhlIGNhY2hlZCByZXN1bHQKKwkgKiBmaXQgdGhlIHByb2ZpbGUuIEdpdmUgaXQgYSB0cnkgZmlyc3QKKwkgKi8KKwlpZiAocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcyA9PSAwIHx8CisJICAgIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMgPiAxKQorCQkvKiB0cnkgbG9zdGxpbmsgc2NhbjIgKi8KKwkJcmV0dXJuIGNzcl9zY2FuX3JlcXVlc3RfbG9zdF9saW5rMihwTWFjLCBzZXNzaW9uSWQpOworCWlmICghcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QKKwkgICAgfHwgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbMF0gPT0gMCkgeworCQkvKiBnbyBzdHJhaWdodCB0byBsb3N0bGluayBzY2FuMyAqLworCQlyZXR1cm4gY3NyX3NjYW5fcmVxdWVzdF9sb3N0X2xpbmszKHBNYWMsIHNlc3Npb25JZCk7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NjYW5faGFuZGxlX2ZhaWxlZF9sb3N0bGluazIodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoInNlc3Npb24gJWQgbm90IGZvdW5kIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlzbXNfbG9nKHBNYWMsIExPR1csICJMb3N0IGxpbmsgc2NhbiAyIGZhaWxlZCIpOworCWlmIChwU2Vzc2lvbi0+ZkNhbmNlbFJvYW1pbmcpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWlmICghcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZQorCSAgICB8fCAhcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QKKwkgICAgfHwgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbMF0gPT0gMCkgeworCQkvKiB0cnkgbG9zdGxpbmsgc2NhbjMgKi8KKwkJcmV0dXJuIGNzcl9zY2FuX3JlcXVlc3RfbG9zdF9saW5rMyhwTWFjLCBzZXNzaW9uSWQpOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NjYW5faGFuZGxlX2ZhaWxlZF9sb3N0bGluazModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlzbXNfbG9nKHBNYWMsIExPR1csICJMb3N0IGxpbmsgc2NhbiAzIGZhaWxlZCIpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTCitjc3JfdXBkYXRlX2xvc3RfbGluazFfY21kKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRTbWVDbWQgKmNtZCwKKwkJCSAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiwgdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwl1aW50OF90IGksIG51bV9jaCA9IDA7CisJdFNjYW5SZXN1bHRIYW5kbGUgYnNzX2xzdCA9IE5VTEw7CisJdENzclNjYW5SZXN1bHRJbmZvICpzY2FuX3Jlc3VsdCA9IE5VTEw7CisJdENzclNjYW5SZXN1bHRGaWx0ZXIgKnNjYW5fZmlsdGVyID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyU1NJRHMgKnNzaWRfbGlzdCA9ICZjbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LlNTSURzOworCXRDc3JDaGFubmVsSW5mbyAqY2hfaW5mbyA9ICZjbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvOworCisJY21kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRTY2FuOworCWNtZC0+c2Vzc2lvbklkID0gKHVpbnQ4X3QpIHNlc3Npb25faWQ7CisJY21kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW5Mb3N0TGluazE7CisJY21kLT51LnNjYW5DbWQuY2FsbGJhY2sgPSBOVUxMOworCWNtZC0+dS5zY2FuQ21kLnBDb250ZXh0ID0gTlVMTDsKKwljbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1heENoblRpbWUgPQorCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNYXhDaG5UaW1lOworCWNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QubWluQ2huVGltZSA9CisJCW1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1pbkNoblRpbWU7CisJY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5zY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisJd21hX2dldF9zY2FuX2lkKCZjbWQtPnUuc2NhbkNtZC5zY2FuSUQpOworCXN0YXR1cyA9IGNkZl9tY190aW1lcl9pbml0KCZjbWQtPnUuc2NhbkNtZC5jc3Jfc2Nhbl90aW1lciwKKwkJCUNERl9USU1FUl9UWVBFX1NXLAorCQkJY3NyX3NjYW5fYWN0aXZlX2xpc3RfdGltZW91dF9oYW5kbGUsICZjbWQpOworCWNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3Quc2Nhbl9pZCA9CisJCWNtZC0+dS5zY2FuQ21kLnNjYW5JRDsKKworCWlmIChwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5TU0lELmxlbmd0aCkgeworCQkvKgorCQkgKiBvbiBlcnJvcjogZm9sbG93aW5nIG1lbW9yeSB3aWxsIGJlIHJlbGVhc2VkIGJ5IGNhbGwgdG8KKwkJICogY3NyX3JlbGVhc2VfY29tbWFuZF9zY2FuIGluIHRoZSBlbmQKKwkJICovCisJCXNzaWRfbGlzdC0+U1NJRExpc3QgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclNTSURJbmZvKSk7CisJCWlmIChOVUxMID09IHNzaWRfbGlzdC0+U1NJRExpc3QpCisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQlzc2lkX2xpc3QtPm51bU9mU1NJRHMgPSAxOworCQljZGZfbWVtX2NvcHkoJnNzaWRfbGlzdC0+U1NJRExpc3RbMF0uU1NJRCwKKwkJCSAgICAgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLlNTSUQsCisJCQkgICAgIHNpemVvZih0U2lyTWFjU1NpZCkpOworCX0gZWxzZSB7CisJCXNzaWRfbGlzdC0+bnVtT2ZTU0lEcyA9IDA7CisJfQorCisJaWYgKCFwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc2Nhbl9maWx0ZXIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKwlpZiAoTlVMTCA9PSBzY2FuX2ZpbHRlcikKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKworCWNkZl9tZW1fc2V0KHNjYW5fZmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpLCAwKTsKKwlzdGF0dXMgPSBjc3Jfcm9hbV9wcmVwYXJlX2ZpbHRlcl9mcm9tX3Byb2ZpbGUobWFjX2N0eCwKKwkJCXBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUsIHNjYW5fZmlsdGVyKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlnb3RvIGZyZWVfbG9zdF9saW5rMV9sb2NhbF9tZW07CisKKwlpZiAoIShDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY3NyX3NjYW5fZ2V0X3Jlc3VsdChtYWNfY3R4LCBzY2FuX2ZpbHRlciwKKwkJJmJzc19sc3QpKSAmJiBic3NfbHN0KSkgeworCQlpZiAoY3NyX3JvYW1faXNfY2hhbm5lbF92YWxpZChtYWNfY3R4LAorCQkJcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUub3BlcmF0aW9uQ2hhbm5lbCkpIHsKKwkJCWNoX2luZm8tPkNoYW5uZWxMaXN0ID0gY2RmX21lbV9tYWxsb2MoMSk7CisJCQlpZiAoTlVMTCA9PSBjaF9pbmZvLT5DaGFubmVsTGlzdCkgeworCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCQlnb3RvIGZyZWVfbG9zdF9saW5rMV9sb2NhbF9tZW07CisJCQl9CisJCQljaF9pbmZvLT5DaGFubmVsTGlzdFswXSA9CisJCQkJcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUub3BlcmF0aW9uQ2hhbm5lbDsKKwkJCWNoX2luZm8tPm51bU9mQ2hhbm5lbHMgPSAxOworCQl9CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogb24gZXJyb3I6IHRoaXMgbWVtIHdpbGwgYmUgcmVsZWFzZWQgYnkgY3NyX3JlbGVhc2VfY29tbWFuZF9zY2FuICovCisJY2hfaW5mby0+Q2hhbm5lbExpc3QgPSBjZGZfbWVtX21hbGxvYyhXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pOworCWlmIChOVUxMID09IGNoX2luZm8tPkNoYW5uZWxMaXN0KSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZ290byBmcmVlX2xvc3RfbGluazFfbG9jYWxfbWVtOworCX0KKworCXNjYW5fcmVzdWx0ID0gY3NyX3NjYW5fcmVzdWx0X2dldF9uZXh0KG1hY19jdHgsIGJzc19sc3QpOworCXdoaWxlIChzY2FuX3Jlc3VsdCAhPSBOVUxMICYmIG51bV9jaCA8IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTikgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoOyBpKyspIHsKKwkJCWlmIChjaF9pbmZvLT5DaGFubmVsTGlzdFtpXSA9PQorCQkJCXNjYW5fcmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBudW1fY2gpCisJCQljaF9pbmZvLT5DaGFubmVsTGlzdFtudW1fY2grK10gPQorCQkJCXNjYW5fcmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZDsKKwkJc2Nhbl9yZXN1bHQgPSBjc3Jfc2Nhbl9yZXN1bHRfZ2V0X25leHQobWFjX2N0eCwgYnNzX2xzdCk7CisJfQorCS8qIEluY2x1ZGUgdGhlIGxhc3QgY29ubmVjdGVkIEJTUycgY2hhbm5lbCAqLworCWlmIChjc3Jfcm9hbV9pc19jaGFubmVsX3ZhbGlkKG1hY19jdHgsCisJCXBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWwpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fY2g7IGkrKykgeworCQkJaWYgKGNoX2luZm8tPkNoYW5uZWxMaXN0W2ldID09CisJCQkJcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUub3BlcmF0aW9uQ2hhbm5lbCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBudW1fY2gpCisJCQljaF9pbmZvLT5DaGFubmVsTGlzdFtudW1fY2grK10gPQorCQkJCXBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWw7CisJfQorCWNoX2luZm8tPm51bU9mQ2hhbm5lbHMgPSBudW1fY2g7CitmcmVlX2xvc3RfbGluazFfbG9jYWxfbWVtOgorCWlmIChzY2FuX2ZpbHRlcikgeworCQljc3JfZnJlZV9zY2FuX2ZpbHRlcihtYWNfY3R4LCBzY2FuX2ZpbHRlcik7CisJCWNkZl9tZW1fZnJlZShzY2FuX2ZpbHRlcik7CisJfQorCWlmIChic3NfbHN0KQorCQljc3Jfc2Nhbl9yZXN1bHRfcHVyZ2UobWFjX2N0eCwgYnNzX2xzdCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3Jfc2Nhbl9yZXF1ZXN0X2xvc3RfbGluazEoKSAtIHN0YXJ0IHNjYW4gb24gbGluayBsb3N0IDEKKyAqIEBtYWNfY3R4OiAgICAgICBtYWMgZ2xvYmFsIGNvbnRleHQKKyAqIEBzZXNzaW9uX2lkOiAgICBzZXNzaW9uIGlkCisgKgorICogTG9zdGxpbmsxIHNjYW4gaXMgdG8gYWN0aXZlbHkgc2NhbiB0aGUgbGFzdCBjb25uZWN0ZWQgcHJvZmlsZSdzIFNTSUQgb24gYWxsCisgKiBtYXRjaGVkIEJTUyBjaGFubmVscy4gSWYgbm8gcm9hbSBwcm9maWxlIChpdCBzaG91bGQgbm90KSwgaXQgaXMgbGlrZQorICogbG9zdGxpbmtzY2FuMworICoKKyAqIFJldHVybjogc3RhdHVzIG9mIG9wZXJhdGlvbgorICovCitDREZfU1RBVFVTCitjc3Jfc2Nhbl9yZXF1ZXN0X2xvc3RfbGluazEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U21lQ21kICpjbWQgPSBOVUxMOworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKworCWlmICghc2Vzc2lvbikgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uX2lkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXNtc19sb2cobWFjX2N0eCwgTE9HVywgRkwoIkVudHJ5IikpOworCWNtZCA9IGNzcl9nZXRfY29tbWFuZF9idWZmZXIobWFjX2N0eCk7CisJaWYgKCFjbWQpIHsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwkJZ290byByZWxlYXNlX2xvc3RfbGluazFfY21kOworCX0KKwljZGZfbWVtX3NldCgmY21kLT51LnNjYW5DbWQsIHNpemVvZih0U2NhbkNtZCksIDApOworCXN0YXR1cyA9IGNzcl91cGRhdGVfbG9zdF9saW5rMV9jbWQobWFjX2N0eCwgY21kLCBzZXNzaW9uLCBzZXNzaW9uX2lkKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlnb3RvIHJlbGVhc2VfbG9zdF9saW5rMV9jbWQ7CisKKwljZGZfbWVtX3NldCgmY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5ic3NpZCwKKwkJICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSwgMHhGRik7CisJc3RhdHVzID0gY3NyX3F1ZXVlX3NtZV9jb21tYW5kKG1hY19jdHgsIGNtZCwgZmFsc2UpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoImZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkIiksIHN0YXR1cyk7CisJfQorCityZWxlYXNlX2xvc3RfbGluazFfY21kOgorCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiZmFpbGVkIHdpdGggc3RhdHVzICVkIiksIHN0YXR1cyk7CisJCWlmIChjbWQpCisJCQljc3JfcmVsZWFzZV9jb21tYW5kX3NjYW4obWFjX2N0eCwgY21kKTsKKwkJc3RhdHVzID0gY3NyX3NjYW5faGFuZGxlX2ZhaWxlZF9sb3N0bGluazEobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTCitjc3JfdXBkYXRlX2xvc3RfbGluazJfY21kKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHRTbWVDbWQgKmNtZCwKKwkJCSAgdWludDMyX3Qgc2Vzc2lvbl9pZCwgdENzclJvYW1TZXNzaW9uICpzZXNzaW9uKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVpbnQ4X3QgaSwgbnVtX2NoID0gMDsKKwl0U2NhblJlc3VsdEhhbmRsZSBic3NfbHN0ID0gTlVMTDsKKwl0Q3NyU2NhblJlc3VsdEluZm8gKnNjYW5fcmVzdWx0ID0gTlVMTDsKKwl0Q3NyU2NhblJlc3VsdEZpbHRlciAqc2Nhbl9mbHRyID0gTlVMTDsKKwl0Q3NyQ2hhbm5lbEluZm8gKmNoX2luZm8gPSAmY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mbzsKKworCWNtZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kU2NhbjsKKwljbWQtPnNlc3Npb25JZCA9ICh1aW50OF90KSBzZXNzaW9uX2lkOworCWNtZC0+dS5zY2FuQ21kLnJlYXNvbiA9IGVDc3JTY2FuTG9zdExpbmsyOworCWNtZC0+dS5zY2FuQ21kLmNhbGxiYWNrID0gTlVMTDsKKwljbWQtPnUuc2NhbkNtZC5wQ29udGV4dCA9IE5VTEw7CisJY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5tYXhDaG5UaW1lID0KKwkJbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWF4Q2huVGltZTsKKwljbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1pbkNoblRpbWUgPQorCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNaW5DaG5UaW1lOworCWNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3Quc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworCXdtYV9nZXRfc2Nhbl9pZCgmY21kLT51LnNjYW5DbWQuc2NhbklEKTsKKwljbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LnNjYW5faWQgPQorCQljbWQtPnUuc2NhbkNtZC5zY2FuSUQ7CisJaWYgKCFzZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJc3RhdHVzID0gY2RmX21jX3RpbWVyX2luaXQoJmNtZC0+dS5zY2FuQ21kLmNzcl9zY2FuX3RpbWVyLAorCQkJQ0RGX1RJTUVSX1RZUEVfU1csCisJCQljc3Jfc2Nhbl9hY3RpdmVfbGlzdF90aW1lb3V0X2hhbmRsZSwgJmNtZCk7CisJc2Nhbl9mbHRyID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisJaWYgKE5VTEwgPT0gc2Nhbl9mbHRyKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCisJY2RmX21lbV9zZXQoc2Nhbl9mbHRyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpLCAwKTsKKwlzdGF0dXMgPSBjc3Jfcm9hbV9wcmVwYXJlX2ZpbHRlcl9mcm9tX3Byb2ZpbGUobWFjX2N0eCwKKwkJCQlzZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUsIHNjYW5fZmx0cik7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJZ290byBmcmVlX2xvc3RfbGluazJfbG9jYWxfbWVtOworCisJc3RhdHVzID0gY3NyX3NjYW5fZ2V0X3Jlc3VsdChtYWNfY3R4LCBzY2FuX2ZsdHIsICZic3NfbHN0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlnb3RvIGZyZWVfbG9zdF9saW5rMl9sb2NhbF9tZW07CisKKwlpZiAoIWJzc19sc3QpCisJCWdvdG8gZnJlZV9sb3N0X2xpbmsyX2xvY2FsX21lbTsKKworCWNoX2luZm8tPkNoYW5uZWxMaXN0ID0gY2RmX21lbV9tYWxsb2MoV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOKTsKKwlpZiAoTlVMTCA9PSBjaF9pbmZvLT5DaGFubmVsTGlzdCkgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gZnJlZV9sb3N0X2xpbmsyX2xvY2FsX21lbTsKKwl9CisJc2Nhbl9yZXN1bHQgPSBjc3Jfc2Nhbl9yZXN1bHRfZ2V0X25leHQobWFjX2N0eCwgYnNzX2xzdCk7CisJd2hpbGUgKHNjYW5fcmVzdWx0ICE9IE5VTEwgJiYgbnVtX2NoIDwgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fY2g7IGkrKykgeworCQkJaWYgKGNoX2luZm8tPkNoYW5uZWxMaXN0W2ldID09CisJCQkJc2Nhbl9yZXN1bHQtPkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID09IG51bV9jaCkKKwkJCWNoX2luZm8tPkNoYW5uZWxMaXN0W251bV9jaCsrXSA9CisJCQkJc2Nhbl9yZXN1bHQtPkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkOworCQlzY2FuX3Jlc3VsdCA9IGNzcl9zY2FuX3Jlc3VsdF9nZXRfbmV4dChtYWNfY3R4LCBic3NfbHN0KTsKKwl9CisJY2hfaW5mby0+bnVtT2ZDaGFubmVscyA9IG51bV9jaDsKKworZnJlZV9sb3N0X2xpbmsyX2xvY2FsX21lbToKKwlpZiAoc2Nhbl9mbHRyKSB7CisJCWNzcl9mcmVlX3NjYW5fZmlsdGVyKG1hY19jdHgsIHNjYW5fZmx0cik7CisJCWNkZl9tZW1fZnJlZShzY2FuX2ZsdHIpOworCX0KKwlpZiAoYnNzX2xzdCkKKwkJY3NyX3NjYW5fcmVzdWx0X3B1cmdlKG1hY19jdHgsIGJzc19sc3QpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY3NyX3NjYW5fcmVxdWVzdF9sb3N0X2xpbmsyKCkgLSBzdGFydCBzY2FuIG9uIGxpbmsgbG9zdCAyCisgKiBAbWFjX2N0eDogICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAc2Vzc2lvbl9pZDogICAgc2Vzc2lvbiBpZAorICoKKyAqIExvc3RsaW5rMiBzY2FuIGlzIHRvIGFjdGl2ZWx5IHNjYW4gdGhlIGFsbCBTU0lEcyBvZiB0aGUgbGFzdCByb2FtaW5nCisgKiBwcm9maWxlJ3Mgb24gYWxsIG1hdGNoZWQgQlNTIGNoYW5uZWxzLiBTaW5jZSBNQUMgZG9lc24ndCBzdXBwb3J0IG11bHRpcGxlCisgKiBTU0lELCB3ZSBzY2FuIGFsbCBTU0lEcyBhbmQgZmlsdGVyIHRoZW0gYWZ0ZXJ3YXJkcworICoKKyAqIFJldHVybjogc3RhdHVzIG9mIG9wZXJhdGlvbgorICovCitDREZfU1RBVFVTCitjc3Jfc2Nhbl9yZXF1ZXN0X2xvc3RfbGluazIodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U21lQ21kICpjbWQgPSBOVUxMOworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKworCWlmICghc2Vzc2lvbikgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uX2lkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXNtc19sb2cobWFjX2N0eCwgTE9HVywgRkwoIiBjYWxsZWQiKSk7CisJY21kID0gY3NyX2dldF9jb21tYW5kX2J1ZmZlcihtYWNfY3R4KTsKKwlpZiAoIWNtZCkgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfUkVTT1VSQ0VTOworCQlnb3RvIHJlbGVhc2VfbG9zdF9saW5rMl9jbWQ7CisJfQorCWNkZl9tZW1fc2V0KCZjbWQtPnUuc2NhbkNtZCwgc2l6ZW9mKHRTY2FuQ21kKSwgMCk7CisJc3RhdHVzID0gY3NyX3VwZGF0ZV9sb3N0X2xpbmsyX2NtZChtYWNfY3R4LCBjbWQsIHNlc3Npb25faWQsIHNlc3Npb24pOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCWdvdG8gcmVsZWFzZV9sb3N0X2xpbmsyX2NtZDsKKworCWNkZl9tZW1fc2V0KCZjbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LmJzc2lkLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpLCAweEZGKTsKKwkvKiBQdXQgdG8gdGhlIGhlYWQgaW4gcGVuZGluZyBxdWV1ZSAqLworCXN0YXR1cyA9IGNzcl9xdWV1ZV9zbWVfY29tbWFuZChtYWNfY3R4LCBjbWQsIHRydWUpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoImZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkIiksIHN0YXR1cyk7CisJCWdvdG8gcmVsZWFzZV9sb3N0X2xpbmsyX2NtZDsKKwl9CisKK3JlbGVhc2VfbG9zdF9saW5rMl9jbWQ6CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR1csIEZMKCJmYWlsZWQgd2l0aCBzdGF0dXMgJWQiKSwgc3RhdHVzKTsKKwkJaWYgKGNtZCkKKwkJCWNzcl9yZWxlYXNlX2NvbW1hbmRfc2NhbihtYWNfY3R4LCBjbWQpOworCQlzdGF0dXMgPSBjc3Jfc2Nhbl9oYW5kbGVfZmFpbGVkX2xvc3RsaW5rMihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3Jfc2Nhbl9yZXF1ZXN0X2xvc3RfbGluazMoKSAtIFRvIGFjdGl2ZWx5IHNjYW4gYWxsIHZhbGlkIGNoYW5uZWxzCisgKiBAbWFjX2N0eDogICAgICAgbWFjIGdsb2JhbCBjb250ZXh0CisgKiBAc2Vzc2lvbl9pZDogICAgc2Vzc2lvbiBpZAorICoKKyAqIFJldHVybjogc3RhdHVzIG9mIG9wZXJhdGlvbgorICovCitDREZfU1RBVFVTCitjc3Jfc2Nhbl9yZXF1ZXN0X2xvc3RfbGluazModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U21lQ21kICpjbWQ7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPR1csIEZMKCIgY2FsbGVkIikpOworCWRvIHsKKwkJY21kID0gY3NyX2dldF9jb21tYW5kX2J1ZmZlcihtYWNfY3R4KTsKKwkJaWYgKCFjbWQpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJCQlicmVhazsKKwkJfQorCQljZGZfbWVtX3NldCgmY21kLT51LnNjYW5DbWQsIHNpemVvZih0U2NhbkNtZCksIDApOworCQljbWQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFNjYW47CisJCWNtZC0+c2Vzc2lvbklkID0gKHVpbnQ4X3QpIHNlc3Npb25faWQ7CisJCWNtZC0+dS5zY2FuQ21kLnJlYXNvbiA9IGVDc3JTY2FuTG9zdExpbmszOworCQljbWQtPnUuc2NhbkNtZC5jYWxsYmFjayA9IE5VTEw7CisJCWNtZC0+dS5zY2FuQ21kLnBDb250ZXh0ID0gTlVMTDsKKwkJY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5tYXhDaG5UaW1lID0KKwkJCW1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1heENoblRpbWU7CisJCWNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QubWluQ2huVGltZSA9CisJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNaW5DaG5UaW1lOworCQljbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKwkJd21hX2dldF9zY2FuX2lkKCZjbWQtPnUuc2NhbkNtZC5zY2FuSUQpOworCQlzdGF0dXMgPSBjZGZfbWNfdGltZXJfaW5pdCgmY21kLT51LnNjYW5DbWQuY3NyX3NjYW5fdGltZXIsCisJCQlDREZfVElNRVJfVFlQRV9TVywKKwkJCWNzcl9zY2FuX2FjdGl2ZV9saXN0X3RpbWVvdXRfaGFuZGxlLCAmY21kKTsKKwkJY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5zY2FuX2lkID0KKwkJCWNtZC0+dS5zY2FuQ21kLnNjYW5JRDsKKwkJY2RmX3NldF9tYWNhZGRyX2Jyb2FkY2FzdCgmY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5ic3NpZCk7CisJCS8qIFB1dCB0byB0aGUgaGVhZCBvZiBwZW5kaW5nIHF1ZXVlICovCisJCXN0YXR1cyA9IGNzcl9xdWV1ZV9zbWVfY29tbWFuZChtYWNfY3R4LCBjbWQsIHRydWUpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJRkwoImZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkIiksIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDApOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLCBGTCgiZmFpbGVkIHdpdGggc3RhdHVzICVkIiksIHN0YXR1cyk7CisJCWlmIChjbWQpCisJCQljc3JfcmVsZWFzZV9jb21tYW5kX3NjYW4obWFjX2N0eCwgY21kKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9zY2FuX2hhbmRsZV9zZWFyY2hfZm9yX3NzaWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgdFNtZUNtZCAqcENvbW1hbmQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0U2NhblJlc3VsdEhhbmRsZSBoQlNTTGlzdCA9IENTUl9JTlZBTElEX1NDQU5SRVNVTFRfSEFORExFOworCXRDc3JTY2FuUmVzdWx0RmlsdGVyICpwU2NhbkZpbHRlciA9IE5VTEw7CisJdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSA9IHBDb21tYW5kLT51LnNjYW5DbWQucFRvUm9hbVByb2ZpbGU7CisJdWludDMyX3Qgc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsKKworCWRvIHsKKwkJLyogSWYgdGhpcyBzY2FuIGlzIGZvciBMRlIgKi8KKwkJaWYgKHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdLnVPc1JlcXVlc3RlZEhhbmRvZmYpIHsKKwkJCS8qIG5vdGlmeSBMRlIgc3RhdGUgbS9jICovCisJCQlzdGF0dXMgPSBjc3JfbmVpZ2hib3Jfcm9hbV9zc3NpZF9zY2FuX2RvbmUocE1hYywKKwkJCQkJCXNlc3Npb25JZCwgQ0RGX1NUQVRVU19TVUNDRVNTKTsKKwkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQkJCWNzcl9uZWlnaGJvcl9yb2FtX3N0YXJ0X2xmcl9zY2FuKHBNYWMsCisJCQkJCQkJCSBzZXNzaW9uSWQpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgcm9hbSBjb21tYW5kIHdhaXRpbmcsIGlnbm9yZSB0aGlzIHJvYW0gYmVjYXVzZQorCQkgKiB0aGUgbmV3ZXIgcm9hbSBjb21tYW5kIGlzIHRoZSBvbmUgdG8gZXhlY3V0ZQorCQkgKi8KKwkJaWYgKGNzcl9pc19yb2FtX2NvbW1hbmRfd2FpdGluZ19mb3Jfc2Vzc2lvbihwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkJRkwoImFib3J0cyBiZWNhdXNlIHJvYW0gY29tbWFuZCB3YWl0aW5nIikpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBQcm9maWxlID09IE5VTEwpCisJCQlicmVhazsKKwkJcFNjYW5GaWx0ZXIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKwkJaWYgKE5VTEwgPT0gcFNjYW5GaWx0ZXIpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWJyZWFrOworCQl9CisJCWNkZl9tZW1fc2V0KHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpLCAwKTsKKwkJc3RhdHVzID0gY3NyX3JvYW1fcHJlcGFyZV9maWx0ZXJfZnJvbV9wcm9maWxlKHBNYWMsIHBQcm9maWxlLAorCQkJCQkJCSAgICAgIHBTY2FuRmlsdGVyKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBjc3Jfc2Nhbl9nZXRfcmVzdWx0KHBNYWMsIHBTY2FuRmlsdGVyLCAmaEJTU0xpc3QpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IGNzcl9yb2FtX2lzc3VlX2Nvbm5lY3QocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwKKwkJCQkJCWhCU1NMaXN0LCBlQ3NySGRkSXNzdWVkLAorCQkJCQkJcENvbW1hbmQtPnUuc2NhbkNtZC5yb2FtSWQsCisJCQkJCQl0cnVlLCB0cnVlKTsKKwl9IHdoaWxlICgwKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKENTUl9JTlZBTElEX1NDQU5SRVNVTFRfSEFORExFICE9IGhCU1NMaXN0KSB7CisJCQljc3Jfc2Nhbl9yZXN1bHRfcHVyZ2UocE1hYywgaEJTU0xpc3QpOworCQl9CisJCS8qIFdlIGhhdmVuJ3QgZG9uZSBhbnl0aGluZyB0byB0aGlzIHByb2ZpbGUgKi8KKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIE5VTEwsCisJCQkJICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucm9hbUlkLAorCQkJCSAgICAgICBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fRkFJTFVSRSwKKwkJCQkgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFKTsKKwl9CisJaWYgKHBTY2FuRmlsdGVyKSB7CisJCWNzcl9mcmVlX3NjYW5fZmlsdGVyKHBNYWMsIHBTY2FuRmlsdGVyKTsKKwkJY2RmX21lbV9mcmVlKHBTY2FuRmlsdGVyKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9oYW5kbGVfc2VhcmNoX2Zvcl9zc2lkX2ZhaWx1cmUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgIHRTbWVDbWQgKnBDb21tYW5kKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVpbnQzMl90IHNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisJdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSA9IHBDb21tYW5kLT51LnNjYW5DbWQucFRvUm9hbVByb2ZpbGU7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCWVDc3JSb2FtUmVzdWx0IHJvYW1fcmVzdWx0OworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIElmIHRoaXMgc2NhbiBpcyBmb3IgTEZSICovCisJaWYgKHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdLnVPc1JlcXVlc3RlZEhhbmRvZmYpIHsKKwkJLyogbm90aWZ5IExGUiBzdGF0ZSBtL2MgKi8KKwkJc3RhdHVzID0gY3NyX25laWdoYm9yX3JvYW1fc3NzaWRfc2Nhbl9kb25lKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQlDREZfU1RBVFVTX0VfRkFJTFVSRSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQkJY3NyX25laWdoYm9yX3JvYW1fc3RhcnRfbGZyX3NjYW4ocE1hYywgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisjaWZkZWYgV0xBTl9ERUJVRworCWlmIChwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuU1NJRHMubnVtT2ZTU0lEcyA9PSAxKSB7CisJCWNoYXIgc3RyWzM2XTsKKwkJdFNpck1hY1NTaWQgKnB0cl9zc2lkID0KKwkJJnBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5TU0lEcy5TU0lETGlzdFswXS5TU0lEOworCQljZGZfbWVtX2NvcHkoc3RyLCBwdHJfc3NpZC0+c3NJZCwgcHRyX3NzaWQtPmxlbmd0aCk7CisJCXN0cltwdHJfc3NpZC0+bGVuZ3RoXSA9IDA7CisJCXNtc19sb2cocE1hYywgTE9HVywgRkwoIlNTSUQgPSAlcyIpLCBzdHIpOworCX0KKyNlbmRpZgorCS8qCisJICogQ2hlY2sgd2hldGhlciBpdCBpcyBmb3Igc3RhcnQgaWJzcy4gTm8gbmVlZCB0byBkbyBhbnl0aGluZyBpZiBpdAorCSAqIGlzIGEgSk9JTiByZXF1ZXN0CisJICovCisJaWYgKHBQcm9maWxlICYmIENTUl9JU19TVEFSVF9JQlNTKHBQcm9maWxlKSkgeworCQlzdGF0dXMgPSBjc3Jfcm9hbV9pc3N1ZV9jb25uZWN0KHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIE5VTEwsCisJCQkJZUNzckhkZElzc3VlZCwgcENvbW1hbmQtPnUuc2NhbkNtZC5yb2FtSWQsCisJCQkJdHJ1ZSwgdHJ1ZSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiZmFpbGVkIHRvIGlzc3VlIHN0YXJ0SUJTUywgc3RhdHVzOiAweCUwOFgiKSwKKwkJCQlzdGF0dXMpOworCQkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIE5VTEwsCisJCQkJcENvbW1hbmQtPnUuc2NhbkNtZC5yb2FtSWQsIGVDU1JfUk9BTV9GQUlMRUQsCisJCQkJZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFKTsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKwlyb2FtX3Jlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRTsKKwlpZiAoTlVMTCAhPSBwUHJvZmlsZSAmJiBjc3JfaXNfYnNzX3R5cGVfaWJzcyhwUHJvZmlsZS0+QlNTVHlwZSkpIHsKKwkJcm9hbV9yZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfU1RBUlRfRkFJTEVEOworCQlnb3RvIHJvYW1fY29tcGxldGlvbjsKKwl9CisJLyogT25seSBpbmRpY2F0ZSBhc3NvY19jb21wbGV0aW9uIGlmIHdlIGluZGljYXRlIGFzc29jX3N0YXJ0LiAqLworCWlmIChwU2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQgPiAwKSB7CisJCXRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvID0gTlVMTCwgcm9hbUluZm87CisKKwkJY2RmX21lbV9zZXQoJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSwgMCk7CisJCXBSb2FtSW5mbyA9ICZyb2FtSW5mbzsKKwkJaWYgKHBDb21tYW5kLT51LnJvYW1DbWQucFJvYW1Cc3NFbnRyeSkgeworCQkJdENzclNjYW5SZXN1bHQgKnBTY2FuUmVzdWx0ID0gR0VUX0JBU0VfQUREUigKKwkJCQlwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnksCisJCQkJdENzclNjYW5SZXN1bHQsIExpbmspOworCQkJcm9hbUluZm8ucEJzc0Rlc2MgPSAmcFNjYW5SZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yOworCQl9CisJCXJvYW1JbmZvLnN0YXR1c0NvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnN0YXR1c0NvZGU7CisJCXJvYW1JbmZvLnJlYXNvbkNvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisJCXBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudC0tOworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgcFJvYW1JbmZvLAorCQkJCSAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnJvYW1JZCwKKwkJCQkgICAgICAgZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04sCisJCQkJICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSk7CisJfSBlbHNlIHsKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIE5VTEwsCisJCQkJICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucm9hbUlkLAorCQkJCSAgICAgICBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fRkFJTFVSRSwKKwkJCQkgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFKTsKKwl9Cityb2FtX2NvbXBsZXRpb246CisJY3NyX3JvYW1fY29tcGxldGlvbihwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIHBDb21tYW5kLCByb2FtX3Jlc3VsdCwKKwkJCSAgICBmYWxzZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9yZXN1bHRfcHVyZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5MaXN0KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCXRTY2FuUmVzdWx0TGlzdCAqcFNjYW5MaXN0ID0gKHRTY2FuUmVzdWx0TGlzdCAqKSBoU2Nhbkxpc3Q7CisKKwlpZiAocFNjYW5MaXN0KSB7CisJCXN0YXR1cyA9IGNzcl9sbF9zY2FuX3B1cmdlX3Jlc3VsdChwTWFjLCAmcFNjYW5MaXN0LT5MaXN0KTsKKwkJY3NyX2xsX2Nsb3NlKCZwU2Nhbkxpc3QtPkxpc3QpOworCQljZGZfbWVtX2ZyZWUocFNjYW5MaXN0KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3JfZGVyaXZlX3ByZWZlcl92YWx1ZV9mcm9tX3Jzc2koKSAtIHRvIGRlcml2ZSBwcmVmZXIgdmFsdWUKKyAqIEBtYWNfY3R4OiBHbG9iYWwgTUFDIENvbnRleHQKKyAqIEByc3NpOiBSU1NJIG9mIHRoZSBCU1MKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBkZXJpdmUgcHJlZmVycmVkIHZhbHVlIGZyb20gZ2l2ZW4gcnNzaQorICoKKyAqIFJldHVybjogdmFsdWUgYmV0d2VlbiAwIHRvIDE0CisgKi8KK3N0YXRpYyBpbnQgY3NyX2Rlcml2ZV9wcmVmZXJfdmFsdWVfZnJvbV9yc3NpKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIGludCByc3NpKQoreworCWludCBpID0gQ1NSX05VTV9SU1NJX0NBVCAtIDEsIHByZWZfdmFsID0gMDsKKwl3aGlsZSAoaSA+PSAwKSB7CisJCWlmIChyc3NpID49IG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uUlNTSUNhdFtpXSkgeworCQkJcHJlZl92YWwgPSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLkJzc1ByZWZlclZhbHVlW2ldOworCQkJYnJlYWs7CisJCX0KKwkJaS0tOworCX07CisJcmV0dXJuIHByZWZfdmFsOworfQorCisvKioKKyAqIGlzX2NoYW5uZWxfZm91bmRfaW5fcGNsKCkgLSB0byBjaGVjayBpZiBjaGFubmVsIGlzIHByZXNlbnQgaW4gcGNsCisgKiBAbWFjX2N0eDogR2xvYmFsIE1BQyBDb250ZXh0CisgKiBAY2hhbm5lbF9pZDogY2hhbm5lbCBvZiBic3MKKyAqIEBmaWx0ZXI6IHBvaW50ZXIgdG8gZmlsdGVyIGNyZWF0ZWQgdGhyb3VnaCBwcm9maWxlCisgKgorICogdG8gY2hlY2sgaWYgcHJvdmlkZWQgY2hhbm5lbCBpcyBwcmVzZW50IGluIHBjbAorICoKKyAqIFJldHVybjogdHJ1ZSBvciBmYWxzZQorICovCitzdGF0aWMgYm9vbCBpc19jaGFubmVsX2ZvdW5kX2luX3BjbCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCBpbnQgY2hhbm5lbF9pZCwKKwkJdENzclNjYW5SZXN1bHRGaWx0ZXIgKmZpbHRlcikKK3sKKwlpbnQgaTsKKwlib29sIHN0YXR1cyA9IGZhbHNlOworCisJaWYgKE5VTEwgPT0gZmlsdGVyKQorCQlyZXR1cm4gc3RhdHVzOworCisJZm9yIChpID0gMDsgaSA8IGZpbHRlci0+cGNsX2NoYW5uZWxzLm51bUNoYW5uZWxzOyBpKyspIHsKKwkJaWYgKGZpbHRlci0+cGNsX2NoYW5uZWxzLmNoYW5uZWxMaXN0W2ldID09IGNoYW5uZWxfaWQpIHsKKwkJCXN0YXR1cyA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorLyoqCisgKiBjc3JfZ2V0X2FsdGVyZWRfcnNzaSgpIC0gQXJ0aWZpY2lhbGx5IGluY3JlYXNlL2RlY3JlYXNlIFJTU0kKKyAqIEBtYWNfY3R4OiAgICAgICAgIEdsb2JhbCBNQUMgQ29udGV4dCBwb2ludGVyLgorICogQHJzc2k6ICAgICAgICAgICAgQWN0dWFsIFJTU0kgb2YgdGhlIEFQLgorICogQGNoYW5uZWxfaWQ6ICAgICAgQ2hhbm5lbCBvbiB3aGljaCB0aGUgQVAgaXMgcGFya2VkLgorICogQGJzc2lkOiAgICAgICAgICAgQlNTSUQgb2YgdGhlIEFQIHRvIGNvbm5lY3QgdG8uCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgYXBwbHkgdGhlIGJvb3N0IGFuZCBwZW5hbHR5IHBhcmFtZXRlcnMKKyAqIGlmIHRoZSBjaGFubmVsX2lkIGlzIG9mIDVHIGJhbmQgYW5kIGl0IHdpbGwgYWxzbyBhcHBseQorICogdGhlIHByZWZlcnJlZCBic3NpZCBzY29yZSBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4KKyAqIHRoZSBic3NpZCBhbmQgdGhlIGdsb2JhbCBwcmVmZXJyZWQgYnNzaWQgbGlzdC4KKyAqCisgKiBSZXR1cm46ICAgICAgICAgIFRoZSBtb2RpZmllZCBSU1NJIFZhbHVlCisgKi8KK3N0YXRpYyBpbnQgY3NyX2dldF9hbHRlcmVkX3Jzc2kodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgaW50IHJzc2ksCisJCXVpbnQ4X3QgY2hhbm5lbF9pZCwgc3RydWN0IGNkZl9tYWNfYWRkciAqYnNzaWQpCit7CisJaW50IG1vZGlmaWVkX3Jzc2k7CisJaW50IGJvb3N0X2ZhY3RvcjsKKwlpbnQgcGVuYWx0eV9mYWN0b3I7CisJaW50IGk7CisJc3RydWN0IHJvYW1fZXh0X3BhcmFtcyAqcm9hbV9wYXJhbXM7CisJc3RydWN0IGNkZl9tYWNfYWRkciBmYXZfYnNzaWQ7CisJc3RydWN0IGNkZl9tYWNfYWRkciBsb2NhbF9ic3NpZDsKKworCW1vZGlmaWVkX3Jzc2kgPSByc3NpOworCWNkZl9tZW1femVybygmbG9jYWxfYnNzaWQuYnl0ZXMsIENERl9NQUNfQUREUl9TSVpFKTsKKwlpZiAoYnNzaWQpCisJCWNkZl9tZW1fY29weShsb2NhbF9ic3NpZC5ieXRlcywgYnNzaWQtPmJ5dGVzLAorCQkJCUNERl9NQUNfQUREUl9TSVpFKTsKKwlyb2FtX3BhcmFtcyA9ICZtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLnJvYW1fcGFyYW1zOworCS8qCisJICogSWYgdGhlIDVHIHByZWYgZmVhdHVyZSBpcyBlbmFibGVkLCBhcHBseSB0aGUgcm9hbWluZworCSAqIHBhcmFtZXRlcnMgdG8gYm9vc3Qgb3IgcGVuYWxpemUgdGhlIHJzc2kuCisJICogQm9vc3QgRmFjdG9yID0gYm9vc3RfZmFjdG9yICogKEFjdHVhbCBSU1NJIC0gYm9vc3QgVGhyZXNob2xkKQorCSAqIFBlbmFsdHkgRmFjdG9yID0gcGVuYWx0eSBmYWN0b3IgKiAocGVuYWx0eSB0aHJlc2hvbGQgLSBBY3R1YWwgUlNTSSkKKwkgKi8KKwlpZiAoQ1NSX0lTX1NFTEVDVF81R19QUkVGRVJSRUQobWFjX2N0eCkgJiYKKwkJCUNEU19JU19DSEFOTkVMXzVHSFooY2hhbm5lbF9pZCkpIHsKKwkJaWYgKHJzc2kgPiByb2FtX3BhcmFtcy0+cmFpc2VfcnNzaV90aHJlc2hfNWcpIHsKKwkJCS8qIENoZWNrIGFuZCBib29zdCB0aGUgdGhyZXNob2xkKi8KKwkJCWJvb3N0X2ZhY3RvciA9IHJvYW1fcGFyYW1zLT5yYWlzZV9mYWN0b3JfNWcgKgorCQkJCShyc3NpIC0gcm9hbV9wYXJhbXMtPnJhaXNlX3Jzc2lfdGhyZXNoXzVnKTsKKwkJCS8qIENoZWNrIGFuZCBwZW5hbGl6ZSB0aGUgdGhyZXNob2xkICovCisJCQltb2RpZmllZF9yc3NpICs9IENTUl9NSU4ocm9hbV9wYXJhbXMtPm1heF9yYWlzZV9yc3NpXzVnLAorCQkJCQkJYm9vc3RfZmFjdG9yKTsKKwkJfSBlbHNlIGlmIChyc3NpIDwgcm9hbV9wYXJhbXMtPmRyb3BfcnNzaV90aHJlc2hfNWcpIHsKKwkJCXBlbmFsdHlfZmFjdG9yID0gcm9hbV9wYXJhbXMtPmRyb3BfZmFjdG9yXzVnICoKKwkJCQkocm9hbV9wYXJhbXMtPmRyb3BfcnNzaV90aHJlc2hfNWcgLSByc3NpKTsKKwkJCW1vZGlmaWVkX3Jzc2kgLT0gQ1NSX01BWChyb2FtX3BhcmFtcy0+bWF4X2Ryb3BfcnNzaV81ZywKKwkJCQkJCXBlbmFsdHlfZmFjdG9yKTsKKwkJfQorCQlzbXNfbG9nKG1hY19jdHgsIExPRzIsCisJCQlGTCgiNUcgQlNTSUQiTUFDX0FERFJFU1NfU1RSIiBBUj0lZCwgTVI9JWQsIGNoPSVkIiksCisJCQlNQUNfQUREUl9BUlJBWShsb2NhbF9ic3NpZC5ieXRlcyksCisJCQlyc3NpLCBtb2RpZmllZF9yc3NpLCBjaGFubmVsX2lkKTsKKwl9CisJLyoKKwkgKiBDaGVjayBpZiB0aGVyZSBhcmUgcHJlZmVycmVkIGJzc2lkIGFuZCB0aGVuIGFwcGx5IHRoZQorCSAqIHByZWZlcnJlZCBzY29yZQorCSAqLworCWNkZl9tZW1femVybygmZmF2X2Jzc2lkLmJ5dGVzLCBDREZfTUFDX0FERFJfU0laRSk7CisJaWYgKHJvYW1fcGFyYW1zLT5udW1fYnNzaWRfZmF2b3JlZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcm9hbV9wYXJhbXMtPm51bV9ic3NpZF9mYXZvcmVkOyBpKyspIHsKKwkJCWNkZl9tZW1fY29weShmYXZfYnNzaWQuYnl0ZXMsCisJCQkJCSZyb2FtX3BhcmFtcy0+YnNzaWRfZmF2b3JlZFtpXSwKKwkJCQkJQ0RGX01BQ19BRERSX1NJWkUpOworCQkJaWYgKCFjZGZfaXNfbWFjYWRkcl9lcXVhbCgmZmF2X2Jzc2lkLCBic3NpZCkpCisJCQkJY29udGludWU7CisJCQltb2RpZmllZF9yc3NpICs9IHJvYW1fcGFyYW1zLT5ic3NpZF9mYXZvcmVkX2ZhY3RvcltpXTsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HMiwKKwkJCQlGTCgiUHJlZiJNQUNfQUREUkVTU19TVFIiIEFSPSVkLCBNUj0lZCwgY2g9JWQiKSwKKwkJCQlNQUNfQUREUl9BUlJBWShsb2NhbF9ic3NpZC5ieXRlcyksCisJCQkJcnNzaSwgbW9kaWZpZWRfcnNzaSwgY2hhbm5lbF9pZCk7CisJCX0KKwl9CisJcmV0dXJuIG1vZGlmaWVkX3Jzc2k7Cit9CisKKy8qKgorICogY3NyX2dldF9ic3NfcHJlZmVyX3ZhbHVlKCkgLSBHZXQgdGhlIHByZWZlcmVuY2UgdmFsdWUgZm9yIEJTUworICogQG1hY19jdHg6ICAgICAgICAgICAgICAgR2xvYmFsIE1BQyBDb250ZXh0CisgKiBAcnNzaTogICAgICAgICAgICAgICAgICBSU1NJIG9mIHRoZSBCU1MKKyAqIEBic3NpZDogICAgICAgICAgICAgICAgIEJTU0lEIHRvIHdoaWNoIHRoZSBwcmVmZXJlbmNlIHZhbHVlIGlzIHJldHVybmVkCisgKiBAY2hhbm5lbF9pZDogICAgICAgICAgICBDaGFubmVsIG9uIHdoaWNoIHRoZSBBUCBpcyBwYXJrZWQKKyAqCisgKiBFYWNoIEJTUyBkZXNjcmlwdG9yIHNob3VsZCBiZSBhc3NpZ25lZCBhIHByZWZlcmVuY2UgdmFsdWUgcmFuZ2luZyBmcm9tCisgKiAxNC0wLCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgYW4gUlNTSSBidWNrZXQgc2NvcmUgd2hpbGUgc29ydGluZyB0aGUKKyAqIHNjYW4gcmVzdWx0cy4KKyAqCisgKiBSZXR1cm46IFByZWZlcmVuY2UgdmFsdWUgZm9yIHRoZSBCU1NJRAorICovCitzdGF0aWMgdWludDMyX3QgY3NyX2dldF9ic3NfcHJlZmVyX3ZhbHVlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIGludCByc3NpLAorCQlzdHJ1Y3QgY2RmX21hY19hZGRyICpic3NpZCwgaW50IGNoYW5uZWxfaWQpCit7CisJdWludDMyX3QgcmV0ID0gMDsKKwlpbnQgbW9kaWZpZWRfcnNzaTsKKworCS8qCisJICogVGhlIFJTU0kgZG9lcyBub3QgZ2V0IG1vZGlmaWVkIGluIGNhc2UgdGhlIDVHCisJICogcHJlZmVyZW5jZSBvciBwcmVmZXJyZWQgQlNTSUQgaXMgbm90IGFwcGxpY2FibGUKKwkgKi8KKwltb2RpZmllZF9yc3NpID0gY3NyX2dldF9hbHRlcmVkX3Jzc2kobWFjX2N0eCwgcnNzaSwgY2hhbm5lbF9pZCwgYnNzaWQpOworCXJldCA9IGNzcl9kZXJpdmVfcHJlZmVyX3ZhbHVlX2Zyb21fcnNzaShtYWNfY3R4LCBtb2RpZmllZF9yc3NpKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFJldHVybiBhIENhcFZhbHVlIGJhc2Ugb24gdGhlIGNhcGFiaWxpdGllcyBvZiBhIEJTUyAqLworc3RhdGljIHVpbnQzMl90IGNzcl9nZXRfYnNzX2NhcF92YWx1ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsCisJCQkJICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKwl1aW50MzJfdCByZXQgPSBDU1JfQlNTX0NBUF9WQUxVRV9OT05FOworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCWlmIChDU1JfSVNfUk9BTV9QUkVGRVJfNUdIWihwTWFjKSB8fCBDU1JfSVNfU0VMRUNUXzVHX1BSRUZFUlJFRChwTWFjKSkgeworCQlpZiAoKHBCc3NEZXNjKSAmJiBDRFNfSVNfQ0hBTk5FTF81R0haKHBCc3NEZXNjLT5jaGFubmVsSWQpKSB7CisJCQlyZXQgKz0gQ1NSX0JTU19DQVBfVkFMVUVfNUdIWjsKKwkJfQorCX0KKyNlbmRpZgorCS8qCisJICogaWYgc3RyaWN0IHNlbGVjdCA1R0h6IGlzIG5vbi16ZXJvIHRoZW4gaWdub3JlIHRoZSBjYXBhYmlsaXR5IGNoZWNraW5nCisJICovCisJaWYgKHBJZXMgJiYgIUNTUl9JU19TRUxFQ1RfNUdIWl9NQVJHSU4ocE1hYykpIHsKKwkJLyogV2Ugb25seSBjYXJlIGFib3V0IDExTiBjYXBhYmlsaXR5ICovCisJCWlmIChwSWVzLT5WSFRDYXBzLnByZXNlbnQpCisJCQlyZXQgKz0gQ1NSX0JTU19DQVBfVkFMVUVfVkhUOworCQllbHNlIGlmIChwSWVzLT5IVENhcHMucHJlc2VudCkKKwkJCXJldCArPSBDU1JfQlNTX0NBUF9WQUxVRV9IVDsKKwkJaWYgKENTUl9JU19RT1NfQlNTKHBJZXMpKSB7CisJCQlyZXQgKz0gQ1NSX0JTU19DQVBfVkFMVUVfV01NOworCQkJLyogR2l2ZSBhZHZhbnRhZ2UgdG8gVUFQU0QgKi8KKwkJCWlmIChDU1JfSVNfVUFQU0RfQlNTKHBJZXMpKSB7CisJCQkJcmV0ICs9IENTUl9CU1NfQ0FQX1ZBTFVFX1VBUFNEOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBjc3JfaXNfYmV0dGVyX3Jzc2koKSAtIElzIGJzczEgYmV0dGVyIHRoYW4gYnNzMgorICogQG1hY19jdHg6ICAgICAgICAgICAgIEdsb2JhbCBNQUMgQ29udGV4dCBwb2ludGVyLgorICogQGJzczE6ICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpcnN0IEJTUy4KKyAqIEBic3MyOiAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBzZWNvbmQgQlNTLgorICoKKyAqIFRoaXMgcm91dGluZSBoZWxwcyBpbiBkZXRlcm1pbmluZyB0aGUgcHJlZmVyZW5jZSB2YWx1ZQorICogb2YgYSBwYXJ0aWN1bGFyIEJTUyBpbiB0aGUgc2NhbiByZXN1bHQgd2hpY2ggaXMgZnVydGhlcgorICogdXNlZCBpbiB0aGUgc29ydGluZyBsb2dpYyBvZiB0aGUgZmluYWwgY2FuZGlkYXRlIEFQJ3MuCisgKgorICogUmV0dXJuOiAgICAgICAgICB0cnVlLCBpZiBic3MxIGlzIGJldHRlciB0aGFuIGJzczIKKyAqICAgICAgICAgICAgICAgICAgZmFsc2UsIGlmIGJzczIgaXMgYmV0dGVyIHRoYW4gYnNzMS4KKyAqLworc3RhdGljIGJvb2wgY3NyX2lzX2JldHRlcl9yc3NpKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXRDc3JTY2FuUmVzdWx0ICpic3MxLCB0Q3NyU2NhblJlc3VsdCAqYnNzMikKK3sKKwlib29sIHJldDsKKwlpbnQgcnNzaTEsIHJzc2kyOworCXN0cnVjdCBjZGZfbWFjX2FkZHIgbG9jYWxfbWFjOworCisJcnNzaTEgPSBic3MxLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5yc3NpOworCXJzc2kyID0gYnNzMi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IucnNzaTsKKwkvKgorCSAqIEFwcGx5IHRoZSBib29zdCBhbmQgcGVubHR5IGxvZ2ljIGFuZCBjaGVjaworCSAqIHdoaWNoIGlzIHRoZSBiZXN0IFJTU0kKKwkgKi8KKwljZGZfbWVtX3plcm8oJmxvY2FsX21hYy5ieXRlcywgQ0RGX01BQ19BRERSX1NJWkUpOworCWNkZl9tZW1fY29weSgmbG9jYWxfbWFjLmJ5dGVzLAorCQkJJmJzczEtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmJzc0lkLCBDREZfTUFDX0FERFJfU0laRSk7CisJcnNzaTEgPSBjc3JfZ2V0X2FsdGVyZWRfcnNzaShtYWNfY3R4LCByc3NpMSwKKwkJCWJzczEtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCwKKwkJCSZsb2NhbF9tYWMpOworCWNkZl9tZW1fY29weSgmbG9jYWxfbWFjLmJ5dGVzLAorCQkJJmJzczItPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmJzc0lkLCBDREZfTUFDX0FERFJfU0laRSk7CisJcnNzaTIgPSBjc3JfZ2V0X2FsdGVyZWRfcnNzaShtYWNfY3R4LCByc3NpMiwKKwkJCWJzczItPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCwKKwkJCSZsb2NhbF9tYWMpOworCWlmIChDU1JfSVNfQkVUVEVSX1JTU0kocnNzaTEsIHJzc2kyKSkKKwkJcmV0ID0gdHJ1ZTsKKwllbHNlCisJCXJldCA9IGZhbHNlOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogY3NyX2lzX2JldHRlcl9ic3MoKSAtIElzIGJzczEgYmV0dGVyIHRoYW4gYnNzMgorICogQG1hY19jdHg6ICAgICAgICAgICAgIEdsb2JhbCBNQUMgQ29udGV4dCBwb2ludGVyLgorICogQGJzczE6ICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpcnN0IEJTUy4KKyAqIEBic3MyOiAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBzZWNvbmQgQlNTLgorICoKKyAqIFRoaXMgcm91dGluZSBoZWxwcyBpbiBkZXRlcm1pbmluZyB0aGUgcHJlZmVyZW5jZSB2YWx1ZQorICogb2YgYSBwYXJ0aWN1bGFyIEJTUyBpbiB0aGUgc2NhbiByZXN1bHQgd2hpY2ggaXMgZnVydGhlcgorICogdXNlZCBpbiB0aGUgc29ydGluZyBsb2dpYyBvZiB0aGUgZmluYWwgY2FuZGlkYXRlIEFQJ3MuCisgKgorICogUmV0dXJuOiAgICAgICAgICB0cnVlLCBpZiBic3MxIGlzIGJldHRlciB0aGFuIGJzczIKKyAqICAgICAgICAgICAgICAgICAgZmFsc2UsIGlmIGJzczIgaXMgYmV0dGVyIHRoYW4gYnNzMS4KKyAqLworc3RhdGljIGJvb2wgY3NyX2lzX2JldHRlcl9ic3ModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwl0Q3NyU2NhblJlc3VsdCAqYnNzMSwgdENzclNjYW5SZXN1bHQgKmJzczIpCit7CisJYm9vbCByZXQ7CisKKwlpZiAoQ1NSX0lTX0JFVFRFUl9QUkVGRVJfVkFMVUUoYnNzMS0+cHJlZmVyVmFsdWUsIGJzczItPnByZWZlclZhbHVlKSkgeworCQlyZXQgPSB0cnVlOworCX0gZWxzZSBpZiAoQ1NSX0lTX0VRVUFMX1BSRUZFUl9WQUxVRQorCQkJKGJzczEtPnByZWZlclZhbHVlLCBic3MyLT5wcmVmZXJWYWx1ZSkpIHsKKwkJaWYgKENTUl9JU19CRVRURVJfQ0FQX1ZBTFVFKGJzczEtPmNhcFZhbHVlLCBic3MyLT5jYXBWYWx1ZSkpCisJCQlyZXQgPSB0cnVlOworCQllbHNlIGlmIChDU1JfSVNfRVFVQUxfQ0FQX1ZBTFVFCisJCQkJKGJzczEtPmNhcFZhbHVlLCBic3MyLT5jYXBWYWx1ZSkpIHsKKwkJCWlmIChjc3JfaXNfYmV0dGVyX3Jzc2kobWFjX2N0eCwgYnNzMSwgYnNzMikpCisJCQkJcmV0ID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGZhbHNlOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gZmFsc2U7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKy8qIEFkZCB0aGUgY2hhbm5lbCB0byB0aGUgb2NjdXBpZWRDaGFubmVscyBhcnJheSAqLworc3RhdGljIHZvaWQgY3NyX3NjYW5fYWRkX3RvX29jY3VwaWVkX2NoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHRDc3JTY2FuUmVzdWx0ICpwUmVzdWx0LAorCQkJCQkgICAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgdENzckNoYW5uZWwgKm9jY3VwaWVkX2NoLAorCQkJCQkgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQ4X3QgY2g7CisJdWludDhfdCBudW1fb2NjdXBpZWRfY2ggPSBvY2N1cGllZF9jaC0+bnVtQ2hhbm5lbHM7CisJdWludDhfdCAqb2NjdXBpZWRfY2hfbHN0ID0gb2NjdXBpZWRfY2gtPmNoYW5uZWxMaXN0OworCisJY2ggPSBwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5jaGFubmVsSWQ7CisJaWYgKGNzcl9pc19jaGFubmVsX3ByZXNlbnRfaW5fbGlzdChvY2N1cGllZF9jaF9sc3QsIG51bV9vY2N1cGllZF9jaCwgY2gpCisJICAgIHx8ICFjc3JfbmVpZ2hib3Jfcm9hbV9jb25uZWN0ZWRfcHJvZmlsZV9tYXRjaChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICBwUmVzdWx0LCBwSWVzKSkKKwkJcmV0dXJuOworCisJc3RhdHVzID0gY3NyX2FkZF90b19jaGFubmVsX2xpc3RfZnJvbnQob2NjdXBpZWRfY2hfbHN0LAorCQkJCQkgICAgICAgbnVtX29jY3VwaWVkX2NoLCBjaCk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCW9jY3VwaWVkX2NoLT5udW1DaGFubmVscysrOworCQlzbXNfbG9nKHBNYWMsIExPRzIsCisJCQlGTCgiQWRkZWQgY2hhbm5lbCAlZCB0byB0aGUgbGlzdCAoY291bnQ9JWQpIiksCisJCQljaCwgb2NjdXBpZWRfY2gtPm51bUNoYW5uZWxzKTsKKwkJaWYgKG9jY3VwaWVkX2NoLT5udW1DaGFubmVscyA+CisJCSAgICBDU1JfQkdfU0NBTl9PQ0NVUElFRF9DSEFOTkVMX0xJU1RfTEVOKQorCQkJb2NjdXBpZWRfY2gtPm51bUNoYW5uZWxzID0KKwkJCQlDU1JfQkdfU0NBTl9PQ0NVUElFRF9DSEFOTkVMX0xJU1RfTEVOOworCX0KK30KKyNlbmRpZgorCisvKiBQdXQgdGhlIEJTUyBpbnRvIHRoZSBzY2FuIHJlc3VsdCBsaXN0ICovCisvKiBwSWVzIGNhbiBub3QgYmUgTlVMTCAqLworc3RhdGljIHZvaWQgY3NyX3NjYW5fYWRkX3Jlc3VsdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlc3VsdCAqcFJlc3VsdCwKKwkJCQl0RG90MTFmQmVhY29uSUVzICpwSWVzLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisjZW5kaWYKKworCXN0cnVjdCBjZGZfbWFjX2FkZHIgYnNzaWQ7CisJdWludDhfdCBjaGFubmVsX2lkID0gcFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkOworCWNkZl9tZW1femVybygmYnNzaWQuYnl0ZXMsIENERl9NQUNfQUREUl9TSVpFKTsKKwljZGZfbWVtX2NvcHkoYnNzaWQuYnl0ZXMsICZwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5ic3NJZCwKKwkJCUNERl9NQUNfQUREUl9TSVpFKTsKKwlwUmVzdWx0LT5wcmVmZXJWYWx1ZSA9IGNzcl9nZXRfYnNzX3ByZWZlcl92YWx1ZShwTWFjLAorCQkJCShpbnQpcFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IucnNzaSwKKwkJCQkmYnNzaWQsIGNoYW5uZWxfaWQpOworCXBSZXN1bHQtPmNhcFZhbHVlID0gY3NyX2dldF9ic3NfY2FwX3ZhbHVlKHBNYWMsCisJCQkJJnBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCBwSWVzKTsKKwljc3JfbGxfaW5zZXJ0X3RhaWwoJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsICZwUmVzdWx0LT5MaW5rLAorCQkJICAgTExfQUNDRVNTX0xPQ0spOworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwlpZiAoMCA9PSBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMpIHsKKwkJLyoKKwkJICogQnVpbGQgdGhlIG9jY3VwaWVkIGNoYW5uZWwgbGlzdCwgb25seSBpZgorCQkgKiAiZ05laWdoYm9yU2NhbkNoYW5uZWxMaXN0IiBpcyBOT1Qgc2V0IGluIHRoZSBjZmcuaW5pIGZpbGUKKwkJICovCisJCWNzcl9zY2FuX2FkZF90b19vY2N1cGllZF9jaGFubmVscyhwTWFjLCBwUmVzdWx0LCBzZXNzaW9uSWQsCisJCQkJJnBNYWMtPnNjYW4ub2NjdXBpZWRDaGFubmVsc1tzZXNzaW9uSWRdLCBwSWVzKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2Nzcl9wYXJzZXJfc2Nhbl9yZXN1bHRfZm9yXzVnaHpfcHJlZmVyZW5jZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcEZpbHRlcikKK3sKKwlib29sIGZNYXRjaDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzOworCXRDc3JTY2FuUmVzdWx0ICpwQnNzRGVzYzsKKwl1aW50OF90IGkgPSAwOworCisJLyogRmluZCBvdXQgdGhlIGJlc3QgQVAgUnNzaSBnb2luZyB0aHJ1IHRoZSBzY2FuIHJlc3VsdHMgKi8KKwlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl3aGlsZSAoTlVMTCAhPSBwRW50cnkpIHsKKwkJcEJzc0Rlc2MgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQlmTWF0Y2ggPSBmYWxzZTsKKworCQlmb3IgKGkgPSAwOyBwRmlsdGVyICYmIChpIDwgcEZpbHRlci0+U1NJRHMubnVtT2ZTU0lEcyk7IGkrKykgeworCQkJZk1hdGNoID0gY3NyX2lzX3NzaWRfbWF0Y2gocE1hYywKKwkJCQkJcEZpbHRlci0+U1NJRHMuU1NJRExpc3RbaV0uU1NJRC5zc0lkLAorCQkJCQlwRmlsdGVyLT5TU0lEcy5TU0lETGlzdFtpXS5TU0lELmxlbmd0aCwKKwkJCQkJcEJzc0Rlc2MtPlJlc3VsdC5zc0lkLnNzSWQsCisJCQkJCXBCc3NEZXNjLT5SZXN1bHQuc3NJZC5sZW5ndGgsIHRydWUpOworCQkJaWYgKCFmTWF0Y2gpCisJCQkJY29udGludWU7CisKKwkJCXBJZXMgPSAodERvdDExZkJlYWNvbklFcyAqKShwQnNzRGVzYy0+UmVzdWx0LnB2SWVzKTsKKwkJCS8qIEF0IHRoaXMgdGltZSwgUmVzdWx0LnB2SWVzIG1heSBiZSBOVUxMICovCisJCQlzdGF0dXMgPSBjc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzKHBNYWMsCisJCQkJCSZwQnNzRGVzYy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IsICZwSWVzKTsKKwkJCWlmICghcEllcyAmJiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSkKKwkJCQljb250aW51ZTsKKworCQkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiU1NJRCBNYXRjaGVkIikpOworCQkJaWYgKHBGaWx0ZXItPmJPU0VOQXNzb2NpYXRpb24pIHsKKwkJCQlmTWF0Y2ggPSB0cnVlOworCQkJCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIlNlY3VyaXR5IE1hdGNoZWQiKSk7CisJCQkJaWYgKChwQnNzRGVzYy0+UmVzdWx0LnB2SWVzID09IE5VTEwpICYmIHBJZXMpCisJCQkJCWNkZl9tZW1fZnJlZShwSWVzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJCQlmTWF0Y2ggPSBjc3JfaXNfc2VjdXJpdHlfbWF0Y2gocE1hYywgJnBGaWx0ZXItPmF1dGhUeXBlLAorCQkJCQkmcEZpbHRlci0+RW5jcnlwdGlvblR5cGUsCisJCQkJCSZwRmlsdGVyLT5tY0VuY3J5cHRpb25UeXBlLAorCQkJCQkmcEZpbHRlci0+TUZQRW5hYmxlZCwKKwkJCQkJJnBGaWx0ZXItPk1GUFJlcXVpcmVkLAorCQkJCQkmcEZpbHRlci0+TUZQQ2FwYWJsZSwKKwkJCQkJJnBCc3NEZXNjLT5SZXN1bHQuQnNzRGVzY3JpcHRvciwKKwkJCQkJcEllcywgTlVMTCwgTlVMTCwgTlVMTCk7CisjZWxzZQorCQkJZk1hdGNoID0gY3NyX2lzX3NlY3VyaXR5X21hdGNoKHBNYWMsICZwRmlsdGVyLT5hdXRoVHlwZSwKKwkJCQkJJnBGaWx0ZXItPkVuY3J5cHRpb25UeXBlLAorCQkJCQkmcEZpbHRlci0+bWNFbmNyeXB0aW9uVHlwZSwKKwkJCQkJTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJJnBCc3NEZXNjLT5SZXN1bHQuQnNzRGVzY3JpcHRvciwKKwkJCQkJcEllcywgTlVMTCwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKwkJCWlmICgocEJzc0Rlc2MtPlJlc3VsdC5wdkllcyA9PSBOVUxMKSAmJiBwSWVzKQorCQkJCWNkZl9tZW1fZnJlZShwSWVzKTsKKwkJCWlmIChmTWF0Y2gpCisJCQkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiU2VjdXJpdHkgTWF0Y2hlZCIpKTsKKwkJfSAvKiBmb3IgbG9vcCBlbmRzICovCisKKwkJaWYgKGZNYXRjaAorCQkgICAgJiYgKHBCc3NEZXNjLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5yc3NpID4KKwkJCXBNYWMtPnNjYW4uaW5TY2FuUmVzdWx0QmVzdEFQUnNzaSkpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HMSwKKwkJCQlGTCgiQmVzdCBBUCBSc3NpIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIpLAorCQkJCXBNYWMtPnNjYW4uaW5TY2FuUmVzdWx0QmVzdEFQUnNzaSwKKwkJCQlwQnNzRGVzYy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IucnNzaSk7CisJCQlwTWFjLT5zY2FuLmluU2NhblJlc3VsdEJlc3RBUFJzc2kgPQorCQkJCXBCc3NEZXNjLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5yc3NpOworCQl9CisJCXBFbnRyeSA9IGNzcl9sbF9uZXh0KCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBwRW50cnksCisJCQkJICAgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjc3JfcHJlZmVyXzVnaHoodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBGaWx0ZXIpCit7CisJdExpc3RFbGVtICpwRW50cnk7CisJdENzclNjYW5SZXN1bHQgKnBCc3NEZXNjOworCXN0cnVjdCByb2FtX2V4dF9wYXJhbXMgKnJvYW1fcGFyYW1zID0gTlVMTDsKKworCWlmICghcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uU2VsZWN0NUdIek1hcmdpbiAmJgorCQkhQ1NSX0lTX1NFTEVDVF81R19QUkVGRVJSRUQocE1hYykpCisJCXJldHVybjsKKworCXBNYWMtPnNjYW4uaW5TY2FuUmVzdWx0QmVzdEFQUnNzaSA9IC0xMjg7CisJcm9hbV9wYXJhbXMgPSAmcE1hYy0+cm9hbS5jb25maWdQYXJhbS5yb2FtX3BhcmFtczsKKyNpZmRlZiBXTEFOX0RFQlVHX1JPQU1fT0ZGTE9BRAorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkgIEZMKCJuU2VsZWN0NUdIek1hcmdpbiIpKTsKKyNlbmRpZgorCWNzcl9sbF9sb2NrKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0KTsKKwkvKgorCSAqIEZvciA1RyBwcmVmZXJlbmNlIGZlYXR1cmUsIHRoZXJlIGlzIG5vCisJICogbmVlZCB0byBjaGVjayB0aGUgZmlsdGVyIG1hdGNoIGFuZCBhbHNvIHJlLXByb2dyYW0gdGhlCisJICogUlNTSSBidWNrZXQgY2F0ZWdvcmllcywgc2luY2Ugd2UgdXNlIHRoZSBSU1NJIHZhbHVlcworCSAqIHdoaWxlIHNldHRpbmcgdGhlIHByZWZlcmVuY2UgdmFsdWUgZm9yIHRoZSBCU1MuCisJICogVGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayB0aGUgbWF0Y2ggZm9yIHJvYW1pbmcgc2luY2UKKwkgKiBpdCBpcyBhbHJlYWR5IGRvbmUuCisJICovCisJaWYgKCFDU1JfSVNfU0VMRUNUXzVHX1BSRUZFUlJFRChwTWFjKSkKKwkJY3NyX3BhcnNlcl9zY2FuX3Jlc3VsdF9mb3JfNWdoel9wcmVmZXJlbmNlKHBNYWMsIHBGaWx0ZXIpOworCWlmICgtMTI4ICE9IHBNYWMtPnNjYW4uaW5TY2FuUmVzdWx0QmVzdEFQUnNzaSB8fAorCQlDU1JfSVNfU0VMRUNUXzVHX1BSRUZFUlJFRChwTWFjKSkgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJCZXN0IEFQIFJzc2kgaXMgJWQiKSwKKwkJCXBNYWMtPnNjYW4uaW5TY2FuUmVzdWx0QmVzdEFQUnNzaSk7CisJCS8qIE1vZGlmeSBSc3NpIGNhdGVnb3J5IGJhc2VkIG9uIGJlc3QgQVAgUnNzaSAqLworCQlpZiAoLTEyOCAhPSBwTWFjLT5zY2FuLmluU2NhblJlc3VsdEJlc3RBUFJzc2kpCisJCQljc3JfYXNzaWduX3Jzc2lfZm9yX2NhdGVnb3J5KHBNYWMsCisJCQkJCXBNYWMtPnNjYW4uaW5TY2FuUmVzdWx0QmVzdEFQUnNzaSwKKwkJCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5iQ2F0UnNzaU9mZnNldCk7CisJCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsCisJCQkJCSAgTExfQUNDRVNTX05PTE9DSyk7CisJCXdoaWxlIChOVUxMICE9IHBFbnRyeSkgeworCQkJcEJzc0Rlc2MgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQkJLyoKKwkJCSAqIHJlLWFzc2lnbiBwcmVmZXJlbmNlIHZhbHVlIGJhc2VkIG9uIG1vZGlmaWVkCisJCQkgKiByc3NpIGJ1Y2tldCAob3IpIDVHIFByZWZlcmVuY2UgZmVhdHVyZS4KKwkJCSAqLworCQkJcEJzc0Rlc2MtPnByZWZlclZhbHVlID0gY3NyX2dldF9ic3NfcHJlZmVyX3ZhbHVlKHBNYWMsCisJCQkJKGludClwQnNzRGVzYy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IucnNzaSwKKwkJCQkoc3RydWN0IGNkZl9tYWNfYWRkciAqKQorCQkJCSZwQnNzRGVzYy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuYnNzSWQsCisJCQkJcEJzc0Rlc2MtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCk7CisKKwkJCXNtc19sb2cocE1hYywgTE9HMiwgRkwoIkJTU0lEKCJNQUNfQUREUkVTU19TVFIiKSBSc3NpKCVkKSBDaG5sKCVkKSBQcmVmVmFsKCV1KSBTU0lEPSUuKnMiKSwKKwkJCQlNQUNfQUREUl9BUlJBWSgKKwkJCQkJcEJzc0Rlc2MtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmJzc0lkKSwKKwkJCQlwQnNzRGVzYy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IucnNzaSwKKwkJCQlwQnNzRGVzYy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkLAorCQkJCXBCc3NEZXNjLT5wcmVmZXJWYWx1ZSwKKwkJCQlwQnNzRGVzYy0+UmVzdWx0LnNzSWQubGVuZ3RoLAorCQkJCXBCc3NEZXNjLT5SZXN1bHQuc3NJZC5zc0lkKTsKKwkJCXBFbnRyeSA9IGNzcl9sbF9uZXh0KCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBwRW50cnksCisJCQkJCSAgICAgTExfQUNDRVNTX05PTE9DSyk7CisJCX0KKwl9CisJY3NyX2xsX3VubG9jaygmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7Cit9CisKK3N0YXRpYyBDREZfU1RBVFVTCitjc3Jfc2F2ZV9pZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkgICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwRmlsdGVyLAorCSAgICAgdENzclNjYW5SZXN1bHQgKnBCc3NEZXNjLAorCSAgICAgdERvdDExZkJlYWNvbklFcyAqKnBOZXdJZXMsCisJICAgICBib29sICpmTWF0Y2gsCisJICAgICBlQ3NyRW5jcnlwdGlvblR5cGUgKnVjLAorCSAgICAgZUNzckVuY3J5cHRpb25UeXBlICptYywKKwkgICAgIGVDc3JBdXRoVHlwZSAqYXV0aCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzID0gTlVMTDsKKworCWlmICghcEZpbHRlcikKKwkJcmV0dXJuIHN0YXR1czsKKwkqZk1hdGNoID0gY3NyX21hdGNoX2JzcyhwTWFjLCAmcEJzc0Rlc2MtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLAorCQkJICAgICAgIHBGaWx0ZXIsIGF1dGgsIHVjLCBtYywgJnBJZXMpOworI2lmZGVmIFdMQU5fREVCVUdfUk9BTV9PRkZMT0FECisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCSAgRkwoImNzcl9tYXRjaF9ic3MgZm1hdGNoICVkIiksICpmTWF0Y2gpOworI2VuZGlmCisJaWYgKE5VTEwgPT0gcEllcykKKwkJcmV0dXJuIHN0YXR1czsKKwkvKiBPbmx5IHNhdmUgaXQgd2hlbiBtYXRjaGluZyAqLworCWlmICghKCpmTWF0Y2gpICYmICFwQnNzRGVzYy0+UmVzdWx0LnB2SWVzKSB7CisJCWNkZl9tZW1fZnJlZShwSWVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKCFwQnNzRGVzYy0+UmVzdWx0LnB2SWVzKSB7CisJCS8qCisJCSAqIGNzcl9tYXRjaF9ic3MgYWxsb2NhdGVzIHRoZSBtZW1vcnkuIFNpbXBseSBwYXNzIGl0IGFuZCBpdAorCQkgKiBpcyBmcmVlZCBsYXRlcgorCQkgKi8KKwkJKnBOZXdJZXMgPSBwSWVzOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwkvKgorCSAqIFRoZSBwSWVzIGlzIGFsbG9jYXRlZCBieSBzb21lb25lIGVsc2UuIG1ha2UgYSBjb3B5CisJICogT25seSB0byBzYXZlIHBhcnNlZCBJRXMgaWYgY2FsbGVyIHByb3ZpZGVzIGEgZmlsdGVyLiBNb3N0IGxpa2VseSB0aGUKKwkgKiBjYWxsZXIgaXMgdXNpbmcgdG8gZm9yIGFzc29jaWF0aW9uLCBoZW5jZSBzYXZlIHRoZSBwYXJzZWQgSUVzCisJICovCisJKnBOZXdJZXMgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodERvdDExZkJlYWNvbklFcykpOworCWlmIChOVUxMID09ICpwTmV3SWVzKSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiZmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIElFcyIpKTsKKwkJLyogTmVlZCB0byBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgY3NyX21hdGNoX2JzcyAqLworCQlpZiAoIXBCc3NEZXNjLT5SZXN1bHQucHZJZXMpCisJCQljZGZfbWVtX2ZyZWUocEllcyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWNkZl9tZW1fY29weSgqcE5ld0llcywgcEllcywgc2l6ZW9mKHREb3QxMWZCZWFjb25JRXMpKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgQ0RGX1NUQVRVUworY3NyX3NhdmVfc2Nhbl9lbnRyeSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgICAgdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBGaWx0ZXIsCisJCSAgICBib29sIGZNYXRjaCwKKwkJICAgIHRDc3JTY2FuUmVzdWx0ICpwQnNzRGVzYywKKwkJICAgIHREb3QxMWZCZWFjb25JRXMgKnBOZXdJZXMsCisJCSAgICB0U2NhblJlc3VsdExpc3QgKnBSZXRMaXN0LAorCQkgICAgdWludDMyX3QgKmNvdW50LAorCQkgICAgZUNzckVuY3J5cHRpb25UeXBlIHVjLAorCQkgICAgZUNzckVuY3J5cHRpb25UeXBlIG1jLAorCQkgICAgZUNzckF1dGhUeXBlICphdXRoKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRDc3JTY2FuUmVzdWx0ICpwUmVzdWx0OworCXVpbnQzMl90IGJzc0xlbiwgYWxsb2NMZW47CisJLyogVG8gc29ydCB0aGUgbGlzdCAqLworCXRMaXN0RWxlbSAqcFRtcEVudHJ5OworCXRDc3JTY2FuUmVzdWx0ICpwVG1wUmVzdWx0OworCisJaWYgKCEoTlVMTCA9PSBwRmlsdGVyIHx8IGZNYXRjaCkpCisJCXJldHVybiBzdGF0dXM7CisKKwlic3NMZW4gPSBwQnNzRGVzYy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IubGVuZ3RoICsKKwkJc2l6ZW9mKHBCc3NEZXNjLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5sZW5ndGgpOworCWFsbG9jTGVuID0gc2l6ZW9mKHRDc3JTY2FuUmVzdWx0KSArIGJzc0xlbjsKKwlwUmVzdWx0ID0gY2RmX21lbV9tYWxsb2MoYWxsb2NMZW4pOworCWlmIChOVUxMID09IHBSZXN1bHQpIHsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiZmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNjYW4gcmVzdWx0LCBsZW49JWQiKSwKKwkJCWFsbG9jTGVuKTsKKwkJaWYgKHBOZXdJZXMpCisJCQljZGZfbWVtX2ZyZWUocE5ld0llcyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWNkZl9tZW1fc2V0KHBSZXN1bHQsIGFsbG9jTGVuLCAwKTsKKwlwUmVzdWx0LT5jYXBWYWx1ZSA9IHBCc3NEZXNjLT5jYXBWYWx1ZTsKKwlwUmVzdWx0LT5wcmVmZXJWYWx1ZSA9IHBCc3NEZXNjLT5wcmVmZXJWYWx1ZTsKKwlwUmVzdWx0LT51Y0VuY3J5cHRpb25UeXBlID0gdWM7CisJcFJlc3VsdC0+bWNFbmNyeXB0aW9uVHlwZSA9IG1jOworCXBSZXN1bHQtPmF1dGhUeXBlID0gKmF1dGg7CisJcFJlc3VsdC0+UmVzdWx0LnNzSWQgPSBwQnNzRGVzYy0+UmVzdWx0LnNzSWQ7CisJcFJlc3VsdC0+UmVzdWx0LnRpbWVyID0gcEJzc0Rlc2MtPlJlc3VsdC50aW1lcjsKKwkvKiBzYXZlIHRoZSBwSWVzIGZvciBsYXRlciB1c2UgKi8KKwlwUmVzdWx0LT5SZXN1bHQucHZJZXMgPSBwTmV3SWVzOworCS8qIHNhdmUgYnNzIGRlc2NyaXB0aW9uICovCisJY2RmX21lbV9jb3B5KCZwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvciwKKwkJICAgICAmcEJzc0Rlc2MtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLAorCQkgICAgIGJzc0xlbik7CisJLyoKKwkgKiBObyBuZWVkIHRvIGxvY2sgcFJldExpc3QgYmVjYXVzZSBpdCBpcyBsb2NhbGx5IGFsbG9jYXRlZCBhbmQgbm8KKwkgKiBvdXRzaWRlIGNhbiBhY2Nlc3MgaXQgYXQgdGhpcyB0aW1lCisJICovCisJaWYgKGNzcl9sbF9pc19saXN0X2VtcHR5KCZwUmV0TGlzdC0+TGlzdCwgTExfQUNDRVNTX05PTE9DSykpIHsKKwkJY3NyX2xsX2luc2VydF90YWlsKCZwUmV0TGlzdC0+TGlzdCwgJnBSZXN1bHQtPkxpbmssCisJCQkJICAgTExfQUNDRVNTX05PTE9DSyk7CisJCSgqY291bnQpKys7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcFRtcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcFJldExpc3QtPkxpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCXdoaWxlIChwVG1wRW50cnkpIHsKKwkJcFRtcFJlc3VsdCA9IEdFVF9CQVNFX0FERFIocFRtcEVudHJ5LCB0Q3NyU2NhblJlc3VsdCwgTGluayk7CisJCWlmIChjc3JfaXNfYmV0dGVyX2JzcyhwTWFjLCBwUmVzdWx0LCBwVG1wUmVzdWx0KSkgeworCQkJY3NyX2xsX2luc2VydF9lbnRyeSgmcFJldExpc3QtPkxpc3QsIHBUbXBFbnRyeSwKKwkJCQkJICAgICZwUmVzdWx0LT5MaW5rLCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCS8qIFRvIGluZGljYXRlIHdlIGFyZSBkb25lICovCisJCQlwUmVzdWx0ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCXBUbXBFbnRyeSA9IGNzcl9sbF9uZXh0KCZwUmV0TGlzdC0+TGlzdCwKKwkJCQkJcFRtcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl9CisJaWYgKHBSZXN1bHQgIT0gTlVMTCkgeworCQkvKiBUaGlzIG9uZSBpcyBub3QgYmV0dGVyIHRoYW4gYW55IG9uZSAqLworCQljc3JfbGxfaW5zZXJ0X3RhaWwoJnBSZXRMaXN0LT5MaXN0LCAmcFJlc3VsdC0+TGluaywKKwkJCQkgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl9CisJKCpjb3VudCkrKzsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNzcl9jYWxjX3ByZWZfdmFsX2J5X3BjbCgpIC0gdG8gY2FsY3VsYXRlIHByZWZlcnJlZCB2YWx1ZQorICogQG1hY19jdHg6IG1hYyBjb250ZXh0CisgKiBAZmlsdGVyOiBmaWx0ZXIgdG8gZmluZCBtYXRjaCBmcm9tIHNjYW4gcmVzdWx0CisgKiBAYnNzX2Rlc2NyOiBwb2ludGVyIHRvIGJzcyBkZXNjcmlwdG9yCisgKgorICogdGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIG5ldyBwcmVmZXJyZWQgdmFsdWUgdG8gYmUgZ2l2ZW4gdG8KKyAqIHByb3ZpZGVkIGJzcyBpZiBpdHMgY2hhbm5lbCBmYWxscyB1bmRlciBwcmVmZXJyZWQgY2hhbm5lbCBsaXN0LgorICogVGh1bXAgcnVsZSBpcyBoaWdlciB0aGUgUlNTSSBiZXR0ZXIgdGhlIGJvb3N0LgorICoKKyAqIFJldHVybjogc3VjY2VzcyBvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9jYWxjX3ByZWZfdmFsX2J5X3BjbCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJdENzclNjYW5SZXN1bHRGaWx0ZXIgKmZpbHRlciwKKwkJCXRDc3JTY2FuUmVzdWx0ICpic3NfZGVzY3IpCit7CisJaW50IHRlbXBfcnNzaSA9IDAsIG5ld19wcmVmX3ZhbCA9IDA7CisJaW50IG9yaWdfcHJlZl92YWwgPSAwOworCisJaWYgKE5VTEwgPT0gbWFjX2N0eCB8fCBOVUxMID09IGJzc19kZXNjcikKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKG1hY19jdHgtPnBvbGljeV9tYW5hZ2VyX2VuYWJsZWQgJiYKKwkJaXNfY2hhbm5lbF9mb3VuZF9pbl9wY2wobWFjX2N0eCwKKwkJCWJzc19kZXNjci0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkLCBmaWx0ZXIpICYmCisJCShic3NfZGVzY3ItPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLnJzc2kgPiBQQ0xfUlNTSV9USFJFU0hPTEQpKSB7CisJCW9yaWdfcHJlZl92YWwgPSBjc3JfZGVyaXZlX3ByZWZlcl92YWx1ZV9mcm9tX3Jzc2kobWFjX2N0eCwKKwkJCQkJYnNzX2Rlc2NyLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5yc3NpKTsKKwkJdGVtcF9yc3NpID0gYnNzX2Rlc2NyLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5yc3NpICsKKwkJCQkoUENMX0FEVkFOVEFHRS8oQ1NSX05VTV9SU1NJX0NBVCAtCisJCQkJCQkJb3JpZ19wcmVmX3ZhbCkpOworCQlpZiAodGVtcF9yc3NpID4gMCkKKwkJCXRlbXBfcnNzaSA9IDA7CisJCW5ld19wcmVmX3ZhbCA9IGNzcl9kZXJpdmVfcHJlZmVyX3ZhbHVlX2Zyb21fcnNzaShtYWNfY3R4LAorCQkJCQl0ZW1wX3Jzc2kpOworCisJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCIlcE06IHJzc2k6JWQgb3JnIHByZWY9JWQgdGVtcCByc3NpOiVkIG5ldyBwcmVmPSVkIHByZWY9JWQgdXBkYXRlZCBwcmVmPSVkIiksCisJCQlic3NfZGVzY3ItPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmJzc0lkLAorCQkJYnNzX2Rlc2NyLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5yc3NpLAorCQkJb3JpZ19wcmVmX3ZhbCwgdGVtcF9yc3NpLCBuZXdfcHJlZl92YWwsCisJCQlic3NfZGVzY3ItPnByZWZlclZhbHVlLAorCQkJQ1NSX01BWChuZXdfcHJlZl92YWwsIGJzc19kZXNjci0+cHJlZmVyVmFsdWUpKTsKKworCQlic3NfZGVzY3ItPnByZWZlclZhbHVlID0KKwkJCUNTUl9NQVgobmV3X3ByZWZfdmFsLCBic3NfZGVzY3ItPnByZWZlclZhbHVlKTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIENERl9TVEFUVVMKK2Nzcl9wYXJzZV9zY2FuX3Jlc3VsdHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJICAgICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwRmlsdGVyLAorCQkgICAgICAgdFNjYW5SZXN1bHRMaXN0ICpwUmV0TGlzdCwKKwkJICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwlib29sIGZNYXRjaCA9IGZhbHNlOworCXRDc3JTY2FuUmVzdWx0ICpwQnNzRGVzYyA9IE5VTEw7CisJdERvdDExZkJlYWNvbklFcyAqcEllcywgKnBOZXdJZXMgPSBOVUxMOworCWVDc3JFbmNyeXB0aW9uVHlwZSB1YywgbWM7CisJZUNzckF1dGhUeXBlIGF1dGggPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKwl1aW50MzJfdCBsZW4gPSAwOworCWVudW0gY2RzX2Nvbl9tb2RlIG5ld19tb2RlOworCisKKwljc3JfbGxfbG9jaygmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisKKwlpZiAocEZpbHRlcikgeworCQlpZiAoY2RzX21hcF9jb25jdXJyZW5jeV9tb2RlKHBNYWMtPmhIZGQsCisJCQkJCSZwRmlsdGVyLT5jc3JQZXJzb25hLCAmbmV3X21vZGUpKSB7CisJCQlzdGF0dXMgPSBjZHNfZ2V0X3BjbChwTWFjLT5oSGRkLCBuZXdfbW9kZSwKKwkJCQkmcEZpbHRlci0+cGNsX2NoYW5uZWxzLmNoYW5uZWxMaXN0WzBdLCAmbGVuKTsKKwkJCXBGaWx0ZXItPnBjbF9jaGFubmVscy5udW1DaGFubmVscyA9ICh1aW50OF90KWxlbjsKKwkJfQorCX0KKworCWlmIChDREZfU1RBVFVTX0VfRkFJTFVSRSA9PSBzdGF0dXMpCisJCXNtc19sb2cocE1hYywgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIlJldHJpZXZpbmcgcGNsIGZhaWxlZCBmcm9tIEhERCIpKTsKKwlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl3aGlsZSAocEVudHJ5KSB7CisJCXBCc3NEZXNjID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKwkJcEllcyA9ICh0RG90MTFmQmVhY29uSUVzICopIChwQnNzRGVzYy0+UmVzdWx0LnB2SWVzKTsKKwkJLyoKKwkJICogaWYgcEJzc0Rlc2MtPlJlc3VsdC5wdkllcyBpcyBOVUxMLCB3ZSBuZWVkIHRvIGZyZWUgYW55IG1lbW9yeQorCQkgKiBhbGxvY2F0ZWQgYnkgY3NyX21hdGNoX2JzcyBmb3IgYW55IGVycm9yIGNvbmRpdGlvbiwKKwkJICogb3RoZXJ3aWFzZSwgaXQgd2lsbCBiZSBmcmVlZCBsYXRlcgorCQkgKi8KKwkJZk1hdGNoID0gZmFsc2U7CisJCXBOZXdJZXMgPSBOVUxMOworCQlzdGF0dXMgPSBjc3Jfc2F2ZV9pZXMocE1hYywgcEZpbHRlciwgcEJzc0Rlc2MsICZwTmV3SWVzLAorCQkJCSAgICAgICZmTWF0Y2gsICZ1YywgJm1jLCAmYXV0aCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQlicmVhazsKKwkJLyoKKwkJICogTW9kaWZ5IHRoZSBwcmVmZXIgdmFsdWUgdG8gaG9ub3IgUENMIGxpc3QKKwkJICovCisJCWlmIChwRmlsdGVyICYmIHBGaWx0ZXItPnBjbF9jaGFubmVscy5udW1DaGFubmVscyA+IDApCisJCQljc3JfY2FsY19wcmVmX3ZhbF9ieV9wY2wocE1hYywgcEZpbHRlciwgcEJzc0Rlc2MpOworCQlzdGF0dXMgPSBjc3Jfc2F2ZV9zY2FuX2VudHJ5KHBNYWMsIHBGaWx0ZXIsIGZNYXRjaCwgcEJzc0Rlc2MsCisJCQkJCSAgICAgcE5ld0llcywgcFJldExpc3QsIGNvdW50LCB1YywgbWMsCisJCQkJCSAgICAgJmF1dGgpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJYnJlYWs7CisJCXBFbnRyeSA9IGNzcl9sbF9uZXh0KCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBwRW50cnksCisJCQkJICAgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl9IC8qIHdoaWxlICovCisJY3NyX2xsX3VubG9jaygmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9nZXRfcmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgICAgdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBGaWx0ZXIsCisJCQkgICAgICAgdFNjYW5SZXN1bHRIYW5kbGUgKnBoUmVzdWx0KQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRTY2FuUmVzdWx0TGlzdCAqcFJldExpc3Q7CisJdWludDMyX3QgY291bnQgPSAwOworCisJaWYgKHBoUmVzdWx0KQorCQkqcGhSZXN1bHQgPSBDU1JfSU5WQUxJRF9TQ0FOUkVTVUxUX0hBTkRMRTsKKworCWNzcl9wcmVmZXJfNWdoeihwTWFjLCBwRmlsdGVyKTsKKworCXBSZXRMaXN0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTY2FuUmVzdWx0TGlzdCkpOworCWlmIChOVUxMID09IHBSZXRMaXN0KQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCisJY2RmX21lbV9zZXQocFJldExpc3QsIHNpemVvZih0U2NhblJlc3VsdExpc3QpLCAwKTsKKwljc3JfbGxfb3BlbihwTWFjLT5oSGRkLCAmcFJldExpc3QtPkxpc3QpOworCXBSZXRMaXN0LT5wQ3VyRW50cnkgPSBOVUxMOworCXN0YXR1cyA9IGNzcl9wYXJzZV9zY2FuX3Jlc3VsdHMocE1hYywgcEZpbHRlciwgcFJldExpc3QsICZjb3VudCk7CisJc21zX2xvZyhwTWFjLCBMT0cyLCBGTCgicmV0dXJuICVkIEJTUyIpLCBjc3JfbGxfY291bnQoJnBSZXRMaXN0LT5MaXN0KSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSB8fCAocGhSZXN1bHQgPT0gTlVMTCkpIHsKKwkJLyogRmFpbCBvciBObyBvbmUgd2FudHMgdGhlIHJlc3VsdC4gKi8KKwkJY3NyX3NjYW5fcmVzdWx0X3B1cmdlKHBNYWMsICh0U2NhblJlc3VsdEhhbmRsZSkgcFJldExpc3QpOworCX0gZWxzZSB7CisJCWlmICgwID09IGNvdW50KSB7CisJCQkvKiBXZSBhcmUgaGVyZSBtZWFuaW5nIHRoZSB0aGVyZSBpcyBubyBtYXRjaCAqLworCQkJY3NyX2xsX2Nsb3NlKCZwUmV0TGlzdC0+TGlzdCk7CisJCQljZGZfbWVtX2ZyZWUocFJldExpc3QpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05VTExfVkFMVUU7CisJCX0gZWxzZSBpZiAocGhSZXN1bHQpIHsKKwkJCSpwaFJlc3VsdCA9IHBSZXRMaXN0OworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBOT1RFOiBUaGlzIHJvdXRpbmUgaXMgYmVpbmcgYWRkZWQgdG8gbWFrZQorICogc3VyZSB0aGF0IHNjYW4gcmVzdWx0cyBhcmUgbm90IGJlaW5nIGZsdXNoZWQKKyAqIHdoaWxlIHJvYW1pbmcuIElmIHRoZSBzY2FuIHJlc3VsdHMgYXJlIGZsdXNoZWQsCisgKiB3ZSBhcmUgdW5hYmxlIHRvIHJlY292ZXIgZnJvbQorICogY3NyX3JvYW1fcm9hbWluZ19zdGF0ZV9kaXNhc3NvY19yc3BfcHJvY2Vzc29yLgorICogSWYgaXQgaXMgbmVlZGVkIHRvIHJlbW92ZSB0aGlzIHJvdXRpbmUsCisgKiBmaXJzdCBlbnN1cmUgdGhhdCB3ZSByZWNvdmVyIGdyYWNlZnVsbHkgZnJvbQorICogY3NyX3JvYW1fcm9hbWluZ19zdGF0ZV9kaXNhc3NvY19yc3BfcHJvY2Vzc29yIGlmCisgKiBjc3Jfc2Nhbl9nZXRfcmVzdWx0IHJldHVybnMgd2l0aCBhIGZhaWx1cmUgYmVjYXVzZQorICogb2Ygbm90IGJlaW5nIGFibGUgdG8gZmluZCB0aGUgcm9hbWluZyBCU1MuCisgKi8KK2Jvb2wgY3NyX3NjYW5fZmx1c2hfZGVuaWVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDhfdCBzZXNzaW9uSWQ7CisKKwlmb3IgKHNlc3Npb25JZCA9IDA7IHNlc3Npb25JZCA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBzZXNzaW9uSWQrKykgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQkJaWYgKGNzcl9uZWlnaGJvcl9taWRkbGVfb2Zfcm9hbWluZyhwTWFjLCBzZXNzaW9uSWQpKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitDREZfU1RBVFVTIGNzcl9zY2FuX2ZsdXNoX3Jlc3VsdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCWJvb2wgaXNGbHVzaERlbmllZCA9IGNzcl9zY2FuX2ZsdXNoX2RlbmllZChwTWFjKTsKKworCWlmIChpc0ZsdXNoRGVuaWVkKSB7CisJCXNtc19sb2cocE1hYywgTE9HVywgIiVzOiBzY2FuIGZsdXNoIGRlbmllZCBpbiByb2FtIHN0YXRlICVkIiwKKwkJCV9fZnVuY19fLCBpc0ZsdXNoRGVuaWVkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXNtc19sb2cocE1hYywgTE9HNCwgIiVzOiBGbHVzaGluZyBhbGwgc2NhbiByZXN1bHRzIiwgX19mdW5jX18pOworCWNzcl9sbF9zY2FuX3B1cmdlX3Jlc3VsdChwTWFjLCAmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMpOworCWNzcl9sbF9zY2FuX3B1cmdlX3Jlc3VsdChwTWFjLCAmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9mbHVzaF9zZWxlY3RpdmVfcmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIGJvb2wgZmx1c2hQMlApCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdExpc3RFbGVtICpwRW50cnksICpwRnJlZUVsZW07CisJdENzclNjYW5SZXN1bHQgKnBCc3NEZXNjOworCXREYmxMaW5rTGlzdCAqcExpc3QgPSAmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdDsKKworCWNzcl9sbF9sb2NrKHBMaXN0KTsKKworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQocExpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCXdoaWxlIChwRW50cnkgIT0gTlVMTCkgeworCQlwQnNzRGVzYyA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0Q3NyU2NhblJlc3VsdCwgTGluayk7CisJCWlmIChmbHVzaFAyUCA9PSBjZGZfbWVtX2NvbXBhcmUocEJzc0Rlc2MtPlJlc3VsdC5zc0lkLnNzSWQsCisJCQkJCQkiRElSRUNULSIsIDcpKSB7CisJCQlwRnJlZUVsZW0gPSBwRW50cnk7CisJCQlwRW50cnkgPSBjc3JfbGxfbmV4dChwTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCWNzcl9sbF9yZW1vdmVfZW50cnkocExpc3QsIHBGcmVlRWxlbSwgTExfQUNDRVNTX05PTE9DSyk7CisJCQljc3JfZnJlZV9zY2FuX3Jlc3VsdF9lbnRyeShwTWFjLCBwQnNzRGVzYyk7CisJCQljb250aW51ZTsKKwkJfQorCQlwRW50cnkgPSBjc3JfbGxfbmV4dChwTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl9CisKKwljc3JfbGxfdW5sb2NrKHBMaXN0KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgY3NyX3NjYW5fZmx1c2hfYnNzX2VudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgICB0cFNtZUNzYU9mZmxvYWRJbmQgcENzYU9mZmxvYWRJbmQpCit7CisJdExpc3RFbGVtICpwRW50cnksICpwRnJlZUVsZW07CisJdENzclNjYW5SZXN1bHQgKnBCc3NEZXNjOworCXREYmxMaW5rTGlzdCAqcExpc3QgPSAmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdDsKKworCWNzcl9sbF9sb2NrKHBMaXN0KTsKKworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQocExpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCXdoaWxlIChwRW50cnkgIT0gTlVMTCkgeworCQlwQnNzRGVzYyA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0Q3NyU2NhblJlc3VsdCwgTGluayk7CisJCWlmIChjZGZfbWVtX2NvbXBhcmUocEJzc0Rlc2MtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmJzc0lkLAorCQkJcENzYU9mZmxvYWRJbmQtPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKSkgeworCQkJcEZyZWVFbGVtID0gcEVudHJ5OworCQkJcEVudHJ5ID0gY3NyX2xsX25leHQocExpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyk7CisJCQljc3JfbGxfcmVtb3ZlX2VudHJ5KHBMaXN0LCBwRnJlZUVsZW0sIExMX0FDQ0VTU19OT0xPQ0spOworCQkJY3NyX2ZyZWVfc2Nhbl9yZXN1bHRfZW50cnkocE1hYywgcEJzc0Rlc2MpOworCQkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiUmVtb3ZlZCBCU1MgZW50cnk6JXBNIiksCisJCQkJcENzYU9mZmxvYWRJbmQtPmJzc0lkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcEVudHJ5ID0gY3NyX2xsX25leHQocExpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyk7CisJfQorCisJY3NyX2xsX3VubG9jayhwTGlzdCk7Cit9CisKKy8qKgorICogY3NyX2NoZWNrMTFkX2NoYW5uZWwKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGNzcl9zY2FuX2ZpbHRlcl9yZXN1bHRzIGZ1bmN0aW9uIGFuZAorICogY29tcGFyZSBjaGFubmVsIG51bWJlciB3aXRoIGdpdmVuIGNoYW5uZWwgbGlzdC4KKyAqCisgKioqTE9HSUM6CisgKiBDaGVjayBTY2FuIHJlc3VsdCBjaGFubmVsIG51bWJlciB3aXRoIENGRyBjaGFubmVsIGxpc3QKKyAqCisgKioqQVNTVU1QVElPTlM6CisgKgorICoKKyAqKipOT1RFOgorICoKKyAqIEBwYXJhbSAgY2hhbm5lbElkICAgICAgY2hhbm5lbCBudW1iZXIKKyAqIEBwYXJhbSAgcENoYW5uZWxMaXN0ICAgUG9pbnRlciB0byBjaGFubmVsIGxpc3QKKyAqIEBwYXJhbSAgbnVtQ2hhbm5lbHMgICAgTnVtYmVyIG9mIGNoYW5uZWwgaW4gY2hhbm5lbCBsaXN0CisgKgorICogQHJldHVybiBTdGF0dXMKKyAqLworCitDREZfU1RBVFVTIGNzcl9jaGVjazExZF9jaGFubmVsKHVpbnQ4X3QgY2hhbm5lbElkLCB1aW50OF90ICpwQ2hhbm5lbExpc3QsCisJCQkJdWludDMyX3QgbnVtQ2hhbm5lbHMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl1aW50OF90IGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG51bUNoYW5uZWxzOyBpKyspIHsKKwkJaWYgKHBDaGFubmVsTGlzdFtpXSA9PSBjaGFubmVsSWQpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY3NyX3NjYW5fZmlsdGVyX3Jlc3VsdHMKKyAqCisgKioqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGNzcl9hcHBseV9jb3VudHJ5X2luZm9ybWF0aW9uIGZ1bmN0aW9uIGFuZAorICogZmlsdGVyIHNjYW4gcmVzdWx0IGJhc2VkIG9uIHZhbGlkIGNoYW5uZWwgbGlzdCBudW1iZXIuCisgKgorICoqKkxPR0lDOgorICogR2V0IHNjYW4gcmVzdWx0IGZyb20gc2NhbiBsaXN0IGFuZCBDaGVjayBTY2FuIHJlc3VsdCBjaGFubmVsIG51bWJlcgorICogd2l0aCAxMWQgY2hhbm5lbCBsaXN0IGlmIGNoYW5uZWwgbnVtYmVyIGlzIGZvdW5kIGluIDExZCBjaGFubmVsIGxpc3QKKyAqIHRoZW4gZG8gbm90IHJlbW92ZSBzY2FuIHJlc3VsdCBlbnRyeSBmcm9tIHNjYW4gbGlzdAorICoKKyAqKipBU1NVTVBUSU9OUzoKKyAqCisgKgorICoqKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogQHJldHVybiBTdGF0dXMKKyAqLworCitDREZfU1RBVFVTIGNzcl9zY2FuX2ZpbHRlcl9yZXN1bHRzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdExpc3RFbGVtICpwRW50cnksICpwVGVtcEVudHJ5OworCXRDc3JTY2FuUmVzdWx0ICpwQnNzRGVzYzsKKwl1aW50MzJfdCBsZW4gPSBzaXplb2YocE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0KTsKKworCS8qIEdldCB2YWxpZCBjaGFubmVscyBsaXN0IGZyb20gQ0ZHICovCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY3NyX2dldF9jZmdfdmFsaWRfY2hhbm5lbHMocE1hYywKKwkJCQkJCQkgICAgICBwTWFjLT5yb2FtLgorCQkJCQkJCSAgICAgIHZhbGlkQ2hhbm5lbExpc3QsCisJCQkJCQkJICAgICAgJmxlbikpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgIkZhaWxlZCB0byBnZXQgQ2hhbm5lbCBsaXN0IGZyb20gQ0ZHIik7CisJfQorCisJY3NyX2xsX2xvY2soJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QpOworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCXdoaWxlIChwRW50cnkpIHsKKwkJcEJzc0Rlc2MgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQlwVGVtcEVudHJ5ID0gY3NyX2xsX25leHQoJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsIHBFbnRyeSwKKwkJCQkJIExMX0FDQ0VTU19OT0xPQ0spOworCQlpZiAoY3NyX2NoZWNrMTFkX2NoYW5uZWwocEJzc0Rlc2MtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCwKKwkJCQkJIHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCwgbGVuKSkgeworCQkJLyogUmVtb3ZlIFNjYW4gcmVzdWx0IHdoaWNoIGRvZXMgbm90IGhhdmUgMTFkIGNoYW5uZWwgKi8KKwkJCWlmIChjc3JfbGxfcmVtb3ZlX2VudHJ5KCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LAorCQkJCSBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spKSB7CisJCQkJY3NyX2ZyZWVfc2Nhbl9yZXN1bHRfZW50cnkocE1hYywgcEJzc0Rlc2MpOworCQkJfQorCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiJWQgaXMgYSBWYWxpZCBjaGFubmVsIiksCisJCQkJcEJzc0Rlc2MtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCk7CisJCX0KKwkJcEVudHJ5ID0gcFRlbXBFbnRyeTsKKwl9CisKKwljc3JfbGxfdW5sb2NrKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0KTsKKwljc3JfbGxfbG9jaygmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMpOworCisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMsCisJCQkJCSBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl3aGlsZSAocEVudHJ5KSB7CisJCXBCc3NEZXNjID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKwkJcFRlbXBFbnRyeSA9IGNzcl9sbF9uZXh0KCZwTWFjLT5zY2FuLnRlbXBTY2FuUmVzdWx0cywgcEVudHJ5LAorCQkJCQkgTExfQUNDRVNTX05PTE9DSyk7CisJCWlmIChjc3JfY2hlY2sxMWRfY2hhbm5lbChwQnNzRGVzYy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkLAorCQkJCQkgcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCBsZW4pKSB7CisJCQkvKiBSZW1vdmUgU2NhbiByZXN1bHQgd2hpY2ggZG9lcyBub3QgaGF2ZSAxMWQgY2hhbm5lbCAqLworCQkJaWYgKGNzcl9sbF9yZW1vdmVfZW50cnkKKwkJCQkgICAgKCZwTWFjLT5zY2FuLnRlbXBTY2FuUmVzdWx0cywgcEVudHJ5LAorCQkJCSAgICBMTF9BQ0NFU1NfTk9MT0NLKSkgeworCQkJCWNzcl9mcmVlX3NjYW5fcmVzdWx0X2VudHJ5KHBNYWMsIHBCc3NEZXNjKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cocE1hYywgTE9HMSwgRkwoIiVkIGlzIGEgVmFsaWQgY2hhbm5lbCIpLAorCQkJCXBCc3NEZXNjLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5jaGFubmVsSWQpOworCQl9CisJCXBFbnRyeSA9IHBUZW1wRW50cnk7CisJfQorCisJY3NyX2xsX3VubG9jaygmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NjYW5fY29weV9yZXN1bHRfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2NhblJlc3VsdEhhbmRsZSBoSW4sCisJCQkJICAgICB0U2NhblJlc3VsdEhhbmRsZSAqcGhSZXN1bHQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNjYW5SZXN1bHRMaXN0ICpwUmV0TGlzdCwgKnBJbkxpc3QgPSAodFNjYW5SZXN1bHRMaXN0ICopIGhJbjsKKwl0Q3NyU2NhblJlc3VsdCAqcFJlc3VsdCwgKnBTY2FuUmVzdWx0OworCXVpbnQzMl90IGNvdW50ID0gMDsKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwl1aW50MzJfdCBic3NMZW4sIGFsbG9jTGVuOworCisJaWYgKHBoUmVzdWx0KSB7CisJCSpwaFJlc3VsdCA9IENTUl9JTlZBTElEX1NDQU5SRVNVTFRfSEFORExFOworCX0KKwlwUmV0TGlzdCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2NhblJlc3VsdExpc3QpKTsKKwlpZiAoTlVMTCA9PSBwUmV0TGlzdCkKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCWVsc2UgeworCQljZGZfbWVtX3NldChwUmV0TGlzdCwgc2l6ZW9mKHRTY2FuUmVzdWx0TGlzdCksIDApOworCQljc3JfbGxfb3BlbihwTWFjLT5oSGRkLCAmcFJldExpc3QtPkxpc3QpOworCQlwUmV0TGlzdC0+cEN1ckVudHJ5ID0gTlVMTDsKKwkJY3NyX2xsX2xvY2soJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QpOworCQljc3JfbGxfbG9jaygmcEluTGlzdC0+TGlzdCk7CisKKwkJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcEluTGlzdC0+TGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisJCXdoaWxlIChwRW50cnkpIHsKKwkJCXBTY2FuUmVzdWx0ID0KKwkJCQlHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQkJYnNzTGVuID0KKwkJCQlwU2NhblJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IubGVuZ3RoICsKKwkJCQlzaXplb2YocFNjYW5SZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmxlbmd0aCk7CisJCQlhbGxvY0xlbiA9IHNpemVvZih0Q3NyU2NhblJlc3VsdCkgKyBic3NMZW47CisJCQlwUmVzdWx0ID0gY2RmX21lbV9tYWxsb2MoYWxsb2NMZW4pOworCQkJaWYgKE5VTEwgPT0gcFJlc3VsdCkKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCQllbHNlCisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCWNzcl9zY2FuX3Jlc3VsdF9wdXJnZShwTWFjLAorCQkJCQkJICAgICAgKHRTY2FuUmVzdWx0SGFuZGxlICopCisJCQkJCQkgICAgICBwUmV0TGlzdCk7CisJCQkJY291bnQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJY2RmX21lbV9zZXQocFJlc3VsdCwgYWxsb2NMZW4sIDApOworCQkJY2RmX21lbV9jb3B5KCZwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvciwKKwkJCQkgICAgICZwU2NhblJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IsCisJCQkJICAgICBic3NMZW4pOworCQkJaWYgKHBTY2FuUmVzdWx0LT5SZXN1bHQucHZJZXMpIHsKKwkJCQlwUmVzdWx0LT5SZXN1bHQucHZJZXMgPQorCQkJCQljZGZfbWVtX21hbGxvYyhzaXplb2YodERvdDExZkJlYWNvbklFcykpOworCQkJCWlmIChOVUxMID09IHBSZXN1bHQtPlJlc3VsdC5wdkllcykKKwkJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQkJCWVsc2UKKwkJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQkJLyogRnJlZSB0aGUgbWVtb3J5IHdlIGFsbG9jYXRlIGFib3ZlIGZpcnN0ICovCisJCQkJCWNkZl9tZW1fZnJlZShwUmVzdWx0KTsKKwkJCQkJY3NyX3NjYW5fcmVzdWx0X3B1cmdlKHBNYWMsCisJCQkJCQkJICAgICAgKHRTY2FuUmVzdWx0SGFuZGxlICopCisJCQkJCQkJICAgICAgcFJldExpc3QpOworCQkJCQljb3VudCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljZGZfbWVtX2NvcHkocFJlc3VsdC0+UmVzdWx0LnB2SWVzLAorCQkJCQkgICAgIHBTY2FuUmVzdWx0LT5SZXN1bHQucHZJZXMsCisJCQkJCSAgICAgc2l6ZW9mKHREb3QxMWZCZWFjb25JRXMpKTsKKwkJCX0KKwkJCWNzcl9sbF9pbnNlcnRfdGFpbCgmcFJldExpc3QtPkxpc3QsICZwUmVzdWx0LT5MaW5rLAorCQkJCQkgICBMTF9BQ0NFU1NfTE9DSyk7CisJCQljb3VudCsrOworCQkJcEVudHJ5ID0KKwkJCQljc3JfbGxfbmV4dCgmcEluTGlzdC0+TGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJfSAvKiB3aGlsZSAqLworCQljc3JfbGxfdW5sb2NrKCZwSW5MaXN0LT5MaXN0KTsKKwkJY3NyX2xsX3VubG9jaygmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlpZiAoMCA9PSBjb3VudCkgeworCQkJCWNzcl9sbF9jbG9zZSgmcFJldExpc3QtPkxpc3QpOworCQkJCWNkZl9tZW1fZnJlZShwUmV0TGlzdCk7CisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05VTExfVkFMVUU7CisJCQl9IGVsc2UgaWYgKHBoUmVzdWx0KSB7CisJCQkJKnBoUmVzdWx0ID0gcFJldExpc3Q7CisJCQl9CisJCX0KKwl9IC8qIEFsbG9jYXRlZCBwUmV0TGlzdCAqLworCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbm5pbmdfc3RhdGVfbXNnX3Byb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCBwTWFjLAorCXZvaWQgKnBNc2dCdWYpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNpck1iTXNnICpwTXNnID0gKHRTaXJNYk1zZyAqKSBwTXNnQnVmOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisJdFNpclNtZUFzc29jSW5kVG9VcHBlckxheWVyQ25mICpwVXBwZXJMYXllckFzc29jQ25mOworCXRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKwl0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbyA9IE5VTEw7CisJdWludDMyX3Qgc2Vzc2lvbklkOworCisJaWYgKGVXTklfU01FX1NDQU5fUlNQID09IHBNc2ctPnR5cGUpCisJCXJldHVybiBjc3Jfc2Nhbl9zbWVfc2Nhbl9yZXNwb25zZShwTWFjLCBwTXNnQnVmKTsKKworCWlmIChwTXNnLT50eXBlICE9IGVXTklfU01FX1VQUEVSX0xBWUVSX0FTU09DX0NORikgeworCQlpZiAoY3NyX2lzX2FueV9zZXNzaW9uX2luX2Nvbm5lY3Rfc3RhdGUocE1hYykpIHsKKwkJCS8qCisJCQkgKiBJbiBjYXNlIG9mIHdlIGFyZSBjb25uZWN0ZWQsIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlcgorCQkJICogY29ubmVjdCBzdGF0dXMgY2hhbmdlcyBiZWNhdXNlIHNjYW4gbWF5IGFsc28gcnVuCisJCQkgKiB3aGlsZSBjb25uZWN0ZWQuCisJCQkgKi8KKwkJCWNzcl9yb2FtX2NoZWNrX2Zvcl9saW5rX3N0YXR1c19jaGFuZ2UocE1hYywKKwkJCQkJCSh0U2lyU21lUnNwICopIHBNc2dCdWYpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCUZMKCJNZXNzYWdlIFsweCUwNHhdIHJlY2VpdmVkIGluIHdyb25nIHN0YXRlIiksCisJCQkJcE1zZy0+dHlwZSk7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzbXNfbG9nKHBNYWMsIExPRzEsCisJCUZMKCJTY2FubmluZzogQVNTT0MgY25mIGNhbiBiZSBnaXZlbiB0byB1cHBlciBsYXllciIpKTsKKwljZGZfbWVtX3NldCgmcm9hbUluZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pLCAwKTsKKwlwUm9hbUluZm8gPSAmcm9hbUluZm87CisJcFVwcGVyTGF5ZXJBc3NvY0NuZiA9ICh0U2lyU21lQXNzb2NJbmRUb1VwcGVyTGF5ZXJDbmYgKikgcE1zZ0J1ZjsKKwlzdGF0dXMgPSBjc3Jfcm9hbV9nZXRfc2Vzc2lvbl9pZF9mcm9tX2Jzc2lkKHBNYWMsCisJCQkoc3RydWN0IGNkZl9tYWNfYWRkciAqKXBVcHBlckxheWVyQXNzb2NDbmYtPmJzc0lkLCAmc2Vzc2lvbklkKTsKKwlwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyogc2VuZCB0aGUgc3RhdHVzIGNvZGUgYXMgU3VjY2VzcyAqLworCXBSb2FtSW5mby0+c3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisJcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlID0gJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCXBSb2FtSW5mby0+c3RhSWQgPSAodWludDhfdCkgcFVwcGVyTGF5ZXJBc3NvY0NuZi0+YWlkOworCXBSb2FtSW5mby0+cnNuSUVMZW4gPSAodWludDhfdCkgcFVwcGVyTGF5ZXJBc3NvY0NuZi0+cnNuSUUubGVuZ3RoOworCXBSb2FtSW5mby0+cHJzbklFID0gcFVwcGVyTGF5ZXJBc3NvY0NuZi0+cnNuSUUucnNuSUVkYXRhOworCXBSb2FtSW5mby0+YWRkSUVMZW4gPSAodWludDhfdCkgcFVwcGVyTGF5ZXJBc3NvY0NuZi0+YWRkSUUubGVuZ3RoOworCXBSb2FtSW5mby0+cGFkZElFID0gcFVwcGVyTGF5ZXJBc3NvY0NuZi0+YWRkSUUuYWRkSUVkYXRhOworCWNkZl9tZW1fY29weShwUm9hbUluZm8tPnBlZXJNYWMuYnl0ZXMsCisJCQlwVXBwZXJMYXllckFzc29jQ25mLT5wZWVyTWFjQWRkciwKKwkJCUNERl9NQUNfQUREUl9TSVpFKTsKKwljZGZfbWVtX2NvcHkoJnBSb2FtSW5mby0+YnNzaWQuYnl0ZXMsIHBVcHBlckxheWVyQXNzb2NDbmYtPmJzc0lkLAorCQkgICAgIENERl9NQUNfQUREUl9TSVpFKTsKKwlwUm9hbUluZm8tPndtbUVuYWJsZWRTdGEgPSBwVXBwZXJMYXllckFzc29jQ25mLT53bW1FbmFibGVkU3RhOworCWlmIChDU1JfSVNfSU5GUkFfQVAocFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlKSkgeworCQlwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlID0KKwkJCWVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JTkZSQV9DT05ORUNURUQ7CisJCXBSb2FtSW5mby0+ZlJlYXNzb2NSZXEgPSBwVXBwZXJMYXllckFzc29jQ25mLT5yZWFzc29jUmVxOworCQlzdGF0dXMgPSBjc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJcFJvYW1JbmZvLCAwLAorCQkJCQllQ1NSX1JPQU1fSU5GUkFfSU5ELAorCQkJCQllQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0FTU09DSUFUSU9OX0NORik7CisJfQorCWlmIChDU1JfSVNfV0RTX0FQKHBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZSkpIHsKKwkJY2RmX3NsZWVwKDEwMCk7CisJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGUgPQorCQkJZUNTUl9BU1NPQ19TVEFURV9UWVBFX1dEU19DT05ORUNURUQ7CisJCXN0YXR1cyA9IGNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIDAsCisJCQkJZUNTUl9ST0FNX1dEU19JTkQsCisJCQkJZUNTUl9ST0FNX1JFU1VMVF9XRFNfQVNTT0NJQVRJT05fSU5EKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBjc3JfY2hlY2tfbl9zYXZlX3dzY19pZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBOZXdCc3NEZXNjciwKKwkJCSAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwT2xkQnNzRGVzY3IpCit7CisJaW50IGlkeCwgbGVuOworCXVpbnQ4X3QgKnBiSWU7CisKKwkvKiBJZiBmYWlsZWQgdG8gcmVtb3ZlLCBhc3N1bWluZyBzb21lb25lIGVsc2UgZ290IGl0LiAqLworCWlmICgocE5ld0Jzc0Rlc2NyLT5mUHJvYmVSc3AgIT0gcE9sZEJzc0Rlc2NyLT5mUHJvYmVSc3ApICYmCisJICAgICgwID09IHBOZXdCc3NEZXNjci0+V3NjSWVMZW4pKSB7CisJCWlkeCA9IDA7CisJCWxlbiA9IHBPbGRCc3NEZXNjci0+bGVuZ3RoIC0gc2l6ZW9mKHRTaXJCc3NEZXNjcmlwdGlvbikgKworCQkgICAgICBzaXplb2YodWludDE2X3QpICsgc2l6ZW9mKHVpbnQzMl90KSAtCisJCSAgICAgIERPVDExRl9JRV9XU0NQUk9CRVJFU19NSU5fTEVOIC0gMjsKKwkJcGJJZSA9ICh1aW50OF90ICopIHBPbGRCc3NEZXNjci0+aWVGaWVsZHM7CisJCS8qIFNhdmUgV1BTIElFIGlmIGl0IGV4aXN0cyAqLworCQlwTmV3QnNzRGVzY3ItPldzY0llTGVuID0gMDsKKwkJd2hpbGUgKGlkeCA8IGxlbikgeworCQkJaWYgKChET1QxMUZfRUlEX1dTQ1BST0JFUkVTID09IHBiSWVbMF0pICYmCisJCQkgICAgKDB4MDAgPT0gcGJJZVsyXSkgJiYgKDB4NTAgPT0gcGJJZVszXSkKKwkJCSAgICAmJiAoMHhmMiA9PSBwYkllWzRdKSAmJiAoMHgwNCA9PSBwYkllWzVdKSkgeworCQkJCS8qIEZvdW5yZCBpdCAqLworCQkJCWlmICgoRE9UMTFGX0lFX1dTQ1BST0JFUkVTX01BWF9MRU4gLSAyKSA+PQorCQkJCSAgICBwYkllWzFdKSB7CisJCQkJCWNkZl9tZW1fY29weShwTmV3QnNzRGVzY3ItPgorCQkJCQkJICAgICBXc2NJZVByb2JlUnNwLCBwYkllLAorCQkJCQkJICAgICBwYkllWzFdICsgMik7CisJCQkJCXBOZXdCc3NEZXNjci0+V3NjSWVMZW4gPSBwYkllWzFdICsgMjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZHggKz0gcGJJZVsxXSArIDI7CisJCQlwYkllICs9IHBiSWVbMV0gKyAyOworCQl9CisJfQorfQorCisvKiBwSWVzIG1heSBiZSBOVUxMICovCitib29sIGNzcl9yZW1vdmVfZHVwX2Jzc19kZXNjcmlwdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICB0U2lyQnNzRGVzY3JpcHRpb24gKmJzc19kc2NwLAorCQkJCSAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0QW5pU1NJRCAqcFNzaWQsCisJCQkJICAgIHZfVElNRV90ICp0aW1lciwgYm9vbCBmRm9yY2VkKQoreworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRDc3JTY2FuUmVzdWx0ICpzY2FuX2VudHJ5OworCWJvb2wgZlJDID0gZmFsc2U7CisJaW50OF90IHNjYW5fZW50cnlfcnNzaSA9IDA7CisKKwkvKgorCSAqIFdhbGsgdGhyb3VnaCBhbGwgdGhlIGNoYWluZWQgQnNzRGVzY3JpcHRpb25zLiBJZiB3ZSBmaW5kIGEgY2hhaW5lZAorCSAqIEJzc0Rlc2NyaXB0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgQnNzSUQgb2YgdGhlIEJzc0Rlc2NyaXB0aW9uIHBhc3NlZAorCSAqIGluLCB0aGVuIHRoZXNlIG11c3QgYmUgZHVwbGljYXRlIHNjYW4gcmVzdWx0cyBmb3IgdGhpcyBCc3MuIEluIHRoYXQKKwkgKiBjYXNlLCByZW1vdmUgdGhlICdvbGQnIEJzcyBkZXNjcmlwdGlvbiBmcm9tIHRoZSBsaW5rZWQgbGlzdC4KKwkgKi8KKwljc3JfbGxfbG9jaygmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisKKwl3aGlsZSAocEVudHJ5KSB7CisJCXNjYW5fZW50cnkgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQkvKgorCQkgKiB3ZSBoYXZlIGEgZHVwbGljYXRlIHNjYW4gcmVzdWx0cyBvbmx5IHdoZW4gQlNTSUQsIFNTSUQsCisJCSAqIENoYW5uZWwgYW5kIE5ldHdvcmtUeXBlIG1hdGNoZXMKKwkJICovCisJCWlmIChjc3JfaXNfZHVwbGljYXRlX2Jzc19kZXNjcmlwdGlvbihwTWFjLAorCQkJJnNjYW5fZW50cnktPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLAorCQkJYnNzX2RzY3AsIHBJZXMsIGZGb3JjZWQpKSB7CisJCQkvKgorCQkJICogRm9sbG93aW5nIGlzIG1hdGhlbWF0aWNhbGx5IGEgPSAoYVggKyBiKDEwMC1YKSkvMTAwCisJCQkgKiB3aGVyZToKKwkJCSAqIGEgPSBic3NfZHNjcC0+cnNzaSwgYiA9IHNjYW5fZW50cnlfcnNzaQorCQkJICogYW5kIFggPSBDU1JfU0NBTl9SRVNVTFRfUlNTSV9XRUlHSFQKKwkJCSAqLworCQkJc2Nhbl9lbnRyeV9yc3NpID0gc2Nhbl9lbnRyeS0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IucnNzaTsKKwkJCWJzc19kc2NwLT5yc3NpID0gKGludDhfdCkgKCgoKGludDMyX3QpIGJzc19kc2NwLT5yc3NpICoKKwkJCQkJCUNTUl9TQ0FOX1JFU1VMVF9SU1NJX1dFSUdIVCkgKworCQkJCSgoaW50MzJfdCkgc2Nhbl9lbnRyeV9yc3NpICoKKwkJCQkgKDEwMCAtIENTUl9TQ0FOX1JFU1VMVF9SU1NJX1dFSUdIVCkpKSAvIDEwMCk7CisJCQkvKiBSZW1vdmUgdGhlIG9sZCBlbnRyeSBmcm9tIHRoZSBsaXN0ICovCisJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeQorCQkJCSAgICAoJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsIHBFbnRyeSwKKwkJCQkgICAgTExfQUNDRVNTX05PTE9DSykpIHsKKwkJCQkvKgorCQkJCSAqIHdlIG5lZWQgdG8gZnJlZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aAorCQkJCSAqIHRoaXMgbm9kZS4gSWYgZmFpbGVkIHRvIHJlbW92ZSwgYXNzdW1pbmcKKwkJCQkgKiBzb21lb25lIGVsc2UgZ290IGl0LgorCQkJCSAqLworCQkJCSpwU3NpZCA9IHNjYW5fZW50cnktPlJlc3VsdC5zc0lkOworCQkJCSp0aW1lciA9IHNjYW5fZW50cnktPlJlc3VsdC50aW1lcjsKKwkJCQljc3JfY2hlY2tfbl9zYXZlX3dzY19pZShwTWFjLCBic3NfZHNjcCwKKwkJCQkJCQkmc2Nhbl9lbnRyeS0+UmVzdWx0LgorCQkJCQkJCUJzc0Rlc2NyaXB0b3IpOworCQkJCWNzcl9mcmVlX3NjYW5fcmVzdWx0X2VudHJ5KHBNYWMsIHNjYW5fZW50cnkpOworCQkJfSBlbHNlIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR1csIEZMKCJmYWlsIHRvIHJlbW92ZSBlbnRyeSIpKTsKKwkJCX0KKwkJCWZSQyA9IHRydWU7CisJCQkvKgorCQkJICogSWYgd2UgZm91bmQgYSBtYXRjaCwgd2UgY2FuIHN0b3AgbG9va2luZyB0aHJvdWdoCisJCQkgKiB0aGUgbGlzdC4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwkJcEVudHJ5ID0gY3NyX2xsX25leHQoJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsIHBFbnRyeSwKKwkJCQkgICAgIExMX0FDQ0VTU19OT0xPQ0spOworCX0KKworCWNzcl9sbF91bmxvY2soJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QpOworCXJldHVybiBmUkM7Cit9CisKK0NERl9TVEFUVVMgY3NyX2FkZF9wbWtpZF9jYW5kaWRhdGVfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsCisJCQkJCXREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJdFBta2lkQ2FuZGlkYXRlSW5mbyAqcG1raWRfaW5mbyA9IE5VTEw7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKwlXTEFOX0hPU1RfRElBR19FVkVOVF9ERUYoc2VjRXZlbnQsCisJCQkJIGhvc3RfZXZlbnRfd2xhbl9zZWN1cml0eV9wYXlsb2FkX3R5cGUpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSICovCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJc21zX2xvZyhwTWFjLCBMT0dXLCBGTCgiTnVtUG1raWRDYW5kaWRhdGUgPSAlZCIpLAorCQlwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUpOworCWlmICghcEllcykKKwkJcmV0dXJuIHN0YXR1czsKKwkJLyogY2hlY2sgaWYgdGhpcyBpcyBhIFJTTiBCU1MgKi8KKwlpZiAoIXBJZXMtPlJTTi5wcmVzZW50KQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKHBTZXNzaW9uLT5OdW1QbWtpZENhbmRpZGF0ZSA+PSBDU1JfTUFYX1BNS0lEX0FMTE9XRUQpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCS8qIEJTUyBpcyBjYXBhYmxlIG9mIGRvaW5nIHByZS1hdXRoZW50aWNhdGlvbiAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisJY2RmX21lbV9zZXQoJnNlY0V2ZW50LCBzaXplb2YoaG9zdF9ldmVudF93bGFuX3NlY3VyaXR5X3BheWxvYWRfdHlwZSksCisJCSAgICAwKTsKKwlzZWNFdmVudC5ldmVudElkID0gV0xBTl9TRUNVUklUWV9FVkVOVF9QTUtJRF9DQU5ESURBVEVfRk9VTkQ7CisJc2VjRXZlbnQuZW5jcnlwdGlvbk1vZGVNdWx0aWNhc3QgPSAodWludDhfdClkaWFnX2VuY190eXBlX2Zyb21fY3NyX3R5cGUoCisJCQkJcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZSk7CisJc2VjRXZlbnQuZW5jcnlwdGlvbk1vZGVVbmljYXN0ID0gKHVpbnQ4X3QpZGlhZ19lbmNfdHlwZV9mcm9tX2Nzcl90eXBlKAorCQkJCXBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlKTsKKwljZGZfbWVtX2NvcHkoc2VjRXZlbnQuYnNzaWQsIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLmJ5dGVzLAorCQkJQ0RGX01BQ19BRERSX1NJWkUpOworCXNlY0V2ZW50LmF1dGhNb2RlID0gKHVpbnQ4X3QpZGlhZ19hdXRoX3R5cGVfZnJvbV9jc3JfdHlwZSgKKwkJCQlwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5BdXRoVHlwZSk7CisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfUkVQT1JUKCZzZWNFdmVudCwgRVZFTlRfV0xBTl9TRUNVUklUWSk7CisjZW5kaWYgLyogI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSICovCisKKwlwbWtpZF9pbmZvID0gJnBTZXNzaW9uLT5QbWtpZENhbmRpZGF0ZUluZm9bcFNlc3Npb24tPk51bVBta2lkQ2FuZGlkYXRlXTsKKwkvKiBpZiB5ZXMsIHRoZW4gYWRkIHRvIFBNS0lEQ2FuZGlkYXRlTGlzdCAqLworCWNkZl9tZW1fY29weShwbWtpZF9pbmZvLT5CU1NJRC5ieXRlcywgcEJzc0Rlc2MtPmJzc0lkLAorCQkJQ0RGX01BQ19BRERSX1NJWkUpOworCS8qIEJpdCAwIG9mZmlyc3QgYnl0ZSAtIFByZUF1dGhlbnRpY2F0aW9uIENhcGFiaWxpdHkgKi8KKwlpZiAoKHBJZXMtPlJTTi5SU05fQ2FwWzBdID4+IDApICYgMHgxKQorCQlwbWtpZF9pbmZvLT5wcmVBdXRoU3VwcG9ydGVkID0gdHJ1ZTsKKwllbHNlCisJCXBta2lkX2luZm8tPnByZUF1dGhTdXBwb3J0ZWQgPSBmYWxzZTsKKwlwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUrKzsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciBuZXcgQVAgaXMgZm91bmQgZm9yIHRoZSBjdXJyZW50IGNvbm5lY3RlZAorICogcHJvZmlsZS4gSWYgaXQgaXMgZm91bmQsIGl0IHJldHVybiB0aGUgc2Vzc2lvbklkLCBlbHNlIGl0IHJldHVybiBpbnZhbGlkCisgKiBzZXNzaW9uSUQKKyAqLworQ0RGX1NUQVRVUyBjc3JfcHJvY2Vzc19ic3NfZGVzY19mb3JfcG1raWRfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywKKwkJCQkJICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsCisJCQkJCSAgICAgICB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uOworCXREb3QxMWZCZWFjb25JRXMgKnBJZXNMb2NhbCA9IHBJZXM7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWlmICghKHBJZXNMb2NhbCB8fAorCSAgICBDREZfSVNfU1RBVFVTX1NVQ0NFU1MoCisJCWNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMocE1hYywgcEJzc0Rlc2MsCisJCQkJCQkgICAmcEllc0xvY2FsKSkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKCFDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCWlmICghcEllcykKKwkJCWNkZl9tZW1fZnJlZShwSWVzTG9jYWwpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJaWYgKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYShwTWFjLCBzZXNzaW9uSWQpCisJICAgICYmIChlQ1NSX0FVVEhfVFlQRV9SU04gPT0gcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuQXV0aFR5cGUpCisJICAgICYmIGNzcl9tYXRjaF9ic3NfdG9fY29ubmVjdF9wcm9maWxlKHBNYWMsCisJCQkJJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLAorCQkJCXBCc3NEZXNjLCBwSWVzTG9jYWwpKSB7CisJCS8qIFRoaXMgbmV3IEJTUyBmaXRzIHRoZSBjdXJyZW50IHByb2ZpbGUgY29ubmVjdGVkICovCisJCXN0YXR1cyA9IGNzcl9hZGRfcG1raWRfY2FuZGlkYXRlX2xpc3QocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJICAgICAgcEJzc0Rlc2MsIHBJZXNMb2NhbCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoImNzcl9hZGRfcG1raWRfY2FuZGlkYXRlX2xpc3QgZmFpbGVkIikpOworCQllbHNlCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJaWYgKCFwSWVzKQorCQljZGZfbWVtX2ZyZWUocEllc0xvY2FsKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorQ0RGX1NUQVRVUyBjc3JfYWRkX2JraWRfY2FuZGlkYXRlX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLAorCQkJCSAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKCFwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIHNlc3Npb24gJWQgbm90IGZvdW5kICIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkiY3NyX2FkZF9ia2lkX2NhbmRpZGF0ZV9saXN0IGNhbGxlZCBwTWFjLT5zY2FuLk51bUJraWRDYW5kaWRhdGUgPSAlZCIsCisJCXBTZXNzaW9uLT5OdW1Ca2lkQ2FuZGlkYXRlKTsKKwlpZiAocEllcykgeworCQkvKiBjaGVjayBpZiB0aGlzIGlzIGEgV0FQSSBCU1MgKi8KKwkJaWYgKHBJZXMtPldBUEkucHJlc2VudCkgeworCQkJLyogQ2hlY2sgaWYgdGhlIEJTUyBpcyBjYXBhYmxlIG9mIGRvaW5nIHByZS1hdXRoZW50aWNhdGlvbiAqLworCQkJaWYgKHBTZXNzaW9uLT5OdW1Ca2lkQ2FuZGlkYXRlIDwgQ1NSX01BWF9CS0lEX0FMTE9XRUQpIHsKKworCQkJCS8qIGlmIHllcywgdGhlbiBhZGQgdG8gQktJRENhbmRpZGF0ZUxpc3QgKi8KKwkJCQljZGZfbWVtX2NvcHkocFNlc3Npb24tPgorCQkJCQkgICAgIEJraWRDYW5kaWRhdGVJbmZvW3BTZXNzaW9uLT4KKwkJCQkJCQkgICAgICAgTnVtQmtpZENhbmRpZGF0ZV0uCisJCQkJCSAgICAgQlNTSUQuYnl0ZXMsIHBCc3NEZXNjLT5ic3NJZCwKKwkJCQkJICAgICBDREZfTUFDX0FERFJfU0laRSk7CisJCQkJaWYgKHBJZXMtPldBUEkucHJlYXV0aCkgeworCQkJCQlwU2Vzc2lvbi0+QmtpZENhbmRpZGF0ZUluZm9bcFNlc3Npb24tPgorCQkJCQkJCQkgICAgTnVtQmtpZENhbmRpZGF0ZV0uCisJCQkJCXByZUF1dGhTdXBwb3J0ZWQgPSB0cnVlOworCQkJCX0gZWxzZSB7CisJCQkJCXBTZXNzaW9uLT5Ca2lkQ2FuZGlkYXRlSW5mb1twU2Vzc2lvbi0+CisJCQkJCQkJCSAgICBOdW1Ca2lkQ2FuZGlkYXRlXS4KKwkJCQkJcHJlQXV0aFN1cHBvcnRlZCA9IGZhbHNlOworCQkJCX0KKwkJCQlwU2Vzc2lvbi0+TnVtQmtpZENhbmRpZGF0ZSsrOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIG5ldyBBUCBpcyBmb3VuZCBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGVkCisgKiBwcm9maWxlLCBpZiBzbyBhZGQgdG8gQktJRENhbmRpZGF0ZUxpc3QKKyAqLworYm9vbCBjc3JfcHJvY2Vzc19ic3NfZGVzY19mb3JfYmtpZF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsCisJCQkJCXREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisJYm9vbCBmUkMgPSBmYWxzZTsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzTG9jYWwgPSBwSWVzOworCXVpbnQzMl90IHNlc3Npb25JZDsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKCEocEllc0xvY2FsIHx8CisJICAgIENERl9JU19TVEFUVVNfU1VDQ0VTUygKKwkJY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcyhwTWFjLCBwQnNzRGVzYywKKwkJCQkJCSAgICZwSWVzTG9jYWwpKSkpCisJCXJldHVybiBmUkM7CisKKwlmb3IgKHNlc3Npb25JZCA9IDA7IHNlc3Npb25JZCA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBzZXNzaW9uSWQrKykgeworCQlpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpCisJCQljb250aW51ZTsKKwkJcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwkJaWYgKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYShwTWFjLCBzZXNzaW9uSWQpCisJCSAgICAmJiAoZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfQ0VSVElGSUNBVEUgPT0KKwkJCXBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkF1dGhUeXBlKQorCQkgICAgJiYgY3NyX21hdGNoX2Jzc190b19jb25uZWN0X3Byb2ZpbGUocE1hYywKKwkJCQkmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUsCisJCQkJcEJzc0Rlc2MsIHBJZXNMb2NhbCkpIHsKKwkJCS8qIHRoaXMgbmV3IEJTUyBmaXRzIHRoZSBjdXJyZW50IHByb2ZpbGUgY29ubmVjdGVkICovCisJCQlzdGF0dXMgPSBjc3JfYWRkX2JraWRfY2FuZGlkYXRlX2xpc3QocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCXBCc3NEZXNjLCBwSWVzTG9jYWwpOworCQkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJCWZSQyA9IHRydWU7CisJCX0KKwl9CisJaWYgKCFwSWVzKQorCQljZGZfbWVtX2ZyZWUocEllc0xvY2FsKTsKKwlyZXR1cm4gZlJDOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQKK2Nzcl9yZW1vdmVfZnJvbV90bXBfbGlzdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJIHVpbnQ4X3QgcmVhc29uLAorCQkJIHVpbnQ4X3Qgc2Vzc2lvbl9pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0TGlzdEVsZW0gKmVudHJ5OworCXRDc3JTY2FuUmVzdWx0ICpic3NfZHNjcDsKKwl0RG90MTFmQmVhY29uSUVzICpsb2NhbF9pZSA9IE5VTEw7CisJYm9vbCBkdXBfYnNzOworCXRBbmlTU0lEIHRtcFNzaWQ7CisJdl9USU1FX3QgdGltZXIgPSAwOworCisJdG1wU3NpZC5sZW5ndGggPSAwOworCXdoaWxlICgoZW50cnkgPSBjc3JfbGxfcmVtb3ZlX3RhaWwoJm1hY19jdHgtPnNjYW4udGVtcFNjYW5SZXN1bHRzLAorCQkJCQkgICBMTF9BQ0NFU1NfTE9DSykpICE9IE5VTEwpIHsKKwkJYnNzX2RzY3AgPSBHRVRfQkFTRV9BRERSKGVudHJ5LCB0Q3NyU2NhblJlc3VsdCwgTGluayk7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HMiwKKwkJCUZMKCIuLi5Cc3NpZD0gIk1BQ19BRERSRVNTX1NUUiIgY2hhbj0gJWQsIHJzc2kgPSAtJWQiKSwKKwkJCU1BQ19BRERSX0FSUkFZKGJzc19kc2NwLT5SZXN1bHQuQnNzRGVzY3JpcHRvci4KKwkJCQkgICAgICAgYnNzSWQpLAorCQkJYnNzX2RzY3AtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCwKKwkJCWJzc19kc2NwLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5yc3NpICogKC0xKSk7CisKKwkJLyogQXQgdGhpcyB0aW1lLCBic3NfZHNjcC0+UmVzdWx0LnB2SWVzIG1heSBiZSBOVUxMICovCisJCWxvY2FsX2llID0gKHREb3QxMWZCZWFjb25JRXMgKikoYnNzX2RzY3AtPlJlc3VsdC5wdkllcyk7CisJCXN0YXR1cyA9IGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMobWFjX2N0eCwKKwkJCQkmYnNzX2RzY3AtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCAmbG9jYWxfaWUpOworCQlpZiAoIShsb2NhbF9pZSB8fCBDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkNhbm5vdCBwYXJlZCBJRXMiKSk7CisJCQljc3JfZnJlZV9zY2FuX3Jlc3VsdF9lbnRyeShtYWNfY3R4LCBic3NfZHNjcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlkdXBfYnNzID0gY3NyX3JlbW92ZV9kdXBfYnNzX2Rlc2NyaXB0aW9uKG1hY19jdHgsCisJCQkJJmJzc19kc2NwLT5SZXN1bHQuQnNzRGVzY3JpcHRvciwKKwkJCQlsb2NhbF9pZSwgJnRtcFNzaWQsICZ0aW1lciwgZmFsc2UpOworCQkvKgorCQkgKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgcmVhY2ggb3V0IGxpbWl0LCBidXQgZG9uJ3QgbG9zZSB0aGUKKwkJICogTEZSIGNhbmRpZGF0ZXMgY2FtZSBmcm9tIEZXCisJCSAqLworCQlpZiAoQ1NSX1NDQU5fSVNfT1ZFUl9CU1NfTElNSVQobWFjX2N0eCkpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HVywgRkwoIkJTUyBsaW1pdCByZWFjaGVkIikpOworCQkJaWYgKChic3NfZHNjcC0+UmVzdWx0LnB2SWVzID09IE5VTEwpICYmIGxvY2FsX2llKQorCQkJCWNkZl9tZW1fZnJlZShsb2NhbF9pZSk7CisJCQljc3JfZnJlZV9zY2FuX3Jlc3VsdF9lbnRyeShtYWNfY3R4LCBic3NfZHNjcCk7CisJCQkvKiBDb250aW51ZSBiZWNhdXNlIHRoZXJlIG1heSBiZSBkdXBsaWNhdGVkIEJTUyAqLworCQkJY29udGludWU7CisJCX0KKwkJLyogY2hlY2sgZm9yIGR1cGxpY2F0ZSBzY2FuIHJlc3VsdHMgKi8KKwkJaWYgKCFkdXBfYnNzKSB7CisJCQlzdGF0dXMgPSBjc3JfcHJvY2Vzc19ic3NfZGVzY19mb3JfcG1raWRfbGlzdChtYWNfY3R4LAorCQkJCQkmYnNzX2RzY3AtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLAorCQkJCQlsb2NhbF9pZSwgc2Vzc2lvbl9pZCk7CisJCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQkvKiBGb3VuZCBhIG5ldyBCU1MgKi8KKwkJCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJCU5VTEwsIDAsIGVDU1JfUk9BTV9TQ0FOX0ZPVU5EX05FV19CU1MsCisJCQkJCWVDU1JfUk9BTV9SRVNVTFRfTk9ORSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogQ2hlY2sgaWYgdGhlIG5ldyBvbmUgaGFzIFNTSUQgaXQgaXQsIGlmIG5vdCwgdXNlCisJCQkgKiB0aGUgb2xkZXIgU1NJRCBpZiBpdCBleGlzdHMuCisJCQkgKgorCQkJICogTmV3IEJTUyBoYXMgYSBoaWRkZW4gU1NJRCBhbmQgb2xkIG9uZSBoYXMgdGhlIFNTSUQuCisJCQkgKiBLZWVwIHRoZSBTU0lEIG9ubHkgaWYgZGlmZiBvZiBzYXZlZCBTU0lEIHRpbWUgYW5kCisJCQkgKiBjdXJyZW50IHRpbWUgaXMgbGVzcyB0aGFuIDEgbWluIHRvIGF2b2lkIHNpZGUgZWZmZWN0CisJCQkgKiBvZiBzYXZpbmcgU1NJRCB3aXRoIG9sZCBvbmUgaXMgdGhhdCBpZiBBUCBjaGFuZ2VzCisJCQkgKiBpdHMgU1NJRCB3aGlsZSByZW1haW4gaGlkZGVuLCB3ZSBtYXkgbmV2ZXIgc2VlIGl0CisJCQkgKiBhbmQgYWxzbyB0byBhZGRyZXNzIHRoZSByZXF1aXJlbWVudCBvZiBXaGVuIHdlIHJlbW92ZQorCQkJICogaGlkZGVuIHNzaWQgZnJvbSB0aGUgcHJvZmlsZSBpLmUuLCBmb3JnZXQgdGhlIFNTSUQKKwkJCSAqIHZpYSBHVUkgdGhhdCBTU0lEIHNob3VsZG4ndCBzZWUgaW4gdGhlIHByb2ZpbGUKKwkJCSAqLworCQkJdl9USU1FX3QgdGltZV9nYXAgPSBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCkgLQorCQkJCQkJCQkJdGltZXI7CisJCQlpZiAoKDAgPT0gYnNzX2RzY3AtPlJlc3VsdC5zc0lkLmxlbmd0aCkKKwkJCSAgICAmJiAodGltZV9nYXAgPD0gSElEREVOX1RJTUVSKQorCQkJICAgICYmIHRtcFNzaWQubGVuZ3RoKSB7CisJCQkJYnNzX2RzY3AtPlJlc3VsdC50aW1lciA9IHRpbWVyOworCQkJCWJzc19kc2NwLT5SZXN1bHQuc3NJZCA9IHRtcFNzaWQ7CisJCQl9CisJCX0KKworCQlpZiAoY3NyX2lzMTFkX3N1cHBvcnRlZChtYWNfY3R4KQorCQkgICAgJiYgbG9jYWxfaWUtPkNvdW50cnkucHJlc2VudCkgeworCQkJY3NyX2FkZF92b3RlX2Zvcl9jb3VudHJ5X2luZm8obWFjX2N0eCwKKwkJCQkJCWxvY2FsX2llLT5Db3VudHJ5LmNvdW50cnkpOworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCUZMKCIxMWQgQVAgQnNzaWQgIk1BQ19BRERSRVNTX1NUUgorCQkJCSAgICIgY2hhbj0gJWQsIHJzc2kgPSAtJWQsIGNvdW50cnlDb2RlICVjJWMiKSwKKwkJCQlNQUNfQUREUl9BUlJBWSgKKwkJCQkJYnNzX2RzY3AtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmJzc0lkKSwKKwkJCQlic3NfZHNjcC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkLAorCQkJCWJzc19kc2NwLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5yc3NpICogKC0xKSwKKwkJCQlsb2NhbF9pZS0+Q291bnRyeS5jb3VudHJ5WzBdLAorCQkJCWxvY2FsX2llLT5Db3VudHJ5LmNvdW50cnlbMV0pOworCQl9CisJCS8qIGFwcGVuZCB0byBtYWluIGxpc3QgKi8KKwkJY3NyX3NjYW5fYWRkX3Jlc3VsdChtYWNfY3R4LCBic3NfZHNjcCwgbG9jYWxfaWUsIHNlc3Npb25faWQpOworCQlpZiAoKGJzc19kc2NwLT5SZXN1bHQucHZJZXMgPT0gTlVMTCkgJiYgbG9jYWxfaWUpCisJCQljZGZfbWVtX2ZyZWUobG9jYWxfaWUpOworCX0gLyogZW5kIG9mIGxvb3AgKi8KK30KKworc3RhdGljIHZvaWQgY3NyX21vdmVfdGVtcF9zY2FuX3Jlc3VsdHNfdG9fbWFpbl9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgdWludDhfdCByZWFzb24sCisJCQkJCQkgICAgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKwl1aW50MzJfdCBpOworCisJLyogcmVtb3ZlIHRoZSBCU1MgZGVzY3JpcHRpb25zIGZyb20gdGVtcG9yYXJ5IGxpc3QgKi8KKwljc3JfcmVtb3ZlX2Zyb21fdG1wX2xpc3QocE1hYywgcmVhc29uLCBzZXNzaW9uSWQpOworCS8qCisJICogV2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgQ0Mgd2hpbGUgY29ubmVjdGVkIHRvIGFuIEFQIHdoaWNoIGlzCisJICogYWR2ZXJ0aXNpbmcgQ0MgYWxyZWFkeQorCSAqLworCWlmICghY3NyX2lzMTFkX3N1cHBvcnRlZChwTWFjKSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJaWYgKCFDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBpKSkKKwkJCWNvbnRpbnVlOworCQlwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBpKTsKKwkJaWYgKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZChwTWFjLCBpKSkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCUZMKCJObyBuZWVkIHRvIHVwZGF0ZSBDQyBpbiBjb25uZWN0ZWQgc3RhdGUiKSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJY3NyX2VsZWN0ZWRfY291bnRyeV9pbmZvKHBNYWMpOworCWNzcl9sZWFybl8xMWRjb3VudHJ5X2luZm9ybWF0aW9uKHBNYWMsIE5VTEwsIE5VTEwsIHRydWUpOworfQorCitzdGF0aWMgdENzclNjYW5SZXN1bHQgKmNzcl9zY2FuX3NhdmVfYnNzX2Rlc2NyaXB0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqCisJCQkJCQkgICAgIHBCU1NEZXNjcmlwdGlvbiwKKwkJCQkJCSAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywKKwkJCQkJCSAgICAgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdENzclNjYW5SZXN1bHQgKnBDc3JCc3NEZXNjcmlwdGlvbiA9IE5VTEw7CisJdWludDMyX3QgY2JCU1NEZXNjOworCXVpbnQzMl90IGNiQWxsb2NhdGVkOworCisJLyogZmlndXJlIG91dCBob3cgYmlnIHRoZSBCU1MgZGVzY3JpcHRpb24gaXMgKHRoZSBCU1NEZXNjLT5sZW5ndGggZG9lcyBOT1QgKi8KKwkvKiBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmKS4gKi8KKwljYkJTU0Rlc2MgPSBwQlNTRGVzY3JpcHRpb24tPmxlbmd0aCArIHNpemVvZihwQlNTRGVzY3JpcHRpb24tPmxlbmd0aCk7CisKKwljYkFsbG9jYXRlZCA9IHNpemVvZih0Q3NyU2NhblJlc3VsdCkgKyBjYkJTU0Rlc2M7CisKKwlwQ3NyQnNzRGVzY3JpcHRpb24gPSBjZGZfbWVtX21hbGxvYyhjYkFsbG9jYXRlZCk7CisJaWYgKE5VTEwgIT0gcENzckJzc0Rlc2NyaXB0aW9uKSB7CisJCWNkZl9tZW1fc2V0KHBDc3JCc3NEZXNjcmlwdGlvbiwgY2JBbGxvY2F0ZWQsIDApOworCQlwQ3NyQnNzRGVzY3JpcHRpb24tPkFnaW5nQ291bnQgPQorCQkJKGludDMyX3QpIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYWdpbmdDb3VudDsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIiBTZXQgQWdpbmcgQ291bnQgPSAlZCBmb3IgQlNTICIgTUFDX0FERFJFU1NfU1RSICIgIiksCisJCQlwQ3NyQnNzRGVzY3JpcHRpb24tPkFnaW5nQ291bnQsCisJCQlNQUNfQUREUl9BUlJBWShwQ3NyQnNzRGVzY3JpcHRpb24tPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLgorCQkJCSAgICAgICBic3NJZCkpOworCQljZGZfbWVtX2NvcHkoJnBDc3JCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IsCisJCQkgICAgIHBCU1NEZXNjcmlwdGlvbiwgY2JCU1NEZXNjKTsKKyNpZiBkZWZpbmVkKENERl9FTlNCQUxFRCkKKwkJaWYgKE5VTEwgIT0gcENzckJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQucHZJZXMpIHsKKwkJCUNERl9BU1NFUlQocENzckJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQucHZJZXMgPT0gTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorI2VuZGlmCisJCWNzcl9zY2FuX2FkZF9yZXN1bHQocE1hYywgcENzckJzc0Rlc2NyaXB0aW9uLCBwSWVzLCBzZXNzaW9uSWQpOworCX0KKworCXJldHVybiBwQ3NyQnNzRGVzY3JpcHRpb247Cit9CisKKy8qIEFwcGVuZCBhIEJzcyBEZXNjcmlwdGlvbi4uLiAqLwordENzclNjYW5SZXN1bHQgKmNzcl9zY2FuX2FwcGVuZF9ic3NfZGVzY3JpcHRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCXRTaXJCc3NEZXNjcmlwdGlvbiAqCisJCQkJCQlwU2lyQnNzRGVzY3JpcHRpb24sCisJCQkJCQl0RG90MTFmQmVhY29uSUVzICpwSWVzLAorCQkJCQkJYm9vbCBmRm9yY2VkLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0Q3NyU2NhblJlc3VsdCAqcENzckJzc0Rlc2NyaXB0aW9uID0gTlVMTDsKKwl0QW5pU1NJRCB0bXBTc2lkOworCXZfVElNRV90IHRpbWVyID0gMDsKKwlpbnQgcmVzdWx0OworCisJdG1wU3NpZC5sZW5ndGggPSAwOworCXJlc3VsdCA9IGNzcl9yZW1vdmVfZHVwX2Jzc19kZXNjcmlwdGlvbihwTWFjLCBwU2lyQnNzRGVzY3JpcHRpb24sCisJCQkJCQlwSWVzLCAmdG1wU3NpZCwgJnRpbWVyLAorCQkJCQkJZkZvcmNlZCk7CisJcENzckJzc0Rlc2NyaXB0aW9uID0gY3NyX3NjYW5fc2F2ZV9ic3NfZGVzY3JpcHRpb24ocE1hYywKKwkJCQkJcFNpckJzc0Rlc2NyaXB0aW9uLCBwSWVzLCBzZXNzaW9uSWQpOworCWlmIChyZXN1bHQgJiYgKHBDc3JCc3NEZXNjcmlwdGlvbiAhPSBOVUxMKSkgeworCQkvKgorCQkqIENoZWNrIGlmIHRoZSBuZXcgb25lIGhhcyBTU0lEIGl0IGl0LCBpZiBub3QsIHVzZSB0aGUgb2xkZXIKKwkJKiBTU0lEIGlmIGl0IGV4aXN0cy4KKwkJKi8KKwkJaWYgKCgwID09IHBDc3JCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LnNzSWQubGVuZ3RoKQorCQkgICAgJiYgdG1wU3NpZC5sZW5ndGgpIHsKKwkJCS8qCisJCQkgKiBOZXcgQlNTIGhhcyBhIGhpZGRlbiBTU0lEIGFuZCBvbGQgb25lIGhhcyB0aGUgU1NJRC4KKwkJCSAqIEtlZXAgdGhlIFNTSUQgb25seSBpZiBkaWZmIG9mIHNhdmVkIFNTSUQgdGltZSBhbmQKKwkJCSAqIGN1cnJlbnQgdGltZSBpcyBsZXNzIHRoYW4gMSBtaW4gdG8gYXZvaWQgc2lkZSBlZmZlY3QKKwkJCSAqIG9mIHNhdmluZyBTU0lEIHdpdGggb2xkIG9uZSBpcyB0aGF0IGlmIEFQIGNoYW5nZXMgaXRzCisJCQkgKiBTU0lEIHdoaWxlIHJlbWFpbiBoaWRkZW4sIHdlIG1heSBuZXZlciBzZWUgaXQgYW5kCisJCQkgKiBhbHNvIHRvIGFkZHJlc3MgdGhlIHJlcXVpcmVtZW50IG9mLiBXaGVuIHdlIHJlbW92ZQorCQkJICogaGlkZGVuIHNzaWQgZnJvbSB0aGUgcHJvZmlsZSBpLmUuLCBmb3JnZXQgdGhlIFNTSUQKKwkJCSAqIHZpYSBHVUkgdGhhdCBTU0lEIHNob3VsZG4ndCBzZWUgaW4gdGhlIHByb2ZpbGUKKwkJCSAqLworCQkJaWYgKChjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCkgLSB0aW1lcikgPD0KKwkJCSAgICBISURERU5fVElNRVIpIHsKKwkJCQlwQ3NyQnNzRGVzY3JpcHRpb24tPlJlc3VsdC5zc0lkID0gdG1wU3NpZDsKKwkJCQlwQ3NyQnNzRGVzY3JpcHRpb24tPlJlc3VsdC50aW1lciA9IHRpbWVyOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHBDc3JCc3NEZXNjcmlwdGlvbjsKK30KKwordm9pZCBjc3JfcHVyZ2VfY2hhbm5lbF9wb3dlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0RGJsTGlua0xpc3QgKnBDaGFubmVsTGlzdCkKK3sKKwl0Q3NyQ2hhbm5lbFBvd2VySW5mbyAqcENoYW5uZWxTZXQ7CisJdExpc3RFbGVtICpwRW50cnk7CisKKwljc3JfbGxfbG9jayhwQ2hhbm5lbExpc3QpOworCS8qCisJKiBSZW1vdmUgdGhlIGNoYW5uZWwgc2V0cyBmcm9tIHRoZSBsZWFybmVkIGxpc3QgYW5kIHB1dCB0aGVtCisJKiBpbiB0aGUgZnJlZSBsaXN0CisJKi8KKwl3aGlsZSAoKHBFbnRyeSA9IGNzcl9sbF9yZW1vdmVfaGVhZChwQ2hhbm5lbExpc3QsCisJCQkJCSAgICBMTF9BQ0NFU1NfTk9MT0NLKSkgIT0gTlVMTCkgeworCQlwQ2hhbm5lbFNldCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0Q3NyQ2hhbm5lbFBvd2VySW5mbywgbGluayk7CisJCWlmIChwQ2hhbm5lbFNldCkKKwkJCWNkZl9tZW1fZnJlZShwQ2hhbm5lbFNldCk7CisJfQorCWNzcl9sbF91bmxvY2socENoYW5uZWxMaXN0KTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBTYXZlIHRoZSBjaGFubmVsTGlzdCBpbnRvIHRoZSB1bHRpbWF0ZSBzdG9yYWdlIGFzIHRoZSBmaW5hbCBzdGFnZSBvZiBjaGFubmVsCisgKiBJbnB1dDogcENvdW50cnlJbmZvIC0tIHRoZSBjb3VudHJ5IGNvZGUgKGUuZy4gIlVTSSIpLCBjaGFubmVsIGxpc3QsIGFuZCBwb3dlcgorICogbGltaXQgYXJlIGFsbCBzdG9yZWQgaW5zaWRlIHRoaXMgZGF0YSBzdHJ1Y3R1cmUKKyAqLworQ0RGX1NUQVRVUyBjc3Jfc2F2ZV90b19jaGFubmVsX3Bvd2VyMl9nXzVfZyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgdWludDMyX3QgdGFibGVTaXplLAorCQkJCQkgICAgdFNpck1hY0NoYW5JbmZvICpjaGFubmVsVGFibGUpCit7CisJdWludDMyX3QgaSA9IHRhYmxlU2l6ZSAvIHNpemVvZih0U2lyTWFjQ2hhbkluZm8pOworCXRTaXJNYWNDaGFuSW5mbyAqcENoYW5uZWxJbmZvOworCXRDc3JDaGFubmVsUG93ZXJJbmZvICpwQ2hhbm5lbFNldDsKKwlib29sIGYyR0h6SW5mb0ZvdW5kID0gZmFsc2U7CisJYm9vbCBmMkdMaXN0UHVyZ2VkID0gZmFsc2UsIGY1R0xpc3RQdXJnZWQgPSBmYWxzZTsKKworCXBDaGFubmVsSW5mbyA9IGNoYW5uZWxUYWJsZTsKKwkvKiBhdGxlYXN0IDMgYnl0ZXMgaGF2ZSB0byBiZSByZW1haW5pbmcgIC0tIGZyb20gImNvdW50cnlTdHJpbmciICovCisJd2hpbGUgKGktLSkgeworCQlwQ2hhbm5lbFNldCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0Q3NyQ2hhbm5lbFBvd2VySW5mbykpOworCQlpZiAoTlVMTCA9PSBwQ2hhbm5lbFNldCkgeworCQkJcENoYW5uZWxJbmZvKys7CisJCQljb250aW51ZTsKKwkJfQorCQljZGZfbWVtX3NldChwQ2hhbm5lbFNldCwgc2l6ZW9mKHRDc3JDaGFubmVsUG93ZXJJbmZvKSwgMCk7CisJCXBDaGFubmVsU2V0LT5maXJzdENoYW5uZWwgPSBwQ2hhbm5lbEluZm8tPmZpcnN0Q2hhbk51bTsKKwkJcENoYW5uZWxTZXQtPm51bUNoYW5uZWxzID0gcENoYW5uZWxJbmZvLT5udW1DaGFubmVsczsKKwkJLyoKKwkJICogTm93IHNldCB0aGUgaW50ZXItY2hhbm5lbCBvZmZzZXQgYmFzZWQgb24gdGhlIGZyZXF1ZW5jeSBiYW5kCisJCSAqIHRoZSBjaGFubmVsIHNldCBsaWVzIGluCisJCSAqLworCQlpZiAoKENEU19JU19DSEFOTkVMXzI0R0haKHBDaGFubmVsU2V0LT5maXJzdENoYW5uZWwpKSAmJgorCQkgICAgKChwQ2hhbm5lbFNldC0+Zmlyc3RDaGFubmVsICsKKwkJICAgICAgKHBDaGFubmVsU2V0LT5udW1DaGFubmVscyAtIDEpKSA8PQorCQkgICAgIENEU19NQVhfMjRHSHpfQ0hBTk5FTF9OVU1CRVIpKSB7CisJCQlwQ2hhbm5lbFNldC0+aW50ZXJDaGFubmVsT2Zmc2V0ID0gMTsKKwkJCWYyR0h6SW5mb0ZvdW5kID0gdHJ1ZTsKKwkJfSBlbHNlIGlmICgoQ0RTX0lTX0NIQU5ORUxfNUdIWihwQ2hhbm5lbFNldC0+Zmlyc3RDaGFubmVsKSkKKwkJICAgICYmICgocENoYW5uZWxTZXQtPmZpcnN0Q2hhbm5lbCArCisJCSAgICAgICgocENoYW5uZWxTZXQtPm51bUNoYW5uZWxzIC0gMSkgKiA0KSkgPD0KKwkJICAgICBDRFNfTUFYXzVHSHpfQ0hBTk5FTF9OVU1CRVIpKSB7CisJCQlwQ2hhbm5lbFNldC0+aW50ZXJDaGFubmVsT2Zmc2V0ID0gNDsKKwkJCWYyR0h6SW5mb0ZvdW5kID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkJRkwoIkludmFsaWQgQ2hhbm5lbCAlZCBQcmVzZW50IGluIENvdW50cnkgSUUiKSwKKwkJCQlwQ2hhbm5lbFNldC0+Zmlyc3RDaGFubmVsKTsKKwkJCWNkZl9tZW1fZnJlZShwQ2hhbm5lbFNldCk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJcENoYW5uZWxTZXQtPnR4UG93ZXIgPSBDREZfTUlOKHBDaGFubmVsSW5mby0+bWF4VHhQb3dlciwKKwkJCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uVHhQb3dlckNhcCk7CisJCWlmIChmMkdIekluZm9Gb3VuZCkgeworCQkJaWYgKCFmMkdMaXN0UHVyZ2VkKSB7CisJCQkJLyogcHVyZ2UgcHJldmlvdXMgcmVzdWx0cyBpZiBmb3VuZCBuZXcgKi8KKwkJCQljc3JfcHVyZ2VfY2hhbm5lbF9wb3dlcihwTWFjLAorCQkJCQkJCSZwTWFjLT5zY2FuLgorCQkJCQkJCWNoYW5uZWxQb3dlckluZm9MaXN0MjQpOworCQkJCWYyR0xpc3RQdXJnZWQgPSB0cnVlOworCQkJfQorCQkJaWYgKENTUl9JU19PUEVSQVRJTkdfQkdfQkFORChwTWFjKSkgeworCQkJCS8qIGFkZCB0byB0aGUgbGlzdCBvZiAyLjQgR0h6IGNoYW5uZWwgc2V0cyAqLworCQkJCWNzcl9sbF9pbnNlcnRfdGFpbCgmcE1hYy0+c2Nhbi4KKwkJCQkJCSAgIGNoYW5uZWxQb3dlckluZm9MaXN0MjQsCisJCQkJCQkgICAmcENoYW5uZWxTZXQtPmxpbmssCisJCQkJCQkgICBMTF9BQ0NFU1NfTE9DSyk7CisJCQl9IGVsc2UgeworCQkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQkJRkwoIkFkZGluZyAxMUIvRyBjaCBpbiAxMUEuIDFzdCBjaCAlZCIpLAorCQkJCQlwQ2hhbm5lbFNldC0+Zmlyc3RDaGFubmVsKTsKKwkJCQljZGZfbWVtX2ZyZWUocENoYW5uZWxTZXQpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogNUdIeiBpbmZvIGZvdW5kICovCisJCQlpZiAoIWY1R0xpc3RQdXJnZWQpIHsKKwkJCQkvKiBwdXJnZSBwcmV2aW91cyByZXN1bHRzIGlmIGZvdW5kIG5ldyAqLworCQkJCWNzcl9wdXJnZV9jaGFubmVsX3Bvd2VyKHBNYWMsCisJCQkJCQkJJnBNYWMtPnNjYW4uCisJCQkJCQkJY2hhbm5lbFBvd2VySW5mb0xpc3Q1Ryk7CisJCQkJZjVHTGlzdFB1cmdlZCA9IHRydWU7CisJCQl9CisJCQlpZiAoQ1NSX0lTX09QRVJBVElOR19BX0JBTkQocE1hYykpIHsKKwkJCQkvKiBhZGQgdG8gdGhlIGxpc3Qgb2YgNUdIeiBjaGFubmVsIHNldHMgKi8KKwkJCQljc3JfbGxfaW5zZXJ0X3RhaWwoJnBNYWMtPnNjYW4uCisJCQkJCQkgICBjaGFubmVsUG93ZXJJbmZvTGlzdDVHLAorCQkJCQkJICAgJnBDaGFubmVsU2V0LT5saW5rLAorCQkJCQkJICAgTExfQUNDRVNTX0xPQ0spOworCQkJfSBlbHNlIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkJCUZMKCJBZGRpbmcgMTFBIGNoIGluIEIvRy4gMXN0IGNoICVkIiksCisJCQkJCXBDaGFubmVsU2V0LT5maXJzdENoYW5uZWwpOworCQkJCWNkZl9tZW1fZnJlZShwQ2hhbm5lbFNldCk7CisJCQl9CisJCX0KKwkJcENoYW5uZWxJbmZvKys7IC8qIG1vdmUgdG8gbmV4dCBlbnRyeSAqLworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBjc3JfY2xlYXJfZGZzX2NoYW5uZWxfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXRTaXJNYk1zZyAqcE1zZzsKKwl1aW50MTZfdCBtc2dMZW47CisKKwltc2dMZW4gPSAodWludDE2X3QpIChzaXplb2YodFNpck1iTXNnKSk7CisJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKG1zZ0xlbik7CisJaWYgKE5VTEwgIT0gcE1zZykgeworCQljZGZfbWVtX3NldCgodm9pZCAqKXBNc2csIG1zZ0xlbiwgMCk7CisJCXBNc2ctPnR5cGUgPSBlV05JX1NNRV9DTEVBUl9ERlNfQ0hBTk5FTF9MSVNUOworCQlwTXNnLT5tc2dMZW4gPSBtc2dMZW47CisJCWNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKHBNc2cpOworCX0KK30KKwordm9pZCBjc3JfYXBwbHlfcG93ZXIyX2N1cnJlbnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlzbXNfbG9nKHBNYWMsIExPRzMsIEZMKCIgVXBkYXRpbmcgQ2ZnIHdpdGggcG93ZXIgc2V0dGluZ3MiKSk7CisJY3NyX3NhdmVfdHhfcG93ZXJfdG9fY2ZnKHBNYWMsICZwTWFjLT5zY2FuLmNoYW5uZWxQb3dlckluZm9MaXN0MjQsCisJCQkJIFdOSV9DRkdfTUFYX1RYX1BPV0VSXzJfNCk7CisJY3NyX3NhdmVfdHhfcG93ZXJfdG9fY2ZnKHBNYWMsICZwTWFjLT5zY2FuLmNoYW5uZWxQb3dlckluZm9MaXN0NUcsCisJCQkJIFdOSV9DRkdfTUFYX1RYX1BPV0VSXzUpOworfQorCit2b2lkIGNzcl9hcHBseV9jaGFubmVsX3Bvd2VyX2luZm9fdG9fZncodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkJICB0Q3NyQ2hhbm5lbCAqY2hfbHN0LAorCQkJCQkgIHVpbnQ4X3QgKmNvdW50cnlDb2RlKQoreworCWludCBpOworCXVpbnQ4X3QgbnVtX2NoID0gMDsKKwl1aW50OF90IHRlbXBOdW1DaGFubmVscyA9IDA7CisJdENzckNoYW5uZWwgdG1wX2NoX2xzdDsKKworCWlmIChjaF9sc3QtPm51bUNoYW5uZWxzKSB7CisJCXRlbXBOdW1DaGFubmVscyA9IENTUl9NSU4oY2hfbHN0LT5udW1DaGFubmVscywKKwkJCQkJICBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pOworCQlmb3IgKGkgPSAwOyBpIDwgdGVtcE51bUNoYW5uZWxzOyBpKyspIHsKKwkJCXRtcF9jaF9sc3QuY2hhbm5lbExpc3RbbnVtX2NoXSA9IGNoX2xzdC0+Y2hhbm5lbExpc3RbaV07CisJCQludW1fY2grKzsKKwkJfQorCQl0bXBfY2hfbHN0Lm51bUNoYW5uZWxzID0gbnVtX2NoOworCQkvKiBTdG9yZSB0aGUgY2hhbm5lbCtwb3dlciBpbmZvIGluIHRoZSBnbG9iYWwgcGxhY2U6IENmZyAqLworCQljc3JfYXBwbHlfcG93ZXIyX2N1cnJlbnQobWFjX2N0eCk7CisJCWNzcl9zZXRfY2ZnX3ZhbGlkX2NoYW5uZWxfbGlzdChtYWNfY3R4LCB0bXBfY2hfbHN0LmNoYW5uZWxMaXN0LAorCQkJCQkgICAgICAgdG1wX2NoX2xzdC5udW1DaGFubmVscyk7CisJCS8qCisJCSAqIGV4dGVuZCBzY2FuIGNhcGFiaWxpdHksIGJ1aWxkIGEgc2NhbiBsaXN0IGJhc2VkIG9uIHRoZQorCQkgKiBjaGFubmVsIGxpc3QgOiBjaGFubmVsIyArIGFjdGl2ZS9wYXNzaXZlIHNjYW4KKwkJICovCisJCWNzcl9zZXRfY2ZnX3NjYW5fY29udHJvbF9saXN0KG1hY19jdHgsIGNvdW50cnlDb2RlLAorCQkJCQkgICAgICAmdG1wX2NoX2xzdCk7CisJCS8qIFNlbmQgbXNnIHRvIExpbSB0byBjbGVhciBERlMgY2hhbm5lbCBsaXN0ICovCisJCWNzcl9jbGVhcl9kZnNfY2hhbm5lbF9saXN0KG1hY19jdHgpOworCX0gZWxzZSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIjExRCBjaGFubmVsIGxpc3QgaXMgZW1wdHkiKSk7CisJfQorCWNzcl9zZXRfY2ZnX2NvdW50cnlfY29kZShtYWNfY3R4LCBjb3VudHJ5Q29kZSk7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorc3RhdGljIHZvaWQgY3NyX2RpYWdfcmVzZXRfY291bnRyeV9pbmZvcm1hdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCisJaG9zdF9sb2dfODAyXzExZF9wa3RfdHlwZSAqcDExZExvZzsKKwlpbnQgSW5kZXg7CisJV0xBTl9IT1NUX0RJQUdfTE9HX0FMTE9DKHAxMWRMb2csIGhvc3RfbG9nXzgwMl8xMWRfcGt0X3R5cGUsCisJCQkJIExPR19XTEFOXzgwMjExRF9DKTsKKwlpZiAoIXAxMWRMb2cpCisJCXJldHVybjsKKworCXAxMWRMb2ctPmV2ZW50SWQgPSBXTEFOXzgwMjExRF9FVkVOVF9SRVNFVDsKKwljZGZfbWVtX2NvcHkocDExZExvZy0+Y291bnRyeUNvZGUsIHBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LCAzKTsKKwlwMTFkTG9nLT5udW1DaGFubmVsID0gcE1hYy0+c2Nhbi5iYXNlX2NoYW5uZWxzLm51bUNoYW5uZWxzOworCWlmIChwMTFkTG9nLT5udW1DaGFubmVsIDw9IEhPU1RfTE9HX01BWF9OVU1fQ0hBTk5FTCkgeworCQljZGZfbWVtX2NvcHkocDExZExvZy0+Q2hhbm5lbHMsCisJCQkgICAgIHBNYWMtPnNjYW4uYmFzZV9jaGFubmVscy5jaGFubmVsTGlzdCwKKwkJCSAgICAgcDExZExvZy0+bnVtQ2hhbm5lbCk7CisJCWZvciAoSW5kZXggPSAwOworCQkgICAgIEluZGV4IDwgcE1hYy0+c2Nhbi5iYXNlX2NoYW5uZWxzLm51bUNoYW5uZWxzOworCQkgICAgIEluZGV4KyspIHsKKwkJCXAxMWRMb2ctPlR4UHdyW0luZGV4XSA9IENERl9NSU4oCisJCQkJcE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZVtJbmRleF0ucHdyLAorCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublR4UG93ZXJDYXApOworCQl9CisJfQorCWlmICghcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkKQorCQlwMTFkTG9nLT5zdXBwb3J0TXVsdGlwbGVEb21haW4gPSBXTEFOXzgwMjExRF9ESVNBQkxFRDsKKwllbHNlCisJCXAxMWRMb2ctPnN1cHBvcnRNdWx0aXBsZURvbWFpbiA9CisJCQlXTEFOXzgwMjExRF9TVVBQT1JUX01VTFRJX0RPTUFJTjsKKwlXTEFOX0hPU1RfRElBR19MT0dfUkVQT1JUKHAxMWRMb2cpOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSICovCisKKy8qKgorICogY3NyX2FwcGx5X2NoYW5uZWxfcG93ZXJfaW5mb193cmFwcGVyKCkgLSBzZW5kcyBjaGFubmVsIGluZm8gdG8gZncKKyAqIEBwTWFjOiBtYWluIE1BQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIGNoYW5uZWwgcG93ZXIgaW5mbyB0byBmaXJtd2FyZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNzcl9hcHBseV9jaGFubmVsX3Bvd2VyX2luZm9fd3JhcHBlcih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKwljc3JfZGlhZ19yZXNldF9jb3VudHJ5X2luZm9ybWF0aW9uKHBNYWMpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSICovCisJY3NyX3BydW5lX2NoYW5uZWxfbGlzdF9mb3JfbW9kZShwTWFjLCAmcE1hYy0+c2Nhbi5iYXNlX2NoYW5uZWxzKTsKKwljc3Jfc2F2ZV9jaGFubmVsX3Bvd2VyX2Zvcl9iYW5kKHBNYWMsIGZhbHNlKTsKKwljc3Jfc2F2ZV9jaGFubmVsX3Bvd2VyX2Zvcl9iYW5kKHBNYWMsIHRydWUpOworCS8qIGFwcGx5IHRoZSBjaGFubmVsIGxpc3QsIHBvd2VyIHNldHRpbmdzLCBhbmQgdGhlIGNvdW50cnkgY29kZS4gKi8KKwljc3JfYXBwbHlfY2hhbm5lbF9wb3dlcl9pbmZvX3RvX2Z3KHBNYWMsCisJCSZwTWFjLT5zY2FuLmJhc2VfY2hhbm5lbHMsIHBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50KTsKKwkvKiBjbGVhciB0aGUgMTFkIGNoYW5uZWwgbGlzdCAqLworCWNkZl9tZW1fc2V0KCZwTWFjLT5zY2FuLmNoYW5uZWxzMTFkLCBzaXplb2YocE1hYy0+c2Nhbi5jaGFubmVsczExZCksIDApOworfQorCit2b2lkIGNzcl9jbGVhcl92b3Rlc19mb3JfY291bnRyeV9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUNvdW50ID0gMDsKKwljZGZfbWVtX3NldChwTWFjLT5zY2FuLnZvdGVzMTFkLAorCQkgICAgc2l6ZW9mKHRDc3JWb3RlczExZCkgKiBDU1JfTUFYX05VTV9DT1VOVFJZX0NPREUsIDApOworfQorCit2b2lkIGNzcl9hZGRfdm90ZV9mb3JfY291bnRyeV9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBDb3VudHJ5Q29kZSkKK3sKKwlib29sIG1hdGNoID0gZmFsc2U7CisJdWludDhfdCBpOworCisJLyogY29udmVydCB0byBVUFBFUiBoZXJlIHNvIHdlIGFyZSBhc3N1cmVkCisJICogdGhlIHN0cmluZ3MgYXJlIGFsd2F5cyBpbiB1cHBlciBjYXNlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcENvdW50cnlDb2RlW2ldID0gKHVpbnQ4X3QpIGNzcl90b191cHBlcihwQ291bnRyeUNvZGVbaV0pOworCX0KKworCS8qIFNvbWUgb2YgdGhlICdvbGQnIENpc2NvIDM1MCBzZXJpZXMgQVAncyBhZHZlcnRpc2UgTkEgYXMgdGhlCisJICogY291bnRyeSBjb2RlIChmb3IgTm9ydGggQW1lcmljYSA/PykuIE5BIGlzIG5vdCBhIHZhbGlkIGNvdW50cnkgY29kZQorCSAqIG9yIGRvbWFpbiBzbyBsZXQncyBhbGxvdyB0aGlzIGJ5IGNoYW5naW5nIGl0IHRvIHRoZSBwcm9wZXIKKwkgKiBjb3VudHJ5IGNvZGUgKHdoaWNoIGlzIFVTKS4gIFdlJ3ZlIGFsc28gc2VlbiBzb21lIE5FVEdFQVIgQVAncworCSAqIHRoYXQgaGF2ZSAiWFggIiBhcyB0aGUgY291bnRyeSBjb2RlIHdpdGggdmFsaWQgMi40IEdIeiBVUyBjaGFubmVsCisJICogaW5mb3JtYXRpb24uICBJZiB3ZSBjYW5ub3QgZmluZCB0aGUgY291bnRyeSBjb2RlIGFkdmVydGlzZWQgaW4gdGhlCisJICogMTFkIGluZm9ybWF0aW9uIGVsZW1lbnQsIGxldCdzIGRlZmF1bHQgdG8gVVMuCisJICovCisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjc3JfZ2V0X3JlZ3VsYXRvcnlfZG9tYWluX2Zvcl9jb3VudHJ5KHBNYWMsCisJCQkJCQlwQ291bnRyeUNvZGUsIE5VTEwsCisJCQkJCQlDT1VOVFJZX1FVRVJZKSkpIHsKKwkJcENvdW50cnlDb2RlWzBdID0gJzAnOworCQlwQ291bnRyeUNvZGVbMV0gPSAnMCc7CisJfQorCisJLyogV2UndmUgc2VlbiBzb21lIG9mIHRoZSBBUCdzIGltcHJvcGVybHkgcHV0IGEgMCBmb3IgdGhlCisJICogdGhpcmQgY2hhcmFjdGVyIG9mIHRoZSBjb3VudHJ5IGNvZGUuIHNwZWMgc2F5cyB2YWxpZCBjaGFyY3RlcnMgYXJlCisJICogJ08nIChmb3Igb3V0ZG9vciksICdJJyBmb3IgSW5kb29yLCBvciAnICcgKHNwYWNlOyBmb3IgZWl0aGVyKS4KKwkgKiBpZiB3ZSBzZWUgYSAwIGluIHRoaXMgdGhpcmQgY2hhcmFjdGVyLCBsZXQncyBjaGFuZ2UgaXQgdG8gYSAnICcuCisJICovCisJaWYgKDAgPT0gcENvdW50cnlDb2RlWzJdKSB7CisJCXBDb3VudHJ5Q29kZVsyXSA9ICcgJzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUNvdW50OyBpKyspIHsKKwkJbWF0Y2ggPSAoY2RmX21lbV9jb21wYXJlKHBNYWMtPnNjYW4udm90ZXMxMWRbaV0uY291bnRyeUNvZGUsCisJCQkJCSBwQ291bnRyeUNvZGUsIDIpKTsKKwkJaWYgKG1hdGNoKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChtYXRjaCkgeworCQlwTWFjLT5zY2FuLnZvdGVzMTFkW2ldLnZvdGVzKys7CisJfSBlbHNlIHsKKwkJY2RmX21lbV9jb3B5KHBNYWMtPnNjYW4udm90ZXMxMWRbcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUNvdW50XS4KKwkJCSAgICAgY291bnRyeUNvZGUsIHBDb3VudHJ5Q29kZSwgMyk7CisJCXBNYWMtPnNjYW4udm90ZXMxMWRbcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUNvdW50XS52b3RlcyA9IDE7CisJCXBNYWMtPnNjYW4uY291bnRyeUNvZGVDb3VudCsrOworCX0KKworCXJldHVybjsKK30KKworYm9vbCBjc3JfZWxlY3RlZF9jb3VudHJ5X2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlib29sIGZSZXQgPSBmYWxzZTsKKwl1aW50OF90IG1heFZvdGVzID0gMDsKKwl1aW50OF90IGksIGogPSAwOworCisJaWYgKCFwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ291bnQpIHsKKwkJcmV0dXJuIGZSZXQ7CisJfQorCW1heFZvdGVzID0gcE1hYy0+c2Nhbi52b3RlczExZFswXS52b3RlczsKKwlmUmV0ID0gdHJ1ZTsKKworCWZvciAoaSA9IDE7IGkgPCBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ291bnQ7IGkrKykgeworCQkvKiBJZiB3ZSBoYXZlIGEgdGllIGZvciBtYXggdm90ZXMgZm9yIDIgZGlmZmVyZW50IGNvdW50cnkgY29kZXMsCisJCSAqIHBpY2sgcmFuZG9tLndlIGNhbiBwdXQgc29tZSBtb3JlIGludGVsbGlnZW5jZSAtIFRCRAorCQkgKi8KKwkJaWYgKG1heFZvdGVzIDwgcE1hYy0+c2Nhbi52b3RlczExZFtpXS52b3RlcykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICIgVm90ZXMgZm9yIENvdW50cnkgJWMlYyA6ICVkXG4iLAorCQkJCSAgcE1hYy0+c2Nhbi52b3RlczExZFtpXS5jb3VudHJ5Q29kZVswXSwKKwkJCQkgIHBNYWMtPnNjYW4udm90ZXMxMWRbaV0uY291bnRyeUNvZGVbMV0sCisJCQkJICBwTWFjLT5zY2FuLnZvdGVzMTFkW2ldLnZvdGVzKTsKKworCQkJbWF4Vm90ZXMgPSBwTWFjLT5zY2FuLnZvdGVzMTFkW2ldLnZvdGVzOworCQkJaiA9IGk7CisJCQlmUmV0ID0gdHJ1ZTsKKwkJfQorCisJfQorCWlmIChmUmV0KSB7CisJCWNkZl9tZW1fY29weShwTWFjLT5zY2FuLmNvdW50cnlDb2RlRWxlY3RlZCwKKwkJICAgICAgIHBNYWMtPnNjYW4udm90ZXMxMWRbal0uY291bnRyeUNvZGUsCisJCSAgICAgICBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCQljZGZfbWVtX2NvcHkocE1hYy0+c2Nhbi5jb3VudHJ5Q29kZTExZCwKKwkJICAgICAgIHBNYWMtPnNjYW4udm90ZXMxMWRbal0uY291bnRyeUNvZGUsCisJCSAgICAgICBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiU2VsZWN0ZWQgQ291bnRyeSBpcyAlYyVjIFdpdGggY291bnQgJWRcbiIsCisJCQkgIHBNYWMtPnNjYW4udm90ZXMxMWRbal0uY291bnRyeUNvZGVbMF0sCisJCQkgIHBNYWMtPnNjYW4udm90ZXMxMWRbal0uY291bnRyeUNvZGVbMV0sCisJCQkgIHBNYWMtPnNjYW4udm90ZXMxMWRbal0udm90ZXMpOworCX0KKwlyZXR1cm4gZlJldDsKK30KKworLyoqCisgKiBjc3Jfc2V0X2NvdW50cnlfY29kZSgpIC0gU2V0IGNvdW50cnkgY29kZQorICogQHBNYWM6IG1haW4gTUFDIGRhdGEgc3RydWN0dXJlCisgKiBAcENvdW50cnk6IHB0ciB0byBDb3VudHJ5IENvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBjaGFubmVsIHBvd2VyIGluZm8gdG8gZmlybXdhcmUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworQ0RGX1NUQVRVUyBjc3Jfc2V0X2NvdW50cnlfY29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwQ291bnRyeSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwl2X1JFR0RPTUFJTl90IGRvbWFpbklkOworCisJaWYgKHBDb3VudHJ5KSB7CisKKwkJc3RhdHVzID0gY3NyX2dldF9yZWd1bGF0b3J5X2RvbWFpbl9mb3JfY291bnRyeShwTWFjLCBwQ291bnRyeSwKKwkJCQkJCQkgICAgICAgJmRvbWFpbklkLAorCQkJCQkJCSAgICAgICBDT1VOVFJZX1VTRVIpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWNkZl9tZW1fY29weShwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwKKwkJCQkgICAgIHBDb3VudHJ5LAorCQkJCSAgICAgV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKTsKKwkJCWNzcl9zZXRfY2ZnX2NvdW50cnlfY29kZShwTWFjLCBwQ291bnRyeSk7CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBOdW1DaG4gYW5kIHBDaG5Qb3dlckluZm8gKi8KKy8qIEFzIGlucHV0LCAqcE51bUNobiBoYXMgdGhlIHNpemUgb2YgdGhlIGFycmF5IG9mIHBDaG5Qb3dlckluZm8gKi8KKy8qIFVwb24gcmV0dXJuLCAqcE51bUNobiBoYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyBhc3NpZ25lZC4gKi8KK3ZvaWQgY3NyX2dldF9jaGFubmVsX3Bvd2VyX2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywgdERibExpbmtMaXN0ICpsaXN0LAorCQkJCXVpbnQzMl90ICpudW1fY2gsCisJCQkJdENoYW5uZWxMaXN0V2l0aFBvd2VyICpjaG5fcHdyX2luZm8pCit7CisJdExpc3RFbGVtICplbnRyeTsKKwl1aW50MzJfdCBjaG5faWR4ID0gMCwgaWR4OworCXRDc3JDaGFubmVsUG93ZXJJbmZvICpjaF9zZXQ7CisKKwkvKiBHZXQgMi40R2h6IGZpcnN0ICovCisJZW50cnkgPSBjc3JfbGxfcGVla19oZWFkKGxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKwl3aGlsZSAoZW50cnkgJiYgKGNobl9pZHggPCAqbnVtX2NoKSkgeworCQljaF9zZXQgPSBHRVRfQkFTRV9BRERSKGVudHJ5LCB0Q3NyQ2hhbm5lbFBvd2VySW5mbywgbGluayk7CisJCWZvciAoaWR4ID0gMDsgKGlkeCA8IGNoX3NldC0+bnVtQ2hhbm5lbHMpCisJCQkJJiYgKGNobl9pZHggPCAqbnVtX2NoKTsgaWR4KyspIHsKKwkJCWNobl9wd3JfaW5mb1tjaG5faWR4XS5jaGFuSWQgPQorCQkJCSh1aW50OF90KSAoY2hfc2V0LT5maXJzdENoYW5uZWwKKwkJCQkgKyAoaWR4ICogY2hfc2V0LT5pbnRlckNoYW5uZWxPZmZzZXQpKTsKKwkJCWNobl9wd3JfaW5mb1tjaG5faWR4KytdLnB3ciA9IGNoX3NldC0+dHhQb3dlcjsKKwkJfQorCQllbnRyeSA9IGNzcl9sbF9uZXh0KGxpc3QsIGVudHJ5LCBMTF9BQ0NFU1NfTE9DSyk7CisJfQorCSpudW1fY2ggPSBjaG5faWR4OworCisJcmV0dXJuOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKK3ZvaWQgY3NyX2RpYWdfYXBwbHlfY291bnRyeV9pbmZvKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJaG9zdF9sb2dfODAyXzExZF9wa3RfdHlwZSAqcDExZExvZzsKKwl0Q2hhbm5lbExpc3RXaXRoUG93ZXIgY2huUHdySW5mb1tXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworCXVpbnQzMl90IG5DaG5JbmZvID0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOLCBuVG1wOworCisJV0xBTl9IT1NUX0RJQUdfTE9HX0FMTE9DKHAxMWRMb2csIGhvc3RfbG9nXzgwMl8xMWRfcGt0X3R5cGUsCisJCQkJIExPR19XTEFOXzgwMjExRF9DKTsKKwlpZiAoIXAxMWRMb2cpCisJCXJldHVybjsKKworCXAxMWRMb2ctPmV2ZW50SWQgPSBXTEFOXzgwMjExRF9FVkVOVF9DT1VOVFJZX1NFVDsKKwljZGZfbWVtX2NvcHkocDExZExvZy0+Y291bnRyeUNvZGUsIG1hY19jdHgtPnNjYW4uY291bnRyeUNvZGUxMWQsIDMpOworCXAxMWRMb2ctPm51bUNoYW5uZWwgPSBtYWNfY3R4LT5zY2FuLmNoYW5uZWxzMTFkLm51bUNoYW5uZWxzOworCWlmIChwMTFkTG9nLT5udW1DaGFubmVsID4gSE9TVF9MT0dfTUFYX05VTV9DSEFOTkVMKQorCQlnb3RvIGRpYWdfZW5kOworCisJY2RmX21lbV9jb3B5KHAxMWRMb2ctPkNoYW5uZWxzLAorCQkgICAgIG1hY19jdHgtPnNjYW4uY2hhbm5lbHMxMWQuY2hhbm5lbExpc3QsCisJCSAgICAgcDExZExvZy0+bnVtQ2hhbm5lbCk7CisJY3NyX2dldF9jaGFubmVsX3Bvd2VyX2luZm8obWFjX2N0eCwKKwkJCQkmbWFjX2N0eC0+c2Nhbi5jaGFubmVsUG93ZXJJbmZvTGlzdDI0LAorCQkJCSZuQ2huSW5mbywgY2huUHdySW5mbyk7CisJblRtcCA9IG5DaG5JbmZvOworCW5DaG5JbmZvID0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOIC0gblRtcDsKKwljc3JfZ2V0X2NoYW5uZWxfcG93ZXJfaW5mbyhtYWNfY3R4LAorCQkJCSZtYWNfY3R4LT5zY2FuLmNoYW5uZWxQb3dlckluZm9MaXN0NUcsCisJCQkJJm5DaG5JbmZvLCAmY2huUHdySW5mb1tuVG1wXSk7CisJZm9yIChuVG1wID0gMDsgblRtcCA8IHAxMWRMb2ctPm51bUNoYW5uZWw7IG5UbXArKykgeworCQlmb3IgKG5DaG5JbmZvID0gMDsKKwkJICAgICBuQ2huSW5mbyA8IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKwkJICAgICBuQ2huSW5mbysrKSB7CisJCQlpZiAocDExZExvZy0+Q2hhbm5lbHNbblRtcF0gPT0KKwkJCSAgICBjaG5Qd3JJbmZvW25DaG5JbmZvXS5jaGFuSWQpIHsKKwkJCQlwMTFkTG9nLT5UeFB3cltuVG1wXSA9CisJCQkJCWNoblB3ckluZm9bbkNobkluZm9dLnB3cjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK2RpYWdfZW5kOgorCWlmICghbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkKQorCQlwMTFkTG9nLT5zdXBwb3J0TXVsdGlwbGVEb21haW4gPSBXTEFOXzgwMjExRF9ESVNBQkxFRDsKKwllbHNlCisJCXAxMWRMb2ctPnN1cHBvcnRNdWx0aXBsZURvbWFpbiA9CisJCQkJV0xBTl84MDIxMURfU1VQUE9SVF9NVUxUSV9ET01BSU47CisJV0xBTl9IT1NUX0RJQUdfTE9HX1JFUE9SVChwMTFkTG9nKTsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IgKi8KKworLyoqCisgKiBjc3JfYXBwbHlfY291bnRyeV9pbmZvcm1hdGlvbigpIC0gYXBwbHkgY291bnRyeSBjb2RlIGluZm9ybWF0aW9uCisgKiBAcE1hYzogY29yZSBNQUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2dyYW1zIHRoZSBuZXcgY291bnRyeSBjb2RlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY3NyX2FwcGx5X2NvdW50cnlfaW5mb3JtYXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl2X1JFR0RPTUFJTl90IGRvbWFpbklkOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKCFjc3JfaXMxMWRfc3VwcG9ydGVkKHBNYWMpCisJICAgIHx8IDAgPT0gcE1hYy0+c2Nhbi5jaGFubmVsT2YxMWRJbmZvKQorCQlyZXR1cm47CisJc3RhdHVzID0gY3NyX2dldF9yZWd1bGF0b3J5X2RvbWFpbl9mb3JfY291bnRyeShwTWFjLAorCQkJcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZTExZCwgJmRvbWFpbklkLCBDT1VOVFJZX1FVRVJZKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm47CisJLyogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGVuZm9yY2UgZGVmYXVsdCBkb21haW4gKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCWNzcl9kaWFnX2FwcGx5X2NvdW50cnlfaW5mbyhwTWFjKTsKKyNlbmRpZiAvKiAjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IgKi8KKworCWlmIChwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCAhPSBkb21haW5JZCkKKwkJcmV0dXJuOworCWlmIChwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCAhPSBkb21haW5JZCkgeworCQlzbXNfbG9nKHBNYWMsIExPR1csIEZMKCJEb21haW4gQ2hhbmdlZCBPbGQgJWQsIG5ldyAlZCIpLAorCQkJcE1hYy0+c2Nhbi5kb21haW5JZEN1cnJlbnQsIGRvbWFpbklkKTsKKwkJc3RhdHVzID0gd21hX3NldF9yZWdfZG9tYWluKHBNYWMsIGRvbWFpbklkKTsKKwl9CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoImZhaWwgdG8gc2V0IHJlZ0lkICVkIiksIGRvbWFpbklkKTsKKwlwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCA9IGRvbWFpbklkOworCS8qIHN3aXRjaCB0byBhY3RpdmUgc2NhbnMgdXNpbmcgdGhpcyBuZXcgY2hhbm5lbCBsaXN0ICovCisJcE1hYy0+c2Nhbi5jdXJTY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47Cit9CisKK3ZvaWQgY3NyX3NhdmVfY2hhbm5lbF9wb3dlcl9mb3JfYmFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCBib29sIGZpbGxfNWYpCit7CisJdWludDMyX3QgaWR4LCBjb3VudCA9IDA7CisJdFNpck1hY0NoYW5JbmZvICpjaGFuX2luZm87CisJdFNpck1hY0NoYW5JbmZvICpjaF9pbmZvX3N0YXJ0OworCWludDMyX3QgbWF4X2NoX2lkeDsKKwlib29sIHRtcF9ib29sOworCXVpbnQ4X3QgY2ggPSAwOworCisJbWF4X2NoX2lkeCA9CisJCShwTWFjLT5zY2FuLmJhc2VfY2hhbm5lbHMubnVtQ2hhbm5lbHMgPAorCQlXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pID8KKwkJcE1hYy0+c2Nhbi5iYXNlX2NoYW5uZWxzLm51bUNoYW5uZWxzIDoKKwkJV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOOworCisJY2hhbl9pbmZvID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbykgKgorCQkJCSAgIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTik7CisJaWYgKE5VTEwgPT0gY2hhbl9pbmZvKQorCQlyZXR1cm47CisKKwljZGZfbWVtX3NldChjaGFuX2luZm8sIHNpemVvZih0U2lyTWFjQ2hhbkluZm8pICoKKwkJICAgIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTiwgMCk7CisJY2hfaW5mb19zdGFydCA9IGNoYW5faW5mbzsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IG1heF9jaF9pZHg7IGlkeCsrKSB7CisJCWNoID0gcE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZVtpZHhdLmNoYW5JZDsKKwkJdG1wX2Jvb2wgPSAgKGZpbGxfNWYgJiYgQ0RTX0lTX0NIQU5ORUxfNUdIWihjaCkpCisJCQl8fCAoIWZpbGxfNWYgJiYgQ0RTX0lTX0NIQU5ORUxfMjRHSFooY2gpKTsKKwkJaWYgKCF0bXBfYm9vbCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjb3VudCA+PSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pIHsKKwkJCXNtc19sb2cocE1hYywgTE9HVywgRkwoImNvdW50KCVkKSBleGNlZWRlZCIpLCBjb3VudCk7CisJCQlicmVhazsKKwkJfQorCisJCWNoYW5faW5mby0+Zmlyc3RDaGFuTnVtID0KKwkJCXBNYWMtPnNjYW4uZGVmYXVsdFBvd2VyVGFibGVbaWR4XS5jaGFuSWQ7CisJCWNoYW5faW5mby0+bnVtQ2hhbm5lbHMgPSAxOworCQljaGFuX2luZm8tPm1heFR4UG93ZXIgPQorCQkJQ0RGX01JTihwTWFjLT5zY2FuLmRlZmF1bHRQb3dlclRhYmxlW2lkeF0ucHdyLAorCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublR4UG93ZXJDYXApOworCQljaGFuX2luZm8rKzsKKwkJY291bnQrKzsKKwl9CisJaWYgKGNvdW50KSB7CisJCWNzcl9zYXZlX3RvX2NoYW5uZWxfcG93ZXIyX2dfNV9nKHBNYWMsCisJCQkJY291bnQgKiBzaXplb2YodFNpck1hY0NoYW5JbmZvKSwgY2hfaW5mb19zdGFydCk7CisJfQorCWNkZl9tZW1fZnJlZShjaF9pbmZvX3N0YXJ0KTsKK30KKworYm9vbCBjc3JfaXNfc3VwcG9ydGVkX2NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBjaGFubmVsSWQpCit7CisJYm9vbCBmUmV0ID0gZmFsc2U7CisJdWludDMyX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwTWFjLT5zY2FuLmJhc2VfY2hhbm5lbHMubnVtQ2hhbm5lbHM7IGkrKykgeworCQlpZiAoY2hhbm5lbElkID09CisJCSAgICBwTWFjLT5zY2FuLmJhc2VfY2hhbm5lbHMuY2hhbm5lbExpc3RbaV0pIHsKKwkJCWZSZXQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZlJldDsKK30KKworLyoKKyAqIDgwMi4xMUQgb25seTogR2F0aGVyIDExZCBJRSB2aWEgYmVhY29uIG9yIFByb2JlIHJlc3BvbnNlIGFuZCBzdG9yZSB0aGVtIGluIHBBZGFwdGVyLT5jaGFubmVsczExZAorICovCitib29sIGNzcl9sZWFybl8xMWRjb3VudHJ5X2luZm9ybWF0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJCQkgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLCBib29sIGZGb3JjZSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl1aW50OF90ICpwQ291bnRyeUNvZGVTZWxlY3RlZDsKKwlib29sIGZSZXQgPSBmYWxzZTsKKwl2X1JFR0RPTUFJTl90IGRvbWFpbklkOworCXREb3QxMWZCZWFjb25JRXMgKnBJZXNMb2NhbCA9IHBJZXM7CisJYm9vbCB1c2VWb3RpbmcgPSBmYWxzZTsKKworCWlmIChDREZfU0FQX01PREUgPT0gY2RzX2dldF9jb25wYXJhbSgpKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKChOVUxMID09IHBTaXJCc3NEZXNjKSAmJiAoTlVMTCA9PSBwSWVzKSkKKwkJdXNlVm90aW5nID0gdHJ1ZTsKKworCS8qIGNoZWNrIGlmIC4xMWQgc3VwcG9ydCBpcyBlbmFibGVkICovCisJaWYgKCFjc3JfaXMxMWRfc3VwcG9ydGVkKHBNYWMpKQorCQlnb3RvIGZyZWVfaWU7CisKKwlpZiAoZmFsc2UgPT0gdXNlVm90aW5nKSB7CisJCWlmICghcEllc0xvY2FsICYmCisJCSAgICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKAorCQkJY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcygKKwkJCQlwTWFjLCBwU2lyQnNzRGVzYywgJnBJZXNMb2NhbCkpKSkKKwkJCWdvdG8gZnJlZV9pZTsKKwkJLyogY2hlY2sgaWYgY291bnRyeSBpbmZvcm1hdGlvbiBlbGVtZW50IGlzIHByZXNlbnQgKi8KKwkJaWYgKCFwSWVzTG9jYWwtPkNvdW50cnkucHJlc2VudCkKKwkJCS8qIE5vIGNvdW50cnkgaW5mbyAqLworCQkJZ290byBmcmVlX2llOworCQlzdGF0dXMgPSBjc3JfZ2V0X3JlZ3VsYXRvcnlfZG9tYWluX2Zvcl9jb3VudHJ5KHBNYWMsCisJCQkJcEllc0xvY2FsLT5Db3VudHJ5LmNvdW50cnksICZkb21haW5JZCwKKwkJCQlDT1VOVFJZX1FVRVJZKTsKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpCisJCSAgICAmJiAoZG9tYWluSWQgPT0gUkVHRE9NQUlOX1dPUkxEKSkKKwkJCWdvdG8gZnJlZV9pZTsKKwl9IC8qIHVzZVZvdGluZyA9PSBmYWxzZSAqLworCisJaWYgKGZhbHNlID09IHVzZVZvdGluZykKKwkJcENvdW50cnlDb2RlU2VsZWN0ZWQgPSBwSWVzTG9jYWwtPkNvdW50cnkuY291bnRyeTsKKwllbHNlCisJCXBDb3VudHJ5Q29kZVNlbGVjdGVkID0gcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUVsZWN0ZWQ7CisKKwlzdGF0dXMgPSBjc3JfZ2V0X3JlZ3VsYXRvcnlfZG9tYWluX2Zvcl9jb3VudHJ5KHBNYWMsCisJCQkJcENvdW50cnlDb2RlU2VsZWN0ZWQsICZkb21haW5JZCwgQ09VTlRSWV9JRSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiZmFpbCB0byBnZXQgcmVnSWQgJWQiKSwgZG9tYWluSWQpOworCQlmUmV0ID0gZmFsc2U7CisJCWdvdG8gZnJlZV9pZTsKKwl9CisKKwkvKiB1cGRhdGluZyAxMWQgQ291bnRyeSBDb2RlIHdpdGggQ291bnRyeSBjb2RlIHNlbGVjdGVkLiAqLworCWNkZl9tZW1fY29weShwTWFjLT5zY2FuLmNvdW50cnlDb2RlMTFkLCBwQ291bnRyeUNvZGVTZWxlY3RlZCwKKwkJICAgICBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCWZSZXQgPSB0cnVlOworZnJlZV9pZToKKwlpZiAoIXBJZXMgJiYgcEllc0xvY2FsKSB7CisJCS8qIGxvY2FsbHkgYWxsb2NhdGVkICovCisJCWNkZl9tZW1fZnJlZShwSWVzTG9jYWwpOworCX0KKwlyZXR1cm4gZlJldDsKK30KKwordm9pZCBjc3Jfc2F2ZV9zY2FuX3Jlc3VsdHModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCByZWFzb24sCisJCQkJICB1aW50OF90IHNlc3Npb25JZCkKK3sKKwlzbXNfbG9nKHBNYWMsIExPRzQsICIlczogU2F2aW5nIHNjYW4gcmVzdWx0cyIsIF9fZnVuY19fKTsKKworCS8qIGluaXRpYWxpemUgdGhpcyB0byBmYWxzZS4gcHJvZk1vdmVJbnRlcmltU2NhblJlc3VsdHNUb01haW5MaXN0KCkgcm91dGluZSAqLworCS8qIHdpbGwgc2V0IHRoaXMgdG8gdGhlIGNoYW5uZWwgd2hlcmUgYW4gLjExZCBiZWFjb24gaXMgc2VlbiAqLworCXBNYWMtPnNjYW4uY2hhbm5lbE9mMTFkSW5mbyA9IDA7CisJLyogbW92ZSB0aGUgc2NhbiByZXN1bHRzIGZyb20gaW50ZXJpbSBsaXN0IHRvIHRoZSBtYWluIHNjYW4gbGlzdCAqLworCWNzcl9tb3ZlX3RlbXBfc2Nhbl9yZXN1bHRzX3RvX21haW5fbGlzdChwTWFjLCByZWFzb24sIHNlc3Npb25JZCk7CisKKwkvKiBOb3cgY2hlY2sgaWYgd2UgZ2F0aGVyZWQgYW55IGRvbWFpbi9jb3VudHJ5IHNwZWNpZmljIGluZm9ybWF0aW9uICovCisJLyogSWYgc28sIHdlIHNob3VsZCB1cGRhdGUgY2hhbm5lbCBsaXN0IGFuZCBhcHBseSBUeCBwb3dlciBzZXR0aW5ncyAqLworCWlmIChjc3JfaXMxMWRfc3VwcG9ydGVkKHBNYWMpKSB7CisJCWNzcl9hcHBseV9jb3VudHJ5X2luZm9ybWF0aW9uKHBNYWMpOworCX0KK30KKwordm9pZCBjc3JfcmVpbml0X3NjYW5fY21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCXN3aXRjaCAocENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pIHsKKwljYXNlIGVDc3JTY2FuQWJvcnROb3JtYWxTY2FuOgorCWRlZmF1bHQ6CisJCWNzcl9zY2FuX2ZyZWVfcmVxdWVzdChwTWFjLCAmcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0KTsKKwkJYnJlYWs7CisJfQorCWlmIChwQ29tbWFuZC0+dS5zY2FuQ21kLnBUb1JvYW1Qcm9maWxlKSB7CisJCWNzcl9yZWxlYXNlX3Byb2ZpbGUocE1hYywgcENvbW1hbmQtPnUuc2NhbkNtZC5wVG9Sb2FtUHJvZmlsZSk7CisJCWNkZl9tZW1fZnJlZShwQ29tbWFuZC0+dS5zY2FuQ21kLnBUb1JvYW1Qcm9maWxlKTsKKwl9CisJY2RmX21lbV9zZXQoJnBDb21tYW5kLT51LnNjYW5DbWQsIHNpemVvZih0U2NhbkNtZCksIDApOworfQorCitlQ3NyU2NhbkNvbXBsZXRlTmV4dENvbW1hbmQgY3NyX3NjYW5fZ2V0X25leHRfY29tbWFuZF9zdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJCSAgICB0U21lQ21kICpwQ29tbWFuZCwKKwkJCQkJCQkgICAgYm9vbCBmU3VjY2VzcykKK3sKKwllQ3NyU2NhbkNvbXBsZXRlTmV4dENvbW1hbmQgTmV4dENvbW1hbmQgPSBlQ3NyTmV4dFNjYW5Ob3RoaW5nOworCisJc3dpdGNoIChwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbikgeworCWNhc2UgZUNzclNjYW4xMWQxOgorCQlOZXh0Q29tbWFuZCA9CisJCQkoZlN1Y2Nlc3MpID8gZUNzck5leHQxMWRTY2FuMVN1Y2Nlc3MgOgorCQkJZUNzck5leHQxMWRTY2FuMUZhaWx1cmU7CisJCWJyZWFrOworCWNhc2UgZUNzclNjYW4xMWQyOgorCQlOZXh0Q29tbWFuZCA9CisJCQkoZlN1Y2Nlc3MpID8gZUNzck5leHQxMWRTY2FuMlN1Y2Nlc3MgOgorCQkJZUNzck5leHQxMWRTY2FuMkZhaWx1cmU7CisJCWJyZWFrOworCWNhc2UgZUNzclNjYW4xMWREb25lOgorCQlOZXh0Q29tbWFuZCA9IGVDc3JOZXh0MTFkU2NhbkNvbXBsZXRlOworCQlicmVhazsKKwljYXNlIGVDc3JTY2FuTG9zdExpbmsxOgorCQlOZXh0Q29tbWFuZCA9CisJCQkoZlN1Y2Nlc3MpID8gZUNzck5leHRMb3N0TGlua1NjYW4xU3VjY2VzcyA6CisJCQllQ3NyTmV4dExvc3RMaW5rU2NhbjFGYWlsZWQ7CisJCWJyZWFrOworCWNhc2UgZUNzclNjYW5Mb3N0TGluazI6CisJCU5leHRDb21tYW5kID0KKwkJCShmU3VjY2VzcykgPyBlQ3NyTmV4dExvc3RMaW5rU2NhbjJTdWNjZXNzIDoKKwkJCWVDc3JOZXh0TG9zdExpbmtTY2FuMkZhaWxlZDsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyU2Nhbkxvc3RMaW5rMzoKKwkJTmV4dENvbW1hbmQgPQorCQkJKGZTdWNjZXNzKSA/IGVDc3JOZXh0TG9zdExpbmtTY2FuM1N1Y2Nlc3MgOgorCQkJZUNzck5leHRMb3N0TGlua1NjYW4zRmFpbGVkOworCQlicmVhazsKKwljYXNlIGVDc3JTY2FuRm9yU3NpZDoKKwkJTmV4dENvbW1hbmQgPQorCQkJKGZTdWNjZXNzKSA/IGVDc3JOZXh0ZVNjYW5Gb3JTc2lkU3VjY2VzcyA6CisJCQllQ3NyTmV4dGVTY2FuRm9yU3NpZEZhaWx1cmU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5leHRDb21tYW5kID0gZUNzck5leHRTY2FuTm90aGluZzsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOZXh0Q29tbWFuZDsKK30KKworLyogUmV0dXJuIHdoZXRoZXIgdGhlIHBDb21tYW5kIGlzIGZpbmlzaGVkLiAqLworYm9vbCBjc3JfaGFuZGxlX3NjYW4xMWQxX2ZhaWx1cmUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisJYm9vbCBmUmV0ID0gdHJ1ZTsKKworCS8qIEFwcGx5IGJhY2sgdGhlIGRlZmF1bHQgc2V0dGluZyBhbmQgcGFzc2l2ZWx5IHNjYW4gb25lIG1vcmUgdGltZS4gKi8KKwljc3JfYXBwbHlfY2hhbm5lbF9wb3dlcl9pbmZvX3dyYXBwZXIocE1hYyk7CisJcENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24gPSBlQ3NyU2NhbjExZDI7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjc3Jfc2Nhbl9jaGFubmVscyhwTWFjLCBwQ29tbWFuZCkpKSB7CisJCWZSZXQgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gZlJldDsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCitzdGF0aWMgdm9pZAorY3NyX2RpYWdfc2Nhbl9jb21wbGV0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkgICAgICAgdFNtZUNtZCAqcENvbW1hbmQsCisJCSAgICAgICB0U2lyU21lU2NhblJzcCAqcFNjYW5Sc3ApCit7CisJaG9zdF9sb2dfc2Nhbl9wa3RfdHlwZSAqcFNjYW5Mb2cgPSBOVUxMOworCXRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0OworCXRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQ7CisJdERvdDExZkJlYWNvbklFcyAqcEllczsKKwlpbnQgbiA9IDAsIGMgPSAwOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJV0xBTl9IT1NUX0RJQUdfTE9HX0FMTE9DKHBTY2FuTG9nLAorCQkJCSBob3N0X2xvZ19zY2FuX3BrdF90eXBlLAorCQkJCSBMT0dfV0xBTl9TQ0FOX0MpOworCWlmICghcFNjYW5Mb2cpCisJCXJldHVybjsKKworCWlmIChlQ3NyU2NhblByb2JlQnNzID09IHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uKSB7CisJCXBTY2FuTG9nLT5ldmVudElkID0gV0xBTl9TQ0FOX0VWRU5UX0hPX1NDQU5fUlNQOworCX0gZWxzZSB7CisJCWlmIChlU0lSX1BBU1NJVkVfU0NBTiAhPSBwTWFjLT5zY2FuLmN1clNjYW5UeXBlKQorCQkJcFNjYW5Mb2ctPmV2ZW50SWQgPSBXTEFOX1NDQU5fRVZFTlRfQUNUSVZFX1NDQU5fUlNQOworCQllbHNlCisJCQlwU2NhbkxvZy0+ZXZlbnRJZCA9IFdMQU5fU0NBTl9FVkVOVF9QQVNTSVZFX1NDQU5fUlNQOworCX0KKwlpZiAoZVNJUl9TTUVfU1VDQ0VTUyAhPSBwU2NhblJzcC0+c3RhdHVzQ29kZSkgeworCQlwU2NhbkxvZy0+c3RhdHVzID0gV0xBTl9TQ0FOX1NUQVRVU19GQUlMVVJFOworCQlXTEFOX0hPU1RfRElBR19MT0dfUkVQT1JUKHBTY2FuTG9nKTsKKwkJcmV0dXJuOworCX0KKworCXN0YXR1cyA9IGNzcl9zY2FuX2dldF9yZXN1bHQocE1hYywgTlVMTCwgJmhTY2FuUmVzdWx0KTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCVdMQU5fSE9TVF9ESUFHX0xPR19SRVBPUlQocFNjYW5Mb2cpOworCQlyZXR1cm47CisJfQorCisJcFNjYW5SZXN1bHQgPSBjc3Jfc2Nhbl9yZXN1bHRfZ2V0X25leHQocE1hYywgaFNjYW5SZXN1bHQpOworCXdoaWxlIChwU2NhblJlc3VsdCAhPSBOVUxMKSB7CisJCWlmIChuIDwgSE9TVF9MT0dfTUFYX05VTV9CU1NJRCkgeworCQkJc3RhdHVzID0gY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcyhwTWFjLAorCQkJCQkmcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IsICZwSWVzKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJmYWlsIHRvIHBhcnNlIElFcyIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNkZl9tZW1fY29weShwU2NhbkxvZy0+YnNzaWRbbl0sCisJCQkJcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWQsIDYpOworCQkJaWYgKHBJZXMgJiYgcEllcy0+U1NJRC5wcmVzZW50ICYmCisJCQkgICAgSE9TVF9MT0dfTUFYX1NTSURfU0laRSA+PSBwSWVzLT5TU0lELm51bV9zc2lkKSB7CisJCQkJY2RmX21lbV9jb3B5KHBTY2FuTG9nLT5zc2lkW25dLAorCQkJCQlwSWVzLT5TU0lELnNzaWQsCisJCQkJCXBJZXMtPlNTSUQubnVtX3NzaWQpOworCQkJfQorCQkJY2RmX21lbV9mcmVlKHBJZXMpOworCQkJbisrOworCQl9CisJCWMrKzsKKwkJcFNjYW5SZXN1bHQgPSBjc3Jfc2Nhbl9yZXN1bHRfZ2V0X25leHQocE1hYywgaFNjYW5SZXN1bHQpOworCX0KKwlwU2NhbkxvZy0+bnVtU3NpZCA9ICh1aW50OF90KSBuOworCXBTY2FuTG9nLT50b3RhbFNzaWQgPSAodWludDhfdCkgYzsKKwljc3Jfc2Nhbl9yZXN1bHRfcHVyZ2UocE1hYywgaFNjYW5SZXN1bHQpOworCVdMQU5fSE9TVF9ESUFHX0xPR19SRVBPUlQocFNjYW5Mb2cpOworCisJY3NyX2RpYWdfZXZlbnRfcmVwb3J0KHBNYWMsIGVDU1JfRVZFTlRfU0NBTl9DT01QTEVURSwgZVNJUl9TVUNDRVNTLAorCQkJICAgICAgZVNJUl9TVUNDRVNTKTsKKwlpZiAoYyA+IDApCisJCWNzcl9kaWFnX2V2ZW50X3JlcG9ydChwTWFjLCBlQ1NSX0VWRU5UX1NDQU5fUkVTX0ZPVU5ELAorCQkJCSAgICAgIGVTSVJfU1VDQ0VTUywgZVNJUl9TVUNDRVNTKTsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IgKi8KKworc3RhdGljIHZvaWQKK2Nzcl9oYW5kbGVfbnh0X2NtZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0U21lQ21kICpwQ29tbWFuZCwKKwkJICAgZUNzclNjYW5Db21wbGV0ZU5leHRDb21tYW5kICpueHRfY21kLAorCQkgICBib29sICpyZW1vdmVfY21kLCB1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXN3aXRjaCAoKm54dF9jbWQpIHsKKwljYXNlIGVDc3JOZXh0MTFkU2NhbjFTdWNjZXNzOgorCWNhc2UgZUNzck5leHQxMWRTY2FuMlN1Y2Nlc3M6CisJCXNtc19sb2cobWFjX2N0eCwgTE9HMiwKKwkJCUZMKCIxMWRTY2FuMS8zIHByb2R1Y2VkIHJlc3VsdHMuIFJlaXNzdWUgQWN0aXZlIHNjYW4iKSk7CisJCS8qCisJCSAqIGlmIHdlIGZvdW5kIGNvdW50cnkgaW5mb3JtYXRpb24sIG5vIG5lZWQgdG8gY29udGludWUgc2Nhbm5pbmcKKwkJICogZnVydGhlciwgYmFpbCBvdXQKKwkJICovCisJCSpyZW1vdmVfY21kID0gdHJ1ZTsKKwkJKm54dF9jbWQgPSBlQ3NyTmV4dDExZFNjYW5Db21wbGV0ZTsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyTmV4dDExZFNjYW4xRmFpbHVyZToKKwkJLyoKKwkJICogV2UgYXJlIG5vdCBkb25lIHlldC4gMTFkIHNjYW4gZmFpbCBvbmNlLiBXZSB3aWxsIHRyeSB0byByZXNldAorCQkgKiBhbnl0aGluZyBhbmQgZG8gaXQgb3ZlciBhZ2Fpbi4gVGhlIG9ubHkgbWVhbmluZ2Z1bCB0aGluZyBmb3IKKwkJICogdGhpcyByZXRyeSBpcyB0aGF0IHdlIGNhbm5vdCBmaW5kIDExZCBpbmZvcm1hdGlvbiBhZnRlciBhCisJCSAqIHJlc2V0IHNvIHdlIGNsZWFyIHRoZSAib2xkIiAxMWQgaW5mbyBhbmQgZ2l2ZSBpdCBvbmNlIG1vcmUKKwkJICogY2hhbmNlCisJCSAqLworCQkqcmVtb3ZlX2NtZCA9IGNzcl9oYW5kbGVfc2NhbjExZDFfZmFpbHVyZShtYWNfY3R4LCBwQ29tbWFuZCk7CisJCWlmICgqcmVtb3ZlX2NtZCkKKwkJCSpueHRfY21kID0gZUNzck5leHQxMWRTY2FuQ29tcGxldGU7CisJCWJyZWFrOworCWNhc2UgZUNzck5leHRMb3N0TGlua1NjYW4xU3VjY2VzczoKKwkJc3RhdHVzID0gY3NyX2lzc3VlX3JvYW1fYWZ0ZXJfbG9zdGxpbmtfc2NhbihtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQkJCQkJCSAgICBlQ3NyTG9zdExpbmsxKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCWNzcl9zY2FuX2hhbmRsZV9mYWlsZWRfbG9zdGxpbmsxKG1hY19jdHgsIHNlc3Npb25faWQpOworCQlicmVhazsKKwljYXNlIGVDc3JOZXh0TG9zdExpbmtTY2FuMlN1Y2Nlc3M6CisJCXN0YXR1cyA9IGNzcl9pc3N1ZV9yb2FtX2FmdGVyX2xvc3RsaW5rX3NjYW4obWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCQkJCQkgICAgZUNzckxvc3RMaW5rMik7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQljc3Jfc2Nhbl9oYW5kbGVfZmFpbGVkX2xvc3RsaW5rMihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyTmV4dExvc3RMaW5rU2NhbjNTdWNjZXNzOgorCQlzdGF0dXMgPSBjc3JfaXNzdWVfcm9hbV9hZnRlcl9sb3N0bGlua19zY2FuKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJCQkJICAgIGVDc3JMb3N0TGluazMpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJY3NyX3NjYW5faGFuZGxlX2ZhaWxlZF9sb3N0bGluazMobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJCWJyZWFrOworCWNhc2UgZUNzck5leHRMb3N0TGlua1NjYW4xRmFpbGVkOgorCQljc3Jfc2Nhbl9oYW5kbGVfZmFpbGVkX2xvc3RsaW5rMShtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyTmV4dExvc3RMaW5rU2NhbjJGYWlsZWQ6CisJCWNzcl9zY2FuX2hhbmRsZV9mYWlsZWRfbG9zdGxpbmsyKG1hY19jdHgsIHNlc3Npb25faWQpOworCQlicmVhazsKKwljYXNlIGVDc3JOZXh0TG9zdExpbmtTY2FuM0ZhaWxlZDoKKwkJY3NyX3NjYW5faGFuZGxlX2ZhaWxlZF9sb3N0bGluazMobWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJCWJyZWFrOworCWNhc2UgZUNzck5leHRlU2NhbkZvclNzaWRTdWNjZXNzOgorCQljc3Jfc2Nhbl9oYW5kbGVfc2VhcmNoX2Zvcl9zc2lkKG1hY19jdHgsIHBDb21tYW5kKTsKKwkJYnJlYWs7CisJY2FzZSBlQ3NyTmV4dGVTY2FuRm9yU3NpZEZhaWx1cmU6CisJCWNzcl9zY2FuX2hhbmRsZV9zZWFyY2hfZm9yX3NzaWRfZmFpbHVyZShtYWNfY3R4LCBwQ29tbWFuZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBjc3JfZ2V0X2FjdGl2ZV9zY2FuX2VudHJ5KCkgLSBUbyBnZXQgc2NhbiBlbnRyeSBmcm9tIGFjdGl2ZSBjb21tYW5kIGxpc3QKKyAqCisgKiBAbWFjX2N0eCAtIE1BQyBjb250ZXh0CisgKiBAc2Nhbl9pZCAtIFNjYW4gaWRlbnRpZmllciBvZiB0aGUgc2NhbiByZXF1ZXN0CisgKiBAZW50cnkgLSBzY2FuIGVudHJ5IHJldHVybmVkLgorICoKKyAqIFNjYW4gZW50cnkgaW4gdGhlIGFjdGl2ZSBzY2FuIGxpc3QgbWFwcGluZyB0byB0aGUgc2VudCBzY2FuIGlkCisgKiBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUy4KKyAqLworQ0RGX1NUQVRVUyBjc3JfZ2V0X2FjdGl2ZV9zY2FuX2VudHJ5KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJdWludDMyX3Qgc2Nhbl9pZCwgdExpc3RFbGVtICoqZW50cnkpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0TGlzdEVsZW0gKmxvY2FsZW50cnk7CisJdFNtZUNtZCAqY21kOworCXVpbnQzMl90IGNtZF9zY2FuX2lkID0gMDsKKworCWNzcl9sbF9sb2NrKCZtYWNfY3R4LT5zbWUuc21lU2NhbkNtZEFjdGl2ZUxpc3QpOworCisJaWYgKGNzcl9sbF9pc19saXN0X2VtcHR5KCZtYWNfY3R4LT5zbWUuc21lU2NhbkNtZEFjdGl2ZUxpc3QsCisJCQlMTF9BQ0NFU1NfTk9MT0NLKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiIEFjdGl2ZSBsaXN0IEVtcHR5IHNjYW5JZDogJWQiKSwgc2Nhbl9pZCk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCWxvY2FsZW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZtYWNfY3R4LT5zbWUuc21lU2NhbkNtZEFjdGl2ZUxpc3QsCisJCQlMTF9BQ0NFU1NfTk9MT0NLKTsKKwlkbyB7CisJCWNtZCA9IEdFVF9CQVNFX0FERFIobG9jYWxlbnRyeSwgdFNtZUNtZCwgTGluayk7CisJCWlmIChjbWQtPmNvbW1hbmQgPT0gZVNtZUNvbW1hbmRTY2FuKQorCQkJY21kX3NjYW5faWQgPSBjbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LnNjYW5faWQ7CisJCWVsc2UgaWYgKGNtZC0+Y29tbWFuZCA9PSBlU21lQ29tbWFuZFJlbWFpbk9uQ2hhbm5lbCkKKwkJCWNtZF9zY2FuX2lkID0gY21kLT51LnJlbWFpbkNobENtZC5zY2FuX2lkOworCQlpZiAoY21kX3NjYW5faWQgPT0gc2Nhbl9pZCkgeworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiIHNjYW5JZCBNYXRjaGVkICVkIiksCisJCQkJCXNjYW5faWQpOworCQkJKmVudHJ5ID0gbG9jYWxlbnRyeTsKKwkJCWNzcl9sbF91bmxvY2soJm1hY19jdHgtPnNtZS5zbWVTY2FuQ21kQWN0aXZlTGlzdCk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9CisJCWxvY2FsZW50cnkgPSBjc3JfbGxfbmV4dCgmbWFjX2N0eC0+c21lLnNtZVNjYW5DbWRBY3RpdmVMaXN0LAorCQkJCWxvY2FsZW50cnksIExMX0FDQ0VTU19OT0xPQ0spOworCX0gd2hpbGUgKGxvY2FsZW50cnkpOworCWNzcl9sbF91bmxvY2soJm1hY19jdHgtPnNtZS5zbWVTY2FuQ21kQWN0aXZlTGlzdCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHJlbW92ZWQgKi8KK2Jvb2wgY3NyX3NjYW5fY29tcGxldGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclNtZVNjYW5Sc3AgKnBTY2FuUnNwKQoreworCWVDc3JTY2FuQ29tcGxldGVOZXh0Q29tbWFuZCBOZXh0Q29tbWFuZCA9IGVDc3JOZXh0U2Nhbk5vdGhpbmc7CisJdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworCXRTbWVDbWQgKnBDb21tYW5kOworCWJvb2wgZlJlbW92ZUNvbW1hbmQgPSB0cnVlOworCWJvb2wgZlN1Y2Nlc3M7CisJdWludDMyX3Qgc2Vzc2lvbklkID0gMDsKKworCWNzcl9nZXRfYWN0aXZlX3NjYW5fZW50cnkocE1hYywgcFNjYW5Sc3AtPnNjYW5faWQsICZwRW50cnkpOworCWlmICghcEVudHJ5KSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJTY2FuIENvbXBsZXRpb24gY2FsbGVkIGJ1dCBOTyBjbWQgQUNUSVZFIC4uLiIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCS8qCisJICogSWYgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGlzIEFjdGl2ZSBhbmQgaXQgaXMgYSBTQ0FOIGNvbW1hbmQsIHJlbW92ZQorCSAqIGFuZCBwdXQgdGhpcyBvbiB0aGUgRnJlZSBxdWV1ZS4KKwkgKi8KKwlpZiAoZVNtZUNvbW1hbmRTY2FuICE9IHBDb21tYW5kLT5jb21tYW5kKSB7CisJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCUZMKCJTY2FuIENvbXBsZXRpb24gY2FsbGVkLCBidXQgYWN0aXZlIFNDQU4gY21kIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsKKwlpZiAoZVNJUl9TTUVfU1VDQ0VTUyAhPSBwU2NhblJzcC0+c3RhdHVzQ29kZSkgeworCQlmU3VjY2VzcyA9IGZhbHNlOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHBNYWMtPnNjYW4udGVtcFNjYW5SZXN1bHRzIGlzIG5vdCBlbXB0eSBtZWFuaW5nIHRoZSBzY2FuCisJCSAqIGZvdW5kIHNvbWV0aGluZy4gVGhpcyBjaGVjayBvbmx5IHZhbGlkIGhlcmUgYmVjYXVzZQorCQkgKiBjc3JTYXZlU2NhbnJlc3VsdHMgaXMgbm90IHlldCBjYWxsZWQKKwkJICovCisJCWZTdWNjZXNzID0gKCFjc3JfbGxfaXNfbGlzdF9lbXB0eSgmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMsCisJCQkJCQkgIExMX0FDQ0VTU19MT0NLKSk7CisJfQorCWlmIChwQ29tbWFuZC0+dS5zY2FuQ21kLmFib3J0U2NhbkR1ZVRvQmFuZENoYW5nZSkgeworCQkvKgorCQkgKiBTY2FuIGFib3J0ZWQgZHVlIHRvIGJhbmQgY2hhbmdlCisJCSAqIFRoZSBzY2FuIHJlc3VsdHMgbmVlZCB0byBiZSBmbHVzaGVkCisJCSAqLworCQlpZiAocENvbW1hbmQtPnUuc2NhbkNtZC5jYWxsYmFjaworCQkgICAgIT0gcE1hYy0+c2Nhbi5jYWxsYmFjazExZFNjYW5Eb25lKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJGaWx0ZXJpbmcgdGhlIHNjYW4gcmVzdWx0cyIpKTsKKwkJCWNzcl9zY2FuX2ZpbHRlcl9yZXN1bHRzKHBNYWMpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJCUZMKCIxMWRfc2Nhbl9kb25lLCBmbHVzaGluZyB0aGUgc2NhbiByZXN1bHRzIikpOworCQl9CisJCXBDb21tYW5kLT51LnNjYW5DbWQuYWJvcnRTY2FuRHVlVG9CYW5kQ2hhbmdlID0gZmFsc2U7CisJfQorCWNzcl9zYXZlX3NjYW5fcmVzdWx0cyhwTWFjLCBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiwgc2Vzc2lvbklkKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCWNzcl9kaWFnX3NjYW5fY29tcGxldGUocE1hYywgcENvbW1hbmQsIHBTY2FuUnNwKTsKKyNlbmRpZiAvKiAjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IgKi8KKwlOZXh0Q29tbWFuZCA9IGNzcl9zY2FuX2dldF9uZXh0X2NvbW1hbmRfc3RhdGUocE1hYywgcENvbW1hbmQsIGZTdWNjZXNzKTsKKwkvKiBXZSByZXVzZSB0aGUgY29tbWFuZCBoZXJlIGluc3RlYWQgcmVpc3N1ZSBhIG5ldyBjb21tYW5kICovCisJY3NyX2hhbmRsZV9ueHRfY21kKHBNYWMsIHBDb21tYW5kLCAmTmV4dENvbW1hbmQsCisJCQkgICAmZlJlbW92ZUNvbW1hbmQsIHNlc3Npb25JZCk7CisJcmV0dXJuIGZSZW1vdmVDb21tYW5kOworfQorCitzdGF0aWMgdm9pZAorY3NyX3NjYW5fcmVtb3ZlX2R1cF9ic3NfZGVzY3JpcHRpb25fZnJvbV9pbnRlcmltX2xpc3QodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkJdFNpckJzc0Rlc2NyaXB0aW9uICpic3NfZHNjcCwKKwkJCQkJdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwl0Q3NyU2NhblJlc3VsdCAqc2Nhbl9ic3NfZHNjcDsKKwlpbnQ4X3Qgc2Nhbl9lbnRyeV9yc3NpID0gMDsKKwkvKgorCSAqIFdhbGsgdGhyb3VnaCBhbGwgdGhlIGNoYWluZWQgQnNzRGVzY3JpcHRpb25zLiBJZiB3ZSBmaW5kIGEgY2hhaW5lZAorCSAqIEJzc0Rlc2NyaXB0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgQnNzSUQgb2YgdGhlIEJzc0Rlc2NyaXB0aW9uIHBhc3NlZAorCSAqIGluLCB0aGVuIHRoZXNlIG11c3QgYmUgZHVwbGljYXRlIHNjYW4gcmVzdWx0cyBmb3IgdGhpcyBCc3MuIEluIHRoYXQKKwkgKiBjYXNlLCByZW1vdmUgdGhlICdvbGQnIEJzcyBkZXNjcmlwdGlvbiBmcm9tIHRoZSBsaW5rZWQgbGlzdC4KKwkgKi8KKwlzbXNfbG9nKG1hY19jdHgsIExPRzQsIEZMKCIgZm9yIEJTUyAiIE1BQ19BRERSRVNTX1NUUiAiICIpLAorCQlNQUNfQUREUl9BUlJBWShic3NfZHNjcC0+YnNzSWQpKTsKKwljc3JfbGxfbG9jaygmbWFjX2N0eC0+c2Nhbi50ZW1wU2NhblJlc3VsdHMpOworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJm1hY19jdHgtPnNjYW4udGVtcFNjYW5SZXN1bHRzLAorCQkJCSBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl3aGlsZSAocEVudHJ5KSB7CisJCXNjYW5fYnNzX2RzY3AgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQkvKgorCQkgKiB3ZSBoYXZlIGEgZHVwbGljYXRlIHNjYW4gcmVzdWx0cyBvbmx5IHdoZW4gQlNTSUQsIFNTSUQsCisJCSAqIENoYW5uZWwgYW5kIE5ldHdvcmtUeXBlIG1hdGNoZXMKKwkJICovCisJCXNjYW5fZW50cnlfcnNzaSA9IHNjYW5fYnNzX2RzY3AtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLnJzc2k7CisJCWlmIChjc3JfaXNfZHVwbGljYXRlX2Jzc19kZXNjcmlwdGlvbihtYWNfY3R4LAorCQkJJnNjYW5fYnNzX2RzY3AtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCBic3NfZHNjcCwKKwkJCXBJZXMsIGZhbHNlKSkgeworCQkJLyoKKwkJCSAqIEZvbGxvd2luZyBpcyBtYXRoZW1hdGljYWxseSBhID0gKGFYICsgYigxMDAtWCkpLzEwMAorCQkJICogd2hlcmU6CisJCQkgKiBhID0gYnNzX2RzY3AtPnJzc2ksIGIgPSBzY2FuX2VudHJ5X3Jzc2kKKwkJCSAqIGFuZCBYID0gQ1NSX1NDQU5fUkVTVUxUX1JTU0lfV0VJR0hUCisJCQkgKi8KKwkJCWJzc19kc2NwLT5yc3NpID0gKGludDhfdCkgKCgoKGludDMyX3QpIGJzc19kc2NwLT5yc3NpICoKKwkJCQlDU1JfU0NBTl9SRVNVTFRfUlNTSV9XRUlHSFQpICsKKwkJCQkoKGludDMyX3QpIHNjYW5fZW50cnlfcnNzaSAqCisJCQkJICgxMDAgLSBDU1JfU0NBTl9SRVNVTFRfUlNTSV9XRUlHSFQpKSkgLyAxMDApOworCQkJLyogUmVtb3ZlIHRoZSAnb2xkJyBlbnRyeSBmcm9tIHRoZSBsaXN0ICovCisJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeSgmbWFjX2N0eC0+c2Nhbi50ZW1wU2NhblJlc3VsdHMsCisJCQkJcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKSkgeworCQkJCWNzcl9jaGVja19uX3NhdmVfd3NjX2llKG1hY19jdHgsIGJzc19kc2NwLAorCQkJCQkJCSZzY2FuX2Jzc19kc2NwLT5SZXN1bHQuCisJCQkJCQkJQnNzRGVzY3JpcHRvcik7CisJCQkJLyoKKwkJCQkgKiB3ZSBuZWVkIHRvIGZyZWUgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGgKKwkJCQkgKiB0aGlzIG5vZGUKKwkJCQkgKi8KKwkJCQljc3JfZnJlZV9zY2FuX3Jlc3VsdF9lbnRyeShtYWNfY3R4LAorCQkJCQkJCSAgIHNjYW5fYnNzX2RzY3ApOworCQkJfQorCQkJLyoKKwkJCSAqIElmIHdlIGZvdW5kIGEgbWF0Y2gsIHdlIGNhbiBzdG9wIGxvb2tpbmcgdGhyb3VnaAorCQkJICogdGhlIGxpc3QuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJCXBFbnRyeSA9IGNzcl9sbF9uZXh0KCZtYWNfY3R4LT5zY2FuLnRlbXBTY2FuUmVzdWx0cywgcEVudHJ5LAorCQkJCSAgICAgTExfQUNDRVNTX05PTE9DSyk7CisJfQorCisJY3NyX2xsX3VubG9jaygmbWFjX2N0eC0+c2Nhbi50ZW1wU2NhblJlc3VsdHMpOworfQorCisvKiBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBwZk5ld0Jzc0ZvckNvbm4gdG8gcmV0dXJuIHdoZXRoZXIgbmV3IGNhbmRpZGF0ZSBmb3IgKi8KKy8qIGN1cnJlbnQgY29ubmVjdGlvbiBpcyBmb3VuZC4gQ2Fubm90IGJlIE5VTEwgKi8KK3RDc3JTY2FuUmVzdWx0ICpjc3Jfc2Nhbl9zYXZlX2Jzc19kZXNjcmlwdGlvbl90b19pbnRlcmltX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCQkgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKgorCQkJCQkJCSAgICAgIHBCU1NEZXNjcmlwdGlvbiwKKwkJCQkJCQkgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworCXRDc3JTY2FuUmVzdWx0ICpwQ3NyQnNzRGVzY3JpcHRpb24gPSBOVUxMOworCXVpbnQzMl90IGNiQlNTRGVzYzsKKwl1aW50MzJfdCBjYkFsbG9jYXRlZDsKKworCS8qIGZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgQlNTIGRlc2NyaXB0aW9uIGlzICh0aGUgQlNTRGVzYy0+bGVuZ3RoIGRvZXMgTk9UICovCisJLyogaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgbGVuZ3RoIGZpZWxkIGl0c2VsZikuICovCisJY2JCU1NEZXNjID0gcEJTU0Rlc2NyaXB0aW9uLT5sZW5ndGggKyBzaXplb2YocEJTU0Rlc2NyaXB0aW9uLT5sZW5ndGgpOworCisJY2JBbGxvY2F0ZWQgPSBzaXplb2YodENzclNjYW5SZXN1bHQpICsgY2JCU1NEZXNjOworCisJc21zX2xvZyhwTWFjLCBMT0c0LCBGTCgibmV3IEJTUyBkZXNjcmlwdGlvbiwgbGVuZ3RoICVkLCBjYkJTU0Rlc2MgJWQiKSwKKwkJY2JBbGxvY2F0ZWQsIGNiQlNTRGVzYyk7CisJcENzckJzc0Rlc2NyaXB0aW9uID0gY2RmX21lbV9tYWxsb2MoY2JBbGxvY2F0ZWQpOworCWlmIChOVUxMICE9IHBDc3JCc3NEZXNjcmlwdGlvbikgeworCQljZGZfbWVtX3NldChwQ3NyQnNzRGVzY3JpcHRpb24sIGNiQWxsb2NhdGVkLCAwKTsKKwkJY2RmX21lbV9jb3B5KCZwQ3NyQnNzRGVzY3JpcHRpb24tPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLAorCQkJICAgICBwQlNTRGVzY3JpcHRpb24sIGNiQlNTRGVzYyk7CisJCXBDc3JCc3NEZXNjcmlwdGlvbi0+QWdpbmdDb3VudCA9CisJCQkoaW50MzJfdCkgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5hZ2luZ0NvdW50OworCQlzbXNfbG9nKHBNYWMsIExPRzQsCisJCQlGTCgiIFNldCBBZ2luZyBDb3VudCA9ICVkIGZvciBCU1MgIiBNQUNfQUREUkVTU19TVFIgIiAiKSwKKwkJCXBDc3JCc3NEZXNjcmlwdGlvbi0+QWdpbmdDb3VudCwKKwkJCU1BQ19BRERSX0FSUkFZKHBDc3JCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuCisJCQkJICAgICAgIGJzc0lkKSk7CisJCS8qIFNhdmUgU1NJRCBzZXBhcmF0ZWx5IGZvciBsYXRlciB1c2UgKi8KKwkJaWYgKHBJZXMtPlNTSUQucHJlc2VudAorCQkgICAgJiYgIWNzcl9pc19udWxsc3NpZChwSWVzLT5TU0lELnNzaWQsIHBJZXMtPlNTSUQubnVtX3NzaWQpKSB7CisJCQkvKiBTU0lEIG5vdCBoaWRkZW4gKi8KKwkJCXVpbnQzMl90IGxlbiA9IHBJZXMtPlNTSUQubnVtX3NzaWQ7CisJCQlpZiAobGVuID4gU0lSX01BQ19NQVhfU1NJRF9MRU5HVEgpIHsKKwkJCQkvKiB0cnVuY2F0ZSB0byBmaXQgaW4gb3VyIHN0cnVjdCAqLworCQkJCWxlbiA9IFNJUl9NQUNfTUFYX1NTSURfTEVOR1RIOworCQkJfQorCQkJcENzckJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQuc3NJZC5sZW5ndGggPSBsZW47CisJCQlwQ3NyQnNzRGVzY3JpcHRpb24tPlJlc3VsdC50aW1lciA9CisJCQkJY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOworCQkJY2RmX21lbV9jb3B5KHBDc3JCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LnNzSWQuc3NJZCwKKwkJCQkgICAgIHBJZXMtPlNTSUQuc3NpZCwgbGVuKTsKKwkJfQorCQljc3JfbGxfaW5zZXJ0X3RhaWwoJnBNYWMtPnNjYW4udGVtcFNjYW5SZXN1bHRzLAorCQkJCSAgICZwQ3NyQnNzRGVzY3JpcHRpb24tPkxpbmssIExMX0FDQ0VTU19MT0NLKTsKKwl9CisKKwlyZXR1cm4gcENzckJzc0Rlc2NyaXB0aW9uOworfQorCitib29sIGNzcl9pc19kdXBsaWNhdGVfYnNzX2Rlc2NyaXB0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzEsCisJCQkJICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzIsCisJCQkJICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllczIsIGJvb2wgZkZvcmNlZCkKK3sKKwlib29sIGZNYXRjaCA9IGZhbHNlOworCXRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqcENhcDEsICpwQ2FwMjsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzMSA9IE5VTEw7CisJdERvdDExZkJlYWNvbklFcyAqcEllc1RlbXAgPSBwSWVzMjsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCXBDYXAxID0gKHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqKSAmcFNpckJzc0Rlc2MxLT5jYXBhYmlsaXR5SW5mbzsKKwlwQ2FwMiA9ICh0U2lyTWFjQ2FwYWJpbGl0eUluZm8gKikgJnBTaXJCc3NEZXNjMi0+Y2FwYWJpbGl0eUluZm87CisKKwlpZiAocENhcDEtPmVzcyAhPSBwQ2FwMi0+ZXNzKQorCQlnb3RvIGZyZWVfaWVzOworCisJaWYgKHBDYXAxLT5lc3MgJiYKKwkgICAgY2RmX2lzX21hY2FkZHJfZXF1YWwoKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgcFNpckJzc0Rlc2MxLT5ic3NJZCwKKwkJCQkgKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgcFNpckJzc0Rlc2MyLT5ic3NJZCkKKwkgICAgJiYgKGZGb3JjZWQKKwkJfHwgKGNkc19jaGFuX3RvX2JhbmQocFNpckJzc0Rlc2MxLT5jaGFubmVsSWQpID09CisJCSAgICBjZHNfY2hhbl90b19iYW5kKChwU2lyQnNzRGVzYzItPmNoYW5uZWxJZCkpKSkpIHsKKwkJZk1hdGNoID0gdHJ1ZTsKKwkJLyogQ2hlY2sgZm9yIFNTSUQgbWF0Y2gsIGlmIGV4aXN0cyAqLworCQlzdGF0dXMgPSBjc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzKHBNYWMsIHBTaXJCc3NEZXNjMSwKKwkJCQkJCQkgICAgJnBJZXMxKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCWdvdG8gZnJlZV9pZXM7CisKKwkJaWYgKE5VTEwgPT0gcEllc1RlbXApIHsKKwkJCXN0YXR1cyA9IGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMocE1hYywKKwkJCQkJCXBTaXJCc3NEZXNjMiwgJnBJZXNUZW1wKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQkJZ290byBmcmVlX2llczsKKwkJfQorCQlpZiAocEllczEtPlNTSUQucHJlc2VudCAmJiBwSWVzVGVtcC0+U1NJRC5wcmVzZW50KSB7CisJCQlmTWF0Y2ggPSBjc3JfaXNfc3NpZF9tYXRjaChwTWFjLCBwSWVzMS0+U1NJRC5zc2lkLAorCQkJCQkJICAgcEllczEtPlNTSUQubnVtX3NzaWQsCisJCQkJCQkgICBwSWVzVGVtcC0+U1NJRC5zc2lkLAorCQkJCQkJICAgcEllc1RlbXAtPlNTSUQubnVtX3NzaWQsCisJCQkJCQkgICB0cnVlKTsKKwkJfQorCX0gZWxzZSBpZiAocENhcDEtPmlic3MgJiYgKHBTaXJCc3NEZXNjMS0+Y2hhbm5lbElkID09CisJCQkJCXBTaXJCc3NEZXNjMi0+Y2hhbm5lbElkKSkgeworCQlzdGF0dXMgPSBjc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzKHBNYWMsIHBTaXJCc3NEZXNjMSwKKwkJCQkJCQkgICAgJnBJZXMxKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCWdvdG8gZnJlZV9pZXM7CisKKwkJaWYgKE5VTEwgPT0gcEllc1RlbXApIHsKKwkJCXN0YXR1cyA9IGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMocE1hYywKKwkJCQkJCXBTaXJCc3NEZXNjMiwgJnBJZXNUZW1wKTsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCQkJZ290byBmcmVlX2llczsKKwkJfQorCisJCS8qIFNhbWUgY2hhbm5lbCBjYW5ub3QgaGF2ZSBzYW1lIFNTSUQgZm9yIGRpZmZlcmVudCBJQlNTICovCisJCWlmIChwSWVzMS0+U1NJRC5wcmVzZW50ICYmIHBJZXNUZW1wLT5TU0lELnByZXNlbnQpIHsKKwkJCWZNYXRjaCA9IGNzcl9pc19zc2lkX21hdGNoKHBNYWMsIHBJZXMxLT5TU0lELnNzaWQsCisJCQkJCQkgICBwSWVzMS0+U1NJRC5udW1fc3NpZCwKKwkJCQkJCSAgIHBJZXNUZW1wLT5TU0lELnNzaWQsCisJCQkJCQkgICBwSWVzVGVtcC0+U1NJRC5udW1fc3NpZCwKKwkJCQkJCSAgIHRydWUpOworCQl9CisJfQorCS8qIEluIGNhc2Ugb2YgUDJQIGRldmljZXMsIGVzcyBhbmQgaWJzcyB3aWxsIGJlIHNldCB0byB6ZXJvICovCisJZWxzZSBpZiAoIXBDYXAxLT5lc3MgJiYKKwkJY2RmX2lzX21hY2FkZHJfZXF1YWwoCisJCQkoc3RydWN0IGNkZl9tYWNfYWRkciAqKSBwU2lyQnNzRGVzYzEtPmJzc0lkLAorCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgcFNpckJzc0Rlc2MyLT5ic3NJZCkpIHsKKwkJZk1hdGNoID0gdHJ1ZTsKKwl9CisKK2ZyZWVfaWVzOgorCWlmIChwSWVzMSkKKwkJY2RmX21lbV9mcmVlKHBJZXMxKTsKKwlpZiAoKE5VTEwgPT0gcEllczIpICYmIHBJZXNUZW1wKQorCQkvKiBsb2NhbGx5IGFsbG9jYXRlZCAqLworCQljZGZfbWVtX2ZyZWUocEllc1RlbXApOworCXJldHVybiBmTWF0Y2g7Cit9CisKK2Jvb2wgY3NyX2lzX25ldHdvcmtfdHlwZV9lcXVhbCh0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMSwKKwkJCSAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMikKK3sKKwlyZXR1cm4gcFNpckJzc0Rlc2MxLT5ud1R5cGUgPT0gcFNpckJzc0Rlc2MyLT5ud1R5cGU7Cit9CisKKy8qIHRvIGNoZWNrIHdoZXRoZXIgdGhlIEJTUyBtYXRjaGVzIHRoZSBkb3QxMU1vZGUgKi8KK3N0YXRpYyBib29sIGNzcl9zY2FuX2lzX2Jzc19hbGxvd2VkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsCisJCQkJICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisJYm9vbCBmQWxsb3dlZCA9IGZhbHNlOworCWVDc3JQaHlNb2RlIHBoeU1vZGU7CisKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCSAgICAoY3NyX2dldF9waHlfbW9kZV9mcm9tX2JzcyhwTWFjLCBwQnNzRGVzYywgJnBoeU1vZGUsIHBJZXMpKSkgeworCQlzd2l0Y2ggKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSkgeworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWI6CisJCQlmQWxsb3dlZCA9IChib29sKSAoZUNTUl9ET1QxMV9NT0RFXzExYSAhPSBwaHlNb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWc6CisJCQlmQWxsb3dlZCA9IChib29sKSAoZUNTUl9ET1QxMV9NT0RFXzExYSAhPSBwaHlNb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWToKKwkJCWZBbGxvd2VkID0gKGJvb2wpIChlQ1NSX0RPVDExX01PREVfMTFnID09IHBoeU1vZGUpOworCQkJYnJlYWs7CisJCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYToKKwkJCWZBbGxvd2VkID0gKGJvb2wpICgoZUNTUl9ET1QxMV9NT0RFXzExYiAhPSBwaHlNb2RlKQorCQkJCQkgICAmJiAoZUNTUl9ET1QxMV9NT0RFXzExZyAhPSBwaHlNb2RlKSk7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFuX09OTFk6CisJCQlmQWxsb3dlZCA9IChib29sKSAoKGVDU1JfRE9UMTFfTU9ERV8xMW4gPT0gcGh5TW9kZSkpOworCQkJYnJlYWs7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWFjX09OTFk6CisJCQlmQWxsb3dlZCA9IChib29sKSAoKGVDU1JfRE9UMTFfTU9ERV8xMWFjID09IHBoeU1vZGUpKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZOgorCQkJZkFsbG93ZWQgPSAoYm9vbCkgKGVDU1JfRE9UMTFfTU9ERV8xMWIgPT0gcGh5TW9kZSk7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFuOgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYWM6CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCWZBbGxvd2VkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGZBbGxvd2VkOworfQorCisvKiBSZXR1cm4gcEllcyB0byBjYWxsZXIgZm9yIGZ1dHVyZSB1c2Ugd2hlbiByZXR1cm5pbmcgdHJ1ZS4gKi8KK3N0YXRpYyBib29sIGNzcl9zY2FuX3ZhbGlkYXRlX3NjYW5fcmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgdWludDhfdCAqcENoYW5uZWxzLAorCQkJCQkgIHVpbnQ4X3QgbnVtQ2huLAorCQkJCQkgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsCisJCQkJCSAgdERvdDExZkJlYWNvbklFcyAqKnBwSWVzKQoreworCWJvb2wgdmFsaWQgPSBmYWxzZTsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzID0gTlVMTDsKKwl1aW50OF90IGluZGV4OworCUNERl9TVEFUVVMgc3RhdHVzOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtQ2huOyBpbmRleCsrKSB7CisJCS8qCisJCSAqIFRoaXMgY2hlY2sgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYSBzaW5nbGUgQlNTIGRlc2NyaXB0aW9uCisJCSAqIGlzIHJldHVybmVkIGluIGVhY2ggU2NhblJzcCBjYWxsLCB3aGljaCBpcyB0aGUgd2F5IExJTQorCQkgKiBpbXBsZW1lbnRlZCB0aGUgc2NhbiByZXEvcnNwIGZ1bnRpb25zLiBXZSBjaGFuZ2VkIHRvIHRoaXMKKwkJICogbW9kZWwgd2hlbiB3ZSByYW4gd2l0aCBhIGxhcmdlIG51bWJlciBvZiBBUHMuIElmIHRoaXMgd2VyZSB0bworCQkgKiBjaGFuZ2UsIHRoZW4gdGhpcyBjaGVjayB3b3VsZCBoYXZlIHRvIG1lc3Mgd2l0aCByZW1vdmluZyB0aGUKKwkJICogYnNzRGVzY3JpcHRpb24gZnJvbSBzb21ld2hlcmUgaW4gYW4gYXJiaXRyYXJ5IGluZGV4IGluIHRoZQorCQkgKiBic3NEZXNjcmlwdGlvbiBhcnJheS4KKwkJICovCisJCWlmIChwQ2hhbm5lbHNbaW5kZXhdID09IHBCc3NEZXNjLT5jaGFubmVsSWQpIHsKKwkJCXZhbGlkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCSpwcEllcyA9IE5VTEw7CisJaWYgKHZhbGlkKSB7CisJCXN0YXR1cyA9IGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMocE1hYywgcEJzc0Rlc2MsCisJCQkJCQkJICAgICZwSWVzKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQl2YWxpZCA9IGNzcl9zY2FuX2lzX2Jzc19hbGxvd2VkKHBNYWMsIHBCc3NEZXNjLCBwSWVzKTsKKwkJaWYgKHZhbGlkKQorCQkJKnBwSWVzID0gcEllczsKKwkJZWxzZQorCQkJY2RmX21lbV9mcmVlKHBJZXMpOworCX0KKwlyZXR1cm4gdmFsaWQ7Cit9CisKK3N0YXRpYyB2b2lkIGNzcl91cGRhdGVfc2NhbnR5cGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdERvdDExZkJlYWNvbklFcyAqcEllcywKKwkJCQl1aW50OF90IGNoYW5uZWxJZCkKK3sKKwlpZiAoZVNJUl9QQVNTSVZFX1NDQU4gIT0gcE1hYy0+c2Nhbi5jdXJTY2FuVHlwZSkKKwkJcmV0dXJuOworCisJaWYgKGNzcl9pczExZF9zdXBwb3J0ZWQocE1hYykpIHsKKwkJLyogQ2hlY2sgd2hldGhlciB0aGUgQlNTIGlzIGFjY2VwdGFibGUgYmFzZWQgb24KKwkJICogMTFkIGluZm8gYW5kIG91ciBjb25maWcuCisJCSAqLworCQlpZiAoIWNzcl9tYXRjaF9jb3VudHJ5X2NvZGUocE1hYywgTlVMTCwgcEllcykpCisJCQlyZXR1cm47CisKKwkJLyogY2hlY2sgaWYgY2hhbm5lbCBpcyBhY2NlcHRhYmxlIGJ5IGNvbmZpZyAqLworCQlpZiAoY3NyX2lzX3N1cHBvcnRlZF9jaGFubmVsKHBNYWMsIGNoYW5uZWxJZCkpCisJCQlwTWFjLT5zY2FuLmN1clNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKworCX0gZWxzZQorCQlwTWFjLT5zY2FuLmN1clNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKworfQorCisvKiBSZXR1cm4gd2hldGhlciBsYXN0IHNjYW4gcmVzdWx0IGlzIHJlY2VpdmVkICovCitzdGF0aWMgYm9vbCBjc3Jfc2Nhbl9wcm9jZXNzX3NjYW5fcmVzdWx0cyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwKKwkJCQkJICB0U2lyU21lU2NhblJzcCAqcFNjYW5Sc3AsCisJCQkJCSAgYm9vbCAqcGZSZW1vdmVDb21tYW5kKQoreworCWJvb2wgZlJldCA9IGZhbHNlLCBmUmVtb3ZlQ29tbWFuZCA9IGZhbHNlOworCisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgic2NhbiByZWFzb24gPSAlZCwgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgPSAlZCIpLAorCQlwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiwgcFNjYW5Sc3AtPnN0YXR1c0NvZGUpOworCWZSZW1vdmVDb21tYW5kID0gY3NyX3NjYW5fY29tcGxldGUocE1hYywgcFNjYW5Sc3ApOworCWZSZXQgPSB0cnVlOworCWlmIChwZlJlbW92ZUNvbW1hbmQpIHsKKwkJKnBmUmVtb3ZlQ29tbWFuZCA9IGZSZW1vdmVDb21tYW5kOworCX0KKwlyZXR1cm4gZlJldDsKK30KKworLyogY3NyX3NjYW5fcHJvY2Vzc19zaW5nbGVfYnNzZGVzY3IoKSAtIEFkZCBhIGJzc2Rlc2NyaXB0b3IgdG8gc2NhbiB0YWJsZQorICoKKyAqIEBtYWNfY3R4IC0gTUFDIGNvbnRleHQKKyAqIEBic3NkZXNjciAtIFBvaW50ZXIgdG8gQlNTIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICBldmVyeXRoaW5nIGZyb20gYmVhY29uL3Byb2JlIHJlc3BvbnNlIGZyYW1lIGFuZCBhZGRpdGlvbmFsCisgKiAgICAgICAgICAgICBpbmZvcm1hdGlvbi4KKyAqIEBzY2FuX2lkIC0gU2NhbiBpZGVudGlmaWVyIG9mIHRoZSBzY2FuIHJlcXVlc3QgdGhhdCB3YXMgcnVubmluZworICogICAgICAgICAgICB3aGVuIHRoaXMgYmVhY29uIHdhcyByZWNlaXZlZC4gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB3aGVuCisgKiAgICAgICAgICAgIGZpcm13YXJlIHByb3ZpZGVzIHRoYXQgaW5mb3JtYXRpb24uCisgKiBAZmxhZ3MgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyAqCisgKiBDYWxsYmFjayByb3V0aW5lIGNhbGxlZCBieSBMSU0gd2hlbiBpdCByZWNlaXZlcyBhIGJlYWNvbiBvciBwcm9iZSByZXNwb25zZQorICogZnJvbSB0aGUgZGV2aWNlLiA4MDIuMTEgZnJhbWUgaXMgYWxyZWFkeSBjb252ZXJ0ZWQgdG8gaW50ZXJuYWwKKyAqIHRTaXJCc3NEZXNjcmlwdGlvbiBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm46IDAgb3Igb3RoZXIgZXJyb3IgY29kZXMuCisgKi8KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9wcm9jZXNzX3NpbmdsZV9ic3NkZXNjcih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQl0U2lyQnNzRGVzY3JpcHRpb24gKmJzc2Rlc2NyLAorCQkJCQl1aW50MzJfdCBzY2FuX2lkLCB1aW50MzJfdCBmbGFncykKK3sKKwl0RG90MTFmQmVhY29uSUVzICppZXMgPSBOVUxMOworCXVpbnQ4X3QgKmNoYW5saXN0ID0gTlVMTDsKKwl1aW50OF90IGNudF9jaGFubmVscyA9IDA7CisJdWludDMyX3QgbGVuID0gc2l6ZW9mKG1hY19jdHgtPnJvYW0udmFsaWRDaGFubmVsTGlzdCk7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzQsICJDU1I6IFByb2Nlc3Npbmcgc2luZ2xlIGJzc2Rlc2NyIik7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUygKKwkJY3NyX2dldF9jZmdfdmFsaWRfY2hhbm5lbHMobWFjX2N0eCwKKwkJCSh1aW50OF90ICopIG1hY19jdHgtPnJvYW0udmFsaWRDaGFubmVsTGlzdCwKKwkJCSZsZW4pKSkgeworCQljaGFubGlzdCA9IG1hY19jdHgtPnJvYW0udmFsaWRDaGFubmVsTGlzdDsKKwkJY250X2NoYW5uZWxzID0gKHVpbnQ4X3QpIGxlbjsKKwl9IGVsc2UgeworCQkvKiBDYW5ub3QgY29udGludWUgKi8KKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJRkwoIlJlY2VpdmVkIHJlc3VsdHMgb24gaW52YWxpZCBjaGFubmVsIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWlmIChjc3Jfc2Nhbl92YWxpZGF0ZV9zY2FuX3Jlc3VsdChtYWNfY3R4LCBjaGFubGlzdCwKKwkJCWNudF9jaGFubmVscywgYnNzZGVzY3IsICZpZXMpKSB7CisJCWNzcl9zY2FuX3JlbW92ZV9kdXBfYnNzX2Rlc2NyaXB0aW9uX2Zyb21faW50ZXJpbV9saXN0CisJCQkobWFjX2N0eCwgYnNzZGVzY3IsIGllcyk7CisJCWNzcl9zY2FuX3NhdmVfYnNzX2Rlc2NyaXB0aW9uX3RvX2ludGVyaW1fbGlzdAorCQkJKG1hY19jdHgsIGJzc2Rlc2NyLCBpZXMpOworCQljc3JfdXBkYXRlX3NjYW50eXBlKG1hY19jdHgsIGllcywgYnNzZGVzY3ItPmNoYW5uZWxJZCk7CisJCS8qIEZyZWUgdGhlIHJlc291cmNlICovCisJCWlmIChpZXMgIT0gTlVMTCkKKwkJCWNkZl9tZW1fZnJlZShpZXMpOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisKK2Jvb2wgY3NyX3NjYW5faXNfd2lsZF9jYXJkX3NjYW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisJdWludDhfdCBic3NpZFtDREZfTUFDX0FERFJfU0laRV0gPSB7MH07CisJYm9vbCBmID0gY2RmX21lbV9jb21wYXJlKHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5ic3NpZC5ieXRlcywKKwkJCQkgYnNzaWQsIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSk7CisJLyoKKwkgKiBJdCBpcyBub3QgYSB3aWxkIGNhcmQgc2NhbiBpZiB0aGUgYnNzaWQgaXMgbm90IGJyb2FkY2FzdCBhbmQKKwkgKiB0aGUgbnVtYmVyIG9mIFNTSUQgaXMgMS4KKwkgKi8KKwlyZXR1cm4gKGYgfHwgKDB4ZmYgPT0gcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LmJzc2lkLmJ5dGVzWzBdKSkKKwkJJiYgKHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5TU0lEcy5udW1PZlNTSURzICE9IDEpOworfQorCitDREZfU1RBVFVTIGNzcl9zY2FuX3NtZV9zY2FuX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXZvaWQgKnBNc2dCdWYpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworCXRTbWVDbWQgKnBDb21tYW5kOworCWVDc3JTY2FuU3RhdHVzIHNjYW5TdGF0dXM7CisJdFNpclNtZVNjYW5Sc3AgKnBTY2FuUnNwID0gKHRTaXJTbWVTY2FuUnNwICopcE1zZ0J1ZjsKKwlib29sIGZSZW1vdmVDb21tYW5kID0gdHJ1ZTsKKwllQ3NyU2NhblJlYXNvbiByZWFzb24gPSBlQ3NyU2Nhbk90aGVyOworCisJY3NyX2dldF9hY3RpdmVfc2Nhbl9lbnRyeShwTWFjLCBwU2NhblJzcC0+c2Nhbl9pZCwgJnBFbnRyeSk7CisJaWYgKCFwRW50cnkpCisJCWdvdG8gZXJyb3JfaGFuZGxpbmc7CisKKwlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJTY2FuIGNvbXBsZXRpb24gY2FsbGVkOnNjYW5faWQgJWQsIGVudHJ5ID0gJXAiKSwKKwkJcFNjYW5Sc3AtPnNjYW5faWQsIHBFbnRyeSk7CisKKwlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwlpZiAoZVNtZUNvbW1hbmRTY2FuICE9IHBDb21tYW5kLT5jb21tYW5kKQorCQlnb3RvIGVycm9yX2hhbmRsaW5nOworCisJc2NhblN0YXR1cyA9IChlU0lSX1NNRV9TVUNDRVNTID09IHBTY2FuUnNwLT5zdGF0dXNDb2RlKSA/CisJCQllQ1NSX1NDQU5fU1VDQ0VTUyA6IGVDU1JfU0NBTl9GQUlMVVJFOworCXJlYXNvbiA9IHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uOworCXN3aXRjaCAocENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pIHsKKwljYXNlIGVDc3JTY2FuQWJvcnROb3JtYWxTY2FuOgorCQlicmVhazsKKwljYXNlIGVDc3JTY2FuUDJQRmluZFBlZXI6CisJCXNjYW5TdGF0dXMgPSAoZVNJUl9TTUVfU1VDQ0VTUyA9PSBwU2NhblJzcC0+c3RhdHVzQ29kZSkgPworCQkJCWVDU1JfU0NBTl9GT1VORF9QRUVSIDogZUNTUl9TQ0FOX0ZBSUxVUkU7CisJCWNzcl9zY2FuX3Byb2Nlc3Nfc2Nhbl9yZXN1bHRzKHBNYWMsIHBDb21tYW5kLCBwU2NhblJzcCwgTlVMTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChjc3Jfc2Nhbl9wcm9jZXNzX3NjYW5fcmVzdWx0cyhwTWFjLCBwQ29tbWFuZCwgcFNjYW5Sc3AsCisJCQkJCQkgICZmUmVtb3ZlQ29tbWFuZCkKKwkJICAgICYmIGNzcl9zY2FuX2lzX3dpbGRfY2FyZF9zY2FuKHBNYWMsIHBDb21tYW5kKQorCQkgICAgJiYgIXBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5wMnBTZWFyY2gpIHsKKworCQkvKiBBZ2Ugb3V0IGxvZ2ljIHdpbGwgYmUgdGFrZW4gY2FyZSBieSB0aGUgYWdlIG91dCB0aW1lciAqLworCQl9CisJCWJyZWFrOworCX0KKwlpZiAoZlJlbW92ZUNvbW1hbmQpCisJCWNzcl9yZWxlYXNlX3NjYW5fY29tbWFuZChwTWFjLCBwQ29tbWFuZCwgc2NhblN0YXR1cyk7CisJc21lX3Byb2Nlc3NfcGVuZGluZ19xdWV1ZShwTWFjKTsKKwlyZXR1cm4gc3RhdHVzOworCitlcnJvcl9oYW5kbGluZzoKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwlpZiAocE1hYy0+cG5vT2ZmbG9hZCAmJiBwU2NhblJzcC0+c3RhdHVzQ29kZSA9PSBlU0lSX1BOT19TQ0FOX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiUE5PIFNjYW4gY29tcGxldGlvbiBjYWxsZWQuIikpOworCQljc3Jfc2F2ZV9zY2FuX3Jlc3VsdHMocE1hYywgZUNzclNjYW5DYW5kaWRhdGVGb3VuZCwKKwkJCQkgICAgICBwU2NhblJzcC0+c2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTY2FuIGNvbXBsZXRpb24gd2FzIGNhbGxlZCwgUE5PIGlzIGFjdGl2ZSwgYnV0IHNjYW4KKwkJICogcmVzcG9uc2Ugd2FzIG5vdCBQTk8KKwkJICovCisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJTY2FuIGNvbXBsZXRpb24gY2FsbGVkLCBzY2FuIHJzcCB3YXMgbm90IFBOTy4iKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisjZW5kaWYKKwlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJTY2FuIGNvbXBsZXRpb24gY2FsbGVkLCBidXQgbm8gYWN0aXZlIFNDQU4gY29tbWFuZC4iKSk7CisJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworfQorCit0Q3NyU2NhblJlc3VsdEluZm8gKmNzcl9zY2FuX3Jlc3VsdF9nZXRfZmlyc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5SZXN1bHQpCit7CisJdExpc3RFbGVtICpwRW50cnk7CisJdENzclNjYW5SZXN1bHQgKnBSZXN1bHQ7CisJdENzclNjYW5SZXN1bHRJbmZvICpwUmV0ID0gTlVMTDsKKwl0U2NhblJlc3VsdExpc3QgKnBSZXN1bHRMaXN0ID0gKHRTY2FuUmVzdWx0TGlzdCAqKSBoU2NhblJlc3VsdDsKKworCWlmIChwUmVzdWx0TGlzdCkgeworCQljc3JfbGxfbG9jaygmcFJlc3VsdExpc3QtPkxpc3QpOworCQlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZwUmVzdWx0TGlzdC0+TGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisJCWlmIChwRW50cnkpIHsKKwkJCXBSZXN1bHQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQkJcFJldCA9ICZwUmVzdWx0LT5SZXN1bHQ7CisJCX0KKwkJcFJlc3VsdExpc3QtPnBDdXJFbnRyeSA9IHBFbnRyeTsKKwkJY3NyX2xsX3VubG9jaygmcFJlc3VsdExpc3QtPkxpc3QpOworCX0KKworCXJldHVybiBwUmV0OworfQorCit0Q3NyU2NhblJlc3VsdEluZm8gKmNzcl9zY2FuX3Jlc3VsdF9nZXRfbmV4dCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0KQoreworCXRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKwl0Q3NyU2NhblJlc3VsdCAqcFJlc3VsdCA9IE5VTEw7CisJdENzclNjYW5SZXN1bHRJbmZvICpwUmV0ID0gTlVMTDsKKwl0U2NhblJlc3VsdExpc3QgKnBSZXN1bHRMaXN0ID0gKHRTY2FuUmVzdWx0TGlzdCAqKSBoU2NhblJlc3VsdDsKKworCWlmICghcFJlc3VsdExpc3QpCisJCXJldHVybiBOVUxMOworCisJY3NyX2xsX2xvY2soJnBSZXN1bHRMaXN0LT5MaXN0KTsKKwlpZiAoTlVMTCA9PSBwUmVzdWx0TGlzdC0+cEN1ckVudHJ5KSB7CisJCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBSZXN1bHRMaXN0LT5MaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl9IGVsc2UgeworCQlwRW50cnkgPSBjc3JfbGxfbmV4dCgmcFJlc3VsdExpc3QtPkxpc3QsIHBSZXN1bHRMaXN0LT5wQ3VyRW50cnksCisJCQkJICAgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl9CisJaWYgKHBFbnRyeSkgeworCQlwUmVzdWx0ID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKwkJcFJldCA9ICZwUmVzdWx0LT5SZXN1bHQ7CisJfQorCXBSZXN1bHRMaXN0LT5wQ3VyRW50cnkgPSBwRW50cnk7CisJY3NyX2xsX3VubG9jaygmcFJlc3VsdExpc3QtPkxpc3QpOworCXJldHVybiBwUmV0OworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBtb3ZlcyB0aGUgZmlyc3QgQlNTIHRoYXQgbWF0Y2hlcyB0aGUgYnNzaWQgdG8gdGhlCisgKiBoZWFkIG9mIHRoZSByZXN1bHQKKyAqLworQ0RGX1NUQVRVUyBjc3JfbW92ZV9ic3NfdG9faGVhZF9mcm9tX2Jzc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgIHN0cnVjdCBjZGZfbWFjX2FkZHIgKmJzc2lkLAorCQkJCQkgICB0U2NhblJlc3VsdEhhbmRsZSBoU2NhblJlc3VsdCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXRTY2FuUmVzdWx0TGlzdCAqcFJlc3VsdExpc3QgPSAodFNjYW5SZXN1bHRMaXN0ICopIGhTY2FuUmVzdWx0OworCXRDc3JTY2FuUmVzdWx0ICpwUmVzdWx0ID0gTlVMTDsKKwl0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisKKwlpZiAoIShwUmVzdWx0TGlzdCAmJiBic3NpZCkpCisJCXJldHVybiBzdGF0dXM7CisKKwljc3JfbGxfbG9jaygmcFJlc3VsdExpc3QtPkxpc3QpOworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBSZXN1bHRMaXN0LT5MaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwl3aGlsZSAocEVudHJ5KSB7CisJCXBSZXN1bHQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQlpZiAoY2RmX21lbV9jb21wYXJlKGJzc2lkLCBwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5ic3NJZCwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKSkgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJY3NyX2xsX3JlbW92ZV9lbnRyeSgmcFJlc3VsdExpc3QtPkxpc3QsIHBFbnRyeSwKKwkJCQkJICAgIExMX0FDQ0VTU19OT0xPQ0spOworCQkJY3NyX2xsX2luc2VydF9oZWFkKCZwUmVzdWx0TGlzdC0+TGlzdCwgcEVudHJ5LAorCQkJCQkgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCWJyZWFrOworCQl9CisJCXBFbnRyeSA9IGNzcl9sbF9uZXh0KCZwUmVzdWx0TGlzdC0+TGlzdCwgcFJlc3VsdExpc3QtPnBDdXJFbnRyeSwKKwkJCQkgICAgIExMX0FDQ0VTU19OT0xPQ0spOworCX0KKwljc3JfbGxfdW5sb2NrKCZwUmVzdWx0TGlzdC0+TGlzdCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogUmVtb3ZlIHRoZSBCU1MgaWYgcG9zc2libGUuICovCisvKiBSZXR1cm4gLS0gdHJ1ZSA9PSB0aGUgQlNTIGlzIHJlbW92ZS4gRmFsc2UgPT0gRmFpbCB0byByZW1vdmUgaXQgKi8KKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gbGlzdCBsb2NrIGlzIGhlbGQuIEJlIGNhdXRpb24gd2hhdCBmdW5jdGlvbnMgaXQgY2FuIGNhbGwuICovCitib29sIGNzcl9zY2FuX2FnZV9vdXRfYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTY2FuUmVzdWx0ICpwUmVzdWx0KQoreworCWJvb2wgZlJldCA9IGZhbHNlOworCXVpbnQzMl90IGk7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKwlib29sIGlzQ29ubkJzc2ZvdW5kID0gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKykgeworCQlpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIGkpKQorCQkJY29udGludWU7CisJCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIGkpOworCQkvKiBOb3QgdG8gcmVtb3ZlIHRoZSBCU1Mgd2UgYXJlIGNvbm5lY3RlZCB0by4gKi8KKwkJaWYgKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYShwTWFjLCBpKQorCQkgICAgJiYgKE5VTEwgIT0gcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYykKKwkJICAgICYmIChjc3JfaXNfZHVwbGljYXRlX2Jzc19kZXNjcmlwdGlvbihwTWFjLAorCQkJJnBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLAorCQkJcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYywgTlVMTCwgZmFsc2UpKSkgeworCQkJaXNDb25uQnNzZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGlzQ29ubkJzc2ZvdW5kKSB7CisJCS8qCisJCSAqIFJlc2V0IHRoZSBjb3VudGVyIHNvIHRoYXQgYWdpbmcgb3V0IG9mIGNvbm5lY3RlZCBCU1Mgd29uJ3QKKwkJICogaGFwZWVuIHRvbyBzb29uCisJCSAqLworCQlwUmVzdWx0LT5BZ2luZ0NvdW50ID0KKwkJCShpbnQzMl90KSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmFnaW5nQ291bnQ7CisJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCUZMKCJDb25uZWN0ZWQgQlNTLCBTZXQgQWdpbmcgQ291bnQ9JWQgZm9yIEJTUyAiCisJCQkgICBNQUNfQUREUkVTU19TVFIpLCBwUmVzdWx0LT5BZ2luZ0NvdW50LAorCQkJTUFDX0FERFJfQVJSQVkocFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuYnNzSWQpKTsKKwkJcFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IublJlY2VpdmVkVGltZSA9CisJCQkodWludDMyX3QpIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisJCXJldHVybiBmUmV0OworCX0KKwlzbXNfbG9nKHBNYWMsIExPR1csCisJCSJBZ2luZyBvdXQgQlNTICIgTUFDX0FERFJFU1NfU1RSICIgQ2hhbm5lbCAlZCIsCisJCU1BQ19BRERSX0FSUkFZKHBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmJzc0lkKSwKKwkJcFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkKTsKKwkvKgorCSAqIE5vIG5lZWQgdG8gaG9sZCB0aGUgc3BpbiBsb2NrIGJlY2F1c2UgY2FsbGVyIHNob3VsZCBob2xkIHRoZSBsb2NrIGZvcgorCSAqIHBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QKKwkgKi8KKwlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeSgmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgJnBSZXN1bHQtPkxpbmssCisJCQkJTExfQUNDRVNTX05PTE9DSykpIHsKKwkJaWYgKGNkZl9pc19tYWNhZGRyX2VxdWFsKAorCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgJnBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmJzc0lkLAorCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgJnBNYWMtPnNjYW4uY3VycmVudENvdW50cnlCc3NpZCkpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQlGTCgiQWdpbmcgb3V0IDExZCBCU1MgIiBNQUNfQUREUkVTU19TVFIpLAorCQkJCU1BQ19BRERSX0FSUkFZKAorCQkJCQlwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5ic3NJZCkpOworCQkJcE1hYy0+c2Nhbi5jdXJyZW50Q291bnRyeVJTU0kgPSAtMTI4OworCQl9CisJCWNzcl9mcmVlX3NjYW5fcmVzdWx0X2VudHJ5KHBNYWMsIHBSZXN1bHQpOworCQlmUmV0ID0gdHJ1ZTsKKwl9CisJcmV0dXJuIGZSZXQ7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NjYW5fYWdlX3Jlc3VsdHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl0U21lR2V0U2NhbkNoblJzcCAqcFNjYW5DaG5JbmZvKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRMaXN0RWxlbSAqcEVudHJ5LCAqdG1wRW50cnk7CisJdENzclNjYW5SZXN1bHQgKnBSZXN1bHQ7CisJdExpbVNjYW5DaG4gKnBDaG5JbmZvOworCXVpbnQ4X3QgaTsKKworCWNzcl9sbF9sb2NrKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgcFNjYW5DaG5JbmZvLT5udW1DaG47IGkrKykgeworCQlwQ2huSW5mbyA9ICZwU2NhbkNobkluZm8tPnNjYW5DaG5baV07CisJCXBFbnRyeSA9CisJCQljc3JfbGxfcGVla19oZWFkKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJd2hpbGUgKHBFbnRyeSkgeworCQkJdG1wRW50cnkgPQorCQkJCWNzcl9sbF9uZXh0KCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBwRW50cnksCisJCQkJCSAgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCXBSZXN1bHQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQkJaWYgKHBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCA9PQorCQkJICAgIHBDaG5JbmZvLT5jaGFubmVsSWQpIHsKKwkJCQlpZiAocFJlc3VsdC0+QWdpbmdDb3VudCA8PSAwKSB7CisJCQkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQkJCSIgYWdlIG91dCBkdWUgdG8gcmVmIGNvdW50Iik7CisJCQkJCWNzcl9zY2FuX2FnZV9vdXRfYnNzKHBNYWMsIHBSZXN1bHQpOworCQkJCX0gZWxzZSB7CisJCQkJCXBSZXN1bHQtPkFnaW5nQ291bnQtLTsKKwkJCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCQkJRkwKKwkJCQkJCQkoIkRlY3JlbWVudGVkIEFnaW5nQ291bnQ9JWQgZm9yIEJTUyAiCisJCQkJCQkJTUFDX0FERFJFU1NfU1RSICIiKSwKKwkJCQkJCXBSZXN1bHQtPkFnaW5nQ291bnQsCisJCQkJCQlNQUNfQUREUl9BUlJBWShwUmVzdWx0LT5SZXN1bHQuCisJCQkJCQkJICAgICAgIEJzc0Rlc2NyaXB0b3IuCisJCQkJCQkJICAgICAgIGJzc0lkKSk7CisJCQkJfQorCQkJfQorCQkJcEVudHJ5ID0gdG1wRW50cnk7CisJCX0KKwl9CisJY3NyX2xsX3VubG9jaygmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9zZW5kX21iX3NjYW5fcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IHNlc3Npb25JZCwKKwkJCQl0Q3NyU2NhblJlcXVlc3QgKnBTY2FuUmVxLAorCQkJCXRTY2FuUmVxUGFyYW0gKnBTY2FuUmVxUGFyYW0pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNpclNtZVNjYW5SZXEgKnBNc2c7CisJdWludDE2X3QgbXNnTGVuOworCXRTaXJTY2FuVHlwZSBzY2FuVHlwZSA9IHBTY2FuUmVxLT5zY2FuVHlwZTsKKwl1aW50MzJfdCBtaW5DaG5UaW1lOyAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBtYXhDaG5UaW1lOyAgICAvKiBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgKi8KKwl1aW50MzJfdCBpOworCXVpbnQ4X3Qgc2VsZk1hY0FkZHJbQ0RGX01BQ19BRERSX1NJWkVdOworCXVpbnQ4X3QgKnBTZWxmTWFjID0gTlVMTDsKKworCW1zZ0xlbiA9ICh1aW50MTZfdCkgKHNpemVvZih0U2lyU21lU2NhblJlcSkgLQorCQkgc2l6ZW9mKHBNc2ctPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXIpICsKKwkJIChzaXplb2YocE1zZy0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlcikgKgorCQkgcFNjYW5SZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMpKSArCisJCSAocFNjYW5SZXEtPnVJRUZpZWxkTGVuKTsKKworCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhtc2dMZW4pOworCWlmIChOVUxMID09IHBNc2cpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIikpOworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJGYWlsZWQ6IFNJZDogJWQgRmlyc3RNYXRjaCA9ICVkIgorCQkJCSAgICAgICAiIFVuaXF1ZVJlc3VsdCA9ICVkIGZyZXNoU2NhbiA9ICVkIGhpZGRlblNzaWQgPSAlZCIpLAorCQkJc2Vzc2lvbklkLCBwU2NhblJlcVBhcmFtLT5iUmV0dXJuQWZ0ZXIxc3RNYXRjaCwKKwkJCXBTY2FuUmVxUGFyYW0tPmZVbmlxdWVSZXN1bHQsIHBTY2FuUmVxUGFyYW0tPmZyZXNoU2NhbiwKKwkJCXBTY2FuUmVxUGFyYW0tPmhpZGRlblNzaWQpOworCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQlGTCgic2NhblR5cGUgPSAldSBCU1NUeXBlID0gJXUgbnVtT2ZTU0lEcyA9ICVkIgorCQkJICAgIiBudW1PZkNoYW5uZWxzID0gJWQgcmVxdWVzdFR5cGUgPSAlZCBwMnBTZWFyY2ggPSAlZFxuIiksCisJCQlwU2NhblJlcS0+c2NhblR5cGUsIHBTY2FuUmVxLT5CU1NUeXBlLAorCQkJcFNjYW5SZXEtPlNTSURzLm51bU9mU1NJRHMsCisJCQlwU2NhblJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscywKKwkJCXBTY2FuUmVxLT5yZXF1ZXN0VHlwZSwgcFNjYW5SZXEtPnAycFNlYXJjaCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV9zZXQocE1zZywgbXNnTGVuLCAwKTsKKwlwTXNnLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1NDQU5fUkVROworCXBNc2ctPmxlbmd0aCA9IG1zZ0xlbjsKKwkvKiBUb0RPOiBGaWxsIGluIHNlc3Npb24gaW5mbyB3aGVuIHdlIG5lZWQgdG8gZG8gc2NhbiBiYXNlIG9uIHNlc3Npb24gKi8KKwlpZiAoKHNlc3Npb25JZCAhPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEKSkgeworCQlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJfSBlbHNlIHsKKwkJLyogaWYgc2Vzc2lvbklkID09IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQsIHRoZW4gc2VuZCB0aGUgc2NhbgorCQkgICByZXF1ZXN0IG9uIGZpcnN0IGF2YWlsYWJsZSBzZXNzaW9uICovCisJCXBNc2ctPnNlc3Npb25JZCA9IDA7CisJfQorCWlmIChwTXNnLT5zZXNzaW9uSWQgPj0gQ1NSX1JPQU1fU0VTU0lPTl9NQVgpCisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiBJbnZhbGlkIFNtZSBTZXNzaW9uIElEID0gJWQiKSwKKwkJCXBNc2ctPnNlc3Npb25JZCk7CisJcE1zZy0+dHJhbnNhY3Rpb25JZCA9IDA7CisJcE1zZy0+ZG90MTFtb2RlID0gKHVpbnQ4X3QpIGNzcl90cmFuc2xhdGVfdG9fd25pX2NmZ19kb3QxMV9tb2RlKHBNYWMsCisJCQkJY3NyX2ZpbmRfYmVzdF9waHlfbW9kZShwTWFjLAorCQkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUpKTsKKwlwTXNnLT5ic3NUeXBlID0gY3NyX3RyYW5zbGF0ZV9ic3N0eXBlX3RvX21hY190eXBlKHBTY2FuUmVxLT5CU1NUeXBlKTsKKworCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCXBTZWxmTWFjID0gKHVpbnQ4X3QgKikKKwkJCSZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uc2VsZk1hY0FkZHI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2luY2Ugd2UgZG9uJ3QgaGF2ZSBzZXNzaW9uIGZvciB0aGUgc2Nhbm5pbmcsIHdlIGZpbmQgYSB2YWxpZAorCQkgKiBzZXNzaW9uLiBJbiBjYXNlIHdlIGZhaWwgdG8gZG8gc28sIGdldCB0aGUgV05JX0NGR19TVEFfSUQKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrKSB7CisJCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgaSkpIHsKKwkJCQlwU2VsZk1hYyA9ICh1aW50OF90ICopCisJCQkJCSZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW2ldLnNlbGZNYWNBZGRyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChDU1JfUk9BTV9TRVNTSU9OX01BWCA9PSBpKSB7CisJCQl1aW50MzJfdCBsZW4gPSBDREZfTUFDX0FERFJfU0laRTsKKwkJCXBTZWxmTWFjID0gc2VsZk1hY0FkZHI7CisJCQlzdGF0dXMgPSB3bGFuX2NmZ19nZXRfc3RyKHBNYWMsIFdOSV9DRkdfU1RBX0lELAorCQkJCQkJICBwU2VsZk1hYywgJmxlbik7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpCisJCQkgICAgfHwgKGxlbiA8IENERl9NQUNfQUREUl9TSVpFKSkgeworCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwoIkNhbid0IGdldCBzZWxmIE1BQyBhZGRyZXNzID0gJWQiKSwKKwkJCQkJc3RhdHVzKTsKKwkJCQkvKiBGb3JjZSBmYWlsZWQgc3RhdHVzICovCisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQkJZ290byBzZW5kX3NjYW5fcmVxOworCQkJfQorCQl9CisJfQorCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwTXNnLT5zZWxmTWFjQWRkciwKKwkJICAgICBwU2VsZk1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkvKiBzaXJfY29weV9tYWNfYWRkciAqLworCWNkZl9tZW1fY29weShwTXNnLT5ic3NJZCwgJnBTY2FuUmVxLT5ic3NpZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJaWYgKGNkZl9pc19tYWNhZGRyX3plcm8oJnBTY2FuUmVxLT5ic3NpZCkpCisJCWNkZl9tZW1fc2V0KHBNc2ctPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpLCAweGZmKTsKKwllbHNlCisJCWNkZl9tZW1fY29weShwTXNnLT5ic3NJZCwgcFNjYW5SZXEtPmJzc2lkLmJ5dGVzLAorCQkJCUNERl9NQUNfQUREUl9TSVpFKTsKKwltaW5DaG5UaW1lID0gcFNjYW5SZXEtPm1pbkNoblRpbWU7CisJbWF4Q2huVGltZSA9IHBTY2FuUmVxLT5tYXhDaG5UaW1lOworCisJLyoKKwkgKiBWZXJpZnkgdGhlIHNjYW4gdHlwZSBmaXJzdCwgaWYgdGhlIHNjYW4gaXMgYWN0aXZlIHNjYW4sIHdlIG5lZWQgdG8KKwkgKiBtYWtlIHN1cmUgd2UgYXJlIGFsbG93ZWQgdG8gZG8gc28uIGlmIDExZCBpcyBlbmFibGVkICYgd2UgZG9uJ3Qgc2VlCisJICogYW55IGJlYWNvbiBhcm91bmQsIHNjYW4gdHlwZSBmYWxscyBiYWNrIHRvIHBhc3NpdmUuIEJ1dCBpbiBCVCBBTVAgU1RBCisJICogbW9kZSB3ZSBuZWVkIHRvIHNlbmQgb3V0IGEgZGlyZWN0ZWQgcHJvYmUKKwkgKi8KKwlpZiAoKGVTSVJfUEFTU0lWRV9TQ0FOICE9IHNjYW5UeXBlKQorCSAgICAmJiAoZUNTUl9TQ0FOX1AyUF9ESVNDT1ZFUlkgIT0KKwkJcFNjYW5SZXEtPnJlcXVlc3RUeXBlKQorCSAgICAmJiAoZUNTUl9CU1NfVFlQRV9XRFNfU1RBICE9IHBTY2FuUmVxLT5CU1NUeXBlKQorCSAgICAmJiAoZmFsc2UgPT0gcE1hYy0+c2Nhbi5mRW5hYmxlQnlwYXNzMTFkKSkgeworCQlzY2FuVHlwZSA9IHBNYWMtPnNjYW4uY3VyU2NhblR5cGU7CisJCWlmIChlU0lSX1BBU1NJVkVfU0NBTiA9PSBwTWFjLT5zY2FuLmN1clNjYW5UeXBlKSB7CisJCQlpZiAobWluQ2huVGltZSA8CisJCQkgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1pbkNoblRpbWUpIHsKKwkJCQltaW5DaG5UaW1lID0KKwkJCQkgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1pbkNoblRpbWU7CisJCQl9CisJCQlpZiAobWF4Q2huVGltZSA8CisJCQkgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1heENoblRpbWUpIHsKKwkJCQltYXhDaG5UaW1lID0KKwkJCQkgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1heENoblRpbWU7CisJCQl9CisJCX0KKwl9CisJcE1zZy0+c2NhblR5cGUgPSBzY2FuVHlwZTsKKworCXBNc2ctPm51bVNzaWQgPSAocFNjYW5SZXEtPlNTSURzLm51bU9mU1NJRHMgPCBTSVJfU0NBTl9NQVhfTlVNX1NTSUQpID8KKwkJCSBwU2NhblJlcS0+U1NJRHMubnVtT2ZTU0lEcyA6IFNJUl9TQ0FOX01BWF9OVU1fU1NJRDsKKwlpZiAoKHBTY2FuUmVxLT5TU0lEcy5udW1PZlNTSURzICE9IDApCisJICAgICYmIChlU0lSX1BBU1NJVkVfU0NBTiAhPSBzY2FuVHlwZSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBNc2ctPm51bVNzaWQ7IGkrKykgeworCQkJY2RmX21lbV9jb3B5KCZwTXNnLT5zc0lkW2ldLAorCQkJCSAgICAgJnBTY2FuUmVxLT5TU0lEcy5TU0lETGlzdFtpXS5TU0lELAorCQkJCSAgICAgc2l6ZW9mKHRTaXJNYWNTU2lkKSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBPdGhlcndpc2Ugd2Ugc2NhbiBhbGwgU1NJRCBhbmQgbGV0IHRoZSByZXN1bHQgZmlsdGVyIGxhdGVyICovCisJCWZvciAoaSA9IDA7IGkgPCBTSVJfU0NBTl9NQVhfTlVNX1NTSUQ7IGkrKykKKwkJCXBNc2ctPnNzSWRbaV0ubGVuZ3RoID0gMDsKKwl9CisKKwlwTXNnLT5taW5DaGFubmVsVGltZSA9IG1pbkNoblRpbWU7CisJcE1zZy0+bWF4Q2hhbm5lbFRpbWUgPSBtYXhDaG5UaW1lOworCS8qIGhpZGRlbiBTU0lEIG9wdGlvbiAqLworCXBNc2ctPmhpZGRlblNzaWQgPSBwU2NhblJlcVBhcmFtLT5oaWRkZW5Tc2lkOworCS8qIHJlc3QgdGltZSAqLworCXBNc2ctPnJlc3RUaW1lID0gcFNjYW5SZXEtPnJlc3RUaW1lOworCXBNc2ctPnJldHVybkFmdGVyRmlyc3RNYXRjaCA9IHBTY2FuUmVxUGFyYW0tPmJSZXR1cm5BZnRlcjFzdE1hdGNoOworCS8qIEFsbCB0aGUgc2NhbiByZXN1bHRzIGNhY2hpbmcgd2lsbCBiZSBkb25lIGJ5IFJvYW1pbmcgKi8KKwkvKiBXZSBkbyBub3Qgd2FudCBMSU0gdG8gZG8gYW55IGNhY2hpbmcgb2Ygc2NhbiByZXN1bHRzLCAqLworCS8qIHNvIGRlbGV0ZSB0aGUgTElNIGNhY2hlIG9uIGFsbCBzY2FuIHJlcXVlc3RzICovCisJcE1zZy0+cmV0dXJuRnJlc2hSZXN1bHRzID0gcFNjYW5SZXFQYXJhbS0+ZnJlc2hTY2FuOworCS8qIEFsd2F5cyBhc2sgZm9yIHVuaXF1ZSByZXN1bHQgKi8KKwlwTXNnLT5yZXR1cm5VbmlxdWVSZXN1bHRzID0gcFNjYW5SZXFQYXJhbS0+ZlVuaXF1ZVJlc3VsdDsKKwlwTXNnLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9CisJCSh1aW50OF90KSBwU2NhblJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKwlpZiAocFNjYW5SZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMpIHsKKwkJLyogQXNzdW1pbmcgdGhlIGNoYW5uZWxOdW1iZXIgaXMgdWludDhfdCAoMSBieXRlKSAqLworCQljZGZfbWVtX2NvcHkocE1zZy0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlciwKKwkJCSAgICAgcFNjYW5SZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LAorCQkJICAgICBwU2NhblJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyk7CisJfQorCisJcE1zZy0+dUlFRmllbGRMZW4gPSAodWludDE2X3QpIHBTY2FuUmVxLT51SUVGaWVsZExlbjsKKwlwTXNnLT51SUVGaWVsZE9mZnNldCA9ICh1aW50MTZfdCkgKHNpemVvZih0U2lyU21lU2NhblJlcSkgLQorCQkJc2l6ZW9mKHBNc2ctPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXIpICsKKwkJCShzaXplb2YocE1zZy0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlcikgKgorCQkJIHBTY2FuUmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzKSk7CisJaWYgKHBTY2FuUmVxLT51SUVGaWVsZExlbiAhPSAwKSB7CisJCWNkZl9tZW1fY29weSgodWludDhfdCAqKSBwTXNnICsgcE1zZy0+dUlFRmllbGRPZmZzZXQsCisJCQkgICAgIHBTY2FuUmVxLT5wSUVGaWVsZCwgcFNjYW5SZXEtPnVJRUZpZWxkTGVuKTsKKwl9CisJcE1zZy0+cDJwU2VhcmNoID0gcFNjYW5SZXEtPnAycFNlYXJjaDsKKwlwTXNnLT5zY2FuX2lkID0gcFNjYW5SZXEtPnNjYW5faWQ7CisKK3NlbmRfc2Nhbl9yZXE6CisJc21zX2xvZyhwTWFjLCBMT0cxLAorCQlGTCgic2NhbklkICVkIGRvbWFpbklkQ3VycmVudCAlZCBzY2FuVHlwZSAlZCBic3NUeXBlICVkIHJlcXVlc3RUeXBlICVkIG51bUNoYW5uZWxzICVkIiksCisJCXBNc2ctPnNjYW5faWQsIHBNYWMtPnNjYW4uZG9tYWluSWRDdXJyZW50LCBwTXNnLT5zY2FuVHlwZSwKKwkJcE1zZy0+YnNzVHlwZSwgcFNjYW5SZXEtPnJlcXVlc3RUeXBlLAorCQlwTXNnLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcE1zZy0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHM7IGkrKykgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJjaGFubmVsTnVtYmVyWyVkXT0gJWQiKSwgaSwKKwkJCXBNc2ctPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXJbaV0pOworCX0KKworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiZmFpbGVkIHRvIHNlbmQgZG93biBzY2FuIHJlcSB3aXRoIHN0YXR1cyA9ICVkIiksCisJCQlzdGF0dXMpOworCQljZGZfbWVtX2ZyZWUocE1zZyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NlbmRfbWJfc2Nhbl9yZXN1bHRfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICAgIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgICAgdFNjYW5SZXFQYXJhbSAqcFNjYW5SZXFQYXJhbSkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U2lyU21lU2NhblJlcSAqcE1zZzsKKwl1aW50MTZfdCBtc2dMZW47CisKKwltc2dMZW4gPSAodWludDE2X3QpIChzaXplb2YodFNpclNtZVNjYW5SZXEpKTsKKwlwTXNnID0gY2RmX21lbV9tYWxsb2MobXNnTGVuKTsKKwlpZiAoTlVMTCA9PSBwTXNnKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCisJY2RmX21lbV9zZXQocE1zZywgbXNnTGVuLCAwKTsKKwlwTXNnLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1NDQU5fUkVROworCXBNc2ctPmxlbmd0aCA9IG1zZ0xlbjsKKwlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJcE1zZy0+dHJhbnNhY3Rpb25JZCA9IDA7CisJcE1zZy0+cmV0dXJuRnJlc2hSZXN1bHRzID0gcFNjYW5SZXFQYXJhbS0+ZnJlc2hTY2FuOworCS8qIEFsd2F5cyBhc2sgZm9yIHVuaXF1ZSByZXN1bHQgKi8KKwlwTXNnLT5yZXR1cm5VbmlxdWVSZXN1bHRzID0gcFNjYW5SZXFQYXJhbS0+ZlVuaXF1ZVJlc3VsdDsKKwlwTXNnLT5yZXR1cm5BZnRlckZpcnN0TWF0Y2ggPQorCQlwU2NhblJlcVBhcmFtLT5iUmV0dXJuQWZ0ZXIxc3RNYXRjaDsKKwlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gc2VuZCBkb3duIHNjYW4gcmVxIHdpdGggc3RhdHVzID0gJWRcbiIpLAorCQkJc3RhdHVzKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCitzdGF0aWMgdm9pZCBjc3JfZGlhZ19zY2FuX2NoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCWhvc3RfbG9nX3NjYW5fcGt0X3R5cGUgKnBTY2FuTG9nID0gTlVMTDsKKworCVdMQU5fSE9TVF9ESUFHX0xPR19BTExPQyhwU2NhbkxvZywKKwkJCQkgaG9zdF9sb2dfc2Nhbl9wa3RfdHlwZSwKKwkJCQkgTE9HX1dMQU5fU0NBTl9DKTsKKwlpZiAoIXBTY2FuTG9nKQorCQlyZXR1cm47CisKKwlpZiAoZUNzclNjYW5Qcm9iZUJzcyA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbikgeworCQlwU2NhbkxvZy0+ZXZlbnRJZCA9IFdMQU5fU0NBTl9FVkVOVF9IT19TQ0FOX1JFUTsKKwl9IGVsc2UgeworCQlpZiAoKGVTSVJfUEFTU0lWRV9TQ0FOICE9CisJCQlwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3Quc2NhblR5cGUpCisJCSAgICAmJiAoZVNJUl9QQVNTSVZFX1NDQU4gIT0gcE1hYy0+c2Nhbi5jdXJTY2FuVHlwZSkpIHsKKwkJCXBTY2FuTG9nLT5ldmVudElkID0gV0xBTl9TQ0FOX0VWRU5UX0FDVElWRV9TQ0FOX1JFUTsKKwkJfSBlbHNlIHsKKwkJCXBTY2FuTG9nLT5ldmVudElkID0gV0xBTl9TQ0FOX0VWRU5UX1BBU1NJVkVfU0NBTl9SRVE7CisJCX0KKwl9CisJcFNjYW5Mb2ctPm1pbkNoblRpbWUgPQorCQkodWludDhfdCkgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1pbkNoblRpbWU7CisJcFNjYW5Mb2ctPm1heENoblRpbWUgPQorCQkodWludDhfdCkgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1heENoblRpbWU7CisJcFNjYW5Mb2ctPm51bUNoYW5uZWwgPQorCSh1aW50OF90KSBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKwlpZiAocFNjYW5Mb2ctPm51bUNoYW5uZWwgJiYKKwkgICAgKHBTY2FuTG9nLT5udW1DaGFubmVsIDwgSE9TVF9MT0dfTUFYX05VTV9DSEFOTkVMKSkgeworCQljZGZfbWVtX2NvcHkocFNjYW5Mb2ctPmNoYW5uZWxzLAorCQkgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QsCisJCSAgICAgIHBTY2FuTG9nLT5udW1DaGFubmVsKTsKKwl9CisJV0xBTl9IT1NUX0RJQUdfTE9HX1JFUE9SVChwU2NhbkxvZyk7Cit9CisjZWxzZQorI2RlZmluZSBjc3JfZGlhZ19zY2FuX2NoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKSAodm9pZCkwOworI2VuZGlmIC8qICNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAqLworCitDREZfU1RBVFVTIGNzcl9zY2FuX2NoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdFNjYW5SZXFQYXJhbSBzY2FuUmVxOworCisJLyoKKwkgKiBEb24ndCBkZWxldGUgY2FjaGVkIHJlc3VsdHMuIFJvbWUgcnNzaSBiYXNlZCBzY2FuIGNhbmRpZGF0ZXMgbWF5IGxhbmQKKwkgKiB1cCBpbiBzY2FuIGNhY2hlIGluc3RlYWQgb2YgTEZSIGNhY2hlLiBUaGV5IHdpbGwgYmUgZGVsZXRlZCB1cG9uCisJICogcXVlcnkKKwkgKi8KKwlzY2FuUmVxLmZyZXNoU2NhbiA9IFNJUl9CR19TQ0FOX1JFVFVSTl9GUkVTSF9SRVNVTFRTOworCXNjYW5SZXEuZlVuaXF1ZVJlc3VsdCA9IHRydWU7CisJc2NhblJlcS5oaWRkZW5Tc2lkID0gU0lSX1NDQU5fTk9fSElEREVOX1NTSUQ7CisJaWYgKGVDc3JTY2FuRm9yU3NpZCA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbikgeworCQlzY2FuUmVxLmJSZXR1cm5BZnRlcjFzdE1hdGNoID0KKwkJCUNTUl9TQ0FOX1JFVFVSTl9BRlRFUl9GSVJTVF9NQVRDSDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBCYXNpY2FsbHkgZG8gc2NhbiBvbiBhbGwgY2hhbm5lbHMgZXZlbiBmb3IgMTFEIDFzdCBzY2FuIGNhc2UKKwkJICovCisJCXNjYW5SZXEuYlJldHVybkFmdGVyMXN0TWF0Y2ggPQorCQkJQ1NSX1NDQU5fUkVUVVJOX0FGVEVSX0FMTF9DSEFOTkVMUzsKKwl9CisJaWYgKGVDc3JTY2FuUHJvYmVCc3MgPT0gcENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pCisJCXNjYW5SZXEuaGlkZGVuU3NpZCA9IFNJUl9TQ0FOX0hJRERFTl9TU0lEX1BFX0RFQ0lTSU9OOworCWNzcl9kaWFnX3NjYW5fY2hhbm5lbHMocE1hYywgcENvbW1hbmQpOworCWNzcl9jbGVhcl92b3Rlc19mb3JfY291bnRyeV9pbmZvKHBNYWMpOworCXN0YXR1cyA9IGNzcl9zZW5kX21iX3NjYW5fcmVxKHBNYWMsIHBDb21tYW5kLT5zZXNzaW9uSWQsCisJCQkJICAgICAgJnBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdCwKKwkJCQkgICAgICAmc2NhblJlcSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIENERl9TVEFUVVMKK2Nzcl9pc3N1ZV91c2VyX3NjYW4odHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdFNtZUNtZCAqY21kKQoreworCWludCBpLCBqOworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQzMl90IGxlbiA9IDA7CisJdWludDhfdCAqY2hfbHN0ID0gTlVMTDsKKwl0Q3NyQ2hhbm5lbEluZm8gbmV3X2NoX2luZm8gPSB7IDAsIE5VTEwgfTsKKworCWlmICghbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5mU2NhblR3aWNlKQorCQlyZXR1cm4gY3NyX3NjYW5fY2hhbm5lbHMobWFjX2N0eCwgY21kKTsKKworCS8qIFdlIHNjYW4gMi40IGNoYW5uZWwgdHdpY2UgKi8KKwlpZiAoY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzCisJICAgICYmIChOVUxMICE9IGNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpKSB7CisJCWxlbiA9IGNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKwkJLyogYWxsb2NhdGUgdHdpY2UgdGhlIGNoYW5uZWwgKi8KKwkJbmV3X2NoX2luZm8uQ2hhbm5lbExpc3QgPSAodWludDhfdCAqKSBjZGZfbWVtX21hbGxvYyhsZW4gKiAyKTsKKwkJY2hfbHN0ID0gY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdDsKKwl9IGVsc2UgeworCQkvKiBnZXQgdGhlIHZhbGlkIGNoYW5uZWwgbGlzdCB0byBzY2FuIGFsbC4gKi8KKwkJbGVuID0gc2l6ZW9mKG1hY19jdHgtPnJvYW0udmFsaWRDaGFubmVsTGlzdCk7CisJCXN0YXR1cyA9IGNzcl9nZXRfY2ZnX3ZhbGlkX2NoYW5uZWxzKG1hY19jdHgsCisJCQkgICAgKHVpbnQ4X3QgKikgbWFjX2N0eC0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCAmbGVuKTsKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkvKiBhbGxvY2F0ZSB0d2ljZSB0aGUgY2hhbm5lbCAqLworCQkJbmV3X2NoX2luZm8uQ2hhbm5lbExpc3QgPQorCQkJCSh1aW50OF90ICopIGNkZl9tZW1fbWFsbG9jKGxlbiAqIDIpOworCQkJY2hfbHN0ID0gbWFjX2N0eC0+cm9hbS52YWxpZENoYW5uZWxMaXN0OworCQl9CisJfQorCWlmIChOVUxMID09IG5ld19jaF9pbmZvLkNoYW5uZWxMaXN0KSB7CisJCW5ld19jaF9pbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworCX0gZWxzZSB7CisJCWogPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCW5ld19jaF9pbmZvLkNoYW5uZWxMaXN0W2orK10gPSBjaF9sc3RbaV07CisJCQlpZiAoQ0RTX01BWF8yNEdIel9DSEFOTkVMX05VTUJFUiA+PSBjaF9sc3RbaV0pCisJCQkJbmV3X2NoX2luZm8uQ2hhbm5lbExpc3RbaisrXSA9IGNoX2xzdFtpXTsKKwkJfQorCQlpZiAoTlVMTCAhPQorCQkgICAgY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCkgeworCQkJLyoKKwkJCSAqIGNoX2xzdCBwb2ludHMgdG8gdGhlIGNoYW5uZWxsaXN0IGZyb20gdGhlIGNvbW1hbmQsCisJCQkgKiBmcmVlIGl0LgorCQkJICovCisJCQljZGZfbWVtX2ZyZWUoCisJCQkgIGNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpOworCQkJY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9CisJCQkgIE5VTEw7CisJCX0KKwkJY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gajsKKwkJY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9CisJCQkJCQkJbmV3X2NoX2luZm8uQ2hhbm5lbExpc3Q7CisJfQorCisJcmV0dXJuIGNzcl9zY2FuX2NoYW5uZWxzKG1hY19jdHgsIGNtZCk7Cit9CisKK0NERl9TVEFUVVMgY3NyX3Byb2Nlc3Nfc2Nhbl9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc21zX2xvZyhwTWFjLCBMT0czLAorCQkJRkwoInN0YXJ0aW5nIFNDQU4gY21kIGluICVkIHN0YXRlLiByZWFzb24gJWQiKSwKKwkJCXBDb21tYW5kLT51LnNjYW5DbWQubGFzdFJvYW1TdGF0ZVtwQ29tbWFuZC0+c2Vzc2lvbklkXSwKKwkJCXBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uKTsKKworCXN3aXRjaCAocENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pIHsKKwljYXNlIGVDc3JTY2FuVXNlclJlcXVlc3Q6CisJCXN0YXR1cyA9IGNzcl9pc3N1ZV91c2VyX3NjYW4ocE1hYywgcENvbW1hbmQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSBjc3Jfc2Nhbl9jaGFubmVscyhwTWFjLCBwQ29tbWFuZCk7CisJCWJyZWFrOworCX0KKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJY3NyX3JlbGVhc2Vfc2Nhbl9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCBlQ1NSX1NDQU5fRkFJTFVSRSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3Jfc2Nhbl9jb3B5X3JlcXVlc3RfdmFsaWRfY2hhbm5lbHNfb25seSgpIC0gc2NhbiByZXF1ZXN0IG9mIHZhbGlkIGNoYW5uZWxzCisgKiBAbWFjX2N0eCA6IHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBTdHJ1Y3R1cmUKKyAqIEBkc3RfcmVxOiBwb2ludGVyIHRvIHRDc3JTY2FuUmVxdWVzdAorICogQHNraXBfZGZzX2Nobmw6IDEgLSBza2lwIGRmcyBjaGFubmVsLCAwIC0gZG9uJ3Qgc2tpcCBkZnMgY2hhbm5lbAorICogQHNyY19yZXE6IHBvaW50ZXIgdG8gdENzclNjYW5SZXF1ZXN0CisgKgorICogVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGNvcHkgb2Ygc2NhbiByZXF1ZXN0IHdpdGggdmFsaWQgY2hhbm5lbHMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgY3NyX3NjYW5fY29weV9yZXF1ZXN0X3ZhbGlkX2NoYW5uZWxzX29ubHkodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQl0Q3NyU2NhblJlcXVlc3QgKmRzdF9yZXEsIHVpbnQ4X3Qgc2tpcF9kZnNfY2hubCwKKwkJCQl0Q3NyU2NhblJlcXVlc3QgKnNyY19yZXEpCit7CisJdWludDMyX3QgaW5kZXggPSAwOworCXVpbnQzMl90IG5ld19pbmRleCA9IDA7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzcmNfcmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOyBpbmRleCsrKSB7CisJCS8qIEFsbG93IHNjYW4gb24gdmFsaWQgY2hhbm5lbHMgb25seS4KKwkJICogSWYgaXQgaXMgcDJwIHNjYW4gYW5kIHZhbGlkIGNoYW5uZWwgbGlzdCBkb2VzbnQgY29udGFpbgorCQkgKiBzb2NpYWwgY2hhbm5lbHMsIGVuZm9yY2Ugc2NhbiBvbiBzb2NpYWwgY2hhbm5lbHMgYmVjYXVzZQorCQkgKiB0aGF0IGlzIHRoZSBvbmx5IHdheSB0byBmaW5kIHAycCBwZWVycy4KKwkJICogVGhpcyBjYW4gaGFwcGVuIG9ubHkgaWYgYmFuZCBpcyBzZXQgdG8gNUdoeiBtb2RlLgorCQkgKi8KKwkJaWYgKHNyY19yZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W2luZGV4XSA8IE1JTl8xMVBfQ0hBTk5FTCAmJgorCQkJKChjc3Jfcm9hbV9pc192YWxpZF9jaGFubmVsKG1hY19jdHgsCisJCQlzcmNfcmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpbmRleF0pKSB8fAorCQkJKChlQ1NSX1NDQU5fUDJQX0RJU0NPVkVSWSA9PSBzcmNfcmVxLT5yZXF1ZXN0VHlwZSkgJiYKKwkJCUNTUl9JU19TT0NJQUxfQ0hBTk5FTCgKKwkJCQlzcmNfcmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpbmRleF0pKSkpIHsKKwkJCWlmICgoKHNyY19yZXEtPnNraXBEZnNDaG5sSW5QMnBTZWFyY2ggfHwgc2tpcF9kZnNfY2hubCkKKwkJCQkmJiAoQ0hBTk5FTF9TVEFURV9ERlMgPT0KKwkJCQljZHNfZ2V0X2NoYW5uZWxfc3RhdGUoc3JjX3JlcS0+CisJCQkJCQkJQ2hhbm5lbEluZm8uCisJCQkJCQkJQ2hhbm5lbExpc3QKKwkJCQkJCQlbaW5kZXhdKSkpCisJCQkpIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0cyLAorCQkJCQlGTCgiIHJlcVR5cGU9JWQsIG51bU9mQ2hhbm5lbHM9JWQsIGlnbm9yaW5nIERGUyBjaGFubmVsICVkIiksCisJCQkJCXNyY19yZXEtPnJlcXVlc3RUeXBlLAorCQkJCQlzcmNfcmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzLAorCQkJCQlzcmNfcmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdAorCQkJCQkJW2luZGV4XSk7CisjZW5kaWYKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZHN0X3JlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbbmV3X2luZGV4XSA9CisJCQkJc3JjX3JlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaW5kZXhdOworCQkJbmV3X2luZGV4Kys7CisJCX0KKwl9CisJZHN0X3JlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IG5ld19pbmRleDsKK30KKworLyoqCisgKiBjc3Jfc2Nhbl9jb3B5X3JlcXVlc3QoKSAtIEZ1bmN0aW9uIHRvIGNvcHkgc2NhbiByZXF1ZXN0CisgKiBAbWFjX2N0eCA6IHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBTdHJ1Y3R1cmUKKyAqIEBkc3RfcmVxOiBwb2ludGVyIHRvIHRDc3JTY2FuUmVxdWVzdAorICogQHNyY19yZXE6IHBvaW50ZXIgdG8gdENzclNjYW5SZXF1ZXN0CisgKgorICogVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGNvcHkgb2Ygc2NhbiByZXF1ZXN0CisgKgorICogUmV0dXJuOiAwIC0gU3VjY2VzcywgRXJyb3IgbnVtYmVyIC0gRmFpbHVyZQorICovCitDREZfU1RBVFVTIGNzcl9zY2FuX2NvcHlfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCXRDc3JTY2FuUmVxdWVzdCAqZHN0X3JlcSwKKwkJCQl0Q3NyU2NhblJlcXVlc3QgKnNyY19yZXEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdWludDMyX3QgbGVuID0gc2l6ZW9mKG1hY19jdHgtPnJvYW0udmFsaWRDaGFubmVsTGlzdCk7CisJdWludDMyX3QgaW5kZXggPSAwOworCXVpbnQzMl90IG5ld19pbmRleCA9IDA7CisJQ0hBTk5FTF9TVEFURSBjaGFubmVsX3N0YXRlOworCWJvb2wgc2tpcF9kZnNfY2hubCA9CisJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmluaXRpYWxfc2Nhbl9ub19kZnNfY2hubCB8fAorCQkJCSFtYWNfY3R4LT5zY2FuLmZFbmFibGVERlNDaG5sU2NhbjsKKworCXN0YXR1cyA9IGNzcl9zY2FuX2ZyZWVfcmVxdWVzdChtYWNfY3R4LCBkc3RfcmVxKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlnb3RvIGNvbXBsZXRlOworCWNkZl9tZW1fY29weShkc3RfcmVxLCBzcmNfcmVxLCBzaXplb2YodENzclNjYW5SZXF1ZXN0KSk7CisJLyogUmUtaW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgdG8gTlVMTCBzaW5jZSB3ZSBkaWQgYSBjb3B5ICovCisJZHN0X3JlcS0+cElFRmllbGQgPSBOVUxMOworCWRzdF9yZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKwlkc3RfcmVxLT5TU0lEcy5TU0lETGlzdCA9IE5VTEw7CisKKwlpZiAoc3JjX3JlcS0+dUlFRmllbGRMZW4pIHsKKwkJZHN0X3JlcS0+cElFRmllbGQgPQorCQkJY2RmX21lbV9tYWxsb2Moc3JjX3JlcS0+dUlFRmllbGRMZW4pOworCQlpZiAoTlVMTCA9PSBkc3RfcmVxLT5wSUVGaWVsZCkgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiTm8gbWVtb3J5IGZvciBzY2FubmluZyBJRSBmaWVsZHMiKSk7CisJCQlnb3RvIGNvbXBsZXRlOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJY2RmX21lbV9jb3B5KGRzdF9yZXEtPnBJRUZpZWxkLCBzcmNfcmVxLT5wSUVGaWVsZCwKKwkJCQlzcmNfcmVxLT51SUVGaWVsZExlbik7CisJCQlkc3RfcmVxLT51SUVGaWVsZExlbiA9IHNyY19yZXEtPnVJRUZpZWxkTGVuOworCQl9CisJfQorCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBJRSBmaWVsZCAqLworCWlmIChzcmNfcmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID09IDApIHsKKwkJZHN0X3JlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworCQlkc3RfcmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKwl9IGVsc2UgeworCQlkc3RfcmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9CisJCQljZGZfbWVtX21hbGxvYyhzcmNfcmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzICoKKwkJCQlzaXplb2YoKmRzdF9yZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSk7CisJCWlmIChOVUxMID09IGRzdF9yZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCQlkc3RfcmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiTm8gbWVtb3J5IGZvciBzY2FubmluZyBDaGFubmVsIExpc3QiKSk7CisJCQlnb3RvIGNvbXBsZXRlOworCQl9CisKKwkJaWYgKChzcmNfcmVxLT5zY2FuVHlwZSA9PSBlU0lSX1BBU1NJVkVfU0NBTikgJiYKKwkJCShzcmNfcmVxLT5yZXF1ZXN0VHlwZSA9PSBlQ1NSX1NDQU5fUkVRVUVTVF8xMURfU0NBTikpIHsKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNyY19yZXEtPkNoYW5uZWxJbmZvLgorCQkJCQkJbnVtT2ZDaGFubmVsczsgaW5kZXgrKykgeworCQkJCWNoYW5uZWxfc3RhdGUgPQorCQkJCQljZHNfZ2V0X2NoYW5uZWxfc3RhdGUoc3JjX3JlcS0+CisJCQkJCQkJQ2hhbm5lbEluZm8uCisJCQkJCQkJQ2hhbm5lbExpc3RbaW5kZXhdKTsKKwkJCQlpZiAoc3JjX3JlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaW5kZXhdIDwKKwkJCQkJCU1JTl8xMVBfQ0hBTk5FTCAmJgorCQkJCQkoKENIQU5ORUxfU1RBVEVfRU5BQkxFID09CisJCQkJCQljaGFubmVsX3N0YXRlKSB8fAorCQkJCQkoKENIQU5ORUxfU1RBVEVfREZTID09IGNoYW5uZWxfc3RhdGUpICYmCisJCQkJCSFza2lwX2Rmc19jaG5sKSkpIHsKKwkJCQkJZHN0X3JlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QKKwkJCQkJCQlbbmV3X2luZGV4XSA9CisJCQkJCQkJCXNyY19yZXEtPgorCQkJCQkJCQlDaGFubmVsSW5mby4KKwkJCQkJCQkJQ2hhbm5lbExpc3QKKwkJCQkJCQkJW2luZGV4XTsKKwkJCQkJbmV3X2luZGV4Kys7CisJCQkJfQorCQkJfQorCQkJZHN0X3JlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IG5ld19pbmRleDsKKwkJfSBlbHNlIGlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoCisJCQkJY3NyX2dldF9jZmdfdmFsaWRfY2hhbm5lbHMobWFjX2N0eCwKKwkJCQkJCW1hY19jdHgtPnJvYW0udmFsaWRDaGFubmVsTGlzdCwKKwkJCQkJCSZsZW4pKSkgeworCQkJbmV3X2luZGV4ID0gMDsKKwkJCW1hY19jdHgtPnJvYW0ubnVtVmFsaWRDaGFubmVscyA9IGxlbjsKKwkJCWNzcl9zY2FuX2NvcHlfcmVxdWVzdF92YWxpZF9jaGFubmVsc19vbmx5KG1hY19jdHgsCisJCQkJCQkJZHN0X3JlcSwgc2tpcF9kZnNfY2hubCwKKwkJCQkJCQlzcmNfcmVxKTsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiQ291bGRuJ3QgZ2V0IHRoZSB2YWxpZCBDaGFubmVsIExpc3QsIGtlZXBpbmcgcmVxdWVzdGVyJ3MgbGlzdCIpKTsKKwkJCW5ld19pbmRleCA9IDA7CisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzcmNfcmVxLT5DaGFubmVsSW5mby4KKwkJCQkJbnVtT2ZDaGFubmVsczsgaW5kZXgrKykgeworCQkJCWlmIChzcmNfcmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpbmRleF0gPAorCQkJCQkJTUlOXzExUF9DSEFOTkVMKSB7CisJCQkJCWRzdF9yZXEtPkNoYW5uZWxJbmZvLgorCQkJCQkJQ2hhbm5lbExpc3RbbmV3X2luZGV4XSA9CisJCQkJCQlzcmNfcmVxLT5DaGFubmVsSW5mby4KKwkJCQkJCUNoYW5uZWxMaXN0W2luZGV4XTsKKwkJCQkJbmV3X2luZGV4Kys7CisJCQkJfQorCQkJfQorCQkJZHN0X3JlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9CisJCQkJbmV3X2luZGV4OworCQl9CisJfSAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIENoYW5uZWwgTGlzdCAqLworCWlmIChzcmNfcmVxLT5TU0lEcy5udW1PZlNTSURzID09IDApIHsKKwkJZHN0X3JlcS0+U1NJRHMubnVtT2ZTU0lEcyA9IDA7CisJCWRzdF9yZXEtPlNTSURzLlNTSURMaXN0ID0gTlVMTDsKKwl9IGVsc2UgeworCQlkc3RfcmVxLT5TU0lEcy5TU0lETGlzdCA9CisJCQljZGZfbWVtX21hbGxvYyhzcmNfcmVxLT5TU0lEcy5udW1PZlNTSURzICoKKwkJCQkJc2l6ZW9mKCpkc3RfcmVxLT5TU0lEcy5TU0lETGlzdCkpOworCQlpZiAoTlVMTCA9PSBkc3RfcmVxLT5TU0lEcy5TU0lETGlzdCkKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZWxzZQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWRzdF9yZXEtPlNTSURzLm51bU9mU1NJRHMgPQorCQkJCXNyY19yZXEtPlNTSURzLm51bU9mU1NJRHM7CisJCQljZGZfbWVtX2NvcHkoZHN0X3JlcS0+U1NJRHMuU1NJRExpc3QsCisJCQkJc3JjX3JlcS0+U1NJRHMuU1NJRExpc3QsCisJCQkJc3JjX3JlcS0+U1NJRHMubnVtT2ZTU0lEcyAqCisJCQkJc2l6ZW9mKCpkc3RfcmVxLT5TU0lEcy5TU0lETGlzdCkpOworCQl9IGVsc2UgeworCQkJZHN0X3JlcS0+U1NJRHMubnVtT2ZTU0lEcyA9IDA7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJObyBtZW1vcnkgZm9yIHNjYW5uaW5nIFNTSUQgTGlzdCIpKTsKKwkJCWdvdG8gY29tcGxldGU7CisJCX0KKwl9IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgU1NJRCBMaXN0ICovCisJZHN0X3JlcS0+cDJwU2VhcmNoID0gc3JjX3JlcS0+cDJwU2VhcmNoOworCWRzdF9yZXEtPnNraXBEZnNDaG5sSW5QMnBTZWFyY2ggPQorCQlzcmNfcmVxLT5za2lwRGZzQ2hubEluUDJwU2VhcmNoOworCWRzdF9yZXEtPnNjYW5faWQgPSBzcmNfcmVxLT5zY2FuX2lkOworCWRzdF9yZXEtPnRpbWVzdGFtcCA9IHNyY19yZXEtPnRpbWVzdGFtcDsKKworY29tcGxldGU6CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljc3Jfc2Nhbl9mcmVlX3JlcXVlc3QobWFjX2N0eCwgZHN0X3JlcSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9mcmVlX3JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclNjYW5SZXF1ZXN0ICpwUmVxKQoreworCisJaWYgKHBSZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSB7CisJCWNkZl9tZW1fZnJlZShwUmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCk7CisJCXBSZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKwl9CisJcFJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDA7CisJaWYgKHBSZXEtPnBJRUZpZWxkKSB7CisJCWNkZl9tZW1fZnJlZShwUmVxLT5wSUVGaWVsZCk7CisJCXBSZXEtPnBJRUZpZWxkID0gTlVMTDsKKwl9CisJcFJlcS0+dUlFRmllbGRMZW4gPSAwOworCWlmIChwUmVxLT5TU0lEcy5TU0lETGlzdCkgeworCQljZGZfbWVtX2ZyZWUocFJlcS0+U1NJRHMuU1NJRExpc3QpOworCQlwUmVxLT5TU0lEcy5TU0lETGlzdCA9IE5VTEw7CisJfQorCXBSZXEtPlNTSURzLm51bU9mU1NJRHMgPSAwOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBjc3Jfc2Nhbl9jYWxsX2NhbGxiYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kLAorCQkJICAgIGVDc3JTY2FuU3RhdHVzIHNjYW5TdGF0dXMpCit7CisJaWYgKHBDb21tYW5kLT51LnNjYW5DbWQuY2FsbGJhY2spIHsKKwkJcENvbW1hbmQtPnUuc2NhbkNtZC5jYWxsYmFjayhwTWFjLCBwQ29tbWFuZC0+dS5zY2FuQ21kLnBDb250ZXh0LAorCQkJCQkgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQsCisJCQkJCSAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC5zY2FuSUQsCisJCQkJCSAgICAgc2NhblN0YXR1cyk7CisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cyLCAiJXM6JWQgLSBDYWxsYmFjayBOVUxMISEhIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJfQorfQorCit2b2lkIGNzcl9zY2FuX3N0b3BfdGltZXJzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJaWYgKDAgIT0gcE1hYy0+c2Nhbi5zY2FuUmVzdWx0Q2ZnQWdpbmdUaW1lKSB7CisJCWNzcl9zY2FuX3N0b3BfcmVzdWx0X2NmZ19hZ2luZ190aW1lcihwTWFjKTsKKwl9CisKK30KKworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisvKioKKyAqIGNzcl9zdGFfYXBfY29uY190aW1lcl9oYW5kbGVyIC0gRnVuY3Rpb24gdG8gaGFuZGxlIFNUQSxBUCBjb25jdXJyZW5jeSB0aW1lcgorICogQHB2OiBwb2ludGVyIHZhcmlhYmxlCisgKgorICogRnVuY3Rpb24gaGFuZGxlcyBTVEEsQVAgY29uY3VycmVuY3kgdGltZXIKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgY3NyX3N0YV9hcF9jb25jX3RpbWVyX2hhbmRsZXIodm9pZCAqcHYpCit7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKHB2KTsKKwl0TGlzdEVsZW0gKmVudHJ5OworCXRTbWVDbWQgKnNjYW5fY21kOworCXVpbnQzMl90IHNlc3Npb25faWQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworCXRDc3JTY2FuUmVxdWVzdCBzY2FuX3JlcTsKKwl0U21lQ21kICpzZW5kX3NjYW5jbWQgPSBOVUxMOworCXVpbnQ4X3QgbnVtX2NobiA9IDA7CisJdWludDhfdCBudW1jaGFuX2NvbWJpbmVkY29uYyA9IDA7CisJdWludDhfdCBpLCBqOworCXRDc3JDaGFubmVsSW5mbyAqY2huX2luZm8gPSBOVUxMOworCXVpbnQ4X3QgY2hhbm5lbF90b19zY2FuW1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwljc3JfbGxfbG9jaygmbWFjX2N0eC0+c2Nhbi5zY2FuQ21kUGVuZGluZ0xpc3QpOworCisJZW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZtYWNfY3R4LT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCwKKwkJCUxMX0FDQ0VTU19OT0xPQ0spOworCisJaWYgKE5VTEwgPT0gZW50cnkpIHsKKwkJY3NyX2xsX3VubG9jaygmbWFjX2N0eC0+c2Nhbi5zY2FuQ21kUGVuZGluZ0xpc3QpOworCQlyZXR1cm47CisJfQorCisKKwljaG5faW5mbyA9ICZzY2FuX3JlcS5DaGFubmVsSW5mbzsKKwlzY2FuX2NtZCA9IEdFVF9CQVNFX0FERFIoZW50cnksIHRTbWVDbWQsIExpbmspOworCW51bV9jaG4gPQorCQlzY2FuX2NtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKwlzZXNzaW9uX2lkID0gc2Nhbl9jbWQtPnNlc3Npb25JZDsKKworCS8qCisJICogaWYgYW55IHNlc3Npb24gaXMgY29ubmVjdGVkIGFuZCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4gaXMKKwkgKiBncmVhdGVyIHRoYW4gMSB0aGVuIHNwbGl0IHRoZSBzY2FuIGludG8gbXVsdGlwbGUgc2NhbiBvcGVyYXRpb25zCisJICogb24gZWFjaCBpbmRpdmlkdWFsIGNoYW5uZWwgZWxzZSBjb250aW51ZSB0byBwZXJmb3JtIHNjYW4gb24gYWxsCisJICogc3BlY2lmaWVkIGNoYW5uZWxzICovCisKKwkvKgorCSAqIHNwbGl0IHNjYW4gaWYgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4gaXMgZ3JlYXRlciB0aGFuIDEgYW5kCisJICogYW55IG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqIC0gU1RBIHNlc3Npb24gaXMgY29ubmVjdGVkIGFuZCB0aGUgc2NhbiBpcyBub3QgYSBQMlAgc2VhcmNoCisJICogLSBhbnkgUDJQIHNlc3Npb24gaXMgY29ubmVjdGVkCisJICogRG8gbm90IHNwbGl0IHNjYW5zIGlmIG5vIGNvbmN1cnJlbnQgaW5mcmEgY29ubmVjdGlvbnMgYXJlCisJICogYWN0aXZlIGFuZCBpZiB0aGUgc2NhbiBpcyBhIEJHIHNjYW4gdHJpZ2dlcmVkIGJ5IExGUiAoT1IpCisJICogYW55IHNjYW4gaWYgTEZSIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBCRyBzY2FuLiBTcGxpdHRpbmcKKwkgKiB0aGUgc2NhbiBpcyBkZWxheWluZyB0aGUgdGltZSBpdCB0YWtlcyBmb3IgTEZSIHRvIGZpbmQKKwkgKiBjYW5kaWRhdGVzIGFuZCByZXN1bHRpbmcgaW4gZGlzY29ubmVjdHMuCisJICovCisKKwlpZiAoKGNzcl9pc19zdGFfc2Vzc2lvbl9jb25uZWN0ZWQobWFjX2N0eCkgJiYKKwkJIWNzcl9pc19wMnBfc2Vzc2lvbl9jb25uZWN0ZWQobWFjX2N0eCkpKQorCQludW1jaGFuX2NvbWJpbmVkY29uYyA9CisJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5OdW1TdGFDaGFuQ29tYmluZWRDb25jOworCWVsc2UgaWYgKGNzcl9pc19wMnBfc2Vzc2lvbl9jb25uZWN0ZWQobWFjX2N0eCkpCisJCW51bWNoYW5fY29tYmluZWRjb25jID0KKwkJCW1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0ubk51bVAyUENoYW5Db21iaW5lZENvbmM7CisKKwlpZiAoKG51bV9jaG4gPiBudW1jaGFuX2NvbWJpbmVkY29uYykgJiYKKwkJKChjc3JfaXNfc3RhX3Nlc3Npb25fY29ubmVjdGVkKG1hY19jdHgpICYmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCQkoY3NyX2lzX2NvbmN1cnJlbnRfaW5mcmFfY29ubmVjdGVkKG1hY19jdHgpKSAmJgorI2VuZGlmCisJCShzY2FuX2NtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QucDJwU2VhcmNoICE9IDEpKSB8fAorCQkoY3NyX2lzX3AycF9zZXNzaW9uX2Nvbm5lY3RlZChtYWNfY3R4KSkpKSB7CisJCQljZGZfbWVtX3NldCgmc2Nhbl9yZXEsIHNpemVvZih0Q3NyU2NhblJlcXVlc3QpLCAwKTsKKworCQkvKiBvcHRpbWl6ZSB0aGlzIHRvIHVzZSAyIGNvbW1hbmQgYnVmZmVyIG9ubHkgKi8KKwkJc2VuZF9zY2FuY21kID0gY3NyX2dldF9jb21tYW5kX2J1ZmZlcihtYWNfY3R4KTsKKwkJaWYgKCFzZW5kX3NjYW5jbWQpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiIEZhaWxlZCB0byBnZXQgUXVldWUgY29tbWFuZCBidWZmZXIiKSk7CisJCQljc3JfbGxfdW5sb2NrKCZtYWNfY3R4LT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCk7CisJCQlyZXR1cm47CisJCX0KKwkJc2VuZF9zY2FuY21kLT5jb21tYW5kID0gc2Nhbl9jbWQtPmNvbW1hbmQ7CisJCXNlbmRfc2NhbmNtZC0+c2Vzc2lvbklkID0gc2Nhbl9jbWQtPnNlc3Npb25JZDsKKwkJc2VuZF9zY2FuY21kLT51LnNjYW5DbWQuY2FsbGJhY2sgPSBOVUxMOworCQlzZW5kX3NjYW5jbWQtPnUuc2NhbkNtZC5wQ29udGV4dCA9CisJCXNjYW5fY21kLT51LnNjYW5DbWQucENvbnRleHQ7CisJCXNlbmRfc2NhbmNtZC0+dS5zY2FuQ21kLnJlYXNvbiA9CisJCQkJc2Nhbl9jbWQtPnUuc2NhbkNtZC5yZWFzb247CisJCS8qIGxldCBpdCB3cmFwIGFyb3VuZCAqLworCQl3bWFfZ2V0X3NjYW5faWQoJnNlbmRfc2NhbmNtZC0+dS5zY2FuQ21kLnNjYW5JRCk7CisKKwkJLyoKKwkJICogRmlyc3QgY29weSBhbGwgdGhlIHBhcmFtZXRlcnMgdG8gbG9jYWwgdmFyaWFibGUgb2Ygc2NhbgorCQkgKiByZXF1ZXN0CisJCSAqLworCQljc3Jfc2Nhbl9jb3B5X3JlcXVlc3QobWFjX2N0eCwgJnNjYW5fcmVxLAorCQkJCQkmc2Nhbl9jbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0KTsKKworCQkvKgorCQkgKiBOb3cgbW9kaWZ5IHRoZSBlbGVtZW50cyBvZiBsb2NhbCB2YXIgc2NhbiByZXF1ZXN0IHJlcXVpcmVkCisJCSAqIHRvIGJlIG1vZGlmaWVkIGZvciBzcGxpdCBzY2FuCisJCSAqLworCQlpZiAoc2Nhbl9yZXEuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgIT0gTlVMTCkgeworCQkJCWNkZl9tZW1fZnJlZShzY2FuX3JlcS5DaGFubmVsSW5mby5DaGFubmVsTGlzdCk7CisJCQlzY2FuX3JlcS5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisJCX0KKworCQljaG5faW5mby0+bnVtT2ZDaGFubmVscyA9IG51bWNoYW5fY29tYmluZWRjb25jOworCQljZGZfbWVtX2NvcHkoJmNoYW5uZWxfdG9fc2NhblswXSwKKwkJCQkmc2Nhbl9jbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLgorCQkJCUNoYW5uZWxMaXN0WzBdLCBjaG5faW5mby0+bnVtT2ZDaGFubmVscworCQkJCSogc2l6ZW9mKHVpbnQ4X3QpKTsKKwkJY2huX2luZm8tPkNoYW5uZWxMaXN0ID0gJmNoYW5uZWxfdG9fc2NhblswXTsKKworCQlmb3IgKGkgPSAwLCBqID0gbnVtY2hhbl9jb21iaW5lZGNvbmM7CisJCQkJaSA8IChudW1fY2huIC0gbnVtY2hhbl9jb21iaW5lZGNvbmMpOworCQkJCQkJaSsrLCBqKyspIHsKKwkJCS8qIE1vdmUgYWxsIHRoZSBjaGFubmVscyBvbmUgc3RlcCAqLworCQkJc2Nhbl9jbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLgorCQkJCQlDaGFubmVsTGlzdFtpXSA9CisJCQkJCXNjYW5fY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC4KKwkJCQkJQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3Rbal07CisJCX0KKworCQkvKiByZWR1Y2Ugb3V0c3RhbmRpbmcgIyBvZiBjaGFubmVscyB0byBiZSBzY2FubmVkICovCisJCXNjYW5fY21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0KKwkJCQludW1fY2huIC0gbnVtY2hhbl9jb21iaW5lZGNvbmM7CisKKwkJc2Nhbl9yZXEuQlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworCQkvKiBNb2RpZnkgY2FsbGVycyBwYXJhbWV0ZXJzIGluIGNhc2Ugb2YgY29uY3VycmVuY3kgKi8KKwkJc2Nhbl9yZXEuc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworCQkvKiBVc2UgY29uY3VycmVuY3kgdmFsdWVzIGZvciBtaW4vbWF4Q2huVGltZS4gKi8KKwkJY3NyX3NldF9kZWZhdWx0X3NjYW5fdGltaW5nKG1hY19jdHgsIHNjYW5fcmVxLnNjYW5UeXBlLAorCQkJCQkJJnNjYW5fcmVxKTsKKworCQlzdGF0dXMgPSBjc3Jfc2Nhbl9jb3B5X3JlcXVlc3QobWFjX2N0eCwKKwkJCQkJCSZzZW5kX3NjYW5jbWQtPnUuc2NhbkNtZC51LgorCQkJCQkJc2NhblJlcXVlc3QsICZzY2FuX3JlcSk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiIEZhaWxlZCB0byBnZXQgY29weSBjc3Jfc2Nhbl9yZXF1ZXN0ID0gJWQiKSwKKwkJCQlzdGF0dXMpOworCQkJY3NyX2xsX3VubG9jaygmbWFjX2N0eC0+c2Nhbi5zY2FuQ21kUGVuZGluZ0xpc3QpOworCQkJcmV0dXJuOworCQl9CisJCS8qIENsZWFuIHRoZSBsb2NhbCBzY2FuIHZhcmlhYmxlICovCisJCXNjYW5fcmVxLkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKwkJc2Nhbl9yZXEuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDA7CisJCWNzcl9zY2FuX2ZyZWVfcmVxdWVzdChtYWNfY3R4LCAmc2Nhbl9yZXEpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIG5vIGFjdGl2ZSBjb25uZWN0ZWQgc2Vzc2lvbiBwcmVzZW50IG9yIG51bUNobiA9PSAxCisJCSAqIHNjYW4gYWxsIHJlbWFpbmluZyBjaGFubmVscworCQkgKi8KKwkJc2VuZF9zY2FuY21kID0gc2Nhbl9jbWQ7CisJCS8qIHJlbW92ZSB0aGlzIGNvbW1hbmQgZnJvbSBwZW5kaW5nIGxpc3QgKi8KKwkJaWYgKGNzcl9sbF9yZW1vdmVfaGVhZCgmbWFjX2N0eC0+c2Nhbi5zY2FuQ21kUGVuZGluZ0xpc3QsCisJCQkvKgorCQkJICogSW4gY2FzZSBiZXR3ZWVuIFBlZWtIZWFkIGFuZCBoZXJlLCB0aGUgZW50cnkKKwkJCSAqIGdvdCByZW1vdmVkIGJ5IGFub3RoZXIgdGhyZWFkLgorCQkJICovCisJCQkJCUxMX0FDQ0VTU19OT0xPQ0spID09IE5VTEwpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiIEZhaWxlZCB0byByZW1vdmUgZW50cnkgZnJvbSBzY2FuQ21kUGVuZGluZ0xpc3QiKSk7CisJCX0KKworCX0KKwljc3JfcXVldWVfc21lX2NvbW1hbmQobWFjX2N0eCwgc2VuZF9zY2FuY21kLCBmYWxzZSk7CisKKworCWNzcl9sbF91bmxvY2soJm1hY19jdHgtPnNjYW4uc2NhbkNtZFBlbmRpbmdMaXN0KTsKKworfQorI2VuZGlmCisKK0NERl9TVEFUVVMgY3NyX3NjYW5fc3RhcnRfcmVzdWx0X2NmZ19hZ2luZ190aW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAocE1hYy0+c2Nhbi5mU2NhbkVuYWJsZSkgeworCQlzdGF0dXMgPQorCQkJY2RmX21jX3RpbWVyX3N0YXJ0KCZwTWFjLT5zY2FuLmhUaW1lclJlc3VsdENmZ0FnaW5nLAorCQkJCQkgICBDU1JfU0NBTl9SRVNVTFRfQ0ZHX0FHSU5HX0lOVEVSVkFMIC8KKwkJCQkJICAgQ0RGX01DX1RJTUVSX1RPX01TX1VOSVQpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl9zY2FuX3N0b3BfcmVzdWx0X2NmZ19hZ2luZ190aW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXJldHVybiBjZGZfbWNfdGltZXJfc3RvcCgmcE1hYy0+c2Nhbi5oVGltZXJSZXN1bHRDZmdBZ2luZyk7Cit9CisKKy8qKgorICogY3NyX3NjYW5fcmVzdWx0X2NmZ19hZ2luZ190aW1lcl9oYW5kbGVyKCkgLSBUaW1lIGJhc2VkIHNjYW4gYWdpbmcgaGFuZGxlcgorICogQHB2OiBHbG9iYWwgY29udGV4dAorICoKKyAqIFRoaXMgcm91dGluZSBpcyB0byBoYW5kbGUgc2NhbiBhZ2luZyBiYXNlZCBvbiB1c2VyIGNvbmZpZ3VyZWQgdGltZXIgdmFsdWUuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGNzcl9zY2FuX3Jlc3VsdF9jZmdfYWdpbmdfdGltZXJfaGFuZGxlcih2b2lkICpwdikKK3sKKwl0cEFuaVNpckdsb2JhbCBtYWNfY3R4ID0gUE1BQ19TVFJVQ1QocHYpOworCXRMaXN0RWxlbSAqZW50cnksICp0bXBfZW50cnk7CisJdENzclNjYW5SZXN1bHQgKnJlc3VsdDsKKwl1aW50MzJfdCBhZ2VvdXRfdGltZSA9CisJCW1hY19jdHgtPnNjYW4uc2NhblJlc3VsdENmZ0FnaW5nVGltZSAqIENERl9USUNLU19QRVJfU0VDT05ELzEwOworCXVpbnQzMl90IGN1cl90aW1lID0gKHVpbnQzMl90KSBjZGZfbWNfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpOworCXVpbnQ4X3QgKmJzc0lkOworCisJY3NyX2xsX2xvY2soJm1hY19jdHgtPnNjYW4uc2NhblJlc3VsdExpc3QpOworCWVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmbWFjX2N0eC0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisJd2hpbGUgKGVudHJ5KSB7CisJCXRtcF9lbnRyeSA9IGNzcl9sbF9uZXh0KCZtYWNfY3R4LT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBlbnRyeSwKKwkJCQkJTExfQUNDRVNTX05PTE9DSyk7CisJCXJlc3VsdCA9IEdFVF9CQVNFX0FERFIoZW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKwkJLyoKKwkJICogY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKSByZXR1cm5zIGluIDEwbXMgaW50ZXJ2YWwuCisJCSAqIHNvIGFnZW91dCB0aW1lIHZhbHVlIGFsc28gdXBkYXRlZCB0byAxMG1zIGludGVydmFsIHZhbHVlLgorCQkgKi8KKwkJaWYgKChjdXJfdGltZSAtIHJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IublJlY2VpdmVkVGltZSkgPgorCQkJICAgIGFnZW91dF90aW1lKSB7CisJCQlic3NJZCA9IHJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuYnNzSWQ7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoImFnZSBvdXQgZHVlIHRvIHRpbWUgb3V0Ik1BQ19BRERSRVNTX1NUUiksCisJCQkJTUFDX0FERFJfQVJSQVkoYnNzSWQpKTsKKwkJCWNzcl9zY2FuX2FnZV9vdXRfYnNzKG1hY19jdHgsIHJlc3VsdCk7CisJCX0KKwkJZW50cnkgPSB0bXBfZW50cnk7CisJfQorCWNzcl9sbF91bmxvY2soJm1hY19jdHgtPnNjYW4uc2NhblJlc3VsdExpc3QpOworCWNkZl9tY190aW1lcl9zdGFydCgmbWFjX2N0eC0+c2Nhbi5oVGltZXJSZXN1bHRDZmdBZ2luZywKKwkJCSAgIENTUl9TQ0FOX1JFU1VMVF9DRkdfQUdJTkdfSU5URVJWQUwgLworCQkJICAgQ0RGX01DX1RJTUVSX1RPX01TX1VOSVQpOworfQorCitib29sIGNzcl9zY2FuX3JlbW92ZV9mcmVzaF9zY2FuX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisJYm9vbCBmUmV0ID0gZmFsc2U7CisJdExpc3RFbGVtICpwRW50cnksICpwRW50cnlUbXA7CisJdFNtZUNtZCAqcENvbW1hbmQ7CisJdERibExpbmtMaXN0IGxvY2FsTGlzdDsKKwl0RGJsTGlua0xpc3QgKnBDbWRMaXN0OworCisJY2RmX21lbV96ZXJvKCZsb2NhbExpc3QsIHNpemVvZih0RGJsTGlua0xpc3QpKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjc3JfbGxfb3BlbihwTWFjLT5oSGRkLCAmbG9jYWxMaXN0KSkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWxlZCB0byBvcGVuIGxpc3QiKSk7CisJCXJldHVybiBmUmV0OworCX0KKworCXBDbWRMaXN0ID0gJnBNYWMtPnNtZS5zbWVTY2FuQ21kUGVuZGluZ0xpc3Q7CisKKwljc3JfbGxfbG9jayhwQ21kTGlzdCk7CisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZChwQ21kTGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisJd2hpbGUgKHBFbnRyeSkgeworCQlwRW50cnlUbXAgPSBjc3JfbGxfbmV4dChwQ21kTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisJCWlmICghKChlU21lQ29tbWFuZFNjYW4gPT0gcENvbW1hbmQtPmNvbW1hbmQpCisJCSAgICAmJiAoc2Vzc2lvbklkID09IHBDb21tYW5kLT5zZXNzaW9uSWQpKSkgeworCQkJcEVudHJ5ID0gcEVudHJ5VG1wOworCQkJY29udGludWU7CisJCX0KKwkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIi0tLS0tLS0tIGFib3J0IHNjYW4gY29tbWFuZCByZWFzb24gPSAlZCIpLAorCQkJcENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pOworCQkvKiBUaGUgcmVzdCBhcmUgZnJlc2ggc2NhbiByZXF1ZXN0cyAqLworCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeShwQ21kTGlzdCwgcEVudHJ5LAorCQkJCQlMTF9BQ0NFU1NfTk9MT0NLKSkgeworCQkJY3NyX2xsX2luc2VydF90YWlsKCZsb2NhbExpc3QsIHBFbnRyeSwKKwkJCQkJICAgTExfQUNDRVNTX05PTE9DSyk7CisJCX0KKwkJZlJldCA9IHRydWU7CisJCXBFbnRyeSA9IHBFbnRyeVRtcDsKKwl9CisKKwljc3JfbGxfdW5sb2NrKHBDbWRMaXN0KTsKKworCXdoaWxlICgocEVudHJ5ID0gY3NyX2xsX3JlbW92ZV9oZWFkKCZsb2NhbExpc3QsIExMX0FDQ0VTU19OT0xPQ0spKSkgeworCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJaWYgKHBDb21tYW5kLT51LnNjYW5DbWQuY2FsbGJhY2spIHsKKwkJCS8qCisJCQkgKiBVc2VyIHNjYW4gcmVxdWVzdCBpcyBwZW5kaW5nLCBzZW5kIHJlc3BvbnNlIHdpdGgKKwkJCSAqIHN0YXR1cyBlQ1NSX1NDQU5fQUJPUlQKKwkJCSAqLworCQkJcENvbW1hbmQtPnUuc2NhbkNtZC5jYWxsYmFjayhwTWFjLAorCQkJCXBDb21tYW5kLT51LnNjYW5DbWQucENvbnRleHQsIHNlc3Npb25JZCwKKwkJCQlwQ29tbWFuZC0+dS5zY2FuQ21kLnNjYW5JRCwgZUNTUl9TQ0FOX0FCT1JUKTsKKwkJfQorCQljc3JfcmVsZWFzZV9jb21tYW5kX3NjYW4ocE1hYywgcENvbW1hbmQpOworCX0KKwljc3JfbGxfY2xvc2UoJmxvY2FsTGlzdCk7CisKKwlyZXR1cm4gZlJldDsKK30KKwordm9pZCBjc3JfcmVsZWFzZV9zY2FuX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsCisJCQkgICAgICBlQ3NyU2NhblN0YXR1cyBzY2FuU3RhdHVzKQoreworCWVDc3JTY2FuUmVhc29uIHJlYXNvbiA9IHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uOworCWJvb2wgc3RhdHVzOworCXREYmxMaW5rTGlzdCAqY21kX2xpc3QgPSBOVUxMOworCisJY3NyX3NjYW5fY2FsbF9jYWxsYmFjayhwTWFjLCBwQ29tbWFuZCwgc2NhblN0YXR1cyk7CisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiUmVtb3ZlIFNjYW4gY29tbWFuZCByZWFzb24gPSAlZCwgc2Nhbl9pZCAlZCIpLAorCQlyZWFzb24sIHBDb21tYW5kLT51LnNjYW5DbWQuc2NhbklEKTsKKwljbWRfbGlzdCA9ICZwTWFjLT5zbWUuc21lU2NhbkNtZEFjdGl2ZUxpc3Q7CisJc3RhdHVzID0gY3NyX2xsX3JlbW92ZV9lbnRyeShjbWRfbGlzdCwgJnBDb21tYW5kLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKCFzdGF0dXMpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoImNhbm5vdCByZWxlYXNlIGNvbW1hbmQgcmVhc29uICVkIHNjYW5faWQgJWQiKSwKKwkJCXBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uLAorCQkJcENvbW1hbmQtPnUuc2NhbkNtZC5zY2FuSUQpOworCQlyZXR1cm47CisJfQorCWNzcl9yZWxlYXNlX2NvbW1hbmRfc2NhbihwTWFjLCBwQ29tbWFuZCk7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NjYW5fZ2V0X3Bta2lkX2NhbmRpZGF0ZV9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgIHRQbWtpZENhbmRpZGF0ZUluZm8gKnBQbWtpZExpc3QsCisJCQkJCSAgICAgdWludDMyX3QgKnBOdW1JdGVtcykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyOworCXRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQ7CisJdFNjYW5SZXN1bHRIYW5kbGUgaEJTU0xpc3Q7CisJdWludDMyX3Qgbkl0ZW1zID0gKnBOdW1JdGVtczsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXNtc19sb2cocE1hYywgTE9HVywgRkwoInBNYWMtPnNjYW4uTnVtUG1raWRDYW5kaWRhdGUgPSAlZCIpLAorCQlwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUpOworCWNzcl9yZXNldF9wbWtpZF9jYW5kaWRhdGVfbGlzdChwTWFjLCBzZXNzaW9uSWQpOworCWlmICghKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpCisJICAgICYmIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpKQorCQlyZXR1cm4gc3RhdHVzOworCisJKnBOdW1JdGVtcyA9IDA7CisJcFNjYW5GaWx0ZXIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKwlpZiAoTlVMTCA9PSBwU2NhbkZpbHRlcikKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKworCWNkZl9tZW1fc2V0KHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpLCAwKTsKKwkvKiBIZXJlIGlzIHRoZSBwcm9maWxlIHdlIG5lZWQgdG8gY29ubmVjdCB0byAqLworCXN0YXR1cyA9IGNzcl9yb2FtX3ByZXBhcmVfZmlsdGVyX2Zyb21fcHJvZmlsZShwTWFjLAorCQkJCQlwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLCBwU2NhbkZpbHRlcik7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljZGZfbWVtX2ZyZWUocFNjYW5GaWx0ZXIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGNzcl9zY2FuX2dldF9yZXN1bHQocE1hYywgcFNjYW5GaWx0ZXIsICZoQlNTTGlzdCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljc3JfZnJlZV9zY2FuX2ZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisJCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlcik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaWYgKHBTZXNzaW9uLT5OdW1QbWtpZENhbmRpZGF0ZSA8IG5JdGVtcykgeworCQlwU2NhblJlc3VsdCA9IGNzcl9zY2FuX3Jlc3VsdF9nZXRfbmV4dChwTWFjLCBoQlNTTGlzdCk7CisJCXdoaWxlIChwU2NhblJlc3VsdCAhPSBOVUxMKSB7CisJCQkvKiBOdW1QbWtpZENhbmRpZGF0ZSBhZGRzIHVwIGhlcmUgKi8KKwkJCWNzcl9wcm9jZXNzX2Jzc19kZXNjX2Zvcl9wbWtpZF9saXN0KHBNYWMsCisJCQkJJnBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLAorCQkJCSh0RG90MTFmQmVhY29uSUVzICopKHBTY2FuUmVzdWx0LT5wdkllcyksCisJCQkJc2Vzc2lvbklkKTsKKwkJCXBTY2FuUmVzdWx0ID0gY3NyX3NjYW5fcmVzdWx0X2dldF9uZXh0KHBNYWMsIGhCU1NMaXN0KTsKKwkJfQorCX0KKworCWlmIChwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUpIHsKKwkJKnBOdW1JdGVtcyA9IHBTZXNzaW9uLT5OdW1QbWtpZENhbmRpZGF0ZTsKKwkJY2RmX21lbV9jb3B5KHBQbWtpZExpc3QsIHBTZXNzaW9uLT5QbWtpZENhbmRpZGF0ZUluZm8sCisJCQkgICAgIHBTZXNzaW9uLT5OdW1QbWtpZENhbmRpZGF0ZSAqCisJCQkgICAgIHNpemVvZih0UG1raWRDYW5kaWRhdGVJbmZvKSk7CisJfQorCisJY3NyX3NjYW5fcmVzdWx0X3B1cmdlKHBNYWMsIGhCU1NMaXN0KTsKKwljc3JfZnJlZV9zY2FuX2ZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisJY2RmX21lbV9mcmVlKHBTY2FuRmlsdGVyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKK0NERl9TVEFUVVMgY3NyX3NjYW5fZ2V0X2JraWRfY2FuZGlkYXRlX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJICAgIHRCa2lkQ2FuZGlkYXRlSW5mbyAqcEJraWRMaXN0LAorCQkJCQkgICAgdWludDMyX3QgKnBOdW1JdGVtcykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyOworCXRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQ7CisJdFNjYW5SZXN1bHRIYW5kbGUgaEJTU0xpc3Q7CisJdWludDMyX3Qgbkl0ZW1zID0gKnBOdW1JdGVtczsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXNtc19sb2cocE1hYywgTE9HVywgRkwoInBNYWMtPnNjYW4uTnVtQmtpZENhbmRpZGF0ZSA9ICVkIiksCisJCXBTZXNzaW9uLT5OdW1Ca2lkQ2FuZGlkYXRlKTsKKwljc3JfcmVzZXRfYmtpZF9jYW5kaWRhdGVfbGlzdChwTWFjLCBzZXNzaW9uSWQpOworCWlmICghKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpCisJICAgICYmIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpKQorCQlyZXR1cm4gc3RhdHVzOworCisJKnBOdW1JdGVtcyA9IDA7CisJcFNjYW5GaWx0ZXIgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKwlpZiAoTlVMTCA9PSBwU2NhbkZpbHRlcikKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKworCWNkZl9tZW1fc2V0KHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpLCAwKTsKKwkvKiBIZXJlIGlzIHRoZSBwcm9maWxlIHdlIG5lZWQgdG8gY29ubmVjdCB0byAqLworCXN0YXR1cyA9IGNzcl9yb2FtX3ByZXBhcmVfZmlsdGVyX2Zyb21fcHJvZmlsZShwTWFjLAorCQkJCQlwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLCBwU2NhbkZpbHRlcik7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljZGZfbWVtX2ZyZWUocFNjYW5GaWx0ZXIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGNzcl9zY2FuX2dldF9yZXN1bHQocE1hYywgcFNjYW5GaWx0ZXIsICZoQlNTTGlzdCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljc3JfZnJlZV9zY2FuX2ZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisJCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlcik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaWYgKHBTZXNzaW9uLT5OdW1Ca2lkQ2FuZGlkYXRlIDwgbkl0ZW1zKSB7CisJCXBTY2FuUmVzdWx0ID0gY3NyX3NjYW5fcmVzdWx0X2dldF9uZXh0KHBNYWMsIGhCU1NMaXN0KTsKKwkJd2hpbGUgKHBTY2FuUmVzdWx0ICE9IE5VTEwpIHsKKwkJCS8qIHBNYWMtPnNjYW4uTnVtQmtpZENhbmRpZGF0ZSBhZGRzIHVwIGhlcmUgKi8KKwkJCWNzcl9wcm9jZXNzX2Jzc19kZXNjX2Zvcl9ia2lkX2xpc3QocE1hYywKKwkJCQkmcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IsCisJCQkJKHREb3QxMWZCZWFjb25JRXMgKikocFNjYW5SZXN1bHQtPnB2SWVzKSk7CisJCQlwU2NhblJlc3VsdCA9IGNzcl9zY2FuX3Jlc3VsdF9nZXRfbmV4dChwTWFjLCBoQlNTTGlzdCk7CisJCX0KKwl9CisKKwlpZiAocFNlc3Npb24tPk51bUJraWRDYW5kaWRhdGUpIHsKKwkJKnBOdW1JdGVtcyA9IHBTZXNzaW9uLT5OdW1Ca2lkQ2FuZGlkYXRlOworCQljZGZfbWVtX2NvcHkocEJraWRMaXN0LCBwU2Vzc2lvbi0+QmtpZENhbmRpZGF0ZUluZm8sCisJCQkgICAgIHBTZXNzaW9uLT5OdW1Ca2lkQ2FuZGlkYXRlICoKKwkJCSAgICAgc2l6ZW9mKHRCa2lkQ2FuZGlkYXRlSW5mbykpOworCX0KKworCWNzcl9zY2FuX3Jlc3VsdF9wdXJnZShwTWFjLCBoQlNTTGlzdCk7CisJY3NyX2ZyZWVfc2Nhbl9maWx0ZXIocE1hYywgcFNjYW5GaWx0ZXIpOworCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlcik7CisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisvKioKKyAqIGNzcl9yb2FtX2NvcHlfY2hhbm5lbGxpc3QoKSAtIEZ1bmN0aW9uIHRvIGNvcHkgY2hhbm5lbCBsaXN0CisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBHbG9iYWwgTWFjIHN0cnVjdHVyZQorICogQHByb2ZpbGU6IHBvaW50ZXIgdG8gdENzclJvYW1Qcm9maWxlCisgKiBAc2Nhbl9jbWQ6IHBvaW50ZXIgdG8gdFNtZUNtZAorICogQGluZGV4OiBpbmRleCBmb3IgY2hhbm5lbGxpc3QKKyAqCisgKiBGdW5jdGlvbiBjb3BpZXMgY2hhbm5lbCBsaXN0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIGNzcl9yb2FtX2NvcHlfY2hhbm5lbGxpc3QodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQl0Q3NyUm9hbVByb2ZpbGUgKnByb2ZpbGUsCisJCQkJdFNtZUNtZCAqc2Nhbl9jbWQsIHVpbnQ4X3QgaW5kZXgpCit7CisJdENzckNoYW5uZWxJbmZvICpjaGFubmVsX2luZm8gPQorCQkmc2Nhbl9jbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKwkJCWluZGV4KyspIHsKKwkJaWYgKCFjc3Jfcm9hbV9pc192YWxpZF9jaGFubmVsKG1hY19jdHgsCisJCQlwcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpbmRleF0pKSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQkJRkwoInByb2Nlc3MgYSBjaGFubmVsICglZCkgdGhhdCBpcyBpbnZhbGlkIiksCisJCQlwcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpbmRleF0pOworCQkJY29udGludWU7CisJCX0KKwkJY2hhbm5lbF9pbmZvLT5DaGFubmVsTGlzdFtjaGFubmVsX2luZm8tPm51bU9mQ2hhbm5lbHNdID0KKwkJCXByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W2luZGV4XTsKKwkJc2Nhbl9jbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMrKzsKKwl9Cit9CisKKy8qKgorICogY3NyX3NjYW5fZm9yX3NzaWQoKSAtICBGdW5jdGlvbiB1c3VhbGx5IHVzZWQgZm9yIEJTU3MgdGhhdCBzdXBwcmVzc2VzIFNTSUQKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlCisgKiBAcHJvZmlsZTogcG9pbnRlciB0byB0Q3NyUm9hbVByb2ZpbGUKKyAqIEByb2FtX2lkOiB2YXJpYWJsZSByZXByZXNlbnRpbmcgcm9hbSBpZAorICogQG5vdGlmeTogYm9vbGVhbiB2YXJpYWJsZQorICoKKyAqIEZ1bmN0aW9uIGlzIHVzdWFsbHkgdXNlZCBmb3IgQlNTcyB0aGF0IHN1cHByZXNzZXMgU1NJRCBzbyB0aGUgcHJvZmlsZQorICogc2hhbGwgaGF2ZSBvbmUgYW5kIG9ubHkgb25lIFNTSUQuCisgKgorICogUmV0dXJuOiBTdWNjZXNzIC0gQ0RGX1NUQVRVU19TVUNDRVNTLCBGYWlsdXJlIC0gZXJyb3IgbnVtYmVyCisgKi8KK0NERl9TVEFUVVMgY3NyX3NjYW5fZm9yX3NzaWQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdWludDMyX3Qgc2Vzc2lvbl9pZCwKKwkJCXRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSwgdWludDMyX3Qgcm9hbV9pZCwKKwkJCWJvb2wgbm90aWZ5KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCXRTbWVDbWQgKnNjYW5fY21kID0gTlVMTDsKKwl0Q3NyU2NhblJlcXVlc3QgKnNjYW5fcmVxID0gTlVMTDsKKwl1aW50OF90IGluZGV4ID0gMDsKKwl1aW50MzJfdCBudW1fc3NpZCA9IHByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHM7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBuZWlnaGJvcl9yb2FtaW5mbyA9CisJCSZtYWNfY3R4LT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbl9pZF07CisJdENzclNTSURzICpzc2lkcyA9IE5VTEw7CisKKwlzbXNfbG9nKG1hY19jdHgsIExPRzIsIEZMKCJjYWxsZWQiKSk7CisKKwkvKiBGb3IgV0RTLCB3ZSB1c2UgdGhlIGluZGV4IDAuIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGluIHRoZXJlICovCisJaWYgKENTUl9JU19XRFNfU1RBKHByb2ZpbGUpICYmIG51bV9zc2lkKQorCQludW1fc3NpZCA9IDE7CisKKwlpZiAoIShtYWNfY3R4LT5zY2FuLmZTY2FuRW5hYmxlKSAmJiAobnVtX3NzaWQgIT0gMSkpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoImNhbm5vdCBzY2FuIGJlY2F1c2Ugc2NhbkVuYWJsZSAoJWQpIG9yIG51bVNTSUQgKCVkKSBpcyBpbnZhbGlkIiksCisJCQltYWNfY3R4LT5zY2FuLmZTY2FuRW5hYmxlLCBwcm9maWxlLT5TU0lEcy5udW1PZlNTSURzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzY2FuX2NtZCA9IGNzcl9nZXRfY29tbWFuZF9idWZmZXIobWFjX2N0eCk7CisKKwlpZiAoIXNjYW5fY21kKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJmYWlsZWQgdG8gYWxsb2NhdGUgY29tbWFuZCBidWZmZXIiKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJY2RmX21lbV9zZXQoJnNjYW5fY21kLT51LnNjYW5DbWQsIHNpemVvZih0U2NhbkNtZCksIDApOworCXNjYW5fY21kLT51LnNjYW5DbWQucFRvUm9hbVByb2ZpbGUgPQorCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JSb2FtUHJvZmlsZSkpOworCisJaWYgKE5VTEwgPT0gc2Nhbl9jbWQtPnUuc2NhbkNtZC5wVG9Sb2FtUHJvZmlsZSkKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCWVsc2UKKwkJc3RhdHVzID0gY3NyX3JvYW1fY29weV9wcm9maWxlKG1hY19jdHgsCisJCQkJCXNjYW5fY21kLT51LnNjYW5DbWQucFRvUm9hbVByb2ZpbGUsCisJCQkJCXByb2ZpbGUpOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJZ290byBlcnJvcjsKKworCXNjYW5fY21kLT51LnNjYW5DbWQucm9hbUlkID0gcm9hbV9pZDsKKwlzY2FuX2NtZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kU2NhbjsKKwlzY2FuX2NtZC0+c2Vzc2lvbklkID0gKHVpbnQ4X3QpIHNlc3Npb25faWQ7CisJc2Nhbl9jbWQtPnUuc2NhbkNtZC5jYWxsYmFjayA9IE5VTEw7CisJc2Nhbl9jbWQtPnUuc2NhbkNtZC5wQ29udGV4dCA9IE5VTEw7CisJc2Nhbl9jbWQtPnUuc2NhbkNtZC5yZWFzb24gPSBlQ3NyU2NhbkZvclNzaWQ7CisKKwkvKiBsZXQgaXQgd3JhcCBhcm91bmQgKi8KKwl3bWFfZ2V0X3NjYW5faWQoJnNjYW5fY21kLT51LnNjYW5DbWQuc2NhbklEKTsKKwljZGZfbWVtX3NldCgmc2Nhbl9jbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LAorCQkJc2l6ZW9mKHRDc3JTY2FuUmVxdWVzdCksIDApOworCXN0YXR1cyA9IGNkZl9tY190aW1lcl9pbml0KCZzY2FuX2NtZC0+dS5zY2FuQ21kLmNzcl9zY2FuX3RpbWVyLAorCQkJQ0RGX1RJTUVSX1RZUEVfU1csCisJCQljc3Jfc2Nhbl9hY3RpdmVfbGlzdF90aW1lb3V0X2hhbmRsZSwgJnNjYW5fY21kKTsKKwlzY2FuX3JlcSA9ICZzY2FuX2NtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3Q7CisJc2Nhbl9yZXEtPnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKwlzY2FuX3JlcS0+QlNTVHlwZSA9IHByb2ZpbGUtPkJTU1R5cGU7CisJc2Nhbl9yZXEtPnNjYW5faWQgPSBzY2FuX2NtZC0+dS5zY2FuQ21kLnNjYW5JRDsKKwkvKgorCSAqIFRvIGF2b2lkIDExYiByYXRlIGluIHByb2JlIHJlcXVlc3QgU2V0IHAycFNlYXJjaAorCSAqIGZsYWcgYXMgMSBmb3IgUDJQIENsaWVudCBNb2RlCisJICovCisJaWYgKENERl9QMlBfQ0xJRU5UX01PREUgPT0gcHJvZmlsZS0+Y3NyUGVyc29uYSkKKwkJc2Nhbl9yZXEtPnAycFNlYXJjaCA9IDE7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIElFIGZpZWxkICovCisJaWYgKHByb2ZpbGUtPnBBZGRJRVNjYW4pIHsKKwkJc2Nhbl9yZXEtPnBJRUZpZWxkID0KKwkJCWNkZl9tZW1fbWFsbG9jKHByb2ZpbGUtPm5BZGRJRVNjYW5MZW5ndGgpOworCisJCWlmIChOVUxMID09IHNjYW5fcmVxLT5wSUVGaWVsZCkKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZWxzZQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJCWNkZl9tZW1fc2V0KHNjYW5fcmVxLT5wSUVGaWVsZCwKKwkJCQlwcm9maWxlLT5uQWRkSUVTY2FuTGVuZ3RoLCAwKTsKKworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWNkZl9tZW1fY29weShzY2FuX3JlcS0+cElFRmllbGQsCisJCQkJCXByb2ZpbGUtPnBBZGRJRVNjYW4sCisJCQkJCXByb2ZpbGUtPm5BZGRJRVNjYW5MZW5ndGgpOworCQkJc2Nhbl9yZXEtPnVJRUZpZWxkTGVuID0gcHJvZmlsZS0+bkFkZElFU2Nhbkxlbmd0aDsKKwkJfSBlbHNlIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkiTm8gbWVtb3J5IGZvciBzY2FubmluZyBJRSBmaWVsZHMiKTsKKwkJfQorCX0gZWxzZQorCQlzY2FuX3JlcS0+dUlFRmllbGRMZW4gPSAwOworCisJLyoKKwkgKiBGb3Igb25lIGNoYW5uZWwgYmUgZ29vZCBlbnB1Z2ggdGltZSB0byByZWNlaXZlIGJlYWNvbgorCSAqIGF0bGVhc3QKKwkgKi8KKwlpZiAoMSA9PSBwcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzKSB7CisJCWlmIChuZWlnaGJvcl9yb2FtaW5mby0+aGFuZG9mZlJlcUluZm8uc3JjID09CisJCQkJCUZBU1RSRUFTU09DKSB7CisJCQlzY2FuX3JlcS0+bWF4Q2huVGltZSA9CisJCQkJTUFYX0FDVElWRV9TQ0FOX0ZPUl9PTkVfQ0hBTk5FTF9GQVNUUkVBU1NPQzsKKwkJCXNjYW5fcmVxLT5taW5DaG5UaW1lID0KKwkJCQlNSU5fQUNUSVZFX1NDQU5fRk9SX09ORV9DSEFOTkVMX0ZBU1RSRUFTU09DOworCQkJLyogUmVzZXQgdGhpcyB2YWx1ZSAqLworCQkJbmVpZ2hib3Jfcm9hbWluZm8tPmhhbmRvZmZSZXFJbmZvLnNyYyA9IDA7CisJCX0gZWxzZSB7CisJCQlzY2FuX3JlcS0+bWF4Q2huVGltZSA9CisJCQkJCU1BWF9BQ1RJVkVfU0NBTl9GT1JfT05FX0NIQU5ORUw7CisJCQlzY2FuX3JlcS0+bWluQ2huVGltZSA9CisJCQkJCU1JTl9BQ1RJVkVfU0NBTl9GT1JfT05FX0NIQU5ORUw7CisJCX0KKwl9IGVsc2UgeworCQlzY2FuX3JlcS0+bWF4Q2huVGltZSA9CisJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNYXhDaG5UaW1lOworCQlzY2FuX3JlcS0+bWluQ2huVGltZSA9CisJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNaW5DaG5UaW1lOworCX0KKworCWlmIChwcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHMgPT0gMSkKKwkJY2RmX2NvcHlfbWFjYWRkcigmc2Nhbl9yZXEtPmJzc2lkLAorCQkJCXByb2ZpbGUtPkJTU0lEcy5ic3NpZCk7CisJZWxzZQorCQljZGZfc2V0X21hY2FkZHJfYnJvYWRjYXN0KCZzY2FuX3JlcS0+YnNzaWQpOworCisJaWYgKHByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMpIHsKKwkJc2Nhbl9yZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0KKwkJICAgIGNkZl9tZW1fbWFsbG9jKHNpemVvZigqc2Nhbl9yZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSAqCisJCQkJCXByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMpOworCisJCWlmIChOVUxMID09IHNjYW5fcmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCkKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZWxzZQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJCXNjYW5fcmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWNzcl9yb2FtX2lzX2NoYW5uZWxfdmFsaWQobWFjX2N0eCwKKwkJCQlwcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXSk7CisJCQljc3Jfcm9hbV9jb3B5X2NoYW5uZWxsaXN0KG1hY19jdHgsCisJCQkJcHJvZmlsZSwgc2Nhbl9jbWQsIGluZGV4KTsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9IGVsc2UgeworCQlzY2FuX3JlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDA7CisJfQorCisJaWYgKHByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMpIHsKKwkJc2Nhbl9yZXEtPlNTSURzLlNTSURMaXN0ID0KKwkJCWNkZl9tZW1fbWFsbG9jKHByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMgKgorCQkJCQlzaXplb2YodENzclNTSURJbmZvKSk7CisKKwkJaWYgKE5VTEwgPT0gc2Nhbl9yZXEtPlNTSURzLlNTSURMaXN0KQorCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQllbHNlCisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCWdvdG8gZXJyb3I7CisKKwkJc3NpZHMgPSAmc2Nhbl9yZXEtPlNTSURzOworCQlzc2lkcy0+bnVtT2ZTU0lEcyA9ICAxOworCisJCWNkZl9tZW1fY29weShzY2FuX3JlcS0+U1NJRHMuU1NJRExpc3QsCisJCQkJcHJvZmlsZS0+U1NJRHMuU1NJRExpc3QsCisJCQkJc2l6ZW9mKHRDc3JTU0lESW5mbykpOworCX0KKworCS8qIFN0YXJ0IHByb2Nlc3MgdGhlIGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBjc3JfcXVldWVfc21lX2NvbW1hbmQobWFjX2N0eCwgc2Nhbl9jbWQsIGZhbHNlKTsKK2Vycm9yOgorCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIiBmYWlsZWQgdG8gaW5pYXRlIHNjYW4gd2l0aCBzdGF0dXMgPSAlZCIpLCBzdGF0dXMpOworCQlpZiAoc2Nhbl9jbWQpCisJCQljc3JfcmVsZWFzZV9jb21tYW5kX3NjYW4obWFjX2N0eCwgc2Nhbl9jbWQpOworCQlpZiAobm90aWZ5KQorCQkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uX2lkLCBOVUxMLAorCQkJCQlyb2FtX2lkLCBlQ1NSX1JPQU1fRkFJTEVELAorCQkJCQllQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGNzcl9zZXRfY2ZnX3ZhbGlkX2NoYW5uZWxfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwQ2hhbm5lbExpc3QsCisJCQkJICAgIHVpbnQ4X3QgTnVtQ2hhbm5lbHMpCit7CisJdWludDMyX3QgZGF0YUxlbiA9IHNpemVvZih1aW50OF90KSAqIE51bUNoYW5uZWxzOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAiJXM6IGR1bXAgdmFsaWQgY2hhbm5lbCBsaXN0KE51bUNoYW5uZWxzKCVkKSkiLAorCQkgIF9fZnVuY19fLCBOdW1DaGFubmVscyk7CisJQ0RGX1RSQUNFX0hFWF9EVU1QKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIHBDaGFubmVsTGlzdCwgTnVtQ2hhbm5lbHMpOworCWNmZ19zZXRfc3RyKHBNYWMsIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNULCBwQ2hhbm5lbExpc3QsCisJCQlkYXRhTGVuKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIlNjYW4gb2ZmbG9hZCBpcyBlbmFibGVkLCB1cGRhdGUgZGVmYXVsdCBjaGFuIGxpc3QiKTsKKwkvKgorCSAqIGRpc2FibGUgZmNjIGNvbnN0cmFpbnQgc2luY2UgbmV3IGNvdW50cnkgY29kZQorCSAqIGlzIGJlaW5nIHNldAorCSAqLworCXBNYWMtPnNjYW4uZmNjX2NvbnN0cmFpbnQgPSBmYWxzZTsKKwlzdGF0dXMgPSBjc3JfdXBkYXRlX2NoYW5uZWxfbGlzdChwTWFjKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgImZhaWxlZCB0byB1cGRhdGUgdGhlIHN1cHBvcnRlZCBjaGFubmVsIGxpc3QiKTsKKwl9CisJcmV0dXJuOworfQorCisvKgorICogVGhlIFR4IHBvd2VyIGxpbWl0cyBhcmUgc2F2ZWQgaW4gdGhlIGNmZyBmb3IgZnV0dXJlIHVzYWdlLgorICovCit2b2lkIGNzcl9zYXZlX3R4X3Bvd2VyX3RvX2NmZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RGJsTGlua0xpc3QgKnBMaXN0LAorCQkJICAgICAgdWludDMyX3QgY2ZnSWQpCit7CisJdExpc3RFbGVtICpwRW50cnk7CisJdWludDMyX3QgY2JMZW4gPSAwLCBkYXRhTGVuLCB0bXBfbGVuOworCXRDc3JDaGFubmVsUG93ZXJJbmZvICpjaF9zZXQ7CisJdWludDMyX3QgaWR4OworCXRTaXJNYWNDaGFuSW5mbyAqY2hfcHdyX3NldDsKKwl1aW50OF90ICpwQnVmID0gTlVMTDsKKworCS8qIGFsbG9jYXRlIG1heGltdW0gc3BhY2UgZm9yIGFsbCBjaGFubmVscyAqLworCWRhdGFMZW4gPSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4gKiBzaXplb2YodFNpck1hY0NoYW5JbmZvKTsKKwlwQnVmID0gY2RmX21lbV9tYWxsb2MoZGF0YUxlbik7CisJaWYgKHBCdWYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY2RmX21lbV9zZXQocEJ1ZiwgZGF0YUxlbiwgMCk7CisJY2hfcHdyX3NldCA9ICh0U2lyTWFjQ2hhbkluZm8gKikgKHBCdWYpOworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQocExpc3QsIExMX0FDQ0VTU19MT0NLKTsKKwkvKgorCSAqIHdyaXRlIHRoZSB0dXBsZXMgKHN0YXJ0Q2hhbiwgbnVtQ2hhbiwgdHhQb3dlcikgZm9yIGVhY2ggY2hhbm5lbCBmb3VuZAorCSAqIGluIHRoZSBjaGFubmVsIHBvd2VyIGxpc3QuCisJICovCisJd2hpbGUgKHBFbnRyeSkgeworCQljaF9zZXQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzckNoYW5uZWxQb3dlckluZm8sIGxpbmspOworCQlpZiAoMSAhPSBjaF9zZXQtPmludGVyQ2hhbm5lbE9mZnNldCkgeworCQkJLyoKKwkJCSAqIHdlIGtlZXAgdGhlIDVHIGNoYW5uZWwgc2V0cyBpbnRlcm5hbGx5IHdpdGggYW4KKwkJCSAqIGludGVyY2hhbm5lbCBvZmZzZXQgb2YgNC4gRXhwYW5kIHRoZXNlIHRvIHRoZSByaWdodAorCQkJICogZm9ybWF0LiAoaW50ZXIgY2hhbm5lbCBvZmZzZXQgb2YgMSBpcyB0aGUgb25seSBvcHRpb24KKwkJCSAqIGZvciB0aGUgdHJpcGxldHMgdGhhdCAxMWQgYWR2ZXJ0aXNlcy4KKwkJCSAqLworCQkJdG1wX2xlbiA9IGNiTGVuICsgKGNoX3NldC0+bnVtQ2hhbm5lbHMgKgorCQkJCQkJc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbykpOworCQkJaWYgKHRtcF9sZW4gPj0gZGF0YUxlbikgeworCQkJCS8qCisJCQkJICogZXhwYW5kaW5nIHRoaXMgZW50cnkgd2lsbCBvdmVyZmxvdyBvdXIKKwkJCQkgKiBhbGxvY2F0aW9uCisJCQkJICovCisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQlGTCgiQnVmZmVyIG92ZXJmbG93LCBzdGFydCAlZCwgbnVtICVkLCBvZmZzZXQgJWQiKSwKKwkJCQkJY2hfc2V0LT5maXJzdENoYW5uZWwsCisJCQkJCWNoX3NldC0+bnVtQ2hhbm5lbHMsCisJCQkJCWNoX3NldC0+aW50ZXJDaGFubmVsT2Zmc2V0KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZm9yIChpZHggPSAwOyBpZHggPCBjaF9zZXQtPm51bUNoYW5uZWxzOyBpZHgrKykgeworCQkJCWNoX3B3cl9zZXQtPmZpcnN0Q2hhbk51bSA9ICh0U2lyTWFjQ2hhbk51bSkKKwkJCQkJKGNoX3NldC0+Zmlyc3RDaGFubmVsICsgKGlkeCAqCisJCQkJCQljaF9zZXQtPmludGVyQ2hhbm5lbE9mZnNldCkpOworCQkJCXNtc19sb2cocE1hYywgTE9HMywKKwkJCQkJRkwoIlNldHRpbmcgQ2hhbm5lbCBOdW1iZXIgJWQiKSwKKwkJCQkJY2hfcHdyX3NldC0+Zmlyc3RDaGFuTnVtKTsKKwkJCQljaF9wd3Jfc2V0LT5udW1DaGFubmVscyA9IDE7CisJCQkJY2hfcHdyX3NldC0+bWF4VHhQb3dlciA9CisJCQkJCUNERl9NSU4oY2hfc2V0LT50eFBvd2VyLAorCQkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwKTsKKwkJCQlzbXNfbG9nKHBNYWMsIExPRzMsCisJCQkJCUZMKCJTZXR0aW5nIE1heCBUcmFuc21pdCBQb3dlciAlZCIpLAorCQkJCQljaF9wd3Jfc2V0LT5tYXhUeFBvd2VyKTsKKwkJCQljYkxlbiArPSBzaXplb2YodFNpck1hY0NoYW5JbmZvKTsKKwkJCQljaF9wd3Jfc2V0Kys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY2JMZW4gPj0gZGF0YUxlbikgeworCQkJCS8qIHRoaXMgZW50cnkgd2lsbCBvdmVyZmxvdyBvdXIgYWxsb2NhdGlvbiAqLworCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwoIkJ1ZmZlciBvdmVyZmxvdywgc3RhcnQgJWQsIG51bSAlZCwgb2Zmc2V0ICVkIiksCisJCQkJCWNoX3NldC0+Zmlyc3RDaGFubmVsLAorCQkJCQljaF9zZXQtPm51bUNoYW5uZWxzLAorCQkJCQljaF9zZXQtPmludGVyQ2hhbm5lbE9mZnNldCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljaF9wd3Jfc2V0LT5maXJzdENoYW5OdW0gPSBjaF9zZXQtPmZpcnN0Q2hhbm5lbDsKKwkJCXNtc19sb2cocE1hYywgTE9HMywgRkwoIlNldHRpbmcgQ2hhbm5lbCBOdW1iZXIgJWQiKSwKKwkJCQljaF9wd3Jfc2V0LT5maXJzdENoYW5OdW0pOworCQkJY2hfcHdyX3NldC0+bnVtQ2hhbm5lbHMgPSBjaF9zZXQtPm51bUNoYW5uZWxzOworCQkJY2hfcHdyX3NldC0+bWF4VHhQb3dlciA9IENERl9NSU4oY2hfc2V0LT50eFBvd2VyLAorCQkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwKTsKKwkJCXNtc19sb2cocE1hYywgTE9HMywKKwkJCQlGTCgiU2V0dGluZyBNYXggVHggUG93ZXIgJWQsIG5UeFBvd2VyICVkIiksCisJCQkJY2hfcHdyX3NldC0+bWF4VHhQb3dlciwKKwkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwKTsKKwkJCWNiTGVuICs9IHNpemVvZih0U2lyTWFjQ2hhbkluZm8pOworCQkJY2hfcHdyX3NldCsrOworCQl9CisJCXBFbnRyeSA9IGNzcl9sbF9uZXh0KHBMaXN0LCBwRW50cnksIExMX0FDQ0VTU19MT0NLKTsKKwl9CisJaWYgKGNiTGVuKQorCQljZmdfc2V0X3N0cihwTWFjLCBjZmdJZCwgKHVpbnQ4X3QgKikgcEJ1ZiwgY2JMZW4pOworCisJY2RmX21lbV9mcmVlKHBCdWYpOworfQorCit2b2lkIGNzcl9zZXRfY2ZnX2NvdW50cnlfY29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpjb3VudHJ5Q29kZSkKK3sKKwl1aW50OF90IGNjW1dOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTl07CisJLyogdl9SRUdET01BSU5fdCBEb21haW5JZCAqLworCisJc21zX2xvZyhwTWFjLCBMT0czLCBGTCgiU2V0dGluZyBDb3VudHJ5IENvZGUgaW4gQ2ZnICVzIiksIGNvdW50cnlDb2RlKTsKKwljZGZfbWVtX2NvcHkoY2MsIGNvdW50cnlDb2RlLCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCisJLyoKKwkqIGRvbid0IHByb2dyYW0gdGhlIGJvZ3VzIGNvdW50cnkgY29kZXMgdGhhdCB3ZSBjcmVhdGVkIGZvciBLb3JlYSBpbiB0aGUKKwkqIE1BQy4gaWYgd2Ugc2VlIHRoZSBib2d1cyBjb3VudHJ5IGNvZGVzLCBwcm9ncmFtIHRoZSBNQUMgd2l0aCB0aGUgcmlnaHQKKwkqIGNvdW50cnkgY29kZS4KKwkqLworCWlmICgoJ0snID09IGNvdW50cnlDb2RlWzBdICYmICcxJyA9PSBjb3VudHJ5Q29kZVsxXSkgfHwKKwkgICAgKCdLJyA9PSBjb3VudHJ5Q29kZVswXSAmJiAnMicgPT0gY291bnRyeUNvZGVbMV0pIHx8CisJICAgICgnSycgPT0gY291bnRyeUNvZGVbMF0gJiYgJzMnID09IGNvdW50cnlDb2RlWzFdKSB8fAorCSAgICAoJ0snID09IGNvdW50cnlDb2RlWzBdICYmICc0JyA9PSBjb3VudHJ5Q29kZVsxXSkpIHsKKwkJLyoKKwkJICogcmVwbGFjZSB0aGUgYWx0ZXJuYXRlIEtvcmVhIGNvdW50cnkgY29kZXMsICdLMScsICdLMicsIC4uCisJCSAqIHdpdGggJ0tSJyBmb3IgS29yZWEKKwkJICovCisJCWNjWzFdID0gJ1InOworCX0KKwljZmdfc2V0X3N0cihwTWFjLCBXTklfQ0ZHX0NPVU5UUllfQ09ERSwgY2MsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTik7CisKKwkvKgorCSAqIE5lZWQgdG8gbGV0IEhBTFBIWSBrbm93IGFib3V0IHRoZSBjdXJyZW50IGRvbWFpbiBzbyBpdCBjYW4gYXBwbHkgc29tZQorCSAqIGRvbWFpbi1zcGVjaWZpYyBzZXR0aW5ncyAoVFggZmlsdGVyLi4uKQorCSAqLworCS8qCisJaWYoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9nZXRfcmVndWxhdG9yeV9kb21haW5fZm9yX2NvdW50cnkoCisJCXBNYWMsIGNjLCAmRG9tYWluSWQpKSkgeworCQloYWxQaHlTZXRSZWdEb21haW4ocE1hYywgRG9tYWluSWQpOworCX0gKi8KK30KKworQ0RGX1NUQVRVUyBjc3JfZ2V0X2NvdW50cnlfY29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwQnVmLAorCQkJCXVpbnQ4X3QgKnBiTGVuKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCXVpbnQzMl90IGxlbjsKKworCWlmIChwQnVmICYmIHBiTGVuICYmICgqcGJMZW4gPj0gV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKSkgeworCQlsZW4gPSAqcGJMZW47CisJCXN0YXR1cyA9IHdsYW5fY2ZnX2dldF9zdHIocE1hYywgV05JX0NGR19DT1VOVFJZX0NPREUsIHBCdWYsICZsZW4pOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCSpwYkxlbiA9ICh1aW50OF90KSBsZW47CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGNzcl9zZXRfY2ZnX3NjYW5fY29udHJvbF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKmNvdW50cnlDb2RlLAorCQkJCSAgIHRDc3JDaGFubmVsICpwQ2hhbm5lbExpc3QpCit7CisJdWludDhfdCBpLCBqOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwl1aW50OF90ICpwQ29udHJvbExpc3QgPSBOVUxMOworCXVpbnQzMl90IGxlbiA9IFdOSV9DRkdfU0NBTl9DT05UUk9MX0xJU1RfTEVOOworCisJcENvbnRyb2xMaXN0ID0gY2RmX21lbV9tYWxsb2MoV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVF9MRU4pOworCWlmIChwQ29udHJvbExpc3QgIT0gTlVMTCkgeworCQljZGZfbWVtX3NldCgodm9pZCAqKXBDb250cm9sTGlzdCwgV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVF9MRU4sCisJCQkgICAgMCk7CisJCWlmIChJU19TSVJfU1RBVFVTX1NVQ0NFU1Mod2xhbl9jZmdfZ2V0X3N0cihwTWFjLAorCQkJCQlXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNULAorCQkJCQlwQ29udHJvbExpc3QsICZsZW4pKSkgeworCQkJZm9yIChpID0gMDsgaSA8IHBDaGFubmVsTGlzdC0+bnVtQ2hhbm5lbHM7IGkrKykgeworCQkJCWZvciAoaiA9IDA7IGogPCBsZW47IGogKz0gMikgeworCQkJCQlpZiAocENvbnRyb2xMaXN0W2pdID09CisJCQkJCSAgICBwQ2hhbm5lbExpc3QtPmNoYW5uZWxMaXN0W2ldKSB7CisJCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChmb3VuZCkgeworCQkJCQkvKiBpbnNlcnQgYSBwYWlyKGNoYW5uZWwjLCBmbGFnKSAqLworCQkJCQlwQ29udHJvbExpc3RbaiArIDFdID0KKwkJCQkJCWNzcl9nZXRfc2Nhbl90eXBlKHBNYWMsCisJCQkJCQkJCSAgcENvbnRyb2xMaXN0W2pdKTsKKwkJCQkJZm91bmQgPSBmYWxzZTsgIC8qIHJlc2V0IHRoZSBmbGFnICovCisJCQkJfQorCisJCQl9CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiBkdW1wIHNjYW4gY29udHJvbCBsaXN0IiwgX19mdW5jX18pOworCQkJQ0RGX1RSQUNFX0hFWF9EVU1QKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgICBDREZfVFJBQ0VfTEVWRUxfSU5GTywgcENvbnRyb2xMaXN0LAorCQkJCQkgICBsZW4pOworCisJCQljZmdfc2V0X3N0cihwTWFjLCBXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNULAorCQkJCQlwQ29udHJvbExpc3QsIGxlbik7CisJCX0gLyogU3VjY2Vzc2Z1bGx5IGdldHRpbmcgc2NhbiBjb250cm9sIGxpc3QgKi8KKwkJY2RmX21lbV9mcmVlKHBDb250cm9sTGlzdCk7CisJfSAvKiBBbGxvY2F0ZU1lbW9yeSAqLworfQorCitDREZfU1RBVFVTIGNzcl9zY2FuX2Fib3J0X21hY19zY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgIGVDc3JBYm9ydFJlYXNvbiByZWFzb24pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlwTWFjLT5zY2FuLmZEcm9wU2NhbkNtZCA9IHRydWU7CisJY3NyX3JlbW92ZV9jbWRfd2l0aF9zZXNzaW9uX2lkX2Zyb21fcGVuZGluZ19saXN0KHBNYWMsCisJCQlzZXNzaW9uSWQsICZwTWFjLT5zbWUuc21lU2NhbkNtZFBlbmRpbmdMaXN0LAorCQkJZVNtZUNvbW1hbmRTY2FuKTsKKwlwTWFjLT5zY2FuLmZEcm9wU2NhbkNtZCA9IGZhbHNlOworCWNzcl9hYm9ydF9zY2FuX2Zyb21fYWN0aXZlX2xpc3QocE1hYywKKwkJCSAmcE1hYy0+c21lLnNtZVNjYW5DbWRBY3RpdmVMaXN0LCBzZXNzaW9uSWQsCisJCQllU21lQ29tbWFuZFNjYW4sIHJlYXNvbik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGNzcl9yZW1vdmVfY21kX3dpdGhfc2Vzc2lvbl9pZF9mcm9tX3BlbmRpbmdfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCQl0RGJsTGlua0xpc3QgKnBMaXN0LAorCQkJCQkJZVNtZUNvbW1hbmRUeXBlIGNvbW1hbmRUeXBlKQoreworCXREYmxMaW5rTGlzdCBsb2NhbExpc3Q7CisJdExpc3RFbGVtICpwRW50cnk7CisJdFNtZUNtZCAqcENvbW1hbmQ7CisJdExpc3RFbGVtICpwRW50cnlUb1JlbW92ZTsKKworCWNkZl9tZW1femVybygmbG9jYWxMaXN0LCBzaXplb2YodERibExpbmtMaXN0KSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY3NyX2xsX29wZW4ocE1hYy0+aEhkZCwgJmxvY2FsTGlzdCkpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoImZhaWxlZCB0byBvcGVuIGxpc3QiKSk7CisJCXJldHVybjsKKwl9CisKKwljc3JfbGxfbG9jayhwTGlzdCk7CisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZChwTGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisJaWYgKHBFbnRyeSkgeworCQkvKgorCQkgKiBIYXZlIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb29wIGJhY2sgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsCisJCSAqIHdoaWNoIHdpbGwgaGFwcGVuIGlmIHRoZSBlbnRyeSBpcyBOT1Qgb24gdGhlIGxpc3QKKwkJICovCisJCXdoaWxlIChwRW50cnkpIHsKKwkJCXBFbnRyeVRvUmVtb3ZlID0gcEVudHJ5OworCQkJcEVudHJ5ID0gY3NyX2xsX25leHQocExpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyk7CisJCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5VG9SZW1vdmUsIHRTbWVDbWQsIExpbmspOworCisJCQlpZiAoISgocENvbW1hbmQtPmNvbW1hbmQgPT0gY29tbWFuZFR5cGUpICYmCisJCQkgICAgKHBDb21tYW5kLT5zZXNzaW9uSWQgPT0gc2Vzc2lvbklkKSkpCisJCQkJY29udGludWU7CisJCQkvKiBSZW1vdmUgdGhhdCBlbnRyeSBvbmx5ICovCisJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeShwTGlzdCwgcEVudHJ5VG9SZW1vdmUsCisJCQkJCQlMTF9BQ0NFU1NfTk9MT0NLKSkgeworCQkJCWNzcl9sbF9pbnNlcnRfdGFpbCgmbG9jYWxMaXN0LCBwRW50cnlUb1JlbW92ZSwKKwkJCQkJCSAgIExMX0FDQ0VTU19OT0xPQ0spOworCQkJfQorCQl9CisJfQorCWNzcl9sbF91bmxvY2socExpc3QpOworCisJd2hpbGUgKChwRW50cnkgPSBjc3JfbGxfcmVtb3ZlX2hlYWQoJmxvY2FsTGlzdCwgTExfQUNDRVNTX05PTE9DSykpKSB7CisJCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJTZW5kaW5nIGFib3J0IGZvciBzY2FuIGNvbW1hbmQgSUQgJWQiKSwKKwkJCXBDb21tYW5kLT51LnNjYW5DbWQuc2NhbklEKTsKKwkJY3NyX2Fib3J0X2NvbW1hbmQocE1hYywgcENvbW1hbmQsIGZhbHNlKTsKKwl9CisKKwljc3JfbGxfY2xvc2UoJmxvY2FsTGlzdCk7Cit9CisKK3ZvaWQgY3NyX3JlbW92ZV9jbWRfZnJvbV9wZW5kaW5nX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICB0RGJsTGlua0xpc3QgKnBMaXN0LAorCQkJCSAgICAgIGVTbWVDb21tYW5kVHlwZSBjb21tYW5kVHlwZSkKK3sKKwl0RGJsTGlua0xpc3QgbG9jYWxMaXN0OworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRTbWVDbWQgKnBDb21tYW5kOworCXRMaXN0RWxlbSAqcEVudHJ5VG9SZW1vdmU7CisKKwljZGZfbWVtX3plcm8oJmxvY2FsTGlzdCwgc2l6ZW9mKHREYmxMaW5rTGlzdCkpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9sbF9vcGVuKHBNYWMtPmhIZGQsICZsb2NhbExpc3QpKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbGVkIHRvIG9wZW4gbGlzdCIpKTsKKwkJcmV0dXJuOworCX0KKworCWNzcl9sbF9sb2NrKHBMaXN0KTsKKwlpZiAoIWNzcl9sbF9pc19saXN0X2VtcHR5KHBMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKSkgeworCQlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKHBMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJLyoKKwkJICogSGF2ZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgbG9vcCBiYWNrIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LAorCQkgKiB3aGljaCB3aWxsIGhhcHBlbiBpZiB0aGUgZW50cnkgaXMgTk9UIG9uIHRoZSBsaXN0Li4uCisJCSAqLworCQl3aGlsZSAocEVudHJ5KSB7CisJCQlwRW50cnlUb1JlbW92ZSA9IHBFbnRyeTsKKwkJCXBFbnRyeSA9IGNzcl9sbF9uZXh0KHBMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spOworCQkJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeVRvUmVtb3ZlLCB0U21lQ21kLCBMaW5rKTsKKwkJCS8qIFJlbW92ZSB0aGF0IGVudHJ5IG9ubHkgdGhhdCBtYXRjaGVzIGNtZCB0eXBlICovCisJCQlpZiAocENvbW1hbmQtPmNvbW1hbmQgPT0gY29tbWFuZFR5cGUgJiYKKwkJCSAgICBjc3JfbGxfcmVtb3ZlX2VudHJ5KHBMaXN0LCBwRW50cnlUb1JlbW92ZSwKKwkJCQkJCUxMX0FDQ0VTU19OT0xPQ0spKSB7CisJCQkJY3NyX2xsX2luc2VydF90YWlsKCZsb2NhbExpc3QsIHBFbnRyeVRvUmVtb3ZlLAorCQkJCQkJICAgTExfQUNDRVNTX05PTE9DSyk7CisJCQl9CisJCX0KKwl9CisJY3NyX2xsX3VubG9jayhwTGlzdCk7CisKKwl3aGlsZSAoKHBFbnRyeSA9IGNzcl9sbF9yZW1vdmVfaGVhZCgmbG9jYWxMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKSkpIHsKKwkJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisJCWNzcl9hYm9ydF9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCBmYWxzZSk7CisJfQorCWNzcl9sbF9jbG9zZSgmbG9jYWxMaXN0KTsKKworfQorCitDREZfU1RBVFVTIGNzcl9zY2FuX2Fib3J0X3NjYW5fZm9yX3NzaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJcE1hYy0+c2Nhbi5mRHJvcFNjYW5DbWQgPSB0cnVlOworCWNzcl9yZW1vdmVfc2Nhbl9mb3Jfc3NpZF9mcm9tX3BlbmRpbmdfbGlzdChwTWFjLAorCQkJJnBNYWMtPnNtZS5zbWVTY2FuQ21kUGVuZGluZ0xpc3QsIHNlc3Npb25JZCk7CisJcE1hYy0+c2Nhbi5mRHJvcFNjYW5DbWQgPSBmYWxzZTsKKwljc3JfYWJvcnRfc2Nhbl9mcm9tX2FjdGl2ZV9saXN0KHBNYWMsICZwTWFjLT5zbWUuc21lU2NhbkNtZEFjdGl2ZUxpc3QsCisJCXNlc3Npb25JZCwgZVNtZUNvbW1hbmRTY2FuLCBlQ1NSX1NDQU5fQUJPUlRfU1NJRF9PTkxZKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGNzcl9yZW1vdmVfc2Nhbl9mb3Jfc3NpZF9mcm9tX3BlbmRpbmdfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdERibExpbmtMaXN0ICpwTGlzdCwKKwkJCQkJCXVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwl0RGJsTGlua0xpc3QgbG9jYWxMaXN0OworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRTbWVDbWQgKnBDb21tYW5kOworCXRMaXN0RWxlbSAqcEVudHJ5VG9SZW1vdmU7CisKKwljZGZfbWVtX3plcm8oJmxvY2FsTGlzdCwgc2l6ZW9mKHREYmxMaW5rTGlzdCkpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9sbF9vcGVuKHBNYWMtPmhIZGQsICZsb2NhbExpc3QpKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbGVkIHRvIG9wZW4gbGlzdCIpKTsKKwkJcmV0dXJuOworCX0KKwljc3JfbGxfbG9jayhwTGlzdCk7CisJaWYgKCFjc3JfbGxfaXNfbGlzdF9lbXB0eShwTGlzdCwgTExfQUNDRVNTX05PTE9DSykpIHsKKwkJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZChwTGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisJCS8qCisJCSAqIEhhdmUgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGxvb3AgYmFjayB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwKKwkJICogd2hpY2ggd2lsbCBoYXBwZW4gaWYgdGhlIGVudHJ5IGlzIE5PVCBvbiB0aGUgbGlzdC4uLgorCQkgKi8KKwkJd2hpbGUgKHBFbnRyeSkgeworCQkJcEVudHJ5VG9SZW1vdmUgPSBwRW50cnk7CisJCQlwRW50cnkgPSBjc3JfbGxfbmV4dChwTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCXBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnlUb1JlbW92ZSwgdFNtZUNtZCwgTGluayk7CisKKwkJCWlmICghKChlU21lQ29tbWFuZFNjYW4gPT0gcENvbW1hbmQtPmNvbW1hbmQpICYmCisJCQkgICAgKHNlc3Npb25JZCA9PSBwQ29tbWFuZC0+c2Vzc2lvbklkKSkpCisJCQkJY29udGludWU7CisJCQlpZiAoZUNzclNjYW5Gb3JTc2lkICE9IHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uKQorCQkJCWNvbnRpbnVlOworCQkJLyogUmVtb3ZlIHRoYXQgZW50cnkgb25seSAqLworCQkJaWYgKGNzcl9sbF9yZW1vdmVfZW50cnkocExpc3QsIHBFbnRyeVRvUmVtb3ZlLAorCQkJCQkJTExfQUNDRVNTX05PTE9DSykpIHsKKwkJCQljc3JfbGxfaW5zZXJ0X3RhaWwoJmxvY2FsTGlzdCwgcEVudHJ5VG9SZW1vdmUsCisJCQkJCQkgICBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCX0KKwkJfQorCX0KKwljc3JfbGxfdW5sb2NrKHBMaXN0KTsKKwl3aGlsZSAoKHBFbnRyeSA9IGNzcl9sbF9yZW1vdmVfaGVhZCgmbG9jYWxMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKSkpIHsKKwkJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisJCWNzcl9hYm9ydF9jb21tYW5kKHBNYWMsIHBDb21tYW5kLCBmYWxzZSk7CisJfQorCWNzcl9sbF9jbG9zZSgmbG9jYWxMaXN0KTsKK30KKworCisvKioKKyAqIGNzcl9zZW5kX3NjYW5fYWJvcnQoKSAtICBTZW5kcyBzY2FuIGFib3J0IGNvbW1hbmQgdG8gZmlybXdhcmUKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlCisgKiBAc2Vzc2lvbl9pZDogQ1NSIHNlc3Npb24gaWRlbnRpZmljYXRpb24KKyAqIEBzY2FuX2lkOiBzY2FuIGlkZW50aWZpZXIKKyAqCisgKiAuU2VuZHMgc2NhbiBhYm9ydCBjb21tYW5kIHRvIGZpcm13YXJlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGNzcl9zZW5kX3NjYW5fYWJvcnQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwl1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBzY2FuX2lkKQoreworCXRTaXJTbWVTY2FuQWJvcnRSZXEgKm1zZzsKKwl1aW50MTZfdCBtc2dfbGVuOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJbXNnX2xlbiA9ICh1aW50MTZfdCkoc2l6ZW9mKHRTaXJTbWVTY2FuQWJvcnRSZXEpKTsKKwltc2cgPSBjZGZfbWVtX21hbGxvYyhtc2dfbGVuKTsKKwlpZiAoTlVMTCA9PSBtc2cpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBhbGxvYyBtZW1vcnkgZm9yIFNtZVNjYW5BYm9ydFJlcSIpKTsKKwkJcmV0dXJuOworCX0KKwljZGZfbWVtX3plcm8oKHZvaWQgKiltc2csIG1zZ19sZW4pOworCW1zZy0+dHlwZSA9IGVXTklfU01FX1NDQU5fQUJPUlRfSU5EOworCW1zZy0+bXNnTGVuID0gbXNnX2xlbjsKKwltc2ctPnNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisJbXNnLT5zY2FuX2lkID0gc2Nhbl9pZDsKKwlzbXNfbG9nKG1hY19jdHgsIExPRzIsCisJCUZMKCJBYm9ydCBzY2FuIHNlbnQgdG8gRmlybXdhcmUgc2Nhbl9pZCAlZCBzZXNzaW9uICVkIiksCisJCXNjYW5faWQsIHNlc3Npb25faWQpOworCXN0YXR1cyA9IGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKG1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQljZGZfbWVtX2ZyZWUobXNnKTsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwoIkZhaWxlZCB0byBzZW5kIGFib3J0IHNjYW4uc2Nhbl9pZCAlZCBzZXNzaW9uICVkIiksCisJCQlzY2FuX2lkLCBzZXNzaW9uX2lkKTsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIGNzcl9hYm9ydF9zY2FuX2Zyb21fYWN0aXZlX2xpc3QoKSAtICBSZW1vdmUgU2NhbiBjb21tYW5kIGZyb20gYWN0aXZlIGxpc3QKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlCisgKiBAbGlzdDogcG9pbnRlciB0byBzY2FuIGFjdGl2ZSBsaXN0CisgKiBAc2Vzc2lvbl9pZDogQ1NSIHNlc3Npb24gaWRlbnRpZmljYXRpb24KKyAqIEBzY2FuX2NtZF90eXBlOiBzY2FuIGNvbW1hbmQgdHlwZQorICogQGFib3J0X3JlYXNvbjogYWJvcnQgcmVhc29uCisgKgorICogLlJlbW92ZSBTY2FuIGNvbW1hbmQgZnJvbSBhY3RpdmUgc2NhbiBsaXN0CisgKgorICogUmV0dXJuOiBTdWNjZXNzIC0gQ0RGX1NUQVRVU19TVUNDRVNTLCBGYWlsdXJlIC0gZXJyb3IgbnVtYmVyCisgKi8KK0NERl9TVEFUVVMgY3NyX2Fib3J0X3NjYW5fZnJvbV9hY3RpdmVfbGlzdCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl0RGJsTGlua0xpc3QgKmxpc3QsIHVpbnQzMl90IHNlc3Npb25faWQsCisJCWVTbWVDb21tYW5kVHlwZSBzY2FuX2NtZF90eXBlLCBlQ3NyQWJvcnRSZWFzb24gYWJvcnRfcmVhc29uKQoreworCXRMaXN0RWxlbSAqZW50cnk7CisJdFNtZUNtZCAqY21kOworCXRMaXN0RWxlbSAqZW50cnlfcmVtb3ZlOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJY3NyX2xsX2xvY2sobGlzdCk7CisJaWYgKCFjc3JfbGxfaXNfbGlzdF9lbXB0eShsaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKSkgeworCQllbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQobGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisJCXdoaWxlIChlbnRyeSkgeworCQkJZW50cnlfcmVtb3ZlID0gZW50cnk7CisJCQllbnRyeSA9IGNzcl9sbF9uZXh0KGxpc3QsIGVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKwkJCWNtZCA9IEdFVF9CQVNFX0FERFIoZW50cnlfcmVtb3ZlLCB0U21lQ21kLCBMaW5rKTsKKworCQkJLyogU2tpcCBpZiBjb21tYW5kIGFuZCBzZXNzaW9uIGlkIG5vdCBtYXRjaGVkICovCisJCQlpZiAoISgoc2Nhbl9jbWRfdHlwZSA9PSBjbWQtPmNvbW1hbmQpICYmCisJCQkJKHNlc3Npb25faWQgPT0gY21kLT5zZXNzaW9uSWQpKSkKKwkJCQljb250aW51ZTsKKwkJCS8qc2tpcCBpZiBhYm9ydCByZWFzb24gaXMgZm9yIFNTSUQqLworCQkJaWYgKChhYm9ydF9yZWFzb24gPT0gZUNTUl9TQ0FOX0FCT1JUX1NTSURfT05MWSkgJiYKKwkJCQkoZUNzclNjYW5Gb3JTc2lkICE9IGNtZC0+dS5zY2FuQ21kLnJlYXNvbikpCisJCQkJCWNvbnRpbnVlOworCQkJaWYgKGFib3J0X3JlYXNvbiA9PSBlQ1NSX1NDQU5fQUJPUlRfRFVFX1RPX0JBTkRfQ0hBTkdFKQorCQkJCWNtZC0+dS5zY2FuQ21kLmFib3J0U2NhbkR1ZVRvQmFuZENoYW5nZSA9CisJCQkJCXRydWU7CisJCQljc3Jfc2VuZF9zY2FuX2Fib3J0KG1hY19jdHgsIGNtZC0+c2Vzc2lvbklkLAorCQkJCQkJY21kLT51LnNjYW5DbWQuc2NhbklEKTsKKwkJfQorCX0KKwljc3JfbGxfdW5sb2NrKGxpc3QpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCitDREZfU1RBVFVTIGNzcl9zY2FuX2Fib3J0X21hY19zY2FuX25vdF9mb3JfY29ubmVjdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgdWludDhfdCBzZXNzaW9uSWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaWYgKCFjc3JfaXNfc2Nhbl9mb3Jfcm9hbV9jb21tYW5kX2FjdGl2ZShwTWFjKSkgeworCQkvKgorCQkgKiBPbmx5IGFib3J0IHRoZSBzY2FuIGlmIGl0IGlzIG5vdCB1c2VkIGZvciBvdGhlciByb2FtL2Nvbm5lY3QKKwkJICogcHVycG9zZQorCQkgKi8KKwkJc3RhdHVzID0gY3NyX3NjYW5fYWJvcnRfbWFjX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJIGVDU1JfU0NBTl9BQk9SVF9ERUZBVUxUKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KK2Jvb2wgY3NyX3JvYW1faXNfdmFsaWRfY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNoYW5uZWwpCit7CisJYm9vbCBmVmFsaWQgPSBmYWxzZTsKKwl1aW50MzJfdCBpZHhfdmFsaWRfY2g7CisJdWludDMyX3QgbGVuID0gcE1hYy0+cm9hbS5udW1WYWxpZENoYW5uZWxzOworCisJZm9yIChpZHhfdmFsaWRfY2ggPSAwOyAoaWR4X3ZhbGlkX2NoIDwgbGVuKTsgaWR4X3ZhbGlkX2NoKyspIHsKKwkJaWYgKGNoYW5uZWwgPT0gcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0W2lkeF92YWxpZF9jaF0pIHsKKwkJCWZWYWxpZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gZlZhbGlkOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCitDREZfU1RBVFVTIGNzcl9zY2FuX3NhdmVfcHJlZmVycmVkX25ldHdvcmtfZm91bmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSB0U2lyUHJlZk5ldHdvcmtGb3VuZEluZCAqCisJCQkJCQkgcFByZWZOZXR3b3JrRm91bmRJbmQpCit7CisJdWludDMyX3QgdUxlbiA9IDA7CisJdHBTaXJQcm9iZVJlc3BCZWFjb24gcGFyc2VkX2ZybTsKKwl0Q3NyU2NhblJlc3VsdCAqcFNjYW5SZXN1bHQgPSBOVUxMOworCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyID0gTlVMTDsKKwlib29sIGZEdXBCc3M7CisJdERvdDExZkJlYWNvbklFcyAqbG9jYWxfaWUgPSBOVUxMOworCXRBbmlTU0lEIHRtcFNzaWQ7CisJdl9USU1FX3QgdGltZXIgPSAwOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJdHBTaXJNYWNNZ210SGRyIG1hY0hlYWRlciA9CisJCSh0cFNpck1hY01nbXRIZHIpIHBQcmVmTmV0d29ya0ZvdW5kSW5kLT5kYXRhOworCXBhcnNlZF9mcm0gPQorCSAgICAodHBTaXJQcm9iZVJlc3BCZWFjb24pIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyUHJvYmVSZXNwQmVhY29uKSk7CisKKwlpZiAoTlVMTCA9PSBwYXJzZWRfZnJtKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoImZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmcmFtZSIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJaWYgKHBQcmVmTmV0d29ya0ZvdW5kSW5kLT5mcmFtZUxlbmd0aCA8PSBTSVJfTUFDX0hEUl9MRU5fM0EpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIkluY29ycmVjdCBsZW4oJWQpIiksCisJCQlwUHJlZk5ldHdvcmtGb3VuZEluZC0+ZnJhbWVMZW5ndGgpOworCQljZGZfbWVtX2ZyZWUocGFyc2VkX2ZybSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJaWYgKHNpcl9jb252ZXJ0X3Byb2JlX2ZyYW1lMl9zdHJ1Y3QocE1hYywKKwkJJnBQcmVmTmV0d29ya0ZvdW5kSW5kLT5kYXRhW1NJUl9NQUNfSERSX0xFTl8zQV0sCisJCXBQcmVmTmV0d29ya0ZvdW5kSW5kLT5mcmFtZUxlbmd0aCAtIFNJUl9NQUNfSERSX0xFTl8zQSwKKwkJcGFyc2VkX2ZybSkgIT0gZVNJUl9TVUNDRVNTCisJICAgIHx8ICFwYXJzZWRfZnJtLT5zc2lkUHJlc2VudCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJQYXJzZSBlcnJvciBQcm9iZVJlc3BvbnNlLCBsZW5ndGg9JWQiKSwKKwkJCXBQcmVmTmV0d29ya0ZvdW5kSW5kLT5mcmFtZUxlbmd0aCk7CisJCWNkZl9tZW1fZnJlZShwYXJzZWRfZnJtKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwkvKiAyNCBieXRlIE1BQyBoZWFkZXIgYW5kIDEyIGJ5dGUgdG8gc3NpZCBJRSAqLworCWlmIChwUHJlZk5ldHdvcmtGb3VuZEluZC0+ZnJhbWVMZW5ndGggPgorCSAgICAoU0lSX01BQ19IRFJfTEVOXzNBICsgU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VUKSkgeworCQl1TGVuID0gcFByZWZOZXR3b3JrRm91bmRJbmQtPmZyYW1lTGVuZ3RoIC0KKwkJICAgICAgIChTSVJfTUFDX0hEUl9MRU5fM0EgKyBTSVJfTUFDX0JfUFJfU1NJRF9PRkZTRVQpOworCX0KKwlwU2NhblJlc3VsdCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0Q3NyU2NhblJlc3VsdCkgKyB1TGVuKTsKKwlpZiAoTlVMTCA9PSBwU2NhblJlc3VsdCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJmYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZnJhbWUiKSk7CisJCWNkZl9tZW1fZnJlZShwYXJzZWRfZnJtKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJY2RmX21lbV9zZXQocFNjYW5SZXN1bHQsIHNpemVvZih0Q3NyU2NhblJlc3VsdCkgKyB1TGVuLCAwKTsKKwlwQnNzRGVzY3IgPSAmcFNjYW5SZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yOworCS8qCisJICogTGVuZ3RoIG9mIEJTUyBkZXNyaXB0aW9uIGlzIHdpdGhvdXQgbGVuZ3RoIG9mIGxlbmd0aCBpdHNlbGYgYW5kCisJICogbGVuZ3RoIG9mIHBvaW50ZXIgdGhhdCBob2xkcyB0aGUgbmV4dCBCU1MgZGVzY3JpcHRpb24KKwkgKi8KKwlwQnNzRGVzY3ItPmxlbmd0aCA9ICh1aW50MTZfdCkgKHNpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pIC0KKwkJc2l6ZW9mKHVpbnQxNl90KSAtIHNpemVvZih1aW50MzJfdCkgKyB1TGVuKTsKKwlpZiAocGFyc2VkX2ZybS0+ZHNQYXJhbXNQcmVzZW50KQorCQlwQnNzRGVzY3ItPmNoYW5uZWxJZCA9IHBhcnNlZF9mcm0tPmNoYW5uZWxOdW1iZXI7CisJZWxzZSBpZiAocGFyc2VkX2ZybS0+SFRJbmZvLnByZXNlbnQpCisJCXBCc3NEZXNjci0+Y2hhbm5lbElkID0gcGFyc2VkX2ZybS0+SFRJbmZvLnByaW1hcnlDaGFubmVsOworCWVsc2UKKwkJcEJzc0Rlc2NyLT5jaGFubmVsSWQgPSBwYXJzZWRfZnJtLT5jaGFubmVsTnVtYmVyOworCisJaWYgKChwQnNzRGVzY3ItPmNoYW5uZWxJZCA+IDApICYmIChwQnNzRGVzY3ItPmNoYW5uZWxJZCA8IDE1KSkgeworCQlpbnQgaTsKKwkJLyogMTFiIG9yIDExZyBwYWNrZXQgKi8KKwkJLyogMTFnIGlmZiBleHRlbmRlZCBSYXRlIElFIGlzIHByZXNlbnQgb3IgKi8KKwkJLyogaWYgdGhlcmUgaXMgYW4gQSByYXRlIGluIHN1cHBSYXRlIElFICovCisJCWZvciAoaSA9IDA7IGkgPCBwYXJzZWRfZnJtLT5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlczsgaSsrKSB7CisJCQlpZiAoc2lySXNBcmF0ZShwYXJzZWRfZnJtLT5zdXBwb3J0ZWRSYXRlcy5yYXRlW2ldCisJCQkJICAgICAgICYgMHg3ZikpIHsKKwkJCQlwQnNzRGVzY3ItPm53VHlwZSA9IGVTSVJfMTFHX05XX1RZUEU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHBhcnNlZF9mcm0tPmV4dGVuZGVkUmF0ZXNQcmVzZW50KQorCQkJcEJzc0Rlc2NyLT5ud1R5cGUgPSBlU0lSXzExR19OV19UWVBFOworCX0gZWxzZSB7CisJCS8qIDExYSBwYWNrZXQgKi8KKwkJcEJzc0Rlc2NyLT5ud1R5cGUgPSBlU0lSXzExQV9OV19UWVBFOworCX0KKwlwQnNzRGVzY3ItPnNpbnIgPSAwOworCXBCc3NEZXNjci0+cnNzaSA9IC0xICogcFByZWZOZXR3b3JrRm91bmRJbmQtPnJzc2k7CisJcEJzc0Rlc2NyLT5iZWFjb25JbnRlcnZhbCA9IHBhcnNlZF9mcm0tPmJlYWNvbkludGVydmFsOworCWlmICghcEJzc0Rlc2NyLT5iZWFjb25JbnRlcnZhbCkgeworCQlzbXNfbG9nKHBNYWMsIExPR1csIEZMKCJCY24gSW50ZXJ2YWwgaXMgWmVybyAsIGRlZmF1bHQgdG8gMTAwIgorCQkJTUFDX0FERFJFU1NfU1RSKSwgTUFDX0FERFJfQVJSQVkocEJzc0Rlc2NyLT5ic3NJZCkpOworCQlwQnNzRGVzY3ItPmJlYWNvbkludGVydmFsID0gMTAwOworCX0KKwlwQnNzRGVzY3ItPnRpbWVTdGFtcFswXSA9IHBhcnNlZF9mcm0tPnRpbWVTdGFtcFswXTsKKwlwQnNzRGVzY3ItPnRpbWVTdGFtcFsxXSA9IHBhcnNlZF9mcm0tPnRpbWVTdGFtcFsxXTsKKwlwQnNzRGVzY3ItPmNhcGFiaWxpdHlJbmZvID0gKigodWludDE2X3QgKikmcGFyc2VkX2ZybS0+Y2FwYWJpbGl0eUluZm8pOworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcEJzc0Rlc2NyLT5ic3NJZCwKKwkJICAgICAodWludDhfdCAqKSBtYWNIZWFkZXItPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwlwQnNzRGVzY3ItPm5SZWNlaXZlZFRpbWUgPSAodWludDMyX3QpIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisJc21zX2xvZyhwTWFjLCBMT0cyLCBGTCgiQnNzaWQ9ICJNQUNfQUREUkVTU19TVFIiIGNoYW49ICVkLCByc3NpID0gJWQiKSwKKwkJTUFDX0FERFJfQVJSQVkocEJzc0Rlc2NyLT5ic3NJZCksIHBCc3NEZXNjci0+Y2hhbm5lbElkLAorCQlwQnNzRGVzY3ItPnJzc2kpOworCS8qIElFcyAqLworCWlmICh1TGVuKSB7CisJCWNkZl9tZW1fY29weSgmcEJzc0Rlc2NyLT5pZUZpZWxkcywKKwkJCXBQcmVmTmV0d29ya0ZvdW5kSW5kLT5kYXRhICsgKFNJUl9NQUNfSERSX0xFTl8zQSArCisJCQlTSVJfTUFDX0JfUFJfU1NJRF9PRkZTRVQpLCB1TGVuKTsKKwl9CisJbG9jYWxfaWUgPSAodERvdDExZkJlYWNvbklFcyAqKSAocFNjYW5SZXN1bHQtPlJlc3VsdC5wdkllcyk7CisJc3RhdHVzID0gY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcyhwTWFjLAorCQkJJnBTY2FuUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvciwgJmxvY2FsX2llKTsKKwlpZiAoIShsb2NhbF9pZSB8fCBDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IHBhcnNlIElFcyIpKTsKKwkJY3NyX2ZyZWVfc2Nhbl9yZXN1bHRfZW50cnkocE1hYywgcFNjYW5SZXN1bHQpOworCQljZGZfbWVtX2ZyZWUocGFyc2VkX2ZybSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUkVTT1VSQ0VTOworCX0KKworCWZEdXBCc3MgPSBjc3JfcmVtb3ZlX2R1cF9ic3NfZGVzY3JpcHRpb24ocE1hYywKKwkJCSZwU2NhblJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IsCisJCQlsb2NhbF9pZSwgJnRtcFNzaWQsICZ0aW1lciwgZmFsc2UpOworCS8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSByZWFjaCBvdXQgbGltaXQgKi8KKwlpZiAoQ1NSX1NDQU5fSVNfT1ZFUl9CU1NfTElNSVQocE1hYykpIHsKKwkJLyogTGltaXQgcmVhY2ggKi8KKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiQlNTIGxpbWl0IHJlYWNoZWQiKSk7CisJCS8qIEZyZWUgdGhlIHJlc291cmNlcyAqLworCQlpZiAoKHBTY2FuUmVzdWx0LT5SZXN1bHQucHZJZXMgPT0gTlVMTCkgJiYgbG9jYWxfaWUpCisJCQljZGZfbWVtX2ZyZWUobG9jYWxfaWUpOworCQljc3JfZnJlZV9zY2FuX3Jlc3VsdF9lbnRyeShwTWFjLCBwU2NhblJlc3VsdCk7CisJCWNkZl9tZW1fZnJlZShwYXJzZWRfZnJtKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfQorCS8qIEFkZCB0byBzY2FuIGNhY2hlICovCisJY3NyX3NjYW5fYWRkX3Jlc3VsdChwTWFjLCBwU2NhblJlc3VsdCwgbG9jYWxfaWUsCisJCQkgICAgcFByZWZOZXR3b3JrRm91bmRJbmQtPnNlc3Npb25JZCk7CisKKwlpZiAoKHBTY2FuUmVzdWx0LT5SZXN1bHQucHZJZXMgPT0gTlVMTCkgJiYgbG9jYWxfaWUpCisJCWNkZl9tZW1fZnJlZShsb2NhbF9pZSk7CisJY2RmX21lbV9mcmVlKHBhcnNlZF9mcm0pOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1NDQU5fUE5PICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCit2b2lkIGNzcl9pbml0X29jY3VwaWVkX2NoYW5uZWxzX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworCXRDc3JTY2FuUmVzdWx0ICpwQnNzRGVzYyA9IE5VTEw7CisJdERvdDExZkJlYWNvbklFcyAqcEllcyA9IE5VTEw7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9CisJCSZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKworCWlmICgwICE9IHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscykgeworCQkvKgorCQkgKiBJbmkgZmlsZSBjb250YWlucyBuZWlnaGJvciBzY2FuIGNoYW5uZWwgbGlzdCwgaGVuY2UgTk8gbmVlZAorCQkgKiB0byBidWlsZCBvY2N1cGllZCBjaGFubmVsIGxpc3QiCisJCSAqLworCQlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJJbmkgY29udGFpbnMgbmVpZ2hib3Igc2NhbiBjaCBsaXN0IikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFjc3JfbmVpZ2hib3Jfcm9hbV9pc19uZXdfY29ubmVjdGVkX3Byb2ZpbGUocE1hYywgc2Vzc2lvbklkKSkgeworCQkvKgorCQkgKiBEbyBub3QgZmx1c2ggb2NjdXBpZWQgbGlzdCBzaW5jZSBjdXJyZW50IHJvYW0gcHJvZmlsZSBtYXRjaGVzCisJCSAqIHByZXZpb3VzCisJCSAqLworCQlzbXNfbG9nKHBNYWMsIExPRzIsIEZMKCJDdXJyZW50IHJvYW0gcHJvZmlsZSBtYXRjaGVzIHByZXYiKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBFbXB0eSBvY2N1cGllZCBjaGFubmVscyBoZXJlICovCisJcE1hYy0+c2Nhbi5vY2N1cGllZENoYW5uZWxzW3Nlc3Npb25JZF0ubnVtQ2hhbm5lbHMgPSAwOworCisJY3NyX2xsX2xvY2soJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QpOworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCXdoaWxlIChwRW50cnkpIHsKKwkJcEJzc0Rlc2MgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCQlwSWVzID0gKHREb3QxMWZCZWFjb25JRXMgKikgKHBCc3NEZXNjLT5SZXN1bHQucHZJZXMpOworCQkvKiBBdCB0aGlzIHRpbWUsIHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LnB2SWVzIG1heSBiZSBOVUxMICovCisJCWlmICghcEllcyAmJiAhQ0RGX0lTX1NUQVRVU19TVUNDRVNTKAorCQkJY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcyhwTWFjLAorCQkJCSZwQnNzRGVzYy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IsICZwSWVzKSkpCisJCQljb250aW51ZTsKKwkJY3NyX3NjYW5fYWRkX3RvX29jY3VwaWVkX2NoYW5uZWxzKHBNYWMsIHBCc3NEZXNjLCBzZXNzaW9uSWQsCisJCQkJJnBNYWMtPnNjYW4ub2NjdXBpZWRDaGFubmVsc1tzZXNzaW9uSWRdLCBwSWVzKTsKKwkJLyoKKwkJICogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgcEllcyBpbgorCQkgKiBjc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzCisJCSAqLworCQlpZiAoKHBCc3NEZXNjLT5SZXN1bHQucHZJZXMgPT0gTlVMTCkgJiYgcEllcykKKwkJCWNkZl9tZW1fZnJlZShwSWVzKTsKKwkJcEVudHJ5ID0gY3NyX2xsX25leHQoJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsIHBFbnRyeSwKKwkJCQkgICAgIExMX0FDQ0VTU19OT0xPQ0spOworCX0gLyogd2hpbGUgKi8KKwljc3JfbGxfdW5sb2NrKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0KTsKK30KKyNlbmRpZgorCitDREZfU1RBVFVTIGNzcl9zY2FuX2NyZWF0ZV9lbnRyeV9pbl9zY2FuX2NhY2hlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgICBzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc2lkLAorCQkJCQkgICAgICAgdWludDhfdCBjaGFubmVsKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXREb3QxMWZCZWFjb25JRXMgKnBOZXdJZXMgPSBOVUxMOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwl0U2lyQnNzRGVzY3JpcHRpb24gKnBOZXdCc3NEZXNjcmlwdG9yID0gTlVMTDsKKwl1aW50MzJfdCBzaXplID0gMDsKKworCWlmIChOVUxMID09IHBTZXNzaW9uKSB7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlzbXNfbG9nKHBNYWMsIExPRzIsIEZMKCJDdXJyZW50IGJzc2lkOjoiTUFDX0FERFJFU1NfU1RSKSwKKwkJTUFDX0FERFJfQVJSQVkocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+YnNzSWQpKTsKKwlzbXNfbG9nKHBNYWMsIExPRzIsIEZMKCJNeSBic3NpZDo6Ik1BQ19BRERSRVNTX1NUUiIgY2hhbm5lbCAlZCIpLAorCQlNQUNfQUREUl9BUlJBWShic3NpZC5ieXRlcyksIGNoYW5uZWwpOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcygKKwkJCQkJcE1hYywgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYywKKwkJCQkJJnBOZXdJZXMpKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFyc2UgSUVzIikpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBmcmVlX21lbTsKKwl9CisJc2l6ZSA9IHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MtPmxlbmd0aCArCisJCXNpemVvZihwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5sZW5ndGgpOworCWlmICghc2l6ZSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJsZW5ndGggb2YgYnNzIGRlc2NyaXB0b3IgaXMgMCIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCXBOZXdCc3NEZXNjcmlwdG9yID0gY2RmX21lbV9tYWxsb2Moc2l6ZSk7CisJaWYgKE5VTEwgPT0gcE5ld0Jzc0Rlc2NyaXB0b3IpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIikpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBmcmVlX21lbTsKKwl9CisJY2RmX21lbV9jb3B5KHBOZXdCc3NEZXNjcmlwdG9yLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLCBzaXplKTsKKwkvKiBjaGFuZ2UgdGhlIEJTU0lEICYgY2hhbm5lbCBhcyBwYXNzZWQgKi8KKwljZGZfbWVtX2NvcHkocE5ld0Jzc0Rlc2NyaXB0b3ItPmJzc0lkLCBic3NpZC5ieXRlcywKKwkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCXBOZXdCc3NEZXNjcmlwdG9yLT5jaGFubmVsSWQgPSBjaGFubmVsOworCWlmIChOVUxMID09IGNzcl9zY2FuX2FwcGVuZF9ic3NfZGVzY3JpcHRpb24ocE1hYywgcE5ld0Jzc0Rlc2NyaXB0b3IsCisJCQkJCQlwTmV3SWVzLCB0cnVlLCBzZXNzaW9uSWQpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJjc3Jfc2Nhbl9hcHBlbmRfYnNzX2Rlc2NyaXB0aW9uIGZhaWxlZCIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCXNtc19sb2cocE1hYywgTE9HRSwgRkwoImVudHJ5IHN1Y2Nlc3NmdWxseSBhZGRlZCBpbiBzY2FuIGNhY2hlIikpOworCitmcmVlX21lbToKKwlpZiAocE5ld0llcykgeworCQljZGZfbWVtX2ZyZWUocE5ld0llcyk7CisJfQorCWlmIChwTmV3QnNzRGVzY3JpcHRvcikgeworCQljZGZfbWVtX2ZyZWUocE5ld0Jzc0Rlc2NyaXB0b3IpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorLyogIFVwZGF0ZSB0aGUgVFNGIHdpdGggdGhlIGRpZmZlcmVuY2UgaW4gc3lzdGVtIHRpbWUgKi8KK3ZvaWQgdXBkYXRlX2Nja210c2YodWludDMyX3QgKnRpbWVTdGFtcDAsIHVpbnQzMl90ICp0aW1lU3RhbXAxLAorCQkgICAgdWludDMyX3QgKmluY3IpCit7CisJdWludDY0X3QgdGltZVN0YW1wNjQgPSAoKHVpbnQ2NF90KSAqdGltZVN0YW1wMSA8PCAzMikgfCAoKnRpbWVTdGFtcDApOworCXRpbWVTdGFtcDY0ID0gKHVpbnQ2NF90KSAodGltZVN0YW1wNjQgKyAodWludDY0X3QpICppbmNyKTsKKwkqdGltZVN0YW1wMCA9ICh1aW50MzJfdCkgKHRpbWVTdGFtcDY0ICYgMHhmZmZmZmZmZik7CisJKnRpbWVTdGFtcDEgPSAodWludDMyX3QpICgodGltZVN0YW1wNjQgPj4gMzIpICYgMHhmZmZmZmZmZik7Cit9CisjZW5kaWYKKworLyoqCisgKiBjc3Jfc2Nhbl9zYXZlX3JvYW1fb2ZmbG9hZF9hcF90b19zY2FuX2NhY2hlCisgKiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgcmVjZWl2ZWQgYmVhY29uL3Byb2JlIHJlc3BvbnNlCisgKiBmcm9tIHRoZSBmaXJtd2FyZSBhcyBwYXJ0IG9mIHRoZSByb2FtIHN5bmNoIGluZGljYXRpb24uCisgKiBUaGUgYmVhY29uIG9yIHRoZSBwcm9iZSByZXNwb25zZSBpcyBwYXJzZWQgYW5kIGlzIGFsc28KKyAqIHNhdmVkIGludG8gdGhlIHNjYW4gY2FjaGUKKyAqCisgKiBAcGFyYW0gIHBNYWMgUG9pbnRlciB0byBHbG9iYWwgTWFjCisgKiBAcGFyYW0gIHJvYW1fc3luY19pbmRfcHRyIFJvYW0gU3luY2ggSW5kaWNhdGlvbiBmcm9tCisgKiAgICAgICAgIGZpcm13YXJlIHdoaWNoIGFsc28gY29udGFpbnMgdGhlIGJlYWNvbi9wcm9iZQorICogICAgICAgICByZXNwb25zZQorICogQHJldHVybiBTdGF0dXMKKyAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKK0NERl9TVEFUVVMgY3NyX3NjYW5fc2F2ZV9yb2FtX29mZmxvYWRfYXBfdG9fc2Nhbl9jYWNoZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXJvYW1fb2ZmbG9hZF9zeW5jaF9pbmQgKnJvYW1fc3luY19pbmRfcHRyKQoreworCXVpbnQzMl90IGxlbmd0aCA9IDA7CisJYm9vbCBkdXBfYnNzOworCXREb3QxMWZCZWFjb25JRXMgKmllc19sb2NhbF9wdHIgPSBOVUxMOworCXRBbmlTU0lEIHRtcFNzaWQ7CisJdl9USU1FX3QgdGltZXIgPSAwOworCXRDc3JTY2FuUmVzdWx0ICpzY2FuX3Jlc19wdHIgPSBOVUxMOworCXVpbnQ4X3Qgc2Vzc2lvbl9pZCA9IHJvYW1fc3luY19pbmRfcHRyLT5yb2FtZWRWZGV2SWQ7CisKKwlsZW5ndGggPSByb2FtX3N5bmNfaW5kX3B0ci0+YmVhY29uUHJvYmVSZXNwTGVuZ3RoIC0KKwkJKFNJUl9NQUNfSERSX0xFTl8zQSArIFNJUl9NQUNfQl9QUl9TU0lEX09GRlNFVCk7CisJc2Nhbl9yZXNfcHRyID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JTY2FuUmVzdWx0KSArIGxlbmd0aCk7CisJaWYgKHNjYW5fcmVzX3B0ciA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSIgZmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZyYW1lIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV96ZXJvKHNjYW5fcmVzX3B0ciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0KSArIGxlbmd0aCk7CisJY2RmX21lbV9jb3B5KCZzY2FuX3Jlc19wdHItPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLAorCQkJcm9hbV9zeW5jX2luZF9wdHItPmJzc19kZXNjX3B0ciwKKwkJCShzaXplb2YodFNpckJzc0Rlc2NyaXB0aW9uKSArIGxlbmd0aCkpOworCWllc19sb2NhbF9wdHIgPSAodERvdDExZkJlYWNvbklFcyAqKShzY2FuX3Jlc19wdHItPlJlc3VsdC5wdkllcyk7CisJaWYgKCFpZXNfbG9jYWxfcHRyICYmCisJCSghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMoCisJCQkJCQlwTWFjLCAmc2Nhbl9yZXNfcHRyLT5SZXN1bHQuCisJCQkJCQlCc3NEZXNjcmlwdG9yLAorCQkJCQkJJmllc19sb2NhbF9wdHIpKSkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJIiVzOkNhbm5vdCBQYXJzZSBJRXMiLCBfX2Z1bmNfXyk7CisJCWNzcl9mcmVlX3NjYW5fcmVzdWx0X2VudHJ5KHBNYWMsIHNjYW5fcmVzX3B0cik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfUkVTT1VSQ0VTOworCX0KKworCWR1cF9ic3MgPSBjc3JfcmVtb3ZlX2R1cF9ic3NfZGVzY3JpcHRpb24ocE1hYywKKwkJCSZzY2FuX3Jlc19wdHItPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLAorCQkJaWVzX2xvY2FsX3B0ciwgJnRtcFNzaWQsICZ0aW1lciwgdHJ1ZSk7CisJaWYgKENTUl9TQ0FOX0lTX09WRVJfQlNTX0xJTUlUKHBNYWMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSIlczpCU1MgTGltaXQgRXhjZWVkIiwgX19mdW5jX18pOworCQlpZiAoKHNjYW5fcmVzX3B0ci0+UmVzdWx0LnB2SWVzID09IE5VTEwpICYmIGllc19sb2NhbF9wdHIpCisJCQljZGZfbWVtX2ZyZWUoaWVzX2xvY2FsX3B0cik7CisKKwkJY3NyX2ZyZWVfc2Nhbl9yZXN1bHRfZW50cnkocE1hYywgc2Nhbl9yZXNfcHRyKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJfQorCWNzcl9zY2FuX2FkZF9yZXN1bHQocE1hYywgc2Nhbl9yZXNfcHRyLCBpZXNfbG9jYWxfcHRyLCBzZXNzaW9uX2lkKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmCisKKy8qKgorICogY3NyX2dldF9ic3NkZXNjcl9mcm9tX3NjYW5faGFuZGxlKCkgLSBUaGlzIGZ1bmN0aW9uIHRvIGV4dHJhY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgYnNzIGRlc2NyaXB0aW9uIGZyb20gc2NhbiBoYW5kbGUKKyAqIEByZXN1bHRfaGFuZGxlOiBhbiBvYmplY3QgZm9yIHRoZSByZXN1bHQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB3cml0dGVuIHRvIGV4dHJhY3QgZmlyc3QgYnNzIGZyb20gc2NhbiBoYW5kbGUuCisgKgorICogUmV0dXJuOiBmaXJzdCBic3MgZGVzY3JpcHRvciBmcm9tIHRoZSBzY2FuIGhhbmRsZS4KKyAqLwordFNpckJzc0Rlc2NyaXB0aW9uKgorY3NyX2dldF9ic3NkZXNjcl9mcm9tX3NjYW5faGFuZGxlKHRTY2FuUmVzdWx0SGFuZGxlIHJlc3VsdF9oYW5kbGUsCisJCQkJdFNpckJzc0Rlc2NyaXB0aW9uICpic3NfZGVzY3IpCit7CisJdExpc3RFbGVtICpmaXJzdF9lbGVtZW50ID0gTlVMTDsKKwl0Q3NyU2NhblJlc3VsdCAqc2Nhbl9yZXN1bHQgPSBOVUxMOworCXRTY2FuUmVzdWx0TGlzdCAqYnNzX2xpc3QgPSAodFNjYW5SZXN1bHRMaXN0ICopcmVzdWx0X2hhbmRsZTsKKworCWlmIChOVUxMID09IGJzc19saXN0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMKCJFbXB0eSBic3NfbGlzdCIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChjc3JfbGxfaXNfbGlzdF9lbXB0eSgmYnNzX2xpc3QtPkxpc3QsIExMX0FDQ0VTU19OT0xPQ0spKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCUZMKCJic3NfbGlzdC0+TGlzdCBpcyBlbXB0eSIpKTsKKwkJY2RmX21lbV9mcmVlKGJzc19saXN0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZpcnN0X2VsZW1lbnQgPSBjc3JfbGxfcGVla19oZWFkKCZic3NfbGlzdC0+TGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisJaWYgKGZpcnN0X2VsZW1lbnQpIHsKKwkJc2Nhbl9yZXN1bHQgPSBHRVRfQkFTRV9BRERSKGZpcnN0X2VsZW1lbnQsCisJCQkJdENzclNjYW5SZXN1bHQsCisJCQkJTGluayk7CisJCWNkZl9tZW1fY29weShic3NfZGVzY3IsCisJCQkJJnNjYW5fcmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvciwKKwkJCQlzaXplb2YodFNpckJzc0Rlc2NyaXB0aW9uKSk7CisJfQorCXJldHVybiBic3NfZGVzY3I7Cit9CisKKy8qKgorICogc2Nhbl9hY3RpdmVfbGlzdF9jbWRfdGltZW91dF9oYW5kbGUoKSAtIFRvIGhhbmRsZSBzY2FuIGFjdGl2ZSBjb21tYW5kIHRpbWVvdXQKKyAqIEB1c2VyRGF0YTogc2NhbiBjb250ZXh0CisgKgorICogVGhpcyByb3V0aW5lIGlzIHRvIGhhbmRsZSBzY2FuIGFjdGl2ZSBjb21tYW5kIHRpbWVvdXQKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjc3Jfc2Nhbl9hY3RpdmVfbGlzdF90aW1lb3V0X2hhbmRsZSh2b2lkICp1c2VyRGF0YSkKK3sKKwl0U21lQ21kICpzY2FuX2NtZCA9ICh0U21lQ21kICopIHVzZXJEYXRhOworCXRIYWxIYW5kbGUgKmhhbF9jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eDsKKwl1aW50MTZfdCBzY2FuX2lkOworCXRTaXJTbWVTY2FuQWJvcnRSZXEgKm1zZzsKKwl1aW50MTZfdCBtc2dfbGVuOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKHNjYW5fY21kID09IE5VTEwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiU2NhbiBUaW1lb3V0OiBTY2FuIGNvbW1hbmQgaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKwltYWNfY3R4ID0gUE1BQ19TVFJVQ1QoaGFsX2N0eCk7CisJc2Nhbl9pZCA9IHNjYW5fY21kLT51LnNjYW5DbWQuc2NhbklEOworCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJRkwoIlNjYW4gVGltZW91dDpTZW5kaW5nIGFib3J0IHRvIEZpcm13YXJlIElEICVkIHNlc3Npb24gJWQgIiksCisJCXNjYW5faWQsIHNjYW5fY21kLT5zZXNzaW9uSWQpOworCW1zZ19sZW4gPSAodWludDE2X3QpKHNpemVvZih0U2lyU21lU2NhbkFib3J0UmVxKSk7CisJbXNnID0gY2RmX21lbV9tYWxsb2MobXNnX2xlbik7CisJaWYgKE5VTEwgPT0gbXNnKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJGYWlsZWQgdG8gYWxsb2MgbWVtb3J5IGZvciBTbWVTY2FuQWJvcnRSZXEiKSk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV96ZXJvKCh2b2lkICopbXNnLCBtc2dfbGVuKTsKKwltc2ctPnR5cGUgPSBlV05JX1NNRV9TQ0FOX0FCT1JUX0lORDsKKwltc2ctPm1zZ0xlbiA9IG1zZ19sZW47CisJbXNnLT5zZXNzaW9uSWQgPSBzY2FuX2NtZC0+c2Vzc2lvbklkOworCW1zZy0+c2Nhbl9pZCA9IHNjYW5faWQ7CisJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMobXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCIgRmFpbGVkIHRvIHBvc3QgbWVzc2FnZSB0byBMSU0iKSk7CisJCWNkZl9tZW1fZnJlZShtc2cpOworCX0KKwljc3JfcmVsZWFzZV9zY2FuX2NvbW1hbmQobWFjX2N0eCwgc2Nhbl9jbWQsIGVDU1JfU0NBTl9GQUlMVVJFKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NtZS9zcmMvY3NyL2Nzcl9jbWRfcHJvY2Vzcy5jIGIvY29yZS9zbWUvc3JjL2Nzci9jc3JfY21kX3Byb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmE3ZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zbWUvc3JjL2Nzci9jc3JfY21kX3Byb2Nlc3MuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICAgIFxmaWxlIGNzcl9jbWRfcHJvY2Vzcy5jCisKKyAgICBJbXBsZW1lbnRhdGlvbiBmb3IgcHJvY2Vzc2luZyB2YXJpb3VzIGNvbW1hbmRzLgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKworI2luY2x1ZGUgImNzcl9pbnNpZGVfYXBpLmgiCisjaW5jbHVkZSAic21lX2luc2lkZS5oIgorI2luY2x1ZGUgInNtc19kZWJ1Zy5oIgorI2luY2x1ZGUgIm1hY190cmFjZS5oIgorCisvKioKKyAqIGNzcl9tc2dfcHJvY2Vzc29yKCkgLSBUbyBwcm9jZXNzIGFsbCBjc3IgbXNnCisgKiBAbWFjX2N0eDogbWFjIGNvbnRleHQKKyAqIEBtc2dfYnVmOiBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGhhbmRsZSBhbGwgdGhlIG1lc3NhZ2UgZm9yIGNzciB0byBwcm9jZXNzCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgY3NyX21zZ19wcm9jZXNzb3IodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdm9pZCAqbXNnX2J1ZikKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U2lyU21lUnNwICpzbWVfcnNwID0gKHRTaXJTbWVSc3AgKikgbXNnX2J1ZjsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwl0U2lyTWJNc2cgKm1zZyA9ICh0U2lyTWJNc2cgKikgbXNnX2J1ZjsKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb247CisjZW5kaWYKKwl1aW50OF90IHNlc3Npb25faWQgPSBzbWVfcnNwLT5zZXNzaW9uSWQ7CisJZUNzclJvYW1TdGF0ZSBjdXJfc3RhdGUgPSBtYWNfY3R4LT5yb2FtLmN1clN0YXRlW3Nlc3Npb25faWRdOworCisJc21zX2xvZyhtYWNfY3R4LCBMT0cyLAorCQlGTCgibXNnICVkWzB4JTA0WF0gcmVjdmQgaW4gY3Vyc3RhdGUgJXMgJiBzdWJzdGF0ZSAlcyBpZCglZCkiKSwKKwkJc21lX3JzcC0+bWVzc2FnZVR5cGUsIHNtZV9yc3AtPm1lc3NhZ2VUeXBlLAorCQltYWNfdHJhY2VfZ2V0Y3NyX3JvYW1fc3RhdGUoY3VyX3N0YXRlKSwKKwkJbWFjX3RyYWNlX2dldGNzcl9yb2FtX3N1Yl9zdGF0ZSgKKwkJCW1hY19jdHgtPnJvYW0uY3VyU3ViU3RhdGVbc2Vzc2lvbl9pZF0pLAorCQlzZXNzaW9uX2lkKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCS8qCisJICogUE5PIHNjYW4gcmVzcG9uc2VzIGhhdmUgdG8gYmUgaGFuZGxlZCBpcnJlc3BlY3RpdmUgb2YgQ1NSIHJvYW0gc3RhdGUuCisJICogQ2hlY2sgaWYgUE5PIGhhcyBiZWVuIHN0YXJ0ZWQgJiBvbmx5IHRoZW4gcHJvY2VzcyB0aGUgUE5PIHNjYW4gcmVzdWx0CisJICogQWxzbyBub3RlIHRoYXQgbm9ybWFsIHNjYW4gaXNuJ3QgYWxsb3dlZCB3aGVuIFBOTyBzY2FuIGlzIGluIHByb2dyZXNzCisJICogYW5kIHNvIHRoZSBzY2FuIHJlc3BvbnNlcyByZWFjaGluZyBoZXJlIHdoZW4gUE5PIGlzIHN0YXJ0ZWQgbXVzdCBiZQorCSAqIFBOTyByZXNwb25zZXMuIEZvciBub3JtYWwgc2NhbiwgdGhlIFBOTyBzdGFydGVkIGZsYWcgd2lsbCBiZSBmYWxzZQorCSAqIGFuZCBpdCdsbCBiZSBwcm9jZXNzZWQgYXMgdXN1YWwgYmFzZWQgb24gdGhlIGN1cnJlbnQgQ1NSIHJvYW0gc3RhdGUuCisJICovCisJc2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBzZXNzaW9uX2lkKTsKKwlpZiAoIXNlc3Npb24pIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgic2Vzc2lvbiAlZCBub3QgZm91bmQsIG1zZ1R5cGUgOiAlZCIpLAorCQkJc2Vzc2lvbl9pZCwgbXNnLT50eXBlKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChlV05JX1NNRV9TQ0FOX1JTUCA9PSBtc2ctPnR5cGUpIHsKKwkJc3RhdHVzID0gY3NyX3NjYW5uaW5nX3N0YXRlX21zZ19wcm9jZXNzb3IobWFjX2N0eCwgbXNnX2J1Zik7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJoYW5kbGluZyBQTk8gc2NhbiByZXNwIDB4JVggQ1NSIHN0YXRlICVkIiksCisJCQkJc21lX3JzcC0+bWVzc2FnZVR5cGUsIGN1cl9zdGF0ZSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorI2VuZGlmCisKKwkvKiBQcm9jZXNzIHRoZSBtZXNzYWdlIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcm9hbWluZyBzdGF0ZXMuLi4gKi8KKyNpZiBkZWZpbmVkKEFOSV9SVFRfREVCVUcpCisJaWYgKCFwQWRhcHRlci0+ZlJ0dE1vZGVFbmFibGVkKSB7CisjZW5kaWYKKwkJc3dpdGNoIChjdXJfc3RhdGUpIHsKKwkJY2FzZSBlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTkVEOgorCQkJLyogYXJlIHdlIGluIGpvaW5lZCBzdGF0ZSAqLworCQkJY3NyX3JvYW1fam9pbmVkX3N0YXRlX21zZ19wcm9jZXNzb3IobWFjX2N0eCwgbXNnX2J1Zik7CisJCQlicmVhazsKKwkJY2FzZSBlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTklORzoKKwkJCS8qIGFyZSB3ZSBpbiByb2FtaW5nIHN0YXRlcyAqLworI2lmIGRlZmluZWQoQU5JX0VNVUxfQVNTT0MpCisJCQllbXVsUm9hbWluZ1N0YXRlTXNnUHJvY2Vzc29yKHBBZGFwdGVyLCBwTUJCdWZIZHIpOworI2VuZGlmCisJCQljc3Jfcm9hbWluZ19zdGF0ZV9tc2dfcHJvY2Vzc29yKG1hY19jdHgsIG1zZ19idWYpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBGb3IgYWxsIG90aGVyIG1lc3NhZ2VzLCB3ZSBpZ25vcmUgaXQKKwkJCSAqIFRvIHdvcmstYXJvdW5kIGFuIGlzc3VlIHdoZXJlIGNoZWNraW5nIGZvciBzZXQvcmVtb3ZlCisJCQkgKiBrZXkgYmFzZSBvbiBjb25uZWN0aW9uIHN0YXRlIGlzIG5vIGxvbmdlciB3b3JrYWJsZQorCQkJICogZHVlIHRvIGZhaWx1cmUgb3IgZmluZGluZyB0aGUgY29uZGl0aW9uIG1lZXRzIGJvdGgKKwkJCSAqIFNBUCBhbmQgaW5mcmEvSUJTUyByZXF1aXJlbWVudC4KKwkJCSAqLworCQkJaWYgKGVXTklfU01FX1NFVENPTlRFWFRfUlNQID09IHNtZV9yc3AtPm1lc3NhZ2VUeXBlKSB7CisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCQlGTCgiaGFuZGxpbmcgbXNnIDB4JVggQ1NSIHN0YXRlIGlzICVkIiksCisJCQkJCXNtZV9yc3AtPm1lc3NhZ2VUeXBlLCBjdXJfc3RhdGUpOworCQkJCWNzcl9yb2FtX2NoZWNrX2Zvcl9saW5rX3N0YXR1c19jaGFuZ2UobWFjX2N0eCwKKwkJCQkJCXNtZV9yc3ApOworCQkJfSBlbHNlIGlmIChlV05JX1NNRV9HRVRfUlNTSV9SRVEgPT0KKwkJCQkJc21lX3JzcC0+bWVzc2FnZVR5cGUpIHsKKwkJCQl0QW5pR2V0UnNzaVJlcSAqcEdldFJzc2lSZXEgPQorCQkJCQkodEFuaUdldFJzc2lSZXEgKikgbXNnX2J1ZjsKKwkJCQlpZiAoTlVMTCA9PSBwR2V0UnNzaVJlcS0+cnNzaUNhbGxiYWNrKSB7CisJCQkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJCUZMKCJyc3NpQ2FsbGJhY2sgaXMgTlVMTCIpKTsKKwkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQl9CisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dXLAorCQkJCQkJRkwoIm1zZyBlV05JX1NNRV9HRVRfUlNTSV9SRVEgaXMgbm90IGhhbmRsZWQgYnkgQ1NSIGluIHN0YXRlICVkLiBjYWxsaW5nIFJTU0kgY2FsbGJhY2siKSwKKwkJCQkJCWN1cl9zdGF0ZSk7CisJCQkJKCh0Q3NyUnNzaUNhbGxiYWNrKShwR2V0UnNzaVJlcS0+cnNzaUNhbGxiYWNrKSkoCisJCQkJCQlwR2V0UnNzaVJlcS0+bGFzdFJTU0ksCisJCQkJCQlwR2V0UnNzaVJlcS0+c3RhSWQsCisJCQkJCQlwR2V0UnNzaVJlcS0+cERldkNvbnRleHQpOworCQkJfSBlbHNlIHsKKwkJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJNZXNzYWdlIDB4JTA0WCBpcyBub3QgaGFuZGxlZCBieSBDU1Igc3RhdGUgaXMgJWQgc2Vzc2lvbiBJZCAlZCIpLAorCQkJCQlzbWVfcnNwLT5tZXNzYWdlVHlwZSwgY3VyX3N0YXRlLAorCQkJCQlzZXNzaW9uX2lkKTsKKworCQkJCWlmIChlV05JX1NNRV9GVF9QUkVfQVVUSF9SU1AgPT0KKwkJCQkJCXNtZV9yc3AtPm1lc3NhZ2VUeXBlKSB7CisJCQkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJCUZMKCJEZXF1ZXVlIGVTbWVDb21tYW5kUm9hbSBjb21tYW5kIHdpdGggcmVhc29uIGVDc3JQZXJmb3JtUHJlYXV0aCIpKTsKKwkJCQkJY3NyX2RlcXVldWVfcm9hbV9jb21tYW5kKG1hY19jdHgsCisJCQkJCQllQ3NyUGVyZm9ybVByZWF1dGgpOworCQkJCX0gZWxzZSBpZiAoZVdOSV9TTUVfUkVBU1NPQ19SU1AgPT0KKwkJCQkJCXNtZV9yc3AtPm1lc3NhZ2VUeXBlKSB7CisJCQkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJCUZMKCJEZXF1ZXVlIGVTbWVDb21tYW5kUm9hbSBjb21tYW5kIHdpdGggcmVhc29uIGVDc3JTbWVJc3N1ZWRGVFJlYXNzb2MiKSk7CisJCQkJCWNzcl9kZXF1ZXVlX3JvYW1fY29tbWFuZChtYWNfY3R4LAorCQkJCQkJZUNzclNtZUlzc3VlZEZUUmVhc3NvYyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0gLyogc3dpdGNoICovCisjaWYgZGVmaW5lZChBTklfUlRUX0RFQlVHKQorCX0KKyNlbmRpZgorCXJldHVybiBzdGF0dXM7Cit9CisKK2Jvb2wgY3NyX2NoZWNrX3BzX3JlYWR5KHZvaWQgKnB2KQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChwdik7CisKKwlpZiAocE1hYy0+cm9hbS5zUGVuZGluZ0NvbW1hbmRzIDwgMCkgeworCQlDREZfQVNTRVJUKHBNYWMtPnJvYW0uc1BlbmRpbmdDb21tYW5kcyA+PSAwKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBwTWFjLT5yb2FtLnNQZW5kaW5nQ29tbWFuZHMgPT0gMDsKK30KKworYm9vbCBjc3JfY2hlY2tfcHNfb2ZmbG9hZF9yZWFkeSh2b2lkICpwdiwgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChwdik7CisKKwlDREZfQVNTRVJUKHBNYWMtPnJvYW0uc1BlbmRpbmdDb21tYW5kcyA+PSAwKTsKKwlyZXR1cm4gcE1hYy0+cm9hbS5zUGVuZGluZ0NvbW1hbmRzID09IDA7Cit9CisKZGlmZiAtLWdpdCBhL2NvcmUvc21lL3NyYy9jc3IvY3NyX2luc2lkZV9hcGkuaCBiL2NvcmUvc21lL3NyYy9jc3IvY3NyX2luc2lkZV9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjc5Nzg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zbWUvc3JjL2Nzci9jc3JfaW5zaWRlX2FwaS5oCkBAIC0wLDAgKzEsMTA3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorCisgICAgXGZpbGUgY3NyX2luc2lkZV9hcGkuaAorCisgICAgRGVmaW5lIGludGVyZmFjZSBvbmx5IHVzZWQgYnkgQ1NSLgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgQ1NSX0lOU0lERV9BUElfSF9fCisjZGVmaW5lIENTUl9JTlNJREVfQVBJX0hfXworCisjaW5jbHVkZSAiY3NyX3N1cHBvcnQuaCIKKyNpbmNsdWRlICJzbWVfaW5zaWRlLmgiCisjaW5jbHVkZSAiY2RzX3JlZ19zZXJ2aWNlLmgiCisKKyNkZWZpbmUgQ1NSX1BBU1NJVkVfTUFYX0NIQU5ORUxfVElNRSAgIDExMAorI2RlZmluZSBDU1JfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FICAgNjAKKworI2RlZmluZSBDU1JfQUNUSVZFX01BWF9DSEFOTkVMX1RJTUUgICAgNDAKKyNkZWZpbmUgQ1NSX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FICAgIDIwCisKKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorI2RlZmluZSBDU1JfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX0NPTkMgICAxMTAKKyNkZWZpbmUgQ1NSX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DICAgNjAKKworI2RlZmluZSBDU1JfQUNUSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQyAgICAyNworI2RlZmluZSBDU1JfQUNUSVZFX01JTl9DSEFOTkVMX1RJTUVfQ09OQyAgICAyMAorCisjZGVmaW5lIENTUl9SRVNUX1RJTUVfQ09OQyAgICAgICAgICAgICAgICAgIDEwMAorCisjZGVmaW5lIENTUl9OVU1fU1RBX0NIQU5fQ09NQklORURfQ09OQyAgICAgIDMKKyNkZWZpbmUgQ1NSX05VTV9QMlBfQ0hBTl9DT01CSU5FRF9DT05DICAgICAgMQorI2VuZGlmCisKKyNkZWZpbmUgQ1NSX01BWF9OVU1fU1VQUE9SVEVEX0NIQU5ORUxTIDU1CisKKyNkZWZpbmUgQ1NSX01BWF8yXzRfR0haX1NVUFBPUlRFRF9DSEFOTkVMUyAxNAorCisjZGVmaW5lIENTUl9NQVhfQlNTX1NVUFBPUlQgICAgICAgICAgICAzMDAKKyNkZWZpbmUgU1lTVEVNX1RJTUVfTVNFQ19UT19VU0VDICAgICAgMTAwMAorCisvKiBUaGlzIG51bWJlciBtaW51cyAxIG1lYW5zIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjaGFubmVsIGlzIHNjYW5uZWQgYmVmb3JlIGEgQlNTIGlzIHJlbXZvZWQgZnJvbSAqLworLyogY2FjaGUgc2NhbiByZXN1bHQgKi8KKyNkZWZpbmUgQ1NSX0FHSU5HX0NPVU5UICAgICAzCisjZGVmaW5lIENTUl9TQ0FOX0dFVF9SRVNVTFRfSU5URVJWQUwgICAgKDUgKiBDREZfTUNfVElNRVJfVE9fU0VDX1VOSVQpICAvKiA1IHNlY29uZHMgKi8KKyNkZWZpbmUgQ1NSX01JQ19FUlJPUl9USU1FT1VUICAoNjAgKiBDREZfTUNfVElNRVJfVE9fU0VDX1VOSVQpICAvKiA2MCBzZWNvbmRzICovCisjZGVmaW5lIENTUl9US0lQX0NPVU5URVJfTUVBU1VSRV9USU1FT1VUICAoNjAgKiBDREZfTUNfVElNRVJfVE9fU0VDX1VOSVQpICAgICAgIC8qIDYwIHNlY29uZHMgKi8KKworI2RlZmluZSBDU1JfU0NBTl9SRVNVTFRfQ0ZHX0FHSU5HX0lOVEVSVkFMICAgIChDREZfTUNfVElNRVJfVE9fU0VDX1VOSVQpICAgICAgICAvKiAxICBzZWNvbmQgKi8KKy8qIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgTk9UIHVzZWQgYnkgcGFsVGltZXIgKi8KKyNkZWZpbmUgQ1NSX1NDQU5fQUdJTkdfVElNRV9OT1RfQ09OTkVDVF9OT19QUyA1MCAgICAgICAgLyogNTAgc2Vjb25kcyAqLworI2RlZmluZSBDU1JfU0NBTl9BR0lOR19USU1FX05PVF9DT05ORUNUX1dfUFMgMzAwICAgICAgICAvKiAzMDAgc2Vjb25kcyAqLworI2RlZmluZSBDU1JfU0NBTl9BR0lOR19USU1FX0NPTk5FQ1RfTk9fUFMgMTUwICAgLyogMTUwIHNlY29uZHMgKi8KKyNkZWZpbmUgQ1NSX1NDQU5fQUdJTkdfVElNRV9DT05ORUNUX1dfUFMgNjAwICAgIC8qIDYwMCBzZWNvbmRzICovCisjZGVmaW5lIENTUl9KT0lOX0ZBSUxVUkVfVElNRU9VVF9ERUZBVUxUICgzMDAwKQorI2RlZmluZSBDU1JfSk9JTl9GQUlMVVJFX1RJTUVPVVRfTUlOICAgKDEwMDApICAgLyogbWluaW1hbCB2YWx1ZSAqLworLyogVGhlc2UgYXJlIGdvaW5nIGFnYWluc3QgdGhlIHNpZ25lZCBSU1NJIChpbnQ4X3QpIHNvIGl0IGlzIGJldHdlZW4gLSsxMjcgKi8KKyNkZWZpbmUgQ1NSX0JFU1RfUlNTSV9WQUxVRSAgICAgICAgICgtMzApICAgICAgIC8qIFJTU0kgPj0gdGhpcyBpcyBpbiBDQVQ0ICovCisjZGVmaW5lIENTUl9ERUZBVUxUX1JTU0lfREJfR0FQICAgICAzMCAgLyogZXZlcnkgMzAgZGJtIGZvciBvbmUgY2F0ZWdvcnkgKi8KKyNkZWZpbmUgQ1NSX0JTU19DQVBfVkFMVUVfTk9ORSAgMCAgICAgICAvKiBub3QgbXVjaCB2YWx1ZSAqLworI2RlZmluZSBDU1JfQlNTX0NBUF9WQUxVRV9IVCAgICAxCisjZGVmaW5lIENTUl9CU1NfQ0FQX1ZBTFVFX1ZIVCAgICAyCisjZGVmaW5lIENTUl9CU1NfQ0FQX1ZBTFVFX1dNTSAgIDEKKyNkZWZpbmUgQ1NSX0JTU19DQVBfVkFMVUVfVUFQU0QgMQorI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorI2RlZmluZSBDU1JfQlNTX0NBUF9WQUxVRV81R0haICAyCisjZW5kaWYKKyNkZWZpbmUgQ1NSX0RFRkFVTFRfUk9BTUlOR19USU1FIDEwICAgICAvKiAxMCBzZWNvbmRzICovCisKKyNkZWZpbmUgQ1NSX1JPQU1JTkdfREZTX0NIQU5ORUxfRElTQUJMRUQgICAgICAgICAgICgwKQorI2RlZmluZSBDU1JfUk9BTUlOR19ERlNfQ0hBTk5FTF9FTkFCTEVEX05PUk1BTCAgICAgKDEpCisjZGVmaW5lIENTUl9ST0FNSU5HX0RGU19DSEFOTkVMX0VOQUJMRURfQUNUSVZFICAgICAoMikKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgTUFYIEJTU0lEIENvdW50IHNob3VsZCBiZSBsb3dlciB0aGFuIHRoZSBjb21tYW5kIHRpbWVvdXQgdmFsdWUgYW5kIGl0CisgKiBjYW4gYmUgb2YgYSBmcmFjdGlvbiBvZiAzLzQgb2YgdGhlIHRvdGFsIGNvbW1hbmQgdGltZW91dCB2YWx1ZS4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ1NSX0FDVElWRV9MSVNUX0NNRF9USU1FT1VUX1ZBTFVFICgxMDAwKjMwKjQpCisjZGVmaW5lIENTUl9BQ1RJVkVfU0NBTl9MSVNUX0NNRF9USU1FT1VUICgxMDAwKjMwKQorCisjZGVmaW5lIENTUl9NQVhfQlNTSURfQ09VTlQgICAgICgoQ1NSX0FDVElWRV9MSVNUX0NNRF9USU1FT1VUX1ZBTFVFLzQwMDApICogMykKKyNkZWZpbmUgQ1NSX0NVU1RPTV9DT05DX0dPX0JJICAgIDEwMAorI2RlZmluZSBNSU5fMTFQX0NIQU5ORUwgKHJmX2NoYW5uZWxzW01JTl81XzlHSFpfQ0hBTk5FTF0uY2hhbm5lbE51bSkKKwordHlwZWRlZiBlbnVtIHsKKwllQ3NyTmV4dFNjYW5Ob3RoaW5nLAorCWVDc3JOZXh0TG9zdExpbmtTY2FuMVN1Y2Nlc3MsCisJZUNzck5leHRMb3N0TGlua1NjYW4xRmFpbGVkLAorCWVDc3JOZXh0TG9zdExpbmtTY2FuMlN1Y2Nlc3MsCisJZUNzck5leHRMb3N0TGlua1NjYW4yRmFpbGVkLAorCWVDc3JOZXh0TG9zdExpbmtTY2FuM1N1Y2Nlc3MsCisJZUNzck5leHRlU2NhbkZvclNzaWRTdWNjZXNzLAorCWVDc3JOZXh0TG9zdExpbmtTY2FuM0ZhaWxlZCwKKwllQ3NyTmV4dDExZFNjYW4xRmFpbHVyZSwKKwllQ3NyTmV4dDExZFNjYW4xU3VjY2VzcywKKwllQ3NyTmV4dDExZFNjYW4yRmFpbHVyZSwKKwllQ3NyTmV4dDExZFNjYW4yU3VjY2VzcywKKwllQ3NyTmV4dDExZFNjYW5Db21wbGV0ZSwKKwllQ3NyTmV4dGVTY2FuRm9yU3NpZEZhaWx1cmUsCisKK30gZUNzclNjYW5Db21wbGV0ZU5leHRDb21tYW5kOworCit0eXBlZGVmIGVudW0geworCWVDc3JKb2luU3VjY2VzcywKKwllQ3NySm9pbkZhaWx1cmUsCisJZUNzclJlYXNzb2NTdWNjZXNzLAorCWVDc3JSZWFzc29jRmFpbHVyZSwKKwllQ3NyTm90aGluZ1RvSm9pbiwKKwllQ3NyU3RhcnRCc3NTdWNjZXNzLAorCWVDc3JTdGFydEJzc0ZhaWx1cmUsCisJZUNzclNpbGVudGx5U3RvcFJvYW1pbmcsCisJZUNzclNpbGVudGx5U3RvcFJvYW1pbmdTYXZlU3RhdGUsCisJZUNzckpvaW5XZHNGYWlsdXJlLAorCWVDc3JKb2luRmFpbHVyZUR1ZVRvQ29uY3VycmVuY3ksCisKK30gZUNzclJvYW1Db21wbGV0ZVJlc3VsdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnU2NhblJlcVBhcmFtIHsKKwl1aW50OF90IGJSZXR1cm5BZnRlcjFzdE1hdGNoOworCXVpbnQ4X3QgZlVuaXF1ZVJlc3VsdDsKKwl1aW50OF90IGZyZXNoU2NhbjsKKwl1aW50OF90IGhpZGRlblNzaWQ7CisJdWludDhfdCByZXNlcnZlZDsKK30gdFNjYW5SZXFQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU2NhblJlc3VsdCB7CisJdExpc3RFbGVtIExpbms7CisJaW50MzJfdCBBZ2luZ0NvdW50OyAgICAgLyogVGhpcyBCU1MgaXMgcmVtb3ZlZCB3aGVuIGl0IHJlYWNoZXMgMCBvciBsZXNzICovCisJdWludDMyX3QgcHJlZmVyVmFsdWU7ICAgLyogVGhlIGJpZ2dlciB0aGUgbnVtYmVyLCB0aGUgYmV0dGVyIHRoZSBCU1MuIFRoaXMgdmFsdWUgb3ZlcnJpZGUgY2FwVmFsdWUgKi8KKwl1aW50MzJfdCBjYXBWYWx1ZTsgICAgICAvKiBUaGUgYmlnZ2dlciB0aGUgYmV0dGVyLiBUaGlzIHZhbHVlIGlzIGluIHVzZSBvbmx5IGlmIHdlIGhhdmUgZXF1YWwgcHJlZmVyVmFsdWUgKi8KKwkvKiBUaGlzIG1lbWJlciBtdXN0IGJlIHRoZSBsYXN0IGluIHRoZSBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGUgZW5kIG9mIHRTaXJCc3NEZXNjcmlwdGlvbiAoaW5zaWRlKSBpcyBhbiAqLworCS8qICAgIGFycmF5IHdpdGggbm9ua25vd24gc2l6ZSBhdCB0aGlzIHRpbWUgKi8KKworCWVDc3JFbmNyeXB0aW9uVHlwZSB1Y0VuY3J5cHRpb25UeXBlOyAgICAvKiBQcmVmZXJyZWQgRW5jcnlwdGlvbiB0eXBlIHRoYXQgbWF0Y2hlZCB3aXRoIHByb2ZpbGUuICovCisJZUNzckVuY3J5cHRpb25UeXBlIG1jRW5jcnlwdGlvblR5cGU7CisJZUNzckF1dGhUeXBlIGF1dGhUeXBlOyAgLyogUHJlZmVycmVkIGF1dGggdHlwZSB0aGF0IG1hdGNoZWQgd2l0aCB0aGUgcHJvZmlsZS4gKi8KKworCXRDc3JTY2FuUmVzdWx0SW5mbyBSZXN1bHQ7Cit9IHRDc3JTY2FuUmVzdWx0OworCit0eXBlZGVmIHN0cnVjdCB7CisJdERibExpbmtMaXN0IExpc3Q7CisJdExpc3RFbGVtICpwQ3VyRW50cnk7Cit9IHRTY2FuUmVzdWx0TGlzdDsKKworI2RlZmluZSBDU1JfSVNfUk9BTV9SRUFTT04ocENtZCwgcmVhc29uKSAoKHJlYXNvbikgPT0gKHBDbWQpLT5yb2FtQ21kLnJvYW1SZWFzb24pCisjZGVmaW5lIENTUl9JU19CRVRURVJfUFJFRkVSX1ZBTFVFKHYxLCB2MikgICAoKHYxKSA+ICh2MikpCisjZGVmaW5lIENTUl9JU19FUVVBTF9QUkVGRVJfVkFMVUUodjEsIHYyKSAgICgodjEpID09ICh2MikpCisjZGVmaW5lIENTUl9JU19CRVRURVJfQ0FQX1ZBTFVFKHYxLCB2MikgICAgICgodjEpID4gKHYyKSkKKyNkZWZpbmUgQ1NSX0lTX0VRVUFMX0NBUF9WQUxVRSh2MSwgdjIpICAoKHYxKSA9PSAodjIpKQorI2RlZmluZSBDU1JfSVNfQkVUVEVSX1JTU0kodjEsIHYyKSAgICgodjEpID4gKHYyKSkKKyNkZWZpbmUgQ1NSX0lTX0VOQ19UWVBFX1NUQVRJQyhlbmNUeXBlKSAoKGVDU1JfRU5DUllQVF9UWVBFX05PTkUgPT0gKGVuY1R5cGUpKSB8fCBcCisJCQkJCSAgICAoZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZID09IChlbmNUeXBlKSkgfHwgXAorCQkJCQkgICAgKGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVkgPT0gKGVuY1R5cGUpKSkKKyNkZWZpbmUgQ1NSX0lTX1dBSVRfRk9SX0tFWShwTWFjLCBzZXNzaW9uSWQpIFwKKwkJIChDU1JfSVNfUk9BTV9KT0lORUQocE1hYywgc2Vzc2lvbklkKSAmJiBcCisJCSAgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfV0FJVEZPUktFWShwTWFjLCBzZXNzaW9uSWQpKQorLyogV0lGSSBoYXMgYSB0ZXN0IGNhc2UgZm9yIG5vdCB1c2luZyBIVCByYXRlcyB3aXRoIFRLSVAgYXMgZW5jcnlwdGlvbiAqLworLyogV2UgbWF5IG5lZWQgdG8gYWRkIFdFUCBidXQgZm9yIG5vdywgVEtJUCBvbmx5LiAqLworCisjZGVmaW5lIENTUl9JU18xMW5fQUxMT1dFRChlbmNUeXBlKSAoKGVDU1JfRU5DUllQVF9UWVBFX1RLSVAgIT0gKGVuY1R5cGUpKSAmJiBcCisJCQkJICAgICAgIChlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVkgIT0gKGVuY1R5cGUpKSAmJiBcCisJCQkJICAgICAgIChlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZICE9IChlbmNUeXBlKSkgJiYgXAorCQkJCSAgICAgICAoZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDAgIT0gKGVuY1R5cGUpKSAmJiBcCisJCQkJICAgICAgIChlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQgIT0gKGVuY1R5cGUpKSkKKworI2RlZmluZSBDU1JfSVNfRElTQ09OTkVDVF9DT01NQU5EKHBDb21tYW5kKSAoKGVTbWVDb21tYW5kUm9hbSA9PSAocENvbW1hbmQpLT5jb21tYW5kKSAmJiBcCisJCQkJCSAgICAgICgoZUNzckZvcmNlZERpc2Fzc29jID09IChwQ29tbWFuZCktPnUucm9hbUNtZC5yb2FtUmVhc29uKSB8fCBcCisJCQkJCQkoZUNzckZvcmNlZERlYXV0aCA9PSAocENvbW1hbmQpLT51LnJvYW1DbWQucm9hbVJlYXNvbikgfHwgXAorCQkJCQkJKGVDc3JTbWVJc3N1ZWREaXNhc3NvY0ZvckhhbmRvZmYgPT0gXAorCQkJCQkJICAocENvbW1hbmQpLT51LnJvYW1DbWQucm9hbVJlYXNvbikgfHwJXAorCQkJCQkJKGVDc3JGb3JjZWREaXNhc3NvY01JQ0ZhaWx1cmUgPT0gXAorCQkJCQkJICAocENvbW1hbmQpLT51LnJvYW1DbWQucm9hbVJlYXNvbikpKQorCitleHRlcm4gY29uc3QgdFJmQ2hhbm5lbFByb3BzIHJmX2NoYW5uZWxzW05VTV9SRl9DSEFOTkVMU107CitlQ3NyUm9hbVN0YXRlIGNzcl9yb2FtX3N0YXRlX2NoYW5nZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICBlQ3NyUm9hbVN0YXRlIE5ld1JvYW1TdGF0ZSwgdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBjc3Jfc2Nhbm5pbmdfc3RhdGVfbXNnX3Byb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKTsKK3ZvaWQgY3NyX3JvYW1pbmdfc3RhdGVfbXNnX3Byb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKTsKK3ZvaWQgY3NyX3JvYW1fam9pbmVkX3N0YXRlX21zZ19wcm9jZXNzb3IodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqcE1zZ0J1Zik7Citib29sIGNzcl9zY2FuX2NvbXBsZXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVTY2FuUnNwICpwU2NhblJzcCk7Cit2b2lkIGNzcl9yZWxlYXNlX2NvbW1hbmRfcm9hbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCk7Cit2b2lkIGNzcl9yZWxlYXNlX2NvbW1hbmRfc2Nhbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCk7Cit2b2lkIGNzcl9yZWxlYXNlX2NvbW1hbmRfd21fc3RhdHVzX2NoYW5nZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCk7CitleHRlcm4gdm9pZCBjc3JfcmVsZWFzZV9yb2NfcmVxX2NtZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4KTsKKworYm9vbCBjc3JfaXNfZHVwbGljYXRlX2Jzc19kZXNjcmlwdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MxLAorCQkJCSAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MyLAorCQkJCSAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMyLCBib29sIGZGb3JjZWQpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9zYXZlX2Nvbm5lY3RlZF9ic3NfZGVzYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjKTsKK2Jvb2wgY3NyX2lzX25ldHdvcmtfdHlwZV9lcXVhbCh0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMSwKKwkJCSAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMik7CitDREZfU1RBVFVTIGNzcl9zY2FuX3NtZV9zY2FuX3Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpOworLyoKKyAgIFByZXBhcmUgYSBmaWx0ZXIgYmFzZSBvbiBhIHByb2ZpbGUgZm9yIHBhcnNpbmcgdGhlIHNjYW4gcmVzdWx0cy4KKyAgIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIGNhbGxlciBNVVNUIGNhbGwgY3NyX2ZyZWVfc2Nhbl9maWx0ZXIgb24KKyAgIHBTY2FuRmlsdGVyIHdoZW4gaXQgaXMgZG9uZSB3aXRoIHRoZSBmaWx0ZXIuCisgKi8KK0NERl9TVEFUVVMgY3NyX3JvYW1fcHJlcGFyZV9maWx0ZXJfZnJvbV9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQl0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJCQkJdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyKTsKK0NERl9TVEFUVVMgY3NyX3JvYW1fY29weV9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIHRDc3JSb2FtUHJvZmlsZSAqcERzdFByb2ZpbGUsCisJCQkJIHRDc3JSb2FtUHJvZmlsZSAqcFNyY1Byb2ZpbGUpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9zdGFydCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyX3JvYW1fc3RvcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpOwordm9pZCBjc3Jfcm9hbV9zdGFydE1JQ0ZhaWx1cmVUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyX3JvYW1fc3RvcE1JQ0ZhaWx1cmVUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyX3JvYW1fc3RhcnRUS0lQQ291bnRlck1lYXN1cmVUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyX3JvYW1fc3RvcFRLSVBDb3VudGVyTWVhc3VyZVRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCitDREZfU1RBVFVTIGNzcl9zY2FuX29wZW4odHBBbmlTaXJHbG9iYWwgcE1hYyk7CitDREZfU1RBVFVTIGNzcl9zY2FuX2Nsb3NlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9yZXF1ZXN0X2xvc3RfbGluazEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgY3NyX3NjYW5fcmVxdWVzdF9sb3N0X2xpbmsyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7CitDREZfU1RBVFVTIGNzcl9zY2FuX3JlcXVlc3RfbG9zdF9saW5rMyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9oYW5kbGVfZmFpbGVkX2xvc3RsaW5rMSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgdWludDMyX3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgY3NyX3NjYW5faGFuZGxlX2ZhaWxlZF9sb3N0bGluazIodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgIHVpbnQzMl90IHNlc3Npb25JZCk7CitDREZfU1RBVFVTIGNzcl9zY2FuX2hhbmRsZV9mYWlsZWRfbG9zdGxpbmszKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICB1aW50MzJfdCBzZXNzaW9uSWQpOwordENzclNjYW5SZXN1bHQgKmNzcl9zY2FuX2FwcGVuZF9ic3NfZGVzY3JpcHRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCXRTaXJCc3NEZXNjcmlwdGlvbiAqCisJCQkJCQlwU2lyQnNzRGVzY3JpcHRpb24sCisJCQkJCQl0RG90MTFmQmVhY29uSUVzICpwSWVzLAorCQkJCQkJYm9vbCBmRm9yY2VkLCB1aW50OF90IHNlc3Npb25JZCk7Cit2b2lkIGNzcl9zY2FuX2NhbGxfY2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsCisJCQkgICAgZUNzclNjYW5TdGF0dXMgc2NhblN0YXR1cyk7CitDREZfU1RBVFVTIGNzcl9zY2FuX2NvcHlfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlcXVlc3QgKnBEc3RSZXEsCisJCQkJIHRDc3JTY2FuUmVxdWVzdCAqcFNyY1JlcSk7CitDREZfU1RBVFVTIGNzcl9zY2FuX2ZyZWVfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlcXVlc3QgKnBSZXEpOworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9jb3B5X3Jlc3VsdF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTY2FuUmVzdWx0SGFuZGxlIGhJbiwKKwkJCQkgICAgIHRTY2FuUmVzdWx0SGFuZGxlICpwaFJlc3VsdCk7CitDREZfU1RBVFVTIGNzcl9zY2FuX2Zvcl9zc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCSAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdWludDMyX3Qgcm9hbUlkLAorCQkJICAgICBib29sIG5vdGlmeSk7CitDREZfU1RBVFVTIGNzcl9zY2FuX3N0YXJ0X3Jlc3VsdF9jZmdfYWdpbmdfdGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitDREZfU1RBVFVTIGNzcl9zY2FuX3N0b3BfcmVzdWx0X2NmZ19hZ2luZ190aW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyX3NjYW5fc3RvcF90aW1lcnModHBBbmlTaXJHbG9iYWwgcE1hYyk7CisvKiBUbyByZW1vdmUgZnJlc2ggc2NhbiBjb21tYW5kcyBmcm9tIHRoZSBwZW5kaW5nIHF1ZXVlICovCitib29sIGNzcl9zY2FuX3JlbW92ZV9mcmVzaF9zY2FuX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9hYm9ydF9tYWNfc2Nhbih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkgICBlQ3NyQWJvcnRSZWFzb24gcmVhc29uKTsKK3ZvaWQgY3NyX3JlbW92ZV9jbWRfZnJvbV9wZW5kaW5nX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdERibExpbmtMaXN0ICpwTGlzdCwKKwkJCQkgICAgICBlU21lQ29tbWFuZFR5cGUgY29tbWFuZFR5cGUpOwordm9pZCBjc3JfcmVtb3ZlX2NtZF93aXRoX3Nlc3Npb25faWRfZnJvbV9wZW5kaW5nX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkJICAgICAgdERibExpbmtMaXN0ICpwTGlzdCwKKwkJCQkJCSAgICAgIGVTbWVDb21tYW5kVHlwZSBjb21tYW5kVHlwZSk7CitDREZfU1RBVFVTIGNzcl9zY2FuX2Fib3J0X21hY19zY2FuX25vdF9mb3JfY29ubmVjdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgdWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9hYm9ydF9zY2FuX2Zvcl9zc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7Cit2b2lkIGNzcl9yZW1vdmVfc2Nhbl9mb3Jfc3NpZF9mcm9tX3BlbmRpbmdfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdERibExpbmtMaXN0ICpwTGlzdCwKKwkJCQkJCXVpbnQzMl90IHNlc3Npb25JZCk7CisKK0NERl9TVEFUVVMgY3NyX2Fib3J0X3NjYW5fZnJvbV9hY3RpdmVfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0RGJsTGlua0xpc3QgKnBMaXN0LCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCWVTbWVDb21tYW5kVHlwZSBzY2FuX2NtZF90eXBlLCBlQ3NyQWJvcnRSZWFzb24gYWJvcnRfcmVhc29uKTsKKworLyogVG8gYWdlIG91dCBzY2FuIHJlc3VsdHMgYmFzZS4gdFNtZUdldFNjYW5DaG5Sc3AgaXMgYSBwb2ludGVyIHJldHVybmVkIGJ5IExJTSB0aGF0ICovCisvKiBoYXMgdGhlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBzY2FubmVkIGNoYW5uZWxzLiAqLworLyogVGhlIGxvZ2ljIGlzIHRoYXQgd2hlbmV2ZXIgQ1NSIGFkZCBhIEJTUyB0byBzY2FuIHJlc3VsdCwgaXQgc2V0IHRoZSBhZ2UgY291bnQgdG8gKi8KKy8qIGEgdmFsdWUuIFRoaXMgZnVuY3Rpb24gZGVkdWN0IHRoZSBhZ2UgY291bnQgaWYgY2hhbm5lbElkIG1hdGNoZXMgdGhlIEJTUycgY2hhbm5lbElkICovCisvKiBUaGUgQlNTIGlzIHJlbW92ZSBpZiB0aGUgY291bnQgcmVhY2hlcyAwLiAqLworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9hZ2VfcmVzdWx0cyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCXRTbWVHZXRTY2FuQ2huUnNwICpwU2NhbkNobkluZm8pOworCisvKiBJZiBmRm9yY2UgaXMgdHJ1ZSB3ZSB3aWxsIHNhdmUgdGhlIG5ldyBTdHJpbmcgdGhhdCBpcyBsZWFybid0LiAqLworLyogVHlwaWNhbGx5IGl0IHdpbGwgYmUgdHJ1ZSBpbiBjYXNlIG9mIEpvaW4gb3IgdXNlciBpbml0aWF0ZWQgaW9jdGwgKi8KK2Jvb2wgY3NyX2xlYXJuXzExZGNvdW50cnlfaW5mb3JtYXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLAorCQkJCSAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIGJvb2wgZkZvcmNlKTsKK3ZvaWQgY3NyX2FwcGx5X2NvdW50cnlfaW5mb3JtYXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGNzcl9zZXRfY2ZnX3NjYW5fY29udHJvbF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKmNvdW50cnlDb2RlLAorCQkJCSAgIHRDc3JDaGFubmVsICpwQ2hhbm5lbExpc3QpOwordm9pZCBjc3JfcmVpbml0X3NjYW5fY21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKTsKK3ZvaWQgY3NyX2ZyZWVfc2Nhbl9yZXN1bHRfZW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclNjYW5SZXN1bHQgKnBSZXN1bHQpOworCitDREZfU1RBVFVTIGNzcl9yb2FtX2NhbGxfY2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgdENzclJvYW1JbmZvICpwUm9hbUluZm8sIHVpbnQzMl90IHJvYW1JZCwKKwkJCQkgIGVSb2FtQ21kU3RhdHVzIHUxLCBlQ3NyUm9hbVJlc3VsdCB1Mik7CitDREZfU1RBVFVTIGNzcl9yb2FtX2lzc3VlX2Nvbm5lY3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCQkgIHRTY2FuUmVzdWx0SGFuZGxlIGhCU1NMaXN0LAorCQkJCSAgZUNzclJvYW1SZWFzb24gcmVhc29uLCB1aW50MzJfdCByb2FtSWQsCisJCQkJICBib29sIGZJbWVkaWF0ZSwgYm9vbCBmQ2xlYXJTY2FuKTsKK0NERl9TVEFUVVMgY3NyX3JvYW1faXNzdWVfcmVhc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJCSAgdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzICpwTW9kUHJvZmlsZUZpZWxkcywKKwkJCQkgIGVDc3JSb2FtUmVhc29uIHJlYXNvbiwgdWludDMyX3Qgcm9hbUlkLAorCQkJCSAgYm9vbCBmSW1lZGlhdGUpOwordm9pZCBjc3Jfcm9hbV9jb21wbGV0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCBlQ3NyUm9hbUNvbXBsZXRlUmVzdWx0IFJlc3VsdCwKKwkJICAgICAgIHZvaWQgKkNvbnRleHQpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9pc3N1ZV9zZXRfY29udGV4dF9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgIGVDc3JFbmNyeXB0aW9uVHlwZSBFbmNyeXB0VHlwZSwKKwkJCQkJICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjcmlwdGlvbiwKKwkJCQkJICB0U2lyTWFjQWRkciAqYnNzSWQsIGJvb2wgYWRkS2V5LAorCQkJCQkgIGJvb2wgZlVuaWNhc3QsCisJCQkJCSAgdEFuaUtleURpcmVjdGlvbiBhbmlLZXlEaXJlY3Rpb24sCisJCQkJCSAgdWludDhfdCBrZXlJZCwgdWludDE2X3Qga2V5TGVuZ3RoLAorCQkJCQkgIHVpbnQ4X3QgKnBLZXksIHVpbnQ4X3QgcGFlUm9sZSk7CitDREZfU1RBVFVTIGNzcl9yb2FtX3Byb2Nlc3NfZGlzYXNzb2NfZGVhdXRoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kLAorCQkJCQkgICAgYm9vbCBmRGlzYXNzb2MsIGJvb2wgZk1JQ0ZhaWx1cmUpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9zYXZlX2Nvbm5lY3RlZF9pbmZvbWF0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCQkJICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJCQkJICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcyk7Cit2b2lkIGNzcl9yb2FtX2NoZWNrX2Zvcl9saW5rX3N0YXR1c19jaGFuZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclNtZVJzcCAqcFNpck1zZyk7Cit2b2lkIGNzcl9yb2FtX3N0YXRzX3JzcF9wcm9jZXNzb3IodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclNtZVJzcCAqcFNpck1zZyk7CitDREZfU1RBVFVTIGNzcl9yb2FtX2lzc3VlX3N0YXJ0X2Jzcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgIHRDc3JSb2FtU3RhcnRCc3NQYXJhbXMgKnBQYXJhbSwKKwkJCQkgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCQkgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgdWludDMyX3Qgcm9hbUlkKTsKK0NERl9TVEFUVVMgY3NyX3JvYW1faXNzdWVfc3RvcF9ic3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgIGVDc3JSb2FtU3ViU3RhdGUgTmV3U3Vic3RhdGUpOworYm9vbCBjc3JfaXNfc2FtZV9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcFByb2ZpbGUxLAorCQkJIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUyKTsKK2Jvb2wgY3NyX2lzX3JvYW1fY29tbWFuZF93YWl0aW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworYm9vbCBjc3JfaXNfcm9hbV9jb21tYW5kX3dhaXRpbmdfZm9yX3Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKK2Jvb2wgY3NyX2lzX3NjYW5fZm9yX3JvYW1fY29tbWFuZF9hY3RpdmUodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitlUm9hbUNtZFN0YXR1cyBjc3JfZ2V0X3JvYW1fY29tcGxldGVfc3RhdHVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICB1aW50MzJfdCBzZXNzaW9uSWQpOworLyogcEJhbmQgY2FuIGJlIE5VTEwgaWYgY2FsbGVyIGRvZXNuJ3QgbmVlZCB0byBnZXQgaXQgKi8KK0NERl9TVEFUVVMgY3NyX3JvYW1faXNzdWVfZGlzYXNzb2NpYXRlX2NtZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgIGVDc3JSb2FtRGlzY29ubmVjdFJlYXNvbiByZWFzb24pOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9kaXNjb25uZWN0X2ludGVybmFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJZUNzclJvYW1EaXNjb25uZWN0UmVhc29uIHJlYXNvbik7CisvKiBwQ29tbWFuZCBtYXkgYmUgTlVMTCAqLwordm9pZCBjc3Jfcm9hbV9yZW1vdmVfZHVwbGljYXRlX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgICB0U21lQ21kICpwQ29tbWFuZCwKKwkJCQkgICAgICAgZUNzclJvYW1SZWFzb24gZVJvYW1SZWFzb24pOworCitDREZfU1RBVFVTIGNzcl9zZW5kX2pvaW5fcmVxX21zZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyaXB0aW9uLAorCQkJCSB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJCSB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB1aW50MTZfdCBtZXNzYWdlVHlwZSk7CitDREZfU1RBVFVTIGNzcl9zZW5kX21iX2Rpc2Fzc29jX3JlcV9tc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQl0U2lyTWFjQWRkciBic3NJZCwgdWludDE2X3QgcmVhc29uQ29kZSk7CitDREZfU1RBVFVTIGNzcl9zZW5kX21iX2RlYXV0aF9yZXFfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgICB0U2lyTWFjQWRkciBic3NJZCwgdWludDE2X3QgcmVhc29uQ29kZSk7CitDREZfU1RBVFVTIGNzcl9zZW5kX21iX2Rpc2Fzc29jX2NuZl9tc2codHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJdHBTaXJTbWVEaXNhc3NvY0luZCBwRGlzYXNzb2NJbmQpOworQ0RGX1NUQVRVUyBjc3Jfc2VuZF9tYl9kZWF1dGhfY25mX21zZyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgIHRwU2lyU21lRGVhdXRoSW5kIHBEZWF1dGhJbmQpOworQ0RGX1NUQVRVUyBjc3Jfc2VuZF9hc3NvY19jbmZfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyU21lQXNzb2NJbmQgcEFzc29jSW5kLAorCQkJCSAgQ0RGX1NUQVRVUyBzdGF0dXMpOworQ0RGX1NUQVRVUyBjc3Jfc2VuZF9hc3NvY19pbmRfdG9fdXBwZXJfbGF5ZXJfY25mX21zZyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgICB0cFNpclNtZUFzc29jSW5kIHBBc3NvY0luZCwKKwkJCQkJCSAgICAgQ0RGX1NUQVRVUyBIYWxzdGF0dXMsCisJCQkJCQkgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgY3NyX3NlbmRfbWJfc3RhcnRfYnNzX3JlcV9tc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgZUNzclJvYW1Cc3NUeXBlIGJzc1R5cGUsCisJCQkJCSB0Q3NyUm9hbVN0YXJ0QnNzUGFyYW1zICpwUGFyYW0sCisJCQkJCSB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjKTsKK0NERl9TVEFUVVMgY3NyX3NlbmRfbWJfc3RvcF9ic3NfcmVxX21zZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpOworCisvKiBDYWxsZXIgc2hvdWxkIHB1dCB0aGUgQlNTJyBzc2lkIHRvIGZpZWRsIGJzc1NzaWQgd2hlbiBjb21wYXJpbmcgU1NJRCBmb3IgYSBCU1MuICovCitib29sIGNzcl9pc19zc2lkX21hdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnNzaWQxLCB1aW50OF90IHNzaWQxTGVuLAorCQkgICAgICAgdWludDhfdCAqYnNzU3NpZCwgdWludDhfdCBic3NTc2lkTGVuLCBib29sIGZTc2lkUmVxdWlyZWQpOworYm9vbCBjc3JfaXNfcGh5X21vZGVfbWF0Y2godHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgcGh5TW9kZSwKKwkJCSAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCQkgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJICAgZUNzckNmZ0RvdDExTW9kZSAqcFJldHVybkNmZ0RvdDExTW9kZSwKKwkJCSAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpOworYm9vbCBjc3Jfcm9hbV9pc19jaGFubmVsX3ZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgY2hhbm5lbCk7CisKKy8qIHBOdW1DaGFuIGlzIGEgY2FsbGVyIGFsbG9jYXRlZCBzcGFjZSB3aXRoIHRoZSBzaXplb2YgcENoYW5uZWxzICovCitDREZfU1RBVFVTIGNzcl9nZXRfY2ZnX3ZhbGlkX2NoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBDaGFubmVscywKKwkJCQkgICAgICB1aW50MzJfdCAqcE51bUNoYW4pOwordm9pZCBjc3Jfcm9hbV9jY21fY2ZnX3NldF9jYWxsYmFjayh0cEFuaVNpckdsb2JhbCBwTWFjLCBpbnQzMl90IHJlc3VsdCk7CisKK3RQb3dlcmRCbSBjc3JfZ2V0X2NmZ19tYXhfdHhfcG93ZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBjaGFubmVsKTsKKworLyogVG8gZnJlZSB0aGUgbGFzdCByb2FtaW5nIHByb2ZpbGUgKi8KK3ZvaWQgY3NyX2ZyZWVfcm9hbV9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7Cit2b2lkIGNzcl9mcmVlX2Nvbm5lY3RfYnNzX2Rlc2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKK0NERl9TVEFUVVMgY3NyX21vdmVfYnNzX3RvX2hlYWRfZnJvbV9ic3NpZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICBzdHJ1Y3QgY2RmX21hY19hZGRyICpic3NpZCwKKwkJCQkJICAgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5SZXN1bHQpOworYm9vbCBjc3JfY2hlY2tfcHNfcmVhZHkodm9pZCAqcHYpOworYm9vbCBjc3JfY2hlY2tfcHNfb2ZmbG9hZF9yZWFkeSh2b2lkICpwdiwgdWludDMyX3Qgc2Vzc2lvbklkKTsKKworLyogdG8gZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGluc2lkZSB0aGUgcHJvZmlsZSBzdHJ1Y3R1cmUgKi8KK3ZvaWQgY3NyX3JlbGVhc2VfcHJvZmlsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlKTsKKy8qIFRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBpbnNpZGUgc2NhbkZpbHRlciAqLwordm9pZCBjc3JfZnJlZV9zY2FuX2ZpbHRlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXIpOworZUNzckNmZ0RvdDExTW9kZSBjc3JfZ2V0X2NmZ19kb3QxMV9tb2RlX2Zyb21fY3NyX3BoeV9tb2RlKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJCQkJICBlQ3NyUGh5TW9kZSBwaHlNb2RlLAorCQkJCQkJCSAgYm9vbCBmUHJvcHJpZXRhcnkpOwordWludDMyX3QgY3NyX3RyYW5zbGF0ZV90b193bmlfY2ZnX2RvdDExX21vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICBlQ3NyQ2ZnRG90MTFNb2RlIGNzckRvdDExTW9kZSk7Cit2b2lkIGNzcl9zYXZlX2NoYW5uZWxfcG93ZXJfZm9yX2JhbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgYm9vbCBmUG9wdWxhdGU1R0JhbmQpOwordm9pZCBjc3JfYXBwbHlfY2hhbm5lbF9wb3dlcl9pbmZvX3RvX2Z3KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCXRDc3JDaGFubmVsICpwQ2hhbm5lbExpc3QsCisJCQkJCXVpbnQ4X3QgKmNvdW50cnlDb2RlKTsKK3ZvaWQgY3NyX2FwcGx5X3Bvd2VyMl9jdXJyZW50KHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBjc3JfYXNzaWduX3Jzc2lfZm9yX2NhdGVnb3J5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIGludDhfdCBiZXN0QXBSc3NpLAorCQkJCSAgdWludDhfdCBjYXRPZmZzZXQpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9yZW1vdmVfY29ubmVjdGVkX2Jzc19mcm9tX3NjYW5fY2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCQkgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICoKKwkJCQkJCQkgcENvbm5Qcm9maWxlKTsKK0NERl9TVEFUVVMgY3NyX3JvYW1fc3RhcnRfcm9hbWluZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICBlQ3NyUm9hbWluZ1JlYXNvbiByb2FtaW5nUmVhc29uKTsKKy8qIHJldHVybiBhIGJvb2wgdG8gaW5kaWNhdGUgd2hldGhlciByb2FtaW5nIGNvbXBsZXRlZCBvciBjb250aW51ZS4gKi8KK2Jvb2wgY3NyX3JvYW1fY29tcGxldGVfcm9hbWluZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgICAgICAgYm9vbCBmRm9yY2UsIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQpOwordm9pZCBjc3Jfcm9hbV9jb21wbGV0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCSB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywgdFNtZUNtZCAqcENvbW1hbmQsCisJCQkgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCwgYm9vbCBmU3VjY2Vzcyk7Cit2b2lkIGNzcl9yb2FtX2NhbmNlbF9yb2FtaW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7Cit2b2lkIGNzcl9hcHBseV9jaGFubmVsX3Bvd2VyX2luZm9fd3JhcHBlcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyX3Jlc2V0X3Bta2lkX2NhbmRpZGF0ZV9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKK3ZvaWQgY3NyX3Jlc2V0X2JraWRfY2FuZGlkYXRlX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworQ0RGX1NUQVRVUyBjc3Jfc2F2ZV90b19jaGFubmVsX3Bvd2VyMl9nXzVfZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCB0YWJsZVNpemUsCisJCQkJCSAgICB0U2lyTWFjQ2hhbkluZm8gKmNoYW5uZWxUYWJsZSk7CisKKy8qIFRvIGNoZWNrIHdoZXRoZXIgYSBjb3VudHJ5IGNvZGUgbWF0Y2hlcyB0aGUgb25lIGluIHRoZSBJRSAqLworLyogT25seSBjaGVjayB0aGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMsIGlnbm9yaW5nIGluL291dGRvb3IgKi8KKy8qIHBDb3VudHJ5IC0tIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIGNvbnRhaW4gdGhlIGNvdW50cnkgY29kZSB0aGF0IGlzIGNoZWNraW5nIGFnYWluc3QgKi8KKy8qIHRoZSBvbmUgaW4gcEllcy4gSXQgY2FuIGJlIE5VTEwuICovCisvKiBjYWxsZXIgbXVzdCBwcm92aWRlIHBJZXMsIGl0IGNhbm5vdCBiZSBOVUxMICovCisvKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm4gdHJ1ZSBpZiAxMWQgc3VwcG9ydCBpcyBub3QgdHVybmVkIG9uLiAqLworLyogcEllcyBjYW5ub3QgYmUgTlVMTCAqLworYm9vbCBjc3JfbWF0Y2hfY291bnRyeV9jb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBDb3VudHJ5LAorCQkJICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9zZXRfa2V5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCSAgICB0Q3NyUm9hbVNldEtleSAqcFNldEtleSwgdWludDMyX3Qgcm9hbUlkKTsKK0NERl9TVEFUVVMgY3NyX3JvYW1fb3Blbl9zZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIGNzcl9yb2FtX2NvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKnBDb250ZXh0LAorCQkJCSB1aW50OF90ICpwU2VsZk1hY0FkZHIsIHVpbnQ4X3QgKnBiU2Vzc2lvbklkLAorCQkJCSB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzdWJUeXBlKTsKKy8qIGZTeW5jOiB0cnVlIG1lYW5zIGNsZWFudXBuZWVkcyB0byBoYW5kbGUgc3luY2hyb25vdXNseS4gKi8KK0NERl9TVEFUVVMgY3NyX3JvYW1fY2xvc2Vfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICBib29sIGZTeW5jLAorCQkJCSAgY3NyX3JvYW1TZXNzaW9uQ2xvc2VDYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgIHZvaWQgKnBDb250ZXh0KTsKK3ZvaWQgY3NyX2NsZWFudXBfc2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9nZXRfc2Vzc2lvbl9pZF9mcm9tX2Jzc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHN0cnVjdCBjZGZfbWFjX2FkZHIgKmJzc2lkLAorCQkJCQkgICAgICB1aW50MzJfdCAqcFNlc3Npb25JZCk7CitlQ3NyQ2ZnRG90MTFNb2RlIGNzcl9maW5kX2Jlc3RfcGh5X21vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgcGh5TW9kZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfc2Nhbl9lbmFibGUKKyAgICBcYnJpZWYgRW5hYmxlIHRoZSBzY2FubmluZyBmZWF0dXJlIG9mIENTUi4gSXQgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBzY2FuIHJlcXVlc3QgY2FuIGJlIHBlcmZvcm1lZC4KKyAgICBccGFyYW0gdEhhbEhhbmRsZSAtIEhBTCBjb250ZXh0IGhhbmRsZQorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9zY2FuX2VuYWJsZSh0cEFuaVNpckdsb2JhbCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfc2Nhbl9kaXNhYmxlCisgICAgXGJyaWVmIERpc2FibGVpbmcgdGhlIHNjYW5uaW5nIGZlYXR1cmUgb2YgQ1NSLiBBZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybiBzdWNjZXNzLCBubyBzY2FuIGlzIHBlcmZvcm1lZCB1bnRpbAorICAgYSBzdWNjZXNzZnVsbCB0byBjc3Jfc2Nhbl9lbmFibGUKKyAgICBccGFyYW0gdEhhbEhhbmRsZSAtIEhBTCBjb250ZXh0IGhhbmRsZQorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9zY2FuX2Rpc2FibGUodHBBbmlTaXJHbG9iYWwpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9zY2FuX3JlcXVlc3QKKyAgICBcYnJpZWYgUmVxdWVzdCBhIDExZCBvciBmdWxsIHNjYW4uCisgICAgXHBhcmFtIGNhbGxiYWNrIC0gYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHNjYW4gY2FsbHMgdXBvbiBmaW5pc2gsIHdpbGwgbm90IGJlIGNhbGxlZCBpZiBjc3Jfc2Nhbl9yZXF1ZXN0IHJldHVybnMgZXJyb3IKKyAgICBccGFyYW0gcENvbnRleHQgLSBhIHBvaW50ZXIgcGFzc2VkIGluIGZvciB0aGUgY2FsbGJhY2sKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9yZXF1ZXN0KHRwQW5pU2lyR2xvYmFsLCB1aW50MTZfdCwgdENzclNjYW5SZXF1ZXN0ICosCisJCQljc3Jfc2Nhbl9jb21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwQ29udGV4dCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JTY2FuQWJvcnQKKyAgICBcYnJpZWYgSWYgYSBzY2FuIHJlcXVlc3QgaXMgYWJvcnQsIHRoZSBzY2FuIGNvbXBsZXRlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSBjc3JTY2FuQWJvcnQgcmV0dXJucy4KKyAgICBccGFyYW0gcFNjYW5SZXF1ZXN0SUQgLSBUaGUgcmVxdWVzdCBJRCByZXR1cm5lZCBmcm9tIGNzcl9zY2FuX3JlcXVlc3QKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3JTY2FuQWJvcnQodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90IHNjYW5SZXF1ZXN0SUQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyX3NjYW5fZ2V0X3Jlc3VsdAorICAgIFxicmllZiBSZXR1cm4gc2NhbiByZXN1bHRzLgorICAgIFxwYXJhbSBwRmlsdGVyIC0gSWYgcEZpbHRlciBpcyBOVUxMLCBhbGwgY2FjaGVkIHJlc3VsdHMgYXJlIHJldHVybmVkCisgICAgXHBhcmFtIHBoUmVzdWx0IC0gYW4gb2JqZWN0IGZvciB0aGUgcmVzdWx0LgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9zY2FuX2dldF9yZXN1bHQodHBBbmlTaXJHbG9iYWwsIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwRmlsdGVyLAorCQkJICAgICAgIHRTY2FuUmVzdWx0SGFuZGxlICpwaFJlc3VsdCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfc2Nhbl9mbHVzaF9yZXN1bHQKKyAgICBcYnJpZWYgQ2xlYXIgc2NhbiByZXN1bHRzLgorICAgIFxwYXJhbSBwTWFjIC0gcE1hYyBnbG9iYWwgcG9pbnRlcgorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBTZXNzaW9uIElkZW50aWZpZXIKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9mbHVzaF9yZXN1bHQodHBBbmlTaXJHbG9iYWwpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgXGZuIGNzcl9zY2FuX2ZpbHRlcl9yZXN1bHRzCisgKiAgXGJyaWVmIEZpbHRlciBzY2FuIHJlc3VsdHMgYmFzZWQgb24gdmFsaWQgY2hhbm5lbCBsaXN0LgorICogIFxwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqICBccmV0dXJuIENERl9TVEFUVVMKKyAqKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK0NERl9TVEFUVVMgY3NyX3NjYW5fZmlsdGVyX3Jlc3VsdHModHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKK3ZvaWQgY3NyX3NhdmVfc2Nhbl9yZXN1bHRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgcmVhc29uLAorCQkJCSAgdWludDhfdCBzZXNzaW9uSWQpOworCitDREZfU1RBVFVTIGNzcl9zY2FuX2ZsdXNoX3NlbGVjdGl2ZV9yZXN1bHQodHBBbmlTaXJHbG9iYWwsIGJvb2wgZmx1c2hQMlApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyX3NjYW5fcmVzdWx0X2dldF9maXJzdAorICAgIFxicmllZiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIHNjYW4gcmVzdWx0LgorICAgIFxwYXJhbSBoU2NhblJlc3VsdCAtIHJldHVybmVkIGZyb20gY3NyX3NjYW5fZ2V0X3Jlc3VsdAorICAgIFxyZXR1cm4gdENzclNjYW5SZXN1bHRJbmZvICogLSBOVUxMIGlmIG5vIHJlc3VsdAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0Q3NyU2NhblJlc3VsdEluZm8gKmNzcl9zY2FuX3Jlc3VsdF9nZXRfZmlyc3QodHBBbmlTaXJHbG9iYWwsCisJCQkJCSAgICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0KTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfc2Nhbl9yZXN1bHRfZ2V0X25leHQKKyAgICBcYnJpZWYgUmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IG9mIHNjYW4gcmVzdWx0LiBJdCBjYW4gYmUgY2FsbGVkIHdpdGhvdXQgY2FsbGluZyBjc3Jfc2Nhbl9yZXN1bHRfZ2V0X2ZpcnN0IGZpcnN0CisgICAgXHBhcmFtIGhTY2FuUmVzdWx0IC0gcmV0dXJuZWQgZnJvbSBjc3Jfc2Nhbl9nZXRfcmVzdWx0CisgICAgXHJldHVybiBOdWxsIGlmIG5vIHJlc3VsdCBvciByZWFjaCB0aGUgZW5kCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RDc3JTY2FuUmVzdWx0SW5mbyAqY3NyX3NjYW5fcmVzdWx0X2dldF9uZXh0KHRwQW5pU2lyR2xvYmFsLAorCQkJCQkgICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9nZXRfY291bnRyeV9jb2RlCisgICAgXGJyaWVmIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSBjb3VudHJ5IGNvZGUgY3VycmVudCBiZWluZyB1c2VkCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IDMgYnl0ZXMsIHVwb24gc3VjY2VzcyByZXR1cm4sIHRoaXMgaGFzIHRoZSBjb3VudHJ5IGNvZGUKKyAgICBccGFyYW0gcGJMZW4gLSBDYWxsZXIgYWxsb2NhdGVkLCBhcyBpbnB1dCwgaXQgaW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgcEJ1Zi4gVXBvbiBzdWNjZXNzIHJldHVybiwKKyAgICB0aGlzIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gcEJ1ZgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9nZXRfY291bnRyeV9jb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBCdWYsCisJCQkJdWludDhfdCAqcGJMZW4pOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyX3NldF9jb3VudHJ5X2NvZGUKKyAgICBcYnJpZWYgdGhpcyBmdW5jdGlvbiBpcyB0byBzZXQgdGhlIGNvdW50cnkgY29kZSBzbyBjaGFubmVsL3Bvd2VyIHNldHRpbmcgbWF0Y2hlcyB0aGUgY291bnRyeWNvZGUgYW5kCisgICAgdGhlIGRvbWFpbiBpdCBiZWxvbmdzIHRvLgorICAgIFxwYXJhbSBwQ291bnRyeSAtIENhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHdpdGggYXQgbGVhc3QgMyBieXRlcyBzcGVjaWZ5aW5nIHRoZSBjb3VudHJ5IGNvZGUKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3Jfc2V0X2NvdW50cnlfY29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwQ291bnRyeSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JfZ2V0X3JlZ3VsYXRvcnlfZG9tYWluX2Zvcl9jb3VudHJ5CisgICAgXGJyaWVmIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSByZWd1bGF0b3J5IGRvbWFpbiBmb3IgYSBjb3VudHJ5LgorICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQ0ZHIGlzIGRvd25sb2FkZWQgYW5kIGFsbCB0aGUgYmFuZC9tb2RlIHNldHRpbmcgYWxyZWFkeSBwYXNzZWQgaW50bworICAgIENTUi4KKyAgICBccGFyYW0gcENvdW50cnkgLSBDYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IDMgYnl0ZXMgc3BlY2lmeWluZyB0aGUgY291bnRyeSBjb2RlCisgICAgXHBhcmFtIHBEb21haW5JZCAtIENhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHRvIGdldCB0aGUgcmV0dXJuIGRvbWFpbiBJRCB1cG9uIHN1Y2Nlc3MgcmV0dXJuLiBDYW4gYmUgTlVMTC4KKyAgICBccGFyYW0gc291cmNlIC0gdGhlIHNvdXJjZSBvZiBjb3VudHJ5IGluZm9ybWF0aW9uLgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9nZXRfcmVndWxhdG9yeV9kb21haW5fZm9yX2NvdW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSB1aW50OF90ICpwQ291bnRyeSwKKwkJCQkJCSB2X1JFR0RPTUFJTl90ICpwRG9tYWluSWQsCisJCQkJCQkgdl9Db3VudHJ5SW5mb1NvdXJjZV90IHNvdXJjZSk7CisKKy8qIHNvbWUgc3VwcG9ydCBmdW5jdGlvbnMgKi8KK2Jvb2wgY3NyX2lzMTFkX3N1cHBvcnRlZCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2Jvb2wgY3NyX2lzMTFoX3N1cHBvcnRlZCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2Jvb2wgY3NyX2lzMTFlX3N1cHBvcnRlZCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2Jvb2wgY3NyX2lzX3dtbV9zdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Citib29sIGNzcl9pc19tY2Nfc3VwcG9ydGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvKiBSZXR1cm4gU1VDQ0VTUyBpcyB0aGUgY29tbWFuZCBpcyBxdWV1ZWQsIGZhaWxlZCAqLworQ0RGX1NUQVRVUyBjc3JfcXVldWVfc21lX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsCisJCQkJIGJvb2wgZkhpZ2hQcmlvcml0eSk7Cit0U21lQ21kICpjc3JfZ2V0X2NvbW1hbmRfYnVmZmVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBjc3JfcmVsZWFzZV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKTsKK3ZvaWQgY3NyX3NjYW5fZmx1c2hfYnNzX2VudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgICB0cFNtZUNzYU9mZmxvYWRJbmQgcENzYU9mZmxvYWRJbmQpOworQ0RGX1NUQVRVUyBjc3JfZ2V0X2FjdGl2ZV9zY2FuX2VudHJ5KHRwQW5pU2lyR2xvYmFsIG1hYywgdWludDMyX3Qgc2Nhbl9pZCwKKwl0TGlzdEVsZW0gKiplbnRyeSk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorYm9vbCBjc3JfaXNfcHJvZmlsZV93YXBpKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCisvKiBTZWN1cml0eSAqLworI2RlZmluZSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1NFVF9QVEtfUkVRICAgICAxCisjZGVmaW5lIFdMQU5fU0VDVVJJVFlfRVZFTlRfU0VUX1BUS19SU1AgICAgIDIKKyNkZWZpbmUgV0xBTl9TRUNVUklUWV9FVkVOVF9TRVRfR1RLX1JFUSAgICAgMworI2RlZmluZSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1NFVF9HVEtfUlNQICAgICA0CisjZGVmaW5lIFdMQU5fU0VDVVJJVFlfRVZFTlRfUkVNT1ZFX0tFWV9SRVEgIDUKKyNkZWZpbmUgV0xBTl9TRUNVUklUWV9FVkVOVF9SRU1PVkVfS0VZX1JTUCAgNgorI2RlZmluZSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1BNS0lEX0NBTkRJREFURV9GT1VORCAgNworI2RlZmluZSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1BNS0lEX1VQREFURSAgICA4CisjZGVmaW5lIFdMQU5fU0VDVVJJVFlfRVZFTlRfTUlDX0VSUk9SICAgICAgIDkKKworI2RlZmluZSBBVVRIX09QRU4gICAgICAgMAorI2RlZmluZSBBVVRIX1NIQVJFRCAgICAgMQorI2RlZmluZSBBVVRIX1dQQV9FQVAgICAgMgorI2RlZmluZSBBVVRIX1dQQV9QU0sgICAgMworI2RlZmluZSBBVVRIX1dQQTJfRUFQICAgNAorI2RlZmluZSBBVVRIX1dQQTJfUFNLICAgNQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisjZGVmaW5lIEFVVEhfV0FQSV9DRVJUICA2CisjZGVmaW5lIEFVVEhfV0FQSV9QU0sgICA3CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKworI2RlZmluZSBFTkNfTU9ERV9PUEVOICAgMAorI2RlZmluZSBFTkNfTU9ERV9XRVA0MCAgMQorI2RlZmluZSBFTkNfTU9ERV9XRVAxMDQgMgorI2RlZmluZSBFTkNfTU9ERV9US0lQICAgMworI2RlZmluZSBFTkNfTU9ERV9BRVMgICAgNAorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisjZGVmaW5lIEVOQ19NT0RFX1NNUzQgICA1ICAgICAgIC8qIFdBUEkgKi8KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisjZGVmaW5lIE5PX01BVENIICAgIDAKKyNkZWZpbmUgTUFUQ0ggICAgICAgMQorCisjZGVmaW5lIFdMQU5fU0VDVVJJVFlfU1RBVFVTX1NVQ0NFU1MgICAgICAgIDAKKyNkZWZpbmUgV0xBTl9TRUNVUklUWV9TVEFUVVNfRkFJTFVSRSAgICAgICAgMQorCisvKiBTY2FuICovCisjZGVmaW5lIFdMQU5fU0NBTl9FVkVOVF9BQ1RJVkVfU0NBTl9SRVEgICAgIDEKKyNkZWZpbmUgV0xBTl9TQ0FOX0VWRU5UX0FDVElWRV9TQ0FOX1JTUCAgICAgMgorI2RlZmluZSBXTEFOX1NDQU5fRVZFTlRfUEFTU0lWRV9TQ0FOX1JFUSAgICAzCisjZGVmaW5lIFdMQU5fU0NBTl9FVkVOVF9QQVNTSVZFX1NDQU5fUlNQICAgIDQKKyNkZWZpbmUgV0xBTl9TQ0FOX0VWRU5UX0hPX1NDQU5fUkVRICAgICAgICAgNQorI2RlZmluZSBXTEFOX1NDQU5fRVZFTlRfSE9fU0NBTl9SU1AgICAgICAgICA2CisKKyNkZWZpbmUgV0xBTl9TQ0FOX1NUQVRVU19TVUNDRVNTICAgICAgICAwCisjZGVmaW5lIFdMQU5fU0NBTl9TVEFUVVNfRkFJTFVSRSAgICAgICAgMQorI2RlZmluZSBXTEFOX1NDQU5fU1RBVFVTX0FCT1JUICAgICAgICAgIDIKKworLyogSWJzcyAqLworI2RlZmluZSBXTEFOX0lCU1NfRVZFTlRfU1RBUlRfSUJTU19SRVEgICAgICAwCisjZGVmaW5lIFdMQU5fSUJTU19FVkVOVF9TVEFSVF9JQlNTX1JTUCAgICAgIDEKKyNkZWZpbmUgV0xBTl9JQlNTX0VWRU5UX0pPSU5fSUJTU19SRVEgICAgICAgMgorI2RlZmluZSBXTEFOX0lCU1NfRVZFTlRfSk9JTl9JQlNTX1JTUCAgICAgICAzCisjZGVmaW5lIFdMQU5fSUJTU19FVkVOVF9DT0FMRVNDSU5HICAgICAgICAgIDQKKyNkZWZpbmUgV0xBTl9JQlNTX0VWRU5UX1BFRVJfSk9JTiAgICAgICAgICAgNQorI2RlZmluZSBXTEFOX0lCU1NfRVZFTlRfUEVFUl9MRUFWRSAgICAgICAgICA2CisjZGVmaW5lIFdMQU5fSUJTU19FVkVOVF9TVE9QX1JFUSAgICAgICAgICAgIDcKKyNkZWZpbmUgV0xBTl9JQlNTX0VWRU5UX1NUT1BfUlNQICAgICAgICAgICAgOAorCisjZGVmaW5lIEFVVE9fUElDSyAgICAgICAwCisjZGVmaW5lIFNQRUNJRklFRCAgICAgICAxCisKKyNkZWZpbmUgV0xBTl9JQlNTX1NUQVRVU19TVUNDRVNTICAgICAgICAwCisjZGVmaW5lIFdMQU5fSUJTU19TVEFUVVNfRkFJTFVSRSAgICAgICAgMQorCisvKiAxMWQgKi8KKyNkZWZpbmUgV0xBTl84MDIxMURfRVZFTlRfQ09VTlRSWV9TRVQgICAwCisjZGVmaW5lIFdMQU5fODAyMTFEX0VWRU5UX1JFU0VUICAgICAgICAgMQorCisjZGVmaW5lIFdMQU5fODAyMTFEX0RJU0FCTEVEICAgICAgICAgMAorI2RlZmluZSBXTEFOXzgwMjExRF9TVVBQT1JUX01VTFRJX0RPTUFJTiAgICAgMQorI2RlZmluZSBXTEFOXzgwMjExRF9OT1RfU1VQUE9SVF9NVUxUSV9ET01BSU4gICAgIDIKKworaW50IGRpYWdfYXV0aF90eXBlX2Zyb21fY3NyX3R5cGUoZUNzckF1dGhUeXBlIGF1dGhUeXBlKTsKK2ludCBkaWFnX2VuY190eXBlX2Zyb21fY3NyX3R5cGUoZUNzckVuY3J5cHRpb25UeXBlIGVuY1R5cGUpOworI2VuZGlmIC8qICNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9zY2FuX3Jlc3VsdF9wdXJnZQorICAgIFxicmllZiByZW1vdmUgYWxsIGl0ZW1zKHRDc3JTY2FuUmVzdWx0KSBpbiB0aGUgbGlzdCBhbmQgZnJlZSBtZW1vcnkgZm9yIGVhY2ggaXRlbQorICAgIFxwYXJhbSBoU2NhblJlc3VsdCAtIHJldHVybmVkIGZyb20gY3NyX3NjYW5fZ2V0X3Jlc3VsdC4gaFNjYW5SZXN1bHQgaXMgY29uc2lkZXJlZCBnb25lIGJ5CisgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFuZCBldmVuIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldXRybnMuCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY3NyX3NjYW5fcmVzdWx0X3B1cmdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJIHRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0KTsKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9Db21tb24gU2NhbiBlbmRzICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfcm9hbV9jb25uZWN0CisgICAgXGJyaWVmIFRvIGluaXRpdGlhdGUgYW4gYXNzb2NpYXRpb24KKyAgICBccGFyYW0gcFByb2ZpbGUgLSBjYW4gYmUgTlVMTCB0byBqb2luIHRvIGFueSBvcGVuIG9uZXMKKyAgICBccGFyYW0gcFJvYW1JZCAtIHRvIGdldCBiYWNrIHRoZSByZXF1ZXN0IElECisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY3NyX3JvYW1fY29ubmVjdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCSAgICB1aW50MzJfdCAqcFJvYW1JZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfcm9hbV9yZWFzc29jCisgICAgXGJyaWVmIFRvIGluaXRpdGlhdGUgYSByZS1hc3NvY2lhdGlvbgorICAgIFxwYXJhbSBwUHJvZmlsZSAtIGNhbiBiZSBOVUxMIHRvIGpvaW4gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgQVAuIEluIHRoYXQKKyAgICBjYXNlIG1vZFByb2ZpbGVGaWVsZHMgc2hvdWxkIGNhcnJ5IHRoZSBtb2RpZmllZCBmaWVsZChzKSB3aGljaCBjb3VsZCB0cmlnZ2VyCisgICAgcmVhc3NvYworICAgIFxwYXJhbSBtb2RQcm9maWxlRmllbGRzIC0gZmllbGRzIHdoaWNoIGFyZSBwYXJ0IG9mIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZQorICAgIHRoYXQgbWlnaHQgbmVlZCBtb2RpZmljYXRpb24gZHluYW1pY2FsbHkgb25jZSBTVEEgaXMgdXAgJiBydW5uaW5nIGFuZCB0aGlzCisgICAgY291bGQgdHJpZ2dlciBhIHJlYXNzb2MKKyAgICBccGFyYW0gcFJvYW1JZCAtIHRvIGdldCBiYWNrIHRoZSByZXF1ZXN0IElECisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY3NyX3JvYW1fcmVhc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCSAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgbW9kUHJvZmlsZUZpZWxkcywKKwkJCSAgICB1aW50MzJfdCAqcFJvYW1JZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfcm9hbV9yZWNvbm5lY3QKKyAgICBcYnJpZWYgVG8gZGlzY29ubmVjdCBhbmQgcmVjb25uZWN0IHdpdGggdGhlIHNhbWUgcHJvZmlsZQorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUy4gSXQgcmV0dXJucyBmYWlsIGlmIGN1cnJlbnRseSBub3QgY29ubmVjdGVkCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY3NyX3JvYW1fcmVjb25uZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfcm9hbV9zZXRfcG1raWRfY2FjaGUKKyAgICBcYnJpZWYgcmV0dXJuIHRoZSBQTUtJRCBjYW5kaWRhdGUgbGlzdAorICAgIFxwYXJhbSBwUE1LSURDYWNoZSAtIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHBvaW50IHRvIGFuIGFycmF5IG9mIHRQbWtpZENhY2hlSW5mbworICAgIFxwYXJhbSBudW1JdGVtcyAtIGEgdmFyaWFibGUgdGhhdCBoYXMgdGhlIG51bWJlciBvZiB0UG1raWRDYWNoZUluZm8gYWxsb2NhdGVkCisgICAgd2hlbiByZXRydW5pbmcsIHRoaXMgaXMgZWl0aGVyIHRoZSBudW1iZXIgbmVlZGVkIG9yIG51bWJlciBvZiBpdGVtcyBwdXQgaW50byBwUE1LSURDYWNoZQorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QgYmlnIGVub3VnaCBhbmQgcE51bUl0ZW1zCisgICAgaGFzIHRoZSBudW1iZXIgb2YgdFBta2lkQ2FjaGVJbmZvLgorICAgIFxOb3RlOiBwTnVtSXRlbXMgaXMgYSBudW1iZXIgb2YgdFBta2lkQ2FjaGVJbmZvLCBub3Qgc2l6ZW9mKHRQbWtpZENhY2hlSW5mbykgKiBzb21ldGhpbmcKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9zZXRfcG1raWRfY2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICB0UG1raWRDYWNoZUluZm8gKnBQTUtJRENhY2hlLAorCQkJCSAgICB1aW50MzJfdCBudW1JdGVtcywgYm9vbCB1cGRhdGVfZW50aXJlX2NhY2hlKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKlxmbiBjc3Jfcm9hbV9zZXRfcHNrX3BtaworICAgKlxicmllZiBzdG9yZSBQU0svUE1LCisgICAqXHBhcmFtIHBNYWMgIC0gcG9pbnRlciB0byBnbG9iYWwgc3RydWN0dXJlIGZvciBNQUMKKyAgICpccGFyYW0gc2Vzc2lvbklkIC0gU21lIHNlc3Npb24gaWQKKyAgICpccGFyYW0gcFBTS19QTUsgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFBzay9QbWsKKyAgICpccmV0dXJuIENERl9TVEFUVVMgLSB1c3VhbGx5IGl0IHN1Y2NlZWQgdW5sZXNzIHNlc3Npb25JZCBpcyBub3QgZm91bmQKKyAgICpcTm90ZToKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9yb2FtX3NldF9wc2tfcG1rKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQl1aW50OF90ICpwUFNLX1BNSywgc2l6ZV90IHBta19sZW4pOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICpcZm4gY3NyX3JvYW1fc2V0X2tleV9tZ210X29mZmxvYWQKKyAgICpcYnJpZWYgc2V0cyBuUm9hbUtleU1nbXRPZmZsb2FkRW5hYmxlZAorICAgKlxwYXJhbSBwTWFjICAtIHBvaW50ZXIgdG8gZ2xvYmFsIHN0cnVjdHVyZSBmb3IgTUFDCisgICAqXHBhcmFtIHNlc3Npb25JZCAtIFNtZSBzZXNzaW9uIGlkCisgICAqXHBhcmFtIG5Sb2FtS2V5TWdtdE9mZmxvYWRFbmFibGVkIC0gdmFsdWUgb2Yga2V5IG1nbXQgb2ZmbG9hZCBlbmFibGUKKyAgICpccmV0dXJuIENERl9TVEFUVVMgLSB1c3VhbGx5IGl0IHN1Y2NlZWQgdW5sZXNzIHNlc3Npb25JZCBpcyBub3QgZm91bmQKKyAgICpcTm90ZToKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9yb2FtX3NldF9rZXlfbWdtdF9vZmZsb2FkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSBib29sIG5Sb2FtS2V5TWdtdE9mZmxvYWRFbmFibGVkKTsKKyNlbmRpZgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9yb2FtX2dldF93cGFfcnNuX3JlcV9pZQorICAgIFxicmllZiByZXR1cm4gdGhlIFdQQSBvciBSU04gSUUgQ1NSIHBhc3NlcyB0byBQRSB0byBKT0lOIHJlcXVlc3Qgb3IgU1RBUlRfQlNTIHJlcXVlc3QKKyAgICBccGFyYW0gcExlbiAtIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaGFzIHRoZSBsZW5ndGggb2YgcEJ1ZiBhcyBpbnB1dC4gVXBvbiByZXR1cm5lZCwgKnBMZW4gaGFzIHRoZQorICAgIG5lZWRlZCBvciBJRSBsZW5ndGggaW4gcEJ1Zi4KKyAgICBccGFyYW0gcEJ1ZiAtIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgY29udGFpbiB0aGUgSUUgZmllbGQsIGlmIGFueSwgdXBvbiByZXR1cm4KKyAgICBccmV0dXJuIENERl9TVEFUVVMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90IGJpZyBlbm91Z2gKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9nZXRfd3BhX3Jzbl9yZXFfaWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCSAgICAgICB1aW50MzJfdCAqcExlbiwgdWludDhfdCAqcEJ1Zik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfcm9hbV9nZXRfd3BhX3Jzbl9yc3BfaWUKKyAgICBcYnJpZWYgcmV0dXJuIHRoZSBXUEEgb3IgUlNOIElFIGZyb20gdGhlIGJlYWNvbiBvciBwcm9iZSByc3AgaWYgY29ubmVjdGVkCisgICAgXHBhcmFtIHBMZW4gLSBjYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGhhcyB0aGUgbGVuZ3RoIG9mIHBCdWYgYXMgaW5wdXQuIFVwb24gcmV0dXJuZWQsICpwTGVuIGhhcyB0aGUKKyAgICBuZWVkZWQgb3IgSUUgbGVuZ3RoIGluIHBCdWYuCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGNvbnRhaW4gdGhlIElFIGZpZWxkLCBpZiBhbnksIHVwb24gcmV0dXJuCisgICAgXHJldHVybiBDREZfU1RBVFVTIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdCBiaWcgZW5vdWdoCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY3NyX3JvYW1fZ2V0X3dwYV9yc25fcnNwX2llKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgICAgdWludDMyX3QgKnBMZW4sIHVpbnQ4X3QgKnBCdWYpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyX3JvYW1fZ2V0X251bV9wbWtpZF9jYWNoZQorICAgIFxicmllZiByZXR1cm4gbnVtYmVyIG9mIFBNS0lEIGNhY2hlIGVudHJpZXMKKyAgICBccmV0dXJuIHVpbnQzMl90IC0gdGhlIG51bWJlciBvZiBQTUtJRCBjYWNoZSBlbnRyaWVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQzMl90IGNzcl9yb2FtX2dldF9udW1fcG1raWRfY2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9yb2FtX2dldF9wbWtpZF9jYWNoZQorICAgIFxicmllZiByZXR1cm4gUE1LSUQgY2FjaGUgZnJvbSBDU1IKKyAgICBccGFyYW0gcE51bSAtIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaGFzIHRoZSBzcGFjZSBvZiB0aGUgbnVtYmVyIG9mIHBCdWYgdFBta2lkQ2FjaGVJbmZvIGFzIGlucHV0LiBVcG9uIHJldHVybmVkLCAqcE51bSBoYXMgdGhlCisgICAgbmVlZGVkIG9yIGFjdHVhbGx5IG51bWJlciBpbiB0UG1raWRDYWNoZUluZm8uCisgICAgXHBhcmFtIHBQbWtpZENhY2hlIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBjb250YWlucyBQTUtJRCBjYWNoZSwgaWYgYW55LCB1cG9uIHJldHVybgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QgYmlnIGVub3VnaAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9yb2FtX2dldF9wbWtpZF9jYWNoZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgIHVpbnQzMl90ICpwTnVtLCB0UG1raWRDYWNoZUluZm8gKnBQbWtpZENhY2hlKTsKKworLyoqCisgKiBjc3Jfcm9hbV9nZXRfY29ubmVjdF9wcm9maWxlKCkgLSBUbyByZXR1cm4gdGhlIGN1cnJlbnQgY29ubmVjdCBwcm9maWxlLAorICogY2FsbGVyIG11c3QgY2FsbCBjc3Jfcm9hbV9mcmVlX2Nvbm5lY3RfcHJvZmlsZSBhZnRlciBpdCBpcyBkb25lIGFuZCBiZWZvcmUKKyAqIHJldXNlIGZvciBhbm90aGVyIGNzcl9yb2FtX2dldF9jb25uZWN0X3Byb2ZpbGUgY2FsbC4KKyAqCisgKiBAcE1hYzogICAgICAgICAgcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgKiBAc2Vzc2lvbklkOiAgICAgc2Vzc2lvbiBJRAorICogQHBQcm9maWxlOiAgICAgIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHN0cnVjdHVyZQorICogICAgICAgICAgICAgICAgIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUy4gRmFpbHVyZSBpZiBub3QgY29ubmVjdGVkLCBzdWNjZXNzIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTIGNzcl9yb2FtX2dldF9jb25uZWN0X3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQl0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBQcm9maWxlKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9yb2FtX2dldF9jb25uZWN0X3N0YXRlCisgICAgXGJyaWVmIFRvIHJldHVybiB0aGUgY3VycmVudCBjb25uZWN0IHN0YXRlIG9mIFJvYW1pbmcKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9nZXRfY29ubmVjdF9zdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgICAgZUNzckNvbm5lY3RTdGF0ZSAqcFN0YXRlKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9yb2FtX2ZyZWVfY29ubmVjdF9wcm9maWxlCisgICAgXGJyaWVmIFRvIGZyZWUgYW5kIHJlaW5pdGlhbGl6ZSB0aGUgcHJvZmlsZSByZXR1cm4gcHJldmlvdXMgYnkgY3NyX3JvYW1fZ2V0X2Nvbm5lY3RfcHJvZmlsZS4KKyAgICBccGFyYW0gcFByb2ZpbGUgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlCisgICAgXHJldHVybiBDREZfU1RBVFVTLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9yb2FtX2ZyZWVfY29ubmVjdF9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBQcm9maWxlKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9hcHBseV9jaGFubmVsX2FuZF9wb3dlcl9saXN0CisgICAgXGJyaWVmIEhERCBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QgYmFzZSBvbiB0aGUgYmFuZC9tb2RlIHNldHRpbmdzLgorICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQ0ZHIGlzIGRvd25sb2FkZWQgYW5kIGFsbCB0aGUgYmFuZC9tb2RlIHNldHRpbmcgYWxyZWFkeSBwYXNzZWQgaW50bworICAgIENTUi4KKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3JfYXBwbHlfY2hhbm5lbF9hbmRfcG93ZXJfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworLyoqCisgKiBjc3JfY2hhbmdlX2NvbmZpZ19wYXJhbXMoKSAtIFRoZSBDU1IgQVBJIGV4cG9zZWQgZm9yIEhERCB0byBwcm92aWRlIGNvbmZpZworICogcGFyYW1zIHRvIENTUiBkdXJpbmcgU01FcyBzdG9wIC0+IHN0YXJ0IHNlcXVlbmNlLgorICoKKyAqIEBwTWFjOiAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgKiBAcFVwZGF0ZUNvbmZpZ1BhcmFtOiAgIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSAodENzclVwZGF0ZUNvbmZpZ1BhcmFtKSB0aGF0CisgKiBjdXJyZW50bHkgcHJvdmlkZXMgMTFkIHJlbGF0ZWQgaW5mb3JtYXRpb24gbGlrZSBjb3VudHJ5IGNvZGUsIFJlZ3VsYXRvcnkKKyAqIGRvbWFpbiwgdmFsaWQgY2hhbm5lbCBsaXN0LCBUeCBwb3dlciBwZXIgY2hhbm5lbCwgYSBsaXN0IHdpdGggYWN0aXZlL3Bhc3NpdmUKKyAqIHNjYW4gYWxsb3dlZCBwZXIgdmFsaWQgY2hhbm5lbC4KKyAqCisgKiBJZiBIREQgY2hhbmdlZCB0aGUgZG9tYWluIHRoYXQgd2lsbCBjYXVzZSBhIHJlc2V0LiBUaGlzIGZ1bmN0aW9uIHdpbGwKKyAqIHByb3ZpZGUgdGhlIG5ldyBzZXQgb2YgMTFkIGluZm9ybWF0aW9uIGZvciB0aGUgbmV3IGRvbWFpbi4gQ3VycnJlbnRseSB0aGlzCisgKiBBUEkgcHJvdmlkZXMgaW5mbyByZWdhcmRpbmcgMTFkIG9ubHkgYXQgcmVzZXQgYnV0IHdlIGNhbiBleHRlbmQgdGhpcyBmb3IKKyAqIG90aGVyIHBhcmFtcyAoUE1DLCBRb1MpIHdoaWNoIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGFnYWluIGF0IHJlc2V0LgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUy4gc3RhdHVzIG9mIG9wZXJhdGlvbgorICovCitDREZfU1RBVFVTIGNzcl9jaGFuZ2VfY29uZmlnX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICB0Q3NyVXBkYXRlQ29uZmlnUGFyYW0gKnBVcGRhdGVDb25maWdQYXJhbSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfcm9hbV9jb25uZWN0X3RvX2xhc3RfcHJvZmlsZQorICAgIFxicmllZiBUbyBkaXNjb25uZWN0IGFuZCByZWNvbm5lY3Qgd2l0aCB0aGUgc2FtZSBwcm9maWxlCisgICAgXHJldHVybiBDREZfU1RBVFVTLiBJdCByZXR1cm5zIGZhaWwgaWYgY3VycmVudGx5IGNvbm5lY3RlZAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9yb2FtX2Nvbm5lY3RfdG9fbGFzdF9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfcm9hbV9kaXNjb25uZWN0CisgICAgXGJyaWVmIFRvIGRpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsKKyAgICBccGFyYW0gcmVhc29uIC0tIFRvIGluZGljYXRlIHRoZSByZWFzb24gZm9yIGRpc2Nvbm5lY3RpbmcuIEN1cnJlbnRseSwgb25seSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX01JQ19FUlJPUiBpcyBtZWFuZnVsLgorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9yb2FtX2Rpc2Nvbm5lY3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJICAgICAgIGVDc3JSb2FtRGlzY29ubmVjdFJlYXNvbiByZWFzb24pOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyX3NjYW5fZ2V0X3Bta2lkX2NhbmRpZGF0ZV9saXN0CisgICAgXGJyaWVmIHJldHVybiB0aGUgUE1LSUQgY2FuZGlkYXRlIGxpc3QKKyAgICBccGFyYW0gcFBta2lkTGlzdCAtIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHBvaW50IHRvIGFuIGFycmF5IG9mIHRQbWtpZENhbmRpZGF0ZUluZm8KKyAgICBccGFyYW0gcE51bUl0ZW1zIC0gcG9pbnRlciB0byBhIHZhcmlhYmxlIHRoYXQgaGFzIHRoZSBudW1iZXIgb2YgdFBta2lkQ2FuZGlkYXRlSW5mbyBhbGxvY2F0ZWQKKyAgICB3aGVuIHJldHJ1bmluZywgdGhpcyBpcyBlaXRoZXIgdGhlIG51bWJlciBuZWVkZWQgb3IgbnVtYmVyIG9mIGl0ZW1zIHB1dCBpbnRvIHBQbWtpZExpc3QKKyAgICBccmV0dXJuIENERl9TVEFUVVMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90IGJpZyBlbm91Z2ggYW5kIHBOdW1JdGVtcworICAgIGhhcyB0aGUgbnVtYmVyIG9mIHRQbWtpZENhbmRpZGF0ZUluZm8uCisgICAgXE5vdGU6IHBOdW1JdGVtcyBpcyBhIG51bWJlciBvZiB0UG1raWRDYW5kaWRhdGVJbmZvLCBub3Qgc2l6ZW9mKHRQbWtpZENhbmRpZGF0ZUluZm8pICogc29tZXRoaW5nCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY3NyX3NjYW5fZ2V0X3Bta2lkX2NhbmRpZGF0ZV9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJICAgICB0UG1raWRDYW5kaWRhdGVJbmZvICpwUG1raWRMaXN0LAorCQkJCQkgICAgIHVpbnQzMl90ICpwTnVtSXRlbXMpOworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RvcCBhIEJTUy4gSXQgaXMgc2ltaWxhciBvZiBjc3Jfcm9hbUlzc3VlRGlzY29ubmVjdCBidXQgdGhpcyBmdW5jdGlvbiAqLworLyogZG9lc24ndCBoYXZlIGFueSBsb2dpYyBvdGhlciB0aGFuIGJsaW5kbHkgdHJ5aW5nIHRvIHN0b3AgQlNTICovCitDREZfU1RBVFVTIGNzcl9yb2FtX2lzc3VlX3N0b3BfYnNzX2NtZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgICAgIGJvb2wgZkhpZ2hQcmlvcml0eSk7CisKK3ZvaWQgY3NyX2NhbGxfcm9hbWluZ19jb21wbGV0aW9uX2NhbGxiYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiwKKwkJCQkJICB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywgdWludDMyX3Qgcm9hbUlkLAorCQkJCQkgIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyX3JvYW1faXNzdWVfZGlzYXNzb2NpYXRlX3N0YV9jbWQKKyAgICBcYnJpZWYgY3NyIGZ1bmN0aW9uIHRoYXQgSEREIGNhbGxzIHRvIGRpc2Fzc29jaWF0ZSBhIGFzc29jaWF0ZWQgc3RhdGlvbgorICAgIFxwYXJhbSBzZXNzaW9uSWQgICAgLSBzZXNzaW9uIElkIGZvciBTb2Z0IEFQCisgICAgXHBhcmFtIHBQZWVyTWFjQWRkciAtIE1BQyBvZiBhc3NvY2lhdGVkIHN0YXRpb24gdG8gZGVsZXRlCisgICAgXHBhcmFtIHJlYXNvbiAtIHJlYXNvbiBjb2RlLCBiZSBvbmUgb2YgdGhlIHRTaXJNYWNSZWFzb25Db2RlcworICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY3NyX3JvYW1faXNzdWVfZGlzYXNzb2NpYXRlX3N0YV9jbWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBQZWVyTWFjQWRkciwKKwkJCQkJICAgICAgIHVpbnQzMl90IHJlYXNvbik7CisKKy8qKgorICogY3NyX3JvYW1faXNzdWVfZGVhdXRoX3N0YV9jbWQoKSAtIGlzc3VlIGRlYXV0aGVudGljYXRlIHN0YXRpb24gY29tbWFuZAorICogQHBNYWM6ICAgICAgICAgIFBvaW50ZXIgdG8gZ2xvYmFsIHN0cnVjdHVyZSBmb3IgTUFDCisgKiBAc2Vzc2lvbklkOiAgICAgU2Vzc2lvbiBJZCBmb3IgU29mdCBBUAorICogQHBEZWxTdGFQYXJhbXM6IFBvaW50ZXIgdG8gcGFyYW1ldGVycyBvZiB0aGUgc3RhdGlvbiB0byBkZWF1dGhlbnRpY2F0ZQorICoKKyAqIENTUiBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBpc3N1ZSBhIGRlYXV0aGVudGljYXRlIHN0YXRpb24gY29tbWFuZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3Mgb3IgYW5vdGhlciBDREZfU1RBVFVTXyogb24gZXJyb3IKKyAqLworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9pc3N1ZV9kZWF1dGhfc3RhX2NtZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl1aW50MzJfdCBzZXNzaW9uSWQsCisJCXN0cnVjdCB0YWdDc3JEZWxTdGFQYXJhbXMgKnBEZWxTdGFQYXJhbXMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyX3JvYW1faXNzdWVfdGtpcF9jb3VudGVyX21lYXN1cmVzCisgICAgXGJyaWVmIGNzciBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBzdGFydCBhbmQgc3RvcCB0a2lwIGNvdW50ZXJtZWFzdXJlcworICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uIElkIGZvciBTb2Z0IEFQCisgICAgXHBhcmFtIGJFbmFibGUgICAtIEZsYWcgdG8gc3RhcnQvc3RvcCBjb3VudGVybWVhc3VyZXMKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9yb2FtX2lzc3VlX3RraXBfY291bnRlcl9tZWFzdXJlcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdWludDMyX3Qgc2Vzc2lvbklkLCBib29sIGJFbmFibGUpOworCitDREZfU1RBVFVTIGNzcl9zZW5kX21iX3RraXBfY291bnRlcl9tZWFzdXJlc19yZXFfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgIHVpbnQzMl90IHNlc3NpbklkLCBib29sIGJFbmFibGUsCisJCQkJCQkgICAgIHRTaXJNYWNBZGRyIGJzc0lkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9yb2FtX2dldF9hc3NvY2lhdGVkX3N0YXMKKyAgICBcYnJpZWYgY3NyIGZ1bmN0aW9uIHRoYXQgSEREIGNhbGxzIHRvIGdldCBsaXN0IG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgYmFzZWQgb24gbW9kdWxlIElECisgICAgXHBhcmFtIHNlc3Npb25JZCAtIHNlc3Npb24gSWQgZm9yIFNvZnQgQVAKKyAgICBccGFyYW0gbW9kSWQgLSBtb2R1bGUgSUQgLSBQRS9IQUwvVEwKKyAgICBccGFyYW0gcFVzckNvbnRleHQgLSBPcGFxdWUgSEREIGNvbnRleHQKKyAgICBccGFyYW0gcGZuU2FwRXZlbnRDYWxsYmFjayAtIFNhcCBldmVudCBjYWxsYmFjayBpbiBIREQKKyAgICBccGFyYW0gcEFzc29jU3Rhc0J1ZiAtIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRvIGJlIGZpbGxlZCB3aXRoIGFzc29jaWF0ZCBzdGF0aW9ucyBpbmZvCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9nZXRfYXNzb2NpYXRlZF9zdGFzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkJQ0RGX01PRFVMRV9JRCBtb2RJZCwgdm9pZCAqcFVzckNvbnRleHQsCisJCQkJCXZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssCisJCQkJCXVpbnQ4X3QgKnBBc3NvY1N0YXNCdWYpOworCitDREZfU1RBVFVTIGNzcl9zZW5kX21iX2dldF9hc3NvY2lhdGVkX3N0YXNfcmVxX21zZyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkJICAgQ0RGX01PRFVMRV9JRCBtb2RJZCwKKwkJCQkJCSAgIHRTaXJNYWNBZGRyIGJzc0lkLAorCQkJCQkJICAgdm9pZCAqcFVzckNvbnRleHQsCisJCQkJCQkgICB2b2lkICpwZm5TYXBFdmVudENhbGxiYWNrLAorCQkJCQkJICAgdWludDhfdCAqcEFzc29jU3Rhc0J1Zik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfcm9hbV9nZXRfd3BzX3Nlc3Npb25fb3ZlcmxhcAorICAgIFxicmllZiBjc3IgZnVuY3Rpb24gdGhhdCBIREQgY2FsbHMgdG8gZ2V0IFdQUyBQQkMgc2Vzc2lvbiBvdmVybGFwIGluZm9ybWF0aW9uCisgICAgXHBhcmFtIHNlc3Npb25JZCAtIHNlc3Npb24gSWQgZm9yIFNvZnQgQVAKKyAgICBccGFyYW0gcFVzckNvbnRleHQgLSBPcGFxdWUgSEREIGNvbnRleHQKKyAgICBccGFyYW0gcGZuU2FwRXZlbnRDYWxsYmFjayAtIFNhcCBldmVudCBjYWxsYmFjayBpbiBIREQKKyAgICBccGFyYW0gcFJlbW92ZU1hYyAtIHBvaW50ZXIgdG8gTUFDIGFkZHJlc3Mgb2Ygc2Vzc2lvbiB0byBiZSByZW1vdmVkCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3Jfcm9hbV9nZXRfd3BzX3Nlc3Npb25fb3ZlcmxhcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgICB2b2lkICpwVXNyQ29udGV4dCwKKwkJCQkJICAgIHZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssCisJCQkJCSAgICBzdHJ1Y3QgY2RmX21hY19hZGRyIHBSZW1vdmVNYWMpOworCitDREZfU1RBVFVTIGNzcl9zZW5kX21iX2dldF93cHNwYmNfc2Vzc2lvbnModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgICB0U2lyTWFjQWRkciBic3NJZCwgdm9pZCAqcFVzckNvbnRleHQsCisJCQkJCSAgIHZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssCisJCQkJCSAgIHN0cnVjdCBjZGZfbWFjX2FkZHIgcFJlbW92ZU1hYyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3Jfc2VuZF9jaG5nX21jY19iZWFjb25faW50ZXJ2YWwKKyAgICBcYnJpZWYgY3NyIGZ1bmN0aW9uIHRoYXQgSEREIGNhbGxzIHRvIHNlbmQgVXBkYXRlIGJlYWNvbiBpbnRlcnZhbAorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uIElkIGZvciBTb2Z0IEFQCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUworY3NyX3NlbmRfY2huZ19tY2NfYmVhY29uX2ludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzcl9yb2FtX2Z0X3ByZV9hdXRoX3JzcF9wcm9jZXNzb3IKKyAgICBcYnJpZWYgY3NyIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBwcmUgYXV0aCByZXNwb25zZSBmcm9tIExJTQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyX3JvYW1fZnRfcHJlX2F1dGhfcnNwX3Byb2Nlc3Nvcih0SGFsSGFuZGxlIGhIYWwsCisJCQkJCXRwU2lyRlRQcmVBdXRoUnNwIHBGVFByZUF1dGhSc3ApOworI2VuZGlmCisKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkKK3ZvaWQgdXBkYXRlX2Nja210c2YodWludDMyX3QgKnRpbWVTdGFtcDAsIHVpbnQzMl90ICp0aW1lU3RhbXAxLAorCQkgICAgdWludDMyX3QgKmluY3IpOworI2VuZGlmCisKK0NERl9TVEFUVVMgY3NyX3JvYW1fZW5xdWV1ZV9wcmVhdXRoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCwKKwkJCQkgICAgdHBTaXJCc3NEZXNjcmlwdGlvbiBwQnNzRGVzY3JpcHRpb24sCisJCQkJICAgIGVDc3JSb2FtUmVhc29uIHJlYXNvbiwgYm9vbCBmSW1tZWRpYXRlKTsKK0NERl9TVEFUVVMgY3NyX2RlcXVldWVfcm9hbV9jb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVDc3JSb2FtUmVhc29uIHJlYXNvbik7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgordm9pZCBjc3JfaW5pdF9vY2N1cGllZF9jaGFubmVsc19saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK2Jvb2wgY3NyX25laWdoYm9yX3JvYW1faXNfbmV3X2Nvbm5lY3RlZF9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQl1aW50OF90IHNlc3Npb25JZCk7Citib29sIGNzcl9uZWlnaGJvcl9yb2FtX2Nvbm5lY3RlZF9wcm9maWxlX21hdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgIHRDc3JTY2FuUmVzdWx0ICpwUmVzdWx0LAorCQkJCQkgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcyk7CisjZW5kaWYKKworQ0RGX1NUQVRVUyBjc3Jfc2Nhbl9jcmVhdGVfZW50cnlfaW5fc2Nhbl9jYWNoZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkJc3RydWN0IGNkZl9tYWNfYWRkciBic3NpZCwKKwkJCQkJCXVpbnQ4X3QgY2hhbm5lbCk7CisKK0NERl9TVEFUVVMgY3NyX3VwZGF0ZV9jaGFubmVsX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitDREZfU1RBVFVTIGNzcl9yb2FtX2RlbF9wbWtpZF9mcm9tX2NhY2hlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSBjb25zdCB1aW50OF90ICpwQlNTSWQsCisJCQkJCSBib29sIGZsdXNoX2NhY2hlKTsKKworYm9vbCBjc3JfZWxlY3RlZF9jb3VudHJ5X2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGNzcl9hZGRfdm90ZV9mb3JfY291bnRyeV9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKnBDb3VudHJ5Q29kZSk7Cit2b2lkIGNzcl9jbGVhcl92b3Rlc19mb3JfY291bnRyeV9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisjZW5kaWYKKworI2lmZGVmIFFDQV9IVF8yMDQwX0NPRVgKK0NERl9TVEFUVVMgY3NyX3NldF9odDIwNDBfbW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgICAgICAgZVBoeUNoYW5Cb25kU3RhdGUgY2JNb2RlLCBib29sIG9ic3NFbmFibGVkKTsKKyNlbmRpZgordFNpckJzc0Rlc2NyaXB0aW9uKgorY3NyX2dldF9ic3NkZXNjcl9mcm9tX3NjYW5faGFuZGxlKHRTY2FuUmVzdWx0SGFuZGxlIHJlc3VsdF9oYW5kbGUsCisJCQkJICB0U2lyQnNzRGVzY3JpcHRpb24gKmJzc19kZXNjcik7Cit2b2lkIGNzcl9yZWxlYXNlX3NjYW5fY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwKKwkJCSAgICAgIGVDc3JTY2FuU3RhdHVzIHNjYW5TdGF0dXMpOwordm9pZCBjc3Jfc2Nhbl9hY3RpdmVfbGlzdF90aW1lb3V0X2hhbmRsZSh2b2lkICp1c2VyRGF0YSk7CitDREZfU1RBVFVTIGNzcl9wcmVwYXJlX2Rpc2Nvbm5lY3RfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBtYWMsCisJCQl1aW50MzJfdCBzZXNzaW9uX2lkLCB0U21lQ21kICoqc21lX2NtZCk7CmRpZmYgLS1naXQgYS9jb3JlL3NtZS9zcmMvY3NyL2Nzcl9saW5rX2xpc3QuYyBiL2NvcmUvc21lL3NyYy9jc3IvY3NyX2xpbmtfbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTBiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9zcmMvY3NyL2Nzcl9saW5rX2xpc3QuYwpAQCAtMCwwICsxLDU3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICAgXGZpbGUgY3NyX2xpbmtfbGlzdC5jCisKKyAgICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIENvbW1vbiBsaW5rIGxpc3QgaW50ZXJmYWNlcy4KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpbmNsdWRlICJjc3JfbGlua19saXN0LmgiCisjaW5jbHVkZSAiY2RmX2xvY2suaCIKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisjaW5jbHVkZSAiY2RmX3RyYWNlLmgiCisjaW5jbHVkZSAiY2RmX21jX3RpbWVyLmgiCisKK0NERl9JTkxJTkVfRk4gdm9pZCBjc3JfbGlzdF9pbml0KHRMaXN0RWxlbSAqcExpc3QpCit7CisJcExpc3QtPmxhc3QgPSBwTGlzdC0+bmV4dCA9IHBMaXN0OworfQorCitDREZfSU5MSU5FX0ZOIHZvaWQgY3NyX2xpc3RfcmVtb3ZlX2VudHJ5KHRMaXN0RWxlbSAqcEVudHJ5KQoreworCXRMaXN0RWxlbSAqcExhc3Q7CisJdExpc3RFbGVtICpwTmV4dDsKKworCXBMYXN0ID0gcEVudHJ5LT5sYXN0OworCXBOZXh0ID0gcEVudHJ5LT5uZXh0OworCXBMYXN0LT5uZXh0ID0gcE5leHQ7CisJcE5leHQtPmxhc3QgPSBwTGFzdDsKK30KKworQ0RGX0lOTElORV9GTiB0TGlzdEVsZW0gKmNzcl9saXN0X3JlbW92ZV9oZWFkKHRMaXN0RWxlbSAqcEhlYWQpCit7CisJdExpc3RFbGVtICpwRW50cnk7CisJdExpc3RFbGVtICpwTmV4dDsKKworCXBFbnRyeSA9IHBIZWFkLT5uZXh0OworCXBOZXh0ID0gcEVudHJ5LT5uZXh0OworCXBIZWFkLT5uZXh0ID0gcE5leHQ7CisJcE5leHQtPmxhc3QgPSBwSGVhZDsKKworCXJldHVybiBwRW50cnk7Cit9CisKK0NERl9JTkxJTkVfRk4gdExpc3RFbGVtICpjc3JfbGlzdF9yZW1vdmVfdGFpbCh0TGlzdEVsZW0gKnBIZWFkKQoreworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRMaXN0RWxlbSAqcExhc3Q7CisKKwlwRW50cnkgPSBwSGVhZC0+bGFzdDsKKwlwTGFzdCA9IHBFbnRyeS0+bGFzdDsKKwlwSGVhZC0+bGFzdCA9IHBMYXN0OworCXBMYXN0LT5uZXh0ID0gcEhlYWQ7CisKKwlyZXR1cm4gcEVudHJ5OworfQorCitDREZfSU5MSU5FX0ZOIHZvaWQgY3NyX2xpc3RfaW5zZXJ0X3RhaWwodExpc3RFbGVtICpwSGVhZCwgdExpc3RFbGVtICpwRW50cnkpCit7CisJdExpc3RFbGVtICpwTGFzdDsKKworCXBMYXN0ID0gcEhlYWQtPmxhc3Q7CisJcEVudHJ5LT5sYXN0ID0gcExhc3Q7CisJcEVudHJ5LT5uZXh0ID0gcEhlYWQ7CisJcExhc3QtPm5leHQgPSBwRW50cnk7CisJcEhlYWQtPmxhc3QgPSBwRW50cnk7Cit9CisKK0NERl9JTkxJTkVfRk4gdm9pZCBjc3JfbGlzdF9pbnNlcnRfaGVhZCh0TGlzdEVsZW0gKnBIZWFkLCB0TGlzdEVsZW0gKnBFbnRyeSkKK3sKKwl0TGlzdEVsZW0gKnBOZXh0OworCisJcE5leHQgPSBwSGVhZC0+bmV4dDsKKwlwRW50cnktPm5leHQgPSBwTmV4dDsKKwlwRW50cnktPmxhc3QgPSBwSGVhZDsKKwlwTmV4dC0+bGFzdCA9IHBFbnRyeTsKKwlwSGVhZC0+bmV4dCA9IHBFbnRyeTsKK30KKworLyogSW5zZXJ0IHBOZXdFbnRyeSBiZWZvcmUgcEVudHJ5ICovCit2b2lkIGNzcl9saXN0X2luc2VydF9lbnRyeSh0TGlzdEVsZW0gKnBFbnRyeSwgdExpc3RFbGVtICpwTmV3RW50cnkpCit7CisJdExpc3RFbGVtICpwTGFzdDsKKwlpZiAoIXBFbnRyeSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBFcnJvciEhIHBFbnRyeSBpcyBOdWxsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcExhc3QgPSBwRW50cnktPmxhc3Q7CisJcExhc3QtPm5leHQgPSBwTmV3RW50cnk7CisJcEVudHJ5LT5sYXN0ID0gcE5ld0VudHJ5OworCXBOZXdFbnRyeS0+bmV4dCA9IHBFbnRyeTsKKwlwTmV3RW50cnktPmxhc3QgPSBwTGFzdDsKK30KKwordWludDMyX3QgY3NyX2xsX2NvdW50KHREYmxMaW5rTGlzdCAqcExpc3QpCit7CisJdWludDMyX3QgYyA9IDA7CisKKwlpZiAoIXBMaXN0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIGM7CisJfQorCisJaWYgKHBMaXN0ICYmIChMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZykpIHsKKwkJYyA9IHBMaXN0LT5Db3VudDsKKwl9CisKKwlyZXR1cm4gYzsKK30KKwordm9pZCBjc3JfbGxfbG9jayh0RGJsTGlua0xpc3QgKnBMaXN0KQoreworCisJaWYgKCFwTGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcpIHsKKwkJY2RmX211dGV4X2FjcXVpcmUoJnBMaXN0LT5Mb2NrKTsKKwl9Cit9CisKK3ZvaWQgY3NyX2xsX3VubG9jayh0RGJsTGlua0xpc3QgKnBMaXN0KQoreworCisJaWYgKCFwTGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcpIHsKKwkJY2RmX211dGV4X3JlbGVhc2UoJnBMaXN0LT5Mb2NrKTsKKwl9Cit9CisKK2Jvb2wgY3NyX2xsX2lzX2xpc3RfZW1wdHkodERibExpbmtMaXN0ICpwTGlzdCwgYm9vbCBmSW50ZXJsb2NrZWQpCit7CisJYm9vbCBmRW1wdHkgPSB0cnVlOworCisJaWYgKCFwTGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmRW1wdHk7CisJfQorCisJaWYgKExJU1RfRkxBR19PUEVOID09IHBMaXN0LT5GbGFnKSB7CisJCWlmIChmSW50ZXJsb2NrZWQpIHsKKwkJCWNzcl9sbF9sb2NrKHBMaXN0KTsKKwkJfQorCisJCWZFbXB0eSA9IGNzcklzTGlzdEVtcHR5KCZwTGlzdC0+TGlzdEhlYWQpOworCisJCWlmIChmSW50ZXJsb2NrZWQpIHsKKwkJCWNzcl9sbF91bmxvY2socExpc3QpOworCQl9CisJfQorCXJldHVybiBmRW1wdHk7Cit9CisKK2Jvb2wgY3NyX2xsX2ZpbmRfZW50cnkodERibExpbmtMaXN0ICpwTGlzdCwgdExpc3RFbGVtICpwRW50cnlUb0ZpbmQpCit7CisJYm9vbCBmRm91bmQgPSBmYWxzZTsKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKworCWlmICghcExpc3QpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRXJyb3IhISBwTGlzdCBpcyBOdWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gZkZvdW5kOworCX0KKworCWlmIChMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZykgeworCQlwRW50cnkgPSBjc3JfbGxfcGVla19oZWFkKHBMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKworCQkvKiBIYXZlIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb29wIGJhY2sgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHdoaWNoIHdpbGwgKi8KKwkJLyogaGFwcGVuIGlmIHRoZSBlbnRyeSBpcyBOT1Qgb24gdGhlIGxpc3QuLi4gKi8KKworCQl3aGlsZSAocEVudHJ5ICYmIChwRW50cnkgIT0gJnBMaXN0LT5MaXN0SGVhZCkpIHsKKwkJCWlmIChwRW50cnkgPT0gcEVudHJ5VG9GaW5kKSB7CisJCQkJZkZvdW5kID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKwkJfQorCisJfQorCXJldHVybiBmRm91bmQ7Cit9CisKK0NERl9TVEFUVVMgY3NyX2xsX29wZW4odEhkZEhhbmRsZSBoSGRkLCB0RGJsTGlua0xpc3QgKnBMaXN0KQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKworCWlmICghcExpc3QpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRXJyb3IhISBwTGlzdCBpcyBOdWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKExJU1RfRkxBR19PUEVOICE9IHBMaXN0LT5GbGFnKSB7CisJCXBMaXN0LT5Db3VudCA9IDA7CisJCXBMaXN0LT5jbWRUaW1lb3V0VGltZXIgPSBOVUxMOworCQljZGZfc3RhdHVzID0gY2RmX211dGV4X2luaXQoJnBMaXN0LT5Mb2NrKTsKKworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQljc3JfbGlzdF9pbml0KCZwTGlzdC0+TGlzdEhlYWQpOworCQkJcExpc3QtPkZsYWcgPSBMSVNUX0ZMQUdfT1BFTjsKKwkJCXBMaXN0LT5oSGRkID0gaEhkZDsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgY3NyX2xsX2Nsb3NlKHREYmxMaW5rTGlzdCAqcExpc3QpCit7CisJaWYgKCFwTGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcpIHsKKwkJLyogTWFrZSBzdXJlIHRoZSBsaXN0IGlzIGVtcHR5Li4uICovCisJCWNzcl9sbF9wdXJnZShwTGlzdCwgTExfQUNDRVNTX0xPQ0spOworCQljZGZfbXV0ZXhfZGVzdHJveSgmcExpc3QtPkxvY2spOworCQlwTGlzdC0+RmxhZyA9IExJU1RfRkxBR19DTE9TRTsKKwl9Cit9CisKK3ZvaWQgY3NyX2xsX2luc2VydF90YWlsKHREYmxMaW5rTGlzdCAqcExpc3QsIHRMaXN0RWxlbSAqcEVudHJ5LAorCQkJYm9vbCBmSW50ZXJsb2NrZWQpCit7CisJaWYgKCFwTGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcpIHsKKwkJaWYgKGZJbnRlcmxvY2tlZCkgeworCQkJY3NyX2xsX2xvY2socExpc3QpOworCQl9CisJCWNzcl9saXN0X2luc2VydF90YWlsKCZwTGlzdC0+TGlzdEhlYWQsIHBFbnRyeSk7CisJCXBMaXN0LT5Db3VudCsrOworCQlpZiAoZkludGVybG9ja2VkKSB7CisJCQljc3JfbGxfdW5sb2NrKHBMaXN0KTsKKwkJfQorCX0KK30KKwordm9pZCBjc3JfbGxfaW5zZXJ0X2hlYWQodERibExpbmtMaXN0ICpwTGlzdCwgdExpc3RFbGVtICpwRW50cnksCisJCQlib29sIGZJbnRlcmxvY2tlZCkKK3sKKworCWlmICghcExpc3QpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRXJyb3IhISBwTGlzdCBpcyBOdWxsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKExJU1RfRkxBR19PUEVOID09IHBMaXN0LT5GbGFnKSB7CisJCWlmIChmSW50ZXJsb2NrZWQpIHsKKwkJCWNzcl9sbF9sb2NrKHBMaXN0KTsKKwkJfQorCQljc3JfbGlzdF9pbnNlcnRfaGVhZCgmcExpc3QtPkxpc3RIZWFkLCBwRW50cnkpOworCQlwTGlzdC0+Q291bnQrKzsKKwkJaWYgKGZJbnRlcmxvY2tlZCkgeworCQkJY3NyX2xsX3VubG9jayhwTGlzdCk7CisJCX0KKwkJaWYgKHBMaXN0LT5jbWRUaW1lb3V0VGltZXIgJiYgcExpc3QtPmNtZFRpbWVvdXREdXJhdGlvbikgeworCQkJLyogdGltZXIgdG8gZGV0ZWN0IHBlbmRpbmcgY29tbWFuZCBpbiBhY3RpdmVsaXN0ICovCisJCQljZGZfbWNfdGltZXJfc3RhcnQocExpc3QtPmNtZFRpbWVvdXRUaW1lciwKKwkJCQkJICAgcExpc3QtPmNtZFRpbWVvdXREdXJhdGlvbik7CisJCX0KKwl9Cit9CisKK3ZvaWQgY3NyX2xsX2luc2VydF9lbnRyeSh0RGJsTGlua0xpc3QgKnBMaXN0LCB0TGlzdEVsZW0gKnBFbnRyeSwKKwkJCSB0TGlzdEVsZW0gKnBOZXdFbnRyeSwgYm9vbCBmSW50ZXJsb2NrZWQpCit7CisJaWYgKCFwTGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcpIHsKKwkJaWYgKGZJbnRlcmxvY2tlZCkgeworCQkJY3NyX2xsX2xvY2socExpc3QpOworCQl9CisJCWNzcl9saXN0X2luc2VydF9lbnRyeShwRW50cnksIHBOZXdFbnRyeSk7CisJCXBMaXN0LT5Db3VudCsrOworCQlpZiAoZkludGVybG9ja2VkKSB7CisJCQljc3JfbGxfdW5sb2NrKHBMaXN0KTsKKwkJfQorCX0KK30KKwordExpc3RFbGVtICpjc3JfbGxfcmVtb3ZlX3RhaWwodERibExpbmtMaXN0ICpwTGlzdCwgYm9vbCBmSW50ZXJsb2NrZWQpCit7CisJdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworCisJaWYgKCFwTGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBwRW50cnk7CisJfQorCisJaWYgKExJU1RfRkxBR19PUEVOID09IHBMaXN0LT5GbGFnKSB7CisJCWlmIChmSW50ZXJsb2NrZWQpIHsKKwkJCWNzcl9sbF9sb2NrKHBMaXN0KTsKKwkJfQorCisJCWlmICghY3NySXNMaXN0RW1wdHkoJnBMaXN0LT5MaXN0SGVhZCkpIHsKKworCQkJcEVudHJ5ID0gY3NyX2xpc3RfcmVtb3ZlX3RhaWwoJnBMaXN0LT5MaXN0SGVhZCk7CisJCQlwTGlzdC0+Q291bnQtLTsKKwkJfQorCQlpZiAoZkludGVybG9ja2VkKSB7CisJCQljc3JfbGxfdW5sb2NrKHBMaXN0KTsKKwkJfQorCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK3RMaXN0RWxlbSAqY3NyX2xsX3BlZWtfdGFpbCh0RGJsTGlua0xpc3QgKnBMaXN0LCBib29sIGZJbnRlcmxvY2tlZCkKK3sKKwl0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisKKwlpZiAoIXBMaXN0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHBFbnRyeTsKKwl9CisKKwlpZiAoTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcpIHsKKwkJaWYgKGZJbnRlcmxvY2tlZCkgeworCQkJY3NyX2xsX2xvY2socExpc3QpOworCQl9CisKKwkJaWYgKCFjc3JJc0xpc3RFbXB0eSgmcExpc3QtPkxpc3RIZWFkKSkgeworCQkJcEVudHJ5ID0gcExpc3QtPkxpc3RIZWFkLmxhc3Q7CisJCX0KKwkJaWYgKGZJbnRlcmxvY2tlZCkgeworCQkJY3NyX2xsX3VubG9jayhwTGlzdCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcEVudHJ5OworfQorCit0TGlzdEVsZW0gKmNzcl9sbF9yZW1vdmVfaGVhZCh0RGJsTGlua0xpc3QgKnBMaXN0LCBib29sIGZJbnRlcmxvY2tlZCkKK3sKKwl0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisKKwlpZiAoIXBMaXN0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHBFbnRyeTsKKwl9CisKKwlpZiAoTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcpIHsKKwkJaWYgKGZJbnRlcmxvY2tlZCkgeworCQkJY3NyX2xsX2xvY2socExpc3QpOworCQl9CisKKwkJaWYgKCFjc3JJc0xpc3RFbXB0eSgmcExpc3QtPkxpc3RIZWFkKSkgeworCQkJcEVudHJ5ID0gY3NyX2xpc3RfcmVtb3ZlX2hlYWQoJnBMaXN0LT5MaXN0SGVhZCk7CisJCQlwTGlzdC0+Q291bnQtLTsKKwkJfQorCisJCWlmIChmSW50ZXJsb2NrZWQpIHsKKwkJCWNzcl9sbF91bmxvY2socExpc3QpOworCQl9CisJfQorCisJcmV0dXJuIHBFbnRyeTsKK30KKwordExpc3RFbGVtICpjc3JfbGxfcGVla19oZWFkKHREYmxMaW5rTGlzdCAqcExpc3QsIGJvb2wgZkludGVybG9ja2VkKQoreworCXRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKworCWlmICghcExpc3QpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRXJyb3IhISBwTGlzdCBpcyBOdWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gcEVudHJ5OworCX0KKworCWlmIChMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZykgeworCQlpZiAoZkludGVybG9ja2VkKSB7CisJCQljc3JfbGxfbG9jayhwTGlzdCk7CisJCX0KKworCQlpZiAoIWNzcklzTGlzdEVtcHR5KCZwTGlzdC0+TGlzdEhlYWQpKSB7CisJCQlwRW50cnkgPSBwTGlzdC0+TGlzdEhlYWQubmV4dDsKKwkJfQorCQlpZiAoZkludGVybG9ja2VkKSB7CisJCQljc3JfbGxfdW5sb2NrKHBMaXN0KTsKKwkJfQorCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK3ZvaWQgY3NyX2xsX3B1cmdlKHREYmxMaW5rTGlzdCAqcExpc3QsIGJvb2wgZkludGVybG9ja2VkKQoreworCXRMaXN0RWxlbSAqcEVudHJ5OworCisJaWYgKCFwTGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcpIHsKKwkJaWYgKGZJbnRlcmxvY2tlZCkgeworCQkJY3NyX2xsX2xvY2socExpc3QpOworCQl9CisJCXdoaWxlICgocEVudHJ5ID0gY3NyX2xsX3JlbW92ZV9oZWFkKHBMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKSkpIHsKKwkJCS8qIGp1c3QgcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgbGlzdCB1bnRpbCAqLworCQkJLyogbm90aGluZyBsZWZ0IG9uIHRoZSBsaXN0LiAqLworCQl9CisJCWlmIChmSW50ZXJsb2NrZWQpIHsKKwkJCWNzcl9sbF91bmxvY2socExpc3QpOworCQl9CisJfQorfQorCitib29sIGNzcl9sbF9yZW1vdmVfZW50cnkodERibExpbmtMaXN0ICpwTGlzdCwgdExpc3RFbGVtICpwRW50cnlUb1JlbW92ZSwKKwkJCSBib29sIGZJbnRlcmxvY2tlZCkKK3sKKwlib29sIGZGb3VuZCA9IGZhbHNlOworCXRMaXN0RWxlbSAqcEVudHJ5OworCisJaWYgKCFwTGlzdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmRm91bmQ7CisJfQorCisJaWYgKExJU1RfRkxBR19PUEVOID09IHBMaXN0LT5GbGFnKSB7CisJCWlmIChmSW50ZXJsb2NrZWQpIHsKKwkJCWNzcl9sbF9sb2NrKHBMaXN0KTsKKwkJfQorCisJCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQocExpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCisJCS8qIEhhdmUgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGxvb3AgYmFjayB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgd2hpY2ggd2lsbCAqLworCQkvKiBoYXBwZW4gaWYgdGhlIGVudHJ5IGlzIE5PVCBvbiB0aGUgbGlzdC4uLiAqLworCQl3aGlsZSAocEVudHJ5ICYmIChwRW50cnkgIT0gJnBMaXN0LT5MaXN0SGVhZCkpIHsKKwkJCWlmIChwRW50cnkgPT0gcEVudHJ5VG9SZW1vdmUpIHsKKwkJCQljc3JfbGlzdF9yZW1vdmVfZW50cnkocEVudHJ5KTsKKwkJCQlwTGlzdC0+Q291bnQtLTsKKworCQkJCWZGb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKwkJfQorCQlpZiAoZkludGVybG9ja2VkKSB7CisJCQljc3JfbGxfdW5sb2NrKHBMaXN0KTsKKwkJfQorCQlpZiAocExpc3QtPmNtZFRpbWVvdXRUaW1lcikgeworCQkJY2RmX21jX3RpbWVyX3N0b3AocExpc3QtPmNtZFRpbWVvdXRUaW1lcik7CisJCX0KKwl9CisKKwlyZXR1cm4gZkZvdW5kOworfQorCit0TGlzdEVsZW0gKmNzcl9sbF9uZXh0KHREYmxMaW5rTGlzdCAqcExpc3QsIHRMaXN0RWxlbSAqcEVudHJ5LAorCQkgICAgICAgYm9vbCBmSW50ZXJsb2NrZWQpCit7CisJdExpc3RFbGVtICpwTmV4dEVudHJ5ID0gTlVMTDsKKworCWlmICghcExpc3QpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRXJyb3IhISBwTGlzdCBpcyBOdWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gcE5leHRFbnRyeTsKKwl9CisKKwlpZiAoTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcpIHsKKwkJaWYgKGZJbnRlcmxvY2tlZCkgeworCQkJY3NyX2xsX2xvY2socExpc3QpOworCQl9CisKKwkJaWYgKCFjc3JJc0xpc3RFbXB0eSgmcExpc3QtPkxpc3RIZWFkKQorCQkgICAgJiYgY3NyX2xsX2ZpbmRfZW50cnkocExpc3QsIHBFbnRyeSkpIHsKKwkJCXBOZXh0RW50cnkgPSBwRW50cnktPm5leHQ7CisJCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgd2FsayBwYXN0IHRoZSBoZWFkICovCisJCQlpZiAocE5leHRFbnRyeSA9PSAmcExpc3QtPkxpc3RIZWFkKSB7CisJCQkJcE5leHRFbnRyeSA9IE5VTEw7CisJCQl9CisJCX0KKworCQlpZiAoZkludGVybG9ja2VkKSB7CisJCQljc3JfbGxfdW5sb2NrKHBMaXN0KTsKKwkJfQorCX0KKworCXJldHVybiBwTmV4dEVudHJ5OworfQorCit0TGlzdEVsZW0gKmNzcl9sbF9wcmV2aW91cyh0RGJsTGlua0xpc3QgKnBMaXN0LCB0TGlzdEVsZW0gKnBFbnRyeSwKKwkJCSAgIGJvb2wgZkludGVybG9ja2VkKQoreworCXRMaXN0RWxlbSAqcE5leHRFbnRyeSA9IE5VTEw7CisKKwlpZiAoIXBMaXN0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHBOZXh0RW50cnk7CisJfQorCisJaWYgKExJU1RfRkxBR19PUEVOID09IHBMaXN0LT5GbGFnKSB7CisJCWlmIChmSW50ZXJsb2NrZWQpIHsKKwkJCWNzcl9sbF9sb2NrKHBMaXN0KTsKKwkJfQorCisJCWlmICghY3NySXNMaXN0RW1wdHkoJnBMaXN0LT5MaXN0SGVhZCkKKwkJICAgICYmIGNzcl9sbF9maW5kX2VudHJ5KHBMaXN0LCBwRW50cnkpKSB7CisJCQlwTmV4dEVudHJ5ID0gcEVudHJ5LT5sYXN0OworCQkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHdhbGsgcGFzdCB0aGUgaGVhZCAqLworCQkJaWYgKHBOZXh0RW50cnkgPT0gJnBMaXN0LT5MaXN0SGVhZCkgeworCQkJCXBOZXh0RW50cnkgPSBOVUxMOworCQkJfQorCQl9CisKKwkJaWYgKGZJbnRlcmxvY2tlZCkgeworCQkJY3NyX2xsX3VubG9jayhwTGlzdCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcE5leHRFbnRyeTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc21lL3NyYy9jc3IvY3NyX25laWdoYm9yX3JvYW0uYyBiL2NvcmUvc21lL3NyYy9jc3IvY3NyX25laWdoYm9yX3JvYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWVmNmNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zbWUvc3JjL2Nzci9jc3JfbmVpZ2hib3Jfcm9hbS5jCkBAIC0wLDAgKzEsMzU0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorCisgICAgXGZpbGUgY3NyX25laWdoYm9yX3JvYW0uYworCisJSW1wbGVtZW50YXRpb24gZm9yIHRoZSBzaW1wbGUgcm9hbWluZyBhbGdvcml0aG0gZm9yIDgwMi4xMXIgRmFzdAorCXRyYW5zaXRpb25zIGFuZCBMZWdhY3kgcm9hbWluZyBmb3IgQW5kcm9pZCBwbGF0Zm9ybS4KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworI2luY2x1ZGUgIndtYV90eXBlcy5oIgorI2luY2x1ZGUgImNkc19tcS5oIgorI2luY2x1ZGUgImNzcl9pbnNpZGVfYXBpLmgiCisjaW5jbHVkZSAic21zX2RlYnVnLmgiCisjaW5jbHVkZSAic21lX3Fvc19pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNtZV9pbnNpZGUuaCIKKyNpbmNsdWRlICJob3N0X2RpYWdfY29yZV9ldmVudC5oIgorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2luY2x1ZGUgImNzcl9hcGkuaCIKKyNpbmNsdWRlICJzbWVfYXBpLmgiCisjaW5jbHVkZSAiY3NyX25laWdoYm9yX3JvYW0uaCIKKyNpbmNsdWRlICJtYWNfdHJhY2UuaCIKKworI2RlZmluZSBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlOR19ERUJVRyAxCisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkdfREVCVUcKKyNkZWZpbmUgTkVJR0hCT1JfUk9BTV9ERUJVRyBzbXNfbG9nCisjZWxzZQorI2RlZmluZSBORUlHSEJPUl9ST0FNX0RFQlVHKHggLi4uKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNzcl9uZWlnaGJvcl9yb2FtX3Jlc2V0X2NoYW5uZWxfaW5mbyh0cENzck5laWdoYm9yUm9hbUNoYW5uZWxJbmZvCisJCQkJCQkgckNoSW5mbyk7CitzdGF0aWMgdm9pZCBjc3JfbmVpZ2hib3Jfcm9hbV9yZXNldF9wcmVhdXRoX2NvbnRyb2xfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJCSB1aW50OF90IHNlc3Npb25JZCk7CisKK0NERl9TVEFUVVMgY3NyX3JvYW1fY29weV9jb25uZWN0ZWRfcHJvZmlsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSAgIHRDc3JSb2FtUHJvZmlsZSAqcERzdFByb2ZpbGUpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK3N0YXRpYyBDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX2lzc3VlX3ByZWF1dGhfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgICB1aW50OF90IHNlc3Npb25JZCk7CisjZW5kaWYKKworI2RlZmluZSBDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OKG1hY19jdHgsIG5ld3N0YXRlLCBzZXNzaW9uKSBcCit7IFwKKwltYWNfY3R4LT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbl0ucHJldk5laWdoYm9yUm9hbVN0YXRlID0gXAorCQltYWNfY3R4LT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbl0ubmVpZ2hib3JSb2FtU3RhdGU7IFwKKwltYWNfY3R4LT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbl0ubmVpZ2hib3JSb2FtU3RhdGUgPSBuZXdzdGF0ZTsgXAorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLCBcCisJCUZMKCJTZXNzaW9uaWQgKCVkKSBOZWlnaGJvclJvYW0gdHJhbnNpdGlvbiBmcm9tICVzIHRvICVzIiksIFwKKwkJc2Vzc2lvbiwgY3NyX25laWdoYm9yX3JvYW1fc3RhdGVfdG9fc3RyaW5nKCBcCisJCW1hY19jdHgtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uXS5wcmV2TmVpZ2hib3JSb2FtU3RhdGUpLFwKKwkJY3NyX25laWdoYm9yX3JvYW1fc3RhdGVfdG9fc3RyaW5nKG5ld3N0YXRlKSk7IFwKK30KKwordWludDhfdCAqY3NyX25laWdoYm9yX3JvYW1fc3RhdGVfdG9fc3RyaW5nKHVpbnQ4X3Qgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCQlDQVNFX1JFVFVSTl9TVFJJTkcoZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NMT1NFRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfSU5JVCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ09OTkVDVEVEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRUFTU09DSUFUSU5HKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9QUkVBVVRIRU5USUNBVElORyk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUFJFQVVUSF9ET05FKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gImVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9VTktOT1dOIjsKKwl9CisKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlJfTUVUUklDUworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9zZW5kX2xmcl9tZXRyaWNfZXZlbnQoKSAtIFNlbmQgZXZlbnQgb2YgTEZSIG1ldHJpYworICogQG1hY19jdHg6IEhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAqIEBzZXNzaW9uX2lkOiBTZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAYnNzaWQ6IEJTU0lEIG9mIGF0dGVtcHRlZCBBUAorICogQHN0YXR1czogUmVzdWx0IG9mIExGUiBvcGVyYXRpb24KKyAqCisgKiBMRlIgbWV0cmljcyAtIHByZS1hdXRoIGNvbXBsZXRpb24gbWV0cmljCisgKiBTZW5kIHRoZSBldmVudCB0byBzdXBwbGljYW50IGluZGljYXRpbmcgcHJlLWF1dGggcmVzdWx0CisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KKworc3RhdGljIHZvaWQgY3NyX25laWdoYm9yX3JvYW1fc2VuZF9sZnJfbWV0cmljX2V2ZW50KAorCQkJCXRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJdWludDhfdCBzZXNzaW9uX2lkLAorCQkJCXRTaXJNYWNBZGRyIGJzc2lkLAorCQkJCWVSb2FtQ21kU3RhdHVzIHN0YXR1cykKK3sKKwl0Q3NyUm9hbUluZm8gKnJvYW1faW5mbzsKKworCXJvYW1faW5mbyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0Q3NyUm9hbUluZm8pKTsKKwlpZiAoTlVMTCA9PSByb2FtX2luZm8pIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCBGTCgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkISIpKTsKKwl9IGVsc2UgeworCQljZGZfbWVtX2NvcHkoKHZvaWQgKilyb2FtX2luZm8tPmJzc2lkLAorCQkJICAgICAodm9pZCAqKWJzc2lkLCBzaXplb2YoKnJvYW1faW5mbykpOworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKG1hY19jdHgsIHNlc3Npb25faWQsIHJvYW1faW5mbywgMCwKKwkJCXN0YXR1cywgMCk7CisJCWNkZl9tZW1fZnJlZShyb2FtX2luZm8pOworCX0KK30KKyNlbHNlCisvKiBFbXB0eSBpbmxpbmUgZnVuY3Rpb24gd2lsbCBiZSBhIG5vLW9wICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3NyX25laWdoYm9yX3JvYW1fc2VuZF9sZnJfbWV0cmljX2V2ZW50KAorCQkJCXRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJdWludDhfdCBzZXNzaW9uX2lkLAorCQkJCXRTaXJNYWNBZGRyIGJzc2lkLAorCQkJCWVSb2FtQ21kU3RhdHVzIHN0YXR1cykKK3sKKwk7Cit9CisjZW5kaWYKKworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9mcmVlX25laWdoYm9yX3JvYW1fYnNzX25vZGUoKQorICoKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAbmVpZ2hib3JSb2FtQlNTTm9kZTogTmVpZ2hib3IgUm9hbSBCU1MgTm9kZSB0byBiZSBmcmVlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgYWxsIHRoZSBpbnRlcm5hbCBwb2ludGVycyBDU1IgTmVpZ2hib3JSb2FtIEJTUyBJbmZvCisgKiBhbmQgYWxzbyBmcmVlcyB0aGUgbm9kZSBpdHNlbGYKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCBjc3JfbmVpZ2hib3Jfcm9hbV9mcmVlX25laWdoYm9yX3JvYW1fYnNzX25vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgIHRwQ3NyTmVpZ2hib3JSb2FtQlNTSW5mbworCQkJCQkJICAgbmVpZ2hib3JSb2FtQlNTTm9kZSkKK3sKKwlpZiAobmVpZ2hib3JSb2FtQlNTTm9kZSkgeworCQlpZiAobmVpZ2hib3JSb2FtQlNTTm9kZS0+cEJzc0Rlc2NyaXB0aW9uKSB7CisJCQljZGZfbWVtX2ZyZWUobmVpZ2hib3JSb2FtQlNTTm9kZS0+cEJzc0Rlc2NyaXB0aW9uKTsKKwkJCW5laWdoYm9yUm9hbUJTU05vZGUtPnBCc3NEZXNjcmlwdGlvbiA9IE5VTEw7CisJCX0KKwkJY2RmX21lbV9mcmVlKG5laWdoYm9yUm9hbUJTU05vZGUpOworCQluZWlnaGJvclJvYW1CU1NOb2RlID0gTlVMTDsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1fcmVtb3ZlX3JvYW1hYmxlX2FwX2xpc3RfZW50cnkoKQorICoKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcExpc3Q6IFRoZSBsaXN0IGZyb20gd2hpY2ggdGhlIGVudHJ5IHNob3VsZCBiZSByZW1vdmVkCisgKiBAcE5laWdoYm9yRW50cnk6IE5laWdoYm9yIFJvYW0gQlNTIE5vZGUgdG8gYmUgcmVtb3ZlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhIGdpdmVuIGVudHJ5IGZyb20gdGhlIGdpdmVuIGxpc3QKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGVsc2UgZmFsc2UKKyAqLworYm9vbCBjc3JfbmVpZ2hib3Jfcm9hbV9yZW1vdmVfcm9hbWFibGVfYXBfbGlzdF9lbnRyeSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgICB0RGJsTGlua0xpc3QgKnBMaXN0LAorCQkJCQkJICAgICB0cENzck5laWdoYm9yUm9hbUJTU0luZm8KKwkJCQkJCSAgICAgcE5laWdoYm9yRW50cnkpCit7CisJaWYgKHBMaXN0KSB7CisJCXJldHVybiBjc3JfbGxfcmVtb3ZlX2VudHJ5KHBMaXN0LCAmcE5laWdoYm9yRW50cnktPkxpc3QsCisJCQkJCSAgIExMX0FDQ0VTU19MT0NLKTsKKwl9CisKKwlzbXNfbG9nKHBNYWMsIExPR0UsCisJCUZMCisJCQkoIlJlbW92aW5nIG5laWdoYm9yIEJTUyBub2RlIGZyb20gbGlzdCBmYWlsZWQuIEN1cnJlbnQgY291bnQgPSAlZCIpLAorCQljc3JfbGxfY291bnQocExpc3QpKTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9uZXh0X3JvYW1hYmxlX2FwKCkgLSBHZXQgbmV4dCBBUCBmcm9tIHJvYW1hYmxlIEFQIGxpc3QKKyAqIEBtYWNfY3R4IC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAqIEBwbGlzdCAtIFRoZSBsaXN0IGZyb20gd2hpY2ggdGhlIGVudHJ5IHNob3VsZCBiZSByZXR1cm5lZAorICogQG5laWdoYm9yX2VudHJ5IC0gTmVpZ2hib3IgUm9hbSBCU1MgTm9kZSB3aG9zZSBuZXh0IGVudHJ5IHNob3VsZCBiZSByZXR1cm5lZAorICoKKyAqIEdldHMgdGhlIGVudHJ5IG5leHQgdG8gcGFzc2VkIGVudHJ5LiBJZiBOVUxMIGlzIHBhc3NlZCwgcmV0dXJuIHRoZSBlbnRyeQorICogaW4gdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqCisgKiBSZXR1cm46IE5laWdoYm9yIFJvYW0gQlNTIE5vZGUgdG8gYmUgcmV0dXJuZWQKKyAqLwordHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIGNzcl9uZWlnaGJvcl9yb2FtX25leHRfcm9hbWFibGVfYXAoCisJCQkJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdERibExpbmtMaXN0ICpsbGlzdCwKKwkJCQl0cENzck5laWdoYm9yUm9hbUJTU0luZm8gbmVpZ2hib3JfZW50cnkpCit7CisJdExpc3RFbGVtICplbnRyeSA9IE5VTEw7CisJdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIHJlc3VsdCA9IE5VTEw7CisKKwlpZiAobGxpc3QpIHsKKwkJaWYgKE5VTEwgPT0gbmVpZ2hib3JfZW50cnkpCisJCQllbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQobGxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKwkJZWxzZQorCQkJZW50cnkgPSBjc3JfbGxfbmV4dChsbGlzdCwgJm5laWdoYm9yX2VudHJ5LT5MaXN0LAorCQkJCQlMTF9BQ0NFU1NfTE9DSyk7CisJCWlmIChlbnRyeSkKKwkJCXJlc3VsdCA9IEdFVF9CQVNFX0FERFIoZW50cnksIHRDc3JOZWlnaGJvclJvYW1CU1NJbmZvLAorCQkJCQlMaXN0KTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGNzcl9uZWlnaGJvcl9yb2FtX2ZyZWVfcm9hbWFibGVfYnNzX2xpc3QoKSAtIEZyZWVzIHJvYW1hYmxlIEFQcyBsaXN0CisgKiBAbWFjX2N0eDogVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAqIEBsbGlzdDogTmVpZ2hib3IgUm9hbSBCU1MgTGlzdCB0byBiZSBlbXB0aWVkCisgKgorICogRW1wdGllcyBhbmQgZnJlZXMgYWxsIHRoZSBub2RlcyBpbiB0aGUgcm9hbWFibGUgQVAgbGlzdAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIGNzcl9uZWlnaGJvcl9yb2FtX2ZyZWVfcm9hbWFibGVfYnNzX2xpc3QodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkJICAgICAgdERibExpbmtMaXN0ICpsbGlzdCkKK3sKKwl0cENzck5laWdoYm9yUm9hbUJTU0luZm8gcmVzdWx0ID0gTlVMTDsKKworCU5FSUdIQk9SX1JPQU1fREVCVUcobWFjX2N0eCwgTE9HMiwKKwkJCSAgICBGTCgiRW1wdHlpbmcgdGhlIEJTUyBsaXN0LiBDdXJyZW50IGNvdW50ID0gJWQiKSwKKwkJCSAgICBjc3JfbGxfY291bnQobGxpc3QpKTsKKworCS8qCisJICogUGljayB1cCB0aGUgaGVhZCwgcmVtb3ZlIGFuZCBmcmVlIHRoZSBub2RlIHRpbGwKKwkgKiB0aGUgbGlzdCBiZWNvbWVzIGVtcHR5CisJICovCisJd2hpbGUgKChyZXN1bHQgPSBjc3JfbmVpZ2hib3Jfcm9hbV9uZXh0X3JvYW1hYmxlX2FwKG1hY19jdHgsIGxsaXN0LAorCQkJCQkJCU5VTEwpKSAhPSBOVUxMKSB7CisJCWNzcl9uZWlnaGJvcl9yb2FtX3JlbW92ZV9yb2FtYWJsZV9hcF9saXN0X2VudHJ5KG1hY19jdHgsCisJCQlsbGlzdCwgcmVzdWx0KTsKKwkJY3NyX25laWdoYm9yX3JvYW1fZnJlZV9uZWlnaGJvcl9yb2FtX2Jzc19ub2RlKG1hY19jdHgsIHJlc3VsdCk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY3NyX25laWdoYm9yX3JvYW1fdHJpZ2dlcl9oYW5kb2ZmKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCWlmIChjc3Jfcm9hbV9pc19mYXN0X3JvYW1fZW5hYmxlZChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCWNzcl9uZWlnaGJvcl9yb2FtX2lzc3VlX3ByZWF1dGhfcmVxKHBNYWMsIHNlc3Npb25JZCk7CisJfSBlbHNlIAl7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIlJvYW1pbmcgaXMgZGlpc2FibGVkIikpOworCX0KK30KKworQ0RGX1NUQVRVUworY3NyX25laWdoYm9yX3JvYW1fdXBkYXRlX2Zhc3Rfcm9hbWluZ19lbmFibGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgICBjb25zdCBib29sIGZhc3RSb2FtRW5hYmxlZCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9CisJCSZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKwkvKiBzZXQgZmFzdCByb2FtIGVuYWJsZS9kaXNhYmxlIGZsYWcgKi8KKwlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzRmFzdFJvYW1JbmlGZWF0dXJlRW5hYmxlZCA9IGZhc3RSb2FtRW5hYmxlZDsKKworCXN3aXRjaCAocE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKSB7CisJY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ09OTkVDVEVEOgorCQlpZiAodHJ1ZSA9PSBmYXN0Um9hbUVuYWJsZWQpIHsKKwkJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJCSAgICAgIFJPQU1fU0NBTl9PRkZMT0FEX1NUQVJULAorCQkJCQkgICAgICBSRUFTT05fQ09OTkVDVCk7CisJCX0gZWxzZSB7CisJCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCQkgICAgICBST0FNX1NDQU5fT0ZGTE9BRF9TVE9QLAorCQkJCQkgICAgICBSRUFTT05fRElTQ09OTkVDVEVEKTsKKwkJfQorCWJyZWFrOworCWNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwKKwkJCQlGTAorCQkJCSgiQ3VycmVudGx5IGluIElOSVQgc3RhdGUsIE5vdGhpbmcgdG8gZG8iKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HRSwKKwkJCQlGTAorCQkJCSgiVW5leHBlY3RlZCBzdGF0ZSAlcywgcmV0dXJuaW5nIGZhaWx1cmUiKSwKKwkJCQltYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlCisJCQkJKHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1fdXBkYXRlX2VzZV9tb2RlX2VuYWJsZWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCQkgICAgIGNvbnN0IGJvb2wgZXNlTW9kZSkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9CisJICAgICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKworCXN3aXRjaCAocE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKSB7CisJY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ09OTkVDVEVEOgorCQlpZiAodHJ1ZSA9PSBlc2VNb2RlKSB7CisJCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCQkgICBST0FNX1NDQU5fT0ZGTE9BRF9TVEFSVCwKKwkJCQkJICAgUkVBU09OX0NPTk5FQ1QpOworCQl9IGVsc2UgaWYgKGZhbHNlID09IGVzZU1vZGUpIHsKKwkJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJCSAgIFJPQU1fU0NBTl9PRkZMT0FEX1NUT1AsCisJCQkJCSAgIFJFQVNPTl9ESVNDT05ORUNURUQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfSU5JVDoKKwkJTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLAorCQkJCSAgICBMT0cyLAorCQkJCSAgICBGTAorCQkJCSAgICAoIkN1cnJlbnRseSBpbiBJTklUIHN0YXRlLCBOb3RoaW5nIHRvIGRvIikpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HRSwKKwkJCQkgICAgRkwKKwkJCQkgICAgKCJVbmV4cGVjdGVkIHN0YXRlICVkLCByZXR1cm5pbmcgZmFpbHVyZSIpLAorCQkJCSAgICBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisjZW5kaWYKKworQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV9zZXRfbG9va3VwX3Jzc2lfdGhyZXNob2xkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQl1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJCXVpbnQ4X3QKKwkJCQkJCSAgbmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCSAgICAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJc3dpdGNoIChwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpIHsKKwljYXNlIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DT05ORUNURUQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwKKwkJCQlGTCgiQ3VycmVudGx5IGluIENPTk5FQ1RFRCBzdGF0ZSwgIgorCQkJCSJzZW5kaW5nIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcuIikpOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5laWdoYm9yTG9va3VwVGhyZXNob2xkID0KKwkJICAgIG5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZDsKKwkJcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnROZWlnaGJvckxvb2t1cFRocmVzaG9sZCA9CisJCSAgICBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5laWdoYm9yTG9va3VwVGhyZXNob2xkOworCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCSAgIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcsCisJCQkJICAgUkVBU09OX0xPT0tVUF9USFJFU0hfQ0hBTkdFRCk7CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfSU5JVDoKKwkJTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cyLAorCQkJCSAgICBGTCgiQ3VycmVudGx5IGluIElOSVQgc3RhdGUsICIKKwkJCQkgICAgICAgImp1c3Qgc2V0IGxvb2t1cFJzc2kgdGhyZXNob2xkLiIpKTsKKwkJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvckxvb2t1cFRocmVzaG9sZCA9CisJCSAgICBuZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQ7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50TmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgPQorCQkgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvckxvb2t1cFRocmVzaG9sZDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsCisJCQkJICAgIEZMCisJCQkJICAgICgiVW5leHBlY3RlZCBzdGF0ZSAlcywgcmV0dXJuaW5nIGZhaWx1cmUiKSwKKwkJCQkgICAgbWFjX3RyYWNlX2dldF9uZWlnaGJvdXJfcm9hbV9zdGF0ZQorCQkJCSAgICAocE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKSk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjZGZfc3RhdHVzOworfQorCitDREZfU1RBVFVTCitjc3JfbmVpZ2hib3Jfcm9hbV9zZXRfb3Bwb3J0dW5pc3RpY19zY2FuX3RocmVzaG9sZF9kaWZmKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQl1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJCXVpbnQ4X3QKKwkJCQkJCSAgICBuT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmYpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCSAgICAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisKKwlzd2l0Y2ggKHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkgeworCWNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NPTk5FQ1RFRDoKKwkJTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cyLAorCQkJCSAgICBGTCgiQ3VycmVudGx5IGluIENPTk5FQ1RFRCBzdGF0ZSwgIgorCQkJCSAgICAgICAic2VuZGluZyBST0FNX1NDQU5fT0ZGTE9BRF9VUERBVEVfQ0ZHIikpOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZiA9CisJCSAgICBuT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmY7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50T3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmYgPQorCQkgICAgbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmOworCisJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLAorCQkJCSAgIHNlc3Npb25JZCwKKwkJCQkgICBST0FNX1NDQU5fT0ZGTE9BRF9VUERBVEVfQ0ZHLAorCQkJCSAgIFJFQVNPTl9PUFBPUlRVTklTVElDX1RIUkVTSF9ESUZGX0NIQU5HRUQpOworCQlicmVhazsKKworCWNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwKKwkJCQlGTCgiQ3VycmVudGx5IGluIElOSVQgc3RhdGUsICIKKwkJCQkgICAianVzdCBzZXQgb3Bwb3J0dW5pc3RpYyB0aHJlc2hvbGQgZGlmZiIpKTsKKwkJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmYgPQorCQkgICAgbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudE9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmID0KKwkJICAgIG5PcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsCisJCQkJICAgIEZMKCJVbmV4cGVjdGVkIHN0YXRlICVkIHJldHVybmluZyBmYWlsdXJlIiksCisJCQkJICAgIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjZGZfc3RhdHVzOworfQorCitDREZfU1RBVFVTCitjc3JfbmVpZ2hib3Jfcm9hbV9zZXRfcm9hbV9yZXNjYW5fcnNzaV9kaWZmKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgIHVpbnQ4X3QgblJvYW1SZXNjYW5Sc3NpRGlmZikKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9CisJICAgICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKworCXN3aXRjaCAocE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKSB7CisJY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ09OTkVDVEVEOgorCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzIsCisJCQkJRkwoIkN1cnJlbnRseSBpbiBDT05ORUNURUQgc3RhdGUsICIKKwkJCQkgICAic2VuZGluZyBST0FNX1NDQU5fT0ZGTE9BRF9VUERBVEVfQ0ZHLiIpKTsKKwkJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uUm9hbVJlc2NhblJzc2lEaWZmID0KKwkJICAgIG5Sb2FtUmVzY2FuUnNzaURpZmY7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50Um9hbVJlc2NhblJzc2lEaWZmID0KKwkJICAgIG5Sb2FtUmVzY2FuUnNzaURpZmY7CisJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJICAgUk9BTV9TQ0FOX09GRkxPQURfVVBEQVRFX0NGRywKKwkJCQkgICBSRUFTT05fUk9BTV9SRVNDQU5fUlNTSV9ESUZGX0NIQU5HRUQpOworCQlicmVhazsKKworCWNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwKKwkJCQkgICAgRkwoIkN1cnJlbnRseSBpbiBJTklUIHN0YXRlLCAiCisJCQkJICAgICAgICJqdXN0IHNldCByZXNjYW4gcnNzaSBkaWZmIikpOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5Sb2FtUmVzY2FuUnNzaURpZmYgPQorCQkgICAgblJvYW1SZXNjYW5Sc3NpRGlmZjsKKwkJcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnRSb2FtUmVzY2FuUnNzaURpZmYgPQorCQkgICAgblJvYW1SZXNjYW5Sc3NpRGlmZjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsCisJCQkJICAgIEZMKCJVbmV4cGVjdGVkIHN0YXRlICVkIHJldHVybmluZyBmYWlsdXJlIiksCisJCQkJICAgIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjZGZfc3RhdHVzOworfQorCitDREZfU1RBVFVTCitjc3JfbmVpZ2hib3Jfcm9hbV9zZXRfcm9hbV9ibWlzc19maXJzdF9iY250KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgIHVpbnQ4X3QgblJvYW1CbWlzc0ZpcnN0QmNudCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9CisJICAgICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKworCXN3aXRjaCAocE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKSB7CisJY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ09OTkVDVEVEOgorCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzIsCisJCQkJRkwoIkN1cnJlbnRseSBpbiBDT05ORUNURUQgc3RhdGUsICIKKwkJCQkgICAic2VuZGluZyBST0FNX1NDQU5fT0ZGTE9BRF9VUERBVEVfQ0ZHLiIpKTsKKwkJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uUm9hbUJtaXNzRmlyc3RCY250ID0KKwkJICAgIG5Sb2FtQm1pc3NGaXJzdEJjbnQ7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50Um9hbUJtaXNzRmlyc3RCY250ID0KKwkJICAgIG5Sb2FtQm1pc3NGaXJzdEJjbnQ7CisKKwkJY3NyX3JvYW1fb2ZmbG9hZF9zY2FuKHBNYWMsCisJCQkJICAgc2Vzc2lvbklkLAorCQkJCSAgIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcsCisJCQkJICAgUkVBU09OX1JPQU1fQk1JU1NfRklSU1RfQkNOVF9DSEFOR0VEKTsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9JTklUOgorCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsCisJCSAgTE9HMiwgRkwKKwkJICAoIkN1cnJlbnRseSBpbiBJTklUIHN0YXRlLCBzYWZlIHRvIHNldCByb2FtIHJlc2NhbiByc3NpIGRpZmYiKSk7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMublJvYW1CbWlzc0ZpcnN0QmNudCA9CisJCSAgICBuUm9hbUJtaXNzRmlyc3RCY250OworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudFJvYW1CbWlzc0ZpcnN0QmNudCA9CisJCSAgICBuUm9hbUJtaXNzRmlyc3RCY250OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywKKwkJCQkgICAgTE9HRSwKKwkJCQkgICAgRkwoIlVuZXhwZWN0ZWQgc3RhdGUgJWQgcmV0dXJuaW5nIGZhaWx1cmUiKSwKKwkJCQkgICAgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlicmVhazsKKwl9CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKK0NERl9TVEFUVVMKK2Nzcl9uZWlnaGJvcl9yb2FtX3NldF9yb2FtX2JtaXNzX2ZpbmFsX2JjbnQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgdWludDhfdCBuUm9hbUJtaXNzRmluYWxCY250KQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0KKwkgICAgJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCisJc3dpdGNoIChwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpIHsKKwljYXNlIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DT05ORUNURUQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwKKwkJCQkgICAgRkwoIkN1cnJlbnRseSBpbiBDT05ORUNURUQgc3RhdGUsICIKKwkJCQkgICAgICAgInNlbmRpbmcgUk9BTV9TQ0FOX09GRkxPQURfVVBEQVRFX0NGRy4iKSk7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMublJvYW1CbWlzc0ZpbmFsQmNudCA9CisJCSAgICBuUm9hbUJtaXNzRmluYWxCY250OworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudFJvYW1CbWlzc0ZpbmFsQmNudCA9CisJCSAgICBuUm9hbUJtaXNzRmluYWxCY250OworCisJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJICAgUk9BTV9TQ0FOX09GRkxPQURfVVBEQVRFX0NGRywKKwkJCQkgICBSRUFTT05fUk9BTV9CTUlTU19GSU5BTF9CQ05UX0NIQU5HRUQpOworCQlicmVhazsKKworCWNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwKKwkJCQkgICAgRkwoIkN1cnJlbnRseSBpbiBJTklUIHN0YXRlLCAiCisJCQkJICAgICAgICJqdXN0IHNldCByb2FtIGZpYW5sIGJtaXNzIGNvdW50IikpOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5Sb2FtQm1pc3NGaW5hbEJjbnQgPQorCQkgICAgblJvYW1CbWlzc0ZpbmFsQmNudDsKKwkJcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnRSb2FtQm1pc3NGaW5hbEJjbnQgPQorCQkgICAgblJvYW1CbWlzc0ZpbmFsQmNudDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsCisJCQkJICAgIExPR0UsCisJCQkJICAgIEZMKCJVbmV4cGVjdGVkIHN0YXRlICVkIHJldHVybmluZyBmYWlsdXJlIiksCisJCQkJICAgIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjZGZfc3RhdHVzOworfQorCitDREZfU1RBVFVTCitjc3JfbmVpZ2hib3Jfcm9hbV9zZXRfcm9hbV9iZWFjb25fcnNzaV93ZWlnaHQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgIHVpbnQ4X3QgblJvYW1CZWFjb25Sc3NpV2VpZ2h0KQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0KKwkgICAgJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCisJc3dpdGNoIChwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpIHsKKwljYXNlIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DT05ORUNURUQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwKKwkJCQlGTCgiQ3VycmVudGx5IGluIENPTk5FQ1RFRCBzdGF0ZSwgIgorCQkJCSAgICJzZW5kaW5nIFJPQU1fU0NBTl9PRkZMT0FEX1VQREFURV9DRkcuIikpOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5Sb2FtQmVhY29uUnNzaVdlaWdodCA9CisJCSAgICBuUm9hbUJlYWNvblJzc2lXZWlnaHQ7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50Um9hbUJlYWNvblJzc2lXZWlnaHQgPQorCQkgICAgblJvYW1CZWFjb25Sc3NpV2VpZ2h0OworCisJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJICAgUk9BTV9TQ0FOX09GRkxPQURfVVBEQVRFX0NGRywKKwkJCQkgICBSRUFTT05fUk9BTV9CRUFDT05fUlNTSV9XRUlHSFRfQ0hBTkdFRCk7CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfSU5JVDoKKwkJTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cyLAorCQkJCSAgICBGTCgiQ3VycmVudGx5IGluIElOSVQgc3RhdGUsICIKKwkJCQkgICAgICAgImp1c3Qgc2V0IHJvYW0gYmVhY29uIHJzc2kgd2VpZ2h0IikpOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5Sb2FtQmVhY29uUnNzaVdlaWdodCA9CisJCSAgICBuUm9hbUJlYWNvblJzc2lXZWlnaHQ7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50Um9hbUJlYWNvblJzc2lXZWlnaHQgPQorCQkgICAgblJvYW1CZWFjb25Sc3NpV2VpZ2h0OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywKKwkJCQkgICAgTE9HRSwKKwkJCQkgICAgRkwoIlVuZXhwZWN0ZWQgc3RhdGUgJWQgcmV0dXJuaW5nIGZhaWx1cmUiKSwKKwkJCQkgICAgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlicmVhazsKKwl9CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qQ2xlYW5VUCBSb3V0aW5lcyovCitzdGF0aWMgdm9pZCBjc3JfbmVpZ2hib3Jfcm9hbV9yZXNldF9jaGFubmVsX2luZm8odHBDc3JOZWlnaGJvclJvYW1DaGFubmVsSW5mbworCQkJCQkJIHJDaEluZm8pCit7CisJaWYgKChyQ2hJbmZvLT5JQVBQTmVpZ2hib3JMaXN0UmVjZWl2ZWQgPT0gZmFsc2UpICYmCisJICAgIChyQ2hJbmZvLT5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLm51bU9mQ2hhbm5lbHMpKSB7CisJCXJDaEluZm8tPmN1cnJlbnRDaGFuSW5kZXggPQorCQkJQ1NSX05FSUdIQk9SX1JPQU1fSU5WQUxJRF9DSEFOTkVMX0lOREVYOworCQlyQ2hJbmZvLT5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworCisJCWlmIChyQ2hJbmZvLT5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KQorCQkJY2RmX21lbV9mcmVlKHJDaEluZm8tPmN1cnJlbnRDaGFubmVsTGlzdEluZm8uCisJCQkJICAgICBDaGFubmVsTGlzdCk7CisKKwkJckNoSW5mby0+Y3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJckNoSW5mby0+Y3VycmVudENoYW5JbmRleCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBjc3JfbmVpZ2hib3Jfcm9hbV9yZXNldF9wcmVhdXRoX2NvbnRyb2xfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJCSB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0KKwkJJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJcE5laWdoYm9yUm9hbUluZm8tPmlzMTFyQXNzb2MgPSBmYWxzZTsKKwkvKiBQdXJnZSBwcmUtYXV0aCBmYWlsIGxpc3QgKi8KKwljc3JfbmVpZ2hib3Jfcm9hbV9wdXJnZV9wcmVhdXRoX2ZhaWxlZF9saXN0KHBNYWMpOworI2VuZGlmCisKKwlwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVhdXRoUnNwUGVuZGluZyA9IGZhbHNlOworCXBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm51bVByZUF1dGhSZXRyaWVzID0gMDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCS8qIERvIG5vdCBmcmVlIHVwIHRoZSBwcmVhdXRoIGRvbmUgbGlzdCBoZXJlICovCisJcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8uY3VycmVudE5laWdoYm9yUnB0UmV0cnlOdW0gPSAwOworCXBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm5laWdoYm9yUnB0UGVuZGluZyA9IGZhbHNlOworCXBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm51bUJzc0Zyb21OZWlnaGJvclJlcG9ydCA9IDA7CisJY2RmX21lbV96ZXJvKHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm5laWdoYm9SZXBvcnRCc3NJbmZvLAorCQkgICAgIHNpemVvZih0Q3NyTmVpZ2hib3JSZXBvcnRCc3NJbmZvKSAqCisJCSAgICAgTUFYX0JTU19JTl9ORUlHSEJPUl9SUFQpOworI2VuZGlmCisJcE5laWdoYm9yUm9hbUluZm8tPnVPc1JlcXVlc3RlZEhhbmRvZmYgPSAwOworCWNkZl9tZW1femVybygmcE5laWdoYm9yUm9hbUluZm8tPmhhbmRvZmZSZXFJbmZvLAorCQkgICAgIHNpemVvZih0Q3NySGFuZG9mZlJlcXVlc3QpKTsKK30KKworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9yZXNldF9jb25uZWN0ZWRfc3RhdGVfY29udHJvbF9pbmZvKCkKKyAqCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHNlc3Npb25JZCA6IHNlc3Npb24gaWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIG5laWdoYm9yIHJvYW0gY29udHJvbCBpbmZvIGRhdGEgc3RydWN0dXJlcy4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgd2hlbmV2ZXIgd2UgbW92ZSB0byBDT05ORUNURUQgc3RhdGUgZnJvbQorICogYW55IHN0YXRlIG90aGVyIHRoYW4gSU5JVCBzdGF0ZQorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNzcl9uZWlnaGJvcl9yb2FtX3Jlc2V0X2Nvbm5lY3RlZF9zdGF0ZV9jb250cm9sX2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCQkgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisKKwljc3JfbmVpZ2hib3Jfcm9hbV9yZXNldF9jaGFubmVsX2luZm8oJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8pOworCWNzcl9uZWlnaGJvcl9yb2FtX2ZyZWVfcm9hbWFibGVfYnNzX2xpc3QocE1hYywKKwkJCQkJCSAmcE5laWdoYm9yUm9hbUluZm8tPnJvYW1hYmxlQVBMaXN0KTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJLyogRG8gbm90IGZyZWUgdXAgdGhlIHByZWF1dGggZG9uZSBsaXN0IGhlcmUgKi8KKwlwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5jdXJyZW50TmVpZ2hib3JScHRSZXRyeU51bSA9IDA7CisJcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ubmVpZ2hib3JScHRQZW5kaW5nID0gZmFsc2U7CisJcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ubnVtUHJlQXV0aFJldHJpZXMgPSAwOworCXBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm51bUJzc0Zyb21OZWlnaGJvclJlcG9ydCA9IDA7CisJcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlYXV0aFJzcFBlbmRpbmcgPSAwOworCWNkZl9tZW1femVybyhwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5uZWlnaGJvUmVwb3J0QnNzSW5mbywKKwkJICAgICBzaXplb2YodENzck5laWdoYm9yUmVwb3J0QnNzSW5mbykgKgorCQkgICAgIE1BWF9CU1NfSU5fTkVJR0hCT1JfUlBUKTsKKyNlbmRpZgorCXBOZWlnaGJvclJvYW1JbmZvLT51T3NSZXF1ZXN0ZWRIYW5kb2ZmID0gMDsKKwljZGZfbWVtX3plcm8oJnBOZWlnaGJvclJvYW1JbmZvLT5oYW5kb2ZmUmVxSW5mbywKKwkJICAgICBzaXplb2YodENzckhhbmRvZmZSZXF1ZXN0KSk7Cit9CisKK3ZvaWQgY3NyX25laWdoYm9yX3JvYW1fcmVzZXRfcmVwb3J0X3NjYW5fc3RhdGVfY29udHJvbF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisKKwljZGZfemVyb19tYWNhZGRyKCZwTmVpZ2hib3JSb2FtSW5mby0+Y3VyckFQYnNzaWQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwlwTmVpZ2hib3JSb2FtSW5mby0+aXNFU0VBc3NvYyA9IGZhbHNlOworCXBOZWlnaGJvclJvYW1JbmZvLT5pc1ZPQWRtaXR0ZWQgPSBmYWxzZTsKKwlwTmVpZ2hib3JSb2FtSW5mby0+TWluUUJzc0xvYWRSZXF1aXJlZCA9IDA7CisjZW5kaWYKKworCS8qIFB1cmdlIHJvYW1hYmxlIEFQIGxpc3QgKi8KKwljc3JfbmVpZ2hib3Jfcm9hbV9mcmVlX3JvYW1hYmxlX2Jzc19saXN0KHBNYWMsCisJCQkJCQkgJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtYWJsZUFQTGlzdCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGNzcl9uZWlnaGJvcl9yb2FtX3Jlc2V0X2luaXRfc3RhdGVfY29udHJvbF9pbmZvKCkKKyAqCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHNlc3Npb25JZCA6IHNlc3Npb24gaWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIG5laWdoYm9yIHJvYW0gY29udHJvbCBpbmZvIGRhdGEgc3RydWN0dXJlcy4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgd2hlbmV2ZXIgd2UgbW92ZSB0byBDT05ORUNURUQgc3RhdGUgZnJvbQorICogSU5JVCBzdGF0ZQorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIGNzcl9uZWlnaGJvcl9yb2FtX3Jlc2V0X2luaXRfc3RhdGVfY29udHJvbF9pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCWNzcl9uZWlnaGJvcl9yb2FtX3Jlc2V0X2Nvbm5lY3RlZF9zdGF0ZV9jb250cm9sX2luZm8ocE1hYywgc2Vzc2lvbklkKTsKKworCS8qIEluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSByZXNldHMsCisJICAgd2Ugc2hvdWxkIGNsZWFyIG9mZiB0aGUgY3VyQVBCc3NJZC9TZXNzaW9uIElEIGluIHRoZSB0aW1lcnMgKi8KKwljc3JfbmVpZ2hib3Jfcm9hbV9yZXNldF9yZXBvcnRfc2Nhbl9zdGF0ZV9jb250cm9sX2luZm8ocE1hYywgc2Vzc2lvbklkKTsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JfbmVpZ2hib3Jfcm9hbV9wdXJnZV9wcmVhdXRoX2ZhaWxfbGlzdAorCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGVtcHRpZXMgdGhlIHByZWF1dGggZmFpbCBsaXN0CisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorCisgICAgXHJldHVybiBWT0lECisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNzcl9uZWlnaGJvcl9yb2FtX3B1cmdlX3ByZWF1dGhfZmFpbF9saXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDhfdCBpOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPSBOVUxMOworCisJTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiUHVyZ2luZyB0aGUgcHJlYXV0aCBmYWlsIGxpc3QiKSk7CisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW2ldOworCQl3aGlsZSAocE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0LgorCQkgICAgICAgbnVtTUFDQWRkcmVzcykgeworCQkJY2RmX21lbV96ZXJvKHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLgorCQkJCSAgICAgcHJlQXV0aEZhaWxMaXN0LgorCQkJCSAgICAgbWFjQWRkcmVzc1twTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby4KKwkJCQkJCXByZUF1dGhGYWlsTGlzdC5udW1NQUNBZGRyZXNzIC0KKwkJCQkJCTFdLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJCXBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhGYWlsTGlzdC4KKwkJCW51bU1BQ0FkZHJlc3MtLTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1fYWRkX3ByZWF1dGhfZmFpbCgpIC0gYWRkIGJzc2lkIHRvIHByZWF1dGggZmFpbGVkIGxpc3QKKyAqIEBtYWNfY3R4OiBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQGJzc2lkOiBCU1NJRCB0byBiZSBhZGRlZCB0byB0aGUgcHJlYXV0aCBmYWlsIGxpc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgdGhlIGdpdmVuIEJTU0lEIHRvIHRoZSBQcmVhdXRoIGZhaWwgbGlzdAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV9GQUlMVVJFIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX2FkZF9wcmVhdXRoX2ZhaWwodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkJdWludDhfdCBzZXNzaW9uX2lkLAorCQkJCQl0U2lyTWFjQWRkciBic3NpZCkKK3sKKwl1aW50OF90IGkgPSAwOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gbmVpZ2hib3Jfcm9hbV9pbmZvID0KKwkJJm1hY19jdHgtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uX2lkXTsKKwl1aW50OF90IG51bV9tYWNfYWRkciA9IG5laWdoYm9yX3JvYW1faW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRmFpbExpc3QuCisJCQkJbnVtTUFDQWRkcmVzczsKKworCU5FSUdIQk9SX1JPQU1fREVCVUcobWFjX2N0eCwgTE9HRSwKKwkJRkwoIiBBZGRlZCBCU1NJRCAiIE1BQ19BRERSRVNTX1NUUiAiIHRvIFByZWF1dGggZmFpbGVkIGxpc3QiKSwKKwkJTUFDX0FERFJfQVJSQVkoYnNzaWQpKTsKKworCWZvciAoaSA9IDA7CisJICAgICBpIDwgbmVpZ2hib3Jfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhGYWlsTGlzdC5udW1NQUNBZGRyZXNzOworCSAgICAgaSsrKSB7CisJCWlmICh0cnVlID09IGNkZl9tZW1fY29tcGFyZSgKKwkJICAgbmVpZ2hib3Jfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhGYWlsTGlzdC5tYWNBZGRyZXNzW2ldLAorCQkgICBic3NpZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HVywgRkwoIkJTU0lEICJNQUNfQUREUkVTU19TVFIiIGFscmVhZHkgcHJlc2VudCBpbiBwcmVhdXRoIGZhaWwgbGlzdCIpLAorCQkJTUFDX0FERFJfQVJSQVkoYnNzaWQpKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlpZiAoKG51bV9tYWNfYWRkciArIDEpID4gTUFYX05VTV9QUkVBVVRIX0ZBSUxfTElTVF9BRERSRVNTKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJDYW5ub3QgYWRkLCBwcmVhdXRoIGZhaWwgbGlzdCBpcyBmdWxsLiIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwljZGZfbWVtX2NvcHkobmVpZ2hib3Jfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhGYWlsTGlzdC4KKwkJICAgICBtYWNBZGRyZXNzW251bV9tYWNfYWRkcl0sIGJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwluZWlnaGJvcl9yb2FtX2luZm8tPkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0Lm51bU1BQ0FkZHJlc3MrKzsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1faXNfcHJlYXV0aF9jYW5kaWRhdGUoKQorICoKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAYnNzSWQgOiBCU1NJRCBvZiB0aGUgY2FuZGlkYXRlCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gTUFDIGFkZHJlc3MgaXMgYWxyZWFkeSBwcmVzZW50CisgKiBpbiB0aGUgcHJlYXV0aCBmYWlsIGxpc3QgYW5kIHJldHVybnMgdHJ1ZS9mYWxzZSBhY2NvcmRpbmdseQorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBwcmVhdXRoIGNhbmRpZGF0ZSwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgY3NyX25laWdoYm9yX3JvYW1faXNfcHJlYXV0aF9jYW5kaWRhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLCB0U2lyTWFjQWRkciBic3NJZCkKK3sKKwl1aW50OF90IGkgPSAwOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisKKwlpZiAoY3NyX3JvYW1faXNfcm9hbV9vZmZsb2FkX3NjYW5fZW5hYmxlZChwTWFjKSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKDAgPT0gcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0Lm51bU1BQ0FkZHJlc3MpCisJCXJldHVybiB0cnVlOworCisJZm9yIChpID0gMDsKKwkgICAgIGkgPCBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRmFpbExpc3QubnVtTUFDQWRkcmVzczsKKwkgICAgIGkrKykgeworCQlpZiAodHJ1ZSA9PQorCQkgICAgY2RmX21lbV9jb21wYXJlKHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLgorCQkJCSAgICBwcmVBdXRoRmFpbExpc3QubWFjQWRkcmVzc1tpXSwgYnNzSWQsCisJCQkJICAgIHNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsCisJCQkJCSAgICBGTCgiQlNTSUQgIiBNQUNfQUREUkVTU19TVFIKKwkJCQkJICAgICAgICIgYWxyZWFkeSBwcmVzZW50IGluIHByZWF1dGggZmFpbCBsaXN0IiksCisJCQkJCSAgICBNQUNfQUREUl9BUlJBWShic3NJZCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1faXNzdWVfcHJlYXV0aF9yZXEoKSAtIFNlbmQgcHJlYXV0aCByZXF1ZXN0IHRvIGZpcnN0IEFQCisgKiBAbWFjX2N0eDogVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAqIEBzZXNzaW9uX2lkOiBTZXNzaW9uIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpc3N1ZXMgcHJlYXV0aCByZXF1ZXN0IHRvIFBFIHdpdGggdGhlIDFzdCBBUCBlbnRyeSBpbiB0aGUKKyAqIHJvYW1hYmxlIEFQIGxpc3QKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBDREZfU1RBVFVTX0VfRkFJTFVSRSBvdGhlcndpc2UKKyAqLworc3RhdGljIENERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1faXNzdWVfcHJlYXV0aF9yZXEodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbl9pZCkKK3sKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIG5laWdoYm9yX3JvYW1faW5mbyA9CisJCSZtYWNfY3R4LT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbl9pZF07CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIG5laWdoYm9yX2Jzc19ub2RlOworCisKKwlpZiAoZmFsc2UgIT0gbmVpZ2hib3Jfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLnByZWF1dGhSc3BQZW5kaW5nKSB7CisJCS8qIFRoaXMgbXVzdCBub3QgYmUgdHJ1ZSBoZXJlICovCisJCUNERl9BU1NFUlQobmVpZ2hib3Jfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLnByZWF1dGhSc3BQZW5kaW5nID09CisJCQkgICBmYWxzZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwkvKgorCSAqIElzc3VlIFByZWF1dGggcmVxdWVzdCB0byBQRSBoZXJlLgorCSAqIE5lZWQgdG8gaXNzdWUgdGhlIHByZWF1dGggcmVxdWVzdCB3aXRoIHRoZSBCU1NJRCB0aGF0IGlzIGluIHRoZQorCSAqIGhlYWQgb2YgdGhlIHJvYW1hYmxlIEFQIGxpc3QuIFBhcmFtZXRlcnMgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGFyZQorCSAqIEJTU0lELCBDaGFubmVsIG51bWJlciBhbmQgdGhlIG5laWdoYm9yU2NhblBlcmlvZChwcm9iYWJseSkuIElmCisJICogcm9hbWFibGVBUExpc3QgZ2V0cyBlbXB0eSwgc2hvdWxkIHRyYW5zaXRpb24gdG8gUkVQT1JUX1NDQU4gc3RhdGUKKwkgKi8KKwluZWlnaGJvcl9ic3Nfbm9kZSA9IGNzcl9uZWlnaGJvcl9yb2FtX25leHRfcm9hbWFibGVfYXAobWFjX2N0eCwKKwkJCQkmbmVpZ2hib3Jfcm9hbV9pbmZvLT5yb2FtYWJsZUFQTGlzdCwgTlVMTCk7CisKKwlpZiAoTlVMTCA9PSBuZWlnaGJvcl9ic3Nfbm9kZSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR1csIEZMKCJSb2FtYWJsZSBBUCBsaXN0IGlzIGVtcHR5Li4gIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfSBlbHNlIHsKKwkJY3NyX25laWdoYm9yX3JvYW1fc2VuZF9sZnJfbWV0cmljX2V2ZW50KG1hY19jdHgsIHNlc3Npb25faWQsCisJCQluZWlnaGJvcl9ic3Nfbm9kZS0+cEJzc0Rlc2NyaXB0aW9uLT5ic3NJZCwKKwkJCWVDU1JfUk9BTV9QUkVBVVRIX0lOSVRfTk9USUZZKTsKKwkJc3RhdHVzID0gY3NyX3JvYW1fZW5xdWV1ZV9wcmVhdXRoKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkJbmVpZ2hib3JfYnNzX25vZGUtPnBCc3NEZXNjcmlwdGlvbiwKKwkJCQllQ3NyUGVyZm9ybVByZWF1dGgsIHRydWUpOworCisJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJCZWZvcmUgUHJlLUF1dGg6IEJTU0lEICIgTUFDX0FERFJFU1NfU1RSICIsIENoOiVkIiksCisJCQlNQUNfQUREUl9BUlJBWSgKKwkJCQluZWlnaGJvcl9ic3Nfbm9kZS0+cEJzc0Rlc2NyaXB0aW9uLT5ic3NJZCksCisJCQkoaW50KW5laWdoYm9yX2Jzc19ub2RlLT5wQnNzRGVzY3JpcHRpb24tPmNoYW5uZWxJZCk7CisKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiUmV0dXJuIGZhaWxlZCBwcmVhdXRoIHJlcXVlc3Qgc3RhdHVzICVkIiksCisJCQkJc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisKKwluZWlnaGJvcl9yb2FtX2luZm8tPkZUUm9hbUluZm8ucHJlYXV0aFJzcFBlbmRpbmcgPSB0cnVlOworCisJLyogSW5jcmVtZW50IHRoZSBwcmVhdXRoIHJldHJ5IGNvdW50ICovCisJbmVpZ2hib3Jfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLm51bVByZUF1dGhSZXRyaWVzKys7CisKKwkvKiBUcmFuc2l0aW9uIHRoZSBzdGF0ZSB0byBwcmVhdXRoZW50aWNhdGluZyAqLworCUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04KKwkJKG1hY19jdHgsIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9QUkVBVVRIRU5USUNBVElORywKKwkJc2Vzc2lvbl9pZCkKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1fcHJlYXV0aF9yc3BfaGFuZGxlcigpIC0gaGFuZGxlIHByZWF1dGggcmVzcG9uc2UKKyAqIEBtYWNfY3R4OiBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQHNlc3Npb25faWQ6IFNNRSBzZXNzaW9uCisgKiBAbGltX3N0YXR1czogZVNJUl9TVUNDRVNTL2VTSVJfRkFJTFVSRS9lU0lSX0xJTV9NQVhfU1RBX1JFQUNIRURfRVJST1IvCisgKiAgICAgICAgICAgICAgZVNJVF9MSU1fQVVUSF9SU1BfVElNRU9VVCBzdGF0dXMgZnJvbSBQRQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlIHRoZSBQcmVhdXRoIHJlc3BvbnNlIGZyb20gUEUKKyAqIEV2ZXJ5IHByZWF1dGggaXMgYWxsb3dlZCBtYXggMyB0cmllcyBpZiBpdCBmYWlscy4gSWYgYSBic3NpZCBmYWlsZWQKKyAqIGZvciBtb3JlIHRoYW4gTUFYX1RSSUVTLCB3ZSB3aWxsIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IGFuZCB0cnkKKyAqIHdpdGggdGhlIG5leHQgbm9kZSBpbiB0aGUgcm9hbWFibGUgQVAgbGlzdCBhbmQgYWRkIHRoZSBCU1NJRCB0bworICogcHJlLWF1dGggZmFpbGVkIGxpc3QuIElmIG5vIG1vcmUgZW50cmllcyBwcmVzZW50IGluIHJvYW1hYmxlIEFQIGxpc3QsCisgKiB0cmFuc2l0aW9uIHRvIFJFUE9SVF9TQ0FOIHN0YXRlLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MgKGkuZS4gcHJlLWF1dGggcHJvY2Vzc2VkKSwKKyAqICAgICAgICAgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgb3RoZXJ3aXNlCisgKi8KK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1fcHJlYXV0aF9yc3BfaGFuZGxlcih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCQkJIHVpbnQ4X3Qgc2Vzc2lvbl9pZCwKKwkJCQkJCSB0U2lyUmV0U3RhdHVzIGxpbV9zdGF0dXMpCit7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBuZWlnaGJvcl9yb2FtX2luZm8gPQorCQkmbWFjX2N0eC0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25faWRdOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUNERl9TVEFUVVMgcHJlYXV0aF9wcm9jZXNzZWQgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIHByZWF1dGhfcnNwX25vZGUgPSBOVUxMOworCisJaWYgKGZhbHNlID09IG5laWdoYm9yX3JvYW1faW5mby0+RlRSb2FtSW5mby5wcmVhdXRoUnNwUGVuZGluZykgeworCQkvKgorCQkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBkaXNjb25uZWN0IGltbWVkaWF0ZWx5CisJCSAqIGFmdGVyIHNlbmRpbmcgYSBwcmUtYXV0aCByZXF1ZXN0LiBEdXJpbmcgcHJvY2Vzc2luZworCQkgKiBvZiB0aGUgZGlzY29ubmVjdCBjb21tYW5kLCB3ZSB3b3VsZCBoYXZlIHJlc2V0CisJCSAqIHByZWF1dGhSc3BQZW5kaW5nIGFuZCB0cmFuc2l0aW9uZWQgdG8gSU5JVCBzdGF0ZS4KKwkJICovCisJCU5FSUdIQk9SX1JPQU1fREVCVUcobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJVbmV4cGVjdGVkIHByZS1hdXRoIHJlc3BvbnNlIGluIHN0YXRlICVkIiksCisJCQluZWlnaGJvcl9yb2FtX2luZm8tPm5laWdoYm9yUm9hbVN0YXRlKTsKKwkJcHJlYXV0aF9wcm9jZXNzZWQgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBERVFfUFJFQVVUSDsKKwl9CisJLyogV2UgY2FuIHJlY2VpdmUgaXQgaW4gdGhlc2UgMiBzdGF0ZXMuICovCisJaWYgKChuZWlnaGJvcl9yb2FtX2luZm8tPm5laWdoYm9yUm9hbVN0YXRlICE9CisJICAgICBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUFJFQVVUSEVOVElDQVRJTkcpKSB7CisJCU5FSUdIQk9SX1JPQU1fREVCVUcobWFjX2N0eCwgTE9HVywKKwkJCUZMKCJQcmVhdXRoIHJlc3BvbnNlIHJlY2VpdmVkIGluIHN0YXRlICVzIiksCisJCQltYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlCisJCQkJKG5laWdoYm9yX3JvYW1faW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpKTsKKwkJcHJlYXV0aF9wcm9jZXNzZWQgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBERVFfUFJFQVVUSDsKKwl9CisKKwluZWlnaGJvcl9yb2FtX2luZm8tPkZUUm9hbUluZm8ucHJlYXV0aFJzcFBlbmRpbmcgPSBmYWxzZTsKKworCWlmIChlU0lSX1NVQ0NFU1MgPT0gbGltX3N0YXR1cykKKwkJcHJlYXV0aF9yc3Bfbm9kZSA9CisJCQljc3JfbmVpZ2hib3Jfcm9hbV9uZXh0X3JvYW1hYmxlX2FwKAorCQkJCW1hY19jdHgsCisJCQkJJm5laWdoYm9yX3JvYW1faW5mby0+cm9hbWFibGVBUExpc3QsCisJCQkJTlVMTCk7CisJaWYgKChlU0lSX1NVQ0NFU1MgPT0gbGltX3N0YXR1cykgJiYgKE5VTEwgIT0gcHJlYXV0aF9yc3Bfbm9kZSkpIHsKKwkJTkVJR0hCT1JfUk9BTV9ERUJVRyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIlByZWF1dGggY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhZnRlciAlZCB0cmllcyIpLAorCQkJbmVpZ2hib3Jfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLm51bVByZUF1dGhSZXRyaWVzKTsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJRkwoIkFmdGVyIFByZS1BdXRoOiBCU1NJRCAiIE1BQ19BRERSRVNTX1NUUiAiLCBDaDolZCIpLAorCQkJTUFDX0FERFJfQVJSQVkoCisJCQkJcHJlYXV0aF9yc3Bfbm9kZS0+cEJzc0Rlc2NyaXB0aW9uLT5ic3NJZCksCisJCQkoaW50KXByZWF1dGhfcnNwX25vZGUtPnBCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbElkKTsKKworCQljc3JfbmVpZ2hib3Jfcm9hbV9zZW5kX2xmcl9tZXRyaWNfZXZlbnQobWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCXByZWF1dGhfcnNwX25vZGUtPnBCc3NEZXNjcmlwdGlvbi0+YnNzSWQsCisJCQllQ1NSX1JPQU1fUFJFQVVUSF9TVEFUVVNfU1VDQ0VTUyk7CisJCS8qCisJCSAqIFByZWF1dGggY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gSW5zZXJ0IHRoZSBwcmVhdXRoZW50aWNhdGVkCisJCSAqIG5vZGUgdG8gdGFpbCBvZiBwcmVBdXRoRG9uZUxpc3QuCisJCSAqLworCQljc3JfbmVpZ2hib3Jfcm9hbV9yZW1vdmVfcm9hbWFibGVfYXBfbGlzdF9lbnRyeShtYWNfY3R4LAorCQkJJm5laWdoYm9yX3JvYW1faW5mby0+cm9hbWFibGVBUExpc3QsCisJCQlwcmVhdXRoX3JzcF9ub2RlKTsKKwkJY3NyX2xsX2luc2VydF90YWlsKAorCQkJJm5laWdoYm9yX3JvYW1faW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRG9uZUxpc3QsCisJCQkmcHJlYXV0aF9yc3Bfbm9kZS0+TGlzdCwgTExfQUNDRVNTX0xPQ0spOworCisJCS8qIFByZS1hdXRoIHN1Y2Nlc3NmdWwuIFRyYW5zaXRpb24gdG8gUFJFQVVUSCBEb25lIHN0YXRlICovCisJCUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04KKwkJCShtYWNfY3R4LCBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUFJFQVVUSF9ET05FLAorCQkJc2Vzc2lvbl9pZCkKKwkJbmVpZ2hib3Jfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLm51bVByZUF1dGhSZXRyaWVzID0gMDsKKworCQkvKgorCQkgKiBUaGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gd291bGQgc3RhcnQgYSB0aW1lciBhbmQgYnkKKwkJICogdGhlIHRpbWUgaXQgZXhwaXJlcywgc3VwcGxpY2FudCBzaG91bGQgaGF2ZSBwcm92aWRlZAorCQkgKiB0aGUgdXBkYXRlZCBGVElFcyB0byBTTUUuIFNvLCB3aGVuIGl0IGV4cGlyZXMsIGhhbmRvZmYKKwkJICogd2lsbCBiZSB0cmlnZ2VyZWQgdGhlbi4KKwkJICovCisJfSBlbHNlIHsKKwkJdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIG5laWdoYm9yX2Jzc19ub2RlID0gTlVMTDsKKwkJdExpc3RFbGVtICplbnRyeTsKKworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiUHJlYXV0aCBmYWlsZWQgcmV0cnkgbnVtYmVyICVkLCBzdGF0dXMgPSAweCV4IiksCisJCQluZWlnaGJvcl9yb2FtX2luZm8tPkZUUm9hbUluZm8ubnVtUHJlQXV0aFJldHJpZXMsCisJCQlsaW1fc3RhdHVzKTsKKworCQkvKgorCQkgKiBQcmVhdXRoIGZhaWxlZC4gQWRkIHRoZSBic3NJZCB0byB0aGUgcHJlQXV0aCBmYWlsZWQgbGlzdAorCQkgKiBvZiBNQUMgQWRkcmVzcy4gQWxzbyByZW1vdmUgdGhlIEFQIGZyb20gcm9hbWFibGUgQVAgbGlzdC4KKwkJICovCisJCWlmICgobmVpZ2hib3Jfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLm51bVByZUF1dGhSZXRyaWVzID49CisJCSAgICAgQ1NSX05FSUdIQk9SX1JPQU1fTUFYX05VTV9QUkVBVVRIX1JFVFJJRVMpIHx8CisJCSAgICAoZVNJUl9MSU1fTUFYX1NUQV9SRUFDSEVEX0VSUk9SID09IGxpbV9zdGF0dXMpKSB7CisJCQkvKgorCQkJICogV2UgYXJlIGdvaW5nIHRvIHJlbW92ZSB0aGUgbm9kZSBhcyBpdCBmYWlscyBmb3IKKwkJCSAqIG1vcmUgdGhhbiBNQVggdHJpZXMuIFJlc2V0IHRoaXMgY291bnQgdG8gMAorCQkJICovCisJCQluZWlnaGJvcl9yb2FtX2luZm8tPkZUUm9hbUluZm8ubnVtUHJlQXV0aFJldHJpZXMgPSAwOworCisJCQkvKgorCQkJICogVGhlIG9uZSBpbiB0aGUgaGVhZCBvZiB0aGUgbGlzdCBzaG91bGQgYmUgb25lIHdpdGgKKwkJCSAqIHdoaWNoIHdlIGlzc3VlZCBwcmUtYXV0aCBhbmQgZmFpbGVkCisJCQkgKi8KKwkJCWVudHJ5ID0gY3NyX2xsX3JlbW92ZV9oZWFkKAorCQkJCQkmbmVpZ2hib3Jfcm9hbV9pbmZvLT5yb2FtYWJsZUFQTGlzdCwKKwkJCQkJTExfQUNDRVNTX0xPQ0spOworCQkJaWYgKCFlbnRyeSkgeworCQkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJRkwoIlByZWF1dGggbGlzdCBpcyBlbXB0eSIpKTsKKwkJCQlnb3RvIE5FWFRfUFJFQVVUSDsKKwkJCX0KKwkJCW5laWdoYm9yX2Jzc19ub2RlID0gR0VUX0JBU0VfQUREUihlbnRyeSwKKwkJCQkJdENzck5laWdoYm9yUm9hbUJTU0luZm8sCisJCQkJCUxpc3QpOworCQkJLyoKKwkJCSAqIEFkZCB0aGUgQlNTSUQgdG8gcHJlLWF1dGggZmFpbCBsaXN0IGlmCisJCQkgKiBpdCBpcyBub3QgcmVxdWVzdGVkIGJ5IEhERAorCQkJICovCisJCQlpZiAoIW5laWdoYm9yX3JvYW1faW5mby0+dU9zUmVxdWVzdGVkSGFuZG9mZikKKwkJCQlzdGF0dXMgPQorCQkJCQljc3JfbmVpZ2hib3Jfcm9hbV9hZGRfcHJlYXV0aF9mYWlsKAorCQkJCQkJbWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCQkJCW5laWdoYm9yX2Jzc19ub2RlLT4KKwkJCQkJCQlwQnNzRGVzY3JpcHRpb24tPmJzc0lkKTsKKwkJCWNzcl9uZWlnaGJvcl9yb2FtX3NlbmRfbGZyX21ldHJpY19ldmVudChtYWNfY3R4LAorCQkJCXNlc3Npb25faWQsCisJCQkJbmVpZ2hib3JfYnNzX25vZGUtPnBCc3NEZXNjcmlwdGlvbi0+YnNzSWQsCisJCQkJZUNTUl9ST0FNX1BSRUFVVEhfU1RBVFVTX0ZBSUxVUkUpOworCQkJLyogTm93IHdlIGNhbiBmcmVlIHRoaXMgbm9kZSAqLworCQkJY3NyX25laWdoYm9yX3JvYW1fZnJlZV9uZWlnaGJvcl9yb2FtX2Jzc19ub2RlKAorCQkJCW1hY19jdHgsIG5laWdoYm9yX2Jzc19ub2RlKTsKKwkJfQorTkVYVF9QUkVBVVRIOgorCQkvKiBJc3N1ZSBwcmVhdXRoIHJlcXVlc3QgZm9yIHRoZSBzYW1lL25leHQgZW50cnkgKi8KKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjc3JfbmVpZ2hib3Jfcm9hbV9pc3N1ZV9wcmVhdXRoX3JlcSgKKwkJCQkJCW1hY19jdHgsIHNlc3Npb25faWQpKQorCQkJZ290byBERVFfUFJFQVVUSDsKKworCQlpZiAoY3NyX3JvYW1faXNfcm9hbV9vZmZsb2FkX3NjYW5fZW5hYmxlZChtYWNfY3R4KSkgeworCQkJaWYgKG5laWdoYm9yX3JvYW1faW5mby0+dU9zUmVxdWVzdGVkSGFuZG9mZikgeworCQkJCW5laWdoYm9yX3JvYW1faW5mby0+dU9zUmVxdWVzdGVkSGFuZG9mZiA9IDA7CisJCQkJY3NyX3JvYW1fb2ZmbG9hZF9zY2FuKG1hY19jdHgsIDAsCisJCQkJCQkgICAgICBST0FNX1NDQU5fT0ZGTE9BRF9TVEFSVCwKKwkJCQkJCSAgICAgIFJFQVNPTl9QUkVBVVRIX0ZBSUxFRF9GT1JfQUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJY3NyX3JvYW1fb2ZmbG9hZF9zY2FuKG1hY19jdHgsIDAsCisJCQkJCQkgICAgICBST0FNX1NDQU5fT0ZGTE9BRF9SRVNUQVJULAorCQkJCQkJICAgICAgUkVBU09OX1BSRUFVVEhfRkFJTEVEX0ZPUl9BTEwpOworCQkJfQorCQkJQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfVFJBTlNJVElPTgorCQkJCShtYWNfY3R4LCBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ09OTkVDVEVELAorCQkJCXNlc3Npb25faWQpOworCQl9CisJfQorCitERVFfUFJFQVVUSDoKKwljc3JfZGVxdWV1ZV9yb2FtX2NvbW1hbmQobWFjX2N0eCwgZUNzclBlcmZvcm1QcmVhdXRoKTsKKwlyZXR1cm4gcHJlYXV0aF9wcm9jZXNzZWQ7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcgKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1fb2ZmbG9hZF91cGRhdGVfcHJlYXV0aF9saXN0KCkKKyAqCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHNlc3Npb25faWQ6IFNlc3Npb24gSUQKKyAqIEByb2FtX3N5bmNfaW5kX3B0cjogUm9hbSBvZmZsb2FkIHN5bmMgSW5kIEluZm8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFJvYW1PZmZsb2FkU3luY2ggYW5kIGFkZHMgdGhlCisgKiByb2FtZWQgQVAgdG8gdGhlIHByZWF1dGggZG9uZSBsaXN0CisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgb3RoZXJ3aXNlCisgKi8KK0NERl9TVEFUVVMKK2Nzcl9uZWlnaGJvcl9yb2FtX29mZmxvYWRfdXBkYXRlX3ByZWF1dGhfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCXJvYW1fb2ZmbG9hZF9zeW5jaF9pbmQgKnJvYW1fc3luY19pbmRfcHRyLCB1aW50OF90IHNlc3Npb25faWQpCit7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBuZWlnaGJvcl9yb2FtX2luZm9fcHRyID0KKwkJJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uX2lkXTsKKwl0cENzck5laWdoYm9yUm9hbUJTU0luZm8gYnNzX2luZm9fcHRyOworCXVpbnQxNl90IGJzc19kZXNjX2xlbjsKKworCWlmIChuZWlnaGJvcl9yb2FtX2luZm9fcHRyLT5uZWlnaGJvclJvYW1TdGF0ZSAhPQorCSAgICBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ09OTkVDVEVEKSB7CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HVywKKwkJCUZMKCJMRlIzOlJvYW0gT2ZmbG9hZCBTeW5jaCBJbmQgcmVjZWl2ZWQgaW4gc3RhdGUgJWQiKSwKKwkJCW5laWdoYm9yX3JvYW1faW5mb19wdHItPm5laWdoYm9yUm9hbVN0YXRlKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWJzc19pbmZvX3B0ciA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0Q3NyTmVpZ2hib3JSb2FtQlNTSW5mbykpOworCWlmIChOVUxMID09IGJzc19pbmZvX3B0cikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCUZMKCJMRlIzOk1lbW9yeSBhbGxvY2F0aW9uIGZvciBOZWlnaGJvciBSb2FtIEJTUyBJbmZvIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJYnNzX2Rlc2NfbGVuID0gcm9hbV9zeW5jX2luZF9wdHItPmJzc19kZXNjX3B0ci0+bGVuZ3RoICsKKwkJICAgICBzaXplb2Yocm9hbV9zeW5jX2luZF9wdHItPmJzc19kZXNjX3B0ci0+bGVuZ3RoKTsKKwlic3NfaW5mb19wdHItPnBCc3NEZXNjcmlwdGlvbiA9IGNkZl9tZW1fbWFsbG9jKGJzc19kZXNjX2xlbik7CisJaWYgKGJzc19pbmZvX3B0ci0+cEJzc0Rlc2NyaXB0aW9uICE9IE5VTEwpIHsKKwkJY2RmX21lbV9jb3B5KGJzc19pbmZvX3B0ci0+cEJzc0Rlc2NyaXB0aW9uLAorCQkJICAgICByb2FtX3N5bmNfaW5kX3B0ci0+YnNzX2Rlc2NfcHRyLAorCQkJICAgICBic3NfZGVzY19sZW4pOworCX0gZWxzZSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJRkwoIkxGUjM6TWVtIGFsbG9jIGZvciBOZWlnaGJvciBSb2FtIEJTUyBEZXNjcmlwdG9yIGZhaWxlZCIpKTsKKwkJY2RmX21lbV9mcmVlKGJzc19pbmZvX3B0cik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisKKwl9CisJY3NyX2xsX2luc2VydF90YWlsKCZuZWlnaGJvcl9yb2FtX2luZm9fcHRyLT5GVFJvYW1JbmZvLnByZUF1dGhEb25lTGlzdCwKKwkJCSAgICZic3NfaW5mb19wdHItPkxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKworCUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04KKwkJKHBNYWMsIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9QUkVBVVRIX0RPTkUsIHNlc3Npb25faWQpCisJbmVpZ2hib3Jfcm9hbV9pbmZvX3B0ci0+RlRSb2FtSW5mby5udW1QcmVBdXRoUmV0cmllcyA9IDA7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCSAgIkxGUjM6RW50cnkgYWRkZWQgdG8gQXV0aCBEb25lIExpc3QiKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1fcHJlcGFyZV9zY2FuX3Byb2ZpbGVfZmlsdGVyKCkKKyAqCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHNlc3Npb25faWQ6IFNlc3Npb24gSUQKKyAqIEBzY2FuX2ZpbHRlcjogUG9wdWxhdGVkIHNjYW4gZmlsdGVyIGJhc2VkIG9uIHRoZSBjb25uZWN0ZWQgcHJvZmlsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHNjYW4gZmlsdGVyIGJhc2VkIG9uIHRoZSBjdXJyZW50bHkKKyAqIGNvbm5lY3RlZCBwcm9maWxlLiBCYXNlZCBvbiB0aGlzIGZpbHRlciwgc2NhbiByZXN1bHRzIGFyZSBvYnRhaW5lZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV9GQUlMVVJFIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTCitjc3JfbmVpZ2hib3Jfcm9hbV9wcmVwYXJlX3NjYW5fcHJvZmlsZV9maWx0ZXIodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyLAorCQkJCQkgICAgICB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIG5icl9yb2FtX2luZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisJdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwQ3VyUHJvZmlsZSA9CisJCSZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdGVkUHJvZmlsZTsKKwl1aW50OF90IGkgPSAwOworCXN0cnVjdCByb2FtX2V4dF9wYXJhbXMgKnJvYW1fcGFyYW1zOworCXVpbnQ4X3QgbnVtX2NoID0gMDsKKworCUNERl9BU1NFUlQocFNjYW5GaWx0ZXIgIT0gTlVMTCk7CisJaWYgKHBTY2FuRmlsdGVyID09IE5VTEwpCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCWNkZl9tZW1femVybyhwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisJcm9hbV9wYXJhbXMgPSAmcE1hYy0+cm9hbS5jb25maWdQYXJhbS5yb2FtX3BhcmFtczsKKwkvKiBXZSBkb250IHdhbnQgdG8gc2V0IEJTU0lEIGJhc2VkIEZpbHRlciAqLworCXBTY2FuRmlsdGVyLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSAwOworCXBTY2FuRmlsdGVyLT5zY2FuX2ZpbHRlcl9mb3Jfcm9hbSA9IDE7CisJLyogb25seSBmb3IgSEREIHJlcXVlc3RlZCBoYW5kb2ZmIGZpbGwgaW4gdGhlIEJTU0lEIGluIHRoZSBmaWx0ZXIgKi8KKwlpZiAobmJyX3JvYW1faW5mby0+dU9zUmVxdWVzdGVkSGFuZG9mZikgeworCQlwU2NhbkZpbHRlci0+QlNTSURzLm51bU9mQlNTSURzID0gMTsKKwkJcFNjYW5GaWx0ZXItPkJTU0lEcy5ic3NpZCA9CisJCQljZGZfbWVtX21hbGxvYyhzaXplb2YodFNpck1hY0FkZHIpICoKKwkJCQkgICAgICAgcFNjYW5GaWx0ZXItPkJTU0lEcy5udW1PZkJTU0lEcyk7CisJCWlmIChOVUxMID09IHBTY2FuRmlsdGVyLT5CU1NJRHMuYnNzaWQpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiU2NhbiBGaWx0ZXIgQlNTSUQgbWVtIGFsbG9jIGZhaWxlZCIpKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCX0KKworCQljZGZfbWVtX3plcm8ocFNjYW5GaWx0ZXItPkJTU0lEcy5ic3NpZCwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSAqCisJCQkgICAgIHBTY2FuRmlsdGVyLT5CU1NJRHMubnVtT2ZCU1NJRHMpOworCisJCS8qIFBvcHVsYXRlIHRoZSBCU1NJRCBmcm9tIGhhbmRvZmYgaW5mbyByZWNlaXZlZCBmcm9tIEhERCAqLworCQlmb3IgKGkgPSAwOyBpIDwgcFNjYW5GaWx0ZXItPkJTU0lEcy5udW1PZkJTU0lEczsgaSsrKSB7CisJCQljZGZfY29weV9tYWNhZGRyKCZwU2NhbkZpbHRlci0+QlNTSURzLmJzc2lkW2ldLAorCQkJCSAmbmJyX3JvYW1faW5mby0+aGFuZG9mZlJlcUluZm8uYnNzaWQpOworCQl9CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQlGTCgiTm8gb2YgQWxsb3dlZCBTU0lEIExpc3Q6JWQiKSwKKwkJcm9hbV9wYXJhbXMtPm51bV9zc2lkX2FsbG93ZWRfbGlzdCk7CisJaWYgKHJvYW1fcGFyYW1zLT5udW1fc3NpZF9hbGxvd2VkX2xpc3QpIHsKKwkJcFNjYW5GaWx0ZXItPlNTSURzLm51bU9mU1NJRHMgPQorCQkJcm9hbV9wYXJhbXMtPm51bV9zc2lkX2FsbG93ZWRfbGlzdDsKKwkJcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0ID0KKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0Q3NyU1NJREluZm8pICoKKwkJCQlwU2NhbkZpbHRlci0+U1NJRHMubnVtT2ZTU0lEcyk7CisJCWlmIChOVUxMID09IHBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdCkgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJTY2FuIEZpbHRlciBTU0lEIG1lbSBhbGxvYyBmYWlsZWQiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCByb2FtX3BhcmFtcy0+bnVtX3NzaWRfYWxsb3dlZF9saXN0OyBpKyspIHsKKwkJCXBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdFtpXS5oYW5kb2ZmUGVybWl0dGVkID0gMTsKKwkJCXBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdFtpXS5zc2lkSGlkZGVuID0gMDsKKwkJCWNkZl9tZW1fY29weSgodm9pZCAqKQorCQkJCXBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdFtpXS5TU0lELnNzSWQsCisJCQkJcm9hbV9wYXJhbXMtPnNzaWRfYWxsb3dlZF9saXN0W2ldLnNzSWQsCisJCQkJcm9hbV9wYXJhbXMtPnNzaWRfYWxsb3dlZF9saXN0W2ldLmxlbmd0aCk7CisJCQlwU2NhbkZpbHRlci0+U1NJRHMuU1NJRExpc3RbaV0uU1NJRC5sZW5ndGggPQorCQkJCXJvYW1fcGFyYW1zLT5zc2lkX2FsbG93ZWRfbGlzdFtpXS5sZW5ndGg7CisJCX0KKwl9IGVsc2UgeworCQkvKiBQb3B1bGF0ZSBhbGwgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbm5lY3RlZCBwcm9maWxlICovCisJCXBTY2FuRmlsdGVyLT5TU0lEcy5udW1PZlNTSURzID0gMTsKKwkJcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0ID0KKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0Q3NyU1NJREluZm8pKTsKKwkJaWYgKE5VTEwgPT0gcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0KSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIlNjYW4gRmlsdGVyIFNTSUQgbWVtIGFsbG9jIGZhaWxlZCIpKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCX0KKwkJcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0LT5oYW5kb2ZmUGVybWl0dGVkID0gMTsKKwkJcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0LT5zc2lkSGlkZGVuID0gMDsKKwkJcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0LT5TU0lELmxlbmd0aCA9CisJCQlwQ3VyUHJvZmlsZS0+U1NJRC5sZW5ndGg7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKXBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5zc0lkLAorCQkJKHZvaWQgKilwQ3VyUHJvZmlsZS0+U1NJRC5zc0lkLAorCQkJcEN1clByb2ZpbGUtPlNTSUQubGVuZ3RoKTsKKworCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzEsCisJCQlGTCgiRmlsdGVyaW5nIGZvciBTU0lEICUuKnMsbGVuZ3RoIG9mIFNTSUQgPSAldSIpLAorCQkJcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0LT5TU0lELmxlbmd0aCwKKwkJCXBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5zc0lkLAorCQkJcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0LT5TU0lELmxlbmd0aCk7CisJfQorCXBTY2FuRmlsdGVyLT5hdXRoVHlwZS5udW1FbnRyaWVzID0gMTsKKwlwU2NhbkZpbHRlci0+YXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBwQ3VyUHJvZmlsZS0+QXV0aFR5cGU7CisKKwlwU2NhbkZpbHRlci0+RW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7ICAgICAvKiBUaGlzIG11c3QgYmUgMSAqLworCXBTY2FuRmlsdGVyLT5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9CisJCXBDdXJQcm9maWxlLT5FbmNyeXB0aW9uVHlwZTsKKworCXBTY2FuRmlsdGVyLT5tY0VuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworCXBTY2FuRmlsdGVyLT5tY0VuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0KKwkJcEN1clByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGU7CisKKwlwU2NhbkZpbHRlci0+QlNTVHlwZSA9IHBDdXJQcm9maWxlLT5CU1NUeXBlOworCisJbnVtX2NoID0KKwkgICAgbmJyX3JvYW1faW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8ubnVtT2ZDaGFubmVsczsKKwlpZiAobnVtX2NoKSB7CisJCS8qCisJCSAqIFdlIGFyZSBpbnRyZXN0ZWQgb25seSBpbiB0aGUgc2NhbiByZXN1bHRzIG9uIGNoYW5uZWxzIHdlCisJCSAqIHNjYW5uZWQKKwkJICovCisJCXBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gbnVtX2NoOworCQlwU2NhbkZpbHRlci0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPQorCQkJY2RmX21lbV9tYWxsb2MobnVtX2NoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKwkJaWYgKE5VTEwgPT0gcFNjYW5GaWx0ZXItPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwoIlNjYW4gRmlsdGVyIENoIGxpc3QgbWVtIGFsbG9jIGZhaWxlZCIpKTsKKwkJCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlci0+U1NJRHMuU1NJRExpc3QpOworCQkJcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0ID0gTlVMTDsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOyBpKyspIHsKKwkJCXBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpXSA9CisJCQkgIG5icl9yb2FtX2luZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLgorCQkJICBDaGFubmVsTGlzdFtpXTsKKwkJfQorCX0gZWxzZSB7CisJCXBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKwkJcFNjYW5GaWx0ZXItPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKwl9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWlmIChuYnJfcm9hbV9pbmZvLT5pczExckFzc29jKSB7CisJCS8qCisJCSAqIE1ESUUgc2hvdWxkIGJlIGFkZGVkIGFzIGEgcGFydCBvZiBwcm9maWxlLiBUaGlzIHNob3VsZCBiZQorCQkgKiBhZGRlZCBhcyBhIHBhcnQgb2YgZmlsdGVyIGFzIHdlbGwKKwkJICovCisJCXBTY2FuRmlsdGVyLT5NRElELm1kaWVQcmVzZW50ID0gcEN1clByb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQ7CisJCXBTY2FuRmlsdGVyLT5NRElELm1vYmlsaXR5RG9tYWluID0KKwkJCXBDdXJQcm9maWxlLT5NRElELm1vYmlsaXR5RG9tYWluOworCX0KKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXBTY2FuRmlsdGVyLT5NRlBFbmFibGVkID0gcEN1clByb2ZpbGUtPk1GUEVuYWJsZWQ7CisJcFNjYW5GaWx0ZXItPk1GUFJlcXVpcmVkID0gcEN1clByb2ZpbGUtPk1GUFJlcXVpcmVkOworCXBTY2FuRmlsdGVyLT5NRlBDYXBhYmxlID0gcEN1clByb2ZpbGUtPk1GUENhcGFibGU7CisjZW5kaWYKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCit1aW50MzJfdCBjc3JfZ2V0X2N1cnJlbnRfYXBfcnNzaSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSB0U2NhblJlc3VsdEhhbmRsZSAqcFNjYW5SZXN1bHRMaXN0LAorCQkJCSB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0Q3NyU2NhblJlc3VsdEluZm8gKnBTY2FuUmVzdWx0OworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gbmJyX3JvYW1faW5mbyA9CisJCSZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKwkvKiBXZSBhcmUgc2V0dGluZyB0aGlzIGFzIGRlZmF1bHQgdmFsdWUgdG8gbWFrZSBzdXJlIHdlIHJldHVybiB0aGlzIHZhbHVlLAorCSAgIHdoZW4gd2UgZG8gbm90IHNlZSB0aGlzIEFQIGluIHRoZSBzY2FuIHJlc3VsdCBmb3Igc29tZSByZWFzb24uSG93ZXZlcixpdCBpcworCSAgIGxlc3MgbGlrZWx5IHRoYXQgd2UgYXJlIGFzc29jaWF0ZWQgdG8gYW4gQVAgYW5kIGRvIG5vdCBzZWUgaXQgaW4gdGhlIHNjYW4gbGlzdCAqLworCXVpbnQzMl90IEN1cnJBUFJzc2kgPSAtMTI1OworCisJd2hpbGUgKE5VTEwgIT0KKwkgICAgICAgKHBTY2FuUmVzdWx0ID0gY3NyX3NjYW5fcmVzdWx0X2dldF9uZXh0KHBNYWMsICpwU2NhblJlc3VsdExpc3QpKSkgeworCQlpZiAodHJ1ZSA9PQorCQkgICAgY2RmX21lbV9jb21wYXJlKHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmJzc0lkLAorCQkJCSAgICBuYnJfcm9hbV9pbmZvLT5jdXJyQVBic3NpZC5ieXRlcywKKwkJCQkgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJCS8qIFdlIGdvdCBhIG1hdGNoIHdpdGggdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIEFQLgorCQkJICogQ2FwdHVyZSB0aGUgUlNTSSB2YWx1ZSBhbmQgY29tcGxldGUgdGhlIHdoaWxlIGxvb3AuCisJCQkgKiBUaGUgd2hpbGUgbG9vcCBpcyBjb21wbGV0ZWQgaW4gb3JkZXIgdG8gbWFrZSB0aGUgY3VycmVudCBlbnRyeSBnbyBiYWNrIHRvIE5VTEwsCisJCQkgKiBhbmQgaW4gdGhlIG5leHQgd2hpbGUgbG9vcCwgaXQgcHJvcGVybHkgc3RhcnRzIHNlYXJjaGluZyBmcm9tIHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorCQkJICogVE9ETzogQ2FuIGFsc28gdHJ5IHNldHRpbmcgdGhlIGN1cnJlbnQgZW50cnkgZGlyZWN0bHkgdG8gTlVMTCBhcyBzb29uIGFzIHdlIGZpbmQgdGhlIG5ldyBBUCovCisKKwkJCUN1cnJBUFJzc2kgPQorCQkJCShpbnQpcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IucnNzaSAqICgtMSk7CisKKwkJfSBlbHNlIHsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJcmV0dXJuIEN1cnJBUFJzc2k7CisKK30KKworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9wcm9jZXNzX3NjYW5fcmVzdWx0cygpIC0gYnVpbGQgcm9hbWluZyBjYW5kaWRhdGUgbGlzdAorICoKKyAqIEBtYWNfY3R4OiBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQHNlc3Npb25pZDogU2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQHNjYW5fcmVzdWx0c19saXN0OiBMaXN0IG9idGFpbmVkIGZyb20gY3NyX3NjYW5fZ2V0X3Jlc3VsdCgpCisgKgorICogVGhpcyBmdW5jdGlvbiBhcHBsaWVzIHZhcmlvdXMgY2FuZGlkYXRlIGNoZWNrcyBsaWtlIExGUiwgMTFyLCBwcmVhdXRoLCBFU0UKKyAqIGFuZCBidWlsZHMgYSByb2FtYWJsZSBBUCBsaXN0LiBJdCBhcHBsaWVzIGFnZSBsaW1pdCBvbmx5IGlmIG5vIHN1aXRhYmxlCisgKiByZWNlbnQgY2FuZGlkYXRlcyBhcmUgZm91bmQuCisgKgorICogT3V0cHV0IGxpc3QgaXMgYnVpbHQgaW4gbWFjX2N0eC0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25pZF0uCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KKworc3RhdGljIHZvaWQKK2Nzcl9uZWlnaGJvcl9yb2FtX3Byb2Nlc3Nfc2Nhbl9yZXN1bHRzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQ4X3Qgc2Vzc2lvbmlkLAorCQl0U2NhblJlc3VsdEhhbmRsZSAqc2Nhbl9yZXN1bHRzX2xpc3QpCit7CisJdENzclNjYW5SZXN1bHRJbmZvICpzY2FuX3Jlc3VsdDsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIG5fcm9hbV9pbmZvID0KKwkJJm1hY19jdHgtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uaWRdOworCXRwQ3NyTmVpZ2hib3JSb2FtQlNTSW5mbyBic3NfaW5mbzsKKwl1aW50MzJfdCBjdXJfYXBfcnNzaTsKKwl1aW50MzJfdCBhZ2VfdGlja3MgPSAwOworCXVpbnQzMl90IGxpbWl0X3RpY2tzID0KKwkJY2RmX3N5c3RlbV9tc2Vjc190b190aWNrcyhST0FNX0FQX0FHRV9MSU1JVF9NUyk7CisJdWludDhfdCBudW1fY2FuZGlkYXRlcyA9IDA7CisJdWludDhfdCBudW1fZHJvcHBlZCA9IDA7CisJLyoKKwkgKiBmaXJzdCBpdGVyYXRpb24gb2Ygc2NhbiBsaXN0IHNob3VsZCBjb25zaWRlcgorCSAqIGFnZSBjb25zdHJhaW50IGZvciBjYW5kaWRhdGVzCisJICovCisJYm9vbCBhZ2VfY29uc3RyYWludCA9IHRydWU7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCXVpbnQxNl90IHFwcmVzZW50OworCXVpbnQxNl90IHFhdmFpbDsKKwlib29sIHZvYWRtaXR0ZWQ7CisjZW5kaWYKKwkvKgorCSAqIEZpbmQgb3V0IHRoZSBDdXJyZW50IEFQIFJTU0kgYW5kIGtlZXAgaXQgaGFuZHkgdG8gY2hlY2sgaWYKKwkgKiBpdCBpcyBiZXR0ZXIgdGhhbiB0aGUgUlNTSSBvZiB0aGUgQVAgd2hpY2ggd2UgYXJlCisJICogZ29pbmcgdG8gcm9hbS5JZiBzbywgd2UgYXJlIGdvaW5nIHRvIGNvbnRpbnVlIHdpdGggdGhlCisJICogY3VycmVudCBBUC4KKwkgKi8KKwljdXJfYXBfcnNzaSA9IGNzcl9nZXRfY3VycmVudF9hcF9yc3NpKG1hY19jdHgsIHNjYW5fcmVzdWx0c19saXN0LAorCQkJCXNlc3Npb25pZCk7CisKKwkvKgorCSAqIEV4cGVjdGluZyB0aGUgc2NhbiByZXN1bHQgYWxyZWFkeSB0byBiZSBpbiB0aGUgc29ydGVkIG9yZGVyIGJhc2VkIG9uCisJICogUlNTSS4gQmFzZWQgb24gdGhlIHByZXZpb3VzIHN0YXRlIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgbGlzdAorCSAqIHNob3VsZCBiZSBzb3J0ZWQgYWdhaW4gdGFraW5nIG5laWdoYm9yIHNjb3JlIGludG8gY29uc2lkZXJhdGlvbi4gSWYKKwkgKiBwcmV2aW91cyBzdGF0ZSBpcyBDRkdfQ0hBTl9MSVNUX1NDQU4sIHRoZXJlIHNob3VsZCBub3QgYmUgYSBuZWlnaGJvcgorCSAqIHNjb3JlIGFzc29jaWF0ZWQgd2l0aCBhbnkgb2YgdGhlIEJTUy4gSWYgdGhlIHByZXZpb3VzIHN0YXRlIGlzCisJICogUkVQT1JUX1FVRVJZLCB0aGVuIHRoZXJlIHdpbGwgYmUgbmVpZ2hib3Igc2NvcmUgZm9yIGVhY2ggb2YgdGhlIEFQcy4KKwkgKiBGb3Igbm93LCBsZXQgdXMgdGFrZSB0b3Agb2YgdGhlIGxpc3QgcHJvdmlkZWQgYXMgaXQgaXMgYnkgQ1NSIFNjYW4KKwkgKiByZXN1bHQgQVBJLiBIZW5jZSBpdCBpcyBhc3N1bWVkIHRoYXQgbmVpZ2hib3Igc2NvcmUgYW5kIHJzc2kgc2NvcmUKKwkgKiBhcmUgaW4gdGhlIHNhbWUgb3JkZXIuIFRoaXMgd2lsbCBiZSB0YWtlbiBjYXJlIGxhdGVyLgorCSAqLworCisJZG8geworCQl3aGlsZSAodHJ1ZSkgeworCQkJdFNpckJzc0Rlc2NyaXB0aW9uICpkZXNjcjsKKworCQkJc2Nhbl9yZXN1bHQgPSBjc3Jfc2Nhbl9yZXN1bHRfZ2V0X25leHQoCisJCQkJCQltYWNfY3R4LCAqc2Nhbl9yZXN1bHRzX2xpc3QpOworCQkJaWYgKE5VTEwgPT0gc2Nhbl9yZXN1bHQpCisJCQkJYnJlYWs7CisJCQlkZXNjciA9ICZzY2FuX3Jlc3VsdC0+QnNzRGVzY3JpcHRvcjsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCSAgRkwoIlNjYW4gcmVzdWx0OiBCU1NJRCAiIE1BQ19BRERSRVNTX1NUUgorCQkJCSAgICAgIiAoUnNzaSAlbGQsIENoOiVkKSIpLAorCQkJCSAgTUFDX0FERFJfQVJSQVkoZGVzY3ItPmJzc0lkKSwKKwkJCQkgIGFicyhkZXNjci0+cnNzaSksIGRlc2NyLT5jaGFubmVsSWQpOworCisJCQlpZiAodHJ1ZSA9PSBjZGZfbWVtX2NvbXBhcmUoZGVzY3ItPmJzc0lkLAorCQkJCQluX3JvYW1faW5mby0+Y3VyckFQYnNzaWQuYnl0ZXMsCisJCQkJCXNpemVvZih0U2lyTWFjQWRkcikpKSB7CisJCQkJLyoKKwkJCQkgKiBjdXJyZW50bHkgYXNzb2NpYXRlZCBBUC4gRG8gbm90IGhhdmUgdGhpcworCQkJCSAqIGluIHRoZSByb2FtYWJsZSBBUCBsaXN0CisJCQkJICovCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICJTS0lQLWN1cnJlbnRseSBhc3NvY2lhdGVkIEFQIik7CisJCQkJY29udGludWU7CisJCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCQkJLyoKKwkJCSAqIEluIGNhc2Ugb2YgcmVhc3NvYyByZXF1ZXN0ZWQgYnkgdXBwZXIgbGF5ZXIsIGxvb2sKKwkJCSAqIGZvciBleGFjdCBtYXRjaCBvZiBic3NpZCAmIGNoYW5uZWwuIGNzciBjYWNoZSBtaWdodAorCQkJICogaGF2ZSBkdXBsaWNhdGVzCisJCQkgKi8KKwkJCWlmICgobl9yb2FtX2luZm8tPnVPc1JlcXVlc3RlZEhhbmRvZmYpICYmCisJCQkgICAgKChmYWxzZSA9PSBjZGZfbWVtX2NvbXBhcmUoZGVzY3ItPmJzc0lkLAorCQkJCQluX3JvYW1faW5mby0+aGFuZG9mZlJlcUluZm8uYnNzaWQuYnl0ZXMsCisJCQkJCXNpemVvZih0U2lyTWFjQWRkcikpKQorCQkJICAgICB8fCAoZGVzY3ItPmNoYW5uZWxJZCAhPQorCQkJCSBuX3JvYW1faW5mby0+aGFuZG9mZlJlcUluZm8uY2hhbm5lbCkpKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICJTS0lQLW5vdCBhIGNhbmRpZGF0ZSBBUCBmb3IgT1MgcmVxdWVzdGVkIHJvYW0iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJCWlmICgobl9yb2FtX2luZm8tPmlzMTFyQXNzb2MpICYmCisJCQkgICAgKCFjc3JfbmVpZ2hib3Jfcm9hbV9pc19wcmVhdXRoX2NhbmRpZGF0ZShtYWNfY3R4LAorCQkJCQlzZXNzaW9uaWQsIGRlc2NyLT5ic3NJZCkpKSB7CisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiQlNTSUQgcHJlc2VudCBpbiBwcmUtYXV0aCBmYWlsIGxpc3QuLiBJZ25vcmluZyIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQkJaWYgKCFjc3Jfcm9hbV9pc19yb2FtX29mZmxvYWRfc2Nhbl9lbmFibGVkKG1hY19jdHgpICYmCisJCQkgICAgKG5fcm9hbV9pbmZvLT5pc0VTRUFzc29jKSAmJgorCQkJICAgICFjc3JfbmVpZ2hib3Jfcm9hbV9pc19wcmVhdXRoX2NhbmRpZGF0ZShtYWNfY3R4LAorCQkJCXNlc3Npb25pZCwgZGVzY3ItPmJzc0lkKSkgeworCQkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkJRkwoIkJTU0lEIHByZXNlbnQgaW4gcHJlLWF1dGggZmFpbCBsaXN0Li4gSWdub3JpbmciKSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXFwcmVzZW50ID0gZGVzY3ItPlFCU1NMb2FkX3ByZXNlbnQ7CisJCQlxYXZhaWwgPSBkZXNjci0+UUJTU0xvYWRfYXZhaWw7CisJCQl2b2FkbWl0dGVkID0gbl9yb2FtX2luZm8tPmlzVk9BZG1pdHRlZDsKKwkJCWlmICh2b2FkbWl0dGVkKQorCQkJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQkJRkwoIk5ldyBBUCBRQlNTIHByZXNlbnQgPSAlcywgQlcgYXZhaWxhYmxlID0gMHgleCwgcmVxdWlyZWQgPSAweCV4IiksCisJCQkJCSgocXByZXNlbnQpID8gInllcyIgOiAibm8iKSwgcWF2YWlsLAorCQkJCQluX3JvYW1faW5mby0+TWluUUJzc0xvYWRSZXF1aXJlZCk7CisJCQlpZiAodm9hZG1pdHRlZCAmJiBxcHJlc2VudCAmJgorCQkJICAgIChxYXZhaWwgPCBuX3JvYW1faW5mby0+TWluUUJzc0xvYWRSZXF1aXJlZCkpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkiQlNTSUQgOiAiIE1BQ19BRERSRVNTX1NUUiAiIGhhcyBubyBiYW5kd2lkdGgsIGlnbm9yaW5nIiwKKwkJCQkJTUFDX0FERFJfQVJSQVkoZGVzY3ItPmJzc0lkKSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAodm9hZG1pdHRlZCAmJiAhcXByZXNlbnQpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkiQlNTSUQgOiAiIE1BQ19BRERSRVNTX1NUUiAiIGhhcyBubyBRQlNTIExPQUQgSUUsIGlnbm9yaW5nIiwKKwkJCQkJTUFDX0FERFJfQVJSQVkoZGVzY3ItPmJzc0lkKSk7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCQkJLyoKKwkJCSAqIElmIHdlIGFyZSBzdXBwb3J0aW5nIGxlZ2FjeSByb2FtaW5nLCBhbmQKKwkJCSAqIGlmIHRoZSBjYW5kaWRhdGUgaXMgb24gdGhlICJwcmUtYXV0aCBmYWlsZWQiIGxpc3QsCisJCQkgKiBpZ25vcmUgaXQuCisJCQkgKi8KKwkJCWlmIChjc3Jfcm9hbV9pc19mYXN0X3JvYW1fZW5hYmxlZChtYWNfY3R4LCBzZXNzaW9uaWQpICYmCisJCQkgICAgIWNzcl9uZWlnaGJvcl9yb2FtX2lzX3ByZWF1dGhfY2FuZGlkYXRlKG1hY19jdHgsCisJCQkJc2Vzc2lvbmlkLCBkZXNjci0+YnNzSWQpKSB7CisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiQlNTSUQgcHJlc2VudCBpbiBwcmUtYXV0aCBmYWlsIGxpc3QuLiBJZ25vcmluZyIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTEZSICovCisKKwkJCS8qIGNoZWNrIHRoZSBhZ2Ugb2YgdGhlIEFQICovCisJCQlhZ2VfdGlja3MgPSAodWludDMyX3QpIGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCkgLQorCQkJCQlkZXNjci0+blJlY2VpdmVkVGltZTsKKwkJCWlmIChhZ2VfY29uc3RyYWludCA9PSB0cnVlICYmIGFnZV90aWNrcyA+IGxpbWl0X3RpY2tzKSB7CisJCQkJbnVtX2Ryb3BwZWQrKzsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJCQlGTCgiT2xkIEFQIChwcm9iZSByc3AvYmVhY29uKSBza2lwcGVkLiIpCisJCQkJCSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIEZpbmlzaGVkIGFsbCBjaGVja3MsIG5vdyBhZGQgaXQgdG8gY2FuZGlkYXRlIGxpc3QgKi8KKwkJCWJzc19pbmZvID0KKwkJCQljZGZfbWVtX21hbGxvYyhzaXplb2YodENzck5laWdoYm9yUm9hbUJTU0luZm8pKTsKKwkJCWlmIChOVUxMID09IGJzc19pbmZvKSB7CisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCQlGTCgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiBJZ25vcmVkIGNhbmRpZGF0ZS4iKSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlic3NfaW5mby0+cEJzc0Rlc2NyaXB0aW9uID0KKwkJCQljZGZfbWVtX21hbGxvYyhkZXNjci0+bGVuZ3RoICsKKwkJCQkJc2l6ZW9mKGRlc2NyLT5sZW5ndGgpKTsKKwkJCWlmIChic3NfaW5mby0+cEJzc0Rlc2NyaXB0aW9uICE9IE5VTEwpIHsKKwkJCQljZGZfbWVtX2NvcHkoYnNzX2luZm8tPnBCc3NEZXNjcmlwdGlvbiwgZGVzY3IsCisJCQkJCWRlc2NyLT5sZW5ndGggKyBzaXplb2YoZGVzY3ItPmxlbmd0aCkpOworCQkJfSBlbHNlIHsKKwkJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQkJCUZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIElnbm9yZWQgY2FuZGlkYXRlLiIpKTsKKwkJCQljZGZfbWVtX2ZyZWUoYnNzX2luZm8pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIEFzc2lnbiBzb21lIHByZWZlcmVuY2UgdmFsdWUgZm9yIG5vdy4gTmVlZCB0bworCQkJICogY2FsY3VsYXRlIHRoZWFjdHVhbCBzY29yZSBiYXNlZCBvbiBSU1NJIGFuZCBuZWlnaGJvcgorCQkJICogQVAgc2NvcmUKKwkJCSAqLworCQkJYnNzX2luZm8tPmFwUHJlZmVyZW5jZVZhbCA9IDEwOworCQkJbnVtX2NhbmRpZGF0ZXMrKzsKKwkJCWNzcl9sbF9pbnNlcnRfdGFpbCgmbl9yb2FtX2luZm8tPnJvYW1hYmxlQVBMaXN0LAorCQkJCSZic3NfaW5mby0+TGlzdCwgTExfQUNDRVNTX0xPQ0spOworCQl9IC8qIGVuZCBvZiB3aGlsZSAoY3NyX3NjYW5fcmVzdWx0X2dldF9uZXh0KSAqLworCisJCS8qIGlmIHNvbWUgY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLCB0aGVuIG5vIG5lZWQgdG8gcmVwZWF0ICovCisJCWlmIChudW1fY2FuZGlkYXRlcykKKwkJCWJyZWFrOworCQkvKgorCQkgKiBpZiBhZ2VfY29uc3RyYWludCBpcyBhbHJlYWR5IGZhbHNlLCB3ZSBoYXZlIGRvbmUgdHdvCisJCSAqIGl0ZXJhdGlvbnMgYW5kIG5vIGNhbmRpZGF0ZSB3ZXJlIGZvdW5kCisJCSAqLworCQlpZiAoYWdlX2NvbnN0cmFpbnQgPT0gZmFsc2UpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiBObyByb2FtIGFibGUgY2FuZGlkYXRlcyBmb3VuZCIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBpZiBhbGwgY2FuZGlkYXRlcyB3ZXJlIGRyb3BwZWQgcmVzY2FuIHRoZSBzY2FuCisJCSAqIGxpc3QgYnV0IHRoaXMgdGltZSB3aXRob3V0IGFnZSBjb25zdHJhaW50LgorCQkgKi8KKwkJYWdlX2NvbnN0cmFpbnQgPSBmYWxzZTsKKwkJLyogaWYgbm8gY2FuZGlkYXRlcyB3ZXJlIGRyb3BwZWQgbm8gbmVlZCB0byByZXBlYXQgKi8KKwl9IHdoaWxlIChudW1fZHJvcHBlZCk7CisKKwkvKgorCSAqIE5vdyB3ZSBoYXZlIGFsbCB0aGUgc2NhbiByZXN1bHRzIGluIG91ciBsb2NhbCBsaXN0LiBHb29kIHRpbWUgdG8gZnJlZQorCSAqIHVwIHRoZSB0aGUgbGlzdCB3ZSBnb3QgYXMgYSBwYXJ0IG9mIGNzckdldFNjYW5SZXN1bHQKKwkgKi8KKwljc3Jfc2Nhbl9yZXN1bHRfcHVyZ2UobWFjX2N0eCwgKnNjYW5fcmVzdWx0c19saXN0KTsKK30KKworc3RhdGljIENERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1fcHJvY2Vzc19zY2FuX2NvbXBsZXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJICB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0KKwkJJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCXRDc3JTY2FuUmVzdWx0RmlsdGVyIHNjYW5GaWx0ZXI7CisJdFNjYW5SZXN1bHRIYW5kbGUgc2NhblJlc3VsdDsKKwl1aW50MzJfdCB0ZW1wVmFsID0gMDsKKwlDREZfU1RBVFVTIGhzdGF0dXM7CisKKwloc3RhdHVzID0gY3NyX25laWdoYm9yX3JvYW1fcHJlcGFyZV9zY2FuX3Byb2ZpbGVfZmlsdGVyKHBNYWMsCisJCQkJCQkJCSZzY2FuRmlsdGVyLAorCQkJCQkJCQlzZXNzaW9uSWQpOworCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HVywKKwkJCSAgICBGTAorCQkJICAgICgiMTFSL0VTRS9PdGhlciBBc3NvY2lhdGlvbjogUHJlcGFyZSBzY2FuIHRvIGZpbmQgbmVpZ2hib3IgQVAgZmlsdGVyIHN0YXR1cyAgPSAlZCIpLAorCQkJICAgIGhzdGF0dXMpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gaHN0YXR1cykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkJKCJTY2FuIEZpbHRlciBwcmVwYXJhdGlvbiBmYWlsZWQgZm9yIEFzc29jIHR5cGUgJWQuLiBCYWlsaW5nIG91dC4uIiksCisJCQl0ZW1wVmFsKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwloc3RhdHVzID0gY3NyX3NjYW5fZ2V0X3Jlc3VsdChwTWFjLCAmc2NhbkZpbHRlciwgJnNjYW5SZXN1bHQpOworCWlmIChoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsCisJCQkJICAgIEZMKCJHZXQgU2NhbiBSZXN1bHQgc3RhdHVzIGNvZGUgJWQiKSwKKwkJCQkgICAgaHN0YXR1cyk7CisJfQorCS8qIFByb2Nlc3MgdGhlIHNjYW4gcmVzdWx0cyBhbmQgdXBkYXRlIHJvYW1hYmxlIEFQIGxpc3QgKi8KKwljc3JfbmVpZ2hib3Jfcm9hbV9wcm9jZXNzX3NjYW5fcmVzdWx0cyhwTWFjLCBzZXNzaW9uSWQsICZzY2FuUmVzdWx0KTsKKworCS8qIEZyZWUgdGhlIHNjYW4gZmlsdGVyICovCisJY3NyX2ZyZWVfc2Nhbl9maWx0ZXIocE1hYywgJnNjYW5GaWx0ZXIpOworCisJdGVtcFZhbCA9IGNzcl9sbF9jb3VudCgmcE5laWdoYm9yUm9hbUluZm8tPnJvYW1hYmxlQVBMaXN0KTsKKworCWlmICh0ZW1wVmFsKSB7CisJCWNzcl9uZWlnaGJvcl9yb2FtX3RyaWdnZXJfaGFuZG9mZihwTWFjLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCWlmIChjc3Jfcm9hbV9pc19yb2FtX29mZmxvYWRfc2Nhbl9lbmFibGVkKHBNYWMpKSB7CisJCWlmIChwTmVpZ2hib3JSb2FtSW5mby0+dU9zUmVxdWVzdGVkSGFuZG9mZikgeworCQkJY3NyX3JvYW1fb2ZmbG9hZF9zY2FuKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJICAgICAgUk9BTV9TQ0FOX09GRkxPQURfU1RBUlQsCisJCQkJCSAgICAgIFJFQVNPTl9OT19DQU5EX0ZPVU5EX09SX05PVF9ST0FNSU5HX05PVyk7CisJCQlwTmVpZ2hib3JSb2FtSW5mby0+dU9zUmVxdWVzdGVkSGFuZG9mZiA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBUaGVyZSBpcyBubyBjYW5kaWRhdGUgb3IgV2UgYXJlIG5vdCByb2FtaW5nIE5vdy4KKwkJCSAqIEluZm9ybSB0aGUgRlcgdG8gcmVzdGFydCBSb2FtIE9mZmxvYWQgU2NhbiAgKi8KKwkJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsCisJCQkJCSAgICAgIFJPQU1fU0NBTl9PRkZMT0FEX1JFU1RBUlQsCisJCQkJCSAgICAgIFJFQVNPTl9OT19DQU5EX0ZPVU5EX09SX05PVF9ST0FNSU5HX05PVyk7CisJCX0KKwkJQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfVFJBTlNJVElPTgorCQkJKHBNYWMsIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DT05ORUNURUQsIHNlc3Npb25JZCk7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAmJiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1fY2hhbm5lbHNfZmlsdGVyX2J5X2N1cnJlbnRfYmFuZCgpCisgKgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBzZXNzaW9uX2lkOiBTZXNzaW9uIElECisgKiBAaW5wdXRfY2hfbGlzdDogVGhlIGlucHV0IGNoYW5uZWwgbGlzdAorICogQGlucHV0X251bV9vZl9jaDogVGhlIG51bWJlciBvZiBjaGFubmVscyBpbiBpbnB1dCBjaGFubmVsIGxpc3QKKyAqIEBvdXRwdXRfY2hfbGlzdDogVGhlIG91dHB1dCBjaGFubmVsIGxpc3QKKyAqIEBvdXRwdXRfbnVtX29mX2NoOiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIG91dHB1dCBjaGFubmVsIGxpc3QKKyAqIEBtZXJnZWRfb3V0cHV0X251bV9vZl9jaDogVGhlIGZpbmFsIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUKKyAqIAkJCQlvdXRwdXQgY2hhbm5lbCBsaXN0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmaWx0ZXIgb3V0IHRoZSBjaGFubmVscyBiYXNlZCBvbiB0aGUKKyAqIGN1cnJlbnRseSBhc3NvY2lhdGVkIEFQIGNoYW5uZWwKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBDREZfU1RBVFVTX0VfRkFJTFVSRSBvdGhlcndpc2UKKyAqLworQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV9jaGFubmVsc19maWx0ZXJfYnlfY3VycmVudF9iYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJICAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJCQkgICAgIHVpbnQ4X3QgKgorCQkJCQkJCSAgICAgcElucHV0Q2hhbm5lbExpc3QsCisJCQkJCQkJICAgICB1aW50OF90CisJCQkJCQkJICAgICBpbnB1dE51bU9mQ2hhbm5lbHMsCisJCQkJCQkJICAgICB1aW50OF90ICoKKwkJCQkJCQkgICAgIHBPdXRwdXRDaGFubmVsTGlzdCwKKwkJCQkJCQkgICAgIHVpbnQ4X3QgKgorCQkJCQkJCSAgICAgcE1lcmdlZE91dHB1dE51bU9mQ2hhbm5lbHMpCit7CisJdWludDhfdCBpID0gMDsKKwl1aW50OF90IG51bUNoYW5uZWxzID0gMDsKKwl1aW50OF90IGN1cnJBUG9wZXJhdGlvbkNoYW5uZWwgPQorCQlwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXS5jdXJyQVBvcGVyYXRpb25DaGFubmVsOworCS8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXIgKi8KKwlpZiAoIXBJbnB1dENoYW5uZWxMaXN0KQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCisJLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLworCWlmICghcE91dHB1dENoYW5uZWxMaXN0KQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCisJaWYgKGlucHV0TnVtT2ZDaGFubmVscyA+IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBXcm9uZyBOdW1iZXIgb2YgSW5wdXQgQ2hhbm5lbHMgJWQiLAorCQkJICBfX2Z1bmNfXywgaW5wdXROdW1PZkNoYW5uZWxzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGlucHV0TnVtT2ZDaGFubmVsczsgaSsrKSB7CisJCWlmIChnZXRfcmZfYmFuZChjdXJyQVBvcGVyYXRpb25DaGFubmVsKSA9PQorCQkgICAgZ2V0X3JmX2JhbmQocElucHV0Q2hhbm5lbExpc3RbaV0pKSB7CisJCQlwT3V0cHV0Q2hhbm5lbExpc3RbbnVtQ2hhbm5lbHNdID0gcElucHV0Q2hhbm5lbExpc3RbaV07CisJCQludW1DaGFubmVscysrOworCQl9CisJfQorCisJLyogUmV0dXJuIGZpbmFsIG51bWJlciBvZiBjaGFubmVscyAqLworCSpwTWVyZ2VkT3V0cHV0TnVtT2ZDaGFubmVscyA9IG51bUNoYW5uZWxzOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9jaGFubmVsc19maWx0ZXJfYnlfY3VycmVudF9iYW5kKCkKKyAqCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHNlc3Npb25faWQ6IFNlc3Npb24gSUQKKyAqIEBpbnB1dF9jaF9saXN0OiBUaGUgYWRkaXRpb25hbCBjaGFubmVscyB0byBtZXJnZSBpbiB0byB0aGUKKyAqIAkJCSJtZXJnZWQiIGNoYW5uZWxzIGxpc3QuCisgKiBAaW5wdXRfbnVtX29mX2NoOiBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgY2hhbm5lbHMuCisgKiBAb3V0cHV0X2NoX2xpc3Q6IFRoZSBwbGFjZSB0byBwdXQgdGhlICJtZXJnZWQiIGNoYW5uZWwgbGlzdC4KKyAqIEBvdXRwdXRfbnVtX29mX2NoOiBUaGUgb3JpZ2luYWwgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZQorICogCQkJIm1lcmdlZCIgY2hhbm5lbHMgbGlzdC4KKyAqIEBtZXJnZWRfb3V0cHV0X251bV9vZl9jaDogVGhlIGZpbmFsIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUKKyAqIAkJCQkibWVyZ2VkIiBjaGFubmVsIGxpc3QuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1lcmdlIHR3byBjaGFubmVsIGxpc3QuCisgKiBOQjogSWYgY2FsbGVkIHdpdGggb3V0cHV0TnVtT2ZDaGFubmVscyA9PSAwLCB0aGlzIHJvdXRpbmVzIHNpbXBseQorICogY29waWVzIHRoZSBpbnB1dCBjaGFubmVsIGxpc3QgdG8gdGhlIG91dHB1dCBjaGFubmVsIGxpc3QuIGlmIG51bWJlcgorICogb2YgbWVyZ2VkIGNoYW5uZWxzIGFyZSBtb3JlIHRoYW4gMTAwLCBudW0gb2YgY2hhbm5lbHMgc2V0IHRvIDEwMAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIENERl9TVEFUVVNfRV9GQUlMVVJFIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX21lcmdlX2NoYW5uZWxfbGlzdHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSB1aW50OF90ICpwSW5wdXRDaGFubmVsTGlzdCwKKwkJCQkJCSB1aW50OF90IGlucHV0TnVtT2ZDaGFubmVscywKKwkJCQkJCSB1aW50OF90ICpwT3V0cHV0Q2hhbm5lbExpc3QsCisJCQkJCQkgdWludDhfdCBvdXRwdXROdW1PZkNoYW5uZWxzLAorCQkJCQkJIHVpbnQ4X3QgKgorCQkJCQkJIHBNZXJnZWRPdXRwdXROdW1PZkNoYW5uZWxzKQoreworCXVpbnQ4X3QgaSA9IDA7CisJdWludDhfdCBqID0gMDsKKwl1aW50OF90IG51bUNoYW5uZWxzID0gb3V0cHV0TnVtT2ZDaGFubmVsczsKKworCS8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXIgKi8KKwlpZiAoIXBJbnB1dENoYW5uZWxMaXN0KQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCisJLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLworCWlmICghcE91dHB1dENoYW5uZWxMaXN0KQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCisJaWYgKGlucHV0TnVtT2ZDaGFubmVscyA+IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBXcm9uZyBOdW1iZXIgb2YgSW5wdXQgQ2hhbm5lbHMgJWQiLAorCQkJICBfX2Z1bmNfXywgaW5wdXROdW1PZkNoYW5uZWxzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJaWYgKG91dHB1dE51bU9mQ2hhbm5lbHMgPj0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IFdyb25nIE51bWJlciBvZiBPdXRwdXQgQ2hhbm5lbHMgJWQiLAorCQkJICBfX2Z1bmNfXywgb3V0cHV0TnVtT2ZDaGFubmVscyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCS8qIEFkZCB0aGUgIm5ldyIgY2hhbm5lbHMgaW4gdGhlIGlucHV0IGxpc3QgdG8gdGhlIGVuZCBvZiB0aGUgb3V0cHV0IGxpc3QuICovCisJZm9yIChpID0gMDsgaSA8IGlucHV0TnVtT2ZDaGFubmVsczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBvdXRwdXROdW1PZkNoYW5uZWxzOyBqKyspIHsKKwkJCWlmIChwSW5wdXRDaGFubmVsTGlzdFtpXSA9PSBwT3V0cHV0Q2hhbm5lbExpc3Rbal0pCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGogPT0gb3V0cHV0TnVtT2ZDaGFubmVscykgeworCQkJaWYgKHBJbnB1dENoYW5uZWxMaXN0W2ldKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICIlczogW0lORk9MT0ddIEFkZGluZyBleHRyYSAlZCB0byBOZWlnaGJvciBjaGFubmVsIGxpc3QiLAorCQkJCQkgIF9fZnVuY19fLCBwSW5wdXRDaGFubmVsTGlzdFtpXSk7CisJCQkJcE91dHB1dENoYW5uZWxMaXN0W251bUNoYW5uZWxzXSA9CisJCQkJCXBJbnB1dENoYW5uZWxMaXN0W2ldOworCQkJCW51bUNoYW5uZWxzKys7CisJCQl9CisJCX0KKwkJaWYgKG51bUNoYW5uZWxzID49IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTikgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICIlczogTWVyZ2UgTmVpZ2hib3IgY2hhbm5lbCBsaXN0IHJlYWNoZWQgTWF4ICIKKwkJCQkgICJsaW1pdCAlZCIsIF9fZnVuY19fLCBudW1DaGFubmVscyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFJldHVybiBmaW5hbCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwkqcE1lcmdlZE91dHB1dE51bU9mQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1fY3JlYXRlX2NoYW5fbGlzdF9mcm9tX25laWdoYm9yX3JlcG9ydCgpCisgKgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBzZXNzaW9uX2lkOiBTZXNzaW9uIElECisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHdoZW4gbmVpZ2hib3IgcmVwb3J0IGlzIHJlY2VpdmVkIGZvciB0aGUKKyAqIG5laWdoYm9yIHJlcXVlc3QuIEJhc2VkIG9uIHRoZSBjaGFubmVscyBwcmVzZW50IGluIHRoZSBuZWlnaGJvciByZXBvcnQsCisgKiBpdCBnZW5lcmF0ZXMgY2hhbm5lbCBsaXN0IHdoaWNoIHdpbGwgYmUgdXNlZCBpbiBSRVBPUlRfU0NBTiBzdGF0ZSB0bworICogc2NhbiBmb3IgdGhlc2UgbmVpZ2hib3IgQVBzCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQ0RGX1NUQVRVU19FX0ZBSUxVUkUgb3RoZXJ3aXNlCisgKi8KK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1fY3JlYXRlX2NoYW5fbGlzdF9mcm9tX25laWdoYm9yX3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJCQkgICB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0cFJybU5laWdoYm9yUmVwb3J0RGVzYyBwTmVpZ2hib3JCc3NEZXNjOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisJdWludDhfdCBudW1DaGFubmVscyA9IDA7CisJdWludDhfdCBpID0gMDsKKwl1aW50OF90IGNoYW5uZWxMaXN0W01BWF9CU1NfSU5fTkVJR0hCT1JfUlBUXTsKKwl1aW50OF90IG1lcmdlZE91dHB1dE51bU9mQ2hhbm5lbHMgPSAwOworCisJLyogVGhpcyBzaG91bGQgYWx3YXlzIHN0YXJ0IGZyb20gMCB3aGVuZXZlciB3ZSBjcmVhdGUgYSBjaGFubmVsIGxpc3Qgb3V0IG9mIG5laWdoYm9yIEFQIGxpc3QgKi8KKwlwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5udW1Cc3NGcm9tTmVpZ2hib3JSZXBvcnQgPSAwOworCisJcE5laWdoYm9yQnNzRGVzYyA9IHNtZV9ycm1fZ2V0X2ZpcnN0X2Jzc19lbnRyeV9mcm9tX25laWdoYm9yX2NhY2hlKHBNYWMpOworCisJd2hpbGUgKHBOZWlnaGJvckJzc0Rlc2MpIHsKKwkJaWYgKHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm51bUJzc0Zyb21OZWlnaGJvclJlcG9ydCA+PQorCQkgICAgTUFYX0JTU19JTl9ORUlHSEJPUl9SUFQpCisJCQlicmVhazsKKworCQkvKiBVcGRhdGUgdGhlIG5laWdoYm9yIEJTUyBJbmZvIGluIHRoZSAxMXIgRlQgUm9hbSBJbmZvICovCisJCXBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLgorCQluZWlnaGJvUmVwb3J0QnNzSW5mb1twTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby4KKwkJCQkgICAgIG51bUJzc0Zyb21OZWlnaGJvclJlcG9ydF0uY2hhbm5lbE51bSA9CisJCQlwTmVpZ2hib3JCc3NEZXNjLT5wTmVpZ2hib3JCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbDsKKwkJcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8uCisJCW5laWdoYm9SZXBvcnRCc3NJbmZvW3BOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLgorCQkJCSAgICAgbnVtQnNzRnJvbU5laWdoYm9yUmVwb3J0XS4KKwkJbmVpZ2hib3JTY29yZSA9ICh1aW50OF90KSBwTmVpZ2hib3JCc3NEZXNjLT5yb2FtU2NvcmU7CisJCWNkZl9tZW1fY29weShwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby4KKwkJCSAgICAgbmVpZ2hib1JlcG9ydEJzc0luZm9bcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8uCisJCQkJCQkgIG51bUJzc0Zyb21OZWlnaGJvclJlcG9ydF0uCisJCQkgICAgIG5laWdoYm9yQnNzSWQsCisJCQkgICAgIHBOZWlnaGJvckJzc0Rlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uLT5ic3NJZCwKKwkJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm51bUJzc0Zyb21OZWlnaGJvclJlcG9ydCsrOworCisJCS8qIFNhdmluZyB0aGUgY2hhbm5lbCBsaXN0IG5vbi1yZWR1bmRhbnRseSAqLworCQlmb3IgKGkgPSAwOyAoaSA8IG51bUNoYW5uZWxzICYmIGkgPCBNQVhfQlNTX0lOX05FSUdIQk9SX1JQVCk7CisJCSAgICAgaSsrKSB7CisJCQlpZiAocE5laWdoYm9yQnNzRGVzYy0+cE5laWdoYm9yQnNzRGVzY3JpcHRpb24tPgorCQkJICAgIGNoYW5uZWwgPT0gY2hhbm5lbExpc3RbaV0pCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA9PSBudW1DaGFubmVscykgeworCQkJaWYgKHBOZWlnaGJvckJzc0Rlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsKSB7CisJCQkJaWYgKENTUl9JU19ST0FNX0lOVFJBX0JBTkRfRU5BQkxFRChwTWFjKSkgeworCQkJCQkvKiBNYWtlIHN1cmUgdG8gYWRkIG9ubHkgaWYgaXRzIHRoZSBzYW1lIGJhbmQgKi8KKwkJCQkJaWYgKGdldF9yZl9iYW5kCisJCQkJCQkgICAgKHBOZWlnaGJvclJvYW1JbmZvLT4KKwkJCQkJCSAgICBjdXJyQVBvcGVyYXRpb25DaGFubmVsKSA9PQorCQkJCQkgICAgZ2V0X3JmX2JhbmQocE5laWdoYm9yQnNzRGVzYy0+CisJCQkJCQkJcE5laWdoYm9yQnNzRGVzY3JpcHRpb24tPgorCQkJCQkJCWNoYW5uZWwpKSB7CisJCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJCQkgICIlczogW0lORk9MT0ddIEFkZGluZyAlZCB0byBOZWlnaGJvciBjaGFubmVsIGxpc3QgKFNhbWUgYmFuZClcbiIsCisJCQkJCQkJICBfX2Z1bmNfXywKKwkJCQkJCQkgIHBOZWlnaGJvckJzc0Rlc2MtPgorCQkJCQkJCSAgcE5laWdoYm9yQnNzRGVzY3JpcHRpb24tPgorCQkJCQkJCSAgY2hhbm5lbCk7CisJCQkJCQljaGFubmVsTGlzdFtudW1DaGFubmVsc10gPQorCQkJCQkJCXBOZWlnaGJvckJzc0Rlc2MtPgorCQkJCQkJCXBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uLT4KKwkJCQkJCQljaGFubmVsOworCQkJCQkJbnVtQ2hhbm5lbHMrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJCQkgICIlczogW0lORk9MT0ddIEFkZGluZyAlZCB0byBOZWlnaGJvciBjaGFubmVsIGxpc3RcbiIsCisJCQkJCQkgIF9fZnVuY19fLAorCQkJCQkJICBwTmVpZ2hib3JCc3NEZXNjLT4KKwkJCQkJCSAgcE5laWdoYm9yQnNzRGVzY3JpcHRpb24tPgorCQkJCQkJICBjaGFubmVsKTsKKwkJCQkJY2hhbm5lbExpc3RbbnVtQ2hhbm5lbHNdID0KKwkJCQkJCXBOZWlnaGJvckJzc0Rlc2MtPgorCQkJCQkJcE5laWdoYm9yQnNzRGVzY3JpcHRpb24tPmNoYW5uZWw7CisJCQkJCW51bUNoYW5uZWxzKys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcE5laWdoYm9yQnNzRGVzYyA9CisJCQlzbWVfcnJtX2dldF9uZXh0X2Jzc19lbnRyeV9mcm9tX25laWdoYm9yX2NhY2hlKHBNYWMsCisJCQkJCQkJCSAgICAgICBwTmVpZ2hib3JCc3NEZXNjKTsKKwl9CisKKwlpZiAocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLgorCSAgICBDaGFubmVsTGlzdCkgeworCQljZGZfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby4KKwkJCSAgICAgY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdCk7CisJfQorCisJcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0KKwkJTlVMTDsKKwlwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uCisJbnVtT2ZDaGFubmVscyA9IDA7CisJLyogU3RvcmUgdGhlIG9idGFpbmVkIGNoYW5uZWwgbGlzdCB0byB0aGUgTmVpZ2hib3IgQ29udHJvbCBkYXRhIHN0cnVjdHVyZSAqLworCWlmIChudW1DaGFubmVscykKKwkJcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLgorCQlDaGFubmVsTGlzdCA9CisJCQljZGZfbWVtX21hbGxvYygobnVtQ2hhbm5lbHMpICogc2l6ZW9mKHVpbnQ4X3QpKTsKKwlpZiAoTlVMTCA9PQorCSAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uCisJICAgIENoYW5uZWxMaXN0KSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgQ2hhbm5lbCBsaXN0IGZhaWxlZC4uIFRMIGV2ZW50IGlnbm9yZWQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV9jb3B5KHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby4KKwkJICAgICBDaGFubmVsTGlzdCwgY2hhbm5lbExpc3QsIChudW1DaGFubmVscykgKiBzaXplb2YodWludDhfdCkpOworCXBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby4KKwludW1PZkNoYW5uZWxzID0gbnVtQ2hhbm5lbHM7CisJLyoKKwkgKiBDcmVhdGUgYSBVbmlvbiBvZiBvY2N1cGllZCBjaGFubmVsIGxpc3QgbGVhcm50IGJ5IHRoZSBEVVQgYWxvbmcgd2l0aCB0aGUgTmVpZ2hib3IKKwkgKiByZXBvcnQgQ2hhbm5lbHMuIFRoaXMgaW5jcmVhc2VzIHRoZSBjaGFuY2VzIG9mIHRoZSBEVVQgdG8gZ2V0IGEgY2FuZGlkYXRlIEFQIHdoaWxlCisJICogcm9hbWluZyBldmVuIGlmIHRoZSBOZWlnaGJvciBSZXBvcnQgaXMgbm90IGFibGUgdG8gcHJvdmlkZSBzdWZmaWNpZW50IGluZm9ybWF0aW9uLgorCSAqICovCisJaWYgKHBNYWMtPnNjYW4ub2NjdXBpZWRDaGFubmVsc1tzZXNzaW9uSWRdLm51bUNoYW5uZWxzKSB7CisJCWNzcl9uZWlnaGJvcl9yb2FtX21lcmdlX2NoYW5uZWxfbGlzdHMocE1hYywKKwkJCQkJCSAgICAgICZwTWFjLT5zY2FuLgorCQkJCQkJICAgICAgb2NjdXBpZWRDaGFubmVsc1tzZXNzaW9uSWRdLgorCQkJCQkJICAgICAgY2hhbm5lbExpc3RbMF0sCisJCQkJCQkgICAgICBwTWFjLT5zY2FuLgorCQkJCQkJICAgICAgb2NjdXBpZWRDaGFubmVsc1tzZXNzaW9uSWRdLgorCQkJCQkJICAgICAgbnVtQ2hhbm5lbHMsCisJCQkJCQkgICAgICAmcE5laWdoYm9yUm9hbUluZm8tPgorCQkJCQkJICAgICAgcm9hbUNoYW5uZWxJbmZvLgorCQkJCQkJICAgICAgY3VycmVudENoYW5uZWxMaXN0SW5mby4KKwkJCQkJCSAgICAgIENoYW5uZWxMaXN0WzBdLAorCQkJCQkJICAgICAgcE5laWdoYm9yUm9hbUluZm8tPgorCQkJCQkJICAgICAgcm9hbUNoYW5uZWxJbmZvLgorCQkJCQkJICAgICAgY3VycmVudENoYW5uZWxMaXN0SW5mby4KKwkJCQkJCSAgICAgIG51bU9mQ2hhbm5lbHMsCisJCQkJCQkgICAgICAmbWVyZ2VkT3V0cHV0TnVtT2ZDaGFubmVscyk7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby4KKwkJbnVtT2ZDaGFubmVscyA9IG1lcmdlZE91dHB1dE51bU9mQ2hhbm5lbHM7CisKKwl9CisJLypJbmRpY2F0ZSB0aGUgZmlybXdhcmUgYWJvdXQgdGhlIHVwZGF0ZSBvbmx5IGlmIGFueSBuZXcgY2hhbm5lbHMgYXJlIGFkZGVkLgorCSAqIE90aGVyd2lzZSwgdGhlIGZpcm13YXJlIHdvdWxkIGFscmVhZHkgYmUga25vd2luZyB0aGUgbm9uLUlBUFBuZWlnaGJvcmxpc3QKKwkgKiBjaGFubmVscy4gVGhlcmUgaXMgbm8gbmVlZCB0byB1cGRhdGUuKi8KKwlpZiAobnVtQ2hhbm5lbHMpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIklBUFAgTmVpZ2hib3IgbGlzdCBjYWxsYmFjayByZWNlaXZlZCBhcyBleHBlY3RlZCIKKwkJCSAgICJpbiBzdGF0ZSAlcy4iKSwKKwkJCW1hY190cmFjZV9nZXRfbmVpZ2hib3VyX3JvYW1fc3RhdGUocE5laWdoYm9yUm9hbUluZm8tPgorCQkJCQkJCSAgIG5laWdoYm9yUm9hbVN0YXRlKSk7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uSUFQUE5laWdoYm9yTGlzdFJlY2VpdmVkID0KKwkJCXRydWU7CisJCWlmIChjc3Jfcm9hbV9pc19yb2FtX29mZmxvYWRfc2Nhbl9lbmFibGVkKHBNYWMpKSB7CisJCQljc3Jfcm9hbV9vZmZsb2FkX3NjYW4ocE1hYywgc2Vzc2lvbklkLAorCQkJCQkgICAgICBST0FNX1NDQU5fT0ZGTE9BRF9VUERBVEVfQ0ZHLAorCQkJCQkgICAgICBSRUFTT05fQ0hBTk5FTF9MSVNUX0NIQU5HRUQpOworCQl9CisJfQorCXBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5JbmRleCA9IDA7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisvKioKKyAqIGNzcl9uZWlnaGJvcl9yb2FtX2lzX3NzaWRfYW5kX3NlY3VyaXR5X21hdGNoKCkgLSB0byBtYXRjaCBzc2lkL3NlY3VyaXR5CisgKiBAcE1hYzogUG9pbnRlciB0byBtYWMgY29udGV4dAorICogQHBDdXJQcm9maWxlOiBwb2ludGVyIHRvIGN1cnJlbnQgcm9hbSBwcm9maWxlCisgKiBAcEJzc0Rlc2M6IHBvaW50ZXIgdG8gYnNzIGRlc2NyaXB0aW9uCisgKiBAcEllczogcG9pbnRlciB0byBsb2NhbCBpZXMKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgdG8gc2VlIGlmIFNTSUQgYW5kIHNlY3VyaXR5IHBhcmFtZXRlcnMKKyAqIGFyZSBtYXRjaGluZy4KKyAqCisgKiBSZXR1cm46IGJvb2wKKyAqLworYm9vbCBjc3JfbmVpZ2hib3Jfcm9hbV9pc19zc2lkX2FuZF9zZWN1cml0eV9tYXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBDdXJQcm9maWxlLAorCQl0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworCXRDc3JBdXRoTGlzdCBhdXRoVHlwZTsKKwl0Q3NyRW5jcnlwdGlvbkxpc3QgdUNFbmNyeXB0aW9uVHlwZTsKKwl0Q3NyRW5jcnlwdGlvbkxpc3QgbUNFbmNyeXB0aW9uVHlwZTsKKwlib29sIGZNYXRjaCA9IGZhbHNlOworCisJYXV0aFR5cGUubnVtRW50cmllcyA9IDE7CisJYXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBwQ3VyUHJvZmlsZS0+QXV0aFR5cGU7CisJdUNFbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKwl1Q0VuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gcEN1clByb2ZpbGUtPkVuY3J5cHRpb25UeXBlOworCW1DRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisJbUNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IHBDdXJQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlOworCisJLyogQWdhaW4sIHRyZWF0IG1pc3NpbmcgcEllcyBhcyBhIG5vbi1tYXRjaC4gKi8KKwlpZiAoIXBJZXMpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFRyZWF0IGEgbWlzc2luZyBTU0lEIGFzIGEgbm9uLW1hdGNoLiAqLworCWlmICghcEllcy0+U1NJRC5wcmVzZW50KQorCQlyZXR1cm4gZmFsc2U7CisKKwlmTWF0Y2ggPSBjc3JfaXNfc3NpZF9tYXRjaChwTWFjLAorCQkJKHZvaWQgKilwQ3VyUHJvZmlsZS0+U1NJRC5zc0lkLAorCQkJcEN1clByb2ZpbGUtPlNTSUQubGVuZ3RoLAorCQkJcEllcy0+U1NJRC5zc2lkLAorCQkJcEllcy0+U1NJRC5udW1fc3NpZCwgdHJ1ZSk7CisJaWYgKHRydWUgPT0gZk1hdGNoKSB7CisJCS8qCisJCSAqIGZvciBub3cgd2UgYXJlIHNlbmRpbmcgTlVMTCBmb3IgYWxsIFBNRiByZWxhdGVkIGZpbHRlcgorCQkgKiBwYXJhbWV0ZXJzIGR1cmluZyByb2FtIHRvIHRoZSBuZWlnaGJvciBBUCBiZWNhdXNlCisJCSAqIHNvIGZhciA4MDIxMVcgc3BlYyBkb2Vzbid0IHNwZWNpZnkgYW55dGhpbmcgYWJvdXQKKwkJICogcm9hbWluZyBzY2VuYXJpby4KKwkJICoKKwkJICogT25jZSByb2FtaW5nIHNjZW5hcmlvIGlzIGRlZmluZWQsIHdlIHNob3VsZCByZS12aXNpdAorCQkgKiB0aGlzIHNlY3Rpb24gYW5kIHJlbW92ZSB0aGlzIGNvbW1lbnQuCisJCSAqLworCQlmTWF0Y2ggPSBjc3JfaXNfc2VjdXJpdHlfbWF0Y2gocE1hYywgJmF1dGhUeXBlLAorCQkJCSZ1Q0VuY3J5cHRpb25UeXBlLAorCQkJCSZtQ0VuY3J5cHRpb25UeXBlLCBOVUxMLAorCQkJCU5VTEwsIE5VTEwsIHBCc3NEZXNjLAorCQkJCXBJZXMsIE5VTEwsIE5VTEwsIE5VTEwpOworCQlyZXR1cm4gZk1hdGNoOworCX0gZWxzZSB7CisJCXJldHVybiBmTWF0Y2g7CisJfQorCit9CisKK2Jvb2wgY3NyX25laWdoYm9yX3JvYW1faXNfbmV3X2Nvbm5lY3RlZF9wcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQl1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0KKwkJJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCXRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcEN1cnJQcm9maWxlID0gTlVMTDsKKwl0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBQcmV2UHJvZmlsZSA9IE5VTEw7CisJdERvdDExZkJlYWNvbklFcyAqcEllcyA9IE5VTEw7CisJdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYyA9IE5VTEw7CisJYm9vbCBmTmV3ID0gdHJ1ZTsKKworCWlmICghKHBNYWMtPnJvYW0ucm9hbVNlc3Npb24gJiYgQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkpIHsKKwkJcmV0dXJuIGZOZXc7CisJfQorCisJcEN1cnJQcm9maWxlID0gJnBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0ZWRQcm9maWxlOworCWlmICghcEN1cnJQcm9maWxlKSB7CisJCXJldHVybiBmTmV3OworCX0KKworCXBQcmV2UHJvZmlsZSA9ICZwTmVpZ2hib3JSb2FtSW5mby0+cHJldkNvbm5Qcm9maWxlOworCWlmICghcFByZXZQcm9maWxlKSB7CisJCXJldHVybiBmTmV3OworCX0KKworCXBCc3NEZXNjID0gcFByZXZQcm9maWxlLT5wQnNzRGVzYzsKKwlpZiAocEJzc0Rlc2MpIHsKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUygKKwkJICAgIGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMocE1hYywgcEJzc0Rlc2MsICZwSWVzKSkKKwkJICAgICYmIGNzcl9uZWlnaGJvcl9yb2FtX2lzX3NzaWRfYW5kX3NlY3VyaXR5X21hdGNoKHBNYWMsCisJCQkJCXBDdXJyUHJvZmlsZSwgcEJzc0Rlc2MsIHBJZXMpKSB7CisJCQlmTmV3ID0gZmFsc2U7CisJCX0KKwkJaWYgKHBJZXMpIHsKKwkJCWNkZl9tZW1fZnJlZShwSWVzKTsKKwkJfQorCX0KKworCWlmIChmTmV3KSB7CisJCXNtc19sb2cocE1hYywgTE9HMSwKKwkJCUZMKCJQcmV2IHJvYW0gcHJvZmlsZSBkaWQgbm90IG1hdGNoIGN1cnJlbnQiKSk7CisJfSBlbHNlIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiUHJldiByb2FtIHByb2ZpbGUgbWF0Y2hlcyBjdXJyZW50IikpOworCX0KKworCXJldHVybiBmTmV3OworfQorCitib29sIGNzcl9uZWlnaGJvcl9yb2FtX2Nvbm5lY3RlZF9wcm9maWxlX21hdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgIHRDc3JTY2FuUmVzdWx0ICpwUmVzdWx0LAorCQkJCQkgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKwl0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBDdXJQcm9maWxlID0gTlVMTDsKKwl0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjID0gJnBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yOworCisJaWYgKCEocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbiAmJiBDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcEN1clByb2ZpbGUgPSAmcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGU7CisKKwlpZiAoIXBDdXJQcm9maWxlKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gY3NyX25laWdoYm9yX3JvYW1faXNfc3NpZF9hbmRfc2VjdXJpdHlfbWF0Y2gocE1hYywgcEN1clByb2ZpbGUsCisJCQkJCQkJICAgIHBCc3NEZXNjLCBwSWVzKTsKK30KKworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9wcmVwYXJlX25vbl9vY2N1cGllZF9jaGFubmVsX2xpc3QoKSAtIHByZXBhcmUgbm9uLW9jY3VwIENMCisgKiBAcE1hYzogVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3BlbgorICogQHBJbnB1dENoYW5uZWxMaXN0OiBUaGUgZGVmYXVsdCBjaGFubmVscyBsaXN0CisgKiBAbnVtT2ZDaGFubmVsczogVGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGVmYXVsdCBjaGFubmVscyBsaXN0CisgKiBAcE91dHB1dENoYW5uZWxMaXN0OiBUaGUgcGxhY2UgdG8gcHV0IHRoZSBub24tb2NjdXBpZWQgY2hhbm5lbCBsaXN0CisgKiBAcE91dHB1dE51bU9mQ2hhbm5lbHM6IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgbm9uLW9jY3VwaWVkIGNoYW5uZWwgbGlzdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwcmVwYXJlIGEgY2hhbm5lbCBsaXN0IHRoYXQgaXMgZGVyaXZlZCBmcm9tCisgKiB0aGUgbGlzdCBvZiB2YWxpZCBjaGFubmVscyBhbmQgZG9lcyBub3QgaW5jbHVkZSB0aG9zZSBpbiB0aGUgb2NjdXBpZWQgbGlzdAorICoKKyAqIFJldHVybiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMKK2Nzcl9uZWlnaGJvcl9yb2FtX3ByZXBhcmVfbm9uX29jY3VwaWVkX2NoYW5uZWxfbGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQl1aW50OF90IHNlc3Npb25JZCwgdWludDhfdCAqcElucHV0Q2hhbm5lbExpc3QsCisJCXVpbnQ4X3QgbnVtT2ZDaGFubmVscywgdWludDhfdCAqcE91dHB1dENoYW5uZWxMaXN0LAorCQl1aW50OF90ICpwT3V0cHV0TnVtT2ZDaGFubmVscykKK3sKKwl1aW50OF90IGkgPSAwOworCXVpbnQ4X3Qgb3V0cHV0TnVtT2ZDaGFubmVscyA9IDA7CisJdWludDhfdCBudW1PY2N1cGllZENoYW5uZWxzID0KKwkJCXBNYWMtPnNjYW4ub2NjdXBpZWRDaGFubmVsc1tzZXNzaW9uSWRdLm51bUNoYW5uZWxzOworCXVpbnQ4X3QgKnBPY2N1cGllZENoYW5uZWxMaXN0ID0KKwkJCXBNYWMtPnNjYW4ub2NjdXBpZWRDaGFubmVsc1tzZXNzaW9uSWRdLmNoYW5uZWxMaXN0OworCisJZm9yIChpID0gMDsgaSA8IG51bU9mQ2hhbm5lbHM7IGkrKykgeworCQlpZiAoY3NyX2lzX2NoYW5uZWxfcHJlc2VudF9pbl9saXN0CisJCQkJKHBPY2N1cGllZENoYW5uZWxMaXN0LCBudW1PY2N1cGllZENoYW5uZWxzLAorCQkJCSBwSW5wdXRDaGFubmVsTGlzdFtpXSkpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogREZTIGNoYW5uZWwgd2lsbCBiZSBhZGRlZCBpbiB0aGUgbGlzdCBvbmx5IHdoZW4gdGhlCisJCSAqIERGUyBSb2FtaW5nIHNjYW4gZmxhZyBpcyBlbmFibGVkCisJCSAqLworCQlpZiAoQ0RTX0lTX0RGU19DSChwSW5wdXRDaGFubmVsTGlzdFtpXSkpIHsKKwkJCWlmIChDU1JfUk9BTUlOR19ERlNfQ0hBTk5FTF9ESVNBQkxFRCAhPQorCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYWxsb3dERlNDaGFubmVsUm9hbSkgeworCQkJCXBPdXRwdXRDaGFubmVsTGlzdFtvdXRwdXROdW1PZkNoYW5uZWxzKytdID0KKwkJCQkJCXBJbnB1dENoYW5uZWxMaXN0W2ldOworCQkJfQorCQl9IGVsc2UgeworCQkJcE91dHB1dENoYW5uZWxMaXN0W291dHB1dE51bU9mQ2hhbm5lbHMrK10gPQorCQkJCQkJcElucHV0Q2hhbm5lbExpc3RbaV07CisJCX0KKwl9CisKKwlzbXNfbG9nKHBNYWMsIExPRzIsCisJCUZMKCJOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIHZhbGlkIGNoYW5uZWwgbGlzdD0lZDsgIgorCQkgICAiTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBub24tb2NjdXBpZWQgbGlzdCBsaXN0PSVkIiksCisJCW51bU9mQ2hhbm5lbHMsIG91dHB1dE51bU9mQ2hhbm5lbHMpOworCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwkqcE91dHB1dE51bU9mQ2hhbm5lbHMgPSBvdXRwdXROdW1PZkNoYW5uZWxzOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0xGUiAqLworCisvKioKKyAqIGNzcl9yb2FtX3Jlc2V0X3JvYW1fcGFyYW1zIC0gQVBJIHRvIHJlc2V0IHRoZSByb2FtaW5nIHBhcmFtZXRlcnMKKyAqIEBtYWNfY3R4OiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIFRoZSBCU1NJRCBibGFja2xpc3Qgc2hvdWxkIG5vdCBiZSBjbGVhcmVkIHNpbmNlIGl0IGhhcyB0bworICogYmUgdXNlZCBhY3Jvc3MgY29ubmVjdGlvbnMuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSBjbGVhcmVkCisgKiBhbmQgc2VudCB0byBmaXJtd2FyZSB3aXRoIHdpdGggdGhlIHJvYW1pbmcgU1RPUCBjb21tYW5kLgorICoKKyAqIFJldHVybjogVk9JRAorICovCit2b2lkIGNzcl9yb2FtX3Jlc2V0X3JvYW1fcGFyYW1zKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJc3RydWN0IHJvYW1fZXh0X3BhcmFtcyAqcm9hbV9wYXJhbXMgPSBOVUxMOworCisJLyoKKwkgKiBjbGVhciBhbGwgdGhlIHdoaXRlbGlzdCBwYXJhbWV0ZXJzIGFuZCByZW1haW5pbmcKKwkgKiBuZWVkcyB0byBiZSByZXRhaW5lZCBhY3Jvc3MgY29ubmVjdGlvbnMuCisJICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCUZMKCJSb2FtaW5nIHBhcmFtZXRlcnMgYXJlIHJlc2V0IikpOworCXJvYW1fcGFyYW1zID0gJm1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0ucm9hbV9wYXJhbXM7CisJcm9hbV9wYXJhbXMtPm51bV9zc2lkX2FsbG93ZWRfbGlzdCA9IDA7CisJY2RmX21lbV9zZXQoJnJvYW1fcGFyYW1zLT5zc2lkX2FsbG93ZWRfbGlzdCwgMCwKKwkJCXNpemVvZih0U2lyTWFjU1NpZCkgKiBNQVhfU1NJRF9BTExPV0VEX0xJU1QpOworfQorCisvKioKKyAqIGNzcl9uZWlnaGJvcl9yb2FtX2luZGljYXRlX2Rpc2Nvbm5lY3QoKSAtIFRvIGluZGljYXRlIGRpc2Nvbm5lY3QKKyAqIEBwTWFjOiBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuCisgKiBAc2Vzc2lvbklkOiBDU1Igc2Vzc2lvbiBpZCB0aGF0IGdvdCBkaXNjb25uZWN0ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBDU1IgYXMgc29vbiBhcyB0aGUgc3RhdGlvbiBkaXNjb25uZWN0cworICogZnJvbSB0aGUgQVAuIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgbmVjZXNzYXJ5IGNsZWFudXAgb2YgbmVpZ2hib3Igcm9hbQorICogZGF0YSBzdHJ1Y3R1cmVzLiBOZWlnaGJvciByb2FtIHN0YXRlIHRyYW5zaXRpb25zIHRvIElOSVQgc3RhdGUgd2hlbmV2ZXIKKyAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV4Y2VwdCBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBSRUFTU09DSUFUSU5HCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1faW5kaWNhdGVfZGlzY29ubmVjdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkJJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwl0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBQcmV2UHJvZmlsZSA9CisJCQkmcE5laWdoYm9yUm9hbUluZm8tPnByZXZDb25uUHJvZmlsZTsKKyNlbmRpZgorCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKwl0Q3NyUm9hbVNlc3Npb24gKnJvYW1fc2Vzc2lvbiA9IE5VTEw7CisKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJwU2Vzc2lvbiBpcyBOVUxMIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQlGTCgiRGlzY29ubiBpbmQgb24gc2Vzc2lvbiAlZCBpbiBzdGF0ZSAlZCBmcm9tIGJzcyA6IgorCQkJTUFDX0FERFJFU1NfU1RSKSwgc2Vzc2lvbklkLAorCQkJcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlLAorCQkJTUFDX0FERFJfQVJSQVkocFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQuYnl0ZXMpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJLyoKKwkgKiBGcmVlIHRoZSBjdXJyZW50IHByZXZpb3VzIHByb2ZpbGUgYW5kIG1vdmUKKwkgKiB0aGUgY3VycmVudCBwcm9maWxlIHRvIHByZXYgcHJvZmlsZS4KKwkgKi8KKwljc3Jfcm9hbV9mcmVlX2Nvbm5lY3RfcHJvZmlsZShwTWFjLCBwUHJldlByb2ZpbGUpOworCWNzcl9yb2FtX2NvcHlfY29ubmVjdF9wcm9maWxlKHBNYWMsIHNlc3Npb25JZCwgcFByZXZQcm9maWxlKTsKKyNlbmRpZgorCS8qCisJICogY2xlYXIgdGhlIHJvYW1pbmcgcGFyYW1ldGVycyB0aGF0IGFyZSBwZXIgY29ubmVjdGlvbi4KKwkgKiBGb3IgYSBuZXcgY29ubmVjdGlvbiwgdGhleSBoYXZlIHRvIGJlIHByb2dyYW1tZWQgYWdhaW4uCisJICovCisJaWYgKCFjc3JfbmVpZ2hib3JfbWlkZGxlX29mX3JvYW1pbmcoKHRIYWxIYW5kbGUpcE1hYywgc2Vzc2lvbklkKSkKKwkJY3NyX3JvYW1fcmVzZXRfcm9hbV9wYXJhbXMocE1hYyk7CisJaWYgKE5VTEwgIT0gcFNlc3Npb24pIHsKKwkJcm9hbV9zZXNzaW9uID0gJnBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXTsKKwkJaWYgKE5VTEwgIT0gcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSAmJiAoQ0RGX1NUQV9NT0RFICE9CisJCQlyb2FtX3Nlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+Y3NyUGVyc29uYSkpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQlGTCgiSWdub3JlIGRpc2Nvbm4gaW5kIHJjdmQgZnJvbSBub25TVEEgcGVyc29uYSIKKwkJCQkJInNlc3Npb25JZDogJWQsIGNzclBlcnNvbm5hICVkIiksCisJCQkJc2Vzc2lvbklkLAorCQkJCShpbnQpcm9hbV9zZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEpOworCQkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJaWYgKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmlzRVNFQXNzb2MpIHsKKwkJCWNkZl9tZW1fY29weSgmcFNlc3Npb24tPnByZXZBcFNTSUQsCisJCQkJJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLlNTSUQsCisJCQkJc2l6ZW9mKHRTaXJNYWNTU2lkKSk7CisJCQljZGZfY29weV9tYWNhZGRyKCZwU2Vzc2lvbi0+cHJldkFwQnNzaWQsCisJCQkJCSZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCk7CisJCQlwU2Vzc2lvbi0+cHJldk9wQ2hhbm5lbCA9CisJCQkJcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUub3BlcmF0aW9uQ2hhbm5lbDsKKwkJCXBTZXNzaW9uLT5pc1ByZXZBcEluZm9WYWxpZCA9IHRydWU7CisJCQlwU2Vzc2lvbi0+cm9hbVRTMSA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKKwkJfQorI2VuZGlmCisJfQorCisJc3dpdGNoIChwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpIHsKKwljYXNlIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRUFTU09DSUFUSU5HOgorCQkvKgorCQkgKiBTdG9wIHNjYW4gYW5kIG5laWdoYm9yIHJlZnJlc2ggdGltZXJzLgorCQkgKiBUaGVzZSBhcmUgaW5kZWVkIG5vdCByZXF1aXJlZCB3aGVuIHdlJ3IgaW4gcmVhc3NvYyBzdGF0ZS4KKwkJICovCisJCWlmICghQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfSE8ocE1hYywgc2Vzc2lvbklkKSkgeworCQkJLyoKKwkJCSAqIERpc2Nvbm5lY3QgaW5kaWNhdGlvbiBkdXJpbmcgRGlzYXNzb2MgSGFuZG9mZgorCQkJICogc3ViLXN0YXRlIGlzIHJlY2VpdmVkIHdoZW4gd2UgYXJlIHRyeWluZyB0bworCQkJICogZGlzY29ubmVjdCB3aXRoIHRoZSBvbGQgQVAgZHVyaW5nIHJvYW0uCisJCQkgKiBCVVQsIGlmIHJlY2VpdmUgYSBkaXNjb25uZWN0IGluZGljYXRpb24gb3V0c2lkZSBvZgorCQkJICogRGlzYXNzb2MgSGFuZG9mZiBzdWItc3RhdGUsIHRoZW4gaXQgbWVhbnMgdGhhdAorCQkJICogdGhpcyBpcyBhIGdlbnVpbmUgZGlzY29ubmVjdCBhbmQgd2UgbmVlZCB0byBjbGVhbiB1cC4KKwkJCSAqIE90aGVyd2lzZSwgd2Ugd2lsbCBiZSBzdHVjayBpbiByZWFzc29jIHN0YXRlIHdoaWNoJ2xsCisJCQkgKiBpbi10dXJuIGJsb2NrIHNjYW5zLgorCQkJICovCisJCQlDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OCisJCQkJKHBNYWMsIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9JTklULAorCQkJCXNlc3Npb25JZCk7CisJCQlwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLgorCQkJCUlBUFBOZWlnaGJvckxpc3RSZWNlaXZlZCA9IGZhbHNlOworCQl9CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfSU5JVDoKKwkJY3NyX25laWdoYm9yX3JvYW1fcmVzZXRfaW5pdF9zdGF0ZV9jb250cm9sX2luZm8ocE1hYywKKwkJCQlzZXNzaW9uSWQpOworCQlicmVhazsKKworCWNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NPTk5FQ1RFRDoKKwkJQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfVFJBTlNJVElPTigKKwkJCQlwTWFjLCBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfSU5JVCwgc2Vzc2lvbklkKQorCQlwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLklBUFBOZWlnaGJvckxpc3RSZWNlaXZlZCA9CisJCQkJZmFsc2U7CisJCWNzcl9uZWlnaGJvcl9yb2FtX3Jlc2V0X2Nvbm5lY3RlZF9zdGF0ZV9jb250cm9sX2luZm8ocE1hYywKKwkJCQlzZXNzaW9uSWQpOworCQlicmVhazsKKworCWNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1BSRUFVVEhfRE9ORToKKwkJLyogU3RvcCBwcmUtYXV0aCB0byByZWFzc29jIGludGVydmFsIHRpbWVyICovCisJCWNkZl9tY190aW1lcl9zdG9wKCZwU2Vzc2lvbi0+ZnRTbWVDb250ZXh0LgorCQkJCXByZUF1dGhSZWFzc29jSW50dmxUaW1lcik7CisJY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUFJFQVVUSEVOVElDQVRJTkc6CisJCUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04oCisJCQkJcE1hYywgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQsIHNlc3Npb25JZCkKKwkJcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5JQVBQTmVpZ2hib3JMaXN0UmVjZWl2ZWQgPQorCQkJCWZhbHNlOworCQljc3JfbmVpZ2hib3Jfcm9hbV9yZXNldF9wcmVhdXRoX2NvbnRyb2xfaW5mbyhwTWFjLCBzZXNzaW9uSWQpOworCQljc3JfbmVpZ2hib3Jfcm9hbV9yZXNldF9yZXBvcnRfc2Nhbl9zdGF0ZV9jb250cm9sX2luZm8ocE1hYywKKwkJCQlzZXNzaW9uSWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR1csIEZMKCJSZWNlaXZlZCBkaXNjb25uZWN0IGV2ZW50IgorCQkJCSJpbiBzdGF0ZSAlcyAiKSwKKwkJCQltYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlKAorCQkJCQlwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpKTsKKwkJTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dXLCBGTCgiVHJhbnNpdCB0byBJTklUIHN0YXRlIikpOworCQlDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OCisJCQkocE1hYywgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQsIHNlc3Npb25JZCkKKwkJCXBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uCisJCQlJQVBQTmVpZ2hib3JMaXN0UmVjZWl2ZWQgPSBmYWxzZTsKKwkJYnJlYWs7CisJfQorCS8qSW5mb3JtIHRoZSBGaXJtd2FyZSB0byBTVE9QIFNjYW5uaW5nIGFzIHRoZSBob3N0IGhhcyBhIGRpc2Nvbm5lY3QuICovCisJaWYgKGNzcl9yb2FtX2lzX3N0YV9tb2RlKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJY3NyX3JvYW1fb2ZmbG9hZF9zY2FuKHBNYWMsIHNlc3Npb25JZCwgUk9BTV9TQ0FOX09GRkxPQURfU1RPUCwKKwkJCQlSRUFTT05fRElTQ09OTkVDVEVEKTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIGNzcl9uZWlnaGJvcl9yb2FtX2luZm9fY3R4X2luaXQoKSAtIEluaXRpYWxpemUgbmVpZ2hib3Igcm9hbSBzdHJ1Y3QKKyAqIEBwTWFjOiBtYWMgY29udGV4dAorICogQHNlc3Npb25faWQ6IFNlc3Npb24gSWQKKyAqCisgKiBUaGlzIGluaXRpYWxpemVzIGFsbCB0aGUgbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIHRoZQorICogYXNzb2NpYXRlZCBBUC4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgY3NyX25laWdoYm9yX3JvYW1faW5mb19jdHhfaW5pdCgKKwkJdHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJdWludDhfdCBzZXNzaW9uX2lkKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gbmdicl9yb2FtX2luZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25faWRdOworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiA9ICZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25faWRdOworCisjaWYgIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorCWludCBpbml0X2Z0X2ZsYWcgPSBmYWxzZTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xGUgorCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgb2NjdXBpZWQgbGlzdCBPTkxZIGlmIHdlIGFyZQorCSAqIHRyYW5zaXRpb25pbmcgZnJvbSBJTklUIHN0YXRlIHRvIENPTk5FQ1RFRCBzdGF0ZS4KKwkgKi8KKwlpZiAoZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQgPT0KKwkJbmdicl9yb2FtX2luZm8tPm5laWdoYm9yUm9hbVN0YXRlKQorCQljc3JfaW5pdF9vY2N1cGllZF9jaGFubmVsc19saXN0KHBNYWMsIHNlc3Npb25faWQpOworI2VuZGlmCisJQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfVFJBTlNJVElPTgorCQkocE1hYywgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NPTk5FQ1RFRCwgc2Vzc2lvbl9pZCk7CisKKwljZGZfY29weV9tYWNhZGRyKCZuZ2JyX3JvYW1faW5mby0+Y3VyckFQYnNzaWQsCisJCQkmc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCk7CisJbmdicl9yb2FtX2luZm8tPmN1cnJBUG9wZXJhdGlvbkNoYW5uZWwgPQorCQlzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWw7CisJbmdicl9yb2FtX2luZm8tPmN1cnJlbnROZWlnaGJvckxvb2t1cFRocmVzaG9sZCA9CisJCW5nYnJfcm9hbV9pbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JMb29rdXBUaHJlc2hvbGQ7CisJbmdicl9yb2FtX2luZm8tPmN1cnJlbnRPcHBvcnR1bmlzdGljVGhyZXNob2xkRGlmZiA9CisJCW5nYnJfcm9hbV9pbmZvLT5jZmdQYXJhbXMubk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmOworCW5nYnJfcm9hbV9pbmZvLT5jdXJyZW50Um9hbVJlc2NhblJzc2lEaWZmID0KKwkJbmdicl9yb2FtX2luZm8tPmNmZ1BhcmFtcy5uUm9hbVJlc2NhblJzc2lEaWZmOworCW5nYnJfcm9hbV9pbmZvLT5jdXJyZW50Um9hbUJtaXNzRmlyc3RCY250ID0KKwkJbmdicl9yb2FtX2luZm8tPmNmZ1BhcmFtcy5uUm9hbUJtaXNzRmlyc3RCY250OworCW5nYnJfcm9hbV9pbmZvLT5jdXJyZW50Um9hbUJtaXNzRmluYWxCY250ID0KKwkJbmdicl9yb2FtX2luZm8tPmNmZ1BhcmFtcy5uUm9hbUJtaXNzRmluYWxCY250OworCW5nYnJfcm9hbV9pbmZvLT5jdXJyZW50Um9hbUJlYWNvblJzc2lXZWlnaHQgPQorCQluZ2JyX3JvYW1faW5mby0+Y2ZnUGFyYW1zLm5Sb2FtQmVhY29uUnNzaVdlaWdodDsKKworI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwkvKioKKwkgKiBOb3cgd2UgY2FuIGNsZWFyIHRoZSBwcmVhdXRoRG9uZSB0aGF0CisJICogd2FzIHNhdmVkIGFzIHdlIGFyZSBjb25uZWN0ZWQgYWZyZXNoICovCisJY3NyX25laWdoYm9yX3JvYW1fZnJlZV9yb2FtYWJsZV9ic3NfbGlzdChwTWFjLAorCQkmbmdicl9yb2FtX2luZm8tPkZUUm9hbUluZm8ucHJlQXV0aERvbmVMaXN0KTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkvKiBCYXNlZCBvbiB0aGUgYXV0aCBzY2hlbWUgdGVsbCBpZiB3ZSBhcmUgMTFyICovCisJaWYgKGNzcl9pc19hdXRoX3R5cGUxMXIKKwkJKHNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuQXV0aFR5cGUsCisJCXNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuTURJRC5tZGllUHJlc2VudCkpIHsKKwkJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQpCisJCQlpbml0X2Z0X2ZsYWcgPSB0cnVlOworCQluZ2JyX3JvYW1faW5mby0+aXMxMXJBc3NvYyA9IHRydWU7CisJfSBlbHNlCisJCW5nYnJfcm9hbV9pbmZvLT5pczExckFzc29jID0gZmFsc2U7CisJTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cyLCBGTCgiMTFyQXNzb2MgaXMgPSAlZCIpLAorCQluZ2JyX3JvYW1faW5mby0+aXMxMXJBc3NvYyk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkvKiBCYXNlZCBvbiB0aGUgYXV0aCBzY2hlbWUgdGVsbCBpZiB3ZSBhcmUgMTFyICovCisJaWYgKHNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuaXNFU0VBc3NvYykgeworCQlpZiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZCkKKwkJCWluaXRfZnRfZmxhZyA9IHRydWU7CisJCW5nYnJfcm9hbV9pbmZvLT5pc0VTRUFzc29jID0gdHJ1ZTsKKwl9IGVsc2UKKwkJbmdicl9yb2FtX2luZm8tPmlzRVNFQXNzb2MgPSBmYWxzZTsKKwlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzIsCisJCUZMKCJpc0VTRUFzc29jIGlzID0gJWQgZnQgPSAlZCIpLAorCQluZ2JyX3JvYW1faW5mby0+aXNFU0VBc3NvYywgaW5pdF9mdF9mbGFnKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwkvKiBJZiAiTGVnYWN5IEZhc3QgUm9hbWluZyIgaXMgZW5hYmxlZCAqLworCWlmIChjc3Jfcm9hbV9pc19mYXN0X3JvYW1fZW5hYmxlZChwTWFjLCBzZXNzaW9uX2lkKSkKKwkJaW5pdF9mdF9mbGFnID0gdHJ1ZTsKKyNlbmRpZgorI2lmICBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0xGUikKKwlpZiAoaW5pdF9mdF9mbGFnID09IGZhbHNlKQorCQlyZXR1cm47CisJLyogSW5pdGlhbGl6ZSBhbGwgdGhlIGRhdGEgc3RydWN0dXJlcyBuZWVkZWQgZm9yIHRoZSAxMXIgRlQgUHJlYXV0aCAqLworCW5nYnJfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLmN1cnJlbnROZWlnaGJvclJwdFJldHJ5TnVtID0gMDsKKwljc3JfbmVpZ2hib3Jfcm9hbV9wdXJnZV9wcmVhdXRoX2ZhaWxlZF9saXN0KHBNYWMpOworCWlmICghY2RzX2lzX211bHRpcGxlX2FjdGl2ZV9zdGFfc2Vzc2lvbnMoKSAmJgorCQljc3Jfcm9hbV9pc19yb2FtX29mZmxvYWRfc2Nhbl9lbmFibGVkKHBNYWMpKSB7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgbm90IGEgSU5GUkEgdHlwZSBCU1MsIHRoZW4gZG8gbm90IHNlbmQgdGhlIGNvbW1hbmQKKwkJICogZG93biB0byBmaXJtd2FyZS5EbyBub3Qgc2VuZCB0aGUgU1RBUlQgY29tbWFuZCBmb3IKKwkJICogb3RoZXIgc2Vzc2lvbiBjb25uZWN0aW9ucy4qLworCQlpZiAoIWNzcl9yb2FtX2lzX3N0YV9tb2RlKHBNYWMsIHNlc3Npb25faWQpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkiV3JvbmcgTW9kZSAlZCIsCisJCQkJc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5CU1NUeXBlKTsKKwkJCXJldHVybjsKKwkJfQorCQluZ2JyX3JvYW1faW5mby0+dU9zUmVxdWVzdGVkSGFuZG9mZiA9IDA7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQlpZiAoc2Vzc2lvbi0+cm9hbU9mZmxvYWRTeW5jaFBhcmFtcy5iUm9hbVN5bmNoSW5Qcm9ncmVzcykgeworCQkJaWYgKHBNYWMtPnJvYW0ucFJlYXNzb2NSZXNwICE9IE5VTEwpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkJIkZyZWUgUmVhc3NvYyBSc3AiKTsKKwkJCQljZGZfbWVtX2ZyZWUocE1hYy0+cm9hbS5wUmVhc3NvY1Jlc3ApOworCQkJCXBNYWMtPnJvYW0ucFJlYXNzb2NSZXNwID0gTlVMTDsKKwkJCX0KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCSJMRlIzOlNlbmQgU3luY2hDbmYgYXV0aCwgYXV0aGVudGljYXRlZCIpOworCQkJY3NyX3JvYW1fb2ZmbG9hZF9zZW5kX3N5bmNoX2NuZihwTWFjLCBzZXNzaW9uX2lkKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uX2lkLAorCQkJCVJPQU1fU0NBTl9PRkZMT0FEX1NUQVJULAorCQkJCVJFQVNPTl9DT05ORUNUKTsKKwl9CisjZW5kaWYKK30KKworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9pbmRpY2F0ZV9jb25uZWN0KCkKKyAqIEBwTWFjOiBtYWMgY29udGV4dAorICogQHNlc3Npb25faWQ6IFNlc3Npb24gSWQKKyAqIEBjZGZfc3RhdHVzOiBDREYgc3RhdHVzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ1NSIGFzIHNvb24gYXMgdGhlIHN0YXRpb24gY29ubmVjdHMgdG8gYW4gQVAuCisgKiBUaGlzIGluaXRpYWxpemVzIGFsbCB0aGUgbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIHRoZQorICogYXNzb2NpYXRlZCBBUCBhbmQgdHJhbnNpdGlvbnMgdGhlIHN0YXRlIHRvIENPTk5FQ1RFRCBzdGF0ZQorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX2luZGljYXRlX2Nvbm5lY3QoCisJCXRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbl9pZCwKKwkJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gbmdicl9yb2FtX2luZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25faWRdOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwl0Q3NyUm9hbUluZm8gcm9hbUluZm87CisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uID0gJnBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbl9pZF07CisJdHBTaXJTZXRBY3RpdmVNb2RlU2V0Qm5jRmlsdGVyUmVxIG1zZzsKKyNlbmRpZgorCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJLyogaWYgc2Vzc2lvbiBpZCBpbnZhbGlkIHRoZW4gd2UgbmVlZCByZXR1cm4gZmFpbHVyZSAqLworCWlmIChOVUxMID09IG5nYnJfcm9hbV9pbmZvIHx8ICFDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uX2lkKQorCXx8IChOVUxMID09IHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbl9pZF0ucEN1clJvYW1Qcm9maWxlKSkgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJc21zX2xvZyhwTWFjLCBMT0cyLAorCQlGTCgiQ29ubmVjdCBpbmQuIHJlY2VpdmVkIHdpdGggc2Vzc2lvbiBpZCAlZCBpbiBzdGF0ZSAlcyIpLAorCQlzZXNzaW9uX2lkLCBtYWNfdHJhY2VfZ2V0X25laWdoYm91cl9yb2FtX3N0YXRlKAorCQkJbmdicl9yb2FtX2luZm8tPm5laWdoYm9yUm9hbVN0YXRlKSk7CisKKwkvKiBCYWlsIG91dCBpZiB0aGlzIGlzIE5PVCBhIFNUQSBwZXJzb25hICovCisJaWYgKHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbl9pZF0ucEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hICE9CisJQ0RGX1NUQV9NT0RFKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJJZ25vcmluZyBDb25uZWN0IGluZCByZWNlaXZlZCBmcm9tIGEgbm9uIFNUQS4iCisJCQkic2Vzc2lvbl9pZDogJWQsIGNzclBlcnNvbm5hICVkIiksIHNlc3Npb25faWQsCisJCQkoaW50KXNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+Y3NyUGVyc29uYSk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCS8qIGlmIGEgY29uY3VycmVudCBzZXNzaW9uIGlzIHJ1bm5pbmcgKi8KKwlpZiAoKGZhbHNlID09CisJCUNTUl9JU19GQVNUUk9BTV9JTl9DT05DVVJSRU5DWV9JTklfRkVBVFVSRV9FTkFCTEVEKHBNYWMpKSAmJgorCQkoY3NyX2lzX2NvbmN1cnJlbnRfc2Vzc2lvbl9ydW5uaW5nKHBNYWMpKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiSWdub3JpbmcgQ29ubmVjdCBpbmQuIHJlY2VpdmVkIGluIG11bHRpc2Vzc2lvbiAlZCIpLAorCQkJY3NyX2lzX2NvbmN1cnJlbnRfc2Vzc2lvbl9ydW5uaW5nKHBNYWMpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmIChzZXNzaW9uLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLmJSb2FtU3luY2hJblByb2dyZXNzICYmCisJCShlU0lSX1JPQU1fQVVUSF9TVEFUVVNfQVVUSEVOVElDQVRFRCA9PQorCQlzZXNzaW9uLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLmF1dGhTdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJIkxGUjM6Y3NyX25laWdoYm9yX3JvYW1faW5kaWNhdGVfY29ubmVjdCIpOworCQltc2cgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclNldEFjdGl2ZU1vZGVTZXRCbmNGaWx0ZXJSZXEpKTsKKwkJaWYgKG1zZyA9PSBOVUxMKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkiTEZSMzpNZW0gQWxsb2MgZmFpbGVkIGZvciBiZWFjb24gRmlsdGVyIFJlcSIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCQltc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfU0VUX0JDTl9GSUxURVJfUkVROworCQltc2ctPmxlbmd0aCA9IHNpemVvZih1aW50OF90KTsKKwkJbXNnLT5zZWVzaW9uSWQgPSBzZXNzaW9uX2lkOworCQlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhtc2cpOworCQljZGZfY29weV9tYWNhZGRyKCZyb2FtSW5mby5wZWVyTWFjLAorCQkJJnNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQpOworCQlyb2FtSW5mby5yb2FtU3luY2hJblByb2dyZXNzID0KKwkJCXNlc3Npb24tPnJvYW1PZmZsb2FkU3luY2hQYXJhbXMuYlJvYW1TeW5jaEluUHJvZ3Jlc3M7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgc2Vzc2lvbl9pZCwgJnJvYW1JbmZvLCAwLAorCQkJZUNTUl9ST0FNX1NFVF9LRVlfQ09NUExFVEUsCisJCQllQ1NSX1JPQU1fUkVTVUxUX0FVVEhFTlRJQ0FURUQpOworCX0KKyNlbmRpZgorCisJc3dpdGNoIChuZ2JyX3JvYW1faW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpIHsKKwljYXNlIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRUFTU09DSUFUSU5HOgorCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJCS8qKgorCQkJICogSnVzdCB0cmFuc2l0aW9uIHRoZSBzdGF0ZSB0byBJTklUIHN0YXRlLlJlc3Qgb2YgdGhlCisJCQkgKiBjbGVhbiB1cCBoYXBwZW5zIHdoZW4gd2UgZ2V0IG5leHQgY29ubmVjdCBpbmRpY2F0aW9uCisJCQkgKi8KKwkJCUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04oCisJCQkJcE1hYywgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQsCisJCQkJc2Vzc2lvbl9pZCkKKwkJCW5nYnJfcm9hbV9pbmZvLT5yb2FtQ2hhbm5lbEluZm8uSUFQUE5laWdoYm9yTGlzdFJlY2VpdmVkID0KKwkJCQlmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJLyogRmFsbCB0aHJvdWdoIGlmIHRoZSBzdGF0dXMgaXMgU1VDQ0VTUyAqLworCWNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQ6CisJCS8qIFJlc2V0IGFsbCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGhlcmUgKi8KKwkJY3NyX25laWdoYm9yX3JvYW1fcmVzZXRfaW5pdF9zdGF0ZV9jb250cm9sX2luZm8ocE1hYywKKwkJCXNlc3Npb25faWQpOworCQljc3JfbmVpZ2hib3Jfcm9hbV9pbmZvX2N0eF9pbml0KHBNYWMsIHNlc3Npb25faWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiQ29ubmVjdCBldnQgcmVjZWl2ZWQgaW4gaW52YWxpZCBzdGF0ZSAlcyBJZ25vcmluZyIpLAorCQkJbWFjX3RyYWNlX2dldF9uZWlnaGJvdXJfcm9hbV9zdGF0ZSgKKwkJCW5nYnJfcm9hbV9pbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JfbmVpZ2hib3Jfcm9hbV9wdXJnZV9wcmVhdXRoX2ZhaWxlZF9saXN0CisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gcHVyZ2VzIGFsbCB0aGUgTUFDIGFkZHJlc3NlcyBpbiB0aGUgcHJlLWF1dGggZmFpbCBsaXN0CisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorCisgICAgXHJldHVybiBWT0lECisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNzcl9uZWlnaGJvcl9yb2FtX3B1cmdlX3ByZWF1dGhfZmFpbGVkX2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl1aW50OF90IGksIGo7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9IE5VTEw7CisKKwlmb3IgKGogPSAwOyBqIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGorKykgeworCQlwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bal07CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8CisJCSAgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0LgorCQkgICAgIG51bU1BQ0FkZHJlc3M7IGkrKykgeworCQkJY2RmX21lbV96ZXJvKHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLgorCQkJCSAgICAgcHJlQXV0aEZhaWxMaXN0Lm1hY0FkZHJlc3NbaV0sCisJCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJfQorCQlwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRmFpbExpc3QubnVtTUFDQWRkcmVzcyA9IDA7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JfbmVpZ2hib3Jfcm9hbV9pbml0MTFyX2Fzc29jX2luZm8KKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyAxMXIgcmVsYXRlZCBuZWlnaGJvciByb2FtIGRhdGEgc3RydWN0dXJlcworCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZSBvdGhlcndpc2UKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1faW5pdDExcl9hc3NvY19pbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCBpOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPSBOVUxMOworCXRwQ3NyMTFyQXNzb2NOZWlnaGJvckluZm8gcEZUUm9hbUluZm8gPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW2ldOworCQlwRlRSb2FtSW5mbyA9ICZwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mbzsKKworCQlwTmVpZ2hib3JSb2FtSW5mby0+aXMxMXJBc3NvYyA9IGZhbHNlOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm1heE5laWdoYm9yUmV0cmllcyA9CisJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCW5NYXhOZWlnaGJvclJldHJpZXM7CisKKwkJcEZUUm9hbUluZm8tPm5laWdoYm9yUmVwb3J0VGltZW91dCA9CisJCQlDU1JfTkVJR0hCT1JfUk9BTV9SRVBPUlRfUVVFUllfVElNRU9VVDsKKwkJcEZUUm9hbUluZm8tPlBFUHJlYXV0aFJlc3BUaW1lb3V0ID0KKwkJCUNTUl9ORUlHSEJPUl9ST0FNX1BSRUFVVEhfUlNQX1dBSVRfTVVMVElQTElFUiAqCisJCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5laWdoYm9yU2NhblBlcmlvZDsKKwkJcEZUUm9hbUluZm8tPm5laWdoYm9yUnB0UGVuZGluZyA9IGZhbHNlOworCQlwRlRSb2FtSW5mby0+cHJlYXV0aFJzcFBlbmRpbmcgPSBmYWxzZTsKKworCQlwRlRSb2FtSW5mby0+Y3VycmVudE5laWdoYm9yUnB0UmV0cnlOdW0gPSAwOworCQlwRlRSb2FtSW5mby0+bnVtQnNzRnJvbU5laWdoYm9yUmVwb3J0ID0gMDsKKworCQljZGZfbWVtX3plcm8ocEZUUm9hbUluZm8tPm5laWdoYm9SZXBvcnRCc3NJbmZvLAorCQkJICAgICBzaXplb2YodENzck5laWdoYm9yUmVwb3J0QnNzSW5mbykgKgorCQkJICAgICBNQVhfQlNTX0lOX05FSUdIQk9SX1JQVCk7CisKKwkJc3RhdHVzID0gY3NyX2xsX29wZW4ocE1hYy0+aEhkZCwgJnBGVFJvYW1JbmZvLT5wcmVBdXRoRG9uZUxpc3QpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJMTCBPcGVuIG9mIHByZWF1dGggZG9uZSBBUCBMaXN0IGZhaWxlZCIpKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfUkVTT1VSQ0VTOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyX25laWdoYm9yX3JvYW1faW5pdAorCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIG5laWdoYm9yIHJvYW0gZGF0YSBzdHJ1Y3R1cmVzCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorCisgICAgXHJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlIG90aGVyd2lzZQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV9pbml0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisKKwlwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUgPSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ0xPU0VEOworCXBOZWlnaGJvclJvYW1JbmZvLT5wcmV2TmVpZ2hib3JSb2FtU3RhdGUgPQorCQllQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ0xPU0VEOworCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubWF4Q2hhbm5lbFNjYW5UaW1lID0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yU2Nhbk1heENoYW5UaW1lOworCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubWluQ2hhbm5lbFNjYW5UaW1lID0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lOworCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubWF4TmVpZ2hib3JSZXRyaWVzID0gMDsKKwlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5laWdoYm9yTG9va3VwVGhyZXNob2xkID0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCW5OZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQ7CisJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5kZWxheV9iZWZvcmVfdmRldl9zdG9wID0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCWRlbGF5X2JlZm9yZV92ZGV2X3N0b3A7CisJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmYgPQorCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJbk9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmOworCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMublJvYW1SZXNjYW5Sc3NpRGlmZiA9CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5Sb2FtUmVzY2FuUnNzaURpZmY7CisJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uUm9hbUJtaXNzRmlyc3RCY250ID0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcublJvYW1CbWlzc0ZpcnN0QmNudDsKKwlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5Sb2FtQm1pc3NGaW5hbEJjbnQgPQorCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uUm9hbUJtaXNzRmluYWxCY250OworCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMublJvYW1CZWFjb25Sc3NpV2VpZ2h0ID0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcublJvYW1CZWFjb25Sc3NpV2VpZ2h0OworCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JTY2FuUGVyaW9kID0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yU2NhblRpbWVyUGVyaW9kOworCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZCA9CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQluTmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZDsKKwlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmVtcHR5U2NhblJlZnJlc2hQZXJpb2QgPQorCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uRW1wdHlTY2FuUmVmcmVzaFBlcmlvZDsKKworCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5laWdoYm9yU2NhbkNoYW5MaXN0LgorCQludW1DaGFubmVsczsKKworCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPQorCQljZGZfbWVtX21hbGxvYyhwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCSAgICAgICBuZWlnaGJvclNjYW5DaGFuTGlzdC5udW1DaGFubmVscyk7CisKKwlpZiAoTlVMTCA9PSBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCJNZW1vcnkgQWxsb2NhdGlvbiBmb3IgQ0ZHIENoYW5uZWwgTGlzdCBmYWlsZWQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJLyogVXBkYXRlIHRoZSByb2FtIGdsb2JhbCBzdHJ1Y3R1cmUgZnJvbSBDRkcgKi8KKwljZGZfbWVtX2NvcHkocE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5DaGFubmVsTGlzdCwKKwkJICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJICAgICBuZWlnaGJvclNjYW5DaGFuTGlzdC5jaGFubmVsTGlzdCwKKwkJICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJICAgICBuZWlnaGJvclNjYW5DaGFuTGlzdC5udW1DaGFubmVscyk7CisJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5oaV9yc3NpX3NjYW5fbWF4X2NvdW50ID0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCQluaGlfcnNzaV9zY2FuX21heF9jb3VudDsKKwlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmhpX3Jzc2lfc2Nhbl9yc3NpX2RlbHRhID0KKwkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcuCisJCQluaGlfcnNzaV9zY2FuX3Jzc2lfZGVsdGE7CisJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5oaV9yc3NpX3NjYW5fZGVsYXkgPQorCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy4KKwkJCW5oaV9yc3NpX3NjYW5fZGVsYXk7CisJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5oaV9yc3NpX3NjYW5fcnNzaV91YiA9CisJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLgorCQkJbmhpX3Jzc2lfc2Nhbl9yc3NpX3ViOworCisJY2RmX3plcm9fbWFjYWRkcigmcE5laWdoYm9yUm9hbUluZm8tPmN1cnJBUGJzc2lkKTsKKwlwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudE5laWdoYm9yTG9va3VwVGhyZXNob2xkID0KKwkJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvckxvb2t1cFRocmVzaG9sZDsKKwlwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudE9wcG9ydHVuaXN0aWNUaHJlc2hvbGREaWZmID0KKwkJcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uT3Bwb3J0dW5pc3RpY1RocmVzaG9sZERpZmY7CisJcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnRSb2FtUmVzY2FuUnNzaURpZmYgPQorCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5Sb2FtUmVzY2FuUnNzaURpZmY7CisJcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnRSb2FtQm1pc3NGaXJzdEJjbnQgPQorCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5Sb2FtQm1pc3NGaXJzdEJjbnQ7CisJcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnRSb2FtQm1pc3NGaW5hbEJjbnQgPQorCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5Sb2FtQm1pc3NGaW5hbEJjbnQ7CisJcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnRSb2FtQmVhY29uUnNzaVdlaWdodCA9CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMublJvYW1CZWFjb25Sc3NpV2VpZ2h0OworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwljZGZfbWVtX3NldCgmcE5laWdoYm9yUm9hbUluZm8tPnByZXZDb25uUHJvZmlsZSwKKwkJICAgIHNpemVvZih0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUpLCAwKTsKKyNlbmRpZgorCisJc3RhdHVzID0gY3NyX2xsX29wZW4ocE1hYy0+aEhkZCwgJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtYWJsZUFQTGlzdCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiTEwgT3BlbiBvZiByb2FtIGFibGUgQVAgTGlzdCBmYWlsZWQiKSk7CisJCWNkZl9tZW1fZnJlZShwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLgorCQkJICAgICBDaGFubmVsTGlzdCk7CisJCXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwl9CisKKwlwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFuSW5kZXggPQorCQlDU1JfTkVJR0hCT1JfUk9BTV9JTlZBTElEX0NIQU5ORUxfSU5ERVg7CisJcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLgorCW51bU9mQ2hhbm5lbHMgPSAwOworCXBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdCA9CisJCU5VTEw7CisJcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5JQVBQTmVpZ2hib3JMaXN0UmVjZWl2ZWQgPSBmYWxzZTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJc3RhdHVzID0gY3NyX25laWdoYm9yX3JvYW1faW5pdDExcl9hc3NvY19pbmZvKHBNYWMpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkxMIE9wZW4gb2Ygcm9hbSBhYmxlIEFQIExpc3QgZmFpbGVkIikpOworCQljZGZfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby4KKwkJCSAgICAgQ2hhbm5lbExpc3QpOworCQlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKwkJY3NyX2xsX2Nsb3NlKCZwTmVpZ2hib3JSb2FtSW5mby0+cm9hbWFibGVBUExpc3QpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwl9CisjZW5kaWYKKworCUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04ocE1hYywgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQsCisJCQkJCSAgIHNlc3Npb25JZCkKKwlwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLklBUFBOZWlnaGJvckxpc3RSZWNlaXZlZCA9IGZhbHNlOworCS8qIFNldCB0aGUgTGFzdCBTZW50IENtZCBhcyBSU09fU1RPUCAqLworCXBOZWlnaGJvclJvYW1JbmZvLT5sYXN0X3NlbnRfY21kID0gUk9BTV9TQ0FOX09GRkxPQURfU1RPUDsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JfbmVpZ2hib3Jfcm9hbV9jbG9zZQorCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNsb3Nlcy9mcmVlcyBhbGwgdGhlIG5laWdoYm9yIHJvYW0gZGF0YSBzdHJ1Y3R1cmVzCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgIFxwYXJhbSAgc2Vzc2lvbklkIC0gU2Vzc2lvbiBpZGVudGlmaWVyCisgICAgXHJldHVybiBWT0lECisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNzcl9uZWlnaGJvcl9yb2FtX2Nsb3NlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisKKwlpZiAoZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NMT1NFRCA9PQorCSAgICBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJRkwoIk5laWdoYm9yIFJvYW0gQWxnb3JpdGhtIEFscmVhZHkgQ2xvc2VkIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpCisJCWNkZl9tZW1fZnJlZShwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLgorCQkJICAgICBDaGFubmVsTGlzdCk7CisKKwlwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKworCS8qIFNob3VsZCBmcmVlIHVwIHRoZSBub2RlcyBpbiB0aGUgbGlzdCBiZWZvcmUgY2xvc2luZyB0aGUgZG91YmxlIExpbmtlZCBsaXN0ICovCisJY3NyX25laWdoYm9yX3JvYW1fZnJlZV9yb2FtYWJsZV9ic3NfbGlzdChwTWFjLAorCQkJCQkJICZwTmVpZ2hib3JSb2FtSW5mby0+cm9hbWFibGVBUExpc3QpOworCWNzcl9sbF9jbG9zZSgmcE5laWdoYm9yUm9hbUluZm8tPnJvYW1hYmxlQVBMaXN0KTsKKworCWlmIChwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uCisJICAgIENoYW5uZWxMaXN0KSB7CisJCWNkZl9tZW1fZnJlZShwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLgorCQkJICAgICBjdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KTsKKwl9CisKKwlwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3QgPQorCQlOVUxMOworCXBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5JbmRleCA9CisJCUNTUl9ORUlHSEJPUl9ST0FNX0lOVkFMSURfQ0hBTk5FTF9JTkRFWDsKKwlwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uCisJbnVtT2ZDaGFubmVscyA9IDA7CisJcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0KKwkJTlVMTDsKKwlwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLklBUFBOZWlnaGJvckxpc3RSZWNlaXZlZCA9IGZhbHNlOworCisJLyogRnJlZSB0aGUgcHJvZmlsZS4uICovCisJY3NyX3JlbGVhc2VfcHJvZmlsZShwTWFjLCAmcE5laWdoYm9yUm9hbUluZm8tPmNzck5laWdoYm9yUm9hbVByb2ZpbGUpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKKwljc3Jfcm9hbV9mcmVlX2Nvbm5lY3RfcHJvZmlsZShwTWFjLCAmcE5laWdoYm9yUm9hbUluZm8tPnByZXZDb25uUHJvZmlsZSk7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCXBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLmN1cnJlbnROZWlnaGJvclJwdFJldHJ5TnVtID0gMDsKKwlwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5udW1Cc3NGcm9tTmVpZ2hib3JSZXBvcnQgPSAwOworCWNkZl9tZW1femVybyhwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5uZWlnaGJvUmVwb3J0QnNzSW5mbywKKwkJICAgICBzaXplb2YodENzck5laWdoYm9yUmVwb3J0QnNzSW5mbykgKgorCQkgICAgIE1BWF9CU1NfSU5fTkVJR0hCT1JfUlBUKTsKKwljc3JfbmVpZ2hib3Jfcm9hbV9mcmVlX3JvYW1hYmxlX2Jzc19saXN0KHBNYWMsCisJCQkJCQkgJnBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLgorCQkJCQkJIHByZUF1dGhEb25lTGlzdCk7CisJY3NyX2xsX2Nsb3NlKCZwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRG9uZUxpc3QpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKwlDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OKHBNYWMsCisJCWVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DTE9TRUQsIHNlc3Npb25JZCkKKworCXJldHVybjsKK30KKworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9yZXF1ZXN0X2hhbmRvZmYoKSAtIEhhbmRvZmYgdG8gYSBkaWZmZXJlbnQgQVAKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAc2Vzc2lvbl9pZDogU2Vzc2lvbiBJRAorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgYWN0dWFsIHN3aXRjaGluZyBmcm9tIG9uZSBBUCB0byB0aGUgbmV3IEFQLgorICogSXQgaXNzdWVzIGRpc2Fzc29jaWF0ZSB3aXRoIHJlYXNvbiBjb2RlIGFzIEhhbmRvZmYgYW5kIENTUiBhcyBhIHBhcnQgb2YKKyAqIGhhbmRsaW5nIGRpc2Fzc29jIHJzcCwgaXNzdWVzIHJlYXNzb2NpYXRlIHRvIHRoZSBuZXcgQVAKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCBjc3JfbmVpZ2hib3Jfcm9hbV9yZXF1ZXN0X2hhbmRvZmYodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDhfdCBzZXNzaW9uX2lkKQoreworCXRDc3JSb2FtSW5mbyByb2FtX2luZm87CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBuZWlnaGJvcl9yb2FtX2luZm8gPQorCQkmbWFjX2N0eC0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25faWRdOworCXRDc3JOZWlnaGJvclJvYW1CU1NJbmZvIGhhbmRvZmZfbm9kZTsKKwl1aW50MzJfdCByb2FtaWQgPSAwOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsICIlcyBzZXNzaW9uX2lkPSVkIiwKKwkJICBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisKKwlpZiAobmVpZ2hib3Jfcm9hbV9pbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSAhPQorCQllQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUFJFQVVUSF9ET05FKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJSb2FtIHJlcXVlc3RlZCB3aGVuIE5laWdoYm9yIHJvYW0gaXMgaW4gJXMgc3RhdGUiKSwKKwkJCW1hY190cmFjZV9nZXRfbmVpZ2hib3VyX3JvYW1fc3RhdGUoCisJCQluZWlnaGJvcl9yb2FtX2luZm8tPm5laWdoYm9yUm9hbVN0YXRlKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZmFsc2UgPT0gY3NyX25laWdoYm9yX3JvYW1fZ2V0X2hhbmRvZmZfYXBfaW5mbyhtYWNfY3R4LAorCQkJJmhhbmRvZmZfbm9kZSwgc2Vzc2lvbl9pZCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCUZMKCJmYWlsZWQgdG8gb2J0YWluIGhhbmRvZmYgQVAiKSk7CisJCXJldHVybjsKKwl9CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCSAgRkwoIkhBTkRPRkYgQ0FORElEQVRFIEJTU0lEICJNQUNfQUREUkVTU19TVFIpLAorCQkgIE1BQ19BRERSX0FSUkFZKGhhbmRvZmZfbm9kZS5wQnNzRGVzY3JpcHRpb24tPmJzc0lkKSk7CisKKwljZGZfbWVtX3plcm8oJnJvYW1faW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbykpOworCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbl9pZCwgJnJvYW1faW5mbywgcm9hbWlkLAorCQkJICAgICAgIGVDU1JfUk9BTV9GVF9TVEFSVCwgZVNJUl9TTUVfU1VDQ0VTUyk7CisKKwljZGZfbWVtX3plcm8oJnJvYW1faW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbykpOworCUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04KKwkJKG1hY19jdHgsIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRUFTU09DSUFUSU5HLCBzZXNzaW9uX2lkKQorCisJY3NyX25laWdoYm9yX3JvYW1fc2VuZF9sZnJfbWV0cmljX2V2ZW50KG1hY19jdHgsIHNlc3Npb25faWQsCisJCWhhbmRvZmZfbm9kZS5wQnNzRGVzY3JpcHRpb24tPmJzc0lkLAorCQllQ1NSX1JPQU1fSEFORE9WRVJfU1VDQ0VTUyk7CisJLyogRnJlZSB0aGUgcHJvZmlsZS4uIEp1c3QgdG8gbWFrZSBzdXJlIHdlIGRvbnQgbGVhayBtZW1vcnkgaGVyZSAqLworCWNzcl9yZWxlYXNlX3Byb2ZpbGUobWFjX2N0eCwKKwkJJm5laWdoYm9yX3JvYW1faW5mby0+Y3NyTmVpZ2hib3JSb2FtUHJvZmlsZSk7CisJLyoKKwkgKiBDcmVhdGUgdGhlIEhhbmRvZmYgQVAgcHJvZmlsZS4gQ29weSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBwcm9maWxlCisJICogYW5kIHVwZGF0ZSBvbmx5IHRoZSBCU1NJRCBhbmQgY2hhbm5lbCBudW1iZXIuIFRoaXMgc2hvdWxkIGhhcHBlbgorCSAqIGJlZm9yZSBpc3N1aW5nIGRpc2Nvbm5lY3QKKwkgKi8KKwlzdGF0dXMgPSBjc3Jfcm9hbV9jb3B5X2Nvbm5lY3RlZF9wcm9maWxlKG1hY19jdHgsIHNlc3Npb25faWQsCisJCQkmbmVpZ2hib3Jfcm9hbV9pbmZvLT5jc3JOZWlnaGJvclJvYW1Qcm9maWxlKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCUZMKCJjc3Jfcm9hbV9jb3B5X2Nvbm5lY3RlZF9wcm9maWxlIGZhaWxlZCAlZCIpLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKwljZGZfbWVtX2NvcHkobmVpZ2hib3Jfcm9hbV9pbmZvLT5jc3JOZWlnaGJvclJvYW1Qcm9maWxlLkJTU0lEcy5ic3NpZCwKKwkJICAgICBoYW5kb2ZmX25vZGUucEJzc0Rlc2NyaXB0aW9uLT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJbmVpZ2hib3Jfcm9hbV9pbmZvLT5jc3JOZWlnaGJvclJvYW1Qcm9maWxlLkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0WzBdID0KKwkJaGFuZG9mZl9ub2RlLnBCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbElkOworCisJTkVJR0hCT1JfUk9BTV9ERUJVRyhtYWNfY3R4LCBMT0dXLAorCQkiIGNzcl9yb2FtSGFuZG9mZlJlcXVlc3RlZDogZGlzYXNzb2NpYXRpbmcgd2l0aCBjdXJyZW50IEFQIik7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkgICAgKGNzcl9yb2FtX2lzc3VlX2Rpc2Fzc29jaWF0ZV9jbWQKKwkJCSAgICAobWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCSAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0hBTkRPRkYpKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR1csCisJCQkiY3NyX3JvYW1IYW5kb2ZmUmVxdWVzdGVkOiAgZmFpbCB0byBpc3N1ZSBkaXNhc3NvY2lhdGUiKTsKKwkJcmV0dXJuOworCX0KKwkvKiBub3RpZnkgSEREIGZvciBoYW5kb2ZmLCBwcm92aWRpbmcgdGhlIEJTU0lEIHRvbyAqLworCXJvYW1faW5mby5yZWFzb25Db2RlID0gZUNzclJvYW1SZWFzb25CZXR0ZXJBUDsKKworCWNkZl9tZW1fY29weShyb2FtX2luZm8uYnNzaWQuYnl0ZXMsCisJCSAgICAgaGFuZG9mZl9ub2RlLnBCc3NEZXNjcmlwdGlvbi0+YnNzSWQsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKworCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwgc2Vzc2lvbl9pZCwgJnJvYW1faW5mbywgMCwKKwkJCSAgICAgICBlQ1NSX1JPQU1fUk9BTUlOR19TVEFSVCwgZUNTUl9ST0FNX1JFU1VMVF9OT05FKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9pc19oYW5kb2ZmX2luX3Byb2dyZXNzKCkKKyAqCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHNlc3Npb25faWQ6IFNlc3Npb24gSUQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgd2hldGhlciBoYW5kb2ZmIGlzIGluIHByb2dyZXNzIG9yIG5vdCBiYXNlZCBvbgorICogdGhlIGN1cnJlbnQgbmVpZ2hib3Igcm9hbSBzdGF0ZQorICoKKyAqIFJldHVybjogdHJ1ZSBpZiByZWFzc29jIGluIHByb2dyZXNzLCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCBjc3JfbmVpZ2hib3Jfcm9hbV9pc19oYW5kb2ZmX2luX3Byb2dyZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCWlmIChlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVBU1NPQ0lBVElORyA9PQorCSAgICBwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXS5uZWlnaGJvclJvYW1TdGF0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNpZiBkZWZpbmVkKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkKFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HKQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyX25laWdoYm9yX3JvYW1faXMxMXJfYXNzb2MKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgYXNzb2NpYXRpb24gaXMgYSAxMXIgYXNzb2Mgb3Igbm90CisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorCisgICAgXHJldHVybiB0cnVlIGlmIGN1cnJlbnQgYXNzb2MgaXMgMTFyLCBmYWxzZSBvdGhlcndpc2UKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Jvb2wgY3NyX25laWdoYm9yX3JvYW1faXMxMXJfYXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisJcmV0dXJuIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdLmlzMTFyQXNzb2M7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworLyoqCisgKiBjc3JfbmVpZ2hib3Jfcm9hbV9nZXRfaGFuZG9mZl9hcF9pbmZvIC0gSWRlbnRpZmllcyB0aGUgYmVzdCBBUCBmb3Igcm9hbWluZworICoKKyAqIEBwTWFjOiAgICAgICAgbWFjIGNvbnRleHQKKyAqIEBzZXNzaW9uX2lkOiAgICAgU2Vzc2lvbiBJZAorICogQGhhbmRfb2ZmX25vZGU6ICAgIEFQIG5vZGUgdGhhdCBpcyB0aGUgaGFuZG9mZiBjYW5kaWRhdGUgcmV0dXJuZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJlc3QgcG9zc2libGUgQVAgZm9yIGhhbmRvZmYuIEZvciAxMVIgY2FzZSwgaXQKKyAqIHJldHVybnMgdGhlIDFzdCBlbnRyeSBmcm9tIHByZS1hdXRoIGRvbmUgbGlzdC4gRm9yIG5vbi0xMXIgY2FzZSwgaXQgcmV0dXJucworICogdGhlIDFzdCBlbnRyeSBmcm9tIHJvYW1hYmxlIEFQIGxpc3QKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgYWJsZSBmaW5kIGhhbmRvZmYgQVAsIGZhbHNlIG90aGVyd2lzZQorICovCisKK2Jvb2wgY3NyX25laWdoYm9yX3JvYW1fZ2V0X2hhbmRvZmZfYXBfaW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIGhhbmRfb2ZmX25vZGUsCisJCQl1aW50OF90IHNlc3Npb25faWQpCit7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBuZ2JyX3JvYW1faW5mbyA9CisJCSZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbl9pZF07CisJdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIGJzc19ub2RlID0gTlVMTDsKKworCWlmIChOVUxMID09IGhhbmRfb2ZmX25vZGUpIHsKKwkJQ0RGX0FTU0VSVChOVUxMICE9IGhhbmRfb2ZmX25vZGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJaWYgKG5nYnJfcm9hbV9pbmZvLT5pczExckFzc29jKSB7CisJCS8qIEFsd2F5cyB0aGUgQlNTIGluZm8gaW4gdGhlIGhlYWQgaXMgdGhlIGhhbmRvZmYgY2FuZGlkYXRlICovCisJCWJzc19ub2RlID0gY3NyX25laWdoYm9yX3JvYW1fbmV4dF9yb2FtYWJsZV9hcCgKKwkJCXBNYWMsCisJCQkmbmdicl9yb2FtX2luZm8tPkZUUm9hbUluZm8ucHJlQXV0aERvbmVMaXN0LAorCQkJTlVMTCk7CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMSwKKwkJCUZMKCJOdW1iZXIgb2YgSGFuZG9mZiBjYW5kaWRhdGVzID0gJWQiKSwKKwkJCWNzcl9sbF9jb3VudCgmCisJCQkJbmdicl9yb2FtX2luZm8tPkZUUm9hbUluZm8ucHJlQXV0aERvbmVMaXN0KSk7CisJfSBlbHNlCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJaWYgKG5nYnJfcm9hbV9pbmZvLT5pc0VTRUFzc29jKSB7CisJCS8qIEFsd2F5cyB0aGUgQlNTIGluZm8gaW4gdGhlIGhlYWQgaXMgdGhlIGhhbmRvZmYgY2FuZGlkYXRlICovCisJCWJzc19ub2RlID0KKwkJCWNzcl9uZWlnaGJvcl9yb2FtX25leHRfcm9hbWFibGVfYXAocE1hYywKKwkJCQkmbmdicl9yb2FtX2luZm8tPkZUUm9hbUluZm8ucHJlQXV0aERvbmVMaXN0LAorCQkJCU5VTEwpOworCQlORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzEsCisJCQlGTCgiTnVtYmVyIG9mIEhhbmRvZmYgY2FuZGlkYXRlcyA9ICVkIiksCisJCQljc3JfbGxfY291bnQoJm5nYnJfcm9hbV9pbmZvLT5GVFJvYW1JbmZvLgorCQkJcHJlQXV0aERvbmVMaXN0KSk7CisJfSBlbHNlCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJaWYgKGNzcl9yb2FtX2lzX2Zhc3Rfcm9hbV9lbmFibGVkKHBNYWMsIHNlc3Npb25faWQpKSB7CisJCS8qIEFsd2F5cyB0aGUgQlNTIGluZm8gaW4gdGhlIGhlYWQgaXMgdGhlIGhhbmRvZmYgY2FuZGlkYXRlICovCisJCWJzc19ub2RlID0KKwkJCWNzcl9uZWlnaGJvcl9yb2FtX25leHRfcm9hbWFibGVfYXAocE1hYywKKwkJCSZuZ2JyX3JvYW1faW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRG9uZUxpc3QsCisJCQlOVUxMKTsKKwkJTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cxLAorCQkJRkwoIk51bWJlciBvZiBIYW5kb2ZmIGNhbmRpZGF0ZXMgPSAlZCIpLAorCQkJY3NyX2xsX2NvdW50KAorCQkJCSZuZ2JyX3JvYW1faW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRG9uZUxpc3QpKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJYnNzX25vZGUgPQorCQkJY3NyX25laWdoYm9yX3JvYW1fbmV4dF9yb2FtYWJsZV9hcChwTWFjLAorCQkJCSZuZ2JyX3JvYW1faW5mby0+cm9hbWFibGVBUExpc3QsCisJCQkJTlVMTCk7CisJCU5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMSwKKwkJCUZMKCJOdW1iZXIgb2YgSGFuZG9mZiBjYW5kaWRhdGVzID0gJWQiKSwKKwkJCWNzcl9sbF9jb3VudCgmbmdicl9yb2FtX2luZm8tPnJvYW1hYmxlQVBMaXN0KSk7CisJfQorCWlmIChOVUxMID09IGJzc19ub2RlKQorCQlyZXR1cm4gZmFsc2U7CisJY2RmX21lbV9jb3B5KGhhbmRfb2ZmX25vZGUsIGJzc19ub2RlLCBzaXplb2YodENzck5laWdoYm9yUm9hbUJTU0luZm8pKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBwcmVhdXRoIGlzIGNvbXBsZXRlZAorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIFxyZXR1cm4gYm9vbAorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworYm9vbCBjc3JfbmVpZ2hib3Jfcm9hbV9zdGF0ZV9wcmVhdXRoX2RvbmUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisJcmV0dXJuIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdLm5laWdoYm9yUm9hbVN0YXRlID09CisJCWVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9QUkVBVVRIX0RPTkU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxicmllZiAgSW4gdGhlIGV2ZW50IHRoYXQgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aCBBUDEgYW5kIHdlIGhhdmUKKyAgICBjb21wbGV0ZWQgcHJlIGF1dGggd2l0aCBBUDIuIFRoZW4gd2UgcmVjZWl2ZSBhIGRlYXV0aC9kaXNhc3NvYyBmcm9tCisgICAgQVAxLgorICAgIEF0IHRoaXMgcG9pbnQgbmVpZ2hib3Igcm9hbSBpcyBpbiBwcmUgYXV0aCBkb25lIHN0YXRlLCBwcmUgYXV0aCB0aW1lcgorICAgIGlzIHJ1bm5pbmcuIFdlIG5vdyBoYW5kbGUgdGhpcyBjYXNlIGJ5IHN0b3BwaW5nIHRpbWVyIGFuZCBjbGVhcmluZworICAgIHRoZSBwcmUtYXV0aCBzdGF0ZS4gV2UgYmFzaWNhbGx5IGNsZWFyIHVwIGFuZCBqdXN0IGdvIHRvIGRpc2Nvbm5lY3RlZAorICAgIHN0YXRlLgorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIFxyZXR1cm4gYm9vbAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyX25laWdoYm9yX3JvYW1fdHJhbmlzdGlvbl9wcmVhdXRoX2RvbmVfdG9fZGlzY29ubmVjdGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkJICAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisJdENzclJvYW1TZXNzaW9uICpzZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwlpZiAoIXNlc3Npb24pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsCisJCQkgIEZMKCJzZXNzaW9uIGlzIE5VTEwiKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlICE9CisJICAgIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9QUkVBVVRIX0RPTkUpCisJCXJldHVybjsKKworCS8qIFN0b3AgdGltZXIgKi8KKwljZGZfbWNfdGltZXJfc3RvcCgmc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnByZUF1dGhSZWFzc29jSW50dmxUaW1lcik7CisKKwkvKiBUcmFuc2l0aW9uIHRvIGluaXQgc3RhdGUgKi8KKwlDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OKHBNYWMsIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9JTklULAorCQkJCQkgICBzZXNzaW9uSWQpCisJcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5JQVBQTmVpZ2hib3JMaXN0UmVjZWl2ZWQgPSBmYWxzZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBTVEEgaXMgaW4gdGhlIG1pZGRsZSBvZiByb2FtaW5nIHN0YXRlcworCisgICAgXHBhcmFtICBoYWxIYW5kbGUgLSBUaGUgaGFuZGxlIGZyb20gSEREIGNvbnRleHQuCisgICAgXHBhcmFtICBzZXNzaW9uSWQgLSBTZXNzaW9uIGlkZW50aWZpZXIKKworICAgIFxyZXR1cm4gYm9vbAorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworYm9vbCBjc3JfbmVpZ2hib3JfbWlkZGxlX29mX3JvYW1pbmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9CisJCSZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKwlib29sIHZhbCA9IChlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVBU1NPQ0lBVElORyA9PQorCQkgICAgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKSB8fAorCQkgICAoZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1BSRUFVVEhFTlRJQ0FUSU5HID09CisJCSAgICBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpIHx8CisJCSAgIChlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUFJFQVVUSF9ET05FID09CisJCSAgICBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpOworCXJldHVybiB2YWw7Cit9CisKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1fY2FuZGlkYXRlX2ZvdW5kX2luZF9oZGxyKCkKKyAqCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQG1zZ19idWY6IHBvaW50ZXIgdG8gbXNnIGJ1ZmYKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBDU1IgYXMgc29vbiBhcyBUTCBwb3N0cyB0aGUgY2FuZGlkYXRlCisgKiBmb3VuZCBpbmRpY2F0aW9uIHRvIFNNRSB2aWEgTUMgdGhyZWFkCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlIG90aGVyd2lzZQorICovCitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX2NhbmRpZGF0ZV9mb3VuZF9pbmRfaGRscih0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnKQoreworCXRTaXJTbWVDYW5kaWRhdGVGb3VuZEluZCAqcFNpclNtZUNhbmRpZGF0ZUZvdW5kSW5kID0KKwkJKHRTaXJTbWVDYW5kaWRhdGVGb3VuZEluZCAqKSBwTXNnOworCXVpbnQzMl90IHNlc3Npb25JZCA9IHBTaXJTbWVDYW5kaWRhdGVGb3VuZEluZC0+c2Vzc2lvbklkOworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlzbXNfbG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBpbmRpY2F0aW9uIGZyb20gZmlybXdhcmUiKSk7CisKKwkvKiB3ZSBtdXN0IGJlIGluIGNvbm5lY3RlZCBzdGF0ZSwgaWYgbm90IGlnbm9yZSBpdCAqLworCWlmICgoZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NPTk5FQ1RFRCAhPQorCSAgICAgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKQorCSAgICB8fCAocE5laWdoYm9yUm9hbUluZm8tPnVPc1JlcXVlc3RlZEhhbmRvZmYpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJSZWNlaXZlZCBpbiBub3QgQ09OTkVDVEVEIHN0YXRlIE9SIHVPc1JlcXVlc3RlZEhhbmRvZmYgaXMgc2V0LiBJZ25vcmUgaXQiKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0gZWxzZSB7CisJCS8qIEZpcm13YXJlIGluZGljYXRlZCB0aGF0IHJvYW1pbmcgY2FuZGlkYXRlIGlzIGZvdW5kLiBCZWFjb25zCisJCSAqIGFyZSBhbHJlYWR5IGluIHRoZSBTTUUgc2NhbiByZXN1bHRzIHRhYmxlLgorCQkgKiBQcm9jZXNzIHRoZSByZXN1bHRzIGZvciBjaG9vc2luZyBiZXN0IHJvYW1pbmcgY2FuZGlkYXRlLgorCQkgKi8KKwkJY3NyX3NhdmVfc2Nhbl9yZXN1bHRzKHBNYWMsIGVDc3JTY2FuQ2FuZGlkYXRlRm91bmQsCisJCQkJICAgICAgc2Vzc2lvbklkKTsKKwkJLyogRnV0dXJlIGVuaGFuY2VtZW50czoKKwkJICogSWYgZmlybXdhcmUgdGFncyBjYW5kaWRhdGUgYmVhY29ucywgZ2l2ZSB0aGVtIHByZWZlcmVuY2UKKwkJICogZm9yIHJvYW1pbmcuCisJCSAqIEFnZSBvdXQgb2xkZXIgZW50cmllcyBzbyB0aGF0IG5ldyBjYW5kaWRhdGUgYmVhY29ucworCQkgKiB3aWxsIGdldCBwcmVmZXJlbmNlLgorCQkgKi8KKwkJc3RhdHVzID0gY3NyX25laWdoYm9yX3JvYW1fcHJvY2Vzc19zY2FuX2NvbXBsZXRlKHBNYWMsCisJCQkJCQkJCSBzZXNzaW9uSWQpOworCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJOZWlnaGJvciBzY2FuIHByb2Nlc3MgY29tcGxldGUgZmFpbGVkIHdpdGggc3RhdHVzICVkIiksCisJCQkJc3RhdHVzKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1fcHJvY2Vzc19oYW5kb2ZmX3JlcSAtIFByb2Nlc3NlcyBoYW5kb2ZmIHJlcXVlc3QKKyAqCisgKiBAbWFjX2N0eCAgUG9pbnRlciB0byBtYWMgY29udGV4dAorICogQHNlc3Npb25faWQgIFNNRSBzZXNzaW9uIGlkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgc3RhcnQgd2l0aCB0aGUgaGFuZG9mZiBwcm9jZXNzLiBGaXJzdCBkbyBhCisgKiBTU0lEIHNjYW4gZm9yIHRoZSBCU1NJRCBwcm92aWRlZC4KKyAqCisgKiBSZXR1cm46IHN0YXR1cworICovCitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX3Byb2Nlc3NfaGFuZG9mZl9yZXEoCisJCQl0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJdWludDhfdCBzZXNzaW9uX2lkKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcm9hbV9jdHJsX2luZm8gPQorCQkmbWFjX2N0eC0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25faWRdOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVpbnQzMl90IHJvYW1faWQ7CisJdENzclJvYW1Qcm9maWxlICpwcm9maWxlID0gTlVMTDsKKwl0Q3NyUm9hbVNlc3Npb24gKnNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJdWludDhfdCBpID0gMDsKKworCWlmIChOVUxMID09IHNlc3Npb24pIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgic2Vzc2lvbiBpcyBOVUxMICIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJvYW1faWQgPSBHRVRfTkVYVF9ST0FNX0lEKCZtYWNfY3R4LT5yb2FtKTsKKwlwcm9maWxlID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JSb2FtUHJvZmlsZSkpOworCWlmIChOVUxMID09IHByb2ZpbGUpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiTWVtb3J5IGFsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJY2RmX21lbV9zZXQocHJvZmlsZSwgc2l6ZW9mKHRDc3JSb2FtUHJvZmlsZSksIDApOworCXN0YXR1cyA9CisJCWNzcl9yb2FtX2NvcHlfcHJvZmlsZShtYWNfY3R4LCBwcm9maWxlLAorCQkJCSAgICAgIHNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJQcm9maWxlIGNvcHkgZmFpbGVkIikpOworCQlnb3RvIGVuZDsKKwl9CisJLyogQWRkIHRoZSBCU1NJRCAmIENoYW5uZWwgKi8KKwlwcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSAxOworCWlmIChOVUxMID09IHByb2ZpbGUtPkJTU0lEcy5ic3NpZCkgeworCQlwcm9maWxlLT5CU1NJRHMuYnNzaWQgPQorCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJNYWNBZGRyKSAqCisJCQkJcHJvZmlsZS0+QlNTSURzLm51bU9mQlNTSURzKTsKKwkJaWYgKE5VTEwgPT0gcHJvZmlsZS0+QlNTSURzLmJzc2lkKSB7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJtZW0gYWxsb2MgZmFpbGVkIGZvciBCU1NJRCIpKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorCisJY2RmX21lbV96ZXJvKHByb2ZpbGUtPkJTU0lEcy5ic3NpZCwKKwkJc2l6ZW9mKHRTaXJNYWNBZGRyKSAqCisJCXByb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEcyk7CisKKwkvKiBQb3B1bGF0ZSB0aGUgQlNTSUQgZnJvbSBoYW5kb2ZmIGluZm8gcmVjZWl2ZWQgZnJvbSBIREQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJvZmlsZS0+QlNTSURzLm51bU9mQlNTSURzOyBpKyspIHsKKwkJY2RmX2NvcHlfbWFjYWRkcigmcHJvZmlsZS0+QlNTSURzLmJzc2lkW2ldLAorCQkJCSZyb2FtX2N0cmxfaW5mby0+aGFuZG9mZlJlcUluZm8uYnNzaWQpOworCX0KKworCXByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAxOworCWlmIChOVUxMID09IHByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSB7CisJCXByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0KKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZigqcHJvZmlsZS0+CisJCQkJQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpICoKKwkJCQlwcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzKTsKKwkJaWYgKE5VTEwgPT0gcHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgibWVtIGFsbG9jIGZhaWxlZCBmb3IgQ2hhbm5lbExpc3QiKSk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKwlwcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXSA9CisJCXJvYW1fY3RybF9pbmZvLT5oYW5kb2ZmUmVxSW5mby5jaGFubmVsOworCisJLyogZG8gYSBTU0lEIHNjYW4gKi8KKwlzdGF0dXMgPQorCQljc3Jfc2Nhbl9mb3Jfc3NpZChtYWNfY3R4LCBzZXNzaW9uX2lkLCBwcm9maWxlLCByb2FtX2lkLCBmYWxzZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJTU0lEIHNjYW4gZmFpbGVkIikpOworCX0KKworZW5kOgorCWlmIChOVUxMICE9IHByb2ZpbGUpIHsKKwkJY3NyX3JlbGVhc2VfcHJvZmlsZShtYWNfY3R4LCBwcm9maWxlKTsKKwkJY2RmX21lbV9mcmVlKHByb2ZpbGUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzcl9uZWlnaGJvcl9yb2FtX3Nzc2lkX3NjYW5fZG9uZQorCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIFNTSUQgc2NhbiBpcyBkb25lLiBJZiBTU0lEIHNjYW4gZmFpbGVkCisgICAgdG8gZmluZCBvdXIgY2FuZGlkYXRlIGFkZCBhbiBlbnRyeSB0byBjc3Igc2NhbiBjYWNoZSBvdXJzZWxmIGJlZm9yZSBzdGFydGluZworICAgIHRoZSBoYW5kb2ZmIHByb2Nlc3MKKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisKKyAgICBccmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBjb3JyZXNwb25kaW5nIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX3Nzc2lkX3NjYW5fZG9uZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLCBDREZfU1RBVFVTIHN0YXR1cykKK3sKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHBOZWlnaGJvclJvYW1JbmZvID0KKwkJJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uSWRdOworCUNERl9TVEFUVVMgaHN0YXR1czsKKworCXNtc19sb2cocE1hYywgTE9HRSwgRkwoImNhbGxlZCAiKSk7CisKKwkvKiB3ZSBtdXN0IGJlIGluIGNvbm5lY3RlZCBzdGF0ZSwgaWYgbm90IGlnbm9yZSBpdCAqLworCWlmIChlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ09OTkVDVEVEICE9CisJICAgIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTCgiUmVjZWl2ZWQgaW4gbm90IENPTk5FQ1RFRCBzdGF0ZS4gSWdub3JlIGl0IikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIGlmIFNTSUQgc2NhbiBmYWlsZWQgdG8gZmluZCBvdXIgY2FuZGlkYXRlIGFkZCBhbiBlbnRyeSB0byBjc3Igc2NhbiBjYWNoZSBvdXJzZWxmICovCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJBZGQgYW4gZW50cnkgdG8gY3NyIHNjYW4gY2FjaGUiKSk7CisJCWhzdGF0dXMgPSBjc3Jfc2Nhbl9jcmVhdGVfZW50cnlfaW5fc2Nhbl9jYWNoZShwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICAgICAgcE5laWdoYm9yUm9hbUluZm8tPgorCQkJCQkJCSAgICAgIGhhbmRvZmZSZXFJbmZvLmJzc2lkLAorCQkJCQkJCSAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT4KKwkJCQkJCQkgICAgICBoYW5kb2ZmUmVxSW5mby5jaGFubmVsKTsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBoc3RhdHVzKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJRkwKKwkJCQkJKCJjc3Jfc2Nhbl9jcmVhdGVfZW50cnlfaW5fc2Nhbl9jYWNoZSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiKSwKKwkJCQloc3RhdHVzKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCX0KKworCS8qIE5vdyB3ZSBoYXZlIGNvbXBsZXRlZCBzY2FubmluZyBmb3IgdGhlIGNhbmRpZGF0ZSBwcm92aWRlZCBieSBIREQuIExldCBtb3ZlIG9uIHRvIEhPICovCisJaHN0YXR1cyA9IGNzcl9uZWlnaGJvcl9yb2FtX3Byb2Nlc3Nfc2Nhbl9jb21wbGV0ZShwTWFjLCBzZXNzaW9uSWQpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBoc3RhdHVzKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMCisJCQkJKCJOZWlnaGJvciBzY2FuIHByb2Nlc3MgY29tcGxldGUgZmFpbGVkIHdpdGggc3RhdHVzICVkIiksCisJCQloc3RhdHVzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKgorICogY3NyX25laWdoYm9yX3JvYW1faGFuZG9mZl9yZXFfaGRsciAtIFByb2Nlc3NlcyBoYW5kb2ZmIHJlcXVlc3QKKyAqIEBtYWNfY3R4ICBQb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKiBAbXNnICBtZXNzYWdlIHNlbnQgdG8gSERECisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ1NSIGFzIHNvb24gYXMgaXQgZ2V0cyBhIGhhbmRvZmYgcmVxdWVzdAorICogdG8gU01FIHZpYSBNQyB0aHJlYWQKKyAqCisgKiBSZXR1cm46IHN0YXR1cworICovCitDREZfU1RBVFVTIGNzcl9uZWlnaGJvcl9yb2FtX2hhbmRvZmZfcmVxX2hkbHIoCisJCQl0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB2b2lkICptc2cpCit7CisJdEFuaUhhbmRvZmZSZXEgKmhhbmRvZmZfcmVxID0gKHRBbmlIYW5kb2ZmUmVxICopIG1zZzsKKwl1aW50MzJfdCBzZXNzaW9uX2lkID0gaGFuZG9mZl9yZXEtPnNlc3Npb25JZDsKKwl0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIHJvYW1fY3RybF9pbmZvID0KKwkJJm1hY19jdHgtPnJvYW0ubmVpZ2hib3JSb2FtSW5mb1tzZXNzaW9uX2lkXTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCS8qIHdlIG11c3QgYmUgaW4gY29ubmVjdGVkIHN0YXRlLCBpZiBub3QgaWdub3JlIGl0ICovCisJaWYgKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DT05ORUNURUQgIT0KKwkJcm9hbV9jdHJsX2luZm8tPm5laWdoYm9yUm9hbVN0YXRlKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJSZWNlaXZlZCBpbiBub3QgQ09OTkVDVEVEIHN0YXRlLiBJZ25vcmUgaXQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwkvKiBzYXZlIHRoZSBoYW5kb2ZmIGluZm8gY2FtZSBmcm9tIEhERCBhcyBwYXJ0IG9mIHRoZSByZWFzc29jIHJlcSAqLworCWhhbmRvZmZfcmVxID0gKHRBbmlIYW5kb2ZmUmVxICopIG1zZzsKKwlpZiAoTlVMTCA9PSBoYW5kb2ZmX3JlcSkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJSZWNlaXZlZCBtc2cgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIHNhbml0eSBjaGVjayAqLworCWlmICh0cnVlID09IGNkZl9tZW1fY29tcGFyZShoYW5kb2ZmX3JlcS0+YnNzaWQsCisJCXJvYW1fY3RybF9pbmZvLT5jdXJyQVBic3NpZC5ieXRlcywKKwkJc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJRkwKKwkJCSgiUmVjZWl2ZWQgcmVxIGhhcyBzYW1lIEJTU0lEIGFzIGN1cnJlbnQgQVAhISIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyb2FtX2N0cmxfaW5mby0+aGFuZG9mZlJlcUluZm8uY2hhbm5lbCA9CisJCWhhbmRvZmZfcmVxLT5jaGFubmVsOworCXJvYW1fY3RybF9pbmZvLT5oYW5kb2ZmUmVxSW5mby5zcmMgPQorCQloYW5kb2ZmX3JlcS0+aGFuZG9mZl9zcmM7CisJY2RmX21lbV9jb3B5KCZyb2FtX2N0cmxfaW5mby0+aGFuZG9mZlJlcUluZm8uYnNzaWQuYnl0ZXMsCisJCQkmaGFuZG9mZl9yZXEtPmJzc2lkLCBDREZfTUFDX0FERFJfU0laRSk7CisJcm9hbV9jdHJsX2luZm8tPnVPc1JlcXVlc3RlZEhhbmRvZmYgPSAxOworCXN0YXR1cyA9IGNzcl9yb2FtX29mZmxvYWRfc2NhbihtYWNfY3R4LCBzZXNzaW9uX2lkLAorCQlST0FNX1NDQU5fT0ZGTE9BRF9TVE9QLAorCQlSRUFTT05fT1NfUkVRVUVTVEVEX1JPQU1JTkdfTk9XKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsCisJCQlGTCgiY3NyX3JvYW1fb2ZmbG9hZF9zY2FuIGZhaWxlZCIpKTsKKwkJcm9hbV9jdHJsX2luZm8tPnVPc1JlcXVlc3RlZEhhbmRvZmYgPSAwOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGNzcl9uZWlnaGJvcl9yb2FtX3Byb2NlZWRfd2l0aF9oYW5kb2ZmX3JlcSgpCisgKgorICogQG1hY19jdHg6IFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBzZXNzaW9uX2lkOiBTZXNzaW9uIElECisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ1NSIGFzIHNvb24gYXMgaXQgZ2V0cyByc3AgYmFjayBmb3IKKyAqIFJPQU1fU0NBTl9PRkZMT0FEX1NUT1Agd2l0aCByZWFzb24gUkVBU09OX09TX1JFUVVFU1RFRF9ST0FNSU5HX05PVworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqLworQ0RGX1NUQVRVUyBjc3JfbmVpZ2hib3Jfcm9hbV9wcm9jZWVkX3dpdGhfaGFuZG9mZl9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPQorCQkmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvW3Nlc3Npb25JZF07CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJLyogd2UgbXVzdCBiZSBpbiBjb25uZWN0ZWQgc3RhdGUsIGlmIG5vdCBpZ25vcmUgaXQgKi8KKwlpZiAoKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DT05ORUNURUQgIT0KKwkgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkKKwkgICAgfHwgKCFwTmVpZ2hib3JSb2FtSW5mby0+dU9zUmVxdWVzdGVkSGFuZG9mZikpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwKKwkJCQkoIlJlY2VpdmVkIGluIG5vdCBDT05ORUNURUQgc3RhdGUgb3IgdU9zUmVxdWVzdGVkSGFuZG9mZiBpcyBub3Qgc2V0LiBJZ25vcmUgaXQiKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0gZWxzZSB7CisJCS8qIExldCdzIGdvIGFoZWFkIHdpdGggaGFuZG9mZiAqLworCQlzdGF0dXMgPSBjc3JfbmVpZ2hib3Jfcm9hbV9wcm9jZXNzX2hhbmRvZmZfcmVxKHBNYWMsIHNlc3Npb25JZCk7CisJfQorCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJcE5laWdoYm9yUm9hbUluZm8tPnVPc1JlcXVlc3RlZEhhbmRvZmYgPSAwOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JfbmVpZ2hib3Jfcm9hbV9zdGFydF9sZnJfc2NhbgorCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiBIREQgcmVxdWVzdGVkIGhhbmRvZmYgZmFpbGVkIGZvciBzb21lCisgICAgcmVhc29uLiBzdGFydCB0aGUgTEZSIGxvZ2ljIGF0IHRoYXQgcG9pbnQuQnkgdGhlIHRpbWUsIHRoaXMgZnVuY3Rpb24gaXMKKyAgICBjYWxsZWQsIGEgU1RPUCBjb21tYW5kIGhhcyBhbHJlYWR5IGJlZW4gaXNzdWVkLgorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIFxyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZSBvdGhlcndpc2UKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgY3NyX25laWdoYm9yX3JvYW1fc3RhcnRfbGZyX3NjYW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9CisJCSZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm9bc2Vzc2lvbklkXTsKKwlwTmVpZ2hib3JSb2FtSW5mby0+dU9zUmVxdWVzdGVkSGFuZG9mZiA9IDA7CisJLyogVGhlcmUgaXMgbm8gY2FuZGlkYXRlIG9yIFdlIGFyZSBub3Qgcm9hbWluZyBOb3cuCisJICogSW5mb3JtIHRoZSBGVyB0byByZXN0YXJ0IFJvYW0gT2ZmbG9hZCBTY2FuICAqLworCWNzcl9yb2FtX29mZmxvYWRfc2NhbihwTWFjLCBzZXNzaW9uSWQsIFJPQU1fU0NBTl9PRkZMT0FEX1NUQVJULAorCQkJICAgICAgUkVBU09OX05PX0NBTkRfRk9VTkRfT1JfTk9UX1JPQU1JTkdfTk9XKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc21lL3NyYy9jc3IvY3NyX3RkbHNfcHJvY2Vzcy5jIGIvY29yZS9zbWUvc3JjL2Nzci9jc3JfdGRsc19wcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmYWRjZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL3NyYy9jc3IvY3NyX3RkbHNfcHJvY2Vzcy5jCkBAIC0wLDAgKzEsODIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisKKyAgICBcZmlsZSBjc3JfdGRsc19wcm9jZXNzLmMKKworICAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgVERMUyBpbnRlcmZhY2UgdG8gUEUuCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKworI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIgICAgICAgICAgLyogZm9yIHRwQW5pU2lyR2xvYmFsICovCisjaW5jbHVkZSAiY2RzX21xLmgiCisjaW5jbHVkZSAiY3NyX2luc2lkZV9hcGkuaCIKKyNpbmNsdWRlICJzbWVfaW5zaWRlLmgiCisjaW5jbHVkZSAic21zX2RlYnVnLmgiCisKKyNpbmNsdWRlICJjc3Jfc3VwcG9ydC5oIgorCisjaW5jbHVkZSAiaG9zdF9kaWFnX2NvcmVfbG9nLmgiCisjaW5jbHVkZSAiaG9zdF9kaWFnX2NvcmVfZXZlbnQuaCIKKyNpbmNsdWRlICJjc3JfaW50ZXJuYWwuaCIKKworLyoKKyAqIGNvbW1vbiByb3V0aW5lIHRvIHJlbW92ZSBURExTIGNtZCBmcm9tIFNNRSBjb21tYW5kIGxpc3QuLgorICogY29tbWFuZHMgYXJlIHJlbW92ZWQgYWZ0ZXIgZ2V0dGluZyByZXBvbnNlIGZyb20gUEUuCisgKi8KK0NERl9TVEFUVVMgY3NyX3RkbHNfcmVtb3ZlX3NtZV9jbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgZVNtZUNvbW1hbmRUeXBlIGNtZFR5cGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwl0U21lQ21kICpwQ29tbWFuZDsKKworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKHBFbnRyeSkgeworCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJaWYgKGNtZFR5cGUgPT0gcENvbW1hbmQtPmNvbW1hbmQpIHsKKwkJCWlmIChjc3JfbGxfcmVtb3ZlX2VudHJ5KCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwKKwkJCQkJCXBFbnRyeSwgTExfQUNDRVNTX0xPQ0spKSB7CisJCQkJY2RmX21lbV96ZXJvKCZwQ29tbWFuZC0+dS50ZGxzQ21kLAorCQkJCQkgICAgIHNpemVvZih0VGRsc0NtZCkpOworCQkJCWNzcl9yZWxlYXNlX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworCQkJCXNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUocE1hYyk7CisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJfQorCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogY3NyX3RkbHNfc2VuZF9tZ210X3JlcSgpIC0gdG8gc2VuZCBhIFRETFMgZnJhbWUgdG8gUEUgdGhyb3VnaCBTTUUKKyAqIEBoSGFsOiBIQUwgY29udGV4dAorICogQHNlc3Npb25JZDogU01FIHNlc3Npb24gaWQKKyAqIEB0ZGxzU2VuZE1nbXQ6IHRkbHMgbWdtdCBwb2ludGVyCisgKgorICogVERMUyByZXF1ZXN0IEFQSSwgY2FsbGVkIGZyb20gSEREIHRvIHNlbmQgYSBURExTIGZyYW1lIGluIFNNRS9DU1IgYW5kCisgKiBzZW5kIG1lc3NhZ2UgdG8gUEUgdG8gdHJpZ2dlciBURExTIGRpc2NvdmVyeSBwcm9jZWR1cmUuCisgKi8KK0NERl9TVEFUVVMgY3NyX3RkbHNfc2VuZF9tZ210X3JlcSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSAgdENzclRkbHNTZW5kTWdtdCAqdGRsc1NlbmRNZ210KQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0U21lQ21kICp0ZGxzU2VuZE1nbXRDbWQ7CisJdFRkbHNTZW5kTWdtdENtZEluZm8gKnRkbHNTZW5kTWdtdENtZEluZm87CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCS8qIElmIGNvbm5lY3RlZCBhbmQgaW4gSW5mcmEuIE9ubHkgdGhlbiBhbGxvdyB0aGlzICovCisJaWYgKCFDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpIHx8CisJCQkhY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2luZnJhKHBNYWMsIHNlc3Npb25JZCkgfHwKKwkJCShOVUxMID09IHRkbHNTZW5kTWdtdCkpCisJCXJldHVybiBzdGF0dXM7CisJdGRsc1NlbmRNZ210Q21kID0gY3NyX2dldF9jb21tYW5kX2J1ZmZlcihwTWFjKTsKKwlpZiAoIXRkbHNTZW5kTWdtdENtZCkKKwkJcmV0dXJuIHN0YXR1czsKKwl0ZGxzU2VuZE1nbXRDbWRJbmZvID0gJnRkbHNTZW5kTWdtdENtZC0+dS50ZGxzQ21kLnUudGRsc1NlbmRNZ210Q21kSW5mbzsKKwl0ZGxzU2VuZE1nbXRDbWQtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwl0ZGxzU2VuZE1nbXRDbWRJbmZvLT5mcmFtZVR5cGUgPSB0ZGxzU2VuZE1nbXQtPmZyYW1lVHlwZTsKKwl0ZGxzU2VuZE1nbXRDbWRJbmZvLT5kaWFsb2cgPSB0ZGxzU2VuZE1nbXQtPmRpYWxvZzsKKwl0ZGxzU2VuZE1nbXRDbWRJbmZvLT5zdGF0dXNDb2RlID0gdGRsc1NlbmRNZ210LT5zdGF0dXNDb2RlOworCXRkbHNTZW5kTWdtdENtZEluZm8tPnJlc3BvbmRlciA9IHRkbHNTZW5kTWdtdC0+cmVzcG9uZGVyOworCXRkbHNTZW5kTWdtdENtZEluZm8tPnBlZXJDYXBhYmlsaXR5ID0gdGRsc1NlbmRNZ210LT5wZWVyQ2FwYWJpbGl0eTsKKwljZGZfbWVtX2NvcHkodGRsc1NlbmRNZ210Q21kSW5mby0+cGVlck1hYywgdGRsc1NlbmRNZ210LT5wZWVyTWFjLAorCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlpZiAoKDAgIT0gdGRsc1NlbmRNZ210LT5sZW4pICYmIChOVUxMICE9IHRkbHNTZW5kTWdtdC0+YnVmKSkgeworCQl0ZGxzU2VuZE1nbXRDbWRJbmZvLT5idWYgPSBjZGZfbWVtX21hbGxvYyh0ZGxzU2VuZE1nbXQtPmxlbik7CisJCWlmIChOVUxMID09IHRkbHNTZW5kTWdtdENtZEluZm8tPmJ1ZikgeworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiQWxsb2MgRmFpbGVkIikpOworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJY2RmX21lbV9jb3B5KHRkbHNTZW5kTWdtdENtZEluZm8tPmJ1ZiwgdGRsc1NlbmRNZ210LT5idWYsCisJCQkJdGRsc1NlbmRNZ210LT5sZW4pOworCQl0ZGxzU2VuZE1nbXRDbWRJbmZvLT5sZW4gPSB0ZGxzU2VuZE1nbXQtPmxlbjsKKwl9IGVsc2UgeworCQl0ZGxzU2VuZE1nbXRDbWRJbmZvLT5idWYgPSBOVUxMOworCQl0ZGxzU2VuZE1nbXRDbWRJbmZvLT5sZW4gPSAwOworCX0KKworCXRkbHNTZW5kTWdtdENtZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kVGRsc1NlbmRNZ210OworCXRkbHNTZW5kTWdtdENtZC0+dS50ZGxzQ21kLnNpemUgPSBzaXplb2YodFRkbHNTZW5kTWdtdENtZEluZm8pOworCXNtZV9wdXNoX2NvbW1hbmQocE1hYywgdGRsc1NlbmRNZ210Q21kLCBmYWxzZSk7CisJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBURExTIHJlcXVlc3QgQVBJLCBjYWxsZWQgZnJvbSBIREQgdG8gYWRkIGEgVERMUyBwZWVyCisgKi8KK0NERl9TVEFUVVMgY3NyX3RkbHNfY2hhbmdlX3BlZXJfc3RhKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJICAgIGNvbnN0IHRTaXJNYWNBZGRyIHBlZXJNYWMsCisJCQkJICAgIHRDc3JTdGFQYXJhbXMgKnBzdGFQYXJhbXMpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRTbWVDbWQgKnRkbHNBZGRTdGFDbWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCS8qIElmIGNvbm5lY3RlZCBhbmQgaW4gSW5mcmEuIE9ubHkgdGhlbiBhbGxvdyB0aGlzICovCisJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkgJiYKKwkgICAgY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2luZnJhKHBNYWMsIHNlc3Npb25JZCkgJiYKKwkgICAgKE5VTEwgIT0gcGVlck1hYykgJiYgKE5VTEwgIT0gcHN0YVBhcmFtcykpIHsKKworCQl0ZGxzQWRkU3RhQ21kID0gY3NyX2dldF9jb21tYW5kX2J1ZmZlcihwTWFjKTsKKworCQlpZiAodGRsc0FkZFN0YUNtZCkgeworCQkJdFRkbHNBZGRTdGFDbWRJbmZvICp0ZGxzQWRkU3RhQ21kSW5mbyA9CisJCQkJJnRkbHNBZGRTdGFDbWQtPnUudGRsc0NtZC51LnRkbHNBZGRTdGFDbWRJbmZvOworCisJCQl0ZGxzQWRkU3RhQ21kSW5mby0+dGRsc0FkZE9wZXIgPSBURExTX09QRVJfVVBEQVRFOworCisJCQl0ZGxzQWRkU3RhQ21kLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKwkJCWNkZl9tZW1fY29weSh0ZGxzQWRkU3RhQ21kSW5mby0+cGVlck1hYywKKwkJCQkgICAgIHBlZXJNYWMsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkJdGRsc0FkZFN0YUNtZEluZm8tPmNhcGFiaWxpdHkgPSBwc3RhUGFyYW1zLT5jYXBhYmlsaXR5OworCQkJdGRsc0FkZFN0YUNtZEluZm8tPnVhcHNkUXVldWVzID0KKwkJCQlwc3RhUGFyYW1zLT51YXBzZF9xdWV1ZXM7CisJCQl0ZGxzQWRkU3RhQ21kSW5mby0+bWF4U3AgPSBwc3RhUGFyYW1zLT5tYXhfc3A7CisJCQljZGZfbWVtX2NvcHkodGRsc0FkZFN0YUNtZEluZm8tPmV4dG5DYXBhYmlsaXR5LAorCQkJCSAgICAgcHN0YVBhcmFtcy0+ZXh0bl9jYXBhYmlsaXR5LAorCQkJCSAgICAgc2l6ZW9mKHBzdGFQYXJhbXMtPmV4dG5fY2FwYWJpbGl0eSkpOworCisJCQl0ZGxzQWRkU3RhQ21kSW5mby0+aHRjYXBfcHJlc2VudCA9CisJCQkJcHN0YVBhcmFtcy0+aHRjYXBfcHJlc2VudDsKKwkJCWlmIChwc3RhUGFyYW1zLT5odGNhcF9wcmVzZW50KQorCQkJCWNkZl9tZW1fY29weSgmdGRsc0FkZFN0YUNtZEluZm8tPkhUQ2FwLAorCQkJCQkgICAgICZwc3RhUGFyYW1zLT5IVENhcCwKKwkJCQkJICAgICBzaXplb2YocHN0YVBhcmFtcy0+SFRDYXApKTsKKwkJCWVsc2UKKwkJCQljZGZfbWVtX3NldCgmdGRsc0FkZFN0YUNtZEluZm8tPkhUQ2FwLAorCQkJCQkgICAgc2l6ZW9mKHBzdGFQYXJhbXMtPkhUQ2FwKSwgMCk7CisKKwkJCXRkbHNBZGRTdGFDbWRJbmZvLT52aHRjYXBfcHJlc2VudCA9CisJCQkJcHN0YVBhcmFtcy0+dmh0Y2FwX3ByZXNlbnQ7CisJCQlpZiAocHN0YVBhcmFtcy0+dmh0Y2FwX3ByZXNlbnQpCisJCQkJY2RmX21lbV9jb3B5KCZ0ZGxzQWRkU3RhQ21kSW5mby0+VkhUQ2FwLAorCQkJCQkgICAgICZwc3RhUGFyYW1zLT5WSFRDYXAsCisJCQkJCSAgICAgc2l6ZW9mKHBzdGFQYXJhbXMtPlZIVENhcCkpOworCQkJZWxzZQorCQkJCWNkZl9tZW1fc2V0KCZ0ZGxzQWRkU3RhQ21kSW5mby0+VkhUQ2FwLAorCQkJCQkgICAgc2l6ZW9mKHBzdGFQYXJhbXMtPlZIVENhcCksIDApOworCisJCQl0ZGxzQWRkU3RhQ21kSW5mby0+c3VwcG9ydGVkUmF0ZXNMZW4gPQorCQkJCXBzdGFQYXJhbXMtPnN1cHBvcnRlZF9yYXRlc19sZW47CisKKwkJCWlmICgwICE9IHBzdGFQYXJhbXMtPnN1cHBvcnRlZF9yYXRlc19sZW4pCisJCQkJY2RmX21lbV9jb3B5KCZ0ZGxzQWRkU3RhQ21kSW5mby0+c3VwcG9ydGVkUmF0ZXMsCisJCQkJCSAgICAgcHN0YVBhcmFtcy0+c3VwcG9ydGVkX3JhdGVzLAorCQkJCQkgICAgIHBzdGFQYXJhbXMtPnN1cHBvcnRlZF9yYXRlc19sZW4pOworCisJCQl0ZGxzQWRkU3RhQ21kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRUZGxzQWRkUGVlcjsKKwkJCXRkbHNBZGRTdGFDbWQtPnUudGRsc0NtZC5zaXplID0KKwkJCQlzaXplb2YodFRkbHNBZGRTdGFDbWRJbmZvKTsKKwkJCXNtZV9wdXNoX2NvbW1hbmQocE1hYywgdGRsc0FkZFN0YUNtZCwgZmFsc2UpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFRETFMgcmVxdWVzdCBBUEksIGNhbGxlZCBmcm9tIEhERCB0byBTZW5kIExpbmsgRXN0YWJsaXNobWVudCBQYXJhbWV0ZXJzCisgKi8KK0NERl9TVEFUVVMgY3NyX3RkbHNfc2VuZF9saW5rX2VzdGFibGlzaF9wYXJhbXModEhhbEhhbmRsZSBoSGFsLAorCQkJCQkgICAgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgICBjb25zdCB0U2lyTWFjQWRkciBwZWVyTWFjLAorCQkJCQkgICAgICAgdENzclRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zICoKKwkJCQkJICAgICAgIHRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0U21lQ21kICp0ZGxzTGlua0VzdGFibGlzaENtZDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCS8qIElmIGNvbm5lY3RlZCBhbmQgaW4gSW5mcmEuIE9ubHkgdGhlbiBhbGxvdyB0aGlzICovCisJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkgJiYKKwkgICAgY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2luZnJhKHBNYWMsIHNlc3Npb25JZCkgJiYKKwkgICAgKE5VTEwgIT0gcGVlck1hYykpIHsKKwkJdGRsc0xpbmtFc3RhYmxpc2hDbWQgPSBjc3JfZ2V0X2NvbW1hbmRfYnVmZmVyKHBNYWMpOworCisJCWlmICh0ZGxzTGlua0VzdGFibGlzaENtZCkgeworCQkJdFRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mbyAqdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvID0KKwkJCQkmdGRsc0xpbmtFc3RhYmxpc2hDbWQtPnUudGRsc0NtZC51LgorCQkJCXRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mbzsKKworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWQtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworCQkJY2RmX21lbV9jb3B5KHRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mby0+cGVlck1hYywKKwkJCQkgICAgIHBlZXJNYWMsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT5pc0J1ZlN0YSA9CisJCQkJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPmlzQnVmU3RhOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT5pc1Jlc3BvbmRlciA9CisJCQkJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPmlzUmVzcG9uZGVyOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT5tYXhTcCA9CisJCQkJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPm1heFNwOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT51YXBzZFF1ZXVlcyA9CisJCQkJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPnVhcHNkUXVldWVzOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT5pc09mZkNoYW5uZWxTdXBwb3J0ZWQgPQorCQkJCXRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zLT5pc09mZkNoYW5uZWxTdXBwb3J0ZWQ7CisJCQljZGZfbWVtX2NvcHkodGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT4KKwkJCQkgICAgIHN1cHBvcnRlZENoYW5uZWxzLAorCQkJCSAgICAgdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPnN1cHBvcnRlZENoYW5uZWxzLAorCQkJCSAgICAgdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPgorCQkJCSAgICAgc3VwcG9ydGVkQ2hhbm5lbHNMZW4pOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT5zdXBwb3J0ZWRDaGFubmVsc0xlbiA9CisJCQkJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPnN1cHBvcnRlZENoYW5uZWxzTGVuOworCQkJY2RmX21lbV9jb3B5KHRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mby0+CisJCQkJICAgICBzdXBwb3J0ZWRPcGVyQ2xhc3NlcywKKwkJCQkgICAgIHRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zLT4KKwkJCQkgICAgIHN1cHBvcnRlZE9wZXJDbGFzc2VzLAorCQkJCSAgICAgdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPgorCQkJCSAgICAgc3VwcG9ydGVkT3BlckNsYXNzZXNMZW4pOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT5zdXBwb3J0ZWRPcGVyQ2xhc3Nlc0xlbiA9CisJCQkJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPnN1cHBvcnRlZE9wZXJDbGFzc2VzTGVuOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT5pc1Jlc3BvbmRlciA9CisJCQkJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPmlzUmVzcG9uZGVyOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT5tYXhTcCA9CisJCQkJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPm1heFNwOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT51YXBzZFF1ZXVlcyA9CisJCQkJdGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMtPnVhcHNkUXVldWVzOworCQkJdGRsc0xpbmtFc3RhYmxpc2hDbWQtPmNvbW1hbmQgPQorCQkJCWVTbWVDb21tYW5kVGRsc0xpbmtFc3RhYmxpc2g7CisJCQl0ZGxzTGlua0VzdGFibGlzaENtZC0+dS50ZGxzQ21kLnNpemUgPQorCQkJCXNpemVvZih0VGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvKTsKKwkJCXNtZV9wdXNoX2NvbW1hbmQocE1hYywgdGRsc0xpbmtFc3RhYmxpc2hDbWQsIGZhbHNlKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBURExTIHJlcXVlc3QgQVBJLCBjYWxsZWQgZnJvbSBIREQgdG8gYWRkIGEgVERMUyBwZWVyCisgKi8KK0NERl9TVEFUVVMgY3NyX3RkbHNfYWRkX3BlZXJfc3RhKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJIGNvbnN0IHRTaXJNYWNBZGRyIHBlZXJNYWMpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRTbWVDbWQgKnRkbHNBZGRTdGFDbWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCS8qIElmIGNvbm5lY3RlZCBhbmQgaW4gSW5mcmEuIE9ubHkgdGhlbiBhbGxvdyB0aGlzICovCisJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkgJiYKKwkgICAgY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2luZnJhKHBNYWMsIHNlc3Npb25JZCkgJiYKKwkgICAgKE5VTEwgIT0gcGVlck1hYykpIHsKKwkJdGRsc0FkZFN0YUNtZCA9IGNzcl9nZXRfY29tbWFuZF9idWZmZXIocE1hYyk7CisKKwkJaWYgKHRkbHNBZGRTdGFDbWQpIHsKKwkJCXRUZGxzQWRkU3RhQ21kSW5mbyAqdGRsc0FkZFN0YUNtZEluZm8gPQorCQkJCSZ0ZGxzQWRkU3RhQ21kLT51LnRkbHNDbWQudS50ZGxzQWRkU3RhQ21kSW5mbzsKKworCQkJdGRsc0FkZFN0YUNtZC0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCQkJdGRsc0FkZFN0YUNtZEluZm8tPnRkbHNBZGRPcGVyID0gVERMU19PUEVSX0FERDsKKworCQkJY2RmX21lbV9jb3B5KHRkbHNBZGRTdGFDbWRJbmZvLT5wZWVyTWFjLAorCQkJCSAgICAgcGVlck1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkJCXRkbHNBZGRTdGFDbWQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFRkbHNBZGRQZWVyOworCQkJdGRsc0FkZFN0YUNtZC0+dS50ZGxzQ21kLnNpemUgPQorCQkJCXNpemVvZih0VGRsc0FkZFN0YUNtZEluZm8pOworCQkJc21lX3B1c2hfY29tbWFuZChwTWFjLCB0ZGxzQWRkU3RhQ21kLCBmYWxzZSk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogVERMUyByZXF1ZXN0IEFQSSwgY2FsbGVkIGZyb20gSEREIHRvIGRlbGV0ZSBhIFRETFMgcGVlcgorICovCitDREZfU1RBVFVTIGNzcl90ZGxzX2RlbF9wZWVyX3N0YSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSBjb25zdCB0U2lyTWFjQWRkciBwZWVyTWFjKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0U21lQ21kICp0ZGxzRGVsU3RhQ21kOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwkvKiBJZiBjb25uZWN0ZWQgYW5kIGluIEluZnJhLiBPbmx5IHRoZW4gYWxsb3cgdGhpcyAqLworCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpICYmCisJICAgIGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYShwTWFjLCBzZXNzaW9uSWQpICYmCisJICAgIChOVUxMICE9IHBlZXJNYWMpKSB7CisJCXRkbHNEZWxTdGFDbWQgPSBjc3JfZ2V0X2NvbW1hbmRfYnVmZmVyKHBNYWMpOworCisJCWlmICh0ZGxzRGVsU3RhQ21kKSB7CisJCQl0VGRsc0RlbFN0YUNtZEluZm8gKnRkbHNEZWxTdGFDbWRJbmZvID0KKwkJCQkmdGRsc0RlbFN0YUNtZC0+dS50ZGxzQ21kLnUudGRsc0RlbFN0YUNtZEluZm87CisKKwkJCXRkbHNEZWxTdGFDbWQtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworCQkJY2RmX21lbV9jb3B5KHRkbHNEZWxTdGFDbWRJbmZvLT5wZWVyTWFjLAorCQkJCSAgICAgcGVlck1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkJCXRkbHNEZWxTdGFDbWQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFRkbHNEZWxQZWVyOworCQkJdGRsc0RlbFN0YUNtZC0+dS50ZGxzQ21kLnNpemUgPQorCQkJCXNpemVvZih0VGRsc0RlbFN0YUNtZEluZm8pOworCQkJc21lX3B1c2hfY29tbWFuZChwTWFjLCB0ZGxzRGVsU3RhQ21kLCBmYWxzZSk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogVERMUyBtZXNzYWdlcyBzZW50IHRvIFBFIC4KKyAqLworQ0RGX1NUQVRVUyB0ZGxzX3NlbmRfbWVzc2FnZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MTZfdCBtc2dfdHlwZSwKKwkJCSAgICAgdm9pZCAqbXNnX2RhdGEsIHVpbnQzMl90IG1zZ19zaXplKQoreworCisJdFNpck1iTXNnICpwTXNnID0gKHRTaXJNYk1zZyAqKSBtc2dfZGF0YTsKKwlwTXNnLT50eXBlID0gbXNnX3R5cGU7CisJcE1zZy0+bXNnTGVuID0gKHVpbnQxNl90KSAobXNnX3NpemUpOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAoInNlbmRpbmcgbXNnID0gJWQiKSwgcE1zZy0+dHlwZSk7CisJLyogU2VuZCBtZXNzYWdlLiAqLworCWlmIChjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKSAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IHNlbmQgbWVzc2FnZSIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY3NyX3RkbHNfcHJvY2Vzc19zZW5kX21nbXQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqY21kKQoreworCXRUZGxzU2VuZE1nbXRDbWRJbmZvICp0ZGxzU2VuZE1nbXRDbWRJbmZvID0KKwkJJmNtZC0+dS50ZGxzQ21kLnUudGRsc1NlbmRNZ210Q21kSW5mbzsKKwl0U2lyVGRsc1NlbmRNZ210UmVxICp0ZGxzU2VuZE1nbXRSZXEgPSBOVUxMOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgY21kLT5zZXNzaW9uSWQpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJwU2Vzc2lvbiBpcyBOVUxMIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmIChOVUxMID09IHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiQlNTIERlc2NyaXB0aW9uIGlzIG5vdCBwcmVzZW50IikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJdGRsc1NlbmRNZ210UmVxID0KKwkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJUZGxzU2VuZE1nbXRSZXEpICsKKwkJCSAgICAgICB0ZGxzU2VuZE1nbXRDbWRJbmZvLT5sZW4pOworCWlmIChOVUxMID09IHRkbHNTZW5kTWdtdFJlcSkKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCWVsc2UKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJhbGxvYyBmYWlsZWQiKSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXRkbHNTZW5kTWdtdFJlcS0+c2Vzc2lvbklkID0gY21kLT5zZXNzaW9uSWQ7CisJLyogVXNpbmcgZGlhbG9nIGFzIHRyYW5zYWN0aW9uSWQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggcmVzcG9uc2Ugd2l0aCByZXF1ZXN0ICovCisJdGRsc1NlbmRNZ210UmVxLT50cmFuc2FjdGlvbklkID0gdGRsc1NlbmRNZ210Q21kSW5mby0+ZGlhbG9nOworCXRkbHNTZW5kTWdtdFJlcS0+cmVxVHlwZSA9IHRkbHNTZW5kTWdtdENtZEluZm8tPmZyYW1lVHlwZTsKKwl0ZGxzU2VuZE1nbXRSZXEtPmRpYWxvZyA9IHRkbHNTZW5kTWdtdENtZEluZm8tPmRpYWxvZzsKKwl0ZGxzU2VuZE1nbXRSZXEtPnN0YXR1c0NvZGUgPSB0ZGxzU2VuZE1nbXRDbWRJbmZvLT5zdGF0dXNDb2RlOworCXRkbHNTZW5kTWdtdFJlcS0+cmVzcG9uZGVyID0gdGRsc1NlbmRNZ210Q21kSW5mby0+cmVzcG9uZGVyOworCXRkbHNTZW5kTWdtdFJlcS0+cGVlckNhcGFiaWxpdHkgPSB0ZGxzU2VuZE1nbXRDbWRJbmZvLT5wZWVyQ2FwYWJpbGl0eTsKKworCWNkZl9tZW1fY29weSh0ZGxzU2VuZE1nbXRSZXEtPmJzc2lkLAorCQkgICAgIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MtPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWNkZl9tZW1fY29weSh0ZGxzU2VuZE1nbXRSZXEtPnBlZXJNYWMsCisJCSAgICAgdGRsc1NlbmRNZ210Q21kSW5mby0+cGVlck1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwlpZiAodGRsc1NlbmRNZ210Q21kSW5mby0+bGVuICYmIHRkbHNTZW5kTWdtdENtZEluZm8tPmJ1ZikgeworCQljZGZfbWVtX2NvcHkodGRsc1NlbmRNZ210UmVxLT5hZGRJZSwgdGRsc1NlbmRNZ210Q21kSW5mby0+YnVmLAorCQkJICAgICB0ZGxzU2VuZE1nbXRDbWRJbmZvLT5sZW4pOworCisJfQorCS8qIFNlbmQgdGhlIHJlcXVlc3QgdG8gUEUuICovCisJc21zX2xvZyhwTWFjLCBMT0cxLCAic2VuZGluZyBURExTIE1nbXQgRnJhbWUgcmVxIHRvIFBFICIpOworCXN0YXR1cyA9IHRkbHNfc2VuZF9tZXNzYWdlKHBNYWMsIGVXTklfU01FX1RETFNfU0VORF9NR01UX1JFUSwKKwkJCQkgICAodm9pZCAqKXRkbHNTZW5kTWdtdFJlcSwKKwkJCQkgICBzaXplb2YodFNpclRkbHNTZW5kTWdtdFJlcSkgKworCQkJCSAgIHRkbHNTZW5kTWdtdENtZEluZm8tPmxlbik7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gc2VuZCByZXF1ZXN0IHRvIE1BQyIpKTsKKwl9CisJaWYgKHRkbHNTZW5kTWdtdENtZEluZm8tPmxlbiAmJiB0ZGxzU2VuZE1nbXRDbWRJbmZvLT5idWYpIHsKKwkJLyogRG9uZSB3aXRoIHRoZSBidWYuIEZyZWUgaXQuICovCisJCWNkZl9tZW1fZnJlZSh0ZGxzU2VuZE1nbXRDbWRJbmZvLT5idWYpOworCQl0ZGxzU2VuZE1nbXRDbWRJbmZvLT5idWYgPSBOVUxMOworCQl0ZGxzU2VuZE1nbXRDbWRJbmZvLT5sZW4gPSAwOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3RkbHNfcHJvY2Vzc19hZGRfc3RhKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKmNtZCkKK3sKKwl0VGRsc0FkZFN0YUNtZEluZm8gKnRkbHNBZGRTdGFDbWRJbmZvID0KKwkJJmNtZC0+dS50ZGxzQ21kLnUudGRsc0FkZFN0YUNtZEluZm87CisJdFNpclRkbHNBZGRTdGFSZXEgKnRkbHNBZGRTdGFSZXEgPSBOVUxMOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgY21kLT5zZXNzaW9uSWQpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJwU2Vzc2lvbiBpcyBOVUxMIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKE5VTEwgPT0gcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYykgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJCU1MgZGVzY3JpcHRpb24gaXMgbm90IHByZXNlbnQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwl0ZGxzQWRkU3RhUmVxID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJUZGxzQWRkU3RhUmVxKSk7CisJaWYgKE5VTEwgPT0gdGRsc0FkZFN0YVJlcSkKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCWVsc2UKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJhbGxvYyBmYWlsZWQiKSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXRkbHNBZGRTdGFSZXEtPnNlc3Npb25JZCA9IGNtZC0+c2Vzc2lvbklkOworCXRkbHNBZGRTdGFSZXEtPnRkbHNBZGRPcGVyID0gdGRsc0FkZFN0YUNtZEluZm8tPnRkbHNBZGRPcGVyOworCS8qIFVzaW5nIGRpYWxvZyBhcyB0cmFuc2FjdGlvbklkLiBUaGlzIGNhbiBiZSB1c2VkIHRvIG1hdGNoIHJlc3BvbnNlIHdpdGggcmVxdWVzdCAqLworCXRkbHNBZGRTdGFSZXEtPnRyYW5zYWN0aW9uSWQgPSAwOworCisJY2RmX21lbV9jb3B5KHRkbHNBZGRTdGFSZXEtPmJzc2lkLAorCQkgICAgIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MtPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCWNkZl9tZW1fY29weSh0ZGxzQWRkU3RhUmVxLT5wZWVyTWFjLAorCQkgICAgIHRkbHNBZGRTdGFDbWRJbmZvLT5wZWVyTWFjLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCXRkbHNBZGRTdGFSZXEtPmNhcGFiaWxpdHkgPSB0ZGxzQWRkU3RhQ21kSW5mby0+Y2FwYWJpbGl0eTsKKwl0ZGxzQWRkU3RhUmVxLT51YXBzZF9xdWV1ZXMgPSB0ZGxzQWRkU3RhQ21kSW5mby0+dWFwc2RRdWV1ZXM7CisJdGRsc0FkZFN0YVJlcS0+bWF4X3NwID0gdGRsc0FkZFN0YUNtZEluZm8tPm1heFNwOworCisJY2RmX21lbV9jb3B5KHRkbHNBZGRTdGFSZXEtPmV4dG5fY2FwYWJpbGl0eSwKKwkJICAgICB0ZGxzQWRkU3RhQ21kSW5mby0+ZXh0bkNhcGFiaWxpdHksIFNJUl9NQUNfTUFYX0VYVE5fQ0FQKTsKKwl0ZGxzQWRkU3RhUmVxLT5odGNhcF9wcmVzZW50ID0gdGRsc0FkZFN0YUNtZEluZm8tPmh0Y2FwX3ByZXNlbnQ7CisJY2RmX21lbV9jb3B5KCZ0ZGxzQWRkU3RhUmVxLT5odENhcCwKKwkJICAgICAmdGRsc0FkZFN0YUNtZEluZm8tPkhUQ2FwLAorCQkgICAgIHNpemVvZih0ZGxzQWRkU3RhQ21kSW5mby0+SFRDYXApKTsKKwl0ZGxzQWRkU3RhUmVxLT52aHRjYXBfcHJlc2VudCA9IHRkbHNBZGRTdGFDbWRJbmZvLT52aHRjYXBfcHJlc2VudDsKKwljZGZfbWVtX2NvcHkoJnRkbHNBZGRTdGFSZXEtPnZodENhcCwKKwkJICAgICAmdGRsc0FkZFN0YUNtZEluZm8tPlZIVENhcCwKKwkJICAgICBzaXplb2YodGRsc0FkZFN0YUNtZEluZm8tPlZIVENhcCkpOworCXRkbHNBZGRTdGFSZXEtPnN1cHBvcnRlZF9yYXRlc19sZW5ndGggPQorCQl0ZGxzQWRkU3RhQ21kSW5mby0+c3VwcG9ydGVkUmF0ZXNMZW47CisJY2RmX21lbV9jb3B5KCZ0ZGxzQWRkU3RhUmVxLT5zdXBwb3J0ZWRfcmF0ZXMsCisJCSAgICAgdGRsc0FkZFN0YUNtZEluZm8tPnN1cHBvcnRlZFJhdGVzLAorCQkgICAgIHRkbHNBZGRTdGFDbWRJbmZvLT5zdXBwb3J0ZWRSYXRlc0xlbik7CisKKwkvKiBTZW5kIHRoZSByZXF1ZXN0IHRvIFBFLiAqLworCXNtc19sb2cocE1hYywgTE9HRSwgInNlbmRpbmcgVERMUyBBZGQgU3RhIHJlcSB0byBQRSAiKTsKKwlzdGF0dXMgPSB0ZGxzX3NlbmRfbWVzc2FnZShwTWFjLCBlV05JX1NNRV9URExTX0FERF9TVEFfUkVRLAorCQkJCSAgICh2b2lkICopdGRsc0FkZFN0YVJlcSwKKwkJCQkgICBzaXplb2YodFNpclRkbHNBZGRTdGFSZXEpKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBzZW5kIHJlcXVlc3QgdG8gTUFDIikpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIGNzcl90ZGxzX3Byb2Nlc3NfZGVsX3N0YSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpjbWQpCit7CisJdFRkbHNEZWxTdGFDbWRJbmZvICp0ZGxzRGVsU3RhQ21kSW5mbyA9CisJCSZjbWQtPnUudGRsc0NtZC51LnRkbHNEZWxTdGFDbWRJbmZvOworCXRTaXJUZGxzRGVsU3RhUmVxICp0ZGxzRGVsU3RhUmVxID0gTlVMTDsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIGNtZC0+c2Vzc2lvbklkKTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJaWYgKE5VTEwgPT0gcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgicFNlc3Npb24gaXMgTlVMTCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChOVUxMID09IHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiQlNTIGRlc2NyaXB0aW9uIGlzIG5vdCBwcmVzZW50IikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJdGRsc0RlbFN0YVJlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyVGRsc0RlbFN0YVJlcSkpOworCWlmIChOVUxMID09IHRkbHNEZWxTdGFSZXEpCisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwllbHNlCisJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiYWxsb2MgZmFpbGVkIikpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwl0ZGxzRGVsU3RhUmVxLT5zZXNzaW9uSWQgPSBjbWQtPnNlc3Npb25JZDsKKwkvKiBVc2luZyBkaWFsb2cgYXMgdHJhbnNhY3Rpb25JZC4gVGhpcyBjYW4gYmUgdXNlZCB0byBtYXRjaCByZXNwb25zZSB3aXRoIHJlcXVlc3QgKi8KKwl0ZGxzRGVsU3RhUmVxLT50cmFuc2FjdGlvbklkID0gMDsKKworCWNkZl9tZW1fY29weSh0ZGxzRGVsU3RhUmVxLT5ic3NpZCwKKwkJICAgICBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwljZGZfbWVtX2NvcHkodGRsc0RlbFN0YVJlcS0+cGVlck1hYywKKwkJICAgICB0ZGxzRGVsU3RhQ21kSW5mby0+cGVlck1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkvKiBTZW5kIHRoZSByZXF1ZXN0IHRvIFBFLiAqLworCXNtc19sb2cocE1hYywgTE9HMSwKKwkJInNlbmRpbmcgVERMUyBEZWwgU3RhICIgTUFDX0FERFJFU1NfU1RSICIgcmVxIHRvIFBFIiwKKwkJTUFDX0FERFJfQVJSQVkodGRsc0RlbFN0YUNtZEluZm8tPnBlZXJNYWMpKTsKKwlzdGF0dXMgPSB0ZGxzX3NlbmRfbWVzc2FnZShwTWFjLCBlV05JX1NNRV9URExTX0RFTF9TVEFfUkVRLAorCQkJCSAgICh2b2lkICopdGRsc0RlbFN0YVJlcSwKKwkJCQkgICBzaXplb2YodFNpclRkbHNEZWxTdGFSZXEpKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBzZW5kIHJlcXVlc3QgdG8gTUFDIikpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogY29tbWFuZHMgcmVjZWl2ZWQgZnJvbSBDU1IKKyAqLworQ0RGX1NUQVRVUyBjc3JfdGRsc19wcm9jZXNzX2NtZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpjbWQpCit7CisJZVNtZUNvbW1hbmRUeXBlIGNtZFR5cGUgPSBjbWQtPmNvbW1hbmQ7CisJYm9vbCBzdGF0dXMgPSB0cnVlOworCXN3aXRjaCAoY21kVHlwZSkgeworCWNhc2UgZVNtZUNvbW1hbmRUZGxzU2VuZE1nbXQ6CisJeworCQlzdGF0dXMgPSBjc3JfdGRsc19wcm9jZXNzX3NlbmRfbWdtdChwTWFjLCBjbWQpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGZhbHNlOworCQl9CisJfQorCWJyZWFrOworCWNhc2UgZVNtZUNvbW1hbmRUZGxzQWRkUGVlcjoKKwl7CisJCXN0YXR1cyA9IGNzcl90ZGxzX3Byb2Nlc3NfYWRkX3N0YShwTWFjLCBjbWQpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGZhbHNlOworCQl9CisJfQorCWJyZWFrOworCWNhc2UgZVNtZUNvbW1hbmRUZGxzRGVsUGVlcjoKKwl7CisJCXN0YXR1cyA9IGNzcl90ZGxzX3Byb2Nlc3NfZGVsX3N0YShwTWFjLCBjbWQpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGZhbHNlOworCQl9CisJfQorCWJyZWFrOworCWNhc2UgZVNtZUNvbW1hbmRUZGxzTGlua0VzdGFibGlzaDoKKwl7CisJCXN0YXR1cyA9IGNzcl90ZGxzX3Byb2Nlc3NfbGlua19lc3RhYmxpc2gocE1hYywgY21kKTsKKwkJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzdGF0dXMgPSBmYWxzZTsKKwkJfQorCX0KKwlicmVhazsKKwlkZWZhdWx0OgorCXsKKwkJLyogVE9ETzogQWRkIGRlZnVhbHQgaGFuZGxpbmcgKi8KKwkJYnJlYWs7CisJfQorCisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgY3NyX3RkbHNfcHJvY2Vzc19saW5rX2VzdGFibGlzaCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpjbWQpCit7CisJdFRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mbyAqdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvID0KKwkJJmNtZC0+dS50ZGxzQ21kLnUudGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvOworCXRTaXJUZGxzTGlua0VzdGFibGlzaFJlcSAqdGRsc0xpbmtFc3RhYmxpc2hSZXEgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBjbWQtPnNlc3Npb25JZCk7CisKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbikgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJwU2Vzc2lvbiBpcyBOVUxMIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJdGRsc0xpbmtFc3RhYmxpc2hSZXEgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclRkbHNMaW5rRXN0YWJsaXNoUmVxKSk7CisKKwlpZiAodGRsc0xpbmtFc3RhYmxpc2hSZXEgPT0gTlVMTCkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJhbGxvYyBmYWlsZWQiKSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCXRkbHNMaW5rRXN0YWJsaXNoUmVxLT5zZXNzaW9uSWQgPSBjbWQtPnNlc3Npb25JZDsKKwkvKiBVc2luZyBkaWFsb2cgYXMgdHJhbnNhY3Rpb25JZC4gVGhpcyBjYW4gYmUgdXNlZCB0byBtYXRjaCByZXNwb25zZSB3aXRoIHJlcXVlc3QgKi8KKwl0ZGxzTGlua0VzdGFibGlzaFJlcS0+dHJhbnNhY3Rpb25JZCA9IDA7CisJY2RmX21lbV9jb3B5KHRkbHNMaW5rRXN0YWJsaXNoUmVxLT5wZWVyTWFjLAorCQkgICAgIHRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mby0+cGVlck1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJY2RmX21lbV9jb3B5KHRkbHNMaW5rRXN0YWJsaXNoUmVxLT5ic3NpZCwKKwkJICAgICBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJY2RmX21lbV9jb3B5KHRkbHNMaW5rRXN0YWJsaXNoUmVxLT5zdXBwb3J0ZWRDaGFubmVscywKKwkJICAgICB0ZGxzTGlua0VzdGFibGlzaENtZEluZm8tPnN1cHBvcnRlZENoYW5uZWxzLAorCQkgICAgIHRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mby0+c3VwcG9ydGVkQ2hhbm5lbHNMZW4pOworCXRkbHNMaW5rRXN0YWJsaXNoUmVxLT5zdXBwb3J0ZWRDaGFubmVsc0xlbiA9CisJCXRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mby0+c3VwcG9ydGVkQ2hhbm5lbHNMZW47CisJY2RmX21lbV9jb3B5KHRkbHNMaW5rRXN0YWJsaXNoUmVxLT5zdXBwb3J0ZWRPcGVyQ2xhc3NlcywKKwkJICAgICB0ZGxzTGlua0VzdGFibGlzaENtZEluZm8tPnN1cHBvcnRlZE9wZXJDbGFzc2VzLAorCQkgICAgIHRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mby0+c3VwcG9ydGVkT3BlckNsYXNzZXNMZW4pOworCXRkbHNMaW5rRXN0YWJsaXNoUmVxLT5zdXBwb3J0ZWRPcGVyQ2xhc3Nlc0xlbiA9CisJCXRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mby0+c3VwcG9ydGVkT3BlckNsYXNzZXNMZW47CisJdGRsc0xpbmtFc3RhYmxpc2hSZXEtPmlzQnVmU3RhID0gdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT5pc0J1ZlN0YTsKKwl0ZGxzTGlua0VzdGFibGlzaFJlcS0+aXNSZXNwb25kZXIgPQorCQl0ZGxzTGlua0VzdGFibGlzaENtZEluZm8tPmlzUmVzcG9uZGVyOworCXRkbHNMaW5rRXN0YWJsaXNoUmVxLT51YXBzZFF1ZXVlcyA9CisJCXRkbHNMaW5rRXN0YWJsaXNoQ21kSW5mby0+dWFwc2RRdWV1ZXM7CisJdGRsc0xpbmtFc3RhYmxpc2hSZXEtPm1heFNwID0gdGRsc0xpbmtFc3RhYmxpc2hDbWRJbmZvLT5tYXhTcDsKKworCS8qIFNlbmQgdGhlIHJlcXVlc3QgdG8gUEUuICovCisJc21zX2xvZyhwTWFjLCBMT0dFLCAic2VuZGluZyBURExTIExpbmsgRXN0YWJsaXNoIFJlcXVlc3QgdG8gUEUgXG4iKTsKKwlzdGF0dXMgPSB0ZGxzX3NlbmRfbWVzc2FnZShwTWFjLCBlV05JX1NNRV9URExTX0xJTktfRVNUQUJMSVNIX1JFUSwKKwkJCQkgICAodm9pZCAqKXRkbHNMaW5rRXN0YWJsaXNoUmVxLAorCQkJCSAgIHNpemVvZih0U2lyVGRsc0xpbmtFc3RhYmxpc2hSZXEpKTsKKwkJCQkgICBpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJCSAgIHNtc19sb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBzZW5kIHJlcXVlc3QgdG8gTUFDXG4iKSk7CisJCQkJICAgfQorCQkJCSAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBURExTIE1lc3NhZ2UgcHJvY2Vzc29yLCB3aWxsIGJlIGNhbGxlZCBhZnRlciBURExTIG1lc3NhZ2UgcmVjaWV2ZWQgZnJvbQorICogUEUKKyAqLworQ0RGX1NUQVRVUyB0ZGxzX21zZ19wcm9jZXNzb3IodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDE2X3QgbXNnVHlwZSwKKwkJCSAgICAgIHZvaWQgKnBNc2dCdWYpCit7CisJdENzclJvYW1JbmZvIHJvYW1JbmZvID0geyAwIH07CisJZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdDsKKwl0U2lyVGRsc0FkZFN0YVJzcCAqYWRkU3RhUnNwID0gKHRTaXJUZGxzQWRkU3RhUnNwICopIHBNc2dCdWY7CisJdFNpclRkbHNEZWxTdGFSc3AgKmRlbFN0YVJzcCA9ICh0U2lyVGRsc0RlbFN0YVJzcCAqKSBwTXNnQnVmOworCXRwU2lyVGRsc0RlbFN0YUluZCBwU2lyVGRsc0RlbFN0YUluZCA9ICh0cFNpclRkbHNEZWxTdGFJbmQpIHBNc2dCdWY7CisJdHBTaXJUZGxzRGVsQWxsUGVlckluZCBwU2lyVGRsc0RlbEFsbFBlZXJJbmQgPQorCQkodHBTaXJUZGxzRGVsQWxsUGVlckluZCkgcE1zZ0J1ZjsKKwl0cFNpck1nbXRUeENvbXBsZXRpb25JbmQgdGRsc190eF9jb21wX2luZCA9CisJCSh0cFNpck1nbXRUeENvbXBsZXRpb25JbmQpIHBNc2dCdWY7CisJdFNpclRkbHNMaW5rRXN0YWJsaXNoUmVxUnNwICpsaW5rRXN0YWJsaXNoUmVxUnNwID0KKwkJKHRTaXJUZGxzTGlua0VzdGFibGlzaFJlcVJzcCAqKSBwTXNnQnVmOworCXRTaXJUZGxzRXZlbnRub3RpZnkgKnRldmVudCA9ICh0U2lyVGRsc0V2ZW50bm90aWZ5ICopIHBNc2dCdWY7CisKKwlzd2l0Y2ggKG1zZ1R5cGUpIHsKKwljYXNlIGVXTklfU01FX1RETFNfU0VORF9NR01UX1JTUDoKKwkJLyogcmVtb3ZlIHBlbmRpbmcgZVNtZUNvbW1hbmRUZGxzRGlzY292ZXJ5IGNvbW1hbmQgKi8KKwkJY3NyX3RkbHNfcmVtb3ZlX3NtZV9jbWQocE1hYywgZVNtZUNvbW1hbmRUZGxzU2VuZE1nbXQpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX1RETFNfQUREX1NUQV9SU1A6CisJCWNkZl9tZW1fY29weSgmcm9hbUluZm8ucGVlck1hYywgYWRkU3RhUnNwLT5wZWVyTWFjLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQlyb2FtSW5mby5zdGFJZCA9IGFkZFN0YVJzcC0+c3RhSWQ7CisJCXJvYW1JbmZvLnVjYXN0U2lnID0gYWRkU3RhUnNwLT51Y2FzdFNpZzsKKwkJcm9hbUluZm8uYmNhc3RTaWcgPSBhZGRTdGFSc3AtPmJjYXN0U2lnOworCQlyb2FtSW5mby5zdGF0dXNDb2RlID0gYWRkU3RhUnNwLT5zdGF0dXNDb2RlOworCQkvKgorCQkgKiByZWdpc3RlciBwZWVyIHdpdGggVEwsIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCBIREQgYXMKKwkJICogdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gcmVnaXN0ZXIgYW55IFNUQSB3aXRoIFRMLgorCQkgKi8KKwkJaWYgKGFkZFN0YVJzcC0+dGRsc0FkZE9wZXIgPT0gVERMU19PUEVSX0FERCkKKwkJCXJvYW1SZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0FERF9URExTX1BFRVI7CisJCWVsc2UgICAgLyogYWRkU3RhUnNwLT50ZGxzQWRkT3BlciBtdXN0IGJlIFRETFNfT1BFUl9VUERBVEUgKi8KKwkJCXJvYW1SZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX1VQREFURV9URExTX1BFRVI7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgYWRkU3RhUnNwLT5zZXNzaW9uSWQsCisJCQkJJnJvYW1JbmZvLCAwLCBlQ1NSX1JPQU1fVERMU19TVEFUVVNfVVBEQVRFLAorCQkJCXJvYW1SZXN1bHQpOworCisJCS8qIHJlbW92ZSBwZW5kaW5nIGVTbWVDb21tYW5kVGRsc0Rpc2NvdmVyeSBjb21tYW5kICovCisJCWNzcl90ZGxzX3JlbW92ZV9zbWVfY21kKHBNYWMsIGVTbWVDb21tYW5kVGRsc0FkZFBlZXIpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX1RETFNfREVMX1NUQV9SU1A6CisJCWNkZl9tZW1fY29weSgmcm9hbUluZm8ucGVlck1hYywgZGVsU3RhUnNwLT5wZWVyTWFjLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQlyb2FtSW5mby5zdGFJZCA9IGRlbFN0YVJzcC0+c3RhSWQ7CisJCXJvYW1JbmZvLnN0YXR1c0NvZGUgPSBkZWxTdGFSc3AtPnN0YXR1c0NvZGU7CisJCS8qCisJCSAqIHJlZ2lzdGVyIHBlZXIgd2l0aCBUTCwgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIEhERCBhcworCQkgKiB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byByZWdpc3RlciBhbnkgU1RBIHdpdGggVEwuCisJCSAqLworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIGRlbFN0YVJzcC0+c2Vzc2lvbklkLAorCQkJCSZyb2FtSW5mbywgMCwKKwkJCQllQ1NSX1JPQU1fVERMU19TVEFUVVNfVVBEQVRFLAorCQkJCWVDU1JfUk9BTV9SRVNVTFRfREVMRVRFX1RETFNfUEVFUik7CisKKwkJY3NyX3RkbHNfcmVtb3ZlX3NtZV9jbWQocE1hYywgZVNtZUNvbW1hbmRUZGxzRGVsUGVlcik7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfVERMU19ERUxfU1RBX0lORDoKKwkJY2RmX21lbV9jb3B5KCZyb2FtSW5mby5wZWVyTWFjLAorCQkJCXBTaXJUZGxzRGVsU3RhSW5kLT5wZWVyTWFjLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQlyb2FtSW5mby5zdGFJZCA9IHBTaXJUZGxzRGVsU3RhSW5kLT5zdGFJZDsKKwkJcm9hbUluZm8ucmVhc29uQ29kZSA9IHBTaXJUZGxzRGVsU3RhSW5kLT5yZWFzb25Db2RlOworCisJCS8qIFNlbmRpbmcgdGhlIFRFQVJET1dOIGluZGljYXRpb24gdG8gSERELiAqLworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsCisJCQkJcFNpclRkbHNEZWxTdGFJbmQtPnNlc3Npb25JZCwgJnJvYW1JbmZvLAorCQkJCTAsIGVDU1JfUk9BTV9URExTX1NUQVRVU19VUERBVEUsCisJCQkJZUNTUl9ST0FNX1JFU1VMVF9URUFSRE9XTl9URExTX1BFRVJfSU5EKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9URExTX0RFTF9BTExfUEVFUl9JTkQ6CisJCS8qIFNlbmRpbmcgdGhlIFRFQVJET1dOIGluZGljYXRpb24gdG8gSERELiAqLworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsCisJCQkJcFNpclRkbHNEZWxBbGxQZWVySW5kLT5zZXNzaW9uSWQsCisJCQkJJnJvYW1JbmZvLCAwLAorCQkJCWVDU1JfUk9BTV9URExTX1NUQVRVU19VUERBVEUsCisJCQkJZUNTUl9ST0FNX1JFU1VMVF9ERUxFVEVfQUxMX1RETFNfUEVFUl9JTkQpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX01HTVRfRlJNX1RYX0NPTVBMRVRJT05fSU5EOgorCQlyb2FtSW5mby5yZWFzb25Db2RlID0KKwkJCXRkbHNfdHhfY29tcF9pbmQtPnR4Q29tcGxldGVTdGF0dXM7CisKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLAorCQkJCXRkbHNfdHhfY29tcF9pbmQtPnNlc3Npb25JZCwKKwkJCQkmcm9hbUluZm8sIDAsCisJCQkJZUNTUl9ST0FNX1JFU1VMVF9NR01UX1RYX0NPTVBMRVRFX0lORCwKKwkJCQkwKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9URExTX0xJTktfRVNUQUJMSVNIX1JTUDoKKwkJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLAorCQkJCWxpbmtFc3RhYmxpc2hSZXFSc3AtPnNlc3Npb25JZCwKKwkJCQkmcm9hbUluZm8sIDAsCisJCQkJZUNTUl9ST0FNX1RETFNfU1RBVFVTX1VQREFURSwKKwkJCQllQ1NSX1JPQU1fUkVTVUxUX0xJTktfRVNUQUJMSVNIX1JFUV9SU1ApOworCQkvKiByZW1vdmUgcGVuZGluZyBlU21lQ29tbWFuZFRkbHNMaW5rRXN0YWJsaXNoIGNvbW1hbmQgKi8KKwkJY3NyX3RkbHNfcmVtb3ZlX3NtZV9jbWQocE1hYywgZVNtZUNvbW1hbmRUZGxzTGlua0VzdGFibGlzaCk7CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfVERMU19TSE9VTERfRElTQ09WRVI6CisJCWNkZl9tZW1fY29weSgmcm9hbUluZm8ucGVlck1hYywgdGV2ZW50LT5wZWVyTWFjLAorCQkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCQlyb2FtSW5mby5yZWFzb25Db2RlID0gdGV2ZW50LT5wZWVyX3JlYXNvbjsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkiJXM6IGVXTklfU01FX1RETFNfU0hPVUxEX0RJU0NPVkVSIGZvciBwZWVyIG1hYzogIgorCQkJCU1BQ19BRERSRVNTX1NUUiAiIHBlZXJfcmVhc29uOiAlZCIsCisJCQkJX19mdW5jX18sIE1BQ19BRERSX0FSUkFZKHRldmVudC0+cGVlck1hYyksCisJCQkJdGV2ZW50LT5wZWVyX3JlYXNvbik7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgdGV2ZW50LT5zZXNzaW9uSWQsICZyb2FtSW5mbywKKwkJCQkwLCBlQ1NSX1JPQU1fVERMU19TVEFUVVNfVVBEQVRFLAorCQkJCWVDU1JfUk9BTV9SRVNVTFRfVERMU19TSE9VTERfRElTQ09WRVIpOworCQlicmVhazsKKwljYXNlIGVXTklfU01FX1RETFNfU0hPVUxEX1RFQVJET1dOOgorCQljZGZfbWVtX2NvcHkoJnJvYW1JbmZvLnBlZXJNYWMsIHRldmVudC0+cGVlck1hYywKKwkJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcm9hbUluZm8ucmVhc29uQ29kZSA9IHRldmVudC0+cGVlcl9yZWFzb247CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJIiVzOiBlV05JX1NNRV9URExTX1NIT1VMRF9URUFSRE9XTiBmb3IgcGVlciBtYWM6ICIKKwkJCQlNQUNfQUREUkVTU19TVFIgIiBwZWVyX3JlYXNvbjogJWQiLAorCQkJCV9fZnVuY19fLCBNQUNfQUREUl9BUlJBWSh0ZXZlbnQtPnBlZXJNYWMpLAorCQkJCXRldmVudC0+cGVlcl9yZWFzb24pOworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHRldmVudC0+c2Vzc2lvbklkLCAmcm9hbUluZm8sCisJCQkJMCwgZUNTUl9ST0FNX1RETFNfU1RBVFVTX1VQREFURSwKKwkJCQllQ1NSX1JPQU1fUkVTVUxUX1RETFNfU0hPVUxEX1RFQVJET1dOKTsKKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9URExTX1BFRVJfRElTQ09OTkVDVEVEOgorCQljZGZfbWVtX2NvcHkoJnJvYW1JbmZvLnBlZXJNYWMsIHRldmVudC0+cGVlck1hYywKKwkJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJcm9hbUluZm8ucmVhc29uQ29kZSA9IHRldmVudC0+cGVlcl9yZWFzb247CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJIiVzOiBlV05JX1NNRV9URExTX1BFRVJfRElTQ09OTkVDVEVEIGZvciBwZWVyIG1hYzogIgorCQkJCU1BQ19BRERSRVNTX1NUUiAiIHBlZXJfcmVhc29uOiAlZCIsCisJCQkJX19mdW5jX18sIE1BQ19BRERSX0FSUkFZKHRldmVudC0+cGVlck1hYyksCisJCQkJdGV2ZW50LT5wZWVyX3JlYXNvbik7CisJCWNzcl9yb2FtX2NhbGxfY2FsbGJhY2socE1hYywgdGV2ZW50LT5zZXNzaW9uSWQsICZyb2FtSW5mbywKKwkJCQkwLCBlQ1NSX1JPQU1fVERMU19TVEFUVVNfVVBEQVRFLAorCQkJCWVDU1JfUk9BTV9SRVNVTFRfVERMU19TSE9VTERfUEVFUl9ESVNDT05ORUNURUQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9zcmMvY3NyL2Nzcl91dGlsLmMgYi9jb3JlL3NtZS9zcmMvY3NyL2Nzcl91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhOGNiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL3NyYy9jc3IvY3NyX3V0aWwuYwpAQCAtMCwwICsxLDU2MjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKworICAgIFxmaWxlIGNzcl91dGlsLmMKKworICAgIEltcGxlbWVudGF0aW9uIHN1cHBvcnRpbmcgcm91dGluZXMgZm9yIENTUi4KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisKKyNpbmNsdWRlICJjc3Jfc3VwcG9ydC5oIgorI2luY2x1ZGUgImNzcl9pbnNpZGVfYXBpLmgiCisjaW5jbHVkZSAic21zX2RlYnVnLmgiCisjaW5jbHVkZSAic21lX3Fvc19pbnRlcm5hbC5oIgorI2luY2x1ZGUgIndtYV90eXBlcy5oIgorI2luY2x1ZGUgImNkc191dGlscy5oIgorCisKK3VpbnQ4X3QgY3NyX3dwYV9vdWlbXVtDU1JfV1BBX09VSV9TSVpFXSA9IHsKKwl7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMH0KKwksCisJezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9CisJLAorCXsweDAwLCAweDUwLCAweGYyLCAweDAyfQorCSwKKwl7MHgwMCwgMHg1MCwgMHhmMiwgMHgwM30KKwksCisJezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9CisJLAorCXsweDAwLCAweDUwLCAweGYyLCAweDA1fQorCSwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJezB4MDAsIDB4NDAsIDB4OTYsIDB4MDB9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogQ0NLTSAqLworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KK307CisKK3VpbnQ4X3QgY3NyX3Jzbl9vdWlbXVtDU1JfUlNOX09VSV9TSVpFXSA9IHsKKwl7MHgwMCwgMHgwRiwgMHhBQywgMHgwMH0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBncm91cCBjaXBoZXIgKi8KKwl7MHgwMCwgMHgwRiwgMHhBQywgMHgwMX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBXRVAtNDAgb3IgUlNOICovCisJezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogVEtJUCBvciBSU04tUFNLICovCisJezB4MDAsIDB4MEYsIDB4QUMsIDB4MDN9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKwl7MHgwMCwgMHgwRiwgMHhBQywgMHgwNH0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBBRVMtQ0NNUCAqLworCXsweDAwLCAweDBGLCAweEFDLCAweDA1fQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFdFUC0xMDQgKi8KKwl7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMH0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBDQ0tNICovCisJezB4MDAsIDB4MEYsIDB4QUMsIDB4MDZ9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogQklQIChlbmNyeXB0aW9uIHR5cGUpIG9yCisJCQkJUlNOLVBTSy1TSEEyNTYgKGF1dGhlbnRpY2F0aW9uIHR5cGUpICovCisJLyogUlNOLTgwMjFYLVNIQTI1NiAoYXV0aGVudGljYXRpb24gdHlwZSkgKi8KKwl7MHgwMCwgMHgwRiwgMHhBQywgMHgwNX0KK307CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQordWludDhfdCBjc3Jfd2FwaV9vdWlbXVtDU1JfV0FQSV9PVUlfU0laRV0gPSB7CisJezB4MDAsIDB4MTQsIDB4NzIsIDB4MDB9CisJLCAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKwl7MHgwMCwgMHgxNCwgMHg3MiwgMHgwMX0KKwksICAgICAgICAgICAgICAgICAgICAgICAvKiBXQUkgY2VydGlmaWNhdGUgb3IgU01TNCAqLworCXsweDAwLCAweDE0LCAweDcyLCAweDAyfSAvKiBXQUkgUFNLICovCit9OworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCit1aW50OF90IGNzcl93bWVfaW5mb19vdWlbQ1NSX1dNRV9PVUlfU0laRV0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIgfTsKK3VpbnQ4X3QgY3NyX3dtZV9wYXJtX291aVtDU1JfV01FX09VSV9TSVpFXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiB9OworCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworLyoqCisgKiBcdmFyIGdfcGh5X3JhdGVzX3N1cHB0CisgKgorICogXGJyaWVmIFJhdGUgc3VwcG9ydCBsb29rdXAgdGFibGUKKyAqCisgKgorICogVGhpcyBpcyBhICBsb29rdXAgdGFibGUgaW5kZXhpbmcgcmF0ZXMgJiAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHRvCisgKiBzdXBwb3J0LiAgR2l2ZW4gYSByYXRlIChpbiAgdW5pdGVzIG9mIDAuNU1wYnMpICYgdGhyZWUgYm9vbHMgKE1JTU8KKyAqIEVuYWJsZWQsIENoYW5uZWwgIEJvbmRpbmcgRW5hYmxlZCwgJiBDb25jYXRlbmF0aW9uICBFbmFibGVkKSwgb25lIGNhbgorICogZGV0ZXJtaW5lICB3aGV0aGVyICB0aGUgZ2l2ZW4gIHJhdGUgIGlzICBzdXBwb3J0ZWQgIGJ5IGNvbXB1dGluZyAgdHdvCisgKiBpbmRpY2VzLiAgVGhlICBmaXJzdCBtYXBzICB0aGUgcmF0ZSB0byAgdGFibGUgcm93IGFzICBpbmRpY2F0ZWQgYmVsb3cKKyAqIChpLmUuIGVIZGRTdXBwUmF0ZV82TWJwcyBtYXBzIHRvICByb3cgemVybywgZUhkZFN1cHBSYXRlXzlNYnBzIHRvIHJvdworICogMSwgYW5kIHNvIG9uKS4gIEluZGV4IHR3byBjYW4gYmUgY29tcHV0ZWQgbGlrZSBzbzoKKyAqCisgKiBcY29kZQorICogIGlkeDIgPSAoIGZFc2YgID8gMHg0IDogMHgwICkgfAorICogICAgICAgICAoIGZDYiAgID8gMHgyIDogMHgwICkgfAorICogICAgICAgICAoIGZNaW1vID8gMHgxIDogMHgwICk7CisgKiBcZW5kY29kZQorICoKKyAqCisgKiBHaXZlbiB0aGF0OgorICoKKyAqICBcY29kZQorICogIGZTdXBwb3J0ZWQgPSBnX3BoeV9yYXRlc19zdXBwdFtpZHgxXVtpZHgyXTsKKyAqICBcZW5kY29kZQorICoKKyAqCisgKiBUaGlzIHRhYmxlIGlzIGJhc2VkIG9uICB0aGUgZG9jdW1lbnQgIlBIWSBTdXBwb3J0ZWQgUmF0ZXMuZG9jIi4gIFRoaXMKKyAqIHRhYmxlIGlzICBwZXJtaXNzaXZlIGluIHRoYXQgYSAgcmF0ZSBpcyByZWZsZWN0ZWQgIGFzIGJlaW5nIHN1cHBvcnRlZAorICogZXZlbiAgd2hlbiB0dXJuaW5nICBvZmYgYW4gIGVuYWJsZWQgZmVhdHVyZSAgd291bGQgYmUgIHJlcXVpcmVkLiAgRm9yCisgKiBpbnN0YW5jZSwgIlBIWSBTdXBwb3J0ZWQgUmF0ZXMiICBsaXN0cyA0Mk1wYnMgYXMgdW5zdXBwb3J0ZWQgd2hlbiBDQiwKKyAqIEVTRiwgJiAgTUlNTyBhcmUgYWxsICBvbi4gIEhvd2V2ZXIsICBpZiB3ZSB0dXJuICBvZmYgZWl0aGVyIG9mICBDQiBvcgorICogTUlNTywgaXQgdGhlbiBiZWNvbWVzIHN1cHBvcnRlZC4gICBUaGVyZWZvcmUsIHdlIG1hcmsgaXQgYXMgc3VwcG9ydGVkCisgKiBldmVuIGluIGluZGV4IDcgb2YgdGhpcyB0YWJsZS4KKyAqCisgKgorICovCisKK3N0YXRpYyBjb25zdCBib29sIGdfcGh5X3JhdGVzX3N1cHB0WzI0XVs4XSA9IHsKKworCS8qIFNTRiAgIFNTRiAgICBTU0YgICAgU1NGICAgIEVTRiAgICBFU0YgICAgRVNGICAgIEVTRiAqLworCS8qIFNJTU8gIE1JTU8gICBTSU1PICAgTUlNTyAgIFNJTU8gICBNSU1PICAgU0lNTyAgIE1JTU8gKi8KKwkvKiBObyBDQiBObyBDQiAgQ0IgICAgIENCICAgICBObyBDQiAgTm8gQ0IgIENCICAgICBDQiAqLworCXt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfSwgICAgICAgLyogNk1icHMgKi8KKwl7dHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sICAgICAgIC8qIDlNYnBzICovCisJe3RydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWV9LCAgICAgICAvKiAxMk1icHMgKi8KKwl7dHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sICAgICAgIC8qIDE4TWJwcyAqLworCXtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZX0sICAgLyogMjBNYnBzICovCisJe3RydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWV9LCAgICAgICAvKiAyNE1icHMgKi8KKwl7dHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sICAgICAgIC8qIDM2TWJwcyAqLworCXtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlfSwgICAgLyogNDBNYnBzICovCisJe2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWV9LCAgICAvKiA0Mk1icHMgKi8KKwl7dHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sICAgICAgIC8qIDQ4TWJwcyAqLworCXt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfSwgICAgICAgLyogNTRNYnBzICovCisJe2ZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sICAgICAvKiA3Mk1icHMgKi8KKwl7ZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sICAgIC8qIDgwTWJwcyAqLworCXtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlfSwgICAgLyogODRNYnBzICovCisJe2ZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sICAgICAvKiA5Nk1icHMgKi8KKwl7ZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlfSwgICAgIC8qIDEwOE1icHMgKi8KKwl7ZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sICAgIC8qIDEyME1icHMgKi8KKwl7ZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sICAgIC8qIDEyNk1icHMgKi8KKwl7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZX0sIC8qIDE0NE1icHMgKi8KKwl7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZX0sIC8qIDE2ME1icHMgKi8KKwl7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZX0sIC8qIDE2OE1icHMgKi8KKwl7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZX0sIC8qIDE5Mk1icHMgKi8KKwl7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZX0sIC8qIDIxNk1icHMgKi8KKwl7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZX0sIC8qIDI0ME1icHMgKi8KKworfTsKKworI2RlZmluZSBDQVNFX1JFVFVSTl9TVFIobikge1wKKwljYXNlIChuKTogcmV0dXJuICgjIG4pO1wKK30KKworY29uc3QgY2hhciAqZ2V0X2Vfcm9hbV9jbWRfc3RhdHVzX3N0cihlUm9hbUNtZFN0YXR1cyB2YWwpCit7CisJc3dpdGNoICh2YWwpIHsKKwkJQ0FTRV9SRVRVUk5fU1RSKGVDU1JfUk9BTV9DQU5DRUxMRUQpOworCQlDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1JPQU1JTkdfU1RBUlQpOworCQlDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1JPQU1JTkdfQ09NUExFVElPTik7CisJCUNBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fQVNTT0NJQVRJT05fU1RBUlQpOworCQlDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04pOworCQlDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX0RJU0FTU09DSUFURUQpOworCQlDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1NIT1VMRF9ST0FNKTsKKwkJQ0FTRV9SRVRVUk5fU1RSKGVDU1JfUk9BTV9TQ0FOX0ZPVU5EX05FV19CU1MpOworCQlDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX0xPU1RMSU5LKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworY29uc3QgY2hhciAqZ2V0X2VfY3NyX3JvYW1fcmVzdWx0X3N0cihlQ3NyUm9hbVJlc3VsdCB2YWwpCit7CisJc3dpdGNoICh2YWwpIHsKKwkJQ0FTRV9SRVRVUk5fU1RSKGVDU1JfUk9BTV9SRVNVTFRfTk9ORSk7CisJCUNBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworCQlDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1JFU1VMVF9BU1NPQ0lBVEVEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSKGVDU1JfUk9BTV9SRVNVTFRfTk9UX0FTU09DSUFURUQpOworCQlDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1JFU1VMVF9NSUNfRkFJTFVSRSk7CisJCUNBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCk7CisJCUNBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0RJU0FTU09DX0lORCk7CisJCUNBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0RFQVVUSF9JTkQpOworCQlDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1JFU1VMVF9DQVBfQ0hBTkdFRCk7CisJCUNBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfQ09OTkVDVCk7CisJCUNBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfSU5BQ1RJVkUpOworCQlDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1JFU1VMVF9JQlNTX05FV19QRUVSKTsKKwkJQ0FTRV9SRVRVUk5fU1RSKGVDU1JfUk9BTV9SRVNVTFRfSUJTU19DT0FMRVNDRUQpOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitib29sIGNzcl9nZXRfYnNzX2lkX2Jzc19kZXNjKHRIYWxIYW5kbGUgaEhhbCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJCSAgICAgc3RydWN0IGNkZl9tYWNfYWRkciAqcEJzc0lkKQoreworCWNkZl9tZW1fY29weShwQnNzSWQsICZwU2lyQnNzRGVzYy0+YnNzSWRbMF0sCisJCQlzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCXJldHVybiB0cnVlOworfQorCitib29sIGNzcl9pc19ic3NfaWRfZXF1YWwodEhhbEhhbmRsZSBoSGFsLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMSwKKwkJCSB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMikKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJYm9vbCBmRXF1YWwgPSBmYWxzZTsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkMTsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIGJzc0lkMjsKKworCWRvIHsKKwkJaWYgKCFwU2lyQnNzRGVzYzEpCisJCQlicmVhazsKKwkJaWYgKCFwU2lyQnNzRGVzYzIpCisJCQlicmVhazsKKworCQlpZiAoIWNzcl9nZXRfYnNzX2lkX2Jzc19kZXNjKHBNYWMsIHBTaXJCc3NEZXNjMSwgJmJzc0lkMSkpCisJCQlicmVhazsKKwkJaWYgKCFjc3JfZ2V0X2Jzc19pZF9ic3NfZGVzYyhwTWFjLCBwU2lyQnNzRGVzYzIsICZic3NJZDIpKQorCQkJYnJlYWs7CisKKwkJZkVxdWFsID0gY2RmX2lzX21hY2FkZHJfZXF1YWwoJmJzc0lkMSwgJmJzc0lkMik7CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gZkVxdWFsOworfQorCitib29sIGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlyZXR1cm4gZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lCU1NfQ09OTkVDVEVEID09CisJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGU7Cit9CisKK2Jvb2wgY3NyX2lzX2Nvbm5fc3RhdGVfZGlzY29ubmVjdGVkX2lic3ModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlyZXR1cm4gZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lCU1NfRElTQ09OTkVDVEVEID09CisJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGU7Cit9CisKK2Jvb2wgY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2luZnJhKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlyZXR1cm4gZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lORlJBX0FTU09DSUFURUQgPT0KKwkJcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RTdGF0ZTsKK30KKworYm9vbCBjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCWlmIChjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWRfaWJzcyhwTWFjLCBzZXNzaW9uSWQpCisJICAgIHx8IGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYShwTWFjLCBzZXNzaW9uSWQpCisJICAgIHx8IGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF93ZHMocE1hYywgc2Vzc2lvbklkKSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgY3NyX2lzX2Nvbm5fc3RhdGVfaW5mcmEodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCXJldHVybiBjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWRfaW5mcmEocE1hYywgc2Vzc2lvbklkKTsKK30KKworYm9vbCBjc3JfaXNfY29ubl9zdGF0ZV9pYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlyZXR1cm4gY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2lic3MocE1hYywgc2Vzc2lvbklkKSB8fAorCSAgICAgICBjc3JfaXNfY29ubl9zdGF0ZV9kaXNjb25uZWN0ZWRfaWJzcyhwTWFjLCBzZXNzaW9uSWQpOworfQorCitib29sIGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF93ZHModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCXJldHVybiBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfV0RTX0NPTk5FQ1RFRCA9PQorCQlwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlOworfQorCitib29sIGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYV9hcCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlyZXR1cm4gKGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JTkZSQV9DT05ORUNURUQgPT0KKwkJIHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGUpIHx8CisJICAgICAgIChlQ1NSX0FTU09DX1NUQVRFX1RZUEVfSU5GUkFfRElTQ09OTkVDVEVEID09CisJCSBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlKTsKK30KKworYm9vbCBjc3JfaXNfY29ubl9zdGF0ZV9kaXNjb25uZWN0ZWRfd2RzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlyZXR1cm4gZUNTUl9BU1NPQ19TVEFURV9UWVBFX1dEU19ESVNDT05ORUNURUQgPT0KKwkJcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RTdGF0ZTsKK30KKworYm9vbCBjc3JfaXNfY29ubl9zdGF0ZV93ZHModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCXJldHVybiBjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWRfd2RzKHBNYWMsIHNlc3Npb25JZCkgfHwKKwkgICAgICAgY3NyX2lzX2Nvbm5fc3RhdGVfZGlzY29ubmVjdGVkX3dkcyhwTWFjLCBzZXNzaW9uSWQpOworfQorCitib29sIGNzcl9pc19jb25uX3N0YXRlX2FwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uOworCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJaWYgKCFwU2Vzc2lvbikKKwkJcmV0dXJuIGZhbHNlOworCWlmIChDU1JfSVNfSU5GUkFfQVAoJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitib29sIGNzcl9pc19hbnlfc2Vzc2lvbl9pbl9jb25uZWN0X3N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDMyX3QgaTsKKwlib29sIGZSYyA9IGZhbHNlOworCisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIGkpICYmCisJCSAgICAoY3NyX2lzX2Nvbm5fc3RhdGVfaW5mcmEocE1hYywgaSkKKwkJICAgICB8fCBjc3JfaXNfY29ubl9zdGF0ZV9pYnNzKHBNYWMsIGkpCisJCSAgICAgfHwgY3NyX2lzX2Nvbm5fc3RhdGVfYXAocE1hYywgaSkpKSB7CisJCQlmUmMgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZlJjOworfQorCitpbnQ4X3QgY3NyX2dldF9pbmZyYV9zZXNzaW9uX2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDhfdCBpOworCWludDhfdCBzZXNzaW9uaWQgPSAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBpKQorCQkgICAgJiYgY3NyX2lzX2Nvbm5fc3RhdGVfaW5mcmEocE1hYywgaSkpIHsKKwkJCXNlc3Npb25pZCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBzZXNzaW9uaWQ7Cit9CisKK3VpbnQ4X3QgY3NyX2dldF9pbmZyYV9vcGVyYXRpb25fY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl1aW50OF90IGNoYW5uZWw7CisKKwlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQljaGFubmVsID0KKwkJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0ZWRQcm9maWxlLgorCQkJb3BlcmF0aW9uQ2hhbm5lbDsKKwl9IGVsc2UgeworCQljaGFubmVsID0gMDsKKwl9CisJcmV0dXJuIGNoYW5uZWw7Cit9CisKK2Jvb2wgY3NyX2lzX3Nlc3Npb25fY2xpZW50X2FuZF9jb25uZWN0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQpCit7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IE5VTEw7CisJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkKKwkgICAgJiYgY3NyX2lzX2Nvbm5fc3RhdGVfaW5mcmEocE1hYywgc2Vzc2lvbklkKSkgeworCQlwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworCQlpZiAoTlVMTCAhPSBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKSB7CisJCQlpZiAoKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEgPT0KKwkJCSAgICAgQ0RGX1NUQV9NT0RFKQorCQkJICAgIHx8IChwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hID09CisJCQkJQ0RGX1AyUF9DTElFTlRfTU9ERSkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIGNzcl9nZXRfY29uY3VycmVudF9vcGVyYXRpb25fY2hhbm5lbCgpIC0gVG8gZ2V0IGNvbmN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwKKyAqIEBtYWNfY3R4OiBQb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgcmV0dXJuIG9wZXJhdGluZyBjaGFubmVsIG9uIEZJUlNUIEJTUyB0aGF0IGlzCisgKiBhY3RpdmUvb3BlcmF0aW5nIHRvIGJlIHVzZWQgZm9yIGNvbmN1cnJlbmN5IG1vZGUuCisgKiBJZiBvdGhlciBCU1MgaXMgbm90IHVwIG9yIG5vdCBjb25uZWN0ZWQgaXQgd2lsbCByZXR1cm4gMAorICoKKyAqIFJldHVybjogdWludDhfdAorICovCit1aW50OF90IGNzcl9nZXRfY29uY3VycmVudF9vcGVyYXRpb25fY2hhbm5lbCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4KQoreworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisJdWludDhfdCBpID0gMDsKKwl0Q0RGX0NPTl9NT0RFIHBlcnNvbmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKykgeworCQlpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKG1hY19jdHgsIGkpKQorCQkJY29udGludWU7CisJCXNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgaSk7CisJCWlmIChOVUxMID09IHNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkKKwkJCWNvbnRpbnVlOworCQlwZXJzb25hID0gc2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hOworCQlpZiAoKCgocGVyc29uYSA9PSBDREZfU1RBX01PREUpIHx8CisJCQkocGVyc29uYSA9PSBDREZfUDJQX0NMSUVOVF9NT0RFKSkgJiYKKwkJCShzZXNzaW9uLT5jb25uZWN0U3RhdGUgPT0KKwkJCQllQ1NSX0FTU09DX1NUQVRFX1RZUEVfSU5GUkFfQVNTT0NJQVRFRCkpIHx8CisJCQkoKChwZXJzb25hID09IENERl9QMlBfR09fTU9ERSkgfHwKKwkJCQkocGVyc29uYSA9PSBDREZfU0FQX01PREUpKQorCQkJCSAmJiAoc2Vzc2lvbi0+Y29ubmVjdFN0YXRlICE9CisJCQkJCSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfTk9UX0NPTk5FQ1RFRCkpKQorCQkJcmV0dXJuIHNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUub3BlcmF0aW9uQ2hhbm5lbDsKKworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9NQ0NfVE9fU0NDX1NXSVRDSAorCisjZGVmaW5lIEhBTEZfQldfT0YoZUNTUl9id192YWwpICgoZUNTUl9id192YWwpLzIpCisKKy8qIGNhbGN1bGF0aW9uIG9mIGNlbnRlciBjaGFubmVsIGJhc2VkIG9uIFYvSFQgQlcgYW5kIFdJRkkgY2hhbm5lbCBidz01TUh6KSAqLworCisjZGVmaW5lIENTUl9HRVRfSFQ0MF9QTFVTX0NDSChvY2gpICgob2NoKSsyKQorI2RlZmluZSBDU1JfR0VUX0hUNDBfTUlOVVNfQ0NIKG9jaCkgKChvY2gpLTIpCisKKyNkZWZpbmUgQ1NSX0dFVF9IVDgwX1BMVVNfTExfQ0NIKG9jaCkgKChvY2gpKzYpCisjZGVmaW5lIENTUl9HRVRfSFQ4MF9QTFVTX0hMX0NDSChvY2gpICgob2NoKSsyKQorI2RlZmluZSBDU1JfR0VUX0hUODBfTUlOVVNfTEhfQ0NIKG9jaCkgKChvY2gpLTIpCisjZGVmaW5lIENTUl9HRVRfSFQ4MF9NSU5VU19ISF9DQ0gob2NoKSAoKG9jaCktNikKKworLyoqCisgKiBjc3JfZ2V0X2NoX2Zyb21faHRfcHJvZmlsZSgpIC0gdG8gZ2V0IGNoYW5uZWwgZnJvbSBIVCBwcm9maWxlCisgKiBAcE1hYzogcG9pbnRlciB0byBNYWMgY29udGV4dAorICogQGh0cDogcG9pbnRlciB0byBIVCBwcm9maWxlCisgKiBAb2NoOiBvcGVyYXRpbmcgY2hhbm5lbAorICogQGNmcmVxOiBjaGFubmVsIGZyZXF1ZW5jeQorICogQGhidzogaGFsZiBiYW5kd2lkdGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmlsbCBoYWxmIGJhbmR3aWR0aCBhbmQgY2hhbm5lbCBmcmVxdWVuY3kgYmFzZWQKKyAqIG9uIHRoZSBIVCBwcm9maWxlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgY3NyX2dldF9jaF9mcm9tX2h0X3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJvYW1IVFByb2ZpbGUgKmh0cCwKKwkJCQl1aW50MTZfdCBvY2gsIHVpbnQxNl90ICpjZnJlcSwgdWludDE2X3QgKmhidykKK3sKKwl1aW50MTZfdCBjY2gsIGNoX2JvbmQ7CisKKwlpZiAob2NoID4gMTQpCisJCWNoX2JvbmQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNoYW5uZWxCb25kaW5nTW9kZTVHSHo7CisJZWxzZQorCQljaF9ib25kID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGUyNEdIejsKKworCWNjaCA9IG9jaDsKKwkqaGJ3ID0gSEFMRl9CV19PRihlQ1NSX0JXXzIwTUh6X1ZBTCk7CisKKwlpZiAoIWNoX2JvbmQpCisJCWdvdG8gcmV0OworCisJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiIyNIVEM6ICVkIHNjYnc6ICVkIHJjYnc6ICVkIHNjbzogJWQiCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJCQkiVkhUQzogJWQgYXBjOiAlZCBhcGJ3OiAlZCIKKyNlbmRpZgorCQkJICAgICAgKSwKKwkJCWh0cC0+aHRDYXBhYmlsaXR5LCBodHAtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0LAorCQkJaHRwLT5odFJlY29tbWVuZGVkVHhXaWR0aFNldCwKKwkJCWh0cC0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0LAorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJCQlodHAtPnZodENhcGFiaWxpdHksIGh0cC0+YXBDZW50ZXJDaGFuLCBodHAtPmFwQ2hhbldpZHRoCisjZW5kaWYKKwkgICAgICAgKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJaWYgKGh0cC0+dmh0Q2FwYWJpbGl0eSkgeworCQljY2ggPSBodHAtPmFwQ2VudGVyQ2hhbjsKKwkJaWYgKGh0cC0+YXBDaGFuV2lkdGggPT0gV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF84ME1IWikKKwkJCSpoYncgPSBIQUxGX0JXX09GKGVDU1JfQldfODBNSHpfVkFMKTsKKwkJZWxzZSBpZiAoaHRwLT5hcENoYW5XaWR0aCA9PSBXTklfQ0ZHX1ZIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWikKKwkJCSpoYncgPSBIQUxGX0JXX09GKGVDU1JfQldfMTYwTUh6X1ZBTCk7CisKKwkJaWYgKCEqaGJ3ICYmIGh0cC0+aHRDYXBhYmlsaXR5KSB7CisJCQlpZiAoaHRwLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9PQorCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaKQorCQkJCSpoYncgPSBIQUxGX0JXX09GKGVDU1JfQldfNDBNSHpfVkFMKTsKKwkJCWVsc2UKKwkJCQkqaGJ3ID0gSEFMRl9CV19PRihlQ1NSX0JXXzIwTUh6X1ZBTCk7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCQlpZiAoaHRwLT5odENhcGFiaWxpdHkpIHsKKwkJCWlmIChodHAtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID09CisJCQkJCWVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaKSB7CisJCQkJKmhidyA9IEhBTEZfQldfT0YoZUNTUl9CV180ME1Iel9WQUwpOworCQkJCWlmIChodHAtPmh0U2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9PQorCQkJCQlQSFlfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlkpCisJCQkJCWNjaCA9IENTUl9HRVRfSFQ0MF9QTFVTX0NDSChvY2gpOworCQkJCWVsc2UgaWYgKGh0cC0+aHRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID09CisJCQkJCVBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlkpCisJCQkJCWNjaCA9IENTUl9HRVRfSFQ0MF9NSU5VU19DQ0gob2NoKTsKKwkJCX0gZWxzZSB7CisJCQkJY2NoID0gb2NoOworCQkJCSpoYncgPSBIQUxGX0JXX09GKGVDU1JfQldfMjBNSHpfVkFMKTsKKwkJCX0KKwkJfQorCityZXQ6CisJKmNmcmVxID0gY2RzX2NoYW5fdG9fZnJlcShjY2gpOworCXJldHVybjsKK30KKworLyoqCisgKiBjc3JfY2FsY19jaGJfZm9yX3NhcF9waHltb2RlKCkgLSB0byBjYWxjIGNoYW5uZWwgYmFuZHdpZHRoIGZvciBzYXAgcGh5bW9kZQorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqIEBzYXBfY2g6IFNBUCBvcGVyYXRpbmcgY2hhbm5lbAorICogQHNhcF9waHltb2RlOiBTQVAgcGh5c2ljYWwgbW9kZQorICogQHNhcF9jY2g6IGNvbmN1cnJlbmN5IGNoYW5uZWwKKyAqIEBzYXBfaGJ3OiBTQVAgaGFsZiBidworICogQGNoYjogY2hhbm5lbCBiYW5kd2lkdGgKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGNhbGN1bGF0ZSBjaGFubmVsIGJhbmR3aWR0aAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCBjc3JfY2FsY19jaGJfZm9yX3NhcF9waHltb2RlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQxNl90ICpzYXBfY2gsIGVDc3JQaHlNb2RlICpzYXBfcGh5bW9kZSwKKwkJdWludDE2X3QgKnNhcF9jY2gsIHVpbnQxNl90ICpzYXBfaGJ3LCB1aW50OF90ICpjaGIpCit7CisJaWYgKCpzYXBfcGh5bW9kZSA9PSBlQ1NSX0RPVDExX01PREVfMTFuIHx8CisJCQkqc2FwX3BoeW1vZGUgPT0gZUNTUl9ET1QxMV9NT0RFXzExbl9PTkxZKSB7CisKKwkJKnNhcF9oYncgPSBIQUxGX0JXX09GKGVDU1JfQldfNDBNSHpfVkFMKTsKKwkJaWYgKCpjaGIgPT0gUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZKQorCQkJKnNhcF9jY2ggPSBDU1JfR0VUX0hUNDBfUExVU19DQ0goKnNhcF9jaCk7CisJCWVsc2UgaWYgKCpjaGIgPT0gUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWSkKKwkJCSpzYXBfY2NoID0gQ1NSX0dFVF9IVDQwX01JTlVTX0NDSCgqc2FwX2NoKTsKKworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWVsc2UgaWYgKCpzYXBfcGh5bW9kZSA9PSBlQ1NSX0RPVDExX01PREVfMTFhYyB8fAorCQkJKnNhcF9waHltb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMWFjX09OTFkpIHsKKwkJLyoxMUFDIG9ubHkgODAvNDAvMjAgTWh6IHN1cHBvcnRlZCBpbiBSb21lICovCisJCWlmIChtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLm5WaHRDaGFubmVsV2lkdGggPT0KKwkJCQkoV05JX0NGR19WSFRfQ0hBTk5FTF9XSURUSF84ME1IWiArIDEpKSB7CisJCQkqc2FwX2hidyA9IEhBTEZfQldfT0YoZUNTUl9CV184ME1Iel9WQUwpOworCQkJaWYgKCpjaGIgPT0KKwkJCQkoUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9MT1cgLSAxKSkKKwkJCQkqc2FwX2NjaCA9IENTUl9HRVRfSFQ4MF9QTFVTX0xMX0NDSCgqc2FwX2NoKTsKKwkJCWVsc2UgaWYgKCpjaGIgPT0KKwkJCQkoUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfTE9XCisJCQkJICAgICAtIDEpKQorCQkJCSpzYXBfY2NoID0gQ1NSX0dFVF9IVDgwX1BMVVNfSExfQ0NIKCpzYXBfY2gpOworCQkJZWxzZSBpZiAoKmNoYiA9PQorCQkJCSAoUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0xPV180ME1IWl9ISUdICisJCQkJICAgICAtIDEpKQorCQkJCSpzYXBfY2NoID0gQ1NSX0dFVF9IVDgwX01JTlVTX0xIX0NDSCgqc2FwX2NoKTsKKwkJCWVsc2UgaWYgKCpjaGIgPT0KKwkJCQkoUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfSElHSAorCQkJCSAgICAgLSAxKSkKKwkJCQkqc2FwX2NjaCA9IENTUl9HRVRfSFQ4MF9NSU5VU19ISF9DQ0goKnNhcF9jaCk7CisJCX0gZWxzZSB7CisJCQkqc2FwX2hidyA9IEhBTEZfQldfT0YoZUNTUl9CV180ME1Iel9WQUwpOworCQkJaWYgKCpjaGIgPT0gKFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfTE9XCisJCQkJCS0gMSkpCisJCQkJKnNhcF9jY2ggPSBDU1JfR0VUX0hUNDBfUExVU19DQ0goKnNhcF9jaCk7CisJCQllbHNlIGlmICgqY2hiID09CisJCQkJKFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0xPVworCQkJCSAgICAgLSAxKSkKKwkJCQkqc2FwX2NjaCA9IENTUl9HRVRfSFQ0MF9NSU5VU19DQ0goKnNhcF9jaCk7CisJCQllbHNlIGlmICgqY2hiID09CisJCQkJKFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfSElHSAorCQkJCSAgICAgLSAxKSkKKwkJCQkqc2FwX2NjaCA9IENTUl9HRVRfSFQ0MF9QTFVTX0NDSCgqc2FwX2NoKTsKKwkJCWVsc2UgaWYgKCpjaGIgPT0KKwkJCQkoUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfSElHSAorCQkJCSAgICAgLSAxKSkKKwkJCQkqc2FwX2NjaCA9IENTUl9HRVRfSFQ0MF9NSU5VU19DQ0goKnNhcF9jaCk7CisJCX0KKwl9CisjZW5kaWYKK30KKworLyoqCisgKiBjc3JfaGFuZGxlX2NvbmNfY2hubF9vdmVybGFwX2Zvcl9zYXBfZ28gLSBUbyBoYW5kbGUgb3ZlcmxhcCBmb3IgQVArQVAKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKiBAc2Vzc2lvbjogQ3VycmVudCBzZXNzaW9uCisgKiBAc2FwX2NoOiBTQVAvR08gb3BlcmF0aW5nIGNoYW5uZWwKKyAqIEBzYXBfaGJ3OiBTQVAvR08gaGFsZiBidworICogQHNhcF9jZnJlcTogU0FQL0dPIGNoYW5uZWwgZnJlcXVlbmN5CisgKiBAaW50Zl9jaDogY29uY3VycmVudCBTQVAvR08gb3BlcmF0aW5nIGNoYW5uZWwKKyAqIEBpbnRmX2hidzogY29uY3VycmVudCBTQVAvR08gaGFsZiBidworICogQGludGZfY2ZyZXE6IGNvbmN1cnJlbnQgU0FQL0dPIGNoYW5uZWwgZnJlcXVlbmN5CisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBjaGVjayBpZiBvbmUgU0FQL0dPIGNoYW5uZWwgaXMgb3ZlcmxhcHBpbmcgd2l0aAorICogb3RoZXIgU0FQL0dPIGNoYW5uZWwKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgY3NyX2hhbmRsZV9jb25jX2Nobmxfb3ZlcmxhcF9mb3Jfc2FwX2dvKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiwKKwkJdWludDE2X3QgKnNhcF9jaCwgdWludDE2X3QgKnNhcF9oYncsIHVpbnQxNl90ICpzYXBfY2ZyZXEsCisJCXVpbnQxNl90ICppbnRmX2NoLCB1aW50MTZfdCAqaW50Zl9oYncsIHVpbnQxNl90ICppbnRmX2NmcmVxKQoreworCS8qCisJICogaWYgY29uY19jdXN0b21fcnVsZTEgaXMgZGVmaW5lZCB0aGVuIHdlIGRvbid0CisJICogd2FudCBwMnBnbyB0byBmb2xsb3cgU0FQJ3MgY2hhbm5lbCBvciBTQVAgdG8KKwkgKiBmb2xsb3cgUDJQR08ncyBjaGFubmVsLgorCSAqLworCWlmICgwID09IG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uY29uY19jdXN0b21fcnVsZTEgJiYKKwkJMCA9PSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmNvbmNfY3VzdG9tX3J1bGUyKSB7CisJCWlmICgqc2FwX2NoID09IDApIHsKKwkJCSpzYXBfY2ggPSBzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWw7CisJCQljc3JfZ2V0X2NoX2Zyb21faHRfcHJvZmlsZShtYWNfY3R4LAorCQkJCSZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkhUUHJvZmlsZSwKKwkJCQkqc2FwX2NoLCBzYXBfY2ZyZXEsIHNhcF9oYncpOworCQl9IGVsc2UgaWYgKCpzYXBfY2ggIT0KKwkJCQlzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWwpIHsKKwkJCSppbnRmX2NoID0gc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsOworCQkJY3NyX2dldF9jaF9mcm9tX2h0X3Byb2ZpbGUobWFjX2N0eCwKKwkJCQkJJnNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuSFRQcm9maWxlLAorCQkJCQkqaW50Zl9jaCwgaW50Zl9jZnJlcSwgaW50Zl9oYncpOworCQl9CisJfSBlbHNlIGlmICgqc2FwX2NoID09IDAgJiYKKwkJCShzZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEgPT0KKwkJCQkJQ0RGX1NBUF9NT0RFKSkgeworCQkqc2FwX2NoID0gc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsOworCQljc3JfZ2V0X2NoX2Zyb21faHRfcHJvZmlsZShtYWNfY3R4LAorCQkJCSZzZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkhUUHJvZmlsZSwKKwkJCQkqc2FwX2NoLCBzYXBfY2ZyZXEsIHNhcF9oYncpOworCX0KK30KKworCisvKioKKyAqIGNzcl9jaGVja19jb25jdXJyZW50X2NoYW5uZWxfb3ZlcmxhcCgpIC0gVG8gY2hlY2sgY29uY3VycmVudCBvdmVybGFwIGNobmxzCisgKiBAbWFjX2N0eDogUG9pbnRlciB0byBtYWMgY29udGV4dAorICogQHNhcF9jaDogU0FQIGNoYW5uZWwKKyAqIEBzYXBfcGh5bW9kZTogU0FQIHBoeSBtb2RlCisgKiBAY2Nfc3dpdGNoX21vZGU6IGNvbmN1cnJlbnQgc3dpdGNoIG1vZGUKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgdG8gY2hlY2sgY29uY3VycmVudCBvdmVybGFwIGNoYW5uZWxzCisgKgorICogUmV0dXJuOiB1aW50MTZfdAorICovCit1aW50MTZfdCBjc3JfY2hlY2tfY29uY3VycmVudF9jaGFubmVsX292ZXJsYXAodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCXVpbnQxNl90IHNhcF9jaCwgZUNzclBoeU1vZGUgc2FwX3BoeW1vZGUsCisJCQl1aW50OF90IGNjX3N3aXRjaF9tb2RlKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisJdWludDhfdCBpID0gMCwgY2hiID0gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCXVpbnQxNl90IGludGZfY2ggPSAwLCBzYXBfaGJ3ID0gMCwgaW50Zl9oYncgPSAwLCBpbnRmX2NmcmVxID0gMDsKKwl1aW50MTZfdCBzYXBfY2ZyZXEgPSAwOworCXVpbnQxNl90IHNhcF9sZnJlcSwgc2FwX2hmcmVxLCBpbnRmX2xmcmVxLCBpbnRmX2hmcmVxLCBzYXBfY2NoOworCisJaWYgKG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uY2Nfc3dpdGNoX21vZGUgPT0KKwkJCUNERl9NQ0NfVE9fU0NDX1NXSVRDSF9ESVNBQkxFKQorCQlyZXR1cm4gMDsKKworCWlmIChzYXBfY2ggIT0gMCkgeworCQlzYXBfY2NoID0gc2FwX2NoOworCQlzYXBfaGJ3ID0gSEFMRl9CV19PRihlQ1NSX0JXXzIwTUh6X1ZBTCk7CisKKwkJaWYgKHNhcF9jaCA+IDE0KQorCQkJY2hiID0gbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGU1R0h6OworCQllbHNlCisJCQljaGIgPSBtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmNoYW5uZWxCb25kaW5nTW9kZTI0R0h6OworCisJCWlmIChjaGIpCisJCQljc3JfY2FsY19jaGJfZm9yX3NhcF9waHltb2RlKG1hY19jdHgsICZzYXBfY2gsCisJCQkJCSZzYXBfcGh5bW9kZSwgJnNhcF9jY2gsICZzYXBfaGJ3LCAmY2hiKTsKKwkJc2FwX2NmcmVxID0gY2RzX2NoYW5fdG9fZnJlcShzYXBfY2NoKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKykgeworCQlpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKG1hY19jdHgsIGkpKQorCQkJY29udGludWU7CisKKwkJc2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBpKTsKKwkJaWYgKE5VTEwgPT0gc2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKQorCQkJY29udGludWU7CisJCWlmICgoKHNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+Y3NyUGVyc29uYSA9PSBDREZfU1RBX01PREUpIHx8CisJCQkoc2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hID09CisJCQkJQ0RGX1AyUF9DTElFTlRfTU9ERSkpICYmCisJCQkoc2Vzc2lvbi0+Y29ubmVjdFN0YXRlID09CisJCQkJZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lORlJBX0FTU09DSUFURUQpKSB7CisJCQlpbnRmX2NoID0gc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsOworCQkJY3NyX2dldF9jaF9mcm9tX2h0X3Byb2ZpbGUobWFjX2N0eCwKKwkJCQkmc2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5IVFByb2ZpbGUsCisJCQkJaW50Zl9jaCwgJmludGZfY2ZyZXEsICZpbnRmX2hidyk7CisJCX0gZWxzZSBpZiAoKChzZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEgPT0KKwkJCQkJQ0RGX1AyUF9HT19NT0RFKSB8fAorCQkJCShzZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEgPT0KKwkJCQkJQ0RGX1NBUF9NT0RFKSkgJiYKKwkJCQkoc2Vzc2lvbi0+Y29ubmVjdFN0YXRlICE9CisJCQkJCWVDU1JfQVNTT0NfU1RBVEVfVFlQRV9OT1RfQ09OTkVDVEVEKSkgeworCQkJCWNzcl9oYW5kbGVfY29uY19jaG5sX292ZXJsYXBfZm9yX3NhcF9nbyhtYWNfY3R4LAorCQkJCQlzZXNzaW9uLCAmc2FwX2NoLCAmc2FwX2hidywgJnNhcF9jZnJlcSwKKwkJCQkJJmludGZfY2gsICZpbnRmX2hidywgJmludGZfY2ZyZXEpOworCQl9CisJfQorCisJaWYgKGludGZfY2ggJiYgc2FwX2NoICE9IGludGZfY2ggJiYKKwkJCWNjX3N3aXRjaF9tb2RlICE9IENERl9NQ0NfVE9fU0NDX1NXSVRDSF9GT1JDRSkgeworCQlzYXBfbGZyZXEgPSBzYXBfY2ZyZXEgLSBzYXBfaGJ3OworCQlzYXBfaGZyZXEgPSBzYXBfY2ZyZXEgKyBzYXBfaGJ3OworCQlpbnRmX2xmcmVxID0gaW50Zl9jZnJlcSAtIGludGZfaGJ3OworCQlpbnRmX2hmcmVxID0gaW50Zl9jZnJlcSArIGludGZfaGJ3OworCisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJcblNBUDogIE9DSDogJTAzZCBPQ0Y6ICVkIENDSDogJTAzZCBDRjogJWQgQlc6ICVkIExGOiAlZCBIRjogJWRcbiIKKwkJCSJJTlRGOiBPQ0g6ICUwM2QgT0NGOiAlZCBDQ0g6ICUwM2QgQ0Y6ICVkIEJXOiAlZCBMRjogJWQgSEY6ICVkIiksCisJCQlzYXBfY2gsIGNkc19jaGFuX3RvX2ZyZXEoc2FwX2NoKSwKKwkJCWNkc19mcmVxX3RvX2NoYW4oc2FwX2NmcmVxKSwgc2FwX2NmcmVxLCBzYXBfaGJ3ICogMiwKKwkJCXNhcF9sZnJlcSwgc2FwX2hmcmVxLCBpbnRmX2NoLAorCQkJY2RzX2NoYW5fdG9fZnJlcShpbnRmX2NoKSwgY2RzX2ZyZXFfdG9fY2hhbihpbnRmX2NmcmVxKSwKKwkJCWludGZfY2ZyZXEsIGludGZfaGJ3ICogMiwgaW50Zl9sZnJlcSwgaW50Zl9oZnJlcSk7CisKKwkJaWYgKCEoKChzYXBfbGZyZXEgPiBpbnRmX2xmcmVxICYmIHNhcF9sZnJlcSA8IGludGZfaGZyZXEpIHx8CisJCQkoc2FwX2hmcmVxID4gaW50Zl9sZnJlcSAmJiBzYXBfaGZyZXEgPCBpbnRmX2hmcmVxKSkgfHwKKwkJCSgoaW50Zl9sZnJlcSA+IHNhcF9sZnJlcSAmJiBpbnRmX2xmcmVxIDwgc2FwX2hmcmVxKSB8fAorCQkJKGludGZfaGZyZXEgPiBzYXBfbGZyZXEgJiYgaW50Zl9oZnJlcSA8IHNhcF9oZnJlcSkpKSkKKwkJCWludGZfY2ggPSAwOworCX0gZWxzZSBpZiAoaW50Zl9jaCAmJiBzYXBfY2ggIT0gaW50Zl9jaCAmJgorCQkJCWNjX3N3aXRjaF9tb2RlID09IENERl9NQ0NfVE9fU0NDX1NXSVRDSF9GT1JDRSkgeworCQlpZiAoISgoaW50Zl9jaCA8IDE0ICYmIHNhcF9jaCA8IDE0KSB8fAorCQkJKGludGZfY2ggPiAxNCAmJiBzYXBfY2ggPiAxNCkpKQorCQkJaW50Zl9jaCA9IDA7CisJfSBlbHNlIGlmIChpbnRmX2NoID09IHNhcF9jaCkgeworCQlpbnRmX2NoID0gMDsKKwl9CisKKwlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCIjI0NvbmN1cnJlbnQgQ2hhbm5lbHMgJXMgSW50ZXJmZXJpbmciKSwKKwkJaW50Zl9jaCA9PSAwID8gIk5vdCIgOiAiQXJlIik7CisJcmV0dXJuIGludGZfY2g7Cit9CisjZW5kaWYKKworYm9vbCBjc3JfaXNfYWxsX3Nlc3Npb25fZGlzY29ubmVjdGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDMyX3QgaTsKKwlib29sIGZSYyA9IHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKykgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgaSkKKwkJICAgICYmICFjc3JfaXNfY29ubl9zdGF0ZV9kaXNjb25uZWN0ZWQocE1hYywgaSkpIHsKKwkJCWZSYyA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZlJjOworfQorCisvKioKKyAqIGNzcl9pc19zdGFfc2Vzc2lvbl9jb25uZWN0ZWQoKSAtIHRvIGZpbmQgaWYgY29uY3VycmVudCBzdGEgaXMgYWN0aXZlCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBtYWMgY29udGV4dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpdGVyYXRlIHRocm91Z2ggZWFjaCBzZXNzaW9uIGFuZCBjaGVjayBpZiBzdGEKKyAqIHNlc3Npb24gZXhpc3QgYW5kIGFjdGl2ZQorICoKKyAqIFJldHVybjogdHJ1ZSBvciBmYWxzZQorICovCitib29sIGNzcl9pc19zdGFfc2Vzc2lvbl9jb25uZWN0ZWQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCkKK3sKKwl1aW50MzJfdCBpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKG1hY19jdHgsIGkpICYmCisJCQkhY3NyX2lzX2Nvbm5fc3RhdGVfZGlzY29ubmVjdGVkKG1hY19jdHgsIGkpKSB7CisJCQlwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihtYWNfY3R4LCBpKTsKKworCQkJaWYgKChOVUxMICE9IHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpICYmCisJCQkJKENERl9TVEFfTU9ERSA9PQorCQkJCQlwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBjc3JfaXNfcDJwX3Nlc3Npb25fY29ubmVjdGVkKCkgLSB0byBmaW5kIGlmIGFueSBwMnAgc2Vzc2lvbiBpcyBhY3RpdmUKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIHNlc3Npb24gYW5kIGNoZWNrIGlmIGFueSBwMnAKKyAqIHNlc3Npb24gZXhpc3QgYW5kIGFjdGl2ZQorICoKKyAqIFJldHVybjogdHJ1ZSBvciBmYWxzZQorICovCitib29sIGNzcl9pc19wMnBfc2Vzc2lvbl9jb25uZWN0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwl1aW50MzJfdCBpOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBOVUxMOworCXRDREZfQ09OX01PREUgcGVyc29uYTsKKworCWZvciAoaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBpKQorCQkgICAgJiYgIWNzcl9pc19jb25uX3N0YXRlX2Rpc2Nvbm5lY3RlZChwTWFjLCBpKSkgeworCQkJcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgaSk7CisJCQlwZXJzb25hID0gcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+Y3NyUGVyc29uYTsKKwkJCWlmICgoTlVMTCAhPSBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKSAmJgorCQkJCSgoQ0RGX1AyUF9DTElFTlRfTU9ERSA9PSBwZXJzb25hKSB8fAorCQkJCShDREZfUDJQX0dPX01PREUgPT0gcGVyc29uYSkpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgY3NyX2lzX2FueV9zZXNzaW9uX2Nvbm5lY3RlZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQzMl90IGksIGNvdW50OworCWJvb2wgZlJjID0gZmFsc2U7CisKKwljb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIGkpCisJCSAgICAmJiAhY3NyX2lzX2Nvbm5fc3RhdGVfZGlzY29ubmVjdGVkKHBNYWMsIGkpKQorCQkJY291bnQrKzsKKwl9CisKKwlpZiAoY291bnQgPiAwKQorCQlmUmMgPSB0cnVlOworCXJldHVybiBmUmM7Cit9CisKK2Jvb2wgY3NyX2lzX2luZnJhX2Nvbm5lY3RlZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQzMl90IGk7CisJYm9vbCBmUmMgPSBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBpKQorCQkgICAgJiYgY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2luZnJhKHBNYWMsIGkpKSB7CisJCQlmUmMgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZlJjOworfQorCitib29sIGNzcl9pc19jb25jdXJyZW50X2luZnJhX2Nvbm5lY3RlZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQzMl90IGksIG5vT2ZDb25uZWN0ZWRJbmZyYSA9IDA7CisKKwlib29sIGZSYyA9IGZhbHNlOworCisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIGkpCisJCSAgICAmJiBjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWRfaW5mcmEocE1hYywgaSkpIHsKKwkJCSsrbm9PZkNvbm5lY3RlZEluZnJhOworCQl9CisJfQorCisJLyogTW9yZSB0aGFuIG9uZSBJbmZyYSBTdGEgQ29ubmVjdGVkICovCisJaWYgKG5vT2ZDb25uZWN0ZWRJbmZyYSA+IDEpCisJCWZSYyA9IHRydWU7CisJcmV0dXJuIGZSYzsKK30KKworYm9vbCBjc3JfaXNfaWJzc19zdGFydGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDMyX3QgaTsKKwlib29sIGZSYyA9IGZhbHNlOworCisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIGkpCisJCSAgICAmJiBjc3JfaXNfY29ubl9zdGF0ZV9pYnNzKHBNYWMsIGkpKSB7CisJCQlmUmMgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZlJjOworfQorCitib29sIGNzcl9pc19idGFtcF9zdGFydGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDMyX3QgaTsKKwlib29sIGZSYyA9IGZhbHNlOworCisJZm9yIChpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIGkpCisJCSAgICAmJiBjc3JfaXNfY29ubl9zdGF0ZV9jb25uZWN0ZWRfd2RzKHBNYWMsIGkpKSB7CisJCQlmUmMgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZlJjOworfQorCitib29sIGNzcl9pc19jb25jdXJyZW50X3Nlc3Npb25fcnVubmluZyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQzMl90IHNlc3Npb25JZCwgbm9PZkNvY3VycmVudFNlc3Npb24gPSAwOworCWVDc3JDb25uZWN0U3RhdGUgY29ubmVjdFN0YXRlOworCisJYm9vbCBmUmMgPSBmYWxzZTsKKworCWZvciAoc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IHNlc3Npb25JZCsrKSB7CisJCWlmIChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQljb25uZWN0U3RhdGUgPQorCQkJCXBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGU7CisJCQlpZiAoKGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JTkZSQV9BU1NPQ0lBVEVEID09CisJCQkgICAgIGNvbm5lY3RTdGF0ZSkKKwkJCSAgICB8fCAoZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lORlJBX0NPTk5FQ1RFRCA9PQorCQkJCWNvbm5lY3RTdGF0ZSkKKwkJCSAgICB8fCAoZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lORlJBX0RJU0NPTk5FQ1RFRCA9PQorCQkJCWNvbm5lY3RTdGF0ZSkpIHsKKwkJCQkrK25vT2ZDb2N1cnJlbnRTZXNzaW9uOworCQkJfQorCQl9CisJfQorCisJLyogTW9yZSB0aGFuIG9uZSBzZXNzaW9uIGlzIFVwIGFuZCBSdW5uaW5nICovCisJaWYgKG5vT2ZDb2N1cnJlbnRTZXNzaW9uID4gMSkKKwkJZlJjID0gdHJ1ZTsKKwlyZXR1cm4gZlJjOworfQorCitib29sIGNzcl9pc19pbmZyYV9hcF9zdGFydGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJdWludDMyX3Qgc2Vzc2lvbklkOworCWJvb2wgZlJjID0gZmFsc2U7CisKKwlmb3IgKHNlc3Npb25JZCA9IDA7IHNlc3Npb25JZCA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBzZXNzaW9uSWQrKykgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKQorCQkgICAgJiYgKGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF9pbmZyYV9hcChwTWFjLCBzZXNzaW9uSWQpKSkgeworCQkJZlJjID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGZSYzsKKworfQorCitib29sIGNzcl9pc19idGFtcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJcmV0dXJuIGNzcl9pc19jb25uX3N0YXRlX2Nvbm5lY3RlZF93ZHMocE1hYywgc2Vzc2lvbklkKTsKK30KKworYm9vbCBjc3JfaXNfY29ubl9zdGF0ZV9kaXNjb25uZWN0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCXJldHVybiBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfTk9UX0NPTk5FQ1RFRCA9PQorCSAgICAgICBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlOworfQorCisvKioKKyAqIGNzcl9pc192YWxpZF9tY19jb25jdXJyZW50X3Nlc3Npb24oKSAtIFRvIGNoZWNrIGNvbmN1cnJlbiBzZXNzaW9uIGlzIHZhbGlkCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBtYWMgY29udGV4dAorICogQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqIEBic3NfZGVzY3I6IGJzcyBkZXNjcmlwdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHRoZSBjb25jdXJyZW50IHNlc3Npb24KKyAqCisgKiBSZXR1cm46IHRydWUgb3IgZmFsc2UKKyAqLworYm9vbCBjc3JfaXNfdmFsaWRfbWNfY29uY3VycmVudF9zZXNzaW9uKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQzMl90IHNlc3Npb25faWQsCisJCXRTaXJCc3NEZXNjcmlwdGlvbiAqYnNzX2Rlc2NyKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBOVUxMOworCisJLyogQ2hlY2sgZm9yIE1DQyBzdXBwb3J0ICovCisJaWYgKCFtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLmZlbmFibGVNQ0NNb2RlKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKCFDU1JfSVNfU0VTU0lPTl9WQUxJRChtYWNfY3R4LCBzZXNzaW9uX2lkKSkKKwkJcmV0dXJuIGZhbHNlOworCS8qIFZhbGlkYXRlIEJlYWNvbkludGVydmFsICovCisJcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbl9pZCk7CisJaWYgKE5VTEwgPT0gcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0KKwkJY3NyX2lzY29uY3VycmVudHNlc3Npb25fdmFsaWQobWFjX2N0eCwgc2Vzc2lvbl9pZCwKKwkJCXBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEpKSB7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0KKwkJCWNzcl92YWxpZGF0ZV9tY2NfYmVhY29uX2ludGVydmFsKG1hY19jdHgsCisJCQkJYnNzX2Rlc2NyLT5jaGFubmVsSWQsCisJCQkJJmJzc19kZXNjci0+YmVhY29uSW50ZXJ2YWwsIHNlc3Npb25faWQsCisJCQkJcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+Y3NyUGVyc29uYSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdFNpck1hY0NhcGFiaWxpdHlJbmZvIGNzcl9nZXRfYnNzX2NhcGFiaWxpdGllcyh0U2lyQnNzRGVzY3JpcHRpb24gKgorCQkJCQkJICAgICAgcFNpckJzc0Rlc2MpCit7CisJdFNpck1hY0NhcGFiaWxpdHlJbmZvIGRvdDExQ2FwczsKKworCS8qIHRTaXJNYWNDYXBhYmlsaXR5SW5mbyBpcyAxNi1iaXQgKi8KKwljZGZfZ2V0X3UxNigodWludDhfdCAqKSAmcFNpckJzc0Rlc2MtPmNhcGFiaWxpdHlJbmZvLAorCQkgICAgKHVpbnQxNl90ICopICZkb3QxMUNhcHMpOworCisJcmV0dXJuIGRvdDExQ2FwczsKK30KKworYm9vbCBjc3JfaXNfaW5mcmFfYnNzX2Rlc2ModFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYykKK3sKKwl0U2lyTWFjQ2FwYWJpbGl0eUluZm8gZG90MTFDYXBzID0gY3NyX2dldF9ic3NfY2FwYWJpbGl0aWVzKHBTaXJCc3NEZXNjKTsKKworCXJldHVybiAoYm9vbCkgZG90MTFDYXBzLmVzczsKK30KKworYm9vbCBjc3JfaXNfaWJzc19ic3NfZGVzYyh0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjKQoreworCXRTaXJNYWNDYXBhYmlsaXR5SW5mbyBkb3QxMUNhcHMgPSBjc3JfZ2V0X2Jzc19jYXBhYmlsaXRpZXMocFNpckJzc0Rlc2MpOworCisJcmV0dXJuIChib29sKSBkb3QxMUNhcHMuaWJzczsKK30KKworYm9vbCBjc3JfaXNfcW9fc19ic3NfZGVzYyh0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjKQoreworCXRTaXJNYWNDYXBhYmlsaXR5SW5mbyBkb3QxMUNhcHMgPSBjc3JfZ2V0X2Jzc19jYXBhYmlsaXRpZXMocFNpckJzc0Rlc2MpOworCisJcmV0dXJuIChib29sKSBkb3QxMUNhcHMucW9zOworfQorCitib29sIGNzcl9pc19wcml2YWN5KHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MpCit7CisJdFNpck1hY0NhcGFiaWxpdHlJbmZvIGRvdDExQ2FwcyA9IGNzcl9nZXRfYnNzX2NhcGFiaWxpdGllcyhwU2lyQnNzRGVzYyk7CisKKwlyZXR1cm4gKGJvb2wpIGRvdDExQ2Fwcy5wcml2YWN5OworfQorCitib29sIGNzcl9pczExZF9zdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkOworfQorCitib29sIGNzcl9pczExaF9zdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExaFN1cHBvcnRFbmFibGVkOworfQorCitib29sIGNzcl9pczExZV9zdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKwlyZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZVN1cHBvcnRFbmFibGVkOworfQorCitib29sIGNzcl9pc19tY2Nfc3VwcG9ydGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisJcmV0dXJuIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZmVuYWJsZU1DQ01vZGU7CisKK30KKworYm9vbCBjc3JfaXNfd21tX3N1cHBvcnRlZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCWlmIChlQ3NyUm9hbVdtbU5vUW9zID09IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uV01NU3VwcG9ydE1vZGUpCisJCXJldHVybiBmYWxzZTsKKwllbHNlCisJCXJldHVybiB0cnVlOworfQorCisvKiBwSWVzIGlzIHRoZSBJRXMgZm9yIHBTaXJCc3NEZXNjMiAqLworYm9vbCBjc3JfaXNfc3NpZF9lcXVhbCh0SGFsSGFuZGxlIGhIYWwsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MxLAorCQkgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzIsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMyKQoreworCWJvb2wgZkVxdWFsID0gZmFsc2U7CisJdFNpck1hY1NTaWQgU3NpZDEsIFNzaWQyOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzMSA9IE5VTEw7CisJdERvdDExZkJlYWNvbklFcyAqcEllc0xvY2FsID0gcEllczI7CisKKwlkbyB7CisJCWlmICgoTlVMTCA9PSBwU2lyQnNzRGVzYzEpIHx8IChOVUxMID09IHBTaXJCc3NEZXNjMikpCisJCQlicmVhazsKKwkJaWYgKCFwSWVzTG9jYWwKKwkJICAgICYmCisJCSAgICAhQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMKKwkJCQkJCSAgIChwTWFjLCBwU2lyQnNzRGVzYzIsCisJCQkJCQkgICAgJnBJZXNMb2NhbCkpKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIGZhaWwgdG8gcGFyc2UgSUVzIikpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJCShjc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzKHBNYWMsCisJCQkJcFNpckJzc0Rlc2MxLCAmcEllczEpKSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCghcEllczEtPlNTSUQucHJlc2VudCkgfHwgKCFwSWVzTG9jYWwtPlNTSUQucHJlc2VudCkpCisJCQlicmVhazsKKwkJaWYgKHBJZXMxLT5TU0lELm51bV9zc2lkICE9IHBJZXNMb2NhbC0+U1NJRC5udW1fc3NpZCkKKwkJCWJyZWFrOworCQljZGZfbWVtX2NvcHkoU3NpZDEuc3NJZCwgcEllczEtPlNTSUQuc3NpZCwKKwkJCSAgICAgcEllczEtPlNTSUQubnVtX3NzaWQpOworCQljZGZfbWVtX2NvcHkoU3NpZDIuc3NJZCwgcEllc0xvY2FsLT5TU0lELnNzaWQsCisJCQkgICAgIHBJZXNMb2NhbC0+U1NJRC5udW1fc3NpZCk7CisKKwkJZkVxdWFsID0KKwkJCWNkZl9tZW1fY29tcGFyZShTc2lkMS5zc0lkLCBTc2lkMi5zc0lkLAorCQkJCQlwSWVzTG9jYWwtPlNTSUQubnVtX3NzaWQpOworCisJfSB3aGlsZSAoMCk7CisJaWYgKHBJZXMxKQorCQljZGZfbWVtX2ZyZWUocEllczEpOworCWlmIChwSWVzTG9jYWwgJiYgIXBJZXMyKQorCQljZGZfbWVtX2ZyZWUocEllc0xvY2FsKTsKKworCXJldHVybiBmRXF1YWw7Cit9CisKKy8qIHBJZXMgY2FuIGJlIHBhc3NlZCBpbiBhcyBOVUxMIGlmIHRoZSBjYWxsZXIgZG9lc24ndCBoYXZlIG9uZSBwcmVwYXJlZCAqLworYm9vbCBjc3JfaXNfYnNzX2Rlc2NyaXB0aW9uX3dtZSh0SGFsSGFuZGxlIGhIYWwsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCQkJdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJLyogQXNzdW1lIHRoYXQgV01FIGlzIGZvdW5kLi4uICovCisJYm9vbCBmV21lID0gdHJ1ZTsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzVGVtcCA9IHBJZXM7CisKKwlkbyB7CisJCWlmIChwSWVzVGVtcCA9PSBOVUxMKSB7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJCSAgICAoY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcworCQkJCQkgICAgKHBNYWMsIHBTaXJCc3NEZXNjLCAmcEllc1RlbXApKSkgeworCQkJCWZXbWUgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBpZiB0aGUgV21lIEluZm8gSUUgaXMgZm91bmQsIHRoZW4gV01FIGlzIHN1cHBvcnRlZC4uLiAqLworCQlpZiAoQ1NSX0lTX1FPU19CU1MocEllc1RlbXApKQorCQkJYnJlYWs7CisJCS8qIGlmIG5vbmUgb2YgdGhlc2UgYXJlIGZvdW5kLCB0aGVuIFdNRSBpcyBOT1Qgc3VwcG9ydGVkLi4uICovCisJCWZXbWUgPSBmYWxzZTsKKwl9IHdoaWxlICgwKTsKKwlpZiAoIWNzcl9pc193bW1fc3VwcG9ydGVkKHBNYWMpICYmIGZXbWUpIHsKKwkJaWYgKCFwSWVzVGVtcC0+SFRDYXBzLnByZXNlbnQpIHsKKwkJCWZXbWUgPSBmYWxzZTsKKwkJfQorCX0KKwlpZiAoKHBJZXMgPT0gTlVMTCkgJiYgKE5VTEwgIT0gcEllc1RlbXApKSB7CisJCS8qIHdlIGFsbG9jYXRlIG1lbW9yeSBoZXJlIHNvIGZyZWUgaXQgYmVmb3JlIHJldHVybmluZyAqLworCQljZGZfbWVtX2ZyZWUocEllc1RlbXApOworCX0KKworCXJldHVybiBmV21lOworfQorCitlQ3NyTWVkaWFBY2Nlc3NUeXBlIGNzcl9nZXRfcW9fc19mcm9tX2Jzc19kZXNjKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkJICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCQkJCSAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworCWVDc3JNZWRpYUFjY2Vzc1R5cGUgcW9zVHlwZSA9IGVDU1JfTUVESVVNX0FDQ0VTU19EQ0Y7CisKKwlpZiAoTlVMTCA9PSBwSWVzKSB7CisJCUNERl9BU1NFUlQocEllcyAhPSBOVUxMKTsKKwkJcmV0dXJuIHFvc1R5cGU7CisJfQorCisJZG8geworCQkvKiBpZiB3ZSBmaW5kIFdNTSBpbiB0aGUgQnNzIERlc2NyaXB0aW9uLCB0aGVuIHdlIGxldCB0aGlzICovCisJCS8qIG92ZXJyaWRlIGFuZCB1c2UgV01NLiAqLworCQlpZiAoY3NyX2lzX2Jzc19kZXNjcmlwdGlvbl93bWUoaEhhbCwgcFNpckJzc0Rlc2MsIHBJZXMpKSB7CisJCQlxb3NUeXBlID0gZUNTUl9NRURJVU1fQUNDRVNTX1dNTV9lRENGX0RTQ1A7CisJCX0gZWxzZSB7CisJCQkvKiBpZiB0aGUgUW9TIGJpdCBpcyBvbiwgdGhlbiB0aGUgQVAgaXMgYWR2ZXJ0aXNpbmcgMTFFIFFvUy4uLiAqLworCQkJaWYgKGNzcl9pc19xb19zX2Jzc19kZXNjKHBTaXJCc3NEZXNjKSkgeworCQkJCXFvc1R5cGUgPSBlQ1NSX01FRElVTV9BQ0NFU1NfMTFlX2VEQ0Y7CisJCQl9IGVsc2UgeworCQkJCXFvc1R5cGUgPSBlQ1NSX01FRElVTV9BQ0NFU1NfRENGOworCQkJfQorCQkJLyogc2NhbGUgYmFjayBiYXNlZCBvbiB0aGUgdHlwZXMgdHVybmVkIG9uIGZvciB0aGUgYWRhcHRlci4uLiAqLworCQkJaWYgKGVDU1JfTUVESVVNX0FDQ0VTU18xMWVfZURDRiA9PSBxb3NUeXBlCisJCQkgICAgJiYgIWNzcl9pczExZV9zdXBwb3J0ZWQoaEhhbCkpIHsKKwkJCQlxb3NUeXBlID0gZUNTUl9NRURJVU1fQUNDRVNTX0RDRjsKKwkJCX0KKwkJfQorCisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gcW9zVHlwZTsKK30KKworLyogQ2FsbGVyIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHBJRVN0cnVjdCAqLworQ0RGX1NUQVRVUyBjc3JfcGFyc2VfYnNzX2Rlc2NyaXB0aW9uX2llcyh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywKKwkJCQkJICB0RG90MTFmQmVhY29uSUVzICpwSUVTdHJ1Y3QpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJaW50IGllTGVuID0KKwkJKGludCkocEJzc0Rlc2MtPmxlbmd0aCArIHNpemVvZihwQnNzRGVzYy0+bGVuZ3RoKSAtCisJCSAgICAgIEdFVF9GSUVMRF9PRkZTRVQodFNpckJzc0Rlc2NyaXB0aW9uLCBpZUZpZWxkcykpOworCisJaWYgKGllTGVuID4gMCAmJiBwSUVTdHJ1Y3QpIHsKKwkJaWYgKCFET1QxMUZfRkFJTEVECisJCQkgICAgKGRvdDExZl91bnBhY2tfYmVhY29uX2lfZXMKKwkJCQkgICAgKHBNYWMsICh1aW50OF90ICopIHBCc3NEZXNjLT5pZUZpZWxkcywgaWVMZW4sCisJCQkJICAgIHBJRVN0cnVjdCkpKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGFyc2VkIElFcyB0byB0aGUgY2FsbGVyLiBDYWxsZXIgbXVzdCBmcmVlIHRoZSBtZW1vcnkgKi8KKy8qIGFmdGVyIGl0IGlzIGRvbmUgd2l0aCB0aGUgZGF0YSBvbmx5IGlmIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMgKi8KK0NERl9TVEFUVVMgY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcyh0SGFsSGFuZGxlIGhIYWwsCisJCQkJCSAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLAorCQkJCQkgICAgICAgdERvdDExZkJlYWNvbklFcyAqKnBwSUVTdHJ1Y3QpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJaWYgKHBCc3NEZXNjICYmIHBwSUVTdHJ1Y3QpIHsKKwkJKnBwSUVTdHJ1Y3QgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodERvdDExZkJlYWNvbklFcykpOworCQlpZiAoKCpwcElFU3RydWN0KSAhPSBOVUxMKSB7CisJCQljZGZfbWVtX3NldCgodm9pZCAqKSpwcElFU3RydWN0LAorCQkJCSAgICBzaXplb2YodERvdDExZkJlYWNvbklFcyksIDApOworCQkJc3RhdHVzID0KKwkJCQljc3JfcGFyc2VfYnNzX2Rlc2NyaXB0aW9uX2llcyhoSGFsLCBwQnNzRGVzYywKKwkJCQkJCQkgICAgICAgKnBwSUVTdHJ1Y3QpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCWNkZl9tZW1fZnJlZSgqcHBJRVN0cnVjdCk7CisJCQkJKnBwSUVTdHJ1Y3QgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkiKSk7CisJCQlDREZfQVNTRVJUKDApOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK2Jvb2wgY3NyX2lzX251bGxzc2lkKHVpbnQ4X3QgKnBCc3NTc2lkLCB1aW50OF90IGxlbikKK3sKKwlib29sIGZOdWxsU3NpZCA9IGZhbHNlOworCisJdWludDMyX3QgU3NpZExlbmd0aDsKKwl1aW50OF90ICpwU3NpZFN0cjsKKworCWRvIHsKKwkJaWYgKDAgPT0gbGVuKSB7CisJCQlmTnVsbFNzaWQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwkJLyogQ29uc2lkZXIgMCBvciBzcGFjZSBmb3IgaGlkZGVuIFNTSUQgKi8KKwkJaWYgKDAgPT0gcEJzc1NzaWRbMF0pIHsKKwkJCWZOdWxsU3NpZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJCVNzaWRMZW5ndGggPSBsZW47CisJCXBTc2lkU3RyID0gcEJzc1NzaWQ7CisKKwkJd2hpbGUgKFNzaWRMZW5ndGgpIHsKKwkJCWlmICgqcFNzaWRTdHIpCisJCQkJYnJlYWs7CisKKwkJCXBTc2lkU3RyKys7CisJCQlTc2lkTGVuZ3RoLS07CisJCX0KKworCQlpZiAoMCA9PSBTc2lkTGVuZ3RoKSB7CisJCQlmTnVsbFNzaWQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBmTnVsbFNzaWQ7Cit9CisKK3VpbnQzMl90IGNzcl9nZXRfZnJhZ190aHJlc2godEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCXJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkZyYWdtZW50YXRpb25UaHJlc2hvbGQ7Cit9CisKK3VpbnQzMl90IGNzcl9nZXRfcnRzX3RocmVzaCh0SGFsSGFuZGxlIGhIYWwpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJcmV0dXJuIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUlRTVGhyZXNob2xkOworfQorCitlQ3NyUGh5TW9kZSBjc3JfdHJhbnNsYXRlX3RvX3BoeV9tb2RlX2Zyb21fYnNzX2Rlc2ModFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYykKK3sKKwllQ3NyUGh5TW9kZSBwaHlNb2RlOworCisJc3dpdGNoIChwU2lyQnNzRGVzYy0+bndUeXBlKSB7CisJY2FzZSBlU0lSXzExQV9OV19UWVBFOgorCQlwaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYTsKKwkJYnJlYWs7CisKKwljYXNlIGVTSVJfMTFCX05XX1RZUEU6CisJCXBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFiOworCQlicmVhazsKKworCWNhc2UgZVNJUl8xMUdfTldfVFlQRToKKwkJcGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWc7CisJCWJyZWFrOworCisJY2FzZSBlU0lSXzExTl9OV19UWVBFOgorCQlwaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExbjsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwljYXNlIGVTSVJfMTFBQ19OV19UWVBFOgorCWRlZmF1bHQ6CisJCXBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFhYzsKKyNlbHNlCisJZGVmYXVsdDoKKwkJcGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMW47CisjZW5kaWYKKwkJYnJlYWs7CisJfQorCXJldHVybiBwaHlNb2RlOworfQorCit1aW50MzJfdCBjc3JfdHJhbnNsYXRlX3RvX3duaV9jZmdfZG90MTFfbW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgIGVDc3JDZmdEb3QxMU1vZGUgY3NyRG90MTFNb2RlKQoreworCXVpbnQzMl90IHJldDsKKworCXN3aXRjaCAoY3NyRG90MTFNb2RlKSB7CisJY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFX0FVVE86CisJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCUZMKCIgIFdhcm5pbmc6IHNlZXMgZUNTUl9DRkdfRE9UMTFfTU9ERV9BVVRPICIpKTsKKwkJaWYgKElTX0ZFQVRVUkVfU1VQUE9SVEVEX0JZX0ZXKERPVDExQUMpKQorCQkJcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFXzExQUM7CisJCWVsc2UKKwkJCXJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU47CisJCWJyZWFrOworCWNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE6CisJCXJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUE7CisJCWJyZWFrOworCWNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUI6CisJCXJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUI7CisJCWJyZWFrOworCWNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUc6CisJCXJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUc7CisJCWJyZWFrOworCWNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU46CisJCXJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU47CisJCWJyZWFrOworCWNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUdfT05MWToKKwkJcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFXzExR19PTkxZOworCQlicmVhazsKKwljYXNlIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOX09OTFk6CisJCXJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU5fT05MWTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQUNfT05MWToKKwkJaWYgKElTX0ZFQVRVUkVfU1VQUE9SVEVEX0JZX0ZXKERPVDExQUMpKQorCQkJcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFXzExQUNfT05MWTsKKwkJZWxzZQorCQkJcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFXzExTjsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQUM6CisJCWlmIChJU19GRUFUVVJFX1NVUFBPUlRFRF9CWV9GVyhET1QxMUFDKSkKKwkJCXJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUFDOworCQllbHNlCisJCQlyZXQgPSBXTklfQ0ZHX0RPVDExX01PREVfMTFOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbXNfbG9nKHBNYWMsIExPR1csIEZMKCJkb2Vzbid0IGV4cGVjdCAlZCBhcyBjc3JEbzExTW9kZSIpLAorCQkJY3NyRG90MTFNb2RlKTsKKwkJaWYgKGVDU1JfQkFORF8yNCA9PSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVCYW5kKSB7CisJCQlyZXQgPSBXTklfQ0ZHX0RPVDExX01PREVfMTFHOworCQl9IGVsc2UgeworCQkJcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFXzExQTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGNzcl9nZXRfcGh5X21vZGVfZnJvbV9ic3MoKSAtIEdldCBQaHkgTW9kZQorICogQHBNYWM6ICAgICAgICAgICBHbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBwQlNTRGVzY3JpcHRpb246IEJTUyBEZXNjcmlwdG9yCisgKiBAcFBoeU1vZGU6ICAgICAgICBQaHlzaWNhbCBNb2RlCisgKiBAcEllczogICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBJRSBmaWVsZHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IHJldHVybiB0aGUgc3VwZXIgc2V0IG9mIHN1cHBvcnRlZCBtb2RlcworICogMTFuIGltcGxpZXMgMTFiL2cvYS9uLgorICoKKyAqIFJldHVybjogc3VjY2VzcworICoqLworQ0RGX1NUQVRVUyBjc3JfZ2V0X3BoeV9tb2RlX2Zyb21fYnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJTU0Rlc2NyaXB0aW9uLAorCQllQ3NyUGh5TW9kZSAqcFBoeU1vZGUsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJZUNzclBoeU1vZGUgcGh5TW9kZSA9CisJCWNzcl90cmFuc2xhdGVfdG9fcGh5X21vZGVfZnJvbV9ic3NfZGVzYyhwQlNTRGVzY3JpcHRpb24pOworCisJaWYgKHBJZXMpIHsKKwkJaWYgKHBJZXMtPkhUQ2Fwcy5wcmVzZW50KSB7CisJCQlwaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExbjsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQkJaWYgKElTX0JTU19WSFRfQ0FQQUJMRShwSWVzLT5WSFRDYXBzKSB8fAorCQkJCUlTX0JTU19WSFRfQ0FQQUJMRShwSWVzLT52ZW5kb3IyX2llLlZIVENhcHMpKQorCQkJCXBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFhYzsKKyNlbmRpZgorCQl9CisJCSpwUGh5TW9kZSA9IHBoeU1vZGU7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3JfZ2V0X3BoeV9tb2RlX2luX3VzZSgpIC0gdG8gZ2V0IHBoeW1vZGUKKyAqIEBwaHlNb2RlSW46IHBoeXNpY2FsIG1vZGUKKyAqIEBic3NQaHlNb2RlOiBwaHlzaWNhbCBtb2RlIGluIGJzcworICogQGY1R2h6QmFuZDogNUdoeiBiYW5kCisgKiBAcENmZ0RvdDExTW9kZVRvVXNlOiBkb3QxMSBtb2RlIGluIHVzZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29ycmVjdCBlQ1NSX0NGR19ET1QxMV9NT0RFIGlzIHRoZSB0d28gcGh5TW9kZXMKKyAqIG1hdGNoZXMuIGJzc1BoeU1vZGUgaXMgdGhlIG1vZGUgZGVyaXZlZCBmcm9tIHRoZSBCU1MgZGVzY3JpcHRpb24KKyAqIGY1R2h6QmFuZCBpcyBkZXJpdmVkIGZyb20gdGhlIGNoYW5uZWwgaWQgb2YgQlNTIGRlc2NyaXB0aW9uCisgKgorICogUmV0dXJuOiB0cnVlIG9yIGZhbHNlCisgKi8KK2Jvb2wgY3NyX2dldF9waHlfbW9kZV9pbl91c2UoZUNzclBoeU1vZGUgcGh5TW9kZUluLCBlQ3NyUGh5TW9kZSBic3NQaHlNb2RlLAorCQkJICAgICBib29sIGY1R2h6QmFuZCwgZUNzckNmZ0RvdDExTW9kZSAqcENmZ0RvdDExTW9kZVRvVXNlKQoreworCWJvb2wgZk1hdGNoID0gZmFsc2U7CisJZUNzckNmZ0RvdDExTW9kZSBjZmdEb3QxMU1vZGU7CisJY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisKKwlzd2l0Y2ggKHBoeU1vZGVJbikgeworCS8qIDExYSBvciAxMWIgb3IgMTFnICovCisJY2FzZSBlQ1NSX0RPVDExX01PREVfYWJnOgorCQlmTWF0Y2ggPSB0cnVlOworCQlpZiAoZjVHaHpCYW5kKQorCQkJY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE7CisJCWVsc2UgaWYgKGVDU1JfRE9UMTFfTU9ERV8xMWIgPT0gYnNzUGh5TW9kZSkKKwkJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOworCQllbHNlCisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWE6CisJCWlmIChmNUdoekJhbmQpIHsKKwkJCWZNYXRjaCA9IHRydWU7CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExZzoKKwkJaWYgKCFmNUdoekJhbmQpIHsKKwkJCWZNYXRjaCA9IHRydWU7CisJCQlpZiAoZUNTUl9ET1QxMV9NT0RFXzExYiA9PSBic3NQaHlNb2RlKQorCQkJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOworCQkJZWxzZQorCQkJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFHOworCQl9CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFnX09OTFk6CisJCWlmIChlQ1NSX0RPVDExX01PREVfMTFnID09IGJzc1BoeU1vZGUpIHsKKwkJCWZNYXRjaCA9IHRydWU7CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYjoKKwkJaWYgKCFmNUdoekJhbmQpIHsKKwkJCWZNYXRjaCA9IHRydWU7CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZOgorCQlpZiAoZUNTUl9ET1QxMV9NT0RFXzExYiA9PSBic3NQaHlNb2RlKSB7CisJCQlmTWF0Y2ggPSB0cnVlOworCQkJY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUI7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMW46CisJCWZNYXRjaCA9IHRydWU7CisJCXN3aXRjaCAoYnNzUGh5TW9kZSkgeworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWc6CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWI6CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWE6CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQTsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMW46CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFhYzoKKyNlbmRpZgorCQkJY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQUM7CisjZWxzZQorCQkJY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFuX09OTFk6CisJCWlmICgoZUNTUl9ET1QxMV9NT0RFXzExbiA9PSBic3NQaHlNb2RlKSkgeworCQkJZk1hdGNoID0gdHJ1ZTsKKwkJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOworCisJCX0KKworCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYWM6CisJCWZNYXRjaCA9IHRydWU7CisJCXN3aXRjaCAoYnNzUGh5TW9kZSkgeworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWc6CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWI6CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWE6CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQTsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMW46CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTjsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWFjOgorCQlkZWZhdWx0OgorCQkJY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUFDOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWFjX09OTFk6CisJCWlmICgoZUNTUl9ET1QxMV9NT0RFXzExYWMgPT0gYnNzUGh5TW9kZSkpIHsKKwkJCWZNYXRjaCA9IHRydWU7CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQUM7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworCWRlZmF1bHQ6CisJCWZNYXRjaCA9IHRydWU7CisJCXN3aXRjaCAoYnNzUGh5TW9kZSkgeworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWc6CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWI6CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWE6CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQTsKKwkJCWJyZWFrOworCQljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMW46CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTjsKKwkJCWJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYWM6CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQUM7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV9BVVRPOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKGZNYXRjaCAmJiBwQ2ZnRG90MTFNb2RlVG9Vc2UpIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQlpZiAoY2ZnRG90MTFNb2RlID09IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBQworCQkgICAgJiYgKCFJU19GRUFUVVJFX1NVUFBPUlRFRF9CWV9GVyhET1QxMUFDKSkpCisJCQkqcENmZ0RvdDExTW9kZVRvVXNlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisJCWVsc2UKKyNlbmRpZgorCQkJKnBDZmdEb3QxMU1vZGVUb1VzZSA9IGNmZ0RvdDExTW9kZTsKKwl9CisJcmV0dXJuIGZNYXRjaDsKK30KKworLyoqCisgKiBjc3JfaXNfcGh5X21vZGVfbWF0Y2goKSAtIHRvIGZpbmQgaWYgcGh5IG1vZGUgbWF0Y2hlcworICogQHBNYWM6IHBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqIEBwaHlNb2RlOiBwaHlzaWNhbCBtb2RlCisgKiBAcFNpckJzc0Rlc2M6IGJzcyBkZXNjcmlwdGlvbgorICogQHBQcm9maWxlOiBwb2ludGVyIHRvIHJvYW0gcHJvZmlsZQorICogQHBSZXR1cm5DZmdEb3QxMU1vZGU6IGRvdDEgbW9kZSB0byByZXR1cm4KKyAqIEBwSWVzOiBwb2ludGVyIHRvIElFcworICoKKyAqIFRoaXMgZnVuY3Rpb24gZGVjaWRlcyB3aGV0aGVyIHRoZSBvbmUgb2YgdGhlIGJpdCBvZiBwaHlNb2RlIGlzIG1hdGNoaW5nIHRoZQorICogbW9kZSBpbiB0aGUgQlNTIGFuZCBhbGxvd2VkIGJ5IHRoZSB1c2VyIHNldHRpbmcKKyAqCisgKiBSZXR1cm46IHRydWUgb3IgZmFsc2UgYmFzZWQgb24gbW9kZSB0aGF0IGZpdHMgdGhlIGNyaXRlcmlhCisgKi8KK2Jvb2wgY3NyX2lzX3BoeV9tb2RlX21hdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQzMl90IHBoeU1vZGUsCisJCQkgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLAorCQkJICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCSAgIGVDc3JDZmdEb3QxMU1vZGUgKnBSZXR1cm5DZmdEb3QxMU1vZGUsCisJCQkgICB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworCWJvb2wgZk1hdGNoID0gZmFsc2U7CisJZUNzclBoeU1vZGUgcGh5TW9kZUluQnNzRGVzYyA9IGVDU1JfRE9UMTFfTU9ERV9BVVRPLCBwaHlNb2RlMjsKKwllQ3NyQ2ZnRG90MTFNb2RlIGNmZ0RvdDExTW9kZVRvVXNlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV9BVVRPOworCXVpbnQzMl90IGJpdE1hc2ssIGxvb3BDb3VudDsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNzcl9nZXRfcGh5X21vZGVfZnJvbV9ic3MocE1hYywgcFNpckJzc0Rlc2MsCisJCQkJCSZwaHlNb2RlSW5Cc3NEZXNjLCBwSWVzKSkpCisJCXJldHVybiBmTWF0Y2g7CisKKwlpZiAoKDAgPT0gcGh5TW9kZSkgfHwgKGVDU1JfRE9UMTFfTU9ERV9BVVRPICYgcGh5TW9kZSkpIHsKKwkJaWYgKGVDU1JfQ0ZHX0RPVDExX01PREVfQUJHID09CisJCQkJcE1hYy0+cm9hbS5jb25maWdQYXJhbS51Q2ZnRG90MTFNb2RlKQorCQkJcGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV9hYmc7CisJCWVsc2UgaWYgKGVDU1JfQ0ZHX0RPVDExX01PREVfQVVUTyA9PQorCQkJCXBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQkJcGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWFjOworI2Vsc2UKKwkJCXBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFuOworI2VuZGlmCisKKwkJZWxzZQorCQkJLyogdXNlcidzIHBpY2sgKi8KKwkJCXBoeU1vZGUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGU7CisJfQorCisJaWYgKCgwID09IHBoeU1vZGUpIHx8IChlQ1NSX0RPVDExX01PREVfQVVUTyAmIHBoeU1vZGUpKSB7CisJCWlmICgwICE9IHBoeU1vZGUpIHsKKwkJCWlmIChlQ1NSX0RPVDExX01PREVfQVVUTyAmIHBoeU1vZGUpIHsKKwkJCQlwaHlNb2RlMiA9CisJCQkJCWVDU1JfRE9UMTFfTU9ERV9BVVRPICYgcGh5TW9kZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBoeU1vZGUyID0gcGh5TW9kZTsKKwkJfQorCQlmTWF0Y2ggPSBjc3JfZ2V0X3BoeV9tb2RlX2luX3VzZShwaHlNb2RlMiwgcGh5TW9kZUluQnNzRGVzYywKKwkJCQlDRFNfSVNfQ0hBTk5FTF81R0haKHBTaXJCc3NEZXNjLT5jaGFubmVsSWQpLAorCQkJCSZjZmdEb3QxMU1vZGVUb1VzZSk7CisJfSBlbHNlIHsKKwkJYml0TWFzayA9IDE7CisJCWxvb3BDb3VudCA9IDA7CisJCXdoaWxlIChsb29wQ291bnQgPCBlQ1NSX05VTV9QSFlfTU9ERSkgeworCQkJcGh5TW9kZTIgPSAocGh5TW9kZSAmIChiaXRNYXNrIDw8IGxvb3BDb3VudCsrKSk7CisJCQlpZiAoMCAhPSBwaHlNb2RlMiAmJiBjc3JfZ2V0X3BoeV9tb2RlX2luX3VzZShwaHlNb2RlMiwKKwkJCQkJCXBoeU1vZGVJbkJzc0Rlc2MsCisJCQkJCQlDRFNfSVNfQ0hBTk5FTF81R0haCisJCQkJCQkocFNpckJzc0Rlc2MtPmNoYW5uZWxJZCksCisJCQkJCQkmY2ZnRG90MTFNb2RlVG9Vc2UpKSB7CisJCQkJZk1hdGNoID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZk1hdGNoICYmIHBSZXR1cm5DZmdEb3QxMU1vZGUpIHsKKwkJaWYgKHBQcm9maWxlKSB7CisJCQkvKgorCQkJICogSUVFRSAxMW4gc3BlYyAoOC40LjMpOiBIVCBTVEEgc2hhbGwKKwkJCSAqIGVsaW1pbmF0ZSBUS0lQIGFzIGEgY2hvaWNlIGZvciB0aGUgcGFpcndpc2UKKwkJCSAqIGNpcGhlciBzdWl0ZSBpZiBDQ01QIGlzIGFkdmVydGlzZWQgYnkgdGhlIEFQCisJCQkgKiBvciBpZiB0aGUgQVAgaW5jbHVkZWQgYW4gSFQgY2FwYWJpbGl0aWVzCisJCQkgKiBlbGVtZW50IGluIGl0cyBCZWFjb25zIGFuZCBQcm9iZSBSZXNwb25zZS4KKwkJCSAqLworCQkJaWYgKCghQ1NSX0lTXzExbl9BTExPV0VEKAorCQkJCQlwUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUpKQorCQkJCQkmJiAoKGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOID09CisJCQkJCQljZmdEb3QxMU1vZGVUb1VzZSkgfHwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQkJCQkoZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUFDID09CisJCQkJCQljZmdEb3QxMU1vZGVUb1VzZSkKKyNlbmRpZgorCQkJCSkpIHsKKwkJCQkvKiBXZSBjYW5ub3QgZG8gMTFuIGhlcmUgKi8KKwkJCQlpZiAoIUNEU19JU19DSEFOTkVMXzVHSFoKKwkJCQkJCShwU2lyQnNzRGVzYy0+Y2hhbm5lbElkKSkgeworCQkJCQljZmdEb3QxMU1vZGVUb1VzZSA9CisJCQkJCQllQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKwkJCQl9IGVsc2UgeworCQkJCQljZmdEb3QxMU1vZGVUb1VzZSA9CisJCQkJCQllQ1NSX0NGR19ET1QxMV9NT0RFXzExQTsKKwkJCQl9CisJCQl9CisJCX0KKwkJKnBSZXR1cm5DZmdEb3QxMU1vZGUgPSBjZmdEb3QxMU1vZGVUb1VzZTsKKwl9CisKKwlyZXR1cm4gZk1hdGNoOworfQorCitlQ3NyQ2ZnRG90MTFNb2RlIGNzcl9maW5kX2Jlc3RfcGh5X21vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgcGh5TW9kZSkKK3sKKwllQ3NyQ2ZnRG90MTFNb2RlIGNmZ0RvdDExTW9kZVRvVXNlOworCWVDc3JCYW5kIGVCYW5kID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lQmFuZDsKKworCWlmICgoMCA9PSBwaHlNb2RlKSB8fAorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJICAgIChlQ1NSX0RPVDExX01PREVfMTFhYyAmIHBoeU1vZGUpIHx8CisjZW5kaWYKKwkgICAgKGVDU1JfRE9UMTFfTU9ERV9BVVRPICYgcGh5TW9kZSkpIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCQlpZiAoSVNfRkVBVFVSRV9TVVBQT1JURURfQllfRlcoRE9UMTFBQykpIHsKKwkJCWNmZ0RvdDExTW9kZVRvVXNlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUFDOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQkvKiBEZWZhdWx0IHRvIDExTiBtb2RlIGlmIHVzZXIgaGFzIGNvbmZpZ3VyZWQgMTFhYyBtb2RlCisJCQkgKiBhbmQgRlcgZG9lc24ndCBzdXBwb3J0cyAxMWFjIG1vZGUgLgorCQkJICovCisJCQljZmdEb3QxMU1vZGVUb1VzZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChlQ1NSX0RPVDExX01PREVfMTFuIHwgZUNTUl9ET1QxMV9NT0RFXzExbl9PTkxZKSAmIHBoeU1vZGUpIHsKKwkJCWNmZ0RvdDExTW9kZVRvVXNlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisJCX0gZWxzZSBpZiAoZUNTUl9ET1QxMV9NT0RFX2FiZyAmIHBoeU1vZGUpIHsKKwkJCWlmIChlQ1NSX0JBTkRfMjQgIT0gZUJhbmQpIHsKKwkJCQljZmdEb3QxMU1vZGVUb1VzZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOworCQkJfSBlbHNlIHsKKwkJCQljZmdEb3QxMU1vZGVUb1VzZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFHOworCQkJfQorCQl9IGVsc2UgaWYgKGVDU1JfRE9UMTFfTU9ERV8xMWEgJiBwaHlNb2RlKSB7CisJCQljZmdEb3QxMU1vZGVUb1VzZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOworCQl9IGVsc2UgaWYgKChlQ1NSX0RPVDExX01PREVfMTFnIHwgZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZKSAmCisJCQkgICBwaHlNb2RlKSB7CisJCQljZmdEb3QxMU1vZGVUb1VzZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFHOworCQl9IGVsc2UgeworCQkJY2ZnRG90MTFNb2RlVG9Vc2UgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKwkJfQorCX0KKworCXJldHVybiBjZmdEb3QxMU1vZGVUb1VzZTsKK30KKwordWludDMyX3QgY3NyX2dldDExaF9wb3dlcl9jb25zdHJhaW50KHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkgICAgIHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgKnBQb3dlckNvbnN0cmFpbnQpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXVpbnQzMl90IGxvY2FsUG93ZXJDb25zdHJhaW50ID0gMDsKKworCS8qIGNoZWNrIGlmIC4xMWggc3VwcG9ydCBpcyBlbmFibGVkLCBpZiBub3QsIHRoZSBwb3dlciBjb25zdHJhaW50IGlzIDAuICovCisJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWhTdXBwb3J0RW5hYmxlZAorCSAgICAmJiBwUG93ZXJDb25zdHJhaW50LT5wcmVzZW50KSB7CisJCWxvY2FsUG93ZXJDb25zdHJhaW50ID0gcFBvd2VyQ29uc3RyYWludC0+bG9jYWxQb3dlckNvbnN0cmFpbnRzOworCX0KKworCXJldHVybiBsb2NhbFBvd2VyQ29uc3RyYWludDsKK30KKworYm9vbCBjc3JfaXNfcHJvZmlsZV93cGEodENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSkKK3sKKwlib29sIGZXcGFQcm9maWxlID0gZmFsc2U7CisKKwlzd2l0Y2ggKHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUpIHsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1dQQToKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1dQQV9QU0s6CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfTk9ORToKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQToKKyNlbmRpZgorCQlmV3BhUHJvZmlsZSA9IHRydWU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZldwYVByb2ZpbGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGZXcGFQcm9maWxlKSB7CisJCXN3aXRjaCAocFByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlKSB7CisJCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA6CisJCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OgorCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1RLSVA6CisJCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQUVTOgorCQkJZldwYVByb2ZpbGUgPSB0cnVlOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWZXcGFQcm9maWxlID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gZldwYVByb2ZpbGU7Cit9CisKK2Jvb2wgY3NyX2lzX3Byb2ZpbGVfcnNuKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUpCit7CisJYm9vbCBmUlNOUHJvZmlsZSA9IGZhbHNlOworCisJc3dpdGNoIChwUHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlKSB7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU046CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLOgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9GVF9SU046CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9GVF9SU05fUFNLOgorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCWNhc2UgZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU046CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLX1NIQTI1NjoKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1JTTl84MDIxWF9TSEEyNTY6CisjZW5kaWYKKwkJZlJTTlByb2ZpbGUgPSB0cnVlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWZSU05Qcm9maWxlID0gZmFsc2U7CisJCWJyZWFrOworCX0KKworCWlmIChmUlNOUHJvZmlsZSkgeworCQlzd2l0Y2ggKHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSkgeworCQkvKiAhIVJFVklFVyAtIEZvciBXUEEyLCB1c2Ugb2YgUlNOIElFIG1hbmRhdGVzICovCisJCS8qIHVzZSBvZiBBRVMgYXMgZW5jcnlwdGlvbi4gSGVyZSwgd2UgcXVhbGlmeSAqLworCQkvKiBldmVuIGlmIGVuY3J5cHRpb24gdHlwZSBpcyBXRVAgb3IgVEtJUCAqLworCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOgorCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDoKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQOgorCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX0FFUzoKKwkJCWZSU05Qcm9maWxlID0gdHJ1ZTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlmUlNOUHJvZmlsZSA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGZSU05Qcm9maWxlOworfQorCisvKioKKyAqIGNzcl9pc2NvbmN1cnJlbnRzZXNzaW9uX3ZhbGlkKCkgLSBjaGVjayBpZiBjb25jdXJyZW50IHNlc3Npb24gaXMgdmFsaWQKKyAqIEBtYWNfY3R4OiBwb2ludGVyIHRvIG1hYyBjb250ZXh0CisgKiBAY3VyX3Nlc3Npb25pZDogY3VycmVudCBzZXNzaW9uIGlkCisgKiBAY3VyX2Jzc19wZXJzb25hOiBjdXJyZW50IEJTUyBwZXJzb25hCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIGNvbmN1cnJlbnQgc2Vzc2lvbiBpcyB2YWxpZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTCitjc3JfaXNjb25jdXJyZW50c2Vzc2lvbl92YWxpZCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB1aW50MzJfdCBjdXJfc2Vzc2lvbmlkLAorCQkJICAgICAgdENERl9DT05fTU9ERSBjdXJfYnNzX3BlcnNvbmEpCit7CisJdWludDMyX3Qgc2Vzc2lvbmlkID0gMDsKKwl0Q0RGX0NPTl9NT0RFIGJzc19wZXJzb25hOworCWVDc3JDb25uZWN0U3RhdGUgY29ubmVjdF9zdGF0ZSwgdGVtcDsKKwl0Q3NyUm9hbVNlc3Npb24gKnJvYW1fc2Vzc2lvbjsKKworCWZvciAoc2Vzc2lvbmlkID0gMDsgc2Vzc2lvbmlkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IHNlc3Npb25pZCsrKSB7CisJCWlmIChjdXJfc2Vzc2lvbmlkID09IHNlc3Npb25pZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKG1hY19jdHgsIHNlc3Npb25pZCkpCisJCQljb250aW51ZTsKKwkJcm9hbV9zZXNzaW9uID0gJm1hY19jdHgtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbmlkXTsKKwkJYnNzX3BlcnNvbmEgPSByb2FtX3Nlc3Npb24tPmJzc1BhcmFtcy5ic3NQZXJzb25hOworCQljb25uZWN0X3N0YXRlID0gcm9hbV9zZXNzaW9uLT5jb25uZWN0U3RhdGU7CisKKwkJc3dpdGNoIChjdXJfYnNzX3BlcnNvbmEpIHsKKwkJY2FzZSBDREZfU1RBX01PREU6CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQlGTCgiKiogU1RBIHNlc3Npb24gKioiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJCWNhc2UgQ0RGX1NBUF9NT0RFOgorCQkJdGVtcCA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JQlNTX0RJU0NPTk5FQ1RFRDsKKyNpZm5kZWYgV0xBTl9GRUFUVVJFX01CU1NJRAorCQkJaWYgKChic3NfcGVyc29uYSA9PSBDREZfU0FQX01PREUpICYmCisJCQkJCShjb25uZWN0X3N0YXRlICE9CisJCQkJCSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfTk9UX0NPTk5FQ1RFRCkpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCQlDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQlGTCgic2FwIG1vZGUgYWxyZWFkeSBleGlzdCIpKTsKKwkJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCWlmICgoYnNzX3BlcnNvbmEgPT0gQ0RGX0lCU1NfTU9ERSkKKwkJCQkJJiYgKGNvbm5lY3Rfc3RhdGUgIT0gdGVtcCkpIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJCUNERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJCQlGTCgiQ2FuJ3Qgc3RhcnQgR08iKSk7CisJCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCQl9CisJCQlicmVhazsKKworCQljYXNlIENERl9QMlBfR09fTU9ERToKKwkJCXRlbXAgPSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfSUJTU19ESVNDT05ORUNURUQ7CisJCQlpZiAoKGJzc19wZXJzb25hID09IENERl9QMlBfR09fTU9ERSkgJiYKKwkJCQkJKGNvbm5lY3Rfc3RhdGUgIT0KKwkJCQkJIGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9OT1RfQ09OTkVDVEVEKSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJCUNERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJCUZMKCJHTyBtb2RlIGFscmVhZHkgZXhpc3RzIikpOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0gZWxzZSBpZiAoKGJzc19wZXJzb25hID09IENERl9JQlNTX01PREUpCisJCQkJCSYmIChjb25uZWN0X3N0YXRlICE9IHRlbXApKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJRkwoIkNhbid0IHN0YXJ0IFNBUCIpKTsKKwkJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDREZfSUJTU19NT0RFOgorCQkJaWYgKChic3NfcGVyc29uYSA9PSBDREZfSUJTU19NT0RFKSAmJiAoY29ubmVjdF9zdGF0ZSAhPQorCQkJCQllQ1NSX0FTU09DX1NUQVRFX1RZUEVfSUJTU19DT05ORUNURUQpKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJRkwoIklCU1MgbW9kZSBhbHJlYWR5IGV4aXN0IikpOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0gZWxzZSBpZiAoKChic3NfcGVyc29uYSA9PSBDREZfUDJQX0dPX01PREUpIHx8CisJCQkJCShic3NfcGVyc29uYSA9PSBDREZfU0FQX01PREUpKSAmJgorCQkJCQkoY29ubmVjdF9zdGF0ZSAhPQorCQkJCQkgZUNTUl9BU1NPQ19TVEFURV9UWVBFX05PVF9DT05ORUNURUQpKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJRkwoIkNhbid0IHN0YXJ0IEdPIikpOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENERl9QMlBfQ0xJRU5UX01PREU6CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJRkwoIioqUDJQLUNsaWVudCBzZXNzaW9uKioiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlkZWZhdWx0OgorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCUNERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgiUGVyc29uYSBub3QgaGFuZGxlZCA9ICVkIiksCisJCQkJY3VyX2Jzc19wZXJzb25hKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworLyoqCisgKiBjc3JfdXBkYXRlX21jY19wMnBfYmVhY29uX2ludGVydmFsKCkgLSB1cGRhdGUgcDJwIGJlYWNvbiBpbnRlcnZhbAorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIHVwZGF0ZSB0aGUgbWNjIHAycCBiZWFjb24gaW50ZXJ2YWwKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBjc3JfdXBkYXRlX21jY19wMnBfYmVhY29uX2ludGVydmFsKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJdWludDMyX3Qgc2Vzc2lvbl9pZCA9IDA7CisJdENzclJvYW1TZXNzaW9uICpyb2FtX3Nlc3Npb247CisKKwkvKiBJZiBNQ0MgaXMgbm90IHN1cHBvcnRlZCBqdXN0IGJyZWFrIGFuZCByZXR1cm4gU1VDQ0VTUyAqLworCWlmICghbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5mZW5hYmxlTUNDTW9kZSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJZm9yIChzZXNzaW9uX2lkID0gMDsgc2Vzc2lvbl9pZCA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBzZXNzaW9uX2lkKyspIHsKKwkJLyoKKwkJICogSWYgR08gaW4gTUNDIHN1cHBvcnQgZGlmZmVyZW50IGJlYWNvbiBpbnRlcnZhbCwKKwkJICogY2hhbmdlIHRoZSBCSSBvZiB0aGUgUDJQLUdPCisJCSAqLworCQlyb2FtX3Nlc3Npb24gPSAmbWFjX2N0eC0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uX2lkXTsKKwkJaWYgKHJvYW1fc2Vzc2lvbi0+YnNzUGFyYW1zLmJzc1BlcnNvbmEgIT0gQ0RGX1AyUF9HT19NT0RFKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIEhhbmRsZSBkaWZmZXJlbnQgQkkgc2NuZWFyaW8gYmFzZWQgb24gdGhlCisJCSAqIGNvbmZpZ3VyYXRpb24gc2V0LklmIENvbmZpZyBpcyBzZXQgdG8gMHgwMiB0aGVuCisJCSAqIERpc2Nvbm5lY3QgYWxsIHRoZSBQMlAgY2xpZW50cyBhc3NvY2lhdGVkLiBJZiBjb25maWcKKwkJICogaXMgc2V0IHRvIDB4MDQgdGhlbiB1cGRhdGUgdGhlIEJJIHdpdGhvdXQKKwkJICogZGlzY29ubmVjdGluZyBhbGwgdGhlIGNsaWVudHMKKwkJICovCisJCWlmICgobWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5mQWxsb3dNQ0NHT0RpZmZCSSA9PSAweDA0KQorCQkJCSYmIChyb2FtX3Nlc3Npb24tPmJzc1BhcmFtcy4KKwkJCQkJdXBkYXRlYmVhY29uSW50ZXJ2YWwpKSB7CisJCQlyZXR1cm4gY3NyX3NlbmRfY2huZ19tY2NfYmVhY29uX2ludGVydmFsKG1hY19jdHgsCisJCQkJCXNlc3Npb25faWQpOworCQl9IGVsc2UgaWYgKHJvYW1fc2Vzc2lvbi0+YnNzUGFyYW1zLnVwZGF0ZWJlYWNvbkludGVydmFsKSB7CisJCQkvKgorCQkJICogSWYgdGhlIGNvbmZpZ3VyYXRpb24gb2YgZkFsbG93TUNDR09EaWZmQkkgaXMgc2V0IHRvCisJCQkgKiBvdGhlciB0aGFuIDB4MDQKKwkJCSAqLworCQkJcmV0dXJuIGNzcl9yb2FtX2NhbGxfY2FsbGJhY2sobWFjX2N0eCwKKwkJCQkJc2Vzc2lvbl9pZCwKKwkJCQkJTlVMTCwgMCwKKwkJCQkJZUNTUl9ST0FNX0RJU0NPTk5FQ1RfQUxMX1AyUF9DTElFTlRTLAorCQkJCQllQ1NSX1JPQU1fUkVTVUxUX05PTkUpOworCQl9CisJfQorCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKK30KKwordWludDE2X3QgY3NyX2NhbGN1bGF0ZV9tY2NfYmVhY29uX2ludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IHN0YV9iaSwKKwkJCQkJICAgdWludDE2X3QgZ29fZ2JpKQoreworCXVpbnQ4X3QgbnVtX2JlYWNvbnMgPSAwOworCXVpbnQ4X3QgaXNfbXVsdGlwbGUgPSAwOworCXVpbnQxNl90IGdvX2NiaSA9IDA7CisJdWludDE2X3QgZ29fZmJpID0gMDsKKwl1aW50MTZfdCBzdGFfY2JpID0gMDsKKworCS8qIElmIEdPJ3MgZ2l2ZW4gYmVhY29uIEludGVydmFsIGlzIGxlc3MgdGhhbiAxMDAgKi8KKwlpZiAoZ29fZ2JpIDwgMTAwKQorCQlnb19jYmkgPSAxMDA7CisJLyogaWYgR08ncyBnaXZlbiBiZWFjb24gSW50ZXJ2YWwgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwMCAqLworCWVsc2UKKwkJZ29fY2JpID0gMTAwICsgKGdvX2diaSAlIDEwMCk7CisKKwlpZiAoc3RhX2JpID09IDApIHsKKwkJLyogVGhlcmUgaXMgcG9zc2liaWxpdHkgdG8gcmVjZWl2ZSB6ZXJvIGFzIHZhbHVlLgorCQkgICBXaGljaCB3aWxsIGNhdXNlIGRpdmlkZSBieSB6ZXJvLiBIZW5jZSBpbml0aWFsaXNlIHdpdGggMTAwCisJCSAqLworCQlzdGFfYmkgPSAxMDA7CisJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCUZMKCJzdGFfYmkgMm5kIHBhcmFtZXRlciBpcyB6ZXJvLCBpbml0aWFsaXplIHRvICVkIiksCisJCQlzdGFfYmkpOworCX0KKwkvKiBjaGVjaywgaWYgZWl0aGVyIG9uZSBpcyBtdWx0aXBsZSBvZiBhbm90aGVyICovCisJaWYgKHN0YV9iaSA+IGdvX2NiaSkgeworCQlpc19tdWx0aXBsZSA9ICEoc3RhX2JpICUgZ29fY2JpKTsKKwl9IGVsc2UgeworCQlpc19tdWx0aXBsZSA9ICEoZ29fY2JpICUgc3RhX2JpKTsKKwl9CisJLyogaWYgaXQgaXMgbXVsdGlwbGUsIHRoZW4gYWNjZXB0IEdPJ3MgYmVhY29uIGludGVydmFsIHJhbmdlIFsxMDAsMTk5XSBhcyBpdCAgaXMgKi8KKwlpZiAoaXNfbXVsdGlwbGUpIHsKKwkJcmV0dXJuIGdvX2NiaTsKKwl9CisJLyogZWxzZSAsIGlmIGl0IGlzIG5vdCBtdWx0aXBsZSwgdGhlbiB0aGVuIGNoZWNrIGZvciBudW1iZXIgb2YgYmVhY29ucyB0byBiZSAqLworCS8qIGluc2VydGVkIGJhc2VkIG9uIHN0YSBCSSAqLworCW51bV9iZWFjb25zID0gc3RhX2JpIC8gMTAwOworCWlmIChudW1fYmVhY29ucykgeworCQkvKiBHTydzIGZpbmFsIGJlYWNvbiBpbnRlcnZhbCB3aWxsIGJlIGFsaWduZWQgdG8gc3RhIGJlYWNvbiBpbnRlcnZhbCwgYnV0ICovCisJCS8qIGluIHRoZSByYW5nZSBvZiBbMTAwLCAxOTldLiAqLworCQlzdGFfY2JpID0gc3RhX2JpIC8gbnVtX2JlYWNvbnM7CisJCWdvX2ZiaSA9IHN0YV9jYmk7CisJfSBlbHNlIHsKKwkJLyogaWYgU1RBIGJlYWNvbiBpbnRlcnZhbCBpcyBsZXNzIHRoYW4gMTAwLCB1c2UgR08ncyBjaGFuZ2UgYmFjb24gaW50ZXJ2YWwgKi8KKwkJLyogaW5zdGVhZCBvZiB1cGRhdGluZyB0byBTVEEncyBiZWFjb24gaW50ZXJ2YWwuICovCisJCWdvX2ZiaSA9IGdvX2NiaTsKKwl9CisJcmV0dXJuIGdvX2ZiaTsKK30KKworQ0RGX1NUQVRVUyBjc3JfdmFsaWRhdGVfbWNjX2JlYWNvbl9pbnRlcnZhbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNoYW5uZWxJZCwKKwkJCQkJICAgIHVpbnQxNl90ICpiZWFjb25JbnRlcnZhbCwKKwkJCQkJICAgIHVpbnQzMl90IGN1cnNlc3Npb25JZCwKKwkJCQkJICAgIHRDREZfQ09OX01PREUgY3VyckJzc1BlcnNvbmEpCit7CisJdWludDMyX3Qgc2Vzc2lvbklkID0gMDsKKwl1aW50MTZfdCBuZXdfYmVhY29uSW50ZXJ2YWwgPSAwOworCisJLyogSWYgTUNDIGlzIG5vdCBzdXBwb3J0ZWQganVzdCBicmVhayAqLworCWlmICghcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mZW5hYmxlTUNDTW9kZSkgeworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJZm9yIChzZXNzaW9uSWQgPSAwOyBzZXNzaW9uSWQgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgc2Vzc2lvbklkKyspIHsKKwkJaWYgKGN1cnNlc3Npb25JZCAhPSBzZXNzaW9uSWQpIHsKKwkJCWlmICghQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzd2l0Y2ggKGN1cnJCc3NQZXJzb25hKSB7CisJCQljYXNlIENERl9TVEFfTU9ERToKKwkJCQlpZiAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLgorCQkJCQlwQ3VyUm9hbVByb2ZpbGUgJiYKKwkJCQkgICAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLgorCQkJCQlwQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEgPT0KKwkJCQkgICAgQ0RGX1AyUF9DTElFTlRfTU9ERSkpIHsKKwkJCQkJLyogY2hlY2sgZm9yIFAyUCBjbGllbnQgbW9kZSAqLworCQkJCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQkJCQlGTAorCQkJCQkJCSgiIEJlYWNvbiBJbnRlcnZhbCBWYWxpZGF0aW9uIG5vdCByZXF1aXJlZCBmb3IgU1RBL0NMSUVOVCIpKTsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBJRiBTQVAgaGFzIHN0YXJ0ZWQgYW5kIFNUQSB3YW50cyB0byBjb25uZWN0CisJCQkJICogb24gZGlmZmVyZW50IGNoYW5uZWwgTUNDIHNob3VsZAorCQkJCSAqICBNQ0Mgc2hvdWxkIG5vdCBiZSBlbmFibGVkIHNvIG1ha2luZyBpdAorCQkJCSAqIGZhbHNlIHRvIGVuZm9yY2Ugb24gc2FtZSBjaGFubmVsCisJCQkJICovCisJCQkJZWxzZSBpZiAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLgorCQkJCQkgYnNzUGFyYW1zLmJzc1BlcnNvbmEgPT0KKwkJCQkJIENERl9TQVBfTU9ERSkgeworCQkJCQlpZiAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLgorCQkJCQkgICAgYnNzUGFyYW1zLm9wZXJhdGlvbkNobiAhPQorCQkJCQkgICAgY2hhbm5lbElkKSB7CisJCQkJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJCQkJRkwKKwkJCQkJCQkJKCIqKiogTUNDIHdpdGggU0FQK1NUQSBzZXNzaW9ucyAqKioqIikpOworCQkJCQkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLgorCQkJCQkJYnNzUGFyYW1zLmJzc1BlcnNvbmEgPT0KKwkJCQkJCUNERl9QMlBfR09fTU9ERSkgeworCQkJCQkvKgorCQkJCQkgKiBDaGVjayBmb3IgUDJQIGdvIHNjZW5hcmlvCisJCQkJCSAqIGlmIEdPIGluIE1DQyBzdXBwb3J0IGRpZmZlcmVudAorCQkJCQkgKiBiZWFjb24gaW50ZXJ2YWwsCisJCQkJCSAqIGNoYW5nZSB0aGUgQkkgb2YgdGhlIFAyUC1HTworCQkJCQkgKi8KKwkJCQkJaWYgKChwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uCisJCQkJCSAgICAgYnNzUGFyYW1zLm9wZXJhdGlvbkNobiAhPQorCQkJCQkgICAgIGNoYW5uZWxJZCkKKwkJCQkJICAgICYmIChwTWFjLT5yb2FtLgorCQkJCQkJcm9hbVNlc3Npb25bc2Vzc2lvbklkXS4KKwkJCQkJCWJzc1BhcmFtcy5iZWFjb25JbnRlcnZhbCAhPQorCQkJCQkJKmJlYWNvbkludGVydmFsKSkgeworCQkJCQkJLyogaWYgR08gaW4gTUNDIHN1cHBvcnQgZGlmZmVyZW50IGJlYWNvbiBpbnRlcnZhbCwgcmV0dXJuIHN1Y2Nlc3MgKi8KKwkJCQkJCWlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLgorCQkJCQkJICAgIGZBbGxvd01DQ0dPRGlmZkJJID09IDB4MDEpIHsKKwkJCQkJCQlyZXR1cm4KKwkJCQkJCQkJQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJCQkJfQorCQkJCQkJLyogU2VuZCBvbmx5IEJyb2FkY2FzdCBkaXNhc3NvYyBhbmQgdXBkYXRlIGJlYWNvbkludGVydmFsICovCisJCQkJCQkvKiBJZiBjb25maWd1cmF0aW9uIGlzIHNldCB0byAweDA0IHRoZW4gZG9udCAqLworCQkJCQkJLyogZGlzY29ubmVjdCBhbGwgdGhlIHN0YXRpb24gKi8KKwkJCQkJCWVsc2UgaWYgKChwTWFjLT5yb2FtLgorCQkJCQkJCSAgY29uZmlnUGFyYW0uCisJCQkJCQkJICBmQWxsb3dNQ0NHT0RpZmZCSSA9PQorCQkJCQkJCSAgMHgwMikKKwkJCQkJCQkgfHwgKHBNYWMtPnJvYW0uCisJCQkJCQkJICAgICBjb25maWdQYXJhbS4KKwkJCQkJCQkgICAgIGZBbGxvd01DQ0dPRGlmZkJJCisJCQkJCQkJICAgICA9PSAweDA0KSkgeworCQkJCQkJCS8qIENoZWNrIHRvIHBhc3MgdGhlIHJpZ2h0IGJlYWNvbiBJbnRlcnZhbCAqLworCQkJCQkJCSBpZiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5jb25jX2N1c3RvbV9ydWxlMSB8fAorCQkJCQkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNvbmNfY3VzdG9tX3J1bGUyKSB7CisJCQkJCQkJCSBuZXdfYmVhY29uSW50ZXJ2YWwgPSBDU1JfQ1VTVE9NX0NPTkNfR09fQkk7CisJCQkJCQkJIH0gZWxzZSB7CisJCQkJCQkJCSBuZXdfYmVhY29uSW50ZXJ2YWwgPQorCQkJCQkJCQkJIGNzcl9jYWxjdWxhdGVfbWNjX2JlYWNvbl9pbnRlcnZhbChwTWFjLAorCQkJCQkJCQkJCSpiZWFjb25JbnRlcnZhbCwKKwkJCQkJCQkJCQlwTWFjLT5yb2FtLgorCQkJCQkJCQkJCXJvYW1TZXNzaW9uCisJCQkJCQkJCQkJW3Nlc3Npb25JZF0uCisJCQkJCQkJCQkJYnNzUGFyYW1zLgorCQkJCQkJCQkJCWJlYWNvbkludGVydmFsKTsKKwkJCQkJCQkgfQorCQkJCQkJCXNtc19sb2cocE1hYywgTE9HMSwKKwkJCQkJCQkJRkwKKwkJCQkJCQkJCSgiIFBlZXIgQVAgQkkgOiAlZCwgbmV3IEJlYWNvbiBJbnRlcnZhbDogJWQiKSwKKwkJCQkJCQkJKmJlYWNvbkludGVydmFsLAorCQkJCQkJCQluZXdfYmVhY29uSW50ZXJ2YWwpOworCQkJCQkJCS8qIFVwZGF0ZSB0aGUgYmVjb24gSW50ZXJ2YWwgKi8KKwkJCQkJCQlpZiAobmV3X2JlYWNvbkludGVydmFsCisJCQkJCQkJICAgICE9CisJCQkJCQkJICAgIHBNYWMtPnJvYW0uCisJCQkJCQkJICAgIHJvYW1TZXNzaW9uCisJCQkJCQkJICAgIFtzZXNzaW9uSWRdLgorCQkJCQkJCSAgICBic3NQYXJhbXMuCisJCQkJCQkJICAgIGJlYWNvbkludGVydmFsKSB7CisJCQkJCQkJCS8qIFVwZGF0ZSB0aGUgYmVhY29uSW50ZXJ2YWwgbm93ICovCisJCQkJCQkJCXNtc19sb2cocE1hYywKKwkJCQkJCQkJCUxPR0UsCisJCQkJCQkJCQlGTAorCQkJCQkJCQkJCSgiIEJlYWNvbiBJbnRlcnZhbCBnb3QgY2hhbmdlZCBjb25maWcgdXNlZDogJWRcbiIpLAorCQkJCQkJCQkJcE1hYy0+CisJCQkJCQkJCQlyb2FtLgorCQkJCQkJCQkJY29uZmlnUGFyYW0uCisJCQkJCQkJCQlmQWxsb3dNQ0NHT0RpZmZCSSk7CisKKwkJCQkJCQkJcE1hYy0+cm9hbS4KKwkJCQkJCQkJcm9hbVNlc3Npb24KKwkJCQkJCQkJW3Nlc3Npb25JZF0uCisJCQkJCQkJCWJzc1BhcmFtcy4KKwkJCQkJCQkJYmVhY29uSW50ZXJ2YWwKKwkJCQkJCQkJCT0KKwkJCQkJCQkJCQluZXdfYmVhY29uSW50ZXJ2YWw7CisJCQkJCQkJCXBNYWMtPnJvYW0uCisJCQkJCQkJCXJvYW1TZXNzaW9uCisJCQkJCQkJCVtzZXNzaW9uSWRdLgorCQkJCQkJCQlic3NQYXJhbXMuCisJCQkJCQkJCXVwZGF0ZWJlYWNvbkludGVydmFsCisJCQkJCQkJCQk9IHRydWU7CisJCQkJCQkJCXJldHVybgorCQkJCQkJCQkJY3NyX3VwZGF0ZV9tY2NfcDJwX2JlYWNvbl9pbnRlcnZhbAorCQkJCQkJCQkJCShwTWFjKTsKKwkJCQkJCQl9CisJCQkJCQkJcmV0dXJuCisJCQkJCQkJCUNERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCQkJCX0KKwkJCQkJCS8qIERpc2Nvbm5lY3QgdGhlIFAyUCBzZXNzaW9uICovCisJCQkJCQllbHNlIGlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLgorCQkJCQkJCSBmQWxsb3dNQ0NHT0RpZmZCSSA9PQorCQkJCQkJCSAweDAzKSB7CisJCQkJCQkJcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmJzc1BhcmFtcy51cGRhdGViZWFjb25JbnRlcnZhbCA9IGZhbHNlOworCQkJCQkJCXJldHVybgorCQkJCQkJCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrCisJCQkJCQkJCQkocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCQkJTlVMTCwgMCwKKwkJCQkJCQkJCWVDU1JfUk9BTV9TRU5EX1AyUF9TVE9QX0JTUywKKwkJCQkJCQkJCWVDU1JfUk9BTV9SRVNVTFRfTk9ORSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJCQkJRkwKKwkJCQkJCQkJCSgiQmVhY29uSW50ZXJ2YWwgaXMgZGlmZmVyZW50IGNhbm5vdCBjb25uZWN0IHRvIHByZWZlcnJlZCBBUC4uLiIpKTsKKwkJCQkJCQlyZXR1cm4KKwkJCQkJCQkJQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ0RGX1AyUF9DTElFTlRfTU9ERToKKwkJCQlpZiAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLgorCQkJCQlwQ3VyUm9hbVByb2ZpbGUgJiYKKwkJCQkgICAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLgorCQkJCQlwQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEgPT0KKwkJCQkJQ0RGX1NUQV9NT0RFKSkgeworCQkJCQkvKiBjaGVjayBmb3IgUDJQIGNsaWVudCBtb2RlICovCisJCQkJCXNtc19sb2cocE1hYywgTE9HMSwKKwkJCQkJCUZMCisJCQkJCQkJKCIgSWdub3JlIEJlYWNvbiBJbnRlcnZhbCBWYWxpZGF0aW9uLi4uIikpOworCQkJCX0gZWxzZSBpZiAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLgorCQkJCQkJYnNzUGFyYW1zLmJzc1BlcnNvbmEgPT0KKwkJCQkJCUNERl9QMlBfR09fTU9ERSkgeworCQkJCQkvKiBDaGVjayBmb3IgUDJQIGdvIHNjZW5hcmlvICovCisJCQkJCWlmICgocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLgorCQkJCQkgICAgIGJzc1BhcmFtcy5vcGVyYXRpb25DaG4gIT0KKwkJCQkJICAgICBjaGFubmVsSWQpCisJCQkJCSAgICAmJiAocE1hYy0+cm9hbS4KKwkJCQkJCXJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uCisJCQkJCQlic3NQYXJhbXMuYmVhY29uSW50ZXJ2YWwgIT0KKwkJCQkJCSpiZWFjb25JbnRlcnZhbCkpIHsKKwkJCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJCQlGTAorCQkJCQkJCQkoIkJlYWNvbkludGVydmFsIGlzIGRpZmZlcmVudCBjYW5ub3QgY29ubmVjdCB0byBQMlBfR08gbmV0d29yayAuLi4iKSk7CisJCQkJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ0RGX1NBUF9NT0RFOgorCQkJCWJyZWFrOworCisJCQljYXNlIENERl9QMlBfR09fTU9ERToKKwkJCXsKKwkJCQlpZiAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLgorCQkJCQlwQ3VyUm9hbVByb2ZpbGUgJiYKKwkJCQkgICAoKHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS4KKwkJCQkJcEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hID09CisJCQkJCUNERl9QMlBfQ0xJRU5UX01PREUpIHx8CisJCQkJICAgIChwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uCisJCQkJCXBDdXJSb2FtUHJvZmlsZS0+Y3NyUGVyc29uYSA9PQorCQkJCQlDREZfU1RBX01PREUpKSkgeworCQkJCQkvKiBjaGVjayBmb3IgUDJQX2NsaWVudCBzY2VuYXJpbyAqLworCQkJCQlpZiAoKHBNYWMtPnJvYW0uCisJCQkJCSAgICAgcm9hbVNlc3Npb25bc2Vzc2lvbklkXS4KKwkJCQkJICAgICBjb25uZWN0ZWRQcm9maWxlLgorCQkJCQkgICAgIG9wZXJhdGlvbkNoYW5uZWwgPT0gMCkKKwkJCQkJICAgICYmIChwTWFjLT5yb2FtLgorCQkJCQkJcm9hbVNlc3Npb25bc2Vzc2lvbklkXS4KKwkJCQkJCWNvbm5lY3RlZFByb2ZpbGUuCisJCQkJCQliZWFjb25JbnRlcnZhbCA9PSAwKSkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQlpZiAoY3NyX2lzX2Nvbm5fc3RhdGVfY29ubmVjdGVkX2luZnJhCisJCQkJCQkgICAgKHBNYWMsIHNlc3Npb25JZCkKKwkJCQkJICAgICYmIChwTWFjLT5yb2FtLgorCQkJCQkJcm9hbVNlc3Npb25bc2Vzc2lvbklkXS4KKwkJCQkJCWNvbm5lY3RlZFByb2ZpbGUuCisJCQkJCQlvcGVyYXRpb25DaGFubmVsICE9CisJCQkJCQljaGFubmVsSWQpCisJCQkJCSAgICAmJiAocE1hYy0+cm9hbS4KKwkJCQkJCXJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uCisJCQkJCQljb25uZWN0ZWRQcm9maWxlLgorCQkJCQkJYmVhY29uSW50ZXJ2YWwgIT0KKwkJCQkJCSpiZWFjb25JbnRlcnZhbCkpIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBVcGRhdGVkIGJlYWNvbkludGVydmFsIHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiB3ZSBhcmUgc3RhcnRpbmcgYSBuZXcgQlNTCisJCQkJCQkgKiBub3QgaW5jYXNlIG9mIGNsaWVudCBvciBTVEEgY2FzZQorCQkJCQkJICovCisJCQkJCQkvKiBDYWxjdWxhdGUgYmVhY29uIEludGVydmFsIGZvciBQMlAtR08gaW5jYXNlIG9mIE1DQyAqLworCQkJCQkJaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY29uY19jdXN0b21fcnVsZTEgfHwKKwkJCQkJCQlwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNvbmNfY3VzdG9tX3J1bGUyKSB7CisJCQkJCQkJbmV3X2JlYWNvbkludGVydmFsID0gQ1NSX0NVU1RPTV9DT05DX0dPX0JJOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQluZXdfYmVhY29uSW50ZXJ2YWwgPQorCQkJCQkJCQljc3JfY2FsY3VsYXRlX21jY19iZWFjb25faW50ZXJ2YWwKKwkJCQkJCQkJKHBNYWMsCisJCQkJCQkJCSBwTWFjLT5yb2FtLgorCQkJCQkJCQkgcm9hbVNlc3Npb24KKwkJCQkJCQkJIFtzZXNzaW9uSWRdLgorCQkJCQkJCQkgY29ubmVjdGVkUHJvZmlsZS4KKwkJCQkJCQkJIGJlYWNvbkludGVydmFsLAorCQkJCQkJCQkgKmJlYWNvbkludGVydmFsKTsKKwkJCQkJCX0KKwkJCQkJCWlmICgqYmVhY29uSW50ZXJ2YWwgIT0KKwkJCQkJCSAgICBuZXdfYmVhY29uSW50ZXJ2YWwpCisJCQkJCQkJKmJlYWNvbkludGVydmFsCisJCQkJCQkJCT0KKwkJCQkJCQkJCW5ld19iZWFjb25JbnRlcnZhbDsKKwkJCQkJCXJldHVybgorCQkJCQkJCUNERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkJRkwoIiBQZXJzb25hIG5vdCBzdXBwb3J0ZWQgOiAlZCIpLAorCQkJCQljdXJyQnNzUGVyc29uYSk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKiBGdW5jdGlvbiB0byByZXR1cm4gdHJ1ZSBpZiB0aGUgYXV0aHR5cGUgaXMgMTFyICovCitib29sIGNzcl9pc19hdXRoX3R5cGUxMXIoZUNzckF1dGhUeXBlIEF1dGhUeXBlLCB1aW50OF90IG1kaWVQcmVzZW50KQoreworCXN3aXRjaCAoQXV0aFR5cGUpIHsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOgorCQlpZiAobWRpZVByZXNlbnQpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9GVF9SU05fUFNLOgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfRlRfUlNOOgorCQlyZXR1cm4gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyogRnVuY3Rpb24gdG8gcmV0dXJuIHRydWUgaWYgdGhlIHByb2ZpbGUgaXMgMTFyICovCitib29sIGNzcl9pc19wcm9maWxlMTFyKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUpCit7CisJcmV0dXJuIGNzcl9pc19hdXRoX3R5cGUxMXIocFByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSwKKwkJCQkgICBwUHJvZmlsZS0+TURJRC5tZGllUHJlc2VudCk7Cit9CisKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCisvKiBGdW5jdGlvbiB0byByZXR1cm4gdHJ1ZSBpZiB0aGUgYXV0aHR5cGUgaXMgRVNFICovCitib29sIGNzcl9pc19hdXRoX3R5cGVfZXNlKGVDc3JBdXRoVHlwZSBBdXRoVHlwZSkKK3sKKwlzd2l0Y2ggKEF1dGhUeXBlKSB7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQToKKwljYXNlIGVDU1JfQVVUSF9UWVBFX0NDS01fUlNOOgorCQlyZXR1cm4gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyogRnVuY3Rpb24gdG8gcmV0dXJuIHRydWUgaWYgdGhlIHByb2ZpbGUgaXMgRVNFICovCitib29sIGNzcl9pc19wcm9maWxlX2VzZSh0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlKQoreworCXJldHVybiBjc3JfaXNfYXV0aF90eXBlX2VzZShwUHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlKTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorYm9vbCBjc3JfaXNfcHJvZmlsZV93YXBpKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUpCit7CisJYm9vbCBmV2FwaVByb2ZpbGUgPSBmYWxzZTsKKworCXN3aXRjaCAocFByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSkgeworCWNhc2UgZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfQ0VSVElGSUNBVEU6CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9QU0s6CisJCWZXYXBpUHJvZmlsZSA9IHRydWU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZldhcGlQcm9maWxlID0gZmFsc2U7CisJCWJyZWFrOworCX0KKworCWlmIChmV2FwaVByb2ZpbGUpIHsKKwkJc3dpdGNoIChwUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUpIHsKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk6CisJCQlmV2FwaVByb2ZpbGUgPSB0cnVlOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWZXYXBpUHJvZmlsZSA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGZXYXBpUHJvZmlsZTsKK30KKworc3RhdGljIGJvb2wgY3NyX2lzX3dhcGlfb3VpX2VxdWFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3QgKk91aTEsCisJCQkJICB1aW50OF90ICpPdWkyKQoreworCXJldHVybiBjZGZfbWVtX2NvbXBhcmUoT3VpMSwgT3VpMiwgQ1NSX1dBUElfT1VJX1NJWkUpOworfQorCitzdGF0aWMgYm9vbCBjc3JfaXNfd2FwaV9vdWlfbWF0Y2godHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgIHVpbnQ4X3QgQWxsQ3lwaGVyc1tdW0NTUl9XQVBJX09VSV9TSVpFXSwKKwkJCQkgIHVpbnQ4X3QgY0FsbEN5cGhlcnMsIHVpbnQ4X3QgQ3lwaGVyW10sCisJCQkJICB1aW50OF90IE91aVtdKQoreworCWJvb2wgZlllcyA9IGZhbHNlOworCXVpbnQ4X3QgaWR4OworCisJZm9yIChpZHggPSAwOyBpZHggPCBjQWxsQ3lwaGVyczsgaWR4KyspIHsKKwkJaWYgKGNzcl9pc193YXBpX291aV9lcXVhbChwTWFjLCBBbGxDeXBoZXJzW2lkeF0sIEN5cGhlcikpIHsKKwkJCWZZZXMgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZlllcyAmJiBPdWkpIHsKKwkJY2RmX21lbV9jb3B5KE91aSwgQWxsQ3lwaGVyc1tpZHhdLCBDU1JfV0FQSV9PVUlfU0laRSk7CisJfQorCisJcmV0dXJuIGZZZXM7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKworc3RhdGljIGJvb2wgY3NyX2lzX3dwYV9vdWlfZXF1YWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqT3VpMSwKKwkJCQkgdWludDhfdCAqT3VpMikKK3sKKwlyZXR1cm4gY2RmX21lbV9jb21wYXJlKE91aTEsIE91aTIsIENTUl9XUEFfT1VJX1NJWkUpOworfQorCitzdGF0aWMgYm9vbCBjc3JfaXNfb3VpX21hdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgIHVpbnQ4X3QgQWxsQ3lwaGVyc1tdW0NTUl9XUEFfT1VJX1NJWkVdLAorCQkJICAgICB1aW50OF90IGNBbGxDeXBoZXJzLCB1aW50OF90IEN5cGhlcltdLCB1aW50OF90IE91aVtdKQoreworCWJvb2wgZlllcyA9IGZhbHNlOworCXVpbnQ4X3QgaWR4OworCisJZm9yIChpZHggPSAwOyBpZHggPCBjQWxsQ3lwaGVyczsgaWR4KyspIHsKKwkJaWYgKGNzcl9pc193cGFfb3VpX2VxdWFsKHBNYWMsIEFsbEN5cGhlcnNbaWR4XSwgQ3lwaGVyKSkgeworCQkJZlllcyA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChmWWVzICYmIE91aSkgeworCQljZGZfbWVtX2NvcHkoT3VpLCBBbGxDeXBoZXJzW2lkeF0sIENTUl9XUEFfT1VJX1NJWkUpOworCX0KKworCXJldHVybiBmWWVzOworfQorCitzdGF0aWMgYm9vbCBjc3JfbWF0Y2hfcnNub3VpX2luZGV4KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgdWludDhfdCBBbGxDeXBoZXJzW11bQ1NSX1JTTl9PVUlfU0laRV0sCisJCQkJICAgdWludDhfdCBjQWxsQ3lwaGVycywgdWludDhfdCBvdWlJbmRleCwKKwkJCQkgICB1aW50OF90IE91aVtdKQoreworCXJldHVybiBjc3JfaXNfb3VpX21hdGNoCisJCShwTWFjLCBBbGxDeXBoZXJzLCBjQWxsQ3lwaGVycywgY3NyX3Jzbl9vdWlbb3VpSW5kZXhdLCBPdWkpOworCit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorc3RhdGljIGJvb2wgY3NyX21hdGNoX3dhcGlfb3VpX2luZGV4KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICB1aW50OF90IEFsbEN5cGhlcnNbXVtDU1JfV0FQSV9PVUlfU0laRV0sCisJCQkJICAgICB1aW50OF90IGNBbGxDeXBoZXJzLCB1aW50OF90IG91aUluZGV4LAorCQkJCSAgICAgdWludDhfdCBPdWlbXSkKK3sKKwlyZXR1cm4gY3NyX2lzX3dhcGlfb3VpX21hdGNoCisJCShwTWFjLCBBbGxDeXBoZXJzLCBjQWxsQ3lwaGVycywgY3NyX3dhcGlfb3VpW291aUluZGV4XSwgT3VpKTsKKworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKK3N0YXRpYyBib29sIGNzcl9tYXRjaF93cGFvdWlfaW5kZXgodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICB1aW50OF90IEFsbEN5cGhlcnNbXVtDU1JfUlNOX09VSV9TSVpFXSwKKwkJCQkgICB1aW50OF90IGNBbGxDeXBoZXJzLCB1aW50OF90IG91aUluZGV4LAorCQkJCSAgIHVpbnQ4X3QgT3VpW10pCit7CisJcmV0dXJuIGNzcl9pc19vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3Jfd3BhX291aVtvdWlJbmRleF0sIE91aSk7CisKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCitzdGF0aWMgYm9vbCBjc3JfaXNfYXV0aF93YXBpX2NlcnQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgIHVpbnQ4X3QgQWxsU3VpdGVzW11bQ1NSX1dBUElfT1VJX1NJWkVdLAorCQkJCSAgdWludDhfdCBjQWxsU3VpdGVzLCB1aW50OF90IE91aVtdKQoreworCXJldHVybiBjc3JfaXNfd2FwaV9vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyX3dhcGlfb3VpWzFdLCBPdWkpOworfQorCitzdGF0aWMgYm9vbCBjc3JfaXNfYXV0aF93YXBpX3Bzayh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSB1aW50OF90IEFsbFN1aXRlc1tdW0NTUl9XQVBJX09VSV9TSVpFXSwKKwkJCQkgdWludDhfdCBjQWxsU3VpdGVzLCB1aW50OF90IE91aVtdKQoreworCXJldHVybiBjc3JfaXNfd2FwaV9vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyX3dhcGlfb3VpWzJdLCBPdWkpOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCisvKgorICogRnVuY3Rpb24gZm9yIDExUiBGVCBBdXRoZW50aWNhdGlvbi4gV2UgbWF0Y2ggdGhlIEZUIEF1dGhlbnRpY2F0aW9uIENpcGhlcgorICogc3VpdGUgaGVyZS4gVGhpcyBtYXRjaGVzIGZvciBGVCBBdXRoIHdpdGggdGhlIDgwMi4xWCBleGNoYW5nZS4KKyAqLworc3RhdGljIGJvb2wgY3NyX2lzX2Z0X2F1dGhfcnNuKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgICAgdWludDhfdCBBbGxTdWl0ZXNbXVtDU1JfUlNOX09VSV9TSVpFXSwKKwkJCSAgICAgICB1aW50OF90IGNBbGxTdWl0ZXMsIHVpbnQ4X3QgT3VpW10pCit7CisJcmV0dXJuIGNzcl9pc19vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyX3Jzbl9vdWlbMDNdLCBPdWkpOworfQorCisvKgorICogRnVuY3Rpb24gZm9yIDExUiBGVCBBdXRoZW50aWNhdGlvbi4gV2UgbWF0Y2ggdGhlIEZUIEF1dGhlbnRpY2F0aW9uIENpcGhlcgorICogc3VpdGUgaGVyZS4gVGhpcyBtYXRjaGVzIGZvciBGVCBBdXRoIHdpdGggdGhlIFBTSy4KKyAqLworc3RhdGljIGJvb2wgY3NyX2lzX2Z0X2F1dGhfcnNuX3Bzayh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgIHVpbnQ4X3QgQWxsU3VpdGVzW11bQ1NSX1JTTl9PVUlfU0laRV0sCisJCQkJICAgdWludDhfdCBjQWxsU3VpdGVzLCB1aW50OF90IE91aVtdKQoreworCXJldHVybiBjc3JfaXNfb3VpX21hdGNoCisJCShwTWFjLCBBbGxTdWl0ZXMsIGNBbGxTdWl0ZXMsIGNzcl9yc25fb3VpWzA0XSwgT3VpKTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisKKy8qCisgKiBGdW5jdGlvbiBmb3IgRVNFIENDS00gQUtNIEF1dGhlbnRpY2F0aW9uLiBXZSBtYXRjaCB0aGUgQ0NLTSBBS00KKyAqIEF1dGhlbnRpY2F0aW9uIEtleSBNYW5hZ2VtZW50IHN1aXRlIGhlcmUuIFRoaXMgbWF0Y2hlcyBmb3IgQ0NLTSBBS00gQXV0aAorICogd2l0aCB0aGUgODAyLjFYIGV4Y2hhbmdlLgorICovCitzdGF0aWMgYm9vbCBjc3JfaXNfZXNlX2Nja21fYXV0aF9yc24odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgIHVpbnQ4X3QgQWxsU3VpdGVzW11bQ1NSX1JTTl9PVUlfU0laRV0sCisJCQkJICAgICB1aW50OF90IGNBbGxTdWl0ZXMsIHVpbnQ4X3QgT3VpW10pCit7CisJcmV0dXJuIGNzcl9pc19vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyX3Jzbl9vdWlbMDZdLCBPdWkpOworfQorCitzdGF0aWMgYm9vbCBjc3JfaXNfZXNlX2Nja21fYXV0aF93cGEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgIHVpbnQ4X3QgQWxsU3VpdGVzW11bQ1NSX1dQQV9PVUlfU0laRV0sCisJCQkJICAgICB1aW50OF90IGNBbGxTdWl0ZXMsIHVpbnQ4X3QgT3VpW10pCit7CisJcmV0dXJuIGNzcl9pc19vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyX3dwYV9vdWlbMDZdLCBPdWkpOworfQorCisjZW5kaWYKKworc3RhdGljIGJvb2wgY3NyX2lzX2F1dGhfcnNuKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgdWludDhfdCBBbGxTdWl0ZXNbXVtDU1JfUlNOX09VSV9TSVpFXSwKKwkJCSAgICB1aW50OF90IGNBbGxTdWl0ZXMsIHVpbnQ4X3QgT3VpW10pCit7CisJcmV0dXJuIGNzcl9pc19vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyX3Jzbl9vdWlbMDFdLCBPdWkpOworfQorCitzdGF0aWMgYm9vbCBjc3JfaXNfYXV0aF9yc25fcHNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdWludDhfdCBBbGxTdWl0ZXNbXVtDU1JfUlNOX09VSV9TSVpFXSwKKwkJCQl1aW50OF90IGNBbGxTdWl0ZXMsIHVpbnQ4X3QgT3VpW10pCit7CisJcmV0dXJuIGNzcl9pc19vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyX3Jzbl9vdWlbMDJdLCBPdWkpOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworc3RhdGljIGJvb2wgY3NyX2lzX2F1dGhfcnNuX3Bza19zaGEyNTYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICAgdWludDhfdCBBbGxTdWl0ZXNbXVtDU1JfUlNOX09VSV9TSVpFXSwKKwkJCQkgICAgICAgdWludDhfdCBjQWxsU3VpdGVzLCB1aW50OF90IE91aVtdKQoreworCXJldHVybiBjc3JfaXNfb3VpX21hdGNoCisJCShwTWFjLCBBbGxTdWl0ZXMsIGNBbGxTdWl0ZXMsIGNzcl9yc25fb3VpWzA3XSwgT3VpKTsKK30KK3N0YXRpYyBib29sIGNzcl9pc19hdXRoX3JzbjgwMjF4X3NoYTI1Nih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQl1aW50OF90IEFsbFN1aXRlc1tdW0NTUl9SU05fT1VJX1NJWkVdLAorCQkJCQl1aW50OF90IGNBbGxTdWl0ZXMsIHVpbnQ4X3QgT3VpW10pCit7CisJcmV0dXJuIGNzcl9pc19vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyX3Jzbl9vdWlbOF0sIE91aSk7Cit9CisjZW5kaWYKKworc3RhdGljIGJvb2wgY3NyX2lzX2F1dGhfd3BhKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgdWludDhfdCBBbGxTdWl0ZXNbXVtDU1JfV1BBX09VSV9TSVpFXSwKKwkJCSAgICB1aW50OF90IGNBbGxTdWl0ZXMsIHVpbnQ4X3QgT3VpW10pCit7CisJcmV0dXJuIGNzcl9pc19vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyX3dwYV9vdWlbMDFdLCBPdWkpOworfQorCitzdGF0aWMgYm9vbCBjc3JfaXNfYXV0aF93cGFfcHNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdWludDhfdCBBbGxTdWl0ZXNbXVtDU1JfV1BBX09VSV9TSVpFXSwKKwkJCQl1aW50OF90IGNBbGxTdWl0ZXMsIHVpbnQ4X3QgT3VpW10pCit7CisJcmV0dXJuIGNzcl9pc19vdWlfbWF0Y2gKKwkJKHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyX3dwYV9vdWlbMDJdLCBPdWkpOworfQorCit1aW50OF90IGNzcl9nZXRfb3VpX2luZGV4X2Zyb21fY2lwaGVyKGVDc3JFbmNyeXB0aW9uVHlwZSBlblR5cGUpCit7CisJdWludDhfdCBPVUlJbmRleDsKKworCXN3aXRjaCAoZW5UeXBlKSB7CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDoKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWToKKwkJT1VJSW5kZXggPSBDU1JfT1VJX1dFUDQwX09SXzFYX0lOREVYOworCQlicmVhazsKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDoKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk6CisJCU9VSUluZGV4ID0gQ1NSX09VSV9XRVAxMDRfSU5ERVg7CisJCWJyZWFrOworCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDoKKwkJT1VJSW5kZXggPSBDU1JfT1VJX1RLSVBfT1JfUFNLX0lOREVYOworCQlicmVhazsKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX0FFUzoKKwkJT1VJSW5kZXggPSBDU1JfT1VJX0FFU19JTkRFWDsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOgorCQlPVUlJbmRleCA9IENTUl9PVUlfVVNFX0dST1VQX0NJUEhFUl9JTkRFWDsKKwkJYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dQSToKKwkJT1VJSW5kZXggPSBDU1JfT1VJX1dBUElfV0FJX0NFUlRfT1JfU01TNF9JTkRFWDsKKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKwlkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiBIT1dUTyBoYW5kbGUgdGhpcz8gKi8KKwkJT1VJSW5kZXggPSBDU1JfT1VJX1JFU0VSVkVEX0lOREVYOworCQlicmVhazsKKwl9IC8qIHN3aXRjaCAqLworCisJcmV0dXJuIE9VSUluZGV4OworfQorLyoqCisgKiBjc3JfZ2V0X3Jzbl9pbmZvcm1hdGlvbigpIC0gdG8gZ2V0IFJTTiBpbmZvbWF0aW9uCisgKiBAaGFsOiBwb2ludGVyIHRvIEhBTAorICogQGF1dGhfdHlwZTogYXV0aCB0eXBlCisgKiBAZW5jcl90eXBlOiBlbmNyeXB0aW9uIHR5cGUKKyAqIEBtY19lbmNyeXB0aW9uOiBtdWx0aWNhc3QgZW5jcnlwdGlvbiB0eXBlCisgKiBAcnNuX2llOiBwb2ludGVyIHRvIFJTTiBJRQorICogQHVjYXN0X2NpcGhlcjogVW5pY2FzdCBjaXBoZXIKKyAqIEBtY2FzdF9jaXBoZXI6IE11bHRpY2FzdCBjaXBoZXIKKyAqIEBhdXRoX3N1aXRlOiBBdXRoZW50aWNhdGlvbiBzdWl0ZQorICogQGNhcGFiaWxpdGllczogUlNOIGNhcGFiaWxpdGllcworICogQG5lZ290aWF0ZWRfYXV0aHR5cGU6IE5lZ290aWF0ZWQgYXV0aCB0eXBlCisgKiBAbmVnb3RpYXRlZF9tY2NpcGhlcjogbmVnb3RpYXRlZCBtdWx0aWNhc3QgY2lwaGVyCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgZ2V0IGFsbCBSU04gaW5mb3JtYXRpb24KKyAqCisgKiBSZXR1cm46IGJvb2wKKyAqLworYm9vbCBjc3JfZ2V0X3Jzbl9pbmZvcm1hdGlvbih0SGFsSGFuZGxlIGhhbCwgdENzckF1dGhMaXN0ICphdXRoX3R5cGUsCisJCQkgICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBlbmNyX3R5cGUsCisJCQkgICAgIHRDc3JFbmNyeXB0aW9uTGlzdCAqbWNfZW5jcnlwdGlvbiwKKwkJCSAgICAgdERvdDExZklFUlNOICpyc25faWUsIHVpbnQ4X3QgKnVjYXN0X2NpcGhlciwKKwkJCSAgICAgdWludDhfdCAqbWNhc3RfY2lwaGVyLCB1aW50OF90ICphdXRoX3N1aXRlLAorCQkJICAgICB0Q3NyUlNOQ2FwYWJpbGl0aWVzICpjYXBhYmlsaXRpZXMsCisJCQkgICAgIGVDc3JBdXRoVHlwZSAqbmVnb3RpYXRlZF9hdXRodHlwZSwKKwkJCSAgICAgZUNzckVuY3J5cHRpb25UeXBlICpuZWdvdGlhdGVkX21jY2lwaGVyKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWwpOworCWJvb2wgYWNjZXB0YWJsZV9jaXBoZXIgPSBmYWxzZTsKKwl1aW50OF90IGNfdWNhc3RfY2lwaGVyID0gMDsKKwl1aW50OF90IGNfbWNhc3RfY2lwaGVyID0gMDsKKwl1aW50OF90IGNfYXV0aF9zdWl0ZXMgPSAwLCBpOworCXVpbnQ4X3QgdW5pY2FzdFtDU1JfUlNOX09VSV9TSVpFXTsKKwl1aW50OF90IG11bHRpY2FzdFtDU1JfUlNOX09VSV9TSVpFXTsKKwl1aW50OF90IGF1dGhzdWl0ZXNbQ1NSX1JTTl9NQVhfQVVUSF9TVUlURVNdW0NTUl9SU05fT1VJX1NJWkVdOworCXVpbnQ4X3QgYXV0aGVudGljYXRpb25bQ1NSX1JTTl9PVUlfU0laRV07CisJdWludDhfdCBtY2NpcGhlcl9hcnJbQ1NSX1JTTl9NQVhfTVVMVElDQVNUX0NZUEhFUlNdW0NTUl9SU05fT1VJX1NJWkVdOworCWVDc3JBdXRoVHlwZSBuZWdfYXV0aHR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworCisJaWYgKCFyc25faWUtPnByZXNlbnQpCisJCWdvdG8gZW5kOworCWNfbWNhc3RfY2lwaGVyKys7CisJY2RmX21lbV9jb3B5KG1jY2lwaGVyX2FyciwgcnNuX2llLT5ncF9jaXBoZXJfc3VpdGUsCisJCQlDU1JfUlNOX09VSV9TSVpFKTsKKwljX3VjYXN0X2NpcGhlciA9CisJCSh1aW50OF90KSAocnNuX2llLT5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQpOworCWNfYXV0aF9zdWl0ZXMgPSAodWludDhfdCkgKHJzbl9pZS0+YWttX3N1aXRlX2NvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgY19hdXRoX3N1aXRlcyAmJiBpIDwgQ1NSX1JTTl9NQVhfQVVUSF9TVUlURVM7IGkrKykgeworCQljZGZfbWVtX2NvcHkoKHZvaWQgKikmYXV0aHN1aXRlc1tpXSwKKwkJCSh2b2lkICopJnJzbl9pZS0+YWttX3N1aXRlc1tpXSwgQ1NSX1JTTl9PVUlfU0laRSk7CisJfQorCisJLyogQ2hlY2sgLSBJcyByZXF1ZXN0ZWQgdW5pY2FzdCBDaXBoZXIgc3VwcG9ydGVkIGJ5IHRoZSBCU1MuICovCisJYWNjZXB0YWJsZV9jaXBoZXIgPSBjc3JfbWF0Y2hfcnNub3VpX2luZGV4KG1hY19jdHgsCisJCQkJcnNuX2llLT5wd2lzZV9jaXBoZXJfc3VpdGVzLCBjX3VjYXN0X2NpcGhlciwKKwkJCQljc3JfZ2V0X291aV9pbmRleF9mcm9tX2NpcGhlcihlbmNyX3R5cGUpLAorCQkJCXVuaWNhc3QpOworCisJaWYgKCFhY2NlcHRhYmxlX2NpcGhlcikKKwkJZ290byBlbmQ7CisKKwkvKiB1bmljYXN0IGlzIHN1cHBvcnRlZC4gUGljayB0aGUgZmlyc3QgbWF0Y2hpbmcgR3JvdXAgY2lwaGVyLCBpZiBhbnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWNfZW5jcnlwdGlvbi0+bnVtRW50cmllczsgaSsrKSB7CisJCWFjY2VwdGFibGVfY2lwaGVyID0gY3NyX21hdGNoX3Jzbm91aV9pbmRleChtYWNfY3R4LAorCQkJCQltY2NpcGhlcl9hcnIsIGNfbWNhc3RfY2lwaGVyLAorCQkJCQljc3JfZ2V0X291aV9pbmRleF9mcm9tX2NpcGhlcigKKwkJCQkJICAgIG1jX2VuY3J5cHRpb24tPmVuY3J5cHRpb25UeXBlW2ldKSwKKwkJCQkJbXVsdGljYXN0KTsKKwkJaWYgKGFjY2VwdGFibGVfY2lwaGVyKQorCQkJYnJlYWs7CisJfQorCWlmICghYWNjZXB0YWJsZV9jaXBoZXIpCisJCWdvdG8gZW5kOworCisJaWYgKG5lZ290aWF0ZWRfbWNjaXBoZXIpCisJCSpuZWdvdGlhdGVkX21jY2lwaGVyID0gbWNfZW5jcnlwdGlvbi0+ZW5jcnlwdGlvblR5cGVbaV07CisKKwkvKiBJbml0aWFsaXppbmcgd2l0aCBmYWxzZSBhcyBpdCBoYXMgdHJ1ZSB2YWx1ZSBhbHJlYWR5ICovCisJYWNjZXB0YWJsZV9jaXBoZXIgPSBmYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgYXV0aF90eXBlLT5udW1FbnRyaWVzOyBpKyspIHsKKwkJLyoKKwkJICogQ2lwaGVycyBhcmUgc3VwcG9ydGVkLCBNYXRjaCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gYW5kCisJCSAqIHBpY2sgZmlyc3QgbWF0Y2hpbmcgYXV0aHR5cGUuCisJCSAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJCS8qIENoYW5nZWQgdGhlIEFLTSBzdWl0ZXMgYWNjb3JkaW5nIHRvIG9yZGVyIG9mIHByZWZlcmVuY2UgKi8KKwkJaWYgKGNzcl9pc19mdF9hdXRoX3JzbihtYWNfY3R4LCBhdXRoc3VpdGVzLAorCQkJCQljX2F1dGhfc3VpdGVzLCBhdXRoZW50aWNhdGlvbikpIHsKKwkJCWlmIChlQ1NSX0FVVEhfVFlQRV9GVF9SU04gPT0gYXV0aF90eXBlLT5hdXRoVHlwZVtpXSkKKwkJCQluZWdfYXV0aHR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9GVF9SU047CisJCX0KKwkJaWYgKChuZWdfYXV0aHR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTikKKwkJCQkmJiBjc3JfaXNfZnRfYXV0aF9yc25fcHNrKG1hY19jdHgsIGF1dGhzdWl0ZXMsCisJCQkJCWNfYXV0aF9zdWl0ZXMsIGF1dGhlbnRpY2F0aW9uKSkgeworCQkJaWYgKGVDU1JfQVVUSF9UWVBFX0ZUX1JTTl9QU0sgPT0KKwkJCQkJYXV0aF90eXBlLT5hdXRoVHlwZVtpXSkKKwkJCQluZWdfYXV0aHR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9GVF9SU05fUFNLOworCQl9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCS8qIEVTRSBvbmx5IHN1cHBvcnRzIDgwMi4xWC4gIE5vIFBTSy4gKi8KKwkJaWYgKChuZWdfYXV0aHR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTikgJiYKKwkJCQljc3JfaXNfZXNlX2Nja21fYXV0aF9yc24obWFjX2N0eCwgYXV0aHN1aXRlcywKKwkJCQkJY19hdXRoX3N1aXRlcywgYXV0aGVudGljYXRpb24pKSB7CisJCQlpZiAoZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU04gPT0gYXV0aF90eXBlLT5hdXRoVHlwZVtpXSkKKwkJCQluZWdfYXV0aHR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1JTTjsKKwkJfQorI2VuZGlmCisJCWlmICgobmVnX2F1dGh0eXBlID09IGVDU1JfQVVUSF9UWVBFX1VOS05PV04pCisJCQkJJiYgY3NyX2lzX2F1dGhfcnNuKG1hY19jdHgsIGF1dGhzdWl0ZXMsCisJCQkJCWNfYXV0aF9zdWl0ZXMsIGF1dGhlbnRpY2F0aW9uKSkgeworCQkJaWYgKGVDU1JfQVVUSF9UWVBFX1JTTiA9PSBhdXRoX3R5cGUtPmF1dGhUeXBlW2ldKQorCQkJCW5lZ19hdXRodHlwZSA9IGVDU1JfQVVUSF9UWVBFX1JTTjsKKwkJfQorCQlpZiAoKG5lZ19hdXRodHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOKQorCQkJCSYmIGNzcl9pc19hdXRoX3Jzbl9wc2sobWFjX2N0eCwgYXV0aHN1aXRlcywKKwkJCQkJY19hdXRoX3N1aXRlcywgYXV0aGVudGljYXRpb24pKSB7CisJCQlpZiAoZUNTUl9BVVRIX1RZUEVfUlNOX1BTSyA9PSBhdXRoX3R5cGUtPmF1dGhUeXBlW2ldKQorCQkJCW5lZ19hdXRodHlwZSA9IGVDU1JfQVVUSF9UWVBFX1JTTl9QU0s7CisJCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJCWlmICgobmVnX2F1dGh0eXBlID09IGVDU1JfQVVUSF9UWVBFX1VOS05PV04pCisJCQkmJiBjc3JfaXNfYXV0aF9yc25fcHNrX3NoYTI1NihtYWNfY3R4LCBhdXRoc3VpdGVzLAorCQkJCQljX2F1dGhfc3VpdGVzLCBhdXRoZW50aWNhdGlvbikpIHsKKwkJCWlmIChlQ1NSX0FVVEhfVFlQRV9SU05fUFNLX1NIQTI1NiA9PQorCQkJCQlhdXRoX3R5cGUtPmF1dGhUeXBlW2ldKQorCQkJCW5lZ19hdXRodHlwZSA9IGVDU1JfQVVUSF9UWVBFX1JTTl9QU0tfU0hBMjU2OworCQl9CisJCWlmICgobmVnX2F1dGh0eXBlID09IGVDU1JfQVVUSF9UWVBFX1VOS05PV04pICYmCisJCQkJY3NyX2lzX2F1dGhfcnNuODAyMXhfc2hhMjU2KG1hY19jdHgsIGF1dGhzdWl0ZXMsCisJCQkJCWNfYXV0aF9zdWl0ZXMsIGF1dGhlbnRpY2F0aW9uKSkgeworCQkJaWYgKGVDU1JfQVVUSF9UWVBFX1JTTl84MDIxWF9TSEEyNTYgPT0KKwkJCQkJYXV0aF90eXBlLT5hdXRoVHlwZVtpXSkKKwkJCQluZWdfYXV0aHR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9SU05fODAyMVhfU0hBMjU2OworCQl9CisjZW5kaWYKKworCQkvKgorCQkgKiBUaGUgMXN0IGF1dGggdHlwZSBpbiB0aGUgQVBzIFJTTiBJRSwgdG8gbWF0Y2ggc3RhdGlvbnMKKwkJICogY29ubmVjdGluZyBwcm9maWxlcyBhdXRoIHR5cGUgd2lsbCBjYXVzZSB1cyB0byBleGl0IHRoaXMKKwkJICogbG9vcC4gVGhpcyBpcyBhZGRlZCBhcyBzb21lIEFQcyBhZHZlcnRpc2UgbXVsdGlwbGUgYWttcyBpbgorCQkgKiB0aGUgUlNOIElFCisJCSAqLworCQlpZiAoZUNTUl9BVVRIX1RZUEVfVU5LTk9XTiAhPSBuZWdfYXV0aHR5cGUpIHsKKwkJCWFjY2VwdGFibGVfY2lwaGVyID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfSAvKiBmb3IgKi8KK2VuZDoKKwlpZiAoYWNjZXB0YWJsZV9jaXBoZXIpIHsKKwkJaWYgKG1jYXN0X2NpcGhlcikKKwkJCWNkZl9tZW1fY29weShtY2FzdF9jaXBoZXIsIG11bHRpY2FzdCwKKwkJCQkJQ1NSX1JTTl9PVUlfU0laRSk7CisKKwkJaWYgKHVjYXN0X2NpcGhlcikKKwkJCWNkZl9tZW1fY29weSh1Y2FzdF9jaXBoZXIsIHVuaWNhc3QsIENTUl9SU05fT1VJX1NJWkUpOworCisJCWlmIChhdXRoX3N1aXRlKQorCQkJY2RmX21lbV9jb3B5KGF1dGhfc3VpdGUsIGF1dGhlbnRpY2F0aW9uLAorCQkJCQlDU1JfUlNOX09VSV9TSVpFKTsKKworCQlpZiAobmVnb3RpYXRlZF9hdXRodHlwZSkKKwkJCSpuZWdvdGlhdGVkX2F1dGh0eXBlID0gbmVnX2F1dGh0eXBlOworCisJCWlmIChjYXBhYmlsaXRpZXMpIHsKKwkJCS8qIEJpdCAwIFByZWF1dGhlbnRpY2F0aW9uICovCisJCQljYXBhYmlsaXRpZXMtPlByZUF1dGhTdXBwb3J0ZWQgPQorCQkJCShyc25faWUtPlJTTl9DYXBbMF0gPj4gMCkgJiAweDE7CisJCQkvKiBCaXQgMSBObyBQYWlyd2lzZSAqLworCQkJY2FwYWJpbGl0aWVzLT5Ob1BhaXJ3aXNlID0KKwkJCQkocnNuX2llLT5SU05fQ2FwWzBdID4+IDEpICYgMHgxOworCQkJLyogQml0IDIsIDMgUFRLU0EgUmVwbGF5IENvdW50ZXIgKi8KKwkJCWNhcGFiaWxpdGllcy0+UFRLU0FSZXBsYXlDb3VudGVyID0KKwkJCQkocnNuX2llLT5SU05fQ2FwWzBdID4+IDIpICYgMHgzOworCQkJLyogQml0IDQsIDUgR1RLU0EgUmVwbGF5IENvdW50ZXIgKi8KKwkJCWNhcGFiaWxpdGllcy0+R1RLU0FSZXBsYXlDb3VudGVyID0KKwkJCQkocnNuX2llLT5SU05fQ2FwWzBdID4+IDQpICYgMHgzOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwkJCS8qIEJpdCA2IE1GUFIgKi8KKwkJCWNhcGFiaWxpdGllcy0+TUZQUmVxdWlyZWQgPQorCQkJCShyc25faWUtPlJTTl9DYXBbMF0gPj4gNikgJiAweDE7CisJCQkvKiBCaXQgNyBNRlBDICovCisJCQljYXBhYmlsaXRpZXMtPk1GUENhcGFibGUgPQorCQkJCShyc25faWUtPlJTTl9DYXBbMF0gPj4gNykgJiAweDE7CisjZWxzZQorCQkJLyogQml0IDYgTUZQUiAqLworCQkJY2FwYWJpbGl0aWVzLT5NRlBSZXF1aXJlZCA9IDA7CisJCQkvKiBCaXQgNyBNRlBDICovCisJCQljYXBhYmlsaXRpZXMtPk1GUENhcGFibGUgPSAwOworI2VuZGlmCisJCQkvKiByZW1haW5pbmcgcmVzZXJ2ZWQgKi8KKwkJCWNhcGFiaWxpdGllcy0+UmVzZXJ2ZWQgPSByc25faWUtPlJTTl9DYXBbMV0gJiAweGZmOworCQl9CisJfQorCXJldHVybiBhY2NlcHRhYmxlX2NpcGhlcjsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKy8qKgorICogY3NyX2lzX3BtZl9jYXBhYmlsaXRpZXNfaW5fcnNuX21hdGNoKCkgLSBjaGVjayBmb3IgUE1GIGNhcGFiaWxpdHkKKyAqIEBoSGFsOiAgICAgICAgICAgICAgICAgIEdsb2JhbCBIQUwgaGFuZGxlCisgKiBAcEZpbHRlck1GUEVuYWJsZWQ6ICAgICBnaXZlbiBieSBzdXBwbGljYW50IHRvIHVzIHRvIHNwZWNpZnkgd2hhdCBraW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBvZiBjb25uZWN0aW9uIHN1cHBsaWNhbnQgaXMgZXhwZWN0aW5nIHRvIG1ha2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGVuYWJsZWQgdGhlbiBtYWtlIFBNRiBjb25uZWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgZGlzYWJsZWQgdGhlbiBtYWtlIG5vcm1hbCBjb25uZWN0aW9uLgorICogQHBGaWx0ZXJNRlBSZXF1aXJlZDogICAgZ2l2ZW4gYnkgc3VwcGxpY2FudCBiYXNlZCBvbiBvdXIgY29uZmlndXJhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgMSB0aGVuIHdlIHdpbGwgcmVxdWlyZSBtYW5kYXRvcnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFBNRiBjb25uZWN0aW9uIGFuZCBpZiBpdCBpcyAwIHRoZW4gd2UgUE1GCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIG9wdGlvbmFsLgorICogQHBGaWx0ZXJNRlBDYXBhYmxlOiAgICAgZ2l2ZW4gYnkgc3VwcGxpY2FudCBiYXNlZCBvbiBvdXIgY29uZmlndXJhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgMSB0aGVuIHdlIGFyZSBQTUYgY2FwYWJsZSBhbmQgaWYgaXQgMAorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB3ZSBhcmUgbm90IFBNRiBjYXBhYmxlLgorICogQHBSU05JZTogICAgICAgICAgICAgICAgUlNOSWUgZnJvbSBCZWFjb24vcHJvYmUgcmVzcG9uc2Ugb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yIEFQIGFnYWluc3Qgd2hpY2ggd2Ugd2lsbCBjb21wYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBvdXIgY2FwYWJpbGl0aWVzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdG8gbWF0Y2ggb3VyIGN1cnJlbnQgY2FwYWJpbGl0aWVzIHdpdGggdGhlIEFQCisgKiB0byB3aGljaCB3ZSBhcmUgZXhwZWN0aW5nIG1ha2UgdGhlIGNvbm5lY3Rpb24uCisgKgorICogUmV0dXJuOiAgIGlmIG91ciBQTUYgY2FwYWJpbGl0aWVzIG1hdGNoZXMgd2l0aCBBUCB0aGVuIHdlCisgKiAgICAgICAgICAgd2lsbCByZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBnb29kCisgKiAgICAgICAgICAgdG8gbWFrZSBjb25uZWN0aW9uIHdpdGggaXQuIEVsc2Ugd2Ugd2lsbCByZXR1cm4gZmFsc2UKKyAqKi8KK3N0YXRpYyBib29sCitjc3JfaXNfcG1mX2NhcGFiaWxpdGllc19pbl9yc25fbWF0Y2godEhhbEhhbmRsZSBoSGFsLAorCQkJCSAgICAgYm9vbCAqcEZpbHRlck1GUEVuYWJsZWQsCisJCQkJICAgICB1aW50OF90ICpwRmlsdGVyTUZQUmVxdWlyZWQsCisJCQkJICAgICB1aW50OF90ICpwRmlsdGVyTUZQQ2FwYWJsZSwKKwkJCQkgICAgIHREb3QxMWZJRVJTTiAqcFJTTkllKQoreworCXVpbnQ4X3QgYXBQcm9maWxlTUZQQ2FwYWJsZSA9IDA7CisJdWludDhfdCBhcFByb2ZpbGVNRlBSZXF1aXJlZCA9IDA7CisJaWYgKHBSU05JZSAmJiBwRmlsdGVyTUZQRW5hYmxlZCAmJiBwRmlsdGVyTUZQQ2FwYWJsZQorCSAgICAmJiBwRmlsdGVyTUZQUmVxdWlyZWQpIHsKKwkJLyogRXh0cmFjdGluZyBNRlBDYXBhYmxlIGJpdCBmcm9tIFJTTiBJZSAqLworCQlhcFByb2ZpbGVNRlBDYXBhYmxlID0gKHBSU05JZS0+UlNOX0NhcFswXSA+PiA3KSAmIDB4MTsKKwkJYXBQcm9maWxlTUZQUmVxdWlyZWQgPSAocFJTTkllLT5SU05fQ2FwWzBdID4+IDYpICYgMHgxOworCQlpZiAoKnBGaWx0ZXJNRlBFbmFibGVkICYmICpwRmlsdGVyTUZQQ2FwYWJsZQorCQkgICAgJiYgKnBGaWx0ZXJNRlBSZXF1aXJlZCAmJiAoYXBQcm9maWxlTUZQQ2FwYWJsZSA9PSAwKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICJBUCBpcyBub3QgY2FwYWJsZSB0byBtYWtlIFBNRiBjb25uZWN0aW9uIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoKnBGaWx0ZXJNRlBFbmFibGVkICYmICpwRmlsdGVyTUZQQ2FwYWJsZSAmJgorCQkJICAgISgqcEZpbHRlck1GUFJlcXVpcmVkKSAmJgorCQkJCShhcFByb2ZpbGVNRlBDYXBhYmxlID09IDApKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyB0cmlja3ksIGJlY2F1c2Ugc3VwcGxpY2FudCBhc2tlZCB1cyB0bworCQkJICogbWFrZSBtYW5kYXRvcnkgUE1GIGNvbm5lY3Rpb24gZXZlbnRob3VnaCBQTUYKKwkJCSAqIGNvbm5lY3Rpb24gaXMgb3B0aW9uYWwgaGVyZS4KKwkJCSAqIHNvIGlmIEFQIGlzIG5vdCBjYXBhYmxlIG9mIFBNRiB0aGVuIGRyb3AgaXQuCisJCQkgKiBEb24ndCB0cnkgdG8gY29ubmVjdCB3aXRoIGl0LgorCQkJICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIndlIG5lZWQgUE1GIGNvbm5lY3Rpb24gJiBBUCBpc24ndCBjYXBhYmxlIHRvIG1ha2UgUE1GIGNvbm5lY3Rpb24iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghKCpwRmlsdGVyTUZQQ2FwYWJsZSkgJiYKKwkJCSAgIGFwUHJvZmlsZU1GUENhcGFibGUgJiYgYXBQcm9maWxlTUZQUmVxdWlyZWQpIHsKKworCQkJLyoKKwkJCSAqIEluIHRoaXMgY2FzZSwgQVAgd2l0aCB3aG9tIHdlIHRyeWluZyB0byBjb25uZWN0CisJCQkgKiByZXF1aXJlcyBtYW5kYXRvcnkgUE1GIGNvbm5lY3Rpb25zIGFuZCB3ZSBhcmUgbm90CisJCQkgKiBjYXBhYmxlIHNvIHRoaXMgQVAgaXMgbm90IGdvb2QgY2hvaWNlIHRvIGNvbm5lY3QKKwkJCSAqLworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICJBUCBuZWVkcyBQTUYgY29ubmVjdGlvbiBhbmQgd2UgYXJlIG5vdCBjYXBhYmxlIG9mIHBtZiBjb25uZWN0aW9uIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoISgqcEZpbHRlck1GUEVuYWJsZWQpICYmICpwRmlsdGVyTUZQQ2FwYWJsZSAmJgorCQkJICAgKGFwUHJvZmlsZU1GUENhcGFibGUgPT0gMSkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkJICAid2UgZG9uJ3QgbmVlZCBQTUYgY29ubmVjdGlvbiBldmVuIHRob3VnaCBib3RoIHBhcnRpZXMgYXJlIGNhcGFibGUiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCitib29sIGNzcl9pc19yc25fbWF0Y2godEhhbEhhbmRsZSBoSGFsLCB0Q3NyQXV0aExpc3QgKnBBdXRoVHlwZSwKKwkJICAgICAgZUNzckVuY3J5cHRpb25UeXBlIGVuVHlwZSwKKwkJICAgICAgdENzckVuY3J5cHRpb25MaXN0ICpwRW5NY1R5cGUsCisJCSAgICAgIGJvb2wgKnBNRlBFbmFibGVkLCB1aW50OF90ICpwTUZQUmVxdWlyZWQsCisJCSAgICAgIHVpbnQ4X3QgKnBNRlBDYXBhYmxlLAorCQkgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLAorCQkgICAgICBlQ3NyQXV0aFR5cGUgKnBOZWdvdGlhdGVkQXV0aFR5cGUsCisJCSAgICAgIGVDc3JFbmNyeXB0aW9uVHlwZSAqcE5lZ290aWF0ZWRNQ0NpcGhlcikKK3sKKwlib29sIGZSU05NYXRjaCA9IGZhbHNlOworCisJLyogU2VlIGlmIHRoZSBjeXBoZXJzIGluIHRoZSBCc3MgZGVzY3JpcHRpb24gbWF0Y2ggd2l0aCB0aGUgc2V0dGluZ3MgaW4gdGhlIHByb2ZpbGUuICovCisJZlJTTk1hdGNoID0KKwkJY3NyX2dldF9yc25faW5mb3JtYXRpb24oaEhhbCwgcEF1dGhUeXBlLCBlblR5cGUsIHBFbk1jVHlwZSwgJnBJZXMtPlJTTiwKKwkJCQkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgcE5lZ290aWF0ZWRBdXRoVHlwZSwKKwkJCQkJcE5lZ290aWF0ZWRNQ0NpcGhlcik7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCS8qIElmIGFsbCB0aGUgZmlsdGVyIG1hdGNoZXMgdGhlbiBmaW5hbGx5IGNoZWNrcyBmb3IgUE1GIGNhcGFiaWxpdGllcyAqLworCWlmIChmUlNOTWF0Y2gpIHsKKwkJZlJTTk1hdGNoID0gY3NyX2lzX3BtZl9jYXBhYmlsaXRpZXNfaW5fcnNuX21hdGNoKGhIYWwsIHBNRlBFbmFibGVkLAorCQkJCQkJCQkgcE1GUFJlcXVpcmVkLAorCQkJCQkJCQkgcE1GUENhcGFibGUsCisJCQkJCQkJCSAmcEllcy0+UlNOKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gZlJTTk1hdGNoOworfQorCitib29sIGNzcl9sb29rdXBfcG1raWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLCB1aW50OF90ICpwQlNTSWQsCisJCSAgICAgIHVpbnQ4X3QgKnBQTUtJZCkKK3sKKwlib29sIGZSQyA9IGZhbHNlLCBmTWF0Y2hGb3VuZCA9IGZhbHNlOworCXVpbnQzMl90IEluZGV4OworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWRvIHsKKwkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQ1NSX01BWF9QTUtJRF9BTExPV0VEOyBJbmRleCsrKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQkJIm1hdGNoIFBNS0lEICIgTUFDX0FERFJFU1NfU1RSICIgdG8gIiwKKwkJCQlNQUNfQUREUl9BUlJBWShwQlNTSWQpKTsKKwkJCWlmIChjZGZfbWVtX2NvbXBhcmUKKwkJCSAgICAocEJTU0lkLCBwU2Vzc2lvbi0+UG1raWRDYWNoZUluZm9bSW5kZXhdLkJTU0lELmJ5dGVzLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgY2RmX21hY19hZGRyKSkpIHsKKwkJCQkvKiBtYXRjaCBmb3VuZCAqLworCQkJCWZNYXRjaEZvdW5kID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghZk1hdGNoRm91bmQpCisJCQlicmVhazsKKworCQljZGZfbWVtX2NvcHkocFBNS0lkLCBwU2Vzc2lvbi0+UG1raWRDYWNoZUluZm9bSW5kZXhdLlBNS0lELAorCQkJICAgICBDU1JfUlNOX1BNS0lEX1NJWkUpOworCisJCWZSQyA9IHRydWU7CisJfSB3aGlsZSAoMCk7CisJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkiY3NyX2xvb2t1cF9wbWtpZCBjYWxsZWQgcmV0dXJuIG1hdGNoID0gJWQgcE1hYy0+cm9hbS5OdW1QbWtpZENhY2hlID0gJWQiLAorCQlmUkMsIHBTZXNzaW9uLT5OdW1QbWtpZENhY2hlKTsKKworCXJldHVybiBmUkM7Cit9CisKK3VpbnQ4X3QgY3NyX2NvbnN0cnVjdF9yc25faWUodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCQkgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JSU05JZSAqcFJTTkllKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwlib29sIGZSU05NYXRjaDsKKwl1aW50OF90IGNiUlNOSWUgPSAwOworCXVpbnQ4X3QgVW5pY2FzdEN5cGhlcltDU1JfUlNOX09VSV9TSVpFXTsKKwl1aW50OF90IE11bHRpY2FzdEN5cGhlcltDU1JfUlNOX09VSV9TSVpFXTsKKwl1aW50OF90IEF1dGhTdWl0ZVtDU1JfUlNOX09VSV9TSVpFXTsKKwl0Q3NyUlNOQXV0aEllICpwQXV0aFN1aXRlOworCXRDc3JSU05DYXBhYmlsaXRpZXMgUlNOQ2FwYWJpbGl0aWVzOworCXRDc3JSU05QTUtJZSAqcFBNSzsKKwl1aW50OF90IFBNS0lkW0NTUl9SU05fUE1LSURfU0laRV07CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXVpbnQ4X3QgKnBHcm91cE1nbXRDaXBoZXJTdWl0ZTsKKyNlbmRpZgorCXREb3QxMWZCZWFjb25JRXMgKnBJZXNMb2NhbCA9IHBJZXM7CisJZUNzckF1dGhUeXBlIG5lZ0F1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjsKKworCXNtc19sb2cocE1hYywgTE9HVywgIiVzIGNhbGxlZC4uLiIsIF9fZnVuY19fKTsKKworCWRvIHsKKwkJaWYgKCFjc3JfaXNfcHJvZmlsZV9yc24ocFByb2ZpbGUpKQorCQkJYnJlYWs7CisKKwkJaWYgKCFwSWVzTG9jYWwKKwkJICAgICYmCisJCSAgICAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgICAoY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcworCQkJCSAgICAgKHBNYWMsIHBTaXJCc3NEZXNjLCAmcEllc0xvY2FsKSkpKSB7CisJCQlicmVhazsKKwkJfQorCQkvKiBTZWUgaWYgdGhlIGN5cGhlcnMgaW4gdGhlIEJzcyBkZXNjcmlwdGlvbiBtYXRjaCB3aXRoIHRoZSBzZXR0aW5ncyBpbiB0aGUgcHJvZmlsZS4gKi8KKwkJZlJTTk1hdGNoID0KKwkJCWNzcl9nZXRfcnNuX2luZm9ybWF0aW9uKGhIYWwsICZwUHJvZmlsZS0+QXV0aFR5cGUsCisJCQkJCQlwUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUsCisJCQkJCQkmcFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUsCisJCQkJCQkmcEllc0xvY2FsLT5SU04sIFVuaWNhc3RDeXBoZXIsCisJCQkJCQlNdWx0aWNhc3RDeXBoZXIsIEF1dGhTdWl0ZSwKKwkJCQkJCSZSU05DYXBhYmlsaXRpZXMsICZuZWdBdXRoVHlwZSwgTlVMTCk7CisJCWlmICghZlJTTk1hdGNoKQorCQkJYnJlYWs7CisKKwkJcFJTTkllLT5JZUhlYWRlci5FbGVtZW50SUQgPSBTSVJfTUFDX1JTTl9FSUQ7CisKKwkJcFJTTkllLT5WZXJzaW9uID0gQ1NSX1JTTl9WRVJTSU9OX1NVUFBPUlRFRDsKKworCQljZGZfbWVtX2NvcHkocFJTTkllLT5NdWx0aWNhc3RPdWksIE11bHRpY2FzdEN5cGhlciwKKwkJCSAgICAgc2l6ZW9mKE11bHRpY2FzdEN5cGhlcikpOworCisJCXBSU05JZS0+Y1VuaWNhc3RDeXBoZXJzID0gMTsKKworCQljZGZfbWVtX2NvcHkoJnBSU05JZS0+VW5pY2FzdE91aVswXSwgVW5pY2FzdEN5cGhlciwKKwkJCSAgICAgc2l6ZW9mKFVuaWNhc3RDeXBoZXIpKTsKKworCQlwQXV0aFN1aXRlID0KKwkJCSh0Q3NyUlNOQXV0aEllICopICgmcFJTTkllLT4KKwkJCQkJICAgVW5pY2FzdE91aVtwUlNOSWUtPmNVbmljYXN0Q3lwaGVyc10pOworCisJCXBBdXRoU3VpdGUtPmNBdXRoZW50aWNhdGlvblN1aXRlcyA9IDE7CisJCWNkZl9tZW1fY29weSgmcEF1dGhTdWl0ZS0+QXV0aE91aVswXSwgQXV0aFN1aXRlLAorCQkJICAgICBzaXplb2YoQXV0aFN1aXRlKSk7CisKKwkJLyogUlNOIGNhcGFiaWxpdGllcyBmb2xsb3dzIHRoZSBBdXRoIFN1aXRlICh0d28gb2N0ZWN0cykgKi8KKwkJLyogISFSRVZJRVcgLSBXaGF0IHNob3VsZCBTVEEgcHV0IGluIFJTTiBjYXBhYmlsaXRpZXMsIGN1cnJlbnRseSAqLworCQkvKiBqdXN0IHB1dHRpbmcgYmFjayBBUHMgY2FwYWJpbGl0aWVzICovCisJCS8qIEZvciBvbmUsIHdlIHNob3VsZG4ndCBFVkVSIGJlIHNlbmRpbmcgb3V0ICJwcmUtYXV0aCBzdXBwb3J0ZWQiLiAgSXQgaXMgYW4gQVAgb25seSBjYXBhYmlsaXR5ICovCisJCS8qIEZvciBhbm90aGVyLCB3ZSBzaG91bGQgdXNlIHRoZSBNYW5hZ2VtZW50IEZyYW1lIFByb3RlY3Rpb24gdmFsdWVzIGdpdmVuIGJ5IHRoZSBzdXBwbGljYW50ICovCisJCVJTTkNhcGFiaWxpdGllcy5QcmVBdXRoU3VwcG9ydGVkID0gMDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJCWlmIChSU05DYXBhYmlsaXRpZXMuTUZQQ2FwYWJsZSAmJiBwUHJvZmlsZS0+TUZQQ2FwYWJsZSkgeworCQkJUlNOQ2FwYWJpbGl0aWVzLk1GUENhcGFibGUgPSBwUHJvZmlsZS0+TUZQQ2FwYWJsZTsKKwkJCVJTTkNhcGFiaWxpdGllcy5NRlBSZXF1aXJlZCA9IHBQcm9maWxlLT5NRlBSZXF1aXJlZDsKKwkJfSBlbHNlIHsKKwkJCVJTTkNhcGFiaWxpdGllcy5NRlBDYXBhYmxlID0gMDsKKwkJCVJTTkNhcGFiaWxpdGllcy5NRlBSZXF1aXJlZCA9IDA7CisJCX0KKyNlbmRpZgorCQkqKHVpbnQxNl90ICopICgmcEF1dGhTdWl0ZS0+QXV0aE91aVsxXSkgPQorCQkJKigodWludDE2X3QgKikgKCZSU05DYXBhYmlsaXRpZXMpKTsKKworCQlwUE1LID0KKwkJCSh0Q3NyUlNOUE1LSWUgKikgKCgodWludDhfdCAqKSAoJnBBdXRoU3VpdGUtPkF1dGhPdWlbMV0pKSArCisJCQkJCSAgc2l6ZW9mKHVpbnQxNl90KSk7CisKKwkJLyogRG9uJ3QgaW5jbHVkZSB0aGUgUE1LIFNBIElEcyBmb3IgQ0NLTSBhc3NvY2lhdGlvbnMuICovCisJCWlmICgKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCQkoZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU04gIT0gbmVnQXV0aFR5cGUpICYmCisjZW5kaWYKKwkJCWNzcl9sb29rdXBfcG1raWQocE1hYywgc2Vzc2lvbklkLCBwU2lyQnNzRGVzYy0+YnNzSWQsCisJCQkJCSAmKFBNS0lkWzBdKSkpIHsKKwkJCXBQTUstPmNQTUtJRHMgPSAxOworCisJCQljZGZfbWVtX2NvcHkocFBNSy0+UE1LSURMaXN0WzBdLlBNS0lELCBQTUtJZCwKKwkJCQkgICAgIENTUl9SU05fUE1LSURfU0laRSk7CisJCX0gZWxzZSB7CisJCQlwUE1LLT5jUE1LSURzID0gMDsKKwkJfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQlpZiAocFByb2ZpbGUtPk1GUEVuYWJsZWQpIHsKKwkJCXBHcm91cE1nbXRDaXBoZXJTdWl0ZSA9CisJCQkJKHVpbnQ4X3QgKikgcFBNSyArIHNpemVvZih1aW50MTZfdCkgKworCQkJCShwUE1LLT5jUE1LSURzICogQ1NSX1JTTl9QTUtJRF9TSVpFKTsKKwkJCWNkZl9tZW1fY29weShwR3JvdXBNZ210Q2lwaGVyU3VpdGUsIGNzcl9yc25fb3VpWzA3XSwKKwkJCQkgICAgIENTUl9XUEFfT1VJX1NJWkUpOworCQl9CisjZW5kaWYKKworCQkvKiBBZGQgaW4gdGhlIGZpeGVkIGZpZWxkcyBwbHVzIDEgVW5pY2FzdCBjeXBoZXIsIGxlc3MgdGhlIElFIEhlYWRlciBsZW5ndGggKi8KKwkJLyogQWRkIGluIHRoZSBzaXplIG9mIHRoZSBBdXRoIHN1aXRlIChjb3VudCBwbHVzIGEgc2luZ2xlIE9VSSkgKi8KKwkJLyogQWRkIGluIHRoZSBSU04gY2FwcyBmaWVsZC4gKi8KKwkJLyogQWRkIFBNS0lEIGNvdW50IGFuZCBQTUtJRCAoaWYgYW55KSAqLworCQkvKiBBZGQgZ3JvdXAgbWFuYWdlbWVudCBjaXBoZXIgc3VpdGUgKi8KKwkJcFJTTkllLT5JZUhlYWRlci5MZW5ndGggPQorCQkJKHVpbnQ4X3QpIChzaXplb2YoKnBSU05JZSkgLSBzaXplb2YocFJTTkllLT5JZUhlYWRlcikgKworCQkJCSAgIHNpemVvZigqcEF1dGhTdWl0ZSkgKworCQkJCSAgIHNpemVvZih0Q3NyUlNOQ2FwYWJpbGl0aWVzKSk7CisJCWlmIChwUE1LLT5jUE1LSURzKSB7CisJCQlwUlNOSWUtPkllSGVhZGVyLkxlbmd0aCArPSAodWludDhfdCkgKHNpemVvZih1aW50MTZfdCkgKworCQkJCQkJCSAgICAgIChwUE1LLT5jUE1LSURzICoKKwkJCQkJCQkgICAgICAgQ1NSX1JTTl9QTUtJRF9TSVpFKSk7CisJCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJCWlmIChwUHJvZmlsZS0+TUZQRW5hYmxlZCkgeworCQkJaWYgKDAgPT0gcFBNSy0+Y1BNS0lEcykKKwkJCQlwUlNOSWUtPkllSGVhZGVyLkxlbmd0aCArPSBzaXplb2YodWludDE2X3QpOworCQkJcFJTTkllLT5JZUhlYWRlci5MZW5ndGggKz0gQ1NSX1dQQV9PVUlfU0laRTsKKwkJfQorI2VuZGlmCisKKwkJLyogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBJRSBoZWFkZXIgKHRvdGFsKSBjb25zdHJ1Y3RlZC4uLiAqLworCQljYlJTTkllID0gcFJTTkllLT5JZUhlYWRlci5MZW5ndGggKyBzaXplb2YocFJTTkllLT5JZUhlYWRlcik7CisKKwl9IHdoaWxlICgwKTsKKworCWlmICghcEllcyAmJiBwSWVzTG9jYWwpIHsKKwkJLyogbG9jYWxseSBhbGxvY2F0ZWQgKi8KKwkJY2RmX21lbV9mcmVlKHBJZXNMb2NhbCk7CisJfQorCisJcmV0dXJuIGNiUlNOSWU7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorLyoqCisgKiBjc3JfZ2V0X3dhcGlfaW5mb3JtYXRpb24oKSAtIHRvIGdldCBXQVBJIGluZm9tYXRpb24KKyAqIEBoYWw6IHBvaW50ZXIgdG8gSEFMCisgKiBAYXV0aF90eXBlOiBhdXRoIHR5cGUKKyAqIEBlbmNyX3R5cGU6IGVuY3J5cHRpb24gdHlwZQorICogQG1jX2VuY3J5cHRpb246IG11bHRpY2FzdCBlbmNyeXB0aW9uIHR5cGUKKyAqIEB3YXBpX2llOiBwb2ludGVyIHRvIFdBUEkgSUUKKyAqIEB1Y2FzdF9jaXBoZXI6IFVuaWNhc3QgY2lwaGVyCisgKiBAbWNhc3RfY2lwaGVyOiBNdWx0aWNhc3QgY2lwaGVyCisgKiBAYXV0aF9zdWl0ZTogQXV0aGVudGljYXRpb24gc3VpdGUKKyAqIEBuZWdvdGlhdGVkX2F1dGh0eXBlOiBOZWdvdGlhdGVkIGF1dGggdHlwZQorICogQG5lZ290aWF0ZWRfbWNjaXBoZXI6IG5lZ290aWF0ZWQgbXVsdGljYXN0IGNpcGhlcgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGdldCBhbGwgV0FQSSBpbmZvcm1hdGlvbgorICoKKyAqIFJldHVybjogYm9vbAorICovCitib29sIGNzcl9nZXRfd2FwaV9pbmZvcm1hdGlvbih0SGFsSGFuZGxlIGhhbCwgdENzckF1dGhMaXN0ICphdXRoX3R5cGUsCisJCQkgICAgICBlQ3NyRW5jcnlwdGlvblR5cGUgZW5jcl90eXBlLAorCQkJICAgICAgdENzckVuY3J5cHRpb25MaXN0ICptY19lbmNyeXB0aW9uLAorCQkJICAgICAgdERvdDExZklFV0FQSSAqd2FwaV9pZSwgdWludDhfdCAqdWNhc3RfY2lwaGVyLAorCQkJICAgICAgdWludDhfdCAqbWNhc3RfY2lwaGVyLCB1aW50OF90ICphdXRoX3N1aXRlLAorCQkJICAgICAgZUNzckF1dGhUeXBlICpuZWdvdGlhdGVkX2F1dGh0eXBlLAorCQkJICAgICAgZUNzckVuY3J5cHRpb25UeXBlICpuZWdvdGlhdGVkX21jY2lwaGVyKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWwpOworCWJvb2wgYWNjZXB0YWJsZV9jaXBoZXIgPSBmYWxzZTsKKwl1aW50OF90IGNfdWNhc3RfY2lwaGVyID0gMDsKKwl1aW50OF90IGNfbWNhc3RfY2lwaGVyID0gMDsKKwl1aW50OF90IGNfYXV0aF9zdWl0ZXMgPSAwLCBpOworCXVpbnQ4X3QgdW5pY2FzdFtDU1JfV0FQSV9PVUlfU0laRV07CisJdWludDhfdCBtdWx0aWNhc3RbQ1NSX1dBUElfT1VJX1NJWkVdOworCXVpbnQ4X3QgYXV0aHN1aXRlc1tDU1JfV0FQSV9NQVhfQVVUSF9TVUlURVNdW0NTUl9XQVBJX09VSV9TSVpFXTsKKwl1aW50OF90IGF1dGhlbnRpY2F0aW9uW0NTUl9XQVBJX09VSV9TSVpFXTsKKwl1aW50OF90IG1jY2lwaGVyX2FycltDU1JfV0FQSV9NQVhfTVVMVElDQVNUX0NZUEhFUlNdW0NTUl9XQVBJX09VSV9TSVpFXTsKKwllQ3NyQXV0aFR5cGUgbmVnX2F1dGh0eXBlID0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjsKKwl1aW50OF90IHdhcGlvdWlfaWR4ID0gMDsKKworCWlmICghd2FwaV9pZS0+cHJlc2VudCkKKwkJZ290byBlbmQ7CisKKwljX21jYXN0X2NpcGhlcisrOworCWNkZl9tZW1fY29weShtY2NpcGhlcl9hcnIsIHdhcGlfaWUtPm11bHRpY2FzdF9jaXBoZXJfc3VpdGUsCisJCQlDU1JfV0FQSV9PVUlfU0laRSk7CisJY191Y2FzdF9jaXBoZXIgPSAodWludDhfdCkgKHdhcGlfaWUtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50KTsKKwljX2F1dGhfc3VpdGVzID0gKHVpbnQ4X3QpICh3YXBpX2llLT5ha21fc3VpdGVfY291bnQpOworCWZvciAoaSA9IDA7IGkgPCBjX2F1dGhfc3VpdGVzICYmIGkgPCBDU1JfV0FQSV9NQVhfQVVUSF9TVUlURVM7IGkrKykKKwkJY2RmX21lbV9jb3B5KCh2b2lkICopJmF1dGhzdWl0ZXNbaV0sCisJCQkodm9pZCAqKSZ3YXBpX2llLT5ha21fc3VpdGVzW2ldLCBDU1JfV0FQSV9PVUlfU0laRSk7CisKKwl3YXBpb3VpX2lkeCA9IGNzcl9nZXRfb3VpX2luZGV4X2Zyb21fY2lwaGVyKGVuY3JfdHlwZSk7CisJaWYgKHdhcGlvdWlfaWR4ID49IENTUl9PVUlfV0FQSV9XQUlfTUFYX0lOREVYKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJXYXBpIE9VSSBpbmRleCA9ICVkIG91dCBvZiBsaW1pdCIpLAorCQkJd2FwaW91aV9pZHgpOworCQlhY2NlcHRhYmxlX2NpcGhlciA9IGZhbHNlOworCQlnb3RvIGVuZDsKKwl9CisJLyogQ2hlY2sgLSBJcyByZXF1ZXN0ZWQgdW5pY2FzdCBDaXBoZXIgc3VwcG9ydGVkIGJ5IHRoZSBCU1MuICovCisJYWNjZXB0YWJsZV9jaXBoZXIgPSBjc3JfbWF0Y2hfd2FwaV9vdWlfaW5kZXgobWFjX2N0eCwKKwkJCQl3YXBpX2llLT51bmljYXN0X2NpcGhlcl9zdWl0ZXMsCisJCQkJY191Y2FzdF9jaXBoZXIsIHdhcGlvdWlfaWR4LCB1bmljYXN0KTsKKwlpZiAoIWFjY2VwdGFibGVfY2lwaGVyKQorCQlnb3RvIGVuZDsKKworCS8qIHVuaWNhc3QgaXMgc3VwcG9ydGVkLiBQaWNrIHRoZSBmaXJzdCBtYXRjaGluZyBHcm91cCBjaXBoZXIsIGlmIGFueSAqLworCWZvciAoaSA9IDA7IGkgPCBtY19lbmNyeXB0aW9uLT5udW1FbnRyaWVzOyBpKyspIHsKKwkJd2FwaW91aV9pZHggPSBjc3JfZ2V0X291aV9pbmRleF9mcm9tX2NpcGhlcigKKwkJCQkJbWNfZW5jcnlwdGlvbi0+ZW5jcnlwdGlvblR5cGVbaV0pOworCQlpZiAod2FwaW91aV9pZHggPj0gQ1NSX09VSV9XQVBJX1dBSV9NQVhfSU5ERVgpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQlGTCgiV2FwaSBPVUkgaW5kZXggPSAlZCBvdXQgb2YgbGltaXQiKSwKKwkJCQl3YXBpb3VpX2lkeCk7CisJCQlhY2NlcHRhYmxlX2NpcGhlciA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwkJYWNjZXB0YWJsZV9jaXBoZXIgPSBjc3JfbWF0Y2hfd2FwaV9vdWlfaW5kZXgobWFjX2N0eCwKKwkJCQkJCW1jY2lwaGVyX2FyciwgY19tY2FzdF9jaXBoZXIsCisJCQkJCQl3YXBpb3VpX2lkeCwgbXVsdGljYXN0KTsKKwkJaWYgKGFjY2VwdGFibGVfY2lwaGVyKQorCQkJYnJlYWs7CisJfQorCWlmICghYWNjZXB0YWJsZV9jaXBoZXIpCisJCWdvdG8gZW5kOworCisJaWYgKG5lZ290aWF0ZWRfbWNjaXBoZXIpCisJCSpuZWdvdGlhdGVkX21jY2lwaGVyID0KKwkJCW1jX2VuY3J5cHRpb24tPmVuY3J5cHRpb25UeXBlW2ldOworCisJLyoKKwkgKiBDaXBoZXJzIGFyZSBzdXBwb3J0ZWQsIE1hdGNoIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSBhbmQKKwkgKiBwaWNrIGZpcnN0IG1hdGNoaW5nIGF1dGh0eXBlCisJICovCisJaWYgKGNzcl9pc19hdXRoX3dhcGlfY2VydAorCQkJKG1hY19jdHgsIGF1dGhzdWl0ZXMsIGNfYXV0aF9zdWl0ZXMsIGF1dGhlbnRpY2F0aW9uKSkgeworCQluZWdfYXV0aHR5cGUgPQorCQkJZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfQ0VSVElGSUNBVEU7CisJfSBlbHNlIGlmIChjc3JfaXNfYXV0aF93YXBpX3BzayhtYWNfY3R4LCBhdXRoc3VpdGVzLAorCQkJCWNfYXV0aF9zdWl0ZXMsIGF1dGhlbnRpY2F0aW9uKSkgeworCQluZWdfYXV0aHR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9QU0s7CisJfSBlbHNlIHsKKwkJYWNjZXB0YWJsZV9jaXBoZXIgPSBmYWxzZTsKKwkJbmVnX2F1dGh0eXBlID0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjsKKwl9CisKKwkvKiBDYWxsZXIgZG9lc24ndCBjYXJlIGFib3V0IGF1dGggdHlwZSwgb3IgQlNTIGRvZXNuJ3QgbWF0Y2ggKi8KKwlpZiAoKDAgPT0gYXV0aF90eXBlLT5udW1FbnRyaWVzKSB8fCAoZmFsc2UgPT0gYWNjZXB0YWJsZV9jaXBoZXIpKQorCQlnb3RvIGVuZDsKKworCWFjY2VwdGFibGVfY2lwaGVyID0gZmFsc2U7CisJZm9yIChpID0gMDsgaSA8IGF1dGhfdHlwZS0+bnVtRW50cmllczsgaSsrKSB7CisJCWlmIChhdXRoX3R5cGUtPmF1dGhUeXBlW2ldID09IG5lZ19hdXRodHlwZSkgeworCQkJYWNjZXB0YWJsZV9jaXBoZXIgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2VuZDoKKwlpZiAoYWNjZXB0YWJsZV9jaXBoZXIpIHsKKwkJaWYgKG1jYXN0X2NpcGhlcikKKwkJCWNkZl9tZW1fY29weShtY2FzdF9jaXBoZXIsIG11bHRpY2FzdCwKKwkJCQkJQ1NSX1dBUElfT1VJX1NJWkUpOworCQlpZiAodWNhc3RfY2lwaGVyKQorCQkJY2RmX21lbV9jb3B5KHVjYXN0X2NpcGhlciwgdW5pY2FzdCwgQ1NSX1dBUElfT1VJX1NJWkUpOworCQlpZiAoYXV0aF9zdWl0ZSkKKwkJCWNkZl9tZW1fY29weShhdXRoX3N1aXRlLCBhdXRoZW50aWNhdGlvbiwKKwkJCQkJQ1NSX1dBUElfT1VJX1NJWkUpOworCQlpZiAobmVnb3RpYXRlZF9hdXRodHlwZSkKKwkJCSpuZWdvdGlhdGVkX2F1dGh0eXBlID0gbmVnX2F1dGh0eXBlOworCX0KKwlyZXR1cm4gYWNjZXB0YWJsZV9jaXBoZXI7Cit9CisKK2Jvb2wgY3NyX2lzX3dhcGlfbWF0Y2godEhhbEhhbmRsZSBoSGFsLCB0Q3NyQXV0aExpc3QgKnBBdXRoVHlwZSwKKwkJICAgICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBlblR5cGUsIHRDc3JFbmNyeXB0aW9uTGlzdCAqcEVuTWNUeXBlLAorCQkgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywgZUNzckF1dGhUeXBlICpwTmVnb3RpYXRlZEF1dGhUeXBlLAorCQkgICAgICAgZUNzckVuY3J5cHRpb25UeXBlICpwTmVnb3RpYXRlZE1DQ2lwaGVyKQoreworCWJvb2wgZldhcGlNYXRjaCA9IGZhbHNlOworCisJLyogU2VlIGlmIHRoZSBjeXBoZXJzIGluIHRoZSBCc3MgZGVzY3JpcHRpb24gbWF0Y2ggd2l0aCB0aGUgc2V0dGluZ3MgaW4gdGhlIHByb2ZpbGUuICovCisJZldhcGlNYXRjaCA9CisJCWNzcl9nZXRfd2FwaV9pbmZvcm1hdGlvbihoSGFsLCBwQXV0aFR5cGUsIGVuVHlwZSwgcEVuTWNUeXBlLAorCQkJCQkgJnBJZXMtPldBUEksIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCSBwTmVnb3RpYXRlZEF1dGhUeXBlLCBwTmVnb3RpYXRlZE1DQ2lwaGVyKTsKKworCXJldHVybiBmV2FwaU1hdGNoOworfQorCitib29sIGNzcl9sb29rdXBfYmtpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsIHVpbnQ4X3QgKnBCU1NJZCwKKwkJICAgICB1aW50OF90ICpwQktJZCkKK3sKKwlib29sIGZSQyA9IGZhbHNlLCBmTWF0Y2hGb3VuZCA9IGZhbHNlOworCXVpbnQzMl90IEluZGV4OworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWlmICghcFNlc3Npb24pIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWRvIHsKKwkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgcFNlc3Npb24tPk51bUJraWRDYWNoZTsgSW5kZXgrKykgeworCQkJc21zX2xvZyhwTWFjLCBMT0dXLCAibWF0Y2ggQktJRCAiIE1BQ19BRERSRVNTX1NUUiAiIHRvICIsCisJCQkJTUFDX0FERFJfQVJSQVkocEJTU0lkKSk7CisJCQlpZiAoY2RmX21lbV9jb21wYXJlCisJCQkgICAgKHBCU1NJZCwgcFNlc3Npb24tPkJraWRDYWNoZUluZm9bSW5kZXhdLkJTU0lELmJ5dGVzLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpKSB7CisJCQkJLyogbWF0Y2ggZm91bmQgKi8KKwkJCQlmTWF0Y2hGb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZNYXRjaEZvdW5kKQorCQkJYnJlYWs7CisKKwkJY2RmX21lbV9jb3B5KHBCS0lkLCBwU2Vzc2lvbi0+QmtpZENhY2hlSW5mb1tJbmRleF0uQktJRCwKKwkJCSAgICAgQ1NSX1dBUElfQktJRF9TSVpFKTsKKworCQlmUkMgPSB0cnVlOworCX0gd2hpbGUgKDApOworCXNtc19sb2cocE1hYywgTE9HVywKKwkJImNzcl9sb29rdXBfYmtpZCBjYWxsZWQgcmV0dXJuIG1hdGNoID0gJWQgcE1hYy0+cm9hbS5OdW1Ca2lkQ2FjaGUgPSAlZCIsCisJCWZSQywgcFNlc3Npb24tPk51bUJraWRDYWNoZSk7CisKKwlyZXR1cm4gZlJDOworfQorCit1aW50OF90IGNzcl9jb25zdHJ1Y3Rfd2FwaV9pZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgICAgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJCSAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JXYXBpSWUgKnBXYXBpSWUpCit7CisJYm9vbCBmV2FwaU1hdGNoID0gZmFsc2U7CisJdWludDhfdCBjYldhcGlJZSA9IDA7CisJdWludDhfdCBVbmljYXN0Q3lwaGVyW0NTUl9XQVBJX09VSV9TSVpFXTsKKwl1aW50OF90IE11bHRpY2FzdEN5cGhlcltDU1JfV0FQSV9PVUlfU0laRV07CisJdWludDhfdCBBdXRoU3VpdGVbQ1NSX1dBUElfT1VJX1NJWkVdOworCXVpbnQ4X3QgQktJZFtDU1JfV0FQSV9CS0lEX1NJWkVdOworCXVpbnQ4X3QgKnBXYXBpID0gTlVMTDsKKwlib29sIGZCS0lERm91bmQgPSBmYWxzZTsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzTG9jYWwgPSBwSWVzOworCisJZG8geworCQlpZiAoIWNzcl9pc19wcm9maWxlX3dhcGkocFByb2ZpbGUpKQorCQkJYnJlYWs7CisKKwkJaWYgKCFwSWVzTG9jYWwKKwkJICAgICYmCisJCSAgICAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgICAoY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcworCQkJCSAgICAgKHBNYWMsIHBTaXJCc3NEZXNjLCAmcEllc0xvY2FsKSkpKSB7CisJCQlicmVhazsKKwkJfQorCQkvKiBTZWUgaWYgdGhlIGN5cGhlcnMgaW4gdGhlIEJzcyBkZXNjcmlwdGlvbiBtYXRjaCB3aXRoIHRoZSBzZXR0aW5ncyBpbiB0aGUgcHJvZmlsZS4gKi8KKwkJZldhcGlNYXRjaCA9CisJCQljc3JfZ2V0X3dhcGlfaW5mb3JtYXRpb24ocE1hYywgJnBQcm9maWxlLT5BdXRoVHlwZSwKKwkJCQkJCSBwUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUsCisJCQkJCQkgJnBQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlLAorCQkJCQkJICZwSWVzTG9jYWwtPldBUEksIFVuaWNhc3RDeXBoZXIsCisJCQkJCQkgTXVsdGljYXN0Q3lwaGVyLCBBdXRoU3VpdGUsIE5VTEwsCisJCQkJCQkgTlVMTCk7CisJCWlmICghZldhcGlNYXRjaCkKKwkJCWJyZWFrOworCisJCWNkZl9tZW1fc2V0KHBXYXBpSWUsIHNpemVvZih0Q3NyV2FwaUllKSwgMCk7CisKKwkJcFdhcGlJZS0+SWVIZWFkZXIuRWxlbWVudElEID0gRE9UMTFGX0VJRF9XQVBJOworCisJCXBXYXBpSWUtPlZlcnNpb24gPSBDU1JfV0FQSV9WRVJTSU9OX1NVUFBPUlRFRDsKKworCQlwV2FwaUllLT5jQXV0aGVudGljYXRpb25TdWl0ZXMgPSAxOworCQljZGZfbWVtX2NvcHkoJnBXYXBpSWUtPkF1dGhPdWlbMF0sIEF1dGhTdWl0ZSwKKwkJCSAgICAgc2l6ZW9mKEF1dGhTdWl0ZSkpOworCisJCXBXYXBpID0gKHVpbnQ4X3QgKikgKCZwV2FwaUllLT5BdXRoT3VpWzFdKTsKKworCQkqcFdhcGkgPSAodWludDE2X3QpIDE7ICAvKiBjVW5pY2FzdEN5cGhlcnMgKi8KKwkJcFdhcGkgKz0gMjsKKwkJY2RmX21lbV9jb3B5KHBXYXBpLCBVbmljYXN0Q3lwaGVyLCBzaXplb2YoVW5pY2FzdEN5cGhlcikpOworCQlwV2FwaSArPSBzaXplb2YoVW5pY2FzdEN5cGhlcik7CisKKwkJY2RmX21lbV9jb3B5KHBXYXBpLCBNdWx0aWNhc3RDeXBoZXIsIHNpemVvZihNdWx0aWNhc3RDeXBoZXIpKTsKKwkJcFdhcGkgKz0gc2l6ZW9mKE11bHRpY2FzdEN5cGhlcik7CisKKwkJLyogV0FQSSBjYXBhYmlsaXRpZXMgZm9sbG93cyB0aGUgQXV0aCBTdWl0ZSAodHdvIG9jdGVjdHMpICovCisJCS8qIHdlIHNob3VsZG4ndCBFVkVSIGJlIHNlbmRpbmcgb3V0ICJwcmUtYXV0aCBzdXBwb3J0ZWQiLiAgSXQgaXMgYW4gQVAgb25seSBjYXBhYmlsaXR5ICovCisJCS8qICYgc2luY2Ugd2UgYWxyZWFkeSBkaWQgYSBtZW1zZXQgcFdhcGlJZSB0byAwLCBza2lwIHRoZXNlIGZpZWxkcyAqLworCQlwV2FwaSArPSAyOworCisJCWZCS0lERm91bmQgPQorCQkJY3NyX2xvb2t1cF9ia2lkKHBNYWMsIHNlc3Npb25JZCwgcFNpckJzc0Rlc2MtPmJzc0lkLAorCQkJCQkmKEJLSWRbMF0pKTsKKworCQlpZiAoZkJLSURGb3VuZCkgeworCQkJLyogRG8gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGVuZGlhbm5lc3MgaGVyZSAqLworCQkJKnBXYXBpID0gKHVpbnQxNl90KSAxOyAgLyogY0JLSURzICovCisJCQlwV2FwaSArPSAyOworCQkJY2RmX21lbV9jb3B5KHBXYXBpLCBCS0lkLCBDU1JfV0FQSV9CS0lEX1NJWkUpOworCQl9IGVsc2UgeworCQkJKnBXYXBpID0gMDsKKwkJCXBXYXBpICs9IDE7CisJCQkqcFdhcGkgPSAwOworCQkJcFdhcGkgKz0gMTsKKwkJfQorCisJCS8qIEFkZCBpbiB0aGUgSUUgZmllbGRzIGV4Y2VwdCB0aGUgSUUgaGVhZGVyICovCisJCS8qIEFkZCBCS0lEIGNvdW50IGFuZCBCS0lEIChpZiBhbnkpICovCisJCXBXYXBpSWUtPkllSGVhZGVyLkxlbmd0aCA9CisJCQkodWludDhfdCkgKHNpemVvZigqcFdhcGlJZSkgLSBzaXplb2YocFdhcGlJZS0+SWVIZWFkZXIpKTsKKworCQkvKjIgYnl0ZXMgZm9yIEJLSUQgQ291bnQgZmllbGQgKi8KKwkJcFdhcGlJZS0+SWVIZWFkZXIuTGVuZ3RoICs9IHNpemVvZih1aW50MTZfdCk7CisKKwkJaWYgKGZCS0lERm91bmQpIHsKKwkJCXBXYXBpSWUtPkllSGVhZGVyLkxlbmd0aCArPSBDU1JfV0FQSV9CS0lEX1NJWkU7CisJCX0KKwkJLyogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBJRSBoZWFkZXIgKHRvdGFsKSBjb25zdHJ1Y3RlZC4uLiAqLworCQljYldhcGlJZSA9IHBXYXBpSWUtPkllSGVhZGVyLkxlbmd0aCArIHNpemVvZihwV2FwaUllLT5JZUhlYWRlcik7CisKKwl9IHdoaWxlICgwKTsKKworCWlmICghcEllcyAmJiBwSWVzTG9jYWwpIHsKKwkJLyogbG9jYWxseSBhbGxvY2F0ZWQgKi8KKwkJY2RmX21lbV9mcmVlKHBJZXNMb2NhbCk7CisJfQorCisJcmV0dXJuIGNiV2FwaUllOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKy8qKgorICogY3NyX2dldF93cGFfY3lwaGVycygpIC0gdG8gZ2V0IFdQQSBjaXBoZXIgaW5mbworICogQG1hY19jdHg6IHBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqIEBhdXRoX3R5cGU6IGF1dGggdHlwZQorICogQGVuY3JfdHlwZTogZW5jcnlwdGlvbiB0eXBlCisgKiBAbWNfZW5jcnlwdGlvbjogbXVsdGljYXN0IGVuY3J5cHRpb24gdHlwZQorICogQHdwYV9pZTogcG9pbnRlciB0byBXUEEgSUUKKyAqIEB1Y2FzdF9jaXBoZXI6IFVuaWNhc3QgY2lwaGVyCisgKiBAbWNhc3RfY2lwaGVyOiBNdWx0aWNhc3QgY2lwaGVyCisgKiBAYXV0aF9zdWl0ZTogQXV0aGVudGljYXRpb24gc3VpdGUKKyAqIEBuZWdvdGlhdGVkX2F1dGh0eXBlOiBOZWdvdGlhdGVkIGF1dGggdHlwZQorICogQG5lZ290aWF0ZWRfbWNjaXBoZXI6IG5lZ290aWF0ZWQgbXVsdGljYXN0IGNpcGhlcgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGdldCBhbGwgV1BBIGluZm9ybWF0aW9uCisgKgorICogUmV0dXJuOiBib29sCisgKi8KK2Jvb2wgY3NyX2dldF93cGFfY3lwaGVycyh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LCB0Q3NyQXV0aExpc3QgKmF1dGhfdHlwZSwKKwkJZUNzckVuY3J5cHRpb25UeXBlIGVuY3JfdHlwZSwgdENzckVuY3J5cHRpb25MaXN0ICptY19lbmNyeXB0aW9uLAorCQl0RG90MTFmSUVXUEEgKndwYV9pZSwgdWludDhfdCAqdWNhc3RfY2lwaGVyLAorCQl1aW50OF90ICptY2FzdF9jaXBoZXIsIHVpbnQ4X3QgKmF1dGhfc3VpdGUsCisJCWVDc3JBdXRoVHlwZSAqbmVnb3RpYXRlZF9hdXRodHlwZSwKKwkJZUNzckVuY3J5cHRpb25UeXBlICpuZWdvdGlhdGVkX21jY2lwaGVyKQoreworCWJvb2wgYWNjZXB0YWJsZV9jaXBoZXIgPSBmYWxzZTsKKwl1aW50OF90IGNfdWNhc3RfY2lwaGVyID0gMDsKKwl1aW50OF90IGNfbWNhc3RfY2lwaGVyID0gMDsKKwl1aW50OF90IGNfYXV0aF9zdWl0ZXMgPSAwOworCXVpbnQ4X3QgdW5pY2FzdFtDU1JfV1BBX09VSV9TSVpFXTsKKwl1aW50OF90IG11bHRpY2FzdFtDU1JfV1BBX09VSV9TSVpFXTsKKwl1aW50OF90IGF1dGhlbnRpY2F0aW9uW0NTUl9XUEFfT1VJX1NJWkVdOworCXVpbnQ4X3QgbWNjaXBoZXJfYXJyWzFdW0NTUl9XUEFfT1VJX1NJWkVdOworCXVpbnQ4X3QgaTsKKwllQ3NyQXV0aFR5cGUgbmVnX2F1dGh0eXBlID0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjsKKworCWlmICghd3BhX2llLT5wcmVzZW50KQorCQlnb3RvIGVuZDsKKwljX21jYXN0X2NpcGhlciA9IDE7CisJY2RmX21lbV9jb3B5KG1jY2lwaGVyX2Fyciwgd3BhX2llLT5tdWx0aWNhc3RfY2lwaGVyLCBDU1JfV1BBX09VSV9TSVpFKTsKKwljX3VjYXN0X2NpcGhlciA9ICh1aW50OF90KSAod3BhX2llLT51bmljYXN0X2NpcGhlcl9jb3VudCk7CisJY19hdXRoX3N1aXRlcyA9ICh1aW50OF90KSAod3BhX2llLT5hdXRoX3N1aXRlX2NvdW50KTsKKworCS8qIENoZWNrIC0gSXMgcmVxdWVzdGVkIHVuaWNhc3QgQ2lwaGVyIHN1cHBvcnRlZCBieSB0aGUgQlNTLiAqLworCWFjY2VwdGFibGVfY2lwaGVyID0gY3NyX21hdGNoX3dwYW91aV9pbmRleChtYWNfY3R4LAorCQkJCXdwYV9pZS0+dW5pY2FzdF9jaXBoZXJzLCBjX3VjYXN0X2NpcGhlciwKKwkJCQljc3JfZ2V0X291aV9pbmRleF9mcm9tX2NpcGhlcihlbmNyX3R5cGUpLAorCQkJCXVuaWNhc3QpOworCWlmICghYWNjZXB0YWJsZV9jaXBoZXIpCisJCWdvdG8gZW5kOworCS8qIHVuaWNhc3QgaXMgc3VwcG9ydGVkLiBQaWNrIHRoZSBmaXJzdCBtYXRjaGluZyBHcm91cCBjaXBoZXIsIGlmIGFueSAqLworCWZvciAoaSA9IDA7IGkgPCBtY19lbmNyeXB0aW9uLT5udW1FbnRyaWVzOyBpKyspIHsKKwkJYWNjZXB0YWJsZV9jaXBoZXIgPSBjc3JfbWF0Y2hfd3Bhb3VpX2luZGV4KG1hY19jdHgsCisJCQkJCW1jY2lwaGVyX2FyciwgY19tY2FzdF9jaXBoZXIsCisJCQkJCWNzcl9nZXRfb3VpX2luZGV4X2Zyb21fY2lwaGVyKAorCQkJCQkgICAgbWNfZW5jcnlwdGlvbi0+ZW5jcnlwdGlvblR5cGVbaV0pLAorCQkJCQltdWx0aWNhc3QpOworCQlpZiAoYWNjZXB0YWJsZV9jaXBoZXIpCisJCQlicmVhazsKKwl9CisJaWYgKCFhY2NlcHRhYmxlX2NpcGhlcikKKwkJZ290byBlbmQ7CisKKwlpZiAobmVnb3RpYXRlZF9tY2NpcGhlcikKKwkJKm5lZ290aWF0ZWRfbWNjaXBoZXIgPSBtY19lbmNyeXB0aW9uLT5lbmNyeXB0aW9uVHlwZVtpXTsKKworCS8qIEluaXRpYWxpemluZyB3aXRoIGZhbHNlIGFzIGl0IGhhcyB0cnVlIHZhbHVlIGFscmVhZHkgKi8KKwlhY2NlcHRhYmxlX2NpcGhlciA9IGZhbHNlOworCWZvciAoaSA9IDA7IGkgPCBhdXRoX3R5cGUtPm51bUVudHJpZXM7IGkrKykgeworCQkvKgorCQkgKiBDaXBoZXJzIGFyZSBzdXBwb3J0ZWQsIE1hdGNoIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSBhbmQKKwkJICogcGljayBmaXJzdCBtYXRjaGluZyBhdXRodHlwZQorCQkgKi8KKwkJaWYgKGNzcl9pc19hdXRoX3dwYShtYWNfY3R4LCB3cGFfaWUtPmF1dGhfc3VpdGVzLCBjX2F1dGhfc3VpdGVzLAorCQkJYXV0aGVudGljYXRpb24pKSB7CisJCQlpZiAoZUNTUl9BVVRIX1RZUEVfV1BBID09IGF1dGhfdHlwZS0+YXV0aFR5cGVbaV0pCisJCQkJbmVnX2F1dGh0eXBlID0gZUNTUl9BVVRIX1RZUEVfV1BBOworCQl9CisJCWlmICgobmVnX2F1dGh0eXBlID09IGVDU1JfQVVUSF9UWVBFX1VOS05PV04pICYmCisJCQljc3JfaXNfYXV0aF93cGFfcHNrKG1hY19jdHgsCisJCQkJd3BhX2llLT5hdXRoX3N1aXRlcywgY19hdXRoX3N1aXRlcywKKwkJCQlhdXRoZW50aWNhdGlvbikpIHsKKwkJCWlmIChlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLID09IGF1dGhfdHlwZS0+YXV0aFR5cGVbaV0pCisJCQkJbmVnX2F1dGh0eXBlID0gZUNTUl9BVVRIX1RZUEVfV1BBX1BTSzsKKwkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwkJaWYgKChuZWdfYXV0aHR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTikKKwkJCSYmIGNzcl9pc19lc2VfY2NrbV9hdXRoX3dwYShtYWNfY3R4LAorCQkJCXdwYV9pZS0+YXV0aF9zdWl0ZXMsIGNfYXV0aF9zdWl0ZXMsCisJCQkJYXV0aGVudGljYXRpb24pKSB7CisJCQlpZiAoZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEEgPT0gYXV0aF90eXBlLT5hdXRoVHlwZVtpXSkKKwkJCQluZWdfYXV0aHR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQTsKKwkJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKworCQkvKgorCQkgKiBUaGUgMXN0IGF1dGggdHlwZSBpbiB0aGUgQVBzIFdQQSBJRSwgdG8gbWF0Y2ggc3RhdGlvbnMKKwkJICogY29ubmVjdGluZyBwcm9maWxlcyBhdXRoIHR5cGUgd2lsbCBjYXVzZSB1cyB0byBleGl0IHRoaXMKKwkJICogbG9vcC4gVGhpcyBpcyBhZGRlZCBhcyBzb21lIEFQcyBhZHZlcnRpc2UgbXVsdGlwbGUgYWttcyBpbgorCQkgKiB0aGUgV1BBIElFCisJCSAqLworCQlpZiAoZUNTUl9BVVRIX1RZUEVfVU5LTk9XTiAhPSBuZWdfYXV0aHR5cGUpIHsKKwkJCWFjY2VwdGFibGVfY2lwaGVyID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCitlbmQ6CisJaWYgKGFjY2VwdGFibGVfY2lwaGVyKSB7CisJCWlmIChtY2FzdF9jaXBoZXIpCisJCQljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKiopIG1jYXN0X2NpcGhlciwgbXVsdGljYXN0LAorCQkJCQlDU1JfV1BBX09VSV9TSVpFKTsKKworCQlpZiAodWNhc3RfY2lwaGVyKQorCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICoqKSB1Y2FzdF9jaXBoZXIsIHVuaWNhc3QsCisJCQkJCUNTUl9XUEFfT1VJX1NJWkUpOworCisJCWlmIChhdXRoX3N1aXRlKQorCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICoqKSBhdXRoX3N1aXRlLCBhdXRoZW50aWNhdGlvbiwKKwkJCQkJQ1NSX1dQQV9PVUlfU0laRSk7CisKKwkJaWYgKG5lZ290aWF0ZWRfYXV0aHR5cGUpCisJCQkqbmVnb3RpYXRlZF9hdXRodHlwZSA9IG5lZ19hdXRodHlwZTsKKwl9CisKKwlyZXR1cm4gYWNjZXB0YWJsZV9jaXBoZXI7Cit9CisKK2Jvb2wgY3NyX2lzX3dwYV9lbmNyeXB0aW9uX21hdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JBdXRoTGlzdCAqcEF1dGhUeXBlLAorCQkJCSBlQ3NyRW5jcnlwdGlvblR5cGUgZW5UeXBlLAorCQkJCSB0Q3NyRW5jcnlwdGlvbkxpc3QgKnBFbk1jVHlwZSwKKwkJCQkgdERvdDExZkJlYWNvbklFcyAqcEllcywKKwkJCQkgZUNzckF1dGhUeXBlICpwTmVnb3RpYXRlZEF1dGh0eXBlLAorCQkJCSBlQ3NyRW5jcnlwdGlvblR5cGUgKnBOZWdvdGlhdGVkTUNDaXBoZXIpCit7CisJYm9vbCBmV3BhTWF0Y2ggPSBmYWxzZTsKKworCS8qIFNlZSBpZiB0aGUgY3lwaGVycyBpbiB0aGUgQnNzIGRlc2NyaXB0aW9uIG1hdGNoIHdpdGggdGhlIHNldHRpbmdzIGluIHRoZSBwcm9maWxlLiAqLworCWZXcGFNYXRjaCA9CisJCWNzcl9nZXRfd3BhX2N5cGhlcnMocE1hYywgcEF1dGhUeXBlLCBlblR5cGUsIHBFbk1jVHlwZSwgJnBJZXMtPldQQSwKKwkJCQkgICAgTlVMTCwgTlVMTCwgTlVMTCwgcE5lZ290aWF0ZWRBdXRodHlwZSwKKwkJCQkgICAgcE5lZ290aWF0ZWRNQ0NpcGhlcik7CisKKwlyZXR1cm4gZldwYU1hdGNoOworfQorCit1aW50OF90IGNzcl9jb25zdHJ1Y3Rfd3BhX2llKHRIYWxIYW5kbGUgaEhhbCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCSAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJCSAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywgdENzcldwYUllICpwV3BhSWUpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWJvb2wgZldwYU1hdGNoOworCXVpbnQ4X3QgY2JXcGFJZSA9IDA7CisJdWludDhfdCBVbmljYXN0Q3lwaGVyW0NTUl9XUEFfT1VJX1NJWkVdOworCXVpbnQ4X3QgTXVsdGljYXN0Q3lwaGVyW0NTUl9XUEFfT1VJX1NJWkVdOworCXVpbnQ4X3QgQXV0aFN1aXRlW0NTUl9XUEFfT1VJX1NJWkVdOworCXRDc3JXcGFBdXRoSWUgKnBBdXRoU3VpdGU7CisJdERvdDExZkJlYWNvbklFcyAqcEllc0xvY2FsID0gcEllczsKKworCWRvIHsKKwkJaWYgKCFjc3JfaXNfcHJvZmlsZV93cGEocFByb2ZpbGUpKQorCQkJYnJlYWs7CisKKwkJaWYgKCFwSWVzTG9jYWwKKwkJICAgICYmCisJCSAgICAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgICAoY3NyX2dldF9wYXJzZWRfYnNzX2Rlc2NyaXB0aW9uX2llcworCQkJCSAgICAgKHBNYWMsIHBTaXJCc3NEZXNjLCAmcEllc0xvY2FsKSkpKSB7CisJCQlicmVhazsKKwkJfQorCQkvKiBTZWUgaWYgdGhlIGN5cGhlcnMgaW4gdGhlIEJzcyBkZXNjcmlwdGlvbiBtYXRjaCB3aXRoIHRoZSBzZXR0aW5ncyBpbiB0aGUgcHJvZmlsZS4gKi8KKwkJZldwYU1hdGNoID0KKwkJCWNzcl9nZXRfd3BhX2N5cGhlcnMoaEhhbCwgJnBQcm9maWxlLT5BdXRoVHlwZSwKKwkJCQkJICAgIHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSwKKwkJCQkJICAgICZwUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZSwKKwkJCQkJICAgICZwSWVzTG9jYWwtPldQQSwgVW5pY2FzdEN5cGhlciwKKwkJCQkJICAgIE11bHRpY2FzdEN5cGhlciwgQXV0aFN1aXRlLCBOVUxMLCBOVUxMKTsKKwkJaWYgKCFmV3BhTWF0Y2gpCisJCQlicmVhazsKKworCQlwV3BhSWUtPkllSGVhZGVyLkVsZW1lbnRJRCA9IFNJUl9NQUNfV1BBX0VJRDsKKworCQljZGZfbWVtX2NvcHkocFdwYUllLT5PdWksIGNzcl93cGFfb3VpWzAxXSwgc2l6ZW9mKHBXcGFJZS0+T3VpKSk7CisKKwkJcFdwYUllLT5WZXJzaW9uID0gQ1NSX1dQQV9WRVJTSU9OX1NVUFBPUlRFRDsKKworCQljZGZfbWVtX2NvcHkocFdwYUllLT5NdWx0aWNhc3RPdWksIE11bHRpY2FzdEN5cGhlciwKKwkJCSAgICAgc2l6ZW9mKE11bHRpY2FzdEN5cGhlcikpOworCisJCXBXcGFJZS0+Y1VuaWNhc3RDeXBoZXJzID0gMTsKKworCQljZGZfbWVtX2NvcHkoJnBXcGFJZS0+VW5pY2FzdE91aVswXSwgVW5pY2FzdEN5cGhlciwKKwkJCSAgICAgc2l6ZW9mKFVuaWNhc3RDeXBoZXIpKTsKKworCQlwQXV0aFN1aXRlID0KKwkJCSh0Q3NyV3BhQXV0aEllICopICgmcFdwYUllLT4KKwkJCQkJICAgVW5pY2FzdE91aVtwV3BhSWUtPmNVbmljYXN0Q3lwaGVyc10pOworCisJCXBBdXRoU3VpdGUtPmNBdXRoZW50aWNhdGlvblN1aXRlcyA9IDE7CisJCWNkZl9tZW1fY29weSgmcEF1dGhTdWl0ZS0+QXV0aE91aVswXSwgQXV0aFN1aXRlLAorCQkJICAgICBzaXplb2YoQXV0aFN1aXRlKSk7CisKKwkJLyogVGhlIFdQQSBjYXBhYmlsaXRpZXMgZm9sbG93cyB0aGUgQXV0aCBTdWl0ZSAodHdvIG9jdGVjdHMpLS0gKi8KKwkJLyogdGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYW5kIHdlIGFsd2F5cyAic2VuZCIgemVybywgc28ganVzdCAqLworCQkvKiByZW1vdmUgaXQuICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBvdXIgYXNzdW1wdGlvbnMgaW4gdGhlICovCisJCS8qIGZyYW1lcyBjb21waWxlcjsgYy5mLiBidWcgMTUyMzQ6ICovCisJCS8qIGh0dHA6Ly9nb2xkLndvb2RzaWRlbmV0LmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTUyMzQgKi8KKworCQkvKiBBZGQgaW4gdGhlIGZpeGVkIGZpZWxkcyBwbHVzIDEgVW5pY2FzdCBjeXBoZXIsIGxlc3MgdGhlIElFIEhlYWRlciBsZW5ndGggKi8KKwkJLyogQWRkIGluIHRoZSBzaXplIG9mIHRoZSBBdXRoIHN1aXRlIChjb3VudCBwbHVzIGEgc2luZ2xlIE9VSSkgKi8KKwkJcFdwYUllLT5JZUhlYWRlci5MZW5ndGggPQorCQkJc2l6ZW9mKCpwV3BhSWUpIC0gc2l6ZW9mKHBXcGFJZS0+SWVIZWFkZXIpICsKKwkJCXNpemVvZigqcEF1dGhTdWl0ZSk7CisKKwkJLyogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBJRSBoZWFkZXIgKHRvdGFsKSBjb25zdHJ1Y3RlZC4uLiAqLworCQljYldwYUllID0gcFdwYUllLT5JZUhlYWRlci5MZW5ndGggKyBzaXplb2YocFdwYUllLT5JZUhlYWRlcik7CisKKwl9IHdoaWxlICgwKTsKKworCWlmICghcEllcyAmJiBwSWVzTG9jYWwpIHsKKwkJLyogbG9jYWxseSBhbGxvY2F0ZWQgKi8KKwkJY2RmX21lbV9mcmVlKHBJZXNMb2NhbCk7CisJfQorCisJcmV0dXJuIGNiV3BhSWU7Cit9CisKKy8qIElmIGEgV1BBSUUgZXhpc3RzIGluIHRoZSBwcm9maWxlLCBqdXN0IHVzZSBpdC4gT3IgZWxzZSBjb25zdHJ1Y3Qgb25lIGZyb20gdGhlIEJTUyAqLworLyogQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBXcGFJZSBhbmQgZ3VhcnJhbnRlZSBpdCBjYW4gY29udGFpbiBhIG1heCBsZW5ndGggV1BBIElFICovCit1aW50OF90IGNzcl9yZXRyaWV2ZV93cGFfaWUodEhhbEhhbmRsZSBoSGFsLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorCQkJICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCQkgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywgdENzcldwYUllICpwV3BhSWUpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXVpbnQ4X3QgY2JXcGFJZSA9IDA7CisKKwlkbyB7CisJCWlmICghY3NyX2lzX3Byb2ZpbGVfd3BhKHBQcm9maWxlKSkKKwkJCWJyZWFrOworCQlpZiAocFByb2ZpbGUtPm5XUEFSZXFJRUxlbmd0aCAmJiBwUHJvZmlsZS0+cFdQQVJlcUlFKSB7CisJCQlpZiAoU0lSX01BQ19XUEFfSUVfTUFYX0xFTkdUSCA+PQorCQkJICAgIHBQcm9maWxlLT5uV1BBUmVxSUVMZW5ndGgpIHsKKwkJCQljYldwYUllID0gKHVpbnQ4X3QpIHBQcm9maWxlLT5uV1BBUmVxSUVMZW5ndGg7CisJCQkJY2RmX21lbV9jb3B5KHBXcGFJZSwgcFByb2ZpbGUtPnBXUEFSZXFJRSwKKwkJCQkJICAgICBjYldwYUllKTsKKwkJCX0gZWxzZSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCQkiICBjc3JfcmV0cmlldmVfd3BhX2llIGRldGVjdCBpbnZhbGlkIFdQQSBJRSBsZW5ndGggKCVkKSAiLAorCQkJCQlwUHJvZmlsZS0+bldQQVJlcUlFTGVuZ3RoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNiV3BhSWUgPQorCQkJCWNzcl9jb25zdHJ1Y3Rfd3BhX2llKHBNYWMsIHBQcm9maWxlLCBwU2lyQnNzRGVzYywgcEllcywKKwkJCQkJCSAgICAgcFdwYUllKTsKKwkJfQorCX0gd2hpbGUgKDApOworCisJcmV0dXJuIGNiV3BhSWU7Cit9CisKKy8qIElmIGEgUlNOSUUgZXhpc3RzIGluIHRoZSBwcm9maWxlLCBqdXN0IHVzZSBpdC4gT3IgZWxzZSBjb25zdHJ1Y3Qgb25lIGZyb20gdGhlIEJTUyAqLworLyogQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBXcGFJZSBhbmQgZ3VhcnJhbnRlZSBpdCBjYW4gY29udGFpbiBhIG1heCBsZW5ndGggV1BBIElFICovCit1aW50OF90IGNzcl9yZXRyaWV2ZV9yc25faWUodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKwkJCSAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLAorCQkJICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JSU05JZSAqcFJzbkllKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl1aW50OF90IGNiUnNuSWUgPSAwOworCisJZG8geworCQlpZiAoIWNzcl9pc19wcm9maWxlX3JzbihwUHJvZmlsZSkpCisJCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCisJCWlmIChjc3Jfcm9hbV9pc19mYXN0X3JvYW1fZW5hYmxlZChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQkvKiBJZiAiTGVnYWN5IEZhc3QgUm9hbWluZyIgaXMgZW5hYmxlZCBBTFdBWVMgcmVidWlsZCB0aGUgUlNOIElFIGZyb20gKi8KKwkJCS8qIHNjcmF0Y2guIFNvIGl0IGNvbnRhaW5zIHRoZSBjdXJyZW50IFBNSy1JRHMgKi8KKwkJCWNiUnNuSWUgPQorCQkJCWNzcl9jb25zdHJ1Y3RfcnNuX2llKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsCisJCQkJCQkgICAgIHBTaXJCc3NEZXNjLCBwSWVzLCBwUnNuSWUpOworCQl9IGVsc2UKKyNlbmRpZgorCQlpZiAocFByb2ZpbGUtPm5SU05SZXFJRUxlbmd0aCAmJiBwUHJvZmlsZS0+cFJTTlJlcUlFKSB7CisJCQkvKiBJZiB5b3UgaGF2ZSBvbmUgc3RhcnRlZCBhd2F5LCByZS11c2UgaXQuICovCisJCQlpZiAoU0lSX01BQ19XUEFfSUVfTUFYX0xFTkdUSCA+PQorCQkJICAgIHBQcm9maWxlLT5uUlNOUmVxSUVMZW5ndGgpIHsKKwkJCQljYlJzbkllID0gKHVpbnQ4X3QpIHBQcm9maWxlLT5uUlNOUmVxSUVMZW5ndGg7CisJCQkJY2RmX21lbV9jb3B5KHBSc25JZSwgcFByb2ZpbGUtPnBSU05SZXFJRSwKKwkJCQkJICAgICBjYlJzbkllKTsKKwkJCX0gZWxzZSB7CisJCQkJc21zX2xvZyhwTWFjLCBMT0dXLAorCQkJCQkiICBjc3JfcmV0cmlldmVfcnNuX2llIGRldGVjdCBpbnZhbGlkIFJTTiBJRSBsZW5ndGggKCVkKSAiLAorCQkJCQlwUHJvZmlsZS0+blJTTlJlcUlFTGVuZ3RoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNiUnNuSWUgPQorCQkJCWNzcl9jb25zdHJ1Y3RfcnNuX2llKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsCisJCQkJCQkgICAgIHBTaXJCc3NEZXNjLCBwSWVzLCBwUnNuSWUpOworCQl9CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gY2JSc25JZTsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisvKiBJZiBhIFdBUEkgSUUgZXhpc3RzIGluIHRoZSBwcm9maWxlLCBqdXN0IHVzZSBpdC4gT3IgZWxzZSBjb25zdHJ1Y3Qgb25lIGZyb20gdGhlIEJTUyAqLworLyogQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBXYXBpSWUgYW5kIGd1YXJyYW50ZWUgaXQgY2FuIGNvbnRhaW4gYSBtYXggbGVuZ3RoIFdBUEkgSUUgKi8KK3VpbnQ4X3QgY3NyX3JldHJpZXZlX3dhcGlfaWUodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkgICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisJCQkgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JXYXBpSWUgKnBXYXBpSWUpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXVpbnQ4X3QgY2JXYXBpSWUgPSAwOworCisJZG8geworCQlpZiAoIWNzcl9pc19wcm9maWxlX3dhcGkocFByb2ZpbGUpKQorCQkJYnJlYWs7CisJCWlmIChwUHJvZmlsZS0+bldBUElSZXFJRUxlbmd0aCAmJiBwUHJvZmlsZS0+cFdBUElSZXFJRSkgeworCQkJaWYgKERPVDExRl9JRV9XQVBJX01BWF9MRU4gPj0KKwkJCSAgICBwUHJvZmlsZS0+bldBUElSZXFJRUxlbmd0aCkgeworCQkJCWNiV2FwaUllID0gKHVpbnQ4X3QpIHBQcm9maWxlLT5uV0FQSVJlcUlFTGVuZ3RoOworCQkJCWNkZl9tZW1fY29weShwV2FwaUllLCBwUHJvZmlsZS0+cFdBUElSZXFJRSwKKwkJCQkJICAgICBjYldhcGlJZSk7CisJCQl9IGVsc2UgeworCQkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQkJIiAgY3NyX3JldHJpZXZlX3dhcGlfaWUgZGV0ZWN0IGludmFsaWQgV0FQSSBJRSBsZW5ndGggKCVkKSAiLAorCQkJCQlwUHJvZmlsZS0+bldBUElSZXFJRUxlbmd0aCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljYldhcGlJZSA9CisJCQkJY3NyX2NvbnN0cnVjdF93YXBpX2llKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsCisJCQkJCQkgICAgICBwU2lyQnNzRGVzYywgcEllcywgcFdhcGlJZSk7CisJCX0KKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBjYldhcGlJZTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCitib29sIGNzcl9yYXRlc19pc19kb3QxMV9yYXRlMTFiX3N1cHBvcnRlZF9yYXRlKHVpbnQ4X3QgZG90MTFSYXRlKQoreworCWJvb2wgZlN1cHBvcnRlZCA9IGZhbHNlOworCXVpbnQxNl90IG5vbkJhc2ljUmF0ZSA9CisJCSh1aW50MTZfdCkgKEJJVFNfT0ZGKGRvdDExUmF0ZSwgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSykpOworCisJc3dpdGNoIChub25CYXNpY1JhdGUpIHsKKwljYXNlIGVDc3JTdXBwUmF0ZV8xTWJwczoKKwljYXNlIGVDc3JTdXBwUmF0ZV8yTWJwczoKKwljYXNlIGVDc3JTdXBwUmF0ZV81XzVNYnBzOgorCWNhc2UgZUNzclN1cHBSYXRlXzExTWJwczoKKwkJZlN1cHBvcnRlZCA9IHRydWU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGZTdXBwb3J0ZWQ7Cit9CisKK2Jvb2wgY3NyX3JhdGVzX2lzX2RvdDExX3JhdGUxMWFfc3VwcG9ydGVkX3JhdGUodWludDhfdCBkb3QxMVJhdGUpCit7CisJYm9vbCBmU3VwcG9ydGVkID0gZmFsc2U7CisJdWludDE2X3Qgbm9uQmFzaWNSYXRlID0KKwkJKHVpbnQxNl90KSAoQklUU19PRkYoZG90MTFSYXRlLCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLKSk7CisKKwlzd2l0Y2ggKG5vbkJhc2ljUmF0ZSkgeworCWNhc2UgZUNzclN1cHBSYXRlXzZNYnBzOgorCWNhc2UgZUNzclN1cHBSYXRlXzlNYnBzOgorCWNhc2UgZUNzclN1cHBSYXRlXzEyTWJwczoKKwljYXNlIGVDc3JTdXBwUmF0ZV8xOE1icHM6CisJY2FzZSBlQ3NyU3VwcFJhdGVfMjRNYnBzOgorCWNhc2UgZUNzclN1cHBSYXRlXzM2TWJwczoKKwljYXNlIGVDc3JTdXBwUmF0ZV80OE1icHM6CisJY2FzZSBlQ3NyU3VwcFJhdGVfNTRNYnBzOgorCQlmU3VwcG9ydGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZlN1cHBvcnRlZDsKK30KKwordEFuaUVkVHlwZSBjc3JfdHJhbnNsYXRlX2VuY3J5cHRfdHlwZV90b19lZF90eXBlKGVDc3JFbmNyeXB0aW9uVHlwZSBFbmNyeXB0VHlwZSkKK3sKKwl0QW5pRWRUeXBlIGVkVHlwZTsKKworCXN3aXRjaCAoRW5jcnlwdFR5cGUpIHsKKwlkZWZhdWx0OgorCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfTk9ORToKKwkJZWRUeXBlID0gZVNJUl9FRF9OT05FOworCQlicmVhazsKKworCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOgorCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA6CisJCWVkVHlwZSA9IGVTSVJfRURfV0VQNDA7CisJCWJyZWFrOworCisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OgorCQllZFR5cGUgPSBlU0lSX0VEX1dFUDEwNDsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1RLSVA6CisJCWVkVHlwZSA9IGVTSVJfRURfVEtJUDsKKwkJYnJlYWs7CisKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX0FFUzoKKwkJZWRUeXBlID0gZVNJUl9FRF9DQ01QOworCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV1BJOgorCQllZFR5cGUgPSBlU0lSX0VEX1dQSTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJLyogMTF3IEJJUCAqLworCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQUVTX0NNQUM6CisJCWVkVHlwZSA9IGVTSVJfRURfQUVTXzEyOF9DTUFDOworCQlicmVhazsKKyNlbmRpZgorCX0KKworCXJldHVybiBlZFR5cGU7Cit9CisKKy8qKgorICogY3NyX3ZhbGlkYXRlX3dlcCgpIC0gdG8gdmFsaWRhdGUgd2VwCisgKiBAdWNfZW5jcnlfdHlwZTogdW5pY2FzdCBlbmNyeXB0aW9uIHR5cGUKKyAqIEBhdXRoX2xpc3Q6IEF1dGggbGlzdAorICogQG1jX2VuY3J5cHRpb25fbGlzdDogbXVsdGljYXN0IGVuY3J5cHRpb24gdHlwZQorICogQG5lZ290aWF0ZWRfYXV0aHR5cGU6IG5lZ290aWF0ZWQgYXV0aCB0eXBlCisgKiBAbmVnb3RpYXRlZF9tY19lbmNyeTogbmVnb3RpYXRlZCBtYyBlbmNyeSB0eXBlCisgKiBAYnNzX2Rlc2NyOiBCU1MgZGVzY3JpcHRpb24KKyAqIEBpZV9wdHI6IElFIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHdoZXRoZXIgSEREIGlzIGdpdmluZyBjb3JyZWN0IHZhbHVlcyBmb3IKKyAqIE11bHRpY2FzdCBjaXBoZXIgYW5kIEF1dGgKKyAqCisgKiBSZXR1cm46IGJvb2wKKyAqLworYm9vbCBjc3JfdmFsaWRhdGVfd2VwKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIGVDc3JFbmNyeXB0aW9uVHlwZSB1Y19lbmNyeV90eXBlLAorCQkgICAgICB0Q3NyQXV0aExpc3QgKmF1dGhfbGlzdCwKKwkJICAgICAgdENzckVuY3J5cHRpb25MaXN0ICptY19lbmNyeXB0aW9uX2xpc3QsCisJCSAgICAgIGVDc3JBdXRoVHlwZSAqbmVnb3RpYXRlZF9hdXRodHlwZSwKKwkJICAgICAgZUNzckVuY3J5cHRpb25UeXBlICpuZWdvdGlhdGVkX21jX2VuY3J5LAorCQkgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKmJzc19kZXNjciwgdERvdDExZkJlYWNvbklFcyAqaWVfcHRyKQoreworCXVpbnQzMl90IGlkeDsKKwlib29sIG1hdGNoID0gZmFsc2U7CisJZUNzckF1dGhUeXBlIG5lZ290aWF0ZWRfYXV0aCA9IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOworCWVDc3JFbmNyeXB0aW9uVHlwZSBuZWdvdGlhdGVkX21jY2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfVU5LTk9XTjsKKworCS8qIElmIHByaXZhY3kgYml0IGlzIG5vdCBzZXQsIGNvbnNpZGVyIG5vIG1hdGNoICovCisJaWYgKCFjc3JfaXNfcHJpdmFjeShic3NfZGVzY3IpKQorCQlnb3RvIGVuZDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgbWNfZW5jcnlwdGlvbl9saXN0LT5udW1FbnRyaWVzOyBpZHgrKykgeworCQlzd2l0Y2ggKG1jX2VuY3J5cHRpb25fbGlzdC0+ZW5jcnlwdGlvblR5cGVbaWR4XSkgeworCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWToKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOgorCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDoKKwkJCS8qCisJCQkgKiBNdWx0aWNhc3QgbGlzdCBtYXkgY29udGFpbiBXRVA0MC9XRVAxMDQuCisJCQkgKiBDaGVjayB3aGV0aGVyIGl0IG1hdGNoZXMgVUMuCisJCQkgKi8KKwkJCWlmICh1Y19lbmNyeV90eXBlID09CisJCQkJbWNfZW5jcnlwdGlvbl9saXN0LT5lbmNyeXB0aW9uVHlwZVtpZHhdKSB7CisJCQkJbWF0Y2ggPSB0cnVlOworCQkJCW5lZ290aWF0ZWRfbWNjaXBoZXIgPQorCQkJCQltY19lbmNyeXB0aW9uX2xpc3QtPmVuY3J5cHRpb25UeXBlW2lkeF07CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1hdGNoID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCQlpZiAobWF0Y2gpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIW1hdGNoKQorCQlnb3RvIGVuZDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgYXV0aF9saXN0LT5udW1FbnRyaWVzOyBpZHgrKykgeworCQlzd2l0Y2ggKGF1dGhfbGlzdC0+YXV0aFR5cGVbaWR4XSkgeworCQljYXNlIGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOgorCQljYXNlIGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk6CisJCWNhc2UgZUNTUl9BVVRIX1RZUEVfQVVUT1NXSVRDSDoKKwkJCW1hdGNoID0gdHJ1ZTsKKwkJCW5lZ290aWF0ZWRfYXV0aCA9IGF1dGhfbGlzdC0+YXV0aFR5cGVbaWR4XTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbWF0Y2ggPSBmYWxzZTsKKwkJfQorCQlpZiAobWF0Y2gpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIW1hdGNoKQorCQlnb3RvIGVuZDsKKworCWlmICghaWVfcHRyKQorCQlnb3RvIGVuZDsKKworCS8qCisJICogSW4gY2FzZSBvZiBXUEEgLyBXUEEyLCBjaGVjayB3aGV0aGVyIGl0IHN1cHBvcnRzIFdFUCBhcyB3ZWxsLgorCSAqIFByZXBhcmUgdGhlIGVuY3J5cHRpb24gdHlwZSBmb3IgV1BBL1dQQTIgZnVuY3Rpb25zCisJICovCisJaWYgKGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWSA9PSB1Y19lbmNyeV90eXBlKQorCQl1Y19lbmNyeV90eXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA7CisJZWxzZSBpZiAoZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0ID09IHVjX2VuY3J5X3R5cGUpCisJCXVjX2VuY3J5X3R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ7CisKKwkvKiBlbHNlIHdlIGNhbiB1c2UgdGhlIGVuY3J5cHRpb24gdHlwZSBkaXJlY3RseSAqLworCWlmIChpZV9wdHItPldQQS5wcmVzZW50KSB7CisJCW1hdGNoID0gY2RmX21lbV9jb21wYXJlKGllX3B0ci0+V1BBLm11bHRpY2FzdF9jaXBoZXIsCisJCQkJY3NyX3dwYV9vdWlbY3NyX2dldF9vdWlfaW5kZXhfZnJvbV9jaXBoZXIoCisJCQkJCXVjX2VuY3J5X3R5cGUpXSwKKwkJCQlDU1JfV1BBX09VSV9TSVpFKTsKKwkJaWYgKG1hdGNoKQorCQkJZ290byBlbmQ7CisJfQorCWlmIChpZV9wdHItPlJTTi5wcmVzZW50KSB7CisJCW1hdGNoID0gY2RmX21lbV9jb21wYXJlKGllX3B0ci0+UlNOLmdwX2NpcGhlcl9zdWl0ZSwKKwkJCQljc3JfcnNuX291aVtjc3JfZ2V0X291aV9pbmRleF9mcm9tX2NpcGhlcigKKwkJCQkJdWNfZW5jcnlfdHlwZSldLAorCQkJCUNTUl9SU05fT1VJX1NJWkUpOworCX0KKworCitlbmQ6CisJaWYgKG1hdGNoKSB7CisJCWlmIChuZWdvdGlhdGVkX2F1dGh0eXBlKQorCQkJKm5lZ290aWF0ZWRfYXV0aHR5cGUgPSBuZWdvdGlhdGVkX2F1dGg7CisJCWlmIChuZWdvdGlhdGVkX21jX2VuY3J5KQorCQkJKm5lZ290aWF0ZWRfbWNfZW5jcnkgPSBuZWdvdGlhdGVkX21jY2lwaGVyOworCX0KKwlyZXR1cm4gbWF0Y2g7Cit9CisKKy8qKgorICogY3NyX3ZhbGlkYXRlX29wZW5fbm9uZSgpIC0gQ2hlY2sgaWYgdGhlIHNlY3VyaXR5IGlzIG1hdGNoaW5nCisgKiBAYnNzX2Rlc2M6ICAgICAgICAgIEJTUyBEZXNjcmlwdG9yIG9uIHdoaWNoIHRoZSBjaGVjayBpcyBkb25lCisgKiBAbWNfZW5jX3R5cGU6ICAgICAgIE11bHRpY2FzdCBlbmNyeXB0aW9uIHR5cGUKKyAqIEBtY19jaXBoZXI6ICAgICAgICAgTXVsdGljYXN0IENpcGhlcgorICogQGF1dGhfdHlwZTogICAgICAgICBBdXRoZW50aWNhdGlvbiB0eXBlCisgKiBAbmVnX2F1dGhfdHlwZTogICAgIE5lZ290aWF0ZWQgQXV0aCB0eXBlIHdpdGggdGhlIEFQCisgKgorICogUmV0dXJuOiBCb29sZWFuIHZhbHVlIHRvIHRlbGwgaWYgbWF0Y2hlZCBvciBub3QuCisgKi8KK3N0YXRpYyBib29sIGNzcl92YWxpZGF0ZV9vcGVuX25vbmUodFNpckJzc0Rlc2NyaXB0aW9uICpic3NfZGVzYywKKwl0Q3NyRW5jcnlwdGlvbkxpc3QgKm1jX2VuY190eXBlLCBlQ3NyRW5jcnlwdGlvblR5cGUgKm1jX2NpcGhlciwKKwl0Q3NyQXV0aExpc3QgKmF1dGhfdHlwZSwgZUNzckF1dGhUeXBlICpuZWdfYXV0aF90eXBlKQoreworCWJvb2wgbWF0Y2g7CisJdWludDhfdCBpZHg7CisKKwkvKgorCSAqIGZvciBOTyBlbmNyeXB0aW9uLCBpZiB0aGUgQnNzIGRlc2NyaXB0aW9uIGhhcyB0aGUKKwkgKiBQcml2YWN5IGJpdCB0dXJuZWQgb24sIHRoZW4gZW5jcnlwdGlvbiBpcyByZXF1aXJlZAorCSAqIHNvIHdlIGhhdmUgdG8gcmVqZWN0IHRoaXMgQnNzLgorCSAqLworCWlmIChjc3JfaXNfcHJpdmFjeShic3NfZGVzYykpCisJCW1hdGNoID0gZmFsc2U7CisJZWxzZQorCQltYXRjaCA9IHRydWU7CisJaWYgKG1hdGNoKSB7CisJCW1hdGNoID0gZmFsc2U7CisJCS8qIENoZWNrIE1DIGNpcGhlciBhbmQgQXV0aCB0eXBlIHJlcXVlc3RlZC4gKi8KKwkJZm9yIChpZHggPSAwOyBpZHggPCBtY19lbmNfdHlwZS0+bnVtRW50cmllczsgaWR4KyspIHsKKwkJCWlmIChlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FID09CisJCQkJbWNfZW5jX3R5cGUtPmVuY3J5cHRpb25UeXBlW2lkeF0pIHsKKwkJCQltYXRjaCA9IHRydWU7CisJCQkJKm1jX2NpcGhlciA9IG1jX2VuY190eXBlLT5lbmNyeXB0aW9uVHlwZVtpZHhdOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghbWF0Y2gpCisJCQlyZXR1cm4gbWF0Y2g7CisKKwkJbWF0Y2ggPSBmYWxzZTsKKwkJLyogQ2hlY2sgQXV0aCBsaXN0LiBJdCBzaG91bGQgY29udGFpbiBBdXRoT3Blbi4gKi8KKwkJZm9yIChpZHggPSAwOyBpZHggPCBhdXRoX3R5cGUtPm51bUVudHJpZXM7IGlkeCsrKSB7CisJCQlpZiAoKGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNID09CisJCQkJYXV0aF90eXBlLT5hdXRoVHlwZVtpZHhdKSB8fAorCQkJCShlQ1NSX0FVVEhfVFlQRV9BVVRPU1dJVENIID09CisJCQkJYXV0aF90eXBlLT5hdXRoVHlwZVtpZHhdKSkgeworCQkJCW1hdGNoID0gdHJ1ZTsKKwkJCQkqbmVnX2F1dGhfdHlwZSA9CisJCQkJCWVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghbWF0Y2gpCisJCQlyZXR1cm4gbWF0Y2g7CisKKwl9CisJcmV0dXJuIG1hdGNoOworfQorCisvKioKKyAqIGNzcl92YWxpZGF0ZV9hbnlfZGVmYXVsdCgpIC0gQ2hlY2sgaWYgdGhlIHNlY3VyaXR5IGlzIG1hdGNoaW5nCisgKiBAaGFsOiAgICAgICAgICAgICAgIEdsb2JhbCBIQUwgaGFuZGxlCisgKiBAYXV0aF90eXBlOiAgICAgICAgIEF1dGhlbnRpY2F0aW9uIHR5cGUKKyAqIEBtY19lbmNfdHlwZTogICAgICAgTXVsdGljYXN0IGVuY3J5cHRpb24gdHlwZQorICogQG1mcF9lbmFibGVkOiAgICAgICBNYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gZmVhdHVyZQorICogQG1mcF9yZXF1aXJlZDogICAgICBNYW5nZW1lbnQgZnJhbWUgcHJvdGVjdGlvbiBtYW5kYXRvcnkKKyAqIEBtZnBfY2FwYWJsZTogICAgICAgRGV2aWNlIGNhcGFibGUgb2YgTUZQCisgKiBAaWVzX3B0cjogICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIElFIGZpZWxkcworICogQG5lZ19hdXRoX3R5cGU6ICAgICBOZWdvdGlhdGVkIEF1dGggdHlwZSB3aXRoIHRoZSBBUAorICogQGJzc19kZXNjOiAgICAgICAgICBCU1MgRGVzY3JpcHRvcgorICogQG5lZ191Y19jaXBoZXI6ICAgICBOZWdvdGlhdGVkIHVuaWNhc3QgY2lwaGVyIHN1aXRlCisgKiBAbmVnX21jX2NpcGhlcjogICAgIE5lZ290aWF0ZWQgbXVsdGljYXN0IGNpcGhlcgorICoKKyAqIFJldHVybjogQm9vbGVhbiB2YWx1ZSB0byB0ZWxsIGlmIG1hdGNoZWQgb3Igbm90LgorICovCitzdGF0aWMgYm9vbCBjc3JfdmFsaWRhdGVfYW55X2RlZmF1bHQodEhhbEhhbmRsZSBoYWwsIHRDc3JBdXRoTGlzdCAqYXV0aF90eXBlLAorCXRDc3JFbmNyeXB0aW9uTGlzdCAqbWNfZW5jX3R5cGUsIGJvb2wgKm1mcF9lbmFibGVkLAorCXVpbnQ4X3QgKm1mcF9yZXF1aXJlZCwgdWludDhfdCAqbWZwX2NhcGFibGUsCisJdERvdDExZkJlYWNvbklFcyAqaWVzX3B0ciwgZUNzckF1dGhUeXBlICpuZWdfYXV0aF90eXBlLAorCXRTaXJCc3NEZXNjcmlwdGlvbiAqYnNzX2Rlc2MsIGVDc3JFbmNyeXB0aW9uVHlwZSAqdWNfY2lwaGVyLAorCWVDc3JFbmNyeXB0aW9uVHlwZSAqbWNfY2lwaGVyKQoreworCWJvb2wgbWF0Y2hfYW55ID0gZmFsc2U7CisJYm9vbCBtYXRjaCA9IHRydWU7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbCk7CisJLyogSXQgaXMgYWxsb3dlZCB0byBtYXRjaCBhbnl0aGluZy4gVHJ5IHRoZSBtb3JlIHNlY3VyZWQgb25lcyBmaXJzdC4gKi8KKwlpZiAoaWVzX3B0cikgeworCQkvKiBDaGVjayBBRVMgZmlyc3QgKi8KKwkJKnVjX2NpcGhlciA9IGVDU1JfRU5DUllQVF9UWVBFX0FFUzsKKwkJbWF0Y2hfYW55ID0gY3NyX2lzX3Jzbl9tYXRjaChoYWwsIGF1dGhfdHlwZSwKKwkJCQkqdWNfY2lwaGVyLCBtY19lbmNfdHlwZSwgbWZwX2VuYWJsZWQsCisJCQkJbWZwX3JlcXVpcmVkLCBtZnBfY2FwYWJsZSwgaWVzX3B0ciwKKwkJCQluZWdfYXV0aF90eXBlLCBtY19jaXBoZXIpOworCQlpZiAoIW1hdGNoX2FueSkgeworCQkJLyogQ2hlY2sgVEtJUCAqLworCQkJKnVjX2NpcGhlciA9IGVDU1JfRU5DUllQVF9UWVBFX1RLSVA7CisJCQltYXRjaF9hbnkgPSBjc3JfaXNfcnNuX21hdGNoKGhhbCwgYXV0aF90eXBlLCAqdWNfY2lwaGVyLAorCQkJCQltY19lbmNfdHlwZSwgbWZwX2VuYWJsZWQsIG1mcF9yZXF1aXJlZCwKKwkJCQkJbWZwX2NhcGFibGUsIGllc19wdHIsIG5lZ19hdXRoX3R5cGUsCisJCQkJCW1jX2NpcGhlcik7CisJCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCQlpZiAoIW1hdGNoX2FueSkgeworCQkJLyogQ2hlY2sgV0FQSSAqLworCQkJKnVjX2NpcGhlciA9IGVDU1JfRU5DUllQVF9UWVBFX1dQSTsKKwkJCW1hdGNoX2FueSA9IGNzcl9pc193YXBpX21hdGNoKGhhbCwgYXV0aF90eXBlLAorCQkJCQkqdWNfY2lwaGVyLCBtY19lbmNfdHlwZSwgaWVzX3B0ciwKKwkJCQkJbmVnX2F1dGhfdHlwZSwgbWNfY2lwaGVyKTsKKwkJfQorI2VuZGlmCisJfQorCWlmIChtYXRjaF9hbnkpCisJCXJldHVybiBtYXRjaDsKKwkqdWNfY2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OworCWlmIChjc3JfdmFsaWRhdGVfd2VwKG1hY19jdHgsICp1Y19jaXBoZXIsIGF1dGhfdHlwZSwgbWNfZW5jX3R5cGUsCisJCQluZWdfYXV0aF90eXBlLCBtY19jaXBoZXIsIGJzc19kZXNjLCBpZXNfcHRyKSkKKwkJcmV0dXJuIG1hdGNoOworCSp1Y19jaXBoZXIgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDsKKwlpZiAoY3NyX3ZhbGlkYXRlX3dlcChtYWNfY3R4LCAqdWNfY2lwaGVyLCBhdXRoX3R5cGUsIG1jX2VuY190eXBlLAorCQkJbmVnX2F1dGhfdHlwZSwgbWNfY2lwaGVyLCBic3NfZGVzYywgaWVzX3B0cikpCisJCXJldHVybiBtYXRjaDsKKwkqdWNfY2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWTsKKwlpZiAoY3NyX3ZhbGlkYXRlX3dlcChtYWNfY3R4LCAqdWNfY2lwaGVyLCBhdXRoX3R5cGUsIG1jX2VuY190eXBlLAorCQkJbmVnX2F1dGhfdHlwZSwgbWNfY2lwaGVyLCBic3NfZGVzYywgaWVzX3B0cikpCisJCXJldHVybiBtYXRjaDsKKwkqdWNfY2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOworCWlmIChjc3JfdmFsaWRhdGVfd2VwKG1hY19jdHgsICp1Y19jaXBoZXIsIGF1dGhfdHlwZSwgbWNfZW5jX3R5cGUsCisJCQluZWdfYXV0aF90eXBlLCBtY19jaXBoZXIsIGJzc19kZXNjLCBpZXNfcHRyKSkKKwkJcmV0dXJuIG1hdGNoOworCS8qIEl0IG11c3QgYmUgb3BlbiBhbmQgbm8gZW5jICovCisJaWYgKGNzcl9pc19wcml2YWN5KGJzc19kZXNjKSkgeworCQltYXRjaCA9IGZhbHNlOworCQlyZXR1cm4gbWF0Y2g7CisJfQorCisJKm5lZ19hdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKwkqbWNfY2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwkqdWNfY2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKwlyZXR1cm4gbWF0Y2g7CisKK30KKworLyoqCisgKiBjc3JfaXNfc2VjdXJpdHlfbWF0Y2goKSAtIENoZWNrIGlmIHRoZSBzZWN1cml0eSBpcyBtYXRjaGluZworICogQGhhbDogICAgICAgICAgICAgICBHbG9iYWwgSEFMIGhhbmRsZQorICogQGF1dGhfdHlwZTogICAgICAgICBBdXRoZW50aWNhdGlvbiB0eXBlCisgKiBAdWNfZW5jX3R5cGU6ICAgICAgIFVuaWNhc3QgRW5jcnlwdGlvbiB0eXBlCisgKiBAbWNfZW5jX3R5cGU6ICAgICAgIE11bHRpY2FzdCBlbmNyeXB0aW9uIHR5cGUKKyAqIEBtZnBfZW5hYmxlZDogICAgICAgTWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIGZlYXR1cmUKKyAqIEBtZnBfcmVxdWlyZWQ6ICAgICAgTWFuZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gbWFuZGF0b3J5CisgKiBAbWZwX2NhcGFibGU6ICAgICAgIERldmljZSBjYXBhYmxlIG9mIE1GUAorICogQGJzc19kZXNjOiAgICAgICAgICBCU1MgRGVzY3JpcHRvcgorICogQGllc19wdHI6ICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBJRSBmaWVsZHMKKyAqIEBuZWdfYXV0aF90eXBlOiAgICAgTmVnb3RpYXRlZCBBdXRoIHR5cGUgd2l0aCB0aGUgQVAKKyAqIEBuZWdfdWNfY2lwaGVyOiAgICAgTmVnb3RpYXRlZCB1bmljYXN0IGNpcGhlciBzdWl0ZQorICogQG5lZ19tY19jaXBoZXI6ICAgICBOZWdvdGlhdGVkIG11bHRpY2FzdCBjaXBoZXIKKyAqCisgKiBSZXR1cm46IEJvb2xlYW4gdmFsdWUgdG8gdGVsbCBpZiBtYXRjaGVkIG9yIG5vdC4KKyAqLworYm9vbCBjc3JfaXNfc2VjdXJpdHlfbWF0Y2godEhhbEhhbmRsZSBoYWwsIHRDc3JBdXRoTGlzdCAqYXV0aF90eXBlLAorCXRDc3JFbmNyeXB0aW9uTGlzdCAqdWNfZW5jX3R5cGUsCisJdENzckVuY3J5cHRpb25MaXN0ICptY19lbmNfdHlwZSwgYm9vbCAqbWZwX2VuYWJsZWQsCisJdWludDhfdCAqbWZwX3JlcXVpcmVkLCB1aW50OF90ICptZnBfY2FwYWJsZSwKKwl0U2lyQnNzRGVzY3JpcHRpb24gKmJzc19kZXNjLCB0RG90MTFmQmVhY29uSUVzICppZXNfcHRyLAorCWVDc3JBdXRoVHlwZSAqbmVnX2F1dGhfdHlwZSwKKwllQ3NyRW5jcnlwdGlvblR5cGUgKm5lZ191Y19jaXBoZXIsCisJZUNzckVuY3J5cHRpb25UeXBlICpuZWdfbWNfY2lwaGVyKQoreworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBQTUFDX1NUUlVDVChoYWwpOworCWJvb2wgbWF0Y2ggPSBmYWxzZTsKKwl1aW50OF90IGk7CisJZUNzckVuY3J5cHRpb25UeXBlIG1jX2NpcGhlciA9IGVDU1JfRU5DUllQVF9UWVBFX1VOS05PV047CisJZUNzckVuY3J5cHRpb25UeXBlIHVjX2NpcGhlciA9IGVDU1JfRU5DUllQVF9UWVBFX1VOS05PV047CisJZUNzckF1dGhUeXBlIGxvY2FsX25lZ19hdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworCisJZm9yIChpID0gMDsgKChpIDwgdWNfZW5jX3R5cGUtPm51bUVudHJpZXMpICYmICghbWF0Y2gpKTsgaSsrKSB7CisJCXVjX2NpcGhlciA9IHVjX2VuY190eXBlLT5lbmNyeXB0aW9uVHlwZVtpXTsKKwkJLyoKKwkJICogSWYgdGhlIEJzcyBkZXNjcmlwdGlvbiBzaG93cyB0aGUgUHJpdmFjeSBiaXQgaXMgb24sIHRoZW4gd2UKKwkJICogbXVzdCBoYXZlIHNvbWUgc29ydCBvZiBlbmNyeXB0aW9uIGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9maWxlCisJCSAqIHRvIHdvcmsuICBEb24ndCBhdHRlbXB0IHRvIGpvaW4gbmV0d29ya3Mgd2l0aCBQcml2YWN5IGJpdAorCQkgKiBzZXQgd2hlbiBwcm9maWxlcyBzYXkgTk9ORSBmb3IgZW5jcnlwdGlvbiB0eXBlLgorCQkgKi8KKwkJc3dpdGNoICh1Y19jaXBoZXIpIHsKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOgorCQkJbWF0Y2ggPSBjc3JfdmFsaWRhdGVfb3Blbl9ub25lKGJzc19kZXNjLCBtY19lbmNfdHlwZSwKKwkJCQkJJm1jX2NpcGhlciwgYXV0aF90eXBlLAorCQkJCQkmbG9jYWxfbmVnX2F1dGhfdHlwZSk7CisJCQlicmVhazsKKworCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWToKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorCQkJLyoKKwkJCSAqICEhIG1pZ2h0IHdhbnQgdG8gY2hlY2sgZm9yIFdFUCBrZXlzIHNldCBpbiB0aGUKKwkJCSAqIFByb2ZpbGUuLi4uID8gISEgZG9uJ3QgbmVlZCB0byBoYXZlIHRoZSBwcml2YWN5IGJpdAorCQkJICogaW4gdGhlIEJzcyBkZXNjcmlwdGlvbi4gIE1hbnkgQVAgcG9saWNpZXMgbWFrZQorCQkJICogbGVnYWN5IGVuY3J5cHRpb24gJ29wdGlvbmFsJyBzbyB3ZSBkb24ndCBrbm93IGlmIHdlCisJCQkgKiBjYW4gYXNzb2NpYXRlIG9yIG5vdC4gIFRoZSBBUCB3aWxsIHJlamVjdCBpZgorCQkJICogZW5jcnlwdGlvbiBpcyBub3QgYWxsb3dlZCB3aXRob3V0IHRoZSBQcml2YWN5IGJpdAorCQkJICogdHVybmVkIG9uLgorCQkJICovCisJCQltYXRjaCA9IGNzcl92YWxpZGF0ZV93ZXAobWFjX2N0eCwgdWNfY2lwaGVyLCBhdXRoX3R5cGUsCisJCQkJCW1jX2VuY190eXBlLCAmbG9jYWxfbmVnX2F1dGhfdHlwZSwKKwkJCQkJJm1jX2NpcGhlciwgYnNzX2Rlc2MsIGllc19wdHIpOworCisJCQlicmVhazsKKwkJLyogdGhlc2UgYXJlIGFsbCBvZiB0aGUgV1BBIGVuY3J5cHRpb24gdHlwZXMuLi4gKi8KKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDoKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ6CisJCQltYXRjaCA9IGNzcl92YWxpZGF0ZV93ZXAobWFjX2N0eCwgdWNfY2lwaGVyLCBhdXRoX3R5cGUsCisJCQkJCW1jX2VuY190eXBlLCAmbG9jYWxfbmVnX2F1dGhfdHlwZSwKKwkJCQkJJm1jX2NpcGhlciwgYnNzX2Rlc2MsIGllc19wdHIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQOgorCQljYXNlIGVDU1JfRU5DUllQVF9UWVBFX0FFUzoKKwkJCWlmICghaWVzX3B0cikgeworCQkJCW1hdGNoID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIFJTTiBtYXRjaCAqLworCQkJbWF0Y2ggPSBjc3JfaXNfcnNuX21hdGNoKG1hY19jdHgsIGF1dGhfdHlwZSwKKwkJCQkJdWNfY2lwaGVyLCBtY19lbmNfdHlwZSwKKwkJCQkJbWZwX2VuYWJsZWQsIG1mcF9yZXF1aXJlZCwKKwkJCQkJbWZwX2NhcGFibGUsIGllc19wdHIsCisJCQkJCSZsb2NhbF9uZWdfYXV0aF90eXBlLAorCQkJCQkmbWNfY2lwaGVyKTsKKwkJCS8qIElmIG5vdCBSU04sIHRoZW4gY2hlY2sgV1BBIG1hdGNoICovCisJCQlpZiAoIW1hdGNoKQorCQkJCW1hdGNoID0gY3NyX2lzX3dwYV9lbmNyeXB0aW9uX21hdGNoKAorCQkJCQkJbWFjX2N0eCwgYXV0aF90eXBlLAorCQkJCQkJdWNfY2lwaGVyLCBtY19lbmNfdHlwZSwKKwkJCQkJCWllc19wdHIsCisJCQkJCQkmbG9jYWxfbmVnX2F1dGhfdHlwZSwKKwkJCQkJCSZtY19jaXBoZXIpOworCQkJYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwkJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk6ICAgICAvKiBXQVBJICovCisJCQlpZiAoaWVzX3B0cikKKwkJCQltYXRjaCA9IGNzcl9pc193YXBpX21hdGNoKGhhbCwgYXV0aF90eXBlLAorCQkJCQkJdWNfY2lwaGVyLCBtY19lbmNfdHlwZSwgaWVzX3B0ciwKKwkJCQkJCSZsb2NhbF9uZWdfYXV0aF90eXBlLAorCQkJCQkJJm1jX2NpcGhlcik7CisJCQllbHNlCisJCQkJbWF0Y2ggPSBmYWxzZTsKKwkJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisJCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQU5ZOgorCQlkZWZhdWx0OgorCQkJbWF0Y2ggID0gY3NyX3ZhbGlkYXRlX2FueV9kZWZhdWx0KGhhbCwgYXV0aF90eXBlLAorCQkJCQltY19lbmNfdHlwZSwgbWZwX2VuYWJsZWQsIG1mcF9yZXF1aXJlZCwKKwkJCQkJbWZwX2NhcGFibGUsIGllc19wdHIsCisJCQkJCSZsb2NhbF9uZWdfYXV0aF90eXBlLCBic3NfZGVzYywKKwkJCQkJJnVjX2NpcGhlciwgJm1jX2NpcGhlcik7CisJCQlicmVhazsKKwkJfQorCisJfQorCisJaWYgKG1hdGNoKSB7CisJCWlmIChuZWdfdWNfY2lwaGVyKQorCQkJKm5lZ191Y19jaXBoZXIgPSB1Y19jaXBoZXI7CisJCWlmIChuZWdfbWNfY2lwaGVyKQorCQkJKm5lZ19tY19jaXBoZXIgPSBtY19jaXBoZXI7CisJCWlmIChuZWdfYXV0aF90eXBlKQorCQkJKm5lZ19hdXRoX3R5cGUgPSBsb2NhbF9uZWdfYXV0aF90eXBlOworCX0KKwlyZXR1cm4gbWF0Y2g7Cit9CisKK2Jvb2wgY3NyX2lzX3NzaWRfbWF0Y2godHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCAqc3NpZDEsIHVpbnQ4X3Qgc3NpZDFMZW4sCisJCSAgICAgICB1aW50OF90ICpic3NTc2lkLCB1aW50OF90IGJzc1NzaWRMZW4sIGJvb2wgZlNzaWRSZXF1aXJlZCkKK3sKKwlib29sIGZNYXRjaCA9IGZhbHNlOworCisJZG8geworCQkvKgorCQkgKiBDaGVjayBmb3IgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIEJyb2FkY2FzdCBTU0lEIGF0IHRoZQorCQkgKiBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuIElmIHNwZWNpZmllZCwgdGhlbiBhbGwgU1NJRHMgYXJlCisJCSAqIG1hdGNoZXMgKGJyb2FkY2FzdCBTU0lEIG1lYW5zIGFjY2VwdCBhbGwgU1NJRHMpLgorCQkgKi8KKwkJaWYgKHNzaWQxTGVuID09IDApIHsKKwkJCWZNYXRjaCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFRoZXJlIGFyZSBhIGZldyBzcGVjaWFsIGNhc2VzLiAgSWYgdGhlIEJzcyBkZXNjcmlwdGlvbiBoYXMgYSBCcm9hZGNhc3QgU1NJRCwgKi8KKwkJLyogdGhlbiBvdXIgUHJvZmlsZSBtdXN0IGhhdmUgYSBzaW5nbGUgU1NJRCB3aXRob3V0IFdpbGRjYXJkcyBzbyB3ZSBjYW4gcHJvZ3JhbSAqLworCQkvKiB0aGUgU1NJRC4gKi8KKwkJLyogU1NJRCBjb3VsZCBiZSBzdXBwcmVzc2VkIGluIGJlYWNvbnMuIEluIHRoYXQgY2FzZSBTU0lEIElFIGhhcyB2YWxpZCBsZW5ndGggKi8KKwkJLyogYnV0IHRoZSBTU0lEIHZhbHVlIGlzIGFsbCBOVUxMIGNoYXJhY3RlcnMuIFRoYXQgY29uZGl0aW9uIGlzIHRyYXRlZCBzYW1lICovCisJCS8qIGFzIE5VTEwgU1NJRCAqLworCQlpZiAoY3NyX2lzX251bGxzc2lkKGJzc1NzaWQsIGJzc1NzaWRMZW4pKSB7CisJCQlpZiAoZmFsc2UgPT0gZlNzaWRSZXF1aXJlZCkgeworCQkJCWZNYXRjaCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc3NpZDFMZW4gIT0gYnNzU3NpZExlbikKKwkJCWJyZWFrOworCQlpZiAoY2RmX21lbV9jb21wYXJlKGJzc1NzaWQsIHNzaWQxLCBic3NTc2lkTGVuKSkgeworCQkJZk1hdGNoID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBmTWF0Y2g7Cit9CisKKy8qIE51bGwgc3NpZCBtZWFucyBtYXRjaCAqLworYm9vbCBjc3JfaXNfc3NpZF9pbl9saXN0KHRIYWxIYW5kbGUgaEhhbCwgdFNpck1hY1NTaWQgKnBTc2lkLAorCQkJIHRDc3JTU0lEcyAqcFNzaWRMaXN0KQoreworCWJvb2wgZk1hdGNoID0gZmFsc2U7CisJdWludDMyX3QgaTsKKworCWlmIChwU3NpZExpc3QgJiYgcFNzaWQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBTc2lkTGlzdC0+bnVtT2ZTU0lEczsgaSsrKSB7CisJCQlpZiAoY3NyX2lzX251bGxzc2lkCisJCQkJICAgIChwU3NpZExpc3QtPlNTSURMaXN0W2ldLlNTSUQuc3NJZCwKKwkJCQkgICAgcFNzaWRMaXN0LT5TU0lETGlzdFtpXS5TU0lELmxlbmd0aCkKKwkJCSAgICB8fAorCQkJICAgICgocFNzaWRMaXN0LT5TU0lETGlzdFtpXS5TU0lELmxlbmd0aCA9PQorCQkJICAgICAgcFNzaWQtPmxlbmd0aCkKKwkJCSAgICAgJiYgY2RmX21lbV9jb21wYXJlKHBTc2lkLT5zc0lkLAorCQkJCQkJcFNzaWRMaXN0LT5TU0lETGlzdFtpXS5TU0lELgorCQkJCQkJc3NJZCwgcFNzaWQtPmxlbmd0aCkpKSB7CisJCQkJZk1hdGNoID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBmTWF0Y2g7Cit9CisKK2Jvb2wgY3NyX2lzX2Jzc2lkX21hdGNoKHRIYWxIYW5kbGUgaEhhbCwgc3RydWN0IGNkZl9tYWNfYWRkciAqcFByb2ZCc3NpZCwKKwkJCXN0cnVjdCBjZGZfbWFjX2FkZHIgKkJzc0Jzc2lkKQoreworCWJvb2wgZk1hdGNoID0gZmFsc2U7CisJc3RydWN0IGNkZl9tYWNfYWRkciBQcm9maWxlQnNzaWQ7CisKKwkvKiBmb3IgZWZmaWNpZW5jeSBvZiB0aGUgTUFDX0FERFJFU1MgZnVuY3Rpb25zLCBtb3ZlIHRoZSAqLworCS8qIEJzc2lkJ3MgaW50byBNQUNfQUREUkVTUyBzdHJ1Y3RzLiAqLworCWNkZl9tZW1fY29weSgmUHJvZmlsZUJzc2lkLCBwUHJvZkJzc2lkLCBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCisJZG8geworCisJCS8qIEdpdmUgdGhlIHByb2ZpbGUgdGhlIGJlbmVmaXQgb2YgdGhlIGRvdWJ0Li4uIGFjY2VwdCBlaXRoZXIgYWxsIDAgb3IgKi8KKwkJLyogdGhlIHJlYWwgYnJvYWRjYXN0IEJzc2lkIChhbGwgMHhmZikgYXMgYnJvYWRjYXN0IEJzc2lkcyAobWVhbmluZyB0byAqLworCQkvKiBtYXRjaCBhbnkgQnNzaWRzKS4gKi8KKwkJaWYgKGNkZl9pc19tYWNhZGRyX3plcm8oJlByb2ZpbGVCc3NpZCkgfHwKKwkJICAgIGNkZl9pc19tYWNhZGRyX2Jyb2FkY2FzdCgmUHJvZmlsZUJzc2lkKSkgeworCQkJZk1hdGNoID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNkZl9pc19tYWNhZGRyX2VxdWFsKEJzc0Jzc2lkLCAmUHJvZmlsZUJzc2lkKSkgeworCQkJZk1hdGNoID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBmTWF0Y2g7Cit9CisKK2Jvb2wgY3NyX2lzX2Jzc190eXBlX21hdGNoKGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlMSwgZUNzclJvYW1Cc3NUeXBlIGJzc1R5cGUyKQoreworCWlmICgoZUNTUl9CU1NfVFlQRV9BTlkgIT0gYnNzVHlwZTEgJiYgZUNTUl9CU1NfVFlQRV9BTlkgIT0gYnNzVHlwZTIpCisJICAgICYmIChic3NUeXBlMSAhPSBic3NUeXBlMikpCisJCXJldHVybiBmYWxzZTsKKwllbHNlCisJCXJldHVybiB0cnVlOworfQorCitib29sIGNzcl9pc19ic3NfdHlwZV9pYnNzKGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlKQoreworCXJldHVybiAoYm9vbCkKKwkJKGVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUyA9PSBic3NUeXBlCisJCSB8fCBlQ1NSX0JTU19UWVBFX0lCU1MgPT0gYnNzVHlwZSk7Cit9CisKK2Jvb2wgY3NyX2lzX2Jzc190eXBlX3dkcyhlQ3NyUm9hbUJzc1R5cGUgYnNzVHlwZSkKK3sKKwlyZXR1cm4gKGJvb2wpCisJCShlQ1NSX0JTU19UWVBFX1dEU19TVEEgPT0gYnNzVHlwZQorCQkgfHwgZUNTUl9CU1NfVFlQRV9XRFNfQVAgPT0gYnNzVHlwZSk7Cit9CisKK2Jvb2wgY3NyX2lzX2Jzc190eXBlX2NhcHNfbWF0Y2goZUNzclJvYW1Cc3NUeXBlIGJzc1R5cGUsCisJCQkJdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYykKK3sKKwlib29sIGZNYXRjaCA9IHRydWU7CisKKwlkbyB7CisJCXN3aXRjaCAoYnNzVHlwZSkgeworCQljYXNlIGVDU1JfQlNTX1RZUEVfQU5ZOgorCQkJYnJlYWs7CisKKwkJY2FzZSBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFOgorCQljYXNlIGVDU1JfQlNTX1RZUEVfV0RTX1NUQToKKwkJCWlmICghY3NyX2lzX2luZnJhX2Jzc19kZXNjKHBTaXJCc3NEZXNjKSkKKwkJCQlmTWF0Y2ggPSBmYWxzZTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBlQ1NSX0JTU19UWVBFX0lCU1M6CisJCWNhc2UgZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTOgorCQkJaWYgKCFjc3JfaXNfaWJzc19ic3NfZGVzYyhwU2lyQnNzRGVzYykpCisJCQkJZk1hdGNoID0gZmFsc2U7CisKKwkJCWJyZWFrOworCisJCWNhc2UgZUNTUl9CU1NfVFlQRV9XRFNfQVA6ICAgICAgLyogRm9yIFdEUyBBUCwgbm8gbmVlZCB0byBtYXRjaCBhbnl0aGluZyAqLworCQlkZWZhdWx0OgorCQkJZk1hdGNoID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDApOworCisJcmV0dXJuIGZNYXRjaDsKK30KKworc3RhdGljIGJvb2wgY3NyX2lzX2NhcGFiaWxpdGllc19tYXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLCBlQ3NyUm9hbUJzc1R5cGUgYnNzVHlwZSwKKwkJCQkgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjKQoreworCXJldHVybiBjc3JfaXNfYnNzX3R5cGVfY2Fwc19tYXRjaChic3NUeXBlLCBwU2lyQnNzRGVzYyk7Cit9CisKK3N0YXRpYyBib29sIGNzcl9pc19zcGVjaWZpY19jaGFubmVsX21hdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJCQkJICB1aW50OF90IENoYW5uZWwpCit7CisJYm9vbCBmTWF0Y2ggPSB0cnVlOworCisJZG8geworCQkvKiBpZiB0aGUgY2hhbm5lbCBpcyBBTlksIHRoZW4gYWx3YXlzIG1hdGNoLi4uICovCisJCWlmIChlQ1NSX09QRVJBVElOR19DSEFOTkVMX0FOWSA9PSBDaGFubmVsKQorCQkJYnJlYWs7CisJCWlmIChDaGFubmVsID09IHBTaXJCc3NEZXNjLT5jaGFubmVsSWQpCisJCQlicmVhazsKKworCQkvKiBkaWRuJ3QgbWF0Y2ggYW55dGhpbmcuLiBzbyByZXR1cm4gTk8gbWF0Y2ggKi8KKwkJZk1hdGNoID0gZmFsc2U7CisKKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBmTWF0Y2g7Cit9CisKK2Jvb2wgY3NyX2lzX2NoYW5uZWxfYmFuZF9tYXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNoYW5uZWxJZCwKKwkJCSAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjKQoreworCWJvb2wgZk1hdGNoID0gdHJ1ZTsKKworCWRvIHsKKwkJLyogaWYgdGhlIHByb2ZpbGUgc2F5cyBBbnkgY2hhbm5lbCBBTkQgdGhlIGdsb2JhbCBzZXR0aW5ncyBzYXlzIEFOWSBjaGFubmVsLCB0aGVuIHdlICovCisJCS8qIGFsd2F5cyBtYXRjaC4uLiAqLworCQlpZiAoZUNTUl9PUEVSQVRJTkdfQ0hBTk5FTF9BTlkgPT0gY2hhbm5lbElkKQorCQkJYnJlYWs7CisKKwkJaWYgKGVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQU5ZICE9IGNoYW5uZWxJZCkgeworCQkJZk1hdGNoID0KKwkJCQljc3JfaXNfc3BlY2lmaWNfY2hhbm5lbF9tYXRjaChwTWFjLCBwU2lyQnNzRGVzYywKKwkJCQkJCQkgICAgICBjaGFubmVsSWQpOworCQl9CisKKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBmTWF0Y2g7Cit9CisKKy8qKgorICogY3NyX2lzX2FnZ3JlZ2F0ZV9yYXRlX3N1cHBvcnRlZCgpIC0gdG8gY2hlY2sgaWYgYWdncmVnYXRlIHJhdGUgaXMgc3VwcG9ydGVkCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBtYWMgY29udGV4dAorICogQHJhdGU6IEEgcmF0ZSBpbiB1bml0cyBvZiA1MDBrYnBzCisgKgorICoKKyAqIFRoZSByYXRlIGVuY29kaW5nICBpcyBqdXN0IGFzIGluIDgwMi4xMSAgSW5mb3JtYXRpb24gRWxlbWVudHMsIGV4Y2VwdAorICogdGhhdCB0aGUgaGlnaCBiaXQgaXMgXGVtICBub3QgaW50ZXJwcmV0ZWQgYXMgaW5kaWNhdGluZyBhIEJhc2ljIFJhdGUsCisgKiBhbmQgcHJvcHJpZXRhcnkgcmF0ZXMgYXJlIGFsbG93ZWQsIHRvby4KKyAqCisgKiBOb3RlICB0aGF0IGlmIHRoZSAgYWRhcHRlcidzIGRvdDExTW9kZSAgaXMgZywgIHdlIGRvbid0ICByZXN0cmljdCB0aGUKKyAqIHJhdGVzLiAgQWNjb3JkaW5nIHRvIGh3UmVhZEVlcHJvbVBhcmFtZXRlcnMsIHRoaXMgd2lsbCBoYXBwZW4gd2hlbjoKKyAqIC4uLiB0aGUgIGNhcmQgaXMgIGNvbmZpZ3VyZWQgZm9yIEFMTCAgYmFuZHMgdGhyb3VnaCAgdGhlIHByb3BlcnR5CisgKiBwYWdlLiAgSWYgdGhpcyBvY2N1cnMsIGFuZCB0aGUgY2FyZCBpcyBub3QgYW4gQUJHIGNhcmQgLHRoZW4gdGhpcworICogY29kZSAgaXMgIHNldHRpbmcgdGhlICBkb3QxMU1vZGUgIHRvICBhc3N1bWUgIHRoZSBtb2RlICB0aGF0ICB0aGUKKyAqIGhhcmR3YXJlIGNhbiBzdXBwb3J0LiAgIEZvciBleGFtcGxlLCBpZiB0aGUgY2FyZCAgaXMgYW4gMTFCRyBjYXJkCisgKiBhbmQgd2UgIGFyZSBjb25maWd1cmVkIHRvIHN1cHBvcnQgIEFMTCBiYW5kcywgdGhlbiAgd2UgY2hhbmdlIHRoZQorICogZG90MTFNb2RlICB0byAxMWcgIGJlY2F1c2UgIEFMTCBpbiAgdGhpcyAgY2FzZSBpcyAgb25seSB3aGF0ICB0aGUKKyAqIGhhcmR3YXJlIGNhbiBzdXBwb3J0LgorICoKKyAqIFJldHVybjogdHJ1ZSBpZiAgdGhlIGFkYXB0ZXIgaXMgY3VycmVudGx5IGNhcGFibGUgb2Ygc3VwcG9ydGluZyB0aGlzIHJhdGUKKyAqLworCitzdGF0aWMgYm9vbCBjc3JfaXNfYWdncmVnYXRlX3JhdGVfc3VwcG9ydGVkKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQl1aW50MTZfdCByYXRlKQoreworCWJvb2wgc3VwcG9ydGVkID0gZmFsc2U7CisJdWludDE2X3QgaWR4LCBuZXdfcmF0ZTsKKworCS8qIEluIGNhc2UgYmFzaWMgcmF0ZSBmbGFnIGlzIHNldCAqLworCW5ld19yYXRlID0gQklUU19PRkYocmF0ZSwgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSyk7CisJaWYgKGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBID09CisJCQltYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLnVDZmdEb3QxMU1vZGUpIHsKKwkJc3dpdGNoIChuZXdfcmF0ZSkgeworCQljYXNlIGVDc3JTdXBwUmF0ZV82TWJwczoKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfOU1icHM6CisJCWNhc2UgZUNzclN1cHBSYXRlXzEyTWJwczoKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfMThNYnBzOgorCQljYXNlIGVDc3JTdXBwUmF0ZV8yNE1icHM6CisJCWNhc2UgZUNzclN1cHBSYXRlXzM2TWJwczoKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfNDhNYnBzOgorCQljYXNlIGVDc3JTdXBwUmF0ZV81NE1icHM6CisJCQlzdXBwb3J0ZWQgPSB0cnVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdXBwb3J0ZWQgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisKKwl9IGVsc2UgaWYgKGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCID09CisJCSAgIG1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSkgeworCQlzd2l0Y2ggKG5ld19yYXRlKSB7CisJCWNhc2UgZUNzclN1cHBSYXRlXzFNYnBzOgorCQljYXNlIGVDc3JTdXBwUmF0ZV8yTWJwczoKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfNV81TWJwczoKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfMTFNYnBzOgorCQkJc3VwcG9ydGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3VwcG9ydGVkID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoIW1hY19jdHgtPnJvYW0uY29uZmlnUGFyYW0uUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQpIHsKKworCQlzd2l0Y2ggKG5ld19yYXRlKSB7CisJCWNhc2UgZUNzclN1cHBSYXRlXzFNYnBzOgorCQljYXNlIGVDc3JTdXBwUmF0ZV8yTWJwczoKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfNV81TWJwczoKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfNk1icHM6CisJCWNhc2UgZUNzclN1cHBSYXRlXzlNYnBzOgorCQljYXNlIGVDc3JTdXBwUmF0ZV8xMU1icHM6CisJCWNhc2UgZUNzclN1cHBSYXRlXzEyTWJwczoKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfMThNYnBzOgorCQljYXNlIGVDc3JTdXBwUmF0ZV8yNE1icHM6CisJCWNhc2UgZUNzclN1cHBSYXRlXzM2TWJwczoKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfNDhNYnBzOgorCQljYXNlIGVDc3JTdXBwUmF0ZV81NE1icHM6CisJCQlzdXBwb3J0ZWQgPSB0cnVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdXBwb3J0ZWQgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChlQ3NyU3VwcFJhdGVfMU1icHMgPT0gbmV3X3JhdGUgfHwKKwkJCWVDc3JTdXBwUmF0ZV8yTWJwcyA9PSBuZXdfcmF0ZSB8fAorCQkJZUNzclN1cHBSYXRlXzVfNU1icHMgPT0gbmV3X3JhdGUgfHwKKwkJCWVDc3JTdXBwUmF0ZV8xMU1icHMgPT0gbmV3X3JhdGUpIHsKKwkJCXN1cHBvcnRlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJaWR4ID0gMHgxOworCisJCXN3aXRjaCAobmV3X3JhdGUpIHsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfNk1icHM6CisJCQlzdXBwb3J0ZWQgPSBnX3BoeV9yYXRlc19zdXBwdFswXVtpZHhdOworCQkJYnJlYWs7CisJCWNhc2UgZUNzclN1cHBSYXRlXzlNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbMV1baWR4XTsKKwkJCWJyZWFrOworCQljYXNlIGVDc3JTdXBwUmF0ZV8xMk1icHM6CisJCQlzdXBwb3J0ZWQgPSBnX3BoeV9yYXRlc19zdXBwdFsyXVtpZHhdOworCQkJYnJlYWs7CisJCWNhc2UgZUNzclN1cHBSYXRlXzE4TWJwczoKKwkJCXN1cHBvcnRlZCA9IGdfcGh5X3JhdGVzX3N1cHB0WzNdW2lkeF07CisJCQlicmVhazsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfMjBNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbNF1baWR4XTsKKwkJCWJyZWFrOworCQljYXNlIGVDc3JTdXBwUmF0ZV8yNE1icHM6CisJCQlzdXBwb3J0ZWQgPSBnX3BoeV9yYXRlc19zdXBwdFs1XVtpZHhdOworCQkJYnJlYWs7CisJCWNhc2UgZUNzclN1cHBSYXRlXzM2TWJwczoKKwkJCXN1cHBvcnRlZCA9IGdfcGh5X3JhdGVzX3N1cHB0WzZdW2lkeF07CisJCQlicmVhazsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfNDBNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbN11baWR4XTsKKwkJCWJyZWFrOworCQljYXNlIGVDc3JTdXBwUmF0ZV80Mk1icHM6CisJCQlzdXBwb3J0ZWQgPSBnX3BoeV9yYXRlc19zdXBwdFs4XVtpZHhdOworCQkJYnJlYWs7CisJCWNhc2UgZUNzclN1cHBSYXRlXzQ4TWJwczoKKwkJCXN1cHBvcnRlZCA9IGdfcGh5X3JhdGVzX3N1cHB0WzldW2lkeF07CisJCQlicmVhazsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfNTRNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbMTBdW2lkeF07CisJCQlicmVhazsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfNzJNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbMTFdW2lkeF07CisJCQlicmVhazsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfODBNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbMTJdW2lkeF07CisJCQlicmVhazsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfODRNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbMTNdW2lkeF07CisJCQlicmVhazsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfOTZNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbMTRdW2lkeF07CisJCQlicmVhazsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfMTA4TWJwczoKKwkJCXN1cHBvcnRlZCA9IGdfcGh5X3JhdGVzX3N1cHB0WzE1XVtpZHhdOworCQkJYnJlYWs7CisJCWNhc2UgZUNzclN1cHBSYXRlXzEyME1icHM6CisJCQlzdXBwb3J0ZWQgPSBnX3BoeV9yYXRlc19zdXBwdFsxNl1baWR4XTsKKwkJCWJyZWFrOworCQljYXNlIGVDc3JTdXBwUmF0ZV8xMjZNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbMTddW2lkeF07CisJCQlicmVhazsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfMTQ0TWJwczoKKwkJCXN1cHBvcnRlZCA9IGdfcGh5X3JhdGVzX3N1cHB0WzE4XVtpZHhdOworCQkJYnJlYWs7CisJCWNhc2UgZUNzclN1cHBSYXRlXzE2ME1icHM6CisJCQlzdXBwb3J0ZWQgPSBnX3BoeV9yYXRlc19zdXBwdFsxOV1baWR4XTsKKwkJCWJyZWFrOworCQljYXNlIGVDc3JTdXBwUmF0ZV8xNjhNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbMjBdW2lkeF07CisJCQlicmVhazsKKwkJY2FzZSBlQ3NyU3VwcFJhdGVfMTkyTWJwczoKKwkJCXN1cHBvcnRlZCA9IGdfcGh5X3JhdGVzX3N1cHB0WzIxXVtpZHhdOworCQkJYnJlYWs7CisJCWNhc2UgZUNzclN1cHBSYXRlXzIxNk1icHM6CisJCQlzdXBwb3J0ZWQgPSBnX3BoeV9yYXRlc19zdXBwdFsyMl1baWR4XTsKKwkJCWJyZWFrOworCQljYXNlIGVDc3JTdXBwUmF0ZV8yNDBNYnBzOgorCQkJc3VwcG9ydGVkID0gZ19waHlfcmF0ZXNfc3VwcHRbMjNdW2lkeF07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN1cHBvcnRlZCA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHN1cHBvcnRlZDsKK30KKworLyoqCisgKiBjc3JfaXNfcmF0ZV9zZXRfbWF0Y2goKSAtIHRvIGNoZWNrIGlmIHJhdGUgc2V0IGlzIG1hdGNoaW5nCisgKiBAbWFjX2N0eDogcG9pbnRlciB0byBtYWMgY29udGV4dAorICogQGJzc19zdXBwb3J0ZWRfcmF0ZXM6IHN1cHBvcnRlZCByYXRlcyBvZiBCU1MKKyAqIEBic3NfZXh0X3N1cHBfcmF0ZXM6IGV4dGVuZGVkIHJhdGVzIG9mIGJzcworICoKKyAqIFRoaXMgcm91dGluZSBpcyB0byBjaGVja2UgaWYgcmF0ZSBzZXQgaXMgbWF0Y2hlZCBvciBubworICoKKyAqIFJldHVybjogYm9vbAorICovCitzdGF0aWMgYm9vbCBjc3JfaXNfcmF0ZV9zZXRfbWF0Y2godHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkgIHREb3QxMWZJRVN1cHBSYXRlcyAqYnNzX3N1cHBvcnRlZF9yYXRlcywKKwkJCQkgIHREb3QxMWZJRUV4dFN1cHBSYXRlcyAqYnNzX2V4dF9zdXBwX3JhdGVzKQoreworCWJvb2wgbWF0Y2ggPSB0cnVlOworCXVpbnQzMl90IGk7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoYXQgYWxsIG9mIHRoZSBCYXNpYyByYXRlcyBhZHZlcnRpc2VkIGluIHRoZSBCc3MKKwkgKiBkZXNjcmlwdGlvbiBhcmUgc3VwcG9ydGVkCisJICovCisJaWYgKGJzc19zdXBwb3J0ZWRfcmF0ZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJzc19zdXBwb3J0ZWRfcmF0ZXMtPm51bV9yYXRlczsgaSsrKSB7CisJCQlpZiAoIUNTUl9JU19CQVNJQ19SQVRFKGJzc19zdXBwb3J0ZWRfcmF0ZXMtPnJhdGVzW2ldKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghY3NyX2lzX2FnZ3JlZ2F0ZV9yYXRlX3N1cHBvcnRlZChtYWNfY3R4LAorCQkJCQlic3Nfc3VwcG9ydGVkX3JhdGVzLT5yYXRlc1tpXSkpIHsKKwkJCQltYXRjaCA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChtYXRjaCAmJiBic3NfZXh0X3N1cHBfcmF0ZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJzc19leHRfc3VwcF9yYXRlcy0+bnVtX3JhdGVzOyBpKyspIHsKKwkJCWlmICghQ1NSX0lTX0JBU0lDX1JBVEUoYnNzX2V4dF9zdXBwX3JhdGVzLT5yYXRlc1tpXSkpCisJCQkJY29udGludWU7CisJCQlpZiAoIWNzcl9pc19hZ2dyZWdhdGVfcmF0ZV9zdXBwb3J0ZWQobWFjX2N0eCwKKwkJCQkJYnNzX2V4dF9zdXBwX3JhdGVzLT5yYXRlc1tpXSkpIHsKKwkJCQltYXRjaCA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBtYXRjaDsKK30KKworLyoqCisgKiBjc3JfbWF0Y2hfYnNzKCkgLSB0byBjb21wYXJlIHRoZSBic3MKKyAqIEBoYWw6IHBvaW50ZXIgdG8gaGFsIGNvbnRleHQKKyAqIEBic3NfZGVzY3I6IHBvaW50ZXIgYnNzIGRlc2NyaXB0aW9uCisgKiBAZmlsdGVyOiBzY2FuIGZpbHRlcgorICogQG5lZ19hdXRoOiBuZWdvdGlhdGVkIGF1dGgKKyAqIEBuZWdfdWM6IG5lZ290aWF0ZWQgZm9yIHVuaWNhc3QKKyAqIEBuZWdfbWM6IG5lZ290aWF0ZWQgZm9yIG11bHRpY2FzdAorICogQGllX2RibHB0cjogZG91YmxlIHBvaW50ZXIgdG8gSUUKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgdG8gbWF0Y2ggdGhlIGJzcworICogSWYgY2FsbGVyIHdhbnQgdG8gZ2V0IHRoZSAqaWVfZGJscHRyIGFsbG9jYXRlZCBieSB0aGlzIGZ1bmN0aW9uLAorICogcGFzcyBpbiAqaWVfZGJscHRyID0gTlVMTAorICoKKyAqIFJldHVybjogYm9vbAorICovCitib29sIGNzcl9tYXRjaF9ic3ModEhhbEhhbmRsZSBoYWwsIHRTaXJCc3NEZXNjcmlwdGlvbiAqYnNzX2Rlc2NyLAorCQkgICB0Q3NyU2NhblJlc3VsdEZpbHRlciAqZmlsdGVyLCBlQ3NyQXV0aFR5cGUgKm5lZ19hdXRoLAorCQkgICBlQ3NyRW5jcnlwdGlvblR5cGUgKm5lZ191YywgZUNzckVuY3J5cHRpb25UeXBlICpuZWdfbWMsCisJCSAgIHREb3QxMWZCZWFjb25JRXMgKippZV9kYmxwdHIpCit7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9IFBNQUNfU1RSVUNUKGhhbCk7CisJYm9vbCByYyA9IGZhbHNlLCBjaGVjaywgYmxhY2tsaXN0X2NoZWNrOworCXVpbnQzMl90IGk7CisJdERvdDExZkJlYWNvbklFcyAqaWVfcHRyID0gTlVMTDsKKwl1aW50OF90ICpwYjsKKwlzdHJ1Y3Qgcm9hbV9leHRfcGFyYW1zICpyb2FtX3BhcmFtczsKKwl1aW50OF90ICpwMnBfbWFjYWRkciA9IE5VTEw7CisKKwlyb2FtX3BhcmFtcyA9ICZtYWNfY3R4LT5yb2FtLmNvbmZpZ1BhcmFtLnJvYW1fcGFyYW1zOworCWlmICgoTlVMTCA9PSBpZV9kYmxwdHIpIHx8ICgqaWVfZGJscHRyKSA9PSBOVUxMKSB7CisJCS8qIElmIG5vIElFcyBwYXNzZWQgaW4sIGdldCBvdXIgb3duLiAqLworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUygKKwkJCWNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMobWFjX2N0eCwKKwkJCQlic3NfZGVzY3IsICZpZV9wdHIpKSkgeworCQkJZ290byBlbmQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBTYXZlIHRoZSBvbmUgcGFzcyBpbiBmb3IgbG9jYWwgdXNlICovCisJCWllX3B0ciA9ICppZV9kYmxwdHI7CisJfQorCisJLyogQ2hlY2sgaWYgY2FsbGVyIHdhbnRzIFAyUCAqLworCWNoZWNrID0gKCFmaWx0ZXItPnAycFJlc3VsdCB8fCBpZV9wdHItPlAyUEJlYWNvblByb2JlUmVzLnByZXNlbnQpOworCWlmICghY2hlY2spCisJCWdvdG8gZW5kOworCisJLyogQ2hlY2sgZm9yIEJsYWNrbGlzdCBCU1NJRCdzIGFuZCBhdm9pZCBjb25uZWN0aW9ucyAqLworCWJsYWNrbGlzdF9jaGVjayA9IGZhbHNlOworCWZvciAoaSA9IDA7IGkgPCByb2FtX3BhcmFtcy0+bnVtX2Jzc2lkX2F2b2lkX2xpc3Q7IGkrKykgeworCQlpZiAoY2RmX2lzX21hY2FkZHJfZXF1YWwoKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikKKwkJCQkJJnJvYW1fcGFyYW1zLT5ic3NpZF9hdm9pZF9saXN0W2ldLAorCQkJCShzdHJ1Y3QgY2RmX21hY19hZGRyICopYnNzX2Rlc2NyLT5ic3NJZCkpIHsKKwkJCWJsYWNrbGlzdF9jaGVjayA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoYmxhY2tsaXN0X2NoZWNrKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCUZMKCJEb24ndCBBdHRlbXB0IGNvbm5lY3QgdG8gYmxhY2tsaXN0IGJzc2lkIikpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoaWVfcHRyLT5TU0lELnByZXNlbnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGZpbHRlci0+U1NJRHMubnVtT2ZTU0lEczsgaSsrKSB7CisJCQljaGVjayA9IGNzcl9pc19zc2lkX21hdGNoKG1hY19jdHgsCisJCQkJCWZpbHRlci0+U1NJRHMuU1NJRExpc3RbaV0uU1NJRC5zc0lkLAorCQkJCQlmaWx0ZXItPlNTSURzLlNTSURMaXN0W2ldLlNTSUQubGVuZ3RoLAorCQkJCQlpZV9wdHItPlNTSUQuc3NpZCwKKwkJCQkJaWVfcHRyLT5TU0lELm51bV9zc2lkLCB0cnVlKTsKKwkJCWlmIChjaGVjaykKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIWNoZWNrKQorCQkJZ290byBlbmQ7CisJfQorCWNoZWNrID0gdHJ1ZTsKKwlwMnBfbWFjYWRkciA9IGllX3B0ci0+UDJQQmVhY29uUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5QMlBEZXZpY2VBZGRyZXNzOworCWZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPkJTU0lEcy5udW1PZkJTU0lEczsgaSsrKSB7CisJCWNoZWNrID0gY3NyX2lzX2Jzc2lkX21hdGNoKG1hY19jdHgsCisJCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikmZmlsdGVyLT5CU1NJRHMuYnNzaWRbaV0sCisJCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKilic3NfZGVzY3ItPmJzc0lkKTsKKwkJaWYgKGNoZWNrKQorCQkJYnJlYWs7CisKKwkJaWYgKGZpbHRlci0+cDJwUmVzdWx0ICYmIGllX3B0ci0+UDJQQmVhY29uUHJvYmVSZXMucHJlc2VudCkgeworCQkJY2hlY2sgPSBjc3JfaXNfYnNzaWRfbWF0Y2gobWFjX2N0eCwKKwkJCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikKKwkJCQkJCSZmaWx0ZXItPkJTU0lEcy5ic3NpZFtpXSwKKwkJCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKilwMnBfbWFjYWRkcik7CisJCQlpZiAoY2hlY2spCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFjaGVjaykKKwkJZ290byBlbmQ7CisKKwljaGVjayA9IHRydWU7CisJZm9yIChpID0gMDsgaSA8IGZpbHRlci0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsgaSsrKSB7CisJCWNoZWNrID0gY3NyX2lzX2NoYW5uZWxfYmFuZF9tYXRjaChtYWNfY3R4LAorCQkJCWZpbHRlci0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaV0sIGJzc19kZXNjcik7CisJCWlmIChjaGVjaykKKwkJCWJyZWFrOworCX0KKwlpZiAoIWNoZWNrKQorCQlnb3RvIGVuZDsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwkvKiBJZiB0aGlzIGlzIGZvciBtZWFzdXJlbWVudCBmaWx0ZXJpbmcgKi8KKwlpZiAoZmlsdGVyLT5mTWVhc3VyZW1lbnQpIHsKKwkJcmMgPSB0cnVlOworCQlnb3RvIGVuZDsKKwl9CisjZW5kaWYKKwlpZiAoIWNzcl9pc19waHlfbW9kZV9tYXRjaChtYWNfY3R4LCBmaWx0ZXItPnBoeU1vZGUsIGJzc19kZXNjciwKKwkJCU5VTEwsIE5VTEwsIGllX3B0cikpCisJCWdvdG8gZW5kOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWlmICgoIWZpbHRlci0+YldQU0Fzc29jaWF0aW9uKSAmJiAoIWZpbHRlci0+Yk9TRU5Bc3NvY2lhdGlvbikgJiYKKwkJCSFjc3JfaXNfc2VjdXJpdHlfbWF0Y2gobWFjX2N0eCwgJmZpbHRlci0+YXV0aFR5cGUsCisJCQkJJmZpbHRlci0+RW5jcnlwdGlvblR5cGUsCisJCQkJJmZpbHRlci0+bWNFbmNyeXB0aW9uVHlwZSwKKwkJCQkmZmlsdGVyLT5NRlBFbmFibGVkLAorCQkJCSZmaWx0ZXItPk1GUFJlcXVpcmVkLAorCQkJCSZmaWx0ZXItPk1GUENhcGFibGUsCisJCQkJYnNzX2Rlc2NyLCBpZV9wdHIsIG5lZ19hdXRoLAorCQkJCW5lZ191YywgbmVnX21jKSkKKyNlbHNlCisJaWYgKCghZmlsdGVyLT5iV1BTQXNzb2NpYXRpb24pICYmICghZmlsdGVyLT5iT1NFTkFzc29jaWF0aW9uKSAmJgorCQkJIWNzcl9pc19zZWN1cml0eV9tYXRjaChtYWNfY3R4LCAmZmlsdGVyLT5hdXRoVHlwZSwKKwkJCQkmZmlsdGVyLT5FbmNyeXB0aW9uVHlwZSwKKwkJCQkmZmlsdGVyLT5tY0VuY3J5cHRpb25UeXBlLAorCQkJCU5VTEwsIE5VTEwsIE5VTEwsCisJCQkJYnNzX2Rlc2NyLCBpZV9wdHIsIG5lZ19hdXRoLAorCQkJCW5lZ191YywgbmVnX21jKSkKKyNlbmRpZgorCQlnb3RvIGVuZDsKKwlpZiAoIWNzcl9pc19jYXBhYmlsaXRpZXNfbWF0Y2gobWFjX2N0eCwgZmlsdGVyLT5CU1NUeXBlLCBic3NfZGVzY3IpKQorCQlnb3RvIGVuZDsKKwlpZiAoIWNzcl9pc19yYXRlX3NldF9tYXRjaChtYWNfY3R4LCAmaWVfcHRyLT5TdXBwUmF0ZXMsCisJCQkmaWVfcHRyLT5FeHRTdXBwUmF0ZXMpKQorCQlnb3RvIGVuZDsKKwlpZiAoKGVDc3JSb2FtV21tUWJzc09ubHkgPT0gbWFjX2N0eC0+cm9hbS5jb25maWdQYXJhbS5XTU1TdXBwb3J0TW9kZSkKKwkJCSYmICFDU1JfSVNfUU9TX0JTUyhpZV9wdHIpKQorCQlnb3RvIGVuZDsKKwkvKgorCSAqIENoZWNrIGNvdW50cnkuIGNoZWNrIGV2ZW4gd2hlbiBwYiBpcyBOVUxMIGJlY2F1c2Ugd2UgbWF5CisJICogd2FudCB0byBtYWtlIHN1cmUKKwkgKi8KKwlwYiA9IChmaWx0ZXItPmNvdW50cnlDb2RlWzBdKSA/IChmaWx0ZXItPmNvdW50cnlDb2RlKSA6IE5VTEw7CisJY2hlY2sgPSBjc3JfbWF0Y2hfY291bnRyeV9jb2RlKG1hY19jdHgsIHBiLCBpZV9wdHIpOworCWlmICghY2hlY2spCisJCWdvdG8gZW5kOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAoZmlsdGVyLT5NRElELm1kaWVQcmVzZW50ICYmIGNzcl9yb2FtX2lzMTFyX2Fzc29jKG1hY19jdHgsCisJCQltYWNfY3R4LT5yb2FtLnJvYW1TZXNzaW9uLT5zZXNzaW9uSWQpKSB7CisJCWlmIChic3NfZGVzY3ItPm1kaWVQcmVzZW50KSB7CisJCQlpZiAoZmlsdGVyLT5NRElELm1vYmlsaXR5RG9tYWluICE9CisJCQkJCShic3NfZGVzY3ItPm1kaWVbMV0gPDwgOCB8CisJCQkJCQlic3NfZGVzY3ItPm1kaWVbMF0pKQorCQkJCWdvdG8gZW5kOworCQl9IGVsc2UgeworCQkJZ290byBlbmQ7CisJCX0KKwl9CisjZW5kaWYKKwlyYyA9IHRydWU7CisKK2VuZDoKKwlpZiAoaWVfZGJscHRyKQorCQkqaWVfZGJscHRyID0gaWVfcHRyOworCWVsc2UgaWYgKGllX3B0cikKKwkJY2RmX21lbV9mcmVlKGllX3B0cik7CisJcmV0dXJuIHJjOworfQorCitib29sIGNzcl9tYXRjaF9jb25uZWN0ZWRfYnNzX3NlY3VyaXR5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgICAgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSwKKwkJCQkgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLAorCQkJCSAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisJdENzckVuY3J5cHRpb25MaXN0IHVjRW5jcnlwdGlvbkxpc3QsIG1jRW5jcnlwdGlvbkxpc3Q7CisJdENzckF1dGhMaXN0IGF1dGhMaXN0OworCisJdWNFbmNyeXB0aW9uTGlzdC5udW1FbnRyaWVzID0gMTsKKwl1Y0VuY3J5cHRpb25MaXN0LmVuY3J5cHRpb25UeXBlWzBdID0gcFByb2ZpbGUtPkVuY3J5cHRpb25UeXBlOworCisJbWNFbmNyeXB0aW9uTGlzdC5udW1FbnRyaWVzID0gMTsKKwltY0VuY3J5cHRpb25MaXN0LmVuY3J5cHRpb25UeXBlWzBdID0gcFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGU7CisKKwlhdXRoTGlzdC5udW1FbnRyaWVzID0gMTsKKwlhdXRoTGlzdC5hdXRoVHlwZVswXSA9IHBQcm9maWxlLT5BdXRoVHlwZTsKKworCXJldHVybiBjc3JfaXNfc2VjdXJpdHlfbWF0Y2gocE1hYywgJmF1dGhMaXN0LCAmdWNFbmNyeXB0aW9uTGlzdCwKKwkJCQkgICAgICAmbWNFbmNyeXB0aW9uTGlzdCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkgICAgICBwQnNzRGVzYywgcEllcywgTlVMTCwgTlVMTCwgTlVMTCk7CisKK30KKworYm9vbCBjc3JfbWF0Y2hfYnNzX3RvX2Nvbm5lY3RfcHJvZmlsZSh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgICAgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSwKKwkJCQkgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLAorCQkJCSAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCWJvb2wgZlJDID0gZmFsc2UsIGZDaGVjazsKKwl0RG90MTFmQmVhY29uSUVzICpwSWVzTG9jYWwgPSBwSWVzOworCisJZG8geworCQlpZiAoIXBJZXMpIHsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCQkJICAgIChjc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzCisJCQkJCSAgICAocE1hYywgcEJzc0Rlc2MsICZwSWVzTG9jYWwpKSkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZDaGVjayA9IHRydWU7CisJCWlmIChwSWVzTG9jYWwtPlNTSUQucHJlc2VudCkgeworCQkJYm9vbCBmQ2hlY2tTc2lkID0gZmFsc2U7CisJCQlpZiAocFByb2ZpbGUtPlNTSUQubGVuZ3RoKSB7CisJCQkJZkNoZWNrU3NpZCA9IHRydWU7CisJCQl9CisJCQlmQ2hlY2sgPQorCQkJCWNzcl9pc19zc2lkX21hdGNoKHBNYWMsIHBQcm9maWxlLT5TU0lELnNzSWQsCisJCQkJCQkgIHBQcm9maWxlLT5TU0lELmxlbmd0aCwKKwkJCQkJCSAgcEllc0xvY2FsLT5TU0lELnNzaWQsCisJCQkJCQkgIHBJZXNMb2NhbC0+U1NJRC5udW1fc3NpZCwKKwkJCQkJCSAgZkNoZWNrU3NpZCk7CisJCQlpZiAoIWZDaGVjaykKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIWNzcl9tYXRjaF9jb25uZWN0ZWRfYnNzX3NlY3VyaXR5CisJCQkgICAgKHBNYWMsIHBQcm9maWxlLCBwQnNzRGVzYywgcEllc0xvY2FsKSkKKwkJCWJyZWFrOworCQlpZiAoIWNzcl9pc19jYXBhYmlsaXRpZXNfbWF0Y2gocE1hYywgcFByb2ZpbGUtPkJTU1R5cGUsIHBCc3NEZXNjKSkKKwkJCWJyZWFrOworCQlpZiAoIWNzcl9pc19yYXRlX3NldF9tYXRjaAorCQkJICAgIChwTWFjLCAmcEllc0xvY2FsLT5TdXBwUmF0ZXMsICZwSWVzTG9jYWwtPkV4dFN1cHBSYXRlcykpCisJCQlicmVhazsKKwkJZkNoZWNrID0KKwkJCWNzcl9pc19jaGFubmVsX2JhbmRfbWF0Y2gocE1hYywgcFByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWwsCisJCQkJCQkgIHBCc3NEZXNjKTsKKwkJaWYgKCFmQ2hlY2spCisJCQlicmVhazsKKworCQlmUkMgPSB0cnVlOworCisJfSB3aGlsZSAoMCk7CisKKwlpZiAoIXBJZXMgJiYgcEllc0xvY2FsKSB7CisJCS8qIGxvY2FsbHkgYWxsb2NhdGVkICovCisJCWNkZl9tZW1fZnJlZShwSWVzTG9jYWwpOworCX0KKworCXJldHVybiBmUkM7Cit9CisKK3ZvaWQgY3NyX2FkZF9yYXRlX2JpdG1hcCh1aW50OF90IHJhdGUsIHVpbnQxNl90ICpwUmF0ZUJpdG1hcCkKK3sKKwl1aW50MTZfdCByYXRlQml0bWFwOworCXVpbnQxNl90IG4gPSBCSVRTX09GRihyYXRlLCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLKTsKKwlyYXRlQml0bWFwID0gKnBSYXRlQml0bWFwOworCXN3aXRjaCAobikgeworCWNhc2UgU0lSX01BQ19SQVRFXzE6CisJCXJhdGVCaXRtYXAgfD0gU0lSX01BQ19SQVRFXzFfQklUTUFQOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV8yOgorCQlyYXRlQml0bWFwIHw9IFNJUl9NQUNfUkFURV8yX0JJVE1BUDsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfNV81OgorCQlyYXRlQml0bWFwIHw9IFNJUl9NQUNfUkFURV81XzVfQklUTUFQOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV8xMToKKwkJcmF0ZUJpdG1hcCB8PSBTSVJfTUFDX1JBVEVfMTFfQklUTUFQOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV82OgorCQlyYXRlQml0bWFwIHw9IFNJUl9NQUNfUkFURV82X0JJVE1BUDsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfOToKKwkJcmF0ZUJpdG1hcCB8PSBTSVJfTUFDX1JBVEVfOV9CSVRNQVA7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzEyOgorCQlyYXRlQml0bWFwIHw9IFNJUl9NQUNfUkFURV8xMl9CSVRNQVA7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzE4OgorCQlyYXRlQml0bWFwIHw9IFNJUl9NQUNfUkFURV8xOF9CSVRNQVA7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzI0OgorCQlyYXRlQml0bWFwIHw9IFNJUl9NQUNfUkFURV8yNF9CSVRNQVA7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzM2OgorCQlyYXRlQml0bWFwIHw9IFNJUl9NQUNfUkFURV8zNl9CSVRNQVA7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzQ4OgorCQlyYXRlQml0bWFwIHw9IFNJUl9NQUNfUkFURV80OF9CSVRNQVA7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzU0OgorCQlyYXRlQml0bWFwIHw9IFNJUl9NQUNfUkFURV81NF9CSVRNQVA7CisJCWJyZWFrOworCX0KKwkqcFJhdGVCaXRtYXAgPSByYXRlQml0bWFwOworfQorCitib29sIGNzcl9jaGVja19yYXRlX2JpdG1hcCh1aW50OF90IHJhdGUsIHVpbnQxNl90IHJhdGVCaXRtYXApCit7CisJdWludDE2X3QgbiA9IEJJVFNfT0ZGKHJhdGUsIENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0spOworCisJc3dpdGNoIChuKSB7CisJY2FzZSBTSVJfTUFDX1JBVEVfMToKKwkJcmF0ZUJpdG1hcCAmPSBTSVJfTUFDX1JBVEVfMV9CSVRNQVA7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzI6CisJCXJhdGVCaXRtYXAgJj0gU0lSX01BQ19SQVRFXzJfQklUTUFQOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV81XzU6CisJCXJhdGVCaXRtYXAgJj0gU0lSX01BQ19SQVRFXzVfNV9CSVRNQVA7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzExOgorCQlyYXRlQml0bWFwICY9IFNJUl9NQUNfUkFURV8xMV9CSVRNQVA7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzY6CisJCXJhdGVCaXRtYXAgJj0gU0lSX01BQ19SQVRFXzZfQklUTUFQOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV85OgorCQlyYXRlQml0bWFwICY9IFNJUl9NQUNfUkFURV85X0JJVE1BUDsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfMTI6CisJCXJhdGVCaXRtYXAgJj0gU0lSX01BQ19SQVRFXzEyX0JJVE1BUDsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfMTg6CisJCXJhdGVCaXRtYXAgJj0gU0lSX01BQ19SQVRFXzE4X0JJVE1BUDsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfMjQ6CisJCXJhdGVCaXRtYXAgJj0gU0lSX01BQ19SQVRFXzI0X0JJVE1BUDsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfMzY6CisJCXJhdGVCaXRtYXAgJj0gU0lSX01BQ19SQVRFXzM2X0JJVE1BUDsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfNDg6CisJCXJhdGVCaXRtYXAgJj0gU0lSX01BQ19SQVRFXzQ4X0JJVE1BUDsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfNTQ6CisJCXJhdGVCaXRtYXAgJj0gU0lSX01BQ19SQVRFXzU0X0JJVE1BUDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAhIXJhdGVCaXRtYXA7Cit9CisKK2Jvb2wgY3NyX3JhdGVzX2lzX2RvdDExX3JhdGVfc3VwcG9ydGVkKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCByYXRlKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKwl1aW50MTZfdCBuID0gQklUU19PRkYocmF0ZSwgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSyk7CisKKwlyZXR1cm4gY3NyX2lzX2FnZ3JlZ2F0ZV9yYXRlX3N1cHBvcnRlZChwTWFjLCBuKTsKK30KKwordWludDE2X3QgY3NyX3JhdGVzX21hY19wcm9wX3RvX2RvdDExKHVpbnQxNl90IFJhdGUpCit7CisJdWludDE2X3QgQ29udmVydGVkUmF0ZSA9IFJhdGU7CisKKwlzd2l0Y2ggKFJhdGUpIHsKKwljYXNlIFNJUl9NQUNfUkFURV8xOgorCQlDb252ZXJ0ZWRSYXRlID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfMjoKKwkJQ29udmVydGVkUmF0ZSA9IDQ7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzVfNToKKwkJQ29udmVydGVkUmF0ZSA9IDExOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV8xMToKKwkJQ29udmVydGVkUmF0ZSA9IDIyOworCQlicmVhazsKKworCWNhc2UgU0lSX01BQ19SQVRFXzY6CisJCUNvbnZlcnRlZFJhdGUgPSAxMjsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfOToKKwkJQ29udmVydGVkUmF0ZSA9IDE4OworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV8xMjoKKwkJQ29udmVydGVkUmF0ZSA9IDI0OworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV8xODoKKwkJQ29udmVydGVkUmF0ZSA9IDM2OworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV8yNDoKKwkJQ29udmVydGVkUmF0ZSA9IDQ4OworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV8zNjoKKwkJQ29udmVydGVkUmF0ZSA9IDcyOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV80MjoKKwkJQ29udmVydGVkUmF0ZSA9IDg0OworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV80ODoKKwkJQ29udmVydGVkUmF0ZSA9IDk2OworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV81NDoKKwkJQ29udmVydGVkUmF0ZSA9IDEwODsKKwkJYnJlYWs7CisKKwljYXNlIFNJUl9NQUNfUkFURV83MjoKKwkJQ29udmVydGVkUmF0ZSA9IDE0NDsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfODQ6CisJCUNvbnZlcnRlZFJhdGUgPSAxNjg7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzk2OgorCQlDb252ZXJ0ZWRSYXRlID0gMTkyOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV8xMDg6CisJCUNvbnZlcnRlZFJhdGUgPSAyMTY7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzEyNjoKKwkJQ29udmVydGVkUmF0ZSA9IDI1MjsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfMTQ0OgorCQlDb252ZXJ0ZWRSYXRlID0gMjg4OworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV8xNjg6CisJCUNvbnZlcnRlZFJhdGUgPSAzMzY7CisJCWJyZWFrOworCWNhc2UgU0lSX01BQ19SQVRFXzE5MjoKKwkJQ29udmVydGVkUmF0ZSA9IDM4NDsKKwkJYnJlYWs7CisJY2FzZSBTSVJfTUFDX1JBVEVfMjE2OgorCQlDb252ZXJ0ZWRSYXRlID0gNDMyOworCQlicmVhazsKKwljYXNlIFNJUl9NQUNfUkFURV8yNDA6CisJCUNvbnZlcnRlZFJhdGUgPSA0ODA7CisJCWJyZWFrOworCisJY2FzZSAweGZmOgorCQlDb252ZXJ0ZWRSYXRlID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIENvbnZlcnRlZFJhdGU7Cit9CisKK3VpbnQxNl90IGNzcl9yYXRlc19maW5kX2Jlc3RfcmF0ZSh0U2lyTWFjUmF0ZVNldCAqcFN1cHBSYXRlcywKKwkJCQkgIHRTaXJNYWNSYXRlU2V0ICpwRXh0UmF0ZXMsCisJCQkJICB0U2lyTWFjUHJvcFJhdGVTZXQgKnBQcm9wUmF0ZXMpCit7CisJdWludDhfdCBpOworCXVpbnQxNl90IG5CZXN0OworCisJbkJlc3QgPSBwU3VwcFJhdGVzLT5yYXRlWzBdICYgKH5DU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLKTsKKworCWlmIChwU3VwcFJhdGVzLT5udW1SYXRlcyA+IFNJUl9NQUNfUkFURVNFVF9FSURfTUFYKSB7CisJCXBTdXBwUmF0ZXMtPm51bVJhdGVzID0gU0lSX01BQ19SQVRFU0VUX0VJRF9NQVg7CisJfQorCisJZm9yIChpID0gMVU7IGkgPCBwU3VwcFJhdGVzLT5udW1SYXRlczsgKytpKSB7CisJCW5CZXN0ID0KKwkJCSh1aW50MTZfdCkgQ1NSX01BWChuQmVzdCwKKwkJCQkJICAgcFN1cHBSYXRlcy0+CisJCQkJCSAgIHJhdGVbaV0gJiAofkNTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0spKTsKKwl9CisKKwlpZiAoTlVMTCAhPSBwRXh0UmF0ZXMpIHsKKwkJZm9yIChpID0gMFU7IGkgPCBwRXh0UmF0ZXMtPm51bVJhdGVzOyArK2kpIHsKKwkJCW5CZXN0ID0KKwkJCQkodWludDE2X3QpIENTUl9NQVgobkJlc3QsCisJCQkJCQkgICBwRXh0UmF0ZXMtPgorCQkJCQkJICAgcmF0ZVtpXSAmCisJCQkJCQkgICAofkNTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0spKTsKKwkJfQorCX0KKworCWlmIChOVUxMICE9IHBQcm9wUmF0ZXMpIHsKKwkJZm9yIChpID0gMFU7IGkgPCBwUHJvcFJhdGVzLT5udW1Qcm9wUmF0ZXM7ICsraSkgeworCQkJbkJlc3QgPQorCQkJCSh1aW50MTZfdCkgQ1NSX01BWChuQmVzdCwKKwkJCQkJCSAgIGNzcl9yYXRlc19tYWNfcHJvcF90b19kb3QxMQorCQkJCQkJCSAgIChwUHJvcFJhdGVzLT5wcm9wUmF0ZVtpXSkpOworCQl9CisJfQorCisJcmV0dXJuIG5CZXN0OworfQorCit2b2lkIGNzcl9yZWxlYXNlX3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSkKK3sKKwlpZiAocFByb2ZpbGUpIHsKKwkJaWYgKHBQcm9maWxlLT5CU1NJRHMuYnNzaWQpIHsKKwkJCWNkZl9tZW1fZnJlZShwUHJvZmlsZS0+QlNTSURzLmJzc2lkKTsKKwkJCXBQcm9maWxlLT5CU1NJRHMuYnNzaWQgPSBOVUxMOworCQl9CisJCWlmIChwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3QpIHsKKwkJCWNkZl9tZW1fZnJlZShwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3QpOworCQkJcFByb2ZpbGUtPlNTSURzLlNTSURMaXN0ID0gTlVMTDsKKwkJfQorCQlpZiAocFByb2ZpbGUtPnBXUEFSZXFJRSkgeworCQkJY2RmX21lbV9mcmVlKHBQcm9maWxlLT5wV1BBUmVxSUUpOworCQkJcFByb2ZpbGUtPnBXUEFSZXFJRSA9IE5VTEw7CisJCX0KKwkJaWYgKHBQcm9maWxlLT5wUlNOUmVxSUUpIHsKKwkJCWNkZl9tZW1fZnJlZShwUHJvZmlsZS0+cFJTTlJlcUlFKTsKKwkJCXBQcm9maWxlLT5wUlNOUmVxSUUgPSBOVUxMOworCQl9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwkJaWYgKHBQcm9maWxlLT5wV0FQSVJlcUlFKSB7CisJCQljZGZfbWVtX2ZyZWUocFByb2ZpbGUtPnBXQVBJUmVxSUUpOworCQkJcFByb2ZpbGUtPnBXQVBJUmVxSUUgPSBOVUxMOworCQl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKworCQlpZiAocFByb2ZpbGUtPnBBZGRJRVNjYW4pIHsKKwkJCWNkZl9tZW1fZnJlZShwUHJvZmlsZS0+cEFkZElFU2Nhbik7CisJCQlwUHJvZmlsZS0+cEFkZElFU2NhbiA9IE5VTEw7CisJCX0KKworCQlpZiAocFByb2ZpbGUtPnBBZGRJRUFzc29jKSB7CisJCQljZGZfbWVtX2ZyZWUocFByb2ZpbGUtPnBBZGRJRUFzc29jKTsKKwkJCXBQcm9maWxlLT5wQWRkSUVBc3NvYyA9IE5VTEw7CisJCX0KKwkJaWYgKHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCkgeworCQkJY2RmX21lbV9mcmVlKHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCk7CisJCQlwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworCQl9CisJCWNkZl9tZW1fc2V0KHBQcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSwgMCk7CisJfQorfQorCit2b2lkIGNzcl9mcmVlX3NjYW5fZmlsdGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwU2NhbkZpbHRlcikKK3sKKwlpZiAocFNjYW5GaWx0ZXItPkJTU0lEcy5ic3NpZCkgeworCQljZGZfbWVtX2ZyZWUocFNjYW5GaWx0ZXItPkJTU0lEcy5ic3NpZCk7CisJCXBTY2FuRmlsdGVyLT5CU1NJRHMuYnNzaWQgPSBOVUxMOworCX0KKwlpZiAocFNjYW5GaWx0ZXItPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSB7CisJCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlci0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpOworCQlwU2NhbkZpbHRlci0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworCX0KKwlpZiAocFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0KSB7CisJCWNkZl9tZW1fZnJlZShwU2NhbkZpbHRlci0+U1NJRHMuU1NJRExpc3QpOworCQlwU2NhbkZpbHRlci0+U1NJRHMuU1NJRExpc3QgPSBOVUxMOworCX0KK30KKwordm9pZCBjc3JfZnJlZV9yb2FtX3Byb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSAmcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdOworCisJaWYgKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpIHsKKwkJY3NyX3JlbGVhc2VfcHJvZmlsZShwTWFjLCBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKTsKKwkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpOworCQlwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgY3NyX2ZyZWVfY29ubmVjdF9ic3NfZGVzYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9ICZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF07CisKKwlpZiAocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYykgeworCQljZGZfbWVtX2ZyZWUocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYyk7CisJCXBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MgPSBOVUxMOworCX0KK30KKwordFNpclJlc3VsdENvZGVzIGNzcl9nZXRfZGlzYXNzb2NfcnNwX3N0YXR1c19jb2RlKHRTaXJTbWVEaXNhc3NvY1JzcCAqCisJCQkJCQkgcFNtZURpc2Fzc29jUnNwKQoreworCXVpbnQ4X3QgKnBCdWZmZXIgPSAodWludDhfdCAqKSBwU21lRGlzYXNzb2NSc3A7CisJdWludDMyX3QgcmV0OworCisJcEJ1ZmZlciArPSAoc2l6ZW9mKHVpbnQxNl90KSArIHNpemVvZih1aW50MTZfdCkgKyBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkvKiB0U2lyUmVzdWx0Q29kZXMgaXMgYW4gZW51bSwgYXNzdW1pbmcgaXMgMzJiaXQgKi8KKwkvKiBJZiB3ZSBjYW5ub3QgbWFrZSB0aGlzIGFzc3VtcHRpb24sIHVzZSBjb3B5bWVtb3J5ICovCisJY2RmX2dldF91MzIocEJ1ZmZlciwgJnJldCk7CisKKwlyZXR1cm4gKHRTaXJSZXN1bHRDb2RlcykgcmV0OworfQorCit0U2lyUmVzdWx0Q29kZXMgY3NyX2dldF9kZV9hdXRoX3JzcF9zdGF0dXNfY29kZSh0U2lyU21lRGVhdXRoUnNwICpwU21lUnNwKQoreworCXVpbnQ4X3QgKnBCdWZmZXIgPSAodWludDhfdCAqKSBwU21lUnNwOworCXVpbnQzMl90IHJldDsKKworCXBCdWZmZXIgKz0KKwkJKHNpemVvZih1aW50MTZfdCkgKyBzaXplb2YodWludDE2X3QpICsgc2l6ZW9mKHVpbnQ4X3QpICsKKwkJIHNpemVvZih1aW50MTZfdCkpOworCS8qIHRTaXJSZXN1bHRDb2RlcyBpcyBhbiBlbnVtLCBhc3N1bWluZyBpcyAzMmJpdCAqLworCS8qIElmIHdlIGNhbm5vdCBtYWtlIHRoaXMgYXNzdW1wdGlvbiwgdXNlIGNvcHltZW1vcnkgKi8KKwljZGZfZ2V0X3UzMihwQnVmZmVyLCAmcmV0KTsKKworCXJldHVybiAodFNpclJlc3VsdENvZGVzKSByZXQ7Cit9CisKK3RTaXJTY2FuVHlwZSBjc3JfZ2V0X3NjYW5fdHlwZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IGNobklkKQoreworCXRTaXJTY2FuVHlwZSBzY2FuVHlwZSA9IGVTSVJfUEFTU0lWRV9TQ0FOOworCUNIQU5ORUxfU1RBVEUgY2hhbm5lbEVuYWJsZWRUeXBlOworCisJY2hhbm5lbEVuYWJsZWRUeXBlID0gY2RzX2dldF9jaGFubmVsX3N0YXRlKGNobklkKTsKKwlpZiAoQ0hBTk5FTF9TVEFURV9FTkFCTEUgPT0gY2hhbm5lbEVuYWJsZWRUeXBlKSB7CisJCXNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKwl9CisJcmV0dXJuIHNjYW5UeXBlOworfQorCit1aW50OF90IGNzcl90b191cHBlcih1aW50OF90IGNoKQoreworCXVpbnQ4X3QgY2hPdXQ7CisKKwlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgeworCQljaE91dCA9IGNoIC0gJ2EnICsgJ0EnOworCX0gZWxzZSB7CisJCWNoT3V0ID0gY2g7CisJfQorCXJldHVybiBjaE91dDsKK30KKwordFNpckJzc1R5cGUgY3NyX3RyYW5zbGF0ZV9ic3N0eXBlX3RvX21hY190eXBlKGVDc3JSb2FtQnNzVHlwZSBjc3J0eXBlKQoreworCXRTaXJCc3NUeXBlIHJldDsKKworCXN3aXRjaCAoY3NydHlwZSkgeworCWNhc2UgZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRToKKwkJcmV0ID0gZVNJUl9JTkZSQVNUUlVDVFVSRV9NT0RFOworCQlicmVhazsKKwljYXNlIGVDU1JfQlNTX1RZUEVfSUJTUzoKKwljYXNlIGVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUzoKKwkJcmV0ID0gZVNJUl9JQlNTX01PREU7CisJCWJyZWFrOworCWNhc2UgZUNTUl9CU1NfVFlQRV9XRFNfQVA6CisJCXJldCA9IGVTSVJfQlRBTVBfQVBfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0JTU19UWVBFX1dEU19TVEE6CisJCXJldCA9IGVTSVJfQlRBTVBfU1RBX01PREU7CisJCWJyZWFrOworCWNhc2UgZUNTUl9CU1NfVFlQRV9JTkZSQV9BUDoKKwkJcmV0ID0gZVNJUl9JTkZSQV9BUF9NT0RFOworCQlicmVhazsKKwljYXNlIGVDU1JfQlNTX1RZUEVfQU5ZOgorCWRlZmF1bHQ6CisJCXJldCA9IGVTSVJfQVVUT19NT0RFOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHVzZSB0aGUgcGFyYW1ldGVycyB0byBkZWNpZGUgdGhlIENGRyB2YWx1ZS4gKi8KKy8qIENTUiBuZXZlciBzZXRzIFdOSV9DRkdfRE9UMTFfTU9ERV9BTEwgdG8gdGhlIENGRyAqLworLyogU28gUEUgc2hvdWxkIG5vdCBzZWUgV05JX0NGR19ET1QxMV9NT0RFX0FMTCB3aGVuIGl0IGdldHMgdGhlIENGRyB2YWx1ZSAqLworZUNzckNmZ0RvdDExTW9kZSBjc3JfZ2V0X2NmZ19kb3QxMV9tb2RlX2Zyb21fY3NyX3BoeV9tb2RlKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisJCQkJCQkJICBlQ3NyUGh5TW9kZSBwaHlNb2RlLAorCQkJCQkJCSAgYm9vbCBmUHJvcHJpZXRhcnkpCit7CisJdWludDMyX3QgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV9BQkc7CisKKwlzd2l0Y2ggKHBoeU1vZGUpIHsKKwljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWE6CisJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOworCQlicmVhazsKKwljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWI6CisJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFiX09OTFk6CisJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOworCQlicmVhazsKKwljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWc6CisJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFnX09OTFk6CisJCWlmIChwUHJvZmlsZSAmJiAoQ1NSX0lTX0lORlJBX0FQKHBQcm9maWxlKSkKKwkJICAgICYmIChwaHlNb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWSkpCisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExR19PTkxZOworCQllbHNlCisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKwkJYnJlYWs7CisJY2FzZSBlQ1NSX0RPVDExX01PREVfMTFuOgorCQkJY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisJCWJyZWFrOworCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExbl9PTkxZOgorCQlpZiAocFByb2ZpbGUgJiYgQ1NSX0lTX0lORlJBX0FQKHBQcm9maWxlKSkKKwkJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOX09OTFk7CisJCWVsc2UKKwkJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOworCQlicmVhazsKKwljYXNlIGVDU1JfRE9UMTFfTU9ERV9hYmc6CisJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfQUJHOworCQlicmVhazsKKwljYXNlIGVDU1JfRE9UMTFfTU9ERV9BVVRPOgorCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFX0FVVE87CisJCWJyZWFrOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwljYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWFjOgorCQlpZiAoSVNfRkVBVFVSRV9TVVBQT1JURURfQllfRlcoRE9UMTFBQykpIHsKKwkJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBQzsKKwkJfSBlbHNlIHsKKwkJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOworCQl9CisJCWJyZWFrOworCWNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYWNfT05MWToKKwkJaWYgKElTX0ZFQVRVUkVfU1VQUE9SVEVEX0JZX0ZXKERPVDExQUMpKSB7CisJCQljZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQUNfT05MWTsKKwkJfSBlbHNlIHsKKwkJCWNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJLyogTm8gbmVlZCB0byBhc3NpZ24gYW55dGhpbmcgaGVyZSAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY2ZnRG90MTFNb2RlOworfQorCitDREZfU1RBVFVTIGNzcl9nZXRfcmVndWxhdG9yeV9kb21haW5fZm9yX2NvdW50cnkKKwkodHBBbmlTaXJHbG9iYWwgcE1hYywKKwl1aW50OF90ICpwQ291bnRyeSwKKwl2X1JFR0RPTUFJTl90ICpwRG9tYWluSWQsIHZfQ291bnRyeUluZm9Tb3VyY2VfdCBzb3VyY2UpIHsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJY291bnRyeV9jb2RlX3QgY291bnRyeUNvZGU7CisJdl9SRUdET01BSU5fdCBkb21haW5JZDsKKworCWlmIChwQ291bnRyeSkgeworCQljb3VudHJ5Q29kZVswXSA9IHBDb3VudHJ5WzBdOworCQljb3VudHJ5Q29kZVsxXSA9IHBDb3VudHJ5WzFdOworCQljZGZfc3RhdHVzID0gY2RzX2dldF9yZWdfZG9tYWluX2Zyb21fY291bnRyeV9jb2RlKCZkb21haW5JZCwKKwkJCQkJCQkJICBjb3VudHJ5Q29kZSwKKwkJCQkJCQkJICBzb3VyY2UpOworCisJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCWlmIChwRG9tYWluSWQpIHsKKwkJCQkqcERvbWFpbklkID0gZG9tYWluSWQ7CisJCQl9CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR1csCisJCQkJRkwKKwkJCQkJKCIgQ291bGRuJ3QgZmluZCBkb21haW4gZm9yIGNvdW50cnkgY29kZSAgJWMlYyIpLAorCQkJCXBDb3VudHJ5WzBdLCBwQ291bnRyeVsxXSk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBUbyBjaGVjayB3aGV0aGVyIGEgY291bnRyeSBjb2RlIG1hdGNoZXMgdGhlIG9uZSBpbiB0aGUgSUUgKi8KKy8qIE9ubHkgY2hlY2sgdGhlIGZpcnN0IHR3byBjaGFyYWN0ZXJzLCBpZ25vcmluZyBpbi9vdXRkb29yICovCisvKiBwQ291bnRyeSAtLSBjYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluIHRoZSBjb3VudHJ5IGNvZGUgdGhhdCBpcyBjaGVja2luZyBhZ2FpbnN0ICovCisvKiB0aGUgb25lIGluIHBJZXMuIEl0IGNhbiBiZSBOVUxMLiAqLworLyogY2FsbGVyIG11c3QgcHJvdmlkZSBwSWVzLCBpdCBjYW5ub3QgYmUgTlVMTCAqLworLyogVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIHRydWUgaWYgMTFkIHN1cHBvcnQgaXMgbm90IHR1cm5lZCBvbi4gKi8KK2Jvb2wgY3NyX21hdGNoX2NvdW50cnlfY29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwQ291bnRyeSwKKwkJCSAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworCWJvb2wgZlJldCA9IHRydWU7CisKKwlkbyB7CisJCWlmICghY3NyX2lzMTFkX3N1cHBvcnRlZChwTWFjKSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFwSWVzKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIE5vIElFcyIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBDb3VudHJ5KSB7CisJCQl1aW50MzJfdCBpOworCisJCQlpZiAoIXBJZXMtPkNvdW50cnkucHJlc2VudCkgeworCQkJCWZSZXQgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIENvbnZlcnQgdGhlIENvdW50cnlDb2RlIGNoYXJhY3RlcnMgdG8gdXBwZXIgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4gLSAxOyBpKyspIHsKKwkJCQlwQ291bnRyeVtpXSA9IGNzcl90b191cHBlcihwQ291bnRyeVtpXSk7CisJCQl9CisJCQlpZiAoIWNkZl9tZW1fY29tcGFyZShwSWVzLT5Db3VudHJ5LmNvdW50cnksIHBDb3VudHJ5LAorCQkJCQkgICAgIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiAtIDEpKSB7CisJCQkJZlJldCA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gZlJldDsKK30KKworQ0RGX1NUQVRVUyBjc3JfZ2V0X21vZGlmeV9wcm9maWxlX2ZpZWxkcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJCSB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgKgorCQkJCQkgcE1vZGlmeVByb2ZpbGVGaWVsZHMpCit7CisKKwlpZiAoIXBNb2RpZnlQcm9maWxlRmllbGRzKSB7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZGZfbWVtX2NvcHkocE1vZGlmeVByb2ZpbGVGaWVsZHMsCisJCSAgICAgJnBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0ZWRQcm9maWxlLgorCQkgICAgIG1vZGlmeVByb2ZpbGVGaWVsZHMsIHNpemVvZih0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMpKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0NERl9TVEFUVVMgY3NyX3NldF9tb2RpZnlfcHJvZmlsZV9maWVsZHModHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkLAorCQkJCQkgdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzICoKKwkJCQkJIHBNb2RpZnlQcm9maWxlRmllbGRzKQoreworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworCWNkZl9tZW1fY29weSgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUubW9kaWZ5UHJvZmlsZUZpZWxkcywKKwkJICAgICBwTW9kaWZ5UHJvZmlsZUZpZWxkcywgc2l6ZW9mKHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcykpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworCitib29sIGNzcl9pc19zZXRfa2V5X2FsbG93ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3Qgc2Vzc2lvbklkKQoreworCWJvb2wgZlJldCA9IHRydWU7CisJdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwkvKgorCSAqIFRoaXMgY29uZGl0aW9uIGlzIG5vdCB3b3JraW5nIGZvciBpbmZyYSBzdGF0ZS4gV2hlbiBpbmZyYSBpcyBpbgorCSAqIG5vdC1jb25uZWN0ZWQgc3RhdGUgdGhlIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUgaXMgTlVMTCwgdGhpcworCSAqIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhhdCBpcyBpbmNvcnJlY3QuCisJICogU2luY2UgU0FQIHJlcXVpcmVzIHRvIHNldCBrZXkgd2l0aG91dCBhbnkgQlNTIHN0YXJ0ZWQsIGl0IG5lZWRzCisJICogdGhpcyBjb25kaXRpb24gdG8gYmUgbWV0LiBJbiBvdGhlciB3b3JkcywgdGhpcyBmdW5jdGlvbiBpcyB1c2VsZXNzLgorCSAqIFRoZSBjdXJyZW50IHdvcmstYXJvdW5kIGlzIHRvIHByb2Nlc3Mgc2V0Y29udGV4dF9yc3Agbm8gbWF0dGVyCisJICogd2hhdCB0aGUgc3RhdGUgaXMuCisJICovCisJc21zX2xvZyhwTWFjLCBMT0cyLAorCQlGTCgiIGlzIG5vdCB3aGF0IGl0IGludGVuZHMgdG8uIE11c3QgYmUgcmV2aXNpdCBvciByZW1vdmVkIikpOworCWlmICgoTlVMTCA9PSBwU2Vzc2lvbikKKwkgICAgfHwgKGNzcl9pc19jb25uX3N0YXRlX2Rpc2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpCisJCSYmIChwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlICE9IE5VTEwpCisJCSYmICghKENTUl9JU19JTkZSQV9BUChwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKSkpKQorCSAgICApIHsKKwkJZlJldCA9IGZhbHNlOworCX0KKworCXJldHVybiBmUmV0OworfQorCisvKiBubyBuZWVkIHRvIGFjcXVpcmUgbG9jayBmb3IgdGhpcyBiYXNpYyBmdW5jdGlvbiAqLwordWludDE2X3Qgc21lX2Nobl90b19mcmVxKHVpbnQ4X3QgY2hhbk51bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUkZfQ0hBTk5FTFM7IGkrKykgeworCQlpZiAocmZfY2hhbm5lbHNbaV0uY2hhbm5lbE51bSA9PSBjaGFuTnVtKSB7CisJCQlyZXR1cm4gcmZfY2hhbm5lbHNbaV0udGFyZ2V0RnJlcTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBEaXNjb25uZWN0IGFsbCBhY3RpdmUgc2Vzc2lvbnMgYnkgc2VuZGluZyBkaXNhc3NvYy4gVGhpcyBpcyBtYWlubHkgdXNlZCB0byBkaXNjb25uZWN0IHRoZSByZW1haW5pbmcgc2Vzc2lvbiB3aGVuIHdlCisgKiB0cmFuc2l0aW9uIGZyb20gY29uY3VycmVudCBzZXNzaW9ucyB0byBhIHNpbmdsZSBzZXNzaW9uLiBUaGUgdXNlIGNhc2UgaXMgSW5mcmEgU1RBIGFuZCB3aWZpIGRpcmVjdCBtdWx0aXBsZSBzZXNzaW9ucyBhcmUgdXAgYW5kCisgKiBQMlAgc2Vzc2lvbiBpcyByZW1vdmVkLiBUaGUgSW5mcmEgU1RBIHNlc3Npb24gcmVtYWlucyBhbmQgc2hvdWxkIHJlc3VtZSBCTVBTIGlmIEJNUFMgaXMgZW5hYmxlZCBieSBkZWZhdWx0LiBIb3dldmVyLCB0aGVyZQorICogYXJlIHNvbWUgaXNzdWVzIHNlZW4gd2l0aCBCTVBTIHJlc3VtZSBkdXJpbmcgdGhpcyB0cmFuc2l0aW9uIGFuZCB0aGlzIGlzIGEgd29ya2Fyb3VuZCB3aGljaCB3aWxsIGFsbG93IHRoZSBJbmZyYSBTVEEgc2Vzc2lvbiB0bworICogZGlzY29ubmVjdCBhbmQgYXV0byBjb25uZWN0IGJhY2sgYW5kIGVudGVyIEJNUFMgdGhpcyBnaXZpbmcgdGhlIHNhbWUgZWZmZWN0IGFzIHJlc3VtaW5nIEJNUFMKKyAqLworCisvKiBSZW1vdmUgdGhpcyBjb2RlIG9uY2UgU0xNX1Nlc3Npb25pemF0aW9uIGlzIHN1cHBvcnRlZCAqLworLyogQk1QU19XT1JLQVJPVU5EX05PVF9ORUVERUQgKi8KK3ZvaWQgY3NyX2Rpc2Nvbm5lY3RfYWxsX2FjdGl2ZV9zZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXVpbnQ4X3QgaTsKKworCS8qIERpc2Nvbm5lY3QgYWxsIHRoZSBhY3RpdmUgc2Vzc2lvbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKykgeworCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgaSkKKwkJICAgICYmICFjc3JfaXNfY29ubl9zdGF0ZV9kaXNjb25uZWN0ZWQocE1hYywgaSkpIHsKKwkJCWNzcl9yb2FtX2Rpc2Nvbm5lY3RfaW50ZXJuYWwocE1hYywgaSwKKwkJCQkJCSAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisJCX0KKwl9Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTEZSCitib29sIGNzcl9pc19jaGFubmVsX3ByZXNlbnRfaW5fbGlzdCh1aW50OF90ICpwQ2hhbm5lbExpc3QsCisJCQkJICAgIGludCBudW1DaGFubmVscywgdWludDhfdCBjaGFubmVsKQoreworCWludCBpID0gMDsKKworCS8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXIgKi8KKwlpZiAoIXBDaGFubmVsTGlzdCB8fCAobnVtQ2hhbm5lbHMgPT0gMCkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKiBMb29rIGZvciB0aGUgY2hhbm5lbCBpbiB0aGUgbGlzdCAqLworCWZvciAoaSA9IDA7IChpIDwgbnVtQ2hhbm5lbHMpICYmCisJICAgICAoaSA8IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTik7IGkrKykgeworCQlpZiAocENoYW5uZWxMaXN0W2ldID09IGNoYW5uZWwpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK0NERl9TVEFUVVMgY3NyX2FkZF90b19jaGFubmVsX2xpc3RfZnJvbnQodWludDhfdCAqcENoYW5uZWxMaXN0LAorCQkJCQkgaW50IG51bUNoYW5uZWxzLCB1aW50OF90IGNoYW5uZWwpCit7CisJaW50IGkgPSAwOworCisJLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLworCWlmICghcENoYW5uZWxMaXN0KQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05VTExfVkFMVUU7CisKKwkvKiBNYWtlIHJvb20gZm9yIHRoZSBhZGRpdGlvbi4gIChTdGFydCBtb3ZpbmcgZnJvbSB0aGUgYmFjay4pICovCisJZm9yIChpID0gbnVtQ2hhbm5lbHM7IGkgPiAwOyBpLS0pIHsKKwkJcENoYW5uZWxMaXN0W2ldID0gcENoYW5uZWxMaXN0W2kgLSAxXTsKKwl9CisKKwkvKiBOb3cgYWRkIHRoZSBORVcgY2hhbm5lbC4uLmF0IHRoZSBmcm9udCAqLworCXBDaGFubmVsTGlzdFswXSA9IGNoYW5uZWw7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorLyoqCisgKiBjc3JfZGlhZ19ldmVudF9yZXBvcnQoKSAtIHNlbmQgUEUgZGlhZyBldmVudAorICogQHBtYWM6ICAgICAgICBwb2ludGVyIHRvIGdsb2JhbCBNQUMgY29udGV4dC4KKyAqIEBldmVudF90eXBldjogc3ViIGV2ZW50IHR5cGUgZm9yIERJQUcgZXZlbnQuCisgKiBAc3RhdHVzOiAgICAgIHN0YXR1cyBvZiB0aGUgZXZlbnQKKyAqIEByZWFzb25jb2RlOiAgcmVhc29uY29kZSBmb3IgdGhlIGdpdmVuIHN0YXR1cworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgZGlhZyBldmVudAorICoKKyAqIFJldHVybjogICBOQQorICovCit2b2lkIGNzcl9kaWFnX2V2ZW50X3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwbWFjLCB1aW50MTZfdCBldmVudF90eXBlLAorCQkJICAgdWludDE2X3Qgc3RhdHVzLCB1aW50MTZfdCByZWFzb25jb2RlKQoreworCVdMQU5fSE9TVF9ESUFHX0VWRU5UX0RFRihkaWFnX2V2ZW50LCBob3N0X2V2ZW50X3dsYW5fcGVfcGF5bG9hZF90eXBlKTsKKworCWNkZl9tZW1femVybygmZGlhZ19ldmVudCwgc2l6ZW9mKGhvc3RfZXZlbnRfd2xhbl9wZV9wYXlsb2FkX3R5cGUpKTsKKworCS8qIGRpYWdfZXZlbnQuYnNzaWQgaXMgYWxyZWFkeSBhbGwgemVyb2VzICovCisJZGlhZ19ldmVudC5zbWVfc3RhdGUgPSBzbWVfZ2V0X2xpbV9zbWVfc3RhdGUocG1hYyk7CisJZGlhZ19ldmVudC5tbG1fc3RhdGUgPSBzbWVfZ2V0X2xpbV9tbG1fc3RhdGUocG1hYyk7CisJZGlhZ19ldmVudC5ldmVudF90eXBlID0gZXZlbnRfdHlwZTsKKwlkaWFnX2V2ZW50LnN0YXR1cyA9IHN0YXR1czsKKwlkaWFnX2V2ZW50LnJlYXNvbl9jb2RlID0gcmVhc29uY29kZTsKKworCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmZGlhZ19ldmVudCwgRVZFTlRfV0xBTl9QRSk7CisJcmV0dXJuOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9zcmMvbmFuL25hbl9hcGkuYyBiL2NvcmUvc21lL3NyYy9uYW4vbmFuX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDA4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9zcmMvbmFuL25hbl9hcGkuYwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlICJzbWVfYXBpLmgiCisjaW5jbHVkZSAic21zX2RlYnVnLmgiCisjaW5jbHVkZSAiY3NyX2luc2lkZV9hcGkuaCIKKyNpbmNsdWRlICJzbWVfaW5zaWRlLmgiCisjaW5jbHVkZSAibmFuX2FwaS5oIgorI2luY2x1ZGUgImxpbV9hcGkuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBzbWVfbmFuX3JlZ2lzdGVyX2NhbGxiYWNrCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHdoZW4gSEREIHdhbnRzIHJlZ2lzdGVyIG5hbiByc3AgY2FsbGJhY2sgd2l0aAorICogc21lIGxheWVyLgorICoKKyAqIEFyZ3M6CisgKiBoSGFsIGFuZCBjYWxsYmFjayB3aGljaCBuZWVkcyB0byBiZSByZWdpc3RlcmVkLgorICoKKyAqIFJldHVybnM6CisgKiB2b2lkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNtZV9uYW5fcmVnaXN0ZXJfY2FsbGJhY2sodEhhbEhhbmRsZSBoSGFsLCBOYW5DYWxsYmFjayBjYWxsYmFjaykKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gTlVMTDsKKworCWlmIChOVUxMID09IGhIYWwpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJoSGFsIGlzIG5vdCB2YWxpZCIpKTsKKwkJcmV0dXJuOworCX0KKwlwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJcE1hYy0+c21lLm5hbkNhbGxiYWNrID0gY2FsbGJhY2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBzbWVfbmFuX3JlcXVlc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgd2hlbiBIREQgcmVjZWl2ZXMgTkFOIHZlbmRvciBjb21tYW5kCisgKiBmcm9tIHVzZXJzcGFjZQorICoKKyAqIEFyZ3M6CisgKiBOYW4gUmVxdWVzdCBzdHJ1Y3R1cmUgcHRyCisgKgorICogUmV0dXJuczoKKyAqIENERl9TVEFUVVMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NERl9TVEFUVVMgc21lX25hbl9yZXF1ZXN0KHRwTmFuUmVxdWVzdFJlcSBpbnB1dCkKK3sKKwljZHNfbXNnX3QgbXNnOworCXRwTmFuUmVxdWVzdCBkYXRhOworCXNpemVfdCBkYXRhX2xlbjsKKworCWRhdGFfbGVuID0gc2l6ZW9mKHROYW5SZXF1ZXN0KSArIGlucHV0LT5yZXF1ZXN0X2RhdGFfbGVuOworCWRhdGEgPSBjZGZfbWVtX21hbGxvYyhkYXRhX2xlbik7CisKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljZGZfbWVtX3plcm8oZGF0YSwgZGF0YV9sZW4pOworCWRhdGEtPnJlcXVlc3RfZGF0YV9sZW4gPSBpbnB1dC0+cmVxdWVzdF9kYXRhX2xlbjsKKwlpZiAoaW5wdXQtPnJlcXVlc3RfZGF0YV9sZW4pIHsKKwkJY2RmX21lbV9jb3B5KGRhdGEtPnJlcXVlc3RfZGF0YSwKKwkJCSAgICAgaW5wdXQtPnJlcXVlc3RfZGF0YSwgaW5wdXQtPnJlcXVlc3RfZGF0YV9sZW4pOworCX0KKworCW1zZy50eXBlID0gV01BX05BTl9SRVFVRVNUOworCW1zZy5yZXNlcnZlZCA9IDA7CisJbXNnLmJvZHlwdHIgPSBkYXRhOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwKKwkJCQkgICgiTm90IGFibGUgdG8gcG9zdCBXTUFfTkFOX1JFUVVFU1QgbWVzc2FnZSB0byBXTUEiKSk7CisJCWNkZl9tZW1fZnJlZShkYXRhKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZ1bmN0aW9uOiBzbWVfbmFuX2V2ZW50CisqCisqIERlc2NyaXB0aW9uOgorKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gU01FIHJlY2VpdmVkIGVXTklfU01FX05BTl9FVkVOVAorKiBldmVudCBmcm9tIFdNQQorKgorKiBBcmdzOgorKiBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqIHBNc2cgLSBNZXNzYWdlIGJvZHkgcGFzc2VkIGZyb20gV01BOyBpbmNsdWRlcyBOQU4gaGVhZGVyCisqCisqIFJldHVybnM6CisqIENERl9TVEFUVVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NERl9TVEFUVVMgc21lX25hbl9ldmVudCh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnBNc2cpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKE5VTEwgPT0gcE1zZykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIm1zZyBwdHIgaXMgTlVMTCIpKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkgIEZMKCJTTUU6IFJlY2VpdmVkIHNtZV9uYW5fZXZlbnQiKSk7CisJCWlmIChwTWFjLT5zbWUubmFuQ2FsbGJhY2spIHsKKwkJCXBNYWMtPnNtZS5uYW5DYWxsYmFjayhwTWFjLT5oSGRkLAorCQkJCQkgICAgICAodFNpck5hbkV2ZW50ICopIHBNc2cpOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc21lL3NyYy9vZW1fZGF0YS9vZW1fZGF0YV9hcGkuYyBiL2NvcmUvc21lL3NyYy9vZW1fZGF0YS9vZW1fZGF0YV9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWIwYTBkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zbWUvc3JjL29lbV9kYXRhL29lbV9kYXRhX2FwaS5jCkBAIC0wLDAgKzEsMzkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisKKyAgICBcZmlsZSBvZW1fZGF0YV9hcGkuYworCisgICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPRU0gREFUQSBSRVEvUlNQIGludGVyZmFjZXMuCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJvZW1fZGF0YV9hcGkuaCIKKyNpbmNsdWRlICJjZHNfbXEuaCIKKyNpbmNsdWRlICJzbWVfaW5zaWRlLmgiCisjaW5jbHVkZSAic21zX2RlYnVnLmgiCisKKyNpbmNsdWRlICJjc3Jfc3VwcG9ydC5oIgorCisjaW5jbHVkZSAiaG9zdF9kaWFnX2NvcmVfbG9nLmgiCisjaW5jbHVkZSAiaG9zdF9kaWFnX2NvcmVfZXZlbnQuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIG9lbV9kYXRhX29lbV9kYXRhX3JlcV9vcGVuCisgICAgXGJyaWVmIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBBUEkgY2FsbCB0byAoT0VNIERBVEEgUkVRL1JTUCBtb2R1bGUpCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUyBvZW1fZGF0YV9vZW1fZGF0YV9yZXFfb3Blbih0SGFsSGFuZGxlIGhIYWwpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJZG8geworCQkvKiBpbml0aWFsaXplIGFsbCB0aGUgdmFyaWFibGVzIHRvIG51bGwgKi8KKwkJY2RmX21lbV9zZXQoJihwTWFjLT5vZW1EYXRhKSwgc2l6ZW9mKHRPZW1EYXRhU3RydWN0KSwgMCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkib2VtX2RhdGFfb2VtX2RhdGFfcmVxX29wZW46IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0aW1lciBmdW5jdGlvbiIpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBvZW1fZGF0YV9vZW1fZGF0YV9yZXFfY2xvc2UKKyAgICBcYnJpZWYgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2xvc2luZyB0aGUgY3NyIG1vZHVsZQorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NERl9TVEFUVVMgb2VtX2RhdGFfb2VtX2RhdGFfcmVxX2Nsb3NlKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlkbyB7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCQkib2VtX2RhdGFfb2VtX2RhdGFfcmVxX2Nsb3NlOiBGYWlsZWQgaW4gb2VtX2RhdGFfb2VtX2RhdGFfcmVxX2Nsb3NlIGF0IFN0b3BUaW1lcnMiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogaW5pdGlhbGl6ZSBhbGwgdGhlIHZhcmlhYmxlcyB0byBudWxsICovCisJCWNkZl9tZW1fc2V0KCYocE1hYy0+b2VtRGF0YSksIHNpemVvZih0T2VtRGF0YVN0cnVjdCksIDApOworCX0gd2hpbGUgKDApOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIG9lbV9kYXRhX3JlbGVhc2Vfb2VtX2RhdGFfcmVxX2NvbW1hbmQKKyAgICBcYnJpZWYgVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBvZW1EYXRhQ29tbWFuZCBmcm9tIHRoZSBhY3RpdmUgbGlzdCBhbmQKKyAgICAgICAgICAgYW5kIGZyZWVzIHVwIGFueSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhpcworICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIG9lbV9kYXRhX3JlbGVhc2Vfb2VtX2RhdGFfcmVxX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgdFNtZUNtZCAqcE9lbURhdGFDbWQsCisJCQkJCSAgIGVPZW1EYXRhUmVxU3RhdHVzIG9lbURhdGFSZXFTdGF0dXMpCit7CisKKwkvKiBGaXJzdCB0YWtlIHRoaXMgY29tbWFuZCBvdXQgb2YgdGhlIGFjdGl2ZSBsaXN0ICovCisJaWYgKGNzcl9sbF9yZW1vdmVfZW50cnkKKwkJICAgICgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsICZwT2VtRGF0YUNtZC0+TGluaywgTExfQUNDRVNTX0xPQ0spKSB7CisJCWNkZl9tZW1fc2V0KCYocE9lbURhdGFDbWQtPnUub2VtRGF0YUNtZCksIHNpemVvZih0T2VtRGF0YUNtZCksCisJCQkgICAgMCk7CisKKwkJLyogTm93IHB1dCB0aGlzIGNvbW1hbmQgYmFjayBvbiB0aGUgYXZpbGFibGUgY29tbWFuZCBsaXN0ICovCisJCXNtZV9yZWxlYXNlX2NvbW1hbmQocE1hYywgcE9lbURhdGFDbWQpOworCX0gZWxzZSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJPRU1fREFUQTogKioqKioqKioqKioqKioqKiBvZW1fZGF0YV9yZWxlYXNlX29lbV9kYXRhX3JlcV9jb21tYW5kIGNhbm5vdCByZWxlYXNlIHRoZSBjb21tYW5kIik7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gb2VtX2RhdGFfb2VtX2RhdGFfcmVxCisgICAgXGJyaWVmIFJlcXVlc3QgYW4gT0VNIERBVEEgUlNQCisgICAgXHBhcmFtIHNlc3Npb25JZCAtIElkIG9mIHNlc3Npb24gdG8gYmUgdXNlZAorICAgIFxwYXJhbSBwT2VtRGF0YVJlcUlEIC0gcG9pbnRlciB0byBhbiBvYmplY3QgdG8gZ2V0IGJhY2sgdGhlIHJlcXVlc3QgSUQKKyAgICBccGFyYW0gY2FsbGJhY2sgLSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHVwb24gZmluaXNoCisgICAgXHBhcmFtIHBDb250ZXh0IC0gYSBwb2ludGVyIHBhc3NlZCBpbiBmb3IgdGhlIGNhbGxiYWNrCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgb2VtX2RhdGFfb2VtX2RhdGFfcmVxKHRIYWxIYW5kbGUgaEhhbCwKKwkJCQkgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJIHRPZW1EYXRhUmVxQ29uZmlnICpvZW1EYXRhUmVxQ29uZmlnLAorCQkJCSB1aW50MzJfdCAqcE9lbURhdGFSZXFJRCwKKwkJCQkgb2VtX2RhdGFfb2VtX2RhdGFfcmVxQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgdm9pZCAqcENvbnRleHQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRTbWVDbWQgKnBPZW1EYXRhQ21kID0gTlVMTDsKKworCWRvIHsKKwkJaWYgKCFDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWJyZWFrOworCQl9CisKKwkJcE1hYy0+b2VtRGF0YS5vZW1EYXRhUmVxQ29uZmlnLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJcE1hYy0+b2VtRGF0YS5jYWxsYmFjayA9IGNhbGxiYWNrOworCQlwTWFjLT5vZW1EYXRhLnBDb250ZXh0ID0gcENvbnRleHQ7CisJCXBNYWMtPm9lbURhdGEub2VtRGF0YVJlcUlEID0gKihwT2VtRGF0YVJlcUlEKTsKKworCQljZGZfbWVtX2NvcHkoKHZvaWQgKikocE1hYy0+b2VtRGF0YS5vZW1EYXRhUmVxQ29uZmlnLgorCQkJCSAgICAgIG9lbURhdGFSZXEpLAorCQkJICAgICAodm9pZCAqKShvZW1EYXRhUmVxQ29uZmlnLT5vZW1EYXRhUmVxKSwKKwkJCSAgICAgT0VNX0RBVEFfUkVRX1NJWkUpOworCisJCXBNYWMtPm9lbURhdGEub2VtRGF0YVJlcUFjdGl2ZSA9IGZhbHNlOworCisJCXBPZW1EYXRhQ21kID0gc21lX2dldF9jb21tYW5kX2J1ZmZlcihwTWFjKTsKKworCQkvKiBmaWxsIHVwIHRoZSBjb21tYW5kIGJlZm9yZSBwb3N0aW5nIGl0LiAqLworCQlpZiAocE9lbURhdGFDbWQpIHsKKwkJCXBPZW1EYXRhQ21kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRPZW1EYXRhUmVxOworCQkJcE9lbURhdGFDbWQtPnUub2VtRGF0YUNtZC5jYWxsYmFjayA9IGNhbGxiYWNrOworCQkJcE9lbURhdGFDbWQtPnUub2VtRGF0YUNtZC5wQ29udGV4dCA9IHBDb250ZXh0OworCQkJcE9lbURhdGFDbWQtPnUub2VtRGF0YUNtZC5vZW1EYXRhUmVxSUQgPQorCQkJCXBNYWMtPm9lbURhdGEub2VtRGF0YVJlcUlEOworCisJCQkvKiBzZXQgdGhlIG9lbSBkYXRhIHJlcXVlc3QgKi8KKwkJCXBPZW1EYXRhQ21kLT51Lm9lbURhdGFDbWQub2VtRGF0YVJlcS5zZXNzaW9uSWQgPQorCQkJCXBNYWMtPm9lbURhdGEub2VtRGF0YVJlcUNvbmZpZy5zZXNzaW9uSWQ7CisJCQljZGZfbWVtX2NvcHkoKHZvaWQgKikocE9lbURhdGFDbWQtPnUub2VtRGF0YUNtZC4KKwkJCQkJICAgICAgb2VtRGF0YVJlcS5vZW1EYXRhUmVxKSwKKwkJCQkgICAgICh2b2lkICopKHBNYWMtPm9lbURhdGEub2VtRGF0YVJlcUNvbmZpZy4KKwkJCQkJICAgICAgb2VtRGF0YVJlcSksIE9FTV9EQVRBX1JFUV9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBub3cgcXVldWUgdGhpcyBjb21tYW5kIGluIHRoZSBzbWUgY29tbWFuZCBxdWV1ZSAqLworCQkvKiBIZXJlIHNpbmNlIHRoaXMgaXMgbm90IGludGVyYWN0aW5nIHdpdGggdGhlIGNzciBqdXN0IHB1c2ggdGhlIGNvbW1hbmQgKi8KKwkJLyogaW50byB0aGUgc21lIHF1ZXVlLiBBbHNvIHB1c2ggdGhpcyBjb21tYW5kIHdpdGggdGhlIG5vcm1hbCBwcmlvcml0eSAqLworCQlzbWVfcHVzaF9jb21tYW5kKHBNYWMsIHBPZW1EYXRhQ21kLCBmYWxzZSk7CisKKwl9IHdoaWxlICgwKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgJiYgcE9lbURhdGFDbWQpIHsKKwkJb2VtX2RhdGFfcmVsZWFzZV9vZW1fZGF0YV9yZXFfY29tbWFuZChwTWFjLCBwT2VtRGF0YUNtZCwKKwkJCQkJCSAgICAgIGVPRU1fREFUQV9SRVFfRkFJTFVSRSk7CisJCXBNYWMtPm9lbURhdGEub2VtRGF0YVJlcUFjdGl2ZSA9IGZhbHNlOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBvZW1fZGF0YV9zZW5kX21iX29lbV9kYXRhX3JlcQorICAgIFxicmllZiBSZXF1ZXN0IGFuIE9FTSBEQVRBIFJFUSB0byBiZSBwYXNzZWQgZG93biB0byBQRQorICAgIFxwYXJhbSBwTWFjOgorICAgIFxwYXJhbSBwT2VtRGF0YVJlcTogUG9pbnRlciB0byB0aGUgb2VtIGRhdGEgcmVxdWVzdAorICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIG9lbV9kYXRhX3NlbmRfbWJfb2VtX2RhdGFfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSB0T2VtRGF0YVJlcSAqcE9lbURhdGFSZXEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNpck9lbURhdGFSZXEgKnBNc2c7CisJdWludDE2X3QgbXNnTGVuOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPQorCQlDU1JfR0VUX1NFU1NJT04ocE1hYywgcE9lbURhdGFSZXEtPnNlc3Npb25JZCk7CisKKwlzbXNfbG9nKHBNYWMsIExPR1csICJPRU1fREFUQTogZW50ZXJpbmcgRnVuY3Rpb24gJXMiLCBfX2Z1bmNfXyk7CisKKwltc2dMZW4gPSAodWludDE2X3QpIChzaXplb2YodFNpck9lbURhdGFSZXEpKTsKKworCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhtc2dMZW4pOworCWlmIChOVUxMID09IHBNc2cpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dQLCBGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwljZGZfbWVtX3NldChwTXNnLCBtc2dMZW4sIDApOworCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfT0VNX0RBVEFfUkVROworCXBNc2ctPm1lc3NhZ2VMZW4gPSBtc2dMZW47CisJY2RmX21lbV9jb3B5KHBNc2ctPnNlbGZNYWNBZGRyLCBwU2Vzc2lvbi0+c2VsZk1hY0FkZHIuYnl0ZXMsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJY2RmX21lbV9jb3B5KHBNc2ctPm9lbURhdGFSZXEsIHBPZW1EYXRhUmVxLT5vZW1EYXRhUmVxLAorCQkgICAgIE9FTV9EQVRBX1JFUV9TSVpFKTsKKwlzbXNfbG9nKHBNYWMsIExPR1csICJPRU1fREFUQTogc2VuZGluZyBtZXNzYWdlIHRvIHBlJXMiLCBfX2Z1bmNfXyk7CisJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisKKwlzbXNfbG9nKHBNYWMsIExPR1csICJPRU1fREFUQTogZXhpdGluZyBGdW5jdGlvbiAlcyIsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogb2VtX2RhdGFfcHJvY2Vzc19vZW1fZGF0YV9yZXFfY29tbWFuZCgpIC0gcHJvY2VzcyBvZW0gZGF0YSByZXF1ZXN0IGNvbW1hbmQKKyAqIEBwTWFjOiBNYWMgY29udGV4dAorICogQHBPZW1EYXRhUmVxQ21kOiBwb2ludGVyIHRvIG9lbSBkYXRhIHJlcXVlc3QgY29tbWFuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzbWVfcHJvY2Vzc19jb21tYW5kIHdoZW4gdGhlIGNhc2UgaGl0cworICogZVNtZUNvbW1hbmRPZW1EYXRhUmVxLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIG9lbV9kYXRhX3Byb2Nlc3Nfb2VtX2RhdGFfcmVxX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSB0U21lQ21kICpwT2VtRGF0YVJlcUNtZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCS8qIGNoZWNrIGlmIHRoZSBzeXN0ZW0gaXMgaW4gcHJvcGVyIG1vZGUgb2Ygb3BlcmF0aW9uIGZvcgorCSAqIG9lbSBkYXRhIHJlcS9yc3AgdG8gYmUgZnVuY3Rpb25hbC4gQ3VycmVudGx5LCBjb25jdXJyZW5jeSBpcyBub3QKKwkgKiBzdXBwb3J0ZWQgYW5kIHRoZSBkcml2ZXIgbXVzdCBiZSBvcGVyYXRpb25hbCBvbmx5IGFzCisJICogU1RBIGZvciBvZW0gZGF0YSByZXEvcnNwIHRvIGJlIGZ1bmN0aW9uYWwuIFdlIHJldHVybiBhbiBpbnZhbGlkCisJICogbW9kZSBmbGFnIGlmIGl0IGlzIG9wZXJhdGlvbmFsIGFzIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZworCSAqIGluIGFueSBvZiB0aGUgYWN0aXZlIHNlc3Npb25zCisJICogMS4gQVAgTW9kZQorCSAqIDIuIElCU1MgTW9kZQorCSAqIDMuIEJUQU1QIE1vZGUKKwkgKi8KKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgPT0gb2VtX2RhdGFfaXNfb2VtX2RhdGFfcmVxX2FsbG93ZWQocE1hYykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLAorCQkJRkwoIk9FTV9EQVRBIFJFUSBhbGxvd2VkIGluIHRoZSBjdXJyZW50IG1vZGUiKSk7CisJCXBNYWMtPm9lbURhdGEub2VtRGF0YVJlcUFjdGl2ZSA9IHRydWU7CisJCXN0YXR1cyA9IG9lbV9kYXRhX3NlbmRfbWJfb2VtX2RhdGFfcmVxKHBNYWMsCisJCQkJJihwT2VtRGF0YVJlcUNtZC0+dS5vZW1EYXRhQ21kLm9lbURhdGFSZXEpKTsKKwl9IGVsc2UgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQlGTCgiT0VNX0RBVEEgUkVRIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50IG1vZGUiKSk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiT0VNX0RBVEEgRmFpbHVyZSwgUmVsZWFzZSBjb21tYW5kIikpOworCQlvZW1fZGF0YV9yZWxlYXNlX29lbV9kYXRhX3JlcV9jb21tYW5kKHBNYWMsIHBPZW1EYXRhUmVxQ21kLAorCQkJCWVPRU1fREFUQV9SRVFfSU5WQUxJRF9NT0RFKTsKKwkJcE1hYy0+b2VtRGF0YS5vZW1EYXRhUmVxQWN0aXZlID0gZmFsc2U7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfaGFuZGxlX29lbV9kYXRhX3JzcCgpIC0gcHJvY2Vzc2VzIHRoZSBvZW0gZGF0YSByZXNwb25zZQorICogQGhIYWw6ICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAqIEBwTXNnOiAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBwU2lyT2VtRGF0YVJzcAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBvZW0gZGF0YSByZXNwb25zZSBvYnRhaW5lZCBmcm9tIHRoZSBQRQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUy4KKyAqLworQ0RGX1NUQVRVUyBzbWVfaGFuZGxlX29lbV9kYXRhX3JzcCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgKnBNc2cpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYzsKKwl0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisJdFNtZUNtZCAqcENvbW1hbmQgPSBOVUxMOworCXRTaXJPZW1EYXRhUnNwICpwT2VtRGF0YVJzcCA9IE5VTEw7CisJdWludDMyX3QgKm1zZ1N1YlR5cGU7CisKKwlwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlzbXNfbG9nKHBNYWMsIExPRzEsICIlczogT0VNX0RBVEEgRW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlkbyB7CisJCWlmIChwTXNnID09IE5VTEwpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HRSwgImluICVzIG1zZyBwdHIgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBJbiB0aGlzIGNhc2UsIHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBPRU0gRGF0YSBSZXNwb25zZXMgZm9yIG9uZQorCQkgKiBPRU0gRGF0YSByZXF1ZXN0LCBTTUUgZG9lcyBub3QgcGVlayBpbnRvIGRhdGEgcmVzcG9uc2Ugc28gU01FCisJCSAqIGNhbiBub3Qga25vdyB3aGljaCByZXNwb25zZSBpcyB0aGUgbGFzdCBvbmUuIFNvIFNNRSBjbGVhcnMgYWN0aXZlCisJCSAqIHJlcXVlc3QgY29tbWFuZCBvbiByZWNlaXZpbmcgZmlyc3QgcmVzcG9uc2UgYW5kIHRoZXJlYWZ0ZXIgU01FCisJCSAqIHBhc3NlcyBlYWNoIHN1bnNlcXVlbnQgcmVzcG9uc2UgdG8gdXBwZXIgdXNlciBsYXllci4KKwkJICovCisJCXBFbnRyeSA9CisJCQljc3JfbGxfcGVla19oZWFkKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0spOworCQlpZiAocEVudHJ5KSB7CisJCQlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJCWlmIChlU21lQ29tbWFuZE9lbURhdGFSZXEgPT0gcENvbW1hbmQtPmNvbW1hbmQpIHsKKwkJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeQorCQkJCQkgICAgKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwKKwkJCQkJICAgICZwQ29tbWFuZC0+TGluaywgTExfQUNDRVNTX0xPQ0spKSB7CisJCQkJCWNkZl9tZW1fc2V0KCYocENvbW1hbmQtPnUub2VtRGF0YUNtZCksCisJCQkJCQkgICAgc2l6ZW9mKHRPZW1EYXRhQ21kKSwgMCk7CisJCQkJCXNtZV9yZWxlYXNlX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXBPZW1EYXRhUnNwID0gKHRTaXJPZW1EYXRhUnNwICopIHBNc2c7CisKKwkJLyogY2hlY2sgaWYgbWVzc2FnZSBpcyB0byBiZSBmb3J3YXJkZWQgdG8gb2VtIGFwcGxpY2F0aW9uIG9yIG5vdCAqLworCQltc2dTdWJUeXBlID0gKHVpbnQzMl90ICopICgmcE9lbURhdGFSc3AtPm9lbURhdGFSc3BbMF0pOworCQlpZiAoKm1zZ1N1YlR5cGUgIT0gT0VNX01FU1NBR0VfU1VCVFlQRV9JTlRFUk5BTCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICIlczogY2FsbGluZyBzZW5kX29lbV9kYXRhX3JzcF9tc2csIG1zZ1N1YlR5cGUoMHgleCkiLAorCQkJCSAgX19mdW5jX18sICptc2dTdWJUeXBlKTsKKwkJCWlmIChwTWFjLT5vZW1EYXRhLm9lbV9kYXRhX3JzcF9jYWxsYmFjayAhPSBOVUxMKSB7CisJCQkJcE1hYy0+b2VtRGF0YS5vZW1fZGF0YV9yc3BfY2FsbGJhY2soCisJCQkJCQlzaXplb2YodE9lbURhdGFSc3ApLAorCQkJCQkJJnBPZW1EYXRhUnNwLT5vZW1EYXRhUnNwWzBdKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiByZWNlaXZlZCBpbnRlcm5hbCBvZW0gZGF0YSByZXNwLCBtc2dTdWJUeXBlICgweCV4KSIsCisJCQkJICBfX2Z1bmNfXywgKm1zZ1N1YlR5cGUpOworCX0gd2hpbGUgKDApOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIG9lbV9kYXRhX2lzX29lbV9kYXRhX3JlcV9hbGxvd2VkCisgICAgXGJyaWVmIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIE9FTSBEQVRBIFJFUXMgY2FuIGJlIHBlcmZvcm1lZCBpbiB0aGUKKyAgICAgICAgICAgY3VycmVudCBkcml2ZXIgc3RhdGUKKyAgICBccmV0dXJuIENERl9TVEFUVVMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBvZW1fZGF0YV9pc19vZW1fZGF0YV9yZXFfYWxsb3dlZCh0SGFsSGFuZGxlIGhIYWwpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdWludDMyX3Qgc2Vzc2lvbklkOworCisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJZm9yIChzZXNzaW9uSWQgPSAwOyBzZXNzaW9uSWQgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgc2Vzc2lvbklkKyspIHsKKwkJaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCS8qIGNvLWV4aXN0IHdpdGggSUJTUyBvciBCVC1BTVAgbW9kZSBpcyBub3Qgc3VwcG9ydGVkICovCisJCQlpZiAoY3NyX2lzX2Nvbm5fc3RhdGVfaWJzcyhwTWFjLCBzZXNzaW9uSWQpCisJCQkgICAgfHwgY3NyX2lzX2J0YW1wKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJCQkvKiBjby1leGlzdCB3aXRoIElCU1Mgb3IgQlQtQU1QIG1vZGUgaXMgbm90IHN1cHBvcnRlZCAqLworCQkJCXNtc19sb2cocE1hYywgTE9HVywKKwkJCQkJIk9FTSBEQVRBIFJFUSBpcyBub3QgYWxsb3dlZCBkdWUgdG8gSUJTU3xCVEFNUCBleGlzdCBpbiBzZXNzaW9uICVkIiwKKwkJCQkJc2Vzc2lvbklkKTsKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0NTUl9XUk9OR19TVEFURTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXNtc19sb2cocE1hYywgTE9HMSwgIkV4aXRpbmcgb2VtX2RhdGFfaXNfb2VtX2RhdGFfcmVxX2FsbG93ZWQgd2l0aCBzdGF0dXMgJWQiLAorCQlzdGF0dXMpOworCisJcmV0dXJuIChzdGF0dXMpOworfQorCisjZW5kaWYgLypGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc21lL3NyYy9wMnAvcDJwX2FwaS5jIGIvY29yZS9zbWUvc3JjL3AycC9wMnBfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4Yjc0MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc21lL3NyYy9wMnAvcDJwX2FwaS5jCkBAIC0wLDAgKzEsNDE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAic21lX2FwaS5oIgorI2luY2x1ZGUgInNtc19kZWJ1Zy5oIgorI2luY2x1ZGUgImNzcl9pbnNpZGVfYXBpLmgiCisjaW5jbHVkZSAic21lX2luc2lkZS5oIgorI2luY2x1ZGUgInAycF9hcGkuaCIKKyNpbmNsdWRlICJsaW1fYXBpLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgIndtYS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGhhbmRsZSBTTUUgcmVtYWluIG9uIGNoYW5uZWwgcmVxdWVzdC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NERl9TVEFUVVMgcDJwX3Byb2Nlc3NfcmVtYWluX29uX2NoYW5uZWxfY21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgdFNtZUNtZCAqcDJwUmVtYWlub25DaG4pCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0U2lyUmVtYWluT25DaG5SZXEgKnBNc2c7CisJdWludDMyX3QgbGVuOworCXRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPQorCQlDU1JfR0VUX1NFU1NJT04ocE1hYywgcDJwUmVtYWlub25DaG4tPnNlc3Npb25JZCk7CisKKwlpZiAoIXBTZXNzaW9uKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBub3QgZm91bmQgIiksCisJCQlwMnBSZW1haW5vbkNobi0+c2Vzc2lvbklkKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoIXBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCUZMKCIgIHNlc3Npb24gJWQgaXMgaW52YWxpZCBvciBsaXN0ZW4gaXMgZGlzYWJsZWQgIiksCisJCQlwMnBSZW1haW5vbkNobi0+c2Vzc2lvbklkKTsKKwkJZ290byBlcnJvcjsKKwl9CisJbGVuID0gc2l6ZW9mKHRTaXJSZW1haW5PbkNoblJlcSkgKyBwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWVMZW5ndGg7CisKKwlpZiAobGVuID4gMHhGRkZGKSB7CisJCS8qSW4gY29taW5nIGxlbiBmb3IgTXNnIGlzIG1vcmUgdGhlbiAxNmJpdCB2YWx1ZSAqLworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCIgIE1lc3NhZ2UgbGVuZ3RoIGlzIHZlcnkgbGFyZ2UsICVkIiksCisJCQlsZW4pOworCQlnb3RvIGVycm9yOworCX0KKworCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCWlmIChOVUxMID09IHBNc2cpCisJCWdvdG8gZXJyb3I7CisJZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlcyBjYWxsIiwKKwkJCSAgX19mdW5jX18pOworCQljZGZfbWVtX3NldChwTXNnLCBzaXplb2YodFNpclJlbWFpbk9uQ2huUmVxKSwgMCk7CisJCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfUkVNQUlOX09OX0NIQU5ORUxfUkVROworCQlwTXNnLT5sZW5ndGggPSAodWludDE2X3QpIGxlbjsKKwkJY2RmX21lbV9jb3B5KHBNc2ctPnNlbGZNYWNBZGRyLCBwU2Vzc2lvbi0+c2VsZk1hY0FkZHIuYnl0ZXMsCisJCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCQlwTXNnLT5jaG5OdW0gPSBwMnBSZW1haW5vbkNobi0+dS5yZW1haW5DaGxDbWQuY2huOworCQlwTXNnLT5waHlNb2RlID0gcDJwUmVtYWlub25DaG4tPnUucmVtYWluQ2hsQ21kLnBoeU1vZGU7CisJCXBNc2ctPmR1cmF0aW9uID0gcDJwUmVtYWlub25DaG4tPnUucmVtYWluQ2hsQ21kLmR1cmF0aW9uOworCQlwTXNnLT5zZXNzaW9uSWQgPSBwMnBSZW1haW5vbkNobi0+c2Vzc2lvbklkOworCQlwTXNnLT5pc1Byb2JlUmVxdWVzdEFsbG93ZWQgPQorCQkJcDJwUmVtYWlub25DaG4tPnUucmVtYWluQ2hsQ21kLmlzUDJQUHJvYmVSZXFBbGxvd2VkOworCQlwTXNnLT5zY2FuX2lkID0gcDJwUmVtYWlub25DaG4tPnUucmVtYWluQ2hsQ21kLnNjYW5faWQ7CisJCWlmIChwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWVMZW5ndGgpCisJCQljZGZfbWVtX2NvcHkoKHZvaWQgKilwTXNnLT5wcm9iZVJzcEllLAorCQkJCSAgICAgKHZvaWQgKilwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWUsCisJCQkJICAgICBwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWVMZW5ndGgpOworCQlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKwl9CitlcnJvcjoKKwlpZiAoQ0RGX1NUQVRVU19FX0ZBSUxVUkUgPT0gc3RhdHVzKQorCQljc3JfcmVsZWFzZV9yb2NfcmVxX2NtZChwTWFjKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGhhbmRsZSBMSU0gcmVtYWluIG9uIGNoYW5uZWwgcnNwOiBTdWNjZXNzL2ZhaWx1cmUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitDREZfU1RBVFVTIHNtZV9yZW1haW5fb25fY2huX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90ICpwTXNnKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKwl0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisJYm9vbCBmRm91bmQ7CisJcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2sgPSBOVUxMOworCXN0cnVjdCBzaXJfcm9jX3JzcCAqcnNwID0gKHN0cnVjdCBzaXJfcm9jX3JzcCAqKXBNc2c7CisKKwljc3JfZ2V0X2FjdGl2ZV9zY2FuX2VudHJ5KHBNYWMsIHJzcC0+c2Nhbl9pZCwgJnBFbnRyeSk7CisJaWYgKCFwRW50cnkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiTm8gY21kIGZvdW5kIGluIGFjdGl2ZSBsaXN0LiIpKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwlpZiAoZVNtZUNvbW1hbmRSZW1haW5PbkNoYW5uZWwgIT0gcENvbW1hbmQtPmNvbW1hbmQpCisJCXJldHVybiBzdGF0dXM7CisKKwljYWxsYmFjayA9IHBDb21tYW5kLT51LnJlbWFpbkNobENtZC5jYWxsYmFjazsKKwlpZiAoY2FsbGJhY2spCisJCWNhbGxiYWNrKHBNYWMsIHBDb21tYW5kLT51LnJlbWFpbkNobENtZC5jYWxsYmFja0N0eCwKKwkJCXJzcC0+c3RhdHVzLCByc3AtPnNjYW5faWQpOworCisJZkZvdW5kID0gY3NyX2xsX3JlbW92ZV9lbnRyeSgmcE1hYy0+c21lLnNtZVNjYW5DbWRBY3RpdmVMaXN0LCBwRW50cnksCisJCQkJICAgICBMTF9BQ0NFU1NfTE9DSyk7CisJaWYgKGZGb3VuZCkgeworCQkvKiBOb3cgcHV0IHRoaXMgY29tbWFuZCBiYWNrIG9uIHRoZSBhdmlsYWJsZSBjb21tYW5kIGxpc3QgKi8KKwkJc21lX3JlbGVhc2VfY29tbWFuZChwTWFjLCBwQ29tbWFuZCk7CisJfQorCXNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUocE1hYyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBIYW5kbGUgdGhlIE1nbXQgZnJtIGluZCBmcm9tIExJTSBhbmQgZm9yd2FyZCB0byBIREQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitDREZfU1RBVFVTIHNtZV9tZ210X2ZybV9pbmQodEhhbEhhbmRsZSBoSGFsLCB0cFNpclNtZU1nbXRGcmFtZUluZCBwU21lTWdtdEZybSkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdENzclJvYW1JbmZvIHBSb2FtSW5mbyA9IHsgMCB9OworCXVpbnQ4X3QgaSA9IDA7CisJdWludDMyX3QgU2Vzc2lvbklkID0gcFNtZU1nbXRGcm0tPnNlc3Npb25JZDsKKworCXBSb2FtSW5mby5uRnJhbWVMZW5ndGggPQorCQlwU21lTWdtdEZybS0+bWVzZ0xlbiAtIHNpemVvZih0U2lyU21lTWdtdEZyYW1lSW5kKTsKKwlwUm9hbUluZm8ucGJGcmFtZXMgPSBwU21lTWdtdEZybS0+ZnJhbWVCdWY7CisJcFJvYW1JbmZvLmZyYW1lVHlwZSA9IHBTbWVNZ210RnJtLT5mcmFtZVR5cGU7CisJcFJvYW1JbmZvLnJ4Q2hhbiA9IHBTbWVNZ210RnJtLT5yeENoYW47CisJcFJvYW1JbmZvLnJ4UnNzaSA9IHBTbWVNZ210RnJtLT5yeFJzc2k7CisJaWYgKENTUl9JU19TRVNTSU9OX0FOWShTZXNzaW9uSWQpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrKSB7CisJCQlpZiAoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgaSkpIHsKKwkJCQlTZXNzaW9uSWQgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPT0gQ1NSX1JPQU1fU0VTU0lPTl9NQVgpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiTm8gdmFsaWQgc2Vzc2lvbnMgZm91bmQuIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIGZvcndhcmQgdGhlIG1nbXQgZnJhbWUgdG8gSEREICovCisJY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhwTWFjLCBTZXNzaW9uSWQsICZwUm9hbUluZm8sIDAsCisJCQkgICAgICAgZUNTUl9ST0FNX0lORElDQVRFX01HTVRfRlJBTUUsIDApOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBIYW5kbGUgdGhlIHJlbWFpbiBvbiBjaGFubmVsIHJlYWR5IGluZGljYXRpb24gZnJvbSBQRQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ0RGX1NUQVRVUyBzbWVfcmVtYWluX29uX2Nobl9yZWFkeSh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgKnBNc2cpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKwl0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisJdENzclJvYW1JbmZvIFJvYW1JbmZvOworCXN0cnVjdCBzaXJfcm9jX3JzcCAqcnNwID0gIChzdHJ1Y3Qgc2lyX3JvY19yc3AgKilwTXNnOworCisJY3NyX2dldF9hY3RpdmVfc2Nhbl9lbnRyeShwTWFjLCByc3AtPnNjYW5faWQsICZwRW50cnkpOworCWlmICghcEVudHJ5KSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIk5vIGNtZCBmb3VuZCBpbiBhY3RpdmUgbGlzdC4iKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXNtc19sb2cocE1hYywgTE9HMSwKKwkJRkwoIlJlYWR5IEluZCAlZCAlZCIpLCByc3AtPnNlc3Npb25faWQsIHJzcC0+c2Nhbl9pZCk7CisJcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisJaWYgKGVTbWVDb21tYW5kUmVtYWluT25DaGFubmVsID09IHBDb21tYW5kLT5jb21tYW5kKSB7CisJCVJvYW1JbmZvLnJvY19zY2FuX2lkID0gcnNwLT5zY2FuX2lkOworCQkvKiBmb3J3YXJkIHRoZSBpbmRpY2F0aW9uIHRvIEhERCAqLworCQlSb2FtSW5mby5wUmVtYWluQ3R4ID0gcENvbW1hbmQtPnUucmVtYWluQ2hsQ21kLmNhbGxiYWNrQ3R4OworCQljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHJzcC0+c2Vzc2lvbl9pZCwKKwkJCQkgICAgICAgJlJvYW1JbmZvLCAwLAorCQkJCSAgICAgICBlQ1NSX1JPQU1fUkVNQUlOX0NIQU5fUkVBRFksIDApOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgc21lX3NlbmRfYWN0aW9uX2NuZih0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3QgKnBNc2cpCit7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRDc3JSb2FtSW5mbyBSb2FtSW5mbzsKKwl0U2lyU21lUnNwICpwU21lUnNwID0gKHRTaXJTbWVSc3AgKikgcE1zZzsKKworCS8qIGZvcndhcmQgdGhlIGluZGljYXRpb24gdG8gSEREICovCisJLyogUm9hbUluZm8gY2FuIGJlIHBhc3NlZCBhcyBOVUxMLi4uLnRvZG8gKi8KKwljc3Jfcm9hbV9jYWxsX2NhbGxiYWNrKHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCwgJlJvYW1JbmZvLCAwLAorCQkJICAgICAgIGVDU1JfUk9BTV9TRU5EX0FDVElPTl9DTkYsCisJCQkgICAgICAgKHBTbWVSc3AtPnN0YXR1c0NvZGUgPT0gZVNJUl9TTUVfU1VDQ0VTUykgPyAwIDoKKwkJCSAgICAgICBlQ1NSX1JPQU1fUkVTVUxUX1NFTkRfQUNUSU9OX0ZBSUwpOworCXJldHVybiBzdGF0dXM7Cit9CisKK0NERl9TVEFUVVMgc21lX3AycF9vcGVuKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkvKiBJZiBzdGF0aWMgc3RydWN0dXJlIGlzIHRvbyBiaWcsIE5lZWQgdG8gY2hhbmdlIHRoaXMgZnVuY3Rpb24gdG8gYWxsb2NhdGUgbWVtb3J5IGR5bmFtaWNhbGx5ICovCisJY2RmX21lbV96ZXJvKCZwTWFjLT5wMnBDb250ZXh0LCBzaXplb2YodHAycENvbnRleHQpKTsKKworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJc21lX3AycF9jbG9zZShoSGFsKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIHAycF9zdG9wKHRIYWxIYW5kbGUgaEhhbCkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKwlpZiAocE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllKSB7CisJCWNkZl9tZW1fZnJlZShwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWUpOworCQlwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWUgPSBOVUxMOworCX0KKworCXBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZUxlbmd0aCA9IDA7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCitDREZfU1RBVFVTIHNtZV9wMnBfY2xvc2UodEhhbEhhbmRsZSBoSGFsKQoreworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworCWlmIChwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWUpIHsKKwkJY2RmX21lbV9mcmVlKHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSk7CisJCXBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSA9IE5VTEw7CisJfQorCisJcE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllTGVuZ3RoID0gMDsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3RTaXJSRkJhbmQgZ2V0X3JmX2JhbmQodWludDhfdCBjaGFubmVsKQoreworCWlmICgoY2hhbm5lbCA+PSBTSVJfMTFBX0NIQU5ORUxfQkVHSU4pICYmCisJICAgIChjaGFubmVsIDw9IFNJUl8xMUFfQ0hBTk5FTF9FTkQpKQorCQlyZXR1cm4gU0lSX0JBTkRfNV9HSFo7CisKKwlpZiAoKGNoYW5uZWwgPj0gU0lSXzExQl9DSEFOTkVMX0JFR0lOKSAmJgorCSAgICAoY2hhbm5lbCA8PSBTSVJfMTFCX0NIQU5ORUxfRU5EKSkKKwkJcmV0dXJuIFNJUl9CQU5EXzJfNF9HSFo7CisKKwlyZXR1cm4gU0lSX0JBTkRfVU5LTk9XTjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gcDJwX3JlbWFpbl9vbl9jaGFubmVsCisgICAgXGJyaWVmICBBUEkgdG8gcG9zdCB0aGUgcmVtYWluIG9uIGNoYW5uZWwgY29tbWFuZC4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICAgIFxwYXJhbSAgc2Vzc2luSWQgLSBIREQgc2Vzc2lvbiBJRC4KKyAgICBccGFyYW0gIGNoYW5uZWwgLSBDaGFubmVsIHRvIHJlbWFpbiBvbiBjaGFubmVsLgorICAgIFxwYXJhbSAgZHVyYXRpb24gLSBEdXJhdGlvbiBmb3Igd2hpY2ggd2Ugc2hvdWxkIHJlbWFpbiBvbiBjaGFubmVsCisgICAgXHBhcmFtICBjYWxsYmFjayAtIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIFxwYXJhbSAgcENvbnRleHQgLSBhcmd1bWVudCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHAycF9yZW1haW5fb25fY2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCSB1aW50OF90IGNoYW5uZWwsIHVpbnQzMl90IGR1cmF0aW9uLAorCQkJCSByZW1haW5PbkNoYW5DYWxsYmFjayBjYWxsYmFjaywKKwkJCQkgdm9pZCAqcENvbnRleHQsIHVpbnQ4X3QgaXNQMlBQcm9iZVJlcUFsbG93ZWQsCisJCQkJIHVpbnQzMl90IHNjYW5faWQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXRTbWVDbWQgKnBSZW1haW5DaGxDbWQgPSBOVUxMOworCXVpbnQzMl90IHBoeU1vZGU7CisKKwlwUmVtYWluQ2hsQ21kID0gc21lX2dldF9jb21tYW5kX2J1ZmZlcihwTWFjKTsKKwlpZiAocFJlbWFpbkNobENtZCA9PSBOVUxMKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlpZiAoU0lSX0JBTkRfNV9HSFogPT0gZ2V0X3JmX2JhbmQoY2hhbm5lbCkpIHsKKwkJcGh5TW9kZSA9IFdOSV9DRkdfUEhZX01PREVfMTFBOworCX0gZWxzZSB7CisJCXBoeU1vZGUgPSBXTklfQ0ZHX1BIWV9NT0RFXzExRzsKKwl9CisKKwljZmdfc2V0X2ludChwTWFjLCBXTklfQ0ZHX1BIWV9NT0RFLCBwaHlNb2RlKTsKKworCWRvIHsKKwkJLyogY2FsbCBzZXQgaW4gY29udGV4dCAqLworCQlwUmVtYWluQ2hsQ21kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRSZW1haW5PbkNoYW5uZWw7CisJCXBSZW1haW5DaGxDbWQtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJcFJlbWFpbkNobENtZC0+dS5yZW1haW5DaGxDbWQuY2huID0gY2hhbm5lbDsKKwkJcFJlbWFpbkNobENtZC0+dS5yZW1haW5DaGxDbWQuZHVyYXRpb24gPSBkdXJhdGlvbjsKKwkJcFJlbWFpbkNobENtZC0+dS5yZW1haW5DaGxDbWQuaXNQMlBQcm9iZVJlcUFsbG93ZWQgPQorCQkJaXNQMlBQcm9iZVJlcUFsbG93ZWQ7CisJCXBSZW1haW5DaGxDbWQtPnUucmVtYWluQ2hsQ21kLmNhbGxiYWNrID0gY2FsbGJhY2s7CisJCXBSZW1haW5DaGxDbWQtPnUucmVtYWluQ2hsQ21kLmNhbGxiYWNrQ3R4ID0gcENvbnRleHQ7CisJCXBSZW1haW5DaGxDbWQtPnUucmVtYWluQ2hsQ21kLnNjYW5faWQgPSBzY2FuX2lkOworCisJCS8qIFB1dCBpdCBhdCB0aGUgaGVhZCBvZiB0aGUgUSBpZiB3ZSBqdXN0IGZpbmlzaCBmaW5kaW5nIHRoZSBwZWVyIGFuZCByZWFkeSB0byBzZW5kIGEgZnJhbWUgKi8KKwkJc3RhdHVzID0gY3NyX3F1ZXVlX3NtZV9jb21tYW5kKHBNYWMsIHBSZW1haW5DaGxDbWQsIGZhbHNlKTsKKwl9IHdoaWxlICgwKTsKKworCXNtc19sb2cocE1hYywgTE9HVywgImV4aXRpbmcgZnVuY3Rpb24gJXMiLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKK0NERl9TVEFUVVMgcDJwX3NlbmRfYWN0aW9uKHRIYWxIYW5kbGUgaEhhbCwgdWludDhfdCBzZXNzaW9uSWQsCisJCQkgICBjb25zdCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4sIHVpbnQxNl90IHdhaXQsCisJCQkgICBib29sIG5vYWNrLCB1aW50MTZfdCBjaGFubmVsX2ZyZXEpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdFNpck1iTXNnUDJwICpwTXNnOworCXVpbnQxNl90IG1zZ0xlbjsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkgICIgJXMgc2VuZHMgYWN0aW9uIGZyYW1lIiwgX19mdW5jX18pOworCW1zZ0xlbiA9ICh1aW50MTZfdCkgKChzaXplb2YodFNpck1iTXNnUDJwKSkgKyBsZW4pOworCXBNc2cgPSBjZGZfbWVtX21hbGxvYyhtc2dMZW4pOworCWlmIChOVUxMID09IHBNc2cpCisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwllbHNlIHsKKwkJY2RmX21lbV9zZXQoKHZvaWQgKilwTXNnLCBtc2dMZW4sIDApOworCQlwTXNnLT50eXBlID0gZVdOSV9TTUVfU0VORF9BQ1RJT05fRlJBTUVfSU5EOworCQlwTXNnLT5tc2dMZW4gPSBtc2dMZW47CisJCXBNc2ctPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJcE1zZy0+bm9hY2sgPSBub2FjazsKKwkJcE1zZy0+Y2hhbm5lbF9mcmVxID0gY2hhbm5lbF9mcmVxOworCQlwTXNnLT53YWl0ID0gKHVpbnQxNl90KSB3YWl0OworCQljZGZfbWVtX2NvcHkocE1zZy0+ZGF0YSwgcEJ1ZiwgbGVuKTsKKwkJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMocE1zZyk7CisJfQorCXJldHVybiAoc3RhdHVzKTsKK30KKworQ0RGX1NUQVRVUyBwMnBfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKHRIYWxIYW5kbGUgaEhhbCwKKwl1aW50OF90IHNlc3Npb25JZCwgdWludDMyX3Qgc2Nhbl9pZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U2lyTWJNc2dQMnAgKnBNc2c7CisJdWludDE2X3QgbXNnTGVuOworCisJLyogTmVlZCB0byBjaGVjayBzZXNzaW9uIElEIHRvIHN1cHBvcnQgY29uY3VycmVuY3kgKi8KKworCW1zZ0xlbiA9ICh1aW50MTZfdCkgKHNpemVvZih0U2lyTWJNc2dQMnApKTsKKwlwTXNnID0gY2RmX21lbV9tYWxsb2MobXNnTGVuKTsKKwlpZiAoTlVMTCA9PSBwTXNnKQorCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJZWxzZSB7CisJCWNkZl9tZW1fc2V0KCh2b2lkICopcE1zZywgbXNnTGVuLCAwKTsKKwkJcE1zZy0+dHlwZSA9IGVXTklfU01FX0FCT1JUX1JFTUFJTl9PTl9DSEFOX0lORDsKKwkJcE1zZy0+bXNnTGVuID0gbXNnTGVuOworCQlwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJCXBNc2ctPnNjYW5faWQgPSBzY2FuX2lkOworCQlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKK0NERl9TVEFUVVMgcDJwX3NldF9wcyh0SGFsSGFuZGxlIGhIYWwsIHRQMnBQc0NvbmZpZyAqcE5vQSkKK3sKKwl0cFAycFBzQ29uZmlnIHBOb0FQYXJhbTsKKwl0U2lyTXNnUSBtc2c7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisJcE5vQVBhcmFtID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRQMnBQc0NvbmZpZykpOworCWlmIChOVUxMID09IHBOb0FQYXJhbSkKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCWVsc2UgeworCQljZGZfbWVtX3NldChwTm9BUGFyYW0sIHNpemVvZih0UDJwUHNDb25maWcpLCAwKTsKKwkJY2RmX21lbV9jb3B5KHBOb0FQYXJhbSwgcE5vQSwgc2l6ZW9mKHRQMnBQc0NvbmZpZykpOworCQltc2cudHlwZSA9IGVXTklfU01FX1VQREFURV9OT0E7CisJCW1zZy5ib2R5dmFsID0gMDsKKwkJbXNnLmJvZHlwdHIgPSBwTm9BUGFyYW07CisJCWxpbV9wb3N0X21zZ19hcGkocE1hYywgJm1zZyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NtZS9zcmMvcW9zL3NtZV9xb3MuYyBiL2NvcmUvc21lL3NyYy9xb3Mvc21lX3Fvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDZmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9zcmMvcW9zL3NtZV9xb3MuYwpAQCAtMCwwICsxLDc4MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIHNtZV9xb3MuYworCisgICBcYnJpZWYgaW1wbGVtZW50YXRpb24gZm9yIFNNRSBRb1MgQVBJcworCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogJEhlYWRlciQgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisKKyNpbmNsdWRlICJzbWVfaW5zaWRlLmgiCisjaW5jbHVkZSAiaG9zdF9kaWFnX2NvcmVfZXZlbnQuaCIKKyNpbmNsdWRlICJob3N0X2RpYWdfY29yZV9sb2cuaCIKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSAic21zX2RlYnVnLmgiCisjaW5jbHVkZSAidXRpbHNfcGFyc2VyLmgiCisjZW5kaWYKKyNpbmNsdWRlICJzbWVfcG93ZXJfc2F2ZV9hcGkuaCIKKworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKy8qIFRPRE8gOiA2TWJwcyBhcyBDaXNjbyBBUHMgc2VlbSB0byBsaWtlIG9ubHkgdGhpcyB2YWx1ZTsgYW5hbHlzaXMgcmVxLiAgICovCisjZGVmaW5lIFNNRV9RT1NfTUlOX1BIWV9SQVRFICAgICAgICAgMHg1QjhEODAKKyNkZWZpbmUgU01FX1FPU19TVVJQTFVTX0JXX0FMTE9XQU5DRSAgMHgyMDAwICAgIC8qIFJhdGlvIG9mIDEuMCAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBNYXggdmFsdWVzIHRvIGJvdW5kIHRzcGVjIHBhcmFtcyBhZ2FpbnN0IGFuZCBhdm9pZCByb2xsb3ZlcgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU01FX1FPU18zMkJJVF9NQVggIDB4RkZGRkZGRkYKKyNkZWZpbmUgU01FX1FPU18xNkJJVF9NQVggIDB4RkZGRgorI2RlZmluZSBTTUVfUU9TXzE2QklUX01TQiAgMHg4MDAwCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgQWRkcyB5IHRvIHgsIGJ1dCBzYXR1cmF0ZXMgYXQgMzItYml0IG1heCB0byBhdm9pZCByb2xsb3ZlcgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU01FX1FPU19CT1VOREVEX1UzMl9BRERfWV9UT19YKF94LCBfeSkgXAorCWRvIHsgXAorCQkoX3gpID0gKChTTUVfUU9TXzMyQklUX01BWCAtIChfeCkpIDwgKF95KSkgPyBcCisJCSAgICAgICAoU01FX1FPU18zMkJJVF9NQVgpIDogKF94KSArIChfeSk7IFwKKwl9IHdoaWxlICgwKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgQXMgcGVyIFdNTSBzcGVjIHRoZXJlIGNvdWxkIGJlIG1heCAyIFRTUEVDIHJ1bm5pbmcgb24gdGhlIHNhbWUgQUMgd2l0aAorICAgZGlmZmVyZW50IGRpcmVjdGlvbi4gV2Ugd2lsbCByZWZlciBlYWNoIFRTUEVDIHdpdGggYW4gaW5kZXgKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNNRV9RT1NfVFNQRUNfSU5ERVhfMCAgICAgICAgICAgIDAKKyNkZWZpbmUgU01FX1FPU19UU1BFQ19JTkRFWF8xICAgICAgICAgICAgMQorI2RlZmluZSBTTUVfUU9TX1RTUEVDX0lOREVYX01BWCAgICAgICAgICAyCisjZGVmaW5lIFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV9TRVQgICAgIDEKKyNkZWZpbmUgU01FX1FPU19UU1BFQ19NQVNLX0JJVF8yX1NFVCAgICAgMgorI2RlZmluZSBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgICAzCisjZGVmaW5lIFNNRV9RT1NfVFNQRUNfTUFTS19DTEVBUiAgICAgICAgIDAKKworLyogd2hpY2gga2V5IHRvIHNlYXJjaCBvbiwgaW4gdGhlIGZsb3dsaXN0ICgxID0gZmxvd0lELCAyID0gQUMsIDQgPSByZWFzb24pICovCisjZGVmaW5lIFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8xICAgICAgIDEKKyNkZWZpbmUgU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzIgICAgICAgMgorI2RlZmluZSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfMyAgICAgICA0CisjZGVmaW5lIFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF80ICAgICAgIDggICAgICAvKiBhYyArIGRpcmVjdGlvbiAqLworI2RlZmluZSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfNSAgICAgICAweDEwICAgLyogYWMgKyB0c3BlY19tYXNrICovCisvKiBzcGVjaWFsIHZhbHVlIGZvciBzZWFyY2hpbmcgYW55IFNlc3Npb24gSWQgKi8KKyNkZWZpbmUgU01FX1FPU19TRUFSQ0hfU0VTU0lPTl9JRF9BTlkgICAgQ1NSX1JPQU1fU0VTU0lPTl9NQVgKKyNkZWZpbmUgU01FX1FPU19BQ0NFU1NfUE9MSUNZX0VEQ0EgICAgICAgMQorI2RlZmluZSBTTUVfUU9TX01BWF9USUQgICAgICAgICAgICAgICAgICAyNTUKKyNkZWZpbmUgU01FX1FPU19UU1BFQ19JRV9MRU5HVEggICAgICAgICAgNjEKKyNkZWZpbmUgU01FX1FPU19UU1BFQ19JRV9UWVBFICAgICAgICAgICAgMgorI2RlZmluZSBTTUVfUU9TX01JTl9GTE9XX0lEICAgICAgICAgICAgICAxCisjZGVmaW5lIFNNRV9RT1NfTUFYX0ZMT1dfSUQgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgU01FX1FPU19JTlZBTElEX0ZMT1dfSUQgICAgICAgICAgMHhGRkZGRkZGRgorLyogcGVyIHRoZSBXTU0gU3BlY2lmaWNhdGlvbiB2MS4yIFNlY3Rpb24gMi4yLjEwICovCisvKiBUaGUgRGlhbG9nIFRva2VuIGZpZWxkIHNoYWxsIGJlIHNldCBbLi4uXSB0byBhIG5vbi16ZXJvIHZhbHVlICovCisjZGVmaW5lIFNNRV9RT1NfTUlOX0RJQUxPR19UT0tFTiAgICAgICAgIDEKKyNkZWZpbmUgU01FX1FPU19NQVhfRElBTE9HX1RPS0VOICAgICAgICAgMHhGRgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgc3RhdGVzIGluIHRoZSBRb1Mgc3RhdGUgbS9jCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKwlTTUVfUU9TX0NMT1NFRCA9IDAsCisJU01FX1FPU19JTklULAorCVNNRV9RT1NfTElOS19VUCwKKwlTTUVfUU9TX1JFUVVFU1RFRCwKKwlTTUVfUU9TX1FPU19PTiwKKwlTTUVfUU9TX0hBTkRPRkYsCisKK30gc21lX1Fvc1N0YXRlczsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBFbnVtZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBSZWxlYXNlIFFvUyB0cmlnZ2VyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKwlTTUVfUU9TX1JFTEVBU0VfREVGQVVMVCA9IDAsCisJU01FX1FPU19SRUxFQVNFX0JZX0FQLAorfSBzbWVfUW9zUmVsVHJpZ2dlcnM7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgUW9TIGNtZHMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0geworCVNNRV9RT1NfU0VUVVBfUkVRID0gMCwKKwlTTUVfUU9TX1JFTEVBU0VfUkVRLAorCVNNRV9RT1NfTU9ESUZZX1JFUSwKKwlTTUVfUU9TX1JFU0VORF9SRVEsCisJU01FX1FPU19DTURfTUFYCit9IHNtZV9Rb3NDbWRUeXBlOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIFFvUyByZWFzb24gY29kZXMgdG8gYmUgdXNlZCBpbiB0aGUgRmxvdyBsaXN0CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKwlTTUVfUU9TX1JFQVNPTl9TRVRVUCA9IDAsCisJU01FX1FPU19SRUFTT05fUkVMRUFTRSwKKwlTTUVfUU9TX1JFQVNPTl9NT0RJRlksCisJU01FX1FPU19SRUFTT05fTU9ESUZZX1BFTkRJTkcsCisJU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1MsCisJU01FX1FPU19SRUFTT05fTUFYCit9IHNtZV9Rb3NSZWFzb25UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGFibGUgdG8gbWFwIHVzZXIgcHJpb3JpdHkgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50IHRvIGFwcHJvcHJpYXRlIEFjY2VzcworICAgQ2F0ZWdvcnkgYXMgc3BlY2lmaWVkIGluIDgwMi4xMWUvV01NCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc21lX1Fvc0VkY2FBY1R5cGUgc21lX3Fvc191X3B0b19hY19tYXBbU01FX1FPU19XTU1fVVBfTUFYXSA9IHsKKwlTTUVfUU9TX0VEQ0FfQUNfQkUsICAgICAvKiBVc2VyIFByaW9yaXR5IDAgKi8KKwlTTUVfUU9TX0VEQ0FfQUNfQkssICAgICAvKiBVc2VyIFByaW9yaXR5IDEgKi8KKwlTTUVfUU9TX0VEQ0FfQUNfQkssICAgICAvKiBVc2VyIFByaW9yaXR5IDIgKi8KKwlTTUVfUU9TX0VEQ0FfQUNfQkUsICAgICAvKiBVc2VyIFByaW9yaXR5IDMgKi8KKwlTTUVfUU9TX0VEQ0FfQUNfVkksICAgICAvKiBVc2VyIFByaW9yaXR5IDQgKi8KKwlTTUVfUU9TX0VEQ0FfQUNfVkksICAgICAvKiBVc2VyIFByaW9yaXR5IDUgKi8KKwlTTUVfUU9TX0VEQ0FfQUNfVk8sICAgICAvKiBVc2VyIFByaW9yaXR5IDYgKi8KKwlTTUVfUU9TX0VEQ0FfQUNfVk8gICAgICAvKiBVc2VyIFByaW9yaXR5IDcgKi8KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUYWJsZSB0byBtYXAgYWNjZXNzIGNhdGVnb3J5IChBQykgdG8gYXBwcm9wcmlhdGUgdXNlciBwcmlvcml0eSBhcyBzcGVjaWZpZWQKKyAgIGluIDgwMi4xMWUvV01NCisgICBOb3RlOiB0aGVyZSBpcyBhIHF1YW50aXphdGlvbiBsb3NzIGhlcmUgYmVjYXVzZSA0IEFDcyBhcmUgbWFwcGVkIHRvIDggVVBzCisgICBNYXBwaW5nIGlzIGRvbmUgZm9yIGNvbnNpc3RlbmN5CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc21lX1Fvc1dtbVVwVHlwZSBzbWVfcW9zX2FfY3RvX3VwX21hcFtTTUVfUU9TX0VEQ0FfQUNfTUFYXSA9IHsKKwlTTUVfUU9TX1dNTV9VUF9CRSwgICAgICAvKiBBQyBCRSAqLworCVNNRV9RT1NfV01NX1VQX0JLLCAgICAgIC8qIEFDIEJLICovCisJU01FX1FPU19XTU1fVVBfVkksICAgICAgLyogQUMgVkkgKi8KKwlTTUVfUU9TX1dNTV9VUF9WTyAgICAgICAvKiBBQyBWTyAqLworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIERFU0NSSVBUSU9OCisgICBTTUUgUW9TIG1vZHVsZSdzIEZMT1cgTGluayBMaXN0IHN0cnVjdHVyZS4gVGhpcyBsaXN0IGNhbiBob2xkIGluZm9ybWF0aW9uIHBlcgorICAgZmxvdy9yZXF1ZXN0LCBsaWtlIFRTUEVDIHBhcmFtcyByZXF1ZXN0ZWQsIHdoaWNoIEFDIGl0IGlzIHJ1bm5pbmcgb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCBzbWVfUW9zRmxvd0luZm9FbnRyeV9zIHsKKwl0TGlzdEVsZW0gbGluazsgICAgICAgICAvKiBsaXN0IGxpbmtzICovCisJdWludDhfdCBzZXNzaW9uSWQ7CisJdWludDhfdCB0c3BlY19tYXNrOworCXNtZV9Rb3NSZWFzb25UeXBlIHJlYXNvbjsKKwl1aW50MzJfdCBRb3NGbG93SUQ7CisJc21lX1Fvc0VkY2FBY1R5cGUgYWNfdHlwZTsKKwlzbWVfUW9zV21tVHNwZWNJbmZvIFFvU0luZm87CisJdm9pZCAqSEREY29udGV4dDsKKwlzbWVfUW9zQ2FsbGJhY2sgUW9TQ2FsbGJhY2s7CisJYm9vbCBob1JlbmV3YWw7ICAgICAgICAgLyogc2V0IHRvIHRydWUgd2hpbGUgcmUtbmVnb3RpYXRpbmcgZmxvd3MgYWZ0ZXIgKi8KKwkvKiBoYW5kb2ZmLCB3aWxsIHNldCB0byBmYWxzZSBvbmNlIGRvbmUgd2l0aCAqLworCS8qIHRoZSBwcm9jZXNzLiBIZWxwcyBTTUUgdG8gZGVjaWRlIGlmIGF0IGFsbCAqLworCS8qIHRvIG5vdGlmeSBIREQvTElTIGZvciBmbG93IHJlbmV3YWwgYWZ0ZXIgSE8gKi8KK30gc21lX1Fvc0Zsb3dJbmZvRW50cnk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgREVTQ1JJUFRJT04KKyAgIFNNRSBRb1MgbW9kdWxlJ3Mgc2V0dXAgcmVxdWVzdCBjbWQgcmVsYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc21lX3Fvc19zZXR1cENtZEluZm9fcyB7CisJdWludDMyX3QgUW9zRmxvd0lEOworCXNtZV9Rb3NXbW1Uc3BlY0luZm8gUW9TSW5mbzsKKwl2b2lkICpIRERjb250ZXh0OworCXNtZV9Rb3NDYWxsYmFjayBRb1NDYWxsYmFjazsKKwlzbWVfUW9zV21tVXBUeXBlIFVQVHlwZTsKKwlib29sIGhvUmVuZXdhbDsgICAgICAgICAvKiBzZXQgdG8gdHJ1ZSB3aGlsZSByZS1uZWdvdGlhdGluZyBmbG93cyBhZnRlciAqLworCS8qIGhhbmRvZmYsIHdpbGwgc2V0IHRvIGZhbHNlIG9uY2UgZG9uZSB3aXRoICovCisJLyogdGhlIHByb2Nlc3MuIEhlbHBzIFNNRSB0byBkZWNpZGUgaWYgYXQgYWxsICovCisJLyogdG8gbm90aWZ5IEhERC9MSVMgZm9yIGZsb3cgcmVuZXdhbCBhZnRlciBITyAqLworfSBzbWVfcW9zX3NldHVwQ21kSW5mbzsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBERVNDUklQVElPTgorICAgU01FIFFvUyBtb2R1bGUncyBtb2RpZnkgY21kIHJlbGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNtZV9Rb3NNb2RpZnlDbWRJbmZvX3MgeworCXVpbnQzMl90IFFvc0Zsb3dJRDsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKwlzbWVfUW9zV21tVHNwZWNJbmZvIFFvU0luZm87Cit9IHNtZV9Rb3NNb2RpZnlDbWRJbmZvOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIERFU0NSSVBUSU9OCisgICBTTUUgUW9TIG1vZHVsZSdzIHJlc2VuZCBjbWQgcmVsYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc21lX1Fvc1Jlc2VuZENtZEluZm9fcyB7CisJdWludDhfdCB0c3BlY01hc2s7CisJc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisJc21lX1Fvc1dtbVRzcGVjSW5mbyBRb1NJbmZvOworfSBzbWVfUW9zUmVzZW5kQ21kSW5mbzsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBERVNDUklQVElPTgorICAgU01FIFFvUyBtb2R1bGUncyByZWxlYXNlIGNtZCByZWxhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCBzbWVfUW9zUmVsZWFzZUNtZEluZm9fcyB7CisJdWludDMyX3QgUW9zRmxvd0lEOworfSBzbWVfUW9zUmVsZWFzZUNtZEluZm87CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgREVTQ1JJUFRJT04KKyAgIFNNRSBRb1MgbW9kdWxlJ3MgYnVmZmVyZWQgY21kIHJlbGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNtZV9Rb3NDbWRJbmZvX3MgeworCXNtZV9Rb3NDbWRUeXBlIGNvbW1hbmQ7CisJdHBBbmlTaXJHbG9iYWwgcE1hYzsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1bmlvbiB7CisJCXNtZV9xb3Nfc2V0dXBDbWRJbmZvIHNldHVwQ21kSW5mbzsKKwkJc21lX1Fvc01vZGlmeUNtZEluZm8gbW9kaWZ5Q21kSW5mbzsKKwkJc21lX1Fvc1Jlc2VuZENtZEluZm8gcmVzZW5kQ21kSW5mbzsKKwkJc21lX1Fvc1JlbGVhc2VDbWRJbmZvIHJlbGVhc2VDbWRJbmZvOworCX0gdTsKK30gc21lX1Fvc0NtZEluZm87CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgREVTQ1JJUFRJT04KKyAgIFNNRSBRb1MgbW9kdWxlJ3MgYnVmZmVyZWQgY21kIExpc3Qgc3RydWN0dXJlLiBUaGlzIGxpc3QgY2FuIGhvbGQgaW5mb3JtYXRpb24KKyAgIHJlbGF0ZWQgdG8gYW55IHBlbmRpbmcgY21kIGZyb20gSERECisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc21lX1Fvc0NtZEluZm9FbnRyeV9zIHsKKwl0TGlzdEVsZW0gbGluazsgICAgICAgICAvKiBsaXN0IGxpbmtzICovCisJc21lX1Fvc0NtZEluZm8gY21kSW5mbzsKK30gc21lX1Fvc0NtZEluZm9FbnRyeTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBERVNDUklQVElPTgorICAgU01FIFFvUyBtb2R1bGUncyBQZXIgQUMgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBUaGlzIGNhbiBob2xkIGluZm9ybWF0aW9uIG9uCisgICBob3cgbWFueSBmbG93cyBydW5uaW5nIG9uIHRoZSBBQywgdGhlIGN1cnJlbnQsIHByZXZpb3VzIHN0YXRlcyB0aGUgQUMgaXMgaW4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCBzbWVfUW9zQUNJbmZvX3MgeworCXVpbnQ4X3QgbnVtX2Zsb3dzW1NNRV9RT1NfVFNQRUNfSU5ERVhfTUFYXTsKKwlzbWVfUW9zU3RhdGVzIGN1cnJfc3RhdGU7CisJc21lX1Fvc1N0YXRlcyBwcmV2X3N0YXRlOworCXNtZV9Rb3NXbW1Uc3BlY0luZm8gY3Vycl9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfTUFYXTsKKwlzbWVfUW9zV21tVHNwZWNJbmZvIHJlcXVlc3RlZF9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfTUFYXTsKKwlib29sIHJlYXNzb2NfcGVuZGluZzsgICAvKiByZWFzc29jIHJlcXVlc3RlZCBmb3IgQVBTRCAqLworCS8qIEFzIHBlciBXTU0gc3BlYyB0aGVyZSBjb3VsZCBiZSBtYXggMiBUU1BFQyBydW5uaW5nIG9uIHRoZSBzYW1lIEFDIHdpdGggKi8KKwkvKiBkaWZmZXJlbnQgZGlyZWN0aW9uLiBXZSB3aWxsIHJlZmVyIGVhY2ggVFNQRUMgd2l0aCBhbiBpbmRleCAqLworCXVpbnQ4X3QgdHNwZWNfbWFza19zdGF0dXM7ICAgICAgLyogc3RhdHVzIHNob3dpbmcgaWYgYm90aCB0aGUgaW5kaWNlcyBhcmUgaW4gdXNlICovCisJdWludDhfdCB0c3BlY19wZW5kaW5nOyAgLyogdHNwZWMgbmVnb3RpYXRpb24gZ29pbmcgb24gZm9yIHdoaWNoIGluZGV4ICovCisJYm9vbCBob1JlbmV3YWw7ICAgICAgICAgLyogc2V0IHRvIHRydWUgd2hpbGUgcmUtbmVnb3RpYXRpbmcgZmxvd3MgYWZ0ZXIgKi8KKwkvKiBoYW5kb2ZmLCB3aWxsIHNldCB0byBmYWxzZSBvbmNlIGRvbmUgd2l0aCAqLworCS8qIHRoZSBwcm9jZXNzLiBIZWxwcyBTTUUgdG8gZGVjaWRlIGlmIGF0IGFsbCAqLworCS8qIHRvIG5vdGlmeSBIREQvTElTIGZvciBmbG93IHJlbmV3YWwgYWZ0ZXIgSE8gKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCXVpbnQ4X3QgcmljSWRlbnRpZmllcltTTUVfUU9TX1RTUEVDX0lOREVYX01BWF07CisJLyogc3RvcmVzIHRoZSBBREQgVFMgcmVzcG9uc2UgZm9yIGVhY2ggQUMuIFRoZSBBREQgVFMgcmVzcG9uc2UgaXMgZm9ybWVkIGJ5CisJICAgcGFyc2luZyB0aGUgUklDIHJlY2VpdmVkIGluIHRoZSB0aGUgcmVhc3NvYyByZXNwb25zZSAqLworCXRTaXJBZGR0c1JzcCBhZGRUc1JzcFtTTUVfUU9TX1RTUEVDX0lOREVYX01BWF07CisjZW5kaWYKKwlzbWVfUW9zUmVsVHJpZ2dlcnMgcmVsVHJpZzsKKworfSBzbWVfUW9zQUNJbmZvOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIERFU0NSSVBUSU9OCisgICBTTUUgUW9TIG1vZHVsZSdzIFBlciBzZXNzaW9uIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gVGhpcyBjYW4gaG9sZCBpbmZvcm1hdGlvbgorICAgb24gdGhlIHN0YXRlIG9mIHRoZSBzZXNzaW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc21lX1Fvc1Nlc3Npb25JbmZvX3MgeworCS8qIHdoYXQgaXMgdGhpcyBlbnRyeSdzIHNlc3Npb24gaWQgKi8KKwl1aW50OF90IHNlc3Npb25JZDsKKwkvKiBpcyB0aGUgc2Vzc2lvbiBjdXJyZW50bHkgYWN0aXZlICovCisJYm9vbCBzZXNzaW9uQWN0aXZlOworCS8qIEFsbCBBQyBpbmZvIGZvciB0aGlzIHNlc3Npb24gKi8KKwlzbWVfUW9zQUNJbmZvIGFjX2luZm9bU01FX1FPU19FRENBX0FDX01BWF07CisJLyogQml0bWFzayBvZiB0aGUgQUNzIHdpdGggQVBTRCBvbiAqLworCS8qIEJpdDA6Vk87IEJpdDE6Vkk7IEJpdDI6Qks7IEJpdDM6QkUgYWxsIG90aGVyIGJpdHMgYXJlIGlnbm9yZWQgKi8KKwl1aW50OF90IGFwc2RNYXNrOworCS8qIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIHNlc3Npb24gKi8KKwlzbWVfUW9zQXNzb2NJbmZvIGFzc29jSW5mbzsKKwkvKiBJRCBhc3NpZ25lZCB0byBvdXIgcmVhc3NvYyByZXF1ZXN0ICovCisJdWludDMyX3Qgcm9hbUlEOworCS8qIG1haW50YWluaW5nIGEgcG93ZXJzYXZlIHN0YXR1cyBpbiBRb1MgbW9kdWxlLCB0byBiZSBmZWQgYmFjayB0byBQTUMgYXQgKi8KKwkvKiB0aW1lcyB0aHJvdWdoIHRoZSBzbWVfcW9zX3BtY19jaGVja19yb3V0aW5lICovCisJYm9vbCByZWFkeUZvclBvd2VyU2F2ZTsKKwkvKiBhcmUgd2UgaW4gdGhlIHByb2Nlc3Mgb2YgaGFuZGluZyBvZmYgdG8gYSBkaWZmZXJlbnQgQVAgKi8KKwlib29sIGhhbmRvZmZSZXF1ZXN0ZWQ7CisJLyogZm9sbG93aW5nIHJlYXNzb2Mgb3IgQWRkVFMgaGFzIFVBUFNEIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQgZnJvbSBQTUMgKi8KKwlib29sIHVhcHNkQWxyZWFkeVJlcXVlc3RlZDsKKwkvKiBjb21tYW5kcyB0aGF0IGFyZSBiZWluZyBidWZmZXJlZCBmb3IgdGhpcyBzZXNzaW9uICovCisJdERibExpbmtMaXN0IGJ1ZmZlcmVkQ29tbWFuZExpc3Q7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWJvb2wgZnRIYW5kb2ZmSW5Qcm9ncmVzczsKKyNlbmRpZgorCit9IHNtZV9Rb3NTZXNzaW9uSW5mbzsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBERVNDUklQVElPTgorICAgU2VhcmNoIGtleSB1bmlvbi4gV2UgY2FuIHVzZSB0aGUgZmxvd0lELCBhYyB0eXBlLCBvciByZWFzb24gdG8gZmluZCBhbiBlbnRyeQorICAgaW4gdGhlIGZsb3cgbGlzdAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdW5pb24gc21lX1Fvc1NlYXJjaEtleV9zIHsKKwl1aW50MzJfdCBRb3NGbG93SUQ7CisJc21lX1Fvc0VkY2FBY1R5cGUgYWNfdHlwZTsKKwlzbWVfUW9zUmVhc29uVHlwZSByZWFzb247Cit9IHNtZV9Rb3NTZWFyY2hLZXk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgREVTQ1JJUFRJT04KKyAgIFdlIGNhbiBlaXRoZXIgdXNlIHRoZSBmbG93SUQgb3IgdGhlIGFjIHR5cGUgdG8gZmluZCBhbiBlbnRyeSBpbiB0aGUgZmxvdyBsaXN0LgorICAgVGhlIGluZGV4IGlzIGEgYml0bWFwIHRlbGxpbmcgdXMgd2hpY2gga2V5IHRvIHVzZS4gU3RhcnRpbmcgZnJvbSBMU0IsCisgICBiaXQgMCAtIEZsb3cgSUQKKyAgIGJpdCAxIC0gQUMgdHlwZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNtZV9Rb3NTZWFyY2hJbmZvX3MgeworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXVpbnQ4X3QgaW5kZXg7CisJc21lX1Fvc1NlYXJjaEtleSBrZXk7CisJc21lX1Fvc1dtbURpclR5cGUgZGlyZWN0aW9uOworCXVpbnQ4X3QgdHNwZWNfbWFzazsKK30gc21lX1Fvc1NlYXJjaEluZm87CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgREVTQ1JJUFRJT04KKyAgIFNNRSBRb1MgbW9kdWxlJ3MgaW50ZXJuYWwgY29udHJvbCBibG9jay4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdHJ1Y3Qgc21lX3Fvc19jYl9zIHsKKwkvKiBnbG9iYWwgTWFjIHBvaW50ZXIgKi8KKwl0cEFuaVNpckdsb2JhbCBwTWFjOworCS8qIEFsbCBTZXNzaW9uIEluZm8gKi8KKwlzbWVfUW9zU2Vzc2lvbkluZm8gc2Vzc2lvbkluZm9bQ1NSX1JPQU1fU0VTU0lPTl9NQVhdOworCS8qIEFsbCBGTE9XIGluZm8gKi8KKwl0RGJsTGlua0xpc3QgZmxvd19saXN0OworCS8qIGRlZmF1bHQgVFNQRUMgcGFyYW1zICovCisJc21lX1Fvc1dtbVRzcGVjSW5mbyBkZWZfUW9TSW5mb1tTTUVfUU9TX0VEQ0FfQUNfTUFYXTsKKwkvKiBjb3VudGVyIGZvciBhc3NpZ25pbmcgRmxvdyBJRHMgKi8KKwl1aW50MzJfdCBuZXh0Rmxvd0lkOworCS8qIGNvdW50ZXIgZm9yIGFzc2lnbmluZyBEaWFsb2cgVG9rZW5zICovCisJdWludDhfdCBuZXh0RGlhbG9nVG9rZW47Cit9IHNtZV9xb3NfY2I7Cit0eXBlZGVmIENERl9TVEFUVVMgKCpzbWVfUW9zUHJvY2Vzc1NlYXJjaEVudHJ5KSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdExpc3RFbGVtICpwRW50cnkpOworCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfcW9zX2ludGVybmFsX3NldHVwX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBRb1NJbmZvLAorCQkJCQkgICAgIHNtZV9Rb3NDYWxsYmFjayBRb1NDYWxsYmFjaywKKwkJCQkJICAgICB2b2lkICpIRERjb250ZXh0LAorCQkJCQkgICAgIHNtZV9Rb3NXbW1VcFR5cGUgVVBUeXBlLAorCQkJCQkgICAgIHVpbnQzMl90IFFvc0Zsb3dJRCwKKwkJCQkJICAgICBib29sIGJ1ZmZlcmVkX2NtZCwgYm9vbCBob1JlbmV3YWwpOworc21lX1Fvc1N0YXR1c1R5cGUgc21lX3Fvc19pbnRlcm5hbF9tb2RpZnlfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBRb1NJbmZvLAorCQkJCQkgICAgICB1aW50MzJfdCBRb3NGbG93SUQsCisJCQkJCSAgICAgIGJvb2wgYnVmZmVyZWRfY21kKTsKK3NtZV9Rb3NTdGF0dXNUeXBlIHNtZV9xb3NfaW50ZXJuYWxfcmVsZWFzZV9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgIHVpbnQzMl90IFFvc0Zsb3dJRCwKKwkJCQkJICAgICAgIGJvb2wgYnVmZmVyZWRfY21kKTsKK3NtZV9Rb3NTdGF0dXNUeXBlIHNtZV9xb3Nfc2V0dXAodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQl1aW50OF90IHNlc3Npb25JZCwKKwkJCQlzbWVfUW9zV21tVHNwZWNJbmZvICpwVHNwZWNfSW5mbywKKwkJCQlzbWVfUW9zRWRjYUFjVHlwZSBhYyk7CitDREZfU1RBVFVTIHNtZV9xb3NfYWRkX3RzX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkgICAgICBzbWVfUW9zV21tVHNwZWNJbmZvICpwVHNwZWNfSW5mbywKKwkJCSAgICAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjKTsKK0NERl9TVEFUVVMgc21lX3Fvc19kZWxfdHNfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkgICAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCSAgICAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjLCB1aW50OF90IHRzcGVjX21hc2spOworQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfYWRkX3RzX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKTsKK0NERl9TVEFUVVMgc21lX3Fvc19wcm9jZXNzX2RlbF90c19pbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqcE1zZ0J1Zik7CitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19kZWxfdHNfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpOworQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfYXNzb2NfY29tcGxldGVfZXYodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgdm9pZCAqcEV2ZW50X2luZm8pOworQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfcmVhc3NvY19yZXFfZXYodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgdm9pZCAqcEV2ZW50X2luZm8pOworQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfcmVhc3NvY19zdWNjZXNzX2V2KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLCB2b2lkICpwRXZlbnRfaW5mbyk7CitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19yZWFzc29jX2ZhaWx1cmVfZXYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQsIHZvaWQgKnBFdmVudF9pbmZvKTsKK0NERl9TVEFUVVMgc21lX3Fvc19wcm9jZXNzX2Rpc2Nvbm5lY3RfZXYodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSB2b2lkICpwRXZlbnRfaW5mbyk7CitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19qb2luX3JlcV9ldih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkgICAgICAgdm9pZCAqcEV2ZW50X2luZm8pOworQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfaGFuZG9mZl9hc3NvY19yZXFfZXYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCXVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkJdm9pZCAqcEV2ZW50X2luZm8pOworQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfaGFuZG9mZl9zdWNjZXNzX2V2KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLCB2b2lkICpwRXZlbnRfaW5mbyk7CitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19oYW5kb2ZmX2ZhaWx1cmVfZXYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQsIHZvaWQgKnBFdmVudF9pbmZvKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfcHJlYXV0aF9zdWNjZXNzX2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgICB2b2lkICpwRXZlbnRfaW5mbyk7CitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19zZXRfa2V5X3N1Y2Nlc3NfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB1aW50OF90IHNlc3Npb25JZCwgdm9pZCAqcEV2ZW50X2luZm8pOworQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfYWdncl9xb3NfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpOworQ0RGX1NUQVRVUyBzbWVfcW9zX2Z0X2FnZ3JfcW9zX3JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCk7CisjZW5kaWYKK0NERl9TVEFUVVMgc21lX3Fvc19wcm9jZXNzX2FkZF90c19zdWNjZXNzX3JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgICAgdFNpckFkZHRzUnNwSW5mbyAqcFJzcCk7CitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19hZGRfdHNfZmFpbHVyZV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgIHRTaXJBZGR0c1JzcEluZm8gKnBSc3ApOworQ0RGX1NUQVRVUyBzbWVfcW9zX2FnZ3JlZ2F0ZV9wYXJhbXMoc21lX1Fvc1dtbVRzcGVjSW5mbyAqcElucHV0X1RzcGVjX0luZm8sCisJCQkJICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBDdXJyZW50X1RzcGVjX0luZm8sCisJCQkJICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBVcGRhdGVkX1RzcGVjX0luZm8pOworc3RhdGljIENERl9TVEFUVVMgc21lX3Fvc191cGRhdGVfcGFyYW1zKHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQlzbWVfUW9zRWRjYUFjVHlwZSBhYywKKwkJCQkJdWludDhfdCB0c3BlY19tYXNrLAorCQkJCQlzbWVfUW9zV21tVHNwZWNJbmZvICpwVHNwZWNfSW5mbyk7CitzbWVfUW9zV21tVXBUeXBlIHNtZV9xb3NfYWNfdG9fdXAoc21lX1Fvc0VkY2FBY1R5cGUgYWMpOworc21lX1Fvc0VkY2FBY1R5cGUgc21lX3Fvc191cF90b19hYyhzbWVfUW9zV21tVXBUeXBlIHVwKTsKK2Jvb2wgc21lX3Fvc19pc19hY20odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJICAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzKTsKK3RMaXN0RWxlbSAqc21lX3Fvc19maW5kX2luX2Zsb3dfbGlzdChzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5KTsKK0NERl9TVEFUVVMgc21lX3Fvc19maW5kX2FsbF9pbl9mbG93X2xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJIHNtZV9Rb3NTZWFyY2hJbmZvIHNlYXJjaF9rZXksCisJCQkJCSBzbWVfUW9zUHJvY2Vzc1NlYXJjaEVudHJ5IGZucCk7CitzdGF0aWMgdm9pZCBzbWVfcW9zX3N0YXRlX3RyYW5zaXRpb24odWludDhfdCBzZXNzaW9uSWQsCisJCQkJICAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYywKKwkJCQkgICAgIHNtZV9Rb3NTdGF0ZXMgbmV3X3N0YXRlKTsKK0NERl9TVEFUVVMgc21lX3Fvc19idWZmZXJfY21kKHNtZV9Rb3NDbWRJbmZvICpwY21kLCBib29sIGluc2VydF9oZWFkKTsKK3N0YXRpYyBDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19idWZmZXJlZF9jbWQodWludDhfdCBzZXNzaW9uSWQpOworQ0RGX1NUQVRVUyBzbWVfcW9zX3NhdmVfYXNzb2NfaW5mbyhzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uLAorCQkJCSAgIHNtZV9Rb3NBc3NvY0luZm8gKnBBc3NvY19pbmZvKTsKK0NERl9TVEFUVVMgc21lX3Fvc19zZXR1cF9mbnAodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpOworQ0RGX1NUQVRVUyBzbWVfcW9zX21vZGlmaWNhdGlvbl9ub3RpZnlfZm5wKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgIHRMaXN0RWxlbSAqcEVudHJ5KTsKK0NERl9TVEFUVVMgc21lX3Fvc19tb2RpZnlfZm5wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KTsKK0NERl9TVEFUVVMgc21lX3Fvc19kZWxfdHNfaW5kX2ZucCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0TGlzdEVsZW0gKnBFbnRyeSk7CitDREZfU1RBVFVTIHNtZV9xb3NfcmVhc3NvY19zdWNjZXNzX2V2X2ZucCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0TGlzdEVsZW0gKnBFbnRyeSk7CitDREZfU1RBVFVTIHNtZV9xb3NfYWRkX3RzX2ZhaWx1cmVfZm5wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KTsKK0NERl9TVEFUVVMgc21lX3Fvc19hZGRfdHNfc3VjY2Vzc19mbnAodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpOworc3RhdGljIGJvb2wgc21lX3Fvc19pc19yc3BfcGVuZGluZyh1aW50OF90IHNlc3Npb25JZCwgc21lX1Fvc0VkY2FBY1R5cGUgYWMpOworc3RhdGljIGJvb2wgc21lX3Fvc19pc191YXBzZF9hY3RpdmUodm9pZCk7CisKK3ZvaWQgc21lX3Fvc19wbWNfb2ZmbG9hZF9zdGFydF91YXBzZF9jYWxsYmFjayh2b2lkICpjYWxsYmFja0NvbnRleHQsCisJCQkJCSAgICAgIHVpbnQzMl90IHNlc3Npb25JZCwgQ0RGX1NUQVRVUyBzdGF0dXMpOworYm9vbCBzbWVfcW9zX3BtY19vZmZsb2FkX2NoZWNrX3JvdXRpbmUodm9pZCAqY2FsbGJhY2tDb250ZXh0LCB1aW50MzJfdCBzZXNzaW9uSWQpOworCitzdGF0aWMgQ0RGX1NUQVRVUyBzbWVfcW9zX2J1ZmZlcl9leGlzdGluZ19mbG93cyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJdWludDhfdCBzZXNzaW9uSWQpOworc3RhdGljIENERl9TVEFUVVMgc21lX3Fvc19kZWxldGVfZXhpc3RpbmdfZmxvd3ModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCXVpbnQ4X3Qgc2Vzc2lvbklkKTsKK3N0YXRpYyB2b2lkIHNtZV9xb3NfY2xlYW51cF9jdHJsX2Jsa19mb3JfaGFuZG9mZih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK3N0YXRpYyBDREZfU1RBVFVTIHNtZV9xb3NfZGVsZXRlX2J1ZmZlcmVkX3JlcXVlc3RzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICB1aW50OF90IHNlc3Npb25JZCk7Citib29sIHNtZV9xb3NfdmFsaWRhdGVfcmVxdWVzdGVkX3BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICAgICBzbWVfUW9zV21tVHNwZWNJbmZvICpwUW9TSW5mbywKKwkJCQkgICAgICAgdWludDhfdCBzZXNzaW9uSWQpOworCitleHRlcm4gQ0RGX1NUQVRVUyBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jayh0U21lU3RydWN0ICpwc1NtZSk7CitleHRlcm4gQ0RGX1NUQVRVUyBzbWVfcmVsZWFzZV9nbG9iYWxfbG9jayh0U21lU3RydWN0ICpwc1NtZSk7CitzdGF0aWMgQ0RGX1NUQVRVUyBxb3NfaXNzdWVfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkgICAgZVNtZUNvbW1hbmRUeXBlIGNtZFR5cGUsCisJCQkJICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBRb1NJbmZvLAorCQkJCSAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYywgdWludDhfdCB0c3BlY19tYXNrKTsKKy8qCisgICAgc21lX3Fvc19yZV9yZXF1ZXN0X2FkZF90cyB0byByZS1zZW5kIEFkZFRTIGZvciB0aGUgY29tYmluZWQgUW9TIHJlcXVlc3QKKyAqLworc3RhdGljIHNtZV9Rb3NTdGF0dXNUeXBlIHNtZV9xb3NfcmVfcmVxdWVzdF9hZGRfdHModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkJICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqcFFvU0luZm8sCisJCQkJCQkgICBzbWVfUW9zRWRjYUFjVHlwZSBhYywKKwkJCQkJCSAgIHVpbnQ4X3QgdHNwZWNNYXNrKTsKK3N0YXRpYyB2b2lkIHNtZV9xb3NfaW5pdF9hX2NzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKTsKK3N0YXRpYyBDREZfU1RBVFVTIHNtZV9xb3NfcmVxdWVzdF9yZWFzc29jKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqCisJCQkJCSAgcE1vZEZpZWxkcywgYm9vbCBmRm9yY2UpOworc3RhdGljIHVpbnQzMl90IHNtZV9xb3NfYXNzaWduX2Zsb3dfaWQodm9pZCk7CitzdGF0aWMgdWludDhfdCBzbWVfcW9zX2Fzc2lnbl9kaWFsb2dfdG9rZW4odm9pZCk7CitzdGF0aWMgQ0RGX1NUQVRVUyBzbWVfcW9zX3VwZGF0ZV90c3BlY19tYXNrKHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgc21lX1Fvc1NlYXJjaEluZm8gc2VhcmNoX2tleSwKKwkJCQkJICAgIHVpbnQ4X3QgbmV3X3RzcGVjX21hc2spOworCisvKiBFeHRlcm5hbCBBUElzIGRlZmluaXRpb25zICovCisKKy8qKgorICogc21lX3Fvc19vcGVuKCkgLSBjYWxsZWQgdG8gaW5pdGlhbGl6ZSBTTUUgUW9TIG1vZHVsZS4KKyAqIEBwTWFjOiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgQVBJIGNhbGwgdG8KKyAqIFNNRSBRb1MgbW9kdWxlLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9xb3Nfb3Blbih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJdWludDhfdCBzZXNzaW9uSWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGluaXRpYWxpemluZyBTTUUtUW9TIG1vZHVsZSIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJLyogaW5pdCB0aGUgY29udHJvbCBibG9jayAqLworCS8qIChub3RlIHRoYXQgdGhpcyB3aWxsIG1ha2UgYWxsIHNlc3Npb25zIGludmFsaWQpICovCisJY2RmX21lbV96ZXJvKCZzbWVfcW9zX2NiLCBzaXplb2Yoc21lX3Fvc19jYikpOworCXNtZV9xb3NfY2IucE1hYyA9IHBNYWM7CisJc21lX3Fvc19jYi5uZXh0Rmxvd0lkID0gU01FX1FPU19NSU5fRkxPV19JRDsKKwlzbWVfcW9zX2NiLm5leHREaWFsb2dUb2tlbiA9IFNNRV9RT1NfTUlOX0RJQUxPR19UT0tFTjsKKwkvKiBpbml0IGZsb3cgbGlzdCAqLworCXN0YXR1cyA9IGNzcl9sbF9vcGVuKHBNYWMtPmhIZGQsICZzbWVfcW9zX2NiLmZsb3dfbGlzdCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiAlZDogY2Fubm90IGluaXRpYWxpemUgRmxvdyBMaXN0IiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWZvciAoc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7ICsrc2Vzc2lvbklkKSB7CisJCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKwkJcFNlc3Npb24tPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJLyogaW5pdGlhbGl6ZSB0aGUgc2Vzc2lvbidzIHBlci1BQyBpbmZvcm1hdGlvbiAqLworCQlzbWVfcW9zX2luaXRfYV9jcyhwTWFjLCBzZXNzaW9uSWQpOworCQkvKiBpbml0aWFsaXplIHRoZSBzZXNzaW9uJ3MgYnVmZmVyZWQgY29tbWFuZCBsaXN0ICovCisJCXN0YXR1cyA9IGNzcl9sbF9vcGVuKHBNYWMtPmhIZGQsICZwU2Vzc2lvbi0+YnVmZmVyZWRDb21tYW5kTGlzdCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCSAgIiVzOiAlZDogY2Fubm90IGluaXRpYWxpemUgY21kIGxpc3QgZm9yIHNlc3Npb24gJWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCXBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IHRydWU7CisJfQorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGRvbmUgaW5pdGlhbGl6aW5nIFNNRS1Rb1MgbW9kdWxlIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGJyaWVmIHNtZV9xb3NfY2xvc2UoKSAtIFRvIGNsb3NlIGRvd24gU01FIFFvUyBtb2R1bGUuIFRoZXJlIHNob3VsZCBub3QgYmUKKyAgICBhbnkgQVBJIGNhbGwgaW50byB0aGlzIG1vZHVsZSBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdW50aWwgYW5vdGhlcgorICAgIGNhbGwgb2Ygc21lX3Fvc19vcGVuLgorICAgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorCisgICAgXHJldHVybiBDREZfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3Fvc19jbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGNsb3NpbmcgZG93biBTTUUtUW9TIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCS8qIGNsZWFudXAgY29udHJvbCBibG9jayAqLworCS8qIGNsb3NlIHRoZSBmbG93IGxpc3QgKi8KKwljc3JfbGxfY2xvc2UoJnNtZV9xb3NfY2IuZmxvd19saXN0KTsKKwkvKiBzaHV0IGRvd24gYWxsIG9mIHRoZSBzZXNzaW9ucyAqLworCWZvciAoc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7ICsrc2Vzc2lvbklkKSB7CisJCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKwkJaWYgKHBTZXNzaW9uID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlzbWVfcW9zX2luaXRfYV9jcyhwTWFjLCBzZXNzaW9uSWQpOworCQkvKiB0aGlzIHNlc3Npb24gZG9lc24ndCByZXF1aXJlIFVBUFNEICovCisJCXBTZXNzaW9uLT5hcHNkTWFzayA9IDA7CisKKwkJcFNlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCA9IGZhbHNlOworCQlwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCA9IGZhbHNlOworCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQlwU2Vzc2lvbi0+cm9hbUlEID0gMDsKKwkJLyogbmVlZCB0byBjbGVhbiB1cCBidWZmZXJlZCByZXEgKi8KKwkJc21lX3Fvc19kZWxldGVfYnVmZmVyZWRfcmVxdWVzdHMocE1hYywgc2Vzc2lvbklkKTsKKwkJLyogbmVlZCB0byBjbGVhbiB1cCBmbG93cyAqLworCQlzbWVfcW9zX2RlbGV0ZV9leGlzdGluZ19mbG93cyhwTWFjLCBzZXNzaW9uSWQpOworCisJCS8qIENsZWFuIHVwIHRoZSBhc3NvYyBpbmZvIGlmIGFscmVhZHkgYWxsb2NhdGVkICovCisJCWlmIChwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjKSB7CisJCQljZGZfbWVtX2ZyZWUocFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYyk7CisJCQlwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjID0gTlVMTDsKKwkJfQorCQkvKiBjbG9zZSB0aGUgc2Vzc2lvbidzIGJ1ZmZlcmVkIGNvbW1hbmQgbGlzdCAqLworCQljc3JfbGxfY2xvc2UoJnBTZXNzaW9uLT5idWZmZXJlZENvbW1hbmRMaXN0KTsKKwkJZm9yIChhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSB7CisJCQlzbWVfcW9zX3N0YXRlX3RyYW5zaXRpb24oc2Vzc2lvbklkLCBhYywgU01FX1FPU19DTE9TRUQpOworCQl9CisJCXBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlID0gZmFsc2U7CisJCXBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IHRydWU7CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBjbG9zZWQgZG93biBRb1MiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3Fvc19zZXR1cF9yZXEoKSAtIFRoZSBTTUUgUW9TIEFQSSBleHBvc2VkIHRvIEhERCB0byByZXF1ZXN0IGZvciBRb1MKKyAqICAgICAgICAgICAgICAgICAgICAgICBvbiBhIHBhcnRpY3VsYXIgQUMuCisgKiBAaEhhbDogVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAqIEBzZXNzaW9uSWQ6IHNlc3Npb25JZCByZXR1cm5lZCBieSBzbWVfb3Blbl9zZXNzaW9uLgorICogQHBRb1NJbmZvOiBQb2ludGVyIHRvIHNtZV9Rb3NXbW1Uc3BlY0luZm8gd2hpY2ggY29udGFpbnMgdGhlIFdNTSBUU1BFQworICogICAgICAgICAgICByZWxhdGVkIGluZm8gYXMgZGVmaW5lZCBhYm92ZSwgcHJvdmlkZWQgYnkgSERECisgKiBAUW9TQ2FsbGJhY2s6IFRoZSBjYWxsYmFjayB3aGljaCBpcyByZWdpc3RlcmVkIHBlciBmbG93IHdoaWxlCisgKiAgICAgICAgICAgICAgIHJlcXVlc3RpbmcgZm9yIFFvUy4gVXNlZCBmb3IgYW55IG5vdGlmaWNhdGlvbiBmb3IgdGhlCisgKiAgICAgICAgICAgICAgIGZsb3cgKGkuZS4gc2V0dXAgc3VjY2Vzcy9mYWlsdXJlL3JlbGVhc2UpIHdoaWNoIG5lZWRzIHRvCisgKiAgICAgICAgICAgICAgIGJlIHNlbnQgdG8gSERECisgKiBASEREY29udGV4dDogQSBjb29raWUgcGFzc2VkIGJ5IEhERCB0byBiZSB1c2VkIGJ5IFNNRSBkdXJpbmcgYW55IFFvUworICogICAgICAgICAgICAgIG5vdGlmaWNhdGlvbiAodGhyb3VnaCB0aGUgY2FsbGFiY2spIHRvIEhERAorICogQFVQVHlwZTogVXNlZnVsIG9ubHkgaWYgSEREIG9yIGFueSBvdGhlciB1cHBlciBsYXllciBtb2R1bGUgKEJBUCBldGMuKQorICogICAgICAgICAgbG9va2luZyBmb3IgaW1wbGljaXQgUW9TIHNldHVwLCBpbiB0aGF0CisgKiAgICAgICAgICBjYXNlLCB0aGUgcFFvU0luZm8gd2lsbCBiZSBOVUxMICYgU01FIHdpbGwga25vdyBhYm91dCB0aGUgQUMKKyAqICAgICAgICAgIChmcm9tIHRoZSBVUCBwcm92aWRlZCBpbiB0aGlzIHBhcmFtKSBRb1MgaXMgcmVxdWVzdGVkIG9uCisgKiBAcFFvc0Zsb3dJRDogSWRlbnRpZmljYXRpb24gcGVyIGZsb3cgcnVubmluZyBvbiBlYWNoIEFDIGdlbmVyYXRlZCBieQorICogICAgICAgICAgICAgIFNNRS4gSXQgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBRb1Mgc2V0dXAgZm9yIHRoZSBmbG93IGlzCisgKiAgICAgICAgICAgICAgc3VjY2Vzc2Z1bAorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgbGluayBoYXMgYmVlbgorICogZXN0YWJsaXNoZWQsIGkuZS4gU1RBIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBBUCBldGMuIElmIHRoZSByZXF1ZXN0IGludm9sdmVzCisgKiBhZG1pc3Npb24gY29udHJvbCBvbiB0aGUgcmVxdWVzdGVkIEFDLCBIREQgbmVlZHMgdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5CisgKiBUcmFmZmljIFNwZWNpZmljYXRpb24gKFRTUEVDKSBwYXJhbWV0ZXJzIG90aGVyd2lzZSBTTUUgaXMgZ29pbmcgdG8gdXNlIHRoZQorICogZGVmYXVsdCBwYXJhbXMuCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyAtIFNldHVwIGlzIHN1Y2Nlc3NmdWwuCisgKiAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgU2V0dXAgcmVxdWVzdCBmYWlsZWQKKyAqLworc21lX1Fvc1N0YXR1c1R5cGUgc21lX3Fvc19zZXR1cF9yZXEodEhhbEhhbmRsZSBoSGFsLCB1aW50MzJfdCBzZXNzaW9uSWQsCisJCQkJICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBRb1NJbmZvLAorCQkJCSAgICBzbWVfUW9zQ2FsbGJhY2sgUW9TQ2FsbGJhY2ssCisJCQkJICAgIHZvaWQgKkhERGNvbnRleHQsCisJCQkJICAgIHNtZV9Rb3NXbW1VcFR5cGUgVVBUeXBlLAorCQkJCSAgICB1aW50MzJfdCAqcFFvc0Zsb3dJRCkKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCUNERl9TVEFUVVMgbG9ja19zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJc21lX1Fvc1N0YXR1c1R5cGUgc3RhdHVzOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBRb1MgU2V0dXAgcmVxdWVzdGVkIGJ5IGNsaWVudCBvbiBzZXNzaW9uICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJbG9ja19zdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhsb2NrX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IFVuYWJsZSB0byBvYnRhaW4gbG9jayIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDsKKwl9CisJLyogTWFrZSBzdXJlIHRoZSBzZXNzaW9uIGlzIHZhbGlkICovCisJaWYgKCFDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBTdXBwbGllZCBTZXNzaW9uIElEICVkIGlzIGludmFsaWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJCXN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOworCX0gZWxzZSB7CisJCS8qIE1ha2Ugc3VyZSB0aGUgc2Vzc2lvbiBpcyBhY3RpdmUgKi8KKwkJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCQlpZiAoIXBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IFN1cHBsaWVkIFNlc3Npb24gSUQgJWQgaXMgaW5hY3RpdmUiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworCQkJc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisJCX0gZWxzZSB7CisJCQkvKiBBc3NpZ24gYSBGbG93IElEICovCisJCQkqcFFvc0Zsb3dJRCA9IHNtZV9xb3NfYXNzaWduX2Zsb3dfaWQoKTsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgICIlczogJWQ6IFFvUyByZXF1ZXN0IG9uIHNlc3Npb24gJWQgYXNzaWduZWQgRmxvdyBJRCAlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgKnBRb3NGbG93SUQpOworCQkJLyogQ2FsbCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gZm9yIFFvUyBzZXR1cCwgKi8KKwkJCS8qIGFkZGluZyBhIGxheWVyIG9mIGFic3RyYWN0aW9uICovCisJCQlzdGF0dXMgPQorCQkJCXNtZV9xb3NfaW50ZXJuYWxfc2V0dXBfcmVxKHBNYWMsICh1aW50OF90KSBzZXNzaW9uSWQsCisJCQkJCQkJICAgcFFvU0luZm8sIFFvU0NhbGxiYWNrLAorCQkJCQkJCSAgIEhERGNvbnRleHQsIFVQVHlwZSwKKwkJCQkJCQkgICAqcFFvc0Zsb3dJRCwgZmFsc2UsCisJCQkJCQkJICAgZmFsc2UpOworCQl9CisJfQorCXNtZV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZwTWFjLT5zbWUpOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBRb1Mgc2V0dXAgcmV0dXJuIHN0YXR1cyBvbiBzZXNzaW9uICVkIGlzICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9xb3NfbW9kaWZ5X3JlcSgpIC0gVGhlIFNNRSBRb1MgQVBJIGV4cG9zZWQgdG8gSEREIHRvIHJlcXVlc3QgZm9yCisgKiAgbW9kaWZpY2F0aW9uIG9mIGNlcnRhaW4gUW9TIHBhcmFtcyBvbiBhIGZsb3cgcnVubmluZyBvbiBhIHBhcnRpY3VsYXIgQUMuCisgKiBAaEhhbDogVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAqIEBwUW9TSW5mbzogUG9pbnRlciB0byBzbWVfUW9zV21tVHNwZWNJbmZvIHdoaWNoIGNvbnRhaW5zIHRoZSBXTU0gVFNQRUMKKyAqICAgICAgICAgICAgcmVsYXRlZCBpbmZvIGFzIGRlZmluZWQgYWJvdmUsIHByb3ZpZGVkIGJ5IEhERAorICogQFFvc0Zsb3dJRDogSWRlbnRpZmljYXRpb24gcGVyIGZsb3cgcnVubmluZyBvbiBlYWNoIEFDIGdlbmVyYXRlZCBieQorICogICAgICAgICAgICAgU01FLiBJdCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIFFvUyBzZXR1cCBmb3IgdGhlIGZsb3cgaGFzCisgKiAgICAgICAgICAgICBiZWVuIHN1Y2Nlc3NmdWwgYWxyZWFkeQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhIGxpbmsgaGFzIGJlZW4gZXN0YWJsaXNoZWQsCisgKiBpLmUuIFNUQSBpcyBhc3NvY2lhdGVkIHdpdGggYW4gQVAgZXRjLiAmIGEgUW9TIHNldHVwIGhhcyBiZWVuIHN1Y2Nlc2Z1bCBmb3IKKyAqIHRoYXQgZmxvdy4gSWYgdGhlIHJlcXVlc3QgaW52b2x2ZXMgYWRtaXNzaW9uIGNvbnRyb2wgb24gdGhlIHJlcXVlc3RlZCBBQywKKyAqIEhERCBuZWVkcyB0byBwcm92aWRlIHRoZSBuZWNlc3NhcnkgVHJhZmZpYyBTcGVjaWZpY2F0aW9uIChUU1BFQykgcGFyYW1ldGVycyAmCisgKiBTTUUgbWlnaHQgc3RhcnQgdGhlIHJlbmVnb3RpYXRpb24gcHJvY2VzcyB0aHJvdWdoIEFERFRTLgorICoKKyAqIFJldHVybjogU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19SU1AgLSBNb2RpZmljYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKyAqICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIHJlcXVlc3QgZmFpbGVkCisgKi8KK3NtZV9Rb3NTdGF0dXNUeXBlIHNtZV9xb3NfbW9kaWZ5X3JlcSh0SGFsSGFuZGxlIGhIYWwsCisJCQkJICAgICBzbWVfUW9zV21tVHNwZWNJbmZvICpwUW9TSW5mbywKKwkJCQkgICAgIHVpbnQzMl90IFFvc0Zsb3dJRCkKK3sKKwlDREZfU1RBVFVTIGxvY2tfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCXNtZV9Rb3NTdGF0dXNUeXBlIHN0YXR1czsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogUW9TIE1vZGlmeSByZXF1ZXN0ZWQgYnkgY2xpZW50IGZvciBGbG93ICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCk7CisJbG9ja19zdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhsb2NrX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IFVuYWJsZSB0byBvYnRhaW4gbG9jayIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfRkFJTFVSRV9SU1A7CisJfQorCS8qIENhbGwgdGhlIGludGVybmFsIGZ1bmN0aW9uIGZvciBRb1MgbW9kaWZ5LCBhZGRpbmcgYSBsYXllciBvZiBhYnN0cmFjdGlvbiAqLworCXN0YXR1cyA9IHNtZV9xb3NfaW50ZXJuYWxfbW9kaWZ5X3JlcShwTWFjLCBwUW9TSW5mbywgUW9zRmxvd0lELCBmYWxzZSk7CisJc21lX3JlbGVhc2VfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IFFvUyBNb2RpZnkgcmV0dXJuIHN0YXR1cyBvbiBGbG93ICVkIGlzICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHNtZV9xb3NfcmVsZWFzZV9yZXEoKSAtIFRoZSBTTUUgUW9TIEFQSSBleHBvc2VkIHRvIEhERCB0byByZXF1ZXN0IGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzaW5nIGEgUW9TIGZsb3cgcnVubmluZyBvbiBhIHBhcnRpY3VsYXIgQUMuCisgKgorICogQGhIYWw6IFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgKiBAUW9zRmxvd0lEOiBJZGVudGlmaWNhdGlvbiBwZXIgZmxvdyBydW5uaW5nIG9uIGVhY2ggQUMgZ2VuZXJhdGVkIGJ5IFNNRQorICogICAgICAgICAgICAgSXQgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBRb1Mgc2V0dXAgZm9yIHRoZSBmbG93IGlzIHN1Y2Nlc3NmdWwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBpZiBhIFFvUyBpcyBzZXQgdXAgd2l0aCBhIHZhbGlkIEZsb3dJRC4KKyAqIEhERCBzb3VsZCBpbnZva2UgdGhpcyBBUEkgb25seSBpZiBhbiBleHBsaWNpdCByZXF1ZXN0IGZvciBRb1MgcmVsZWFzZSBoYXMKKyAqIGNvbWUgZnJvbSBBcHBsaWNhdGlvbgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIC0gUmVsZWFzZSBpcyBzdWNjZXNzZnVsLgorICovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfcW9zX3JlbGVhc2VfcmVxKHRIYWxIYW5kbGUgaEhhbCwgdWludDMyX3QgUW9zRmxvd0lEKQoreworCUNERl9TVEFUVVMgbG9ja19zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisJc21lX1Fvc1N0YXR1c1R5cGUgc3RhdHVzOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBRb1MgUmVsZWFzZSByZXF1ZXN0ZWQgYnkgY2xpZW50IGZvciBGbG93ICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCk7CisJbG9ja19zdGF0dXMgPSBzbWVfYWNxdWlyZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhsb2NrX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IFVuYWJsZSB0byBvYnRhaW4gbG9jayIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQOworCX0KKwkvKiBDYWxsIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBmb3IgUW9TIHJlbGVhc2UsIGFkZGluZyBhIGxheWVyIG9mIGFic3RyYWN0aW9uICovCisJc3RhdHVzID0gc21lX3Fvc19pbnRlcm5hbF9yZWxlYXNlX3JlcShwTWFjLCBRb3NGbG93SUQsIGZhbHNlKTsKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogUW9TIFJlbGVhc2UgcmV0dXJuIHN0YXR1cyBvbiBGbG93ICVkIGlzICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHFvc19yZWxlYXNlX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisJY2RmX21lbV96ZXJvKCZwQ29tbWFuZC0+dS5xb3NDbWQsIHNpemVvZih0R2VuZXJpY1Fvc0NtZCkpOworCXNtZV9yZWxlYXNlX2NvbW1hbmQocE1hYywgcENvbW1hbmQpOworfQorCisvKioKKyAqIHNtZV9xb3NfbXNnX3Byb2Nlc3NvcigpIC0gUHJvY2Vzc2VzIFFPUyBtZXNzYWdlcworICogQG1hY19jdHg6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAqIEBtc2dfdHlwZTogdGhlIHR5cGUgb2YgbXNnIHBhc3NlZCBieSBQRSBhcyBkZWZpbmVkIGluIHduaV9hcGkuaAorICogQG1zZzogYSBwb2ludGVyIHRvIGEgYnVmZmVyIHRoYXQgbWFwcyB0byB2YXJpb3VzIHN0cnVjdHVyZXMgYmFzZXMuCisgKgorICogc21lX3Byb2Nlc3NfbXNnKCkgY2FsbHMgdGhpcyBmdW5jdGlvbiBmb3IgdGhlIG1lc3NhZ2VzIHRoYXQKKyAqIGFyZSBoYW5kbGVkIGJ5IFNNRSBRb1MgbW9kdWxlLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbi4KKyAqLworQ0RGX1NUQVRVUyBzbWVfcW9zX21zZ19wcm9jZXNzb3IodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwl1aW50MTZfdCBtc2dfdHlwZSwgdm9pZCAqbXNnKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdExpc3RFbGVtICplbnRyeSA9IE5VTEw7CisJdFNtZUNtZCAqY29tbWFuZDsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCUZMKCIgbXNnID0gJWQgZm9yIFFvUyIpLCBtc2dfdHlwZSk7CisJLyogc3dpdGNoIG9uIHRoZSBtc2cgdHlwZSAmIG1ha2UgdGhlIHN0YXRlIHRyYW5zaXRpb24gYWNjb3JkaW5nbHkgKi8KKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBlV05JX1NNRV9BRERUU19SU1A6CisJCWVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmbWFjX2N0eC0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisJCQkJTExfQUNDRVNTX0xPQ0spOworCQlpZiAoTlVMTCA9PSBlbnRyeSkKKwkJCWJyZWFrOworCQljb21tYW5kID0gR0VUX0JBU0VfQUREUihlbnRyeSwgdFNtZUNtZCwgTGluayk7CisJCWlmIChlU21lQ29tbWFuZEFkZFRzID09IGNvbW1hbmQtPmNvbW1hbmQpIHsKKwkJCXN0YXR1cyA9IHNtZV9xb3NfcHJvY2Vzc19hZGRfdHNfcnNwKG1hY19jdHgsIG1zZyk7CisJCQlpZiAoY3NyX2xsX3JlbW92ZV9lbnRyeQorCQkJCSgmbWFjX2N0eC0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIGVudHJ5LAorCQkJCUxMX0FDQ0VTU19MT0NLKSkgeworCQkJCXFvc19yZWxlYXNlX2NvbW1hbmQobWFjX2N0eCwgY29tbWFuZCk7CisJCQl9CisJCQlzbWVfcHJvY2Vzc19wZW5kaW5nX3F1ZXVlKG1hY19jdHgpOworCQl9CisJCWJyZWFrOworCWNhc2UgZVdOSV9TTUVfREVMVFNfUlNQOgorCQllbnRyeSA9CisJCQljc3JfbGxfcGVla19oZWFkKCZtYWNfY3R4LT5zbWUuc21lQ21kQWN0aXZlTGlzdCwKKwkJCQlMTF9BQ0NFU1NfTE9DSyk7CisJCWlmIChOVUxMID09IGVudHJ5KQorCQkJYnJlYWs7CisJCWNvbW1hbmQgPSBHRVRfQkFTRV9BRERSKGVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKwkJaWYgKGVTbWVDb21tYW5kRGVsVHMgPT0gY29tbWFuZC0+Y29tbWFuZCkgeworCQkJc3RhdHVzID0gc21lX3Fvc19wcm9jZXNzX2RlbF90c19yc3AobWFjX2N0eCwgbXNnKTsKKwkJCWlmIChjc3JfbGxfcmVtb3ZlX2VudHJ5CisJCQkJKCZtYWNfY3R4LT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgZW50cnksCisJCQkJTExfQUNDRVNTX0xPQ0spKSB7CisJCQkJcW9zX3JlbGVhc2VfY29tbWFuZChtYWNfY3R4LCBjb21tYW5kKTsKKwkJCX0KKwkJCXNtZV9wcm9jZXNzX3BlbmRpbmdfcXVldWUobWFjX2N0eCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlV05JX1NNRV9ERUxUU19JTkQ6CisJCXN0YXR1cyA9IHNtZV9xb3NfcHJvY2Vzc19kZWxfdHNfaW5kKG1hY19jdHgsIG1zZyk7CisJCWJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJY2FzZSBlV05JX1NNRV9GVF9BR0dSX1FPU19SU1A6CisJCXN0YXR1cyA9IHNtZV9xb3NfcHJvY2Vzc19hZ2dyX3Fvc19yc3AobWFjX2N0eCwgbXNnKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQkvKiBlcnIgbXNnICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoInVua25vd24gbXNnIHR5cGUgPSAlZCIpLAorCQkJbXNnX3R5cGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcW9zX3ZhbGlkYXRlX3BhcmFtcygpIC0gdmFsaWRhdGUgU01FIFFPUyBwYXJhbWV0ZXJzLgorICogQHBNYWM6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAqIEBwQnNzRGVzYzogUG9pbnRlciB0byB0aGUgQlNTIERlc2NyaXB0b3IgaW5mb3JtYXRpb24gcGFzc2VkIGRvd24gYnkKKyAqICAgICAgICAgICAgQ1NSIHRvIFBFIHdoaWxlIGlzc3VpbmcgdGhlIEpvaW4gcmVxdWVzdAorICoKKyAqIFRoZSBTTUUgUW9TIEFQSSBleHBvc2VkIHRvIENTUiB0byB2YWxpZGF0ZSBBUAorICogY2FwYWJpbGl0aWVzIHJlZ2FyZGluZyBRb1Mgc3VwcG9ydCAmIGFueSBvdGhlciBRb1MgcGFyYW1ldGVyIHZhbGlkYXRpb24uCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK0NERl9TVEFUVVMgc21lX3Fvc192YWxpZGF0ZV9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjKQoreworCXREb3QxMWZCZWFjb25JRXMgKnBJZXMgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IHZhbGlkYXRpb24gZm9yIFFBUCAmIEFQU0QiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWRvIHsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoCisJCQljc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzKAorCQkJCXBNYWMsIHBCc3NEZXNjLAkmcEllcykpKSB7CisJCQkvKiBlcnIgbXNnICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMoKSBmYWlsZWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGNoZWNrIGlmIHRoZSBBUCBpcyBRQVAgJiBpdCBzdXBwb3J0cyBBUFNEICovCisJCWlmICghQ1NSX0lTX1FPU19CU1MocEllcykpIHsKKwkJCS8qIGVyciBtc2cgKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiAlZDogQVAgZG9lc24ndCBzdXBwb3J0IFFvUyIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCisJCQlicmVhazsKKwkJfQorCQlpZiAoIShwSWVzLT5XTU1QYXJhbXMucW9zSW5mbyAmIFNNRV9RT1NfQVBfU1VQUE9SVFNfQVBTRCkgJiYKKwkJICAgICEocEllcy0+V01NSW5mb0FwLnVhcHNkKSkgeworCQkJLyogZXJyIG1zZyAqLworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ICVkOiBBUCBkb2Vzbid0IHN1cHBvcnQgQVBTRCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJYnJlYWs7CisJCX0KKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0gd2hpbGUgKDApOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiB2YWxpZGF0ZWQgd2l0aCBzdGF0dXMgPSAlZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCBzdGF0dXMpOworCWlmIChwSWVzKSB7CisJCWNkZl9tZW1fZnJlZShwSWVzKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9xb3NfY3NyX2V2ZW50X2luZCgpIC0gVGhlIFFvUyBzdWItbW9kdWxlIGluIFNNRSBleHBlY3RzIG5vdGlmaWNhdGlvbnMKKyAgIGZyb20gQ1NSIHdoZW4gY2VydGFpbiBldmVudHMgb2NjdXIgYXMgbWVudGlvbmVkIGluIHNtZV9xb3NfY3NyX2V2ZW50X2luZFR5cGUuCisgICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgIFxwYXJhbSBpbmQgLSBUaGUgZXZlbnQgb2NjdXJyZWQgb2YgdHlwZSBzbWVfcW9zX2Nzcl9ldmVudF9pbmRUeXBlLgorICAgXHBhcmFtIHBFdmVudF9pbmZvIC0gSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZXZlbnQKKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfY3NyX2V2ZW50X2luZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkgc21lX3Fvc19jc3JfZXZlbnRfaW5kVHlwZSBpbmQsIHZvaWQgKnBFdmVudF9pbmZvKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IE9uIFNlc3Npb24gJWQgRXZlbnQgJWQgcmVjZWl2ZWQgZnJvbSBDU1IiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkLCBpbmQpOworCXN3aXRjaCAoaW5kKSB7CisJY2FzZSBTTUVfUU9TX0NTUl9BU1NPQ19DT01QTEVURToKKwkJLyogZXhwZWN0aW5nIGFzc29jIGluZm8gaW4gcEV2ZW50X2luZm8gKi8KKwkJc3RhdHVzID0KKwkJCXNtZV9xb3NfcHJvY2Vzc19hc3NvY19jb21wbGV0ZV9ldihwTWFjLCBzZXNzaW9uSWQsIHBFdmVudF9pbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBTTUVfUU9TX0NTUl9SRUFTU09DX1JFUToKKwkJLyogbm90aGluZyBleHBlY3RlZCBpbiBwRXZlbnRfaW5mbyAqLworCQlzdGF0dXMgPQorCQkJc21lX3Fvc19wcm9jZXNzX3JlYXNzb2NfcmVxX2V2KHBNYWMsIHNlc3Npb25JZCwgcEV2ZW50X2luZm8pOworCQlicmVhazsKKwljYXNlIFNNRV9RT1NfQ1NSX1JFQVNTT0NfQ09NUExFVEU6CisJCS8qIGV4cGVjdGluZyBhc3NvYyBpbmZvIGluIHBFdmVudF9pbmZvICovCisJCXN0YXR1cyA9CisJCQlzbWVfcW9zX3Byb2Nlc3NfcmVhc3NvY19zdWNjZXNzX2V2KHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQkgICBwRXZlbnRfaW5mbyk7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19DU1JfUkVBU1NPQ19GQUlMVVJFOgorCQkvKiBub3RoaW5nIGV4cGVjdGVkIGluIHBFdmVudF9pbmZvICovCisJCXN0YXR1cyA9CisJCQlzbWVfcW9zX3Byb2Nlc3NfcmVhc3NvY19mYWlsdXJlX2V2KHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQkgICBwRXZlbnRfaW5mbyk7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19DU1JfRElTQ09OTkVDVF9SRVE6CisJY2FzZSBTTUVfUU9TX0NTUl9ESVNDT05ORUNUX0lORDoKKwkJLyogbm90aGluZyBleHBlY3RlZCBpbiBwRXZlbnRfaW5mbyAqLworCQlzdGF0dXMgPQorCQkJc21lX3Fvc19wcm9jZXNzX2Rpc2Nvbm5lY3RfZXYocE1hYywgc2Vzc2lvbklkLCBwRXZlbnRfaW5mbyk7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19DU1JfSk9JTl9SRVE6CisJCS8qIG5vdGhpbmcgZXhwZWN0ZWQgaW4gcEV2ZW50X2luZm8gKi8KKwkJc3RhdHVzID0gc21lX3Fvc19wcm9jZXNzX2pvaW5fcmVxX2V2KHBNYWMsIHNlc3Npb25JZCwgcEV2ZW50X2luZm8pOworCQlicmVhazsKKwljYXNlIFNNRV9RT1NfQ1NSX0hBTkRPRkZfQVNTT0NfUkVROgorCQkvKiBub3RoaW5nIGV4cGVjdGVkIGluIHBFdmVudF9pbmZvICovCisJCXN0YXR1cyA9CisJCQlzbWVfcW9zX3Byb2Nlc3NfaGFuZG9mZl9hc3NvY19yZXFfZXYocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCSAgICAgcEV2ZW50X2luZm8pOworCQlicmVhazsKKwljYXNlIFNNRV9RT1NfQ1NSX0hBTkRPRkZfQ09NUExFVEU6CisJCS8qIG5vdGhpbmcgZXhwZWN0ZWQgaW4gcEV2ZW50X2luZm8gKi8KKwkJc3RhdHVzID0KKwkJCXNtZV9xb3NfcHJvY2Vzc19oYW5kb2ZmX3N1Y2Nlc3NfZXYocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCSAgIHBFdmVudF9pbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBTTUVfUU9TX0NTUl9IQU5ET0ZGX0ZBSUxVUkU6CisJCS8qIG5vdGhpbmcgZXhwZWN0ZWQgaW4gcEV2ZW50X2luZm8gKi8KKwkJc3RhdHVzID0KKwkJCXNtZV9xb3NfcHJvY2Vzc19oYW5kb2ZmX2ZhaWx1cmVfZXYocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCSAgIHBFdmVudF9pbmZvKTsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwljYXNlIFNNRV9RT1NfQ1NSX1BSRUFVVEhfU1VDQ0VTU19JTkQ6CisJCXN0YXR1cyA9CisJCQlzbWVfcW9zX3Byb2Nlc3NfcHJlYXV0aF9zdWNjZXNzX2luZChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICAgIHBFdmVudF9pbmZvKTsKKwkJYnJlYWs7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9MRlIpCisJY2FzZSBTTUVfUU9TX0NTUl9TRVRfS0VZX1NVQ0NFU1NfSU5EOgorCQlzdGF0dXMgPQorCQkJc21lX3Fvc19wcm9jZXNzX3NldF9rZXlfc3VjY2Vzc19pbmQocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCSAgICBwRXZlbnRfaW5mbyk7CisJCWJyZWFrOworI2VuZGlmCisjZW5kaWYKKwlkZWZhdWx0OgorCQkvKiBFcnIgbXNnICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBPbiBTZXNzaW9uICVkIFVua25vd24gRXZlbnQgJWQgcmVjZWl2ZWQgZnJvbSBDU1IiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgaW5kKTsKKwkJYnJlYWs7CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBPbiBTZXNzaW9uICVkIHByb2Nlc3NlZCBFdmVudCAlZCB3aXRoIHN0YXR1cyAlZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQsIGluZCwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19nZXRfYWNtX21hc2soKSAtIFRoZSBRb1Mgc3ViLW1vZHVsZSBBUEkgdG8gZmluZCBvdXQgb24gd2hpY2ggQUNzCisgICBBUCBtYW5kYXRlcyBBZG1pc3Npb24gQ29udHJvbCAoQUNNID0gMSkKKyAgIChCaXQwOlZPOyBCaXQxOlZJOyBCaXQyOkJLOyBCaXQzOkJFIGFsbCBvdGhlciBiaXRzIGFyZSBpZ25vcmVkKQorICAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgICBccGFyYW0gcFNpckJzc0Rlc2MgLSBUaGUgZXZlbnQgb2NjdXJyZWQgb2YgdHlwZSBzbWVfcW9zX2Nzcl9ldmVudF9pbmRUeXBlLgorCisgICBccmV0dXJuIGEgYml0IG1hc2sgaW5kaWNhdGluZyBmb3Igd2hpY2ggQUNzIEFQIGhhcyBBQ00gc2V0IHRvIDEKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VpbnQ4X3Qgc21lX3Fvc19nZXRfYWNtX21hc2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJCSAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKwl1aW50OF90IGFjbV9tYXNrID0gMDsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogaW52b2tlZCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJZm9yIChhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSB7CisJCWlmIChzbWVfcW9zX2lzX2FjbShwTWFjLCBwU2lyQnNzRGVzYywgYWMsIHBJZXMpKSB7CisJCQlhY21fbWFzayA9IGFjbV9tYXNrIHwgKDEgPDwgKFNNRV9RT1NfRURDQV9BQ19WTyAtIGFjKSk7CisJCX0KKworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogbWFzayBpcyAlZCIsIF9fZnVuY19fLCBfX0xJTkVfXywgYWNtX21hc2spOworCXJldHVybiBhY21fbWFzazsKK30KKworLyogSW50ZXJuYWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKi8KKworLyoqCisgKiAgc21lX3Fvc19pbnRlcm5hbF9zZXR1cF9yZXEoKSAtIFRoZSBTTUUgUW9TIGludGVybmFsIHNldHVwIHJlcXVlc3QgaGFuZGxpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKgorICogIEBwTWFjOiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgKiAgQHBRb1NJbmZvOiBQb2ludGVyIHRvIHNtZV9Rb3NXbW1Uc3BlY0luZm8gd2hpY2ggY29udGFpbnMgdGhlIFdNTSBUU1BFQworICogICAgICAgICAgICAgcmVsYXRlZCBpbmZvIGFzIGRlZmluZWQgYWJvdmUsIHByb3ZpZGVkIGJ5IEhERAorICogIEBRb1NDYWxsYmFjazogVGhlIGNhbGxiYWNrIHdoaWNoIGlzIHJlZ2lzdGVyZWQgcGVyIGZsb3cgd2hpbGUKKyAqICAgICAgICAgICAgICAgIHJlcXVlc3RpbmcgZm9yIFFvUy4gVXNlZCBmb3IgYW55IG5vdGlmaWNhdGlvbiBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICBmbG93IChpLmUuIHNldHVwIHN1Y2Nlc3MvZmFpbHVyZS9yZWxlYXNlKSB3aGljaCBuZWVkcyB0bworICogICAgICAgICAgICAgICAgYmUgc2VudCB0byBIREQKKyAqICBASEREY29udGV4dDogQSBjb29raWUgcGFzc2VkIGJ5IEhERCB0byBiZSB1c2VkIGJ5IFNNRSBkdXJpbmcgYW55IFFvUworICogICAgICAgICAgICAgICBub3RpZmljYXRpb24gKHRocm91Z2ggdGhlIGNhbGxhYmNrKSB0byBIREQKKyAqICBAVVBUeXBlOiBVc2VmdWwgb25seSBpZiBIREQgb3IgYW55IG90aGVyIHVwcGVyIGxheWVyIG1vZHVsZSAoQkFQIGV0Yy4pCisgKiAgICAgICAgICAgbG9va2luZyBmb3IgaW1wbGljaXQgUW9TIHNldHVwLCBpbiB0aGF0CisgKiAgICAgICAgICAgY2FzZSwgdGhlIHBRb1NJbmZvIHdpbGwgYmUgTlVMTCAmIFNNRSB3aWxsIGtub3cgYWJvdXQgdGhlIEFDCisgKiAgICAgICAgICAgKGZyb20gdGhlIFVQIHByb3ZpZGVkIGluIHRoaXMgcGFyYW0pIFFvUyBpcyByZXF1ZXN0ZWQgb24KKyAqICBAUW9zRmxvd0lEOiBJZGVudGlmaWNhdGlvbiBwZXIgZmxvdyBydW5uaW5nIG9uIGVhY2ggQUMgZ2VuZXJhdGVkIGJ5CisgKiAgICAgICAgICAgICAgU01FLiBJdCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIFFvUyBzZXR1cCBmb3IgdGhlIGZsb3cgaXMKKyAqICAgICAgICAgICAgICBzdWNjZXNzZnVsCisgKiAgQGJ1ZmZlcmVkX2NtZDogdGVsbHMgdXMgaWYgdGhlIGNtZCB3YXMgYSBidWZmZXJlZCBvbmUgb3IgZnJlc2ggZnJvbQorICogICAgICAgICAgICAgICAgIGNsaWVudAorICoKKyAqICBJZiB0aGUgcmVxdWVzdCBpbnZvbHZlcyBhZG1pc3Npb24gY29udHJvbCBvbiB0aGUgcmVxdWVzdGVkIEFDLCBIREQgbmVlZHMgdG8KKyAqICBwcm92aWRlIHRoZSBuZWNlc3NhcnkgVHJhZmZpYyBTcGVjaWZpY2F0aW9uIChUU1BFQykgcGFyYW1ldGVycyBvdGhlcndpc2UgU01FCisgKiAgaXMgZ29pbmcgdG8gdXNlIHRoZSBkZWZhdWx0IHBhcmFtcy4KKyAqCisgKiAgUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBTZXR1cCBpcyBzdWNjZXNzZnVsLgorICogICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNldHVwIHJlcXVlc3QgZmFpbGVkCisgKi8KK3NtZV9Rb3NTdGF0dXNUeXBlIHNtZV9xb3NfaW50ZXJuYWxfc2V0dXBfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqcFFvU0luZm8sCisJCQkJCSAgICAgc21lX1Fvc0NhbGxiYWNrIFFvU0NhbGxiYWNrLAorCQkJCQkgICAgIHZvaWQgKkhERGNvbnRleHQsCisJCQkJCSAgICAgc21lX1Fvc1dtbVVwVHlwZSBVUFR5cGUsCisJCQkJCSAgICAgdWludDMyX3QgUW9zRmxvd0lELAorCQkJCQkgICAgIGJvb2wgYnVmZmVyZWRfY21kLCBib29sIGhvUmVuZXdhbCkKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCXNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisJc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisJc21lX1Fvc1dtbVRzcGVjSW5mbyBUc3BlY19JbmZvOworCXNtZV9Rb3NTdGF0ZXMgbmV3X3N0YXRlID0gU01FX1FPU19DTE9TRUQ7CisJc21lX1Fvc0Zsb3dJbmZvRW50cnkgKnBlbnRyeSA9IE5VTEw7CisJc21lX1Fvc0NtZEluZm8gY21kOworCXNtZV9Rb3NTdGF0dXNUeXBlIHN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOworCXVpbnQ4X3QgdG1hc2sgPSAwOworCXVpbnQ4X3QgbmV3X3RtYXNrID0gMDsKKwlzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5OworCUNERl9TVEFUVVMgaHN0YXR1czsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIGZvciBmbG93ICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgUW9zRmxvd0lEKTsKKwlwU2Vzc2lvbiA9ICZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisJLyogaWYgY2FsbGVyIHNlbnQgYW4gZW1wdHkgVFNQRUMsIGZpbGwgdXAgd2l0aCB0aGUgZGVmYXVsdCBvbmUgKi8KKwlpZiAoIXBRb1NJbmZvKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkgICIlczogJWQ6IGNhbGxlciBzZW50IGFuIGVtcHR5IFFvUyBwYXJhbSBsaXN0LCB1c2luZyBkZWZhdWx0cyIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCS8qIGZpbmQgdGhlIEFDIHdpdGggVVBUeXBlIHBhc3NlZCBpbiAqLworCQlhYyA9IHNtZV9xb3NfdXBfdG9fYWMoVVBUeXBlKTsKKwkJaWYgKFNNRV9RT1NfRURDQV9BQ19NQVggPT0gYWMpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiAlZDogaW52YWxpZCBBQyAlZCBmcm9tIFVQICVkIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgYWMsIFVQVHlwZSk7CisKKwkJCXJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9JTlZBTElEX1BBUkFNU19SU1A7CisJCX0KKwkJVHNwZWNfSW5mbyA9IHNtZV9xb3NfY2IuZGVmX1FvU0luZm9bYWNdOworCX0gZWxzZSB7CisJCS8qIGZpbmQgdGhlIEFDICovCisJCWFjID0gc21lX3Fvc191cF90b19hYyhwUW9TSW5mby0+dHNfaW5mby51cCk7CisJCWlmIChTTUVfUU9TX0VEQ0FfQUNfTUFYID09IGFjKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IGludmFsaWQgQUMgJWQgZnJvbSBVUCAlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIGFjLCBwUW9TSW5mby0+dHNfaW5mby51cCk7CisKKwkJCXJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9JTlZBTElEX1BBUkFNU19SU1A7CisJCX0KKwkJLyogdmFsaWRhdGUgUW9TIHBhcmFtcyAqLworCQlpZiAoIXNtZV9xb3NfdmFsaWRhdGVfcmVxdWVzdGVkX3BhcmFtcyhwTWFjLCBwUW9TSW5mbywgc2Vzc2lvbklkKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ICVkOiBpbnZhbGlkIHBhcmFtcyIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfSU5WQUxJRF9QQVJBTVNfUlNQOworCQl9CisJCVRzcGVjX0luZm8gPSAqcFFvU0luZm87CisJfQorCXBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworCS8qIG5lZWQgdG8gdm90ZSBvZmYgcG93ZXJzYXZlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyByZXF1ZXN0ICovCisJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gZmFsc2U7CisJLyogY2hlY2sgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyBmbG93aW5nIHNjZW5hcmlvLgorCSAqIEFkZHRzIHJlcXVlc3QgaXMgcGVuZGluZyBvbiBvbmUgQUMsIHdoaWxlIEFQU0QgcmVxdWVzdGVkIG9uIGFub3RoZXIKKwkgKiB3aGljaCBuZWVkcyBhIHJlYXNzb2MuIFdpbGwgYnVmZmVyIGEgcmVxdWVzdCBpZiBBZGR0cyBpcyBwZW5kaW5nCisJICogb24gYW55IEFDLCB3aGljaCB3aWxsIHNhZmVnYXVyZCB0aGUgYWJvdmUgc2NlbmFyaW8sICYgYWxzbyB3b24ndAorCSAqIGNvbmZ1c2UgUEUgd2l0aCBiYWNrIHRvIGJhY2sgQWRkdHMgb3IgQWRkdHMgZm9sbG93ZWQgYnkgUmVhc3NvYworCSAqLworCWlmIChzbWVfcW9zX2lzX3JzcF9wZW5kaW5nKHNlc3Npb25JZCwgYWMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJICAiJXM6ICVkOiBidWZmZXJpbmcgdGhlIHNldHVwIHJlcXVlc3QgZm9yIGZsb3cgJWQgaW4gc3RhdGUgJWQgIgorCQkJICAic2luY2UgYW5vdGhlciByZXF1ZXN0IGlzIHBlbmRpbmciLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCwgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisJCS8qIHdlIG5lZWQgdG8gYnVmZmVyIHRoZSBjb21tYW5kICovCisJCWNtZC5jb21tYW5kID0gU01FX1FPU19TRVRVUF9SRVE7CisJCWNtZC5wTWFjID0gcE1hYzsKKwkJY21kLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJY21kLnUuc2V0dXBDbWRJbmZvLkhERGNvbnRleHQgPSBIRERjb250ZXh0OworCQljbWQudS5zZXR1cENtZEluZm8uUW9TSW5mbyA9IFRzcGVjX0luZm87CisJCWNtZC51LnNldHVwQ21kSW5mby5Rb1NDYWxsYmFjayA9IFFvU0NhbGxiYWNrOworCQljbWQudS5zZXR1cENtZEluZm8uVVBUeXBlID0gVVBUeXBlOworCQljbWQudS5zZXR1cENtZEluZm8uaG9SZW5ld2FsID0gaG9SZW5ld2FsOworCQljbWQudS5zZXR1cENtZEluZm8uUW9zRmxvd0lEID0gUW9zRmxvd0lEOworCQloc3RhdHVzID0gc21lX3Fvc19idWZmZXJfY21kKCZjbWQsIGJ1ZmZlcmVkX2NtZCk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IGNvdWxkbid0IGJ1ZmZlciB0aGUgc2V0dXAgcmVxdWVzdCBpbiBzdGF0ZSA9ICVkIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisJCQkvKiB1bmFibGUgdG8gYnVmZmVyIHRoZSByZXF1ZXN0ICovCisJCQkvKiBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbiAqLworCQkJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJCXJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDsKKwkJfQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogJWQ6IEJ1ZmZlcmVkIHNldHVwIHJlcXVlc3QgZm9yIGZsb3cgPSAlZCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgUW9zRmxvd0lEKTsKKwkJcmV0dXJuIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUDsKKwl9CisJLyogZ2V0IGludG8gdGhlIHN0YXRlIG0vYyB0byBzZWUgaWYgdGhlIHJlcXVlc3QgY2FuIGJlIGdyYW50ZWQgKi8KKwlzd2l0Y2ggKHBBQ0luZm8tPmN1cnJfc3RhdGUpIHsKKwljYXNlIFNNRV9RT1NfTElOS19VUDoKKwkJLyogY2FsbCB0aGUgaW50ZXJuYWwgcW9zIHNldHVwIGxvZ2ljIHRvIGRlY2lkZSBvbiBpZiB0aGUgKi8KKwkJLyogcmVxdWVzdCBpcyBOT1AsIG9yIG5lZWQgcmVhc3NvYyBmb3IgQVBTRCBhbmQvb3IgbmVlZCB0byBzZW5kIG91dCBBRERUUyAqLworCQlzdGF0dXMgPSBzbWVfcW9zX3NldHVwKHBNYWMsIHNlc3Npb25JZCwgJlRzcGVjX0luZm8sIGFjKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHdpdGggQUMgJWQgaW4gc3RhdGUgU01FX1FPU19MSU5LX1VQICIKKwkJCSAgInNtZV9xb3Nfc2V0dXAgcmV0dXJuZWQgd2l0aCBzdGF0dXMgJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgYWMsIHN0YXR1cyk7CisJCWlmIChTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1AgIT0gc3RhdHVzKSB7CisJCQkvKiB3ZSBhcmVuJ3Qgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBBUCAqLworCQkJLyogc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbiAqLworCQkJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJfQorCQlpZiAoKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUCA9PSBzdGF0dXMpIHx8CisJCSAgICAoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1AgPT0gc3RhdHVzKQorCQkgICAgfHwgKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PQorCQkJc3RhdHVzKSkgeworCQkJLyogd2UgcmVjZWl2ZWQgYW4gZXhwZWN0ZWQgImdvb2QiIHN0YXR1cyAqLworCQkJLyogY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBmbG93IGxpc3QgKi8KKwkJCXBlbnRyeSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcGVudHJ5KSk7CisJCQlpZiAoIXBlbnRyeSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgIiVzOiAlZDogY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbmV3ICIKKwkJCQkJICAiZW50cnkgaW4gdGhlIEZsb3cgTGlzdCIsIF9fZnVuY19fLAorCQkJCQkgIF9fTElORV9fKTsKKwkJCQlyZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisJCQl9CisJCQlwZW50cnktPmFjX3R5cGUgPSBhYzsKKwkJCXBlbnRyeS0+SEREY29udGV4dCA9IEhERGNvbnRleHQ7CisJCQlwZW50cnktPlFvU0NhbGxiYWNrID0gUW9TQ2FsbGJhY2s7CisJCQlwZW50cnktPmhvUmVuZXdhbCA9IGhvUmVuZXdhbDsKKwkJCXBlbnRyeS0+UW9zRmxvd0lEID0gUW9zRmxvd0lEOworCQkJcGVudHJ5LT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJCQkvKiBzaW5jZSB3ZSBhcmUgaW4gc3RhdGUgU01FX1FPU19MSU5LX1VQIHRoaXMgbXVzdCBiZSB0aGUgKi8KKwkJCS8qIGZpcnN0IFRTUEVDIG9uIHRoaXMgQUMsIHNvIHVzZSBpbmRleCAwIChtYXNrIGJpdCAxKSAqLworCQkJcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXSA9CisJCQkJVHNwZWNfSW5mbzsKKwkJCWlmIChTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1AgPT0gc3RhdHVzKSB7CisJCQkJaWYgKHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzICYmCisJCQkJICAgICFwQUNJbmZvLT5yZWFzc29jX3BlbmRpbmcpIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgd2l0aCBBQyAlZCBpbiBzdGF0ZSAiCisJCQkJCQkgICJTTUVfUU9TX0xJTktfVVAgdHNwZWNfbWFza19zdGF0dXMgaXMgJWQgIgorCQkJCQkJICAiYnV0IHNob3VsZCBub3QgYmUgc2V0IHlldCIsCisJCQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkLAorCQkJCQkJICBhYywKKwkJCQkJCSAgcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMpOworCQkJCQlDREZfQVNTRVJUKDApOworCQkJCQljZGZfbWVtX2ZyZWUocGVudHJ5KTsKKwkJCQkJcmV0dXJuIFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOworCQkJCX0KKwkJCQlwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyA9CisJCQkJCVNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV9TRVQ7CisJCQkJaWYgKCFwQUNJbmZvLT5yZWFzc29jX3BlbmRpbmcpIHsKKwkJCQkJLyogd2UgZGlkbid0IHJlcXVlc3QgZm9yIHJlYXNzb2MsIGl0IG11c3QgYmUgYSB0c3BlYyBuZWdvdGlhdGlvbiAqLworCQkJCQlwQUNJbmZvLT50c3BlY19wZW5kaW5nID0gMTsKKwkJCQl9CisKKwkJCQlwZW50cnktPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1NFVFVQOworCQkJCW5ld19zdGF0ZSA9IFNNRV9RT1NfUkVRVUVTVEVEOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUCBvciAqLworCQkJCS8qIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSAqLworCQkJCXBlbnRyeS0+cmVhc29uID0gU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1M7CisJCQkJbmV3X3N0YXRlID0gU01FX1FPU19RT1NfT047CisJCQkJcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMgPQorCQkJCQlTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfU0VUOworCQkJCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdID0KKwkJCQkJVHNwZWNfSW5mbzsKKwkJCQlpZiAoYnVmZmVyZWRfY21kICYmICFwZW50cnktPmhvUmVuZXdhbCkgeworCQkJCQlRb1NDYWxsYmFjayhwTWFjLCBIRERjb250ZXh0LAorCQkJCQkJICAgICZwQUNJbmZvLT4KKwkJCQkJCSAgICBjdXJyX1FvU0luZm8KKwkJCQkJCSAgICBbU01FX1FPU19UU1BFQ19JTkRFWF8wXSwKKwkJCQkJCSAgICBzdGF0dXMsIHBlbnRyeS0+UW9zRmxvd0lEKTsKKwkJCQl9CisJCQkJcGVudHJ5LT5ob1JlbmV3YWwgPSBmYWxzZTsKKwkJCX0KKwkJCXBBQ0luZm8tPm51bV9mbG93c1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdKys7CisKKwkJCS8qIGluZGljYXRlIG9uIHdoaWNoIGluZGV4IHRoZSBmbG93IGVudHJ5IGJlbG9uZ3MgdG8gJiBhZGQgaXQgdG8gdGhlICovCisJCQkvKiBGbG93IExpc3QgYXQgdGhlIGVuZCAqLworCQkJcGVudHJ5LT50c3BlY19tYXNrID0gcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXM7CisJCQlwZW50cnktPlFvU0luZm8gPSBUc3BlY19JbmZvOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgIiVzOiAlZDogQ3JlYXRpbmcgZW50cnkgb24gc2Vzc2lvbiAlZCBhdCAlcCB3aXRoIGZsb3dJRCAlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJICBzZXNzaW9uSWQsIHBlbnRyeSwgUW9zRmxvd0lEKTsKKwkJCWNzcl9sbF9pbnNlcnRfdGFpbCgmc21lX3Fvc19jYi5mbG93X2xpc3QsICZwZW50cnktPmxpbmssCisJCQkJCSAgIHRydWUpOworCQl9IGVsc2UgeworCQkJLyogdW5leHBlY3RlZCBzdGF0dXMgcmV0dXJuZWQgYnkgc21lX3Fvc19zZXR1cCgpICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgdW5leHBlY3RlZCBzdGF0dXMgJWQgIgorCQkJCSAgInJldHVybmVkIGJ5IHNtZV9xb3Nfc2V0dXAiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQsIHN0YXR1cyk7CisJCQluZXdfc3RhdGUgPSBwQUNJbmZvLT5jdXJyX3N0YXRlOworCQkJaWYgKGJ1ZmZlcmVkX2NtZCAmJiBob1JlbmV3YWwpIHsKKwkJCQlRb1NDYWxsYmFjayhwTWFjLCBIRERjb250ZXh0LAorCQkJCQkgICAgJnBBQ0luZm8tPgorCQkJCQkgICAgY3Vycl9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0sCisJCQkJCSAgICBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX1FPU19MT1NUX0lORCwKKwkJCQkJICAgIFFvc0Zsb3dJRCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTUVfUU9TX0hBTkRPRkY6CisJY2FzZSBTTUVfUU9TX1JFUVVFU1RFRDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisJCQkgICIlczogJWQ6IEJ1ZmZlcmluZyBzZXR1cCByZXF1ZXN0IGZvciBmbG93ICVkIGluIHN0YXRlID0gJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCwgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisJCS8qIGJ1ZmZlciBjbWQgKi8KKwkJY21kLmNvbW1hbmQgPSBTTUVfUU9TX1NFVFVQX1JFUTsKKwkJY21kLnBNYWMgPSBwTWFjOworCQljbWQuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworCQljbWQudS5zZXR1cENtZEluZm8uSEREY29udGV4dCA9IEhERGNvbnRleHQ7CisJCWNtZC51LnNldHVwQ21kSW5mby5Rb1NJbmZvID0gVHNwZWNfSW5mbzsKKwkJY21kLnUuc2V0dXBDbWRJbmZvLlFvU0NhbGxiYWNrID0gUW9TQ2FsbGJhY2s7CisJCWNtZC51LnNldHVwQ21kSW5mby5VUFR5cGUgPSBVUFR5cGU7CisJCWNtZC51LnNldHVwQ21kSW5mby5ob1JlbmV3YWwgPSBob1JlbmV3YWw7CisJCWNtZC51LnNldHVwQ21kSW5mby5Rb3NGbG93SUQgPSBRb3NGbG93SUQ7CisJCWhzdGF0dXMgPSBzbWVfcW9zX2J1ZmZlcl9jbWQoJmNtZCwgYnVmZmVyZWRfY21kKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoaHN0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBjb3VsZG4ndCBidWZmZXIgdGhlIHNldHVwICIKKwkJCQkgICJyZXF1ZXN0IGZvciBmbG93ICVkIGluIHN0YXRlID0gJWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLAorCQkJCSAgc2Vzc2lvbklkLCBRb3NGbG93SUQsIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworCQkJLyogdW5hYmxlIHRvIGJ1ZmZlciB0aGUgcmVxdWVzdCAqLworCQkJLyogbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJCXBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IHRydWU7CisJCQlyZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisJCX0KKwkJc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQOworCQluZXdfc3RhdGUgPSBwQUNJbmZvLT5jdXJyX3N0YXRlOworCQlicmVhazsKKwljYXNlIFNNRV9RT1NfUU9TX09OOgorCisJCS8qIGNoZWNrIGlmIG11bHRpcGxlIGZsb3dzIHJ1bm5pbmcgb24gdGhlIGFjICovCisJCWlmICgocEFDSW5mby0+bnVtX2Zsb3dzW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0gPiAwKSB8fAorCQkgICAgKHBBQ0luZm8tPm51bV9mbG93c1tTTUVfUU9TX1RTUEVDX0lOREVYXzFdID4gMCkpIHsKKwkJCS8qIGRvIHdlIG5lZWQgdG8gY2FyZSBhYm91dCB0aGUgY2FzZSB3aGVyZSBBUFNEIG5lZWRlZCBvbiBBQ00gPSAwIGJlbG93PyAqLworCQkJaWYgKENTUl9JU19BRERUU19XSEVOX0FDTU9GRl9TVVBQT1JURUQocE1hYykgfHwKKwkJCSAgICBzbWVfcW9zX2lzX2FjbShwTWFjLCBwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjLCBhYywKKwkJCQkJICAgTlVMTCkpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJCQkgICIlczogJWQ6IHRzcGVjX21hc2tfc3RhdHVzID0gJWQgZm9yIEFDID0gJWQiLAorCQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkJICBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cywgYWMpOworCQkJCWlmICghcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMpIHsKKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkgICIlczogJWQ6IHRzcGVjX21hc2tfc3RhdHVzIGNhbid0IGJlIDAgZm9yIGFjID0gJWQgaW4gIgorCQkJCQkJICAic3RhdGUgPSAlZCIsIF9fZnVuY19fLAorCQkJCQkJICBfX0xJTkVfXywgYWMsCisJCQkJCQkgIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworCQkJCQlDREZfQVNTRVJUKDApOworCQkJCQkvKiB1bmFibGUgdG8gc2VydmljZSB0aGUgcmVxdWVzdCAqLworCQkJCQkvKiBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbiAqLworCQkJCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCX0KKwkJCQkvKiBGbG93IGFnZ3JlZ2F0aW9uICovCisJCQkJaWYgKCgocEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMgPiAwKSAmJgorCQkJCSAgICAgKHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzIDw9CisJCQkJICAgICAgU01FX1FPU19UU1BFQ19JTkRFWF9NQVgpKSkgeworCQkJCQkvKiBFaXRoZXIgb2YgdXBzdHJlYW0sIGRvd25zdHJlYW0gb3IgYmlkaXJlY3Rpb25hbCBmbG93cyBhcmUgcHJlc2VudCAqLworCQkJCQkvKiBJZiBlaXRoZXIgb2YgbmV3IHN0cmVhbSBvciBjdXJyZW50IHN0cmVhbSBpcyBmb3IgYmlkaXJlY2lvbmFsLCBhZ2dyZWdhdGUKKwkJCQkJICogdGhlIG5ldyBzdHJlYW0gd2l0aCB0aGUgY3VycmVudCBzdHJlYW1zIHByZXNlbnQgYW5kIHNlbmQgb3V0IGFnZ3JlZ2F0ZWQgVHNwZWMuKi8KKwkJCQkJaWYgKChUc3BlY19JbmZvLnRzX2luZm8uZGlyZWN0aW9uID09CisJCQkJCSAgICAgU01FX1FPU19XTU1fVFNfRElSX0JPVEgpCisJCQkJCSAgICB8fCAocEFDSW5mby0+CisJCQkJCQljdXJyX1FvU0luZm9bcEFDSW5mby0+CisJCQkJCQkJICAgICB0c3BlY19tYXNrX3N0YXR1cyAtCisJCQkJCQkJICAgICAxXS50c19pbmZvLgorCQkJCQkJZGlyZWN0aW9uID09CisJCQkJCQlTTUVfUU9TX1dNTV9UU19ESVJfQk9USCkpIHsKKwkJCQkJCS8qIEFnZ3JlZ2F0ZSB0aGUgbmV3IHN0cmVhbSB3aXRoIHRoZSBjdXJyZW50IHN0cmVhbShzKS4gKi8KKwkJCQkJCXRtYXNrID0KKwkJCQkJCQlwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1czsKKwkJCQkJfQorCQkJCQkvKiBOb25lIG9mIG5ldyBzdHJlYW0gb3IgY3VycmVudCAoYWdncmVnYXRlZCkgc3RyZWFtcyBhcmUgZm9yIGJpZGlyZWN0aW9uYWwuCisJCQkJCSogQ2hlY2sgaWYgdGhlIG5ldyBzdHJlYW0gZGlyZWN0aW9uIG1hdGNoZXMgdGhlIGN1cnJlbnQgc3RyZWFtIGRpcmVjdGlvbi4gKi8KKwkJCQkJZWxzZSBpZiAocEFDSW5mby0+CisJCQkJCQkgY3Vycl9Rb1NJbmZvW3BBQ0luZm8tPgorCQkJCQkJCSAgICAgIHRzcGVjX21hc2tfc3RhdHVzCisJCQkJCQkJICAgICAgLQorCQkJCQkJCSAgICAgIDFdLnRzX2luZm8uCisJCQkJCQkgZGlyZWN0aW9uID09CisJCQkJCQkgVHNwZWNfSW5mby50c19pbmZvLmRpcmVjdGlvbikgeworCQkJCQkJLyogQWdncmVnYXRlIHRoZSBuZXcgc3RyZWFtIHdpdGggdGhlIGN1cnJlbnQgc3RyZWFtKHMpLiAqLworCQkJCQkJdG1hc2sgPQorCQkJCQkJCXBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzOworCQkJCQl9CisJCQkJCS8qIE5ldyBzdHJlYW0gaXMgaW4gZGlmZmVyZW50IGRpcmVjdGlvbi4gKi8KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBObyBBZ2dyZWdhdGlvbi4gTWFyayB0aGUgMm5kIHRwc2VjIGluZGV4IGFsc28gYXMgYWN0aXZlLiAqLworCQkJCQkJdG1hc2sgPQorCQkJCQkJCVNNRV9RT1NfVFNQRUNfTUFTS19DTEVBUjsKKwkJCQkJCW5ld190bWFzayA9CisJCQkJCQkJU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUCisJCQkJCQkJJiB+cEFDSW5mby0+CisJCQkJCQkJdHNwZWNfbWFza19zdGF0dXM7CisJCQkJCQlwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyA9CisJCQkJCQkJU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgPT0KKwkJCQkJICAgcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMpIHsKKwkJCQkJLyogQm90aCB1cGxpbmsgYW5kIGRvd25saW5rIHN0cmVhbXMgYXJlIHByZXNlbnQuICovCisJCQkJCS8qIElmIG5ldyBzdHJlYW0gaXMgYmlkaXJlY3Rpb25hbCwgYWdncmVnYXRlIG5ldyBzdHJlYW0gd2l0aCBhbGwgZXhpc3RpbmcKKwkJCQkJICogdXBzdHJlYW1zIGFuZCBkb3duc3RyZWFtcy4gU2VuZCBvdXQgbmV3IGFnZ3JlZ2F0ZWQgdHBzZWMuICovCisJCQkJCWlmIChUc3BlY19JbmZvLnRzX2luZm8uZGlyZWN0aW9uID09CisJCQkJCSAgICBTTUVfUU9TX1dNTV9UU19ESVJfQk9USCkgeworCQkJCQkJLyogT25seSBvbmUgdHNwZWMgaW5kZXggKDApIHdpbGwgYmUgaW4gdXNlIGFmdGVyIHRoaXMgYWdncmVnYXRpb24uICovCisJCQkJCQl0bWFzayA9CisJCQkJCQkJU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUOworCQkJCQkJcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMgPQorCQkJCQkJCVNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV9TRVQ7CisJCQkJCX0KKwkJCQkJLyogTmV3IHN0cmVhbSBpcyBhbHNvIHVuaS1kaXJlY3Rpb25hbAorCQkJCQkgKiBGaW5kIG91dCB0aGUgdHNlcGMgaW5kZXggd2l0aCB3aGljaCBpdCBuZWVkcyB0byBiZSBhZ2dyZWdhdGVkICovCisJCQkJCWVsc2UgaWYgKHBBQ0luZm8tPgorCQkJCQkJIGN1cnJfUW9TSW5mbworCQkJCQkJIFtTTUVfUU9TX1RTUEVDX0lOREVYXzBdLgorCQkJCQkJIHRzX2luZm8uZGlyZWN0aW9uICE9CisJCQkJCQkgVHNwZWNfSW5mby50c19pbmZvLmRpcmVjdGlvbikgeworCQkJCQkJLyogQWdncmVnYXRlIHdpdGggMm5kIHRzcGVjIGluZGV4ICovCisJCQkJCQl0bWFzayA9CisJCQkJCQkJU01FX1FPU19UU1BFQ19NQVNLX0JJVF8yX1NFVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIEFnZ3JlZ2F0ZSB3aXRoIDFzdCB0c3BlYyBpbmRleCAqLworCQkJCQkJdG1hc2sgPQorCQkJCQkJCVNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV9TRVQ7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCQkJCSAgIiVzOiAlZDogd3JvbmcgdG1hc2sgPSAlZCIsCisJCQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkJCSAgcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogQUNNID0gMCAqLworCQkJCS8qIFdlIHdvbid0IGJlIHNlbmRpbmcgYSBUU1BFQyB0byB0aGUgQVAgYnV0IHdlIHN0aWxsIG5lZWQgKi8KKwkJCQkvKiB0byBhZ2dyZWdhdGUgdG8gY2FsY3VsYXRlIHRyaWdnZXIgZnJhbWUgcGFyYW1ldGVycyAqLworCQkJCXRtYXNrID0gU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xX1NFVDsKKwkJCX0KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJCSAgIiVzOiAlZDogdG1hc2sgPSAlZCwgbmV3X3RtYXNrID0gJWQgaW4gc3RhdGUgPSAlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJICB0bWFzaywgbmV3X3RtYXNrLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJCSAgIiVzOiAlZDogdHNwZWNfbWFza19zdGF0dXMgPSAlZCBmb3IgQUMgPSAlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJICBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cywgYWMpOworCQkJaWYgKHRtYXNrKSB7CisJCQkJLyogY3JlYXRlIHRoZSBhZ2dyZWdhdGUgVFNQRUMgKi8KKwkJCQlpZiAodG1hc2sgIT0gU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUKSB7CisJCQkJCWhzdGF0dXMgPQorCQkJCQkJc21lX3Fvc19hZ2dyZWdhdGVfcGFyYW1zKCZUc3BlY19JbmZvLAorCQkJCQkJCQkJICZwQUNJbmZvLT4KKwkJCQkJCQkJCSBjdXJyX1FvU0luZm8KKwkJCQkJCQkJCSBbdG1hc2sgLSAxXSwKKwkJCQkJCQkJCSAmcEFDSW5mby0+CisJCQkJCQkJCQkgcmVxdWVzdGVkX1FvU0luZm8KKwkJCQkJCQkJCSBbdG1hc2sgLSAxXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogQWdncmVnYXRlIHRoZSBuZXcgYmlkaXJlY3Rpb25hbCBzdHJlYW0gd2l0aCB0aGUgZXhpc3RpbmcgdXBzdHJlYW1zIGFuZAorCQkJCQkgKiBkb3duc3RyZWFtcyBpbiB0c3BlYyBpbmRpY2VzIDAgYW5kIDEuICovCisJCQkJCXRtYXNrID0gU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xX1NFVDsKKworCQkJCQloc3RhdHVzID0gc21lX3Fvc19hZ2dyZWdhdGVfcGFyYW1zKAorCQkJCQkJCSZUc3BlY19JbmZvLCAmcEFDSW5mby0+CisJCQkJCQkJY3Vycl9Rb1NJbmZvCisJCQkJCQkJW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0sCisJCQkJCQkJJnBBQ0luZm8tPgorCQkJCQkJCXJlcXVlc3RlZF9Rb1NJbmZvCisJCQkJCQkJW3RtYXNrIC0gMV0pOworCQkJCQlpZiAoaHN0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJCWhzdGF0dXMgPQorCQkJCQkJCXNtZV9xb3NfYWdncmVnYXRlX3BhcmFtcworCQkJCQkJCQkoJnBBQ0luZm8tPgorCQkJCQkJCQljdXJyX1FvU0luZm8KKwkJCQkJCQkJW1NNRV9RT1NfVFNQRUNfSU5ERVhfMV0sCisJCQkJCQkJCSZwQUNJbmZvLT4KKwkJCQkJCQkJcmVxdWVzdGVkX1FvU0luZm9bdG1hc2sgLQorCQkJCQkJCQkJCSAgMV0sCisJCQkJCQkJCU5VTEwpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoaHN0YXR1cykpIHsKKwkJCQkJLyogZXJyIG1zZyAqLworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJCSAgIiVzOiAlZDogZmFpbGVkIHRvIGFnZ3JlZ2F0ZSBwYXJhbXMiLAorCQkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJCQkvKiB1bmFibGUgdG8gc2VydmljZSB0aGUgcmVxdWVzdCAqLworCQkJCQkvKiBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbiAqLworCQkJCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQkJCQlyZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIQorCQkJCSAgICAobmV3X3RtYXNrID4gMAorCQkJCSAgICAgJiYgbmV3X3RtYXNrIDw9IFNNRV9RT1NfVFNQRUNfSU5ERVhfTUFYKSkgeworCQkJCQlyZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisJCQkJfQorCQkJCXRtYXNrID0gbmV3X3RtYXNrOworCQkJCXBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RtYXNrIC0gMV0gPQorCQkJCQlUc3BlY19JbmZvOworCQkJfQorCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ICVkOiBubyBmbG93cyBydW5uaW5nIGZvciBhYyA9ICVkIHdoaWxlIGluIHN0YXRlID0gJWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBhYywgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisJCQlDREZfQVNTRVJUKDApOworCQkJLyogdW5hYmxlIHRvIHNlcnZpY2UgdGhlIHJlcXVlc3QgKi8KKwkJCS8qIG5vdGhpbmcgaXMgcGVuZGluZyBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uICovCisJCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQkvKiBhbHRob3VnaCBhZ2dyZWdhdGluZywgbWFrZSBzdXJlIHRvIHJlcXVlc3Qgb24gdGhlIGNvcnJlY3QgVVAsVElELFBTQiBhbmQgZGlyZWN0aW9uICovCisJCXBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RtYXNrIC0gMV0udHNfaW5mby51cCA9CisJCQlUc3BlY19JbmZvLnRzX2luZm8udXA7CisJCXBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RtYXNrIC0gMV0udHNfaW5mby50aWQgPQorCQkJVHNwZWNfSW5mby50c19pbmZvLnRpZDsKKwkJcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bdG1hc2sgLSAxXS50c19pbmZvLmRpcmVjdGlvbiA9CisJCQlUc3BlY19JbmZvLnRzX2luZm8uZGlyZWN0aW9uOworCQlwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1t0bWFzayAtIDFdLnRzX2luZm8ucHNiID0KKwkJCVRzcGVjX0luZm8udHNfaW5mby5wc2I7CisJCXN0YXR1cyA9CisJCQlzbWVfcW9zX3NldHVwKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkgICAgICAmcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bdG1hc2sgLSAxXSwgYWMpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgd2l0aCBBQyAlZCBpbiBzdGF0ZSBTTUVfUU9TX1FPU19PTiAiCisJCQkgICJzbWVfcW9zX3NldHVwIHJldHVybmVkIHdpdGggc3RhdHVzICVkIiwgX19mdW5jX18sCisJCQkgIF9fTElORV9fLCBzZXNzaW9uSWQsIGFjLCBzdGF0dXMpOworCQlpZiAoU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQICE9IHN0YXR1cykgeworCQkJLyogd2UgYXJlbid0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVAgKi8KKwkJCS8qIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJCXBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IHRydWU7CisJCX0KKwkJaWYgKChTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1AgPT0gc3RhdHVzKSB8fAorCQkgICAgKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQID09IHN0YXR1cykKKwkJICAgIHx8IChTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFkgPT0KKwkJCXN0YXR1cykpIHsKKwkJCS8qIHdlIHJlY2VpdmVkIGFuIGV4cGVjdGVkICJnb29kIiBzdGF0dXMgKi8KKwkJCS8qIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgZmxvdyBsaXN0ICovCisJCQlwZW50cnkgPQorCQkJCShzbWVfUW9zRmxvd0luZm9FbnRyeSAqKQorCQkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZigqcGVudHJ5KSk7CisJCQlpZiAoIXBlbnRyeSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgIiVzOiAlZDogY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbmV3ICIKKwkJCQkJICAiZW50cnkgaW4gdGhlIEZsb3cgTGlzdCIsIF9fZnVuY19fLAorCQkJCQkgIF9fTElORV9fKTsKKwkJCQlyZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisJCQl9CisJCQlwZW50cnktPmFjX3R5cGUgPSBhYzsKKwkJCXBlbnRyeS0+SEREY29udGV4dCA9IEhERGNvbnRleHQ7CisJCQlwZW50cnktPlFvU0NhbGxiYWNrID0gUW9TQ2FsbGJhY2s7CisJCQlwZW50cnktPmhvUmVuZXdhbCA9IGhvUmVuZXdhbDsKKwkJCXBlbnRyeS0+UW9zRmxvd0lEID0gUW9zRmxvd0lEOworCQkJcGVudHJ5LT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJICAiJXM6ICVkOiBDcmVhdGluZyBmbG93ICVkIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgUW9zRmxvd0lEKTsKKwkJCWlmICgoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1AgPT0KKwkJCSAgICAgc3RhdHVzKQorCQkJICAgIHx8IChTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFkgPT0KKwkJCQlzdGF0dXMpKSB7CisJCQkJbmV3X3N0YXRlID0gcEFDSW5mby0+Y3Vycl9zdGF0ZTsKKwkJCQlwZW50cnktPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTOworCQkJCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdID0KKwkJCQkJcEFDSW5mby0+CisJCQkJCXJlcXVlc3RlZF9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF07CisJCQkJaWYgKGJ1ZmZlcmVkX2NtZCAmJiAhcGVudHJ5LT5ob1JlbmV3YWwpIHsKKwkJCQkJUW9TQ2FsbGJhY2socE1hYywgSEREY29udGV4dCwKKwkJCQkJCSAgICAmcEFDSW5mby0+CisJCQkJCQkgICAgY3Vycl9Rb1NJbmZvCisJCQkJCQkgICAgW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0sCisJCQkJCQkgICAgc3RhdHVzLCBwZW50cnktPlFvc0Zsb3dJRCk7CisJCQkJfQorCQkJCWlmIChTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFkgPT0gc3RhdHVzKSB7CisJCQkJCS8qIGlmIHdlIGFyZSBub3QgaW4gaGFuZG9mZiwgdGhlbiBub3RpZnkgYWxsIGZsb3dzIG9uICovCisJCQkJCS8qIHRoaXMgQUMgdGhhdCB0aGUgYWdncmVnYXRlIFRTUEVDIG1heSBoYXZlIGNoYW5nZWQgKi8KKwkJCQkJaWYgKCFwZW50cnktPmhvUmVuZXdhbCkgeworCQkJCQkJY2RmX21lbV96ZXJvKCZzZWFyY2hfa2V5LAorCQkJCQkJCSAgICAgc2l6ZW9mCisJCQkJCQkJICAgICAoc21lX1Fvc1NlYXJjaEluZm8pKTsKKwkJCQkJCXNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKwkJCQkJCXNlYXJjaF9rZXkuaW5kZXggPQorCQkJCQkJCVNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8yOworCQkJCQkJc2VhcmNoX2tleS5zZXNzaW9uSWQgPQorCQkJCQkJCXNlc3Npb25JZDsKKwkJCQkJCWhzdGF0dXMgPQorCQkJCQkJCXNtZV9xb3NfZmluZF9hbGxfaW5fZmxvd19saXN0CisJCQkJCQkJCShwTWFjLCBzZWFyY2hfa2V5LAorCQkJCQkJCQlzbWVfcW9zX3NldHVwX2ZucCk7CisJCQkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJCQkJCSAgICAoaHN0YXR1cykpIHsKKwkJCQkJCQlDREZfVFJBQ0UKKwkJCQkJCQkJKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJCQlDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkJCSIlczogJWQ6IGNvdWxkbid0IG5vdGlmeSBvdGhlciAiCisJCQkJCQkJCSJlbnRyaWVzIG9uIHRoaXMgQUMgPSVkIiwKKwkJCQkJCQkJX19mdW5jX18sIF9fTElORV9fLAorCQkJCQkJCQlhYyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcGVudHJ5LT5ob1JlbmV3YWwgPSBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJLyogU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQICovCisJCQkJbmV3X3N0YXRlID0gU01FX1FPU19SRVFVRVNURUQ7CisJCQkJcGVudHJ5LT5yZWFzb24gPSBTTUVfUU9TX1JFQVNPTl9TRVRVUDsKKwkJCQkvKiBOZWVkIHRoaXMgaW5mbyB3aGVuIGFkZHRzIGNvbWVzIGJhY2sgZnJvbSBQRSB0byBrbm93IG9uICovCisJCQkJLyogd2hpY2ggaW5kZXggb2YgdGhlIEFDIHRoZSByZXF1ZXN0IHdhcyBmcm9tICovCisJCQkJcEFDSW5mby0+dHNwZWNfcGVuZGluZyA9IHRtYXNrOworCQkJfQorCQkJcEFDSW5mby0+bnVtX2Zsb3dzW3RtYXNrIC0gMV0rKzsKKwkJCS8qIGluZGljYXRlIG9uIHdoaWNoIGluZGV4IHRoZSBmbG93IGVudHJ5IGJlbG9uZ3MgdG8gJiBhZGQgaXQgdG8gdGhlICovCisJCQkvKiBGbG93IExpc3QgYXQgdGhlIGVuZCAqLworCQkJcGVudHJ5LT50c3BlY19tYXNrID0gdG1hc2s7CisJCQlwZW50cnktPlFvU0luZm8gPSBUc3BlY19JbmZvOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBjcmVhdGluZyBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJICBzZXNzaW9uSWQsIHBlbnRyeSwgUW9zRmxvd0lEKTsKKwkJCWNzcl9sbF9pbnNlcnRfdGFpbCgmc21lX3Fvc19jYi5mbG93X2xpc3QsICZwZW50cnktPmxpbmssCisJCQkJCSAgIHRydWUpOworCQl9IGVsc2UgeworCQkJLyogdW5leHBlY3RlZCBzdGF0dXMgcmV0dXJuZWQgYnkgc21lX3Fvc19zZXR1cCgpICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgdW5leHBlY3RlZCBzdGF0dXMgJWQgIgorCQkJCSAgInJldHVybmVkIGJ5IHNtZV9xb3Nfc2V0dXAiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQsIHN0YXR1cyk7CisJCQluZXdfc3RhdGUgPSBwQUNJbmZvLT5jdXJyX3N0YXRlOworCQl9CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19DTE9TRUQ6CisJY2FzZSBTTUVfUU9TX0lOSVQ6CisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IHNldHVwIHJlcXVlc3RlZCBpbiB1bmV4cGVjdGVkIHN0YXRlID0gJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworCQkvKiB1bmFibGUgdG8gc2VydmljZSB0aGUgcmVxdWVzdCAqLworCQkvKiBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbiAqLworCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQlDREZfQVNTRVJUKDApOworCQluZXdfc3RhdGUgPSBwQUNJbmZvLT5jdXJyX3N0YXRlOworCX0KKwkvKiBpZiBjdXJyZW50IHN0YXRlIGlzIHNhbWUgYXMgcHJldmlvdXMgbm8gbmVlZCBmb3IgdHJhbnNpc3Rpb24sCisJICAgaWYgd2UgYXJlIGRvaW5nIHJlYXNzb2MgJiB3ZSBhcmUgYWxyZWFkeSBpbiBoYW5kb2ZmIHN0YXRlLCBubyBuZWVkIHRvIG1vdmUKKwkgICB0byByZXF1ZXN0ZWQgc3RhdGUuIEJ1dCBtYWtlIHN1cmUgdG8gc2V0IHRoZSBwcmV2aW91cyBzdGF0ZSBhcyByZXF1ZXN0ZWQKKwkgICBzdGF0ZQorCSAqLworCWlmICgobmV3X3N0YXRlICE9IHBBQ0luZm8tPmN1cnJfc3RhdGUpICYmCisJICAgICghKHBBQ0luZm8tPnJlYXNzb2NfcGVuZGluZyAmJgorCSAgICAgICAoU01FX1FPU19IQU5ET0ZGID09IHBBQ0luZm8tPmN1cnJfc3RhdGUpKSkpIHsKKwkJc21lX3Fvc19zdGF0ZV90cmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIG5ld19zdGF0ZSk7CisJfQorCisJaWYgKHBBQ0luZm8tPnJlYXNzb2NfcGVuZGluZyAmJgorCSAgICAoU01FX1FPU19IQU5ET0ZGID09IHBBQ0luZm8tPmN1cnJfc3RhdGUpKSB7CisJCXBBQ0luZm8tPnByZXZfc3RhdGUgPSBTTUVfUU9TX1JFUVVFU1RFRDsKKwl9CisJaWYgKChTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUCA9PSBzdGF0dXMpIHx8CisJICAgIChTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFkgPT0gc3RhdHVzKSkgeworCQkodm9pZClzbWVfcW9zX3Byb2Nlc3NfYnVmZmVyZWRfY21kKHNlc3Npb25JZCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX3Fvc19pbnRlcm5hbF9tb2RpZnlfcmVxKCkgLSBUaGUgU01FIFFvUyBpbnRlcm5hbCBmdW5jdGlvbiB0byByZXF1ZXN0CisgKiAgZm9yIG1vZGlmaWNhdGlvbiBvZiBjZXJ0YWluIFFvUyBwYXJhbXMgb24gYSBmbG93IHJ1bm5pbmcgb24gYSBwYXJ0aWN1bGFyIEFDLgorICogQHBNYWM6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAqIEBwUW9TSW5mbzogUG9pbnRlciB0byBzbWVfUW9zV21tVHNwZWNJbmZvIHdoaWNoIGNvbnRhaW5zIHRoZSBXTU0gVFNQRUMKKyAqICAgICAgICAgICAgcmVsYXRlZCBpbmZvIGFzIGRlZmluZWQgYWJvdmUsIHByb3ZpZGVkIGJ5IEhERAorICogQFFvc0Zsb3dJRDogSWRlbnRpZmljYXRpb24gcGVyIGZsb3cgcnVubmluZyBvbiBlYWNoIEFDIGdlbmVyYXRlZCBieQorICogICAgICAgICAgICAgU01FLiBJdCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIFFvUyBzZXR1cCBmb3IgdGhlIGZsb3cgaGFzCisgKiAgICAgICAgICAgICBiZWVuIHN1Y2Nlc3NmdWwgYWxyZWFkeQorICoKKyAqIElmIHRoZSByZXF1ZXN0IGludm9sdmVzIGFkbWlzc2lvbiBjb250cm9sIG9uIHRoZSByZXF1ZXN0ZWQgQUMsIEhERCBuZWVkcyB0bworICogcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IFRyYWZmaWMgU3BlY2lmaWNhdGlvbiAoVFNQRUMpIHBhcmFtZXRlcnMgJiBTTUUgbWlnaHQKKyAqIHN0YXJ0IHRoZSByZW5lZ290aWF0aW9uIHByb2Nlc3MgdGhyb3VnaCBBRERUUy4KKyAqCisgKiBSZXR1cm46IFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfUlNQIC0gTW9kaWZpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwuCisgKiAgICAgICAgIE90aGVyIHN0YXR1cyBtZWFucyByZXF1ZXN0IGZhaWxlZAorICovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfcW9zX2ludGVybmFsX21vZGlmeV9yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqcFFvU0luZm8sCisJCQkJCSAgICAgIHVpbnQzMl90IFFvc0Zsb3dJRCwKKwkJCQkJICAgICAgYm9vbCBidWZmZXJlZF9jbWQpCit7CisJdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlzbWVfUW9zRmxvd0luZm9FbnRyeSAqcE5ld0VudHJ5ID0gTlVMTDsKKwlzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKwlzbWVfUW9zU3RhdGVzIG5ld19zdGF0ZSA9IFNNRV9RT1NfQ0xPU0VEOworCXNtZV9Rb3NTdGF0dXNUeXBlIHN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDsKKwlzbWVfUW9zV21tVHNwZWNJbmZvIEFnZ3JfVHNwZWNfSW5mbzsKKwlzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5OworCXNtZV9Rb3NDbWRJbmZvIGNtZDsKKwl1aW50OF90IHNlc3Npb25JZDsKKwlDREZfU1RBVFVTIGhzdGF0dXM7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGludm9rZWQgZm9yIGZsb3cgJWQiLCBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCk7CisKKwljZGZfbWVtX3plcm8oJnNlYXJjaF9rZXksIHNpemVvZihzbWVfUW9zU2VhcmNoSW5mbykpOworCS8qIHNldCB0aGUga2V5IHR5cGUgJiB0aGUga2V5IHRvIGJlIHNlYXJjaGVkIGluIHRoZSBGbG93IExpc3QgKi8KKwlzZWFyY2hfa2V5LmtleS5Rb3NGbG93SUQgPSBRb3NGbG93SUQ7CisJc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8xOworCXNlYXJjaF9rZXkuc2Vzc2lvbklkID0gU01FX1FPU19TRUFSQ0hfU0VTU0lPTl9JRF9BTlk7CisJLyogZ28gdGhyb3VnaCB0aGUgbGluayBsaXN0IHRvIGZpbmQgb3V0IHRoZSBkZXRhaWxzIG9uIHRoZSBmbG93ICovCisJcEVudHJ5ID0gc21lX3Fvc19maW5kX2luX2Zsb3dfbGlzdChzZWFyY2hfa2V5KTsKKwlpZiAoIXBFbnRyeSkgeworCQkvKiBFcnIgbXNnICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBubyBtYXRjaCBmb3VuZCBmb3IgZmxvd0lEID0gJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCk7CisJCXJldHVybiBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfSU5WQUxJRF9QQVJBTVNfUlNQOworCX0KKwkvKiBmaW5kIHRoZSBBQyAqLworCWZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJYWMgPSBmbG93X2luZm8tPmFjX3R5cGU7CisKKwlzZXNzaW9uSWQgPSBmbG93X2luZm8tPnNlc3Npb25JZDsKKwlwU2Vzc2lvbiA9ICZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisKKwkvKiB2YWxpZGF0ZSBRb1MgcGFyYW1zICovCisJaWYgKCFzbWVfcW9zX3ZhbGlkYXRlX3JlcXVlc3RlZF9wYXJhbXMocE1hYywgcFFvU0luZm8sIHNlc3Npb25JZCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IGludmFsaWQgcGFyYW1zIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9JTlZBTElEX1BBUkFNU19SU1A7CisJfQorCS8qIEZvciBtb2RpZnksIG1ha2Ugc3VyZSB0aGF0IGRpcmVjdGlvbiwgVElEIGFuZCBVUCBhcmUgbm90IGJlaW5nIGFsdGVyZWQgKi8KKwlpZiAoKHBRb1NJbmZvLT50c19pbmZvLmRpcmVjdGlvbiAhPQorCSAgICAgZmxvd19pbmZvLT5Rb1NJbmZvLnRzX2luZm8uZGlyZWN0aW9uKQorCSAgICB8fCAocFFvU0luZm8tPnRzX2luZm8udXAgIT0gZmxvd19pbmZvLT5Rb1NJbmZvLnRzX2luZm8udXApCisJICAgIHx8IChwUW9TSW5mby0+dHNfaW5mby50aWQgIT0gZmxvd19pbmZvLT5Rb1NJbmZvLnRzX2luZm8udGlkKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogTW9kaWZpY2F0aW9uIG9mIGRpcmVjdGlvbi90aWQvdXAgaXMgbm90IGFsbG93ZWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCisJCXJldHVybiBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfSU5WQUxJRF9QQVJBTVNfUlNQOworCX0KKworCS8qIHNob3VsZCBub3QgYmUgc2FtZSBhcyBwcmV2aW91cyBpb2N0bCBwYXJhbWV0ZXJzICovCisJaWYgKChwUW9TSW5mby0+bm9taW5hbF9tc2R1X3NpemUgPT0KKwkJZmxvd19pbmZvLT5Rb1NJbmZvLm5vbWluYWxfbXNkdV9zaXplKSAmJgorCSAgICAocFFvU0luZm8tPm1heGltdW1fbXNkdV9zaXplID09CisJCWZsb3dfaW5mby0+UW9TSW5mby5tYXhpbXVtX21zZHVfc2l6ZSkgJiYKKwkgICAgKHBRb1NJbmZvLT5taW5fZGF0YV9yYXRlID09CisJCWZsb3dfaW5mby0+UW9TSW5mby5taW5fZGF0YV9yYXRlKSAmJgorCSAgICAocFFvU0luZm8tPm1lYW5fZGF0YV9yYXRlID09CisJCWZsb3dfaW5mby0+UW9TSW5mby5tZWFuX2RhdGFfcmF0ZSkgJiYKKwkgICAgKHBRb1NJbmZvLT5wZWFrX2RhdGFfcmF0ZSA9PQorCQlmbG93X2luZm8tPlFvU0luZm8ucGVha19kYXRhX3JhdGUpICYmCisJICAgIChwUW9TSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWwgPT0KKwkJZmxvd19pbmZvLT5Rb1NJbmZvLm1pbl9zZXJ2aWNlX2ludGVydmFsKSAmJgorCSAgICAocFFvU0luZm8tPm1heF9zZXJ2aWNlX2ludGVydmFsID09CisJCWZsb3dfaW5mby0+UW9TSW5mby5tYXhfc2VydmljZV9pbnRlcnZhbCkgJiYKKwkgICAgKHBRb1NJbmZvLT5pbmFjdGl2aXR5X2ludGVydmFsID09CisJCWZsb3dfaW5mby0+UW9TSW5mby5pbmFjdGl2aXR5X2ludGVydmFsKSAmJgorCSAgICAocFFvU0luZm8tPnN1c3BlbnNpb25faW50ZXJ2YWwgPT0KKwkJZmxvd19pbmZvLT5Rb1NJbmZvLnN1c3BlbnNpb25faW50ZXJ2YWwpICYmCisJICAgIChwUW9TSW5mby0+c3VycGx1c19id19hbGxvd2FuY2UgPT0KKwkJZmxvd19pbmZvLT5Rb1NJbmZvLnN1cnBsdXNfYndfYWxsb3dhbmNlKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSIlczogJWQ6IHRoZSBhZGR0cyBwYXJhbWV0ZXJzIGFyZSBzYW1lIGFzIGxhc3QgcmVxdWVzdCwiCisJCQkiZHJvcHBpbmcgdGhlIGN1cnJlbnQgcmVxdWVzdCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkJcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDsKKwl9CisKKwkvKiBuZWVkIHRvIHZvdGUgb2ZmIHBvd2Vyc2F2ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgcmVxdWVzdCAqLworCXBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IGZhbHNlOworCS8qIGNoZWNrIHRvIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZmxvd2luZyBzY2VuYXJpby4KKwkgKiBBZGR0cyByZXF1ZXN0IGlzIHBlbmRpbmcgb24gb25lIEFDLCB3aGlsZSBBUFNEIHJlcXVlc3RlZCBvbiBhbm90aGVyCisJICogd2hpY2ggbmVlZHMgYSByZWFzc29jLiBXaWxsIGJ1ZmZlciBhIHJlcXVlc3QgaWYgQWRkdHMgaXMgcGVuZGluZyBvbgorCSAqIGFueSBBQywgd2hpY2ggd2lsbCBzYWZlZ2F1cmQgdGhlIGFib3ZlIHNjZW5hcmlvLCAmIGFsc28gd29uJ3QKKwkgKiBjb25mdXNlIFBFIHdpdGggYmFjayB0byBiYWNrIEFkZHRzIG9yIEFkZHRzIGZvbGxvd2VkIGJ5IFJlYXNzb2MKKwkgKi8KKwlpZiAoc21lX3Fvc19pc19yc3BfcGVuZGluZyhzZXNzaW9uSWQsIGFjKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgIiVzOiAlZDogYnVmZmVyaW5nIHRoZSBtb2RpZnkgcmVxdWVzdCBmb3IgZmxvdyAlZCBpbiBzdGF0ZSAlZCAiCisJCQkgICJzaW5jZSBhbm90aGVyIHJlcXVlc3QgaXMgcGVuZGluZyIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgUW9zRmxvd0lELCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKwkJLyogd2UgbmVlZCB0byBidWZmZXIgdGhlIGNvbW1hbmQgKi8KKwkJY21kLmNvbW1hbmQgPSBTTUVfUU9TX01PRElGWV9SRVE7CisJCWNtZC5wTWFjID0gcE1hYzsKKwkJY21kLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJY21kLnUubW9kaWZ5Q21kSW5mby5Rb3NGbG93SUQgPSBRb3NGbG93SUQ7CisJCWNtZC51Lm1vZGlmeUNtZEluZm8uUW9TSW5mbyA9ICpwUW9TSW5mbzsKKwkJaHN0YXR1cyA9IHNtZV9xb3NfYnVmZmVyX2NtZCgmY21kLCBidWZmZXJlZF9jbWQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ICVkOiBjb3VsZG4ndCBidWZmZXIgdGhlIG1vZGlmeSByZXF1ZXN0IGluIHN0YXRlID0gJWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKwkJCS8qIHVuYWJsZSB0byBidWZmZXIgdGhlIHJlcXVlc3QgKi8KKwkJCS8qIG5vdGhpbmcgaXMgcGVuZGluZyBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uICovCisJCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQkJcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDsKKwkJfQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogJWQ6IEJ1ZmZlcmVkIG1vZGlmeSByZXF1ZXN0IGZvciBmbG93ID0gJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCk7CisJCXJldHVybiBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfUEVORElOR19SU1A7CisJfQorCS8qIGdldCBpbnRvIHRoZSBzdGF0IG0vYyB0byBzZWUgaWYgdGhlIHJlcXVlc3QgY2FuIGJlIGdyYW50ZWQgKi8KKwlzd2l0Y2ggKHBBQ0luZm8tPmN1cnJfc3RhdGUpIHsKKwljYXNlIFNNRV9RT1NfUU9TX09OOgorCQkvKiBzYXZlIHRoZSBuZXcgcGFyYW1zIGFkZGluZyBhIG5ldyAoZHVwbGljYXRlKSBlbnRyeSBpbiB0aGUgRmxvdyBMaXN0ICovCisJCS8qIE9uY2Ugd2UgaGF2ZSBkZWNpZGVkIG9uIE9UQSBleGNoYW5nZSBuZWVkZWQgb3Igbm90IHdlIGNhbiBkZWxldGUgdGhlICovCisJCS8qIG9yaWdpbmFsIG9uZSBmcm9tIHRoZSBMaXN0ICovCisJCXBOZXdFbnRyeSA9CisJCQkoc21lX1Fvc0Zsb3dJbmZvRW50cnkgKikgY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwTmV3RW50cnkpKTsKKwkJaWYgKCFwTmV3RW50cnkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiAlZDogY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbmV3ICIKKwkJCQkgICJlbnRyeSBpbiB0aGUgRmxvdyBMaXN0IiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJCS8qIHVuYWJsZSB0byBzZXJ2aWNlIHRoZSByZXF1ZXN0ICovCisJCQkvKiBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbiAqLworCQkJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJCXJldHVybiBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfRkFJTFVSRV9SU1A7CisJCX0KKwkJcE5ld0VudHJ5LT5hY190eXBlID0gYWM7CisJCXBOZXdFbnRyeS0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCQlwTmV3RW50cnktPkhERGNvbnRleHQgPSBmbG93X2luZm8tPkhERGNvbnRleHQ7CisJCXBOZXdFbnRyeS0+UW9TQ2FsbGJhY2sgPSBmbG93X2luZm8tPlFvU0NhbGxiYWNrOworCQlwTmV3RW50cnktPlFvc0Zsb3dJRCA9IGZsb3dfaW5mby0+UW9zRmxvd0lEOworCQlwTmV3RW50cnktPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX01PRElGWV9QRU5ESU5HOworCQkvKiBzaW5jZSBpdCBpcyBhIG1vZGlmeSByZXF1ZXN0LCB1c2UgdGhlIHNhbWUgaW5kZXggb24gd2hpY2ggdGhlIGZsb3cgKi8KKwkJLyogZW50cnkgb3JpZ2luYWxseSB3YXMgcnVubmluZyAmIGFkZCBpdCB0byB0aGUgRmxvdyBMaXN0IGF0IHRoZSBlbmQgKi8KKwkJcE5ld0VudHJ5LT50c3BlY19tYXNrID0gZmxvd19pbmZvLT50c3BlY19tYXNrOworCQlwTmV3RW50cnktPlFvU0luZm8gPSAqcFFvU0luZm87CisJCS8qIHVwZGF0ZSB0aGUgZW50cnkgZnJvbSBGbG93IExpc3Qgd2hpY2ggbmVlZGVkIHRvIGJlIG1vZGlmaWVkICovCisJCWZsb3dfaW5mby0+cmVhc29uID0gU01FX1FPU19SRUFTT05fTU9ESUZZOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgY3JlYXRpbmcgbW9kaWZpZWQgIgorCQkJICAiZW50cnkgYXQgJXAgd2l0aCBmbG93SUQgJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkgIHNlc3Npb25JZCwgcE5ld0VudHJ5LCBwTmV3RW50cnktPlFvc0Zsb3dJRCk7CisJCS8qIGFkZCB0aGUgbmV3IGVudHJ5IHVuZGVyIGNvbnN0cnVjdGlvbiB0byB0aGUgRmxvdyBMaXN0ICovCisJCWNzcl9sbF9pbnNlcnRfdGFpbCgmc21lX3Fvc19jYi5mbG93X2xpc3QsICZwTmV3RW50cnktPmxpbmssCisJCQkJICAgdHJ1ZSk7CisJCS8qIHVwZGF0ZSBUU1BFQyB3aXRoIHRoZSBuZXcgcGFyYW0gc2V0ICovCisJCWhzdGF0dXMgPSBzbWVfcW9zX3VwZGF0ZV9wYXJhbXMoc2Vzc2lvbklkLAorCQkJCQkJYWMsIHBOZXdFbnRyeS0+dHNwZWNfbWFzaywKKwkJCQkJCSZBZ2dyX1RzcGVjX0luZm8pOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKSB7CisJCQlwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1twTmV3RW50cnktPnRzcGVjX21hc2sgLSAxXSA9CisJCQkJQWdncl9Uc3BlY19JbmZvOworCQkJLyogaWYgQUNNLCBzZW5kIG91dCBhIG5ldyBBRERUUyAqLworCQkJc3RhdHVzID0gc21lX3Fvc19zZXR1cChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCSAgICAgICAmcEFDSW5mby0+CisJCQkJCSAgICAgICByZXF1ZXN0ZWRfUW9TSW5mb1twTmV3RW50cnktPgorCQkJCQkJCQkgdHNwZWNfbWFzayAtIDFdLAorCQkJCQkgICAgICAgYWMpOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCB3aXRoIEFDICVkIGluIHN0YXRlIFNNRV9RT1NfUU9TX09OICIKKwkJCQkgICJzbWVfcW9zX3NldHVwIHJldHVybmVkIHdpdGggc3RhdHVzICVkIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkLCBhYywgc3RhdHVzKTsKKwkJCWlmIChTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1AgIT0gc3RhdHVzKSB7CisJCQkJLyogd2UgYXJlbid0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVAgKi8KKwkJCQkvKiBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uICovCisJCQkJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJCX0KKwkJCWlmIChTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1AgPT0gc3RhdHVzKSB7CisJCQkJbmV3X3N0YXRlID0gU01FX1FPU19SRVFVRVNURUQ7CisJCQkJc3RhdHVzID0KKwkJCQkJU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1BFTkRJTkdfUlNQOworCQkJCXBBQ0luZm8tPnRzcGVjX3BlbmRpbmcgPSBwTmV3RW50cnktPnRzcGVjX21hc2s7CisJCQl9IGVsc2UKKwkJCWlmICgoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1AKKwkJCSAgICAgPT0gc3RhdHVzKQorCQkJICAgIHx8CisJCQkgICAgKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWQorCQkJICAgICA9PSBzdGF0dXMpKSB7CisJCQkJbmV3X3N0YXRlID0gU01FX1FPU19RT1NfT047CisKKwkJCQljZGZfbWVtX3plcm8oJnNlYXJjaF9rZXksCisJCQkJCSAgICAgc2l6ZW9mKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisJCQkJLyogZGVsZXRlIHRoZSBvcmlnaW5hbCBlbnRyeSBpbiBGTE9XIGxpc3Qgd2hpY2ggZ290IG1vZGlmaWVkICovCisJCQkJc2VhcmNoX2tleS5rZXkuYWNfdHlwZSA9IGFjOworCQkJCXNlYXJjaF9rZXkuaW5kZXggPSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfMjsKKwkJCQlzZWFyY2hfa2V5LnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJCQloc3RhdHVzID0KKwkJCQkJc21lX3Fvc19maW5kX2FsbF9pbl9mbG93X2xpc3QocE1hYywgc2VhcmNoX2tleSwKKwkJCQkJCQkJICAgICAgc21lX3Fvc19tb2RpZnlfZm5wKTsKKwkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkgeworCQkJCQlzdGF0dXMgPQorCQkJCQkJU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQOworCQkJCX0KKwkJCQlpZiAoU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQICE9CisJCQkJICAgIHN0YXR1cykgeworCQkJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bcE5ld0VudHJ5LT4KKwkJCQkJCQkgICAgICB0c3BlY19tYXNrIC0gMV0gPQorCQkJCQkJcEFDSW5mby0+CisJCQkJCQlyZXF1ZXN0ZWRfUW9TSW5mb1twTmV3RW50cnktPgorCQkJCQkJCQkgIHRzcGVjX21hc2sgLSAxXTsKKwkJCQkJaWYgKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PSBzdGF0dXMpIHsKKwkJCQkJCXN0YXR1cyA9CisJCQkJCQkJU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWTsKKwkJCQkJCWNkZl9tZW1femVybygmc2VhcmNoX2tleSwKKwkJCQkJCQkgICAgIHNpemVvZgorCQkJCQkJCSAgICAgKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisJCQkJCQlzZWFyY2hfa2V5LmtleS5hY190eXBlID0gYWM7CisJCQkJCQlzZWFyY2hfa2V5LmluZGV4ID0KKwkJCQkJCQlTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfMjsKKwkJCQkJCXNlYXJjaF9rZXkuc2Vzc2lvbklkID0KKwkJCQkJCQlzZXNzaW9uSWQ7CisJCQkJCQloc3RhdHVzID0KKwkJCQkJCQlzbWVfcW9zX2ZpbmRfYWxsX2luX2Zsb3dfbGlzdAorCQkJCQkJCQkocE1hYywgc2VhcmNoX2tleSwKKwkJCQkJCQkJc21lX3Fvc19tb2RpZmljYXRpb25fbm90aWZ5X2ZucCk7CisJCQkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJCQkJCSAgICAoaHN0YXR1cykpIHsKKwkJCQkJCQlDREZfVFJBQ0UKKwkJCQkJCQkJKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJCQlDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkJCSIlczogJWQ6IGNvdWxkbid0IG5vdGlmeSBvdGhlciAiCisJCQkJCQkJCSJlbnRyaWVzIG9uIHRoaXMgQUMgPSVkIiwKKwkJCQkJCQkJX19mdW5jX18sIF9fTElORV9fLAorCQkJCQkJCQlhYyk7CisJCQkJCQl9CisJCQkJCX0gZWxzZQorCQkJCQlpZgorCQkJCQkoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1AKKwkJCQkJID09IHN0YXR1cykgeworCQkJCQkJc3RhdHVzID0KKwkJCQkJCQlTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1A7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGJ1ZmZlcmVkX2NtZCkgeworCQkJCQlmbG93X2luZm8tPlFvU0NhbGxiYWNrKHBNYWMsCisJCQkJCQkJICAgICAgIGZsb3dfaW5mby0+CisJCQkJCQkJICAgICAgIEhERGNvbnRleHQsCisJCQkJCQkJICAgICAgICZwQUNJbmZvLT4KKwkJCQkJCQkgICAgICAgY3Vycl9Rb1NJbmZvCisJCQkJCQkJICAgICAgIFtwTmV3RW50cnktPgorCQkJCQkJCQl0c3BlY19tYXNrIC0gMV0sCisJCQkJCQkJICAgICAgIHN0YXR1cywKKwkJCQkJCQkgICAgICAgZmxvd19pbmZvLT4KKwkJCQkJCQkgICAgICAgUW9zRmxvd0lEKTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJLyogdW5leHBlY3RlZCBzdGF0dXMgcmV0dXJuZWQgYnkgc21lX3Fvc19zZXR1cCgpICovCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHVuZXhwZWN0ZWQgc3RhdHVzICVkICIKKwkJCQkJICAicmV0dXJuZWQgYnkgc21lX3Fvc19zZXR1cCIsIF9fZnVuY19fLAorCQkJCQkgIF9fTElORV9fLCBzZXNzaW9uSWQsIHN0YXR1cyk7CisJCQkJbmV3X3N0YXRlID0gU01FX1FPU19RT1NfT047CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBlcnIgbXNnICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IHNtZV9xb3NfdXBkYXRlX3BhcmFtcygpIGZhaWxlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJLyogdW5hYmxlIHRvIHNlcnZpY2UgdGhlIHJlcXVlc3QgKi8KKwkJCS8qIG5vdGhpbmcgaXMgcGVuZGluZyBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uICovCisJCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQkJbmV3X3N0YXRlID0gU01FX1FPU19MSU5LX1VQOworCQl9CisJCS8qIGlmIHdlIGFyZSBkb2luZyByZWFzc29jICYgd2UgYXJlIGFscmVhZHkgaW4gaGFuZG9mZiBzdGF0ZSwgbm8gbmVlZAorCQkgICB0byBtb3ZlIHRvIHJlcXVlc3RlZCBzdGF0ZS4gQnV0IG1ha2Ugc3VyZSB0byBzZXQgdGhlIHByZXZpb3VzIHN0YXRlCisJCSAgIGFzIHJlcXVlc3RlZCBzdGF0ZQorCQkgKi8KKwkJaWYgKCEocEFDSW5mby0+cmVhc3NvY19wZW5kaW5nICYmCisJCSAgICAgIChTTUVfUU9TX0hBTkRPRkYgPT0gcEFDSW5mby0+Y3Vycl9zdGF0ZSkpKSB7CisJCQlzbWVfcW9zX3N0YXRlX3RyYW5zaXRpb24oc2Vzc2lvbklkLCBhYywgbmV3X3N0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCXBBQ0luZm8tPnByZXZfc3RhdGUgPSBTTUVfUU9TX1JFUVVFU1RFRDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNNRV9RT1NfSEFORE9GRjoKKwljYXNlIFNNRV9RT1NfUkVRVUVTVEVEOgorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJCSAgIiVzOiAlZDogQnVmZmVyaW5nIG1vZGlmeSByZXF1ZXN0IGZvciBmbG93ICVkIGluIHN0YXRlID0gJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCwgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisJCS8qIGJ1ZmZlciBjbWQgKi8KKwkJY21kLmNvbW1hbmQgPSBTTUVfUU9TX01PRElGWV9SRVE7CisJCWNtZC5wTWFjID0gcE1hYzsKKwkJY21kLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJY21kLnUubW9kaWZ5Q21kSW5mby5Rb3NGbG93SUQgPSBRb3NGbG93SUQ7CisJCWNtZC51Lm1vZGlmeUNtZEluZm8uUW9TSW5mbyA9ICpwUW9TSW5mbzsKKwkJaHN0YXR1cyA9IHNtZV9xb3NfYnVmZmVyX2NtZCgmY21kLCBidWZmZXJlZF9jbWQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ICVkOiBjb3VsZG4ndCBidWZmZXIgdGhlIG1vZGlmeSByZXF1ZXN0IGluIHN0YXRlID0gJWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKwkJCS8qIHVuYWJsZSB0byBidWZmZXIgdGhlIHJlcXVlc3QgKi8KKwkJCS8qIG5vdGhpbmcgaXMgcGVuZGluZyBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uICovCisJCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQkJcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDsKKwkJfQorCQlzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfUEVORElOR19SU1A7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19DTE9TRUQ6CisJY2FzZSBTTUVfUU9TX0lOSVQ6CisJY2FzZSBTTUVfUU9TX0xJTktfVVA6CisJZGVmYXVsdDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IG1vZGlmeSByZXF1ZXN0ZWQgaW4gdW5leHBlY3RlZCBzdGF0ZSA9ICVkIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKwkJLyogdW5hYmxlIHRvIHNlcnZpY2UgdGhlIHJlcXVlc3QgKi8KKwkJLyogbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCWlmICgoU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQID09IHN0YXR1cykKKwkgICAgfHwgKFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFkgPT0KKwkJc3RhdHVzKSkgeworCQkodm9pZClzbWVfcW9zX3Byb2Nlc3NfYnVmZmVyZWRfY21kKHNlc3Npb25JZCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX3Fvc19pbnRlcm5hbF9yZWxlYXNlX3JlcSgpIC0gcmVsZWFzZSBRT1MgZmxvdyBvbiBhIHBhcnRpY3VsYXIgQUMKKyAqIEBwTWFjOiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgKiBAUW9zRmxvd0lEOiBJZGVudGlmaWNhdGlvbiBwZXIgZmxvdyBydW5uaW5nIG9uIGVhY2ggQUMgZ2VuZXJhdGVkIGJ5IFNNRQorICogICAgICAgICAgICAgSXQgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBRb1Mgc2V0dXAgZm9yIHRoZSBmbG93IGlzIHN1Y2Nlc3NmdWwKKyAqCisgKiBUaGUgU01FIFFvUyBpbnRlcm5hbCBmdW5jdGlvbiB0byByZXF1ZXN0CisgKiBmb3IgcmVsZWFzaW5nIGEgUW9TIGZsb3cgcnVubmluZyBvbiBhIHBhcnRpY3VsYXIgQUMuCisKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIC0gUmVsZWFzZSBpcyBzdWNjZXNzZnVsLgorICovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfcW9zX2ludGVybmFsX3JlbGVhc2VfcmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB1aW50MzJfdCBRb3NGbG93SUQsCisJCQkJCSAgICAgICBib29sIGJ1ZmZlcmVkX2NtZCkKK3sKKwl0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwlzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworCXNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworCXNtZV9Rb3NGbG93SW5mb0VudHJ5ICpwRGVsZXRlZEZsb3cgPSBOVUxMOworCXNtZV9Rb3NFZGNhQWNUeXBlIGFjOworCXNtZV9Rb3NTdGF0ZXMgbmV3X3N0YXRlID0gU01FX1FPU19DTE9TRUQ7CisJc21lX1Fvc1N0YXR1c1R5cGUgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfUkVMRUFTRV9GQUlMVVJFX1JTUDsKKwlzbWVfUW9zV21tVHNwZWNJbmZvIEFnZ3JfVHNwZWNfSW5mbzsKKwlzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5OworCXNtZV9Rb3NDbWRJbmZvIGNtZDsKKwl0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgbW9kaWZ5UHJvZmlsZUZpZWxkczsKKwlib29sIGRlbHRzSXNzdWVkID0gZmFsc2U7CisJdWludDhfdCBzZXNzaW9uSWQ7CisJQ0RGX1NUQVRVUyBoc3RhdHVzOworCWJvb2wgYmlEaXJlY3Rpb25hbEZsb3dzUHJlc2VudCA9IGZhbHNlOworCWJvb2wgdXBsaW5rRmxvd3NQcmVzZW50ID0gZmFsc2U7CisJYm9vbCBkb3dubGlua0Zsb3dzUHJlc2VudCA9IGZhbHNlOworCXRMaXN0RWxlbSAqcFJlc3VsdCA9IE5VTEw7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGludm9rZWQgZm9yIGZsb3cgJWQiLCBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCk7CisKKwljZGZfbWVtX3plcm8oJnNlYXJjaF9rZXksIHNpemVvZihzbWVfUW9zU2VhcmNoSW5mbykpOworCS8qIHNldCB0aGUga2V5IHR5cGUgJiB0aGUga2V5IHRvIGJlIHNlYXJjaGVkIGluIHRoZSBGbG93IExpc3QgKi8KKwlzZWFyY2hfa2V5LmtleS5Rb3NGbG93SUQgPSBRb3NGbG93SUQ7CisJc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8xOworCXNlYXJjaF9rZXkuc2Vzc2lvbklkID0gU01FX1FPU19TRUFSQ0hfU0VTU0lPTl9JRF9BTlk7CisJLyogZ28gdGhyb3VnaCB0aGUgbGluayBsaXN0IHRvIGZpbmQgb3V0IHRoZSBkZXRhaWxzIG9uIHRoZSBmbG93ICovCisJcEVudHJ5ID0gc21lX3Fvc19maW5kX2luX2Zsb3dfbGlzdChzZWFyY2hfa2V5KTsKKworCWlmICghcEVudHJ5KSB7CisJCS8qIEVyciBtc2cgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IG5vIG1hdGNoIGZvdW5kIGZvciBmbG93SUQgPSAlZCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgUW9zRmxvd0lEKTsKKwkJcmV0dXJuIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfSU5WQUxJRF9QQVJBTVNfUlNQOworCX0KKwkvKiBmaW5kIHRoZSBBQyAqLworCWZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJYWMgPSBmbG93X2luZm8tPmFjX3R5cGU7CisJc2Vzc2lvbklkID0gZmxvd19pbmZvLT5zZXNzaW9uSWQ7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCXBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworCS8qIG5lZWQgdG8gdm90ZSBvZmYgcG93ZXJzYXZlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyByZXF1ZXN0ICovCisJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gZmFsc2U7CisJLyogY2hlY2sgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyBmbG93aW5nIHNjZW5hcmlvLgorCSAqIEFkZHRzIHJlcXVlc3QgaXMgcGVuZGluZyBvbiBvbmUgQUMsIHdoaWxlIEFQU0QgcmVxdWVzdGVkIG9uIGFub3RoZXIKKwkgKiB3aGljaCBuZWVkcyBhIHJlYXNzb2MuIFdpbGwgYnVmZmVyIGEgcmVxdWVzdCBpZiBBZGR0cyBpcyBwZW5kaW5nIG9uCisJICogYW55IEFDLCB3aGljaCB3aWxsIHNhZmVnYXVyZCB0aGUgYWJvdmUgc2NlbmFyaW8sICYgYWxzbyB3b24ndAorCSAqIGNvbmZ1c2UgUEUgd2l0aCBiYWNrIHRvIGJhY2sgQWRkdHMgb3IgQWRkdHMgZm9sbG93ZWQgYnkgUmVhc3NvYworCSAqLworCWlmIChzbWVfcW9zX2lzX3JzcF9wZW5kaW5nKHNlc3Npb25JZCwgYWMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJICAiJXM6ICVkOiBidWZmZXJpbmcgdGhlIHJlbGVhc2UgcmVxdWVzdCBmb3IgZmxvdyAlZCBpbiBzdGF0ZSAlZCAiCisJCQkgICJzaW5jZSBhbm90aGVyIHJlcXVlc3QgaXMgcGVuZGluZyIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgUW9zRmxvd0lELCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKwkJLyogd2UgbmVlZCB0byBidWZmZXIgdGhlIGNvbW1hbmQgKi8KKwkJY21kLmNvbW1hbmQgPSBTTUVfUU9TX1JFTEVBU0VfUkVROworCQljbWQucE1hYyA9IHBNYWM7CisJCWNtZC5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJCWNtZC51LnJlbGVhc2VDbWRJbmZvLlFvc0Zsb3dJRCA9IFFvc0Zsb3dJRDsKKwkJaHN0YXR1cyA9IHNtZV9xb3NfYnVmZmVyX2NtZCgmY21kLCBidWZmZXJlZF9jbWQpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ICVkOiBjb3VsZG4ndCBidWZmZXIgdGhlIHJlbGVhc2UgcmVxdWVzdCBpbiBzdGF0ZSA9ICVkIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisJCQkvKiB1bmFibGUgdG8gYnVmZmVyIHRoZSByZXF1ZXN0ICovCisJCQkvKiBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbiAqLworCQkJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJCXJldHVybiBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQOworCQl9CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIiVzOiAlZDogQnVmZmVyZWQgcmVsZWFzZSByZXF1ZXN0IGZvciBmbG93ID0gJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIFFvc0Zsb3dJRCk7CisJCXJldHVybiBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX1JFUV9QRU5ESU5HX1JTUDsKKwl9CisJLyogZ2V0IGludG8gdGhlIHN0YXQgbS9jIHRvIHNlZSBpZiB0aGUgcmVxdWVzdCBjYW4gYmUgZ3JhbnRlZCAqLworCXN3aXRjaCAocEFDSW5mby0+Y3Vycl9zdGF0ZSkgeworCWNhc2UgU01FX1FPU19RT1NfT046CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkJICAiJXM6ICVkOiB0c3BlY19tYXNrX3N0YXR1cyA9ICVkIGZvciBBQyA9ICVkIHdpdGggIgorCQkJICAiZW50cnkgdHNwZWNfbWFzayA9ICVkIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLAorCQkJICBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cywgYWMsCisJCQkgIGZsb3dfaW5mby0+dHNwZWNfbWFzayk7CisKKwkJLyogY2hlY2sgaWYgbXVsdGlwbGUgZmxvd3MgcnVubmluZyBvbiB0aGUgYWMgKi8KKwkJaWYgKHBBQ0luZm8tPm51bV9mbG93c1tmbG93X2luZm8tPnRzcGVjX21hc2sgLSAxXSA+IDEpIHsKKwkJCS8qIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgZmxvdyBpbiB0aGUgbmV3IFRTUEVDIG9uIHdoaWNoIHJlbGVhc2UgKi8KKwkJCS8qIGlzIHJlcXVlc3RlZCAqLworCQkJZmxvd19pbmZvLT5yZWFzb24gPSBTTUVfUU9TX1JFQVNPTl9SRUxFQVNFOworCisJCQkvKiBDaGVjayBpZiB0aGUgZmxvdyBiZWluZyByZWxlYXNlZCBpcyBmb3IgYmktZGlyZXRpb25hbC4KKwkJCSAqIEZvbGxvd2luZyBmbG93cyBtYXkgcHJlc2VudCBpbiB0aGUgc3lzdGVtLgorCQkJICogYSkgYmktZGlyZWN0aW9uYWwgZmxvd3MKKwkJCSAqIGIpIHVwbGluayBmbG93cworCQkJICogYykgZG93bmxpbmsgZmxvd3MuCisJCQkgKiBJZiB0aGUgZmxvdyBiZWluZyByZWxlYXNlZCBpcyBmb3IgYmlkaXJlY3Rpb25hbCwgc3BsaXR0aW5nIG9mIGV4aXN0aW5nCisJCQkgKiBzdHJlYW1zIGludG8gdHdvIHRzcGVjIGluZGljZXMgaXMgcmVxdWlyZWQgaW4gY2FzZSBmZiAoYiksIChjKSBhcmUgcHJlc2VudAorCQkJICogYW5kIG5vdCAoYSkuCisJCQkgKiBJbiBjYXNlIGlmIHNwbGl0IG9jY3VycywgYWxsIHVwc3RyZWFtcyBhcmUgYWdncmVnYXRlZCBpbnRvIHRzcGVjIGluZGV4IDAsCisJCQkgKiBkb3duc3RyZWFtcyBhcmUgYWdncmVnYWVkIGludG8gdHNwZWMgaW5kZXggMSBhbmQgdHdvIHRzcGVjIHJlcXVlc3RzIGZvcgorCQkJICogKGFnZ3JlZ2F0ZWQpIHVwc3RyZWFtKHMpIGZvbGxvd2VkIGJ5IChhZ2dyZWdhdGVkKSBkb3duc3RyZWFtKHMpIGlzIHNlbnQKKwkJCSAqIHRvIEFQLiAqLworCQkJaWYgKGZsb3dfaW5mby0+UW9TSW5mby50c19pbmZvLmRpcmVjdGlvbiA9PQorCQkJICAgIFNNRV9RT1NfV01NX1RTX0RJUl9CT1RIKSB7CisJCQkJY2RmX21lbV96ZXJvKCZzZWFyY2hfa2V5LAorCQkJCQkgICAgIHNpemVvZihzbWVfUW9zU2VhcmNoSW5mbykpOworCQkJCS8qIHNldCB0aGUga2V5IHR5cGUgJiB0aGUga2V5IHRvIGJlIHNlYXJjaGVkIGluIHRoZSBGbG93IExpc3QgKi8KKwkJCQlzZWFyY2hfa2V5LmtleS5hY190eXBlID0gYWM7CisJCQkJc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF80OworCQkJCXNlYXJjaF9rZXkuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworCQkJCXNlYXJjaF9rZXkuZGlyZWN0aW9uID0gU01FX1FPU19XTU1fVFNfRElSX0JPVEg7CisJCQkJcFJlc3VsdCA9IHNtZV9xb3NfZmluZF9pbl9mbG93X2xpc3Qoc2VhcmNoX2tleSk7CisJCQkJaWYgKHBSZXN1bHQpCisJCQkJCWJpRGlyZWN0aW9uYWxGbG93c1ByZXNlbnQgPSB0cnVlOworCisJCQkJaWYgKCFiaURpcmVjdGlvbmFsRmxvd3NQcmVzZW50KSB7CisJCQkJCS8qIFRoZSBvbmx5IGV4aXN0aW5nIGJpZGlyZWN0aW9uYWwgZmxvdyBpcyBiZWluZyByZWxlYXNlZCAqLworCisJCQkJCS8qIENoZWNrIGlmIHVwbGluayBmbG93cyBleGlzdCAqLworCQkJCQlzZWFyY2hfa2V5LmRpcmVjdGlvbiA9CisJCQkJCQlTTUVfUU9TX1dNTV9UU19ESVJfVVBMSU5LOworCQkJCQlwUmVzdWx0ID0KKwkJCQkJCXNtZV9xb3NfZmluZF9pbl9mbG93X2xpc3Qoc2VhcmNoX2tleSk7CisJCQkJCWlmIChwUmVzdWx0KQorCQkJCQkJdXBsaW5rRmxvd3NQcmVzZW50ID0gdHJ1ZTsKKworCQkJCQkvKiBDaGVjayBpZiBkb3dubGluayBmbG93cyBleGlzdCAqLworCQkJCQlzZWFyY2hfa2V5LmRpcmVjdGlvbiA9CisJCQkJCQlTTUVfUU9TX1dNTV9UU19ESVJfRE9XTkxJTks7CisJCQkJCXBSZXN1bHQgPQorCQkJCQkJc21lX3Fvc19maW5kX2luX2Zsb3dfbGlzdChzZWFyY2hfa2V5KTsKKwkJCQkJaWYgKHBSZXN1bHQpCisJCQkJCQlkb3dubGlua0Zsb3dzUHJlc2VudCA9IHRydWU7CisKKwkJCQkJaWYgKHVwbGlua0Zsb3dzUHJlc2VudAorCQkJCQkgICAgJiYgZG93bmxpbmtGbG93c1ByZXNlbnQpIHsKKwkJCQkJCS8qIE5lZWQgdG8gc3BsaXQgdGhlIHVuaS1kaXJlY3Rpb25hbCBmbG93cyBpbnRvIFNNRV9RT1NfVFNQRUNfSU5ERVhfMCBhbmQgU01FX1FPU19UU1BFQ19JTkRFWF8xICovCisKKwkJCQkJCWNkZl9tZW1femVybygmc2VhcmNoX2tleSwKKwkJCQkJCQkgICAgIHNpemVvZgorCQkJCQkJCSAgICAgKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisJCQkJCQkvKiBNYXJrIGFsbCBkb3duc3RyZWFtIGZsb3dzIGFzIHVzaW5nIHRzcGVjIGluZGV4IDEgKi8KKwkJCQkJCXNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKwkJCQkJCXNlYXJjaF9rZXkuaW5kZXggPQorCQkJCQkJCVNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF80OworCQkJCQkJc2VhcmNoX2tleS5zZXNzaW9uSWQgPQorCQkJCQkJCXNlc3Npb25JZDsKKwkJCQkJCXNlYXJjaF9rZXkuZGlyZWN0aW9uID0KKwkJCQkJCQlTTUVfUU9TX1dNTV9UU19ESVJfRE9XTkxJTks7CisJCQkJCQlzbWVfcW9zX3VwZGF0ZV90c3BlY19tYXNrCisJCQkJCQkJKHNlc3Npb25JZCwgc2VhcmNoX2tleSwKKwkJCQkJCQlTTUVfUU9TX1RTUEVDX01BU0tfQklUXzJfU0VUKTsKKworCQkJCQkJLyogQWdncmVnYXRlIGFsbCBkb3duc3RyZWFtIGZsb3dzICovCisJCQkJCQloc3RhdHVzID0KKwkJCQkJCQlzbWVfcW9zX3VwZGF0ZV9wYXJhbXMKKwkJCQkJCQkJKHNlc3Npb25JZCwgYWMsCisJCQkJCQkJCVNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMl9TRVQsCisJCQkJCQkJCSZBZ2dyX1RzcGVjX0luZm8pOworCisJCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIGJ1ZmZlcmluZyB0aGUgQWRkVFMgcmVxdWVzdCAiCisJCQkJCQkJICAiZm9yIEFDICVkIGluIHN0YXRlICVkIGFzIEFkZHRzIGlzIHBlbmRpbmcgIgorCQkJCQkJCSAgIm9uIG90aGVyIFRzcGVjIGluZGV4IG9mIHRoaXMgQUMiLAorCQkJCQkJCSAgX19mdW5jX18sIF9fTElORV9fLAorCQkJCQkJCSAgc2Vzc2lvbklkLCBhYywKKwkJCQkJCQkgIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworCisJCQkJCQkvKiBCdWZmZXIgdGhlIChhZ2dyZWdhdGVkKSB0c3BlYyByZXF1ZXN0IGZvciBkb3duc3RyZWFtIGZsb3dzLiAqLworCQkJCQkJLyogUGxlYXNlIG5vdGUgdGhhdCB0aGUgKGFnZ3JlZ2F0ZWQpIHRzcGVjIGZvciB1cHN0cmVhbSBmbG93cyBpcyBzZW50ICovCisJCQkJCQkvKiBvdXQgYnkgdGhlIHN1c2VxdWVudCBsb2dpYy4gKi8KKwkJCQkJCWNtZC5jb21tYW5kID0KKwkJCQkJCQlTTUVfUU9TX1JFU0VORF9SRVE7CisJCQkJCQljbWQucE1hYyA9IHBNYWM7CisJCQkJCQljbWQuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworCQkJCQkJY21kLnUucmVzZW5kQ21kSW5mby5hYyA9IGFjOworCQkJCQkJY21kLnUucmVzZW5kQ21kSW5mby50c3BlY01hc2sgPQorCQkJCQkJCVNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMl9TRVQ7CisJCQkJCQljbWQudS5yZXNlbmRDbWRJbmZvLlFvU0luZm8gPQorCQkJCQkJCUFnZ3JfVHNwZWNfSW5mbzsKKwkJCQkJCXBBQ0luZm8tPgorCQkJCQkJcmVxdWVzdGVkX1FvU0luZm8KKwkJCQkJCVtTTUVfUU9TX1RTUEVDX01BU0tfQklUXzJfU0VUCisJCQkJCQkgLSAxXSA9IEFnZ3JfVHNwZWNfSW5mbzsKKwkJCQkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCQkJCQkJICAgIChzbWVfcW9zX2J1ZmZlcl9jbWQKKwkJCQkJCQkJICAgICgmY21kLCBmYWxzZSkpKSB7CisJCQkJCQkJQ0RGX1RSQUNFCisJCQkJCQkJCShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJCQkiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHVuYWJsZSB0byBidWZmZXIgdGhlIEFkZFRTICIKKwkJCQkJCQkJInJlcXVlc3QgZm9yIEFDICVkIFRTUEVDICVkIGluIHN0YXRlICVkIiwKKwkJCQkJCQkJX19mdW5jX18sIF9fTElORV9fLAorCQkJCQkJCQlzZXNzaW9uSWQsIGFjLAorCQkJCQkJCQlTTUVfUU9TX1RTUEVDX01BU0tfQklUXzJfU0VULAorCQkJCQkJCQlwQUNJbmZvLT4KKwkJCQkJCQkJY3Vycl9zdGF0ZSk7CisKKwkJCQkJCQkvKiB1bmFibGUgdG8gYnVmZmVyIHRoZSByZXF1ZXN0ICovCisJCQkJCQkJLyogbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJCQkJCQlwU2Vzc2lvbi0+CisJCQkJCQkJcmVhZHlGb3JQb3dlclNhdmUgPQorCQkJCQkJCQl0cnVlOworCisJCQkJCQkJcmV0dXJuCisJCQkJCQkJCVNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDsKKwkJCQkJCX0KKwkJCQkJCXBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzID0KKwkJCQkJCQlTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQ7CisKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLyogSW4gY2FzZSBvZiBzcGxpdHRpbmcgb2YgZXhpc3Rpbmcgc3RyZWFtcywKKwkJCSAqIHRzcGVjX21hc2sgd2lsbCBiZSBwb2ludGluZyB0byB0c3BlYyBpbmRleCAwIGFuZAorCQkJICogYWdncmVnYXRlZCB0c3BlYyBmb3IgdXBzdHJlYW0ocykgaXMgc2VudCBvdXQgaGVyZS4gKi8KKwkJCWhzdGF0dXMgPSBzbWVfcW9zX3VwZGF0ZV9wYXJhbXMoc2Vzc2lvbklkLAorCQkJCQkJCWFjLCBmbG93X2luZm8tPnRzcGVjX21hc2ssCisJCQkJCQkJJkFnZ3JfVHNwZWNfSW5mbyk7CisJCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKSB7CisJCQkJcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bZmxvd19pbmZvLT4KKwkJCQkJCQkgICB0c3BlY19tYXNrIC0gMV0gPQorCQkJCQlBZ2dyX1RzcGVjX0luZm87CisJCQkJLyogaWYgQUNNLCBzZW5kIG91dCBhIG5ldyBBRERUUyAqLworCQkJCXN0YXR1cyA9IHNtZV9xb3Nfc2V0dXAocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJICAgICAgICZwQUNJbmZvLT4KKwkJCQkJCSAgICAgICByZXF1ZXN0ZWRfUW9TSW5mbworCQkJCQkJICAgICAgIFtmbG93X2luZm8tPnRzcGVjX21hc2sgLQorCQkJCQkJCTFdLCBhYyk7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCB3aXRoIEFDICVkIGluIHN0YXRlIFNNRV9RT1NfUU9TX09OICIKKwkJCQkJICAic21lX3Fvc19zZXR1cCByZXR1cm5lZCB3aXRoIHN0YXR1cyAlZCIsCisJCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQsIGFjLAorCQkJCQkgIHN0YXR1cyk7CisJCQkJaWYgKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUCAhPQorCQkJCSAgICBzdGF0dXMpIHsKKwkJCQkJLyogd2UgYXJlbid0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVAgKi8KKwkJCQkJLyogc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbiAqLworCQkJCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQkJCX0KKwkJCQlpZiAoU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQID09CisJCQkJICAgIHN0YXR1cykgeworCQkJCQluZXdfc3RhdGUgPSBTTUVfUU9TX1JFUVVFU1RFRDsKKwkJCQkJc3RhdHVzID0KKwkJCQkJCVNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUkVRX1BFTkRJTkdfUlNQOworCQkJCQlwQUNJbmZvLT50c3BlY19wZW5kaW5nID0KKwkJCQkJCWZsb3dfaW5mby0+dHNwZWNfbWFzazsKKwkJCQl9IGVsc2UKKwkJCQlpZiAoKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQID09IHN0YXR1cykgfHwgKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PSBzdGF0dXMpKSB7CisJCQkJCW5ld19zdGF0ZSA9IFNNRV9RT1NfUU9TX09OOworCQkJCQlwQUNJbmZvLT5udW1fZmxvd3NbZmxvd19pbmZvLT4KKwkJCQkJCQkgICB0c3BlY19tYXNrIC0gMV0tLTsKKwkJCQkJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW2Zsb3dfaW5mby0+CisJCQkJCQkJICAgICAgdHNwZWNfbWFzayAtIDFdID0KKwkJCQkJCXBBQ0luZm8tPgorCQkJCQkJcmVxdWVzdGVkX1FvU0luZm9bZmxvd19pbmZvLT4KKwkJCQkJCQkJICB0c3BlY19tYXNrIC0gMV07CisJCQkJCS8qIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSBGbG93IExpc3QgKi8KKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCQkJICAiJXM6ICVkOiBEZWxldGluZyBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIsCisJCQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgZmxvd19pbmZvLAorCQkJCQkJICBRb3NGbG93SUQpOworCQkJCQljc3JfbGxfcmVtb3ZlX2VudHJ5KCZzbWVfcW9zX2NiLmZsb3dfbGlzdCwKKwkJCQkJCQkgICAgcEVudHJ5LCB0cnVlKTsKKwkJCQkJcERlbGV0ZWRGbG93ID0gZmxvd19pbmZvOworCQkJCQlpZiAoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZID09IHN0YXR1cykgeworCQkJCQkJY2RmX21lbV96ZXJvKCZzZWFyY2hfa2V5LAorCQkJCQkJCSAgICAgc2l6ZW9mCisJCQkJCQkJICAgICAoc21lX1Fvc1NlYXJjaEluZm8pKTsKKwkJCQkJCXNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKwkJCQkJCXNlYXJjaF9rZXkuaW5kZXggPQorCQkJCQkJCVNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8yOworCQkJCQkJc2VhcmNoX2tleS5zZXNzaW9uSWQgPQorCQkJCQkJCXNlc3Npb25JZDsKKwkJCQkJCWhzdGF0dXMgPQorCQkJCQkJCXNtZV9xb3NfZmluZF9hbGxfaW5fZmxvd19saXN0CisJCQkJCQkJCShwTWFjLCBzZWFyY2hfa2V5LAorCQkJCQkJCQlzbWVfcW9zX3NldHVwX2ZucCk7CisJCQkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJCQkJCSAgICAoaHN0YXR1cykpIHsKKwkJCQkJCQlDREZfVFJBQ0UKKwkJCQkJCQkJKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJCQlDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkJCSIlczogJWQ6IGNvdWxkbid0IG5vdGlmeSBvdGhlciAiCisJCQkJCQkJCSJlbnRyaWVzIG9uIHRoaXMgQUMgPSVkIiwKKwkJCQkJCQkJX19mdW5jX18sIF9fTElORV9fLAorCQkJCQkJCQlhYyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJc3RhdHVzID0KKwkJCQkJCVNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfU1VDQ0VTU19SU1A7CisJCQkJCWlmIChidWZmZXJlZF9jbWQpIHsKKwkJCQkJCWZsb3dfaW5mby0+UW9TQ2FsbGJhY2socE1hYywKKwkJCQkJCQkJICAgICAgIGZsb3dfaW5mby0+CisJCQkJCQkJCSAgICAgICBIRERjb250ZXh0LAorCQkJCQkJCQkgICAgICAgJnBBQ0luZm8tPgorCQkJCQkJCQkgICAgICAgY3Vycl9Rb1NJbmZvCisJCQkJCQkJCSAgICAgICBbZmxvd19pbmZvLT4KKwkJCQkJCQkJCXRzcGVjX21hc2sKKwkJCQkJCQkJCS0gMV0sCisJCQkJCQkJCSAgICAgICBzdGF0dXMsCisJCQkJCQkJCSAgICAgICBmbG93X2luZm8tPgorCQkJCQkJCQkgICAgICAgUW9zRmxvd0lEKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qIHVuZXhwZWN0ZWQgc3RhdHVzIHJldHVybmVkIGJ5IHNtZV9xb3Nfc2V0dXAoKSAqLworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCB1bmV4cGVjdGVkIHN0YXR1cyAlZCAiCisJCQkJCQkgICJyZXR1cm5lZCBieSBzbWVfcW9zX3NldHVwIiwKKwkJCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQsCisJCQkJCQkgIHN0YXR1cyk7CisJCQkJCW5ld19zdGF0ZSA9IFNNRV9RT1NfTElOS19VUDsKKwkJCQkJcEFDSW5mby0+bnVtX2Zsb3dzW2Zsb3dfaW5mby0+CisJCQkJCQkJICAgdHNwZWNfbWFzayAtIDFdLS07CisJCQkJCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1tmbG93X2luZm8tPgorCQkJCQkJCSAgICAgIHRzcGVjX21hc2sgLSAxXSA9CisJCQkJCQlwQUNJbmZvLT4KKwkJCQkJCXJlcXVlc3RlZF9Rb1NJbmZvW2Zsb3dfaW5mby0+CisJCQkJCQkJCSAgdHNwZWNfbWFzayAtIDFdOworCQkJCQkvKiBkZWxldGUgdGhlIGVudHJ5IGZyb20gRmxvdyBMaXN0ICovCisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBkZWxldGluZyBlbnRyeSBhdCAiCisJCQkJCQkgICIlcCB3aXRoIGZsb3dJRCAlZCIsIF9fZnVuY19fLAorCQkJCQkJICBfX0xJTkVfXywgc2Vzc2lvbklkLAorCQkJCQkJICBmbG93X2luZm8sIFFvc0Zsb3dJRCk7CisJCQkJCWNzcl9sbF9yZW1vdmVfZW50cnkoJnNtZV9xb3NfY2IuZmxvd19saXN0LAorCQkJCQkJCSAgICBwRW50cnksIHRydWUpOworCQkJCQlwRGVsZXRlZEZsb3cgPSBmbG93X2luZm87CisJCQkJCWlmIChidWZmZXJlZF9jbWQpIHsKKwkJCQkJCWZsb3dfaW5mby0+UW9TQ2FsbGJhY2socE1hYywKKwkJCQkJCQkJICAgICAgIGZsb3dfaW5mby0+CisJCQkJCQkJCSAgICAgICBIRERjb250ZXh0LAorCQkJCQkJCQkgICAgICAgJnBBQ0luZm8tPgorCQkJCQkJCQkgICAgICAgY3Vycl9Rb1NJbmZvCisJCQkJCQkJCSAgICAgICBbZmxvd19pbmZvLT4KKwkJCQkJCQkJCXRzcGVjX21hc2sKKwkJCQkJCQkJCS0gMV0sCisJCQkJCQkJCSAgICAgICBzdGF0dXMsCisJCQkJCQkJCSAgICAgICBmbG93X2luZm8tPgorCQkJCQkJCQkgICAgICAgUW9zRmxvd0lEKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogZXJyIG1zZyAqLworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgIiVzOiAlZDogc21lX3Fvc191cGRhdGVfcGFyYW1zKCkgZmFpbGVkIiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJCS8qIHVuYWJsZSB0byBzZXJ2aWNlIHRoZSByZXF1ZXN0ICovCisJCQkJLyogbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQkJCW5ld19zdGF0ZSA9IFNNRV9RT1NfTElOS19VUDsKKwkJCQlpZiAoYnVmZmVyZWRfY21kKSB7CisJCQkJCWZsb3dfaW5mby0+UW9TQ2FsbGJhY2socE1hYywKKwkJCQkJCQkgICAgICAgZmxvd19pbmZvLT4KKwkJCQkJCQkgICAgICAgSEREY29udGV4dCwKKwkJCQkJCQkgICAgICAgJnBBQ0luZm8tPgorCQkJCQkJCSAgICAgICBjdXJyX1FvU0luZm8KKwkJCQkJCQkgICAgICAgW2Zsb3dfaW5mby0+CisJCQkJCQkJCXRzcGVjX21hc2sgLSAxXSwKKwkJCQkJCQkgICAgICAgc3RhdHVzLAorCQkJCQkJCSAgICAgICBmbG93X2luZm8tPgorCQkJCQkJCSAgICAgICBRb3NGbG93SUQpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHRoaXMgaXMgdGhlIG9ubHkgZmxvdyBhZ2dyZWdhdGVkIGluIHRoaXMgVFNQRUMgKi8KKwkJCXN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfU1VDQ0VTU19SU1A7CisJCQkvKiBjaGVjayBpZiBkZWx0cyBuZWVkcyB0byBiZSBzZW50ICovCisJCQlpZiAoQ1NSX0lTX0FERFRTX1dIRU5fQUNNT0ZGX1NVUFBPUlRFRChwTWFjKSB8fAorCQkJICAgIHNtZV9xb3NfaXNfYWNtKHBNYWMsIHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MsIGFjLAorCQkJCQkgICBOVUxMKSkgeworCQkJCS8qIGNoZWNrIGlmIG90aGVyIFRTUEVDIGZvciB0aGlzIEFDIGlzIGFsc28gaW4gdXNlICovCisJCQkJaWYgKFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV8yX1NFVCAhPQorCQkJCSAgICBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cykgeworCQkJCQkvKiB0aGlzIGlzIHRoZSBvbmx5IFRTUEVDIGFjdGl2ZSBvbiB0aGlzIEFDICovCisJCQkJCS8qIHNvIGluZGljYXRlIHRoYXQgd2Ugbm8gbG9uZ2VyIHJlcXVpcmUgQVBTRCAqLworCQkJCQlwU2Vzc2lvbi0+YXBzZE1hc2sgJj0KKwkJCQkJCX4oMSA8PCAoU01FX1FPU19FRENBX0FDX1ZPIC0gYWMpKTsKKwkJCQkJLyogQWxzbyB1cGRhdGUgbW9kaWZ5UHJvZmlsZUZpZWxkcy51YXBzZF9tYXNrIGluIENTUiBmb3IgY29uc2lzdGVuY3kgKi8KKwkJCQkJY3NyX2dldF9tb2RpZnlfcHJvZmlsZV9maWVsZHMocE1hYywKKwkJCQkJCQkJICAgICAgZmxvd19pbmZvLT4KKwkJCQkJCQkJICAgICAgc2Vzc2lvbklkLAorCQkJCQkJCQkgICAgICAmbW9kaWZ5UHJvZmlsZUZpZWxkcyk7CisJCQkJCW1vZGlmeVByb2ZpbGVGaWVsZHMudWFwc2RfbWFzayA9CisJCQkJCQlwU2Vzc2lvbi0+YXBzZE1hc2s7CisJCQkJCWNzcl9zZXRfbW9kaWZ5X3Byb2ZpbGVfZmllbGRzKHBNYWMsCisJCQkJCQkJCSAgICAgIGZsb3dfaW5mby0+CisJCQkJCQkJCSAgICAgIHNlc3Npb25JZCwKKwkJCQkJCQkJICAgICAgJm1vZGlmeVByb2ZpbGVGaWVsZHMpOworCQkJCQlpZiAoIXBTZXNzaW9uLT5hcHNkTWFzaykgeworCQkJCQkJLyogdGhpcyBzZXNzaW9uIG5vIGxvbmdlciBuZWVkcyBVQVBTRCAqLworCQkJCQkJLyogZG8gYW55IHNlc3Npb25zIHN0aWxsIHJlcXVpcmUgVUFQU0Q/ICovCisJCQkJCQlpZiAoIXNtZV9xb3NfaXNfdWFwc2RfYWN0aXZlKCkpIHsKKwkJCQkJCQkvKiBObyBzZXNzaW9ucyByZXF1aXJlIFVBUFNEIHNvIHR1cm4gaXQgb2ZmICovCisJCQkJCQkJLyogKHJlYWxseSBkb24ndCBjYXJlIHdoZW4gUE1DIHN0b3BzIGl0KSAqLworCQkJCQkJCXNtZV9wc191YXBzZF9kaXNhYmxlKAorCQkJCQkJCSAgICAgIHBNYWMsIHNlc3Npb25JZCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKFNNRV9RT1NfUkVMRUFTRV9ERUZBVUxUID09IHBBQ0luZm8tPnJlbFRyaWcpIHsKKwkJCQkJLyogc2VuZCBkZWx0cyAqLworCQkJCQloc3RhdHVzID0KKwkJCQkJCXFvc19pc3N1ZV9jb21tYW5kKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJCQkJICBlU21lQ29tbWFuZERlbFRzLAorCQkJCQkJCQkgIE5VTEwsIGFjLAorCQkJCQkJCQkgIGZsb3dfaW5mby0+CisJCQkJCQkJCSAgdHNwZWNfbWFzayk7CisJCQkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKSB7CisJCQkJCQkvKiBlcnIgbXNnICovCisJCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkJICAiJXM6ICVkOiBzbWVfcW9zX2RlbF90c19yZXEoKSBmYWlsZWQiLAorCQkJCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJCQkJCXN0YXR1cyA9CisJCQkJCQkJU01FX1FPU19TVEFUVVNfUkVMRUFTRV9GQUlMVVJFX1JTUDsKKwkJCQkJCS8qIHdlIHdvbid0IGJlIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVAgKi8KKwkJCQkJCS8qIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJCQkJCXBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9CisJCQkJCQkJdHJ1ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzICY9CisJCQkJCQkJU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUCisJCQkJCQkJJiAofmZsb3dfaW5mby0+dHNwZWNfbWFzayk7CisJCQkJCQlkZWx0c0lzc3VlZCA9IHRydWU7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQkJCQlwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyAmPQorCQkJCQkJU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUICYKKwkJCQkJCSh+Zmxvd19pbmZvLT50c3BlY19tYXNrKTsKKwkJCQkJZGVsdHNJc3N1ZWQgPSB0cnVlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocFNlc3Npb24tPmFwc2RNYXNrICYKKwkJCQkoMSA8PCAoU01FX1FPU19FRENBX0FDX1ZPIC0gYWMpKSkgeworCQkJCS8qIHJlYXNzb2MgbG9naWMgKi8KKwkJCQljc3JfZ2V0X21vZGlmeV9wcm9maWxlX2ZpZWxkcyhwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICAgICAgJm1vZGlmeVByb2ZpbGVGaWVsZHMpOworCQkJCW1vZGlmeVByb2ZpbGVGaWVsZHMudWFwc2RfbWFzayB8PQorCQkJCQlwU2Vzc2lvbi0+YXBzZE1hc2s7CisJCQkJbW9kaWZ5UHJvZmlsZUZpZWxkcy51YXBzZF9tYXNrICY9CisJCQkJCX4oMSA8PCAoU01FX1FPU19FRENBX0FDX1ZPIC0gYWMpKTsKKwkJCQlwU2Vzc2lvbi0+YXBzZE1hc2sgJj0KKwkJCQkJfigxIDw8IChTTUVfUU9TX0VEQ0FfQUNfVk8gLSBhYykpOworCQkJCWlmICghcFNlc3Npb24tPmFwc2RNYXNrKSB7CisJCQkJCS8qIHRoaXMgc2Vzc2lvbiBubyBsb25nZXIgbmVlZHMgVUFQU0QgKi8KKwkJCQkJLyogZG8gYW55IHNlc3Npb25zIHN0aWxsIHJlcXVpcmUgVUFQU0Q/ICovCisJCQkJCWlmICghc21lX3Fvc19pc191YXBzZF9hY3RpdmUoKSkgeworCQkJCQkJLyogTm8gc2Vzc2lvbnMgcmVxdWlyZSBVQVBTRCBzbyB0dXJuIGl0IG9mZiAqLworCQkJCQkJLyogKHJlYWxseSBkb24ndCBjYXJlIHdoZW4gUE1DIHN0b3BzIGl0KSAqLworCQkJCQkJc21lX3BzX3VhcHNkX2Rpc2FibGUoCisJCQkJCQkJcE1hYywgc2Vzc2lvbklkKTsKKwkJCQkJfQorCQkJCX0KKwkJCQloc3RhdHVzID0gc21lX3Fvc19yZXF1ZXN0X3JlYXNzb2MocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCQkgICZtb2RpZnlQcm9maWxlRmllbGRzLAorCQkJCQkJCQkgIGZhbHNlKTsKKwkJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkgeworCQkJCQkvKiBlcnIgbXNnICovCisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkJICAiJXM6ICVkOiBSZWFzc29jIGZhaWxlZCIsCisJCQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQkJCXN0YXR1cyA9CisJCQkJCQlTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQOworCQkJCQkvKiB3ZSB3b24ndCBiZSB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIGZyb20gdGhlIEFQICovCisJCQkJCS8qIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJCQkJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlwQUNJbmZvLT5yZWFzc29jX3BlbmRpbmcgPSBmYWxzZTsgICAvKiBubyBuZWVkIHRvIHdhaXQgKi8KKwkJCQkJcEFDSW5mby0+cHJldl9zdGF0ZSA9IFNNRV9RT1NfTElOS19VUDsKKwkJCQkJcEFDSW5mby0+dHNwZWNfcGVuZGluZyA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkJICAiJXM6ICVkOiBub3RoaW5nIHRvIGRvIGZvciBBQyA9ICVkIiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIGFjKTsKKwkJCQkvKiB3ZSB3b24ndCBiZSB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIGZyb20gdGhlIEFQICovCisJCQkJLyogc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbiAqLworCQkJCXBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IHRydWU7CisJCQl9CisKKwkJCWlmIChTTUVfUU9TX1JFTEVBU0VfQllfQVAgPT0gcEFDSW5mby0+cmVsVHJpZykgeworCQkJCWZsb3dfaW5mby0+UW9TQ2FsbGJhY2socE1hYywKKwkJCQkJCSAgICAgICBmbG93X2luZm8tPkhERGNvbnRleHQsCisJCQkJCQkgICAgICAgJnBBQ0luZm8tPgorCQkJCQkJICAgICAgIGN1cnJfUW9TSW5mb1tmbG93X2luZm8tPgorCQkJCQkJCQkgICAgdHNwZWNfbWFzayAtCisJCQkJCQkJCSAgICAxXSwKKwkJCQkJCSAgICAgICBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX1FPU19MT1NUX0lORCwKKwkJCQkJCSAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkJICAiJXM6ICVkOiBEZWxldGluZyBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIsCisJCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBmbG93X2luZm8sCisJCQkJCSAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworCQkJfSBlbHNlIGlmIChidWZmZXJlZF9jbWQpIHsKKwkJCQlmbG93X2luZm8tPlFvU0NhbGxiYWNrKHBNYWMsCisJCQkJCQkgICAgICAgZmxvd19pbmZvLT5IRERjb250ZXh0LAorCQkJCQkJICAgICAgIE5VTEwsIHN0YXR1cywKKwkJCQkJCSAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisJCQl9CisKKwkJCWlmIChTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQID09IHN0YXR1cykgeworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoKChTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgJiB+Zmxvd19pbmZvLT4KKwkJCSAgICAgIHRzcGVjX21hc2spID4gMCkKKwkJCSAgICAmJgorCQkJICAgICgoU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUICYgfmZsb3dfaW5mby0+CisJCQkgICAgICB0c3BlY19tYXNrKSA8PSBTTUVfUU9TX1RTUEVDX0lOREVYX01BWCkpIHsKKwkJCQlpZiAocEFDSW5mby0+CisJCQkJICAgIG51bV9mbG93c1soU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUICYKKwkJCQkJICAgICAgIH5mbG93X2luZm8tPnRzcGVjX21hc2spIC0gMV0gPgorCQkJCSAgICAwKSB7CisJCQkJCW5ld19zdGF0ZSA9IFNNRV9RT1NfUU9TX09OOworCQkJCX0gZWxzZSB7CisJCQkJCW5ld19zdGF0ZSA9IFNNRV9RT1NfTElOS19VUDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCQkgICIlczogJWQ6IEV4Y2VlZGVkIHRoZSBhcnJheSBib3VuZHMgb2YgcEFDSW5mby0+bnVtX2Zsb3dzIiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJCUNERl9BU1NFUlQoMCk7CisJCQkJcmV0dXJuCisJCQkJCVNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfSU5WQUxJRF9QQVJBTVNfUlNQOworCQkJfQorCisJCQlpZiAoZmFsc2UgPT0gZGVsdHNJc3N1ZWQpIHsKKwkJCQljZGZfbWVtX3plcm8oJnBBQ0luZm8tPgorCQkJCQkgICAgIGN1cnJfUW9TSW5mb1tmbG93X2luZm8tPgorCQkJCQkJCSAgdHNwZWNfbWFzayAtIDFdLAorCQkJCQkgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisJCQl9CisJCQljZGZfbWVtX3plcm8oJnBBQ0luZm8tPgorCQkJCSAgICAgcmVxdWVzdGVkX1FvU0luZm9bZmxvd19pbmZvLT50c3BlY19tYXNrIC0KKwkJCQkJCSAgICAgICAxXSwKKwkJCQkgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisJCQlwQUNJbmZvLT5udW1fZmxvd3NbZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0tLTsKKwkJCS8qIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSBGbG93IExpc3QgKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgZGVsZXRpbmcgZW50cnkgYXQgJXAgd2l0aCBmbG93SUQgJWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLAorCQkJCSAgc2Vzc2lvbklkLCBmbG93X2luZm8sIFFvc0Zsb3dJRCk7CisJCQljc3JfbGxfcmVtb3ZlX2VudHJ5KCZzbWVfcW9zX2NiLmZsb3dfbGlzdCwgcEVudHJ5LAorCQkJCQkgICAgdHJ1ZSk7CisJCQlwRGVsZXRlZEZsb3cgPSBmbG93X2luZm87CisJCQlwQUNJbmZvLT5yZWxUcmlnID0gU01FX1FPU19SRUxFQVNFX0RFRkFVTFQ7CisJCX0KKwkJLyogaWYgd2UgYXJlIGRvaW5nIHJlYXNzb2MgJiB3ZSBhcmUgYWxyZWFkeSBpbiBoYW5kb2ZmIHN0YXRlLCBubyBuZWVkCisJCSAgIHRvIG1vdmUgdG8gcmVxdWVzdGVkIHN0YXRlLiBCdXQgbWFrZSBzdXJlIHRvIHNldCB0aGUgcHJldmlvdXMgc3RhdGUKKwkJICAgYXMgcmVxdWVzdGVkIHN0YXRlCisJCSAqLworCQlpZiAoU01FX1FPU19IQU5ET0ZGICE9IHBBQ0luZm8tPmN1cnJfc3RhdGUpIHsKKwkJCXNtZV9xb3Nfc3RhdGVfdHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLCBuZXdfc3RhdGUpOworCQl9CisJCWlmIChwQUNJbmZvLT5yZWFzc29jX3BlbmRpbmcpIHsKKwkJCXBBQ0luZm8tPnByZXZfc3RhdGUgPSBTTUVfUU9TX1JFUVVFU1RFRDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNNRV9RT1NfSEFORE9GRjoKKwljYXNlIFNNRV9RT1NfUkVRVUVTVEVEOgorCQkvKiBidWZmZXIgY21kICovCisJCWNtZC5jb21tYW5kID0gU01FX1FPU19SRUxFQVNFX1JFUTsKKwkJY21kLnBNYWMgPSBwTWFjOworCQljbWQuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworCQljbWQudS5yZWxlYXNlQ21kSW5mby5Rb3NGbG93SUQgPSBRb3NGbG93SUQ7CisJCWhzdGF0dXMgPSBzbWVfcW9zX2J1ZmZlcl9jbWQoJmNtZCwgYnVmZmVyZWRfY21kKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoaHN0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiAlZDogY291bGRuJ3QgYnVmZmVyIHRoZSByZWxlYXNlIHJlcXVlc3QgaW4gc3RhdGUgPSAlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworCQkJLyogdW5hYmxlIHRvIHNlcnZpY2UgdGhlIHJlcXVlc3QgKi8KKwkJCS8qIG5vdGhpbmcgaXMgcGVuZGluZyBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uICovCisJCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQkJcmV0dXJuIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfRkFJTFVSRV9SU1A7CisJCX0KKwkJc3RhdHVzID0gU01FX1FPU19TVEFUVVNfUkVMRUFTRV9SRVFfUEVORElOR19SU1A7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19DTE9TRUQ6CisJY2FzZSBTTUVfUU9TX0lOSVQ6CisJY2FzZSBTTUVfUU9TX0xJTktfVVA6CisJZGVmYXVsdDoKKwkJLyogcHJpbnQgZXJyb3IgbXNnICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiByZWxlYXNlIHJlcXVlc3QgaW4gdW5leHBlY3RlZCBzdGF0ZSA9ICVkIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJLyogdW5hYmxlIHRvIHNlcnZpY2UgdGhlIHJlcXVlc3QgKi8KKwkJLyogbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCS8qIGlmIHdlIGRlbGV0ZWQgYSBmbG93LCByZWNsYWltIHRoZSBtZW1vcnkgKi8KKwlpZiAocERlbGV0ZWRGbG93KSB7CisJCWNkZl9tZW1fZnJlZShwRGVsZXRlZEZsb3cpOworCX0KKwlpZiAoKFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfU1VDQ0VTU19SU1AgPT0gc3RhdHVzKSkgeworCQkodm9pZClzbWVfcW9zX3Byb2Nlc3NfYnVmZmVyZWRfY21kKHNlc3Npb25JZCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX3Fvc19zZXR1cCgpIC0gaW50ZXJuYWwgU01FIFFPUyBzZXR1cCBmdW5jdGlvbi4KKyAqIEBwTWFjOiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgKiBAc2Vzc2lvbklkOiBTZXNzaW9uIHVwb24gd2hpY2ggc2V0dXAgaXMgYmVpbmcgcGVyZm9ybWVkCisgKiBAcFRzcGVjX0luZm86IFBvaW50ZXIgdG8gc21lX1Fvc1dtbVRzcGVjSW5mbyB3aGljaCBjb250YWlucyB0aGUgV01NCisgKiAgICAgICAgICAgICAgIFRTUEVDIHJlbGF0ZWQgaW5mbyBhcyBkZWZpbmVkIGFib3ZlCisgKiBAYWM6IEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIEVEQ0EgQWNjZXNzIENhdGVnb3JpZXMuCisgKgorICogVGhlIGludGVybmFsIHFvcyBzZXR1cCBmdW5jdGlvbiB3aGljaCBoYXMgdGhlIGludGVsbGlnZW5jZQorICogaWYgdGhlIHJlcXVlc3QgaXMgTk9QLCBvciBmb3IgQVBTRCBhbmQvb3IgbmVlZCB0byBzZW5kIG91dCBBRERUUy4KKyAqIEl0IGFsc28gZG9lcyB0aGUgc2FuaXR5IGNoZWNrIGZvciBRQVAsIEFQIHN1cHBvcnRzIEFQU0QgZXRjLgorICogVGhlIGxvZ2ljIHVzZWQgaW4gdGhlIGNvZGUgbWlnaHQgYmUgY29uZnVzaW5nLgorICoKKyAqIFRyeWluZyB0byBjb3ZlciBhbGwgdGhlIGNhc2VzIGhlcmUuCisgKiAgICBBUCBzdXBwb3J0cyAgQXBwIHdhbnRzICAgQUNNID0gMSAgQWxyZWFkeSBzZXQgQVBTRCAgIFJlc3VsdAorICogfCAgICAwICAgICB8ICAgIDAgICAgIHwgICAgIDAgICB8ICAgICAgIDAgICAgICAgICAgfCAgTk8gQUNNIE5PIEFQU0QKKyAqIHwgICAgMCAgICAgfCAgICAwICAgICB8ICAgICAwICAgfCAgICAgICAxICAgICAgICAgIHwgIE5PIEFDTSBOTyBBUFNEL0lOVkFMSUQKKyAqIHwgICAgMCAgICAgfCAgICAwICAgICB8ICAgICAxICAgfCAgICAgICAwICAgICAgICAgIHwgIEFERFRTCisgKiB8ICAgIDAgICAgIHwgICAgMCAgICAgfCAgICAgMSAgIHwgICAgICAgMSAgICAgICAgICB8ICBBRERUUworICogfCAgICAwICAgICB8ICAgIDEgICAgIHwgICAgIDAgICB8ICAgICAgIDAgICAgICAgICAgfCAgRkFJTFVSRQorICogfCAgICAwICAgICB8ICAgIDEgICAgIHwgICAgIDAgICB8ICAgICAgIDEgICAgICAgICAgfCAgSU5WQUxJRAorICogfCAgICAwICAgICB8ICAgIDEgICAgIHwgICAgIDEgICB8ICAgICAgIDAgICAgICAgICAgfCAgQUREVFMKKyAqIHwgICAgMCAgICAgfCAgICAxICAgICB8ICAgICAxICAgfCAgICAgICAxICAgICAgICAgIHwgIEFERFRTCisgKiB8ICAgIDEgICAgIHwgICAgMCAgICAgfCAgICAgMCAgIHwgICAgICAgMCAgICAgICAgICB8ICBOTyBBQ00gTk8gQVBTRAorICogfCAgICAxICAgICB8ICAgIDAgICAgIHwgICAgIDAgICB8ICAgICAgIDEgICAgICAgICAgfCAgTk8gQUNNIE5PIEFQU0QKKyAqIHwgICAgMSAgICAgfCAgICAwICAgICB8ICAgICAxICAgfCAgICAgICAwICAgICAgICAgIHwgIEFERFRTCisgKiB8ICAgIDEgICAgIHwgICAgMCAgICAgfCAgICAgMSAgIHwgICAgICAgMSAgICAgICAgICB8ICBBRERUUworICogfCAgICAxICAgICB8ICAgIDEgICAgIHwgICAgIDAgICB8ICAgICAgIDAgICAgICAgICAgfCAgUkVBU1NPQworICogfCAgICAxICAgICB8ICAgIDEgICAgIHwgICAgIDAgICB8ICAgICAgIDEgICAgICAgICAgfCAgTk9QOiBBUFNEIFNFVCBBTFJFQURZCisgKiB8ICAgIDEgICAgIHwgICAgMSAgICAgfCAgICAgMSAgIHwgICAgICAgMCAgICAgICAgICB8ICBBRERUUworICogfCAgICAxICAgICB8ICAgIDEgICAgIHwgICAgIDEgICB8ICAgICAgIDEgICAgICAgICAgfCAgQUREVFMKKyAqCisgKiBSZXR1cm46IFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfUlNQIGlmIHRoZSBzZXR1cCBpcyBzdWNjZXNzZnVsJworICovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfcW9zX3NldHVwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJdWludDhfdCBzZXNzaW9uSWQsCisJCQkJc21lX1Fvc1dtbVRzcGVjSW5mbyAqcFRzcGVjX0luZm8sCisJCQkJc21lX1Fvc0VkY2FBY1R5cGUgYWMpCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwlzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworCXNtZV9Rb3NTdGF0dXNUeXBlIHN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOworCXREb3QxMWZCZWFjb25JRXMgKnBJZXMgPSBOVUxMOworCXRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyBtb2RpZnlQcm9maWxlRmllbGRzOworCUNERl9TVEFUVVMgaHN0YXR1czsKKwlpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IFNlc3Npb24gSWQgJWQgaXMgaW52YWxpZCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCWlmICghcFNlc3Npb24tPnNlc3Npb25BY3RpdmUpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IFNlc3Npb24gJWQgaXMgaW5hY3RpdmUiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmICghcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogU2Vzc2lvbiAlZCBoYXMgYW4gSW52YWxpZCBCU1MgRGVzY3JpcHRvciIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaHN0YXR1cyA9IGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMocE1hYywKKwkJCQkJCSAgICAgIHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MsCisJCQkJCQkgICAgICAmcEllcyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoaHN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgdW5hYmxlIHRvIHBhcnNlIEJTUyBJRXMiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogc3VjY2VzcyBzbyBwSWVzIHdhcyBhbGxvY2F0ZWQgKi8KKworCWlmICghQ1NSX0lTX1FPU19CU1MocEllcykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgQVAgZG9lc24ndCBzdXBwb3J0IFFvUyIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkKTsKKwkJY2RmX21lbV9mcmVlKHBJZXMpOworCQkvKiBub3RpZnkgSEREIHRocm91Z2ggdGhlIHN5bmNocm9ub3VzIHN0YXR1cyBtc2cgKi8KKwkJcmV0dXJuIFNNRV9RT1NfU1RBVFVTX1NFVFVQX05PVF9RT1NfQVBfUlNQOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkgICIlczogJWQ6IFVBUFNEL1BTQiBzZXQgJWQ6ICIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJICBwVHNwZWNfSW5mby0+dHNfaW5mby5wc2IpOworCisJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisJZG8geworCQkvKiBpcyBBQ00gZW5hYmxlZCBmb3IgdGhpcyBBQz8gKi8KKwkJaWYgKENTUl9JU19BRERUU19XSEVOX0FDTU9GRl9TVVBQT1JURUQocE1hYykgfHwKKwkJICAgIHNtZV9xb3NfaXNfYWNtKHBNYWMsIHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MsCisJCQkJICAgYWMsIE5VTEwpKSB7CisJCQkvKiBBQ00gaXMgZW5hYmxlZCBmb3IgdGhpcyBBQyBzbyB3ZSBtdXN0IHNlbmQgYW4gQWRkVFMgKi8KKwkJCWlmIChwVHNwZWNfSW5mby0+dHNfaW5mby5wc2IgJiYKKwkJCSAgICAhKHBJZXMtPldNTVBhcmFtcy4KKwkJCSAgICAgIHFvc0luZm8gJiBTTUVfUU9TX0FQX1NVUFBPUlRTX0FQU0QpCisJCQkgICAgJiYgIShwSWVzLT5XTU1JbmZvQXAudWFwc2QpKSB7CisJCQkJLyogYXBwbGljYXRpb24gaXMgbG9va2luZyBmb3IgQVBTRCBidXQgQVAgZG9lc24ndCBzdXBwb3J0IGl0ICovCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIEFQIGRvZXNuJ3Qgc3VwcG9ydCBBUFNEIiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChTTUVfUU9TX01BWF9USUQgPT0gcFRzcGVjX0luZm8tPnRzX2luZm8udGlkKSB7CisJCQkJLyogQXBwIGRpZG4ndCBzZXQgVElELCBnZW5lcmF0ZSBvbmUgKi8KKwkJCQlwVHNwZWNfSW5mby0+dHNfaW5mby50aWQgPQorCQkJCQkodWludDhfdCkgKFNNRV9RT1NfV01NX1VQX05DIC0KKwkJCQkJCSAgIHBUc3BlY19JbmZvLT50c19pbmZvLnVwKTsKKwkJCX0KKwkJCS8qIGFkZHRzIGxvZ2ljICovCisJCQloc3RhdHVzID0KKwkJCQlxb3NfaXNzdWVfY29tbWFuZChwTWFjLCBzZXNzaW9uSWQsIGVTbWVDb21tYW5kQWRkVHMsCisJCQkJCQkgIHBUc3BlY19JbmZvLCBhYywgMCk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgIiVzOiAlZDogc21lX3Fvc19hZGRfdHNfcmVxKCkgZmFpbGVkIiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJCWJyZWFrOworCQkJfQorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBBZGRUUyBvbiBBQyAlZCBpcyBwZW5kaW5nIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkLCBhYyk7CisJCQlzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1A7CisJCQlicmVhazsKKwkJfQorCQkvKiBBQ00gaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgQUMgKi8KKwkJLyogSXMgdGhlIGFwcGxpY2F0aW9uIGxvb2tpbmcgZm9yIEFQU0Q/ICovCisJCWlmICgwID09IHBUc3BlY19JbmZvLT50c19pbmZvLnBzYikgeworCQkJLyogbm8sIHdlIGRvbid0IG5lZWQgQVBTRCAqLworCQkJLyogYnV0IGNoZWNrIHRoZSBjYXNlLCBpZiB0aGUgc2V0dXAgaXMgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIGEgcmVsZWFzZSAqLworCQkJLyogb3IgbW9kaWZ5IHdoaWNoIGJvaWxzIGRvd24gdG8gdGhlIGZhY3QgdGhhdCBBUFNEIHdhcyBzZXQgb24gdGhpcyBBQyAqLworCQkJLyogYnV0IG5vIGxvbmdlciBuZWVkZWQgLSBzbyB3ZSBuZWVkIGEgcmVhc3NvYyBmb3IgdGhlIGFib3ZlIGNhc2UgdG8gKi8KKwkJCS8qIGxldCB0aGUgQVAga25vdyAqLworCQkJaWYgKHBTZXNzaW9uLT4KKwkJCSAgICBhcHNkTWFzayAmICgxIDw8IChTTUVfUU9TX0VEQ0FfQUNfVk8gLSBhYykpKSB7CisJCQkJLyogQVBTRCB3YXMgZm9ybWVybHkgZW5hYmxlZCBvbiB0aGlzIEFDIGJ1dCBpcyBubyBsb25nZXIgcmVxdWlyZWQgKi8KKwkJCQkvKiBzbyB3ZSBtdXN0IHJlYXNzb2NpYXRlICovCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCByZWFzc29jIG5lZWRlZCAiCisJCQkJCSAgInRvIGRpc2FibGUgQVBTRCBvbiBBQyAlZCIsIF9fZnVuY19fLAorCQkJCQkgIF9fTElORV9fLCBzZXNzaW9uSWQsIGFjKTsKKwkJCQljc3JfZ2V0X21vZGlmeV9wcm9maWxlX2ZpZWxkcyhwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICAgICAgJm1vZGlmeVByb2ZpbGVGaWVsZHMpOworCQkJCW1vZGlmeVByb2ZpbGVGaWVsZHMudWFwc2RfbWFzayB8PQorCQkJCQlwU2Vzc2lvbi0+YXBzZE1hc2s7CisJCQkJbW9kaWZ5UHJvZmlsZUZpZWxkcy51YXBzZF9tYXNrICY9CisJCQkJCX4oMSA8PCAoU01FX1FPU19FRENBX0FDX1ZPIC0gYWMpKTsKKwkJCQloc3RhdHVzID0KKwkJCQkJc21lX3Fvc19yZXF1ZXN0X3JlYXNzb2MocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCQkmbW9kaWZ5UHJvZmlsZUZpZWxkcywKKwkJCQkJCQkJZmFsc2UpOworCQkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKSB7CisJCQkJCS8qIGVyciBtc2cgKi8KKwkJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkgICIlczogJWQ6IFVuYWJsZSB0byByZXF1ZXN0IHJlYXNzb2NpYXRpb24iLAorCQkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgcmVhc3NvY2lhdGlvbiB0byBlbmFibGUgIgorCQkJCQkJICAiQVBTRCBvbiBBQyAlZCBpcyBwZW5kaW5nIiwKKwkJCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQsCisJCQkJCQkgIGFjKTsKKwkJCQkJc3RhdHVzID0KKwkJCQkJCVNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUDsKKwkJCQkJcEFDSW5mby0+cmVhc3NvY19wZW5kaW5nID0gdHJ1ZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIGRvbid0IG5lZWQgQVBTRCBvbiB0aGlzIEFDICovCisJCQkJLyogYW5kIHdlIGRvbid0IGN1cnJlbnRseSBoYXZlIEFQU0Qgb24gdGhpcyBBQyAqLworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCQkgICIlczogJWQ6IFJlcXVlc3QgaXMgbm90IGxvb2tpbmcgZm9yIEFQU0QgJiBBZG1pc3Npb24gIgorCQkJCQkgICJDb250cm9sIGlzbid0IG1hbmRhdG9yeSBmb3IgdGhlIEFDIiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJCS8qIHJldHVybiBzdWNjZXNzIHJpZ2h0IGF3YXkgKi8KKwkJCQlzdGF0dXMgPQorCQkJCQlTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUDsKKwkJCX0KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKCEocEllcy0+V01NUGFyYW1zLnFvc0luZm8gJiBTTUVfUU9TX0FQX1NVUFBPUlRTX0FQU0QpCisJCQkgICAmJiAhKHBJZXMtPldNTUluZm9BcC51YXBzZCkpIHsKKwkJCS8qIGFwcGxpY2F0aW9uIGlzIGxvb2tpbmcgZm9yIEFQU0QgYnV0IEFQIGRvZXNuJ3Qgc3VwcG9ydCBpdCAqLworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIEFQIGRvZXNuJ3Qgc3VwcG9ydCBBUFNEIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHBTZXNzaW9uLT4KKwkJCSAgIGFwc2RNYXNrICYgKDEgPDwgKFNNRV9RT1NfRURDQV9BQ19WTyAtIGFjKSkpIHsKKwkJCS8qIGFwcGxpY2F0aW9uIGlzIGxvb2tpbmcgZm9yIEFQU0QgKi8KKwkJCS8qIGFuZCBpdCBpcyBhbHJlYWR5IGVuYWJsZWQgb24gdGhpcyBBQyAqLworCQkJc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgIiVzOiAlZDogUmVxdWVzdCBpcyBsb29raW5nIGZvciBBUFNEIGFuZCBpdCBpcyBhbHJlYWR5ICIKKwkJCQkgICJzZXQgZm9yIHRoZSBBQyIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCS8qIGFwcGxpY2F0aW9uIGlzIGxvb2tpbmcgZm9yIEFQU0QgKi8KKwkJCS8qIGJ1dCBpdCBpcyBub3QgZW5hYmxlZCBvbiB0aGlzIEFDICovCisJCQkvKiBzbyB3ZSBuZWVkIHRvIHJlYXNzb2NpYXRlICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQlGTCgiT24gc2Vzc2lvbiAlZCByZWFzc29jIG5lZWRlZCB0byBlbmFibGUgQVBTRCBvbiBBQyAlZCIpLAorCQkJCXNlc3Npb25JZCwgYWMpOworCQkJLyogcmVhc3NvYyBsb2dpYyAqLworCQkJLyogdXBkYXRlIHRoZSBVQVBTRCBtYXNrIHRvIGluY2x1ZGUgdGhlIG5ldyAqLworCQkJLyogQUMgb24gd2hpY2ggQVBTRCBpcyByZXF1ZXN0ZWQgKi8KKwkJCWNzcl9nZXRfbW9kaWZ5X3Byb2ZpbGVfZmllbGRzKHBNYWMsIHNlc3Npb25JZCwKKwkJCQkJJm1vZGlmeVByb2ZpbGVGaWVsZHMpOworCQkJbW9kaWZ5UHJvZmlsZUZpZWxkcy51YXBzZF9tYXNrIHw9CisJCQkJcFNlc3Npb24tPmFwc2RNYXNrOworCQkJbW9kaWZ5UHJvZmlsZUZpZWxkcy51YXBzZF9tYXNrIHw9CisJCQkJMSA8PCAoU01FX1FPU19FRENBX0FDX1ZPIC0gYWMpOworCQkJaHN0YXR1cyA9CisJCQkJc21lX3Fvc19yZXF1ZXN0X3JlYXNzb2MocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJJm1vZGlmeVByb2ZpbGVGaWVsZHMsCisJCQkJCQlmYWxzZSk7CisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkgeworCQkJCS8qIGVyciBtc2cgKi8KKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCQlDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCQkiJXM6ICVkOiBVbmFibGUgdG8gcmVxdWVzdCByZWFzc29jaWF0aW9uIiwKKwkJCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkJRkwoIk9uIHNlc3Npb24gJWQgcmVhc3NvY2lhdGlvbiB0byBlbmFibGUgQVBTRCBvbiBBQyAlZCBpcyBwZW5kaW5nIiksCisJCQkJCXNlc3Npb25JZCwgYWMpOworCQkJCXN0YXR1cyA9CisJCQkJCVNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUDsKKwkJCQlwQUNJbmZvLT5yZWFzc29jX3BlbmRpbmcgPSB0cnVlOworCQkJfQorCQl9CisJfSB3aGlsZSAoMCk7CisKKwljZGZfbWVtX2ZyZWUocEllcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fTEZSKQorLyogVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIG5vdy4gQnV0IHRoZSBwdXJwb3NlIG9mIG1lIGFkZGluZyB0aGlzIHdhcyB0bworICogZGVsYXkgdGhlIFRTUEVDIHByb2Nlc3NpbmcgdGlsbCBTRVRfS0VZIGNvbXBsZXRlcy4gVGhpcyBmdW5jdGlvbiBjYW4gYmUKKyAqIHVzZWQgdG8gZG8gYW55IFNNRV9RT1MgcHJvY2Vzc2luZyBhZnRlciB0aGUgU0VUX0tFWS4gQXMgb2Ygbm93LCBpdCBpcworICogbm90IHJlcXVpcmVkIGFzIHdlIGFyZSBvayB3aXRoIHRzcGVjIGdldHRpbmcgcHJvZ3JhbW1lZCBiZWZvcmUgc2V0X2tleQorICogYXMgdGhlIHJvYW0gdGltaW5ncyBhcmUgbWVhc3VyZWQgd2l0aG91dCB0c3BlYyBpbiByZWFzc29jIQorICovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19zZXRfa2V5X3N1Y2Nlc3NfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgICB1aW50OF90IHNlc3Npb25JZCwgdm9pZCAqcEV2ZW50X2luZm8pCit7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJICAiIyMjIyMjIyMjIyMgU2V0IEtleSBDb21wbGV0ZSAjIyMjIyMjIyMjIyMjIik7CisJKHZvaWQpc21lX3Fvc19wcm9jZXNzX2J1ZmZlcmVkX2NtZChzZXNzaW9uSWQpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKy8qKgorICogc21lX3Fvc19lc2Vfc2F2ZV90c3BlY19yZXNwb25zZSgpIC0gc2F2ZSBUU1BFQyBwYXJhbWV0ZXJzLgorICogQHBNYWM6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAqIEBzZXNzaW9uSWQ6IFNNRSBzZXNzaW9uIElECisgKiBAcFRzcGVjOiBQb2ludGVyIHRvIHRoZSBUU1BFQyBJRSBmcm9tIHRoZSByZWFzc29jIHJzcAorICogQGFjOiAgQWNjZXNzIENhdGVnb3J5IGZvciB3aGljaCB0aGlzIFRTUEVDIHJzcCBpcyByZWNlaXZlZAorICogQHRzcGVjSW5kZXg6IGZsb3cvZGlyZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBzYXZlcyB0aGUgVFNQRUMgcGFyYW1ldGVycyB0aGF0IGNhbWUgYWxvbmcgaW4gdGhlIFRTUEVDIElFCisgKiBpbiB0aGUgcmVhc3NvYyByZXNwb25zZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIC0gUmVsZWFzZSBpcyBzdWNjZXNzZnVsLgorICovCitDREZfU1RBVFVTIHNtZV9xb3NfZXNlX3NhdmVfdHNwZWNfcmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgIHREb3QxMWZJRVdNTVRTUEVDICpwVHNwZWMsIHVpbnQ4X3QgYWMsCisJCQkJCSAgIHVpbnQ4X3QgdHNwZWNJbmRleCkKK3sKKwl0cFNpckFkZHRzUnNwIHBBZGR0c1JzcCA9CisJCSZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF0uYWNfaW5mb1thY10uYWRkVHNSc3BbdHNwZWNJbmRleF07CisKKwlhYyA9IHNtZV9xb3NfdV9wdG9fYWNfbWFwW3BUc3BlYy0+dXNlcl9wcmlvcml0eV07CisKKwljZGZfbWVtX3plcm8ocEFkZHRzUnNwLCBzaXplb2YodFNpckFkZHRzUnNwKSk7CisKKwlwQWRkdHNSc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfQUREVFNfUlNQOworCXBBZGR0c1JzcC0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJBZGR0c1JzcCk7CisJcEFkZHRzUnNwLT5yYyA9IGVTSVJfU1VDQ0VTUzsKKwlwQWRkdHNSc3AtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwlwQWRkdHNSc3AtPnJzcC5kaWFsb2dUb2tlbiA9IDA7CisJcEFkZHRzUnNwLT5yc3Auc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCXBBZGR0c1JzcC0+cnNwLndtZVRzcGVjUHJlc2VudCA9IHBUc3BlYy0+cHJlc2VudDsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICIlczogQ29weSBUc3BlYyB0byBsb2NhbCBkYXRhIHN0cnVjdHVyZSBhYz0lZCwgdHNwZWNJZHg9JWQiLAorCQkgIF9fZnVuY19fLCBhYywgdHNwZWNJbmRleCk7CisKKwlpZiAocEFkZHRzUnNwLT5yc3Aud21lVHNwZWNQcmVzZW50KSB7CisJCS8qIENvcHkgVFNQRUMgcGFyYW1zIHJlY2VpdmVkIGluIGFzc29jIHJlc3BvbnNlIHRvIGFkZHRzIHJlc3BvbnNlICovCisJCWNvbnZlcnRfd21tdHNwZWMocE1hYywgJnBBZGR0c1JzcC0+cnNwLnRzcGVjLCBwVHNwZWMpOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3Fvc19lc2VfcHJvY2Vzc19yZWFzc29jX3RzcGVjX3JzcCgpIC0gcHJvY2VzcyBlc2UgcmVhc3NvYyB0c3BlYyByZXNwb25zZQorICogQHBNYWM6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAqIEBzZXNzaW9uSWQ6IFNNRSBzZXNzaW9uIElECisgKiBAcEV2ZW5faW5mbzogUG9pbnRlciB0byB0aGUgc21lSm9pblJzcCBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgV01NIFRTUEVDIElFIGluIHRoZSByZWFzc29jIHJlc3BvbnNlLgorICogUmVhc3NvYyB0cmlnZ2VyZWQgYXMgcGFydCBvZiBFU0Ugcm9hbWluZyB0byBhbm90aGVyIEVTRSBjYXBhYmxlIEFQLgorICogSWYgdGhlIFRTUEVDIHdhcyBhZGRlZCBiZWZvcmUgcmVhc3NvYywgYXMgcGFydCBvZiBDYWxsIEFkbWlzc2lvbiBDb250cm9sLAorICogdGhlIHJlYXNzbyByZXEgZnJvbSB0aGUgU1RBIHdvdWxkIGNhcnJ5IHRoZSBUU1BFQyBwYXJhbWV0ZXJzIHdoaWNoIHdlcmUKKyAqIGFscmVhZHkgbmVnb3RpYXRlZCB3aXRoIHRoZSBvbGRlciBBUC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyAtIFJlbGVhc2UgaXMgc3VjY2Vzc2Z1bC4KKyAqLworQ0RGX1NUQVRVUyBzbWVfcW9zX2VzZV9wcm9jZXNzX3JlYXNzb2NfdHNwZWNfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCQkgdm9pZCAqcEV2ZW50X2luZm8pCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwlzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworCXREb3QxMWZJRVdNTVRTUEVDICpwVHNwZWNJRSA9IE5VTEw7CisJdENzclJvYW1TZXNzaW9uICpwQ3NyU2Vzc2lvbiA9IE5VTEw7CisJdENzclJvYW1Db25uZWN0ZWRJbmZvICpwQ3NyQ29ubmVjdGVkSW5mbyA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl1aW50OF90IGFjLCBudW1Uc3BlYywgY250OworCXVpbnQ4X3QgdHNwZWNfZmxvd19pbmRleCwgdHNwZWNfbWFza19zdGF0dXM7CisJdWludDMyX3QgdHNwZWNJZUxlbjsKKworCXBDc3JTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisJaWYgKE5VTEwgPT0gcENzclNlc3Npb24pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJzZXNzaW9uICVkIG5vdCBmb3VuZCIpLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXBDc3JDb25uZWN0ZWRJbmZvID0gJnBDc3JTZXNzaW9uLT5jb25uZWN0ZWRJbmZvOworCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKworCS8qIEdldCB0aGUgVFNQRUMgSUVzIHdoaWNoIGNhbWUgYWxvbmcgd2l0aCB0aGUgcmVhc3NvYyByZXNwb25zZSAqLworCS8qIGZyb20gdGhlIHBiRnJhbWVzIHBvaW50ZXIgKi8KKwlwVHNwZWNJRSA9CisJCSh0RG90MTFmSUVXTU1UU1BFQyAqKSAocENzckNvbm5lY3RlZEluZm8tPnBiRnJhbWVzICsKKwkJCQkgICAgICAgcENzckNvbm5lY3RlZEluZm8tPm5CZWFjb25MZW5ndGggKworCQkJCSAgICAgICBwQ3NyQ29ubmVjdGVkSW5mby0+bkFzc29jUmVxTGVuZ3RoICsKKwkJCQkgICAgICAgcENzckNvbm5lY3RlZEluZm8tPm5Bc3NvY1JzcExlbmd0aCArCisJCQkJICAgICAgIHBDc3JDb25uZWN0ZWRJbmZvLT5uUklDUnNwTGVuZ3RoKTsKKworCS8qIEdldCB0aGUgbnVtYmVyIG9mIHRzcGVjcyBJZXMgaW4gdGhlIGZyYW1lLCB0aGUgbWluIGxlbmd0aCAqLworCS8qIHNob3VsZCBiZSBhdGxlYXN0IGVxdWFsIHRvIHRoZSBvbmUgVFNQRUMgSUUgKi8KKwl0c3BlY0llTGVuID0gcENzckNvbm5lY3RlZEluZm8tPm5Uc3BlY0llTGVuZ3RoOworCWlmICh0c3BlY0llTGVuIDwgc2l6ZW9mKHREb3QxMWZJRVdNTVRTUEVDKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIkVTRSBUc3BlYyBJRSBsZW4gJWQgbGVzcyB0aGFuIG1pbiAlenUiKSwKKwkJCSAgdHNwZWNJZUxlbiwgc2l6ZW9mKHREb3QxMWZJRVdNTVRTUEVDKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkgICJUc3BlY0xlbiA9ICVkLCBwYkZyYW1lcyA9ICVwLCBwVHNwZWNJRSA9ICVwIiwKKwkJICB0c3BlY0llTGVuLCBwQ3NyQ29ubmVjdGVkSW5mby0+cGJGcmFtZXMsIHBUc3BlY0lFKTsKKworCW51bVRzcGVjID0gKHRzcGVjSWVMZW4pIC8gc2l6ZW9mKHREb3QxMWZJRVdNTVRTUEVDKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IG51bVRzcGVjOyBjbnQrKykgeworCQlhYyA9IHNtZV9xb3NfdXBfdG9fYWMocFRzcGVjSUUtPnVzZXJfcHJpb3JpdHkpOworCQlpZiAoYWMgPj0gU01FX1FPU19FRENBX0FDX01BWCkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTCgiYWMgJWQgbW9yZSB0aGFuIGl0YHMgbWF4IHZhbHVlIiksIGFjKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKwkJdHNwZWNfbWFza19zdGF0dXMgPSBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1czsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSAgRkwoIlVQPSVkLCBhYz0lZCwgdHNwZWNfbWFza19zdGF0dXM9JXgiKSwKKwkJCSAgcFRzcGVjSUUtPnVzZXJfcHJpb3JpdHksIGFjLCB0c3BlY19tYXNrX3N0YXR1cyk7CisKKwkJZm9yICh0c3BlY19mbG93X2luZGV4ID0gMDsKKwkJICAgICB0c3BlY19mbG93X2luZGV4IDwgU01FX1FPU19UU1BFQ19JTkRFWF9NQVg7CisJCSAgICAgdHNwZWNfZmxvd19pbmRleCsrKSB7CisJCQlpZiAodHNwZWNfbWFza19zdGF0dXMgJiAoMSA8PCB0c3BlY19mbG93X2luZGV4KSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCQkJICBGTAorCQkJCQkJICAoIkZvdW5kIFRzcGVjIGVudHJ5IGZsb3cgPSAlZCBBQyA9ICVkIiksCisJCQkJCSAgdHNwZWNfZmxvd19pbmRleCwgYWMpOworCQkJCXNtZV9xb3NfZXNlX3NhdmVfdHNwZWNfcmVzcG9uc2UocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCQlwVHNwZWNJRSwgYWMsCisJCQkJCQkJCXRzcGVjX2Zsb3dfaW5kZXgpOworCQkJfSBlbHNlIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkJCSAgRkwKKwkJCQkJCSAgKCJOb3QgZm91bmQgVHNwZWMgZW50cnkgZmxvdyA9ICVkIEFDID0gJWQiKSwKKwkJCQkJICB0c3BlY19mbG93X2luZGV4LCBhYyk7CisJCQl9CisJCX0KKwkJLyogSW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHBvaW50IGl0IHRvIHRoZSBuZXh0IFRTUEVDIElFICovCisJCXBUc3BlY0lFKys7CisJfQorCisJLyogU2VuZCB0aGUgQWdncmVnYXRlZCBRb1MgcmVxdWVzdCB0byBIQUwgKi8KKwlzdGF0dXMgPSBzbWVfcW9zX2Z0X2FnZ3JfcW9zX3JlcShwTWFjLCBzZXNzaW9uSWQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcW9zX2NvcHlfdHNwZWNfaW5mbygpIC0gY29weSB0c3BlYyBpbmZvLgorICogQHBNYWM6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAqIEBwVHNwZWNfSW5mbzogc291cmNlIHN0cnVjdHVyZQorICogQHBUc3BlYzogZGVzdGluYXRpb24gc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBjb3BpZXMgdGhlIGV4aXN0aW5nIFRTUEVDIHBhcmFtZXRlcnMgZnJvbSB0aGUgc291cmNlIHN0cnVjdHVyZQorICogdG8gdGhlIGRlc3RpbmF0aW9uIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgc21lX3Fvc19jb3B5X3RzcGVjX2luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqcFRzcGVjX0luZm8sCisJCQkJICAgIHRTaXJNYWNUc3BlY0lFICpwVHNwZWMpCit7CisJLyogQXMgcGVyIFdNTV9BQ190ZXN0cGxhbl92MC4zOSBNaW5pbXVtIFNlcnZpY2UgSW50ZXJ2YWwsIE1heGltdW0gU2VydmljZQorCSAqIEludGVydmFsLCBTZXJ2aWNlIFN0YXJ0IFRpbWUsIFN1c3BlbnNpb24gSW50ZXJ2YWwgYW5kIERlbGF5IEJvdW5kIGFyZQorCSAqIGFsbCBpbnRlbmRlZCBmb3IgSENDQSBvcGVyYXRpb24gYW5kIHRoZXJlZm9yZSBtdXN0IGJlIHNldCB0byB6ZXJvKi8KKwlwVHNwZWMtPmRlbGF5Qm91bmQgPSBwVHNwZWNfSW5mby0+ZGVsYXlfYm91bmQ7CisJcFRzcGVjLT5pbmFjdEludGVydmFsID0gcFRzcGVjX0luZm8tPmluYWN0aXZpdHlfaW50ZXJ2YWw7CisJcFRzcGVjLT5sZW5ndGggPSBTTUVfUU9TX1RTUEVDX0lFX0xFTkdUSDsKKwlwVHNwZWMtPm1heEJ1cnN0U3ogPSBwVHNwZWNfSW5mby0+bWF4X2J1cnN0X3NpemU7CisJcFRzcGVjLT5tYXhNc2R1U3ogPSBwVHNwZWNfSW5mby0+bWF4aW11bV9tc2R1X3NpemU7CisJcFRzcGVjLT5tYXhTdmNJbnRlcnZhbCA9IHBUc3BlY19JbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbDsKKwlwVHNwZWMtPm1lYW5EYXRhUmF0ZSA9IHBUc3BlY19JbmZvLT5tZWFuX2RhdGFfcmF0ZTsKKwlwVHNwZWMtPm1lZGl1bVRpbWUgPSBwVHNwZWNfSW5mby0+bWVkaXVtX3RpbWU7CisJcFRzcGVjLT5taW5EYXRhUmF0ZSA9IHBUc3BlY19JbmZvLT5taW5fZGF0YV9yYXRlOworCXBUc3BlYy0+bWluUGh5UmF0ZSA9IHBUc3BlY19JbmZvLT5taW5fcGh5X3JhdGU7CisJcFRzcGVjLT5taW5TdmNJbnRlcnZhbCA9IHBUc3BlY19JbmZvLT5taW5fc2VydmljZV9pbnRlcnZhbDsKKwlwVHNwZWMtPm5vbU1zZHVTeiA9IHBUc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZTsKKwlwVHNwZWMtPnBlYWtEYXRhUmF0ZSA9IHBUc3BlY19JbmZvLT5wZWFrX2RhdGFfcmF0ZTsKKwlwVHNwZWMtPnN1cnBsdXNCdyA9IHBUc3BlY19JbmZvLT5zdXJwbHVzX2J3X2FsbG93YW5jZTsKKwlwVHNwZWMtPnN1c3BlbmRJbnRlcnZhbCA9IHBUc3BlY19JbmZvLT5zdXNwZW5zaW9uX2ludGVydmFsOworCXBUc3BlYy0+c3ZjU3RhcnRUaW1lID0gcFRzcGVjX0luZm8tPnN2Y19zdGFydF90aW1lOworCXBUc3BlYy0+dHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID0gcFRzcGVjX0luZm8tPnRzX2luZm8uZGlyZWN0aW9uOworCisJLyogTWFrZSBzdXJlIFVBUFNEIGlzIGFsbG93ZWQgKi8KKwlpZiAocFRzcGVjX0luZm8tPnRzX2luZm8ucHNiKSB7CisJCXBUc3BlYy0+dHNpbmZvLnRyYWZmaWMucHNiID0gcFRzcGVjX0luZm8tPnRzX2luZm8ucHNiOworCX0gZWxzZSB7CisJCXBUc3BlYy0+dHNpbmZvLnRyYWZmaWMucHNiID0gMDsKKwkJcFRzcGVjX0luZm8tPnRzX2luZm8ucHNiID0gMDsKKwl9CisJcFRzcGVjLT50c2luZm8udHJhZmZpYy50c2lkID0gcFRzcGVjX0luZm8tPnRzX2luZm8udGlkOworCXBUc3BlYy0+dHNpbmZvLnRyYWZmaWMudXNlclByaW8gPSBwVHNwZWNfSW5mby0+dHNfaW5mby51cDsKKwlwVHNwZWMtPnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSA9IFNNRV9RT1NfQUNDRVNTX1BPTElDWV9FRENBOworCXBUc3BlYy0+dHNpbmZvLnRyYWZmaWMuYnVyc3RTaXplRGVmbiA9CisJCXBUc3BlY19JbmZvLT50c19pbmZvLmJ1cnN0X3NpemVfZGVmbjsKKwlwVHNwZWMtPnRzaW5mby50cmFmZmljLmFja1BvbGljeSA9IHBUc3BlY19JbmZvLT50c19pbmZvLmFja19wb2xpY3k7CisJcFRzcGVjLT50eXBlID0gU01FX1FPU19UU1BFQ19JRV9UWVBFOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IHVwID0gJWQsIHRpZCA9ICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCSAgcFRzcGVjX0luZm8tPnRzX2luZm8udXAsIHBUc3BlY19JbmZvLT50c19pbmZvLnRpZCk7Cit9CisKKy8qKgorICogc21lX3Fvc19lc2VfcmV0cmlldmVfdHNwZWNfaW5mbygpIC0gcmV0cmlldmUgdHNwZWMgaW5mby4KKyAqIEBwTWFjOiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgKiBAc2Vzc2lvbklkOiBTTUUgc2Vzc2lvbiBJRAorICogQHBUc3BlY0luZm86IFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB0byBjYXJyeSBiYWNrIHRoZSBUU1BFQyBwYXJhbWV0ZXJzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ1NSIHdoZW4gdHJ5IHRvIGNyZWF0ZSByZWFzc29jIHJlcXVlc3QgbWVzc2FnZSB0bworICogUEUgLSBjc3JTZW5kU21lUmVhc3NvY1JlcU1zZy4gVGhpcyBmdW5jdGlvbnMgZ2V0IHRoZSBleGlzdGluZyB0c3BlYworICogcGFyYW1ldGVycyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVhc3NvYyByZXF1ZXN0LgorICoKKyAqIFJldHVybjogdWludDhfdCAtIG51bWJlciBvZiBleGlzdGluZyBuZWdvdGlhdGVkIFRTUEVDcworICovCit1aW50OF90IHNtZV9xb3NfZXNlX3JldHJpZXZlX3RzcGVjX2luZm8odHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkgdWludDhfdCBzZXNzaW9uX2lkLCB0VHNwZWNJbmZvICp0c3BlY19pbmZvKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqc2Vzc2lvbjsKKwlzbWVfUW9zQUNJbmZvICphY19pbmZvOworCXVpbnQ4X3QgYWMsIG51bV90c3BlYyA9IDA7CisJdFRzcGVjSW5mbyAqZHN0X3RzcGVjID0gdHNwZWNfaW5mbzsKKwl1aW50OF90IHRzcGVjX21hc2s7CisJdWludDhfdCB0c3BlY19wZW5kaW5nOworCisJLyoKKwkgKiBUT0RPOiBDaGVjayBpZiBUU1BFQyBoYXMgYWxyZWFkeSBiZWVuIGVzdGFibGlzaGVkCisJICogaWYgbm90IHJldHVybgorCSAqLworCXNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uX2lkXTsKKwlmb3IgKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspIHsKKwkJdm9sYXRpbGUgdWludDhfdCBpbmRleCA9IDA7CisJCWFjX2luZm8gPSAmc2Vzc2lvbi0+YWNfaW5mb1thY107CisJCXRzcGVjX3BlbmRpbmcgPSBhY19pbmZvLT50c3BlY19wZW5kaW5nOworCQl0c3BlY19tYXNrID0gYWNfaW5mby0+dHNwZWNfbWFza19zdGF0dXM7CisJCWRvIHsKKwkJCS8qCisJCQkgKiBJZiBhIHRzcGVjIHN0YXR1cyBpcyBwZW5kaW5nLCB0YWtlCisJCQkgKiByZXF1ZXN0ZWRfUW9TSW5mbyBmb3IgUklDIHJlcXVlc3QsCisJCQkgKiBlbHNlIHVzZSBjdXJyX1FvU0luZm8gZm9yIHRoZQorCQkJICogUklDIHJlcXVlc3QKKwkJCSAqLworCQkJaWYgKCh0c3BlY19tYXNrICYgU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xX1NFVCkKKwkJCQkmJiAodHNwZWNfcGVuZGluZyAmCisJCQkJU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xX1NFVCkpeworCQkJCXNtZV9xb3NfY29weV90c3BlY19pbmZvKG1hY19jdHgsCisJCQkJCSZhY19pbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1tpbmRleF0sCisJCQkJCSZkc3RfdHNwZWMtPnRzcGVjKTsKKwkJCQlkc3RfdHNwZWMtPnZhbGlkID0gdHJ1ZTsKKwkJCQludW1fdHNwZWMrKzsKKwkJCQlkc3RfdHNwZWMrKzsKKwkJCX0gZWxzZSBpZiAoKHRzcGVjX21hc2sgJiBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfU0VUKQorCQkJCSYmICEodHNwZWNfcGVuZGluZyAmCisJCQkJU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xX1NFVCkpeworCQkJCXNtZV9xb3NfY29weV90c3BlY19pbmZvKG1hY19jdHgsCisJCQkJCSZhY19pbmZvLT5jdXJyX1FvU0luZm9baW5kZXhdLAorCQkJCQkmZHN0X3RzcGVjLT50c3BlYyk7CisJCQkJZHN0X3RzcGVjLT52YWxpZCA9IHRydWU7CisJCQkJbnVtX3RzcGVjKys7CisJCQkJZHN0X3RzcGVjKys7CisJCQl9CisJCQl0c3BlY19tYXNrID4+PSAxOworCQkJdHNwZWNfcGVuZGluZyA+Pj0gMTsKKwkJCWluZGV4Kys7CisJCX0gd2hpbGUgKHRzcGVjX21hc2spOworCX0KKwlyZXR1cm4gbnVtX3RzcGVjOworfQorCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisKK0NERl9TVEFUVVMgc21lX3Fvc19jcmVhdGVfdHNwZWNfcmljaWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICBzbWVfUW9zV21tVHNwZWNJbmZvICpwVHNwZWNfSW5mbywKKwkJCQkgICAgICB1aW50OF90ICpwUklDQnVmZmVyLCB1aW50MzJfdCAqcFJJQ0xlbmd0aCwKKwkJCQkgICAgICB1aW50OF90ICpwUklDSWRlbnRpZmllcikKK3sKKwl0RG90MTFmSUVSSUNEYXRhRGVzYyByaWNJRTsKKwl1aW50MzJfdCBuU3RhdHVzOworCisJaWYgKHBSSUNCdWZmZXIgPT0gTlVMTCB8fCBwUklDSWRlbnRpZmllciA9PSBOVUxMIHx8IHBSSUNMZW5ndGggPT0gTlVMTCkgeworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY2RmX21lbV96ZXJvKCZyaWNJRSwgc2l6ZW9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjKSk7CisKKwlyaWNJRS5wcmVzZW50ID0gMTsKKwlyaWNJRS5SSUNEYXRhLnByZXNlbnQgPSAxOworCXJpY0lFLlJJQ0RhdGEucmVzb3VyY2VEZXNjQ291bnQgPSAxOworCXJpY0lFLlJJQ0RhdGEuc3RhdHVzQ29kZSA9IDA7CisJcmljSUUuUklDRGF0YS5JZGVudGlmaWVyID0gc21lX3Fvc19hc3NpZ25fZGlhbG9nX3Rva2VuKCk7CisjaWZuZGVmIFVTRV84MDIxMV9XTU1UU1BFQ19GT1JfUklDCisJcmljSUUuVFNQRUMucHJlc2VudCA9IDE7CisJcmljSUUuVFNQRUMuZGVsYXlfYm91bmQgPSBwVHNwZWNfSW5mby0+ZGVsYXlfYm91bmQ7CisJcmljSUUuVFNQRUMuaW5hY3Rpdml0eV9pbnQgPSBwVHNwZWNfSW5mby0+aW5hY3Rpdml0eV9pbnRlcnZhbDsKKwlyaWNJRS5UU1BFQy5idXJzdF9zaXplID0gcFRzcGVjX0luZm8tPm1heF9idXJzdF9zaXplOworCXJpY0lFLlRTUEVDLm1heF9tc2R1X3NpemUgPSBwVHNwZWNfSW5mby0+bWF4aW11bV9tc2R1X3NpemU7CisJcmljSUUuVFNQRUMubWF4X3NlcnZpY2VfaW50ID0gcFRzcGVjX0luZm8tPm1heF9zZXJ2aWNlX2ludGVydmFsOworCXJpY0lFLlRTUEVDLm1lYW5fZGF0YV9yYXRlID0gcFRzcGVjX0luZm8tPm1lYW5fZGF0YV9yYXRlOworCXJpY0lFLlRTUEVDLm1lZGl1bV90aW1lID0gMDsKKwlyaWNJRS5UU1BFQy5taW5fZGF0YV9yYXRlID0gcFRzcGVjX0luZm8tPm1pbl9kYXRhX3JhdGU7CisJcmljSUUuVFNQRUMubWluX3BoeV9yYXRlID0gcFRzcGVjX0luZm8tPm1pbl9waHlfcmF0ZTsKKwlyaWNJRS5UU1BFQy5taW5fc2VydmljZV9pbnQgPSBwVHNwZWNfSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWw7CisJcmljSUUuVFNQRUMuc2l6ZSA9IHBUc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZTsKKwlyaWNJRS5UU1BFQy5wZWFrX2RhdGFfcmF0ZSA9IHBUc3BlY19JbmZvLT5wZWFrX2RhdGFfcmF0ZTsKKwlyaWNJRS5UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSA9IHBUc3BlY19JbmZvLT5zdXJwbHVzX2J3X2FsbG93YW5jZTsKKwlyaWNJRS5UU1BFQy5zdXNwZW5zaW9uX2ludCA9IHBUc3BlY19JbmZvLT5zdXNwZW5zaW9uX2ludGVydmFsOworCXJpY0lFLlRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSA9IHBUc3BlY19JbmZvLT5zdmNfc3RhcnRfdGltZTsKKwlyaWNJRS5UU1BFQy5kaXJlY3Rpb24gPSBwVHNwZWNfSW5mby0+dHNfaW5mby5kaXJlY3Rpb247CisJLyogTWFrZSBzdXJlIFVBUFNEIGlzIGFsbG93ZWQgKi8KKwlpZiAocFRzcGVjX0luZm8tPnRzX2luZm8ucHNiKSB7CisJCXJpY0lFLlRTUEVDLnBzYiA9IHBUc3BlY19JbmZvLT50c19pbmZvLnBzYjsKKwl9IGVsc2UgeworCQlyaWNJRS5UU1BFQy5wc2IgPSAwOworCX0KKwlyaWNJRS5UU1BFQy50c2lkID0gcFRzcGVjX0luZm8tPnRzX2luZm8udGlkOworCXJpY0lFLlRTUEVDLnVzZXJfcHJpb3JpdHkgPSBwVHNwZWNfSW5mby0+dHNfaW5mby51cDsKKwlyaWNJRS5UU1BFQy5hY2Nlc3NfcG9saWN5ID0gU01FX1FPU19BQ0NFU1NfUE9MSUNZX0VEQ0E7CisKKwkqcFJJQ0lkZW50aWZpZXIgPSByaWNJRS5SSUNEYXRhLklkZW50aWZpZXI7CisKKwluU3RhdHVzID0KKwkJZG90MTFmX3BhY2tfaWVfcmljX2RhdGFfZGVzYyhwTWFjLCAmcmljSUUsIHBSSUNCdWZmZXIsIHNpemVvZihyaWNJRSksCisJCQkJCSAgICAgcFJJQ0xlbmd0aCk7CisJaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMCisJCQkJICAoIlBhY2tpbmcgb2YgUklDIERhdGEgb2YgbGVuZ3RoICVkIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIpLAorCQkJICAqcFJJQ0xlbmd0aCwgblN0YXR1cyk7CisJfQorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXTU0gVFNQRUMgKi8KKwkvKkFzIHBlciBXTU1fQUNfdGVzdHBsYW5fdjAuMzkgTWluaW11bSBTZXJ2aWNlIEludGVydmFsLCBNYXhpbXVtIFNlcnZpY2UKKwkgICBJbnRlcnZhbCwgU2VydmljZSBTdGFydCBUaW1lLCBTdXNwZW5zaW9uIEludGVydmFsIGFuZCBEZWxheSBCb3VuZCBhcmUKKwkgICBhbGwgaW50ZW5kZWQgZm9yIEhDQ0Egb3BlcmF0aW9uIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBzZXQgdG8gemVybyAqLworCXJpY0lFLldNTVRTUEVDLnByZXNlbnQgPSAxOworCXJpY0lFLldNTVRTUEVDLnZlcnNpb24gPSAxOworCXJpY0lFLldNTVRTUEVDLmRlbGF5X2JvdW5kID0gcFRzcGVjX0luZm8tPmRlbGF5X2JvdW5kOworCXJpY0lFLldNTVRTUEVDLmluYWN0aXZpdHlfaW50ID0gcFRzcGVjX0luZm8tPmluYWN0aXZpdHlfaW50ZXJ2YWw7CisJcmljSUUuV01NVFNQRUMuYnVyc3Rfc2l6ZSA9IHBUc3BlY19JbmZvLT5tYXhfYnVyc3Rfc2l6ZTsKKwlyaWNJRS5XTU1UU1BFQy5tYXhfbXNkdV9zaXplID0gcFRzcGVjX0luZm8tPm1heGltdW1fbXNkdV9zaXplOworCXJpY0lFLldNTVRTUEVDLm1heF9zZXJ2aWNlX2ludCA9IHBUc3BlY19JbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbDsKKwlyaWNJRS5XTU1UU1BFQy5tZWFuX2RhdGFfcmF0ZSA9IHBUc3BlY19JbmZvLT5tZWFuX2RhdGFfcmF0ZTsKKwlyaWNJRS5XTU1UU1BFQy5tZWRpdW1fdGltZSA9IDA7CisJcmljSUUuV01NVFNQRUMubWluX2RhdGFfcmF0ZSA9IHBUc3BlY19JbmZvLT5taW5fZGF0YV9yYXRlOworCXJpY0lFLldNTVRTUEVDLm1pbl9waHlfcmF0ZSA9IHBUc3BlY19JbmZvLT5taW5fcGh5X3JhdGU7CisJcmljSUUuV01NVFNQRUMubWluX3NlcnZpY2VfaW50ID0gcFRzcGVjX0luZm8tPm1pbl9zZXJ2aWNlX2ludGVydmFsOworCXJpY0lFLldNTVRTUEVDLnNpemUgPSBwVHNwZWNfSW5mby0+bm9taW5hbF9tc2R1X3NpemU7CisJcmljSUUuV01NVFNQRUMucGVha19kYXRhX3JhdGUgPSBwVHNwZWNfSW5mby0+cGVha19kYXRhX3JhdGU7CisJcmljSUUuV01NVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UgPSBwVHNwZWNfSW5mby0+c3VycGx1c19id19hbGxvd2FuY2U7CisJcmljSUUuV01NVFNQRUMuc3VzcGVuc2lvbl9pbnQgPSBwVHNwZWNfSW5mby0+c3VzcGVuc2lvbl9pbnRlcnZhbDsKKwlyaWNJRS5XTU1UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUgPSBwVHNwZWNfSW5mby0+c3ZjX3N0YXJ0X3RpbWU7CisJcmljSUUuV01NVFNQRUMuZGlyZWN0aW9uID0gcFRzcGVjX0luZm8tPnRzX2luZm8uZGlyZWN0aW9uOworCS8qIE1ha2Ugc3VyZSBVQVBTRCBpcyBhbGxvd2VkICovCisJaWYgKHBUc3BlY19JbmZvLT50c19pbmZvLnBzYikgeworCQlyaWNJRS5XTU1UU1BFQy5wc2IgPSBwVHNwZWNfSW5mby0+dHNfaW5mby5wc2I7CisJfSBlbHNlIHsKKwkJcmljSUUuV01NVFNQRUMucHNiID0gMDsKKwl9CisJcmljSUUuV01NVFNQRUMudHNpZCA9IHBUc3BlY19JbmZvLT50c19pbmZvLnRpZDsKKwlyaWNJRS5XTU1UU1BFQy51c2VyX3ByaW9yaXR5ID0gcFRzcGVjX0luZm8tPnRzX2luZm8udXA7CisJcmljSUUuV01NVFNQRUMuYWNjZXNzX3BvbGljeSA9IFNNRV9RT1NfQUNDRVNTX1BPTElDWV9FRENBOworCisJblN0YXR1cyA9CisJCWRvdDExZl9wYWNrX2llX3JpY19kYXRhX2Rlc2MocE1hYywgJnJpY0lFLCBwUklDQnVmZmVyLCBzaXplb2YocmljSUUpLAorCQkJCQkgICAgIHBSSUNMZW5ndGgpOworCWlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTAorCQkJCSAgKCJQYWNraW5nIG9mIFJJQyBEYXRhIG9mIGxlbmd0aCAlZCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiKSwKKwkJCSAgKnBSSUNMZW5ndGgsIG5TdGF0dXMpOworCX0KKyNlbmRpZiAvKiA4MDIxMV9UU1BFQyAqLworCSpwUklDSWRlbnRpZmllciA9IHJpY0lFLlJJQ0RhdGEuSWRlbnRpZmllcjsKKwlyZXR1cm4gblN0YXR1czsKK30KKy8qKgorICogc21lX3Fvc19wcm9jZXNzX2Z0X3JlYXNzb2NfcmVxX2V2KCktIHByb2Nlc3NlcyByZWFzc29jIHJlcXVlc3QKKyAqCisgKiBAc2Vzc2lvbl9pZDogU01FIFNlc3Npb24gSWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIFByb2Nlc3MgcmVhc3NvYyByZXF1ZXN0IHJlbGF0ZWQgdG8gUU9TCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uIHZhbHVlLgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfZnRfcmVhc3NvY19yZXFfZXYoCisJdWludDhfdCBzZXNzaW9uSWQpCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpzZXNzaW9uOworCXNtZV9Rb3NBQ0luZm8gKmFjX2luZm87CisJdWludDhfdCBhYywgcW9zX3JlcXVlc3RlZCA9IGZhbHNlOworCXVpbnQ4X3QgdHNwZWNfaW5kZXg7CisJc21lX1Fvc0Zsb3dJbmZvRW50cnkgKmZsb3dfaW5mbyA9IE5VTEw7CisJdExpc3RFbGVtICplbnRyeSA9IE5VTEw7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCUZMKCJJbnZva2VkIG9uIHNlc3Npb24gJWQiKSwgc2Vzc2lvbklkKTsKKworCXNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCisJZm9yIChhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSB7CisJCWFjX2luZm8gPSAmc2Vzc2lvbi0+YWNfaW5mb1thY107CisJCXFvc19yZXF1ZXN0ZWQgPSBmYWxzZTsKKworCQlmb3IgKHRzcGVjX2luZGV4ID0gMDsKKwkJCXRzcGVjX2luZGV4IDwgU01FX1FPU19UU1BFQ19JTkRFWF9NQVg7CisJCQl0c3BlY19pbmRleCsrKSB7CisJCQkvKgorCQkJICogT25seSBpbiB0aGUgYmVsb3cgY2FzZSwgY29weSB0aGUgQUMncyBjdXJyCisJCQkgKiBRb1MgSW5mbyB0byByZXF1ZXN0ZWQgUW9TIGluZm8KKwkJCSAqLworCQkJaWYgKChhY19pbmZvLT5yaWNJZGVudGlmaWVyW3RzcGVjX2luZGV4XQorCQkJCSYmICFhY19pbmZvLT50c3BlY19wZW5kaW5nKQorCQkJCXx8IChhY19pbmZvLT4KKwkJCQl0c3BlY19tYXNrX3N0YXR1cyAmICgxIDw8IHRzcGVjX2luZGV4KSkpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCUNERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQlGTCgiQ29weWluZyB0aGUgY3VycmVudFFvcyB0byAiCisJCQkJCSJyZXF1ZXN0ZWRRb3MgZm9yIEFDPSVkLCBmbG93PSVkIiksCisJCQkJCWFjLCB0c3BlY19pbmRleCk7CisKKwkJCQlhY19pbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1t0c3BlY19pbmRleF0gPQorCQkJCQlhY19pbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfaW5kZXhdOworCQkJCWNkZl9tZW1femVybygKKwkJCQkJJmFjX2luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19pbmRleF0sCisJCQkJCXNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisJCQkJcW9zX3JlcXVlc3RlZCA9IHRydWU7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBPbmx5IGlmIHRoZSB0c3BlYyBpcyByZXF1aXJlZCwgdHJhbnNpdGlvbiB0aGUgc3RhdGUgdG8KKwkJICogU01FX1FPU19SRVFVRVNURUQgZm9yIHRoaXMgQUMKKwkJICovCisJCWlmIChxb3NfcmVxdWVzdGVkKSB7CisJCQlzd2l0Y2ggKGFjX2luZm8tPmN1cnJfc3RhdGUpIHsKKwkJCWNhc2UgU01FX1FPU19IQU5ET0ZGOgorCQkJCXNtZV9xb3Nfc3RhdGVfdHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLAorCQkJCQlTTUVfUU9TX1JFUVVFU1RFRCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQlGTCgiRlQgUmVhc3NvYyByZXEgZXZlbnQgaW4iCisJCQkJCSIgdW5leHBlY3RlZCBzdGF0ZSAlZCIpLAorCQkJCQlhY19pbmZvLT5jdXJyX3N0YXRlKTsKKwkJCQlDREZfQVNTRVJUKDApOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IG9mIHRpbWUsIHdlIGFyZQorCSAqIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBvbGQgQVAsIHNvIGl0IGlzIHNhZmUKKwkgKiB0byByZXNldCBhbGwgdGhlc2Ugc2Vzc2lvbiB2YXJpYWJsZXMKKwkgKi8KKwlzZXNzaW9uLT5hcHNkTWFzayA9IDA7CisJc2Vzc2lvbi0+dWFwc2RBbHJlYWR5UmVxdWVzdGVkID0gMDsKKwlzZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IDA7CisKKwkvKgorCSAqIE5vdyBjaGFuZ2UgcmVhc29uIGFuZCBITyByZW5ld2FsIG9mCisJICogYWxsIHRoZSBmbG93IGluIHRoaXMgc2Vzc2lvbiBvbmx5CisJICovCisJZW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZzbWVfcW9zX2NiLmZsb3dfbGlzdCwgZmFsc2UpOworCWlmICghZW50cnkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCUZMKCJGbG93IExpc3QgZW1wdHksIG5vdGhpbmcgdG8gdXBkYXRlIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJZG8geworCQlmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKGVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJCWlmIChzZXNzaW9uSWQgPT0gZmxvd19pbmZvLT5zZXNzaW9uSWQpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQlGTCgiQ2hhbmdpbmcgRmxvd0lEICVkIHJlYXNvbiB0byBTRVRVUCIKKwkJCQkiYW5kIEhPIHJlbmV3YWwgdG8gZmFsc2UiKSwKKwkJCQlmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisJCQlmbG93X2luZm8tPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1NFVFVQOworCQkJZmxvd19pbmZvLT5ob1JlbmV3YWwgPSB0cnVlOworCQl9CisJCWVudHJ5ID0gY3NyX2xsX25leHQoJnNtZV9xb3NfY2IuZmxvd19saXN0LCBlbnRyeSwgZmFsc2UpOworCX0gd2hpbGUgKGVudHJ5KTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3Fvc19maWxsX2FnZ3JfaW5mbyAtIGZpbGwgUU9TIEFnZ3JlZ2F0aW9uIGluZm8KKyAqCisgKiBAYWNfaWQgLSBpbmRleCB0byB0aGUgQUMKKyAqIEB0c19pZCAtIGluZGV4IHRvIFRTIGZvciBhIGdpdmVuIEFDCisgKiBAZGlyZWN0aW9uIC0gdHJhZmZpYyBkaXJlY3Rpb24KKyAqIEBtc2cgLSBRT1MgbWVzc2FnZQorICogQHNlc3Npb24gLSBzbWUgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICoKKyAqIHRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdG8gcG9wdWxhdGUgYWdncmVnYXRpb24gaW5mb3JtYXRpb24KKyAqIGZvciBRT1MgbWVzc2FnZS4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgc21lX3Fvc19maWxsX2FnZ3JfaW5mbyhpbnQgYWNfaWQsIGludCB0c19pZCwKKwkJCQkgICBzbWVfUW9zV21tRGlyVHlwZSBkaXJlY3Rpb24sCisJCQkJICAgdFNpckFnZ3JRb3NSZXEgKm1zZywKKwkJCQkgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnNlc3Npb24pCit7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJICBGTCgiRm91bmQgdHNwZWMgZW50cnkgQUM9JWQsIGZsb3c9JWQsIGRpcmVjdGlvbiA9ICVkIiksCisJCSAgYWNfaWQsIHRzX2lkLCBkaXJlY3Rpb24pOworCisJbXNnLT5hZ2dySW5mby5hZ2dyQWRkVHNJbmZvW2FjX2lkXS5kaWFsb2dUb2tlbiA9CisJCQlzbWVfcW9zX2Fzc2lnbl9kaWFsb2dfdG9rZW4oKTsKKwltc2ctPmFnZ3JJbmZvLmFnZ3JBZGRUc0luZm9bYWNfaWRdLmxsZVRzcGVjUHJlc2VudCA9CisJCXNlc3Npb24tPmFjX2luZm9bYWNfaWRdLmFkZFRzUnNwW3RzX2lkXS5yc3AubGxlVHNwZWNQcmVzZW50OworCW1zZy0+YWdnckluZm8uYWdnckFkZFRzSW5mb1thY19pZF0ubnVtVGNsYXMgPQorCQlzZXNzaW9uLT5hY19pbmZvW2FjX2lkXS5hZGRUc1JzcFt0c19pZF0ucnNwLm51bVRjbGFzOworCWNkZl9tZW1fY29weShtc2ctPmFnZ3JJbmZvLmFnZ3JBZGRUc0luZm9bYWNfaWRdLnRjbGFzSW5mbywKKwkJICAgICBzZXNzaW9uLT5hY19pbmZvW2FjX2lkXS5hZGRUc1JzcFt0c19pZF0ucnNwLnRjbGFzSW5mbywKKwkJICAgICBTSVJfTUFDX1RDTEFTSUVfTUFYTlVNKTsKKwltc2ctPmFnZ3JJbmZvLmFnZ3JBZGRUc0luZm9bYWNfaWRdLnRjbGFzUHJvYyA9CisJCXNlc3Npb24tPmFjX2luZm9bYWNfaWRdLmFkZFRzUnNwW3RzX2lkXS5yc3AudGNsYXNQcm9jOworCW1zZy0+YWdnckluZm8uYWdnckFkZFRzSW5mb1thY19pZF0udGNsYXNQcm9jUHJlc2VudCA9CisJCXNlc3Npb24tPmFjX2luZm9bYWNfaWRdLmFkZFRzUnNwW3RzX2lkXS5yc3AudGNsYXNQcm9jUHJlc2VudDsKKwltc2ctPmFnZ3JJbmZvLmFnZ3JBZGRUc0luZm9bYWNfaWRdLnRzcGVjID0KKwkJc2Vzc2lvbi0+YWNfaW5mb1thY19pZF0uYWRkVHNSc3BbdHNfaWRdLnJzcC50c3BlYzsKKwltc2ctPmFnZ3JJbmZvLmFnZ3JBZGRUc0luZm9bYWNfaWRdLndtZVRzcGVjUHJlc2VudCA9CisJCXNlc3Npb24tPmFjX2luZm9bYWNfaWRdLmFkZFRzUnNwW3RzX2lkXS5yc3Aud21lVHNwZWNQcmVzZW50OworCW1zZy0+YWdnckluZm8uYWdnckFkZFRzSW5mb1thY19pZF0ud3NtVHNwZWNQcmVzZW50ID0KKwkJc2Vzc2lvbi0+YWNfaW5mb1thY19pZF0uYWRkVHNSc3BbdHNfaWRdLnJzcC53c21Uc3BlY1ByZXNlbnQ7CisJbXNnLT5hZ2dySW5mby50c3BlY0lkeCB8PSAoMSA8PCBhY19pZCk7CisKKwkvKiBNYXJrIHRoZSBpbmRleCBmb3IgdGhpcyBBQyBhcyBwZW5kaW5nIGZvciByZXNwb25zZSwgd2hpY2ggd291bGQgYmUgKi8KKwkvKiB1c2VkIHRvIHZhbGlkYXRlIHRoZSBBZGRUUyByZXNwb25zZSBmcm9tIEhBTC0+UEUtPlNNRSAqLworCXNlc3Npb24tPmFjX2luZm9bYWNfaWRdLnRzcGVjX3BlbmRpbmcgPSAoMSA8PCB0c19pZCk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogc21lX3Fvc19mdF9hZ2dyX3Fvc19yZXEgLSBzZW5kIGFnZ3JlZ2F0ZWQgUU9TIHJlcXVlc3QKKyAqCisgKiBAbWFjX2N0eCAtIGdsb2JhbCBNQUMgY29udGV4dAorICogQHNlc3Npb25faWQgLSBzbWUgc2Vzc2lvbiBJZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFnZ3JlZ2F0ZWQgUU9TIHJlcXVlc3QgdG8gSEFMLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9xb3NfZnRfYWdncl9xb3NfcmVxKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQ4X3Qgc2Vzc2lvbl9pZCkKK3sKKwl0U2lyQWdnclFvc1JlcSAqYWdncl9yZXEgPSBOVUxMOworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqc2Vzc2lvbjsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCWludCBpLCBqID0gMDsKKwl1aW50OF90IGRpcmVjdGlvbjsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICBGTCgiaW52b2tlZCBvbiBzZXNzaW9uICVkIiksIHNlc3Npb25faWQpOworCisJc2Vzc2lvbiA9ICZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25faWRdOworCisJYWdncl9yZXEgPSAodFNpckFnZ3JRb3NSZXEgKikgY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJBZ2dyUW9zUmVxKSk7CisKKwlpZiAoIWFnZ3JfcmVxKSB7CisJCS8qIGVyciBtc2cgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBtc2cgYnVmZmVyIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1femVybyhhZ2dyX3JlcSwgc2l6ZW9mKHRTaXJBZ2dyUW9zUmVxKSk7CisKKwlhZ2dyX3JlcS0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9GVF9BR0dSX1FPU19SRVE7CisJYWdncl9yZXEtPmxlbmd0aCA9IHNpemVvZih0U2lyQWdnclFvc1JlcSk7CisJYWdncl9yZXEtPnNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisJYWdncl9yZXEtPnRpbWVvdXQgPSAwOworCWFnZ3JfcmVxLT5yc3BSZXFkID0gdHJ1ZTsKKwljZGZfbWVtX2NvcHkoJmFnZ3JfcmVxLT5ic3NJZFswXSwKKwkJICAgICAmc2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjLT5ic3NJZFswXSwKKwkJICAgICBzaXplb2Yoc3RydWN0IGNkZl9tYWNfYWRkcikpOworCisJZm9yIChpID0gMDsgaSA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgU01FX1FPU19UU1BFQ19JTkRFWF9NQVg7IGorKykgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgIEZMKCJhYz0lZCwgdHNwZWNfbWFza19zdGF1cz0leCwgdHNwZWNfaW5kZXg9JWQiKSwKKwkJCQkgIGksIHNlc3Npb24tPmFjX2luZm9baV0udHNwZWNfbWFza19zdGF0dXMsIGopOworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgIEZMKCJkaXJlY3Rpb24gPSAlZCIpLAorCQkJCSAgc2Vzc2lvbi0+YWNfaW5mb1tpXS5hZGRUc1JzcFtqXS5yc3AudHNwZWMuCisJCQkJICB0c2luZm8udHJhZmZpYy5kaXJlY3Rpb24pOworCQkJLyogQ2hlY2sgaWYgYW55IGZsb3cgaXMgYWN0aXZlIG9uIHRoaXMgQUMgKi8KKwkJCWlmICghKChzZXNzaW9uLT5hY19pbmZvW2ldLnRzcGVjX21hc2tfc3RhdHVzKSAmCisJCQkgICAgICgxIDw8IGopKSkKKwkJCQljb250aW51ZTsKKworCQkJZGlyZWN0aW9uID0gc2Vzc2lvbi0+YWNfaW5mb1tpXS5hZGRUc1JzcFtqXS5yc3AudHNwZWMuCisJCQkJCXRzaW5mby50cmFmZmljLmRpcmVjdGlvbjsKKworCQkJaWYgKChkaXJlY3Rpb24gPT0gU01FX1FPU19XTU1fVFNfRElSX1VQTElOSykgfHwKKwkJCSAgICAoZGlyZWN0aW9uID09IFNNRV9RT1NfV01NX1RTX0RJUl9CT1RIKSkgeworCQkJCQlzbWVfcW9zX2ZpbGxfYWdncl9pbmZvKGksIGosIGRpcmVjdGlvbiwKKwkJCQkJCWFnZ3JfcmVxLCBzZXNzaW9uKTsKKwkJCX0KKwkJfQorCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgRkwoIlNlbmRpbmcgYWdncmVnYXRlZCBtZXNzYWdlIHRvIEhBTCAweCV4IiksCisJCSAgYWdncl9yZXEtPmFnZ3JJbmZvLnRzcGVjSWR4KTsKKworCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMoYWdncl9yZXEpKSkgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoInNlbnQgZG93biBhIEFHR1IgUW9TIHJlcSB0byBQRSIpKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19mdHJpY19yZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICB0RG90MTFmSUVSSUNEYXRhRGVzYyAqcFJpY0RhdGFEZXNjLAorCQkJCQkgIHVpbnQ4X3QgYWMsIHVpbnQ4X3QgdHNwZWNJbmRleCkKK3sKKwl1aW50OF90IGkgPSAwOworCXRwU2lyQWRkdHNSc3AgcEFkZHRzUnNwCisJCT0KKwkJCSZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF0uYWNfaW5mb1thY10uYWRkVHNSc3BbdHNwZWNJbmRleF07CisKKwljZGZfbWVtX3plcm8ocEFkZHRzUnNwLCBzaXplb2YodFNpckFkZHRzUnNwKSk7CisKKwlwQWRkdHNSc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfQUREVFNfUlNQOworCXBBZGR0c1JzcC0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJBZGR0c1JzcCk7CisJcEFkZHRzUnNwLT5yYyA9IHBSaWNEYXRhRGVzYy0+UklDRGF0YS5zdGF0dXNDb2RlOworCXBBZGR0c1JzcC0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCXBBZGR0c1JzcC0+cnNwLmRpYWxvZ1Rva2VuID0gcFJpY0RhdGFEZXNjLT5SSUNEYXRhLklkZW50aWZpZXI7CisJcEFkZHRzUnNwLT5yc3Auc3RhdHVzID0gcFJpY0RhdGFEZXNjLT5SSUNEYXRhLnN0YXR1c0NvZGU7CisJcEFkZHRzUnNwLT5yc3Aud21lVHNwZWNQcmVzZW50ID0gcFJpY0RhdGFEZXNjLT5UU1BFQy5wcmVzZW50OworCWlmIChwQWRkdHNSc3AtPnJzcC53bWVUc3BlY1ByZXNlbnQpIHsKKwkJLyogQ29weSBUU1BFQyBwYXJhbXMgcmVjZWl2ZWQgaW4gUklDIHJlc3BvbnNlIHRvIGFkZHRzIHJlc3BvbnNlICovCisJCWNvbnZlcnRfdHNwZWMocE1hYywgJnBBZGR0c1JzcC0+cnNwLnRzcGVjLCAmcFJpY0RhdGFEZXNjLT5UU1BFQyk7CisJfQorCisJcEFkZHRzUnNwLT5yc3AubnVtVGNsYXMgPSBwUmljRGF0YURlc2MtPm51bV9UQ0xBUzsKKwlpZiAocEFkZHRzUnNwLT5yc3AubnVtVGNsYXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBBZGR0c1JzcC0+cnNwLm51bVRjbGFzOyBpKyspIHsKKwkJCS8qIENvcHkgVENMQVMgaW5mbyBwZXIgaW5kZXggdG8gdGhlIGFkZHRzIHJlc3BvbnNlICovCisJCQljb252ZXJ0X3RjbGFzKHBNYWMsICZwQWRkdHNSc3AtPnJzcC50Y2xhc0luZm9baV0sCisJCQkJICAgICAgJnBSaWNEYXRhRGVzYy0+VENMQVNbaV0pOworCQl9CisJfQorCisJcEFkZHRzUnNwLT5yc3AudGNsYXNQcm9jUHJlc2VudCA9IHBSaWNEYXRhRGVzYy0+VENMQVNTUFJPQy5wcmVzZW50OworCWlmIChwQWRkdHNSc3AtPnJzcC50Y2xhc1Byb2NQcmVzZW50KQorCQlwQWRkdHNSc3AtPnJzcC50Y2xhc1Byb2MgPSBwUmljRGF0YURlc2MtPlRDTEFTU1BST0MucHJvY2Vzc2luZzsKKworCXBBZGR0c1JzcC0+cnNwLnNjaGVkdWxlUHJlc2VudCA9IHBSaWNEYXRhRGVzYy0+U2NoZWR1bGUucHJlc2VudDsKKwlpZiAocEFkZHRzUnNwLT5yc3Auc2NoZWR1bGVQcmVzZW50KSB7CisJCS8qIENvcHkgU2NoZWR1bGUgSUUgcGFyYW1zIHRvIGFkZHRzIHJlc3BvbnNlICovCisJCWNvbnZlcnRfc2NoZWR1bGUocE1hYywgJnBBZGR0c1JzcC0+cnNwLnNjaGVkdWxlLAorCQkJCSAmcFJpY0RhdGFEZXNjLT5TY2hlZHVsZSk7CisJfQorCS8qIE5lZWQgdG8gY2hlY2sgdGhlIGJlbG93IHBvcnRpb24gaXMgYSBwYXJ0IG9mIFdNTSBUU1BFQyAqLworCS8qIFByb2Nlc3MgRGVsYXkgZWxlbWVudCAqLworCWlmIChwUmljRGF0YURlc2MtPlRTRGVsYXkucHJlc2VudCkKKwkJY29udmVydF90c19kZWxheShwTWFjLCAmcEFkZHRzUnNwLT5yc3AuZGVsYXksCisJCQkJICZwUmljRGF0YURlc2MtPlRTRGVsYXkpOworCisJLyogTmVlZCB0byBjYWxsIGZvciBXTU1UU1BFQyAqLworCWlmIChwUmljRGF0YURlc2MtPldNTVRTUEVDLnByZXNlbnQpIHsKKwkJY29udmVydF93bW10c3BlYyhwTWFjLCAmcEFkZHRzUnNwLT5yc3AudHNwZWMsCisJCQkJICZwUmljRGF0YURlc2MtPldNTVRTUEVDKTsKKwl9CisJLyogcmV0dXJuIHNtZV9xb3NfcHJvY2Vzc19hZGRfdHNfcnNwKHBNYWMsICZhZGR0c1JzcCk7ICovCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzbWVfcW9zX3Byb2Nlc3NfYWdncl9xb3NfcnNwIC0gcHJvY2VzcyBxb3MgYWdncmVnYXRpb24gcmVzcG9uc2UKKyAqCisgKiBAbWFjX2N0eCAtIGdsb2JhbCBtYWMgY29udGV4dAorICogQG1zZ2J1ZiAtIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIHRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgUU9TIGFnZ3JlZ2F0aW9uIHJlc3BvbnNlIHJlY2VpdmVkLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19hZ2dyX3Fvc19yc3AodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwgdm9pZCAqbXNnYnVmKQoreworCXRwU2lyQWdnclFvc1JzcCByc3AgPSAodHBTaXJBZ2dyUW9zUnNwKSBtc2didWY7CisJdFNpckFkZHRzUnNwIGFkZHRzcnNwOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWludCBpLCBqID0gMDsKKwl1aW50OF90IHNlc3Npb25pZCA9IHJzcC0+c2Vzc2lvbklkOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICBGTCgiUmVjZWl2ZWQgQUdHUl9RT1MgcmVzcCBmcm9tIExJTSIpKTsKKworCS8qIENvcHkgdGhlIHVwZGF0ZWQgcmVzcG9uc2UgaW5mb3JtYXRpb24gZm9yIFRTUEVDIG9mIGFsbCB0aGUgQUNzICovCisJZm9yIChpID0gMDsgaSA8IFNJUl9RT1NfTlVNX0FDX01BWDsgaSsrKSB7CisJCXVpbnQ4X3QgdHNwZWNfbWFza19zdGF0dXMgPQorCQkJc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uaWRdLmFjX2luZm9baV0uCisJCQl0c3BlY19tYXNrX3N0YXR1czsKKwkJZm9yIChqID0gMDsgaiA8IFNNRV9RT1NfVFNQRUNfSU5ERVhfTUFYOyBqKyspIHsKKwkJCXVpbnQ4X3QgZGlyZWN0aW9uID0KKwkJCQlzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25pZF0uCisJCQkJYWNfaW5mb1tpXS5hZGRUc1JzcFtqXS5yc3AudHNwZWMudHNpbmZvLnRyYWZmaWMuCisJCQkJZGlyZWN0aW9uOworCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgRkwoIkFkZHRzIHJzcCBmcm9tIExJTSBBQz0lZCwgZmxvdz0lZCBkaXI9JWQsIHRzcGVjSWR4PSV4IiksCisJCQkJICBpLCBqLCBkaXJlY3Rpb24sIHJzcC0+YWdnckluZm8udHNwZWNJZHgpOworCisJCQkvKiBDaGVjayBpZiB0aGUgZGlyZWN0aW9uIGlzIFVwbGluayBvciBiaS1kaXJlY3Rpb25hbCAqLworCQkJaWYgKCEoKCgxIDw8IGkpICYgcnNwLT5hZ2dySW5mby50c3BlY0lkeCkgJiYKKwkJCSAgICAoKHRzcGVjX21hc2tfc3RhdHVzKSAmICgxIDw8IGopKSAmJgorCQkJICAgICgoZGlyZWN0aW9uID09IFNNRV9RT1NfV01NX1RTX0RJUl9VUExJTkspIHx8CisJCQkgICAgIChkaXJlY3Rpb24gPT0gU01FX1FPU19XTU1fVFNfRElSX0JPVEgpKSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWFkZHRzcnNwID0KKwkJCQlzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25pZF0uYWNfaW5mb1tpXS4KKwkJCQlhZGRUc1JzcFtqXTsKKwkJCWFkZHRzcnNwLnJjID0gcnNwLT5hZ2dySW5mby5hZ2dyUnNwW2ldLnN0YXR1czsKKwkJCWFkZHRzcnNwLnJzcC5zdGF0dXMgPSByc3AtPmFnZ3JJbmZvLmFnZ3JSc3BbaV0uc3RhdHVzOworCQkJYWRkdHNyc3AucnNwLnRzcGVjID0gcnNwLT5hZ2dySW5mby5hZ2dyUnNwW2ldLnRzcGVjOworCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgIEZMKCJQcm9jZXNzaW5nIEFkZHRzIHJzcCBmcm9tIExJTSBBQz0lZCwgZmxvdz0lZCIpLAorCQkJCSAgaSwgaik7CisJCQkvKiBwb3N0IEFERCBUUyByZXNwb25zZSBmb3IgZWFjaCAqLworCQkJaWYgKHNtZV9xb3NfcHJvY2Vzc19hZGRfdHNfcnNwKG1hY19jdHgsICZhZGR0c3JzcCkgIT0KKwkJCSAgICBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcW9zX2ZpbmRfbWF0Y2hpbmdfdHNwZWMoKSAtIHV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCBtYXRjaGluZyB0c3BlYworICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dAorICogQHNlc3Npb25pZDogc2Vzc2lvbiBJRAorICogQGFjOiBBQyBpbmRleAorICogQGFjX2luZm86IEN1cnJlbnQgQUMgaW5mbworICogQHJpY19kYXRhX2Rlc2M6IHBvaW50ZXIgdG8gcmljIGRhdGEKKyAqIEByaWNfcnNwbGVuOiBwb2ludGVyIHRvIHJpYyByZXNwb25zZSBsZW5ndGgKKyAqCisgKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHNtZV9xb3NfcHJvY2Vzc19mdF9yZWFzc29jX3JzcF9ldgorICogdG8gZmluZCB0aGUgbWF0Y2hpbmcgdHNwZWMKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworc3RhdGljIENERl9TVEFUVVMgc21lX3Fvc19maW5kX21hdGNoaW5nX3RzcGVjKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQ4X3Qgc2Vzc2lvbmlkLCB1aW50OF90IGFjLCBzbWVfUW9zQUNJbmZvICphY19pbmZvLAorCQl0RG90MTFmSUVSSUNEYXRhRGVzYyAqcmljX2RhdGFfZGVzYywgdWludDMyX3QgKnJpY19yc3BsZW4pCit7CisJdWludDhfdCB0c3BlY19mbG93X2luZGV4OworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJZm9yICh0c3BlY19mbG93X2luZGV4ID0gMDsKKwkgICAgIHRzcGVjX2Zsb3dfaW5kZXggPCBTTUVfUU9TX1RTUEVDX0lOREVYX01BWDsgdHNwZWNfZmxvd19pbmRleCsrKSB7CisJCS8qCisJCSAqIE9ubHkgaW4gdGhlIGJlbG93IGNhc2UsIGNvcHkgdGhlIEFDJ3MgY3VyciBRb1MgSW5mbworCQkgKiB0byByZXF1ZXN0ZWQgUW9TIGluZm8KKwkJICovCisJCWlmICghYWNfaW5mby0+cmljSWRlbnRpZmllclt0c3BlY19mbG93X2luZGV4XSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKnJpY19yc3BsZW4pIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiUklDIFJlc3BvbnNlIG5vdCByZWNlaXZlZCBmb3IgQUMgJWQgb24gIgorCQkJICAiVFNQRUMgSW5kZXggJWQsIFJJQyBSZXEgSWRlbnRpZmllciA9ICVkIiksCisJCQkgIGFjLCB0c3BlY19mbG93X2luZGV4LAorCQkJICBhY19pbmZvLT5yaWNJZGVudGlmaWVyW3RzcGVjX2Zsb3dfaW5kZXhdKTsKKwkJCUNERl9BU1NFUlQoMCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBOb3cgd2UgZ290IHJlc3BvbnNlIGZvciB0aGlzIGlkZW50aWZpZXIuIFByb2Nlc3MgaXQuICovCisJCWlmICghcmljX2RhdGFfZGVzYy0+cHJlc2VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXJpY19kYXRhX2Rlc2MtPlJJQ0RhdGEucHJlc2VudCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChyaWNfZGF0YV9kZXNjLT5SSUNEYXRhLklkZW50aWZpZXIgIT0KKwkJCWFjX2luZm8tPnJpY0lkZW50aWZpZXJbdHNwZWNfZmxvd19pbmRleF0pIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiUklDIHJlc3BvbnNlIG9yZGVyIG5vdCBzYW1lIGFzIHJlcXVlc3Qgc2VudC4gIgorCQkJICAiUmVxdWVzdCBJRCA9ICVkLCBSZXNwb25zZSBJRCA9ICVkIiksCisJCQkgIGFjX2luZm8tPnJpY0lkZW50aWZpZXJbdHNwZWNfZmxvd19pbmRleF0sCisJCQkgIHJpY19kYXRhX2Rlc2MtPlJJQ0RhdGEuSWRlbnRpZmllcik7CisJCQlDREZfQVNTRVJUKDApOworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoIlByb2Nlc3NpbmcgUklDIFJlc3BvbnNlIGZvciBBQyAlZCwgIgorCQkJICAiVFNQRUMgRmxvdyBpbmRleCAlZCB3aXRoIFJJQyBJRCAlZCAiKSwKKwkJCSAgYWMsIHRzcGVjX2Zsb3dfaW5kZXgsCisJCQkgIHJpY19kYXRhX2Rlc2MtPlJJQ0RhdGEuSWRlbnRpZmllcik7CisJCQlzdGF0dXMgPSBzbWVfcW9zX3Byb2Nlc3NfZnRyaWNfcmVzcG9uc2UobWFjX2N0eCwKKwkJCQkJc2Vzc2lvbmlkLCByaWNfZGF0YV9kZXNjLCBhYywKKwkJCQkJdHNwZWNfZmxvd19pbmRleCk7CisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgIEZMKCJGYWlsZWQgd2l0aCBzdGF0dXMgJWQgZm9yIEFDICVkIGluICIKKwkJCQkgICJUU1BFQyBGbG93IGluZGV4ID0gJWQiKSwKKwkJCQkgIHN0YXR1cywgYWMsIHRzcGVjX2Zsb3dfaW5kZXgpOworCQkJfQorCQl9CisJCXJpY19kYXRhX2Rlc2MrKzsKKwkJKnJpY19yc3BsZW4gLT0gc2l6ZW9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKy8qKgorICogc21lX3Fvc19maW5kX21hdGNoaW5nX3RzcGVjX2xmcjMoKSAtIHV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCBtYXRjaGluZyB0c3BlYworICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dAorICogQHNlc3Npb25pZDogc2Vzc2lvbiBJRAorICogQGFjOiBBQyBpbmRleAorICogQHFvc19zZXNzaW9uOiBRT1Mgc2Vzc2lvbgorICogQHJpY19kYXRhX2Rlc2M6IHBvaW50ZXIgdG8gcmljIGRhdGEKKyAqIEByaWNfcnNwbGVuOiByaWMgcmVzcG9uc2UgbGVuZ3RoCisgKgorICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBzbWVfcW9zX3Byb2Nlc3NfZnRfcmVhc3NvY19yc3BfZXYKKyAqIHRvIGZpbmQgdGhlIG1hdGNoaW5nIHRzcGVjIHdoaWxlIExGUjMgaXMgZW5hYmxlZC4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworc3RhdGljIENERl9TVEFUVVMgc21lX3Fvc19maW5kX21hdGNoaW5nX3RzcGVjX2xmcjModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJdWludDhfdCBzZXNzaW9uaWQsIHVpbnQ4X3QgYWMsIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcW9zX3Nlc3Npb24sCisJCXREb3QxMWZJRVJJQ0RhdGFEZXNjICpyaWNfZGF0YV9kZXNjLCB1aW50MzJfdCByaWNfcnNwbGVuKQoreworCXNtZV9Rb3NBQ0luZm8gKmFjX2luZm87CisJdWludDhfdCB0c3BlY19mbG93X2lkeDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJc21lX1Fvc1dtbURpclR5cGUgZGlyZWN0aW9uLCBxb3NfZGlyOworCXVpbnQ4X3QgYWMxOworCXREb3QxMWZJRVJJQ0RhdGFEZXNjICpyaWNfZGF0YSA9IE5VTEw7CisJdWludDMyX3QgcmljX2xlbjsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXJpY19kYXRhID0gcmljX2RhdGFfZGVzYzsKKwlyaWNfbGVuID0gcmljX3JzcGxlbjsKKwlhY19pbmZvID0gJnFvc19zZXNzaW9uLT5hY19pbmZvW2FjXTsKKwlmb3IgKHRzcGVjX2Zsb3dfaWR4ID0gMDsgdHNwZWNfZmxvd19pZHggPCBTTUVfUU9TX1RTUEVDX0lOREVYX01BWDsKKwkgICAgIHRzcGVjX2Zsb3dfaWR4KyspIHsKKwkJaWYgKCEoKHFvc19zZXNzaW9uLT5hY19pbmZvW2FjXS50c3BlY19tYXNrX3N0YXR1cykgJgorCQkgICAgKDEgPDwgdHNwZWNfZmxvd19pZHgpKSkKKwkJCWdvdG8gc21lX3Fvc19uZXh0X3JpYzsKKwkJcW9zX2RpciA9CisJCSAgYWNfaW5mby0+cmVxdWVzdGVkX1FvU0luZm9bdHNwZWNfZmxvd19pZHhdLnRzX2luZm8uZGlyZWN0aW9uOworCQlkbyB7CisJCQlhYzEgPSBzbWVfcW9zX3VwX3RvX2FjKAorCQkJCXJpY19kYXRhLT5XTU1UU1BFQy51c2VyX3ByaW9yaXR5KTsKKwkJCWlmIChhYyA9PSBTTUVfUU9TX0VEQ0FfQUNfTUFYKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgRkwoIkludmFsaWQgQUMgJWQgVVAgJWQiKSwgYWMsCisJCQkJICByaWNfZGF0YS0+V01NVFNQRUMudXNlcl9wcmlvcml0eSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkaXJlY3Rpb24gPSByaWNfZGF0YS0+V01NVFNQRUMuZGlyZWN0aW9uOworCQkJaWYgKGFjID09IGFjMSAmJiBkaXJlY3Rpb24gPT0gcW9zX2RpcikgeworCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQlzdGF0dXMgPSBzbWVfcW9zX3Byb2Nlc3NfZnRyaWNfcmVzcG9uc2UobWFjX2N0eCwKKwkJCQkJCXNlc3Npb25pZCwgcmljX2RhdGEsIGFjLAorCQkJCQkJdHNwZWNfZmxvd19pZHgpOworCQkJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgRkwoIkZhaWxlZCB3aXRoIHN0YXR1cyAlZCBmb3IgQUMgJWQgIgorCQkJCQkgICJpbiBUU1BFQyBGbG93IGluZGV4ID0gJWQiKSwKKwkJCQkJICBzdGF0dXMsIGFjLCB0c3BlY19mbG93X2lkeCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJcmljX2RhdGErKzsKKwkJCXJpY19sZW4gLT0gc2l6ZW9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjKTsKKwkJfSB3aGlsZSAocmljX2xlbik7CitzbWVfcW9zX25leHRfcmljOgorCQlyaWNfZGF0YSA9IHJpY19kYXRhX2Rlc2M7CisJCXJpY19sZW4gPSByaWNfcnNwbGVuOworCQlmb3VuZCA9IGZhbHNlOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRCAqLworCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19mdF9yZWFzc29jX3JzcF9ldih0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQkJCXVpbnQ4X3Qgc2Vzc2lvbmlkLCB2b2lkICpldmVudF9pbmZvKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcW9zX3Nlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqYWNfaW5mbzsKKwl1aW50OF90IGFjOworCXREb3QxMWZJRVJJQ0RhdGFEZXNjICpyaWNfZGF0YV9kZXNjID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0Q3NyUm9hbVNlc3Npb24gKmNzcl9zZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25pZCk7CisJdENzclJvYW1Db25uZWN0ZWRJbmZvICpjc3JfY29ubl9pbmZvID0gTlVMTDsKKwl1aW50MzJfdCByaWNfcnNwbGVuOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwl0RG90MTFmSUVSSUNEYXRhRGVzYyAqcmljX2RhdGEgPSBOVUxMOworCXVpbnQzMl90IHJpY19sZW47CisjZW5kaWYKKworCWlmIChOVUxMID09IGNzcl9zZXNzaW9uKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiVGhlIFNlc3Npb24gcG9pbnRlciBpcyBOVUxMIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWNzcl9jb25uX2luZm8gPSAmY3NyX3Nlc3Npb24tPmNvbm5lY3RlZEluZm87CisJcmljX3JzcGxlbiA9IGNzcl9jb25uX2luZm8tPm5SSUNSc3BMZW5ndGg7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgRkwoImludm9rZWQgb24gc2Vzc2lvbiAlZCIpLCBzZXNzaW9uaWQpOworCisJcW9zX3Nlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uaWRdOworCisJcmljX2RhdGFfZGVzYyA9ICh0RG90MTFmSUVSSUNEYXRhRGVzYyAqKSAoKGNzcl9jb25uX2luZm8tPnBiRnJhbWVzKSArCisJCQkJKGNzcl9jb25uX2luZm8tPm5CZWFjb25MZW5ndGggKworCQkJCSBjc3JfY29ubl9pbmZvLT5uQXNzb2NSZXFMZW5ndGggKworCQkJCSBjc3JfY29ubl9pbmZvLT5uQXNzb2NSc3BMZW5ndGgpKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlpZiAoIWNzcl9zZXNzaW9uLT5yb2FtT2ZmbG9hZFN5bmNoUGFyYW1zLmJSb2FtU3luY2hJblByb2dyZXNzKSB7CisjZW5kaWYKKwlmb3IgKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspIHsKKwkJYWNfaW5mbyA9ICZxb3Nfc2Vzc2lvbi0+YWNfaW5mb1thY107CisJCXNtZV9xb3NfZmluZF9tYXRjaGluZ190c3BlYyhtYWNfY3R4LCBzZXNzaW9uaWQsIGFjLAorCQkJYWNfaW5mbywgcmljX2RhdGFfZGVzYywgJnJpY19yc3BsZW4pOworCX0KKworCWlmIChyaWNfcnNwbGVuKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiUklDIFJlc3BvbnNlIHN0aWxsIGZvbGxvd3MgZGVzcGl0ZSB0cmF2ZXJzaW5nICIKKwkJCSAgInRocm91Z2ggYWxsIEFDcy4gUmVtYWluaW5nIGxlbiA9ICVkIiksIHJpY19yc3BsZW4pOworCQlDREZfQVNTRVJUKDApOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoIkxGUjMtMTFyIENvbXBhcmUgUklDIGluIFJlYXNzb2MgUmVzcCB0byBmaW5kIgorCQkJICAgICAiIG1hdGNoaW5nIHRzcGVjIGluIGhvc3QuIikpOworCQlyaWNfZGF0YSA9IHJpY19kYXRhX2Rlc2M7CisJCXJpY19sZW4gPSByaWNfcnNwbGVuOworCQlpZiAocmljX3JzcGxlbiAmJiByaWNfZGF0YV9kZXNjLT5wcmVzZW50ICYmCisJCSAgICByaWNfZGF0YV9kZXNjLT5XTU1UU1BFQy5wcmVzZW50KSB7CisJCQlmb3IgKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7CisJCQkgICAgIGFjKyspIHsKKwkJCQlzbWVfcW9zX2ZpbmRfbWF0Y2hpbmdfdHNwZWNfbGZyMyhtYWNfY3R4LAorCQkJCQlzZXNzaW9uaWQsIGFjLCBxb3Nfc2Vzc2lvbiwgcmljX2RhdGEsCisJCQkJCXJpY19sZW4pOworCQkJfQorCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoIkxGUjMtMTFyIHJpY19yc3BsZW4gaXMgemVybyBvciByaWNfZGF0YV9kZXNjIGlzIgorCQkJICAiIG5vdCBwcmVzZW50IG9yIHdtbXRzcGVjIGlzIG5vdCBwcmVzZW50IikpOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBTZW5kIHRoZSBBZ2dyZWdhdGVkIFFvUyByZXF1ZXN0IHRvIEhBTCAqLworCXN0YXR1cyA9IHNtZV9xb3NfZnRfYWdncl9xb3NfcmVxKG1hY19jdHgsIHNlc3Npb25pZCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworLyoqCisgKiBzbWVfcW9zX2FkZF90c19yZXEoKSAtIHNlbmQgQUREVFMgcmVxdWVzdC4KKyAqIEBwTWFjOiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgKiBAc2Vzc2lvbklkOiBTZXNzaW9uIHVwb24gd2hpY2ggdGhlIFRTUEVDIHNob3VsZCBiZSBhZGRlZAorICogQHBUc3BlY19JbmZvOiBQb2ludGVyIHRvIHNtZV9Rb3NXbW1Uc3BlY0luZm8gd2hpY2ggY29udGFpbnMgdGhlIFdNTQorICogICAgICAgICAgICAgICBUU1BFQyByZWxhdGVkIGluZm8gYXMgZGVmaW5lZCBhYm92ZQorICogQGFjOiBFbnVtZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBFRENBIEFjY2VzcyBDYXRlZ29yaWVzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGRvd24gdGhlIEFERFRTIHJlcXVlc3Qgd2l0aCBUU1BFQyBwYXJhbXMgdG8gUEUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfcW9zX2FkZF90c19yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqcFRzcGVjX0luZm8sCisJCQkgICAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYykKK3sKKwl0U2lyQWRkdHNSZXEgKnBNc2cgPSBOVUxMOworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJdENzclJvYW1TZXNzaW9uICpwQ3NyU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTihwTWFjLCBzZXNzaW9uSWQpOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCVdMQU5fSE9TVF9ESUFHX0VWRU5UX0RFRihxb3MsIGhvc3RfZXZlbnRfd2xhbl9xb3NfcGF5bG9hZF90eXBlKTsKKyNlbmRpZgorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBpbnZva2VkIG9uIHNlc3Npb24gJWQgZm9yIEFDICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgYWMpOworCWlmIChzZXNzaW9uSWQgPj0gQ1NSX1JPQU1fU0VTU0lPTl9NQVgpIHsKKwkJLyogZXJyIG1zZyAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogc2Vzc2lvbklkKCVkKSBpcyBpbnZhbGlkIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCXBNc2cgPSAodFNpckFkZHRzUmVxICopIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyQWRkdHNSZXEpKTsKKwlpZiAoIXBNc2cpIHsKKwkJLyogZXJyIG1zZyAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbXNnIGJ1ZmZlciIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCWNkZl9tZW1femVybyhwTXNnLCBzaXplb2YodFNpckFkZHRzUmVxKSk7CisJcE1zZy0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9BRERUU19SRVE7CisJcE1zZy0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJBZGR0c1JlcSk7CisJcE1zZy0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCXBNc2ctPnRpbWVvdXQgPSAwOworCXBNc2ctPnJzcFJlcWQgPSB0cnVlOworCXBNc2ctPnJlcS5kaWFsb2dUb2tlbiA9IHNtZV9xb3NfYXNzaWduX2RpYWxvZ190b2tlbigpOworCS8qQXMgcGVyIFdNTV9BQ190ZXN0cGxhbl92MC4zOSBNaW5pbXVtIFNlcnZpY2UgSW50ZXJ2YWwsIE1heGltdW0gU2VydmljZQorCSAgIEludGVydmFsLCBTZXJ2aWNlIFN0YXJ0IFRpbWUsIFN1c3BlbnNpb24gSW50ZXJ2YWwgYW5kIERlbGF5IEJvdW5kIGFyZQorCSAgIGFsbCBpbnRlbmRlZCBmb3IgSENDQSBvcGVyYXRpb24gYW5kIHRoZXJlZm9yZSBtdXN0IGJlIHNldCB0byB6ZXJvICovCisJcE1zZy0+cmVxLnRzcGVjLmRlbGF5Qm91bmQgPSAwOworCXBNc2ctPnJlcS50c3BlYy5pbmFjdEludGVydmFsID0gcFRzcGVjX0luZm8tPmluYWN0aXZpdHlfaW50ZXJ2YWw7CisJcE1zZy0+cmVxLnRzcGVjLmxlbmd0aCA9IFNNRV9RT1NfVFNQRUNfSUVfTEVOR1RIOworCXBNc2ctPnJlcS50c3BlYy5tYXhCdXJzdFN6ID0gcFRzcGVjX0luZm8tPm1heF9idXJzdF9zaXplOworCXBNc2ctPnJlcS50c3BlYy5tYXhNc2R1U3ogPSBwVHNwZWNfSW5mby0+bWF4aW11bV9tc2R1X3NpemU7CisJcE1zZy0+cmVxLnRzcGVjLm1heFN2Y0ludGVydmFsID0gcFRzcGVjX0luZm8tPm1heF9zZXJ2aWNlX2ludGVydmFsOworCXBNc2ctPnJlcS50c3BlYy5tZWFuRGF0YVJhdGUgPSBwVHNwZWNfSW5mby0+bWVhbl9kYXRhX3JhdGU7CisJcE1zZy0+cmVxLnRzcGVjLm1lZGl1bVRpbWUgPSBwVHNwZWNfSW5mby0+bWVkaXVtX3RpbWU7CisJcE1zZy0+cmVxLnRzcGVjLm1pbkRhdGFSYXRlID0gcFRzcGVjX0luZm8tPm1pbl9kYXRhX3JhdGU7CisJcE1zZy0+cmVxLnRzcGVjLm1pblBoeVJhdGUgPSBwVHNwZWNfSW5mby0+bWluX3BoeV9yYXRlOworCXBNc2ctPnJlcS50c3BlYy5taW5TdmNJbnRlcnZhbCA9IHBUc3BlY19JbmZvLT5taW5fc2VydmljZV9pbnRlcnZhbDsKKwlwTXNnLT5yZXEudHNwZWMubm9tTXNkdVN6ID0gcFRzcGVjX0luZm8tPm5vbWluYWxfbXNkdV9zaXplOworCXBNc2ctPnJlcS50c3BlYy5wZWFrRGF0YVJhdGUgPSBwVHNwZWNfSW5mby0+cGVha19kYXRhX3JhdGU7CisJcE1zZy0+cmVxLnRzcGVjLnN1cnBsdXNCdyA9IHBUc3BlY19JbmZvLT5zdXJwbHVzX2J3X2FsbG93YW5jZTsKKwlwTXNnLT5yZXEudHNwZWMuc3VzcGVuZEludGVydmFsID0gcFRzcGVjX0luZm8tPnN1c3BlbnNpb25faW50ZXJ2YWw7CisJcE1zZy0+cmVxLnRzcGVjLnN2Y1N0YXJ0VGltZSA9IDA7CisJcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLmRpcmVjdGlvbiA9CisJCXBUc3BlY19JbmZvLT50c19pbmZvLmRpcmVjdGlvbjsKKwkvKiBNYWtlIHN1cmUgVUFQU0QgaXMgYWxsb3dlZCAqLworCWlmIChwVHNwZWNfSW5mby0+dHNfaW5mby5wc2IpIHsKKwkJcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLnBzYiA9IHBUc3BlY19JbmZvLT50c19pbmZvLnBzYjsKKwl9IGVsc2UgeworCQlwTXNnLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMucHNiID0gMDsKKwkJcFRzcGVjX0luZm8tPnRzX2luZm8ucHNiID0gMDsKKwl9CisJcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLnRzaWQgPSBwVHNwZWNfSW5mby0+dHNfaW5mby50aWQ7CisJcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvID0gcFRzcGVjX0luZm8tPnRzX2luZm8udXA7CisJcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSA9CisJCVNNRV9RT1NfQUNDRVNTX1BPTElDWV9FRENBOworCXBNc2ctPnJlcS50c3BlYy50c2luZm8udHJhZmZpYy5idXJzdFNpemVEZWZuID0KKwkJcFRzcGVjX0luZm8tPnRzX2luZm8uYnVyc3Rfc2l6ZV9kZWZuOworCXBNc2ctPnJlcS50c3BlYy50c2luZm8udHJhZmZpYy5hY2tQb2xpY3kgPQorCQlwVHNwZWNfSW5mby0+dHNfaW5mby5hY2tfcG9saWN5OworCXBNc2ctPnJlcS50c3BlYy50eXBlID0gU01FX1FPU19UU1BFQ19JRV9UWVBFOworCS8qRmlsbCB0aGUgQlNTSUQgcE1zZy0+cmVxLmJzc0lkICovCisJaWYgKE5VTEwgPT0gcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogQlNTIGRlc2NyaXB0b3IgaXMgTlVMTCBzbyB3ZSBkb24ndCBzZW5kIHJlcXVlc3QgdG8gUEUiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQljZGZfbWVtX2ZyZWUocE1zZyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJY2RmX21lbV9jb3B5KCZwTXNnLT5ic3NJZFswXSwKKwkJICAgICAmcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYy0+YnNzSWRbMF0sCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogdXAgPSAlZCwgdGlkID0gJWQiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJICBwVHNwZWNfSW5mby0+dHNfaW5mby51cCwgcFRzcGVjX0luZm8tPnRzX2luZm8udGlkKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJaWYgKHBDc3JTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmlzRVNFQXNzb2MpIHsKKwkJcE1zZy0+cmVxLnRzcnNJRS50c2lkID0gcFRzcGVjX0luZm8tPnRzX2luZm8udXA7CisJCXBNc2ctPnJlcS50c3JzUHJlc2VudCA9IDE7CisJfQorI2VuZGlmCisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKSkpIHsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogJWQ6IHNlbnQgZG93biBhIEFERFRTIHJlcSB0byBQRSIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCS8qIGV2ZW50OiBFVkVOVF9XTEFOX1FPUyAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKwkJcW9zLmV2ZW50SWQgPSBTTUVfUU9TX0RJQUdfQUREVFNfUkVROworCQlxb3MucmVhc29uQ29kZSA9IFNNRV9RT1NfRElBR19VU0VSX1JFUVVFU1RFRDsKKwkJV0xBTl9IT1NUX0RJQUdfRVZFTlRfUkVQT1JUKCZxb3MsIEVWRU5UX1dMQU5fUU9TKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfcW9zX2RlbF90c19yZXEoKSAtIFRvIHNlbmQgZG93biB0aGUgREVMVFMgcmVxdWVzdCB3aXRoIFRTUEVDIHBhcmFtcworICAgdG8gUEUKKworICAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgICBccGFyYW0gc2Vzc2lvbklkIC0gU2Vzc2lvbiBmcm9tIHdoaWNoIHRoZSBUU1BFQyBzaG91bGQgYmUgZGVsZXRlZAorICAgXHBhcmFtIGFjIC0gRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgRURDQSBBY2Nlc3MgQ2F0ZWdvcmllcy4KKyAgIFxwYXJhbSB0c3BlY19tYXNrIC0gb24gd2hpY2ggdHNwZWMgcGVyIEFDLCB0aGUgZGVsdHMgaXMgcmVxdWVzdGVkCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcW9zX2RlbF90c19yZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJICAgICAgc21lX1Fvc0VkY2FBY1R5cGUgYWMsIHVpbnQ4X3QgdHNwZWNfbWFzaykKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCXNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisJdFNpckRlbHRzUmVxICpwTXNnOworCXNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBUc3BlY0luZm87CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfREVGKHFvcywgaG9zdF9ldmVudF93bGFuX3Fvc19wYXlsb2FkX3R5cGUpOworI2VuZGlmCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCBmb3IgQUMgJWQiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkLCBhYyk7CisJcE1zZyA9ICh0U2lyRGVsdHNSZXEgKikgY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJEZWx0c1JlcSkpOworCWlmICghcE1zZykgeworCQkvKiBlcnIgbXNnICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBtc2cgYnVmZmVyIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJY2RmX21lbV96ZXJvKHBNc2csIHNpemVvZih0U2lyRGVsdHNSZXEpKTsKKwkvKiBnZXQgcG9pbnRlciB0byB0aGUgVFNQRUMgYmVpbmcgZGVsZXRlZCAqLworCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKwlwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKwlwVHNwZWNJbmZvID0gJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19tYXNrIC0gMV07CisJcE1zZy0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9ERUxUU19SRVE7CisJcE1zZy0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJEZWx0c1JlcSk7CisJcE1zZy0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworCXBNc2ctPnJzcFJlcWQgPSB0cnVlOworCXBNc2ctPnJlcS50c3BlYy5kZWxheUJvdW5kID0gcFRzcGVjSW5mby0+ZGVsYXlfYm91bmQ7CisJcE1zZy0+cmVxLnRzcGVjLmluYWN0SW50ZXJ2YWwgPSBwVHNwZWNJbmZvLT5pbmFjdGl2aXR5X2ludGVydmFsOworCXBNc2ctPnJlcS50c3BlYy5sZW5ndGggPSBTTUVfUU9TX1RTUEVDX0lFX0xFTkdUSDsKKwlwTXNnLT5yZXEudHNwZWMubWF4QnVyc3RTeiA9IHBUc3BlY0luZm8tPm1heF9idXJzdF9zaXplOworCXBNc2ctPnJlcS50c3BlYy5tYXhNc2R1U3ogPSBwVHNwZWNJbmZvLT5tYXhpbXVtX21zZHVfc2l6ZTsKKwlwTXNnLT5yZXEudHNwZWMubWF4U3ZjSW50ZXJ2YWwgPSBwVHNwZWNJbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbDsKKwlwTXNnLT5yZXEudHNwZWMubWVhbkRhdGFSYXRlID0gcFRzcGVjSW5mby0+bWVhbl9kYXRhX3JhdGU7CisJcE1zZy0+cmVxLnRzcGVjLm1lZGl1bVRpbWUgPSBwVHNwZWNJbmZvLT5tZWRpdW1fdGltZTsKKwlwTXNnLT5yZXEudHNwZWMubWluRGF0YVJhdGUgPSBwVHNwZWNJbmZvLT5taW5fZGF0YV9yYXRlOworCXBNc2ctPnJlcS50c3BlYy5taW5QaHlSYXRlID0gcFRzcGVjSW5mby0+bWluX3BoeV9yYXRlOworCXBNc2ctPnJlcS50c3BlYy5taW5TdmNJbnRlcnZhbCA9IHBUc3BlY0luZm8tPm1pbl9zZXJ2aWNlX2ludGVydmFsOworCXBNc2ctPnJlcS50c3BlYy5ub21Nc2R1U3ogPSBwVHNwZWNJbmZvLT5ub21pbmFsX21zZHVfc2l6ZTsKKwlwTXNnLT5yZXEudHNwZWMucGVha0RhdGFSYXRlID0gcFRzcGVjSW5mby0+cGVha19kYXRhX3JhdGU7CisJcE1zZy0+cmVxLnRzcGVjLnN1cnBsdXNCdyA9IHBUc3BlY0luZm8tPnN1cnBsdXNfYndfYWxsb3dhbmNlOworCXBNc2ctPnJlcS50c3BlYy5zdXNwZW5kSW50ZXJ2YWwgPSBwVHNwZWNJbmZvLT5zdXNwZW5zaW9uX2ludGVydmFsOworCXBNc2ctPnJlcS50c3BlYy5zdmNTdGFydFRpbWUgPSBwVHNwZWNJbmZvLT5zdmNfc3RhcnRfdGltZTsKKwlwTXNnLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID0KKwkJcFRzcGVjSW5mby0+dHNfaW5mby5kaXJlY3Rpb247CisJcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLnBzYiA9IHBUc3BlY0luZm8tPnRzX2luZm8ucHNiOworCXBNc2ctPnJlcS50c3BlYy50c2luZm8udHJhZmZpYy50c2lkID0gcFRzcGVjSW5mby0+dHNfaW5mby50aWQ7CisJcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvID0gcFRzcGVjSW5mby0+dHNfaW5mby51cDsKKwlwTXNnLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID0KKwkJU01FX1FPU19BQ0NFU1NfUE9MSUNZX0VEQ0E7CisJcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLmJ1cnN0U2l6ZURlZm4gPQorCQlwVHNwZWNJbmZvLT50c19pbmZvLmJ1cnN0X3NpemVfZGVmbjsKKwlwTXNnLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMuYWNrUG9saWN5ID0KKwkJcFRzcGVjSW5mby0+dHNfaW5mby5hY2tfcG9saWN5OworCXBNc2ctPnJlcS50c3BlYy50eXBlID0gU01FX1FPU19UU1BFQ19JRV9UWVBFOworCS8qRmlsbCB0aGUgQlNTSUQgcE1zZy0+cmVxLmJzc0lkICovCisJaWYgKE5VTEwgPT0gcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogQlNTIGRlc2NyaXB0b3IgaXMgTlVMTCBzbyB3ZSBkb24ndCBzZW5kIHJlcXVlc3QgdG8gUEUiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQljZGZfbWVtX2ZyZWUocE1zZyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJY2RmX21lbV9jb3B5KCZwTXNnLT5ic3NJZFswXSwKKwkJICAgICAmcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYy0+YnNzSWRbMF0sCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZGZfbWFjX2FkZHIpKTsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiB1cCA9ICVkLCB0aWQgPSAlZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLAorCQkgIHBUc3BlY0luZm8tPnRzX2luZm8udXAsIHBUc3BlY0luZm8tPnRzX2luZm8udGlkKTsKKwljZGZfbWVtX3plcm8oJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19tYXNrIC0gMV0sCisJCSAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkc19zZW5kX21iX21lc3NhZ2VfdG9fbWFjKHBNc2cpKSkgeworCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIiVzOiAlZDogc21lX3Fvc19kZWxfdHNfcmVxOlRlc3Q6IHNlbnQgZG93biBhIERFTFRTIHJlcSB0byBQRSIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCS8qIGV2ZW50OiBFVkVOVF9XTEFOX1FPUyAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKwkJcW9zLmV2ZW50SWQgPSBTTUVfUU9TX0RJQUdfREVMVFM7CisJCXFvcy5yZWFzb25Db2RlID0gU01FX1FPU19ESUFHX1VTRVJfUkVRVUVTVEVEOworCQlXTEFOX0hPU1RfRElBR19FVkVOVF9SRVBPUlQoJnFvcywgRVZFTlRfV0xBTl9RT1MpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwl9CisJc21lX3NldF90c3BlY191YXBzZF9tYXNrX3Blcl9zZXNzaW9uKHBNYWMsCisJCQkmcE1zZy0+cmVxLnRzcGVjLnRzaW5mbywKKwkJCXNlc3Npb25JZCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19wcm9jZXNzX2FkZF90c19yc3AoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgICBlV05JX1NNRV9BRERUU19SU1AgY2FtZSBmcm9tIFBFCisKKyAgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICAgXHBhcmFtIHBNc2dCdWYgLSBQb2ludGVyIHRvIHRoZSBtc2cgYnVmZmVyIGNhbWUgZnJvbSBQRS4KKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19hZGRfdHNfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpCit7CisJdHBTaXJBZGR0c1JzcCBwYWRkdHNfcnNwID0gKHRwU2lyQWRkdHNSc3ApIHBNc2dCdWY7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwl1aW50OF90IHNlc3Npb25JZCA9IHBhZGR0c19yc3AtPnNlc3Npb25JZDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJc21lX1Fvc1dtbVVwVHlwZSB1cCA9CisJCShzbWVfUW9zV21tVXBUeXBlKSBwYWRkdHNfcnNwLT5yc3AudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW87CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKwlXTEFOX0hPU1RfRElBR19FVkVOVF9ERUYocW9zLCBob3N0X2V2ZW50X3dsYW5fcW9zX3BheWxvYWRfdHlwZSk7CisjZW5kaWYKKworCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCBmb3IgVVAgJWQiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkLCB1cCk7CisKKwlhYyA9IHNtZV9xb3NfdXBfdG9fYWModXApOworCWlmIChTTUVfUU9TX0VEQ0FfQUNfTUFYID09IGFjKSB7CisJCS8qIGVyciBtc2cgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IGludmFsaWQgQUMgJWQgZnJvbSBVUCAlZCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgYWMsIHVwKTsKKworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworCWlmIChTTUVfUU9TX0hBTkRPRkYgPT0gcEFDSW5mby0+Y3Vycl9zdGF0ZSkgeworCQlzbXNfbG9nKHBNYWMsIExPRzEsCisJCQlGTAorCQkJCSgiQUREVFMgUmVzcG9uc2UgcmVjZWl2ZWQgZm9yIEFDICVkIGluIEhBTkRPRkYgU3RhdGUuLiBEcm9wcGluZyIpLAorCQkJYWMpOworCQlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKyNlbmRpZgorCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IEludm9rZWQgb24gc2Vzc2lvbiAlZCB3aXRoIHJldHVybiBjb2RlICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgcGFkZHRzX3JzcC0+cmMpOworCS8qIG91ciBvdXRzdGFuZGluZyByZXF1ZXN0IGhhcyBiZWVuIHNlcnZpY2VkICovCisJLyogd2UgY2FuIGdvIGludG8gcG93ZXJzYXZlICovCisJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwlpZiAocGFkZHRzX3JzcC0+cmMpIHsKKwkJLyogZXZlbnQ6IEVWRU5UX1dMQU5fUU9TICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCQlxb3MuZXZlbnRJZCA9IFNNRV9RT1NfRElBR19BRERUU19SU1A7CisJCXFvcy5yZWFzb25Db2RlID0gU01FX1FPU19ESUFHX0FERFRTX1JFRlVTRUQ7CisJCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmcW9zLCBFVkVOVF9XTEFOX1FPUyk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCQlzdGF0dXMgPQorCQkJc21lX3Fvc19wcm9jZXNzX2FkZF90c19mYWlsdXJlX3JzcChwTWFjLCBzZXNzaW9uSWQsCisJCQkJCQkJICAgJnBhZGR0c19yc3AtPnJzcCk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0KKwkJCXNtZV9xb3NfcHJvY2Vzc19hZGRfdHNfc3VjY2Vzc19yc3AocE1hYywgc2Vzc2lvbklkLAorCQkJCQkJCSAgICZwYWRkdHNfcnNwLT5yc3ApOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19wcm9jZXNzX2RlbF90c19yc3AoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgICBlV05JX1NNRV9ERUxUU19SU1AgY2FtZSBmcm9tIFBFCisKKyAgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICAgXHBhcmFtIHBNc2dCdWYgLSBQb2ludGVyIHRvIHRoZSBtc2cgYnVmZmVyIGNhbWUgZnJvbSBQRS4KKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19kZWxfdHNfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpCit7CisJdHBTaXJEZWx0c1JzcCBwRGVsdHNSc3AgPSAodHBTaXJEZWx0c1JzcCkgcE1zZ0J1ZjsKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCXVpbnQ4X3Qgc2Vzc2lvbklkID0gcERlbHRzUnNwLT5zZXNzaW9uSWQ7CisJLyogbXNnICovCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IEludm9rZWQgb24gc2Vzc2lvbiAlZCB3aXRoIHJldHVybiBjb2RlICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgcERlbHRzUnNwLT5yYyk7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCS8qIG91ciBvdXRzdGFuZGluZyByZXF1ZXN0IGhhcyBiZWVuIHNlcnZpY2VkICovCisJLyogd2UgY2FuIGdvIGludG8gcG93ZXJzYXZlICovCisJcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkodm9pZClzbWVfcW9zX3Byb2Nlc3NfYnVmZmVyZWRfY21kKHNlc3Npb25JZCk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9xb3NfcHJvY2Vzc19kZWxfdHNfaW5kKCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICAgZVdOSV9TTUVfREVMVFNfSU5EIGNhbWUgZnJvbSBQRQorCisgICBTaW5jZSBpdCdzIGEgREVMVFMgaW5kaWNhdGlvbiBmcm9tIEFQLCB3aWxsIG5vdGlmeSBhbGwgdGhlIGZsb3dzIHJ1bm5pbmcgb24KKyAgIHRoaXMgQUMgYWJvdXQgUW9TIHJlbGVhc2UKKyAgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICAgXHBhcmFtIHBNc2dCdWYgLSBQb2ludGVyIHRvIHRoZSBtc2cgYnVmZmVyIGNhbWUgZnJvbSBQRS4KKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19kZWxfdHNfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpCit7CisJdHBTaXJEZWx0c1JzcCBwZGVsdHNpbmQgPSAodHBTaXJEZWx0c1JzcCkgcE1zZ0J1ZjsKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCXNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisJdWludDhfdCBzZXNzaW9uSWQgPSBwZGVsdHNpbmQtPnNlc3Npb25JZDsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKwlzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5OworCXNtZV9Rb3NXbW1VcFR5cGUgdXAgPQorCQkoc21lX1Fvc1dtbVVwVHlwZSkgcGRlbHRzaW5kLT5yc3AudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW87CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCVdMQU5fSE9TVF9ESUFHX0VWRU5UX0RFRihxb3MsIGhvc3RfZXZlbnRfd2xhbl9xb3NfcGF5bG9hZF90eXBlKTsKKyNlbmRpZgorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBJbnZva2VkIG9uIHNlc3Npb24gJWQgZm9yIFVQICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgdXApOworCWFjID0gc21lX3Fvc191cF90b19hYyh1cCk7CisJaWYgKFNNRV9RT1NfRURDQV9BQ19NQVggPT0gYWMpIHsKKwkJLyogZXJyIG1zZyAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogaW52YWxpZCBBQyAlZCBmcm9tIFVQICVkIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBhYywgdXApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKwlwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKworCWNkZl9tZW1femVybygmc2VhcmNoX2tleSwgc2l6ZW9mKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisJLyogc2V0IHRoZSBrZXkgdHlwZSAmIHRoZSBrZXkgdG8gYmUgc2VhcmNoZWQgaW4gdGhlIEZsb3cgTGlzdCAqLworCXNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKwlzZWFyY2hfa2V5LmluZGV4ID0gU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzI7CisJc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJLyogZmluZCBhbGwgRmxvd3Mgb24gdGhlIHBlcnRpY3VsYXIgQUMgJiBkZWxldGUgdGhlbSwgYWxzbyBzZW5kIEhERCBpbmRpY2F0aW9uICovCisJLyogdGhyb3VnaCB0aGUgY2FsbGJhY2sgaXQgcmVnaXN0ZXJlZCBwZXIgcmVxdWVzdCAqLworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCSAgICAoc21lX3Fvc19maW5kX2FsbF9pbl9mbG93X2xpc3QocE1hYywgc2VhcmNoX2tleSwgc21lX3Fvc19kZWxfdHNfaW5kX2ZucCkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBubyBtYXRjaCBmb3VuZCBmb3IgYWMgPSAlZCIsIF9fZnVuY19fLAorCQkJICBfX0xJTkVfXywgc2VhcmNoX2tleS5rZXkuYWNfdHlwZSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisvKiBldmVudDogRVZFTlRfV0xBTl9RT1MgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisJcW9zLmV2ZW50SWQgPSBTTUVfUU9TX0RJQUdfREVMVFM7CisJcW9zLnJlYXNvbkNvZGUgPSBTTUVfUU9TX0RJQUdfREVMVFNfSU5EX0ZST01fQVA7CisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfUkVQT1JUKCZxb3MsIEVWRU5UX1dMQU5fUU9TKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19wcm9jZXNzX2Fzc29jX2NvbXBsZXRlX2V2KCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICAgU01FX1FPU19DU1JfQVNTT0NfQ09NUExFVEUgZXZlbnQgaW5kaWNhdGlvbiBmcm9tIENTUgorICAgXHBhcmFtIHBFdmVudF9pbmZvIC0gUG9pbnRlciB0byByZWxldmFudCBpbmZvIGZyb20gQ1NSLgorCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3Fvc19wcm9jZXNzX2Fzc29jX2NvbXBsZXRlX2V2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgIHZvaWQgKnBFdmVudF9pbmZvKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCXNtZV9Rb3NFZGNhQWNUeXBlIGFjID0gU01FX1FPU19FRENBX0FDX0JFOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBpbnZva2VkIG9uIHNlc3Npb24gJWQiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkKTsKKwlwU2Vzc2lvbiA9ICZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisJaWYgKCgoU01FX1FPU19JTklUID09IHBTZXNzaW9uLT5hY19pbmZvW1NNRV9RT1NfRURDQV9BQ19CRV0uY3Vycl9zdGF0ZSkKKwkgICAgICYmIChTTUVfUU9TX0lOSVQgPT0KKwkJIHBTZXNzaW9uLT5hY19pbmZvW1NNRV9RT1NfRURDQV9BQ19CS10uY3Vycl9zdGF0ZSkKKwkgICAgICYmIChTTUVfUU9TX0lOSVQgPT0KKwkJIHBTZXNzaW9uLT5hY19pbmZvW1NNRV9RT1NfRURDQV9BQ19WSV0uY3Vycl9zdGF0ZSkKKwkgICAgICYmIChTTUVfUU9TX0lOSVQgPT0KKwkJIHBTZXNzaW9uLT5hY19pbmZvW1NNRV9RT1NfRURDQV9BQ19WT10uY3Vycl9zdGF0ZSkpCisJICAgIHx8IChwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCkpIHsKKwkJLyogZ2V0IHRoZSBhc3NvY2lhdGlvbiBpbmZvICovCisJCWlmICghcEV2ZW50X2luZm8pIHsKKwkJCS8qIGVyciBtc2cgKi8KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiAlZDogcEV2ZW50X2luZm8gaXMgTlVMTCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlpZiAoISgoc21lX1Fvc0Fzc29jSW5mbyAqKSBwRXZlbnRfaW5mbyktPnBCc3NEZXNjKSB7CisJCQkvKiBlcnIgbXNnICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IHBCc3NEZXNjIGlzIE5VTEwiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJaWYgKChwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjKSAmJgorCQkgICAgKGNzcl9pc19ic3NpZF9tYXRjaAorCQkJICAgICAocE1hYywgKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgJnBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MtPmJzc0lkLAorCQkJICAgICAoc3RydWN0IGNkZl9tYWNfYWRkciAqKSAmKCgoc21lX1Fvc0Fzc29jSW5mbyAqKSBwRXZlbnRfaW5mbyktPgorCQkJCQkgICAgIHBCc3NEZXNjLT5ic3NJZCkpKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ICVkOiBhc3NvYyB3aXRoIHRoZSBzYW1lIEJTUywgbm8gdXBkYXRlIG5lZWRlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gc21lX3Fvc19zYXZlX2Fzc29jX2luZm8ocFNlc3Npb24sIHBFdmVudF9pbmZvKTsKKwkJfQorCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiB3cm9uZyBzdGF0ZTogQkUgJWQsIEJLICVkLCBWSSAlZCwgVk8gJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkgIHBTZXNzaW9uLT5hY19pbmZvW1NNRV9RT1NfRURDQV9BQ19CRV0uY3Vycl9zdGF0ZSwKKwkJCSAgcFNlc3Npb24tPmFjX2luZm9bU01FX1FPU19FRENBX0FDX0JLXS5jdXJyX3N0YXRlLAorCQkJICBwU2Vzc2lvbi0+YWNfaW5mb1tTTUVfUU9TX0VEQ0FfQUNfVkldLmN1cnJfc3RhdGUsCisJCQkgIHBTZXNzaW9uLT5hY19pbmZvW1NNRV9RT1NfRURDQV9BQ19WT10uY3Vycl9zdGF0ZSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCS8qIHRoZSBzZXNzaW9uIGlzIGFjdGl2ZSAqLworCXBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlID0gdHJ1ZTsKKwlpZiAocFNlc3Npb24tPmhhbmRvZmZSZXF1ZXN0ZWQpIHsKKwkJcFNlc3Npb24tPmhhbmRvZmZSZXF1ZXN0ZWQgPSBmYWxzZTsKKwkJLyogcmVuZXcgYWxsIGZsb3dzICovCisJCSh2b2lkKXNtZV9xb3NfcHJvY2Vzc19idWZmZXJlZF9jbWQoc2Vzc2lvbklkKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0gZWxzZSB7CisJCWZvciAoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykgeworCQkJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisJCQlzd2l0Y2ggKHBBQ0luZm8tPmN1cnJfc3RhdGUpIHsKKwkJCWNhc2UgU01FX1FPU19JTklUOgorCQkJCXNtZV9xb3Nfc3RhdGVfdHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLAorCQkJCQkJCSBTTUVfUU9TX0xJTktfVVApOworCQkJCWJyZWFrOworCQkJY2FzZSBTTUVfUU9TX0xJTktfVVA6CisJCQljYXNlIFNNRV9RT1NfUkVRVUVTVEVEOgorCQkJY2FzZSBTTUVfUU9TX1FPU19PTjoKKwkJCWNhc2UgU01FX1FPU19IQU5ET0ZGOgorCQkJY2FzZSBTTUVfUU9TX0NMT1NFRDoKKwkJCWRlZmF1bHQ6CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIEFDICVkIGlzIGluIHdyb25nIHN0YXRlICVkIiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgYWMsCisJCQkJCSAgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisJCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19wcm9jZXNzX3JlYXNzb2NfcmVxX2V2KCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICAgU01FX1FPU19DU1JfUkVBU1NPQ19SRVEgZXZlbnQgaW5kaWNhdGlvbiBmcm9tIENTUgorICAgXHBhcmFtIHBFdmVudF9pbmZvIC0gUG9pbnRlciB0byByZWxldmFudCBpbmZvIGZyb20gQ1NSLgorCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3Fvc19wcm9jZXNzX3JlYXNzb2NfcmVxX2V2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgIHZvaWQgKnBFdmVudF9pbmZvKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAocFNlc3Npb24tPmZ0SGFuZG9mZkluUHJvZ3Jlc3MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiJXM6ICVkOiBubyBuZWVkIGZvciBzdGF0ZSB0cmFuc2l0aW9uLCBzaG91bGQgIgorCQkJICAiYWxyZWFkeSBiZSBpbiBoYW5kb2ZmIHN0YXRlIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJaWYgKChwU2Vzc2lvbi0+YWNfaW5mb1swXS5jdXJyX3N0YXRlICE9IFNNRV9RT1NfSEFORE9GRikgfHwKKwkJICAgIChwU2Vzc2lvbi0+YWNfaW5mb1sxXS5jdXJyX3N0YXRlICE9IFNNRV9RT1NfSEFORE9GRikgfHwKKwkJICAgIChwU2Vzc2lvbi0+YWNfaW5mb1syXS5jdXJyX3N0YXRlICE9IFNNRV9RT1NfSEFORE9GRikgfHwKKwkJICAgIChwU2Vzc2lvbi0+YWNfaW5mb1szXS5jdXJyX3N0YXRlICE9IFNNRV9RT1NfSEFORE9GRikpIHsKKwkJCUNERl9BU1NFUlQoMCk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJc21lX3Fvc19wcm9jZXNzX2Z0X3JlYXNzb2NfcmVxX2V2KHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorI2VuZGlmCisKKwlpZiAocFNlc3Npb24tPmhhbmRvZmZSZXF1ZXN0ZWQpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiJXM6ICVkOiBubyBuZWVkIGZvciBzdGF0ZSB0cmFuc2l0aW9uLCBzaG91bGQgIgorCQkJICAiYWxyZWFkeSBiZSBpbiBoYW5kb2ZmIHN0YXRlIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCQlpZiAoKHBTZXNzaW9uLT5hY19pbmZvWzBdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSB8fAorCQkgICAgKHBTZXNzaW9uLT5hY19pbmZvWzFdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSB8fAorCQkgICAgKHBTZXNzaW9uLT5hY19pbmZvWzJdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSB8fAorCQkgICAgKHBTZXNzaW9uLT5hY19pbmZvWzNdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSkgeworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQkvKiBidWZmZXIgdGhlIGV4aXN0aW5nIGZsb3dzIHRvIGJlIHJlbmV3ZWQgYWZ0ZXIgaGFuZG9mZiBpcyBkb25lICovCisJCXNtZV9xb3NfYnVmZmVyX2V4aXN0aW5nX2Zsb3dzKHBNYWMsIHNlc3Npb25JZCk7CisJCS8qIGNsZWFuIHVwIHRoZSBjb250cm9sIGJsb2NrIHBhcnRpYWxseSBmb3IgaGFuZG9mZiAqLworCQlzbWVfcW9zX2NsZWFudXBfY3RybF9ibGtfZm9yX2hhbmRvZmYocE1hYywgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisvKiBUQkg6IEFzc3VtaW5nIGJvdGggaGFuZG9mZiBhbGdvICYgMTFyIHdpbGxuJ3QgYmUgZW5hYmxlZCBhdCB0aGUgc2FtZSB0aW1lICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAocFNlc3Npb24tPmZ0SGFuZG9mZkluUHJvZ3Jlc3MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiJXM6ICVkOiBubyBuZWVkIGZvciBzdGF0ZSB0cmFuc2l0aW9uLCBzaG91bGQgIgorCQkJICAiYWxyZWFkeSBiZSBpbiBoYW5kb2ZmIHN0YXRlIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCQlpZiAoKHBTZXNzaW9uLT5hY19pbmZvWzBdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSB8fAorCQkgICAgKHBTZXNzaW9uLT5hY19pbmZvWzFdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSB8fAorCQkgICAgKHBTZXNzaW9uLT5hY19pbmZvWzJdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSB8fAorCQkgICAgKHBTZXNzaW9uLT5hY19pbmZvWzNdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSkgeworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCisJCXNtZV9xb3NfcHJvY2Vzc19mdF9yZWFzc29jX3JlcV9ldihzZXNzaW9uSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKyNlbmRpZgorCisJZm9yIChhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSB7CisJCXBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworCQlzd2l0Y2ggKHBBQ0luZm8tPmN1cnJfc3RhdGUpIHsKKwkJY2FzZSBTTUVfUU9TX0xJTktfVVA6CisJCWNhc2UgU01FX1FPU19SRVFVRVNURUQ6CisJCWNhc2UgU01FX1FPU19RT1NfT046CisJCQlzbWVfcW9zX3N0YXRlX3RyYW5zaXRpb24oc2Vzc2lvbklkLCBhYywgU01FX1FPU19IQU5ET0ZGKTsKKwkJCWJyZWFrOworCQljYXNlIFNNRV9RT1NfSEFORE9GRjoKKwkJCS8qIFRoaXMgaXMgbm9ybWFsIGJlY2F1c2Ugc21lX3Fvc19yZXF1ZXN0X3JlYXNzb2MgbWF5IGFscmVhZHkgY2hhbmdlIHRoZSBzdGF0ZSAqLworCQkJYnJlYWs7CisJCWNhc2UgU01FX1FPU19DTE9TRUQ6CisJCWNhc2UgU01FX1FPU19JTklUOgorCQlkZWZhdWx0OgorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIEFDICVkIGlzIGluIHdyb25nIHN0YXRlICVkIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkgIHNlc3Npb25JZCwgYWMsIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3Fvc19oYW5kbGVfaGFuZG9mZl9zdGF0ZSgpIC0gdXRpbGl0eSBmdW5jdGlvbiBjYWxsZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9xb3NfcHJvY2Vzc19yZWFzc29jX3N1Y2Nlc3NfZXYKKyAqIEBtYWNfY3R4OiBnbG9iYWwgTUFDIGNvbnRleHQKKyAqIEBxb3Nfc2Vzc2lvbjogUU9TIHNlc3Npb24KKyAqIEBhY19pbmZvOiBBQyBpbmZvcm1hdGlvbgorICogQGFjOiBjdXJyZW50IEFDIGluZGV4CisgKiBAc2Vzc2lvbmlkOiBzZXNzaW9uIGlkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgc21lX3Fvc19wcm9jZXNzX3JlYXNzb2Nfc3VjY2Vzc19ldgorICogdG8gdXBkYXRlIHRoZSBzdGF0ZSBtYWNoaW5lIG9uIHRoZSByZWNlcHRpb24gb2YgcmVhc3NvYyBzdWNjZXNzCisgKiBub3RpZmljYWl0b24KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfcW9zX2hhbmRsZV9oYW5kb2ZmX3N0YXRlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcW9zX3Nlc3Npb24sIHNtZV9Rb3NBQ0luZm8gKmFjX2luZm8sCisJCXNtZV9Rb3NFZGNhQWNUeXBlIGFjLCB1aW50OF90IHNlc3Npb25pZCkKKworeworCXNtZV9Rb3NTZWFyY2hJbmZvIHNlYXJjaF9rZXk7CisJc21lX1Fvc1NlYXJjaEluZm8gc2VhcmNoX2tleTE7CisJc21lX1Fvc0VkY2FBY1R5cGUgYWNfaW5kZXg7CisJdExpc3RFbGVtICpsaXN0X2VsdCA9IE5VTEw7CisJc21lX1Fvc0Zsb3dJbmZvRW50cnkgKmZsb3dfaW5mbyA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKworCS8qIHJldHVybiB0byBvdXIgcHJldmlvdXMgc3RhdGUgKi8KKwlzbWVfcW9zX3N0YXRlX3RyYW5zaXRpb24oc2Vzc2lvbmlkLCBhYywgYWNfaW5mby0+cHJldl9zdGF0ZSk7CisJLyogZm9yIHdoaWNoIGFjIEFQU0QgKGhlbmNlIHRoZSByZWFzc29jKSBpcyByZXF1ZXN0ZWQgKi8KKwlpZiAoIWFjX2luZm8tPnJlYXNzb2NfcGVuZGluZykKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworCS8qCisJICogdXBkYXRlIHRoZSBhcHNkIG1hc2sgaW4gQ0IgLSBtYWtlIHN1cmUgdG8gdGFrZSBjYXJlIG9mIHRoZQorCSAqIGNhc2Ugd2hlcmUgd2UgYXJlIHJlc2V0dGluZyB0aGUgYml0IGluIGFwc2RfbWFzaworCSAqLworCWlmIChhY19pbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLnRzX2luZm8ucHNiKQorCQlxb3Nfc2Vzc2lvbi0+YXBzZE1hc2sgfD0gMSA8PCAoU01FX1FPU19FRENBX0FDX1ZPIC0gYWMpOworCWVsc2UKKwkJcW9zX3Nlc3Npb24tPmFwc2RNYXNrICY9IH4oMSA8PCAoU01FX1FPU19FRENBX0FDX1ZPIC0gYWMpKTsKKworCWFjX2luZm8tPnJlYXNzb2NfcGVuZGluZyA9IGZhbHNlOworCS8qCisJICogZHVyaW5nIHNldHVwIGl0IGdldHMgc2V0IGFzIGFkZHRzICYgcmVhc3NvYyBib3RoIGdldHMgYQorCSAqIHBlbmRpbmcgZmxhZyBhY19pbmZvLT50c3BlY19wZW5kaW5nID0gMDsKKwkgKi8KKwlzbWVfcW9zX3N0YXRlX3RyYW5zaXRpb24oc2Vzc2lvbmlkLCBhYywgU01FX1FPU19RT1NfT04pOworCS8qIG5vdGlmeSBIREQgd2l0aCBuZXcgU2VydmljZSBJbnRlcnZhbCAqLworCWFjX2luZm8tPmN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdID0KKwkJYWNfaW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXTsKKwljZGZfbWVtX3plcm8oJnNlYXJjaF9rZXksIHNpemVvZihzbWVfUW9zU2VhcmNoSW5mbykpOworCS8qIHNldCB0aGUga2V5IHR5cGUgJiB0aGUga2V5IHRvIGJlIHNlYXJjaGVkIGluIHRoZSBGbG93IExpc3QgKi8KKwlzZWFyY2hfa2V5LmtleS5hY190eXBlID0gYWM7CisJc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8yOworCXNlYXJjaF9rZXkuc2Vzc2lvbklkID0gc2Vzc2lvbmlkOworCS8qIG5vdGlmeSBQTUMgdGhhdCByZWFzc29jIGlzIGRvbmUgZm9yIEFQU0Qgb24gY2VydGFpbiBBQz8/ICovCisKKwljZGZfbWVtX3plcm8oJnNlYXJjaF9rZXkxLCBzaXplb2Yoc21lX1Fvc1NlYXJjaEluZm8pKTsKKwkvKiBzZXQgdGhlIGhvUmVuZXdhbCBmaWVsZCBpbiBjb250cm9sIGJsb2NrIGlmIG5lZWRlZCAqLworCXNlYXJjaF9rZXkxLmluZGV4ID0gU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzM7CisJc2VhcmNoX2tleTEua2V5LnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1NFVFVQOworCXNlYXJjaF9rZXkxLnNlc3Npb25JZCA9IHNlc3Npb25pZDsKKwlmb3IgKGFjX2luZGV4ID0gU01FX1FPU19FRENBX0FDX0JFOyBhY19pbmRleCA8IFNNRV9RT1NfRURDQV9BQ19NQVg7CisJICAgICBhY19pbmRleCsrKSB7CisJCWxpc3RfZWx0ID0gc21lX3Fvc19maW5kX2luX2Zsb3dfbGlzdChzZWFyY2hfa2V5MSk7CisJCWlmIChsaXN0X2VsdCkgeworCQkJZmxvd19pbmZvID0gR0VUX0JBU0VfQUREUihsaXN0X2VsdCwKKwkJCQkJc21lX1Fvc0Zsb3dJbmZvRW50cnksIGxpbmspOworCQkJaWYgKGZsb3dfaW5mby0+YWNfdHlwZSA9PSBhYykgeworCQkJICAgIGFjX2luZm8tPmhvUmVuZXdhbCA9IGZsb3dfaW5mby0+aG9SZW5ld2FsOworCQkJICAgIGJyZWFrOworCQkJfQorCQl9CisJfQorCS8qCisJICogbm90aWZ5IEhERCB0aGUgc3VjY2VzcyBmb3IgdGhlIHJlcXVlc3RlZCBmbG93IG5vdGlmeSBhbGwgdGhlCisJICogb3RoZXIgZmxvd3MgcnVubmluZyBvbiB0aGUgQUMgdGhhdCBRb1MgZ290IG1vZGlmaWVkCisJICovCisJc3RhdHVzID0gc21lX3Fvc19maW5kX2FsbF9pbl9mbG93X2xpc3QobWFjX2N0eCwgc2VhcmNoX2tleSwKKwkJCXNtZV9xb3NfcmVhc3NvY19zdWNjZXNzX2V2X2ZucCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIm5vIG1hdGNoIGZvdW5kIGZvciBhYyA9ICVkIiksCisJCQkgIHNlYXJjaF9rZXkua2V5LmFjX3R5cGUpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWFjX2luZm8tPmhvUmVuZXdhbCA9IGZhbHNlOworCWNkZl9tZW1femVybygmYWNfaW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXSwKKwkJICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcW9zX3Byb2Nlc3NfcmVhc3NvY19zdWNjZXNzX2V2KCkgLSBwcm9jZXNzIFNNRV9RT1NfQ1NSX1JFQVNTT0NfQ09NUExFVEUKKyAqCisgKiBAbWFjX2N0eDogZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAc2Vzc2lvbmlkOiBzZXNzaW9uIElECisgKiBAZXZlbnRfaW5mbzogZXZlbnQgYnVmZmVyIGZyb20gQ1NSCisgKgorICogRnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgU01FX1FPU19DU1JfUkVBU1NPQ19DT01QTEVURSBldmVudCBpbmRpY2F0aW9uCisgKiBmcm9tIENTUgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19yZWFzc29jX3N1Y2Nlc3NfZXYodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQl1aW50OF90IHNlc3Npb25pZCwgdm9pZCAqZXZlbnRfaW5mbykKK3sKKworCXRDc3JSb2FtU2Vzc2lvbiAqY3NyX3JvYW1fc2Vzc2lvbiA9IE5VTEw7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpxb3Nfc2Vzc2lvbjsKKwlzbWVfUW9zQUNJbmZvICphY19pbmZvOworCXNtZV9Rb3NFZGNhQWNUeXBlIGFjOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgRkwoImludm9rZWQgb24gc2Vzc2lvbiAlZCIpLCBzZXNzaW9uaWQpOworCisJaWYgKENTUl9ST0FNX1NFU1NJT05fTUFYIDw9IHNlc3Npb25pZCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoImludm9rZWQgb24gc2Vzc2lvbiAlZCIpLCBzZXNzaW9uaWQpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWNzcl9yb2FtX3Nlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04obWFjX2N0eCwgc2Vzc2lvbmlkKTsKKworCXFvc19zZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbmlkXTsKKwkvKgorCSAqIG91ciBwZW5kaW5nIHJlYXNzb2NpYXRpb24gaGFzIGNvbXBsZXRlZAorCSAqIHdlIGNhbiBhbGxvdyBwb3dlcnNhdmUKKwkgKi8KKwlxb3Nfc2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCisJLyogZ2V0IHRoZSBhc3NvY2lhdGlvbiBpbmZvICovCisJaWYgKCFldmVudF9pbmZvKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiZXZlbnRfaW5mbyBpcyBOVUxMIikpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmICghKChzbWVfUW9zQXNzb2NJbmZvICopIGV2ZW50X2luZm8pLT5wQnNzRGVzYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInBCc3NEZXNjIGlzIE5VTEwiKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXN0YXR1cyA9IHNtZV9xb3Nfc2F2ZV9hc3NvY19pbmZvKHFvc19zZXNzaW9uLCBldmVudF9pbmZvKTsKKwlpZiAoc3RhdHVzKQorCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInNtZV9xb3Nfc2F2ZV9hc3NvY19pbmZvKCkgZmFpbGVkIikpOworCisJLyoKKwkgKiBBc3N1bWluZyBib3RoIGhhbmRvZmYgYWxnbyAmIDExciB3aWxsbid0IGJlIGVuYWJsZWQKKwkgKiBhdCB0aGUgc2FtZSB0aW1lCisJICovCisJaWYgKHFvc19zZXNzaW9uLT5oYW5kb2ZmUmVxdWVzdGVkKSB7CisJCXFvc19zZXNzaW9uLT5oYW5kb2ZmUmVxdWVzdGVkID0gZmFsc2U7CisJCS8qIHJlbmV3IGFsbCBmbG93cyAqLworCQkodm9pZClzbWVfcW9zX3Byb2Nlc3NfYnVmZmVyZWRfY21kKHNlc3Npb25pZCk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJaWYgKHFvc19zZXNzaW9uLT5mdEhhbmRvZmZJblByb2dyZXNzKSB7CisJCWlmIChjc3Jfcm9hbV9pczExcl9hc3NvYyhtYWNfY3R4LCBzZXNzaW9uaWQpKSB7CisJCQlpZiAoY3NyX3JvYW1fc2Vzc2lvbiAmJgorCQkJICAgIGNzcl9yb2FtX3Nlc3Npb24tPmNvbm5lY3RlZEluZm8ublJJQ1JzcExlbmd0aCkgeworCQkJCXN0YXR1cyA9IHNtZV9xb3NfcHJvY2Vzc19mdF9yZWFzc29jX3JzcF9ldigKKwkJCQkJCW1hY19jdHgsIHNlc3Npb25pZCwgZXZlbnRfaW5mbyk7CisJCQl9CisJCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJCS8qCisJCSAqIElmIEVTRSBhc3NvY2lhdGlvbiBjaGVjayBmb3IgVFNQRUMgSUVzIGluIHRoZQorCQkgKiByZWFzc29jIHJzcCBmcmFtZQorCQkgKi8KKwkJaWYgKGNzcl9yb2FtX2lzX2VzZV9hc3NvYyhtYWNfY3R4LCBzZXNzaW9uaWQpKSB7CisJCQlpZiAoY3NyX3JvYW1fc2Vzc2lvbiAmJgorCQkJICAgIGNzcl9yb2FtX3Nlc3Npb24tPmNvbm5lY3RlZEluZm8ublRzcGVjSWVMZW5ndGgpIHsKKwkJCQlzdGF0dXMgPSBzbWVfcW9zX2VzZV9wcm9jZXNzX3JlYXNzb2NfdHNwZWNfcnNwKAorCQkJCQkJbWFjX2N0eCwgc2Vzc2lvbmlkLCBldmVudF9pbmZvKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCXFvc19zZXNzaW9uLT5mdEhhbmRvZmZJblByb2dyZXNzID0gZmFsc2U7CisJCXFvc19zZXNzaW9uLT5oYW5kb2ZmUmVxdWVzdGVkID0gZmFsc2U7CisJCXJldHVybiBzdGF0dXM7CisJfQorI2VuZGlmCisKKwlxb3Nfc2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSA9IHRydWU7CisJZm9yIChhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSB7CisJCWFjX2luZm8gPSAmcW9zX3Nlc3Npb24tPmFjX2luZm9bYWNdOworCQlzd2l0Y2ggKGFjX2luZm8tPmN1cnJfc3RhdGUpIHsKKwkJY2FzZSBTTUVfUU9TX0hBTkRPRkY6CisJCQlzdGF0dXMgPSBzbWVfcW9zX2hhbmRsZV9oYW5kb2ZmX3N0YXRlKG1hY19jdHgsCisJCQkJCXFvc19zZXNzaW9uLCBhY19pbmZvLCBhYywgc2Vzc2lvbmlkKTsKKwkJCWJyZWFrOworCQljYXNlIFNNRV9RT1NfSU5JVDoKKwkJY2FzZSBTTUVfUU9TX0NMT1NFRDoKKwkJCS8qIE5PUCAqLworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCWNhc2UgU01FX1FPU19MSU5LX1VQOgorCQljYXNlIFNNRV9RT1NfUkVRVUVTVEVEOgorCQljYXNlIFNNRV9RT1NfUU9TX09OOgorCQlkZWZhdWx0OgorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTCgic2Vzc2lvbiAlZCBBQyAlZCBpcyBpbiB3cm9uZyBzdGF0ZSAlZCIpLAorCQkJCSAgc2Vzc2lvbmlkLCBhYywgYWNfaW5mby0+Y3Vycl9zdGF0ZSk7CisJCQlDREZfQVNTRVJUKDApOworCQkJYnJlYWs7CisJCX0KKwl9CisJKHZvaWQpc21lX3Fvc19wcm9jZXNzX2J1ZmZlcmVkX2NtZChzZXNzaW9uaWQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfcW9zX3Byb2Nlc3NfcmVhc3NvY19mYWlsdXJlX2V2KCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICAgU01FX1FPU19DU1JfUkVBU1NPQ19GQUlMVVJFIGV2ZW50IGluZGljYXRpb24gZnJvbSBDU1IKKyAgIFxwYXJhbSBwRXZlbnRfaW5mbyAtIFBvaW50ZXIgdG8gcmVsZXZhbnQgaW5mbyBmcm9tIENTUi4KKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19yZWFzc29jX2ZhaWx1cmVfZXYodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQsIHZvaWQgKnBFdmVudF9pbmZvKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCS8qIG91ciBwZW5kaW5nIHJlYXNzb2NpYXRpb24gaGFzIGNvbXBsZXRlZCAqLworCS8qIHdlIGNhbiBhbGxvdyBwb3dlcnNhdmUgKi8KKwlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCWZvciAoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykgeworCQlwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKwkJc3dpdGNoIChwQUNJbmZvLT5jdXJyX3N0YXRlKSB7CisJCWNhc2UgU01FX1FPU19IQU5ET0ZGOgorCQkJc21lX3Fvc19zdGF0ZV90cmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfSU5JVCk7CisJCQlpZiAocEFDSW5mby0+cmVhc3NvY19wZW5kaW5nKSB7CisJCQkJcEFDSW5mby0+cmVhc3NvY19wZW5kaW5nID0gZmFsc2U7CisJCQl9CisJCQljZGZfbWVtX3plcm8oJnBBQ0luZm8tPgorCQkJCSAgICAgY3Vycl9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0sCisJCQkJICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworCQkJY2RmX21lbV96ZXJvKCZwQUNJbmZvLT4KKwkJCQkgICAgIHJlcXVlc3RlZF9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0sCisJCQkJICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworCQkJY2RmX21lbV96ZXJvKCZwQUNJbmZvLT4KKwkJCQkgICAgIGN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzFdLAorCQkJCSAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKwkJCWNkZl9tZW1femVybygmcEFDSW5mby0+CisJCQkJICAgICByZXF1ZXN0ZWRfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzFdLAorCQkJCSAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKwkJCXBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzID0gU01FX1FPU19UU1BFQ19NQVNLX0NMRUFSOworCQkJcEFDSW5mby0+dHNwZWNfcGVuZGluZyA9IDA7CisJCQlwQUNJbmZvLT5udW1fZmxvd3NbU01FX1FPU19UU1BFQ19JTkRFWF8wXSA9IDA7CisJCQlwQUNJbmZvLT5udW1fZmxvd3NbU01FX1FPU19UU1BFQ19JTkRFWF8xXSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBTTUVfUU9TX0lOSVQ6CisJCWNhc2UgU01FX1FPU19DTE9TRUQ6CisJCQkvKiBOT1AgKi8KKwkJCWJyZWFrOworCQljYXNlIFNNRV9RT1NfTElOS19VUDoKKwkJY2FzZSBTTUVfUU9TX1JFUVVFU1RFRDoKKwkJY2FzZSBTTUVfUU9TX1FPU19PTjoKKwkJZGVmYXVsdDoKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBBQyAlZCBpcyBpbiB3cm9uZyBzdGF0ZSAlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJICBzZXNzaW9uSWQsIGFjLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKwkJCUNERl9BU1NFUlQoMCk7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBuZWVkIHRvIGNsZWFuIHVwIGZsb3dzICovCisJc21lX3Fvc19kZWxldGVfZXhpc3RpbmdfZmxvd3MocE1hYywgc2Vzc2lvbklkKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19wcm9jZXNzX2hhbmRvZmZfYXNzb2NfcmVxX2V2KCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICAgU01FX1FPU19DU1JfSEFORE9GRl9BU1NPQ19SRVEgZXZlbnQgaW5kaWNhdGlvbiBmcm9tIENTUgorICAgXHBhcmFtIHBFdmVudF9pbmZvIC0gUG9pbnRlciB0byByZWxldmFudCBpbmZvIGZyb20gQ1NSLgorCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3Fvc19wcm9jZXNzX2hhbmRvZmZfYXNzb2NfcmVxX2V2KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQl1aW50OF90IHNlc3Npb25JZCwgdm9pZCAqcEV2ZW50X2luZm8pCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwlzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworCXVpbnQ4X3QgYWM7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKwlmb3IgKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspIHsKKwkJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisJCXN3aXRjaCAocEFDSW5mby0+Y3Vycl9zdGF0ZSkgeworCQljYXNlIFNNRV9RT1NfTElOS19VUDoKKwkJY2FzZSBTTUVfUU9TX1JFUVVFU1RFRDoKKwkJY2FzZSBTTUVfUU9TX1FPU19PTjoKKwkJCXNtZV9xb3Nfc3RhdGVfdHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLCBTTUVfUU9TX0hBTkRPRkYpOworCQkJYnJlYWs7CisJCWNhc2UgU01FX1FPU19IQU5ET0ZGOgorCQkJLyogcHJpbnQgZXJyb3IgbXNnICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJCWlmIChwU2Vzc2lvbi0+ZnRIYW5kb2ZmSW5Qcm9ncmVzcykgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkJICAiJXM6ICVkOiBTTUVfUU9TX0NTUl9IQU5ET0ZGX0FTU09DX1JFUSByZWNlaXZlZCBpbiAiCisJCQkJCSAgIlNNRV9RT1NfSEFORE9GRiBzdGF0ZSB3aXRoIEZUIGluIHByb2dyZXNzIiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisKKwkJY2FzZSBTTUVfUU9TX0NMT1NFRDoKKwkJY2FzZSBTTUVfUU9TX0lOSVQ6CisJCWRlZmF1bHQ6CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgQUMgJWQgaXMgaW4gd3Jvbmcgc3RhdGUgJWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLAorCQkJCSAgc2Vzc2lvbklkLCBhYywgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisJCQlDREZfQVNTRVJUKDApOworCQkJYnJlYWs7CisJCX0KKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmIChjc3Jfcm9hbV9pczExcl9hc3NvYyhwTWFjLCBzZXNzaW9uSWQpKSB7CisJCXBTZXNzaW9uLT5mdEhhbmRvZmZJblByb2dyZXNzID0gdHJ1ZTsKKwl9CisjZW5kaWYKKwkvKiBJZiBGVCBoYW5kb2ZmIGlzIGluIHByb2dyZXNzLCBsZWdhY3kgaGFuZG9mZiBuZWVkIG5vdCBiZSBlbmFibGVkICovCisJaWYgKCFwU2Vzc2lvbi0+ZnRIYW5kb2ZmSW5Qcm9ncmVzcykgeworCQlwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCA9IHRydWU7CisJfQorCS8qIHRoaXMgc2Vzc2lvbiBubyBsb25nZXIgbmVlZHMgVUFQU0QgKi8KKwlwU2Vzc2lvbi0+YXBzZE1hc2sgPSAwOworCS8qIGRvIGFueSBzZXNzaW9ucyBzdGlsbCByZXF1aXJlIFVBUFNEPyAqLworCXNtZV9wc191YXBzZF9kaXNhYmxlKHBNYWMsIHNlc3Npb25JZCk7CisJcFNlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCA9IGZhbHNlOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfcW9zX3Byb2Nlc3NfaGFuZG9mZl9zdWNjZXNzX2V2KCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICAgU01FX1FPU19DU1JfSEFORE9GRl9DT01QTEVURSBldmVudCBpbmRpY2F0aW9uIGZyb20gQ1NSCisgICBccGFyYW0gcEV2ZW50X2luZm8gLSBQb2ludGVyIHRvIHJlbGV2YW50IGluZm8gZnJvbSBDU1IuCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfaGFuZG9mZl9zdWNjZXNzX2V2KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLCB2b2lkICpwRXZlbnRfaW5mbykKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCXNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisJdWludDhfdCBhYzsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBpbnZva2VkIG9uIHNlc3Npb24gJWQiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkKTsKKwlwU2Vzc2lvbiA9ICZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisJLyogZ28gYmFjayB0byBvcmlnaW5hbCBzdGF0ZSBiZWZvcmUgaGFuZG9mZiAqLworCWZvciAoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykgeworCQlwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKwkJc3dpdGNoIChwQUNJbmZvLT5jdXJyX3N0YXRlKSB7CisJCWNhc2UgU01FX1FPU19IQU5ET0ZGOgorCQkJc21lX3Fvc19zdGF0ZV90cmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsCisJCQkJCQkgcEFDSW5mby0+cHJldl9zdGF0ZSk7CisJCQkvKiB3ZSB3aWxsIHJldHJ5IGZvciB0aGUgcmVxdWVzdGVkIGZsb3cocykgd2l0aCB0aGUgbmV3IEFQICovCisJCQlpZiAoU01FX1FPU19SRVFVRVNURUQgPT0gcEFDSW5mby0+Y3Vycl9zdGF0ZSkgeworCQkJCXBBQ0luZm8tPmN1cnJfc3RhdGUgPSBTTUVfUU9TX0xJTktfVVA7CisJCQl9CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJLyogRlQgbG9naWMsIGhhcyBhbHJlYWR5IG1vdmVkIGl0IHRvIFFPU19SRVFVRVNURUQgc3RhdGUgZHVyaW5nIHRoZSAqLworCQkvKiByZWFzc29jIHJlcXVlc3QgZXZlbnQsIHdoaWNoIHdvdWxkIGluY2x1ZGUgdGhlIFFvcyAoVFNQRUMpIHBhcmFtcyAqLworCQkvKiBpbiB0aGUgcmVhc3NvYyByZXEgZnJhbWUgKi8KKwkJY2FzZSBTTUVfUU9TX1JFUVVFU1RFRDoKKwkJCWJyZWFrOworCQljYXNlIFNNRV9RT1NfSU5JVDoKKwkJY2FzZSBTTUVfUU9TX0NMT1NFRDoKKwkJY2FzZSBTTUVfUU9TX0xJTktfVVA6CisJCWNhc2UgU01FX1FPU19RT1NfT046CisJCWRlZmF1bHQ6CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qIEluIGNhc2Ugb2YgMTFyIC0gUklDLCB3ZSByZXF1ZXN0IFFvUyBhbmQgSGFuZC1vZmYgYXQgdGhlIHNhbWUgdGltZSBoZW5jZSB0aGUKKyAgIHN0YXRlIG1heSBiZSBTTUVfUU9TX1JFUVVFU1RFRCAqLworCQkJaWYgKHBTZXNzaW9uLT5mdEhhbmRvZmZJblByb2dyZXNzKQorCQkJCWJyZWFrOworI2VuZGlmCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgQUMgJWQgaXMgaW4gd3Jvbmcgc3RhdGUgJWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLAorCQkJCSAgc2Vzc2lvbklkLCBhYywgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisJCQlDREZfQVNTRVJUKDApOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9xb3NfcHJvY2Vzc19oYW5kb2ZmX2ZhaWx1cmVfZXYoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgICBTTUVfUU9TX0NTUl9IQU5ET0ZGX0ZBSUxVUkUgZXZlbnQgaW5kaWNhdGlvbiBmcm9tIENTUgorICAgXHBhcmFtIHBFdmVudF9pbmZvIC0gUG9pbnRlciB0byByZWxldmFudCBpbmZvIGZyb20gQ1NSLgorCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3Fvc19wcm9jZXNzX2hhbmRvZmZfZmFpbHVyZV9ldih0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgICAgICB1aW50OF90IHNlc3Npb25JZCwgdm9pZCAqcEV2ZW50X2luZm8pCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwlzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworCXVpbnQ4X3QgYWM7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKwlmb3IgKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspIHsKKwkJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisJCXN3aXRjaCAocEFDSW5mby0+Y3Vycl9zdGF0ZSkgeworCQljYXNlIFNNRV9RT1NfSEFORE9GRjoKKwkJCXNtZV9xb3Nfc3RhdGVfdHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLCBTTUVfUU9TX0lOSVQpOworCQkJLyogbmVlZCB0byBjbGVhbiB1cCBmbG93czogVE9ETyAqLworCQkJY2RmX21lbV96ZXJvKCZwQUNJbmZvLT4KKwkJCQkgICAgIGN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLAorCQkJCSAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKwkJCWNkZl9tZW1femVybygmcEFDSW5mby0+CisJCQkJICAgICByZXF1ZXN0ZWRfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLAorCQkJCSAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKwkJCWNkZl9tZW1femVybygmcEFDSW5mby0+CisJCQkJICAgICBjdXJyX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8xXSwKKwkJCQkgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisJCQljZGZfbWVtX3plcm8oJnBBQ0luZm8tPgorCQkJCSAgICAgcmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8xXSwKKwkJCQkgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisJCQlwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyA9IFNNRV9RT1NfVFNQRUNfTUFTS19DTEVBUjsKKwkJCXBBQ0luZm8tPnRzcGVjX3BlbmRpbmcgPSAwOworCQkJcEFDSW5mby0+bnVtX2Zsb3dzW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0gPSAwOworCQkJcEFDSW5mby0+bnVtX2Zsb3dzW1NNRV9RT1NfVFNQRUNfSU5ERVhfMV0gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgU01FX1FPU19JTklUOgorCQljYXNlIFNNRV9RT1NfQ0xPU0VEOgorCQljYXNlIFNNRV9RT1NfTElOS19VUDoKKwkJY2FzZSBTTUVfUU9TX1JFUVVFU1RFRDoKKwkJY2FzZSBTTUVfUU9TX1FPU19PTjoKKwkJZGVmYXVsdDoKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBBQyAlZCBpcyBpbiB3cm9uZyBzdGF0ZSAlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJICBzZXNzaW9uSWQsIGFjLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKwkJCUNERl9BU1NFUlQoMCk7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBubyBsb25nZXIgaW4gaGFuZG9mZiAqLworCXBTZXNzaW9uLT5oYW5kb2ZmUmVxdWVzdGVkID0gZmFsc2U7CisJLyogY2xlYW4gdXAgdGhlIGFzc29jIGluZm8gKi8KKwlpZiAocFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYykgeworCQljZGZfbWVtX2ZyZWUocFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYyk7CisJCXBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MgPSBOVUxMOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19wcm9jZXNzX2Rpc2Nvbm5lY3RfZXYoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgICBTTUVfUU9TX0NTUl9ESVNDT05ORUNUX1JFUSBvciAgU01FX1FPU19DU1JfRElTQ09OTkVDVF9JTkQgZXZlbnQgaW5kaWNhdGlvbgorICAgZnJvbSBDU1IKKyAgIFxwYXJhbSBwRXZlbnRfaW5mbyAtIFBvaW50ZXIgdG8gcmVsZXZhbnQgaW5mbyBmcm9tIENTUi4KKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19kaXNjb25uZWN0X2V2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgdm9pZCAqcEV2ZW50X2luZm8pCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCWlmICgocFNlc3Npb24tPmhhbmRvZmZSZXF1ZXN0ZWQpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qIEluIGNhc2Ugb2YgMTFyIC0gUklDLCB3ZSByZXF1ZXN0IFFvUyBhbmQgSGFuZC1vZmYgYXQgdGhlIHNhbWUgdGltZSBoZW5jZSB0aGUKKyAgIHN0YXRlIG1heSBiZSBTTUVfUU9TX1JFUVVFU1RFRCAqLworCSAgICAmJiAhcFNlc3Npb24tPmZ0SGFuZG9mZkluUHJvZ3Jlc3MKKyNlbmRpZgorCSAgICApIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiJXM6ICVkOiBubyBuZWVkIGZvciBzdGF0ZSB0cmFuc2l0aW9uLCBzaG91bGQgIgorCQkJICAiYWxyZWFkeSBiZSBpbiBoYW5kb2ZmIHN0YXRlIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJaWYgKChwU2Vzc2lvbi0+YWNfaW5mb1swXS5jdXJyX3N0YXRlICE9IFNNRV9RT1NfSEFORE9GRikgfHwKKwkJICAgIChwU2Vzc2lvbi0+YWNfaW5mb1sxXS5jdXJyX3N0YXRlICE9IFNNRV9RT1NfSEFORE9GRikgfHwKKwkJICAgIChwU2Vzc2lvbi0+YWNfaW5mb1syXS5jdXJyX3N0YXRlICE9IFNNRV9RT1NfSEFORE9GRikgfHwKKwkJICAgIChwU2Vzc2lvbi0+YWNfaW5mb1szXS5jdXJyX3N0YXRlICE9IFNNRV9RT1NfSEFORE9GRikpIHsKKwkJCUNERl9BU1NFUlQoMCk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQl9CisKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJc21lX3Fvc19pbml0X2FfY3MocE1hYywgc2Vzc2lvbklkKTsKKwkvKiB0aGlzIHNlc3Npb24gZG9lc24ndCByZXF1aXJlIFVBUFNEICovCisJcFNlc3Npb24tPmFwc2RNYXNrID0gMDsKKworCXNtZV9wc191YXBzZF9kaXNhYmxlKHBNYWMsIHNlc3Npb25JZCk7CisKKwlwU2Vzc2lvbi0+dWFwc2RBbHJlYWR5UmVxdWVzdGVkID0gZmFsc2U7CisJcFNlc3Npb24tPmhhbmRvZmZSZXF1ZXN0ZWQgPSBmYWxzZTsKKwlwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCXBTZXNzaW9uLT5yb2FtSUQgPSAwOworCS8qIG5lZWQgdG8gY2xlYW4gdXAgYnVmZmVyZWQgcmVxICovCisJc21lX3Fvc19kZWxldGVfYnVmZmVyZWRfcmVxdWVzdHMocE1hYywgc2Vzc2lvbklkKTsKKwkvKiBuZWVkIHRvIGNsZWFuIHVwIGZsb3dzICovCisJc21lX3Fvc19kZWxldGVfZXhpc3RpbmdfZmxvd3MocE1hYywgc2Vzc2lvbklkKTsKKwkvKiBjbGVhbiB1cCB0aGUgYXNzb2MgaW5mbyAqLworCWlmIChwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjKSB7CisJCWNkZl9tZW1fZnJlZShwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjKTsKKwkJcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYyA9IE5VTEw7CisJfQorCXNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXS5zZXNzaW9uQWN0aXZlID0gZmFsc2U7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9xb3NfcHJvY2Vzc19qb2luX3JlcV9ldigpIC0gRnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUKKyAgIFNNRV9RT1NfQ1NSX0pPSU5fUkVRIGV2ZW50IGluZGljYXRpb24gZnJvbSBDU1IKKyAgIFxwYXJhbSBwRXZlbnRfaW5mbyAtIFBvaW50ZXIgdG8gcmVsZXZhbnQgaW5mbyBmcm9tIENTUi4KKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19qb2luX3JlcV9ldih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkgICAgICAgdm9pZCAqcEV2ZW50X2luZm8pCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCWlmIChwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogJWQ6IG5vIG5lZWQgZm9yIHN0YXRlIHRyYW5zaXRpb24sIHNob3VsZCAiCisJCQkgICJhbHJlYWR5IGJlIGluIGhhbmRvZmYgc3RhdGUiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlpZiAoKHBTZXNzaW9uLT5hY19pbmZvWzBdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSB8fAorCQkgICAgKHBTZXNzaW9uLT5hY19pbmZvWzFdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSB8fAorCQkgICAgKHBTZXNzaW9uLT5hY19pbmZvWzJdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSB8fAorCQkgICAgKHBTZXNzaW9uLT5hY19pbmZvWzNdLmN1cnJfc3RhdGUgIT0gU01FX1FPU19IQU5ET0ZGKSkgeworCQkJLyoganVzdCBwcmludCAqLworCQkJQ0RGX0FTU0VSVCgwKTsKKwkJfQorCQkvKiBidWZmZXIgdGhlIGV4aXN0aW5nIGZsb3dzIHRvIGJlIHJlbmV3ZWQgYWZ0ZXIgaGFuZG9mZiBpcyBkb25lICovCisJCXNtZV9xb3NfYnVmZmVyX2V4aXN0aW5nX2Zsb3dzKHBNYWMsIHNlc3Npb25JZCk7CisJCS8qIGNsZWFuIHVwIHRoZSBjb250cm9sIGJsb2NrIHBhcnRpYWxseSBmb3IgaGFuZG9mZiAqLworCQlzbWVfcW9zX2NsZWFudXBfY3RybF9ibGtfZm9yX2hhbmRvZmYocE1hYywgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlmb3IgKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspIHsKKwkJc21lX3Fvc19zdGF0ZV90cmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfSU5JVCk7CisJfQorCS8qIGNsZWFuIHVwIHRoZSBhc3NvYyBpbmZvIGlmIGFscmVhZHkgc2V0ICovCisJaWYgKHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MpIHsKKwkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MpOworCQlwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjID0gTlVMTDsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKioKKyAqIHNtZV9xb3NfcHJvY2Vzc19wcmVhdXRoX3N1Y2Nlc3NfaW5kKCkgLSBwcm9jZXNzIHByZWF1dGggc3VjY2VzcyBpbmRpY2F0aW9uCisgKiBAbWFjX2N0eDogZ2xvYmFsIE1BQyBjb250ZXh0CisgKiBAc2Vzc2lvbmlkOiBzZXNzaW9uIElECisgKiBAZXZlbnRfaW5mbzogZXZlbnQgYnVmZmVyCisgKgorICogRnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgU01FX1FPU19DU1JfUFJFQVVUSF9TVUNDRVNTX0lORCBldmVudCBpbmRpY2F0aW9uCisgKiBmcm9tIENTUgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19wcmVhdXRoX3N1Y2Nlc3NfaW5kKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJdWludDhfdCBzZXNzaW9uaWQsIHZvaWQgKmV2ZW50X2luZm8pCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpxb3Nfc2Vzc2lvbjsKKwl0Q3NyUm9hbVNlc3Npb24gKnNtZV9zZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKG1hY19jdHgsIHNlc3Npb25pZCk7CisJc21lX1Fvc0FDSW5mbyAqYWNfaW5mbzsKKwl1aW50OF90IGFjOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXVpbnQxNl90IHJpY19vZmZzZXQgPSAwOworCXVpbnQzMl90IHJpY19pZWxlbiA9IDA7CisJdWludDhfdCAqcmljX2llOworCXVpbnQ4X3QgdHNwZWNfbWFza19zdGF0dXMgPSAwOworCXVpbnQ4X3QgdHNwZWNfcGVuZGluZ19zdGF0dXMgPSAwOworCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgIEZMKCJpbnZva2VkIG9uIFNNRSBzZXNzaW9uICVkIiksIHNlc3Npb25pZCk7CisKKwlpZiAoTlVMTCA9PSBzbWVfc2Vzc2lvbikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInNtZV9zZXNzaW9uIGlzIE5VTEwiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJcW9zX3Nlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uaWRdOworCisJZm9yIChhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSB7CisJCWFjX2luZm8gPSAmcW9zX3Nlc3Npb24tPmFjX2luZm9bYWNdOworCisJCXN3aXRjaCAoYWNfaW5mby0+Y3Vycl9zdGF0ZSkgeworCQljYXNlIFNNRV9RT1NfTElOS19VUDoKKwkJY2FzZSBTTUVfUU9TX1JFUVVFU1RFRDoKKwkJY2FzZSBTTUVfUU9TX1FPU19PTjoKKwkJICAgIHNtZV9xb3Nfc3RhdGVfdHJhbnNpdGlvbihzZXNzaW9uaWQsIGFjLCBTTUVfUU9TX0hBTkRPRkYpOworCQkgICAgYnJlYWs7CisJCWNhc2UgU01FX1FPU19IQU5ET0ZGOgorCQkvKiBwcmludCBlcnJvciBtc2cgKi8KKwkJY2FzZSBTTUVfUU9TX0NMT1NFRDoKKwkJY2FzZSBTTUVfUU9TX0lOSVQ6CisJCWRlZmF1bHQ6CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgIEZMKCJTZXNzaW9uICVkIEFDICVkIGlzIGluIHdyb25nIHN0YXRlICVkIiksCisJCQkJICBzZXNzaW9uaWQsIGFjLCBhY19pbmZvLT5jdXJyX3N0YXRlKTsKKwkJCUNERl9BU1NFUlQoMCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXFvc19zZXNzaW9uLT5mdEhhbmRvZmZJblByb2dyZXNzID0gdHJ1ZTsKKworCS8qIENoZWNrIGlmIGl0cyBhIDExUiByb2FtaW5nIGJlZm9yZSBwcmVwYXJpbmcgdGhlIFJJQyBJRXMgKi8KKwlpZiAoIWNzcl9yb2FtX2lzMTFyX2Fzc29jKG1hY19jdHgsIHNlc3Npb25pZCkpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBEYXRhIGlzIGFjY2Vzc2VkIGZyb20gc2F2ZWQgUHJlQXV0aCBSc3AgKi8KKwlpZiAoTlVMTCA9PSBzbWVfc2Vzc2lvbi0+ZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoInBzYXZlZEZUUHJlQXV0aFJzcCBpcyBOVUxMIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCS8qCisJICogQW55IEJsb2NrIEFjayBpbmZvIHRoZXJlLCBzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgZmlsbGVkIGJ5IFBFIGFuZAorCSAqIHByZXNlbnQgaW4gdGhpcyBidWZmZXIgYW5kIHRoZSByaWNfaWVzX2xlbmd0aCBzaG91bGQgY29udGFpbiB0aGUKKwkgKiBsZW5ndGggb2YgdGhlIHdob2xlIFJJQyBJRXMuIEZpbGxpbmcgb2YgVFNQRUMgaW5mbyBzaG91bGQgc3RhcnQKKwkgKiBmcm9tIHRoaXMgbGVuZ3RoCisJICovCisJcmljX2llID0gc21lX3Nlc3Npb24tPmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AtPnJpY19pZXM7CisJcmljX29mZnNldCA9CisJCXNtZV9zZXNzaW9uLT5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwLT5yaWNfaWVzX2xlbmd0aDsKKworCS8qCisJICogTm93IHdlIGhhdmUgdG8gcHJvY2VzcyB0aGUgY3VycmVudFRzcGVJbmZvIGluc2lkZSB0aGlzIHNlc3Npb24gYW5kCisJICogY3JlYXRlIHRoZSBSSUMgSUVzCisJICovCisJZm9yIChhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSB7CisJCXZvbGF0aWxlIHVpbnQ4X3QgdHNwZWNfaWR4ID0gMDsKKwkJcmljX2llbGVuID0gMDsKKwkJYWNfaW5mbyA9ICZxb3Nfc2Vzc2lvbi0+YWNfaW5mb1thY107CisJCXRzcGVjX3BlbmRpbmdfc3RhdHVzID0gYWNfaW5mby0+dHNwZWNfcGVuZGluZzsKKwkJdHNwZWNfbWFza19zdGF0dXMgPSBhY19pbmZvLT50c3BlY19tYXNrX3N0YXR1czsKKwkJY2RmX21lbV96ZXJvKGFjX2luZm8tPnJpY0lkZW50aWZpZXIsIFNNRV9RT1NfVFNQRUNfSU5ERVhfTUFYKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgRkwoIkFDICVkID09PiBUU1BFQyBzdGF0dXMgPSAlZCwgdHNwZWMgcGVuZGluZyA9ICVkIiksCisJCQkgIGFjLCB0c3BlY19tYXNrX3N0YXR1cywgdHNwZWNfcGVuZGluZ19zdGF0dXMpOworCisJCWRvIHsKKwkJCWlmICghKHRzcGVjX21hc2tfc3RhdHVzICYgMHgxKSkKKwkJCQlnb3RvIGFkZF9uZXh0X3JpYzsKKworCQkJLyoKKwkJCSAqIElmIGEgdHNwZWMgc3RhdHVzIGlzIHBlbmRpbmcsIHRha2UgcmVxdWVzdGVkX1FvU0luZm8KKwkJCSAqIGZvciBSSUMgcmVxdWVzdCwgZWxzZSB1c2UgY3Vycl9Rb1NJbmZvIGZvciB0aGUKKwkJCSAqIFJJQyByZXF1ZXN0CisJCQkgKi8KKwkJCWlmICh0c3BlY19wZW5kaW5nX3N0YXR1cyAmIDB4MSkgeworCQkJICAgIHN0YXR1cyA9IHNtZV9xb3NfY3JlYXRlX3RzcGVjX3JpY2llKG1hY19jdHgsCisJCQkJCSZhY19pbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1t0c3BlY19pZHhdLAorCQkJCQlyaWNfaWUgKyByaWNfb2Zmc2V0LCAmcmljX2llbGVuLAorCQkJCQkmYWNfaW5mby0+cmljSWRlbnRpZmllclt0c3BlY19pZHhdKTsKKwkJCX0gZWxzZSB7CisJCQkgICAgc3RhdHVzID0gc21lX3Fvc19jcmVhdGVfdHNwZWNfcmljaWUobWFjX2N0eCwKKwkJCQkJJmFjX2luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19pZHhdLAorCQkJCQlyaWNfaWUgKyByaWNfb2Zmc2V0LCAmcmljX2llbGVuLAorCQkJCQkmYWNfaW5mby0+cmljSWRlbnRpZmllclt0c3BlY19pZHhdKTsKKwkJCX0KK2FkZF9uZXh0X3JpYzoKKwkJCXJpY19vZmZzZXQgKz0gcmljX2llbGVuOworCQkJc21lX3Nlc3Npb24tPmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AtPgorCQkJCXJpY19pZXNfbGVuZ3RoICs9IHJpY19pZWxlbjsKKwkJCXRzcGVjX21hc2tfc3RhdHVzID4+PSAxOworCQkJdHNwZWNfcGVuZGluZ19zdGF0dXMgPj49IDE7CisJCQl0c3BlY19pZHgrKzsKKwkJfSB3aGlsZSAodHNwZWNfbWFza19zdGF0dXMpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9xb3NfcHJvY2Vzc19hZGRfdHNfZmFpbHVyZV9yc3AoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgICBBZGR0cyByZXF1ZXN0IGZhaWx1cmUgcmVzcG9uc2UgY2FtZSBmcm9tIFBFCisKKyAgIFdlIHdpbGwgbm90aWZ5IEhERCBvbmx5IGZvciB0aGUgcmVxdWVzdGVkIEZsb3csIG90aGVyIEZsb3dzIHJ1bm5pbmcgb24gdGhlIEFDCisgICBzdGF5IGludGFjdAorCisgICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgIFxwYXJhbSBwUnNwIC0gUG9pbnRlciB0byB0aGUgYWRkdHMgcmVzcG9uc2Ugc3RydWN0dXJlIGNhbWUgZnJvbSBQRS4KKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfcHJvY2Vzc19hZGRfdHNfZmFpbHVyZV9yc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJICAgICAgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJCSAgICAgIHRTaXJBZGR0c1JzcEluZm8gKnBSc3ApCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwlzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworCXNtZV9Rb3NFZGNhQWNUeXBlIGFjOworCXNtZV9Rb3NTZWFyY2hJbmZvIHNlYXJjaF9rZXk7CisJdWludDhfdCB0c3BlY19wZW5kaW5nOworCXNtZV9Rb3NXbW1VcFR5cGUgdXAgPQorCQkoc21lX1Fvc1dtbVVwVHlwZSkgcFJzcC0+dHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW87CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCBmb3IgVVAgJWQiLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCSAgc2Vzc2lvbklkLCB1cCk7CisJYWMgPSBzbWVfcW9zX3VwX3RvX2FjKHVwKTsKKwlpZiAoU01FX1FPU19FRENBX0FDX01BWCA9PSBhYykgeworCQkvKiBlcnIgbXNnICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBpbnZhbGlkIEFDICVkIGZyb20gVVAgJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIGFjLCB1cCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCXBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworCS8qIGlzIHRoZXJlIGEgVFNQRUMgcmVxdWVzdCBwZW5kaW5nIG9uIHRoaXMgQUM/ICovCisJdHNwZWNfcGVuZGluZyA9IHBBQ0luZm8tPnRzcGVjX3BlbmRpbmc7CisJaWYgKCF0c3BlY19wZW5kaW5nKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIGFuIEFkZFRTIGlzIG5vdCBwZW5kaW5nIG9uIEFDICVkIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQsIGFjKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNkZl9tZW1femVybygmc2VhcmNoX2tleSwgc2l6ZW9mKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisJLyogc2V0IHRoZSBrZXkgdHlwZSAmIHRoZSBrZXkgdG8gYmUgc2VhcmNoZWQgaW4gdGhlIEZsb3cgTGlzdCAqLworCXNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKwlzZWFyY2hfa2V5LmluZGV4ID0gU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzI7CisJc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJICAgIChzbWVfcW9zX2ZpbmRfYWxsX2luX2Zsb3dfbGlzdAorCQkJICAgIChwTWFjLCBzZWFyY2hfa2V5LCBzbWVfcW9zX2FkZF90c19mYWlsdXJlX2ZucCkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIG5vIG1hdGNoIGZvdW5kIGZvciBhYyA9ICVkIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQsCisJCQkgIHNlYXJjaF9rZXkua2V5LmFjX3R5cGUpOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWNkZl9tZW1femVybygmcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLAorCQkgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisKKwlpZiAoKCFwQUNJbmZvLT5udW1fZmxvd3NbMF0pICYmICghcEFDSW5mby0+bnVtX2Zsb3dzWzFdKSkgeworCQlwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyAmPSBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgJgorCQkJCQkgICAgICAofnBBQ0luZm8tPnRzcGVjX3BlbmRpbmcpOworCQlzbWVfcW9zX3N0YXRlX3RyYW5zaXRpb24oc2Vzc2lvbklkLCBhYywgU01FX1FPU19MSU5LX1VQKTsKKwl9IGVsc2UgeworCQlzbWVfcW9zX3N0YXRlX3RyYW5zaXRpb24oc2Vzc2lvbklkLCBhYywgU01FX1FPU19RT1NfT04pOworCX0KKwlwQUNJbmZvLT50c3BlY19wZW5kaW5nID0gMDsKKworCSh2b2lkKXNtZV9xb3NfcHJvY2Vzc19idWZmZXJlZF9jbWQoc2Vzc2lvbklkKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3Fvc191cGRhdGVfdHNwZWNfbWFzaygpIC0gVXRpbHRpdHkgZnVuY3Rpb24gdG8gdXBkYXRlIHRoZSB0c3BlYy4KKyAqIEBzZXNzaW9uaWQ6IFNlc3Npb24gdXBvbiB3aGljaCB0aGUgVFNQRUMgaXMgYmVpbmcgdXBkYXRlZAorICogQHNlYXJjaF9rZXk6IHNlYXJjaCBrZXkKKyAqIEBuZXdfdHNwZWNfbWFzazogdHNwZWMgdG8gYmUgc2V0IGZvciB0aGlzIEFDCisgKgorICogVHlwaWNhbCB1c2FnZSB3aGlsZSBhZ2dyZWdhdGluZyB1bmlkaXJlY3Rpb25hbCBmbG93cyBpbnRvIGEgYmktZGlyZWN0aW9uYWwKKyAqIGZsb3cgb24gQUMgd2hpY2ggaXMgcnVubmluZyBtdWx0aXBsZSBmbG93cworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitzdGF0aWMgQ0RGX1NUQVRVUyBzbWVfcW9zX3VwZGF0ZV90c3BlY19tYXNrKHVpbnQ4X3Qgc2Vzc2lvbmlkLAorCQkJCQkgICAgc21lX1Fvc1NlYXJjaEluZm8gc2VhcmNoX2tleSwKKwkJCQkJICAgIHVpbnQ4X3QgbmV3X3RzcGVjX21hc2spCit7CisJdExpc3RFbGVtICpsaXN0X2VsdCA9IE5VTEwsICpsaXN0X25leHRfZWx0ID0gTlVMTDsKKwlzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnFvc19zZXNzaW9uOworCXNtZV9Rb3NBQ0luZm8gKmFjX2luZm87CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgRkwoImludm9rZWQgb24gc2Vzc2lvbiAlZCBmb3IgQUMgJWQgVFNQRUMgJWQiKSwKKwkJICBzZXNzaW9uaWQsIHNlYXJjaF9rZXkua2V5LmFjX3R5cGUsIG5ld190c3BlY19tYXNrKTsKKworCXFvc19zZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbmlkXTsKKworCWlmIChzZWFyY2hfa2V5LmtleS5hY190eXBlIDwgU01FX1FPU19FRENBX0FDX01BWCkgeworCQlhY19pbmZvID0gJnFvc19zZXNzaW9uLT5hY19pbmZvW3NlYXJjaF9rZXkua2V5LmFjX3R5cGVdOworCX0gZWxzZSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgRkwoIkV4Y2VlZGVkIHRoZSBhcnJheSBib3VuZHMiKSk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlsaXN0X2VsdCA9IGNzcl9sbF9wZWVrX2hlYWQoJnNtZV9xb3NfY2IuZmxvd19saXN0LCBmYWxzZSk7CisJaWYgKCFsaXN0X2VsdCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIkZsb3cgTGlzdCBlbXB0eSwgbm90aGluZyB0byB1cGRhdGUiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwl3aGlsZSAobGlzdF9lbHQpIHsKKwkJbGlzdF9uZXh0X2VsdCA9IGNzcl9sbF9uZXh0KCZzbWVfcW9zX2NiLmZsb3dfbGlzdCwgbGlzdF9lbHQsCisJCQkJCSAgICBmYWxzZSk7CisJCWZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIobGlzdF9lbHQsIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rKTsKKworCQlpZiAoc2VhcmNoX2tleS5zZXNzaW9uSWQgIT0gZmxvd19pbmZvLT5zZXNzaW9uSWQpIHsKKwkJCWxpc3RfZWx0ID0gbGlzdF9uZXh0X2VsdDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHNlYXJjaF9rZXkuaW5kZXggJiBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfNCkgeworCQkJaWYgKChzZWFyY2hfa2V5LmtleS5hY190eXBlID09IGZsb3dfaW5mby0+YWNfdHlwZSkgJiYKKwkJCSAgICAoc2VhcmNoX2tleS5kaXJlY3Rpb24gPT0KKwkJCQlmbG93X2luZm8tPlFvU0luZm8udHNfaW5mby5kaXJlY3Rpb24pKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgIEZMKCJGbG93ICVkIG1hdGNoZXMiKSwgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworCQkJCWFjX2luZm8tPm51bV9mbG93c1tmbG93X2luZm8tPnRzcGVjX21hc2sgLSAxXS0tOworCQkJCWFjX2luZm8tPm51bV9mbG93c1tuZXdfdHNwZWNfbWFzayAtIDFdKys7CisJCQkJZmxvd19pbmZvLT50c3BlY19tYXNrID0gbmV3X3RzcGVjX21hc2s7CisJCQl9CisJCX0gZWxzZSBpZiAoc2VhcmNoX2tleS5pbmRleCAmIFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF81KSB7CisJCQlpZiAoKHNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPT0gZmxvd19pbmZvLT5hY190eXBlKSAmJgorCQkJICAgIChzZWFyY2hfa2V5LnRzcGVjX21hc2sgPT0gZmxvd19pbmZvLT50c3BlY19tYXNrKSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJICBGTCgiRmxvdyAlZCBtYXRjaGVzIiksIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKwkJCQlhY19pbmZvLT5udW1fZmxvd3NbZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0tLTsKKwkJCQlhY19pbmZvLT5udW1fZmxvd3NbbmV3X3RzcGVjX21hc2sgLSAxXSsrOworCQkJCWZsb3dfaW5mby0+dHNwZWNfbWFzayA9IG5ld190c3BlY19tYXNrOworCQkJfQorCQl9CisJCWxpc3RfZWx0ID0gbGlzdF9uZXh0X2VsdDsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19wcm9jZXNzX2FkZF90c19zdWNjZXNzX3JzcCgpIC0gRnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUKKyAgIEFkZHRzIHJlcXVlc3Qgc3VjY2VzcyByZXNwb25zZSBjYW1lIGZyb20gUEUKKworICAgV2Ugd2lsbCBub3RpZnkgSEREIHdpdGggYWRkdHMgc3VjY2VzcyBmb3IgdGhlIHJlcXVlc3RlZCBGbG93LCAmIGZvciBvdGhlcgorICAgRmxvd3MgcnVubmluZyBvbiB0aGUgQUMgd2Ugd2lsbCBzZW5kIGFuIGFkZHRzIG1vZGlmeSBzdGF0dXMKKworICAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgICBccGFyYW0gcFJzcCAtIFBvaW50ZXIgdG8gdGhlIGFkZHRzIHJlc3BvbnNlIHN0cnVjdHVyZSBjYW1lIGZyb20gUEUuCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfYWRkX3RzX3N1Y2Nlc3NfcnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkgICAgICB0U2lyQWRkdHNSc3BJbmZvICpwUnNwKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYywgYWNfaW5kZXg7CisJc21lX1Fvc1NlYXJjaEluZm8gc2VhcmNoX2tleTsKKwlzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5MTsKKwl1aW50OF90IHRzcGVjX3BlbmRpbmc7CisJdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworCXNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworCXNtZV9Rb3NXbW1VcFR5cGUgdXAgPQorCQkoc21lX1Fvc1dtbVVwVHlwZSkgcFJzcC0+dHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW87CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCVdMQU5fSE9TVF9ESUFHX0VWRU5UX0RFRihxb3MsIGhvc3RfZXZlbnRfd2xhbl9xb3NfcGF5bG9hZF90eXBlKTsKKwlob3N0X2xvZ19xb3NfdHNwZWNfcGt0X3R5cGUgKmxvZ19wdHIgPSBOVUxMOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIGZvciBVUCAlZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQsIHVwKTsKKwlwU2Vzc2lvbiA9ICZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisJYWMgPSBzbWVfcW9zX3VwX3RvX2FjKHVwKTsKKwlpZiAoU01FX1FPU19FRENBX0FDX01BWCA9PSBhYykgeworCQkvKiBlcnIgbXNnICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBpbnZhbGlkIEFDICVkIGZyb20gVVAgJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIGFjLCB1cCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisJLyogaXMgdGhlcmUgYSBUU1BFQyByZXF1ZXN0IHBlbmRpbmcgb24gdGhpcyBBQz8gKi8KKwl0c3BlY19wZW5kaW5nID0gcEFDSW5mby0+dHNwZWNfcGVuZGluZzsKKwlpZiAoIXRzcGVjX3BlbmRpbmcpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgYW4gQWRkVFMgaXMgbm90IHBlbmRpbmcgb24gQUMgJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgYWMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIEFwcCBpcyBsb29raW5nIGZvciBBUFNEIG9yIHRoZSBBcHAgd2hpY2ggd2FzIGxvb2tpbmcgZm9yIEFQU0QgaGFzIGJlZW4gKi8KKwkvKiByZWxlYXNlZCwgc28gU1RBIHJlLW5lZ290aWF0ZWQgd2l0aCBBUCAqLworCWlmIChwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0udHNfaW5mby5wc2IpIHsKKwkJLyogdXBkYXRlIHRoZSBzZXNzaW9uJ3MgYXBzZCBtYXNrICovCisJCXBTZXNzaW9uLT5hcHNkTWFzayB8PSAxIDw8IChTTUVfUU9TX0VEQ0FfQUNfVk8gLSBhYyk7CisJfSBlbHNlIHsKKwkJaWYgKCgoU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUICYgfnRzcGVjX3BlbmRpbmcpID4gMCkgJiYKKwkJICAgICgoU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUICYgfnRzcGVjX3BlbmRpbmcpIDw9CisJCSAgICAgU01FX1FPU19UU1BFQ19JTkRFWF9NQVgpKSB7CisJCQlpZiAoIXBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvCisJCQkgICAgWyhTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgJiB+dHNwZWNfcGVuZGluZykgLQorCQkJICAgICAxXS50c19pbmZvLnBzYikgeworCQkJCS8qIHVwZGF0ZSB0aGUgc2Vzc2lvbidzIGFwc2QgbWFzayAqLworCQkJCXBTZXNzaW9uLT5hcHNkTWFzayAmPQorCQkJCQl+KDEgPDwgKFNNRV9RT1NfRURDQV9BQ19WTyAtIGFjKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJICAiJXM6ICVkOiBFeGNlZWRlZCB0aGUgYXJyYXkgYm91bmRzIG9mIHBBQ0luZm8tPnJlcXVlc3RlZF9Rb3NJbmZvIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlDREZfQVNTRVJUKDApOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfQorCisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS50c19pbmZvLmJ1cnN0X3NpemVfZGVmbiA9CisJCXBSc3AtPnRzcGVjLnRzaW5mby50cmFmZmljLmJ1cnN0U2l6ZURlZm47CisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS50c19pbmZvLmFja19wb2xpY3kgPQorCQlwUnNwLT50c3BlYy50c2luZm8udHJhZmZpYy5hY2tQb2xpY3k7CisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS50c19pbmZvLnVwID0KKwkJcFJzcC0+dHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW87CisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS50c19pbmZvLnBzYiA9CisJCXBSc3AtPnRzcGVjLnRzaW5mby50cmFmZmljLnBzYjsKKwlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLnRzX2luZm8uZGlyZWN0aW9uID0KKwkJcFJzcC0+dHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uOworCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0udHNfaW5mby50aWQgPQorCQlwUnNwLT50c3BlYy50c2luZm8udHJhZmZpYy50c2lkOworCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubm9taW5hbF9tc2R1X3NpemUgPQorCQlwUnNwLT50c3BlYy5ub21Nc2R1U3o7CisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5tYXhpbXVtX21zZHVfc2l6ZSA9CisJCXBSc3AtPnRzcGVjLm1heE1zZHVTejsKKwlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLm1pbl9zZXJ2aWNlX2ludGVydmFsID0KKwkJcFJzcC0+dHNwZWMubWluU3ZjSW50ZXJ2YWw7CisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5tYXhfc2VydmljZV9pbnRlcnZhbCA9CisJCXBSc3AtPnRzcGVjLm1heFN2Y0ludGVydmFsOworCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0uaW5hY3Rpdml0eV9pbnRlcnZhbCA9CisJCXBSc3AtPnRzcGVjLmluYWN0SW50ZXJ2YWw7CisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5zdXNwZW5zaW9uX2ludGVydmFsID0KKwkJcFJzcC0+dHNwZWMuc3VzcGVuZEludGVydmFsOworCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0uc3ZjX3N0YXJ0X3RpbWUgPQorCQlwUnNwLT50c3BlYy5zdmNTdGFydFRpbWU7CisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5taW5fZGF0YV9yYXRlID0KKwkJcFJzcC0+dHNwZWMubWluRGF0YVJhdGU7CisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5tZWFuX2RhdGFfcmF0ZSA9CisJCXBSc3AtPnRzcGVjLm1lYW5EYXRhUmF0ZTsKKwlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLnBlYWtfZGF0YV9yYXRlID0KKwkJcFJzcC0+dHNwZWMucGVha0RhdGFSYXRlOworCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubWF4X2J1cnN0X3NpemUgPQorCQlwUnNwLT50c3BlYy5tYXhCdXJzdFN6OworCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0uZGVsYXlfYm91bmQgPQorCQlwUnNwLT50c3BlYy5kZWxheUJvdW5kOworCisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5taW5fcGh5X3JhdGUgPQorCQlwUnNwLT50c3BlYy5taW5QaHlSYXRlOworCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0uc3VycGx1c19id19hbGxvd2FuY2UgPQorCQlwUnNwLT50c3BlYy5zdXJwbHVzQnc7CisJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5tZWRpdW1fdGltZSA9CisJCXBSc3AtPnRzcGVjLm1lZGl1bVRpbWU7CisKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBBZGRUc3BlYyBNZWRpdW0gVGltZSAlZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQsIHBSc3AtPnRzcGVjLm1lZGl1bVRpbWUpOworCisJLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZmxvdyBpcyBmb3IgYmktZGlyZWN0aW9uYWwuIElmIHNvLCB1cGRhdGUgdGhlIG51bWJlciBvZiBmbG93cworCSAqIHRvIHJlZmxlY3QgdGhhdCBhbGwgZmxvd3MgYXJlIGFnZ3JlZ2F0ZWQgaW50byB0c3BlYyBpbmRleCAwLiAqLworCWlmICgocEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3BBQ0luZm8tPnRzcGVjX3BlbmRpbmcgLSAxXS50c19pbmZvLgorCSAgICAgZGlyZWN0aW9uID09IFNNRV9RT1NfV01NX1RTX0RJUl9CT1RIKQorCSAgICAmJiAocEFDSW5mby0+bnVtX2Zsb3dzW1NNRV9RT1NfVFNQRUNfSU5ERVhfMV0gPiAwKSkgeworCQljZGZfbWVtX3plcm8oJnNlYXJjaF9rZXksIHNpemVvZihzbWVfUW9zU2VhcmNoSW5mbykpOworCQkvKiB1cGRhdGUgdHNwZWNfbWFzayBmb3IgYWxsIHRoZSBmbG93cyBoYXZpbmcgU01FX1FPU19UU1BFQ19NQVNLX0JJVF8yX1NFVCB0byBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfU0VUICovCisJCXNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKwkJc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF81OworCQlzZWFyY2hfa2V5LnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKwkJc2VhcmNoX2tleS50c3BlY19tYXNrID0gU01FX1FPU19UU1BFQ19NQVNLX0JJVF8yX1NFVDsKKwkJc21lX3Fvc191cGRhdGVfdHNwZWNfbWFzayhzZXNzaW9uSWQsIHNlYXJjaF9rZXksCisJCQkJCSAgU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xX1NFVCk7CisJfQorCisJY2RmX21lbV96ZXJvKCZzZWFyY2hfa2V5MSwgc2l6ZW9mKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisJLyogc2V0IHRoZSBob3JlbmV3YWwgZmllbGQgaW4gY29udHJvbCBibG9jayBpZiBuZWVkZWQgKi8KKwlzZWFyY2hfa2V5MS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8zOworCXNlYXJjaF9rZXkxLmtleS5yZWFzb24gPSBTTUVfUU9TX1JFQVNPTl9TRVRVUDsKKwlzZWFyY2hfa2V5MS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJZm9yIChhY19pbmRleCA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWNfaW5kZXggPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOworCSAgICAgYWNfaW5kZXgrKykgeworCQlwRW50cnkgPSBzbWVfcW9zX2ZpbmRfaW5fZmxvd19saXN0KHNlYXJjaF9rZXkxKTsKKwkJaWYgKHBFbnRyeSkgeworCQkJZmxvd19pbmZvID0KKwkJCQlHRVRfQkFTRV9BRERSKHBFbnRyeSwgc21lX1Fvc0Zsb3dJbmZvRW50cnksIGxpbmspOworCQkJaWYgKGZsb3dfaW5mby0+YWNfdHlwZSA9PSBhYykgeworCQkJCXBBQ0luZm8tPmhvUmVuZXdhbCA9IGZsb3dfaW5mby0+aG9SZW5ld2FsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWNkZl9tZW1femVybygmc2VhcmNoX2tleSwgc2l6ZW9mKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisJLyogc2V0IHRoZSBrZXkgdHlwZSAmIHRoZSBrZXkgdG8gYmUgc2VhcmNoZWQgaW4gdGhlIEZsb3cgTGlzdCAqLworCXNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKwlzZWFyY2hfa2V5LmluZGV4ID0gU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzI7CisJc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJLyogbm90aWZ5IEhERCB0aGUgc3VjY2VzcyBmb3IgdGhlIHJlcXVlc3RlZCBmbG93ICovCisJLyogbm90aWZ5IGFsbCB0aGUgb3RoZXIgZmxvd3MgcnVubmluZyBvbiB0aGUgQUMgdGhhdCBRb1MgZ290IG1vZGlmaWVkICovCisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJICAgIChzbWVfcW9zX2ZpbmRfYWxsX2luX2Zsb3dfbGlzdAorCQkJICAgIChwTWFjLCBzZWFyY2hfa2V5LCBzbWVfcW9zX2FkZF90c19zdWNjZXNzX2ZucCkpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIG5vIG1hdGNoIGZvdW5kIGZvciBhYyAlZCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkLAorCQkJICBzZWFyY2hfa2V5LmtleS5hY190eXBlKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlwQUNJbmZvLT5ob1JlbmV3YWwgPSBmYWxzZTsKKwljZGZfbWVtX3plcm8oJnBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXSwKKwkJICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworCS8qIGV2ZW50OiBFVkVOVF9XTEFOX1FPUyAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKwlxb3MuZXZlbnRJZCA9IFNNRV9RT1NfRElBR19BRERUU19SU1A7CisJcW9zLnJlYXNvbkNvZGUgPSBTTUVfUU9TX0RJQUdfQUREVFNfQURNSVNTSU9OX0FDQ0VQVEVEOworCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmcW9zLCBFVkVOVF9XTEFOX1FPUyk7CisJV0xBTl9IT1NUX0RJQUdfTE9HX0FMTE9DKGxvZ19wdHIsIGhvc3RfbG9nX3Fvc190c3BlY19wa3RfdHlwZSwKKwkJCQkgTE9HX1dMQU5fUU9TX1RTUEVDX0MpOworCWlmIChsb2dfcHRyKSB7CisJCWxvZ19wdHItPmRlbGF5X2JvdW5kID0KKwkJCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0uZGVsYXlfYm91bmQ7CisJCWxvZ19wdHItPmluYWN0aXZpdHlfaW50ZXJ2YWwgPQorCQkJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLQorCQkJCQkgICAgICAxXS5pbmFjdGl2aXR5X2ludGVydmFsOworCQlsb2dfcHRyLT5tYXhfYnVyc3Rfc2l6ZSA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLm1heF9idXJzdF9zaXplOworCQlsb2dfcHRyLT5tYXhfc2VydmljZV9pbnRlcnZhbCA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtCisJCQkJCSAgICAgIDFdLm1heF9zZXJ2aWNlX2ludGVydmFsOworCQlsb2dfcHRyLT5tYXhpbXVtX21zZHVfc2l6ZSA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLm1heGltdW1fbXNkdV9zaXplOworCQlsb2dfcHRyLT5tZWFuX2RhdGFfcmF0ZSA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLm1lYW5fZGF0YV9yYXRlOworCQlsb2dfcHRyLT5tZWRpdW1fdGltZSA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLm1lZGl1bV90aW1lOworCQlsb2dfcHRyLT5taW5fZGF0YV9yYXRlID0KKwkJCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubWluX2RhdGFfcmF0ZTsKKwkJbG9nX3B0ci0+bWluX3BoeV9yYXRlID0KKwkJCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubWluX3BoeV9yYXRlOworCQlsb2dfcHRyLT5taW5fc2VydmljZV9pbnRlcnZhbCA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtCisJCQkJCSAgICAgIDFdLm1pbl9zZXJ2aWNlX2ludGVydmFsOworCQlsb2dfcHRyLT5ub21pbmFsX21zZHVfc2l6ZSA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLm5vbWluYWxfbXNkdV9zaXplOworCQlsb2dfcHRyLT5wZWFrX2RhdGFfcmF0ZSA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLnBlYWtfZGF0YV9yYXRlOworCQlsb2dfcHRyLT5zdXJwbHVzX2J3X2FsbG93YW5jZSA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtCisJCQkJCSAgICAgIDFdLnN1cnBsdXNfYndfYWxsb3dhbmNlOworCQlsb2dfcHRyLT5zdXNwZW5zaW9uX2ludGVydmFsID0KKwkJCXBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0KKwkJCQkJICAgICAgMV0uc3VycGx1c19id19hbGxvd2FuY2U7CisJCWxvZ19wdHItPnN1c3BlbnNpb25faW50ZXJ2YWwgPQorCQkJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLQorCQkJCQkgICAgICAxXS5zdXNwZW5zaW9uX2ludGVydmFsOworCQlsb2dfcHRyLT5zdmNfc3RhcnRfdGltZSA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLnN2Y19zdGFydF90aW1lOworCQlsb2dfcHRyLT50c2luZm9bMF0gPQorCQkJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLQorCQkJCQkgICAgICAxXS50c19pbmZvLmRpcmVjdGlvbiA8PCA1IHwgcEFDSW5mby0+CisJCQljdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLnRzX2luZm8udGlkIDw8IDE7CisJCWxvZ19wdHItPnRzaW5mb1sxXSA9CisJCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtCisJCQkJCSAgICAgIDFdLnRzX2luZm8udXAgPDwgMTEgfCBwQUNJbmZvLT4KKwkJCWN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0udHNfaW5mby5wc2IgPDwgMTA7CisJCWxvZ19wdHItPnRzaW5mb1syXSA9IDA7CisJfQorCVdMQU5fSE9TVF9ESUFHX0xPR19SRVBPUlQobG9nX3B0cik7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCXBBQ0luZm8tPnRzcGVjX3BlbmRpbmcgPSAwOworCisJc21lX3Fvc19zdGF0ZV90cmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfUU9TX09OKTsKKworCXNtZV9zZXRfdHNwZWNfdWFwc2RfbWFza19wZXJfc2Vzc2lvbihwTWFjLAorCQkJJnBSc3AtPnRzcGVjLnRzaW5mbywgc2Vzc2lvbklkKTsKKworCSh2b2lkKXNtZV9xb3NfcHJvY2Vzc19idWZmZXJlZF9jbWQoc2Vzc2lvbklkKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfcW9zX2FnZ3JlZ2F0ZV9wYXJhbXMoKSAtIFV0aWx0aXR5IGZ1bmN0aW9uIHRvIGluY3JlYW1lbnQgdGhlIFRTUEVDCisgICBwYXJhbXMgcGVyIEFDLiBUeXBpY2FsIHVzYWdlIHdoaWxlIHVzaW5nIGZsb3cgYWdncmVnYXRpb24gb3IgZGVsZXRpb24gb2YgZmxvd3MKKworICAgXHBhcmFtIHBJbnB1dF9Uc3BlY19JbmZvIC0gUG9pbnRlciB0byBzbWVfUW9zV21tVHNwZWNJbmZvIHdoaWNoIGNvbnRhaW5zIHRoZQorICAgV01NIFRTUEVDIHJlbGF0ZWQgaW5mbyB3aXRoIHdoaWNoIHBDdXJyZW50X1RzcGVjX0luZm8gd2lsbCBiZSB1cGRhdGVkCisgICBccGFyYW0gcEN1cnJlbnRfVHNwZWNfSW5mbyAtIFBvaW50ZXIgdG8gc21lX1Fvc1dtbVRzcGVjSW5mbyB3aGljaCBjb250YWlucworICAgY3VycmVudCB0aGUgV01NIFRTUEVDIHJlbGF0ZWQgaW5mbworCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3Fvc19hZ2dyZWdhdGVfcGFyYW1zKHNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBJbnB1dF9Uc3BlY19JbmZvLAorCQkJCSAgICBzbWVfUW9zV21tVHNwZWNJbmZvICpwQ3VycmVudF9Uc3BlY19JbmZvLAorCQkJCSAgICBzbWVfUW9zV21tVHNwZWNJbmZvICpwVXBkYXRlZF9Uc3BlY19JbmZvKQoreworCXNtZV9Rb3NXbW1Uc3BlY0luZm8gVHNwZWNJbmZvOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBpbnZva2VkIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlpZiAoIXBJbnB1dF9Uc3BlY19JbmZvKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIiVzOiAlZDogaW5wdXQgaXMgTlVMTCwgbm90aGluZyB0byBhZ2dyZWdhdGUiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICghcEN1cnJlbnRfVHNwZWNfSW5mbykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogJWQ6IEN1cnJlbnQgaXMgTlVMTCwgY2FuJ3QgYWdncmVnYXRlIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwljZGZfbWVtX2NvcHkoJlRzcGVjSW5mbywgcEN1cnJlbnRfVHNwZWNfSW5mbywKKwkJICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworCVRzcGVjSW5mby50c19pbmZvLnBzYiA9IHBJbnB1dF9Uc3BlY19JbmZvLT50c19pbmZvLnBzYjsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICBBUFNEIHByZWZlcmVuY2UgaXMgb25seSBtZWFuaW5nZnVsIGlmIHNlcnZpY2UgaW50ZXJ2YWwgd2FzIHNldCBieSBhcHAKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAocEN1cnJlbnRfVHNwZWNfSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWwgJiYKKwkgICAgcElucHV0X1RzcGVjX0luZm8tPm1pbl9zZXJ2aWNlX2ludGVydmFsICYmCisJICAgIChwQ3VycmVudF9Uc3BlY19JbmZvLT50c19pbmZvLmRpcmVjdGlvbiAhPQorCSAgICAgcElucHV0X1RzcGVjX0luZm8tPnRzX2luZm8uZGlyZWN0aW9uKSkgeworCQlUc3BlY0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwgPQorCQkJQ0RGX01JTihwQ3VycmVudF9Uc3BlY19JbmZvLT5taW5fc2VydmljZV9pbnRlcnZhbCwKKwkJCQlwSW5wdXRfVHNwZWNfSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWwpOworCX0gZWxzZSBpZiAocElucHV0X1RzcGVjX0luZm8tPm1pbl9zZXJ2aWNlX2ludGVydmFsKSB7CisJCVRzcGVjSW5mby5taW5fc2VydmljZV9pbnRlcnZhbCA9CisJCQlwSW5wdXRfVHNwZWNfSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWw7CisJfQorCWlmIChwQ3VycmVudF9Uc3BlY19JbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbCAmJgorCSAgICBwSW5wdXRfVHNwZWNfSW5mby0+bWF4X3NlcnZpY2VfaW50ZXJ2YWwgJiYKKwkgICAgKHBDdXJyZW50X1RzcGVjX0luZm8tPnRzX2luZm8uZGlyZWN0aW9uICE9CisJICAgICBwSW5wdXRfVHNwZWNfSW5mby0+dHNfaW5mby5kaXJlY3Rpb24pKSB7CisJCVRzcGVjSW5mby5tYXhfc2VydmljZV9pbnRlcnZhbCA9CisJCQlDREZfTUlOKHBDdXJyZW50X1RzcGVjX0luZm8tPm1heF9zZXJ2aWNlX2ludGVydmFsLAorCQkJCXBJbnB1dF9Uc3BlY19JbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbCk7CisJfSBlbHNlIHsKKwkJVHNwZWNJbmZvLm1heF9zZXJ2aWNlX2ludGVydmFsID0KKwkJCXBJbnB1dF9Uc3BlY19JbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbDsKKwl9CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgSWYgZGlyZWN0aW9ucyBkb24ndCBtYXRjaCwgaXQgbXVzdCBuZWNlc3NhcmlseSBiZSBib3RoIHVwbGluayBhbmQKKwkgICBkb3dubGluaworCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWlmIChwQ3VycmVudF9Uc3BlY19JbmZvLT50c19pbmZvLmRpcmVjdGlvbiAhPQorCSAgICBwSW5wdXRfVHNwZWNfSW5mby0+dHNfaW5mby5kaXJlY3Rpb24pIHsKKwkJVHNwZWNJbmZvLnRzX2luZm8uZGlyZWN0aW9uID0KKwkJCXBJbnB1dF9Uc3BlY19JbmZvLT50c19pbmZvLmRpcmVjdGlvbjsKKwl9CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgTWF4IE1TRFUgc2l6ZSA6IHRoZXNlIHNpemVzIGFyZSBgbWF4ZWQnCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJVHNwZWNJbmZvLm1heGltdW1fbXNkdV9zaXplID0KKwkJQ0RGX01BWChwQ3VycmVudF9Uc3BlY19JbmZvLT5tYXhpbXVtX21zZHVfc2l6ZSwKKwkJCXBJbnB1dF9Uc3BlY19JbmZvLT5tYXhpbXVtX21zZHVfc2l6ZSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICBJbmFjdGl2aXR5IGludGVydmFsIDogdGhlc2Ugc2l6ZXMgYXJlIGBtYXhlZCcKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlUc3BlY0luZm8uaW5hY3Rpdml0eV9pbnRlcnZhbCA9CisJCUNERl9NQVgocEN1cnJlbnRfVHNwZWNfSW5mby0+aW5hY3Rpdml0eV9pbnRlcnZhbCwKKwkJCXBJbnB1dF9Uc3BlY19JbmZvLT5pbmFjdGl2aXR5X2ludGVydmFsKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIERlbGF5IGJvdW5kczogbWluIG9mIGFsbCB2YWx1ZXMKKwkgICBDaGVjayBvbiAwOiBpZiAwLCBpdCBtZWFucyBpbml0aWFsIHZhbHVlIHNpbmNlIGRlbGF5IGNhbiBuZXZlciBiZSAwISEKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAocEN1cnJlbnRfVHNwZWNfSW5mby0+ZGVsYXlfYm91bmQpIHsKKwkJVHNwZWNJbmZvLmRlbGF5X2JvdW5kID0KKwkJCUNERl9NSU4ocEN1cnJlbnRfVHNwZWNfSW5mby0+ZGVsYXlfYm91bmQsCisJCQkJcElucHV0X1RzcGVjX0luZm8tPmRlbGF5X2JvdW5kKTsKKwl9IGVsc2UgeworCQlUc3BlY0luZm8uZGVsYXlfYm91bmQgPSBwSW5wdXRfVHNwZWNfSW5mby0+ZGVsYXlfYm91bmQ7CisJfQorCVRzcGVjSW5mby5tYXhfYnVyc3Rfc2l6ZSA9IENERl9NQVgocEN1cnJlbnRfVHNwZWNfSW5mby0+bWF4X2J1cnN0X3NpemUsCisJCQkJCSAgIHBJbnB1dF9Uc3BlY19JbmZvLT5tYXhfYnVyc3Rfc2l6ZSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICBOb21pbmFsIE1TRFUgc2l6ZSBhbHNvIGhhcyBhIGZpeGVkIGJpdCB0aGF0IG5lZWRzIHRvIGJlIGBoYW5kbGVkJyBiZWZvcmUKKwkgICBhZ2dyZWdhdGlvbgorCSAgIFRoaXMgY2FuIGJlIGhhbmRsZWQgb25seSBpZiBwcmV2aW91cyBzaXplIGlzIHRoZSBzYW1lIGFzIG5ldyBvciBib3RoIGhhdmUKKwkgICB0aGUgZml4ZWQgYml0IHNldAorCSAgIFRoZXNlIHNpemVzIGFyZSBub3QgYWRkZWQ6IGJ1dCBgbWF4ZWQnCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJVHNwZWNJbmZvLm5vbWluYWxfbXNkdV9zaXplID0KKwkJQ0RGX01BWChwQ3VycmVudF9Uc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZSAmIH5TTUVfUU9TXzE2QklUX01TQiwKKwkJCXBJbnB1dF9Uc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZSAmIH5TTUVfUU9TXzE2QklUX01TQik7CisKKwlpZiAoKChwQ3VycmVudF9Uc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZSA9PSAwKSB8fAorCSAgICAgKHBDdXJyZW50X1RzcGVjX0luZm8tPm5vbWluYWxfbXNkdV9zaXplICYgU01FX1FPU18xNkJJVF9NU0IpKSAmJgorCSAgICAoKHBJbnB1dF9Uc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZSA9PSAwKSB8fAorCSAgICAgKHBJbnB1dF9Uc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZSAmIFNNRV9RT1NfMTZCSVRfTVNCKSkpIHsKKwkJVHNwZWNJbmZvLm5vbWluYWxfbXNkdV9zaXplIHw9IFNNRV9RT1NfMTZCSVRfTVNCOworCX0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIERhdGEgcmF0ZXM6CisJICAgQWRkIHVwIHRoZSByYXRlcyBmb3IgYWdncmVnYXRpb24KKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlTTUVfUU9TX0JPVU5ERURfVTMyX0FERF9ZX1RPX1goVHNwZWNJbmZvLnBlYWtfZGF0YV9yYXRlLAorCQkJCSAgICAgICBwSW5wdXRfVHNwZWNfSW5mby0+cGVha19kYXRhX3JhdGUpOworCVNNRV9RT1NfQk9VTkRFRF9VMzJfQUREX1lfVE9fWChUc3BlY0luZm8ubWluX2RhdGFfcmF0ZSwKKwkJCQkgICAgICAgcElucHV0X1RzcGVjX0luZm8tPm1pbl9kYXRhX3JhdGUpOworCS8qIG1lYW4gZGF0YSByYXRlID0gcGVhayBkYXRhIHJhdGU6IGFnZ3JlZ2F0ZSB0byBiZSBmbGV4aWJsZSBvbiBhcHBzICAqLworCVNNRV9RT1NfQk9VTkRFRF9VMzJfQUREX1lfVE9fWChUc3BlY0luZm8ubWVhbl9kYXRhX3JhdGUsCisJCQkJICAgICAgIHBJbnB1dF9Uc3BlY19JbmZvLT5tZWFuX2RhdGFfcmF0ZSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICBTdXNwZW5zaW9uIGludGVydmFsIDogdGhpcyBpcyBzZXQgdG8gdGhlIGluYWN0aXZpdHkgaW50ZXJ2YWwgc2luY2UgcGVyCisJICAgc3BlYyBpdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gaW5hY3Rpdml0eSBpbnRlcnZhbAorCSAgIFRoaXMgaXMgbm90IHByb3ZpZGVkIGJ5IGFwcCBzaW5jZSB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCB0aGUgSENDQQorCSAgIG1vZGUgb2Ygb3BlcmF0aW9uCisJICAgQ3VycmVudGx5IHNldCBpdCB0byAwIHRvIGF2b2lkIGNvbmZ1c2lvbjogQ2lzY28gRVNFIG5lZWRzIH4wOyBzcGVjCisJICAgcmVxdWlyZXMgaW5hY3Rpdml0eSBpbnRlcnZhbCB0byBiZSA+IHN1c3BlbnNpb24gaW50ZXJ2YWw6IHRoaXMgY291bGQKKwkgICBiZSB0cmlja3khCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJVHNwZWNJbmZvLnN1c3BlbnNpb25faW50ZXJ2YWwgPSBwSW5wdXRfVHNwZWNfSW5mby0+c3VzcGVuc2lvbl9pbnRlcnZhbDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICBSZW1haW5pbmcgcGFyYW1ldGVycyBkbyBub3QgY29tZSBmcm9tIGFwcCBhcyB0aGV5IGFyZSB2ZXJ5IFdMQU4KKwkgICBhaXIgaW50ZXJmYWNlIHNwZWNpZmljCisJICAgU2V0IG1lYW5pbmdmdWwgdmFsdWVzIGhlcmUKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlUc3BlY0luZm8ubWVkaXVtX3RpbWUgPSAwOyAgICAgIC8qIHBlciBXTU0gc3BlYyAgICAgICAgICAgICAgICAgKi8KKwlUc3BlY0luZm8ubWluX3BoeV9yYXRlID0gU01FX1FPU19NSU5fUEhZX1JBVEU7CisJVHNwZWNJbmZvLnN2Y19zdGFydF90aW1lID0gMDsgICAvKiBhcmJpdHJhcnkgICAgICAgICAgICAgICAgICAqLworCVRzcGVjSW5mby5zdXJwbHVzX2J3X2FsbG93YW5jZSArPQorCQlwSW5wdXRfVHNwZWNfSW5mby0+c3VycGx1c19id19hbGxvd2FuY2U7CisJaWYgKFRzcGVjSW5mby5zdXJwbHVzX2J3X2FsbG93YW5jZSA+IFNNRV9RT1NfU1VSUExVU19CV19BTExPV0FOQ0UpIHsKKwkJVHNwZWNJbmZvLnN1cnBsdXNfYndfYWxsb3dhbmNlID0gU01FX1FPU19TVVJQTFVTX0JXX0FMTE9XQU5DRTsKKwl9CisJLyogU2V0IGFja19wb2xpY3kgdG8gYmxvY2sgYWNrIGV2ZW4gaWYgb25lIHN0cmVhbSByZXF1ZXN0cyBibG9jayBhY2sgcG9saWN5ICovCisJaWYgKChwSW5wdXRfVHNwZWNfSW5mby0+dHNfaW5mby5hY2tfcG9saWN5ID09CisJICAgICBTTUVfUU9TX1dNTV9UU19BQ0tfUE9MSUNZX0hUX0lNTUVESUFURV9CTE9DS19BQ0spCisJICAgIHx8IChwQ3VycmVudF9Uc3BlY19JbmZvLT50c19pbmZvLmFja19wb2xpY3kgPT0KKwkJU01FX1FPU19XTU1fVFNfQUNLX1BPTElDWV9IVF9JTU1FRElBVEVfQkxPQ0tfQUNLKSkgeworCQlUc3BlY0luZm8udHNfaW5mby5hY2tfcG9saWN5ID0KKwkJCVNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfSFRfSU1NRURJQVRFX0JMT0NLX0FDSzsKKwl9CisKKwlpZiAocElucHV0X1RzcGVjX0luZm8tPnRzX2luZm8uYnVyc3Rfc2l6ZV9kZWZuCisJICAgIHx8IHBDdXJyZW50X1RzcGVjX0luZm8tPnRzX2luZm8uYnVyc3Rfc2l6ZV9kZWZuKSB7CisJCVRzcGVjSW5mby50c19pbmZvLmJ1cnN0X3NpemVfZGVmbiA9IDE7CisJfQorCWlmIChwVXBkYXRlZF9Uc3BlY19JbmZvKSB7CisJCWNkZl9tZW1fY29weShwVXBkYXRlZF9Uc3BlY19JbmZvLCAmVHNwZWNJbmZvLAorCQkJICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworCX0gZWxzZSB7CisJCWNkZl9tZW1fY29weShwQ3VycmVudF9Uc3BlY19JbmZvLCAmVHNwZWNJbmZvLAorCQkJICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc191cGRhdGVfcGFyYW1zKCkgLSBVdGlsdGl0eSBmdW5jdGlvbiB0byB1cGRhdGUgdGhlIFRTUEVDCisgICBwYXJhbXMgcGVyIEFDLiBUeXBpY2FsIHVzYWdlIHdoaWxlIGRlbGV0aW5nIGZsb3dzIG9uIEFDIHdoaWNoIGlzIHJ1bm5pbmcKKyAgIG11bHRpcGxlIGZsb3dzCisKKyAgIFxwYXJhbSBzZXNzaW9uSWQgLSBTZXNzaW9uIHVwb24gd2hpY2ggdGhlIFRTUEVDIGlzIGJlaW5nIHVwZGF0ZWQKKyAgIFxwYXJhbSBhYyAtIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIEVEQ0EgQWNjZXNzIENhdGVnb3JpZXMuCisgICBccGFyYW0gdHNwZWNfbWFzayAtIG9uIHdoaWNoIHRzcGVjIHBlciBBQywgdGhlIHVwZGF0ZSBpcyByZXF1ZXN0ZWQKKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgQ0RGX1NUQVRVUyBzbWVfcW9zX3VwZGF0ZV9wYXJhbXModWludDhfdCBzZXNzaW9uSWQsCisJCQkJCXNtZV9Rb3NFZGNhQWNUeXBlIGFjLAorCQkJCQl1aW50OF90IHRzcGVjX21hc2ssCisJCQkJCXNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBUc3BlY19JbmZvKQoreworCXRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTCwgKnBOZXh0RW50cnkgPSBOVUxMOworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKwlzbWVfUW9zV21tVHNwZWNJbmZvIFRzcGVjX0luZm87CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCBmb3IgQUMgJWQgVFNQRUMgJWQiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkLCBhYywgdHNwZWNfbWFzayk7CisJaWYgKCFwVHNwZWNfSW5mbykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogb3V0cHV0IGlzIE5VTEwsIGNhbid0IGFnZ3JlZ2F0ZSIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJY2RmX21lbV96ZXJvKCZUc3BlY19JbmZvLCBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnNtZV9xb3NfY2IuZmxvd19saXN0LCBmYWxzZSk7CisJaWYgKCFwRW50cnkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IEZsb3cgTGlzdCBlbXB0eSwgbm90aGluZyB0byB1cGRhdGUiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKwlwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKwkvKiBpbml0IHRoZSBUUyBpbmZvIGZpZWxkICovCisJVHNwZWNfSW5mby50c19pbmZvLnVwID0KKwkJcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX21hc2sgLSAxXS50c19pbmZvLnVwOworCVRzcGVjX0luZm8udHNfaW5mby5wc2IgPQorCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfbWFzayAtIDFdLnRzX2luZm8ucHNiOworCVRzcGVjX0luZm8udHNfaW5mby50aWQgPQorCQlwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfbWFzayAtIDFdLnRzX2luZm8udGlkOworCXdoaWxlIChwRW50cnkpIHsKKwkJcE5leHRFbnRyeSA9IGNzcl9sbF9uZXh0KCZzbWVfcW9zX2NiLmZsb3dfbGlzdCwgcEVudHJ5LCBmYWxzZSk7CisJCWZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJCWlmICgoc2Vzc2lvbklkID09IGZsb3dfaW5mby0+c2Vzc2lvbklkKSAmJgorCQkgICAgKGFjID09IGZsb3dfaW5mby0+YWNfdHlwZSkgJiYKKwkJICAgICh0c3BlY19tYXNrID09IGZsb3dfaW5mby0+dHNwZWNfbWFzaykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgICIlczogJWQ6IEZsb3cgJWQgbWF0Y2hlcyIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKworCQkJaWYgKChTTUVfUU9TX1JFQVNPTl9SRUxFQVNFID09IGZsb3dfaW5mby0+cmVhc29uKSB8fAorCQkJICAgIChTTUVfUU9TX1JFQVNPTl9NT0RJRlkgPT0gZmxvd19pbmZvLT5yZWFzb24pKSB7CisJCQkJLyogbXNnICovCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJCSAgIiVzOiAlZDogU2tpcHBpbmcgRmxvdyAlZCBhcyBpdCBpcyBtYXJrZWQgIgorCQkJCQkgICJmb3IgcmVsZWFzZS9tb2RpZnkiLCBfX2Z1bmNfXywKKwkJCQkJICBfX0xJTkVfXywgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworCQkJfSBlbHNlCisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJCSAgICAoc21lX3Fvc19hZ2dyZWdhdGVfcGFyYW1zCisJCQkJCSAgICAoJmZsb3dfaW5mby0+UW9TSW5mbywgJlRzcGVjX0luZm8sIE5VTEwpKSkgeworCQkJCS8qIGVyciBtc2cgKi8KKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgICIlczogJWQ6IHNtZV9xb3NfYWdncmVnYXRlX3BhcmFtcygpIGZhaWxlZCIsCisJCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJCX0KKwkJfQorCQlwRW50cnkgPSBwTmV4dEVudHJ5OworCX0KKwkvKiByZXR1cm4gdGhlIGFnZ3JlZ2F0ZSAqLworCSpwVHNwZWNfSW5mbyA9IFRzcGVjX0luZm87CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9xb3NfYWNfdG9fdXAoKSAtIFV0aWx0aXR5IGZ1bmN0aW9uIHRvIG1hcCBhbiBBQyB0byBVUAorICAgTm90ZTogdGhlcmUgaXMgYSBxdWFudGl6YXRpb24gbG9zcyBoZXJlIGJlY2F1c2UgNCBBQ3MgYXJlIG1hcHBlZCB0byA4IFVQcworICAgTWFwcGluZyBpcyBkb25lIGZvciBjb25zaXN0ZW5jeQorICAgXHBhcmFtIGFjIC0gRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgRURDQSBBY2Nlc3MgQ2F0ZWdvcmllcy4KKyAgIFxyZXR1cm4gYW4gVXNlciBQcmlvcml0eQorCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc21lX1Fvc1dtbVVwVHlwZSBzbWVfcW9zX2FjX3RvX3VwKHNtZV9Rb3NFZGNhQWNUeXBlIGFjKQoreworCXNtZV9Rb3NXbW1VcFR5cGUgdXAgPSBTTUVfUU9TX1dNTV9VUF9NQVg7CisJaWYgKGFjID49IDAgJiYgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYKSB7CisJCXVwID0gc21lX3Fvc19hX2N0b191cF9tYXBbYWNdOworCX0KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKwkJICAiJXM6ICVkOiBhYyA9ICVkIHVwID0gJWQgcmV0dXJuZWQiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgYWMsIHVwKTsKKwlyZXR1cm4gdXA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfcW9zX3VwX3RvX2FjKCkgLSBVdGlsdGl0eSBmdW5jdGlvbiB0byBtYXAgYW4gVVAgdG8gQUMKKyAgIFxwYXJhbSB1cCAtIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIFVzZXIgcHJpb3JpdGllcyAoVVApLgorICAgXHJldHVybiBhbiBBY2Nlc3MgQ2F0ZWdvcnkKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3NtZV9Rb3NFZGNhQWNUeXBlIHNtZV9xb3NfdXBfdG9fYWMoc21lX1Fvc1dtbVVwVHlwZSB1cCkKK3sKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYyA9IFNNRV9RT1NfRURDQV9BQ19NQVg7CisJaWYgKHVwID49IDAgJiYgdXAgPCBTTUVfUU9TX1dNTV9VUF9NQVgpIHsKKwkJYWMgPSBzbWVfcW9zX3VfcHRvX2FjX21hcFt1cF07CisJfQorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkgICIlczogJWQ6IHVwID0gJWQgYWMgPSAlZCByZXR1cm5lZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCB1cCwgYWMpOworCXJldHVybiBhYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9xb3Nfc3RhdGVfdHJhbnNpdGlvbigpIC0gVGhlIHN0YXRlIHRyYW5zaXRpb24gZnVuY3Rpb24gcGVyIEFDLiBXZQorICAgc2F2ZSB0aGUgcHJldmlvdXMgc3RhdGUgYWxzby4KKyAgIFxwYXJhbSBzZXNzaW9uSWQgLSBTZXNzaW9uIHVwb24gd2hpY2ggdGhlIHN0YXRlIG1hY2hpbmUgaXMgcnVubmluZworICAgXHBhcmFtIGFjIC0gRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgRURDQSBBY2Nlc3MgQ2F0ZWdvcmllcy4KKyAgIFxwYXJhbSBuZXdfc3RhdGUgLSBUaGUgc3RhdGUgRlNNIGlzIG1vdmluZyB0by4KKworICAgXHJldHVybiBOb25lCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBzbWVfcW9zX3N0YXRlX3RyYW5zaXRpb24odWludDhfdCBzZXNzaW9uSWQsCisJCQkJICAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYywKKwkJCQkgICAgIHNtZV9Rb3NTdGF0ZXMgbmV3X3N0YXRlKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlwU2Vzc2lvbiA9ICZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisJcEFDSW5mby0+cHJldl9zdGF0ZSA9IHBBQ0luZm8tPmN1cnJfc3RhdGU7CisJcEFDSW5mby0+Y3Vycl9zdGF0ZSA9IG5ld19zdGF0ZTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBuZXcgc3RhdGU9JWQsIG9sZCBzdGF0ZT0lZCwgZm9yIEFDPSVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sCisJCSAgc2Vzc2lvbklkLCBwQUNJbmZvLT5jdXJyX3N0YXRlLCBwQUNJbmZvLT5wcmV2X3N0YXRlLCBhYyk7Cit9CisKKy8qKgorICogc21lX3Fvc19maW5kX2luX2Zsb3dfbGlzdCgpIC0gZmluZCBhIGZsb3cgZW50cnkgZnJvbSB0aGUgZmxvdyBsaXN0CisgKiBAc2VhcmNoX2tleTogV2UgY2FuIGVpdGhlciB1c2UgdGhlIGZsb3dJRCBvciB0aGUgYWMgdHlwZSB0byBmaW5kIHRoZQorICogICAgICAgICAgICAgIGVudHJ5IGluIHRoZSBmbG93IGxpc3QuCisgKiAgICAgICAgICAgICAgQSBiaXRtYXAgaW4gc21lX1Fvc1NlYXJjaEluZm8gdGVsbHMgd2hpY2gga2V5IHRvIHVzZS4KKyAqICAgICAgICAgICAgICBTdGFydGluZyBmcm9tIExTQiwKKyAqICAgICAgICAgICAgICBiaXQgMCAtIEZsb3cgSUQKKyAqICAgICAgICAgICAgICBiaXQgMSAtIEFDIHR5cGUKKyAqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZpbmQgYW4gZmxvdyBlbnRyeSBmcm9tIHRoZSBmbG93X2xpc3QuCisgKgorICogUmV0dXJuOiBwb2ludGVyIHRvIHRoZSBsaXN0IGVsZW1lbnQKKyAqLwordExpc3RFbGVtICpzbWVfcW9zX2ZpbmRfaW5fZmxvd19saXN0KHNtZV9Rb3NTZWFyY2hJbmZvIHNlYXJjaF9rZXkpCit7CisJdExpc3RFbGVtICpsaXN0X2VsdCA9IE5VTEwsICpsaXN0X25leHRfZWx0ID0gTlVMTDsKKwlzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKworCWxpc3RfZWx0ID0gY3NyX2xsX3BlZWtfaGVhZCgmc21lX3Fvc19jYi5mbG93X2xpc3QsIGZhbHNlKTsKKwlpZiAoIWxpc3RfZWx0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiRmxvdyBMaXN0IGVtcHR5LCBjYW4ndCBzZWFyY2giKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXdoaWxlIChsaXN0X2VsdCkgeworCQlsaXN0X25leHRfZWx0ID0gY3NyX2xsX25leHQoJnNtZV9xb3NfY2IuZmxvd19saXN0LCBsaXN0X2VsdCwKKwkJCQkJICAgIGZhbHNlKTsKKwkJZmxvd19pbmZvID0gR0VUX0JBU0VfQUREUihsaXN0X2VsdCwgc21lX1Fvc0Zsb3dJbmZvRW50cnksIGxpbmspOworCisJCWlmICgoc2VhcmNoX2tleS5zZXNzaW9uSWQgIT0gZmxvd19pbmZvLT5zZXNzaW9uSWQpICYmCisJCSAgICAoc2VhcmNoX2tleS5zZXNzaW9uSWQgIT0gU01FX1FPU19TRUFSQ0hfU0VTU0lPTl9JRF9BTlkpKSB7CisJCQlsaXN0X2VsdCA9IGxpc3RfbmV4dF9lbHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzZWFyY2hfa2V5LmluZGV4ICYgU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzEpIHsKKwkJCWlmIChzZWFyY2hfa2V5LmtleS5Rb3NGbG93SUQgPT0gZmxvd19pbmZvLT5Rb3NGbG93SUQpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgRkwoIm1hdGNoIGZvdW5kIG9uIGZsb3dJRCwgZW5kaW5nIHNlYXJjaCIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIGlmIChzZWFyY2hfa2V5LmluZGV4ICYgU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzIpIHsKKwkJCWlmIChzZWFyY2hfa2V5LmtleS5hY190eXBlID09IGZsb3dfaW5mby0+YWNfdHlwZSkgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkJICBGTCgibWF0Y2ggZm91bmQgb24gYWMsIGVuZGluZyBzZWFyY2giKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoc2VhcmNoX2tleS5pbmRleCAmIFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8zKSB7CisJCQlpZiAoc2VhcmNoX2tleS5rZXkucmVhc29uID09IGZsb3dfaW5mby0+cmVhc29uKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgIEZMKCJtYXRjaCBmb3VuZCBvbiByZWFzb24sIGVuZGluZyBzZWFyY2giKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoc2VhcmNoX2tleS5pbmRleCAmIFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF80KSB7CisJCQlpZiAoKHNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPT0gZmxvd19pbmZvLT5hY190eXBlKSAmJgorCQkJICAgIChzZWFyY2hfa2V5LmRpcmVjdGlvbiA9PQorCQkJCWZsb3dfaW5mby0+UW9TSW5mby50c19pbmZvLmRpcmVjdGlvbikpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCSAgRkwoIm1hdGNoIGZvdW5kIG9uIHJlYXNvbiwgZW5kaW5nIHNlYXJjaCIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlsaXN0X2VsdCA9IGxpc3RfbmV4dF9lbHQ7CisJfQorCXJldHVybiBsaXN0X2VsdDsKK30KKworLyoqCisgKiBzbWVfcW9zX2ZpbmRfYWxsX2luX2Zsb3dfbGlzdCgpIC0gZmluZCBhIGZsb3cgZW50cnkgaW4gdGhlIGZsb3cgbGlzdAorICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dAorICogQHNlYXJjaF9rZXk6IHNlYXJjaCBrZXkKKyAqIEBmbnA6IGZ1bmN0aW9uIHBvaW50ZXIgc3BlY2lmeWluZyB0aGUgYWN0aW9uIHR5cGUgZm9yIHRoZSBlbnRyeSBmb3VuZAorICoKKyAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCBhbiBmbG93IGVudHJ5IGZyb20gdGhlIGZsb3dfbGlzdCAmIGFjdCBvbiBpdC4KKyAqIHNlYXJjaF9rZXkgLSAgV2UgY2FuIGVpdGhlciB1c2UgdGhlIGZsb3dJRCBvciB0aGUgYWMgdHlwZSB0byBmaW5kIHRoZQorICogICBlbnRyeSBpbiB0aGUgZmxvdyBsaXN0LgorICogIEEgYml0bWFwIGluIHNtZV9Rb3NTZWFyY2hJbmZvIHRlbGxzIHdoaWNoIGtleSB0byB1c2UuIFN0YXJ0aW5nIGZyb20gTFNCLAorICogIGJpdCAwIC0gRmxvdyBJRAorICogIGJpdCAxIC0gQUMgdHlwZQorICoKKyAqIFJldHVybjogTm9uZQorICovCitDREZfU1RBVFVTIHNtZV9xb3NfZmluZF9hbGxfaW5fZmxvd19saXN0KHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJCSBzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5LAorCQkJCQkgc21lX1Fvc1Byb2Nlc3NTZWFyY2hFbnRyeSBmbnApCit7CisJdExpc3RFbGVtICpsaXN0X2VsdCA9IE5VTEwsICpsaXN0X25leHRfZWx0ID0gTlVMTDsKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnFvc19zZXNzaW9uOworCXNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJc21lX1Fvc0VkY2FBY1R5cGUgYWNfdHlwZTsKKworCWxpc3RfZWx0ID0gY3NyX2xsX3BlZWtfaGVhZCgmc21lX3Fvc19jYi5mbG93X2xpc3QsIGZhbHNlKTsKKwlpZiAoIWxpc3RfZWx0KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICBGTCgiRmxvdyBMaXN0IGVtcHR5LCBjYW4ndCBzZWFyY2giKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwl3aGlsZSAobGlzdF9lbHQpIHsKKwkJbGlzdF9uZXh0X2VsdCA9IGNzcl9sbF9uZXh0KCZzbWVfcW9zX2NiLmZsb3dfbGlzdCwgbGlzdF9lbHQsCisJCQkJCSAgICBmYWxzZSk7CisJCWZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIobGlzdF9lbHQsIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rKTsKKwkJcW9zX3Nlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tmbG93X2luZm8tPnNlc3Npb25JZF07CisJCWlmICgoc2VhcmNoX2tleS5zZXNzaW9uSWQgIT0gZmxvd19pbmZvLT5zZXNzaW9uSWQpICYmCisJCSAgICAoc2VhcmNoX2tleS5zZXNzaW9uSWQgIT0gU01FX1FPU19TRUFSQ0hfU0VTU0lPTl9JRF9BTlkpKSB7CisJCQlsaXN0X2VsdCA9IGxpc3RfbmV4dF9lbHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoc2VhcmNoX2tleS5pbmRleCAmIFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8xKSAmJgorCQkgICAgKHNlYXJjaF9rZXkua2V5LlFvc0Zsb3dJRCA9PSBmbG93X2luZm8tPlFvc0Zsb3dJRCkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgICBGTCgibWF0Y2ggZm91bmQgb24gZmxvd0lELCBlbmRpbmcgc2VhcmNoIikpOworCQkJc3RhdHVzID0gZm5wKG1hY19jdHgsIGxpc3RfZWx0KTsKKwkJCWlmIChDREZfU1RBVFVTX0VfRkFJTFVSRSA9PSBzdGF0dXMpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJICAgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICAgRkwoIkZhaWxlZCB0byBwcm9jZXNzIGVudHJ5IikpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKChzZWFyY2hfa2V5LmluZGV4ICYgU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzIpICYmCisJCQkgICAoc2VhcmNoX2tleS5rZXkuYWNfdHlwZSA9PSBmbG93X2luZm8tPmFjX3R5cGUpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICAgRkwoIm1hdGNoIGZvdW5kIG9uIGFjLCBlbmRpbmcgc2VhcmNoIikpOworCQkJYWNfdHlwZSA9IGZsb3dfaW5mby0+YWNfdHlwZTsKKwkJCWZsb3dfaW5mby0+aG9SZW5ld2FsID0KKwkJCQlxb3Nfc2Vzc2lvbi0+YWNfaW5mb1thY190eXBlXS5ob1JlbmV3YWw7CisJCQlzdGF0dXMgPSBmbnAobWFjX2N0eCwgbGlzdF9lbHQpOworCQkJaWYgKENERl9TVEFUVVNfRV9GQUlMVVJFID09IHN0YXR1cykgeworCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkgICAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgICBGTCgiRmFpbGVkIHRvIHByb2Nlc3MgZW50cnkiKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbGlzdF9lbHQgPSBsaXN0X25leHRfZWx0OworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19pc19hY20oKSAtIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBwYXJ0aWN1bGFyIEFDCisgICBtYW5kYXRlcyBBZG1pc3Npb24gQ29udHJvbC4KKyAgIFxwYXJhbSBhYyAtIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIEVEQ0EgQWNjZXNzIENhdGVnb3JpZXMuCisKKyAgIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgQUMgbWFuZGF0ZXMgQWRtaXNzaW9uIENvbnRyb2wKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Jvb2wgc21lX3Fvc19pc19hY20odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKwkJICAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworCWJvb2wgcmV0X3ZhbCA9IGZhbHNlOworCXREb3QxMWZCZWFjb25JRXMgKnBJZXNMb2NhbDsKKwlpZiAoIXBTaXJCc3NEZXNjKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBwU2lyQnNzRGVzYyBpcyBOVUxMIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChOVUxMICE9IHBJZXMpIHsKKwkJLyogSUVzIHdlcmUgcHJvdmlkZWQgc28gdXNlIHRoZW0gbG9jYWxseSAqLworCQlwSWVzTG9jYWwgPSBwSWVzOworCX0gZWxzZSB7CisJCS8qIElFcyB3ZXJlIG5vdCBwcm92aWRlZCBzbyBwYXJzZSB0aGVtIG91cnNlbHZlcyAqLworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJICAgIChjc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzCisJCQkJICAgIChwTWFjLCBwU2lyQnNzRGVzYywgJnBJZXNMb2NhbCkpKSB7CisJCQkvKiBlcnIgbXNnICovCisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IGNzcl9nZXRfcGFyc2VkX2Jzc19kZXNjcmlwdGlvbl9pZXMoKSBmYWlsZWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qIGlmIHN1Y2Nlc3MgdGhlbiBwSWVzTG9jYWwgd2FzIGFsbG9jYXRlZCAqLworCX0KKworCWlmIChDU1JfSVNfUU9TX0JTUyhwSWVzTG9jYWwpKSB7CisJCXN3aXRjaCAoYWMpIHsKKwkJY2FzZSBTTUVfUU9TX0VEQ0FfQUNfQkU6CisJCQlpZiAocEllc0xvY2FsLT5XTU1QYXJhbXMuYWNiZV9hY20pCisJCQkJcmV0X3ZhbCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBTTUVfUU9TX0VEQ0FfQUNfQks6CisJCQlpZiAocEllc0xvY2FsLT5XTU1QYXJhbXMuYWNia19hY20pCisJCQkJcmV0X3ZhbCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBTTUVfUU9TX0VEQ0FfQUNfVkk6CisJCQlpZiAocEllc0xvY2FsLT5XTU1QYXJhbXMuYWN2aV9hY20pCisJCQkJcmV0X3ZhbCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBTTUVfUU9TX0VEQ0FfQUNfVk86CisJCQlpZiAocEllc0xvY2FsLT5XTU1QYXJhbXMuYWN2b19hY20pCisJCQkJcmV0X3ZhbCA9IHRydWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiAlZDogdW5rbm93biBBQyA9ICVkIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgYWMpOworCQkJLyogQXNzZXJ0ICovCisJCQlDREZfQVNTRVJUKDApOworCQkJYnJlYWs7CisJCX0KKwl9IC8qIElTX1FPU19CU1MgKi8KKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogQUNNID0gJWQgZm9yIEFDID0gJWQiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgcmV0X3ZhbCwgYWMpOworCWlmIChOVUxMID09IHBJZXMpIHsKKwkJLyogSUVzIHdlcmUgYWxsb2NhdGVkIGxvY2FsbHkgc28gZnJlZSB0aGVtICovCisJCWNkZl9tZW1fZnJlZShwSWVzTG9jYWwpOworCX0KKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCisgKiBzbWVfcW9zX2J1ZmZlcl9leGlzdGluZ19mbG93cygpIC0gYnVmZmVyIGV4aXN0aW5nIGZsb3dzIGluIGZsb3dfbGlzdAorICogQG1hY19jdHg6IGdsb2JhbCBNQUMgY29udGV4dAorICogQHNlc3Npb25pZDogc2Vzc2lvbiBJRAorICoKKyAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gYnVmZmVyIHRoZSBleGlzdGluZyBmbG93cyBpbiBmbG93X2xpc3QsCisgKiBzbyB0aGF0IHdlIGNhbiByZW5ldyB0aGVtIGFmdGVyIGhhbmRvZmYgaXMgZG9uZS4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworc3RhdGljIENERl9TVEFUVVMgc21lX3Fvc19idWZmZXJfZXhpc3RpbmdfZmxvd3ModHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkJCXVpbnQ4X3Qgc2Vzc2lvbmlkKQoreworCXRMaXN0RWxlbSAqbGlzdF9lbnRyeSA9IE5VTEwsICpsaXN0X25leHRlbnRyeSA9IE5VTEw7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpxb3Nfc2Vzc2lvbjsKKwlzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKwlzbWVfUW9zQ21kSW5mbyBjbWQ7CisJc21lX3Fvc19zZXR1cENtZEluZm8gKnNldHVwaW5mbzsKKworCWxpc3RfZW50cnkgPSBjc3JfbGxfcGVla19oZWFkKCZzbWVfcW9zX2NiLmZsb3dfbGlzdCwgZmFsc2UpOworCWlmICghbGlzdF9lbnRyeSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJGbG93IExpc3QgZW1wdHksIG5vdGhpbmcgdG8gYnVmZmVyIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJd2hpbGUgKGxpc3RfZW50cnkpIHsKKwkJbGlzdF9uZXh0ZW50cnkgPSBjc3JfbGxfbmV4dCgmc21lX3Fvc19jYi5mbG93X2xpc3QsIGxpc3RfZW50cnksCisJCQkJCSAgICAgZmFsc2UpOworCQlmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKGxpc3RfZW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LAorCQkJCQkgIGxpbmspOworCQlpZiAoZmxvd19pbmZvLT5zZXNzaW9uSWQgIT0gc2Vzc2lvbmlkKSB7CisJCQlsaXN0X2VudHJ5ID0gbGlzdF9uZXh0ZW50cnk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1MgPT0gZmxvd19pbmZvLT5yZWFzb24pIHx8CisJCSAgICAoU01FX1FPU19SRUFTT05fU0VUVVAgPT0gZmxvd19pbmZvLT5yZWFzb24pKSB7CisJCQljbWQuY29tbWFuZCA9IFNNRV9RT1NfU0VUVVBfUkVROworCQkJY21kLnBNYWMgPSBtYWNfY3R4OworCQkJY21kLnNlc3Npb25JZCA9IHNlc3Npb25pZDsKKwkJCXNldHVwaW5mbyA9ICZjbWQudS5zZXR1cENtZEluZm87CisKKwkJCXNldHVwaW5mby0+SEREY29udGV4dCA9IGZsb3dfaW5mby0+SEREY29udGV4dDsKKwkJCXNldHVwaW5mby0+UW9TSW5mbyA9IGZsb3dfaW5mby0+UW9TSW5mbzsKKwkJCXNldHVwaW5mby0+UW9TQ2FsbGJhY2sgPSBmbG93X2luZm8tPlFvU0NhbGxiYWNrOworCQkJLyogc2hvdWxkbid0IGJlIG5lZWRlZCAqLworCQkJc2V0dXBpbmZvLT5VUFR5cGUgPSBTTUVfUU9TX1dNTV9VUF9NQVg7CisJCQlzZXR1cGluZm8tPlFvc0Zsb3dJRCA9IGZsb3dfaW5mby0+UW9zRmxvd0lEOworCQkJaWYgKFNNRV9RT1NfUkVBU09OX1NFVFVQID09IGZsb3dfaW5mby0+cmVhc29uKQorCQkJCXNldHVwaW5mby0+aG9SZW5ld2FsID0gZmFsc2U7CisJCQllbHNlCisJCQkJc2V0dXBpbmZvLT5ob1JlbmV3YWwgPSB0cnVlOworCisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUworCQkJCSAgICAoc21lX3Fvc19idWZmZXJfY21kKCZjbWQsIHRydWUpKSkKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgIEZMKCJjb3VsZG4ndCBidWZmZXIgdGhlIHNldHVwIHJlcXVlc3QiCisJCQkJCSAgIiBmb3IgZmxvdyAlZCBpbiBoYW5kb2ZmIHN0YXRlIiksCisJCQkJCSAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworCQkJZWxzZQorCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCQkgIEZMKCJidWZmZXJlZCBhIHNldHVwIHJlcXVlc3QgZm9yICIKKwkJCQkJICAiZmxvdyAlZCBpbiBoYW5kb2ZmIHN0YXRlIiksCisJCQkJCSAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworCQl9IGVsc2UgaWYgKFNNRV9RT1NfUkVBU09OX1JFTEVBU0UgPT0gZmxvd19pbmZvLT5yZWFzb24pIHsKKwkJCWNtZC5jb21tYW5kID0gU01FX1FPU19SRUxFQVNFX1JFUTsKKwkJCWNtZC5wTWFjID0gbWFjX2N0eDsKKwkJCWNtZC5zZXNzaW9uSWQgPSBzZXNzaW9uaWQ7CisJCQljbWQudS5yZWxlYXNlQ21kSW5mby5Rb3NGbG93SUQgPSBmbG93X2luZm8tPlFvc0Zsb3dJRDsKKwkJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTCisJCQkJICAgIChzbWVfcW9zX2J1ZmZlcl9jbWQoJmNtZCwgdHJ1ZSkpKQorCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJCSAgRkwoImNvdWxkbid0IGJ1ZmZlciB0aGUgcmVsZWFzZSByZXEiCisJCQkJCSAgIiBmb3IgZmxvdyAlZCBpbiBoYW5kb2ZmIHN0YXRlIiksCisJCQkJCSAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworCQkJZWxzZQorCQkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQkJICBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJCQkgIEZMKCJidWZmZXJlZCBhIHJlbGVhc2UgcmVxdWVzdCBmb3IgIgorCQkJCQkgICJmbG93ICVkIGluIGhhbmRvZmYgc3RhdGUiKSwKKwkJCQkJICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisJCX0gZWxzZSBpZiAoU01FX1FPU19SRUFTT05fTU9ESUZZX1BFTkRJTkcgPT0KKwkJCSAgIGZsb3dfaW5mby0+cmVhc29uKSB7CisJCQljbWQuY29tbWFuZCA9IFNNRV9RT1NfTU9ESUZZX1JFUTsKKwkJCWNtZC5wTWFjID0gbWFjX2N0eDsKKwkJCWNtZC5zZXNzaW9uSWQgPSBzZXNzaW9uaWQ7CisJCQljbWQudS5tb2RpZnlDbWRJbmZvLlFvc0Zsb3dJRCA9IGZsb3dfaW5mby0+UW9zRmxvd0lEOworCQkJY21kLnUubW9kaWZ5Q21kSW5mby5Rb1NJbmZvID0gZmxvd19pbmZvLT5Rb1NJbmZvOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MKKwkJCQkgICAgKHNtZV9xb3NfYnVmZmVyX2NtZCgmY21kLCB0cnVlKSkpCisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTCgiY291bGRuJ3QgYnVmZmVyIHRoZSBtb2RpZnkgcmVxIgorCQkJCQkgICIgZm9yIGZsb3cgJWQgaW4gaGFuZG9mZiBzdGF0ZSIpLAorCQkJCQkgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKwkJCWVsc2UKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkJICBGTCgiYnVmZmVyZWQgYSBtb2RpZnkgcmVxdWVzdCBmb3IgIgorCQkJCQkgICJmbG93ICVkIGluIGhhbmRvZmYgc3RhdGUiKSwKKwkJCQkJICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisJCX0KKwkJLyogZGVsZXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdCAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJEZWxldGluZyBvcmlnaW5hbCBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIpLAorCQkJICBmbG93X2luZm8sIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKwkJY3NyX2xsX3JlbW92ZV9lbnRyeSgmc21lX3Fvc19jYi5mbG93X2xpc3QsIGxpc3RfZW50cnksIHRydWUpOworCQljZGZfbWVtX2ZyZWUoZmxvd19pbmZvKTsKKworCQlsaXN0X2VudHJ5ID0gbGlzdF9uZXh0ZW50cnk7CisJfQorCXFvc19zZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbmlkXTsKKwlxb3Nfc2Vzc2lvbi0+dWFwc2RBbHJlYWR5UmVxdWVzdGVkID0gZmFsc2U7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9xb3NfZGVsZXRlX2V4aXN0aW5nX2Zsb3dzKCkgLSBVdGlsaXR5IGZ1bmN0aW9uIHRvIERlbGV0ZSB0aGUgZXhpc3RpbmcKKyAgIGZsb3dzIGluIGZsb3dfbGlzdCwgaWYgd2UgbG9zdCBjb25uZWN0aXZpdHkuCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIENERl9TVEFUVVMgc21lX3Fvc19kZWxldGVfZXhpc3RpbmdfZmxvd3ModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCXVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTCwgKnBOZXh0RW50cnkgPSBOVUxMOworCXNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnNtZV9xb3NfY2IuZmxvd19saXN0LCB0cnVlKTsKKwlpZiAoIXBFbnRyeSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICAiJXM6ICVkOiBGbG93IExpc3QgZW1wdHksIG5vdGhpbmcgdG8gZGVsZXRlIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwl3aGlsZSAocEVudHJ5KSB7CisJCXBOZXh0RW50cnkgPSBjc3JfbGxfbmV4dCgmc21lX3Fvc19jYi5mbG93X2xpc3QsIHBFbnRyeSwgdHJ1ZSk7CisJCWZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJCWlmIChmbG93X2luZm8tPnNlc3Npb25JZCA9PSBzZXNzaW9uSWQpIHsKKwkJCWlmICgoU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1MgPT0gZmxvd19pbmZvLT5yZWFzb24pIHx8CisJCQkgICAgKFNNRV9RT1NfUkVBU09OX1NFVFVQID09IGZsb3dfaW5mby0+cmVhc29uKSB8fAorCQkJICAgIChTTUVfUU9TX1JFQVNPTl9SRUxFQVNFID09IGZsb3dfaW5mby0+cmVhc29uKSB8fAorCQkJICAgIChTTUVfUU9TX1JFQVNPTl9NT0RJRlkgPT0gZmxvd19pbmZvLT5yZWFzb24pKSB7CisJCQkJZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLAorCQkJCQkJICAgICAgIGZsb3dfaW5mby0+SEREY29udGV4dCwKKwkJCQkJCSAgICAgICBOVUxMLAorCQkJCQkJICAgICAgIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUU9TX0xPU1RfSU5ELAorCQkJCQkJICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKwkJCX0KKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCQkgICIlczogJWQ6IERlbGV0aW5nIGVudHJ5IGF0ICVwIHdpdGggZmxvd0lEICVkIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkgIGZsb3dfaW5mbywgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworCQkJLyogZGVsZXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdCAqLworCQkJY3NyX2xsX3JlbW92ZV9lbnRyeSgmc21lX3Fvc19jYi5mbG93X2xpc3QsIHBFbnRyeSwKKwkJCQkJICAgIHRydWUpOworCQkJY2RmX21lbV9mcmVlKGZsb3dfaW5mbyk7CisJCX0KKwkJcEVudHJ5ID0gcE5leHRFbnRyeTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzbWVfcW9zX2J1ZmZlcl9jbWQoKSAtIGJ1ZmZlciBhIHJlcXVlc3QuCisgKiBAcGNtZDogYSBwb2ludGVyIHRvIHRoZSBjbWQgc3RydWN0dXJlIHRvIGJlIHNhdmVkIGluc2lkZSB0aGUgYnVmZmVyZWQKKyAqICAgICAgICAgICAgICAgY21kIGxpbmsgbGlzdAorICogQGluc2VydF9oZWFkOiBmbGFnIGluZGljYXRlIGlmIGNtZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGxpc3QgaGVhZC4KKyAqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGJ1ZmZlciBhIHJlcXVlc3QgKHNldHVwL21vZGlmeS9yZWxlYXNlKSBmcm9tIGNsaWVudAorICogd2hpbGUgcHJvY2Vzc2luZyBhbm90aGVyIG9uZSBvbiB0aGUgc2FtZSBBQy4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfcW9zX2J1ZmZlcl9jbWQoc21lX1Fvc0NtZEluZm8gKnBjbWQsIGJvb2wgaW5zZXJ0X2hlYWQpCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwlzbWVfUW9zQ21kSW5mb0VudHJ5ICpwZW50cnkgPSBOVUxMOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBJbnZva2VkIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlwZW50cnkgPQorCQkoc21lX1Fvc0NtZEluZm9FbnRyeSAqKSBjZGZfbWVtX21hbGxvYyhzaXplb2Yoc21lX1Fvc0NtZEluZm9FbnRyeSkpOworCWlmICghcGVudHJ5KSB7CisJCS8qIGVyciBtc2cgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwkvKiBjb3B5IHRoZSBlbnRpcmUgQ21kSW5mbyAqLworCXBlbnRyeS0+Y21kSW5mbyA9ICpwY21kOworCisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1twY21kLT5zZXNzaW9uSWRdOworCWlmIChpbnNlcnRfaGVhZCkgeworCQljc3JfbGxfaW5zZXJ0X2hlYWQoJnBTZXNzaW9uLT5idWZmZXJlZENvbW1hbmRMaXN0LCAmcGVudHJ5LT5saW5rLAorCQkJCSAgIHRydWUpOworCX0gZWxzZSB7CisJCWNzcl9sbF9pbnNlcnRfdGFpbCgmcFNlc3Npb24tPmJ1ZmZlcmVkQ29tbWFuZExpc3QsICZwZW50cnktPmxpbmssCisJCQkJICAgdHJ1ZSk7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3Fvc19wcm9jZXNzX2J1ZmZlcmVkX2NtZCgpIC0gcHJvY2VzcyBxb3MgYnVmZmVyZWQgcmVxdWVzdAorICogQHNlc3Npb25faWQ6IFNlc3Npb24gSUQKKyAqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByb2Nlc3MgYSBidWZmZXJlZCByZXF1ZXN0IChzZXR1cC9tb2RpZnkvcmVsZWFzZSkKKyAqIGluaXRpYWxseSBjYW1lIGZyb20gdGhlIGNsaWVudC4KKyAqCisgKiBSZXR1cm46Q0RGX1NUQVRVUworICovCitzdGF0aWMgQ0RGX1NUQVRVUyBzbWVfcW9zX3Byb2Nlc3NfYnVmZmVyZWRfY21kKHVpbnQ4X3Qgc2Vzc2lvbl9pZCkKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnFvc19zZXNzaW9uOworCXNtZV9Rb3NDbWRJbmZvRW50cnkgKnBjbWQgPSBOVUxMOworCXRMaXN0RWxlbSAqbGlzdF9lbHQgPSBOVUxMOworCXNtZV9Rb3NTdGF0dXNUeXBlIGhkZF9zdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDsKKwlDREZfU1RBVFVTIGNkZl9yZXRfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXNtZV9Rb3NDbWRJbmZvICpxb3NfY21kID0gTlVMTDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICBGTCgiSW52b2tlZCBvbiBzZXNzaW9uICVkIiksIHNlc3Npb25faWQpOworCXFvc19zZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbl9pZF07CisJaWYgKCFjc3JfbGxfaXNfbGlzdF9lbXB0eSgmcW9zX3Nlc3Npb24tPmJ1ZmZlcmVkQ29tbWFuZExpc3QsIGZhbHNlKSkgeworCQlsaXN0X2VsdCA9IGNzcl9sbF9yZW1vdmVfaGVhZCgmcW9zX3Nlc3Npb24tPmJ1ZmZlcmVkQ29tbWFuZExpc3QsCisJCQkJCSAgICAgIHRydWUpOworCQlpZiAoIWxpc3RfZWx0KSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgIEZMKCJubyBtb3JlIGJ1ZmZlcmVkIGNvbW1hbmRzIG9uIHNlc3Npb24gJWQiKSwKKwkJCQkgIHNlc3Npb25faWQpOworCQkJcW9zX3Nlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCQlwY21kID0gR0VUX0JBU0VfQUREUihsaXN0X2VsdCwgc21lX1Fvc0NtZEluZm9FbnRyeSwgbGluayk7CisJCXFvc19jbWQgPSAmcGNtZC0+Y21kSW5mbzsKKwkJc3dpdGNoIChxb3NfY21kLT5jb21tYW5kKSB7CisJCWNhc2UgU01FX1FPU19TRVRVUF9SRVE6CisJCQloZGRfc3RhdHVzID0gc21lX3Fvc19pbnRlcm5hbF9zZXR1cF9yZXEoCisJCQkJICAgICAgIHFvc19jbWQtPnBNYWMsIHFvc19jbWQtPnNlc3Npb25JZCwKKwkJCQkgICAgICAgJnFvc19jbWQtPnUuc2V0dXBDbWRJbmZvLlFvU0luZm8sCisJCQkJICAgICAgIHFvc19jbWQtPnUuc2V0dXBDbWRJbmZvLlFvU0NhbGxiYWNrLAorCQkJCSAgICAgICBxb3NfY21kLT51LnNldHVwQ21kSW5mby5IRERjb250ZXh0LAorCQkJCSAgICAgICBxb3NfY21kLT51LnNldHVwQ21kSW5mby5VUFR5cGUsCisJCQkJICAgICAgIHFvc19jbWQtPnUuc2V0dXBDbWRJbmZvLlFvc0Zsb3dJRCwKKwkJCQkgICAgICAgdHJ1ZSwgcW9zX2NtZC0+dS5zZXR1cENtZEluZm8uaG9SZW5ld2FsKTsKKwkJCWlmIChTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUCA9PSBoZGRfc3RhdHVzKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTCgic21lX3Fvc19pbnRlcm5hbF9zZXR1cF9yZXEgZmFpbGVkIG9uIHNlc3Npb24gJWQiKSwKKwkJCQkJICBzZXNzaW9uX2lkKTsKKwkJCQljZGZfcmV0X3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU01FX1FPU19SRUxFQVNFX1JFUToKKwkJCWhkZF9zdGF0dXMgPSBzbWVfcW9zX2ludGVybmFsX3JlbGVhc2VfcmVxKHFvc19jbWQtPnBNYWMsCisJCQkJCXFvc19jbWQtPnUucmVsZWFzZUNtZEluZm8uUW9zRmxvd0lELAorCQkJCQl0cnVlKTsKKwkJCWlmIChTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQID09IGhkZF9zdGF0dXMpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgIEZMKCJzbWVfcW9zX2ludGVybmFsX3JlbGVhc2VfcmVxIGZhaWxlZCBvbiBzZXNzaW9uICVkIiksCisJCQkJCSAgc2Vzc2lvbl9pZCk7CisJCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNNRV9RT1NfTU9ESUZZX1JFUToKKwkJCWhkZF9zdGF0dXMgPSBzbWVfcW9zX2ludGVybmFsX21vZGlmeV9yZXEocW9zX2NtZC0+cE1hYywKKwkJCQkJJnFvc19jbWQtPnUubW9kaWZ5Q21kSW5mby5Rb1NJbmZvLAorCQkJCQlxb3NfY21kLT51Lm1vZGlmeUNtZEluZm8uUW9zRmxvd0lELAorCQkJCQl0cnVlKTsKKwkJCWlmIChTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfRkFJTFVSRV9SU1AgPT0KKwkJCQloZGRfc3RhdHVzKSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICBGTCgic21lX3Fvc19pbnRlcm5hbF9tb2RpZnlfcmVxIGZhaWxlZCBvbiBzZXNzaW9uICVkIiksCisJCQkJCSAgc2Vzc2lvbl9pZCk7CisJCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNNRV9RT1NfUkVTRU5EX1JFUToKKwkJCWhkZF9zdGF0dXMgPSBzbWVfcW9zX3JlX3JlcXVlc3RfYWRkX3RzKHFvc19jbWQtPnBNYWMsCisJCQkJCXFvc19jbWQtPnNlc3Npb25JZCwKKwkJCQkJJnFvc19jbWQtPnUucmVzZW5kQ21kSW5mby5Rb1NJbmZvLAorCQkJCQlxb3NfY21kLT51LnJlc2VuZENtZEluZm8uYWMsCisJCQkJCXFvc19jbWQtPnUucmVzZW5kQ21kSW5mby50c3BlY01hc2spOworCQkJaWYgKFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUCA9PQorCQkJCWhkZF9zdGF0dXMpIHsKKwkJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsCisJCQkJCSAgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCQkgIEZMKCJzbWVfcW9zX3JlX3JlcXVlc3RfYWRkX3RzIGZhaWxlZCBvbiBzZXNzaW9uICVkIiksCisJCQkJCSAgc2Vzc2lvbl9pZCk7CisJCQkJY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTCgiT24gc2Vzc2lvbiAlZCB1bmtub3duIGNtZCA9ICVkIiksCisJCQkJICBzZXNzaW9uX2lkLCBxb3NfY21kLT5jb21tYW5kKTsKKwkJCUNERl9BU1NFUlQoMCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBidWZmZXJlZCBjb21tYW5kIGhhcyBiZWVuIHByb2Nlc3NlZCwgcmVjbGFpbSB0aGUgbWVtb3J5ICovCisJCWNkZl9tZW1fZnJlZShwY21kKTsKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgIEZMKCJjbWQgYnVmZmVyIGVtcHR5IikpOworCQlxb3Nfc2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCX0KKwlyZXR1cm4gY2RmX3JldF9zdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfcW9zX2RlbGV0ZV9idWZmZXJlZF9yZXF1ZXN0cygpIC0gVXRpbGl0eSBmdW5jdGlvbiB0byBEZWxldGUgdGhlIGJ1ZmZlcmVkCisgICByZXF1ZXN0cyBpbiB0aGUgYnVmZmVyZWRfY21kX2xpc3QsIGlmIHdlIGxvc3QgY29ubmVjdGl2aXR5LgorCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBDREZfU1RBVFVTIHNtZV9xb3NfZGVsZXRlX2J1ZmZlcmVkX3JlcXVlc3RzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCQkgICB1aW50OF90IHNlc3Npb25JZCkKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCXNtZV9Rb3NDbWRJbmZvRW50cnkgKnBjbWQgPSBOVUxMOworCXRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTCwgKnBOZXh0RW50cnkgPSBOVUxMOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBJbnZva2VkIG9uIHNlc3Npb24gJWQiLAorCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkKTsKKwlwU2Vzc2lvbiA9ICZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmcFNlc3Npb24tPmJ1ZmZlcmVkQ29tbWFuZExpc3QsIHRydWUpOworCWlmICghcEVudHJ5KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkgICIlczogJWQ6IEJ1ZmZlcmVkIExpc3QgZW1wdHksIG5vdGhpbmcgdG8gZGVsZXRlIG9uIHNlc3Npb24gJWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJd2hpbGUgKHBFbnRyeSkgeworCQlwTmV4dEVudHJ5ID0KKwkJCWNzcl9sbF9uZXh0KCZwU2Vzc2lvbi0+YnVmZmVyZWRDb21tYW5kTGlzdCwgcEVudHJ5LCB0cnVlKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzOiAlZDogZGVsZXRpbmcgZW50cnkgZnJvbSBidWZmZXJlZCBMaXN0IiwgX19mdW5jX18sCisJCQkgIF9fTElORV9fKTsKKwkJLyogZGVsZXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdCAqLworCQljc3JfbGxfcmVtb3ZlX2VudHJ5KCZwU2Vzc2lvbi0+YnVmZmVyZWRDb21tYW5kTGlzdCwgcEVudHJ5LAorCQkJCSAgICB0cnVlKTsKKwkJLyogcmVjbGFpbSB0aGUgbWVtb3J5ICovCisJCXBjbWQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgc21lX1Fvc0NtZEluZm9FbnRyeSwgbGluayk7CisJCWNkZl9tZW1fZnJlZShwY21kKTsKKwkJcEVudHJ5ID0gcE5leHRFbnRyeTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzbWVfcW9zX3NhdmVfYXNzb2NfaW5mbygpIC0gc2F2ZSBhc3NvYyBpbmZvLgorICogQHBTZXNzaW9uOiBwb2ludGVyIHRvIFFPUyBzZXNzaW9uCisgKiBAcEFzc29jX2luZm86IHBvaW50ZXIgdG8gdGhlIGFzc29jIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgQlNTIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICAgb2YgdGhlIEFQLCB0aGUgcHJvZmlsZSB0aGF0IEhERCBzZW50IGRvd24gd2l0aCB0aGUKKyAqICAgICAgICAgICAgICAgY29ubmVjdCByZXF1ZXN0CisgKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byBzYXZlIHRoZSBhc3NvYyBpbmZvIGluIHRoZSBDQiBsaWtlIEJTUyBkZXNjcmlwdG9yCisgKiBvZiB0aGUgQVAsIHRoZSBwcm9maWxlIHRoYXQgSEREIHNlbnQgZG93biB3aXRoIHRoZSBjb25uZWN0IHJlcXVlc3QsCisgKiB3aGlsZSBDU1Igbm90aWZpZXMgZm9yIGFzc29jL3JlYXNzb2Mgc3VjY2Vzcy4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfcW9zX3NhdmVfYXNzb2NfaW5mbyhzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uLAorCQkJCSAgIHNtZV9Rb3NBc3NvY0luZm8gKnBBc3NvY19pbmZvKQoreworCXRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MgPSBOVUxMOworCXVpbnQzMl90IGJzc0xlbiA9IDA7CisJaWYgKE5VTEwgPT0gcEFzc29jX2luZm8pIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IHBBc3NvY19pbmZvIGlzIE5VTEwiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIGNsZWFuIHVwIHRoZSBhc3NvYyBpbmZvIGlmIGFscmVhZHkgc2V0ICovCisJaWYgKHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MpIHsKKwkJY2RmX21lbV9mcmVlKHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MpOworCQlwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjID0gTlVMTDsKKwl9CisJYnNzTGVuID0gcEFzc29jX2luZm8tPnBCc3NEZXNjLT5sZW5ndGggKworCQkgc2l6ZW9mKHBBc3NvY19pbmZvLT5wQnNzRGVzYy0+bGVuZ3RoKTsKKwkvKiBzYXZlIHRoZSBic3MgRGVzY3JpcHRvciAqLworCXBCc3NEZXNjID0gKHRTaXJCc3NEZXNjcmlwdGlvbiAqKSBjZGZfbWVtX21hbGxvYyhic3NMZW4pOworCWlmICghcEJzc0Rlc2MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IGNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGJzcyBEZXNjcmlwdG9yIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJY2RmX21lbV9jb3B5KHBCc3NEZXNjLCBwQXNzb2NfaW5mby0+cEJzc0Rlc2MsIGJzc0xlbik7CisJcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYyA9IHBCc3NEZXNjOworCS8qIHNhdmUgdGhlIGFwc2QgaW5mbyBmcm9tIGFzc29jICovCisJaWYgKHBBc3NvY19pbmZvLT5wUHJvZmlsZSkgeworCQlwU2Vzc2lvbi0+YXBzZE1hc2sgfD0gcEFzc29jX2luZm8tPnBQcm9maWxlLT51YXBzZF9tYXNrOworCX0KKwkvKiBbVE9ET10gRG8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIGdsb2JhbCBBUFNEIGJpdG1hcD8gKi8KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19zZXR1cF9mbnAoKSAtIFV0aWxpdHkgZnVuY3Rpb24gKHBvaW50ZXIpIHRvIG5vdGlmeSBvdGhlciBlbnRyaWVzCisgICBpbiBGTE9XIGxpc3Qgb24gdGhlIHNhbWUgQUMgdGhhdCBxb3MgcGFyYW1zIGdvdCBtb2RpZmllZAorICAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgICBccGFyYW0gcEVudHJ5IC0gUG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZmxvd19saXN0KGkuZS4gdExpc3RFbGVtIHN0cnVjdHVyZSkKKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3Nfc2V0dXBfZm5wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKwlzbWVfUW9zU3RhdHVzVHlwZSBoZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfTU9ESUZJRURfSU5EOworCXNtZV9Rb3NFZGNhQWNUeXBlIGFjOworCWlmICghcEVudHJ5KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBFbnRyeSBpcyBOVUxMIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgc21lX1Fvc0Zsb3dJbmZvRW50cnksIGxpbmspOworCWFjID0gZmxvd19pbmZvLT5hY190eXBlOworCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bZmxvd19pbmZvLT5zZXNzaW9uSWRdOworCXBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworCWlmIChTTUVfUU9TX1JFQVNPTl9SRVFfU1VDQ0VTUyA9PSBmbG93X2luZm8tPnJlYXNvbikgeworCQkvKiBub3RpZnkgSERELCBvbmx5IHRoZSBvdGhlciBGbG93cyBydW5uaW5nIG9uIHRoZSBBQyAqLworCQlmbG93X2luZm8tPlFvU0NhbGxiYWNrKHBNYWMsIGZsb3dfaW5mby0+SEREY29udGV4dCwKKwkJCQkgICAgICAgJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1tmbG93X2luZm8tPgorCQkJCQkJCSAgICAgIHRzcGVjX21hc2sgLSAxXSwKKwkJCQkgICAgICAgaGRkX3N0YXR1cywgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogJWQ6IEVudHJ5IHdpdGggZmxvd0lEID0gJWQgZ2V0dGluZyBub3RpZmllZCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19tb2RpZmljYXRpb25fbm90aWZ5X2ZucCgpIC0gVXRpbGl0eSBmdW5jdGlvbiAocG9pbnRlcikgdG8gbm90aWZ5CisgICBvdGhlciBlbnRyaWVzIGluIEZMT1cgbGlzdCBvbiB0aGUgc2FtZSBBQyB0aGF0IHFvcyBwYXJhbXMgZ290IG1vZGlmaWVkCisgICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgIFxwYXJhbSBwRW50cnkgLSBQb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBmbG93X2xpc3QoaS5lLiB0TGlzdEVsZW0gc3RydWN0dXJlKQorCisgICBccmV0dXJuIENERl9TVEFUVVMKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NERl9TVEFUVVMgc21lX3Fvc19tb2RpZmljYXRpb25fbm90aWZ5X2ZucCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0TGlzdEVsZW0gKnBFbnRyeSkKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCXNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisJc21lX1Fvc0Zsb3dJbmZvRW50cnkgKmZsb3dfaW5mbyA9IE5VTEw7CisJc21lX1Fvc1N0YXR1c1R5cGUgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX01PRElGSUVEX0lORDsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKwlpZiAoIXBFbnRyeSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogRW50cnkgaXMgTlVMTCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJZmxvd19pbmZvID0gR0VUX0JBU0VfQUREUihwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rKTsKKwlhYyA9IGZsb3dfaW5mby0+YWNfdHlwZTsKKwlwU2Vzc2lvbiA9ICZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW2Zsb3dfaW5mby0+c2Vzc2lvbklkXTsKKwlwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKwlpZiAoU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1MgPT0gZmxvd19pbmZvLT5yZWFzb24pIHsKKwkJLyogbm90aWZ5IEhERCwgb25seSB0aGUgb3RoZXIgRmxvd3MgcnVubmluZyBvbiB0aGUgQUMgKi8KKwkJZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLCBmbG93X2luZm8tPkhERGNvbnRleHQsCisJCQkJICAgICAgICZwQUNJbmZvLT5jdXJyX1FvU0luZm9bZmxvd19pbmZvLT4KKwkJCQkJCQkgICAgICB0c3BlY19tYXNrIC0gMV0sCisJCQkJICAgICAgIGhkZF9zdGF0dXMsIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiJXM6ICVkOiBFbnRyeSB3aXRoIGZsb3dJRCA9ICVkIGdldHRpbmcgbm90aWZpZWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9xb3NfbW9kaWZ5X2ZucCgpIC0gVXRpbGl0eSBmdW5jdGlvbiAocG9pbnRlcikgdG8gZGVsZXRlIHRoZSBvcmlnaWFubAorICAgZW50cnkgaW4gRkxPVyBsaXN0ICYgYWRkIHRoZSBtb2RpZmllZCBvbmUKKyAgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICAgXHBhcmFtIHBFbnRyeSAtIFBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGZsb3dfbGlzdChpLmUuIHRMaXN0RWxlbSBzdHJ1Y3R1cmUpCisKKyAgIFxyZXR1cm4gQ0RGX1NUQVRVUworCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBzbWVfcW9zX21vZGlmeV9mbnAodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpCit7CisJc21lX1Fvc0Zsb3dJbmZvRW50cnkgKmZsb3dfaW5mbyA9IE5VTEw7CisJaWYgKCFwRW50cnkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IEVudHJ5IGlzIE5VTEwiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJc3dpdGNoIChmbG93X2luZm8tPnJlYXNvbikgeworCWNhc2UgU01FX1FPU19SRUFTT05fTU9ESUZZX1BFTkRJTkc6CisJCS8qIHNldCB0aGUgcHJvcGVyIHJlYXNvbiBjb2RlIGZvciB0aGUgbmV3ICh3aXRoIG1vZGlmaWVkIHBhcmFtcykgZW50cnkgKi8KKwkJZmxvd19pbmZvLT5yZWFzb24gPSBTTUVfUU9TX1JFQVNPTl9SRVFfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBTTUVfUU9TX1JFQVNPTl9NT0RJRlk6CisJCS8qIGRlbGV0ZSB0aGUgb3JpZ2luYWwgZW50cnkgZnJvbSBGbG93IExpc3QgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiJXM6ICVkOiBEZWxldGluZyBvcmlnaW5hbCBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgZmxvd19pbmZvLCBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisJCWNzcl9sbF9yZW1vdmVfZW50cnkoJnNtZV9xb3NfY2IuZmxvd19saXN0LCBwRW50cnksIHRydWUpOworCQkvKiByZWNsYWltIHRoZSBtZW1vcnkgKi8KKwkJY2RmX21lbV9mcmVlKGZsb3dfaW5mbyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19kZWxfdHNfaW5kX2ZucCgpIC0gVXRpbGl0eSBmdW5jdGlvbiAocG9pbnRlcikgdG8gZmluZCBhbGwgRmxvd3Mgb24KKyAgIHRoZSBwZXJ0aWN1bGFyIEFDICYgZGVsZXRlIHRoZW0sIGFsc28gc2VuZCBIREQgaW5kaWNhdGlvbiB0aHJvdWdoIHRoZSBjYWxsYmFjaworICAgaXQgcmVnaXN0ZXJlZCBwZXIgcmVxdWVzdAorICAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgICBccGFyYW0gcEVudHJ5IC0gUG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZmxvd19saXN0KGkuZS4gdExpc3RFbGVtIHN0cnVjdHVyZSkKKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfZGVsX3RzX2luZF9mbnAodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwlzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworCXNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworCXNtZV9Rb3NFZGNhQWNUeXBlIGFjOworCUNERl9TVEFUVVMgbG9ja19zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwlzbWVfUW9zU3RhdHVzVHlwZSBzdGF0dXM7CisKKwlpZiAoIXBFbnRyeSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogRW50cnkgaXMgTlVMTCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyogZGVsZXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdCAqLworCWZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJYWMgPSBmbG93X2luZm8tPmFjX3R5cGU7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tmbG93X2luZm8tPnNlc3Npb25JZF07CisJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisJcEFDSW5mby0+cmVsVHJpZyA9IFNNRV9RT1NfUkVMRUFTRV9CWV9BUDsKKworCWxvY2tfc3RhdHVzID0gc21lX2FjcXVpcmVfZ2xvYmFsX2xvY2soJnBNYWMtPnNtZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MobG9ja19zdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBVbmFibGUgdG8gb2J0YWluIGxvY2siLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gU01FX1FPU19TVEFUVVNfUkVMRUFTRV9GQUlMVVJFX1JTUDsKKwl9CisJLyogQ2FsbCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gZm9yIFFvUyByZWxlYXNlLCBhZGRpbmcgYSBsYXllciBvZiBhYnN0cmFjdGlvbiAqLworCXN0YXR1cyA9CisJCXNtZV9xb3NfaW50ZXJuYWxfcmVsZWFzZV9yZXEocE1hYywgZmxvd19pbmZvLT5Rb3NGbG93SUQsIGZhbHNlKTsKKwlzbWVfcmVsZWFzZV9nbG9iYWxfbG9jaygmcE1hYy0+c21lKTsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogUW9TIFJlbGVhc2UgcmV0dXJuIHN0YXR1cyBvbiBGbG93ICVkIGlzICVkIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIGZsb3dfaW5mby0+UW9zRmxvd0lELCBzdGF0dXMpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzbWVfcW9zX3JlYXNzb2Nfc3VjY2Vzc19ldl9mbnAgIE5vdGlmaWNhdGlvbiBmdW5jdGlvbiB0byBIREQKKyAqCisgKiBAbWFjX2N0eDogTWFjIGNvbnRleHQKKyAqIEBlbnRyeTogICBQb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBmbG93X2xpc3QKKyAqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIChwb2ludGVyKSB0byBub3RpZnkgSERECisgKiB0aGUgc3VjY2VzcyBmb3IgdGhlIHJlcXVlc3RlZCBmbG93ICYgbm90aWZ5IGFsbCB0aGUgb3RoZXIgZmxvd3MKKyAqIHJ1bm5pbmcgb24gdGhlIHNhbWUgQUMgdGhhdCBRb1MgcGFyYW1zIGdvdCBtb2RpZmllZAorICoKKyAqIFJldHVybjogIENERl9TVEFUVVMgZW51bWFyYXRpb24KKyAqLworQ0RGX1NUQVRVUworc21lX3Fvc19yZWFzc29jX3N1Y2Nlc3NfZXZfZm5wKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXRMaXN0RWxlbSAqZW50cnkpCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpxb3Nfc2Vzc2lvbjsKKwlzbWVfUW9zQUNJbmZvICphY19pbmZvOworCXNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworCWJvb2wgZGVsZXRlX2VudHJ5ID0gZmFsc2U7CisJc21lX1Fvc1N0YXR1c1R5cGUgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOworCXNtZV9Rb3NFZGNhQWNUeXBlIGFjOworCUNERl9TVEFUVVMgcG1jX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCWlmICghZW50cnkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiJXM6ICVkOiBFbnRyeSBpcyBOVUxMIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKGVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJYWMgPSBmbG93X2luZm8tPmFjX3R5cGU7CisJcW9zX3Nlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tmbG93X2luZm8tPnNlc3Npb25JZF07CisJYWNfaW5mbyA9ICZxb3Nfc2Vzc2lvbi0+YWNfaW5mb1thY107CisJc3dpdGNoIChmbG93X2luZm8tPnJlYXNvbikgeworCWNhc2UgU01FX1FPU19SRUFTT05fU0VUVVA6CisJCWhkZF9zdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0lORDsKKwkJZGVsZXRlX2VudHJ5ID0gZmFsc2U7CisJCWZsb3dfaW5mby0+cmVhc29uID0gU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1M7CisJCS8qIC1DaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgaGFkIHRvIGRvIHJlYXNzb2MgdG8KKwkJICogcmVzZXQgdGhlIGFwc2QgYml0IGZvciB0aGUgYWMgLSByZWxlYXNlIG9yIG1vZGlmeQorCQkgKiBzY2VuYXJpby5Ob3RpZnkgUE1DIGFzIEFwcCBpcyBsb29raW5nIGZvciBBUFNECisJCSAqIElmIHdlIGFscmVhZHkgcmVxdWVzdGVkIHRoZW4gd2UgZG9uJ3QgbmVlZCB0bworCQkgKiBkbyBhbnl0aGluZy4qLworCQlpZiAoYWNfaW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXS50c19pbmZvLnBzYiAmJgorCQkJIXFvc19zZXNzaW9uLT51YXBzZEFscmVhZHlSZXF1ZXN0ZWQpIHsKKwkJCS8qIHRoaXMgaXMgdGhlIGZpcnN0IGZsb3cgdG8gZGV0ZWN0IHdlIG5lZWQKKwkJCSAqIFBNQyBpbiBVQVBTRCBtb2RlICovCisJCQlwbWNfc3RhdHVzID0gc21lX3BzX3N0YXJ0X3VhcHNkKG1hY19jdHgsCisJCQkJCWZsb3dfaW5mby0+c2Vzc2lvbklkLAorCQkJCQlzbWVfcW9zX3BtY19vZmZsb2FkX3N0YXJ0X3VhcHNkX2NhbGxiYWNrLAorCQkJCQlxb3Nfc2Vzc2lvbik7CisJCQkvKiBpZiBQTUMgZG9lc24ndCByZXR1cm4gc3VjY2VzcyByaWdodCBhd2F5IG1lYW5zCisJCQkgKiBpdCBpcyB5ZXQgdG8gcHV0IHRoZSBtb2R1bGUgaW4gQk1QUyBzdGF0ZSAmIGxhdGVyCisJCQkgKiB0byBVQVBTRCBzdGF0ZSAqLworCQkJaWYgKENERl9TVEFUVVNfRV9GQUlMVVJFID09IHBtY19zdGF0dXMpIHsKKwkJCQloZGRfc3RhdHVzID0KKwkJCQkJU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9TRVRfRkFJTEVEOworCQkJCS8qIHdlIG5lZWQgdG8gYWx3YXlzIG5vdGlmeSB0aGlzIGNhc2UgKi8KKwkJCQlmbG93X2luZm8tPmhvUmVuZXdhbCA9IGZhbHNlOworCQkJfSBlbHNlIGlmIChDREZfU1RBVFVTX1BNQ19QRU5ESU5HID09IHBtY19zdGF0dXMpIHsKKwkJCQkvKiBsZXQgb3RoZXIgZmxvd3Mga25vdyBQTUMgaGFzIGJlZW4gbm90aWZpZWQgKi8KKwkJCQlxb3Nfc2Vzc2lvbi0+dWFwc2RBbHJlYWR5UmVxdWVzdGVkID0KKwkJCQl0cnVlOworCisJCQl9CisJCX0KKwkJLyogZm9yIGFueSBvdGhlciBwbWMgc3RhdHVzIHdlIGRlY2xhcmUgc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIFNNRV9RT1NfUkVBU09OX1JFTEVBU0U6CisJCWFjX2luZm8tPm51bV9mbG93c1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLS07CisJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTTUVfUU9TX1JFQVNPTl9NT0RJRlk6CisJCWRlbGV0ZV9lbnRyeSA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19SRUFTT05fTU9ESUZZX1BFTkRJTkc6CisJCWhkZF9zdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19JTkQ7CisJCWRlbGV0ZV9lbnRyeSA9IGZhbHNlOworCQlmbG93X2luZm8tPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTOworCQlpZiAoYWNfaW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXS50c19pbmZvLnBzYiAmJgorCQkJIXFvc19zZXNzaW9uLT51YXBzZEFscmVhZHlSZXF1ZXN0ZWQpIHsKKwkJCS8qIHRoaXMgaXMgdGhlIGZpcnN0IGZsb3cgdG8gZGV0ZWN0IHdlIG5lZWQKKwkJCSAqIFBNQyBpbiBVQVBTRCBtb2RlICovCisJCQlwbWNfc3RhdHVzID0gc21lX3BzX3N0YXJ0X3VhcHNkKG1hY19jdHgsCisJCQkJCSBmbG93X2luZm8tPnNlc3Npb25JZCwKKwkJCQkJIHNtZV9xb3NfcG1jX29mZmxvYWRfc3RhcnRfdWFwc2RfY2FsbGJhY2ssCisJCQkJCSBxb3Nfc2Vzc2lvbik7CisJCQkvKiBpZiBQTUMgZG9lc24ndCByZXR1cm4gc3VjY2VzcyByaWdodCBhd2F5IG1lYW5zCisJCQkgKiBpdCBpcyB5ZXQgdG8gcHV0IHRoZSBtb2R1bGUgaW4gQk1QUyBzdGF0ZSAmCisJCQkgKiBsYXRlciB0byBVQVBTRCBzdGF0ZSAqLworCQkJaWYgKENERl9TVEFUVVNfRV9GQUlMVVJFID09IHBtY19zdGF0dXMpIHsKKwkJCQloZGRfc3RhdHVzID0KKwkJCQkJU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfSU5EX0FQU0RfU0VUX0ZBSUxFRDsKKwkJCQkvKiB3ZSBuZWVkIHRvIGFsd2F5cyBub3RpZnkgdGhpcyBjYXNlICovCisJCQkJZmxvd19pbmZvLT5ob1JlbmV3YWwgPSBmYWxzZTsKKwkJCX0gZWxzZSBpZiAoQ0RGX1NUQVRVU19QTUNfUEVORElORyA9PSBwbWNfc3RhdHVzKSB7CisJCQkJcW9zX3Nlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCA9CisJCQkJCXRydWU7CisJCQl9CisJCX0KKwkJLyogZm9yIGFueSBvdGhlciBwbWMgc3RhdHVzIHdlIGRlY2xhcmUgc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTOgorCQloZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfTU9ESUZJRURfSU5EOworCS8qIGZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCWRlbGV0ZV9lbnRyeSA9IGZhbHNlOworCQlicmVhazsKKwl9CisJaWYgKCFkZWxldGVfZW50cnkpIHsKKwkJaWYgKCFmbG93X2luZm8tPmhvUmVuZXdhbCkgeworCQkJZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhtYWNfY3R4LCBmbG93X2luZm8tPkhERGNvbnRleHQsCisJCQkJJmFjX2luZm8tPmN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLAorCQkJCWhkZF9zdGF0dXMsIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKwkJfSBlbHNlIHsKKwkJCWZsb3dfaW5mby0+aG9SZW5ld2FsID0gZmFsc2U7CisJCX0KKwl9IGVsc2UgeworCQkvKiBkZWxldGUgdGhlIGVudHJ5IGZyb20gRmxvdyBMaXN0ICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCUZMKCJEZWxldGluZyBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIpLAorCQkJZmxvd19pbmZvLCBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisJCWNzcl9sbF9yZW1vdmVfZW50cnkoJnNtZV9xb3NfY2IuZmxvd19saXN0LCBlbnRyeSwgdHJ1ZSk7CisJCS8qIHJlY2xhaW0gdGhlIG1lbW9yeSAqLworCQljZGZfbWVtX2ZyZWUoZmxvd19pbmZvKTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIHNtZV9xb3NfYWRkX3RzX2ZhaWx1cmVfZm5wKCkgLSBVdGlsaXR5IGZ1bmN0aW9uIChwb2ludGVyKSwKKyAgIGlmIHRoZSBBZGR0cyByZXF1ZXN0IHdhcyBmb3IgZm9yIGFuIGZsb3cgc2V0dXAgcmVxdWVzdCwgZGVsZXRlIHRoZSBlbnRyeSBmcm9tCisgICBGbG93IGxpc3QgJiBub3RpZnkgSERECisgICBpZiB0aGUgQWRkdHMgcmVxdWVzdCB3YXMgZm9yIGRvd25ncmFkaW5nIG9mIFFvUyBwYXJhbXMgYmVjYXVzZSBvZiBhbiBmbG93CisgICByZWxlYXNlIHJlcXVlc3RlZCBvbiB0aGUgQUMsIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSBGbG93IGxpc3QgJiBub3RpZnkgSERECisgICBpZiB0aGUgQWRkdHMgcmVxdWVzdCB3YXMgZm9yIGNoYW5nZSBvZiBRb1MgcGFyYW1zIGJlY2F1c2Ugb2YgYW4gZmxvdworICAgbW9kaWZpY2F0aW9uIHJlcXVlc3RlZCBvbiB0aGUgQUMsIGRlbGV0ZSB0aGUgbmV3IGVudHJ5IGZyb20gRmxvdyBsaXN0ICYgbm90aWZ5CisgICBIREQKKworICAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgICBccGFyYW0gcEVudHJ5IC0gUG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZmxvd19saXN0KGkuZS4gdExpc3RFbGVtIHN0cnVjdHVyZSkKKworICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDREZfU1RBVFVTIHNtZV9xb3NfYWRkX3RzX2ZhaWx1cmVfZm5wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKwlib29sIGluZm9ybV9oZGQgPSBmYWxzZTsKKwlzbWVfUW9zU3RhdHVzVHlwZSBoZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisJc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisJaWYgKCFwRW50cnkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IEVudHJ5IGlzIE5VTEwiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJYWMgPSBmbG93X2luZm8tPmFjX3R5cGU7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tmbG93X2luZm8tPnNlc3Npb25JZF07CisJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisJc3dpdGNoIChmbG93X2luZm8tPnJlYXNvbikgeworCWNhc2UgU01FX1FPU19SRUFTT05fU0VUVVA6CisJCWhkZF9zdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDsKKwkJcEFDSW5mby0+bnVtX2Zsb3dzW3BBQ0luZm8tPnRzcGVjX3BlbmRpbmcgLSAxXS0tOworCQlpbmZvcm1faGRkID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBTTUVfUU9TX1JFQVNPTl9SRUxFQVNFOgorCQloZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfUkVMRUFTRV9GQUlMVVJFX1JTUDsKKwkJcEFDSW5mby0+bnVtX2Zsb3dzW3BBQ0luZm8tPnRzcGVjX3BlbmRpbmcgLSAxXS0tOworCQlpbmZvcm1faGRkID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBTTUVfUU9TX1JFQVNPTl9NT0RJRllfUEVORElORzoKKwkJaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDsKKwkJaW5mb3JtX2hkZCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19SRUFTT05fTU9ESUZZOgorCQlmbG93X2luZm8tPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTOworCWNhc2UgU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1M6CisJZGVmYXVsdDoKKwkJaW5mb3JtX2hkZCA9IGZhbHNlOworCQlicmVhazsKKwl9CisJaWYgKGluZm9ybV9oZGQpIHsKKwkJLyogbm90aWZ5IEhERCwgb25seSB0aGUgcmVxdWVzdGVkIEZsb3csIG90aGVyIEZsb3dzIHJ1bm5pbmcgb24gdGhlIEFDIHN0YXkgKi8KKwkJLyogaW50YWN0ICovCisJCWlmICghZmxvd19pbmZvLT5ob1JlbmV3YWwpIHsKKwkJCWZsb3dfaW5mby0+UW9TQ2FsbGJhY2socE1hYywgZmxvd19pbmZvLT5IRERjb250ZXh0LAorCQkJCQkgICAgICAgJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1twQUNJbmZvLT4KKwkJCQkJCQkJICAgICAgdHNwZWNfcGVuZGluZworCQkJCQkJCQkgICAgICAtIDFdLAorCQkJCQkgICAgICAgaGRkX3N0YXR1cywKKwkJCQkJICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKwkJfSBlbHNlIHsKKwkJCWZsb3dfaW5mby0+UW9TQ2FsbGJhY2socE1hYywgZmxvd19pbmZvLT5IRERjb250ZXh0LAorCQkJCQkgICAgICAgJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1twQUNJbmZvLT4KKwkJCQkJCQkJICAgICAgdHNwZWNfcGVuZGluZworCQkJCQkJCQkgICAgICAtIDFdLAorCQkJCQkgICAgICAgU01FX1FPU19TVEFUVVNfUkVMRUFTRV9RT1NfTE9TVF9JTkQsCisJCQkJCSAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisJCX0KKwkJLyogZGVsZXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdCAqLworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogJWQ6IERlbGV0aW5nIGVudHJ5IGF0ICVwIHdpdGggZmxvd0lEICVkIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBmbG93X2luZm8sIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKwkJY3NyX2xsX3JlbW92ZV9lbnRyeSgmc21lX3Fvc19jYi5mbG93X2xpc3QsIHBFbnRyeSwgdHJ1ZSk7CisJCS8qIHJlY2xhaW0gdGhlIG1lbW9yeSAqLworCQljZGZfbWVtX2ZyZWUoZmxvd19pbmZvKTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzbWVfcW9zX2FkZF90c19zdWNjZXNzX2ZucCgpIC0gVXRpbGl0eSBmdW5jdGlvbiAocG9pbnRlcikgdG8gbm90aWZ5IEhERAorICoKKyAqIEBtYWNfY3R4OiBNYWMgY29udGV4dAorICogQGVudHJ5OiAgIFBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGZsb3dfbGlzdChpLmUuIHRMaXN0RWxlbSBzdHJ1Y3R1cmUpLgorICoKKyAqIERlc2NyaXB0aW9uIDogVXRpbGl0eSBmdW5jdGlvbiAocG9pbnRlciksCisgKiBJZiB0aGUgQWRkdHMgcmVxdWVzdCB3YXMgZm9yIGZvciBhbiBmbG93IHNldHVwIHJlcXVlc3QsIG5vdGlmeQorICogSEREIGZvciBzdWNjZXNzIGZvciB0aGUgZmxvdyAmIG5vdGlmeSBhbGwgdGhlIG90aGVyIGZsb3dzIHJ1bm5pbmcKKyAqIG9uIHRoZSBzYW1lIEFDIHRoYXQgUW9TIHBhcmFtcyBnb3QgbW9kaWZpZWQKKyAqIGlmIHRoZSBBZGR0cyByZXF1ZXN0IHdhcyBmb3IgZG93bmdyYWRpbmcgb2YgUW9TIHBhcmFtcworICogYmVjYXVzZSBvZiBhbiBmbG93IHJlbGVhc2UgcmVxdWVzdGVkIG9uIHRoZSBBQywgZGVsZXRlCisgKiB0aGUgZW50cnkgZnJvbSBGbG93IGxpc3QgJiBub3RpZnkgSEREIGlmIHRoZSBBZGR0cyByZXF1ZXN0CisgKiB3YXMgZm9yIGNoYW5nZSBvZiBRb1MgcGFyYW1zIGJlY2F1c2Ugb2YgYW4gZmxvdyBtb2RpZmljYXRpb24KKyAqIHJlcXVlc3RlZCBvbiB0aGUgQUMsIGRlbGV0ZSB0aGUgb2xkIGVudHJ5IGZyb20gRmxvdyBsaXN0ICYgbm90aWZ5CisgKiBIREQgZm9yIHN1Y2Nlc3MgZm9yIHRoZSBmbG93ICYgbm90aWZ5IGFsbCB0aGUgb3RoZXIgZmxvd3MgcnVubmluZworICogb24gdGhlIHNhbWUgQUMgdGhhdCBRb1MgcGFyYW1zIGdvdCBtb2RpZmllZAorICoKKyAqIFJldHVybjogU3RhdHVzCisgKi8KKworQ0RGX1NUQVRVUyBzbWVfcW9zX2FkZF90c19zdWNjZXNzX2ZucCh0cEFuaVNpckdsb2JhbCBtYWNfY3R4LAorCQl0TGlzdEVsZW0gKmVudHJ5KQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcW9zX3Nlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqYWNfaW5mbzsKKwlzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKwlib29sIGluZm9ybV9oZGQgPSBmYWxzZTsKKwlib29sIGRlbGV0ZV9lbnRyeSA9IGZhbHNlOworCXNtZV9Rb3NTdGF0dXNUeXBlIGhkZF9zdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKwlDREZfU1RBVFVTIHBtY19zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgcHJvZmlsZV9maWVsZHM7CisJdWludDhfdCBwc2I7CisJdWludDhfdCB0c3BlY19pbmRleDsKKworCWlmICghZW50cnkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiRW50cnkgaXMgTlVMTCIpKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKGVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJYWMgPSBmbG93X2luZm8tPmFjX3R5cGU7CisJcW9zX3Nlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tmbG93X2luZm8tPnNlc3Npb25JZF07CisJYWNfaW5mbyA9ICZxb3Nfc2Vzc2lvbi0+YWNfaW5mb1thY107CisJdHNwZWNfaW5kZXggPSBhY19pbmZvLT50c3BlY19wZW5kaW5nIC0gMTsKKwlpZiAoZmxvd19pbmZvLT50c3BlY19tYXNrICE9IGFjX2luZm8tPnRzcGVjX3BlbmRpbmcpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJRkwoIiBObyBuZWVkIHRvIG5vdGlmeSB0aGUgSERELCB0aGUgQUREVFMgIgorCQkJInN1Y2Nlc3MgaXMgbm90IGZvciBpbmRleCA9ICVkIG9mIHRoZSBBQyA9ICVkIiksCisJCQlmbG93X2luZm8tPnRzcGVjX21hc2ssIGFjKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisJc3dpdGNoIChmbG93X2luZm8tPnJlYXNvbikgeworCWNhc2UgU01FX1FPU19SRUFTT05fU0VUVVA6CisJCWhkZF9zdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0lORDsKKwkJZmxvd19pbmZvLT5yZWFzb24gPSBTTUVfUU9TX1JFQVNPTl9SRVFfU1VDQ0VTUzsKKwkJZGVsZXRlX2VudHJ5ID0gZmFsc2U7CisJCWluZm9ybV9oZGQgPSB0cnVlOworCQkvKiBjaGVjayBpZiBBcHAgaXMgbG9va2luZyBmb3IgQVBTRAorCQkgKiBub3RpZnkgUE1DIGFzIEFwcCBpcyBsb29raW5nIGZvciBBUFNELiBJZiB3ZSBhbHJlYWR5CisJCSAqIHJlcXVlc3RlZCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgKi8KKwkJaWYgKGFjX2luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RzcGVjX2luZGV4XS50c19pbmZvLnBzYiAmJgorCQkJIXFvc19zZXNzaW9uLT51YXBzZEFscmVhZHlSZXF1ZXN0ZWQpIHsKKwkJCS8qIHRoaXMgaXMgdGhlIGZpcnN0IGZsb3cgdG8gZGV0ZWN0IHdlIG5lZWQKKwkJCSAqIFBNQyBpbiBVQVBTRCBtb2RlICovCisJCQlwbWNfc3RhdHVzID0gc21lX3BzX3N0YXJ0X3VhcHNkKG1hY19jdHgsCisJCQkJZmxvd19pbmZvLT5zZXNzaW9uSWQsCisJCQkJc21lX3Fvc19wbWNfb2ZmbG9hZF9zdGFydF91YXBzZF9jYWxsYmFjaywKKwkJCQlxb3Nfc2Vzc2lvbik7CisJCQkvKiBpZiBQTUMgZG9lc24ndCByZXR1cm4gc3VjY2VzcyByaWdodCBhd2F5IG1lYW5zCisJCQkgKiBpdCBpcyB5ZXQgdG8gcHV0IHRoZSBtb2R1bGUgaW4gQk1QUyBzdGF0ZSAmIGxhdGVyCisJCQkgKiB0byBVQVBTRCBzdGF0ZSAqLworCQkJaWYgKENERl9TVEFUVVNfRV9GQUlMVVJFID09IHBtY19zdGF0dXMpIHsKKwkJCQloZGRfc3RhdHVzID0KKwkJCQkJU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9TRVRfRkFJTEVEOworCQkJCS8qIHdlIG5lZWQgdG8gYWx3YXlzIG5vdGlmeSB0aGlzIGNhc2UgKi8KKwkJCQlmbG93X2luZm8tPmhvUmVuZXdhbCA9IGZhbHNlOworCQkJfSBlbHNlIGlmIChDREZfU1RBVFVTX1BNQ19QRU5ESU5HID09IHBtY19zdGF0dXMpIHsKKwkJCQkvKiBsZXQgb3RoZXIgZmxvd3Mga25vdyBQTUMgaGFzIGJlZW4gbm90aWZpZWQgKi8KKwkJCQlxb3Nfc2Vzc2lvbi0+dWFwc2RBbHJlYWR5UmVxdWVzdGVkID0KKwkJCQl0cnVlOworCQkJfQorCQkJLyogZm9yIGFueSBvdGhlciBwbWMgc3RhdHVzIHdlIGRlY2xhcmUgc3VjY2VzcyAqLworCQl9CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19SRUFTT05fUkVMRUFTRToKKwkJYWNfaW5mby0+bnVtX2Zsb3dzW3RzcGVjX2luZGV4XS0tOworCQloZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfUkVMRUFTRV9TVUNDRVNTX1JTUDsKKwkJaW5mb3JtX2hkZCA9IHRydWU7CisJCWRlbGV0ZV9lbnRyeSA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19SRUFTT05fTU9ESUZZOgorCQlkZWxldGVfZW50cnkgPSB0cnVlOworCQlpbmZvcm1faGRkID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgU01FX1FPU19SRUFTT05fTU9ESUZZX1BFTkRJTkc6CisJCWhkZF9zdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19JTkQ7CisJCWRlbGV0ZV9lbnRyeSA9IGZhbHNlOworCQlmbG93X2luZm8tPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTOworCQlpbmZvcm1faGRkID0gdHJ1ZTsKKwkJcHNiID0gYWNfaW5mby0+cmVxdWVzdGVkX1FvU0luZm9bdHNwZWNfaW5kZXhdLnRzX2luZm8ucHNiOworCQkvKiBub3RpZnkgUE1DIGlmIEFwcCBpcyBsb29raW5nIGZvciBBUFNECisJCSAqIG5vdGlmeSBQTUMgYXMgQXBwIGlzIGxvb2tpbmcgZm9yIEFQU0QuIElmIHdlIGFscmVhZHkKKwkJICogcmVxdWVzdGVkIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gKi8KKwkJaWYgKHBzYiAmJiAhcW9zX3Nlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCkgeworCQkJLyogdGhpcyBpcyB0aGUgZmlyc3QgZmxvdyB0byBkZXRlY3QKKwkJCSAqIHdlIG5lZWQgUE1DIGluIFVBUFNEIG1vZGUgKi8KKwkJCXBtY19zdGF0dXMgPQorCQkJCXNtZV9wc19zdGFydF91YXBzZChtYWNfY3R4LAorCQkJCQlmbG93X2luZm8tPnNlc3Npb25JZCwKKwkJCQkJc21lX3Fvc19wbWNfb2ZmbG9hZF9zdGFydF91YXBzZF9jYWxsYmFjaywKKwkJCQkJcW9zX3Nlc3Npb24pOworCQkJLyogaWYgUE1DIGRvZXNuJ3QgcmV0dXJuIHN1Y2Nlc3MgcmlnaHQKKwkJCSAqIGF3YXkgbWVhbnMgaXQgaXMgeWV0IHRvIHB1dAorCQkJICogdGhlIG1vZHVsZSBpbiBCTVBTIHN0YXRlICYgbGF0ZXIgdG8gVUFQU0Qgc3RhdGUgKi8KKwkJCWlmIChDREZfU1RBVFVTX0VfRkFJTFVSRSA9PSBwbWNfc3RhdHVzKSB7CisJCQkJaGRkX3N0YXR1cyA9CisJCQkJIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX0lORF9BUFNEX1NFVF9GQUlMRUQ7CisJCQkJLyogd2UgbmVlZCB0byBhbHdheXMgbm90aWZ5IHRoaXMgY2FzZSAqLworCQkJCWZsb3dfaW5mby0+aG9SZW5ld2FsID0gZmFsc2U7CisJCQl9IGVsc2UgaWYgKENERl9TVEFUVVNfUE1DX1BFTkRJTkcgPT0gcG1jX3N0YXR1cykgeworCQkJCS8qIGxldCBvdGhlciBmbG93cyBrbm93IFBNQyBoYXMgYmVlbiBub3RpZmllZCAqLworCQkJCXFvc19zZXNzaW9uLT51YXBzZEFscmVhZHlSZXF1ZXN0ZWQgPQorCQkJCXRydWU7CisJCQl9CisJCQkvKiBmb3IgYW55IG90aGVyIHBtYyBzdGF0dXMgd2UgZGVjbGFyZSBzdWNjZXNzICovCisJCX0gZWxzZSBpZiAoIXBzYiAmJgorCQkoKGFjX2luZm8tPm51bV9mbG93c1tmbG93X2luZm8tPnRzcGVjX21hc2sgLSAxXSA9PSAxKQorCQkJICAgICYmIChTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgIT0KKwkJCWFjX2luZm8tPnRzcGVjX21hc2tfc3RhdHVzKSkpIHsKKwkJCS8qIHRoaXMgaXMgdGhlIG9ubHkgVFNQRUMgYWN0aXZlIG9uIHRoaXMgQUMgKi8KKwkJCS8qIHNvIGluZGljYXRlIHRoYXQgd2Ugbm8gbG9uZ2VyIHJlcXVpcmUgQVBTRCAqLworCQkJcW9zX3Nlc3Npb24tPmFwc2RNYXNrICY9CisJCQkJfigxIDw8IChTTUVfUU9TX0VEQ0FfQUNfVk8gLSBhYykpOworCQkJLyogQWxzbyB1cGRhdGUgbW9kaWZ5UHJvZmlsZUZpZWxkcy51YXBzZF9tYXNrCisJCQkgKiBpbiBDU1IgZm9yIGNvbnNpc3RlbmN5ICovCisJCQljc3JfZ2V0X21vZGlmeV9wcm9maWxlX2ZpZWxkcyhtYWNfY3R4LAorCQkJCWZsb3dfaW5mby0+c2Vzc2lvbklkLAorCQkJCSZwcm9maWxlX2ZpZWxkcyk7CisJCQlwcm9maWxlX2ZpZWxkcy51YXBzZF9tYXNrID0KKwkJCQlxb3Nfc2Vzc2lvbi0+YXBzZE1hc2s7CisJCQljc3Jfc2V0X21vZGlmeV9wcm9maWxlX2ZpZWxkcyhtYWNfY3R4LAorCQkJCWZsb3dfaW5mby0+c2Vzc2lvbklkLAorCQkJCSZwcm9maWxlX2ZpZWxkcyk7CisJCQlpZiAoIXFvc19zZXNzaW9uLT5hcHNkTWFzaykgeworCQkJCXNtZV9wc191YXBzZF9kaXNhYmxlKG1hY19jdHgsCisJCQkJCWZsb3dfaW5mby0+c2Vzc2lvbklkKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTOgorCQloZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfTU9ESUZJRURfSU5EOworCQlpbmZvcm1faGRkID0gdHJ1ZTsKKwlkZWZhdWx0OgorCQlkZWxldGVfZW50cnkgPSBmYWxzZTsKKwkJYnJlYWs7CisJfQorCWlmIChpbmZvcm1faGRkKSB7CisJCWlmICghZmxvd19pbmZvLT5ob1JlbmV3YWwpIHsKKwkJCWZsb3dfaW5mby0+UW9TQ2FsbGJhY2sobWFjX2N0eCwgZmxvd19pbmZvLT5IRERjb250ZXh0LAorCQkJJmFjX2luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19pbmRleF0sCisJCQloZGRfc3RhdHVzLAorCQkJZmxvd19pbmZvLT5Rb3NGbG93SUQpOworCQl9IGVsc2UgeworCQkJZmxvd19pbmZvLT5ob1JlbmV3YWwgPSBmYWxzZTsKKwkJfQorCX0KKwlpZiAoZGVsZXRlX2VudHJ5KSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCUZMKCJEZWxldGluZyBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIpLAorCQkJZmxvd19pbmZvLCBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisJCS8qIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSBGbG93IExpc3QgKi8KKwkJY3NyX2xsX3JlbW92ZV9lbnRyeSgmc21lX3Fvc19jYi5mbG93X2xpc3QsIGVudHJ5LCB0cnVlKTsKKwkJLyogcmVjbGFpbSB0aGUgbWVtb3J5ICovCisJCWNkZl9tZW1fZnJlZShmbG93X2luZm8pOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19pc19yc3BfcGVuZGluZygpIC0gVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayBpZiB3ZSBhcmUgd2FpdGluZworICAgZm9yIGFuIEFkZFRTIG9yIHJlYXNzb2MgcmVzcG9uc2Ugb24gc29tZSBBQyBvdGhlciB0aGFuIHRoZSBnaXZlbiBBQworCisgICBccGFyYW0gc2Vzc2lvbklkIC0gU2Vzc2lvbiB3ZSBhcmUgaW50ZXJ0ZWQgaW4KKyAgIFxwYXJhbSBhYyAtIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIEVEQ0EgQWNjZXNzIENhdGVnb3JpZXMuCisKKyAgIFxyZXR1cm4gYm9vbAorICAgdHJ1ZSAtIFJlc3BvbnNlIGlzIHBlbmRpbmcgb24gYW4gQUMKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBib29sIHNtZV9xb3NfaXNfcnNwX3BlbmRpbmcodWludDhfdCBzZXNzaW9uSWQsIHNtZV9Rb3NFZGNhQWNUeXBlIGFjKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlzbWVfUW9zRWRjYUFjVHlwZSBhY0luZGV4OworCWJvb2wgc3RhdHVzID0gZmFsc2U7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCWZvciAoYWNJbmRleCA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWNJbmRleCA8IFNNRV9RT1NfRURDQV9BQ19NQVg7CisJICAgICBhY0luZGV4KyspIHsKKwkJaWYgKGFjSW5kZXggPT0gYWMpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNJbmRleF07CisJCWlmICgocEFDSW5mby0+dHNwZWNfcGVuZGluZykgfHwgKHBBQ0luZm8tPnJlYXNzb2NfcGVuZGluZykpIHsKKwkJCXN0YXR1cyA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc191cGRhdGVfaGFuZF9vZmYoKSAtIEZ1bmN0aW9uIHdoaWNoIGNhbiBiZSBjYWxsZWQgdG8gdXBkYXRlCisgICBIYW5kLW9mZiBzdGF0ZSBvZiBTTUUgUW9TIFNlc3Npb24KKyAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uIGlkCisgICBccGFyYW0gdXBkYXRlSGFuZE9mZiAtIHZhbHVlIFRydWUvRmFsc2UgdG8gdXBkYXRlIHRoZSBoYW5kb2ZmIGZsYWcKKworICAgXHNhCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfcW9zX3VwZGF0ZV9oYW5kX29mZih1aW50OF90IHNlc3Npb25JZCwgYm9vbCB1cGRhdGVIYW5kT2ZmKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fTUVELAorCQkgICIlczogJWQ6IGhhbmRvZmZSZXF1ZXN0ZWQgJWQgdXBkYXRlSGFuZE9mZiAlZCIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCBwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCwKKwkJICB1cGRhdGVIYW5kT2ZmKTsKKworCXBTZXNzaW9uLT5oYW5kb2ZmUmVxdWVzdGVkID0gdXBkYXRlSGFuZE9mZjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBcYnJpZWYgc21lX3Fvc19pc191YXBzZF9hY3RpdmUoKSAtIEZ1bmN0aW9uIHdoaWNoIGNhbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lCisgICBpZiBhbnkgc2Vzc2lvbnMgcmVxdWlyZSBQTUMgdG8gYmUgaW4gVS1BUFNEIG1vZGUuCisgICBccmV0dXJuIGJvb2wKKworICAgUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzZXNzaW9uIHJlcXVpcmVkIFBNQyB0byBiZSBpbiBVLUFQU0QgbW9kZQorICAgUmV0dXJucyBmYWxzZSBpZiBubyBzZXNzaW9ucyByZXF1aXJlIFBNQyB0byBiZSBpbiBVLUFQU0QgbW9kZQorCisgICBcc2EKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGJvb2wgc21lX3Fvc19pc191YXBzZF9hY3RpdmUodm9pZCkKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCWZvciAoc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7ICsrc2Vzc2lvbklkKSB7CisJCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKwkJaWYgKChwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSkgJiYgKHBTZXNzaW9uLT5hcHNkTWFzaykpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCS8qIG5vIGFjdGl2ZSBzZXNzaW9ucyBoYXZlIFUtQVBTRCBhY3RpdmUgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBzbWVfUW9zUG1jU3RhcnRVQVBTRENhbGxiYWNrKCkgLSBDYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggUE1DCisgICB0byBub3RpZnkgU01FLVFvUyB3aGVuIGl0IHB1dHMgdGhlIGNoaXAgaW50byBVQVBTRCBtb2RlCisKKyAgIFxwYXJhbSBjYWxsYmFja0NvbnRleHQgLSBUaGUgY29udGV4dCBwYXNzZWQgdG8gUE1DIGR1cmluZyBwbWNfc3RhcnRfdWFwc2QgY2FsbC4KKyAgIFxwYXJhbSBzdGF0dXMgLSBDREZfU1RBVFVTIHJldHVybmVkIGJ5IFBNQy4KKworICAgXHJldHVybiBOb25lCisKKyAgIFxzYQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNtZV9xb3NfcG1jX29mZmxvYWRfc3RhcnRfdWFwc2RfY2FsbGJhY2sodm9pZCAqY2FsbGJhY2tDb250ZXh0LAorCQkJCQkgICAgICB1aW50MzJfdCBzZXNzaW9uSWQsIENERl9TVEFUVVMgc3RhdHVzKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb24gPSBjYWxsYmFja0NvbnRleHQ7CisJcFNlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCA9IGZhbHNlOworfQorCitib29sIHNtZV9xb3NfcG1jX29mZmxvYWRfY2hlY2tfcm91dGluZSh2b2lkICpjYWxsYmFja0NvbnRleHQsIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKworCWlmICgocFNlc3Npb24tPnNlc3Npb25BY3RpdmUpICYmICghcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworCit9CisKKworQ0RGX1NUQVRVUyBzbWVfb2ZmbG9hZF9xb3NfcHJvY2Vzc19vdXRfb2ZfdWFwc2RfbW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkJICAgICB1aW50MzJfdCBzZXNzaW9uSWQpCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKwl0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEwsICpwTmV4dEVudHJ5ID0gTlVMTDsKKwlzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKworCXBFbnRyeSA9IGNzcl9sbF9wZWVrX2hlYWQoJnNtZV9xb3NfY2IuZmxvd19saXN0LCBmYWxzZSk7CisJaWYgKCFwRW50cnkpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJICAiJXM6ICVkOiBGbG93IExpc3QgZW1wdHksIGNhbid0IHNlYXJjaCIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJd2hpbGUgKHBFbnRyeSkgeworCQlwTmV4dEVudHJ5ID0gY3NyX2xsX25leHQoJnNtZV9xb3NfY2IuZmxvd19saXN0LCBwRW50cnksIGZhbHNlKTsKKwkJZmxvd19pbmZvID0gR0VUX0JBU0VfQUREUihwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rKTsKKwkJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tmbG93X2luZm8tPnNlc3Npb25JZF07CisJCS8qIG9ubHkgbm90aWZ5IHRoZSBmbG93cyB3aGljaCBhbHJlYWR5IHN1Y2Nlc3NmdWxseSBzZXR1cCBVQVBTRCAqLworCQlpZiAoKHNlc3Npb25JZCA9PSBmbG93X2luZm8tPnNlc3Npb25JZCkgJiYKKwkJICAgIChmbG93X2luZm8tPlFvU0luZm8ubWF4X3NlcnZpY2VfaW50ZXJ2YWwgfHwKKwkJICAgICBmbG93X2luZm8tPlFvU0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwpICYmCisJCSAgICAoU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1MgPT0gZmxvd19pbmZvLT5yZWFzb24pKSB7CisJCQlmbG93X2luZm8tPlFvU0NhbGxiYWNrKHBNYWMsIGZsb3dfaW5mby0+SEREY29udGV4dCwKKwkJCQkJICAgICAgICZwU2Vzc2lvbi0+YWNfaW5mb1tmbG93X2luZm8tPgorCQkJCQkJCQkgIGFjX3R5cGVdLmN1cnJfUW9TSW5mbworCQkJCQkgICAgICAgW2Zsb3dfaW5mby0+dHNwZWNfbWFzayAtIDFdLAorCQkJCQkgICAgICAgU01FX1FPU19TVEFUVVNfT1VUX09GX0FQU0RfUE9XRVJfTU9ERV9JTkQsCisJCQkJCSAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisJCX0KKwkJcEVudHJ5ID0gcE5leHRFbnRyeTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyBzbWVfb2ZmbG9hZF9xb3NfcHJvY2Vzc19pbnRvX3VhcHNkX21vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkJCSAgIHVpbnQzMl90IHNlc3Npb25JZCkKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCXRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTCwgKnBOZXh0RW50cnkgPSBOVUxMOworCXNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworCisJcEVudHJ5ID0gY3NyX2xsX3BlZWtfaGVhZCgmc21lX3Fvc19jYi5mbG93X2xpc3QsIGZhbHNlKTsKKwlpZiAoIXBFbnRyeSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogRmxvdyBMaXN0IGVtcHR5LCBjYW4ndCBzZWFyY2giLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXdoaWxlIChwRW50cnkpIHsKKwkJcE5leHRFbnRyeSA9IGNzcl9sbF9uZXh0KCZzbWVfcW9zX2NiLmZsb3dfbGlzdCwgcEVudHJ5LCBmYWxzZSk7CisJCWZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayk7CisJCXBTZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bZmxvd19pbmZvLT5zZXNzaW9uSWRdOworCQkvKiBvbmx5IG5vdGlmeSB0aGUgZmxvd3Mgd2hpY2ggYWxyZWFkeSBzdWNjZXNzZnVsbHkgc2V0dXAgVUFQU0QgKi8KKwkJaWYgKChzZXNzaW9uSWQgPT0gZmxvd19pbmZvLT5zZXNzaW9uSWQpICYmCisJCSAgICAoZmxvd19pbmZvLT5Rb1NJbmZvLm1heF9zZXJ2aWNlX2ludGVydmFsIHx8CisJCSAgICAgZmxvd19pbmZvLT5Rb1NJbmZvLm1pbl9zZXJ2aWNlX2ludGVydmFsKSAmJgorCQkgICAgKFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTID09IGZsb3dfaW5mby0+cmVhc29uKSkgeworCQkJZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLCBmbG93X2luZm8tPkhERGNvbnRleHQsCisJCQkJCSAgICAgICAmcFNlc3Npb24tPmFjX2luZm9bZmxvd19pbmZvLT4KKwkJCQkJCQkJICBhY190eXBlXS5jdXJyX1FvU0luZm8KKwkJCQkJICAgICAgIFtmbG93X2luZm8tPnRzcGVjX21hc2sgLSAxXSwKKwkJCQkJICAgICAgIFNNRV9RT1NfU1RBVFVTX0lOVE9fQVBTRF9QT1dFUl9NT0RFX0lORCwKKwkJCQkJICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKwkJfQorCQlwRW50cnkgPSBwTmV4dEVudHJ5OworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCit2b2lkIHNtZV9xb3NfY2xlYW51cF9jdHJsX2Jsa19mb3JfaGFuZG9mZih0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwlzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworCXNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisJc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCWZvciAoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykgeworCQlwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKwkJY2RmX21lbV96ZXJvKHBBQ0luZm8tPmN1cnJfUW9TSW5mbywKKwkJCSAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pICoKKwkJCSAgICAgU01FX1FPU19UU1BFQ19JTkRFWF9NQVgpOworCQljZGZfbWVtX3plcm8ocEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm8sCisJCQkgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSAqCisJCQkgICAgIFNNRV9RT1NfVFNQRUNfSU5ERVhfTUFYKTsKKwkJcEFDSW5mby0+bnVtX2Zsb3dzWzBdID0gMDsKKwkJcEFDSW5mby0+bnVtX2Zsb3dzWzFdID0gMDsKKwkJcEFDSW5mby0+cmVhc3NvY19wZW5kaW5nID0gZmFsc2U7CisJCXBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzID0gMDsKKwkJcEFDSW5mby0+dHNwZWNfcGVuZGluZyA9IGZhbHNlOworCQlwQUNJbmZvLT5ob1JlbmV3YWwgPSBmYWxzZTsKKwkJcEFDSW5mby0+cHJldl9zdGF0ZSA9IFNNRV9RT1NfTElOS19VUDsKKwl9Cit9CisKKy8qKgorICogc21lX3Fvc19pc190c19pbmZvX2Fja19wb2xpY3lfdmFsaWQoKSAtIGNoZWNrIGlmIEFDSyBwb2xpY3kgaXMgYWxsb3dlZC4KKyAqIEBwTWFjOiBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICogQHBRb1NJbmZvOiBQb2ludGVyIHRvIHNtZV9Rb3NXbW1Uc3BlY0luZm8gd2hpY2ggY29udGFpbnMgdGhlIFdNTSBUU1BFQworICogQCAgICAgICAgICByZWxhdGVkIGluZm8sIHByb3ZpZGVkIGJ5IEhERAorICogQHNlc3Npb25JZDogc2Vzc2lvbklkIHJldHVybmVkIGJ5IHNtZV9vcGVuX3Nlc3Npb24uCisgKgorICogVGhlIFNNRSBRb1MgQVBJIGV4cG9zZWQgdG8gSEREIHRvIGNoZWNrIGlmIFRTIGluZm8gYWNrIHBvbGljeSBmaWVsZCBjYW4gYmUKKyAqIHNldCB0byAiSFQtaW1tZWRpYXRlIGJsb2NrIGFja25vd2xlZGdlbWVudCIKKyAqCisgKiBSZXR1cm46IHRydWUgLSBDdXJyZW50IEFzc29jaWF0aW9uIGlzIEhUIGFzc29jaWF0aW9uIGFuZCBzbyBUUyBpbmZvIGFjaworICogICAgICAgICAgICAgICAgIHBvbGljeSBjYW4gYmUgc2V0IHRvICJIVC1pbW1lZGlhdGUgYmxvY2sgYWNrbm93bGVkZ2VtZW50IgorICovCitib29sIHNtZV9xb3NfaXNfdHNfaW5mb19hY2tfcG9saWN5X3ZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSBzbWVfUW9zV21tVHNwZWNJbmZvICpwUW9TSW5mbywKKwkJCQkJIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXREb3QxMWZCZWFjb25JRXMgKnBJZXMgPSBOVUxMOworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJQ0RGX1NUQVRVUyBoc3RhdHVzOworCWlmICghQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogU2Vzc2lvbiBJZCAlZCBpcyBpbnZhbGlkIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCisJaWYgKCFwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogU2Vzc2lvbiAlZCBpcyBpbmFjdGl2ZSIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogU2Vzc2lvbiAlZCBoYXMgYW4gSW52YWxpZCBCU1MgRGVzY3JpcHRvciIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWhzdGF0dXMgPSBjc3JfZ2V0X3BhcnNlZF9ic3NfZGVzY3JpcHRpb25faWVzKHBNYWMsCisJCQkJCQkgICAgICBwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjLAorCQkJCQkJICAgICAgJnBJZXMpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHVuYWJsZSB0byBwYXJzZSBCU1MgSUVzIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogc3VjY2VzcyBtZWFucyBwSWVzIHdhcyBhbGxvY2F0ZWQgKi8KKworCWlmICghcEllcy0+SFRDYXBzLnByZXNlbnQgJiYKKwkgICAgcFFvU0luZm8tPnRzX2luZm8uYWNrX3BvbGljeSA9PQorCSAgICBTTUVfUU9TX1dNTV9UU19BQ0tfUE9MSUNZX0hUX0lNTUVESUFURV9CTE9DS19BQ0spIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgSFQgQ2FwcyBhcmVuJ3QgcHJlc2VudCBidXQgYXBwbGljYXRpb24gc2V0IGFjayBwb2xpY3kgdG8gSFQgIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworCisJCWNkZl9tZW1fZnJlZShwSWVzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWNkZl9tZW1fZnJlZShwSWVzKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBzbWVfcW9zX3ZhbGlkYXRlX3JlcXVlc3RlZF9wYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywKKwkJCQkgICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqcFFvU0luZm8sCisJCQkJICAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCWJvb2wgcmMgPSBmYWxzZTsKKworCWRvIHsKKwkJaWYgKFNNRV9RT1NfV01NX1RTX0RJUl9SRVNWID09IHBRb1NJbmZvLT50c19pbmZvLmRpcmVjdGlvbikKKwkJCWJyZWFrOworCQlpZiAoIXNtZV9xb3NfaXNfdHNfaW5mb19hY2tfcG9saWN5X3ZhbGlkKHBNYWMsIHBRb1NJbmZvLCBzZXNzaW9uSWQpKQorCQkJYnJlYWs7CisKKwkJcmMgPSB0cnVlOworCX0gd2hpbGUgKDApOworCXJldHVybiByYzsKK30KKworc3RhdGljIENERl9TVEFUVVMgcW9zX2lzc3VlX2NvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDhfdCBzZXNzaW9uSWQsCisJCQkJICAgIGVTbWVDb21tYW5kVHlwZSBjbWRUeXBlLAorCQkJCSAgICBzbWVfUW9zV21tVHNwZWNJbmZvICpwUW9TSW5mbywKKwkJCQkgICAgc21lX1Fvc0VkY2FBY1R5cGUgYWMsIHVpbnQ4X3QgdHNwZWNfbWFzaykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfRV9SRVNPVVJDRVM7CisJdFNtZUNtZCAqcENvbW1hbmQgPSBOVUxMOworCWRvIHsKKwkJcENvbW1hbmQgPSBzbWVfZ2V0X2NvbW1hbmRfYnVmZmVyKHBNYWMpOworCQlpZiAoIXBDb21tYW5kKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICIlczogJWQ6IGZhaWwgdG8gZ2V0IGNvbW1hbmQgYnVmZmVyIGZvciBjb21tYW5kICVkIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgY21kVHlwZSk7CisJCQlicmVhazsKKwkJfQorCQlwQ29tbWFuZC0+Y29tbWFuZCA9IGNtZFR5cGU7CisJCXBDb21tYW5kLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisJCXN3aXRjaCAoY21kVHlwZSkgeworCQljYXNlIGVTbWVDb21tYW5kQWRkVHM6CisJCQlpZiAocFFvU0luZm8pIHsKKwkJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcENvbW1hbmQtPnUucW9zQ21kLnRzcGVjSW5mbyA9ICpwUW9TSW5mbzsKKwkJCQlwQ29tbWFuZC0+dS5xb3NDbWQuYWMgPSBhYzsKKwkJCX0gZWxzZSB7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkJICAiJXM6ICVkOiBOVUxMIHBvaW50ZXIgcGFzc2VkIiwKKwkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIGVTbWVDb21tYW5kRGVsVHM6CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQlwQ29tbWFuZC0+dS5xb3NDbWQuYWMgPSBhYzsKKwkJCXBDb21tYW5kLT51LnFvc0NtZC50c3BlY19tYXNrID0gdHNwZWNfbWFzazsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICAiJXM6ICVkOiBpbnZhbGlkIGNvbW1hbmQgdHlwZSAlZCIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIGNtZFR5cGUpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgwKTsKKwlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgJiYgcENvbW1hbmQpIHsKKwkJc21lX3B1c2hfY29tbWFuZChwTWFjLCBwQ29tbWFuZCwgZmFsc2UpOworCX0gZWxzZSBpZiAocENvbW1hbmQpIHsKKwkJcW9zX3JlbGVhc2VfY29tbWFuZChwTWFjLCBwQ29tbWFuZCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK2Jvb2wgcW9zX3Byb2Nlc3NfY29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCkKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlib29sIGZSZW1vdmVDbWQgPSB0cnVlOworCWRvIHsKKwkJc3dpdGNoIChwQ29tbWFuZC0+Y29tbWFuZCkgeworCQljYXNlIGVTbWVDb21tYW5kQWRkVHM6CisJCQlzdGF0dXMgPQorCQkJCXNtZV9xb3NfYWRkX3RzX3JlcShwTWFjLCAodWludDhfdCkgcENvbW1hbmQtPnNlc3Npb25JZCwKKwkJCQkJCSAgICZwQ29tbWFuZC0+dS5xb3NDbWQudHNwZWNJbmZvLAorCQkJCQkJICAgcENvbW1hbmQtPnUucW9zQ21kLmFjKTsKKwkJCWlmIChDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCWZSZW1vdmVDbWQgPSBmYWxzZTsKKwkJCQlzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1A7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBlU21lQ29tbWFuZERlbFRzOgorCQkJc3RhdHVzID0KKwkJCQlzbWVfcW9zX2RlbF90c19yZXEocE1hYywgKHVpbnQ4X3QpIHBDb21tYW5kLT5zZXNzaW9uSWQsCisJCQkJCQkgICBwQ29tbWFuZC0+dS5xb3NDbWQuYWMsCisJCQkJCQkgICBwQ29tbWFuZC0+dS5xb3NDbWQudHNwZWNfbWFzayk7CisJCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQlmUmVtb3ZlQ21kID0gZmFsc2U7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIiVzOiAlZDogaW52YWxpZCBjb21tYW5kIHR5cGUgJWQiLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBwQ29tbWFuZC0+Y29tbWFuZCk7CisJCQlicmVhazsKKwkJfSAvKiBzd2l0Y2ggKi8KKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gZlJlbW92ZUNtZDsKK30KKworLyoqCisgKiBzbWVfcW9zX3JlX3JlcXVlc3RfYWRkX3RzIC0gUmUtc2VuZCBBZGRUUyBmb3IgdGhlIGNvbWJpbmVkIFFvUyByZXF1ZXN0CisgKgorICogQG1hY19jdHggIFBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqIEBzZXNzaW9uX2lkICBTTUUgc2Vzc2lvbiBpZAorICogQHFvc19pbmZvIC0gVHNwZWMgaW5mb3JtYXRpb24KKyAqIEBhYyAtIEFjY2VzcyBjYXRlZ29yeQorICogQHRzcGVjX21hc2sgLSBUc3BlYyBNYXNrCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmUtc2VuZCBBZGRUUyBmb3IgdGhlIGNvbWJpbmVkIFFvUyByZXF1ZXN0CisgKgorICogUmV0dXJuOiBzdGF0dXMKKyAqLworc3RhdGljCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfcW9zX3JlX3JlcXVlc3RfYWRkX3RzKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCXVpbnQ4X3Qgc2Vzc2lvbl9pZCwgc21lX1Fvc1dtbVRzcGVjSW5mbyAqcW9zX2luZm8sCisJCXNtZV9Rb3NFZGNhQWNUeXBlIGFjLCB1aW50OF90IHRzcGVjX21hc2spCit7CisJc21lX1Fvc1Nlc3Npb25JbmZvICpzZXNzaW9uOworCXNtZV9Rb3NBQ0luZm8gKmFjX2luZm87CisJc21lX1Fvc1N0YXR1c1R5cGUgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQOworCXNtZV9Rb3NDbWRJbmZvIGNtZDsKKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJRkwoIiBJbnZva2VkIG9uIHNlc3Npb24gJWQgZm9yIEFDICVkIFRTUEVDICVkIiksCisJCXNlc3Npb25faWQsIGFjLCB0c3BlY19tYXNrKTsKKwlzZXNzaW9uID0gJnNtZV9xb3NfY2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbl9pZF07CisJYWNfaW5mbyA9ICZzZXNzaW9uLT5hY19pbmZvW2FjXTsKKwkvKiBuZWVkIHRvIHZvdGUgb2ZmIHBvd2Vyc2F2ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgcmVxdWVzdCAqLworCXNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gZmFsc2U7CisJLyoKKwkgKiBjYWxsIFBNQydzIHJlcXVlc3QgZm9yIHBvd2VyIGZ1bmN0aW9uCisJICogQU5EIGFub3RoZXIgY2hlY2sgaXMgYWRkZWQgY29uc2lkZXJpbmcgdGhlIGZsb3dpbmcgc2NlbmFyaW8KKwkgKiBBZGR0cyByZXFlc3QgaXMgcGVuZGluZyBvbiBvbmUgQUMsIHdoaWxlIEFQU0QgcmVxdWVzdGVkIG9uCisJICogYW5vdGhlciB3aGljaCBuZWVkcyBhIHJlYXNzb2MuIFdpbGwgYnVmZmVyIGEgcmVxdWVzdCBpZiBBZGR0cworCSAqIGlzIHBlbmRpbmcgb24gYW55IEFDLCB3aGljaCB3aWxsIHNhZmVnYXVyZCB0aGUgYWJvdmUgc2NlbmFyaW8sCisJICogMiYgYWxzbyB3b24ndCBjb25mdXNlIFBFIHdpdGggYmFjayB0byBiYWNrIEFkZHRzIG9yIEFkZHRzCisJICogZm9sbG93ZWQgYnkgUmVhc3NvYy4KKwkgKi8KKwlpZiAoc21lX3Fvc19pc19yc3BfcGVuZGluZyhzZXNzaW9uX2lkLCBhYykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiIE9uIHNlc3Npb24gJWQgYnVmZmVyaW5nIHRoZSBBZGRUUyByZXF1ZXN0ICIKKwkJCSJmb3IgQUMgJWQgaW4gc3RhdGUgJWQgYXMgQWRkdHMgaXMgcGVuZGluZyAiCisJCQkib24gb3RoZXIgQUMgb3Igd2FpdGluZyBmb3IgZnVsbCBwb3dlciIpLAorCQkJc2Vzc2lvbl9pZCwgYWMsCisJCQlhY19pbmZvLT5jdXJyX3N0YXRlKTsKKwkJLyogYnVmZmVyIGNtZCAqLworCQljbWQuY29tbWFuZCA9IFNNRV9RT1NfUkVTRU5EX1JFUTsKKwkJY21kLnBNYWMgPSBtYWNfY3R4OworCQljbWQuc2Vzc2lvbklkID0gc2Vzc2lvbl9pZDsKKwkJY21kLnUucmVzZW5kQ21kSW5mby5hYyA9IGFjOworCQljbWQudS5yZXNlbmRDbWRJbmZvLnRzcGVjTWFzayA9IHRzcGVjX21hc2s7CisJCWNtZC51LnJlc2VuZENtZEluZm8uUW9TSW5mbyA9ICpxb3NfaW5mbzsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc21lX3Fvc19idWZmZXJfY21kKCZjbWQsIGZhbHNlKSkpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwKKwkJCQlDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoIk9uIHNlc3Npb24gJWQgdW5hYmxlIHRvIGJ1ZmZlciB0aGUgQWRkVFMgIgorCQkJCSJyZXF1ZXN0IGZvciBBQyAlZCBUU1BFQyAlZCBpbiBzdGF0ZSAlZCIpLAorCQkJCXNlc3Npb25faWQsIGFjLCB0c3BlY19tYXNrLAorCQkJCWFjX2luZm8tPmN1cnJfc3RhdGUpOworCQkJLyogdW5hYmxlIHRvIGJ1ZmZlciB0aGUgcmVxdWVzdAorCQkJICogbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJCXNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJCXJldHVybiBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfRkFJTFVSRV9SU1A7CisJCX0KKwkJcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9QRU5ESU5HX1JTUDsKKwl9CisKKwkvKiBnZXQgaW50byB0aGUgc3RhdCBtL2MgdG8gc2VlIGlmIHRoZSByZXF1ZXN0IGNhbiBiZSBncmFudGVkICovCisJc3dpdGNoIChhY19pbmZvLT5jdXJyX3N0YXRlKSB7CisJY2FzZSBTTUVfUU9TX1FPU19PTjoKKwl7CisJCS8qIGlmIEFDTSwgc2VuZCBvdXQgYSBuZXcgQUREVFMgKi8KKwkJYWNfaW5mby0+aG9SZW5ld2FsID0gdHJ1ZTsKKwkJc3RhdHVzID0gc21lX3Fvc19zZXR1cChtYWNfY3R4LCBzZXNzaW9uX2lkLCBxb3NfaW5mbywgYWMpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQlGTCgic21lX3Fvc19zZXR1cCByZXR1cm5lZCBpbiBTTUVfUU9TX1FPU19PTiBzdGF0ZSIpKTsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorCQkJRkwoInNtZV9xb3Nfc2V0dXAgQUMgJWQgd2l0aCBzdGF0dXMgPSVkIiksIGFjLCBzdGF0dXMpOworCQlpZiAoU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQICE9IHN0YXR1cykgeworCQkJLyogd2UgYXJlbid0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVAgKi8KKwkJCS8qIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJCXNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gdHJ1ZTsKKwkJfQorCQlpZiAoU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQID09IHN0YXR1cykgeworCQkJc3RhdHVzID0gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1BFTkRJTkdfUlNQOworCQkJYWNfaW5mby0+dHNwZWNfcGVuZGluZyA9IHRzcGVjX21hc2s7CisJCX0gZWxzZSBpZiAoKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQID09CisJCQlzdGF0dXMpIHx8CisJCQkoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZID09CisJCQlzdGF0dXMpIHx8CisJCQkoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9QRU5ESU5HID09CisJCQlzdGF0dXMpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgiVUFQU0QgaXMgc2V0dXAgYWxyZWFkeSBzdGF0dXMgPSAlZCAiKSwKKwkJCQlzdGF0dXMpOworCQl9IGVsc2UgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJRkwoInNtZV9xb3Nfc2V0dXAgcmV0dXJuIHN0YXR1cyA9ICVkICIpLAorCQkJCXN0YXR1cyk7CisJCX0KKwl9CisJYnJlYWs7CisJY2FzZSBTTUVfUU9TX0hBTkRPRkY6CisJY2FzZSBTTUVfUU9TX1JFUVVFU1RFRDoKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQlGTCgiUmUtQWRkIHJlcXVlc3QgaW4gc3RhdGUgPSAlZCAgYnVmZmVyIHRoZSByZXF1ZXN0IiksCisJCQlhY19pbmZvLT5jdXJyX3N0YXRlKTsKKwkJY21kLmNvbW1hbmQgPSBTTUVfUU9TX1JFU0VORF9SRVE7CisJCWNtZC5wTWFjID0gbWFjX2N0eDsKKwkJY21kLnNlc3Npb25JZCA9IHNlc3Npb25faWQ7CisJCWNtZC51LnJlc2VuZENtZEluZm8uYWMgPSBhYzsKKwkJY21kLnUucmVzZW5kQ21kSW5mby50c3BlY01hc2sgPSB0c3BlY19tYXNrOworCQljbWQudS5yZXNlbmRDbWRJbmZvLlFvU0luZm8gPSAqcW9zX2luZm87CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHNtZV9xb3NfYnVmZmVyX2NtZCgmY21kLCBmYWxzZSkpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQlGTCgiIGNvdWxkbid0IGJ1ZiB0aGUgcmVhZCByZXF1ZXN0IHN0YXRlID0gJWQiKSwKKwkJCQlhY19pbmZvLT5jdXJyX3N0YXRlKTsKKwkJCS8qIHVuYWJsZSB0byBidWZmZXIgdGhlIHJlcXVlc3QKKwkJCSAqIG5vdGhpbmcgaXMgcGVuZGluZyBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uICovCisJCQlzZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IHRydWU7CisJCQlyZXR1cm4gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQOworCQl9CisJCXN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9QRU5ESU5HX1JTUDsKKwkJYnJlYWs7CisJY2FzZSBTTUVfUU9TX0NMT1NFRDoKKwljYXNlIFNNRV9RT1NfSU5JVDoKKwljYXNlIFNNRV9RT1NfTElOS19VUDoKKwlkZWZhdWx0OgorCQkvKiBwcmludCBlcnJvciBtc2csICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJRkwoIlJlQWRkIHJlcXVlc3QgaW4gdW5leHBlY3RlZCBzdGF0ZSA9ICVkIiksCisJCQlhY19pbmZvLT5jdXJyX3N0YXRlKTsKKwkJLyogdW5hYmxlIHRvIHNlcnZpY2UgdGhlIHJlcXVlc3QKKwkJICogbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24gKi8KKwkJc2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSB0cnVlOworCQlicmVhazsKKwl9CisJaWYgKChTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1AgPT0KKwkJc3RhdHVzKSB8fAorCQkoU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PQorCQlzdGF0dXMpKSB7CisJCSh2b2lkKXNtZV9xb3NfcHJvY2Vzc19idWZmZXJlZF9jbWQoc2Vzc2lvbl9pZCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHNtZV9xb3NfaW5pdF9hX2NzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCWZvciAoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykgeworCQljZGZfbWVtX3plcm8oJnBTZXNzaW9uLT5hY19pbmZvW2FjXSwgc2l6ZW9mKHNtZV9Rb3NBQ0luZm8pKTsKKwkJc21lX3Fvc19zdGF0ZV90cmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfSU5JVCk7CisJfQorfQorCitzdGF0aWMgQ0RGX1NUQVRVUyBzbWVfcW9zX3JlcXVlc3RfcmVhc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgKgorCQkJCQkgIHBNb2RGaWVsZHMsIGJvb2wgZkZvcmNlKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisJc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCSAgIiVzOiAlZDogSW52b2tlZCBvbiBzZXNzaW9uICVkIHdpdGggVUFQU0QgbWFzayAweCVYIiwKKwkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgcE1vZEZpZWxkcy0+dWFwc2RfbWFzayk7CisJcFNlc3Npb24gPSAmc21lX3Fvc19jYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCXN0YXR1cyA9CisJCWNzcl9yZWFzc29jKHBNYWMsIHNlc3Npb25JZCwgcE1vZEZpZWxkcywgJnBTZXNzaW9uLT5yb2FtSUQsIGZGb3JjZSk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCS8qIFVwZGF0ZSB0aGUgc3RhdGUgdG8gSGFuZG9mZiBzbyBzdWJzZXF1ZW50IHJlcXVlc3RzIGFyZSBxdWV1ZWQgdW50aWwgKi8KKwkJLyogdGhpcyBvbmUgaXMgZmluaXNoZWQgKi8KKwkJc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisJCWZvciAoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykgeworCQkJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgIiVzOiAlZDogQUNbJWRdIGlzIGluIHN0YXRlIFslZF0iLAorCQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBhYywgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisJCQkvKiBJZiBpdCBpcyBhbHJlYWR5IGluIEhBTkRPRkYgc3RhdGUsIGRvbid0IGRvIGFueXRoaW5nIHNpbmNlIHdlICovCisJCQkvKiBNVVNUIHByZXNlcnZlIHRoZSBwcmV2aW91cyBzdGF0ZSBhbmQgc21lX3Fvc19zdGF0ZV90cmFuc2l0aW9uICovCisJCQkvKiB3aWxsIGNoYW5nZSB0aGUgcHJldmlvdXMgc3RhdGUgKi8KKwkJCWlmIChTTUVfUU9TX0hBTkRPRkYgIT0gcEFDSW5mby0+Y3Vycl9zdGF0ZSkgeworCQkJCXNtZV9xb3Nfc3RhdGVfdHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLAorCQkJCQkJCSBTTUVfUU9TX0hBTkRPRkYpOworCQkJfQorCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBzbWVfcW9zX2Fzc2lnbl9mbG93X2lkKHZvaWQpCit7CisJdWludDMyX3QgZmxvd0lkOworCWZsb3dJZCA9IHNtZV9xb3NfY2IubmV4dEZsb3dJZDsKKwlpZiAoU01FX1FPU19NQVhfRkxPV19JRCA9PSBmbG93SWQpIHsKKwkJLyogVGhlIEZsb3cgSUQgd3JhcHBlZC4gIFRoaXMgaXMgb2J2aW91c2x5IG5vdCBhIHJlYWwgbGlmZSBzY2VuYXJpbyAqLworCQkvKiBidXQgaGFuZGxlIGl0IHRvIGtlZXAgdGhlIHNvZnR3YXJlIHRlc3QgZm9sa3MgaGFwcHkgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogJWQ6IFNvZnR3YXJlIFRlc3QgbWFkZSB0aGUgZmxvdyBjb3VudGVyIHdyYXAsICIKKwkJCSAgIlFvUyBtYXkgbm8gbG9uZ2VyIGJlIGZ1bmN0aW9uYWwiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOworCQlzbWVfcW9zX2NiLm5leHRGbG93SWQgPSBTTUVfUU9TX01JTl9GTE9XX0lEOworCX0gZWxzZSB7CisJCXNtZV9xb3NfY2IubmV4dEZsb3dJZCsrOworCX0KKwlyZXR1cm4gZmxvd0lkOworfQorCitzdGF0aWMgdWludDhfdCBzbWVfcW9zX2Fzc2lnbl9kaWFsb2dfdG9rZW4odm9pZCkKK3sKKwl1aW50OF90IHRva2VuOworCXRva2VuID0gc21lX3Fvc19jYi5uZXh0RGlhbG9nVG9rZW47CisJaWYgKFNNRV9RT1NfTUFYX0RJQUxPR19UT0tFTiA9PSB0b2tlbikgeworCQkvKiB3cmFwIGlzIG9rICovCisJCXNtZV9xb3NfY2IubmV4dERpYWxvZ1Rva2VuID0gU01FX1FPU19NSU5fRElBTE9HX1RPS0VOOworCX0gZWxzZSB7CisJCXNtZV9xb3NfY2IubmV4dERpYWxvZ1Rva2VuKys7CisJfQorCXJldHVybiB0b2tlbjsKK30KKworLyoqCisgKiBzbWVfcW9zX3RzcGVjX2FjdGl2ZSgpIC0gQVBJIGV4cG9zZWQgdG8gSEREIHRvIGNoZWNrIG5vIG9mIGFjdGl2ZSBUc3BlY3MKKyAqCisgKiBAcE1hYzogICAgICAgICAgIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3BlbgorICogQGFjOiAgICAgICAgICAgICBEZXRlcm1pbmVzIHR5cGUgb2YgQWNjZXNzIENhdGVnb3J5CisgKiBAc2Vzc2lvbklkOiAgICAgIHNlc3Npb25JZCByZXR1cm5lZCBieSBzbWVfT3BlblNlc3Npb24KKyAqIEBwQWN0aXZlVHNwZWM6ICAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYWN0aXZlIFRzcGVjcworICoKKyAqIFJldHVybjogdHJ1ZSBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKKyAqLworYm9vbCBzbWVfcW9zX3RzcGVjX2FjdGl2ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCBzbWVfYWNfZW51bV90eXBlIGFjLAorCQkJICB1aW50OF90IHNlc3Npb25JZCwgdWludDhfdCAqcEFjdGl2ZVRzcGVjKQoreworCXNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb24gPSBOVUxMOworCXNtZV9Rb3NBQ0luZm8gKnBBQ0luZm8gPSBOVUxMOworCisJaWYgKCFDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6ICVkOiBTZXNzaW9uIElkICVkIGlzIGludmFsaWQiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwU2Vzc2lvbiA9ICZzbWVfcW9zX2NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisKKwlpZiAoTlVMTCA9PSBwU2Vzc2lvbikgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZCBwU2Vzc2lvbiBub3QgZm91bmQgc2Vzc2lvbklkOiVkIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCFwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiAlZDogU2Vzc2lvbiAlZCBpcyBpbmFjdGl2ZSIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAiJXM6ICVkOiBTZXNzaW9uICVkIGlzIGFjdGl2ZSIsCisJCSAgX19mdW5jX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworCisJcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisKKwkvKiBEb2VzIHRoaXMgQUMgaGF2ZSBRb1MgYWN0aXZlPyAqLworCWlmIChTTUVfUU9TX1FPU19PTiA9PSBwQUNJbmZvLT5jdXJyX3N0YXRlKSB7CisJCS8qIFllcywgUW9TIGlzIGFjdGl2ZSBvbiB0aGlzIEFDICovCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJCSAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBBQyAlZCBoYXMgUW9TIGFjdGl2ZSIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgc2Vzc2lvbklkLCBhYyk7CisKKwkJLyogQXJlIGFueSBUU1BFQ3MgYWN0aXZlPyAqLworCQlpZiAocEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMpIHsKKwkJCS8qIGF0IGxlYXN0IDEgVFNQRUMgaXMgYWN0aXZlLiAgQXJlIHRoZXkgYm90aCBhY3RpdmU/ICovCisJCQlpZiAoU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUID09CisJCQkgICAgcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMpIHsKKwkJCQkvKiBib3RoIFRTUEVDUyBhcmUgYWN0aXZlICovCisJCQkJKnBBY3RpdmVUc3BlYyA9IDI7CisJCQl9IGVsc2UgeworCQkJCS8qIG9ubHkgb25lIFRTUEVDIGlzIGFjdGl2ZSAqLworCQkJCSpwQWN0aXZlVHNwZWMgPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJKnBBY3RpdmVUc3BlYyA9IDA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBIYXJkY29kaW5nIHZhbHVlIHRvIElOVkFMSURfVFNQRUMgdG8gaW5kaWNhdGUgdGhlIGNhbGxlcgorCQkgKiBub3QgdG8gdXBkYXRlIFVBUFNEIHBhcmFtZXRlcnMgYXMgUU9TIGlzIG5vdCBhY3RpdmUKKwkJICovCisJCSpwQWN0aXZlVHNwZWMgPSBJTlZBTElEX1RTUEVDOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisJCQkgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgQUMgJWQgaGFzIG5vIFFvUyBhY3RpdmUiLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHNlc3Npb25JZCwgYWMpOworCX0KKworCXJldHVybiB0cnVlOworfQorCisjZW5kaWYgLyogV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUICovCmRpZmYgLS1naXQgYS9jb3JlL3NtZS9zcmMvcnJtL3NtZV9ycm0uYyBiL2NvcmUvc21lL3NyYy9ycm0vc21lX3JybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OGY3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NtZS9zcmMvcnJtL3NtZV9ycm0uYwpAQCAtMCwwICsxLDE1NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIHNtZV9Scm0uYworCisgICBcYnJpZWYgaW1wbGVtZW50YXRpb24gZm9yIFNNRSBSUk0gQVBJcworCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBJbmNsdWRlIEZpbGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJzbWVfaW5zaWRlLmgiCisjaW5jbHVkZSAic21lX2FwaS5oIgorI2luY2x1ZGUgInNtc19kZWJ1Zy5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyNpbmNsdWRlICJob3N0X2RpYWdfY29yZV9ldmVudC5oIgorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworI2luY2x1ZGUgImNzcl9pbnNpZGVfYXBpLmgiCisKKyNpbmNsdWRlICJycm1fZ2xvYmFsLmgiCisKKworLyogUm9hbSBzY29yZSBmb3IgYSBuZWlnaGJvciBBUCB3aWxsIGJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGJlbG93IGRlZmluaXRpb25zLgorICAgIFRoZSBjYWxjdWxhdGVkIHJvYW0gc2NvcmUgd2lsbCBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgcm9hbWFibGUgY2FuZGlkYXRlIGZyb20gbmVpZ2hib3IgQVAgbGlzdCAqLworI2RlZmluZSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfUkVBQ0hBQklMSVRZICAgICAgICAgICAgIDAgICAgICAgLyogV2hlbiB3ZSBzdXBwb3J0IDExciBvdmVyIHRoZSBEUywgdGhpcyBzaG91bGQgaGF2ZSBhIG5vbi16ZXJvIHZhbHVlICovCisjZGVmaW5lIFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9TRUNVUklUWSAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfUkVQT1JUX0tFWV9TQ09QRSAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9TUEVDVFJVTV9NR01UIDAgICAgICAgLyogTm90IHVzZWQgKi8KKyNkZWZpbmUgUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfUkVQT1JUX0NBUEFCSUxJVFlfUU9TICAgICAgICAgICA1CisjZGVmaW5lIFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9DQVBBQklMSVRZX0FQU0QgICAgICAgICAgMworI2RlZmluZSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9SUk0gICAgICAgICAgIDgKKyNkZWZpbmUgUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfUkVQT1JUX0NBUEFCSUxJVFlfREVMQVlFRF9CQSAgICAwICAgICAgIC8qIFdlIGRvbnQgc3VwcG9ydCBkZWxheWVkIEJBICovCisjZGVmaW5lIFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9DQVBBQklMSVRZX0lNTUVESUFURV9CQSAgMworI2RlZmluZSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfTU9CSUxJVFlfRE9NQUlOICAgICAgICAgIDMwCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisjZGVmaW5lIFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX0lBUFBfTElTVCAgICAgICAgICAgICAgICAgICAgICAgMzAKKyNlbmRpZgorCit2X1RJTUVfdCBycm1fc2Nhbl90aW1lcjsKKworLyoqCisgKiBycm1fbGxfcHVyZ2VfbmVpZ2hib3JfY2FjaGUoKSAtUHVyZ2VzIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgbmVpZ2hib3IgY2FjaGUKKyAqCisgKiBAcE1hYzogUG9pbnRlciB0byB0aGUgSGFsIEhhbmRsZS4KKyAqIEBwTGlzdDogUG9pbnRlciB0aGUgTGlzdCB0aGF0IHNob3VsZCBiZSBwdXJnZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBwdXJnZXMgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBuZWlnaGJvciBjYWNoZSBhbmQgZnJlZXMgdXAgYWxsCisgKiB0aGUgaW50ZXJuYWwgbm9kZXMKKyAqCisgKiBSZXR1cm46IHZvaWQKKyAqLworc3RhdGljIHZvaWQgcnJtX2xsX3B1cmdlX25laWdoYm9yX2NhY2hlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJdERibExpbmtMaXN0ICpwTGlzdCkKK3sKKwl0TGlzdEVsZW0gKnBFbnRyeTsKKwl0UnJtTmVpZ2hib3JSZXBvcnREZXNjICpwTmVpZ2hib3JSZXBvcnREZXNjOworCWNzcl9sbF9sb2NrKHBMaXN0KTsKKwl3aGlsZSAoKHBFbnRyeSA9IGNzcl9sbF9yZW1vdmVfaGVhZChwTGlzdCwgTExfQUNDRVNTX05PTE9DSykpICE9IE5VTEwpIHsKKwkJcE5laWdoYm9yUmVwb3J0RGVzYyA9CisJCQlHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFJybU5laWdoYm9yUmVwb3J0RGVzYywgTGlzdCk7CisJCWNkZl9tZW1fZnJlZShwTmVpZ2hib3JSZXBvcnREZXNjLT5wTmVpZ2hib3JCc3NEZXNjcmlwdGlvbik7CisJCWNkZl9tZW1fZnJlZShwTmVpZ2hib3JSZXBvcnREZXNjKTsKKwl9CisJY3NyX2xsX3VubG9jayhwTGlzdCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIHJybV9pbmRpY2F0ZV9uZWlnaGJvcl9yZXBvcnRfcmVzdWx0KCkgLWNhbGxzIHRoZSBjYWxsYmFjayByZWdpc3RlcmVkIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWlnaGJvciByZXBvcnQKKyAqIEBwTWFjOiBQb2ludGVyIHRvIHRoZSBIYWwgSGFuZGxlLgorICogQGNkZl9zdGF0dXMgLSBDREZfU1RBVFVTX1NVQ0NFU1MvQ0RGX1NUQVRVU19GQUlMVVJFIGJhc2VkIG9uIHdoZXRoZXIgYSB2YWxpZAorICogICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydCBpcyByZWNlaXZlZCBvciBuZWlnaGJvciB0aW1lciBleHBpcmVkCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgY2FsbGJhY2sgcmVnaXN0ZXIgYnkgdGhlIGNhbGxlciB3aGlsZSByZXF1ZXN0aW5nIGZvcgorICogbmVpZ2hib3IgcmVwb3J0LiBUaGlzIGZ1bmN0aW9uIGdldHMgaW52b2tlZCBpZiBhIG5laWdoYm9yIHJlcG9ydCBpcyByZWNlaXZlZAorICogZnJvbSBhbiBBUCBvciBuZWlnaGJvciByZXNwb25zZSB3YWl0IHRpbWVyIGV4cGlyZXMuCisgKgorICogUmV0dXJuOiB2b2lkCisgKi8KK3ZvaWQgcnJtX2luZGljYXRlX25laWdoYm9yX3JlcG9ydF9yZXN1bHQodHBBbmlTaXJHbG9iYWwgcE1hYywgQ0RGX1NUQVRVUyBjZGZfc3RhdHVzKQoreworCU5laWdoYm9yUmVwb3J0UnNwQ2FsbGJhY2sgY2FsbGJhY2s7CisJdm9pZCAqY2FsbGJhY2tDb250ZXh0OworCisJLyogUmVzZXQgdGhlIG5laWdoYm9yIHJlc3BvbnNlIHBlbmRpbmcgc3RhdHVzICovCisJcE1hYy0+cnJtLnJybVNtZUNvbnRleHQubmVpZ2hib3JSZXFDb250cm9sSW5mby5pc05laWdoYm9yUnNwUGVuZGluZyA9CisJCWZhbHNlOworCisJLyogU3RvcCB0aGUgdGltZXIgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLiBUaGUgdGltZXIgc2hvdWxkIGJlIHJ1bm5pbmcgb25seSBpbiB0aGUgU1VDQ0VTUyBjYXNlLiAqLworCWlmIChDREZfVElNRVJfU1RBVEVfUlVOTklORyA9PQorCSAgICBjZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0LgorCQkJCQkgICBuZWlnaGJvclJlcUNvbnRyb2xJbmZvLgorCQkJCQkgICBuZWlnaGJvclJzcFdhaXRUaW1lcikpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0cxLCBGTCgiTm8gZW50cnkgaW4gbmVpZ2hib3IgcmVwb3J0IGNhY2hlIikpOworCQljZGZfbWNfdGltZXJfc3RvcCgmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQuCisJCQkJICBuZWlnaGJvclJlcUNvbnRyb2xJbmZvLm5laWdoYm9yUnNwV2FpdFRpbWVyKTsKKwl9CisJY2FsbGJhY2sgPQorCQlwTWFjLT5ycm0ucnJtU21lQ29udGV4dC5uZWlnaGJvclJlcUNvbnRyb2xJbmZvLgorCQluZWlnaGJvclJzcENhbGxiYWNrSW5mby5uZWlnaGJvclJzcENhbGxiYWNrOworCWNhbGxiYWNrQ29udGV4dCA9CisJCXBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVxQ29udHJvbEluZm8uCisJCW5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvLm5laWdoYm9yUnNwQ2FsbGJhY2tDb250ZXh0OworCisJLyogUmVzZXQgdGhlIGNhbGxiYWNrIGFuZCB0aGUgY2FsbGJhY2sgY29udGV4dCBiZWZvcmUgY2FsbGluZyB0aGUgY2FsbGJhY2suIEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgdGhlcmUgbWF5IGJlIGEgcmVnaXN0cmF0aW9uIGluCisJICAgY2FsbGJhY2sgaXRzZWxmLiAqLworCXBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVxQ29udHJvbEluZm8ubmVpZ2hib3JSc3BDYWxsYmFja0luZm8uCisJbmVpZ2hib3JSc3BDYWxsYmFjayA9IE5VTEw7CisJcE1hYy0+cnJtLnJybVNtZUNvbnRleHQubmVpZ2hib3JSZXFDb250cm9sSW5mby5uZWlnaGJvclJzcENhbGxiYWNrSW5mby4KKwluZWlnaGJvclJzcENhbGxiYWNrQ29udGV4dCA9IE5VTEw7CisKKwkvKiBDYWxsIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBjYWxsZXIgKi8KKwlpZiAoY2FsbGJhY2spCisJCWNhbGxiYWNrKGNhbGxiYWNrQ29udGV4dCwgY2RmX3N0YXR1cyk7CisKKwlyZXR1cm47CisKK30KKworLyoqCisgKiBzbWVfUnJtQmVhY29uUmVwb3J0WG1pdEluZCAoKSAtIFNlbmQgYmVhY29uIHJlcG9ydAorICogQG1hY19jdHggIFBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqIEByZXN1bHRfYXJyIHNjYW4gcmVzdWx0cworICogQG1zcm1udF9zdGF0dXMgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZWFzdXJlbWVudCBpcyBkb25lLgorICogQGJzc19jb3VudCAgYnNzIGNvdW50CisgKgorICogQ3JlYXRlIGFuZCBzZW5kIHRoZSBiZWFjb24gcmVwb3J0IFhtaXQgaW5kIG1lc3NhZ2UgdG8gUEUuCisgKgorICogUmV0dXJuOiBzdGF0dXMKKyAqLworCitzdGF0aWMgQ0RGX1NUQVRVUworc21lX3JybV9zZW5kX2JlYWNvbl9yZXBvcnRfeG1pdF9pbmQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwl0Q3NyU2NhblJlc3VsdEluZm8gKipyZXN1bHRfYXJyLCB1aW50OF90IG1zcm1udF9zdGF0dXMsCisJdWludDhfdCBic3NfY291bnQpCit7CisJdHBTaXJCc3NEZXNjcmlwdGlvbiBic3NfZGVzYyA9IE5VTEw7CisJdHBTaXJCZWFjb25SZXBvcnRYbWl0SW5kIGJlYWNvbl9yZXA7CisJdWludDE2X3QgbGVuZ3RoLCBpZV9sZW47CisJdWludDhfdCAgaSA9IDAsIGogPSAwOworCXRDc3JTY2FuUmVzdWx0SW5mbyAqY3VyX3Jlc3VsdCA9IE5VTEw7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0cFJybVNNRUNvbnRleHQgcnJtX2N0eCA9ICZtYWNfY3R4LT5ycm0ucnJtU21lQ29udGV4dDsKKworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKwlzbXNfbG9nKG1hY19jdHgsIExPR0UsICJCZWFjb24gcmVwb3J0IHhtaXQgSW5kIHRvIFBFIik7CisjZW5kaWYKKworCWlmIChOVUxMID09IHJlc3VsdF9hcnIgJiYgIW1zcm1udF9zdGF0dXMpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCAiQmVhY29uIHJlcG9ydCB4bWl0IEluZCB0byBQRSBGYWlsZWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChyZXN1bHRfYXJyKQorCQljdXJfcmVzdWx0ID0gcmVzdWx0X2FycltqXTsKKworCWRvIHsKKwkJbGVuZ3RoID0gc2l6ZW9mKHRTaXJCZWFjb25SZXBvcnRYbWl0SW5kKTsKKwkJYmVhY29uX3JlcCA9IGNkZl9tZW1fbWFsbG9jKGxlbmd0aCk7CisJCWlmIChOVUxMID09IGJlYWNvbl9yZXApIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HUCwKKwkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYmVhY29uIHJlcG9ydCIpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJfQorCQljZGZfbWVtX3plcm8oYmVhY29uX3JlcCwgbGVuZ3RoKTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkFsbG9jYXRlZCBtZW1vcnkgZm9yIGJlYWNvbl9yZXAiKSk7CisjZW5kaWYKKwkJYmVhY29uX3JlcC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9CRUFDT05fUkVQT1JUX1JFU1BfWE1JVF9JTkQ7CisJCWJlYWNvbl9yZXAtPmxlbmd0aCA9IGxlbmd0aDsKKwkJYmVhY29uX3JlcC0+dURpYWxvZ1Rva2VuID0gcnJtX2N0eC0+dG9rZW47CisJCWJlYWNvbl9yZXAtPmR1cmF0aW9uID0gcnJtX2N0eC0+ZHVyYXRpb25bMF07CisJCWJlYWNvbl9yZXAtPnJlZ0NsYXNzID0gcnJtX2N0eC0+cmVnQ2xhc3M7CisJCWNkZl9tZW1fY29weShiZWFjb25fcmVwLT5ic3NJZCwgcnJtX2N0eC0+c2Vzc2lvbkJzc0lkLmJ5dGVzLAorCQkJQ0RGX01BQ19BRERSX1NJWkUpOworCisJCWkgPSAwOworCQl3aGlsZSAoY3VyX3Jlc3VsdCkgeworCQkJYnNzX2Rlc2MgPSAmY3VyX3Jlc3VsdC0+QnNzRGVzY3JpcHRvcjsKKwkJCWlmIChic3NfZGVzYyA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJaWVfbGVuID0gR0VUX0lFX0xFTl9JTl9CU1MoYnNzX2Rlc2MtPmxlbmd0aCk7CisJCQliZWFjb25fcmVwLT5wQnNzRGVzY3JpcHRpb25baV0gPQorCQkJCWNkZl9tZW1fbWFsbG9jKGllX2xlbiArCisJCQkJCXNpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pKTsKKwkJCWlmIChOVUxMID09CisJCQkJYmVhY29uX3JlcC0+cEJzc0Rlc2NyaXB0aW9uW2ldKQorCQkJCWJyZWFrOworCQkJY2RmX21lbV9jb3B5KGJlYWNvbl9yZXAtPnBCc3NEZXNjcmlwdGlvbltpXSwKKwkJCQlic3NfZGVzYywgc2l6ZW9mKHRTaXJCc3NEZXNjcmlwdGlvbikpOworCQkJY2RmX21lbV9jb3B5KAorCQkJCSZiZWFjb25fcmVwLT5wQnNzRGVzY3JpcHRpb25baV0tPmllRmllbGRzWzBdLAorCQkJCWJzc19kZXNjLT5pZUZpZWxkcywgaWVfbGVuKTsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwKKwkJCQkiLlJSTSBSZXN1bHQgQnNzaWQgPSAiIE1BQ19BRERSRVNTX1NUUgorCQkJCSIgY2hhbj0gJWQsIHJzc2kgPSAtJWQiLAorCQkJCU1BQ19BRERSX0FSUkFZKAorCQkJCWJlYWNvbl9yZXAtPnBCc3NEZXNjcmlwdGlvbltpXS0+YnNzSWQpLAorCQkJCWJlYWNvbl9yZXAtPnBCc3NEZXNjcmlwdGlvbltpXS0+Y2hhbm5lbElkLAorCQkJCWJlYWNvbl9yZXAtPnBCc3NEZXNjcmlwdGlvbltpXS0+cnNzaSAqICgtMSkpOworCQkJCWJlYWNvbl9yZXAtPm51bUJzc0Rlc2MrKzsKKwkJCWlmICgrK2kgPj0gU0lSX0JDTl9SRVBPUlRfTUFYX0JTU19ERVNDKQorCQkJCWJyZWFrOworCQkJY3VyX3Jlc3VsdCA9CisJCQkJcmVzdWx0X2FycltqICsgaV07CisJCX0KKworCQlqICs9IGk7CisJCWlmICghcmVzdWx0X2FyciB8fCAoY3VyX3Jlc3VsdCA9PSBOVUxMKQorCQkJfHwgKGogPj0gYnNzX2NvdW50KSkgeworCQkJY3VyX3Jlc3VsdCA9IE5VTEw7CisJCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsCisJCQkJIlJlYWNoZWQgdG8gIG1heC9sYXN0IEJTUyBpbiBjdXJfcmVzdWx0IGxpc3QiKTsKKwkJfSBlbHNlIHsKKwkJCWN1cl9yZXN1bHQgPSByZXN1bHRfYXJyW2pdOworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJCSJNb3ZlIHRvIHRoZSBuZXh0IEJTUyBzZXQgaW4gY3VyX3Jlc3VsdCBsaXN0Iik7CisJCX0KKwkJYmVhY29uX3JlcC0+Zk1lYXN1cmVEb25lID0KKwkJCShjdXJfcmVzdWx0KSA/IGZhbHNlIDogbXNybW50X3N0YXR1czsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLAorCQkJIlNNRSBTZW5kaW5nIEJjblJlcFhtaXQgdG8gUEUgbnVtQnNzICVkIGkgJWQgaiAlZCIsCisJCQliZWFjb25fcmVwLT5udW1Cc3NEZXNjLCBpLCBqKTsKKwkJc3RhdHVzID0gY2RzX3NlbmRfbWJfbWVzc2FnZV90b19tYWMoYmVhY29uX3JlcCk7CisJfSB3aGlsZSAoY3VyX3Jlc3VsdCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKy8qKgorICogc21lX2VzZV9zZW5kX2JlYWNvbl9yZXFfc2Nhbl9yZXN1bHRzICgpIC0gU2VuZCBiZWFjb24gcmVwb3J0CisgKiBAbWFjX2N0eCAgUG9pbnRlciB0byBtYWMgY29udGV4dAorICogQHNlc3Npb25faWQgLSBzZXNzaW9uIGlkCisgKiBAcmVzdWx0X2FyciBzY2FuIHJlc3VsdHMKKyAqIEBtc3JtbnRfc3RhdHVzIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWVhc3VyZW1lbnQgaXMgZG9uZS4KKyAqIEBic3NfY291bnQgIG51bWJlciBvZiBic3MgZm91bmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIHVwIHRoZSBzY2FuIHJlc3VsdHMgcmVjZWl2ZWQgYXMgYSBwYXJ0IG9mCisgKiBiZWFjb24gcmVxdWVzdCBzY2FubmluZy4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHJlY2VpdmluZyB0aGUgc2NhbiByZXN1bHRzIHBlciBjaGFubmVsCisgKiBEdWUgdG8gdGhlIGxpbWl0YXRpb24gb24gdGhlIHNpemUgb2YgdGhlIElXRVZDVVNUT00gYnVmZmVyLCB3ZSBzZW5kCisgKiAzIEJTU0lEcyBvZiBiZWFjb24gcmVwb3J0IGluZm9ybWF0aW9uIGluIG9uZSBjdXN0b20gZXZlbnQ7CisgKgorICogUmV0dXJuOiBzdGF0dXMKKyAqLworc3RhdGljIENERl9TVEFUVVMgc21lX2VzZV9zZW5kX2JlYWNvbl9yZXFfc2Nhbl9yZXN1bHRzKAorCXRwQW5pU2lyR2xvYmFsIG1hY19jdHgsIHVpbnQzMl90IHNlc3Npb25faWQsCisJdWludDhfdCBjaGFubmVsLCB0Q3NyU2NhblJlc3VsdEluZm8gKipyZXN1bHRfYXJyLAorCXVpbnQ4X3QgbXNybW50X3N0YXR1cywgdWludDhfdCBic3NfY291bnQpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl0U2lyUmV0U3RhdHVzIGZpbGxfaWVfc3RhdHVzOworCXRwU2lyQnNzRGVzY3JpcHRpb24gYnNzX2Rlc2MgPSBOVUxMOworCXVpbnQzMl90IGllX2xlbiA9IDA7CisJdWludDMyX3Qgb3V0X2llX2xlbiA9IDA7CisJdWludDhfdCBic3NfY291bnRlciA9IDA7CisJdENzclNjYW5SZXN1bHRJbmZvICpjdXJfcmVzdWx0ID0gTlVMTDsKKwl0cFJybVNNRUNvbnRleHQgcnJtX2N0eCA9ICZtYWNfY3R4LT5ycm0ucnJtU21lQ29udGV4dDsKKwl0Q3NyUm9hbUluZm8gcm9hbV9pbmZvOworCXRTaXJFc2VCY25SZXBvcnRSc3AgYmNuX3JwdF9yc3A7CisJdHBTaXJFc2VCY25SZXBvcnRSc3AgYmNuX3JlcG9ydCA9ICZiY25fcnB0X3JzcDsKKwl0cENzckVzZUJlYWNvblJlcVBhcmFtcyBjdXJfbWVhc19yZXEgPSBOVUxMOworCXVpbnQ4X3QgaSA9IDAsIGogPSAwOworCXRCY25SZXBvcnRGaWVsZHMgKmJjbl9ycHRfZmllbGRzOworCisJaWYgKE5VTEwgPT0gcnJtX2N0eCkgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsICJycm1fY3R4IGlzIE5VTEwiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChOVUxMID09IHJlc3VsdF9hcnIgJiYgIW1zcm1udF9zdGF0dXMpIHsKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCAiQmVhY29uIHJlcG9ydCB4bWl0IEluZCB0byBIREQgRmFpbGVkIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAocmVzdWx0X2FycikKKwkJY3VyX3Jlc3VsdCA9IHJlc3VsdF9hcnJbYnNzX2NvdW50ZXJdOworCisJY2RmX21lbV96ZXJvKCZiY25fcnB0X3JzcCwgc2l6ZW9mKHRTaXJFc2VCY25SZXBvcnRSc3ApKTsKKwlkbyB7CisJCWN1cl9tZWFzX3JlcSA9IE5VTEw7CisJCWZvciAoaSA9IDA7IGkgPCBycm1fY3R4LT5lc2VCY25SZXFJbmZvLm51bUJjblJlcUllOyBpKyspIHsKKwkJCWlmIChycm1fY3R4LT5lc2VCY25SZXFJbmZvLmJjblJlcVtpXS5jaGFubmVsID09CisJCQkJY2hhbm5lbCkgeworCQkJCWN1cl9tZWFzX3JlcSA9CisJCQkJCSZycm1fY3R4LT5lc2VCY25SZXFJbmZvLmJjblJlcVtpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoTlVMTCAhPSBjdXJfbWVhc19yZXEpCisJCQliY25fcmVwb3J0LT5tZWFzdXJlbWVudFRva2VuID0KKwkJCQljdXJfbWVhc19yZXEtPm1lYXN1cmVtZW50VG9rZW47CisJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwgIkNoYW5uZWwoJWQpIE1lYXNUb2tlbiglZCkiLCBjaGFubmVsLAorCQkJYmNuX3JlcG9ydC0+bWVhc3VyZW1lbnRUb2tlbik7CisKKwkJaiA9IDA7CisJCXdoaWxlIChjdXJfcmVzdWx0KSB7CisJCQlic3NfZGVzYyA9ICZjdXJfcmVzdWx0LT5Cc3NEZXNjcmlwdG9yOworCQkJaWYgKE5VTEwgPT0gYnNzX2Rlc2MpIHsKKwkJCQljdXJfcmVzdWx0ID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWllX2xlbiA9IEdFVF9JRV9MRU5fSU5fQlNTKGJzc19kZXNjLT5sZW5ndGgpOworCQkJYmNuX3JwdF9maWVsZHMgPQorCQkJCSZiY25fcmVwb3J0LT5iY25SZXBCc3NJbmZvW2pdLmJjblJlcG9ydEZpZWxkczsKKwkJCWJjbl9ycHRfZmllbGRzLT5DaGFuTnVtID0KKwkJCQlic3NfZGVzYy0+Y2hhbm5lbElkOworCQkJYmNuX3JlcG9ydC0+YmNuUmVwQnNzSW5mb1tqXS5iY25SZXBvcnRGaWVsZHMuU3BhcmUgPSAwOworCQkJaWYgKE5VTEwgIT0gY3VyX21lYXNfcmVxKQorCQkJCWJjbl9ycHRfZmllbGRzLT5NZWFzRHVyYXRpb24gPQorCQkJCQljdXJfbWVhc19yZXEtPm1lYXN1cmVtZW50RHVyYXRpb247CisJCQliY25fcnB0X2ZpZWxkcy0+UGh5VHlwZSA9IGJzc19kZXNjLT5ud1R5cGU7CisJCQliY25fcnB0X2ZpZWxkcy0+UmVjdlNpZ1Bvd2VyID0gYnNzX2Rlc2MtPnJzc2k7CisJCQliY25fcnB0X2ZpZWxkcy0+UGFyZW50VHNmID0gYnNzX2Rlc2MtPnBhcmVudFRTRjsKKwkJCWJjbl9ycHRfZmllbGRzLT5UYXJnZXRUc2ZbMF0gPSBic3NfZGVzYy0+dGltZVN0YW1wWzBdOworCQkJYmNuX3JwdF9maWVsZHMtPlRhcmdldFRzZlsxXSA9IGJzc19kZXNjLT50aW1lU3RhbXBbMV07CisJCQliY25fcnB0X2ZpZWxkcy0+QmNuSW50ZXJ2YWwgPSBic3NfZGVzYy0+YmVhY29uSW50ZXJ2YWw7CisJCQliY25fcnB0X2ZpZWxkcy0+Q2FwYWJpbGl0eUluZm8gPQorCQkJCWJzc19kZXNjLT5jYXBhYmlsaXR5SW5mbzsKKworCQkJY2RmX21lbV9jb3B5KGJjbl9ycHRfZmllbGRzLT5Cc3NpZCwKKwkJCQlic3NfZGVzYy0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCQkJCWZpbGxfaWVfc3RhdHVzID0KKwkJCQkJc2lyX2JlYWNvbl9pZV9lc2VfYmNuX3JlcG9ydChtYWNfY3R4LAorCQkJCQkJKHVpbnQ4X3QgKikgYnNzX2Rlc2MtPmllRmllbGRzLAorCQkJCQkJaWVfbGVuLAorCQkJCQkJJihiY25fcmVwb3J0LT5iY25SZXBCc3NJbmZvW2pdLnBCdWYpLAorCQkJCQkJJm91dF9pZV9sZW4pOworCQkJaWYgKGVTSVJfRkFJTFVSRSA9PSBmaWxsX2llX3N0YXR1cykKKwkJCQljb250aW51ZTsKKwkJCWJjbl9yZXBvcnQtPmJjblJlcEJzc0luZm9bal0uaWVMZW4gPSBvdXRfaWVfbGVuOworCisJCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsICJCc3NpZCgiIE1BQ19BRERSRVNTX1NUUiIpIgorCQkJCSJDaGFubmVsPSVkIFJzc2k9JWQiLAorCQkJCU1BQ19BRERSX0FSUkFZKGJzc19kZXNjLT5ic3NJZCksCisJCQlic3NfZGVzYy0+Y2hhbm5lbElkLCAoLTEpICogYnNzX2Rlc2MtPnJzc2kpOworCQkJYmNuX3JlcG9ydC0+bnVtQnNzKys7CisJCQlpZiAoKytqID49IFNJUl9CQ05fUkVQT1JUX01BWF9CU1NfREVTQykKKwkJCQlicmVhazsKKwkJCWN1cl9yZXN1bHQgPSByZXN1bHRfYXJyW2pdOworCQl9CisKKwkJYnNzX2NvdW50ZXIgKz0gajsKKwkJaWYgKCFyZXN1bHRfYXJyIHx8ICFjdXJfcmVzdWx0CisJCXx8IChic3NfY291bnRlciA+PSBTSVJfQkNOX1JFUE9SVF9NQVhfQlNTX0RFU0MpKSB7CisJCQljdXJfcmVzdWx0ID0gTlVMTDsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwKKwkJCQkiUmVhY2hlZCB0byB0aGUgbWF4L2xhc3QgQlNTIGluIGN1cl9yZXN1bHQgbGlzdCIpOworCQl9IGVsc2UgeworCQkJY3VyX3Jlc3VsdCA9IHJlc3VsdF9hcnJbYnNzX2NvdW50ZXJdOworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCSJNb3ZlIHRvIHRoZSBuZXh0IEJTUyBzZXQgaW4gY3VyX3Jlc3VsdCBsaXN0Iik7CisJCX0KKworCQliY25fcmVwb3J0LT5mbGFnID0KKwkJCShtc3JtbnRfc3RhdHVzIDw8IDEpIHwgKChjdXJfcmVzdWx0KSA/IHRydWUgOiBmYWxzZSk7CisKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0cxLCAiU01FIFNlbmRpbmcgQmNuUmVwIHRvIEhERCBudW1Cc3MoJWQpIgorCQkJIiBqKCVkKSBic3NfY291bnRlciglZCkgZmxhZyglZCkiLAorCQkJYmNuX3JlcG9ydC0+bnVtQnNzLCBqLCBic3NfY291bnRlciwKKwkJCWJjbl9yZXBvcnQtPmZsYWcpOworCisJCXJvYW1faW5mby5wRXNlQmNuUmVwb3J0UnNwID0gYmNuX3JlcG9ydDsKKwkJc3RhdHVzID0gY3NyX3JvYW1fY2FsbF9jYWxsYmFjayhtYWNfY3R4LCBzZXNzaW9uX2lkLCAmcm9hbV9pbmZvLAorCQkJMCwgZUNTUl9ST0FNX0VTRV9CQ05fUkVQT1JUX0lORCwgMCk7CisKKwkJLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCB0byBJRSAqLworCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKQorCQkJaWYgKGJjbl9yZXBvcnQtPmJjblJlcEJzc0luZm9baV0ucEJ1ZikKKwkJCQljZGZfbWVtX2ZyZWUoYmNuX3JlcG9ydC0+YmNuUmVwQnNzSW5mb1tpXS5wQnVmKTsKKwl9IHdoaWxlIChjdXJfcmVzdWx0KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKworLyoqCisgKiBzbWVfcnJtX3NlbmRfc2Nhbl9yZXN1bHQoKSAtIHRvIGdldCBzY2FuIHJlc3VsdCBhbmQgc2VuZCB0aGUgYmVhY29uIHJlcG9ydAorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqIEBudW1fY2hhbjogbnVtYmVyIG9mIGNoYW5uZWxzCisgKiBAY2hhbl9saXN0OiBsaXN0IG9mIGNoYW5uZWxzIHRvIGZldGNoIHRoZSByZXN1bHQgZnJvbQorICogQG1lYXN1cmVtZW50ZG9uZTogRmxhZyB0byBpbmRpY2F0ZSBtZWFzdXJlbWVudCBkb25lIG9yIG5vCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSBzY2FuIHJlc3VsdCBmcm9tIENTUiBhbmQgc2VuZCB0aGUgYmVhY29uCisgKiByZXBvcnQgeG1pdCBpbmQgbWVzc2FnZSB0byBQRQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitzdGF0aWMgQ0RGX1NUQVRVUyBzbWVfcnJtX3NlbmRfc2Nhbl9yZXN1bHQodHBBbmlTaXJHbG9iYWwgbWFjX2N0eCwKKwkJCQkJICAgdWludDhfdCBudW1fY2hhbiwKKwkJCQkJICAgdWludDhfdCAqY2hhbl9saXN0LAorCQkJCQkgICB1aW50OF90IG1lYXN1cmVtZW50ZG9uZSkKK3sKKwl0Q3NyU2NhblJlc3VsdEZpbHRlciBmaWx0ZXI7CisJdFNjYW5SZXN1bHRIYW5kbGUgcmVzdWx0X2hhbmRsZTsKKwl0Q3NyU2NhblJlc3VsdEluZm8gKnNjYW5fcmVzdWx0cywgKm5leHRfcmVzdWx0OworCXRDc3JTY2FuUmVzdWx0SW5mbyAqc2NhbnJlc3VsdHNfYXJyW1NJUl9CQ05fUkVQT1JUX01BWF9CU1NfREVTQ107CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCBjb3VudGVyID0gMDsKKwl0cFJybVNNRUNvbnRleHQgcnJtX2N0eCA9ICZtYWNfY3R4LT5ycm0ucnJtU21lQ29udGV4dDsKKwl1aW50MzJfdCBzZXNzaW9uX2lkOworCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIlNlbmQgc2NhbiByZXN1bHQgdG8gUEUgIikpOworI2VuZGlmCisKKwljZGZfbWVtX3plcm8oJmZpbHRlciwgc2l6ZW9mKGZpbHRlcikpOworCWNkZl9tZW1femVybyhzY2FucmVzdWx0c19hcnIsCisJCQlzaXplb2YobmV4dF9yZXN1bHQpICogU0lSX0JDTl9SRVBPUlRfTUFYX0JTU19ERVNDKTsKKwlmaWx0ZXIuQlNTSURzLm51bU9mQlNTSURzID0gMTsKKwlmaWx0ZXIuQlNTSURzLmJzc2lkID0gKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikmcnJtX2N0eC0+YnNzSWQ7CisKKwlpZiAocnJtX2N0eC0+c3NJZC5sZW5ndGgpIHsKKwkJZmlsdGVyLlNTSURzLlNTSURMaXN0ID0KKwkJCSh0Q3NyU1NJREluZm8gKikgY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JTU0lESW5mbykpOworCQlpZiAoZmlsdGVyLlNTSURzLlNTSURMaXN0ID09IE5VTEwpIHsKKwkJCXNtc19sb2cobWFjX2N0eCwgTE9HUCwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCX0KKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIkFsbG9jYXRlZCBtZW1vcnkgZm9yIFNTSURMaXN0IikpOworI2VuZGlmCisJCWNkZl9tZW1femVybyhmaWx0ZXIuU1NJRHMuU1NJRExpc3QsIHNpemVvZih0Q3NyU1NJREluZm8pKTsKKworCQlmaWx0ZXIuU1NJRHMuU1NJRExpc3QtPlNTSUQubGVuZ3RoID0KKwkJCXJybV9jdHgtPnNzSWQubGVuZ3RoOworCQljZGZfbWVtX2NvcHkoZmlsdGVyLlNTSURzLlNTSURMaXN0LT5TU0lELnNzSWQsCisJCQkJcnJtX2N0eC0+c3NJZC5zc0lkLCBycm1fY3R4LT5zc0lkLmxlbmd0aCk7CisJCWZpbHRlci5TU0lEcy5udW1PZlNTSURzID0gMTsKKwl9IGVsc2UgeworCQlmaWx0ZXIuU1NJRHMubnVtT2ZTU0lEcyA9IDA7CisJfQorCisJZmlsdGVyLkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSBudW1fY2hhbjsKKwlmaWx0ZXIuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBjaGFuX2xpc3Q7CisJZmlsdGVyLmZNZWFzdXJlbWVudCA9IHRydWU7CisKKwkvKgorCSAqIEluIGNhc2UgdGhpcyBpcyBiZWFjb24gcmVwb3J0IHJlcXVlc3QgZnJvbSBsYXN0IEFQIChiZWZvcmUgcm9hbWluZykKKwkgKiBmb2xsb3dpbmcgY2FsbCB0byBjc3Jfcm9hbV9nZXRfc2Vzc2lvbl9pZF9mcm9tX2Jzc2lkIHdpbGwgZmFpbCwKKwkgKiBoZW5jZSB1c2UgY3VycmVudCBzZXNzaW9uIElEIGluc3RlYWQgb2Ygb25lIHN0b3JlZCBpbiBTTUUgcnJtIGNvbnRleHQKKwkgKi8KKwlpZiAoQ0RGX1NUQVRVU19FX0ZBSUxVUkUgPT0gY3NyX3JvYW1fZ2V0X3Nlc3Npb25faWRfZnJvbV9ic3NpZChtYWNfY3R4LAorCQkJJnJybV9jdHgtPnNlc3Npb25Cc3NJZCwgJnNlc3Npb25faWQpKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCJCU1NJRCBtaXNtYXRjaCwgdXNpbmcgY3VycmVudCBzZXNzaW9uX2lkIikpOworCQlzZXNzaW9uX2lkID0gbWFjX2N0eC0+cm9hbS5yb2FtU2Vzc2lvbi0+c2Vzc2lvbklkOworCX0KKwlzdGF0dXMgPSBzbWVfc2Nhbl9nZXRfcmVzdWx0KG1hY19jdHgsICh1aW50OF90KSBzZXNzaW9uX2lkLAorCQkJCQkmZmlsdGVyLCAmcmVzdWx0X2hhbmRsZSk7CisKKwlpZiAoZmlsdGVyLlNTSURzLlNTSURMaXN0KSB7CisJCS8qIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIFNTSURMaXN0ICovCisJCWNkZl9tZW1fZnJlZShmaWx0ZXIuU1NJRHMuU1NJRExpc3QpOworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiRnJlZSBtZW1vcnkgZm9yIFNTSURMaXN0IikpOworI2VuZGlmCisJfQorCisJaWYgKE5VTEwgPT0gcmVzdWx0X2hhbmRsZSkgeworCQkvKgorCQkgKiBubyBzY2FuIHJlc3VsdHMKKwkJICogU3BlYy4gZG9lc250IHNheSBhbnl0aGluZyBhYm91dCBzdWNoIGNvbmRpdGlvbgorCQkgKiBTaW5jZSBzZWN0aW9uIDcuNC42LjIgKElFRUU4MDIuMTFrLTIwMDgpIHNheXMtcnJtIHJlcG9ydAorCQkgKiBmcmFtZSBzaG91bGQgY29udGFpbiBvbmUgb3IgbW9yZSByZXBvcnQgSUVzLiBJdCBwcm9iYWJseQorCQkgKiBtZWFucyBkb250IHNlbmQgYW55IHJlc3Bvc2UgaWYgbm8gbWF0Y2hpbmcgQlNTIGZvdW5kLgorCQkgKiBNb3Jlb3ZlciwgdGhlcmUgaXMgbm8gZmxhZyBvciBmaWVsZCBpbiBtZWFzdXJlbWVudCByZXBvcnQKKwkJICogSUUoNy4zLjIuMjIpIE9SIGJlYWNvbiByZXBvcnQgSUUoNy4zLjIuMjIuNikgdGhhdCBjYW4gYmUgc2V0CisJCSAqIHRvIGluZGljYXRlIG5vIEJTUyBmb3VuZCBvbiBhIGdpdmVuIGNoYW5uZWwuIElmIHdlIGZpbmlzaGVkCisJCSAqIG1lYXN1cmVtZW50IG9uIGFsbCB0aGUgY2hhbm5lbHMsIHdlIHN0aWxsIG5lZWQgdG8gc2VuZCBhCisJCSAqIHhtaXQgaW5kaWNhdGlvbiB3aXRoIG1vcmVUb0ZvbGxvdyBzZXQgdG8gTUVBU1VSTUVOVF9ET05FIHNvCisJCSAqIHRoYXQgUEUgY2FuIGNsZWFuIGFueSBjb250ZXh0IGFsbG9jYXRlZC4KKwkJICovCisJCWlmICghbWVhc3VyZW1lbnRkb25lKQorCQkJcmV0dXJuIHN0YXR1czsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorCQlpZiAoZVJSTV9NU0dfU09VUkNFX0VTRV9VUExPQUQgPT0gcnJtX2N0eC0+bXNnU291cmNlKQorCQkJc3RhdHVzID0gc21lX2VzZV9zZW5kX2JlYWNvbl9yZXFfc2Nhbl9yZXN1bHRzKG1hY19jdHgsCisJCQkJCXNlc3Npb25faWQsIGNoYW5fbGlzdFswXSwKKwkJCQkJTlVMTCwgbWVhc3VyZW1lbnRkb25lLCAwKTsKKwkJZWxzZQorI2VuZGlmIC8qRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKwkJCXN0YXR1cyA9IHNtZV9ycm1fc2VuZF9iZWFjb25fcmVwb3J0X3htaXRfaW5kKG1hY19jdHgsCisJCQkJCU5VTEwsIG1lYXN1cmVtZW50ZG9uZSwgMCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXNjYW5fcmVzdWx0cyA9IHNtZV9zY2FuX3Jlc3VsdF9nZXRfZmlyc3QobWFjX2N0eCwgcmVzdWx0X2hhbmRsZSk7CisJaWYgKE5VTEwgPT0gc2Nhbl9yZXN1bHRzICYmIG1lYXN1cmVtZW50ZG9uZSkgeworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisJCWlmIChlUlJNX01TR19TT1VSQ0VfRVNFX1VQTE9BRCA9PSBycm1fY3R4LT5tc2dTb3VyY2UpIHsKKwkJCXN0YXR1cyA9IHNtZV9lc2Vfc2VuZF9iZWFjb25fcmVxX3NjYW5fcmVzdWx0cyhtYWNfY3R4LAorCQkJCQlzZXNzaW9uX2lkLAorCQkJCQljaGFuX2xpc3RbMF0sCisJCQkJCU5VTEwsCisJCQkJCW1lYXN1cmVtZW50ZG9uZSwKKwkJCQkJMCk7CisJCX0gZWxzZQorI2VuZGlmIC8qRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KKwkJCXN0YXR1cyA9IHNtZV9ycm1fc2VuZF9iZWFjb25fcmVwb3J0X3htaXRfaW5kKG1hY19jdHgsCisJCQkJCQlOVUxMLCBtZWFzdXJlbWVudGRvbmUsIDApOworCX0KKwljb3VudGVyID0gMDsKKwl3aGlsZSAoc2Nhbl9yZXN1bHRzKSB7CisJCW5leHRfcmVzdWx0ID0gc21lX3NjYW5fcmVzdWx0X2dldF9uZXh0KG1hY19jdHgsIHJlc3VsdF9oYW5kbGUpOworCQlpZiAoc2Nhbl9yZXN1bHRzLT50aW1lciA+PSBycm1fc2Nhbl90aW1lcikKKwkJCXNjYW5yZXN1bHRzX2Fycltjb3VudGVyKytdID0gc2Nhbl9yZXN1bHRzOworCQlzY2FuX3Jlc3VsdHMgPSBuZXh0X3Jlc3VsdDsKKwkJaWYgKGNvdW50ZXIgPj0gU0lSX0JDTl9SRVBPUlRfTUFYX0JTU19ERVNDKQorCQkJYnJlYWs7CisJfQorCWlmIChjb3VudGVyKSB7CisJCXNtc19sb2cobWFjX2N0eCwgTE9HMSwKKwkJCUZMKCIgTnVtYmVyIG9mIEJTUyBEZXNjIHdpdGggUlJNIFNjYW4gJWQgIiksCisJCQljb3VudGVyKTsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorCQlpZiAoZVJSTV9NU0dfU09VUkNFX0VTRV9VUExPQUQgPT0gcnJtX2N0eC0+bXNnU291cmNlKQorCQkJc3RhdHVzID0gc21lX2VzZV9zZW5kX2JlYWNvbl9yZXFfc2Nhbl9yZXN1bHRzKG1hY19jdHgsCisJCQkJCXNlc3Npb25faWQsIGNoYW5fbGlzdFswXSwKKwkJCQkJc2NhbnJlc3VsdHNfYXJyLCBtZWFzdXJlbWVudGRvbmUsCisJCQkJCWNvdW50ZXIpOworCQllbHNlCisjZW5kaWYgLypGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworCQkJc3RhdHVzID0gc21lX3JybV9zZW5kX2JlYWNvbl9yZXBvcnRfeG1pdF9pbmQobWFjX2N0eCwKKwkJCQkJc2NhbnJlc3VsdHNfYXJyLCBtZWFzdXJlbWVudGRvbmUsCisJCQkJCWNvdW50ZXIpOworCX0KKwlzbWVfc2Nhbl9yZXN1bHRfcHVyZ2UobWFjX2N0eCwgcmVzdWx0X2hhbmRsZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcnJtX3NjYW5fcmVxdWVzdF9jYWxsYmFjaygpIC1TZW5kcyB0aGUgYmVhY29uIHJlcG9ydCB4bWl0IHRvIFBFCisgKiBAaGFsSGFuZGxlIC0gUG9pbnRlciB0byB0aGUgSGFsIEhhbmRsZS4KKyAqIEBwQ29udGV4dCAtIFBvaW50ZXIgdG8gdGhlIGRhdGEgY29udGV4dC4KKyAqIEBzY2FuSWQgLSBTY2FuIElELgorICogQHN0YXR1cyAtIENTUiBTdGF0dXMuCisgKgorICogVGhlIHNtZSBtb2R1bGUgY2FsbHMgdGhpcyBjYWxsYmFjayBmdW5jdGlvbiBvbmNlIGl0IGZpbmlzaCB0aGUgc2NhbiByZXF1ZXN0CisgKiBhbmQgdGhpcyBmdW5jdGlvbiBzZW5kIHRoZSBiZWFjb24gcmVwb3J0IHhtaXQgdG8gUEUgYW5kIHN0YXJ0cyBhIHRpbWVyIG9mCisgKiByYW5kb20gaW50ZXJ2YWwgdG8gaXNzdWUgbmV4dCByZXF1ZXN0LgorICoKKyAqIFJldHVybiA6IDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgKi8KKworc3RhdGljIENERl9TVEFUVVMgc21lX3JybV9zY2FuX3JlcXVlc3RfY2FsbGJhY2sodEhhbEhhbmRsZSBoYWxIYW5kbGUsCisJCQkJCQl2b2lkICpwQ29udGV4dCwKKwkJCQkJCXVpbnQ4X3Qgc2Vzc2lvbklkLAorCQkJCQkJdWludDMyX3Qgc2NhbklkLAorCQkJCQkJZUNzclNjYW5TdGF0dXMgc3RhdHVzKQoreworCisJdWludDE2X3QgaW50ZXJ2YWw7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgaGFsSGFuZGxlOworCXRwUnJtU01FQ29udGV4dCBwU21lUnJtQ29udGV4dCA9ICZwTWFjLT5ycm0ucnJtU21lQ29udGV4dDsKKwl1aW50MzJfdCB0aW1lX3RpY2s7CisKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJc21zX2xvZyhwTWFjLCBMT0dFLCAiU2NhbiBSZXF1ZXN0IGNhbGxiYWNrICIpOworI2VuZGlmCisJLyogaWYgYW55IG1vcmUgY2hhbm5lbHMgYXJlIHBlbmRpbmcsIHN0YXJ0IGEgdGltZXIgb2YgYSByYW5kb20gdmFsdWUgd2l0aGluIHJhbmRvbWl6YXRpb24gaW50ZXJ2YWwuICovCisJLyogKi8KKwkvKiAqLworCWlmICgocFNtZVJybUNvbnRleHQtPmN1cnJlbnRJbmRleCArIDEpIDwKKwkgICAgcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0Lm51bU9mQ2hhbm5lbHMpIHsKKwkJc21lX3JybV9zZW5kX3NjYW5fcmVzdWx0KHBNYWMsIDEsCisJCQkJCSAmcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LgorCQkJCQkgQ2hhbm5lbExpc3RbcFNtZVJybUNvbnRleHQtPmN1cnJlbnRJbmRleF0sCisJCQkJCSBmYWxzZSk7CisKKwkJcFNtZVJybUNvbnRleHQtPmN1cnJlbnRJbmRleCsrOyAvKiBBZHZhbmNlIHRoZSBjdXJyZW50IGluZGV4LiAqLworCQkvKiBzdGFydCB0aGUgdGltZXIgdG8gaXNzdWUgbmV4dCByZXF1ZXN0LiAqLworCQkvKiBGcm9tIHRpbWVyIHRpY2sgZ2V0IGEgcmFuZG9tIG51bWJlciB3aXRoaW4gMTBtcyBhbmQgbWF4IHJhbmRtaXphdGlvbiBpbnRlcnZhbC4gKi8KKwkJdGltZV90aWNrID0gY2RmX21jX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKTsKKwkJaW50ZXJ2YWwgPQorCQkJdGltZV90aWNrICUgKHBTbWVScm1Db250ZXh0LT5yYW5kbkludHZsIC0gMTAgKyAxKSArIDEwOworCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworCQlzbXNfbG9nKHBNYWMsIExPR0UsICJTZXQgdGltZXIgZm9yIGludGVydmFsICVkICIsIGludGVydmFsKTsKKyNlbmRpZgorCQljZGZfbWNfdGltZXJfc3RhcnQoJnBTbWVScm1Db250ZXh0LT5JdGVyTWVhc1RpbWVyLCBpbnRlcnZhbCk7CisKKwl9IGVsc2UgeworCQkvKiBEb25lIHdpdGggdGhlIG1lYXN1cmVtZW50LiBDbGVhbiB1cCBhbGwgY29udGV4dCBhbmQgc2VuZCBhIG1lc3NhZ2UgdG8gUEUgd2l0aCBtZWFzdXJlbWVudCBkb25lIGZsYWcgc2V0LiAqLworCQlzbWVfcnJtX3NlbmRfc2Nhbl9yZXN1bHQocE1hYywgMSwKKwkJCQkJICZwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QuCisJCQkJCSBDaGFubmVsTGlzdFtwU21lUnJtQ29udGV4dC0+Y3VycmVudEluZGV4XSwKKwkJCQkJIHRydWUpOworCQljZGZfbWVtX2ZyZWUocFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0KTsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCisJCXBTbWVScm1Db250ZXh0LT5lc2VCY25SZXFJblByb2dyZXNzID0gZmFsc2U7CisjZW5kaWYKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkZyZWUgbWVtb3J5IGZvciBDaGFubmVsTGlzdCIpKTsKKyNlbmRpZgorCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc21lX3JybV9pc3N1ZV9zY2FuX3JlcSgpIC0gVG8gaXNzdWUgcnJtIHNjYW4gcmVxdWVzdAorICogQG1hY19jdHg6IHBvaW50ZXIgdG8gbWFjIGNvbnRleHQKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGlzc3VlIHJybSBzY2FuIHJlcXVlc3QKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqLworQ0RGX1NUQVRVUyBzbWVfcnJtX2lzc3VlX3NjYW5fcmVxKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgpCit7CisJLyogSXNzdWUgc2NhbiByZXF1ZXN0LiAqLworCXRDc3JTY2FuUmVxdWVzdCBzY2FuX3JlcTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cFJybVNNRUNvbnRleHQgc21lX3JybV9jdHggPSAmbWFjX2N0eC0+cnJtLnJybVNtZUNvbnRleHQ7CisJdWludDMyX3Qgc2Vzc2lvbl9pZDsKKwl0U2lyU2NhblR5cGUgc2Nhbl90eXBlOworCisJc3RhdHVzID0gY3NyX3JvYW1fZ2V0X3Nlc3Npb25faWRfZnJvbV9ic3NpZChtYWNfY3R4LAorCQkJJnNtZV9ycm1fY3R4LT5zZXNzaW9uQnNzSWQsICZzZXNzaW9uX2lkKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJJbnZhbGlkIHNtZSBTZXNzaW9uIElEIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKChzbWVfcnJtX2N0eC0+Y3VycmVudEluZGV4KSA+PQorCQkJc21lX3JybV9jdHgtPmNoYW5uZWxMaXN0Lm51bU9mQ2hhbm5lbHMpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoZVJSTV9NU0dfU09VUkNFX0VTRV9VUExPQUQgPT0gc21lX3JybV9jdHgtPm1zZ1NvdXJjZSB8fAorCQllUlJNX01TR19TT1VSQ0VfTEVHQUNZX0VTRSA9PSBzbWVfcnJtX2N0eC0+bXNnU291cmNlKQorCQlzY2FuX3R5cGUgPSBzbWVfcnJtX2N0eC0+bWVhc01vZGVbc21lX3JybV9jdHgtPmN1cnJlbnRJbmRleF07CisJZWxzZQorCQlzY2FuX3R5cGUgPSBzbWVfcnJtX2N0eC0+bWVhc01vZGVbMF07CisKKwlpZiAoKGVTSVJfQUNUSVZFX1NDQU4gPT0gc2Nhbl90eXBlKSB8fAorCQkJKGVTSVJfUEFTU0lWRV9TQ0FOID09IHNjYW5fdHlwZSkpIHsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJCXNtc19sb2cobWFjX2N0eCwgTE9HRSwgRkwoIklzc3VlIHNjYW4gcmVxdWVzdCIpKTsKKyNlbmRpZgorCQljZGZfbWVtX3plcm8oJnNjYW5fcmVxLCBzaXplb2Yoc2Nhbl9yZXEpKTsKKwkJLyogc2V0IHNjYW5fdHlwZSwgYWN0aXZlIG9yIHBhc3NpdmUgKi8KKwkJc2Nhbl9yZXEuYmNuUnB0UmVxU2NhbiA9IHRydWU7CisJCXNjYW5fcmVxLnNjYW5UeXBlID0gc2Nhbl90eXBlOworCQljZGZfbWVtX2NvcHkoJnNjYW5fcmVxLmJzc2lkLmJ5dGVzLCBzbWVfcnJtX2N0eC0+YnNzSWQsCisJCQkJQ0RGX01BQ19BRERSX1NJWkUpOworCQlpZiAoc21lX3JybV9jdHgtPnNzSWQubGVuZ3RoKSB7CisJCQlzY2FuX3JlcS5TU0lEcy5udW1PZlNTSURzID0gMTsKKwkJCXNjYW5fcmVxLlNTSURzLlNTSURMaXN0ID0KKwkJCQkodENzclNTSURJbmZvICopY2RmX21lbV9tYWxsb2MoCisJCQkJCXNpemVvZih0Q3NyU1NJREluZm8pKTsKKwkJCWlmIChOVUxMID09IHNjYW5fcmVxLlNTSURzLlNTSURMaXN0KSB7CisJCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dQLAorCQkJCQlGTCgiY2RmX21lbV9tYWxsb2MgZmFpbGVkIikpOworCQkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCQl9CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworCQkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLAorCQkJCUZMKCJBbGxvY2F0ZWQgbWVtb3J5IGZvciBwU1NJRExpc3QiKSk7CisjZW5kaWYKKwkJCWNkZl9tZW1femVybyhzY2FuX3JlcS5TU0lEcy5TU0lETGlzdCwKKwkJCQkJc2l6ZW9mKHRDc3JTU0lESW5mbykpOworCQkJc2Nhbl9yZXEuU1NJRHMuU1NJRExpc3QtPlNTSUQubGVuZ3RoID0KKwkJCQlzbWVfcnJtX2N0eC0+c3NJZC5sZW5ndGg7CisJCQljZGZfbWVtX2NvcHkoc2Nhbl9yZXEuU1NJRHMuU1NJRExpc3QtPlNTSUQuc3NJZCwKKwkJCQkJc21lX3JybV9jdHgtPnNzSWQuc3NJZCwKKwkJCQkJc21lX3JybV9jdHgtPnNzSWQubGVuZ3RoKTsKKwkJfQorCisJCS8qCisJCSAqIHNldCBtaW4gYW5kIG1heCBjaGFubmVsIHRpbWUKKwkJICogc21lX3JybV9jdHgtPmR1cmF0aW9uOyBEb250IHVzZSBtaW4gdGltZW91dC4KKwkJICovCisJCXNjYW5fcmVxLm1pbkNoblRpbWUgPSAwOworCQlpZiAoZVJSTV9NU0dfU09VUkNFX0VTRV9VUExPQUQgPT0gc21lX3JybV9jdHgtPm1zZ1NvdXJjZSB8fAorCQkJZVJSTV9NU0dfU09VUkNFX0xFR0FDWV9FU0UgPT0gc21lX3JybV9jdHgtPm1zZ1NvdXJjZSkKKwkJCXNjYW5fcmVxLm1heENoblRpbWUgPSBzbWVfcnJtX2N0eC0+ZHVyYXRpb25bCisJCQkJCQlzbWVfcnJtX2N0eC0+Y3VycmVudEluZGV4XTsKKwkJZWxzZQorCQkJc2Nhbl9yZXEubWF4Q2huVGltZSA9IHNtZV9ycm1fY3R4LT5kdXJhdGlvblswXTsKKworCQlzbXNfbG9nKG1hY19jdHgsIExPRzEsIEZMKCJTY2FuIFR5cGUoJWQpIE1heCBEd2VsbCBUaW1lKCVkKSIpLAorCQkJCXNjYW5fcmVxLnNjYW5UeXBlLCBzY2FuX3JlcS5tYXhDaG5UaW1lKTsKKworCQlycm1fc2Nhbl90aW1lciA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKKworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKwkJc21zX2xvZyhtYWNfY3R4LCBMT0dFLCBGTCgiRm9yIER1cmF0aW9uICVkICIpLAorCQkJc2Nhbl9yZXEubWF4Q2huVGltZSk7CisjZW5kaWYKKwkJLyogc2V0IEJTU1R5cGUgdG8gZGVmYXVsdCB0eXBlICovCisJCXNjYW5fcmVxLkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0FOWTsKKwkJLypTY2FuIGFsbCB0aGUgY2hhbm5lbHMgKi8KKwkJc2Nhbl9yZXEuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDE7CisJCXNjYW5fcmVxLkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0KKwkJCSZzbWVfcnJtX2N0eC0+Y2hhbm5lbExpc3QuQ2hhbm5lbExpc3RbCisJCQkJc21lX3JybV9jdHgtPmN1cnJlbnRJbmRleF07CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJPbiBjaGFubmVsICVkICIpLAorCQkJc21lX3JybV9jdHgtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0WworCQkJCXNtZV9ycm1fY3R4LT5jdXJyZW50SW5kZXhdKTsKKyNlbmRpZgorCQkvKiBzZXQgcmVxdWVzdFR5cGUgdG8gZnVsbCBzY2FuICovCisJCXNjYW5fcmVxLnJlcXVlc3RUeXBlID0gZUNTUl9TQ0FOX1JFUVVFU1RfRlVMTF9TQ0FOOworCQlzdGF0dXMgPSBzbWVfc2Nhbl9yZXF1ZXN0KG1hY19jdHgsICh1aW50OF90KSBzZXNzaW9uX2lkLAorCQkJCQkmc2Nhbl9yZXEsCisJCQkJCSZzbWVfcnJtX3NjYW5fcmVxdWVzdF9jYWxsYmFjaywgTlVMTCk7CisKKwkJaWYgKHNtZV9ycm1fY3R4LT5zc0lkLmxlbmd0aCkgeworCQkJY2RmX21lbV9mcmVlKHNjYW5fcmVxLlNTSURzLlNTSURMaXN0KTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJGcmVlIG1lbW9yeSBmb3IgU1NJRExpc3QiKSk7CisjZW5kaWYKKwkJfQorCX0gZWxzZSBpZiAoZVNJUl9CRUFDT05fVEFCTEUgPT0gc2Nhbl90eXBlKSB7CisJCS8qCisJCSAqIEluIGJlYWNvbiB0YWJsZSBtb2RlLCBzY2FuIHJlc3VsdHMgYXJlIHRha2VuIGRpcmVjdGx5IGZyb20KKwkJICogc2NhbiBjYWNoZSB3aXRob3V0IGlzc3VpbmcgYW55IHNjYW4gcmVxdWVzdC4gU28sIGl0IGlzIG5vdAorCQkgKiBwcm9wZXIgdG8gdXBkYXRlIHJybV9zY2FuX3RpbWVyIHdpdGggbGF0ZXN0IHRpbWUgYW5kIGhlbmNlCisJCSAqIG1hZGUgaXQgdG8gemVybyB0byBzYXRpc2Z5CisJCSAqIHBTY2FuUmVzdWx0LT50aW1lciA+PSBycm1fc2Nhbl90aW1lcgorCQkgKi8KKwkJcnJtX3NjYW5fdGltZXIgPSAwOworCQlpZiAoKHNtZV9ycm1fY3R4LT5jdXJyZW50SW5kZXggKyAxKSA8CisJCQlzbWVfcnJtX2N0eC0+Y2hhbm5lbExpc3QubnVtT2ZDaGFubmVscykgeworCQkJc21lX3JybV9zZW5kX3NjYW5fcmVzdWx0KG1hY19jdHgsIDEsCisJCQkJJnNtZV9ycm1fY3R4LT5jaGFubmVsTGlzdC5DaGFubmVsTGlzdFsKKwkJCQkJc21lX3JybV9jdHgtPmN1cnJlbnRJbmRleF0sIGZhbHNlKTsKKwkJCS8qIEFkdmFuY2UgdGhlIGN1cnJlbnQgaW5kZXguICovCisJCQlzbWVfcnJtX2N0eC0+Y3VycmVudEluZGV4Kys7CisJCQlzbWVfcnJtX2lzc3VlX3NjYW5fcmVxKG1hY19jdHgpOworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKwkJCXNtZV9ycm1fY3R4LT5lc2VCY25SZXFJblByb2dyZXNzID0gZmFsc2U7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBEb25lIHdpdGggdGhlIG1lYXN1cmVtZW50LiBDbGVhbiB1cCBhbGwgY29udGV4dCBhbmQKKwkJCSAqIHNlbmQgYSBtZXNzYWdlIHRvIFBFIHdpdGggbWVhc3VyZW1lbnQgZG9uZSBmbGFnIHNldC4KKwkJCSAqLworCQkJc21lX3JybV9zZW5kX3NjYW5fcmVzdWx0KG1hY19jdHgsIDEsCisJCQkJJnNtZV9ycm1fY3R4LT5jaGFubmVsTGlzdC5DaGFubmVsTGlzdFsKKwkJCQkJc21lX3JybV9jdHgtPmN1cnJlbnRJbmRleF0sIHRydWUpOworCQkJY2RmX21lbV9mcmVlKHNtZV9ycm1fY3R4LT5jaGFubmVsTGlzdC5DaGFubmVsTGlzdCk7CisJCX0KKwl9IGVsc2UgeworCQlzbXNfbG9nKG1hY19jdHgsIExPR0UsIEZMKCJVbmtub3duIGJlYWNvbiByZXBvcnQgcmVxIG1vZGUoJWQpIiksCisJCQlzY2FuX3R5cGUpOworCQkvKgorCQkgKiBJbmRpY2F0ZSBtZWFzdXJlbWVudCBjb21wbGV0aW9uIHRvIFBFCisJCSAqIElmIHRoaXMgaXMgbm90IGRvbmUsIHBDdXJyZW50UmVxIHBvaW50ZXIgd2lsbCBub3QgYmUgZnJlZWQKKwkJICogYW5kIFBFIHdpbGwgbm90IGhhbmRsZSBzdWJzZXF1ZW50IEJlYWNvbiByZXF1ZXN0cworCQkgKi8KKwkJc21lX3JybV9zZW5kX2JlYWNvbl9yZXBvcnRfeG1pdF9pbmQobWFjX2N0eCwgTlVMTCwgdHJ1ZSwgMCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX3JybV9wcm9jZXNzX2JlYWNvbl9yZXBvcnRfcmVxX2luZCgpIC1Qcm9jZXNzIGJlYWNvbiByZXBvcnQgcmVxdWVzdAorICogQHBNYWM6LSBHbG9iYWwgTWFjIHN0cnVjdHVyZQorICogQHBNc2dCdWY6LSBhIHBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCBtYXBzIHRvIHZhcmlvdXMgc3RydWN0dXJlcyBiYXNlCisgKiAgICAgICAgICAgICAgICAgIG9uIHRoZSBtZXNzYWdlIHR5cGUuVGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGNhbiBhbHdheXMKKyAqICAgICAgICAgICAgICAgICAgbWFwIHRvIHRTaXJTbWVSc3AuCisgKgorICogVGhpcyBpcyBjYWxsZWQgdG8gcHJvY2VzcyB0aGUgQmVhY29uCisgKiByZXBvcnQgcmVxdWVzdCBmcm9tIHBlZXIgQVAgZm9yd2FyZGVkIHRocm91Z2ggUEUgLgorICoKKyAqIFJldHVybiA6IENERl9TVEFUVVNfU1VDQ0VTUyAtIFZhbGlkYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKyAqLworQ0RGX1NUQVRVUyBzbWVfcnJtX3Byb2Nlc3NfYmVhY29uX3JlcG9ydF9yZXFfaW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpCit7CisJdHBTaXJCZWFjb25SZXBvcnRSZXFJbmQgcEJlYWNvblJlcSA9ICh0cFNpckJlYWNvblJlcG9ydFJlcUluZCkgcE1zZ0J1ZjsKKwl0cFJybVNNRUNvbnRleHQgcFNtZVJybUNvbnRleHQgPSAmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQ7CisJdWludDMyX3QgbGVuID0gMCwgaSA9IDA7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJc21zX2xvZyhwTWFjLCBMT0dFLCAiUmVjZWl2ZWQgQmVhY29uIHJlcG9ydCByZXF1ZXN0IGluZCBDaGFubmVsID0gJWQiLAorCQlwQmVhY29uUmVxLT5jaGFubmVsSW5mby5jaGFubmVsTnVtKTsKKyNlbmRpZgorCS8qIHNlY3Rpb24gMTEuMTAuOC4xIChJRUVFIFN0ZCA4MDIuMTFrLTIwMDgpICovCisJLyogY2hhbm5lbCAwIGFuZCAyNTUgaGFzIHNwZWNpYWwgbWVhbmluZy4gKi8KKwlpZiAoKHBCZWFjb25SZXEtPmNoYW5uZWxJbmZvLmNoYW5uZWxOdW0gPT0gMCkgfHwKKwkgICAgKChwQmVhY29uUmVxLT5jaGFubmVsSW5mby5jaGFubmVsTnVtID09IDI1NSkKKwkgICAgICYmIChwQmVhY29uUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9PSAwKSkpIHsKKwkJLyogQWRkIGFsbCB0aGUgY2hhbm5lbCBpbiB0aGUgcmVndWxhdG9yeSBkb21haW4uICovCisJCXdsYW5fY2ZnX2dldF9zdHJfbGVuKHBNYWMsIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNULCAmbGVuKTsKKwkJcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0ID0gY2RmX21lbV9tYWxsb2MobGVuKTsKKwkJaWYgKHBTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC5DaGFubmVsTGlzdCA9PSBOVUxMKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR1AsIEZMKCJjZGZfbWVtX21hbGxvYyBmYWlsZWQiKSk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworCQlzbXNfbG9nKHBNYWMsIExPR0UsIEZMKCJBbGxvY2F0ZWQgbWVtb3J5IGZvciBDaGFubmVsTGlzdCIpKTsKKyNlbmRpZgorCQljc3JfZ2V0X2NmZ192YWxpZF9jaGFubmVscyhwTWFjLAorCQkJCQkgICBwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QuQ2hhbm5lbExpc3QsCisJCQkJCSAgICZsZW4pOworCQlwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QubnVtT2ZDaGFubmVscyA9ICh1aW50OF90KSBsZW47CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworCQlzbXNfbG9nKHBNYWMsIExPR0UsICJjaGFubmVsID09IDAgcGVyZm9ybWluZyBvbiBhbGwgY2hhbm5lbHMiKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWxlbiA9IDA7CisJCXBTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC5udW1PZkNoYW5uZWxzID0gMDsKKworCQkvKiBJZiB2YWxpZCBjaGFubmVsIGlzIHByZXNlbnQuIFdlIGZpcnN0IE1lYXN1cmUgb24gdGhlIGdpdmVuIGNoYW5uZWwuIGFuZCAqLworCQkvKiBpZiB0aGVyZSBhcmUgYWRkaXRpb25hbCBjaGFubmVscyBwcmVzZW50IGluIEFQY2hhbm5lbHJlcG9ydCwgbWVhc3VyZSBvbiB0aGVzZSBhbHNvLiAqLworCQlpZiAocEJlYWNvblJlcS0+Y2hhbm5lbEluZm8uY2hhbm5lbE51bSAhPSAyNTUpCisJCQlsZW4gPSAxOworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKwkJZWxzZQorCQkJc21zX2xvZyhwTWFjLCBMT0dFLCAiY2hhbm5lbCA9PSAyNTUiKTsKKyNlbmRpZgorCisJCWxlbiArPSBwQmVhY29uUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVsczsKKworCQlwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QuQ2hhbm5lbExpc3QgPSBjZGZfbWVtX21hbGxvYyhsZW4pOworCQlpZiAocFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0ID09IE5VTEwpIHsKKwkJCXNtc19sb2cocE1hYywgTE9HUCwgRkwoImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCX0KKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJCXNtc19sb2cocE1hYywgTE9HRSwgRkwoIkFsbG9jYXRlZCBtZW1vcnkgZm9yIENoYW5uZWxMaXN0IikpOworI2VuZGlmCisKKwkJaWYgKHBCZWFjb25SZXEtPmNoYW5uZWxJbmZvLmNoYW5uZWxOdW0gIT0gMjU1KSB7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworCQkJc21zX2xvZyhwTWFjLCBMT0dFLCAiY2hhbm5lbCA9PSAlZCAgIiwKKwkJCQlwQmVhY29uUmVxLT5jaGFubmVsSW5mby5jaGFubmVsTnVtKTsKKyNlbmRpZgorCQkJaWYgKGNzcl9yb2FtX2lzX2NoYW5uZWxfdmFsaWQKKwkJCQkgICAgKHBNYWMsIHBCZWFjb25SZXEtPmNoYW5uZWxJbmZvLmNoYW5uZWxOdW0pKQorCQkJCXBTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC4KKwkJCQlDaGFubmVsTGlzdFtwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QuCisJCQkJCSAgICBudW1PZkNoYW5uZWxzKytdID0KKwkJCQkJcEJlYWNvblJlcS0+Y2hhbm5lbEluZm8uY2hhbm5lbE51bTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJCQllbHNlCisJCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCQkiaXMgSW52YWxpZCBjaGFubmVsLCBJZ25vcmluZyB0aGlzIGNoYW5uZWwiKTsKKyNlbmRpZgorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHBCZWFjb25SZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChjc3Jfcm9hbV9pc19jaGFubmVsX3ZhbGlkCisJCQkJICAgIChwTWFjLCBwQmVhY29uUmVxLT5jaGFubmVsTGlzdC5jaGFubmVsTnVtYmVyW2ldKSkgeworCQkJCXBTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC4KKwkJCQlDaGFubmVsTGlzdFtwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QuCisJCQkJCSAgICBudW1PZkNoYW5uZWxzXSA9CisJCQkJCXBCZWFjb25SZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXJbaV07CisJCQkJcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0Lm51bU9mQ2hhbm5lbHMrKzsKKwkJCX0KKwkJfQorCX0KKworCS8qIENvcHkgc2Vzc2lvbiBic3NpZCAqLworCWNkZl9tZW1fY29weShwU21lUnJtQ29udGV4dC0+c2Vzc2lvbkJzc0lkLmJ5dGVzLCBwQmVhY29uUmVxLT5ic3NJZCwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCS8qIGNvcHkgbWVhc3VyZW1lbnQgYnNzaWQgKi8KKwljZGZfbWVtX2NvcHkocFNtZVJybUNvbnRleHQtPmJzc0lkLCBwQmVhY29uUmVxLT5tYWNhZGRyQnNzaWQsCisJCSAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKwkvKiBDb3B5IHNzaWQgKi8KKwljZGZfbWVtX2NvcHkoJnBTbWVScm1Db250ZXh0LT5zc0lkLCAmcEJlYWNvblJlcS0+c3NJZCwKKwkJICAgICBzaXplb2YodEFuaVNTSUQpKTsKKworCXBTbWVScm1Db250ZXh0LT50b2tlbiA9IHBCZWFjb25SZXEtPnVEaWFsb2dUb2tlbjsKKwlwU21lUnJtQ29udGV4dC0+cmVnQ2xhc3MgPSBwQmVhY29uUmVxLT5jaGFubmVsSW5mby5yZWd1bGF0b3J5Q2xhc3M7CisJcFNtZVJybUNvbnRleHQtPnJhbmRuSW50dmwgPQorCQlDREZfTUFYKHBCZWFjb25SZXEtPnJhbmRvbWl6YXRpb25JbnRlcnZhbCwKKwkJCXBTbWVScm1Db250ZXh0LT5ycm1Db25maWcubWF4UmFuZG5JbnRlcnZhbCk7CisJcFNtZVJybUNvbnRleHQtPmN1cnJlbnRJbmRleCA9IDA7CisJcFNtZVJybUNvbnRleHQtPm1zZ1NvdXJjZSA9IHBCZWFjb25SZXEtPm1zZ1NvdXJjZTsKKwljZGZfbWVtX2NvcHkoKHVpbnQ4X3QgKikgJnBTbWVScm1Db250ZXh0LT5tZWFzTW9kZSwKKwkJICAgICAodWludDhfdCAqKSAmcEJlYWNvblJlcS0+Zk1lYXN1cmVtZW50dHlwZSwKKwkJICAgICBTSVJfRVNFX01BWF9NRUFTX0lFX1JFUVMpOworCWNkZl9tZW1fY29weSgodWludDhfdCAqKSAmcFNtZVJybUNvbnRleHQtPmR1cmF0aW9uLAorCQkgICAgICh1aW50OF90ICopICZwQmVhY29uUmVxLT5tZWFzdXJlbWVudER1cmF0aW9uLAorCQkgICAgIFNJUl9FU0VfTUFYX01FQVNfSUVfUkVRUyk7CisKKwlzdGF0dXMgPSBzbWVfcnJtX2lzc3VlX3NjYW5fcmVxKHBNYWMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzbWVfcnJtX25laWdoYm9yX3JlcG9ydF9yZXF1ZXN0KCkgLSBUaGlzIGlzIEFQSSBjYW4gYmUgdXNlZCB0byB0cmlnZ2VyIGEKKyAqICAgICAgICBOZWlnaGJvciByZXBvcnQgZnJvbSB0aGUgcGVlci4KKyAqIEBzZXNzaW9uSWQ6IHNlc3Npb24gaWRlbnRpZmllciBvbiB3aGljaCB0aGUgcmVxdWVzdCBzaG91bGQgYmUgbWFkZS4KKyAqIEBwTmVpZ2hib3JSZXE6IGEgcG9pbnRlciB0byBhIG5laWdoYm9yIHJlcG9ydCByZXF1ZXN0LgorICoKKyAqIFRoaXMgaXMgQVBJIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYSAgTmVpZ2hib3IgcmVwb3J0IGZyb20gdGhlIHBlZXIuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBWYWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwuCisgKi8KK0NERl9TVEFUVVMgc21lX3JybV9uZWlnaGJvcl9yZXBvcnRfcmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB1aW50OF90IHNlc3Npb25JZCwKKwkJCQkJICAgdHBScm1OZWlnaGJvclJlcSBwTmVpZ2hib3JSZXEsCisJCQkJCSAgIHRwUnJtTmVpZ2hib3JSc3BDYWxsYmFja0luZm8KKwkJCQkJICAgY2FsbGJhY2tJbmZvKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwU2lyTmVpZ2hib3JSZXBvcnRSZXFJbmQgcE1zZzsKKwl0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uOworCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworCXNtc19sb2cocE1hYywgTE9HRSwKKwkJRkwoIlJlcXVlc3QgdG8gc2VuZCBOZWlnaGJvciByZXBvcnQgcmVxdWVzdCByZWNlaXZlZCAiKSk7CisjZW5kaWYKKwlpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBzZXNzaW9uICVkIiksIHNlc3Npb25JZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCXBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKwkvKiBJZiBhbHJlYWR5IGEgcmVwb3J0IGlzIHBlbmRpbmcsIHJldHVybiBmYWlsdXJlICovCisJaWYgKHRydWUgPT0KKwkgICAgcE1hYy0+cnJtLnJybVNtZUNvbnRleHQubmVpZ2hib3JSZXFDb250cm9sSW5mby4KKwkgICAgaXNOZWlnaGJvclJzcFBlbmRpbmcpIHsKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJRkwoIk5laWdoYm9yIHJlcXVlc3QgYWxyZWFkeSBwZW5kaW5nLi4gTm90IGFsbG93ZWQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfQUdBSU47CisJfQorCisJcE1zZyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyTmVpZ2hib3JSZXBvcnRSZXFJbmQpKTsKKwlpZiAoTlVMTCA9PSBwTXNnKSB7CisJCXNtc19sb2cocE1hYywgTE9HRSwKKwkJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBOZWlnaGJvciByZXF1ZXN0Iik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY2RmX21lbV96ZXJvKHBNc2csIHNpemVvZih0U2lyTmVpZ2hib3JSZXBvcnRSZXFJbmQpKTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJc21zX2xvZyhwTWFjLCBMT0dFLCBGTCgiIEFsbG9jYXRlZCBtZW1vcnkgZm9yIE5laWdoYm9yIHJlcXVlc3QiKSk7CisjZW5kaWYKKworCXJybV9sbF9wdXJnZV9uZWlnaGJvcl9jYWNoZShwTWFjLAorCQkJCSAgICAmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQubmVpZ2hib3JSZXBvcnRDYWNoZSk7CisKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJc21zX2xvZyhwTWFjLCBMT0dFLAorCQlGTAorCQkJKCJQdXJnZWQgdGhlIG5laWdoYm9yIGNhY2hlIGJlZm9yZSBzZW5kaW5nIE5laWdoYm9yIHJlcXVlc3Q6IFN0YXR1cyA9ICVkIiksCisJCXN0YXR1cyk7CisjZW5kaWYKKworCXBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfTkVJR0hCT1JfUkVQT1JUX1JFUV9JTkQ7CisJcE1zZy0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJOZWlnaGJvclJlcG9ydFJlcUluZCk7CisJY2RmX21lbV9jb3B5KCZwTXNnLT5ic3NJZCwgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLAorCQkgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCXBNc2ctPm5vU1NJRCA9IHBOZWlnaGJvclJlcS0+bm9fc3NpZDsKKwljZGZfbWVtX2NvcHkoJnBNc2ctPnVjU1NJRCwgJnBOZWlnaGJvclJlcS0+c3NpZCwgc2l6ZW9mKHRTaXJNYWNTU2lkKSk7CisKKwlzdGF0dXMgPSBjZHNfc2VuZF9tYl9tZXNzYWdlX3RvX21hYyhwTXNnKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJLyogTmVpZ2hib3IgcmVwb3J0IHJlcXVlc3QgbWVzc2FnZSBzZW50IHN1Y2Nlc3NmdWxseSB0byBQRS4gTm93IHJlZ2lzdGVyIHRoZSBjYWxsYmFja3MgKi8KKwlwTWFjLT5ycm0ucnJtU21lQ29udGV4dC5uZWlnaGJvclJlcUNvbnRyb2xJbmZvLm5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvLgorCW5laWdoYm9yUnNwQ2FsbGJhY2sgPSBjYWxsYmFja0luZm8tPm5laWdoYm9yUnNwQ2FsbGJhY2s7CisJcE1hYy0+cnJtLnJybVNtZUNvbnRleHQubmVpZ2hib3JSZXFDb250cm9sSW5mby5uZWlnaGJvclJzcENhbGxiYWNrSW5mby4KKwluZWlnaGJvclJzcENhbGxiYWNrQ29udGV4dCA9CisJCWNhbGxiYWNrSW5mby0+bmVpZ2hib3JSc3BDYWxsYmFja0NvbnRleHQ7CisJcE1hYy0+cnJtLnJybVNtZUNvbnRleHQubmVpZ2hib3JSZXFDb250cm9sSW5mby5pc05laWdoYm9yUnNwUGVuZGluZyA9CisJCXRydWU7CisKKwkvKiBTdGFydCBuZWlnaGJvciByZXNwb25zZSB3YWl0IHRpbWVyIG5vdyAqLworCWNkZl9tY190aW1lcl9zdGFydCgmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQubmVpZ2hib3JSZXFDb250cm9sSW5mby4KKwkJCSAgIG5laWdoYm9yUnNwV2FpdFRpbWVyLCBjYWxsYmFja0luZm8tPnRpbWVvdXQpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBycm1fY2FsY3VsYXRlX25laWdoYm9yX2FwX3JvYW1fc2NvcmUoKSAtIGNhY2x1bGF0ZXMgcm9hbSBzY29yZQorICogQG1hY19jdHg6ICAgICAgICAgICAgICAgIG1hYyBnbG9iYWwgY29udGV4dAorICogQHBOZWlnaGJvclJlcG9ydERlc2M6ICAgIE5laWdoYm9yIEJTUyBEZXNjcmlwdG9yIG5vZGUgZm9yIHdoaWNoIHJvYW0gc2NvcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2FsY3VsYXRlZAorICoKKyAqIFRoaXMgQVBJIGlzIGNhbGxlZCB3aGlsZSBoYW5kbGluZyBpbmRpdmlkdWFsIG5laWdoYm9yIHJlcG9ydHMgZnJvbSB0aGUgQVBzCisgKiBuZWlnaGJvciBBUCByZXBvcnQgdG8gY2FsY3VsYXRlIHRoZSBjdW11bGF0aXZlIHJvYW0gc2NvcmUgYmVmb3JlIHN0b3JpbmcgaXQKKyAqIGluIG5laWdoYm9yIGNhY2hlLgorICoKKyAqIFJldHVybjogdm9pZAorICovCitzdGF0aWMgdm9pZAorcnJtX2NhbGN1bGF0ZV9uZWlnaGJvcl9hcF9yb2FtX3Njb3JlKHRwQW5pU2lyR2xvYmFsIG1hY19jdHgsCisJCQkJdHBScm1OZWlnaGJvclJlcG9ydERlc2MgbmJyX3JlcG9ydF9kZXNjKQoreworCXRwU2lyTmVpZ2hib3JCc3NEZXNjcmlwdG9uIG5icl9ic3NfZGVzYzsKKwl1aW50MzJfdCByb2FtX3Njb3JlID0gMDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJdWludDhfdCBzZXNzaW9uX2lkOworI2VuZGlmCisJaWYgKE5VTEwgPT0gbmJyX3JlcG9ydF9kZXNjKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoTlVMTCA9PSBuYnJfcmVwb3J0X2Rlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybjsKKwl9CisKKwluYnJfYnNzX2Rlc2MgPSBuYnJfcmVwb3J0X2Rlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uOworCWlmICghbmJyX2Jzc19kZXNjLT5ic3NpZEluZm8ucnJtSW5mby5mTW9iaWxpdHlEb21haW4pCisJCWdvdG8gY2hlY2tfMTFyX2Fzc29jOworCisJcm9hbV9zY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfTU9CSUxJVFlfRE9NQUlOOworCWlmICghbmJyX2Jzc19kZXNjLT5ic3NpZEluZm8ucnJtSW5mby5mU2FtZVNlY3VyaXR5TW9kZSkKKwkJZ290byBjaGVja18xMXJfYXNzb2M7CisKKwlyb2FtX3Njb3JlICs9IFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9TRUNVUklUWTsKKwlpZiAoIW5icl9ic3NfZGVzYy0+YnNzaWRJbmZvLnJybUluZm8uZlNhbWVBdXRoZW50aWNhdG9yKQorCQlnb3RvIGNoZWNrXzExcl9hc3NvYzsKKworCXJvYW1fc2NvcmUgKz0gUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfUkVQT1JUX0tFWV9TQ09QRTsKKwlpZiAoIW5icl9ic3NfZGVzYy0+YnNzaWRJbmZvLnJybUluZm8uZkNhcFJhZGlvTWVhc3VyZW1lbnQpCisJCWdvdG8gY2hlY2tfMTFyX2Fzc29jOworCisJcm9hbV9zY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9SUk07CisJaWYgKG5icl9ic3NfZGVzYy0+YnNzaWRJbmZvLnJybUluZm8uZkNhcFNwZWN0cnVtTWVhc3VyZW1lbnQpCisJCXJvYW1fc2NvcmUgKz0KKwkJCVJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9DQVBBQklMSVRZX1NQRUNUUlVNX01HTVQ7CisKKwlpZiAobmJyX2Jzc19kZXNjLT5ic3NpZEluZm8ucnJtSW5mby5mQ2FwUW9zKQorCQlyb2FtX3Njb3JlICs9IFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9DQVBBQklMSVRZX1FPUzsKKworCWlmIChuYnJfYnNzX2Rlc2MtPmJzc2lkSW5mby5ycm1JbmZvLmZDYXBBcHNkKQorCQlyb2FtX3Njb3JlICs9IFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9DQVBBQklMSVRZX0FQU0Q7CisKKwlpZiAobmJyX2Jzc19kZXNjLT5ic3NpZEluZm8ucnJtSW5mby5mQ2FwRGVsYXllZEJsb2NrQWNrKQorCQlyb2FtX3Njb3JlICs9CisJCQlSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9ERUxBWUVEX0JBOworCisJaWYgKG5icl9ic3NfZGVzYy0+YnNzaWRJbmZvLnJybUluZm8uZkNhcEltbWVkaWF0ZUJsb2NrQWNrKQorCQlyb2FtX3Njb3JlICs9CisJCQlSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9JTU1FRElBVEVfQkE7CisKKwlpZiAobmJyX2Jzc19kZXNjLT5ic3NpZEluZm8ucnJtSW5mby5mQXBQcmVhdXRoUmVhY2hhYmxlKQorCQlyb2FtX3Njb3JlICs9IFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9SRUFDSEFCSUxJVFk7CisKK2NoZWNrXzExcl9hc3NvYzoKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJc2Vzc2lvbl9pZCA9IG5icl9yZXBvcnRfZGVzYy0+c2Vzc2lvbklkOworCS8qIEl0IGhhcyBjb21lIGluIHRoZSByZXBvcnQgc28gaXRzIHRoZSBiZXN0IHNjb3JlICovCisJaWYgKGNzcl9uZWlnaGJvcl9yb2FtX2lzMTFyX2Fzc29jKG1hY19jdHgsIHNlc3Npb25faWQpID09IGZhbHNlKSB7CisJCS8qIElBUFAgUm91dGUgc28gbGV0cyBtYWtlIHVzZSBvZiB0aGlzIGluZm8gc2F2ZSBhbGwgQVAsIGFzIHRoZQorCQkgKiBsaXN0IGRvZXMgbm90IGNvbWUgYWxsIHRoZSB0aW1lLiBTYXZlIGFuZCByZXVzZSB0aWxsIHRoZSBuZXh0CisJCSAqIEFQIExpc3QgY29tZXMgdG8gdXMuIEV2ZW4gc2F2ZSBvdXIgb3duIE1BQyBhZGRyZXNzLiBXaWxsIGJlCisJCSAqIHVzZWZ1bCBuZXh0IHRpbWUgYXJvdW5kLgorCQkgKi8KKwkJcm9hbV9zY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9JQVBQX0xJU1Q7CisJfQorI2VuZGlmCisJbmJyX3JlcG9ydF9kZXNjLT5yb2FtU2NvcmUgPSByb2FtX3Njb3JlOworfQorCisvKioKKyAqIHJybV9zdG9yZV9uZWlnaGJvcl9ycHRfYnlfcm9hbV9zY29yZSgpLXN0b3JlIE5laWdoYm9yIEJTUyBkZXNjcmlwdG9yCisgKiBAcE5laWdoYm9yUmVwb3J0RGVzYyAtIE5laWdoYm9yIEJTUyBEZXNjcmlwdG9yIG5vZGUgdG8gYmUgc3RvcmVkIGluIGNhY2hlCisgKgorICogVGhpcyBBUEkgaXMgY2FsbGVkIHRvIHN0b3JlIGEgZ2l2ZW4KKyAqIE5laWdoYm9yIEJTUyBkZXNjcmlwdG9yIHRvIHRoZSBuZWlnaGJvciBjYWNoZS4gVGhpcyBmdW5jdGlvbgorICogc3RvcmVzIHRoZSBuZWlnaGJvciBCU1MgZGVzY3JpcHRvcnMgaW4gc3VjaCBhIHdheSB0aGF0IGRlc2NyaXB0b3JzCisgKiBhcmUgc29ydGVkIGJ5IHJvYW1TY29yZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgKgorICogUmV0dXJuOiB2b2lkLgorICovCit2b2lkIHJybV9zdG9yZV9uZWlnaGJvcl9ycHRfYnlfcm9hbV9zY29yZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCQkgIHRwUnJtTmVpZ2hib3JSZXBvcnREZXNjIHBOZWlnaGJvclJlcG9ydERlc2MpCit7CisJdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRScm1OZWlnaGJvclJlcG9ydERlc2MgKnBUZW1wTmVpZ2hib3JSZXBvcnREZXNjOworCisJaWYgKE5VTEwgPT0gcE5laWdoYm9yUmVwb3J0RGVzYykgeworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm47CisJfQorCWlmIChOVUxMID09IHBOZWlnaGJvclJlcG9ydERlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY3NyX2xsX2lzX2xpc3RfZW1wdHkKKwkJICAgICgmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUsIExMX0FDQ0VTU19MT0NLKSkgeworCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQlGTAorCQkJCSgiTmVpZ2hib3IgcmVwb3J0IGNhY2hlIGlzIGVtcHR5Li4gQWRkaW5nIGEgZW50cnkgbm93IikpOworCQkvKiBOZWlnaGJvciBsaXN0IGNhY2hlIGlzIGVtcHR5LiBJbnNlcnQgdGhpcyBlbnRyeSBpbiB0aGUgdGFpbCAqLworCQljc3JfbGxfaW5zZXJ0X3RhaWwoJnBTbWVScm1Db250ZXh0LT5uZWlnaGJvclJlcG9ydENhY2hlLAorCQkJCSAgICZwTmVpZ2hib3JSZXBvcnREZXNjLT5MaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQkvKiBTaG91bGQgc3RvcmUgdGhlIG5laWdoYm9yIEJTUyBkZXNjcmlwdGlvbiBpbiB0aGUgb3JkZXIgc29ydGVkIGJ5IHJvYW1TY29yZSBpbiBkZXNjZW5kaW5nCisJCSAgIG9yZGVyLiBBUHMgd2l0aCBoaWdoZXN0IHJvYW1TY29yZSBzaG91bGQgYmUgdGhlIDFzdCBlbnRyeSBpbiB0aGUgbGlzdCAqLworCQlwRW50cnkgPQorCQkJY3NyX2xsX3BlZWtfaGVhZCgmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUsCisJCQkJCSBMTF9BQ0NFU1NfTE9DSyk7CisJCXdoaWxlIChwRW50cnkgIT0gTlVMTCkgeworCQkJcFRlbXBOZWlnaGJvclJlcG9ydERlc2MgPQorCQkJCUdFVF9CQVNFX0FERFIocEVudHJ5LCB0UnJtTmVpZ2hib3JSZXBvcnREZXNjLCBMaXN0KTsKKwkJCWlmIChwVGVtcE5laWdoYm9yUmVwb3J0RGVzYy0+cm9hbVNjb3JlIDwKKwkJCSAgICBwTmVpZ2hib3JSZXBvcnREZXNjLT5yb2FtU2NvcmUpCisJCQkJYnJlYWs7CisJCQlwRW50cnkgPQorCQkJCWNzcl9sbF9uZXh0KCZwU21lUnJtQ29udGV4dC0+bmVpZ2hib3JSZXBvcnRDYWNoZSwKKwkJCQkJICAgIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0spOworCQl9CisKKwkJaWYgKHBFbnRyeSkKKwkJCS8qIFRoaXMgQlNTIHJvYW1zY29yZSBpcyBiZXR0ZXIgdGhhbiBzb21ldGhpbmcgaW4gdGhlIGxpc3QuIEluc2VydCB0aGlzIGJlZm9yZSB0aGF0IG9uZSAqLworCQkJY3NyX2xsX2luc2VydF9lbnRyeSgmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUsCisJCQkJCSAgICBwRW50cnksICZwTmVpZ2hib3JSZXBvcnREZXNjLT5MaXN0LAorCQkJCQkgICAgTExfQUNDRVNTX0xPQ0spOworCQllbHNlCisJCQkvKiBBbGwgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgaGFzIGEgYmV0dGVyIHJvYW0gU2NvcmUgdGhhbiB0aGlzIG9uZS4gSW5zZXJ0IHRoaXMgYXQgdGhlIGxhc3QgKi8KKwkJCWNzcl9sbF9pbnNlcnRfdGFpbCgmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUsCisJCQkJCSAgICZwTmVpZ2hib3JSZXBvcnREZXNjLT5MaXN0LAorCQkJCQkgICBMTF9BQ0NFU1NfTE9DSyk7CisJfQorCXJldHVybjsKK30KKworLyoqCisgKiBzbWVfcnJtX3Byb2Nlc3NfbmVpZ2hib3JfcmVwb3J0KCkgLVByb2Nlc3MgdGhlIE5laWdoYm9yIHJlcG9ydCByZWNlaXZlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gUEUKKyAqIEBwTWFjIC0gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwTXNnQnVmIC0gYSBwb2ludGVyIHRvIGEgYnVmZmVyIHRoYXQgbWFwcyB0byB2YXJpb3VzIHN0cnVjdHVyZXMgYmFzZQorICogICAgICAgICAgICAgICAgICBvbiB0aGUgbWVzc2FnZSB0eXBlLgorICogICAgICAgICAgICAgICAgICBUaGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgY2FuIGFsd2F5cyBtYXAgdG8gdFNpclNtZVJzcC4KKyAqIFRoaXMgaXMgY2FsbGVkIHRvIHByb2Nlc3MgdGhlIE5laWdoYm9yIHJlcG9ydCByZWNlaXZlZCBmcm9tIFBFLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIC0gVmFsaWRhdGlvbiBpcyBzdWNjZXNzZnVsCisgKi8KK0NERl9TVEFUVVMgc21lX3JybV9wcm9jZXNzX25laWdoYm9yX3JlcG9ydCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwU2lyTmVpZ2hib3JSZXBvcnRJbmQgcE5laWdoYm9yUnB0ID0gKHRwU2lyTmVpZ2hib3JSZXBvcnRJbmQpIHBNc2dCdWY7CisJdHBScm1OZWlnaGJvclJlcG9ydERlc2MgcE5laWdoYm9yUmVwb3J0RGVzYzsKKwl1aW50OF90IGkgPSAwOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl1aW50OF90IHNlc3Npb25JZDsKKworCS8qIEdldCB0aGUgc2Vzc2lvbiBpZCAqLworCXN0YXR1cyA9CisJCWNzcl9yb2FtX2dldF9zZXNzaW9uX2lkX2Zyb21fYnNzaWQocE1hYywKKwkJCQkJCSAgIChzdHJ1Y3QgY2RmX21hY19hZGRyICopIHBOZWlnaGJvclJwdC0+YnNzSWQsCisJCQkJCQkgICAodWludDMyX3QgKikgJnNlc3Npb25JZCk7CisJaWYgKENERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorCQkvKiBDbGVhciB0aGUgY2FjaGUgZm9yIEVTRS4gKi8KKwkJaWYgKGNzcl9uZWlnaGJvcl9yb2FtX2lzX2VzZV9hc3NvYyhwTWFjLCBzZXNzaW9uSWQpKSB7CisJCQlycm1fbGxfcHVyZ2VfbmVpZ2hib3JfY2FjaGUocE1hYywKKwkJCQkJCSAgICAmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQuCisJCQkJCQkgICAgbmVpZ2hib3JSZXBvcnRDYWNoZSk7CisJCX0KKyNlbmRpZgorCX0KKworCWZvciAoaSA9IDA7IGkgPCBwTmVpZ2hib3JScHQtPm51bU5laWdoYm9yUmVwb3J0czsgaSsrKSB7CisJCXBOZWlnaGJvclJlcG9ydERlc2MgPQorCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRScm1OZWlnaGJvclJlcG9ydERlc2MpKTsKKwkJaWYgKE5VTEwgPT0gcE5laWdoYm9yUmVwb3J0RGVzYykgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBSUk0gTmVpZ2hib3IgcmVwb3J0IGRlc2MiKTsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWdvdG8gZW5kOworCisJCX0KKworCQljZGZfbWVtX3plcm8ocE5laWdoYm9yUmVwb3J0RGVzYywKKwkJCSAgICAgc2l6ZW9mKHRScm1OZWlnaGJvclJlcG9ydERlc2MpKTsKKwkJcE5laWdoYm9yUmVwb3J0RGVzYy0+cE5laWdoYm9yQnNzRGVzY3JpcHRpb24gPQorCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJOZWlnaGJvckJzc0Rlc2NyaXB0aW9uKSk7CisJCWlmIChOVUxMID09IHBOZWlnaGJvclJlcG9ydERlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uKSB7CisJCQlzbXNfbG9nKHBNYWMsIExPR0UsCisJCQkJIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJSTSBOZWlnaGJvciByZXBvcnQgQlNTIERlc2NyaXB0aW9uIik7CisJCQljZGZfbWVtX2ZyZWUocE5laWdoYm9yUmVwb3J0RGVzYyk7CisJCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCQlnb3RvIGVuZDsKKwkJfQorCQljZGZfbWVtX3plcm8ocE5laWdoYm9yUmVwb3J0RGVzYy0+cE5laWdoYm9yQnNzRGVzY3JpcHRpb24sCisJCQkgICAgIHNpemVvZih0U2lyTmVpZ2hib3JCc3NEZXNjcmlwdGlvbikpOworCQljZGZfbWVtX2NvcHkocE5laWdoYm9yUmVwb3J0RGVzYy0+cE5laWdoYm9yQnNzRGVzY3JpcHRpb24sCisJCQkgICAgICZwTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLAorCQkJICAgICBzaXplb2YodFNpck5laWdoYm9yQnNzRGVzY3JpcHRpb24pKTsKKworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKwkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJIlJlY2VpdmVkIG5laWdoYm9yIHJlcG9ydCB3aXRoIE5laWdoYm9yIEJTU0lEOiAiCisJCQlNQUNfQUREUkVTU19TVFIsCisJCQlNQUNfQUREUl9BUlJBWShwTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLgorCQkJCSAgICAgICBic3NJZCkpOworI2VuZGlmCisKKwkJLyogQ2FsY3VsYXRlIHRoZSByb2FtIHNjb3JlIGJhc2VkIG9uIHRoZSBCU1MgQ2FwYWJpbGl0eSBpbiB0aGUgQlNTSUQgSW5mb3JtYXRpb24gYW5kIHN0b3JlIGl0IGluIE5laWdoYm9yIHJlcG9ydCBEZXNjICovCisJCXJybV9jYWxjdWxhdGVfbmVpZ2hib3JfYXBfcm9hbV9zY29yZShwTWFjLCBwTmVpZ2hib3JSZXBvcnREZXNjKTsKKworCQkvKiBTdG9yZSB0aGUgTmVpZ2hib3IgcmVwb3J0IERlc2MgaW4gdGhlIGNhY2hlIGJhc2VkIG9uIHRoZSByb2FtIHNjb3JlICovCisJCWlmIChwTmVpZ2hib3JSZXBvcnREZXNjLT5yb2FtU2NvcmUgPiAwKSB7CisJCQlycm1fc3RvcmVfbmVpZ2hib3JfcnB0X2J5X3JvYW1fc2NvcmUocE1hYywKKwkJCQkJCQkgICAgIHBOZWlnaGJvclJlcG9ydERlc2MpOworCQl9IGVsc2UgeworCQkJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkJCUZMKCJSb2FtIHNjb3JlIG9mIEJTU0lEICAiIE1BQ19BRERSRVNTX1NUUgorCQkJCSAgICIgaXMgMCwgSWdub3JpbmcuLiIpLAorCQkJCU1BQ19BRERSX0FSUkFZKHBOZWlnaGJvclJwdC0+CisJCQkJCSAgICAgICBzTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS4KKwkJCQkJICAgICAgIGJzc0lkKSk7CisKKwkJCWNkZl9tZW1fZnJlZShwTmVpZ2hib3JSZXBvcnREZXNjLT4KKwkJCQkgICAgIHBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uKTsKKwkJCWNkZl9tZW1fZnJlZShwTmVpZ2hib3JSZXBvcnREZXNjKTsKKwkJfQorCX0KK2VuZDoKKworCWlmICghY3NyX2xsX2NvdW50KCZwTWFjLT5ycm0ucnJtU21lQ29udGV4dC5uZWlnaGJvclJlcG9ydENhY2hlKSkKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCisJLyogUmVjZWl2ZWQgYSByZXBvcnQgZnJvbSBBUC4gSW5kaWNhdGUgU1VDQ0VTUyB0byB0aGUgY2FsbGVyIGlmIHRoZXJlIGFyZSBzb21lIHZhbGlkIHJlcG9ydHMgKi8KKwlycm1faW5kaWNhdGVfbmVpZ2hib3JfcmVwb3J0X3Jlc3VsdChwTWFjLCBjZGZfc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc21lX3JybV9tc2dfcHJvY2Vzc29yKCktUHJvY2VzcyBSUk0gbWVzc2FnZQorICogQHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgKiBAbXNnX3R5cGUgLSB0aGUgdHlwZSBvZiBtc2cgcGFzc2VkIGJ5IFBFIGFzIGRlZmluZWQgaW4gd25pX2FwaS5oCisgKiBAcE1zZ0J1ZiAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IG1hcHMgdG8gdmFyaW91cyBzdHJ1Y3R1cmVzIGJhc2UKKyAqICAgICAgICAgICAgICAgICAgb24gdGhlIG1lc3NhZ2UgdHlwZS4KKyAqICAgICAgICAgICAgICAgICAgVGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGNhbiBhbHdheXMgbWFwIHRvIHRTaXJTbWVSc3AuCisgKiBzbWVfcHJvY2Vzc19tc2coKSBjYWxscyB0aGlzIGZ1bmN0aW9uIGZvciB0aGUKKyAqIG1lc3NhZ2VzIHRoYXQgYXJlIGhhbmRsZWQgYnkgU01FIFJSTSBtb2R1bGUuCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgLSBWYWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwuCisgKi8KK0NERl9TVEFUVVMgc21lX3JybV9tc2dfcHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHVpbnQxNl90IG1zZ190eXBlLAorCQkJCSB2b2lkICpwTXNnQnVmKQoreworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICBGTCgiIE1zZyA9ICVkIGZvciBSUk0gbWVhc3VyZW1lbnQiKSwgbXNnX3R5cGUpOworCisJLyogc3dpdGNoIG9uIHRoZSBtc2cgdHlwZSAmIG1ha2UgdGhlIHN0YXRlIHRyYW5zaXRpb24gYWNjb3JkaW5nbHkgKi8KKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBlV05JX1NNRV9ORUlHSEJPUl9SRVBPUlRfSU5EOgorCQlzbWVfcnJtX3Byb2Nlc3NfbmVpZ2hib3JfcmVwb3J0KHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworCWNhc2UgZVdOSV9TTUVfQkVBQ09OX1JFUE9SVF9SRVFfSU5EOgorCQlzbWVfcnJtX3Byb2Nlc3NfYmVhY29uX3JlcG9ydF9yZXFfaW5kKHBNYWMsIHBNc2dCdWYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIGVyciBtc2cgKi8KKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgIEZMKCJzbWVfcnJtX21zZ19wcm9jZXNzb3I6dW5rbm93biBtc2cgdHlwZSA9ICVkIiksCisJCQkgIG1zZ190eXBlKTsKKworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHJybV9pdGVyX21lYXNfdGltZXJfaGFuZGxlKCkgLSBUaW1lciBoYW5kbGVyIHRvIGhhbmRsZXQgdGhlIHRpbWVvdXQKKyAqIEAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgKgorICogVGltZXIgaGFuZGxlciB0byBoYW5kbGV0IHRoZSB0aW1lb3V0IGNvbmRpdGlvbiB3aGVuIGEgc3BlY2lmaWMgQlQKKyAqIHN0b3AgZXZlbnQgZG9lcyBub3QgY29tZSBiYWNrLCBpbiB3aGljaCBjYXNlIHRvIHJlc3RvcmUgYmFjayB0aGUKKyAqIGhlYXJ0YmVhdCB0aW1lci4KKyAqCisgKiBSZXR1cm46IE5VTEwKKyAqLwordm9pZCBycm1faXRlcl9tZWFzX3RpbWVyX2hhbmRsZSh2b2lkICp1c2VyRGF0YSkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSB1c2VyRGF0YTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJc21zX2xvZyhwTWFjLCBMT0dFLAorCQkiUmFuZG9taXphdGlvbiB0aW1lciBleHBpcmVkLi4uc2VuZCBvbiBuZXh0IGNoYW5uZWwgIik7CisjZW5kaWYKKwkvKiBJc3N1ZSBhIHNjYW4gcmVxIGZvciBuZXh0IGNoYW5uZWwuICovCisJc21lX3JybV9pc3N1ZV9zY2FuX3JlcShwTWFjKTsKK30KKy8qKgorICogcnJtX25laWdoYm9yX3JzcF90aW1lb3V0X2hhbmRsZXIoKSAtIFRpbWVyIGhhbmRsZXIgdG8gaGFuZGxldCB0aGUgdGltZW91dAorICogQHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorICoKKyAqIFRpbWVyIGhhbmRsZXIgdG8gaGFuZGxlIHRoZSB0aW1lb3V0IGNvbmRpdGlvbiB3aGVuIGEgbmVpZ2hib3IgcmVxdWVzdCBpcyBzZW50CisgKiBhbmQgbm8gbmVpZ2hib3IgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgQVAKKyAqCisgKiBSZXR1cm46IE5VTEwKKyAqLwordm9pZCBycm1fbmVpZ2hib3JfcnNwX3RpbWVvdXRfaGFuZGxlcih2b2lkICp1c2VyRGF0YSkKK3sKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSB1c2VyRGF0YTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisJc21zX2xvZyhwTWFjLCBMT0dFLCAiTmVpZ2hib3IgUmVzcG9uc2UgdGltZWQgb3V0ICIpOworI2VuZGlmCisJcnJtX2luZGljYXRlX25laWdoYm9yX3JlcG9ydF9yZXN1bHQocE1hYywgQ0RGX1NUQVRVU19FX0ZBSUxVUkUpOworCXJldHVybjsKK30KKworLyoqCisgKiBycm1fb3BlbigpIC0gSW5pdGlhbHplIGFsbCBSUk0gbW9kdWxlCisgKiBAIHBNYWM6IFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgKgorICogSW5pdGlhbHplIGFsbCBSUk0gbW9kdWxlLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCitDREZfU1RBVFVTIHJybV9vcGVuKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworCUNERl9TVEFUVVMgY2RmX3JldF9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlwU21lUnJtQ29udGV4dC0+cnJtQ29uZmlnLm1heFJhbmRuSW50ZXJ2YWwgPSA1MDsgICAgICAgIC8qIG1zICovCisKKwljZGZfc3RhdHVzID0gY2RmX21jX3RpbWVyX2luaXQoJnBTbWVScm1Db250ZXh0LT5JdGVyTWVhc1RpbWVyLAorCQkJCSAgICAgICBDREZfVElNRVJfVFlQRV9TVywKKwkJCQkgICAgICAgcnJtX2l0ZXJfbWVhc190aW1lcl9oYW5kbGUsICh2b2lkICopcE1hYyk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAicnJtX29wZW46IEZhaWwgdG8gaW5pdCB0aW1lciIpOworCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZGZfc3RhdHVzID0KKwkJY2RmX21jX3RpbWVyX2luaXQoJnBTbWVScm1Db250ZXh0LT5uZWlnaGJvclJlcUNvbnRyb2xJbmZvLgorCQkJCSAgbmVpZ2hib3JSc3BXYWl0VGltZXIsIENERl9USU1FUl9UWVBFX1NXLAorCQkJCSAgcnJtX25laWdoYm9yX3JzcF90aW1lb3V0X2hhbmRsZXIsICh2b2lkICopcE1hYyk7CisKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAicnJtX29wZW46IEZhaWwgdG8gaW5pdCB0aW1lciIpOworCisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlwU21lUnJtQ29udGV4dC0+bmVpZ2hib3JSZXFDb250cm9sSW5mby5pc05laWdoYm9yUnNwUGVuZGluZyA9IGZhbHNlOworCisJY2RmX3JldF9zdGF0dXMgPQorCQljc3JfbGxfb3BlbihwTWFjLT5oSGRkLCAmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RmX3JldF9zdGF0dXMpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJycm1fb3BlbjogRmFpbCB0byBvcGVuIG5laWdoYm9yIGNhY2hlIHJlc3VsdCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBycm1fY2xvc2UoKSAtIFJlbGVhc2UgYWxsIFJSTSBtb2R1bGVzIGFuZCB0aGVpciByZXNvdXJjZXMuCisgKiBAcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgKgorICogUmVsZWFzZSBhbGwgUlJNIG1vZHVsZXMgYW5kIHRoZWlyIHJlc291cmNlcy4KKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMKKyAqICAgICAgICAgICBDREZfU1RBVFVTX0VfRkFJTFVSRSAgc3VjY2VzcworICogICAgICAgICAgIENERl9TVEFUVVNfU1VDQ0VTUyAgZmFpbHVyZQorICovCisKK0NERl9TVEFUVVMgcnJtX2Nsb3NlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworCisJaWYgKENERl9USU1FUl9TVEFURV9SVU5OSU5HID09CisJICAgIGNkZl9tY190aW1lcl9nZXRfY3VycmVudF9zdGF0ZSgmcFNtZVJybUNvbnRleHQtPkl0ZXJNZWFzVGltZXIpKSB7CisJCWNkZl9zdGF0dXMgPSBjZGZfbWNfdGltZXJfc3RvcCgmcFNtZVJybUNvbnRleHQtPkl0ZXJNZWFzVGltZXIpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkJICBGTCgiVGltZXIgc3RvcCBmYWlsIikpOworCQl9CisJfQorCisJY2RmX3N0YXR1cyA9IGNkZl9tY190aW1lcl9kZXN0cm95KCZwU21lUnJtQ29udGV4dC0+SXRlck1lYXNUaW1lcik7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9TTUUsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIkZhaWwgdG8gZGVzdHJveSB0aW1lciIpKTsKKworCX0KKworCWlmIChDREZfVElNRVJfU1RBVEVfUlVOTklORyA9PQorCSAgICBjZGZfbWNfdGltZXJfZ2V0X2N1cnJlbnRfc3RhdGUoJnBTbWVScm1Db250ZXh0LT4KKwkJCQkJICAgbmVpZ2hib3JSZXFDb250cm9sSW5mby4KKwkJCQkJICAgbmVpZ2hib3JSc3BXYWl0VGltZXIpKSB7CisJCWNkZl9zdGF0dXMgPQorCQkJY2RmX21jX3RpbWVyX3N0b3AoJnBTbWVScm1Db250ZXh0LT5uZWlnaGJvclJlcUNvbnRyb2xJbmZvLgorCQkJCQkgIG5laWdoYm9yUnNwV2FpdFRpbWVyKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1NNRSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCSAgRkwoIlRpbWVyIHN0b3AgZmFpbCIpKTsKKwkJfQorCX0KKworCWNkZl9zdGF0dXMgPQorCQljZGZfbWNfdGltZXJfZGVzdHJveSgmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVxQ29udHJvbEluZm8uCisJCQkJICAgICBuZWlnaGJvclJzcFdhaXRUaW1lcik7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfU01FLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgIEZMKCJGYWlsIHRvIGRlc3Ryb3kgdGltZXIiKSk7CisKKwl9CisKKwlycm1fbGxfcHVyZ2VfbmVpZ2hib3JfY2FjaGUocE1hYywgJnBTbWVScm1Db250ZXh0LT5uZWlnaGJvclJlcG9ydENhY2hlKTsKKworCWNzcl9sbF9jbG9zZSgmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUpOworCisJcmV0dXJuIGNkZl9zdGF0dXM7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gcnJtX3JlYWR5CisKKyAgICBcYnJpZWYgIGZuCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY19vcGVuLgorCisgICAgXHJldHVybiBDREZfU1RBVFVTCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NERl9TVEFUVVMgcnJtX3JlYWR5KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBycm1fY2hhbmdlX2RlZmF1bHRfY29uZmlnX3BhcmFtCisgICAgXGJyaWVmICBmbgorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKyAgICBccGFyYW0gIHBScm1Db25maWcgLSBwb2ludGVyIHRvIG5ldyBycm0gY29uZmlncy4KKworICAgIFxyZXR1cm4gQ0RGX1NUQVRVUworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ0RGX1NUQVRVUyBycm1fY2hhbmdlX2RlZmF1bHRfY29uZmlnX3BhcmFtKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJCSAgIHRwUnJtQ29uZmlnUGFyYW0gcFJybUNvbmZpZykKK3sKKwljZGZfbWVtX2NvcHkoJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0LnJybUNvbmZpZywgcFJybUNvbmZpZywKKwkJICAgICBzaXplb2YodFJybUNvbmZpZ1BhcmFtKSk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfcnJtX2dldF9maXJzdF9ic3NfZW50cnlfZnJvbV9uZWlnaGJvcl9jYWNoZSgpCisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgZW50cnkgZnJvbSB0aGUgbmVpZ2hib3IgY2FjaGUgdG8gdGhlIGNhbGxlcgorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNfb3Blbi4KKworICAgIFxyZXR1cm4gVk9JRAorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFJybU5laWdoYm9yUmVwb3J0RGVzYyAqc21lX3JybV9nZXRfZmlyc3RfYnNzX2VudHJ5X2Zyb21fbmVpZ2hib3JfY2FjaGUodHBBbmlTaXJHbG9iYWwKKwkJCQkJCQkJCXBNYWMpCit7CisJdExpc3RFbGVtICpwRW50cnk7CisJdFJybU5laWdoYm9yUmVwb3J0RGVzYyAqcFRlbXBCc3NFbnRyeSA9IE5VTEw7CisJdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworCisJcEVudHJ5ID0KKwkJY3NyX2xsX3BlZWtfaGVhZCgmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUsIExMX0FDQ0VTU19MT0NLKTsKKworCWlmICghcEVudHJ5IHx8ICFjc3JfbGxfY291bnQoJnBTbWVScm1Db250ZXh0LT5uZWlnaGJvclJlcG9ydENhY2hlKSkgeworCQkvKiBsaXN0IGVtcHR5ICovCisJCXNtc19sb2cocE1hYywgTE9HVywgRkwoIkxpc3QgZW1wdHkiKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBUZW1wQnNzRW50cnkgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFJybU5laWdoYm9yUmVwb3J0RGVzYywgTGlzdCk7CisKKwlyZXR1cm4gcFRlbXBCc3NFbnRyeTsKK30KKworLyoqCisgKiBzbWVfcnJtX2dldF9uZXh0X2Jzc19lbnRyeV9mcm9tX25laWdoYm9yX2NhY2hlKCkgLSByZXR1cm5zIHRoZSBlbnRyeSBuZXh0IHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gZW50cnkKKyAqIEAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjX29wZW4uCisgKiBAcEJzc0VudHJ5LSBCU1MgZW50cnkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVudHJ5IG5leHQgdG8gdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlCisgKiBuZWlnaGJvciBjYWNoZSB0byB0aGUgY2FsbGVyCisgKgorICogUmV0dXJuOiBOVUxMCisgKi8KK3RScm1OZWlnaGJvclJlcG9ydERlc2MgKnNtZV9ycm1fZ2V0X25leHRfYnNzX2VudHJ5X2Zyb21fbmVpZ2hib3JfY2FjaGUoCisJdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBScm1OZWlnaGJvclJlcG9ydERlc2MgcEJzc0VudHJ5KQoreworCXRMaXN0RWxlbSAqcEVudHJ5OworCXRScm1OZWlnaGJvclJlcG9ydERlc2MgKnBUZW1wQnNzRW50cnkgPSBOVUxMOworCisJcEVudHJ5ID0KKwkJY3NyX2xsX25leHQoJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVwb3J0Q2FjaGUsCisJCQkgICAgJnBCc3NFbnRyeS0+TGlzdCwgTExfQUNDRVNTX0xPQ0spOworCisJaWYgKCFwRW50cnkpIHsKKwkJLyogbGlzdCBlbXB0eSAqLworCQlzbXNfbG9nKHBNYWMsIExPR1csIEZMKCJMaXN0IGVtcHR5IikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwVGVtcEJzc0VudHJ5ID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRScm1OZWlnaGJvclJlcG9ydERlc2MsIExpc3QpOworCisJcmV0dXJuIHBUZW1wQnNzRW50cnk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9lcHBpbmcvaW5jL2VwcGluZ19pbnRlcm5hbC5oIGIvY29yZS91dGlscy9lcHBpbmcvaW5jL2VwcGluZ19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzJiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL2VwcGluZy9pbmMvZXBwaW5nX2ludGVybmFsLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgRVBQSU5HX0lOVEVSTkFMX0gKKyNkZWZpbmUgRVBQSU5HX0lOVEVSTkFMX0gKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgZXBwaW5nX2ludGVybmFsLmgKKworICAgXGJyaWVmIExpbnV4IGVwcGluZyBpbnRlcm5hbCBoZWFkIGZpbGUKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBmaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpZiBkZWZpbmVkKFdMQU5fT1BFTl9TT1VSQ0UpICYmIGRlZmluZWQoQ09ORklHX0hBU19XQUtFTE9DSykKKyNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgorI2VuZGlmCisjaW5jbHVkZSAiaHRjX2FwaS5oIgorI2luY2x1ZGUgImh0Y19wYWNrZXQuaCIKKyNpbmNsdWRlICJlcHBpbmdfdGVzdC5oIgorI2luY2x1ZGUgPGNkZl9hdG9taWMuaD4KKyNpbmNsdWRlIDxzaXJfbWFjX3Byb3RfZGVmLmg+CisjaW5jbHVkZSA8c2lyX2RlYnVnLmg+CisKKyNkZWZpbmUgRVBQSU5HX0xPR19NQVNLICgxPDxFUFBJTkdfQ01EX0NBUFRVUkVfUkVDVl9DTlQpCisjZGVmaW5lIEVQUElOR19TVEFUU19MT0dfQ09VTlQgNTAwMDAKKyNkZWZpbmUgRVBQSU5HX0tUSURfS0lMTF9XQUlUX1RJTUVfTVMgNTAKKworI2RlZmluZSBFUFBJTkdfRlJBR19QRVJfTVNEVSAgIDEKKyNpZm5kZWYgRVBQSU5HX1RYQlVGCisjZGVmaW5lIEVQUElOR19UWEJVRiAgICg1MTIvRVBQSU5HX0ZSQUdfUEVSX01TRFUpCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgRVBQSU5HX01BWF9BREFQVEVSUyAgICAgICAgICAgICAxCisKKyNkZWZpbmUgRVBQSU5HX0xPRyhsZXZlbCwgYXJncyAuLi4pIENERl9UUkFDRSggQ0RGX01PRFVMRV9JRF9IREQsIGxldmVsLCAjIyBhcmdzKQorCitzdHJ1Y3QgZXBwaW5nX2Nvb2tpZSB7CisJSFRDX1BBQ0tFVCBIdGNQa3Q7ICAgICAgLyogSFRDIHBhY2tldCB3cmFwcGVyICovCisJc3RydWN0IGVwcGluZ19jb29raWUgKm5leHQ7Cit9OworCit0eXBlZGVmIGVudW0geworCUVQUElOR19DVFhfU1RBVEVfSU5JVElBTCA9IDAsCisJRVBQSU5HX0NUWF9TVEFURV9ISUZfSU5JVCwKKwlFUFBJTkdfQ1RYX1NUQVRFX1NUQVJUVVAsCisJRVBQSU5HX0NUWF9TVEFURV9TVEFSVEVELAorCUVQUElOR19DVFhfU1RBVEVfU1RPUAorfSBlcHBpbmdfY3R4X3N0YXRlX3Q7CisKKyNkZWZpbmUgRVBQSU5HX01BWF9OVU1fRVBJRFMgNAorI2RlZmluZSBNQVhfQ09PS0lFX1NMT1RTX05VTSA0CisjZGVmaW5lIE1BWF9DT09LSUVfU0xPVF9TSVpFIDUxMgorI2RlZmluZSBNQVhfVFhfUEtUX0RVUF9OVU0gICA0CisKKyNpZmRlZiBISUZfUENJCisjZGVmaW5lIFdMQU5fRVBQSU5HX0RFTEFZX1RJTUVPVVRfVVMgICAgIDEwCisjZGVmaW5lIEVQUElOR19NQVhfQ0VfTlVNUyAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRVBQSU5HX01BWF9XQVRFUl9NQVJLICAgICAgICAgICAgOAordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkOworCXZvaWQgKmFyZzsKKwlib29sIGRvbmU7CisJY2RmX25idWZfdCBza2I7CisJSFRDX0VORFBPSU5UX0lEIGVpZDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKKwlib29sIGluaXRlZDsKKwljZGZfYXRvbWljX3QgYXRtOworfSBlcHBpbmdfcG9sbF90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGVwcGluZ19jb250ZXh0X3MgeworCWludDMyX3QgY29uX21vZGU7CisJY2hhciAqcHdsYW5fbW9kdWxlX25hbWU7CisJdWludDMyX3QgdGFyZ2V0X3R5cGU7CisJdm9pZCAqcF9jZHNfY29udGV4dDsgICAgLyogQ0RTIGNvbnRleHQgKi8KKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnRfZGV2OyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZXZpY2UgKi8KKwllcHBpbmdfY3R4X3N0YXRlX3QgZV9jdHhfc3RhdGU7CisJaW50IHdvd19uYWNrOworCXZvaWQgKmVwcGluZ19hZGFwdGVyOworCUhUQ19IQU5ETEUgSFRDSGFuZGxlOworCUhUQ19FTkRQT0lOVF9JRCBFcHBpbmdFbmRwb2ludFtFUFBJTkdfTUFYX05VTV9FUElEU107CisJdW5zaWduZWQgaW50IGtwZXJmX251bV9yeF9yZWN2W0VQUElOR19NQVhfTlVNX0VQSURTXTsKKwl1bnNpZ25lZCBpbnQga3BlcmZfbnVtX3R4X2Fja3NbRVBQSU5HX01BWF9OVU1fRVBJRFNdOworCXVuc2lnbmVkIGludCB0b3RhbF9yeF9yZWN2OworCXVuc2lnbmVkIGludCB0b3RhbF90eF9hY2tzOworI2lmZGVmIEhJRl9QQ0kKKwllcHBpbmdfcG9sbF90IGVwcGluZ19wb2xsW0VQUElOR19NQVhfTlVNX0VQSURTXTsKKyNlbmRpZgorCXN0cnVjdCBlcHBpbmdfY29va2llICpjb29raWVfbGlzdDsKKwlpbnQgY29va2llX2NvdW50OworCXN0cnVjdCBlcHBpbmdfY29va2llICpzX2Nvb2tpZV9tZW1bTUFYX0NPT0tJRV9TTE9UU19OVU1dOworCWNkZl9zcGlubG9ja190IGNvb2tpZV9sb2NrOworfSBlcHBpbmdfY29udGV4dF90OworCit0eXBlZGVmIGVudW0geworCUVQUElOR19UWF9USU1FUl9TVE9QUEVELAorCUVQUElOR19UWF9USU1FUl9SVU5OSU5HCit9IGVwcGluZ190eF90aW1lcl9zdGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCBlcHBpbmdfYWRhcHRlcl9zIHsKKwllcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eDsKKwl0Q0RGX0NPTl9NT0RFIGRldmljZV9tb2RlOworCS8qKiBIYW5kbGUgdG8gdGhlIG5ldHdvcmsgZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY2RmX21hY19hZGRyIG1hY0FkZHJlc3NDdXJyZW50OworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCS8qIGZvciBtYm94cGluZyAqLworCWNkZl9zcGlubG9ja190IGRhdGFfbG9jazsKKwljZGZfbmJ1Zl9xdWV1ZV90IG5vZHJvcF9xdWV1ZTsKKwljZGZfc29mdGlycV90aW1lcl90IGVwcGluZ190aW1lcjsKKwllcHBpbmdfdHhfdGltZXJfc3RhdGVfdCBlcHBpbmdfdGltZXJfc3RhdGU7CisJYm9vbCByZWdpc3RlcmVkOworCWJvb2wgc3RhcnRlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKK30gZXBwaW5nX2FkYXB0ZXJfdDsKKworLyogZXBwaW5nX2hlbHBlciBzaWduYXR1cmVzICovCitpbnQgZXBwaW5nX2Nvb2tpZV9pbml0KGVwcGluZ19jb250ZXh0X3QgKnBFcHBpbmdfY3R4KTsKK3ZvaWQgZXBwaW5nX2Nvb2tpZV9jbGVhbnVwKGVwcGluZ19jb250ZXh0X3QgKnBFcHBpbmdfY3R4KTsKK3ZvaWQgZXBwaW5nX2ZyZWVfY29va2llKGVwcGluZ19jb250ZXh0X3QgKnBFcHBpbmdfY3R4LAorCQkJc3RydWN0IGVwcGluZ19jb29raWUgKmNvb2tpZSk7CitzdHJ1Y3QgZXBwaW5nX2Nvb2tpZSAqZXBwaW5nX2FsbG9jX2Nvb2tpZShlcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eCk7Cit2b2lkIGVwcGluZ19nZXRfZHVtbXlfbWFjX2FkZHIodFNpck1hY0FkZHIgbWFjQWRkcik7Cit2b2lkIGVwcGluZ19oZXhfZHVtcCh2b2lkICpkYXRhLCBpbnQgYnVmX2xlbiwgY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgKmVwcGluZ19nZXRfY2RmX2N0eCh2b2lkKTsKK3ZvaWQgZXBwaW5nX2xvZ19wYWNrZXQoZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCSAgICAgICBFUFBJTkdfSEVBREVSICplcHBpbmdIZHIsIGludCByZXQsIGNvbnN0IGNoYXIgKnN0cik7Cit2b2lkIGVwcGluZ19sb2dfc3RhdHMoZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IGNoYXIgKnN0cik7Cit2b2lkIGVwcGluZ19zZXRfa3BlcmZfZmxhZyhlcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCSAgIEhUQ19FTkRQT0lOVF9JRCBlaWQsIEFfVUlOVDgga3BlcmZfZmxhZyk7CisKKy8qIGVwcGluZ190eCBzaWduYXR1cmVzICovCit2b2lkIGVwcGluZ190eF90aW1lcl9leHBpcmUoZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOwordm9pZCBlcHBpbmdfdHhfY29tcGxldGVfbXVsdGlwbGUodm9pZCAqY3R4LCBIVENfUEFDS0VUX1FVRVVFICpwUGFja2V0UXVldWUpOworaW50IGVwcGluZ190eF9zZW5kKGNkZl9uYnVmX3Qgc2tiLCBlcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKKyNpZmRlZiBISUZfU0RJTworSFRDX1NFTkRfRlVMTF9BQ1RJT04gZXBwaW5nX3R4X3F1ZXVlX2Z1bGwodm9pZCAqQ29udGV4dCwgSFRDX1BBQ0tFVCAqcFBhY2tldCk7CisjZW5kaWYKKy8qIGVwcGluZ19yeCBzaWduYXR1cmVzICovCit2b2lkIGVwcGluZ19yeCh2b2lkICpDb250ZXh0LCBIVENfUEFDS0VUICpwUGFja2V0KTsKKworI2lmZGVmIEhJRl9TRElPCit2b2lkIGVwcGluZ19yZWZpbGwodm9pZCAqY3R4LCBIVENfRU5EUE9JTlRfSUQgRW5kcG9pbnQpOworI2VuZGlmCisKKy8qIGVwcGluZ190eHJ4IHNpZ25hdHVyZXMgKi8KK2VwcGluZ19hZGFwdGVyX3QgKmVwcGluZ19hZGRfYWRhcHRlcihlcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eCwKKwkJCQkgICAgIHRTaXJNYWNBZGRyIG1hY0FkZHIsCisJCQkJICAgICB0Q0RGX0NPTl9NT0RFIGRldmljZV9tb2RlKTsKK3ZvaWQgZXBwaW5nX2Rlc3Ryb3lfYWRhcHRlcihlcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlcik7CitpbnQgZXBwaW5nX2Nvbm5lY3Rfc2VydmljZShlcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eCk7CisjaWZkZWYgSElGX1BDSQordm9pZCBlcHBpbmdfcmVnaXN0ZXJfdHhfY29waWVyKEhUQ19FTkRQT0lOVF9JRCBlaWQsCisJCQkgICAgICAgZXBwaW5nX2NvbnRleHRfdCAqcEVwcGluZ19jdHgpOwordm9pZCBlcHBpbmdfdW5yZWdpc3Rlcl90eF9jb3BpZXIoSFRDX0VORFBPSU5UX0lEIGVpZCwKKwkJCQkgZXBwaW5nX2NvbnRleHRfdCAqcEVwcGluZ19jdHgpOwordm9pZCBlcHBpbmdfdHhfY29waWVyX3NjaGVkdWxlKGVwcGluZ19jb250ZXh0X3QgKnBFcHBpbmdfY3R4LAorCQkJICAgICAgIEhUQ19FTkRQT0lOVF9JRCBlaWQsIGNkZl9uYnVmX3Qgc2tiKTsKKyNlbmRpZiAvKiBISUZfUENJICovCisjZW5kaWYgLyogZW5kICNpZm5kZWYgRVBQSU5HX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvdXRpbHMvZXBwaW5nL2luYy9lcHBpbmdfbWFpbi5oIGIvY29yZS91dGlscy9lcHBpbmcvaW5jL2VwcGluZ19tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1ZTNkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdXRpbHMvZXBwaW5nL2luYy9lcHBpbmdfbWFpbi5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIEVQUElOR19NQUlOX0gKKyNkZWZpbmUgRVBQSU5HX01BSU5fSAorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICBlcHBpbmdfbWFpbi5oCisKKyAgIFxicmllZiBMaW51eCBlcHBpbmcgaGVhZCBmaWxlCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgZmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPGNkZl9sb2NrLmg+CisKKyNkZWZpbmUgV0xBTl9FUFBJTkdfRU5BQkxFX0JJVCAgICAgICAgICAoMSA8PCA4KQorI2RlZmluZSBXTEFOX0VQUElOR19JUlFfQklUICAgICAgICAgICAgICgxIDw8IDkpCisjZGVmaW5lIFdMQU5fRVBQSU5HX0ZXX1VBUlRfQklUICAgICAgICAgKDEgPDwgMTApCisjZGVmaW5lIFdMQU5fSVNfRVBQSU5HX0VOQUJMRUQoeCkgICAgICAgKHggJiBXTEFOX0VQUElOR19FTkFCTEVfQklUKQorI2RlZmluZSBXTEFOX0lTX0VQUElOR19JUlEoeCkgICAgICAgICAgICh4ICYgV0xBTl9FUFBJTkdfSVJRX0JJVCkKKyNkZWZpbmUgV0xBTl9JU19FUFBJTkdfRldfVUFSVCh4KSAgICAgICAoeCAmIFdMQU5fRVBQSU5HX0ZXX1VBUlRfQklUKQorCisvKiBlcHBpbmdfbWFpbiBzaWduYXR1cmVzICovCitpbnQgZXBwaW5nX29wZW4odm9pZCk7Cit2b2lkIGVwcGluZ19jbG9zZSh2b2lkKTsKK3ZvaWQgZXBwaW5nX2Rpc2FibGUodm9pZCk7CitpbnQgZXBwaW5nX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnRfZGV2KTsKKyNlbmRpZiAvKiBlbmQgI2lmbmRlZiBFUFBJTkdfTUFJTl9IICovCmRpZmYgLS1naXQgYS9jb3JlL3V0aWxzL2VwcGluZy9zcmMvZXBwaW5nX2hlbHBlci5jIGIvY29yZS91dGlscy9lcHBpbmcvc3JjL2VwcGluZ19oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZThlM2VjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS91dGlscy9lcHBpbmcvc3JjL2VwcGluZ19oZWxwZXIuYwpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIGVwcGluZ19tYWluLmMKKworICAgXGJyaWVmIFdMQU4gRW5kIFBvaW50IFBpbmcgdGVzdCB0b29sIGltcGxlbWVudGF0aW9uCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgPGNkc19zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPHduaV9hcGkuaD4KKyNpbmNsdWRlIDx3bGFuX3B0dF9zb2NrX3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgImVwcGluZ19tYWluLmgiCisjaW5jbHVkZSAiZXBwaW5nX2ludGVybmFsLmgiCisKK2ludCBlcHBpbmdfY29va2llX2luaXQoZXBwaW5nX2NvbnRleHRfdCAqcEVwcGluZ19jdHgpCit7CisJQV9VSU5UMzIgaSwgajsKKworCXBFcHBpbmdfY3R4LT5jb29raWVfbGlzdCA9IE5VTEw7CisJcEVwcGluZ19jdHgtPmNvb2tpZV9jb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DT09LSUVfU0xPVFNfTlVNOyBpKyspIHsKKwkJcEVwcGluZ19jdHgtPnNfY29va2llX21lbVtpXSA9CisJCQljZGZfbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IGVwcGluZ19jb29raWUpICoKKwkJCQkgICAgICAgTUFYX0NPT0tJRV9TTE9UX1NJWkUpOworCQlpZiAocEVwcGluZ19jdHgtPnNfY29va2llX21lbSA9PSBOVUxMKSB7CisJCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCQkgICAiJXM6IG5vIG1lbSBmb3IgY29va2llIChpZHggPSAlZCkiLCBfX2Z1bmNfXywKKwkJCQkgICBpKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJY2RmX21lbV96ZXJvKHBFcHBpbmdfY3R4LT5zX2Nvb2tpZV9tZW1baV0sCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgZXBwaW5nX2Nvb2tpZSkgKgorCQkJICAgICBNQVhfQ09PS0lFX1NMT1RfU0laRSk7CisJfQorCWNkZl9zcGlubG9ja19pbml0KCZwRXBwaW5nX2N0eC0+Y29va2llX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9DT09LSUVfU0xPVFNfTlVNOyBpKyspIHsKKwkJc3RydWN0IGVwcGluZ19jb29raWUgKmNvb2tpZV9tZW0gPSBwRXBwaW5nX2N0eC0+c19jb29raWVfbWVtW2ldOworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0NPT0tJRV9TTE9UX1NJWkU7IGorKykgeworCQkJZXBwaW5nX2ZyZWVfY29va2llKHBFcHBpbmdfY3R4LCAmY29va2llX21lbVtqXSk7CisJCX0KKwl9CisJcmV0dXJuIDA7CitlcnJvcjoKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPT0tJRV9TTE9UU19OVU07IGkrKykgeworCQlpZiAocEVwcGluZ19jdHgtPnNfY29va2llX21lbVtpXSkgeworCQkJY2RmX21lbV9mcmVlKHBFcHBpbmdfY3R4LT5zX2Nvb2tpZV9tZW1baV0pOworCQkJcEVwcGluZ19jdHgtPnNfY29va2llX21lbVtpXSA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIGNsZWFudXAgY29va2llIHF1ZXVlICovCit2b2lkIGVwcGluZ19jb29raWVfY2xlYW51cChlcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eCkKK3sKKwlpbnQgaTsKKwljZGZfc3Bpbl9sb2NrX2JoKCZwRXBwaW5nX2N0eC0+Y29va2llX2xvY2spOworCXBFcHBpbmdfY3R4LT5jb29raWVfbGlzdCA9IE5VTEw7CisJcEVwcGluZ19jdHgtPmNvb2tpZV9jb3VudCA9IDA7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwRXBwaW5nX2N0eC0+Y29va2llX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09PS0lFX1NMT1RTX05VTTsgaSsrKSB7CisJCWlmIChwRXBwaW5nX2N0eC0+c19jb29raWVfbWVtW2ldKSB7CisJCQljZGZfbWVtX2ZyZWUocEVwcGluZ19jdHgtPnNfY29va2llX21lbVtpXSk7CisJCQlwRXBwaW5nX2N0eC0+c19jb29raWVfbWVtW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKwordm9pZCBlcHBpbmdfZnJlZV9jb29raWUoZXBwaW5nX2NvbnRleHRfdCAqcEVwcGluZ19jdHgsCisJCQlzdHJ1Y3QgZXBwaW5nX2Nvb2tpZSAqY29va2llKQoreworCWNkZl9zcGluX2xvY2tfYmgoJnBFcHBpbmdfY3R4LT5jb29raWVfbG9jayk7CisJY29va2llLT5uZXh0ID0gcEVwcGluZ19jdHgtPmNvb2tpZV9saXN0OworCXBFcHBpbmdfY3R4LT5jb29raWVfbGlzdCA9IGNvb2tpZTsKKwlwRXBwaW5nX2N0eC0+Y29va2llX2NvdW50Kys7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZwRXBwaW5nX2N0eC0+Y29va2llX2xvY2spOworfQorCitzdHJ1Y3QgZXBwaW5nX2Nvb2tpZSAqZXBwaW5nX2FsbG9jX2Nvb2tpZShlcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eCkKK3sKKwlzdHJ1Y3QgZXBwaW5nX2Nvb2tpZSAqY29va2llOworCisJY2RmX3NwaW5fbG9ja19iaCgmcEVwcGluZ19jdHgtPmNvb2tpZV9sb2NrKTsKKwljb29raWUgPSBwRXBwaW5nX2N0eC0+Y29va2llX2xpc3Q7CisJaWYgKGNvb2tpZSAhPSBOVUxMKSB7CisJCXBFcHBpbmdfY3R4LT5jb29raWVfbGlzdCA9IGNvb2tpZS0+bmV4dDsKKwkJcEVwcGluZ19jdHgtPmNvb2tpZV9jb3VudC0tOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJnBFcHBpbmdfY3R4LT5jb29raWVfbG9jayk7CisJcmV0dXJuIGNvb2tpZTsKK30KKwordm9pZCBlcHBpbmdfZ2V0X2R1bW15X21hY19hZGRyKHRTaXJNYWNBZGRyIG1hY0FkZHIpCit7CisJbWFjQWRkclswXSA9IDY5OyAgICAgICAgLyogRSAqLworCW1hY0FkZHJbMV0gPSA4MDsgICAgICAgIC8qIFAgKi8KKwltYWNBZGRyWzJdID0gODA7ICAgICAgICAvKiBQICovCisJbWFjQWRkclszXSA9IDczOyAgICAgICAgLyogSSAqLworCW1hY0FkZHJbNF0gPSA3ODsgICAgICAgIC8qIE4gKi8KKwltYWNBZGRyWzVdID0gNzE7ICAgICAgICAvKiBHICovCit9CisKK3ZvaWQgZXBwaW5nX2hleF9kdW1wKHZvaWQgKmRhdGEsIGludCBidWZfbGVuLCBjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqYnVmID0gKGNoYXIgKilkYXRhOworCWludCBpOworCisJcHJpbnRrKCIlczogRSwgJXNcbiIsIF9fZnVuY19fLCBzdHIpOworCWZvciAoaSA9IDA7IChpICsgNykgPCBidWZfbGVuOyBpICs9IDgpIHsKKwkJcHJpbnRrKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCSAgICAgICBidWZbaV0sCisJCSAgICAgICBidWZbaSArIDFdLAorCQkgICAgICAgYnVmW2kgKyAyXSwKKwkJICAgICAgIGJ1ZltpICsgM10sCisJCSAgICAgICBidWZbaSArIDRdLCBidWZbaSArIDVdLCBidWZbaSArIDZdLCBidWZbaSArIDddKTsKKwl9CisKKwkvKiBEdW1wIHRoZSBieXRlcyBpbiB0aGUgbGFzdCBsaW5lICovCisJZm9yICg7IGkgPCBidWZfbGVuOyBpKyspIHsKKwkJcHJpbnRrKCIlMDJ4ICIsIGJ1ZltpXSk7CisJfQorCXByaW50aygiXG4lczogWCAlc1xuIiwgX19mdW5jX18sIHN0cik7Cit9CisKK3ZvaWQgKmVwcGluZ19nZXRfY2RmX2N0eCh2b2lkKQoreworCWNkZl9kZXZpY2VfdCAqcF9jZGZfY3R4OworCisJcF9jZGZfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfQ0RGX0RFVklDRSk7CisJcmV0dXJuIHBfY2RmX2N0eDsKK30KKwordm9pZCBlcHBpbmdfbG9nX3BhY2tldChlcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJICAgICAgIEVQUElOR19IRUFERVIgKmVwcGluZ0hkciwgaW50IHJldCwgY29uc3QgY2hhciAqc3RyKQoreworCWlmIChlcHBpbmdIZHItPkNtZF9oICYgRVBQSU5HX0xPR19NQVNLKSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgIiVzOiBjbWQgPSAlZCwgc2VxTm8gPSAldSwgZmxhZyA9IDB4JXgsIHJldCA9ICVkLCAiCisJCQkgICAidHhDb3VudCA9ICVsdSwgdHhEcm9wID0gICVsdSwgdHhCeXRlcyA9ICVsdSwiCisJCQkgICAicnhDb3VudCA9ICVsdSwgcnhEcm9wID0gJWx1LCByeEJ5dGVzID0gJWx1XG4iLAorCQkJICAgc3RyLCBlcHBpbmdIZHItPkNtZF9oLCBlcHBpbmdIZHItPlNlcU5vLAorCQkJICAgZXBwaW5nSGRyLT5DbWRGbGFnc19oLCByZXQsCisJCQkgICBwQWRhcHRlci0+c3RhdHMudHhfcGFja2V0cywKKwkJCSAgIHBBZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkLAorCQkJICAgcEFkYXB0ZXItPnN0YXRzLnR4X2J5dGVzLAorCQkJICAgcEFkYXB0ZXItPnN0YXRzLnJ4X3BhY2tldHMsCisJCQkgICBwQWRhcHRlci0+c3RhdHMucnhfZHJvcHBlZCwKKwkJCSAgIHBBZGFwdGVyLT5zdGF0cy5yeF9ieXRlcyk7CisJfQorfQorCit2b2lkIGVwcGluZ19sb2dfc3RhdHMoZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJICAgIiVzOiB0eENvdW50ID0gJWx1LCB0eERyb3AgPSAlbHUsIHR4X2J5dGVzID0gJWx1LCAiCisJCSAgICJyeENvdW50ID0gJWx1LCByeERyb3AgPSAlbHUsIHJ4X2J5dGVzID0gJWx1LCB0eF9hY2tzID0gJXVcbiIsCisJCSAgIHN0ciwKKwkJICAgcEFkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHMsCisJCSAgIHBBZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkLAorCQkgICBwQWRhcHRlci0+c3RhdHMudHhfYnl0ZXMsCisJCSAgIHBBZGFwdGVyLT5zdGF0cy5yeF9wYWNrZXRzLAorCQkgICBwQWRhcHRlci0+c3RhdHMucnhfZHJvcHBlZCwKKwkJICAgcEFkYXB0ZXItPnN0YXRzLnJ4X2J5dGVzLAorCQkgICBwQWRhcHRlci0+cEVwcGluZ19jdHgtPnRvdGFsX3R4X2Fja3MpOworfQorCit2b2lkIGVwcGluZ19zZXRfa3BlcmZfZmxhZyhlcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlciwKKwkJCSAgIEhUQ19FTkRQT0lOVF9JRCBlaWQsIEFfVUlOVDgga3BlcmZfZmxhZykKK3sKKwlwQWRhcHRlci0+cEVwcGluZ19jdHgtPmtwZXJmX251bV9yeF9yZWN2W2VpZF0gPSAwOworCXBBZGFwdGVyLT5wRXBwaW5nX2N0eC0+a3BlcmZfbnVtX3R4X2Fja3NbZWlkXSA9IDA7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3V0aWxzL2VwcGluZy9zcmMvZXBwaW5nX21haW4uYyBiL2NvcmUvdXRpbHMvZXBwaW5nL3NyYy9lcHBpbmdfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMGM0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL2VwcGluZy9zcmMvZXBwaW5nX21haW4uYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIGVwcGluZ19tYWluLmMKKworICAgXGJyaWVmIFdMQU4gRW5kIFBvaW50IFBpbmcgdGVzdCB0b29sIGltcGxlbWVudGF0aW9uCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgPGNkc19zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDx3bmlfYXBpLmg+CisjaW5jbHVkZSA8d2xhbl9wdHRfc29ja19zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSAiYm1pLmgiCisjaW5jbHVkZSAib2xfZncuaCIKKyNpbmNsdWRlICJvbF9pZl9hdGh2YXIuaCIKKyNpbmNsdWRlICJoaWYuaCIKKyNpbmNsdWRlICJlcHBpbmdfbWFpbi5oIgorI2luY2x1ZGUgImVwcGluZ19pbnRlcm5hbC5oIgorCisjaWZkZWYgVElNRVJfTUFOQUdFUgorI2RlZmluZSBUSU1FUl9NQU5BR0VSX1NUUiAiICtUSU1FUl9NQU5BR0VSIgorI2Vsc2UKKyNkZWZpbmUgVElNRVJfTUFOQUdFUl9TVFIgIiIKKyNlbmRpZgorCisjaWZkZWYgTUVNT1JZX0RFQlVHCisjZGVmaW5lIE1FTU9SWV9ERUJVR19TVFIgIiArTUVNT1JZX0RFQlVHIgorI2Vsc2UKKyNkZWZpbmUgTUVNT1JZX0RFQlVHX1NUUiAiIgorI2VuZGlmCisKKyNpZmRlZiBISUZfU0RJTworI2RlZmluZSBXTEFOX1dBSVRfVElNRV9XTEFOU1RBUlQgMTAwMDAKKyNlbHNlCisjZGVmaW5lIFdMQU5fV0FJVF9USU1FX1dMQU5TVEFSVCAyMDAwCisjZW5kaWYKKworLyoqCisgKiBlcHBpbmdfb3BlbigpOiBFbmQgcG9pbnQgcGluZyBkcml2ZXIgb3BlbiBGdW5jdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEhERCB0byBvcGVuIGVwcGluZyBtb2R1bGUKKyAqCisgKgorICogcmV0dXJuIC0gMCBmb3Igc3VjY2VzcywgbmVnYXRpdmUgZm9yIGZhaWx1cmUKKyAqLworaW50IGVwcGluZ19vcGVuKHZvaWQpCit7CisJZXBwaW5nX2NvbnRleHRfdCAqcEVwcGluZ19jdHg7CisJdl9DT05URVhUX3QgY2RzX2NvbnRleHQ7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogRW50ZXIiLCBfX2Z1bmNfXyk7CisKKwljZHNfY29udGV4dCA9IGNkc19nZXRfZ2xvYmFsX2NvbnRleHQoKTsKKwlzdGF0dXMgPSBjZHNfYWxsb2NfY29udGV4dChjZHNfY29udGV4dCwgQ0RGX01PRFVMRV9JRF9FUFBJTkcsCisJCQkJICAgICAgICh2b2lkICoqKSZwRXBwaW5nX2N0eCwKKwkJCQkgICAgICAgc2l6ZW9mKCpwRXBwaW5nX2N0eCkpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGNhbm5vdCBhbGxvYyBlcHBpbmcgY29udGV4dCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcEVwcGluZ19jdHgtPmNvbl9tb2RlID0gY2RzX2dldF9jb25wYXJhbSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGVwcGluZ19kaXNhYmxlKCk6IEVuZCBwb2ludCBwaW5nIGRyaXZlciBkaXNhYmxlIEZ1bmN0aW9uCisgKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGRpc2FibGUgZnVuY3Rpb24gLSBjYWxsZWQgYnkgSEREIHRvCisgKiBkaXNhYmxlIGVwcGluZyBtb2R1bGUKKyAqCisgKiByZXR1cm46IG5vbmUKKyAqLwordm9pZCBlcHBpbmdfZGlzYWJsZSh2b2lkKQoreworCWVwcGluZ19jb250ZXh0X3QgKnBFcHBpbmdfY3R4OworCisJcEVwcGluZ19jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9FUFBJTkcpOworCWlmIChwRXBwaW5nX2N0eCA9PSBOVUxMKSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgIiVzOiBlcnJvcjogcEVwcGluZ19jdHggID0gTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocEVwcGluZ19jdHgtPmVwcGluZ19hZGFwdGVyKSB7CisJCWVwcGluZ19kZXN0cm95X2FkYXB0ZXIocEVwcGluZ19jdHgtPmVwcGluZ19hZGFwdGVyKTsKKwkJcEVwcGluZ19jdHgtPmVwcGluZ19hZGFwdGVyID0gTlVMTDsKKwl9CisJaGlmX2Rpc2FibGVfaXNyKGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRikpOworCWhpZl9yZXNldF9zb2MoY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKSk7CisJaHRjX3N0b3AoY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSFRDKSk7CisJZXBwaW5nX2Nvb2tpZV9jbGVhbnVwKHBFcHBpbmdfY3R4KTsKK30KKworLyoqCisgKiBlcHBpbmdfY2xvc2UoKTogRW5kIHBvaW50IHBpbmcgZHJpdmVyIGNsb3NlIEZ1bmN0aW9uCisgKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGNsb3NlIGZ1bmN0aW9uIC0gY2FsbGVkIGJ5IEhERCB0byBjbG9zZSBlcHBpbmcgbW9kdWxlCisgKgorICogcmV0dXJuOiBub25lCisgKi8KK3ZvaWQgZXBwaW5nX2Nsb3NlKHZvaWQpCit7CisJZXBwaW5nX2NvbnRleHRfdCAqcEVwcGluZ19jdHg7CisKKwlwRXBwaW5nX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0VQUElORyk7CisJaWYgKHBFcHBpbmdfY3R4ID09IE5VTEwpIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IGVycm9yOiBwRXBwaW5nX2N0eCAgPSBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWNkc19mcmVlX2NvbnRleHQoTlVMTCwgQ0RGX01PRFVMRV9JRF9FUFBJTkcsCisJCWNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0VQUElORykpOworfQorCitzdGF0aWMgdm9pZCBlcHBpbmdfdGFyZ2V0X3N1c3BlbmRfYWNrbm93bGVkZ2Uodm9pZCAqY29udGV4dCkKK3sKKwllcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0VQUElORyk7CisJaW50IHdvd19uYWNrID0gKigoaW50ICopY29udGV4dCk7CisKKwlpZiAoTlVMTCA9PSBwRXBwaW5nX2N0eCkgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogZXBwaW5nX2N0eCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCS8qIEVQUElOR19UT0RPOiBkbyB3ZSBuZWVkIHdvd19uYWNrPyAqLworCXBFcHBpbmdfY3R4LT53b3dfbmFjayA9IHdvd19uYWNrOworfQorCisvKioKKyAqIGVwcGluZ19lbmFibGUoKTogRW5kIHBvaW50IHBpbmcgZHJpdmVyIGVuYWJsZSBGdW5jdGlvbgorICoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBlbmFibGUgZnVuY3Rpb24gLSBjYWxsZWQgYnkgSEREIHRvIGVuYWJsZQorICogZXBwaW5nIG1vZHVsZQorICoKKyAqIHJldHVybiAtIDAgOiBzdWNjZXNzLCBuZWdhdGl2ZTogZXJyb3IKKyAqLworaW50IGVwcGluZ19lbmFibGUoc3RydWN0IGRldmljZSAqcGFyZW50X2RldikKK3sKKwlpbnQgcmV0ID0gMDsKKwllcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eCA9IE5VTEw7CisJY2RzX2NvbnRleHRfdHlwZSAqcF9jZHNfY29udGV4dCA9IE5VTEw7CisJY2RmX2RldmljZV90IGNkZl9jdHg7CisJSFRDX0lOSVRfSU5GTyBodGNJbmZvOworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuOworCXRTaXJNYWNBZGRyIGFkYXB0ZXJfbWFjQWRkcjsKKworCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKworCXBfY2RzX2NvbnRleHQgPSBjZHNfZ2V0X2dsb2JhbF9jb250ZXh0KCk7CisKKwlpZiAocF9jZHNfY29udGV4dCA9PSBOVUxMKSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgIiVzOiBGYWlsZWQgY2RzX2dldF9nbG9iYWxfY29udGV4dCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLTE7CisJCXJldHVybiByZXQ7CisJfQorCisJcEVwcGluZ19jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9FUFBJTkcpOworCWlmIChwRXBwaW5nX2N0eCA9PSBOVUxMKSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgIiVzOiBGYWlsZWQgdG8gZ2V0IHBFcHBpbmdfY3R4IiwgX19mdW5jX18pOworCQlyZXQgPSAtMTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcEVwcGluZ19jdHgtPnBhcmVudF9kZXYgPSAodm9pZCAqKXBhcmVudF9kZXY7CisJZXBwaW5nX2dldF9kdW1teV9tYWNfYWRkcihhZGFwdGVyX21hY0FkZHIpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgdGltZXIgbW9kdWxlICovCisJY2RmX3RpbWVyX21vZHVsZV9pbml0KCk7CisKKwlzY24gPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCWlmICghc2NuKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAiJXM6IHNjbiBpcyBudWxsISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzY24tPmVuYWJsZXVhcnRwcmludCA9IDA7CisJc2NuLT5lbmFibGVmd2xvZyA9IDA7CisJLyogc3RvcmUgdGFyZ2V0IHR5cGUgYW5kIHRhcmdldCB2ZXJzaW9uIGluZm8gaW4gaGRkIGN0eCAqLworCXBFcHBpbmdfY3R4LT50YXJnZXRfdHlwZSA9IHNjbi0+dGFyZ2V0X3R5cGU7CisKKyNpZm5kZWYgRkVBVFVSRV9CTUlfMgorCS8qIEluaXRpYWxpemUgQk1JIGFuZCBEb3dubG9hZCBmaXJtd2FyZSAqLworCWlmIChibWlfZG93bmxvYWRfZmlybXdhcmUoc2NuKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgIiVzOiBCTUkgZmFpbGVkIHRvIGRvd25sb2FkIHRhcmdldCIsIF9fZnVuY19fKTsKKwkJYm1pX2NsZWFudXAoc2NuKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKwkJICAgIiVzOiBibWlfZG93bmxvYWRfZmlybXdhcmUgZG9uZSIsIF9fZnVuY19fKTsKKworCWh0Y0luZm8ucENvbnRleHQgPSBwX2Nkc19jb250ZXh0LT5wSElGQ29udGV4dDsKKwlodGNJbmZvLlRhcmdldEZhaWx1cmUgPSBvbF90YXJnZXRfZmFpbHVyZTsKKwlodGNJbmZvLlRhcmdldFNlbmRTdXNwZW5kQ29tcGxldGUgPSBlcHBpbmdfdGFyZ2V0X3N1c3BlbmRfYWNrbm93bGVkZ2U7CisJY2RmX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0NERl9ERVZJQ0UpOworCisJLyogQ3JlYXRlIEhUQyAqLworCXBfY2RzX2NvbnRleHQtPmh0Y19jdHggPSBodGNfY3JlYXRlKGh0Y0luZm8ucENvbnRleHQsICZodGNJbmZvLCBjZGZfY3R4KTsKKwlpZiAoIXBfY2RzX2NvbnRleHQtPmh0Y19jdHgpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICIlczogRmFpbGVkIHRvIENyZWF0ZSBIVEMiLCBfX2Z1bmNfXyk7CisJCWJtaV9jbGVhbnVwKHNjbik7CisJCXJldHVybiAtMTsKKwl9CisJcEVwcGluZ19jdHgtPkhUQ0hhbmRsZSA9CisJCWNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hUQyk7CisJaWYgKHBFcHBpbmdfY3R4LT5IVENIYW5kbGUgPT0gTlVMTCkgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogSFRDSGFuZGxlIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisJc2NuLT5odGNfaGFuZGxlID0gcEVwcGluZ19jdHgtPkhUQ0hhbmRsZTsKKworCWhpZl9jbGFpbV9kZXZpY2Uoc2NuLT5oaWZfaGRsLCBzY24pOworCisJaWYgKGJtaV9kb25lKHNjbikpIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IEZhaWxlZCB0byBjb21wbGV0ZSBCTUkgcGhhc2UiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyb3JfZW5kOworCX0KKwkvKiBzdGFydCBISUYgKi8KKwlpZiAoaHRjX3dhaXRfdGFyZ2V0KHNjbi0+aHRjX2hhbmRsZSkgIT0gQV9PSykgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogaHRjX3dhaXRfdGFyZ2V0IGVycm9yIiwgX19mdW5jX18pOworCQlnb3RvIGVycm9yX2VuZDsKKwl9CisJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IEhUQyByZWFkeSIsIF9fZnVuY19fKTsKKworCXJldCA9IGVwcGluZ19jb25uZWN0X3NlcnZpY2UocEVwcGluZ19jdHgpOworCWlmIChyZXQgIT0gMCkgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogaHRjX3dhaXRfdGFyZ2V0ZG9uZSIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJvcl9lbmQ7CisJfQorCWlmIChodGNfc3RhcnQocEVwcGluZ19jdHgtPkhUQ0hhbmRsZSkgIT0gQV9PSykgeworCQlnb3RvIGVycm9yX2VuZDsKKwl9CisJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IEhUQyBzdGFydGVkIiwgX19mdW5jX18pOworCisJLyogaW5pdCB0aGUgdHggY29va2llIHJlc291cmNlICovCisJcmV0ID0gZXBwaW5nX2Nvb2tpZV9pbml0KHBFcHBpbmdfY3R4KTsKKwlpZiAocmV0ID09IDApIHsKKwkJcEVwcGluZ19jdHgtPmVwcGluZ19hZGFwdGVyID0gZXBwaW5nX2FkZF9hZGFwdGVyKHBFcHBpbmdfY3R4LAorCQkJCQkJCQkgYWRhcHRlcl9tYWNBZGRyLAorCQkJCQkJCQkgQ0RGX1NUQV9NT0RFKTsKKwl9CisJaWYgKHJldCA8IDAgfHwgcEVwcGluZ19jdHgtPmVwcGluZ19hZGFwdGVyID09IE5VTEwpIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IGVwcGluZ19hZGRfYWRhcHRlcmVycm9yIGVycm9yIiwgX19mdW5jX18pOworCQlodGNfc3RvcChwRXBwaW5nX2N0eC0+SFRDSGFuZGxlKTsKKwkJZXBwaW5nX2Nvb2tpZV9jbGVhbnVwKHBFcHBpbmdfY3R4KTsKKwkJZ290byBlcnJvcl9lbmQ7CisJfQorCisJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IEV4aXQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHJldDsKKworZXJyb3JfZW5kOgorCWh0Y19kZXN0cm95KHBfY2RzX2NvbnRleHQtPmh0Y19jdHgpOworCXBfY2RzX2NvbnRleHQtPmh0Y19jdHggPSBOVUxMOworCWJtaV9jbGVhbnVwKHNjbik7CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9lcHBpbmcvc3JjL2VwcGluZ19yeC5jIGIvY29yZS91dGlscy9lcHBpbmcvc3JjL2VwcGluZ19yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OTI4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL2VwcGluZy9zcmMvZXBwaW5nX3J4LmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICBlcHBpbmdfbWFpbi5jCisKKyAgIFxicmllZiBXTEFOIEVuZCBQb2ludCBQaW5nIHRlc3QgdG9vbCBpbXBsZW1lbnRhdGlvbgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBJbmNsdWRlIEZpbGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPGNkc19hcGkuaD4KKyNpbmNsdWRlIDxjZHNfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8d25pX2FwaS5oPgorI2luY2x1ZGUgPHdsYW5fcHR0X3NvY2tfc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgImVwcGluZ19tYWluLmgiCisjaW5jbHVkZSAiZXBwaW5nX2ludGVybmFsLmgiCisjaW5jbHVkZSAiZXBwaW5nX3Rlc3QuaCIKKyNpbmNsdWRlIDx3bGFuX2hkZF9uYXBpLmg+CisKKyNkZWZpbmUgQVI2MDAwX01BWF9SWF9CVUZGRVJTIDE2CisjZGVmaW5lIEFSNjAwMF9CVUZGRVJfU0laRSAxNjY0CisjZGVmaW5lIEFSNjAwMF9NSU5fSEVBRF9ST09NIDY0CisKK3N0YXRpYyBib29sIGVuYl9yeF9kdW1wID0gMDsKKworI2lmZGVmIEhJRl9TRElPCit2b2lkIGVwcGluZ19yZWZpbGwodm9pZCAqY3R4LCBIVENfRU5EUE9JTlRfSUQgRW5kcG9pbnQpCit7CisJZXBwaW5nX2NvbnRleHRfdCAqcEVwcGluZ19jdHggPSAoZXBwaW5nX2NvbnRleHRfdCAqKSBjdHg7CisJdm9pZCAqb3NCdWY7CisJaW50IFJ4QnVmZmVyczsKKwlpbnQgYnVmZmVyc1RvUmVmaWxsOworCUhUQ19QQUNLRVQgKnBQYWNrZXQ7CisJSFRDX1BBQ0tFVF9RVUVVRSBxdWV1ZTsKKworCWJ1ZmZlcnNUb1JlZmlsbCA9IChpbnQpQVI2MDAwX01BWF9SWF9CVUZGRVJTIC0KKwkJCSAgaHRjX2dldF9udW1fcmVjdl9idWZmZXJzKHBFcHBpbmdfY3R4LT5IVENIYW5kbGUsIEVuZHBvaW50KTsKKworCWlmIChidWZmZXJzVG9SZWZpbGwgPD0gMCkgeworCQkvKiBmYXN0IHJldHVybiwgbm90aGluZyB0byBmaWxsICovCisJCXJldHVybjsKKwl9CisKKwlJTklUX0hUQ19QQUNLRVRfUVVFVUUoJnF1ZXVlKTsKKworCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgICIlczogcHJvdmlkaW5nIGh0YyB3aXRoICVkIGJ1ZmZlcnMgYXQgZWlkPSVkXG4iLAorCQkgICBfX2Z1bmNfXywgYnVmZmVyc1RvUmVmaWxsLCBFbmRwb2ludCk7CisKKwlmb3IgKFJ4QnVmZmVycyA9IDA7IFJ4QnVmZmVycyA8IGJ1ZmZlcnNUb1JlZmlsbDsgUnhCdWZmZXJzKyspIHsKKwkJb3NCdWYgPSBjZGZfbmJ1Zl9hbGxvYyhOVUxMLCBBUjYwMDBfQlVGRkVSX1NJWkUsCisJCQkJICAgICAgIEFSNjAwMF9NSU5fSEVBRF9ST09NLCA0LCBmYWxzZSk7CisJCWlmIChOVUxMID09IG9zQnVmKSB7CisJCQlicmVhazsKKwkJfQorCQkvKiB0aGUgSFRDIHBhY2tldCB3cmFwcGVyIGlzIGF0IHRoZSBoZWFkIG9mIHRoZSByZXNlcnZlZCBhcmVhCisJCSAqIGluIHRoZSBza2IgKi8KKwkJcFBhY2tldCA9IChIVENfUEFDS0VUICopIChBX05FVEJVRl9IRUFEKG9zQnVmKSk7CisJCS8qIHNldCByZS1maWxsIGluZm8gKi8KKwkJU0VUX0hUQ19QQUNLRVRfSU5GT19SWF9SRUZJTEwocFBhY2tldCwgb3NCdWYsCisJCQkJCSAgICAgIGNkZl9uYnVmX2RhdGEob3NCdWYpLAorCQkJCQkgICAgICBBUjYwMDBfQlVGRkVSX1NJWkUsIEVuZHBvaW50KTsKKwkJU0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKHBQYWNrZXQsIG9zQnVmKTsKKwkJLyogYWRkIHRvIHF1ZXVlICovCisJCUhUQ19QQUNLRVRfRU5RVUVVRSgmcXVldWUsIHBQYWNrZXQpOworCX0KKworCWlmICghSFRDX1FVRVVFX0VNUFRZKCZxdWV1ZSkpIHsKKwkJLyogYWRkIHBhY2tldHMgKi8KKwkJaHRjX2FkZF9yZWNlaXZlX3BrdF9tdWx0aXBsZShwRXBwaW5nX2N0eC0+SFRDSGFuZGxlLCAmcXVldWUpOworCX0KK30KKyNlbmRpZiAvKiBISUZfU0RJTyAqLworCit2b2lkIGVwcGluZ19yeCh2b2lkICpjdHgsIEhUQ19QQUNLRVQgKnBQYWNrZXQpCit7CisJZXBwaW5nX2NvbnRleHRfdCAqcEVwcGluZ19jdHggPSAoZXBwaW5nX2NvbnRleHRfdCAqKSBjdHg7CisJZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBwRXBwaW5nX2N0eC0+ZXBwaW5nX2FkYXB0ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBBZGFwdGVyLT5kZXY7CisJQV9TVEFUVVMgc3RhdHVzID0gcFBhY2tldC0+U3RhdHVzOworCUhUQ19FTkRQT0lOVF9JRCBlaWQgPSBwUGFja2V0LT5FbmRwb2ludDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0U2tiID0gKHN0cnVjdCBza19idWZmICopcFBhY2tldC0+cFBrdENvbnRleHQ7CisKKwlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkgICAiJXM6IHBBZGFwdGVyID0gMHglcCBlaWQ9JWQsIHNrYj0weCVwLCBkYXRhPTB4JXAsIGxlbj0weCV4IHN0YXR1czolZCIsCisJCSAgIF9fZnVuY19fLCBwQWRhcHRlciwgZWlkLCBwa3RTa2IsIHBQYWNrZXQtPnBCdWZmZXIsCisJCSAgIHBQYWNrZXQtPkFjdHVhbExlbmd0aCwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgIT0gQV9PSykgeworCQlpZiAoc3RhdHVzICE9IEFfRUNBTkNFTEVEKSB7CisJCQlwcmludGsoIiVzOiBSWCBFUlIgKCVkKSBcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCQl9CisJCWNkZl9uYnVmX2ZyZWUocGt0U2tiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGRlbGl2ZXIgdG8gdXAgbGF5ZXIgKi8KKwlpZiAocGt0U2tiKSB7CisJCWlmIChFUFBJTkdfQUxJR05NRU5UX1BBRCA+IDApIHsKKwkJCUFfTkVUQlVGX1BVTEwocGt0U2tiLCBFUFBJTkdfQUxJR05NRU5UX1BBRCk7CisJCX0KKwkJaWYgKGVuYl9yeF9kdW1wKQorCQkJZXBwaW5nX2hleF9kdW1wKCh2b2lkICopY2RmX25idWZfZGF0YShwa3RTa2IpLAorCQkJCQlwa3RTa2ItPmxlbiwgX19mdW5jX18pOworCQlwa3RTa2ItPmRldiA9IGRldjsKKwkJaWYgKChwa3RTa2ItPmRldi0+ZmxhZ3MgJiBJRkZfVVApID09IElGRl9VUCkgeworCQkJcGt0U2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBrdFNrYiwgcGt0U2tiLT5kZXYpOworCQkJKytwQWRhcHRlci0+c3RhdHMucnhfcGFja2V0czsKKwkJCXBBZGFwdGVyLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RTa2ItPmxlbjsKKwkJCWlmIChoZGRfbmFwaV9lbmFibGVkKEhERF9OQVBJX0FOWSkpCisJCQkJbmV0aWZfcmVjZWl2ZV9za2IocGt0U2tiKTsKKwkJCWVsc2UKKwkJCQluZXRpZl9yeF9uaShwa3RTa2IpOworCQkJaWYgKChwQWRhcHRlci0+c3RhdHMucnhfcGFja2V0cyAlCisJCQkJIEVQUElOR19TVEFUU19MT0dfQ09VTlQpID09IDApIHsKKwkJCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCQkJICAgIiVzOiB0b3RhbF9yeF9wa3RzID0gJWx1IiwKKwkJCQkJICAgX19mdW5jX18sCisJCQkJCSAgIHBBZGFwdGVyLT5zdGF0cy5yeF9wYWNrZXRzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSsrcEFkYXB0ZXItPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQljZGZfbmJ1Zl9mcmVlKHBrdFNrYik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3V0aWxzL2VwcGluZy9zcmMvZXBwaW5nX3R4LmMgYi9jb3JlL3V0aWxzL2VwcGluZy9zcmMvZXBwaW5nX3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0ODliMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdXRpbHMvZXBwaW5nL3NyYy9lcHBpbmdfdHguYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIGVwcGluZ19tYWluLmMKKworICAgXGJyaWVmIFdMQU4gRW5kIFBvaW50IFBpbmcgdGVzdCB0b29sIGltcGxlbWVudGF0aW9uCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEluY2x1ZGUgRmlsZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8Y2RzX2FwaS5oPgorI2luY2x1ZGUgPGNkc19zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDx3bmlfYXBpLmg+CisjaW5jbHVkZSA8d2xhbl9wdHRfc29ja19zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSAiZXBwaW5nX21haW4uaCIKKyNpbmNsdWRlICJlcHBpbmdfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJlcHBpbmdfdGVzdC5oIgorCisjZGVmaW5lIFRYX1JFVFJZX1RJTUVPVVRfSU5fTVMgMQorCitzdGF0aWMgYm9vbCBlbmJfdHhfZHVtcCA9IDA7CisKK3ZvaWQgZXBwaW5nX3R4X2R1cF9wa3QoZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisJCSAgICAgICBIVENfRU5EUE9JTlRfSUQgZWlkLCBjZGZfbmJ1Zl90IHNrYikKK3sKKwlzdHJ1Y3QgZXBwaW5nX2Nvb2tpZSAqY29va2llID0gTlVMTDsKKwlpbnQgc2tiX2xlbiwgcmV0OworCWNkZl9uYnVmX3QgbmV3X3NrYjsKKworCWNvb2tpZSA9IGVwcGluZ19hbGxvY19jb29raWUocEFkYXB0ZXItPnBFcHBpbmdfY3R4KTsKKwlpZiAoY29va2llID09IE5VTEwpIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IGVwcGluZ19hbGxvY19jb29raWUgcmV0dXJucyBubyByZXNvdXJjZVxuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwluZXdfc2tiID0gY2RmX25idWZfY29weShza2IpOworCWlmICghbmV3X3NrYikgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogY2RmX25idWZfY29weSByZXR1cm5zIG5vIHJlc291cmNlXG4iLCBfX2Z1bmNfXyk7CisJCWVwcGluZ19mcmVlX2Nvb2tpZShwQWRhcHRlci0+cEVwcGluZ19jdHgsIGNvb2tpZSk7CisJCXJldHVybjsKKwl9CisJU0VUX0hUQ19QQUNLRVRfSU5GT19UWCgmY29va2llLT5IdGNQa3QsCisJCQkgICAgICAgY29va2llLCBjZGZfbmJ1Zl9kYXRhKHNrYiksCisJCQkgICAgICAgY2RmX25idWZfbGVuKG5ld19za2IpLCBlaWQsIDApOworCVNFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVCgmY29va2llLT5IdGNQa3QsIG5ld19za2IpOworCXNrYl9sZW4gPSAoaW50KWNkZl9uYnVmX2xlbihuZXdfc2tiKTsKKwkvKiBzZW5kIHRoZSBwYWNrZXQgKi8KKwlyZXQgPSBodGNfc2VuZF9wa3QocEFkYXB0ZXItPnBFcHBpbmdfY3R4LT5IVENIYW5kbGUsICZjb29raWUtPkh0Y1BrdCk7CisJaWYgKHJldCAhPSBBX09LKSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgIiVzOiBodGNfc2VuZF9wa3QgZmFpbGVkLCByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWVwcGluZ19mcmVlX2Nvb2tpZShwQWRhcHRlci0+cEVwcGluZ19jdHgsIGNvb2tpZSk7CisJCWNkZl9uYnVmX2ZyZWUobmV3X3NrYik7CisJCXJldHVybjsKKwl9CisJcEFkYXB0ZXItPnN0YXRzLnR4X2J5dGVzICs9IHNrYl9sZW47CisJKytwQWRhcHRlci0+c3RhdHMudHhfcGFja2V0czsKKwlpZiAoKChwQWRhcHRlci0+c3RhdHMudHhfcGFja2V0cyArCisJICAgICAgcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQpICUgRVBQSU5HX1NUQVRTX0xPR19DT1VOVCkgPT0gMCAmJgorCSAgICAocEFkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHMgfHwgcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQpKSB7CisJCWVwcGluZ19sb2dfc3RhdHMocEFkYXB0ZXIsIF9fZnVuY19fKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXBwaW5nX3R4X3NlbmRfaW50KGNkZl9uYnVmX3Qgc2tiLCBlcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwlFUFBJTkdfSEVBREVSICplcHBpbmdIZHIgPSAoRVBQSU5HX0hFQURFUiAqKSBjZGZfbmJ1Zl9kYXRhKHNrYik7CisJSFRDX0VORFBPSU5UX0lEIGVpZCA9IEVORFBPSU5UX1VOVVNFRDsKKwlzdHJ1Y3QgZXBwaW5nX2Nvb2tpZSAqY29va2llID0gTlVMTDsKKwlBX1VJTlQ4IGFjID0gMDsKKwlBX1NUQVRVUyByZXQgPSBBX09LOworCWludCBza2JfbGVuOworCUVQUElOR19IRUFERVIgdG1wSGRyID0gKmVwcGluZ0hkcjsKKworCS8qIGFsbG9jYXRlIHJlc291cmNlIGZvciB0aGlzIHBhY2tldCAqLworCWNvb2tpZSA9IGVwcGluZ19hbGxvY19jb29raWUocEFkYXB0ZXItPnBFcHBpbmdfY3R4KTsKKwkvKiBubyByZXNvdXJjZSAqLworCWlmIChjb29raWUgPT0gTlVMTCkgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogZXBwaW5nX2FsbG9jX2Nvb2tpZSByZXR1cm5zIG5vIHJlc291cmNlXG4iLAorCQkJICAgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGVuYl90eF9kdW1wKQorCQllcHBpbmdfaGV4X2R1bXAoKHZvaWQgKillcHBpbmdIZHIsIHNrYi0+bGVuLCBfX2Z1bmNfXyk7CisJLyoKKwkgKiBhIHF1aXJrIG9mIGxpbnV4LCB0aGUgcGF5bG9hZCBvZiB0aGUgZnJhbWUgaXMgMzItYml0IGFsaWduZWQgYW5kIHRodXMKKwkgKiB0aGUgYWRkaXRpb24gb2YgdGhlIEhUQyBoZWFkZXIgd2lsbCBtaXMtYWxpZ24gdGhlIHN0YXJ0IG9mIHRoZSBIVEMKKwkgKiBmcmFtZSwgc28gd2UgYWRkIHNvbWUgcGFkZGluZyB3aGljaCB3aWxsIGJlIHN0cmlwcGVkIG9mZiBpbiB0aGUgdGFyZ2V0CisJICovCisJaWYgKEVQUElOR19BTElHTk1FTlRfUEFEID4gMCkgeworCQlBX05FVEJVRl9QVVNIKHNrYiwgRVBQSU5HX0FMSUdOTUVOVF9QQUQpOworCX0KKwkvKiBwcmVwYXJlIGVwL0hUQyBpbmZvcm1hdGlvbiAqLworCWFjID0gZXBwaW5nSGRyLT5TdHJlYW1Ob19oOworCWVpZCA9IHBBZGFwdGVyLT5wRXBwaW5nX2N0eC0+RXBwaW5nRW5kcG9pbnRbYWNdOworCWlmIChlaWQgPCAwIHx8IGVpZCA+PSBFUFBJTkdfTUFYX05VTV9FUElEUykgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogaW52YWxpZCBlaWQgPSAlZCwgYWMgPSAlZFxuIiwgX19mdW5jX18sIGVpZCwKKwkJCSAgIGFjKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAodG1wSGRyLkNtZF9oID09IEVQUElOR19DTURfUkVTRVRfUkVDVl9DTlQgfHwKKwkgICAgdG1wSGRyLkNtZF9oID09IEVQUElOR19DTURfQ09OVF9SWF9TVEFSVCkgeworCQllcHBpbmdfc2V0X2twZXJmX2ZsYWcocEFkYXB0ZXIsIGVpZCwgdG1wSGRyLkNtZEJ1ZmZlcl90WzBdKTsKKwl9CisJU0VUX0hUQ19QQUNLRVRfSU5GT19UWCgmY29va2llLT5IdGNQa3QsCisJCQkgICAgICAgY29va2llLCBjZGZfbmJ1Zl9kYXRhKHNrYiksIGNkZl9uYnVmX2xlbihza2IpLAorCQkJICAgICAgIGVpZCwgMCk7CisJU0VUX0hUQ19QQUNLRVRfTkVUX0JVRl9DT05URVhUKCZjb29raWUtPkh0Y1BrdCwgc2tiKTsKKwlza2JfbGVuID0gc2tiLT5sZW47CisJLyogc2VuZCB0aGUgcGFja2V0ICovCisJcmV0ID0gaHRjX3NlbmRfcGt0KHBBZGFwdGVyLT5wRXBwaW5nX2N0eC0+SFRDSGFuZGxlLCAmY29va2llLT5IdGNQa3QpOworCWVwcGluZ19sb2dfcGFja2V0KHBBZGFwdGVyLCAmdG1wSGRyLCByZXQsIF9fZnVuY19fKTsKKwlpZiAocmV0ICE9IEFfT0spIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IGh0Y19zZW5kX3BrdCBmYWlsZWQsIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSAgIHJldCk7CisJCWVwcGluZ19mcmVlX2Nvb2tpZShwQWRhcHRlci0+cEVwcGluZ19jdHgsIGNvb2tpZSk7CisJCXJldHVybiAtMTsKKwl9CisJcEFkYXB0ZXItPnN0YXRzLnR4X2J5dGVzICs9IHNrYl9sZW47CisJKytwQWRhcHRlci0+c3RhdHMudHhfcGFja2V0czsKKwlpZiAoKChwQWRhcHRlci0+c3RhdHMudHhfcGFja2V0cyArCisJICAgICAgcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQpICUgRVBQSU5HX1NUQVRTX0xPR19DT1VOVCkgPT0gMCAmJgorCSAgICAocEFkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHMgfHwgcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQpKSB7CisJCWVwcGluZ19sb2dfc3RhdHMocEFkYXB0ZXIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlcHBpbmdfdHhfdGltZXJfZXhwaXJlKGVwcGluZ19hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWNkZl9uYnVmX3Qgbm9kcm9wX3NrYjsKKworCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogcXVldWUgbGVuOiAlZFxuIiwgX19mdW5jX18sCisJCSAgIGNkZl9uYnVmX3F1ZXVlX2xlbigmcEFkYXB0ZXItPm5vZHJvcF9xdWV1ZSkpOworCisJaWYgKCFjZGZfbmJ1Zl9xdWV1ZV9sZW4oJnBBZGFwdGVyLT5ub2Ryb3BfcXVldWUpKSB7CisJCS8qIG5vZHJvcCBxdWV1ZSBpcyBlbXB0eSBzbyBubyBuZWVkIHRvIGFybSB0aW1lciAqLworCQlwQWRhcHRlci0+ZXBwaW5nX3RpbWVyX3N0YXRlID0gRVBQSU5HX1RYX1RJTUVSX1NUT1BQRUQ7CisJCXJldHVybjsKKwl9CisKKwkvKiB0cnkgdG8gZmx1c2ggbm9kcm9wIHF1ZXVlICovCisJd2hpbGUgKChub2Ryb3Bfc2tiID0gY2RmX25idWZfcXVldWVfcmVtb3ZlKCZwQWRhcHRlci0+bm9kcm9wX3F1ZXVlKSkpIHsKKwkJaWYgKGVwcGluZ190eF9zZW5kX2ludChub2Ryb3Bfc2tiLCBwQWRhcHRlcikpIHsKKwkJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCSAgICIlczogbm9kcm9wOiAlcCB4bWl0IGZhaWwgaW4gdGltZXJcbiIsCisJCQkJICAgX19mdW5jX18sIG5vZHJvcF9za2IpOworCQkJLyogZmFpbCB0byB4bWl0IHNvIHB1dCB0aGUgbm9kcm9wIHBhY2tldCB0byB0aGUgbm9kcm9wIHF1ZXVlICovCisJCQljZGZfbmJ1Zl9xdWV1ZV9pbnNlcnRfaGVhZCgmcEFkYXB0ZXItPm5vZHJvcF9xdWV1ZSwKKwkJCQkJCSAgIG5vZHJvcF9za2IpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgICIlczogbm9kcm9wOiAlcCB4bWl0IG9rIGluIHRpbWVyXG4iLAorCQkJCSAgIF9fZnVuY19fLCBub2Ryb3Bfc2tiKTsKKwkJfQorCX0KKworCS8qIGlmIG5vZHJvcCBxdWV1ZSBpcyBub3QgZW1wdHksIGNvbnRpbnVlIHRvIGFybSB0aW1lciAqLworCWlmIChub2Ryb3Bfc2tiKSB7CisJCWNkZl9zcGluX2xvY2tfYmgoJnBBZGFwdGVyLT5kYXRhX2xvY2spOworCQkvKiBpZiBub2Ryb3AgcXVldWUgaXMgbm90IGVtcHR5LCBjb250aW51ZSB0byBhcm0gdGltZXIgKi8KKwkJaWYgKHBBZGFwdGVyLT5lcHBpbmdfdGltZXJfc3RhdGUgIT0gRVBQSU5HX1RYX1RJTUVSX1JVTk5JTkcpIHsKKwkJCXBBZGFwdGVyLT5lcHBpbmdfdGltZXJfc3RhdGUgPSBFUFBJTkdfVFhfVElNRVJfUlVOTklORzsKKwkJCWNkZl9zb2Z0aXJxX3RpbWVyX21vZCgmcEFkYXB0ZXItPmVwcGluZ190aW1lciwKKwkJCQkJICAgICAgVFhfUkVUUllfVElNRU9VVF9JTl9NUyk7CisJCX0KKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwQWRhcHRlci0+ZGF0YV9sb2NrKTsKKwl9IGVsc2UgeworCQlwQWRhcHRlci0+ZXBwaW5nX3RpbWVyX3N0YXRlID0gRVBQSU5HX1RYX1RJTUVSX1NUT1BQRUQ7CisJfQorfQorCitpbnQgZXBwaW5nX3R4X3NlbmQoY2RmX25idWZfdCBza2IsIGVwcGluZ19hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWNkZl9uYnVmX3Qgbm9kcm9wX3NrYjsKKwlFUFBJTkdfSEVBREVSICplcHBpbmdIZHI7CisJQV9VSU5UOCBhYyA9IDA7CisKKwllcHBpbmdIZHIgPSAoRVBQSU5HX0hFQURFUiAqKSBjZGZfbmJ1Zl9kYXRhKHNrYik7CisKKwlpZiAoIUlTX0VQUElOR19QQUNLRVQoZXBwaW5nSGRyKSkgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogUmVjaXZlZCBub24gZW5kcG9pbnQgcGluZyBwYWNrZXRzXG4iLCBfX2Z1bmNfXyk7CisJCS8qIG5vIHBhY2tldCB0byBzZW5kLCBjbGVhbnVwICovCisJCWNkZl9uYnVmX2ZyZWUoc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogdGhlIHN0cmVhbSBJRCBpcyBtYXBwZWQgdG8gYW4gYWNjZXNzIGNsYXNzICovCisJYWMgPSBlcHBpbmdIZHItPlN0cmVhbU5vX2g7CisJLyogaGFyZCBjb2RlZCB0d28gZXAgaWRzICovCisJaWYgKGFjICE9IDAgJiYgYWMgIT0gMSkgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogYWMgJWQgaXMgbm90IG1hcHBlZCB0byBtYm94cGluZyBzZXJ2aWNlXG4iLAorCQkJICAgX19mdW5jX18sIGFjKTsKKwkJY2RmX25idWZfZnJlZShza2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIHNvbWUgRVBQSU5HIHBhY2tldHMgY2Fubm90IGJlIGRyb3BwZWQgbm8gbWF0dGVyIHdoYXQgYWNjZXNzIGNsYXNzCisJICogaXQgd2FzIHNlbnQgb24uIEEgc3BlY2lhbCBjYXJlIGhhcyBiZWVuIHRha2VuOgorCSAqIDEuIHdoZW4gdGhlcmUgaXMgbm8gVFggcmVzb3VyY2UsIHF1ZXVlIHRoZSBjb250cm9sIHBhY2tldHMgdG8KKwkgKiAgICBhIHNwZWNpYWwgcXVldWUKKwkgKiAyLiB3aGVuIHRoZXJlIGlzIFRYIHJlc291cmNlLCBzZW5kIHRoZSBxdWV1ZWQgY29udHJvbCBwYWNrZXRzIGZpcnN0CisJICogICAgYW5kIHRoZW4gb3RoZXIgcGFja2V0cworCSAqIDMuIGEgdGltZXIgbGF1bmNoZXMgdG8gY2hlY2sgaWYgdGhlcmUgaXMgcXVldWVkIGNvbnRyb2wgcGFja2V0cyBhbmQKKwkgKiAgICBmbHVzaCB0aGVtCisJICovCisKKwkvKiBjaGVjayB0aGUgbm9kcm9wIHF1ZXVlIGZpcnN0ICovCisJd2hpbGUgKChub2Ryb3Bfc2tiID0gY2RmX25idWZfcXVldWVfcmVtb3ZlKCZwQWRhcHRlci0+bm9kcm9wX3F1ZXVlKSkpIHsKKwkJaWYgKGVwcGluZ190eF9zZW5kX2ludChub2Ryb3Bfc2tiLCBwQWRhcHRlcikpIHsKKwkJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJCSAgICIlczogbm9kcm9wOiAlcCB4bWl0IGZhaWxcbiIsIF9fZnVuY19fLAorCQkJCSAgIG5vZHJvcF9za2IpOworCQkJLyogZmFpbCB0byB4bWl0IHNvIHB1dCB0aGUgbm9kcm9wIHBhY2tldCB0byB0aGUgbm9kcm9wIHF1ZXVlICovCisJCQljZGZfbmJ1Zl9xdWV1ZV9pbnNlcnRfaGVhZCgmcEFkYXB0ZXItPm5vZHJvcF9xdWV1ZSwKKwkJCQkJCSAgIG5vZHJvcF9za2IpOworCQkJLyogbm8gY29va2llIHNvIGZyZWUgdGhlIGN1cnJlbnQgc2tiICovCisJCQlnb3RvIHR4X2ZhaWw7CisJCX0gZWxzZSB7CisJCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCSAgICIlczogbm9kcm9wOiAlcCB4bWl0IG9rXG4iLCBfX2Z1bmNfXywKKwkJCQkgICBub2Ryb3Bfc2tiKTsKKwkJfQorCX0KKworCS8qIHNlbmQgdGhlIG9yaWdpbmFsIHBhY2tldCAqLworCWlmIChlcHBpbmdfdHhfc2VuZF9pbnQoc2tiLCBwQWRhcHRlcikpCisJCWdvdG8gdHhfZmFpbDsKKworCXJldHVybiAwOworCit0eF9mYWlsOgorCWlmICghSVNfRVBJTkdfUEFDS0VUX05PX0RST1AoZXBwaW5nSGRyKSkgeworCQkvKiBhbGxvdyB0byBkcm9wIHRoZSBza2Igc28gZHJvcCBpdCAqLworCQljZGZfbmJ1Zl9mcmVlKHNrYik7CisJCSsrcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQ7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgIiVzOiBUeCBza2IgJXAgZHJvcHBlZCwgc3RhdHMudHhfZHJvcHBlZCA9ICVsZFxuIiwKKwkJCSAgIF9fZnVuY19fLCBza2IsIHBBZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IG5vZHJvcDogJXAgcXVldWVkXG4iLCBfX2Z1bmNfXywgc2tiKTsKKwkJY2RmX25idWZfcXVldWVfYWRkKCZwQWRhcHRlci0+bm9kcm9wX3F1ZXVlLCBza2IpOworCQljZGZfc3Bpbl9sb2NrX2JoKCZwQWRhcHRlci0+ZGF0YV9sb2NrKTsKKwkJaWYgKHBBZGFwdGVyLT5lcHBpbmdfdGltZXJfc3RhdGUgIT0gRVBQSU5HX1RYX1RJTUVSX1JVTk5JTkcpIHsKKwkJCXBBZGFwdGVyLT5lcHBpbmdfdGltZXJfc3RhdGUgPSBFUFBJTkdfVFhfVElNRVJfUlVOTklORzsKKwkJCWNkZl9zb2Z0aXJxX3RpbWVyX21vZCgmcEFkYXB0ZXItPmVwcGluZ190aW1lciwKKwkJCQkJICAgICAgVFhfUkVUUllfVElNRU9VVF9JTl9NUyk7CisJCX0KKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZwQWRhcHRlci0+ZGF0YV9sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhJRl9TRElPCitIVENfU0VORF9GVUxMX0FDVElPTiBlcHBpbmdfdHhfcXVldWVfZnVsbCh2b2lkICpDb250ZXh0LCBIVENfUEFDS0VUICpwUGFja2V0KQoreworCWVwcGluZ19jb250ZXh0X3QgKnBFcHBpbmdfY3R4ID0gKGVwcGluZ19jb250ZXh0X3QgKikgQ29udGV4dDsKKwllcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlciA9IHBFcHBpbmdfY3R4LT5lcHBpbmdfYWRhcHRlcjsKKwlIVENfU0VORF9GVUxMX0FDVElPTiBhY3Rpb24gPSBIVENfU0VORF9GVUxMX0tFRVA7CisJbmV0aWZfc3RvcF9xdWV1ZShwQWRhcHRlci0+ZGV2KTsKKwlyZXR1cm4gYWN0aW9uOworfQorI2VuZGlmIC8qIEhJRl9TRElPICovCit2b2lkIGVwcGluZ190eF9jb21wbGV0ZV9tdWx0aXBsZSh2b2lkICpjdHgsIEhUQ19QQUNLRVRfUVVFVUUgKnBQYWNrZXRRdWV1ZSkKK3sKKwllcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eCA9IChlcHBpbmdfY29udGV4dF90ICopIGN0eDsKKwllcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlciA9IHBFcHBpbmdfY3R4LT5lcHBpbmdfYWRhcHRlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcEFkYXB0ZXItPmRldjsKKwlBX1NUQVRVUyBzdGF0dXM7CisJSFRDX0VORFBPSU5UX0lEIGVpZDsKKwljZGZfbmJ1Zl90IHBrdFNrYjsKKwlzdHJ1Y3QgZXBwaW5nX2Nvb2tpZSAqY29va2llOworCUFfQk9PTCBmbHVzaGluZyA9IGZhbHNlOworCWNkZl9uYnVmX3F1ZXVlX3Qgc2tiX3F1ZXVlOworCUhUQ19QQUNLRVQgKmh0Y19wa3Q7CisKKwljZGZfbmJ1Zl9xdWV1ZV9pbml0KCZza2JfcXVldWUpOworCisJY2RmX3NwaW5fbG9ja19iaCgmcEFkYXB0ZXItPmRhdGFfbG9jayk7CisKKwl3aGlsZSAoIUhUQ19RVUVVRV9FTVBUWShwUGFja2V0UXVldWUpKSB7CisJCWh0Y19wa3QgPSBodGNfcGFja2V0X2RlcXVldWUocFBhY2tldFF1ZXVlKTsKKwkJaWYgKGh0Y19wa3QgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBodGNfcGt0LT5TdGF0dXM7CisJCWVpZCA9IGh0Y19wa3QtPkVuZHBvaW50OworCQlwa3RTa2IgPSBHRVRfSFRDX1BBQ0tFVF9ORVRfQlVGX0NPTlRFWFQoaHRjX3BrdCk7CisJCWNvb2tpZSA9IGh0Y19wa3QtPnBQa3RDb250ZXh0OworCisJCUFTU0VSVChwa3RTa2IpOworCQlBU1NFUlQoaHRjX3BrdC0+cEJ1ZmZlciA9PSBjZGZfbmJ1Zl9kYXRhKHBrdFNrYikpOworCisJCS8qIGFkZCB0aGlzIHRvIHRoZSBsaXN0LCB1c2UgZmFzdGVyIG5vbi1sb2NrIEFQSSAqLworCQljZGZfbmJ1Zl9xdWV1ZV9hZGQoJnNrYl9xdWV1ZSwgcGt0U2tiKTsKKworCQlpZiAoQV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCUFTU0VSVChodGNfcGt0LT5BY3R1YWxMZW5ndGggPT0gY2RmX25idWZfbGVuKHBrdFNrYikpOworCQl9CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCQkgICAiJXMgc2tiPSVwIGRhdGE9JXAgbGVuPTB4JXggZWlkPSVkICIsCisJCQkgICBfX2Z1bmNfXywgcGt0U2tiLCBodGNfcGt0LT5wQnVmZmVyLAorCQkJICAgaHRjX3BrdC0+QWN0dWFsTGVuZ3RoLCBlaWQpOworCisJCWlmIChBX0ZBSUxFRChzdGF0dXMpKSB7CisJCQlpZiAoc3RhdHVzID09IEFfRUNBTkNFTEVEKSB7CisJCQkJLyogYSBwYWNrZXQgd2FzIGZsdXNoZWQgICovCisJCQkJZmx1c2hpbmcgPSB0cnVlOworCQkJfQorCQkJaWYgKHN0YXR1cyAhPSBBX05PX1JFU09VUkNFKSB7CisJCQkJcHJpbnRrKCIlcygpIC1UWCBFUlJPUiwgc3RhdHVzOiAweCV4XG4iLAorCQkJCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0lORk8sICIlczogT0tcbiIsIF9fZnVuY19fKTsKKwkJCWZsdXNoaW5nID0gZmFsc2U7CisJCX0KKworCQllcHBpbmdfZnJlZV9jb29raWUocEFkYXB0ZXItPnBFcHBpbmdfY3R4LCBjb29raWUpOworCX0KKworCWNkZl9zcGluX3VubG9ja19iaCgmcEFkYXB0ZXItPmRhdGFfbG9jayk7CisKKwkvKiBmcmVlIGFsbCBza2JzIGluIG91ciBsb2NhbCBsaXN0ICovCisJd2hpbGUgKGNkZl9uYnVmX3F1ZXVlX2xlbigmc2tiX3F1ZXVlKSkgeworCQkvKiB1c2Ugbm9uLWxvY2sgdmVyc2lvbiAqLworCQlwa3RTa2IgPSBjZGZfbmJ1Zl9xdWV1ZV9yZW1vdmUoJnNrYl9xdWV1ZSk7CisJCWlmIChwa3RTa2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQljZGZfbmJ1Zl9mcmVlKHBrdFNrYik7CisJCXBFcHBpbmdfY3R4LT50b3RhbF90eF9hY2tzKys7CisJfQorCisJaWYgKCFmbHVzaGluZykgeworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9lcHBpbmcvc3JjL2VwcGluZ190eHJ4LmMgYi9jb3JlL3V0aWxzL2VwcGluZy9zcmMvZXBwaW5nX3R4cnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBkNDNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS91dGlscy9lcHBpbmcvc3JjL2VwcGluZ190eHJ4LmMKQEAgLTAsMCArMSw0NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFxmaWxlICBlcHBpbmdfbWFpbi5jCisKKyAgIFxicmllZiBXTEFOIEVuZCBQb2ludCBQaW5nIHRlc3QgdG9vbCBpbXBsZW1lbnRhdGlvbgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBJbmNsdWRlIEZpbGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPGNkc19hcGkuaD4KKyNpbmNsdWRlIDxjZHNfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8d25pX2FwaS5oPgorI2luY2x1ZGUgPHdsYW5fcHR0X3NvY2tfc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKyNpZiBkZWZpbmVkKE1TTV9QTEFURk9STSkgJiYgZGVmaW5lZChISUZfUENJKQorI2luY2x1ZGUgPG5ldC9jbnNzLmg+CisjZW5kaWYgLyogTVNNX1BMQVRGT1JNICovCisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlICJlcHBpbmdfbWFpbi5oIgorI2luY2x1ZGUgImVwcGluZ19pbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IGVwcGluZ19zdGFydF9hZGFwdGVyKGVwcGluZ19hZGFwdGVyX3QgKnBBZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGVwcGluZ19zdG9wX2FkYXB0ZXIoZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCitzdGF0aWMgdm9pZCBlcHBpbmdfdGltZXJfZXhwaXJlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IG5ldGRldiA9IE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlwQWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKHBBZGFwdGVyID09IE5VTEwpIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IGFkYXB0ZXIgPSBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXBBZGFwdGVyLT5lcHBpbmdfdGltZXJfc3RhdGUgPSBFUFBJTkdfVFhfVElNRVJfU1RPUFBFRDsKKwllcHBpbmdfdHhfdGltZXJfZXhwaXJlKHBBZGFwdGVyKTsKK30KKworc3RhdGljIGludCBlcHBpbmdfbmRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlwQWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJZXBwaW5nX3N0YXJ0X2FkYXB0ZXIocEFkYXB0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXBwaW5nX25kZXZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVwcGluZ19hZGFwdGVyX3QgKnBBZGFwdGVyOworCWludCByZXQgPSAwOworCisJcEFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgIiVzOiBFUFBJTkcgYWRhcHRlciBjb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZW5kOworCX0KKwllcHBpbmdfc3RvcF9hZGFwdGVyKHBBZGFwdGVyKTsKK2VuZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlcHBpbmdfbmRldl91bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlcjsKKworCXBBZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogRVBQSU5HIGFkYXB0ZXIgY29udGV4dCBpcyBOdWxsIiwgX19mdW5jX18pOworCQlnb3RvIGVuZDsKKwl9CisJZXBwaW5nX3N0b3BfYWRhcHRlcihwQWRhcHRlcik7CitlbmQ6CisJcmV0dXJuOworfQorCit2b2lkIGVwcGluZ190eF9xdWV1ZV90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisKKwlwQWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKE5VTEwgPT0gcEFkYXB0ZXIpIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IEVQUElORyBhZGFwdGVyIGNvbnRleHQgaXMgTnVsbCIsIF9fZnVuY19fKTsKKwkJZ290byBlbmQ7CisJfQorCisJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCSAgICIlczogVHJhbnNtaXNzaW9uIHRpbWVvdXQgb2NjdXJyZWQsIHBBZGFwdGVyLT5zdGFydGVkPSAlZCIsCisJCSAgIF9fZnVuY19fLCBwQWRhcHRlci0+c3RhcnRlZCk7CisKKwkvKiBHZXR0aW5nIGhlcmUgaW1wbGllcyB3ZSBkaXNhYmxlZCB0aGUgVFggcXVldWVzCisJICogZm9yIHRvbyBsb25nLiBTaW5jZSB0aGlzIGlzIGVwcGluZworCSAqIChub3QgYmVjYXVzZSBvZiBkaXNhc3NvY2lhdGlvbiBvciBsb3cgcmVzb3VyY2Ugc2NlbmFyaW9zKSwKKwkgKiB0cnkgdG8gcmVzdGFydCB0aGUgcXVldWUKKwkgKi8KKwlpZiAocEFkYXB0ZXItPnN0YXJ0ZWQpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK2VuZDoKKwlyZXR1cm47CisKK30KKworaW50IGVwcGluZ19oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKworCXBBZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogRVBQSU5HIGFkYXB0ZXIgY29udGV4dCBpcyBOdWxsIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVuZDsKKwl9CisJcmV0ID0gZXBwaW5nX3R4X3NlbmQoc2tiLCBwQWRhcHRlcik7CitlbmQ6CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVwcGluZ19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoTlVMTCA9PSBwQWRhcHRlcikgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBwQWRhcHRlciA9IE5VTEwiLAorCQkJICAgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gJnBBZGFwdGVyLT5zdGF0czsKK30KKworaW50IGVwcGluZ19uZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWVwcGluZ19hZGFwdGVyX3QgKnBBZGFwdGVyOworCWludCByZXQgPSAwOworCisJcEFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmIChOVUxMID09IHBBZGFwdGVyKSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgIiVzOiBFUFBJTkcgYWRhcHRlciBjb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZW5kOworCX0KKwlpZiAoZGV2ICE9IHBBZGFwdGVyLT5kZXYpIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IEhERCBhZGFwdGVyL2RldiBpbmNvbnNpc3RlbmN5IiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoKCFpZnIpIHx8ICghaWZyLT5pZnJfZGF0YSkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIChTSU9DREVWUFJJVkFURSArIDEpOgorCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgICIlczogZG8gbm90IHN1cHBvcnQgaW9jdGwgJWQgKFNJT0NERVZQUklWQVRFICsgMSkiLAorCQkJICAgX19mdW5jX18sIGNtZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHVua25vd24gaW9jdGwgJWQiLAorCQkJICAgX19mdW5jX18sIGNtZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworZW5kOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXBwaW5nX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCWVwcGluZ19hZGFwdGVyX3QgKnBBZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnBzdGFfbWFjX2FkZHIgPSBhZGRyOworCWNkZl9tZW1fY29weSgmcEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LAorCQkgICAgIHBzdGFfbWFjX2FkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwljZGZfbWVtX2NvcHkoZGV2LT5kZXZfYWRkciwgcHN0YV9tYWNfYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlcHBpbmdfc3RvcF9hZGFwdGVyKGVwcGluZ19hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWlmIChwQWRhcHRlciAmJiBwQWRhcHRlci0+c3RhcnRlZCkgeworCQlFUFBJTkdfTE9HKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCQluZXRpZl90eF9kaXNhYmxlKHBBZGFwdGVyLT5kZXYpOworCQluZXRpZl9jYXJyaWVyX29mZihwQWRhcHRlci0+ZGV2KTsKKwkJcEFkYXB0ZXItPnN0YXJ0ZWQgPSBmYWxzZTsKKyNpZiBkZWZpbmVkKE1TTV9QTEFURk9STSkgJiYgZGVmaW5lZChISUZfUENJKSAmJiBkZWZpbmVkKENPTkZJR19DTlNTKQorCQljbnNzX3JlcXVlc3RfYnVzX2JhbmR3aWR0aChDTlNTX0JVU19XSURUSF9MT1cpOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgaW50IGVwcGluZ19zdGFydF9hZGFwdGVyKGVwcGluZ19hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWlmICghcEFkYXB0ZXIpIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IHBBZGFwdGVyPSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCFwQWRhcHRlci0+c3RhcnRlZCkgeworI2lmIGRlZmluZWQoTVNNX1BMQVRGT1JNKSAmJiBkZWZpbmVkKEhJRl9QQ0kpICYmIGRlZmluZWQoQ09ORklHX0NOU1MpCisJCWNuc3NfcmVxdWVzdF9idXNfYmFuZHdpZHRoKENOU1NfQlVTX1dJRFRIX0hJR0gpOworI2VuZGlmCisJCW5ldGlmX2NhcnJpZXJfb24ocEFkYXB0ZXItPmRldik7CisJCUVQUElOR19MT0coTE9HMSwgRkwoIkVuYWJsaW5nIHF1ZXVlcyIpKTsKKwkJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhwQWRhcHRlci0+ZGV2KTsKKwkJcEFkYXB0ZXItPnN0YXJ0ZWQgPSB0cnVlOworCX0gZWxzZSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkgICAiJXM6IHBBZGFwdGVyICVwIGFscmVhZHkgc3RhcnRlZFxuIiwgX19mdW5jX18sCisJCQkgICBwQWRhcHRlcik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVwcGluZ19yZWdpc3Rlcl9hZGFwdGVyKGVwcGluZ19hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworCWludCByZXQgPSAwOworCisJaWYgKChyZXQgPSByZWdpc3Rlcl9uZXRkZXYocEFkYXB0ZXItPmRldikpICE9IDApIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IHVuYWJsZSB0byByZWdpc3RlciBkZXZpY2VcbiIsCisJCQkgICBwQWRhcHRlci0+ZGV2LT5uYW1lKTsKKwl9IGVsc2UgeworCQlwQWRhcHRlci0+cmVnaXN0ZXJlZCA9IHRydWU7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVwcGluZ191bnJlZ2lzdGVyX2FkYXB0ZXIoZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisJaWYgKHBBZGFwdGVyKSB7CisJCWVwcGluZ19zdG9wX2FkYXB0ZXIocEFkYXB0ZXIpOworCQlpZiAocEFkYXB0ZXItPnJlZ2lzdGVyZWQpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KHBBZGFwdGVyLT5kZXYpOworCQkJcEFkYXB0ZXItPnJlZ2lzdGVyZWQgPSBmYWxzZTsKKwkJfQorCX0gZWxzZSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgIiVzOiBwQWRhcHRlciA9IE5VTEwsIHVuYWJsZSB0byB1bnJlZ2lzdGVyIGRldmljZVxuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwl9Cit9CisKK3ZvaWQgZXBwaW5nX2Rlc3Ryb3lfYWRhcHRlcihlcHBpbmdfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwllcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eDsKKworCWlmICghcEFkYXB0ZXIgfHwgIXBBZGFwdGVyLT5wRXBwaW5nX2N0eCkgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICIlczogcEFkYXB0ZXIgPSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlkZXYgPSBwQWRhcHRlci0+ZGV2OworCXBFcHBpbmdfY3R4ID0gcEFkYXB0ZXItPnBFcHBpbmdfY3R4OworCWVwcGluZ191bnJlZ2lzdGVyX2FkYXB0ZXIocEFkYXB0ZXIpOworCisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJnBBZGFwdGVyLT5kYXRhX2xvY2spOworCWNkZl9zb2Z0aXJxX3RpbWVyX2ZyZWUoJnBBZGFwdGVyLT5lcHBpbmdfdGltZXIpOworCXBBZGFwdGVyLT5lcHBpbmdfdGltZXJfc3RhdGUgPSBFUFBJTkdfVFhfVElNRVJfU1RPUFBFRDsKKworCXdoaWxlIChjZGZfbmJ1Zl9xdWV1ZV9sZW4oJnBBZGFwdGVyLT5ub2Ryb3BfcXVldWUpKSB7CisJCWNkZl9uYnVmX3QgdG1wX25idWYgPSBOVUxMOworCQl0bXBfbmJ1ZiA9IGNkZl9uYnVmX3F1ZXVlX3JlbW92ZSgmcEFkYXB0ZXItPm5vZHJvcF9xdWV1ZSk7CisJCWlmICh0bXBfbmJ1ZikKKwkJCWNkZl9uYnVmX2ZyZWUodG1wX25idWYpOworCX0KKworCWZyZWVfbmV0ZGV2KGRldik7CisJaWYgKCFwRXBwaW5nX2N0eCkKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IHBFcHBpbmdfY3R4ID0gTlVMTFxuIiwgX19mdW5jX18pOworCWVsc2UKKwkJcEVwcGluZ19jdHgtPmVwcGluZ19hZGFwdGVyID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBlcHBpbmdfZHJ2X29wcyA9IHsKKwkubmRvX29wZW4gPSBlcHBpbmdfbmRldl9vcGVuLAorCS5uZG9fc3RvcCA9IGVwcGluZ19uZGV2X3N0b3AsCisJLm5kb191bmluaXQgPSBlcHBpbmdfbmRldl91bmluaXQsCisJLm5kb19zdGFydF94bWl0ID0gZXBwaW5nX2hhcmRfc3RhcnRfeG1pdCwKKwkubmRvX3R4X3RpbWVvdXQgPSBlcHBpbmdfdHhfcXVldWVfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cyA9IGVwcGluZ19nZXRfc3RhdHMsCisJLm5kb19kb19pb2N0bCA9IGVwcGluZ19uZGV2X2lvY3RsLAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gZXBwaW5nX3NldF9tYWNfYWRkcmVzcywKKwkubmRvX3NlbGVjdF9xdWV1ZSA9IE5VTEwsCit9OworCisjZGVmaW5lIEVQUElOR19UWF9RVUVVRV9NQVhfTEVOIDEyOCAgICAgLyogbmVlZCB0byBiZSBwb3dlciBvZiAyICovCisKK2VwcGluZ19hZGFwdGVyX3QgKmVwcGluZ19hZGRfYWRhcHRlcihlcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eCwKKwkJCQkgICAgIHRTaXJNYWNBZGRyIG1hY0FkZHIsCisJCQkJICAgICB0Q0RGX0NPTl9NT0RFIGRldmljZV9tb2RlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJZXBwaW5nX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKGVwcGluZ19hZGFwdGVyX3QpLCAid2lmaSVkIiwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDE3LCAwKSkKKwkJCSAgIE5FVF9OQU1FX1VOS05PV04sCisjZW5kaWYKKwkJCSAgIGV0aGVyX3NldHVwKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiJXM6IENhbm5vdCBhbGxvY2F0ZSBlcHBpbmdfYWRhcHRlcl90XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBBZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljZGZfbWVtX3plcm8ocEFkYXB0ZXIsIHNpemVvZigqcEFkYXB0ZXIpKTsKKwlwQWRhcHRlci0+ZGV2ID0gZGV2OworCXBBZGFwdGVyLT5wRXBwaW5nX2N0eCA9IHBFcHBpbmdfY3R4OworCXBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9IGRldmljZV9tb2RlOyAgICAvKiBzdGF0aW9uLCBTQVAsIGV0YyAqLworCWNkZl9tZW1fY29weShkZXYtPmRldl9hZGRyLCAodm9pZCAqKW1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCWNkZl9tZW1fY29weShwQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsCisJCSAgICAgbWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJY2RmX3NwaW5sb2NrX2luaXQoJnBBZGFwdGVyLT5kYXRhX2xvY2spOworCWNkZl9uYnVmX3F1ZXVlX2luaXQoJnBBZGFwdGVyLT5ub2Ryb3BfcXVldWUpOworCXBBZGFwdGVyLT5lcHBpbmdfdGltZXJfc3RhdGUgPSBFUFBJTkdfVFhfVElNRVJfU1RPUFBFRDsKKwljZGZfc29mdGlycV90aW1lcl9pbml0KGVwcGluZ19nZXRfY2RmX2N0eCgpLCAmcEFkYXB0ZXItPmVwcGluZ190aW1lciwKKwkJZXBwaW5nX3RpbWVyX2V4cGlyZSwgZGV2LCBDREZfVElNRVJfVFlQRV9TVyk7CisJZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMTsKKwlkZXYtPm5ldGRldl9vcHMgPSAmZXBwaW5nX2Rydl9vcHM7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUgKiBIWjsgICAvKiBYWFggKi8KKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IEVQUElOR19UWEJVRiAtIDE7ICAgICAgLyogMSBmb3IgbWdtdCBmcmFtZSAqLworCWlmIChlcHBpbmdfcmVnaXN0ZXJfYWRhcHRlcihwQWRhcHRlcikgPT0gMCkgeworCQlFUFBJTkdfTE9HKExPRzEsIEZMKCJEaXNhYmxpbmcgcXVldWVzIikpOworCQluZXRpZl90eF9kaXNhYmxlKGRldik7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCXJldHVybiBwQWRhcHRlcjsKKwl9IGVsc2UgeworCQllcHBpbmdfZGVzdHJveV9hZGFwdGVyKHBBZGFwdGVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitpbnQgZXBwaW5nX2Nvbm5lY3Rfc2VydmljZShlcHBpbmdfY29udGV4dF90ICpwRXBwaW5nX2N0eCkKK3sKKwlpbnQgc3RhdHVzLCBpOworCUhUQ19TRVJWSUNFX0NPTk5FQ1RfUkVRIGNvbm5lY3Q7CisJSFRDX1NFUlZJQ0VfQ09OTkVDVF9SRVNQIHJlc3BvbnNlOworCisJY2RmX21lbV96ZXJvKCZjb25uZWN0LCBzaXplb2YoY29ubmVjdCkpOworCWNkZl9tZW1femVybygmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCisJLyogdGhlc2UgZmllbGRzIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHNlcnZpY2UgZW5kcG9pbnRzICovCisJY29ubmVjdC5FcENhbGxiYWNrcy5wQ29udGV4dCA9IHBFcHBpbmdfY3R4OworCWNvbm5lY3QuRXBDYWxsYmFja3MuRXBUeENvbXBsZXRlTXVsdGlwbGUgPSBlcHBpbmdfdHhfY29tcGxldGVfbXVsdGlwbGU7CisJY29ubmVjdC5FcENhbGxiYWNrcy5FcFJlY3YgPSBlcHBpbmdfcng7CisJLyogZXBwaW5nX3R4X2NvbXBsZXRlIHVzZSBNdWx0aXBsZSB2ZXJzaW9uICovCisJY29ubmVjdC5FcENhbGxiYWNrcy5FcFR4Q29tcGxldGUgPSBOVUxMOworCWNvbm5lY3QuTWF4U2VuZFF1ZXVlRGVwdGggPSA2NDsKKworI2lmZGVmIEhJRl9TRElPCisJY29ubmVjdC5FcENhbGxiYWNrcy5FcFJlY3ZSZWZpbGwgPSBlcHBpbmdfcmVmaWxsOworCWNvbm5lY3QuRXBDYWxsYmFja3MuRXBTZW5kRnVsbCA9CisJCWVwcGluZ190eF9xdWV1ZV9mdWxsIC8qIGFyNjAwMF90eF9xdWV1ZV9mdWxsICovOworI2VsaWYgZGVmaW5lZChISUZfVVNCKSB8fCBkZWZpbmVkKEhJRl9QQ0kpCisJY29ubmVjdC5FcENhbGxiYWNrcy5FcFJlY3ZSZWZpbGwgPSBOVUxMIC8qIHByb3ZpZGVkIGJ5IEhJRiAqLzsKKwljb25uZWN0LkVwQ2FsbGJhY2tzLkVwU2VuZEZ1bGwgPSBOVUxMIC8qIHByb3ZpZGVkIGJ5IEhJRiAqLzsKKwkvKiBkaXNhYmxlIGZsb3cgY29udHJvbCBmb3IgaHcgZmxvdyBjb250cm9sICovCisJY29ubmVjdC5Db25uZWN0aW9uRmxhZ3MgfD0gSFRDX0NPTk5FQ1RfRkxBR1NfRElTQUJMRV9DUkVESVRfRkxPV19DVFJMOworI2VuZGlmCisKKwkvKiBjb25uZWN0IHRvIHNlcnZpY2UgKi8KKwljb25uZWN0LlNlcnZpY2VJRCA9IFdNSV9EQVRBX0JFX1NWQzsKKwlzdGF0dXMgPSBodGNfY29ubmVjdF9zZXJ2aWNlKHBFcHBpbmdfY3R4LT5IVENIYW5kbGUsICZjb25uZWN0LCAmcmVzcG9uc2UpOworCWlmIChzdGF0dXMgIT0gRU9LKSB7CisJCUVQUElOR19MT0coQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLAorCQkJICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIEVuZHBvaW50IFBpbmcgQkUgc2VydmljZSBzdGF0dXM6JWQgXG4iLAorCQkJICAgc3RhdHVzKTsKKwkJcmV0dXJuIC0xOzsKKwl9IGVsc2UgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICJlcHBpbmd0ZXN0IEJFIGVuZHBvaW50OiVkXG4iLCByZXNwb25zZS5FbmRwb2ludCk7CisJfQorCXBFcHBpbmdfY3R4LT5FcHBpbmdFbmRwb2ludFswXSA9IHJlc3BvbnNlLkVuZHBvaW50OworCisjaWYgZGVmaW5lZChISUZfUENJKSB8fCBkZWZpbmVkKEhJRl9VU0IpCisJY29ubmVjdC5TZXJ2aWNlSUQgPSBXTUlfREFUQV9CS19TVkM7CisJc3RhdHVzID0gaHRjX2Nvbm5lY3Rfc2VydmljZShwRXBwaW5nX2N0eC0+SFRDSGFuZGxlLCAmY29ubmVjdCwgJnJlc3BvbnNlKTsKKwlpZiAoc3RhdHVzICE9IEVPSykgeworCQlFUFBJTkdfTE9HKENERl9UUkFDRV9MRVZFTF9GQVRBTCwKKwkJCSAgICJGYWlsZWQgdG8gY29ubmVjdCB0byBFbmRwb2ludCBQaW5nIEJLIHNlcnZpY2Ugc3RhdHVzOiVkIFxuIiwKKwkJCSAgIHN0YXR1cyk7CisJCXJldHVybiAtMTs7CisJfSBlbHNlIHsKKwkJRVBQSU5HX0xPRyhDREZfVFJBQ0VfTEVWRUxfRkFUQUwsCisJCQkgICAiZXBwaW5ndGVzdCBCSyBlbmRwb2ludDolZFxuIiwgcmVzcG9uc2UuRW5kcG9pbnQpOworCX0KKwlwRXBwaW5nX2N0eC0+RXBwaW5nRW5kcG9pbnRbMV0gPSByZXNwb25zZS5FbmRwb2ludDsKKwkvKiBTaW5jZSB3ZSBkbyBub3QgY3JlYXRlIG90aGVyIHR3byBTVkMgdXNlIEJLIGVuZHBvaW50CisJICogZm9yIHJlc3QgQUNzICgyLCAzKSAqLworCWZvciAoaSA9IDI7IGkgPCBFUFBJTkdfTUFYX05VTV9FUElEUzsgaSsrKSB7CisJCXBFcHBpbmdfY3R4LT5FcHBpbmdFbmRwb2ludFtpXSA9IHJlc3BvbnNlLkVuZHBvaW50OworCX0KKyNlbHNlCisJLyogd2Ugb25seSB1c2Ugb25lIGVuZHBvaW50IGZvciBoaWdoIGxhdGVuYW5jZSBidXMuCisJICogTWFwIGFsbCBBQydzIEVQSURzIHRvIHRoZSBzYW1lIGVuZHBvaW50IElEIHJldHVybmVkIGJ5IEhUQyAqLworCWZvciAoaSA9IDA7IGkgPCBFUFBJTkdfTUFYX05VTV9FUElEUzsgaSsrKSB7CisJCXBFcHBpbmdfY3R4LT5FcHBpbmdFbmRwb2ludFtpXSA9IHJlc3BvbnNlLkVuZHBvaW50OworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9md2xvZy9kYmdsb2dfaG9zdC5jIGIvY29yZS91dGlscy9md2xvZy9kYmdsb2dfaG9zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MmM2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL2Z3bG9nL2RiZ2xvZ19ob3N0LmMKQEAgLTAsMCArMSw0NDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKiBIb3N0IERlYnVnIGxvZyBpbXBsZW1lbnRhdGlvbiAqLworCisjaW5jbHVkZSAiYXRoZGVmcy5oIgorI2luY2x1ZGUgImFfdHlwZXMuaCIKKyNpbmNsdWRlICJkYmdsb2dfaG9zdC5oIgorI2luY2x1ZGUgIndtaS5oIgorI2luY2x1ZGUgIndtaV91bmlmaWVkX2FwaS5oIgorI2luY2x1ZGUgIndtYS5oIgorI2luY2x1ZGUgIm9sX2RlZmluZXMuaCIKKyNpbmNsdWRlIDx3bGFuX25saW5rX3Nydi5oPgorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2V2ZW50LmgiCisjaW5jbHVkZSAicXdsYW5fdmVyc2lvbi5oIgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2lmZGVmIFdMQU5fT1BFTl9TT1VSQ0UKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjZW5kaWYgLyogV0xBTl9PUEVOX1NPVVJDRSAqLworI2luY2x1ZGUgIndtaV91bmlmaWVkX3ByaXYuaCIKKworI2RlZmluZSBDTERfREVCVUdGU19ESVIgICAgICAgICAgImNsZCIKKyNkZWZpbmUgREVCVUdGU19CTE9DS19OQU1FICAgICAgICJkYmdsb2dfYmxvY2siCisKKyNkZWZpbmUgQVRIX01PRFVMRV9OQU1FIGZ3bG9nCisjaW5jbHVkZSA8YV9kZWJ1Zy5oPgorI2RlZmluZSBGV0xPR19ERUJVRyAgIEFUSF9ERUJVR19NQUtFX01PRFVMRV9NQVNLKDApCisKKyNpZiBkZWZpbmVkKERFQlVHKQorCitzdGF0aWMgYm9vbCBhcHBzdGFydGVkID0gZmFsc2U7CitzdGF0aWMgYm9vbCBzZW5kZHJpdmVyc3RhdHVzID0gZmFsc2U7CitzdGF0aWMgYm9vbCBrZF9ubF9pbml0ID0gZmFsc2U7CitzdGF0aWMgaW50IGNuc3NfZGlhZ19waWQgPSBJTlZBTElEX1BJRDsKK3N0YXRpYyBpbnQgZ2V0X3ZlcnNpb24gPSAwOworc3RhdGljIGludCBncHJpbnRfbGltaXRlciA9IDA7CisKK3N0YXRpYyBBVEhfREVCVUdfTUFTS19ERVNDUklQVElPTiBnX2Z3bG9nX2RlYnVnX2Rlc2NyaXB0aW9uW10gPSB7CisJe0ZXTE9HX0RFQlVHLCAiZndsb2cifSwKK307CisKK0FUSF9ERUJVR19JTlNUQU5USUFURV9NT0RVTEVfVkFSKGZ3bG9nLAorCQkJCSAiZndsb2ciLAorCQkJCSAiRmlybXdhcmUgRGVidWcgTG9nIiwKKwkJCQkgQVRIX0RFQlVHX01BU0tfREVGQVVMVFMgfCBBVEhfREVCVUdfSU5GTyB8CisJCQkJIEFUSF9ERUJVR19FUlIsCisJCQkJIEFUSF9ERUJVR19ERVNDUklQVElPTl9DT1VOVAorCQkJCQkgKGdfZndsb2dfZGVidWdfZGVzY3JpcHRpb24pLAorCQkJCSBnX2Z3bG9nX2RlYnVnX2Rlc2NyaXB0aW9uKTsKKyNlbmRpZgorCittb2R1bGVfZGJnX3ByaW50IG1vZF9wcmludFtXTEFOX01PRFVMRV9JRF9NQVhdOworCitBX1VJTlQzMiBkYmdsb2dfcHJvY2Vzc190eXBlID0gREJHTE9HX1BST0NFU1NfTkVUX1JBVzsKKworQV9TVEFUVVMKK3dtaV9jb25maWdfZGVidWdfbW9kdWxlX2NtZCh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIEFfVUlOVDMyIHBhcmFtLAorCQkJICAgIEFfVUlOVDMyIHZhbCwgQV9VSU5UMzIgKm1vZHVsZV9pZF9iaXRtYXAsCisJCQkgICAgQV9VSU5UMzIgYml0bWFwX2xlbik7CisKK2NvbnN0IGNoYXIgKmRiZ2xvZ19nZXRfbW9kdWxlX3N0cihBX1VJTlQzMiBtb2R1bGVfaWQpCit7CisJc3dpdGNoIChtb2R1bGVfaWQpIHsKKwljYXNlIFdMQU5fTU9EVUxFX0lORjoKKwkJcmV0dXJuICJJTkYiOworCWNhc2UgV0xBTl9NT0RVTEVfV01JOgorCQlyZXR1cm4gIldNSSI7CisJY2FzZSBXTEFOX01PRFVMRV9TVEFfUFdSU0FWRToKKwkJcmV0dXJuICJTVEEgUFMiOworCWNhc2UgV0xBTl9NT0RVTEVfV0hBTDoKKwkJcmV0dXJuICJXSEFMIjsKKwljYXNlIFdMQU5fTU9EVUxFX0NPRVg6CisJCXJldHVybiAiQ09FWCI7CisJY2FzZSBXTEFOX01PRFVMRV9ST0FNOgorCQlyZXR1cm4gIlJPQU0iOworCWNhc2UgV0xBTl9NT0RVTEVfUkVTTUdSX0NIQU5fTUFOQUdFUjoKKwkJcmV0dXJuICJDSEFOTUdSIjsKKwljYXNlIFdMQU5fTU9EVUxFX1JFU01HUjoKKwkJcmV0dXJuICJSRVNNR1IiOworCWNhc2UgV0xBTl9NT0RVTEVfVkRFVl9NR1I6CisJCXJldHVybiAiVkRFViI7CisJY2FzZSBXTEFOX01PRFVMRV9TQ0FOOgorCQlyZXR1cm4gIlNDQU4iOworCWNhc2UgV0xBTl9NT0RVTEVfUkFURUNUUkw6CisJCXJldHVybiAiUkMiOworCWNhc2UgV0xBTl9NT0RVTEVfQVBfUFdSU0FWRToKKwkJcmV0dXJuICJBUCBQUyI7CisJY2FzZSBXTEFOX01PRFVMRV9CTE9DS0FDSzoKKwkJcmV0dXJuICJCQSI7CisJY2FzZSBXTEFOX01PRFVMRV9NR01UX1RYUlg6CisJCXJldHVybiAiTUdNVCI7CisJY2FzZSBXTEFOX01PRFVMRV9EQVRBX1RYUlg6CisJCXJldHVybiAiREFUQSI7CisJY2FzZSBXTEFOX01PRFVMRV9IVFQ6CisJCXJldHVybiAiSFRUIjsKKwljYXNlIFdMQU5fTU9EVUxFX0hPU1Q6CisJCXJldHVybiAiSE9TVCI7CisJY2FzZSBXTEFOX01PRFVMRV9CRUFDT046CisJCXJldHVybiAiQkVBQ09OIjsKKwljYXNlIFdMQU5fTU9EVUxFX09GRkxPQUQ6CisJCXJldHVybiAiT0ZGTE9BRCI7CisJY2FzZSBXTEFOX01PRFVMRV9XQUw6CisJCXJldHVybiAiV0FMIjsKKwljYXNlIFdBTF9NT0RVTEVfREU6CisJCXJldHVybiAiREUiOworCWNhc2UgV0xBTl9NT0RVTEVfUENJRUxQOgorCQlyZXR1cm4gIlBDSUVMUCI7CisJY2FzZSBXTEFOX01PRFVMRV9SVFQ6CisJCXJldHVybiAiUlRUIjsKKwljYXNlIFdMQU5fTU9EVUxFX0RDUzoKKwkJcmV0dXJuICJEQ1MiOworCWNhc2UgV0xBTl9NT0RVTEVfQ0FDSEVNR1I6CisJCXJldHVybiAiQ0FDSEVNR1IiOworCWNhc2UgV0xBTl9NT0RVTEVfQU5JOgorCQlyZXR1cm4gIkFOSSI7CisJY2FzZSBXTEFOX01PRFVMRV9URVNUOgorCQlyZXR1cm4gIlRFU1RQT0lOVCI7CisJY2FzZSBXTEFOX01PRFVMRV9TVEFfU01QUzoKKwkJcmV0dXJuICJTVEFfU01QUyI7CisJY2FzZSBXTEFOX01PRFVMRV9URExTOgorCQlyZXR1cm4gIlRETFMiOworCWNhc2UgV0xBTl9NT0RVTEVfUDJQOgorCQlyZXR1cm4gIlAyUCI7CisJY2FzZSBXTEFOX01PRFVMRV9XT1c6CisJCXJldHVybiAiV29XIjsKKwljYXNlIFdMQU5fTU9EVUxFX0lCU1NfUFdSU0FWRToKKwkJcmV0dXJuICJJQlNTIFBTIjsKKwljYXNlIFdMQU5fTU9EVUxFX0VYVFNDQU46CisJCXJldHVybiAiRXh0U2NhbiI7CisJY2FzZSBXTEFOX01PRFVMRV9VTklUX1RFU1Q6CisJCXJldHVybiAiVU5JVF9URVNUIjsKKwljYXNlIFdMQU5fTU9EVUxFX01MTUU6CisJCXJldHVybiAiTUxNRSI7CisJY2FzZSBXTEFOX01PRFVMRV9TVVBQTDoKKwkJcmV0dXJuICJTVVBQTElDQU5UIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCX0KK30KKworY2hhciAqREJHX01TR19BUlJbV0xBTl9NT0RVTEVfSURfTUFYXVtNQVhfREJHX01TR1NdID0geworCXsKKwkJIklORl9NU0dfU1RBUlQiLAorCQkiSU5GX0FTU0VSVElPTl9GQUlMRUQiLAorCQkiSU5GX1RBUkdFVF9JRCIsCisJCSJJTkZfTVNHX0VORCIKKwl9LAorCXsKKwkJIldNSV9EQkdJRF9ERUZJTklUSU9OX1NUQVJUIiwKKwkJIldNSV9DTURfUlhfWFRORF9QS1RfVE9PX1NIT1JUIiwKKwkJIldNSV9FWFRFTkRFRF9DTURfTk9UX0hBTkRMRUQiLAorCQkiV01JX0NNRF9SWF9QS1RfVE9PX1NIT1JUIiwKKwkJIldNSV9DQUxMSU5HX1dNSV9FWFRFTlNJT05fRk4iLAorCQkiV01JX0NNRF9OT1RfSEFORExFRCIsCisJCSJXTUlfSU5fU1lOQyIsCisJCSJXTUlfVEFSR0VUX1dNSV9TWU5DX0NNRCIsCisJCSJXTUlfU0VUX1NOUl9USFJFU0hPTERfUEFSQU1TIiwKKwkJIldNSV9TRVRfUlNTSV9USFJFU0hPTERfUEFSQU1TIiwKKwkJIldNSV9TRVRfTFFfVFJFU0hPTERfUEFSQU1TIiwKKwkJIldNSV9UQVJHRVRfQ1JFQVRFX1BTVFJFQU1fQ01EIiwKKwkJIldNSV9XSV9EVE1fSU5VU0UiLAorCQkiV01JX1RBUkdFVF9ERUxFVEVfUFNUUkVBTV9DTUQiLAorCQkiV01JX1RBUkdFVF9JTVBMSUNJVF9ERUxFVEVfUFNUUkVBTV9DTUQiLAorCQkiV01JX1RBUkdFVF9HRVRfQklUX1JBVEVfQ01EIiwKKwkJIldNSV9HRVRfUkFURV9NQVNLX0NNRF9GSVhfUkFURV9NQVNLX0lTIiwKKwkJIldNSV9UQVJHRVRfR0VUX0FWQUlMQUJMRV9DSEFOTkVMU19DTUQiLAorCQkiV01JX1RBUkdFVF9HRVRfVFhfUFdSX0NNRCIsCisJCSJXTUlfRlJFRV9FVkJVRl9XTUlCVUYiLAorCQkiV01JX0ZSRUVfRVZCVUZfREFUQUJVRiIsCisJCSJXTUlfRlJFRV9FVkJVRl9CQURGTEFHIiwKKwkJIldNSV9IVENfUlhfRVJST1JfREFUQV9QQUNLRVQiLAorCQkiV01JX0hUQ19SWF9TWU5DX1BBVVNJTkdfRk9SX01CT1giLAorCQkiV01JX0lOQ09SUkVDVF9XTUlfREFUQV9IRFJfRFJPUFBJTkdfUEtUIiwKKwkJIldNSV9TRU5ESU5HX1JFQURZX0VWRU5UIiwKKwkJIldNSV9TRVRQT1dFUl9NRE9FX1RPX01BWFBFUkYiLAorCQkiV01JX1NFVFBPV0VSX01ET0VfVE9fUkVDIiwKKwkJIldNSV9CU1NJTkZPX0VWRU5UX0ZST00iLAorCQkiV01JX1RBUkdFVF9HRVRfU1RBVFNfQ01EIiwKKwkJIldNSV9TRU5ESU5HX1NDQU5fQ09NUExFVEVfRVZFTlQiLAorCQkiV01JX1NFTkRJTkdfUlNTSV9JTkRCX1RIUkVTSE9MRF9FVkVOVCAiLAorCQkiV01JX1NFTkRJTkdfUlNTSV9JTkRCTV9USFJFU0hPTERfRVZFTlQiLAorCQkiV01JX1NFTkRJTkdfTElOS19RVUFMSVRZX1RIUkVTSE9MRF9FVkVOVCIsCisJCSJXTUlfU0VORElOR19FUlJPUl9SRVBPUlRfRVZFTlQiLAorCQkiV01JX1NFTkRJTkdfQ0FDX0VWRU5UIiwKKwkJIldNSV9UQVJHRVRfR0VUX1JPQU1fVEFCTEVfQ01EIiwKKwkJIldNSV9UQVJHRVRfR0VUX1JPQU1fREFUQV9DTUQiLAorCQkiV01JX1NFTkRJTkdfR1BJT19JTlRSX0VWRU5UIiwKKwkJIldNSV9TRU5ESU5HX0dQSU9fQUNLX0VWRU5UIiwKKwkJIldNSV9TRU5ESU5HX0dQSU9fREFUQV9FVkVOVCIsCisJCSJXTUlfQ01EX1JYIiwKKwkJIldNSV9DTURfUlhfWFRORCIsCisJCSJXTUlfRVZFTlRfU0VORCIsCisJCSJXTUlfRVZFTlRfU0VORF9YVE5EIiwKKwkJIldNSV9DTURfUEFSQU1TX0RVTVBfU1RBUlQiLAorCQkiV01JX0NNRF9QQVJBTVNfRFVNUF9FTkQiLAorCQkiV01JX0NNRF9QQVJBTVMiLAorCQkiV01JX0VWRU5UX0FMTE9DX0ZBSUxVUkUiLAorCQkiV01JX0RCR0lEX0RDU19QQVJBTV9DTUQiLAorCQkiV01JX1NFTkRfRVZFTlRfV1JPTkdfVExWIiwKKwkJIldNSV9TRU5EX0VWRU5UX05PX1RMVl9ERUYiLAorCQkiV01JX0RCR0lEX0RFRk5JVElPTl9FTkQiLAorCX0sCisJeworCQkiUFNfU1RBX0RFRklOSVRJT05fU1RBUlQiLAorCQkiUFNfU1RBX1BNX0FSQl9SRVFVRVNUIiwKKwkJIlBTX1NUQV9ERUxJVkVSX0VWRU5UIiwKKwkJIlBTX1NUQV9QU1BPTExfU0VRX0RPTkUiLAorCQkiUFNfU1RBX0NPRVhfTU9ERSIsCisJCSJQU19TVEFfUFNQT0xMX0FMTE9XIiwKKwkJIlBTX1NUQV9TRVRfUEFSQU0iLAorCQkiUFNfU1RBX1NQRUNQT0xMX1RJTUVSX1NUQVJURUQiLAorCQkiUFNfU1RBX1NQRUNQT0xMX1RJTUVSX1NUT1BQRUQiLAorCX0sCisJeworCQkiV0hBTF9EQkdJRF9ERUZJTklUSU9OX1NUQVJUIiwKKwkJIldIQUxfRVJST1JfQU5JX0NPTlRST0wiLAorCQkiV0hBTF9FUlJPUl9DSElQX1RFU1QxIiwKKwkJIldIQUxfRVJST1JfQ0hJUF9URVNUMiIsCisJCSJXSEFMX0VSUk9SX0VFUFJPTV9DSEVDS1NVTSIsCisJCSJXSEFMX0VSUk9SX0VFUFJPTV9NQUNBRERSIiwKKwkJIldIQUxfRVJST1JfSU5URVJSVVBUX0hJVSIsCisJCSJXSEFMX0VSUk9SX0tFWUNBQ0hFX1JFU0VUIiwKKwkJIldIQUxfRVJST1JfS0VZQ0FDSEVfU0VUIiwKKwkJIldIQUxfRVJST1JfS0VZQ0FDSEVfVFlQRSIsCisJCSJXSEFMX0VSUk9SX0tFWUNBQ0hFX1RLSVBFTlRSWSIsCisJCSJXSEFMX0VSUk9SX0tFWUNBQ0hFX1dFUExFTkdUSCIsCisJCSJXSEFMX0VSUk9SX1BIWV9JTlZBTElEX0NIQU5ORUwiLAorCQkiV0hBTF9FUlJPUl9QT1dFUl9BV0FLRSIsCisJCSJXSEFMX0VSUk9SX1BPV0VSX1NFVCIsCisJCSJXSEFMX0VSUk9SX1JFQ1ZfU1RPUERNQSIsCisJCSJXSEFMX0VSUk9SX1JFQ1ZfU1RPUFBDVSIsCisJCSJXSEFMX0VSUk9SX1JFU0VUX0NIQU5ORjEiLAorCQkiV0hBTF9FUlJPUl9SRVNFVF9DSEFOTkYyIiwKKwkJIldIQUxfRVJST1JfUkVTRVRfUE0iLAorCQkiV0hBTF9FUlJPUl9SRVNFVF9PRkZTRVRDQUwiLAorCQkiV0hBTF9FUlJPUl9SRVNFVF9SRkdSQU5UIiwKKwkJIldIQUxfRVJST1JfUkVTRVRfUlhGUkFNRSIsCisJCSJXSEFMX0VSUk9SX1JFU0VUX1NUT1BETUEiLAorCQkiV0hBTF9FUlJPUl9SRVNFVF9FUlJJRCIsCisJCSJXSEFMX0VSUk9SX1JFU0VUX0FEQ0RDQ0FMMSIsCisJCSJXSEFMX0VSUk9SX1JFU0VUX0FEQ0RDQ0FMMiIsCisJCSJXSEFMX0VSUk9SX1JFU0VUX1RYSVFDQUwiLAorCQkiV0hBTF9FUlJPUl9SRVNFVF9SWElRQ0FMIiwKKwkJIldIQUxfRVJST1JfUkVTRVRfQ0FSUklFUkxFQUsiLAorCQkiV0hBTF9FUlJPUl9YTUlUX0NPTVBVVEUiLAorCQkiV0hBTF9FUlJPUl9YTUlUX05PUVVFVUUiLAorCQkiV0hBTF9FUlJPUl9YTUlUX0FDVElWRVFVRVVFIiwKKwkJIldIQUxfRVJST1JfWE1JVF9CQURUWVBFIiwKKwkJIldIQUxfRVJST1JfWE1JVF9TVE9QRE1BIiwKKwkJIldIQUxfRVJST1JfSU5URVJSVVBUX0JCX1BBTklDIiwKKwkJIldIQUxfRVJST1JfUEFQUkRfTUFYR0FJTl9BQk9WRV9XSU5ET1ciLAorCQkiV0hBTF9FUlJPUl9RQ1VfSFdfUEFVU0VfTUlTTUFUQ0giLAorCQkiV0hBTF9EQkdJRF9ERUZJTklUSU9OX0VORCIsCisJfSwKKwl7CisJCSJDT0VYX0RFQlVHSURfU1RBUlQiLAorCQkiQlRDT0VYX0RCR19NQ0lfMSIsCisJCSJCVENPRVhfREJHX01DSV8yIiwKKwkJIkJUQ09FWF9EQkdfTUNJXzMiLAorCQkiQlRDT0VYX0RCR19NQ0lfNCIsCisJCSJCVENPRVhfREJHX01DSV81IiwKKwkJIkJUQ09FWF9EQkdfTUNJXzYiLAorCQkiQlRDT0VYX0RCR19NQ0lfNyIsCisJCSJCVENPRVhfREJHX01DSV84IiwKKwkJIkJUQ09FWF9EQkdfTUNJXzkiLAorCQkiQlRDT0VYX0RCR19NQ0lfMTAiLAorCQkiQ09FWF9XQUxfQlRDT0VYX0lOSVQiLAorCQkiQ09FWF9XQUxfUEFVU0UiLAorCQkiQ09FWF9XQUxfUkVTVU1FIiwKKwkJIkNPRVhfVVBEQVRFX0FGSCIsCisJCSJDT0VYX0hXUV9FTVBUWV9DQiIsCisJCSJDT0VYX01DSV9USU1FUl9IQU5ETEVSIiwKKwkJIkNPRVhfTUNJX1JFQ09WRVIiLAorCQkiRVJST1JfQ09FWF9NQ0lfSVNSIiwKKwkJIkVSUk9SX0NPRVhfTUNJX0dQTSIsCisJCSJDT0VYX1Byb2ZpbGVUeXBlIiwKKwkJIkNPRVhfTGlua0lEIiwKKwkJIkNPRVhfTGlua1N0YXRlIiwKKwkJIkNPRVhfTGlua1JvbGUiLAorCQkiQ09FWF9MaW5rUmF0ZSIsCisJCSJDT0VYX1ZvaWNlVHlwZSIsCisJCSJDT0VYX1RJbnRlcnZhbCIsCisJCSJDT0VYX1dSZXRyeCIsCisJCSJDT0VYX0F0dGVtcHRzIiwKKwkJIkNPRVhfUGVyZm9ybWFuY2VTdGF0ZSIsCisJCSJDT0VYX0xpbmtUeXBlIiwKKwkJIkNPRVhfUlhfTUNJX0dQTV9WRVJTSU9OX1FVRVJZIiwKKwkJIkNPRVhfUlhfTUNJX0dQTV9WRVJTSU9OX1JFU1BPTlNFIiwKKwkJIkNPRVhfUlhfTUNJX0dQTV9TVEFUVVNfUVVFUlkiLAorCQkiQ09FWF9TVEFURV9XTEFOX1ZERVZfRE9XTiIsCisJCSJDT0VYX1NUQVRFX1dMQU5fVkRFVl9TVEFSVCIsCisJCSJDT0VYX1NUQVRFX1dMQU5fVkRFVl9DT05ORUNURUQiLAorCQkiQ09FWF9TVEFURV9XTEFOX1ZERVZfU0NBTl9TVEFSVEVEIiwKKwkJIkNPRVhfU1RBVEVfV0xBTl9WREVWX1NDQU5fRU5EIiwKKwkJIkNPRVhfU1RBVEVfV0xBTl9ERUZBVUxUIiwKKwkJIkNPRVhfQ0hBTk5FTF9DSEFOR0UiLAorCQkiQ09FWF9QT1dFUl9DSEFOR0UiLAorCQkiQ09FWF9DT05GSUdfTUdSIiwKKwkJIkNPRVhfVFhfTUNJX0dQTV9CVF9DQUxfUkVRIiwKKwkJIkNPRVhfVFhfTUNJX0dQTV9CVF9DQUxfR1JBTlQiLAorCQkiQ09FWF9UWF9NQ0lfR1BNX0JUX0NBTF9ET05FIiwKKwkJIkNPRVhfVFhfTUNJX0dQTV9XTEFOX0NBTF9SRVEiLAorCQkiQ09FWF9UWF9NQ0lfR1BNX1dMQU5fQ0FMX0dSQU5UIiwKKwkJIkNPRVhfVFhfTUNJX0dQTV9XTEFOX0NBTF9ET05FIiwKKwkJIkNPRVhfVFhfTUNJX0dQTV9CVF9ERUJVRyIsCisJCSJDT0VYX1RYX01DSV9HUE1fVkVSU0lPTl9RVUVSWSIsCisJCSJDT0VYX1RYX01DSV9HUE1fVkVSU0lPTl9SRVNQT05TRSIsCisJCSJDT0VYX1RYX01DSV9HUE1fU1RBVFVTX1FVRVJZIiwKKwkJIkNPRVhfVFhfTUNJX0dQTV9IQUxUX0JUX0dQTSIsCisJCSJDT0VYX1RYX01DSV9HUE1fV0xBTl9DSEFOTkVMUyIsCisJCSJDT0VYX1RYX01DSV9HUE1fQlRfUFJPRklMRV9JTkZPIiwKKwkJIkNPRVhfVFhfTUNJX0dQTV9CVF9TVEFUVVNfVVBEQVRFIiwKKwkJIkNPRVhfVFhfTUNJX0dQTV9CVF9VUERBVEVfRkxBR1MiLAorCQkiQ09FWF9UWF9NQ0lfR1BNX1VOS05PV04iLAorCQkiQ09FWF9UWF9NQ0lfU1lTX1dBS0lORyIsCisJCSJDT0VYX1RYX01DSV9MTkFfVEFLRSIsCisJCSJDT0VYX1RYX01DSV9MTkFfVFJBTlMiLAorCQkiQ09FWF9UWF9NQ0lfU1lTX1NMRUVQSU5HIiwKKwkJIkNPRVhfVFhfTUNJX1JFUV9XQUtFIiwKKwkJIkNPRVhfVFhfTUNJX1JFTU9URV9SRVNFVCIsCisJCSJDT0VYX1RYX01DSV9UWVBFX1VOS05PV04iLAorCQkiQ09FWF9XSEFMX01DSV9SRVNFVCIsCisJCSJDT0VYX1BPTExfQlRfQ0FMX0RPTkVfVElNRU9VVCIsCisJCSJDT0VYX1dIQUxfUEFVU0UiLAorCQkiQ09FWF9SWF9NQ0lfR1BNX0JUX0NBTF9SRVEiLAorCQkiQ09FWF9SWF9NQ0lfR1BNX0JUX0NBTF9ET05FIiwKKwkJIkNPRVhfUlhfTUNJX0dQTV9CVF9DQUxfR1JBTlQiLAorCQkiQ09FWF9XTEFOX0NBTF9TVEFSVCIsCisJCSJDT0VYX1dMQU5fQ0FMX1JFU1VMVCIsCisJCSJDT0VYX0J0TWNpU3RhdGUiLAorCQkiQ09FWF9CdENhbFN0YXRlIiwKKwkJIkNPRVhfV2xhbkNhbFN0YXRlIiwKKwkJIkNPRVhfUnhSZXFXYWtlQ291bnQiLAorCQkiQ09FWF9SeFJlbW90ZVJlc2V0Q291bnQiLAorCQkiQ09FWF9SRVNUQVJUX0NBTCIsCisJCSJDT0VYX1NFTkRNU0dfUVVFVUUiLAorCQkiQ09FWF9SRVNFVFNFUV9MTkFJTkZPX1RJTUVPVVQiLAorCQkiQ09FWF9NQ0lfSVNSX0ludFJhdyIsCisJCSJDT0VYX01DSV9JU1JfSW50MVJhdyIsCisJCSJDT0VYX01DSV9JU1JfUnhNc2dSYXciLAorCQkiQ09FWF9XSEFMX0NPRVhfUkVTRVQiLAorCQkiQ09FWF9XQUxfQ09FWF9JTklUIiwKKwkJIkNPRVhfVFhSWF9DTlRfTElNSVRfSVNSIiwKKwkJIkNPRVhfQ0hfQlVTWSIsCisJCSJDT0VYX1JFQVNTRVNTX1dMQU5fU1RBVEUiLAorCQkiQ09FWF9CVENPRVhfV0xBTl9TVEFURV9VUERBVEUiLAorCQkiQ09FWF9CVF9OVU1fT0ZfUFJPRklMRVMiLAorCQkiQ09FWF9CVF9OVU1fT0ZfSElEX1BST0ZJTEVTIiwKKwkJIkNPRVhfQlRfTlVNX09GX0FDTF9QUk9GSUxFUyIsCisJCSJDT0VYX0JUX05VTV9PRl9ISV9BQ0xfUFJPRklMRVMiLAorCQkiQ09FWF9CVF9OVU1fT0ZfVk9JQ0VfUFJPRklMRVMiLAorCQkiQ09FWF9XTEFOX0FHR1JfTElNSVQiLAorCQkiQ09FWF9CVF9MT1dfUFJJT19CVURHRVQiLAorCQkiQ09FWF9CVF9ISV9QUklPX0JVREdFVCIsCisJCSJDT0VYX0JUX0lETEVfVElNRSIsCisJCSJDT0VYX1NFVF9DT0VYX1dFSUdIVCIsCisJCSJDT0VYX1dMQU5fV0VJR0hUX0dST1VQIiwKKwkJIkNPRVhfQlRfV0VJR0hUX0dST1VQIiwKKwkJIkNPRVhfQlRfSU5URVJWQUxfQUxMT0MiLAorCQkiQ09FWF9CVF9TQ0hFTUUiLAorCQkiQ09FWF9CVF9NR1IiLAorCQkiQ09FWF9CVF9TTV9FUlJPUiIsCisJCSJDT0VYX1NZU1RFTV9VUERBVEUiLAorCQkiQ09FWF9MT1dfUFJJT19MSU1JVCIsCisJCSJDT0VYX0hJX1BSSU9fTElNSVQiLAorCQkiQ09FWF9CVF9JTlRFUlZBTF9TVEFSVCIsCisJCSJDT0VYX1dMQU5fSU5URVJWQUxfU1RBUlQiLAorCQkiQ09FWF9OT05fTElOS19CVURHRVQiLAorCQkiQ09FWF9DT05URU5USU9OX01TRyIsCisJCSJDT0VYX1NFVF9OU1MiLAorCQkiQ09FWF9TRUxGX0dFTl9NQVNLIiwKKwkJIkNPRVhfUFJPRklMRV9FUlJPUiIsCisJCSJDT0VYX1dMQU5fSU5JVCIsCisJCSJDT0VYX0JFQUNPTl9NSVNTIiwKKwkJIkNPRVhfQkVBQ09OX09LIiwKKwkJIkNPRVhfQlRDT0VYX1NDQU5fQUNUSVZJVFkiLAorCQkiQ09FWF9TQ0FOX0FDVElWSVRZIiwKKwkJIkNPRVhfRk9SQ0VfUVVJRVRUSU1FIiwKKwkJIkNPRVhfQlRfTUdSX1FVSUVUVElNRSIsCisJCSJDT0VYX0JUX0lOQUNUSVZJVFlfVFJJR0dFUiIsCisJCSJDT0VYX0JUX0lOQUNUSVZJVFlfUkVQT1JURUQiLAorCQkiQ09FWF9UWF9NQ0lfR1BNX1dMQU5fUFJJTyIsCisJCSJDT0VYX1RYX01DSV9HUE1fQlRfUEFVU0VfUFJPRklMRSIsCisJCSJDT0VYX1RYX01DSV9HUE1fV0xBTl9TRVRfQUNMX0lOQUNUSVZJVFkiLAorCQkiQ09FWF9SWF9NQ0lfR1BNX0JUX0FDTF9JTkFDVElWSVRZX1JFUE9SVCIsCisJCSJDT0VYX0dFTkVSSUNfRVJST1IiLAorCQkiQ09FWF9SWF9SQVRFX1RIUkVTSE9MRCIsCisJCSJDT0VYX1JTU0kiLAorCQkiQ09FWF9XTEFOX1ZERVZfTk9USUZfU1RBUlQiLCAvKiAgICAgICAgICAgICAgICAgMTMzICovCisJCSJDT0VYX1dMQU5fVkRFVl9OT1RJRl9VUCIsIC8qICAgICAgICAgICAgICAgICAgICAxMzQgKi8KKwkJIkNPRVhfV0xBTl9WREVWX05PVElGX0RPV04iLCAvKiAgICAgICAgICAgICAgICAxMzUgKi8KKwkJIkNPRVhfV0xBTl9WREVWX05PVElGX1NUT1AiLCAvKiAgICAgICAgICAgICAgIDEzNiAqLworCQkiQ09FWF9XTEFOX1ZERVZfTk9USUZfQUREX1BFRVIiLCAvKiAgICAgICAgICAgMTM3ICovCisJCSJDT0VYX1dMQU5fVkRFVl9OT1RJRl9ERUxFVEVfUEVFUiIsIC8qICAgICAgICAgIDEzOCAqLworCQkiQ09FWF9XTEFOX1ZERVZfTk9USUZfQ09OTkVDVEVEX1BFRVIiLCAvKiAgICAgICAxMzkgKi8KKwkJIkNPRVhfV0xBTl9WREVWX05PVElGX1BBVVNFIiwgLyogICAgICAgICAgICAgICAxNDAgKi8KKwkJIkNPRVhfV0xBTl9WREVWX05PVElGX1VOUEFVU0VEIiwgLyogICAgICAgICAgIDE0MSAqLworCQkiQ09FWF9TVEFURV9XTEFOX1ZERVZfUEVFUl9BREQiLCAvKiAgICAgICAgICAgMTQyICovCisJCSJDT0VYX1NUQVRFX1dMQU5fVkRFVl9DT05ORUNURURfUEVFUiIsIC8qICAgICAxNDMgKi8KKwkJIkNPRVhfU1RBVEVfV0xBTl9WREVWX0RFTEVURV9QRUVSIiwgLyogICAgICAgICAgMTQ0ICovCisJCSJDT0VYX1NUQVRFX1dMQU5fVkRFVl9QQVVTRSIsIC8qICAgICAgICAgICAgICAgIDE0NSAqLworCQkiQ09FWF9TVEFURV9XTEFOX1ZERVZfVU5QQVVTRUQiLCAvKiAgICAgICAgICAgMTQ2ICovCisJCSJDT0VYX1NDQU5fQ0FMTEJBQ0siLCAvKiAgICAgICAgICAgICAgIDE0NyAqLworCQkiQ09FWF9SQ19TRVRfQ0hBSU5NQVNLIiwgLyogICAgICAgICAgICAxNDggKi8KKwkJIkNPRVhfVFhfTUNJX0dQTV9XTEFOX1NFVF9CVF9SWFNTX1RIUkVTIiwgLyogICAgMTQ5ICovCisJCSJDT0VYX1RYX01DSV9HUE1fQlRfUlhTU19USFJFU19RVUVSWSIsIC8qICAgIDE1MCAqLworCQkiQ09FWF9CVF9SWFNTX1RIUkVTIiwgLyogICAgICAgICAgICAgICAxNTEgKi8KKwkJIkNPRVhfQlRfUFJPRklMRV9BRERfUk1WIiwgLyogICAgICAgICAgMTUyICovCisJCSJDT0VYX0JUX1NDSEVEX0lORk8iLCAvKiAgICAgICAgICAgICAgIDE1MyAqLworCQkiQ09FWF9UUkZfTUdNVCIsIC8qICAgICAgICAgICAgICAgICAgICAxNTQgKi8KKwkJIkNPRVhfU0NIRURfU1RBUlQiLCAvKiAgICAgICAgICAgICAgICAgMTU1ICovCisJCSJDT0VYX1NDSEVEX1JFU1VMVCIsIC8qICAgICAgICAgICAgICAgIDE1NiAqLworCQkiQ09FWF9TQ0hFRF9FUlJPUiIsIC8qICAgICAgICAgICAgICAgICAgICAgIDE1NyAqLworCQkiQ09FWF9TQ0hFRF9QUkVfT1AiLCAvKiAgICAgICAgICAgICAgICAgICAgIDE1OCAqLworCQkiQ09FWF9TQ0hFRF9QT1NUX09QIiwgLyogICAgICAgICAgICAgICAgICAgIDE1OSAqLworCQkiQ09FWF9SWF9SQVRFIiwgLyogICAgICAgICAgICAgICAgICAgICAgICAgIDE2MCAqLworCQkiQ09FWF9BQ0tfUFJJT1JJVFkiLCAvKiAgICAgICAgICAgICAgICAgICAgIDE2MSAqLworCQkiQ09FWF9TVEFURV9XTEFOX1ZERVZfVVAiLCAvKiAgICAgICAgICAgICAgIDE2MiAqLworCQkiQ09FWF9TVEFURV9XTEFOX1ZERVZfUEVFUl9VUERBVEUiLCAvKiAgICAgIDE2MyAqLworCQkiQ09FWF9TVEFURV9XTEFOX1ZERVZfU1RPUCIsIC8qICAgICAgICAgICAgIDE2NCAqLworCQkiQ09FWF9XTEFOX1BBVVNFX1BFRVIiLCAvKiAgICAgICAgICAgICAgICAgIDE2NSAqLworCQkiQ09FWF9XTEFOX1VOUEFVU0VfUEVFUiIsIC8qICAgICAgICAgICAgICAgIDE2NiAqLworCQkiQ09FWF9XTEFOX1BBVVNFX0lOVEVSVkFMX1NUQVJUIiwgLyogICAgICAgIDE2NyAqLworCQkiQ09FWF9XTEFOX1BPU1RQQVVTRV9JTlRFUlZBTF9TVEFSVCIsIC8qICAgIDE2OCAqLworCQkiQ09FWF9UUkZfRlJFRVJVTiIsIC8qICAgICAgICAgICAgICAgICAgICAgIDE2OSAqLworCQkiQ09FWF9UUkZfU0hBUEVfUE0iLCAvKiAgICAgICAgICAgICAgICAgICAgIDE3MCAqLworCQkiQ09FWF9UUkZfU0hBUEVfUFNQIiwgLyogICAgICAgICAgICAgICAgICAgIDE3MSAqLworCQkiQ09FWF9UUkZfU0hBUEVfU19DVFMiLCAvKiAgICAgICAgICAgICAgICAgIDE3MiAqLworCQkiQ09FWF9DSEFJTl9DT05GSUciLCAvKiAgICAgICAgICAgICAgICAgICAxNzMgKi8KKwkJIkNPRVhfU1lTVEVNX01PTklUT1IiLCAvKiAgICAgICAgICAgICAgICAgMTc0ICovCisJCSJDT0VYX1NJTkdMRUNIQUlOX0lOSVQiLCAvKiAgICAgICAgICAgICAgIDE3NSAqLworCQkiQ09FWF9NVUxUSUNIQUlOX0lOSVQiLCAvKiAgICAgICAgICAgICAgICAxNzYgKi8KKwkJIkNPRVhfU0lOR0xFQ0hBSU5fREJHXzEiLCAvKiAgICAgICAgICAgICAgMTc3ICovCisJCSJDT0VYX1NJTkdMRUNIQUlOX0RCR18yIiwgLyogICAgICAgICAgICAgIDE3OCAqLworCQkiQ09FWF9TSU5HTEVDSEFJTl9EQkdfMyIsIC8qICAgICAgICAgICAgICAxNzkgKi8KKwkJIkNPRVhfTVVMVElDSEFJTl9EQkdfMSIsIC8qICAgICAgICAgICAgICAgMTgwICovCisJCSJDT0VYX01VTFRJQ0hBSU5fREJHXzIiLCAvKiAgICAgICAgICAgICAgIDE4MSAqLworCQkiQ09FWF9NVUxUSUNIQUlOX0RCR18zIiwgLyogICAgICAgICAgICAgICAxODIgKi8KKwkJIkNPRVhfUFNQX1RYX0NCIiwgLyogICAgICAgICAgICAgICAgICAgICAgIDE4MyAqLworCQkiQ09FWF9QU1BfUlhfQ0IiLCAvKiAgICAgICAgICAgICAgICAgICAgICAgMTg0ICovCisJCSJDT0VYX1BTUF9TVEFUXzEiLCAvKiAgICAgICAgICAgICAgICAgICAgICAgMTg1ICovCisJCSJDT0VYX1BTUF9TUEVDX1BPTEwiLCAvKiAgICAgICAgICAgICAgICAgICAgICAgMTg2ICovCisJCSJDT0VYX1BTUF9SRUFEWV9TVEFURSIsIC8qICAgICAgICAgICAgICAgICAgICAgICAxODcgKi8KKwkJIkNPRVhfUFNQX1RYX1NUQVRVU19TVEFURSIsIC8qICAgICAgICAgICAgICAgMTg4ICovCisJCSJDT0VYX1BTUF9SWF9TVEFUVVNfU1RBVEVfMSIsIC8qICAgICAgICAgICAgICAgMTg5ICovCisJCSJDT0VYX1BTUF9OT1RfUkVBRFlfU1RBVEUiLCAvKiAgICAgICAgICAgICAgIDE5MCAqLworCQkiQ09FWF9QU1BfRElTQUJMRURfU1RBVEUiLCAvKiAgICAgICAgICAgICAgIDE5MSAqLworCQkiQ09FWF9QU1BfRU5BQkxFRF9TVEFURSIsIC8qICAgICAgICAgICAgICAgMTkyICovCisJCSJDT0VYX1BTUF9TRU5EX1BTUE9MTCIsIC8qICAgICAgICAgICAgICAgICAgICAgICAxOTMgKi8KKwkJIkNPRVhfUFNQX01HUl9FTlRFUiIsIC8qICAgICAgICAgICAgICAgICAgICAgICAxOTQgKi8KKwkJIkNPRVhfUFNQX01HUl9SRVNVTFQiLCAvKiAgICAgICAgICAgICAgICAgICAgICAgMTk1ICovCisJCSJDT0VYX1BTUF9OT05XTEFOX0lOVEVSVkFMIiwgLyogICAgICAgICAgICAgICAxOTYgKi8KKwkJIkNPRVhfUFNQX1NUQVRfMiIsIC8qICAgICAgICAgICAgICAgICAgICAgICAxOTcgKi8KKwkJIkNPRVhfUFNQX1JYX1NUQVRVU19TVEFURV8yIiwgLyogICAgICAgICAgICAgICAxOTggKi8KKwkJIkNPRVhfUFNQX0VSUk9SIiwgLyogICAgICAgICAgICAgICAgICAgICAgIDE5OSAqLworCQkiQ09FWF9UMkJUIiwgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwICovCisJCSJDT0VYX0JUX0RVUkFUSU9OIiwgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAyMDEgKi8KKwkJIkNPRVhfVFhfTUNJX0dQTV9XTEFOX1NDSEVEX0lORk9fVFJJRyIsIC8qICAgICAgIDIwMiAqLworCQkiQ09FWF9UWF9NQ0lfR1BNX1dMQU5fU0NIRURfSU5GT19UUklHX1JTUCIsIC8qICAgMjAzICovCisJCSJDT0VYX1RYX01DSV9HUE1fU0NBTl9PUCIsIC8qICAgICAgICAgICAgICAgICAgIDIwNCAqLworCQkiQ09FWF9UWF9NQ0lfR1BNX0JUX1BBVVNFX0dQTV9UWCIsIC8qICAgICAgIDIwNSAqLworCQkiQ09FWF9DVFMyU19TRU5EIiwgLyogICAgICAgICAgICAgICAgICAgICAgIDIwNiAqLworCQkiQ09FWF9DVFMyU19SRVNVTFQiLCAvKiAgICAgICAgICAgICAgICAgICAgICAgMjA3ICovCisJCSJDT0VYX0VOVEVSX09DUyIsIC8qICAgICAgICAgICAgICAgICAgICAgICAyMDggKi8KKwkJIkNPRVhfRVhJVF9PQ1MiLCAvKiAgICAgICAgICAgICAgICAgICAgICAgMjA5ICovCisJCSJDT0VYX1VQREFURV9PQ1MiLCAvKiAgICAgICAgICAgICAgICAgICAgICAgMjEwICovCisJCSJDT0VYX1NUQVRVU19PQ1MiLCAvKiAgICAgICAgICAgICAgICAgICAgICAgMjExICovCisJCSJDT0VYX1NUQVRTX0JUIiwgLyogICAgICAgICAgICAgICAgICAgICAgIDIxMiAqLworCQkiQ09FWF9NV1NfV0xBTl9JTklUIiwKKwkJIkNPRVhfTVdTX1dCVE1SX1NZTkMiLAorCQkiQ09FWF9NV1NfVFlQRTJfUlgiLAorCQkiQ09FWF9NV1NfVFlQRTJfVFgiLAorCQkiQ09FWF9NV1NfV0xBTl9DSEFWRCIsCisJCSJDT0VYX01XU19XTEFOX0NIQVZEX0lOU0VSVCIsCisJCSJDT0VYX01XU19XTEFOX0NIQVZEX01FUkdFIiwKKwkJIkNPRVhfTVdTX1dMQU5fQ0hBVkRfUlBUIiwKKwkJIkNPRVhfTVdTX0NQX01TR19TRU5EIiwKKwkJIkNPRVhfTVdTX0NQX0VTQ0FQRSIsCisJCSJDT0VYX01XU19DUF9VTkZSQU1FIiwKKwkJIkNPRVhfTVdTX0NQX1NZTkNfVVBEQVRFIiwKKwkJIkNPRVhfTVdTX0NQX1NZTkMiLAorCQkiQ09FWF9NV1NfQ1BfV0xBTl9TVEFURV9JTkQiLAorCQkiQ09FWF9NV1NfQ1BfU1lOQ1JFU1BfVElNRU9VVCIsCisJCSJDT0VYX01XU19TQ0hFTUVfVVBEQVRFIiwKKwkJIkNPRVhfTVdTX1dMQU5fRVZFTlQiLAorCQkiQ09FWF9NV1NfVUFSVF9VTkVTQ0FQRSIsCisJCSJDT0VYX01XU19VQVJUX0VOQ09ERV9TRU5EIiwKKwkJIkNPRVhfTVdTX1VBUlRfUkVDVl9ERUNPREUiLAorCQkiQ09FWF9NV1NfVUxfSERMIiwKKwkJIkNPRVhfTVdTX1JFTU9URV9FVkVOVCIsCisJCSJDT0VYX01XU19PVEhFUiIsCisJCSJDT0VYX01XU19FUlJPUiIsCisJCSJDT0VYX01XU19BTlRfRElWRVJTSVRZIiwgLyogMjM3ICovCisJCSJDT0VYX1AyUF9HTyIsCisJCSJDT0VYX1AyUF9DTElFTlQiLAorCQkiQ09FWF9TQ0NfMSIsCisJCSJDT0VYX1NDQ18yIiwKKwkJIkNPRVhfTUNDXzEiLAorCQkiQ09FWF9NQ0NfMiIsCisJCSJDT0VYX1RSRl9TSEFQRV9OT0EiLAorCQkiQ09FWF9OT0FfT05FU0hPVCIsCisJCSJDT0VYX05PQV9QRVJJT0RJQyIsCisJCSJDT0VYX0xFXzEiLAorCQkiQ09FWF9MRV8yIiwKKwkJIkNPRVhfQU5UXzEiLAorCQkiQ09FWF9BTlRfMiIsCisJCSJDT0VYX0VOVEVSX05PQSIsCisJCSJDT0VYX0VYSVRfTk9BIiwKKwkJIkNPRVhfQlRfU0NBTl9QUk9URUNUIiwgLyogMjUzICovCisJCSJDT0VYX0RFQlVHX0lEX0VORCIgLyogMjU0ICovCisJfSwKKwl7CisJCSJST0FNX0RCR0lEX0RFRklOSVRJT05fU1RBUlQiLAorCQkiUk9BTV9NT0RVTEVfSU5JVCIsCisJCSJST0FNX0RFVl9TVEFSVCIsCisJCSJST0FNX0NPTkZJR19SU1NJX1RIUkVTSCIsCisJCSJST0FNX0NPTkZJR19TQ0FOX1BFUklPRCIsCisJCSJST0FNX0NPTkZJR19BUF9QUk9GSUxFIiwKKwkJIlJPQU1fQ09ORklHX0NIQU5fTElTVCIsCisJCSJST0FNX0NPTkZJR19TQ0FOX1BBUkFNUyIsCisJCSJST0FNX0NPTkZJR19SU1NJX0NIQU5HRSIsCisJCSJST0FNX1NDQU5fVElNRVJfU1RBUlQiLAorCQkiUk9BTV9TQ0FOX1RJTUVSX0VYUElSRSIsCisJCSJST0FNX1NDQU5fVElNRVJfU1RPUCIsCisJCSJST0FNX1NDQU5fU1RBUlRFRCIsCisJCSJST0FNX1NDQU5fQ09NUExFVEUiLAorCQkiUk9BTV9TQ0FOX0NBTkNFTExFRCIsCisJCSJST0FNX0NBTkRJREFURV9GT1VORCIsCisJCSJST0FNX1JTU0lfQUNUSVZFX1NDQU4iLAorCQkiUk9BTV9SU1NJX0FDVElWRV9ST0FNIiwKKwkJIlJPQU1fUlNTSV9HT09EIiwKKwkJIlJPQU1fQk1JU1NfRklSU1RfUkVDViIsCisJCSJST0FNX0RFVl9TVE9QIiwKKwkJIlJPQU1fRldfT0ZGTE9BRF9FTkFCTEUiLAorCQkiUk9BTV9DQU5ESURBVEVfU1NJRF9NQVRDSCIsCisJCSJST0FNX0NBTkRJREFURV9TRUNVUklUWV9NQVRDSCIsCisJCSJST0FNX0xPV19SU1NJX0lOVEVSUlVQVCIsCisJCSJST0FNX0hJR0hfUlNTSV9JTlRFUlJVUFQiLAorCQkiUk9BTV9TQ0FOX1JFUVVFU1RFRCIsCisJCSJST0FNX0JFVFRFUl9DQU5ESURBVEVfRk9VTkQiLAorCQkiUk9BTV9CRVRURVJfQVBfRVZFTlQiLAorCQkiUk9BTV9DQU5DRUxfTE9XX1BSSU9fU0NBTiIsCisJCSJST0FNX0ZJTkFMX0JNSVNTX1JFQ1ZEIiwKKwkJIlJPQU1fQ09ORklHX1NDQU5fTU9ERSIsCisJCSJST0FNX0JNSVNTX0ZJTkFMX1NDQU5fRU5BQkxFIiwKKwkJIlJPQU1fU1VJVEFCTEVfQVBfRVZFTlQiLAorCQkiUk9BTV9SU05fSUVfUEFSU0VfRVJST1IiLAorCQkiUk9BTV9XUEFfSUVfUEFSU0VfRVJST1IiLAorCQkiUk9BTV9TQ0FOX0NNRF9GUk9NX0hPU1QiLAorCQkiUk9BTV9IT19TT1JUX0NBTkRJREFURSIsCisJCSJST0FNX0hPX1NBVkVfQ0FORElEQVRFIiwKKwkJIlJPQU1fSE9fR0VUX0NBTkRJREFURSIsCisJCSJST0FNX0hPX09GRkxPQURfU0VUX1BBUkFNIiwKKwkJIlJPQU1fSE9fU00iLAorCQkiUk9BTV9IT19IVFRfU0FWRUQiLAorCQkiUk9BTV9IT19TWU5DX1NUQVJUIiwKKwkJIlJPQU1fSE9fU1RBUlQiLAorCQkiUk9BTV9IT19DT01QTEVURSIsCisJCSJST0FNX0hPX1NUT1AiLAorCQkiUk9BTV9IT19IVFRfRk9SV0FSRCIsCisJCSJST0FNX0RCR0lEX0RFRklOSVRJT05fRU5EIgorCX0sCisJeworCQkiUkVTTUdSX0NITUdSX0RFRklOSVRJT05fU1RBUlQiLAorCQkiUkVTTUdSX0NITUdSX1BBVVNFX0NPTVBMRVRFIiwKKwkJIlJFU01HUl9DSE1HUl9DSEFOTkVMX0NIQU5HRSIsCisJCSJSRVNNR1JfQ0hNR1JfUkVTVU1FX0NPTVBMRVRFIiwKKwkJIlJFU01HUl9DSE1HUl9WREVWX1BBVVNFIiwKKwkJIlJFU01HUl9DSE1HUl9WREVWX1VOUEFVU0UiLAorCQkiUkVTTUdSX0NITUdSX0NUUzJTX1RYX0NPTVAiLAorCQkiUkVTTUdSX0NITUdSX0NGRU5EX1RYX0NPTVAiLAorCQkiUkVTTUdSX0NITUdSX0RFRklOSVRJT05fRU5EIgorCX0sCisJeworCQkiUkVTTUdSX0RFRklOSVRJT05fU1RBUlQiLAorCQkiUkVTTUdSX09DU19BTExPQ1JBTV9TSVpFIiwKKwkJIlJFU01HUl9PQ1NfUkVTT1VSQ0VTIiwKKwkJIlJFU01HUl9MSU5LX0NSRUFURSIsCisJCSJSRVNNR1JfTElOS19ERUxFVEUiLAorCQkiUkVTTUdSX09DU19DSFJFUV9DUkVBVEUiLAorCQkiUkVTTUdSX09DU19DSFJFUV9ERUxFVEUiLAorCQkiUkVTTUdSX09DU19DSFJFUV9TVEFSVCIsCisJCSJSRVNNR1JfT0NTX0NIUkVRX1NUT1AiLAorCQkiUkVTTUdSX09DU19TQ0hFRFVMRVJfSU5WT0tFRCIsCisJCSJSRVNNR1JfT0NTX0NIUkVRX0dSQU5UIiwKKwkJIlJFU01HUl9PQ1NfQ0hSRVFfQ09NUExFVEUiLAorCQkiUkVTTUdSX09DU19ORVhUX1RTRlRJTUUiLAorCQkiUkVTTUdSX09DU19UU0ZfVElNRU9VVF9VUyIsCisJCSJSRVNNR1JfT0NTX0NVUlJfQ0FUX1dJTkRPVyIsCisJCSJSRVNNR1JfT0NTX0NVUlJfQ0FUX1dJTkRPV19SRVEiLAorCQkiUkVTTUdSX09DU19DVVJSX0NBVF9XSU5ET1dfVElNRVNMT1QiLAorCQkiUkVTTUdSX09DU19DSFJFUV9SRVNUQVJUIiwKKwkJIlJFU01HUl9PQ1NfQ0xFQU5VUF9DSF9BTExPQ0FUT1JTIiwKKwkJIlJFU01HUl9PQ1NfUFVSR0VfQ0hSRVEiLAorCQkiUkVTTUdSX09DU19DSF9BTExPQ0FUT1JfRlJFRSIsCisJCSJSRVNNR1JfT0NTX1JFQ09NUFVURV9TQ0hFRFVMRSIsCisJCSJSRVNNR1JfT0NTX05FV19DQVRfV0lORE9XX1JFUSIsCisJCSJSRVNNR1JfT0NTX05FV19DQVRfV0lORE9XX1RJTUVTTE9UIiwKKwkJIlJFU01HUl9PQ1NfQ1VSX0NIX0FMTE9DIiwKKwkJIlJFU01HUl9PQ1NfV0lOX0NIX0FMTE9DIiwKKwkJIlJFU01HUl9PQ1NfU0NIRURfQ0hfQ0hBTkdFIiwKKwkJIlJFU01HUl9PQ1NfQ09OU1RSVUNUX0NBVF9XSU4iLAorCQkiUkVTTUdSX09DU19DSFJFUV9QUkVFTVBURUQiLAorCQkiUkVTTUdSX09DU19DSF9TV0lUQ0hfUkVRIiwKKwkJIlJFU01HUl9PQ1NfQ0hBTk5FTF9TV0lUQ0hFRCIsCisJCSJSRVNNR1JfT0NTX0NMRUFOVVBfU1RBTEVfUkVRUyIsCisJCSJSRVNNR1JfT0NTX0NIUkVRX1VQREFURSIsCisJCSJSRVNNR1JfT0NTX1JFR19OT0FfTk9USUYiLAorCQkiUkVTTUdSX09DU19ERVJFR19OT0FfTk9USUYiLAorCQkiUkVTTUdSX09DU19HRU5fUEVSSU9ESUNfTk9BIiwKKwkJIlJFU01HUl9PQ1NfUkVDQUxfUVVPVEFTIiwKKwkJIlJFU01HUl9PQ1NfR1JBTlRFRF9RVU9UQV9TVEFUUyIsCisJCSJSRVNNR1JfT0NTX0FMTE9DQVRFRF9RVU9UQV9TVEFUUyIsCisJCSJSRVNNR1JfT0NTX1JFUV9RVU9UQV9TVEFUUyIsCisJCSJSRVNNR1JfT0NTX1RSQUNLSU5HX1RJTUVfRklSRUQiLAorCQkiUkVTTUdSX1ZDX0FSQklUUkFURV9BVFRSSUJVVEVTIiwKKwkJIlJFU01HUl9PQ1NfTEFURU5DWV9TVFJJQ1RfVElNRV9TTE9UIiwKKwkJIlJFU01HUl9PQ1NfQ1VSUl9UU0YiLAorCQkiUkVTTUdSX09DU19RVU9UQV9SRU0iLAorCQkiUkVTTUdSX09DU19MQVRFTkNZX0NBU0VfTk8iLAorCQkiUkVTTUdSX09DU19XSU5fQ0FUX0RVUiIsCisJCSJSRVNNR1JfVkNfVVBEQVRFX0NVUl9WQyIsCisJCSJSRVNNR1JfVkNfUkVHX1VOUkVHX0xJTksiLAorCQkiUkVTTUdSX1ZDX1BSSU5UX0xJTksiLAorCQkiUkVTTUdSX09DU19NSVNTX1RPTEVSQU5DRSIsCisJCSJSRVNNR1JfRFlOX1NDSF9BTExPQ1JBTV9TSVpFIiwKKwkJIlJFU01HUl9EWU5fU0NIX0VOQUJMRSIsCisJCSJSRVNNR1JfRFlOX1NDSF9BQ1RJVkUiLAorCQkiUkVTTUdSX0RZTl9TQ0hfQ0hfU1RBVFNfU1RBUlQiLAorCQkiUkVTTUdSX0RZTl9TQ0hfQ0hfU1hfU1RBVFMiLAorCQkiUkVTTUdSX0RZTl9TQ0hfVE9UX1VUSUxfUEVSIiwKKwkJIlJFU01HUl9EWU5fU0NIX0hPTUVfQ0hfUVVPVEEiLAorCQkiUkVTTUdSX09DU19SRUdfUkVDQUxfUVVPVEFfTk9USUYiLAorCQkiUkVTTUdSX09DU19ERVJFR19SRUNBTF9RVU9UQV9OT1RJRiIsCisJCSJSRVNNR1JfREVGSU5JVElPTl9FTkQiCisJfSwKKwl7CisJCSJWREVWX01HUl9ERUJJRF9ERUZJTklUSU9OX1NUQVJUIiwgLyogdmRldiBNZ3IgKi8KKwkJIlZERVZfTUdSX0ZJUlNUX0JFQUNPTl9NSVNTX0RFVEVDVEVEIiwKKwkJIlZERVZfTUdSX0ZJTkFMX0JFQUNPTl9NSVNTX0RFVEVDVEVEIiwKKwkJIlZERVZfTUdSX0JFQUNPTl9JTl9TWU5DIiwKKwkJIlZERVZfTUdSX0FQX0tFRVBBTElWRV9JRExFIiwKKwkJIlZERVZfTUdSX0FQX0tFRVBBTElWRV9JTkFDVElWRSIsCisJCSJWREVWX01HUl9BUF9LRUVQQUxJVkVfVU5SRVNQT05TSVZFIiwKKwkJIlZERVZfTUdSX0FQX1RCVFRfQ09ORklHIiwKKwkJIlZERVZfTUdSX0ZJUlNUX0JDTl9SRUNFSVZFRCIsCisJCSJWREVWX01HUl9WREVWX1NUQVJUIiwKKwkJIlZERVZfTUdSX1ZERVZfVVAiLAorCQkiVkRFVl9NR1JfUEVFUl9BVVRIT1JJWkVEIiwKKwkJIlZERVZfTUdSX09DU19IUF9MUF9SRVFfUE9TVEVEIiwKKwkJIlZERVZfTUdSX1ZERVZfU1RBUlRfT0NTX0hQX1JFUV9DT01QTEVURSIsCisJCSJWREVWX01HUl9WREVWX1NUQVJUX09DU19IUF9SRVFfU1RPUCIsCisJCSJWREVWX01HUl9IUF9TVEFSVF9USU1FIiwKKwkJIlZERVZfTUdSX1ZERVZfUEFVU0VfREVMQVlfVVBEQVRFIiwKKwkJIlZERVZfTUdSX1ZERVZfUEFVU0VfRkFJTCIsCisJCSJWREVWX01HUl9HRU5fUEVSSU9ESUNfTk9BIiwKKwkJIlZERVZfTUdSX09GRl9DSEFOX0dPX0NIX1JFUV9TRVRVUCIsCisJCSJWREVWX01HUl9ERUZJTklUSU9OX0VORCIsCisJfSwKKwl7CisJCSJTQ0FOX1NUQVJUX0NPTU1BTkRfRkFJTEVEIiwgLyogc2NhbiAqLworCQkiU0NBTl9TVE9QX0NPTU1BTkRfRkFJTEVEIiwKKwkJIlNDQU5fRVZFTlRfU0VORF9GQUlMRUQiLAorCQkiU0NBTl9FTkdJTkVfU1RBUlQiLAorCQkiU0NBTl9FTkdJTkVfQ0FOQ0VMX0NPTU1BTkQiLAorCQkiU0NBTl9FTkdJTkVfU1RPUF9EVUVfVE9fVElNRU9VVCIsCisJCSJTQ0FOX0VWRU5UX1NFTkRfVE9fSE9TVCIsCisJCSJTQ0FOX0ZXTE9HX0VWRU5UX0FERCIsCisJCSJTQ0FOX0ZXTE9HX0VWRU5UX1JFTSIsCisJCSJTQ0FOX0ZXTE9HX0VWRU5UX1BSRUVNUFRFRCIsCisJCSJTQ0FOX0ZXTE9HX0VWRU5UX1JFU1RBUlRFRCIsCisJCSJTQ0FOX0ZXTE9HX0VWRU5UX0NPTVBMRVRFRCIsCisJfSwKKwl7CisJCSJSQVRFQ1RSTF9EQkdJRF9ERUZJTklUSU9OX1NUQVJUIiwgLyogUmF0ZSBjdHJsICovCisJCSJSQVRFQ1RSTF9EQkdJRF9BU1NPQyIsCisJCSJSQVRFQ1RSTF9EQkdJRF9OU1NfQ0hBTkdFIiwKKwkJIlJBVEVDVFJMX0RCR0lEX0NIQUlOTUFTS19FUlIiLAorCQkiUkFURUNUUkxfREJHSURfVU5FWFBFQ1RFRF9GUkFNRSIsCisJCSJSQVRFQ1RSTF9EQkdJRF9XQUxfUkNRVUVSWSIsCisJCSJSQVRFQ1RSTF9EQkdJRF9XQUxfUkNVUERBVEUiLAorCQkiUkFURUNUUkxfREJHSURfR1RYX1VQREFURSIsCisJCSJSQVRFQ1RSTF9EQkdJRF9ERUZJTklUSU9OX0VORCIKKwl9LAorCXsKKwkJIkFQX1BTX0RCR0lEX0RFRklOSVRJT05fU1RBUlQiLAorCQkiQVBfUFNfREJHSURfVVBEQVRFX1RJTSIsCisJCSJBUF9QU19EQkdJRF9QRUVSX1NUQVRFX0NIQU5HRSIsCisJCSJBUF9QU19EQkdJRF9QU1BPTEwiLAorCQkiQVBfUFNfREJHSURfUEVFUl9DUkVBVEUiLAorCQkiQVBfUFNfREJHSURfUEVFUl9ERUxFVEUiLAorCQkiQVBfUFNfREJHSURfVkRFVl9DUkVBVEUiLAorCQkiQVBfUFNfREJHSURfVkRFVl9ERUxFVEUiLAorCQkiQVBfUFNfREJHSURfU1lOQ19USU0iLAorCQkiQVBfUFNfREJHSURfTkVYVF9SRVNQT05TRSIsCisJCSJBUF9QU19EQkdJRF9TVEFSVF9TUCIsCisJCSJBUF9QU19EQkdJRF9DT01QTEVURURfRU9TUCIsCisJCSJBUF9QU19EQkdJRF9UUklHR0VSIiwKKwkJIkFQX1BTX0RCR0lEX0RVUExJQ0FURV9UUklHR0VSIiwKKwkJIkFQX1BTX0RCR0lEX1VBUFNEX1JFU1BPTlNFIiwKKwkJIkFQX1BTX0RCR0lEX1NFTkRfQ09NUExFVEUiLAorCQkiQVBfUFNfREJHSURfU0VORF9OX0NPTVBMRVRFIiwKKwkJIkFQX1BTX0RCR0lEX0RFVEVDVF9PVVRfT0ZfU1lOQ19TVEEiLAorCQkiQVBfUFNfREJHSURfREVMSVZFUl9DQUIiLAorCX0sCisJeworCQkiIiAgICAgICAgICAgICAgLyogQmxvY2sgQWNrICovCisJfSwKKwkvKiBNZ210IFR4UnggKi8KKwl7CisJCSJNR01UX1RYUlhfREJHSURfREVGSU5JVElPTl9TVEFSVCIsCisJCSJNR01UX1RYUlhfRk9SV0FSRF9UT19IT1NUIiwKKwkJIk1HTVRfVFhSWF9EQkdJRF9ERUZJTklUSU9OX0VORCIsCisJfSwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIFR4UnggKi8KKwkJIkRBVEFfVFhSWF9EQkdJRF9ERUZJTklUSU9OX1NUQVJUIiwKKwkJIkRBVEFfVFhSWF9EQkdJRF9SWF9EQVRBX1NFUV9MRU5fSU5GTyIsCisJCSJEQVRBX1RYUlhfREJHSURfREVGSU5JVElPTl9FTkQiLAorCX0sCisJeyIiICAgICAgICAgICAgICAgICAgICAgLyogSFRUICovCisJfSwKKwl7IiIgICAgICAgICAgICAgICAgICAgICAvKiBIT1NUICovCisJfSwKKwl7IiIgICAgICAgICAgICAgICAgICAgICAvKiBCRUFDT04gKi8KKwkgIkJFQUNPTl9FVkVOVF9TV0JBX1NFTkRfRkFJTEVEIiwKKwkgIkJFQUNPTl9FVkVOVF9FQVJMWV9SWF9CTUlTU19TVEFUVVMiLAorCSAiQkVBQ09OX0VWRU5UX0VBUkxZX1JYX1NMRUVQX1NMT1AiLAorCSAiQkVBQ09OX0VWRU5UX0VBUkxZX1JYX0NPTlRfQk1JU1NfVElNRU9VVCIsCisJICJCRUFDT05fRVZFTlRfRUFSTFlfUlhfUEFVU0VfU0tJUF9CQ05fTlVNIiwKKwkgIkJFQUNPTl9FVkVOVF9FQVJMWV9SWF9DTEtfRFJJRlQiLAorCSAiQkVBQ09OX0VWRU5UX0VBUkxZX1JYX0FQX0RSSUZUIiwKKwkgIkJFQUNPTl9FVkVOVF9FQVJMWV9SWF9CQ05fVFlQRSIsfSwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBPZmZsb2FkIE1nciAqLworCQkiT0ZGTE9BRF9NR1JfREJHSURfREVGSU5JVElPTl9TVEFSVCIsCisJCSJPRkZMT0FETUdSX1JFR0lTVEVSX09GRkxPQUQiLAorCQkiT0ZGTE9BRE1HUl9ERVJFR0lTVEVSX09GRkxPQUQiLAorCQkiT0ZGTE9BRE1HUl9OT19SRUdfREFUQV9IQU5ETEVSUyIsCisJCSJPRkZMT0FETUdSX05PX1JFR19FVkVOVF9IQU5ETEVSUyIsCisJCSJPRkZMT0FETUdSX1JFR19PRkZMT0FEX0ZBSUxFRCIsCisJCSJPRkZMT0FETUdSX0RCR0lEX0RFRklOSVRJT05fRU5EIiwKKwl9LAorCXsKKwkJIldBTF9EQkdJRF9ERUZJTklUSU9OX1NUQVJUIiwKKwkJIldBTF9EQkdJRF9GQVNUX1dBS0VfUkVRVUVTVCIsCisJCSJXQUxfREJHSURfRkFTVF9XQUtFX1JFTEVBU0UiLAorCQkiV0FMX0RCR0lEX1NFVF9QT1dFUl9TVEFURSIsCisJCSJXQUxfREJHSURfTUlTU0lORyIsCisJCSJXQUxfREJHSURfQ0hBTk5FTF9DSEFOR0VfRk9SQ0VfUkVTRVQiLAorCQkiV0FMX0RCR0lEX0NIQU5ORUxfQ0hBTkdFIiwKKwkJIldBTF9EQkdJRF9WREVWX1NUQVJUIiwKKwkJIldBTF9EQkdJRF9WREVWX1NUT1AiLAorCQkiV0FMX0RCR0lEX1ZERVZfVVAiLAorCQkiV0FMX0RCR0lEX1ZERVZfRE9XTiIsCisJCSJXQUxfREJHSURfU1dfV0RPR19SRVNFVCIsCisJCSJXQUxfREJHSURfVFhfU0NIX1JFR0lTVEVSX1RJRFEiLAorCQkiV0FMX0RCR0lEX1RYX1NDSF9VTlJFR0lTVEVSX1RJRFEiLAorCQkiV0FMX0RCR0lEX1RYX1NDSF9USUNLTEVfVElEUSIsCisJCSJXQUxfREJHSURfWENFU1NfRkFJTFVSRVMiLAorCQkiV0FMX0RCR0lEX0FTVF9BRERfV0RTX0VOVFJZIiwKKwkJIldBTF9EQkdJRF9BU1RfREVMX1dEU19FTlRSWSIsCisJCSJXQUxfREJHSURfQVNUX1dEU19FTlRSWV9QRUVSX0NIRyIsCisJCSJXQUxfREJHSURfQVNUX1dEU19TUkNfTEVBUk5fRkFJTCIsCisJCSJXQUxfREJHSURfU1RBX0tJQ0tPVVQiLAorCQkiV0FMX0RCR0lEX0JBUl9UWF9GQUlMIiwKKwkJIldBTF9EQkdJRF9CQVJfQUxMT0NfRkFJTCIsCisJCSJXQUxfREJHSURfTE9DQUxfREFUQV9UWF9GQUlMIiwKKwkJIldBTF9EQkdJRF9TRUNVUklUWV9QTTRfUVVFVUVEIiwKKwkJIldBTF9EQkdJRF9TRUNVUklUWV9HTTFfUVVFVUVEIiwKKwkJIldBTF9EQkdJRF9TRUNVUklUWV9QTTRfU0VOVCIsCisJCSJXQUxfREJHSURfU0VDVVJJVFlfQUxMT1dfREFUQSIsCisJCSJXQUxfREJHSURfU0VDVVJJVFlfVUNBU1RfS0VZX1NFVCIsCisJCSJXQUxfREJHSURfU0VDVVJJVFlfTUNBU1RfS0VZX1NFVCIsCisJCSJXQUxfREJHSURfU0VDVVJJVFlfRU5DUl9FTiIsCisJCSJXQUxfREJHSURfQkJfV0RPR19UUklHR0VSRUQiLAorCQkiV0FMX0RCR0lEX1JYX0xPQ0FMX0JVRlNfTFdNIiwKKwkJIldBTF9EQkdJRF9SWF9MT0NBTF9EUk9QX0xBUkdFX01HTVQiLAorCQkiV0FMX0RCR0lEX1ZIVF9JTExFR0FMX1JBVEVfUEhZX0VSUl9ERVRFQ1RFRCIsCisJCSJXQUxfREJHSURfREVWX1JFU0VUIiwKKwkJIldBTF9EQkdJRF9UWF9CQV9TRVRVUCIsCisJCSJXQUxfREJHSURfUlhfQkFfU0VUVVAiLAorCQkiV0FMX0RCR0lEX0RFVl9UWF9USU1FT1VUIiwKKwkJIldBTF9EQkdJRF9ERVZfUlhfVElNRU9VVCIsCisJCSJXQUxfREJHSURfU1RBX1ZERVZfWFJFVFJZIiwKKwkJIldBTF9EQkdJRF9EQ1MiLAorCQkiV0FMX0RCR0lEX01HTVRfVFhfRkFJTCIsCisJCSJXQUxfREJHSURfU0VUX000X1NFTlRfTUFOVUFMTFkiLAorCQkiV0FMX0RCR0lEX1BST0NFU1NfNF9XQVlfSEFORFNIQUtFIiwKKwkJIldBTF9EQkdJRF9XQUxfQ0hBTk5FTF9DSEFOR0VfU1RBUlQiLAorCQkiV0FMX0RCR0lEX1dBTF9DSEFOTkVMX0NIQU5HRV9DT01QTEVURSIsCisJCSJXQUxfREJHSURfV0hBTF9DSEFOTkVMX0NIQU5HRV9TVEFSVCIsCisJCSJXQUxfREJHSURfV0hBTF9DSEFOTkVMX0NIQU5HRV9DT01QTEVURSIsCisJCSJXQUxfREJHSURfVFhfTUdNVF9ERVNDSURfU0VRX1RZUEVfTEVOIiwKKwkJIldBTF9EQkdJRF9UWF9EQVRBX01TRFVJRF9TRVFfVFlQRV9MRU4iLAorCQkiV0FMX0RCR0lEX1RYX0RJU0NBUkQiLAorCQkiV0FMX0RCR0lEX1RYX01HTVRfQ09NUF9ERVNDSURfU1RBVFVTIiwKKwkJIldBTF9EQkdJRF9UWF9EQVRBX0NPTVBfTVNEVUlEX1NUQVRVUyIsCisJCSJXQUxfREJHSURfUkVTRVRfUENVX0NZQ0xFX0NOVCIsCisJCSJXQUxfREJHSURfU0VUVVBfUlNTSV9JTlRFUlJVUFRTIiwKKwkJIldBTF9EQkdJRF9CUlNTSV9DT05GSUciLAorCQkiV0FMX0RCR0lEX0NVUlJFTlRfQlJTU0lfQVZFIiwKKwkJIldBTF9EQkdJRF9CQ05fVFhfQ09NUCIsCisJCSJXQUxfREJHSURfU0VUX0hXX0NIQUlOTUFTSyIsCisJCSJXQUxfREJHSURfU0VUX0hXX0NIQUlOTUFTS19UWFJYX1NUT1BfRkFJTCIsCisJCSJXQUxfREJHSURfR0VUX0hXX0NIQUlOTUFTSyIsCisJCSJXQUxfREJHSURfU01QU19ESVNBQkxFIiwKKwkJIldBTF9EQkdJRF9TTVBTX0VOQUJMRV9IV19DTlRSTCIsCisJCSJXQUxfREJHSURfU01QU19TV1NFTF9DSEFJTk1BU0siLAorCQkiV0FMX0RCR0lEX0RFRklOSVRJT05fRU5EIiwKKwl9LAorCXsKKwkJIiIgICAgICAgICAgICAgIC8qIERFICovCisJfSwKKwl7CisJCSIiICAgICAgICAgICAgICAvKiBwY2llIGxwICovCisJfSwKKwl7CisJCS8qIFJUVCAqLworCQkiUlRUX0NBTExfRkxPVyIsCisJCSJSVFRfUkVRX1NVQl9UWVBFIiwKKwkJIlJUVF9NRUFTX1JFUV9IRUFEIiwKKwkJIlJUVF9NRUFTX1JFUV9CT0RZIiwKKwkJIiIsCisJCSIiLAorCQkiUlRUX0lOSVRfR0xPQkFMX1NUQVRFIiwKKwkJIiIsCisJCSJSVFRfUkVQT1JUIiwKKwkJIiIsCisJCSJSVFRfRVJST1JfUkVQT1JUIiwKKwkJIlJUVF9USU1FUl9TVE9QIiwKKwkJIlJUVF9TRU5EX1RNX0ZSQU1FIiwKKwkJIlJUVF9WM19SRVNQX0NOVCIsCisJCSJSVFRfVjNfUkVTUF9GSU5JU0giLAorCQkiUlRUX0NIQU5ORUxfU1dJVENIX1JFUSIsCisJCSJSVFRfQ0hBTk5FTF9TV0lUQ0hfR1JBTlQiLAorCQkiUlRUX0NIQU5ORUxfU1dJVENIX0NPTVBMRVRFIiwKKwkJIlJUVF9DSEFOTkVMX1NXSVRDSF9QUkVFTVBUIiwKKwkJIlJUVF9DSEFOTkVMX1NXSVRDSF9TVE9QIiwKKwkJIlJUVF9USU1FUl9TVEFSVCIsCisJfSwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSRVNPVVJDRSAqLworCQkiUkVTT1VSQ0VfREJHSURfREVGSU5JVElPTl9TVEFSVCIsCisJCSJSRVNPVVJDRV9QRUVSX0FMTE9DIiwKKwkJIlJFU09VUkNFX1BFRVJfRlJFRSIsCisJCSJSRVNPVVJDRV9QRUVSX0FMTE9DX1dBTF9QRUVSIiwKKwkJIlJFU09VUkNFX1BFRVJfTkJSSE9PRF9NR01UX0FMTE9DIiwKKwkJIlJFU09VUkNFX1BFRVJfTkJSSE9PRF9NR01UX0lORk8sIiAiUkVTT1VSQ0VfREJHSURfREVGSU5JVElPTl9FTkQiLAorCX0sCisJeyAgICAgICAgICAgICAgICAgICAgICAgLyogRENTICovCisJCSJXTEFOX0RDU19EQkdJRF9JTklUIiwKKwkJIldMQU5fRENTX0RCR0lEX1dNSV9DV0lOVCIsCisJCSJXTEFOX0RDU19EQkdJRF9USU1FUiIsCisJCSJXTEFOX0RDU19EQkdJRF9DTURHIiwKKwkJIldMQU5fRENTX0RCR0lEX0NNRFMiLAorCQkiV0xBTl9EQ1NfREJHSURfRElOSVQiCisJfSwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDQUNIRU1HUiAgKi8KKwkJIiIKKwl9LAorCXsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFOSSAgKi8KKwkJIkFOSV9EQkdJRF9QT0xMIiwKKwkJIkFOSV9EQkdJRF9DT05UUk9MIiwKKwkJIkFOSV9EQkdJRF9PRkRNX1BBUkFNUyIsCisJCSJBTklfREJHSURfQ0NLX1BBUkFNUyIsCisJCSJBTklfREJHSURfUkVTRVQiLAorCQkiQU5JX0RCR0lEX1JFU1RBUlQiLAorCQkiQU5JX0RCR0lEX09GRE1fTEVWRUwiLAorCQkiQU5JX0RCR0lEX0NDS19MRVZFTCIsCisJCSJBTklfREJHSURfRklSU1RFUCIsCisJCSJBTklfREJHSURfQ1lDUFdSIiwKKwkJIkFOSV9EQkdJRF9NUkNfQ0NLIiwKKwkJIkFOSV9EQkdJRF9TRUxGX0NPUlJfTE9XIiwKKwkJIkFOSV9EQkdJRF9FTkFCTEUiLAorCQkiQU5JX0RCR0lEX0NVUlJFTlRfTEVWRUwiLAorCQkiQU5JX0RCR0lEX1BPTExfUEVSSU9EIiwKKwkJIkFOSV9EQkdJRF9MSVNURU5fUEVSSU9EIiwKKwkJIkFOSV9EQkdJRF9PRkRNX0xFVkVMX0NGRyIsCisJCSJBTklfREJHSURfQ0NLX0xFVkVMX0NGRyIKKwl9LAorCXsKKwkJIlAyUF9EQkdJRF9ERUZJTklUSU9OX1NUQVJUIiwKKwkJIlAyUF9ERVZfUkVHSVNURVIiLAorCQkiUDJQX0hBTkRMRV9OT0EiLAorCQkiUDJQX1VQREFURV9TQ0hFRFVMRV9PUFBTIiwKKwkJIlAyUF9VUERBVEVfU0NIRURVTEUiLAorCQkiUDJQX1VQREFURV9TVEFSVF9USU1FIiwKKwkJIlAyUF9VUERBVEVfU1RBUlRfVElNRV9ESUZGX1RTRjMyIiwKKwkJIlAyUF9VUERBVEVfU1RBUlRfVElNRV9GSU5BTCIsCisJCSJQMlBfU0VUVVBfU0NIRURVTEVfVElNRVIiLAorCQkiUDJQX1BST0NFU1NfU0NIRURVTEVfQUZURVJfQ0FMQyIsCisJCSJQMlBfUFJPQ0VTU19TQ0hFRFVMRV9TVEFSVEVEX1RJTUVSIiwKKwkJIlAyUF9DQUxDX1NDSEVEVUxFU19GSVJTVF9DQUxMX0FMTF9ORVhUX0VWRU5UIiwKKwkJIlAyUF9DQUxDX1NDSEVEVUxFU19GSVJTVF9WQUxVRSIsCisJCSJQMlBfQ0FMQ19TQ0hFRFVMRVNfRUFSTElFU1RfTkVYVF9FVkVOVCIsCisJCSJQMlBfQ0FMQ19TQ0hFRFVMRVNfU0FOSVRZX0NPVU5UIiwKKwkJIlAyUF9DQUxDX1NDSEVEVUxFU19DQUxMX0FMTF9ORVhUX0VWRU5UX0ZST01fV0hJTEVfTE9PUCIsCisJCSJQMlBfQ0FMQ19TQ0hFRFVMRVNfVElNRU9VVF8xIiwKKwkJIlAyUF9DQUxDX1NDSEVEVUxFU19USU1FT1VUXzIiLAorCQkiUDJQX0ZJTkRfQUxMX05FWFRfRVZFTlRTX1JFUV9FWFBJUkVEIiwKKwkJIlAyUF9GSU5EX0FMTF9ORVhUX0VWRU5UU19SRVFfQUNUSVZFIiwKKwkJIlAyUF9GSU5EX05FWFRfRVZFTlRfUkVRX05PVF9TVEFSVEVEIiwKKwkJIlAyUF9GSU5EX05FWFRfRVZFTlRfUkVRX0NPTVBMRVRFX05PTl9QRVJJT0RJQyIsCisJCSJQMlBfRklORF9ORVhUX0VWRU5UX0lOX01JRF9PRl9OT0EiLAorCQkiUDJQX0ZJTkRfTkVYVF9FVkVOVF9SRVFfQ09NUExFVEUiLAorCQkiUDJQX1NDSEVEVUxFX1RJTUVPVVQiLAorCQkiUDJQX0NBTENfU0NIRURVTEVTX0VOVEVSIiwKKwkJIlAyUF9QUk9DRVNTX1NDSEVEVUxFX0VOVEVSIiwKKwkJIlAyUF9GSU5EX0FMTF9ORVhUX0VWRU5UU19JTkRJVklEVUFMX1JFUV9BRlRFUl9DSEFOR0UiLAorCQkiUDJQX0ZJTkRfQUxMX05FWFRfRVZFTlRTX0lORElWSURVQUxfUkVRX0JFRk9SRV9DSEFOR0UiLAorCQkiUDJQX0ZJTkRfQUxMX05FWFRfRVZFTlRTX0VOVEVSIiwKKwkJIlAyUF9GSU5EX05FWFRfRVZFTlRfRU5URVIiLAorCQkiUDJQX05PQV9HT19QUkVTRU5UIiwKKwkJIlAyUF9OT0FfR09fQUJTRU5UIiwKKwkJIlAyUF9HT19OT0FfTk9USUYiLAorCQkiUDJQX0dPX1RCVFRfT0ZGU0VUIiwKKwkJIlAyUF9HT19HRVRfTk9BX0lORk8iLAorCQkiUDJQX0dPX0FERF9PTkVfU0hPVF9OT0EiLAorCQkiUDJQX0dPX0dFVF9OT0FfSUUiLAorCQkiUDJQX0dPX0JDTl9UWF9DT01QIiwKKwkJIlAyUF9EQkdJRF9ERUZJTklUSU9OX0VORCIsCisJfSwKKwl7CisJCSJDU0FfREJHSURfREVGSU5JVElPTl9TVEFSVCIsCisJCSJDU0FfT0ZGTE9BRF9QT09MX0lOSVQiLAorCQkiQ1NBX09GRkxPQURfUkVHSVNURVJfVkRFViIsCisJCSJDU0FfT0ZGTE9BRF9ERVJFR0lTVEVSX1ZERVYiLAorCQkiQ1NBX0RFUkVHSVNURVJfVkRFVl9FUlJPUiIsCisJCSJDU0FfT0ZGTE9BRF9CRUFDT05fUkVDRUlWRUQiLAorCQkiQ1NBX09GRkxPQURfQkVBQ09OX0NTQV9SRUNWIiwKKwkJIkNTQV9PRkZMT0FEX0NTQV9SRUNWX0VSUk9SX0lFIiwKKwkJIkNTQV9PRkZMT0FEX0NTQV9USU1FUl9FUlJPUiIsCisJCSJDU0FfT0ZGTE9BRF9DU0FfVElNRVJfRVhQIiwKKwkJIkNTQV9PRkZMT0FEX1dNSV9FVkVOVF9FUlJPUiIsCisJCSJDU0FfT0ZGTE9BRF9XTUlfRVZFTlRfU0VOVCIsCisJCSJDU0FfT0ZGTE9BRF9XTUlfQ0hBTlNXSVRDSF9SRUNWIiwKKwkJIkNTQV9EQkdJRF9ERUZJTklUSU9OX0VORCIsCisJfSwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBOTE8gb2ZmbG9hZCAqLworCQkiIgorCX0sCisJeworCQkiV0xBTl9DSEFUVEVSX0RCR0lEX0RFRklOSVRJT05fU1RBUlQiLAorCQkiV0xBTl9DSEFUVEVSX0VOVEVSIiwKKwkJIldMQU5fQ0hBVFRFUl9FWElUIiwKKwkJIldMQU5fQ0hBVFRFUl9GSUxURVJfSElUIiwKKwkJIldMQU5fQ0hBVFRFUl9GSUxURVJfTUlTUyIsCisJCSJXTEFOX0NIQVRURVJfRklMVEVSX0ZVTEwiLAorCQkiV0xBTl9DSEFUVEVSX0ZJTFRFUl9UTV9BREoiLAorCQkiV0xBTl9DSEFUVEVSX0JVRkZFUl9GVUxMIiwKKwkJIldMQU5fQ0hBVFRFUl9USU1FT1VUIiwKKwkJIldMQU5fQ0hBVFRFUl9EQkdJRF9ERUZJTklUSU9OX0VORCIsCisJfSwKKwl7CisJCSJXT1dfREJHSURfREVGSU5JVElPTl9TVEFSVCIsCisJCSJXT1dfRU5BQkxFX0NNRElEIiwKKwkJIldPV19SRUNWX0RBVEFfUEtUIiwKKwkJIldPV19XQUtFX0hPU1RfREFUQSIsCisJCSJXT1dfUkVDVl9NR01UIiwKKwkJIldPV19XQUtFX0hPU1RfTUdNVCIsCisJCSJXT1dfUkVDVl9FVkVOVCIsCisJCSJXT1dfV0FLRV9IT1NUX0VWRU5UIiwKKwkJIldPV19JTklUIiwKKwkJIldPV19SRUNWX01BR0lDX1BLVCIsCisJCSJXT1dfUkVDVl9CSVRNQVBfUEFUVEVSTiIsCisJCSJXT1dfQVBfVkRFVl9ESVNBTExPVyIsCisJCSJXT1dfU1RBX1ZERVZfRElTQUxMT1ciLAorCQkiV09XX1AyUEdPX1ZERVZfRElTQUxMT1ciLAorCQkiV09XX05TX09GTERfRU5BQkxFIiwKKwkJIldPV19BUlBfT0ZMRF9FTkFCTEUiLAorCQkiV09XX05TX0FSUF9PRkxEX0RJU0FCTEUiLAorCQkiV09XX05TX1JFQ0VJVkVEIiwKKwkJIldPV19OU19SRVBMSUVEIiwKKwkJIldPV19BUlBfUkVDRUlWRUQiLAorCQkiV09XX0FSUF9SRVBMSUVEIiwKKwkJIldPV19EQkdJRF9ERUZJTklUSU9OX0VORCIsCisJfSwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBXQUwgVkRFViAgKi8KKwkJIiIKKwl9LAorCXsgICAgICAgICAgICAgICAgICAgICAgIC8qIFdBTCBQREVWICAqLworCQkiIgorCX0sCisJeyAgICAgICAgICAgICAgICAgICAgICAgLyogVEVTVCAgKi8KKwkJIlRQX0NIQU5HRV9DSEFOTkVMIiwKKwkJIlRQX0xPQ0FMX1NFTkQiLAorCX0sCisJeyAgICAgICAgICAgICAgICAgICAgICAgLyogU1RBIFNNUFMgICovCisJCSJTVEFfU01QU19EQkdJRF9ERUZJTklUSU9OX1NUQVJUIiwKKwkJIlNUQV9TTVBTX0RCR0lEX0NSRUFURV9QREVWX0lOU1RBTkNFIiwKKwkJIlNUQV9TTVBTX0RCR0lEX0NSRUFURV9WSVJUVUFMX0NIQU5fSU5TVEFOQ0UiLAorCQkiU1RBX1NNUFNfREJHSURfREVMRVRFX1ZJUlRVQUxfQ0hBTl9JTlNUQU5DRSIsCisJCSJTVEFfU01QU19EQkdJRF9DUkVBVEVfU1RBX0lOU1RBTkNFIiwKKwkJIlNUQV9TTVBTX0RCR0lEX0RFTEVURV9TVEFfSU5TVEFOQ0UiLAorCQkiU1RBX1NNUFNfREJHSURfVklSVFVBTF9DSEFOX1NNUFNfU1RBUlQiLAorCQkiU1RBX1NNUFNfREJHSURfVklSVFVBTF9DSEFOX1NNUFNfU1RPUCIsCisJCSJTVEFfU01QU19EQkdJRF9TRU5EX1NNUFNfQUNUSU9OX0ZSQU1FIiwKKwkJIlNUQV9TTVBTX0RCR0lEX0hPU1RfRk9SQ0VEX01PREUiLAorCQkiU1RBX1NNUFNfREJHSURfRldfRk9SQ0VEX01PREUiLAorCQkiU1RBX1NNUFNfREJHSURfUlNTSV9USFJFU0hPTERfQ1JPU1NFRCIsCisJCSJTVEFfU01QU19EQkdJRF9TTVBTX0FDVElPTl9GUkFNRV9DT01QTEVUSU9OIiwKKwkJIlNUQV9TTVBTX0RCR0lEX0RUSU1fRUJUX0VWRU5UX0NITUFTS19VUERBVEUiLAorCQkiU1RBX1NNUFNfREJHSURfRFRJTV9DSE1BU0tfVVBEQVRFIiwKKwkJIlNUQV9TTVBTX0RCR0lEX0RUSU1fQkVBQ09OX0VWRU5UX0NITUFTS19VUERBVEUiLAorCQkiU1RBX1NNUFNfREJHSURfRFRJTV9QT1dFUl9TVEFURV9DSEFOR0UiLAorCQkiU1RBX1NNUFNfREJHSURfRFRJTV9DSE1BU0tfVVBEQVRFX1NMRUVQIiwKKwkJIlNUQV9TTVBTX0RCR0lEX0RUSU1fQ0hNQVNLX1VQREFURV9BV0FLRSIsCisJCSJTTVBTX0RCR0lEX0RFRklOSVRJT05fRU5EIiwKKwl9LAorCXsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNXQk1JU1MgKi8KKwkJIlNXQk1JU1NfREJHSURfREVGSU5JVElPTl9TVEFSVCIsCisJCSJTV0JNSVNTX0VOQUJMRUQiLAorCQkiU1dCTUlTU19ESVNBQkxFRCIsCisJCSJTV0JNSVNTX0RCR0lEX0RFRklOSVRJT05fRU5EIiwKKwl9LAorCXsgICAgICAgICAgICAgICAgICAgICAgIC8qIFdNTUFDICovCisJCSIiCisJfSwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBURExTICovCisJCSJURExTX0RCR0lEX0RFRklOSVRJT05fU1RBUlQiLAorCQkiVERMU19EQkdJRF9WREVWX0NSRUFURSIsCisJCSJURExTX0RCR0lEX1ZERVZfREVMRVRFIiwKKwkJIlRETFNfREJHSURfRU5BQkxFRF9QQVNTSVZFIiwKKwkJIlRETFNfREJHSURfRU5BQkxFRF9BQ1RJVkUiLAorCQkiVERMU19EQkdJRF9ESVNBQkxFRCIsCisJCSJURExTX0RCR0lEX0NPTk5UUkFDS19USU1FUiIsCisJCSJURExTX0RCR0lEX1dBTF9TRVQiLAorCQkiVERMU19EQkdJRF9XQUxfR0VUIiwKKwkJIlRETFNfREJHSURfV0FMX1BFRVJfVVBEQVRFX1NFVCIsCisJCSJURExTX0RCR0lEX1dBTF9QRUVSX1VQREFURV9FVlQiLAorCQkiVERMU19EQkdJRF9XQUxfVkRFVl9DUkVBVEUiLAorCQkiVERMU19EQkdJRF9XQUxfVkRFVl9ERUxFVEUiLAorCQkiVERMU19EQkdJRF9XTEFOX0VWRU5UIiwKKwkJIlRETFNfREJHSURfV0xBTl9QRUVSX1VQREFURV9TRVQiLAorCQkiVERMU19EQkdJRF9QRUVSX0VWVF9EUlBfVEhSRVNIIiwKKwkJIlRETFNfREJHSURfUEVFUl9FVlRfRFJQX1JBVEUiLAorCQkiVERMU19EQkdJRF9QRUVSX0VWVF9EUlBfUlNTSSIsCisJCSJURExTX0RCR0lEX1BFRVJfRVZUX0RJU0NPVkVSIiwKKwkJIlRETFNfREJHSURfUEVFUl9FVlRfREVMRVRFIiwKKwkJIlRETFNfREJHSURfUEVFUl9DQVBfVVBEQVRFIiwKKwkJIlRETFNfREJHSURfVUFQU0RfU0VORF9QVElfRlJBTUUiLAorCQkiVERMU19EQkdJRF9VQVBTRF9TRU5EX1BUSV9GUkFNRTJQRUVSIiwKKwkJIlRETFNfREJHSURfVUFQU0RfU1RBUlRfUFRSX1RJTUVSIiwKKwkJIlRETFNfREJHSURfVUFQU0RfQ0FOQ0VMX1BUUl9USU1FUiIsCisJCSJURExTX0RCR0lEX1VBUFNEX1BUUl9USU1FUl9USU1FT1VUIiwKKwkJIlRETFNfREJHSURfVUFQU0RfU1RBX1BTX0VWRU5UX0hBTkRMRVIiLAorCQkiVERMU19EQkdJRF9VQVBTRF9QRUVSX0VWRU5UX0hBTkRMRVIiLAorCQkiVERMU19EQkdJRF9VQVBTRF9QU19ERUZBVUxUX1NFVFRJTkdTIiwKKwkJIlRETFNfREJHSURfVUFQU0RfR0VORVJJQyIsCisJfSwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBIQiAqLworCQkiV0xBTl9IQl9EQkdJRF9ERUZJTklUSU9OX1NUQVJUIiwKKwkJIldMQU5fSEJfREJHSURfSU5JVCIsCisJCSJXTEFOX0hCX0RCR0lEX1RDUF9HRVRfVFhCVUZfRkFJTCIsCisJCSJXTEFOX0hCX0RCR0lEX1RDUF9TRU5EX0ZBSUwiLAorCQkiV0xBTl9IQl9EQkdJRF9CU1NfUEVFUl9OVUxMIiwKKwkJIldMQU5fSEJfREJHSURfVURQX0dFVF9UWEJVRl9GQUlMIiwKKwkJIldMQU5fSEJfREJHSURfVURQX1NFTkRfRkFJTCIsCisJCSJXTEFOX0hCX0RCR0lEX1dNSV9DTURfSU5WQUxJRF9QQVJBTSIsCisJCSJXTEFOX0hCX0RCR0lEX1dNSV9DTURfSU5WQUxJRF9PUCIsCisJCSJXTEFOX0hCX0RCR0lEX1dPV19OT1RfRU5URVJFRCIsCisJCSJXTEFOX0hCX0RCR0lEX0FMTE9DX1NFU1NfRkFJTCIsCisJCSJXTEFOX0hCX0RCR0lEX0NUWF9OVUxMIiwKKwkJIldMQU5fSEJfREJHSURfQ0hLU1VNX0VSUiIsCisJCSJXTEFOX0hCX0RCR0lEX1VEUF9UWCIsCisJCSJXTEFOX0hCX0RCR0lEX1RDUF9UWCIsCisJCSJXTEFOX0hCX0RCR0lEX0RFRklOSVRJT05fRU5EIiwKKwl9LAorCXsgICAgICAgICAgICAgICAgICAgICAgIC8qIFRYQkYgKi8KKwkJIlRYQkZFRV9EQkdJRF9TVEFSVCIsCisJCSJUWEJGRUVfREJHSURfTkRQQV9SRUNFSVZFRCIsCisJCSJUWEJGRUVfREJHSURfSE9TVF9DT05GSUdfVFhCRkVFX1RZUEUiLAorCQkiVFhCRkVSX0RCR0lEX1NFTkRfTkRQQSIsCisJCSJUWEJGRVJfREJHSURfR0VUX05EUEFfQlVGX0ZBSUwiLAorCQkiVFhCRkVSX0RCR0lEX1NFTkRfTkRQQV9GQUlMIiwKKwkJIlRYQkZFUl9EQkdJRF9HRVRfTkRQX0JVRl9GQUlMIiwKKwkJIlRYQkZFUl9EQkdJRF9TRU5EX05EUF9GQUlMIiwKKwkJIlRYQkZFUl9EQkdJRF9HRVRfQlJQT0xMX0JVRl9GQUlMIiwKKwkJIlRYQkZFUl9EQkdJRF9TRU5EX0JSUE9MTF9GQUlMIiwKKwkJIlRYQkZFUl9EQkdJRF9IT1NUX0NPTkZJR19DTURJRCIsCisJCSJUWEJGRUVfREJHSURfSE9TVF9DT05GSUdfQ01ESUQiLAorCQkiVFhCRkVFX0RCR0lEX0VOQUJMRURfRU5BQkxFRF9VUExPQURfSCIsCisJCSJUWEJGRUVfREJHSURfVVBMT0FESF9DVl9UQUciLAorCQkiVFhCRkVFX0RCR0lEX1VQTE9BREhfSF9UQUciLAorCQkiVFhCRkVFX0RCR0lEX0NBUFRVUkVIX1JFQ0VJVkVEIiwKKwkJIlRYQkZFRV9EQkdJRF9QQUNLRVRfSVNfU1RFRVJFRCIsCisJCSJUWEJGRUVfVVBMT0FESF9FVkVOVF9BTExPQ19NRU1fRkFJTCIsCisJCSJUWEJGRUVfREJHSURfRU5EIiwKKwl9LAorCXsgICAgICAgICAgICAgICAgICAgICAgIC8qQkFUQ0ggU0NBTiAqLworCX0sCisJeyAgICAgICAgICAgICAgICAgICAgICAgLypUSEVSTUFMIE1HUiAqLworCQkiVEhFUk1BTF9NR1JfREJHSURfREVGSU5JVElPTl9TVEFSVCIsCisJCSJUSEVSTUFMX01HUl9ORVdfVEhSRVNIIiwKKwkJIlRIRVJNQUxfTUdSX1RIUkVTSF9DUk9TU0VEIiwKKwkJIlRIRVJNQUxfTUdSX0RCR0lEX0RFRklOSVRJT04gRU5EIiwKKwl9LAorCXsgICAgICAgICAgICAgICAgICAgICAgIC8qIFdMQU5fTU9EVUxFX1BIWUVSUl9ERlMgKi8KKwkJIiIKKwl9LAorCXsKKwkJLyogV0xBTl9NT0RVTEVfUk1DICovCisJCSJSTUNfREJHSURfREVGSU5JVElPTl9TVEFSVCIsCisJCSJSTUNfQ1JFQVRFX0lOU1RBTkNFIiwKKwkJIlJNQ19ERUxFVEVfSU5TVEFOQ0UiLAorCQkiUk1DX0xEUl9TRUwiLAorCQkiUk1DX05PX0xEUiIsCisJCSJSTUNfTERSX05PVF9TRUwiLAorCQkiUk1DX0xEUl9JTkZfU0VOVCIsCisJCSJSTUNfUEVFUl9BREQiLAorCQkiUk1DX1BFRVJfREVMRVRFIiwKKwkJIlJNQ19QRUVSX1VOS05PV04iLAorCQkiUk1DX1NFVF9NT0RFIiwKKwkJIlJNQ19TRVRfQUNUSU9OX1BFUklPRCIsCisJCSJSTUNfQUNSSU9OX0ZSQU1FX1JYIiwKKwkJIlJNQ19EQkdJRF9ERUZJTklUSU9OX0VORCIsCisJfSwKKwl7CisJCS8qIFdMQU5fTU9EVUxFX1NUQVRTICovCisJCSJXTEFOX1NUQVRTX0RCR0lEX0RFRklOSVRJT05fU1RBUlQiLAorCQkiV0xBTl9TVEFUU19EQkdJRF9FU1RfTElOS1NQRUVEX1ZERVZfRU5fRElTIiwKKwkJIldMQU5fU1RBVFNfREJHSURfRVNUX0xJTktTUEVFRF9DSEFOX1RJTUVfU1RBUlQiLAorCQkiV0xBTl9TVEFUU19EQkdJRF9FU1RfTElOS1NQRUVEX0NIQU5fVElNRV9FTkQiLAorCQkiV0xBTl9TVEFUU19EQkdJRF9FU1RfTElOS1NQRUVEX0NBTEMiLAorCQkiV0xBTl9TVEFUU19EQkdJRF9FU1RfTElOS1NQRUVEX1VQREFURV9IT01FX0NIQU4iLAorCQkiV0xBTl9TVEFUU19EQkdJRF9ERUZJTklUSU9OX0VORCIsCisJfSwKKwl7CisJCS8qIFdMQU5fTU9EVUxFX05BTiAqLworCX0sCisJeworCQkvKiBXTEFOX01PRFVMRV9JQlNTX1BXUlNBVkUgKi8KKwkJIklCU1NfUFNfREJHSURfREVGSU5JVElPTl9TVEFSVCIsCisJCSJJQlNTX1BTX0RCR0lEX1BFRVJfQ1JFQVRFIiwKKwkJIklCU1NfUFNfREJHSURfUEVFUl9ERUxFVEUiLAorCQkiSUJTU19QU19EQkdJRF9WREVWX0NSRUFURSIsCisJCSJJQlNTX1BTX0RCR0lEX1ZERVZfREVMRVRFIiwKKwkJIklCU1NfUFNfREJHSURfVkRFVl9FVkVOVCIsCisJCSJJQlNTX1BTX0RCR0lEX1BFRVJfRVZFTlQiLAorCQkiSUJTU19QU19EQkdJRF9ERUxJVkVSX0NBQiIsCisJCSJJQlNTX1BTX0RCR0lEX0RFTElWRVJfVUNfREFUQSIsCisJCSJJQlNTX1BTX0RCR0lEX0RFTElWRVJfVUNfREFUQV9FUlJPUiIsCisJCSJJQlNTX1BTX0RCR0lEX1VDX0lOQUNUSVZJVFlfVE1SX1JFU1RBUlQiLAorCQkiSUJTU19QU19EQkdJRF9NQ19JTkFDVElWSVRZX1RNUl9SRVNUQVJUIiwKKwkJIklCU1NfUFNfREJHSURfTlVMTF9UWF9DT01QTEVUSU9OIiwKKwkJIklCU1NfUFNfREJHSURfQVRJTV9USU1FUl9TVEFSVCIsCisJCSJJQlNTX1BTX0RCR0lEX1VDX0FUSU1fU0VORCIsCisJCSJJQlNTX1BTX0RCR0lEX0JDX0FUSU1fU0VORCIsCisJCSJJQlNTX1BTX0RCR0lEX1VDX1RJTUVPVVQiLAorCQkiSUJTU19QU19EQkdJRF9QV1JfQ09MTEFQU0VfQUxMT1dFRCIsCisJCSJJQlNTX1BTX0RCR0lEX1BXUl9DT0xMQVBTRV9OT1RfQUxMT1dFRCIsCisJCSJJQlNTX1BTX0RCR0lEX1NFVF9QQVJBTSIsCisJCSJJQlNTX1BTX0RCR0lEX0hPU1RfVFhfUEFVU0UiLAorCQkiSUJTU19QU19EQkdJRF9IT1NUX1RYX1VOUEFVU0UiLAorCQkiSUJTU19QU19EQkdJRF9QU19ERVNDX0JJTl9IV00iLAorCQkiSUJTU19QU19EQkdJRF9QU19ERVNDX0JJTl9MV00iLAorCQkiSUJTU19QU19EQkdJRF9QU19LSUNLT1VUX1BFRVIiLAorCQkiSUJTU19QU19EQkdJRF9TRVRfUEVFUl9QQVJBTSIsCisJCSJJQlNTX1BTX0RCR0lEX0JDTl9BVElNX1dJTl9NSVNNQVRDSCIsCisJCSJJQlNTX1BTX0RCR0lEX1JYX0NIQUlOTUFTS19DSEFOR0UiLAorCX0sCisJeworCQkvKiBISUYgVUFSVCBJbnRlcmZhY2UgREJHSURzICovCisJCSJISUZfVUFSVF9EQkdJRF9TVEFSVCIsCisJCSJISUZfVUFSVF9EQkdJRF9QT1dFUl9TVEFURSIsCisJCSJISUZfVUFSVF9EQkdJRF9UWFJYX0ZMT1ciLAorCQkiSElGX1VBUlRfREJHSURfVFhSWF9DVFJMX0NIQVIiLAorCQkiSElGX1VBUlRfREJHSURfVFhSWF9CVUZfRFVNUCIsCisJfSwKKwl7CisJCS8qIExQSSAqLworCQkiIgorCX0sCisJeworCQkvKiBFWFRTQ0FOIERCR0lEcyAqLworCQkiRVhUU0NBTl9TVEFSVCIsCisJCSJFWFRTQ0FOX1NUT1AiLAorCQkiRVhUU0NBTl9DTEVBUl9FTlRSWV9DT05URU5UIiwKKwkJIkVYVFNDQU5fR0VUX0ZSRUVfRU5UUllfU1VDQ0VTUyIsCisJCSJFWFRTQ0FOX0dFVF9GUkVFX0VOVFJZX0lOQ09OU0lTVEVOVCIsCisJCSJFWFRTQ0FOX0dFVF9GUkVFX0VOVFJZX05PX01PUkVfRU5UUklFUyIsCisJCSJFWFRTQ0FOX0NSRUFURV9FTlRSWV9TVUNDRVNTIiwKKwkJIkVYVFNDQU5fQ1JFQVRFX0VOVFJZX0VSUk9SIiwKKwkJIkVYVFNDQU5fU0VBUkNIX1NDQU5fRU5UUllfUVVFVUUiLAorCQkiRVhUU0NBTl9TRUFSQ0hfU0NBTl9FTlRSWV9LRVlfRk9VTkQiLAorCQkiRVhUU0NBTl9TRUFSQ0hfU0NBTl9FTlRSWV9LRVlfTk9UX0ZPVU5EIiwKKwkJIkVYVFNDQU5fQUREX0VOVFJZIiwKKwkJIkVYVFNDQU5fQlVDS0VUX1NFTkRfT1BFUkFUSU9OX0VWRU5UIiwKKwkJIkVYVFNDQU5fQlVDS0VUX1NFTkRfT1BFUkFUSU9OX0VWRU5UX0ZBSUxFRCIsCisJCSJFWFRTQ0FOX0JVQ0tFVF9TVEFSVF9TQ0FOX0NZQ0xFIiwKKwkJIkVYVFNDQU5fQlVDS0VUX1BFUklPRElDX1RJTUVSIiwKKwkJIkVYVFNDQU5fU0VORF9TVEFSVF9TVE9QX0VWRU5UIiwKKwkJIkVYVFNDQU5fTk9USUZZX1dMQU5fQ0hBTkdFIiwKKwkJIkVYVFNDQU5fTk9USUZZX1dMQU5fSE9UTElTVF9NQVRDSCIsCisJCSJFWFRTQ0FOX01BSU5fUkVDRUlWRURfRlJBTUUiLAorCQkiRVhUU0NBTl9NQUlOX05PX1NTSURfSUUiLAorCQkiRVhUU0NBTl9NQUlOX01BTEZPUk1FRF9GUkFNRSIsCisJCSJFWFRTQ0FOX0ZJTkRfQlNTSURfQllfUkVGRVJFTkNFIiwKKwkJIkVYVFNDQU5fRklORF9CU1NJRF9CWV9SRUZFUkVOQ0VfRVJST1IiLAorCQkiRVhUU0NBTl9OT1RJRllfVEFCTEVfVVNBR0UiLAorCQkiRVhUU0NBTl9GT1VORF9SU1NJX0VOVFJZIiwKKwkJIkVYVFNDQU5fQlNTSURfRk9VTkRfUlNTSV9TQU1QTEUiLAorCQkiRVhUU0NBTl9CU1NJRF9BRERFRF9SU1NJX1NBTVBMRSIsCisJCSJFWFRTQ0FOX0JTU0lEX1JFUExBQ0VEX1JTU0lfU0FNUExFIiwKKwkJIkVYVFNDQU5fQlNTSURfVFJBTlNGRVJfQ1VSUkVOVF9TQU1QTEVTIiwKKwkJIkVYVFNDQU5fQlVDS0VUX1BST0NFU1NfU0NBTl9FVkVOVCIsCisJCSJFWFRTQ0FOX0JVQ0tFVF9DQU5OT1RfRklORF9CVUNLRVQiLAorCQkiRVhUU0NBTl9TVEFSVF9TQ0FOX1JFUVVFU1RfRkFJTEVEIiwKKwkJIkVYVFNDQU5fQlVDS0VUX1NUT1BfQ1VSUkVOVF9TQ0FOUyIsCisJCSJFWFRTQ0FOX0JVQ0tFVF9TQ0FOX1NUT1BfUkVRVUVTVCIsCisJCSJFWFRTQ0FOX0JVQ0tFVF9QRVJJT0RJQ19USU1FUl9FUlJPUiIsCisJCSJFWFRTQ0FOX0JVQ0tFVF9TVEFSVF9PUEVSQVRJT04iLAorCQkiRVhUU0NBTl9TVEFSVF9JTlRFUk5BTF9FUlJPUiIsCisJCSJFWFRTQ0FOX05PVElGWV9IT1RMSVNUX01BVENIIiwKKwkJIkVYVFNDQU5fQ09ORklHX0hPVExJU1RfVEFCTEUiLAorCQkiRVhUU0NBTl9DT05GSUdfV0xBTl9DSEFOR0VfVEFCTEUiLAorCX0sCisJeyAgICAgICAgICAgICAgICAgICAgICAgLyogVU5JVF9URVNUICovCisJCSJVTklUX1RFU1RfR0VOIiwKKwl9LAorCXsgICAgICAgICAgICAgICAgICAgICAgIC8qIE1MTUUgKi8KKwkJIk1MTUVfREVCVUdfQ01OIiwKKwkJIk1MTUVfSUYiLAorCQkiTUxNRV9BVVRIIiwKKwkJIk1MTUVfUkVBU1NPQyIsCisJCSJNTE1FX0RFQVVUSCIsCisJCSJNTE1FX0RJU0FTU09DIiwKKwkJIk1MTUVfUk9BTSIsCisJCSJNTE1FX1JFVFJZIiwKKwkJIk1MTUVfVElNRVIiLAorCQkiTUxNRV9GUk1QQVJTRSIsCisJfSwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAvKlNVUFBMSUNBTlQgKi8KKwkJIlNVUFBMX0lOSVQiLAorCQkiU1VQUExfUkVDVl9FQVBPTCIsCisJCSJTVVBQTF9SRUNWX0VBUE9MX1RJTUVPVVQiLAorCQkiU1VQUExfU0VORF9FQVBPTCIsCisJCSJTVVBQTF9NSUNfTUlTTUFUQ0giLAorCQkiU1VQUExfRklOSVNIIiwKKwl9LAorfTsKKworaW50IGRiZ2xvZ19tb2R1bGVfbG9nX2VuYWJsZSh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIEFfVUlOVDMyIG1vZF9pZCwKKwkJCSAgICAgYm9vbCBpc2VuYWJsZSkKK3sKKwlBX1VJTlQzMiB2YWwgPSAwOworCisJaWYgKG1vZF9pZCA+IFdMQU5fTU9EVUxFX0lEX01BWCkgeworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkoImRiZ2xvZ19tb2R1bGVfbG9nX2VuYWJsZTogSW52YWxpZCBtb2R1bGUgaWQgJWRcbiIsCisJCQkJIG1vZF9pZCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlXTUlfREJHTE9HX1NFVF9NT0RVTEVfSUQodmFsLCBtb2RfaWQpOworCWlmIChpc2VuYWJsZSkgeworCQkvKiBzZXQgaXQgdG8gZ2xvYmFsIG1vZHVsZSBsZXZlbCAqLworCQlXTUlfREJHTE9HX1NFVF9MT0dfTEVWRUwodmFsLCBEQkdMT0dfSU5GTyk7CisJfSBlbHNlIHsKKwkJLyogc2V0IGl0IHRvIEVSUk9SIGxldmVsICovCisJCVdNSV9EQkdMT0dfU0VUX0xPR19MRVZFTCh2YWwsIERCR0xPR19FUlIpOworCX0KKwl3bWlfY29uZmlnX2RlYnVnX21vZHVsZV9jbWQod21pX2hhbmRsZSwgV01JX0RFQlVHX0xPR19QQVJBTV9MT0dfTEVWRUwsCisJCQkJICAgIHZhbCwgTlVMTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRiZ2xvZ192YXBfbG9nX2VuYWJsZSh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIEFfVUlOVDE2IHZhcF9pZCwKKwkJCSAgYm9vbCBpc2VuYWJsZSkKK3sKKwlpZiAodmFwX2lkID4gREJHTE9HX01BWF9WREVWSUQpIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsCisJCQkJKCJkYmdsb2dfdmFwX2xvZ19lbmFibGU6SW52YWxpZCB2YXBfaWQgJWRcbiIsCisJCQkJIHZhcF9pZCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3bWlfY29uZmlnX2RlYnVnX21vZHVsZV9jbWQod21pX2hhbmRsZSwKKwkJCQkgICAgaXNlbmFibGUgPyBXTUlfREVCVUdfTE9HX1BBUkFNX1ZERVZfRU5BQkxFIDoKKwkJCQkgICAgV01JX0RFQlVHX0xPR19QQVJBTV9WREVWX0RJU0FCTEUsIHZhcF9pZCwKKwkJCQkgICAgTlVMTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRiZ2xvZ19zZXRfbG9nX2x2bCh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIERCR0xPR19MT0dfTFZMIGxvZ19sdmwpCit7CisJQV9VSU5UMzIgdmFsID0gMDsKKworCWlmIChsb2dfbHZsID4gREJHTE9HX0xWTF9NQVgpIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsCisJCQkJKCJkYmdsb2dfc2V0X2xvZ19sdmw6SW52YWxpZCBsb2cgbGV2ZWwgJWRcbiIsCisJCQkJIGxvZ19sdmwpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJV01JX0RCR0xPR19TRVRfTU9EVUxFX0lEKHZhbCwgV01JX0RFQlVHX0xPR19NT0RVTEVfQUxMKTsKKwlXTUlfREJHTE9HX1NFVF9MT0dfTEVWRUwodmFsLCBsb2dfbHZsKTsKKwl3bWlfY29uZmlnX2RlYnVnX21vZHVsZV9jbWQod21pX2hhbmRsZSwgV01JX0RFQlVHX0xPR19QQVJBTV9MT0dfTEVWRUwsCisJCQkJICAgIHZhbCwgTlVMTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRiZ2xvZ19zZXRfbW9kX2xvZ19sdmwod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCBBX1VJTlQzMiBtb2RfbG9nX2x2bCkKK3sKKwlBX1VJTlQzMiB2YWwgPSAwOworCS8qIHNldCB0aGUgZ2xvYmFsIG1vZHVsZSBsZXZlbCB0byBsb2dfbHZsICovCisJV01JX0RCR0xPR19TRVRfTU9EVUxFX0lEKHZhbCwgKG1vZF9sb2dfbHZsIC8gMTApKTsKKwlXTUlfREJHTE9HX1NFVF9MT0dfTEVWRUwodmFsLCAobW9kX2xvZ19sdmwgJSAxMCkpOworCXdtaV9jb25maWdfZGVidWdfbW9kdWxlX2NtZCh3bWlfaGFuZGxlLCBXTUlfREVCVUdfTE9HX1BBUkFNX0xPR19MRVZFTCwKKwkJCQkgICAgdmFsLCBOVUxMLCAwKTsKKworCXJldHVybiAwOworfQorCitBX1NUQVRVUword21pX2NvbmZpZ19kZWJ1Z19tb2R1bGVfY21kKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwgQV9VSU5UMzIgcGFyYW0sCisJCQkgICAgQV9VSU5UMzIgdmFsLCBBX1VJTlQzMiAqbW9kdWxlX2lkX2JpdG1hcCwKKwkJCSAgICBBX1VJTlQzMiBiaXRtYXBfbGVuKQoreworCXdtaV9idWZfdCBidWY7CisJd21pX2RlYnVnX2xvZ19jb25maWdfY21kX2ZpeGVkX3BhcmFtICpjb25maWdtc2c7CisJQV9TVEFUVVMgc3RhdHVzID0gQV9PSzsKKwlpbnQgaTsKKwlpbnQgbGVuOworCWludDhfdCAqYnVmX3B0cjsKKwlpbnQzMl90ICptb2R1bGVfaWRfYml0bWFwX2FycmF5OyAgICAgICAgLyogVXNlZCB0byBmb21yIHRoZSBzZWNvbmQgdGx2ICovCisKKwlBU1NFUlQoYml0bWFwX2xlbiA8IE1BWF9NT0RVTEVfSURfQklUTUFQX1dPUkRTKTsKKworCS8qIEFsbG9jYXRlIHNpemUgZm9yIDIgdGx2cyAtIGluY2x1ZGluZyB0bHYgaGRyIHNwYWNlIGZvciBzZWNvbmQgdGx2ICovCisJbGVuID0gc2l6ZW9mKHdtaV9kZWJ1Z19sb2dfY29uZmlnX2NtZF9maXhlZF9wYXJhbSkgKyBXTUlfVExWX0hEUl9TSVpFICsKKwkgICAgICAoc2l6ZW9mKGludDMyX3QpICogTUFYX01PRFVMRV9JRF9CSVRNQVBfV09SRFMpOworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiBBX05PX01FTU9SWTsKKworCWNvbmZpZ21zZyA9CisJCSh3bWlfZGVidWdfbG9nX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0gKikgKHdtaV9idWZfZGF0YShidWYpKTsKKwlidWZfcHRyID0gKGludDhfdCAqKSBjb25maWdtc2c7CisJV01JVExWX1NFVF9IRFIoJmNvbmZpZ21zZy0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RlYnVnX2xvZ19jb25maWdfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9kZWJ1Z19sb2dfY29uZmlnX2NtZF9maXhlZF9wYXJhbSkpOworCWNvbmZpZ21zZy0+ZGJnX2xvZ19wYXJhbSA9IHBhcmFtOworCWNvbmZpZ21zZy0+dmFsdWUgPSB2YWw7CisJLyogRmlsbGluZyBpbiB0aGUgZGF0YSBwYXJ0IG9mIHNlY29uZCB0bHYgLS0gc2hvdWxkIGZvbGxvdyBmaXJzdCB0bHYgXyBXTUlfVExWX0hEUl9TSVpFICovCisJbW9kdWxlX2lkX2JpdG1hcF9hcnJheSA9IChBX1VJTlQzMiAqKSAoYnVmX3B0ciArCisJCQkJCSAgICAgICBzaXplb2YKKwkJCQkJICAgICAgICh3bWlfZGVidWdfbG9nX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0pCisJCQkJCSAgICAgICArIFdNSV9UTFZfSERSX1NJWkUpOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIgKyBzaXplb2Yod21pX2RlYnVnX2xvZ19jb25maWdfY21kX2ZpeGVkX3BhcmFtKSwKKwkJICAgICAgIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLAorCQkgICAgICAgc2l6ZW9mKEFfVUlOVDMyKSAqIE1BWF9NT0RVTEVfSURfQklUTUFQX1dPUkRTKTsKKwlpZiAobW9kdWxlX2lkX2JpdG1hcCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYml0bWFwX2xlbjsgKytpKSB7CisJCQltb2R1bGVfaWRfYml0bWFwX2FycmF5W2ldID0gbW9kdWxlX2lkX2JpdG1hcFtpXTsKKwkJfQorCX0KKworCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJKCJ3bWlfZGJnX2NmZ19zZW5kOiBwYXJhbSAweCV4IHZhbCAweCV4IFxuICIsIHBhcmFtLAorCQkJIHZhbCkpOworCisJc3RhdHVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21pX2hhbmRsZSwgYnVmLAorCQkJCSAgICAgIGxlbiwgV01JX0RCR0xPR19DRkdfQ01ESUQpOworCisJaWYgKHN0YXR1cyAhPSBBX09LKQorCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkCitkYmdsb2dfc2V0X3ZhcF9lbmFibGVfYml0bWFwKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCSAgICAgQV9VSU5UMzIgdmFwX2VuYWJsZV9iaXRtYXApCit7CisJd21pX2NvbmZpZ19kZWJ1Z19tb2R1bGVfY21kKHdtaV9oYW5kbGUsCisJCQkJICAgIFdNSV9ERUJVR19MT0dfUEFSQU1fVkRFVl9FTkFCTEVfQklUTUFQLAorCQkJCSAgICB2YXBfZW5hYmxlX2JpdG1hcCwgTlVMTCwgMCk7Cit9CisKK3ZvaWQKK2RiZ2xvZ19zZXRfbW9kX2VuYWJsZV9iaXRtYXAod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCBBX1VJTlQzMiBsb2dfbGV2ZWwsCisJCQkgICAgIEFfVUlOVDMyICptb2RfZW5hYmxlX2JpdG1hcCwgQV9VSU5UMzIgYml0bWFwX2xlbikKK3sKKwl3bWlfY29uZmlnX2RlYnVnX21vZHVsZV9jbWQod21pX2hhbmRsZSwKKwkJCQkgICAgV01JX0RFQlVHX0xPR19QQVJBTV9NT0RfRU5BQkxFX0JJVE1BUCwKKwkJCQkgICAgbG9nX2xldmVsLCBtb2RfZW5hYmxlX2JpdG1hcCwgYml0bWFwX2xlbik7Cit9CisKK2ludCBkYmdsb2dfcmVwb3J0X2VuYWJsZSh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIGJvb2wgaXNlbmFibGUpCit7CisJaW50IGJpdG1hcFsyXSA9IHsgMCB9OworCisJaWYgKGlzZW5hYmxlID4gdHJ1ZSkgeworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkoImRiZ2xvZ19yZXBvcnRfZW5hYmxlOkludmFsaWQgdmFsdWUgJWRcbiIsCisJCQkJIGlzZW5hYmxlKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpc2VuYWJsZSkgeworCQkvKiBzZXQgdGhlIHZhcCBlbmFibGUgYml0bWFwICovCisJCWRiZ2xvZ19zZXRfdmFwX2VuYWJsZV9iaXRtYXAod21pX2hhbmRsZSwgMHhGRkZGKTsKKwkJYml0bWFwWzBdID0gMHhGRkZGRkZGRjsKKwkJYml0bWFwWzFdID0gMHgxRjsKKwkJLyogc2V0IHRoZSBtb2R1bGUgbGV2ZWwgYml0bWFwICAqLworCQlkYmdsb2dfc2V0X21vZF9lbmFibGVfYml0bWFwKHdtaV9oYW5kbGUsIDB4MCwgYml0bWFwLCAyKTsKKwl9IGVsc2UgeworCQlkYmdsb2dfc2V0X3ZhcF9lbmFibGVfYml0bWFwKHdtaV9oYW5kbGUsIGJpdG1hcFswXSk7CisJCWRiZ2xvZ19zZXRfbW9kX2VuYWJsZV9iaXRtYXAod21pX2hhbmRsZSwgREJHTE9HX0xWTF9NQVgsIGJpdG1hcCwKKwkJCQkJICAgICAyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpkYmdsb2dfZ2V0X21zZyhBX1VJTlQzMiBtb2R1bGVpZCwgQV9VSU5UMzIgZGVidWdpZCkKK3sKKwlzdGF0aWMgY2hhciB1bmtub3duX3N0cls2NF07CisKKwlpZiAobW9kdWxlaWQgPCBXTEFOX01PRFVMRV9JRF9NQVggJiYgZGVidWdpZCA8IE1BWF9EQkdfTVNHUykgeworCQljaGFyICpzdHIgPSBEQkdfTVNHX0FSUlttb2R1bGVpZF1bZGVidWdpZF07CisJCWlmIChzdHIgJiYgc3RyWzBdICE9ICdcMCcpIHsKKwkJCXJldHVybiBzdHI7CisJCX0KKwl9CisKKwlzbnByaW50Zih1bmtub3duX3N0ciwgc2l6ZW9mKHVua25vd25fc3RyKSwKKwkJICJVTktOT1dOICV1OiV1IiwgbW9kdWxlaWQsIGRlYnVnaWQpOworCisJcmV0dXJuIHVua25vd25fc3RyOworfQorCit2b2lkIGRiZ2xvZ19wcmludGYoQV9VSU5UMzIgdGltZXN0YW1wLCBBX1VJTlQxNiB2YXBfaWQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWNoYXIgYnVmWzEyOF07CisJdmFfbGlzdCBhcDsKKworCWlmICh2YXBfaWQgPCBEQkdMT0dfTUFYX1ZERVZJRCkgeworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0lORk8sCisJCQkJKERCR0xPR19QUklOVF9QUkVGSVggIlsldV0gdmFwLSV1ICIsIHRpbWVzdGFtcCwKKwkJCQkgdmFwX2lkKSk7CisJfSBlbHNlIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTkZPLAorCQkJCShEQkdMT0dfUFJJTlRfUFJFRklYICJbJXVdICIsIHRpbWVzdGFtcCkpOworCX0KKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTkZPLCAoIiVzXG4iLCBidWYpKTsKK30KKwordm9pZAorZGJnbG9nX3ByaW50Zl9ub19saW5lX2JyZWFrKEFfVUlOVDMyIHRpbWVzdGFtcCwKKwkJCSAgICBBX1VJTlQxNiB2YXBfaWQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWNoYXIgYnVmWzEyOF07CisJdmFfbGlzdCBhcDsKKworCWlmICh2YXBfaWQgPCBEQkdMT0dfTUFYX1ZERVZJRCkgeworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0lORk8sCisJCQkJKERCR0xPR19QUklOVF9QUkVGSVggIlsldV0gdmFwLSV1ICIsIHRpbWVzdGFtcCwKKwkJCQkgdmFwX2lkKSk7CisJfSBlbHNlIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTkZPLAorCQkJCShEQkdMT0dfUFJJTlRfUFJFRklYICJbJXVdICIsIHRpbWVzdGFtcCkpOworCX0KKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTkZPLCAoIiVzIiwgYnVmKSk7Cit9CisKKyNkZWZpbmUgVVNFX05VTUVSSUMgMAorCitBX0JPT0wKK2RiZ2xvZ19kZWZhdWx0X3ByaW50X2hhbmRsZXIoQV9VSU5UMzIgbW9kX2lkLCBBX1VJTlQxNiB2YXBfaWQsIEFfVUlOVDMyIGRiZ19pZCwKKwkJCSAgICAgQV9VSU5UMzIgdGltZXN0YW1wLCBBX1VJTlQxNiBudW1hcmdzLAorCQkJICAgICBBX1VJTlQzMiAqYXJncykKK3sKKwlpbnQgaTsKKworCWlmICh2YXBfaWQgPCBEQkdMT0dfTUFYX1ZERVZJRCkgeworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0lORk8sCisJCQkJKERCR0xPR19QUklOVF9QUkVGSVggIlsldV0gdmFwLSV1ICVzICggIiwKKwkJCQkgdGltZXN0YW1wLCB2YXBfaWQsIGRiZ2xvZ19nZXRfbXNnKG1vZF9pZCwKKwkJCQkJCQkJICAgZGJnX2lkKSkpOworCX0gZWxzZSB7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfSU5GTywKKwkJCQkoREJHTE9HX1BSSU5UX1BSRUZJWCAiWyV1XSAlcyAoICIsIHRpbWVzdGFtcCwKKwkJCQkgZGJnbG9nX2dldF9tc2cobW9kX2lkLCBkYmdfaWQpKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bWFyZ3M7IGkrKykgeworI2lmIFVTRV9OVU1FUklDCisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfSU5GTywgKCIldSIsIGFyZ3NbaV0pKTsKKyNlbHNlCisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfSU5GTywgKCIlI3giLCBhcmdzW2ldKSk7CisjZW5kaWYKKwkJaWYgKChpICsgMSkgPCBudW1hcmdzKSB7CisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0lORk8sICgiLCAiKSk7CisJCX0KKwl9CisJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTkZPLCAoIiApXG4iKSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBEQkdMT0dfUEFSU0VfQVJHU19TVFJJTkdfTEVOR1RIICAgIChEQkdMT0dfTlVNX0FSR1NfTUFYICogMTEgKyAxMCkKK3N0YXRpYyBpbnQgZGJnbG9nX3ByaW50X3Jhd19kYXRhKEFfVUlOVDMyICpidWZmZXIsIEFfVUlOVDMyIGxlbmd0aCkKK3sKKwlBX1VJTlQzMiB0aW1lc3RhbXA7CisJQV9VSU5UMzIgZGVidWdpZDsKKwlBX1VJTlQzMiBtb2R1bGVpZDsKKwlBX1VJTlQxNiBudW1hcmdzLCBjdXJBcmdzOworCUFfVUlOVDMyIGNvdW50ID0gMCwgdG90YWxXcml0ZUxlbiwgd3JpdGVMZW47CisJY2hhciBwYXJzZUFyZ3NTdHJpbmdbREJHTE9HX1BBUlNFX0FSR1NfU1RSSU5HX0xFTkdUSF07CisJY2hhciAqZGJnaWRTdHJpbmc7CisKKwl3aGlsZSAoY291bnQgPCBsZW5ndGgpIHsKKworCQlkZWJ1Z2lkID0gREJHTE9HX0dFVF9EQkdJRChidWZmZXJbY291bnQgKyAxXSk7CisJCW1vZHVsZWlkID0gREJHTE9HX0dFVF9NT0RVTEVJRChidWZmZXJbY291bnQgKyAxXSk7CisJCW51bWFyZ3MgPSBEQkdMT0dfR0VUX05VTUFSR1MoYnVmZmVyW2NvdW50ICsgMV0pOworCQl0aW1lc3RhbXAgPSBEQkdMT0dfR0VUX1RJTUVfU1RBTVAoYnVmZmVyW2NvdW50XSk7CisKKwkJaWYgKG1vZHVsZWlkIDwgV0xBTl9NT0RVTEVfSURfTUFYICYmIGRlYnVnaWQgPCBNQVhfREJHX01TR1MKKwkJICAgICYmIG51bWFyZ3MgPD0gREJHTE9HX05VTV9BUkdTX01BWCkgeworCisJCQlPU19NRU1aRVJPKHBhcnNlQXJnc1N0cmluZywgc2l6ZW9mKHBhcnNlQXJnc1N0cmluZykpOworCQkJdG90YWxXcml0ZUxlbiA9IDA7CisKKwkJCWZvciAoY3VyQXJncyA9IDA7IGN1ckFyZ3MgPCBudW1hcmdzOyBjdXJBcmdzKyspIHsKKwkJCQkvKiBVc2luZyBzcHJpbnRmX3MgaW5zdGVhZCBvZiBzcHJpbnRmLCB0byBhdm9pZCBsZW5ndGggb3ZlcmZsb3cgKi8KKwkJCQl3cml0ZUxlbiA9CisJCQkJCXNucHJpbnRmKHBhcnNlQXJnc1N0cmluZyArIHRvdGFsV3JpdGVMZW4sCisJCQkJCQkgREJHTE9HX1BBUlNFX0FSR1NfU1RSSU5HX0xFTkdUSCAtCisJCQkJCQkgdG90YWxXcml0ZUxlbiwgIiV4ICIsCisJCQkJCQkgYnVmZmVyW2NvdW50ICsgMiArIGN1ckFyZ3NdKTsKKwkJCQl0b3RhbFdyaXRlTGVuICs9IHdyaXRlTGVuOworCQkJfQorCisJCQlpZiAoZGVidWdpZCA8IE1BWF9EQkdfTVNHUykgeworCQkJCWRiZ2lkU3RyaW5nID0gREJHX01TR19BUlJbbW9kdWxlaWRdW2RlYnVnaWRdOworCQkJCWlmIChkYmdpZFN0cmluZyAhPSBOVUxMKSB7CisJCQkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfSU5GTywKKwkJCQkJCQkoImZ3OiVzKCV4ICV4KTolc1xuIiwKKwkJCQkJCQkgZGJnaWRTdHJpbmcsIHRpbWVzdGFtcCwKKwkJCQkJCQkgYnVmZmVyW2NvdW50ICsgMV0sCisJCQkJCQkJIHBhcnNlQXJnc1N0cmluZykpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGhvc3QgbmVlZCBzeW5jIHdpdGggRlcgaWQgKi8KKwkJCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTkZPLAorCQkJCQkJCSgiZnc6JXM6bToleCxpZDoleCgleCAleCk6JXNcbiIsCisJCQkJCQkJICJVTktOT1dOIiwgbW9kdWxlaWQsCisJCQkJCQkJIGRlYnVnaWQsIHRpbWVzdGFtcCwKKwkJCQkJCQkgYnVmZmVyW2NvdW50ICsgMV0sCisJCQkJCQkJIHBhcnNlQXJnc1N0cmluZykpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZGVidWdpZCA9PQorCQkJCSAgIERCR0xPR19EQkdJRF9TTV9GUkFNRVdPUktfUFJPWFlfREJHTE9HX01TRykgeworCQkJCS8qIHNwZWNpZmljIGRlYnVnaWQgKi8KKwkJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0lORk8sCisJCQkJCQkoImZ3OiVzOm06JXgsaWQ6JXgoJXggJXgpOiVzXG4iLAorCQkJCQkJICJEQkdMT0dfU01fTVNHIiwgbW9kdWxlaWQsCisJCQkJCQkgZGVidWdpZCwgdGltZXN0YW1wLAorCQkJCQkJIGJ1ZmZlcltjb3VudCArIDFdLAorCQkJCQkJIHBhcnNlQXJnc1N0cmluZykpOworCQkJfSBlbHNlIHsKKwkJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0lORk8sCisJCQkJCQkoImZ3OiVzOm06JXgsaWQ6JXgoJXggJXgpOiVzXG4iLAorCQkJCQkJICJVTktOT1dOIiwgbW9kdWxlaWQsIGRlYnVnaWQsCisJCQkJCQkgdGltZXN0YW1wLCBidWZmZXJbY291bnQgKyAxXSwKKwkJCQkJCSBwYXJzZUFyZ3NTdHJpbmcpKTsKKwkJCX0KKwkJfQorCisJCWNvdW50ICs9IG51bWFyZ3MgKyAyOyAgIC8qIDMyIGJpdCBUaW1lIHN0YW1wICsgMzIgYml0IERiZyBoZWFkZXIgKi8KKwl9CisKKwlyZXR1cm4gMDsKKworfQorCisjaWZkZWYgV0xBTl9PUEVOX1NPVVJDRQorc3RhdGljIGludAorZGJnbG9nX2RlYnVnZnNfcmF3X2RhdGEod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCBjb25zdCB1aW50OF90ICpidWYsCisJCQlBX1VJTlQzMiBsZW5ndGgsIEFfVUlOVDMyIGRyb3BwZWQpCit7CisJc3RydWN0IGZ3ZGVidWcgKmZ3bG9nID0gKHN0cnVjdCBmd2RlYnVnICopJndtaV9oYW5kbGUtPmRiZ2xvZzsKKwlzdHJ1Y3QgZGJnbG9nX3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzaXplX3Qgc2xvdF9sZW47CisKKwlpZiAoV0FSTl9PTihsZW5ndGggPiBBVEg2S0xfRldMT0dfUEFZTE9BRF9TSVpFKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzbG90X2xlbiA9IHNpemVvZigqc2xvdCkgKyBBVEg2S0xfRldMT0dfUEFZTE9BRF9TSVpFOworCisJc2tiID0gYWxsb2Nfc2tiKHNsb3RfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzbG90ID0gKHN0cnVjdCBkYmdsb2dfc2xvdCAqKXNrYl9wdXQoc2tiLCBzbG90X2xlbik7CisJc2xvdC0+ZGlhZ190eXBlID0gKEFfVUlOVDMyKSBESUFHX1RZUEVfRldfREVCVUdfTVNHOworCXNsb3QtPnRpbWVzdGFtcCA9IGNwdV90b19sZTMyKGppZmZpZXMpOworCXNsb3QtPmxlbmd0aCA9IGNwdV90b19sZTMyKGxlbmd0aCk7CisJc2xvdC0+ZHJvcHBlZCA9IGNwdV90b19sZTMyKGRyb3BwZWQpOworCW1lbWNweShzbG90LT5wYXlsb2FkLCBidWYsIGxlbmd0aCk7CisKKwkvKiBOZWVkIHRvIHBhZCBlYWNoIHJlY29yZCB0byBmaXhlZCBsZW5ndGggQVRINktMX0ZXTE9HX1BBWUxPQURfU0laRSAqLworCW1lbXNldChzbG90LT5wYXlsb2FkICsgbGVuZ3RoLCAwLCBBVEg2S0xfRldMT0dfUEFZTE9BRF9TSVpFIC0gbGVuZ3RoKTsKKworCXNwaW5fbG9jaygmZndsb2ctPmZ3bG9nX3F1ZXVlLmxvY2spOworCisJX19za2JfcXVldWVfdGFpbCgmZndsb2ctPmZ3bG9nX3F1ZXVlLCBza2IpOworCisJY29tcGxldGUoJmZ3bG9nLT5md2xvZ19jb21wbGV0aW9uKTsKKworCS8qIGRyb3Agb2xkZXN0IGVudHJpZXMgKi8KKwl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmZndsb2ctPmZ3bG9nX3F1ZXVlKSA+IEFUSDZLTF9GV0xPR19NQVhfRU5UUklFUykgeworCQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZmd2xvZy0+Zndsb2dfcXVldWUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlzcGluX3VubG9jaygmZndsb2ctPmZ3bG9nX3F1ZXVlLmxvY2spOworCisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYgLyogV0xBTl9PUEVOX1NPVVJDRSAqLworCisvKgorICogUGFja2FnZSB0aGUgZGF0YSBmcm9tIHRoZSBmdyBkaWFnIFdNSSBldmVudCBoYW5kbGVyLgorICogUGFzcyB0aGlzIGRhdGEgdG8gY25zcy1kaWFnIHNlcnZpY2UKKyAqLworaW50CitzZW5kX2Z3X2RpYWdfbmxfZGF0YSh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKwkJICAgICBBX1VJTlQzMiBsZW4sIEFfVUlOVDMyIGV2ZW50X3R5cGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9vdXQ7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJaW50IHJlcyA9IDA7CisKKwlpZiAoV0FSTl9PTihsZW4gPiBBVEg2S0xfRldMT0dfUEFZTE9BRF9TSVpFKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAobmxfc3J2X2lzX2luaXRpYWxpemVkKCkgIT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoY2RzX2lzX211bHRpY2FzdF9sb2dnaW5nKCkpIHsKKwkJc2tiX291dCA9IG5sbXNnX25ldyhsZW4sIDApOworCQlpZiAoIXNrYl9vdXQpIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgc2tiXG4iKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbmxoID0gbmxtc2dfcHV0KHNrYl9vdXQsIDAsIDAsIFdMQU5fTkxfTVNHX0NOU1NfRElBRywgbGVuLCAwKTsKKwkJbWVtY3B5KG5sbXNnX2RhdGEobmxoKSwgYnVmZmVyLCBsZW4pOworCisJCXJlcyA9IG5sX3Nydl9iY2FzdChza2Jfb3V0KTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfUlNWRDEsCisJCQkJCSgiJXM6IG5sX3Nydl9iY2FzdCBmYWlsZWQgMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIHJlcykpOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CitzZW5kX2RpYWdfbmV0bGlua19kYXRhKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgQV9VSU5UMzIgbGVuLCBBX1VJTlQzMiBjbWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9vdXQ7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJaW50IHJlcyA9IDA7CisJc3RydWN0IGRiZ2xvZ19zbG90ICpzbG90OworCXNpemVfdCBzbG90X2xlbjsKKworCWlmIChXQVJOX09OKGxlbiA+IEFUSDZLTF9GV0xPR19QQVlMT0FEX1NJWkUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChubF9zcnZfaXNfaW5pdGlhbGl6ZWQoKSAhPSAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChjZHNfaXNfbXVsdGljYXN0X2xvZ2dpbmcoKSkgeworCQlzbG90X2xlbiA9IHNpemVvZigqc2xvdCkgKyBBVEg2S0xfRldMT0dfUEFZTE9BRF9TSVpFOworCisJCXNrYl9vdXQgPSBubG1zZ19uZXcoc2xvdF9sZW4sIDApOworCQlpZiAoIXNrYl9vdXQpIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgc2tiXG4iKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlubGggPSBubG1zZ19wdXQoc2tiX291dCwgMCwgMCwgV0xBTl9OTF9NU0dfQ05TU19ESUFHLAorCQkJCXNsb3RfbGVuLCAwKTsKKwkJc2xvdCA9IChzdHJ1Y3QgZGJnbG9nX3Nsb3QgKilubG1zZ19kYXRhKG5saCk7CisJCXNsb3QtPmRpYWdfdHlwZSA9IGNtZDsKKwkJc2xvdC0+dGltZXN0YW1wID0gY3B1X3RvX2xlMzIoamlmZmllcyk7CisJCXNsb3QtPmxlbmd0aCA9IGNwdV90b19sZTMyKGxlbik7CisJCS8qIFZlcnNpb24gbWFwcGVkIHRvIGdldF92ZXJzaW9uIGhlcmUgKi8KKwkJc2xvdC0+ZHJvcHBlZCA9IGdldF92ZXJzaW9uOworCQltZW1jcHkoc2xvdC0+cGF5bG9hZCwgYnVmZmVyLCBsZW4pOworCisJCXJlcyA9IG5sX3Nydl9iY2FzdChza2Jfb3V0KTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfUlNWRDEsCisJCQkJCSgiJXM6IG5sX3Nydl9iY2FzdCBmYWlsZWQgMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIHJlcykpOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlyZXR1cm4gcmVzOworfQorCitpbnQKK2RiZ2xvZ19wcm9jZXNzX25ldGxpbmtfZGF0YSh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKwkJCSAgICBBX1VJTlQzMiBsZW4sIEFfVUlOVDMyIGRyb3BwZWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9vdXQ7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJaW50IHJlcyA9IDA7CisJc3RydWN0IGRiZ2xvZ19zbG90ICpzbG90OworCXNpemVfdCBzbG90X2xlbjsKKworCWlmIChXQVJOX09OKGxlbiA+IEFUSDZLTF9GV0xPR19QQVlMT0FEX1NJWkUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChubF9zcnZfaXNfaW5pdGlhbGl6ZWQoKSAhPSAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChjZHNfaXNfbXVsdGljYXN0X2xvZ2dpbmcoKSkgeworCQlzbG90X2xlbiA9IHNpemVvZigqc2xvdCkgKyBBVEg2S0xfRldMT0dfUEFZTE9BRF9TSVpFOworCisJCXNrYl9vdXQgPSBubG1zZ19uZXcoc2xvdF9sZW4sIDApOworCQlpZiAoIXNrYl9vdXQpIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgc2tiXG4iKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlubGggPSBubG1zZ19wdXQoc2tiX291dCwgMCwgMCwgV0xBTl9OTF9NU0dfQ05TU19ESUFHLAorCQkJCXNsb3RfbGVuLCAwKTsKKwkJc2xvdCA9IChzdHJ1Y3QgZGJnbG9nX3Nsb3QgKilubG1zZ19kYXRhKG5saCk7CisJCXNsb3QtPmRpYWdfdHlwZSA9IChBX1VJTlQzMikgRElBR19UWVBFX0ZXX0RFQlVHX01TRzsKKwkJc2xvdC0+dGltZXN0YW1wID0gY3B1X3RvX2xlMzIoamlmZmllcyk7CisJCXNsb3QtPmxlbmd0aCA9IGNwdV90b19sZTMyKGxlbik7CisJCXNsb3QtPmRyb3BwZWQgPSBjcHVfdG9fbGUzMihkcm9wcGVkKTsKKwkJbWVtY3B5KHNsb3QtPnBheWxvYWQsIGJ1ZmZlciwgbGVuKTsKKworCQlyZXMgPSBubF9zcnZfYmNhc3Qoc2tiX291dCk7CisJCWlmIChyZXMgPCAwKSB7CisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1JTVkQxLAorCQkJCQkoIiVzOiBubF9zcnZfdWNhc3QgZmFpbGVkIDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLCByZXMpKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwl9CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFdNSSBkaWFnIGRhdGEgZXZlbnQgaGFuZGxlciwgdGhpcyBmdW5jdGlvbiBpbnZva2VkIGFzIGEgQ0IKKyAqIHdoZW4gdGhlcmUgRElBR19FVkVOVCwgRElBR19NU0csIERJQUdfREJHIHRvIGJlCisgKiBmb3J3YXJkZWQgZnJvbSB0aGUgRlcuIFRoaXMgaXMgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqIHJlcGxhY2VtZW50IG9mIGZ3X2RiZyBhbmQgZGJnIG1lc3NhZ2VzCisgKi8KKworc3RhdGljIGludCBkaWFnX2Z3X2hhbmRsZXIob2xfc2NuX3Qgc2NuLCB1aW50OF90ICpkYXRhLCB1aW50MzJfdCBkYXRhbGVuKQoreworCisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgc2NuOworCXdtaXRsdl9jbWRfcGFyYW1faW5mbyAqcGFyYW1fYnVmOworCXVpbnQ4X3QgKmRhdGFwOworCXVpbnQzMl90IGxlbiA9IDA7CisJdWludDMyX3QgKmJ1ZmZlcjsKKworCWlmICghd21hKSB7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLCAoIk5VTEwgUG9pbnRlciBhc3NpZ25lZFxuIikpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIHdoZW4gZncgYXNzZXIgb2NjdXJzLGhvc3QgY2FuJ3QgdXNlIFRMViBmb3JtYXQuICovCisJaWYgKHdtYS0+aXNfZndfYXNzZXJ0KSB7CisJCWRhdGFwID0gZGF0YTsKKwkJbGVuID0gZGF0YWxlbjsKKwkJd21hLT5pc19md19hc3NlcnQgPSAwOworCX0gZWxzZSB7CisJCXBhcmFtX2J1ZiA9ICh3bWl0bHZfY21kX3BhcmFtX2luZm8gKikgZGF0YTsKKwkJaWYgKCFwYXJhbV9idWYpIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkoIkdldCBOVUxMIHBvaW50IG1lc3NhZ2UgZnJvbSBGV1xuIikpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcGFyYW1fYnVmID0gKHdtaXRsdl9jbWRfcGFyYW1faW5mbyAqKSBkYXRhOworCQlkYXRhcCA9IHBhcmFtX2J1Zi0+dGx2X3B0cjsKKwkJbGVuID0gcGFyYW1fYnVmLT5udW1fZWxlbWVudHM7CisJCWlmICghZ2V0X3ZlcnNpb24pIHsKKwkJCWJ1ZmZlciA9ICh1aW50MzJfdCAqKSBkYXRhcDsKKwkJCWJ1ZmZlcisrOyAgICAgICAvKiBza2lwIG9mZnNldCAqLworCQkJaWYgKFdMQU5fRElBR19UWVBFX0NPTkZJRyA9PSBESUFHX0dFVF9UWVBFKCpidWZmZXIpKSB7CisJCQkJYnVmZmVyKys7ICAgICAgIC8qIHNraXAgICovCisJCQkJaWYgKERJQUdfVkVSU0lPTl9JTkZPID09IERJQUdfR0VUX0lEKCpidWZmZXIpKSB7CisJCQkJCWJ1ZmZlcisrOyAgICAgICAvKiBza2lwICAqLworCQkJCQkvKiBnZXQgcGF5bG9hZCAqLworCQkJCQlnZXRfdmVyc2lvbiA9ICpidWZmZXI7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChkYmdsb2dfcHJvY2Vzc190eXBlID09IERCR0xPR19QUk9DRVNTX1BSSU5UX1JBVykgeworCQlpZiAoIWdwcmludF9saW1pdGVyKSB7CisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwgKCJOT1QgU3VwcG9ydGVkIgorCQkJCQkJCSIgb25seSBzdXBwb3J0cyBuZXQgbGluayBzb2NrZXRcbiIpKTsKKwkJCWdwcmludF9saW1pdGVyID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGJnbG9nX3Byb2Nlc3NfdHlwZSA9PSBEQkdMT0dfUFJPQ0VTU19ORVRfUkFXKSB7CisJCXJldHVybiBzZW5kX2RpYWdfbmV0bGlua19kYXRhKChBX1VJTlQ4ICopIGRhdGFwLAorCQkJCQkgICAgICBsZW4sIERJQUdfVFlQRV9GV19NU0cpOworCX0KKyNpZmRlZiBXTEFOX09QRU5fU09VUkNFCisJaWYgKGRiZ2xvZ19wcm9jZXNzX3R5cGUgPT0gREJHTE9HX1BST0NFU1NfUE9PTF9SQVcpIHsKKwkJaWYgKCFncHJpbnRfbGltaXRlcikgeworCQkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsICgiTk9UIFN1cHBvcnRlZCIKKwkJCQkJCQkiIG9ubHkgc3VwcG9ydHMgbmV0IGxpbmsgc29ja2V0XG4iKSk7CisJCQlncHJpbnRfbGltaXRlciA9IHRydWU7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmIC8qIFdMQU5fT1BFTl9TT1VSQ0UgKi8KKwlpZiAoIWdwcmludF9saW1pdGVyKSB7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLCAoIk5PVCBTdXBwb3J0ZWQiCisJCQkJCQkiIG9ubHkgc3VwcG9ydHMgbmV0IGxpbmsgc29ja2V0XG4iKSk7CisJCWdwcmludF9saW1pdGVyID0gdHJ1ZTsKKwl9CisJLyogQWx3YXlzIHJldHVybnMgemVybyAqLworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBXTUkgZGlhZyBkYXRhIGV2ZW50IGhhbmRsZXIsIHRoaXMgZnVuY3Rpb24gaW52b2tlZCBhcyBhIENCCisgKiB3aGVuIHRoZXJlIERJQUdfREFUQSB0byBiZSBmb3J3YXJkZWQgZnJvbSB0aGUgRlcuCisgKi8KKworaW50IGZ3X2RpYWdfZGF0YV9ldmVudF9oYW5kbGVyKG9sX3Njbl90IHNjbiwgdWludDhfdCAqZGF0YSwgdWludDMyX3QgZGF0YWxlbikKK3sKKworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIHNjbjsKKwlzdHJ1Y3Qgd2xhbl9kaWFnX2RhdGEgKmRpYWdfZGF0YTsKKwlXTUlfRElBR19EQVRBX0NPTlRBSU5FUl9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfZGlhZ19kYXRhX2NvbnRhaW5lcl9ldmVudF9maXhlZF9wYXJhbSAqZml4ZWRfcGFyYW07CisJdWludDhfdCAqZGF0YXA7CisJdWludDMyX3QgbnVtX2RhdGEgPSAwOyAgLyogVG90YWwgZXZlbnRzICovCisJdWludDMyX3QgZGlhZ19kYXRhX2xlbiA9IDA7ICAgICAvKiBlYWNoIGZ3IGRpYWcgcGF5bG9hZCAqLworCXVpbnQzMl90IGRpYWdfdHlwZSA9IDA7CisJdWludDMyX3QgaSA9IDA7CisJdWludDMyX3QgbmxfZGF0YV9sZW4gPSAwOyAgICAgICAvKiBkaWFnIGhkciArIHBheWxvYWQgKi8KKworCXBhcmFtX2J1ZiA9IChXTUlfRElBR19EQVRBX0NPTlRBSU5FUl9FVkVOVElEX3BhcmFtX3RsdnMgKikgZGF0YTsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkoIkdvdCBOVUxMIHBvaW50IG1lc3NhZ2UgZnJvbSBGV1xuIikpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCF3bWEpIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19FUlIsICgiTlVMTCBQb2ludGVyIGFzc2lnbmVkXG4iKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmaXhlZF9wYXJhbSA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJbnVtX2RhdGEgPSBwYXJhbV9idWYtPm51bV9idWZwOworCisJZGF0YXAgPSAodWludDhfdCAqKSBwYXJhbV9idWYtPmJ1ZnA7CisKKwkvKiBJZiBjbnNzLWRpYWcgc2VydmljZSBzdGFydGVkIHRyaWdnZXJlZCBkdXJpbmcgdGhlIGluaXQgb2Ygc2VydmljZXMgKi8KKwlpZiAoYXBwc3RhcnRlZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2RhdGE7IGkrKykgeworCQkJZGlhZ19kYXRhID0gKHN0cnVjdCB3bGFuX2RpYWdfZGF0YSAqKWRhdGFwOworCQkJZGlhZ190eXBlID0gV0xBTl9ESUFHXzBfVFlQRV9HRVQoZGlhZ19kYXRhLT53b3JkMCk7CisJCQlkaWFnX2RhdGFfbGVuID0gV0xBTl9ESUFHXzBfTEVOX0dFVChkaWFnX2RhdGEtPndvcmQwKTsKKworCQkJLyogTGVuZ3RoIG9mIGRpYWcgc3RydWN0IGFuZCBsZW4gb2YgcGF5bG9hZCAqLworCQkJbmxfZGF0YV9sZW4gPQorCQkJCXNpemVvZihzdHJ1Y3Qgd2xhbl9kaWFnX2RhdGEpICsgZGlhZ19kYXRhX2xlbjsKKyNpZiAwCisJCQlwcmludF9oZXhfZHVtcF9ieXRlcygicGF5bG9hZDogIiwgRFVNUF9QUkVGSVhfQUREUkVTUywKKwkJCQkJICAgICBkaWFnX2RhdGEtPnBheWxvYWQsIGRpYWdfZGF0YV9sZW4pOworI2VuZGlmCisJCQlzd2l0Y2ggKGRpYWdfdHlwZSkgeworCQkJY2FzZSBESUFHX1RZUEVfRldfRVZFTlQ6CisJCQkJcmV0dXJuIHNlbmRfZndfZGlhZ19ubF9kYXRhKCh3bWlfdW5pZmllZF90KQorCQkJCQkJCSAgICB3bWEtPndtaV9oYW5kbGUsCisJCQkJCQkJICAgIGRhdGFwLCBubF9kYXRhX2xlbiwKKwkJCQkJCQkgICAgZGlhZ190eXBlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRElBR19UWVBFX0ZXX0xPRzoKKwkJCQlyZXR1cm4gc2VuZF9md19kaWFnX25sX2RhdGEoKHdtaV91bmlmaWVkX3QpCisJCQkJCQkJICAgIHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJCQkgICAgZGF0YXAsIG5sX2RhdGFfbGVuLAorCQkJCQkJCSAgICBkaWFnX3R5cGUpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogTW92ZSB0byB0aGUgbmV4dCBldmVudCBhbmQgc2VuZCB0byBjbnNzLWRpYWcgKi8KKwkJCWRhdGFwICs9IG5sX2RhdGFfbGVuOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgZGJnbG9nX3BhcnNlX2RlYnVnX2xvZ3Mob2xfc2NuX3Qgc2NuLCB1aW50OF90ICpkYXRhLCB1aW50MzJfdCBkYXRhbGVuKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIHNjbjsKKwlBX1VJTlQzMiBjb3VudDsKKwlBX1VJTlQzMiAqYnVmZmVyOworCUFfVUlOVDMyIHRpbWVzdGFtcDsKKwlBX1VJTlQzMiBkZWJ1Z2lkOworCUFfVUlOVDMyIG1vZHVsZWlkOworCUFfVUlOVDE2IHZhcGlkOworCUFfVUlOVDE2IG51bWFyZ3M7CisJY2RmX3NpemVfdCBsZW5ndGg7CisJQV9VSU5UMzIgZHJvcHBlZDsKKwlXTUlfREVCVUdfTUVTR19FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl1aW50OF90ICpkYXRhcDsKKwl1aW50MzJfdCBsZW47CisKKwlpZiAoIXdtYSkgeworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwgKCJOVUxMIFBvaW50ZXIgYXNzaWduZWRcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKndoZW4gZncgYXNzZXIgb2NjdXJzLGhvc3QgY2FuJ3QgdXNlIFRMViBmb3JtYXQuICovCisJaWYgKHdtYS0+aXNfZndfYXNzZXJ0KSB7CisJCWRhdGFwID0gZGF0YTsKKwkJbGVuID0gZGF0YWxlbjsKKwkJd21hLT5pc19md19hc3NlcnQgPSAwOworCX0gZWxzZSB7CisJCXBhcmFtX2J1ZiA9IChXTUlfREVCVUdfTUVTR19FVkVOVElEX3BhcmFtX3RsdnMgKikgZGF0YTsKKwkJaWYgKCFwYXJhbV9idWYpIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCQkoIkdldCBOVUxMIHBvaW50IG1lc3NhZ2UgZnJvbSBGV1xuIikpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJZGF0YXAgPSBwYXJhbV9idWYtPmJ1ZnA7CisJCWxlbiA9IHBhcmFtX2J1Zi0+bnVtX2J1ZnA7CisJfQorCisJZHJvcHBlZCA9ICooKEFfVUlOVDMyICopIGRhdGFwKTsKKwlpZiAoZHJvcHBlZCA+IDApIHsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTkZPLAorCQkJCSgiJWQgbG9nIGJ1ZmZlcnMgYXJlIGRyb3BwZWQgXG4iLCBkcm9wcGVkKSk7CisJfQorCWRhdGFwICs9IHNpemVvZihkcm9wcGVkKTsKKwlsZW4gLT0gc2l6ZW9mKGRyb3BwZWQpOworCisJY291bnQgPSAwOworCWJ1ZmZlciA9IChBX1VJTlQzMiAqKSBkYXRhcDsKKwlsZW5ndGggPSAobGVuID4+IDIpOworCisJaWYgKGRiZ2xvZ19wcm9jZXNzX3R5cGUgPT0gREJHTE9HX1BST0NFU1NfUFJJTlRfUkFXKSB7CisJCXJldHVybiBkYmdsb2dfcHJpbnRfcmF3X2RhdGEoYnVmZmVyLCBsZW5ndGgpOworCX0KKworCWlmIChkYmdsb2dfcHJvY2Vzc190eXBlID09IERCR0xPR19QUk9DRVNTX05FVF9SQVcpIHsKKwkJaWYgKGFwcHN0YXJ0ZWQpIHsKKwkJCXJldHVybiBkYmdsb2dfcHJvY2Vzc19uZXRsaW5rX2RhdGEoKHdtaV91bmlmaWVkX3QpIHdtYS0+CisJCQkJCQkJICAgd21pX2hhbmRsZSwKKwkJCQkJCQkgICAoQV9VSU5UOCAqKSBidWZmZXIsCisJCQkJCQkJICAgbGVuLCBkcm9wcGVkKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisKKwl9CisjaWZkZWYgV0xBTl9PUEVOX1NPVVJDRQorCWlmIChkYmdsb2dfcHJvY2Vzc190eXBlID09IERCR0xPR19QUk9DRVNTX1BPT0xfUkFXKSB7CisJCXJldHVybiBkYmdsb2dfZGVidWdmc19yYXdfZGF0YSgod21pX3VuaWZpZWRfdCkgd21hLT53bWlfaGFuZGxlLAorCQkJCQkgICAgICAgKEFfVUlOVDggKikgYnVmZmVyLCBsZW4sCisJCQkJCSAgICAgICBkcm9wcGVkKTsKKwl9CisjZW5kaWYgLyogV0xBTl9PUEVOX1NPVVJDRSAqLworCisJd2hpbGUgKChjb3VudCArIDIpIDwgbGVuZ3RoKSB7CisJCXRpbWVzdGFtcCA9IERCR0xPR19HRVRfVElNRV9TVEFNUChidWZmZXJbY291bnRdKTsKKwkJZGVidWdpZCA9IERCR0xPR19HRVRfREJHSUQoYnVmZmVyW2NvdW50ICsgMV0pOworCQltb2R1bGVpZCA9IERCR0xPR19HRVRfTU9EVUxFSUQoYnVmZmVyW2NvdW50ICsgMV0pOworCQl2YXBpZCA9IERCR0xPR19HRVRfVkRFVklEKGJ1ZmZlcltjb3VudCArIDFdKTsKKwkJbnVtYXJncyA9IERCR0xPR19HRVRfTlVNQVJHUyhidWZmZXJbY291bnQgKyAxXSk7CisKKwkJaWYgKChjb3VudCArIDIgKyBudW1hcmdzKSA+IGxlbmd0aCkKKwkJCXJldHVybiAwOworCisJCWlmIChtb2R1bGVpZCA+PSBXTEFOX01PRFVMRV9JRF9NQVgpCisJCQlyZXR1cm4gMDsKKworCQlpZiAobW9kX3ByaW50W21vZHVsZWlkXSA9PSBOVUxMKSB7CisJCQkvKiBObyBtb2R1bGUgc3BlY2lmaWMgbG9nIHJlZ2lzdGVyZWQgdXNlIHRoZSBkZWZhdWx0IGhhbmRsZXIgKi8KKwkJCWRiZ2xvZ19kZWZhdWx0X3ByaW50X2hhbmRsZXIobW9kdWxlaWQsIHZhcGlkLCBkZWJ1Z2lkLAorCQkJCQkJICAgICB0aW1lc3RhbXAsIG51bWFyZ3MsCisJCQkJCQkgICAgICgoKEFfVUlOVDMyICopIGJ1ZmZlcikgKworCQkJCQkJICAgICAgMiArIGNvdW50KSk7CisJCX0gZWxzZSB7CisJCQlpZiAoIQorCQkJICAgIChtb2RfcHJpbnRbbW9kdWxlaWRdCisJCQkJICAgICAobW9kdWxlaWQsIHZhcGlkLCBkZWJ1Z2lkLCB0aW1lc3RhbXAsIG51bWFyZ3MsCisJCQkJICAgICAoKChBX1VJTlQzMiAqKSBidWZmZXIpICsgMiArIGNvdW50KSkpKSB7CisJCQkJLyogVGhlIG1lc3NhZ2UgaXMgbm90IGhhbmRsZWQgYnkgdGhlIG1vZHVsZSBzcGVjaWZpYyBoYW5kbGVyICovCisJCQkJZGJnbG9nX2RlZmF1bHRfcHJpbnRfaGFuZGxlcihtb2R1bGVpZCwgdmFwaWQsCisJCQkJCQkJICAgICBkZWJ1Z2lkLCB0aW1lc3RhbXAsCisJCQkJCQkJICAgICBudW1hcmdzLAorCQkJCQkJCSAgICAgKCgoQV9VSU5UMzIgKikKKwkJCQkJCQkgICAgICAgYnVmZmVyKSArIDIgKworCQkJCQkJCSAgICAgIGNvdW50KSk7CisKKwkJCX0KKwkJfQorCisJCWNvdW50ICs9IG51bWFyZ3MgKyAyOyAgIC8qIDMyIGJpdCBUaW1lIHN0YW1wICsgMzIgYml0IERiZyBoZWFkZXIgKi8KKwl9CisJLyogQWx3YXlzIHJldHVybnMgemVybyAqLworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQgZGJnbG9nX3JlZ19tb2RwcmludChBX1VJTlQzMiBtb2RfaWQsIG1vZHVsZV9kYmdfcHJpbnQgcHJpbnRmbikKK3sKKwlpZiAoIW1vZF9wcmludFttb2RfaWRdKSB7CisJCW1vZF9wcmludFttb2RfaWRdID0gcHJpbnRmbjsKKwl9IGVsc2UgeworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0lORk8sCisJCQkJKCJtb2R1bGUgcHJpbnQgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGlzIG1vZHVsZSAlZFxuIiwKKwkJCQkgbW9kX2lkKSk7CisJfQorfQorCit2b2lkCitkYmdsb2dfc21fcHJpbnQoQV9VSU5UMzIgdGltZXN0YW1wLAorCQlBX1VJTlQxNiB2YXBfaWQsCisJCUFfVUlOVDE2IG51bWFyZ3MsCisJCUFfVUlOVDMyICphcmdzLAorCQljb25zdCBjaGFyICptb2R1bGVfcHJlZml4LAorCQljb25zdCBjaGFyICpzdGF0ZXNbXSwgQV9VSU5UMzIgbnVtX3N0YXRlcywKKwkJY29uc3QgY2hhciAqZXZlbnRzW10sIEFfVUlOVDMyIG51bV9ldmVudHMpCit7CisJQV9VSU5UOCB0eXBlLCBhcmcxLCBhcmcyLCBhcmczOworCUFfVUlOVDMyIGV4dHJhLCBleHRyYTIsIGV4dHJhMzsKKworCWlmIChudW1hcmdzICE9IDQpIHsKKwkJcmV0dXJuOworCX0KKworCXR5cGUgPSAoYXJnc1swXSA+PiAyNCkgJiAweGZmOworCWFyZzEgPSAoYXJnc1swXSA+PiAxNikgJiAweGZmOworCWFyZzIgPSAoYXJnc1swXSA+PiA4KSAmIDB4ZmY7CisJYXJnMyA9IChhcmdzWzBdID4+IDApICYgMHhmZjsKKworCWV4dHJhID0gYXJnc1sxXTsKKwlleHRyYTIgPSBhcmdzWzJdOworCWV4dHJhMyA9IGFyZ3NbM107CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIDA6ICAgICAgICAgLyogc3RhdGUgdHJhbnNpdGlvbiAqLworCQlpZiAoYXJnMSA8IG51bV9zdGF0ZXMgJiYgYXJnMiA8IG51bV9zdGF0ZXMpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIiVzOiAlcyA9PiAlcyAoJSN4LCAlI3gsICUjeCkiLAorCQkJCSAgICAgIG1vZHVsZV9wcmVmaXgsIHN0YXRlc1thcmcxXSwgc3RhdGVzW2FyZzJdLAorCQkJCSAgICAgIGV4dHJhLCBleHRyYTIsIGV4dHJhMyk7CisJCX0gZWxzZSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICIlczogJXUgPT4gJXUgKCUjeCwgJSN4LCAlI3gpIiwKKwkJCQkgICAgICBtb2R1bGVfcHJlZml4LCBhcmcxLCBhcmcyLCBleHRyYSwgZXh0cmEyLAorCQkJCSAgICAgIGV4dHJhMyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxOiAgICAgICAgIC8qIGRpc3BhdGNoIGV2ZW50ICovCisJCWlmIChhcmcxIDwgbnVtX3N0YXRlcyAmJiBhcmcyIDwgbnVtX2V2ZW50cykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiJXM6ICVzIDwgJXMgKCUjeCwgJSN4LCAlI3gpIiwKKwkJCQkgICAgICBtb2R1bGVfcHJlZml4LCBzdGF0ZXNbYXJnMV0sIGV2ZW50c1thcmcyXSwKKwkJCQkgICAgICBleHRyYSwgZXh0cmEyLCBleHRyYTMpOworCQl9IGVsc2UgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiJXM6ICV1IDwgJXUgKCUjeCwgJSN4LCAlI3gpIiwKKwkJCQkgICAgICBtb2R1bGVfcHJlZml4LCBhcmcxLCBhcmcyLCBleHRyYSwgZXh0cmEyLAorCQkJCSAgICAgIGV4dHJhMyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOiAgICAgICAgIC8qIHdhcm5pbmcgKi8KKwkJc3dpdGNoIChhcmcxKSB7CisJCWNhc2UgMDogLyogdW5oYW5kbGVkIGV2ZW50ICovCisJCQlpZiAoYXJnMiA8IG51bV9zdGF0ZXMgJiYgYXJnMyA8IG51bV9ldmVudHMpIHsKKwkJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCQkgICAgICAiJXM6IHVuaGFuZGxlZCBldmVudCAlcyBpbiBzdGF0ZSAlcyAoJSN4LCAlI3gsICUjeCkiLAorCQkJCQkgICAgICBtb2R1bGVfcHJlZml4LCBldmVudHNbYXJnM10sCisJCQkJCSAgICAgIHN0YXRlc1thcmcyXSwgZXh0cmEsIGV4dHJhMiwKKwkJCQkJICAgICAgZXh0cmEzKTsKKwkJCX0gZWxzZSB7CisJCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkJICAgICAgIiVzOiB1bmhhbmRsZWQgZXZlbnQgJXUgaW4gc3RhdGUgJXUgKCUjeCwgJSN4LCAlI3gpIiwKKwkJCQkJICAgICAgbW9kdWxlX3ByZWZpeCwgYXJnMywgYXJnMiwgZXh0cmEsCisJCQkJCSAgICAgIGV4dHJhMiwgZXh0cmEzKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisKKwkJfQorCQlicmVhazsKKwl9Cit9CisKK0FfQk9PTAorZGJnbG9nX3N0YV9wb3dlcnNhdmVfcHJpbnRfaGFuZGxlcihBX1VJTlQzMiBtb2RfaWQsCisJCQkJICAgQV9VSU5UMTYgdmFwX2lkLAorCQkJCSAgIEFfVUlOVDMyIGRiZ19pZCwKKwkJCQkgICBBX1VJTlQzMiB0aW1lc3RhbXAsCisJCQkJICAgQV9VSU5UMTYgbnVtYXJncywgQV9VSU5UMzIgKmFyZ3MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRlc1tdID0geworCQkiSURMRSIsCisJCSJBQ1RJVkUiLAorCQkiU0xFRVBfVFhRX0ZMVVNIIiwKKwkJIlNMRUVQX1RYX1NFTlQiLAorCQkiUEFVU0UiLAorCQkiU0xFRVBfRE9aRSIsCisJCSJTTEVFUF9BV0FLRSIsCisJCSJBQ1RJVkVfVFhRX0ZMVVNIIiwKKwkJIkFDVElWRV9UWF9TRU5UIiwKKwkJIlBBVVNFX1RYUV9GTFVTSCIsCisJCSJQQVVTRV9UWF9TRU5UIiwKKwkJIklETEVfVFhRX0ZMVVNIIiwKKwkJIklETEVfVFhfU0VOVCIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICpldmVudHNbXSA9IHsKKwkJIlNUQVJUIiwKKwkJIlNUT1AiLAorCQkiUEFVU0UiLAorCQkiVU5QQVVTRSIsCisJCSJUSU0iLAorCQkiRFRJTSIsCisJCSJTRU5EX0NPTVBMRVRFIiwKKwkJIlBSRV9TRU5EIiwKKwkJIlJYIiwKKwkJIkhXUV9FTVBUWSIsCisJCSJQQVVTRV9USU1FT1VUIiwKKwkJIlRYUlhfSU5BQ1RJVklUWV9USU1FT1VUIiwKKwkJIlBTUE9MTF9USU1FT1VUIiwKKwkJIlVBUFNEX1RJTUVPVVQiLAorCQkiREVMQVlFRF9TTEVFUF9USU1FT1VUIiwKKwkJIlNFTkRfTl9DT01QTEVURSIsCisJCSJUSURRX1BBVVNFX0NPTVBMRVRFIiwKKwkJIlNFTkRfUFNQT0xMIiwKKwkJIlNFTkRfU1BFQ19QU1BPTEwiLAorCX07CisKKwlzd2l0Y2ggKGRiZ19pZCkgeworCWNhc2UgREJHTE9HX0RCR0lEX1NNX0ZSQU1FV09SS19QUk9YWV9EQkdMT0dfTVNHOgorCQlkYmdsb2dfc21fcHJpbnQodGltZXN0YW1wLCB2YXBfaWQsIG51bWFyZ3MsIGFyZ3MsICJTVEEgUFMiLAorCQkJCXN0YXRlcywgQ0RGX0FSUkFZX1NJWkUoc3RhdGVzKSwgZXZlbnRzLAorCQkJCUNERl9BUlJBWV9TSVpFKGV2ZW50cykpOworCQlicmVhazsKKwljYXNlIFBTX1NUQV9QTV9BUkJfUkVRVUVTVDoKKwkJaWYgKG51bWFyZ3MgPT0gNCkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiUE0gQVJCIHJlcXVlc3QgZmxhZ3M9JXgsIGxhc3RfdGltZT0leCAlczogJXMiLAorCQkJCSAgICAgIGFyZ3NbMV0sIGFyZ3NbMl0sCisJCQkJICAgICAgZGJnbG9nX2dldF9tb2R1bGVfc3RyKGFyZ3NbMF0pLAorCQkJCSAgICAgIGFyZ3NbM10gPyAiU0xFRVAiIDogIldBS0UiKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBTX1NUQV9ERUxJVkVSX0VWRU5UOgorCQlpZiAobnVtYXJncyA9PSAyKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLCAiU1RBIFBTOiAlcyAlcyIsCisJCQkJICAgICAgKGFyZ3NbMF0gPT0gMCA/ICJQQVVTRV9DT01QTEVURSIgOgorCQkJCSAgICAgICAoYXJnc1swXSA9PSAxID8gIlVOUEFVU0VfQ09NUExFVEUiIDoKKwkJCQkJKGFyZ3NbMF0gPT0gMiA/ICJTTEVFUCIgOgorCQkJCQkgKGFyZ3NbMF0gPT0KKwkJCQkJICAzID8gIkFXQUtFIiA6ICJVTktOT1dOIikpKSksCisJCQkJICAgICAgKGFyZ3NbMV0gPT0KKwkJCQkgICAgICAgMCA/ICJTVUNDRVNTIiA6IChhcmdzWzFdID09CisJCQkJCQkJMSA/ICJUWFFfRkxVU0hfVElNRU9VVCIKKwkJCQkJCQk6IChhcmdzWzFdID09CisJCQkJCQkJICAgMiA/ICJOT19BQ0siCisJCQkJCQkJICAgOiAoYXJnc1sxXSA9PQorCQkJCQkJCSAgICAgIDMgPworCQkJCQkJCSAgICAgICJSWF9MRUFLX1RJTUVPVVQiCisJCQkJCQkJICAgICAgOiAoYXJnc1sxXSA9PQorCQkJCQkJCQkgNCA/CisJCQkJCQkJCSAiUFNQT0xMX1VBUFNEX0JVU1lfVElNRU9VVCIKKwkJCQkJCQkJIDoKKwkJCQkJCQkJICJVTktOT1dOIikpKSkpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBTX1NUQV9QU1BPTExfU0VRX0RPTkU6CisJCWlmIChudW1hcmdzID09IDUpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIlNUQSBQUyBwb2xsOiBxdWV1ZT0ldSBjb21wPSV1IHJzcD0ldSByc3BfZHVyPSV1IGZjPSV4IHFvcz0leCAlcyIsCisJCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwKKwkJCQkgICAgICAoYXJnc1s0XSA+PiAxNikgJiAweGZmZmYsCisJCQkJICAgICAgKGFyZ3NbNF0gPj4gOCkgJiAweGZmLAorCQkJCSAgICAgIChhcmdzWzRdICYgMHhmZikgPT0KKwkJCQkgICAgICAwID8gIlNVQ0NFU1MiIDogKGFyZ3NbNF0gJiAweGZmKSA9PQorCQkJCSAgICAgIDEgPyAiTk9fQUNLIiA6IChhcmdzWzRdICYgMHhmZikgPT0KKwkJCQkgICAgICAyID8gIkRST1BQRUQiIDogKGFyZ3NbNF0gJiAweGZmKSA9PQorCQkJCSAgICAgIDMgPyAiRklMVEVSRUQiIDogKGFyZ3NbNF0gJiAweGZmKSA9PQorCQkJCSAgICAgIDQgPyAiUlNQX1RJTUVPVVQiIDogIlVOS05PV04iKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBTX1NUQV9DT0VYX01PREU6CisJCWlmIChudW1hcmdzID09IDEpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsICJTVEEgUFMgQ09FWCBNT0RFICVzIiwKKwkJCQkgICAgICBhcmdzWzBdID8gIkVOQUJMRUQiIDogIkRJU0FCTEVEIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQU19TVEFfUFNQT0xMX0FMTE9XOgorCQlpZiAobnVtYXJncyA9PSAzKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJTVEEgUFMtUG9sbCAlcyBmbGFncz0leCB0aW1lPSV1IiwKKwkJCQkgICAgICBhcmdzWzBdID8gIkFMTE9XIiA6ICJESVNBTExPVyIsIGFyZ3NbMV0sCisJCQkJICAgICAgYXJnc1syXSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQU19TVEFfU0VUX1BBUkFNOgorCQlpZiAobnVtYXJncyA9PSAyKSB7CisJCQlzdHJ1Y3QgeworCQkJCWNoYXIgKm5hbWU7CisJCQkJaW50IGlzX3RpbWVfcGFyYW07CisJCQl9IHBhcmFtc1tdID0geworCQkJCXsKKwkJCQkJIk1BWF9TTEVFUF9BVFRFTVBUUyIsIDAKKwkJCQl9LCB7CisJCQkJCSJERUxBWUVEX1NMRUVQIiwgMQorCQkJCX0sIHsKKwkJCQkJIlRYUlhfSU5BQ1RJVklUWSIsIDEKKwkJCQl9LCB7CisJCQkJCSJNQVhfVFhfQkVGT1JFX1dBS0UiLCAwCisJCQkJfSwgeworCQkJCQkiVUFQU0RfVElNRU9VVCIsIDEKKwkJCQl9LCB7CisJCQkJCSJVQVBTRF9DT05GSUciLCAwCisJCQkJfSwgeworCQkJCQkiUFNQT0xMX1JFU1BPTlNFX1RJTUVPVVQiLCAxCisJCQkJfSwgeworCQkJCQkiTUFYX1BTUE9MTF9CRUZPUkVfV0FLRSIsIDAKKwkJCQl9LCB7CisJCQkJCSJSWF9XQUtFX1BPTElDWSIsIDAKKwkJCQl9LCB7CisJCQkJCSJERUxBWUVEX1BBVVNFX1JYX0xFQUsiLCAxCisJCQkJfSwgeworCQkJCQkiVFhSWF9JTkFDVElWSVRZX0JMT0NLRURfUkVUUlkiLCAxCisJCQkJfSwgeworCQkJCQkiU1BFQ19XQUtFX0lOVEVSVkFMIiwgMQorCQkJCX0sIHsKKwkJCQkJIk1BWF9TUEVDX05PREFUQV9QU1BPTEwiLCAwCisJCQkJfSwgeworCQkJCQkiRVNUSU1BVEVEX1BTUE9MTF9SRVNQX1RJTUUiLCAxCisJCQkJfSwgeworCQkJCQkiUVBPV0VSX01BWF9QU1BPTExfQkVGT1JFX1dBS0UiLCAwCisJCQkJfSwgeworCQkJCQkiUVBPV0VSX0VOQUJMRSIsIDAKKwkJCQl9LAorCQkJfTsKKwkJCUFfVUlOVDMyIHBhcmFtID0gYXJnc1swXTsKKwkJCUFfVUlOVDMyIHZhbHVlID0gYXJnc1sxXTsKKworCQkJaWYgKHBhcmFtIDwgQ0RGX0FSUkFZX1NJWkUocGFyYW1zKSkgeworCQkJCWlmIChwYXJhbXNbcGFyYW1dLmlzX3RpbWVfcGFyYW0pIHsKKwkJCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkJCSAgICAgICJTVEEgUFMgU0VUX1BBUkFNICVzID0+ICV1ICh1cykiLAorCQkJCQkJICAgICAgcGFyYW1zW3BhcmFtXS5uYW1lLAorCQkJCQkJICAgICAgdmFsdWUpOworCQkJCX0gZWxzZSB7CisJCQkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJCQkgICAgICAiU1RBIFBTIFNFVF9QQVJBTSAlcyA9PiAlI3giLAorCQkJCQkJICAgICAgcGFyYW1zW3BhcmFtXS5uYW1lLAorCQkJCQkJICAgICAgdmFsdWUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkJICAgICAgIlNUQSBQUyBTRVRfUEFSQU0gJXggPT4gJSN4IiwKKwkJCQkJICAgICAgcGFyYW0sIHZhbHVlKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFBTX1NUQV9TUEVDUE9MTF9USU1FUl9TVEFSVEVEOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIlNQRUMgUG9sbCBUaW1lciBTdGFydGVkOiBCZWFjb24gdGltZSBSZW1haW5pbmc6JWQgd2FrZXVwIGludGVydmFsOiVkIiwKKwkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0pOworCQlicmVhazsKKwljYXNlIFBTX1NUQV9TUEVDUE9MTF9USU1FUl9TVE9QUEVEOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLCAiU1BFQyBQb2xsIFRpbWVyIFN0b3BwZWQiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKiBJQlNTIFBTIHN1YiBtb2R1bGVzICovCitlbnVtIHdsYW5faWJzc19wc19zdWJfbW9kdWxlIHsKKwlXTEFOX0lCU1NfUFNfU1VCX01PRFVMRV9JQlNTX05XX1NNID0gMCwKKwlXTEFOX0lCU1NfUFNfU1VCX01PRFVMRV9JQlNTX1NFTEZfUFMgPSAxLAorCVdMQU5fSUJTU19QU19TVUJfTU9EVUxFX0lCU1NfUEVFUl9QUyA9IDIsCisJV0xBTl9JQlNTX1BTX1NVQl9NT0RVTEVfTUFYID0gMywKK307CisKKyNkZWZpbmUgV0xBTl9JQlNTX1BTX1NVQl9NT0RVTEVfT0ZGU0VUICAweDFFCisKK0FfQk9PTAorZGJnbG9nX2lic3NfcG93ZXJzYXZlX3ByaW50X2hhbmRsZXIoQV9VSU5UMzIgbW9kX2lkLAorCQkJCSAgICBBX1VJTlQxNiB2YXBfaWQsCisJCQkJICAgIEFfVUlOVDMyIGRiZ19pZCwKKwkJCQkgICAgQV9VSU5UMzIgdGltZXN0YW1wLAorCQkJCSAgICBBX1VJTlQxNiBudW1hcmdzLCBBX1VJTlQzMiAqYXJncykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqbndfc3RhdGVzW10gPSB7CisJCSJXQUlUX0ZPUl9UQlRUIiwKKwkJIkFUSU1fV0lORE9XX1BSRV9CQ04iLAorCQkiQVRJTV9XSU5ET1dfUE9TVF9CQ04iLAorCQkiT1VUX09GX0FUSU1fV0lORE9XIiwKKwkJIlBBVVNFX1BFTkRJTkciLAorCQkiUEFVU0VEIiwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKnBzX3N0YXRlc1tdID0geworCQkiQUNUSVZFIiwKKwkJIlNMRUVQX1RYX1NFTkQiLAorCQkiU0xFRVBfRE9aRV9QQVVTRV9QRU5ESU5HIiwKKwkJIlNMRUVQX0RPWkUiLAorCQkiU0xFRVBfQVdBS0UiLAorCQkiQUNUSVZFX1RYX1NFTkQiLAorCQkiUEFVU0VfVFhfU0VORCIsCisJCSJQQVVTRUQiLAorCX07CisKKwlzdGF0aWMgY29uc3QgY2hhciAqcGVlcl9wc19zdGF0ZXNbXSA9IHsKKwkJIkFDVElWRSIsCisJCSJTTEVFUF9BV0FLRSIsCisJCSJTTEVFUF9ET1pFIiwKKwkJIlBTX1VOS05PV04iLAorCX07CisKKwlzdGF0aWMgY29uc3QgY2hhciAqZXZlbnRzW10gPSB7CisJCSJTVEFSVCIsCisJCSJTVE9QIiwKKwkJIlNXQkEiLAorCQkiVEJUVCIsCisJCSJUWF9CQ05fQ01QIiwKKwkJIlNFTkRfQ09NUExFVEUiLAorCQkiU0VORF9OX0NPTVBMRVRFIiwKKwkJIlBSRV9TRU5EIiwKKwkJIlJYIiwKKwkJIlVDX0lOQUNUSVZJVFlfVElNRU9VVCIsCisJCSJCQ19JTkFDVElWSVRZX1RJTUVPVVQiLAorCQkiQVRJTV9XSU5ET1dfQkVHSU4iLAorCQkiQVRJTV9XSU5ET1dfRU5EIiwKKwkJIkhXUV9FTVBUWSIsCisJCSJVQ19BVElNX1JDVkQiLAorCQkiVFJBRkZJQ19FWENIQU5HRV9ET05FIiwKKwkJIlBPV0VSX1NBVkVfU1RBVEVfQ0hBTkdFIiwKKwkJIk5FV19QRUVSX0pPSU4iLAorCQkiSUJTU19WREVWX1BBVVNFX1JFUVVFU1QiLAorCQkiSUJTU19WREVWX1BBVVNFX1JFU1BPTlNFIiwKKwkJIklCU1NfVkRFVl9QQVVTRV9USU1FT1VUIiwKKwkJIklCU1NfVkRFVl9VTlBBVVNFX1JFUVVFU1QiLAorCQkiUFNfU1RBVEVfQ0hBTkdFIiwKKwl9OworCisJZW51bSB3bGFuX2lic3NfcHNfc3ViX21vZHVsZSBzdWJfbW9kdWxlOworCisJc3dpdGNoIChkYmdfaWQpIHsKKwljYXNlIERCR0xPR19EQkdJRF9TTV9GUkFNRVdPUktfUFJPWFlfREJHTE9HX01TRzoKKwkJc3ViX21vZHVsZSA9IChhcmdzWzFdID4+IFdMQU5fSUJTU19QU19TVUJfTU9EVUxFX09GRlNFVCkgJiAweDM7CisJCXN3aXRjaCAoc3ViX21vZHVsZSkgeworCQljYXNlIFdMQU5fSUJTU19QU19TVUJfTU9EVUxFX0lCU1NfTldfU006CisJCQlkYmdsb2dfc21fcHJpbnQodGltZXN0YW1wLCB2YXBfaWQsIG51bWFyZ3MsIGFyZ3MsCisJCQkJCSJJQlNTIFBTIE5XIiwgbndfc3RhdGVzLAorCQkJCQlDREZfQVJSQVlfU0laRShud19zdGF0ZXMpLCBldmVudHMsCisJCQkJCUNERl9BUlJBWV9TSVpFKGV2ZW50cykpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9JQlNTX1BTX1NVQl9NT0RVTEVfSUJTU19TRUxGX1BTOgorCQkJZGJnbG9nX3NtX3ByaW50KHRpbWVzdGFtcCwgdmFwX2lkLCBudW1hcmdzLCBhcmdzLAorCQkJCQkiSUJTUyBQUyBTZWxmIiwgcHNfc3RhdGVzLAorCQkJCQlDREZfQVJSQVlfU0laRShwc19zdGF0ZXMpLCBldmVudHMsCisJCQkJCUNERl9BUlJBWV9TSVpFKGV2ZW50cykpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9JQlNTX1BTX1NVQl9NT0RVTEVfSUJTU19QRUVSX1BTOgorCQkJZGJnbG9nX3NtX3ByaW50KHRpbWVzdGFtcCwgdmFwX2lkLCBudW1hcmdzLCBhcmdzLAorCQkJCQkiSUJTUyBQUyBQZWVyIiwgcGVlcl9wc19zdGF0ZXMsCisJCQkJCUNERl9BUlJBWV9TSVpFKHBlZXJfcHNfc3RhdGVzKSwgZXZlbnRzLAorCQkJCQlDREZfQVJSQVlfU0laRShldmVudHMpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJQlNTX1BTX0RCR0lEX1BFRVJfQ1JFQVRFOgorCQlpZiAobnVtYXJncyA9PSAyKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJJQlNTIFBTOiBwZWVyIGFsbG9jIGZhaWxlZCBmb3IgcGVlciBJRDoldSIsCisJCQkJICAgICAgYXJnc1swXSk7CisJCX0gZWxzZSBpZiAobnVtYXJncyA9PSAxKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJJQlNTIFBTOiBjcmVhdGUgcGVlciBJRD0ldSIsIGFyZ3NbMF0pOworCQl9CisJCWJyZWFrOworCWNhc2UgSUJTU19QU19EQkdJRF9QRUVSX0RFTEVURToKKwkJaWYgKG51bWFyZ3MgPT0gNCkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogZGVsZXRlIHBlZXIgSUQ9JXUgbnVtX3BlZXJzOiVkIG51bV9zbGVlcGluZ19wZWVyczolZCBwc19lbmFibGVkX2Zvcl90aGlzX3BlZXI6JWQiLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pOworCQl9CisJCWJyZWFrOworCWNhc2UgSUJTU19QU19EQkdJRF9WREVWX0NSRUFURToKKwkJaWYgKG51bWFyZ3MgPT0gMSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogdmRldiBhbGxvYyBmYWlsZWQiLCBhcmdzWzBdKTsKKwkJfSBlbHNlIGlmIChudW1hcmdzID09IDApIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIklCU1MgUFM6IHZkZXYgY3JlYXRlZCIpOworCQl9CisJCWJyZWFrOworCWNhc2UgSUJTU19QU19EQkdJRF9WREVWX0RFTEVURToKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwgIklCU1MgUFM6IHZkZXYgZGVsZXRlZCIpOworCQlicmVhazsKKworCWNhc2UgSUJTU19QU19EQkdJRF9WREVWX0VWRU5UOgorCQlpZiAobnVtYXJncyA9PSAxKSB7CisJCQlpZiAoYXJnc1swXSA9PSA1KSB7CisJCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkJICAgICAgIklCU1MgUFM6IHZkZXYgZXZlbnQgZm9yIHBlZXIgYWRkIik7CisJCQl9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gNykgeworCQkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJCSAgICAgICJJQlNTIFBTOiB2ZGV2IGV2ZW50IGZvciBwZWVyIGRlbGV0ZSIpOworCQkJfSBlbHNlIHsKKwkJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCQkgICAgICAiSUJTUyBQUzogdmRldiBldmVudCAldSIsCisJCQkJCSAgICAgIGFyZ3NbMF0pOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBJQlNTX1BTX0RCR0lEX1BFRVJfRVZFTlQ6CisJCWlmIChudW1hcmdzID09IDQpIHsKKwkJCWlmIChhcmdzWzBdID09IDB4RkZGRikgeworCQkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJCSAgICAgICJJQlNTIFBTOiBwcmVfc2VuZCBmb3IgcGVlcjoldSBwZWVyX3R5cGU6JXUgc21fZXZlbnRfbWFzazolMHgiLAorCQkJCQkgICAgICBhcmdzWzFdLCBhcmdzWzNdLCBhcmdzWzJdKTsKKwkJCX0gZWxzZSBpZiAoYXJnc1swXSA9PSAweDIwMDAwKSB7CisJCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkJICAgICAgIklCU1MgUFM6IHNlbmRfY29tcGxldGUgZm9yIHBlZXI6JXUgcGVlcl90eXBlOiV1IHNtX2V2ZW50X21hc2s6JTB4IiwKKwkJCQkJICAgICAgYXJnc1sxXSwgYXJnc1szXSwgYXJnc1syXSk7CisJCQl9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gMHgxMCkgeworCQkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJCSAgICAgICJJQlNTIFBTOiBzZW5kX25fY29tcGxldGUgZm9yIHBlZXI6JXUgcGVlcl90eXBlOiV1IHNtX2V2ZW50X21hc2s6JTB4IiwKKwkJCQkJICAgICAgYXJnc1sxXSwgYXJnc1szXSwgYXJnc1syXSk7CisJCQl9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gMHg0MCkgeworCQkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJCSAgICAgICJJQlNTIFBTOiByeCBldmVudCBmb3IgcGVlcjoldSBwZWVyX3R5cGU6JXUgc21fZXZlbnRfbWFzazolMHgiLAorCQkJCQkgICAgICBhcmdzWzFdLCBhcmdzWzNdLCBhcmdzWzJdKTsKKwkJCX0gZWxzZSBpZiAoYXJnc1swXSA9PSAweDQpIHsKKwkJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCQkgICAgICAiSUJTUyBQUzogaHdfcV9lbXB0eSBmb3IgcGVlcjoldSBwZWVyX3R5cGU6JXUgc21fZXZlbnRfbWFzazolMHgiLAorCQkJCQkgICAgICBhcmdzWzFdLCBhcmdzWzNdLCBhcmdzWzJdKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgSUJTU19QU19EQkdJRF9ERUxJVkVSX0NBQjoKKwkJaWYgKG51bWFyZ3MgPT0gNCkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogRGVsaXZlciBDQUIgbl9tcGR1OiVkIHNlbmRfZmxhZ3M6JTB4IHRpZF9jdXI6JWQgcV9kZXB0aF9mb3Jfb3RoZXJfdGlkOiVkIiwKKwkJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSUJTU19QU19EQkdJRF9ERUxJVkVSX1VDX0RBVEE6CisJCWlmIChudW1hcmdzID09IDQpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIklCU1MgUFM6IERlbGl2ZXIgVUMgZGF0YSBwZWVyOiVkIHRpZDolZCBuX21wZHU6JWQgc2VuZF9mbGFnczolMHgiLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJQlNTX1BTX0RCR0lEX0RFTElWRVJfVUNfREFUQV9FUlJPUjoKKwkJaWYgKG51bWFyZ3MgPT0gNCkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogRGVsaXZlciBVQyBkYXRhIGVycm9yIHBlZXI6JWQgdGlkOiVkIGFsbG93ZWRfdGlkbWFzazolMHgsIHBlbmRpbmdfdGlkbWFwOiUweCIsCisJCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElCU1NfUFNfREJHSURfVUNfSU5BQ1RJVklUWV9UTVJfUkVTVEFSVDoKKwkJaWYgKG51bWFyZ3MgPT0gMikgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogVUMgdGltZXIgcmVzdGFydCBwZWVyOiVkIHRpbWVyX3ZhbDolMHgiLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJQlNTX1BTX0RCR0lEX01DX0lOQUNUSVZJVFlfVE1SX1JFU1RBUlQ6CisJCWlmIChudW1hcmdzID09IDEpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIklCU1MgUFM6IE1DIHRpbWVyIHJlc3RhcnQgdGltZXJfdmFsOiUweCIsCisJCQkJICAgICAgYXJnc1swXSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElCU1NfUFNfREJHSURfTlVMTF9UWF9DT01QTEVUSU9OOgorCQlpZiAobnVtYXJncyA9PSAzKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJJQlNTIFBTOiBudWxsIHR4IGNvbXBsZXRpb24gcGVlcjolZCB0eF9jb21wbGV0aW9uX3N0YXR1czolZCBmbGFnczolMHgiLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJQlNTX1BTX0RCR0lEX0FUSU1fVElNRVJfU1RBUlQ6CisJCWlmIChudW1hcmdzID09IDQpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIklCU1MgUFM6IEFUSU0gdGltZXIgc3RhcnQgdHNmOiUweCAlMHggdGJ0dDolMHggJTB4IiwKKwkJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSUJTU19QU19EQkdJRF9VQ19BVElNX1NFTkQ6CisJCWlmIChudW1hcmdzID09IDIpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIklCU1MgUFM6IFNlbmQgQVRJTSB0byBwZWVyOiVkIiwgYXJnc1sxXSk7CisJCX0gZWxzZSBpZiAobnVtYXJncyA9PSAxKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJJQlNTIFBTOiBubyBwZWVycyB0byBzZW5kIFVDIEFUSU0iLAorCQkJCSAgICAgIGFyZ3NbMV0pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJQlNTX1BTX0RCR0lEX0JDX0FUSU1fU0VORDoKKwkJaWYgKG51bWFyZ3MgPT0gMikgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogTUMgRGF0YSwgbnVtX29mX3BlZXJzOiVkIGJjX2F0aW1fc2VudDolZCIsCisJCQkJICAgICAgYXJnc1sxXSwgYXJnc1swXSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElCU1NfUFNfREJHSURfVUNfVElNRU9VVDoKKwkJaWYgKG51bWFyZ3MgPT0gMikgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogVUMgdGltZW91dCBmb3IgcGVlcjolZCBzZW5kX251bGw6JWQiLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJQlNTX1BTX0RCR0lEX1BXUl9DT0xMQVBTRV9BTExPV0VEOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIklCU1MgUFM6IGFsbG93IHBvd2VyIGNvbGxhcHNlIik7CisJCWJyZWFrOworCisJY2FzZSBJQlNTX1BTX0RCR0lEX1BXUl9DT0xMQVBTRV9OT1RfQUxMT1dFRDoKKwkJaWYgKG51bWFyZ3MgPT0gMCkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogcG93ZXIgY29sbGFwc2Ugbm90IGFsbG93ZWQgYnkgSU5JIik7CisJCX0gZWxzZSBpZiAobnVtYXJncyA9PSAxKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJJQlNTIFBTOiBwb3dlciBjb2xsYXBzZSBub3QgYWxsb3dlZCBzaW5jZSBwZWVyIGlkOiVkIGlzIG5vdCBQUyBjYXBhYmxlIiwKKwkJCQkgICAgICBhcmdzWzBdKTsKKwkJfSBlbHNlIGlmIChudW1hcmdzID09IDIpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIklCU1MgUFM6IHBvd2VyIGNvbGxhcHNlIG5vdCBhbGxvd2VkIC0gbm8gcGVlcnMgaW4gTlciKTsKKwkJfSBlbHNlIGlmIChudW1hcmdzID09IDMpIHsKKwkJCWlmIChhcmdzWzBdID09IDIpIHsKKwkJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCQkgICAgICAiSUJTUyBQUzogcG93ZXIgY29sbGFwc2Ugbm90IGFsbG93ZWQsIG5vbi16ZXJvIHFkZXB0aCAlZCAlZCIsCisJCQkJCSAgICAgIGFyZ3NbMV0sIGFyZ3NbMl0pOworCQkJfSBlbHNlIGlmIChhcmdzWzBdID09IDMpIHsKKwkJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCQkgICAgICAiSUJTUyBQUzogcG93ZXIgY29sbGFwc2Ugbm90IGFsbG93ZWQgYnkgcGVlcjolZCBwZWVyX2ZsYWdzOiUweCIsCisJCQkJCSAgICAgIGFyZ3NbMV0sIGFyZ3NbMl0pOworCQkJfQorCQl9IGVsc2UgaWYgKG51bWFyZ3MgPT0gNSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogcG93ZXIgY29sbGFwc2Ugbm90IGFsbG93ZWQgYnkgc3RhdGUgbS9jIG53X2N1cl9zdGF0ZTolZCBud19uZXh0X3N0YXRlOiVkIHBzX2N1cl9zdGF0ZTolZCBmbGFnczolMHgiLAorCQkJCSAgICAgIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJQlNTX1BTX0RCR0lEX1NFVF9QQVJBTToKKwkJaWYgKG51bWFyZ3MgPT0gMikgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogU2V0IFBhcmFtIElEOiUweCBWYWx1ZTolMHgiLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJQlNTX1BTX0RCR0lEX0hPU1RfVFhfUEFVU0U6CisJCWlmIChudW1hcmdzID09IDEpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIklCU1MgUFM6IFBhdXNpbmcgaG9zdCwgdmRldl9tYXA6JTB4IiwKKwkJCQkgICAgICBhcmdzWzBdKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSUJTU19QU19EQkdJRF9IT1NUX1RYX1VOUEFVU0U6CisJCWlmIChudW1hcmdzID09IDEpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIklCU1MgUFM6IFVucGF1c2luZyBob3N0LCB2ZGV2X21hcDolMHgiLAorCQkJCSAgICAgIGFyZ3NbMF0pOworCQl9CisJCWJyZWFrOworCWNhc2UgSUJTU19QU19EQkdJRF9QU19ERVNDX0JJTl9MV006CisJCWlmIChudW1hcmdzID09IDEpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIklCU1MgUFM6IExXTSwgdmRldl9tYXA6JTB4IiwgYXJnc1swXSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElCU1NfUFNfREJHSURfUFNfREVTQ19CSU5fSFdNOgorCQlpZiAobnVtYXJncyA9PSAxKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJJQlNTIFBTOiBIV00sIHZkZXZfbWFwOiUweCIsIGFyZ3NbMF0pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJQlNTX1BTX0RCR0lEX1BTX0tJQ0tPVVRfUEVFUjoKKwkJaWYgKG51bWFyZ3MgPT0gMykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogS2lja291dCBwZWVyIGlkOiVkIGF0aW1fZmFpbF9jbnQ6JWQgc3RhdHVzOiVkIiwKKwkJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSUJTU19QU19EQkdJRF9TRVRfUEVFUl9QQVJBTToKKwkJaWYgKG51bWFyZ3MgPT0gMykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiSUJTUyBQUzogU2V0IFBlZXIgSWQ6JWQgUGFyYW0gSUQ6JTB4IFZhbHVlOiUweCIsCisJCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElCU1NfUFNfREJHSURfQkNOX0FUSU1fV0lOX01JU01BVENIOgorCQlpZiAobnVtYXJncyA9PSA0KSB7CisJCQlpZiAoYXJnc1swXSA9PSAweERFQUQpIHsKKwkJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCQkgICAgICAiSUJTUyBQUzogQVRJTSB3aW5kb3cgbGVuZ3RoIG1pc21hdGNoLCBvdXInczolZCwgcGVlciBpZDolZCwgcGVlcidzOiVkIiwKKwkJCQkJICAgICAgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7CisJCQl9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gMHhCRUVGKSB7CisJCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkJICAgICAgIklCU1MgUFM6IFBlZXIgQVRJTSB3aW5kb3cgbGVuZ3RoIGNoYW5nZWQsIHBlZXIgaWQ6JWQsIHBlZXIgcmVjb3JkZWQgYXRpbSB3aW5kb3c6JWQgbmV3IGF0aW0gd2luZG93OiVkIiwKKwkJCQkJICAgICAgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElCU1NfUFNfREJHSURfUlhfQ0hBSU5NQVNLX0NIQU5HRToKKwkJaWYgKG51bWFyZ3MgPT0gMikgeworCQkJaWYgKGFyZ3NbMV0gPT0gMHgxKSB7CisJCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkJICAgICAgIklCU1MgUFM6IFZvdGluZyBmb3IgbG93IHBvd2VyIGNoYWlubWFzayBmcm9tIDolZCIsCisJCQkJCSAgICAgIGFyZ3NbMF0pOworCQkJfSBlbHNlIHsKKwkJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCQkgICAgICAiSUJTUyBQUzogVm90aW5nIGZvciBoaWdoIHBvd2VyIGNoYWlubWFzayBmcm9tIDolZCIsCisJCQkJCSAgICAgIGFyZ3NbMF0pOworCQkJfQorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitBX0JPT0wgZGJnbG9nX3JhdGVjdHJsX3ByaW50X2hhbmRsZXIoQV9VSU5UMzIgbW9kX2lkLAorCQkJCSAgICAgQV9VSU5UMTYgdmFwX2lkLAorCQkJCSAgICAgQV9VSU5UMzIgZGJnX2lkLAorCQkJCSAgICAgQV9VSU5UMzIgdGltZXN0YW1wLAorCQkJCSAgICAgQV9VSU5UMTYgbnVtYXJncywgQV9VSU5UMzIgKmFyZ3MpCit7CisJc3dpdGNoIChkYmdfaWQpIHsKKwljYXNlIFJBVEVDVFJMX0RCR0lEX0FTU09DOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIlJBVEU6IENoYWluTWFzayAlZCwgcGh5bW9kZSAlZCwgbmlfZmxhZ3MgMHglMDh4LCB2aHRfbWNzX3NldCAweCUwNHgsIGh0X21jc19zZXQgMHglMDR4IiwKKwkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0pOworCQlicmVhazsKKwljYXNlIFJBVEVDVFJMX0RCR0lEX05TU19DSEFOR0U6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsICJSQVRFOiBORVcgTlNTICVkXG4iLCBhcmdzWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBSQVRFQ1RSTF9EQkdJRF9DSEFJTk1BU0tfRVJSOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIlJBVEU6IENoYWlubWFzayBFUlIgJWQgJWQgJWRcbiIsIGFyZ3NbMF0sCisJCQkgICAgICBhcmdzWzFdLCBhcmdzWzJdKTsKKwkJYnJlYWs7CisJY2FzZSBSQVRFQ1RSTF9EQkdJRF9VTkVYUEVDVEVEX0ZSQU1FOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIlJBVEU6IFdBUk4xOiByYXRlICVkIGZsYWdzIDB4JTA4eFxuIiwgYXJnc1swXSwKKwkJCSAgICAgIGFyZ3NbMV0pOworCQlicmVhazsKKwljYXNlIFJBVEVDVFJMX0RCR0lEX1dBTF9SQ1FVRVJZOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgInJhdGVjdHJsX2RiZ2lkX3dhbF9yY3F1ZXJ5IFtyaXgxICVkIHJpeDIgJWQgcml4MyAlZCBwcm9iZXJpeCAlZCBwcGR1ZmxhZyAweCV4XSAiLAorCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7CisJCWJyZWFrOworCWNhc2UgUkFURUNUUkxfREJHSURfV0FMX1JDVVBEQVRFOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgInJhdGVjdHJsX2RiZ2lkX3dhbF9yY3VwZGF0ZSBbbnVtZWxlbXMgJWQgcHBkdWZsYWcgMHgleF0gIiwKKwkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0pOworCQlicmVhazsKKwljYXNlIFJBVEVDVFJMX0RCR0lEX0dUWF9VUERBVEU6CisJeworCQlzd2l0Y2ggKGFyZ3NbMF0pIHsKKwkJY2FzZSAyNTU6CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJHdHhJbml0UHdyQ2ZnIFtid1tsYXN0ICVkfGN1ciAlZF0gcnRjb2RlIDB4JXggdHBjICVkIHRwY19pbml0X3B3cl9jZmcgJWRdICIsCisJCQkJICAgICAgYXJnc1sxXSA+PiA4LCBhcmdzWzFdICYgMHhmZiwKKwkJCQkgICAgICBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTsKKwkJCWJyZWFrOworCQljYXNlIDI1NDoKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgImd0eF9jZmdfYWRkciBbUlRNYXNrMEAweCV4IFBFUlRocmVzaG9sZEAweCV4IGd0eFRQQ01pbkAweCV4IHVzZXJHdHhNYXNrQDB4JXhdICIsCisJCQkJICAgICAgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwKKwkJCQkgICAgICBhcmdzWzRdKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiZ3R4X3VwZGF0ZSBbYWN0ICVkIGJ3ICVkIHJpeCAweCV4IHRwYyAlZCBwZXIgJWQgbGFzdHJzc2kgJWRdICIsCisJCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwKKwkJCQkgICAgICBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTsKKwkJfQorCX0KKwlicmVhazsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK0FfQk9PTCBkYmdsb2dfYW5pX3ByaW50X2hhbmRsZXIoQV9VSU5UMzIgbW9kX2lkLAorCQkJCUFfVUlOVDE2IHZhcF9pZCwKKwkJCQlBX1VJTlQzMiBkYmdfaWQsCisJCQkJQV9VSU5UMzIgdGltZXN0YW1wLAorCQkJCUFfVUlOVDE2IG51bWFyZ3MsIEFfVUlOVDMyICphcmdzKQoreworCXN3aXRjaCAoZGJnX2lkKSB7CisJY2FzZSBBTklfREJHSURfRU5BQkxFOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLCAiQU5JIEVuYWJsZTogICVkIiwgYXJnc1swXSk7CisJCWJyZWFrOworCWNhc2UgQU5JX0RCR0lEX1BPTEw6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkgICAgICAiQU5JIFBPTExJTkc6IEFjY3VtTGlzdGVuVGltZSAlZCBMaXN0ZW5UaW1lICVkIG9mZG1waHllcnIgJWQgY2NrcGh5ZXJyICVkIiwKKwkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pOworCQlicmVhazsKKwljYXNlIEFOSV9EQkdJRF9SRVNUQVJUOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLCAiQU5JIFJlc3RhcnQiKTsKKwkJYnJlYWs7CisJY2FzZSBBTklfREJHSURfQ1VSUkVOVF9MRVZFTDoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCSAgICAgICJBTkkgQ1VSUkVOVCBMRVZFTCBvZmRtIGxldmVsICVkIGNjayBsZXZlbCAlZCIsCisJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBBTklfREJHSURfT0ZETV9MRVZFTDoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCSAgICAgICJBTkkgVVBEQVRFIG9mZG0gbGV2ZWwgJWQgZmlyc3RlcCAlZCBmaXJzdGVwX2xvdyAlZCBjeWNwd3JfdGhyICVkIHNlbGZfY29ycl9sb3cgJWQiLAorCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7CisJCWJyZWFrOworCWNhc2UgQU5JX0RCR0lEX0NDS19MRVZFTDoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCSAgICAgICJBTkkgIFVQREFURSBjY2sgbGV2ZWwgJWQgZmlyc3RlcCAlZCBmaXJzdGVwX2xvdyAlZCBtcmNfY2NrICVkIiwKKwkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pOworCQlicmVhazsKKwljYXNlIEFOSV9EQkdJRF9DT05UUk9MOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIkFOSSBDT05UUk9MIG9mZG1sZXZlbCAlZCBjY2tsZXZlbCAlZFxuIiwKKwkJCSAgICAgIGFyZ3NbMF0pOworCisJCWJyZWFrOworCWNhc2UgQU5JX0RCR0lEX09GRE1fUEFSQU1TOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIkFOSSBvZmRtX2NvbnRyb2wgZmlyc3RlcCAlZCBjeWNwd3IgJWRcbiIsCisJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBBTklfREJHSURfQ0NLX1BBUkFNUzoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCSAgICAgICJBTkkgY2NrX2NvbnRyb2wgbXJjX2NjayAlZCBiYXJrZXJfdGhyZXNob2xkICVkXG4iLAorCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSk7CisJCWJyZWFrOworCWNhc2UgQU5JX0RCR0lEX1JFU0VUOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIkFOSSByZXNldHRpbmcgcmVzZXRmbGFnICVkIHJlc2V0Q2F1c2UgJTh4IGNoYW5uZWwgaW5kZXggJWQiLAorCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisJCWJyZWFrOworCWNhc2UgQU5JX0RCR0lEX1NFTEZfQ09SUl9MT1c6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsICJBTkkgc2VsZl9jb3JyX2xvdyAlZCIsCisJCQkgICAgICBhcmdzWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBBTklfREJHSURfRklSU1RFUDoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCSAgICAgICJBTkkgZmlyc3RlcCAlZCBmaXJzdGVwX2xvdyAlZCIsIGFyZ3NbMF0sCisJCQkgICAgICBhcmdzWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBBTklfREJHSURfTVJDX0NDSzoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwgIkFOSSBtcmNfY2NrICVkIiwgYXJnc1swXSk7CisJCWJyZWFrOworCWNhc2UgQU5JX0RCR0lEX0NZQ1BXUjoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwgIkFOSSBjeXB3cl90aHJlc2ggJWQiLAorCQkJICAgICAgYXJnc1swXSk7CisJCWJyZWFrOworCWNhc2UgQU5JX0RCR0lEX1BPTExfUEVSSU9EOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIkFOSSBDb25maWd1cmUgcG9sbCBwZXJpb2QgdG8gJWQiLCBhcmdzWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBBTklfREJHSURfTElTVEVOX1BFUklPRDoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCSAgICAgICJBTkkgQ29uZmlndXJlIGxpc3RlbiBwZXJpb2QgdG8gJWQiLCBhcmdzWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBBTklfREJHSURfT0ZETV9MRVZFTF9DRkc6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkgICAgICAiQU5JIENvbmZpZ3VyZSBvZmRtIGxldmVsIHRvICVkIiwgYXJnc1swXSk7CisJCWJyZWFrOworCWNhc2UgQU5JX0RCR0lEX0NDS19MRVZFTF9DRkc6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkgICAgICAiQU5JIENvbmZpZ3VyZSBjY2sgbGV2ZWwgdG8gJWQiLCBhcmdzWzBdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwgIkFOSSBhcmcxICVkIGFyZzIgJWQgYXJnMyAlZCIsCisJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiB0cnVlOworfQorCitBX0JPT0wKK2RiZ2xvZ19hcF9wb3dlcnNhdmVfcHJpbnRfaGFuZGxlcihBX1VJTlQzMiBtb2RfaWQsCisJCQkJICBBX1VJTlQxNiB2YXBfaWQsCisJCQkJICBBX1VJTlQzMiBkYmdfaWQsCisJCQkJICBBX1VJTlQzMiB0aW1lc3RhbXAsCisJCQkJICBBX1VJTlQxNiBudW1hcmdzLCBBX1VJTlQzMiAqYXJncykKK3sKKwlzd2l0Y2ggKGRiZ19pZCkgeworCWNhc2UgQVBfUFNfREJHSURfVVBEQVRFX1RJTToKKwkJaWYgKG51bWFyZ3MgPT0gMikgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiQVAgUFM6IFRJTSB1cGRhdGUgQUlEPSV1ICVzIiwKKwkJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdID8gInNldCIgOiAiY2xlYXIiKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFQX1BTX0RCR0lEX1BFRVJfU1RBVEVfQ0hBTkdFOgorCQlpZiAobnVtYXJncyA9PSAyKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJBUCBQUzogQUlEPSV1IHBvd2VyIHNhdmUgJXMiLAorCQkJCSAgICAgIGFyZ3NbMF0sCisJCQkJICAgICAgYXJnc1sxXSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQl9CisJCWJyZWFrOworCWNhc2UgQVBfUFNfREJHSURfUFNQT0xMOgorCQlpZiAobnVtYXJncyA9PSAzKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJBUCBQUzogQUlEPSV1IHBzcG9sbCByZXNwb25zZSB0aWQ9JXUgZmxhZ3M9JXgiLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworCQl9CisJCWJyZWFrOworCWNhc2UgQVBfUFNfREJHSURfUEVFUl9DUkVBVEU6CisJCWlmIChudW1hcmdzID09IDEpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIkFQIFBTOiBjcmVhdGUgcGVlciBBSUQ9JXUiLCBhcmdzWzBdKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFQX1BTX0RCR0lEX1BFRVJfREVMRVRFOgorCQlpZiAobnVtYXJncyA9PSAxKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJBUCBQUzogZGVsZXRlIHBlZXIgQUlEPSV1IiwgYXJnc1swXSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBUF9QU19EQkdJRF9WREVWX0NSRUFURToKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwgIkFQIFBTOiB2ZGV2IGNyZWF0ZSIpOworCQlicmVhazsKKwljYXNlIEFQX1BTX0RCR0lEX1ZERVZfREVMRVRFOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLCAiQVAgUFM6IHZkZXYgZGVsZXRlIik7CisJCWJyZWFrOworCWNhc2UgQVBfUFNfREJHSURfU1lOQ19USU06CisJCWlmIChudW1hcmdzID09IDMpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIkFQIFBTOiBBSUQ9JXUgYWR2ZXJ0aXNlZD0lI3ggYnVmZmVyZWQ9JSN4IiwKKwkJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFQX1BTX0RCR0lEX05FWFRfUkVTUE9OU0U6CisJCWlmIChudW1hcmdzID09IDQpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIkFQIFBTOiBBSUQ9JXUgc2VsZWN0IG5leHQgcmVzcG9uc2UgJXMlcyVzIiwKKwkJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdID8gIih1c3AgYWN0aXZlKSAiIDogIiIsCisJCQkJICAgICAgYXJnc1syXSA/ICIocGVuZGluZyB1c3ApICIgOiAiIiwKKwkJCQkgICAgICBhcmdzWzNdID8gIihwZW5kaW5nIHBvbGwgcmVzcG9uc2UpIiA6ICIiKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFQX1BTX0RCR0lEX1NUQVJUX1NQOgorCQlpZiAobnVtYXJncyA9PSAzKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJBUCBQUzogQUlEPSV1IFNUQVJUIFNQIHRzZj0lI3ggKCV1KSIsCisJCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBUF9QU19EQkdJRF9DT01QTEVURURfRU9TUDoKKwkJaWYgKG51bWFyZ3MgPT0gMykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiQVAgUFM6IEFJRD0ldSBFT1NQIGVvc3BfdHNmPSUjeCB0cmlnZ2VyX3RzZj0lI3giLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworCQl9CisJCWJyZWFrOworCWNhc2UgQVBfUFNfREJHSURfVFJJR0dFUjoKKwkJaWYgKG51bWFyZ3MgPT0gNCkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiQVAgUFM6IEFJRD0ldSBUUklHR0VSIHRzZj0lI3ggJXMlcyIsCisJCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwKKwkJCQkgICAgICBhcmdzWzJdID8gIih1c3AgYWN0aXZlKSAiIDogIiIsCisJCQkJICAgICAgYXJnc1szXSA/ICIoc2VuZF9uIGluIHByb2dyZXNzKSIgOiAiIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBUF9QU19EQkdJRF9EVVBMSUNBVEVfVFJJR0dFUjoKKwkJaWYgKG51bWFyZ3MgPT0gNCkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiQVAgUFM6IEFJRD0ldSBEVVAgVFJJR0dFUiB0c2Y9JSN4IHNlcT0ldSBhYz0ldSIsCisJCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBUF9QU19EQkdJRF9VQVBTRF9SRVNQT05TRToKKwkJaWYgKG51bWFyZ3MgPT0gNSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiQVAgUFM6IEFJRD0ldSBVQVBTRCByZXNwb25zZSB0aWQ9JXUsIG5fbXBkdT0ldSBmbGFncz0lI3ggbWF4X3NwPSV1IGN1cnJlbnRfc3A9JXUiLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sCisJCQkJICAgICAgKGFyZ3NbNF0gPj4gMTYpICYgMHhmZmZmLAorCQkJCSAgICAgIGFyZ3NbNF0gJiAweGZmZmYpOworCQl9CisJCWJyZWFrOworCWNhc2UgQVBfUFNfREJHSURfU0VORF9DT01QTEVURToKKwkJaWYgKG51bWFyZ3MgPT0gNSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiQVAgUFM6IEFJRD0ldSBTRU5EX0NPTVBMRVRFIGZjPSUjeCBxb3M9JSN4ICVzJXMiLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sCisJCQkJICAgICAgYXJnc1szXSA/ICIodXNwIGFjdGl2ZSkgIiA6ICIiLAorCQkJCSAgICAgIGFyZ3NbNF0gPyAiKHBlbmRpbmcgcG9sbCByZXNwb25zZSkiIDogIiIpOworCQl9CisJCWJyZWFrOworCWNhc2UgQVBfUFNfREJHSURfU0VORF9OX0NPTVBMRVRFOgorCQlpZiAobnVtYXJncyA9PSAzKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJBUCBQUzogQUlEPSV1IFNFTkRfTl9DT01QTEVURSAlcyVzIiwKKwkJCQkgICAgICBhcmdzWzBdLAorCQkJCSAgICAgIGFyZ3NbMV0gPyAiKHVzcCBhY3RpdmUpICIgOiAiIiwKKwkJCQkgICAgICBhcmdzWzJdID8gIihwZW5kaW5nIHBvbGwgcmVzcG9uc2UpIiA6ICIiKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFQX1BTX0RCR0lEX0RFVEVDVF9PVVRfT0ZfU1lOQ19TVEE6CisJCWlmIChudW1hcmdzID09IDQpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIkFQIFBTOiBBSUQ9JXUgZGV0ZWN0ZWQgb3V0LW9mLXN5bmMgbm93PSV1IHR4X3dhaXRpbmc9JXUgdHhxX2RlcHRoPSV1IiwKKwkJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFQX1BTX0RCR0lEX0RFTElWRVJfQ0FCOgorCQlpZiAobnVtYXJncyA9PSA0KSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJBUCBQUzogQ0FCICVzIG5fbXBkdXM9JXUsIGZsYWdzPSV4LCBleHRyYT0ldSIsCisJCQkJICAgICAgKGFyZ3NbMF0gPT0gMTcpID8gIk1HTVQiIDogIkRBVEEiLAorCQkJCSAgICAgIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworQV9CT09MCitkYmdsb2dfd2FsX3ByaW50X2hhbmRsZXIoQV9VSU5UMzIgbW9kX2lkLAorCQkJIEFfVUlOVDE2IHZhcF9pZCwKKwkJCSBBX1VJTlQzMiBkYmdfaWQsCisJCQkgQV9VSU5UMzIgdGltZXN0YW1wLCBBX1VJTlQxNiBudW1hcmdzLCBBX1VJTlQzMiAqYXJncykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqc3RhdGVzW10gPSB7CisJCSJBQ1RJVkUiLAorCQkiV0FJVCIsCisJCSJXQUlUX0ZJTFRFUiIsCisJCSJQQVVTRSIsCisJCSJQQVVTRV9TRU5EX04iLAorCQkiQkxPQ0siLAorCX07CisKKwlzdGF0aWMgY29uc3QgY2hhciAqZXZlbnRzW10gPSB7CisJCSJQQVVTRSIsCisJCSJQQVVTRV9GSUxURVIiLAorCQkiVU5QQVVTRSIsCisKKwkJIkJMT0NLIiwKKwkJIkJMT0NLX0ZJTFRFUiIsCisJCSJVTkJMT0NLIiwKKworCQkiSFdRX0VNUFRZIiwKKwkJIkFMTE9XX04iLAorCX07CisKKyNkZWZpbmUgV0FMX1ZERVZfVFlQRSh0eXBlKQlcCisJKHR5cGUgPT0gMCA/ICJBUCIgOgkgIFwKKwkgKHR5cGUgPT0gMSA/ICJTVEEiIDoJICAgICBcCisJICAodHlwZSA9PSAyID8gIklCU1MiIDoJCVwKKwkgICAodHlwZSA9PSAyID8gIk1PTklUT1IiIDogICAgXAorCSAgICJVTktOT1dOIikpKSkKKworI2RlZmluZSBXQUxfU0xFRVBfU1RBVEUoc3RhdGUpCSAgICBcCisJKHN0YXRlID09IDEgPyAiTkVUV09SSyBTTEVFUCIgOglcCisJIChzdGF0ZSA9PSAyID8gIkFXQUtFIiA6CSBcCisJICAoc3RhdGUgPT0gMyA/ICJTWVNURU0gU0xFRVAiIDogIFwKKwkgICAiVU5LTk9XTiIpKSkKKworCXN3aXRjaCAoZGJnX2lkKSB7CisJY2FzZSBEQkdMT0dfREJHSURfU01fRlJBTUVXT1JLX1BST1hZX0RCR0xPR19NU0c6CisJCWRiZ2xvZ19zbV9wcmludCh0aW1lc3RhbXAsIHZhcF9pZCwgbnVtYXJncywgYXJncywgIlRJRCBQQVVTRSIsCisJCQkJc3RhdGVzLCBDREZfQVJSQVlfU0laRShzdGF0ZXMpLCBldmVudHMsCisJCQkJQ0RGX0FSUkFZX1NJWkUoZXZlbnRzKSk7CisJCWJyZWFrOworCWNhc2UgV0FMX0RCR0lEX1NFVF9QT1dFUl9TVEFURToKKwkJaWYgKG51bWFyZ3MgPT0gMykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiV0FMICVzID0+ICVzLCByZXFfY291bnQ9JXUiLAorCQkJCSAgICAgIFdBTF9TTEVFUF9TVEFURShhcmdzWzBdKSwKKwkJCQkgICAgICBXQUxfU0xFRVBfU1RBVEUoYXJnc1sxXSksIGFyZ3NbMl0pOworCQl9CisJCWJyZWFrOworCWNhc2UgV0FMX0RCR0lEX0NIQU5ORUxfQ0hBTkdFX0ZPUkNFX1JFU0VUOgorCQlpZiAobnVtYXJncyA9PSA0KSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJXQUwgY2hhbm5lbCBjaGFuZ2UgKGZvcmNlIHJlc2V0KSBmcmVxPSV1LCBmbGFncz0ldSBtb2RlPSV1IHJ4X29rPSV1IHR4X29rPSV1IiwKKwkJCQkgICAgICBhcmdzWzBdICYgMHgwMDAwZmZmZiwKKwkJCQkgICAgICAoYXJnc1swXSAmIDB4ZmZmZjAwMDApID4+IDE2LCBhcmdzWzFdLAorCQkJCSAgICAgIGFyZ3NbMl0sIGFyZ3NbM10pOworCQl9CisJCWJyZWFrOworCWNhc2UgV0FMX0RCR0lEX0NIQU5ORUxfQ0hBTkdFOgorCQlpZiAobnVtYXJncyA9PSAyKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJXQUwgY2hhbm5lbCBjaGFuZ2UgZnJlcT0ldSwgbW9kZT0ldSBmbGFncz0ldSByeF9vaz0xIHR4X29rPTEiLAorCQkJCSAgICAgIGFyZ3NbMF0gJiAweDAwMDBmZmZmLAorCQkJCSAgICAgIChhcmdzWzBdICYgMHhmZmZmMDAwMCkgPj4gMTYsIGFyZ3NbMV0pOworCQl9CisJCWJyZWFrOworCWNhc2UgV0FMX0RCR0lEX1ZERVZfU1RBUlQ6CisJCWlmIChudW1hcmdzID09IDEpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsICJXQUwgJXMgdmRldiBzdGFydGVkIiwKKwkJCQkgICAgICBXQUxfVkRFVl9UWVBFKGFyZ3NbMF0pKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdBTF9EQkdJRF9WREVWX1NUT1A6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsICJXQUwgJXMgdmRldiBzdG9wcGVkIiwKKwkJCSAgICAgIFdBTF9WREVWX1RZUEUoYXJnc1swXSkpOworCQlicmVhazsKKwljYXNlIFdBTF9EQkdJRF9WREVWX1VQOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLCAiV0FMICVzIHZkZXYgdXAsIGNvdW50PSV1IiwKKwkJCSAgICAgIFdBTF9WREVWX1RZUEUoYXJnc1swXSksIGFyZ3NbMV0pOworCQlicmVhazsKKwljYXNlIFdBTF9EQkdJRF9WREVWX0RPV046CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsICJXQUwgJXMgdmRldiBkb3duLCBjb3VudD0ldSIsCisJCQkgICAgICBXQUxfVkRFVl9UWVBFKGFyZ3NbMF0pLCBhcmdzWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBXQUxfREJHSURfVFhfTUdNVF9ERVNDSURfU0VRX1RZUEVfTEVOOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIldBTCBUeCBNZ210IGZyYW1lIGRlc2NfaWQ9MHgleCwgc2VxPTB4JXgsIHR5cGU9MHgleCwgbGVuPTB4JXggaXNsb2NhbD0weCV4IiwKKwkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sCisJCQkgICAgICAoYXJnc1szXSAmIDB4ZmZmZjAwMDApID4+IDE2LAorCQkJICAgICAgYXJnc1szXSAmIDB4MDAwMGZmZmYpOworCQlicmVhazsKKwljYXNlIFdBTF9EQkdJRF9UWF9NR01UX0NPTVBfREVTQ0lEX1NUQVRVUzoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCSAgICAgICJXQUwgVHggTWdtdCBmcmFtZSBjb21wbGV0aW9uIGRlc2NfaWQ9MHgleCwgc3RhdHVzPTB4JXgsIGlzbG9jYWw9MHgleCIsCisJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKKwkJYnJlYWs7CisJY2FzZSBXQUxfREJHSURfVFhfREFUQV9NU0RVSURfU0VRX1RZUEVfTEVOOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIldBTCBUeCBEYXRhIGZyYW1lIG1zZHVfaWQ9MHgleCwgc2VxPTB4JXgsIHR5cGU9MHgleCwgbGVuPTB4JXgiLAorCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7CisJCWJyZWFrOworCWNhc2UgV0FMX0RCR0lEX1RYX0RBVEFfQ09NUF9NU0RVSURfU1RBVFVTOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIldBTCBUeCBEYXRhIGZyYW1lIGNvbXBsZXRpb24gZGVzY19pZD0weCV4LCBzdGF0dXM9MHgleCwgc2VxPTB4JXgiLAorCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisJCWJyZWFrOworCWNhc2UgV0FMX0RCR0lEX1JFU0VUX1BDVV9DWUNMRV9DTlQ6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkgICAgICAiV0FMIFBDVSBjeWNsZSBjb3VudGVyIHZhbHVlIGF0IHJlc2V0OiV4IiwKKwkJCSAgICAgIGFyZ3NbMF0pOworCQlicmVhazsKKwljYXNlIFdBTF9EQkdJRF9UWF9ESVNDQVJEOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIldBTCBUeCBlbnF1ZXVlIGRpc2NhcmQgbXNkdV9pZD0weCV4IiwgYXJnc1swXSk7CisJCWJyZWFrOworCWNhc2UgV0FMX0RCR0lEX1NFVF9IV19DSEFJTk1BU0s6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsICJXQUxfREJHSURfU0VUX0hXX0NIQUlOTUFTSyAiCisJCQkgICAgICAicGRldj0lZCwgdHhjaGFpbj0weCV4LCByeGNoYWluPTB4JXgiLAorCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisJCWJyZWFrOworCWNhc2UgV0FMX0RCR0lEX1NFVF9IV19DSEFJTk1BU0tfVFhSWF9TVE9QX0ZBSUw6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkgICAgICAiV0FMX0RCR0lEX1NFVF9IV19DSEFJTk1BU0tfVFhSWF9TVE9QX0ZBSUwgcnhzdG9wPSVkLCB0eHN0b3A9JWQiLAorCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSk7CisJCWJyZWFrOworCWNhc2UgV0FMX0RCR0lEX0dFVF9IV19DSEFJTk1BU0s6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsICJXQUxfREJHSURfR0VUX0hXX0NIQUlOTUFTSyAiCisJCQkgICAgICAidHhjaGFpbj0weCV4LCByeGNoYWluPTB4JXgiLCBhcmdzWzBdLCBhcmdzWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBXQUxfREJHSURfU01QU19ESVNBQkxFOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLCAiV0FMX0RCR0lEX1NNUFNfRElTQUJMRSIpOworCQlicmVhazsKKwljYXNlIFdBTF9EQkdJRF9TTVBTX0VOQUJMRV9IV19DTlRSTDoKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCSAgICAgICJXQUxfREJHSURfU01QU19FTkFCTEVfSFdfQ05UUkwgbG93X3B3cl9tYXNrPTB4JXgsIGhpZ2hfcHdyX21hc2s9MHgleCIsCisJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBXQUxfREJHSURfU01QU19TV1NFTF9DSEFJTk1BU0s6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkgICAgICAiV0FMX0RCR0lEX1NNUFNfU1dTRUxfQ0hBSU5NQVNLIGxvd19wd3I9MHgleCwgY2hhaW5fbWFzaz0weCV4IiwKKwkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK0FfQk9PTAorZGJnbG9nX3NjYW5fcHJpbnRfaGFuZGxlcihBX1VJTlQzMiBtb2RfaWQsCisJCQkgIEFfVUlOVDE2IHZhcF9pZCwKKwkJCSAgQV9VSU5UMzIgZGJnX2lkLAorCQkJICBBX1VJTlQzMiB0aW1lc3RhbXAsIEFfVUlOVDE2IG51bWFyZ3MsIEFfVUlOVDMyICphcmdzKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpzdGF0ZXNbXSA9IHsKKwkJIklETEUiLAorCQkiQlNTQ0hBTiIsCisJCSJXQUlUX0ZPUkVJR05fQ0hBTiIsCisJCSJGT1JFSUdOX0NIQU5ORUwiLAorCQkiVEVSTUlOQVRJTkciCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICpldmVudHNbXSA9IHsKKwkJIlJFUSIsCisJCSJTVE9QIiwKKwkJIkJTU0NIQU4iLAorCQkiRk9SRUlHTl9DSEFOIiwKKwkJIkNIRUNLX0FDVElWSVRZIiwKKwkJIlJFU1RfVElNRV9FWFBJUkUiLAorCQkiRFdFTExfVElNRV9FWFBJUkUiLAorCQkiUFJPQkVfVElNRV9FWFBJUkUiLAorCX07CisKKwlzd2l0Y2ggKGRiZ19pZCkgeworCWNhc2UgREJHTE9HX0RCR0lEX1NNX0ZSQU1FV09SS19QUk9YWV9EQkdMT0dfTVNHOgorCQlkYmdsb2dfc21fcHJpbnQodGltZXN0YW1wLCB2YXBfaWQsIG51bWFyZ3MsIGFyZ3MsICJTQ0FOIiwKKwkJCQlzdGF0ZXMsIENERl9BUlJBWV9TSVpFKHN0YXRlcyksIGV2ZW50cywKKwkJCQlDREZfQVJSQVlfU0laRShldmVudHMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitBX0JPT0wgZGJnbG9nX2NvZXhfcHJpbnRfaGFuZGxlcihBX1VJTlQzMiBtb2RfaWQsCisJCQkJIEFfVUlOVDE2IHZhcF9pZCwKKwkJCQkgQV9VSU5UMzIgZGJnX2lkLAorCQkJCSBBX1VJTlQzMiB0aW1lc3RhbXAsCisJCQkJIEFfVUlOVDE2IG51bWFyZ3MsIEFfVUlOVDMyICphcmdzKQoreworCUFfVUlOVDggaTsKKwljaGFyICpkYmdfaWRfc3RyOworCisJc3RhdGljIGNvbnN0IGNoYXIgKndsYW5fcnhfeHB1dF9zdGF0dXNbXSA9IHsKKwkJIldMQU5fWFBVVF9OT1JNQUwiLAorCQkiV0xBTl9YUFVUX1VOREVSX1RIUkVTSCIsCisJCSJXTEFOX1hQVVRfQ1JJVElDQUwiLAorCQkiV0xBTl9YUFVUX1JFQ09WRVJZX1RJTUVPVVQiLAorCX07CisKKwlzdGF0aWMgY29uc3QgY2hhciAqY29leF9zY2hlZF9yZXFbXSA9IHsKKwkJIlNDSEVEX1JFUV9ORVhUIiwKKwkJIlNDSEVEX1JFUV9CVCIsCisJCSJTQ0hFRF9SRVFfV0xBTiIsCisJCSJTQ0hFRF9SRVFfUE9TVFBBVVNFIiwKKwkJIlNDSEVEX1JFUV9VTlBBVVNFIiwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvZXhfc2NoZWRfdHlwZVtdID0geworCQkiU0NIRURfTk9ORSIsCisJCSJTQ0hFRF9XTEFOIiwKKwkJIlNDSEVEX0JUIiwKKwkJIlNDSEVEX1dMQU5fUEFVU0UiLAorCQkiU0NIRURfV0xBTl9QT1NUUEFVU0UiLAorCQkiU0NIRURfV0xBTl9VTlBBVVNFIiwKKwkJIkNPRVhfU0NIRURfTVdTIiwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvZXhfdHJmX21nbXRfdHlwZVtdID0geworCQkiVFJGX01HTVRfRlJFRVJVTiIsCisJCSJUUkZfTUdNVF9TSEFQRV9QTSIsCisJCSJUUkZfTUdNVF9TSEFQRV9QU1AiLAorCQkiVFJGX01HTVRfU0hBUEVfU19DVFMiLAorCQkiVFJGX01HTVRfU0hBUEVfT0NTIiwKKwkJIlRSRl9NR01UX1NIQVBFX0ZJWEVEX1RJTUUiLAorCQkiVFJGX01HTVRfU0hBUEVfTk9BIiwKKwkJIlRSRl9NR01UX1NIQVBFX09DU19DUklUSUNBTCIsCisJCSJUUkZfTUdNVF9OT05FIiwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvZXhfc3lzdGVtX3N0YXR1c1tdID0geworCQkiQUxMX09GRiIsCisJCSJCVENPRVhfTk9UX1JFUUQiLAorCQkiV0xBTl9JU19JRExFIiwKKwkJIkVYRUNVVEVfU0NIRU1FIiwKKwkJIkJUX0ZVTExfQ09OQ1VSUkVOQ1kiLAorCQkiV0xBTl9TTEVFUElORyIsCisJCSJXTEFOX0lTX1BBVVNFRCIsCisJCSJXQUlUX0ZPUl9ORVhUX0FDVElPTiIsCisJCSJTT0NfV0FLRSIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICp3bGFuX3Jzc2lfdHlwZVtdID0geworCQkiTE9XX1JTU0kiLAorCQkiTUlEX1JTU0kiLAorCQkiSElfUlNTSSIsCisJCSJJTlZBTElEX1JTU0kiLAorCX07CisKKwlzdGF0aWMgY29uc3QgY2hhciAqY29leF9idF9zY2hlbWVbXSA9IHsKKwkJIklETEVfQ1RSTCIsCisJCSJBQ1RJVkVfQVNZTkNfQ1RSTCIsCisJCSJQQVNTSVZFX1NZTkNfQ1RSTCIsCisJCSJBQ1RJVkVfU1lOQ19DVFJMIiwKKwkJIkRFRkFVTFRfQ1RSTCIsCisJCSJDT05DVVJSRU5DWV9DVFJMIiwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKndhbF9wZWVyX3J4X3JhdGVfc3RhdHNfZXZlbnRfc2VudFtdID0geworCQkiUFJfUlhfRVZUX1NFTlRfTk9ORSIsCisJCSJQUl9SWF9FVlRfU0VOVF9MT1dFUiIsCisJCSJQUl9SWF9FVlRfU0VOVF9VUFBFUiIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICp3bGFuX3BzcF9zdGltdWx1c1tdID0geworCQkiRU5UUlkiLAorCQkiRVhJVCIsCisJCSJQU19SRUFEWSIsCisJCSJQU19OT1RfUkVBRFkiLAorCQkiUlhfTU9SRV9EQVRBX1JDVkQiLAorCQkiUlhfTk9fTU9SRV9EQVRBX1JDVkQiLAorCQkiVFhfREFUQV9DT01QTFQiLAorCQkiVFhfQ09NUExUIiwKKwkJIlRJTV9TRVQiLAorCQkiUkVRIiwKKwkJIkRPTkVfU1VDQ0VTUyIsCisJCSJET05FX05PX1BTX1BPTExfQUNLIiwKKwkJIkRPTkVfUkVTUE9OU0VfVE1PIiwKKwkJIkRPTkVfRFJPUFBFRCIsCisJCSJET05FX0ZJTFRFUkVEIiwKKwkJIldMQU5fU1RBUlQiLAorCQkiTk9OV0xBTl9TVEFSVCIsCisJCSJOT05XTEFOX0lOVFZMX1VQREFURSIsCisJCSJOVUxMX1RYIiwKKwkJIk5VTExfVFhfQ09NUExUIiwKKwkJIkJNSVNTX0ZJUlNUIiwKKwkJIk5VTExfVFhfRkFJTCIsCisJCSJSWF9OT19NT1JFX0RBVEFfREFUQUZSTSIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICpjb2V4X3BzcG9sbF9zdGF0ZVtdID0geworCQkiU1RBVEVfRElTQUJMRUQiLAorCQkiU1RBVEVfTk9UX1JFQURZIiwKKwkJIlNUQVRFX0VOQUJMRUQiLAorCQkiU1RBVEVfUkVBRFkiLAorCQkiU1RBVEVfVFhfU1RBVFVTIiwKKwkJIlNUQVRFX1JYX1NUQVRVUyIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICpjb2V4X3NjaGVkdWxlcl9pbnRlcnZhbFtdID0geworCQkiQ09FWF9TQ0hFRF9OT05XTEFOX0lOVCIsCisJCSJDT0VYX1NDSEVEX1dMQU5fSU5UIiwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKndsYW5fd2VpZ2h0W10gPSB7CisJCSJCVF9DT0VYX0JBU0UiLAorCQkiQlRfQ09FWF9MT1ciLAorCQkiQlRfQ09FWF9NSUQiLAorCQkiQlRfQ09FWF9NSURfTk9OU1lOQyIsCisJCSJCVF9DT0VYX0hJX05PTlZPSUNFIiwKKwkJIkJUX0NPRVhfSEkiLAorCQkiQlRfQ09FWF9DUklUSUNBTCIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICp3bGFuX3Bvd2VyX3N0YXRlW10gPSB7CisJCSJTTEVFUCIsCisJCSJBV0FLRSIsCisJCSJGVUxMX1NMRUVQIiwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvZXhfcHNwX2Vycm9yX3R5cGVbXSA9IHsKKwkJIkRJU0FCTEVEX1NUQVRFIiwKKwkJIlZERVZfTlVMTCIsCisJCSJDT0VYX1BTUF9FTlRSWSIsCisJCSJaRVJPX0lOVEVSVkFMIiwKKwkJIkNPRVhfUFNQX0VYSVQiLAorCQkiUkVBRFlfRElTQUJMRUQiLAorCQkiUkVBRFlfTk9UX0RJU0FCTEVEIiwKKwkJIlBPTExfUEtUX0RST1BQRUQiLAorCQkiU0VUX1RJTUVSX1BBUkFNIiwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKndsYW5fcGh5bW9kZVtdID0geworCQkiQSIsCisJCSJHIiwKKwkJIkIiLAorCQkiR19PTkxZIiwKKwkJIk5BX0hUMjAiLAorCQkiTkdfSFQyMCIsCisJCSJOQV9IVDQwIiwKKwkJIk5HX0hUNDAiLAorCQkiQUNfVkhUMjAiLAorCQkiQUNfVkhUNDAiLAorCQkiQUNfVkhUODAiLAorCQkiQUNfVkhUMjBfMkciLAorCQkiQUNfVkhUNDBfMkciLAorCQkiQUNfVkhUODBfMkciLAorCQkiVU5LTk9XTiIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICp3bGFuX2N1cnJfYmFuZFtdID0geworCQkiMkciLAorCQkiNUciLAorCX07CisKKwlkYmdfaWRfc3RyID0gZGJnbG9nX2dldF9tc2cobW9kX2lkLCBkYmdfaWQpOworCisJc3dpdGNoIChkYmdfaWQpIHsKKwljYXNlIENPRVhfU1lTVEVNX1VQREFURToKKwkJaWYgKG51bWFyZ3MgPT0gMSAmJiBhcmdzWzBdIDwgOSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwgIiVzOiAlcyIsIGRiZ19pZF9zdHIsCisJCQkJICAgICAgY29leF9zeXN0ZW1fc3RhdHVzW2FyZ3NbMF1dKTsKKwkJfSBlbHNlIGlmIChudW1hcmdzID49IDUgJiYgYXJnc1swXSA8IDkgJiYgYXJnc1syXSA8IDkpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIiVzOiAlcywgV2xhblN5c1N0YXRlKDB4JXgpLCAlcywgTnVtQ2hhaW5zKCV1KSwgQWdnckxpbWl0KCV1KSIsCisJCQkJICAgICAgZGJnX2lkX3N0ciwgY29leF9zeXN0ZW1fc3RhdHVzW2FyZ3NbMF1dLAorCQkJCSAgICAgIGFyZ3NbMV0sIGNvZXhfdHJmX21nbXRfdHlwZVthcmdzWzJdXSwKKwkJCQkgICAgICBhcmdzWzNdLCBhcmdzWzRdKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfU0NIRURfU1RBUlQ6CisJCWlmIChudW1hcmdzID49IDUgJiYgYXJnc1swXSA8IDUgJiYgYXJnc1syXSA8IDkgJiYgYXJnc1szXSA8IDQKKwkJICAgICYmIGFyZ3NbNF0gPCA0KSB7CisJCQlpZiAoYXJnc1sxXSA9PSAweGZmZmZmZmZmKSB7CisJCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkJICAgICAgIiVzOiAlcywgREVURVJNSU5FX0RVUkFUSU9OLCAlcywgJXMsICVzIiwKKwkJCQkJICAgICAgZGJnX2lkX3N0ciwKKwkJCQkJICAgICAgY29leF9zY2hlZF9yZXFbYXJnc1swXV0sCisJCQkJCSAgICAgIGNvZXhfdHJmX21nbXRfdHlwZVthcmdzWzJdXSwKKwkJCQkJICAgICAgd2xhbl9yeF94cHV0X3N0YXR1c1thcmdzWzNdXSwKKwkJCQkJICAgICAgd2xhbl9yc3NpX3R5cGVbYXJnc1s0XV0pOworCQkJfSBlbHNlIHsKKwkJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCQkgICAgICAiJXM6ICVzLCBJbnR2bER1cigldSksICVzLCAlcywgJXMiLAorCQkJCQkgICAgICBkYmdfaWRfc3RyLAorCQkJCQkgICAgICBjb2V4X3NjaGVkX3JlcVthcmdzWzBdXSwgYXJnc1sxXSwKKwkJCQkJICAgICAgY29leF90cmZfbWdtdF90eXBlW2FyZ3NbMl1dLAorCQkJCQkgICAgICB3bGFuX3J4X3hwdXRfc3RhdHVzW2FyZ3NbM11dLAorCQkJCQkgICAgICB3bGFuX3Jzc2lfdHlwZVthcmdzWzRdXSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDT0VYX1NDSEVEX1JFU1VMVDoKKwkJaWYgKG51bWFyZ3MgPj0gNSAmJiBhcmdzWzBdIDwgNSAmJiBhcmdzWzFdIDwgOSAmJiBhcmdzWzJdIDwgOSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiJXM6ICVzLCAlcywgJXMsIENvZXhNZ3JQb2xpY3koJXUpLCBJZGxlT3ZlcnJpZGUoJXUpIiwKKwkJCQkgICAgICBkYmdfaWRfc3RyLCBjb2V4X3NjaGVkX3JlcVthcmdzWzBdXSwKKwkJCQkgICAgICBjb2V4X3RyZl9tZ210X3R5cGVbYXJnc1sxXV0sCisJCQkJICAgICAgY29leF90cmZfbWdtdF90eXBlW2FyZ3NbMl1dLCBhcmdzWzNdLAorCQkJCSAgICAgIGFyZ3NbNF0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ09FWF9CVF9TQ0hFTUU6CisJCWlmIChudW1hcmdzID49IDEgJiYgYXJnc1swXSA8IDYpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsICIlczogJXMiLCBkYmdfaWRfc3RyLAorCQkJCSAgICAgIGNvZXhfYnRfc2NoZW1lW2FyZ3NbMF1dKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfVFJGX0ZSRUVSVU46CisJCWlmIChudW1hcmdzID49IDUgJiYgYXJnc1swXSA8IDcpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIiVzOiAlcywgQWxsb2NhdGVkQnRJbnR2bHMoJXUpLCBCdEludHZsQ250KCV1KSwgQWxsb2NhdGVkV2xhbkludHZscygldSksIFdsYW5JbnR2bENudCgldSkiLAorCQkJCSAgICAgIGRiZ19pZF9zdHIsIGNvZXhfc2NoZWRfdHlwZVthcmdzWzBdXSwKKwkJCQkgICAgICBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfVFJGX1NIQVBFX1BNOiAvKiB1c2VkIGJ5IG9jcyBub3cgKi8KKwkJaWYgKG51bWFyZ3MgPj0gMykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiJXM6IEludHZsTGVuZ3RoKCV1KSwgQnREdXJhdGlvbigldSksIFdsYW5EdXJhdGlvbigldSkiLAorCQkJCSAgICAgIGRiZ19pZF9zdHIsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ09FWF9TWVNURU1fTU9OSVRPUjoKKwkJaWYgKG51bWFyZ3MgPj0gNSAmJiBhcmdzWzFdIDwgNCAmJiBhcmdzWzRdIDwgNCkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiJXM6IFdsYW5SeENyaXRpY2FsKCV1KSwgJXMsIE1pbkRpcmVjdFJ4UmF0ZSgldSksIE1vbml0b3JBY3RpdmVOdW0oJXUpLCAlcyIsCisJCQkJICAgICAgZGJnX2lkX3N0ciwgYXJnc1swXSwKKwkJCQkgICAgICB3bGFuX3J4X3hwdXRfc3RhdHVzW2FyZ3NbMV1dLCBhcmdzWzJdLAorCQkJCSAgICAgIGFyZ3NbM10sIHdsYW5fcnNzaV90eXBlW2FyZ3NbNF1dKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfUlhfUkFURToKKwkJaWYgKG51bWFyZ3MgPj0gNSAmJiBhcmdzWzRdIDwgMykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiJXM6IE51bVVuZGVyVGhyZXNoUGVlcnMoJXUpLCBNaW5EaXJlY3RSYXRlKCV1KSwgTGFzdFJhdGVTYW1wbGUoJXUpLCBEZWx0YVQoJXUpLCAlcyIsCisJCQkJICAgICAgZGJnX2lkX3N0ciwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwKKwkJCQkgICAgICBhcmdzWzNdLAorCQkJCSAgICAgIHdhbF9wZWVyX3J4X3JhdGVfc3RhdHNfZXZlbnRfc2VudFthcmdzCisJCQkJCQkJCQlbNF1dKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfV0xBTl9JTlRFUlZBTF9TVEFSVDoKKwkJaWYgKG51bWFyZ3MgPj0gNSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiJXM6IFdsYW5JbnR2bENudCgldSksIER1cmF0aW9uKCV1KSwgV2VpZ2h0KCV1KSwgQmFzZUlkbGVPdmVycmlkZSgldSksIFdlaWdodE1hdFswXSgweCV4KSIsCisJCQkJICAgICAgZGJnX2lkX3N0ciwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwKKwkJCQkgICAgICBhcmdzWzNdLCBhcmdzWzRdKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfV0xBTl9QT1NUUEFVU0VfSU5URVJWQUxfU1RBUlQ6CisJCWlmIChudW1hcmdzID49IDQpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIiVzOiBXbGFuUG9zdFBhdXNlSW50dmxDbnQoJXUpLCBYcHV0TW9uaXRvckFjdGl2ZU51bSgldSksIER1cmF0aW9uKCV1KSwgV2VpZ2h0KCV1KSIsCisJCQkJICAgICAgZGJnX2lkX3N0ciwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwKKwkJCQkgICAgICBhcmdzWzNdKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfQlRfSU5URVJWQUxfU1RBUlQ6CisJCWlmIChudW1hcmdzID49IDUpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIiVzOiBCdEludHZsQ250KCV1KSwgRHVyYXRpb24oJXUpLCBXZWlnaHQoJXUpLCBCYXNlSWRsZU92ZXJyaWRlKCV1KSwgV2VpZ2h0TWF0WzBdKDB4JXgpLCAiLAorCQkJCSAgICAgIGRiZ19pZF9zdHIsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sCisJCQkJICAgICAgYXJnc1szXSwgYXJnc1s0XSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDT0VYX1BPV0VSX0NIQU5HRToKKwkJaWYgKG51bWFyZ3MgPj0gMyAmJiBhcmdzWzFdIDwgMyAmJiBhcmdzWzJdIDwgMykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiJXM6IEV2ZW50KDB4JXgpICVzLT4lcyIsIGRiZ19pZF9zdHIsCisJCQkJICAgICAgYXJnc1swXSwgd2xhbl9wb3dlcl9zdGF0ZVthcmdzWzFdXSwKKwkJCQkgICAgICB3bGFuX3Bvd2VyX3N0YXRlW2FyZ3NbMl1dKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfQ0hBTk5FTF9DSEFOR0U6CisJCWlmIChudW1hcmdzID49IDUgJiYgYXJnc1szXSA8IDIgJiYgYXJnc1s0XSA8IDE1KSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICIlczogJXVNaHotPiV1TWh6LCBXbGFuU3lzU3RhdGUoMHgleCksIEN1cnJCYW5kKCVzKSwgUGh5TW9kZSglcykiLAorCQkJCSAgICAgIGRiZ19pZF9zdHIsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sCisJCQkJICAgICAgd2xhbl9jdXJyX2JhbmRbYXJnc1szXV0sCisJCQkJICAgICAgd2xhbl9waHltb2RlW2FyZ3NbNF1dKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfUFNQX01HUl9FTlRFUjoKKwkJaWYgKG51bWFyZ3MgPj0gNSAmJiBhcmdzWzBdIDwgMjMgJiYgYXJnc1sxXSA8IDYgJiYgYXJnc1szXSA8IDIpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIiVzOiAlcywgJXMsIFBzUG9sbEF2ZygldSksICVzLCBDdXJyVCgldSkiLAorCQkJCSAgICAgIGRiZ19pZF9zdHIsIHdsYW5fcHNwX3N0aW11bHVzW2FyZ3NbMF1dLAorCQkJCSAgICAgIGNvZXhfcHNwb2xsX3N0YXRlW2FyZ3NbMV1dLCBhcmdzWzJdLAorCQkJCSAgICAgIGNvZXhfc2NoZWR1bGVyX2ludGVydmFsW2FyZ3NbM11dLAorCQkJCSAgICAgIGFyZ3NbNF0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCS8qIFRyYW5zbGF0ZSBmb2xsb3dpbmcgaW50byBkZWNpbWFsICovCisJY2FzZSBDT0VYX1NJTkdMRUNIQUlOX0RCR18xOgorCWNhc2UgQ09FWF9TSU5HTEVDSEFJTl9EQkdfMjoKKwljYXNlIENPRVhfU0lOR0xFQ0hBSU5fREJHXzM6CisJY2FzZSBDT0VYX01VTFRJQ0hBSU5fREJHXzE6CisJY2FzZSBDT0VYX01VTFRJQ0hBSU5fREJHXzI6CisJY2FzZSBDT0VYX01VTFRJQ0hBSU5fREJHXzM6CisJY2FzZSBCVENPRVhfREJHX01DSV8xOgorCWNhc2UgQlRDT0VYX0RCR19NQ0lfMjoKKwljYXNlIEJUQ09FWF9EQkdfTUNJXzM6CisJY2FzZSBCVENPRVhfREJHX01DSV80OgorCWNhc2UgQlRDT0VYX0RCR19NQ0lfNToKKwljYXNlIEJUQ09FWF9EQkdfTUNJXzY6CisJY2FzZSBCVENPRVhfREJHX01DSV83OgorCWNhc2UgQlRDT0VYX0RCR19NQ0lfODoKKwljYXNlIEJUQ09FWF9EQkdfTUNJXzk6CisJY2FzZSBCVENPRVhfREJHX01DSV8xMDoKKworCQlpZiAobnVtYXJncyA+IDApIHsKKwkJCWRiZ2xvZ19wcmludGZfbm9fbGluZV9icmVhayh0aW1lc3RhbXAsIHZhcF9pZCwgIiVzOiAldSIsCisJCQkJCQkgICAgZGJnX2lkX3N0ciwgYXJnc1swXSk7CisJCQlmb3IgKGkgPSAxOyBpIDwgbnVtYXJnczsgaSsrKSB7CisJCQkJcHJpbnRrKCIsICV1IiwgYXJnc1tpXSk7CisJCQl9CisJCQlwcmludGsoIlxuIik7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDT0VYX0xpbmtJRDoKKwkJaWYgKG51bWFyZ3MgPj0gNCkgeworCQkJaWYgKGFyZ3NbMF0pIHsgIC8qIEFkZCBwcm9maWxlICovCisJCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkJICAgICAgIiVzIEFsbG9jOiBMb2NhbElEKCV1KSwgUmVtb3RlSUQoJXUpLCBNaW5GcmVlTG9jYWxJRCgldSkiLAorCQkJCQkgICAgICBkYmdfaWRfc3RyLCBhcmdzWzFdLCBhcmdzWzJdLAorCQkJCQkgICAgICBhcmdzWzNdKTsKKwkJCX0gZWxzZSB7ICAgICAgICAvKiBSZW1vdmUgcHJvZmlsZSAqLworCQkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJCSAgICAgICIlcyBEZWFsbG9jOiBMb2NhbElEKCV1KSwgUmVtb3RlSUQoJXUpLCBNaW5GcmVlTG9jYWxJRCgldSkiLAorCQkJCQkgICAgICBkYmdfaWRfc3RyLCBhcmdzWzFdLCBhcmdzWzJdLAorCQkJCQkgICAgICBhcmdzWzNdKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfUFNQX01HUl9SRVNVTFQ6CisJCWlmIChudW1hcmdzID49IDUgJiYgYXJnc1swXSA8IDYpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIiVzOiAlcywgUHNQb2xsQXZnKCV1KSwgRXN0aW1hdGlvbk92ZXJydW4oJXUpLCBFc3RpbWF0aW9uVW5kZXJ1bigldSksIE5vdFJlYWR5RXJyKCV1KSIsCisJCQkJICAgICAgZGJnX2lkX3N0ciwgY29leF9wc3BvbGxfc3RhdGVbYXJnc1swXV0sCisJCQkJICAgICAgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDT0VYX1RSRl9TSEFQRV9QU1A6CisJCWlmIChudW1hcmdzID49IDUgJiYgYXJnc1swXSA8IDcgJiYgYXJnc1sxXSA8IDcpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIiVzOiAlcywgJXMsIER1cigldSksIEJ0VHJpZ2dlclJlY3ZkKCV1KSwgUHNwV2xhbkNyaXRpY2FsKCV1KSIsCisJCQkJICAgICAgZGJnX2lkX3N0ciwgY29leF9zY2hlZF90eXBlW2FyZ3NbMF1dLAorCQkJCSAgICAgIHdsYW5fd2VpZ2h0W2FyZ3NbMV1dLCBhcmdzWzJdLCBhcmdzWzNdLAorCQkJCSAgICAgIGFyZ3NbNF0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ09FWF9QU1BfU1BFQ19QT0xMOgorCQlpZiAobnVtYXJncyA+PSA1KSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICIlczogUHNQb2xsU3BlY0VuYSgldSksIENvdW50KCV1KSwgTmV4dFRTKCV1KSwgQWxsb3dTcGVjUHNQb2xsVHgoJXUpLCBJbnR2bCgldSkiLAorCQkJCSAgICAgIGRiZ19pZF9zdHIsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sCisJCQkJICAgICAgYXJnc1szXSwgYXJnc1s0XSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDT0VYX1BTUF9SRUFEWV9TVEFURToKKwkJaWYgKG51bWFyZ3MgPj0gNSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiJXM6IFQyTm9uV2xhbigldSksIENvZXhTY2hlZHVsZXJFbmRUUygldSksIE1vcmVEYXRhKCV1KSwgUFNQUmVzcEV4cGVjdGVkVFMoJXUpLCBOb25XbGFuSWRsZVQoJXUpIiwKKwkJCQkgICAgICBkYmdfaWRfc3RyLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLAorCQkJCSAgICAgIGFyZ3NbM10sIGFyZ3NbNF0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ09FWF9QU1BfTk9OV0xBTl9JTlRFUlZBTDoKKwkJaWYgKG51bWFyZ3MgPj0gNCkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiJXM6IE5vbldsYW5CYXNlSW50dmwoJXUpLCBOb25XbGFuSWRsZVQoJXUpLCBQU1BTcGVjSW50dmwoJXUpLCBBcFJlc3BUaW1lb3V0KCV1KSIsCisJCQkJICAgICAgZGJnX2lkX3N0ciwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwKKwkJCQkgICAgICBhcmdzWzNdKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENPRVhfUFNQX0VSUk9SOgorCQlpZiAobnVtYXJncyA+PSAxICYmIGFyZ3NbMF0gPCA5KSB7CisJCQlkYmdsb2dfcHJpbnRmX25vX2xpbmVfYnJlYWsodGltZXN0YW1wLCB2YXBfaWQsICIlczogJXMiLAorCQkJCQkJICAgIGRiZ19pZF9zdHIsCisJCQkJCQkgICAgY29leF9wc3BfZXJyb3JfdHlwZVthcmdzCisJCQkJCQkJCQlbMF1dKTsKKwkJCWZvciAoaSA9IDE7IGkgPCBudW1hcmdzOyBpKyspIHsKKwkJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0lORk8sCisJCQkJCQkoIiwgJXUiLCBhcmdzW2ldKSk7CisJCQl9CisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0lORk8sICgiXG4iKSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDT0VYX1BTUF9TVEFUXzE6CisJCWlmIChudW1hcmdzID49IDUpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIiVzOiBBcFJlc3AwKCV1KSwgQXBSZXNwMSgldSksIEFwUmVzcDIoJXUpLCBBcFJlc3AzKCV1KSwgQXBSZXNwNCgldSkiLAorCQkJCSAgICAgIGRiZ19pZF9zdHIsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sCisJCQkJICAgICAgYXJnc1szXSwgYXJnc1s0XSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDT0VYX1BTUF9TVEFUXzI6CisJCWlmIChudW1hcmdzID49IDUpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIiVzOiBEYXRhUHQoJXUpLCBNYXgoJXUpLCBOZXh0QXBSZXNwSW5kZXgoJXUpLCBOdW1PZlZhbGlkRGF0YVB0cygldSksIFBzUG9sbEF2ZygldSkiLAorCQkJCSAgICAgIGRiZ19pZF9zdHIsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sCisJCQkJICAgICAgYXJnc1szXSwgYXJnc1s0XSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDT0VYX1BTUF9SWF9TVEFUVVNfU1RBVEVfMToKKwkJaWYgKG51bWFyZ3MgPj0gNSkgeworCQkJaWYgKGFyZ3NbMl0pIHsKKwkJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCQkgICAgICAiJXM6IFJzRXhwZWN0ZWRUUygldSksIFJlc3BBY3R1YWxUUygldSksIE92ZXJydW4sIFJzT3ZlcnJ1blQoJXUpLCBSc1J4RHVyKCV1KSIsCisJCQkJCSAgICAgIGRiZ19pZF9zdHIsIGFyZ3NbMF0sIGFyZ3NbMV0sCisJCQkJCSAgICAgIGFyZ3NbM10sIGFyZ3NbNF0pOworCQkJfSBlbHNlIHsKKwkJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCQkgICAgICAiJXM6IFJzRXhwZWN0ZWRUUygldSksIFJlc3BBY3R1YWxUUygldSksIFVuZGVycnVuLCBSc1VuZGVycnVuVCgldSksIFJzUnhEdXIoJXUpIiwKKwkJCQkJICAgICAgZGJnX2lkX3N0ciwgYXJnc1swXSwgYXJnc1sxXSwKKwkJCQkJICAgICAgYXJnc1szXSwgYXJnc1s0XSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitBX0JPT0wKK2RiZ2xvZ19iZWFjb25fcHJpbnRfaGFuZGxlcihBX1VJTlQzMiBtb2RfaWQsCisJCQkgICAgQV9VSU5UMTYgdmFwX2lkLAorCQkJICAgIEFfVUlOVDMyIGRiZ19pZCwKKwkJCSAgICBBX1VJTlQzMiB0aW1lc3RhbXAsCisJCQkgICAgQV9VSU5UMTYgbnVtYXJncywgQV9VSU5UMzIgKmFyZ3MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRlc1tdID0geworCQkiSU5JVCIsCisJCSJBREpVU1RfU1RBUlQiLAorCQkiQURKVVNUSU5HIiwKKwkJIkFESlVTVF9IT0xEIiwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmV2ZW50c1tdID0geworCQkiQURKVVNUX1NUQVJUIiwKKwkJIkFESlVTVF9SRVNUQVJUIiwKKwkJIkFESlVTVF9TVE9QIiwKKwkJIkFESlVTVF9QQVVTRSIsCisJCSJBREpVU1RfVU5QQVVTRSIsCisJCSJBREpVU1RfSU5DX1NMT1BfU1RFUCIsCisJCSJBREpVU1RfSE9MRCIsCisJCSJBREpVU1RfSE9MRF9USU1FX09VVCIsCisJfTsKKworCXN3aXRjaCAoZGJnX2lkKSB7CisJY2FzZSBEQkdMT0dfREJHSURfU01fRlJBTUVXT1JLX1BST1hZX0RCR0xPR19NU0c6CisJCWRiZ2xvZ19zbV9wcmludCh0aW1lc3RhbXAsIHZhcF9pZCwgbnVtYXJncywgYXJncywgIkVBUkxZX1JYIiwKKwkJCQlzdGF0ZXMsIENERl9BUlJBWV9TSVpFKHN0YXRlcyksIGV2ZW50cywKKwkJCQlDREZfQVJSQVlfU0laRShldmVudHMpKTsKKwkJYnJlYWs7CisJY2FzZSBCRUFDT05fRVZFTlRfRUFSTFlfUlhfQk1JU1NfU1RBVFVTOgorCQlpZiAobnVtYXJncyA9PSAzKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJlYXJseV9yeCBibWlzcyBzdGF0dXM6cmN2PSVkIHRvdGFsPSVkIG1pc3M9JWQiLAorCQkJCSAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworCQl9CisJCWJyZWFrOworCWNhc2UgQkVBQ09OX0VWRU5UX0VBUkxZX1JYX1NMRUVQX1NMT1A6CisJCWlmIChudW1hcmdzID09IDEpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgImVhcmx5X3J4IHVwZGF0ZSBzbGVlcF9zbG9wOiVkIiwgYXJnc1swXSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCRUFDT05fRVZFTlRfRUFSTFlfUlhfQ09OVF9CTUlTU19USU1FT1VUOgorCQlpZiAobnVtYXJncyA9PSAxKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJlYXJseV9yeCBjb250IGJtaXNzIHRpbWVvdXQsdXBkYXRlIHNsZWVwX3Nsb3A6JWQiLAorCQkJCSAgICAgIGFyZ3NbMF0pOworCQl9CisJCWJyZWFrOworCWNhc2UgQkVBQ09OX0VWRU5UX0VBUkxZX1JYX1BBVVNFX1NLSVBfQkNOX05VTToKKwkJaWYgKG51bWFyZ3MgPT0gMSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiZWFybHlfcnggc2tpcCBiY24gbnVtOiVkIiwgYXJnc1swXSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCRUFDT05fRVZFTlRfRUFSTFlfUlhfQ0xLX0RSSUZUOgorCQlpZiAobnVtYXJncyA9PSAxKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJlYXJseV9yeCBjbGsgZHJpZnQ6JWQiLCBhcmdzWzBdKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJFQUNPTl9FVkVOVF9FQVJMWV9SWF9BUF9EUklGVDoKKwkJaWYgKG51bWFyZ3MgPT0gMSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiZWFybHlfcnggYXAgZHJpZnQ6JWQiLCBhcmdzWzBdKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJFQUNPTl9FVkVOVF9FQVJMWV9SWF9CQ05fVFlQRToKKwkJaWYgKG51bWFyZ3MgPT0gMSkgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiZWFybHlfcnggYmNuIHR5cGU6JWQiLCBhcmdzWzBdKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK0FfQk9PTAorZGJnbG9nX2RhdGFfdHhyeF9wcmludF9oYW5kbGVyKEFfVUlOVDMyIG1vZF9pZCwKKwkJCSAgICAgICBBX1VJTlQxNiB2YXBfaWQsCisJCQkgICAgICAgQV9VSU5UMzIgZGJnX2lkLAorCQkJICAgICAgIEFfVUlOVDMyIHRpbWVzdGFtcCwKKwkJCSAgICAgICBBX1VJTlQxNiBudW1hcmdzLCBBX1VJTlQzMiAqYXJncykKK3sKKwlzd2l0Y2ggKGRiZ19pZCkgeworCWNhc2UgREFUQV9UWFJYX0RCR0lEX1JYX0RBVEFfU0VRX0xFTl9JTkZPOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIkRBVEEgUlggc2VxPTB4JXgsIGxlbj0weCV4LCBzdG9yZWQ9MHgleCwgZHVwZXJyPTB4JXgiLAorCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgKGFyZ3NbMl0gJiAweGZmZmYwMDAwKSA+PiAxNiwKKwkJCSAgICAgIGFyZ3NbMl0gJiAweDAwMDBmZmZmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitBX0JPT0wgZGJnbG9nX3NtcHNfcHJpbnRfaGFuZGxlcihBX1VJTlQzMiBtb2RfaWQsCisJCQkJIEFfVUlOVDE2IHZhcF9pZCwKKwkJCQkgQV9VSU5UMzIgZGJnX2lkLAorCQkJCSBBX1VJTlQzMiB0aW1lc3RhbXAsCisJCQkJIEFfVUlOVDE2IG51bWFyZ3MsIEFfVUlOVDMyICphcmdzKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpzdGF0ZXNbXSA9IHsKKwkJIlNfSU5BQ1RJVkUiLAorCQkiU19TVEFUSUMiLAorCQkiU19EWU5BTUlDIiwKKwkJIlNfU1RBTExFRCIsCisJCSJTX0lOQUNUSVZFX1dBSVQiLAorCQkiU19TVEFUSUNfV0FJVCIsCisJCSJTX0RZTkFNSUNfV0FJVCIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICpldmVudHNbXSA9IHsKKwkJIkVfU1RPUCIsCisJCSJFX1NUT1BfQ09NUEwiLAorCQkiRV9TVEFSVCIsCisJCSJFX1NUQVRJQyIsCisJCSJFX1NUQVRJQ19DT01QTCIsCisJCSJFX0RZTkFNSUMiLAorCQkiRV9EWU5BTUlDX0NPTVBMIiwKKwkJIkVfU1RBTEwiLAorCQkiRV9SU1NJX0FCT1ZFX1RIUkVTSCIsCisJCSJFX1JTU0lfQkVMT1dfVEhSRVNIIiwKKwkJIkVfRk9SQ0VEX05PTkUiLAorCX07CisJc3dpdGNoIChkYmdfaWQpIHsKKwljYXNlIERCR0xPR19EQkdJRF9TTV9GUkFNRVdPUktfUFJPWFlfREJHTE9HX01TRzoKKwkJZGJnbG9nX3NtX3ByaW50KHRpbWVzdGFtcCwgdmFwX2lkLCBudW1hcmdzLCBhcmdzLCAiU1RBX1NNUFMgU00iLAorCQkJCXN0YXRlcywgQ0RGX0FSUkFZX1NJWkUoc3RhdGVzKSwgZXZlbnRzLAorCQkJCUNERl9BUlJBWV9TSVpFKGV2ZW50cykpOworCQlicmVhazsKKwljYXNlIFNUQV9TTVBTX0RCR0lEX0NSRUFURV9QREVWX0lOU1RBTkNFOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLCAiU1RBX1NNUFMgQ3JlYXRlIFBERVYgY3R4ICUjeCIsCisJCQkgICAgICBhcmdzWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFfU01QU19EQkdJRF9DUkVBVEVfVklSVFVBTF9DSEFOX0lOU1RBTkNFOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIlNUQV9TTVBTIENyZWF0ZSBWaXJ0dWFsIENoYW4gY3R4ICUjeCIsIGFyZ3NbMF0pOworCQlicmVhazsKKwljYXNlIFNUQV9TTVBTX0RCR0lEX0RFTEVURV9WSVJUVUFMX0NIQU5fSU5TVEFOQ0U6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkgICAgICAiU1RBX1NNUFMgRGVsZXRlIFZpcnR1YWwgQ2hhbiBjdHggJSN4IiwgYXJnc1swXSk7CisJCWJyZWFrOworCWNhc2UgU1RBX1NNUFNfREJHSURfQ1JFQVRFX1NUQV9JTlNUQU5DRToKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwgIlNUQV9TTVBTIENyZWF0ZSBTVEEgY3R4ICUjeCIsCisJCQkgICAgICBhcmdzWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFfU01QU19EQkdJRF9ERUxFVEVfU1RBX0lOU1RBTkNFOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLCAiU1RBX1NNUFMgRGVsZXRlIFNUQSBjdHggJSN4IiwKKwkJCSAgICAgIGFyZ3NbMF0pOworCQlicmVhazsKKwljYXNlIFNUQV9TTVBTX0RCR0lEX1ZJUlRVQUxfQ0hBTl9TTVBTX1NUQVJUOgorCQlicmVhazsKKwljYXNlIFNUQV9TTVBTX0RCR0lEX1ZJUlRVQUxfQ0hBTl9TTVBTX1NUT1A6CisJCWJyZWFrOworCWNhc2UgU1RBX1NNUFNfREJHSURfU0VORF9TTVBTX0FDVElPTl9GUkFNRToKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCSAgICAgICJTVEFfU01QUyBTVEEgJSN4IFNpZ25hbCBTTVBTIG1vZGUgYXMgJXM7IGNiX2ZsYWdzICUjeCIsCisJCQkgICAgICBhcmdzWzBdLAorCQkJICAgICAgKGFyZ3NbMV0gPT0KKwkJCSAgICAgICAwID8gIkRJU0FCTEVEIiA6IChhcmdzWzFdID09CisJCQkJCQkgMHgxID8gIlNUQVRJQyIgOiAoYXJnc1sxXSA9PQorCQkJCQkJCQkgICAweDMgPworCQkJCQkJCQkgICAiRFlOQU1JQyIgOgorCQkJCQkJCQkgICAiVU5LTk9XTiIpKSksCisJCQkgICAgICBhcmdzWzJdKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFfU01QU19EQkdJRF9EVElNX0VCVF9FVkVOVF9DSE1BU0tfVVBEQVRFOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIlNUQV9TTVBTX0RCR0lEX0RUSU1fRUJUX0VWRU5UX0NITUFTS19VUERBVEUiKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFfU01QU19EQkdJRF9EVElNX0NITUFTS19VUERBVEU6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkgICAgICAiU1RBX1NNUFNfREJHSURfRFRJTV9DSE1BU0tfVVBEQVRFICIKKwkJCSAgICAgICJ0eF9tYXNrICUjeCByeF9tYXNrICUjeCBhcmJfZHRpbV9tYXNrICUjeCIsCisJCQkgICAgICBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFfU01QU19EQkdJRF9EVElNX0JFQUNPTl9FVkVOVF9DSE1BU0tfVVBEQVRFOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIlNUQV9TTVBTX0RCR0lEX0RUSU1fQkVBQ09OX0VWRU5UX0NITUFTS19VUERBVEUiKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFfU01QU19EQkdJRF9EVElNX1BPV0VSX1NUQVRFX0NIQU5HRToKKwkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCSAgICAgICJTVEFfU01QU19EQkdJRF9EVElNX1BPV0VSX1NUQVRFX0NIQU5HRSBjdXJfcHdyX3N0YXRlICVzIG5ld19wd3Jfc3RhdGUgJXMiLAorCQkJICAgICAgKGFyZ3NbMF0gPT0KKwkJCSAgICAgICAweDEgPyAiU0xFRVAiIDogKGFyZ3NbMF0gPT0KKwkJCQkJCTB4MiA/ICJBV0FLRSIgOiAoYXJnc1swXSA9PQorCQkJCQkJCQkgMHgzID8KKwkJCQkJCQkJICJGVUxMX1NMRUVQIiA6CisJCQkJCQkJCSAiVU5LTk9XTiIpKSksCisJCQkgICAgICAoYXJnc1sxXSA9PQorCQkJICAgICAgIDB4MSA/ICJTTEVFUCIgOiAoYXJnc1sxXSA9PQorCQkJCQkJMHgyID8gIkFXQUtFIiA6IChhcmdzWzFdID09CisJCQkJCQkJCSAweDMgPworCQkJCQkJCQkgIkZVTExfU0xFRVAiIDoKKwkJCQkJCQkJICJVTktOT1dOIikpKSk7CisJCWJyZWFrOworCWNhc2UgU1RBX1NNUFNfREJHSURfRFRJTV9DSE1BU0tfVVBEQVRFX1NMRUVQOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIlNUQV9TTVBTX0RCR0lEX0RUSU1fQ0hNQVNLX1VQREFURV9TTEVFUCAiCisJCQkgICAgICAidHhfbWFzayAlI3ggcnhfbWFzayAlI3ggb3JpZ19yeCAlI3ggZHRpbV9yeCAlI3giLAorCQkJICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7CisJCWJyZWFrOworCWNhc2UgU1RBX1NNUFNfREJHSURfRFRJTV9DSE1BU0tfVVBEQVRFX0FXQUtFOgorCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJICAgICAgIlNUQV9TTVBTX0RCR0lEX0RUSU1fQ0hNQVNLX1VQREFURV9BV0FLRSAiCisJCQkgICAgICAidHhfbWFzayAlI3ggcnhfbWFzayAlI3ggb3JpZ19yeCAlI3giLCBhcmdzWzBdLAorCQkJICAgICAgYXJnc1sxXSwgYXJnc1syXSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsICJTVEFfU01QUzogVU5LTk9XTiBEQkdJRCEiKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitBX0JPT0wKK2RiZ2xvZ19wMnBfcHJpbnRfaGFuZGxlcihBX1VJTlQzMiBtb2RfaWQsCisJCQkgQV9VSU5UMTYgdmFwX2lkLAorCQkJIEFfVUlOVDMyIGRiZ19pZCwKKwkJCSBBX1VJTlQzMiB0aW1lc3RhbXAsIEFfVUlOVDE2IG51bWFyZ3MsIEFfVUlOVDMyICphcmdzKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpzdGF0ZXNbXSA9IHsKKwkJIkFDVElWRSIsCisJCSJET1pFIiwKKwkJIlRYX0JDTiIsCisJCSJDVFdJTiIsCisJCSJPUFBQUyIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICpldmVudHNbXSA9IHsKKwkJIk9ORVNIT1RfTk9BIiwKKwkJIkNUV0lORE9XIiwKKwkJIlBFUklPRElDX05PQSIsCisJCSJJRExFIiwKKwkJIk5PQV9DSEFOR0VEIiwKKwkJIlRCVFQiLAorCQkiVFhfQkNOX0NNUCIsCisJCSJPUFBQU19PSyIsCisJCSJPUFBQU19DSEFOR0VEIiwKKwl9OworCisJc3dpdGNoIChkYmdfaWQpIHsKKwljYXNlIERCR0xPR19EQkdJRF9TTV9GUkFNRVdPUktfUFJPWFlfREJHTE9HX01TRzoKKwkJZGJnbG9nX3NtX3ByaW50KHRpbWVzdGFtcCwgdmFwX2lkLCBudW1hcmdzLCBhcmdzLCAiUDJQIEdPIFBTIiwKKwkJCQlzdGF0ZXMsIENERl9BUlJBWV9TSVpFKHN0YXRlcyksIGV2ZW50cywKKwkJCQlDREZfQVJSQVlfU0laRShldmVudHMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitBX0JPT0wKK2RiZ2xvZ19wY2llbHBfcHJpbnRfaGFuZGxlcihBX1VJTlQzMiBtb2RfaWQsCisJCQkgICAgQV9VSU5UMTYgdmFwX2lkLAorCQkJICAgIEFfVUlOVDMyIGRiZ19pZCwKKwkJCSAgICBBX1VJTlQzMiB0aW1lc3RhbXAsCisJCQkgICAgQV9VSU5UMTYgbnVtYXJncywgQV9VSU5UMzIgKmFyZ3MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRlc1tdID0geworCQkiU1RPUCIsCisJCSJUWCIsCisJCSJSWCIsCisJCSJTTEVFUCIsCisJCSJTVVNQRU5EIiwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmV2ZW50c1tdID0geworCQkiVkRFVl9VUCIsCisJCSJBTExfVkRFVl9ET1dOIiwKKwkJIkFXQUtFIiwKKwkJIlNMRUVQIiwKKwkJIlRYX0FDVElWSVRZIiwKKwkJIlRYX0lOQUNUSVZJVFkiLAorCQkiVFhfQUNfQ0hBTkdFIiwKKwkJIlNVU1BFTkQiLAorCQkiUkVTVU1FIiwKKwl9OworCisJc3dpdGNoIChkYmdfaWQpIHsKKwljYXNlIERCR0xPR19EQkdJRF9TTV9GUkFNRVdPUktfUFJPWFlfREJHTE9HX01TRzoKKwkJZGJnbG9nX3NtX3ByaW50KHRpbWVzdGFtcCwgdmFwX2lkLCBudW1hcmdzLCBhcmdzLCAiUENJRUxQIiwKKwkJCQlzdGF0ZXMsIENERl9BUlJBWV9TSVpFKHN0YXRlcyksIGV2ZW50cywKKwkJCQlDREZfQVJSQVlfU0laRShldmVudHMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisjaWZkZWYgV0xBTl9PUEVOX1NPVVJDRQorc3RhdGljIGludCBkYmdsb2dfYmxvY2tfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZndkZWJ1ZyAqZndsb2cgPSBpbm9kZS0+aV9wcml2YXRlOworCisJaWYgKGZ3bG9nLT5md2xvZ19vcGVuKQorCQlyZXR1cm4gLUVCVVNZOworCisJZndsb2ctPmZ3bG9nX29wZW4gPSB0cnVlOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYmdsb2dfYmxvY2tfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZndkZWJ1ZyAqZndsb2cgPSBpbm9kZS0+aV9wcml2YXRlOworCisJZndsb2ctPmZ3bG9nX29wZW4gPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBkYmdsb2dfYmxvY2tfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZndkZWJ1ZyAqZndsb2cgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzc2l6ZV90IHJldF9jbnQ7CisJc2l6ZV90IGxlbiA9IDAsIG5vdF9jb3BpZWQ7CisJY2hhciAqYnVmOworCWludCByZXQ7CisKKwlidWYgPSB2bWFsbG9jKGNvdW50KTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfYmgoJmZ3bG9nLT5md2xvZ19xdWV1ZS5sb2NrKTsKKworCWlmIChza2JfcXVldWVfbGVuKCZmd2xvZy0+Zndsb2dfcXVldWUpID09IDApIHsKKwkJLyogd2UgbXVzdCBpbml0IHVuZGVyIHF1ZXVlIGxvY2sgKi8KKwkJaW5pdF9jb21wbGV0aW9uKCZmd2xvZy0+Zndsb2dfY29tcGxldGlvbik7CisKKwkJc3Bpbl91bmxvY2tfYmgoJmZ3bG9nLT5md2xvZ19xdWV1ZS5sb2NrKTsKKworCQlyZXQgPQorCQkJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZmd2xvZy0+Zndsb2dfY29tcGxldGlvbik7CisJCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKSB7CisJCQl2ZnJlZShidWYpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXNwaW5fbG9ja19iaCgmZndsb2ctPmZ3bG9nX3F1ZXVlLmxvY2spOworCX0KKworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmZndsb2ctPmZ3bG9nX3F1ZXVlKSkpIHsKKwkJaWYgKHNrYi0+bGVuID4gY291bnQgLSBsZW4pIHsKKwkJCS8qIG5vdCBlbm91Z2ggc3BhY2UsIHB1dCBza2IgYmFjayBhbmQgbGVhdmUgKi8KKwkJCV9fc2tiX3F1ZXVlX2hlYWQoJmZ3bG9nLT5md2xvZ19xdWV1ZSwgc2tiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbWVtY3B5KGJ1ZiArIGxlbiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWxlbiArPSBza2ItPmxlbjsKKworCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmZndsb2ctPmZ3bG9nX3F1ZXVlLmxvY2spOworCisJLyogRklYTUU6IHdoYXQgdG8gZG8gaWYgbGVuID09IDA/ICovCisJbm90X2NvcGllZCA9IGNvcHlfdG9fdXNlcih1c2VyX2J1ZiwgYnVmLCBsZW4pOworCWlmIChub3RfY29waWVkICE9IDApIHsKKwkJcmV0X2NudCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCSpwcG9zID0gKnBwb3MgKyBsZW47CisKKwlyZXRfY250ID0gbGVuOworCitvdXQ6CisJdmZyZWUoYnVmKTsKKworCXJldHVybiByZXRfY250OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX2RiZ2xvZ19ibG9jayA9IHsKKwkub3BlbiA9IGRiZ2xvZ19ibG9ja19vcGVuLAorCS5yZWxlYXNlID0gZGJnbG9nX2Jsb2NrX3JlbGVhc2UsCisJLnJlYWQgPSBkYmdsb2dfYmxvY2tfcmVhZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitpbnQgZGJnbG9nX2RlYnVnZnNfaW5pdCh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUpCit7CisKKwl3bWlfaGFuZGxlLT5kZWJ1Z2ZzX3BoeSA9IGRlYnVnZnNfY3JlYXRlX2RpcihDTERfREVCVUdGU19ESVIsIE5VTEwpOworCWlmICghd21pX2hhbmRsZS0+ZGVidWdmc19waHkpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVidWdmc19jcmVhdGVfZmlsZShERUJVR0ZTX0JMT0NLX05BTUUsIFNfSVJVU1IsCisJCQkgICAgd21pX2hhbmRsZS0+ZGVidWdmc19waHksICZ3bWlfaGFuZGxlLT5kYmdsb2csCisJCQkgICAgJmZvcHNfZGJnbG9nX2Jsb2NrKTsKKworCXJldHVybiB0cnVlOworfQorCitpbnQgZGJnbG9nX2RlYnVnZnNfcmVtb3ZlKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUod21pX2hhbmRsZS0+ZGVidWdmc19waHkpOworCXJldHVybiB0cnVlOworfQorI2VuZGlmIC8qIFdMQU5fT1BFTl9TT1VSQ0UgKi8KKworc3RhdGljIHZvaWQKK2Nuc3NfZGlhZ19ldmVudF9yZXBvcnQoQV9VSU5UMTYgZXZlbnRfSWQsIEFfVUlOVDE2IGxlbmd0aCwgdm9pZCAqcFBheWxvYWQpCit7CisJQV9VSU5UOCAqcEJ1ZiwgKnBCdWYxOworCWV2ZW50X3JlcG9ydF90ICpwRXZlbnRfcmVwb3J0OworCUFfVUlOVDE2IHRvdGFsX2xlbjsKKwl0b3RhbF9sZW4gPSBzaXplb2YoZXZlbnRfcmVwb3J0X3QpICsgbGVuZ3RoOworCXBCdWYgPSBjZGZfbWVtX21hbGxvYyh0b3RhbF9sZW4pOworCWlmICghcEJ1ZikgeworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkoIiVzOiBjZGZfbWVtX21hbGxvYyBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCXBCdWYxID0gcEJ1ZjsKKwlwRXZlbnRfcmVwb3J0ID0gKGV2ZW50X3JlcG9ydF90ICopIHBCdWY7CisJcEV2ZW50X3JlcG9ydC0+ZGlhZ190eXBlID0gRElBR19UWVBFX0VWRU5UUzsKKwlwRXZlbnRfcmVwb3J0LT5ldmVudF9pZCA9IGV2ZW50X0lkOworCXBFdmVudF9yZXBvcnQtPmxlbmd0aCA9IGxlbmd0aDsKKwlwQnVmICs9IHNpemVvZihldmVudF9yZXBvcnRfdCk7CisJbWVtY3B5KHBCdWYsIHBQYXlsb2FkLCBsZW5ndGgpOworCXNlbmRfZGlhZ19uZXRsaW5rX2RhdGEoKEFfVUlOVDggKikgcEJ1ZjEsIHRvdGFsX2xlbiwKKwkJCSAgICAgICBESUFHX1RZUEVfSE9TVF9NU0cpOworCWNkZl9tZW1fZnJlZSgodm9pZCAqKXBCdWYxKTsKKwlyZXR1cm47CisKK30KKworc3RhdGljIHZvaWQgY25zc19kaWFnX3NlbmRfZHJpdmVyX2xvYWRlZCh2b2lkKQoreworCWlmIChhcHBzdGFydGVkKSB7CisJCWhvc3RfZXZlbnRfd2xhbl9icmluZ3VwX3N0YXR1c19wYXlsb2FkX3R5cGUgd2xhbl9icmluZ3VwX3N0YXR1czsKKwkJLyogU2VuZCBEcml2ZXIgdXAgY29tbWFuZCAqLworCQlzdHJsY3B5KCZ3bGFuX2JyaW5ndXBfc3RhdHVzLmRyaXZlclZlcnNpb25bMF0sIFFXTEFOX1ZFUlNJT05TVFIsCisJCQlzaXplb2Yod2xhbl9icmluZ3VwX3N0YXR1cy5kcml2ZXJWZXJzaW9uKSk7CisJCXdsYW5fYnJpbmd1cF9zdGF0dXMud2xhblN0YXR1cyA9IERJQUdfV0xBTl9EUklWRVJfTE9BREVEOworCQljbnNzX2RpYWdfZXZlbnRfcmVwb3J0KEVWRU5UX1dMQU5fQlJJTkdVUF9TVEFUVVMsCisJCQkJICAgICAgIHNpemVvZih3bGFuX2JyaW5ndXBfc3RhdHVzKSwKKwkJCQkgICAgICAgJndsYW5fYnJpbmd1cF9zdGF0dXMpOworCQlzZW5kZHJpdmVyc3RhdHVzID0gZmFsc2U7CisJfSBlbHNlCisJCXNlbmRkcml2ZXJzdGF0dXMgPSB0cnVlOworfQorCitzdGF0aWMgdm9pZCBjbnNzX2RpYWdfc2VuZF9kcml2ZXJfdW5sb2FkZWQodm9pZCkKK3sKKwlob3N0X2V2ZW50X3dsYW5fYnJpbmd1cF9zdGF0dXNfcGF5bG9hZF90eXBlIHdsYW5fYnJpbmd1cF9zdGF0dXM7CisJLyogU2VuZCBEcml2ZXIgZG93biBjb21tYW5kICovCisJbWVtc2V0KCZ3bGFuX2JyaW5ndXBfc3RhdHVzLCAwLAorCSAgICAgICBzaXplb2YoaG9zdF9ldmVudF93bGFuX2JyaW5ndXBfc3RhdHVzX3BheWxvYWRfdHlwZSkpOworCXdsYW5fYnJpbmd1cF9zdGF0dXMud2xhblN0YXR1cyA9IERJQUdfV0xBTl9EUklWRVJfVU5MT0FERUQ7CisJY25zc19kaWFnX2V2ZW50X3JlcG9ydChFVkVOVF9XTEFOX0JSSU5HVVBfU1RBVFVTLAorCQkJICAgICAgIHNpemVvZih3bGFuX2JyaW5ndXBfc3RhdHVzKSwKKwkJCSAgICAgICAmd2xhbl9icmluZ3VwX3N0YXR1cyk7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIGNuc3NfZGlhZ19tc2dfY2FsbGJhY2soKSAtIENhbGwgYmFjayBpbnZva2VkIGJ5IG5ldGxpbmsgc2VydmljZQorCisgICBUaGlzIGZ1bmN0aW9uIGdldHMgaW52b2tlZCBieSBuZXRsaW5rIHNlcnZpY2Ugd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZXZpZWQKKyAgIGZyb20gdGhlIGNuc3MtZGlhZyBhcHBsaWNhdGlvbiBpbiB1c2VyLXNwYWNlLgorCisgICBccGFyYW0gLQorICAgICAgLSBza2IgLSBza2Igd2l0aCBuZXRsaW5rIG1lc3NhZ2UKKworICAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgY25zc19kaWFnX21zZ19jYWxsYmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCBkYmdsb2dfc2xvdCAqc2xvdDsKKwlBX1VJTlQ4ICptc2c7CisKKwlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCWlmICghbmxoKSB7CisJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCSgiJXM6IE5ldGxpbmsgaGVhZGVyIG51bGwgXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gLTE7CisJfQorCisJbXNnID0gTkxNU0dfREFUQShubGgpOworCisJLyogVGhpcyBjaGVjayBhZGRlZCBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSAqLworCWlmICghbWVtY21wKG1zZywgIkhlbGxvIiwgNSkpIHsKKwkJYXBwc3RhcnRlZCA9IHRydWU7CisJCWNuc3NfZGlhZ19waWQgPSBubGgtPm5sbXNnX3BpZDsKKwkJQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19JTkZPLAorCQkJCSgiJXM6IHJlZ2lzdGVyZWQgcGlkICVkIFxuIiwgX19mdW5jX18sCisJCQkJIGNuc3NfZGlhZ19waWQpKTsKKwkJaWYgKHNlbmRkcml2ZXJzdGF0dXMpCisJCQljbnNzX2RpYWdfc2VuZF9kcml2ZXJfbG9hZGVkKCk7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlzbG90ID0gKHN0cnVjdCBkYmdsb2dfc2xvdCAqKW1zZzsKKwlzd2l0Y2ggKHNsb3QtPmRpYWdfdHlwZSkgeworCWNhc2UgRElBR19UWVBFX0NSQVNIX0lOSkVDVDoKKwkJaWYgKHNsb3QtPmxlbmd0aCA9PSAyKSB7CisJCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0lORk8sCisJCQkJKCIlcyA6IERJQUdfVFlQRV9DUkFTSF9JTkpFQ1Q6ICVkICVkXG4iLAorCQkJCV9fZnVuY19fLCBzbG90LT5wYXlsb2FkWzBdLCBzbG90LT5wYXlsb2FkWzFdKSk7CisJCQl3bWFfY2xpX3NldDJfY29tbWFuZCgwLCBHRU5fUEFSQU1fQ1JBU0hfSU5KRUNULAorCQkJCQlzbG90LT5wYXlsb2FkWzBdLCBzbG90LT5wYXlsb2FkWzFdLAorCQkJCQlHRU5fQ01EKTsKKwkJfSBlbHNlIHsKKwkJCUFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfRVJSLAorCQkJCSgiY3Jhc2hfaW5qZWN0IGNtZCBlcnJvclxuIikpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKKworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiBjbnNzX2RpYWdfbm90aWZ5X3dsYW5fY2xvc2UoKSAtIG5vdGlmeSBBUFAgZHJpdmVyIGNsb3NlZAorCisgICBUaGlzIGZ1bmN0aW9uIG5vdGlmaWVzIHRoZSB1c2VyIGNuc3MtZGlhZyBhcHAgdGhhdCB3bGFuIGRyaXZlciBpcyBjbG9zZWQuCisKKyAgIFxwYXJhbSAtCisgICAgICAtIE5vbmUKKworICAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgY25zc19kaWFnX25vdGlmeV93bGFuX2Nsb3NlKCkKK3sKKwkvKiBTZW5kIG5sIG1zZyBhYm91dCB0aGUgd2xhbiBjbG9zZSAqLworCWlmIChJTlZBTElEX1BJRCAhPSBjbnNzX2RpYWdfcGlkKSB7CisJCWNuc3NfZGlhZ19zZW5kX2RyaXZlcl91bmxvYWRlZCgpOworCQljbnNzX2RpYWdfcGlkID0gSU5WQUxJRF9QSUQ7CisJfQorCXJldHVybiAwOworCit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGJyaWVmIGNuc3NfZGlhZ19hY3RpdmF0ZV9zZXJ2aWNlKCkgLSBBY3RpdmF0ZSBjbnNzX2RpYWcgbWVzc2FnZSBoYW5kbGVyCisKKyAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGEgaGFuZGxlciB0byByZWNlaXZlIG5ldGxpbmsgbWVzc2FnZSBmcm9tCisgICBhbiBjbnNzLWRpYWcgYXBwbGljYXRpb24gcHJvY2Vzcy4KKworICAgXHBhcmFtIC0KKyAgICAgIC0gTm9uZQorCisgICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBjbnNzX2RpYWdfYWN0aXZhdGVfc2VydmljZSgpCit7CisJaW50IHJldCA9IDA7CisKKwkvKiBSZWdpc3RlciB0aGUgbXNnIGhhbmRsZXIgZm9yIG1zZ3MgYWRkcmVzc2VkIHRvIFdMQU5fTkxfTVNHX09FTSAqLworCXJldCA9IG5sX3Nydl9yZWdpc3RlcihXTEFOX05MX01TR19DTlNTX0RJQUcsIGNuc3NfZGlhZ19tc2dfY2FsbGJhY2spOworCWlmIChyZXQgPT0gLUVJTlZBTCkgeworCQlBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX0VSUiwKKwkJCQkoIkNOU1MtRElBRyBSZWdpc3RlcmF0aW9uIGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJa2RfbmxfaW5pdCA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK0FfQk9PTAorZGJnbG9nX3dvd19wcmludF9oYW5kbGVyKEFfVUlOVDMyIG1vZF9pZCwKKwkJCSBBX1VJTlQxNiB2YXBfaWQsCisJCQkgQV9VSU5UMzIgZGJnX2lkLAorCQkJIEFfVUlOVDMyIHRpbWVzdGFtcCwgQV9VSU5UMTYgbnVtYXJncywgQV9VSU5UMzIgKmFyZ3MpCit7CisKKwlzd2l0Y2ggKGRiZ19pZCkgeworCWNhc2UgV09XX05TX09GTERfRU5BQkxFOgorCQlpZiAoNCA9PSBudW1hcmdzKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJFbmFibGUgTlMgb2ZmbG9hZCwgZm9yIHNlbmRlciAlMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeFwKKyAgICAgICAgICAgICAgICA6JTAyeCUwMng6JTAyeCUwMng6JTAyeCUwMngiLCAqKEFfVUlOVDggKikgJmFyZ3NbMF0sICooKEFfVUlOVDggKikgJmFyZ3NbMF0gKyAxKSwKKwkJCQkgICAgICAqKChBX1VJTlQ4ICopICZhcmdzWzBdICsgMiksICooKEFfVUlOVDggKikgJmFyZ3NbMF0gKyAzKSwgKihBX1VJTlQ4ICopICZhcmdzWzFdLCAqKChBX1VJTlQ4ICopICZhcmdzWzFdICsgMSksICooKEFfVUlOVDggKikgJmFyZ3NbMV0gKyAyKSwgKigoQV9VSU5UOCAqKSAmYXJnc1sxXSArIDMpLAorCQkJCSAgICAgICooQV9VSU5UOCAqKSAmYXJnc1syXSwgKigoQV9VSU5UOCAqKSAmYXJnc1syXSArIDEpLCAqKChBX1VJTlQ4ICopICZhcmdzWzJdICsgMiksICooKEFfVUlOVDggKikgJmFyZ3NbMl0gKyAzKSwgKihBX1VJTlQ4ICopICZhcmdzWzNdLCAqKChBX1VJTlQ4ICopICZhcmdzWzNdICsgMSksCisJCQkJICAgICAgKigoQV9VSU5UOCAqKSAmYXJnc1szXSArIDIpLCAqKChBX1VJTlQ4ICopICZhcmdzWzNdICsgMykpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgV09XX0FSUF9PRkxEX0VOQUJMRToKKwkJaWYgKDEgPT0gbnVtYXJncykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiRW5hYmxlIEFSUCBvZmZsb2FkLCBmb3Igc2VuZGVyICVkLiVkLiVkLiVkIiwKKwkJCQkgICAgICAqKEFfVUlOVDggKikgYXJncywKKwkJCQkgICAgICAqKChBX1VJTlQ4ICopIGFyZ3MgKyAxKSwKKwkJCQkgICAgICAqKChBX1VJTlQ4ICopIGFyZ3MgKyAyKSwKKwkJCQkgICAgICAqKChBX1VJTlQ4ICopIGFyZ3MgKyAzKSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXT1dfTlNfQVJQX09GTERfRElTQUJMRToKKwkJaWYgKDAgPT0gbnVtYXJncykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiZGlzYWJsZSBOUy9BUlAgb2ZmbG9hZCIpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgV09XX05TX1JFQ0VJVkVEOgorCQlpZiAoNCA9PSBudW1hcmdzKSB7CisJCQlkYmdsb2dfcHJpbnRmKHRpbWVzdGFtcCwgdmFwX2lkLAorCQkJCSAgICAgICJOUyByZXF1ZXN0ZWQgZnJvbSAlMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeFwKKyAgICAgICAgICAgICAgICA6JTAyeCUwMng6JTAyeCUwMng6JTAyeCUwMngiLCAqKEFfVUlOVDggKikgJmFyZ3NbMF0sICooKEFfVUlOVDggKikgJmFyZ3NbMF0gKyAxKSwKKwkJCQkgICAgICAqKChBX1VJTlQ4ICopICZhcmdzWzBdICsgMiksICooKEFfVUlOVDggKikgJmFyZ3NbMF0gKyAzKSwgKihBX1VJTlQ4ICopICZhcmdzWzFdLCAqKChBX1VJTlQ4ICopICZhcmdzWzFdICsgMSksICooKEFfVUlOVDggKikgJmFyZ3NbMV0gKyAyKSwKKwkJCQkgICAgICAqKChBX1VJTlQ4ICopICZhcmdzWzFdICsgMyksICooQV9VSU5UOCAqKSAmYXJnc1syXSwgKigoQV9VSU5UOCAqKSAmYXJnc1syXSArIDEpLCAqKChBX1VJTlQ4ICopICZhcmdzWzJdICsgMiksICooKEFfVUlOVDggKikgJmFyZ3NbMl0gKyAzKSwKKwkJCQkgICAgICAqKEFfVUlOVDggKikgJmFyZ3NbM10sICooKEFfVUlOVDggKikgJmFyZ3NbM10gKyAxKSwgKigoQV9VSU5UOCAqKSAmYXJnc1szXSArIDIpLCAqKChBX1VJTlQ4ICopICZhcmdzWzNdICsgMykpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgV09XX05TX1JFUExJRUQ6CisJCWlmICg0ID09IG51bWFyZ3MpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIk5TIHJlcGxpZWQgdG8gJTAyeCUwMng6JTAyeCUwMng6JTAyeCUwMng6JTAyeCUwMng6JTAyeCUwMnhcCisgICAgICAgICAgICAgICAgOiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4IiwgKihBX1VJTlQ4ICopICZhcmdzWzBdLCAqKChBX1VJTlQ4ICopICZhcmdzWzBdICsgMSksCisJCQkJICAgICAgKigoQV9VSU5UOCAqKSAmYXJnc1swXSArIDIpLCAqKChBX1VJTlQ4ICopICZhcmdzWzBdICsgMyksICooQV9VSU5UOCAqKSAmYXJnc1sxXSwgKigoQV9VSU5UOCAqKSAmYXJnc1sxXSArIDEpLCAqKChBX1VJTlQ4ICopICZhcmdzWzFdICsgMiksCisJCQkJICAgICAgKigoQV9VSU5UOCAqKSAmYXJnc1sxXSArIDMpLCAqKEFfVUlOVDggKikgJmFyZ3NbMl0sICooKEFfVUlOVDggKikgJmFyZ3NbMl0gKyAxKSwgKigoQV9VSU5UOCAqKSAmYXJnc1syXSArIDIpLCAqKChBX1VJTlQ4ICopICZhcmdzWzJdICsgMyksCisJCQkJICAgICAgKihBX1VJTlQ4ICopICZhcmdzWzNdLCAqKChBX1VJTlQ4ICopICZhcmdzWzNdICsgMSksICooKEFfVUlOVDggKikgJmFyZ3NbM10gKyAyKSwgKigoQV9VSU5UOCAqKSAmYXJnc1szXSArIDMpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdPV19BUlBfUkVDRUlWRUQ6CisJCWlmICgxID09IG51bWFyZ3MpIHsKKwkJCWRiZ2xvZ19wcmludGYodGltZXN0YW1wLCB2YXBfaWQsCisJCQkJICAgICAgIkFSUCByZXF1ZXN0ZWQgZnJvbSAlZC4lZC4lZC4lZCIsCisJCQkJICAgICAgKihBX1VJTlQ4ICopIGFyZ3MsCisJCQkJICAgICAgKigoQV9VSU5UOCAqKSBhcmdzICsgMSksCisJCQkJICAgICAgKigoQV9VSU5UOCAqKSBhcmdzICsgMiksCisJCQkJICAgICAgKigoQV9VSU5UOCAqKSBhcmdzICsgMykpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCQlicmVhazsKKwljYXNlIFdPV19BUlBfUkVQTElFRDoKKwkJaWYgKDEgPT0gbnVtYXJncykgeworCQkJZGJnbG9nX3ByaW50Zih0aW1lc3RhbXAsIHZhcF9pZCwKKwkJCQkgICAgICAiQVJQIHJlcGxpZWQgdG8gJWQuJWQuJWQuJWQiLAorCQkJCSAgICAgICooQV9VSU5UOCAqKSBhcmdzLAorCQkJCSAgICAgICooKEFfVUlOVDggKikgYXJncyArIDEpLAorCQkJCSAgICAgICooKEFfVUlOVDggKikgYXJncyArIDIpLAorCQkJCSAgICAgICooKEFfVUlOVDggKikgYXJncyArIDMpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBkYmdsb2dfcGFyc2VyX3R5cGVfaW5pdCh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIGludCB0eXBlKQoreworCWlmICh0eXBlID49IERCR0xPR19QUk9DRVNTX01BWCkgeworCQlyZXR1cm4gQV9FUlJPUjsKKwl9CisKKwlkYmdsb2dfcHJvY2Vzc190eXBlID0gdHlwZTsKKwlncHJpbnRfbGltaXRlciA9IGZhbHNlOworCisJcmV0dXJuIEFfT0s7Cit9CisKK2ludCBkYmdsb2dfaW5pdCh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUpCit7CisJaW50IHJlcyA9IDA7CisJT1NfTUVNU0VUKG1vZF9wcmludCwgMCwgc2l6ZW9mKG1vZF9wcmludCkpOworCisJZGJnbG9nX3JlZ19tb2RwcmludChXTEFOX01PRFVMRV9TVEFfUFdSU0FWRSwKKwkJCSAgICBkYmdsb2dfc3RhX3Bvd2Vyc2F2ZV9wcmludF9oYW5kbGVyKTsKKwlkYmdsb2dfcmVnX21vZHByaW50KFdMQU5fTU9EVUxFX0FQX1BXUlNBVkUsCisJCQkgICAgZGJnbG9nX2FwX3Bvd2Vyc2F2ZV9wcmludF9oYW5kbGVyKTsKKwlkYmdsb2dfcmVnX21vZHByaW50KFdMQU5fTU9EVUxFX1dBTCwgZGJnbG9nX3dhbF9wcmludF9oYW5kbGVyKTsKKwlkYmdsb2dfcmVnX21vZHByaW50KFdMQU5fTU9EVUxFX1NDQU4sIGRiZ2xvZ19zY2FuX3ByaW50X2hhbmRsZXIpOworCWRiZ2xvZ19yZWdfbW9kcHJpbnQoV0xBTl9NT0RVTEVfUkFURUNUUkwsCisJCQkgICAgZGJnbG9nX3JhdGVjdHJsX3ByaW50X2hhbmRsZXIpOworCWRiZ2xvZ19yZWdfbW9kcHJpbnQoV0xBTl9NT0RVTEVfQU5JLCBkYmdsb2dfYW5pX3ByaW50X2hhbmRsZXIpOworCWRiZ2xvZ19yZWdfbW9kcHJpbnQoV0xBTl9NT0RVTEVfQ09FWCwgZGJnbG9nX2NvZXhfcHJpbnRfaGFuZGxlcik7CisJZGJnbG9nX3JlZ19tb2RwcmludChXTEFOX01PRFVMRV9CRUFDT04sIGRiZ2xvZ19iZWFjb25fcHJpbnRfaGFuZGxlcik7CisJZGJnbG9nX3JlZ19tb2RwcmludChXTEFOX01PRFVMRV9XT1csIGRiZ2xvZ193b3dfcHJpbnRfaGFuZGxlcik7CisJZGJnbG9nX3JlZ19tb2RwcmludChXTEFOX01PRFVMRV9EQVRBX1RYUlgsCisJCQkgICAgZGJnbG9nX2RhdGFfdHhyeF9wcmludF9oYW5kbGVyKTsKKwlkYmdsb2dfcmVnX21vZHByaW50KFdMQU5fTU9EVUxFX1NUQV9TTVBTLCBkYmdsb2dfc21wc19wcmludF9oYW5kbGVyKTsKKwlkYmdsb2dfcmVnX21vZHByaW50KFdMQU5fTU9EVUxFX1AyUCwgZGJnbG9nX3AycF9wcmludF9oYW5kbGVyKTsKKwlkYmdsb2dfcmVnX21vZHByaW50KFdMQU5fTU9EVUxFX1BDSUVMUCwgZGJnbG9nX3BjaWVscF9wcmludF9oYW5kbGVyKTsKKwlkYmdsb2dfcmVnX21vZHByaW50KFdMQU5fTU9EVUxFX0lCU1NfUFdSU0FWRSwKKwkJCSAgICBkYmdsb2dfaWJzc19wb3dlcnNhdmVfcHJpbnRfaGFuZGxlcik7CisKKwkvKiBSZWdpc3RlciBoYW5kbGVyIGZvciBGMyBvciBkZWJ1ZyBtZXNzYWdlcyAqLworCXJlcyA9CisJCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21pX2hhbmRsZSwKKwkJCQkJCSAgIFdNSV9ERUJVR19NRVNHX0VWRU5USUQsCisJCQkJCQkgICBkYmdsb2dfcGFyc2VfZGVidWdfbG9ncyk7CisJaWYgKHJlcyAhPSAwKQorCQlyZXR1cm4gcmVzOworCisJLyogUmVnaXN0ZXIgaGFuZGxlciBmb3IgRlcgZGlhZyBldmVudHMgKi8KKwlyZXMgPSB3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtaV9oYW5kbGUsCisJCQkJCQkgV01JX0RJQUdfREFUQV9DT05UQUlORVJfRVZFTlRJRCwKKwkJCQkJCSBmd19kaWFnX2RhdGFfZXZlbnRfaGFuZGxlcik7CisJaWYgKHJlcyAhPSAwKQorCQlyZXR1cm4gcmVzOworCisJLyogUmVnaXN0ZXIgaGFuZGxlciBmb3IgbmV3IEZXIGRpYWcgIEV2ZW50LCBMT0csIE1TRyBjb21iaW5lZCAqLworCXJlcyA9IHdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21pX2hhbmRsZSwgV01JX0RJQUdfRVZFTlRJRCwKKwkJCQkJCSBkaWFnX2Z3X2hhbmRsZXIpOworCWlmIChyZXMgIT0gMCkKKwkJcmV0dXJuIHJlczsKKworCWNuc3NfZGlhZ19zZW5kX2RyaXZlcl9sb2FkZWQoKTsKKyNpZmRlZiBXTEFOX09QRU5fU09VUkNFCisJLyogSW5pdGlhbGl6ZSB0aGUgZncgZGVidWcgbG9nIHF1ZXVlICovCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmd21pX2hhbmRsZS0+ZGJnbG9nLmZ3bG9nX3F1ZXVlKTsKKwlpbml0X2NvbXBsZXRpb24oJndtaV9oYW5kbGUtPmRiZ2xvZy5md2xvZ19jb21wbGV0aW9uKTsKKworCS8qIEluaXRpYWxpemUgZGVidWdmcyAqLworCWRiZ2xvZ19kZWJ1Z2ZzX2luaXQod21pX2hhbmRsZSk7CisjZW5kaWYgLyogV0xBTl9PUEVOX1NPVVJDRSAqLworCisJcmV0dXJuIHJlczsKK30KKworaW50IGRiZ2xvZ19kZWluaXQod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlKQoreworCWludCByZXMgPSAwOworCisjaWZkZWYgV0xBTl9PUEVOX1NPVVJDRQorCS8qIERlSW5pdGlhbGl6ZSB0aGUgZncgZGVidWcgbG9nIHF1ZXVlICovCisJc2tiX3F1ZXVlX3B1cmdlKCZ3bWlfaGFuZGxlLT5kYmdsb2cuZndsb2dfcXVldWUpOworCWNvbXBsZXRlKCZ3bWlfaGFuZGxlLT5kYmdsb2cuZndsb2dfY29tcGxldGlvbik7CisKKwkvKiBEZWluaXRpYWxpemUgdGhlIGRlYnVnZnMgKi8KKwlkYmdsb2dfZGVidWdmc19yZW1vdmUod21pX2hhbmRsZSk7CisjZW5kaWYgLyogV0xBTl9PUEVOX1NPVVJDRSAqLworCisJcmVzID0KKwkJd21pX3VuaWZpZWRfdW5yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtaV9oYW5kbGUsCisJCQkJCQkgICAgIFdNSV9ERUJVR19NRVNHX0VWRU5USUQpOworCWlmIChyZXMgIT0gMCkKKwkJcmV0dXJuIHJlczsKKworCWtkX25sX2luaXQgPSBmYWxzZTsKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9md2xvZy9kYmdsb2dfaG9zdC5oIGIvY29yZS91dGlscy9md2xvZy9kYmdsb2dfaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOWUwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL2Z3bG9nL2RiZ2xvZ19ob3N0LmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0RCR0xPR19IT1NUX0hfCisjZGVmaW5lIF9EQkdMT0dfSE9TVF9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJkYmdsb2dfY29tbW9uLmgiCisjaW5jbHVkZSAib2xfZGVmaW5lcy5oIgorCisvKgorICogc2V0IHRoZSBkYmdsb2cgcGFyc2VyIHR5cGUKKyAqL2ludAorZGJnbG9nX3BhcnNlcl90eXBlX2luaXQod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCBpbnQgdHlwZSk7CisKKy8qKiBkYmdsb2dfaW50IC0gUmVnaXN0ZXJzIGEgV01JIGV2ZW50IGhhbmRsZSBmb3IgV01JX0RCR01TR19FVkVOVAorICogQGJyaWVmIHdtaV9oYW5kbGUgLSBoYW5kbGUgdG8gd21pIG1vZHVsZQorICovCitpbnQKK2RiZ2xvZ19pbml0KHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSk7CisKKy8qKiBkYmdsb2dfZGVpbml0IC0gVW5SZWdpc3RlcnMgYSBXTUkgZXZlbnQgaGFuZGxlIGZvciBXTUlfREJHTVNHX0VWRU5UCisgKiBAYnJpZWYgd21pX2hhbmRsZSAtIGhhbmRsZSB0byB3bWkgbW9kdWxlCisgKi8KK2ludAorZGJnbG9nX2RlaW5pdCh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUpOworCisvKiogc2V0IHRoZSBzaXplIG9mIHRoZSByZXBvcnQgc2l6ZQorICogQGJyaWVmIHdtaV9oYW5kbGUgLSBoYW5kbGUgdG8gV21pIG1vZHVsZQorICogQGJyaWVmIHNpemUgLSBSZXBvcnQgc2l6ZQorICovCitpbnQKK2RiZ2xvZ19zZXRfcmVwb3J0X3NpemUod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCBBX1VJTlQxNiBzaXplKTsKKworLyoqIFNldCB0aGUgcmVzb2x1dGlvbiBmb3IgdGltZSBzdGFtcAorICogQGJyaWVmIHdtaV9oYW5kbGUgLSBoYW5kbGUgdG8gV21pIG1vZHVsZQorICogQCBicmllZiB0c3IgLSB0aW1lIHN0YW1wIHJlc29sdXRpb24KKyAqLworaW50CitkYmdsb2dfc2V0X3RpbWVzdGFtcF9yZXNvbHV0aW9uKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCQlBX1VJTlQxNiB0c3IpOworCisvKiogRW5hYmxlIHJlcG9ydGluZy4gSWYgaXQgaXMgc2V0IHRvIGZhbHNlIHRoZW4gVHJhZ2V0IHdvbnQgZGVsaXZlcgorICogYW55IGRlYnVnIGluZm9ybWF0aW9uCisgKi8KK2ludAorZGJnbG9nX3JlcG9ydF9lbmFibGUod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCBBX0JPT0wgaXNlbmFibGUpOworCisvKiogU2V0IHRoZSBsb2cgbGV2ZWwKKyAqIEBicmllZiBEQkdMT0dfSU5GTyAtIEluZm9ybWF0aW9uIGxvd2VzdCBsb2cgbGV2ZWwKKyAqIEBicmllZiBEQkdMT0dfV0FSTklORworICogQGJyaWVmIERCR0xPR19FUlJPUiAtIGRlZmF1bHQgbG9nIGxldmVsCisgKi8KK2ludAorZGJnbG9nX3NldF9sb2dfbHZsKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwgREJHTE9HX0xPR19MVkwgbG9nX2x2bCk7CisKKy8qCisgKiBzZXQgdGhlIGRlYnVnIGxvZyBsZXZlbCBmb3IgYSBnaXZlbiBtb2R1bGUKKyAqICBtb2RfaWRfbHZsIDogdGhlIGZvcm1hdCBpcyBtb3JlIHVzZXIgZnJpZW5kbHkuCisgKiAgICBtb2R1bGVfaWQgPSAgbW9kX2lkX2x2bC8xMDsKKyAqICAgIGxvZ19sZXZlbCA9ICBtb2RfaWRfbHZsJTEwOworICogZXhhbXBsZSA6IG1vZF9pZF9sdmwgaXMgMTUzLiB0aGVuIG1vZHVsZSBpZCBpcyAxNSBhbmQgbG9nIGxldmVsIGlzIDMuIHRoaXMgZm9ybWF0IGFsbG93cworICogICAgICAgICB1c2VyIHRvIHBhc3MgYSBzaW5sZ2UgdmFsdWUgKHdoaWNoIGlzIHRoZSBtb3N0IGNvbnZlbmllbnQgd2F5IGZvciBtb3N0IG9mIHRoZSBPU3MpCisgKiAgICAgICAgIHRvIGJlIHBhc3NlZCBmcm9tIHVzZXIgdG8gdGhlIGRyaXZlci4KKyAqLworaW50CitkYmdsb2dfc2V0X21vZF9sb2dfbHZsKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwgQV9VSU5UMzIgbW9kX2lkX2x2bCk7CisKKy8qKiBFbmFibGUvRGlzYWJsZSB0aGUgbG9nZ2luZyBmb3IgVkFQICovCitpbnQKK2RiZ2xvZ192YXBfbG9nX2VuYWJsZSh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIEFfVUlOVDE2IHZhcF9pZCwKKwkJICAgICAgQV9CT09MIGlzZW5hYmxlKTsKKy8qKiBFbmFibGUvRGlzYWJsZSBsb2dnaW5nIGZvciBNb2R1bGUgKi8KK2ludAorZGJnbG9nX21vZHVsZV9sb2dfZW5hYmxlKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwgQV9VSU5UMzIgbW9kX2lkLAorCQkJIEFfQk9PTCBpc2VuYWJsZSk7CisKKy8qKiBzZXQgdmFwIGVuYWJsaWUgYml0bWFwICovCit2b2lkCitkYmdsb2dfc2V0X3ZhcF9lbmFibGVfYml0bWFwKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCSAgICAgQV9VSU5UMzIgdmFwX2VuYWJsZV9iaXRtYXApOworCisvKiogc2V0IGxvZyBsZXZlbCBmb3IgYWxsIHRoZSBtb2R1bGVzIHNwZWNpZmllZCBpbiB0aGUgYml0bWFwLiBmb3IgYWxsIG90aGVyIG1vZHVsZXMKKyAqIHdpdGggMCBpbiB0aGUgYml0bWFwIChvcikgb3V0c2lkZSB0aGUgYml0bWFwICwgdGhlIGxvZyBsZXZlbCBiZSByZXNldCB0byBEQkdMT0dfRVJSLgorICovCit2b2lkCitkYmdsb2dfc2V0X21vZF9lbmFibGVfYml0bWFwKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCSAgICAgQV9VSU5UMzIgbG9nX2xldmVsLAorCQkJICAgICBBX1VJTlQzMiAqbW9kX2VuYWJsZV9iaXRtYXAsCisJCQkgICAgIEFfVUlOVDMyIGJpdG1hcF9sZW4pOworCisvKiogUmVnaXN0ZXIgdGhlIGNuc3NfZGlhZyBhY3RpdmF0ZSB3aXRoIHRoZSB3bGFuIGRyaXZlciAqLworaW50IGNuc3NfZGlhZ19hY3RpdmF0ZV9zZXJ2aWNlKHZvaWQpOworaW50IGNuc3NfZGlhZ19ub3RpZnlfd2xhbl9jbG9zZSh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9EQkdMT0dfSE9TVF9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9ob3N0X2RpYWdfbG9nL2luYy9ob3N0X2RpYWdfY29yZV9ldmVudC5oIGIvY29yZS91dGlscy9ob3N0X2RpYWdfbG9nL2luYy9ob3N0X2RpYWdfY29yZV9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjJkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL2hvc3RfZGlhZ19sb2cvaW5jL2hvc3RfZGlhZ19jb3JlX2V2ZW50LmgKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZCggX19IT1NUX0RJQUdfQ09SRV9FVkVOVF9IICkKKyNkZWZpbmUgX19IT1NUX0RJQUdfQ09SRV9FVkVOVF9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIGhvc3RfZGlhZ19jb3JlX2V2ZW50LmgKKworICAgXGJyaWVmIFdMQU4gVVRJTCBob3N0IERJQUcgRXZlbnRzCisKKyAgIERlZmluaXRpb25zIGZvciBESUFHIEV2ZW50cworCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBJbmNsdWRlIEZpbGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgImNkc19wYWNrX2FsaWduLmgiCisjaW5jbHVkZSAiaV9ob3N0X2RpYWdfY29yZV9ldmVudC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2RlZmluZSBXQUtFX0xPQ0tfTkFNRV9MRU4gODAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBFdmVudCBJRDogRVZFTlRfV0xBTl9TRUNVUklUWQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGV2ZW50SWQ7CisJdWludDhfdCBhdXRoTW9kZTsKKwl1aW50OF90IGVuY3J5cHRpb25Nb2RlVW5pY2FzdDsKKwl1aW50OF90IGVuY3J5cHRpb25Nb2RlTXVsdGljYXN0OworCXVpbnQ4X3QgcG1rSURNYXRjaDsKKwl1aW50OF90IGJzc2lkWzZdOworCXVpbnQ4X3Qga2V5SWQ7CisJdWludDhfdCBzdGF0dXM7Cit9IGhvc3RfZXZlbnRfd2xhbl9zZWN1cml0eV9wYXlsb2FkX3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRXZlbnQgSUQ6IEVWRU5UX1dMQU5fU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgZXZlbnRJZDsKKwl1aW50OF90IHNzaWRbNl07CisJdWludDhfdCBic3NUeXBlOworCXVpbnQ4X3QgcnNzaTsKKwl1aW50OF90IGNoYW5uZWw7CisJdWludDhfdCBxb3NDYXBhYmlsaXR5OworCXVpbnQ4X3QgYXV0aFR5cGU7CisJdWludDhfdCBlbmNyeXB0aW9uVHlwZTsKKwl1aW50OF90IHJlYXNvbjsKKwl1aW50OF90IHJlYXNvbkRpc2Nvbm5lY3Q7Cit9IGhvc3RfZXZlbnRfd2xhbl9zdGF0dXNfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEV2ZW50IElEOiBFVkVOVF9XTEFOX0hBTkRPRkYKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBldmVudElkOworCXVpbnQ4X3QgY3VycmVudEFwQnNzaWRbNl07CisJdWludDhfdCBjdXJyZW50QXBSc3NpOworCXVpbnQ4X3QgY2FuZGlkYXRlQXBCc3NpZFs2XTsKKwl1aW50OF90IGNhbmRpZGF0ZUFwUnNzaTsKK30gaG9zdF9ldmVudF93bGFuX2hhbmRvZmZfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEV2ZW50IElEOiBFVkVOVF9XTEFOX1ZDQworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGV2ZW50SWQ7CisJdWludDhfdCByc3NpOworCXVpbnQ4X3QgdHhQZXI7CisJdWludDhfdCByeFBlcjsKKwlpbnQgbGlua1F1YWxpdHk7Cit9IGhvc3RfZXZlbnRfd2xhbl92Y2NfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEV2ZW50IElEOiBFVkVOVF9XTEFOX1FPUworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGV2ZW50SWQ7CisJdWludDhfdCByZWFzb25Db2RlOworfSBob3N0X2V2ZW50X3dsYW5fcW9zX3BheWxvYWRfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBFdmVudCBJRDogRVZFTlRfV0xBTl9QRQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGJzc2lkWzZdOworCXVpbnQxNl90IGV2ZW50X3R5cGU7CisJdWludDE2X3Qgc21lX3N0YXRlOworCXVpbnQxNl90IG1sbV9zdGF0ZTsKKwl1aW50MTZfdCBzdGF0dXM7CisJdWludDE2X3QgcmVhc29uX2NvZGU7Cit9IGhvc3RfZXZlbnRfd2xhbl9wZV9wYXlsb2FkX3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRXZlbnQgSUQ6IEVWRU5UX1dMQU5fQUREX0JMT0NLX0FDS19TVUNDRVNTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgdWNCYVBlZXJNYWNbNl07CisJdWludDhfdCB1Y0JhVGlkOworCXVpbnQ4X3QgdWNCYUJ1ZmZlclNpemU7CisJdWludDE2X3QgdXNCYVNTTjsKKwl1aW50OF90IGZJbml0aWF0b3I7Cit9IGhvc3RfZXZlbnRfd2xhbl9hZGRfYmxvY2tfYWNrX3N1Y2Nlc3NfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEV2ZW50IElEOiBFVkVOVF9XTEFOX0FERF9CTE9DS19BQ0tfRkFJTEVECisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgdWNCYVBlZXJNYWNbNl07CisJdWludDhfdCB1Y0JhVGlkOworCXVpbnQ4X3QgdWNSZWFzb25Db2RlOworCXVpbnQ4X3QgZkluaXRpYXRvcjsKK30gaG9zdF9ldmVudF93bGFuX2FkZF9ibG9ja19hY2tfZmFpbGVkX3BheWxvYWRfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBFdmVudCBJRDogRVZFTlRfV0xBTl9ERUxFVEVfQkxPQ0tfQUNLX1NVQ0NFU1MKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciB1Y0JhUGVlck1hY1s2XTsKKwl1aW50OF90IHVjQmFUaWQ7CisJdWludDhfdCB1Y0RlbGV0ZVJlYXNvbkNvZGU7Cit9IGhvc3RfZXZlbnRfd2xhbl9hZGRfYmxvY2tfYWNrX2RlbGV0ZWRfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEV2ZW50IElEOiBFVkVOVF9XTEFOX0RFTEVURV9CTE9DS19BQ0tfRkFJTEVECisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgdWNCYVBlZXJNYWNbNl07CisJdWludDhfdCB1Y0JhVGlkOworCXVpbnQ4X3QgdWNEZWxldGVSZWFzb25Db2RlOworCXVpbnQ4X3QgdWNGYWlsUmVhc29uQ29kZTsKK30gaG9zdF9ldmVudF93bGFuX2FkZF9ibG9ja19hY2tfZGVsZXRlX2ZhaWxlZF9wYXlsb2FkX3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRXZlbnQgSUQ6IEVWRU5UX1dMQU5fQlNTX1BST1RFQ1RJT04KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBldmVudF90eXBlOworCXVpbnQ4X3QgcHJvdF90eXBlOworfSBob3N0X2V2ZW50X3dsYW5fYnNzX3Byb3RfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEV2ZW50IElEOiBFVkVOVF9XTEFOX0JSSU5HVVBfU1RBVFVTCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IHdsYW5TdGF0dXM7CisJY2hhciBkcml2ZXJWZXJzaW9uWzEwXTsKK30gaG9zdF9ldmVudF93bGFuX2JyaW5ndXBfc3RhdHVzX3BheWxvYWRfdHlwZTsKKworQ0RTX1BBQ0tfU1RBUlQKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRXZlbnQgSUQ6IEVWRU5UX1dMQU5fUE9XRVJTQVZFX0dFTkVSSUMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIENEU19QQUNLX1BSRSBzdHJ1Y3QgeworCXVpbnQ4X3QgZXZlbnRfc3VidHlwZTsKKwl1aW50OF90IGZ1bGxfcG93ZXJfcmVxdWVzdF9yZWFzb247CisJdWludDhfdCBwbWNfY3VycmVudF9zdGF0ZTsKKwl1aW50OF90IGVuYWJsZV9kaXNhYmxlX3Bvd2Vyc2F2ZV9tb2RlOworCXVpbnQ4X3Qgd2lubW9iX2RfcG93ZXJfc3RhdGU7CisJdWludDhfdCBkdGltX3BlcmlvZDsKKwl1aW50MTZfdCBmaW5hbF9saXN0ZW5faW50djsKKwl1aW50MTZfdCBibXBzX2F1dG9fdGltZXJfZHVyYXRpb247CisJdWludDE2X3QgYm1wc19wZXJpb2Q7Cit9IENEU19QQUNLX1BPU1QgaG9zdF9ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGU7CisKK0NEU19QQUNLX0VORAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBFdmVudCBJRDogRVZFTlRfV0xBTl9QT1dFUlNBVkVfV09XCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgZXZlbnRfc3VidHlwZTsKKwl1aW50OF90IHdvd190eXBlOworCXVpbnQ4X3Qgd293X21hZ2ljX3BhdHRlcm5bNl07CisJdWludDhfdCB3b3dfZGVsX3B0cm5faWQ7CisJdWludDhfdCB3b3dfd2FrZXVwX2NhdXNlOworCXVpbnQ4X3Qgd293X3dha2V1cF9jYXVzZV9wYm1fcHRybl9pZDsKK30gaG9zdF9ldmVudF93bGFuX3Bvd2Vyc2F2ZV93b3dfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEV2ZW50IElEOiBFVkVOVF9XTEFOX0JUQworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGV2ZW50SWQ7CisJdWludDhfdCBidEFkZHJbNl07CisJdWludDE2X3QgY29ubkhhbmRsZTsKKwl1aW50OF90IGNvbm5TdGF0dXM7CisJdWludDhfdCBsaW5rVHlwZTsKKwl1aW50OF90IHNjb0ludGVydmFsOworCXVpbnQ4X3Qgc2NvV2luZG93OworCXVpbnQ4X3QgcmV0cmFuc1dpbmRvdzsKKwl1aW50OF90IG1vZGU7Cit9IGhvc3RfZXZlbnRfd2xhbl9idGNfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEV2ZW50IElEOiBFVkVOVF9XTEFOX0VBUE9MCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyAqIHN0cnVjdCBob3N0X2V2ZW50X3dsYW5fZWFwb2wgLSBTdHJ1Y3R1cmUgaG9sZGluZyB0aGUgZWFwb2wgaW5mb3JtYXRpb24KKyAqIEBldmVudF9zdWJfdHlwZToJMC1UcmFuc21pdHRlZCwgMS1SZWNlaXZlZAorICogQGVhcG9sX3BhY2tldF90eXBlOgkwIC0gRUFQIFN0YXJ0LCAxIC0gRUFQT0wgU3RhcnQsIDIgLSBFQVBPTCBMb2dvZmYKKwkJCTMgLSBFQVBPTCBLZXksIDQgLSBFQVBPTCBFbmNhcHN1bGF0ZWQgQWxlcnQKKyAqIEBlYXBvbF9rZXlfaW5mbzoJVGhpcyBmaWVsZCBmcm9tIHRoZSBkcml2ZXIgaXMgaW4gYmlnIGVuZGlhbiBmb3JtYXQuCisgKgkJCVNvLCB0aGUgbWFza3MgLjB4ODAxMy4gY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUKKyAqCQkJbWVzc2FnZSB0eXBlLiBBZnRlciBtYXNraW5nLCB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcKKyAqCQkJdG8gbWVzc2FnZXMgMS8yLzMvNCBhcmUgZ2l2ZW4gYmVsb3c6CisgKgkJCU1zZy4gMQkweDgwMDAKKyAqCQkJTXNnLiAyCTB4MDAwMQorICoJCQlNc2cuIDMJMHg4MDEzCisgKgkJCU1zZy4gNAkweDAwMDMKKyAqIEBlYXBvbF9yYXRlOgkJUmF0ZSBhdCB3aGljaCB0aGUgZnJhbWUgaXMgcmVjZWl2ZWQKKyAqIEBkZXN0X2FkZHI6CQlEZXN0aW5hdGlvbiBhZGRyZXNzCisgKiBAc3JjX2FkZHI6CQlTb3VyY2UgYWRkcmVzcworICoKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBFQVBPTCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGxvZ2dpbmcKKyAqLworc3RydWN0IGhvc3RfZXZlbnRfd2xhbl9lYXBvbCB7CisJdWludDhfdCAgIGV2ZW50X3N1Yl90eXBlOworCXVpbnQ4X3QgICBlYXBvbF9wYWNrZXRfdHlwZTsKKwl1aW50MTZfdCAgZWFwb2xfa2V5X2luZm87CisJdWludDE2X3QgIGVhcG9sX3JhdGU7CisJdWludDhfdCAgIGRlc3RfYWRkcls2XTsKKwl1aW50OF90ICAgc3JjX2FkZHJbNl07Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRXZlbnQgSUQ6IEVWRU5UX1dMQU5fV0FLRV9MT0NLCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyAqIHN0cnVjdCBob3N0X2V2ZW50X3dsYW5fd2FrZV9sb2NrIC0gU3RydWN0dXJlIGhvbGRpbmcgdGhlIHdha2Vsb2NrIGluZm9ybWF0aW9uCisgKiBAc3RhdHVzOiBXaGV0aGVyIHRoZSB3YWtlbG9jayBpcyB0YWtlbi9yZWxlYXNlZAorICogQHJlYXNvbjogUmVhc29uIGZvciB0YWtpbmcgdGhpcyB3YWtlbG9jaworICogQHRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUgaW4gY2FzZSBvZiB0aW1lZCB3YWtlbG9ja3MKKyAqIEBuYW1lX2xlbjogTGVuZ3RoIG9mIHRoZSBuYW1lIG9mIHRoZSB3YWtlbG9jayB0aGF0IHdpbGwgZm9sbG93CisgKiBAbmFtZTogTmFtZSBvZiB0aGUgd2FrZWxvY2sKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSB3aWxsIGhvbGQgdGhlIHdha2Vsb2NrIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBob3N0X2V2ZW50X3dsYW5fd2FrZV9sb2NrIHsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgcmVhc29uOworCXVpbnQzMl90IHRpbWVvdXQ7CisJdWludDMyX3QgbmFtZV9sZW47CisJY2hhciAgICAgbmFtZVtXQUtFX0xPQ0tfTkFNRV9MRU5dOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEV2ZW50IElEOiBFVkVOVF9XTEFOX0xPR19DT01QTEVURQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqCisgKiBzdHJ1Y3QgaG9zdF9ldmVudF93bGFuX2xvZ19jb21wbGV0ZSAtIEhvbGRzIGxvZyBjb21wbGV0aW9uIGRldGFpbHMKKyAqIEBpc19mYXRhbDogSW5kaWNhdGVzIGlmIHRoZSBldmVudCBpcyBmYXRhbCBvciBub3QKKyAqIEBpbmRpY2F0b3I6IFNvdXJjZSBvZiB0aGUgYnVnIHJlcG9ydCAtIEZyYW1ld29yay9Ib3N0L0Zpcm13YXJlCisgKiBAcmVhc29uX2NvZGU6IFJlYXNvbiBmb3IgdHJpZ2dlcmluZyBidWcgcmVwb3J0CisgKiBAcmVzZXJ2ZWQ6IFJlc2VydmVkIGZpZWxkCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGxvZyBjb21wbGV0aW9uIHJlbGF0ZWQgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IGhvc3RfZXZlbnRfd2xhbl9sb2dfY29tcGxldGUgeworCXVpbnQzMl90IGlzX2ZhdGFsOworCXVpbnQzMl90IGluZGljYXRvcjsKKwl1aW50MzJfdCByZWFzb25fY29kZTsKKwl1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyAqIGVudW0gd2lmaV9jb25uZWN0aXZpdHlfZXZlbnRzIC0gRW51bSBjb250YWluaW5nIEVBUE9MIHN1YiB0eXBlCisgKiBAV0lGSV9FVkVOVF9EUklWRVJfRUFQT0xfRlJBTUVfVFJBTlNNSVRfUkVRVUVTVEVEOglFQVBPTCB0cmFuc21pdHRlZAorICogQFdJRklfRVZFTlRfRFJJVkVSX0VBUE9MX0ZSQU1FX1JFQ0VJVkVEOgkJRUFQT0wgcmVjZWl2ZWQKKyAqCisgKiBUaGlzIGVudW0gY29udGFpbnMgdGhlIEVBUE9MIHN1YnR5cGUKKyAqLworZW51bSB3aWZpX2Nvbm5lY3Rpdml0eV9ldmVudHMgeworCVdJRklfRVZFTlRfRFJJVkVSX0VBUE9MX0ZSQU1FX1RSQU5TTUlUX1JFUVVFU1RFRCwKKwlXSUZJX0VWRU5UX0RSSVZFUl9FQVBPTF9GUkFNRV9SRUNFSVZFRCwKK307CisKKy8qKgorICogZW51bSB3YWtlX2xvY2tfcmVhc29uIC0gUmVhc29uIGZvciB0YWtpbmcvcmVsZWFzaW5nIHdha2Vsb2NrCisgKiBAV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19EUklWRVJfSU5JVDogRHJpdmVyIGluaXRpYWxpemF0aW9uCisgKiBAV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19EUklWRVJfUkVJTklUOiBEcml2ZXIgcmUtaW5pdGlhbGl6YXRpb24KKyAqIEBXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX0RSSVZFUl9FWElUOiBEcml2ZXIgc2h1dGRvd24KKyAqIEBXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1NDQU46IFNjYW4gcmVxdWVzdC9yZXNwb25zZSBoYW5kbGluZworICogQFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfRVhUX1NDQU46IEV4dGVuZGVkIHNjYW4gcmVxdWVzdC9yZXNwb25zZSBoYW5kbGluZworICogQFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfUkVTVU1FX1dMQU46IERyaXZlciByZXN1bWUKKyAqIEBXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1JPQzogUmVtYWluIG9uIGNoYW5uZWwgcmVxdWVzdC9yZXNwb25zZSBoYW5kbGluZworICogQFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfQVVUT19TVVNQRU5EOiBBdXRvIHN1c3BlbmQgcmVsYXRlZCBoYW5kbGluZworICogQFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfSVBBOiBJUEEgcmVsYXRlZCBoYW5kbGluZworICogQFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfQUREX1NUQTogQWRkaXRpb24gb2YgU1RBCisgKiBAV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19IT0xEX1JYOiBXYWtlbG9ja3MgdGFrZW4gZm9yIHJlY2VpdmUKKyAqIEBXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1NBUDogU29mdEFQIHJlbGF0ZWQgd2FrZWxvY2tzCisgKiBAV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19XT1c6IFdvVyBmZWF0dXJlIHJlbGF0ZWQKKyAqIEBXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1BOTzogUE5PIGZlYXR1cmUgcmVsYXRlZAorICogQFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfREVMX1NUQTogRGVsZXRpb24gb2YgYSBzdGF0aW9uCisgKiBAV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19ERlM6IERGUyByZWxhdGVkIHdha2Vsb2NrcworICogQFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfTUlTQzogTWlzY2VsbGFuZW91cyB3YWtlbG9ja3MKKyAqCisgKiBJbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3Igd2hpY2ggdGhlIHdha2Vsb2NrIHdhcyB0YWtlbi9yZWxlYXNlZAorICovCitlbnVtIHdha2VfbG9ja19yZWFzb24geworCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfRFJJVkVSX0lOSVQsCisJV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19EUklWRVJfUkVJTklULAorCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfRFJJVkVSX0VYSVQsCisJV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19TQ0FOLAorCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfRVhUX1NDQU4sCisJV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19SRVNVTUVfV0xBTiwKKwlXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX1JPQywKKwlXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX0FVVE9fU1VTUEVORCwKKwlXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX0lQQSwKKwlXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX0FERF9TVEEsCisJV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19IT0xEX1JYLAorCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfU0FQLAorCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfV09XLAorCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfUE5PLAorCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfREVMX1NUQSwKKwlXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX0RGUywKKwlXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX01JU0MsCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworI2VuZGlmIC8qIF9fSE9TVF9ESUFHX0NPUkVfRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9ob3N0X2RpYWdfbG9nL2luYy9ob3N0X2RpYWdfY29yZV9sb2cuaCBiL2NvcmUvdXRpbHMvaG9zdF9kaWFnX2xvZy9pbmMvaG9zdF9kaWFnX2NvcmVfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3YWQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdXRpbHMvaG9zdF9kaWFnX2xvZy9pbmMvaG9zdF9kaWFnX2NvcmVfbG9nLmgKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZCggX19IT1NUX0RJQUdfQ09SRV9MT0dfSCApCisjZGVmaW5lIF9fSE9TVF9ESUFHX0NPUkVfTE9HX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgaG9zdF9kaWFnX2NvcmVfbG9nLmgKKworICAgXGJyaWVmIFdMQU4gVVRJTCBob3N0IERJQUcgbG9ncworCisgICBEZWZpbml0aW9ucyBmb3IgV0xBTiBVVElMIGhvc3QgZGlhZyBldmVudHMKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBGaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJpX2hvc3RfZGlhZ19jb3JlX2xvZy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIEhPU1RfTE9HX01BWF9OVU1fU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIxKQorI2RlZmluZSBIT1NUX0xPR19NQVhfTlVNX0JTU0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyMSkKKyNkZWZpbmUgSE9TVF9MT0dfTUFYX1NTSURfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzIpCisjZGVmaW5lIEhPU1RfTE9HX01BWF9CU1NJRF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCisjZGVmaW5lIEhPU1RfTE9HX01BWF9OVU1fQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDY0KQorI2RlZmluZSBIT1NUX0xPR19NQVhfTlVNX0hPX0NBTkRJREFURV9BUFMgICAgICAgICAgICAgICAgICAgICgyMCkKKyNkZWZpbmUgSE9TVF9MT0dfTUFYX1dPV19QVFJOX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTI4KQorI2RlZmluZSBIT1NUX0xPR19NQVhfV09XX1BUUk5fTUFTS19TSVpFICAgICAgICAgICAgICAgICAgICAgICgxNikKKyNkZWZpbmUgVk9TX0xPR19QS1RfTE9HX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjA0OCkKKyNkZWZpbmUgSE9TVF9MT0dfUEtUX0xPR19USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2MAorCisvKiBWZXJzaW9uIHRvIGJlIHVwZGF0ZWQgd2hlbmV2ZXIgZm9ybWF0IG9mIHZvc19sb2dfcGt0bG9nX2luZm8gY2hhbmdlcyAqLworI2RlZmluZSBWRVJTSU9OX0xPR19XTEFOX1BLVF9MT0dfSU5GT19DICAgICAgICAgICAgICAgICAgICAgMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhpcyBwYWNrZXQgY29udGFpbnMgdGhlIHNjYW4gcmVzdWx0cyBvZiB0aGUgcmVjZW50IHNjYW4gb3BlcmF0aW9uCisgICBMT0dfV0xBTl9TQ0FOX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0OTYKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nX2hkcl90eXBlIGhkcjsKKwl1aW50OF90IGV2ZW50SWQ7CisJdWludDhfdCBudW1Tc2lkOworCXVpbnQ4X3Qgc3NpZFtIT1NUX0xPR19NQVhfTlVNX1NTSURdW0hPU1RfTE9HX01BWF9TU0lEX1NJWkVdOworCXVpbnQ4X3QgYnNzaWRbSE9TVF9MT0dfTUFYX05VTV9CU1NJRF1bSE9TVF9MT0dfTUFYX0JTU0lEX1NJWkVdOworCXVpbnQ4X3QgdG90YWxTc2lkOworCXVpbnQ4X3QgbWluQ2huVGltZTsKKwl1aW50OF90IG1heENoblRpbWU7CisJdWludDE2X3QgdGltZUJldHdlZW5CZ1NjYW47CisJdWludDhfdCBCU1NNb2RlOworCXVpbnQ4X3QgbnVtQ2hhbm5lbDsKKwl1aW50OF90IGNoYW5uZWxzW0hPU1RfTE9HX01BWF9OVU1fQ0hBTk5FTF07CisJdWludDE2X3Qgc3RhdHVzOworfSBob3N0X2xvZ19zY2FuX3BrdF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhpcyBwYWNrZXQgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gSUJTUyBjb25uZWN0aW9uIHNldHVwCisgICBMT0dfV0xBTl9JQlNTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0OTcKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nX2hkcl90eXBlIGhkcjsKKwl1aW50OF90IGV2ZW50SWQ7CisJdWludDhfdCBjaGFubmVsU2V0dGluZzsKKwl1aW50OF90IGJzc2lkW0hPU1RfTE9HX01BWF9CU1NJRF9TSVpFXTsKKwl1aW50OF90IHBlZXJNYWNBZGRyW0hPU1RfTE9HX01BWF9CU1NJRF9TSVpFXTsKKwl1aW50OF90IHNzaWRbSE9TVF9MT0dfTUFYX1NTSURfU0laRV07CisJdWludDhfdCBvcGVyYXRpbmdDaGFubmVsOworCXVpbnQ4X3QgYmVhY29uSW50ZXJ2YWw7CisJdWludDhfdCBzdGF0dXM7Cit9IGhvc3RfbG9nX2lic3NfcGt0X3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUaGlzIHBhY2tldCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byA4MDIuMTFECisgICBMT0dfV0xBTl84MDIxMURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0OTgKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nX2hkcl90eXBlIGhkcjsKKwl1aW50OF90IGV2ZW50SWQ7CisJdWludDhfdCBudW1DaGFubmVsOworCXVpbnQ4X3QgQ2hhbm5lbHNbSE9TVF9MT0dfTUFYX05VTV9DSEFOTkVMXTsKKwl1aW50OF90IFR4UHdyW0hPU1RfTE9HX01BWF9OVU1fQ0hBTk5FTF07CisJdWludDhfdCBjb3VudHJ5Q29kZVszXTsKKwl1aW50OF90IHN1cHBvcnRNdWx0aXBsZURvbWFpbjsKK30gaG9zdF9sb2dfODAyXzExZF9wa3RfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoaXMgaXMgYSBsb2cgcGFja2V0IHdoaWNoIGNvbnRhaW5zIGJlbG93IGhhbmRvZmYgaW5mb3JtYXRpb246CisgICAtIEN1cnJlbnQgQVAgKyBSU1NJIChpZiBhbHJlYWR5IGFzc29jaWF0ZWQpCisgICAtIENhbmRpZGF0ZSBBUCArIFJTU0kgKGJlZm9yZSBhc3NvY2lhdGlvbiBhbmQgd2hlbiB0aGUgbGlzdCBpcyB1cGRhdGVkKQorICAgLSBGb3IgZWFjaCBCU1NJRCBpbiBjYW5kaWRhdGUgbGlzdCwgcHJvdmlkZSBSU1NJLCBRb1MgYW5kIHNlY3VyaXR5IGNvbXBhdGliaWxpdHkKKyAgIExPR19XTEFOX0hBTkRPRkZfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ5OQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IHNzaWRbOV07CisJdWludDhfdCBic3NpZFtIT1NUX0xPR19NQVhfQlNTSURfU0laRV07CisJdWludDhfdCBjaGFubmVsX2lkOworCXVpbnQzMl90IHFvc19zY29yZTsKKwl1aW50MzJfdCBzZWNfc2NvcmU7CisJdWludDMyX3QgcnNzaV9zY29yZTsKKwl1aW50MzJfdCBvdmVyYWxsX3Njb3JlOworCXVpbnQzMl90IHR4X3BlcjsgICAgICAgICAgICAgICAgLyogcmVwcmVzZW50ZWQgYXMgYSAlICAgICAgKi8KKwl1aW50MzJfdCByeF9wZXI7ICAgICAgICAgICAgICAgIC8qIHJlcHJlc2VudGVkIGFzIGEgJSAgICAgICovCisKK30gaG9zdF9sb2dfaG9fYXBfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWxvZ19oZHJfdHlwZSBoZHI7CisJdWludDMyX3QgbnVtX2FwczsKKwlob3N0X2xvZ19ob19hcF9pbmZvIGN1cnJlbnRfYXBfaW5mbzsKKwlob3N0X2xvZ19ob19hcF9pbmZvCisJCWNhbmRpZGF0ZV9hcF9pbmZvW0hPU1RfTE9HX01BWF9OVU1fSE9fQ0FORElEQVRFX0FQU107Cit9IGhvc3RfbG9nX2hvX3BrdF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhpcyBwYWNrZXQgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIEVEQ0EgcGFyYW1ldGVycworICAgYWR2ZXJ0aXNlZCBieSB0aGUgQVAKKyAgIExPR19XTEFOX1FPU19FRENBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ5QQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsb2dfaGRyX3R5cGUgaGRyOworCXVpbnQ4X3QgYWNpX2JlOworCXVpbnQ4X3QgY3dfYmU7CisJdWludDE2X3QgdHhvcGxpbWl0X2JlOworCXVpbnQ4X3QgYWNpX2JrOworCXVpbnQ4X3QgY3dfYms7CisJdWludDE2X3QgdHhvcGxpbWl0X2JrOworCXVpbnQ4X3QgYWNpX3ZpOworCXVpbnQ4X3QgY3dfdmk7CisJdWludDE2X3QgdHhvcGxpbWl0X3ZpOworCXVpbnQ4X3QgYWNpX3ZvOworCXVpbnQ4X3QgY3dfdm87CisJdWludDE2X3QgdHhvcGxpbWl0X3ZvOworfSBob3N0X2xvZ19xb3NfZWRjYV9wa3RfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoaXMgcGFja2V0IGNvbnRhaW5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYmVhY29uIHJlY2VpdmVkIHZhbHVlCisgICBMT0dfV0xBTl9CRUFDT05fVVBEQVRFX0MgICAgICAgICAgICAgICAgICAgICAgICAweDE0OUIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nX2hkcl90eXBlIGhkcjsKKwl1aW50MzJfdCBiY25fcnhfY250OworfSBob3N0X2xvZ19iZWFjb25fdXBkYXRlX3BrdF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhpcyBwYWNrZXQgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYSBXb1cgcGF0ZXJuIHZhbHVlIHdoZW4gc2V0CisgICBMT0dfV0xBTl9QT1dFUlNBVkVfV09XX0FERF9QVFJOX0MgICAgICAgICAgICAgICAweDE0OUMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nX2hkcl90eXBlIGhkcjsKKwl1aW50OF90IHBhdHRlcm5faWQ7CisJdWludDhfdCBwYXR0ZXJuX2J5dGVfb2Zmc2V0OworCXVpbnQ4X3QgcGF0dGVybl9zaXplOworCXVpbnQ4X3QgcGF0dGVybltIT1NUX0xPR19NQVhfV09XX1BUUk5fU0laRV07CisJdWludDhfdCBwYXR0ZXJuX21hc2tfc2l6ZTsKKwl1aW50OF90IHBhdHRlcm5fbWFza1tIT1NUX0xPR19NQVhfV09XX1BUUk5fTUFTS19TSVpFXTsKK30gaG9zdF9sb2dfcG93ZXJzYXZlX3dvd19hZGRfcHRybl9wa3RfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoaXMgcGFja2V0IGNvbnRhaW5zIHRoZSBQSFkgJiBNQUMgbGF5ZXIgc3RhdGlzdGljcyBzZW50IGJ5IGxvd2VyIGxheWVyCisgICBfV0xBTl9MSU5LTEFZRVJfU1RBVF9DICAgICAgICAgICAgICAgICAgICAgICAweDE0QTEKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgcmV0cnlfY250WzRdOworCXVpbnQzMl90IG11bHRpcGxlX3JldHJ5X2NudFs0XTsKKwl1aW50MzJfdCB0eF9mcm1fY250WzRdOworCXVpbnQzMl90IHJ4X2ZybV9jbnQ7CisJdWludDMyX3QgZnJtX2R1cF9jbnQ7CisJdWludDMyX3QgZmFpbF9jbnRbNF07CisJdWludDMyX3QgcnRzX2ZhaWxfY250OworCXVpbnQzMl90IGFja19mYWlsX2NudDsKKwl1aW50MzJfdCBydHNfc3VjY19jbnQ7CisJdWludDMyX3QgcnhfZGlzY2FyZF9jbnQ7CisJdWludDMyX3QgcnhfZXJyb3JfY250OworCXVpbnQzMl90IHR4X2J5dGVfY250OworCit9IHN1bW1hcnlTdGF0c0luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCByeF9mcmFnX2NudDsKKwl1aW50MzJfdCBwcm9taXNjdW91c19yeF9mcmFnX2NudDsKKwl1aW50MzJfdCByeF9pbnB1dF9zZW5zaXRpdml0eTsKKwl1aW50MzJfdCBtYXhfcHdyOworCXVpbnQzMl90IHN5bmNfZmFpbF9jbnQ7CisJdWludDMyX3QgdHhfcmF0ZTsKKworfSBnbG9iYWxDbGFzc0FTdGF0c0luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCB1Y19yeF93ZXBfdW5lbmNyeXB0ZWRfZnJtX2NudDsKKwl1aW50MzJfdCB1Y19yeF9taWNfZmFpbF9jbnQ7CisJdWludDMyX3QgdWNfdGtpcF9pY3ZfZXJyOworCXVpbnQzMl90IHVjX2Flc19jY21wX2Zvcm1hdF9lcnI7CisJdWludDMyX3QgdWNfYWVzX2NjbXBfcmVwbGF5X2NudDsKKwl1aW50MzJfdCB1Y19hZXNfY2NtcF9kZWNycHRfZXJyOworCXVpbnQzMl90IHVjX3dlcF91bmRlY3J5cHRhYmxlX2NudDsKKwl1aW50MzJfdCB1Y193ZXBfaWN2X2VycjsKKwl1aW50MzJfdCB1Y19yeF9kZWNyeXB0X3N1Y2NfY250OworCXVpbnQzMl90IHVjX3J4X2RlY3J5cHRfZmFpbF9jbnQ7CisJdWludDMyX3QgbWNiY19yeF93ZXBfdW5lbmNyeXB0ZWRfZnJtX2NudDsKKwl1aW50MzJfdCBtY2JjX3J4X21pY19mYWlsX2NudDsKKwl1aW50MzJfdCBtY2JjX3RraXBfaWN2X2VycjsKKwl1aW50MzJfdCBtY2JjX2Flc19jY21wX2Zvcm1hdF9lcnI7CisJdWludDMyX3QgbWNiY19hZXNfY2NtcF9yZXBsYXlfY250OworCXVpbnQzMl90IG1jYmNfYWVzX2NjbXBfZGVjcnB0X2VycjsKKwl1aW50MzJfdCBtY2JjX3dlcF91bmRlY3J5cHRhYmxlX2NudDsKKwl1aW50MzJfdCBtY2JjX3dlcF9pY3ZfZXJyOworCXVpbnQzMl90IG1jYmNfcnhfZGVjcnlwdF9zdWNjX2NudDsKKwl1aW50MzJfdCBtY2JjX3J4X2RlY3J5cHRfZmFpbF9jbnQ7CisKK30gZ2xvYmFsQ2xhc3NCU3RhdHNJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgcnhfYW1zZHVfY250OworCXVpbnQzMl90IHJ4X2FtcGR1X2NudDsKKwl1aW50MzJfdCB0eF8yMF9mcm1fY250OworCXVpbnQzMl90IHJ4XzIwX2ZybV9jbnQ7CisJdWludDMyX3QgcnhfbXBkdV9pbl9hbXBkdV9jbnQ7CisJdWludDMyX3QgYW1wZHVfZGVsaW1pdGVyX2NyY19lcnI7CisKK30gZ2xvYmFsQ2xhc3NDU3RhdHNJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgdHhfdWNfZnJtX2NudDsKKwl1aW50MzJfdCB0eF9tY19mcm1fY250OworCXVpbnQzMl90IHR4X2JjX2ZybV9jbnQ7CisJdWludDMyX3QgcnhfdWNfZnJtX2NudDsKKwl1aW50MzJfdCByeF9tY19mcm1fY250OworCXVpbnQzMl90IHJ4X2JjX2ZybV9jbnQ7CisJdWludDMyX3QgdHhfdWNfYnl0ZV9jbnRbNF07CisJdWludDMyX3QgdHhfbWNfYnl0ZV9jbnQ7CisJdWludDMyX3QgdHhfYmNfYnl0ZV9jbnQ7CisJdWludDMyX3QgcnhfdWNfYnl0ZV9jbnRbNF07CisJdWludDMyX3QgcnhfbWNfYnl0ZV9jbnQ7CisJdWludDMyX3QgcnhfYmNfYnl0ZV9jbnQ7CisJdWludDMyX3QgcnhfYnl0ZV9jbnQ7CisJdWludDMyX3QgbnVtX3J4X2J5dGVzX2NyY19vazsKKwl1aW50MzJfdCByeF9yYXRlOworCit9IGdsb2JhbENsYXNzRFN0YXRzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IHR4X2ZyYWdfY250WzRdOworCXVpbnQzMl90IHR4X2FtcGR1X2NudDsKKwl1aW50MzJfdCB0eF9tcGR1X2luX2FtcGR1X2NudDsKK30gcGVyU3RhU3RhdHNJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nX2hkcl90eXBlIGhkcjsKKwl1aW50OF90IHZlcnNpb247CisJdWludDhfdCByZXNlcnZlZFszXTsKKwl1aW50MzJfdCBzdGF0X21hc2s7CisJc3VtbWFyeVN0YXRzSW5mbyBzdW1tYXJ5U3RhdHM7CisJZ2xvYmFsQ2xhc3NBU3RhdHNJbmZvIGdsb2JhbENsYXNzQVN0YXRzOworCWdsb2JhbENsYXNzQlN0YXRzSW5mbyBnbG9iYWxDbGFzc0JTdGF0czsKKwlnbG9iYWxDbGFzc0NTdGF0c0luZm8gZ2xvYmFsQ2xhc3NDU3RhdHM7CisJZ2xvYmFsQ2xhc3NEU3RhdHNJbmZvIGdsb2JhbENsYXNzRFN0YXRzOworCXBlclN0YVN0YXRzSW5mbyBwZXJTdGFTdGF0czsKK30gaG9zdF9sb2dfc3RhdGlzdGljc19wa3RfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoaXMgcGFja2V0IGNvbnRhaW5zIHRoZSBUc3BlYyBpbmZvIG5lZ290aWF0ZWQgd2l0aCB0aGUgQVAgZm9yIHRoZQorICAgc3BlY2lmaWMgQUMKKyAgIExPR19XTEFOX1FPU19UU1BFQ19DICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTRBMgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsb2dfaGRyX3R5cGUgaGRyOworCXVpbnQ4X3QgdHNpbmZvWzNdOworCXVpbnQxNl90IG5vbWluYWxfbXNkdV9zaXplOworCXVpbnQxNl90IG1heGltdW1fbXNkdV9zaXplOworCXVpbnQzMl90IG1pbl9zZXJ2aWNlX2ludGVydmFsOworCXVpbnQzMl90IG1heF9zZXJ2aWNlX2ludGVydmFsOworCXVpbnQzMl90IGluYWN0aXZpdHlfaW50ZXJ2YWw7CisJdWludDMyX3Qgc3VzcGVuc2lvbl9pbnRlcnZhbDsKKwl1aW50MzJfdCBzdmNfc3RhcnRfdGltZTsKKwl1aW50MzJfdCBtaW5fZGF0YV9yYXRlOworCXVpbnQzMl90IG1lYW5fZGF0YV9yYXRlOworCXVpbnQzMl90IHBlYWtfZGF0YV9yYXRlOworCXVpbnQzMl90IG1heF9idXJzdF9zaXplOworCXVpbnQzMl90IGRlbGF5X2JvdW5kOworCXVpbnQzMl90IG1pbl9waHlfcmF0ZTsKKwl1aW50MTZfdCBzdXJwbHVzX2J3X2FsbG93YW5jZTsKKwl1aW50MTZfdCBtZWRpdW1fdGltZTsKK30gaG9zdF9sb2dfcW9zX3RzcGVjX3BrdF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhpcyBwYWNrZXQgY29udGFpbnMgZGF0YSBpbmZvcm1hdGlvbiB3aGVuIHN0YWxsIGRldGVjdGVkCisgICBMT0dfVFJTUF9EQVRBX1NUQUxMX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDEKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGNoYW5uZWxOYW1lWzRdOworCXVpbnQzMl90IG51bURlc2M7CisJdWludDMyX3QgbnVtRnJlZURlc2M7CisJdWludDMyX3QgbnVtUnN2ZERlc2M7CisJdWludDMyX3QgaGVhZERlc2NPcmRlcjsKKwl1aW50MzJfdCB0YWlsRGVzY09yZGVyOworCXVpbnQzMl90IGN0cmxSZWdWYWw7CisJdWludDMyX3Qgc3RhdFJlZ1ZhbDsKKwl1aW50MzJfdCBudW1WYWxEZXNjOworCXVpbnQzMl90IG51bUludmFsRGVzYzsKK30gaG9zdF9sb2dfZGF0YV9zdGFsbF9jaGFubmVsX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlsb2dfaGRyX3R5cGUgaGRyOworCXVpbnQzMl90IFBvd2VyU3RhdGU7CisJdWludDMyX3QgbnVtRnJlZUJkOworCWhvc3RfbG9nX2RhdGFfc3RhbGxfY2hhbm5lbF90eXBlIGR4ZUNoYW5uZWxJbmZvWzRdOworfSBob3N0X2xvZ19kYXRhX3N0YWxsX3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUaGlzIHBhY2tldCBjb250YWlucyB0aGUgcnNzaSB2YWx1ZSBmcm9tIEJTUyBkZXNjcmlwdG9yCisgICBMT0dfV0xBTl9SU1NJX1VQREFURV9DICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzNTQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nX2hkcl90eXBlIGhkcjsKKwlpbnQ4X3QgcnNzaTsKK30gaG9zdF9sb2dfcnNzaV9wa3RfdHlwZTsKKworLyoqCisgKiBzdHJ1Y3QgaG9zdF9sb2dfcGt0bG9nX2luZm8gLSBQYWNrZXQgbG9nIGluZm8KKyAqIEBsb2dfaGRyOiBMb2cgaGVhZGVyCisgKiBAYnVmX2xlbjogTGVuZ3RoIG9mIHRoZSBidWZmZXIgdGhhdCBmb2xsb3dzCisgKiBAYnVmOiAgICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHBhY2tldCBsb2cgaW5mbworICoKKyAqIFN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBwYWNrZXQgbG9nIGluZm9ybWF0aW9uCisgKiBMT0dfV0xBTl9QS1RfTE9HX0lORk9fQyAgICAgICAgICAweDE4RTAKKyAqLworc3RydWN0IGhvc3RfbG9nX3BrdGxvZ19pbmZvIHsKKwlsb2dfaGRyX3R5cGUgbG9nX2hkcjsKKwl1aW50MzJfdCB2ZXJzaW9uOworCXVpbnQzMl90IHNlcV9ubzsKKwl1aW50MzJfdCBidWZfbGVuOworCXVpbnQ4X3QgYnVmW107Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworI2VuZGlmIC8qIF9fSE9TVF9ESUFHX0NPUkVfTE9HX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvdXRpbHMvaG9zdF9kaWFnX2xvZy9pbmMvaG9zdF9kaWFnX2V2ZW50X2RlZnMuaCBiL2NvcmUvdXRpbHMvaG9zdF9kaWFnX2xvZy9pbmMvaG9zdF9kaWFnX2V2ZW50X2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTI1MGM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS91dGlscy9ob3N0X2RpYWdfbG9nL2luYy9ob3N0X2RpYWdfZXZlbnRfZGVmcy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgRVZFTlRfREVGU19ICisjZGVmaW5lIEVWRU5UX0RFRlNfSAorCit0eXBlZGVmIGVudW0geworCUVWRU5UX0RST1BfSUQgPSAwLAorCisJLyogRXZlbnRzIGJldHdlZW4gMHgxIHRvIDB4Njc0IGFyZSBub3QgdXNlZCAqLworCisJRVZFTlRfV0xBTl9TRUNVUklUWSA9IDB4Njc1LCAvKiAxMyBieXRlIHBheWxvYWQgKi8KKwlFVkVOVF9XTEFOX1NUQVRVUywgLyogMTUgYnl0ZSBwYXlsb2FkICovCisKKwkvKiBFdmVudHMgMHg2NzcgYW5kIDB4Njc4IGFyZSBub3QgdXNlZCAqLworCisJRVZFTlRfV0xBTl9RT1MgPSAweDY3OSwgLyogMiBieXRlIHBheWxvYWQgKi8KKwlFVkVOVF9XTEFOX1BFLCAvKiAxNiBieXRlIHBheWxvYWQgKi8KKworCS8qIEV2ZW50cyBiZXR3ZWVuIDB4NjdiIHRvIDB4NjdmIGFyZSBub3QgdXNlZCAqLworCisJRVZFTlRfV0xBTl9CUklOR1VQX1NUQVRVUyA9IDB4NjgwLCAvKiAxMiBieXRlIHBheWxvYWQgKi8KKwlFVkVOVF9XTEFOX1BPV0VSU0FWRV9HRU5FUklDLCAvKiAxNiBieXRlIHBheWxvYWQgKi8KKwlFVkVOVF9XTEFOX1BPV0VSU0FWRV9XT1csIC8qIDExIGJ5dGUgcGF5bG9hZCAqLworCisJLyogRXZlbnRzIGJldHdlZW4gMHg2ODMgdG8gMHg2OTAgYXJlIG5vdCB1c2VkICovCisKKwlFVkVOVF9XTEFOX0JUQyA9IDB4NjkxLCAvKiAxNSBieXRlIHBheWxvYWQgKi8KKwlFVkVOVF9XTEFOX0VBUE9MID0gMHhBOEQsLyogMTggYnl0ZXMgcGF5bG9hZCAqLworCUVWRU5UX1dMQU5fV0FLRV9MT0NLID0gMHhBQTIsIC8qIDk2IGJ5dGVzIHBheWxvYWQgKi8KKwlFVkVOVF9XTEFOX0JFQUNPTl9SRUNFSVZFRCA9IDB4QUE2LCAvKiBGVyBldmVudDogMjcyNiAqLworCUVWRU5UX1dMQU5fTE9HX0NPTVBMRVRFID0gMHhBQTcsIC8qIDE2IGJ5dGVzIHBheWxvYWQgKi8KKworCUVWRU5UX01BWF9JRCA9IDB4MEZGRgorfSBldmVudF9pZF9lbnVtX3R5cGU7CisKKyNlbmRpZiAvKiBFVkVOVF9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvdXRpbHMvaG9zdF9kaWFnX2xvZy9pbmMvbG9nX2NvZGVzLmggYi9jb3JlL3V0aWxzL2hvc3RfZGlhZ19sb2cvaW5jL2xvZ19jb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MmNlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL2hvc3RfZGlhZ19sb2cvaW5jL2xvZ19jb2Rlcy5oCkBAIC0wLDAgKzEsMjA3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBMT0dfQ09ERVNfSAorI2RlZmluZSBMT0dfQ09ERVNfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgTG9nIENvZGUgRGVmaW5pdGlvbnMKKworICAgR2VuZXJhbCBEZXNjcmlwdGlvbgorICAgVGhpcyBmaWxlIGNvbnRhaW5zIGxvZyBjb2RlIGRlZmluaXRpb25zIGFuZCBpcyBzaGFyZWQgd2l0aCB0aGUgdG9vbHMuCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIFdJVEhPVVQgUFJJT1IgQVBQUk9WQUwKKyoqCisqKiBMb2cgY29kZXMsIGJ5IGRlc2lnbiwgYXJlIGEgdGlnaHRseSBjb250cm9sbGVkIHNldCBvZiB2YWx1ZXMuCisqKiBEZXZlbG9wZXJzIG1heSBub3QgY3JlYXRlIGxvZyBjb2RlcyBhdCB3aWxsLgorKioKKyoqIFJlcXVlc3QgbmV3IGxvZ3MgdXNpbmcgdGhlIGZvbGxvd2luZyBwcm9jZXNzOgorKioKKyoqIDEuIFNlbmQgZW1haWwgdG8gYXN3LmRpYWcucmVxdWVzdCByZXF1ZXN0aW5nIGxvZyBjb2Rhc3NpZ25tZW50cy4KKyoqIDIuIElkZW50aWZ5IHRoZSBsb2cgbmVlZGVkIGJ5IG5hbWUuCisqKiAzLiBQcm92aWRlIGEgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHRoZSBsb2cuCisqKgorKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0IEhpc3RvcnkKKworICAgJEhlYWRlcjogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9zZXJ2aWNlcy9kaWFnL2FwaS9pbmMvbWFpbi9sYXRlc3QvbG9nX2NvZGVzLmgjOSAkCisKKyAgIHdoZW4gICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CisgICAtLS0tLS0tLSAgIC0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgMDcvMzAvMDkgICBkaGFvICAgIENvbnNvbGlkYXRlIGxvZ19jb2Rlc19hcHBzLmgKKyAgIDA3LzMwLzA5ICAgZGhhbyAgICBBZGQgTGFzdCBsb2cgY29kZSBkZWZpbml0aW9uIGZvciBFcXVpcCBJRCAxMQorICAgMDYvMjYvMDkgICBkaGFvICAgIFVwZGF0ZSBmb3JtYXQgdGhlIG1hY3JvCisgICAwNi8yNC8wOSAgIHNhciAgICAgUmV2ZXJ0ZWQgbGFzdCBjaGFuZ2UuCisgICAwNi8yNC8wOSAgIHNhciAgICAgQWRkZWQgbG9nIGNvZGUgZm9yIExPR19NQ19TVE1fQy4KKyAgIDExLzAyLzAxICAgc2ZoICAgICBGZWF0dXJpemUgY29tbW9uIE5BUyBsb2cgY29kZXMgZm9yIFVNVFMuCisgICAxMC8zMC8wMSAgIHNmaCAgICAgQWRkZWQgbG9nIGNvZGUgZm9yIExPR19HUFNfRkFUUEFUSF9JTkZPX0MuCisgICAxMC8yNC8wMSAgIHNmaCAgICAgQWRkZWQgdXBkYXRlcyBmb3IgVU1UUyBlcXVpcG1lbnQgSUQgYW5kIGxvZyBjb2Rlcy4KKyAgIDA2LzI3LzAxICAgbGFkICAgICBBZGRlZCBtdWx0aXBsZSBlcXVpcG1lbnQgSUQgc3VwcG9ydC4KKyAgIDA1LzIyLzAxICAgc2ZoICAgICBSZXNlcnZlZCBsb2cgY29kZXMgMTU4IC0gMTY4LgorICAgMDUvMjEvMDEgICBzZmggICAgIEtlZXAgY29uZnVzaW5nIFhYWF9CQVNFX0MgbmFtZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICAgMDUvMTYvMDEgICBzZmggICAgIFJlc2VydmVkIGxvZyBjb2RlIDE1NS4KKyAgIDA1LzA4LzAxICAgc2ZoICAgICBSZXNlcnZlZCBsb2cgY29kZXMgMTUwIC0gMTU0LgorICAgMDQvMDYvMDEgICBsYWQgICAgIEFkZGVkIGRlZmluaXRpb25zIG9mIGJhc2UgSURzIChzdWNoIGFzIExPR19XQ0RNQV9CQVNFX0MpLgorICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgY3VycmVudGx5IHVzaW5nIHRlbXBvcmFyeSBJRCB2YWx1ZXMgaW4gdGhlIDB4MTAwMAorICAgICAgICAgICAgICAgICAgIHJhbmdlLgorICAgMDIvMjMvMDEgICBsYWQgICAgIENyZWF0ZWQgZmlsZSBmcm9tIERNU1MgbG9nLmguICBMb2cgY29kZXMgb25seQorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEYXRhIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2cgZXF1aXBtZW50IElEcy4KKyAqIFRoZSBtb3N0IHNpZ25pZmljYW50IDQgYml0cyBvZiB0aGUgMTYgYml0IGxvZyBjb2RlIGlzIHRoZSBlcXVpcG1lbnQgSUQuCisgKiBPcmlnbmFsbHksIHRoZSBtb2JpbGUgd2FzIHRvIGhhdmUgYW4gSUQsIGFuZCBiYXNlIHN0YXRpb25zIGFuZCBvdGhlcgorICogSURzLiAgQXMgUUNUIHRlY2hub2xvZ3kgZGl2ZXJzaWZpZXMsIG5ldyBlcXVpcG1lbnQgSURzIGFyZSBhc3NpZ25lZCB0byBuZXcKKyAqIHRlY2hub2xvZ3kgYXJlYXMuICAweDIwMDAgYW5kIDB4MzAwMCBhcmUgcmVzZXJ2ZWQgZm9yIGxlZ2FjeSByZWFzb25zLCBzbworICogdGhlIGZpcnN0CisgKiBhZGRpdGlvbiBzdGFydHMgYXQgMHg0MDAwLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExPR18xWF9CQVNFX0MgICAgKCh1aW50MTZfdCkgMHgxMDAwKQorI2RlZmluZSBMT0dfV0NETUFfQkFTRV9DICgodWludDE2X3QpIDB4NDAwMCkKKyNkZWZpbmUgTE9HX0dTTV9CQVNFX0MgICAoKHVpbnQxNl90KSAweDUwMDApCisjZGVmaW5lIExPR19MQlNfQkFTRV9DICAgKCh1aW50MTZfdCkgMHg2MDAwKQorI2RlZmluZSBMT0dfVU1UU19CQVNFX0MgICgodWludDE2X3QpIDB4NzAwMCkKKyNkZWZpbmUgTE9HX1RETUFfQkFTRV9DICAoKHVpbnQxNl90KSAweDgwMDApCisjZGVmaW5lIExPR19EVFZfQkFTRV9DICAgKCh1aW50MTZfdCkgMHhBMDAwKQorI2RlZmluZSBMT0dfQVBQU19CQVNFX0MgICgodWludDE2X3QpIDB4QjAwMCkKKyNkZWZpbmUgTE9HX0xURV9CQVNFX0MgICAoKHVpbnQxNl90KSAoMHhCMDAwICsgMHgwMDEwKSkKKyNkZWZpbmUgTE9HX0xURV9MQVNUX0MgICAoKHVpbnQxNl90KSAweEIxRkYpCisjZGVmaW5lIExPR19XSU1BWF9CQVNFX0MgKCh1aW50MTZfdCkgMHhCNDAwKQorI2RlZmluZSBMT0dfRFNQX0JBU0VfQyAgICgodWludDE2X3QpIDB4QzAwMCkKKworI2RlZmluZSBMT0dfVE9PTFNfQkFTRV9DICgodWludDE2X3QpIDB4RjAwMCkKKworLyogTE9HX0JBU0VfQyBpcyB3aGF0IHdhcyB1c2VkIGJlZm9yZSBleHBhbmRpbmcgdGhlIHVzZSBvZiB0aGUgZXF1aXBtZW50IElELgorICogVE9ETzogT25jZSBhbGwgdGFyZ2V0cyBhcmUgdXNpbmcgdGhlICJjb3JlIiBkaWFnIHN5c3RlbSwgdGhpcyBzaG91bGQgYmUKKyAqIG9tbWl0dGVkLiAqLworI2RlZmluZSBMT0dfQkFTRV9DIExPR18xWF9CQVNFX0MKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9nIENvZGVzCisgKiAgIFRoZXNlIGNvZGVzIGlkZW50aWZ5IHRoZSBraW5kIG9mIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiBhIGxvZyBlbnRyeS4KKyAqICAgVGhleSBhcmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSAnY29kZScgZmllbGQgb2YgdGhlIGxvZyBlbnRyeQorICogICBoZWFkZXIuICBUaGUgZGF0YSB0eXBlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBjb2RlIGFyZSBkZWZpbmVkIGJlbG93LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGUgdXBwZXIgNCBiaXRzIG9mIHRoZSAxNiBiaXQgbG9nIGVudHJ5IGNvZGUgc3BlY2lmeSB3aGljaCB0eXBlCisgKiBvZiBlcXVpcG1lbnQgY3JlYXRlZCB0aGUgbG9nIGVudHJ5LiAqLworCisvKiAwIE1vYmlsZSBTdGF0aW9uIHRlbXBvcmFsIGFuYWx5emVyIGVudHJ5ICovCisjZGVmaW5lIExPR19UQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MCArIExPR18xWF9CQVNFX0MpCisKKy8qIDEgQUdDIHZhbHVlcyBhbmQgY2xvc2VkIGxvb3AgcG93ZXIgY29udHJvbCBlbnRyeSAqLworI2RlZmluZSBMT0dfQUdDX1BDVExfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyIEZvcndhcmQgbGluayBmcmFtZSByYXRlcyBhbmQgdHlwZXMgZW50cnkgKi8KKyNkZWZpbmUgTE9HX0ZfTVVYMV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyICsgTE9HXzFYX0JBU0VfQykKKworLyogMyBSZXZlcnNlIGxpbmsgZnJhbWUgcmF0ZXMgYW5kIHR5cGVzIGVudHJ5ICovCisjZGVmaW5lIExPR19SX01VWDFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MyArIExPR18xWF9CQVNFX0MpCisKKy8qIDQgQWNjZXNzIGNoYW5uZWwgbWVzc2FnZSBlbnRyeSAqLworI2RlZmluZSBMT0dfQUNfTVNHX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA1IFJldmVyc2UgbGluayB0cmFmZmljIGNoYW5uZWwgbWVzc2FnZSBlbnRyeSAqLworI2RlZmluZSBMT0dfUl9UQ19NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA2IFN5bmMgY2hhbm5lbCBtZXNzYWdlIGVudHJ5ICovCisjZGVmaW5lIExPR19TQ19NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NiArIExPR18xWF9CQVNFX0MpCisKKy8qIDcgUGFnaW5nIGNoYW5uZWwgbWVzc2FnZSBlbnRyeSAqLworI2RlZmluZSBMT0dfUENfTVNHX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA4IEZvcndhcmQgbGluayB0cmFmZmljIGNoYW5uZWwgbWVzc2FnZSBlbnRyeSAqLworI2RlZmluZSBMT0dfRl9UQ19NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDggKyBMT0dfMVhfQkFTRV9DKQorCisvKiA5IEZvcndhcmQgbGluayB2b2NvZGVyIHBhY2tldCBlbnRyeSAqLworI2RlZmluZSBMT0dfVk9DX0ZPUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxMCBSZXZlcnNlIGxpbmsgdm9jb2RlciBwYWNrZXQgZW50cnkgKi8KKyNkZWZpbmUgTE9HX1ZPQ19SRVZfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhBICsgTE9HXzFYX0JBU0VfQykKKworLyogMTEgVGVtcG9yYWwgYW5hbHl6ZXIgZmluZ2VyIGluZm8gb25seSAqLworI2RlZmluZSBMT0dfRklOR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxMiBTZWFyY2hlciBwYXRobG9nIGluZm8gKFJldXNlZCBvbGQgU1JDSCBsb2d0eXBlKSAqLworI2RlZmluZSBMT0dfU1JDSF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxMyBQb3NpdGlvbiBhbmQgc3BlZWQgaW5mb3JtYXRpb24gcmVhZCBmcm9tIEVUQUsgKi8KKyNkZWZpbmUgTE9HX0VUQUtfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhEICsgTE9HXzFYX0JBU0VfQykKKworLyogMTQgTWFya292IGZyYW1lIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX01BUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhFICsgTE9HXzFYX0JBU0VfQykKKworLyogMTUgTmV3IGFuZCBpbXByb3ZlZCB0ZW1wb3JhbCBhbmFseXplciBzZWFyY2hlciBpbmZvICovCisjZGVmaW5lIExPR19TUkNIMl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RiArIExPR18xWF9CQVNFX0MpCisKKy8qIDE2IFRoZSBGdWppdHN1IGhhbmRzZXQgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0hBTkRTRVRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMCArIExPR18xWF9CQVNFX0MpCisKKy8qIDE3IFZvY29kZXIgYml0IGVycm9yIHJhdGUgbWFzayAqLworI2RlZmluZSBMT0dfRVJSTUFTS19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDExICsgTE9HXzFYX0JBU0VfQykKKworLyogMTggQW5hbG9nIHZvaWNlIGNoYW5uZWwgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0FOQUxPR19JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMiArIExPR18xWF9CQVNFX0MpCisKKy8qIDE5IEFjY2VzcyBwcm9iZSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfQUNDX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEzICsgTE9HXzFYX0JBU0VfQykKKworLyogMjAgUG9zaXRpb24gJiBzcGVlZCBpbmZvIHJlYWQgZnJvbSBHUFMgcmVjZWl2ZXIgKi8KKyNkZWZpbmUgTE9HX0dQU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNCArIExPR18xWF9CQVNFX0MpCisKKy8qIDIxIFRlc3QgQ29tbWFuZCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfVEVTVF9DTURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE1ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjIgU3BhcnNlICgyMG1zKSBBR0MgLyBjbG9zZWQgbG9vcCBwb3dlciBjb250cm9sIGVudHJ5ICovCisjZGVmaW5lIExPR19TX0FHQ19QQ1RMX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMyBOb3RpZmljYXRpb24gb2YgYSBiYW5kIGNsYXNzIGNoYW5nZSAqLworI2RlZmluZSBMT0dfQkFORF9DSEFOR0VfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE3ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjQgRE0gZGVidWcgbWVzc2FnZXMsIGlmIGJlaW5nIGxvZ2dlZCB2aWEgbG9nIHNlcnZpY2VzICovCisjZGVmaW5lIExPR19EQkdfTVNHX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTggKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyNSBHZW5lcmFsIHRlbXBvcmFsIGFuYWx5emVyIGVudHJ5ICovCisjZGVmaW5lIExPR19HRU5STF9UQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyNiBHZW5lcmFsIHRlbXBvcmFsIGFuYWx5emVyIHcvc3VwcGxlbWVudGFsIGNoYW5uZWxzICovCisjZGVmaW5lIExPR19HRU5STF9UQV9TVVBfQ0hfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGZWF0dXJpemF0aW9uIFJlbW92YWwgcmVxdWVzdGVkIGJ5IENNSQorICAgI2lmZGVmIEZFQVRVUkVfUExUCisgKi8KKworLyogMjcgRGVjb2RlciByYXcgYml0cyBsb2dnaW5nICovCisjZGVmaW5lIExPR19QTFRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGZWF0dXJpemF0aW9uIFJlbW92YWwgcmVxdWVzdGVkIGJ5IENNSQorICAgI2Vsc2UKKyAgIDI3IEVGUyBVc2FnZSBJbmZvIC0gTm8gaW1wbGVtZW50YXRpb24gYXMgeWV0CisgICAjZGVmaW5lIExPR19FRlNfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUIgKyBMT0dfMVhfQkFTRV9DKQorICAgI2VuZGlmCisgKi8KKworLyogMjggQW5hbG9nIEZvcndhcmQgQ2hhbm5lbCAqLworI2RlZmluZSBMT0dfQU5BTE9HX0ZPUldfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFDICsgTE9HXzFYX0JBU0VfQykKKworLyogMjkgQW5hbG9nIFJldmVyc2UgQ2hhbm5lbCAqLworI2RlZmluZSBMT0dfQU5BTE9HX1JFVlNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFEICsgTE9HXzFYX0JBU0VfQykKKworLyogMzAgQW5hbG9nIEhhbmRvZmYgRW50cnkgKi8KKyNkZWZpbmUgTE9HX0FOQUxPR19IQU5ET0ZGX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxRSArIExPR18xWF9CQVNFX0MpCisKKy8qIDMxIEZNIFNsb3QgU3RhdGlzdGlzIGVudHJ5ICovCisjZGVmaW5lIExPR19BTkFMT0dfRk1TTE9UX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzMiBGT0NDIFdvcmQgU3luYyBDb3VudCBlbnRyeSAqLworI2RlZmluZSBMT0dfQU5BTE9HX1dTX0NPVU5UX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwICsgTE9HXzFYX0JBU0VfQykKKworLyogMzMgKi8KKyNkZWZpbmUgTE9HX1JMUF9QQUNLRVRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMSArIExPR18xWF9CQVNFX0MpCisKKy8qIDM0ICovCisjZGVmaW5lIExPR19BU1lOQ19UQ1BfU0VHX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNSAqLworI2RlZmluZSBMT0dfUEFDS0VUX0RBVEFfSVBfUEFDS0VUU19DICAgICAgICAgICAgICAgICAgICgweDIzICsgTE9HXzFYX0JBU0VfQykKKworLyogMzYgKi8KKyNkZWZpbmUgTE9HX0ZOQkRUX01FU1NBR0VfTE9HX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNCArIExPR18xWF9CQVNFX0MpCisKKy8qIEJlZ2luIElTLTIwMDAgTE9HIGZlYXR1cmVzICovCisKKy8qIDM3IFJMUCBSWCBGcmFtZXMgbG9nZ2luZyAqLworI2RlZmluZSBMT0dfUkxQX1JYX0ZSQU1FU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDI1ICsgTE9HXzFYX0JBU0VfQykKKworLyogMzggUkxQIFRYIEZyYW1lcyBsb2dnaW5nICovCisjZGVmaW5lIExPR19STFBfVFhfRlJBTUVTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzOSBSZXNlcnZlZCBmb3IgYWRkaXRpb25zIHRvIFJMUCBmcmFtZXMgKi8KKyNkZWZpbmUgTE9HX1JMUF9SU1ZEMV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNyArIExPR18xWF9CQVNFX0MpCisKKy8qIDQwIFJlc2VydmVkIGZvciBhZGRpdGlvbnMgdG8gUkxQIGZyYW1lcyAqLworI2RlZmluZSBMT0dfUkxQX1JTVkQyX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDI4ICsgTE9HXzFYX0JBU0VfQykKKworLyogNDEgRm9yd2FyZCBMaW5rIEZyYW1lIFR5cGVzIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX0ZXRF9GUkFNRV9UWVBFU19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyOSArIExPR18xWF9CQVNFX0MpCisKKy8qIDQyIFJldmVyc2UgTGluayBGcmFtZSBUeXBlcyBsb2dnaW5nICovCisjZGVmaW5lIExPR19SRVZfRlJBTUVfVFlQRVNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MkEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA0MyBGYXN0IEZvcndhcmQgUG93ZXIgQ29udHJvbCBQYXJhbWV0ZXJzIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX0ZGV0RfUENUUkxfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyQiArIExPR18xWF9CQVNFX0MpCisKKy8qIDQ0IFJldmVyc2UgUG93ZXIgQ29udHJvbCBQYXJhbWV0ZXJzIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX1JFVl9QQ1RSTF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyQyArIExPR18xWF9CQVNFX0MpCisKKy8qIDQ1IFNlYXJjaGVyIGFuZCBGaW5nZXIgSW5mb3JtYXRpb24gbG9nZ2luZyAqLworI2RlZmluZSBMT0dfU1JDSF9GSU5HX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDJEICsgTE9HXzFYX0JBU0VfQykKKworLyogNDYgU2VydmljZSBDb25maWd1cmF0aW9uIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX1NWQ19DT05GSUdfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyRSArIExPR18xWF9CQVNFX0MpCisKKy8qIDQ3IEFjdGl2ZSBTZXQgQ29uZmlndXJhdGlvbiBsb2dnaW5nICovCisjZGVmaW5lIExPR19BU0VUX0NPTkZJR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MkYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA0OCBRdWljayBQYWdpbmcgQ2hhbm5lbCBsb2dnaW5nICovCisjZGVmaW5lIExPR19RUENIX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA0OSBSTFAgU3RhdGlzdGljcyBsb2dnaW5nICovCisjZGVmaW5lIExPR19STFBfU1RBVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA1MCBTaW1wbGUgVGVzdCBEYXRhIFNlcnZpY2UgT3B0aW9uIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX1NURFNPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMiArIExPR18xWF9CQVNFX0MpCisKKy8qIDUxIFBpbG90IFBoYXNlIE1lYXN1cmVtZW50IHJlc3VsdHMgbG9nZ2luZyAqLworI2RlZmluZSBMT0dfU1JDSF9QUE1fUkVTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMzICsgTE9HXzFYX0JBU0VfQykKKworLyogNTIgUGlsb3QgUGhhc2UgTWVhc3VyZW1lbnQgRGF0YSBCYXNlIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX1NSQ0hfUFBNX0RCX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNCArIExPR18xWF9CQVNFX0MpCisKKy8qIDUzIFBpbG90IFBoYXNlIE1lYXN1cmVtZW50IHNlYXJjaCByZXN1bHRzIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX1NSQ0hfUFBNX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNSArIExPR18xWF9CQVNFX0MpCisKKy8qIDU0IElTLTgwMSBmb3J3YXJkIGxpbmsgbWVzc2FnZSAqLworI2RlZmluZSBMT0dfR1BTX0ZXRF9NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM2ICsgTE9HXzFYX0JBU0VfQykKKworLyogNTUgSVMtODAxIHJldmVyc2UgbGluayBtZXNzYWdlICovCisjZGVmaW5lIExPR19HUFNfUkVWX01TR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA1NiBHUFMgc2VhcmNoIHNlc3Npb24gc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfR1BTX1NUQVRTX01TR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM4ICsgTE9HXzFYX0JBU0VfQykKKworLyogNTcgR1BTIHNlYXJjaCByZXN1bHRzICovCisjZGVmaW5lIExPR19HUFNfU1JDSF9QRUFLU19NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4MzkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA1OCBGYWN0b3J5IFRlc3Rtb2RlIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX0ZUTV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQSArIExPR18xWF9CQVNFX0MpCisKKy8qIDU5IE11bHRpcGxlIFBlYWsgTG9nZ2luZyAqLworI2RlZmluZSBMT0dfU1JDSF9HUFNfTVVMVElfUEVBS1NfSU5GT19DICAgICAgICAgICAgICAgICgweDNCICsgTE9HXzFYX0JBU0VfQykKKworLyogNjAgUG9zdCBwcm9jZXNzZWQgc2VhcmNoIHJlc3VsdHMgbG9ncyAqLworI2RlZmluZSBMT0dfU1JDSF9HUFNfUE9TVF9QUk9DX0MgICAgICAgICAgICAgICAgICAgICAgICgweDNDICsgTE9HXzFYX0JBU0VfQykKKworLyogNjEgRlVMTCBUZXN0IERhdGEgU2VydmljZSBPcHRpb24gbG9nZ2luZyAqLworI2RlZmluZSBMT0dfRlREU09fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNEICsgTE9HXzFYX0JBU0VfQykKKworLyogNjIgQmx1ZXRvb3RoIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX0JUX1JFU0VSVkVEX0NPREVTX0JBU0VfQyAgICAgICAgICAgICAgICAgICAoMHgzRSArIExPR18xWF9CQVNFX0MpCisvKiBLZWVwIGNvbmZ1c2luZyBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gICovCisjZGVmaW5lIExPR19CVF9CQVNFX0MgTE9HX0JUX1JFU0VSVkVEX0NPREVTX0JBU0VfQworCisvKiA5MiBCbHVldG9vdGgncyBsYXN0IGxvZyBjb2RlICovCisjZGVmaW5lIExPR19CVF9MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwICsgTE9HX0JUX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworLyogOTMgSERSIGxvZyBjb2RlcyAqLworI2RlZmluZSBMT0dfSERSX1JFU0VSVkVEX0NPREVTX0JBU0VfQyAgICAgICAgICAgICAgICAgICgweDVEICsgTE9HXzFYX0JBU0VfQykKKy8qIEtlZXAgY29uZnVzaW5nIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgKi8KKyNkZWZpbmUgTE9HX0hEUl9CQVNFX0MgTE9HX0hEUl9SRVNFUlZFRF9DT0RFU19CQVNFX0MKKworLyogMTQzIGlzIEhEUidzIGxhc3QgbG9nIGNvZGUgKi8KKyNkZWZpbmUgTE9HX0hEUl9MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNTAgKyBMT0dfSERSX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworLyogMTQ0IElTMjAwMCBEQ0NIIEZvcndhcmQgbGluayBjaGFubmVsICovCisjZGVmaW5lIExPR19GT1JfRENDSF9NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OTAgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfRENDSF9GV0RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19GT1JfRENDSF9NU0dfQworCisvKiAxNDUgSVMyMDAwIERDQ0ggRm9yd2FyZCBsaW5rIGNoYW5uZWwgKi8KKyNkZWZpbmUgTE9HX1JFVl9EQ0NIX01TR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg5MSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19EQ0NIX1JFVl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HX1JFVl9EQ0NIX01TR19DCisKKy8qIDE0NiBJUzIwMDAgRENDSCBGb3J3YXJkIGxpbmsgY2hhbm5lbCAqLworI2RlZmluZSBMT0dfWlJFWF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDkyICsgTE9HXzFYX0JBU0VfQykKKworLyogMTQ3IEFjdGl2ZSBzZXQgaW5mbyBsb2dnaW5nLCBzaW1pbGFyIHRvIEFTRVRfQ09ORklHLCBidXQgc2ltcGxlci4gICovCisjZGVmaW5lIExPR19BU0VUX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OTMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxNDggUGlsb3QgUGhhc2UgTWVhc3VyZW1lbnQgZm91ci1zaG91bGRlci1zZWFyY2ggcmVzdXRsdHMgbG9nZ2luZyAqLworI2RlZmluZSBMT0dfU1JDSF9QUE1fNFNIT1VMREVSX1JFU19DICAgICAgICAgICAgICAgICAgICgweDk0ICsgTE9HXzFYX0JBU0VfQykKKworLyogMTQ5IEV4dGVuZGVkIFBpbG90IFBoYXNlIE1lYXN1cmVtZW50IERhdGEgQmFzZSBsb2dnaW5nICovCisjZGVmaW5lIExPR19TUkNIX0VYVF9QUE1fREJfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OTUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxNTAgR1BTIFZpc2l0IFBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgTE9HX0dQU19WSVNJVF9QQVJBTUVURVJTX0MgICAgICAgICAgICAgICAgICAgICAoMHg5NiArIExPR18xWF9CQVNFX0MpCisKKy8qIDE1MSBHUFMgTWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgTE9HX0dQU19NRUFTVVJFTUVOVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg5NyArIExPR18xWF9CQVNFX0MpCisKKy8qIDE1MiBVSU0gRGF0YSAqLworI2RlZmluZSBMT0dfVUlNX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDk4ICsgTE9HXzFYX0JBU0VfQykKKworLyogMTUzIFNURFNPIHBsdXMgUDIgKi8KKyNkZWZpbmUgTE9HX1NURFNPX1AyX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg5OSArIExPR18xWF9CQVNFX0MpCisKKy8qIDE1NCBGVERTTyBwbHVzIFAyICovCisjZGVmaW5lIExPR19GVERTT19QMl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OUEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxNTUgU2VhcmNoIFBQTSBTdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19TUkNIX1BQTV9TVEFUU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OUIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxNTYgUFBQIFR4IEZyYW1lcyAqLworI2RlZmluZSBMT0dfUFBQX1RYX0ZSQU1FU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDlDICsgTE9HXzFYX0JBU0VfQykKKworLyogMTU3IFBQUCBSeCBGcmFtZXMgKi8KKyNkZWZpbmUgTE9HX1BQUF9SWF9GUkFNRVNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg5RCArIExPR18xWF9CQVNFX0MpCisKKy8qIDE1OC0xODcgU1NMIHJlc2VydmVkIGxvZyBjb2RlcyAqLworI2RlZmluZSBMT0dfU1NMX1JFU0VSVkVEX0NPREVTX0JBU0VfQyAgICAgICAgICAgICAgICAgICgweDlFICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1NTTF9MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjkgKyBMT0dfU1NMX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworLyogMTg4LTE5OSBQdW1hIHJlc2VydmVkIGxvZyBjb2RlcyAqLworLyogMTg4IFFQQ0gsIHZlcnNpb24gMiAqLworI2RlZmluZSBMT0dfUVBDSF9WRVJfMl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEJDICsgTE9HXzFYX0JBU0VfQykKKworLyogMTg5IEVuaGFuY2VkIEFjY2VzcyBQcm9iZSAqLworI2RlZmluZSBMT0dfRUFfUFJPQkVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEJEICsgTE9HXzFYX0JBU0VfQykKKworLyogMTkwIEJDQ0ggRnJhbWUgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0JDQ0hfRlJBTUVfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhCRSArIExPR18xWF9CQVNFX0MpCisKKy8qIDE5MSBGQ0NDSCBGcmFtZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRkNDQ0hfRlJBTUVfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICgweEJGICsgTE9HXzFYX0JBU0VfQykKKworLyogMTkyIEZEQ0ggRnJhbWUgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZEQ0hfRlJBTUVfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhDMCArIExPR18xWF9CQVNFX0MpCisKKy8qIDE5MyBSRENIIEZyYW1lIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19SRENIX0ZSQU1FX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QzEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxOTQgRkZQQyBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRkZQQ19JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEMyICsgTE9HXzFYX0JBU0VfQykKKworLyogMTk1IFJQQyBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfUlBDX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEMzICsgTE9HXzFYX0JBU0VfQykKKworLyogMTk2IFNlYXJjaGVyIGFuZCBGaW5nZXIgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1NSQ0hfRklOR19JTkZPX1ZFUl8yX0MgICAgICAgICAgICAgICAgICAgICAoMHhDNCArIExPR18xWF9CQVNFX0MpCisKKy8qIDE5NyBTZXJ2aWNlIENvbmZpZ3VyYXRpb24sIHZlcnNpb24gMiAqLworI2RlZmluZSBMT0dfU1JWX0NPTkZJR19WRVJfMl9DICAgICAgICAgICAgICAgICAgICAgICAgICgweEM1ICsgTE9HXzFYX0JBU0VfQykKKworLyogMTk4IEFjdGl2ZSBTZXQgSW5mb3JtYXRpb24sIHZlcnNpb24gMiAqLworI2RlZmluZSBMT0dfQVNFVF9JTkZPX1ZFUl8yX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweEM2ICsgTE9HXzFYX0JBU0VfQykKKworLyogMTk5IFJlZHVjZWQgQWN0aXZlIFNldCAqLworI2RlZmluZSBMT0dfUkVEVUNFRF9BU0VUX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICgweEM3ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjAwIFNlYXJjaCBUcmlhZ2UgSW5mbyAqLworI2RlZmluZSBMT0dfU1JDSF9UUklBR0VfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICgweEM4ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjAxIFJEQSBGcmFtZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfUkRBX0ZSQU1FX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEM5ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjAyIGdwc09uZSBmYXRwYXRoIGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19HUFNfRkFUUEFUSF9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4Q0EgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMDMgRXh0ZW5kZWQgQUdDICovCisjZGVmaW5lIExPR19FWFRFTkRFRF9BR0NfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4Q0IgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMDQgVHJhbnNtaXQgQUdDICovCisjZGVmaW5lIExPR19UUkFOU01JVF9BR0NfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4Q0MgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMDUgSS9RIE9mZnNldCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE9HX0lRX09GRlNFVF9SRUdJU1RFUlNfQyAgICAgICAgICAgICAgICAgICAgICAoMHhDRCArIExPR18xWF9CQVNFX0MpCisKKy8qIDIwNiBEQUNDIEkvUSBBY2N1bXVsYXRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE9HX0RBQ0NfSVFfQUNDVU1VTEFUT1JfQyAgICAgICAgICAgICAgICAgICAgICAoMHhDRSArIExPR18xWF9CQVNFX0MpCisKKy8qIDIwNyBSZWdpc3RlciBwb2xsaW5nIHJlc3VsdHMgKi8KKyNkZWZpbmUgTE9HX1JFR0lTVEVSX1BPTExJTkdfUkVTVUxUU19DICAgICAgICAgICAgICAgICAoMHhDRiArIExPR18xWF9CQVNFX0MpCisKKy8qIDIwOCBTeXN0ZW0gYXJiaXRyYXRpb24gbW9kdWxlICovCisjZGVmaW5lIExPR19BVF9TQU1fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RDAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMDkgRGlhYmxvIHNlYXJjaGVyIGZpbmdlciBsb2cgKi8KKyNkZWZpbmUgTE9HX0RJQUJMT19TUkNIX0ZJTkdfSU5GT19DICAgICAgICAgICAgICAgICAgICAoMHhEMSArIExPR18xWF9CQVNFX0MpCisKKy8qIDIxMCBsb2cgcmVzZXJ2ZWQgZm9yIGRhbmRydXMgKi8KKyNkZWZpbmUgTE9HX1NEMjBfTEFTVF9BQ1RJT05fQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHhEMiArIExPR18xWF9CQVNFX0MpCisKKy8qIDIxMSBsb2cgcmVzZXJ2ZWQgZm9yIGRhbmRydXMgKi8KKyNkZWZpbmUgTE9HX1NEMjBfTEFTVF9BQ1RJT05fSFlCUklEX0MgICAgICAgICAgICAgICAgICAoMHhEMyArIExPR18xWF9CQVNFX0MpCisKKy8qIDIxMiBsb2cgcmVzZXJ2ZWQgZm9yIGRhbmRydXMgKi8KKyNkZWZpbmUgTE9HX1NEMjBfU1NfT0JKRUNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhENCArIExPR18xWF9CQVNFX0MpCisKKy8qIDIxMyBsb2cgcmVzZXJ2ZWQgZm9yIGRhbmRydXMgKi8KKyNkZWZpbmUgTE9HX1NEMjBfU1NfT0JKRUNUX0hZQlJJRF9DICAgICAgICAgICAgICAgICAgICAoMHhENSArIExPR18xWF9CQVNFX0MpCisKKy8qIDIxNCBsb2cgcmVzZXJ2ZWQgZm9yIGpwaW5vcyAqLworI2RlZmluZSBMT0dfQkNDSF9TSUdOQUxJTkdfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEQ2ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjE1IGxvZyByZXNlcnZlZCBmb3IganBpbm9zICovCisjZGVmaW5lIExPR19SRUFDSF9TSUdOQUxJTkdfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RDcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMTYgbG9nIHJlc2VydmVkIGZvciBqcGlub3MgKi8KKyNkZWZpbmUgTE9HX0ZDQ0NIX1NJR05BTElOR19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhEOCArIExPR18xWF9CQVNFX0MpCisKKy8qIDIxNyBSREEgRnJhbWUgSW5mb3JtYXRpb24gMiAqLworI2RlZmluZSBMT0dfUkRBX0ZSQU1FX0lORk9fMl9DICAgICAgICAgICAgICAgICAgICAgICAgICgweEQ5ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjE4ICovCisjZGVmaW5lIExPR19HUFNfQklUX0VER0VfUkVTVUxUU19DICAgICAgICAgICAgICAgICAgICAgKDB4REEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMTkgKi8KKyNkZWZpbmUgTE9HX1BFX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhEQiArIExPR18xWF9CQVNFX0MpCisKKy8qIDIyMCAqLworI2RlZmluZSBMT0dfUEVfUEFSVElBTF9EQVRBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweERDICsgTE9HXzFYX0JBU0VfQykKKworLyogMjIxICovCisjZGVmaW5lIExPR19HUFNfU0lOR0xFX1BFQUtfU1JDSF9SRVNVTFRTX0MgICAgICAgICAgICAgKDB4REQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMjIgKi8KKyNkZWZpbmUgTE9HX1NSQ0g0X1NBTVBSQU1fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhERSArIExPR18xWF9CQVNFX0MpCisKKy8qIDIyMyAqLworI2RlZmluZSBIRFJfQU5fUFBQX1RYX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweERGICsgTE9HXzFYX0JBU0VfQykKKworLyogMjI0ICovCisjZGVmaW5lIEhEUl9BTl9QUFBfUlhfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RTAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMjUgKi8KKyNkZWZpbmUgTE9HX0dQU19TQ0hFRFVMRVJfVFJBQ0VfQyAgICAgICAgICAgICAgICAgICAgICAoMHhFMSArIExPR18xWF9CQVNFX0MpCisKKy8qIDIyNiAqLworI2RlZmluZSBMT0dfTVBFRzRfWVVWX0ZSQU1FX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweEUyICsgTE9HXzFYX0JBU0VfQykKKworLyogMjI3ICovCisjZGVmaW5lIExPR19NUEVHNF9DTElQX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RTMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMjggKi8KKyNkZWZpbmUgTE9HX01QRUc0X0NMSVBfU1RBVFNfVkVSMl9DICAgICAgICAgICAgICAgICAgICAoMHhFNCArIExPR18xWF9CQVNFX0MpCisKKy8qIDIyNi0yNDEgTU1FRyByZXNlcnZlZC4gKi8KKyNkZWZpbmUgTE9HX01QRUdfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAgICAoMHhGMSArIExPR18xWF9CQVNFX0MpCisKKy8qIDI0Mi0yNzQgQlJFVyByZXNlcnZlZCBsb2cgcmFuZ2UgKi8KKyNkZWZpbmUgTE9HX0JSRVdfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAgICAoMHhGMiArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19CUkVXX0xBU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMyICsgTE9HX0JSRVdfUkVTRVJWRURfQ09ERVNfQkFTRV9DKQorCisvKiAyNzUtMzM5IFBQUCBFeHRlbmRlZCBGcmFtZXMgKi8KKyNkZWZpbmUgTE9HX1BQUF9GUkFNRVNfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAoMHgxMTMgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFBQX0ZSQU1FU19MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICg2NCArIExPR19QUFBfRlJBTUVTX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworI2RlZmluZSBMT0dfUFBQX0VYVF9GUkFNRURfUlhfVU1fQyAgICAgICAgICAgICAgICAgICAgICgweDExMyArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QUFBfRVhUX0ZSQU1FRF9SWF9STV9DICAgICAgICAgICAgICAgICAgICAgKDB4MTE0ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BQUF9FWFRfRlJBTUVEX1JYX0FOX0MgICAgICAgICAgICAgICAgICAgICAoMHgxMTUgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19QUFBfRVhUX0ZSQU1FRF9UWF9VTV9DICAgICAgICAgICAgICAgICAgICAgKDB4MTIzICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BQUF9FWFRfRlJBTUVEX1RYX1JNX0MgICAgICAgICAgICAgICAgICAgICAoMHgxMjQgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFBQX0VYVF9GUkFNRURfVFhfQU5fQyAgICAgICAgICAgICAgICAgICAgICgweDEyNSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1BQUF9FWFRfVU5GUkFNRURfUlhfVU1fQyAgICAgICAgICAgICAgICAgICAoMHgxMzMgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFBQX0VYVF9VTkZSQU1FRF9SWF9STV9DICAgICAgICAgICAgICAgICAgICgweDEzNCArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QUFBfRVhUX1VORlJBTUVEX1JYX0FOX0MgICAgICAgICAgICAgICAgICAgKDB4MTM1ICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfUFBQX0VYVF9VTkZSQU1FRF9UWF9VTV9DICAgICAgICAgICAgICAgICAgICgweDE0MyArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QUFBfRVhUX1VORlJBTUVEX1RYX1JNX0MgICAgICAgICAgICAgICAgICAgKDB4MTQ0ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BQUF9FWFRfVU5GUkFNRURfVFhfQU5fQyAgICAgICAgICAgICAgICAgICAoMHgxNDUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNDAgTE9HX1BFX0RBVEFfRVhUX0MgKi8KKyNkZWZpbmUgTE9HX1BFX0RBVEFfRVhUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNTQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSRVggU3Vic3lzdGVtIGxvZ3MgKi8KKyNkZWZpbmUgTE9HX01FTURFQlVHX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNTUgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfU1lTUFJPRklMRV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE1NiArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19UQVNLUFJPRklMRV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTU3ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX0NPUkVEVU1QX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNTggKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNDEtMzQ5IFJFWCBzdWJzeXN0ZW0gbG9ncyAqLworI2RlZmluZSBMT0dfUkVYX1JFU0VSVkVEX0NPREVTX0JBU0VfQyAgICAgICAgICAgICAgICAgICgweDE1NSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19SRVhfTEFTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDggKyBMT0dfUkVYX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworLyogMzUwIExPR19QRV9QQVJUSUFMX0RBVEFfRVhUX0MgKi8KKyNkZWZpbmUgTE9HX1BFX1BBUlRJQUxfREFUQV9FWFRfQyAgICAgICAgICAgICAgICAgICAgICAoMHgxNUUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNTEgTE9HX0RJQUdfU1RSRVNTX1RFU1RfQyAqLworI2RlZmluZSBMT0dfRElBR19TVFJFU1NfVEVTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDE1RiArIExPR18xWF9CQVNFX0MpCisKKy8qIDM1MiAgTE9HX1dNU19SRUFEX0MgKi8KKyNkZWZpbmUgTE9HX1dNU19SRUFEX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNjAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNTMgU2VhcmNoIFRyaWFnZSBJbmZvIFZlcnNpb24gMiAqLworI2RlZmluZSBMT0dfU1JDSF9UUklBR0VfSU5GTzJfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNjEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNTQgUkxQIFJ4IEZEQ0ggRnJhbWVzICovCisjZGVmaW5lIExPR19STFBfUlhfRkRDSF9GUkFNRVNfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDE2MiArIExPR18xWF9CQVNFX0MpCisKKy8qIDM1NSBSTFAgVHggRkRDSCBGcmFtZXMgKi8KKyNkZWZpbmUgTE9HX1JMUF9UWF9GRENIX0ZSQU1FU19DICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTYzICsgTE9HXzFYX0JBU0VfQykKKworLyogMzU2LTM3MSBRVFYgc3Vic3lzdGVtIGxvZ3MgKi8KKyNkZWZpbmUgTE9HX1FUVl9SRVNFUlZFRF9DT0RFU19CQVNFX0MgICAgICAgICAgICAgICAgICAgKDB4MTY0ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE1ICsgTE9HX1FUVl9SRVNFUlZFRF9DT0RFU19CQVNFX0MpCisKKy8qIDM3MiBTZWFyY2hlciA0IDFYICovCisjZGVmaW5lIExPR19TUkNINF8xWF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE3NCArIExPR18xWF9CQVNFX0MpCisKKy8qIDM3MyBTZWFyY2hlciBzbGVlcCBzdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19TUkNIX1NMRUVQX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE3NSArIExPR18xWF9CQVNFX0MpCisKKy8qIDM3NCBTZXJ2aWNlIENvbmZpZ3VyYXRpb24sIHZlcnNpb24gMyAqLworI2RlZmluZSBMT0dfU1JWX0NPTkZJR19WRVJfM19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNzYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNzUgU2VhcmNoZXIgNCBIRFIgKi8KKyNkZWZpbmUgTE9HX1NSQ0g0X0hEUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTc3ICsgTE9HXzFYX0JBU0VfQykKKworLyogMzc2IFNlYXJjaGVyIDQgQUZMVCAqLworI2RlZmluZSBMT0dfU1JDSDRfQUZMVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNzggKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNzcgRW5oYW5jZWQgRmluZ2VyIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19FTkhfRklOR19JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE3OSArIExPR18xWF9CQVNFX0MpCisKKy8qIDM3OCBEViBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRFZfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxN0EgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNzkgV01TIHNldCByb3V0ZXMgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1dNU19TRVRfUk9VVEVTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTdCICsgTE9HXzFYX0JBU0VfQykKKworLyogMzgwIEZUTSBWZXJzaW9uIDIgTG9ncyAqLworI2RlZmluZSBMT0dfRlRNX1ZFUl8yX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxN0MgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzODEgR1BTIE11bHRpcGVhayBsb2dnaW5nICovCisjZGVmaW5lIExPR19TUkNIX0dQU19NVUxUSV9QRUFLU19TSU1QTElGSUVEX0lORk9fQyAgICAgICgweDE3RCArIExPR18xWF9CQVNFX0MpCisKKy8qIDM4MiBHUFMgTXVsdGlwZWFrIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX1NSQ0hfR1BTX01VTFRJX1BFQUtTX1ZFUkJPU0VfSU5GT19DICAgICAgICAgKDB4MTdFICsgTE9HXzFYX0JBU0VfQykKKworLyogMzgzLTQwMyBIRFIgcmVzZXJ2ZWQgbG9ncyAqLworI2RlZmluZSBMT0dfSERSX1JFU0VSVkVEX0NPREVTX0JBU0VfMl9DICAgICAgICAgICAgICAgICAoMHgxN0YgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfSERSX0xBU1RfMl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjAgKyBMT0dfSERSX1JFU0VSVkVEX0NPREVTX0JBU0VfMl9DKQorCisvKiBSTFAgUnggLSBQRENIIHBhcnRpYWwgTXV4UERVNSBmcmFtZXMgKi8KKyNkZWZpbmUgTE9HX1JMUF9SWF9QRENIX1BBUlRJQUxfTVVYUERVNV9GUkFNRVNfQyAgICAgICAgKDB4MTk0ICsgTE9HXzFYX0JBU0VfQykKKworLyogUkxQIFR4IC0gUERDSCBwYXJ0aWFsIE11eFBEVTUgZnJhbWVzICovCisjZGVmaW5lIExPR19STFBfVFhfUERDSF9QQVJUSUFMX01VWFBEVTVfRlJBTUVTX0MgICAgICAgICgweDE5NSArIExPR18xWF9CQVNFX0MpCisKKy8qIFJMUCBSeCBpbnRlcm5hbCBkZXRhaWxzICovCisjZGVmaW5lIExPR19STFBfUlhfSU5URVJOQUxfREVUQUlMU19DICAgICAgICAgICAgICAgICAgICgweDE5NiArIExPR18xWF9CQVNFX0MpCisKKy8qIFJMUCBUeCBpbnRlcm5hbCBkZXRhaWxzICovCisjZGVmaW5lIExPR19STFBfVFhfSU5URVJOQUxfREVUQUlMU19DICAgICAgICAgICAgICAgICAgICgweDE5NyArIExPR18xWF9CQVNFX0MpCisKKy8qIE1QRUc0IENsaXAgU3RhdGlzdGljcyB2ZXJzaW9uIDMgKi8KKyNkZWZpbmUgTE9HX01QRUc0X0NMSVBfU1RBVFNfVkVSM19DICAgICAgICAgICAgICAgICAgICAgKDB4MTk4ICsgTE9HXzFYX0JBU0VfQykKKworLyogTW9iaWxlIElQIFBlcmZvcm1hbmNlICovCisjZGVmaW5lIExPR19NT0JJTEVfSVBfUEVSRk9STUFOQ0VfQyAgICAgICAgICAgICAgICAgICAgICgweDE5OSArIExPR18xWF9CQVNFX0MpCisKKy8qIDQxMC00MzAgU2VhcmNoZXIgcmVzZXJ2ZWQgbG9ncyAqLworI2RlZmluZSBMT0dfU0VBUkNIRVJfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAoMHgxOUEgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfU0VBUkNIRVJfTEFTVF8yX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjEgKyBMT0dfU0VBUkNIRVJfUkVTRVJWRURfQ09ERVNfQkFTRV9DKQorCisvKiA0MzItNDgwIFFUViByZXNlcnZlZCBsb2dzICovCisjZGVmaW5lIExPR19RVFYyX1JFU0VSVkVEX0NPREVTX0JBU0VfQyAgICAgICAgICAgICAgICAgICgweDFCMCArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19RVFYyX0xBU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0OCArIExPR19RVFYyX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworI2RlZmluZSBMT0dfUVRWX1BEUzJfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxQjYgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1BEUzJfR0VUX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAoMHgxQjcgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1BEUzJfR0VUX1JFU1BfSEVBREVSICAgICAgICAgICAgICAgICAgICAoMHgxQjggKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1BEUzJfR0VUX1JFU1BfUENLVCAgICAgICAgICAgICAgICAgICAgICAoMHgxQjkgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX0NNWF9BVURJT19JTlBVVF9EQVRBX0MgICAgICAgICAgICAgICAgICAoMHgxQkEgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1JUU1BfT1BUSU9OU19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxQkIgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1JUU1BfR0VUX1BBUkFNRVRFUl9DICAgICAgICAgICAgICAgICAgICAoMHgxQkMgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1JUU1BfU0VUX1BBUkFNRVRFUl9DICAgICAgICAgICAgICAgICAgICAoMHgxQkQgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1ZJREVPX0JJVFNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxQkUgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfQVJNX1ZJREVPX0RFQ09ERV9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAoMHgxQkYgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX0RTUF9TTElDRV9CVUZGRVJfQyAgICAgICAgICAgICAgICAgICAgICAoMHgxQzAgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX0NNRF9MT0dHSU5HX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxQzEgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX0FVRElPX0ZSQU1FX1BUU19JTkZPX0MgICAgICAgICAgICAgICAgICAoMHgxQzIgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1ZJREVPX0ZSQU1FX0RFQ09ERV9JTkZPX0MgICAgICAgICAgICAgICAoMHgxQzMgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1JUQ1BfQ09NUE9VTkRfUlJfQyAgICAgICAgICAgICAgICAgICAgICAoMHgxQzQgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX0ZSQU1FX0JVRkZFUl9SRUxFQVNFX1JFQVNPTl9DICAgICAgICAgICAoMHgxQzUgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX0FVRElPX0NIQU5ORUxfU1dJVENIX0ZSQU1FX0MgICAgICAgICAgICAoMHgxQzYgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1JUUF9ERUNSWVBURURfUEtUX0MgICAgICAgICAgICAgICAgICAgICAoMHgxQzcgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWX1BDUl9EUklGVF9SQVRFX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgxQzggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgUERTTSBsb2dzICovCisjZGVmaW5lIExPR19QRFNNX1BPU0lUSU9OX1JFUE9SVF9DQUxMQkFDS19DICAgICAgICAgICAgICgweDFFMSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QRFNNX1BEX0VWRU5UX0NBTExCQUNLX0MgICAgICAgICAgICAgICAgICAgICgweDFFMiArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QRFNNX1BBX0VWRU5UX0NBTExCQUNLX0MgICAgICAgICAgICAgICAgICAgICgweDFFMyArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QRFNNX05PVElGWV9WRVJJRllfUkVRVUVTVF9DICAgICAgICAgICAgICAgICgweDFFNCArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QRFNNX1JFU0VSVkVEMV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFFNSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QRFNNX1JFU0VSVkVEMl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFFNiArIExPR18xWF9CQVNFX0MpCisKKy8qIFNlYXJjaGVyIERlbW9kdWxhdGlvbiBTdGF0dXMgbG9nICovCisjZGVmaW5lIExPR19TUkNIX0RFTU9EX1NUQVRVU19DICAgICAgICAgICAgICAgICAgICAgICAgICgweDFFNyArIExPR18xWF9CQVNFX0MpCisKKy8qIFNlYXJjaGVyIENhbGwgU3RhdGlzdGljcyBsb2cgKi8KKyNkZWZpbmUgTE9HX1NSQ0hfQ0FMTF9TVEFUSVNUSUNTX0MgICAgICAgICAgICAgICAgICAgICAgKDB4MUU4ICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIE1TLU1QQyBGb3J3YXJkIGxpbmsgKi8KKyNkZWZpbmUgTE9HX01TX01QQ19GV0RfTElOS19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUU5ICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIE1TLU1QQyBSZXZlcnNlIGxpbmsgKi8KKyNkZWZpbmUgTE9HX01TX01QQ19SRVZfTElOS19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUVBICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgRGF0YSAqLworI2RlZmluZSBMT0dfREFUQV9QUk9UT0NPTF9MT0dHSU5HX0MgICAgICAgICAgICAgICAgICAgICAoMHgxRUIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBNZWRpYUZMTyByZXNlcnZlZCBsb2cgY29kZXMgKi8KKyNkZWZpbmUgTE9HX01GTE9fUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAgICAgKDB4MUVDICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX01GTE9fTEFTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDk5ICsgTE9HX01GTE9fUkVTRVJWRURfQ09ERVNfQkFTRV9DKQorCisvKiBHUFMgZGVtb2R1bGF0aW9uIHRyYWNraW5nIGhlYWRlciBpbmZvICovCisjZGVmaW5lIExPR19HUFNfREVNT0RfVFJBQ0tJTkdfSEVBREVSX0MgICAgICAgICAgICAgICAgICgweDI1MCArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBkZW1vZHVsYXRpb24gdHJhY2tpbmcgcmVzdWx0cyAqLworI2RlZmluZSBMT0dfR1BTX0RFTU9EX1RSQUNLSU5HX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNTEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgYml0IGVkZ2UgbG9ncyBmcm9tIGRlbW9kIHRyYWNraW5nICovCisjZGVmaW5lIExPR19HUFNfREVNT0RfQklUX0VER0VfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDI1MiArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBkZW1vZHVsYXRpb24gc29mdCBkZWNpc2lvbnMgKi8KKyNkZWZpbmUgTE9HX0dQU19ERU1PRF9TT0ZUX0RFQ0lTSU9OU19DICAgICAgICAgICAgICAgICAgKDB4MjUzICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIHBvc3QtcHJvY2Vzc2VkIGRlbW9kIHRyYWNraW5nIHJlc3VsdHMgKi8KKyNkZWZpbmUgTE9HX0dQU19ERU1PRF9UUkFDS0lOR19QT1NUX1BST0NfQyAgICAgICAgICAgICAgKDB4MjU0ICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIHN1YmZyYW1lIGxvZyAqLworI2RlZmluZSBMT0dfR1BTX0RFTU9EX1NVQkZSQU1FX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNTUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGLUNQQ0NIIFF1YWxpdHkgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZfQ1BDQ0hfUVVBTElUWV9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgKDB4MjU2ICsgTE9HXzFYX0JBU0VfQykKKworLyogUmV2ZXJzZSBQRENDSC9QRENIIEZyYW1lIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19SX1BEQ0NIX1JfUERDSF9GUkFNRV9JTkZPX0MgICAgICAgICAgICAgICAgICgweDI1NyArIExPR18xWF9CQVNFX0MpCisKKy8qIEZvcndhcmQgRyBDaGFubmVsIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GX0dDSF9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDI1OCArIExPR18xWF9CQVNFX0MpCisKKy8qIEZvcndhcmQgRyBDaGFubmVsIEZyYW1lIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GX0dDSF9GUkFNRV9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDI1OSArIExPR18xWF9CQVNFX0MpCisKKy8qIEZvcndhcmQgUkMgQ2hhbm5lbCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRl9SQ0NIX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNUEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGb3J3YXJkIEFDSyBDaGFubmVsIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GX0FDS0NIX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDI1QiArIExPR18xWF9CQVNFX0MpCisKKy8qIEZvcndhcmQgQUNLIENoYW5uZWwgQUNLREEgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZfQUNLQ0hfQUNLREFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjVDICsgTE9HXzFYX0JBU0VfQykKKworLyogUmV2ZXJzZSBSRVEgQ2hhbm5lbCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfUl9SRVFDSF9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNUQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTbGVlcCBUYXNrIFN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1NMRUVQX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjVFICsgTE9HXzFYX0JBU0VfQykKKworLyogU2xlZXAgY29udHJvbGxlciBzdGF0aXN0aWNzIDFYICovCisjZGVmaW5lIExPR18xWF9TTEVFUF9DT05UUk9MTEVSX1NUQVRTX0MgICAgICAgICAgICAgICAgICgweDI1RiArIExPR18xWF9CQVNFX0MpCisKKy8qIFNsZWVwIGNvbnRyb2xsZXIgc3RhdGlzdGljcyBIRFIgKi8KKyNkZWZpbmUgTE9HX0hEUl9TTEVFUF9DT05UUk9MTEVSX1NUQVRTX0MgICAgICAgICAgICAgICAgKDB4MjYwICsgTE9HXzFYX0JBU0VfQykKKworLyogU2xlZXAgY29udHJvbGxlciBzdGF0aXN0aWNzIEdTTSAqLworI2RlZmluZSBMT0dfR1NNX1NMRUVQX0NPTlRST0xMRVJfU1RBVFNfQyAgICAgICAgICAgICAgICAoMHgyNjEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTbGVlcCBjb250cm9sbGVyIHN0YXRpc3RpY3MgV0NETUEgKi8KKyNkZWZpbmUgTE9HX1dDRE1BX1NMRUVQX0NPTlRST0xMRVJfU1RBVFNfQyAgICAgICAgICAgICAgKDB4MjYyICsgTE9HXzFYX0JBU0VfQykKKworLyogU2xlZXAgdGFzayBhbmQgY29udHJvbGxlciByZXNlcnZlZCBsb2dzICovCisjZGVmaW5lIExPR19TTEVFUF9BUFBTX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDI2MyArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19TTEVFUF9TVEFUU19SRVNFUlZFRDJfQyAgICAgICAgICAgICAgICAgICAgICgweDI2NCArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19TTEVFUF9TVEFUU19SRVNFUlZFRDNfQyAgICAgICAgICAgICAgICAgICAgICgweDI2NSArIExPR18xWF9CQVNFX0MpCisKKy8qIERWIEluZm9ybWF0aW9uIHBsYWNlaG9sZGVyIGNoYW5uZWwgbG9ncyAqLworI2RlZmluZSBMT0dfUERDQ0hfTE9fU0VMRUNURURfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNjYgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUERDQ0hfSElfU0VMRUNURURfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNjcgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfV0FMU0hfU0VMRUNURURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNjggKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUERDSF9CRV9TRUxFQ1RFRF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNjkgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUERDQ0hfTExSX1NFTEVDVEVEX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNkEgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfQ1FJX0FDS19MT19TRUxFQ1RFRF9DICAgICAgICAgICAgICAgICAgICAgICAoMHgyNkIgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfQ1FJX0FDS19ISV9TRUxFQ1RFRF9DICAgICAgICAgICAgICAgICAgICAgICAoMHgyNkMgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUkxfR0FJTl9TRUxFQ1RFRF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNkQgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUERDQ0gwX1NOREFfU0VMRUNURURfQyAgICAgICAgICAgICAgICAgICAgICAoMHgyNkUgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUERDQ0gxX1NOREFfU0VMRUNURURfQyAgICAgICAgICAgICAgICAgICAgICAoMHgyNkYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA2MjQgV01TIE1lc3NhZ2UgTGlzdCAqLworI2RlZmluZSBMT0dfV01TX01FU1NBR0VfTElTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNzAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA2MjUgTXVsdGltb2RlIEdlbmVyaWMgU0lNIERyaXZlciBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgTE9HX01NX0dFTkVSSUNfU0lNX0RSSVZFUl9DICAgICAgICAgICAgICAgICAgICAgKDB4MjcxICsgTE9HXzFYX0JBU0VfQykKKworLyogNjI2IEdlbmVyaWMgU0lNIFRvb2xraXQgVGFzayAqLworI2RlZmluZSBMT0dfR0VORVJJQ19TSU1fVE9PTEtJVF9UQVNLX0MgICAgICAgICAgICAgICAgICAoMHgyNzIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA2MjcgQ2FsbCBNYW5hZ2VyIFBob25lIGV2ZW50cyBsb2cgKi8KKyNkZWZpbmUgTE9HX0NNX1BIX0VWRU5UX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjczICsgTE9HXzFYX0JBU0VfQykKKworLyogNjI4IFdNUyBTZXQgTWVzc2FnZSBMaXN0ICovCisjZGVmaW5lIExPR19XTVNfU0VUX01FU1NBR0VfTElTVF9DICAgICAgICAgICAgICAgICAgICAgICgweDI3NCArIExPR18xWF9CQVNFX0MpCisKKy8qIDYyOS03MDQgSERSIHJlc2VydmVkIGxvZ3MgKi8KKyNkZWZpbmUgTE9HX0hEUl9SRVNFUlZFRF9DT0RFU19CQVNFXzNfQyAgICAgICAgICAgICAgICAgKDB4Mjc1ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX0hEUl9MQVNUXzNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDc1ICsgTE9HX0hEUl9SRVNFUlZFRF9DT0RFU19CQVNFXzNfQykKKworLyogNzA1IENhbGwgTWFuYWdlciBjYWxsIGV2ZW50IGxvZyAqLworI2RlZmluZSBMT0dfQ01fQ0FMTF9FVkVOVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyQzEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA3MDYtNzM4IFFWUCByZXNlcnZlZCBsb2dzICovCisjZGVmaW5lIExPR19RVlBfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAgICAgICgweDJDMiArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19RVlBfTEFTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMiArIExPR19RVlBfUkVTRVJWRURfQ09ERVNfQkFTRV9DKQorCisvKiA3MzkgR1BTIFBFIFBvc2l0aW9uIFJlcG9ydCBsb2cgKi8KKyNkZWZpbmUgTE9HX0dQU19QRV9QT1NJVElPTl9SRVBPUlRfQyAgICAgICAgICAgICAgICAgICAgKDB4MkUzICsgTE9HXzFYX0JBU0VfQykKKworLyogNzQwIEdQUyBQRSBQb3NpdGlvbiBSZXBvcnQgRXh0ZW5kZWQgbG9nICovCisjZGVmaW5lIExPR19HUFNfUEVfUE9TSVRJT05fUkVQT1JUX0VYVF9DICAgICAgICAgICAgICAgICgweDJFNCArIExPR18xWF9CQVNFX0MpCisKKy8qIDc0MSBsb2cgKi8KKyNkZWZpbmUgTE9HX01ERElfSE9TVF9TVEFUU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MkU1ICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIERlY29kZWQgRXBoZW1lcmlzICovCisjZGVmaW5lIExPR19HUFNfREVDT0RFRF9FUEhFTUVSSVNfQyAgICAgICAgICAgICAgICAgICAgICgweDJFNiArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBEZWNvZGVkIEFsbWFuYWMgKi8KKyNkZWZpbmUgTE9HX0dQU19ERUNPREVEX0FMTUFOQUNfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4MkU3ICsgTE9HXzFYX0JBU0VfQykKKworLyogVHJhbnNjZWl2ZXIgUmVzb3VyY2UgTWFuYWdlciAqLworI2RlZmluZSBMT0dfVFJBTlNDRUlWRVJfUkVTT1VSQ0VfTUdSX0MgICAgICAgICAgICAgICAgICAoMHgyRTggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgUG9zaXRpb24gRW5naW5lIEluZm8gKi8KKyNkZWZpbmUgTE9HX0dQU19QT1NJVElPTl9FTkdJTkVfSU5GT19DICAgICAgICAgICAgICAgICAgKDB4MkU5ICsgTE9HXzFYX0JBU0VfQykKKworLyogNzQ2LTgxMCBSQVBUT1IgcmVzZXJ2ZWQgbG9nIHJhbmdlICovCisjZGVmaW5lIExPR19SQVBUT1JfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAgICgweDJFQSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19SQVBUT1JfTEFTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg2NCArIExPR19SQVBUT1JfUkVTRVJWRURfQ09ERVNfQkFTRV9DKQorCisvKiBRT1MgU3BlY2lmaWNhdGlvbiBMb2dnaW5nICovCisKKy8qIFFPUyBSZXF1ZXN0ZWQgTG9nICovCisjZGVmaW5lIExPR19RT1NfUkVRVUVTVEVEX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMyQiArIExPR18xWF9CQVNFX0MpCisKKy8qIFFPUyBHcmFudGVkIExvZyAqLworI2RlZmluZSBMT0dfUU9TX0dSQU5URURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMkMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBRT1MgU3RhdGUgTG9nICovCisjZGVmaW5lIExPR19RT1NfU1RBVEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMyRCArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1FPU19NT0RJRklFRF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzJFICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfUURKX0VOUVVFVUVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMkYgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUURKX0RFUVVFVUVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMzAgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUURKX1VQREFURV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMzEgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUURUWF9FTkNPREVSX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMzIgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUURUWF9ERUNPREVSX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMzMgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19QT1JUX0FTU0lHTk1FTlRfU1RBVFVTX0MgICAgICAgICAgICAgICAgICAgICgweDMzNCArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIHJlc2VydmVkIGxvZyBjb2RlcyAqLworI2RlZmluZSBMT0dfUFNfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAgICAgICAoMHgzMzUgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFNfTEFTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjUgKyBMT0dfUFNfUkVTRVJWRURfQykKKworI2RlZmluZSBMT0dfUFNfU1RBVF9JUF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMzUgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFNfU1RBVF9HTE9CQUxfSVBWNF9DICAgICAgICAgICAgICAgICAgICAgICAoMHgzMzUgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFNfU1RBVF9HTE9CQUxfSVBWNl9DICAgICAgICAgICAgICAgICAgICAgICAoMHgzMzYgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFNfU1RBVF9HTE9CQUxfSUNNUFY0X0MgICAgICAgICAgICAgICAgICAgICAoMHgzMzcgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFNfU1RBVF9HTE9CQUxfSUNNUFY2X0MgICAgICAgICAgICAgICAgICAgICAoMHgzMzggKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFNfU1RBVF9HTE9CQUxfVENQX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMzkgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFNfU1RBVF9HTE9CQUxfVURQX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgzM0EgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBkZXNjcmliZSBhbGwgVENQIGluc3RhbmNlcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9ERVNDX0FMTF9UQ1BfSU5TVF9DICAgICAgICAgICAgICAgICAoMHgzM0IgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBkZXNjcmliZSBhbGwgbWVtb3J5IHBvb2wgaW5zdGFuY2VzICovCisjZGVmaW5lIExPR19QU19TVEFUX0RFU0NfQUxMX01FTV9QT09MX0lOU1RfQyAgICAgICAgICAgICgweDMzQyArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGRlc2NyaWJlIGFsbCBJRkFDRSBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfREVTQ19BTExfSUZBQ0VfSU5TVF9DICAgICAgICAgICAgICAgKDB4MzNEICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgZGVzY3JpYmUgYWxsIFBQUCBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfREVTQ19BTExfUFBQX0lOU1RfQyAgICAgICAgICAgICAgICAgKDB4MzNFICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgZGVzY3JpYmUgYWxsIEFSUCBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfREVTQ19BTExfQVJQX0lOU1RfQyAgICAgICAgICAgICAgICAgKDB4MzNGICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgZGVzY3JpYmUgZGVsdGEgaW5zdGFuY2UgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfREVTQ19ERUxUQV9JTlNUX0MgICAgICAgICAgICAgICAgICAgKDB4MzQwICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgaW5zdGFuY2UgVENQIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfVENQX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzQxICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgaW5zdGFuY2UgVURQIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfVURQX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzQyICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgaW5zdGFuY2UgUFBQIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfUFBQX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzQzICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgaW5zdGFuY2UgSUZBQ0Ugc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9JRkFDRV9JTlNUX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNDQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBpbnN0YW5jZSBtZW1vcnkgc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9NRU1fSU5TVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNDUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBpbnN0YW5jZSBmbG93IHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfRkxPV19JTlNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzQ2ICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgaW5zdGFuY2UgcGh5c2ljYWwgbGluayBzdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19QU19TVEFUX1BIWVNfTElOS19JTlNUX0MgICAgICAgICAgICAgICAgICAgICgweDM0NyArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGluc3RhbmNlIEFSUCBzdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19QU19TVEFUX0FSUF9JTlNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM0OCArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGluc3RhbmNlIExMQyBzdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19QU19TVEFUX0xMQ19JTlNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM0OSArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGluc3RhbmNlIElQSEMgc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9JUEhDX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNEEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBpbnN0YW5jZSBST0hDIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfUk9IQ19JTlNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzRCICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgaW5zdGFuY2UgUlNWUCBzdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19QU19TVEFUX1JTVlBfSU5TVF9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDM0QyArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGRlc2NyaWJlIGFsbCBMTEMgaW5zdGFuY2VzICovCisjZGVmaW5lIExPR19QU19TVEFUX0RFU0NfQUxMX0xMQ19JTlNUX0MgICAgICAgICAgICAgICAgICgweDM0RCArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGRlc2NyaWJlIGFsbCBSU1ZQIGluc3RhbmNlcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9ERVNDX0FMTF9SU1ZQX0lOU1RfQyAgICAgICAgICAgICAgICAoMHgzNEUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDYWxsIE1hbmFnZXIgU2VydmluZyBTeXN0ZW0gZXZlbnQgbG9nICovCisjZGVmaW5lIExPR19DTV9TU19FVkVOVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM0RiArIExPR18xWF9CQVNFX0MpCisKKy8qIFZjVGN4byBtYW5hZ2VyknMgYXV0b21hdGljIGZyZXF1ZW5jeSBjb250cm9sIGxvZyAqLworI2RlZmluZSBMT0dfVENYT01HUl9BRkNfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNTAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDbG9jayB0cmFuc2FjdGlvbnMgYW5kIGdlbmVyYWwgY2xvY2tzIHN0YXR1cyBsb2cgKi8KKyNkZWZpbmUgTE9HX0NMT0NLX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzUxICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIHNlYXJjaCBwcm9jZXNzZWQgcGVhayByZXN1bHRzIGFuZCB0aGVpciBhc3NvY2lhdGVkIHNlYXJjaCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIExPR19HUFNfUFJPQ0VTU0VEX1BFQUtfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDM1MiArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX01EU1BfTE9HX0NIVU5LU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzUzICsgTE9HXzFYX0JBU0VfQykKKworLyogUGVyaW9kaWMgUlNTSSB1cGRhdGUgbG9nICovCisjZGVmaW5lIExPR19XTEFOX1JTU0lfVVBEQVRFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM1NCArIExPR18xWF9CQVNFX0MpCisKKy8qIFBlcmlvZGljIExpbmsgTGF5ZXIgc3RhdGlzdGljcyBsb2cgKi8KKyNkZWZpbmUgTE9HX1dMQU5fTExfU1RBVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzU1ICsgTE9HXzFYX0JBU0VfQykKKworLyogUU9TIEV4dGVuZGVkIFN0YXRlIExvZyAqLworI2RlZmluZSBMT0dfUU9TX1NUQVRFX0VYX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNTYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBCbHVldG9vdGggaG9zdCBIQ0kgdHJhbnNtaXR0ZWQgZGF0YSAqLworI2RlZmluZSBMT0dfQlRfSE9TVF9IQ0lfVFhfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNTcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBCbHVldG9vdGggaG9zdCBIQ0kgcmVjZWl2ZWQgZGF0YSAqLworI2RlZmluZSBMT0dfQlRfSE9TVF9IQ0lfUlhfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNTggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBJbnRlcm5hbCAtIEdQUyBQRSBQb3NpdGlvbiBSZXBvcnQgUGFydCAzICovCisjZGVmaW5lIExPR19HUFNfUEVfUE9TSVRJT05fUkVQT1JUX1BBUlQzX0MgICAgICAgICAgICAgICgweDM1OSArIExPR18xWF9CQVNFX0MpCisKKy8qIEV4dGVuZGVkIGxvZyBjb2RlIHdoaWNoIGxvZ3MgcmVxdWVzdGVkIFFvUyAqLworI2RlZmluZSBMT0dfUU9TX1JFUVVFU1RFRF9FWF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNUEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBFeHRlbmRlZCBsb2cgY29kZSB3aGljaCBsb2dzIGdyYW50ZWQgUW9TICovCisjZGVmaW5lIExPR19RT1NfR1JBTlRFRF9FWF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM1QiArIExPR18xWF9CQVNFX0MpCisKKy8qIEV4dGVuZGVkIGxvZyBjb2RlIHdoaWNoIGxvZ3MgbW9kaWZpZWQgUW9TICovCisjZGVmaW5lIExPR19RT1NfTU9ESUZJRURfRVhfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM1QyArIExPR18xWF9CQVNFX0MpCisKKy8qIEJ1cyBNb25pdG9yIFByb2ZpbGluZyBJbmZvICovCisjZGVmaW5lIExPR19CVVNfTU9OX1BST0ZfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICgweDM1RCArIExPR18xWF9CQVNFX0MpCisKKy8qIFBpbG90IFBoYXNlIE1lYXN1cmVtZW50IFNlYXJjaCByZXN1bHRzICovCisjZGVmaW5lIExPR19TUkNIX1BQTV9SRVNfVkVSXzJfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDM1RSArIExPR18xWF9CQVNFX0MpCisKKy8qIFBpbG90IFBoYXNlIE1lYXN1cmVtZW50IERhdGEgQmFzZSAqLworI2RlZmluZSBMT0dfU1JDSF9QUE1fREJfVkVSXzJfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNUYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQaWxvdCBQaGFzZSBNZWFzdXJlbWVudCBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lIExPR19QUE1fU01fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM2MCArIExPR18xWF9CQVNFX0MpCisKKy8qIFJvYnVzdCBIZWFkZXIgQ29tcHJlc3Npb24gLSBDb21wcmVzc29yICovCisjZGVmaW5lIExPR19ST0hDX0NPTVBSRVNTT1JfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM2MSArIExPR18xWF9CQVNFX0MpCisKKy8qIFJvYnVzdCBIZWFkZXIgQ29tcHJlc3Npb24gLSBEZWNvbXByZXNzb3IgKi8KKyNkZWZpbmUgTE9HX1JPSENfREVDT01QUkVTU09SX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzYyICsgTE9HXzFYX0JBU0VfQykKKworLyogUm9idXN0IEhlYWRlciBDb21wcmVzc2lvbiAtIEZlZWRiYWNrIENvbXByZXNzb3IgKi8KKyNkZWZpbmUgTE9HX1JPSENfRkVFREJBQ0tfQ09NUFJFU1NPUl9DICAgICAgICAgICAgICAgICAgKDB4MzYzICsgTE9HXzFYX0JBU0VfQykKKworLyogUm9idXN0IEhlYWRlciBDb21wcmVzc2lvbiAtIEZlZWRiYWNrIERlY29tcHJlc3NvciAqLworI2RlZmluZSBMT0dfUk9IQ19GRUVEQkFDS19ERUNPTVBSRVNTT1JfQyAgICAgICAgICAgICAgICAoMHgzNjQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBCbHVldG9vdGggSENJIGNvbW1hbmRzICovCisjZGVmaW5lIExPR19CVF9IQ0lfQ01EX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM2NSArIExPR18xWF9CQVNFX0MpCisKKy8qIEJsdWV0b290aCBIQ0kgZXZlbnRzICovCisjZGVmaW5lIExPR19CVF9IQ0lfRVZfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM2NiArIExPR18xWF9CQVNFX0MpCisKKy8qIEJsdWV0b290aCBIQ0kgVHJhbnNtaXR0ZWQgQUNMIGRhdGEgKi8KKyNkZWZpbmUgTE9HX0JUX0hDSV9UWF9BQ0xfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzY3ICsgTE9HXzFYX0JBU0VfQykKKworLyogQmx1ZXRvb3RoIEhDSSBSZWNlaXZlZCBBQ0wgZGF0YSAqLworI2RlZmluZSBMT0dfQlRfSENJX1JYX0FDTF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNjggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBCbHVldG9vdGggU09DIEg0IERlZXAgU2xlZXAgKi8KKyNkZWZpbmUgTE9HX0JUX1NPQ19INERTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzY5ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1UUyB0byBDRE1BIEhhbmRvdmVyIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX1VNVFNfVE9fQ0RNQV9IQU5ET1ZFUl9NU0dfQyAgICAgICAgICAgICAgICAgKDB4MzZBICsgTE9HXzFYX0JBU0VfQykKKworLyogR3JhcGhpYyBFdmVudCBEYXRhICovCisjZGVmaW5lIExPR19QUk9GSUxFUl9HUkFQSElDX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICgweDM2QiArIExPR18xWF9CQVNFX0MpCisKKy8qIEF1ZGlvIEV2ZW50IERhdGEgKi8KKyNkZWZpbmUgTE9HX1BST0ZJTEVSX0FVRElPX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4MzZDICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIFNwZWN0cmFsIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19HUFNfU1BFQ1RSQUxfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICgweDM2RCArIExPR18xWF9CQVNFX0MpCisKKy8qIEFIQiBQZXJmb3JtYW5jZSBNb25pdG9yIExPRyBkYXRhICovCisjZGVmaW5lIExPR19BUE1fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM2RSArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBDbG9jayBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0NPTlZFUkdFRF9HUFNfQ0xPQ0tfUkVQT1JUX0MgICAgICAgICAgICAgICAgKDB4MzZGICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIFBvc2l0aW9uIFJlcG9ydCAqLworI2RlZmluZSBMT0dfQ09OVkVSR0VEX0dQU19QT1NJVElPTl9SRVBPUlRfQyAgICAgICAgICAgICAoMHgzNzAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgTWVhc3VyZW1lbnQgUmVwb3J0ICovCisjZGVmaW5lIExPR19DT05WRVJHRURfR1BTX01FQVNVUkVNRU5UX1JFUE9SVF9DICAgICAgICAgICgweDM3MSArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBSRiBTdGF0dXMgUmVwb3J0ICovCisjZGVmaW5lIExPR19DT05WRVJHRURfR1BTX1JGX1NUQVRVU19SRVBPUlRfQyAgICAgICAgICAgICgweDM3MiArIExPR18xWF9CQVNFX0MpCisKKy8qIFZPSVAgVG8gQ0RNQSBIYW5kb3ZlciBNZXNzYWdlIC0gT2Jzb2xldGVkIGJ5IDB4MTM4QiAtIDB4MTM4RCAqLworI2RlZmluZSBMT0dfVk9JUF9UT19DRE1BX0hBTkRPVkVSX01TR19DICAgICAgICAgICAgICAgICAoMHgzNzMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgUHJlc2NyaWJlZCBEd2VsbCBSZXN1bHQgKi8KKyNkZWZpbmUgTE9HX0dQU19QUkVTQ1JJQkVEX0RXRUxMX1JFU1VMVF9DICAgICAgICAgICAgICAgKDB4Mzc0ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBJUEMgRGF0YSAqLworI2RlZmluZSBMT0dfQ0dQU19JUENfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNzUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIE5vbiBJUEMgRGF0YSAqLworI2RlZmluZSBMT0dfQ0dQU19OT05fSVBDX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNzYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFNlc3Npb24gUmVwb3J0ICovCisjZGVmaW5lIExPR19DR1BTX1JFUF9FVlRfTE9HX1BBQ0tFVF9DICAgICAgICAgICAgICAgICAgICgweDM3NyArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBHZXQgUG9zaXRpb24gKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9HRVRfUE9TSVRJT05fQyAgICAgICAgICAgICAgICAgICAgKDB4Mzc4ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIFNldCBQYXJhbWV0ZXJzICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fU0VUX1BBUkFNRVRFUlNfQyAgICAgICAgICAgICAgICAgICgweDM3OSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBFbmQgU2Vzc2lvbiAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX0VORF9TRVNTSU9OX0MgICAgICAgICAgICAgICAgICAgICAoMHgzN0EgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gbm90aWZ5IFZlcmlmeSBSZXNwb25zZSAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX05PVElGWV9WRVJJRllfUkVTUF9DICAgICAgICAgICAgICAoMHgzN0IgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gUG9zaXRpb24gUmVwb3J0IENhbGxiYWNrICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fUE9TSVRJT05fUkVQT1JUX0NBTExCQUNLX0MgICAgICAgICgweDM3QyArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBQRCBFdmVudCBDYWxsYmFjayAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX1BEX0VWRU5UX0NBTExCQUNLX0MgICAgICAgICAgICAgICAoMHgzN0QgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gUEEgRXZlbnQgQ2FsbGJhY2sgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9QQV9FVkVOVF9DQUxMQkFDS19DICAgICAgICAgICAgICAgKDB4MzdFICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIG5vdGlmeSBWZXJpZnkgUmVxdWVzdCBDYWxsYmFjayAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX05PVElGWV9WRVJJRllfUkVRVUVTVF9DICAgICAgICAgICAoMHgzN0YgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gUEQgQ29tbWFuZCBFcnJvciBDYWxsYmFjayAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX1BEX0NNRF9FUlJfQ0FMTEJBQ0tfQyAgICAgICAgICAgICAoMHgzODAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gUEEgQ29tbWFuZCBFcnJvciBDYWxsYmFjayAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX1BBX0NNRF9FUlJfQ0FMTEJBQ0tfQyAgICAgICAgICAgICAoMHgzODEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gUG9zaXRpb24gRXJyb3IgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9QT1NfRVJST1JfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4MzgyICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIEV4dGVuZGVkIFN0YXR1cyBQb3NpdGlvbiBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9FWFRfU1RBVFVTX1BPU19SRVBPUlRfQyAgICAgICAgICAgKDB4MzgzICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIEV4dGVuZGVkIFN0YXR1cyBOTUVBIFJlcG9ydCAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX0VYVF9TVEFUVVNfTk1FQV9SRVBPUlRfQyAgICAgICAgICAoMHgzODQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gRXh0ZW5kZWQgU3RhdHVzIE1lYXN1cmVtZW50IFJlcG9ydCAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX0VYVF9TVEFUVVNfTUVBU19SRVBPUlRfQyAgICAgICAgICAoMHgzODUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFJlcG9ydCBTZXJ2ZXIgVFggUGFja2V0ICovCisjZGVmaW5lIExPR19DR1BTX1JFUF9TVlJfVFhfTE9HX1BBQ0tFVF9DICAgICAgICAgICAgICAgICgweDM4NiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUmVwb3J0IFNlcnZlciBSWCBQYWNrZXQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUkVQX1NWUl9SWF9MT0dfUEFDS0VUX0MgICAgICAgICAgICAgICAgKDB4Mzg3ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1UUyBUbyBDRE1BIEhhbmRvdmVyIFBhZ2luZyBDaGFubmVsIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX1VNVFNfVE9fQ0RNQV9IQU5ET1ZFUl9QQ0hfTVNHX0MgICAgICAgICAgICAgKDB4Mzg4ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1UUyBUbyBDRE1BIEhhbmRvdmVyIFRyYWZmaWMgQ2hhbm5lbCBNZXNzYWdlICovCisjZGVmaW5lIExPR19VTVRTX1RPX0NETUFfSEFORE9WRVJfVENIX01TR19DICAgICAgICAgICAgICgweDM4OSArIExPR18xWF9CQVNFX0MpCisKKy8qIENvbnZlcmdlZCBHUFMgSVEgUmVwb3J0ICovCisjZGVmaW5lIExPR19DT05WRVJHRURfR1BTX0lRX1JFUE9SVF9DICAgICAgICAgICAgICAgICAgICgweDM4QSArIExPR18xWF9CQVNFX0MpCisKKy8qIFZPSVAgVG8gQ0RNQSBQYWdpbmcgQ2hhbm5lbCBIYW5kb3ZlciBNZXNzYWdlICovCisjZGVmaW5lIExPR19WT0lQX1RPX0NETUFfUENIX0hBTkRPVkVSX01TR19DICAgICAgICAgICAgICgweDM4QiArIExPR18xWF9CQVNFX0MpCisKKy8qIFZPSVAgVG8gQ0RNQSBBY2Nlc3MgQ2hhbm5lbCBIYW5kb3ZlciBNZXNzYWdlICovCisjZGVmaW5lIExPR19WT0lQX1RPX0NETUFfQUNIX0hBTkRPVkVSX01TR19DICAgICAgICAgICAgICgweDM4QyArIExPR18xWF9CQVNFX0MpCisKKy8qIFZPSVAgVG8gQ0RNQSBGb3J3YXJkIFRyYWZmaWMgQ2hhbm5lbCBIYW5kb3ZlciBNZXNzYWdlICovCisjZGVmaW5lIExPR19WT0lQX1RPX0NETUFfRlRDX0hBTkRPVkVSX01TR19DICAgICAgICAgICAgICgweDM4RCArIExPR18xWF9CQVNFX0MpCisKKy8qIFFNSSByZXNlcnZlZCBsb2dzICovCisjZGVmaW5lIExPR19RTUlfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAgICAgICgweDM4RSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19RTUlfTEFTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMiArIExPR19RTUlfUkVTRVJWRURfQ09ERVNfQkFTRV9DKQorCisvKiBRT1MgSW5mbyBDb2RlIFVwZGF0ZSBMb2cgKi8KKyNkZWZpbmUgTE9HX1FPU19JTkZPX0NPREVfVVBEQVRFX0MgICAgICAgICAgICAgICAgICAgICAgKDB4M0FGICsgTE9HXzFYX0JBU0VfQykKKworLyogVHJhbnNtaXQoVXBsaW5rKSBWb2NvZGVyIFBDTSBQYWNrZXQgTG9nICovCisjZGVmaW5lIExPR19UWF9QQ01fUEFDS0VUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNCMCArIExPR18xWF9CQVNFX0MpCisKKy8qIEF1ZGlvIFZvY29kZXIgRGF0YSBQYXRocyAqLworI2RlZmluZSBMT0dfQVVEVk9DX0RBVEFfUEFUSFNfUEFDS0VUX0MgICAgICAgICAgICAgICAgICAoMHgzQjAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSZWNlaXZlKERvd25saW5rKSBWb2NvZGVyIFBDTSBQYWNrZXQgTG9nICovCisjZGVmaW5lIExPR19SWF9QQ01fUEFDS0VUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNCMSArIExPR18xWF9CQVNFX0MpCisKKy8qIENSQyBvZiBZVVYgZnJhbWUgbG9nICovCisjZGVmaW5lIExPR19ERUNfQ1JDX0ZSQU1FX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNCMiArIExPR18xWF9CQVNFX0MpCisKKy8qIEZMVVRFIFNlc3Npb24gSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZMVVRFX1NFU1NJT05fSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0IzICsgTE9HXzFYX0JBU0VfQykKKworLyogRkxVVEUgQURQIEZpbGUgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZMVVRFX0FEUF9GSUxFX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgKDB4M0I0ICsgTE9HXzFYX0JBU0VfQykKKworLyogRkxVVEUgRmlsZSBSZXF1ZXN0IEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GTFVURV9GSUxFX1JFUV9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICgweDNCNSArIExPR18xWF9CQVNFX0MpCisKKy8qIEZMVVRFIEZEVCBJbnN0YW5jZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRkxVVEVfRkRUX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQjYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGTFVURSBGRFQgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZMVVRFX0ZEVF9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0I3ICsgTE9HXzFYX0JBU0VfQykKKworLyogRkxVVEUgRmlsZSBMb2cgUGFja2V0IEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GTFVURV9GSUxFX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNCOCArIExPR18xWF9CQVNFX0MpCisKKy8qIDNHIDFYIFBhcmFtZXRlciBPdmVyaGVhZCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfVk9JUF9UT19DRE1BXzNHMVhfUEFSQU1FVEVSU19DICAgICAgICAgICAgICAoMHgzQjkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIE1FIEpvYiBJbmZvICovCisjZGVmaW5lIExPR19DR1BTX01FX0pPQl9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNCQSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUUgU1YgTGlzdHMgKi8KKyNkZWZpbmUgTE9HX0NQR1NfTUVfU1ZfTElTVFNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0JCICsgTE9HXzFYX0JBU0VfQykKKworLyogRmxleGlibGUgUHJvZmlsaW5nIFN0YXR1cyAqLworI2RlZmluZSBMT0dfUFJPRkRJQUdfR0VOX1NUQVRVU19DICAgICAgICAgICAgICAgICAgICAgICAoMHgzQkMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGbGV4aWJsZSBQcm9maWxpbmcgUmVzdWx0cyAqLworI2RlZmluZSBMT0dfUFJPRkRJQUdfR0VOX1BST0ZfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQkQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGTFVURSBBRFAgRmlsZSBDb250ZW50IExvZyBQYWNrZXQgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZMVVRFX0FEUF9GSUxFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0JFICsgTE9HXzFYX0JBU0VfQykKKworLyogRkxVVEUgRkRUIEluc3RhbmNlIEZpbGUgQ29udGVudCBMb2cgUGFja2V0IEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GTFVURV9GRFRfSU5TVF9GSUxFX0MgICAgICAgICAgICAgICAgICAgICAgICgweDNCRiArIExPR18xWF9CQVNFX0MpCisKKy8qIEZMVVRFIEZEVCBFbnRyaWVzIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GTFVURV9GRFRfRU5UUklFU19JTkZPX0MgICAgICAgICAgICAgICAgICAgICgweDNDMCArIExPR18xWF9CQVNFX0MpCisKKy8qIEZMVVRFIEZpbGUgQ29udGVudHMgTG9nIFBhY2tldCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRkxVVEVfRklMRV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQzEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIE1FIFRpbWUtVHJhbnNmZXIgSW5mbyAqLworI2RlZmluZSBMT0dfQ0dQU19NRV9USU1FX1RSQU5TRkVSX0lORk9fQyAgICAgICAgICAgICAgICAoMHgzQzIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIE1FIFVNVFMgVGltZS1UYWdnaW5nIEluZm8gKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUVfVU1UU19USU1FX1RBR0dJTkdfSU5GT19DICAgICAgICAgICAgKDB4M0MzICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBNRSBHZW5lcmljIFRpbWUgRXN0aW1hdGUgUHV0IGxuZm8gKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUVfVElNRV9FU1RfUFVUX0lORk9fQyAgICAgICAgICAgICAgICAgKDB4M0M0ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBNRSBHZW5lcmljIEZyZXEgRXN0aW1hdGUgUHV0IGxuZm8gKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUVfRlJFUV9FU1RfUFVUX0lORk9fQyAgICAgICAgICAgICAgICAgKDB4M0M1ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBTbG93IENsb2NrIFJlcG9ydCAqLworI2RlZmluZSBMT0dfQ0dQU19TTE9XX0NMT0NLX1JFUE9SVF9DICAgICAgICAgICAgICAgICAgICAoMHgzQzYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDb252ZXJnZWQgR1BTIE1lZGl1bSBHcmlkICovCisjZGVmaW5lIExPR19DT05WRVJHRURfR1BTX01FRElVTV9HUklEX0MgICAgICAgICAgICAgICAgICgweDNDNyArIExPR18xWF9CQVNFX0MpCisKKy8qIFN0YXRpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyIG9yIGRldmljZSAqLworI2RlZmluZSBMT0dfU05TRF9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQzggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEeW5hbWljIHN0YXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2Ugb3IgZHJpdmVyICovCisjZGVmaW5lIExPR19TTlNEX1NUQVRFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNDOSArIExPR18xWF9CQVNFX0MpCisKKy8qIERhdGEgZnJvbSBhIGRyaXZlciAqLworI2RlZmluZSBMT0dfU05TRF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQ0EgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfU05TRF9EQVRBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQ0EgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIENlbGwgREIgQ2VsbCBDaGFuZ2UgSW5mbyAqLworI2RlZmluZSBMT0dfQ0dQU19DRUxMREJfQ0VMTF9DSEFOR0VfSU5GT19DICAgICAgICAgICAgICAoMHgzQ0IgKyBMT0dfMVhfQkFTRV9DKQorCisvKiB4U2NhbGFyIFlVViBmcmFtZSBsb2cgKi8KKyNkZWZpbmUgTE9HX0RFQ19YU0NBTEVfWVVWX0ZSQU1FX0MgICAgICAgICAgICAgICAgICAgICAgKDB4M0NDICsgTE9HXzFYX0JBU0VfQykKKworLyogQ1JDIG9mIHhTY2FsZWQgWVVWIGZyYW1lIGxvZyAqLworI2RlZmluZSBMT0dfREVDX1hTQ0FMRV9DUkNfRlJBTUVfQyAgICAgICAgICAgICAgICAgICAgICAoMHgzQ0QgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIEZyZXF1ZW5jeSBFc3RpbWF0ZSBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfRlJFUV9FU1RfUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgICAgKDB4M0NFICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIERDTUUgU3JjaCBKb2IgQ29tcGxldGVkICovCisjZGVmaW5lIExPR19HUFNfRENNRV9TUkNIX0pPQl9DT01QTEVURURfQyAgICAgICAgICAgICAgICgweDNDRiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUUgRmFzdHNjYW4gcmVzdWx0cyAgKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUVfRkFTVFNDQU5fUkVTVUxUU19DICAgICAgICAgICAgICAgICAgKDB4M0QwICsgTE9HXzFYX0JBU0VfQykKKworLyogWE8gZnJlcXVlbmN5IEVzdGltYXRpb24gbG9nICovCisjZGVmaW5lIExPR19YT19GUkVRX0VTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNEMSArIExPR18xWF9CQVNFX0MpCisKKy8qIFRjeG9tZ3IgZmllbGQgY2FsaWJyYXRpb24gZGF0YSAgKi8KKyNkZWZpbmUgTE9HX1RDWE9NR1JfRklFTERfQ0FMX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0QyICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIENhbGwgUHJvY2Vzc2luZyBDb25uZWN0aW9uIEF0dGVtcHQgKi8KKyNkZWZpbmUgTE9HX1VNQkNQX0NPTk5FQ1RJT05fQVRURU1QVF9DICAgICAgICAgICAgICAgICAgKDB4M0QzICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIENhbGwgUHJvY2Vzc2luZyBDb25uZWN0aW9uIFJlbGVhc2UgKi8KKyNkZWZpbmUgTE9HX1VNQkNQX0NPTk5FQ1RJT05fUkVMRUFTRV9DICAgICAgICAgICAgICAgICAgKDB4M0Q0ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIENhbGwgUHJvY2Vzc2luZyBQYWdlIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX1VNQkNQX1BBR0VfTUVTU0FHRV9DICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0Q1ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIENhbGwgUHJvY2Vzc2luZyBPVkhEIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19VTUJDUF9PVkhEX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNENiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBDYWxsIFByb2Nlc3NpbmcgU2Vzc2lvbiBBdHRlbXB0ICovCisjZGVmaW5lIExPR19VTUJDUF9TRVNTSU9OX0FUVEVNUFRfQyAgICAgICAgICAgICAgICAgICAgICgweDNENyArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBDYWxsIFByb2Nlc3NpbmcgUm91dGUgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1VNQkNQX1JPVVRFX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0Q4ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIENhbGwgUHJvY2Vzc2luZyBTdGF0ZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfVU1CQ1BfU1RBVEVfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRDkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgQ2FsbCBQcm9jZXNzaW5nIFNOUCAqLworI2RlZmluZSBMT0dfVU1CQ1BfU05QX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzREEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFNlc3Npb24gRWFybHkgRXhpdCBEZWNpc2lvbiAqLworI2RlZmluZSBMT0dfQ0dQU19TRVNTSU9OX0VBUkxZX0VYSVRfREVDSVNJT05fQyAgICAgICAgICAoMHgzREIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgUkYgTGluZWFyaXR5IFN0YXR1cyAqLworI2RlZmluZSBMT0dfQ0dQU19NRV9SRl9MSU5FQVJJVFlfSU5GT19DICAgICAgICAgICAgICAgICAoMHgzREMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIE1FIDVtcyBJUSBTdW1zICovCisjZGVmaW5lIExPR19DR1BTX01FXzVNU19JUV9TVU1TX0MgICAgICAgICAgICAgICAgICAgICAgICgweDNERCArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUUgMjBtcyBJUSBTdW1zICovCisjZGVmaW5lIExPR19DUEdTX01FXzIwTVNfSVFfU1VNU19DICAgICAgICAgICAgICAgICAgICAgICgweDNERSArIExPR18xWF9CQVNFX0MpCisKKy8qIFJPSEMgQ29tcHJlc3NvciBTdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19ST0hDX0NPTVBSRVNTT1JfU1RBVFNfQyAgICAgICAgICAgICAgICAgICAgICgweDNERiArIExPR18xWF9CQVNFX0MpCisKKy8qIFJPSEMgRGVjb21wcmVzc29yIFN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1JPSENfREVDT01QUkVTU09SX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgKDB4M0UwICsgTE9HXzFYX0JBU0VfQykKKworLyogU2Vuc29ycyAtIEthbG1hbiBmaWx0ZXIgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1NFTlNPUl9LRl9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0UxICsgTE9HXzFYX0JBU0VfQykKKworLyogU2Vuc29ycyAtIEludGVncmF0ZWQgbWVhc3VyZW1lbnRzICovCisjZGVmaW5lIExPR19TRU5TT1JfSU5UX01FQVNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNFMiArIExPR18xWF9CQVNFX0MpCisKKy8qIFNlbnNvcnMgLSBCaWFzIGNhbGlicmF0aW9uIHZhbHVlcyAqLworI2RlZmluZSBMT0dfU0VOU09SX0JJQVNfQ0FMSUJSQVRJT05fQyAgICAgICAgICAgICAgICAgICAoMHgzRTMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBMb2cgY29kZXMgMHgxM0U0LTB4MTNFNyBhcmUgbm90IGZvbGxvd2luZyBzdGFuZGFyZCBsb2cgbmFtaW5nIGNvbnZlbnRpb24gKi8KKworLyogRFRWIElTREItVCBUcmFuc3BvcnQgU3RyZWFtIFBhY2tldHMgKi8KKyNkZWZpbmUgTE9HX0RUVl9JU0RCX1RTX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0U0ICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIElTREItVCBQRVMgUGFja2V0cyAqLworI2RlZmluZSBMT0dfRFRWX0lTREJfUEVTX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRTUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEVFYgSVNEQi1UIFNlY3Rpb25zICovCisjZGVmaW5lIExPR19EVFZfSVNEQl9TRUNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNFNiArIExPR18xWF9CQVNFX0MpCisKKy8qIERUViBJU0RCLVQgQnVmZmVyaW5nICovCisjZGVmaW5lIExPR19EVFZfSVNEQl9CVUZGRVJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNFNyArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gU3lzdGVtIEFjcXVpc2l0aW9uIGFuZCBIYW5kb2ZmICovCisjZGVmaW5lIExPR19XTEFOX1NZU19BQ1FfSE9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNFOCArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gR2VuZXJhbCBDb25maWd1cmFibGUgUGFyYW1ldGVycyAqLworI2RlZmluZSBMT0dfV0xBTl9HRU5fQ09ORklHX1BBUkFNU19DICAgICAgICAgICAgICAgICAgICAoMHgzRTkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQ2hhbm5lbCBhbmQgSW50ZXJmZXJlbmNlIEVzdGltYXRpb24gKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfRFBJQ0hfQ0lFX0MgICAgICAgICAgICAgICAgICAgICAgKDB4M0VBICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIE1NU0UvTVJDIERlbW9kdWxhdGVkIERhdGEgU3ltYm9scyAoTG93KSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9EQVRBX0RFTU9EX0xPV19DICAgICAgICAgICAgICAgICAoMHgzRUIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgTU1TRS9NUkMgRGVtb2R1bGF0ZWQgRGF0YSBTeW1ib2xzIChIaWdoKSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9EQVRBX0RFTU9EX0hJR0hfQyAgICAgICAgICAgICAgICAoMHgzRUMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgRENIIERlY29kZXIgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfRENIX0RFQ09ERVJfQyAgICAgICAgICAgICAgICAgICAgKDB4M0VEICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIERDSCBTdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19VTUJfUEhZX0RDSF9TVEFUSVNUSUNTX0MgICAgICAgICAgICAgICAgICAgICgweDNFRSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBDcWlQaWNoIFByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfQ1FJUElDSF9DICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0VGICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIE1JTU8vU0lNTyBpbiBDcWlQaWNoIChIaWdoKSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9DUUlQSUNIX0NIQU5UQVBTX0hJR0hfQyAgICAgICAgICAoMHgzRjAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgTUlNTy9TSU1PIGluIENxdWlQaWNoIChMb3cpICovCisjZGVmaW5lIExPR19VTUJfUEhZX1JYX0NRSVBJQ0hfQ0hBTlRBUFNfTE9XX0MgICAgICAgICAgICgweDNGMSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBUaW1lLURvbWFpbiBDaGFubmVsIFRhcHMgKEhpZ2gpICovCisjZGVmaW5lIExPR19VTUJfUEhZX1JYX1BQSUNIX0NIQU5fRVNUX0hJR0hfQyAgICAgICAgICAgICgweDNGMiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBUaW1lLURvbWFpbiBDaGFubmVsIFRhcHMgKExvdykgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfUFBJQ0hfQ0hBTl9FU1RfTE9XX0MgICAgICAgICAgICAgKDB4M0YzICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEFUIE1vZHVsYXRvciAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9UWF9QSUNIX0NPTkZJR19DICAgICAgICAgICAgICAgICAgICAoMHgzRjQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQVQgTW9kdWxhdG9yIGZvciBSLUFDSyAoSGlnaCkgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfVFhfQUNLX0hJR0hfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4M0Y1ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEFUIE1vZHVsYXRvciBmb3IgUi1BQ0sgKExvdykgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfVFhfQUNLX0xPV19DICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0Y2ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEFUIE1vZHVsYXRvciBmb3IgUi1QSUNIICovCisjZGVmaW5lIExPR19VTUJfUEhZX1RYX1BJQ0hfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNGNyArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBBVCBNb2R1bGF0b3IgZm9yIFItQUNIIChBY2Nlc3MpICovCisjZGVmaW5lIExPR19VTUJfUEhZX1RYX0FDSF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNGOCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBBVCBNb2R1bGF0b3IgZm9yIFItT0REQ0NIIChIaWdoKSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9UWF9PRENDSF9ISUdIX0MgICAgICAgICAgICAgICAgICAgICAoMHgzRjkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQVQgTW9kdWxhdG9yIGZvciBSLU9ERENDSCAoTG93KSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9UWF9PRENDSF9MT1dfQyAgICAgICAgICAgICAgICAgICAgICAoMHgzRkEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQVQgTW9kdWxhdG9yIGZvciBSLUNEQ0NIICovCisjZGVmaW5lIExPR19VTUJfUEhZX1RYX1JDRENDSF9DT05GSUdfQyAgICAgICAgICAgICAgICAgICgweDNGQiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBBVCBNb2R1bGF0b3IgZm9yIENRSSBzZW50IG9uIFJDRENDSCAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9UWF9OT05GTFNTX0NRSUNIX0MgICAgICAgICAgICAgICAgICAoMHgzRkMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQVQgTW9kdWxhdG9yIGZvciBDUUkgc2VudCBvbiBSQ0RDQ0ggKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfVFhfRkxTU19DUUlDSF9DICAgICAgICAgICAgICAgICAgICAgKDB4M0ZEICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEFUIE1vZHVsYXRvciBmb3IgUEFDSCBzZW50IG9uIFJDRENDSCAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9UWF9QQUhDSF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRkUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQVQgTW9kdWxhdG9yIGZvciBSRVEgc2VudCBvbiBSQ0RDQ0ggKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfVFhfUkVRQ0hfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0ZGICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEFUIE1vZHVsYXRvciBmb3IgUFNEIHNlbnQgb24gUkNEQ0NIICovCisjZGVmaW5lIExPR19VTUJfUEhZX1RYX1BTRENIX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQwMCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBBVCBNb2R1bGF0b3IgZm9yIFItRENIICovCisjZGVmaW5lIExPR19VTUJfUEhZX1RYX0RDSF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQwMSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBUaW1lL0ZyZXF1ZW5jeS9SeFBvd2VyIEVzdGltYXRlICovCisjZGVmaW5lIExPR19VTUJfUEhZX1JYX1RJTUVfRlJFUV9QT1dFUl9FU1RJTUFURV9DICAgICAgICgweDQwMiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBGTENTIFByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfRkxDU19QUk9DRVNTSU5HX0MgICAgICAgICAgICAgICAgKDB4NDAzICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIFBCQ0NIIFByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfUEJDQ0hfUFJPQ0VTU0lOR19DICAgICAgICAgICAgICAgKDB4NDA0ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIFNCQ0NIIFByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfU0JDQ0hfUFJPQ0VTU0lOR19DICAgICAgICAgICAgICAgKDB4NDA1ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIFFQQ0ggUHJvY2Vzc2luZyAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9RUENIX1BST0NFU1NJTkdfQyAgICAgICAgICAgICAgICAoMHg0MDYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgTVJDIERlbW9kdWxhdGVkIERhdGEgU3ltYm9scyAoUHJlYW1ibGUgU0JDQ0gvUVBDSCkgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfU0JDQ0hfREVNT0RfQyAgICAgICAgICAgICAgICAgICAgKDB4NDA3ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIE1SQyBEZW1vZHVsYXRlZCBEYXRhIFN5bWJvbHMgKFByZWFtYmxlIFBCQ0NIKSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9QQkNDSF9ERU1PRF9DICAgICAgICAgICAgICAgICAgICAoMHg0MDggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgVkNRSSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9WQ1FJX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MDkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQWNxdWlzaXRpb24gQWxnb3JpdGhtICovCisjZGVmaW5lIExPR19VTUJfUEhZX1JYX0lOSVRJQUxfQUNRVUlTSVRJT05fQyAgICAgICAgICAgICgweDQwQSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBIYW5kb2ZmIFNlYXJjaCBBbGdvcml0aG0gKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfSEFORE9GRl9TRUFSQ0hfQyAgICAgICAgICAgICAgICAgKDB4NDBCICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFJGIFJGRkUgQ29uZmlndXJhdGlvbiBJbmZvICovCisjZGVmaW5lIExPR19VTUJfQVRfUkZGRV9DT05GR19DICAgICAgICAgICAgICAgICAgICAgICAgICgweDQwQyArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSRiBDYWxpYnJhdGVkIFZhbHVlcyBBZnRlciBQb3dlcnVwICovCisjZGVmaW5lIExPR19VTUJfQVRfUkZGRV9SWF9DQUxJQl9DICAgICAgICAgICAgICAgICAgICAgICgweDQwRCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSRiBBR0MgQmxvY2sgaW4gQWNxdWlzaXRpb24gTW9kZSAqLworI2RlZmluZSBMT0dfVU1CX0FUX1JGRkVfUlhfQUNRX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MEUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkYgQUdDIEJsb2NrIGluIElkbGUgTW9kZSAqLworI2RlZmluZSBMT0dfVU1CX0FUX1JGRkVfUlhfSURMRV9DICAgICAgICAgICAgICAgICAgICAgICAoMHg0MEYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkYgQUdDIEJsb2NrIGluIENvbm5lY3RlZCBNb2RlICovCisjZGVmaW5lIExPR19VTUJfQVRfUkZGRV9SWF9DT05ORUNURURfQyAgICAgICAgICAgICAgICAgICgweDQxMCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSRiBBR0MgQmxvY2sgaW4gQ29ubmVjdGVkIE1vZGUgKEZUTSkgKi8KKyNkZWZpbmUgTE9HX1VNQl9BVF9SRkZFX1JYX0NPTk5FQ1RFRF9GVE1fQyAgICAgICAgICAgICAgKDB4NDExICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFJGIEphbW1lciBEZXRlY3RvciBGdW5jdGlvbmFsaXR5ICovCisjZGVmaW5lIExPR19VTUJfQVRfUkZGRV9SWF9KQU1NRVJfREVURUNUT1JfRlVOQ1RJT05BTElUWV9DICAoMHg0MTIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkYgSmFtbWVyIERldGVjdG9yIFJlc3BvbnNlICovCisjZGVmaW5lIExPR19VTUJfQVRfUkZGRV9SWF9KQU1NRVJfREVURUNUT1JfUkVTUE9OU0VfQyAgICgweDQxMyArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSRiBSRkZFIFRYIFBvd2VyIENvbnRyb2wgKi8KKyNkZWZpbmUgTE9HX1VNQl9BVF9SRkZFX1RYX0JFVEFfU0NBTElOR19DICAgICAgICAgICAgICAgKDB4NDE0ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFNlYXJjaGVyIER1bXAgKi8KKyNkZWZpbmUgTE9HX1VNQl9TRUFSQ0hFUl9EVU1QX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDE1ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFN5c3RlbSBBY3F1aXJlICovCisjZGVmaW5lIExPR19VTUJfU1lTVEVNX0FDUVVJUkVfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDQxNiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBTZXQgTWFpbnRlbmFuY2UgKi8KKyNkZWZpbmUgTE9HX1VNQl9TRVRfTUFJTlRFTkFOQ0VfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4NDE3ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFFQQ0ggKi8KKyNkZWZpbmUgTE9HX1VNQl9RUENIX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDE4ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFJMTCBGb3J3YXJkIFBhcnRpYWwgUlAgUGFja2V0ICovCisjZGVmaW5lIExPR19VTUJfUkxMX0ZPUldBUkRfUEFSVElBTF9SUF9DICAgICAgICAgICAgICAgICgweDQxOSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSTEwgUmV2ZXJzZSBQYXJ0aWFsIFJQIFBhY2tldCAqLworI2RlZmluZSBMT0dfVU1CX1JMTF9SRVZFUlNFX1BBUlRJQUxfUlBfQyAgICAgICAgICAgICAgICAoMHg0MUEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkxMIEZvcndhcmQgU2lnbmFsIFBhY2tldCAqLworI2RlZmluZSBMT0dfVU1CX1JMTF9GT1JXQVJEX1NJR05BTF9DICAgICAgICAgICAgICAgICAgICAoMHg0MUIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkxMIFJldmVyc2UgU2lnbmFsIFBhY2tldCAqLworI2RlZmluZSBMT0dfVU1CX1JMTF9SRVZFUlNFX1NJR05BTF9DICAgICAgICAgICAgICAgICAgICAoMHg0MUMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkxMIEZvcndhcmQgU3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfVU1CX1JMTF9GT1JXQVJEX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgICAoMHg0MUQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkxMIFJldmVyc2UgU3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfVU1CX1JMTF9SRVZFUlNFX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgICAoMHg0MUUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkxMIElSVFAgKi8KKyNkZWZpbmUgTE9HX1VNQl9STExfSVJUUF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDFGICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIEFQIEZvcndhcmQgTGluayBNQUMgUGFja2V0cyAqLworI2RlZmluZSBMT0dfVU1CX0FQX0ZMX01BQ19QQUNLRVRfQyAgICAgICAgICAgICAgICAgICAgICAoMHg0MjAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgQVAgUmV2ZXJzZSBMaW5rIE1BQyBQYWNrZXRzICovCisjZGVmaW5lIExPR19VTUJfQVBfUkxfTUFDX1BBQ0tFVF9DICAgICAgICAgICAgICAgICAgICAgICgweDQyMSArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBQZXJmb3JtYW5jZSBTdGF0aXN0aWNzIGxvZyAqLworI2RlZmluZSBMT0dfQ0dQU19QRVJGT1JNQU5DRV9TVEFUU19DICAgICAgICAgICAgICAgICAgICAoMHg0MjIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgU2VhcmNoZXIgR2VuZXJhbCBTdGF0dXMgKi8KKyNkZWZpbmUgTE9HX1VNQl9TUkNIX0dFTkVSQUxfU1RBVFVTX0MgICAgICAgICAgICAgICAgICAgKDB4NDIzICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFN1cGVyZnJhbWUgU2NoZWR1bGVyICovCisjZGVmaW5lIExPR19VTUJfU1VQRVJGUkFNRV9TQ0hFRFVMRVJfQyAgICAgICAgICAgICAgICAgICgweDQyNCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBTZWN0b3IgTGlzdCAqLworI2RlZmluZSBMT0dfVU1CX1NFQ1RPUl9MSVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MjUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIEFjY2VzcyBBdHRlbXB0IENvbW1hbmQgKi8KKyNkZWZpbmUgTE9HX1VNQl9NQUNfQUNDRVNTX0FUVEVNUFRfQ01EX0MgICAgICAgICAgICAgICAgKDB4NDI2ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIE1BQyBBY2Nlc3MgUHJvYmUgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1VNQl9NQUNfQUNDRVNTX1BST0JFX0lORk9fQyAgICAgICAgICAgICAgICAgKDB4NDI3ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIE1BQyBSVENNQUMgUGFja2FnZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfVU1CX01BQ19SVENNQUNfUEtHX0lORk9fQyAgICAgICAgICAgICAgICAgICAoMHg0MjggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIFN1cGVyIEZyYW1lIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19VTUJfTUFDX1NJX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQyOSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBNQUMgUXVpY2sgQ2hhbm5lbCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfVU1CX01BQ19RQ0lfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MkEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIFBhZ2luZyBJZCBMaXN0ICovCisjZGVmaW5lIExPR19VTUJfTUFDX1BBR0lOR19JRF9MSVNUX0MgICAgICAgICAgICAgICAgICAgICgweDQyQiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBNQUMgUXVpY2sgUGFnaW5nIENoYW5uZWwgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1VNQl9NQUNfUVBDSF9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDJDICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIE1BQyBGVENNQUMgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1VNQl9NQUNfRlRDTUFDX1BLR19JTkZPX0MgICAgICAgICAgICAgICAgICAgKDB4NDJEICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIE1BQyBBY2Nlc3MgR3JhbnQgUmVjZWl2aW5nICovCisjZGVmaW5lIExPR19VTUJfTUFDX0FDQ0VTU19HUkFOVF9DICAgICAgICAgICAgICAgICAgICAgICgweDQyRSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBNQUMgR2VuZXJpYyBEZWJ1ZyBMb2cgKi8KKyNkZWZpbmUgTE9HX1VNQl9NQUNfR0VOX0RFQlVHX0xPR19QS0dfQyAgICAgICAgICAgICAgICAgKDB4NDJGICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBGcmVxdWVuY3kgQmlhcyBFc3RpbWF0ZSAqLworI2RlZmluZSBMT0dfQ0dQU19NQ19GUkVRX0JJQVNfRVNUX0MgICAgICAgICAgICAgICAgICAgICAoMHg0MzAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIFJlcXVlc3QgUmVwb3J0IEluZm9ybWF0aW9uIExvZyAqLworI2RlZmluZSBMT0dfVU1CX01BQ19SRVFDSF9SRVBPUlRfSU5GT19DICAgICAgICAgICAgICAgICAoMHg0MzEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIFJldmVyc2UgTGluayBRb1MgVG9rZW4gQnVja2V0IEluZm9ybWF0aW9uIExvZyAqLworI2RlZmluZSBMT0dfVU1CX01BQ19STFFPU19UT0tFTl9CVUNLRVRfSU5GT19DICAgICAgICAgICAoMHg0MzIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIFJldmVyc2UgTGluayBRb1MgU3RyZWFtIEluZm9ybWF0aW9uIExvZyAqLworI2RlZmluZSBMT0dfVU1CX01BQ19STFFPU19TVFJFQU1fSU5GT19DICAgICAgICAgICAgICAgICAoMHg0MzMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIFJldmVyc2UgTGluayBRb1MgQWxsb3RtZW50IEluZm9ybWF0aW9uIExvZyAqLworI2RlZmluZSBMT0dfVU1CX01BQ19STFFPU19BTExPVE1FTlRfSU5GT19DICAgICAgICAgICAgICAoMHg0MzQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgU2VhcmNoZXIgUmVjZW50IFN0YXRlIE1hY2hpbmUgVHJhbnNhY3Rpb25zICovCisjZGVmaW5lIExPR19VTUJfU1JDSF9TVE1fQUNUSVZJVFlfQyAgICAgICAgICAgICAgICAgICAgICgweDQzNSArIExPR18xWF9CQVNFX0MpCisKKy8qIFBlcmZvcm1hbmNlIENvdW50ZXJzIG9uIEFSTTExIFByb2ZpbGluZyBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfQVJNMTFfUEVSRl9DTlRfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAoMHg0MzYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBkZXNjcmliZSBhbGwgZmxvdyBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfREVTQ19BTExfRkxPV19JTlNUX0MgICAgICAgICAgICAgICAgKDB4NDM3ICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgZGVzY3JpYmUgYWxsIHBoeXNpY2FsIGxpbmsgaW5zdGFuY2VzICovCisjZGVmaW5lIExPR19QU19TVEFUX0RFU0NfQUxMX1BIWVNfTElOS19JTlNUX0MgICAgICAgICAgICgweDQzOCArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGRlc2NyaWJlIGFsbCBVRFAgaW5zdGFuY2VzICovCisjZGVmaW5lIExPR19QU19TVEFUX0RFU0NfQUxMX1VEUF9JTlNUX0MgICAgICAgICAgICAgICAgICgweDQzOSArIExPR18xWF9CQVNFX0MpCisKKy8qIFNlYXJjaGVyIDQgTXVsdGktQ2FycmllciBIRFIgKi8KKyNkZWZpbmUgTE9HX1NSQ0g0X01DX0hEUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDNBICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgZGVzY3JpYmUgYWxsIElQSEMgaW5zdGFuY2VzICovCisjZGVmaW5lIExPR19QU19TVEFUX0RFU0NfQUxMX0lQSENfSU5TVF9DICAgICAgICAgICAgICAgICgweDQzQiArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGRlc2NyaWJlIGFsbCBST0hDIGluc3RhbmNlcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9ERVNDX0FMTF9ST0hDX0lOU1RfQyAgICAgICAgICAgICAgICAoMHg0M0MgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBCQ2FzdCBzZWN1cml0eSBhZGQgcHJvZ3JhbSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfQkNBU1RfU0VDX0FERF9QUk9HUkFNX0lORk9fQyAgICAgICAgICAgICAgICAoMHg0M0QgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBCQ2FzdCBzZWN1cml0eSBhZGQgcHJvZ3JhbSBjb21wbGV0ZSAqLworI2RlZmluZSBMT0dfQkNBU1RfU0VDX0FERF9QUk9HUkFNX0NPTVBMRVRFX0MgICAgICAgICAgICAoMHg0M0UgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBCQ2FzdCBzZWN1cml0eSBTRFAgcGFyc2UgKi8KKyNkZWZpbmUgTE9HX0JDQVNUX1NFQ19TRFBfUEFSU0VfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4NDNGICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBNRSBkeW5hbWljIHBvd2VyIG9wdGltaXphdGlvbiBzdGF0dXMgKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUVfRFBPX1NUQVRVU19DICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDQwICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIG9uIGRlbWFuZCBzZXNzaW9uIHN0YXJ0ICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fT05fREVNQU5EX1NFU1NJT05fU1RBUlRfQyAgICAgICAgICgweDQ0MSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBvbiBkZW1hbmQgc2Vzc2lvbiBzdG9wICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fT05fREVNQU5EX1NFU1NJT05fU1RPUF9DICAgICAgICAgICgweDQ0MiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBvbiBkZW1hbmQgc2Vzc2lvbiBub3Qgc3RhcnRlZCAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX09OX0RFTUFORF9TRVNTSU9OX05PVF9TVEFSVEVEX0MgICAoMHg0NDMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gZXh0ZXJuIGNvYXJzZSBwb3NpdGlvbiBpbmplY3Qgc3RhcnQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9FWFRFUk5fQ09BUlNFX1BPU19JTkpfU1RBUlRfQyAgICAgKDB4NDQ0ICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIElTREItVCBUTUNDIGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19EVFZfSVNEQl9UTUNDX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0NSArIExPR18xWF9CQVNFX0MpCisKKy8qIFJGIGRldmVsb3BtZW50ICovCisjZGVmaW5lIExPR19SRl9ERVZfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0NiArIExPR18xWF9CQVNFX0MpCisKKy8qIFJGIFJGTSBBUEkgKi8KKyNkZWZpbmUgTE9HX1JGX1JGTV9BUElfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDQ3ICsgTE9HXzFYX0JBU0VfQykKKworLyogUkYgUkZNIHN0YXRlICovCisjZGVmaW5lIExPR19SRl9SRk1fU1RBVEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0OCArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIFdhcm11cCAqLworI2RlZmluZSBMT0dfMVhfUkZfV0FSTVVQX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NDkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxWCBSRiBwb3dlciBsaW1pdGluZyAqLworI2RlZmluZSBMT0dfMVhfUkZfUFdSX0xNVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NEEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxWCBSRiBzdGF0ZSAqLworI2RlZmluZSBMT0dfMVhfUkZfU1RBVEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NEIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxWCBSRiBzbGVlcCAqLworI2RlZmluZSBMT0dfMVhfUkZfU0xFRVBfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NEMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxWCBSRiBUWCBzdGF0ZSAqLworI2RlZmluZSBMT0dfMVhfUkZfVFhfU1RBVEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NEQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxWCBSRiBJbnRlbGxpQ2VpdmVyIHN0YXRlICovCisjZGVmaW5lIExPR18xWF9SRl9JTlRfU1RBVEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0RSArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIFJYIEFEQyBjbG9jayAqLworI2RlZmluZSBMT0dfMVhfUkZfUlhfQURDX0NMS19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NEYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxWCBSRiBMTkEgc3dpdGNoIHBvaW50ICovCisjZGVmaW5lIExPR18xWF9SRl9MTkFfU1dJVENIUF9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ1MCArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIFJYIGNhbGlicmF0aW9uICovCisjZGVmaW5lIExPR18xWF9SRl9SWF9DQUxfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ1MSArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIEFQSSAqLworI2RlZmluZSBMT0dfMVhfUkZfQVBJX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NTIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxWCBSRiBSWCBQTEwgbG9ja2luZyBzdGF0dXMgKi8KKyNkZWZpbmUgTE9HXzFYX1JGX1JYX1BMTF9MT0NLX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDUzICsgTE9HXzFYX0JBU0VfQykKKworLyogMVggUkYgdm9sdGFnZSByZWd1bGF0b3IgKi8KKyNkZWZpbmUgTE9HXzFYX1JGX1ZSRUdfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDU0ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBESUFHIHN1Y2Nlc3NmdWwgZml4IGNvdW50ICovCisjZGVmaW5lIExPR19DR1BTX0RJQUdfU1VDQ0VTU0ZVTF9GSVhfQ09VTlRfQyAgICAgICAgICAgICgweDQ1NSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUMgdHJhY2sgZHluYW1pYyBwb3dlciBvcHRpbWl6YXRpb24gc3RhdHVzICovCisjZGVmaW5lIExPR19DR1BTX01DX1RSQUNLX0RQT19TVEFUVVNfQyAgICAgICAgICAgICAgICAgICgweDQ1NiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUMgU0JBUyBkZW1vZHVsYXRlZCBiaXRzICovCisjZGVmaW5lIExPR19DR1BTX01DX1NCQVNfREVNT0RfQklUU19DICAgICAgICAgICAgICAgICAgICgweDQ1NyArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUMgU0JBUyBkZW1vZHVsYXRlZCBzb2Z0IHN5bWJvbHMgKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUNfU0JBU19ERU1PRF9TT0ZUX1NZTUJPTFNfQyAgICAgICAgICAgKDB4NDU4ICsgTE9HXzFYX0JBU0VfQykKKworLyogRGF0YSBTZXJ2aWNlcyBQUFAgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBMT0dfRFNfUFBQX0NPTkZJR19QQVJBTVNfQyAgICAgICAgICAgICAgICAgICAgICAoMHg0NTkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEYXRhIFNlcnZpY2VzIHBoeXNpY2FsIGxpbmsgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBMT0dfRFNfUEhZU19MSU5LX0NPTkZJR19QQVJBTVNfQyAgICAgICAgICAgICAgICAoMHg0NUEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEYXRhIFNlcnZpY2VzIFBQUCBkZXZpY2UgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBMT0dfUFNfUFBQX0RFVl9DT05GSUdfUEFSQU1TX0MgICAgICAgICAgICAgICAgICAoMHg0NUIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gR1BTIHN0YXRlIGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fR1BTX1NUQVRFX0lORk9fQyAgICAgICAgICAgICAgICAgICgweDQ1QyArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBFWFQgc3RhdHVzIEdQUyBzdGF0ZSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX0VYVF9TVEFUVVNfR1BTX1NUQVRFX0lORk9fQyAgICAgICAoMHg0NUQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIE1FIFJhcGlkIFNlYXJjaCBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUVfUkFQSURfU0VBUkNIX1JFUE9SVF9DICAgICAgICAgICAgICAgKDB4NDVFICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIFhUUkEtVCBzZXNzaW9uICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fWFRSQV9UX1NFU1NJT05fQyAgICAgICAgICAgICAgICAgICgweDQ1RiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBYVFJBLVQgdXBsb2FkICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fWFRSQV9UX1VQTE9BRF9DICAgICAgICAgICAgICAgICAgICgweDQ2MCArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgV2lwZXIgUG9zaXRpb24gUmVwb3J0ICovCisjZGVmaW5lIExPR19DR1BTX1dJUEVSX1BPU0lUSU9OX1JFUE9SVF9DICAgICAgICAgICAgICAgICgweDQ2MSArIExPR18xWF9CQVNFX0MpCisKKy8qIERUViBEVkJIIFNlY3VyaXR5IFNtYXJ0Q2FyZCBIVFRQIERpZ2VzdCBSZXF1ZXN0IEluZm8gKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19IVFRQX0RJR0VTVF9SRVFfQyAgICAgICAgICAgKDB4NDYyICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIEhUVFAgRGlnZXN0IFJlc3BvbnNlIEluZm8gKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19IVFRQX0RJR0VTVF9SU1BfQyAgICAgICAgICAgKDB4NDYzICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIFNlcnZpY2VzIFJlZ2lzdHJhdGlvbiBSZXF1ZXN0IEluZm8gKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19TVkNfUkVHX1JFUV9DICAgICAgICAgICAgICAgKDB4NDY0ICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIFNlcnZpY2VzIFJlZ2lzdHJhdGlvbiBDb21wbGV0ZSBJbmZvICovCisjZGVmaW5lIExPR19EVFZfRFZCSF9TRUNfU0NfU1ZDX1JFR19DT01QTEVURV9DICAgICAgICAgICgweDQ2NSArIExPR18xWF9CQVNFX0MpCisKKy8qIERUViBEVkJIIFNlY3VyaXR5IFNtYXJ0Q2FyZCBTZXJ2aWNlcyBEZXJlZ2lzdHJhdGlvbiBSZXF1ZXN0IEluZm8gKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19TVkNfREVSRUdfUkVRX0MgICAgICAgICAgICAgKDB4NDY2ICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIFNlcnZpY2VzIERlcmVnaXN0cmF0aW9uIENvbXBsZXRlIEluZm8gKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19TVkNfREVSRUdfQ09NUExFVEVfQyAgICAgICAgKDB4NDY3ICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIExUS00gUmVxdWVzdCBJbmZvICovCisjZGVmaW5lIExPR19EVFZfRFZCSF9TRUNfU0NfTFRLTV9SRVFfQyAgICAgICAgICAgICAgICAgICgweDQ2OCArIExPR18xWF9CQVNFX0MpCisKKy8qIERUViBEVkJIIFNlY3VyaXR5IFNtYXJ0Q2FyZCBMVEtNIFJlcXVlc3QgQ29tcGxldGUgSW5mbyAqLworI2RlZmluZSBMT0dfRFRWX0RWQkhfU0VDX1NDX0xUS01fUkVRX0NPTVBMRVRFX0MgICAgICAgICAoMHg0NjkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEVFYgRFZCSCBTZWN1cml0eSBTbWFydENhcmQgUHJvZ3JhbSBTZWxlY3Rpb24gSW5mbyAqLworI2RlZmluZSBMT0dfRFRWX0RWQkhfU0VDX1NDX1BST0dfU0VMX0MgICAgICAgICAgICAgICAgICAoMHg0NkEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEVFYgRFZCSCBTZWN1cml0eSBTbWFydENhcmQgUHJvZ3JhbSBTZWxlY3Rpb24gQ29tcGxldGUgSW5mbyAqLworI2RlZmluZSBMT0dfRFRWX0RWQkhfU0VDX1NDX1BST0dfU0VMX0NPTVBMRVRFX0MgICAgICAgICAoMHg0NkIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEVFYgRFZCSCBTZWN1cml0eSBTbWFydENhcmQgTFRLTSAqLworI2RlZmluZSBMT0dfRFRWX0RWQkhfU0VDX1NDX0xUS01fQyAgICAgICAgICAgICAgICAgICAgICAoMHg0NkMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEVFYgRFZCSCBTZWN1cml0eSBTbWFydENhcmQgTFRLTSBWZXJpZmljYXRpb24gTWVzc2FnZSAqLworI2RlZmluZSBMT0dfRFRWX0RWQkhfU0VDX1NDX0xUS01fVkVSSUZJQ0FUSU9OX0MgICAgICAgICAoMHg0NkQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEVFYgRFZCSCBTZWN1cml0eSBTbWFydENhcmQgUGFyZW50YWwgQ29udHJvbCBNZXNzYWdlICovCisjZGVmaW5lIExPR19EVFZfRFZCSF9TRUNfU0NfUEFSRU5UQUxfQ1RSTF9DICAgICAgICAgICAgICgweDQ2RSArIExPR18xWF9CQVNFX0MpCisKKy8qIERUViBEVkJIIFNlY3VyaXR5IFNtYXJ0Q2FyZCBTVEtNICovCisjZGVmaW5lIExPR19EVFZfRFZCSF9TRUNfU0NfU1RLTV9DICAgICAgICAgICAgICAgICAgICAgICgweDQ2RiArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIFN0YXRpc3RpY3MgR2xvYmFsIFNvY2tldCAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9HTE9CQUxfU09DS19DICAgICAgICAgICAgICAgICAgICAgICAoMHg0NzAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBNQ1MgQXBwbGljYXRpb24gTWFuYWdlciAqLworI2RlZmluZSBMT0dfTUNTX0FQUE1HUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NzEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBNQ1MgTVNHUiAqLworI2RlZmluZSBMT0dfTUNTX01TR1JfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NzIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBNQ1MgUVRGICAqLworI2RlZmluZSBMT0dfTUNTX1FURl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NzMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTZW5zb3JzIFN0YXRpb25hcnkgRGV0ZWN0b3IgT3V0cHV0ICovCisjZGVmaW5lIExPR19TVEFUSU9OQVJZX0RFVEVDVE9SX09VVFBVVF9DICAgICAgICAgICAgICAgICgweDQ3NCArIExPR18xWF9CQVNFX0MpCisKKy8qIFByaW50IG91dCB0aGUgcHBtIGRhdGEgcG9ydGlvbiAgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9FWFRfU1RBVFVTX01FQVNfUkVQT1JUX1BQTV9DICAgICAgKDB4NDc1ICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBQb3NpdGlvbiBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0dOU1NfUE9TSVRJT05fUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgICAgKDB4NDc2ICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBHUFMgTWVhc3VyZW1lbnQgUmVwb3J0ICovCisjZGVmaW5lIExPR19HTlNTX0dQU19NRUFTVVJFTUVOVF9SRVBPUlRfQyAgICAgICAgICAgICAgICgweDQ3NyArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgQ2xvY2sgUmVwb3J0ICovCisjZGVmaW5lIExPR19HTlNTX0NMT0NLX1JFUE9SVF9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ3OCArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgRGVtb2QgU29mdCBEZWNpc2lvbiAqLworI2RlZmluZSBMT0dfR05TU19ERU1PRF9TT0ZUX0RFQ0lTSU9OU19DICAgICAgICAgICAgICAgICAoMHg0NzkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHTlNTIE1FIDVNUyBJUSBzdW0gKi8KKyNkZWZpbmUgTE9HX0dOU1NfTUVfNU1TX0lRX1NVTVNfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4NDdBICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBDRCBEQiByZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0dOU1NfQ0RfREJfUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDdCICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBQRSBXTFMgcG9zaXRpb24gcmVwb3J0ICovCisjZGVmaW5lIExPR19HTlNTX1BFX1dMU19QT1NJVElPTl9SRVBPUlRfQyAgICAgICAgICAgICAgICgweDQ3QyArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgUEUgS0YgcG9zaXRpb24gcmVwb3J0ICovCisjZGVmaW5lIExPR19HTlNTX1BFX0tGX1BPU0lUSU9OX1JFUE9SVF9DICAgICAgICAgICAgICAgICgweDQ3RCArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgUFJYIFJGIEhXIHN0YXR1cyByZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0dOU1NfUFJYX1JGX0hXX1NUQVRVU19SRVBPUlRfQyAgICAgICAgICAgICAgKDB4NDdFICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBEUlggUkYgSFcgc3RhdHVzIHJlcG9ydCAqLworI2RlZmluZSBMT0dfR05TU19EUlhfUkZfSFdfU1RBVFVTX1JFUE9SVF9DICAgICAgICAgICAgICAoMHg0N0YgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHTlNTIEdsb25hc3MgTWVhc3VyZW1lbnQgcmVwb3J0ICovCisjZGVmaW5lIExPR19HTlNTX0dMT05BU1NfTUVBU1VSRU1FTlRfUkVQT1JUX0MgICAgICAgICAgICgweDQ4MCArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgR1BTIEhCVyBSWEQgbWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgTE9HX0dOU1NfR1BTX0hCV19SWERfTUVBU1VSRU1FTlRfQyAgICAgICAgICAgICAgKDB4NDgxICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBQRFNNIHBvc2l0aW9uIHJlcG9ydCBjYWxsYmFjayAqLworI2RlZmluZSBMT0dfR05TU19QRFNNX1BPU0lUSU9OX1JFUE9SVF9DQUxMQkFDS19DICAgICAgICAoMHg0ODIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBJU2Vuc2UgUmVxdWVzdCBTdHJpbmcgICovCisjZGVmaW5lIExPR19JU0VOU0VfUkVRVUVTVF9TVFJfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDQ4MyArIExPR18xWF9CQVNFX0MpCisKKy8qIElTZW5zZSBSZXNwb25zZSBTdHJpbmcgKi8KKyNkZWZpbmUgTE9HX0lTRU5TRV9SRVNQT05TRV9TVFJfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4NDg0ICsgTE9HXzFYX0JBU0VfQykKKworLyogQmx1ZXRvb3RoIFNPQyBHZW5lcmFsIExvZyBQYWNrZXQqLworI2RlZmluZSBMT0dfQlRfU09DX0dFTkVSQUxfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0ODUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBRQ1JpbCBDYWxsIEZsb3cgKi8KKyNkZWZpbmUgTE9HX1FDUklMX0NBTExfRkxPV19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDg2ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBXaWRlYmFuZCBGRlQgc3RhdHMgKi8KKyNkZWZpbmUgTE9HX0NHUFNfV0JfRkZUX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDg3ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBTbG93IENsb2NrIENhbGlicmF0aW9uIFJlcG9ydCovCisjZGVmaW5lIExPR19DR1BTX1NMT1dfQ0xPQ0tfQ0FMSUJfUkVQT1JUX0MgICAgICAgICAgICAgICgweDQ4OCArIExPR18xWF9CQVNFX0MpCisKKy8qIFNOUyBHUFMgVElNRVNUQU1QICovCisjZGVmaW5lIExPR19TTlNfR1BTX1RJTUVTVEFNUF9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ4OSArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgU2VhcmNoIFN0cmF0ZWd5IFRhc2sgQWxsb2NhdGlvbiAqLworI2RlZmluZSBMT0dfR05TU19TRUFSQ0hfU1RSQVRFR1lfVEFTS19BTExPQ0FUSU9OX0MgICAgICAoMHg0OEEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSRiBNQyBTVE0gc3RhdGUgKi8KKyNkZWZpbmUgTE9HXzFYSERSX01DX1NUQVRFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDhCICsgTE9HXzFYX0JBU0VfQykKKworLyogUmVjb3JkIGluIHRoZSBTcGFyc2UgTmV0d29yayBEQiAqLworI2RlZmluZSBMT0dfQ0dQU19TTkRCX1JFQ09SRF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0OEMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSZWNvcmQgcmVtb3ZlZCBmcm9tIHRoZSBEQiAqLworI2RlZmluZSBMT0dfQ0dQU19TTkRCX1JFTU9WRV9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0OEQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFJlc2VydmVkICovCisjZGVmaW5lIExPR19HTlNTX0NDX1BFUkZPUk1BTkNFX1NUQVRTX0MgICAgICAgICAgICAgICAgICgweDQ4RSArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgUERTTSBTZXQgUGFyYW1lcnRlcnMgKi8KKyNkZWZpbmUgTE9HX0dOU1NfUERTTV9TRVRfUEFSQU1FVEVSU19DICAgICAgICAgICAgICAgICAgKDB4NDhGICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBQRFNNIFBEIEV2ZW50IENhbGxiYWNrICovCisjZGVmaW5lIExPR19HTlNTX1BEU01fUERfRVZFTlRfQ0FMTEJBQ0tfQyAgICAgICAgICAgICAgICgweDQ5MCArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgUERTTSBQQSBFdmVudCBDYWxsYmFjayAqLworI2RlZmluZSBMT0dfR05TU19QRFNNX1BBX0VWRU5UX0NBTExCQUNLX0MgICAgICAgICAgICAgICAoMHg0OTEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFJlc2VydmVkICovCisjZGVmaW5lIExPR19DR1BTX1JFU0VSVkVEMl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ5MiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUkVTRVJWRUQzX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDkzICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBQRFNNIEVYVCBTdGF0dXMgTUVBUyBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0dOU1NfUERTTV9FWFRfU1RBVFVTX01FQVNfUkVQT1JUX0MgICAgICAgICAgKDB4NDk0ICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBTTSBFcnJvciAqLworI2RlZmluZSBMT0dfR05TU19TTV9FUlJPUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0OTUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBXTEFOIFNjYW4gKi8KKyNkZWZpbmUgTE9HX1dMQU5fU0NBTl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDk2ICsgTE9HXzFYX0JBU0VfQykKKworLyogV0xBTiBJQlNTICovCisjZGVmaW5lIExPR19XTEFOX0lCU1NfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ5NyArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gODAyLjExZCovCisjZGVmaW5lIExPR19XTEFOXzgwMjExRF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ5OCArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gSGFuZG9mZiAqLworI2RlZmluZSBMT0dfV0xBTl9IQU5ET0ZGX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0OTkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBXTEFOIFFvUyBFRENBICovCisjZGVmaW5lIExPR19XTEFOX1FPU19FRENBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ5QSArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gQmVhY29uIFVwZGF0ZSAqLworI2RlZmluZSBMT0dfV0xBTl9CRUFDT05fVVBEQVRFX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHg0OUIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBXTEFOIFBvd2VyIHNhdmUgd293IGFkZCBwYXR0ZXJuICovCisjZGVmaW5lIExPR19XTEFOX1BPV0VSU0FWRV9XT1dfQUREX1BUUk5fQyAgICAgICAgICAgICAgICgweDQ5QyArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gV0NNIGxpbmsgbWV0cmljcyAqLworI2RlZmluZSBMT0dfV0xBTl9XQ01fTElOS01FVFJJQ1NfQyAgICAgICAgICAgICAgICAgICAgICAoMHg0OUQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBXTEFOIHdwcyBzY2FuIGNvbXBsZXRlKi8KKyNkZWZpbmUgTE9HX1dMQU5fV1BTX1NDQU5fQ09NUExFVEVfQyAgICAgICAgICAgICAgICAgICAgKDB4NDlFICsgTE9HXzFYX0JBU0VfQykKKworLyogV0xBTiBXUFMgV1NDIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX1dMQU5fV1BTX1dTQ19NRVNTQUdFX0MgICAgICAgICAgICAgICAgICAgICAgKDB4NDlGICsgTE9HXzFYX0JBU0VfQykKKworLyogV0xBTiBXUFMgY3JlZGVudGlhbHMgKi8KKyNkZWZpbmUgTE9HX1dMQU5fV1BTX0NSRURFTlRJQUxTX0MgICAgICAgICAgICAgICAgICAgICAgKDB4NEEwICsgTE9HXzFYX0JBU0VfQykKKworLyogV0xBTiBMaW5rbGF5ZXIgc3RhdCovCisjZGVmaW5lIExPR19XTEFOX0xJTktMQVlFUl9TVEFUX0MgICAgICAgICAgICAgICAgICAgICAgICgweDRBMSArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gUW9zIFRTcGVjKi8KKyNkZWZpbmUgTE9HX1dMQU5fUU9TX1RTUEVDX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NEEyICsgTE9HXzFYX0JBU0VfQykKKworLyogUE1JQyBWcmVnIENvbnRyb2wgKi8KKyNkZWZpbmUgTE9HX1BNX1ZSRUdfQ09OVFJPTF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NEEzICsgTE9HXzFYX0JBU0VfQykKKworLyogUE1JQyBWcmVnIExldmVsICovCisjZGVmaW5lIExPR19QTV9WUkVHX0xFVkVMX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDRBNCArIExPR18xWF9CQVNFX0MpCisKKy8qIFBNSUMgVnJlZyBTdGF0ZSAqLworI2RlZmluZSBMT0dfUE1fVlJFR19TVEFURV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QTUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFNNIEVQSCBSYW5kb21pemF0aW9uIGluZm8gKi8KKyNkZWZpbmUgTE9HX0NHUFNfU01fRVBIX1JBTkRPTUlaQVRJT05fSU5GT19DICAgICAgICAgICAgKDB4NEE2ICsgTE9HXzFYX0JBU0VfQykKKworLyogQXVkaW8gY2FsaWJyYXRpb24gZGF0YSAqLworI2RlZmluZSBMT0dfUUFDVF9EQVRBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QTcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDb21wYXNzIDJEIFRyYWNrZWQgQ2FsaWJyYXRpb24gU2V0ICovCisjZGVmaW5lIExPR19TTlNfVkNQU18yRF9UUkFDS0VEX0NBTF9TRVQgICAgICAgICAgICAgICAgICgweDRBOCArIExPR18xWF9CQVNFX0MpCisKKy8qIENvbXBhc3MgM0QgVHJhY2tlZCBDYWxpYnJhdGlvbiBTZXQgICovCisjZGVmaW5lIExPR19TTlNfVkNQU18zRF9UUkFDS0VEX0NBTF9TRVQgICAgICAgICAgICAgICAgICgweDRBOSArIExPR18xWF9CQVNFX0MpCisKKy8qIENhbGlicmF0aW9uIG1ldHJpYyAqLworI2RlZmluZSBMT0dfU05TX1ZDUFNfQ0FMX01FVFJJQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QUEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBBY2NlbGVyb21ldGVyIGRpc3RhbmNlICovCisjZGVmaW5lIExPR19TTlNfVkNQU19BQ0NFTF9ESVNUICAgICAgICAgICAgICAgICAgICAgICAgICgweDRBQiArIExPR18xWF9CQVNFX0MpCisKKy8qIFBsYW5lIHVwZGF0ZSAqLworI2RlZmluZSBMT0dfU05TX1ZDUFNfUExBTkVfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAoMHg0QUMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBMb2NhdGlvbiByZXBvcnQgICovCisjZGVmaW5lIExPR19TTlNfVkNQU19MT0NfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICgweDRBRCArIExPR18xWF9CQVNFX0MpCisKKy8qIENNIEFjdGl2ZSBzdWJzY3JpcHRpb24gKi8KKyNkZWZpbmUgTE9HX0NNX1BIX0VWRU5UX1NVQlNDUklQVElPTl9QUkVGX0lORk9fQyAgICAgICAgKDB4NEFFICsgTE9HXzFYX0JBU0VfQykKKworLyogRFNEUyB2ZXJzaW9uIG9mIENNIGNhbGwgZXZlbnQgKi8KKyNkZWZpbmUgTE9HX0NNX0RTX0NBTExfRVZFTlRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NEFGICsgTE9HXzFYX0JBU0VfQykKKworLyogU2Vuc29ycyA/TW9iaVNlbnMgT3V0cHV0ICovCisjZGVmaW5lIExPR19NT0JJU0VOU19PVVRQVVRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDRCMCArIExPR18xWF9CQVNFX0MpCisKKy8qIEFjY2VsZXJvbWV0ZXIgRGF0YSAgICovCisjZGVmaW5lIExPR19BQ0NFTF9EQVRBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDRCMSArIExPR18xWF9CQVNFX0MpCisKKy8qIEFjY2VsZXJvbWV0ZXIgQ29tcGVuc2F0ZWQgRGF0YSAgKi8KKyNkZWZpbmUgTE9HX0FDQ0VMX0NPTVBfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NEIyICsgTE9HXzFYX0JBU0VfQykKKworLyogTW90aW9uIFN0YXRlIERhdGEgICovCisjZGVmaW5lIExPR19NT1RJT05fU1RBVEVfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDRCMyArIExPR18xWF9CQVNFX0MpCisKKy8qIFN0YXRpb25hcnkgUG9zaXRpb24gSW5kaWNhdG9yICAqLworI2RlZmluZSBMT0dfU1RBVF9QT1NfSU5EX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QjQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBNb3Rpb24gU3RhdGUgRmVhdHVyZXMgICAqLworI2RlZmluZSBMT0dfTU9USU9OX1NUQVRFX0ZFQVRVUkVTX0MgICAgICAgICAgICAgICAgICAgICAoMHg0QjUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBNb3Rpb24gU3RhdGUgSGFyZCBEZWNpc2lvbiAqLworI2RlZmluZSBMT0dfTU9USU9OX1NUQVRFX0hBUkRfREVDSVNJT05fQyAgICAgICAgICAgICAgICAoMHg0QjYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBNb3Rpb24gU3RhdGUgU29mdCBEZWNpc2lvbiAqLworI2RlZmluZSBMT0dfTU9USU9OX1NUQVRFX1NPRlRfREVDSVNJT05fQyAgICAgICAgICAgICAgICAoMHg0QjcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTZW5zb3JzIFNvZnR3YXJlIFZlcnNpb24gKi8KKyNkZWZpbmUgTE9HX1NFTlNPUlNfU09GVFdBUkVfVkVSU0lPTl9DICAgICAgICAgICAgICAgICAgKDB4NEI4ICsgTE9HXzFYX0JBU0VfQykKKworLyogTW9iaVNlbnMgU3RhdGlvbmFyeSBQb3NpdGlvbiBJbmRpY2F0b3IgTG9nIFBhY2tldCAqLworI2RlZmluZSBMT0dfTU9CSVNFTlNfU1BJX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QjkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBYTyBjYWxpYnJhdGlvbiByYXcgSVEgZGF0YSAqLworI2RlZmluZSBMT0dfWE9fSVFfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QkEgKyBMT0dfMVhfQkFTRV9DKQorCisvKkRUViBDTU1CIENvbnRyb2wgVGFibCBVcGRhdGVkKi8KKyNkZWZpbmUgTE9HX0RUVl9DTU1CX0NPTlRST0xfVEFCTEVfVVBEQVRFICAgICAgICAgICAgICAgICAgKCgweDRCQikgKyBMT0dfMVhfQkFTRV9DKQorCisvKkRUViBDTU1CIE1lZGlhIEFQSSBCdWZmZXJpbmcgU3RhdHVzKi8KKyNkZWZpbmUgTE9HX0RUVl9DTU1CX01FRElBX0JVRkZFUklOR19TVEFUVVMgICAgICAgICAgICAgICAgKCgweDRCQykgKyBMT0dfMVhfQkFTRV9DKQorCisvKkRUViBDTU1CICpFbWVyZ2VuY3kgQnJvYWRjYXN0IERhdGEqLworI2RlZmluZSBMT0dfRFRWX0NNTUJfQ09OVFJPTF9FTUVSR0VOQ1lfQkNBU1QgICAgICAgICAgICAgKCgweDRCRCkgKyBMT0dfMVhfQkFTRV9DKQorCisvKkRUViBDTU1CIEVNTS9FQ00gRGF0YSovCisjZGVmaW5lIExPR19EVFZfQ01NQl9DQVNfRU1NX0VDTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0QkUpICsgTE9HXzFYX0JBU0VfQykKKworLypEVFYgQ01NQiBIVyBTdGF0dXMqLworI2RlZmluZSBMT0dfRFRWX0NNTUJfSFdfUEVSRk9STUFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRCRikgKyBMT0dfMVhfQkFTRV9DKQorCisvKkRUViBDTU1CIEVTU0cgUHJvZ3JhbSBJbmRpY2F0aW9uIEluZm9ybWF0aW9uKi8KKyNkZWZpbmUgTE9HX0RUVl9DTU1CX0VTR19QUk9HUkFNX0lORElDQVRJT05fSU5GT1JNQVRJT04gICAgKCgweDRDMCkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTZW5zb3JzIKhDIGJpbmFyeSBvdXRwdXQgb2YgY29udmVydGVkIHNlbnNvciBkYXRhICovCisjZGVmaW5lIExPR19DT05WRVJURURfU0VOU09SX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRDMSkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDTSBTdWJzY3JpcHRpb24gZXZlbnQgKi8KKyNkZWZpbmUgTE9HX0NNX1NVQlNDUklQVElPTl9FVkVOVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEMyKSArIExPR18xWF9CQVNFX0MpCisKKy8qIFNlbnNvciBBbWJpZW50IExpZ2h0IERhdGEgKi8KKyNkZWZpbmUgTE9HX1NOU19BTFNfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0QzMpICsgTE9HXzFYX0JBU0VfQykKKworLypTZW5zb3IgQW1iaWVudCBMaWdodCBBZGFwdGl2ZSBEYXRhICovCisjZGVmaW5lIExPR19TTlNfQUxTX0RBVEFfQURBUFRJVkVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0QzQpICsgTE9HXzFYX0JBU0VfQykKKworLypTZW5zb3IgUHJveGltaXR5IERpc3RhbmNlIERhdGEgKi8KKyNkZWZpbmUgTE9HX1NOU19QUlhfRElTVF9EQVRBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRDNSkgKyBMT0dfMVhfQkFTRV9DKQorCisvKlNlbnNvciBQcm94aW1pdHkgRGF0YSAqLworI2RlZmluZSBMT0dfU05TX1BSWF9EQVRBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEM2KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0dOU1NfU0JBU19SRVBPUlRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRDNykgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19DUFVfTU9OSVRPUl9NT0RFTV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0QzgpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfQ1BVX01PTklUT1JfQVBQU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEM5KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0JMQVNUX1RBU0tQUk9GSUxFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRDQSkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19CTEFTVF9TWVNQUk9GSUxFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0Q0IpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfRk1fUkFESU9fRlRNX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NENDKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0ZNX1JBRElPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRDRCkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19VSU1fRFNfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0Q0UpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfUU1JX0NBTExfRkxPV19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NENGKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0FQUl9NT0RFTV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDREMCkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19BUFJfQVBQU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0RDEpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfQVBSX0FEU1BfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEQyKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0RBVEFfTVVYX1JYX1JBV19QQUNLRVRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDREMykgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19EQVRBX01VWF9UWF9SQVdfUEFDS0VUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0RDQpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfREFUQV9NVVhfUlhfRlJBTUVfUEFDS0VUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEQ1KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0RBVEFfTVVYX1RYX0ZSQU1FX1BBQ0tFVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRENikgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19DR1BTX1BEU01fRVhUX1NUQVRVU19QT1NfSU5KX1JFUV9JTkZPX0MgICAgICAgICAgICAgICAgICgoMHg0RDcpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfVEVNUEVSQVRVUkVfTU9OSVRPUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEQ4KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1NOU19HRVNUVVJFU19SRVNUX0RFVEVDVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDREOSkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19TTlNfR0VTVFVSRVNfT1JJRU5UQVRJT05fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0REEpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfU05TX0dFU1RVUkVTX0ZBQ0lOR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NERCKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1NOU19HRVNUVVJFU19CQVNJQ19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDREQykgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19TTlNfR0VTVFVSRVNfSElOQllFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0REQpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfR05TU19PRU1EUkVfTUVBU1VSRU1FTlRfUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NERFKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0dOU1NfT0VNRFJFX1BPU0lUSU9OX1JFUE9SVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRFMCkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19HTlNTX09FTURSRV9TVlBPTFlfUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0RTEpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfR05TU19PRU1EUlNZTkNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEUyKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1NOU19NR1JfRVZFTlRfTk9USUZZX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRFMykgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19TTlNfTUdSX0VWRU5UX1JFR0lTVEVSX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0RTQpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfR05TU19QRFNNX1BQTV9TRVNTSU9OX0JFR0lOX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEU1KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0dOU1NfUERTTV9QUE1fU0VTU0lPTl9QUE1fU1VTUEVORF9DICAgICAgICAgICAgICAgICAgICAgKCgweDRFNikgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19HTlNTX1BEU01fUFBNX1JFUE9SVF9USFJPVFRMRURfQyAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0RTcpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfR05TU19QRFNNX1BQTV9SRVBPUlRfRklSRURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEU4KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0dOU1NfUERTTV9QUE1fU0VTU0lPTl9FTkRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRFOSkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19UUlNQX0RBVEFfU1RBTExfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg4MDEpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfV0xBTl9QS1RfTE9HX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4OEUwKSArIExPR18xWF9CQVNFX0MpCisKKy8qIFRoZSBsYXN0IGRlZmluZWQgRE1TUyBsb2cgY29kZSAqLworI2RlZmluZSBMT0dfMVhfTEFTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4OEUwKSArIExPR18xWF9CQVNFX0MpCisKKy8qIFRoaXMgaXMgb25seSBoZXJlIGZvciBvbGQgKHByZSBlcXVpcG1lbnQgSUQgdXBkYXRlKSBsb2dnaW5nIGNvZGUgKi8KKyNkZWZpbmUgTE9HX0xBU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBMT0dfMVhfTEFTVF9DICYgMHhGRkYgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBUFBTIExPRyBkZWZpbml0aW9uOgorICogVGhlIG1heCBudW1iZXIgb2YgMTYgbG9nIGNvZGVzIGlzIGFzc2lnbmVkIGZvciBBcHBzLgorICogVGhlIGxhc3QgYXBwcyBsb2cgY29kZSBjb3VsZCBiZSAweEIwMEYuCisgKiBCZWxvdyBkZWZpbml0aW9uIGlzIGNvbnNvbGlkYXRlZCBmcm9tIGxvZ19jb2Rlc19hcHBzLmgKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09ICAgQVBQUyBQcm9maWxpbmcgID09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBMT0dfQVBQU19TWVNQUk9GSUxFX0MgICAgICAgICAgICAgICAgICAgICAgICgweDAxICArIExPR19BUFBTX0JBU0VfQykKKyNkZWZpbmUgTE9HX0FQUFNfVEFTS1BST0ZJTEVfQyAgICAgICAgICAgICAgICAgICAgICAoMHgwMiAgKyBMT0dfQVBQU19CQVNFX0MpCisKKy8qIFRoZSBsYXN0IGRlZmluZWQgQVBQUyBsb2cgY29kZSAqLworLyogQ2hhbmdlIGl0IHRvICgweDAyICsgTE9HX0xURV9MQVNUX0MpIHRvIGFsbG93IExURSBsb2cgY29kZXMgKi8KKyNkZWZpbmUgTE9HX0FQUFNfTEFTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMiArIExPR19MVEVfTEFTVF9DKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2cgRXF1aXBtZW50IElEcy4KKyAqIFRoZSBudW1iZXIgaXMgcmVwcmVzZW50ZWQgYnkgNCBiaXRzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordHlwZWRlZiBlbnVtIHsKKwlMT0dfRVFVSVBfSURfT0VNID0gMCwgICAvKiAzcmQgcGFydHkgT0VNIChsaWNlbnNlZSkgdXNlICovCisJTE9HX0VRVUlQX0lEXzFYID0gMSwgICAgLyogVHJhZGl0aW9uYWwgMVggbGluZSBvZiBwcm9kdWN0cyAqLworCUxPR19FUVVJUF9JRF9SU1ZEMiA9IDIsCisJTE9HX0VRVUlQX0lEX1JTVkQzID0gMywKKwlMT0dfRVFVSVBfSURfV0NETUEgPSA0LAorCUxPR19FUVVJUF9JRF9HU00gPSA1LAorCUxPR19FUVVJUF9JRF9MQlMgPSA2LAorCUxPR19FUVVJUF9JRF9VTVRTID0gNywKKwlMT0dfRVFVSVBfSURfVERNQSA9IDgsCisJTE9HX0VRVUlQX0lEX0JPQSA9IDksCisJTE9HX0VRVUlQX0lEX0RUViA9IDEwLAorCUxPR19FUVVJUF9JRF9BUFBTID0gMTEsCisJTE9HX0VRVUlQX0lEX0RTUCA9IDEyLAorCisJTE9HX0VRVUlQX0lEX0xBU1RfREVGQVVMVCA9IExPR19FUVVJUF9JRF9EU1AKK30gbG9nX2VxdWlwX2lkX2VudW1fdHlwZTsKKworI2RlZmluZSBMT0dfRVFVSVBfSURfTUFYIDB4RiAgICAvKiBUaGUgZXF1aXBtZW50IElEIGlzIDQgYml0cyAqLworCisvKiBOb3RlIHRoYXQgdGhlc2UgYXJlIHRoZSBvZmZpY2lhbCB2YWx1ZXMgYW5kIGFyZSB1c2VkIGJ5IGRlZmF1bHQgaW4KKyAgIGRpYWd0dW5lLmguCisgKi8KKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzBfTEFTVF9DT0RFX0RFRkFVTFQgMAorI2RlZmluZSBMT0dfRVFVSVBfSURfMV9MQVNUX0NPREVfREVGQVVMVCBMT0dfMVhfTEFTVF9DCisjZGVmaW5lIExPR19FUVVJUF9JRF8yX0xBU1RfQ09ERV9ERUZBVUxUIDAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzNfTEFTVF9DT0RFX0RFRkFVTFQgMAorI2RlZmluZSBMT0dfRVFVSVBfSURfNF9MQVNUX0NPREVfREVGQVVMVCAwCisjZGVmaW5lIExPR19FUVVJUF9JRF81X0xBU1RfQ09ERV9ERUZBVUxUIDAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzZfTEFTVF9DT0RFX0RFRkFVTFQgMAorI2RlZmluZSBMT0dfRVFVSVBfSURfN19MQVNUX0NPREVfREVGQVVMVCAwCisjZGVmaW5lIExPR19FUVVJUF9JRF84X0xBU1RfQ09ERV9ERUZBVUxUIDAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzlfTEFTVF9DT0RFX0RFRkFVTFQgMAorI2RlZmluZSBMT0dfRVFVSVBfSURfMTBfTEFTVF9DT0RFX0RFRkFVTFQgMAorI2RlZmluZSBMT0dfRVFVSVBfSURfMTFfTEFTVF9DT0RFX0RFRkFVTFQgTE9HX0xURV9MQVNUX0MKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzEyX0xBU1RfQ09ERV9ERUZBVUxUIDAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzEzX0xBU1RfQ09ERV9ERUZBVUxUIDAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzE0X0xBU1RfQ09ERV9ERUZBVUxUIDAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzE1X0xBU1RfQ09ERV9ERUZBVUxUIDAKKworI2VuZGlmIC8qIExPR19DT0RFU19IICovCmRpZmYgLS1naXQgYS9jb3JlL3V0aWxzL2hvc3RfZGlhZ19sb2cvc3JjL2hvc3RfZGlhZ19sb2cuYyBiL2NvcmUvdXRpbHMvaG9zdF9kaWFnX2xvZy9zcmMvaG9zdF9kaWFnX2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDM1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL2hvc3RfZGlhZ19sb2cvc3JjL2hvc3RfZGlhZ19sb2cuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGSUxFOiAgICAgICAgIGhvc3RfZGlhZ19sb2cuYworCisgICBPVkVSVklFVzogICAgIFRoaXMgc291cmNlIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIFdMQU4gVVRJTCBkaWFnIEFQSXMKKworICAgREVQRU5ERU5DSUVTOgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJpX2hvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2V2ZW50LmgiCisjaW5jbHVkZSAid2xhbl9ubGlua19jb21tb24uaCIKKyNpbmNsdWRlICJjZHNfc2NoZWQuaCIKKyNpbmNsdWRlICJ3bGFuX3B0dF9zb2NrX3N2Yy5oIgorI2luY2x1ZGUgIndsYW5fbmxpbmtfc3J2LmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorCisjZGVmaW5lIFBUVF9NU0dfRElBR19DTURTX1RZUEUgICAoMHg1MDUwKQorCisjZGVmaW5lIERJQUdfVFlQRV9MT0dTICAgKDEpCisjZGVmaW5lIERJQUdfVFlQRV9FVkVOVFMgKDIpCisKKyNkZWZpbmUgRElBR19TV0FQMTYoQSkgKCgoKHVpbnQxNl90KShBKSAmIDB4ZmYwMCkgPj4gOCkgfCAoKCh1aW50MTZfdCkoQSkgJiAweDAwZmYpIDw8IDgpKQorCit0eXBlZGVmIHN0cnVjdCBldmVudF9yZXBvcnRfcyB7CisJdWludDMyX3QgZGlhZ190eXBlOworCXVpbnQxNl90IGV2ZW50X2lkOworCXVpbnQxNl90IGxlbmd0aDsKK30gZXZlbnRfcmVwb3J0X3Q7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgaG9zdF9kaWFnX2xvZ19zZXRfY29kZSgpIC0KKworICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBsb2dnaW5nIGNvZGUgaW4gdGhlIGdpdmVuIGxvZyByZWNvcmQuCisKKyAgIFxwYXJhbSAgLSBwdHIgLSBQb2ludGVyIHRvIHRoZSBsb2cgaGVhZGVyIHR5cGUuCisgICAgICAgICAgICAgIC0gY29kZSAtIGxvZyBjb2RlLgorICAgXHJldHVybiAtIE5vbmUKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGhvc3RfZGlhZ19sb2dfc2V0X2NvZGUodm9pZCAqcHRyLCB1aW50MTZfdCBjb2RlKQoreworCWlmIChwdHIpIHsKKwkJLyogQWxsIGxvZyBwYWNrZXRzIGFyZSByZXF1aXJlZCB0byBzdGFydCB3aXRoICdsb2dfaGVhZGVyX3R5cGUnICovCisJCSgobG9nX2hkcl90eXBlICopIHB0ciktPmNvZGUgPSBjb2RlOworCX0KK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFxicmllZiBob3N0X2RpYWdfbG9nX3NldF9sZW5ndGgoKSAtCisKKyAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgbGVuZ3RoIGZpZWxkIGluIHRoZSBnaXZlbiBsb2cgcmVjb3JkLgorCisgICBccGFyYW0gIC0gcHRyIC0gUG9pbnRlciB0byB0aGUgbG9nIGhlYWRlciB0eXBlLgorICAgICAgICAgICAgICAtIGxlbmd0aCAtIGxvZyBsZW5ndGguCisKKyAgIFxyZXR1cm4gLSBOb25lCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBob3N0X2RpYWdfbG9nX3NldF9sZW5ndGgodm9pZCAqcHRyLCB1aW50MTZfdCBsZW5ndGgpCit7CisJaWYgKHB0cikgeworCQkvKiBBbGwgbG9nIHBhY2tldHMgYXJlIHJlcXVpcmVkIHRvIHN0YXJ0IHdpdGggJ2xvZ19oZWFkZXJfdHlwZScgKi8KKwkJKChsb2dfaGRyX3R5cGUgKikgcHRyKS0+bGVuID0gKHVpbnQxNl90KSBsZW5ndGg7CisJfQorfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgXGJyaWVmIGhvc3RfZGlhZ19sb2dfc3VibWl0KCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBsb2cgZGF0YSB0byB0aGUgcHR0IHNvY2tldCBhcHAgb25seSBpZiBpdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGRyaXZlci4KKworICAgXHBhcmFtICAtIHB0ciAtIFBvaW50ZXIgdG8gdGhlIGxvZyBoZWFkZXIgdHlwZS4KKworICAgXHJldHVybiAtIE5vbmUKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGhvc3RfZGlhZ19sb2dfc3VibWl0KHZvaWQgKnBsb2dfaGRyX3B0cikKK3sKKwlsb2dfaGRyX3R5cGUgKnBIZHIgPSAobG9nX2hkcl90eXBlICopIHBsb2dfaGRyX3B0cjsKKwl0QW5pSGRyICp3bXNnID0gTlVMTDsKKwl1aW50OF90ICpwQnVmOworCXVpbnQxNl90IGRhdGFfbGVuOworCXVpbnQxNl90IHRvdGFsX2xlbjsKKworCWlmIChjZHNfaXNfbG9hZF91bmxvYWRfaW5fcHJvZ3Jlc3MoKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IFVubG9hZGluZy9Mb2FkaW5nIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobmxfc3J2X2lzX2luaXRpYWxpemVkKCkgIT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGNkc19pc19tdWx0aWNhc3RfbG9nZ2luZygpKSB7CisJCWRhdGFfbGVuID0gcEhkci0+bGVuOworCisJCXRvdGFsX2xlbiA9IHNpemVvZih0QW5pSGRyKSArIHNpemVvZih1aW50MzJfdCkgKyBkYXRhX2xlbjsKKworCQlwQnVmID0gKHVpbnQ4X3QgKikgY2RmX21lbV9tYWxsb2ModG90YWxfbGVuKTsKKworCQlpZiAoIXBCdWYpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgImNkZl9tZW1fbWFsbG9jIGZhaWxlZCIpOworCQkJcmV0dXJuOworCQl9CisKKwkJY2RmX21lbV96ZXJvKCh2b2lkICopcEJ1ZiwgdG90YWxfbGVuKTsKKworCQl3bXNnID0gKHRBbmlIZHIgKikgcEJ1ZjsKKwkJd21zZy0+dHlwZSA9IFBUVF9NU0dfRElBR19DTURTX1RZUEU7CisJCXdtc2ctPmxlbmd0aCA9IHRvdGFsX2xlbjsKKwkJd21zZy0+bGVuZ3RoID0gRElBR19TV0FQMTYod21zZy0+bGVuZ3RoKTsKKwkJcEJ1ZiArPSBzaXplb2YodEFuaUhkcik7CisKKwkJLyogIERpYWcgVHlwZSBldmVudHMgb3IgbG9nICovCisJCSoodWludDMyX3QgKikgcEJ1ZiA9IERJQUdfVFlQRV9MT0dTOworCQlwQnVmICs9IHNpemVvZih1aW50MzJfdCk7CisKKwkJbWVtY3B5KHBCdWYsIHBIZHIsIGRhdGFfbGVuKTsKKwkJcHR0X3NvY2tfc2VuZF9tc2dfdG9fYXBwICh3bXNnLCAwLCBBTklfTkxfTVNHX1BVTUFDLAorCQkJSU5WQUxJRF9QSUQpOworCQljZGZfbWVtX2ZyZWUoKHZvaWQgKil3bXNnKTsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIGhvc3RfZGlhZ19sb2dfd2xvY2soKSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIHdha2UgbG9jayBkaWFnIGV2ZW50cworICogQHJlYXNvbjogUmVhc29uIHdoeSB0aGUgd2FrZWxvY2sgd2FzIHRha2VuIG9yIHJlbGVhc2VkCisgKiBAd2FrZV9sb2NrX25hbWU6IEZ1bmN0aW9uIGluIHdoaWNoIHRoZSB3YWtlbG9jayB3YXMgdGFrZW4gb3IgcmVsZWFzZWQKKyAqIEB0aW1lb3V0OiBUaW1lb3V0IHZhbHVlIGluIGNhc2Ugb2YgdGltZWQgd2FrZWxvY2tzCisgKiBAc3RhdHVzOiBTdGF0dXMgZmllbGQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB3YWtlIGxvY2sgd2FzIHRha2VuL3JlbGVhc2VkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgd2FrZSBsb2NrIGRpYWcgZXZlbnRzIHRvIHVzZXIgc3BhY2UKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqCisgKi8KK3ZvaWQgaG9zdF9kaWFnX2xvZ193bG9jayh1aW50MzJfdCByZWFzb24sIGNvbnN0IGNoYXIgKndha2VfbG9ja19uYW1lLAorCQl1aW50MzJfdCB0aW1lb3V0LCB1aW50MzJfdCBzdGF0dXMpCit7CisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfREVGKHdsYW5fZGlhZ19ldmVudCwKKwkJCXN0cnVjdCBob3N0X2V2ZW50X3dsYW5fd2FrZV9sb2NrKTsKKworCWlmICgobmxfc3J2X2lzX2luaXRpYWxpemVkKCkgIT0gMCkgfHwKKwkgICAgKGNkc19pc193YWtlbG9ja19lbmFibGVkKCkgPT0gZmFsc2UpKQorCQlyZXR1cm47CisKKwl3bGFuX2RpYWdfZXZlbnQuc3RhdHVzID0gc3RhdHVzOworCXdsYW5fZGlhZ19ldmVudC5yZWFzb24gPSByZWFzb247CisJd2xhbl9kaWFnX2V2ZW50LnRpbWVvdXQgPSB0aW1lb3V0OworCXdsYW5fZGlhZ19ldmVudC5uYW1lX2xlbiA9IHN0cmxlbih3YWtlX2xvY2tfbmFtZSk7CisJc3RybGNweSgmd2xhbl9kaWFnX2V2ZW50Lm5hbWVbMF0sCisJCQl3YWtlX2xvY2tfbmFtZSwKKwkJCXdsYW5fZGlhZ19ldmVudC5uYW1lX2xlbisxKTsKKworCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmd2xhbl9kaWFnX2V2ZW50LCBFVkVOVF9XTEFOX1dBS0VfTE9DSyk7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBcYnJpZWYgaG9zdF9kaWFnX2V2ZW50X3JlcG9ydF9wYXlsb2FkKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBldmVudCBkYXRhIHRvIHRoZSBwdHQgc29ja2V0IGFwcCBvbmx5IGlmIGl0IGlzCisgICByZWdpc3RlcmVkIHdpdGggdGhlIGRyaXZlci4KKworICAgXHBhcmFtICAtIHB0ciAtIFBvaW50ZXIgdG8gdGhlIGxvZyBoZWFkZXIgdHlwZS4KKworICAgXHJldHVybiAtIE5vbmUKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGhvc3RfZGlhZ19ldmVudF9yZXBvcnRfcGF5bG9hZCh1aW50MTZfdCBldmVudF9JZCwgdWludDE2X3QgbGVuZ3RoLAorCQkJCSAgICB2b2lkICpwUGF5bG9hZCkKK3sKKwl0QW5pSGRyICp3bXNnID0gTlVMTDsKKwl1aW50OF90ICpwQnVmOworCWV2ZW50X3JlcG9ydF90ICpwRXZlbnRfcmVwb3J0OworCXVpbnQxNl90IHRvdGFsX2xlbjsKKworCWlmIChjZHNfaXNfbG9hZF91bmxvYWRfaW5fcHJvZ3Jlc3MoKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IFVubG9hZGluZy9Mb2FkaW5nIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLAorCQkJICBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobmxfc3J2X2lzX2luaXRpYWxpemVkKCkgIT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGNkc19pc19tdWx0aWNhc3RfbG9nZ2luZygpKSB7CisJCXRvdGFsX2xlbiA9IHNpemVvZih0QW5pSGRyKSArIHNpemVvZihldmVudF9yZXBvcnRfdCkgKyBsZW5ndGg7CisKKwkJcEJ1ZiA9ICh1aW50OF90ICopIGNkZl9tZW1fbWFsbG9jKHRvdGFsX2xlbik7CisKKwkJaWYgKCFwQnVmKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJjZGZfbWVtX21hbGxvYyBmYWlsZWQiKTsKKwkJCXJldHVybjsKKwkJfQorCQl3bXNnID0gKHRBbmlIZHIgKikgcEJ1ZjsKKwkJd21zZy0+dHlwZSA9IFBUVF9NU0dfRElBR19DTURTX1RZUEU7CisJCXdtc2ctPmxlbmd0aCA9IHRvdGFsX2xlbjsKKwkJd21zZy0+bGVuZ3RoID0gRElBR19TV0FQMTYod21zZy0+bGVuZ3RoKTsKKwkJcEJ1ZiArPSBzaXplb2YodEFuaUhkcik7CisKKwkJcEV2ZW50X3JlcG9ydCA9IChldmVudF9yZXBvcnRfdCAqKSBwQnVmOworCQlwRXZlbnRfcmVwb3J0LT5kaWFnX3R5cGUgPSBESUFHX1RZUEVfRVZFTlRTOworCQlwRXZlbnRfcmVwb3J0LT5ldmVudF9pZCA9IGV2ZW50X0lkOworCQlwRXZlbnRfcmVwb3J0LT5sZW5ndGggPSBsZW5ndGg7CisKKwkJcEJ1ZiArPSBzaXplb2YoZXZlbnRfcmVwb3J0X3QpOworCisJCW1lbWNweShwQnVmLCBwUGF5bG9hZCwgbGVuZ3RoKTsKKworCQlpZiAocHR0X3NvY2tfc2VuZF9tc2dfdG9fYXBwCisJCQkgICAgKHdtc2csIDAsIEFOSV9OTF9NU0dfUFVNQUMsIElOVkFMSURfUElEKSA8IDApIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIlB0dCBTb2NrZXQgZXJyb3Igc2VuZGluZyBtZXNzYWdlIHRvIHRoZSBhcHAhISIpOworCQkJY2RmX21lbV9mcmVlKCh2b2lkICopd21zZyk7CisJCQlyZXR1cm47CisJCX0KKworCQljZGZfbWVtX2ZyZWUoKHZvaWQgKil3bXNnKTsKKwl9CisKKwlyZXR1cm47CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvdXRpbHMvaG9zdF9kaWFnX2xvZy9zcmMvaV9ob3N0X2RpYWdfY29yZV9ldmVudC5oIGIvY29yZS91dGlscy9ob3N0X2RpYWdfbG9nL3NyYy9pX2hvc3RfZGlhZ19jb3JlX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0ZDBjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdXRpbHMvaG9zdF9kaWFnX2xvZy9zcmMvaV9ob3N0X2RpYWdfY29yZV9ldmVudC5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fSV9IT1NUX0RJQUdfQ09SRV9FVkVOVF9IICkKKyNkZWZpbmUgX19JX0hPU1RfRElBR19DT1JFX0VWRU5UX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBcZmlsZSAgaV9ob3N0X2RpYWdfY29yZV9ldmVudC5oCisKKyAgIFxicmllZiBBbmRyb2lkIHNwZWNpZmljIGRlZmluaXRpb25zIGZvciBXTEFOIFVUSUwgRElBRyBldmVudHMKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgSW5jbHVkZSBGaWxlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisjaW5jbHVkZSA8aG9zdF9kaWFnX2V2ZW50X2RlZnMuaD4KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCit2b2lkIGhvc3RfZGlhZ19ldmVudF9yZXBvcnRfcGF5bG9hZCh1aW50MTZfdCBldmVudF9JZCwgdWludDE2X3QgbGVuZ3RoLAorCQkJCSAgICB2b2lkICpwUGF5bG9hZCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgQWxsb2NhdGUgYW4gZXZlbnQgcGF5bG9hZCBob2xkZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdMQU5fSE9TVF9ESUFHX0VWRU5UX0RFRiggcGF5bG9hZF9uYW1lLCBwYXlsb2FkX3R5cGUgKSBcCisJcGF5bG9hZF90eXBlKHBheWxvYWRfbmFtZSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFJlcG9ydCB0aGUgZXZlbnQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCggcGF5bG9hZF9wdHIsIGV2X2lkICkgXAorCWRvIHsJCQkJCQkJXAorCQlob3N0X2RpYWdfZXZlbnRfcmVwb3J0X3BheWxvYWQoIGV2X2lkLAkJXAorCQkJCQkJc2l6ZW9mKCAqKHBheWxvYWRfcHRyKSApLAkJCVwKKwkJCQkJCSh2b2lkICopKHBheWxvYWRfcHRyKSApOwkJCVwKKwl9IHdoaWxlICgwKQorCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworI2RlZmluZSBXTEFOX0hPU1RfRElBR19FVkVOVF9ERUYoIHBheWxvYWRfbmFtZSwgcGF5bG9hZF90eXBlICkKKyNkZWZpbmUgV0xBTl9IT1NUX0RJQUdfRVZFTlRfUkVQT1JUKCBwYXlsb2FkX3B0ciwgZXZfaWQgKQorCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKK3ZvaWQgaG9zdF9kaWFnX2xvZ193bG9jayh1aW50MzJfdCByZWFzb24sIGNvbnN0IGNoYXIgKndha2VfbG9ja19uYW1lLAorCQl1aW50MzJfdCB0aW1lb3V0LCB1aW50MzJfdCBzdGF0dXMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBob3N0X2RpYWdfbG9nX3dsb2NrKHVpbnQzMl90IHJlYXNvbiwKKwkJY29uc3QgY2hhciAqd2FrZV9sb2NrX25hbWUsCisJCXVpbnQzMl90IHRpbWVvdXQsIHVpbnQzMl90IHN0YXR1cykKK3sKKworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKyNlbmRpZiAvKiBfX0lfSE9TVF9ESUFHX0NPUkVfRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9ob3N0X2RpYWdfbG9nL3NyYy9pX2hvc3RfZGlhZ19jb3JlX2xvZy5oIGIvY29yZS91dGlscy9ob3N0X2RpYWdfbG9nL3NyYy9pX2hvc3RfZGlhZ19jb3JlX2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NzBkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL2hvc3RfZGlhZ19sb2cvc3JjL2lfaG9zdF9kaWFnX2NvcmVfbG9nLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fSV9IT1NUX0RJQUdfQ09SRV9MT0dfSCApCisjZGVmaW5lIF9fSV9IT1NUX0RJQUdfQ09SRV9MT0dfSAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorI2luY2x1ZGUgPGxvZ19jb2Rlcy5oPgorI2VuZGlmCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgXGZpbGUgIGlfaG9zdF9kaWFnX2NvcmVfZXZlbnQuaAorCisgICBcYnJpZWYgYW5kcm9pZC1zcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgV0xBTiBVVElMIERJQUcgbG9ncworCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBJbmNsdWRlIEZpbGVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPGNkZl90eXBlcy5oPgorI2luY2x1ZGUgPGNkZl9tZW1vcnkuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGSVhNRSBUbyBiZSByZW1vdmVkIHdoZW4gRElBRyBzdXBwb3J0IGlzIGFkZGVkLiBUaGlzIGRlZmluaXRvbiBzaG91bGQgYmUgKi8KKy8qIHBpY2tlZCBmcm9tIGxvZy5oIGZpbGUgYWJvdmUuICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyogU3BlY2lmaWVzIHRoZSBsZW5ndGgsIGluIGJ5dGVzIG9mIHRoZSBlbnRyeSwgaW5jbHVkaW5nIHRoaXMgaGVhZGVyLiAqLworCXVpbnQxNl90IGxlbjsKKworCS8qIFNwZWNpZmllcyB0aGUgbG9nIGNvZGUgZm9yIHRoZSBlbnRyeSAqLworCXVpbnQxNl90IGNvZGU7CisKKwkvKlRpbWUgU3RhbXAgbG8gKi8KKwl1aW50MzJfdCB0c19sbzsKKworCS8qVGltZSBTdGFtcCBoaSAqLworCXVpbnQzMl90IHRzX2hpOworfSBfX3BhY2tlZCBsb2dfaGRyX3R5cGU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKK3ZvaWQgaG9zdF9kaWFnX2xvZ19zZXRfY29kZSh2b2lkICpwdHIsIHVpbnQxNl90IGNvZGUpOwordm9pZCBob3N0X2RpYWdfbG9nX3NldF9sZW5ndGgodm9pZCAqcHRyLCB1aW50MTZfdCBsZW5ndGgpOwordm9pZCBob3N0X2RpYWdfbG9nX3NldF90aW1lc3RhbXAodm9pZCAqcGxvZ19oZHJfcHRyKTsKK3ZvaWQgaG9zdF9kaWFnX2xvZ19zdWJtaXQodm9pZCAqcGxvZ19oZHJfcHRyKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEFsbG9jYXRlIGFuIGV2ZW50IHBheWxvYWQgaG9sZGVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFdMQU5fSE9TVF9ESUFHX0xPR19BTExPQyggcGF5bG9hZF9wdHIsIHBheWxvYWRfdHlwZSwgbG9nX2NvZGUgKQlcCisJZG8geyBcCisJCXBheWxvYWRfcHRyID0gKCBwYXlsb2FkX3R5cGUgKiljZGZfbWVtX21hbGxvYyhzaXplb2YocGF5bG9hZF90eXBlKSk7IFwKKwkJaWYocGF5bG9hZF9wdHIpIHsgXAorCQkJY2RmX21lbV96ZXJvKHBheWxvYWRfcHRyLCBzaXplb2YocGF5bG9hZF90eXBlKSk7IFwKKwkJCWhvc3RfZGlhZ19sb2dfc2V0X2NvZGUocGF5bG9hZF9wdHIsIGxvZ19jb2RlKTsgXAorCQkJaG9zdF9kaWFnX2xvZ19zZXRfbGVuZ3RoKHBheWxvYWRfcHRyLCBzaXplb2YocGF5bG9hZF90eXBlKSk7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFJlcG9ydCB0aGUgZXZlbnQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdMQU5fSE9TVF9ESUFHX0xPR19SRVBPUlQoIHBheWxvYWRfcHRyICkgXAorCWRvIHsgXAorCQlpZihwYXlsb2FkX3B0cikgeyBcCisJCQlob3N0X2RpYWdfbG9nX3N1Ym1pdCggcGF5bG9hZF9wdHIpOyBcCisJCQljZGZfbWVtX2ZyZWUocGF5bG9hZF9wdHIpOyBcCisJCX0gXAorCX0gd2hpbGUgKDApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBGcmVlIHRoZSBwYXlsb2FkCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXTEFOX0hPU1RfRElBR19MT0dfRlJFRSggcGF5bG9hZF9wdHIgKSBcCisJZG8JCQkJCSAgICBcCisJewkJCQlcCisJCWlmKCBwYXlsb2FkX3B0cikJICAgICAgXAorCQl7CQkJICAgICAgXAorCQkJY2RmX21lbV9mcmVlKHBheWxvYWRfcHRyKTsgXAorCQl9CQkJICAgICAgXAorCX0gd2hpbGUgKDApCisKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisjZGVmaW5lIFdMQU5fSE9TVF9ESUFHX0xPR19BTExPQyggcGF5bG9hZF9wdHIsIHBheWxvYWRfdHlwZSwgbG9nX2NvZGUgKQorI2RlZmluZSBXTEFOX0hPU1RfRElBR19MT0dfUkVQT1JUKCBwYXlsb2FkX3B0ciApCisjZGVmaW5lIFdMQU5fSE9TVF9ESUFHX0xPR19GUkVFKCBwYXlsb2FkX3B0ciApCisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisjZW5kaWYgLyogX19JX0hPU1RfRElBR19DT1JFX0xPR19IICovCmRpZmYgLS1naXQgYS9jb3JlL3V0aWxzL2xvZ2dpbmcvaW5jL3dsYW5fbG9nZ2luZ19zb2NrX3N2Yy5oIGIvY29yZS91dGlscy9sb2dnaW5nL2luYy93bGFuX2xvZ2dpbmdfc29ja19zdmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTA3MGFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS91dGlscy9sb2dnaW5nL2luYy93bGFuX2xvZ2dpbmdfc29ja19zdmMuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHdsYW5fbG9nZ2luZ19zb2NrX3N2Yy5oCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgV0xBTl9MT0dHSU5HX1NPQ0tfU1ZDX0gKKyNkZWZpbmUgV0xBTl9MT0dHSU5HX1NPQ0tfU1ZDX0gKKworI2luY2x1ZGUgPHdsYW5fbmxpbmtfc3J2Lmg+CisjaW5jbHVkZSA8Y2RmX3N0YXR1cy5oPgorI2luY2x1ZGUgPGNkZl90cmFjZS5oPgorI2luY2x1ZGUgPHdsYW5fbmxpbmtfY29tbW9uLmg+CisKK2ludCB3bGFuX2xvZ2dpbmdfc29ja19pbml0X3N2Yyh2b2lkKTsKK2ludCB3bGFuX2xvZ2dpbmdfc29ja19kZWluaXRfc3ZjKHZvaWQpOworaW50IHdsYW5fbG9nZ2luZ19zb2NrX2FjdGl2YXRlX3N2YyhpbnQgbG9nX2ZlX3RvX2NvbnNvbGUsIGludCBudW1fYnVmKTsKK2ludCB3bGFuX2xvZ2dpbmdfc29ja19kZWFjdGl2YXRlX3N2Yyh2b2lkKTsKK2ludCB3bGFuX2xvZ190b191c2VyKENERl9UUkFDRV9MRVZFTCBsb2dfbGV2ZWwsIGNoYXIgKnRvX2JlX3NlbnQsIGludCBsZW5ndGgpOwordm9pZCB3bGFuX2xvZ2dpbmdfc2V0X3Blcl9wa3Rfc3RhdHModm9pZCk7Cit2b2lkIHdsYW5fbG9nZ2luZ19zZXRfbG9nX2xldmVsKHZvaWQpOwordm9pZCB3bGFuX2xvZ2dpbmdfc2V0X2Z3X2ZsdXNoX2NvbXBsZXRlKHZvaWQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKK3ZvaWQgd2xhbl9yZXBvcnRfbG9nX2NvbXBsZXRpb24odWludDMyX3QgaXNfZmF0YWwsCisJCXVpbnQzMl90IGluZGljYXRvciwKKwkJdWludDMyX3QgcmVhc29uX2NvZGUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bGFuX3JlcG9ydF9sb2dfY29tcGxldGlvbih1aW50MzJfdCBpc19mYXRhbCwKKwkJdWludDMyX3QgaW5kaWNhdG9yLAorCQl1aW50MzJfdCByZWFzb25fY29kZSkKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworI2VuZGlmIC8qIFdMQU5fTE9HR0lOR19TT0NLX1NWQ19IICovCmRpZmYgLS1naXQgYS9jb3JlL3V0aWxzL2xvZ2dpbmcvc3JjL3dsYW5fbG9nZ2luZ19zb2NrX3N2Yy5jIGIvY29yZS91dGlscy9sb2dnaW5nL3NyYy93bGFuX2xvZ2dpbmdfc29ja19zdmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODJlMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS91dGlscy9sb2dnaW5nL3NyYy93bGFuX2xvZ2dpbmdfc29ja19zdmMuYwpAQCAtMCwwICsxLDgxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB3bGFuX2xvZ2dpbmdfc29ja19zdmMuYworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0xBTl9MT0dHSU5HX1NPQ0tfU1ZDX0VOQUJMRQorI2luY2x1ZGUgPHZtYWxsb2MuaD4KKyNpbmNsdWRlIDxjZHNfYXBpLmg+CisjaW5jbHVkZSA8d2xhbl9sb2dnaW5nX3NvY2tfc3ZjLmg+CisjaW5jbHVkZSA8a3RocmVhZC5oPgorI2luY2x1ZGUgPGNkZl90aW1lLmg+CisjaW5jbHVkZSA8d2xhbl9wdHRfc29ja19zdmMuaD4KKyNpbmNsdWRlICJwa3Rsb2dfYWMuaCIKKyNpbmNsdWRlIDxob3N0X2RpYWdfY29yZV9ldmVudC5oPgorCisjZGVmaW5lIExPR0dJTkdfVFJBQ0UobGV2ZWwsIGFyZ3MgLi4uKSBcCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBsZXZlbCwgIyMgYXJncykKKworLyogR2xvYmFsIHZhcmlhYmxlcyAqLworCisjZGVmaW5lIEFOSV9OTF9NU0dfTE9HX1RZUEUgODkKKyNkZWZpbmUgQU5JX05MX01TR19SRUFEWV9JTkRfVFlQRSA5MAorI2RlZmluZSBNQVhfTE9HTVNHX0xFTkdUSCA0MDk2CisKKyNkZWZpbmUgSE9TVF9MT0dfRFJJVkVSX01TRyAgICAgICAgMHgwMDEKKyNkZWZpbmUgSE9TVF9MT0dfUEVSX1BLVF9TVEFUUyAgICAgMHgwMDIKKyNkZWZpbmUgSE9TVF9MT0dfRldfRkxVU0hfQ09NUExFVEUgMHgwMDMKKworc3RydWN0IGxvZ19tc2cgeworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwl1bnNpZ25lZCBpbnQgcmFkaW87CisJdW5zaWduZWQgaW50IGluZGV4OworCS8qIGluZGljYXRlcyB0aGUgY3VycmVudCBmaWxsZWQgbG9nIGxlbmd0aCBpbiBsb2didWYgKi8KKwl1bnNpZ25lZCBpbnQgZmlsbGVkX2xlbmd0aDsKKwkvKgorCSAqIEJ1ZiB0byBob2xkIHRoZSBsb2cgbXNnCisJICogdEFuaUhkciArIGxvZworCSAqLworCWNoYXIgbG9nYnVmW01BWF9MT0dNU0dfTEVOR1RIXTsKK307CisKK3N0cnVjdCB3bGFuX2xvZ2dpbmcgeworCS8qIExvZyBGYXRhbCBhbmQgRVJST1IgdG8gY29uc29sZSAqLworCWJvb2wgbG9nX2ZlX3RvX2NvbnNvbGU7CisJLyogTnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgdXNlZCBmb3IgbG9nZ2luZyAqLworCWludCBudW1fYnVmOworCS8qIExvY2sgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHNoYXJlZCBsb2dnaW5nIHJlc291cmNlICovCisJc3BpbmxvY2tfdCBzcGluX2xvY2s7CisJLyogSG9sZHMgdGhlIGZyZWUgbm9kZSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZmlsbGluZyBsb2dzICovCisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2xpc3Q7CisJLyogSG9sZHMgdGhlIGZpbGxlZCBub2RlcyB3aGljaCBuZWVkcyB0byBiZSBpbmRpY2F0ZWQgdG8gQVBQICovCisJc3RydWN0IGxpc3RfaGVhZCBmaWxsZWRfbGlzdDsKKwkvKiBXYWl0IHF1ZXVlIGZvciBMb2dnZXIgdGhyZWFkICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsKKwkvKiBMb2dnZXIgdGhyZWFkICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp0aHJlYWQ7CisJLyogTG9nZ2luZyB0aHJlYWQgc2V0cyB0aGlzIHZhcmlhYmxlIG9uIGV4aXQgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBzaHV0ZG93bl9jb21wOworCS8qIEluZGljYXRlcyB0byBsb2dnZXIgdGhyZWFkIHRvIGV4aXQgKi8KKwlib29sIGV4aXQ7CisJLyogSG9sZHMgbnVtYmVyIG9mIGRyb3BwZWQgbG9ncyAqLworCXVuc2lnbmVkIGludCBkcm9wX2NvdW50OworCS8qIGN1cnJlbnQgbG9nYnVmIHRvIHdoaWNoIHRoZSBsb2cgd2lsbCBiZSBmaWxsZWQgdG8gKi8KKwlzdHJ1Y3QgbG9nX21zZyAqcGN1cl9ub2RlOworCS8qIEV2ZW50IGZsYWcgdXNlZCBmb3Igd2FrZXVwIGFuZCBwb3N0IGluZGljYXRpb24qLworCXVuc2lnbmVkIGxvbmcgZXZlbnRGbGFnOworCS8qIEluZGljYXRlcyBsb2dnZXIgdGhyZWFkIGlzIGFjdGl2YXRlZCAqLworCWJvb2wgaXNfYWN0aXZlOworCS8qIEZsdXNoIGNvbXBsZXRpb24gY2hlY2sgKi8KKwlib29sIGlzX2ZsdXNoX2NvbXBsZXRlOworfTsKKworc3RhdGljIHN0cnVjdCB3bGFuX2xvZ2dpbmcgZ3dsYW5fbG9nZ2luZzsKK3N0YXRpYyBzdHJ1Y3QgbG9nX21zZyAqZ3Bsb2dfbXNnOworCisvKiBQSUQgb2YgdGhlIEFQUCB0byBsb2cgdGhlIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgZ2FwcF9waWQgPSBJTlZBTElEX1BJRDsKKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBzZW5kIGEgbmV0bGluayBtZXNzYWdlIHRvIGFuIGFwcGxpY2F0aW9uCisgKiBpbiB1c2VyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZW5kX3NvY2tfbXNnX3RvX2FwcCh0QW5pSGRyICp3bXNnLCBpbnQgcmFkaW8sCisJCQkJICAgICBpbnQgc3JjX21vZCwgaW50IHBpZCkKK3sKKwlpbnQgZXJyID0gLTE7CisJaW50IHBheWxvYWRfbGVuOworCWludCB0b3RfbXNnX2xlbjsKKwl0QW5pTmxIZHIgKndubCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlpbnQgd21zZ19sZW5ndGggPSB3bXNnLT5sZW5ndGg7CisJc3RhdGljIGludCBubG1zZ19zZXE7CisKKwlpZiAocmFkaW8gPCAwIHx8IHJhZGlvID4gQU5JX01BWF9SQURJT1MpIHsKKwkJTE9HR0lOR19UUkFDRShDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAiJXM6IGludmFsaWQgcmFkaW8gaWQgWyVkXSIsIF9fZnVuY19fLCByYWRpbyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBheWxvYWRfbGVuID0gd21zZ19sZW5ndGggKyBzaXplb2Yod25sLT5yYWRpbyk7CisJdG90X21zZ19sZW4gPSBOTE1TR19TUEFDRShwYXlsb2FkX2xlbik7CisJc2tiID0gZGV2X2FsbG9jX3NrYih0b3RfbXNnX2xlbik7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCUxPR0dJTkdfVFJBQ0UoQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIiVzOiBkZXZfYWxsb2Nfc2tiKCkgZmFpbGVkIGZvciBtc2cgc2l6ZVslZF0iLAorCQkJICAgICAgX19mdW5jX18sIHRvdF9tc2dfbGVuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgbmxtc2dfc2VxKyssIHNyY19tb2QsIHBheWxvYWRfbGVuLAorCQkJTkxNX0ZfUkVRVUVTVCk7CisJaWYgKE5VTEwgPT0gbmxoKSB7CisJCUxPR0dJTkdfVFJBQ0UoQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIiVzOiBubG1zZ19wdXQoKSBmYWlsZWQgZm9yIG1zZyBzaXplWyVkXSIsCisJCQkgICAgICBfX2Z1bmNfXywgdG90X21zZ19sZW4pOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJd25sID0gKHRBbmlObEhkciAqKSBubGg7CisJd25sLT5yYWRpbyA9IHJhZGlvOworCW1lbWNweSgmd25sLT53bXNnLCB3bXNnLCB3bXNnX2xlbmd0aCk7CisJTE9HR0lOR19UUkFDRShDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICAgICAgIiVzOiBTZW5kaW5nIE1zZyBUeXBlIFsweCVYXSB0byBwaWRbJWRdXG4iLAorCQkgICAgICBfX2Z1bmNfXywgYmUxNl90b19jcHUod21zZy0+dHlwZSksIHBpZCk7CisKKwllcnIgPSBubF9zcnZfdWNhc3Qoc2tiLCBwaWQsIE1TR19ET05UV0FJVCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBpc19kYXRhX3BhdGhfbW9kdWxlKCkgLSBUbyBjaGVjayBmb3IgYSBEYXRhcGF0aCBtb2R1bGUKKyAqIEBtb2RfaWQ6IE1vZHVsZSBpZAorICoKKyAqIENoZWNrcyBpZiB0aGUgaW5wdXQgbW9kdWxlIGlkIGJlbG9uZ3MgdG8gZGF0YSBwYXRoLgorICoKKyAqIFJldHVybjogVHJ1ZSBpZiB0aGUgbW9kdWxlIGJlbG9uZ3MgdG8gZGF0YSBwYXRoLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wgaXNfZGF0YV9wYXRoX21vZHVsZShDREZfTU9EVUxFX0lEIG1vZF9pZCkKK3sKKwlzd2l0Y2ggKG1vZF9pZCkgeworCWNhc2UgQ0RGX01PRFVMRV9JRF9IRERfREFUQToKKwljYXNlIENERl9NT0RVTEVfSURfSEREX1NBUF9EQVRBOgorCWNhc2UgQ0RGX01PRFVMRV9JRF9IVEM6CisJY2FzZSBDREZfTU9EVUxFX0lEX1RYUlg6CisJY2FzZSBDREZfTU9EVUxFX0lEX0hJRjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfbG9ndG9hcHBfbG9nX2xldmVsKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBtb2R1bGUgaWQgMCBpcyByZXNlcnZlZCAqLworCWZvciAoaSA9IDE7IGkgPCBDREZfTU9EVUxFX0lEX01BWDsgaSsrKSB7CisJCWlmIChpc19kYXRhX3BhdGhfbW9kdWxlKGkpKQorCQkJY2RmX3RyYWNlX3NldF9tb2R1bGVfdHJhY2VfbGV2ZWwoaSwKKwkJCQkJQ0RGX0RBVEFfUEFUSF9UUkFDRV9MRVZFTCk7CisJCWVsc2UKKwkJCWNkZl90cmFjZV9zZXRfdmFsdWUoaSwgQ0RGX1RSQUNFX0xFVkVMX0FMTCwgdHJ1ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbGVhcl9kZWZhdWx0X2xvZ3RvYXBwX2xvZ19sZXZlbCh2b2lkKQoreworCWludCBtb2R1bGU7CisKKwlmb3IgKG1vZHVsZSA9IDA7IG1vZHVsZSA8IENERl9NT0RVTEVfSURfTUFYOyBtb2R1bGUrKykgeworCQljZGZfdHJhY2Vfc2V0X3ZhbHVlKG1vZHVsZSwgQ0RGX1RSQUNFX0xFVkVMX05PTkUsIGZhbHNlKTsKKwkJY2RmX3RyYWNlX3NldF92YWx1ZShtb2R1bGUsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwgdHJ1ZSk7CisJCWNkZl90cmFjZV9zZXRfdmFsdWUobW9kdWxlLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsIHRydWUpOworCX0KKworCWNkZl90cmFjZV9zZXRfdmFsdWUoQ0RGX01PRFVMRV9JRF9SU1Y0LCBDREZfVFJBQ0VfTEVWRUxfTk9ORSwKKwkJCSAgICBmYWxzZSk7Cit9CisKKy8qIE5lZWQgdG8gY2FsbCB0aGlzIHdpdGggc3Bpbl9sb2NrIGFjcXVpcmVkICovCitzdGF0aWMgaW50IHdsYW5fcXVldWVfbG9nbXNnX2Zvcl9hcHAodm9pZCkKK3sKKwljaGFyICpwdHI7CisJaW50IHJldCA9IDA7CisJcHRyID0gJmd3bGFuX2xvZ2dpbmcucGN1cl9ub2RlLT5sb2didWZbc2l6ZW9mKHRBbmlIZHIpXTsKKwlwdHJbZ3dsYW5fbG9nZ2luZy5wY3VyX25vZGUtPmZpbGxlZF9sZW5ndGhdID0gJ1wwJzsKKworCSoodW5zaWduZWQgc2hvcnQgKikoZ3dsYW5fbG9nZ2luZy5wY3VyX25vZGUtPmxvZ2J1ZikgPQorCQlBTklfTkxfTVNHX0xPR19UWVBFOworCSoodW5zaWduZWQgc2hvcnQgKikoZ3dsYW5fbG9nZ2luZy5wY3VyX25vZGUtPmxvZ2J1ZiArIDIpID0KKwkJZ3dsYW5fbG9nZ2luZy5wY3VyX25vZGUtPmZpbGxlZF9sZW5ndGg7CisJbGlzdF9hZGRfdGFpbCgmZ3dsYW5fbG9nZ2luZy5wY3VyX25vZGUtPm5vZGUsCisJCSAgICAgICZnd2xhbl9sb2dnaW5nLmZpbGxlZF9saXN0KTsKKworCWlmICghbGlzdF9lbXB0eSgmZ3dsYW5fbG9nZ2luZy5mcmVlX2xpc3QpKSB7CisJCS8qIEdldCBidWZmZXIgZnJvbSBmcmVlIGxpc3QgKi8KKwkJZ3dsYW5fbG9nZ2luZy5wY3VyX25vZGUgPQorCQkJKHN0cnVjdCBsb2dfbXNnICopKGd3bGFuX2xvZ2dpbmcuZnJlZV9saXN0Lm5leHQpOworCQlsaXN0X2RlbF9pbml0KGd3bGFuX2xvZ2dpbmcuZnJlZV9saXN0Lm5leHQpOworCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmd3bGFuX2xvZ2dpbmcuZmlsbGVkX2xpc3QpKSB7CisJCS8qIEdldCBidWZmZXIgZnJvbSBmaWxsZWQgbGlzdCAqLworCQkvKiBUaGlzIGNvbmRpdGlvbiB3aWxsIGRyb3AgdGhlIHBhY2tldCBmcm9tIGJlaW5nCisJCSAqIGluZGljYXRlZCB0byBhcHAKKwkJICovCisJCWd3bGFuX2xvZ2dpbmcucGN1cl9ub2RlID0KKwkJCShzdHJ1Y3QgbG9nX21zZyAqKShnd2xhbl9sb2dnaW5nLmZpbGxlZF9saXN0Lm5leHQpOworCQkrK2d3bGFuX2xvZ2dpbmcuZHJvcF9jb3VudDsKKwkJLyogcHJpbnQgZXZlcnkgNjR0aCBkcm9wIGNvdW50ICovCisJCWlmIChjZHNfaXNfbXVsdGljYXN0X2xvZ2dpbmcoKSAmJgorCQkJCSghKGd3bGFuX2xvZ2dpbmcuZHJvcF9jb3VudCAlIDB4NDApKSkgeworCQkJcHJfZXJyCisJCQkJKCIlczogZHJvcF9jb3VudCA9ICV1IGluZGV4ID0gJWQgZmlsbGVkX2xlbmd0aCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBnd2xhbl9sb2dnaW5nLmRyb3BfY291bnQsCisJCQkJZ3dsYW5fbG9nZ2luZy5wY3VyX25vZGUtPmluZGV4LAorCQkJCWd3bGFuX2xvZ2dpbmcucGN1cl9ub2RlLT5maWxsZWRfbGVuZ3RoKTsKKwkJfQorCQlsaXN0X2RlbF9pbml0KGd3bGFuX2xvZ2dpbmcuZmlsbGVkX2xpc3QubmV4dCk7CisJCXJldCA9IDE7CisJfQorCisJLyogUmVzZXQgdGhlIGN1cnJlbnQgbm9kZSB2YWx1ZXMgKi8KKwlnd2xhbl9sb2dnaW5nLnBjdXJfbm9kZS0+ZmlsbGVkX2xlbmd0aCA9IDA7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFFDQV9XSUZJXzNfMF9BRFJBU1RFQQorLyoqCisgKiB3bGFuX2FkZF91c2VyX2xvZ190aW1lX3N0YW1wKCkgLSBhZGQgdGltZSBzdGFtcCBpbiBXTEFOIGxvZyBidWZmZXIKKyAqIEB0YnVmOiBQb2ludGVyIHRvIHRpbWUgc3RhbXAgYnVmZmVyCisgKiBAdGJ1Zl9zejogVGltZSBidWZmZXIgc2l6ZQorICogQHRzOiBUaW1lIHN0YW1wIHZhbHVlCisgKgorICogRm9yIGFkcmFzdGVhIHRpbWUgc3RhbXAgaXMgUVRJTUVSIHJhdyB0aWNrIHdoaWNoIHdpbGwgYmUgdXNlZCBieSBjbnNzX2RpYWcKKyAqIHRvIGNvbnZlcnQgaXQgaW50byB1c2VyIHZpc2libGUgdGltZSBzdGFtcC4gSW4gYWRyc3RlYSBGVyBhbHNvIHVzZXMgUVRJTUVSCisgKiByYXcgdGlja3Mgd2hpY2ggaXMgbmVlZGVkIHRvIHN5bmNocm9uaXplIGhvc3QgYW5kIGZ3IGxvZyB0aW1lIHN0YW1wcworICoKKyAqCisgKiBGb3IgZGlzY3JldGUgc29sdXRpb24gZS5nIHJvbWUgdXNlIHN5c3RlbSB0aWNrIGFuZCBjb252ZXJ0IGl0IGludG8KKyAqIHNlY29uZHMubWlsbGkgc2Vjb25kcworICovCitzdGF0aWMgaW50IHdsYW5fYWRkX3VzZXJfbG9nX3RpbWVfc3RhbXAoY2hhciAqdGJ1Ziwgc2l6ZV90IHRidWZfc3osIHVpbnQ2NF90IHRzKQoreworCWludCB0bGVuOworCisJdGxlbiA9IHNjbnByaW50Zih0YnVmLCB0YnVmX3N6LCAiWyVzXVslbGx1XSAiLCBjdXJyZW50LT5jb21tLCB0cyk7CisJcmV0dXJuIHRsZW47Cit9CisjZWxzZQorLyoqCisgKiB3bGFuX2FkZF91c2VyX2xvZ190aW1lX3N0YW1wKCkgLSBhZGQgdGltZSBzdGFtcCBpbiBXTEFOIGxvZyBidWZmZXIKKyAqIEB0YnVmOiBQb2ludGVyIHRvIHRpbWUgc3RhbXAgYnVmZmVyCisgKiBAdGJ1Zl9zejogVGltZSBidWZmZXIgc2l6ZQorICogQHRzOiBUaW1lIHN0YW1wIHZhbHVlCisgKgorICogRm9yIGFkcmFzdGVhIHRpbWUgc3RhbXAgUVRJTUVSIHJhdyB0aWNrIHdoaWNoIHdpbGwgYmUgdXNlZCBieSBjbnNzX2RpYWcKKyAqIHRvIGNvbnZlcnQgaXQgaW50byB1c2VyIHZpc2libGUgdGltZSBzdGFtcAorICoKKyAqIEZvciBkaXNjcmV0ZSBzb2x1dGlvbiBlLmcgcm9tZSB1c2Ugc3lzdGVtIHRpY2sgYW5kIGNvbnZlcnQgaXQgaW50bworICogc2Vjb25kcy5taWxsaSBzZWNvbmRzCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9hZGRfdXNlcl9sb2dfdGltZV9zdGFtcChjaGFyICp0YnVmLCBzaXplX3QgdGJ1Zl9zeiwgdWludDY0X3QgdHMpCit7CisJaW50IHRsZW47CisJdWludDMyX3QgcmVtOworCisJcmVtID0gZG9fZGl2KHRzLCBDREZfTUNfVElNRVJfVE9fU0VDX1VOSVQpOworCXRsZW4gPSBzY25wcmludGYodGJ1ZiwgdGJ1Zl9zeiwgIlslc11bJWx1LiUwNmx1XSAiLCBjdXJyZW50LT5jb21tLAorCQkJKHVuc2lnbmVkIGxvbmcpIHRzLCAodW5zaWduZWQgbG9uZylyZW0pOworCXJldHVybiB0bGVuOworfQorI2VuZGlmCisKK2ludCB3bGFuX2xvZ190b191c2VyKENERl9UUkFDRV9MRVZFTCBsb2dfbGV2ZWwsIGNoYXIgKnRvX2JlX3NlbnQsIGludCBsZW5ndGgpCit7CisJLyogQWRkIHRoZSBjdXJyZW50IHRpbWUgc3RhbXAgKi8KKwljaGFyICpwdHI7CisJY2hhciB0YnVmWzUwXTsKKwlpbnQgdGxlbjsKKwlpbnQgdG90YWxfbG9nX2xlbjsKKwl1bnNpZ25lZCBpbnQgKnBmaWxsZWRfbGVuZ3RoOworCWJvb2wgd2FrZV91cF90aHJlYWQgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQ2NF90IHRzOworCisJaWYgKCFjZHNfaXNfbXVsdGljYXN0X2xvZ2dpbmcoKSkgeworCQkvKgorCQkgKiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHByaW50IHRoZSBsb2dzIHRvIGttc2cgY29uc29sZQorCQkgKiB3aGVuIG5vIGxvZ2dlciBhcHAgaXMgcnVubmluZy4gVGhpcyBpcyBhbHNvIG5lZWRlZCB0bworCQkgKiBsb2cgdGhlIGluaXRpYWwgbWVzc2FnZXMgZHVyaW5nIGxvYWRpbmcgb2YgZHJpdmVyIHdoZXJlIGV2ZW4KKwkJICogaWYgYXBwIGlzIHJ1bm5pbmcgaXQgd2lsbCBub3QgYmUgYWJsZSB0bworCQkgKiByZWdpc3RlciB3aXRoIGRyaXZlciBpbW1lZGlhdGVseSBhbmQgc3RhcnQgbG9nZ2luZyBhbGwgdGhlCisJCSAqIG1lc3NhZ2VzLgorCQkgKi8KKwkJcHJfaW5mbygiJXNcbiIsIHRvX2JlX3NlbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0cyA9IGNkZl9nZXRfbG9nX3RpbWVzdGFtcCgpOworCXRsZW4gPSB3bGFuX2FkZF91c2VyX2xvZ190aW1lX3N0YW1wKHRidWYsIHNpemVvZih0YnVmKSwgdHMpOworCisJLyogMSsxIGluZGljYXRlICdcbicrJ1wwJyAqLworCXRvdGFsX2xvZ19sZW4gPSBsZW5ndGggKyB0bGVuICsgMSArIDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3dsYW5fbG9nZ2luZy5zcGluX2xvY2ssIGZsYWdzKTsKKwkvKiB3bGFuIGxvZ2dpbmcgc3ZjIHJlc291cmNlcyBhcmUgbm90IHlldCBpbml0aWFsaXplZCAqLworCWlmICghZ3dsYW5fbG9nZ2luZy5wY3VyX25vZGUpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3dsYW5fbG9nZ2luZy5zcGluX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcGZpbGxlZF9sZW5ndGggPSAmZ3dsYW5fbG9nZ2luZy5wY3VyX25vZGUtPmZpbGxlZF9sZW5ndGg7CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gYWNjb21vZGF0ZSBtb3JlIGxvZyBpbnRvIGN1cnJlbnQgbm9kZS9idWZmZXIgKi8KKwlpZiAoKE1BWF9MT0dNU0dfTEVOR1RIIDw9ICgqcGZpbGxlZF9sZW5ndGggKworCQkJCQkJc2l6ZW9mKHRBbmlObEhkcikpKSB8fAorCQkoKE1BWF9MT0dNU0dfTEVOR1RIIC0gKCpwZmlsbGVkX2xlbmd0aCArCisJCQlzaXplb2YodEFuaU5sSGRyKSkpIDwgdG90YWxfbG9nX2xlbikpIHsKKwkJd2FrZV91cF90aHJlYWQgPSB0cnVlOworCQl3bGFuX3F1ZXVlX2xvZ21zZ19mb3JfYXBwKCk7CisJCXBmaWxsZWRfbGVuZ3RoID0gJmd3bGFuX2xvZ2dpbmcucGN1cl9ub2RlLT5maWxsZWRfbGVuZ3RoOworCX0KKworCXB0ciA9ICZnd2xhbl9sb2dnaW5nLnBjdXJfbm9kZS0+bG9nYnVmW3NpemVvZih0QW5pSGRyKV07CisKKwkvKiBBc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB3ZSByZWNlaXZlIGxvZ3Mgd2hpY2ggaXMgYWx3YXlzIGxlc3MgdGhhbgorCSAqIE1BWF9MT0dNU0dfTEVOR1RILCB3aGVyZSB3ZSBjYW4gYWNjb21vZGF0ZSB0aGUKKwkgKiAgIHRBbmlObEhkciArIFtjb250ZXh0XVt0aW1lc3RhbXBdICsgbG9nCisJICogQ0RGX0FTU0VSVCBpZiB3ZSBjYW5ub3QgYWNjb21vZGF0ZSB0aGUgdGhlIGNvbXBsZXRlIGxvZyBpbnRvCisJICogdGhlIGF2YWlsYWJsZSBidWZmZXIuCisJICoKKwkgKiBDb250aW51ZSBhbmQgY29weSBsb2dzIHRvIHRoZSBhdmFpbGFibGUgbGVuZ3RoIGFuZCBkaXNjYXJkIHRoZSByZXN0LgorCSAqLworCWlmIChNQVhfTE9HTVNHX0xFTkdUSCA8IChzaXplb2YodEFuaU5sSGRyKSArIHRvdGFsX2xvZ19sZW4pKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCXRvdGFsX2xvZ19sZW4gPSBNQVhfTE9HTVNHX0xFTkdUSCAtIHNpemVvZih0QW5pTmxIZHIpIC0gMjsKKwl9CisKKwltZW1jcHkoJnB0clsqcGZpbGxlZF9sZW5ndGhdLCB0YnVmLCB0bGVuKTsKKwltZW1jcHkoJnB0clsqcGZpbGxlZF9sZW5ndGggKyB0bGVuXSwgdG9fYmVfc2VudCwKKwkgICAgICAgbWluKGxlbmd0aCwgKHRvdGFsX2xvZ19sZW4gLSB0bGVuKSkpOworCSpwZmlsbGVkX2xlbmd0aCArPSB0bGVuICsgbWluKGxlbmd0aCwgdG90YWxfbG9nX2xlbiAtIHRsZW4pOworCXB0clsqcGZpbGxlZF9sZW5ndGhdID0gJ1xuJzsKKwkqcGZpbGxlZF9sZW5ndGggKz0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd3bGFuX2xvZ2dpbmcuc3Bpbl9sb2NrLCBmbGFncyk7CisKKwkvKiBXYWtldXAgbG9nZ2VyIHRocmVhZCAqLworCWlmICgodHJ1ZSA9PSB3YWtlX3VwX3RocmVhZCkpIHsKKwkJCXNldF9iaXQoSE9TVF9MT0dfRFJJVkVSX01TRywgJmd3bGFuX2xvZ2dpbmcuZXZlbnRGbGFnKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3dsYW5fbG9nZ2luZy53YWl0X3F1ZXVlKTsKKwl9CisKKwlpZiAoZ3dsYW5fbG9nZ2luZy5sb2dfZmVfdG9fY29uc29sZQorCSAgICAmJiAoKENERl9UUkFDRV9MRVZFTF9GQVRBTCA9PSBsb2dfbGV2ZWwpCisJCXx8IChDREZfVFJBQ0VfTEVWRUxfRVJST1IgPT0gbG9nX2xldmVsKSkpIHsKKwkJcHJfaW5mbygiJXNcbiIsIHRvX2JlX3NlbnQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlbmRfZmlsbGVkX2J1ZmZlcnNfdG9fdXNlcih2b2lkKQoreworCWludCByZXQgPSAtMTsKKwlzdHJ1Y3QgbG9nX21zZyAqcGxvZ19tc2c7CisJaW50IHBheWxvYWRfbGVuOworCWludCB0b3RfbXNnX2xlbjsKKwl0QW5pTmxIZHIgKndubDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlzdGF0aWMgaW50IG5sbXNnX3NlcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0YXRpYyBpbnQgcmF0ZV9saW1pdDsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmZ3dsYW5fbG9nZ2luZy5maWxsZWRfbGlzdCkKKwkgICAgICAgJiYgIWd3bGFuX2xvZ2dpbmcuZXhpdCkgeworCisJCXNrYiA9IGRldl9hbGxvY19za2IoTUFYX0xPR01TR19MRU5HVEgpOworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCWlmICghcmF0ZV9saW1pdCkgeworCQkJCXByX2VycgorCQkJCQkoIiVzOiBkZXZfYWxsb2Nfc2tiKCkgZmFpbGVkIGZvciBtc2cgc2l6ZVslZF0gZHJvcCBjb3VudCA9ICV1XG4iLAorCQkJCQlfX2Z1bmNfXywgTUFYX0xPR01TR19MRU5HVEgsCisJCQkJCWd3bGFuX2xvZ2dpbmcuZHJvcF9jb3VudCk7CisJCQl9CisJCQlyYXRlX2xpbWl0ID0gMTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCQlyYXRlX2xpbWl0ID0gMDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3dsYW5fbG9nZ2luZy5zcGluX2xvY2ssIGZsYWdzKTsKKworCQlwbG9nX21zZyA9IChzdHJ1Y3QgbG9nX21zZyAqKQorCQkJICAgKGd3bGFuX2xvZ2dpbmcuZmlsbGVkX2xpc3QubmV4dCk7CisJCWxpc3RfZGVsX2luaXQoZ3dsYW5fbG9nZ2luZy5maWxsZWRfbGlzdC5uZXh0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3dsYW5fbG9nZ2luZy5zcGluX2xvY2ssIGZsYWdzKTsKKwkJLyogNCBleHRyYSBieXRlcyBmb3IgdGhlIHJhZGlvIGlkeCAqLworCQlwYXlsb2FkX2xlbiA9IHBsb2dfbXNnLT5maWxsZWRfbGVuZ3RoICsKKwkJCSAgICAgIHNpemVvZih3bmwtPnJhZGlvKSArIHNpemVvZih0QW5pSGRyKTsKKworCQl0b3RfbXNnX2xlbiA9IE5MTVNHX1NQQUNFKHBheWxvYWRfbGVuKTsKKwkJbmxoID0gbmxtc2dfcHV0KHNrYiwgMCwgbmxtc2dfc2VxKyssCisJCQkJQU5JX05MX01TR19MT0csIHBheWxvYWRfbGVuLCBOTE1fRl9SRVFVRVNUKTsKKwkJaWYgKE5VTEwgPT0gbmxoKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3dsYW5fbG9nZ2luZy5zcGluX2xvY2ssIGZsYWdzKTsKKwkJCWxpc3RfYWRkX3RhaWwoJnBsb2dfbXNnLT5ub2RlLAorCQkJCSAgICAgICZnd2xhbl9sb2dnaW5nLmZyZWVfbGlzdCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnd2xhbl9sb2dnaW5nLnNwaW5fbG9jaywgZmxhZ3MpOworCQkJcHJfZXJyKCIlczogZHJvcF9jb3VudCA9ICV1XG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICArK2d3bGFuX2xvZ2dpbmcuZHJvcF9jb3VudCk7CisJCQlwcl9lcnIoIiVzOiBubG1zZ19wdXQoKSBmYWlsZWQgZm9yIG1zZyBzaXplWyVkXVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgdG90X21zZ19sZW4pOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc2tiID0gTlVMTDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQljb250aW51ZTsKKwkJfQorCisJCXdubCA9ICh0QW5pTmxIZHIgKikgbmxoOworCQl3bmwtPnJhZGlvID0gcGxvZ19tc2ctPnJhZGlvOworCQltZW1jcHkoJndubC0+d21zZywgcGxvZ19tc2ctPmxvZ2J1ZiwKKwkJICAgICAgIHBsb2dfbXNnLT5maWxsZWRfbGVuZ3RoICsgc2l6ZW9mKHRBbmlIZHIpKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3dsYW5fbG9nZ2luZy5zcGluX2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmcGxvZ19tc2ctPm5vZGUsICZnd2xhbl9sb2dnaW5nLmZyZWVfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd3bGFuX2xvZ2dpbmcuc3Bpbl9sb2NrLCBmbGFncyk7CisKKwkJcmV0ID0gbmxfc3J2X2JjYXN0KHNrYik7CisJCS8qIHByaW50IGV2ZXJ5IDY0dGggZHJvcCBjb3VudCAqLworCQlpZiAocmV0IDwgMCAmJiAoIShnd2xhbl9sb2dnaW5nLmRyb3BfY291bnQgJSAweDQwKSkpIHsKKwkJCXByX2VycigiJXM6IFNlbmQgRmFpbGVkICVkIGRyb3BfY291bnQgPSAldVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmV0LCArK2d3bGFuX2xvZ2dpbmcuZHJvcF9jb3VudCk7CisJCQlza2IgPSBOVUxMOworCQl9IGVsc2UgeworCQkJc2tiID0gTlVMTDsKKwkJCXJldCA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorLyoqCisgKiB3bGFuX3JlcG9ydF9sb2dfY29tcGxldGlvbigpIC0gUmVwb3J0IGJ1ZyByZXBvcnQgY29tcGxldGlvbiB0byB1c2Vyc3BhY2UKKyAqIEBpc19mYXRhbDogVHlwZSBvZiBldmVudCwgZmF0YWwgb3Igbm90CisgKiBAaW5kaWNhdG9yOiBTb3VyY2Ugb2YgYnVnIHJlcG9ydCwgZnJhbWV3b3JrL2hvc3QvZmlybXdhcmUKKyAqIEByZWFzb25fY29kZTogUmVhc29uIGZvciB0cmlnZ2VyaW5nIGJ1ZyByZXBvcnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVwb3J0IHRoZSBidWcgcmVwb3J0IGNvbXBsZXRpb24gdG8gdXNlcnNwYWNlCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd2xhbl9yZXBvcnRfbG9nX2NvbXBsZXRpb24odWludDMyX3QgaXNfZmF0YWwsCisJCXVpbnQzMl90IGluZGljYXRvciwKKwkJdWludDMyX3QgcmVhc29uX2NvZGUpCit7CisJV0xBTl9IT1NUX0RJQUdfRVZFTlRfREVGKHdsYW5fZGlhZ19ldmVudCwKKwkJCXN0cnVjdCBob3N0X2V2ZW50X3dsYW5fbG9nX2NvbXBsZXRlKTsKKworCXdsYW5fZGlhZ19ldmVudC5pc19mYXRhbCA9IGlzX2ZhdGFsOworCXdsYW5fZGlhZ19ldmVudC5pbmRpY2F0b3IgPSBpbmRpY2F0b3I7CisJd2xhbl9kaWFnX2V2ZW50LnJlYXNvbl9jb2RlID0gcmVhc29uX2NvZGU7CisJd2xhbl9kaWFnX2V2ZW50LnJlc2VydmVkID0gMDsKKworCVdMQU5fSE9TVF9ESUFHX0VWRU5UX1JFUE9SVCgmd2xhbl9kaWFnX2V2ZW50LCBFVkVOVF9XTEFOX0xPR19DT01QTEVURSk7Cit9CisjZW5kaWYKKworLyoqCisgKiBzZW5kX2ZsdXNoX2NvbXBsZXRpb25fdG9fdXNlcigpIC0gSW5kaWNhdGUgZmx1c2ggY29tcGxldGlvbiB0byB0aGUgdXNlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIHRoZSBmbHVzaCBjb21wbGV0aW9uIG1lc3NhZ2UgdG8gdXNlciBzcGFjZQorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIHNlbmRfZmx1c2hfY29tcGxldGlvbl90b191c2VyKHZvaWQpCit7CisJdWludDMyX3QgaXNfZmF0YWwsIGluZGljYXRvciwgcmVhc29uX2NvZGU7CisKKwljZHNfZ2V0X2xvZ19jb21wbGV0aW9uKCZpc19mYXRhbCwgJmluZGljYXRvciwgJnJlYXNvbl9jb2RlKTsKKworCS8qIEVycm9yIG9uIHB1cnBvc2UsIHNvIHRoYXQgaXQgd2lsbCBnZXQgbG9nZ2VkIGluIHRoZSBrbXNnICovCisJTE9HR0lOR19UUkFDRShDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkiJXM6IFNlbmRpbmcgZmx1c2ggZG9uZSB0byB1c2Vyc3BhY2UiLCBfX2Z1bmNfXyk7CisKKwl3bGFuX3JlcG9ydF9sb2dfY29tcGxldGlvbihpc19mYXRhbCwgaW5kaWNhdG9yLCByZWFzb25fY29kZSk7Cit9CisKKy8qKgorICogd2xhbl9sb2dnaW5nX3RocmVhZCgpIC0gVGhlIFdMQU4gTG9nZ2VyIHRocmVhZAorICogQEFyZyAtIHBvaW50ZXIgdG8gdGhlIEhERCBjb250ZXh0CisgKgorICogVGhpcyB0aHJlYWQgbG9ncyBsb2cgbWVzc2FnZSB0byBBcHAgcmVnaXN0ZXJlZCBmb3IgdGhlIGxvZ3MuCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9sb2dnaW5nX3RocmVhZCh2b2lkICpBcmcpCit7CisJaW50IHJldF93YWl0X3N0YXR1cyA9IDA7CisJaW50IHJldCA9IDA7CisKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yKTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA4LCAwKSkKKwlkYWVtb25pemUoIndsYW5fbG9nZ2luZ190aHJlYWQiKTsKKyNlbmRpZgorCisJd2hpbGUgKCFnd2xhbl9sb2dnaW5nLmV4aXQpIHsKKwkJcmV0X3dhaXRfc3RhdHVzID0KKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShnd2xhbl9sb2dnaW5nLndhaXRfcXVldWUsCisJCQkJCQkgKCFsaXN0X2VtcHR5CisJCQkJCQkJICAoJmd3bGFuX2xvZ2dpbmcuZmlsbGVkX2xpc3QpCisJCQkJCQkgIHx8IHRlc3RfYml0KAorCQkJCQkJICAgICBIT1NUX0xPR19EUklWRVJfTVNHLAorCQkJCQkJICAgICAmZ3dsYW5fbG9nZ2luZy5ldmVudEZsYWcpCisJCQkJCQkgIHx8IHRlc3RfYml0KAorCQkJCQkJICAgICBIT1NUX0xPR19QRVJfUEtUX1NUQVRTLAorCQkJCQkJICAgICAmZ3dsYW5fbG9nZ2luZy5ldmVudEZsYWcpCisJCQkJCQkgIHx8IHRlc3RfYml0KAorCQkJCQkJICAgICBIT1NUX0xPR19GV19GTFVTSF9DT01QTEVURSwKKwkJCQkJCSAgICAgJmd3bGFuX2xvZ2dpbmcuZXZlbnRGbGFnKQorCQkJCQkJICB8fCBnd2xhbl9sb2dnaW5nLmV4aXQpKTsKKworCQlpZiAocmV0X3dhaXRfc3RhdHVzID09IC1FUkVTVEFSVFNZUykgeworCQkJcHJfZXJyCisJCQkJKCIlczogd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlIHJldHVybmVkIC1FUkVTVEFSVFNZUyIsCisJCQkJX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZ3dsYW5fbG9nZ2luZy5leGl0KSB7CisJCQlwcl9lcnIoIiVzOiBFeGl0aW5nIHRoZSB0aHJlYWRcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIT1NUX0xPR19EUklWRVJfTVNHLAorCQkJCQkmZ3dsYW5fbG9nZ2luZy5ldmVudEZsYWcpKSB7CisJCQlyZXQgPSBzZW5kX2ZpbGxlZF9idWZmZXJzX3RvX3VzZXIoKTsKKwkJCWlmICgtRU5PTUVNID09IHJldCkKKwkJCQltc2xlZXAoMjAwKTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSE9TVF9MT0dfUEVSX1BLVF9TVEFUUywKKwkJCQkJJmd3bGFuX2xvZ2dpbmcuZXZlbnRGbGFnKSkgeworCQkJcmV0ID0gcGt0bG9nX3NlbmRfcGVyX3BrdF9zdGF0c190b191c2VyKCk7CisJCQlpZiAoLUVOT01FTSA9PSByZXQpCisJCQkJbXNsZWVwKDIwMCk7CisJCX0KKworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhPU1RfTE9HX0ZXX0ZMVVNIX0NPTVBMRVRFLAorCQkJCQkmZ3dsYW5fbG9nZ2luZy5ldmVudEZsYWcpKSB7CisJCQkvKiBGbHVzaCBiaXQgY291bGQgaGF2ZSBiZWVuIHNldCB3aGlsZSB3ZSB3ZXJlIG1pZAorCQkJICogd2F5IGluIHRoZSBsb2dnaW5nIHRocmVhZC4gU28sIG5lZWQgdG8gY2hlY2sgb3RoZXIKKwkJCSAqIGJ1ZmZlcnMgbGlrZSBsb2cgbWVzc2FnZXMsIHBlciBwYWNrZXQgc3RhdHMgYWdhaW4KKwkJCSAqIHRvIGZsdXNoIGFueSByZXNpZHVhbCBkYXRhIGluIHRoZW0KKwkJCSAqLworCQkJaWYgKGd3bGFuX2xvZ2dpbmcuaXNfZmx1c2hfY29tcGxldGUgPT0gdHJ1ZSkgeworCQkJCWd3bGFuX2xvZ2dpbmcuaXNfZmx1c2hfY29tcGxldGUgPSBmYWxzZTsKKwkJCQlzZW5kX2ZsdXNoX2NvbXBsZXRpb25fdG9fdXNlcigpOworCQkJfSBlbHNlIHsKKwkJCQlnd2xhbl9sb2dnaW5nLmlzX2ZsdXNoX2NvbXBsZXRlID0gdHJ1ZTsKKwkJCQlzZXRfYml0KEhPU1RfTE9HX0RSSVZFUl9NU0csCisJCQkJCQkmZ3dsYW5fbG9nZ2luZy5ldmVudEZsYWcpOworCQkJCXNldF9iaXQoSE9TVF9MT0dfUEVSX1BLVF9TVEFUUywKKwkJCQkJCSZnd2xhbl9sb2dnaW5nLmV2ZW50RmxhZyk7CisJCQkJc2V0X2JpdChIT1NUX0xPR19GV19GTFVTSF9DT01QTEVURSwKKwkJCQkJCSZnd2xhbl9sb2dnaW5nLmV2ZW50RmxhZyk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKAorCQkJCQkJJmd3bGFuX2xvZ2dpbmcud2FpdF9xdWV1ZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcl9pbmZvKCIlczogVGVybWluYXRpbmdcbiIsIF9fZnVuY19fKTsKKworCWNvbXBsZXRlX2FuZF9leGl0KCZnd2xhbl9sb2dnaW5nLnNodXRkb3duX2NvbXAsIDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFsbCB0aGUgTmV0bGluayBtZXNzYWdlcyBmcm9tIExvZ2dlciBTb2NrZXQgYXBwIGluIHVzZXIgc3BhY2UKKyAqLworc3RhdGljIGludCB3bGFuX2xvZ2dpbmdfcHJvY19zb2NrX3J4X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXRBbmlObEhkciAqd25sOworCWludCByYWRpbzsKKwlpbnQgdHlwZTsKKwlpbnQgcmV0OworCisJd25sID0gKHRBbmlObEhkciAqKSBza2ItPmRhdGE7CisJcmFkaW8gPSB3bmwtPnJhZGlvOworCXR5cGUgPSB3bmwtPm5saC5ubG1zZ190eXBlOworCisJaWYgKHJhZGlvIDwgMCB8fCByYWRpbyA+IEFOSV9NQVhfUkFESU9TKSB7CisJCUxPR0dJTkdfVFJBQ0UoQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAgICAgIiVzOiBpbnZhbGlkIHJhZGlvIGlkIFslZF1cbiIsIF9fZnVuY19fLCByYWRpbyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChnYXBwX3BpZCAhPSBJTlZBTElEX1BJRCkgeworCQlpZiAod25sLT5ubGgubmxtc2dfcGlkID4gZ2FwcF9waWQpIHsKKwkJCWdhcHBfcGlkID0gd25sLT5ubGgubmxtc2dfcGlkOworCQl9CisKKwkJc3Bpbl9sb2NrX2JoKCZnd2xhbl9sb2dnaW5nLnNwaW5fbG9jayk7CisJCWlmIChnd2xhbl9sb2dnaW5nLnBjdXJfbm9kZS0+ZmlsbGVkX2xlbmd0aCkgeworCQkJd2xhbl9xdWV1ZV9sb2dtc2dfZm9yX2FwcCgpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZnd2xhbl9sb2dnaW5nLnNwaW5fbG9jayk7CisJCXNldF9iaXQoSE9TVF9MT0dfRFJJVkVSX01TRywgJmd3bGFuX2xvZ2dpbmcuZXZlbnRGbGFnKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZnd2xhbl9sb2dnaW5nLndhaXRfcXVldWUpOworCX0gZWxzZSB7CisJCS8qIFRoaXMgaXMgdG8gc2V0IHRoZSBkZWZhdWx0IGxldmVscyAoV0xBTiBsb2dnaW5nCisJCSAqIGRlZmF1bHQgdmFsdWVzIG5vdCB0aGUgQ0RGIHRyYWNlIGRlZmF1bHQpIHdoZW4KKwkJICogbG9nZ2VyIGFwcCBpcyByZWdpc3RlcmVkIGZvciB0aGUgZmlyc3QgdGltZS4KKwkJICovCisJCWdhcHBfcGlkID0gd25sLT5ubGgubmxtc2dfcGlkOworCX0KKworCXJldCA9IHdsYW5fc2VuZF9zb2NrX21zZ190b19hcHAoJndubC0+d21zZywgMCwKKwkJCQkJQU5JX05MX01TR19MT0csIHdubC0+bmxoLm5sbXNnX3BpZCk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HR0lOR19UUkFDRShDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICAgICAid2xhbl9zZW5kX3NvY2tfbXNnX3RvX2FwcDogZmFpbGVkIik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IHdsYW5fbG9nZ2luZ19zb2NrX2FjdGl2YXRlX3N2YyhpbnQgbG9nX2ZlX3RvX2NvbnNvbGUsIGludCBudW1fYnVmKQoreworCWludCBpID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnOworCisJcHJfaW5mbygiJXM6IEluaXRhbGl6aW5nIEZFQ29uc29sZUxvZyA9ICVkIE51bUJ1ZmYgPSAlZFxuIiwKKwkJX19mdW5jX18sIGxvZ19mZV90b19jb25zb2xlLCBudW1fYnVmKTsKKworCWdhcHBfcGlkID0gSU5WQUxJRF9QSUQ7CisKKwlncGxvZ19tc2cgPSAoc3RydWN0IGxvZ19tc2cgKil2bWFsbG9jKG51bV9idWYgKiBzaXplb2Yoc3RydWN0IGxvZ19tc2cpKTsKKwlpZiAoIWdwbG9nX21zZykgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNkZl9tZW1femVybyhncGxvZ19tc2csIChudW1fYnVmICogc2l6ZW9mKHN0cnVjdCBsb2dfbXNnKSkpOworCisJZ3dsYW5fbG9nZ2luZy5sb2dfZmVfdG9fY29uc29sZSA9ICEhbG9nX2ZlX3RvX2NvbnNvbGU7CisJZ3dsYW5fbG9nZ2luZy5udW1fYnVmID0gbnVtX2J1ZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnd2xhbl9sb2dnaW5nLnNwaW5fbG9jaywgaXJxX2ZsYWcpOworCUlOSVRfTElTVF9IRUFEKCZnd2xhbl9sb2dnaW5nLmZyZWVfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmd3bGFuX2xvZ2dpbmcuZmlsbGVkX2xpc3QpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9idWY7IGkrKykgeworCQlsaXN0X2FkZCgmZ3Bsb2dfbXNnW2ldLm5vZGUsICZnd2xhbl9sb2dnaW5nLmZyZWVfbGlzdCk7CisJCWdwbG9nX21zZ1tpXS5pbmRleCA9IGk7CisJfQorCWd3bGFuX2xvZ2dpbmcucGN1cl9ub2RlID0gKHN0cnVjdCBsb2dfbXNnICopCisJCQkJICAoZ3dsYW5fbG9nZ2luZy5mcmVlX2xpc3QubmV4dCk7CisJbGlzdF9kZWxfaW5pdChnd2xhbl9sb2dnaW5nLmZyZWVfbGlzdC5uZXh0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnd2xhbl9sb2dnaW5nLnNwaW5fbG9jaywgaXJxX2ZsYWcpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZ3dsYW5fbG9nZ2luZy53YWl0X3F1ZXVlKTsKKwlnd2xhbl9sb2dnaW5nLmV4aXQgPSBmYWxzZTsKKwljbGVhcl9iaXQoSE9TVF9MT0dfRFJJVkVSX01TRywgJmd3bGFuX2xvZ2dpbmcuZXZlbnRGbGFnKTsKKwljbGVhcl9iaXQoSE9TVF9MT0dfUEVSX1BLVF9TVEFUUywgJmd3bGFuX2xvZ2dpbmcuZXZlbnRGbGFnKTsKKwljbGVhcl9iaXQoSE9TVF9MT0dfRldfRkxVU0hfQ09NUExFVEUsICZnd2xhbl9sb2dnaW5nLmV2ZW50RmxhZyk7CisJaW5pdF9jb21wbGV0aW9uKCZnd2xhbl9sb2dnaW5nLnNodXRkb3duX2NvbXApOworCWd3bGFuX2xvZ2dpbmcudGhyZWFkID0ga3RocmVhZF9jcmVhdGUod2xhbl9sb2dnaW5nX3RocmVhZCwgTlVMTCwKKwkJCQkJICAgICAgIndsYW5fbG9nZ2luZ190aHJlYWQiKTsKKwlpZiAoSVNfRVJSKGd3bGFuX2xvZ2dpbmcudGhyZWFkKSkgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgQ3JlYXRlIExvZ01zZyBUaHJlYWQgQ29udHJvbGxlciIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZnd2xhbl9sb2dnaW5nLnNwaW5fbG9jaywgaXJxX2ZsYWcpOworCQl2ZnJlZShncGxvZ19tc2cpOworCQlncGxvZ19tc2cgPSBOVUxMOworCQlnd2xhbl9sb2dnaW5nLnBjdXJfbm9kZSA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd3bGFuX2xvZ2dpbmcuc3Bpbl9sb2NrLCBpcnFfZmxhZyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl3YWtlX3VwX3Byb2Nlc3MoZ3dsYW5fbG9nZ2luZy50aHJlYWQpOworCWd3bGFuX2xvZ2dpbmcuaXNfYWN0aXZlID0gdHJ1ZTsKKwlnd2xhbl9sb2dnaW5nLmlzX2ZsdXNoX2NvbXBsZXRlID0gZmFsc2U7CisKKwlubF9zcnZfcmVnaXN0ZXIoQU5JX05MX01TR19MT0csIHdsYW5fbG9nZ2luZ19wcm9jX3NvY2tfcnhfbXNnKTsKKworCXByX2luZm8oIiVzOiBBY3RpdmF0ZWQgd2xhbl9sb2dnaW5nIHN2Y1xuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitpbnQgd2xhbl9sb2dnaW5nX3NvY2tfZGVhY3RpdmF0ZV9zdmModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnOworCisJaWYgKCFncGxvZ19tc2cpCisJCXJldHVybiAwOworCisJbmxfc3J2X3VucmVnaXN0ZXIoQU5JX05MX01TR19MT0csIHdsYW5fbG9nZ2luZ19wcm9jX3NvY2tfcnhfbXNnKTsKKwljbGVhcl9kZWZhdWx0X2xvZ3RvYXBwX2xvZ19sZXZlbCgpOworCWdhcHBfcGlkID0gSU5WQUxJRF9QSUQ7CisKKwlJTklUX0NPTVBMRVRJT04oZ3dsYW5fbG9nZ2luZy5zaHV0ZG93bl9jb21wKTsKKwlnd2xhbl9sb2dnaW5nLmV4aXQgPSB0cnVlOworCWd3bGFuX2xvZ2dpbmcuaXNfYWN0aXZlID0gZmFsc2U7CisJY2RzX3NldF9tdWx0aWNhc3RfbG9nZ2luZygwKTsKKwlnd2xhbl9sb2dnaW5nLmlzX2ZsdXNoX2NvbXBsZXRlID0gZmFsc2U7CisJY2xlYXJfYml0KEhPU1RfTE9HX0RSSVZFUl9NU0csICZnd2xhbl9sb2dnaW5nLmV2ZW50RmxhZyk7CisJY2xlYXJfYml0KEhPU1RfTE9HX1BFUl9QS1RfU1RBVFMsICZnd2xhbl9sb2dnaW5nLmV2ZW50RmxhZyk7CisJY2xlYXJfYml0KEhPU1RfTE9HX0ZXX0ZMVVNIX0NPTVBMRVRFLCAmZ3dsYW5fbG9nZ2luZy5ldmVudEZsYWcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3dsYW5fbG9nZ2luZy53YWl0X3F1ZXVlKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZnd2xhbl9sb2dnaW5nLnNodXRkb3duX2NvbXApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd3bGFuX2xvZ2dpbmcuc3Bpbl9sb2NrLCBpcnFfZmxhZyk7CisJdmZyZWUoZ3Bsb2dfbXNnKTsKKwlncGxvZ19tc2cgPSBOVUxMOworCWd3bGFuX2xvZ2dpbmcucGN1cl9ub2RlID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnd2xhbl9sb2dnaW5nLnNwaW5fbG9jaywgaXJxX2ZsYWcpOworCisJcHJfaW5mbygiJXM6IERlYWN0aXZhdGUgd2xhbl9sb2dnaW5nIHN2Y1xuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB3bGFuX2xvZ2dpbmdfc29ja19pbml0X3N2Yyh2b2lkKQoreworCXNwaW5fbG9ja19pbml0KCZnd2xhbl9sb2dnaW5nLnNwaW5fbG9jayk7CisJZ2FwcF9waWQgPSBJTlZBTElEX1BJRDsKKwlnd2xhbl9sb2dnaW5nLnBjdXJfbm9kZSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHdsYW5fbG9nZ2luZ19zb2NrX2RlaW5pdF9zdmModm9pZCkKK3sKKwlnd2xhbl9sb2dnaW5nLnBjdXJfbm9kZSA9IE5VTEw7CisJZ2FwcF9waWQgPSBJTlZBTElEX1BJRDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdsYW5fbG9nZ2luZ19zZXRfcGVyX3BrdF9zdGF0cygpIC0gVGhpcyBmdW5jdGlvbiB0cmlnZ2VycyBwZXIgcGFja2V0IGxvZ2dpbmcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBzaWduYWwgdG8gdGhlIGxvZ2dlciB0aHJlYWQgZm9yIGxvZ2dpbmcgcGVyCisgKiBwYWNrZXQgc3RhdHMKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqCisgKi8KK3ZvaWQgd2xhbl9sb2dnaW5nX3NldF9wZXJfcGt0X3N0YXRzKHZvaWQpCit7CisJaWYgKGd3bGFuX2xvZ2dpbmcuaXNfYWN0aXZlID09IGZhbHNlKQorCQlyZXR1cm47CisKKwlzZXRfYml0KEhPU1RfTE9HX1BFUl9QS1RfU1RBVFMsICZnd2xhbl9sb2dnaW5nLmV2ZW50RmxhZyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZnd2xhbl9sb2dnaW5nLndhaXRfcXVldWUpOworfQorCisvKioKKyAqIHdsYW5fbG9nZ2luZ19zZXRfbG9nX2xldmVsKCkgLSBTZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBsb2dnaW5nIGxldmVsIG9mIGhvc3QgZGVidWcgbWVzc2FnZXMKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCB3bGFuX2xvZ2dpbmdfc2V0X2xvZ19sZXZlbCh2b2lkKQoreworCXNldF9kZWZhdWx0X2xvZ3RvYXBwX2xvZ19sZXZlbCgpOworfQorCisvKgorICogd2xhbl9sb2dnaW5nX3NldF9md19mbHVzaF9jb21wbGV0ZSgpIC0gRlcgbG9nIGZsdXNoIGNvbXBsZXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBzaWduYWwgdG8gdGhlIGxvZ2dlciB0aHJlYWQgdG8gaW5kaWNhdGUKKyAqIHRoYXQgdGhlIGZsdXNoaW5nIG9mIEZXIGxvZ3MgaXMgY29tcGxldGUgYnkgdGhlIEZXCisgKgorICogUmV0dXJuOiBOb25lCisgKgorICovCit2b2lkIHdsYW5fbG9nZ2luZ19zZXRfZndfZmx1c2hfY29tcGxldGUodm9pZCkKK3sKKwlpZiAoZ3dsYW5fbG9nZ2luZy5pc19hY3RpdmUgPT0gZmFsc2UpCisJCXJldHVybjsKKworCXNldF9iaXQoSE9TVF9MT0dfRldfRkxVU0hfQ09NUExFVEUsICZnd2xhbl9sb2dnaW5nLmV2ZW50RmxhZyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZnd2xhbl9sb2dnaW5nLndhaXRfcXVldWUpOworfQorI2VuZGlmIC8qIFdMQU5fTE9HR0lOR19TT0NLX1NWQ19FTkFCTEUgKi8KZGlmZiAtLWdpdCBhL2NvcmUvdXRpbHMvbmxpbmsvaW5jL3dsYW5fbmxpbmtfY29tbW9uLmggYi9jb3JlL3V0aWxzL25saW5rL2luYy93bGFuX25saW5rX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzc2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL25saW5rL2luYy93bGFuX25saW5rX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgXGZpbGUgd2xhbl9ubGlua19jb21tb24uaAorCisgICBFeHBvcnRzIGFuZCB0eXBlcyBmb3IgdGhlIE5ldGxpbmsgU2VydmljZSBpbnRlcmZhY2UuIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMKKyAgIG1lc3NhZ2UgdHlwZXMgYW5kIGRlZmluaXRpb25zIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gdGhlIHVzZXIgc3BhY2Ugc2VydmljZQorICAgKGUuZy4gbG9nZ2luZyBzZXJ2aWNlKSBhbmQgV0xBTiBrZXJuZWwgbW9kdWxlLgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZuZGVmIFdMQU5fTkxJTktfQ09NTU9OX0hfXworI2RlZmluZSBXTEFOX05MSU5LX0NPTU1PTl9IX18KKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsIEZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXTEFOX05MX01BWF9QQVlMT0FEICAgMjU2ICAgICAgIC8qIG1heGltdW0gc2l6ZSBmb3IgbmV0bGluayBtZXNzYWdlICovCisjZGVmaW5lIFdMQU5fTkxJTktfUFJPVE9fRkFNSUxZICBORVRMSU5LX1VTRVJTT0NLCisjZGVmaW5lIFdMQU5fTkxJTktfTUNBU1RfR1JQX0lEICAweDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZW51bSBkZWZpbmVzIHRoZSB0YXJnZXQgc2VydmljZSB3aXRoaW4gV0xBTiBkcml2ZXIgZm9yIHdoaWNoIHRoZQorICogbWVzc2FnZSBpcyBpbnRlbmRlZCBmb3IuIEVhY2ggc2VydmljZSBhbG9uZyB3aXRoIGl0cyBjb3VudGVycGFydAorICogaW4gdGhlIHVzZXIgc3BhY2UsIGRlZmluZSBhIHNldCBvZiBtZXNzYWdlcyB0aGV5IHJlY29nbml6ZS4KKyAqIEVhY2ggb2YgdGhpcyBtZXNzYWdlIHdpbGwgaGF2ZSBhbiBoZWFkZXIgb2YgdHlwZSB0QW5pTXNnSGRyIGRlZmluZWQgYmVsb3cuCisgKiBFYWNoIE5ldGxpbmsgbWVzc2FnZSB0by9mcm9tIGEga2VybmVsIG1vZHVsZSB3aWxsIGNvbnRhaW4gb25seSBvbmUKKyAqIG1lc3NhZ2Ugd2hpY2ggaXMgcHJlY2VkZWQgYnkgYSB0QW5pTXNnSGRyLiBUaGUgbWF4aW11biBzaXplIChpbiBieXRlcykgb2YKKyAqIGEgbmV0bGluayBtZXNzYWdlIGlzIGFzc3VtZWQgdG8gYmUgTUFYX1BBWUxPQUQgYnl0ZXMuCisgKgorICogICAgICAgICArLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKworICogICAgICAgICB8TmV0bGluayBoZHIgfCBBbGlnbiB8dEFuaU1zZ0hkcnwgbXNnIGJvZHkgfAorICogICAgICAgICArLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLXwtLS0tLS0tLS0tKworICovCisKKy8qIE1lc3NhZ2UgVHlwZXMgKi8KKyNkZWZpbmUgV0xBTl9TVkNfRldfQ1JBU0hFRF9JTkQgICAgIDB4MTAwCisjZGVmaW5lIFdMQU5fU1ZDX0xURV9DT0VYX0lORCAgICAgICAweDEwMQorI2RlZmluZSBXTEFOX1NWQ19XTEFOX0FVVE9fU0hVVERPV05fSU5EIDB4MTAyCisjZGVmaW5lIFdMQU5fU1ZDX0RGU19DQUNfU1RBUlRfSU5EICAgICAgMHgxMDMKKyNkZWZpbmUgV0xBTl9TVkNfREZTX0NBQ19FTkRfSU5EICAgICAgICAweDEwNAorI2RlZmluZSBXTEFOX1NWQ19ERlNfUkFEQVJfREVURUNUX0lORCAgIDB4MTA1CisjZGVmaW5lIFdMQU5fU1ZDX1dMQU5fU1RBVFVTX0lORCAgICAweDEwNgorI2RlZmluZSBXTEFOX1NWQ19XTEFOX1ZFUlNJT05fSU5EICAgMHgxMDcKKyNkZWZpbmUgV0xBTl9TVkNfREZTX0FMTF9DSEFOTkVMX1VOQVZBSUxfSU5EIDB4MTA4CisjZGVmaW5lIFdMQU5fU1ZDX1dMQU5fVFBfSU5EICAgICAgICAweDEwOQorCisjZGVmaW5lIFdMQU5fU1ZDX01BWF9TU0lEX0xFTiAgICAzMgorI2RlZmluZSBXTEFOX1NWQ19NQVhfQlNTSURfTEVOICAgNgorI2RlZmluZSBXTEFOX1NWQ19NQVhfU1RSX0xFTiAgICAgMTYKKyNkZWZpbmUgV0xBTl9TVkNfTUFYX05VTV9DSEFOICAgIDEyOAorI2RlZmluZSBXTEFOX1NWQ19DT1VOVFJZX0NPREVfTEVOIDMKKworI2RlZmluZSBBTklfTkxfTVNHX0JBU0UgICAgIDB4MTAgICAgICAgIC8qIFNvbWUgYXJiaXRyYXJ5IGJhc2UgKi8KKwordHlwZWRlZiBlbnVtIGVBbmlObE1vZHVsZVR5cGVzIHsKKwlBTklfTkxfTVNHX1BVTUFDID0gQU5JX05MX01TR19CQVNFICsgMHgwMSwgICAgICAvKiBQVFQgU29ja2V0IEFwcCAqLworCUFOSV9OTF9NU0dfUFRUID0gQU5JX05MX01TR19CQVNFICsgMHgwNywgICAgICAgIC8qIFF1YXJreSBHVUkgKi8KKwlXTEFOX05MX01TR19PRU0gPSBBTklfTkxfTVNHX0JBU0UgKyAweDA5LAorCVdMQU5fTkxfTVNHX1NWQywKKwlXTEFOX05MX01TR19DTlNTX0RJQUcgPSBBTklfTkxfTVNHX0JBU0UgKyAweDBCLCAvKiBWYWx1ZSBuZWVkcyB0byBiZSAyNyAqLworCUFOSV9OTF9NU0dfTE9HLAorCUFOSV9OTF9NU0dfTUFYCit9IHRBbmlObE1vZFR5cGVzLCB0V2xhbk5sTW9kVHlwZXM7CisKKyNkZWZpbmUgV0xBTl9OTF9NU0dfQkFTRSBBTklfTkxfTVNHX0JBU0UKKyNkZWZpbmUgV0xBTl9OTF9NU0dfTUFYICBBTklfTkxfTVNHX01BWAorCisvKiBBbGwgTmV0bGluayBtZXNzYWdlcyBtdXN0IGNvbnRhaW4gdGhpcyBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IHNBbmlIZHIgeworCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworfSB0QW5pSGRyLCB0QW5pTXNnSGRyOworCitzdHJ1Y3Qgd2xhbl9zdGF0dXNfZGF0YSB7CisJdWludDhfdCBscHNzX3N1cHBvcnQ7CisJdWludDhfdCBpc19vbjsKKwl1aW50OF90IHZkZXZfaWQ7CisJdWludDhfdCBpc19jb25uZWN0ZWQ7CisJaW50OF90IHJzc2k7CisJdWludDhfdCBzc2lkX2xlbjsKKwl1aW50OF90IGNvdW50cnlfY29kZVtXTEFOX1NWQ19DT1VOVFJZX0NPREVfTEVOXTsKKwl1aW50MzJfdCB2ZGV2X21vZGU7CisJdWludDMyX3QgZnJlcTsKKwl1aW50MzJfdCBudW1DaGFubmVsczsKKwl1aW50OF90IGNoYW5uZWxfbGlzdFtXTEFOX1NWQ19NQVhfTlVNX0NIQU5dOworCXVpbnQ4X3Qgc3NpZFtXTEFOX1NWQ19NQVhfU1NJRF9MRU5dOworCXVpbnQ4X3QgYnNzaWRbV0xBTl9TVkNfTUFYX0JTU0lEX0xFTl07Cit9OworCitzdHJ1Y3Qgd2xhbl92ZXJzaW9uX2RhdGEgeworCXVpbnQzMl90IGNoaXBfaWQ7CisJY2hhciBjaGlwX25hbWVbV0xBTl9TVkNfTUFYX1NUUl9MRU5dOworCWNoYXIgY2hpcF9mcm9tW1dMQU5fU1ZDX01BWF9TVFJfTEVOXTsKKwljaGFyIGhvc3RfdmVyc2lvbltXTEFOX1NWQ19NQVhfU1RSX0xFTl07CisJY2hhciBmd192ZXJzaW9uW1dMQU5fU1ZDX01BWF9TVFJfTEVOXTsKK307CisKK3N0cnVjdCB3bGFuX2Rmc19pbmZvIHsKKwl1aW50MTZfdCBjaGFubmVsOworCXVpbnQ4X3QgY291bnRyeV9jb2RlW1dMQU5fU1ZDX0NPVU5UUllfQ09ERV9MRU5dOworfTsKKworI2VuZGlmIC8qIFdMQU5fTkxJTktfQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9ubGluay9pbmMvd2xhbl9ubGlua19zcnYuaCBiL2NvcmUvdXRpbHMvbmxpbmsvaW5jL3dsYW5fbmxpbmtfc3J2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3M2E3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdXRpbHMvbmxpbmsvaW5jL3dsYW5fbmxpbmtfc3J2LmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB3bGFuX25saW5rX3Nydi5oCisqCisqIHdsYW5fbmxpbmtfc3J2IGlzIHVzZWQgdG8gUlgvVFggTmV0bGluayBtZXNzYWdlcyBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsCisqIG1vZHVsZXMgYW5kIHZpY2UgdmVyc2EuIEtlcm5lbCBtb2R1bGVzIG11c3QgcmVnaXN0ZXIgYSBtZXNzYWdlIGhhbmRsZXIgZm9yIGEKKyogbWVzc2FnZSB0eXBlIHNvIHRoYXQgdGhlIHdsYW5fbmxpbmtfc3J2IGNhbiBpbnZva2UgdGhlIGNvcnJlc3BvbmRpbmcgbXNnIGhhbmRsZXIKKyogd2hlbmV2ZXIgYSBOZXRsaW5rIG1lc3NhZ2Ugb2YgYSBwYXJ0aWN1bGFyIHR5cGUgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSBhbgorKiBhcHBsaWNhdGlvbi4gIEluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24sIHdsYW5fbmxpbmtfc3J2IHByb3ZpZGVzIGEgbWVjaGFuaXNtCisqIHdoaWNoIGtlcm5lbCBtb2R1bGVzIGNhbiB1c2UgdG8gc2VuZCBOZXRsaW5rIG1lc3NhZ2VzIHRvIGFwcGxpY2F0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBXTEFOX05MSU5LX1NSVl9ICisjZGVmaW5lIFdMQU5fTkxJTktfU1JWX0gKKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8d2xhbl9ubGlua19jb21tb24uaD4KKworI2RlZmluZSBJTlZBTElEX1BJRCAtMQorI2RlZmluZSBOTElOS19NQVhfQ0FMTEJBQ0tTIChXTEFOX05MX01TR19NQVggLSBXTEFOX05MX01TR19CQVNFKQorCit0eXBlZGVmIGludCAoKm5sX3Nydl9tc2dfY2FsbGJhY2spKHN0cnVjdCBza19idWZmICpza2IpOworCitpbnQgbmxfc3J2X2luaXQodm9pZCk7Cit2b2lkIG5sX3Nydl9leGl0KHZvaWQpOworaW50IG5sX3Nydl9yZWdpc3Rlcih0V2xhbk5sTW9kVHlwZXMgbXNnX3R5cGUsIG5sX3Nydl9tc2dfY2FsbGJhY2sgbXNnX2hhbmRsZXIpOworaW50IG5sX3Nydl91bnJlZ2lzdGVyKHRXbGFuTmxNb2RUeXBlcyBtc2dfdHlwZSwKKwkJICAgICAgbmxfc3J2X21zZ19jYWxsYmFjayBtc2dfaGFuZGxlcik7CitpbnQgbmxfc3J2X3VjYXN0KHN0cnVjdCBza19idWZmICpza2IsIGludCBkc3RfcGlkLCBpbnQgZmxhZyk7CitpbnQgbmxfc3J2X2JjYXN0KHN0cnVjdCBza19idWZmICpza2IpOworaW50IG5sX3Nydl9pc19pbml0aWFsaXplZCh2b2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9ubGluay9zcmMvd2xhbl9ubGlua19zcnYuYyBiL2NvcmUvdXRpbHMvbmxpbmsvc3JjL3dsYW5fbmxpbmtfc3J2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkMDg0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdXRpbHMvbmxpbmsvc3JjL3dsYW5fbmxpbmtfc3J2LmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogd2xhbl9ubGlua19zcnYuYworKgorKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSB3bGFuX25saW5rX3NydgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDx3bGFuX25saW5rX3Nydi5oPgorI2luY2x1ZGUgPGNkZl90cmFjZS5oPgorCisvKiBHbG9iYWwgdmFyaWFibGVzICovCitzdGF0aWMgREVGSU5FX01VVEVYKG5sX3Nydl9zZW0pOworc3RhdGljIHN0cnVjdCBzb2NrICpubF9zcnZfc29jazsKK3N0YXRpYyBubF9zcnZfbXNnX2NhbGxiYWNrIG5sX3Nydl9tc2dfaGFuZGxlcltOTElOS19NQVhfQ0FMTEJBQ0tTXTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgbmxfc3J2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2spOworc3RhdGljIHZvaWQgbmxfc3J2X3Jjdl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBubF9zcnZfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCk7CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBuZXRsaW5rIHNlcnZpY2UuCisgKiBOZXRsaW5rIHNlcnZpY2UgaXMgdXNhYmxlIGFmdGVyIHRoaXMuCisgKi8KK2ludCBubF9zcnZfaW5pdCh2b2lkKQoreworCWludCByZXRjb2RlID0gMDsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCXN0cnVjdCBuZXRsaW5rX2tlcm5lbF9jZmcgY2ZnID0geworCQkuZ3JvdXBzID0gV0xBTl9OTElOS19NQ0FTVF9HUlBfSUQsCisJCS5pbnB1dCA9IG5sX3Nydl9yY3YKKwl9OworI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDYsIDApKQorCW5sX3Nydl9zb2NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKCZpbml0X25ldCwgV0xBTl9OTElOS19QUk9UT19GQU1JTFksCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDcsIDApKQorCQkJCQkgICAgVEhJU19NT0RVTEUsCisjZW5kaWYKKwkJCQkJICAgICZjZmcpOworI2Vsc2UKKwlubF9zcnZfc29jayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZSgmaW5pdF9uZXQsIFdMQU5fTkxJTktfUFJPVE9fRkFNSUxZLAorCQkJCQkgICAgV0xBTl9OTElOS19NQ0FTVF9HUlBfSUQsIG5sX3Nydl9yY3YsCisJCQkJCSAgICBOVUxMLCBUSElTX01PRFVMRSk7CisjZW5kaWYKKworCWlmIChubF9zcnZfc29jayAhPSBOVUxMKSB7CisJCW1lbXNldChubF9zcnZfbXNnX2hhbmRsZXIsIDAsIHNpemVvZihubF9zcnZfbXNnX2hhbmRsZXIpKTsKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIk5MSU5LOiBuZXRsaW5rX2tlcm5lbF9jcmVhdGUgZmFpbGVkIik7CisJCXJldGNvZGUgPSAtRUNPTk5SRUZVU0VEOworCX0KKwlyZXR1cm4gcmV0Y29kZTsKK30KKworLyoKKyAqIERlaW5pdCB0aGUgbmV0bGluayBzZXJ2aWNlLgorICogTmV0bGluayBzZXJ2aWNlIGlzIHVudXNhYmxlIGFmdGVyIHRoaXMuCisgKi8KK3ZvaWQgbmxfc3J2X2V4aXQodm9pZCkKK3sKKwlpZiAobmxfc3J2X2lzX2luaXRpYWxpemVkKCkgPT0gMCkKKwkJbmV0bGlua19rZXJuZWxfcmVsZWFzZShubF9zcnZfc29jayk7CisKKwlubF9zcnZfc29jayA9IE5VTEw7Cit9CisKKy8qCisgKiBSZWdpc3RlciBhIG1lc3NhZ2UgaGFuZGxlciBmb3IgYSBzcGVjaWZpZWQgbW9kdWxlLgorICogRWFjaCBtb2R1bGUgKGUuZy4gV0xBTl9OTF9NU0dfQlRDICl3aWxsIHJlZ2lzdGVyIGEKKyAqIGhhbmRsZXIgdG8gaGFuZGxlIG1lc3NhZ2VzIGFkZHJlc3NlZCB0byBpdC4KKyAqLworaW50IG5sX3Nydl9yZWdpc3Rlcih0V2xhbk5sTW9kVHlwZXMgbXNnX3R5cGUsIG5sX3Nydl9tc2dfY2FsbGJhY2sgbXNnX2hhbmRsZXIpCit7CisJaW50IHJldGNvZGUgPSAwOworCisJaWYgKChtc2dfdHlwZSA+PSBXTEFOX05MX01TR19CQVNFKSAmJiAobXNnX3R5cGUgPCBXTEFOX05MX01TR19NQVgpICYmCisJICAgIG1zZ19oYW5kbGVyICE9IE5VTEwpIHsKKwkJbmxfc3J2X21zZ19oYW5kbGVyW21zZ190eXBlIC0gV0xBTl9OTF9NU0dfQkFTRV0gPSBtc2dfaGFuZGxlcjsKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICAiTkxJTks6IG5sX3Nydl9yZWdpc3RlciBmYWlsZWQgZm9yIG1zZ190eXBlICVkIiwKKwkJCSAgbXNnX3R5cGUpOworCQlyZXRjb2RlID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworLyoKKyAqIFVucmVnaXN0ZXIgdGhlIG1lc3NhZ2UgaGFuZGxlciBmb3IgYSBzcGVjaWZpZWQgbW9kdWxlLgorICovCitpbnQgbmxfc3J2X3VucmVnaXN0ZXIodFdsYW5ObE1vZFR5cGVzIG1zZ190eXBlLCBubF9zcnZfbXNnX2NhbGxiYWNrIG1zZ19oYW5kbGVyKQoreworCWludCByZXRjb2RlID0gMDsKKworCWlmICgobXNnX3R5cGUgPj0gV0xBTl9OTF9NU0dfQkFTRSkgJiYgKG1zZ190eXBlIDwgV0xBTl9OTF9NU0dfTUFYKSAmJgorCSAgICAobmxfc3J2X21zZ19oYW5kbGVyW21zZ190eXBlIC0gV0xBTl9OTF9NU0dfQkFTRV0gPT0gbXNnX2hhbmRsZXIpKSB7CisJCW5sX3Nydl9tc2dfaGFuZGxlclttc2dfdHlwZSAtIFdMQU5fTkxfTVNHX0JBU0VdID0gTlVMTDsKKwl9IGVsc2UgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICAiTkxJTks6IG5sX3Nydl91bnJlZ2lzdGVyIGZhaWxlZCBmb3IgbXNnX3R5cGUgJWQiLAorCQkJICBtc2dfdHlwZSk7CisJCXJldGNvZGUgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXRjb2RlOworfQorCisvKgorICogVW5pY2FzdCB0aGUgbWVzc2FnZSB0byB0aGUgcHJvY2VzcyBpbiB1c2VyIHNwYWNlIGlkZW50ZmllZAorICogYnkgdGhlIGRzdC1waWQKKyAqLworaW50IG5sX3Nydl91Y2FzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZHN0X3BpZCwgaW50IGZsYWcpCit7CisJaW50IGVycjsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLCA3LCAwKSkKKwlORVRMSU5LX0NCKHNrYikucGlkID0gMDsgICAgICAgIC8qIHNlbmRlcidzIHBpZCAqLworI2Vsc2UKKwlORVRMSU5LX0NCKHNrYikucG9ydGlkID0gMDsgICAgIC8qIHNlbmRlcidzIHBpZCAqLworI2VuZGlmCisJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IDA7ICAvKiBub3QgbXVsdGljYXN0ICovCisKKwllcnIgPSBuZXRsaW5rX3VuaWNhc3Qobmxfc3J2X3NvY2ssIHNrYiwgZHN0X3BpZCwgZmxhZyk7CisKKwlpZiAoZXJyIDwgMCkKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSAgIk5MSU5LOiBuZXRsaW5rX3VuaWNhc3QgdG8gcGlkWyVkXSBmYWlsZWQsIHJldFsweCVYXSIsCisJCQkgIGRzdF9waWQsIGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogIEJyb2FkY2FzdCB0aGUgbWVzc2FnZS4gQnJvYWRjYXN0IHdpbGwgcmV0dXJuIGFuIGVycm9yIGlmCisgKiAgdGhlcmUgYXJlIG5vIGxpc3RlbmVycworICovCitpbnQgbmxfc3J2X2JjYXN0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVycjsKKwlpbnQgZmxhZ3MgPSBHRlBfS0VSTkVMOworCisJaWYgKGluX2ludGVycnVwdCgpIHx8IGlycXNfZGlzYWJsZWQoKSB8fCBpbl9hdG9taWMoKSkKKwkJZmxhZ3MgPSBHRlBfQVRPTUlDOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDcsIDApKQorCU5FVExJTktfQ0Ioc2tiKS5waWQgPSAwOyAgICAgICAgLyogc2VuZGVyJ3MgcGlkICovCisjZWxzZQorCU5FVExJTktfQ0Ioc2tiKS5wb3J0aWQgPSAwOyAgICAgLyogc2VuZGVyJ3MgcGlkICovCisjZW5kaWYKKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gV0xBTl9OTElOS19NQ0FTVF9HUlBfSUQ7ICAgIC8qIGRlc3RpbmF0aW9uIGdyb3VwICovCisKKwllcnIgPQorCQluZXRsaW5rX2Jyb2FkY2FzdChubF9zcnZfc29jaywgc2tiLCAwLCBXTEFOX05MSU5LX01DQVNUX0dSUF9JRCwKKwkJCQkgIGZsYWdzKTsKKworCWlmIChlcnIgPCAwKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX1dBUk4sCisJCQkgICJOTElOSzogbmV0bGlua19icm9hZGNhc3QgZmFpbGVkIGVyciA9ICVkIiwgZXJyKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqICBQcm9jZXNzZXMgdGhlIE5ldGxpbmsgc29ja2V0IGlucHV0IHF1ZXVlLgorICogIERlcXVldWUgc2tiJ3MgZnJvbSB0aGUgc29ja2V0IGlucHV0IHF1ZXVlIGFuZCBwcm9jZXNzCisgKiAgYWxsIHRoZSBuZXRsaW5rIG1lc3NhZ2VzIGluIHRoYXQgc2tiLCBiZWZvcmUgbW92aW5nCisgKiAgdG8gdGhlIG5leHQgc2tiLgorICovCitzdGF0aWMgdm9pZCBubF9zcnZfcmN2KHN0cnVjdCBza19idWZmICpzaykKK3sKKwltdXRleF9sb2NrKCZubF9zcnZfc2VtKTsKKwlubF9zcnZfcmN2X3NrYihzayk7CisJbXV0ZXhfdW5sb2NrKCZubF9zcnZfc2VtKTsKK30KKworLyoKKyAqIEVhY2ggc2tiIGNvdWxkIGNvbnRhaW4gbXVsdGlwbGUgTmV0bGluayBtZXNzYWdlcy4gUHJvY2VzcyBhbGwgdGhlCisgKiBtZXNzYWdlcyBpbiBvbmUgc2tiIGFuZCBkaXNjYXJkIG1hbGZvcm1lZCBza2IncyBzaWxlbnRseS4KKyAqLworc3RhdGljIHZvaWQgbmxfc3J2X3Jjdl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKworCXdoaWxlIChza2ItPmxlbiA+PSBOTE1TR19TUEFDRSgwKSkgeworCQl1MzIgcmxlbjsKKworCQlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCisJCWlmIChubGgtPm5sbXNnX2xlbiA8IHNpemVvZigqbmxoKSB8fCBza2ItPmxlbiA8IG5saC0+bmxtc2dfbGVuKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJCSAgIk5MSU5LOiBJbnZhbGlkICIKKwkJCQkgICJOZXRsaW5rIG1lc3NhZ2U6IHNrYlslcF0sIGxlblslZF0sIG5saGRyWyVwXSwgbmxtc2dfbGVuWyVkXSIsCisJCQkJICBza2IsIHNrYi0+bGVuLCBubGgsIG5saC0+bmxtc2dfbGVuKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXJsZW4gPSBOTE1TR19BTElHTihubGgtPm5sbXNnX2xlbik7CisJCWlmIChybGVuID4gc2tiLT5sZW4pCisJCQlybGVuID0gc2tiLT5sZW47CisJCW5sX3Nydl9yY3ZfbXNnKHNrYiwgbmxoKTsKKwkJc2tiX3B1bGwoc2tiLCBybGVuKTsKKwl9Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgbmV0bGluayBtZXNzYWdlLgorICogRWFjaCBuZXRsaW5rIG1lc3NhZ2Ugd2lsbCBoYXZlIGEgbWVzc2FnZSBvZiB0eXBlIHRBbmlNc2dIZHIgaW5zaWRlLgorICovCitzdGF0aWMgdm9pZCBubF9zcnZfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKK3sKKwlpbnQgdHlwZTsKKworCS8qIE9ubHkgcmVxdWVzdHMgYXJlIGhhbmRsZWQgYnkga2VybmVsIG5vdyAqLworCWlmICghKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVFVRVNUKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICAiTkxJTks6IFJlY2VpdmVkIEludmFsaWQgTkwgUmVxIHR5cGUgWyV4XSIsCisJCQkgIG5saC0+bmxtc2dfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJdHlwZSA9IG5saC0+bmxtc2dfdHlwZTsKKworCS8qIFVua25vd24gbWVzc2FnZSAqLworCWlmICh0eXBlIDwgV0xBTl9OTF9NU0dfQkFTRSB8fCB0eXBlID49IFdMQU5fTkxfTVNHX01BWCkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICAiTkxJTks6IFJlY2VpdmVkIEludmFsaWQgTkwgTXNnIHR5cGUgWyV4XSIsIHR5cGUpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBBbGwgdGhlIG1lc3NhZ2VzIG11c3QgYXQgbGVhc3QgY2FycnkgdGhlIHRBbmlNc2dIZHIKKwkgKiBEcm9wIGFueSBtZXNzYWdlIHdpdGggaW52YWxpZCBsZW5ndGgKKwkgKi8KKwlpZiAobmxoLT5ubG1zZ19sZW4gPCBOTE1TR19MRU5HVEgoc2l6ZW9mKHRBbmlNc2dIZHIpKSkgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9IREQsIENERl9UUkFDRV9MRVZFTF9XQVJOLAorCQkJICAiTkxJTks6IFJlY2VpdmVkIE5MIE1zZyB3aXRoIGludmFsaWQgbGVuWyV4XSIsCisJCQkgIG5saC0+bmxtc2dfbGVuKTsKKwkJcmV0dXJuOworCX0KKworCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX0hERCwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIk5MSU5LOiBSZWNlaXZlZCBOTCBtc2cgdHlwZSBbJWRdIiwgdHlwZSk7CisKKwkvKiB0dXJuIHR5cGUgaW50byBkaXNwYXRjaCB0YWJsZSBvZmZzZXQgKi8KKwl0eXBlIC09IFdMQU5fTkxfTVNHX0JBU0U7CisKKwkvKiBkaXNwYXRjaCB0byBoYW5kbGVyICovCisJaWYgKG5sX3Nydl9tc2dfaGFuZGxlclt0eXBlXSAhPSBOVUxMKSB7CisJCShubF9zcnZfbXNnX2hhbmRsZXJbdHlwZV0pKHNrYik7CisJfSBlbHNlIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfSERELCBDREZfVFJBQ0VfTEVWRUxfV0FSTiwKKwkJCSAgIk5MSU5LOiBObyBoYW5kbGVyIGZvciBOZXRsaW5rIE1zZyBbMHglWF0iLCB0eXBlKTsKKwl9Cit9CisKKy8qKgorICogbmxfc3J2X2lzX2luaXRpYWxpemVkKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgY2hlY2sgaWYgdGhlIG5ldGxpbmsKKyAqIHNlcnZpY2UgaXMgaW5pdGlhbGl6ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgY2hlY2sgaWYgdGhlIG5ldGxpbmsgc2VydmljZSBpcyBpbml0aWFsaXplZAorICoKKyAqIFJldHVybjogUmV0dXJuIC1FUEVSTSBpZiB0aGUgc2VydmljZSBpcyBub3QgaW5pdGlhbGl6ZWQKKyAqCisgKi8KK2ludCBubF9zcnZfaXNfaW5pdGlhbGl6ZWQoKQoreworCWlmIChubF9zcnZfc29jaykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVQRVJNOworfQpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9wa3Rsb2cvaW5jbHVkZS9wa3Rsb2cuaCBiL2NvcmUvdXRpbHMvcGt0bG9nL2luY2x1ZGUvcGt0bG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiZjIyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdXRpbHMvcGt0bG9nL2luY2x1ZGUvcGt0bG9nLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfUEtUTE9HXworI2RlZmluZSBfUEtUTE9HXworI2lmbmRlZiBSRU1PVkVfUEtUX0xPRworCisvKioKKyAqIEB0eXBlZGVmIG9sX3BrdGxvZ19kZXZfaGFuZGxlCisgKiBAYnJpZWYgb3BhcXVlIGhhbmRsZSBmb3IgcGt0bG9nIGRldmljZSBvYmplY3QKKyAqLworc3RydWN0IG9sX3BrdGxvZ19kZXZfdDsKK3R5cGVkZWYgc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqb2xfcGt0bG9nX2Rldl9oYW5kbGU7CisjZW5kaWYgLyogI2lmbmRlZiBSRU1PVkVfUEtUX0xPRyAqLworI2VuZGlmIC8qIF9QS1RMT0dfICovCmRpZmYgLS1naXQgYS9jb3JlL3V0aWxzL3BrdGxvZy9pbmNsdWRlL3BrdGxvZ19hYy5oIGIvY29yZS91dGlscy9wa3Rsb2cvaW5jbHVkZS9wa3Rsb2dfYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTVhNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS91dGlscy9wa3Rsb2cvaW5jbHVkZS9wa3Rsb2dfYWMuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfUEtUTE9HX0FDX0hfCisjZGVmaW5lIF9QS1RMT0dfQUNfSF8KKyNpZm5kZWYgUkVNT1ZFX1BLVF9MT0cKKworI2luY2x1ZGUgIm9sX2lmX2F0aHZhci5oIgorI2luY2x1ZGUgPHBrdGxvZ19hY19hcGkuaD4KKyNpbmNsdWRlIDxwa3Rsb2dfYWNfZm10Lmg+CisjaW5jbHVkZSAib3NkZXAuaCIKKyNpbmNsdWRlIDx3bWlfdW5pZmllZC5oPgorI2luY2x1ZGUgPHdtaV91bmlmaWVkX2FwaS5oPgorI2luY2x1ZGUgPHdkaV9ldmVudF9hcGkuaD4KKyNpbmNsdWRlICJoaWYuaCIKKworI2RlZmluZSBOT19SRUdfRlVOQ1MgICAgNAorCisvKiBMb2NraW5nIGludGVyZmFjZSBmb3IgcGt0bG9nICovCisjZGVmaW5lIFBLVExPR19MT0NLX0lOSVQoX3BsX2luZm8pICAgICAgc3Bpbl9sb2NrX2luaXQoJihfcGxfaW5mbyktPmxvZ19sb2NrKQorI2RlZmluZSBQS1RMT0dfTE9DS19ERVNUUk9ZKF9wbF9pbmZvKQorI2RlZmluZSBQS1RMT0dfTE9DSyhfcGxfaW5mbykgICAgICAgICAgIHNwaW5fbG9jaygmKF9wbF9pbmZvKS0+bG9nX2xvY2spCisjZGVmaW5lIFBLVExPR19VTkxPQ0soX3BsX2luZm8pICAgICAgICAgc3Bpbl91bmxvY2soJihfcGxfaW5mbyktPmxvZ19sb2NrKQorCisjZGVmaW5lIFBLVExPR19NT0RFX1NZU1RFTSAgICAgIDEKKyNkZWZpbmUgUEtUTE9HX01PREVfQURBUFRFUiAgICAgMgorCisvKgorICogVGhlIHByb2MgZW50cnkgc3RhcnRzIHdpdGggbWFnaWMgbnVtYmVyIGFuZCB2ZXJzaW9uIGZpZWxkIHdoaWNoIHdpbGwgYmUKKyAqIHVzZWQgYnkgcG9zdCBwcm9jZXNzaW5nIHNjcmlwdHMuIFRoZXNlIGZpZWxkcyBhcmUgbm90IG5lZWRlZCBieSBhcHBsaWNhdGlvbnMKKyAqIHRoYXQgZG8gbm90IHVzZSB0aGVzZSBzY3JpcHRzLiBUaGlzIGlzIHNraXBwZWQgdXNpbmcgdGhlIG9mZnNldCB2YWx1ZS4KKyAqLworI2RlZmluZSBQS1RMT0dfUkVBRF9PRkZTRVQgICAgOAorCisvKiBPcGFxdWUgc29mdGMgKi8KK3N0cnVjdCBvbF9hdGhfZ2VuZXJpY19zb2Z0Y190OwordHlwZWRlZiBzdHJ1Y3Qgb2xfYXRoX2dlbmVyaWNfc29mdGNfdCAqb2xfYXRoX2dlbmVyaWNfc29mdGNfaGFuZGxlOworZXh0ZXJuIHZvaWQgcGt0bG9nX2Rpc2FibGVfYWRhcHRlcl9sb2dnaW5nKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK2V4dGVybiBpbnQgcGt0bG9nX2FsbG9jX2J1ZihzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CitleHRlcm4gdm9pZCBwa3Rsb2dfcmVsZWFzZV9idWYoc3RydWN0IG9sX3NvZnRjICpzY24pOworCitzc2l6ZV90IHBrdGxvZ19yZWFkX3Byb2NfZW50cnkoY2hhciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MsCisJCXN0cnVjdCBhdGhfcGt0bG9nX2luZm8gKnBsX2luZm8sIGJvb2wgKnJlYWRfY29tcGxldGUpOworaW50IHBrdGxvZ19zZW5kX3Blcl9wa3Rfc3RhdHNfdG9fdXNlcih2b2lkKTsKKworc3RydWN0IG9sX3BsX2FyY2hfZGVwX2Z1bmNzIHsKKwl2b2lkICgqcGt0bG9nX2luaXQpKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKKwlpbnQgKCpwa3Rsb2dfZW5hYmxlKShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgaW50MzJfdCBsb2dfc3RhdGUpOworCWludCAoKnBrdGxvZ19zZXRzaXplKShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgaW50MzJfdCBsb2dfc3RhdGUpOworCWludCAoKnBrdGxvZ19kaXNhYmxlKShzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7Cit9OworCitzdHJ1Y3Qgb2xfcGxfb3NfZGVwX2Z1bmNzIHsKKwlpbnQgKCpwa3Rsb2dfYXR0YWNoKShzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CisJdm9pZCAoKnBrdGxvZ19kZXRhY2gpKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKTsKK307CisKK3N0cnVjdCBhdGhfcGt0bG9nX3dtaV9wYXJhbXMgeworCVdNSV9QS1RMT0dfRVZFTlQgcGt0bG9nX2V2ZW50OworCVdNSV9DTURfSUQgY21kX2lkOworfTsKKworZXh0ZXJuIHN0cnVjdCBvbF9wbF9hcmNoX2RlcF9mdW5jcyBvbF9wbF9mdW5jczsKK2V4dGVybiBzdHJ1Y3Qgb2xfcGxfb3NfZGVwX2Z1bmNzICpnX29sX3BsX29zX2RlcF9mdW5jczsKKworLyogUGt0bG9nIGhhbmRsZXIgdG8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIHBrdGxvZ3MgKi8KK3N0cnVjdCBvbF9wa3Rsb2dfZGV2X3QgeworCXN0cnVjdCBvbF9wbF9hcmNoX2RlcF9mdW5jcyAqcGxfZnVuY3M7CisJc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqcGxfaW5mbzsKKwlvbF9hdGhfZ2VuZXJpY19zb2Z0Y19oYW5kbGUgc2NuOworCWNoYXIgKm5hbWU7CisJYm9vbCB0Z3RfcGt0bG9nX2VuYWJsZWQ7CisJb3NkZXZfdCBzY19vc2RldjsKK307CisKKyNkZWZpbmUgUEtUTE9HX1NZU0NUTF9TSVpFICAgICAgMTQKKworLyoKKyAqIExpbnV4IHNwZWNpZmljIHBrdGxvZyBzdGF0ZSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvX2xueCB7CisJc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyBpbmZvOworCXN0cnVjdCBjdGxfdGFibGUgc3lzY3Rsc1tQS1RMT0dfU1lTQ1RMX1NJWkVdOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnRyeTsKKwlzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc3lzY3RsX2hlYWRlcjsKK307CisKKyNkZWZpbmUgUExfSU5GT19MTlgoX3BsX2luZm8pICAgKChzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvX2xueCAqKShfcGxfaW5mbykpCisKK2V4dGVybiBzdHJ1Y3Qgb2xfcGt0bG9nX2Rldl90IG9sX3BsX2RldjsKKworLyoKKyAqIFdESSByZWxhdGVkIGRhdGEgYW5kIGZ1bmN0aW9ucworICogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gdGhlIFdESSBldmVudHMKKyAqLwordm9pZCBwa3Rsb2dfY2FsbGJhY2sodm9pZCAqcGRldiwgZW51bSBXRElfRVZFTlQgZXZlbnQsIHZvaWQgKmxvZ19kYXRhKTsKKwordm9pZCBwa3Rsb2dfaW5pdChzdHJ1Y3Qgb2xfc29mdGMgKnNjbik7CitpbnQgcGt0bG9nX2VuYWJsZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbiwgaW50MzJfdCBsb2dfc3RhdGUpOworaW50IHBrdGxvZ19zZXRzaXplKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBpbnQzMl90IGxvZ19zdGF0ZSk7CitpbnQgcGt0bG9nX2Rpc2FibGUoc3RydWN0IG9sX3NvZnRjICpzY24pOworaW50IHBrdGxvZ21vZF9pbml0KHZvaWQgKmNvbnRleHQpOwordm9pZCBwa3Rsb2dtb2RfZXhpdCh2b2lkICpjb250ZXh0KTsKKworI2RlZmluZSBvbF9wa3Rsb2dfYXR0YWNoKF9zY24pCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKGdfb2xfcGxfb3NfZGVwX2Z1bmNzKSB7CVwKKwkJCWdfb2xfcGxfb3NfZGVwX2Z1bmNzLT5wa3Rsb2dfYXR0YWNoKF9zY24pOwlcCisJCX0JCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgb2xfcGt0bG9nX2RldGFjaChfc2NuKQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChnX29sX3BsX29zX2RlcF9mdW5jcykgewlcCisJCQlnX29sX3BsX29zX2RlcF9mdW5jcy0+cGt0bG9nX2RldGFjaChfc2NuKTsJXAorCQl9CQkJCVwKKwl9IHdoaWxlICgwKQorCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFTU9WRV9QS1RfTE9HICovCisjZGVmaW5lIG9sX3BrdGxvZ19hdHRhY2goX3NjbikgICh7ICh2b2lkKV9zY247IH0pCisjZGVmaW5lIG9sX3BrdGxvZ19kZXRhY2goX3NjbikgICh7ICh2b2lkKV9zY247IH0pCitzdGF0aWMgaW5saW5lIHZvaWQgcGt0bG9nX2luaXQoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJcmV0dXJuOworfQorc3RhdGljIGludCBwa3Rsb2dfZW5hYmxlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBpbnQzMl90IGxvZ19zdGF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgcGt0bG9nX3NldHNpemUoc3RydWN0IG9sX3NvZnRjICpzY24sIGludDMyX3QgbG9nX3N0YXRlKQoreworCXJldHVybiAwOworfQorc3RhdGljIGludCBwa3Rsb2dfZGlzYWJsZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBSRU1PVkVfUEtUX0xPRyAqLworI2VuZGlmIC8qIF9QS1RMT0dfQUNfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvdXRpbHMvcGt0bG9nL2luY2x1ZGUvcGt0bG9nX2FjX2FwaS5oIGIvY29yZS91dGlscy9wa3Rsb2cvaW5jbHVkZS9wa3Rsb2dfYWNfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiMzJmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdXRpbHMvcGt0bG9nL2luY2x1ZGUvcGt0bG9nX2FjX2FwaS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogIFRoZSBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHN0cnVjdHVyZXMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4KKyAqICBrZXJuZWwgc3BhY2UgYW5kIHVzZXIgc3BhY2UgcGt0bG9nIGFwcGxpY2F0aW9uLgorICovCisKKyNpZm5kZWYgX1BLVExPR19BQ19BUElfCisjZGVmaW5lIF9QS1RMT0dfQUNfQVBJXworI2lmbmRlZiBSRU1PVkVfUEtUX0xPRworCisvKioKKyAqIEB0eXBlZGVmIG9sX3BrdGxvZ19kZXZfaGFuZGxlCisgKiBAYnJpZWYgb3BhcXVlIGhhbmRsZSBmb3IgcGt0bG9nIGRldmljZSBvYmplY3QKKyAqLworc3RydWN0IG9sX3BrdGxvZ19kZXZfdDsKK3R5cGVkZWYgc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqb2xfcGt0bG9nX2Rldl9oYW5kbGU7CisKKy8qKgorICogQHR5cGVkZWYgb2xfc29mdGNfaGFuZGxlCisgKiBAYnJpZWYgb3BhcXVlIGhhbmRsZSBmb3Igb2xfc29mdGMKKyAqLworc3RydWN0IG9sX3NvZnRjOwordHlwZWRlZiBzdHJ1Y3Qgb2xfc29mdGMgKm9sX3NvZnRjX2hhbmRsZTsKKworLyoqCisgKiBAdHlwZWRlZiBuZXRfZGV2aWNlX2hhbmRsZQorICogQGJyaWVmIG9wYXF1ZSBoYW5kbGUgbGludXggcGh5IGRldmljZSBvYmplY3QKKyAqLworc3RydWN0IG5ldF9kZXZpY2U7Cit0eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2aWNlX2hhbmRsZTsKKwordm9pZCBvbF9wbF9zZXRfbmFtZShvbF9zb2Z0Y19oYW5kbGUgc2NuLCBuZXRfZGV2aWNlX2hhbmRsZSBkZXYpOworCit2b2lkIG9sX3BsX3NldGhhbmRsZShvbF9wa3Rsb2dfZGV2X2hhbmRsZSAqcGxfaGFuZGxlLCBvbF9zb2Z0Y19oYW5kbGUgc2NuKTsKKworLyogUGFja2V0IGxvZyBzdGF0ZSBpbmZvcm1hdGlvbiAqLworI2lmbmRlZiBfUEtUTE9HX0lORk8KKyNkZWZpbmUgX1BLVExPR19JTkZPCitzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvIHsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19idWYgKmJ1ZjsKKwl1aW50MzJfdCBsb2dfc3RhdGU7CisJdWludDMyX3Qgc2F2ZWRfc3RhdGU7CisJdWludDMyX3Qgb3B0aW9uczsKKworCS8qIFNpemUgb2YgYnVmZmVyIGluIGJ5dGVzICovCisJaW50MzJfdCBidWZfc2l6ZTsKKwlzcGlubG9ja190IGxvZ19sb2NrOworCisJLyogVGhyZXNob2xkIG9mIFRDUCBTQUNLIHBhY2tldHMgZm9yIHRyaWdnZXJlZCBzdG9wICovCisJaW50IHNhY2tfdGhyOworCisJLyogIyBvZiB0YWlsIHBhY2tldHMgdG8gbG9nIGFmdGVyIHRyaWdnZXJlZCBzdG9wICovCisJaW50IHRhaWxfbGVuZ3RoOworCisJLyogdGhyb3VwdXQgdGhyZXNob2xkIGluIGJ5dGVzIGZvciB0cmlnZ2VyZWQgc3RvcCAqLworCXVpbnQzMl90IHRocnVwdXRfdGhyZXNoOworCisJLyogKGFnZ3JlZ2F0ZWQgb3Igc2luZ2xlKSBwYWNrZXQgc2l6ZSBpbiBieXRlcyAqLworCXVpbnQzMl90IHBrdGxlbjsKKworCS8qIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBjb3VudGluZyBUWCB0aHJvdWdocHV0IG9ubHkgKi8KKwkvKiBQRVIgdGhyZXNob2xkIGZvciB0cmlnZ2VyZWQgc3RvcCwgMTAgZm9yIDEwJSwgcmFuZ2UgWzEsIDk5XSAqLworCXVpbnQzMl90IHBlcl90aHJlc2g7CisKKwkvKiBQaHllcnIgdGhyZXNob2xkIGZvciB0cmlnZ2VyZWQgc3RvcCAqLworCXVpbnQzMl90IHBoeWVycl90aHJlc2g7CisKKwkvKiB0aW1lIHBlcmlvZCBmb3IgY291bnRpbmcgdHJpZ2dlciBwYXJhbWV0ZXJzLCBpbiBtaWxpc2Vjb25kICovCisJdWludDMyX3QgdHJpZ2dlcl9pbnRlcnZhbDsKKwl1aW50MzJfdCBzdGFydF90aW1lX3RocnVwdXQ7CisJdWludDMyX3Qgc3RhcnRfdGltZV9wZXI7Cit9OworI2VuZGlmIC8qIF9QS1RMT0dfSU5GTyAqLworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRU1PVkVfUEtUX0xPRyAqLwordHlwZWRlZiB2b2lkICpvbF9wa3Rsb2dfZGV2X2hhbmRsZTsKKyNkZWZpbmUgb2xfcGxfc2V0aGFuZGxlKHBsX2hhbmRsZSwgc2NuKQlcCisJZG8gewkJCQlcCisJCSh2b2lkKXBsX2hhbmRsZTsJXAorCQkodm9pZClzY247CQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBvbF9wbF9zZXRfbmFtZShzY24sIGRldikJXAorCWRvIHsJCQkJXAorCQkodm9pZClzY247CQlcCisJCSh2b2lkKWRldjsJCVwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYgLyogUkVNT1ZFX1BLVF9MT0cgKi8KKyNlbmRpZiAvKiBfUEtUTE9HX0FDX0FQSV8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvdXRpbHMvcGt0bG9nL2luY2x1ZGUvcGt0bG9nX2FjX2kuaCBiL2NvcmUvdXRpbHMvcGt0bG9nL2luY2x1ZGUvcGt0bG9nX2FjX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2JiYWMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS91dGlscy9wa3Rsb2cvaW5jbHVkZS9wa3Rsb2dfYWNfaS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1BLVExPR19BQ19JXworI2RlZmluZSBfUEtUTE9HX0FDX0lfCisjaWZuZGVmIFJFTU9WRV9QS1RfTE9HCisKKyNpbmNsdWRlIDxvbF90eHJ4X2ludGVybmFsLmg+CisjaW5jbHVkZSA8cGt0bG9nX2FjLmg+CisKKyNkZWZpbmUgUEtUTE9HX0RFRkFVTFRfQlVGU0laRSAgICAgICAgICAoMTAyNCAqIDEwMjQpCisjZGVmaW5lIFBLVExPR19ERUZBVUxUX1NBQ0tfVEhSICAgICAgICAgMworI2RlZmluZSBQS1RMT0dfREVGQVVMVF9UQUlMX0xFTkdUSCAgICAgIDEwMAorI2RlZmluZSBQS1RMT0dfREVGQVVMVF9USFJVUFVUX1RIUkVTSCAgICg2NCAqIDEwMjQpCisjZGVmaW5lIFBLVExPR19ERUZBVUxUX1BFUl9USFJFU0ggICAgICAgMzAKKyNkZWZpbmUgUEtUTE9HX0RFRkFVTFRfUEhZRVJSX1RIUkVTSCAgICAzMDAKKyNkZWZpbmUgUEtUTE9HX0RFRkFVTFRfVFJJR0dFUl9JTlRFUlZBTCA1MDAKK3N0cnVjdCBhdGhfcGt0bG9nX2FyZyB7CisJc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqcGxfaW5mbzsKKwl1aW50MzJfdCBmbGFnczsKKwl1aW50MTZfdCBtaXNzZWRfY250OworCXVpbnQxNl90IGxvZ190eXBlOworCXNpemVfdCBsb2dfc2l6ZTsKKwl1aW50MTZfdCB0aW1lc3RhbXA7CisjaWZkZWYgSEVMSVVNUExVUworCXVpbnQzMl90IHR5cGVfc3BlY2lmaWNfZGF0YTsKKyNlbmRpZgorCWNoYXIgKmJ1ZjsKK307CisKK3ZvaWQgcGt0bG9nX2dldGJ1Zl9pbnRzYWZlKHN0cnVjdCBhdGhfcGt0bG9nX2FyZyAqcGxhcmcpOworY2hhciAqcGt0bG9nX2dldGJ1ZihzdHJ1Y3Qgb2xfcGt0bG9nX2Rldl90ICpwbF9kZXYsCisJCSAgICBzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvLAorCQkgICAgc2l6ZV90IGxvZ19zaXplLCBzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIgKnBsX2hkcik7CisKK0FfU1RBVFVTIHByb2Nlc3NfdHhfaW5mbyhzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnBkZXYsIHZvaWQgKmRhdGEpOworQV9TVEFUVVMgcHJvY2Vzc19yeF9pbmZvKHZvaWQgKnBkZXYsIHZvaWQgKmRhdGEpOworQV9TVEFUVVMgcHJvY2Vzc19yeF9pbmZvX3JlbW90ZSh2b2lkICpwZGV2LCBjZGZfbmJ1Zl90IGFtc2R1KTsKK0FfU1RBVFVTIHByb2Nlc3NfcmF0ZV9maW5kKHZvaWQgKnBkZXYsIHZvaWQgKmRhdGEpOworQV9TVEFUVVMgcHJvY2Vzc19yYXRlX3VwZGF0ZSh2b2lkICpwZGV2LCB2b2lkICpkYXRhKTsKKworI2VuZGlmIC8qIFJFTU9WRV9QS1RfTE9HICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvdXRpbHMvcGt0bG9nL2xpbnV4X2FjLmMgYi9jb3JlL3V0aWxzL3BrdGxvZy9saW51eF9hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNWRjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL3BrdGxvZy9saW51eF9hYy5jCkBAIC0wLDAgKzEsMTE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBSRU1PVkVfUEtUX0xPRworI2lmbmRlZiBFWFBPUlRfU1lNVEFCCisjZGVmaW5lIEVYUE9SVF9TWU1UQUIKKyNlbmRpZgorI2lmbmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorLyoKKyAqIExpbnV4IHNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIFBrdGxvZ3MgZm9yIDgwMi4xMWFjCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxwa3Rsb2dfYWNfaS5oPgorI2luY2x1ZGUgPHBrdGxvZ19hY19mbXQuaD4KKyNpbmNsdWRlIDxwa3Rsb2dfYWMuaD4KKyNpbmNsdWRlICJpX2hvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2luY2x1ZGUgImhvc3RfZGlhZ19jb3JlX2xvZy5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKworI2RlZmluZSBQS1RMT0dfVEFHICAgICAgICAgICAgICAiQVRIX1BLVExPRyIKKyNkZWZpbmUgUEtUTE9HX0RFVk5BTUVfU0laRSAgICAgMzIKKyNkZWZpbmUgTUFYX1dMQU5ERVYgICAgICAgICAgICAgMQorCisjZGVmaW5lIFBLVExPR19QUk9DX0RJUiAgICAgICAgICJhdGhfcGt0bG9nIgorCisvKiBQZXJtaXNzaW9ucyBmb3IgY3JlYXRpbmcgcHJvYyBlbnRyaWVzICovCisjZGVmaW5lIFBLVExPR19QUk9DX1BFUk0gICAgICAgIDA0NDQKKyNkZWZpbmUgUEtUTE9HX1BST0NTWVNfRElSX1BFUk0gMDU1NQorI2RlZmluZSBQS1RMT0dfUFJPQ1NZU19QRVJNICAgICAwNjQ0CisKKyNpZm5kZWYgX19NT0RfSU5DX1VTRV9DT1VOVAorI2RlZmluZSBQS1RMT0dfTU9EX0lOQ19VU0VfQ09VTlQJCQkJXAorCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSB7CQkJXAorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cnlfbW9kdWxlX2dldCBmYWlsZWRcbiIpOwlcCisJfQorCisjZGVmaW5lIFBLVExPR19NT0RfREVDX1VTRV9DT1VOVCAgICAgICAgbW9kdWxlX3B1dChUSElTX01PRFVMRSkKKyNlbHNlCisjZGVmaW5lIFBLVExPR19NT0RfSU5DX1VTRV9DT1VOVCAgICAgICAgTU9EX0lOQ19VU0VfQ09VTlQKKyNkZWZpbmUgUEtUTE9HX01PRF9ERUNfVVNFX0NPVU5UICAgICAgICBNT0RfREVDX1VTRV9DT1VOVAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpnX3BrdGxvZ19pbmZvOworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpnX3BrdGxvZ19wZGU7CisKK3N0YXRpYyBpbnQgcGt0bG9nX2F0dGFjaChzdHJ1Y3Qgb2xfc29mdGMgKnNjKTsKK3N0YXRpYyB2b2lkIHBrdGxvZ19kZXRhY2goc3RydWN0IG9sX3NvZnRjICpzYyk7CitzdGF0aWMgaW50IHBrdGxvZ19vcGVuKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGZpbGUgKmYpOworc3RhdGljIGludCBwa3Rsb2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmksIHN0cnVjdCBmaWxlICpmKTsKK3N0YXRpYyBpbnQgcGt0bG9nX21tYXAoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK3N0YXRpYyBzc2l6ZV90IHBrdGxvZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBuYnl0ZXMsCisJCQkgICBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwa3Rsb2dfZm9wcyA9IHsKKwlvcGVuOiAgcGt0bG9nX29wZW4sCisJcmVsZWFzZTpwa3Rsb2dfcmVsZWFzZSwKKwltbWFwOiAgcGt0bG9nX21tYXAsCisJcmVhZDogIHBrdGxvZ19yZWFkLAorfTsKKworLyoKKyAqIExpbnV4IGltcGxlbWVudGF0aW9uIG9mIGhlbHBlciBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqZ2V0X3BsX2hhbmRsZShzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXZfdHhyeF9oYW5kbGU7CisJcGRldl90eHJ4X2hhbmRsZSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCWlmICghcGRldl90eHJ4X2hhbmRsZSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHBkZXZfdHhyeF9oYW5kbGUtPnBsX2RldjsKK30KKwordm9pZCBvbF9wbF9zZXRfbmFtZShvbF9zb2Z0Y19oYW5kbGUgc2NuLCBuZXRfZGV2aWNlX2hhbmRsZSBkZXYpCit7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2X3R4cnhfaGFuZGxlOworCXBkZXZfdHhyeF9oYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlpZiAocGRldl90eHJ4X2hhbmRsZSAmJiBwZGV2X3R4cnhfaGFuZGxlLT5wbF9kZXYgJiYgZGV2KQorCQlwZGV2X3R4cnhfaGFuZGxlLT5wbF9kZXYtPm5hbWUgPSBkZXYtPm5hbWU7Cit9CisKK3ZvaWQgcGt0bG9nX2Rpc2FibGVfYWRhcHRlcl9sb2dnaW5nKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXN0cnVjdCBvbF9wa3Rsb2dfZGV2X3QgKnBsX2RldiA9IGdldF9wbF9oYW5kbGUoc2NuKTsKKwlpZiAocGxfZGV2KQorCQlwbF9kZXYtPnBsX2luZm8tPmxvZ19zdGF0ZSA9IDA7Cit9CisKK2ludCBwa3Rsb2dfYWxsb2NfYnVmKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXVpbnQzMl90IHBhZ2VfY250OworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisJc3RydWN0IHBhZ2UgKnZwZzsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvOworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldl90eHJ4X2hhbmRsZTsKKwlwZGV2X3R4cnhfaGFuZGxlID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisKKwlpZiAoIXBkZXZfdHhyeF9oYW5kbGUgfHwgIXBkZXZfdHhyeF9oYW5kbGUtPnBsX2RldikgeworCQlwcmludGsoUEtUTE9HX1RBRworCQkgICAgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyICIKKwkJICAgICAgICJzY24gb3Igc2NuLT5wZGV2X3R4cnhfaGFuZGxlLT5wbF9kZXYgaXMgbnVsbFxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGxfaW5mbyA9IHBkZXZfdHhyeF9oYW5kbGUtPnBsX2Rldi0+cGxfaW5mbzsKKworCXBhZ2VfY250ID0gKHNpemVvZigqKHBsX2luZm8tPmJ1ZikpICsgcGxfaW5mby0+YnVmX3NpemUpIC8gUEFHRV9TSVpFOworCisJaWYgKChwbF9pbmZvLT5idWYgPSB2bWFsbG9jKChwYWdlX2NudCArIDIpICogUEFHRV9TSVpFKSkgPT0gTlVMTCkgeworCQlwcmludGsoUEtUTE9HX1RBRworCQkgICAgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyICIKKwkJICAgICAgICIoJWQgcGFnZXMpXG4iLCBfX2Z1bmNfXywgcGFnZV9jbnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbF9pbmZvLT5idWYgPSAoc3RydWN0IGF0aF9wa3Rsb2dfYnVmICopCisJCSAgICAgICAoKCh1bnNpZ25lZCBsb25nKShwbF9pbmZvLT5idWYpICsgUEFHRV9TSVpFIC0gMSkKKwkJCSYgUEFHRV9NQVNLKTsKKworCWZvciAodmFkZHIgPSAodW5zaWduZWQgbG9uZykocGxfaW5mby0+YnVmKTsKKwkgICAgIHZhZGRyIDwgKCh1bnNpZ25lZCBsb25nKShwbF9pbmZvLT5idWYpICsgKHBhZ2VfY250ICogUEFHRV9TSVpFKSk7CisJICAgICB2YWRkciArPSBQQUdFX1NJWkUpIHsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI1KSkKKwkJdnBnID0gdm1hbGxvY190b19wYWdlKChjb25zdCB2b2lkICopdmFkZHIpOworI2Vsc2UKKwkJdnBnID0gdmlydF90b19wYWdlKHBrdGxvZ192aXJ0X3RvX2xvZ2ljYWwoKHZvaWQgKil2YWRkcikpOworI2VuZGlmCisJCVNldFBhZ2VSZXNlcnZlZCh2cGcpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIHBrdGxvZ19yZWxlYXNlX2J1ZihzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwl1bnNpZ25lZCBsb25nIHBhZ2VfY250OworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisJc3RydWN0IHBhZ2UgKnZwZzsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvOworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldl90eHJ4X2hhbmRsZTsKKwlwZGV2X3R4cnhfaGFuZGxlID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisKKwlpZiAoIXBkZXZfdHhyeF9oYW5kbGUgfHwgIXBkZXZfdHhyeF9oYW5kbGUtPnBsX2RldikgeworCQlwcmludGsoUEtUTE9HX1RBRworCQkgICAgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIgorCQkgICAgICAgInNjbiBvciBzY24tPnBkZXZfdHhyeF9oYW5kbGUtPnBsX2RldiBpcyBudWxsXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcGxfaW5mbyA9IHBkZXZfdHhyeF9oYW5kbGUtPnBsX2Rldi0+cGxfaW5mbzsKKworCXBhZ2VfY250ID0gKChzaXplb2YoKihwbF9pbmZvLT5idWYpKSArIHBsX2luZm8tPmJ1Zl9zaXplKSAvCisJCSAgICBQQUdFX1NJWkUpICsgMTsKKworCWZvciAodmFkZHIgPSAodW5zaWduZWQgbG9uZykocGxfaW5mby0+YnVmKTsKKwkgICAgIHZhZGRyIDwgKHVuc2lnbmVkIGxvbmcpKHBsX2luZm8tPmJ1ZikgKyAocGFnZV9jbnQgKiBQQUdFX1NJWkUpOworCSAgICAgdmFkZHIgKz0gUEFHRV9TSVpFKSB7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAyNSkpCisJCXZwZyA9IHZtYWxsb2NfdG9fcGFnZSgoY29uc3Qgdm9pZCAqKXZhZGRyKTsKKyNlbHNlCisJCXZwZyA9IHZpcnRfdG9fcGFnZShwa3Rsb2dfdmlydF90b19sb2dpY2FsKCh2b2lkICopdmFkZHIpKTsKKyNlbmRpZgorCQlDbGVhclBhZ2VSZXNlcnZlZCh2cGcpOworCX0KKworCXZmcmVlKHBsX2luZm8tPmJ1Zik7CisJcGxfaW5mby0+YnVmID0gTlVMTDsKK30KKwordm9pZCBwa3Rsb2dfY2xlYW51cChzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvKQoreworCXBsX2luZm8tPmxvZ19zdGF0ZSA9IDA7CisJUEtUTE9HX0xPQ0tfREVTVFJPWShwbF9pbmZvKTsKK30KKworLyogc3lzY3RsIHByb2NmcyBoYW5kbGVyIHRvIGVuYWJsZSBwa3Rsb2cgKi8KK3N0YXRpYyBpbnQKK2F0aF9zeXNjdGxfZGVjbChhdGhfc3lzY3RsX3BrdGxvZ19lbmFibGUsIGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcykKK3sKKwlpbnQgcmV0LCBlbmFibGU7CisJb2xfYXRoX2dlbmVyaWNfc29mdGNfaGFuZGxlIHNjbjsKKwlzdHJ1Y3Qgb2xfcGt0bG9nX2Rldl90ICpwbF9kZXY7CisKKwlzY24gPSAob2xfYXRoX2dlbmVyaWNfc29mdGNfaGFuZGxlKSBjdGwtPmV4dHJhMTsKKworCWlmICghc2NuKSB7CisJCXByaW50aygiJXM6IEludmFsaWQgc2NuIGNvbnRleHRcbiIsIF9fZnVuY19fKTsKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwbF9kZXYgPSBnZXRfcGxfaGFuZGxlKChzdHJ1Y3Qgb2xfc29mdGMgKilzY24pOworCisJaWYgKCFwbF9kZXYpIHsKKwkJcHJpbnRrKCIlczogSW52YWxpZCBwa3Rsb2cgY29udGV4dFxuIiwgX19mdW5jX18pOworCQlBU1NFUlQoMCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWN0bC0+ZGF0YSA9ICZlbmFibGU7CisJY3RsLT5tYXhsZW4gPSBzaXplb2YoZW5hYmxlKTsKKworCWlmICh3cml0ZSkgeworCQlyZXQgPSBBVEhfU1lTQ1RMX1BST0NfRE9JTlRWRUMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLAorCQkJCQkgICAgICAgbGVucCwgcHBvcyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IHBsX2Rldi0+cGxfZnVuY3MtPnBrdGxvZ19lbmFibGUoKHN0cnVjdCBvbF9zb2Z0YworCQkJCQkJCSAgICAgICAqKXNjbiwgZW5hYmxlKTsKKwkJZWxzZQorCQkJcHJpbnRrKFBLVExPR19UQUcgIiVzOnByb2NfZG9pbnR2ZWMgZmFpbGVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlyZXQgPSBBVEhfU1lTQ1RMX1BST0NfRE9JTlRWRUMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLAorCQkJCQkgICAgICAgbGVucCwgcHBvcyk7CisJCWlmIChyZXQpCisJCQlwcmludGsoUEtUTE9HX1RBRyAiJXM6cHJvY19kb2ludHZlYyBmYWlsZWRcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCX0KKworCWN0bC0+ZGF0YSA9IE5VTEw7CisJY3RsLT5tYXhsZW4gPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfcGt0bG9nX2J1ZnNpemUoc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2KQoreworCXJldHVybiBwbF9kZXYtPnBsX2luZm8tPmJ1Zl9zaXplOworfQorCisvKiBzeXNjdGwgcHJvY2ZzIGhhbmRsZXIgdG8gc2V0L2dldCBwa3Rsb2cgc2l6ZSAqLworc3RhdGljIGludAorYXRoX3N5c2N0bF9kZWNsKGF0aF9zeXNjdGxfcGt0bG9nX3NpemUsIGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcykKK3sKKwlpbnQgcmV0LCBzaXplOworCW9sX2F0aF9nZW5lcmljX3NvZnRjX2hhbmRsZSBzY247CisJc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2OworCisJc2NuID0gKG9sX2F0aF9nZW5lcmljX3NvZnRjX2hhbmRsZSkgY3RsLT5leHRyYTE7CisKKwlpZiAoIXNjbikgeworCQlwcmludGsoIiVzOiBJbnZhbGlkIHNjbiBjb250ZXh0XG4iLCBfX2Z1bmNfXyk7CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGxfZGV2ID0gZ2V0X3BsX2hhbmRsZSgoc3RydWN0IG9sX3NvZnRjICopc2NuKTsKKworCWlmICghcGxfZGV2KSB7CisJCXByaW50aygiJXM6IEludmFsaWQgcGt0bG9nIGhhbmRsZVxuIiwgX19mdW5jX18pOworCQlBU1NFUlQoMCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWN0bC0+ZGF0YSA9ICZzaXplOworCWN0bC0+bWF4bGVuID0gc2l6ZW9mKHNpemUpOworCisJaWYgKHdyaXRlKSB7CisJCXJldCA9IEFUSF9TWVNDVExfUFJPQ19ET0lOVFZFQyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsCisJCQkJCSAgICAgICBsZW5wLCBwcG9zKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gcGxfZGV2LT5wbF9mdW5jcy0+cGt0bG9nX3NldHNpemUoKHN0cnVjdCBvbF9zb2Z0YworCQkJCQkJCQkqKXNjbiwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJc2l6ZSA9IGdldF9wa3Rsb2dfYnVmc2l6ZShwbF9kZXYpOworCQlyZXQgPSBBVEhfU1lTQ1RMX1BST0NfRE9JTlRWRUMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLAorCQkJCQkgICAgICAgbGVucCwgcHBvcyk7CisJfQorCisJY3RsLT5kYXRhID0gTlVMTDsKKwljdGwtPm1heGxlbiA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWdpc3RlciBzeXNjdGwgdGFibGUgKi8KK3N0YXRpYyBpbnQgcGt0bG9nX3N5c2N0bF9yZWdpc3RlcihzdHJ1Y3Qgb2xfc29mdGMgKnNjbikKK3sKKwlzdHJ1Y3Qgb2xfcGt0bG9nX2Rldl90ICpwbF9kZXYgPSBnZXRfcGxfaGFuZGxlKHNjbik7CisJc3RydWN0IGF0aF9wa3Rsb2dfaW5mb19sbnggKnBsX2luZm9fbG54OworCWNoYXIgKnByb2NfbmFtZTsKKworCWlmIChwbF9kZXYpIHsKKwkJcGxfaW5mb19sbnggPSBQTF9JTkZPX0xOWChwbF9kZXYtPnBsX2luZm8pOworCQlwcm9jX25hbWUgPSBwbF9kZXYtPm5hbWU7CisJfSBlbHNlIHsKKwkJcGxfaW5mb19sbnggPSBQTF9JTkZPX0xOWChnX3BrdGxvZ19pbmZvKTsKKwkJcHJvY19uYW1lID0gUEtUTE9HX1BST0NfU1lTVEVNOworCX0KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLCA2LCAzMSkpCisjZGVmaW5lIHNldF9jdGxfbmFtZShhLCBiKSAgICAgIC8qIG5vdGhpbmcgKi8KKyNlbHNlCisjZGVmaW5lIHNldF9jdGxfbmFtZShhLCBiKSAgICAgIHBsX2luZm9fbG54LT5zeXNjdGxzW2FdLmN0bF9uYW1lID0gYgorI2VuZGlmCisKKwkvKgorCSAqIFNldHVwIHRoZSBzeXNjdGwgdGFibGUgZm9yIGNyZWF0aW5nIHRoZSBmb2xsb3dpbmcgc3lzY3RsIGVudHJpZXM6CisJICogL3Byb2Mvc3lzL1BLVExPR19QUk9DX0RJUi88YWRhcHRlcj4vZW5hYmxlIGZvciBlbmFibGluZy9kaXNhYmxpbmcKKwkgKiBwa3Rsb2cKKwkgKiAvcHJvYy9zeXMvUEtUTE9HX1BST0NfRElSLzxhZGFwdGVyPi9zaXplIGZvciBjaGFuZ2luZyB0aGUgYnVmZmVyIHNpemUKKwkgKi8KKwltZW1zZXQocGxfaW5mb19sbngtPnN5c2N0bHMsIDAsIHNpemVvZihwbF9pbmZvX2xueC0+c3lzY3RscykpOworCXNldF9jdGxfbmFtZSgwLCBDVExfQVVUTyk7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbMF0ucHJvY25hbWUgPSBQS1RMT0dfUFJPQ19ESVI7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbMF0ubW9kZSA9IFBLVExPR19QUk9DU1lTX0RJUl9QRVJNOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzBdLmNoaWxkID0gJnBsX2luZm9fbG54LT5zeXNjdGxzWzJdOworCS8qIFsxXSBpcyBOVUxMIHRlcm1pbmF0b3IgKi8KKwlzZXRfY3RsX25hbWUoMiwgQ1RMX0FVVE8pOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzJdLnByb2NuYW1lID0gcHJvY19uYW1lOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzJdLm1vZGUgPSBQS1RMT0dfUFJPQ1NZU19ESVJfUEVSTTsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1syXS5jaGlsZCA9ICZwbF9pbmZvX2xueC0+c3lzY3Rsc1s0XTsKKwkvKiBbM10gaXMgTlVMTCB0ZXJtaW5hdG9yICovCisJc2V0X2N0bF9uYW1lKDQsIENUTF9BVVRPKTsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s0XS5wcm9jbmFtZSA9ICJlbmFibGUiOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzRdLm1vZGUgPSBQS1RMT0dfUFJPQ1NZU19QRVJNOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzRdLnByb2NfaGFuZGxlciA9IGF0aF9zeXNjdGxfcGt0bG9nX2VuYWJsZTsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s0XS5leHRyYTEgPSBzY247CisKKwlzZXRfY3RsX25hbWUoNSwgQ1RMX0FVVE8pOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzVdLnByb2NuYW1lID0gInNpemUiOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzVdLm1vZGUgPSBQS1RMT0dfUFJPQ1NZU19QRVJNOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzVdLnByb2NfaGFuZGxlciA9IGF0aF9zeXNjdGxfcGt0bG9nX3NpemU7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbNV0uZXh0cmExID0gc2NuOworCisJc2V0X2N0bF9uYW1lKDYsIENUTF9BVVRPKTsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s2XS5wcm9jbmFtZSA9ICJvcHRpb25zIjsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s2XS5tb2RlID0gUEtUTE9HX1BST0NTWVNfUEVSTTsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s2XS5wcm9jX2hhbmRsZXIgPSBwcm9jX2RvaW50dmVjOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzZdLmRhdGEgPSAmcGxfaW5mb19sbngtPmluZm8ub3B0aW9uczsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s2XS5tYXhsZW4gPSBzaXplb2YocGxfaW5mb19sbngtPmluZm8ub3B0aW9ucyk7CisKKwlzZXRfY3RsX25hbWUoNywgQ1RMX0FVVE8pOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzddLnByb2NuYW1lID0gInNhY2tfdGhyIjsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s3XS5tb2RlID0gUEtUTE9HX1BST0NTWVNfUEVSTTsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s3XS5wcm9jX2hhbmRsZXIgPSBwcm9jX2RvaW50dmVjOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzddLmRhdGEgPSAmcGxfaW5mb19sbngtPmluZm8uc2Fja190aHI7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbN10ubWF4bGVuID0gc2l6ZW9mKHBsX2luZm9fbG54LT5pbmZvLnNhY2tfdGhyKTsKKworCXNldF9jdGxfbmFtZSg4LCBDVExfQVVUTyk7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbOF0ucHJvY25hbWUgPSAidGFpbF9sZW5ndGgiOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzhdLm1vZGUgPSBQS1RMT0dfUFJPQ1NZU19QRVJNOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzhdLnByb2NfaGFuZGxlciA9IHByb2NfZG9pbnR2ZWM7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbOF0uZGF0YSA9ICZwbF9pbmZvX2xueC0+aW5mby50YWlsX2xlbmd0aDsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s4XS5tYXhsZW4gPSBzaXplb2YocGxfaW5mb19sbngtPmluZm8udGFpbF9sZW5ndGgpOworCisJc2V0X2N0bF9uYW1lKDksIENUTF9BVVRPKTsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s5XS5wcm9jbmFtZSA9ICJ0aHJ1cHV0X3RocmVzaCI7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbOV0ubW9kZSA9IFBLVExPR19QUk9DU1lTX1BFUk07CisJcGxfaW5mb19sbngtPnN5c2N0bHNbOV0ucHJvY19oYW5kbGVyID0gcHJvY19kb2ludHZlYzsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1s5XS5kYXRhID0gJnBsX2luZm9fbG54LT5pbmZvLnRocnVwdXRfdGhyZXNoOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzldLm1heGxlbiA9CisJCXNpemVvZihwbF9pbmZvX2xueC0+aW5mby50aHJ1cHV0X3RocmVzaCk7CisKKwlzZXRfY3RsX25hbWUoMTAsIENUTF9BVVRPKTsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1sxMF0ucHJvY25hbWUgPSAicGh5ZXJyX3RocmVzaCI7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbMTBdLm1vZGUgPSBQS1RMT0dfUFJPQ1NZU19QRVJNOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzEwXS5wcm9jX2hhbmRsZXIgPSBwcm9jX2RvaW50dmVjOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzEwXS5kYXRhID0gJnBsX2luZm9fbG54LT5pbmZvLnBoeWVycl90aHJlc2g7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbMTBdLm1heGxlbiA9CisJCXNpemVvZihwbF9pbmZvX2xueC0+aW5mby5waHllcnJfdGhyZXNoKTsKKworCXNldF9jdGxfbmFtZSgxMSwgQ1RMX0FVVE8pOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzExXS5wcm9jbmFtZSA9ICJwZXJfdGhyZXNoIjsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1sxMV0ubW9kZSA9IFBLVExPR19QUk9DU1lTX1BFUk07CisJcGxfaW5mb19sbngtPnN5c2N0bHNbMTFdLnByb2NfaGFuZGxlciA9IHByb2NfZG9pbnR2ZWM7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbMTFdLmRhdGEgPSAmcGxfaW5mb19sbngtPmluZm8ucGVyX3RocmVzaDsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1sxMV0ubWF4bGVuID0gc2l6ZW9mKHBsX2luZm9fbG54LT5pbmZvLnBlcl90aHJlc2gpOworCisJc2V0X2N0bF9uYW1lKDEyLCBDVExfQVVUTyk7CisJcGxfaW5mb19sbngtPnN5c2N0bHNbMTJdLnByb2NuYW1lID0gInRyaWdnZXJfaW50ZXJ2YWwiOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzEyXS5tb2RlID0gUEtUTE9HX1BST0NTWVNfUEVSTTsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1sxMl0ucHJvY19oYW5kbGVyID0gcHJvY19kb2ludHZlYzsKKwlwbF9pbmZvX2xueC0+c3lzY3Rsc1sxMl0uZGF0YSA9ICZwbF9pbmZvX2xueC0+aW5mby50cmlnZ2VyX2ludGVydmFsOworCXBsX2luZm9fbG54LT5zeXNjdGxzWzEyXS5tYXhsZW4gPQorCQlzaXplb2YocGxfaW5mb19sbngtPmluZm8udHJpZ2dlcl9pbnRlcnZhbCk7CisJLyogWzEzXSBpcyBOVUxMIHRlcm1pbmF0b3IgKi8KKworCS8qIGFuZCByZWdpc3RlciBldmVyeXRoaW5nICovCisJLyogcmVnaXN0ZXJfc3lzY3RsX3RhYmxlIGNoYW5nZWQgZnJvbSAyLjYuMjEgb253YXJkcyAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLCA2LCAyMCkpCisJcGxfaW5mb19sbngtPnN5c2N0bF9oZWFkZXIgPQorCQlyZWdpc3Rlcl9zeXNjdGxfdGFibGUocGxfaW5mb19sbngtPnN5c2N0bHMpOworI2Vsc2UKKwlwbF9pbmZvX2xueC0+c3lzY3RsX2hlYWRlciA9CisJCXJlZ2lzdGVyX3N5c2N0bF90YWJsZShwbF9pbmZvX2xueC0+c3lzY3RscywgMSk7CisjZW5kaWYKKwlpZiAoIXBsX2luZm9fbG54LT5zeXNjdGxfaGVhZGVyKSB7CisJCXByaW50aygiJXM6IGZhaWxlZCB0byByZWdpc3RlciBzeXNjdGxzIVxuIiwgcHJvY19uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGl6ZSBsb2dnaW5nIGZvciBzeXN0ZW0gb3IgYWRhcHRlcgorICogUGFyYW1ldGVyIHNjbiBzaG91bGQgYmUgTlVMTCBmb3Igc3lzdGVtIHdpZGUgbG9nZ2luZworICovCitzdGF0aWMgaW50IHBrdGxvZ19hdHRhY2goc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2OworCXN0cnVjdCBhdGhfcGt0bG9nX2luZm9fbG54ICpwbF9pbmZvX2xueDsKKwljaGFyICpwcm9jX25hbWU7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudHJ5OworCisJcGxfZGV2ID0gZ2V0X3BsX2hhbmRsZShzY24pOworCisJaWYgKHBsX2RldiAhPSBOVUxMKSB7CisJCXBsX2luZm9fbG54ID0ga21hbGxvYyhzaXplb2YoKnBsX2luZm9fbG54KSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwbF9pbmZvX2xueCA9PSBOVUxMKSB7CisJCQlwcmludGsoUEtUTE9HX1RBRyAiJXM6YWxsb2NhdGlvbiBmYWlsZWQgZm9yIHBsX2luZm9cbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcGxfZGV2LT5wbF9pbmZvID0gJnBsX2luZm9fbG54LT5pbmZvOworCQlwbF9kZXYtPm5hbWUgPSBXTEFOREVWX0JBU0VOQU1FOworCQlwcm9jX25hbWUgPSBwbF9kZXYtPm5hbWU7CisJCWlmICghcGxfZGV2LT5wbF9mdW5jcykKKwkJCXBsX2Rldi0+cGxfZnVuY3MgPSAmb2xfcGxfZnVuY3M7CisKKwkJLyoKKwkJICogVmFsaWQgZm9yIGJvdGggZGlyZWN0IGF0dGFjaCBhbmQgb2ZmbG9hZCBhcmNoaXRlY3R1cmUKKwkJICovCisJCXBsX2Rldi0+cGxfZnVuY3MtPnBrdGxvZ19pbml0KHNjbik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogaW5pdGlhbGl6ZSBsb2cgaW5mbworCSAqIG1pZ2h0IGJlIGdvb2QgdG8gbW92ZSB0byBwa3Rsb2dfaW5pdAorCSAqLworCS8qIHBsX2Rldi0+dGd0X3BrdGxvZ19lbmFibGVkID0gZmFsc2U7ICovCisJcGxfaW5mb19sbngtPnByb2NfZW50cnkgPSBOVUxMOworCXBsX2luZm9fbG54LT5zeXNjdGxfaGVhZGVyID0gTlVMTDsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxMCwgMCkKKwlwcm9jX2VudHJ5ID0gcHJvY19jcmVhdGVfZGF0YShwcm9jX25hbWUsIFBLVExPR19QUk9DX1BFUk0sCisJCQkJICAgICAgZ19wa3Rsb2dfcGRlLCAmcGt0bG9nX2ZvcHMsCisJCQkJICAgICAgJnBsX2luZm9fbG54LT5pbmZvKTsKKworCWlmIChwcm9jX2VudHJ5ID09IE5VTEwpIHsKKwkJcHJpbnRrKFBLVExPR19UQUcgIiVzOiBjcmVhdGVfcHJvY19lbnRyeSBmYWlsZWQgZm9yICVzXG4iLAorCQkgICAgICAgX19mdW5jX18sIHByb2NfbmFtZSk7CisJCWdvdG8gYXR0YWNoX2ZhaWwxOworCX0KKyNlbHNlCisJcHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSwgUEtUTE9HX1BST0NfUEVSTSwKKwkJCQkgICAgICAgZ19wa3Rsb2dfcGRlKTsKKworCWlmIChwcm9jX2VudHJ5ID09IE5VTEwpIHsKKwkJcHJpbnRrKFBLVExPR19UQUcgIiVzOiBjcmVhdGVfcHJvY19lbnRyeSBmYWlsZWQgZm9yICVzXG4iLAorCQkgICAgICAgX19mdW5jX18sIHByb2NfbmFtZSk7CisJCWdvdG8gYXR0YWNoX2ZhaWwxOworCX0KKworCXByb2NfZW50cnktPmRhdGEgPSAmcGxfaW5mb19sbngtPmluZm87CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzEpCisJcHJvY19lbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKyNlbmRpZgorCXByb2NfZW50cnktPnByb2NfZm9wcyA9ICZwa3Rsb2dfZm9wczsKKyNlbmRpZgorCisJcGxfaW5mb19sbngtPnByb2NfZW50cnkgPSBwcm9jX2VudHJ5OworCisJaWYgKHBrdGxvZ19zeXNjdGxfcmVnaXN0ZXIoc2NuKSkgeworCQlwcmludGsoUEtUTE9HX1RBRyAiJXM6IHN5c2N0bCByZWdpc3RlciBmYWlsZWQgZm9yICVzXG4iLAorCQkgICAgICAgX19mdW5jX18sIHByb2NfbmFtZSk7CisJCWdvdG8gYXR0YWNoX2ZhaWwyOworCX0KKwlyZXR1cm4gMDsKKworYXR0YWNoX2ZhaWwyOgorCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSwgZ19wa3Rsb2dfcGRlKTsKKworYXR0YWNoX2ZhaWwxOgorCWlmIChwbF9kZXYpCisJCWtmcmVlKHBsX2Rldi0+cGxfaW5mbyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBwa3Rsb2dfc3lzY3RsX3VucmVnaXN0ZXIoc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2KQoreworCXN0cnVjdCBhdGhfcGt0bG9nX2luZm9fbG54ICpwbF9pbmZvX2xueDsKKworCWlmICghcGxfZGV2KSB7CisJCXByaW50aygiJXM6IEludmFsaWQgcGt0bG9nIGNvbnRleHRcbiIsIF9fZnVuY19fKTsKKwkJQVNTRVJUKDApOworCQlyZXR1cm47CisJfQorCisJcGxfaW5mb19sbnggPSAocGxfZGV2KSA/IFBMX0lORk9fTE5YKHBsX2Rldi0+cGxfaW5mbykgOgorCQkgICAgICBQTF9JTkZPX0xOWChnX3BrdGxvZ19pbmZvKTsKKworCWlmIChwbF9pbmZvX2xueC0+c3lzY3RsX2hlYWRlcikgeworCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShwbF9pbmZvX2xueC0+c3lzY3RsX2hlYWRlcik7CisJCXBsX2luZm9fbG54LT5zeXNjdGxfaGVhZGVyID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBrdGxvZ19kZXRhY2goc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2ID0gKHN0cnVjdCBvbF9wa3Rsb2dfZGV2X3QgKikKKwkJCQkJIGdldF9wbF9oYW5kbGUoc2NuKTsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvOworCisJaWYgKCFwbF9kZXYpIHsKKwkJcHJpbnRrKCIlczogSW52YWxpZCBwa3Rsb2cgY29udGV4dFxuIiwgX19mdW5jX18pOworCQlBU1NFUlQoMCk7CisJCXJldHVybjsKKwl9CisKKwlwbF9pbmZvID0gcGxfZGV2LT5wbF9pbmZvOworCXJlbW92ZV9wcm9jX2VudHJ5KFdMQU5ERVZfQkFTRU5BTUUsIGdfcGt0bG9nX3BkZSk7CisJcGt0bG9nX3N5c2N0bF91bnJlZ2lzdGVyKHBsX2Rldik7CisJcGt0bG9nX2NsZWFudXAocGxfaW5mbyk7CisKKwlpZiAocGxfaW5mby0+YnVmKQorCQlwa3Rsb2dfcmVsZWFzZV9idWYoc2NuKTsKKworCWlmIChwbF9kZXYpIHsKKwkJa2ZyZWUocGxfaW5mbyk7CisJCXBsX2Rldi0+cGxfaW5mbyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IHBrdGxvZ19vcGVuKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGZpbGUgKmYpCit7CisJUEtUTE9HX01PRF9JTkNfVVNFX0NPVU5UOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBrdGxvZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGZpbGUgKmYpCit7CisJUEtUTE9HX01PRF9ERUNfVVNFX0NPVU5UOworCXJldHVybiAwOworfQorCisjaWZuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworLyoqCisgKiBwa3Rsb2dfc2VuZF9wZXJfcGt0X3N0YXRzX3RvX3VzZXIoKSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIHRoZSBwZXIKKyAqIHBhY2tldCBzdGF0aXN0aWNzIHRvIHRoZSB1c2VyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgdGhlIHBlciBwYWNrZXQgc3RhdGlzdGljcyB0byB0aGUgdXNlcgorICoKKyAqIFJldHVybjogU3VjY2VzcyBpZiB0aGUgbWVzc2FnZSBpcyBwb3N0ZWQgdG8gdXNlcgorICoKKyAqLworaW50IHBrdGxvZ19zZW5kX3Blcl9wa3Rfc3RhdHNfdG9fdXNlcih2b2lkKQoreworCXNzaXplX3QgcmV0X3ZhbDsKKwlzdHJ1Y3QgaG9zdF9sb2dfcGt0bG9nX2luZm8gKnBrdGxvZyA9IE5VTEw7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSB0eHJ4X3BkZXYgPQorCQljZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvOworCWJvb2wgcmVhZF9jb21wbGV0ZTsKKwl1aW50MzJfdCBudW1fYnl0ZXNfcmVhZCA9IDA7CisKKwkvKgorCSAqIFdlIGRvIG5vdCB3YW50IHRvIGRvIHRoaXMgcGFja2V0IHN0YXRzIHJlbGF0ZWQgcHJvY2Vzc2luZyB3aGVuCisJICogcGFja2V0IGxvZyB0b29sIGlzIHJ1bi4gaS5lLiwgd2Ugd2FudCB0aGlzIHByb2Nlc3NpbmcgdG8gYmUKKwkgKiBkb25lIG9ubHkgd2hlbiBzdGFydCBsb2dnaW5nIGNvbW1hbmQgb2YgcGFja2V0IHN0YXRzIGlzIGluaXRpYXRlZC4KKwkgKi8KKwlpZiAoKGNkc19nZXRfcmluZ19sb2dfbGV2ZWwoUklOR19JRF9QRVJfUEFDS0VUX1NUQVRTKSA8CisJCQkJV0xBTl9MT0dfTEVWRUxfQUNUSVZFKSkgeworCQlwcmludGsoUEtUTE9HX1RBRyAiICVzOiBTaG91bGRudCBoYXBwZW4uIExvZ2dpbmcgbm90IHN0YXJ0ZWRcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXR4cnhfcGRldikgeworCQlwcmludGsoUEtUTE9HX1RBRyAiICVzOiBJbnZhbGlkIFR4UnggaGFuZGxlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBsX2luZm8gPSB0eHJ4X3BkZXYtPnBsX2Rldi0+cGxfaW5mbzsKKworCWlmICghcGxfaW5mbyB8fCAhcGxfaW5mby0+YnVmKSB7CisJCXByaW50ayhQS1RMT0dfVEFHICIgJXM6IFNob3VsZG50IGhhcHBlbi4gcGxfaW5mbyBpcyBpbnZhbGlkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBsX2luZm8tPmJ1Zi0+cmRfb2Zmc2V0ID09IC0xKSB7CisJCXByaW50ayhQS1RMT0dfVEFHICIgJXM6IFNob3VsZG50IGhhcHBlbi4gTm8gd3JpdGUgeWV0IVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG8geworCQlwa3Rsb2cgPSAoc3RydWN0IGhvc3RfbG9nX3BrdGxvZ19pbmZvICopCisJCQljZGZfbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IGhvc3RfbG9nX3BrdGxvZ19pbmZvKSArCisJCQkJCVZPU19MT0dfUEtUX0xPR19TSVpFKTsKKwkJaWYgKCFwa3Rsb2cpIHsKKwkJCXByaW50ayhQS1RMT0dfVEFHICIgJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWNkZl9tZW1femVybyhwa3Rsb2csIFZPU19MT0dfUEtUX0xPR19TSVpFKTsKKwkJaG9zdF9kaWFnX2xvZ19zZXRfY29kZShwa3Rsb2csIExPR19XTEFOX1BLVF9MT0dfSU5GT19DKTsKKworCQlwa3Rsb2ctPmJ1Zl9sZW4gPSAwOworCQlwa3Rsb2ctPnZlcnNpb24gPSBWRVJTSU9OX0xPR19XTEFOX1BLVF9MT0dfSU5GT19DOworCisJCS8qCisJCSAqIEByZXRfdmFsOiByZXRfdmFsIGdpdmVzIHRoZSBhY3R1YWwgZGF0YSByZWFkIGZyb20gdGhlIGJ1ZmZlci4KKwkJICogV2hlbiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8gcmVhZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIHplcm8KKwkJICogQG9mZnNldDogb2Zmc2V0IGluIHRoZSByaW5nIGJ1ZmZlci4gSW5pdGlhbGx5IGl0IGlzIHplcm8gYW5kCisJCSAqIGlzIGluY3JlbWVudGVkIGR1cmluZyBldmVyeSByZWFkIGJhc2VkIG9uIG51bWJlciBvZiBieXRlcworCQkgKiByZWFkCisJCSAqLworCQlyZXRfdmFsID0gcGt0bG9nX3JlYWRfcHJvY19lbnRyeShwa3Rsb2ctPmJ1ZiwKKwkJCQlWT1NfTE9HX1BLVF9MT0dfU0laRSwKKwkJCQkmcGxfaW5mby0+YnVmLT5vZmZzZXQsCisJCQkJcGxfaW5mbywgJnJlYWRfY29tcGxldGUpOworCQlpZiAocmV0X3ZhbCkgeworCQkJaW50IGluZGV4ID0gMDsKKwkJCXN0cnVjdCBhdGhfcGt0bG9nX2hkciAqdGVtcDsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKChyZXRfdmFsIC0gaW5kZXgpIDwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIpKSB7CisJCQkJCS8qIFBhcnRpYWwgaGVhZGVyICovCisJCQkJCXBsX2luZm8tPmJ1Zi0+b2Zmc2V0IC09CisJCQkJCQkJKHJldF92YWwgLSBpbmRleCk7CisJCQkJCXJldF92YWwgPSBpbmRleDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXRlbXAgPSAoc3RydWN0IGF0aF9wa3Rsb2dfaGRyICopCisJCQkJCShwa3Rsb2ctPmJ1ZiArIGluZGV4KTsKKwkJCQlpZiAoKHJldF92YWwgLSBpbmRleCkgPCAodGVtcC0+c2l6ZSArCisJCQkJCXNpemVvZihzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIpKSkgeworCQkJCQkvKiBQYXJ0aWFsIHJlY29yZCBwYXlsb2FkICovCisJCQkJCXBsX2luZm8tPmJ1Zi0+b2Zmc2V0IC09CisJCQkJCQkJKHJldF92YWwgLSBpbmRleCk7CisJCQkJCXJldF92YWwgPSBpbmRleDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWluZGV4ICs9IHRlbXAtPnNpemUgKworCQkJCQlzaXplb2Yoc3RydWN0IGF0aF9wa3Rsb2dfaGRyKTsKKwkJCX0KKwkJfQorCisJCS8qIERhdGEgd2lsbCBpbmNsdWRlIG1lc3NhZ2UgaW5kZXgvc2VxIG51bWJlciBhbmQgYnVmIGxlbmd0aCAqLworCQlwa3Rsb2ctPmJ1Zl9sZW4gPSByZXRfdmFsOworCQlpZiAocmV0X3ZhbCkgeworCQkJaG9zdF9kaWFnX2xvZ19zZXRfbGVuZ3RoKHBrdGxvZywgcmV0X3ZhbCArCisJCQkJCXNpemVvZihzdHJ1Y3QgaG9zdF9sb2dfcGt0bG9nX2luZm8pKTsKKwkJCXBrdGxvZy0+c2VxX25vID0gcGxfaW5mby0+YnVmLT5tc2dfaW5kZXgrKzsKKwkJCVdMQU5fSE9TVF9ESUFHX0xPR19SRVBPUlQocGt0bG9nKTsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1fZnJlZShwa3Rsb2cpOworCQl9CisJCW51bV9ieXRlc19yZWFkICs9IHJldF92YWw7CisKKwkJLyoKKwkJICogSWYgdGhlIGxvZ2dlciB0aHJlYWQgaXMgc2NoZWR1bGVkIGxhdGUgYW5kIHRoZSBwcm9jIGVudHJ5CisJCSAqIGlzIGhhdmluZyB0b28gbXVjaCBkYXRhIHRvIGJlIHJlYWQsIHdlIG1pZ2h0IHN0YXJ0IHRvIHN0YXJ2ZQorCQkgKiB0aGUgb3RoZXIgdGhyZWFkcyBpZiB3ZSBjb250aW51b3VzbHkga2VlcCByZWFkaW5nIHRoZSBwcm9jCisJCSAqIGVudHJ5LiBTbywgaGF2aW5nIGEgdGhyZXNob2xkIHRvIGJyZWFrIHRoaXMgcmVhZCBmcm9tIHByb2MKKwkJICogZW50cnkuCisJCSAqLworCQlpZiAobnVtX2J5dGVzX3JlYWQgPiBIT1NUX0xPR19QS1RfTE9HX1RIUkVTSE9MRCkgeworCQkJcmVhZF9jb21wbGV0ZSA9IHRydWU7CisJCQlwcmludGsoUEtUTE9HX1RBRyAiICVzOiBCcmVhayByZWFkIHRvIHByZXZlbnQgc3RhcnZlXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJfQorCX0gd2hpbGUgKHJlYWRfY29tcGxldGUgPT0gZmFsc2UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcGt0bG9nX3JlYWRfcHJvY19lbnRyeSgpIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIHRoZQorICogcHJvYyBlbnRyeSBpbnRvIHRoZSByZWFkZXJzIGJ1ZmZlcgorICogQGJ1ZjogICAgIFJlYWRlcnMgYnVmZmVyCisgKiBAbmJ5dGVzOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEBwcG9zOiAgICBPZmZzZXQgd2l0aGluIHRoZSBkcml2ZXJzIGJ1ZmZlcgorICogQHBsX2luZm86IFBhY2tldCBsb2cgaW5mb3JtYXRpb24gcG9pbnRlcgorICogQHJlYWRfY29tcGxldGU6IEJvb2xlYW4gdmFsdWUgaW5kaWNhdGlvbiB3aGV0aGVyIHJlYWQgaXMgY29tcGxldGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHByb2MgZW50cnkgaW50byB0aGUgcmVhZGVycworICogYnVmZmVyLiBJdHMgZnVuY3Rpb25hbGl0eSBpcyBzaW1pbGFyIHRvICdwa3Rsb2dfcmVhZCcgd2hpY2ggZG9lcworICogY29weSB0byB1c2VyIHRvIHRoZSB1c2VyIHNwYWNlIGJ1ZmZlcgorICoKKyAqIFJldHVybjogTnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSB0aGUgYnVmZmVyCisgKgorICovCisJc3NpemVfdAorcGt0bG9nX3JlYWRfcHJvY19lbnRyeShjaGFyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcywKKwkJc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqcGxfaW5mbywgYm9vbCAqcmVhZF9jb21wbGV0ZSkKK3sKKwlzaXplX3QgYnVmaGRyX3NpemU7CisJc2l6ZV90IGNvdW50ID0gMCwgcmV0X3ZhbCA9IDA7CisJaW50IHJlbV9sZW47CisJaW50IHN0YXJ0X29mZnNldCwgZW5kX29mZnNldDsKKwlpbnQgZm9sZF9vZmZzZXQsIHBwb3NfZGF0YSwgY3VyX3JkX29mZnNldCwgY3VyX3dyX29mZnNldDsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19idWYgKmxvZ19idWYgPSBwbF9pbmZvLT5idWY7CisJKnJlYWRfY29tcGxldGUgPSBmYWxzZTsKKworCWlmIChsb2dfYnVmID09IE5VTEwpIHsKKwkJKnJlYWRfY29tcGxldGUgPSB0cnVlOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKnBwb3MgPT0gMCAmJiBwbF9pbmZvLT5sb2dfc3RhdGUpIHsKKwkJcGxfaW5mby0+c2F2ZWRfc3RhdGUgPSBwbF9pbmZvLT5sb2dfc3RhdGU7CisJCXBsX2luZm8tPmxvZ19zdGF0ZSA9IDA7CisJfQorCisJYnVmaGRyX3NpemUgPSBzaXplb2YobG9nX2J1Zi0+YnVmaGRyKTsKKworCS8qIGNvcHkgdmFsaWQgbG9nIGVudHJpZXMgZnJvbSBjaXJjdWxhciBidWZmZXIgaW50byB1c2VyIHNwYWNlICovCisJcmVtX2xlbiA9IG5ieXRlczsKKwljb3VudCA9IDA7CisKKwlpZiAoKnBwb3MgPCBidWZoZHJfc2l6ZSkgeworCQljb3VudCA9IE1JTigoYnVmaGRyX3NpemUgLSAqcHBvcyksIHJlbV9sZW4pOworCQljZGZfbWVtX2NvcHkoYnVmLCAoKGNoYXIgKikmbG9nX2J1Zi0+YnVmaGRyKSArICpwcG9zLAorCQkJCWNvdW50KTsKKwkJcmVtX2xlbiAtPSBjb3VudDsKKwkJcmV0X3ZhbCArPSBjb3VudDsKKwl9CisKKwlzdGFydF9vZmZzZXQgPSBsb2dfYnVmLT5yZF9vZmZzZXQ7CisJY3VyX3dyX29mZnNldCA9IGxvZ19idWYtPndyX29mZnNldDsKKworCWlmICgocmVtX2xlbiA9PSAwKSB8fCAoc3RhcnRfb2Zmc2V0IDwgMCkpCisJCWdvdG8gcmRfZG9uZTsKKworCWZvbGRfb2Zmc2V0ID0gLTE7CisJY3VyX3JkX29mZnNldCA9IHN0YXJ0X29mZnNldDsKKworCS8qIEZpbmQgdGhlIGxhc3Qgb2Zmc2V0IGFuZCBmb2xkLW9mZnNldCBpZiB0aGUgYnVmZmVyIGlzIGZvbGRlZCAqLworCWRvIHsKKwkJc3RydWN0IGF0aF9wa3Rsb2dfaGRyICpsb2dfaGRyOworCQlpbnQgbG9nX2RhdGFfb2Zmc2V0OworCisJCWxvZ19oZHIgPSAoc3RydWN0IGF0aF9wa3Rsb2dfaGRyICopIChsb2dfYnVmLT5sb2dfZGF0YSArCisJCQkJY3VyX3JkX29mZnNldCk7CisKKwkJbG9nX2RhdGFfb2Zmc2V0ID0gY3VyX3JkX29mZnNldCArIHNpemVvZihzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIpOworCisJCWlmICgoZm9sZF9vZmZzZXQgPT0gLTEpCisJCQkJJiYgKChwbF9pbmZvLT5idWZfc2l6ZSAtIGxvZ19kYXRhX29mZnNldCkKKwkJCQkJPD0gbG9nX2hkci0+c2l6ZSkpCisJCQlmb2xkX29mZnNldCA9IGxvZ19kYXRhX29mZnNldCAtIDE7CisKKwkJUEtUTE9HX01PVl9SRF9JRFgoY3VyX3JkX29mZnNldCwgbG9nX2J1ZiwgcGxfaW5mby0+YnVmX3NpemUpOworCisJCWlmICgoZm9sZF9vZmZzZXQgPT0gLTEpICYmIChjdXJfcmRfb2Zmc2V0ID09IDApCisJCQkJJiYgKGN1cl9yZF9vZmZzZXQgIT0gY3VyX3dyX29mZnNldCkpCisJCQlmb2xkX29mZnNldCA9IGxvZ19kYXRhX29mZnNldCArIGxvZ19oZHItPnNpemUgLSAxOworCisJCWVuZF9vZmZzZXQgPSBsb2dfZGF0YV9vZmZzZXQgKyBsb2dfaGRyLT5zaXplIC0gMTsKKwl9IHdoaWxlIChjdXJfcmRfb2Zmc2V0ICE9IGN1cl93cl9vZmZzZXQpOworCisJcHBvc19kYXRhID0gKnBwb3MgKyByZXRfdmFsIC0gYnVmaGRyX3NpemUgKyBzdGFydF9vZmZzZXQ7CisKKwlpZiAoZm9sZF9vZmZzZXQgPT0gLTEpIHsKKwkJaWYgKHBwb3NfZGF0YSA+IGVuZF9vZmZzZXQpCisJCQlnb3RvIHJkX2RvbmU7CisKKwkJY291bnQgPSBNSU4ocmVtX2xlbiwgKGVuZF9vZmZzZXQgLSBwcG9zX2RhdGEgKyAxKSk7CisJCWNkZl9tZW1fY29weShidWYgKyByZXRfdmFsLAorCQkJCWxvZ19idWYtPmxvZ19kYXRhICsgcHBvc19kYXRhLAorCQkJCWNvdW50KTsKKwkJcmV0X3ZhbCArPSBjb3VudDsKKwkJcmVtX2xlbiAtPSBjb3VudDsKKwl9IGVsc2UgeworCQlpZiAocHBvc19kYXRhIDw9IGZvbGRfb2Zmc2V0KSB7CisJCQljb3VudCA9IE1JTihyZW1fbGVuLCAoZm9sZF9vZmZzZXQgLSBwcG9zX2RhdGEgKyAxKSk7CisJCQljZGZfbWVtX2NvcHkoYnVmICsgcmV0X3ZhbCwKKwkJCQkJbG9nX2J1Zi0+bG9nX2RhdGEgKyBwcG9zX2RhdGEsCisJCQkJCWNvdW50KTsKKwkJCXJldF92YWwgKz0gY291bnQ7CisJCQlyZW1fbGVuIC09IGNvdW50OworCQl9CisKKwkJaWYgKHJlbV9sZW4gPT0gMCkKKwkJCWdvdG8gcmRfZG9uZTsKKworCQlwcG9zX2RhdGEgPQorCQkJKnBwb3MgKyByZXRfdmFsIC0gKGJ1Zmhkcl9zaXplICsKKwkJCQkJKGZvbGRfb2Zmc2V0IC0gc3RhcnRfb2Zmc2V0ICsgMSkpOworCisJCWlmIChwcG9zX2RhdGEgPD0gZW5kX29mZnNldCkgeworCQkJY291bnQgPSBNSU4ocmVtX2xlbiwgKGVuZF9vZmZzZXQgLSBwcG9zX2RhdGEgKyAxKSk7CisJCQljZGZfbWVtX2NvcHkoYnVmICsgcmV0X3ZhbCwKKwkJCQkJbG9nX2J1Zi0+bG9nX2RhdGEgKyBwcG9zX2RhdGEsCisJCQkJCWNvdW50KTsKKwkJCXJldF92YWwgKz0gY291bnQ7CisJCQlyZW1fbGVuIC09IGNvdW50OworCQl9CisJfQorCityZF9kb25lOgorCWlmICgocmV0X3ZhbCA8IG5ieXRlcykgJiYgcGxfaW5mby0+c2F2ZWRfc3RhdGUpIHsKKwkJcGxfaW5mby0+bG9nX3N0YXRlID0gcGxfaW5mby0+c2F2ZWRfc3RhdGU7CisJCXBsX2luZm8tPnNhdmVkX3N0YXRlID0gMDsKKwl9CisJKnBwb3MgKz0gcmV0X3ZhbDsKKworCWlmIChyZXRfdmFsID09IDApIHsKKwkJUEtUTE9HX0xPQ0socGxfaW5mbyk7CisJCS8qIFdyaXRlIHBvaW50ZXIgbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQgZHVyaW5nIHRoZSByZWFkLgorCQkgKiBTbywgaWYgc29tZSBkYXRhIGlzIHdyaXR0ZW4gaW50bywgbGV0cyBub3QgcmVzZXQgdGhlIHBvaW50ZXJzCisJCSAqIFdlIGNhbiBjb250aW51ZSB0byByZWFkIGZyb20gdGhlIG9mZnNldCBwb3NpdGlvbgorCQkgKi8KKwkJaWYgKGN1cl93cl9vZmZzZXQgIT0gbG9nX2J1Zi0+d3Jfb2Zmc2V0KSB7CisJCQkqcmVhZF9jb21wbGV0ZSA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJcGxfaW5mby0+YnVmLT5yZF9vZmZzZXQgPSAtMTsKKwkJCXBsX2luZm8tPmJ1Zi0+d3Jfb2Zmc2V0ID0gMDsKKwkJCXBsX2luZm8tPmJ1Zi0+Ynl0ZXNfd3JpdHRlbiA9IDA7CisJCQlwbF9pbmZvLT5idWYtPm9mZnNldCA9IFBLVExPR19SRUFEX09GRlNFVDsKKwkJCSpyZWFkX2NvbXBsZXRlID0gdHJ1ZTsKKwkJfQorCQlQS1RMT0dfVU5MT0NLKHBsX2luZm8pOworCX0KKworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgc3NpemVfdAorcGt0bG9nX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCXNpemVfdCBidWZoZHJfc2l6ZTsKKwlzaXplX3QgY291bnQgPSAwLCByZXRfdmFsID0gMDsKKwlpbnQgcmVtX2xlbjsKKwlpbnQgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0OworCWludCBmb2xkX29mZnNldCwgcHBvc19kYXRhLCBjdXJfcmRfb2Zmc2V0OworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxMCwgMCkKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvID0gKHN0cnVjdCBhdGhfcGt0bG9nX2luZm8gKikKKwkJCQkJICBQREVfREFUQShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisjZWxzZQorCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnRyeSA9IFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqcGxfaW5mbyA9IChzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICopCisJCQkJCSAgcHJvY19lbnRyeS0+ZGF0YTsKKyNlbmRpZgorCXN0cnVjdCBhdGhfcGt0bG9nX2J1ZiAqbG9nX2J1ZiA9IHBsX2luZm8tPmJ1ZjsKKworCWlmIChsb2dfYnVmID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKCpwcG9zID09IDAgJiYgcGxfaW5mby0+bG9nX3N0YXRlKSB7CisJCXBsX2luZm8tPnNhdmVkX3N0YXRlID0gcGxfaW5mby0+bG9nX3N0YXRlOworCQlwbF9pbmZvLT5sb2dfc3RhdGUgPSAwOworCX0KKworCWJ1Zmhkcl9zaXplID0gc2l6ZW9mKGxvZ19idWYtPmJ1Zmhkcik7CisKKwkvKiBjb3B5IHZhbGlkIGxvZyBlbnRyaWVzIGZyb20gY2lyY3VsYXIgYnVmZmVyIGludG8gdXNlciBzcGFjZSAqLworCXJlbV9sZW4gPSBuYnl0ZXM7CisJY291bnQgPSAwOworCisJaWYgKCpwcG9zIDwgYnVmaGRyX3NpemUpIHsKKwkJY291bnQgPSBDREZfTUlOKChidWZoZHJfc2l6ZSAtICpwcG9zKSwgcmVtX2xlbik7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAoKGNoYXIgKikmbG9nX2J1Zi0+YnVmaGRyKSArICpwcG9zLAorCQkJCSBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmVtX2xlbiAtPSBjb3VudDsKKwkJcmV0X3ZhbCArPSBjb3VudDsKKwl9CisKKwlzdGFydF9vZmZzZXQgPSBsb2dfYnVmLT5yZF9vZmZzZXQ7CisKKwlpZiAoKHJlbV9sZW4gPT0gMCkgfHwgKHN0YXJ0X29mZnNldCA8IDApKQorCQlnb3RvIHJkX2RvbmU7CisKKwlmb2xkX29mZnNldCA9IC0xOworCWN1cl9yZF9vZmZzZXQgPSBzdGFydF9vZmZzZXQ7CisKKwkvKiBGaW5kIHRoZSBsYXN0IG9mZnNldCBhbmQgZm9sZC1vZmZzZXQgaWYgdGhlIGJ1ZmZlciBpcyBmb2xkZWQgKi8KKwlkbyB7CisJCXN0cnVjdCBhdGhfcGt0bG9nX2hkciAqbG9nX2hkcjsKKwkJaW50IGxvZ19kYXRhX29mZnNldDsKKworCQlsb2dfaGRyID0gKHN0cnVjdCBhdGhfcGt0bG9nX2hkciAqKShsb2dfYnVmLT5sb2dfZGF0YSArCisJCQkJCQkgICAgY3VyX3JkX29mZnNldCk7CisKKwkJbG9nX2RhdGFfb2Zmc2V0ID0gY3VyX3JkX29mZnNldCArIHNpemVvZihzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIpOworCisJCWlmICgoZm9sZF9vZmZzZXQgPT0gLTEpCisJCSAgICAmJiAoKHBsX2luZm8tPmJ1Zl9zaXplIC0gbG9nX2RhdGFfb2Zmc2V0KQorCQkJPD0gbG9nX2hkci0+c2l6ZSkpCisJCQlmb2xkX29mZnNldCA9IGxvZ19kYXRhX29mZnNldCAtIDE7CisKKwkJUEtUTE9HX01PVl9SRF9JRFgoY3VyX3JkX29mZnNldCwgbG9nX2J1ZiwgcGxfaW5mby0+YnVmX3NpemUpOworCisJCWlmICgoZm9sZF9vZmZzZXQgPT0gLTEpICYmIChjdXJfcmRfb2Zmc2V0ID09IDApCisJCSAgICAmJiAoY3VyX3JkX29mZnNldCAhPSBsb2dfYnVmLT53cl9vZmZzZXQpKQorCQkJZm9sZF9vZmZzZXQgPSBsb2dfZGF0YV9vZmZzZXQgKyBsb2dfaGRyLT5zaXplIC0gMTsKKworCQllbmRfb2Zmc2V0ID0gbG9nX2RhdGFfb2Zmc2V0ICsgbG9nX2hkci0+c2l6ZSAtIDE7CisJfSB3aGlsZSAoY3VyX3JkX29mZnNldCAhPSBsb2dfYnVmLT53cl9vZmZzZXQpOworCisJcHBvc19kYXRhID0gKnBwb3MgKyByZXRfdmFsIC0gYnVmaGRyX3NpemUgKyBzdGFydF9vZmZzZXQ7CisKKwlpZiAoZm9sZF9vZmZzZXQgPT0gLTEpIHsKKwkJaWYgKHBwb3NfZGF0YSA+IGVuZF9vZmZzZXQpCisJCQlnb3RvIHJkX2RvbmU7CisKKwkJY291bnQgPSBDREZfTUlOKHJlbV9sZW4sIChlbmRfb2Zmc2V0IC0gcHBvc19kYXRhICsgMSkpOworCQlpZiAoY29weV90b191c2VyKGJ1ZiArIHJldF92YWwsCisJCQkJIGxvZ19idWYtPmxvZ19kYXRhICsgcHBvc19kYXRhLCBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0X3ZhbCArPSBjb3VudDsKKwkJcmVtX2xlbiAtPSBjb3VudDsKKwl9IGVsc2UgeworCQlpZiAocHBvc19kYXRhIDw9IGZvbGRfb2Zmc2V0KSB7CisJCQljb3VudCA9IENERl9NSU4ocmVtX2xlbiwgKGZvbGRfb2Zmc2V0IC0gcHBvc19kYXRhICsgMSkpOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYgKyByZXRfdmFsLAorCQkJCQkgbG9nX2J1Zi0+bG9nX2RhdGEgKyBwcG9zX2RhdGEsIGNvdW50KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldF92YWwgKz0gY291bnQ7CisJCQlyZW1fbGVuIC09IGNvdW50OworCQl9CisKKwkJaWYgKHJlbV9sZW4gPT0gMCkKKwkJCWdvdG8gcmRfZG9uZTsKKworCQlwcG9zX2RhdGEgPQorCQkJKnBwb3MgKyByZXRfdmFsIC0gKGJ1Zmhkcl9zaXplICsKKwkJCQkJICAgKGZvbGRfb2Zmc2V0IC0gc3RhcnRfb2Zmc2V0ICsgMSkpOworCisJCWlmIChwcG9zX2RhdGEgPD0gZW5kX29mZnNldCkgeworCQkJY291bnQgPSBDREZfTUlOKHJlbV9sZW4sIChlbmRfb2Zmc2V0IC0gcHBvc19kYXRhICsgMSkpOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYgKyByZXRfdmFsLAorCQkJCQkgbG9nX2J1Zi0+bG9nX2RhdGEgKyBwcG9zX2RhdGEsIGNvdW50KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldF92YWwgKz0gY291bnQ7CisJCQlyZW1fbGVuIC09IGNvdW50OworCQl9CisJfQorCityZF9kb25lOgorCWlmICgocmV0X3ZhbCA8IG5ieXRlcykgJiYgcGxfaW5mby0+c2F2ZWRfc3RhdGUpIHsKKwkJcGxfaW5mby0+bG9nX3N0YXRlID0gcGxfaW5mby0+c2F2ZWRfc3RhdGU7CisJCXBsX2luZm8tPnNhdmVkX3N0YXRlID0gMDsKKwl9CisJKnBwb3MgKz0gcmV0X3ZhbDsKKworCXJldHVybiByZXRfdmFsOworfQorCisjaWZuZGVmIFZNQUxMT0NfVk1BRERSCisjZGVmaW5lIFZNQUxMT0NfVk1BRERSKHgpICgodW5zaWduZWQgbG9uZykoeCkpCisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAzMSkpCisvKiBDb252ZXJ0IGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyB0byBhIGtlcm5lbCBsb2dpY2FsIGFkZHJlc3MgKi8KK3N0YXRpYyB2b2xhdGlsZSB2b2lkICpwa3Rsb2dfdmlydF90b19sb2dpY2FsKHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJcGdkX3QgKnBnZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGVwLCBwdGU7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxNSkgfHwgXAorCShkZWZpbmVkKF9faTM4Nl9fKSAmJiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTEpKSkKKwlwdWRfdCAqcHVkOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyB2YWRkciwgcmV0ID0gMFVMOworCisJdmFkZHIgPSBWTUFMTE9DX1ZNQUREUigodW5zaWduZWQgbG9uZylhZGRyKTsKKworCXBnZCA9IHBnZF9vZmZzZXRfayh2YWRkcik7CisKKwlpZiAoIXBnZF9ub25lKCpwZ2QpKSB7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxNSkgfHwgXAorCShkZWZpbmVkKF9faTM4Nl9fKSAmJiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTEpKSkKKwkJcHVkID0gcHVkX29mZnNldChwZ2QsIHZhZGRyKTsKKwkJcG1kID0gcG1kX29mZnNldChwdWQsIHZhZGRyKTsKKyNlbHNlCisJCXBtZCA9IHBtZF9vZmZzZXQocGdkLCB2YWRkcik7CisjZW5kaWYKKworCQlpZiAoIXBtZF9ub25lKCpwbWQpKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDUsIDApCisJCQlwdGVwID0gcHRlX29mZnNldF9tYXAocG1kLCB2YWRkcik7CisjZWxzZQorCQkJcHRlcCA9IHB0ZV9vZmZzZXQocG1kLCB2YWRkcik7CisjZW5kaWYKKwkJCXB0ZSA9ICpwdGVwOworCisJCQlpZiAocHRlX3ByZXNlbnQocHRlKSkgeworCQkJCXJldCA9ICh1bnNpZ25lZCBsb25nKQorCQkJCSAgICAgIHBhZ2VfYWRkcmVzcyhwdGVfcGFnZShwdGUpKTsKKwkJCQlyZXQgfD0gKHZhZGRyICYgKFBBR0VfU0laRSAtIDEpKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gKHZvbGF0aWxlIHZvaWQgKilyZXQ7Cit9CisjZW5kaWYKKworLyogdm1hIG9wZXJhdGlvbnMgZm9yIG1hcHBpbmcgdm1hbGxvY2VkIGFyZWEgdG8gdXNlciBzcGFjZSAqLworc3RhdGljIHZvaWQgcGt0bG9nX3ZvcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCVBLVExPR19NT0RfSU5DX1VTRV9DT1VOVDsKK30KKworc3RhdGljIHZvaWQgcGt0bG9nX3ZjbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlQS1RMT0dfTU9EX0RFQ19VU0VfQ09VTlQ7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLCA2LCAyNSkKK2ludCBwa3Rsb2dfZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzOworCisJaWYgKGFkZHJlc3MgPT0gMFVMKQorCQlyZXR1cm4gVk1fRkFVTFRfTk9QQUdFOworCisJaWYgKHZtZi0+cGdvZmYgPiB2bWEtPnZtX2VuZCkKKwkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKKworCWdldF9wYWdlKHZpcnRfdG9fcGFnZSgodm9pZCAqKWFkZHJlc3MpKTsKKwl2bWYtPnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoKHZvaWQgKilhZGRyZXNzKTsKKwlyZXR1cm4gVk1fRkFVTFRfTUlOT1I7Cit9CisjZWxzZQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAwKQorc3RydWN0IHBhZ2UgKnBrdGxvZ192bW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICBpbnQgKnR5cGUpCisjZWxzZQorc3RydWN0IHBhZ2UgKnBrdGxvZ192bW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICBpbnQgd3JpdGVfYWNjZXNzKQorI2VuZGlmCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHZhZGRyOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnRyeTsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvID0KKwkJcHJvY19lbnRyeSA9IFBERSh2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlwbF9pbmZvID0gKHN0cnVjdCBhdGhfcGt0bG9nX2luZm8gKilwcm9jX2VudHJ5LT5kYXRhOworCisJb2Zmc2V0ID0gYWRkciAtIHZtYS0+dm1fc3RhcnQgKyAodm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKTsKKwl2YWRkciA9ICh1bnNpZ25lZCBsb25nKXBrdGxvZ192aXJ0X3RvX2xvZ2ljYWwoKHZvaWQgKikocGxfaW5mby0+YnVmKSArCisJCQkJCQkgICAgICBvZmZzZXQpOworCisJaWYgKHZhZGRyID09IDBVTCkgeworCQlwcmludGsoUEtUTE9HX1RBRyAiJXM6IHBhZ2UgZmF1bHQgb3V0IG9mIHJhbmdlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAoKHN0cnVjdCBwYWdlICopMFVMKTsKKwl9CisKKwkvKiBpbmNyZW1lbnQgdGhlIHVzYWdlIGNvdW50IG9mIHRoZSBwYWdlICovCisJZ2V0X3BhZ2UodmlydF90b19wYWdlKCh2b2lkICopdmFkZHIpKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAwKQorCWlmICh0eXBlKQorCQkqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworI2VuZGlmCisKKwlyZXR1cm4gdmlydF90b19wYWdlKCh2b2lkICopdmFkZHIpOworfQorI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI1KSAqLworCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHBrdGxvZ192bW9wcyA9IHsKKwlvcGVuOiAgcGt0bG9nX3ZvcGVuLAorCWNsb3NlOnBrdGxvZ192Y2xvc2UsCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjUpCisJZmF1bHQ6cGt0bG9nX2ZhdWx0LAorI2Vsc2UKKwlub3BhZ2U6cGt0bG9nX3ZtbWFwLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IHBrdGxvZ19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMTAsIDApCisJc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqcGxfaW5mbyA9IChzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICopCisJCQkJCSAgUERFX0RBVEEoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworI2Vsc2UKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZW50cnkgPSBQREUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBhdGhfcGt0bG9nX2luZm8gKnBsX2luZm8gPSAoc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqKQorCQkJCQkgIHByb2NfZW50cnktPmRhdGE7CisjZW5kaWYKKworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApIHsKKwkJLyogRW50aXJlIGJ1ZmZlciBzaG91bGQgYmUgbWFwcGVkICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcGxfaW5mby0+YnVmKSB7CisJCXByaW50ayhQS1RMT0dfVEFHICIlczogTG9nIGJ1ZmZlciB1bmF2YWlsYWJsZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0xPQ0tFRDsKKwl2bWEtPnZtX29wcyA9ICZwa3Rsb2dfdm1vcHM7CisJcGt0bG9nX3ZvcGVuKHZtYSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwa3Rsb2dtb2RfaW5pdCh2b2lkICpjb250ZXh0KQoreworCWludCByZXQ7CisKKwkvKiBjcmVhdGUgdGhlIHByb2MgZGlyZWN0b3J5IGVudHJ5ICovCisJZ19wa3Rsb2dfcGRlID0gcHJvY19ta2RpcihQS1RMT0dfUFJPQ19ESVIsIE5VTEwpOworCisJaWYgKGdfcGt0bG9nX3BkZSA9PSBOVUxMKSB7CisJCXByaW50ayhQS1RMT0dfVEFHICIlczogcHJvY19ta2RpciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEF0dGFjaCBwYWNrZXQgbG9nICovCisJaWYgKChyZXQgPSBwa3Rsb2dfYXR0YWNoKChzdHJ1Y3Qgb2xfc29mdGMgKiljb250ZXh0KSkpCisJCWdvdG8gYXR0YWNoX2ZhaWw7CisKKwlyZXR1cm4gcmV0OworCithdHRhY2hfZmFpbDoKKwlyZW1vdmVfcHJvY19lbnRyeShQS1RMT0dfUFJPQ19ESVIsIE5VTEwpOworCWdfcGt0bG9nX3BkZSA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBwa3Rsb2dtb2RfZXhpdCh2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuID0gKHN0cnVjdCBvbF9zb2Z0YyAqKWNvbnRleHQ7CisJc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2OworCisJaWYgKCFzY24pCisJCXJldHVybjsKKworCXBsX2RldiA9IGdldF9wbF9oYW5kbGUoc2NuKTsKKworCWlmICghcGxfZGV2IHx8IGdfcGt0bG9nX3BkZSA9PSBOVUxMKQorCQlyZXR1cm47CisJLyoKKwkgKiAgRGlzYWJsZSBmaXJtd2FyZSBzaWRlIHBrdGxvZyBmdW5jdGlvbgorCSAqLworCWlmIChwbF9kZXYtPnRndF9wa3Rsb2dfZW5hYmxlZCkgeworCQlpZiAocGxfZGV2LT5wbF9mdW5jcy0+cGt0bG9nX2VuYWJsZShzY24sIDApKSB7CisJCQlwcmludGsoIiVzOiBjYW5ub3QgZGlzYWJsZSBwa3Rsb2cgaW4gdGhlIHRhcmdldFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCX0KKwl9CisJcGt0bG9nX2RldGFjaChzY24pOworCS8qCisJICogIHBkZXYga2lsbCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZAorCSAqLworCXJlbW92ZV9wcm9jX2VudHJ5KFBLVExPR19QUk9DX0RJUiwgTlVMTCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvdXRpbHMvcGt0bG9nL3BrdGxvZ19hYy5jIGIvY29yZS91dGlscy9wa3Rsb2cvcGt0bG9nX2FjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjMTBlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdXRpbHMvcGt0bG9nL3BrdGxvZ19hYy5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgUkVNT1ZFX1BLVF9MT0cKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisjaW5jbHVkZSAiYXRoZGVmcy5oIgorI2luY2x1ZGUgInBrdGxvZ19hY19pLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgIndtYV90eXBlcy5oIgorCit3ZGlfZXZlbnRfc3Vic2NyaWJlIFBLVExPR19UWF9TVUJTQ1JJQkVSOword2RpX2V2ZW50X3N1YnNjcmliZSBQS1RMT0dfUlhfU1VCU0NSSUJFUjsKK3dkaV9ldmVudF9zdWJzY3JpYmUgUEtUTE9HX1JYX1JFTU9URV9TVUJTQ1JJQkVSOword2RpX2V2ZW50X3N1YnNjcmliZSBQS1RMT0dfUkNGSU5EX1NVQlNDUklCRVI7Cit3ZGlfZXZlbnRfc3Vic2NyaWJlIFBLVExPR19SQ1VQREFURV9TVUJTQ1JJQkVSOworCitzdHJ1Y3Qgb2xfcGxfYXJjaF9kZXBfZnVuY3Mgb2xfcGxfZnVuY3MgPSB7CisJLnBrdGxvZ19pbml0ID0gcGt0bG9nX2luaXQsCisJLnBrdGxvZ19lbmFibGUgPSBwa3Rsb2dfZW5hYmxlLAorCS5wa3Rsb2dfc2V0c2l6ZSA9IHBrdGxvZ19zZXRzaXplLAorCS5wa3Rsb2dfZGlzYWJsZSA9IHBrdGxvZ19kaXNhYmxlLCAgICAgICAvKiB2YWxpZCBmb3IgZi93IGRpc2FibGUgKi8KK307CisKK3N0cnVjdCBvbF9wa3Rsb2dfZGV2X3Qgb2xfcGxfZGV2ID0geworCS5wbF9mdW5jcyA9ICZvbF9wbF9mdW5jcywKK307CisKK3ZvaWQgb2xfcGxfc2V0aGFuZGxlKG9sX3BrdGxvZ19kZXZfaGFuZGxlICpwbF9oYW5kbGUsIHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCW9sX3BsX2Rldi5zY24gPSAob2xfYXRoX2dlbmVyaWNfc29mdGNfaGFuZGxlKSBzY247CisJKnBsX2hhbmRsZSA9ICZvbF9wbF9kZXY7Cit9CisKK3N0YXRpYyBBX1NUQVRVUyBwa3Rsb2dfd21hX3Bvc3RfbXNnKFdNSV9QS1RMT0dfRVZFTlQgZXZlbnRfdHlwZXMsCisJCQkJICAgIFdNSV9DTURfSUQgY21kX2lkKQoreworCWNkc19tc2dfdCBtc2cgPSB7IDAgfTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ193bWlfcGFyYW1zICpwYXJhbTsKKworCXBhcmFtID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdGhfcGt0bG9nX3dtaV9wYXJhbXMpKTsKKworCWlmICghcGFyYW0pCisJCXJldHVybiBBX05PX01FTU9SWTsKKworCXBhcmFtLT5jbWRfaWQgPSBjbWRfaWQ7CisJcGFyYW0tPnBrdGxvZ19ldmVudCA9IGV2ZW50X3R5cGVzOworCisJbXNnLnR5cGUgPSBXTUFfUEtUTE9HX0VOQUJMRV9SRVE7CisJbXNnLmJvZHlwdHIgPSBwYXJhbTsKKwltc2cuYm9keXZhbCA9IDA7CisKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZtc2cpOworCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJY2RmX21lbV9mcmVlKHBhcmFtKTsKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCisJcmV0dXJuIEFfT0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgQV9TVEFUVVMKK3BrdGxvZ19lbmFibGVfdGd0KHN0cnVjdCBvbF9zb2Z0YyAqX3NjbiwgdWludDMyX3QgbG9nX3N0YXRlKQoreworCXVpbnQzMl90IHR5cGVzID0gMDsKKworCWlmIChsb2dfc3RhdGUgJiBBVEhfUEtUTE9HX1RYKQorCQl0eXBlcyB8PSBXTUlfUEtUTE9HX0VWRU5UX1RYOworCisJaWYgKGxvZ19zdGF0ZSAmIEFUSF9QS1RMT0dfUlgpCisJCXR5cGVzIHw9IFdNSV9QS1RMT0dfRVZFTlRfUlg7CisKKwlpZiAobG9nX3N0YXRlICYgQVRIX1BLVExPR19SQ0ZJTkQpCisJCXR5cGVzIHw9IFdNSV9QS1RMT0dfRVZFTlRfUkNGOworCisJaWYgKGxvZ19zdGF0ZSAmIEFUSF9QS1RMT0dfUkNVUERBVEUpCisJCXR5cGVzIHw9IFdNSV9QS1RMT0dfRVZFTlRfUkNVOworCisJcmV0dXJuIHBrdGxvZ193bWFfcG9zdF9tc2codHlwZXMsIFdNSV9QREVWX1BLVExPR19FTkFCTEVfQ01ESUQpOworfQorCitzdGF0aWMgaW5saW5lIEFfU1RBVFVTCit3ZGlfcGt0bG9nX3N1YnNjcmliZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnR4cnhfcGRldiwgaW50MzJfdCBsb2dfc3RhdGUpCit7CisJaWYgKCF0eHJ4X3BkZXYpIHsKKwkJcHJpbnRrKCJJbnZhbGlkIHBkZXYgaW4gJXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCWlmIChsb2dfc3RhdGUgJiBBVEhfUEtUTE9HX1RYKSB7CisJCWlmICh3ZGlfZXZlbnRfc3ViKHR4cnhfcGRldiwKKwkJCQkgICZQS1RMT0dfVFhfU1VCU0NSSUJFUiwgV0RJX0VWRU5UX1RYX1NUQVRVUykpIHsKKwkJCXJldHVybiBBX0VSUk9SOworCQl9CisJfQorCWlmIChsb2dfc3RhdGUgJiBBVEhfUEtUTE9HX1JYKSB7CisJCWlmICh3ZGlfZXZlbnRfc3ViKHR4cnhfcGRldiwKKwkJCQkgICZQS1RMT0dfUlhfU1VCU0NSSUJFUiwgV0RJX0VWRU5UX1JYX0RFU0MpKSB7CisJCQlyZXR1cm4gQV9FUlJPUjsKKwkJfQorCQlpZiAod2RpX2V2ZW50X3N1Yih0eHJ4X3BkZXYsCisJCQkJICAmUEtUTE9HX1JYX1JFTU9URV9TVUJTQ1JJQkVSLAorCQkJCSAgV0RJX0VWRU5UX1JYX0RFU0NfUkVNT1RFKSkgeworCQkJcmV0dXJuIEFfRVJST1I7CisJCX0KKwl9CisJaWYgKGxvZ19zdGF0ZSAmIEFUSF9QS1RMT0dfUkNGSU5EKSB7CisJCWlmICh3ZGlfZXZlbnRfc3ViKHR4cnhfcGRldiwKKwkJCQkgICZQS1RMT0dfUkNGSU5EX1NVQlNDUklCRVIsCisJCQkJICBXRElfRVZFTlRfUkFURV9GSU5EKSkgeworCQkJcmV0dXJuIEFfRVJST1I7CisJCX0KKwl9CisJaWYgKGxvZ19zdGF0ZSAmIEFUSF9QS1RMT0dfUkNVUERBVEUpIHsKKwkJaWYgKHdkaV9ldmVudF9zdWIodHhyeF9wZGV2LAorCQkJCSAgJlBLVExPR19SQ1VQREFURV9TVUJTQ1JJQkVSLAorCQkJCSAgV0RJX0VWRU5UX1JBVEVfVVBEQVRFKSkgeworCQkJcmV0dXJuIEFfRVJST1I7CisJCX0KKwl9CisJcmV0dXJuIEFfT0s7Cit9CisKK3ZvaWQgcGt0bG9nX2NhbGxiYWNrKHZvaWQgKnBkZXYsIGVudW0gV0RJX0VWRU5UIGV2ZW50LCB2b2lkICpsb2dfZGF0YSkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBXRElfRVZFTlRfVFhfU1RBVFVTOgorCXsKKwkJLyoKKwkJICogcHJvY2VzcyBUWCBtZXNzYWdlCisJCSAqLworCQlpZiAocHJvY2Vzc190eF9pbmZvKHBkZXYsIGxvZ19kYXRhKSkgeworCQkJcHJpbnRrKCJVbmFibGUgdG8gcHJvY2VzcyBUWCBpbmZvXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBXRElfRVZFTlRfUlhfREVTQzoKKwl7CisJCS8qCisJCSAqIHByb2Nlc3MgUlggbWVzc2FnZSBmb3IgbG9jYWwgZnJhbWVzCisJCSAqLworCQlpZiAocHJvY2Vzc19yeF9pbmZvKHBkZXYsIGxvZ19kYXRhKSkgeworCQkJcHJpbnRrKCJVbmFibGUgdG8gcHJvY2VzcyBSWCBpbmZvXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBXRElfRVZFTlRfUlhfREVTQ19SRU1PVEU6CisJeworCQkvKgorCQkgKiBwcm9jZXNzIFJYIG1lc3NhZ2UgZm9yIHJlbW90ZSBmcmFtZXMKKwkJICovCisJCWlmIChwcm9jZXNzX3J4X2luZm9fcmVtb3RlKHBkZXYsIGxvZ19kYXRhKSkgeworCQkJcHJpbnRrKCJVbmFibGUgdG8gcHJvY2VzcyBSWCBpbmZvXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBXRElfRVZFTlRfUkFURV9GSU5EOgorCXsKKwkJLyoKKwkJICogcHJvY2VzcyBSQVRFX0ZJTkQgbWVzc2FnZQorCQkgKi8KKwkJaWYgKHByb2Nlc3NfcmF0ZV9maW5kKHBkZXYsIGxvZ19kYXRhKSkgeworCQkJcHJpbnRrKCJVbmFibGUgdG8gcHJvY2VzcyBSQ19GSU5EIGluZm9cbiIpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFdESV9FVkVOVF9SQVRFX1VQREFURToKKwl7CisJCS8qCisJCSAqIHByb2Nlc3MgUkFURV9VUERBVEUgbWVzc2FnZQorCQkgKi8KKwkJaWYgKHByb2Nlc3NfcmF0ZV91cGRhdGUocGRldiwgbG9nX2RhdGEpKSB7CisJCQlwcmludGsoIlVuYWJsZSB0byBwcm9jZXNzIFJDX1VQREFURVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSBBX1NUQVRVUword2RpX3BrdGxvZ191bnN1YnNjcmliZShzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKnR4cnhfcGRldiwgdWludDMyX3QgbG9nX3N0YXRlKQoreworCWlmIChsb2dfc3RhdGUgJiBBVEhfUEtUTE9HX1RYKSB7CisJCWlmICh3ZGlfZXZlbnRfdW5zdWIodHhyeF9wZGV2LAorCQkJCSAgICAmUEtUTE9HX1RYX1NVQlNDUklCRVIsCisJCQkJICAgIFdESV9FVkVOVF9UWF9TVEFUVVMpKSB7CisJCQlyZXR1cm4gQV9FUlJPUjsKKwkJfQorCX0KKwlpZiAobG9nX3N0YXRlICYgQVRIX1BLVExPR19SWCkgeworCQlpZiAod2RpX2V2ZW50X3Vuc3ViKHR4cnhfcGRldiwKKwkJCQkgICAgJlBLVExPR19SWF9TVUJTQ1JJQkVSLCBXRElfRVZFTlRfUlhfREVTQykpIHsKKwkJCXJldHVybiBBX0VSUk9SOworCQl9CisJCWlmICh3ZGlfZXZlbnRfdW5zdWIodHhyeF9wZGV2LAorCQkJCSAgICAmUEtUTE9HX1JYX1JFTU9URV9TVUJTQ1JJQkVSLAorCQkJCSAgICBXRElfRVZFTlRfUlhfREVTQ19SRU1PVEUpKSB7CisJCQlyZXR1cm4gQV9FUlJPUjsKKwkJfQorCX0KKwlpZiAobG9nX3N0YXRlICYgQVRIX1BLVExPR19SQ0ZJTkQpIHsKKwkJaWYgKHdkaV9ldmVudF91bnN1Yih0eHJ4X3BkZXYsCisJCQkJICAgICZQS1RMT0dfUkNGSU5EX1NVQlNDUklCRVIsCisJCQkJICAgIFdESV9FVkVOVF9SQVRFX0ZJTkQpKSB7CisJCQlyZXR1cm4gQV9FUlJPUjsKKwkJfQorCX0KKwlpZiAobG9nX3N0YXRlICYgQVRIX1BLVExPR19SQ1VQREFURSkgeworCQlpZiAod2RpX2V2ZW50X3Vuc3ViKHR4cnhfcGRldiwKKwkJCQkgICAgJlBLVExPR19SQ1VQREFURV9TVUJTQ1JJQkVSLAorCQkJCSAgICBXRElfRVZFTlRfUkFURV9VUERBVEUpKSB7CisJCQlyZXR1cm4gQV9FUlJPUjsKKwkJfQorCX0KKwlyZXR1cm4gQV9PSzsKK30KKworaW50IHBrdGxvZ19kaXNhYmxlKHN0cnVjdCBvbF9zb2Z0YyAqc2NuKQoreworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqdHhyeF9wZGV2ID0KKwkJY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2OworCXN0cnVjdCBhdGhfcGt0bG9nX2luZm8gKnBsX2luZm87CisKKwlpZiAodHhyeF9wZGV2ID09IE5VTEwgfHwKKwkJCXR4cnhfcGRldi0+cGxfZGV2ID09IE5VTEwgfHwKKwkJCXR4cnhfcGRldi0+cGxfZGV2LT5wbF9pbmZvID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCisJcGxfZGV2ID0gdHhyeF9wZGV2LT5wbF9kZXY7CisJcGxfaW5mbyA9IHBsX2Rldi0+cGxfaW5mbzsKKworCWlmIChwa3Rsb2dfd21hX3Bvc3RfbXNnKDAsIFdNSV9QREVWX1BLVExPR19ESVNBQkxFX0NNRElEKSkgeworCQlwcmludGsoIkZhaWxlZCB0byBkaXNhYmxlIHBrdGxvZyBpbiB0YXJnZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHdkaV9wa3Rsb2dfdW5zdWJzY3JpYmUodHhyeF9wZGV2LCBwbF9pbmZvLT5sb2dfc3RhdGUpKSB7CisJCXByaW50aygiQ2Fubm90IHVuc3Vic2NyaWJlIHBrdGxvZyBmcm9tIHRoZSBXRElcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcGt0bG9nX2luaXQoc3RydWN0IG9sX3NvZnRjICpzY24pCit7CisJc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqcGxfaW5mbzsKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXZfdHhyeF9oYW5kbGU7CisJcGRldl90eHJ4X2hhbmRsZSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCisJaWYgKHBkZXZfdHhyeF9oYW5kbGUgPT0gTlVMTCB8fAorCQkJcGRldl90eHJ4X2hhbmRsZS0+cGxfZGV2ID09IE5VTEwgfHwKKwkJCXBkZXZfdHhyeF9oYW5kbGUtPnBsX2Rldi0+cGxfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlwbF9pbmZvID0gcGRldl90eHJ4X2hhbmRsZS0+cGxfZGV2LT5wbF9pbmZvOworCisJT1NfTUVNWkVSTyhwbF9pbmZvLCBzaXplb2YoKnBsX2luZm8pKTsKKwlQS1RMT0dfTE9DS19JTklUKHBsX2luZm8pOworCisJcGxfaW5mby0+YnVmX3NpemUgPSBQS1RMT0dfREVGQVVMVF9CVUZTSVpFOworCXBsX2luZm8tPmJ1ZiA9IE5VTEw7CisJcGxfaW5mby0+bG9nX3N0YXRlID0gMDsKKwlwbF9pbmZvLT5zYWNrX3RociA9IFBLVExPR19ERUZBVUxUX1NBQ0tfVEhSOworCXBsX2luZm8tPnRhaWxfbGVuZ3RoID0gUEtUTE9HX0RFRkFVTFRfVEFJTF9MRU5HVEg7CisJcGxfaW5mby0+dGhydXB1dF90aHJlc2ggPSBQS1RMT0dfREVGQVVMVF9USFJVUFVUX1RIUkVTSDsKKwlwbF9pbmZvLT5wZXJfdGhyZXNoID0gUEtUTE9HX0RFRkFVTFRfUEVSX1RIUkVTSDsKKwlwbF9pbmZvLT5waHllcnJfdGhyZXNoID0gUEtUTE9HX0RFRkFVTFRfUEhZRVJSX1RIUkVTSDsKKwlwbF9pbmZvLT50cmlnZ2VyX2ludGVydmFsID0gUEtUTE9HX0RFRkFVTFRfVFJJR0dFUl9JTlRFUlZBTDsKKwlwbF9pbmZvLT5wa3RsZW4gPSAwOworCXBsX2luZm8tPnN0YXJ0X3RpbWVfdGhydXB1dCA9IDA7CisJcGxfaW5mby0+c3RhcnRfdGltZV9wZXIgPSAwOworCisJUEtUTE9HX1RYX1NVQlNDUklCRVIuY2FsbGJhY2sgPSBwa3Rsb2dfY2FsbGJhY2s7CisJUEtUTE9HX1JYX1NVQlNDUklCRVIuY2FsbGJhY2sgPSBwa3Rsb2dfY2FsbGJhY2s7CisJUEtUTE9HX1JYX1JFTU9URV9TVUJTQ1JJQkVSLmNhbGxiYWNrID0gcGt0bG9nX2NhbGxiYWNrOworCVBLVExPR19SQ0ZJTkRfU1VCU0NSSUJFUi5jYWxsYmFjayA9IHBrdGxvZ19jYWxsYmFjazsKKwlQS1RMT0dfUkNVUERBVEVfU1VCU0NSSUJFUi5jYWxsYmFjayA9IHBrdGxvZ19jYWxsYmFjazsKK30KKworaW50IHBrdGxvZ19lbmFibGUoc3RydWN0IG9sX3NvZnRjICpzY24sIGludDMyX3QgbG9nX3N0YXRlKQoreworCXN0cnVjdCBvbF9wa3Rsb2dfZGV2X3QgKnBsX2RldjsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvOworCXN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqdHhyeF9wZGV2OworCWludCBlcnJvcjsKKworCWlmICghc2NuKSB7CisJCXByaW50aygiJXM6IEludmFsaWQgc2NuIGNvbnRleHRcbiIsIF9fZnVuY19fKTsKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gLTE7CisJfQorCisJdHhyeF9wZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJaWYgKCF0eHJ4X3BkZXYpIHsKKwkJcHJpbnRrKCIlczogSW52YWxpZCB0eHJ4X3BkZXYgY29udGV4dFxuIiwgX19mdW5jX18pOworCQlBU1NFUlQoMCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwbF9kZXYgPSB0eHJ4X3BkZXYtPnBsX2RldjsKKwlpZiAoIXBsX2RldikgeworCQlwcmludGsoIiVzOiBJbnZhbGlkIHBrdGxvZyBjb250ZXh0XG4iLCBfX2Z1bmNfXyk7CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBsX2luZm8gPSBwbF9kZXYtPnBsX2luZm87CisJcGxfZGV2LT5zY19vc2RldiA9ICZzY24tPmFwc19vc2RldjsKKworCWlmICghcGxfaW5mbykKKwkJcmV0dXJuIDA7CisKKwlpZiAobG9nX3N0YXRlICE9IDAgJiYgIXBsX2Rldi0+dGd0X3BrdGxvZ19lbmFibGVkKSB7CisJCWlmIChwbF9pbmZvLT5idWYgPT0gTlVMTCkgeworCQkJZXJyb3IgPSBwa3Rsb2dfYWxsb2NfYnVmKHNjbik7CisKKwkJCWlmIChlcnJvciAhPSAwKQorCQkJCXJldHVybiBlcnJvcjsKKworCQkJaWYgKCFwbF9pbmZvLT5idWYpIHsKKwkJCQlwcmludGsoIiVzOiBwa3Rsb2cgYnVmIGFsbG9jIGZhaWxlZFxuIiwKKwkJCQkgICAgICAgX19mdW5jX18pOworCQkJCUFTU0VSVCgwKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJfQorCisJCXBsX2luZm8tPmJ1Zi0+YnVmaGRyLnZlcnNpb24gPSBDVVJfUEtUTE9HX1ZFUjsKKwkJcGxfaW5mby0+YnVmLT5idWZoZHIubWFnaWNfbnVtID0gUEtUTE9HX01BR0lDX05VTTsKKwkJcGxfaW5mby0+YnVmLT53cl9vZmZzZXQgPSAwOworCQlwbF9pbmZvLT5idWYtPnJkX29mZnNldCA9IC0xOworCQkvKiBUaGVzZSBiZWxvdyB2YXJpYWJsZXMgYXJlIHVzZWQgYnkgcGVyIHBhY2tldCBzdGF0cyovCisJCXBsX2luZm8tPmJ1Zi0+Ynl0ZXNfd3JpdHRlbiA9IDA7CisJCXBsX2luZm8tPmJ1Zi0+bXNnX2luZGV4ID0gMTsKKwkJcGxfaW5mby0+YnVmLT5vZmZzZXQgPSBQS1RMT0dfUkVBRF9PRkZTRVQ7CisKKwkJcGxfaW5mby0+c3RhcnRfdGltZV90aHJ1cHV0ID0gb3NfZ2V0X3RpbWVzdGFtcCgpOworCQlwbF9pbmZvLT5zdGFydF90aW1lX3BlciA9IHBsX2luZm8tPnN0YXJ0X3RpbWVfdGhydXB1dDsKKworCQkvKiBXREkgc3Vic2NyaWJlICovCisJCWlmICh3ZGlfcGt0bG9nX3N1YnNjcmliZSh0eHJ4X3BkZXYsIGxvZ19zdGF0ZSkpIHsKKwkJCXByaW50aygiVW5hYmxlIHRvIHN1YnNjcmliZSB0byB0aGUgV0RJICVzXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogV01JIGNvbW1hbmQgdG8gZW5hYmxlIHBrdGxvZyBvbiB0aGUgZmlybXdhcmUgKi8KKwkJaWYgKHBrdGxvZ19lbmFibGVfdGd0KHNjbiwgbG9nX3N0YXRlKSkgeworCQkJcHJpbnRrKCJEZXZpY2UgY2Fubm90IGJlIGVuYWJsZWQsICVzXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlwbF9kZXYtPnRndF9wa3Rsb2dfZW5hYmxlZCA9IHRydWU7CisJCX0KKwl9IGVsc2UgaWYgKCFsb2dfc3RhdGUgJiYgcGxfZGV2LT50Z3RfcGt0bG9nX2VuYWJsZWQpIHsKKwkJcGxfZGV2LT5wbF9mdW5jcy0+cGt0bG9nX2Rpc2FibGUoc2NuKTsKKwkJcGxfZGV2LT50Z3RfcGt0bG9nX2VuYWJsZWQgPSBmYWxzZTsKKwkJaWYgKHdkaV9wa3Rsb2dfdW5zdWJzY3JpYmUodHhyeF9wZGV2LCBwbF9pbmZvLT5sb2dfc3RhdGUpKSB7CisJCQlwcmludGsoIkNhbm5vdCB1bnN1YnNjcmliZSBwa3Rsb2cgZnJvbSB0aGUgV0RJXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXBsX2luZm8tPmxvZ19zdGF0ZSA9IGxvZ19zdGF0ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBrdGxvZ19zZXRzaXplKHN0cnVjdCBvbF9zb2Z0YyAqc2NuLCBpbnQzMl90IHNpemUpCit7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2X3R4cnhfaGFuZGxlID0KKwkJY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2OworCXN0cnVjdCBhdGhfcGt0bG9nX2luZm8gKnBsX2luZm87CisKKwlpZiAocGRldl90eHJ4X2hhbmRsZSA9PSBOVUxMIHx8CisJCQlwZGV2X3R4cnhfaGFuZGxlLT5wbF9kZXYgPT0gTlVMTCB8fAorCQkJcGRldl90eHJ4X2hhbmRsZS0+cGxfZGV2LT5wbF9pbmZvID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCisJcGxfZGV2ID0gcGRldl90eHJ4X2hhbmRsZS0+cGxfZGV2OworCXBsX2luZm8gPSBwbF9kZXYtPnBsX2luZm87CisKKwlpZiAoc2l6ZSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNpemUgPT0gcGxfaW5mby0+YnVmX3NpemUpCisJCXJldHVybiAwOworCisJaWYgKHBsX2luZm8tPmxvZ19zdGF0ZSkgeworCQlwcmludGsKKwkJCSgiTG9nZ2luZyBzaG91bGQgYmUgZGlzYWJsZWQgYmVmb3JlIGNoYW5naW5nIGJ1ZmVyIHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGxfaW5mby0+YnVmICE9IE5VTEwpCisJCXBrdGxvZ19yZWxlYXNlX2J1ZihzY24pOworCisJaWYgKHNpemUgIT0gMCkKKwkJcGxfaW5mby0+YnVmX3NpemUgPSBzaXplOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogUkVNT1ZFX1BLVF9MT0cgKi8KZGlmZiAtLWdpdCBhL2NvcmUvdXRpbHMvcGt0bG9nL3BrdGxvZ19pbnRlcm5hbC5jIGIvY29yZS91dGlscy9wa3Rsb2cvcGt0bG9nX2ludGVybmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjMDFiNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdXRpbHMvcGt0bG9nL3BrdGxvZ19pbnRlcm5hbC5jCkBAIC0wLDAgKzEsNjgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgUkVNT1ZFX1BLVF9MT0cKKyNpbmNsdWRlICJvbF90eHJ4X3R5cGVzLmgiCisjaW5jbHVkZSAib2xfaHR0X3R4X2FwaS5oIgorI2luY2x1ZGUgIm9sX3R4X2Rlc2MuaCIKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisjaW5jbHVkZSAiaHR0LmgiCisjaW5jbHVkZSAiaHR0X2ludGVybmFsLmgiCisjaW5jbHVkZSAicGt0bG9nX2FjX2kuaCIKKyNpbmNsdWRlICJ3bWFfYXBpLmgiCisjaW5jbHVkZSAid2xhbl9sb2dnaW5nX3NvY2tfc3ZjLmgiCisKKyNkZWZpbmUgVFhfREVTQ19JRF9MT1dfTUFTSyAgICAgMHhmZmZmCisjZGVmaW5lIFRYX0RFU0NfSURfTE9XX1NISUZUICAgIDAKKyNkZWZpbmUgVFhfREVTQ19JRF9ISUdIX01BU0sgICAgMHhmZmZmMDAwMAorI2RlZmluZSBUWF9ERVNDX0lEX0hJR0hfU0hJRlQgICAxNgorCisjZGVmaW5lIFBFUl9QQUNLRVRfU1RBVFNfVEhSRVNIT0xEIDQwOTYKKwordm9pZCBwa3Rsb2dfZ2V0YnVmX2ludHNhZmUoc3RydWN0IGF0aF9wa3Rsb2dfYXJnICpwbGFyZykKK3sKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19idWYgKmxvZ19idWY7CisJaW50MzJfdCBidWZfc2l6ZTsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIgKmxvZ19oZHI7CisJaW50MzJfdCBjdXJfd3Jfb2Zmc2V0OworCWNoYXIgKmxvZ19wdHI7CisJc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqcGxfaW5mbzsKKwl1aW50MTZfdCBsb2dfdHlwZTsKKwlzaXplX3QgbG9nX3NpemU7CisJdWludDMyX3QgZmxhZ3M7CisKKwlpZiAoIXBsYXJnKSB7CisJCXByaW50aygiSW52YWxpZCBwYXJnIGluICVzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlwbF9pbmZvID0gcGxhcmctPnBsX2luZm87CisJbG9nX3R5cGUgPSBwbGFyZy0+bG9nX3R5cGU7CisJbG9nX3NpemUgPSBwbGFyZy0+bG9nX3NpemU7CisJbG9nX2J1ZiA9IHBsX2luZm8tPmJ1ZjsKKwlmbGFncyA9IHBsYXJnLT5mbGFnczsKKworCWlmICghbG9nX2J1ZikgeworCQlwcmludGsoIkludmFsaWQgbG9nX2J1ZiBpbiAlc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWJ1Zl9zaXplID0gcGxfaW5mby0+YnVmX3NpemU7CisJY3VyX3dyX29mZnNldCA9IGxvZ19idWYtPndyX29mZnNldDsKKwkvKiBNb3ZlIHJlYWQgb2Zmc2V0IHRvIHRoZSBuZXh0IGVudHJ5IGlmIHRoZXJlIGlzIGEgYnVmZmVyIG92ZXJsYXAgKi8KKwlpZiAobG9nX2J1Zi0+cmRfb2Zmc2V0ID49IDApIHsKKwkJaWYgKChjdXJfd3Jfb2Zmc2V0IDw9IGxvZ19idWYtPnJkX29mZnNldCkKKwkJICAgICYmIChjdXJfd3Jfb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBhdGhfcGt0bG9nX2hkcikpID4KKwkJICAgIGxvZ19idWYtPnJkX29mZnNldCkgeworCQkJUEtUTE9HX01PVl9SRF9JRFgobG9nX2J1Zi0+cmRfb2Zmc2V0LCBsb2dfYnVmLAorCQkJCQkgIGJ1Zl9zaXplKTsKKwkJfQorCX0gZWxzZSB7CisJCWxvZ19idWYtPnJkX29mZnNldCA9IGN1cl93cl9vZmZzZXQ7CisJfQorCisJbG9nX2hkciA9IChzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIgKikobG9nX2J1Zi0+bG9nX2RhdGEgKyBjdXJfd3Jfb2Zmc2V0KTsKKwlsb2dfaGRyLT5sb2dfdHlwZSA9IGxvZ190eXBlOworCWxvZ19oZHItPmZsYWdzID0gZmxhZ3M7CisJbG9nX2hkci0+c2l6ZSA9ICh1aW50MTZfdCkgbG9nX3NpemU7CisJbG9nX2hkci0+bWlzc2VkX2NudCA9IHBsYXJnLT5taXNzZWRfY250OworCWxvZ19oZHItPnRpbWVzdGFtcCA9IHBsYXJnLT50aW1lc3RhbXA7CisjaWZkZWYgSEVMSVVNUExVUworCWxvZ19oZHItPnR5cGVfc3BlY2lmaWNfZGF0YSA9IHBsYXJnLT50eXBlX3NwZWNpZmljX2RhdGE7CisjZW5kaWYKKwljdXJfd3Jfb2Zmc2V0ICs9IHNpemVvZigqbG9nX2hkcik7CisKKwlpZiAoKGJ1Zl9zaXplIC0gY3VyX3dyX29mZnNldCkgPCBsb2dfc2l6ZSkgeworCQl3aGlsZSAoKGN1cl93cl9vZmZzZXQgPD0gbG9nX2J1Zi0+cmRfb2Zmc2V0KQorCQkgICAgICAgJiYgKGxvZ19idWYtPnJkX29mZnNldCA8IGJ1Zl9zaXplKSkgeworCQkJUEtUTE9HX01PVl9SRF9JRFgobG9nX2J1Zi0+cmRfb2Zmc2V0LCBsb2dfYnVmLAorCQkJCQkgIGJ1Zl9zaXplKTsKKwkJfQorCQljdXJfd3Jfb2Zmc2V0ID0gMDsKKwl9CisKKwl3aGlsZSAoKGN1cl93cl9vZmZzZXQgPD0gbG9nX2J1Zi0+cmRfb2Zmc2V0KQorCSAgICAgICAmJiAoY3VyX3dyX29mZnNldCArIGxvZ19zaXplKSA+IGxvZ19idWYtPnJkX29mZnNldCkgeworCQlQS1RMT0dfTU9WX1JEX0lEWChsb2dfYnVmLT5yZF9vZmZzZXQsIGxvZ19idWYsIGJ1Zl9zaXplKTsKKwl9CisKKwlsb2dfcHRyID0gJihsb2dfYnVmLT5sb2dfZGF0YVtjdXJfd3Jfb2Zmc2V0XSk7CisJY3VyX3dyX29mZnNldCArPSBsb2dfaGRyLT5zaXplOworCisJbG9nX2J1Zi0+d3Jfb2Zmc2V0ID0gKChidWZfc2l6ZSAtIGN1cl93cl9vZmZzZXQpID49CisJCQkgICAgICBzaXplb2Yoc3RydWN0IGF0aF9wa3Rsb2dfaGRyKSkgPyBjdXJfd3Jfb2Zmc2V0IDoKKwkJCSAgICAgMDsKKworCXBsYXJnLT5idWYgPSBsb2dfcHRyOworfQorCisvKioKKyAqIHBrdGxvZ19jaGVja190aHJlc2hvbGQoKSAtIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRocmVzaG9sZCBmb3IgdHJpZ2dlcmluZworICogcGFja2V0IHN0YXRzCisgKiBAcGxfaW5mbzogUGFja2V0IGxvZyBpbmZvcm1hdGlvbiBwb2ludGVyCisgKiBAbG9nX3NpemU6IFNpemUgb2YgY3VycmVudCBwYWNrZXQgbG9nIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpbnRlcm5hbGx5IHRyaWdnZXJzIGxvZ2dpbmcgb2YgcGVyIHBhY2tldCBzdGF0cyB3aGVuIHRoZQorICogaW5jb21pbmcgZGF0YSBjcm9zc2VzIHRocmVzaG9sZCBsaW1pdAorICoKKyAqIFJldHVybjogTm9uZQorICoKKyAqLwordm9pZCBwa3Rsb2dfY2hlY2tfdGhyZXNob2xkKHN0cnVjdCBhdGhfcGt0bG9nX2luZm8gKnBsX2luZm8sCisJCXNpemVfdCBsb2dfc2l6ZSkKK3sKKwlQS1RMT0dfTE9DSyhwbF9pbmZvKTsKKwlwbF9pbmZvLT5idWYtPmJ5dGVzX3dyaXR0ZW4gKz0gbG9nX3NpemUgKyBzaXplb2Yoc3RydWN0IGF0aF9wa3Rsb2dfaGRyKTsKKworCWlmIChwbF9pbmZvLT5idWYtPmJ5dGVzX3dyaXR0ZW4gPj0gUEVSX1BBQ0tFVF9TVEFUU19USFJFU0hPTEQpIHsKKwkJd2xhbl9sb2dnaW5nX3NldF9wZXJfcGt0X3N0YXRzKCk7CisJCXBsX2luZm8tPmJ1Zi0+Ynl0ZXNfd3JpdHRlbiA9IDA7CisJfQorCVBLVExPR19VTkxPQ0socGxfaW5mbyk7Cit9CisKK2NoYXIgKnBrdGxvZ19nZXRidWYoc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2LAorCQkgICAgc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqcGxfaW5mbywKKwkJICAgIHNpemVfdCBsb2dfc2l6ZSwgc3RydWN0IGF0aF9wa3Rsb2dfaGRyICpwbF9oZHIpCit7CisJc3RydWN0IGF0aF9wa3Rsb2dfYXJnIHBsYXJnID0geyAwLCB9OworCXVpbnQ4X3QgZmxhZ3MgPSAwOworCisJcGxhcmcucGxfaW5mbyA9IHBsX2luZm87CisJcGxhcmcubG9nX3R5cGUgPSBwbF9oZHItPmxvZ190eXBlOworCXBsYXJnLmxvZ19zaXplID0gbG9nX3NpemU7CisJcGxhcmcuZmxhZ3MgPSBwbF9oZHItPmZsYWdzOworCXBsYXJnLm1pc3NlZF9jbnQgPSBwbF9oZHItPm1pc3NlZF9jbnQ7CisJcGxhcmcudGltZXN0YW1wID0gcGxfaGRyLT50aW1lc3RhbXA7CisjaWZkZWYgSEVMSVVNUExVUworCXBsYXJnLnR5cGVfc3BlY2lmaWNfZGF0YSA9IHBsX2hkci0+dHlwZV9zcGVjaWZpY19kYXRhOworI2VuZGlmCisJaWYgKGZsYWdzICYgUEhGTEFHU19JTlRFUlJVUFRfQ09OVEVYVCkgeworCQkvKgorCQkgKiBXZSBhcmUgYWxyZWFkeSBpbiBpbnRlcnVwdCBjb250ZXh0LCBubyBuZWVkIHRvIG1ha2UgaXQKKwkJICogaW50c2FmZS4gY2FsbCB0aGUgZnVuY3Rpb24gZGlyZWN0bHkuCisJCSAqLworCQlwa3Rsb2dfZ2V0YnVmX2ludHNhZmUoJnBsYXJnKTsKKwl9IGVsc2UgeworCQlQS1RMT0dfTE9DSyhwbF9pbmZvKTsKKwkJcGt0bG9nX2dldGJ1Zl9pbnRzYWZlKCZwbGFyZyk7CisJCVBLVExPR19VTkxPQ0socGxfaW5mbyk7CisJfQorCisJLyoKKwkgKiBXZSBkbyBub3Qgd2FudCB0byBkbyB0aGlzIHBhY2tldCBzdGF0cyByZWxhdGVkIHByb2Nlc3Npbmcgd2hlbgorCSAqIHBhY2tldCBsb2cgdG9vbCBpcyBydW4uIGkuZS4sIHdlIHdhbnQgdGhpcyBwcm9jZXNzaW5nIHRvIGJlCisJICogZG9uZSBvbmx5IHdoZW4gc3RhcnQgbG9nZ2luZyBjb21tYW5kIG9mIHBhY2tldCBzdGF0cyBpcyBpbml0aWF0ZWQuCisJICovCisJaWYgKGNkc19nZXRfcmluZ19sb2dfbGV2ZWwoUklOR19JRF9QRVJfUEFDS0VUX1NUQVRTKSA9PQorCQkJV0xBTl9MT0dfTEVWRUxfQUNUSVZFKQorCQlwa3Rsb2dfY2hlY2tfdGhyZXNob2xkKHBsX2luZm8sIGxvZ19zaXplKTsKKworCXJldHVybiBwbGFyZy5idWY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHhjdGxfZnJtX2hkciBmcm1faGRyOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX2llZWVfaGRyKHZvaWQgKmRhdGEpCit7CisJdWludDhfdCBkaXI7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2ggPSAoc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKShkYXRhKTsKKworCWZybV9oZHIuZnJhbWVjdHJsID0gKih1aW50MTZfdCAqKSAod2gtPmlfZmMpOworCWZybV9oZHIuc2VxY3RybCA9ICoodWludDE2X3QgKikgKHdoLT5pX3NlcSk7CisJZGlyID0gKHdoLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9ESVJfTUFTSyk7CisKKwlpZiAoZGlyID09IElFRUU4MDIxMV9GQzFfRElSX1RPRFMpIHsKKwkJZnJtX2hkci5ic3NpZF90YWlsID0KKwkJCSh3aC0+aV9hZGRyMVtJRUVFODAyMTFfQUREUl9MRU4gLSAyXSA8PCA4KSB8ICh3aC0+CisJCQkJCQkJCSAgICAgIGlfYWRkcjEKKwkJCQkJCQkJICAgICAgW0lFRUU4MDIxMV9BRERSX0xFTgorCQkJCQkJCQkgICAgICAgLSAxXSk7CisJCWZybV9oZHIuc2FfdGFpbCA9CisJCQkod2gtPmlfYWRkcjJbSUVFRTgwMjExX0FERFJfTEVOIC0gMl0gPDwgOCkgfCAod2gtPgorCQkJCQkJCQkgICAgICBpX2FkZHIyCisJCQkJCQkJCSAgICAgIFtJRUVFODAyMTFfQUREUl9MRU4KKwkJCQkJCQkJICAgICAgIC0gMV0pOworCQlmcm1faGRyLmRhX3RhaWwgPQorCQkJKHdoLT5pX2FkZHIzW0lFRUU4MDIxMV9BRERSX0xFTiAtIDJdIDw8IDgpIHwgKHdoLT4KKwkJCQkJCQkJICAgICAgaV9hZGRyMworCQkJCQkJCQkgICAgICBbSUVFRTgwMjExX0FERFJfTEVOCisJCQkJCQkJCSAgICAgICAtIDFdKTsKKwl9IGVsc2UgaWYgKGRpciA9PSBJRUVFODAyMTFfRkMxX0RJUl9GUk9NRFMpIHsKKwkJZnJtX2hkci5ic3NpZF90YWlsID0KKwkJCSh3aC0+aV9hZGRyMltJRUVFODAyMTFfQUREUl9MRU4gLSAyXSA8PCA4KSB8ICh3aC0+CisJCQkJCQkJCSAgICAgIGlfYWRkcjIKKwkJCQkJCQkJICAgICAgW0lFRUU4MDIxMV9BRERSX0xFTgorCQkJCQkJCQkgICAgICAgLSAxXSk7CisJCWZybV9oZHIuc2FfdGFpbCA9CisJCQkod2gtPmlfYWRkcjNbSUVFRTgwMjExX0FERFJfTEVOIC0gMl0gPDwgOCkgfCAod2gtPgorCQkJCQkJCQkgICAgICBpX2FkZHIzCisJCQkJCQkJCSAgICAgIFtJRUVFODAyMTFfQUREUl9MRU4KKwkJCQkJCQkJICAgICAgIC0gMV0pOworCQlmcm1faGRyLmRhX3RhaWwgPQorCQkJKHdoLT5pX2FkZHIxW0lFRUU4MDIxMV9BRERSX0xFTiAtIDJdIDw8IDgpIHwgKHdoLT4KKwkJCQkJCQkJICAgICAgaV9hZGRyMQorCQkJCQkJCQkgICAgICBbSUVFRTgwMjExX0FERFJfTEVOCisJCQkJCQkJCSAgICAgICAtIDFdKTsKKwl9IGVsc2UgeworCQlmcm1faGRyLmJzc2lkX3RhaWwgPQorCQkJKHdoLT5pX2FkZHIzW0lFRUU4MDIxMV9BRERSX0xFTiAtIDJdIDw8IDgpIHwgKHdoLT4KKwkJCQkJCQkJICAgICAgaV9hZGRyMworCQkJCQkJCQkgICAgICBbSUVFRTgwMjExX0FERFJfTEVOCisJCQkJCQkJCSAgICAgICAtIDFdKTsKKwkJZnJtX2hkci5zYV90YWlsID0KKwkJCSh3aC0+aV9hZGRyMltJRUVFODAyMTFfQUREUl9MRU4gLSAyXSA8PCA4KSB8ICh3aC0+CisJCQkJCQkJCSAgICAgIGlfYWRkcjIKKwkJCQkJCQkJICAgICAgW0lFRUU4MDIxMV9BRERSX0xFTgorCQkJCQkJCQkgICAgICAgLSAxXSk7CisJCWZybV9oZHIuZGFfdGFpbCA9CisJCQkod2gtPmlfYWRkcjFbSUVFRTgwMjExX0FERFJfTEVOIC0gMl0gPDwgOCkgfCAod2gtPgorCQkJCQkJCQkgICAgICBpX2FkZHIxCisJCQkJCQkJCSAgICAgIFtJRUVFODAyMTFfQUREUl9MRU4KKwkJCQkJCQkJICAgICAgIC0gMV0pOworCX0KK30KKworQV9TVEFUVVMgcHJvY2Vzc190eF9pbmZvKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqdHhyeF9wZGV2LCB2b2lkICpkYXRhKQoreworCS8qCisJICogTXVzdCBpbmNsdWRlIHRvIHByb2Nlc3MgZGlmZmVyZW50IHR5cGVzCisJICogVFhfQ1RMLCBUWF9TVEFUVVMsIFRYX01TRFVfSUQsIFRYX0ZSTV9IRFIKKwkgKi8KKwlzdHJ1Y3Qgb2xfcGt0bG9nX2Rldl90ICpwbF9kZXY7CisJc3RydWN0IGF0aF9wa3Rsb2dfaGRyIHBsX2hkcjsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvOworCXVpbnQzMl90ICpwbF90Z3RfaGRyOworCisJaWYgKCF0eHJ4X3BkZXYpIHsKKwkJcHJpbnRrKCJJbnZhbGlkIHBkZXYgaW4gJXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCWNkZl9hc3NlcnQodHhyeF9wZGV2LT5wbF9kZXYpOworCWNkZl9hc3NlcnQoZGF0YSk7CisJcGxfZGV2ID0gdHhyeF9wZGV2LT5wbF9kZXY7CisKKwlwbF90Z3RfaGRyID0gKHVpbnQzMl90ICopIGRhdGE7CisJLyoKKwkgKiBNYWtlcyB0aGUgc2hvcnQgd29yZHMgKDE2IGJpdHMpIHBvcnRhYmxlIGIvdyBsaXR0bGUgZW5kaWFuCisJICogYW5kIGJpZyBlbmRpYW4KKwkgKi8KKwlwbF9oZHIuZmxhZ3MgPSAoKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfRkxBR1NfT0ZGU0VUKSAmCisJCQlBVEhfUEtUTE9HX0hEUl9GTEFHU19NQVNLKSA+PgorCQkgICAgICAgQVRIX1BLVExPR19IRFJfRkxBR1NfU0hJRlQ7CisJcGxfaGRyLm1pc3NlZF9jbnQgPSAoKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfTUlTU0VEX0NOVF9PRkZTRVQpICYKKwkJCSAgICAgQVRIX1BLVExPR19IRFJfTUlTU0VEX0NOVF9NQVNLKSA+PgorCQkJICAgIEFUSF9QS1RMT0dfSERSX01JU1NFRF9DTlRfU0hJRlQ7CisJcGxfaGRyLmxvZ190eXBlID0gKCoocGxfdGd0X2hkciArIEFUSF9QS1RMT0dfSERSX0xPR19UWVBFX09GRlNFVCkgJgorCQkJICAgQVRIX1BLVExPR19IRFJfTE9HX1RZUEVfTUFTSykgPj4KKwkJCSAgQVRIX1BLVExPR19IRFJfTE9HX1RZUEVfU0hJRlQ7CisJcGxfaGRyLnNpemUgPSAoKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfU0laRV9PRkZTRVQpICYKKwkJICAgICAgIEFUSF9QS1RMT0dfSERSX1NJWkVfTUFTSykgPj4gQVRIX1BLVExPR19IRFJfU0laRV9TSElGVDsKKwlwbF9oZHIudGltZXN0YW1wID0gKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfVElNRVNUQU1QX09GRlNFVCk7CisjaWZkZWYgSEVMSVVNUExVUworCXBsX2hkci50eXBlX3NwZWNpZmljX2RhdGEgPQorCQkqKHBsX3RndF9oZHIgKyBBVEhfUEtUTE9HX0hEUl9UWVBFX1NQRUNJRklDX0RBVEFfT0ZGU0VUKTsKKyNlbmRpZgorCXBsX2luZm8gPSBwbF9kZXYtPnBsX2luZm87CisKKwlpZiAocGxfaGRyLmxvZ190eXBlID09IFBLVExPR19UWVBFX1RYX0ZSTV9IRFIpIHsKKwkJLyogVmFsaWQgb25seSBmb3IgdGhlIFRYIENUTCAqLworCQlwcm9jZXNzX2llZWVfaGRyKGRhdGEgKyBzaXplb2YocGxfaGRyKSk7CisJfQorCisJaWYgKHBsX2hkci5sb2dfdHlwZSA9PSBQS1RMT0dfVFlQRV9UWF9WSVJUX0FERFIpIHsKKwkJQV9VSU5UMzIgZGVzY19pZCA9IChBX1VJTlQzMikKKwkJCQkgICAqKChBX1VJTlQzMiAqKSAoZGF0YSArIHNpemVvZihwbF9oZHIpKSk7CisJCUFfVUlOVDMyIHZkZXZfaWQgPSBkZXNjX2lkOworCisJCS8qIGlmIHRoZSBwa3QgbG9nIG1zZyBpcyBmb3IgdGhlIGJjbiBmcmFtZSB0aGUgdmRldiBpZAorCQkgKiBpcyBwaWdneWJhY2tlZCBpbiBkZXNjX2lkIGFuZCB0aGUgTVNCIG9mIHRoZSBkZXNjIElECisJCSAqIHdvdWxkIGJlIHNldCB0byBGRgorCQkgKi8KKyNkZWZpbmUgQkNOX0RFU0NfSUQgMHhGRgorCQlpZiAoKGRlc2NfaWQgPj4gMjQpID09IEJDTl9ERVNDX0lEKSB7CisJCQl2b2lkICpkYXRhOworCQkJQV9VSU5UMzIgYnVmX3NpemU7CisKKwkJCXZkZXZfaWQgJj0gMHgwMEZGRkZGRjsKKwkJCWRhdGEgPSB3bWFfZ2V0X2JlYWNvbl9idWZmZXJfYnlfdmRldl9pZCh2ZGV2X2lkLAorCQkJCQkJCQkmYnVmX3NpemUpOworCQkJaWYgKGRhdGEpIHsKKwkJCQlwcm9jZXNzX2llZWVfaGRyKGRhdGEpOworCQkJCWNkZl9tZW1fZnJlZShkYXRhKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUT0RPOiBnZXQgdGhlIGhkciBjb250ZW50IGZvciBtZ210IGZyYW1lcyBmcm9tCisJCQkgKiBUeCBtZ210IGRlc2MgcG9vbAorCQkJICovCisJCX0KKwl9CisKKwlpZiAocGxfaGRyLmxvZ190eXBlID09IFBLVExPR19UWVBFX1RYX0NUUkwpIHsKKyNpZiAhZGVmaW5lZChIRUxJVU1QTFVTKQorCQlzdHJ1Y3QgYXRoX3BrdGxvZ190eGN0bCB0eGN0bF9sb2c7CisJCXNpemVfdCBsb2dfc2l6ZSA9IHNpemVvZih0eGN0bF9sb2cucHJpdik7CisKKwkJdHhjdGxfbG9nLnR4ZGVzY19oZHJfY3RsID0gKHZvaWQgKilwa3Rsb2dfZ2V0YnVmKHBsX2RldiwKKwkJCQkJCQkJIHBsX2luZm8sCisJCQkJCQkJCSBsb2dfc2l6ZSwKKwkJCQkJCQkJICZwbF9oZHIpOworCisJCWlmICghdHhjdGxfbG9nLnR4ZGVzY19oZHJfY3RsKSB7CisJCQlwcmludGsKKwkJCQkoImZhaWxlZCB0byBnZXQgYnVmIGZvciB0eGN0bF9sb2cudHhkZXNjX2hkcl9jdGxcbiIpOworCQkJcmV0dXJuIEFfRVJST1I7CisJCX0KKworCQkvKgorCQkgKiBmcm0gaGRyIGlzIGN1cnJlbnRseSBWYWxpZCBvbmx5IGZvciBsb2NhbCBmcmFtZXMKKwkJICogQWRkIGNhcGFiaWxpdHkgdG8gaW5jbHVkZSB0aGUgZm1yIGhkciBmb3IgcmVtb3RlIGZyYW1lcworCQkgKi8KKwkJdHhjdGxfbG9nLnByaXYuZnJtX2hkciA9IGZybV9oZHI7CisJCWNkZl9hc3NlcnQodHhjdGxfbG9nLnByaXYudHhkZXNjX2N0bCk7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZ0eGN0bF9sb2cucHJpdi50eGRlc2NfY3RsLAorCQkJICAgICAoKHZvaWQgKilkYXRhICsgc2l6ZW9mKHN0cnVjdCBhdGhfcGt0bG9nX2hkcikpLAorCQkJICAgICBwbF9oZHIuc2l6ZSk7CisJCWNkZl9hc3NlcnQodHhjdGxfbG9nLnR4ZGVzY19oZHJfY3RsKTsKKwkJY2RmX21lbV9jb3B5KHR4Y3RsX2xvZy50eGRlc2NfaGRyX2N0bCwgJnR4Y3RsX2xvZy5wcml2LAorCQkJICAgICBzaXplb2YodHhjdGxfbG9nLnByaXYpKTsKKwkJLyogQWRkIFByb3RvY29sIGluZm9ybWF0aW9uIGFuZCBIVCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworI2Vsc2UKKwkJc2l6ZV90IGxvZ19zaXplID0gc2l6ZW9mKGZybV9oZHIpICsgcGxfaGRyLnNpemU7CisJCXZvaWQgKnR4ZGVzY19oZHJfY3RsID0gKHZvaWQgKikKKwkJcGt0bG9nX2dldGJ1ZihwbF9kZXYsIHBsX2luZm8sIGxvZ19zaXplLCAmcGxfaGRyKTsKKwkJY2RmX2Fzc2VydCh0eGRlc2NfaGRyX2N0bCk7CisJCWNkZl9hc3NlcnQocGxfaGRyLnNpemUgPCAoMzcwICogc2l6ZW9mKHVfaW50MzJfdCkpKTsKKworCQljZGZfbWVtX2NvcHkodHhkZXNjX2hkcl9jdGwsICZmcm1faGRyLCBzaXplb2YoZnJtX2hkcikpOworCQljZGZfbWVtX2NvcHkoKGNoYXIgKil0eGRlc2NfaGRyX2N0bCArIHNpemVvZihmcm1faGRyKSwKKwkJCQkJKCh2b2lkICopZGF0YSArIHNpemVvZihzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIpKSwKKwkJCQkJIHBsX2hkci5zaXplKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChIRUxJVU1QTFVTKSAqLworCX0KKworCWlmIChwbF9oZHIubG9nX3R5cGUgPT0gUEtUTE9HX1RZUEVfVFhfU1RBVCkgeworCQlzdHJ1Y3QgYXRoX3BrdGxvZ190eF9zdGF0dXMgdHhzdGF0X2xvZzsKKwkJc2l6ZV90IGxvZ19zaXplID0gcGxfaGRyLnNpemU7CisKKwkJdHhzdGF0X2xvZy5kc19zdGF0dXMgPSAodm9pZCAqKQorCQkJCSAgICAgICBwa3Rsb2dfZ2V0YnVmKHBsX2RldiwgcGxfaW5mbywgbG9nX3NpemUsICZwbF9oZHIpOworCQljZGZfYXNzZXJ0KHR4c3RhdF9sb2cuZHNfc3RhdHVzKTsKKwkJY2RmX21lbV9jb3B5KHR4c3RhdF9sb2cuZHNfc3RhdHVzLAorCQkJICAgICAoKHZvaWQgKilkYXRhICsgc2l6ZW9mKHN0cnVjdCBhdGhfcGt0bG9nX2hkcikpLAorCQkJICAgICBwbF9oZHIuc2l6ZSk7CisJfQorCisJaWYgKHBsX2hkci5sb2dfdHlwZSA9PSBQS1RMT0dfVFlQRV9UWF9NU0RVX0lEKSB7CisJCXN0cnVjdCBhdGhfcGt0bG9nX21zZHVfaW5mbyBwbF9tc2R1X2luZm87CisJCXVpbnQzMl90IGk7CisJCXVpbnQzMl90ICpodHRfdHhfZGVzYzsKKwkJc2l6ZV90IGxvZ19zaXplOworCQlzdHJ1Y3Qgb2xfdHhfZGVzY190ICp0eF9kZXNjOworCQl1aW50OF90IG1zZHVfaWRfb2Zmc2V0ID0gTVNEVV9JRF9JTkZPX0lEX09GRlNFVDsKKwkJdWludDE2X3QgdHhfZGVzY19pZDsKKwkJdWludDMyX3QgKm1zZHVfaWRfaW5mbyA9ICh1aW50MzJfdCAqKQorCQkJCQkgKCh2b2lkICopZGF0YSArIHNpemVvZihzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIpKTsKKwkJdWludDMyX3QgKm1zZHVfaWQgPSAodWludDMyX3QgKikgKChjaGFyICopbXNkdV9pZF9pbmZvICsKKwkJCQkJCSAgbXNkdV9pZF9vZmZzZXQpOworCQl1aW50OF90ICphZGRyLCAqdmFwX2FkZHI7CisJCXVpbnQ4X3QgdmRldl9pZDsKKwkJY2RmX25idWZfdCBuZXRidWY7CisJCXVpbnQzMl90IGxlbjsKKworCQljZGZfbWVtX3NldCgmcGxfbXNkdV9pbmZvLCBzaXplb2YocGxfbXNkdV9pbmZvKSwgMCk7CisKKwkJcGxfbXNkdV9pbmZvLm51bV9tc2R1ID0gKm1zZHVfaWRfaW5mbzsKKwkJcGxfbXNkdV9pbmZvLnByaXZfc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKgorCQkJCQkgcGxfbXNkdV9pbmZvLm51bV9tc2R1ICsgc2l6ZW9mKHVpbnQzMl90KTsKKwkJbG9nX3NpemUgPSBzaXplb2YocGxfbXNkdV9pbmZvLnByaXYpOworCisJCWZvciAoaSA9IDA7IGkgPCBwbF9tc2R1X2luZm8ubnVtX21zZHU7IGkrKykgeworCQkJLyoKKwkJCSAqIEhhbmRsZSBiaWcgZW5kaWFuZXNzCisJCQkgKiBJbmNyZW1lbnQgbXNkdV9pZCBvbmNlIGFmdGVyIHJldHJpZXZpbmcKKwkJCSAqIGxvd2VyIDE2IGJpdHMgYW5kIHVwcHBlciAxNiBiaXRzCisJCQkgKi8KKwkJCWlmICghKGkgJSAyKSkgeworCQkJCXR4X2Rlc2NfaWQgPSAoKCptc2R1X2lkICYgVFhfREVTQ19JRF9MT1dfTUFTSykKKwkJCQkJICAgICAgPj4gVFhfREVTQ19JRF9MT1dfU0hJRlQpOworCQkJfSBlbHNlIHsKKwkJCQl0eF9kZXNjX2lkID0gKCgqbXNkdV9pZCAmIFRYX0RFU0NfSURfSElHSF9NQVNLKQorCQkJCQkgICAgICA+PiBUWF9ERVNDX0lEX0hJR0hfU0hJRlQpOworCQkJCW1zZHVfaWQgKz0gMTsKKwkJCX0KKwkJCXR4X2Rlc2MgPSBvbF90eF9kZXNjX2ZpbmQodHhyeF9wZGV2LCB0eF9kZXNjX2lkKTsKKwkJCWNkZl9hc3NlcnQodHhfZGVzYyk7CisJCQluZXRidWYgPSB0eF9kZXNjLT5uZXRidWY7CisJCQlodHRfdHhfZGVzYyA9ICh1aW50MzJfdCAqKSB0eF9kZXNjLT5odHRfdHhfZGVzYzsKKwkJCWNkZl9hc3NlcnQoaHR0X3R4X2Rlc2MpOworCisJCQljZGZfbmJ1Zl9wZWVrX2hlYWRlcihuZXRidWYsICZhZGRyLCAmbGVuKTsKKworCQkJaWYgKGxlbiA8ICgyICogSUVFRTgwMjExX0FERFJfTEVOKSkgeworCQkJCWNkZl9wcmludCgiVFggZnJhbWUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIgorCQkJCQkgICIgYWRkcmVzc1xuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJLyogQWRkaW5nIGhlYWRlciBpbmZvcm1hdGlvbiBmb3IgdGhlIFRYIGRhdGEgZnJhbWVzICovCisJCQl2ZGV2X2lkID0gKHVpbnQ4X3QpICgqKGh0dF90eF9kZXNjICsKKwkJCQkJICAgICAgIEhUVF9UWF9WREVWX0lEX1dPUkQpID4+CisJCQkJCSAgICAgSFRUX1RYX1ZERVZfSURfU0hJRlQpICYKKwkJCQkgIEhUVF9UWF9WREVWX0lEX01BU0s7CisKKwkJCXZhcF9hZGRyID0gd21hX2dldF92ZGV2X2FkZHJlc3NfYnlfdmRldl9pZCh2ZGV2X2lkKTsKKworCQkJZnJtX2hkci5kYV90YWlsID0gKGFkZHJbSUVFRTgwMjExX0FERFJfTEVOIC0gMl0gPDwgOCkgfAorCQkJCQkgIChhZGRyW0lFRUU4MDIxMV9BRERSX0xFTiAtIDFdKTsKKwkJCWZybV9oZHIuc2FfdGFpbCA9CisJCQkJKGFkZHJbMiAqIElFRUU4MDIxMV9BRERSX0xFTiAtIDJdIDw8IDgpIHwKKwkJCQkoYWRkclsyICogSUVFRTgwMjExX0FERFJfTEVOIC0gMV0pOworCQkJaWYgKHZhcF9hZGRyKSB7CisJCQkJZnJtX2hkci5ic3NpZF90YWlsID0KKwkJCQkJKHZhcF9hZGRyW0lFRUU4MDIxMV9BRERSX0xFTiAtIDJdIDw8IDgpIHwKKwkJCQkJKHZhcF9hZGRyW0lFRUU4MDIxMV9BRERSX0xFTiAtIDFdKTsKKwkJCX0gZWxzZSB7CisJCQkJZnJtX2hkci5ic3NpZF90YWlsID0gMHgwMDAwOworCQkJfQorCQkJcGxfbXNkdV9pbmZvLnByaXYubXNkdV9sZW5baV0gPSAqKGh0dF90eF9kZXNjICsKKwkJCQkJCQkgIEhUVF9UWF9NU0RVX0xFTl9EV09SRCkKKwkJCQkJCQkmIEhUVF9UWF9NU0RVX0xFTl9NQVNLOworCQkJLyoKKwkJCSAqIEFkZCBtb3JlIGluZm9ybWF0aW9uIHBlciBNU0RVCisJCQkgKiBlLmcuLCBwcm90b2NvbCBpbmZvcm1hdGlvbgorCQkJICovCisJCX0KKwkJcGxfbXNkdV9pbmZvLmF0aF9tc2R1X2luZm8gPSBwa3Rsb2dfZ2V0YnVmKHBsX2RldiwgcGxfaW5mbywKKwkJCQkJCQkgICBsb2dfc2l6ZSwgJnBsX2hkcik7CisJCWNkZl9tZW1fY29weSgodm9pZCAqKSZwbF9tc2R1X2luZm8ucHJpdi5tc2R1X2lkX2luZm8sCisJCQkgICAgICgodm9pZCAqKWRhdGEgKyBzaXplb2Yoc3RydWN0IGF0aF9wa3Rsb2dfaGRyKSksCisJCQkgICAgIHNpemVvZihwbF9tc2R1X2luZm8ucHJpdi5tc2R1X2lkX2luZm8pKTsKKwkJY2RmX21lbV9jb3B5KHBsX21zZHVfaW5mby5hdGhfbXNkdV9pbmZvLCAmcGxfbXNkdV9pbmZvLnByaXYsCisJCQkgICAgIHNpemVvZihwbF9tc2R1X2luZm8ucHJpdikpOworCX0KKwlyZXR1cm4gQV9PSzsKK30KKworQV9TVEFUVVMgcHJvY2Vzc19yeF9pbmZvX3JlbW90ZSh2b2lkICpwZGV2LCBjZGZfbmJ1Zl90IGFtc2R1KQoreworCXN0cnVjdCBvbF9wa3Rsb2dfZGV2X3QgKnBsX2RldjsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvOworCXN0cnVjdCBodHRfaG9zdF9yeF9kZXNjX2Jhc2UgKnJ4X2Rlc2M7CisJc3RydWN0IGF0aF9wa3Rsb2dfaGRyIHBsX2hkcjsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19yeF9pbmZvIHJ4c3RhdF9sb2c7CisJc2l6ZV90IGxvZ19zaXplOworCWNkZl9uYnVmX3QgbXNkdTsKKworCWlmICghcGRldikgeworCQlwcmludGsoIkludmFsaWQgcGRldiBpbiAlc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gQV9FUlJPUjsKKwl9CisJaWYgKCFhbXNkdSkgeworCQlwcmludGsoIkludmFsaWQgZGF0YSBpbiAlc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gQV9FUlJPUjsKKwl9CisJcGxfZGV2ID0gKChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKilwZGV2KS0+cGxfZGV2OworCXBsX2luZm8gPSBwbF9kZXYtPnBsX2luZm87CisJbXNkdSA9IGFtc2R1OworCisJd2hpbGUgKG1zZHUpIHsKKwkJcnhfZGVzYyA9CisJCQkoc3RydWN0IGh0dF9ob3N0X3J4X2Rlc2NfYmFzZSAqKShjZGZfbmJ1Zl9kYXRhKG1zZHUpKSAtIDE7CisJCWxvZ19zaXplID0KKwkJCXNpemVvZigqcnhfZGVzYykgLSBzaXplb2Yoc3RydWN0IGh0dF9ob3N0X2Z3X2Rlc2NfYmFzZSk7CisKKwkJLyoKKwkJICogQ29uc3RydWN0IHRoZSBwa3Rsb2cgaGVhZGVyIHBsX2hkcgorCQkgKiBCZWNhdXNlIGRlc2MgaXMgRE1BJ2QgdG8gdGhlIGhvc3QgbWVtb3J5CisJCSAqLworCQlwbF9oZHIuZmxhZ3MgPSAoMSA8PCBQS1RMT0dfRkxHX0ZSTV9UWVBFX1JFTU9URV9TKTsKKwkJcGxfaGRyLm1pc3NlZF9jbnQgPSAwOworCQlwbF9oZHIubG9nX3R5cGUgPSBQS1RMT0dfVFlQRV9SWF9TVEFUOworCQlwbF9oZHIuc2l6ZSA9IHNpemVvZigqcnhfZGVzYykgLQorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBodHRfaG9zdF9md19kZXNjX2Jhc2UpOworI2lmIGRlZmluZWQoSEVMSVVNUExVUykKKwkJcGxfaGRyLnRpbWVzdGFtcCA9CisJCQlyeF9kZXNjLT5wcGR1X2VuZC5yeF9wa3RfZW5kLnBoeV90aW1lc3RhbXBfMV9sb3dlcl8zMjsKKwkJcGxfaGRyLnR5cGVfc3BlY2lmaWNfZGF0YSA9IDB4REVBREFBOworI2Vsc2UKKwkJcGxfaGRyLnRpbWVzdGFtcCA9IHJ4X2Rlc2MtPnBwZHVfZW5kLnRzZl90aW1lc3RhbXA7CisjZW5kaWYgLyogIWRlZmluZWQoSEVMSVVNUExVUykgKi8KKwkJcnhzdGF0X2xvZy5yeF9kZXNjID0gKHZvaWQgKilwa3Rsb2dfZ2V0YnVmKHBsX2RldiwgcGxfaW5mbywKKwkJCQkJCQkgICBsb2dfc2l6ZSwgJnBsX2hkcik7CisJCWNkZl9tZW1fY29weShyeHN0YXRfbG9nLnJ4X2Rlc2MsICh2b2lkICopcnhfZGVzYyArCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgaHR0X2hvc3RfZndfZGVzY19iYXNlKSwgcGxfaGRyLnNpemUpOworCQltc2R1ID0gY2RmX25idWZfbmV4dChtc2R1KTsKKwl9CisJcmV0dXJuIEFfT0s7Cit9CisKK0FfU1RBVFVTIHByb2Nlc3NfcnhfaW5mbyh2b2lkICpwZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBvbF9wa3Rsb2dfZGV2X3QgKnBsX2RldjsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19pbmZvICpwbF9pbmZvOworCXN0cnVjdCBhdGhfcGt0bG9nX3J4X2luZm8gcnhzdGF0X2xvZzsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIgcGxfaGRyOworCXNpemVfdCBsb2dfc2l6ZTsKKwl1aW50MzJfdCAqcGxfdGd0X2hkcjsKKworCWlmICghcGRldikgeworCQlwcmludGsoIkludmFsaWQgcGRldiBpbiAlcyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEFfRVJST1I7CisJfQorCXBsX2RldiA9ICgoc3RydWN0IG9sX3R4cnhfcGRldl90ICopcGRldiktPnBsX2RldjsKKwlwbF9pbmZvID0gcGxfZGV2LT5wbF9pbmZvOworCXBsX3RndF9oZHIgPSAodWludDMyX3QgKikgZGF0YTsKKwlwbF9oZHIuZmxhZ3MgPSAoKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfRkxBR1NfT0ZGU0VUKSAmCisJCQlBVEhfUEtUTE9HX0hEUl9GTEFHU19NQVNLKSA+PgorCQkgICAgICAgQVRIX1BLVExPR19IRFJfRkxBR1NfU0hJRlQ7CisJcGxfaGRyLm1pc3NlZF9jbnQgPSAoKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfTUlTU0VEX0NOVF9PRkZTRVQpICYKKwkJCSAgICAgQVRIX1BLVExPR19IRFJfTUlTU0VEX0NOVF9NQVNLKSA+PgorCQkJICAgIEFUSF9QS1RMT0dfSERSX01JU1NFRF9DTlRfU0hJRlQ7CisJcGxfaGRyLmxvZ190eXBlID0gKCoocGxfdGd0X2hkciArIEFUSF9QS1RMT0dfSERSX0xPR19UWVBFX09GRlNFVCkgJgorCQkJICAgQVRIX1BLVExPR19IRFJfTE9HX1RZUEVfTUFTSykgPj4KKwkJCSAgQVRIX1BLVExPR19IRFJfTE9HX1RZUEVfU0hJRlQ7CisJcGxfaGRyLnNpemUgPSAoKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfU0laRV9PRkZTRVQpICYKKwkJICAgICAgIEFUSF9QS1RMT0dfSERSX1NJWkVfTUFTSykgPj4gQVRIX1BLVExPR19IRFJfU0laRV9TSElGVDsKKwlwbF9oZHIudGltZXN0YW1wID0gKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfVElNRVNUQU1QX09GRlNFVCk7CisJbG9nX3NpemUgPSBwbF9oZHIuc2l6ZTsKKwlyeHN0YXRfbG9nLnJ4X2Rlc2MgPSAodm9pZCAqKXBrdGxvZ19nZXRidWYocGxfZGV2LCBwbF9pbmZvLAorCQkJCQkJICAgbG9nX3NpemUsICZwbF9oZHIpOworCisJY2RmX21lbV9jb3B5KHJ4c3RhdF9sb2cucnhfZGVzYywKKwkJICAgICAodm9pZCAqKWRhdGEgKyBzaXplb2Yoc3RydWN0IGF0aF9wa3Rsb2dfaGRyKSwgcGxfaGRyLnNpemUpOworCisJcmV0dXJuIEFfT0s7Cit9CisKK0FfU1RBVFVTIHByb2Nlc3NfcmF0ZV9maW5kKHZvaWQgKnBkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG9sX3BrdGxvZ19kZXZfdCAqcGxfZGV2OworCXN0cnVjdCBhdGhfcGt0bG9nX2hkciBwbF9oZHI7CisJc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqcGxfaW5mbzsKKwlzaXplX3QgbG9nX3NpemU7CisKKwkvKgorCSAqIFdpbGwgYmUgdW5jb21tZW50ZWQgd2hlbiB0aGUgcmF0ZSBjb250cm9sIGZpbmQKKwkgKiBmb3IgcGt0bG9nIGlzIGltcGxlbWVudGVkIGluIHRoZSBmaXJtd2FyZS4KKwkgKiBDdXJyZW50bHkgZGVyaXZlZCBmcm9tIHRoZSBUWCBQUERVIHN0YXR1cworCSAqLworCXN0cnVjdCBhdGhfcGt0bG9nX3JjX2ZpbmQgcmNmX2xvZzsKKwl1aW50MzJfdCAqcGxfdGd0X2hkcjsKKworCWlmICghcGRldikgeworCQljZGZfcHJpbnQoIkludmFsaWQgcGRldiBpbiAlc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gQV9FUlJPUjsKKwl9CisJaWYgKCFkYXRhKSB7CisJCWNkZl9wcmludCgiSW52YWxpZCBkYXRhIGluICVzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBBX0VSUk9SOworCX0KKworCXBsX3RndF9oZHIgPSAodWludDMyX3QgKikgZGF0YTsKKwkvKgorCSAqIE1ha2VzIHRoZSBzaG9ydCB3b3JkcyAoMTYgYml0cykgcG9ydGFibGUgYi93IGxpdHRsZSBlbmRpYW4KKwkgKiBhbmQgYmlnIGVuZGlhbgorCSAqLworCXBsX2hkci5mbGFncyA9ICgqKHBsX3RndF9oZHIgKyBBVEhfUEtUTE9HX0hEUl9GTEFHU19PRkZTRVQpICYKKwkJCUFUSF9QS1RMT0dfSERSX0ZMQUdTX01BU0spID4+CisJCSAgICAgICBBVEhfUEtUTE9HX0hEUl9GTEFHU19TSElGVDsKKwlwbF9oZHIubWlzc2VkX2NudCA9ICgqKHBsX3RndF9oZHIgKyBBVEhfUEtUTE9HX0hEUl9NSVNTRURfQ05UX09GRlNFVCkgJgorCQkJICAgICBBVEhfUEtUTE9HX0hEUl9NSVNTRURfQ05UX01BU0spID4+CisJCQkgICAgQVRIX1BLVExPR19IRFJfTUlTU0VEX0NOVF9TSElGVDsKKwlwbF9oZHIubG9nX3R5cGUgPSAoKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfTE9HX1RZUEVfT0ZGU0VUKSAmCisJCQkgICBBVEhfUEtUTE9HX0hEUl9MT0dfVFlQRV9NQVNLKSA+PgorCQkJICBBVEhfUEtUTE9HX0hEUl9MT0dfVFlQRV9TSElGVDsKKwlwbF9oZHIuc2l6ZSA9ICgqKHBsX3RndF9oZHIgKyBBVEhfUEtUTE9HX0hEUl9TSVpFX09GRlNFVCkgJgorCQkgICAgICAgQVRIX1BLVExPR19IRFJfU0laRV9NQVNLKSA+PiBBVEhfUEtUTE9HX0hEUl9TSVpFX1NISUZUOworCXBsX2hkci50aW1lc3RhbXAgPSAqKHBsX3RndF9oZHIgKyBBVEhfUEtUTE9HX0hEUl9USU1FU1RBTVBfT0ZGU0VUKTsKKwlwbF9kZXYgPSAoKHN0cnVjdCBvbF90eHJ4X3BkZXZfdCAqKXBkZXYpLT5wbF9kZXY7CisJcGxfaW5mbyA9IHBsX2Rldi0+cGxfaW5mbzsKKwlsb2dfc2l6ZSA9IHBsX2hkci5zaXplOworCXJjZl9sb2cucmNGaW5kID0gKHZvaWQgKilwa3Rsb2dfZ2V0YnVmKHBsX2RldiwgcGxfaW5mbywKKwkJCQkJICAgICAgIGxvZ19zaXplLCAmcGxfaGRyKTsKKworCWNkZl9tZW1fY29weShyY2ZfbG9nLnJjRmluZCwKKwkJCQkgKChjaGFyICopZGF0YSArIHNpemVvZihzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIpKSwKKwkJCQkgcGxfaGRyLnNpemUpOworCisJcmV0dXJuIEFfT0s7Cit9CisKK0FfU1RBVFVTIHByb2Nlc3NfcmF0ZV91cGRhdGUodm9pZCAqcGRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb2xfcGt0bG9nX2Rldl90ICpwbF9kZXY7CisJc3RydWN0IGF0aF9wa3Rsb2dfaGRyIHBsX2hkcjsKKwlzaXplX3QgbG9nX3NpemU7CisJc3RydWN0IGF0aF9wa3Rsb2dfaW5mbyAqcGxfaW5mbzsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19yY191cGRhdGUgcmN1X2xvZzsKKwl1aW50MzJfdCAqcGxfdGd0X2hkcjsKKworCWlmICghcGRldikgeworCQlwcmludGsoIkludmFsaWQgcGRldiBpbiAlc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gQV9FUlJPUjsKKwl9CisJaWYgKCFkYXRhKSB7CisJCXByaW50aygiSW52YWxpZCBkYXRhIGluICVzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBBX0VSUk9SOworCX0KKwlwbF90Z3RfaGRyID0gKHVpbnQzMl90ICopIGRhdGE7CisJLyoKKwkgKiBNYWtlcyB0aGUgc2hvcnQgd29yZHMgKDE2IGJpdHMpIHBvcnRhYmxlIGIvdyBsaXR0bGUgZW5kaWFuCisJICogYW5kIGJpZyBlbmRpYW4KKwkgKi8KKwlwbF9oZHIuZmxhZ3MgPSAoKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfRkxBR1NfT0ZGU0VUKSAmCisJCQlBVEhfUEtUTE9HX0hEUl9GTEFHU19NQVNLKSA+PgorCQkgICAgICAgQVRIX1BLVExPR19IRFJfRkxBR1NfU0hJRlQ7CisJcGxfaGRyLm1pc3NlZF9jbnQgPSAoKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfTUlTU0VEX0NOVF9PRkZTRVQpICYKKwkJCSAgICAgQVRIX1BLVExPR19IRFJfTUlTU0VEX0NOVF9NQVNLKSA+PgorCQkJICAgIEFUSF9QS1RMT0dfSERSX01JU1NFRF9DTlRfU0hJRlQ7CisJcGxfaGRyLmxvZ190eXBlID0gKCoocGxfdGd0X2hkciArIEFUSF9QS1RMT0dfSERSX0xPR19UWVBFX09GRlNFVCkgJgorCQkJICAgQVRIX1BLVExPR19IRFJfTE9HX1RZUEVfTUFTSykgPj4KKwkJCSAgQVRIX1BLVExPR19IRFJfTE9HX1RZUEVfU0hJRlQ7CisJcGxfaGRyLnNpemUgPSAoKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfU0laRV9PRkZTRVQpICYKKwkJICAgICAgIEFUSF9QS1RMT0dfSERSX1NJWkVfTUFTSykgPj4gQVRIX1BLVExPR19IRFJfU0laRV9TSElGVDsKKwlwbF9oZHIudGltZXN0YW1wID0gKihwbF90Z3RfaGRyICsgQVRIX1BLVExPR19IRFJfVElNRVNUQU1QX09GRlNFVCk7CisJcGxfZGV2ID0gKChzdHJ1Y3Qgb2xfdHhyeF9wZGV2X3QgKilwZGV2KS0+cGxfZGV2OworCWxvZ19zaXplID0gcGxfaGRyLnNpemU7CisJcGxfaW5mbyA9IHBsX2Rldi0+cGxfaW5mbzsKKworCS8qCisJICogV2lsbCBiZSB1bmNvbW1lbnRlZCB3aGVuIHRoZSByYXRlIGNvbnRyb2wgdXBkYXRlCisJICogZm9yIHBrdGxvZyBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgZmlybXdhcmUuCisJICogQ3VycmVudGx5IGRlcml2ZWQgZnJvbSB0aGUgVFggUFBEVSBzdGF0dXMKKwkgKi8KKwlyY3VfbG9nLnR4UmF0ZUN0cmwgPSAodm9pZCAqKXBrdGxvZ19nZXRidWYocGxfZGV2LCBwbF9pbmZvLAorCQkJCQkJICAgbG9nX3NpemUsICZwbF9oZHIpOworCWNkZl9tZW1fY29weShyY3VfbG9nLnR4UmF0ZUN0cmwsCisJCSAgICAgKChjaGFyICopZGF0YSArIHNpemVvZihzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIpKSwKKwkJICAgICBwbF9oZHIuc2l6ZSk7CisJcmV0dXJuIEFfT0s7Cit9CisjZW5kaWYgLypSRU1PVkVfUEtUX0xPRyAqLwpkaWZmIC0tZ2l0IGEvY29yZS91dGlscy9wdHQvaW5jL3dsYW5fcHR0X3NvY2tfc3ZjLmggYi9jb3JlL3V0aWxzL3B0dC9pbmMvd2xhbl9wdHRfc29ja19zdmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTE3ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS91dGlscy9wdHQvaW5jL3dsYW5fcHR0X3NvY2tfc3ZjLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogd2xhbl9wdHRfc29ja19zdmMuYworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQVFRfU09DS19TVkNfSAorI2RlZmluZSBQVFRfU09DS19TVkNfSAorI2luY2x1ZGUgPHdsYW5fbmxpbmtfc3J2Lmg+CisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8Y2RmX3N0YXR1cy5oPgorI2luY2x1ZGUgPGNkZl90cmFjZS5oPgorI2luY2x1ZGUgPHdsYW5fbmxpbmtfY29tbW9uLmg+CisvKgorICogUXVhcmt5IE1lc3NhZ2UgRm9ybWF0OgorICogVGhlIGZvbGxvd2luZyBpcyB0aGUgbWVzc2FnaW5nIHByb3RvY29sIGJldHdlZW4gUXVhcmt5IGFuZCBQVFQgU29ja2V0IEFwcC4KKyAqIFRoZSB0b3RhbE1zZ0xlbiBpcyB0aGUgbGVuZ3RoIGZyb20gUmFkaW8gdGlsbCBtc2dCb2R5LiBUaGUgdmFsdWUgb2YgUmFkaW8KKyAqIGlzIGFsd2F5cyBkZWZhdWx0ZWQgdG8gMC4gVGhlIE1zZ0xlbiBpcyB0aGUgbGVuZ3RoIGZyb20gbXNnSWQgdGlsbCBtc2dCb2R5LgorICogVGhlIGxlbmd0aCBvZiB0aGUgbXNnQm9keSB2YXJpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBNc2dJZC4gQnVmZmVyIHNwYWNlCisgKiBmb3IgTXNnQm9keSBpcyBhbHJlYWR5IGFsbG9jYXRlZCBpbiB0aGUgcmVjZWl2ZWQgYnVmZmVyLiBTbyBpbiBjYXNlIG9mIFJFQUQKKyAqIHdlIGp1c3QgbmVlZCB0byBwb3B1bGF0ZSB0aGUgdmFsdWVzIGluIHRoZSByZWNlaXZlZCBtZXNzYWdlIGFuZCBzZW5kIGl0CisgKiBiYWNrCisgKiArLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLSsKKyAqIHxUb3RhbE1zZ0xlbiB8IFJhZGlvIHwgTXNnSWQgfCBNc2dMZW4gfFN0YXR1cyB8TXNnQm9keSAgfAorICogKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS18LS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0rCisgKiA8LS0tLS0tNC0tLS0+PC0tNC0tLT48LS0tMi0tPjwtLS0yLS0tPjwtLS00LS0+PC0tLS0tLS0tLT4KKyAqLworLyogUFRUIFNvY2tldCBBcHAgTWVzc2FnZSBJZHMgKi8KKyNkZWZpbmUgUFRUX01TR19SRUFEX1JFR0lTVEVSICAgICAgIDB4MzA0MAorI2RlZmluZSBQVFRfTVNHX1dSSVRFX1JFR0lTVEVSICAgICAgMHgzMDQxCisjZGVmaW5lIFBUVF9NU0dfUkVBRF9NRU1PUlkgICAgICAgICAweDMwNDQKKyNkZWZpbmUgUFRUX01TR19XUklURV9NRU1PUlkgICAgICAgIDB4MzA0NQorI2RlZmluZSBQVFRfTVNHX0xPR19EVU1QX0RCRyAgICAgICAgMHgzMkExCisjZGVmaW5lIFBUVF9NU0dfRlRNX0NNRFNfVFlQRSAgICAgICAgICAgMHg0MDQwCisjZGVmaW5lIEFOSV9EUklWRVJfTVNHX1NUQVJUICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEFOSV9NU0dfQVBQX1JFR19SRVEgICAgICAgICAoQU5JX0RSSVZFUl9NU0dfU1RBUlQgKyAwKQorI2RlZmluZSBBTklfTVNHX0FQUF9SRUdfUlNQICAgICAgICAgKEFOSV9EUklWRVJfTVNHX1NUQVJUICsgMSkKKyNkZWZpbmUgQU5JX01TR19PRU1fREFUQV9SRVEgICAgICAgIChBTklfRFJJVkVSX01TR19TVEFSVCArIDIpCisjZGVmaW5lIEFOSV9NU0dfT0VNX0RBVEFfUlNQICAgICAgICAoQU5JX0RSSVZFUl9NU0dfU1RBUlQgKyAzKQorI2RlZmluZSBBTklfTVNHX0NIQU5ORUxfSU5GT19SRVEgICAgKEFOSV9EUklWRVJfTVNHX1NUQVJUICsgNCkKKyNkZWZpbmUgQU5JX01TR19DSEFOTkVMX0lORk9fUlNQICAgIChBTklfRFJJVkVSX01TR19TVEFSVCArIDUpCisjZGVmaW5lIEFOSV9NU0dfT0VNX0VSUk9SICAgICAgICAgICAoQU5JX0RSSVZFUl9NU0dfU1RBUlQgKyA2KQorI2RlZmluZSBBTklfTVNHX1BFRVJfU1RBVFVTX0lORCAgICAgKEFOSV9EUklWRVJfTVNHX1NUQVJUICsgNykKKworI2RlZmluZSBBTklfTUFYX1JBRElPUyAgICAgIDMKKyNkZWZpbmUgQU5JX05MX01TR19PSyAgICAgICAwCisjZGVmaW5lIEFOSV9OTF9NU0dfRVJST1IgICAgLTEKKyNkZWZpbmUgQU5JX05MX01TR19PVkVSSEVBRCAoTkxNU0dfU1BBQ0UodEFuaUhkciArIDQpKQorLyoKKyAqIFBhY2tldCBGb3JtYXQgZm9yIFJFQURfUkVHSVNURVIgJiBXUklURV9SRUdJU1RFUjoKKyAqIFRvdGFsTXNnTGVuIDogNCBieXRlcyAgW3ZhbHVlPTIwIGJ5dGVzXQorICogUmFkaW8gICAgICAgOiA0IGJ5dGVzCisgKiBNc2dJZCAgICAgICA6IDIgYnl0ZXMKKyAqIE1zZ0xlbiAgICAgIDogMiBieXRlcworICogU3RhdHVzICAgICAgOiA0IGJ5dGVzCisgKiBBZGRyZXNzICAgICA6IDQgYnl0ZXMKKyAqIFBheWxvYWQgICAgIDogNCBieXRlcworICovCisvKgorICogUGFja2V0IEZvcm1hdCBmb3IgUkVBRF9NRU1PUlkgJiBXUklURV9NRU1PUlkgOgorICogVG90YWxNc2dMZW4gOiA0IGJ5dGVzIFt2YWx1ZT0gMjArTEVOX1BBWUxPQUQgYnl0ZXNdCisgKiBSYWRpbyAgICAgICA6IDQgYnl0ZXMKKyAqIE1zZ0lkICAgICAgIDogMiBieXRlcworICogTXNnTGVuICAgICAgOiAyIGJ5dGVzCisgKiBTdGF0dXMgICAgICA6IDQgYnl0ZXMKKyAqIEFkZHJlc3MgICAgIDogNCBieXRlcworICogTGVuZ3RoICAgICAgOiA0IGJ5dGVzIFtMRU5fUEFZTE9BRF0KKyAqIFBheWxvYWQgICAgIDogTEVOX1BBWUxPQUQgYnl0ZXMKKyAqLworaW50IHB0dF9zb2NrX2FjdGl2YXRlX3N2Yyh2b2lkKTsKK3ZvaWQgcHR0X3NvY2tfZGVhY3RpdmF0ZV9zdmModm9pZCk7CitpbnQgcHR0X3NvY2tfc2VuZF9tc2dfdG9fYXBwKHRBbmlIZHIgKndtc2csIGludCByYWRpbywgaW50IHNyY19tb2QsIGludCBwaWQpOworCisvKgorICogRm9ybWF0IG9mIG1lc3NhZ2UgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIFBUVCBTb2NrZXQgQXBwIGluIHVzZXJzcGFjZSBhbmQgdGhlCisgKiBXTEFOIERyaXZlciwgaW4gZWl0aGVyIGRpcmVjdGlvbi4gRWFjaCBtc2cgd2lsbCBiZWdpbiB3aXRoIHRoaXMgaGVhZGVyIGFuZAorICogd2lsbCBmb2xsb3dlZCBieSB0aGUgUXVhcmt5IG1lc3NhZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0FuaU5sTXNnIHsKKwlzdHJ1Y3Qgbmxtc2doZHIgbmxoOyAgICAvKiBOZXRsaW5rIEhlYWRlciAqLworCWludCByYWRpbzsgICAgICAgICAgICAgIC8qIHVuaXQgbnVtYmVyIG9mIHRoZSByYWRpbyAqLworCXRBbmlIZHIgd21zZzsgICAgICAgICAgIC8qIEFpcmdvIE1lc3NhZ2UgSGVhZGVyICovCit9IHRBbmlObEhkcjsKK3R5cGVkZWYgc3RydWN0IHNBbmlBcHBSZWdSZXEgeworCXRBbmlObE1vZFR5cGVzIHR5cGU7ICAgIC8qIG1vZHVsZSBpZCAqLworCWludCBwaWQ7ICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgaWQgKi8KK30gdEFuaU5sQXBwUmVnUmVxOwordHlwZWRlZiBzdHJ1Y3Qgc0FuaU5sQXBwUmVnUnNwIHsKKwl0QW5pSGRyIHduaUhkcjsgICAgICAgICAvKiBHZW5lcmljIFdOSSBtc2cgaGVhZGVyICovCisJdEFuaU5sQXBwUmVnUmVxIHJlZ1JlcTsgLyogVGhlIG9yaWdpbmFsIHJlcXVlc3QgbXNnICovCisJaW50IHJldDsgICAgICAgICAgICAgICAgLyogUmV0dXJuIGNvZGUgKi8KK30gdEFuaU5sQXBwUmVnUnNwOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3V0aWxzL3B0dC9zcmMvd2xhbl9wdHRfc29ja19zdmMuYyBiL2NvcmUvdXRpbHMvcHR0L3NyYy93bGFuX3B0dF9zb2NrX3N2Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YTljMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3V0aWxzL3B0dC9zcmMvd2xhbl9wdHRfc29ja19zdmMuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB3bGFuX3B0dF9zb2NrX3N2Yy5jCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgUFRUX1NPQ0tfU1ZDX0VOQUJMRQorI2luY2x1ZGUgPHdsYW5fbmxpbmtfc3J2Lmg+CisjaW5jbHVkZSA8Y2RmX3R5cGVzLmg+CisjaW5jbHVkZSA8Y2RmX3N0YXR1cy5oPgorI2luY2x1ZGUgPGNkZl90cmFjZS5oPgorI2luY2x1ZGUgPHdsYW5fbmxpbmtfY29tbW9uLmg+CisjaW5jbHVkZSA8d2xhbl9wdHRfc29ja19zdmMuaD4KKyNpbmNsdWRlIDxjZGZfdHlwZXMuaD4KKyNpbmNsdWRlIDxjZGZfdHJhY2UuaD4KKworI2RlZmluZSBQVFRfU09DS19ERUJVRworI2lmZGVmIFBUVF9TT0NLX0RFQlVHCisjZGVmaW5lIFBUVF9UUkFDRShsZXZlbCwgYXJncyAuLi4pIENERl9UUkFDRShDREZfTU9EVUxFX0lEX0NERiwgbGV2ZWwsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBQVFRfVFJBQ0UobGV2ZWwsIGFyZ3MgLi4uKQorI2VuZGlmCisKKy8qKiBwdHQgUHJvY2VzcyBJRCAqLworc3RhdGljIGludDMyX3QgcHR0X3BpZCA9IElOVkFMSURfUElEOworCisjaWZkZWYgUFRUX1NPQ0tfREVCVUdfVkVSQk9TRQorLyogVXRpbGl0eSBmdW5jdGlvbiB0byBwZXJmb3JtIGEgaGV4IGR1bXAgKi8KK3N0YXRpYyB2b2lkIHB0dF9zb2NrX2R1bXBfYnVmKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBidWYsIGludCBjbnQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWlmICgoaSAlIDE2KSA9PSAwKQorCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCQkgICJcbiVwOiIsIHBidWYpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9DREYsIENERl9UUkFDRV9MRVZFTF9JTkZPLCAiICUwMlgiLAorCQkJICAqcGJ1Zik7CisJCXBidWYrKzsKKwl9CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfQ0RGLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIlxuIik7Cit9CisjZW5kaWYKKworLyoqCisgKiBwdHRfc29ja19zZW5kX21zZ190b19hcHAoKSAtIFNlbmQgbmwgbWVzc2FnZSB0byB1c2VyIHNwYWNlCisgKiB3bXNnOiBNZXNzYWdlIGhlYWRlcgorICogcmFkaW86IFVuaXQgbnVtYmVyIG9mIHRoZSByYWRpbworICogc3JjX21vZDogTWVzc2FnZSB0eXBlCisgKiBwaWQ6IFByb2Nlc3MgSUQgdG8gd2hpY2ggbWVzc2FnZSB3aWxsIGJlIHVuaWNhc3QuIE1lc3NhZ2UKKyAqIHdpbGwgYmUgYnJvYWRjYXN0IHdoZW4gUElEIGlzIElOVkFMSURfUElECisgKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byBzZW5kIGEgbmV0bGluayBtZXNzYWdlIHRvIGFuIGFwcGxpY2F0aW9uIGluIHVzZXIgc3BhY2UKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZQorICovCitpbnQgcHR0X3NvY2tfc2VuZF9tc2dfdG9fYXBwKHRBbmlIZHIgKndtc2csIGludCByYWRpbywgaW50IHNyY19tb2QsIGludCBwaWQpCit7CisJaW50IGVyciA9IC0xOworCWludCBwYXlsb2FkX2xlbjsKKwlpbnQgdG90X21zZ19sZW47CisJdEFuaU5sSGRyICp3bmw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlpbnQgd21zZ19sZW5ndGggPSBiZTE2X3RvX2NwdSh3bXNnLT5sZW5ndGgpOworCXN0YXRpYyBpbnQgbmxtc2dfc2VxOworCisJaWYgKHJhZGlvIDwgMCB8fCByYWRpbyA+IEFOSV9NQVhfUkFESU9TKSB7CisJCVBUVF9UUkFDRShDREZfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogaW52YWxpZCByYWRpbyBpZCBbJWRdXG4iLAorCQkJICBfX2Z1bmNfXywgcmFkaW8pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGF5bG9hZF9sZW4gPSB3bXNnX2xlbmd0aCArIDQ7ICAvKiA0IGV4dHJhIGJ5dGVzIGZvciB0aGUgcmFkaW8gaWR4ICovCisJdG90X21zZ19sZW4gPSBOTE1TR19TUEFDRShwYXlsb2FkX2xlbik7CisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKHRvdF9tc2dfbGVuKSkgPT0gTlVMTCkgeworCQlQVFRfVFJBQ0UoQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiJXM6IGRldl9hbGxvY19za2IoKSBmYWlsZWQgZm9yIG1zZyBzaXplWyVkXVxuIiwKKwkJCSAgX19mdW5jX18sIHRvdF9tc2dfbGVuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW5saCA9CisJCW5sbXNnX3B1dChza2IsIHBpZCwgbmxtc2dfc2VxKyssIHNyY19tb2QsIHBheWxvYWRfbGVuLAorCQkJICBOTE1fRl9SRVFVRVNUKTsKKwlpZiAoTlVMTCA9PSBubGgpIHsKKwkJUFRUX1RSQUNFKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBubG1zZ19wdXQoKSBmYWlsZWQgZm9yIG1zZyBzaXplWyVkXVxuIiwgX19mdW5jX18sCisJCQkgIHRvdF9tc2dfbGVuKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl3bmwgPSAodEFuaU5sSGRyICopIG5saDsKKwl3bmwtPnJhZGlvID0gcmFkaW87CisJbWVtY3B5KCZ3bmwtPndtc2csIHdtc2csIHdtc2dfbGVuZ3RoKTsKKwlQVFRfVFJBQ0UoQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSAgIiVzOiBTZW5kaW5nIE1zZyBUeXBlIFsweCVYXSB0byBwaWRbJWRdXG4iLCBfX2Z1bmNfXywKKwkJICBiZTE2X3RvX2NwdSh3bXNnLT50eXBlKSwgcGlkKTsKKyNpZmRlZiBQVFRfU09DS19ERUJVR19WRVJCT1NFCisJcHR0X3NvY2tfZHVtcF9idWYoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyNlbmRpZgorCisJaWYgKHBpZCAhPSBJTlZBTElEX1BJRCkKKwkJZXJyID0gbmxfc3J2X3VjYXN0KHNrYiwgcGlkLCBNU0dfRE9OVFdBSVQpOworCWVsc2UKKwkJZXJyID0gbmxfc3J2X2JjYXN0KHNrYik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogUHJvY2VzcyB0cmVnaXN0ZXJhdGlvbiByZXF1ZXN0IGFuZCBzZW5kIHJlZ2lzdHJhdGlvbiByZXNwb25zZSBtZXNzYWdlcworICogdG8gdGhlIFBUVCBTb2NrZXQgQXBwIGluIHVzZXIgc3BhY2UKKyAqLworc3RhdGljIHZvaWQgcHR0X3NvY2tfcHJvY19yZWdfcmVxKHRBbmlIZHIgKndtc2csIGludCByYWRpbykKK3sKKwl0QW5pTmxBcHBSZWdSZXEgKnJlZ19yZXE7CisJdEFuaU5sQXBwUmVnUnNwIHJzcG1zZzsKKwlyZWdfcmVxID0gKHRBbmlObEFwcFJlZ1JlcSAqKSAod21zZyArIDEpOworCW1lbXNldCgoY2hhciAqKSZyc3Btc2csIDAsIHNpemVvZihyc3Btc2cpKTsKKwkvKiBzZW5kIHJlZyByZXNwb25zZSBtZXNzYWdlIHRvIHRoZSBhcHBsaWNhdGlvbiAqLworCXJzcG1zZy5yZXQgPSBBTklfTkxfTVNHX09LOworCXJzcG1zZy5yZWdSZXEudHlwZSA9IHJlZ19yZXEtPnR5cGU7CisJLypTYXZlIHRoZSBwaWQgKi8KKwlwdHRfcGlkID0gcmVnX3JlcS0+cGlkOworCXJzcG1zZy5yZWdSZXEucGlkID0gcmVnX3JlcS0+cGlkOworCXJzcG1zZy53bmlIZHIudHlwZSA9IGNwdV90b19iZTE2KEFOSV9NU0dfQVBQX1JFR19SU1ApOworCXJzcG1zZy53bmlIZHIubGVuZ3RoID0gY3B1X3RvX2JlMTYoc2l6ZW9mKHJzcG1zZykpOworCWlmIChwdHRfc29ja19zZW5kX21zZ190b19hcHAoKHRBbmlIZHIgKikgJnJzcG1zZy53bmlIZHIsIHJhZGlvLAorCQkJCSAgICAgQU5JX05MX01TR19QVU1BQywgcHR0X3BpZCkgPCAwKSB7CisJCVBUVF9UUkFDRShDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICIlczogRXJyb3Igc2VuZGluZyBBTklfTVNHX0FQUF9SRUdfUlNQIHRvIHBpZFslZF1cbiIsCisJCQkgIF9fZnVuY19fLCBwdHRfcGlkKTsKKwl9Cit9CisKKy8qCisgKiBQcm9jZXNzIGFsbCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUgUFRUIFNvY2tldCBBcHAgaW4gdXNlciBzcGFjZQorICovCitzdGF0aWMgdm9pZCBwdHRfcHJvY19wdW1hY19tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgdEFuaUhkciAqd21zZywgaW50IHJhZGlvKQoreworCXUxNiBhbmlfbXNnX3R5cGUgPSBiZTE2X3RvX2NwdSh3bXNnLT50eXBlKTsKKwlzd2l0Y2ggKGFuaV9tc2dfdHlwZSkgeworCWNhc2UgQU5JX01TR19BUFBfUkVHX1JFUToKKwkJUFRUX1RSQUNFKENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJICAiJXM6IFJlY2VpdmVkIEFOSV9NU0dfQVBQX1JFR19SRVEgWzB4JVhdXG4iLCBfX2Z1bmNfXywKKwkJCSAgYW5pX21zZ190eXBlKTsKKwkJcHR0X3NvY2tfcHJvY19yZWdfcmVxKHdtc2csIHJhZGlvKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUFRUX1RSQUNFKENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBSZWNlaXZlZCBVbmtub3duIE1zZyBUeXBlWzB4JVhdXG4iLCBfX2Z1bmNfXywKKwkJCSAgYW5pX21zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogUHJvY2VzcyBhbGwgdGhlIE5ldGxpbmsgbWVzc2FnZXMgZnJvbSBQVFQgU29ja2V0IGFwcCBpbiB1c2VyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgcHR0X3NvY2tfcnhfbmxpbmtfbXNnKHN0cnVjdCBza19idWZmICpza2IpCit7CisJdEFuaU5sSGRyICp3bmw7CisJaW50IHJhZGlvOworCWludCB0eXBlOworCXdubCA9ICh0QW5pTmxIZHIgKikgc2tiLT5kYXRhOworCXJhZGlvID0gd25sLT5yYWRpbzsKKwl0eXBlID0gd25sLT5ubGgubmxtc2dfdHlwZTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFOSV9OTF9NU0dfUFVNQUM6ICAvKiBNZXNzYWdlIGZyb20gdGhlIFBUVCBzb2NrZXQgQVBQICovCisJCVBUVF9UUkFDRShDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJCSAgIiVzOiBSZWNlaXZlZCBBTklfTkxfTVNHX1BVTUFDIE1zZyBbMHglWF1cbiIsCisJCQkgIF9fZnVuY19fLCB0eXBlKTsKKwkJcHR0X3Byb2NfcHVtYWNfbXNnKHNrYiwgJndubC0+d21zZywgcmFkaW8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQVFRfVFJBQ0UoQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IFVua25vd24gTkwgTXNnIFsweCVYXVxuIiwKKwkJCSAgX19mdW5jX18sIHR5cGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHR0X3NvY2tfYWN0aXZhdGVfc3ZjKCkgLSBhY3RpdmF0ZSBQVFQgc2VydmljZQorICoKKyAqIFJldHVybjogMAorICovCitpbnQgcHR0X3NvY2tfYWN0aXZhdGVfc3ZjKHZvaWQpCit7CisJcHR0X3BpZCA9IElOVkFMSURfUElEOworCW5sX3Nydl9yZWdpc3RlcihBTklfTkxfTVNHX1BVTUFDLCBwdHRfc29ja19yeF9ubGlua19tc2cpOworCW5sX3Nydl9yZWdpc3RlcihBTklfTkxfTVNHX1BUVCwgcHR0X3NvY2tfcnhfbmxpbmtfbXNnKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwdHRfc29ja19kZWFjdGl2YXRlX3N2YygpIC0gZGVhY3RpdmF0ZSBQVFQgc2VydmljZQorICoKKyAqIFJldHVybjogVm9pZAorICovCit2b2lkIHB0dF9zb2NrX2RlYWN0aXZhdGVfc3ZjKHZvaWQpCit7CisJcHR0X3BpZCA9IElOVkFMSURfUElEOworfQorCisjZW5kaWYgLyogUFRUX1NPQ0tfU1ZDX0VOQUJMRSAqLwpkaWZmIC0tZ2l0IGEvY29yZS93bWEvaW5jL3dtYS5oIGIvY29yZS93bWEvaW5jL3dtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWM2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dtYS9pbmMvd21hLmgKQEAgLTAsMCArMSwxOTgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFdNQV9ICisjZGVmaW5lIFdNQV9ICisKKyNpbmNsdWRlICJhX3R5cGVzLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAib3NhcGlfbGludXguaCIKKyNpbmNsdWRlICJodGNfcGFja2V0LmgiCisjaW5jbHVkZSAiaV9jZGZfZXZlbnQuaCIKKyNpbmNsdWRlICJ3bWlfc2VydmljZXMuaCIKKyNpbmNsdWRlICJ3bWlfdW5pZmllZC5oIgorI2luY2x1ZGUgIndtaV92ZXJzaW9uLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgImNkZl9zdGF0dXMuaCIKKyNpbmNsdWRlICJjZHNfc2NoZWQuaCIKKyNpbmNsdWRlICJvbF90eHJ4X2FwaS5oIgorI2luY2x1ZGUgInNpcl9tYWNfcHJvdF9kZWYuaCIKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJvbF90eHJ4X3R5cGVzLmgiCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSAidXRpbHNfYXBpLmgiCisjaW5jbHVkZSAibGltX3R5cGVzLmgiCisjaW5jbHVkZSAid21pX3VuaWZpZWRfYXBpLmgiCisKKy8qIFBsYXRmb3JtIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIG1heC4gbm8uIG9mIGZyYWdtZW50cyAqLworI2RlZmluZSBRQ0FfT0xfMTFBQ19UWF9NQVhfRlJBR1MgICAgICAgICAgICAyCisKKy8qIFByaXZhdGUgKi8KKworI2lmbmRlZiBRQ0FfV0lGSV8zXzBfRU1VCisKKyNkZWZpbmUgV01BX1JFQURZX0VWRU5USURfVElNRU9VVCAgICAgICAgICAyMDAwCisjZGVmaW5lIFdNQV9UR1RfU1VTUEVORF9DT01QTEVURV9USU1FT1VUICAgNjAwMAorI2RlZmluZSBXTUFfV0FLRV9MT0NLX1RJTUVPVVQgICAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgV01BX01BWF9SRVNVTUVfUkVUUlkgICAgICAgICAgICAgICAxMDAwCisjZGVmaW5lIFdNQV9SRVNVTUVfVElNRU9VVCAgICAgICAgICAgICAgICAgNjAwMAorI2RlZmluZSBNQVhfTUVNX0NIVU5LUyAgICAgICAgICAgICAgICAgICAgIDMyCisKKyNlbHNlCisKKyNkZWZpbmUgV01BX1JFQURZX0VWRU5USURfVElNRU9VVCAgICAgICAgICAyMDAwMDAKKyNkZWZpbmUgV01BX1RHVF9TVVNQRU5EX0NPTVBMRVRFX1RJTUVPVVQgICAzMDAwMDAKKyNkZWZpbmUgV01BX1dBS0VfTE9DS19USU1FT1VUICAgICAgICAgICAgICAxMDAwCisjZGVmaW5lIFdNQV9NQVhfUkVTVU1FX1JFVFJZICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBXTUFfUkVTVU1FX1RJTUVPVVQgICAgICAgICAgICAgICAgIDMwMDAwMAorI2RlZmluZSBNQVhfTUVNX0NIVU5LUyAgICAgICAgICAgICAgICAgICAgIDMyCisKKyNlbmRpZgorCisjZGVmaW5lIFdNQV9DUkFTSF9JTkpFQ1RfVElNRU9VVCAgICAgICAgICAgNTAwMAorCisvKiBJbiBwcmltYSAxMiBIVyBzdGF0aW9ucyBhcmUgc3VwcG9ydGVkIGluY2x1ZGluZyBCQ0FTVCBTVEEoc3RhSWQgMCkKKyAqIGFuZCBTRUxGIFNUQShzdGFJZCAxKSBzbyB0b3RhbCBBU1NPQyBzdGF0aW9ucyB3aGljaCBjYW4gY29ubmVjdCB0byBQcmltYQorICogU29mdEFQID0gMTIgLSAxKFNlbGYgU1RhKSAtIDEoQmNhc3QgU3RhKSA9IDEwIFN0YXRpb25zLgorICovCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9WU1RBX0ZFQVRVUkUKKyNkZWZpbmUgV01BX01BWF9TVVBQT1JURURfU1RBUyAgICAzOAorI2Vsc2UKKyNkZWZpbmUgV01BX01BWF9TVVBQT1JURURfU1RBUyAgICAxMgorI2VuZGlmCisjZGVmaW5lIFdNQV9NQVhfU1VQUE9SVEVEX0JTUyAgICAgNQorCisjZGVmaW5lIEZSQUdNRU5UX1NJWkUgMzA3MgorCisjZGVmaW5lIFdNQV9JTlZBTElEX1ZERVZfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgTUFYX01FTV9DSFVOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgV01BX01BWF9WREVWX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgV01BX1ZERVZfVEJMX0VOVFJZX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTUFfVkRFVl9UQkxfRU5UUllfREVMICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIDExQS9HIGNoYW5uZWwgYm91bmRhcnkgKi8KKyNkZWZpbmUgV01BXzExQV9DSEFOTkVMX0JFR0lOICAgICAgICAgICAzNAorI2RlZmluZSBXTUFfMTFBX0NIQU5ORUxfRU5EICAgICAgICAgICAgIDE2NQorI2RlZmluZSBXTUFfMTFHX0NIQU5ORUxfQkVHSU4gICAgICAgICAgIDEKKyNkZWZpbmUgV01BXzExR19DSEFOTkVMX0VORCAgICAgICAgICAgICAxNAorCisjZGVmaW5lIFdNQV8xMVBfQ0hBTk5FTF9CRUdJTiAgICAgICAgICAgKDE3MCkKKyNkZWZpbmUgV01BXzExUF9DSEFOTkVMX0VORCAgICAgICAgICAgICAoMTg0KQorCisjZGVmaW5lIFdNQV9MT0dEKGFyZ3MgLi4uKSBcCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfV01BLCBDREZfVFJBQ0VfTEVWRUxfREVCVUcsICMjIGFyZ3MpCisjZGVmaW5lIFdNQV9MT0dJKGFyZ3MgLi4uKSBcCisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfV01BLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywgIyMgYXJncykKKyNkZWZpbmUgV01BX0xPR1coYXJncyAuLi4pIFwKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9XQVJOLCAjIyBhcmdzKQorI2RlZmluZSBXTUFfTE9HRShhcmdzIC4uLikgXAorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1dNQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLCAjIyBhcmdzKQorI2RlZmluZSBXTUFfTE9HUChhcmdzIC4uLikgXAorCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1dNQSwgQ0RGX1RSQUNFX0xFVkVMX0ZBVEFMLCAjIyBhcmdzKQorCisjZGVmaW5lIFdNQV9ERUJVR19BTFdBWVMKKworI2lmZGVmIFdNQV9ERUJVR19BTFdBWVMKKyNkZWZpbmUgV01BX0xPR0EoYXJncyAuLi4pIFwKKwlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9GQVRBTCwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFdNQV9MT0dBKGFyZ3MgLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgICAgIEFMSUdORURfV09SRF9TSVpFICAgICAgIDQKKyNkZWZpbmUgV0xBTl9IQUxfTVNHX1RZUEVfTUFYX0VOVU1fU0laRSAgICAweDdGRkYKKworLyogUHJlZml4IHVzZWQgYnkgc2NhbiByZXEgaWRzIGdlbmVyYXRlZCBvbiB0aGUgaG9zdCAqLworI2RlZmluZSBXTUFfSE9TVF9TQ0FOX1JFUUlEX1BSRUZJWCAgICAgICAweEEwMDAKKy8qIFByZWZpeCB1c2VkIGJ5IHJvYW0gc2NhbiByZXEgaWRzIGdlbmVyYXRlZCBvbiB0aGUgaG9zdCAqLworI2RlZmluZSBXTUFfSE9TVF9ST0FNX1NDQU5fUkVRSURfUFJFRklYICAweEE4MDAKKy8qIFByZWZpeCB1c2VkIGJ5IHNjYW4gcmVxdWVzdG9yIGlkIG9uIGhvc3QgKi8KKyNkZWZpbmUgV01BX0hPU1RfU0NBTl9SRVFVRVNUT1JfSURfUFJFRklYIDB4QTAwMAorCisjZGVmaW5lIFdNQV9IV19ERUZfU0NBTl9NQVhfRFVSQVRJT04gICAgICAzMDAwMCAvKiAzMCBzZWNzICovCisKKy8qIE1heCBvZmZjaGFubmVsIGR1cmF0aW9uICovCisjZGVmaW5lIFdNQV9CVVJTVF9TQ0FOX01BWF9OVU1fT0ZGQ0hBTk5FTFMgICgzKQorI2RlZmluZSBXTUFfU0NBTl9OUFJPQkVTX0RFRkFVTFQgICAgICAgICAgICAoMikKKyNkZWZpbmUgV01BX1NDQU5fSURMRV9USU1FX0RFRkFVTFQgICAgICAgICAgKDI1KQorI2RlZmluZSBXTUFfUDJQX1NDQU5fTUFYX0JVUlNUX0RVUkFUSU9OICAgICAoMTgwKQorI2RlZmluZSBXTUFfQ1RTX0RVUkFUSU9OX01TX01BWCAgICAgICAgICAgICAoMzIpCisjZGVmaW5lIFdNQV9HT19NSU5fQUNUSVZFX1NDQU5fQlVSU1RfRFVSQVRJT04gICAoNDApCisjZGVmaW5lIFdNQV9HT19NQVhfQUNUSVZFX1NDQU5fQlVSU1RfRFVSQVRJT04gICAoMTIwKQorI2RlZmluZSBXTUFfRFdFTExfVElNRV9QQVNTSVZFX0RFRkFVTFQgICAgICAgICAgKDExMCkKKyNkZWZpbmUgV01BX0RXRUxMX1RJTUVfUFJPQkVfVElNRV9NQVBfU0laRSAgICAgICgxMSkKKyNkZWZpbmUgV01BXzNQT1JUX0NPTkNfU0NBTl9NQVhfQlVSU1RfRFVSQVRJT04gICgyNSkKKworI2RlZmluZSBXTUFfU0VDX1RPX1VTRUMgICAgICAgICAgICAgICAgICAgICAoMTAwMDAwMCkKKworI2RlZmluZSBCRUFDT05fVFhfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAoNTEyKQorCisvKiBXTUFfRVRIRVJfVFlQRV9PRkZTRVQgPSBzYSg2KSArIGRhKDYpICovCisjZGVmaW5lIFdNQV9FVEhFUl9UWVBFX09GRlNFVCAoNiArIDYpCisvKiBXTUFfSUNNUF9WNl9IRUFERVJfT0ZGU0VUID0gc2EoNikgKyBkYSg2KSArIGV0aF90eXBlKDIpICsgaWNtcF92Nl9oZHIoNikqLworI2RlZmluZSBXTUFfSUNNUF9WNl9IRUFERVJfT0ZGU0VUICg2ICsgNiArIDIgKyA2KQorLyogV01BX0lDTVBfVjZfVFlQRV9PRkZTRVQgPSBzYSg2KSArIGRhKDYpICsgZXRoX3R5cGUoMikgKyA0MCAqLworI2RlZmluZSBXTUFfSUNNUF9WNl9UWVBFX09GRlNFVCAoNiArIDYgKyAyICsgNDApCisjZGVmaW5lIFdNQV9JQ01QX1Y2X0hFQURFUl9UWVBFICgweDNBKQorI2RlZmluZSBXTUFfSUNNUF9WNl9SQV9UWVBFICgweDg2KQorI2RlZmluZSBXTUFfSUNNUF9WNl9OU19UWVBFICgweDg3KQorI2RlZmluZSBXTUFfSUNNUF9WNl9OQV9UWVBFICgweDg4KQorI2RlZmluZSBXTUFfQkNBU1RfTUFDX0FERFIgKDB4RkYpCisjZGVmaW5lIFdNQV9NQ0FTVF9JUFY0X01BQ19BRERSICgweDAxKQorI2RlZmluZSBXTUFfTUNBU1RfSVBWNl9NQUNfQUREUiAoMHgzMykKKworCisvKiBSb2FtaW5nIGRlZmF1bHQgdmFsdWVzCisgKiBBbGwgdGltZSBhbmQgcGVyaW9kIHZhbHVlcyBhcmUgaW4gbWlsbGlzZWNvbmRzLgorICogQWxsIHJzc2kgdmFsdWVzIGFyZSBpbiBkQiBleGNlcHQgZm9yIFdNQV9OT0lTRV9GTE9PUl9EQk1fREVGQVVMVC4KKyAqLworCisjZGVmaW5lIFdNQV9ST0FNX1NDQU5fQ0hBTk5FTF9TV0lUQ0hfVElNRSAgICAoNCkKKyNkZWZpbmUgV01BX05PSVNFX0ZMT09SX0RCTV9ERUZBVUxUICAgICAgICAgICgtOTYpCisjZGVmaW5lIFdNQV9ST0FNX1JTU0lfRElGRl9ERUZBVUxUICAgICAgICAgICAoNSkKKyNkZWZpbmUgV01BX1JPQU1fRFdFTExfVElNRV9BQ1RJVkVfREVGQVVMVCAgICgxMDApCisjZGVmaW5lIFdNQV9ST0FNX0RXRUxMX1RJTUVfUEFTU0lWRV9ERUZBVUxUICAoMTEwKQorI2RlZmluZSBXTUFfUk9BTV9NSU5fUkVTVF9USU1FX0RFRkFVTFQgICAgICAgKDUwKQorI2RlZmluZSBXTUFfUk9BTV9NQVhfUkVTVF9USU1FX0RFRkFVTFQgICAgICAgKDUwMCkKKyNkZWZpbmUgV01BX1JPQU1fTE9XX1JTU0lfVFJJR0dFUl9ERUZBVUxUICAgICgyMCkKKyNkZWZpbmUgV01BX1JPQU1fTE9XX1JTU0lfVFJJR0dFUl9WRVJZTE9XICAgICgxMCkKKyNkZWZpbmUgV01BX1JPQU1fQkVBQ09OX1dFSUdIVF9ERUZBVUxUICAgICAgICgxNCkKKyNkZWZpbmUgV01BX1JPQU1fT1BQX1NDQU5fUEVSSU9EX0RFRkFVTFQgICAgICgxMjAwMDApCisjZGVmaW5lIFdNQV9ST0FNX09QUF9TQ0FOX0FHSU5HX1BFUklPRF9ERUZBVUxUIChXTUFfUk9BTV9PUFBfU0NBTl9QRVJJT0RfREVGQVVMVCAqIDUpCisjZGVmaW5lIFdNQV9ST0FNX1BSRUFVVEhfU0NBTl9USU1FICAgICAgICAgICAoNTApCisjZGVmaW5lIFdNQV9ST0FNX1BSRUFVVEhfUkVTVF9USU1FICAgICAgICAgICAoMCkKKyNkZWZpbmUgV01BX1JPQU1fUFJFQVVUSF9NQVhfU0NBTl9USU1FICAgICAgICgxMDAwMCkKKyNkZWZpbmUgV01BX1JPQU1fQk1JU1NfRklSU1RfQkNOVF9ERUZBVUxUICAgICgxMCkKKyNkZWZpbmUgV01BX1JPQU1fQk1JU1NfRklOQUxfQkNOVF9ERUZBVUxUICAgICgxMCkKKyNkZWZpbmUgV01BX1JPQU1fQk1JU1NfRklSU1RfQkNOVF9ERUZBVUxUX1AyUCAoMTUpCisjZGVmaW5lIFdNQV9ST0FNX0JNSVNTX0ZJTkFMX0JDTlRfREVGQVVMVF9QMlAgKDQ1KQorCisjZGVmaW5lIFdNQV9JTlZBTElEX0tFWV9JRFggICAgIDB4ZmYKKyNkZWZpbmUgV01BX0RGU19SQURBUl9GT1VORCAgIDEKKworI2RlZmluZSBXTUFfTUFYX1JGX0NIQUlOUyh4KSAgICAoKDEgPDwgeCkgLSAxKQorI2RlZmluZSBXTUFfTUlOX1JGX0NIQUlOUyAgICAgICAgICAgICAgICgxKQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKyNkZWZpbmUgV01BX01BWF9FWFRTQ0FOX01TR19TSVpFICAgICAgICAxNTM2CisjZGVmaW5lIFdNQV9FWFRTQ0FOX1JFU1RfVElNRSAgICAgICAgICAgMTAwCisjZGVmaW5lIFdNQV9FWFRTQ0FOX01BWF9TQ0FOX1RJTUUgICAgICAgNTAwMDAKKyNkZWZpbmUgV01BX0VYVFNDQU5fQlVSU1RfRFVSQVRJT04gICAgICAxNTAKKyNlbmRpZgorCisjZGVmaW5lIFdNQV9CQ05fQlVGX01BWF9TSVpFIDI1MDAKKyNkZWZpbmUgV01BX05PQV9JRV9TSVpFKG51bV9kZXNjKSAoMiArICgxMyAqIChudW1fZGVzYykpKQorI2RlZmluZSBXTUFfTUFYX05PQV9ERVNDUklQVE9SUyA0CisKKyNkZWZpbmUgV01BX1RJTV9TVVBQT1JURURfUFZCX0xFTkdUSCAoKEhBTF9OVU1fU1RBIC8gOCkgKyAxKQorCisjZGVmaW5lIFdNQV9XT1dfUFRSTl9NQVNLX1ZBTElEICAgICAweEZGCisjZGVmaW5lIFdNQV9OVU1fQklUU19JTl9CWVRFICAgICAgICAgICA4CisKKyNkZWZpbmUgV01BX0FQX1dPV19ERUZBVUxUX1BUUk5fTUFYICAgIDQKKyNkZWZpbmUgV01BX1NUQV9XT1dfREVGQVVMVF9QVFJOX01BWCAgIDQKKworI2RlZmluZSBXTUFfQlNTX1NUQVRVU19TVEFSVEVEIDB4MQorI2RlZmluZSBXTUFfQlNTX1NUQVRVU19TVE9QUEVEIDB4MgorCisjZGVmaW5lIFdNQV9GV19QSFlfU1RBVFMgICAgICAgIDB4MQorI2RlZmluZSBXTUFfRldfUlhfUkVPUkRFUl9TVEFUUyAweDIKKyNkZWZpbmUgV01BX0ZXX1JYX1JDX1NUQVRTICAgICAgMHgzCisjZGVmaW5lIFdNQV9GV19UWF9QUERVX1NUQVRTICAgIDB4NAorI2RlZmluZSBXTUFfRldfVFhfQ09OQ0lTRV9TVEFUUyAweDUKKyNkZWZpbmUgV01BX0ZXX1RYX1JDX1NUQVRTICAgICAgMHg2CisjZGVmaW5lIFdNQV9GV19UWEJGX0lORk9fU1RBVFMgIDB4MDcKKyNkZWZpbmUgV01BX0ZXX1NORF9JTkZPX1NUQVRTICAgMHgwOAorI2RlZmluZSBXTUFfRldfRVJST1JfSU5GT19TVEFUUyAweDA5CisjZGVmaW5lIFdNQV9GV19UWF9TRUxGR0VOX0lORk9fU1RBVFMgMHhhCisjZGVmaW5lIFdNQV9GV19SWF9SRU1fUklOR19CVUYgIDB4YworI2RlZmluZSBXTUFfRldfUlhfVFhCRl9NVVNVX05EUEEgMHhmCisKKyNkZWZpbmUgV01BX1RBUkdFVF9SRVFfVFlQRV9WREVWX1NUQVJUIDB4MQorI2RlZmluZSBXTUFfVEFSR0VUX1JFUV9UWVBFX1ZERVZfU1RPUCAgMHgyCisjZGVmaW5lIFdNQV9UQVJHRVRfUkVRX1RZUEVfVkRFVl9ERUwgICAweDMKKworI2RlZmluZSBXTUFfUEVFUl9BU1NPQ19DTkZfU1RBUlQgMHgwMQorI2RlZmluZSBXTUFfUEVFUl9BU1NPQ19USU1FT1VUICgzMDAwKSAvKiAzIHNlY29uZHMgKi8KKworI2RlZmluZSBXTUFfVkRFVl9TVEFSVF9SRVFVRVNUX1RJTUVPVVQgKDMwMDApICAgLyogMyBzZWNvbmRzICovCisjZGVmaW5lIFdNQV9WREVWX1NUT1BfUkVRVUVTVF9USU1FT1VUICAoMzAwMCkgICAvKiAzIHNlY29uZHMgKi8KKworI2RlZmluZSBXTUFfVEdUX0lOVkFMSURfU05SICgtMSkKKworI2RlZmluZSBXTUFfVFhfUV9SRUNIRUNLX1RJTUVSX1dBSVQgICAgICAyICAgICAgLyogMiBtcyAqLworI2RlZmluZSBXTUFfVFhfUV9SRUNIRUNLX1RJTUVSX01BWF9XQUlUICAyMCAgICAgLyogMjAgbXMgKi8KKyNkZWZpbmUgV01BX01BWF9OVU1fQVJHUyA4CisKKyNkZWZpbmUgV01BX1NNUFNfTUFTS19MT1dFUl8xNkJJVFMgMHhGRgorI2RlZmluZSBXTUFfU01QU19NQVNLX1VQUEVSXzNCSVRTIDB4NworI2RlZmluZSBXTUFfU01QU19QQVJBTV9WQUxVRV9TIDI5CisKKyNkZWZpbmUgV01BX01BWF9TQ0FOX0lEICAgICAgICAweDAwRkYKKworLyoKKyAqIFNldHRpbmcgdGhlIFR4IENvbXAgVGltZW91dCB0byAxIHNlY3MuCisgKiBUT0RPOiBOZWVkIHRvIFJldmlzdCB0aGUgVGltaW5nCisgKi8KKyNkZWZpbmUgV01BX1RYX0ZSQU1FX0NPTVBMRVRFX1RJTUVPVVQgIDEwMDAKKyNkZWZpbmUgV01BX1RYX0ZSQU1FX0JVRkZFUl9OT19GUkVFICAgIDAKKyNkZWZpbmUgV01BX1RYX0ZSQU1FX0JVRkZFUl9GUkVFICAgICAgIDEKKworCisvKiBEZWZhdWx0IEluQWN0aXZpdHkgVGltZSBpcyAyMDAgbXMgKi8KKyNkZWZpbmUgUE9XRVJTQVZFX0RFRkFVTFRfSU5BQ1RJVklUWV9USU1FIDIwMAorCisvKiBEZWZhdWx0IExpc3RlbiBJbnRlcnZhbCAqLworI2RlZmluZSBQT1dFUlNBVkVfREVGQVVMVF9MSVNURU5fSU5URVJWQUwgMQorCisvKgorICogVE9ETzogQWRkIFdNSV9DTURfSURfTUFYIGFzIHBhcnQgb2YgV01JX0NNRF9JRAorICogaW5zdGVhZCBvZiBhc3NpZ25pbmcgaXQgdG8gdGhlIGxhc3QgdmFsaWQgd21pCisgKiBjbWQrMSB0byBhdm9pZCB1cGRhdGluZyB0aGlzIHdoZW4gYSBjb21tYW5kIGlzCisgKiBhZGRlZC9kZWxldGVkLgorICovCisjZGVmaW5lIFdNSV9DTURJRF9NQVggKFdNSV9UWEJGX0NNRElEICsgMSkKKworI2RlZmluZSBXTUFfTkxPX0ZSRVFfVEhSRVNIICAgICAgICAgIDEwMDAgICAgICAgLyogaW4gTUh6ICovCisjZGVmaW5lIFdNQV9TRUNfVE9fTVNFQyhzZWMpICAgICAgICAgKHNlYyAqIDEwMDApICAgICAgIC8qIHNlYyB0byBtc2VjICovCisjZGVmaW5lIFdNQV9NU0VDX1RPX1VTRUMobXNlYykJICAgICAobXNlYyAqIDEwMDApIC8qIG1zZWMgdG8gdXNlYyAqLworCisvKiBEZWZhdWx0IHJzc2kgdGhyZXNob2xkIGRlZmluZWQgaW4gQ0ZHODAyMTEgKi8KKyNkZWZpbmUgV01BX1JTU0lfVEhPTERfREVGQVVMVCAgIC0zMDAKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworI2RlZmluZSBXTUFfUE5PX01BVENIX1dBS0VfTE9DS19USU1FT1VUICAgICAgICAgKDUgKiAxMDAwKSAgICAgLyogaW4gbXNlYyAqLworI2RlZmluZSBXTUFfUE5PX1NDQU5fQ09NUExFVEVfV0FLRV9MT0NLX1RJTUVPVVQgKDIgKiAxMDAwKSAgICAgLyogaW4gbXNlYyAqLworI2VuZGlmCisjZGVmaW5lIFdNQV9BVVRIX1JFUV9SRUNWX1dBS0VfTE9DS19USU1FT1VUICAgICAoNSAqIDEwMDApICAgICAvKiBpbiBtc2VjICovCisjZGVmaW5lIFdNQV9BU1NPQ19SRVFfUkVDVl9XQUtFX0xPQ0tfRFVSQVRJT04gICAoNSAqIDEwMDApICAgICAvKiBpbiBtc2VjICovCisjZGVmaW5lIFdNQV9ERUFVVEhfUkVDVl9XQUtFX0xPQ0tfRFVSQVRJT04gICAgICAoNSAqIDEwMDApICAgICAvKiBpbiBtc2VjICovCisjZGVmaW5lIFdNQV9ESVNBU1NPQ19SRUNWX1dBS0VfTE9DS19EVVJBVElPTiAgICAoNSAqIDEwMDApICAgICAvKiBpbiBtc2VjICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKyNkZWZpbmUgV01BX0FVVE9fU0hVVERPV05fV0FLRV9MT0NLX0RVUkFUSU9OICAgICg1ICogMTAwMCkgICAgIC8qIGluIG1zZWMgKi8KKyNlbmRpZgorI2RlZmluZSBXTUFfQk1JU1NfRVZFTlRfV0FLRV9MT0NLX0RVUkFUSU9OICAgICAgKDQgKiAxMDAwKSAgICAgLyogaW4gbXNlYyAqLworCisjZGVmaW5lIFdNQV9UWE1JQ19MRU4gOAorI2RlZmluZSBXTUFfUlhNSUNfTEVOIDgKKworLyoKKyAqIExlbmd0aCA9ICgyIG9jdGV0cyBmb3IgSW5kZXggYW5kIENUV2luL09wcCBQUykgYW5kCisgKiAoMTMgb2N0ZXRzIGZvciBlYWNoIE5PQSBEZXNjcmlwdG9ycykKKyAqLworCisjZGVmaW5lIFdNQV9QMlBfTk9BX0lFX09QUF9QU19TRVQgKDB4ODApCisjZGVmaW5lIFdNQV9QMlBfTk9BX0lFX0NUV0lOX01BU0sgKDB4N0YpCisKKyNkZWZpbmUgV01BX1AyUF9JRV9JRCAweGRkCisjZGVmaW5lIFdNQV9QMlBfV0ZBX09VSSB7IDB4NTAsIDB4NmYsIDB4OWEgfQorI2RlZmluZSBXTUFfUDJQX1dGQV9WRVIgMHgwOSAgICAvKiB2ZXIgMS4wICovCisjZGVmaW5lIFdNQV9XU0NfT1VJIHsgMHgwMCwgMHg1MCwgMHhGMiB9IC8qIE1pY3Jvc29mdCBXU0MgT1VJIGJ5dGUgKi8KKworLyogUDJQIFN1YiBlbGVtZW50IGRlZmludGlvbnMgKGFjY29yZGluZyB0byB0YWJsZSA1IG9mIFdpZmkncyBQMlAgc3BlYykgKi8KKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9NSU5PUl9SRUFTT04gICAgICAgICAgICAgIDEKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9DQVBBQklMSVRZICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9ERVZJQ0VfSUQgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9HT19JTlRFTlQgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9DT05GSUdVUkFUSU9OX1RJTUVPVVQgICAgIDUKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9MSVNURU5fQ0hBTk5FTCAgICAgICAgICAgIDYKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9HUk9VUF9CU1NJRCAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9FWFRFTkRFRF9MSVNURU5fVElNSU5HICAgIDgKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9JTlRFTkRFRF9JTlRFUkZBQ0VfQUREUiAgIDkKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9NQU5BR0VBQklMSVRZICAgICAgICAgICAgIDEwCisjZGVmaW5lIFdNQV9QMlBfU1VCX0VMRU1FTlRfQ0hBTk5FTF9MSVNUICAgICAgICAgICAgICAxMQorI2RlZmluZSBXTUFfUDJQX1NVQl9FTEVNRU5UX05PQSAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9ERVZJQ0VfSU5GTyAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFdNQV9QMlBfU1VCX0VMRU1FTlRfR1JPVVBfSU5GTyAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXTUFfUDJQX1NVQl9FTEVNRU5UX0dST1VQX0lEICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9JTlRFUkZBQ0UgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFdNQV9QMlBfU1VCX0VMRU1FTlRfT1BfQ0hBTk5FTCAgICAgICAgICAgICAgICAxNworI2RlZmluZSBXTUFfUDJQX1NVQl9FTEVNRU5UX0lOVklUQVRJT05fRkxBR1MgICAgICAgICAgMTgKKyNkZWZpbmUgV01BX1AyUF9TVUJfRUxFTUVOVF9WRU5ET1IgICAgICAgICAgICAgICAgICAgIDIyMQorCisvKiBNYWNyb3MgZm9yIGhhbmRsaW5nIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMgKi8KKyNkZWZpbmUgUDJQSUVfUFVUX0xFMTYoYSwgdmFsKQkJXAorCWRvIHsJCQlcCisJCShhKVsxXSA9ICgodTE2KSAodmFsKSkgPj4gODsJXAorCQkoYSlbMF0gPSAoKHUxNikgKHZhbCkpICYgMHhmZjsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUDJQSUVfUFVUX0xFMzIoYSwgdmFsKQkJCVwKKwlkbyB7CQkJCVwKKwkJKGEpWzNdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gMjQpICYgMHhmZik7CVwKKwkJKGEpWzJdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gMTYpICYgMHhmZik7CVwKKwkJKGEpWzFdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gOCkgJiAweGZmKTsJXAorCQkoYSlbMF0gPSAodTgpICgoKHUzMikgKHZhbCkpICYgMHhmZik7CSAgICBcCisJfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIFdNQV9ERUZBVUxUX01BWF9QU1BPTExfQkVGT1JFX1dBS0UgMQorCisjZGVmaW5lIFdNQV9ERUZBVUxUX1FQT1dFUl9NQVhfUFNQT0xMX0JFRk9SRV9XQUtFIDEKKyNkZWZpbmUgV01BX0RFRkFVTFRfUVBPV0VSX1RYX1dBS0VfVEhSRVNIT0xEIDIKKyNkZWZpbmUgV01BX0RFRkFVTFRfU0lGU19CVVJTVF9EVVJBVElPTiAgICAgIDgxNjAKKworI2RlZmluZSBXTUFfVkhUX1BQU19QQUlEX01BVENIIDEKKyNkZWZpbmUgV01BX1ZIVF9QUFNfR0lEX01BVENIIDIKKyNkZWZpbmUgV01BX1ZIVF9QUFNfREVMSU1fQ1JDX0ZBSUwgMworCisjZGVmaW5lIFdNQV9ERlNfTUFYXzIwTV9TVUJfQ0ggOAorCisjZGVmaW5lIFdNQV9ERUZBVUxUX0hXX01PREVfSU5ERVggMHhGRkZGCisKKy8qKgorICogc3RydWN0IHByb2JlVGltZV9kd2VsbFRpbWUgLSBwcm9iZSB0aW1lLCBkd2VsbCB0aW1lIG1hcAorICogQGR3ZWxsX3RpbWU6IGR3ZWxsIHRpbWUKKyAqIEBwcm9iZV90aW1lOiByZXBlYXQgcHJvYmUgdGltZQorICovCit0eXBlZGVmIHN0cnVjdCBwcm9iZVRpbWVfZHdlbGxUaW1lIHsKKwl1aW50OF90IGR3ZWxsX3RpbWU7CisJdWludDhfdCBwcm9iZV90aW1lOworfSB0X3Byb2JlVGltZV9kd2VsbFRpbWU7CisKK3N0YXRpYyBjb25zdCB0X3Byb2JlVGltZV9kd2VsbFRpbWUKKwlwcm9iZV90aW1lX2R3ZWxsX3RpbWVfbWFwW1dNQV9EV0VMTF9USU1FX1BST0JFX1RJTUVfTUFQX1NJWkVdID0geworCXsyOCwgMH0sICAgICAgICAgICAgICAgIC8qIDAgU1NJRCAqLworCXsyOCwgMjB9LCAgICAgICAgICAgICAgIC8qIDEgU1NJRCAqLworCXsyOCwgMjB9LCAgICAgICAgICAgICAgIC8qIDIgU1NJRCAqLworCXsyOCwgMjB9LCAgICAgICAgICAgICAgIC8qIDMgU1NJRCAqLworCXsyOCwgMjB9LCAgICAgICAgICAgICAgIC8qIDQgU1NJRCAqLworCXsyOCwgMjB9LCAgICAgICAgICAgICAgIC8qIDUgU1NJRCAqLworCXsyOCwgMjB9LCAgICAgICAgICAgICAgIC8qIDYgU1NJRCAqLworCXsyOCwgMTF9LCAgICAgICAgICAgICAgIC8qIDcgU1NJRCAqLworCXsyOCwgMTF9LCAgICAgICAgICAgICAgIC8qIDggU1NJRCAqLworCXsyOCwgMTF9LCAgICAgICAgICAgICAgIC8qIDkgU1NJRCAqLworCXsyOCwgOH0gICAgICAgICAgICAgICAgIC8qIDEwIFNTSUQgKi8KK307CisKKy8qKgorICogZW51bSB0X3dtYV9kcnZfdHlwZSAtIHdtYSBkcml2ZXIgdHlwZQorICogQFdNQV9EUklWRVJfVFlQRV9QUk9EVUNUSU9OOiBwcm9kdWN0aW9uIGRyaXZlciB0eXBlCisgKiBAV01BX0RSSVZFUl9UWVBFX01GRzogbWFudWZhY3R1cmUgZHJpdmVyIHR5cGUKKyAqIEBXTUFfRFJJVkVSX1RZUEVfSU5WQUxJRDogaW52YWxpZCBkcml2ZXIgdHlwZQorICovCit0eXBlZGVmIGVudW0geworCVdNQV9EUklWRVJfVFlQRV9QUk9EVUNUSU9OID0gMCwKKwlXTUFfRFJJVkVSX1RZUEVfTUZHID0gMSwKKwlXTUFfRFJJVkVSX1RZUEVfSU5WQUxJRCA9IDB4N0ZGRkZGRkYKK30gdF93bWFfZHJ2X3R5cGU7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworLyoqCisgKiBlbnVtIHRfd21hX3RkbHNfbW9kZTogVERMUyBtb2RlCisgKiBAV01BX1RETFNfU1VQUE9SVF9OT1RfRU5BQkxFRDogdGRscyBpcyBkaXNhYmxlCisgKiBAV01BX1RETFNfU1VQUE9SVF9ESVNBQkxFRDogc3VwcHJlc3MgaW1wbGljaXQgdHJpZ2dlciBhbmQgbm90IHJlc3BvbmQgdG8gcGVlcgorICogQFdNQV9URExTX1NVUFBPUlRfRVhQTElDSVRfVFJJR0dFUl9PTkxZOiBzdXBwcmVzcyBpbXBsaWNpdCB0cmlnZ2VyLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgcmVzcG9uZCB0byB0aGUgcGVlcgorICogQFdNQV9URExTX1NVUFBPUlRfRU5BQkxFRDogaW1wbGljaXQgdHJpZ2dlcgorICovCit0eXBlZGVmIGVudW0geworCVdNQV9URExTX1NVUFBPUlRfTk9UX0VOQUJMRUQgPSAwLAorCVdNQV9URExTX1NVUFBPUlRfRElTQUJMRUQsCisJV01BX1RETFNfU1VQUE9SVF9FWFBMSUNJVF9UUklHR0VSX09OTFksCisJV01BX1RETFNfU1VQUE9SVF9FTkFCTEVELAorfSB0X3dtYV90ZGxzX21vZGU7CisKKy8qKgorICogZW51bSB3bWFfdGRsc19wZWVyX25vdGlmaWNhdGlvbiAtIFRETFMgZXZlbnRzCisgKiBAV01BX1RETFNfU0hPVUxEX0RJU0NPVkVSOiB0ZGxzIGRpc2NvdmVyeSByZWNvbW1lbmRlZCBmb3IgcGVlciAoYWx3YXlzIGJhc2VkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0eCBieXRlcyBwZXIgc2Vjb25kID4gdHhfZGlzY292ZXIgdGhyZXNob2xkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQjogbm90aWZpY2F0aW9uIHdpbGwgYmUgcmUtc2VudCBhZnRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXJ5X3JlcXVlc3RfaW50ZXJ2YWxfbXMKKyAqIEBXTUFfVERMU19TSE9VTERfVEVBUkRPV046IHRkbHMgbGluayB0ZWFyIGRvd24gcmVjb21tZW5kZWQgZm9yIHBlZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byB0eCBieXRlcyBwZXIgc2Vjb25kIGJlbG93CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eF90ZWFyZG93bl90aHJlc2hvbGQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5COiB0aGlzIG5vdGlmaWNhdGlvbiBzZW50IG9uY2UKKyAqIEBXTUFfVERMU19QRUVSX0RJU0NPTk5FQ1RFRDogdHggcGVlciBURExTIGxpbmsgdGVhciBkb3duIGNvbXBsZXRlCisgKi8KK2VudW0gd21hX3RkbHNfcGVlcl9ub3RpZmljYXRpb24geworCVdNQV9URExTX1NIT1VMRF9ESVNDT1ZFUiwKKwlXTUFfVERMU19TSE9VTERfVEVBUkRPV04sCisJV01BX1RETFNfUEVFUl9ESVNDT05ORUNURUQsCit9OworCisvKioKKyAqIGVudW0gd21hX3RkbHNfcGVlcl9yZWFzb24gLSBURExTIHBlZXIgcmVhc29uCisgKiBAV01BX1RETFNfVEVBUkRPV05fUkVBU09OX1RYOiB0ZGxzIHRlYXJkb3duIHJlY29tbWVuZGVkIGR1ZSB0byBsb3cgdHJhbnNtaXRzCisgKiBAV01BX1RETFNfVEVBUkRPV05fUkVBU09OX1JBVEU6IHRkbHMgdGVhciBkb3duIHJlY29tbWVuZGVkIGR1ZSB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQgcmF0ZXMgPCBBUCByYXRlcworICogQFdNQV9URExTX1RFQVJET1dOX1JFQVNPTl9SU1NJOiB0ZGxzIGxpbmsgdGVhciBkb3duIHJlY29tbWVuZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byBwb29yIFJTU0kKKyAqIEBXTUFfVERMU19URUFSRE9XTl9SRUFTT05fU0NBTjogdGRscyBsaW5rIHRlYXIgZG93biByZWNvbW1lbmRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdWUgdG8gb2ZmY2hhbm5lbCBzY2FuCisgKiBAV01BX1RETFNfRElTQ09OTkVDVEVEX1JFQVNPTl9QRUVSX0RFTEVURTogdGRscyBwZWVyIGRpc2Nvbm5lY3RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byBwZWVyIGRlbGV0aW9uCisgKi8KK2VudW0gd21hX3RkbHNfcGVlcl9yZWFzb24geworCVdNQV9URExTX1RFQVJET1dOX1JFQVNPTl9UWCwKKwlXTUFfVERMU19URUFSRE9XTl9SRUFTT05fUkFURSwKKwlXTUFfVERMU19URUFSRE9XTl9SRUFTT05fUlNTSSwKKwlXTUFfVERMU19URUFSRE9XTl9SRUFTT05fU0NBTiwKKwlXTUFfVERMU19ESVNDT05ORUNURURfUkVBU09OX1BFRVJfREVMRVRFLAorfTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fVERMUyAqLworCisKKy8qKgorICogZW51bSB0X3dtYV9yb2FtX3ByZWF1dGhfY2hhbl9zdGF0ZV90IC0gUm9hbWluZyBwcmVhdXRoIGNoYW5uZWwgc3RhdGUKKyAqIEBXTUFfUk9BTV9QUkVBVVRIX0NIQU5fTk9ORTogbm8gcHJlYXV0aCBpbiBwcm9ncmVzcworICogQFdNQV9ST0FNX1BSRUFVVEhfQ0hBTl9SRVFVRVNURUQ6IHByZWFkdXRoIGNoYW5uZWwgcmVxdWVzdGVkCisgKiBAV01BX1JPQU1fUFJFQVVUSF9PTl9DSEFOOiBwcmVhdXRoIG9uIGNoYW5uZWwKKyAqIEBXTUFfUk9BTV9QUkVBVVRIX0NIQU5fQ0FOQ0VMX1JFUVVFU1RFRDogcHJlYXV0aCBjaGFubmVsIGNhbmNlbCByZXF1ZXN0ZWQKKyAqIEBXTUFfUk9BTV9QUkVBVVRIX0NIQU5fQ09NUExFVEVEOiBwcmVhdXRoIGNvbXBsZXRlZAorICovCit0eXBlZGVmIGVudW0geworCVdNQV9ST0FNX1BSRUFVVEhfQ0hBTl9OT05FLAorCVdNQV9ST0FNX1BSRUFVVEhfQ0hBTl9SRVFVRVNURUQsCisJV01BX1JPQU1fUFJFQVVUSF9PTl9DSEFOLAorCVdNQV9ST0FNX1BSRUFVVEhfQ0hBTl9DQU5DRUxfUkVRVUVTVEVELAorCVdNQV9ST0FNX1BSRUFVVEhfQ0hBTl9DT01QTEVURUQKK30gdF93bWFfcm9hbV9wcmVhdXRoX2NoYW5fc3RhdGVfdDsKKworLyoqCisgKiBzdHJ1Y3Qgd21hX21lbV9jaHVuayAtIG1lbW9yeSBjaHVua3MKKyAqIEB2YWRkcjogdmlydHVhbCBhZGRyZXNzCisgKiBAcGFkZHI6IHBoeXNpY2FsIGFkZHJlc3MKKyAqIEBtZW1jdHg6IGRtYSBtYXBwZWQgbWVtb3J5CisgKiBAbGVuOiBsZW5ndGggb2YgZGF0YQorICogQHJlcV9pZDogcmVxdWVzdCBpZAorICoKKyAqIG1lbW9yeSBjaHVuY2sgYWxsb2NhdGVkIGJ5IEhvc3QgdG8gYmUgbWFuYWdlZCBieSBGVworICogdXNlZCBvbmx5IGZvciBsb3cgbGF0ZW5jeSBpbnRlcmZhY2VzIGxpa2UgcGNpZQorICovCitzdHJ1Y3Qgd21hX21lbV9jaHVuayB7CisJdWludDMyX3QgKnZhZGRyOworCXVpbnQzMl90IHBhZGRyOworCWNkZl9kbWFfbWVtX2NvbnRleHQobWVtY3R4KTsKKwl1aW50MzJfdCBsZW47CisJdWludDMyX3QgcmVxX2lkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgcDJwX3NjYW5fcGFyYW0gLSBwMnAgc2NhbiBsaXN0ZW4gcGFyYW1ldGVycworICogQHNjYW5faWQ6IHNjYW4gaWQKKyAqIEBwMnBfc2Nhbl90eXBlOiBwMnAgc2NhbiB0eXBlCisgKi8KK3N0cnVjdCBwMnBfc2Nhbl9wYXJhbSB7CisJdWludDMyX3Qgc2Nhbl9pZDsKKwl0U2lyUDJwU2NhblR5cGUgcDJwX3NjYW5fdHlwZTsKK307CisKKy8qKgorICogc3RydWN0IHNjYW5fcGFyYW0gLSBzY2FuIHBhcmFtZXRlcnMKKyAqIEBzY2FuX2lkOiBzY2FuIGlkCisgKiBAc2Nhbl9yZXF1ZXN0b3JfaWQ6IHNjYW4gcmVxdWVzdG9yIGlkCisgKiBAcDJwX3NjYW5fdHlwZTogcDJwIHNjYW4gdHlwZQorICovCitzdHJ1Y3Qgc2Nhbl9wYXJhbSB7CisJdWludDMyX3Qgc2Nhbl9pZDsKKwl1aW50MzJfdCBzY2FuX3JlcXVlc3Rvcl9pZDsKKwl0U2lyUDJwU2NhblR5cGUgcDJwX3NjYW5fdHlwZTsKK307CisKKy8qKgorICogc3RydWN0IGJlYWNvbl9pbmZvIC0gc3RydWN0dXJlIHRvIHN0b3JlIGJlYWNvbiB0ZW1wbGF0ZQorICogQGJ1Zjogc2tiIHB0cgorICogQGxlbjogbGVuZ3RoCisgKiBAZG1hX21hcHBlZDogaXMgaXQgZG1hIG1hcHBlZCBvciBub3QKKyAqIEB0aW1faWVfb2Zmc2V0OiBUSU0gSUUgb2Zmc2V0CisgKiBAZHRpbV9jb3VudDogRFRJTSBjb3VudAorICogQHNlcV9ubzogc2VxdWVuY2Ugbm8KKyAqIEBub2Ffc3ViX2llOiBOT0Egc3ViIElFCisgKiBAbm9hX3N1Yl9pZV9sZW46IE5PQSBzdWIgSUUgbGVuZ3RoCisgKiBAbm9hX2llOiBOT0EgSUUKKyAqIEBwMnBfaWVfb2Zmc2V0OiBwMnAgSUUgb2Zmc2V0CisgKiBAbG9jazogbG9jaworICovCitzdHJ1Y3QgYmVhY29uX2luZm8geworCWNkZl9uYnVmX3QgYnVmOworCXVpbnQzMl90IGxlbjsKKwl1aW50OF90IGRtYV9tYXBwZWQ7CisJdWludDMyX3QgdGltX2llX29mZnNldDsKKwl1aW50OF90IGR0aW1fY291bnQ7CisJdWludDE2X3Qgc2VxX25vOworCXVpbnQ4X3Qgbm9hX3N1Yl9pZVsyICsgV01BX05PQV9JRV9TSVpFKFdNQV9NQVhfTk9BX0RFU0NSSVBUT1JTKV07CisJdWludDE2X3Qgbm9hX3N1Yl9pZV9sZW47CisJdWludDhfdCAqbm9hX2llOworCXVpbnQxNl90IHAycF9pZV9vZmZzZXQ7CisJY2RmX3NwaW5sb2NrX3QgbG9jazsKK307CisKKy8qKgorICogc3RydWN0IGJlYWNvbl90aW1faWUgLSBzdHJ1Y3R1cmUgdG8gc3RvcmUgVElNIElFIG9mIGJlYWNvbgorICogQHRpbV9pZTogdGltIGllCisgKiBAdGltX2xlbjogdGltIGllIGxlbmd0aAorICogQGR0aW1fY291bnQ6IGR0aW0gY291bnQKKyAqIEBkdGltX3BlcmlvZDogZHRpbSBwZXJpb2QKKyAqIEB0aW1fYml0Y3RsOiB0aW0gYml0IGNvbnRyb2wKKyAqIEB0aW1fYml0bWFwOiB0aW0gYml0bWFwCisgKi8KK3N0cnVjdCBiZWFjb25fdGltX2llIHsKKwl1aW50OF90IHRpbV9pZTsKKwl1aW50OF90IHRpbV9sZW47CisJdWludDhfdCBkdGltX2NvdW50OworCXVpbnQ4X3QgZHRpbV9wZXJpb2Q7CisJdWludDhfdCB0aW1fYml0Y3RsOworCXVpbnQ4X3QgdGltX2JpdG1hcFsxXTsKK30gX19BVFRSSUJfUEFDSzsKKworLyoqCisgKiBzdHJ1Y3QgcHBzIC0gcGFja2V0IHBvd2VyIHNhdmUgcGFyYW1ldGVyCisgKiBAcGFpZF9tYXRjaF9lbmFibGU6IHBhaWQgbWF0Y2ggZW5hYmxlCisgKiBAZ2lkX21hdGNoX2VuYWJsZTogZ2lkIG1hdGNoIGVuYWJsZQorICogQHRpbV9jbGVhcjogdGltZSBjbGVhcgorICogQGR0aW1fY2xlYXI6IGR0aW0gY2xlYXIKKyAqIEBlb2ZfZGVsaW06IGVvZiBkZWxpbQorICogQG1hY19tYXRjaDogbWFjIG1hdGNoCisgKiBAZGVsaW1fZmFpbDogZGVsaW0gZmFpbAorICogQG5zdHNfemVybzogbnN0cyB6ZXJvCisgKiBAcnNzaV9jaGs6IFJTU0kgY2hlY2sKKyAqIEBlYnRfNWc6IGVidCA1R0h6CisgKi8KK3N0cnVjdCBwcHMgeworCWJvb2wgcGFpZF9tYXRjaF9lbmFibGU7CisJYm9vbCBnaWRfbWF0Y2hfZW5hYmxlOworCWJvb2wgdGltX2NsZWFyOworCWJvb2wgZHRpbV9jbGVhcjsKKwlib29sIGVvZl9kZWxpbTsKKwlib29sIG1hY19tYXRjaDsKKwlib29sIGRlbGltX2ZhaWw7CisJYm9vbCBuc3RzX3plcm87CisJYm9vbCByc3NpX2NoazsKKwlib29sIGVidF81ZzsKK307CisKKy8qKgorICogc3RydWN0IHFwb3dlcl9wYXJhbXMgLSBxcG93ZXIgcmVsYXRlZCBwYXJhbWV0ZXJzCisgKiBAbWF4X3BzX3BvbGxfY250OiBtYXggcHMgcG9sbCBjb3VudAorICogQG1heF90eF9iZWZvcmVfd2FrZTogbWF4IHR4IGJlZm9yZSB3YWtlCisgKiBAc3BlY19wc19wb2xsX3dha2VfaW50ZXJ2YWw6IHBzIHBvbGwgd2FrZSBpbnRlcnZhbAorICogQG1heF9zcGVjX25vZGF0YV9wc19wb2xsOiBubyBkYXRhIHBzIHBvbGwKKyAqLworc3RydWN0IHFwb3dlcl9wYXJhbXMgeworCXVpbnQzMl90IG1heF9wc19wb2xsX2NudDsKKwl1aW50MzJfdCBtYXhfdHhfYmVmb3JlX3dha2U7CisJdWludDMyX3Qgc3BlY19wc19wb2xsX3dha2VfaW50ZXJ2YWw7CisJdWludDMyX3QgbWF4X3NwZWNfbm9kYXRhX3BzX3BvbGw7Cit9OworCisKKy8qKgorICogc3RydWN0IGd0eF9jb25maWdfdCAtIEdUWCBjb25maWcKKyAqIEBndHhSVE1hc2s6IGZvciBIVCBhbmQgVkhUIHJhdGUgbWFza3MKKyAqIEBndHhVc3JjZmc6IGhvc3QgcmVxdWVzdCBmb3IgR1RYIG1hc2sKKyAqIEBndHhQRVJUaHJlc2hvbGQ6IFBFUiBUaHJlc2hvbGQgKGRlZmF1bHQ6IDEwJSkKKyAqIEBndHhQRVJNYXJnaW46IFBFUiBtYXJnaW4gKGRlZmF1bHQ6IDIlKQorICogQGd0eFRQQ3N0ZXA6IFRDUCBzdGVwIChkZWZhdWx0OiAxKQorICogQGd0eFRQQ01pbjogVENQIG1pbiAoZGVmYXVsdDogNSkKKyAqIEBndHhCV01hc2s6IEJXIG1hc2sgKDIwLzQwLzgwLzE2MCBNaHopCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBndHhSVE1hc2tbMl07CisJdWludDMyX3QgZ3R4VXNyY2ZnOworCXVpbnQzMl90IGd0eFBFUlRocmVzaG9sZDsKKwl1aW50MzJfdCBndHhQRVJNYXJnaW47CisJdWludDMyX3QgZ3R4VFBDc3RlcDsKKwl1aW50MzJfdCBndHhUUENNaW47CisJdWludDMyX3QgZ3R4QldNYXNrOworfSBndHhfY29uZmlnX3Q7CisKKy8qKgorICogc3RydWN0IHBkZXZfY2xpX2NvbmZpZ190IC0gc3RvcmUgcGRldiBwYXJhbWV0ZXJzCisgKiBAYW5pX2VuYWJsZTogQU5JIGlzIGVuYWJsZWQvZGlzYWJsZSBvbiB0YXJnZXQKKyAqIEBhbmlfcG9sbF9sZW46IHN0b3JlIEFOSSBwb2xsaW5nIHBlcmlvZAorICogQGFuaV9saXN0ZW5fbGVuOiBzdG9yZSBBTkkgbGlzdGVuaW5nIHBlcmlvZAorICogQGFuaV9vZmRtX2xldmVsOiBzdG9yZSBBTkkgT0ZETSBpbW11bml0eSBsZXZlbAorICogQGFuaV9jY2tfbGV2ZWw6IHN0b3JlIEFOSSBDQ0sgaW1tdW5pdHkgbGV2ZWwKKyAqIEBjd21lbmFibGU6IER5bmFtaWMgYncgaXMgZW5hYmxlL2Rpc2FibGUgaW4gZncKKyAqIEB0eGNoYWlubWFzazogdHggY2hhaW4gbWFzaworICogQHJ4Y2hhaW5tYXNrOiByeCBjaGFpbiBtYXNrCisgKiBAdHhwb3cyZzogdHggcG93ZXIgbGltaXQgZm9yIDJHSHoKKyAqIEB0eHBvdzVnOiB0eCBwb3dlciBsaW1pdCBmb3IgNUdIegorICogQHB3cmdhdGluZzogZW5hYmxlL2Rpc2FibGUgcG93ZXIgZ2F0aW5nIHNsZWVwCisgKiBAYnVyc3RfZW5hYmxlOiBpcyBidXJzdCBlbmFibGUvZGlzYWJsZQorICogQGJ1cnN0X2R1cjogYnVyc3QgZHVyYXRpb24KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgcGRldiBwYXJhbWV0ZXJzLgorICogU29tZSBvZiB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBzZXQgaW4gZncgYW5kIHNvbWUKKyAqIHBhcmFtZXRlcnMgYXJlIG9ubHkgbWFpbnRhaW5lZCBpbiBob3N0LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgYW5pX2VuYWJsZTsKKwl1aW50MzJfdCBhbmlfcG9sbF9sZW47CisJdWludDMyX3QgYW5pX2xpc3Rlbl9sZW47CisJdWludDMyX3QgYW5pX29mZG1fbGV2ZWw7CisJdWludDMyX3QgYW5pX2Nja19sZXZlbDsKKwl1aW50MzJfdCBjd21lbmFibGU7CisJdWludDMyX3QgY3RzX2NidzsKKwl1aW50MzJfdCB0eGNoYWlubWFzazsKKwl1aW50MzJfdCByeGNoYWlubWFzazsKKwl1aW50MzJfdCB0eHBvdzJnOworCXVpbnQzMl90IHR4cG93NWc7CisJdWludDMyX3QgcHdyZ2F0aW5nOworCXVpbnQzMl90IGJ1cnN0X2VuYWJsZTsKKwl1aW50MzJfdCBidXJzdF9kdXI7Cit9IHBkZXZfY2xpX2NvbmZpZ190OworCisvKioKKyAqIHN0cnVjdCB2ZGV2X2NsaV9jb25maWdfdCAtIHN0b3JlIHZkZXYgcGFyYW1ldGVycworICogQG5zczogbnNzIHdpZHRoCisgKiBAbGRwYzogaXMgbGRwYyBpcyBlbmFibGUvZGlzYWJsZQorICogQHR4X3N0YmM6IFRYIFNUQkMgaXMgZW5hYmxlL2Rpc2FibGUKKyAqIEByeF9zdGJjOiBSWCBTVEJDIGlzIGVuYWJsZS9kaXNhYmxlCisgKiBAc2hvcnRnaTogc2hvcnQgZ2kgaXMgZW5hYmxlL2Rpc2FibGUKKyAqIEBydHNjdHNfZW46IFJUUy9DVFMgaXMgZW5hYmxlL2Rpc2FibGUKKyAqIEBjaHdpZHRoOiBjaGFubmVsIHdpZHRoCisgKiBAdHhfcmF0ZTogdHggcmF0ZQorICogQGFtcGR1OiBhbXBkdSBzaXplCisgKiBAYW1zZHU6IGFtc2R1IHNpemUKKyAqIEBlcnhfYWRqdXN0OiBlbmFibGUvZGlzYWJsZSBlYXJseSByeCBlbmFibGUKKyAqIEBlcnhfYm1pc3NfbnVtOiB0YXJnZXQgYm1pc3MgbnVtYmVyIHBlciBzYW1wbGUKKyAqIEBlcnhfYm1pc3NfY3ljbGU6IHNhbXBsZSBjeWNsZQorICogQGVyeF9zbG9wX3N0ZXA6IHNsb3Bfc3RlcCB2YWx1ZQorICogQGVyeF9pbml0X3Nsb3A6IGluaXQgc2xvcAorICogQGVyeF9hZGpfcGF1c2U6IHBhdXNlIGFkanVzdCBlbmFibGUvZGlzYWJsZQorICogQGVyeF9kcmlfc2FtcGxlOiBlbmFibGUvZGlzYWJsZSBkcmlmdCBzYW1wbGUKKyAqIEBwcHNfcGFyYW1zOiBwYWNrZXQgcG93ZXIgc2F2ZSBwYXJhbWV0ZXJzCisgKiBAcXBvd2VyX3BhcmFtczogcXBvd2VyIHBhcmFtZXRlcnMKKyAqIEBndHhfaW5mbzogR1RYIG9mZmxvYWQgaW5mbworICoKKyAqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB2ZGV2IHBhcmFtZXRlcnMuCisgKiBTb21lIG9mIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHNldCBpbiBmdyBhbmQgc29tZQorICogcGFyYW1ldGVycyBhcmUgb25seSBtYWludGFpbmVkIGluIGhvc3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBuc3M7CisJdWludDMyX3QgbGRwYzsKKwl1aW50MzJfdCB0eF9zdGJjOworCXVpbnQzMl90IHJ4X3N0YmM7CisJdWludDMyX3Qgc2hvcnRnaTsKKwl1aW50MzJfdCBydHNjdHNfZW47CisJdWludDMyX3QgY2h3aWR0aDsKKwl1aW50MzJfdCB0eF9yYXRlOworCXVpbnQzMl90IGFtcGR1OworCXVpbnQzMl90IGFtc2R1OworCXVpbnQzMl90IGVyeF9hZGp1c3Q7CisJdWludDMyX3QgZXJ4X2JtaXNzX251bTsKKwl1aW50MzJfdCBlcnhfYm1pc3NfY3ljbGU7CisJdWludDMyX3QgZXJ4X3Nsb3Bfc3RlcDsKKwl1aW50MzJfdCBlcnhfaW5pdF9zbG9wOworCXVpbnQzMl90IGVyeF9hZGpfcGF1c2U7CisJdWludDMyX3QgZXJ4X2RyaV9zYW1wbGU7CisJc3RydWN0IHBwcyBwcHNfcGFyYW1zOworCXN0cnVjdCBxcG93ZXJfcGFyYW1zIHFwb3dlcl9wYXJhbXM7CisJZ3R4X2NvbmZpZ190IGd0eF9pbmZvOworfSB2ZGV2X2NsaV9jb25maWdfdDsKKworLyoqCisgKiBzdHJ1Y3Qgd21hX3dvdyAtIHN0b3JlIHdvdyBwYXR0ZXJucworICogQG1hZ2ljX3B0cm5fZW5hYmxlOiBtYWdpYyBwYXR0ZXJuIGVuYWJsZS9kaXNhYmxlCisgKiBAd293X2VuYWJsZTogd293IGVuYWJsZS9kaXNhYmxlCisgKiBAd293X2VuYWJsZV9jbWRfc2VudDogaXMgd293IGVuYWJsZSBjb21tYW5kIHNlbnQgdG8gZncKKyAqIEBkZWF1dGhfZW5hYmxlOiBpcyBkZWF1dGggd2FrZXVwIGVuYWJsZS9kaXNhYmxlCisgKiBAZGlzYXNzb2NfZW5hYmxlOiBpcyBkaXNhc3NvYyB3YWtldXAgZW5hYmxlL2Rpc2FibGUKKyAqIEBibWlzc19lbmFibGU6IGlzIGJtaXNzIHdha2V1cCBlbmFibGUvZGlzYWJsZQorICogQGd0a19wZGV2X2VuYWJsZTogaXMgR1RLIGJhc2VkIHdha2V1cCBlbmFibGUvZGlzYWJsZQorICogQGd0a19lcnJfZW5hYmxlOiBpcyBHVEsgZXJyb3Igd2FrZXVwIGVuYWJsZS9kaXNhYmxlCisgKiBAbHBoYl9jYWNoZTogbHBoYiBjYWNoZQorICoKKyAqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB3b3cgcGF0dGVybnMgYW5kCisgKiB3b3cgcmVsYXRlZCBwYXJhbWV0ZXJzIGluIGhvc3QuCisgKi8KK3N0cnVjdCB3bWFfd293IHsKKwlib29sIG1hZ2ljX3B0cm5fZW5hYmxlOworCWJvb2wgd293X2VuYWJsZTsKKwlib29sIHdvd19lbmFibGVfY21kX3NlbnQ7CisJYm9vbCBkZWF1dGhfZW5hYmxlOworCWJvb2wgZGlzYXNzb2NfZW5hYmxlOworCWJvb2wgYm1pc3NfZW5hYmxlOworCWJvb2wgZ3RrX3BkZXZfZW5hYmxlOworCWJvb2wgZ3RrX2Vycl9lbmFibGVbV01BX01BWF9TVVBQT1JURURfQlNTXTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTFBIQgorCS8qIGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IHZkZXYgMC4KKwkgKiBjYWNoZSBoYXMgdHdvIGVudHJpZXM6IG9uZSBmb3IgVENQIGFuZCBvbmUgZm9yIFVEUC4KKwkgKi8KKwl0U2lyTFBIQlJlcSBscGhiX2NhY2hlWzJdOworI2VuZGlmCit9OworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworI2RlZmluZSBDTUFDX0lQTl9MRU4gICAgICAgICAoNikKKyNkZWZpbmUgV01BX0lHVEtfS0VZX0lOREVYXzQgKDQpCisjZGVmaW5lIFdNQV9JR1RLX0tFWV9JTkRFWF81ICg1KQorCisvKioKKyAqIHN0cnVjdCB3bWFfaWd0a19pcG5fdCAtIEdUSyBJUE4gaW5mbworICogQGlwbjogSVBOIGluZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgaXBuW0NNQUNfSVBOX0xFTl07Cit9IHdtYV9pZ3RrX2lwbl90OworCisvKioKKyAqIHN0cnVjdCB3bWFfaWd0a19rZXlfdCAtIEdUSyBrZXkKKyAqIEBrZXlfbGVuZ3RoOiBrZXkgbGVuZ3RoCisgKiBAa2V5OiBrZXkKKyAqIEBrZXlfaWQ6IGtleSBpZAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3Qga2V5X2xlbmd0aDsKKwl1aW50OF90IGtleVtDU1JfQUVTX0tFWV9MRU5dOworCisJLyogSVBOIGlzIG1haW50YWluZWQgcGVyIGlHVEsga2V5SUQKKwkgKiAwdGggaW5kZXggZm9yIGlHVEsga2V5SUQgPSA0OworCSAqIDFzdCBpbmRleCBmb3IgaUdUSyBLZXlJRCA9IDUKKwkgKi8KKwl3bWFfaWd0a19pcG5fdCBrZXlfaWRbMl07Cit9IHdtYV9pZ3RrX2tleV90OworI2VuZGlmCisKKy8qKgorICogc3RydWN0IHZkZXZfcmVzdGFydF9wYXJhbXNfdCAtIHZkZXYgcmVzdGFydCBwYXJhbWV0ZXJzCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHNzaWQ6IHNzaWQKKyAqIEBmbGFnczogZmxhZ3MKKyAqIEByZXF1ZXN0b3JfaWQ6IHJlcXVlc3RvciBpZAorICogQGNoYW46IGNoYW5uZWwKKyAqIEBoaWRkZW5fc3NpZF9yZXN0YXJ0X2luX3Byb2dyZXNzOiBoaWRkZW4gc3NpZCByZXN0YXJ0IGZsYWcKKyAqIEBzc2lkSGlkZGVuOiBpcyBzc2lkIGhpZGRlbiBvciBub3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHZkZXZfaWQ7CisJd21pX3NzaWQgc3NpZDsKKwlBX1VJTlQzMiBmbGFnczsKKwlBX1VJTlQzMiByZXF1ZXN0b3JfaWQ7CisJQV9VSU5UMzIgZGlzYWJsZV9od19hY2s7CisJd21pX2NoYW5uZWwgY2hhbjsKKwljZGZfYXRvbWljX3QgaGlkZGVuX3NzaWRfcmVzdGFydF9pbl9wcm9ncmVzczsKKwl1aW50OF90IHNzaWRIaWRkZW47Cit9IHZkZXZfcmVzdGFydF9wYXJhbXNfdDsKKworLyoqCisgKiBzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAtIHR4cnggbm9kZQorICogQGFkZHI6IG1hYyBhZGRyZXNzCisgKiBAYnNzaWQ6IGJzc2lkCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAYmVhY29uOiBiZWFjb24gaW5mbworICogQHZkZXZfcmVzdGFydF9wYXJhbXM6IHZkZXYgcmVzdGFydCBwYXJhbWV0ZXJzCisgKiBAY29uZmlnOiBwZXIgdmRldiBjb25maWcgcGFyYW1ldGVycworICogQHNjYW5faW5mbzogc2NhbiBpbmZvCisgKiBAdHlwZTogdHlwZQorICogQHN1Yl90eXBlOiBzdWIgdHlwZQorICogQG5sb19tYXRjaF9ldnRfcmVjZWl2ZWQ6IGlzIG5sbyBtYXRjaCBldmVudCByZWNlaXZlZCBvciBub3QKKyAqIEBwbm9faW5fcHJvZ3Jlc3M6IGlzIHBubyBpbiBwcm9ncmVzcyBvciBub3QKKyAqIEBwbG1faW5fcHJvZ3Jlc3M6IGlzIHBsbSBpbiBwcm9ncmVzcyBvciBub3QKKyAqIEBwdHJuX21hdGNoX2VuYWJsZTogaXMgcGF0dGVybiBtYXRjaCBpcyBlbmFibGUgb3Igbm90CisgKiBAbnVtX3dvd19kZWZhdWx0X3BhdHRlcm5zOiBudW1iZXIgb2YgZGVmYXVsdCB3b3cgcGF0dGVybnMgY29uZmlndXJlZCBmb3IgdmRldgorICogQG51bV93b3dfdXNlcl9wYXR0ZXJuczogbnVtYmVyIG9mIHVzZXIgd293IHBhdHRlcm5zIGNvbmZpZ3VyZWQgZm9yIHZkZXYKKyAqIEBjb25uX3N0YXRlOiBjb25uZWN0aW9uIHN0YXRlCisgKiBAYmVhY29uSW50ZXJ2YWw6IGJlYWNvbiBpbnRlcnZhbAorICogQGxsYkNvZXhpc3Q6IDExYiBjb2V4aXN0CisgKiBAc2hvcnRTbG90VGltZVN1cHBvcnRlZDogaXMgc2hvcnQgc2xvdCB0aW1lIHN1cHBvcnRlZCBvciBub3QKKyAqIEBkdGltUGVyaW9kOiBEVElNIHBlcmlvZAorICogQGNoYW5tb2RlOiBjaGFubmVsIG1vZGUKKyAqIEB2aHRfY2FwYWJsZTogVkhUIGNhcGFibGl0eSBmbGFnCisgKiBAaHRfY2FwYWJsZTogSFQgY2FwYWJsaXR5IGZsYWcKKyAqIEBtaHo6IGNoYW5uZWwgZnJlcXVlbmN5IGluIEtIegorICogQHZkZXZfdXA6IGlzIHZkZXYgdXAgb3Igbm90CisgKiBAdHNmYWRqdXN0OiBUU0YgYWRqdXN0CisgKiBAYWRkQnNzU3RhQ29udGV4dDogYWRkIGJzcyBjb250ZXh0CisgKiBAYWlkOiBhc3NvY2lhdGlvbiBpZAorICogQHJtZkVuYWJsZWQ6IFJvYnVzdCBNYW5hZ2VtZW50IEZyYW1lIChSTUYpIGVuYWJsZWQvZGlzYWJsZWQKKyAqIEBrZXk6IEdUSyBrZXkKKyAqIEB1YXBzZF9jYWNoZWRfdmFsOiB1YXBzZCBjYWNoZWQgdmFsdWUKKyAqIEBzdGF0c19yc3A6IHN0YXRzIHJlc3BvbnNlCisgKiBAZndfc3RhdHNfc2V0OiBmdyBzdGF0cyB2YWx1ZQorICogQGRlbF9zdGFzZWxmX3JlcTogZGVsZXRlIHN0YSBzZWxmIHJlcXVlc3QKKyAqIEBic3Nfc3RhdHVzOiBic3Mgc3RhdHVzCisgKiBAcmF0ZV9mbGFnczogcmF0ZSBmbGFncworICogQG5zczogbnNzIHZhbHVlCisgKiBAaXNfY2hhbm5lbF9zd2l0Y2g6IGlzIGNoYW5uZWwgc3dpdGNoCisgKiBAcGF1c2VfYml0bWFwOiBwYXVzZSBiaXRtYXAKKyAqIEB0eF9wb3dlcjogdHggcG93ZXIgaW4gZGJtCisgKiBAbWF4X3R4X3Bvd2VyOiBtYXggdHggcG93ZXIgaW4gZGJtCisgKiBAbndUeXBlOiBuZXR3b3JrIHR5cGUgKDgwMi4xMWEvYi9nL24vYWMpCisgKiBAc3RhS2V5UGFyYW1zOiBzdGEga2V5IHBhcmFtZXRlcnMKKyAqIEBwc19lbmFibGVkOiBpcyBwb3dlcnNhdmUgZW5hYmxlL2Rpc2FibGUKKyAqIEBkdGltX3BvbGljeTogRFRJTSBwb2xpY3kKKyAqIEBwZWVyX2NvdW50OiBwZWVyIGNvdW50CisgKiBAcm9hbV9zeW5jaF9pbl9wcm9ncmVzczogZmxhZyBpcyBpbiBwcm9ncmVzcyBvciBub3QKKyAqIEBwbGlua19zdGF0dXNfcmVxOiBsaW5rIHN0YXR1cyByZXF1ZXN0CisgKiBAcHNucl9yZXE6IHNuciByZXF1ZXN0CisgKiBAZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcDogZGVsYXkKKyAqIEB0eF9zdHJlYW1zOiBudW1iZXIgb2YgdHggc3RyZWFtcyBjYW4gYmUgdXNlZCBieSB0aGUgdmRldgorICogQHJ4X3N0cmVhbXM6IG51bWJlciBvZiByeCBzdHJlYW1zIGNhbiBiZSB1c2VkIGJ5IHRoZSB2ZGV2CisgKiBAY2hhaW5fbWFzazogY2hhaW4gbWFzayBjYW4gYmUgdXNlZCBieSB0aGUgdmRldgorICogQG1hY19pZDogdGhlIG1hYyBvbiB3aGljaCB2ZGV2IGlzIG9uCisgKgorICogSXQgc3RvcmVzIHBhcmFtZXRlcnMgcGVyIHZkZXYgaW4gd21hLgorICovCitzdHJ1Y3Qgd21hX3R4cnhfbm9kZSB7CisJdWludDhfdCBhZGRyW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDhfdCBic3NpZFtJRUVFODAyMTFfQUREUl9MRU5dOworCXZvaWQgKmhhbmRsZTsKKwlzdHJ1Y3QgYmVhY29uX2luZm8gKmJlYWNvbjsKKwl2ZGV2X3Jlc3RhcnRfcGFyYW1zX3QgdmRldl9yZXN0YXJ0X3BhcmFtczsKKwl2ZGV2X2NsaV9jb25maWdfdCBjb25maWc7CisJc3RydWN0IHNjYW5fcGFyYW0gc2Nhbl9pbmZvOworCXN0cnVjdCBwMnBfc2Nhbl9wYXJhbSBwMnBfc2Nhbl9pbmZvOworCXVpbnQzMl90IHR5cGU7CisJdWludDMyX3Qgc3ViX3R5cGU7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisJYm9vbCBubG9fbWF0Y2hfZXZ0X3JlY2VpdmVkOworCWJvb2wgcG5vX2luX3Byb2dyZXNzOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorCWJvb2wgcGxtX2luX3Byb2dyZXNzOworI2VuZGlmCisJYm9vbCBwdHJuX21hdGNoX2VuYWJsZTsKKwl1aW50OF90IG51bV93b3dfZGVmYXVsdF9wYXR0ZXJuczsKKwl1aW50OF90IG51bV93b3dfdXNlcl9wYXR0ZXJuczsKKwlib29sIGNvbm5fc3RhdGU7CisJdFNpck1hY0JlYWNvbkludGVydmFsIGJlYWNvbkludGVydmFsOworCXVpbnQ4X3QgbGxiQ29leGlzdDsKKwl1aW50OF90IHNob3J0U2xvdFRpbWVTdXBwb3J0ZWQ7CisJdWludDhfdCBkdGltUGVyaW9kOworCVdMQU5fUEhZX01PREUgY2hhbm1vZGU7CisJdWludDhfdCB2aHRfY2FwYWJsZTsKKwl1aW50OF90IGh0X2NhcGFibGU7CisJQV9VSU5UMzIgbWh6OworCWJvb2wgdmRldl91cDsKKwl1aW50NjRfdCB0c2ZhZGp1c3Q7CisJdm9pZCAqYWRkQnNzU3RhQ29udGV4dDsKKwl1aW50OF90IGFpZDsKKwl1aW50OF90IHJtZkVuYWJsZWQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXdtYV9pZ3RrX2tleV90IGtleTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFXICovCisJdWludDMyX3QgdWFwc2RfY2FjaGVkX3ZhbDsKKwl0QW5pR2V0UEVTdGF0c1JzcCAqc3RhdHNfcnNwOworCXVpbnQ4X3QgZndfc3RhdHNfc2V0OworCXZvaWQgKmRlbF9zdGFzZWxmX3JlcTsKKwljZGZfYXRvbWljX3QgYnNzX3N0YXR1czsKKwl1aW50OF90IHJhdGVfZmxhZ3M7CisJdWludDhfdCBuc3M7CisJYm9vbCBpc19jaGFubmVsX3N3aXRjaDsKKwl1aW50MTZfdCBwYXVzZV9iaXRtYXA7CisJdFBvd2VyZEJtIHR4X3Bvd2VyOworCXRQb3dlcmRCbSBtYXhfdHhfcG93ZXI7CisJdWludDMyX3QgbndUeXBlOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwl2b2lkICpzdGFLZXlQYXJhbXM7CisjZW5kaWYKKwlib29sIHBzX2VuYWJsZWQ7CisJdWludDMyX3QgZHRpbV9wb2xpY3k7CisJdWludDMyX3QgcGVlcl9jb3VudDsKKwlib29sIHJvYW1fc3luY2hfaW5fcHJvZ3Jlc3M7CisJdm9pZCAqcGxpbmtfc3RhdHVzX3JlcTsKKwl2b2lkICpwc25yX3JlcTsKKwl1aW50OF90IGRlbGF5X2JlZm9yZV92ZGV2X3N0b3A7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwlib29sIGV4dHNjYW5faW5fcHJvZ3Jlc3M7CisjZW5kaWYKKwl1aW50MzJfdCBhbHRfbW9kdWxhdGVkX2R0aW07CisJYm9vbCBhbHRfbW9kdWxhdGVkX2R0aW1fZW5hYmxlZDsKKwl1aW50MzJfdCB0eF9zdHJlYW1zOworCXVpbnQzMl90IHJ4X3N0cmVhbXM7CisJdWludDMyX3QgY2hhaW5fbWFzazsKKwl1aW50MzJfdCBtYWNfaWQ7Cit9OworCisjaWYgZGVmaW5lZChRQ0FfV0lGSV9GVE0pCisjZGVmaW5lIE1BWF9VVEZfRVZFTlRfTEVOR1RIICAgIDIwNDgKKyNkZWZpbmUgTUFYX1dNSV9VVEZfTEVOICAgICAgICAgMjUyCisKKy8qKgorICogc3RydWN0IFNFR19IRFJfSU5GT19TVFJVQ1QgLSBoZWFkZXIgaW5mbworICogQGxlbjogbGVuZ3RoCisgKiBAbXNncmVmOiBtZXNzYWdlIHJlZnJlbmNlCisgKiBAc2VnbWVudEluZm86IHNlZ21lbnQgaW5mbworICogQHBhZDogcGFkZGluZworICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgbGVuOworCUFfVUlOVDMyIG1zZ3JlZjsKKwlBX1VJTlQzMiBzZWdtZW50SW5mbzsKKwlBX1VJTlQzMiBwYWQ7Cit9IFNFR19IRFJfSU5GT19TVFJVQ1Q7CisKKy8qKgorICogc3RydWN0IHV0Zl9ldmVudF9pbmZvIC0gVVRGIGV2ZW50IGluZm8KKyAqIEBkYXRhOiBkYXRhIHB0cgorICogQGxlbmd0aDogbGVuZ3RoCisgKiBAb2Zmc2V0OiBvZmZzZXQKKyAqIEBjdXJyZW50U2VxOiBjdXJlbnQgc3F1ZW5jZQorICogQGV4cGVjdGVkU2VxOiBleHBlY3RlZCBzZXF1ZW5jZQorICovCitzdHJ1Y3QgdXRmX2V2ZW50X2luZm8geworCXVpbnQ4X3QgKmRhdGE7CisJdWludDMyX3QgbGVuZ3RoOworCWNkZl9zaXplX3Qgb2Zmc2V0OworCXVpbnQ4X3QgY3VycmVudFNlcTsKKwl1aW50OF90IGV4cGVjdGVkU2VxOworfTsKKyNlbmRpZgorCisvKioKKyAqIHN0cnVjdCBzY2FuX3RpbWVyX2luZm8gLSBzY2FuIHRpbWVyIGluZm8KKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAc2Nhbl9pZDogc2NhbiBpZAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCB2ZGV2X2lkOworCXVpbnQzMl90IHNjYW5faWQ7Cit9IHNjYW5fdGltZXJfaW5mbzsKKworLyoqCisgKiBzdHJ1Y3QgaWJzc19wb3dlcl9zYXZlX3BhcmFtcyAtIElCU1MgcG93ZXIgc2F2ZSBwYXJhbWV0ZXJzCisgKiBAYXRpbVdpbmRvd0xlbmd0aDogQVRJTSB3aW5kb3cgbGVuZ3RoCisgKiBAaXNQb3dlclNhdmVBbGxvd2VkOiBpcyBwb3dlciBzYXZlIGFsbG93ZWQKKyAqIEBpc1Bvd2VyQ29sbGFwc2VBbGxvd2VkOiBpcyBwb3dlciBjb2xsYXBzZWQgYWxsb3dlZAorICogQGlzQXdha2VvblR4UnhFbmFibGVkOiBpcyBhd2FrZSBvbiB0eC9yeCBlbmFibGVkCisgKiBAaW5hY3Rpdml0eUNvdW50OiBpbmFjdGl2aXR5IGNvdW50CisgKiBAdHhTUEVuZEluYWN0aXZpdHlUaW1lOiB0eCBTUCBlbmQgaW5hY3Rpdml0eSB0aW1lCisgKiBAaWJzc1BzV2FybXVwVGltZTogSUJTUyBwb3dlciBzYXZlIHdhcm0gdXAgdGltZQorICogQGlic3NQczFSeENoYWluSW5BdGltRW5hYmxlOiBJQlNTIHBvd2VyIHNhdmUgcnggY2hhaW4gaW4gQVRJTSBlbmFibGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGF0aW1XaW5kb3dMZW5ndGg7CisJdWludDMyX3QgaXNQb3dlclNhdmVBbGxvd2VkOworCXVpbnQzMl90IGlzUG93ZXJDb2xsYXBzZUFsbG93ZWQ7CisJdWludDMyX3QgaXNBd2FrZW9uVHhSeEVuYWJsZWQ7CisJdWludDMyX3QgaW5hY3Rpdml0eUNvdW50OworCXVpbnQzMl90IHR4U1BFbmRJbmFjdGl2aXR5VGltZTsKKwl1aW50MzJfdCBpYnNzUHNXYXJtdXBUaW1lOworCXVpbnQzMl90IGlic3NQczFSeENoYWluSW5BdGltRW5hYmxlOworfSBpYnNzX3Bvd2VyX3NhdmVfcGFyYW1zOworCisvKioKKyAqIHN0cnVjdCBkYnNfaHdfbW9kZV9pbmZvIC0gV0xBTl9EQlNfSFdfTU9ERVNfVExWIEZvcm1hdAorICogQHRsdl9oZWFkZXI6IFRMViBoZWFkZXIsIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMgorICogQGh3X21vZGVfbGlzdDogV0xBTl9EQlNfSFdfTU9ERV9MSVNUIGVudHJpZXMKKyAqLworc3RydWN0IGRic19od19tb2RlX2luZm8geworCXVpbnQzMl90IHRsdl9oZWFkZXI7CisJdWludDMyX3QgKmh3X21vZGVfbGlzdDsKK307CisKKy8qIEN1cnJlbnQgSFRDIGNyZWRpdCBpcyAyLCBwb29sIHNpemUgb2YgNTAgaXMgc3VmZmljaWVudCAqLworI2RlZmluZSBXTUlfREVTQ19QT09MX01BWCA1MAorCisvKioKKyAqIHN0cnVjdCB3bWlfZGVzY190IC0gd21pIG1hbmFnZW1lbnQgVHggZGVzY3JpcHRvci4KKyAqIEB0eF9jbXBsX2NiX2Z1bmM6CWNvbXBsZXRpb24gY2FsbGJhY2sgZnVuY3Rpb24sIHdoZW4gREwgY29tcGxldGlvbiBhbmQKKyAqCQkJT1RBIGRvbmUuCisgKiBAb3RhX3Bvc3RfcHJvY19mdW5jOglQb3N0IHByb2Nlc3MgY2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZC4KKyAqIEBuYnVmOgkJTmV0d29yayBidWZmZXIgdG8gYmUgZnJlZWQuCisgKiBAZGVzY19pZDoJCVdNSSBkZXNjcmlwdG9yLgorICovCisKK3N0cnVjdCB3bWlfZGVzY190IHsKKwlwV01BVHhSeENvbXBGdW5jIHR4X2NtcGxfY2I7CisJcFdNQUFja0ZuVHhDb21wICBvdGFfcG9zdF9wcm9jX2NiOworCWNkZl9uYnVmX3QJIG5idWY7CisJdWludDMyX3QJIGRlc2NfaWQ7Cit9OworCisvKioKKyAqIHVuaW9uIHdtaV9kZXNjX2VsZW1fdCAtIGxpbmtlZCBsaXN0IHdtaSBkZXNjIHBvb2wuCisgKiBAbmV4dDogUG9pbnRlciBuZXh0IGRlc2NyaXRvciBpbiB0aGUgcG9vbC4KKyAqIEB3bWlfZGVzYzogd21pIGRlc2NyaXB0b3IgZWxlbWVudC4KKyAqLwordW5pb24gd21pX2Rlc2NfZWxlbV90IHsKKwl1bmlvbiB3bWlfZGVzY19lbGVtX3QgKm5leHQ7CisJc3RydWN0IHdtaV9kZXNjX3Qgd21pX2Rlc2M7Cit9OworCisvKioKKyAqIHN0cnVjdCBkdWFsX21hY19jb25maWcgLSBEdWFsIE1BQyBjb25maWd1cmF0aW9ucworICogQHByZXZfc2Nhbl9jb25maWc6IFByZXZpb3VzIHNjYW4gY29uZmlndXJhdGlvbgorICogQHByZXZfZndfbW9kZV9jb25maWc6IFByZXZpb3VzIEZXIG1vZGUgY29uZmlndXJhdGlvbgorICogQGN1cl9zY2FuX2NvbmZpZzogQ3VycmVudCBzY2FuIGNvbmZpZ3VyYXRpb24KKyAqIEBjdXJfZndfbW9kZV9jb25maWc6IEN1cnJlbnQgRlcgbW9kZSBjb25maWd1cmF0aW9uCisgKiBAcmVxX3NjYW5fY29uZmlnOiBSZXF1ZXN0ZWQgc2NhbiBjb25maWd1cmF0aW9uCisgKiBAcmVxX2Z3X21vZGVfY29uZmlnOiBSZXF1ZXN0ZWQgRlcgbW9kZSBjb25maWd1cmF0aW9uCisgKi8KK3N0cnVjdCBkdWFsX21hY19jb25maWcgeworCXVpbnQzMl90IHByZXZfc2Nhbl9jb25maWc7CisJdWludDMyX3QgcHJldl9md19tb2RlX2NvbmZpZzsKKwl1aW50MzJfdCBjdXJfc2Nhbl9jb25maWc7CisJdWludDMyX3QgY3VyX2Z3X21vZGVfY29uZmlnOworCXVpbnQzMl90IHJlcV9zY2FuX2NvbmZpZzsKKwl1aW50MzJfdCByZXFfZndfbW9kZV9jb25maWc7CisKK307CisKKy8qKgorICogc3RydWN0IHdtaV9pbml0X2NtZCAtIFNhdmVkIHdtaSBJTklUIGNvbW1hbmQKKyAqIEBidWY6IEJ1ZmZlciBjb250YWluaW5nIHRoZSB3bWkgSU5JVCBjb21tYW5kCisgKiBAYnVmX2xlbjogTGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqLworc3RydWN0IHdtaV9pbml0X2NtZCB7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50MzJfdCBidWZfbGVuOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdF93bWFfaGFuZGxlIC0gd21hIGNvbnRleHQKKyAqIEB3bWlfaGFuZGxlOiB3bWkgaGFuZGxlCisgKiBAaHRjX2hhbmRsZTogaHRjIGhhbmRsZQorICogQGNkc19jb250ZXh0OiBjZHMgaGFuZGxlCisgKiBAbWFjX2NvbnRleHQ6IG1hYyBjb250ZXh0CisgKiBAd21hX3JlYWR5X2V2ZW50OiB3bWEgcnggcmVhZHkgZXZlbnQKKyAqIEB3bWFfcmVzdW1lX2V2ZW50OiB3bWEgcmVzdW1lIGV2ZW50CisgKiBAdGFyZ2V0X3N1c3BlbmQ6IHRhcmdldCBzdXNwZW5kIGV2ZW50CisgKiBAcmVjb3ZlcnlfZXZlbnQ6IHdtYSBGVyByZWNvdmVyeSBldmVudAorICogQG1heF9zdGF0aW9uOiBtYXggc3RhdGlvbnMKKyAqIEBtYXhfYnNzaWQ6IG1heCBic3NpZAorICogQGZyYW1lX3hsbl9yZXFkOiBmcmFtZSB0cmFuc21pc3Npb24gcmVxdWlyZWQKKyAqIEBkcml2ZXJfdHlwZTogZHJpdmVyIHR5cGUKKyAqIEBteWFkZHI6IGN1cnJlbnQgbWFjIGFkZHJlc3MKKyAqIEBod2FkZHI6IG1hYyBhZGRyZXNzIGZyb20gRUVQUk9NCisgKiBAdGFyZ2V0X2FiaV92ZXJzOiB0YXJnZXQgZmlybXdhcmUgdmVyc2lvbgorICogQGZpbmFsX2FiaV92ZXJzOiBUaGUgZmluYWwgQUJJIHZlcnNpb24gdG8gYmUgdXNlZCBmb3IgY29tbXVuaWNhdGluZworICogQHRhcmdldF9md192ZXJzaW9uOiBUYXJnZXQgZi93IGJ1aWxkIHZlcnNpb24KKyAqIEBscHNzX3N1cHBvcnQ6IExQU1MgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgaW4gdGFyZ2V0IG9yIG5vdAorICogQHdtaV9yZWFkeTogd21pIHN0YXR1cyBmbGFnCisgKiBAd2xhbl9pbml0X3N0YXR1czogd2xhbiBpbml0IHN0YXR1cworICogQGNkZl9kZXY6IGNkZiBkZXZpY2UKKyAqIEBwaHlfY2FwYWJpbGl0eTogUEhZIENhcGFiaWxpdHkgZnJvbSBUYXJnZXQKKyAqIEBtYXhfZnJhZ19lbnRyeTogTWF4IG51bWJlciBvZiBGcmFnbWVudCBlbnRyeQorICogQHdtaV9zZXJ2aWNlX2JpdG1hcDogd21pIHNlcnZpY2VzIGJpdG1hcCByZWNlaXZlZCBmcm9tIFRhcmdldAorICogQHdsYW5fcmVzb3VyY2VfY29uZmlnOiByZXNvdXJjZSBjb25maWcKKyAqIEBmcmFtZVRyYW5zUmVxdWlyZWQ6IGZyYW1lIHRyYW5zbWlzc2lvbiByZXF1aXJlZAorICogQHdtYUdsb2JhbFN5c3RlbVJvbGU6IGdsb2JhbCBzeXN0ZW0gcm9sZQorICogQHR4X2ZybV9kb3dubG9hZF9jb21wX2NiOiBUeCBGcmFtZSBDb21wbCBDYiByZWdpc3RlcmVkIGJ5IHVtYWMKKyAqIEB0eF9mcm1fZG93bmxvYWRfY29tcF9ldmVudDogRXZlbnQgdG8gd2FpdCBmb3IgdHggZG93bmxvYWQgY29tcGxldGlvbgorICogQHR4X3F1ZXVlX2VtcHR5X2V2ZW50OiB3YWl0IGZvciB0eCBxdWV1ZSB0byBnZXQgZmx1c2hlZAorICogQHVtYWNfb3RhX2Fja19jYjogQWNrIENvbXBsZXRlIENhbGxiYWNrIHJlZ2lzdGVyZWQgYnkgdW1hYworICogQHVtYWNfZGF0YV9vdGFfYWNrX2NiOiBhY2sgY29tcGxldGUgY2FsbGJhY2sKKyAqIEBsYXN0X3VtYWNfZGF0YV9vdGFfdGltZXN0YW1wOiB0aW1lc3RhbXAgd2hlbiBPVEEgb2YgbGFzdCB1bWFjIGRhdGEgd2FzIGRvbmUKKyAqIEBsYXN0X3VtYWNfZGF0YV9uYnVmOiBjYWNoZSBuYnVmIHB0ciBmb3IgdGhlIGxhc3QgdW1hYyBkYXRhIGJ1ZgorICogQG5lZWRTaHV0ZG93bjogaXMgc2h1dGRvd24gbmVlZGVkIG9yIG5vdAorICogQG51bV9tZW1fY2h1bmtzOiBudW1iZXIgb2YgbWVtb3J5IGNodW5rCisgKiBAbWVtX2NodW5rczogbWVtb3J5IGNodW5rcworICogQHRndF9jZmdfdXBkYXRlX2NiOiBjb25maWd1cmF0aW9uIHVwZGF0ZSBjYWxsYmFjaworICogQGRmc19yYWRhcl9pbmRpY2F0aW9uX2NiOiBDYWxsYmFjayB0byBpbmRpY2F0ZSByYWRhciB0byBIREQKKyAqIEByZWdfY2FwOiByZWd1bGF0b3J5IGNhcGFibGl0aWVzCisgKiBAc2Nhbl9pZDogc2NhbiBpZAorICogQGludGVyZmFjZXM6IHR4cnggbm9kZXMocGVyIHZkZXYpCisgKiBAcGRldmNvbmZpZzogcGRldiByZWxhdGVkIGNvbmZpZ3JhdGlvbnMKKyAqIEB2ZGV2X3Jlc3BfcXVldWU6IHZkZXYgcmVzcG9uc2UgcXVldWUKKyAqIEB2ZGV2X3Jlc3BxX2xvY2s6IHZkZXYgcmVzcG9uc2UgcXVldWUgbG9jaworICogQGh0X2NhcF9pbmZvOiBIVCBjYXBhYmxpdHkgaW5mbworICogQHZodF9jYXBfaW5mbzogVkhUIGNhcGFibGl0eSBpbmZvCisgKiBAdmh0X3N1cHBfbWNzOiBWSFQgc3VwcG9ydGVkIE1DUworICogQG51bV9yZl9jaGFpbnM6IG51bWJlciBvZiBSRiBjaGFpbnMKKyAqIEB1dGZfZXZlbnRfaW5mbzogVVRGIGV2ZW50IGluZm9ybWF0aW9uCisgKiBAaXNfZndfYXNzZXJ0OiBpcyBmdyBhc3NlcnRlZAorICogQHdvdzogd293IHJlbGF0ZWQgcGF0dGVybnMgJiBwYXJhbWV0ZXJzCisgKiBAbm9fb2Zfc3VzcGVuZF9pbmQ6IG51bWJlciBvZiBzdXNwZW5kIGluZGljYXRpb25zCisgKiBAbm9fb2ZfcmVzdW1lX2luZDogbnVtYmVyIG9mIHJlc3VtZSBpbmRpY2F0aW9ucworICogQG1BcnBJbmZvOiBhcnAgaW5mbworICogQHBvd2Vyc2F2ZV9tb2RlOiBwb3dlciBzYXZlIG1vZGUKKyAqIEBwdHJuX21hdGNoX2VuYWJsZV9hbGxfdmRldjogaXMgcGF0dGVybiBtYXRjaCBpcyBlbmFibGUvZGlzYWJsZQorICogQHBHZXRSc3NpUmVxOiBnZXQgUlNTSSByZXF1ZXN0CisgKiBAdGhlcm1hbF9tZ210X2luZm86IFRoZXJtYWwgbWl0aWdhdGlvbiByZWxhdGVkIGluZm8KKyAqIEByb2FtX29mZmxvYWRfZW5hYmxlZDogaXMgcm9hbSBvZmZsb2FkIGVuYWJsZS9kaXNhYmxlCisgKiBAcm9hbV9wcmVhdXRoX3NjYW5fc3RhdGU6IHJvYW0gcHJlYXV0aCBzY2FuIHN0YXRlCisgKiBAcm9hbV9wcmVhdXRoX3NjYW5faWQ6IHJvYW0gcHJlYXV0aCBzY2FuIGlkCisgKiBAcm9hbV9wcmVhdXRoX2NoYW5mcmVxOiByb2FtIHByZWF1dGggY2hhbm5lbCBmcmVxdWVuY3kKKyAqIEByb2FtX3ByZWF1dGhfY2hhbl9jb250ZXh0OiByb2FtIHByZWF1dGggY2hhbiBjb250ZXh0CisgKiBAb2xfaW5pX2luZm86IHN0b3JlIGluaSBzdGF0dXMgb2YgYXJwIG9mZmxvYWQsIG5zIG9mZmxvYWQKKyAqIEBzc2RwOiBzc2RwIGZsYWcKKyAqIEBpYnNzX3N0YXJ0ZWQ6IGlzIElCU1Mgc3RhcnRlZCBvciBub3QKKyAqIEBpYnNza2V5X2luZm86IElCU1Mga2V5IGluZm8KKyAqIEBkZnNfaWM6IERGUyB1bWFjIGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGhkZFR4RmFpbENiOiB0eCBmYWlsIGluZGljYXRpb24gY2FsbGJhY2sKKyAqIEBwbm9fd2FrZV9sb2NrOiBQTk8gd2FrZSBsb2NrCisgKiBAZXh0c2Nhbl93YWtlX2xvY2s6IGV4dHNjYW4gd2FrZSBsb2NrCisgKiBAd293X3dha2VfbG9jazogd293IHdha2UgbG9jaworICogQHdvd19uYWNrOiB3b3cgbmVnYXRpdmUgYWNrIGZsYWcKKyAqIEBhcF9jbGllbnRfY250OiBhcCBjbGllbnQgY291bnQKKyAqIEBpc193b3dfYnVzX3N1c3BlbmRlZDogaXMgd293IGJ1cyBzdXNwZW5kZWQgZmxhZworICogQHdtYV9zY2FuX2NvbXBfdGltZXI6IHNjYW4gY29tcGxldGlvbiB0aW1lcgorICogQGRmc19waHllcnJfZmlsdGVyX29mZmxvYWQ6IGRmcyBwaHkgZXJyb3IgZmlsdGVyIGlzIG9mZmxvYWRlZCBvciBub3QKKyAqIEBzdWl0YWJsZV9hcF9oYl9mYWlsdXJlOiBiZXR0ZXIgYXAgZm91bmQKKyAqIEB3bWFfaWJzc19wb3dlcl9zYXZlX3BhcmFtczogSUJTUyBQb3dlciBTYXZlIGNvbmZpZyBQYXJhbWV0ZXJzCisgKiBASXNSQXJhdGVMaW1pdEVuYWJsZWQ6IFJBIHJhdGUgbGltaXRpIHMgZW5hYmxlZCBvciBub3QKKyAqIEBSQXJhdGVMaW1pdEludGVydmFsOiBSQSByYXRlIGxpbWl0IGludGVydmFsCisgKiBAaXNfbHBhc3NfZW5hYmxlZDogRmxhZyB0byBpbmRpY2F0ZSBpZiBMUEFTUyBmZWF0dXJlIGlzIGVuYWJsZWQgb3Igbm90CisgKiBAaXNfbmFuX2VuYWJsZWQ6IEZsYWcgdG8gaW5kaWNhdGUgaWYgTmFOIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBub3QKKyAqIEBzdGFNYXhMSU1vZER0aW06IHN0YXRpb24gbWF4IGxpc3RlbiBpbnRlcnZhbAorICogQHN0YU1vZER0aW06IHN0YXRpb24gbW9kZSBEVElNCisgKiBAc3RhRHluYW1pY0R0aW06IHN0YXRpb24gZHluYW1pYyBEVElNCisgKiBAZW5hYmxlX21oZl9vZmZsb2FkOiBpcyBNSEYgb2ZmbG9hZCBlbmFibGUvZGlzYWJsZQorICogQGxhc3RfbWhmX2VudHJpZXNfdGltZXN0YW1wOiB0aW1lc3RhbXAgd2hlbiBsYXN0IGVudHJpZXMgd2hlcmUgc2V0CisgKiBAZGZzX3ByaV9tdWx0aXBsaWVyOiBERlMgbXVsdGlwbGllcgorICogQGh3X2JkX2lkOiBoYXJkd2FyZSBib2FyZCBpZAorICogQGh3X2JkX2luZm86IGhhcmR3YXJlIGJvYXJkIGluZm8KKyAqIEBpbl9kMHdvdzogRDBXT1cgaXMgZW5hYmxlL2Rpc2FibGUKKyAqIEBtaXJhY2FzdF92YWx1ZTogbWlyYWNhc3QgdmFsdWUKKyAqIEBsb2dfY29tcGxldGlvbl90aW1lcjogbG9nIGNvbXBsZXRpb24gdGltZXIKKyAqIEBtZ210X3J4OiBtYW5hZ2VtZW50IHJ4IGNhbGxiYWNrCisgKiBAbnVtX2Ric19od19tb2RlczogTnVtYmVyIG9mIEhXIG1vZGVzIHN1cHBvcnRlZCBieSB0aGUgRlcKKyAqIEBkYnNfbW9kZTogREJTIEhXIG1vZGUgbGlzdAorICogQG9sZF9od19tb2RlX2luZGV4OiBQcmV2aW91cyBjb25maWd1cmVkIEhXIG1vZGUgaW5kZXgKKyAqIEBuZXdfaHdfbW9kZV9pbmRleDogQ3VycmVudCBjb25maWd1cmVkIEhXIG1vZGUgaW5kZXgKKyAqIEBwZWVyX2F1dGhvcml6ZWRfY2I6IHBlZXIgYXV0aG9yaXplZCBoZGQgY2FsbGJhY2sKKyAqIEBvY2JfY2FsbGJhY2s6IGNhbGxiYWNrIHRvIE9DQiBjb21tYW5kcworICogQG9jYl9yZXNwOiByZXNwb25zZSB0byBPQ0IgY29tbWFuZHMKKyAqIEB3b3dfcG5vX21hdGNoX3dha2VfdXBfY291bnQ6IFBOTyBtYXRjaCB3YWtlIHVwIGNvdW50CisgKiBAd293X3Bub19jb21wbGV0ZV93YWtlX3VwX2NvdW50OiBQTk8gY29tcGxldGUgd2FrZSB1cCBjb3VudAorICogQHdvd19nc2Nhbl93YWtlX3VwX2NvdW50OiBHc2NhbiB3YWtlIHVwIGNvdW50CisgKiBAd293X2xvd19yc3NpX3dha2VfdXBfY291bnQ6IExvdyByc3NpIHdha2UgdXAgY291bnQKKyAqIEB3b3dfcnNzaV9icmVhY2hfd2FrZV91cF9jb3VudDogUlNTSSBicmVhY2ggd2FrZSB1cCBjb3VudAorICogQHdvd191Y2FzdF93YWtlX3VwX2NvdW50OiBXb1cgdW5pY2FzdCBwYWNrZXQgd2FrZSB1cCBjb3VudAorICogQHdvd19iY2FzdF93YWtlX3VwX2NvdW50OiBXb1cgYnJvZGNhc3QgcGFja2V0IHdha2UgdXAgY291bnQKKyAqIEB3b3dfaXB2NF9tY2FzdF93YWtlX3VwX2NvdW50OiBXb1cgSVBWNCBtY2FzdCBwYWNrZXQgd2FrZSB1cCBjb3VudAorICogQHdvd19pcHY2X21jYXN0X3dha2VfdXBfY291bnQ6IFdvVyBJUFY2IG1jYXN0IHBhY2tldCB3YWtlIHVwIGNvdW50CisgKiBAd293X2lwdjZfbWNhc3RfcmFfc3RhdHM6IFdvVyBJUFY2IG1jYXN0IFJBIHBhY2tldCB3YWtlIHVwIGNvdW50CisgKiBAd293X2lwdjZfbWNhc3RfbnNfc3RhdHM6IFdvVyBJUFY2IG1jYXN0IE5TIHBhY2tldCB3YWtlIHVwIGNvdW50CisgKiBAd293X2lwdjZfbWNhc3RfbmFfc3RhdHM6IFdvVyBJUFY2IG1jYXN0IE5BIHBhY2tldCB3YWtlIHVwIGNvdW50CisgKiBAZHVhbF9tYWNfY2ZnOiBEdWFsIG1hYyBjb25maWd1cmF0aW9uIHBhcmFtcyBmb3Igc2NhbiBhbmQgZncgbW9kZQorICoKKyAqIEBtYXhfc2NhbjogIG1heGltdW0gc2NhbiByZXF1ZXN0cyB0aGFuIGNhbiBiZSBxdWV1ZWQKKyAqIFRoaXMgc3RydWN0dXJlIGlzIGdsb2JhbCB3bWEgY29udGV4dAorICogSXQgY29udGFpbnMgZ2xvYmFsIHdtYSBtb2R1bGUgcGFyYW1ldGVycyBhbmQKKyAqIGhhbmRsZSBvZiBvdGhlciBtb2R1bGVzLgorICogQHNhdmVkX3dtaV9pbml0X2NtZDogU2F2ZWQgV01JIElOSVQgY29tbWFuZAorICogQHNlcnZpY2VfcmVhZHlfZXh0X2V2dDogV2FpdCBldmVudCBmb3Igc2VydmljZSByZWFkeSBleHQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKndtaV9oYW5kbGU7CisJdm9pZCAqaHRjX2hhbmRsZTsKKwl2b2lkICpjZHNfY29udGV4dDsKKwl2b2lkICptYWNfY29udGV4dDsKKwljZGZfZXZlbnRfdCB3bWFfcmVhZHlfZXZlbnQ7CisJY2RmX2V2ZW50X3Qgd21hX3Jlc3VtZV9ldmVudDsKKwljZGZfZXZlbnRfdCB0YXJnZXRfc3VzcGVuZDsKKwljZGZfZXZlbnRfdCByZWNvdmVyeV9ldmVudDsKKwl1aW50MTZfdCBtYXhfc3RhdGlvbjsKKwl1aW50MTZfdCBtYXhfYnNzaWQ7CisJdWludDMyX3QgZnJhbWVfeGxuX3JlcWQ7CisJdF93bWFfZHJ2X3R5cGUgZHJpdmVyX3R5cGU7CisJdWludDhfdCBteWFkZHJbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IGh3YWRkcltJRUVFODAyMTFfQUREUl9MRU5dOworCXdtaV9hYmlfdmVyc2lvbiB0YXJnZXRfYWJpX3ZlcnM7CisJd21pX2FiaV92ZXJzaW9uIGZpbmFsX2FiaV92ZXJzOworCXVpbnQzMl90IHRhcmdldF9md192ZXJzaW9uOworI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisJdWludDhfdCBscHNzX3N1cHBvcnQ7CisjZW5kaWYKKwl1aW50OF90IGFwX2FycG5zX3N1cHBvcnQ7CisJYm9vbCB3bWlfcmVhZHk7CisJdWludDMyX3Qgd2xhbl9pbml0X3N0YXR1czsKKwljZGZfZGV2aWNlX3QgY2RmX2RldjsKKwl1aW50MzJfdCBwaHlfY2FwYWJpbGl0eTsKKwl1aW50MzJfdCBtYXhfZnJhZ19lbnRyeTsKKwl1aW50MzJfdCB3bWlfc2VydmljZV9iaXRtYXBbV01JX1NFUlZJQ0VfQk1fU0laRV07CisJd21pX3Jlc291cmNlX2NvbmZpZyB3bGFuX3Jlc291cmNlX2NvbmZpZzsKKwl1aW50MzJfdCBmcmFtZVRyYW5zUmVxdWlyZWQ7CisJdEJzc1N5c3RlbVJvbGUgd21hR2xvYmFsU3lzdGVtUm9sZTsKKwlwV01BVHhSeENvbXBGdW5jIHR4X2ZybV9kb3dubG9hZF9jb21wX2NiOworCWNkZl9ldmVudF90IHR4X2ZybV9kb3dubG9hZF9jb21wX2V2ZW50OworCS8qCisJICogRHVtbXkgZXZlbnQgdG8gd2FpdCBmb3IgZHJhaW5pbmcgTVNEVXMgbGVmdCBpbiBoYXJkd2FyZSB0eAorCSAqIHF1ZXVlIGFuZCBiZWZvcmUgcmVxdWVzdGluZyBWREVWX1NUT1AuIE5vYm9keSB3aWxsIHNldCB0aGlzCisJICogYW5kIHdhaXQgd2lsbCB0aW1lb3V0LCBhbmQgY29kZSB3aWxsIHBvbGwgdGhlIHBlbmRpbmcgdHgKKwkgKiBkZXNjcmlwdG9ycyBudW1iZXIgdG8gYmUgemVyby4KKwkgKi8KKwljZGZfZXZlbnRfdCB0eF9xdWV1ZV9lbXB0eV9ldmVudDsKKwlwV01BQWNrRm5UeENvbXAgdW1hY19vdGFfYWNrX2NiW1NJUl9NQUNfTUdNVF9SRVNFUlZFRDE1XTsKKwlwV01BQWNrRm5UeENvbXAgdW1hY19kYXRhX290YV9hY2tfY2I7CisJdl9USU1FX3QgbGFzdF91bWFjX2RhdGFfb3RhX3RpbWVzdGFtcDsKKwljZGZfbmJ1Zl90IGxhc3RfdW1hY19kYXRhX25idWY7CisJYm9vbCBuZWVkU2h1dGRvd247CisJdWludDMyX3QgbnVtX21lbV9jaHVua3M7CisJc3RydWN0IHdtYV9tZW1fY2h1bmsgbWVtX2NodW5rc1tNQVhfTUVNX0NIVU5LU107CisJd21hX3RndF9jZmdfY2IgdGd0X2NmZ191cGRhdGVfY2I7CisJd21hX2Rmc19yYWRhcl9pbmRpY2F0aW9uX2NiIGRmc19yYWRhcl9pbmRpY2F0aW9uX2NiOworCUhBTF9SRUdfQ0FQQUJJTElUSUVTIHJlZ19jYXA7CisJdWludDMyX3Qgc2Nhbl9pZDsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaW50ZXJmYWNlczsKKwlwZGV2X2NsaV9jb25maWdfdCBwZGV2Y29uZmlnOworCXN0cnVjdCBsaXN0X2hlYWQgdmRldl9yZXNwX3F1ZXVlOworCWNkZl9zcGlubG9ja190IHZkZXZfcmVzcHFfbG9jazsKKwljZGZfbGlzdF90IHdtYV9ob2xkX3JlcV9xdWV1ZTsKKwljZGZfc3BpbmxvY2tfdCB3bWFfaG9sZF9yZXFfcV9sb2NrOworCXVpbnQzMl90IGh0X2NhcF9pbmZvOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJdWludDMyX3Qgdmh0X2NhcF9pbmZvOworCXVpbnQzMl90IHZodF9zdXBwX21jczsKKyNlbmRpZgorCXVpbnQzMl90IG51bV9yZl9jaGFpbnM7CisjaWYgZGVmaW5lZChRQ0FfV0lGSV9GVE0pCisJc3RydWN0IHV0Zl9ldmVudF9pbmZvIHV0Zl9ldmVudF9pbmZvOworI2VuZGlmCisJdWludDhfdCBpc19md19hc3NlcnQ7CisJc3RydWN0IHdtYV93b3cgd293OworCXVpbnQ4X3Qgbm9fb2Zfc3VzcGVuZF9pbmQ7CisJdWludDhfdCBub19vZl9yZXN1bWVfaW5kOworCS8qIEhhdmUgYSBiYWNrIHVwIG9mIGFycCBpbmZvIHRvIHNlbmQgYWxvbmcKKwkgKiB3aXRoIG5zIGluZm8gc3VwcG9zZSBpZiBucyBhbHNvIGVuYWJsZWQKKwkgKi8KKwl0U2lySG9zdE9mZmxvYWRSZXEgbUFycEluZm87CisJc3RydWN0IHdtYV90eF9hY2tfd29ya19jdHggKmFja193b3JrX2N0eDsKKwl1aW50OF90IHBvd2Vyc2F2ZV9tb2RlOworCWJvb2wgcHRybl9tYXRjaF9lbmFibGVfYWxsX3ZkZXY7CisJdm9pZCAqcEdldFJzc2lSZXE7CisJdF90aGVybWFsX21nbXQgdGhlcm1hbF9tZ210X2luZm87CisJYm9vbCByb2FtX29mZmxvYWRfZW5hYmxlZDsKKwl0X3dtYV9yb2FtX3ByZWF1dGhfY2hhbl9zdGF0ZV90IHJvYW1fcHJlYXV0aF9zY2FuX3N0YXRlOworCXVpbnQzMl90IHJvYW1fcHJlYXV0aF9zY2FuX2lkOworCXVpbnQxNl90IHJvYW1fcHJlYXV0aF9jaGFuZnJlcTsKKwl2b2lkICpyb2FtX3ByZWF1dGhfY2hhbl9jb250ZXh0OworCS8qIEhlcmUgb2xfaW5pX2luZm8gaXMgdXNlZCB0byBzdG9yZSBpbmkKKwkgKiBzdGF0dXMgb2YgYXJwIG9mZmxvYWQsIG5zIG9mZmxvYWQKKwkgKiBhbmQgb3RoZXJzLiBDdXJyZW50bHkgMXN0IGJpdCBpcyB1c2VkCisJICogZm9yIGFycCBvZmYgbG9hZCBhbmQgMm5kIGJpdCBmb3IgbnMKKwkgKiBvZmZsb2FkIGN1cnJlbnRseSwgcmVzdCBiaXRzIGFyZSB1bnVzZWQKKwkgKi8KKwl1aW50OF90IG9sX2luaV9pbmZvOworCWJvb2wgc3NkcDsKKwl1aW50OF90IGlic3Nfc3RhcnRlZDsKKwl0U2V0QnNzS2V5UGFyYW1zIGlic3NrZXlfaW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExY29tICpkZnNfaWM7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwljZGZfd2FrZV9sb2NrX3QgcG5vX3dha2VfbG9jazsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisJY2RmX3dha2VfbG9ja190IGV4dHNjYW5fd2FrZV9sb2NrOworI2VuZGlmCisJY2RmX3dha2VfbG9ja190IHdvd193YWtlX2xvY2s7CisJaW50IHdvd19uYWNrOworCWNkZl9hdG9taWNfdCBpc193b3dfYnVzX3N1c3BlbmRlZDsKKwljZGZfbWNfdGltZXJfdCB3bWFfc2Nhbl9jb21wX3RpbWVyOworCXVpbnQ4X3QgZGZzX3BoeWVycl9maWx0ZXJfb2ZmbG9hZDsKKwlib29sIHN1aXRhYmxlX2FwX2hiX2ZhaWx1cmU7CisJaWJzc19wb3dlcl9zYXZlX3BhcmFtcyB3bWFfaWJzc19wb3dlcl9zYXZlX3BhcmFtczsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fUkFfRklMVEVSSU5HCisJYm9vbCBJc1JBcmF0ZUxpbWl0RW5hYmxlZDsKKwl1aW50MTZfdCBSQXJhdGVMaW1pdEludGVydmFsOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX0xQU1MKKwlib29sIGlzX2xwYXNzX2VuYWJsZWQ7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkFOCisJYm9vbCBpc19uYW5fZW5hYmxlZDsKKyNlbmRpZgorCXVpbnQ4X3Qgc3RhTWF4TElNb2REdGltOworCXVpbnQ4X3Qgc3RhTW9kRHRpbTsKKwl1aW50OF90IHN0YUR5bmFtaWNEdGltOworCWludDMyX3QgZGZzX3ByaV9tdWx0aXBsaWVyOworCXVpbnQzMl90IGh3X2JkX2lkOworCXVpbnQzMl90IGh3X2JkX2luZm9bSFdfQkRfSU5GT19TSVpFXTsKKwl1aW50MzJfdCBtaXJhY2FzdF92YWx1ZTsKKwljZGZfbWNfdGltZXJfdCBsb2dfY29tcGxldGlvbl90aW1lcjsKKwl3bWFfbWdtdF9mcmFtZV9yeF9jYWxsYmFjayBtZ210X3J4OworCXVpbnQzMl90IG51bV9kYnNfaHdfbW9kZXM7CisJc3RydWN0IGRic19od19tb2RlX2luZm8gaHdfbW9kZTsKKwl1aW50MzJfdCBvbGRfaHdfbW9kZV9pbmRleDsKKwl1aW50MzJfdCBuZXdfaHdfbW9kZV9pbmRleDsKKwljZGZfYXRvbWljX3Qgc2Nhbl9pZF9jb3VudGVyOworCXdtYV9wZWVyX2F1dGhvcml6ZWRfZnAgcGVlcl9hdXRob3JpemVkX2NiOworCXVpbnQzMl90IG51bV9vZl9kaWFnX2V2ZW50c19sb2dzOworCXVpbnQzMl90ICpldmVudHNfbG9nc19saXN0OworCisJdWludDMyX3Qgd293X3Bub19tYXRjaF93YWtlX3VwX2NvdW50OworCXVpbnQzMl90IHdvd19wbm9fY29tcGxldGVfd2FrZV91cF9jb3VudDsKKwl1aW50MzJfdCB3b3dfZ3NjYW5fd2FrZV91cF9jb3VudDsKKwl1aW50MzJfdCB3b3dfbG93X3Jzc2lfd2FrZV91cF9jb3VudDsKKwl1aW50MzJfdCB3b3dfcnNzaV9icmVhY2hfd2FrZV91cF9jb3VudDsKKwl1aW50MzJfdCB3b3dfdWNhc3Rfd2FrZV91cF9jb3VudDsKKwl1aW50MzJfdCB3b3dfYmNhc3Rfd2FrZV91cF9jb3VudDsKKwl1aW50MzJfdCB3b3dfaXB2NF9tY2FzdF93YWtlX3VwX2NvdW50OworCXVpbnQzMl90IHdvd19pcHY2X21jYXN0X3dha2VfdXBfY291bnQ7CisJdWludDMyX3Qgd293X2lwdjZfbWNhc3RfcmFfc3RhdHM7CisJdWludDMyX3Qgd293X2lwdjZfbWNhc3RfbnNfc3RhdHM7CisJdWludDMyX3Qgd293X2lwdjZfbWNhc3RfbmFfc3RhdHM7CisKKwkvKiBPQ0IgcmVxdWVzdCBjb250ZXh0cyAqLworCXN0cnVjdCBzaXJfb2NiX2NvbmZpZyAqb2NiX2NvbmZpZ19yZXE7CisJc3RydWN0IGR1YWxfbWFjX2NvbmZpZyBkdWFsX21hY19jZmc7CisJc3RydWN0IHsKKwkJdWludDE2X3QgcG9vbF9zaXplOworCQl1aW50MTZfdCBudW1fZnJlZTsKKwkJdW5pb24gd21pX2Rlc2NfZWxlbV90ICphcnJheTsKKwkJdW5pb24gd21pX2Rlc2NfZWxlbV90ICpmcmVlbGlzdDsKKwkJY2RmX3NwaW5sb2NrX3Qgd21pX2Rlc2NfcG9vbF9sb2NrOworCX0gd21pX2Rlc2NfcG9vbDsKKwl1aW50OF90IG1heF9zY2FuOworCXN0cnVjdCB3bWlfaW5pdF9jbWQgc2F2ZWRfd21pX2luaXRfY21kOworCWNkZl9ldmVudF90IHNlcnZpY2VfcmVhZHlfZXh0X2V2dDsKKwl1aW50MTZfdCBzZWxmX2dlbl9mcm1fcHdyOworCWJvb2wgdHhfY2hhaW5fbWFza19jY2s7Cit9IHRfd21hX2hhbmRsZSwgKnRwX3dtYV9oYW5kbGU7CisKKy8qKgorICogc3RydWN0IHdtYV90YXJnZXRfY2FwIC0gdGFyZ2V0IGNhcGFiYWxpdHkKKyAqIEB3bWlfc2VydmljZV9iaXRtYXA6IHdtaSBzZXJ2aWNlcyBiaXRtYXAKKyAqIEB3bGFuX3Jlc291cmNlX2NvbmZpZzogcmVzb3VyY2UgY29uZmlnCisgKi8KK3N0cnVjdCB3bWFfdGFyZ2V0X2NhcCB7CisgICAgICAgIC8qIHdtaSBzZXJ2aWNlcyBiaXRtYXAgcmVjZWl2ZWQgZnJvbSBUYXJnZXQgKi8KKwl1aW50MzJfdCB3bWlfc2VydmljZV9iaXRtYXBbV01JX1NFUlZJQ0VfQk1fU0laRV07CisgICAgICAgIC8qIGRlZmF1bHQgcmVzb3VyY2UgY29uZmlnLHRoZSBvcyBzaGltIGNhbiBvdmVyd3JpdGUgaXQgKi8KKwl3bWlfcmVzb3VyY2VfY29uZmlnIHdsYW5fcmVzb3VyY2VfY29uZmlnOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdF93bWFfc3RhcnRfcmVxIC0gd21hIHN0YXJ0IHJlcXVlc3QgcGFyYW1ldGVycworICogQHBDb25maWdCdWZmZXI6IGNvbmZpZyBidWZmZXIKKyAqIEB1c0NvbmZpZ0J1ZmZlckxlbjogTGVuZ3RoIG9mIHRoZSBjb25maWcgYnVmZmVyIGFib3ZlCisgKiBAZHJpdmVyX3R5cGU6IFByb2R1Y3Rpb24gb3IgRlRNIGRyaXZlcgorICogQHBVc2VyRGF0YTogdXNlciBkYXRhCisgKiBAcEluZFVzZXJEYXRhOiBpbmRpY2F0aW9uIGZ1bmN0aW9uIHBvaW50ZXIgdG8gc2VuZCB0byBVTUFDCisgKgorICogVGhlIHNoYXJlZCBtZW1vcnkgYmV0d2VlbiBXREkgYW5kIEhBTCBpcyA0SyBzbyBtYXhpbXVtIGRhdGEgY2FuIGJlCisgKiB0cmFuc2ZlcnJlZCBmcm9tIFdESSB0byBIQUwgaXMgNEsKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKnBDb25maWdCdWZmZXI7CisJdWludDE2X3QgdXNDb25maWdCdWZmZXJMZW47CisJdF93bWFfZHJ2X3R5cGUgZHJpdmVyX3R5cGU7CisJdm9pZCAqcFVzZXJEYXRhOworCXZvaWQgKnBJbmRVc2VyRGF0YTsKK30gdF93bWFfc3RhcnRfcmVxOworCisvKiBFbnVtZXJhdGlvbiBmb3IgVmVyc2lvbiAqLwordHlwZWRlZiBlbnVtIHsKKwlXTEFOX0hBTF9NU0dfVkVSU0lPTjAgPSAwLAorCVdMQU5fSEFMX01TR19WRVJTSU9OMSA9IDEsCisJV0xBTl9IQUxfTVNHX1dDTlNTX0NUUkxfVkVSU0lPTiA9IDB4N0ZGRiwgICAvKmRlZmluZSBhcyAyIGJ5dGVzIGRhdGEgKi8KKwlXTEFOX0hBTF9NU0dfVkVSU0lPTl9NQVhfRklFTEQgPSBXTEFOX0hBTF9NU0dfV0NOU1NfQ1RSTF9WRVJTSU9OCit9IHRIYWxIb3N0TXNnVmVyc2lvbjsKKworLyoqCisgKiBzdHJ1Y3Qgc0hhbE1hY1N0YXJ0UGFyYW1ldGVyIC0gbWFjIHN0YXJ0IHJlcXVlc3QgcGFyYW1ldGVycworICogQGRyaXZlclR5cGU6IGRyaXZlciB0eXBlIChwcm9kdWN0aW9uL0ZUTSkKKyAqIEB1Q29uZmlnQnVmZmVyTGVuOiBsZW5ndGggb2YgY29uZmlnIGJ1ZmZlcgorICovCit0eXBlZGVmIHN0cnVjdCBjZGZfcGFja2VkIHNIYWxNYWNTdGFydFBhcmFtZXRlciB7CisJdERyaXZlclR5cGUgZHJpdmVyVHlwZTsKKwl1aW50MzJfdCB1Q29uZmlnQnVmZmVyTGVuOworCisJLyogRm9sbG93aW5nIHRoaXMgdGhlcmUgaXMgYSBUTFYgZm9ybWF0dGVkIGJ1ZmZlciBvZiBsZW5ndGgKKwkgKiAidUNvbmZpZ0J1ZmZlckxlbiIgYnl0ZXMgY29udGFpbmluZyBhbGwgY29uZmlnIHZhbHVlcy4KKwkgKiBUaGUgVExWIGlzIGV4cGVjdGVkIHRvIGJlIGZvcm1hdHRlZCBsaWtlIHRoaXM6CisJICogMCAgICAgICAgICAgMTUgICAgICAgICAgICAzMSAgICAgICAgICAgMzErQ0ZHX0xFTi0xICAgICAgICBsZW5ndGgtMQorCSAqIHwgICBDRkdfSUQgICB8ICAgQ0ZHX0xFTiAgIHwgICBDRkdfQk9EWSAgICB8ICBDRkdfSUQgIHwuLi4uLi58CisJICovCit9IHRIYWxNYWNTdGFydFBhcmFtZXRlciwgKnRwSGFsTWFjU3RhcnRQYXJhbWV0ZXI7CisKK2V4dGVybiB2b2lkIGNkc193bWFfY29tcGxldGVfY2JhY2sodm9pZCAqcF9jZHNfY29udGV4dCk7CitleHRlcm4gdm9pZCB3bWFfc2VuZF9yZWdkb21haW5faW5mb190b19mdyh1aW50MzJfdCByZWdfZG1uLCB1aW50MTZfdCByZWdkbW4yRywKKwkJCQkJICB1aW50MTZfdCByZWdkbW41RywgaW50OF90IGN0bDJHLAorCQkJCQkgIGludDhfdCBjdGw1Ryk7Cit2b2lkIHdtYV9nZXRfbW9kZXNlbGVjdCh0cF93bWFfaGFuZGxlIHdtYSwgdWludDMyX3QgKm1vZGVTZWxlY3QpOworCisvKioKKyAqIGVudW0gZnJhbWVfaW5kZXggLSBGcmFtZSBpbmRleAorICogQEdFTkVSSUNfTk9ET1dOTERfTk9BQ0tfQ09NUF9JTkRFWDogRnJhbWUgaW5kZXggZm9yIG5vIGRvd25sb2FkIGNvbXAgbm8gYWNrCisgKiBAR0VORVJJQ19ET1dOTERfQ09NUF9OT0FDS19DT01QX0lOREVYOiBGcmFtZSBpbmRleCBmb3IgZG93bmxvYWQgY29tcCBubyBhY2sKKyAqIEBHRU5FUklDX0RPV05MRF9DT01QX0FDS19DT01QX0lOREVYOiBGcmFtZSBpbmRleCBmb3IgZG93bmxvYWQgY29tcCBhbmQgYWNrCisgKiBAR0VORVJJQ19OT0RPV0xPQURfQUNLX0NPTVBfSU5ERVg6IEZyYW1lIGluZGV4IGZvciBubyBkb3dubG9hZCBjb21wIGFuZCBhY2sKKyAqIEBGUkFNRV9JTkRFWF9NQVg6IG1heGltdW0gZnJhbWUgaW5kZXgKKyAqLworZW51bSBmcmFtZV9pbmRleCB7CisJR0VORVJJQ19OT0RPV05MRF9OT0FDS19DT01QX0lOREVYLAorCUdFTkVSSUNfRE9XTkxEX0NPTVBfTk9BQ0tfQ09NUF9JTkRFWCwKKwlHRU5FUklDX0RPV05MRF9DT01QX0FDS19DT01QX0lOREVYLAorCUdFTkVSSUNfTk9ET1dMT0FEX0FDS19DT01QX0lOREVYLAorCUZSQU1FX0lOREVYX01BWAorfTsKKworLyoqCisgKiBzdHJ1Y3Qgd21hX3R4X2Fja193b3JrX2N0eCAtIHR4IGFjayB3b3JrIGNvbnRleHQKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAc3ViX3R5cGU6IHN1YiB0eXBlCisgKiBAc3RhdHVzOiBzdGF0dXMKKyAqIEBhY2tfY21wX3dvcms6IHdvcmsgc3RydWN0dXJlCisgKi8KK3N0cnVjdCB3bWFfdHhfYWNrX3dvcmtfY3R4IHsKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGU7CisJdWludDE2X3Qgc3ViX3R5cGU7CisJaW50MzJfdCBzdGF0dXM7CisJc3RydWN0IHdvcmtfc3RydWN0IGFja19jbXBfd29yazsKK307CisKKy8qKgorICogc3RydWN0IHdtYV90YXJnZXRfcmVxIC0gdGFyZ2V0IHJlcXVlc3QgcGFyYW1ldGVycworICogQGV2ZW50X3RpbWVvdXQ6IGV2ZW50IHRpbWVvdXQKKyAqIEBub2RlOiBsaXN0CisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEKKyAqIEBtc2dfdHlwZTogbWVzc2FnZSB0eXBlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHR5cGU6IHR5cGUKKyAqLworc3RydWN0IHdtYV90YXJnZXRfcmVxIHsKKwljZGZfbWNfdGltZXJfdCBldmVudF90aW1lb3V0OworCWNkZl9saXN0X25vZGVfdCBub2RlOworCXZvaWQgKnVzZXJfZGF0YTsKKwl1aW50MzJfdCBtc2dfdHlwZTsKKwl1aW50OF90IHZkZXZfaWQ7CisJdWludDhfdCB0eXBlOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgd21hX3ZkZXZfc3RhcnRfcmVxIC0gdmRldiBzdGFydCByZXF1ZXN0IHBhcmFtZXRlcnMKKyAqIEBiZWFjb25faW50dmFsOiBiZWFjb24gaW50ZXJ2YWwKKyAqIEBkdGltX3BlcmlvZDogZHRpbSBwZXJpb2QKKyAqIEBtYXhfdHhwb3c6IG1heCB0eCBwb3dlcgorICogQGNoYW5fb2Zmc2V0OiBjaGFubmVsIG9mZnNldAorICogQGlzX2RmczogaXMgZGZzIHN1cHBvcnRlZCBvciBub3QKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAY2hhbjogY2hhbm5lbAorICogQG9wZXJfbW9kZTogb3BlcmF0aW5nIG1vZGUKKyAqIEBzc2lkOiBzc2lkCisgKiBAaGlkZGVuX3NzaWQ6IGhpZGRlbiBzc2lkCisgKiBAcG1mX2VuYWJsZWQ6IGlzIHBtZiBlbmFibGVkIG9yIG5vdAorICogQHZodF9jYXBhYmxlOiBWSFQgY2FwYWJhbGl0eQorICogQGh0X2NhcGFibGU6IEhUIGNhcGFiYWxpdHkKKyAqIEBkZnNfcHJpX211bHRpcGxpZXI6IERGUyBtdWx0aXBsaWVyCisgKiBAZG90MTFfbW9kZTogODAyLjExIG1vZGUKKyAqIEBpc19oYWxmX3JhdGU6IGlzIHRoZSBjaGFubmVsIG9wZXJhdGluZyBhdCAxME1IegorICogQGlzX3F1YXJ0ZXJfcmF0ZTogaXMgdGhlIGNoYW5uZWwgb3BlcmF0aW5nIGF0IDVNSHoKKyAqIEBwcmVmZXJyZWRfdHhfc3RyZWFtczogcG9saWN5IG1hbmFnZXIgaW5kaWNhdGVzIHRoZSBwcmVmZXJyZWQKKyAqCQkJbnVtYmVyIG9mIHRyYW5zbWl0IHN0cmVhbXMKKyAqIEBwcmVmZXJyZWRfcnhfc3RyZWFtczogcG9saWN5IG1hbmFnZXIgaW5kaWNhdGVzIHRoZSBwcmVmZXJyZWQKKyAqCQkJbnVtYmVyIG9mIHJlY2VpdmUgc3RyZWFtcworICovCitzdHJ1Y3Qgd21hX3ZkZXZfc3RhcnRfcmVxIHsKKwl1aW50MzJfdCBiZWFjb25faW50dmFsOworCXVpbnQzMl90IGR0aW1fcGVyaW9kOworCWludDMyX3QgbWF4X3R4cG93OworCXBoeV9jaF93aWR0aCBjaGFuX3dpZHRoOworCWJvb2wgaXNfZGZzOworCXVpbnQ4X3QgdmRldl9pZDsKKwl1aW50OF90IGNoYW47CisJdWludDhfdCBvcGVyX21vZGU7CisJdFNpck1hY1NTaWQgc3NpZDsKKwl1aW50OF90IGhpZGRlbl9zc2lkOworCXVpbnQ4X3QgcG1mX2VuYWJsZWQ7CisJdWludDhfdCB2aHRfY2FwYWJsZTsKKwl1aW50OF90IGNoX2NlbnRlcl9mcmVxX3NlZzA7CisJdWludDhfdCBjaF9jZW50ZXJfZnJlcV9zZWcxOworCXVpbnQ4X3QgaHRfY2FwYWJsZTsKKwlpbnQzMl90IGRmc19wcmlfbXVsdGlwbGllcjsKKwl1aW50OF90IGRvdDExX21vZGU7CisJYm9vbCBpc19oYWxmX3JhdGU7CisJYm9vbCBpc19xdWFydGVyX3JhdGU7CisJdWludDMyX3QgcHJlZmVycmVkX3R4X3N0cmVhbXM7CisJdWludDMyX3QgcHJlZmVycmVkX3J4X3N0cmVhbXM7Cit9OworCisvKioKKyAqIHN0cnVjdCB3bWFfc2V0X2tleV9wYXJhbXMgLSBzZXQga2V5IHBhcmFtZXRlcnMKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAZGVmX2tleV9pZHg6IHVzZWQgdG8gc2VlIGlmIHdlIGhhdmUgdG8gcmVhZCB0aGUga2V5IGZyb20gY2ZnCisgKiBAa2V5X2xlbjoga2V5IGxlbmd0aAorICogQHBlZXJfbWFjOiBwZWVyIG1hYyBhZGRyZXNzCisgKiBAc2luZ2xfdGlkX3JjOiAxPVNpbmdsZSBUSUQgYmFzZWQgUmVwbGF5IENvdW50LCAwPVBlciBUSUQgYmFzZWQgUkMKKyAqIEBrZXlfdHlwZToga2V5IHR5cGUKKyAqIEBrZXlfaWR4OiBrZXkgaW5kZXgKKyAqIEB1bmljYXN0OiB1bmljYXN0IGZsYWcKKyAqIEBrZXlfZGF0YToga2V5IGRhdGEKKyAqLworc3RydWN0IHdtYV9zZXRfa2V5X3BhcmFtcyB7CisJdWludDhfdCB2ZGV2X2lkOworCS8qIGRlZl9rZXlfaWR4IGNhbiBiZSB1c2VkIHRvIHNlZSBpZiB3ZSBoYXZlIHRvIHJlYWQgdGhlIGtleSBmcm9tIGNmZyAqLworCXVpbnQzMl90IGRlZl9rZXlfaWR4OworCXVpbnQxNl90IGtleV9sZW47CisJdWludDhfdCBwZWVyX21hY1tJRUVFODAyMTFfQUREUl9MRU5dOworCXVpbnQ4X3Qgc2luZ2xfdGlkX3JjOworCWVudW0gZUFuaUVkVHlwZSBrZXlfdHlwZTsKKwl1aW50MzJfdCBrZXlfaWR4OworCWJvb2wgdW5pY2FzdDsKKwl1aW50OF90IGtleV9kYXRhW1NJUl9NQUNfTUFYX0tFWV9MRU5HVEhdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdF90aGVybWFsX2NtZF9wYXJhbXMgLSB0aGVybWFsIGNvbW1hbmQgcGFyYW1ldGVycworICogQG1pblRlbXA6IG1pbmltdW0gdGVtcHJhdHVyZQorICogQG1heFRlbXA6IG1heGltdW0gdGVtcHJhdHVyZQorICogQHRoZXJtYWxFbmFibGU6IHRoZXJtYWwgZW5hYmxlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBtaW5UZW1wOworCXVpbnQxNl90IG1heFRlbXA7CisJdWludDhfdCB0aGVybWFsRW5hYmxlOworfSB0X3RoZXJtYWxfY21kX3BhcmFtcywgKnRwX3RoZXJtYWxfY21kX3BhcmFtczsKKworLyoqCisgKiBlbnVtIHdtYV9jZmdfY21kX2lkIC0gd21hIGNtZCBpZHMKKyAqIEBXTUFfVkRFVl9UWFJYX0ZXU1RBVFNfRU5BQkxFX0NNRElEOiB0eHJ4IGZpcm13YXJlIHN0YXRzIGVuYWJsZSBjb21tYW5kCisgKiBAV01BX1ZERVZfVFhSWF9GV1NUQVRTX1JFU0VUX0NNRElEOiB0eHJ4IGZpcm13YXJlIHN0YXRzIHJlc2V0IGNvbW1hbmQKKyAqIEBXTUFfVkRFVl9NQ0NfU0VUX1RJTUVfTEFURU5DWTogc2V0IE1DQyBsYXRlbmN5IHRpbWUKKyAqIEBXTUFfVkRFVl9NQ0NfU0VUX1RJTUVfUVVPVEE6IHNldCBNQ0MgdGltZSBxdW90YQorICogQFdNQV9WREVWX0lCU1NfU0VUX0FUSU1fV0lORE9XX1NJWkU6IHNldCBJQlNTIEFUSU0gd2luZG93IHNpemUKKyAqIEBXTUFfVkRFVl9JQlNTX1NFVF9QT1dFUl9TQVZFX0FMTE9XRUQ6IHNldCBJQlNTIGVuYWJsZSBwb3dlciBzYXZlCisgKiBAV01BX1ZERVZfSUJTU19TRVRfUE9XRVJfQ09MTEFQU0VfQUxMT1dFRDogc2V0IElCU1MgcG93ZXIgY29sbGFwc2UgZW5hYmxlCisgKiBAV01BX1ZERVZfSUJTU19TRVRfQVdBS0VfT05fVFhfUlg6IGF3YWtlIElCU1Mgb24gVFgvUlgKKyAqIEBXTUFfVkRFVl9JQlNTX1NFVF9JTkFDVElWSVRZX1RJTUU6IHNldCBJQlNTIGluYWN0aXZpdHkgdGltZQorICogQFdNQV9WREVWX0lCU1NfU0VUX1RYU1BfRU5EX0lOQUNUSVZJVFlfVElNRTogc2V0IElCU1MgVFhTUAorICogQFdNQV9WREVWX0lCU1NfUFNfU0VUX1dBUk1VUF9USU1FX1NFQ1M6IHNldCBJQlNTIHBvd2VyIHNhdmUgd2FybXVwIHRpbWUKKyAqIEBXTUFfVkRFVl9JQlNTX1BTX1NFVF8xUlhfQ0hBSU5fSU5fQVRJTV9XSU5ET1c6IHNldCBJQlNTIHBvd2VyIHNhdmUgQVRJTQorICogQFdNQV9WREVWX0RGU19DT05UUk9MX0NNRElEOiBERlMgY29udHJvbCBjb21tYW5kCisgKiBAV01BX1ZERVZfVFhSWF9HRVRfSVBBX1VDX0ZXX1NUQVRTX0NNRElEOiBnZXQgSVBBIG1pY3JvY29udHJvbGxlciBmdyBzdGF0cworICoKKyAqIHdtYSBjb21tYW5kIGlkcyBmb3IgY29uZmlndXJhdGlvbiByZXF1ZXN0IHdoaWNoCisgKiBkb2VzIG5vdCBpbnZvbHZlIHNlbmRpbmcgYSB3bWkgY29tbWFuZC4KKyAqLworZW51bSB3bWFfY2ZnX2NtZF9pZCB7CisJV01BX1ZERVZfVFhSWF9GV1NUQVRTX0VOQUJMRV9DTURJRCA9IFdNSV9DTURJRF9NQVgsCisJV01BX1ZERVZfVFhSWF9GV1NUQVRTX1JFU0VUX0NNRElELAorCVdNQV9WREVWX01DQ19TRVRfVElNRV9MQVRFTkNZLAorCVdNQV9WREVWX01DQ19TRVRfVElNRV9RVU9UQSwKKwlXTUFfVkRFVl9JQlNTX1NFVF9BVElNX1dJTkRPV19TSVpFLAorCVdNQV9WREVWX0lCU1NfU0VUX1BPV0VSX1NBVkVfQUxMT1dFRCwKKwlXTUFfVkRFVl9JQlNTX1NFVF9QT1dFUl9DT0xMQVBTRV9BTExPV0VELAorCVdNQV9WREVWX0lCU1NfU0VUX0FXQUtFX09OX1RYX1JYLAorCVdNQV9WREVWX0lCU1NfU0VUX0lOQUNUSVZJVFlfVElNRSwKKwlXTUFfVkRFVl9JQlNTX1NFVF9UWFNQX0VORF9JTkFDVElWSVRZX1RJTUUsCisJV01BX1ZERVZfSUJTU19QU19TRVRfV0FSTVVQX1RJTUVfU0VDUywKKwlXTUFfVkRFVl9JQlNTX1BTX1NFVF8xUlhfQ0hBSU5fSU5fQVRJTV9XSU5ET1csCisJV01BX1ZERVZfREZTX0NPTlRST0xfQ01ESUQsCisJV01BX1ZERVZfVFhSWF9HRVRfSVBBX1VDX0ZXX1NUQVRTX0NNRElELAorCVdNQV9DTURfSURfTUFYCit9OworCisvKioKKyAqIHN0cnVjdCB3bWFfdHJpZ2dlcl91YXBzZF9wYXJhbXMgLSB0cmlnZ2VyIHVhcHNkIHBhcmFtZXRlcnMKKyAqIEB3bW1fYWM6IHdtbSBhY2Nlc3MgY2F0YWdvcnkKKyAqIEB1c2VyX3ByaW9yaXR5OiB1c2VyIHByaW9yaXR5CisgKiBAc2VydmljZV9pbnRlcnZhbDogc2VydmljZSBpbnRlcnZhbAorICogQHN1c3BlbmRfaW50ZXJ2YWw6IHN1c3BlbmQgaW50ZXJ2YWwKKyAqIEBkZWxheV9pbnRlcnZhbDogZGVsYXkgaW50ZXJ2YWwKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgd21hX3RyaWdnZXJfdWFwc2RfcGFyYW1zIHsKKwl1aW50MzJfdCB3bW1fYWM7CisJdWludDMyX3QgdXNlcl9wcmlvcml0eTsKKwl1aW50MzJfdCBzZXJ2aWNlX2ludGVydmFsOworCXVpbnQzMl90IHN1c3BlbmRfaW50ZXJ2YWw7CisJdWludDMyX3QgZGVsYXlfaW50ZXJ2YWw7Cit9IHRfd21hX3RyaWdnZXJfdWFwc2RfcGFyYW1zLCAqdHBfd21hX3RyaWdnZXJfdWFwc2RfcGFyYW1zOworCisvKioKKyAqIGVudW0gdWFwc2RfcGVlcl9wYXJhbV9tYXhfc3AgLSBVLUFQU0QgbWF4aW11bSBzZXJ2aWNlIHBlcmlvZCBvZiBwZWVyIHN0YXRpb24KKyAqIEBVQVBTRF9NQVhfU1BfTEVOX1VOTElNSVRFRDogdW5saW1pdGVkIG1heCBzZXJ2aWNlIHBlcmlvZAorICogQFVBUFNEX01BWF9TUF9MRU5fMjogbWF4IHNlcnZpY2UgcGVyaW9kID0gMgorICogQFVBUFNEX01BWF9TUF9MRU5fNDogbWF4IHNlcnZpY2UgcGVyaW9kID0gNAorICogQFVBUFNEX01BWF9TUF9MRU5fNjogbWF4IHNlcnZpY2UgcGVyaW9kID0gNgorICovCitlbnVtIHVhcHNkX3BlZXJfcGFyYW1fbWF4X3NwIHsKKwlVQVBTRF9NQVhfU1BfTEVOX1VOTElNSVRFRCA9IDAsCisJVUFQU0RfTUFYX1NQX0xFTl8yID0gMiwKKwlVQVBTRF9NQVhfU1BfTEVOXzQgPSA0LAorCVVBUFNEX01BWF9TUF9MRU5fNiA9IDYKK307CisKKy8qKgorICogZW51bSB1YXBzZF9wZWVyX3BhcmFtX2VuYWJsZWRfYWMgLSBVLUFQU0QgRW5hYmxlZCBBQydzIG9mIHBlZXIgc3RhdGlvbgorICogQFVBUFNEX1ZPX0VOQUJMRUQ6IGVuYWJsZSB1YXBzZCBmb3Igdm9pY2UKKyAqIEBVQVBTRF9WSV9FTkFCTEVEOiBlbmFibGUgdWFwc2QgZm9yIHZpZGVvCisgKiBAVUFQU0RfQktfRU5BQkxFRDogZW5hYmxlIHVhcHNkIGZvciBiYWNrZ3JvdW5kCisgKiBAVUFQU0RfQkVfRU5BQkxFRDogZW5hYmxlIHVhcHNkIGZvciBiZXN0IGVmZm9ydAorICovCitlbnVtIHVhcHNkX3BlZXJfcGFyYW1fZW5hYmxlZF9hYyB7CisJVUFQU0RfVk9fRU5BQkxFRCA9IDB4MDEsCisJVUFQU0RfVklfRU5BQkxFRCA9IDB4MDIsCisJVUFQU0RfQktfRU5BQkxFRCA9IDB4MDQsCisJVUFQU0RfQkVfRU5BQkxFRCA9IDB4MDgKK307CisKKy8qKgorICogc3RydWN0IHAycF9pZSAtIFAyUCBJRSBzdHJ1Y3R1cmFsIGRlZmluaXRpb24uCisgKiBAcDJwX2lkOiBwMnAgaWQKKyAqIEBwMnBfbGVuOiBwMnAgbGVuZ3RoCisgKiBAcDJwX291aTogcDJwIE9VSQorICogQHAycF9vdWlfdHlwZTogcDJwIE9VSSB0eXBlCisgKi8KK3N0cnVjdCBwMnBfaWUgeworCXVpbnQ4X3QgcDJwX2lkOworCXVpbnQ4X3QgcDJwX2xlbjsKKwl1aW50OF90IHAycF9vdWlbM107CisJdWludDhfdCBwMnBfb3VpX3R5cGU7Cit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCBwMnBfbm9hX2Rlc2NyaXB0b3IgLSBub2EgZGVzY3JpcHRvcgorICogQHR5cGVfY291bnQ6IDI1NTogY29udGludW91cyBzY2hlZHVsZSwgMDogcmVzZXJ2ZWQKKyAqIEBkdXJhdGlvbjogQWJzZW50IHBlcmlvZCBkdXJhdGlvbiBpbiBtaWNybyBzZWNvbmRzCisgKiBAaW50ZXJ2YWw6IEFic2VudCBwZXJpb2QgaW50ZXJ2YWwgaW4gbWljcm8gc2Vjb25kcworICogQHN0YXJ0X3RpbWU6IDMyIGJpdCB0c2YgdGltZSB3aGVuIGluIHN0YXJ0cworICovCitzdHJ1Y3QgcDJwX25vYV9kZXNjcmlwdG9yIHsKKwl1aW50OF90IHR5cGVfY291bnQ7CisJdWludDMyX3QgZHVyYXRpb247CisJdWludDMyX3QgaW50ZXJ2YWw7CisJdWludDMyX3Qgc3RhcnRfdGltZTsKK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IHAycF9zdWJfZWxlbWVudF9ub2EgLSBwMnAgbm9hIGVsZW1lbnQKKyAqIEBwMnBfc3ViX2lkOiBwMnAgc3ViIGlkCisgKiBAcDJwX3N1Yl9sZW46IHAycCBzdWIgbGVuZ3RoCisgKiBAaW5kZXg6IGlkZW50aWZpZXMgaW5zdGFuY2Ugb2YgTk9BIHN1IGVsZW1lbnQKKyAqIEBvcHBQUzogb3BwUFMgc3RhdGUgb2YgdGhlIEFQCisgKiBAY3R3aW5kb3c6IGN0d2luZG93IGluIFRVcworICogQG51bV9kZXNjcmlwdG9yczogbnVtYmVyIG9mIE5PQSBkZXNjcmlwdG9ycworICogQG5vYV9kZXNjcmlwdG9yczogbm9hIGRlc2NyaXB0b3JzCisgKi8KK3N0cnVjdCBwMnBfc3ViX2VsZW1lbnRfbm9hIHsKKwl1aW50OF90IHAycF9zdWJfaWQ7CisJdWludDhfdCBwMnBfc3ViX2xlbjsKKwl1aW50OF90IGluZGV4OyAgICAgICAgICAvKiBpZGVudGlmaWVzIGluc3RhbmNlIG9mIE5PQSBzdSBlbGVtZW50ICovCisJdWludDhfdCBvcHBQUzoxLCAgICAgICAgLyogb3BwUFMgc3RhdGUgb2YgdGhlIEFQICovCisJCWN0d2luZG93Ojc7ICAgICAvKiBjdHdpbmRvdyBpbiBUVXMgKi8KKwl1aW50OF90IG51bV9kZXNjcmlwdG9yczsgICAgICAgIC8qIG51bWJlciBvZiBOT0EgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgcDJwX25vYV9kZXNjcmlwdG9yIG5vYV9kZXNjcmlwdG9yc1tXTUFfTUFYX05PQV9ERVNDUklQVE9SU107Cit9OworCisvKioKKyAqIHN0cnVjdCB3bWFfZGVjYXBfaW5mb190IC0gZGVjYXBzdWxhdGlvbiBpbmZvCisgKiBAaGRyOiBoZWFkZXIKKyAqIEBoZHJfbGVuOiBoZWFkZXIgbGVuZ3RoCisgKi8KK3N0cnVjdCB3bWFfZGVjYXBfaW5mb190IHsKKwl1aW50OF90IGhkcltzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NmcmFtZV9hZGRyNCldOworCWludDMyX3QgaGRyX2xlbjsKK307CisKKy8qKgorICogZW51bSBwYWNrZXRfcG93ZXJfc2F2ZSAtIHBhY2tldCBwb3dlciBzYXZlIHBhcmFtcworICogQFdNSV9WREVWX1BQU19QQUlEX01BVENIOiBwYWlkIG1hdGNoIHBhcmFtCisgKiBAV01JX1ZERVZfUFBTX0dJRF9NQVRDSDogZ2lkIG1hdGNoIHBhcmFtCisgKiBAV01JX1ZERVZfUFBTX0VBUkxZX1RJTV9DTEVBUjogZWFybHkgdGltIGNsZWFyIHBhcmFtCisgKiBAV01JX1ZERVZfUFBTX0VBUkxZX0RUSU1fQ0xFQVI6IGVhcmx5IGR0aW0gY2xlYXIgcGFyYW0KKyAqIEBXTUlfVkRFVl9QUFNfRU9GX1BBRF9ERUxJTTogZW9mIHBhZCBkZWxpbSBwYXJhbQorICogQFdNSV9WREVWX1BQU19NQUNBRERSX01JU01BVENIOiBtYWNhZGRyIG1pc21hdGNoIHBhcmFtCisgKiBAV01JX1ZERVZfUFBTX0RFTElNX0NSQ19GQUlMOiBkZWxpbSBDUkMgZmFpbCBwYXJhbQorICogQFdNSV9WREVWX1BQU19HSURfTlNUU19aRVJPOiBnaWQgbnN0cyB6ZXJvIHBhcmFtCisgKiBAV01JX1ZERVZfUFBTX1JTU0lfQ0hFQ0s6IFJTU0kgY2hlY2sgcGFyYW0KKyAqIEBXTUlfVkRFVl9QUFNfNUdfRUJUOiA1RyBlYnQgcGFyYW0KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlXTUlfVkRFVl9QUFNfUEFJRF9NQVRDSCA9IDAsCisJV01JX1ZERVZfUFBTX0dJRF9NQVRDSCA9IDEsCisJV01JX1ZERVZfUFBTX0VBUkxZX1RJTV9DTEVBUiA9IDIsCisJV01JX1ZERVZfUFBTX0VBUkxZX0RUSU1fQ0xFQVIgPSAzLAorCVdNSV9WREVWX1BQU19FT0ZfUEFEX0RFTElNID0gNCwKKwlXTUlfVkRFVl9QUFNfTUFDQUREUl9NSVNNQVRDSCA9IDUsCisJV01JX1ZERVZfUFBTX0RFTElNX0NSQ19GQUlMID0gNiwKKwlXTUlfVkRFVl9QUFNfR0lEX05TVFNfWkVSTyA9IDcsCisJV01JX1ZERVZfUFBTX1JTU0lfQ0hFQ0sgPSA4LAorCVdNSV9WREVWX1ZIVF9TRVRfR0lEX01HTVQgPSA5LAorCVdNSV9WREVWX1BQU181R19FQlQgPSAxMAorfSBwYWNrZXRfcG93ZXJfc2F2ZTsKKworLyoqCisgKiBlbnVtIGdyZWVuX3R4X3BhcmFtIC0gZ3JlZW4gdHggcGFyYW1ldGVycworICogQFdNSV9WREVWX1BBUkFNX0dUWF9IVF9NQ1M6IGh0IG1jcyBwYXJhbQorICogQFdNSV9WREVWX1BBUkFNX0dUWF9WSFRfTUNTOiB2aHQgbWNzIHBhcmFtCisgKiBAV01JX1ZERVZfUEFSQU1fR1RYX1VTUl9DRkc6IHVzZXIgY2ZnIHBhcmFtCisgKiBAV01JX1ZERVZfUEFSQU1fR1RYX1RIUkU6IHRocmUgcGFyYW0KKyAqIEBXTUlfVkRFVl9QQVJBTV9HVFhfTUFSR0lOOiBncmVlbiB0eCBtYXJnaW4gcGFyYW0KKyAqIEBXTUlfVkRFVl9QQVJBTV9HVFhfU1RFUDogZ3JlZW4gdHggc3RlcCBwYXJhbQorICogQFdNSV9WREVWX1BBUkFNX0dUWF9NSU5UUEM6IG1pbnRwYyBwYXJhbQorICogQFdNSV9WREVWX1BBUkFNX0dUWF9CV19NQVNLOiBiYW5kd2lkdGggbWFzaworICovCit0eXBlZGVmIGVudW0geworCVdNSV9WREVWX1BBUkFNX0dUWF9IVF9NQ1MsCisJV01JX1ZERVZfUEFSQU1fR1RYX1ZIVF9NQ1MsCisJV01JX1ZERVZfUEFSQU1fR1RYX1VTUl9DRkcsCisJV01JX1ZERVZfUEFSQU1fR1RYX1RIUkUsCisJV01JX1ZERVZfUEFSQU1fR1RYX01BUkdJTiwKKwlXTUlfVkRFVl9QQVJBTV9HVFhfU1RFUCwKKwlXTUlfVkRFVl9QQVJBTV9HVFhfTUlOVFBDLAorCVdNSV9WREVWX1BBUkFNX0dUWF9CV19NQVNLLAorfSBncmVlbl90eF9wYXJhbTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisvKioKKyAqIHN0cnVjdCB3bWFfdGRsc19wYXJhbXMgLSBURExTIHBhcmFtZXRlcnMKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAdGRsc19zdGF0ZTogVERMUyBzdGF0ZQorICogQG5vdGlmaWNhdGlvbl9pbnRlcnZhbF9tczogbm90aWZpY2F0aW9uIGluZXJ2YWwKKyAqIEB0eF9kaXNjb3ZlcnlfdGhyZXNob2xkOiB0eCBkaXNjb3ZlcnkgdGhyZXNob2xkCisgKiBAdHhfdGVhcmRvd25fdGhyZXNob2xkOiB0eCB0ZWFyZG93biB0aHJlYXNob2xkCisgKiBAcnNzaV90ZWFyZG93bl90aHJlc2hvbGQ6IFJTU0kgdGVhcmRvd24gdGhyZXNob2xkCisgKiBAcnNzaV9kZWx0YTogUlNTSSBkZWx0YQorICogQHRkbHNfb3B0aW9uczogVERMUyBvcHRpb25zCisgKiBAcGVlcl90cmFmZmljX2luZF93aW5kb3c6IHJhZmZpYyBpbmRpY2F0aW9uIHdpbmRvdworICogQHBlZXJfdHJhZmZpY19yZXNwb25zZV90aW1lb3V0OiB0cmFmZmljIHJlc3BvbnNlIHRpbWVvdXQKKyAqIEBwdWFwc2RfbWFzazogdWFwc2QgbWFzaworICogQHB1YXBzZF9pbmFjdGl2aXR5X3RpbWU6IHVhcHNkIGluYWN0aXZpdHkgdGltZQorICogQHB1YXBzZF9yeF9mcmFtZV90aHJlc2hvbGQ6IHVhcHNkIHJ4IGZyYW1lIHRocmVzaG9sZAorICovCit0eXBlZGVmIHN0cnVjdCB3bWFfdGRsc19wYXJhbXMgeworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3QgdGRsc19zdGF0ZTsKKwl1aW50MzJfdCBub3RpZmljYXRpb25faW50ZXJ2YWxfbXM7CisJdWludDMyX3QgdHhfZGlzY292ZXJ5X3RocmVzaG9sZDsKKwl1aW50MzJfdCB0eF90ZWFyZG93bl90aHJlc2hvbGQ7CisJaW50MzJfdCByc3NpX3RlYXJkb3duX3RocmVzaG9sZDsKKwlpbnQzMl90IHJzc2lfZGVsdGE7CisJdWludDMyX3QgdGRsc19vcHRpb25zOworCXVpbnQzMl90IHBlZXJfdHJhZmZpY19pbmRfd2luZG93OworCXVpbnQzMl90IHBlZXJfdHJhZmZpY19yZXNwb25zZV90aW1lb3V0OworCXVpbnQzMl90IHB1YXBzZF9tYXNrOworCXVpbnQzMl90IHB1YXBzZF9pbmFjdGl2aXR5X3RpbWU7CisJdWludDMyX3QgcHVhcHNkX3J4X2ZyYW1lX3RocmVzaG9sZDsKK30gdF93bWFfdGRsc19wYXJhbXM7CisKKy8qKgorICogc3RydWN0IHdtYV90ZGxzX3BlZXJfZXZlbnQgLSBURExTIHBlZXIgZXZlbnQKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAcGVlcl9tYWNhZGRyOiBwZWVyIE1BQyBhZGRyZXNzCisgKiBAcGVlcl9zdGF0dXM6IFRETFMgcGVlciBzdGF0dXMKKyAqIEBwZWVyX3JlYXNvbjogVERMUyBwZWVyIHJlYXNvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdmRldl9pZDsKKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCUFfVUlOVDMyIHBlZXJfc3RhdHVzOworCUFfVUlOVDMyIHBlZXJfcmVhc29uOworfSB3bWFfdGRsc19wZWVyX2V2ZW50OworCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KKworLyoqCisgKiBzdHJ1Y3Qgd21hX2Rmc19yYWRhcl9jaGFubmVsX2xpc3QgLSBkZnMgcmFkYXIgY2hhbm5lbCBsaXN0CisgKiBAbmNoYW5uZWxzOiBudWJlciBvZiBjaGFubmVscworICogQGNoYW5uZWxzOiBDaGFubmVsIG51bWJlciBpbmNsdWRpbmcgYm9uZGVkIGNoYW5uZWxzIG9uIHdoaWNoCisgKiAgICAgICAgICAgIHJhZGFyIGlzIHByZXNlbnQKKyAqLworc3RydWN0IHdtYV9kZnNfcmFkYXJfY2hhbm5lbF9saXN0IHsKKwlBX1VJTlQzMiBuY2hhbm5lbHM7CisJdWludDhfdCBjaGFubmVsc1tXTUFfREZTX01BWF8yME1fU1VCX0NIXTsKK307CisKKy8qKgorICogc3RydWN0IHdtYV9kZnNfcmFkYXJfaW5kaWNhdGlvbiAtIFN0cnVjdHVyZSB0byBpbmRpY2F0ZSBSQURBUgorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBjaGFuX2xpc3Q6IENoYW5uZWwgbGlzdCBvbiB3aGljaCBSQURBUiBpcyBkZXRlY3RlZAorICogQGRmc19yYWRhcl9zdGF0dXM6IEZsYWcgdG8gSW5kaWNhdGUgUkFEQVIgcHJlc2VuY2Ugb24gdGhlIGN1cnJlbnQgY2hhbm5lbAorICogQHVzZV9ub2w6IEZsYWcgdG8gaW5kaWNhdGUgdXNlIE5PTAorICovCitzdHJ1Y3Qgd21hX2Rmc19yYWRhcl9pbmRpY2F0aW9uIHsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCXN0cnVjdCB3bWFfZGZzX3JhZGFyX2NoYW5uZWxfbGlzdCBjaGFuX2xpc3Q7CisJdWludDMyX3QgZGZzX3JhZGFyX3N0YXR1czsKKwlpbnQgdXNlX25vbDsKK307CisKKy8qKgorICogZW51bSB1YXBzZF9hYyAtIFUtQVBTRCBBY2Nlc3MgQ2F0ZWdvcmllcworICogQFVBUFNEX0JFOiBiZXN0IGVmZm9ydAorICogQFVBUFNEX0JLOiBiYWNrIGdyb3VuZAorICogQFVBUFNEX1ZJOiB2aWRlbworICogQFVBUFNEX1ZPOiB2b2ljZQorICovCitlbnVtIHVhcHNkX2FjIHsKKwlVQVBTRF9CRSwKKwlVQVBTRF9CSywKKwlVQVBTRF9WSSwKKwlVQVBTRF9WTworfTsKKworQ0RGX1NUQVRVUyB3bWFfZGlzYWJsZV91YXBzZF9wZXJfYWModHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICB1aW50MzJfdCB2ZGV2X2lkLCBlbnVtIHVhcHNkX2FjIGFjKTsKKworLyoqCisgKiBlbnVtIHVhcHNkX3VwIC0gVS1BUFNEIFVzZXIgUHJpb3JpdGllcworICogQFVBUFNEX1VQX0JFOiBiZXN0IGVmZm9ydAorICogQFVBUFNEX1VQX0JLOiBiYWNrIGdyb3VuZAorICogQFVBUFNEX1VQX1JFU1Y6IHJlc2VydmUKKyAqIEBVQVBTRF9VUF9FRTogRXhjZWxsZW50IEVmZm9ydAorICogQFVBUFNEX1VQX0NMOiBDcml0aWNhbCBBcHBsaWNhdGlvbnMKKyAqIEBVQVBTRF9VUF9WSTogdmlkZW8KKyAqIEBVQVBTRF9VUF9WTzogdm9pY2UKKyAqIEBVQVBTRF9VUF9OQzogTmV0d29yayBDb250cm9sCisgKi8KK2VudW0gdWFwc2RfdXAgeworCVVBUFNEX1VQX0JFLAorCVVBUFNEX1VQX0JLLAorCVVBUFNEX1VQX1JFU1YsCisJVUFQU0RfVVBfRUUsCisJVUFQU0RfVVBfQ0wsCisJVUFQU0RfVVBfVkksCisJVUFQU0RfVVBfVk8sCisJVUFQU0RfVVBfTkMsCisJVUFQU0RfVVBfTUFYCit9OworCisvKioKKyAqIHN0cnVjdCB3bWFfdW5pdF90ZXN0X2NtZCAtIHVuaXQgdGVzdCBjb21tYW5kIHBhcmFtZXRlcnMKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAbW9kdWxlX2lkOiBtb2R1bGUgaWQKKyAqIEBudW1fYXJnczogbnVtYmVyIG9mIGFyZ3VtZW50cworICogQGFyZ3M6IGFyZ3VtZW50cworICovCit0eXBlZGVmIHN0cnVjdCB3bWFfdW5pdF90ZXN0X2NtZCB7CisJdWludDMyX3QgdmRldl9pZDsKKwlXTEFOX01PRFVMRV9JRCBtb2R1bGVfaWQ7CisJdWludDMyX3QgbnVtX2FyZ3M7CisJdWludDMyX3QgYXJnc1tXTUFfTUFYX05VTV9BUkdTXTsKK30gdF93bWFfdW5pdF90ZXN0X2NtZDsKKworLyoqCisgKiBzdHJ1Y3Qgd21hX3JvYW1faW52b2tlX2NtZCAtIHJvYW0gaW52b2tlIGNvbW1hbmQKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAYnNzaWQ6IG1hYyBhZGRyZXNzCisgKiBAY2hhbm5lbDogY2hhbm5lbAorICovCitzdHJ1Y3Qgd21hX3JvYW1faW52b2tlX2NtZCB7CisJdWludDMyX3QgdmRldl9pZDsKKwl1aW50OF90IGJzc2lkW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdWludDMyX3QgY2hhbm5lbDsKK307CisKKy8qKgorICogc3RydWN0IHdtYV9wcm9jZXNzX2Z3X2V2ZW50X3BhcmFtcyAtIGZ3IGV2ZW50IHBhcmFtZXRlcnMKKyAqIEB3bWlfaGFuZGxlOiB3bWkgaGFuZGxlCisgKiBAZXZ0X2J1ZjogZXZlbnQgYnVmZmVyCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICp3bWlfaGFuZGxlOworCXZvaWQgKmV2dF9idWY7Cit9IHdtYV9wcm9jZXNzX2Z3X2V2ZW50X3BhcmFtczsKKworaW50IHdtYV9wcm9jZXNzX2Z3X2V2ZW50X2hhbmRsZXIoc3RydWN0IHdtaV91bmlmaWVkICp3bWlfaGFuZGxlLAorCQl3bWlfYnVmX3QgZXZ0X2J1Zik7CisKK0FfVUlOVDMyIGVfY3NyX2F1dGhfdHlwZV90b19yc25fYXV0aG1vZGUoZUNzckF1dGhUeXBlIGF1dGh0eXBlLAorCQkJCQkgZUNzckVuY3J5cHRpb25UeXBlIGVuY3IpOworQV9VSU5UMzIgZV9jc3JfZW5jcnlwdGlvbl90eXBlX3RvX3Jzbl9jaXBoZXJzZXQoZUNzckVuY3J5cHRpb25UeXBlIGVuY3IpOworCisvKgorICogV01BLURGUyBIb29rcworICovCitpbnQgb2xfaWZfZGZzX2F0dGFjaChzdHJ1Y3QgaWVlZTgwMjExY29tICppYywgdm9pZCAqcHRyLCB2b2lkICpyYWRhcl9pbmZvKTsKK3VpbnQ2NF90IG9sX2lmX2dldF90c2Y2NChzdHJ1Y3QgaWVlZTgwMjExY29tICppYyk7CitpbnQgb2xfaWZfZGZzX2Rpc2FibGUoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpOworc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICppZWVlODAyMTFfZmluZF9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLAorCQkJCQkJIGludCBmcmVxLCB1aW50MzJfdCBmbGFncyk7CitpbnQgb2xfaWZfZGZzX2VuYWJsZShzdHJ1Y3QgaWVlZTgwMjExY29tICppYywgaW50ICppc19mYXN0Y2xrLCB2b2lkICpwZSk7Cit1aW50MzJfdCBpZWVlODAyMTFfaWVlZTJtaHoodWludDMyX3QgY2hhbiwgdWludDMyX3QgZmxhZ3MpOworaW50IG9sX2lmX2Rmc19nZXRfZXh0X2J1c3koc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpOworaW50IG9sX2lmX2Rmc19nZXRfbWliX2N5Y2xlX2NvdW50c19wY3Qoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsCisJCQkJICAgICAgIHVpbnQzMl90ICpyeGNfcGNudCwgdWludDMyX3QgKnJ4Zl9wY250LAorCQkJCSAgICAgICB1aW50MzJfdCAqdHhmX3BjbnQpOwordWludDE2X3Qgb2xfaWZfZGZzX3VzZW5vbChzdHJ1Y3QgaWVlZTgwMjExY29tICppYyk7Cit2b2lkIGllZWU4MDIxMV9tYXJrX2RmcyhzdHJ1Y3QgaWVlZTgwMjExY29tICppYywKKwkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqaWNoYW4pOworaW50IHdtYV9kZnNfaW5kaWNhdGVfcmFkYXIoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmljaGFuKTsKK3VpbnQxNl90IGRmc191c2Vub2woc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpOworCitDREZfU1RBVFVTIHdtYV90cmlnZ2VyX3VhcHNkX3BhcmFtcyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsIHVpbnQzMl90IHZkZXZfaWQsCisJCQkJICAgIHRwX3dtYV90cmlnZ2VyX3VhcHNkX3BhcmFtcworCQkJCSAgICB0cmlnZ2VyX3VhcHNkX3BhcmFtcyk7CisKKy8qIGFkZGVkIHRvIGdldCBhdmVyYWdlIHNuciBmb3IgYm90aCBkYXRhIGFuZCBiZWFjb24gKi8KK0NERl9TVEFUVVMgd21hX3NlbmRfc25yX3JlcXVlc3QodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLCB2b2lkICpwR2V0UnNzaVJlcSk7CisKKworQ0RGX1NUQVRVUyB3bWFfdXBkYXRlX3ZkZXZfdGJsKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgdWludDhfdCB2ZGV2X2lkLAorCQkJICAgICAgIG9sX3R4cnhfdmRldl9oYW5kbGUgdHhfcnhfdmRldl9oYW5kbGUsCisJCQkgICAgICAgdWludDhfdCAqbWFjLCB1aW50MzJfdCB2ZGV2X3R5cGUsIGJvb2wgYWRkX2RlbCk7CisKK3ZvaWQgd21hX3NlbmRfZmx1c2hfbG9nc190b19mdyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpOwordm9pZCB3bWFfbG9nX2NvbXBsZXRpb25fdGltZW91dCh2b2lkICpkYXRhKTsKKworQ0RGX1NUQVRVUyB3bWFfc2V0X3Jzc2lfbW9uaXRvcmluZyh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJc3RydWN0IHJzc2lfbW9uaXRvcl9yZXEgKnJlcSk7CisKK0NERl9TVEFUVVMgd21hX3NlbmRfc29jX3NldF9wY2xfY21kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJc3RydWN0IHNpcl9wY2xfbGlzdCAqbXNnKTsKKworQ0RGX1NUQVRVUyB3bWFfc2VuZF9zb2Nfc2V0X2h3X21vZGVfY21kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJc3RydWN0IHNpcl9od19tb2RlICptc2cpOworQ0RGX1NUQVRVUyB3bWFfZ2V0X3NjYW5faWQodWludDMyX3QgKnNjYW5faWQpOworCitDREZfU1RBVFVTIHdtYV9zZW5kX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJc3RydWN0IHNpcl9kdWFsX21hY19jb25maWcgKm1zZyk7CitpbnQgd21hX2NyYXNoX2luamVjdCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsIHVpbnQzMl90IHR5cGUsCisJCQl1aW50MzJfdCBkZWxheV90aW1lX21zKTsKKworc3RydWN0IHdtYV90YXJnZXRfcmVxICp3bWFfZmlsbF92ZGV2X3JlcSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJIHVpbnQ4X3QgdmRldl9pZCwKKwkJCQkJIHVpbnQzMl90IG1zZ190eXBlLCB1aW50OF90IHR5cGUsCisJCQkJCSB2b2lkICpwYXJhbXMsIHVpbnQzMl90IHRpbWVvdXQpOworc3RydWN0IHdtYV90YXJnZXRfcmVxICp3bWFfZmlsbF9ob2xkX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgICAgdWludDhfdCB2ZGV2X2lkLCB1aW50MzJfdCBtc2dfdHlwZSwKKwkJCQkgICAgdWludDhfdCB0eXBlLCB2b2lkICpwYXJhbXMsCisJCQkJICAgIHVpbnQzMl90IHRpbWVvdXQpOworCitDREZfU1RBVFVTIHdtYV92ZGV2X3N0YXJ0KHRwX3dtYV9oYW5kbGUgd21hLAorCQkJICBzdHJ1Y3Qgd21hX3ZkZXZfc3RhcnRfcmVxICpyZXEsIGJvb2wgaXNSZXN0YXJ0KTsKKwordm9pZCB3bWFfcmVtb3ZlX3ZkZXZfcmVxKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IHZkZXZfaWQsCisJCQkJdWludDhfdCB0eXBlKTsKKworaW50IHdtaV9kZXNjX3Bvb2xfaW5pdCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsIHVpbnQzMl90IHBvb2xfc2l6ZSk7Cit2b2lkIHdtaV9kZXNjX3Bvb2xfZGVpbml0KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSk7CitzdHJ1Y3Qgd21pX2Rlc2NfdCAqd21pX2Rlc2NfZ2V0KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSk7Cit2b2lkIHdtaV9kZXNjX3B1dCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsIHN0cnVjdCB3bWlfZGVzY190ICp3bWlfZGVzYyk7CitpbnQgd21hX21nbXRfdHhfY29tcGxldGlvbl9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqY21wbF9ldmVudF9wYXJhbXMsCisJCQkJICAgdWludDMyX3QgbGVuKTsKK3ZvaWQgd21hX3NldF9kZnNfcmVnaW9uKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IGRmc19yZWdpb24pOworCisjaWYgZGVmaW5lZChGRUFUVVJFX0xSTykKK0NERl9TVEFUVVMgd21hX2xyb19jb25maWdfY21kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkgc3RydWN0IHdtYV9scm9fY29uZmlnX2NtZF90ICp3bWFfbHJvX2NtZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBDREZfU1RBVFVTIHdtYV9scm9fY29uZmlnX2NtZCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJIHN0cnVjdCB3bWFfbHJvX2NvbmZpZ19jbWRfdCAqd21hX2xyb19jbWQpCit7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3dtYS9pbmMvd21hX2FwaS5oIGIvY29yZS93bWEvaW5jL3dtYV9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDc4OTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS93bWEvaW5jL3dtYV9hcGkuaApAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBXTUFfQVBJX0gKKyNkZWZpbmUgV01BX0FQSV9ICisKKyNpbmNsdWRlICJvc2RlcC5oIgorI2luY2x1ZGUgImNkc19tcS5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJhX3R5cGVzLmgiCisjaW5jbHVkZSAid21pX3VuaWZpZWQuaCIKKyNpZmRlZiBOT1RfWUVUCisjaW5jbHVkZSAiaHRjX2FwaS5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltX2dsb2JhbC5oIgorCit0eXBlZGVmIHZvaWQgKldNQV9IQU5ETEU7CisKKy8qKgorICogZW51bSBHRU5fUEFSQU0gLSBnZW5lcmFsIHBhcmFtZXRlcnMKKyAqIEBHRU5fVkRFVl9QQVJBTV9BTVBEVTogU2V0IGFtcGR1IHNpemUKKyAqIEBHRU5fVkRFVl9QQVJBTV9BTVNEVTogU2V0IGFtc2R1IHNpemUKKyAqIEBHRU5fUEFSQU1fRFVNUF9BR0NfU1RBUlQ6IGR1bXAgYWdjIHN0YXJ0CisgKiBAR0VOX1BBUkFNX0RVTVBfQUdDOiBkdW1wIGFnYworICogQEdFTl9QQVJBTV9EVU1QX0NIQU5JTkZPX1NUQVJUOiBkdW1wIGNoYW5uZWwgaW5mbyBzdGFydAorICogQEdFTl9QQVJBTV9EVU1QX0NIQU5JTkZPOiBkdW1wIGNoYW5uZWwgaW5mbworICogQEdFTl9QQVJBTV9DUkFTSF9JTkpFQ1Q6IGluamVjdCBjcmFzaAorICogQEdFTl9QQVJBTV9EVU1QX1BDSUVfQUNDRVNTX0xPRzogZHVtcCBwY2llIGFjY2VzcyBsb2cKKyAqIEBHRU5fUEFSQU1fVFhfQ0hBSU5fTUFTS19DQ0s6IGNjayB0eCBjaGFpbiBtYXNrCisgKi8KK3R5cGVkZWYgZW51bSB7CisJR0VOX1ZERVZfUEFSQU1fQU1QRFUgPSAweDEsCisJR0VOX1ZERVZfUEFSQU1fQU1TRFUsCisJR0VOX1BBUkFNX0RVTVBfQUdDX1NUQVJULAorCUdFTl9QQVJBTV9EVU1QX0FHQywKKwlHRU5fUEFSQU1fRFVNUF9DSEFOSU5GT19TVEFSVCwKKwlHRU5fUEFSQU1fRFVNUF9DSEFOSU5GTywKKwlHRU5fUEFSQU1fRFVNUF9XQVRDSERPRywKKwlHRU5fUEFSQU1fQ1JBU0hfSU5KRUNULAorI2lmZGVmIENPTkZJR19BVEhfUENJRV9BQ0NFU1NfREVCVUcKKwlHRU5fUEFSQU1fRFVNUF9QQ0lFX0FDQ0VTU19MT0csCisjZW5kaWYKKwlHRU5fUEFSQU1fTU9EVUxBVEVEX0RUSU0sCit9IEdFTl9QQVJBTTsKKworI2RlZmluZSBWREVWX0NNRCAxCisjZGVmaW5lIFBERVZfQ01EIDIKKyNkZWZpbmUgR0VOX0NNRCAgMworI2RlZmluZSBEQkdfQ01EICA0CisjZGVmaW5lIFBQU19DTUQgIDUKKyNkZWZpbmUgUVBPV0VSX0NNRCA2CisjZGVmaW5lIEdUWF9DTUQgIDcKKwordHlwZWRlZiB2b2lkICgqd21hX3BlZXJfYXV0aG9yaXplZF9mcCkgKHVpbnQzMl90IHZkZXZfaWQpOworCisKK0NERl9TVEFUVVMgd21hX3ByZV9zdGFydCh2b2lkICpjZHNfY29udGV4dCk7CisKK0NERl9TVEFUVVMgd21hX21jX3Byb2Nlc3NfbXNnKHZvaWQgKmNkc19jb250ZXh0LCBjZHNfbXNnX3QgKm1zZyk7CisKK0NERl9TVEFUVVMgd21hX3N0YXJ0KHZvaWQgKmNkc19jb250ZXh0KTsKKworQ0RGX1NUQVRVUyB3bWFfc3RvcCh2b2lkICpjZHNfY29udGV4dCwgdWludDhfdCByZWFzb24pOworCitDREZfU1RBVFVTIHdtYV9jbG9zZSh2b2lkICpjZHNfY29udGV4dCk7CisKK0NERl9TVEFUVVMgd21hX3dtaV9zZXJ2aWNlX2Nsb3NlKHZvaWQgKmNkc19jb250ZXh0KTsKKwordm9pZCB3bWFfcnhfcmVhZHlfZXZlbnQoV01BX0hBTkRMRSBoYW5kbGUsIHZvaWQgKmV2KTsKKwordm9pZCB3bWFfcnhfc2VydmljZV9yZWFkeV9ldmVudChXTUFfSEFORExFIGhhbmRsZSwgdm9pZCAqZXYpOworCit2b2lkIHdtYV9yeF9zZXJ2aWNlX3JlYWR5X2V4dF9ldmVudChXTUFfSEFORExFIGhhbmRsZSwgdm9pZCAqZXYpOworCit2b2lkIHdtYV9zZXRuZWVkc2h1dGRvd24odm9pZCAqY2RzX2NvbnRleHQpOworCitib29sIHdtYV9uZWVkc2h1dGRvd24odm9pZCAqY2RzX2NvbnRleHQpOworCitDREZfU1RBVFVTIHdtYV93YWl0X2Zvcl9yZWFkeV9ldmVudChXTUFfSEFORExFIGhhbmRsZSk7CisKK3VpbnQ4X3Qgd21hX21hcF9jaGFubmVsKHVpbnQ4X3QgbWFwQ2hhbm5lbCk7CisKK2ludCB3bWFfY2xpX2dldF9jb21tYW5kKGludCB2ZGV2X2lkLCBpbnQgcGFyYW1faWQsIGludCB2cGRldik7CitpbnQgd21hX2NsaV9zZXRfY29tbWFuZChpbnQgdmRldl9pZCwgaW50IHBhcmFtX2lkLCBpbnQgc3ZhbCwgaW50IHZwZGV2KTsKK2ludCB3bWFfY2xpX3NldDJfY29tbWFuZChpbnQgdmRldl9pZCwgaW50IHBhcmFtX2lkLCBpbnQgc3ZhbDEsCisJCQkgaW50IHN2YWwyLCBpbnQgdnBkZXYpOworCitDREZfU1RBVFVTIHdtYV9zZXRfaHRjb25maWcodWludDhfdCB2ZGV2X2lkLCB1aW50MTZfdCBodF9jYXBhYiwgaW50IHZhbHVlKTsKK0NERl9TVEFUVVMgd21hX3NldF9yZWdfZG9tYWluKHZvaWQgKmNsaWVudEN0eHQsIHZfUkVHRE9NQUlOX3QgcmVnSWQpOworCitDREZfU1RBVFVTIHdtYV9nZXRfd2Nuc3Nfc29mdHdhcmVfdmVyc2lvbih2b2lkICpwX2Nkc19nY3R4LAorCQkJCQkgIHVpbnQ4X3QgKnBWZXJzaW9uLAorCQkJCQkgIHVpbnQzMl90IHZlcnNpb25CdWZmZXJTaXplKTsKK2ludCB3bWFfYnVzX3N1c3BlbmQodm9pZCk7CitpbnQgd21hX3N1c3BlbmRfdGFyZ2V0KFdNQV9IQU5ETEUgaGFuZGxlLCBpbnQgZGlzYWJsZV90YXJnZXRfaW50cik7Cit2b2lkIHdtYV90YXJnZXRfc3VzcGVuZF9hY2tub3dsZWRnZSh2b2lkICpjb250ZXh0KTsKK2ludCB3bWFfYnVzX3Jlc3VtZSh2b2lkKTsKK2ludCB3bWFfcmVzdW1lX3RhcmdldChXTUFfSEFORExFIGhhbmRsZSk7CitDREZfU1RBVFVTIHdtYV9kaXNhYmxlX3dvd19pbl9mdyhXTUFfSEFORExFIGhhbmRsZSk7CitDREZfU1RBVFVTIHdtYV9kaXNhYmxlX2Qwd293X2luX2Z3KFdNQV9IQU5ETEUgaGFuZGxlKTsKK2ludCB3bWFfaXNfd293X21vZGVfc2VsZWN0ZWQoV01BX0hBTkRMRSBoYW5kbGUpOworQ0RGX1NUQVRVUyB3bWFfZW5hYmxlX3dvd19pbl9mdyhXTUFfSEFORExFIGhhbmRsZSk7CitDREZfU1RBVFVTIHdtYV9lbmFibGVfZDB3b3dfaW5fZncoV01BX0hBTkRMRSBoYW5kbGUpOworYm9vbCB3bWFfY2hlY2tfc2Nhbl9pbl9wcm9ncmVzcyhXTUFfSEFORExFIGhhbmRsZSk7Cit2b2lkIHdtYV9zZXRfcGVlcl9hdXRob3JpemVkX2NiKHZvaWQgKndtYV9jdHgsIHdtYV9wZWVyX2F1dGhvcml6ZWRfZnAgYXV0aF9jYik7CitpbnQgd21hX3NldF9wZWVyX3BhcmFtKHZvaWQgKndtYV9jdHgsIHVpbnQ4X3QgKnBlZXJfYWRkciwgdWludDMyX3QgcGFyYW1faWQsCisJCSAgICAgICB1aW50MzJfdCBwYXJhbV92YWx1ZSwgdWludDMyX3QgdmRldl9pZCk7CisjaWZkZWYgTk9UX1lFVAorQ0RGX1NUQVRVUyB3bWFfdXBkYXRlX2NoYW5uZWxfbGlzdChXTUFfSEFORExFIGhhbmRsZSwgdm9pZCAqc2Nhbl9jaGFuX2luZm8pOworI2VuZGlmCisKK3VpbnQ4X3QgKndtYV9nZXRfdmRldl9hZGRyZXNzX2J5X3ZkZXZfaWQodWludDhfdCB2ZGV2X2lkKTsKK3N0cnVjdCB3bWFfdHhyeF9ub2RlICp3bWFfZ2V0X2ludGVyZmFjZV9ieV92ZGV2X2lkKHVpbnQ4X3QgdmRldl9pZCk7Citib29sIHdtYV9pc192ZGV2X3VwKHVpbnQ4X3QgdmRldl9pZCk7CisKK3ZvaWQgKndtYV9nZXRfYmVhY29uX2J1ZmZlcl9ieV92ZGV2X2lkKHVpbnQ4X3QgdmRldl9pZCwgdWludDMyX3QgKmJ1ZmZlcl9zaXplKTsKKwordWludDhfdCB3bWFfZ2V0X2Z3X3dsYW5fZmVhdF9jYXBzKHVpbnQ4X3QgZmVhdEVudW1WYWx1ZSk7Cit0U2lyUmV0U3RhdHVzIHdtYV9wb3N0X2N0cmxfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKTsKKwordm9pZCB3bWFfZW5hYmxlX2Rpc2FibGVfd2FrZXVwX2V2ZW50KFdNQV9IQU5ETEUgaGFuZGxlLAorCQkJCXVpbnQzMl90IHZkZXZfaWQsCisJCQkJdWludDMyX3QgYml0bWFwLAorCQkJCWJvb2wgZW5hYmxlKTsKK3ZvaWQgd21hX3JlZ2lzdGVyX3dvd193YWtldXBfZXZlbnRzKFdNQV9IQU5ETEUgaGFuZGxlLCB1aW50OF90IHZkZXZfaWQsCisJCQkJCXVpbnQ4X3QgdmRldl90eXBlLCB1aW50OF90IHN1Yl90eXBlKTsKK3ZvaWQgd21hX3JlZ2lzdGVyX3dvd19kZWZhdWx0X3BhdHRlcm5zKFdNQV9IQU5ETEUgaGFuZGxlLCB1aW50OF90IHZkZXZfaWQpOworaW50OF90IHdtYV9nZXRfaHdfbW9kZV9pZHhfZnJvbV9kYnNfaHdfbGlzdChlbnVtIGh3X21vZGVfc3NfY29uZmlnIG1hYzBfc3MsCisJCWVudW0gaHdfbW9kZV9iYW5kd2lkdGggbWFjMF9idywKKwkJZW51bSBod19tb2RlX3NzX2NvbmZpZyBtYWMxX3NzLAorCQllbnVtIGh3X21vZGVfYmFuZHdpZHRoIG1hYzFfYncsCisJCWVudW0gaHdfbW9kZV9kYnNfY2FwYWIgZGJzLAorCQllbnVtIGh3X21vZGVfYWdpbGVfZGZzX2NhcGFiIGRmcyk7CitDREZfU1RBVFVTIHdtYV9nZXRfaHdfbW9kZV9mcm9tX2lkeCh1aW50MzJfdCBpZHgsCisJCXN0cnVjdCBzaXJfaHdfbW9kZV9wYXJhbXMgKmh3X21vZGUpOworaW50OF90IHdtYV9nZXRfbnVtX2Ric19od19tb2Rlcyh2b2lkKTsKK2Jvb2wgd21hX2lzX2h3X2Ric19jYXBhYmxlKHZvaWQpOworYm9vbCB3bWFfaXNfaHdfYWdpbGVfZGZzX2NhcGFibGUodm9pZCk7CitpbnQ4X3Qgd21hX2dldF9tYWNfaWRfb2ZfdmRldih1aW50MzJfdCB2ZGV2X2lkKTsKK3ZvaWQgd21hX3VwZGF0ZV9pbnRmX2h3X21vZGVfcGFyYW1zKHVpbnQzMl90IHZkZXZfaWQsIHVpbnQzMl90IG1hY19pZCwKKwkJCQl1aW50MzJfdCBjZmdkX2h3X21vZGVfaW5kZXgpOworQ0RGX1NUQVRVUyB3bWFfZ2V0X29sZF9hbmRfbmV3X2h3X2luZGV4KHVpbnQzMl90ICpvbGRfaHdfbW9kZV9pbmRleCwKKwkJdWludDMyX3QgKm5ld19od19tb2RlX2luZGV4KTsKK3ZvaWQgd21hX3NldF9kYnNfY2FwYWJpbGl0eV91dCh1aW50MzJfdCBkYnMpOworQ0RGX1NUQVRVUyB3bWFfZ2V0X2Ric19od19tb2Rlcyhib29sICpvbmVfYnlfb25lX2RicywgYm9vbCAqdHdvX2J5X3R3b19kYnMpOworQ0RGX1NUQVRVUyB3bWFfZ2V0X2N1cnJlbnRfaHdfbW9kZShzdHJ1Y3Qgc2lyX2h3X21vZGVfcGFyYW1zICpod19tb2RlKTsKK2Jvb2wgd21hX2lzX2Ric19lbmFibGUodm9pZCk7Citib29sIHdtYV9pc19hZ2lsZV9kZnNfZW5hYmxlKHZvaWQpOworQ0RGX1NUQVRVUyB3bWFfZ2V0X3VwZGF0ZWRfc2Nhbl9jb25maWcodWludDMyX3QgKnNjYW5fY29uZmlnLAorCQlib29sIGRic19zY2FuLAorCQlib29sIGRic19wbHVzX2FnaWxlX3NjYW4sCisJCWJvb2wgc2luZ2xlX21hY19zY2FuX3dpdGhfZGZzKTsKK0NERl9TVEFUVVMgd21hX2dldF91cGRhdGVkX2Z3X21vZGVfY29uZmlnKHVpbnQzMl90ICpmd19tb2RlX2NvbmZpZywKKwkJYm9vbCBkYnMsCisJCWJvb2wgYWdpbGVfZGZzKTsKK2Jvb2wgd21hX2dldF9kYnNfc2Nhbl9jb25maWcodm9pZCk7Citib29sIHdtYV9nZXRfZGJzX3BsdXNfYWdpbGVfc2Nhbl9jb25maWcodm9pZCk7Citib29sIHdtYV9nZXRfc2luZ2xlX21hY19zY2FuX3dpdGhfZGZzX2NvbmZpZyh2b2lkKTsKK2Jvb2wgd21hX2dldF9kYnNfY29uZmlnKHZvaWQpOworYm9vbCB3bWFfZ2V0X2FnaWxlX2Rmc19jb25maWcodm9pZCk7Citib29sIHdtYV9pc19kdWFsX21hY19kaXNhYmxlZF9pbl9pbmkodm9pZCk7Citib29sIHdtYV9nZXRfcHJldl9kYnNfY29uZmlnKHZvaWQpOworYm9vbCB3bWFfZ2V0X3ByZXZfYWdpbGVfZGZzX2NvbmZpZyh2b2lkKTsKK2Jvb2wgd21hX2dldF9wcmV2X2Ric19zY2FuX2NvbmZpZyh2b2lkKTsKK2Jvb2wgd21hX2dldF9wcmV2X2Ric19wbHVzX2FnaWxlX3NjYW5fY29uZmlnKHZvaWQpOworYm9vbCB3bWFfZ2V0X3ByZXZfc2luZ2xlX21hY19zY2FuX3dpdGhfZGZzX2NvbmZpZyh2b2lkKTsKKworI2RlZmluZSBMUk9fSVBWNF9TRUVEX0FSUl9TWiA1CisjZGVmaW5lIExST19JUFY2X1NFRURfQVJSX1NaIDExCisKKy8qKgorICogc3RydWN0IHdtYV9scm9faW5pdF9jbWRfdCAtIHNldCBMUk8gaW5pdCBwYXJhbWV0ZXJzCisgKiBAbHJvX2VuYWJsZTogaW5kaWNhdGVzIHdoZXRoZXIgbHJvIGlzIGVuYWJsZWQKKyAqIEB0Y3BfZmxhZzogSWYgdGhlIFRDUCBmbGFncyBmcm9tIHRoZSBwYWNrZXQgZG8gbm90IG1hdGNoCisgKiB0aGUgdmFsdWVzIGluIHRoaXMgZmllbGQgYWZ0ZXIgbWFza2luZyB3aXRoIFRDUCBmbGFncyBtYXNrCisgKiBiZWxvdywgcGFja2V0IGlzIG5vdCBMUk8gZWxpZ2libGUKKyAqIEB0Y3BfZmxhZ19tYXNrOiBmaWVsZCBmb3IgY29tcGFyaW5nIHRoZSBUQ1AgdmFsdWVzIHByb3ZpZGVkCisgKiBhYm92ZSB3aXRoIHRoZSBUQ1AgZmxhZ3MgZmllbGQgaW4gdGhlIHJlY2VpdmVkIHBhY2tldAorICogQHRvZXBsaXR6X2hhc2hfaXB2NDogY29udGFpbnMgc2VlZCBuZWVkZWQgdG8gY29tcHV0ZSB0aGUgZmxvdyBpZAorICogNS10dXBsZSB0b2VwbGl0eiBoYXNoIGZvciBpcHY0IHBhY2tldHMKKyAqIEB0b2VwbGl0el9oYXNoX2lwdjY6IGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUgdGhlIGZsb3cgaWQKKyAqIDUtdHVwbGUgdG9lcGxpdHogaGFzaCBmb3IgaXB2NiBwYWNrZXRzCisgKi8KK3N0cnVjdCB3bWFfbHJvX2NvbmZpZ19jbWRfdCB7CisJdWludDMyX3QgbHJvX2VuYWJsZTsKKwl1aW50MzJfdCB0Y3BfZmxhZzo5LAorCQl0Y3BfZmxhZ19tYXNrOjk7CisJdWludDMyX3QgdG9lcGxpdHpfaGFzaF9pcHY0W0xST19JUFY0X1NFRURfQVJSX1NaXTsKKwl1aW50MzJfdCB0b2VwbGl0el9oYXNoX2lwdjZbTFJPX0lQVjZfU0VFRF9BUlJfU1pdOworfTsKKworI2lmIGRlZmluZWQoRkVBVFVSRV9MUk8pCitpbnQgd21hX2xyb19pbml0KHN0cnVjdCB3bWFfbHJvX2NvbmZpZ19jbWRfdCAqbHJvX2NvbmZpZyk7CisjZW5kaWYKK2Jvb2wgd21hX2lzX3NjYW5fc2ltdWx0YW5lb3VzX2NhcGFibGUodm9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvd21hL2luYy93bWFfZGZzX2ludGVyZmFjZS5oIGIvY29yZS93bWEvaW5jL3dtYV9kZnNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmYzNmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvd21hL2luYy93bWFfZGZzX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAiYXRoX2Rmc19zdHJ1Y3RzLmgiCisjaW5jbHVkZSA8Y2RmX2xvY2suaD4KKyNpbmNsdWRlICJjZHNfaWVlZTgwMjExX2NvbW1vbi5oIgorCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX01BWCAgICAgIDI1NQorCisvKiBjaGFubmVsIGF0dHJpYnV0ZXMgKi8KKworLyogVHVyYm8gY2hhbm5lbCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9UVVJCTyAgICAgICAgICAgIDB4MDAwMDAwMTAKKy8qIENDSyBjaGFubmVsICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0NDSyAgICAgICAgICAgICAgMHgwMDAwMDAyMAorLyogT0ZETSBjaGFubmVsICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX09GRE0gICAgICAgICAgICAgMHgwMDAwMDA0MAorLyogMiBHSHogc3BlY3RydW0gY2hhbm5lbC4gKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fMkdIWiAgICAgICAgICAgICAweDAwMDAwMDgwCisvKiA1IEdIeiBzcGVjdHJ1bSBjaGFubmVsICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOXzVHSFogICAgICAgICAgICAgMHgwMDAwMDEwMAorLyogT25seSBwYXNzaXZlIHNjYW4gYWxsb3dlZCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFICAgICAgICAgIDB4MDAwMDAyMDAKKy8qIER5bmFtaWMgQ0NLLU9GRE0gY2hhbm5lbCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9EWU4gICAgICAgICAgICAgIDB4MDAwMDA0MDAKKy8qIEdGU0sgY2hhbm5lbCAoRkhTUyBQSFkpICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0dGU0sgICAgICAgICAgICAgMHgwMDAwMDgwMAorLyogUmFkYXIgZm91bmQgb24gY2hhbm5lbCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9SQURBUiAgICAgICAgICAgIDB4MDAwMDEwMDAKKy8qIDExYSBzdGF0aWMgdHVyYm8gY2hhbm5lbCBvbmx5ICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX1NUVVJCTyAgICAgICAgICAgMHgwMDAwMjAwMAorLyogSGFsZiByYXRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fSEFMRiAgICAgICAgICAgICAweDAwMDA0MDAwCisvKiBRdWFydGVyIHJhdGUgY2hhbm5lbCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9RVUFSVEVSICAgICAgICAgIDB4MDAwMDgwMDAKKy8qIEhUIDIwIGNoYW5uZWwgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fSFQyMCAgICAgICAgICAgICAweDAwMDEwMDAwCisvKiBIVCA0MCB3aXRoIGV4dGVuc2lvbiBjaGFubmVsIGFib3ZlICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0hUNDBQTFVTICAgICAgICAgMHgwMDAyMDAwMAorLyogSFQgNDAgd2l0aCBleHRlbnNpb24gY2hhbm5lbCBiZWxvdyAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9IVDQwTUlOVVMgICAgICAgIDB4MDAwNDAwMDAKKy8qIEhUIDQwIEludG9sZXJhbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fSFQ0MElOVE9MICAgICAgICAweDAwMDgwMDAwCisvKiBWSFQgMjAgY2hhbm5lbCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9WSFQyMCAgICAgICAgICAgIDB4MDAxMDAwMDAKKy8qIFZIVCA0MCB3aXRoIGV4dGVuc2lvbiBjaGFubmVsIGFib3ZlICovCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX1ZIVDQwUExVUyAgICAgICAgMHgwMDIwMDAwMAorLyogVkhUIDQwIHdpdGggZXh0ZW5zaW9uIGNoYW5uZWwgYmVsb3cgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NIQU5fVkhUNDBNSU5VUyAgICAgICAweDAwNDAwMDAwCisvKiBWSFQgODAgY2hhbm5lbCAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9WSFQ4MCAgICAgICAgICAgIDB4MDA4MDAwMDAKKworLyogdG9rZW4gZm9yIGBgYW55IGNoYW5uZWwnJyAqLworI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9BTlkgICAgICAoLTEpCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOX0FOWUMgXAorCSgoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICopIElFRUU4MDIxMV9DSEFOX0FOWSkKKworI2RlZmluZSBJRUVFODAyMTFfSVNfQ0hBTl8xMU5fSFQ0ME1JTlVTKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOX0hUNDBNSU5VUykgIT0gMCkKKyNkZWZpbmUgSUVFRTgwMjExX0lTX0NIQU5fMTFOX0hUNDBQTFVTKF9jKSBcCisJKCgoX2MpLT5pY19mbGFncyAmIElFRUU4MDIxMV9DSEFOX0hUNDBQTFVTKSAhPSAwKQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl8xMUFDX1ZIVDgwIFwKKwkoSUVFRTgwMjExX0NIQU5fNUdIWiB8IElFRUU4MDIxMV9DSEFOX1ZIVDgwKQorCisjZGVmaW5lIElFRUU4MDIxMV9JU19DSEFOXzExQUNfVkhUODAoX2MpIFwKKwkoKChfYyktPmljX2ZsYWdzICYgSUVFRTgwMjExX0NIQU5fMTFBQ19WSFQ4MCkgPT0gXAorCSBJRUVFODAyMTFfQ0hBTl8xMUFDX1ZIVDgwKQorI2RlZmluZSBDSEFOTkVMXzEwOEcgXAorCShJRUVFODAyMTFfQ0hBTl8yR0hafElFRUU4MDIxMV9DSEFOX09GRE18SUVFRTgwMjExX0NIQU5fVFVSQk8pCisKKy8qCisgKiBTb2Z0d2FyZSB1c2U6IGNoYW5uZWwgaW50ZXJmZXJlbmNlCisgKiB1c2VkIGZvciBhcyBBUiBhcyB3ZWxsIGFzIFJBREFSCisgKiBpbnRlcmZlcmVuY2UgZGV0ZWN0aW9uCisgKi8KKyNkZWZpbmUgQ0hBTk5FTF9JTlRFUkZFUkVOQ0UgICAgMHgwMQorLyogSW4gY2FzZSBvZiBWSFQxNjAsIHdlIGNhbiBoYXZlIDggMjBNaHogY2hhbm5lbHMgKi8KKyNkZWZpbmUgSUVFODAyMTFfTUFYXzIwTV9TVUJfQ0ggOAorCisvKioKKyAqIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAtIGNoYW5uZWwgaW5mbworICogQGljX2ZyZXE6IGZyZXF1ZW5jeSBpbiBNSHoKKyAqIEBpY19mbGFnczogY2hhbm5lbCBmbGFncworICogQGljX2ZsYWdleHQ6IGZsYWdzIGV4dGVuc2lvbgorICogQGljX2llZWU6IElFRUUgY2hhbm5lbCBudW1iZXIKKyAqIEBpY19tYXhyZWdwb3dlcjogbWF4IHJlZ3VsYXRvcnkgcG93ZXIgaW4gZGJtCisgKiBAaWNfbWF4cG93ZXI6IG1heCB0eCBwb3dlciBpbiBkYm0KKyAqIEBpY19taW5wb3dlcjogbWluIHR4IHBvd2VyIGluIGRibQorICogQGljX3JlZ0NsYXNzSWQ6IHJlZyBjbGFzcyBpZCBvZiB0aGlzIGNoYW5uZWwKKyAqIEBpY19hbnRlbm5hbWF4OiBtYXggYW50ZW5uYSBnYWluIGZyb20gcmVndWxhdG9yeQorICogQGljX3ZodG9wX2NoX2ZyZXFfc2VnMTogY2hhbm5lbCBjZW50ZXIgZnJlcXVlbmN5CisgKiBAaWNfdmh0b3BfY2hfZnJlcV9zZWcyOiBDaGFubmVsIENlbnRlciBmcmVxdWVuY3kgYXBwbGljYWJsZQorICogQGljX3ByaV9mcmVxX2NlbnRlcl9mcmVxX21oel9zZXBhcmF0aW9uOiBzZXBhcmF0aW9uIGIvdyBwcmkgYW5kIGNlbnRlciBmcmVxCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCB7CisJdWludDMyX3QgaWNfZnJlcTsKKwl1aW50MzJfdCBpY19mbGFnczsKKwl1aW50OF90IGljX2ZsYWdleHQ7CisJdWludDhfdCBpY19pZWVlOworCWludDhfdCBpY19tYXhyZWdwb3dlcjsKKwlpbnQ4X3QgaWNfbWF4cG93ZXI7CisJaW50OF90IGljX21pbnBvd2VyOworCXVpbnQ4X3QgaWNfcmVnQ2xhc3NJZDsKKwl1aW50OF90IGljX2FudGVubmFtYXg7CisJdWludDMyX3QgaWNfdmh0b3BfY2hfZnJlcV9zZWcxOworCXVpbnQzMl90IGljX3ZodG9wX2NoX2ZyZXFfc2VnMjsKKwlpbnQgaWNfcHJpX2ZyZXFfY2VudGVyX2ZyZXFfbWh6X3NlcGFyYXRpb247Cit9OworCisvKioKKyAqIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9saXN0IC0gY2hhbm5lbCBsaXN0CisgKiBAY2xfbmNoYW5zOiBudW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBjbF9jaGFubmVsczogY2hhbm5lbCBpbmZvCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9saXN0IHsKKwlpbnQgY2xfbmNoYW5zOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2xfY2hhbm5lbHNbSUVFODAyMTFfTUFYXzIwTV9TVUJfQ0hdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaWVlZTgwMjExX2Rmc19zdGF0ZSAtIGRmcyBzdGF0ZQorICogQG5vbF9ldmVudDogbm9sIGV2ZW50IGxpc3QKKyAqIEBub2xfdGltZXI6IG5vbCBsaXN0IHByb2Nlc3NpbmcKKyAqIEBjYWNfdGltZXI6IGNhYyB0aW1lcgorICogQGN1cmVwczogY3VycmVudCBldmVudHMvc2Vjb25kCisgKiBAbGFzdGNoYW46IGNoYW4gdy8gbGFzdCByYWRhciBldmVudAorICogQG5ld2NoYW46IGNoYW4gc2VsZWN0ZWQgbmV4dAorICogQGNhY190aW1lb3V0X292ZXJyaWRlOiBvdmVycmlkZGVuIGNhYyB0aW1lb3V0CisgKiBAZmxhZ3M6IGRmcyBmbGFncworICovCitzdHJ1Y3QgaWVlZTgwMjExX2Rmc19zdGF0ZSB7CisJaW50IG5vbF9ldmVudFtJRUVFODAyMTFfQ0hBTl9NQVhdOworCW9zX3RpbWVyX3Qgbm9sX3RpbWVyOworCW9zX3RpbWVyX3QgY2FjX3RpbWVyOworCWludCBjdXJlcHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpsYXN0Y2hhbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKm5ld2NoYW47CisJaW50IGNhY190aW1lb3V0X292ZXJyaWRlOworCXVpbnQ4X3QgZW5hYmxlIDogMSwgY2FjX3RpbWVyX3J1bm5pbmcgOiAxLCBpZ25vcmVfZGZzIDogMSwgaWdub3JlX2NhYyA6IDE7Cit9OworCisvKioKKyAqIHN0cnVjdCBpZWVlODAyMTFjb20gLSBwZXIgZGV2aWNlIHN0cnVjdHVyZQorICogQGljX29wbW9kZTogb3BlcmF0aW9uIG1vZGUKKyAqIEBpY19jaGFubmVsczogaWVlZTgwMjExIGNoYW5uZWwgbGlzdAorICogQGljX25jaGFuczogbnVtYmVyIG9mIGNoYW5uZWxzCisgKiBAaWNfY3VyY2hhbjogY3VycmVudCBjaGFubmVsCisgKiBAaWNfaXNkZnNyZWdkb21haW46IGlzIG9wZWFydGluZyBpbiBkZnMgcmVnaW9uCisgKiBAY3VycmVudF9kZnNfcmVnZG9tYWluOiBjdXJyZW50IGRmcyByZWd1bGF0b3J5IGRvbWFpbgorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBsYXN0X3JhZGFyX2ZvdW5kX2NoYW46IGxhc3QgcmFkYXIgZm91bmQgY2hhbm5lbAorICogQGRmc19wcmlfbXVsdGlwbGllcjogZGZzIG11bHRpcGxpZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaWVlZTgwMjExY29tIHsKKwl2b2lkICgqaWNfc3RhcnRfY3NhKShzdHJ1Y3QgaWVlZTgwMjExY29tICppYywgdWludDhfdCBpZWVlQ2hhbik7CisJdm9pZCAoKmljX2dldF9leHRfY2hhbl9pbmZvKShzdHJ1Y3QgaWVlZTgwMjExY29tICppYywKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9saXN0ICpjaGFuKTsKKwllbnVtIGllZWU4MDIxMV9vcG1vZGUgaWNfb3Btb2RlOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqKCppY19maW5kX2NoYW5uZWwpKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLAorCQkJCQkJICAgICBpbnQgZnJlcSwgdWludDMyX3QgZmxhZ3MpOworCXVpbnQ2NF90ICgqaWNfZ2V0X1RTRjY0KShzdHJ1Y3QgaWVlZTgwMjExY29tICppYyk7CisJdW5zaWduZWQgaW50ICgqaWNfaWVlZTJtaHopKHVfaW50IGNoYW4sIHVfaW50IGZsYWdzKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgaWNfY2hhbm5lbHNbSUVFRTgwMjExX0NIQU5fTUFYICsgMV07CisJaW50IGljX25jaGFuczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmljX2N1cmNoYW47CisJdWludDhfdCBpY19pc2Rmc3JlZ2RvbWFpbjsKKwlpbnQgKCppY19nZXRfZGZzZG9tYWluKShzdHJ1Y3QgaWVlZTgwMjExY29tICopOworCXVpbnQxNl90ICgqaWNfZGZzX3VzZW5vbCkoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpOworCXVpbnQxNl90ICgqaWNfZGZzX2lzZGZzcmVnZG9tYWluKShzdHJ1Y3QgaWVlZTgwMjExY29tICppYyk7CisJaW50ICgqaWNfZGZzX2F0dGFjaGVkKShzdHJ1Y3QgaWVlZTgwMjExY29tICppYyk7CisJdm9pZCAqaWNfZGZzOworCXN0cnVjdCBpZWVlODAyMTFfZGZzX3N0YXRlIGljX2Rmc19zdGF0ZTsKKwlpbnQgKCppY19kZnNfYXR0YWNoKShzdHJ1Y3QgaWVlZTgwMjExY29tICppYywKKwkJCSAgICAgdm9pZCAqcENhcCwgdm9pZCAqcmFkYXJfaW5mbyk7CisJaW50ICgqaWNfZGZzX2RldGFjaCkoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpOworCWludCAoKmljX2Rmc19lbmFibGUpKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLCBpbnQgKmlzX2Zhc3RjbGssCisJCQkgICAgIHZvaWQgKik7CisJaW50ICgqaWNfZGZzX2Rpc2FibGUpKHN0cnVjdCBpZWVlODAyMTFjb20gKmljKTsKKwlpbnQgKCppY19nZXRfZXh0X2J1c3kpKHN0cnVjdCBpZWVlODAyMTFjb20gKmljKTsKKwlpbnQgKCppY19nZXRfbWliX2N5Y2xlX2NvdW50c19wY3QpKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLAorCQkJCQkgICB1aW50MzJfdCAqcnhjX3BjbnQsCisJCQkJCSAgIHVpbnQzMl90ICpyeGZfcGNudCwKKwkJCQkJICAgdWludDMyX3QgKnR4Zl9wY250KTsKKwlpbnQgKCppY19kZnNfZ2V0X3RocmVzaG9sZHMpKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLCB2b2lkICpwZSk7CisKKwlpbnQgKCppY19kZnNfZGVidWcpKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLCBpbnQgdHlwZSwgdm9pZCAqZGF0YSk7CisJLyoKKwkgKiBVcGRhdGUgdGhlIGNoYW5uZWwgbGlzdCB3aXRoIHRoZSBjdXJyZW50IHNldCBvZiBERlMKKwkgKiBOT0wgZW50cmllcy4KKwkgKgorCSAqICsgJ2NtZCcgaW5kaWNhdGVzIHdoYXQgdG8gZG87IGZvciBub3cgaXQgc2hvdWxkIGp1c3QKKwkgKiAgIGJlIERGU19OT0xfQ0xJU1RfQ01EX1VQREFURSB3aGljaCB3aWxsIHVwZGF0ZSBhbGwKKwkgKiAgIGNoYW5uZWxzLCBnaXZlbiB0aGUgX2VudGlyZV8gTk9MLiAoUmF0aGVyIHRoYW4KKwkgKiAgIHRoZSBlYXJsaWVyIGJlaGF2aW91ciB3aXRoIGNsaXN0X3VwZGF0ZSwgd2hpY2gKKwkgKiAgIHdhcyB0byBlaXRoZXIgYWRkIG9yIHJlbW92ZSBhIHNldCBvZiBjaGFubmVsCisJICogICBlbnRyaWVzLikKKwkgKi8KKwl2b2lkICgqaWNfZGZzX2NsaXN0X3VwZGF0ZSkoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsIGludCBjbWQsCisJCQkJICAgIHN0cnVjdCBkZnNfbm9sX2NoYW5fZW50cnkgKiwgaW50IG5lbnRyaWVzKTsKKwl2b2lkICgqaWNfZGZzX25vdGlmeV9yYWRhcikoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbik7CisJdm9pZCAoKmljX2Rmc191bm1hcmtfcmFkYXIpKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4pOworCWludCAoKmljX2Rmc19jb250cm9sKShzdHJ1Y3QgaWVlZTgwMjExY29tICppYywKKwkJCSAgICAgIHVfaW50IGlkLCB2b2lkICppbmRhdGEsIHVpbnQzMl90IGluc2l6ZSwKKwkJCSAgICAgIHZvaWQgKm91dGRhdGEsIHVpbnQzMl90ICpvdXRzaXplKTsKKwlIQUxfREZTX0RPTUFJTiBjdXJyZW50X2Rmc19yZWdkb21haW47CisJdWludDhfdCB2ZGV2X2lkOworCXVpbnQ4X3QgbGFzdF9yYWRhcl9mb3VuZF9jaGFuOworCWludDMyX3QgZGZzX3ByaV9tdWx0aXBsaWVyOworCWNkZl9tdXRleF90IGNoYW5fbG9jazsKK30gSUVFRTgwMjExQ09NLCAqUElFRUU4MDIxMUNPTTsKKworLyoqCisgKiBpZWVlODAyMTFfY2hhbjJmcmVxKCkgLSBDb252ZXJ0IGNoYW5uZWwgdG8gZnJlcXVlbmN5IHZhbHVlLgorICogQGljOiBpZWVlODAyMTFjb20gcHRyCisgKiBAYzogaWVlZTgwMjExIGNoYW5uZWwKKyAqCisgKiBSZXR1cm46IGZyZXFlbmN5IGluIE1IegorICovCitzdGF0aWMgSU5MSU5FIHVfaW50CitpZWVlODAyMTFfY2hhbjJmcmVxKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLCBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmMpCit7CisJaWYgKGMgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIChjID09IElFRUU4MDIxMV9DSEFOX0FOWUMgPyBJRUVFODAyMTFfQ0hBTl9BTlkgOiBjLT5pY19mcmVxKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvd21hL2luYy93bWFfaWYuaCBiL2NvcmUvd21hL2luYy93bWFfaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWM1MGY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS93bWEvaW5jL3dtYV9pZi5oCkBAIC0wLDAgKzEsMTQyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfSEFMTVNHQVBJX0hfCisjZGVmaW5lIF9IQUxNU0dBUElfSF8KKworI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgInNpcl9hcGkuaCIKKyNpbmNsdWRlICJzaXJfcGFyYW1zLmgiCisKKworLyoKKyAqIFZhbGlkYXRlIHRoZSBPUyBUeXBlIGJlaW5nIGJ1aWx0CisgKi8KKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfQU5EUk9JRCkgICAgICAgIC8qIEFORFJPSUQgKi8KKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfUU5YKQorI2Vycm9yICJtb3JlIHRoYW4gb25lIEFOSV9PU19UWVBFX3h4eCBpcyBkZWZpbmVkIGZvciB0aGlzIGJ1aWxkIgorI2VuZGlmCisKKyNlbGlmIGRlZmluZWQgKEFOSV9PU19UWVBFX1FOWCkgICAgICAgIC8qIFFOWCAqLworCisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9BTkRST0lEKQorI2Vycm9yICJtb3JlIHRoYW4gb25lIEFOSV9PU19UWVBFX3h4eCBpcyBkZWZpbmVkIGZvciB0aGlzIGJ1aWxkIgorI2VuZGlmCisKKyNlbGlmICFkZWZpbmVkKEFOSV9PU19UWVBFX0FORFJPSUQpICYmICFkZWZpbmVkKEFOSV9PU19UWVBFX1FOWCkgICAgICAgIC8qIE5PTkUgKi8KKyNlcnJvciAiTk9ORSBvZiB0aGUgQU5JX09TX1RZUEVfeHh4IGFyZSBkZWZpbmVkIGZvciB0aGlzIGJ1aWxkIgorI2VuZGlmCisKKy8qCisgKiBWYWxpZGF0ZSB0aGUgY29tcGlsZXIKKyAqLworI2lmIChkZWZpbmVkIChBTklfQ09NUElMRVJfVFlQRV9NU1ZDKSAmJiBkZWZpbmVkIChBTklfQ09NUElMRVJfVFlQRV9HQ0MpICYmIGRlZmluZWQgKEFOSV9DT01QSUxFUl9UWVBFX1JWQ1QpKQorI2Vycm9yICJtb3JlIHRoYW4gb25lIEFOSV9DT01QSUxFUl9UWVBFX3h4eCBpcyBkZWZpbmVkIGZvciB0aGlzIGJ1aWxkIgorCisjZWxpZiAhKGRlZmluZWQgKEFOSV9DT01QSUxFUl9UWVBFX01TVkMpIHx8IGRlZmluZWQgKEFOSV9DT01QSUxFUl9UWVBFX0dDQykgfHwgZGVmaW5lZCAoQU5JX0NPTVBJTEVSX1RZUEVfUlZDVCkpCisjZXJyb3IgIk5PTkUgb2YgdGhlIEFOSV9DT01QSUxFUl9UWVBFX3h4eCBhcmUgZGVmaW5lZCBmb3IgdGhpcyBidWlsZCIKKworI2VuZGlmCisKKworI2RlZmluZSBXTUFfQ09ORklHX1BBUkFNX1VQREFURV9SRVEgICAgU0lSX0NGR19QQVJBTV9VUERBVEVfSU5ECisKKyNkZWZpbmUgSEFMX05VTV9CU1NJRCAyCisvKiBvcGVyTW9kZSBpbiBBREQgQlNTIG1lc3NhZ2UgKi8KKyNkZWZpbmUgQlNTX09QRVJBVElPTkFMX01PREVfQVAgICAgIDAKKyNkZWZpbmUgQlNTX09QRVJBVElPTkFMX01PREVfU1RBICAgIDEKKyNkZWZpbmUgQlNTX09QRVJBVElPTkFMX01PREVfSUJTUyAgIDIKKworLyogU1RBIGVudHJ5IHR5cGUgaW4gYWRkIHN0YSBtZXNzYWdlICovCisjZGVmaW5lIFNUQV9FTlRSWV9TRUxGICAgICAgICAgICAgICAwCisjZGVmaW5lIFNUQV9FTlRSWV9PVEhFUiAgICAgICAgICAgICAxCisjZGVmaW5lIFNUQV9FTlRSWV9CU1NJRCAgICAgICAgICAgICAyCisvKiBTcGVjaWFsIHN0YXRpb24gaWQgZm9yIHRyYW5zbWl0dGluZyBicm9hZGNhc3QgZnJhbWVzLiAqLworI2RlZmluZSBTVEFfRU5UUllfQkNBU1QgICAgICAgICAgICAgMworI2RlZmluZSBTVEFfRU5UUllfUEVFUiAgICAgICAgICAgICAgU1RBX0VOVFJZX09USEVSCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKyNkZWZpbmUgU1RBX0VOVFJZX1RETFNfUEVFUiAgICAgICAgIDQKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fVERMUyAqLworCisjZGVmaW5lIFNUQV9JTlZBTElEX0lEWCAweEZGCisKKy8qIGludmFsaWQgY2hhbm5lbCBpZC4gKi8KKyNkZWZpbmUgSU5WQUxJRF9DSEFOTkVMX0lEIDAKKworLyoKKyAqIEZyb20gTk9WQSBNYWMgQXJjaCBkb2N1bWVudAorICogIEVuY3J5cC4gbW9kZSAgICBUaGUgZW5jcnlwdGlvbiBtb2RlCisgKiAgMDAwOiBFbmNyeXB0aW9uIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGVuYWJsZWQKKyAqICAwMDE6IEVuY3J5cHRpb24gaXMgc2V0IHRvIFdFUAorICogIDAxMDogRW5jcnlwdGlvbiBpcyBzZXQgdG8gV0VQIDEwNAorICogIDAxMTogRW5jcnlwdGlvbiBpcyBzZXQgdG8gVEtJUAorICogIDEwMDogRW5jcnlwdGlvbiBpcyBzZXQgdG8gQUVTCisgKiAgMTAxIC0gMTExOiBSZXNlcnZlZCBmb3IgZnV0dXJlCisgKi8KKyNkZWZpbmUgRU5DX1BPTElDWV9OVUxMICAgICAgICAwCisjZGVmaW5lIEVOQ19QT0xJQ1lfV0VQNDAgICAgICAgMQorI2RlZmluZSBFTkNfUE9MSUNZX1dFUDEwNCAgICAgIDIKKyNkZWZpbmUgRU5DX1BPTElDWV9US0lQICAgICAgICAzCisjZGVmaW5lIEVOQ19QT0xJQ1lfQUVTX0NDTSAgICAgNAorCisvKiBNYXggbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciBzdGF0aW9ucyBiaXRtYXAgYWxpZ25lZCBhdCA0IGJ5dGVzIGJvdW5kYXJ5CisgKi8KKyNkZWZpbmUgSEFMTVNHX05VTUJZVEVTX1NUQVRJT05fQklUTUFQKHgpICgoKHggLyAzMikgKyAoKHggJSAzMikgPyAxIDogMCkpICogNCkKKworCisjZGVmaW5lIEhBTF9NQVhfU1VQUF9DSEFOTkVMUyAgICAgMTI4CisjZGVmaW5lIEhBTF9NQVhfU1VQUF9PUEVSX0NMQVNTRVMgMzIKKworLyoqCisgKiBlbnVtIGVGcmFtZVR5cGUgLSBmcmFtZSB0eXBlcworICogQFRYUlhfRlJNX1JBVzogcmF3IGZyYW1lCisgKiBAVFhSWF9GUk1fRVRIMjogZXRoZXJuZXQgZnJhbWUKKyAqIEBUWFJYX0ZSTV84MDJfMzogODAyLjMgZnJhbWUKKyAqIEBUWFJYX0ZSTV84MDJfMTFfTUdNVDogODAyLjExIG1nbXQgZnJhbWUKKyAqIEBUWFJYX0ZSTV84MDJfMTFfQ1RSTDogODAyLjExIGNvbnRyb2wgZnJhbWUKKyAqIEBUWFJYX0ZSTV84MDJfMTFfREFUQTogODAyLjExIGRhdGEgZnJhbWUKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlUWFJYX0ZSTV9SQVcsCisJVFhSWF9GUk1fRVRIMiwKKwlUWFJYX0ZSTV84MDJfMywKKwlUWFJYX0ZSTV84MDJfMTFfTUdNVCwKKwlUWFJYX0ZSTV84MDJfMTFfQ1RSTCwKKwlUWFJYX0ZSTV84MDJfMTFfREFUQSwKKwlUWFJYX0ZSTV9JR05PUkVELCAgIC8qIFRoaXMgZnJhbWUgd2lsbCBiZSBkcm9wcGVkICovCisJVFhSWF9GUk1fTUFYCit9IGVGcmFtZVR5cGU7CisKKy8qKgorICogZW51bSBlRnJhbWVUeERpciAtIGZyYW1lIHR4IGRpcmVjdGlvbgorICogQEFOSV9UWERJUl9JQlNTOiBJQlNTIGZyYW1lCisgKiBAQU5JX1RYRElSX1RPRFM6IGZyYW1lIHRvIERTCisgKiBAQU5JX1RYRElSX0ZST01EUzogRnJhbWUgZnJvbSBEUworICogQEFOSV9UWERJUl9XRFM6IFdEUyBmcmFtZQorICovCit0eXBlZGVmIGVudW0geworCUFOSV9UWERJUl9JQlNTID0gMCwKKwlBTklfVFhESVJfVE9EUywKKwlBTklfVFhESVJfRlJPTURTLAorCUFOSV9UWERJUl9XRFMKK30gZUZyYW1lVHhEaXI7CisKKy8qKgorICpzdHJ1Y3Qgc0FuaUJlYWNvblN0cnVjdCAtIEJlYWNvbiBzdHJ1Y3R1cmUKKyAqIEBiZWFjb25MZW5ndGg6IGJlYWNvbiBsZW5ndGgKKyAqIEBtYWNIZHI6IG1hYyBoZWFkZXIgZm9yIGJlYWNvbgorICovCit0eXBlZGVmIHN0cnVjdCBzQW5pQmVhY29uU3RydWN0IHsKKwl1aW50MzJfdCBiZWFjb25MZW5ndGg7CisJdFNpck1hY01nbXRIZHIgbWFjSGRyOworfSBjZGZfcGFja2VkIHRBbmlCZWFjb25TdHJ1Y3QsICp0cEFuaUJlYWNvblN0cnVjdDsKKworLyoqCisgKiBzdHJ1Y3Qgc0FuaVByb2JlUnNwU3RydWN0IC0gcHJvYmVSc3AgdGVtcGxhdGUgc3RydWN0dXJlCisgKiBAbWFjSGRyOiBtYWMgaGVhZGVyIGZvciBwcm9iZSByZXNwb25zZQorICovCit0eXBlZGVmIHN0cnVjdCBzQW5pUHJvYmVSc3BTdHJ1Y3QgeworCXRTaXJNYWNNZ210SGRyIG1hY0hkcjsKKwkvKiBwcm9iZVJzcCBib2R5IGZvbGxvd3MgaGVyZSAqLworfSBjZGZfcGFja2VkIHRBbmlQcm9iZVJzcFN0cnVjdCwgKnRwQW5pUHJvYmVSc3BTdHJ1Y3Q7CisKKy8qKgorICogc3RydWN0IHRBZGRTdGFQYXJhbXMgLSBhZGQgc3RhIHJlbGF0ZWQgcGFyYW1ldGVycworICogQGJzc0lkOiBic3NpZCBvZiBzdGEKKyAqIEBhc3NvY0lkOiBhc3NvY2lkCisgKiBAc3RhVHlwZTogMCAtIFNlbGYsIDEgb3RoZXIvcmVtb3RlLCAyIC0gYnNzaWQKKyAqIEBzdGFNYWM6IE1BQyBBZGRyZXNzIG9mIFNUQQorICogQHNob3J0UHJlYW1ibGVTdXBwb3J0ZWQ6IGlzIHNob3J0IHByZWFtYmxlIHN1cHBvcnRlZCBvciBub3QKKyAqIEBsaXN0ZW5JbnRlcnZhbDogTGlzdGVuIGludGVydmFsCisgKiBAd21tRW5hYmxlZDogU3VwcG9ydCBmb3IgMTFlL1dNTQorICogQHVBUFNEOiBVLUFQU0QgRmxhZ3M6IDFiIHBlciBBQworICogQG1heFNQTGVuOiBNYXggU1AgTGVuZ3RoCisgKiBAaHRDYXBhYmxlOiAxMW4gSFQgY2FwYWJsZSBTVEEKKyAqIEBncmVlbkZpZWxkQ2FwYWJsZTogMTFuIEdyZWVuIEZpZWxkIHByZWFtYmxlIHN1cHBvcnQKKyAqIEB0eENoYW5uZWxXaWR0aFNldDogVFggV2lkdGggU2V0OiAwIC0gMjAgTUh6IG9ubHksIDEgLSAyMC80MCBNSHoKKyAqIEBtaW1vUFM6IE1JTU8gUG93ZXIgU2F2ZQorICogQHJpZnNNb2RlOiBSSUZTIG1vZGU6IDAgLSBOQSwgMSAtIEFsbG93ZWQKKyAqIEBsc2lnVHhvcFByb3RlY3Rpb246IEwtU0lHIFRYT1AgUHJvdGVjdGlvbiBtZWNoYW5pc20KKyAqIEB1czMyTWF4QW1wZHVEdXJhdGlvbjogaW4gdW5pdHMgb2YgMzIgdXMKKyAqIEBtYXhBbXBkdVNpemU6ICAwIDogOGsgLCAxIDogMTZrLCAyIDogMzJrLCAzIDogNjRrCisgKiBAbWF4QW1wZHVEZW5zaXR5OiAzIDogMH43IDogMl4oMTFuQU1QRFVkZW5zaXR5IC00KQorICogQG1heEFtc2R1U2l6ZTogMSA6IDM4MzkgYnl0ZXMsIDAgOiA3OTM1IGJ5dGVzCisgKiBAZkRzc3NDY2tNb2RlNDBNaHo6IERTU1MgQ0NLIHN1cHBvcnRlZCA0ME1IegorICogQGZTaG9ydEdJNDBNaHo6IHNob3J0IEdJIHN1cHBvcnQgZm9yIDQwTWh6IHBhY2tldHMKKyAqIEBmU2hvcnRHSTIwTWh6OiBzaG9ydCBHSSBzdXBwb3J0IGZvciAyME1oeiBwYWNrZXRzCisgKiBAc3VwcG9ydGVkUmF0ZXM6IGxlZ2FjeSBzdXBwb3J0ZWQgcmF0ZXMKKyAqIEBzdGF0dXM6IENERiBzdGF0dXMKKyAqIEBzdGFJZHg6IHN0YXRpb24gaW5kZXgKKyAqIEBic3NJZHg6IEJTU0lEIG9mIEJTUyB0byB3aGljaCB0aGUgc3RhdGlvbiBpcyBhc3NvY2lhdGVkCisgKiBAdXBkYXRlU3RhOiBwZGF0ZSB0aGUgZXhpc3RpbmcgU1RBIGVudHJ5LCBpZiB0aGlzIGZsYWcgaXMgc2V0CisgKiBAcmVzcFJlcWQ6IEEgZmxhZyB0byBpbmRpY2F0ZSB0byBIQUwgaWYgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgaXMgcmVxdWlyZWQKKyAqIEBybWZFbmFibGVkOiBSb2J1c3QgTWFuYWdlbWVudCBGcmFtZSAoUk1GKSBlbmFibGVkL2Rpc2FibGVkCisgKiBAZW5jcnlwdFR5cGU6IFRoZSB1bmljYXN0IGVuY3J5cHRpb24gdHlwZSBpbiB0aGUgYXNzb2NpYXRpb24KKyAqIEB1Y1VjYXN0U2lnOiBVbmljYXN0IERQVSBpbmRleAorICogQHVjQmNhc3RTaWc6IEJyb2FkY2FzdCBEUFUgaW5kZXgKKyAqIEBzZXNzaW9uSWQ6IFBFIHNlc3Npb24gaWQKKyAqIEBwMnBDYXBhYmxlU3RhOiBpZiB0aGlzIGlzIGEgUDJQIENhcGFibGUgU3RhCisgKiBAY3NhT2ZmbG9hZEVuYWJsZTogQ1NBIG9mZmxvYWQgZW5hYmxlIGZsYWcKKyAqIEB2aHRDYXBhYmxlOiBpcyBWSFQgY2FwYWJhbGUgb3Igbm90CisgKiBAdmh0VHhDaGFubmVsV2lkdGhTZXQ6IFZIVCBjaGFubmVsIHdpZHRoCisgKiBAdmh0U3VwcG9ydGVkUnhOc3M6IFZIVCBzdXBwb3J0ZWQgUlggTlNTCisgKiBAdmh0VHhCRkNhcGFibGU6IHR4YmYgY2FwYWJsZSBvciBub3QKKyAqIEB2aHRUeE1VQmZvcm1lZUNhcGFibGU6IEJmb3JtZWUgY2FwYWJsZSBvciBub3QKKyAqIEBlbmFibGVWaHRwQWlkOiBlbmFibGUgVkhUIEFJRAorICogQGVuYWJsZVZodEdpZDogZW5hYmxlIFZIVCBHSUQKKyAqIEBlbmFibGVBbXBkdVBzOiBBTVBEVSBwb3dlciBzYXZlCisgKiBAZW5hYmxlSHRTbXBzOiBlbmFibGUgSFQgU01QUworICogQGh0U21wc2NvbmZpZzogSFQgU01QUyBjb25maWcKKyAqIEBodExkcGNDYXBhYmxlOiBIVCBMRFBDIGNhcGFibGUKKyAqIEB2aHRMZHBjQ2FwYWJsZTogVkhUIExEUEMgY2FwYWJsZQorICogQHNtZXNlc3Npb25JZDogc21lIHNlc3Npb24gaWQKKyAqIEB3cGFfcnNuOiBSU04gY2FwYWJsZQorICogQGNhcGFiX2luZm86IGNhcGFiYWxpdHkgaW5mbworICogQGh0X2NhcHM6IEhUIGNhcGFiYWxpdGllcworICogQHZodF9jYXBzOiBWSFQgdmFwYWJhbGl0aWVzCisgKiBAbndUeXBlOiBOVyBUeXBlCisgKiBAbWF4VHhQb3dlcjogbWF4IHR4IHBvd2VyCisgKiBAYXRpbUllUHJlc2VudDogUGVlciBBdGltIEluZm8KKyAqIEBwZWVyQXRpbVdpbmRvd0xlbmd0aDogcGVlciBBVElNIFdpbmRvdyBsZW5ndGgKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBwYXJhbWV0ZXIgcmVxdWlyZWQgZm9yCisgKiBhZGQgc3RhIHJlcXVlc3Qgb2YgdXBwZXIgbGF5ZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl0U2lyTWFjQWRkciBic3NJZDsKKwl1aW50MTZfdCBhc3NvY0lkOworCS8qIEZpZWxkIHRvIGluZGljYXRlIGlmIHRoaXMgaXMgc3RhIGVudHJ5IGZvciBpdHNlbGYgU1RBIGFkZGluZyBlbnRyeQorCSAqIGZvciBpdHNlbGYgb3IgcmVtb3RlIChBUCBhZGRpbmcgU1RBIGFmdGVyIHN1Y2Nlc3NmdWwgYXNzb2NpYXRpb24uCisJICogVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSByZXF1aXJlZCBpbiBwcm9kdWN0aW9uIGRyaXZlci4KKwkgKi8KKwl1aW50OF90IHN0YVR5cGU7CisJdWludDhfdCBzaG9ydFByZWFtYmxlU3VwcG9ydGVkOworCXRTaXJNYWNBZGRyIHN0YU1hYzsKKwl1aW50MTZfdCBsaXN0ZW5JbnRlcnZhbDsKKwl1aW50OF90IHdtbUVuYWJsZWQ7CisJdWludDhfdCB1QVBTRDsKKwl1aW50OF90IG1heFNQTGVuOworCXVpbnQ4X3QgaHRDYXBhYmxlOworCS8qIDExbiBHcmVlbiBGaWVsZCBwcmVhbWJsZSBzdXBwb3J0CisJICogMCAtIE5vdCBzdXBwb3J0ZWQsIDEgLSBTdXBwb3J0ZWQKKwkgKiBBZGQgaXQgdG8gUkEgcmVsYXRlZCBmaWVsZHMgb2Ygc3RhIGVudHJ5IGluIEhBTAorCSAqLworCXVpbnQ4X3QgZ3JlZW5GaWVsZENhcGFibGU7CisJdWludDhfdCBjaF93aWR0aDsKKworCXRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSBtaW1vUFM7CisJdWludDhfdCByaWZzTW9kZTsKKwkvKiBMLVNJRyBUWE9QIFByb3RlY3Rpb24gbWVjaGFuaXNtCisJICogMCAtIE5vIFN1cHBvcnQsIDEgLSBTdXBwb3J0ZWQKKwkgKiBTRyAtIHRoZXJlIGlzIGdsb2JhbCBmaWVsZC4KKwkgKi8KKwl1aW50OF90IGxzaWdUeG9wUHJvdGVjdGlvbjsKKwl1aW50OF90IHVzMzJNYXhBbXBkdUR1cmF0aW9uOworCXVpbnQ4X3QgbWF4QW1wZHVTaXplOworCXVpbnQ4X3QgbWF4QW1wZHVEZW5zaXR5OworCXVpbnQ4X3QgbWF4QW1zZHVTaXplOworCisJLyogMTFuIFBhcmFtZXRlcnMgKi8KKwkvKiBIVCBTVEEgc2hvdWxkIHNldCBpdCB0byAxIGlmIGl0IGlzIGVuYWJsZWQgaW4gQlNTCisJICogSFQgU1RBIHNob3VsZCBzZXQgaXQgdG8gMCBpZiBBUCBkb2VzIG5vdCBzdXBwb3J0IGl0LgorCSAqIFRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHRvIEhBTCBhbmQgSEFMIHVzZXMgdGhpcyBmbGFnCisJICogdG8gcGlja3VwIHVwIGFwcHJvcHJpYXRlIDQwTWh6IHJhdGVzLgorCSAqLworCXVpbnQ4X3QgZkRzc3NDY2tNb2RlNDBNaHo7CisJdWludDhfdCBmU2hvcnRHSTQwTWh6OworCXVpbnQ4X3QgZlNob3J0R0kyME1oejsKKwl0U2lyU3VwcG9ydGVkUmF0ZXMgc3VwcG9ydGVkUmF0ZXM7CisJLyoKKwkgKiBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZm9yIHJldHVybmluZyBzdGF0dXMgYW5kIHN0YXRpb24gaW5kZXggZnJvbQorCSAqIEhBTCB0byBQRSB2aWEgcmVzcG9uc2UgbWVzc2FnZS4gSEFMIGRvZXMgbm90IHJlYWQgdGhlbS4KKwkgKi8KKwkvKiBUaGUgcmV0dXJuIHN0YXR1cyBvZiBTSVJfSEFMX0FERF9TVEFfUkVRIGlzIHJlcG9ydGVkIGhlcmUgKi8KKwlDREZfU1RBVFVTIHN0YXR1czsKKwkvKiBTdGF0aW9uIGluZGV4OyB2YWxpZCBvbmx5IHdoZW4gJ3N0YXR1cycgZmllbGQgdmFsdWUgaXMKKwkgKiBDREZfU1RBVFVTX1NVQ0NFU1MKKwkgKi8KKwl1aW50OF90IHN0YUlkeDsKKwkvKiBCU1NJRCBvZiBCU1MgdG8gd2hpY2ggdGhlIHN0YXRpb24gaXMgYXNzb2NpYXRlZC4KKwkgKiBUaGlzIHNob3VsZCBiZSBmaWxsZWQgYmFjayBpbiBieSBIQUwsIGFuZCBzZW50IGJhY2sgdG8gTElNIGFzIHBhcnQgb2YKKwkgKiB0aGUgcmVzcG9uc2UgbWVzc2FnZSwgc28gTElNIGNhbiBjYWNoZSBpdCBpbiB0aGUgc3RhdGlvbiBlbnRyeSBvZgorCSAqIGhhc2ggdGFibGUuIFdoZW4gc3RhdGlvbiBpcyBkZWxldGVkLCBMSU0gd2lsbCBtYWtlIHVzZSBvZiB0aGlzIGJzc0lkeAorCSAqIHRvIGRlbGV0ZSBCU1MgZnJvbSBoYWwgdGFibGVzIGFuZCBmcm9tIHNvZnRtYWMuCisJICovCisJdWludDhfdCBic3NJZHg7CisJdWludDhfdCB1cGRhdGVTdGE7CisJdWludDhfdCByZXNwUmVxZDsKKwl1aW50OF90IHJtZkVuYWJsZWQ7CisJdWludDMyX3QgZW5jcnlwdFR5cGU7CisJdWludDhfdCB1Y1VjYXN0U2lnOworCXVpbnQ4X3QgdWNCY2FzdFNpZzsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IHAycENhcGFibGVTdGE7CisJdWludDhfdCBjc2FPZmZsb2FkRW5hYmxlOworCXVpbnQ4X3Qgdmh0Q2FwYWJsZTsKKwl1aW50OF90IHZodFN1cHBvcnRlZFJ4TnNzOworCXVpbnQ4X3Qgdmh0VHhCRkNhcGFibGU7CisJdWludDhfdCBlbmFibGVfc3VfdHhfYmZvcm1lcjsKKwl1aW50OF90IHZodFR4TVVCZm9ybWVlQ2FwYWJsZTsKKwl1aW50OF90IGVuYWJsZVZodHBBaWQ7CisJdWludDhfdCBlbmFibGVWaHRHaWQ7CisJdWludDhfdCBlbmFibGVBbXBkdVBzOworCXVpbnQ4X3QgZW5hYmxlSHRTbXBzOworCXVpbnQ4X3QgaHRTbXBzY29uZmlnOworCXVpbnQ4X3QgaHRMZHBjQ2FwYWJsZTsKKwl1aW50OF90IHZodExkcGNDYXBhYmxlOworCXVpbnQ4X3Qgc21lc2Vzc2lvbklkOworCXVpbnQ4X3Qgd3BhX3JzbjsKKwl1aW50MTZfdCBjYXBhYl9pbmZvOworCXVpbnQxNl90IGh0X2NhcHM7CisJdWludDMyX3Qgdmh0X2NhcHM7CisJdFNpck53VHlwZSBud1R5cGU7CisJdFBvd2VyZEJtIG1heFR4UG93ZXI7CisJdWludDhfdCBhdGltSWVQcmVzZW50OworCXVpbnQzMl90IHBlZXJBdGltV2luZG93TGVuZ3RoOworCXVpbnQ4X3Qgbm9uUm9hbVJlYXNzb2M7Cit9IHRBZGRTdGFQYXJhbXMsICp0cEFkZFN0YVBhcmFtczsKKworLyoqCisgKiBzdHJ1Y3QgdERlbGV0ZVN0YVBhcmFtcyAtIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIGRlbCBzdGEgcmVxdWVzdAorICogQHN0YUlkeDogc3RhdGlvbiBpbmRleAorICogQGFzc29jSWQ6IGFzc29jaWF0aW9uIGluZGV4CisgKiBAc3RhdHVzOiBzdGF0dXMKKyAqIEByZXNwUmVxZDogaXMgcmVzcG9uc2UgcmVxdWlyZWQKKyAqIEBzZXNzaW9uSWQ6IFBFIHNlc3Npb24gaWQKKyAqIEBzbWVzZXNzaW9uSWQ6IFNNRSBzZXNzaW9uIGlkCisgKiBAc3RhVHlwZTogc3RhdGlvbiB0eXBlCisgKiBAc3RhTWFjOiBzdGF0aW9uIG1hYworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3Qgc3RhSWR4OworCXVpbnQxNl90IGFzc29jSWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCByZXNwUmVxZDsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IHNtZXNlc3Npb25JZDsKKwl1aW50OF90IHN0YVR5cGU7CisJdFNpck1hY0FkZHIgc3RhTWFjOworfSB0RGVsZXRlU3RhUGFyYW1zLCAqdHBEZWxldGVTdGFQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHRTZXRTdGFLZXlQYXJhbXMgLSBzZXQga2V5IHBhcmFtcworICogQHN0YUlkeDogc3RhdGlvbiBpZAorICogQGVuY1R5cGU6IGVuY3J5cHRpb24gdHlwZQorICogQHdlcFR5cGU6IFdFUCB0eXBlCisgKiBAZGVmV0VQSWR4OiBEZWZhdWx0IFdFUCBrZXksIHZhbGlkIG9ubHkgZm9yIHN0YXRpYyBXRVAsIG11c3QgYmV0d2VlbiAwIGFuZCAzCisgKiBAa2V5OiB2YWxpZCBvbmx5IGZvciBub24tc3RhdGljIFdFUCBlbmN5cnB0aW9ucworICogQHNpbmdsZVRpZFJjOiAxPVNpbmdsZSBUSUQgYmFzZWQgUmVwbGF5IENvdW50LCAwPVBlciBUSUQgYmFzZWQgUkMKKyAqIEBzbWVzZXNzaW9uSWQ6IHNtZSBzZXNzaW9uIGlkCisgKiBAcGVlck1hY0FkZHI6IHBlZXIgbWFjIGFkZHJlc3MKKyAqIEBzdGF0dXM6IHN0YXR1cworICogQHNlc3Npb25JZDogc2Vzc2lvbiBpZAorICogQHNlbmRSc3A6IHNlbmQgcmVzcG9uc2UKKyAqCisgKiBUaGlzIGlzIHVzZWQgYnkgUEUgdG8gY29uZmlndXJlIHRoZSBrZXkgaW5mb3JtYXRpb24gb24gYSBnaXZlbiBzdGF0aW9uLgorICogV2hlbiB0aGUgc2VjVHlwZSBpcyBXRVA0MCBvciBXRVAxMDQsIHRoZSBkZWZXRVBJZHggaXMgdXNlZCB0byBsb2NhdGUKKyAqIGEgcHJlY29uZmlndXJlZCBrZXkgZnJvbSBhIEJTUyB0aGUgc3RhdGlvbiBhc3NvaWNhdGVkIHdpdGg7IG90aGVyd2lzZQorICogYSBuZXcga2V5IGRlc2NyaXB0b3IgaXMgY3JlYXRlZCBiYXNlZCBvbiB0aGUga2V5IGZpZWxkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3Qgc3RhSWR4OworCXRBbmlFZFR5cGUgZW5jVHlwZTsKKwl0QW5pV2VwVHlwZSB3ZXBUeXBlOworCXVpbnQ4X3QgZGVmV0VQSWR4OworCXRTaXJLZXlzIGtleVtTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTXTsKKwl1aW50OF90IHNpbmdsZVRpZFJjOworCXVpbnQ4X3Qgc21lc2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXVpbnQ4X3Qgc2VuZFJzcDsKK30gdFNldFN0YUtleVBhcmFtcywgKnRwU2V0U3RhS2V5UGFyYW1zOworCisvKioKKyAqIHN0cnVjdCBzTGltTWxtU2V0S2V5c1JlcSAtIHNldCBrZXkgcmVxdWVzdCBwYXJhbWV0ZXJzCisgKiBAcGVlck1hY0FkZHI6IHBlZXIgbWFjIGFkZHJlc3MKKyAqIEBzZXNzaW9uSWQ6IFBFIHNlc3Npb24gaWQKKyAqIEBzbWVzZXNzaW9uSWQ6IFNNRSBzZXNzaW9uIGlkCisgKiBAYWlkOiBhc3NvY2lhdGlvbiBpZAorICogQGVkVHlwZTogRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHR5cGUKKyAqIEBudW1LZXlzOiBudW1iZXIgb2Yga2V5cworICogQGtleToga2V5IGRhdGEKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVNldEtleXNSZXEgeworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXVpbnQ4X3Qgc2Vzc2lvbklkOyAgICAgIC8qIEFkZGVkIEZvciBCVC1BTVAgU3VwcG9ydCAqLworCXVpbnQ4X3Qgc21lc2Vzc2lvbklkOyAgIC8qIEFkZGVkIGZvciBkcml2ZXJzIGJhc2VkIG9uIHdtaSBpbnRlcmZhY2UgKi8KKwl1aW50MTZfdCBhaWQ7CisJdEFuaUVkVHlwZSBlZFR5cGU7ICAgICAgLyogRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHR5cGUgKi8KKwl1aW50OF90IG51bUtleXM7CisJdFNpcktleXMga2V5W1NJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVNdOworfSB0TGltTWxtU2V0S2V5c1JlcSwgKnRwTGltTWxtU2V0S2V5c1JlcTsKKworLyoqCisgKiBzdHJ1Y3QgdEFkZEJzc1BhcmFtcyAtIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIGFkZCBic3MgcGFyYW1zCisgKiBAYnNzSWQ6IE1BQyBBZGRyZXNzL0JTU0lECisgKiBAc2VsZk1hY0FkZHI6IFNlbGYgTWFjIEFkZHJlc3MKKyAqIEBic3NUeXBlOiBCU1MgdHlwZQorICogQG9wZXJNb2RlOiBBUCAtIDA7IFNUQSAtIDE7CisgKiBAbndUeXBlOiBuZXR3b3JrIHR5cGUKKyAqIEBzaG9ydFNsb3RUaW1lU3VwcG9ydGVkOiBpcyBzaG9ydCBzbG90IHRpbWUgc3VwcG9ydGVkIG9yIG5vdAorICogQGxsYUNvZXhpc3Q6IGlzIDExYSBjb2V4aXN0IG9yIG5vdAorICogQGxsYkNvZXhpc3Q6IDExYiBjb2V4aXN0IHN1cHBvcnRlZCBvciBub3QKKyAqIEBsbGdDb2V4aXN0OiAxMWcgY29leGlzdCBzdXBwb3J0ZWQgb3Igbm90CisgKiBAaHQyMENvZXhpc3Q6IEhUMjAgY29leGlzdCBzdXBwb3J0ZWQgb3Igbm90CisgKiBAZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OiBUWE9QIHByb3RlY3Rpb24gc3VwcG9ydGVkIG9yIG5vdAorICogQGZSSUZTTW9kZTogUklGUyBpcyBzdXBwb3J0ZWQgb3Igbm90CisgKiBAYmVhY29uSW50ZXJ2YWw6IGJlYWNvbiBpbnRlcnZhbAorICogQGR0aW1QZXJpb2Q6IERUSU0gcGVyaW9kCisgKiBAY2ZQYXJhbVNldDogQ0YgUGFyYW0gU2V0CisgKiBAcmF0ZVNldDogTUFDIFJhdGUgU2V0CisgKiBAaHRDYXBhYmxlOiBFbmFibGUvRGlzYWJsZSBIVCBjYXBhYmlsaXRpZXMKKyAqIEBvYnNzUHJvdEVuYWJsZWQ6IEVuYWJsZS9EaXNhYmxlIE9CU1MgcHJvdGVjdGlvbgorICogQHJtZkVuYWJsZWQ6IFJNRiBlbmFibGVkL2Rpc2FibGVkCisgKiBAaHRPcGVyTW9kZTogSFQgT3BlcmF0aW5nIE1vZGUKKyAqIEBIVCBPcGVyYXRpbmcgTW9kZTogRHVhbCBDVFMgUHJvdGVjdGlvbjogMCAtIFVudXNlZCwgMSAtIFVzZWQKKyAqIEB0eENoYW5uZWxXaWR0aFNldDogVFggV2lkdGggU2V0OiAwIC0gMjAgTUh6IG9ubHksIDEgLSAyMC80MCBNSHoKKyAqIEBjdXJyZW50T3BlckNoYW5uZWw6IEN1cnJlbnQgT3BlcmF0aW5nIENoYW5uZWwKKyAqIEBjdXJyZW50RXh0Q2hhbm5lbDogQ3VycmVudCBFeHRlbnNpb24gQ2hhbm5lbCwgaWYgYXBwbGljYWJsZQorICogQHN0YUNvbnRleHQ6IHN0YSBjb250ZXh0CisgKiBAc3RhdHVzOiBzdGF0dXMKKyAqIEBic3NJZHg6IEJTUyBpbmRleCBhbGxvY2F0ZWQgYnkgSEFMCisgKiBAdXBkYXRlQnNzOiB1cGRhdGUgdGhlIGV4aXN0aW5nIEJTUyBlbnRyeSwgaWYgdGhpcyBmbGFnIGlzIHNldAorICogQHNzSWQ6IEFkZCBCU1NJRCBpbmZvIGZvciByeHAgZmlsdGVyCisgKiBAcmVzcFJlcWQ6IHNlbmQgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgdG8gTElNIG9ubHkgd2hlbiB0aGlzIGZsYWcgaXMgc2V0CisgKiBAc2Vzc2lvbklkOiBQRSBzZXNzaW9uIGlkCisgKiBAdHhNZ210UG93ZXI6IHR4IHBvd2VyIHVzZWQgZm9yIG1nbXQgZnJhbWVzCisgKiBAbWF4VHhQb3dlcjogbWF4IHBvd2VyIHRvIGJlIHVzZWQgYWZ0ZXIgYXBwbHlpbmcgdGhlIHBvd2VyIGNvbnN0cmFpbnQKKyAqIEBleHRTZXRTdGFLZXlQYXJhbVZhbGlkOiBFeHQgQnNzIENvbmZpZyBNc2cgaWYgc2V0CisgKiBAZXh0U2V0U3RhS2V5UGFyYW06IFNldFN0YUtleVBhcmFtcyBmb3IgZXh0IGJzcyBtc2cKKyAqIEB1Y01heFByb2JlUmVzcFJldHJ5TGltaXQ6IHByb2JlIFJlc3BvbnNlIE1heCByZXRyaWVzCisgKiBAYkhpZGRlblNTSURFbjogVG8gRW5hYmxlIEhpZGRlbiBzc2lkLgorICogQGJQcm94eVByb2JlUmVzcEVuOiBUbyBFbmFibGUgRGlzYWJsZSBGVyBQcm94eSBQcm9iZSBSZXNwCisgKiBAaGFsUGVyc29uYTogUGVyc29uYSBmb3IgdGhlIEJTUyBjYW4gYmUgU1RBLEFQLEdPLENMSUVOVCB2YWx1ZQorICogQGJTcGVjdHJ1bU1ndEVuYWJsZWQ6IFNwZWN0cnVtIE1hbmFnZW1lbnQgQ2FwYWJpbGl0eSwgMTpFbmFibGVkLCAwOkRpc2FibGVkLgorICogQHZodENhcGFibGU6IFZIVCBjYXBhYmxpdHkKKyAqIEB2aHRUeENoYW5uZWxXaWR0aFNldDogVkhUIHR4IGNoYW5uZWwgd2lkdGgKKyAqIEByZWFzc29jUmVxOiBTZXQgb25seSBkdXJpbmcgcm9hbWluZyByZWFzc29jaWF0aW9uCisgKiBAY2hhaW5NYXNrOiBjaGFpbiBtYXNrCisgKiBAc21wc01vZGU6IFNNUFMgbW9kZQorICogQGRvdDExX21vZGU6IDgwMi4xMSBtb2RlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl0U2lyTWFjQWRkciBic3NJZDsKKyNpZmRlZiBIQUxfU0VMRl9TVEFfUEVSX0JTUworCXRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyOworI2VuZGlmIC8qIEhBTF9TRUxGX1NUQV9QRVJfQlNTICovCisJdFNpckJzc1R5cGUgYnNzVHlwZTsKKwl1aW50OF90IG9wZXJNb2RlOworCXRTaXJOd1R5cGUgbndUeXBlOworCXVpbnQ4X3Qgc2hvcnRTbG90VGltZVN1cHBvcnRlZDsKKwl1aW50OF90IGxsYUNvZXhpc3Q7CisJdWludDhfdCBsbGJDb2V4aXN0OworCXVpbnQ4X3QgbGxnQ29leGlzdDsKKwl1aW50OF90IGh0MjBDb2V4aXN0OworCXVpbnQ4X3QgbGxuTm9uR0ZDb2V4aXN0OworCXVpbnQ4X3QgZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OworCXVpbnQ4X3QgZlJJRlNNb2RlOworCXRTaXJNYWNCZWFjb25JbnRlcnZhbCBiZWFjb25JbnRlcnZhbDsKKwl1aW50OF90IGR0aW1QZXJpb2Q7CisJdFNpck1hY0NmUGFyYW1TZXQgY2ZQYXJhbVNldDsKKwl0U2lyTWFjUmF0ZVNldCByYXRlU2V0OworCXVpbnQ4X3QgaHRDYXBhYmxlOworCXVpbnQ4X3Qgb2Jzc1Byb3RFbmFibGVkOworCXVpbnQ4X3Qgcm1mRW5hYmxlZDsKKwl0U2lyTWFjSFRPcGVyYXRpbmdNb2RlIGh0T3Blck1vZGU7CisJdWludDhfdCBkdWFsQ1RTUHJvdGVjdGlvbjsKKwl1aW50OF90IHR4Q2hhbm5lbFdpZHRoU2V0OworCXVpbnQ4X3QgY3VycmVudE9wZXJDaGFubmVsOworCXRBZGRTdGFQYXJhbXMgc3RhQ29udGV4dDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl1aW50MTZfdCBic3NJZHg7CisJLyogSEFMIHNob3VsZCB1cGRhdGUgdGhlIGV4aXN0aW5nIEJTUyBlbnRyeSwgaWYgdGhpcyBmbGFnIGlzIHNldC4KKwkgKiBQRSB3aWxsIHNldCB0aGlzIGZsYWcgaW4gY2FzZSBvZiByZWFzc29jLCB3aGVyZSB3ZSB3YW50IHRvIHJlc3VlIHRoZQorCSAqIHRoZSBvbGQgYnNzSUQgYW5kIHN0aWxsIHJldHVybiBzdWNjZXNzLgorCSAqLworCXVpbnQ4X3QgdXBkYXRlQnNzOworCXRTaXJNYWNTU2lkIHNzSWQ7CisJdWludDhfdCByZXNwUmVxZDsKKwl1aW50OF90IHNlc3Npb25JZDsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwl0UG93ZXJkQm0gdHhNZ210UG93ZXI7CisJdFBvd2VyZEJtIG1heFR4UG93ZXI7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSSAqLworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCXVpbnQ4X3QgZXh0U2V0U3RhS2V5UGFyYW1WYWxpZDsKKwl0U2V0U3RhS2V5UGFyYW1zIGV4dFNldFN0YUtleVBhcmFtOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKwl1aW50OF90IHVjTWF4UHJvYmVSZXNwUmV0cnlMaW1pdDsKKwl1aW50OF90IGJIaWRkZW5TU0lERW47CisJdWludDhfdCBiUHJveHlQcm9iZVJlc3BFbjsKKwl1aW50OF90IGhhbFBlcnNvbmE7CisJdWludDhfdCBiU3BlY3RydW1NZ3RFbmFibGVkOworCXVpbnQ4X3Qgdmh0Q2FwYWJsZTsKKwlwaHlfY2hfd2lkdGggY2hfd2lkdGg7CisJdWludDhfdCBjaF9jZW50ZXJfZnJlcV9zZWcwOworCXVpbnQ4X3QgY2hfY2VudGVyX2ZyZXFfc2VnMTsKKwl1aW50OF90IHJlYXNzb2NSZXE7ICAgICAvKiBTZXQgb25seSBkdXJpbmcgcm9hbWluZyByZWFzc29jaWF0aW9uICovCisJdWludDE2X3QgY2hhaW5NYXNrOworCXVpbnQxNl90IHNtcHNNb2RlOworCXVpbnQ4X3QgZG90MTFfbW9kZTsKKwl1aW50OF90IG5vblJvYW1SZWFzc29jOworCXVpbnQ4X3Qgd3BzX3N0YXRlOworCXVpbnQ4X3QgbnNzOworfSB0QWRkQnNzUGFyYW1zLCAqdHBBZGRCc3NQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHREZWxldGVCc3NQYXJhbXMgLSBwYXJhbXMgcmVxdWlyZWQgZm9yIGRlbCBic3MgcmVxdWVzdAorICogQGJzc0lkeDogQlNTSUQKKyAqIEBzdGF0dXM6IENERiBzdGF0dXMKKyAqIEByZXNwUmVxZDogcmVzcG9uc2UgbWVzc2FnZSB0byBMSU0gb25seSB3aGVuIHRoaXMgZmxhZyBpcyBzZXQKKyAqIEBzZXNzaW9uSWQ6IFBFIHNlc3Npb24gaWQKKyAqIEBic3NpZDogQlNTSUQgbWFjIGFkZHJlc3MKKyAqIEBzbWVzZXNzaW9uSWQ6IHNtZSBzZXNzaW9uIGlkCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGJzc0lkeDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl1aW50OF90IHJlc3BSZXFkOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIGJzc2lkOworCXVpbnQ4X3Qgc21lc2Vzc2lvbklkOworfSB0RGVsZXRlQnNzUGFyYW1zLCAqdHBEZWxldGVCc3NQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHNTaXJTY2FuRW50cnkgLSBzY2FuIGVudHJ5CisgKiBAYnNzSWR4OiBCU1NJRAorICogQGFjdGl2ZUJTU2NudDogYWN0aXZlIEJTUyBjb3VudAorICovCit0eXBlZGVmIHN0cnVjdCBzU2lyU2NhbkVudHJ5IHsKKwl1aW50OF90IGJzc0lkeFtIQUxfTlVNX0JTU0lEXTsKKwl1aW50OF90IGFjdGl2ZUJTU2NudDsKK30gdFNpclNjYW5FbnRyeSwgKnB0U2lyU2NhbkVudHJ5OworCisvKioKKyAqIHN0cnVjdCB0SW5pdFNjYW5QYXJhbXMgLSBwYXJhbXMgcmVxdWlyZWQgZm9yIGluaXQgc2NhbiByZXF1ZXN0CisgKiBAYnNzaWQ6IEJTU0lECisgKiBAbm90aWZ5QnNzOiBub3RpZnkgQlNTCisgKiBAdXNlTm9BOiB1c2UgTk9BCisgKiBAbm90aWZ5SG9zdDogbm90aWZ5IFVNQUMgaWYgc2V0CisgKiBAZnJhbWVMZW5ndGg6IGZyYW1lIGxlbmd0aAorICogQGZyYW1lVHlwZTogZnJhbWUgdHlwZQorICogQHNjYW5EdXJhdGlvbjogSW5kaWNhdGVzIHRoZSBzY2FuIGR1cmF0aW9uIChpbiBtcykKKyAqIEBtYWNNZ210SGRyOiBGb3IgY3JlYXRpb24gb2YgQ1RTLXRvLVNlbGYgYW5kIERhdGEtTlVMTCBNQUMgcGFja2V0cworICogQHNjYW5FbnRyeTogc2NhbiBlbnRyeQorICogQGNoZWNrTGlua1RyYWZmaWM6IHdoZW4gdGhpcyBmbGFnIGlzIHNldCwgSEFMIHNob3VsZCBjaGVjayBmb3IKKyAqICAgICAgICAgICAgICAgICAgICBsaW5rIHRyYWZmaWMgcHJpb3IgdG8gc2NhbgorICogQHN0YXR1czogc3RhdHVzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl0U2lyTWFjQWRkciBic3NpZDsKKwl1aW50OF90IG5vdGlmeUJzczsKKwl1aW50OF90IHVzZU5vQTsKKwl1aW50OF90IG5vdGlmeUhvc3Q7CisJdWludDhfdCBmcmFtZUxlbmd0aDsKKwl1aW50OF90IGZyYW1lVHlwZTsKKwl1aW50MTZfdCBzY2FuRHVyYXRpb247CisJdFNpck1hY01nbXRIZHIgbWFjTWdtdEhkcjsKKwl0U2lyU2NhbkVudHJ5IHNjYW5FbnRyeTsKKwl0U2lyTGlua1RyYWZmaWNDaGVjayBjaGVja0xpbmtUcmFmZmljOworCUNERl9TVEFUVVMgc3RhdHVzOworfSB0SW5pdFNjYW5QYXJhbXMsICp0cEluaXRTY2FuUGFyYW1zOworCit0eXBlZGVmIGVudW0gZURlbFN0YVJlYXNvbkNvZGUgeworCUhBTF9ERUxfU1RBX1JFQVNPTl9DT0RFX0tFRVBfQUxJVkUgPSAweDEsCisJSEFMX0RFTF9TVEFfUkVBU09OX0NPREVfVElNX0JBU0VEID0gMHgyLAorCUhBTF9ERUxfU1RBX1JFQVNPTl9DT0RFX1JBX0JBU0VEID0gMHgzLAorCUhBTF9ERUxfU1RBX1JFQVNPTl9DT0RFX1VOS05PV05fQTIgPSAweDQKK30gdERlbFN0YVJlYXNvbkNvZGU7CisKK3R5cGVkZWYgZW51bSBlU21wc01vZGVWYWx1ZSB7CisJU1RBVElDX1NNUFNfTU9ERSA9IDB4MCwKKwlEWU5BTUlDX1NNUFNfTU9ERSA9IDB4MSwKKwlTTVBTX01PREVfUkVTRVJWRUQgPSAweDIsCisJU01QU19NT0RFX0RJU0FCTEVEID0gMHgzCit9IHRTbXBzTW9kZVZhbHVlOworCisvKioKKyAqIHN0cnVjdCB0RGVsZXRlU3RhQ29udGV4dCAtIHBhcmFtcyByZXF1aXJlZCBmb3IgZGVsZXRlIHN0YSByZXF1ZXN0CisgKiBAYXNzb2NJZDogYXNzb2NpYXRpb24gaWQKKyAqIEBzdGFJZDogc3RhdGlvbiBpZAorICogQGJzc0lkOiBtYWMgYWRkcmVzcworICogQGFkZHIyOiBtYWMgYWRkcmVzcworICogQHJlYXNvbkNvZGU6IHJlYXNvbiBjb2RlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBhc3NvY0lkOworCXVpbnQxNl90IHN0YUlkOworCXRTaXJNYWNBZGRyIGJzc0lkOworCXRTaXJNYWNBZGRyIGFkZHIyOworCXVpbnQxNl90IHJlYXNvbkNvZGU7Cit9IHREZWxldGVTdGFDb250ZXh0LCAqdHBEZWxldGVTdGFDb250ZXh0OworCisvKioKKyAqIHN0cnVjdCB0U3RhcnRTY2FuUGFyYW1zIC0gcGFyYW1zIHJlcXVpcmVkIGZvciBzdGFydCBzY2FuIHJlcXVlc3QKKyAqIEBzY2FuQ2hhbm5lbDogSW5kaWNhdGVzIHRoZSBjdXJyZW50IHNjYW4gY2hhbm5lbAorICogQHN0YXR1czogcmV0dXJuIHN0YXR1cworICogQHN0YXJ0VFNGOiBUU0YgdmFsdWUKKyAqIEB0eE1nbXRQb3dlcjogVFggbWdtdCBwb3dlcgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBzY2FuQ2hhbm5lbDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwl1aW50MzJfdCBzdGFydFRTRlsyXTsKKwl0UG93ZXJkQm0gdHhNZ210UG93ZXI7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSSAqLworfSB0U3RhcnRTY2FuUGFyYW1zLCAqdHBTdGFydFNjYW5QYXJhbXM7CisKKy8qKgorICogc3RydWN0IHRFbmRTY2FuUGFyYW1zIC0gcGFyYW1zIHJlcXVpcmVkIGZvciBlbmQgc2NhbiByZXF1ZXN0CisgKiBAc2NhbkNoYW5uZWw6IEluZGljYXRlcyB0aGUgY3VycmVudCBzY2FuIGNoYW5uZWwKKyAqIEBzdGF0dXM6IHJldHVybiBzdGF0dXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3Qgc2NhbkNoYW5uZWw7CisJQ0RGX1NUQVRVUyBzdGF0dXM7Cit9IHRFbmRTY2FuUGFyYW1zLCAqdHBFbmRTY2FuUGFyYW1zOworCisvKioKKyAqIHN0cnVjdCB0RmluaXNoU2NhblBhcmFtcyAtIHBhcmFtcyByZXF1aXJlZCBmb3IgZmluaXNoIHNjYW4gcmVxdWVzdAorICogQGJzc2lkOiBCU1NJRAorICogQGN1cnJlbnRPcGVyQ2hhbm5lbDogQ3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbAorICogQGNiU3RhdGU6IGNoYW5uZWwgYm9uZCBzdGF0ZQorICogQG5vdGlmeUJzczogbm90aWZ5IEJTUyBmbGFnCisgKiBAbm90aWZ5SG9zdDogbm90aWZ5IGhvc3QgZmxhZworICogQGZyYW1lTGVuZ3RoOiBmcmFtZSBsZW5ndGgKKyAqIEBmcmFtZVR5cGU6IGZyYW1lIHR5cGUKKyAqIEBtYWNNZ210SGRyOiBGb3IgY3JlYXRpb24gb2YgQ1RTLXRvLVNlbGYgYW5kIERhdGEtTlVMTCBNQUMgcGFja2V0cworICogQHNjYW5FbnRyeTogc2NhbiBlbnRyeQorICogQHN0YXR1czogcmV0dXJuIHN0YXR1cworICogUmVxdWVzdCBUeXBlID0gU0lSX0hBTF9GSU5JU0hfU0NBTl9SRVEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXRTaXJNYWNBZGRyIGJzc2lkOworCXVpbnQ4X3QgY3VycmVudE9wZXJDaGFubmVsOworCS8qIElmIDIwLzQwIE1IeiBpcyBvcGVyYXRpb25hbCwgdGhpcyB3aWxsIGluZGljYXRlIHRoZSA0MCBNSHogZXh0ZW5zaW9uCisJICogY2hhbm5lbCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBjb250cm9sIGNoYW5uZWwKKwkgKi8KKwllUGh5Q2hhbkJvbmRTdGF0ZSBjYlN0YXRlOworCS8qIEZvciBhbiBTVEEsIGluZGljYXRlcyBpZiBhIERhdGEgTlVMTCBmcmFtZSBuZWVkcyB0byBiZSBzZW50CisJICogdG8gdGhlIEFQIHdpdGggRnJhbWVDb250cm9sLlB3ck1nbXQgYml0IHNldCB0byAwCisJICovCisJdWludDhfdCBub3RpZnlCc3M7CisJdWludDhfdCBub3RpZnlIb3N0OworCXVpbnQ4X3QgZnJhbWVMZW5ndGg7CisJdWludDhfdCBmcmFtZVR5cGU7CisJdFNpck1hY01nbXRIZHIgbWFjTWdtdEhkcjsKKwl0U2lyU2NhbkVudHJ5IHNjYW5FbnRyeTsKKwlDREZfU1RBVFVTIHN0YXR1czsKK30gdEZpbmlzaFNjYW5QYXJhbXMsICp0cEZpbmlzaFNjYW5QYXJhbXM7CisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKKworI2lmbmRlZiBPRU1fREFUQV9SRVFfU0laRQorI2RlZmluZSBPRU1fREFUQV9SRVFfU0laRSAyODAKKyNlbmRpZgorI2lmbmRlZiBPRU1fREFUQV9SU1BfU0laRQorI2RlZmluZSBPRU1fREFUQV9SU1BfU0laRSAxNzI0CisjZW5kaWYKKworLyoqCisgKiBzdHJ1Y3QgdFN0YXJ0T2VtRGF0YVJlcSAtIHN0YXJ0IE9FTSBEYXRhIHJlcXVlc3QKKyAqIEBzZWxmTWFjQWRkcjogc2VsZiBtYWMgYWRkcmVzcworICogQHN0YXR1czogcmV0dXJuIHN0YXR1cworICogQG9lbURhdGFSZXE6IE9FTSBEYXRhIHJlcXVlc3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyOworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQ4X3Qgb2VtRGF0YVJlcVtPRU1fREFUQV9SRVFfU0laRV07Cit9IHRTdGFydE9lbURhdGFSZXEsICp0cFN0YXJ0T2VtRGF0YVJlcTsKKworLyoqCisgKiBzdHJ1Y3QgdFN0YXJ0T2VtRGF0YVJzcCAtIHN0YXJ0IE9FTSBEYXRhIHJlc3BvbnNlCisgKiBAb2VtRGF0YVJzcDogT0VNIERhdGEgcmVzcG9uc2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3Qgb2VtRGF0YVJzcFtPRU1fREFUQV9SU1BfU0laRV07Cit9IHRTdGFydE9lbURhdGFSc3AsICp0cFN0YXJ0T2VtRGF0YVJzcDsKKyNlbmRpZiAvKiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQgKi8KKworLyoqCisgKiBzdHJ1Y3QgdEJlYWNvbkdlblBhcmFtcyAtIHBhcmFtcyByZXF1aXJlZCBmb3IgYmVhY29uIGdlbiByZXF1ZXN0CisgKiBAYnNzSWR4OiBJZGVudGlmaWVzIHRoZSBCU1NJRCBmb3Igd2hpY2ggaXQgaXMgdGltZSB0byBnZW5lcmF0ZSBhIGJlYWNvbgorICogQGJzc0lkOiBCU1NJRAorICogQG51bU9mU3RhOiBOdW1iZXIgb2Ygc3RhdGlvbnMgaW4gcG93ZXIgc2F2ZSwgd2hvIGhhdmUgZGF0YSBwZW5kaW5nCisgKiBAbnVtT2ZTdGFXaXRob3V0RGF0YTogTnVtYmVyIG9mIHN0YXRpb25zIGluIHBvd2VyIHNhdmUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgd2hvIGRvbid0IGhhdmUgYW55IGRhdGEgcGVuZGluZworICogQGZCcm9hZGNhc3RUcmFmZmljUGVuZGluZzogYnJvYWRjYXN0IHRyYWZmaWMgcGVuZGluZyBmbGFnCisgKiBAZHRpbUNvdW50OiBEVElNIGNvdW50CisgKiBAcnN2ZDogcmVzZXJ2ZWQocGFkZGluZykKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0JlYWNvbkdlblBhcmFtcyB7CisJdWludDhfdCBic3NJZHg7CisJdFNpck1hY0FkZHIgYnNzSWQ7CisjaWZkZWYgRklYTUVfVk9MQU5TCisJdWludDhfdCBudW1PZlN0YTsKKwl1aW50OF90IG51bU9mU3RhV2l0aG91dERhdGE7CisJdWludDhfdCBmQnJvYWRjYXN0VHJhZmZpY1BlbmRpbmc7CisJdWludDhfdCBkdGltQ291bnQ7CisjZW5kaWYgLyogRklYTUVfVk9MQU5TICovCisJdWludDhfdCByc3ZkWzNdOworfSB0QmVhY29uR2VuUGFyYW1zLCAqdHBCZWFjb25HZW5QYXJhbXM7CisKKy8qKgorICogc3RydWN0IHRTZW5kYmVhY29uUGFyYW1zIC0gc2VuZCBiZWFjb24gcGFyYW1ldGVycworICogQGJzc0lkOiBCU1NJRCBtYWMgYWRkcmVzcworICogQGJlYWNvbjogYmVhY29uIGRhdGEKKyAqIEBiZWFjb25MZW5ndGg6IGJlYWNvbiBsZW5ndGggb2YgdGVtcGxhdGUKKyAqIEB0aW1JZU9mZnNldDogVElNIElFIG9mZnNldAorICogQHAycEllT2Zmc2V0OiBQMlAgSUUgb2Zmc2V0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl0U2lyTWFjQWRkciBic3NJZDsKKwl1aW50OF90ICpiZWFjb247CisJdWludDMyX3QgYmVhY29uTGVuZ3RoOworCXVpbnQzMl90IHRpbUllT2Zmc2V0OworCXVpbnQxNl90IHAycEllT2Zmc2V0OworfSB0U2VuZGJlYWNvblBhcmFtcywgKnRwU2VuZGJlYWNvblBhcmFtczsKKworLyoqCisgKiBzdHJ1Y3QgdFNlbmRQcm9iZVJlc3BQYXJhbXMgLSBzZW5kIHByb2JlIHJlc3BvbnNlIHBhcmFtZXRlcnMKKyAqIEBic3NJZDogQlNTSUQKKyAqIEBwUHJvYmVSZXNwVGVtcGxhdGU6IHByb2JlIHJlc3BvbnNlIHRlbXBsYXRlCisgKiBAcHJvYmVSZXNwVGVtcGxhdGVMZW46IHByb2JlIHJlc3BvbnNlIHRlbXBsYXRlIGxlbmd0aAorICogQHVjUHJveHlQcm9iZVJlcVZhbGlkSUVCbWFwOiB2YWxpZCBJRSBiaXRtYXAKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NlbmRQcm9iZVJlc3BQYXJhbXMgeworCXRTaXJNYWNBZGRyIGJzc0lkOworCXVpbnQ4X3QgKnBQcm9iZVJlc3BUZW1wbGF0ZTsKKwl1aW50MzJfdCBwcm9iZVJlc3BUZW1wbGF0ZUxlbjsKKwl1aW50MzJfdCB1Y1Byb3h5UHJvYmVSZXFWYWxpZElFQm1hcFs4XTsKK30gdFNlbmRQcm9iZVJlc3BQYXJhbXMsICp0cFNlbmRQcm9iZVJlc3BQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHRTZXRCc3NLZXlQYXJhbXMgLSBCU1Mga2V5IHBhcmFtZXRlcnMKKyAqIEBic3NJZHg6IEJTU0lEIGluZGV4CisgKiBAZW5jVHlwZTogZW5jcnlwdGlvbiBUeXBlCisgKiBAbnVtS2V5czogbnVtYmVyIG9mIGtleXMKKyAqIEBrZXk6IGtleSBkYXRhCisgKiBAc2luZ2xlVGlkUmM6IDE9U2luZ2xlIFRJRCBiYXNlZCBSZXBsYXkgQ291bnQsIDA9UGVyIFRJRCBiYXNlZCBSQworICogQHNtZXNlc3Npb25JZDogc21lIHNlc3Npb24gaWQKKyAqIEBzdGF0dXM6IHJldHVybiBzdGF0dXMgb2YgY29tbWFuZAorICogQHNlc3Npb25JZDogUEUgc2Vzc2lvbiBpZAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBic3NJZHg7CisJdEFuaUVkVHlwZSBlbmNUeXBlOworCXVpbnQ4X3QgbnVtS2V5czsKKwl0U2lyS2V5cyBrZXlbU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZU107CisJdWludDhfdCBzaW5nbGVUaWRSYzsKKwl1aW50OF90IHNtZXNlc3Npb25JZDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl1aW50OF90IHNlc3Npb25JZDsKK30gdFNldEJzc0tleVBhcmFtcywgKnRwU2V0QnNzS2V5UGFyYW1zOworCisvKioKKyAqIHN0cnVjdCB0VXBkYXRlQmVhY29uUGFyYW1zIC0gdXBkYXRlIGJlYWNvbiByZXF1ZXN0IHBhcmFtZXRlcnMKKyAqIEBic3NJZHg6IEJTU0lEIGluZGV4CisgKiBAZlNob3J0UHJlYW1ibGU6IHNob3J0UHJlYW1ibGUgbW9kZQorICogQGZTaG9ydFNsb3RUaW1lOiBzaG9ydCBTbG90IHRpbWUKKyAqIEBiZWFjb25JbnRlcnZhbDogQmVhY29uIEludGVydmFsCisgKiBAbGxhQ29leGlzdDogMTFhIGNvZXhpc3QKKyAqIEBsbGJDb2V4aXN0OiAxMWIgY29leGlzdAorICogQGxsZ0NvZXhpc3Q6IDExZyBjb2V4aXN0CisgKiBAaHQyME1oekNvZXhpc3Q6IEhUIDIwTUh6IGNvZXhpc3QKKyAqIEBmTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ6IFRYT1AgcHJvdGVjdGlvbiBzdXBwb3J0ZWQgb3Igbm90CisgKiBAZlJJRlNNb2RlOiBSSUZTIG1vZGUKKyAqIEBwYXJhbUNoYW5nZUJpdG1hcDogY2hhbmdlIGJpdG1hcAorICogQHNtZVNlc3Npb25JZDogU01FICBzZXNzaW9uIGlkCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGJzc0lkeDsKKwl1aW50OF90IGZTaG9ydFByZWFtYmxlOworCXVpbnQ4X3QgZlNob3J0U2xvdFRpbWU7CisJdWludDE2X3QgYmVhY29uSW50ZXJ2YWw7CisJdWludDhfdCBsbGFDb2V4aXN0OworCXVpbnQ4X3QgbGxiQ29leGlzdDsKKwl1aW50OF90IGxsZ0NvZXhpc3Q7CisJdWludDhfdCBodDIwTWh6Q29leGlzdDsKKwl1aW50OF90IGxsbk5vbkdGQ29leGlzdDsKKwl1aW50OF90IGZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDsKKwl1aW50OF90IGZSSUZTTW9kZTsKKwl1aW50MTZfdCBwYXJhbUNoYW5nZUJpdG1hcDsKKwl1aW50OF90IHNtZVNlc3Npb25JZDsKK30gdFVwZGF0ZUJlYWNvblBhcmFtcywgKnRwVXBkYXRlQmVhY29uUGFyYW1zOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKy8qKgorICogc3RydWN0IHRVcGRhdGVWSFRPcE1vZGUgLSBWSFQgb3BlcmF0aW5nIG1vZGUKKyAqIEBvcE1vZGU6IFZIVCBvcGVyYXRpbmcgbW9kZQorICogQHN0YUlkOiBzdGF0aW9uIGlkCisgKiBAc21lc2Vzc2lvbklkOiBTTUUgc2Vzc2lvbiBpZAorICogQHBlZXJfbWFjOiBwZWVyIG1hYyBhZGRyZXNzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBvcE1vZGU7CisJdWludDE2X3Qgc3RhSWQ7CisJdWludDE2X3Qgc21lc2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIHBlZXJfbWFjOworfSB0VXBkYXRlVkhUT3BNb2RlLCAqdHBVcGRhdGVWSFRPcE1vZGU7CisKKy8qKgorICogc3RydWN0IHRVcGRhdGVSeE5zcyAtIHVwZGF0ZSByeCBuc3MgcGFyYW1ldGVycworICogQHJ4TnNzOiByeCBuc3MgdmFsdWUKKyAqIEBzdGFJZDogc3RhdGlvbiBpZAorICogQHNtZXNlc3Npb25JZDogc21lIHNlc3Npb24gaWQKKyAqIEBwZWVyX21hYzogcGVlciBtYWMgYWRkcmVzcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgcnhOc3M7CisJdWludDE2X3Qgc3RhSWQ7CisJdWludDE2X3Qgc21lc2Vzc2lvbklkOworCXRTaXJNYWNBZGRyIHBlZXJfbWFjOworfSB0VXBkYXRlUnhOc3MsICp0cFVwZGF0ZVJ4TnNzOworCisvKioKKyAqIHN0cnVjdCB0VXBkYXRlTWVtYmVyc2hpcCAtIHVwZGF0ZSBtZW1iZXJzaGlwIHBhcm1hdGVycworICogQG1lbWJlcnNoaXA6IG1lbWJlcnNoaXAgdmFsdWUKKyAqIEBzdGFJZDogc3RhdGlvbiBpZAorICogQHNtZXNlc3Npb25JZDogU01FIHNlc3Npb24gaWQKKyAqIEBwZWVyX21hYzogcGVlciBtYWMgYWRkcmVzcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgbWVtYmVyc2hpcDsKKwl1aW50MTZfdCBzdGFJZDsKKwl1aW50MTZfdCBzbWVzZXNzaW9uSWQ7CisJdFNpck1hY0FkZHIgcGVlcl9tYWM7Cit9IHRVcGRhdGVNZW1iZXJzaGlwLCAqdHBVcGRhdGVNZW1iZXJzaGlwOworCisvKioKKyAqIHN0cnVjdCB0VXBkYXRlVXNlclBvcyAtIHVwZGF0ZSB1c2VyIHBvc2l0aW9uIHBhcm1ldGVycworICogQHVzZXJQb3M6IHVzZXIgcG9zaXRpb24KKyAqIEBzdGFJZDogc3RhdGlvbiBpZAorICogQHNtZXNlc3Npb25JZDogc21lIHNlc3Npb24gaWQKKyAqIEBwZWVyX21hYzogcGVlciBtYWMgYWRkcmVzcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgdXNlclBvczsKKwl1aW50MTZfdCBzdGFJZDsKKwl1aW50MTZfdCBzbWVzZXNzaW9uSWQ7CisJdFNpck1hY0FkZHIgcGVlcl9tYWM7Cit9IHRVcGRhdGVVc2VyUG9zLCAqdHBVcGRhdGVVc2VyUG9zOworCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExQUMgKi8KKworLyoqCisgKiBzdHJ1Y3QgdFVwZGF0ZUNGUGFyYW1zIC1DRiBwYXJhbWV0ZXJzCisgKiBAYnNzSWR4OiBCU1NJRCBpbmRleAorICogQGNmcENvdW50OiBDRlAgY291bnQKKyAqIEBjZnBQZXJpb2Q6IHRoZSBudW1iZXIgb2YgRFRJTSBpbnRlcnZhbHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgQ0ZQcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBic3NJZHg7CisJLyoKKwkgKiBjZnBDb3VudCBpbmRpY2F0ZXMgaG93IG1hbnkgRFRJTXMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBmcmFtZSkKKwkgKiBhcHBlYXIgYmVmb3JlIHRoZSBuZXh0IENGUCBzdGFydC4gQSBDRlBDb3VudCBvZiAwIGluZGljYXRlcyB0aGF0CisJICogdGhlIGN1cnJlbnQgRFRJTSBtYXJrcyB0aGUgc3RhcnQgb2YgdGhlIENGUC4KKwkgKi8KKwl1aW50OF90IGNmcENvdW50OworCXVpbnQ4X3QgY2ZwUGVyaW9kOworfSB0VXBkYXRlQ0ZQYXJhbXMsICp0cFVwZGF0ZUNGUGFyYW1zOworCisvKioKKyAqIHN0cnVjdCB0U3dpdGNoQ2hhbm5lbFBhcmFtcyAtIHN3aXRjaCBjaGFubmVsIHJlcXVlc3QgcGFyYW1ldGVyCisgKiBAY2hhbm5lbE51bWJlcjogY2hhbm5lbCBudW1iZXIKKyAqIEBsb2NhbFBvd2VyQ29uc3RyYWludDogbG9jYWwgcG93ZXIgY29uc3RyYWludAorICogQHNlY29uZGFyeUNoYW5uZWxPZmZzZXQ6IHNjb25kYXJ5IGNoYW5uZWwgb2Zmc2V0CisgKiBAcGVTZXNzaW9uSWQ6IFBFIHNlc3Npb24gaWQKKyAqIEB0eE1nbXRQb3dlcjogVFggbWdtdCBwb3dlcgorICogQG1heFR4UG93ZXI6IG1heCB0eCBwb3dlcgorICogQHNlbGZTdGFNYWNBZGRyOiBzZWxmIG1hYyBhZGRyZXNzCisgKiBAYnNzSWQ6IGJzc2lkCisgKiBAc3RhdHVzOiBDREYgc3RhdHVzCisgKiBAY2hhaW5NYXNrOiBjaGFuaW4gbWFzaworICogQHNtcHNNb2RlOiBTTVBTIG1vZGUKKyAqIEBpc0Rmc0NoYW5uZWw6IGlzIERGUyBjaGFubmVsCisgKiBAdmh0Q2FwYWJsZTogVkhUIGNhcGFibGUKKyAqIEBkb3QxMV9tb2RlOiA4MDIuMTEgbW9kZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBjaGFubmVsTnVtYmVyOworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJdWludDhfdCBsb2NhbFBvd2VyQ29uc3RyYWludDsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJICAqLworCXVpbnQ4X3QgcGVTZXNzaW9uSWQ7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJdFBvd2VyZEJtIHR4TWdtdFBvd2VyOworCXRQb3dlcmRCbSBtYXhUeFBvd2VyOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRkkgKi8KKwl0U2lyTWFjQWRkciBzZWxmU3RhTWFjQWRkcjsKKwkvKiB0aGUgcmVxdWVzdCBoYXMgcG93ZXIgY29uc3RyYWludHMsIHRoaXMgc2hvdWxkIGJlIGFwcGxpZWQgb25seSB0bworCSAqIHRoYXQgc2Vzc2lvbgorCSAqIFZPIFdpZmkgY29tbWVudDogQlNTSUQgaXMgbmVlZGVkIHRvIGlkZW50aWZ5IHdoaWNoIHNlc3Npb24gaXNzdWVkCisJICogdGhpcyByZXF1ZXN0LiBBcyB0aGUgcmVxdWVzdCBoYXMgcG93ZXIgY29uc3RyYWludHMsIHRoaXMgc2hvdWxkIGJlCisJICogYXBwbGllZCBvbmx5IHRvIHRoYXQgc2Vzc2lvbgorCSAqIFYgSU1QOiBLZWVwIGJzc0lkIGZpZWxkIGF0IHRoZSBlbmQgb2YgdGhpcyBtc2cuCisJICogSXQgaXMgdXNlZCB0byBtYW50YWluIGJhY2t3YXJkIGNvbXBhdGJpbGl0eSBieSB3YXkgb2YgaWdub3JpbmcgaWYKKwkgKiB1c2luZyBuZXcgaG9zdC9vbGQgRlcgb3Igb2xkIGhvc3QvbmV3IEZXIHNpbmNlIGl0IGlzIGF0IHRoZSBlbmQgb2YKKwkgKiB0aGlzIHN0cnVjdAorCSAqLworCXRTaXJNYWNBZGRyIGJzc0lkOworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQxNl90IGNoYWluTWFzazsKKwl1aW50MTZfdCBzbXBzTW9kZTsKKwl1aW50OF90IGlzRGZzQ2hhbm5lbDsKKwl1aW50OF90IHZodENhcGFibGU7CisJcGh5X2NoX3dpZHRoIGNoX3dpZHRoOworCXVpbnQ4X3QgY2hfY2VudGVyX2ZyZXFfc2VnMDsKKwl1aW50OF90IGNoX2NlbnRlcl9mcmVxX3NlZzE7CisJdWludDhfdCBkb3QxMV9tb2RlOworCisJdWludDhfdCByZXN0YXJ0X29uX2NoYW5fc3dpdGNoOworCXVpbnQ4X3QgbnNzOworfSB0U3dpdGNoQ2hhbm5lbFBhcmFtcywgKnRwU3dpdGNoQ2hhbm5lbFBhcmFtczsKKworLyoqCisgKiBzdHJ1Y3QgdHBDU0FPZmZsb2FkUGFyYW1zIC0gQ1NBIG9mZmxvYWQgcmVxdWVzdCBwYXJhbWV0ZXJzCisgKiBAY2hhbm5lbDogY2hhbm5lbAorICogQHN3aXRjaG1vZGU6IHN3aXRjaCBtb2RlCisgKiBAc2VjX2NoYW5fb2Zmc2V0OiBzZWNvbmQgY2hhbm5lbCBvZmZzZXQKKyAqIEBuZXdfY2hfd2lkdGg6IG5ldyBjaGFubmVsIHdpZHRoCisgKiBAbmV3X2NoX2ZyZXFfc2VnMTogY2hhbm5lbCBjZW50ZXIgZnJlcSAxCisgKiBAbmV3X2NoX2ZyZXFfc2VnMjogY2hhbm5lbCBjZW50ZXIgZnJlcSAyCisgKiBAaWVzX3ByZXNlbnRfZmxhZzogSUUgcHJlc2VudCBmbGFnCisgKi8KK3R5cGVkZWYgc3RydWN0IENTQU9mZmxvYWRQYXJhbXMgeworCXVpbnQ4X3QgY2hhbm5lbDsKKwl1aW50OF90IHN3aXRjaG1vZGU7CisJdWludDhfdCBzZWNfY2hhbl9vZmZzZXQ7CisJdWludDhfdCBuZXdfY2hfd2lkdGg7CisJdWludDhfdCBuZXdfY2hfZnJlcV9zZWcxOworCXVpbnQ4X3QgbmV3X2NoX2ZyZXFfc2VnMjsKKwl1aW50MzJfdCBpZXNfcHJlc2VudF9mbGFnOworCXRTaXJNYWNBZGRyIGJzc0lkOworfSAqdHBDU0FPZmZsb2FkUGFyYW1zLCB0Q1NBT2ZmbG9hZFBhcmFtczsKKwordHlwZWRlZiB2b2lkICgqdHBTZXRMaW5rU3RhdGVDYWxsYmFjaykodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqbXNnUGFyYW0sCisJCWJvb2wgc3RhdHVzKTsKKworLyoqCisgKiBzdHJ1Y3QgdExpbmtTdGF0ZVBhcmFtcyAtIGxpbmsgc3RhdGUgcGFyYW1ldGVycworICogQGJzc2lkOiBCU1NJRAorICogQHNlbGZNYWNBZGRyOiBzZWxmIG1hYyBhZGRyZXNzCisgKiBAc3RhdGU6IGxpbmsgc3RhdGUKKyAqIEBjYWxsYmFjazogY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICogQGNhbGxiYWNrQXJnOiBjYWxsYmFjayBhcmd1bWVudAorICogQHNlc3Npb246IHNlc3Npb24gY29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCBzTGlua1N0YXRlUGFyYW1zIHsKKwkvKiBTSVJfSEFMX1NFVF9MSU5LX1NUQVRFICovCisJdFNpck1hY0FkZHIgYnNzaWQ7CisJdFNpck1hY0FkZHIgc2VsZk1hY0FkZHI7CisJdFNpckxpbmtTdGF0ZSBzdGF0ZTsKKwl0cFNldExpbmtTdGF0ZUNhbGxiYWNrIGNhbGxiYWNrOworCXZvaWQgKmNhbGxiYWNrQXJnOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisJaW50IGZ0OworCXZvaWQgKnNlc3Npb247CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKwlib29sIHN0YXR1czsKK30gdExpbmtTdGF0ZVBhcmFtcywgKnRwTGlua1N0YXRlUGFyYW1zOworCisvKioKKyAqIHN0cnVjdCB0QWRkVHNQYXJhbXMgLSBBRERUUyByZWxhdGVkIHBhcmFtZXRlcnMKKyAqIEBzdGFJZHg6IHN0YXRpb24gaW5kZXgKKyAqIEB0c3BlY0lkeDogVFNQRUMgaGFuZGxlciB1bmlxdWVseSBpZGVudGlmeWluZyBhIFRTUEVDIGZvciBhIFNUQSBpbiBhIEJTUworICogQHRzcGVjOiB0c3BlYyB2YWx1ZQorICogQHN0YXR1czogQ0RGIHN0YXR1cworICogQHNlc3Npb25JZDogc2Vzc2lvbiBpZAorICogQHRzbV9pbnRlcnZhbDogVFNNIGludGVydmFsIHBlcmlvZCBwYXNzZWQgZnJvbSBsaW0gdG8gV01BCisgKiBAc2V0UklDcGFyYW1zOiBSSUMgcGFyYW1ldGVycworICogQHNtZV9zZXNzaW9uX2lkOiBzbWUgc2Vzc2lvbiBpZAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3Qgc3RhSWR4OworCXVpbnQxNl90IHRzcGVjSWR4OworCXRTaXJNYWNUc3BlY0lFIHRzcGVjOworCUNERl9TVEFUVVMgc3RhdHVzOworCXVpbnQ4X3Qgc2Vzc2lvbklkOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwl1aW50MTZfdCB0c21faW50ZXJ2YWw7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwl1aW50OF90IHNldFJJQ3BhcmFtczsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FEICovCisJdWludDhfdCBzbWVfc2Vzc2lvbl9pZDsKK30gdEFkZFRzUGFyYW1zLCAqdHBBZGRUc1BhcmFtczsKKworLyoqCisgKiBzdHJ1Y3QgdERlbFRzUGFyYW1zIC0gREVMVFMgcmVsYXRlZCBwYXJhbWV0ZXJzCisgKiBAc3RhSWR4OiBzdGF0aW9uIGluZGV4CisgKiBAdHNwZWNJZHg6IFRTUEVDIGlkZW50aWZpZXIgdW5pcXVlbHkgaWRlbnRpZnlpbmcgYSBUU1BFQyBmb3IgYSBTVEEgaW4gYSBCU1MKKyAqIEBic3NJZDogQlNTSUQKKyAqIEBzZXNzaW9uSWQ6IHNlc3Npb24gaWQKKyAqIEB1c2VyUHJpbzogdXNlciBwcmlvcml0eQorICogQGRlbFRzSW5mbzogREVMVFMgaW5mbworICogQHNldFJJQ3BhcmFtczogUklDIHBhcmFtZXRlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IHN0YUlkeDsKKwl1aW50MTZfdCB0c3BlY0lkeDsKKwl0U2lyTWFjQWRkciBic3NJZDsKKwl1aW50OF90IHNlc3Npb25JZDsKKwl1aW50OF90IHVzZXJQcmlvOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwl0U2lyRGVsdHNSZXFJbmZvIGRlbFRzSW5mbzsKKwl1aW50OF90IHNldFJJQ3BhcmFtczsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FEICovCit9IHREZWxUc1BhcmFtcywgKnRwRGVsVHNQYXJhbXM7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCisjZGVmaW5lIEhBTF9RT1NfTlVNX1RTUEVDX01BWCAyCisjZGVmaW5lIEhBTF9RT1NfTlVNX0FDX01BWCA0CisKKy8qKgorICogc3RydWN0IHRBZ2dyQWRkVHNQYXJhbXMgLSBBRERUUyBwYXJhbWV0ZXJzCisgKiBAc3RhSWR4OiBzdGF0aW9uIGluZGV4CisgKiBAdHNwZWNJZHg6IFRTUEVDIGhhbmRsZXIgdW5pcXVlbHkgaWRlbnRpZnlpbmcgYSBUU1BFQyBmb3IgYSBTVEEgaW4gYSBCU1MKKyAqIEB0c3BlYzogdHNwZWMgdmFsdWUKKyAqIEBzdGF0dXM6IENERiBzdGF0dXMKKyAqIEBzZXNzaW9uSWQ6IHNlc3Npb24gaWQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IHN0YUlkeDsKKwl1aW50MTZfdCB0c3BlY0lkeDsKKwl0U2lyTWFjVHNwZWNJRSB0c3BlY1tIQUxfUU9TX05VTV9BQ19NQVhdOworCUNERl9TVEFUVVMgc3RhdHVzW0hBTF9RT1NfTlVNX0FDX01BWF07CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRBZ2dyQWRkVHNQYXJhbXMsICp0cEFnZ3JBZGRUc1BhcmFtczsKKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKK3R5cGVkZWYgdFNpclJldFN0YXR1cyAoKnRIYWxNc2dDYWxsYmFjaykodHBBbmlTaXJHbG9iYWwgcE1hYywgdWludDMyX3QgbWVzZ0lkLAorCQkJCQkgdm9pZCAqbWVzZ1BhcmFtKTsKKworLyoqCisgKiBzdHJ1Y3QgdEVkY2FQYXJhbXMgLSBFRENBIHBhcmFtZXRlcnMKKyAqIEBic3NJZHg6IEJTU0lEIGluZGV4CisgKiBAYWNiZTogYmVzdCBlZmZvcnQgYWNjZXNzIGNhdGFnb3J5CisgKiBAYWNiazogQmFja2dyb3VuZCBhY2Nlc3MgY2F0YWdvcnkKKyAqIEBhY3ZpOiB2aWRlbyBhY2Nlc3MgY2F0YWdvcnkKKyAqIEBhY3ZvOiB2b2ljZSBhY2Nlc3MgY2F0YWdvcnkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IGJzc0lkeDsKKwl0U2lyTWFjRWRjYVBhcmFtUmVjb3JkIGFjYmU7CisJdFNpck1hY0VkY2FQYXJhbVJlY29yZCBhY2JrOworCXRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgYWN2aTsKKwl0U2lyTWFjRWRjYVBhcmFtUmVjb3JkIGFjdm87Cit9IHRFZGNhUGFyYW1zLCAqdHBFZGNhUGFyYW1zOworCisvKioKKyAqIHN0cnVjdCB0U2V0TUlNT1BTIC0gTUlNTyBwb3dlciBzYXZlIHJlbGF0ZWQgcGFyYW1ldGVycworICogQHN0YUlkeDogc3RhdGlvbiBpbmRleAorICogQGh0TUlNT1BTU3RhdGU6IE1JTU8gUG93ZXIgU2F2ZSBTdGF0ZQorICogQHN0YXR1czogcmVzcG9uc2Ugc3RhdHVzCisgKiBAZnNlbmRSc3A6IHNlbmQgcmVzcG9uc2UgZmxhZworICogQHBlZXJNYWM6IHBlZXIgbWFjIGFkZHJlc3MKKyAqIEBzZXNzaW9uSWQ6IHNlc3Npb24gaWQKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1NldF9NSU1PUFMgeworCXVpbnQxNl90IHN0YUlkeDsKKwl0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUgaHRNSU1PUFNTdGF0ZTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl1aW50OF90IGZzZW5kUnNwOworCXRTaXJNYWNBZGRyIHBlZXJNYWM7CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRTZXRNSU1PUFMsICp0cFNldE1JTU9QUzsKKworLyoqCisgKiBzdHJ1Y3QgdFVhcHNkUGFyYW1zIC0gVWFwc2QgcmVsYXRlZCBwYXJhbWV0ZXJzCisgKiBAYmtEZWxpdmVyeUVuYWJsZWQ6IEJLIGRlbGl2ZXJ5IGVuYWJsZSBmbGFnCisgKiBAYmVEZWxpdmVyeUVuYWJsZWQ6IEJFIGRlbGl2ZXJ5IGVuYWJsZSBmbGFnCisgKiBAdmlEZWxpdmVyeUVuYWJsZWQ6IFZJIGRlbGl2ZXJ5IGVuYWJsZSBmbGFnCisgKiBAdm9EZWxpdmVyeUVuYWJsZWQ6IFZPIGRlbGl2ZXJ5IGVuYWJsZSBmbGFnCisgKiBAYmtUcmlnZ2VyRW5hYmxlZDogQksgdHJpZ2dlciBlbmFibGUgZmxhZworICogQGJlVHJpZ2dlckVuYWJsZWQ6IEJFIHRyaWdnZXIgZW5hYmxlIGZsYWcKKyAqIEB2aVRyaWdnZXJFbmFibGVkOiBWSSB0cmlnZ2VyIGVuYWJsZSBmbGFnCisgKiBAdm9UcmlnZ2VyRW5hYmxlZDogVk8gdHJpZ2dlciBlbmFibGUgZmxhZworICogQHN0YXR1czogcmVzcG9uc2Ugc3RhdHVzCisgKiBAYnNzSWR4OiBCU1NJRCBpbmRleAorICogUmVxdWVzdCBUeXBlID0gU0lSX0hBTF9FTlRFUl9VQVBTRF9SRVEKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1VhcHNkUGFyYW1zIHsKKwl1aW50OF90IGJrRGVsaXZlcnlFbmFibGVkOjE7CisJdWludDhfdCBiZURlbGl2ZXJ5RW5hYmxlZDoxOworCXVpbnQ4X3QgdmlEZWxpdmVyeUVuYWJsZWQ6MTsKKwl1aW50OF90IHZvRGVsaXZlcnlFbmFibGVkOjE7CisJdWludDhfdCBia1RyaWdnZXJFbmFibGVkOjE7CisJdWludDhfdCBiZVRyaWdnZXJFbmFibGVkOjE7CisJdWludDhfdCB2aVRyaWdnZXJFbmFibGVkOjE7CisJdWludDhfdCB2b1RyaWdnZXJFbmFibGVkOjE7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCBic3NJZHg7Cit9IHRVYXBzZFBhcmFtcywgKnRwVWFwc2RQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHRIYWxJbmRDQiAtIGhhbCBtZXNzYWdlIGluZGljYXRpb24gY2FsbGJhY2sKKyAqIEBwSGFsSW5kQ0I6IGhhbCBtZXNzYWdlIGluZGljYXRpb24gY2FsbGFiY2sKKyAqLwordHlwZWRlZiBzdHJ1Y3QgdEhhbEluZENCIHsKKwl0SGFsTXNnQ2FsbGJhY2sgcEhhbEluZENCOworfSB0SGFsSW5kQ0IsICp0cEhhbEluZENCOworCisvKioKKyAqIHN0cnVjdCBzQ29udHJvbFR4UGFyYW1zIC0gY29udHJvbCB0eCBwYXJhbWV0ZXJzCisgKiBAc3RvcFR4OiBzdG9wIHRyYW5zbWlzc2lvbgorICogQGZDdHJsR2xvYmFsOiAgTWFzdGVyIGZsYWcgdG8gc3RvcCBvciByZXN1bWUgYWxsIHRyYW5zbWlzc2lvbgorICogQGN0cmxTdGE6IElmIHRoaXMgZmxhZyBpcyBzZXQsIHN0YUJpdG1hcAorICogQGN0cmxCc3M6IElmIHRoaXMgZmxhZyBpcyBzZXQsIGJzc0JpdG1hcCBhbmQgYmVhY29uQml0bWFwIGlzIHZhbGlkCisgKiBAYnNzQml0bWFwOiBiaXRtYXAgb2YgQlNTIGluZGljZXMgdG8gYmUgc3RvcHBlZCBmb3IgcmVzdW1lZAorICogQGJlYWNvbkJpdG1hcDogdGhpcyBiaXRtYXAgY29udGFpbnMgYml0bWFwIG9mIEJTUyBpbmRpY2VzIHRvIGJlCisgKiAgICAgICAgICAgICAgICBzdG9wcGVkIGZvciByZXN1bWVkIGZvciBiZWFjb24gdHJhbnNtaXNzaW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHNDb250cm9sVHhQYXJhbXMgeworCWJvb2wgc3RvcFR4OworCXVpbnQ4X3QgZkN0cmxHbG9iYWw7CisJdWludDhfdCBjdHJsU3RhOworCXVpbnQ4X3QgY3RybEJzczsKKwkvKiBXaGVuIGN0cmxCc3MgaXMgc2V0LCB0aGlzIGJpdG1hcCBjb250YWlucyBiaXRtYXAgb2YgQlNTIGluZGljZXMgdG8gYmUKKwkgKiBzdG9wcGVkIGZvciByZXN1bWVkIGZvciB0cmFuc21pc3Npb24uCisJICogVGhpcyBpcyAzMiBiaXQgYml0bWFwLCBub3QgYXJyYXkgb2YgYnl0ZXMuCisJICovCisJdWludDMyX3QgYnNzQml0bWFwOworCS8qIFdoZW4gY3RybEJzcyBpcyBzZXQsIHRoaXMgYml0bWFwIGNvbnRhaW5zIGJpdG1hcCBvZiBCU1MgaW5kaWNlcyB0byBiZQorCSAqIHN0b3BwZWQgZm9yIHJlc3VtZWQgZm9yIGJlYWNvbiB0cmFuc21pc3Npb24uCisJICovCisJdWludDMyX3QgYmVhY29uQml0bWFwOworfSB0VHhDb250cm9sUGFyYW1zLCAqdHBUeENvbnRyb2xQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHRNYXhUeFBvd2VyUGFyYW1zIC0gTWF4IFR4IFBvd2VyIHBhcmFtZXRlcnMKKyAqIEBic3NJZDogQlNTSUQgaXMgbmVlZGVkIHRvIGlkZW50aWZ5IHdoaWNoIHNlc3Npb24gaXNzdWVkIHRoaXMgcmVxdWVzdAorICogQHNlbGZTdGFNYWNBZGRyOiBzZWxmIG1hYyBhZGRyZXNzCisgKiBAcG93ZXI6IHR4IHBvd2VyIGluIGRibQorICogQGRldl9tb2RlOiBkZXZpY2UgbW9kZQorICogUmVxdWVzdCBUeXBlID0gU0lSX0hBTF9TRVRfTUFYX1RYX1BPV0VSX1JFUQorICovCit0eXBlZGVmIHN0cnVjdCBzTWF4VHhQb3dlclBhcmFtcyB7CisJdFNpck1hY0FkZHIgYnNzSWQ7CisJdFNpck1hY0FkZHIgc2VsZlN0YU1hY0FkZHI7CisJLyogSW4gcmVxdWVzdCwKKwkgKiBwb3dlciA9PSBNYXhUeCBwb3dlciB0byBiZSB1c2VkLgorCSAqIEluIHJlc3BvbnNlLAorCSAqIHBvd2VyID09IHR4IHBvd2VyIHVzZWQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzLgorCSAqLworCXRQb3dlcmRCbSBwb3dlcjsKKwl0Q0RGX0NPTl9NT0RFIGRldl9tb2RlOworfSB0TWF4VHhQb3dlclBhcmFtcywgKnRwTWF4VHhQb3dlclBhcmFtczsKKworLyoqCisgKiBzdHJ1Y3QgdE1heFR4UG93ZXJQZXJCYW5kUGFyYW1zIC0gbWF4IHR4IHBvd2VyIHBlciBiYW5kIGluZm8KKyAqIEBiYW5kSW5mbzogYmFuZCBpbmZvCisgKiBAcG93ZXI6IHBvd2VyIGluIGRibQorICovCit0eXBlZGVmIHN0cnVjdCBzTWF4VHhQb3dlclBlckJhbmRQYXJhbXMgeworCWVDc3JCYW5kIGJhbmRJbmZvOworCXRQb3dlcmRCbSBwb3dlcjsKK30gdE1heFR4UG93ZXJQZXJCYW5kUGFyYW1zLCAqdHBNYXhUeFBvd2VyUGVyQmFuZFBhcmFtczsKKworLyoqCisgKiBzdHJ1Y3QgYWRkX3N0YV9zZWxmX3BhcmFtcyAtIEFkZCBTdGEgU2VsZiBwYXJhbXMKKyAqIEBzZWxmX21hY19hZGRyOiBzZWxmIE1BQyBBZGRyZXNzCisgKiBAY3Vycl9kZXZpY2VfbW9kZTogb3BlcmF0aW5nIGRldmljZSBtb2RlCisgKiBAdHlwZTogVmRldiBUeXBlCisgKiBAc3ViX3R5cGU6IFZkZXYgU3ViIFR5cGUKKyAqIEBzZXNzaW9uX2lkOiBTTUUgU2Vzc2lvbiBJRAorICogQHN0YXR1czogcmVzcG9uc2Ugc3RhdHVzIGNvZGUKKyAqLworc3RydWN0IGFkZF9zdGFfc2VsZl9wYXJhbXMgeworCXRTaXJNYWNBZGRyIHNlbGZfbWFjX2FkZHI7CisJdENERl9DT05fTU9ERSBjdXJyX2RldmljZV9tb2RlOworCXVpbnQzMl90IHR5cGU7CisJdWludDMyX3Qgc3ViX3R5cGU7CisJdWludDhfdCBzZXNzaW9uX2lkOworCXVpbnQzMl90IHN0YXR1czsKK307CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCisjZGVmaW5lIEhBTF9URExTX01BWF9TVVBQX0NIQU5ORUxTICAgICAgIDEyOAorI2RlZmluZSBIQUxfVERMU19NQVhfU1VQUF9PUEVSX0NMQVNTRVMgICAzMgorCisvKioKKyAqIHN0cnVjdCB0VGRsc1BlZXJDYXBQYXJhbXMgLSBURExTIHBlZXIgY2FwYWJsaXRpZXMgcGFyYW1ldGVycworICogQGlzUGVlclJlc3BvbmRlcjogaXMgcGVlciByZXNwb25kZXIgb3Igbm90CisgKiBAcGVlclVhcHNkUXVldWU6IHBlZXIgdWFwc2QgcXVldWUKKyAqIEBwZWVyTWF4U3A6IHBlZXIgbWF4IFNQIHZhbHVlCisgKiBAcGVlckJ1ZmZTdGFTdXBwb3J0OiBwZWVyIGJ1ZmZlciBzdGEgc3VwcG9ydGVkIG9yIG5vdAorICogQHBlZXJPZmZDaGFuU3VwcG9ydDogcGVlciBvZmZjaGFubmVsIHN1cHBvcnQKKyAqIEBwZWVyQ3Vyck9wZXJDbGFzczogcGVlciBjdXJyZW50IG9wZXJhdGluZyBjbGFzcworICogQHNlbGZDdXJyT3BlckNsYXNzOiBzZWxmIGN1cnJlbnQgb3BlcmF0aW5nIGNsYXNzCisgKiBAcGVlckNoYW5MZW46IHBlZXIgY2hhbm5lbCBsZW5ndGgKKyAqIEBwZWVyQ2hhbjogcGVlciBjaGFubmVsIGxpc3QKKyAqIEBwZWVyT3BlckNsYXNzTGVuOiBwZWVyIG9wZXJhdGluZyBjbGFzcyBsZW5ndGgKKyAqIEBwZWVyT3BlckNsYXNzOiBwZWVyIG9wZXJhdGluZyBjbGFzcworICogQHByZWZPZmZDaGFuTnVtOiBwZWVyIG9mZmNoYW5uZWwgbnVtYmVyCisgKiBAcHJlZk9mZkNoYW5CYW5kd2lkdGg6IHBlZXIgb2ZmY2hhbm5lbCBiYW5kd2lkdGgKKyAqIEBvcENsYXNzRm9yUHJlZk9mZkNoYW46IG9wZXJhdGluZyBjbGFzcyBmb3Igb2ZmY2hhbm5lbAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBpc1BlZXJSZXNwb25kZXI7CisJdWludDhfdCBwZWVyVWFwc2RRdWV1ZTsKKwl1aW50OF90IHBlZXJNYXhTcDsKKwl1aW50OF90IHBlZXJCdWZmU3RhU3VwcG9ydDsKKwl1aW50OF90IHBlZXJPZmZDaGFuU3VwcG9ydDsKKwl1aW50OF90IHBlZXJDdXJyT3BlckNsYXNzOworCXVpbnQ4X3Qgc2VsZkN1cnJPcGVyQ2xhc3M7CisJdWludDhfdCBwZWVyQ2hhbkxlbjsKKwl0U2lyVXBkYXRlQ2hhblBhcmFtIHBlZXJDaGFuW0hBTF9URExTX01BWF9TVVBQX0NIQU5ORUxTXTsKKwl1aW50OF90IHBlZXJPcGVyQ2xhc3NMZW47CisJdWludDhfdCBwZWVyT3BlckNsYXNzW0hBTF9URExTX01BWF9TVVBQX09QRVJfQ0xBU1NFU107CisJdWludDhfdCBwcmVmT2ZmQ2hhbk51bTsKKwl1aW50OF90IHByZWZPZmZDaGFuQmFuZHdpZHRoOworCXVpbnQ4X3Qgb3BDbGFzc0ZvclByZWZPZmZDaGFuOworfSB0VGRsc1BlZXJDYXBQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHRUZGxzUGVlclN0YXRlUGFyYW1zIC0gVERMUyBwZWVyIHN0YXRlIHBhcmFtZXRlcnMKKyAqIEB2ZGV2SWQ6IHZkZXYgaWQKKyAqIEBwZWVyTWFjQWRkcjogcGVlciBtYWMgYWRkcmVzcworICogQHBlZXJDYXA6IHBlZXIgY2FwYWJhbGl0eQorICovCit0eXBlZGVmIHN0cnVjdCBzVGRsc1BlZXJTdGF0ZVBhcmFtcyB7CisJdWludDMyX3QgdmRldklkOworCXRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCXVpbnQzMl90IHBlZXJTdGF0ZTsKKwl0VGRsc1BlZXJDYXBQYXJhbXMgcGVlckNhcDsKK30gdFRkbHNQZWVyU3RhdGVQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHRkbHNfY2hhbl9zd2l0Y2hfcGFyYW1zIC0gY2hhbm5lbCBzd2l0Y2ggcGFyYW1ldGVyIHN0cnVjdHVyZQorICogQHZkZXZfaWQ6IHZkZXYgSUQKKyAqIEBwZWVyX21hY19hZGRyOiBQZWVyIG1hYyBhZGRyZXNzCisgKiBAdGRsc19vZmZfY2hfYndfb2Zmc2V0OiBUYXJnZXQgb2ZmLWNoYW5uZWwgYmFuZHdpdGRoIG9mZnNldAorICogQHRkbHNfb2ZmX2NoOiBUYXJnZXQgT2ZmIENoYW5uZWwKKyAqIEBvcGVyX2NsYXNzOiBPcGVyYXRpbmcgY2xhc3MgZm9yIHRhcmdldCBjaGFubmVsCisgKiBAaXNfcmVzcG9uZGVyOiBSZXNwb25kZXIgb3IgaW5pdGlhdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0IHRkbHNfY2hhbl9zd2l0Y2hfcGFyYW1zX3N0cnVjdCB7CisJdWludDMyX3QgICAgdmRldl9pZDsKKwl0U2lyTWFjQWRkciBwZWVyX21hY19hZGRyOworCXVpbnQxNl90ICAgIHRkbHNfb2ZmX2NoX2J3X29mZnNldDsKKwl1aW50OF90ICAgICB0ZGxzX29mZl9jaDsKKwl1aW50OF90ICAgICB0ZGxzX3N3X21vZGU7CisJdWludDhfdCAgICAgb3Blcl9jbGFzczsKKwl1aW50OF90ICAgICBpc19yZXNwb25kZXI7Cit9IHRkbHNfY2hhbl9zd2l0Y2hfcGFyYW1zOworCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KKworLyoqCisgKiBzdHJ1Y3QgdEFib3J0U2NhblBhcmFtcyAtIEFib3J0IHNjYW4gcGFyYW1ldGVycworICogQFNlc3Npb25JZDogc2Vzc2lvbiBpZAorICovCit0eXBlZGVmIHN0cnVjdCBzQWJvcnRTY2FuUGFyYW1zIHsKKwl1aW50OF90IFNlc3Npb25JZDsKKwl1aW50MzJfdCBzY2FuX2lkOworfSB0QWJvcnRTY2FuUGFyYW1zLCAqdHBBYm9ydFNjYW5QYXJhbXM7CisKKy8qKgorICogc3RydWN0IGRlbF9zdGFfc2VsZl9wYXJhbXMgLSBEZWwgU3RhIFNlbGYgcGFyYW1zCisgKiBAc2Vzc2lvbl9pZDogU01FIFNlc3Npb24gSUQKKyAqIEBzdGF0dXM6IHJlc3BvbnNlIHN0YXR1cyBjb2RlCisgKi8KK3N0cnVjdCBkZWxfc3RhX3NlbGZfcGFyYW1zIHsKKwl0U2lyTWFjQWRkciBzZWxmX21hY19hZGRyOworCXVpbnQ4X3Qgc2Vzc2lvbl9pZDsKKwl1aW50MzJfdCBzdGF0dXM7Cit9OworCisvKioKKyAqIHN0cnVjdCB0UDJwUHNQYXJhbXMgLSBQMlAgcG93ZXJzYXZlIHJlbGF0ZWQgcGFyYW1zCisgKiBAb3BwX3BzOiBvcHBvcnR1bmlzdGljIHBvd2VyIHNhdmUKKyAqIEBjdFdpbmRvdzogQ1Qgd2luZG93CisgKiBAY291bnQ6IGNvdW50CisgKiBAZHVyYXRpb246IGR1cmF0aW9uCisgKiBAaW50ZXJ2YWw6IGludGVydmFsCisgKiBAc2luZ2xlX25vYV9kdXJhdGlvbjogc2luZ2xlIHNob3Qgbm9hIGR1cmF0aW9uCisgKiBAcHNTZWxlY3Rpb246IHBvd2VyIHNhdmUgc2VsZWN0aW9uCisgKiBAc2Vzc2lvbklkOiBzZXNzaW9uIGlkCisgKi8KK3R5cGVkZWYgc3RydWN0IHNQMnBQc1BhcmFtcyB7CisJdWludDhfdCBvcHBfcHM7CisJdWludDMyX3QgY3RXaW5kb3c7CisJdWludDhfdCBjb3VudDsKKwl1aW50MzJfdCBkdXJhdGlvbjsKKwl1aW50MzJfdCBpbnRlcnZhbDsKKwl1aW50MzJfdCBzaW5nbGVfbm9hX2R1cmF0aW9uOworCXVpbnQ4X3QgcHNTZWxlY3Rpb247CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRQMnBQc1BhcmFtcywgKnRwUDJwUHNQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHRUZGxzTGlua0VzdGFibGlzaFBhcmFtcyAtIFRETFMgTGluayBlc3RhYmxpc2ggcGFyYW1ldGVycworICogQHN0YUlkeDogc3RhdGlvbiBpbmRleAorICogQGlzUmVzcG9uZGVyOiByZXNwb25kZXIgZmxhZworICogQHVhcHNkUXVldWVzOiB1YXBzZCBxdWV1ZQorICogQG1heFNwOiBtYXggU1AgcGVyaW9kCisgKiBAaXNCdWZzdGE6IGlzIHN0YXRpb24gZmxhZworICogQGlzT2ZmQ2hhbm5lbFN1cHBvcnRlZDogb2ZmY2hhbm5lbCBzdXBwb3J0ZWQgb3Igbm90CisgKiBAcGVlckN1cnJPcGVyQ2xhc3M6IHBlZXIgY3VycmVudCBvcGVyYXRpbmcgY2xhc3MKKyAqIEBzZWxmQ3Vyck9wZXJDbGFzczogc2VsZiBjdXJyZW50IG9wZXJhdGluZyBjbGFzcworICogQHZhbGlkQ2hhbm5lbHNMZW46IHZhbGlkIGNoYW5uZWwgbGVuZ3RoCisgKiBAdmFsaWRDaGFubmVsczogdmFsaWQgY2hhbm5lbHMKKyAqIEB2YWxpZE9wZXJDbGFzc2VzTGVuOiB2YWxpZCBvcGVyYXRpbmcgY2xhc3MgbGVuZ3RoCisgKiBAdmFsaWRPcGVyQ2xhc3NlczogdmFsaWQgb3BlcmF0aW5nIGNsYXNzCisgKiBAc3RhdHVzOiByZXR1cm4gc3RhdHVzIG9mIGNvbW1hbmQKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc1RkbHNMaW5rRXN0YWJsaXNoUGFyYW1zIHsKKwl1aW50MTZfdCBzdGFJZHg7CisJdWludDhfdCBpc1Jlc3BvbmRlcjsKKwl1aW50OF90IHVhcHNkUXVldWVzOworCXVpbnQ4X3QgbWF4U3A7CisJdWludDhfdCBpc0J1ZnN0YTsKKwl1aW50OF90IGlzT2ZmQ2hhbm5lbFN1cHBvcnRlZDsKKwl1aW50OF90IHBlZXJDdXJyT3BlckNsYXNzOworCXVpbnQ4X3Qgc2VsZkN1cnJPcGVyQ2xhc3M7CisJdWludDhfdCB2YWxpZENoYW5uZWxzTGVuOworCXVpbnQ4X3QgdmFsaWRDaGFubmVsc1tIQUxfTUFYX1NVUFBfQ0hBTk5FTFNdOworCXVpbnQ4X3QgdmFsaWRPcGVyQ2xhc3Nlc0xlbjsKKwl1aW50OF90IHZhbGlkT3BlckNsYXNzZXNbSEFMX01BWF9TVVBQX09QRVJfQ0xBU1NFU107CisJdWludDMyX3Qgc3RhdHVzOworfSB0VGRsc0xpbmtFc3RhYmxpc2hQYXJhbXMsICp0cFRkbHNMaW5rRXN0YWJsaXNoUGFyYW1zOworCisvKioKKyAqIHN0cnVjdCB0SGFsSGlkZGVuU3NpZFZkZXZSZXN0YXJ0IC0gaGlkZGVuIHNzaWQgdmRldiByZXN0YXJ0IHBhcmFtcworICogQHNzaWRIaWRkZW46IGlzIGhpZGRlbiBzc2lkIG9yIG5vdAorICogQHNlc3Npb25JZDogc2Vzc2lvbiBpZAorICovCit0eXBlZGVmIHN0cnVjdCB0SGFsSGlkZGVuU3NpZFZkZXZSZXN0YXJ0IHsKKwl1aW50OF90IHNzaWRIaWRkZW47CisJdWludDhfdCBzZXNzaW9uSWQ7Cit9IHRIYWxIaWRkZW5Tc2lkVmRldlJlc3RhcnQsICp0cEhhbEhpZGRlblNzaWRWZGV2UmVzdGFydDsKKworCitleHRlcm4gdm9pZCBzeXNfcHJvY2Vzc19tbWhfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKTsKKworLyoqCisgKiBzdHJ1Y3QgdEJlYWNvbkZpbHRlck1zZyAtIEJlYWNvbiBGaWx0ZXJpbmcgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBjYXBhYmlsaXR5SW5mbzogY2FwYWJpbGl0eSBpbmZvCisgKiBAY2FwYWJpbGl0eU1hc2s6IGNhcGFiYWxpdHkgbWFzaworICogQGJlYWNvbkludGVydmFsOiBiZWFjb24gaW50ZXJ2YWwKKyAqIEBpZU51bTogSUUgbnVtYmVyCisgKiBAcmVzZXJ2ZWQ6IHJlc2VydmVkCisgKi8KK3R5cGVkZWYgc3RydWN0IHNCZWFjb25GaWx0ZXJNc2cgeworCXVpbnQxNl90IGNhcGFiaWxpdHlJbmZvOworCXVpbnQxNl90IGNhcGFiaWxpdHlNYXNrOworCXVpbnQxNl90IGJlYWNvbkludGVydmFsOworCXVpbnQxNl90IGllTnVtOworCXVpbnQ4X3QgYnNzSWR4OworCXVpbnQ4X3QgcmVzZXJ2ZWQ7Cit9IGNkZl9wYWNrZWQgdEJlYWNvbkZpbHRlck1zZywgKnRwQmVhY29uRmlsdGVyTXNnOworCisvKioKKyAqIHN0cnVjdCB0RWlkQnl0ZUluZm8gLSBFaWQgYnl0ZSBpbmZvCisgKiBAb2Zmc2V0OiBvZmZzZXQKKyAqIEB2YWx1ZTogdmFsdWUKKyAqIEBiaXRNYXNrOiBCSVQgbWFzaworICogQHJlZjogcmVmcmVuY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0VpZEJ5dGVJbmZvIHsKKwl1aW50OF90IG9mZnNldDsKKwl1aW50OF90IHZhbHVlOworCXVpbnQ4X3QgYml0TWFzazsKKwl1aW50OF90IHJlZjsKK30gY2RmX3BhY2tlZCB0RWlkQnl0ZUluZm8sICp0cEVpZEJ5dGVJbmZvOworCisvKioKKyAqIHN0cnVjdCB0QmVhY29uRmlsdGVySWUgLSBiZWFjb24gZmlsdGVyIElFCisgKiBAZWxlbWVudElkOiBlbGVtZW50IElFCisgKiBAY2hlY2tJZVByZXNlbmNlOiBjaGVjayBJRSBwcmVzZW5jZQorICogQGJ5dGU6IEVpZCBieXRlIGluZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0JlYWNvbkZpbHRlckllIHsKKwl1aW50OF90IGVsZW1lbnRJZDsKKwl1aW50OF90IGNoZWNrSWVQcmVzZW5jZTsKKwl0RWlkQnl0ZUluZm8gYnl0ZTsKK30gY2RmX3BhY2tlZCB0QmVhY29uRmlsdGVySWUsICp0cEJlYWNvbkZpbHRlckllOworCisvKioKKyAqIHN0cnVjdCB0RGlzYWJsZUludHJhQnNzRndkIC0gaW50cmEgYnNzIGZvcndhcmQgcGFyYW1ldGVycworICogQHNlc3Npb25JZDogc2Vzc2lvbiBpZAorICogQGRpc2FibGVpbnRyYWJzc2Z3ZDogZGlzYWJsZSBpbnRyYSBic3MgZm9yd2FyZCBmbGFnCisgKi8KK3R5cGVkZWYgc3RydWN0IHNEaXNhYmxlSW50cmFCc3NGd2QgeworCXVpbnQxNl90IHNlc3Npb25JZDsKKwlib29sIGRpc2FibGVpbnRyYWJzc2Z3ZDsKK30gY2RmX3BhY2tlZCB0RGlzYWJsZUludHJhQnNzRndkLCAqdHBEaXNhYmxlSW50cmFCc3NGd2Q7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUCisvKioKKyAqIHN0cnVjdCB0U3RhdHNFeHRSZXF1ZXN0IC0gZXh0IHN0YXRzIHJlcXVlc3QKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAcmVxdWVzdF9kYXRhX2xlbjogcmVxdWVzdCBkYXRhIGxlbmd0aAorICogQHJlcXVlc3RfZGF0YTogcmVxdWVzdCBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0IHNTdGF0c0V4dFJlcXVlc3QgeworCXVpbnQzMl90IHZkZXZfaWQ7CisJdWludDMyX3QgcmVxdWVzdF9kYXRhX2xlbjsKKwl1aW50OF90IHJlcXVlc3RfZGF0YVtdOworfSB0U3RhdHNFeHRSZXF1ZXN0LCAqdHBTdGF0c0V4dFJlcXVlc3Q7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1NUQVRTX0VYVCAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorLyoqCisgKiBzdHJ1Y3QgdE5hblJlcXVlc3QgLSBOQU4gcmVxdWVzdCBwYXJhbXMKKyAqIEByZXF1ZXN0X2RhdGFfbGVuOiByZXF1ZXN0IGRhdGEgbGVuZ3RoCisgKiBAcmVxdWVzdF9kYXRhOiByZXF1ZXN0IGRhdGEKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc05hblJlcXVlc3QgeworCXVpbnQxNl90IHJlcXVlc3RfZGF0YV9sZW47CisJdWludDhfdCByZXF1ZXN0X2RhdGFbXTsKK30gdE5hblJlcXVlc3QsICp0cE5hblJlcXVlc3Q7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX05BTiAqLworCisjZW5kaWYgLyogX0hBTE1TR0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS93bWEvaW5jL3dtYV9pbnRlcm5hbC5oIGIvY29yZS93bWEvaW5jL3dtYV9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzdmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dtYS9pbmMvd21hX2ludGVybmFsLmgKQEAgLTAsMCArMSwxMDk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFdNQV9JTlRFUk5BTF9ICisjZGVmaW5lIFdNQV9JTlRFUk5BTF9ICisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMgZGVmaW5lcyAjIyMjIyMjIyMjIyMjIyMjIyMjICovCisvKgorICogVE9ETzogRm9sbG93aW5nIGNvbnN0YW50IHNob3VsZCBiZSBzaGFyZWQgYnkgZmlyd21hcmUgaW4KKyAqIHdtaV91bmlmaWVkLmguIFRoaXMgd2lsbCBiZSBkb25lIG9uY2Ugd21pX3VuaWZpZWQuaCBpcyB1cGRhdGVkLgorICovCisjZGVmaW5lIFdNSV9QRUVSX1NUQVRFX0FVVEhPUklaRUQgMHgyCisKKyNkZWZpbmUgV01BXzJfNF9HSFpfTUFYX0ZSRVEgIDMwMDAKKyNkZWZpbmUgV09XX0NTQV9FVkVOVF9PRkZTRVQgMTIKKworI2RlZmluZSBXTUFfREVGQVVMVF9TQ0FOX1JFUVVFU1RFUl9JRCAgICAgICAgMQorI2RlZmluZSBXTUlfU0NBTl9GSU5JU0hfRVZFTlRTIChXTUlfU0NBTl9FVkVOVF9TVEFSVF9GQUlMRUQgfCBcCisJCQkJV01JX1NDQU5fRVZFTlRfQ09NUExFVEVEIHwgXAorCQkJCVdNSV9TQ0FOX0VWRU5UX0RFUVVFVUVEKQorLyogZGVmYXVsdCB2YWx1ZSAqLworI2RlZmluZSBERUZBVUxUX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRCAgMjAKKy8qIHBkZXYgdmRldiBhbmQgcGVlciBzdGF0cyovCisjZGVmaW5lIEZXX1BERVZfU1RBVFNfU0VUIDB4MQorI2RlZmluZSBGV19WREVWX1NUQVRTX1NFVCAweDIKKyNkZWZpbmUgRldfUEVFUl9TVEFUU19TRVQgMHg0CisjZGVmaW5lIEZXX1NUQVRTX1NFVCAweDcKKworLypBUjk4ODgvQVI2MzIwICBub2lzZSBmbG9vciBhcHByb3ggdmFsdWUKKyAqIHNpbWlsYXIgdG8gdGhlIG1lbnRpb25lZCB0aGUgV01BCisgKi8KKyNkZWZpbmUgV01BX1RHVF9OT0lTRV9GTE9PUl9EQk0gKC05NikKKworLyoKKyAqIE1ha2Ugc3VyZSB0aGF0IGxpbmsgbW9uaXRvciBhbmQga2VlcCBhbGl2ZQorICogZGVmYXVsdCB2YWx1ZXMgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBDRkcuCisgKi8KKyNkZWZpbmUgV01BX0xJTktfTU9OSVRPUl9ERUZBVUxUX1RJTUVfU0VDUyAxMAorI2RlZmluZSBXTUFfS0VFUF9BTElWRV9ERUZBVUxUX1RJTUVfU0VDUyAgIDUKKworI2RlZmluZSBBR0NfRFVNUCAgMQorI2RlZmluZSBDSEFOX0RVTVAgMgorI2RlZmluZSBXRF9EVU1QICAgMworI2lmZGVmIENPTkZJR19BVEhfUENJRV9BQ0NFU1NfREVCVUcKKyNkZWZpbmUgUENJRV9EVU1QIDQKKyNlbmRpZgorCisvKiBjb25mb3JtYW5jZSB0ZXN0IGxpbWl0cyAqLworI2RlZmluZSBGQ0MgICAgICAgMHgxMAorI2RlZmluZSBNS0sgICAgICAgMHg0MAorI2RlZmluZSBFVFNJICAgICAgMHgzMAorCisvKiBNYXhpbXVtIEJ1ZmZlciBsZW5ndGggYWxsb3dlZCBmb3IgREZTIHBoeWVycm9ycyAqLworI2RlZmluZSBERlNfTUFYX0JVRl9MRU5HSFQgNDA5NgorCisjZGVmaW5lIFdNSV9ERUZBVUxUX05PSVNFX0ZMT09SX0RCTSAoLTk2KQorCisjZGVmaW5lIFdNSV9NQ0NfTUlOX0NIQU5ORUxfUVVPVEEgICAgICAgICAgICAgMjAKKyNkZWZpbmUgV01JX01DQ19NQVhfQ0hBTk5FTF9RVU9UQSAgICAgICAgICAgICA4MAorI2RlZmluZSBXTUlfTUNDX01JTl9OT05fWkVST19DSEFOTkVMX0xBVEVOQ1kgIDMwCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXR0ZXJucyB0aGF0IGNhbiBiZSB0cmFuc21pdHRlZCBieSB0aGUgZmlybXdhcmUKKyAqICBhbmQgbWF4aW11bSBwYXR0ZXJucyBzaXplLgorICovCisjZGVmaW5lIFdNQV9NQVhOVU1fUEVSSU9ESUNfVFhfUFRSTlMgNgorCisjZGVmaW5lIFdNSV9NQVhfSE9TVF9DUkVESVRTIDIKKyNkZWZpbmUgV01JX1dPV19SRVFVSVJFRF9DUkVESVRTIDEKKworI2RlZmluZSBNQVhfSFRfTUNTX0lEWCA4CisjZGVmaW5lIE1BWF9WSFRfTUNTX0lEWCAxMAorI2RlZmluZSBJTlZBTElEX01DU19JRFggMjU1CisKKyNkZWZpbmUgTElOS19TVEFUVVNfTEVHQUNZICAgICAgMAorI2RlZmluZSBMSU5LX1NUQVRVU19WSFQgICAgICAgICAweDEKKyNkZWZpbmUgTElOS19TVEFUVVNfTUlNTyAgICAgICAgMHgyCisjZGVmaW5lIExJTktfU1VQUE9SVF9WSFQJMHg0CisjZGVmaW5lIExJTktfU1VQUE9SVF9NSU1PCTB4OAorCisjZGVmaW5lIExJTktfUkFURV9WSFQgICAgICAgICAgIDB4MworCisjZGVmaW5lIE1BWF9FTlRSWV9IT0xEX1JFUV9RVUVVRSAyCisvKioKKyAqIHN0cnVjdCBpbmRleF9kYXRhX3JhdGVfdHlwZSAtIG5vbiB2aHQgZGF0YSByYXRlIHR5cGUKKyAqIEBiZWFjb25fcmF0ZV9pbmRleDogQmVhY29uIHJhdGUgaW5kZXgKKyAqIEBzdXBwb3J0ZWRfcmF0ZTogU3VwcG9ydGVkIHJhdGUgdGFibGUKKyAqLworc3RydWN0IGluZGV4X2RhdGFfcmF0ZV90eXBlIHsKKwl1aW50OF90IGJlYWNvbl9yYXRlX2luZGV4OworCXVpbnQxNl90IHN1cHBvcnRlZF9yYXRlWzRdOworfTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisvKioKKyAqIHN0cnVjdCBpbmRleF92aHRfZGF0YV9yYXRlX3R5cGUgLSB2aHQgZGF0YSByYXRlIHR5cGUKKyAqIEBiZWFjb25fcmF0ZV9pbmRleDogQmVhY29uIHJhdGUgaW5kZXgKKyAqIEBzdXBwb3J0ZWRfVkhUODBfcmF0ZTogVkhUODAgcmF0ZQorICogQHN1cHBvcnRlZF9WSFQ0MF9yYXRlOiBWSFQ0MCByYXRlCisgKiBAc3VwcG9ydGVkX1ZIVDIwX3JhdGU6IFZIVDIwIHJhdGUKKyAqLworc3RydWN0IGluZGV4X3ZodF9kYXRhX3JhdGVfdHlwZSB7CisJdWludDhfdCBiZWFjb25fcmF0ZV9pbmRleDsKKwl1aW50MTZfdCBzdXBwb3J0ZWRfVkhUODBfcmF0ZVsyXTsKKwl1aW50MTZfdCBzdXBwb3J0ZWRfVkhUNDBfcmF0ZVsyXTsKKwl1aW50MTZfdCBzdXBwb3J0ZWRfVkhUMjBfcmF0ZVsyXTsKK307CisjZW5kaWYKKworLyoKKyAqIHdtYV9tYWluLmMgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucworICovCisKK2ludAord21pX3VuaWZpZWRfcGRldl9zZXRfcGFyYW0od21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCBXTUlfUERFVl9QQVJBTSBwYXJhbV9pZCwKKwkJCSAgIHVpbnQzMl90IHBhcmFtX3ZhbHVlKTsKKwordm9pZCB3bWFfc2VuZF9tc2codHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLCB1aW50MTZfdCBtc2dfdHlwZSwKKwkJCSB2b2lkICpib2R5X3B0ciwgdWludDMyX3QgYm9keV92YWwpOworCit2b2lkIHdtYV9kYXRhX3R4X2Fja19jb21wX2hkbHIodm9pZCAqd21hX2NvbnRleHQsCisJCQkJICAgICAgY2RmX25idWZfdCBuZXRidWYsIGludDMyX3Qgc3RhdHVzKTsKKworQ0RGX1NUQVRVUyB3bWFfc2V0X3Bwc2NvbmZpZyh1aW50OF90IHZkZXZfaWQsIHVpbnQxNl90IHBwc19wYXJhbSwKKwkJCQkgICAgaW50IHZhbHVlKTsKKworLyoKKyAqIHdtYV9zY2FuX3JvYW0uYyBmdW5jdGlvbnMgZGVjbGFyYXRpb25zCisgKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKK3ZvaWQgd21hX3Byb2Nlc3Nfcm9hbV9pbnZva2UoV01BX0hBTkRMRSBoYW5kbGUsCisJCQkJc3RydWN0IHdtYV9yb2FtX2ludm9rZV9jbWQgKnJvYW1pbnZva2UpOworCit2b2lkIHdtYV9wcm9jZXNzX3JvYW1fc3luY2hfZmFpbChXTUFfSEFORExFIGhhbmRsZSwKKwkJCQkgc3RydWN0IHJvYW1fb2ZmbG9hZF9zeW5jaF9mYWlsICpzeW5jaF9mYWlsKTsKKworaW50IHdtYV9yb2FtX3N5bmNoX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwKKwkJCQkJdWludDMyX3QgbGVuKTsKKyNlbmRpZgorCitDREZfU1RBVFVTIHdtYV9nZXRfYnVmX3N0YXJ0X3NjYW5fY21kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICAgICB0U2lyU2Nhbk9mZmxvYWRSZXEgKnNjYW5fcmVxLAorCQkJCSAgICAgIHdtaV9idWZfdCAqYnVmLCBpbnQgKmJ1Zl9sZW4pOworCitDREZfU1RBVFVTIHdtYV9nZXRfYnVmX3N0b3Bfc2Nhbl9jbWQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICAgd21pX2J1Zl90ICpidWYsCisJCQkJICAgICBpbnQgKmJ1Zl9sZW4sCisJCQkJICAgICB0QWJvcnRTY2FuUGFyYW1zICphYm9ydF9zY2FuX3JlcSk7CisKK0NERl9TVEFUVVMgd21hX3N0YXJ0X3NjYW4odHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJICB0U2lyU2Nhbk9mZmxvYWRSZXEgKnNjYW5fcmVxLCB1aW50MTZfdCBtc2dfdHlwZSk7CisKK0NERl9TVEFUVVMgd21hX3N0b3Bfc2Nhbih0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkgdEFib3J0U2NhblBhcmFtcyAqYWJvcnRfc2Nhbl9yZXEpOworCitDREZfU1RBVFVTIHdtYV91cGRhdGVfY2hhbm5lbF9saXN0KFdNQV9IQU5ETEUgaGFuZGxlLAorCQkJCSAgIHRTaXJVcGRhdGVDaGFuTGlzdCAqY2hhbl9saXN0KTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9maWxsX3NlbGZfY2Fwcyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJCXdtaV9yb2FtX29mZmxvYWRfdGx2X3BhcmFtICoKKwkJCQkJcm9hbV9vZmZsb2FkX3BhcmFtcywKKwkJCQkJdFNpclJvYW1PZmZsb2FkU2NhblJlcSAqcm9hbV9yZXEpOworI2VuZGlmCisKK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9vZmZsb2FkX21vZGUodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICAgIHdtaV9zdGFydF9zY2FuX2NtZF9maXhlZF9wYXJhbSAqCisJCQkJICAgICAgc2Nhbl9jbWRfZnAsCisJCQkJICAgICAgdFNpclJvYW1PZmZsb2FkU2NhblJlcSAqcm9hbV9yZXEsCisJCQkJICAgICAgdWludDMyX3QgbW9kZSwgdWludDMyX3QgdmRldl9pZCk7CisKK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9vZmZsb2FkX3Jzc2lfdGhyZXNoKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJICAgICB0U2lyUm9hbU9mZmxvYWRTY2FuUmVxICpyb2FtX3JlcSk7CisKK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9vZmZsb2FkX3NjYW5fcGVyaW9kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJICAgICB1aW50MzJfdCBzY2FuX3BlcmlvZCwKKwkJCQkJICAgICB1aW50MzJfdCBzY2FuX2FnZSwKKwkJCQkJICAgICB1aW50MzJfdCB2ZGV2X2lkKTsKKworQ0RGX1NUQVRVUyB3bWFfcm9hbV9zY2FuX29mZmxvYWRfcnNzaV9jaGFuZ2UodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgICAgIHVpbnQzMl90IHZkZXZfaWQsCisJCQkJCSAgICAgaW50MzJfdCByc3NpX2NoYW5nZV90aHJlc2gsCisJCQkJCSAgICAgdWludDMyX3QgYmNuX3Jzc2lfd2VpZ2h0LAorCQkJCQkgICAgIHVpbnQzMl90IGhpcnNzaV9kZWxheV9idHdfc2NhbnMpOworCitDREZfU1RBVFVTIHdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9jaGFuX2xpc3QodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgICB1aW50OF90IGNoYW5fY291bnQsCisJCQkJCSAgIHVpbnQ4X3QgKmNoYW5fbGlzdCwKKwkJCQkJICAgdWludDhfdCBsaXN0X3R5cGUsIHVpbnQzMl90IHZkZXZfaWQpOworCitBX1VJTlQzMiBlX2Nzcl9hdXRoX3R5cGVfdG9fcnNuX2F1dGhtb2RlKGVDc3JBdXRoVHlwZSBhdXRodHlwZSwKKwkJCQkJIGVDc3JFbmNyeXB0aW9uVHlwZSBlbmNyKTsKKworQV9VSU5UMzIgZV9jc3JfZW5jcnlwdGlvbl90eXBlX3RvX3Jzbl9jaXBoZXJzZXQoZUNzckVuY3J5cHRpb25UeXBlIGVuY3IpOworCit2b2lkIHdtYV9yb2FtX3NjYW5fZmlsbF9hcF9wcm9maWxlKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICB0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgIHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgKnJvYW1fcmVxLAorCQkJCSAgIHdtaV9hcF9wcm9maWxlICphcF9wcm9maWxlX3ApOworCit2b2lkIHdtYV9yb2FtX3NjYW5fZmlsbF9zY2FuX3BhcmFtcyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisJCQkJICAgIHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgKnJvYW1fcmVxLAorCQkJCSAgICB3bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0gKgorCQkJCSAgICBzY2FuX3BhcmFtcyk7CisKK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9vZmZsb2FkX2FwX3Byb2ZpbGUodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgICAgd21pX2FwX3Byb2ZpbGUgKmFwX3Byb2ZpbGVfcCwKKwkJCQkJICAgIHVpbnQzMl90IHZkZXZfaWQpOworCitDREZfU1RBVFVTIHdtYV9yb2FtX3NjYW5fYm1pc3NfY250KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICBBX0lOVDMyIGZpcnN0X2JjbnQsCisJCQkJICAgQV9VSU5UMzIgZmluYWxfYmNudCwgdWludDMyX3QgdmRldl9pZCk7CisKK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9vZmZsb2FkX2NvbW1hbmQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgdWludDMyX3QgY29tbWFuZCwgdWludDMyX3QgdmRldl9pZCk7CisKK0NERl9TVEFUVVMgd21hX3Byb2Nlc3Nfcm9hbV9zY2FuX3JlcSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICAgICB0U2lyUm9hbU9mZmxvYWRTY2FuUmVxICpyb2FtX3JlcSk7CisKK0NERl9TVEFUVVMgd21hX3JvYW1fcHJlYXV0aF9jaGFuX3NldCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICAgICB0cFN3aXRjaENoYW5uZWxQYXJhbXMgcGFyYW1zLAorCQkJCSAgICAgdWludDhfdCB2ZGV2X2lkKTsKKworQ0RGX1NUQVRVUyB3bWFfcm9hbV9wcmVhdXRoX2NoYW5fY2FuY2VsKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJdHBTd2l0Y2hDaGFubmVsUGFyYW1zIHBhcmFtcywKKwkJCQkJdWludDhfdCB2ZGV2X2lkKTsKKwordm9pZCB3bWFfcm9hbV9wcmVhdXRoX3NjYW5fZXZlbnRfaGFuZGxlcih0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJCQl1aW50OF90IHZkZXZfaWQsCisJCQkJCQl3bWlfc2Nhbl9ldmVudF9maXhlZF9wYXJhbSAqCisJCQkJCQl3bWlfZXZlbnQpOworCit2b2lkIHdtYV9zZXRfY2hhbm5lbCh0cF93bWFfaGFuZGxlIHdtYSwgdHBTd2l0Y2hDaGFubmVsUGFyYW1zIHBhcmFtcyk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KK0NERl9TVEFUVVMgd21hX3Bub19zdGFydCh0cF93bWFfaGFuZGxlIHdtYSwgdHBTaXJQTk9TY2FuUmVxIHBubyk7CisKK0NERl9TVEFUVVMgd21hX3Bub19zdG9wKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IHZkZXZfaWQpOworCit2b2lkIHdtYV9jb25maWdfcG5vKHRwX3dtYV9oYW5kbGUgd21hLCB0cFNpclBOT1NjYW5SZXEgcG5vKTsKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKK0NERl9TVEFUVVMgd21hX3BsbV9zdGFydCh0cF93bWFfaGFuZGxlIHdtYSwgY29uc3QgdHBTaXJQbG1SZXEgcGxtKTsKKworQ0RGX1NUQVRVUyB3bWFfcGxtX3N0b3AodHBfd21hX2hhbmRsZSB3bWEsIGNvbnN0IHRwU2lyUGxtUmVxIHBsbSk7CisKK3ZvaWQgd21hX2NvbmZpZ19wbG0odHBfd21hX2hhbmRsZSB3bWEsIHRwU2lyUGxtUmVxIHBsbSk7CisjZW5kaWYKKwordm9pZCB3bWFfc2Nhbl9jYWNoZV91cGRhdGVkX2luZCh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCBzZXNzaW9uSWQpOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECit2b2lkIHdtYV9zZXRfcmljX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwgdm9pZCAqbXNnLCB1aW50OF90IGlzX2FkZF90cyk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisKK2ludCB3bWFfZXh0c2Nhbl9zdGFydF9zdG9wX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJCSB1aW50MzJfdCBsZW4pOworCitpbnQgd21hX2V4dHNjYW5fb3BlcmF0aW9uc19ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkJIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgdWludDMyX3QgbGVuKTsKKworaW50IHdtYV9leHRzY2FuX3RhYmxlX3VzYWdlX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkgIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgIHVpbnQzMl90IGxlbik7CisKK2ludCB3bWFfZXh0c2Nhbl9jYXBhYmlsaXRpZXNfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsCisJCQkJCSAgIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgICB1aW50MzJfdCBsZW4pOworCitpbnQgd21hX2V4dHNjYW5faG90bGlzdF9tYXRjaF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkJICAgIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgICAgdWludDMyX3QgbGVuKTsKKworaW50IHdtYV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkgICAgIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgICAgIHVpbnQzMl90IGxlbik7CisKK2ludCB3bWFfZXh0c2Nhbl9jaGFuZ2VfcmVzdWx0c19ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkJICAgICB1aW50OF90ICpjbWRfcGFyYW1faW5mbywKKwkJCQkJICAgICB1aW50MzJfdCBsZW4pOworCitpbnQgd21hX3Bhc3Nwb2ludF9tYXRjaF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkgICAgIHVpbnQ4X3QgICpjbWRfcGFyYW1faW5mbywKKwkJCQkgICAgIHVpbnQzMl90IGxlbik7CisKK2ludAord21hX2V4dHNjYW5faG90bGlzdF9zc2lkX21hdGNoX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkgICAgIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgICAgIHVpbnQzMl90IGxlbik7CisjZW5kaWYKKwordm9pZCB3bWFfcmVnaXN0ZXJfZXh0c2Nhbl9ldmVudF9oYW5kbGVyKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorQ0RGX1NUQVRVUyB3bWFfZ2V0X2J1Zl9leHRzY2FuX3N0YXJ0X2NtZCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJCSB0U2lyV2lmaVNjYW5DbWRSZXFQYXJhbXMgKnBzdGFydCwKKwkJCQkJIHdtaV9idWZfdCAqYnVmLCBpbnQgKmJ1Zl9sZW4pOworCitDREZfU1RBVFVTIHdtYV9zdGFydF9leHRzY2FuKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJICAgICB0U2lyV2lmaVNjYW5DbWRSZXFQYXJhbXMgKnBzdGFydCk7CisKK0NERl9TVEFUVVMgd21hX3N0b3BfZXh0c2Nhbih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCSAgICB0U2lyRXh0U2NhblN0b3BSZXFQYXJhbXMgKnBzdG9wY21kKTsKKworQ0RGX1NUQVRVUyB3bWFfZ2V0X2J1Zl9leHRzY2FuX2hvdGxpc3RfY21kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJICAgdFNpckV4dFNjYW5TZXRCc3NpZEhvdExpc3RSZXFQYXJhbXMgKgorCQkJCQkgICBwaG90bGlzdCwgaW50ICpidWZfbGVuKTsKKworQ0RGX1NUQVRVUyB3bWFfZXh0c2Nhbl9zdGFydF9ob3RsaXN0X21vbml0b3IodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCSAgICAgdFNpckV4dFNjYW5TZXRCc3NpZEhvdExpc3RSZXFQYXJhbXMKKwkJCQkJICAgICAqcGhvdGxpc3QpOworCitDREZfU1RBVFVTIHdtYV9leHRzY2FuX3N0b3BfaG90bGlzdF9tb25pdG9yKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkgICAgdFNpckV4dFNjYW5SZXNldEJzc2lkSG90bGlzdFJlcVBhcmFtcworCQkJCQkgICAgKnBob3RsaXN0X3Jlc2V0KTsKKworQ0RGX1NUQVRVUyB3bWFfZ2V0X2J1Zl9leHRzY2FuX2NoYW5nZV9tb25pdG9yX2NtZCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJCQkgIHRTaXJFeHRTY2FuU2V0U2lnQ2hhbmdlUmVxUGFyYW1zCisJCQkJCQkgICpwc2lnY2hhbmdlLCB3bWlfYnVmX3QgKmJ1ZiwKKwkJCQkJCSAgaW50ICpidWZfbGVuKTsKKworQ0RGX1NUQVRVUyB3bWFfZXh0c2Nhbl9zdGFydF9jaGFuZ2VfbW9uaXRvcih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJICAgIHRTaXJFeHRTY2FuU2V0U2lnQ2hhbmdlUmVxUGFyYW1zICoKKwkJCQkJICAgIHBzaWdjaGFuZ2UpOworCitDREZfU1RBVFVTIHdtYV9leHRzY2FuX3N0b3BfY2hhbmdlX21vbml0b3IodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCSAgIHRTaXJFeHRTY2FuUmVzZXRTaWduaWZpY2FudENoYW5nZVJlcVBhcmFtcworCQkJCQkgICAqcFJlc2V0UmVxKTsKKworQ0RGX1NUQVRVUyB3bWFfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHModHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCSAgdFNpckV4dFNjYW5HZXRDYWNoZWRSZXN1bHRzUmVxUGFyYW1zICoKKwkJCQkJICBwY2FjaGVkX3Jlc3VsdHMpOworCitDREZfU1RBVFVTIHdtYV9leHRzY2FuX2dldF9jYXBhYmlsaXRpZXModHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCXRTaXJHZXRFeHRTY2FuQ2FwYWJpbGl0aWVzUmVxUGFyYW1zICoKKwkJCQkJcGdldGNhcGFiKTsKK0NERl9TVEFUVVMgd21hX3NldF9lcG5vX25ldHdvcmtfbGlzdCh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQlzdHJ1Y3Qgd2lmaV9lcG5vX3BhcmFtcyAqcmVxKTsKKworQ0RGX1NUQVRVUyB3bWFfc2V0X3Bhc3Nwb2ludF9uZXR3b3JrX2xpc3QodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCXN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKnJlcSk7CisKK0NERl9TVEFUVVMgd21hX3Jlc2V0X3Bhc3Nwb2ludF9uZXR3b3JrX2xpc3QodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCXN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKnJlcSk7CitDREZfU1RBVFVTCit3bWFfc2V0X3NzaWRfaG90bGlzdCh0cF93bWFfaGFuZGxlIHdtYSwKKwkJICAgICBzdHJ1Y3Qgc2lyX3NldF9zc2lkX2hvdGxpc3RfcmVxdWVzdCAqcmVxdWVzdCk7CisjZW5kaWYKKworQ0RGX1NUQVRVUyAgd21hX2lwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJc3RydWN0IHNpcl9pcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZSAqaXBhX29mZmxvYWQpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAordm9pZCB3bWFfcHJvY2Vzc191bml0X3Rlc3RfY21kKFdNQV9IQU5ETEUgaGFuZGxlLAorCQkJCSAgICAgIHRfd21hX3VuaXRfdGVzdF9jbWQgKndtYV91dGVzdCk7CisjZW5kaWYKKworQ0RGX1NUQVRVUyB3bWFfc2Nhbl9wcm9iZV9zZXRvdWkodHBfd21hX2hhbmRsZSB3bWEsIHRTaXJTY2FuTWFjT3VpICpwc2V0b3VpKTsKKworaW50IHdtYV9zY2FuX2V2ZW50X2NhbGxiYWNrKFdNQV9IQU5ETEUgaGFuZGxlLCB1aW50OF90ICpkYXRhLCB1aW50MzJfdCBsZW4pOworCit2b2lkIHdtYV9yb2FtX2JldHRlcl9hcF9oYW5kbGVyKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50MzJfdCB2ZGV2X2lkKTsKKworaW50IHdtYV9yb2FtX2V2ZW50X2NhbGxiYWNrKFdNQV9IQU5ETEUgaGFuZGxlLCB1aW50OF90ICpldmVudF9idWYsCisJCQkgICAgdWludDMyX3QgbGVuKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworaW50IHdtYV9ubG9fbWF0Y2hfZXZ0X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwgdWludDMyX3QgbGVuKTsKKworaW50IHdtYV9ubG9fc2Nhbl9jbXBfZXZ0X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwgdWludDMyX3QgbGVuKTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAordm9pZCB3bWFfcHJvY2Vzc19yb2FtX3N5bmNoX2NvbXBsZXRlKFdNQV9IQU5ETEUgaGFuZGxlLAorCQkJCSAgICAgdFNpclNtZVJvYW1PZmZsb2FkU3luY2hDbmYgKnN5bmNoY25mKTsKKyNlbmRpZgorCisvKgorICogd21hX2Rldl9pZi5jIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKKyAqLworCit2b2lkICp3bWFfZmluZF92ZGV2X2J5X2FkZHIodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgKmFkZHIsCisJCQkJICAgdWludDhfdCAqdmRldl9pZCk7CisKKy8qKgorICogd21hX2ZpbmRfdmRldl9ieV9pZCgpIC0gUmV0dXJucyB2ZGV2IGhhbmRsZSBmb3IgZ2l2ZW4gdmRldiBpZC4KKyAqIEB3bWEgLSB3bWEgaGFuZGxlCisgKiBAdmRldl9pZCAtIHZkZXYgSUQKKyAqCisgKiBSZXR1cm46IFJldHVybnMgdmRldiBoYW5kbGUgaWYgZ2l2ZW4gdmRldiBpZCBpcyB2YWxpZC4KKyAqICAgICAgICAgT3RoZXJ3aXNlIHJldHVybnMgTlVMTC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICp3bWFfZmluZF92ZGV2X2J5X2lkKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IHZkZXZfaWQpCit7CisJaWYgKHZkZXZfaWQgPiB3bWEtPm1heF9ic3NpZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmhhbmRsZTsKK30KKworLyoqCisgKiB3bWFfZ2V0X3ZkZXZfY291bnQoKSAtIFJldHVybnMgbnVtYmVyIG9mIGFjdGl2ZSB2ZGV2LgorICogQHdtYSAtIHdtYSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IFJldHVybnMgdmFsaWQgdmRldiBjb3VudC4KKyAqLworc3RhdGljIGlubGluZSB1aW50OF90IHdtYV9nZXRfdmRldl9jb3VudCh0cF93bWFfaGFuZGxlIHdtYSkKK3sKKwl1aW50OF90IHZkZXZfY291bnQgPSAwLCBpOworCisJZm9yIChpID0gMDsgaSA8IHdtYS0+bWF4X2Jzc2lkOyBpKyspIHsKKwkJaWYgKHdtYS0+aW50ZXJmYWNlc1tpXS5oYW5kbGUpCisJCQl2ZGV2X2NvdW50Kys7CisJfQorCXJldHVybiB2ZGV2X2NvdW50OworfQorCitib29sIHdtYV9pc192ZGV2X2luX2FwX21vZGUodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCk7CisKKyNpZmRlZiBRQ0FfSUJTU19TVVBQT1JUCitib29sIHdtYV9pc192ZGV2X2luX2lic3NfbW9kZSh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkKTsKKyNlbmRpZgorCisvKioKKyAqIHdtYV9maW5kX2Jzc2lkX2J5X3ZkZXZfaWQoKSAtIEdldCB0aGUgQlNTIElEIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZkZXYgSUQKKyAqIEB3bWEgLSB3bWEgaGFuZGxlCisgKiBAdmRldl9pZCAtIHZkZXYgSUQKKyAqCisgKiBSZXR1cm46IFJldHVybnMgcG9pbnRlciB0byBic3NpZCBvbiBzdWNjZXNzLAorICogICAgICAgICBvdGhlcndpc2UgcmV0dXJucyBOVUxMLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKndtYV9maW5kX2Jzc2lkX2J5X3ZkZXZfaWQodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCQkgdWludDhfdCB2ZGV2X2lkKQoreworCWlmICh2ZGV2X2lkID49IHdtYS0+bWF4X2Jzc2lkKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiB3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uYnNzaWQ7Cit9CisKK3ZvaWQgKndtYV9maW5kX3ZkZXZfYnlfYnNzaWQodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgKmJzc2lkLAorCQkJCSAgICB1aW50OF90ICp2ZGV2X2lkKTsKKworaW50IHdtYV91bmlmaWVkX3ZkZXZfY3JlYXRlX3NlbmQod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCB1aW50OF90IGlmX2lkLAorCQkJCSB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzdWJ0eXBlLAorCQkJCSB1aW50OF90IG1hY2FkZHJbSUVFRTgwMjExX0FERFJfTEVOXSk7CisKK0NERl9TVEFUVVMgd21hX3ZkZXZfZGV0YWNoKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCXN0cnVjdCBkZWxfc3RhX3NlbGZfcGFyYW1zICpwZGVsX3N0YV9zZWxmX3JlcV9wYXJhbSwKKwkJCXVpbnQ4X3QgZ2VuZXJhdGVSc3ApOworCitpbnQgd21hX3ZkZXZfc3RhcnRfcmVzcF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJICAgICAgIHVpbnQzMl90IGxlbik7CisKK2ludCB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwgdWludDMyX3QgaWZfaWQsCisJCQkJdWludDMyX3QgcGFyYW1faWQsIHVpbnQzMl90IHBhcmFtX3ZhbHVlKTsKKworaW50MzJfdCB3bWlfdW5pZmllZF9wZWVyX2ZsdXNoX3RpZHNfc2VuZCh3bWlfdW5pZmllZF90IHdtaSwKKwkJCQkJCXVpbnQ4X3QgcGVlcl9hZGRyCisJCQkJCQlbSUVFRTgwMjExX0FERFJfTEVOXSwKKwkJCQkJCXVpbnQzMl90IHBlZXJfdGlkX2JpdG1hcCwKKwkJCQkJCXVpbnQ4X3QgdmRldl9pZCk7CisKK3ZvaWQgd21hX3JlbW92ZV9wZWVyKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90ICpic3NpZCwKKwkJCSAgICB1aW50OF90IHZkZXZfaWQsIG9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlciwKKwkJCSAgICBib29sIHJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MpOworCitDREZfU1RBVFVTIHdtYV9jcmVhdGVfcGVlcih0cF93bWFfaGFuZGxlIHdtYSwgb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2LAorCQkJICBvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYsCisJCQkgIHU4IHBlZXJfYWRkcltJRUVFODAyMTFfQUREUl9MRU5dLAorCQkJICB1aW50MzJfdCBwZWVyX3R5cGUsIHVpbnQ4X3QgdmRldl9pZCwKKwkJCSAgYm9vbCByb2FtX3N5bmNoX2luX3Byb2dyZXNzKTsKKworaW50IHdtYV92ZGV2X3N0b3BfcmVzcF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJICAgICAgdTMyIGxlbik7CisKK29sX3R4cnhfdmRldl9oYW5kbGUgd21hX3ZkZXZfYXR0YWNoKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQlzdHJ1Y3QgYWRkX3N0YV9zZWxmX3BhcmFtcyAqc2VsZl9zdGFfcmVxLAorCQkJCXVpbnQ4X3QgZ2VuZXJhdGVSc3ApOworCitDREZfU1RBVFVTIHdtYV92ZGV2X3N0YXJ0KHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCSBzdHJ1Y3Qgd21hX3ZkZXZfc3RhcnRfcmVxICpyZXEsIGJvb2wgaXNSZXN0YXJ0KTsKKwordm9pZCB3bWFfdmRldl9yZXNwX3RpbWVyKHZvaWQgKmRhdGEpOworCitzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKndtYV9maWxsX3ZkZXZfcmVxKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkJdWludDhfdCB2ZGV2X2lkLAorCQkJCQkJdWludDMyX3QgbXNnX3R5cGUsIHVpbnQ4X3QgdHlwZSwKKwkJCQkJCXZvaWQgKnBhcmFtcywgdWludDMyX3QgdGltZW91dCk7CisKK3ZvaWQgd21hX2hvbGRfcmVxX3RpbWVyKHZvaWQgKmRhdGEpOworc3RydWN0IHdtYV90YXJnZXRfcmVxICp3bWFfZmlsbF9ob2xkX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgICAgdWludDhfdCB2ZGV2X2lkLCB1aW50MzJfdCBtc2dfdHlwZSwKKwkJCQkgICAgdWludDhfdCB0eXBlLCB2b2lkICpwYXJhbXMsCisJCQkJICAgIHVpbnQzMl90IHRpbWVvdXQpOworCit2b2lkIHdtYV9yZW1vdmVfdmRldl9yZXEodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCwKKwkJCQl1aW50OF90IHR5cGUpOworCit2b2lkIHdtYV9hZGRfYnNzKHRwX3dtYV9oYW5kbGUgd21hLCB0cEFkZEJzc1BhcmFtcyBwYXJhbXMpOworCitpbnQgd21pX3VuaWZpZWRfdmRldl91cF9zZW5kKHdtaV91bmlmaWVkX3Qgd21pLAorCQkJCSAgICB1aW50OF90IHZkZXZfaWQsIHVpbnQxNl90IGFpZCwKKwkJCQkgICAgdWludDhfdCBic3NpZFtJRUVFODAyMTFfQUREUl9MRU5dKTsKKwordm9pZCB3bWFfYWRkX3N0YSh0cF93bWFfaGFuZGxlIHdtYSwgdHBBZGRTdGFQYXJhbXMgYWRkX3N0YSk7CisKK3ZvaWQgd21hX2RlbGV0ZV9zdGEodHBfd21hX2hhbmRsZSB3bWEsIHRwRGVsZXRlU3RhUGFyYW1zIGRlbF9zdGEpOworCitpbnQzMl90IHdtaV91bmlmaWVkX3ZkZXZfc3RvcF9zZW5kKHdtaV91bmlmaWVkX3Qgd21pLCB1aW50OF90IHZkZXZfaWQpOworCit2b2lkIHdtYV9kZWxldGVfYnNzKHRwX3dtYV9oYW5kbGUgd21hLCB0cERlbGV0ZUJzc1BhcmFtcyBwYXJhbXMpOworCitpbnQzMl90IHdtYV9maW5kX3ZkZXZfYnlfdHlwZSh0cF93bWFfaGFuZGxlIHdtYSwgaW50MzJfdCB0eXBlKTsKKwordm9pZCB3bWFfc2V0X3ZkZXZfaW50cmFic3NfZndkKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICAgICB0cERpc2FibGVJbnRyYUJzc0Z3ZCBwZGlzX2ludHJhX2Z3ZCk7CisKKy8qCisgKiB3bWFfbWdtdC5jIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKKyAqLworCitpbnQgd21hX2JlYWNvbl9zd2JhX2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwgdWludDMyX3QgbGVuKTsKKworaW50IHdtYV9wZWVyX3N0YV9raWNrb3V0X2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1OCAqZXZlbnQsIHUzMiBsZW4pOworCit2b2lkIHdtYV9leHRzY2FuX3dvd19ldmVudF9jYWxsYmFjayh2b2lkICpoYW5kbGUsIHZvaWQgKmV2ZW50LCB1aW50MzJfdCBsZW4pOworCitpbnQgd21hX3VuaWZpZWRfYmNudHhfc3RhdHVzX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkgICB1aW50OF90ICpjbWRfcGFyYW1faW5mbywKKwkJCQkJICAgdWludDMyX3QgbGVuKTsKKworCit2b2lkIHdtYV9zZXRfc3RhX2tlZXBfYWxpdmUodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCwKKwkJCQkgICB1aW50MzJfdCBtZXRob2QsIHVpbnQzMl90IHRpbWVwZXJpb2QsCisJCQkJICAgdWludDhfdCAqaG9zdHY0YWRkciwgdWludDhfdCAqZGVzdHY0YWRkciwKKwkJCQkgICB1aW50OF90ICpkZXN0bWFjKTsKKworaW50IHdtYV92ZGV2X2luc3RhbGxfa2V5X2NvbXBsZXRlX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkJdWludDhfdCAqZXZlbnQsCisJCQkJCQl1aW50MzJfdCBsZW4pOworCitpbnQzMl90IHdtaV91bmlmaWVkX3NlbmRfcGVlcl9hc3NvYyh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJICAgdFNpck53VHlwZSBud190eXBlLAorCQkJCQkgICB0cEFkZFN0YVBhcmFtcyBwYXJhbXMpOworCitpbnQgd21pX3VuaWZpZWRfdmRldl9zZXRfZ3R4X2NmZ19zZW5kKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwgdWludDMyX3QgaWZfaWQsCisJCQkJICBndHhfY29uZmlnX3QgKmd0eF9pbmZvKTsKKwordm9pZCB3bWFfdXBkYXRlX3Byb3RlY3Rpb25fbW9kZSh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkLAorCQkJICAgdWludDhfdCBsbGJjb2V4aXN0KTsKKwordm9pZCB3bWFfcHJvY2Vzc191cGRhdGVfYmVhY29uX3BhcmFtcyh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgdFVwZGF0ZUJlYWNvblBhcmFtcyAqYmNuX3BhcmFtcyk7CisKK3ZvaWQgd21hX3VwZGF0ZV9jZmdfcGFyYW1zKHRwX3dtYV9oYW5kbGUgd21hLCB0U2lyTXNnUSAqY2ZnUGFyYW0pOworCit2b2lkIHdtYV9zZXRfYnNza2V5KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgdHBTZXRCc3NLZXlQYXJhbXMga2V5X2luZm8pOworCit2b2lkIHdtYV9hZGp1c3RfaWJzc19oZWFydF9iZWF0X3RpbWVyKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCSAgICAgIHVpbnQ4X3QgdmRldl9pZCwKKwkJCQkgICAgICBpbnQ4X3QgcGVlcl9udW1fZGVsdGEpOworCit2b2lkIHdtYV9zZXRfc3Rha2V5KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgdHBTZXRTdGFLZXlQYXJhbXMga2V5X2luZm8pOworCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX3VwZGF0ZV9lZGNhX3BhcmFtX3JlcShXTUFfSEFORExFIGhhbmRsZSwKKwkJCQkJCSAgICB0RWRjYVBhcmFtcyAqZWRjYV9wYXJhbXMpOworCitpbnQgd21hX3RidHRvZmZzZXRfdXBkYXRlX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwKKwkJCQkJICAgICAgIHVpbnQzMl90IGxlbik7CisKK3ZvaWQgd21hX3NlbmRfcHJvYmVfcnNwX3RtcGwodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJICAgIHRwU2VuZFByb2JlUmVzcFBhcmFtcyBwcm9iZV9yc3BfaW5mbyk7CisKK3ZvaWQgd21hX3NlbmRfYmVhY29uKHRwX3dtYV9oYW5kbGUgd21hLCB0cFNlbmRiZWFjb25QYXJhbXMgYmNuX2luZm8pOworCit2b2lkIHdtYV9zZXRfa2VlcGFsaXZlX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgIHRTaXJLZWVwQWxpdmVSZXEgKmtlZXBhbGl2ZSk7CisKK3ZvaWQgd21hX2JlYWNvbl9taXNzX2hhbmRsZXIodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQzMl90IHZkZXZfaWQpOworCit2b2lkIHdtYV9wcm9jZXNzX3VwZGF0ZV9vcG1vZGUodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICAgIHRVcGRhdGVWSFRPcE1vZGUgKnVwZGF0ZV92aHRfb3Btb2RlKTsKKwordm9pZCB3bWFfcHJvY2Vzc191cGRhdGVfcnhfbnNzKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICAgICB0VXBkYXRlUnhOc3MgKnVwZGF0ZV9yeF9uc3MpOworCit2b2lkIHdtYV9wcm9jZXNzX3VwZGF0ZV9tZW1iZXJzaGlwKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJICB0VXBkYXRlTWVtYmVyc2hpcCAqbWVtYmVyc2hpcCk7CisKK3ZvaWQgd21hX3Byb2Nlc3NfdXBkYXRlX3VzZXJwb3ModHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICAgICB0VXBkYXRlVXNlclBvcyAqdXNlcnBvcyk7CisKK3ZvaWQgd21hX2hpZGRlbl9zc2lkX3ZkZXZfcmVzdGFydCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICB0SGFsSGlkZGVuU3NpZFZkZXZSZXN0YXJ0ICpwUmVxKTsKKworLyoKKyAqIHdtYV9wb3dlci5jIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKKyAqLworCit2b2lkIHdtYV9lbmFibGVfc3RhX3BzX21vZGUodHBfd21hX2hhbmRsZSB3bWEsIHRwRW5hYmxlUHNQYXJhbXMgcHNfcmVxKTsKKworaW50MzJfdCB3bWlfdW5pZmllZF9zZXRfc3RhX3BzX3BhcmFtKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCQkJICAgIHVpbnQzMl90IHZkZXZfaWQsIHVpbnQzMl90IHBhcmFtLAorCQkJCQkgICAgdWludDMyX3QgdmFsdWUpOworCitDREZfU1RBVFVTCit3bWFfc2V0X2lic3NfcHdyc2F2ZV9wYXJhbXModHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCk7CisKK2ludDMyX3Qgd21hX3NldF9hcF9wZWVyX3VhcHNkKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50MzJfdCB2ZGV2X2lkLAorCQkJCSAgICAgdWludDhfdCAqcGVlcl9hZGRyLCB1aW50OF90IHVhcHNkX3ZhbHVlLAorCQkJCSAgICAgdWludDhfdCBtYXhfc3ApOworCit2b2lkIHdtYV91cGRhdGVfZWRjYV9wYXJhbXNfZm9yX2FjKHRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgKmVkY2FfcGFyYW0sCisJCQkJCSAgd21pX3dtbV92cGFyYW1zICp3bW1fcGFyYW0sIGludCBhYyk7CisKK3ZvaWQgd21hX3NldF90eF9wb3dlcihXTUFfSEFORExFIGhhbmRsZSwKKwkJCSAgICAgdE1heFR4UG93ZXJQYXJhbXMgKnR4X3B3cl9wYXJhbXMpOworCit2b2lkIHdtYV9zZXRfbWF4X3R4X3Bvd2VyKFdNQV9IQU5ETEUgaGFuZGxlLAorCQkJCSB0TWF4VHhQb3dlclBhcmFtcyAqdHhfcHdyX3BhcmFtcyk7CisKK2ludDMyX3Qgd21pX3VuaWZpZWRfc2V0X3N0YV9wcyh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsCisJCQkJICAgICAgdWludDMyX3QgdmRldl9pZCwgdWludDhfdCB2YWwpOworCit2b2lkIHdtYV9kaXNhYmxlX3N0YV9wc19tb2RlKHRwX3dtYV9oYW5kbGUgd21hLCB0cERpc2FibGVQc1BhcmFtcyBwc19yZXEpOworCit2b2lkIHdtYV9lbmFibGVfdWFwc2RfbW9kZSh0cF93bWFfaGFuZGxlIHdtYSwgdHBFbmFibGVVYXBzZFBhcmFtcyBwc19yZXEpOworCit2b2lkIHdtYV9kaXNhYmxlX3VhcHNkX21vZGUodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJICAgdHBEaXNhYmxlVWFwc2RQYXJhbXMgcHNfcmVxKTsKKworQ0RGX1NUQVRVUyB3bWFfZ2V0X3RlbXBlcmF0dXJlKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSk7CisKK2ludCB3bWFfcGRldl90ZW1wZXJhdHVyZV9ldnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50LAorCQkJCQkgICAgdWludDMyX3QgbGVuKTsKKworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc190eF9wb3dlcl9saW1pdHMoV01BX0hBTkRMRSBoYW5kbGUsCisJCQkJICAgICAgIHRTaXJUeFBvd2VyTGltaXQgKnB0eGxpbSk7CisKK3ZvaWQgd21hX3VwZGF0ZV9ub2Eoc3RydWN0IGJlYWNvbl9pbmZvICpiZWFjb24sCisJCQkgICBzdHJ1Y3QgcDJwX3N1Yl9lbGVtZW50X25vYSAqbm9hX2llKTsKKwordm9pZCB3bWFfdXBkYXRlX3Byb2JlX3Jlc3Bfbm9hKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICAgICBzdHJ1Y3QgcDJwX3N1Yl9lbGVtZW50X25vYSAqbm9hX2llKTsKKworaW50IHdtYV9wMnBfbm9hX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwKKwkJCQkgICAgIHVpbnQzMl90IGxlbik7CisKK3ZvaWQgd21hX3Byb2Nlc3Nfc2V0X3AycGdvX25vYV9yZXEodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCSAgdFAycFBzUGFyYW1zICpwc19wYXJhbXMpOworCit2b2lkIHdtYV9wcm9jZXNzX3NldF9taW1vcHNfcmVxKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICAgICAgdFNldE1JTU9QUyAqbWltb3BzKTsKKworQ0RGX1NUQVRVUyB3bWFfc2V0X21pbW9wcyh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkLCBpbnQgdmFsdWUpOworCitDREZfU1RBVFVTIHdtYV9ub3RpZnlfbW9kZW1fcG93ZXJfc3RhdGUodm9pZCAqd21hX3B0ciwKKwkJCQkJdFNpck1vZGVtUG93ZXJTdGF0ZUluZCAqcFJlcSk7CisKK0NERl9TVEFUVVMgd21hX3NldF9zbXBzX3BhcmFtcyh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkLAorCQkJCSAgICAgIGludCB2YWx1ZSk7CisKK3ZvaWQgd21hX3NldF9zdXNwZW5kX2R0aW0odHBfd21hX2hhbmRsZSB3bWEpOworCit2b2lkIHdtYV9zZXRfcmVzdW1lX2R0aW0odHBfd21hX2hhbmRsZSB3bWEpOworCisvKgorICogd21hX2RhdGEuYyBmdW5jdGlvbnMgZGVjbGFyYXRpb25zCisgKi8KKworCit2b2lkIHdtYV9zZXRfYnNzX3JhdGVfZmxhZ3Moc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlLAorCQkJCSAgIHRwQWRkQnNzUGFyYW1zIGFkZF9ic3MpOworCitpbnQzMl90IHdtaV91bmlmaWVkX3NlbmRfdHhiZih0cF93bWFfaGFuZGxlIHdtYSwgdHBBZGRTdGFQYXJhbXMgcGFyYW1zKTsKKwordm9pZCB3bWFfdXBkYXRlX3R4cnhfY2hhaW5tYXNrKGludCBudW1fcmZfY2hhaW5zLCBpbnQgKmNtZF92YWx1ZSk7CisKK2ludCB3bWFfcGVlcl9zdGF0ZV9jaGFuZ2VfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsCisJCQkJCSAgICAgICB1aW50OF90ICpldmVudF9idWZmLAorCQkJCQkgICAgICAgdWludDMyX3QgbGVuKTsKKworQ0RGX1NUQVRVUyB3bWFfc2V0X2VuYWJsZV9kaXNhYmxlX21jY19hZGFwdGl2ZV9zY2hlZHVsZXIodWludDMyX3QKKwkJCQkJCW1jY19hZGFwdGl2ZV9zY2hlZHVsZXIpOworCitDREZfU1RBVFVTIHdtYV9zZXRfbWNjX2NoYW5uZWxfdGltZV9sYXRlbmN5CisJKHRwX3dtYV9oYW5kbGUgd21hLAorCXVpbnQzMl90IG1jY19jaGFubmVsLCB1aW50MzJfdCBtY2NfY2hhbm5lbF90aW1lX2xhdGVuY3kpOworCitDREZfU1RBVFVTIHdtYV9zZXRfbWNjX2NoYW5uZWxfdGltZV9xdW90YQorCSh0cF93bWFfaGFuZGxlIHdtYSwKKwl1aW50MzJfdCBhZGFwdGVyXzFfY2hhbl9udW1iZXIsCisJdWludDMyX3QgYWRhcHRlcl8xX3F1b3RhLCB1aW50MzJfdCBhZGFwdGVyXzJfY2hhbl9udW1iZXIpOworCit2b2lkIHdtYV9zZXRfbGlua3N0YXRlKHRwX3dtYV9oYW5kbGUgd21hLCB0cExpbmtTdGF0ZVBhcmFtcyBwYXJhbXMpOworCit2b2lkIHdtYV91bnBhdXNlX3ZkZXYodHBfd21hX2hhbmRsZSB3bWEpOworCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX3JhdGVfdXBkYXRlX2luZGljYXRlKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkgICAgdFNpclJhdGVVcGRhdGVJbmQgKgorCQkJCQkgICAgcFJhdGVVcGRhdGVQYXJhbXMpOworCitDREZfU1RBVFVTIHdtYV90eF9hdHRhY2godHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKTsKKworQ0RGX1NUQVRVUyB3bWFfdHhfZGV0YWNoKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSk7CisKKyNpZiBkZWZpbmVkKFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MKSB8fCBkZWZpbmVkKFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIpCitpbnQgd21hX21jY192ZGV2X3R4X3BhdXNlX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsCisJCQkJCSAgICAgdWludDMyX3QgbGVuKTsKKyNlbmRpZgorCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX2luaXRfdGhlcm1hbF9pbmZvKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkgdF90aGVybWFsX21nbXQgKnBUaGVybWFsUGFyYW1zKTsKKworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19zZXRfdGhlcm1hbF9sZXZlbCh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJIHVpbnQ4X3QgdGhlcm1hbF9sZXZlbCk7CisKK0NERl9TVEFUVVMgd21hX3NldF90aGVybWFsX21nbXQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICAgICB0X3RoZXJtYWxfY21kX3BhcmFtcyB0aGVybWFsX2luZm8pOworCitpbnQgd21hX3RoZXJtYWxfbWdtdF9ldnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50LAorCQkJCQl1aW50MzJfdCBsZW4pOworCisvKgorICogd21hX3V0aWxzLmMgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucworICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUCitpbnQgd21hX3N0YXRzX2V4dF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnRfYnVmLAorCQkJCSAgICAgICB1aW50MzJfdCBsZW4pOworI2VuZGlmCisKK3RTbXBzTW9kZVZhbHVlIGhvc3RfbWFwX3NtcHNfbW9kZShBX1VJTlQzMiBmd19zbXBzX21vZGUpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKK3ZvaWQgd21hX3JlZ2lzdGVyX2xsX3N0YXRzX2V2ZW50X2hhbmRsZXIodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKTsKKworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19sbF9zdGF0c19jbGVhcl9yZXEKKwkodHBfd21hX2hhbmRsZSB3bWEsIGNvbnN0IHRwU2lyTExTdGF0c0NsZWFyUmVxIGNsZWFyUmVxKTsKKworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19sbF9zdGF0c19zZXRfcmVxCisJKHRwX3dtYV9oYW5kbGUgd21hLCBjb25zdCB0cFNpckxMU3RhdHNTZXRSZXEgc2V0UmVxKTsKKworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19sbF9zdGF0c19nZXRfcmVxCisJKHRwX3dtYV9oYW5kbGUgd21hLCBjb25zdCB0cFNpckxMU3RhdHNHZXRSZXEgZ2V0UmVxKSA7CisKK2ludCB3bWFfdW5pZmllZF9saW5rX2lmYWNlX3N0YXRzX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkgICAgICAgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJCSAgICAgICB1aW50MzJfdCBsZW4pOworI2VuZGlmCisKK3ZvaWQgd21hX3Bvc3RfbGlua19zdGF0dXModEFuaUdldExpbmtTdGF0dXMgKnBHZXRMaW5rU3RhdHVzLAorCQkJICB1aW50OF90IGxpbmtfc3RhdHVzKTsKKworaW50IHdtYV9saW5rX3N0YXR1c19ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJICB1aW50MzJfdCBsZW4pOworCitpbnQgd21hX3N0YXRzX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpjbWRfcGFyYW1faW5mbywKKwkJCSAgICB1aW50MzJfdCBsZW4pOworCitDREZfU1RBVFVTIHdtYV9zZW5kX2xpbmtfc3BlZWQodWludDMyX3QgbGlua19zcGVlZCk7CisKK2ludCB3bWFfbGlua19zcGVlZF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJIHVpbnQzMl90IGxlbik7CisKK0NERl9TVEFUVVMgd21hX3duaV9jZmdfZG5sZCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpOworCitpbnQgd21hX3VuaWZpZWRfZGVidWdfcHJpbnRfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmRhdGFwLAorCQkJCQkgIHVpbnQzMl90IGxlbik7CisKK2Jvb2wgd21hX2lzX3NhcF9hY3RpdmUodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKTsKKworYm9vbCB3bWFfaXNfcDJwX2dvX2FjdGl2ZSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpOworCitib29sIHdtYV9pc19wMnBfY2xpX2FjdGl2ZSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpOworCitib29sIHdtYV9pc19zdGFfYWN0aXZlKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSk7CisKK1dMQU5fUEhZX01PREUgd21hX3BlZXJfcGh5bW9kZSh0U2lyTndUeXBlIG53X3R5cGUsIHVpbnQ4X3Qgc3RhX3R5cGUsCisJCQkgICAgICAgdWludDhfdCBpc19odCwgdWludDhfdCBjaF93aWR0aCwKKwkJCSAgICAgICB1aW50OF90IGlzX3ZodCk7CisKK2ludDMyX3Qgd21hX3R4cnhfZndfc3RhdHNfcmVzZXQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCXVpbnQ4X3QgdmRldl9pZCwgdWludDMyX3QgdmFsdWUpOworCitpbnQzMl90IHdtYV9zZXRfdHhyeF9md19zdGF0c19sZXZlbCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICAgIHVpbnQ4X3QgdmRldl9pZCwgdWludDMyX3QgdmFsdWUpOworCitpbnQgd21pX2NyYXNoX2luamVjdCh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIHVpbnQzMl90IHR5cGUsCisJCSAgICAgdWludDMyX3QgZGVsYXlfdGltZV9tcyk7CisKK3ZvaWQgd21hX2dldF9zdGF0c19yZXEoV01BX0hBTkRMRSBoYW5kbGUsCisJCSAgICAgICB0QW5pR2V0UEVTdGF0c1JlcSAqZ2V0X3N0YXRzX3BhcmFtKTsKKworI2lmIGRlZmluZWQoUUNBX1dJRklfRlRNKQordm9pZCB3bWFfdXRmX2RldGFjaCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpOworCit2b2lkIHdtYV91dGZfYXR0YWNoKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSk7CisKK0NERl9TVEFUVVMKK3dtYV9wcm9jZXNzX2Z0bV9jb21tYW5kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCXN0cnVjdCBhcjZrX3Rlc3Rtb2RlX2NtZF9kYXRhICptc2dfYnVmZmVyKTsKKyNlbmRpZgorCisvKgorICogd21hX2ZlYXR1cmVzLmMgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucworICovCisKK3ZvaWQgd21hX3Byb2Nlc3NfbGlua19zdGF0dXNfcmVxKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCSB0QW5pR2V0TGlua1N0YXR1cyAqcEdldExpbmtTdGF0dXMpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xQSEIKK0NERl9TVEFUVVMgd21hX3Byb2Nlc3NfbHBoYl9jb25mX3JlcSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICAgICB0U2lyTFBIQlJlcSAqbHBoYl9jb25mX3JlcSk7CisKKyNlbmRpZgorCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX2RoY3BfaW5kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQl0QW5pREhDUEluZCAqdGFfZGhjcF9pbmQpOworCitXTEFOX1BIWV9NT0RFIHdtYV9jaGFuX3RvX21vZGUodTggY2hhbiwgcGh5X2NoX3dpZHRoIGNoYW5fd2lkdGgsCisJCQkJICAgICAgdTggdmh0X2NhcGFibGUsIHU4IGRvdDExX21vZGUpOworCitDREZfU1RBVFVTIHdtYV9nZXRfbGlua19zcGVlZChXTUFfSEFORExFIGhhbmRsZSwgdFNpckxpbmtTcGVlZEluZm8gKnBMaW5rU3BlZWQpOworCisjaWZkZWYgRkVBVFVSRV9HUkVFTl9BUAoraW50MzJfdCB3bWlfdW5pZmllZF9wZGV2X2dyZWVuX2FwX3BzX2VuYWJsZV9jbWQod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLAorCQkJCQkJdWludDMyX3QgdmFsdWUpOworI2VuZGlmCisKK3ZvaWQgd21hX3dvd190eF9jb21wbGV0ZSh2b2lkICp3bWEpOworCitpbnQgd21pX3VuaWZpZWRfbmF0X2tlZXBhbGl2ZV9lbmFibGUodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCk7CisKK2ludCB3bWlfdW5pZmllZF9jc2Ffb2ZmbG9hZF9lbmFibGUodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkFOCitpbnQgd21hX25hbl9yc3BfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50X2J1ZiwgdWludDMyX3QgbGVuKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKK2ludCB3bWFfdGRsc19ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsIHVpbnQzMl90IGxlbik7CisjZW5kaWYKKworaW50IHdtYV9jc2Ffb2ZmbG9hZF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsIHVpbnQzMl90IGxlbik7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKK2ludCB3bWFfZ3RrX29mZmxvYWRfc3RhdHVzX2V2ZW50KHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsIHVpbnQzMl90IGxlbik7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAoraW50IHdtYV9vZW1fY2FwYWJpbGl0eV9ldmVudF9jYWxsYmFjayh2b2lkICpoYW5kbGUsCisJCQkJICAgICAgdWludDhfdCAqZGF0YXAsIHVpbnQzMl90IGxlbik7CisKK2ludCB3bWFfb2VtX21lYXN1cmVtZW50X3JlcG9ydF9ldmVudF9jYWxsYmFjayh2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmRhdGFwLAorCQkJCQkgICAgICB1aW50MzJfdCBsZW4pOworCitpbnQgd21hX29lbV9lcnJvcl9yZXBvcnRfZXZlbnRfY2FsbGJhY2sodm9pZCAqaGFuZGxlLCB1aW50OF90ICpkYXRhcCwKKwkJCQkJdWludDMyX3QgbGVuKTsKKyNlbmRpZgorCit2b2lkIHdtYV9yZWdpc3Rlcl9kZnNfZXZlbnRfaGFuZGxlcih0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpOworCitpbnQKK3dtYV91bmlmaWVkX2Rmc19waHllcnJfZmlsdGVyX29mZmxvYWRfZW5hYmxlKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSk7CisKKyNpZiAhZGVmaW5lZChSRU1PVkVfUEtUX0xPRykKK0NERl9TVEFUVVMgd21hX3BrdGxvZ193bWlfc2VuZF9jbWQoV01BX0hBTkRMRSBoYW5kbGUsCisJCQkJICAgc3RydWN0IGF0aF9wa3Rsb2dfd21pX3BhcmFtcyAqcGFyYW1zKTsKKyNlbmRpZgorCitpbnQgd21hX3dvd193YWtldXBfaG9zdF9ldmVudCh2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50LAorCQkJCSAgICAgdWludDMyX3QgbGVuKTsKK2ludCB3bWFfcGRldl9yZXN1bWVfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50LCB1aW50MzJfdCBsZW4pOworCisvKioKKyAqIHdtYV9nZXRfd293X2J1c19zdXNwZW5kKCkgLSBjaGVjayBpcyB3b3cgYnVzIHN1c3BlbmRlZCBvciBub3QKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IHRydWUvZmFsc2UKKyAqLworc3RhdGljIGlubGluZSBpbnQgd21hX2dldF93b3dfYnVzX3N1c3BlbmQodHBfd21hX2hhbmRsZSB3bWEpCit7CisKKwlyZXR1cm4gY2RmX2F0b21pY19yZWFkKCZ3bWEtPmlzX3dvd19idXNfc3VzcGVuZGVkKTsKK30KKworQ0RGX1NUQVRVUyB3bWFfcmVzdW1lX3JlcSh0cF93bWFfaGFuZGxlIHdtYSk7CisKK0NERl9TVEFUVVMgd21hX3dvd19hZGRfcGF0dGVybih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCXN0cnVjdCB3b3dfYWRkX3BhdHRlcm4gKnB0cm4pOworCitDREZfU1RBVFVTIHdtYV93b3dfZGVsZXRlX3VzZXJfcGF0dGVybih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCXN0cnVjdCB3b3dfZGVsZXRlX3BhdHRlcm4gKnBhdHRlcm4pOworCitDREZfU1RBVFVTIHdtYV93b3dfZW50ZXIodHBfd21hX2hhbmRsZSB3bWEsIHRwU2lySGFsV293bEVudGVyUGFyYW1zIGluZm8pOworCitDREZfU1RBVFVTIHdtYV93b3dfZXhpdCh0cF93bWFfaGFuZGxlIHdtYSwgdHBTaXJIYWxXb3dsRXhpdFBhcmFtcyBpbmZvKTsKKworQ0RGX1NUQVRVUyB3bWFfc3VzcGVuZF9yZXEodHBfd21hX2hhbmRsZSB3bWEsIHRwU2lyV2xhblN1c3BlbmRQYXJhbSBpbmZvKTsKKwordm9pZCB3bWFfZGVsX3RzX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwgdERlbFRzUGFyYW1zICptc2cpOworCit2b2lkIHdtYV9hZ2dyX3Fvc19yZXEodHBfd21hX2hhbmRsZSB3bWEsCisJCQkgICAgIHRBZ2dyQWRkVHNQYXJhbXMgKnBBZ2dyUW9zUnNwTXNnKTsKKwordm9pZCB3bWFfYWRkX3RzX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwgdEFkZFRzUGFyYW1zICptc2cpOworCitpbnQgd21hX3Byb2Nlc3NfcmVjZWl2ZV9maWx0ZXJfc2V0X2ZpbHRlcl9yZXEodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkJICAgICB0U2lyUmN2UGt0RmlsdGVyQ2ZnVHlwZSAqCisJCQkJCQkgICAgIHJjdl9maWx0ZXJfcGFyYW0pOworCitpbnQgd21hX3Byb2Nlc3NfcmVjZWl2ZV9maWx0ZXJfY2xlYXJfZmlsdGVyX3JlcSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJCQkgICAgICAgdFNpclJjdkZsdFBrdENsZWFyUGFyYW0gKgorCQkJCQkJICAgICAgIHJjdl9jbGVhcl9wYXJhbSk7CisKKyNpZmRlZiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQKK3ZvaWQgd21hX3N0YXJ0X29lbV9kYXRhX3JlcSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICAgdFN0YXJ0T2VtRGF0YVJlcSAqc3RhcnRPZW1EYXRhUmVxKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc190c21fc3RhdHNfcmVxKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZXIsCisJCQkJICAgICB2b2lkICpwVHNtU3RhdHNNc2cpOworI2VuZGlmCisKK0NERl9TVEFUVVMgd21hX3Byb2Nlc3NfbWNiY19zZXRfZmlsdGVyX3JlcSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJCSAgIHRTaXJSY3ZGbHRNY0FkZHJMaXN0ICptY2JjX3BhcmFtKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKK0NERl9TVEFUVVMgd21hX3Byb2Nlc3NfZ3RrX29mZmxvYWRfcmVxKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkgICAgICB0cFNpckd0a09mZmxvYWRQYXJhbXMgcGFyYW1zKTsKKworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19ndGtfb2ZmbG9hZF9nZXRpbmZvX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJICAgICAgIHRwU2lyR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXMKKwkJCQkJICAgICAgIHBhcmFtcyk7CisjZW5kaWYKKworQ0RGX1NUQVRVUyB3bWFfZW5hYmxlX2FycF9uc19vZmZsb2FkKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCSAgICAgdHBTaXJIb3N0T2ZmbG9hZFJlcSBwSG9zdE9mZmxvYWRQYXJhbXMsCisJCQkJICAgICBib29sIGJBcnBPbmx5KTsKKworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19hZGRfcGVyaW9kaWNfdHhfcHRybl9pbmQoV01BX0hBTkRMRSBoYW5kbGUsCisJCQkJCQl0U2lyQWRkUGVyaW9kaWNUeFB0cm4gKgorCQkJCQkJcEFkZFBlcmlvZGljVHhQdHJuUGFyYW1zKTsKKworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19kZWxfcGVyaW9kaWNfdHhfcHRybl9pbmQoV01BX0hBTkRMRSBoYW5kbGUsCisJCQkJCQl0U2lyRGVsUGVyaW9kaWNUeFB0cm4gKgorCQkJCQkJcERlbFBlcmlvZGljVHhQdHJuUGFyYW1zKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9TVEFUU19FWFQKK0NERl9TVEFUVVMgd21hX3N0YXRzX2V4dF9yZXEodm9pZCAqd21hX3B0ciwgdHBTdGF0c0V4dFJlcXVlc3QgcHJlcSk7CisjZW5kaWYKKworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19pYnNzX3JvdXRlX3RhYmxlX3VwZGF0ZV9pbmQodm9pZCAqd21hX2hhbmRsZSwKKwkJCQkJCSAgIHRBbmlJYnNzUm91dGVUYWJsZSAqcERhdGEpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCitpbnQgd21hX2VuYWJsZV9leHRfd293KHRwX3dtYV9oYW5kbGUgd21hLCB0cFNpckV4dFdvV1BhcmFtcyBwYXJhbXMpOworCitpbnQgd21hX3NldF9hcHBfdHlwZTFfcGFyYW1zX2luX2Z3KHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCSAgIHRwU2lyQXBwVHlwZTFQYXJhbXMgYXBwVHlwZTFQYXJhbXMpOworCitpbnQgd21hX3NldF9hcHBfdHlwZTJfcGFyYW1zX2luX2Z3KHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCSAgIHRwU2lyQXBwVHlwZTJQYXJhbXMgYXBwVHlwZTJQYXJhbXMpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgoraW50IHdtYV9hdXRvX3NodXRkb3duX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwKKwkJCQkgICAgdWludDMyX3QgbGVuKTsKKworQ0RGX1NUQVRVUyB3bWFfc2V0X2F1dG9fc2h1dGRvd25fdGltZXJfcmVxKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJICAgdFNpckF1dG9TaHV0ZG93bkNtZFBhcmFtcyAqCisJCQkJCSAgIGF1dG9fc2hfY21kKTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorCitDREZfU1RBVFVTIHdtYV9uYW5fcmVxKHZvaWQgKndtYV9wdHIsIHRwTmFuUmVxdWVzdCBuYW5fcmVxKTsKKyNlbmRpZgorCisjaWZkZWYgREhDUF9TRVJWRVJfT0ZGTE9BRAoraW50IHdtYV9wcm9jZXNzX2RoY3BzZXJ2ZXJfb2ZmbG9hZCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICAgdFNpckRoY3BTcnZPZmZsb2FkSW5mbyAqCisJCQkJICAgcERoY3BTcnZPZmZsb2FkSW5mbyk7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9HUElPX0xFRF9GTEFTSElORworQ0RGX1NUQVRVUyB3bWFfc2V0X2xlZF9mbGFzaGluZyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJdFNpckxlZEZsYXNoaW5nUmVxICpmbGFzaGluZyk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DSF9BVk9JRAoraW50IHdtYV9jaGFubmVsX2F2b2lkX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsCisJCQkJCSB1aW50MzJfdCBsZW4pOworCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX2NoX2F2b2lkX3VwZGF0ZV9yZXEodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgICB0U2lyQ2hBdm9pZFVwZGF0ZVJlcSAqCisJCQkJCSAgIGNoX2F2b2lkX3VwZGF0ZV9yZXEpOworI2VuZGlmCisKK2ludCB3bWFfc3VzcGVuZF90YXJnZXQoV01BX0hBTkRMRSBoYW5kbGUsIGludCBkaXNhYmxlX3RhcmdldF9pbnRyKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisKK2ludCB3bWFfdXBkYXRlX2Z3X3RkbHNfc3RhdGUoV01BX0hBTkRMRSBoYW5kbGUsIHZvaWQgKnB3bWFUZGxzcGFyYW1zKTsKK2ludCB3bWFfdXBkYXRlX3RkbHNfcGVlcl9zdGF0ZShXTUFfSEFORExFIGhhbmRsZSwKKwkJCSAgICAgICB0VGRsc1BlZXJTdGF0ZVBhcmFtcyAqcGVlclN0YXRlUGFyYW1zKTsKKy8qKgorICogd21hX3NldF90ZGxzX29mZmNoYW5fbW9kZSgpIC0gc2V0IHRkbHMgb2ZmIGNoYW5uZWwgbW9kZQorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGNoYW5fc3dpdGNoX3BhcmFtczogUG9pbnRlciB0byB0ZGxzIGNoYW5uZWwgc3dpdGNoIHBhcmFtZXRlciBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGRscyBvZmYgY2hhbm5lbCBtb2RlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitpbnQgd21hX3NldF90ZGxzX29mZmNoYW5fbW9kZShXTUFfSEFORExFIHdtYV9oYW5kbGUsCisJCQkgICAgICB0ZGxzX2NoYW5fc3dpdGNoX3BhcmFtcyAqY2hhbl9zd2l0Y2hfcGFyYW1zKTsKKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExY29tICp3bWFfZGZzX2F0dGFjaChzdHJ1Y3QgaWVlZTgwMjExY29tICpkZnNfaWMpOworCit2b2lkIHdtYV9kZnNfZGV0YWNoKHN0cnVjdCBpZWVlODAyMTFjb20gKmRmc19pYyk7CisKK3ZvaWQgd21hX2Rmc19jb25maWd1cmUoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpOworCitzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKndtYV9kZnNfY29uZmlndXJlX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMWNvbSAqZGZzX2ljLAorCQkJCQkJICAgIHdtaV9jaGFubmVsICpjaGFuLAorCQkJCQkJICAgIFdMQU5fUEhZX01PREUgY2hhbm1vZGUsCisJCQkJCQkgICAgc3RydWN0IHdtYV92ZGV2X3N0YXJ0X3JlcQorCQkJCQkJICAgICpyZXEpOwordm9pZCB3bWFfc2V0X3NhcF9rZWVwYWxpdmUodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCk7CisKKyNpZmRlZiBSRU1PVkVfUEtUX0xPRworc3RhdGljIGlubGluZSB2b2lkIHdtYV9zZXRfd2lmaV9zdGFydF9wYWNrZXRfc3RhdHModm9pZCAqd21hX2hhbmRsZSwKKwkJc3RydWN0IHNpcl93aWZpX3N0YXJ0X2xvZyAqc3RhcnRfbG9nKQoreworCXJldHVybjsKK30KKyNlbmRpZgoraW50IHdtYV9yc3NpX2JyZWFjaGVkX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCXVfaW50OF90ICAqY21kX3BhcmFtX2luZm8sIHVfaW50MzJfdCBsZW4pOworI2lmZGVmIFdMQU5fRkVBVFVSRV9NRU1EVU1QCitpbnQgd21hX2Z3X21lbV9kdW1wX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1X2ludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJICB1X2ludDMyX3QgbGVuKTsKK0NERl9TVEFUVVMgd21hX3Byb2Nlc3NfZndfbWVtX2R1bXBfcmVxKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQlzdHJ1Y3QgZndfZHVtcF9yZXEgKm1lbV9kdW1wX3JlcSk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgd21hX2Z3X21lbV9kdW1wX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJdV9pbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLCB1X2ludDMyX3QgbGVuKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIENERl9TVEFUVVMgd21hX3Byb2Nlc3NfZndfbWVtX2R1bXBfcmVxKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkJICAgICB2b2lkICptZW1fZHVtcF9yZXEpCit7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19zZXRfaWVfaW5mbyh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgICBzdHJ1Y3QgdmRldl9pZV9pbmZvICppZV9pbmZvKTsKK2ludCB3bWFfcGVlcl9hc3NvY19jb25mX2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpjbWRfcGFyYW1faW5mbywKKwkJCQl1aW50MzJfdCBsZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvd21hL2luYy93bWFfdGd0X2NmZy5oIGIvY29yZS93bWEvaW5jL3dtYV90Z3RfY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiOTFmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvd21hL2luYy93bWFfdGd0X2NmZy5oCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFdNQV9UR1RfQ0ZHX0gKKyNkZWZpbmUgV01BX1RHVF9DRkdfSAorCisvKioKKyAqIHN0cnVjdCB3bWFfdGd0X3NlcnZpY2VzIC0gdGFyZ2V0IHNlcnZpY2VzCisgKiBAc3RhX3Bvd2VyX3NhdmU6IHN0YSBwb3dlciBzYXZlCisgKiBAdWFwc2Q6IHVhcHNkCisgKiBAYXBfZGZzOiBhcCBkZnMKKyAqIEBlbl8xMWFjOiBlbmFibGUgMTFhYworICogQGFycF9vZmZsb2FkOiBhcnAgb2ZmbG9hZAorICogQGVhcmx5X3J4OiBlYXJseSByeAorICogQHBub19vZmZsb2FkOiBwbm8gb2ZmbG9hZAorICogQGJlYWNvbl9vZmZsb2FkOiBiZWFjb24gb2ZmbG9hZAorICogQGx0ZV9jb2V4X2FudF9zaGFyZTogTFRFIGNvZXggYW50IHNoYXJlCisgKiBAZW5fdGRsczogZW5hYmxlIHRkbHMKKyAqIEBlbl90ZGxzX29mZmNoYW46IGVuYWJsZSB0ZGxzIG9mZmNoYW4KKyAqIEBlbl90ZGxzX3VhcHNkX2J1Zl9zdGE6IGVuYWJsZSBzdGEgdGRscyB1YXBzZCBidWYKKyAqIEBlbl90ZGxzX3VhcHNkX3NsZWVwX3N0YTogZW5hYmxlIHN0YSB0ZGxzIHVhcHNkIHNsZWVwCisgKiBAZW5fcm9hbV9vZmZsb2FkOiBlbmFibGUgcm9hbSBvZmZsb2FkCisgKi8KK3N0cnVjdCB3bWFfdGd0X3NlcnZpY2VzIHsKKwl1aW50MzJfdCBzdGFfcG93ZXJfc2F2ZTsKKwl1aW50MzJfdCB1YXBzZDsKKwl1aW50MzJfdCBhcF9kZnM7CisJdWludDMyX3QgZW5fMTFhYzsKKwl1aW50MzJfdCBhcnBfb2ZmbG9hZDsKKwl1aW50MzJfdCBlYXJseV9yeDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwlib29sIHBub19vZmZsb2FkOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCWJvb2wgYmVhY29uX29mZmxvYWQ7CisJdWludDMyX3QgbHRlX2NvZXhfYW50X3NoYXJlOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJYm9vbCBlbl90ZGxzOworCWJvb2wgZW5fdGRsc19vZmZjaGFuOworCWJvb2wgZW5fdGRsc191YXBzZF9idWZfc3RhOworCWJvb2wgZW5fdGRsc191YXBzZF9zbGVlcF9zdGE7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJYm9vbCBlbl9yb2FtX29mZmxvYWQ7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRCAqLworfTsKKworLyoqCisgKiBzdHJ1Y3Qgd21hX3RndF9odF9jYXAgLSBodCBjYXBhYmFsaXRpeQorICogQG1wZHVfZGVuc2l0eTogbXBkdSBkZW5zaXR5CisgKiBAaHRfcnhfc3RiYzogaHQgcnggc3RiYworICogQGh0X3R4X3N0YmM6IGh0IHR4IHN0YmMKKyAqIEBodF9yeF9sZHBjOiBodCByeCBsZHBjCisgKiBAaHRfc2dpXzIwOiBodCBzZ2kgMjAKKyAqIEBodF9zZ2lfNDA6IGh0IHNnaSA0MAorICogQG51bV9yZl9jaGFpbnM6IG51bSBvZiByZiBjaGFpbnMKKyAqLworc3RydWN0IHdtYV90Z3RfaHRfY2FwIHsKKwl1aW50MzJfdCBtcGR1X2RlbnNpdHk7CisJYm9vbCBodF9yeF9zdGJjOworCWJvb2wgaHRfdHhfc3RiYzsKKwlib29sIGh0X3J4X2xkcGM7CisJYm9vbCBodF9zZ2lfMjA7CisJYm9vbCBodF9zZ2lfNDA7CisJdWludDMyX3QgbnVtX3JmX2NoYWluczsKK307CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworLyoqCisgKiBzdHJ1Y3Qgd21hX3RndF92aHRfY2FwIC0gdmh0IGNhcGFiYWxpdGllcworICogQHZodF9tYXhfbXBkdTogdmh0IG1heCBtcGR1CisgKiBAc3VwcF9jaGFuX3dpZHRoOiBzdXBwb3J0ZWQgY2hhbm5lbCB3aWR0aAorICogQHZodF9yeF9sZHBjOiB2aHQgcnggbGRwYworICogQHZodF9zaG9ydF9naV84MDogdmh0IHNob3J0IGdpIDgwCisgKiBAdmh0X3Nob3J0X2dpXzE2MDogdmh0IHNob3J0IGdpIDE2MAorICogQHZodF90eF9zdGJjOiB2aHQgdHggc3RiYworICogQHZodF9yeF9zdGJjOiB2aHQgcnggc3RiYworICogQHZodF9zdV9iZm9ybWVyOiB2aHQgc3UgYmZvcm1lcgorICogQHZodF9zdV9iZm9ybWVlOiB2aHQgc3UgYmZvcm1lZQorICogQHZodF9tdV9iZm9ybWVyOiB2aHQgbXUgYmZvcm1lcgorICogQHZodF9tdV9iZm9ybWVlOiB2aHQgbXUgYmZvcm1lZQorICogQHZodF9tYXhfYW1wZHVfbGVuX2V4cDogdmh0IG1heCBhbXBkdSBsZW4gZXhwCisgKiBAdmh0X3R4b3BfcHM6IHZodCB0eG9wIHBzCisgKi8KK3N0cnVjdCB3bWFfdGd0X3ZodF9jYXAgeworCXVpbnQzMl90IHZodF9tYXhfbXBkdTsKKwl1aW50MzJfdCBzdXBwX2NoYW5fd2lkdGg7CisJdWludDMyX3Qgdmh0X3J4X2xkcGM7CisJdWludDMyX3Qgdmh0X3Nob3J0X2dpXzgwOworCXVpbnQzMl90IHZodF9zaG9ydF9naV8xNjA7CisJdWludDMyX3Qgdmh0X3R4X3N0YmM7CisJdWludDMyX3Qgdmh0X3J4X3N0YmM7CisJdWludDMyX3Qgdmh0X3N1X2Jmb3JtZXI7CisJdWludDMyX3Qgdmh0X3N1X2Jmb3JtZWU7CisJdWludDMyX3Qgdmh0X211X2Jmb3JtZXI7CisJdWludDMyX3Qgdmh0X211X2Jmb3JtZWU7CisJdWludDMyX3Qgdmh0X21heF9hbXBkdV9sZW5fZXhwOworCXVpbnQzMl90IHZodF90eG9wX3BzOworfTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFBQyAqLworCisvKioKKyAqIHN0cnVjdCB3bWFfZGZzX3JhZGFyX2luZCAtIGRmcyByYWRhciBpbmRpY2F0aW9uCisgKiBAaWVlZV9jaGFuX251bWJlcjogaWVlZSBjaGFubmVsIG51bWJlcgorICogQGNoYW5fZnJlcTogY2hhbm5lbCBmcmVxCisgKiBAZGZzX3JhZGFyX3N0YXR1czogZGZzIHJhZGFyIHN0YXR1cworICovCitzdHJ1Y3Qgd21hX2Rmc19yYWRhcl9pbmQgeworCXVpbnQ4X3QgaWVlZV9jaGFuX251bWJlcjsKKwl1aW50MzJfdCBjaGFuX2ZyZXE7CisJdWludDMyX3QgZGZzX3JhZGFyX3N0YXR1czsKK307CisKKy8qKgorICogc3RydWN0IHdtYV90Z3RfY2ZnIC0gdGFyZ2V0IGNvbmZpZworICogQHRhcmdldF9md192ZXJzaW9uOiB0YXJnZXQgZncgdmVyc2lvbgorICogQGJhbmRfY2FwOiBiYW5kIGNhcGFiaWxpdHkKKyAqIEByZWdfZG9tYWluOiByZWcgZG9tYWluCisgKiBAZWVwcm9tX3JkX2V4dDogZWVwcm9tIHJkIGV4dAorICogQGh3X21hY2FkZHI6IGh3IG1jYXN0IGFkZHIKKyAqIEBzZXJ2aWNlczogc3RydWN0IHdtYV90Z3Rfc2VydmljZXMKKyAqIEBodF9jYXA6IHN0cnVjdCB3bWFfdGd0X2h0X2NhcAorICogQHZodF9jYXA6IHN0cnVjdCB3bWFfdGd0X3ZodF9jYXAKKyAqIEBtYXhfaW50Zl9jb3VudDogbWF4IGludGVyZmFjZSBjb3VudAorICogQGxwc3Nfc3VwcG9ydDogbHBhc3Mgc3VwcG9ydAorICovCitzdHJ1Y3Qgd21hX3RndF9jZmcgeworCXVpbnQzMl90IHRhcmdldF9md192ZXJzaW9uOworCXVpbnQ4X3QgYmFuZF9jYXA7CisJdWludDMyX3QgcmVnX2RvbWFpbjsKKwl1aW50MzJfdCBlZXByb21fcmRfZXh0OworCXN0cnVjdCBjZGZfbWFjX2FkZHIgaHdfbWFjYWRkcjsKKwlzdHJ1Y3Qgd21hX3RndF9zZXJ2aWNlcyBzZXJ2aWNlczsKKwlzdHJ1Y3Qgd21hX3RndF9odF9jYXAgaHRfY2FwOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJc3RydWN0IHdtYV90Z3Rfdmh0X2NhcCB2aHRfY2FwOworI2VuZGlmCisJdWludDhfdCBtYXhfaW50Zl9jb3VudDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTFBTUworCXVpbnQ4X3QgbHBzc19zdXBwb3J0OworI2VuZGlmCisJdWludDhfdCBhcF9hcnBuc19zdXBwb3J0OworfTsKKyNlbmRpZiAvKiBXTUFfVEdUX0NGR19IICovCmRpZmYgLS1naXQgYS9jb3JlL3dtYS9pbmMvd21hX3R5cGVzLmggYi9jb3JlL3dtYS9pbmMvd21hX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwYTE4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvd21hL2luYy93bWFfdHlwZXMuaApAQCAtMCwwICsxLDY3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBXTEFOX1FDVF9XTUFfSAorI2RlZmluZSBXTEFOX1FDVF9XTUFfSAorCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorCisjaW5jbHVkZSAid21hX2FwaS5oIgorI2luY2x1ZGUgIndtYV90Z3RfY2ZnLmgiCisjaW5jbHVkZSAiaV9jZHNfcGFja2V0LmgiCisKKyNkZWZpbmUgSVNfTUNDX1NVUFBPUlRFRCAxCisjZGVmaW5lIElTX0ZFQVRVUkVfU1VQUE9SVEVEX0JZX0ZXKGZlYXRfZW51bV92YWx1ZSkgd21hX2dldF9md193bGFuX2ZlYXRfY2FwcyhmZWF0X2VudW1fdmFsdWUpCisKKyNkZWZpbmUgSVNfUk9BTV9TQ0FOX09GRkxPQURfRkVBVFVSRV9FTkFCTEUgMQorCisjZGVmaW5lIElTX0lCU1NfSEVBUlRCRUFUX09GRkxPQURfRkVBVFVSRV9FTkFCTEUgMQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKyNkZWZpbmUgSVNfQURWQU5DRV9URExTX0VOQUJMRSAwCisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQorI2RlZmluZSBXTUFfTUFYX1NUQSAgICAoNDEpCisjZWxzZQorI2RlZmluZSBXTUFfTUFYX1NUQSAgICAoMTYpCisjZW5kaWYKKworI2RlZmluZSBXTUFfTlZEb3dubG9hZF9TdGFydCh4KSAgICAoeyBDREZfU1RBVFVTX1NVQ0NFU1M7IH0pCisKKyNkZWZpbmUgRFBVX0ZFRURCQUNLX1VOUFJPVEVDVEVEX0VSUk9SIDB4MEYKKworI2RlZmluZSBXTUFfR0VUX1JYX01BQ19IRUFERVIocFJ4TWV0YSkgXAorCSh0cFNpck1hY01nbXRIZHIpKCgodF9wYWNrZXRtZXRhICopcFJ4TWV0YSktPm1wZHVfaGRyX3B0cikKKworI2RlZmluZSBXTUFfR0VUX1JYX01QRFVIRUFERVIzQShwUnhNZXRhKSBcCisJKHRwU2lyTWFjRGF0YUhkcjNhKSgoKHRfcGFja2V0bWV0YSAqKXBSeE1ldGEpLT5tcGR1X2hkcl9wdHIpCisKKyNkZWZpbmUgV01BX0dFVF9SWF9NUERVX0hFQURFUl9MRU4ocFJ4TWV0YSkgXAorCSgoKHRfcGFja2V0bWV0YSAqKXBSeE1ldGEpLT5tcGR1X2hkcl9sZW4pCisKKyNkZWZpbmUgV01BX0dFVF9SWF9NUERVX0xFTihwUnhNZXRhKSBcCisJKCgodF9wYWNrZXRtZXRhICopcFJ4TWV0YSktPm1wZHVfbGVuKQorCisjZGVmaW5lIFdNQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4TWV0YSkJXAorCSgoKHRfcGFja2V0bWV0YSAqKXBSeE1ldGEpLT5tcGR1X2RhdGFfbGVuKQorCisjZGVmaW5lIFdNQV9HRVRfUlhfVFNGX0RFTFRBKHBSeE1ldGEpIFwKKwkoKCh0X3BhY2tldG1ldGEgKilwUnhNZXRhKS0+dHNmX2RlbHRhKQorCisjZGVmaW5lIFdNQV9HRVRfUlhfTUFDX1JBVEVfSURYKHBSeE1ldGEpIDAKKworI2RlZmluZSBXTUFfR0VUX1JYX01QRFVfREFUQShwUnhNZXRhKSBcCisJKCgodF9wYWNrZXRtZXRhICopcFJ4TWV0YSktPm1wZHVfZGF0YV9wdHIpCisKKyNkZWZpbmUgV01BX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQocFJ4TWV0YSkgMAorCisjZGVmaW5lIFdNQV9HRVRfUlhfVU5LTk9XTl9VQ0FTVChwUnhNZXRhKSAwCisKKyNkZWZpbmUgV01BX0dFVF9SWF9DSChwUnhNZXRhKSBcCisJKCgodF9wYWNrZXRtZXRhICopcFJ4TWV0YSktPmNoYW5uZWwpCisKKyNkZWZpbmUgV01BX0lTX1JYX0JDQVNUKHBSeE1ldGEpIDAKKworI2RlZmluZSBXTUFfR0VUX1JYX0ZUX0RPTkUocFJ4TWV0YSkgMAorCisjZGVmaW5lIFdNQV9HRVRfUlhfRFBVX0ZFRURCQUNLKHBSeE1ldGEpIFwKKwkoKCh0X3BhY2tldG1ldGEgKilwUnhNZXRhKS0+ZHB1RmVlZGJhY2spCisKKyNkZWZpbmUgV01BX0dFVF9SWF9CRUFDT05fU0VOVChwUnhNZXRhKSAwCisKKyNkZWZpbmUgV01BX0dFVF9SWF9UU0ZfTEFURVIocFJ4TWV0YSkgMAorCisjZGVmaW5lIFdNQV9HRVRfUlhfVElNRVNUQU1QKHBSeE1ldGEpIFwKKwkoKCh0X3BhY2tldG1ldGEgKilwUnhNZXRhKS0+dGltZXN0YW1wKQorCisjZGVmaW5lIFdNQV9JU19SWF9JTl9TQ0FOKHBSeE1ldGEpIFwKKwkoKCh0X3BhY2tldG1ldGEgKilwUnhNZXRhKS0+c2NhbikKKworI2RlZmluZSBXTUFfR0VUX09GRkxPQURTQ0FOTEVBUk4ocFJ4TWV0YSkgXAorCSgoKHRfcGFja2V0bWV0YSAqKXBSeE1ldGEpLT5vZmZsb2FkU2NhbkxlYXJuKQorI2RlZmluZSBXTUFfR0VUX1JPQU1DQU5ESURBVEVJTkQocFJ4TWV0YSkgXAorCSgoKHRfcGFja2V0bWV0YSAqKXBSeE1ldGEpLT5yb2FtQ2FuZGlkYXRlSW5kKQorI2RlZmluZSBXTUFfR0VUX1NFU1NJT05JRChwUnhNZXRhKSBcCisJKCgodF9wYWNrZXRtZXRhICopcFJ4TWV0YSktPnNlc3Npb25JZCkKKyNkZWZpbmUgV01BX0dFVF9TQ0FOX1NSQyhwUnhNZXRhKSBcCisJKCgodF9wYWNrZXRtZXRhICopcFJ4TWV0YSktPnNjYW5fc3JjKQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKyNkZWZpbmUgV01BX0lTX0VYVFNDQU5fU0NBTl9TUkMocFJ4TWV0YSkgXAorCSgoKCh0X3BhY2tldG1ldGEgKilwUnhNZXRhKS0+c2Nhbl9zcmMpID09IFdNSV9NR01UX1JYX0hEUl9FWFRTQ0FOKQorI2RlZmluZSBXTUFfSVNfRVBOT19TQ0FOX1NSQyhwUnhNZXRhKSBcCisJKCgoKHRfcGFja2V0bWV0YSAqKXBSeE1ldGEpLT5zY2FuX3NyYykgJiBXTUlfTUdNVF9SWF9IRFJfRU5MTykKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVhUU0NBTiAqLworCisjZGVmaW5lIFdNQV9HRVRfUlhfU05SKHBSeE1ldGEpCVwKKwkoKCh0X3BhY2tldG1ldGEgKilwUnhNZXRhKS0+c25yKQorCisjZGVmaW5lIFdNQV9HRVRfUlhfUkZCQU5EKHBSeE1ldGEpIDAKKworI2RlZmluZSBXTUFfTUFYX1RYUE9XRVJfSU5WQUxJRAkJMTI3CisjZGVmaW5lIFdNQV9HRVRfUlhfUlNTSV9EQihwUnhNZXRhKSBcCisJKCgodF9wYWNrZXRtZXRhICopcFJ4TWV0YSktPnJzc2kpCisKKy8qIFdNQSBNZXNzYWdlcyAqLworI2RlZmluZSBXTUFfTVNHX1RZUEVTX0JFR0lOICAgICAgICAgICAgU0lSX0hBTF9NU0dfVFlQRVNfQkVHSU4KKyNkZWZpbmUgV01BX0lUQ19NU0dfVFlQRVNfQkVHSU4gICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTgorI2RlZmluZSBXTUFfUkFEQVJfREVURUNURURfSU5EICAgICAgICAgU0lSX0hBTF9SQURBUl9ERVRFQ1RFRF9JTkQKKworI2RlZmluZSBXTUFfQUREX1NUQV9SRVEgICAgICAgICAgICAgICAgU0lSX0hBTF9BRERfU1RBX1JFUQorI2RlZmluZSBXTUFfQUREX1NUQV9SU1AgICAgICAgICAgICAgICAgU0lSX0hBTF9BRERfU1RBX1JTUAorI2RlZmluZSBXTUFfQUREX1NUQV9TRUxGX1JTUCAgICAgICAgICAgU0lSX0hBTF9BRERfU1RBX1NFTEZfUlNQCisjZGVmaW5lIFdNQV9ERUxFVEVfU1RBX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0RFTEVURV9TVEFfUkVRCisjZGVmaW5lIFdNQV9ERUxFVEVfU1RBX1JTUCAgICAgICAgICAgICBTSVJfSEFMX0RFTEVURV9TVEFfUlNQCisjZGVmaW5lIFdNQV9BRERfQlNTX1JFUSAgICAgICAgICAgICAgICBTSVJfSEFMX0FERF9CU1NfUkVRCisjZGVmaW5lIFdNQV9BRERfQlNTX1JTUCAgICAgICAgICAgICAgICBTSVJfSEFMX0FERF9CU1NfUlNQCisjZGVmaW5lIFdNQV9ERUxFVEVfQlNTX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0RFTEVURV9CU1NfUkVRCisjZGVmaW5lIFdNQV9ERUxFVEVfQlNTX1JTUCAgICAgICAgICAgICBTSVJfSEFMX0RFTEVURV9CU1NfUlNQCisjZGVmaW5lIFdNQV9TRU5EX0JFQUNPTl9SRVEgICAgICAgICAgICBTSVJfSEFMX1NFTkRfQkVBQ09OX1JFUQorI2RlZmluZSBXTUFfU0VORF9QUk9CRV9SU1BfVE1QTCAgICAgICAgU0lSX0hBTF9TRU5EX1BST0JFX1JTUF9UTVBMCisKKyNkZWZpbmUgV01BX1NFVF9CU1NLRVlfUkVRICAgICAgICAgICAgIFNJUl9IQUxfU0VUX0JTU0tFWV9SRVEKKyNkZWZpbmUgV01BX1NFVF9CU1NLRVlfUlNQICAgICAgICAgICAgIFNJUl9IQUxfU0VUX0JTU0tFWV9SU1AKKyNkZWZpbmUgV01BX1NFVF9TVEFLRVlfUkVRICAgICAgICAgICAgIFNJUl9IQUxfU0VUX1NUQUtFWV9SRVEKKyNkZWZpbmUgV01BX1NFVF9TVEFLRVlfUlNQICAgICAgICAgICAgIFNJUl9IQUxfU0VUX1NUQUtFWV9SU1AKKyNkZWZpbmUgV01BX1VQREFURV9FRENBX1BST0ZJTEVfSU5EICAgIFNJUl9IQUxfVVBEQVRFX0VEQ0FfUFJPRklMRV9JTkQKKworI2RlZmluZSBXTUFfVVBEQVRFX0JFQUNPTl9JTkQgICAgICAgICAgU0lSX0hBTF9VUERBVEVfQkVBQ09OX0lORAorI2RlZmluZSBXTUFfVVBEQVRFX0NGX0lORCAgICAgICAgICAgICAgU0lSX0hBTF9VUERBVEVfQ0ZfSU5ECisjZGVmaW5lIFdNQV9DSE5MX1NXSVRDSF9SRVEgICAgICAgICAgICBTSVJfSEFMX0NITkxfU1dJVENIX1JFUQorI2RlZmluZSBXTUFfQUREX1RTX1JFUSAgICAgICAgICAgICAgICAgU0lSX0hBTF9BRERfVFNfUkVRCisjZGVmaW5lIFdNQV9ERUxfVFNfUkVRICAgICAgICAgICAgICAgICBTSVJfSEFMX0RFTF9UU19SRVEKKworI2RlZmluZSBXTUFfTUlTU0VEX0JFQUNPTl9JTkQgICAgICAgICAgU0lSX0hBTF9NSVNTRURfQkVBQ09OX0lORAorCisjZGVmaW5lIFdNQV9FTlRFUl9QU19SRVEgICAgICAgICAgICAgICBTSVJfSEFMX0VOVEVSX1BTX1JFUQorI2RlZmluZSBXTUFfRVhJVF9QU19SRVEgICAgICAgICAgICAgICAgU0lSX0hBTF9FWElUX1BTX1JFUQorCisjZGVmaW5lIFdNQV9DRkdfUlhQX0ZJTFRFUl9SRVEgICAgICAgICBTSVJfSEFMX0NGR19SWFBfRklMVEVSX1JFUQorCisjZGVmaW5lIFdNQV9TV0lUQ0hfQ0hBTk5FTF9SU1AgICAgICAgICBTSVJfSEFMX1NXSVRDSF9DSEFOTkVMX1JTUAorI2RlZmluZSBXTUFfUDJQX05PQV9BVFRSX0lORCAgICAgICAgICAgU0lSX0hBTF9QMlBfTk9BX0FUVFJfSU5ECisjZGVmaW5lIFdNQV9QMlBfTk9BX1NUQVJUX0lORCAgICAgICAgICBTSVJfSEFMX1AyUF9OT0FfU1RBUlRfSU5ECisjZGVmaW5lIFdNQV9QV1JfU0FWRV9DRkcgICAgICAgICAgICAgICBTSVJfSEFMX1BXUl9TQVZFX0NGRworI2RlZmluZSBXTUFfUkVHSVNURVJfUEVfQ0FMTEJBQ0sgICAgICAgU0lSX0hBTF9SRUdJU1RFUl9QRV9DQUxMQkFDSworCisjZGVmaW5lIFdNQV9JQlNTX1NUQV9BREQgICAgICAgICAgICAgICBTSVJfSEFMX0lCU1NfU1RBX0FERAorI2RlZmluZSBXTUFfVElNRVJfQURKVVNUX0FEQVBUSVZFX1RIUkVTSE9MRF9JTkQgICBTSVJfSEFMX1RJTUVSX0FESlVTVF9BREFQVElWRV9USFJFU0hPTERfSU5ECisjZGVmaW5lIFdNQV9TRVRfTElOS19TVEFURSAgICAgICAgICAgICBTSVJfSEFMX1NFVF9MSU5LX1NUQVRFCisjZGVmaW5lIFdNQV9TRVRfTElOS19TVEFURV9SU1AgICAgICAgICBTSVJfSEFMX1NFVF9MSU5LX1NUQVRFX1JTUAorI2RlZmluZSBXTUFfU0VUX1NUQV9CQ0FTVEtFWV9SRVEgICAgICAgU0lSX0hBTF9TRVRfU1RBX0JDQVNUS0VZX1JFUQorI2RlZmluZSBXTUFfU0VUX1NUQV9CQ0FTVEtFWV9SU1AgICAgICAgU0lSX0hBTF9TRVRfU1RBX0JDQVNUS0VZX1JTUAorI2RlZmluZSBXTUFfQUREX1RTX1JTUCAgICAgICAgICAgICAgICAgU0lSX0hBTF9BRERfVFNfUlNQCisjZGVmaW5lIFdNQV9EUFVfTUlDX0VSUk9SICAgICAgICAgICAgICBTSVJfSEFMX0RQVV9NSUNfRVJST1IKKyNkZWZpbmUgV01BX1RJTUVSX0NISVBfTU9OSVRPUl9USU1FT1VUIFNJUl9IQUxfVElNRVJfQ0hJUF9NT05JVE9SX1RJTUVPVVQKKyNkZWZpbmUgV01BX1RJTUVSX1RSQUZGSUNfQUNUSVZJVFlfUkVRIFNJUl9IQUxfVElNRVJfVFJBRkZJQ19BQ1RJVklUWV9SRVEKKyNkZWZpbmUgV01BX1RJTUVSX0FEQ19SU1NJX1NUQVRTICAgICAgIFNJUl9IQUxfVElNRVJfQURDX1JTU0lfU1RBVFMKKyNkZWZpbmUgV01BX1RJTUVSX1RSQUZGSUNfU1RBVFNfSU5EICAgIFNJUl9IQUxfVFJBRkZJQ19TVEFUU19JTkQKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKyNkZWZpbmUgV01BX0VYQ0xVREVfVU5FTkNSWVBURURfSU5EICAgIFNJUl9IQUxfRVhDTFVERV9VTkVOQ1JZUFRFRF9JTkQKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQorI2RlZmluZSBXTUFfVFNNX1NUQVRTX1JFUSAgICAgICAgICAgICAgU0lSX0hBTF9UU01fU1RBVFNfUkVRCisjZGVmaW5lIFdNQV9UU01fU1RBVFNfUlNQICAgICAgICAgICAgICBTSVJfSEFMX1RTTV9TVEFUU19SU1AKKyNlbmRpZgorCisjZGVmaW5lIFdNQV9TRVRfTUlNT1BTX1JFUSAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX1NFVF9NSU1PUFNfUkVRCisjZGVmaW5lIFdNQV9TRVRfTUlNT1BTX1JTUCAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX1NFVF9NSU1PUFNfUlNQCisjZGVmaW5lIFdNQV9TWVNfUkVBRFlfSU5EICAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX1NZU19SRUFEWV9JTkQKKyNkZWZpbmUgV01BX1NFVF9UWF9QT1dFUl9SRVEgICAgICAgICAgICAgICAgICAgIFNJUl9IQUxfU0VUX1RYX1BPV0VSX1JFUQorI2RlZmluZSBXTUFfU0VUX1RYX1BPV0VSX1JTUCAgICAgICAgICAgICAgICAgICAgU0lSX0hBTF9TRVRfVFhfUE9XRVJfUlNQCisjZGVmaW5lIFdNQV9HRVRfVFhfUE9XRVJfUkVRICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0dFVF9UWF9QT1dFUl9SRVEKKworLyogTWVzc2FnZXMgdG8gc3VwcG9ydCB0cmFuc21pdF9oYWx0IGFuZCB0cmFuc21pdF9yZXN1bWUgKi8KKyNkZWZpbmUgV01BX1RSQU5TTUlTU0lPTl9DT05UUk9MX0lORCAgICAgICAgICAgIFNJUl9IQUxfVFJBTlNNSVNTSU9OX0NPTlRST0xfSU5ECisjZGVmaW5lIFdNQV9CRUFDT05fRklMVEVSX0lORCAgICAgICAgICBTSVJfSEFMX0JFQUNPTl9GSUxURVJfSU5ECisKKyNkZWZpbmUgV01BX0VOQUJMRV9VQVBTRF9SRVEgICAgICAgICAgICBTSVJfSEFMX0VOQUJMRV9VQVBTRF9SRVEKKyNkZWZpbmUgV01BX0RJU0FCTEVfVUFQU0RfUkVRICAgICAgICAgICBTSVJfSEFMX0RJU0FCTEVfVUFQU0RfUkVRCisKKy8qIC8gUEUgPC0+IEhBTCBXT1dMIG1lc3NhZ2VzICovCisjZGVmaW5lIFdNQV9XT1dfQUREX1BUUk4gICAgICAgICAgICAgICBTSVJfSEFMX1dPV19BRERfUFRSTgorI2RlZmluZSBXTUFfV09XX0RFTF9QVFJOICAgICAgICAgICAgICAgU0lSX0hBTF9XT1dfREVMX1BUUk4KKyNkZWZpbmUgV01BX1dPV0xfRU5URVJfUkVRICAgICAgICAgICAgIFNJUl9IQUxfV09XTF9FTlRFUl9SRVEKKyNkZWZpbmUgV01BX1dPV0xfRU5URVJfUlNQICAgICAgICAgICAgIFNJUl9IQUxfV09XTF9FTlRFUl9SU1AKKyNkZWZpbmUgV01BX1dPV0xfRVhJVF9SRVEgICAgICAgICAgICAgIFNJUl9IQUxfV09XTF9FWElUX1JFUQorI2RlZmluZSBXTUFfV09XTF9FWElUX1JTUCAgICAgICAgICAgICAgU0lSX0hBTF9XT1dMX0VYSVRfUlNQCisvKiAvIFBFIDwtPiBIQUwgc3RhdGlzdGljcyBtZXNzYWdlcyAqLworI2RlZmluZSBXTUFfR0VUX1NUQVRJU1RJQ1NfUkVRICAgICAgICAgU0lSX0hBTF9HRVRfU1RBVElTVElDU19SRVEKKyNkZWZpbmUgV01BX0dFVF9TVEFUSVNUSUNTX1JTUCAgICAgICAgIFNJUl9IQUxfR0VUX1NUQVRJU1RJQ1NfUlNQCisjZGVmaW5lIFdNQV9TRVRfS0VZX0RPTkUgICAgICAgICAgICAgICBTSVJfSEFMX1NFVF9LRVlfRE9ORQorCisvKiAvIFBFIDwtPiBIQUwgQlRDIG1lc3NhZ2VzICovCisjZGVmaW5lIFdNQV9CVENfU0VUX0NGRyAgICAgICAgICAgICAgICBTSVJfSEFMX0JUQ19TRVRfQ0ZHCisjZGVmaW5lIFdNQV9IQU5ETEVfRldfTUJPWF9SU1AgICAgICAgICBTSVJfSEFMX0hBTkRMRV9GV19NQk9YX1JTUAorCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisvKiBQRSA8LT4gSEFMIE9FTV9EQVRBIFJFTEFURUQgTUVTU0FHRVMgKi8KKyNkZWZpbmUgV01BX1NUQVJUX09FTV9EQVRBX1JFUSAgICAgICAgIFNJUl9IQUxfU1RBUlRfT0VNX0RBVEFfUkVRCisjZGVmaW5lIFdNQV9TVEFSVF9PRU1fREFUQV9SU1AgICAgICAgICBTSVJfSEFMX1NUQVJUX09FTV9EQVRBX1JTUAorI2VuZGlmCisKKyNkZWZpbmUgV01BX1NFVF9NQVhfVFhfUE9XRVJfUkVRICAgICAgIFNJUl9IQUxfU0VUX01BWF9UWF9QT1dFUl9SRVEKKyNkZWZpbmUgV01BX1NFVF9NQVhfVFhfUE9XRVJfUlNQICAgICAgIFNJUl9IQUxfU0VUX01BWF9UWF9QT1dFUl9SU1AKKyNkZWZpbmUgV01BX1NFVF9UWF9QT1dFUl9SRVEgICAgICAgICAgIFNJUl9IQUxfU0VUX1RYX1BPV0VSX1JFUQorCisjZGVmaW5lIFdNQV9TRVRfTUFYX1RYX1BPV0VSX1BFUl9CQU5EX1JFUSBcCisJU0lSX0hBTF9TRVRfTUFYX1RYX1BPV0VSX1BFUl9CQU5EX1JFUQorCisvKiAvIFBFIDwtPiBIQUwgSG9zdCBPZmZsb2FkIG1lc3NhZ2UgKi8KKyNkZWZpbmUgV01BX1NFVF9IT1NUX09GRkxPQUQgICAgICAgICAgIFNJUl9IQUxfU0VUX0hPU1RfT0ZGTE9BRAorCisvKiAvIFBFIDwtPiBIQUwgS2VlcCBBbGl2ZSBtZXNzYWdlICovCisjZGVmaW5lIFdNQV9TRVRfS0VFUF9BTElWRSAgICAgICAgICAgICBTSVJfSEFMX1NFVF9LRUVQX0FMSVZFCisKKyNpZmRlZiBXTEFOX05TX09GRkxPQUQKKyNkZWZpbmUgV01BX1NFVF9OU19PRkZMT0FEICAgICAgICAgICAgIFNJUl9IQUxfU0VUX05TX09GRkxPQUQKKyNlbmRpZiAvKiBXTEFOX05TX09GRkxPQUQgKi8KKyNkZWZpbmUgV01BX0FERF9TVEFfU0VMRl9SRVEgICAgICAgICAgIFNJUl9IQUxfQUREX1NUQV9TRUxGX1JFUQorI2RlZmluZSBXTUFfREVMX1NUQV9TRUxGX1JFUSAgICAgICAgICAgU0lSX0hBTF9ERUxfU1RBX1NFTEZfUkVRCisKKyNkZWZpbmUgV01BX1NFVF9QMlBfR09fTk9BX1JFUSAgICAgICAgIFNJUl9IQUxfU0VUX1AyUF9HT19OT0FfUkVRCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworI2RlZmluZSBXTUFfU0VUX1RETFNfTElOS19FU1RBQkxJU0hfUkVRIFNJUl9IQUxfVERMU19MSU5LX0VTVEFCTElTSF9SRVEKKyNkZWZpbmUgV01BX1NFVF9URExTX0xJTktfRVNUQUJMSVNIX1JFUV9SU1AgU0lSX0hBTF9URExTX0xJTktfRVNUQUJMSVNIX1JFUV9SU1AKKyNlbmRpZgorCisjZGVmaW5lIFdNQV9XTEFOX1NVU1BFTkRfSU5EICAgICAgICAgICBTSVJfSEFMX1dMQU5fU1VTUEVORF9JTkQKKyNkZWZpbmUgV01BX1dMQU5fUkVTVU1FX1JFUSAgICAgICAgICAgU0lSX0hBTF9XTEFOX1JFU1VNRV9SRVEKKyNkZWZpbmUgV01BX01TR19UWVBFU19FTkQgICAgU0lSX0hBTF9NU0dfVFlQRVNfRU5ECisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2RlZmluZSBXTUFfQUdHUl9RT1NfUkVRICAgICAgICAgICAgICAgU0lSX0hBTF9BR0dSX1FPU19SRVEKKyNkZWZpbmUgV01BX0FHR1JfUU9TX1JTUCAgICAgICAgICAgICAgIFNJUl9IQUxfQUdHUl9RT1NfUlNQCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworLyogRlRNIENNRCBNU0cgKi8KKyNkZWZpbmUgV01BX0ZUTV9DTURfUkVRICAgICAgICBTSVJfUFRUX01TR19UWVBFU19CRUdJTgorI2RlZmluZSBXTUFfRlRNX0NNRF9SU1AgICAgICAgIFNJUl9QVFRfTVNHX1RZUEVTX0VORAorI2RlZmluZSBXTUFfQ1NBX09GRkxPQURfRVZFTlQgIFNJUl9DU0FfT0ZGTE9BRF9FVkVOVAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisvKlJlcXVlc3RzIHNlbnQgdG8gbG93ZXIgZHJpdmVyKi8KKyNkZWZpbmUgV01BX1NFVF9QTk9fUkVRICAgICAgICAgICAgIFNJUl9IQUxfU0VUX1BOT19SRVEKKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorI2RlZmluZSBXTUFfU0VUX1BMTV9SRVEgICAgICAgICAgICAgU0lSX0hBTF9TRVRfUExNX1JFUQorI2VuZGlmCisKKyNkZWZpbmUgV01BX1JPQU1fU0NBTl9PRkZMT0FEX1JFUSAgIFNJUl9IQUxfUk9BTV9TQ0FOX09GRkxPQURfUkVRCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisjZGVmaW5lIFdNQV9ST0FNX09GRkxPQURfU1lOQ0hfQ05GICBTSVJfSEFMX1JPQU1fT0ZGTE9BRF9TWU5DSF9DTkYKKyNkZWZpbmUgV01BX1JPQU1fT0ZGTE9BRF9TWU5DSF9JTkQgIFNJUl9IQUxfUk9BTV9PRkZMT0FEX1NZTkNIX0lORAorI2RlZmluZSBXTUFfUk9BTV9PRkZMT0FEX1NZTkNIX0ZBSUwgU0lSX0hBTF9ST0FNX09GRkxPQURfU1lOQ0hfRkFJTAorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworI2RlZmluZSBXTUFfODAyM19NVUxUSUNBU1RfTElTVF9SRVEgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMXzgwMjNfTVVMVElDQVNUX0xJU1RfUkVRCisjZGVmaW5lIFdNQV9SRUNFSVZFX0ZJTFRFUl9TRVRfRklMVEVSX1JFUSAgICAgICAgICAgICAgIFNJUl9IQUxfUkVDRUlWRV9GSUxURVJfU0VUX0ZJTFRFUl9SRVEKKyNkZWZpbmUgV01BX1BBQ0tFVF9DT0FMRVNDSU5HX0ZJTFRFUl9NQVRDSF9DT1VOVF9SRVEgICAgU0lSX0hBTF9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUkVRCisjZGVmaW5lIFdNQV9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUlNQICAgIFNJUl9IQUxfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JTUAorI2RlZmluZSBXTUFfUkVDRUlWRV9GSUxURVJfQ0xFQVJfRklMVEVSX1JFUSAgICAgICAgICAgICBTSVJfSEFMX1JFQ0VJVkVfRklMVEVSX0NMRUFSX0ZJTFRFUl9SRVEKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORyAqLworCisjZGVmaW5lIFdNQV9ESENQX1NUQVJUX0lORCAgICAgICAgICAgICAgU0lSX0hBTF9ESENQX1NUQVJUX0lORAorI2RlZmluZSBXTUFfREhDUF9TVE9QX0lORCAgICAgICAgICAgICAgIFNJUl9IQUxfREhDUF9TVE9QX0lORAorCisjZGVmaW5lIFdNQV9ISURERU5fU1NJRF9WREVWX1JFU1RBUlQgICAgU0lSX0hBTF9ISURFX1NTSURfVkRFVl9SRVNUQVJUCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKyNkZWZpbmUgV01BX0dUS19PRkZMT0FEX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0dUS19PRkZMT0FEX1JFUQorI2RlZmluZSBXTUFfR1RLX09GRkxPQURfR0VUSU5GT19SRVEgICAgIFNJUl9IQUxfR1RLX09GRkxPQURfR0VUSU5GT19SRVEKKyNkZWZpbmUgV01BX0dUS19PRkZMT0FEX0dFVElORk9fUlNQICAgICBTSVJfSEFMX0dUS19PRkZMT0FEX0dFVElORk9fUlNQCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FEICovCisKKyNkZWZpbmUgV01BX1NFVF9UTV9MRVZFTF9SRVEgICAgICAgU0lSX0hBTF9TRVRfVE1fTEVWRUxfUkVRCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworI2RlZmluZSBXTUFfVVBEQVRFX09QX01PREUgICAgICAgICBTSVJfSEFMX1VQREFURV9PUF9NT0RFCisjZGVmaW5lIFdNQV9VUERBVEVfUlhfTlNTICAgICAgICAgIFNJUl9IQUxfVVBEQVRFX1JYX05TUworI2RlZmluZSBXTUFfVVBEQVRFX01FTUJFUlNISVAgICAgICBTSVJfSEFMX1VQREFURV9NRU1CRVJTSElQCisjZGVmaW5lIFdNQV9VUERBVEVfVVNFUlBPUyAgICAgICAgIFNJUl9IQUxfVVBEQVRFX1VTRVJQT1MKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorI2RlZmluZSBXTUFfTkFOX1JFUVVFU1QgICAgICAgICAgICBTSVJfSEFMX05BTl9SRVFVRVNUCisjZW5kaWYKKworI2RlZmluZSBXTUFfU1RBUlRfU0NBTl9PRkZMT0FEX1JFUSAgU0lSX0hBTF9TVEFSVF9TQ0FOX09GRkxPQURfUkVRCisjZGVmaW5lIFdNQV9TVE9QX1NDQU5fT0ZGTE9BRF9SRVEgIFNJUl9IQUxfU1RPUF9TQ0FOX09GRkxPQURfUkVRCisjZGVmaW5lIFdNQV9VUERBVEVfQ0hBTl9MSVNUX1JFUSAgICBTSVJfSEFMX1VQREFURV9DSEFOX0xJU1RfUkVRCisjZGVmaW5lIFdNQV9SWF9TQ0FOX0VWRU5UICAgICAgICAgICBTSVJfSEFMX1JYX1NDQU5fRVZFTlQKKyNkZWZpbmUgV01BX0lCU1NfUEVFUl9JTkFDVElWSVRZX0lORCBTSVJfSEFMX0lCU1NfUEVFUl9JTkFDVElWSVRZX0lORAorCisjZGVmaW5lIFdNQV9DTElfU0VUX0NNRCAgICAgICAgICAgICBTSVJfSEFMX0NMSV9TRVRfQ01ECisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisjZGVmaW5lIFdNQV9TTUVfU0NBTl9DQUNIRV9VUERBVEVEICBTSVJfSEFMX1NNRV9TQ0FOX0NBQ0hFX1VQREFURUQKKyNlbmRpZgorCisjaWZuZGVmIFJFTU9WRV9QS1RfTE9HCisjZGVmaW5lIFdNQV9QS1RMT0dfRU5BQkxFX1JFUSAgICAgICBTSVJfSEFMX1BLVExPR19FTkFCTEVfUkVRCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MUEhCCisjZGVmaW5lIFdNQV9MUEhCX0NPTkZfUkVRICAgICAgICAgIFNJUl9IQUxfTFBIQl9DT05GX0lORAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9MUEhCICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQKKyNkZWZpbmUgV01BX0NIX0FWT0lEX1VQREFURV9SRVEgICAgU0lSX0hBTF9DSF9BVk9JRF9VUERBVEVfUkVRCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NIX0FWT0lEICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgorI2RlZmluZSBXTUFfU0VUX0FVVE9fU0hVVERPV05fVElNRVJfUkVRIFNJUl9IQUxfU0VUX0FVVE9fU0hVVERPV05fVElNRVJfUkVRCisjZW5kaWYKKworI2RlZmluZSBXTUFfQUREX1BFUklPRElDX1RYX1BUUk5fSU5EICAgIFNJUl9IQUxfQUREX1BFUklPRElDX1RYX1BUUk5fSU5ECisjZGVmaW5lIFdNQV9ERUxfUEVSSU9ESUNfVFhfUFRSTl9JTkQgICAgU0lSX0hBTF9ERUxfUEVSSU9ESUNfVFhfUFRSTl9JTkQKKworI2RlZmluZSBXTUFfVFhfUE9XRVJfTElNSVQgICAgICAgICAgU0lSX0hBTF9TRVRfVFhfUE9XRVJfTElNSVQKKworI2RlZmluZSBXTUFfUkFURV9VUERBVEVfSU5EICAgICAgICAgU0lSX0hBTF9SQVRFX1VQREFURV9JTkQKKworI2RlZmluZSBXTUFfSU5JVF9USEVSTUFMX0lORk9fQ01EICAgU0lSX0hBTF9JTklUX1RIRVJNQUxfSU5GT19DTUQKKyNkZWZpbmUgV01BX1NFVF9USEVSTUFMX0xFVkVMICAgICAgIFNJUl9IQUxfU0VUX1RIRVJNQUxfTEVWRUwKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisjZGVmaW5lIFdNQV9VUERBVEVfRldfVERMU19TVEFURSAgICAgICAgICBTSVJfSEFMX1VQREFURV9GV19URExTX1NUQVRFCisjZGVmaW5lIFdNQV9VUERBVEVfVERMU19QRUVSX1NUQVRFICAgICAgICBTSVJfSEFMX1VQREFURV9URExTX1BFRVJfU1RBVEUKKyNkZWZpbmUgV01BX1RETFNfU0hPVUxEX0RJU0NPVkVSX0NNRCAgICAgIFNJUl9IQUxfVERMU19TSE9VTERfRElTQ09WRVIKKyNkZWZpbmUgV01BX1RETFNfU0hPVUxEX1RFQVJET1dOX0NNRCAgICAgIFNJUl9IQUxfVERMU19TSE9VTERfVEVBUkRPV04KKyNkZWZpbmUgV01BX1RETFNfUEVFUl9ESVNDT05ORUNURURfQ01EICAgIFNJUl9IQUxfVERMU19QRUVSX0RJU0NPTk5FQ1RFRAorI2RlZmluZSBXTUFfVERMU19TRVRfT0ZGQ0hBTl9NT0RFICAgICAgICAgU0lSX0hBTF9URExTX1NFVF9PRkZDSEFOX01PREUKKyNlbmRpZgorI2RlZmluZSBXTUFfU0VUX1NBUF9JTlRSQUJTU19ESVMgICAgICAgICAgU0lSX0hBTF9TRVRfU0FQX0lOVFJBQlNTX0RJUworCisvKiBNZXNzYWdlIHRvIEluZGljYXRlIFJhZGFyIFByZXNlbmNlIG9uIFNBUCBDaGFubmVsICovCisjZGVmaW5lIFdNQV9ERlNfUkFEQVJfSU5EICAgICAgICAgICBTSVJfSEFMX0RGU19SQURBUl9JTkQKKworLyogTWVzc2FnZSB0byBpbmRpY2F0ZSBiZWFjb24gdHggY29tcGxldGlvbiBhZnRlciBiZWFjb24gdGVtcGxhdGUgdXBkYXRlCisgKiBiZWFjb24gb2ZmbG9hZCBjYXNlCisgKi8KKyNkZWZpbmUgV01BX0RGU19CRUFDT05fVFhfU1VDQ0VTU19JTkQgICBTSVJfSEFMX0JFQUNPTl9UWF9TVUNDRVNTX0lORAorI2RlZmluZSBXTUFfRElTQVNTT0NfVFhfQ09NUCAgICAgICBTSVJfSEFMX0RJU0FTU09DX1RYX0NPTVAKKyNkZWZpbmUgV01BX0RFQVVUSF9UWF9DT01QICAgICAgICAgU0lSX0hBTF9ERUFVVEhfVFhfQ09NUAorI2RlZmluZSBXTUFfR0VUX0xJTktfU1BFRUQgICAgICAgICBTSVJfSEFMX0dFVF9MSU5LX1NQRUVECisKKyNkZWZpbmUgV01BX01PREVNX1BPV0VSX1NUQVRFX0lORCBTSVJfSEFMX01PREVNX1BPV0VSX1NUQVRFX0lORAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1NUQVRTX0VYVAorI2RlZmluZSBXTUFfU1RBVFNfRVhUX1JFUVVFU1QgICAgICAgICAgICAgIFNJUl9IQUxfU1RBVFNfRVhUX1JFUVVFU1QKKyNlbmRpZgorCisjZGVmaW5lIFdNQV9JUEFfT0ZGTE9BRF9FTkFCTEVfRElTQUJMRSAgICAgICAgU0lSX0hBTF9JUEFfT0ZGTE9BRF9FTkFCTEVfRElTQUJMRQorCisjZGVmaW5lIFdNQV9HRVRfVEVNUEVSQVRVUkVfUkVRICAgICBTSVJfSEFMX0dFVF9URU1QRVJBVFVSRV9SRVEKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisjZGVmaW5lIFdNQV9FWFRTQ0FOX0dFVF9DQVBBQklMSVRJRVNfUkVRICAgIFNJUl9IQUxfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX1JFUQorI2RlZmluZSBXTUFfRVhUU0NBTl9TVEFSVF9SRVEgICAgICAgICAgICAgICBTSVJfSEFMX0VYVFNDQU5fU1RBUlRfUkVRCisjZGVmaW5lIFdNQV9FWFRTQ0FOX1NUT1BfUkVRICAgICAgICAgICAgICAgIFNJUl9IQUxfRVhUU0NBTl9TVE9QX1JFUQorI2RlZmluZSBXTUFfRVhUU0NBTl9TRVRfQlNTSURfSE9UTElTVF9SRVEgICBTSVJfSEFMX0VYVFNDQU5fU0VUX0JTU19IT1RMSVNUX1JFUQorI2RlZmluZSBXTUFfRVhUU0NBTl9SRVNFVF9CU1NJRF9IT1RMSVNUX1JFUSBTSVJfSEFMX0VYVFNDQU5fUkVTRVRfQlNTX0hPVExJU1RfUkVRCisjZGVmaW5lIFdNQV9FWFRTQ0FOX1NFVF9TSUdORl9DSEFOR0VfUkVRICAgIFNJUl9IQUxfRVhUU0NBTl9TRVRfU0lHTkZfQ0hBTkdFX1JFUQorI2RlZmluZSBXTUFfRVhUU0NBTl9SRVNFVF9TSUdORl9DSEFOR0VfUkVRICBTSVJfSEFMX0VYVFNDQU5fUkVTRVRfU0lHTkZfQ0hBTkdFX1JFUQorI2RlZmluZSBXTUFfRVhUU0NBTl9HRVRfQ0FDSEVEX1JFU1VMVFNfUkVRICBTSVJfSEFMX0VYVFNDQU5fR0VUX0NBQ0hFRF9SRVNVTFRTX1JFUQorI2RlZmluZSBXTUFfU0VUX0VQTk9fTElTVF9SRVEgICAgICAgICAgICAgICBTSVJfSEFMX1NFVF9FUE5PX0xJU1RfUkVRCisjZGVmaW5lIFdNQV9TRVRfUEFTU1BPSU5UX0xJU1RfUkVRICAgICAgICAgIFNJUl9IQUxfU0VUX1BBU1NQT0lOVF9MSVNUX1JFUQorI2RlZmluZSBXTUFfUkVTRVRfUEFTU1BPSU5UX0xJU1RfUkVRICAgICAgICBTSVJfSEFMX1JFU0VUX1BBU1NQT0lOVF9MSVNUX1JFUQorI2RlZmluZSBXTUFfRVhUU0NBTl9TRVRfU1NJRF9IT1RMSVNUX1JFUSAgICBTSVJfSEFMX0VYVFNDQU5fU0VUX1NTSURfSE9UTElTVF9SRVEKKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FWFRTQ0FOICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUworI2RlZmluZSBXTUFfTElOS19MQVlFUl9TVEFUU19DTEVBUl9SRVEgICAgICAgIFNJUl9IQUxfTExfU1RBVFNfQ0xFQVJfUkVRCisjZGVmaW5lIFdNQV9MSU5LX0xBWUVSX1NUQVRTX1NFVF9SRVEgICAgICAgICAgU0lSX0hBTF9MTF9TVEFUU19TRVRfUkVRCisjZGVmaW5lIFdNQV9MSU5LX0xBWUVSX1NUQVRTX0dFVF9SRVEgICAgICAgICAgU0lSX0hBTF9MTF9TVEFUU19HRVRfUkVRCisjZGVmaW5lIFdNQV9MSU5LX0xBWUVSX1NUQVRTX1JFU1VMVFNfUlNQICAgICAgU0lSX0hBTF9MTF9TVEFUU19SRVNVTFRTX1JTUAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICovCisKKyNkZWZpbmUgV01BX0xJTktfU1RBVFVTX0dFVF9SRVEgU0lSX0hBTF9MSU5LX1NUQVRVU19HRVRfUkVRCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfRVhUV09XX1NVUFBPUlQKKyNkZWZpbmUgV01BX1dMQU5fRVhUX1dPVyAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0NPTkZJR19FWFRfV09XCisjZGVmaW5lIFdNQV9XTEFOX1NFVF9BUFBfVFlQRTFfUEFSQU1TICAgICAgICAgU0lSX0hBTF9DT05GSUdfQVBQX1RZUEUxX1BBUkFNUworI2RlZmluZSBXTUFfV0xBTl9TRVRfQVBQX1RZUEUyX1BBUkFNUyAgICAgICAgIFNJUl9IQUxfQ09ORklHX0FQUF9UWVBFMl9QQVJBTVMKKyNlbmRpZgorCisjZGVmaW5lIFdNQV9TRVRfU0NBTl9NQUNfT1VJX1JFUSAgICAgICAgICAgICAgU0lSX0hBTF9TRVRfU0NBTl9NQUNfT1VJX1JFUQorCisjaWZkZWYgREhDUF9TRVJWRVJfT0ZGTE9BRAorI2RlZmluZSBXTUFfU0VUX0RIQ1BfU0VSVkVSX09GRkxPQURfQ01EICAgICAgIFNJUl9IQUxfU0VUX0RIQ1BfU0VSVkVSX09GRkxPQUQKKyNlbmRpZiAvKiBESENQX1NFUlZFUl9PRkZMT0FEICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1BJT19MRURfRkxBU0hJTkcKKyNkZWZpbmUgV01BX0xFRF9GTEFTSElOR19SRVEgICBTSVJfSEFMX0xFRF9GTEFTSElOR19SRVEKKyNlbmRpZgorCisvKiBNZXNzYWdlIHBvc3RlZCBieSB3bWkgd2hlbiB3bWkgZXZlbnQgaXMgcmVjZWl2ZWQgZnJvbSBGVyAqLworI2RlZmluZSBXTUFfUFJPQ0VTU19GV19FVkVOVAkJICAgICBTSVJfSEFMX1BST0NFU1NfRldfRVZFTlQKKworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorI2RlZmluZSBXTUFfVVBEQVRFX1EyUV9JRV9JTkQgICAgICAgICAgICAgICAgIFNJUl9IQUxfVVBEQVRFX1EyUV9JRV9JTkQKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKyNkZWZpbmUgV01BX1NFVF9SU1NJX01PTklUT1JfUkVRICAgICAgICAgICAgICBTSVJfSEFMX1NFVF9SU1NJX01PTklUT1JfUkVRCisKKyNkZWZpbmUgV01BX0ZXX01FTV9EVU1QX1JFUSAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0ZXX01FTV9EVU1QX1JFUQorCisjZGVmaW5lIFdNQV9PQ0JfU0VUX0NPTkZJR19DTUQgICAgICAgICAgICAgICBTSVJfSEFMX09DQl9TRVRfQ09ORklHX0NNRAorI2RlZmluZSBXTUFfT0NCX1NFVF9VVENfVElNRV9DTUQgICAgICAgICAgICAgU0lSX0hBTF9PQ0JfU0VUX1VUQ19USU1FX0NNRAorI2RlZmluZSBXTUFfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfQ01EICAgICAgU0lSX0hBTF9PQ0JfU1RBUlRfVElNSU5HX0FEVkVSVF9DTUQKKyNkZWZpbmUgV01BX09DQl9TVE9QX1RJTUlOR19BRFZFUlRfQ01EICAgICAgIFNJUl9IQUxfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9DTUQKKyNkZWZpbmUgV01BX09DQl9HRVRfVFNGX1RJTUVSX0NNRCAgICAgICAgICAgIFNJUl9IQUxfT0NCX0dFVF9UU0ZfVElNRVJfQ01ECisjZGVmaW5lIFdNQV9EQ0NfR0VUX1NUQVRTX0NNRCAgICAgICAgICAgICAgICBTSVJfSEFMX0RDQ19HRVRfU1RBVFNfQ01ECisjZGVmaW5lIFdNQV9EQ0NfQ0xFQVJfU1RBVFNfQ01EICAgICAgICAgICAgICBTSVJfSEFMX0RDQ19DTEVBUl9TVEFUU19DTUQKKyNkZWZpbmUgV01BX0RDQ19VUERBVEVfTkRMX0NNRCAgICAgICAgICAgICAgIFNJUl9IQUxfRENDX1VQREFURV9ORExfQ01ECisjZGVmaW5lIFdNQV9TRVRfSUVfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgU0lSX0hBTF9TRVRfSUVfSU5GTworCisjZGVmaW5lIFdNQV9MUk9fQ09ORklHX0NNRCAgICAgICAgICAgICAgICAgICAgU0lSX0hBTF9MUk9fQ09ORklHX0NNRAorCisvKiBCaXQgNiB3aWxsIGJlIHVzZWQgdG8gY29udHJvbCBCRCByYXRlIGZvciBNYW5hZ2VtZW50IGZyYW1lcyAqLworI2RlZmluZSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FIDB4NDAKKworI2RlZmluZSB3bWFfdHhfZnJhbWUoaEhhbCwgcEZybUJ1ZiwgZnJtTGVuLCBmcm1UeXBlLCB0eERpciwgdGlkLCBwQ29tcEZ1bmMsIFwKKwkJICAgcERhdGEsIHR4RmxhZywgc2Vzc2lvbmlkLCBjaGFubmVsX2ZyZXEpIFwKKwkoQ0RGX1NUQVRVUykoIHdtYV90eF9wYWNrZXQoIFwKKwkJICAgICAgY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKSwgXAorCQkgICAgICAocEZybUJ1ZiksIFwKKwkJICAgICAgKGZybUxlbiksIFwKKwkJICAgICAgKGZybVR5cGUpLCBcCisJCSAgICAgICh0eERpciksIFwKKwkJICAgICAgKHRpZCksIFwKKwkJICAgICAgKHBDb21wRnVuYyksIFwKKwkJICAgICAgKHBEYXRhKSwgXAorCQkgICAgICAoTlVMTCksIFwKKwkJICAgICAgKHR4RmxhZyksIFwKKwkJICAgICAgKHNlc3Npb25pZCksIFwKKwkJICAgICAgKGZhbHNlKSwgXAorCQkgICAgICAoY2hhbm5lbF9mcmVxKSkpCisKKyNkZWZpbmUgd21hX3R4X2ZyYW1lV2l0aFR4Q29tcGxldGUoaEhhbCwgcEZybUJ1ZiwgZnJtTGVuLCBmcm1UeXBlLCB0eERpciwgdGlkLCBcCisJIHBDb21wRnVuYywgcERhdGEsIHBDQmFja0ZuVHhDb21wLCB0eEZsYWcsIHNlc3Npb25pZCwgdGRsc2ZsYWcsIFwKKwkgY2hhbm5lbF9mcmVxKSBcCisJKENERl9TVEFUVVMpKCB3bWFfdHhfcGFja2V0KCBcCisJCSAgICAgIGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSksIFwKKwkJICAgICAgKHBGcm1CdWYpLCBcCisJCSAgICAgIChmcm1MZW4pLCBcCisJCSAgICAgIChmcm1UeXBlKSwgXAorCQkgICAgICAodHhEaXIpLCBcCisJCSAgICAgICh0aWQpLCBcCisJCSAgICAgIChwQ29tcEZ1bmMpLCBcCisJCSAgICAgIChwRGF0YSksIFwKKwkJICAgICAgKHBDQmFja0ZuVHhDb21wKSwgXAorCQkgICAgICAodHhGbGFnKSwgXAorCQkgICAgICAoc2Vzc2lvbmlkKSwgXAorCQkgICAgICAodGRsc2ZsYWcpLCBcCisJCSAgICAgIChjaGFubmVsX2ZyZXEpKSkKKworCisjZGVmaW5lIFdNQV9TZXRFbmFibGVTU1IoZW5hYmxlX3NzcikgKCh2b2lkKWVuYWJsZV9zc3IpCisKKy8qKgorICogc3RydWN0IHNVYXBzZF9QYXJhbXMgLSBQb3dlcnNhdmUgT2ZmbG9hZCBDaGFuZ2VzCisgKiBAYmtEZWxpdmVyeUVuYWJsZWQ6IEJLIGRlbGl2ZXJ5IGVuYWJsZWQgZmxhZworICogQGJlRGVsaXZlcnlFbmFibGVkOiBCRSBkZWxpdmVyeSBlbmFibGVkIGZsYWcKKyAqIEB2aURlbGl2ZXJ5RW5hYmxlZDogVkkgZGVsaXZlcnkgZW5hYmxlZCBmbGFnCisgKiBAdm9EZWxpdmVyeUVuYWJsZWQ6IFZPIGRlbGl2ZXJ5IGVuYWJsZWQgZmxhZworICogQGJrVHJpZ2dlckVuYWJsZWQ6IEJLIHRyaWdnZXIgZW5hYmxlZCBmbGFnCisgKiBAYmVUcmlnZ2VyRW5hYmxlZDogQkUgdHJpZ2dlciBlbmFibGVkIGZsYWcKKyAqIEB2aVRyaWdnZXJFbmFibGVkOiBWSSB0cmlnZ2VyIGVuYWJsZWQgZmxhZworICogQHZvVHJpZ2dlckVuYWJsZWQ6IFZPIHRyaWdnZXIgZW5hYmxlZCBmbGFnCisgKi8KK3R5cGVkZWYgc3RydWN0IHNVYXBzZF9QYXJhbXMgeworCXVpbnQ4X3QgYmtEZWxpdmVyeUVuYWJsZWQ6MTsKKwl1aW50OF90IGJlRGVsaXZlcnlFbmFibGVkOjE7CisJdWludDhfdCB2aURlbGl2ZXJ5RW5hYmxlZDoxOworCXVpbnQ4X3Qgdm9EZWxpdmVyeUVuYWJsZWQ6MTsKKwl1aW50OF90IGJrVHJpZ2dlckVuYWJsZWQ6MTsKKwl1aW50OF90IGJlVHJpZ2dlckVuYWJsZWQ6MTsKKwl1aW50OF90IHZpVHJpZ2dlckVuYWJsZWQ6MTsKKwl1aW50OF90IHZvVHJpZ2dlckVuYWJsZWQ6MTsKK30gdFVhcHNkX1BhcmFtcywgKnRwVWFwc2RfUGFyYW1zOworCisvKioKKyAqIHN0cnVjdCBzRW5hYmxlUHNQYXJhbXMgLSBFbmFibGUgUG93ZXJTYXZlIFBhcmFtcworICogQHBzU2V0dGluZzogcG93ZXIgc2F2ZSBzZXR0aW5nCisgKiBAdWFwc2RQYXJhbXM6IFVBUFNEIFBhcmFtZXRlcnMKKyAqIEBic3NpZDogbWFjIGFkZHJlc3MKKyAqIEBzZXNzaW9uaWQ6IHNtZSBzZXNzaW9uIGlkIC8gdmRldiBpZAorICogQGJjbkR0aW1QZXJpb2Q6IGJlYWNvbiBEVElNIFBlcmlvZAorICogQHN0YXR1czogc3VjY2Vzcy9mYWlsdXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHNFbmFibGVQc1BhcmFtcyB7CisJdFNpckFkZG9uUHNSZXEgcHNTZXR0aW5nOworCXRVYXBzZF9QYXJhbXMgdWFwc2RQYXJhbXM7CisJdFNpck1hY0FkZHIgYnNzaWQ7CisJdWludDMyX3Qgc2Vzc2lvbmlkOworCXVpbnQ4X3QgYmNuRHRpbVBlcmlvZDsKKwl1aW50MzJfdCBzdGF0dXM7Cit9IHRFbmFibGVQc1BhcmFtcywgKnRwRW5hYmxlUHNQYXJhbXM7CisKKy8qKgorICogc3RydWN0IHNEaXNhYmxlUHNQYXJhbXMgLSBEaXNhYmxlIFBvd2VyU2F2ZSBQYXJhbXMKKyAqIEBwc1NldHRpbmc6IHBvd2VyIHNhdmUgc2V0dGluZworICogQGJzc2lkOiBtYWMgYWRkcmVzcworICogQHNlc3Npb25pZDogc21lIHNlc3Npb24gaWQgLyB2ZGV2IGlkCisgKiBAc3RhdHVzOiBzdWNjZXNzL2ZhaWx1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0Rpc2FibGVQc1BhcmFtcyB7CisJdFNpckFkZG9uUHNSZXEgcHNTZXR0aW5nOworCXRTaXJNYWNBZGRyIGJzc2lkOworCXVpbnQzMl90IHNlc3Npb25pZDsKKwl1aW50MzJfdCBzdGF0dXM7Cit9IHREaXNhYmxlUHNQYXJhbXMsICp0cERpc2FibGVQc1BhcmFtczsKKworLyoqCisgKiBzdHJ1Y3Qgc0VuYWJsZVVhcHNkUGFyYW1zIC0gRW5hYmxlIFVhcHNkIFBhcmFtcworICogQHVhcHNkUGFyYW1zOiBVQVBTRCBwYXJhbWV0ZXJzCisgKiBAYnNzaWQ6IG1hYyBhZGRyZXNzCisgKiBAc2Vzc2lvbmlkOiBzbWUgc2Vzc2lvbiBpZC8gdmRldiBpZAorICogQHN0YXR1czogc3VjY2Vzcy9mYWlsdXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHNFbmFibGVVYXBzZFBhcmFtcyB7CisJdFVhcHNkX1BhcmFtcyB1YXBzZFBhcmFtczsKKwl0U2lyTWFjQWRkciBic3NpZDsKKwl1aW50MzJfdCBzZXNzaW9uaWQ7CisJdWludDMyX3Qgc3RhdHVzOworfSB0RW5hYmxlVWFwc2RQYXJhbXMsICp0cEVuYWJsZVVhcHNkUGFyYW1zOworCisvKioKKyAqIHN0cnVjdCBzRGlzYWJsZVVhcHNkUGFyYW1zIC0gRGlzYWJsZSBVYXBzZCBQYXJhbXMKKyAqIEBic3NpZDogbWFjIGFkZHJlc3MKKyAqIEBzZXNzaW9uaWQ6IHNtZSBzZXNzaW9uIGlkLyB2ZGV2IGlkCisgKiBAc3RhdHVzOiBzdWNjZXNzL2ZhaWx1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0Rpc2FibGVVYXBzZFBhcmFtcyB7CisJdFNpck1hY0FkZHIgYnNzaWQ7CisJdWludDMyX3Qgc2Vzc2lvbmlkOworCXVpbnQzMl90IHN0YXR1czsKK30gdERpc2FibGVVYXBzZFBhcmFtcywgKnRwRGlzYWJsZVVhcHNkUGFyYW1zOworCit0eXBlZGVmIHZvaWQgKCpwV01BVHhSeENvbXBGdW5jKSh2b2lkICpwQ29udGV4dCwgdm9pZCAqcERhdGEsCisJCQkJIGJvb2wgYkZyZWVEYXRhKTsKKworLyogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIFRYIGNvbXBsZXRlICovCisvKiBwYXJhbWV0ZXIgMSAtIGdsb2JhbCBwTWFjIHBvaW50ZXIgKi8KKy8qIHBhcmFtZXRlciAyIC0gdHhDb21wbGV0ZSBzdGF0dXMgOiAxLSBzdWNjZXNzLCAwIC0gZmFpbHVyZS4gKi8KK3R5cGVkZWYgQ0RGX1NUQVRVUyAoKnBXTUFBY2tGblR4Q29tcCkodHBBbmlTaXJHbG9iYWwsIHVpbnQzMl90KTsKKworLyogZ2VuZXJpYyBjYWxsYmFjayBmb3IgdXBkYXRpbmcgcGFyYW1ldGVycyBmcm9tIHRhcmdldCB0byBVTUFDICovCit0eXBlZGVmIHZvaWQgKCp3bWFfdGd0X2NmZ19jYikodm9pZCAqY29udGV4dCwgdm9pZCAqcGFyYW0pOworCisvKgorICogY2FsbGJhY2sgZm9yIEluZGljYXRpbmcgUmFkYXIgdG8gSEREIGFuZCBkaXNhYmxlIFR4IFF1ZXVlcworICogdG8gc3RvcCBhY2NlcHRpbmcgZGF0YSBUeCBwYWNrZXRzIGZyb20gbmV0aWYgYXMgcmFkYXIgaXMKKyAqIGZvdW5kIG9uIHRoZSBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsCisgKi8KK3R5cGVkZWYgdm9pZCAoKndtYV9kZnNfcmFkYXJfaW5kaWNhdGlvbl9jYikodm9pZCAqY29udGV4dCwgdm9pZCAqcGFyYW0pOworCisvKioKKyAqIHN0cnVjdCB3bWFfY2xpX3NldF9jbWRfdCAtIHNldCBjb21tYW5kIHBhcmFtZXRlcnMKKyAqIEBwYXJhbV9pZDogcGFyYW1ldGVyIGlkCisgKiBAcGFyYW1fdmFsdWU6IHBhcmFtZXRlciB2YWx1ZQorICogQHBhcmFtX3NlY192YWx1ZTogcGFyYW1ldGVyIHNlYyB2YWx1ZQorICogQHBhcmFtX3ZkZXZfaWQ6IHBhcmFtZXRlciB2ZGV2IGlkCisgKiBAcGFyYW1fdnBfZGV2OiBpcyBpdCBwZXIgdmRldi9wZGV2CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBwYXJhbV9pZDsKKwl1aW50MzJfdCBwYXJhbV92YWx1ZTsKKwl1aW50MzJfdCBwYXJhbV9zZWNfdmFsdWU7CisJdWludDMyX3QgcGFyYW1fdmRldl9pZDsKKwl1aW50MzJfdCBwYXJhbV92cF9kZXY7Cit9IHdtYV9jbGlfc2V0X2NtZF90OworCisjaWYgZGVmaW5lZChRQ0FfV0lGSV9GVE0pCisjZGVmaW5lIEFSNktfVE1fREFUQV9NQVhfTEVOICAgIDUwMDAKK3N0cnVjdCBhcjZrX3Rlc3Rtb2RlX2NtZF9kYXRhIHsKKwl2b2lkICpkYXRhOworCWludCBsZW47Cit9OworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworLyoqCisgKiBlbnVtIFdNQV9UZGxzUGVlclN0YXRlIC0gVERMUyBQRUVSIHN0YXRlCisgKiBAV01BX1RETFNfUEVFUl9TVEFURV9QRUVSSU5HOiBwZWVyIGlzIG1ha2luZyBjb25uZWN0aW9uCisgKiBAV01BX1RETFNfUEVFUl9TVEFURV9DT05ORUNURUQ6IHBlZXIgaXMgY29ubmVjdGVkCisgKiBAV01BX1RETFNfUEVFUl9TVEFURV9URUFSRE9XTjogcGVlciBpcyB0ZWFyZG93bgorICovCit0eXBlZGVmIGVudW0geworCVdNQV9URExTX1BFRVJfU1RBVEVfUEVFUklORywKKwlXTUFfVERMU19QRUVSX1NUQVRFX0NPTk5FQ1RFRCwKKwlXTUFfVERMU19QRUVSX1NUQVRFX1RFQVJET1dOLAorfSBXTUFfVGRsc1BlZXJTdGF0ZTsKKworLyoqCisgKiBlbnVtIHdtYV90ZGxzX29mZl9jaGFuX21vZGUgLSBtb2RlcyBmb3IgV01JX1RETFNfU0VUX09GRkNIQU5fTU9ERV9DTURJRAorICogQFdNQV9URExTX0VOQUJMRV9PRkZDSEFOTkVMOiBlbmFibGUgb2ZmIGNoYW5uZWwKKyAqIEBXTUFfVERMU19ESVNBQkxFX09GRkNIQU5ORUw6IGRpc2FibGUgb2ZmIGNoYW5uZWwKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlXTUFfVERMU19FTkFCTEVfT0ZGQ0hBTk5FTCwKKwlXTUFfVERMU19ESVNBQkxFX09GRkNIQU5ORUwKK30gd21hX3RkbHNfb2ZmX2NoYW5fbW9kZTsKKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9URExTICovCisKK3RTaXJSZXRTdGF0dXMgd21hX3Bvc3RfY3RybF9tc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKnBNc2cpOworCit0U2lyUmV0U3RhdHVzIHVfbWFjX3Bvc3RfY3RybF9tc2codm9pZCAqcFNpckdsb2JhbCwgdFNpck1iTXNnICpwTWIpOworCitDREZfU1RBVFVTIHdtYV9zZXRfaWRsZV9wc19jb25maWcodm9pZCAqd21hX3B0ciwgdWludDMyX3QgaWRsZV9wcyk7CitDREZfU1RBVFVTIHdtYV9nZXRfc25yKHRBbmlHZXRTbnJSZXEgKnBzbnJfcmVxKTsKKworQ0RGX1NUQVRVUword21hX2RzX3BlZWtfcnhfcGFja2V0X2luZm8KKwkoY2RzX3BrdF90ICp2b3NEYXRhQnVmZiwgdm9pZCAqKnBwUnhIZWFkZXIsIGJvb2wgYlN3YXApOworCisKK3ZvaWQgd21hX3R4X2Fib3J0KHVpbnQ4X3QgdmRldl9pZCk7CisKK0NERl9TVEFUVVMgd21hX3R4X3BhY2tldCh2b2lkICpwV01BLAorCQkJIHZvaWQgKnBGcm1CdWYsCisJCQkgdWludDE2X3QgZnJtTGVuLAorCQkJIGVGcmFtZVR5cGUgZnJtVHlwZSwKKwkJCSBlRnJhbWVUeERpciB0eERpciwKKwkJCSB1aW50OF90IHRpZCwKKwkJCSBwV01BVHhSeENvbXBGdW5jIHBDb21wRnVuYywKKwkJCSB2b2lkICpwRGF0YSwKKwkJCSBwV01BQWNrRm5UeENvbXAgcEFja1R4Q29tcCwKKwkJCSB1aW50OF90IHR4RmxhZywgdWludDhfdCBzZXNzaW9uSWQsIGJvb2wgdGRsc2ZsYWcsCisJCQkgdWludDE2X3QgY2hhbm5lbF9mcmVxKTsKKworQ0RGX1NUQVRVUyB3bWFfb3Blbih2b2lkICpwX2Nkc19jb250ZXh0LAorCQkgICAgd21hX3RndF9jZmdfY2IgcFRndFVwZENCLAorCQkgICAgd21hX2Rmc19yYWRhcl9pbmRpY2F0aW9uX2NiIHJhZGFyX2luZF9jYiwKKwkJICAgIHRNYWNPcGVuUGFyYW1ldGVycyAqcE1hY1BhcmFtcyk7CisKK3R5cGVkZWYgQ0RGX1NUQVRVUyAoKndtYV9tZ210X2ZyYW1lX3J4X2NhbGxiYWNrKSh2b2lkICpwX2Nkc19nY3R4LAorCQkJCQkgICAgIHZvaWQgKmNkc19idWZmKTsKKworQ0RGX1NUQVRVUyB3bWFfcmVnaXN0ZXJfbWdtdF9mcm1fY2xpZW50KHZvaWQgKnBfY2RzX2djdHgsCisJCQkJd21hX21nbXRfZnJhbWVfcnhfY2FsbGJhY2sgbWdtdF9yeF9jYik7CisKK0NERl9TVEFUVVMgd21hX2RlX3JlZ2lzdGVyX21nbXRfZnJtX2NsaWVudCh2b2lkICpwX2Nkc19nY3R4KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvd21hL3NyYy93bGFuX3FjdF93bWFfbGVnYWN5LmMgYi9jb3JlL3dtYS9zcmMvd2xhbl9xY3Rfd21hX2xlZ2FjeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMWQ0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dtYS9zcmMvd2xhbl9xY3Rfd21hX2xlZ2FjeS5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIERPQzogd2xhbl9xY3Rfd21hX2xlZ2FjeS5jCisgKgorICogVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBEZXZpY2UgQWRhcHRhdGlvbgorICogTGF5ZXIgZm9yIHRoZSBsZWdhY3kgZnVuY3Rpb25hbGl0aWVzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBvbGQgSEFMLgorICoKKyAqIFRoZSBmdW5jdGlvbnMgZXh0ZXJuYWxpemVkIGJ5IHRoaXMgbW9kdWxlIGFyZSB0byBiZSBjYWxsZWQgT05MWSBieSBvdGhlcgorICogV0xBTiBtb2R1bGVzIHRoYXQgcHJvcGVybHkgcmVnaXN0ZXIgd2l0aCB0aGUgVHJhbnNwb3J0IExheWVyIGluaXRpYWxseS4KKyAqCisgKi8KKworLyogU3RhbmRhcmQgaW5jbHVkZSBmaWxlcyAqLworLyogQXBwbGljYXRpb24gU3BlY2lmaWMgaW5jbHVkZSBmaWxlcyAqLworI2luY2x1ZGUgImxpbV9hcGkuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAid21hLmgiCisjaW5jbHVkZSAic21lX3Bvd2VyX3NhdmVfYXBpLmgiCisvKiBMb2NhbGx5IHVzZWQgRGVmaW5lcyAqLworCisjZGVmaW5lIEhBTF9NTUhfTUJfTVNHX1RZUEVfTUFTSyAgICAweEZGMDAKKworLyoqCisgKiB3bWFfcG9zdF9jdHJsX21zZygpIC0gUG9zdHMgV01BIG1lc3NhZ2VzIHRvIE1DIHRocmVhZAorICogQHBNYWM6IE1BQyBwYXJhbWV0ZXJzIHN0cnVjdHVyZQorICogQHBNc2c6IHBvaW50ZXIgd2l0aCBtZXNzYWdlCisgKgorICogUmV0dXJuOiBTdWNjZXNzIG9yIEZhaWx1cmUKKyAqLworCit0U2lyUmV0U3RhdHVzIHdtYV9wb3N0X2N0cmxfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKQoreworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkgICAgY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAoY2RzX21zZ190ICopIHBNc2cpKQorCQlyZXR1cm4gZVNJUl9GQUlMVVJFOworCWVsc2UKKwkJcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfcG9zdF9jZmdfbXNnKCkgLSBQb3N0cyBNTlQgbWVzc2FnZXMgdG8gZ1Npck1udE1zZ1EKKyAqIEBwTWFjOiBNQUMgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKKyAqIEBwTXNnOiBBIHBvaW50ZXIgdG8gdGhlIG1zZworICoKKyAqIFJldHVybjogU3VjY2VzcyBvciBGYWlsdXJlCisgKi8KKwordFNpclJldFN0YXR1cyB3bWFfcG9zdF9jZmdfbXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKQoreworCXRTaXJSZXRTdGF0dXMgcmMgPSBlU0lSX1NVQ0NFU1M7CisKKwlkbyB7CisJCS8qCisJCSAqRm9yIFdpbmRvd3MgYmFzZWQgTUFDLCBpbnN0ZWFkIG9mIHBvc3RpbmcgbWVzc2FnZSB0byBkaWZmZXJlbnQKKwkJICogcXVldWVzIHdlIHdpbGwgY2FsbCB0aGUgaGFuZGxlciByb3V0aW5lcyBkaXJlY3RseQorCQkgKi8KKworCQljZmdfcHJvY2Vzc19tYl9tc2cocE1hYywgKHRTaXJNYk1zZyAqKSBwTXNnLT5ib2R5cHRyKTsKKwkJcmMgPSBlU0lSX1NVQ0NFU1M7CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogdV9tYWNfcG9zdF9jdHJsX21zZygpIC0gcG9zdCBjdHJsIG1zZworICogQHBNYjogQSBwb2ludGVyIHRvIHRoZSBtYWlib3ggbWVzc2FnZQorICoKKyAqIEZvcndhcmRzIHRoZSBjb21wbGV0ZWx5IHJlY2VpdmVkIG1lc3NhZ2UgdG8gdGhlIHJlc3BlY3RpdmUKKyAqIG1vZHVsZXMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAqCisgKiBOT1RFOgorICogIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gbW92ZWQgdG8gdGhlIEFQSSBmaWxlIGJlY2F1c2UgZm9yIE1BQyBydW5uaW5nCisgKiAgb24gV2luZG93cyBob3N0LCB0aGUgaG9zdCBtb2R1bGUgd2lsbCBjYWxsIHRoaXMgcm91dGluZSBkaXJlY3RseSB0bworICogIHNlbmQgYW55IG1haWxib3ggbWVzc2FnZXMuIE1ha2luZyB0aGlzIGZ1bmN0aW9uIGFuIEFQSSBtYWtlcyBzdXJlIHRoYXQKKyAqICBvdXRzaWRlIHdvcmxkIChhbnkgbW9kdWxlIG91dHNpZGUgTU1IKSBvbmx5IGNhbGxzIEFQSXMgdG8gdXNlIE1NSAorICogIHNlcnZpY2VzIGFuZCBub3QgYW4gaW50ZXJuYWwgZnVuY3Rpb24uCisgKgorICogUmV0dXJuOiBzdWNjZXNzL2Vycm9yIGNvZGUKKyAqLworCit0U2lyUmV0U3RhdHVzIHVfbWFjX3Bvc3RfY3RybF9tc2codm9pZCAqcFNpckdsb2JhbCwgdFNpck1iTXNnICpwTWIpCit7CisJdFNpck1zZ1EgbXNnOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpIHBTaXJHbG9iYWw7CisKKwl0U2lyTWJNc2cgKnBNYkxvY2FsOworCW1zZy50eXBlID0gcE1iLT50eXBlOworCW1zZy5ib2R5dmFsID0gMDsKKworCXBNYkxvY2FsID0gY2RmX21lbV9tYWxsb2MocE1iLT5tc2dMZW4pOworCWlmICghcE1iTG9jYWwpIHsKKwkJV01BX0xPR0UoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCEgQ2FuJ3Qgc2VuZCAweCV4XG4iLAorCQkJIG1zZy50eXBlKTsKKwkJcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKwl9CisKKwljZGZfbWVtX2NvcHkoKHZvaWQgKilwTWJMb2NhbCwgKHZvaWQgKilwTWIsIHBNYi0+bXNnTGVuKTsKKwltc2cuYm9keXB0ciA9IHBNYkxvY2FsOworCisJc3dpdGNoIChtc2cudHlwZSAmIEhBTF9NTUhfTUJfTVNHX1RZUEVfTUFTSykgeworCWNhc2UgV01BX01TR19UWVBFU19CRUdJTjogICAgICAgLyogUG9zdHMgYSBtZXNzYWdlIHRvIHRoZSBIQUwgTXNnUSAqLworCQl3bWFfcG9zdF9jdHJsX21zZyhwTWFjLCAmbXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJUl9MSU1fTVNHX1RZUEVTX0JFR0lOOiAgIC8qIFBvc3RzIGEgbWVzc2FnZSB0byB0aGUgTElNIE1zZ1EgKi8KKwkJbGltX3Bvc3RfbXNnX2FwaShwTWFjLCAmbXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJUl9DRkdfTVNHX1RZUEVTX0JFR0lOOiAgIC8qIFBvc3RzIGEgbWVzc2FnZSB0byB0aGUgQ0ZHIE1zZ1EgKi8KKwkJd21hX3Bvc3RfY2ZnX21zZyhwTWFjLCAmbXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJUl9QTU1fTVNHX1RZUEVTX0JFR0lOOiAgIC8qIFBvc3RzIGEgbWVzc2FnZSB0byB0aGUgTElNIE1zZ1EgKi8KKwkJc21lX3Bvc3RfcGVfbWVzc2FnZShwTWFjLCAmbXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJUl9QVFRfTVNHX1RZUEVTX0JFR0lOOgorCQljZGZfbWVtX2ZyZWUobXNnLmJvZHlwdHIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVdNQV9MT0dEKCJVbmtub3duIG1lc3NhZ2UgdHlwZSA9IDB4JVhcbiIsIG1zZy50eXBlKTsKKwkJY2RmX21lbV9mcmVlKG1zZy5ib2R5cHRyKTsKKwkJcmV0dXJuIGVTSVJfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qIHVfbWFjX3Bvc3RfY3RybF9tc2coKSAqLworCmRpZmYgLS1naXQgYS9jb3JlL3dtYS9zcmMvd21hX2RhdGEuYyBiL2NvcmUvd21hL3NyYy93bWFfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Mjg2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dtYS9zcmMvd21hX2RhdGEuYwpAQCAtMCwwICsxLDMwODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogIERPQzogICAgd21hX2RhdGEuYworICogIFRoaXMgZmlsZSBjb250YWlucyB0eC9yeCBhbmQgZGF0YSBwYXRoIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKKy8qIEhlYWRlciBmaWxlcyAqLworCisjaW5jbHVkZSAid21hLmgiCisjaW5jbHVkZSAid21hX2FwaS5oIgorI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJ3bWlfdW5pZmllZF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9zeXMuaCIKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgIndtaV91bmlmaWVkLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJvbF90eHJ4X2N0cmxfYXBpLmgiCisjaW5jbHVkZSAid2xhbl90Z3RfZGVmX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiY2RmX25idWYuaCIKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJvbF90eHJ4X2FwaS5oIgorI2luY2x1ZGUgImNkZl9tZW1vcnkuaCIKKyNpbmNsdWRlICJvbF90eHJ4X3R5cGVzLmgiCisjaW5jbHVkZSAib2xfdHhyeF9wZWVyX2ZpbmQuaCIKKworI2luY2x1ZGUgIndtYV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV9hcGkuaCIKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbl91dGlscy5oIgorCisjaW5jbHVkZSAiY2RzX3V0aWxzLmgiCisKKyNpZiAhZGVmaW5lZChSRU1PVkVfUEtUX0xPRykKKyNpbmNsdWRlICJwa3Rsb2dfYWMuaCIKKyNlbmRpZiAvKiBSRU1PVkVfUEtUX0xPRyAqLworCisjaW5jbHVkZSAiZGJnbG9nX2hvc3QuaCIKKyNpbmNsdWRlICJjc3JfYXBpLmgiCisjaW5jbHVkZSAib2xfZncuaCIKKworI2luY2x1ZGUgImRmcy5oIgorI2luY2x1ZGUgIndtYV9pbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50MzJfdCByYXRlOworCXVpbnQ4X3QgZmxhZzsKK30gd21hX3NlYXJjaF9yYXRlX3Q7CisKKyNkZWZpbmUgV01BX01BWF9PRkRNX0NDS19SQVRFX1RCTF9TSVpFIDEyCisvKiBJbiBvZmRtX2Nja19yYXRlX3RibC0+ZmxhZywgaWYgYml0IDcgaXMgMSBpdCdzIENDSywgb3RoZXJ3aXNlIGl0IG9mZG0uCisgKiBMb3dlciBiaXQgY2FycmllcyB0aGUgb2ZkbS9jY2sgaW5kZXggZm9yIGVuY29kaW5nIHRoZSByYXRlCisgKi8KK3N0YXRpYyB3bWFfc2VhcmNoX3JhdGVfdCBvZmRtX2Nja19yYXRlX3RibFtXTUFfTUFYX09GRE1fQ0NLX1JBVEVfVEJMX1NJWkVdID0geworCXs1NDAsIDR9LCAgICAgICAgICAgICAgIC8qIDQ6IE9GRE0gNTQgTWJwcyAqLworCXs0ODAsIDB9LCAgICAgICAgICAgICAgIC8qIDA6IE9GRE0gNDggTWJwcyAqLworCXszNjAsIDV9LCAgICAgICAgICAgICAgIC8qIDU6IE9GRE0gMzYgTWJwcyAqLworCXsyNDAsIDF9LCAgICAgICAgICAgICAgIC8qIDE6IE9GRE0gMjQgTWJwcyAqLworCXsxODAsIDZ9LCAgICAgICAgICAgICAgIC8qIDY6IE9GRE0gMTggTWJwcyAqLworCXsxMjAsIDJ9LCAgICAgICAgICAgICAgIC8qIDI6IE9GRE0gMTIgTWJwcyAqLworCXsxMTAsICgxIDw8IDcpfSwgICAgICAgIC8qIDA6IENDSyAxMSBNYnBzIExvbmcgKi8KKwl7OTAsIDd9LCAgICAgICAgICAgICAgICAvKiA3OiBPRkRNIDkgTWJwcyAgKi8KKwl7NjAsIDN9LCAgICAgICAgICAgICAgICAvKiAzOiBPRkRNIDYgTWJwcyAgKi8KKwl7NTUsICgoMSA8PCA3KSB8IDEpfSwgICAvKiAxOiBDQ0sgNS41IE1icHMgTG9uZyAqLworCXsyMCwgKCgxIDw8IDcpIHwgMil9LCAgIC8qIDI6IENDSyAyIE1icHMgTG9uZyAgICovCisJezEwLCAoKDEgPDwgNykgfCAzKX0gLyogMzogQ0NLIDEgTWJwcyBMb25nICAgKi8KK307CisKKyNkZWZpbmUgV01BX01BWF9WSFQyMF9SQVRFX1RCTF9TSVpFIDkKKy8qIEluIHZodDIwXzQwMG5zX3JhdGVfdGJsIGZsYWcgY2FycmllcyB0aGUgbWNzIGluZGV4IGZvciBlbmNvZGluZyB0aGUgcmF0ZSAqLworc3RhdGljIHdtYV9zZWFyY2hfcmF0ZV90IHZodDIwXzQwMG5zX3JhdGVfdGJsW1dNQV9NQVhfVkhUMjBfUkFURV9UQkxfU0laRV0gPSB7CisJezg2NywgOH0sICAgICAgICAgICAgICAgLyogTUNTOCAxU1Mgc2hvcnQgR0kgKi8KKwl7NzIyLCA3fSwgICAgICAgICAgICAgICAvKiBNQ1M3IDFTUyBzaG9ydCBHSSAqLworCXs2NTAsIDZ9LCAgICAgICAgICAgICAgIC8qIE1DUzYgMVNTIHNob3J0IEdJICovCisJezU3OCwgNX0sICAgICAgICAgICAgICAgLyogTUNTNSAxU1Mgc2hvcnQgR0kgKi8KKwl7NDMzLCA0fSwgICAgICAgICAgICAgICAvKiBNQ1M0IDFTUyBzaG9ydCBHSSAqLworCXsyODksIDN9LCAgICAgICAgICAgICAgIC8qIE1DUzMgMVNTIHNob3J0IEdJICovCisJezIxNywgMn0sICAgICAgICAgICAgICAgLyogTUNTMiAxU1Mgc2hvcnQgR0kgKi8KKwl7MTQ0LCAxfSwgICAgICAgICAgICAgICAvKiBNQ1MxIDFTUyBzaG9ydCBHSSAqLworCXs3MiwgMH0gLyogTUNTMCAxU1Mgc2hvcnQgR0kgKi8KK307CisKKy8qIEluIHZodDIwXzgwMG5zX3JhdGVfdGJsIGZsYWcgY2FycmllcyB0aGUgbWNzIGluZGV4IGZvciBlbmNvZGluZyB0aGUgcmF0ZSAqLworc3RhdGljIHdtYV9zZWFyY2hfcmF0ZV90IHZodDIwXzgwMG5zX3JhdGVfdGJsW1dNQV9NQVhfVkhUMjBfUkFURV9UQkxfU0laRV0gPSB7CisJezc4MCwgOH0sICAgICAgICAgICAgICAgLyogTUNTOCAxU1MgbG9uZyBHSSAqLworCXs2NTAsIDd9LCAgICAgICAgICAgICAgIC8qIE1DUzcgMVNTIGxvbmcgR0kgKi8KKwl7NTg1LCA2fSwgICAgICAgICAgICAgICAvKiBNQ1M2IDFTUyBsb25nIEdJICovCisJezUyMCwgNX0sICAgICAgICAgICAgICAgLyogTUNTNSAxU1MgbG9uZyBHSSAqLworCXszOTAsIDR9LCAgICAgICAgICAgICAgIC8qIE1DUzQgMVNTIGxvbmcgR0kgKi8KKwl7MjYwLCAzfSwgICAgICAgICAgICAgICAvKiBNQ1MzIDFTUyBsb25nIEdJICovCisJezE5NSwgMn0sICAgICAgICAgICAgICAgLyogTUNTMiAxU1MgbG9uZyBHSSAqLworCXsxMzAsIDF9LCAgICAgICAgICAgICAgIC8qIE1DUzEgMVNTIGxvbmcgR0kgKi8KKwl7NjUsIDB9IC8qIE1DUzAgMVNTIGxvbmcgR0kgKi8KK307CisKKyNkZWZpbmUgV01BX01BWF9WSFQ0MF9SQVRFX1RCTF9TSVpFIDEwCisvKiBJbiB2aHQ0MF80MDBuc19yYXRlX3RibCBmbGFnIGNhcnJpZXMgdGhlIG1jcyBpbmRleCBmb3IgZW5jb2RpbmcgdGhlIHJhdGUgKi8KK3N0YXRpYyB3bWFfc2VhcmNoX3JhdGVfdCB2aHQ0MF80MDBuc19yYXRlX3RibFtXTUFfTUFYX1ZIVDQwX1JBVEVfVEJMX1NJWkVdID0geworCXsyMDAwLCA5fSwgICAgICAgICAgICAgIC8qIE1DUzkgMVNTIHNob3J0IEdJICovCisJezE4MDAsIDh9LCAgICAgICAgICAgICAgLyogTUNTOCAxU1Mgc2hvcnQgR0kgKi8KKwl7MTUwMCwgN30sICAgICAgICAgICAgICAvKiBNQ1M3IDFTUyBzaG9ydCBHSSAqLworCXsxMzUwLCA2fSwgICAgICAgICAgICAgIC8qIE1DUzYgMVNTIHNob3J0IEdJICovCisJezEyMDAsIDV9LCAgICAgICAgICAgICAgLyogTUNTNSAxU1Mgc2hvcnQgR0kgKi8KKwl7OTAwLCA0fSwgICAgICAgICAgICAgICAvKiBNQ1M0IDFTUyBzaG9ydCBHSSAqLworCXs2MDAsIDN9LCAgICAgICAgICAgICAgIC8qIE1DUzMgMVNTIHNob3J0IEdJICovCisJezQ1MCwgMn0sICAgICAgICAgICAgICAgLyogTUNTMiAxU1Mgc2hvcnQgR0kgKi8KKwl7MzAwLCAxfSwgICAgICAgICAgICAgICAvKiBNQ1MxIDFTUyBzaG9ydCBHSSAqLworCXsxNTAsIDB9LCAgICAgICAgICAgICAgIC8qIE1DUzAgMVNTIHNob3J0IEdJICovCit9OworCitzdGF0aWMgd21hX3NlYXJjaF9yYXRlX3Qgdmh0NDBfODAwbnNfcmF0ZV90YmxbV01BX01BWF9WSFQ0MF9SQVRFX1RCTF9TSVpFXSA9IHsKKwl7MTgwMCwgOX0sICAgICAgICAgICAgICAvKiBNQ1M5IDFTUyBsb25nIEdJICovCisJezE2MjAsIDh9LCAgICAgICAgICAgICAgLyogTUNTOCAxU1MgbG9uZyBHSSAqLworCXsxMzUwLCA3fSwgICAgICAgICAgICAgIC8qIE1DUzcgMVNTIGxvbmcgR0kgKi8KKwl7MTIxNSwgNn0sICAgICAgICAgICAgICAvKiBNQ1M2IDFTUyBsb25nIEdJICovCisJezEwODAsIDV9LCAgICAgICAgICAgICAgLyogTUNTNSAxU1MgbG9uZyBHSSAqLworCXs4MTAsIDR9LCAgICAgICAgICAgICAgIC8qIE1DUzQgMVNTIGxvbmcgR0kgKi8KKwl7NTQwLCAzfSwgICAgICAgICAgICAgICAvKiBNQ1MzIDFTUyBsb25nIEdJICovCisJezQwNSwgMn0sICAgICAgICAgICAgICAgLyogTUNTMiAxU1MgbG9uZyBHSSAqLworCXsyNzAsIDF9LCAgICAgICAgICAgICAgIC8qIE1DUzEgMVNTIGxvbmcgR0kgKi8KKwl7MTM1LCAwfSAvKiBNQ1MwIDFTUyBsb25nIEdJICovCit9OworCisjZGVmaW5lIFdNQV9NQVhfVkhUODBfUkFURV9UQkxfU0laRSAxMAorc3RhdGljIHdtYV9zZWFyY2hfcmF0ZV90IHZodDgwXzQwMG5zX3JhdGVfdGJsW1dNQV9NQVhfVkhUODBfUkFURV9UQkxfU0laRV0gPSB7CisJezQzMzMsIDl9LCAgICAgICAgICAgICAgLyogTUNTOSAxU1Mgc2hvcnQgR0kgKi8KKwl7MzkwMCwgOH0sICAgICAgICAgICAgICAvKiBNQ1M4IDFTUyBzaG9ydCBHSSAqLworCXszMjUwLCA3fSwgICAgICAgICAgICAgIC8qIE1DUzcgMVNTIHNob3J0IEdJICovCisJezI5MjUsIDZ9LCAgICAgICAgICAgICAgLyogTUNTNiAxU1Mgc2hvcnQgR0kgKi8KKwl7MjYwMCwgNX0sICAgICAgICAgICAgICAvKiBNQ1M1IDFTUyBzaG9ydCBHSSAqLworCXsxOTUwLCA0fSwgICAgICAgICAgICAgIC8qIE1DUzQgMVNTIHNob3J0IEdJICovCisJezEzMDAsIDN9LCAgICAgICAgICAgICAgLyogTUNTMyAxU1Mgc2hvcnQgR0kgKi8KKwl7OTc1LCAyfSwgICAgICAgICAgICAgICAvKiBNQ1MyIDFTUyBzaG9ydCBHSSAqLworCXs2NTAsIDF9LCAgICAgICAgICAgICAgIC8qIE1DUzEgMVNTIHNob3J0IEdJICovCisJezMyNSwgMH0gLyogTUNTMCAxU1Mgc2hvcnQgR0kgKi8KK307CisKK3N0YXRpYyB3bWFfc2VhcmNoX3JhdGVfdCB2aHQ4MF84MDBuc19yYXRlX3RibFtXTUFfTUFYX1ZIVDgwX1JBVEVfVEJMX1NJWkVdID0geworCXszOTAwLCA5fSwgICAgICAgICAgICAgIC8qIE1DUzkgMVNTIGxvbmcgR0kgKi8KKwl7MzUxMCwgOH0sICAgICAgICAgICAgICAvKiBNQ1M4IDFTUyBsb25nIEdJICovCisJezI5MjUsIDd9LCAgICAgICAgICAgICAgLyogTUNTNyAxU1MgbG9uZyBHSSAqLworCXsyNjMzLCA2fSwgICAgICAgICAgICAgIC8qIE1DUzYgMVNTIGxvbmcgR0kgKi8KKwl7MjM0MCwgNX0sICAgICAgICAgICAgICAvKiBNQ1M1IDFTUyBsb25nIEdJICovCisJezE3NTUsIDR9LCAgICAgICAgICAgICAgLyogTUNTNCAxU1MgbG9uZyBHSSAqLworCXsxMTcwLCAzfSwgICAgICAgICAgICAgIC8qIE1DUzMgMVNTIGxvbmcgR0kgKi8KKwl7ODc4LCAyfSwgICAgICAgICAgICAgICAvKiBNQ1MyIDFTUyBsb25nIEdJICovCisJezU4NSwgMX0sICAgICAgICAgICAgICAgLyogTUNTMSAxU1MgbG9uZyBHSSAqLworCXsyOTMsIDB9IC8qIE1DUzAgMVNTIGxvbmcgR0kgKi8KK307CisKKyNkZWZpbmUgV01BX01BWF9IVDIwX1JBVEVfVEJMX1NJWkUgOAorc3RhdGljIHdtYV9zZWFyY2hfcmF0ZV90IGh0MjBfNDAwbnNfcmF0ZV90YmxbV01BX01BWF9IVDIwX1JBVEVfVEJMX1NJWkVdID0geworCXs3MjIsIDd9LCAgICAgICAgICAgICAgIC8qIE1DUzcgMVNTIHNob3J0IEdJICovCisJezY1MCwgNn0sICAgICAgICAgICAgICAgLyogTUNTNiAxU1Mgc2hvcnQgR0kgKi8KKwl7NTc4LCA1fSwgICAgICAgICAgICAgICAvKiBNQ1M1IDFTUyBzaG9ydCBHSSAqLworCXs0MzMsIDR9LCAgICAgICAgICAgICAgIC8qIE1DUzQgMVNTIHNob3J0IEdJICovCisJezI4OSwgM30sICAgICAgICAgICAgICAgLyogTUNTMyAxU1Mgc2hvcnQgR0kgKi8KKwl7MjE3LCAyfSwgICAgICAgICAgICAgICAvKiBNQ1MyIDFTUyBzaG9ydCBHSSAqLworCXsxNDQsIDF9LCAgICAgICAgICAgICAgIC8qIE1DUzEgMVNTIHNob3J0IEdJICovCisJezcyLCAwfSAvKiBNQ1MwIDFTUyBzaG9ydCBHSSAqLworfTsKKworc3RhdGljIHdtYV9zZWFyY2hfcmF0ZV90IGh0MjBfODAwbnNfcmF0ZV90YmxbV01BX01BWF9IVDIwX1JBVEVfVEJMX1NJWkVdID0geworCXs2NTAsIDd9LCAgICAgICAgICAgICAgIC8qIE1DUzcgMVNTIGxvbmcgR0kgKi8KKwl7NTg1LCA2fSwgICAgICAgICAgICAgICAvKiBNQ1M2IDFTUyBsb25nIEdJICovCisJezUyMCwgNX0sICAgICAgICAgICAgICAgLyogTUNTNSAxU1MgbG9uZyBHSSAqLworCXszOTAsIDR9LCAgICAgICAgICAgICAgIC8qIE1DUzQgMVNTIGxvbmcgR0kgKi8KKwl7MjYwLCAzfSwgICAgICAgICAgICAgICAvKiBNQ1MzIDFTUyBsb25nIEdJICovCisJezE5NSwgMn0sICAgICAgICAgICAgICAgLyogTUNTMiAxU1MgbG9uZyBHSSAqLworCXsxMzAsIDF9LCAgICAgICAgICAgICAgIC8qIE1DUzEgMVNTIGxvbmcgR0kgKi8KKwl7NjUsIDB9IC8qIE1DUzAgMVNTIGxvbmcgR0kgKi8KK307CisKKyNkZWZpbmUgV01BX01BWF9IVDQwX1JBVEVfVEJMX1NJWkUgOAorc3RhdGljIHdtYV9zZWFyY2hfcmF0ZV90IGh0NDBfNDAwbnNfcmF0ZV90YmxbV01BX01BWF9IVDQwX1JBVEVfVEJMX1NJWkVdID0geworCXsxNTAwLCA3fSwgICAgICAgICAgICAgIC8qIE1DUzcgMVNTIHNob3J0IEdJICovCisJezEzNTAsIDZ9LCAgICAgICAgICAgICAgLyogTUNTNiAxU1Mgc2hvcnQgR0kgKi8KKwl7MTIwMCwgNX0sICAgICAgICAgICAgICAvKiBNQ1M1IDFTUyBzaG9ydCBHSSAqLworCXs5MDAsIDR9LCAgICAgICAgICAgICAgIC8qIE1DUzQgMVNTIHNob3J0IEdJICovCisJezYwMCwgM30sICAgICAgICAgICAgICAgLyogTUNTMyAxU1Mgc2hvcnQgR0kgKi8KKwl7NDUwLCAyfSwgICAgICAgICAgICAgICAvKiBNQ1MyIDFTUyBzaG9ydCBHSSAqLworCXszMDAsIDF9LCAgICAgICAgICAgICAgIC8qIE1DUzEgMVNTIHNob3J0IEdJICovCisJezE1MCwgMH0gLyogTUNTMCAxU1Mgc2hvcnQgR0kgKi8KK307CisKK3N0YXRpYyB3bWFfc2VhcmNoX3JhdGVfdCBodDQwXzgwMG5zX3JhdGVfdGJsW1dNQV9NQVhfSFQ0MF9SQVRFX1RCTF9TSVpFXSA9IHsKKwl7MTM1MCwgN30sICAgICAgICAgICAgICAvKiBNQ1M3IDFTUyBsb25nIEdJICovCisJezEyMTUsIDZ9LCAgICAgICAgICAgICAgLyogTUNTNiAxU1MgbG9uZyBHSSAqLworCXsxMDgwLCA1fSwgICAgICAgICAgICAgIC8qIE1DUzUgMVNTIGxvbmcgR0kgKi8KKwl7ODEwLCA0fSwgICAgICAgICAgICAgICAvKiBNQ1M0IDFTUyBsb25nIEdJICovCisJezU0MCwgM30sICAgICAgICAgICAgICAgLyogTUNTMyAxU1MgbG9uZyBHSSAqLworCXs0MDUsIDJ9LCAgICAgICAgICAgICAgIC8qIE1DUzIgMVNTIGxvbmcgR0kgKi8KKwl7MjcwLCAxfSwgICAgICAgICAgICAgICAvKiBNQ1MxIDFTUyBsb25nIEdJICovCisJezEzNSwgMH0gLyogTUNTMCAxU1MgbG9uZyBHSSAqLworfTsKKworLyoqCisgKiB3bWFfYmluX3NlYXJjaF9yYXRlKCkgLSBiaW5hcnkgc2VhcmNoIGZ1bmN0aW9uIHRvIGZpbmQgcmF0ZQorICogQHRibDogcmF0ZSB0YWJsZQorICogQHRibF9zaXplOiB0YWJsZSBzaXplCisgKiBAbWJwc3gxMF9yYXRlOiByZXR1cm4gbWJwcyByYXRlCisgKiBAcmV0X2ZsYWc6IHJldHVybiBmbGFnCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9iaW5fc2VhcmNoX3JhdGUod21hX3NlYXJjaF9yYXRlX3QgKnRibCwgaW50MzJfdCB0Ymxfc2l6ZSwKKwkJCQlpbnQzMl90ICptYnBzeDEwX3JhdGUsIHVpbnQ4X3QgKnJldF9mbGFnKQoreworCWludDMyX3QgdXBwZXIsIGxvd2VyLCBtaWQ7CisKKwkvKiB0aGUgdGFibGUgaXMgZGVzY2VudGluZy4gaW5kZXggaG9sZHMgdGhlIGxhcmdlc3QgdmFsdWUgYW5kIHRoZQorCSAqIGJvdHRvbSBpbmRleCBob2xkcyB0aGUgc21hbGxlc3QgdmFsdWUgKi8KKworCXVwcGVyID0gMDsgICAgICAgICAgICAgIC8qIGluZGV4IDAgKi8KKwlsb3dlciA9IHRibF9zaXplIC0gMTsgICAvKiBsYXN0IGluZGV4ICovCisKKwlpZiAoKm1icHN4MTBfcmF0ZSA+PSB0YmxbdXBwZXJdLnJhdGUpIHsKKwkJLyogdXNlIHRoZSBsYXJnZXN0IHJhdGUgKi8KKwkJKm1icHN4MTBfcmF0ZSA9IHRibFt1cHBlcl0ucmF0ZTsKKwkJKnJldF9mbGFnID0gdGJsW3VwcGVyXS5mbGFnOworCQlyZXR1cm47CisJfSBlbHNlIGlmICgqbWJwc3gxMF9yYXRlIDw9IHRibFtsb3dlcl0ucmF0ZSkgeworCQkvKiB1c2UgdGhlIHNtYWxsZXN0IHJhdGUgKi8KKwkJKm1icHN4MTBfcmF0ZSA9IHRibFtsb3dlcl0ucmF0ZTsKKwkJKnJldF9mbGFnID0gdGJsW2xvd2VyXS5mbGFnOworCQlyZXR1cm47CisJfQorCS8qIG5vdyB3ZSBkbyBiaW5lcnkgc2VhcmNoIHRvIGdldCB0aGUgZmxvb3IgdmFsdWUgKi8KKwl3aGlsZSAobG93ZXIgLSB1cHBlciA+IDEpIHsKKwkJbWlkID0gKHVwcGVyICsgbG93ZXIpID4+IDE7CisJCWlmICgqbWJwc3gxMF9yYXRlID09IHRibFttaWRdLnJhdGUpIHsKKwkJCS8qIGZvdW5kIHRoZSBleGFjdCBtYXRjaCAqLworCQkJKm1icHN4MTBfcmF0ZSA9IHRibFttaWRdLnJhdGU7CisJCQkqcmV0X2ZsYWcgPSB0YmxbbWlkXS5mbGFnOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJLyogbm90IGZvdW5kLiBpZiBtaWQncyByYXRlIGlzIGxhcmdlciB0aGFuIGlucHV0IG1vdmUKKwkJCSAqIHVwcGVyIHRvIG1pZC4gSWYgbWlkJ3MgcmF0ZSBpcyBsYXJnZXIgdGhhbiBpbnB1dAorCQkJICogbW92ZSBsb3dlciB0byBtaWQuCisJCQkgKi8KKwkJCWlmICgqbWJwc3gxMF9yYXRlID4gdGJsW21pZF0ucmF0ZSkKKwkJCQlsb3dlciA9IG1pZDsKKwkJCWVsc2UKKwkJCQl1cHBlciA9IG1pZDsKKwkJfQorCX0KKwkvKiBhZnRlciB0aGUgYmluIHNlYXJjaCB0aGUgaW5kZXggaXMgdGhlIGNlaWxpbmcgb2YgcmF0ZSAqLworCSptYnBzeDEwX3JhdGUgPSB0YmxbdXBwZXJdLnJhdGU7CisJKnJldF9mbGFnID0gdGJsW3VwcGVyXS5mbGFnOworCXJldHVybjsKK30KKworLyoqCisgKiB3bWFfZmlsbF9vZmRtX2Nja19tY2FzdF9yYXRlKCkgLSBmaWxsIG9mZG0gY2NrIG1jYXN0IHJhdGUKKyAqIEBtYnBzeDEwX3JhdGU6IG1icHMgcmF0ZXMKKyAqIEBuc3M6IG5zcworICogQHJhdGU6IHJhdGUKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworc3RhdGljIENERl9TVEFUVVMgd21hX2ZpbGxfb2ZkbV9jY2tfbWNhc3RfcmF0ZShpbnQzMl90IG1icHN4MTBfcmF0ZSwKKwkJCQkJICAgICAgIHVpbnQ4X3QgbnNzLCB1aW50OF90ICpyYXRlKQoreworCXVpbnQ4X3QgaWR4ID0gMDsKKwl3bWFfYmluX3NlYXJjaF9yYXRlKG9mZG1fY2NrX3JhdGVfdGJsLCBXTUFfTUFYX09GRE1fQ0NLX1JBVEVfVEJMX1NJWkUsCisJCQkgICAgJm1icHN4MTBfcmF0ZSwgJmlkeCk7CisKKwkvKiBpZiBiaXQgNyBpcyBzZXQgaXQgdXNlcyBDQ0sgKi8KKwlpZiAoaWR4ICYgMHg4MCkKKwkJKnJhdGUgfD0gKDEgPDwgNikgfCAoaWR4ICYgMHhGKTsgLyogc2V0IGJpdCA2IHRvIDEgZm9yIENDSyAqLworCWVsc2UKKwkJKnJhdGUgfD0gKGlkeCAmIDB4Rik7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfc2V0X2h0X3ZodF9tY2FzdF9yYXRlKCkgLSBzZXQgaHQvdmh0IG1jYXN0IHJhdGUKKyAqIEBzaG9ydGdpOiBzaG9ydCBnYXVyZCBpbnRlcnZhbAorICogQG1icHN4MTBfcmF0ZTogbWJwcyByYXRlcworICogQHNnaV9pZHg6IHNob3J0Z2kgaW5kZXgKKyAqIEBzZ2lfcmF0ZTogc2hvcnRnaSByYXRlCisgKiBAbGdpX2lkeDogbG9uZ2dpIGluZGV4CisgKiBAbGdpX3JhdGU6IGxvbmdnaSByYXRlCisgKiBAcHJlbWFibGU6IHByZWFtYmxlCisgKiBAcmF0ZTogcmF0ZQorICogQHN0cmVhbWluZ19yYXRlOiBzdHJlYW1pbmcgcmF0ZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfc2V0X2h0X3ZodF9tY2FzdF9yYXRlKHVpbnQzMl90IHNob3J0Z2ksIGludDMyX3QgbWJwc3gxMF9yYXRlLAorCQkJCSAgICAgIHVpbnQ4X3Qgc2dpX2lkeCwgaW50MzJfdCBzZ2lfcmF0ZSwKKwkJCQkgICAgICB1aW50OF90IGxnaV9pZHgsIGludDMyX3QgbGdpX3JhdGUsCisJCQkJICAgICAgdWludDhfdCBwcmVtYWJsZSwgdWludDhfdCAqcmF0ZSwKKwkJCQkgICAgICBpbnQzMl90ICpzdHJlYW1pbmdfcmF0ZSkKK3sKKwlpZiAoc2hvcnRnaSA9PSAwKSB7CisJCSpyYXRlIHw9IChwcmVtYWJsZSA8PCA2KSB8IChsZ2lfaWR4ICYgMHhGKTsKKwkJKnN0cmVhbWluZ19yYXRlID0gbGdpX3JhdGU7CisJfSBlbHNlIHsKKwkJKnJhdGUgfD0gKHByZW1hYmxlIDw8IDYpIHwgKHNnaV9pZHggJiAweEYpOworCQkqc3RyZWFtaW5nX3JhdGUgPSBzZ2lfcmF0ZTsKKwl9Cit9CisKKy8qKgorICogd21hX2ZpbGxfaHQyMF9tY2FzdF9yYXRlKCkgLSBmaWxsIGh0MjAgbWNhc3QgcmF0ZQorICogQHNob3J0Z2k6IHNob3J0IGdhdXJkIGludGVydmFsCisgKiBAbWJwc3gxMF9yYXRlOiBtYnBzIHJhdGVzCisgKiBAbnNzOiBuc3MKKyAqIEByYXRlOiByYXRlCisgKiBAc3RyZWFtaW5nX3JhdGU6IHN0cmVhbWluZyByYXRlCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdtYV9maWxsX2h0MjBfbWNhc3RfcmF0ZSh1aW50MzJfdCBzaG9ydGdpLAorCQkJCQkgICBpbnQzMl90IG1icHN4MTBfcmF0ZSwgdWludDhfdCBuc3MsCisJCQkJCSAgIHVpbnQ4X3QgKnJhdGUsCisJCQkJCSAgIGludDMyX3QgKnN0cmVhbWluZ19yYXRlKQoreworCXVpbnQ4X3Qgc2dpX2lkeCA9IDAsIGxnaV9pZHggPSAwOworCWludDMyX3Qgc2dpX3JhdGUsIGxnaV9yYXRlOworCWlmIChuc3MgPT0gMSkKKwkJbWJwc3gxMF9yYXRlID0gbWJwc3gxMF9yYXRlID4+IDE7CisKKwlzZ2lfcmF0ZSA9IG1icHN4MTBfcmF0ZTsKKwlsZ2lfcmF0ZSA9IG1icHN4MTBfcmF0ZTsKKwlpZiAoc2hvcnRnaSkKKwkJd21hX2Jpbl9zZWFyY2hfcmF0ZShodDIwXzQwMG5zX3JhdGVfdGJsLAorCQkJCSAgICBXTUFfTUFYX0hUMjBfUkFURV9UQkxfU0laRSwgJnNnaV9yYXRlLAorCQkJCSAgICAmc2dpX2lkeCk7CisJZWxzZQorCQl3bWFfYmluX3NlYXJjaF9yYXRlKGh0MjBfODAwbnNfcmF0ZV90YmwsCisJCQkJICAgIFdNQV9NQVhfSFQyMF9SQVRFX1RCTF9TSVpFLCAmbGdpX3JhdGUsCisJCQkJICAgICZsZ2lfaWR4KTsKKworCXdtYV9zZXRfaHRfdmh0X21jYXN0X3JhdGUoc2hvcnRnaSwgbWJwc3gxMF9yYXRlLCBzZ2lfaWR4LCBzZ2lfcmF0ZSwKKwkJCQkgIGxnaV9pZHgsIGxnaV9yYXRlLCAyLCByYXRlLCBzdHJlYW1pbmdfcmF0ZSk7CisJaWYgKG5zcyA9PSAxKQorCQkqc3RyZWFtaW5nX3JhdGUgPSAqc3RyZWFtaW5nX3JhdGUgPDwgMTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9maWxsX2h0NDBfbWNhc3RfcmF0ZSgpIC0gZmlsbCBodDQwIG1jYXN0IHJhdGUKKyAqIEBzaG9ydGdpOiBzaG9ydCBnYXVyZCBpbnRlcnZhbAorICogQG1icHN4MTBfcmF0ZTogbWJwcyByYXRlcworICogQG5zczogbnNzCisgKiBAcmF0ZTogcmF0ZQorICogQHN0cmVhbWluZ19yYXRlOiBzdHJlYW1pbmcgcmF0ZQorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitzdGF0aWMgQ0RGX1NUQVRVUyB3bWFfZmlsbF9odDQwX21jYXN0X3JhdGUodWludDMyX3Qgc2hvcnRnaSwKKwkJCQkJICAgaW50MzJfdCBtYnBzeDEwX3JhdGUsIHVpbnQ4X3QgbnNzLAorCQkJCQkgICB1aW50OF90ICpyYXRlLAorCQkJCQkgICBpbnQzMl90ICpzdHJlYW1pbmdfcmF0ZSkKK3sKKwl1aW50OF90IHNnaV9pZHggPSAwLCBsZ2lfaWR4ID0gMDsKKwlpbnQzMl90IHNnaV9yYXRlLCBsZ2lfcmF0ZTsKKworCS8qIGZvciAyeDIgZGl2aWRlIHRoZSByYXRlIGJ5IDIgKi8KKwlpZiAobnNzID09IDEpCisJCW1icHN4MTBfcmF0ZSA9IG1icHN4MTBfcmF0ZSA+PiAxOworCisJc2dpX3JhdGUgPSBtYnBzeDEwX3JhdGU7CisJbGdpX3JhdGUgPSBtYnBzeDEwX3JhdGU7CisJaWYgKHNob3J0Z2kpCisJCXdtYV9iaW5fc2VhcmNoX3JhdGUoaHQ0MF80MDBuc19yYXRlX3RibCwKKwkJCQkgICAgV01BX01BWF9IVDQwX1JBVEVfVEJMX1NJWkUsICZzZ2lfcmF0ZSwKKwkJCQkgICAgJnNnaV9pZHgpOworCWVsc2UKKwkJd21hX2Jpbl9zZWFyY2hfcmF0ZShodDQwXzgwMG5zX3JhdGVfdGJsLAorCQkJCSAgICBXTUFfTUFYX0hUNDBfUkFURV9UQkxfU0laRSwgJmxnaV9yYXRlLAorCQkJCSAgICAmbGdpX2lkeCk7CisKKwl3bWFfc2V0X2h0X3ZodF9tY2FzdF9yYXRlKHNob3J0Z2ksIG1icHN4MTBfcmF0ZSwgc2dpX2lkeCwgc2dpX3JhdGUsCisJCQkJICBsZ2lfaWR4LCBsZ2lfcmF0ZSwgMiwgcmF0ZSwgc3RyZWFtaW5nX3JhdGUpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfZmlsbF92aHQyMF9tY2FzdF9yYXRlKCkgLSBmaWxsIHZodDIwIG1jYXN0IHJhdGUKKyAqIEBzaG9ydGdpOiBzaG9ydCBnYXVyZCBpbnRlcnZhbAorICogQG1icHN4MTBfcmF0ZTogbWJwcyByYXRlcworICogQG5zczogbnNzCisgKiBAcmF0ZTogcmF0ZQorICogQHN0cmVhbWluZ19yYXRlOiBzdHJlYW1pbmcgcmF0ZQorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitzdGF0aWMgQ0RGX1NUQVRVUyB3bWFfZmlsbF92aHQyMF9tY2FzdF9yYXRlKHVpbnQzMl90IHNob3J0Z2ksCisJCQkJCSAgICBpbnQzMl90IG1icHN4MTBfcmF0ZSwgdWludDhfdCBuc3MsCisJCQkJCSAgICB1aW50OF90ICpyYXRlLAorCQkJCQkgICAgaW50MzJfdCAqc3RyZWFtaW5nX3JhdGUpCit7CisJdWludDhfdCBzZ2lfaWR4ID0gMCwgbGdpX2lkeCA9IDA7CisJaW50MzJfdCBzZ2lfcmF0ZSwgbGdpX3JhdGU7CisKKwkvKiBmb3IgMngyIGRpdmlkZSB0aGUgcmF0ZSBieSAyICovCisJaWYgKG5zcyA9PSAxKQorCQltYnBzeDEwX3JhdGUgPSBtYnBzeDEwX3JhdGUgPj4gMTsKKworCXNnaV9yYXRlID0gbWJwc3gxMF9yYXRlOworCWxnaV9yYXRlID0gbWJwc3gxMF9yYXRlOworCWlmIChzaG9ydGdpKQorCQl3bWFfYmluX3NlYXJjaF9yYXRlKHZodDIwXzQwMG5zX3JhdGVfdGJsLAorCQkJCSAgICBXTUFfTUFYX1ZIVDIwX1JBVEVfVEJMX1NJWkUsICZzZ2lfcmF0ZSwKKwkJCQkgICAgJnNnaV9pZHgpOworCWVsc2UKKwkJd21hX2Jpbl9zZWFyY2hfcmF0ZSh2aHQyMF84MDBuc19yYXRlX3RibCwKKwkJCQkgICAgV01BX01BWF9WSFQyMF9SQVRFX1RCTF9TSVpFLCAmbGdpX3JhdGUsCisJCQkJICAgICZsZ2lfaWR4KTsKKworCXdtYV9zZXRfaHRfdmh0X21jYXN0X3JhdGUoc2hvcnRnaSwgbWJwc3gxMF9yYXRlLCBzZ2lfaWR4LCBzZ2lfcmF0ZSwKKwkJCQkgIGxnaV9pZHgsIGxnaV9yYXRlLCAzLCByYXRlLCBzdHJlYW1pbmdfcmF0ZSk7CisJaWYgKG5zcyA9PSAxKQorCQkqc3RyZWFtaW5nX3JhdGUgPSAqc3RyZWFtaW5nX3JhdGUgPDwgMTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9maWxsX3ZodDQwX21jYXN0X3JhdGUoKSAtIGZpbGwgdmh0NDAgbWNhc3QgcmF0ZQorICogQHNob3J0Z2k6IHNob3J0IGdhdXJkIGludGVydmFsCisgKiBAbWJwc3gxMF9yYXRlOiBtYnBzIHJhdGVzCisgKiBAbnNzOiBuc3MKKyAqIEByYXRlOiByYXRlCisgKiBAc3RyZWFtaW5nX3JhdGU6IHN0cmVhbWluZyByYXRlCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdtYV9maWxsX3ZodDQwX21jYXN0X3JhdGUodWludDMyX3Qgc2hvcnRnaSwKKwkJCQkJICAgIGludDMyX3QgbWJwc3gxMF9yYXRlLCB1aW50OF90IG5zcywKKwkJCQkJICAgIHVpbnQ4X3QgKnJhdGUsCisJCQkJCSAgICBpbnQzMl90ICpzdHJlYW1pbmdfcmF0ZSkKK3sKKwl1aW50OF90IHNnaV9pZHggPSAwLCBsZ2lfaWR4ID0gMDsKKwlpbnQzMl90IHNnaV9yYXRlLCBsZ2lfcmF0ZTsKKworCS8qIGZvciAyeDIgZGl2aWRlIHRoZSByYXRlIGJ5IDIgKi8KKwlpZiAobnNzID09IDEpCisJCW1icHN4MTBfcmF0ZSA9IG1icHN4MTBfcmF0ZSA+PiAxOworCisJc2dpX3JhdGUgPSBtYnBzeDEwX3JhdGU7CisJbGdpX3JhdGUgPSBtYnBzeDEwX3JhdGU7CisJaWYgKHNob3J0Z2kpCisJCXdtYV9iaW5fc2VhcmNoX3JhdGUodmh0NDBfNDAwbnNfcmF0ZV90YmwsCisJCQkJICAgIFdNQV9NQVhfVkhUNDBfUkFURV9UQkxfU0laRSwgJnNnaV9yYXRlLAorCQkJCSAgICAmc2dpX2lkeCk7CisJZWxzZQorCQl3bWFfYmluX3NlYXJjaF9yYXRlKHZodDQwXzgwMG5zX3JhdGVfdGJsLAorCQkJCSAgICBXTUFfTUFYX1ZIVDQwX1JBVEVfVEJMX1NJWkUsICZsZ2lfcmF0ZSwKKwkJCQkgICAgJmxnaV9pZHgpOworCisJd21hX3NldF9odF92aHRfbWNhc3RfcmF0ZShzaG9ydGdpLCBtYnBzeDEwX3JhdGUsCisJCQkJICBzZ2lfaWR4LCBzZ2lfcmF0ZSwgbGdpX2lkeCwgbGdpX3JhdGUsCisJCQkJICAzLCByYXRlLCBzdHJlYW1pbmdfcmF0ZSk7CisJaWYgKG5zcyA9PSAxKQorCQkqc3RyZWFtaW5nX3JhdGUgPSAqc3RyZWFtaW5nX3JhdGUgPDwgMTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9maWxsX3ZodDgwX21jYXN0X3JhdGUoKSAtIGZpbGwgdmh0ODAgbWNhc3QgcmF0ZQorICogQHNob3J0Z2k6IHNob3J0IGdhdXJkIGludGVydmFsCisgKiBAbWJwc3gxMF9yYXRlOiBtYnBzIHJhdGVzCisgKiBAbnNzOiBuc3MKKyAqIEByYXRlOiByYXRlCisgKiBAc3RyZWFtaW5nX3JhdGU6IHN0cmVhbWluZyByYXRlCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdtYV9maWxsX3ZodDgwX21jYXN0X3JhdGUodWludDMyX3Qgc2hvcnRnaSwKKwkJCQkJICAgIGludDMyX3QgbWJwc3gxMF9yYXRlLCB1aW50OF90IG5zcywKKwkJCQkJICAgIHVpbnQ4X3QgKnJhdGUsCisJCQkJCSAgICBpbnQzMl90ICpzdHJlYW1pbmdfcmF0ZSkKK3sKKwl1aW50OF90IHNnaV9pZHggPSAwLCBsZ2lfaWR4ID0gMDsKKwlpbnQzMl90IHNnaV9yYXRlLCBsZ2lfcmF0ZTsKKworCS8qIGZvciAyeDIgZGl2aWRlIHRoZSByYXRlIGJ5IDIgKi8KKwlpZiAobnNzID09IDEpCisJCW1icHN4MTBfcmF0ZSA9IG1icHN4MTBfcmF0ZSA+PiAxOworCisJc2dpX3JhdGUgPSBtYnBzeDEwX3JhdGU7CisJbGdpX3JhdGUgPSBtYnBzeDEwX3JhdGU7CisJaWYgKHNob3J0Z2kpCisJCXdtYV9iaW5fc2VhcmNoX3JhdGUodmh0ODBfNDAwbnNfcmF0ZV90YmwsCisJCQkJICAgIFdNQV9NQVhfVkhUODBfUkFURV9UQkxfU0laRSwgJnNnaV9yYXRlLAorCQkJCSAgICAmc2dpX2lkeCk7CisJZWxzZQorCQl3bWFfYmluX3NlYXJjaF9yYXRlKHZodDgwXzgwMG5zX3JhdGVfdGJsLAorCQkJCSAgICBXTUFfTUFYX1ZIVDgwX1JBVEVfVEJMX1NJWkUsICZsZ2lfcmF0ZSwKKwkJCQkgICAgJmxnaV9pZHgpOworCisJd21hX3NldF9odF92aHRfbWNhc3RfcmF0ZShzaG9ydGdpLCBtYnBzeDEwX3JhdGUsIHNnaV9pZHgsIHNnaV9yYXRlLAorCQkJCSAgbGdpX2lkeCwgbGdpX3JhdGUsIDMsIHJhdGUsIHN0cmVhbWluZ19yYXRlKTsKKwlpZiAobnNzID09IDEpCisJCSpzdHJlYW1pbmdfcmF0ZSA9ICpzdHJlYW1pbmdfcmF0ZSA8PCAxOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2ZpbGxfaHRfbWNhc3RfcmF0ZSgpIC0gZmlsbCBodCBtY2FzdCByYXRlCisgKiBAc2hvcnRnaTogc2hvcnQgZ2F1cmQgaW50ZXJ2YWwKKyAqIEBjaHdpZHRoOiBjaGFubmVsIHdpZHRoCisgKiBAY2hhbm1vZGU6IGNoYW5uZWwgbW9kZQorICogQG1oejogZnJlcXVlbmN5CisgKiBAbWJwc3gxMF9yYXRlOiBtYnBzIHJhdGVzCisgKiBAbnNzOiBuc3MKKyAqIEByYXRlOiByYXRlCisgKiBAc3RyZWFtaW5nX3JhdGU6IHN0cmVhbWluZyByYXRlCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdtYV9maWxsX2h0X21jYXN0X3JhdGUodWludDMyX3Qgc2hvcnRnaSwKKwkJCQkJIHVpbnQzMl90IGNod2lkdGgsIGludDMyX3QgbWJwc3gxMF9yYXRlLAorCQkJCQkgdWludDhfdCBuc3MsIFdMQU5fUEhZX01PREUgY2hhbm1vZGUsCisJCQkJCSB1aW50OF90ICpyYXRlLAorCQkJCQkgaW50MzJfdCAqc3RyZWFtaW5nX3JhdGUpCit7CisJaW50MzJfdCByZXQgPSAwOworCisJKnN0cmVhbWluZ19yYXRlID0gMDsKKwlpZiAoY2h3aWR0aCA9PSAwKQorCQlyZXQgPSB3bWFfZmlsbF9odDIwX21jYXN0X3JhdGUoc2hvcnRnaSwgbWJwc3gxMF9yYXRlLAorCQkJCQkgICAgICAgbnNzLCByYXRlLCBzdHJlYW1pbmdfcmF0ZSk7CisJZWxzZSBpZiAoY2h3aWR0aCA9PSAxKQorCQlyZXQgPSB3bWFfZmlsbF9odDQwX21jYXN0X3JhdGUoc2hvcnRnaSwgbWJwc3gxMF9yYXRlLAorCQkJCQkgICAgICAgbnNzLCByYXRlLCBzdHJlYW1pbmdfcmF0ZSk7CisJZWxzZQorCQlXTUFfTE9HRSgiJXM6IEVycm9yLCBJbnZhbGlkIGNod2lkdGggZW51bSAlZCIsIF9fZnVuY19fLAorCQkJIGNod2lkdGgpOworCXJldHVybiAoKnN0cmVhbWluZ19yYXRlICE9IDApID8gQ0RGX1NUQVRVU19TVUNDRVNTIDogQ0RGX1NUQVRVU19FX0lOVkFMOworfQorCisvKioKKyAqIHdtYV9maWxsX3ZodF9tY2FzdF9yYXRlKCkgLSBmaWxsIHZodCBtY2FzdCByYXRlCisgKiBAc2hvcnRnaTogc2hvcnQgZ2F1cmQgaW50ZXJ2YWwKKyAqIEBjaHdpZHRoOiBjaGFubmVsIHdpZHRoCisgKiBAY2hhbm1vZGU6IGNoYW5uZWwgbW9kZQorICogQG1oejogZnJlcXVlbmN5CisgKiBAbWJwc3gxMF9yYXRlOiBtYnBzIHJhdGVzCisgKiBAbnNzOiBuc3MKKyAqIEByYXRlOiByYXRlCisgKiBAc3RyZWFtaW5nX3JhdGU6IHN0cmVhbWluZyByYXRlCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdtYV9maWxsX3ZodF9tY2FzdF9yYXRlKHVpbnQzMl90IHNob3J0Z2ksCisJCQkJCSAgdWludDMyX3QgY2h3aWR0aCwKKwkJCQkJICBpbnQzMl90IG1icHN4MTBfcmF0ZSwgdWludDhfdCBuc3MsCisJCQkJCSAgV0xBTl9QSFlfTU9ERSBjaGFubW9kZSwKKwkJCQkJICB1aW50OF90ICpyYXRlLAorCQkJCQkgIGludDMyX3QgKnN0cmVhbWluZ19yYXRlKQoreworCWludDMyX3QgcmV0ID0gMDsKKworCSpzdHJlYW1pbmdfcmF0ZSA9IDA7CisJaWYgKGNod2lkdGggPT0gMCkKKwkJcmV0ID0gd21hX2ZpbGxfdmh0MjBfbWNhc3RfcmF0ZShzaG9ydGdpLCBtYnBzeDEwX3JhdGUsIG5zcywKKwkJCQkJCXJhdGUsIHN0cmVhbWluZ19yYXRlKTsKKwllbHNlIGlmIChjaHdpZHRoID09IDEpCisJCXJldCA9IHdtYV9maWxsX3ZodDQwX21jYXN0X3JhdGUoc2hvcnRnaSwgbWJwc3gxMF9yYXRlLCBuc3MsCisJCQkJCQlyYXRlLCBzdHJlYW1pbmdfcmF0ZSk7CisJZWxzZSBpZiAoY2h3aWR0aCA9PSAyKQorCQlyZXQgPSB3bWFfZmlsbF92aHQ4MF9tY2FzdF9yYXRlKHNob3J0Z2ksIG1icHN4MTBfcmF0ZSwgbnNzLAorCQkJCQkJcmF0ZSwgc3RyZWFtaW5nX3JhdGUpOworCWVsc2UKKwkJV01BX0xPR0UoIiVzOiBjaHdpZHRoIGVudW0gJWQgbm90IHN1cHBvcnRlZCIsCisJCQkgX19mdW5jX18sIGNod2lkdGgpOworCXJldHVybiAoKnN0cmVhbWluZ19yYXRlICE9IDApID8gQ0RGX1NUQVRVU19TVUNDRVNTIDogQ0RGX1NUQVRVU19FX0lOVkFMOworfQorCisjZGVmaW5lIFdNQV9NQ0FTVF8xWDFfQ1VUX09GRl9SQVRFIDIwMDAKKy8qKgorICogd21hX2VuY29kZV9tY19yYXRlKCkgLSBmaWxsIG1jIHJhdGVzCisgKiBAc2hvcnRnaTogc2hvcnQgZ2F1cmQgaW50ZXJ2YWwKKyAqIEBjaHdpZHRoOiBjaGFubmVsIHdpZHRoCisgKiBAY2hhbm1vZGU6IGNoYW5uZWwgbW9kZQorICogQG1oejogZnJlcXVlbmN5CisgKiBAbWJwc3gxMF9yYXRlOiBtYnBzIHJhdGVzCisgKiBAbnNzOiBuc3MKKyAqIEByYXRlOiByYXRlCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdtYV9lbmNvZGVfbWNfcmF0ZSh1aW50MzJfdCBzaG9ydGdpLCB1aW50MzJfdCBjaHdpZHRoLAorCQkJCSAgICAgV0xBTl9QSFlfTU9ERSBjaGFubW9kZSwgQV9VSU5UMzIgbWh6LAorCQkJCSAgICAgaW50MzJfdCBtYnBzeDEwX3JhdGUsIHVpbnQ4X3QgbnNzLAorCQkJCSAgICAgdWludDhfdCAqcmF0ZSkKK3sKKwlpbnQzMl90IHJldCA9IDA7CisKKwkvKiBuc3MgaW5wdXQgdmFsdWU6IDAgLSAxeDE7IDEgLSAyeDI7IDIgLSAzeDMKKwkgKiB0aGUgcGh5bW9kZSBzZWxlY3Rpb24gaXMgYmFzZWQgb24gZm9sbG93aW5nIGFzc3VtcHRpb246CisJICogKDEpIGlmIHRoZSBhcHAgc3BlY2lmaWNhbGx5IHJlcXVlc3RlZCAxeDEgb3IgMngyIHdlIGhvcm5vciBpdAorCSAqICgyKSBpZiBtYnBzeDEwX3JhdGUgPD0gNTQwOiBhbHdheXMgdXNlIEJHCisJICogKDMpIDU0MCA8IG1icHN4MTBfcmF0ZSA8PSAyMDAwOiB1c2UgMXgxIEhUL1ZIVAorCSAqICg0KSAyMDAwIDwgbWJwc3gxMF9yYXRlOiB1c2UgMngyIEhUL1ZIVAorCSAqLworCVdNQV9MT0dFKCIlczogSW5wdXQ6IG5zcyA9ICVkLCBjaGFubW9kZSA9ICVkLCAiCisJCSAibWJwc3gxMCA9IDB4JXgsIGNod2lkdGggPSAlZCwgc2hvcnRnaSA9ICVkIiwKKwkJIF9fZnVuY19fLCBuc3MsIGNoYW5tb2RlLCBtYnBzeDEwX3JhdGUsIGNod2lkdGgsIHNob3J0Z2kpOworCWlmICgobWJwc3gxMF9yYXRlICYgMHg0MDAwMDAwMCkgJiYgbnNzID4gMCkgeworCQkvKiBiaXQgMzAgaW5kaWNhdGVzIHVzZXIgaW5wdXRlZCBuc3MsCisJCSAqIGJpdCAyOCBhbmQgMjkgdXNlZCB0byBlbmNvZGUgbnNzCisJCSAqLworCQl1aW50OF90IHVzZXJfbnNzID0gKG1icHN4MTBfcmF0ZSAmIDB4MzAwMDAwMDApID4+IDI4OworCisJCW5zcyA9ICh1c2VyX25zcyA8IG5zcykgPyB1c2VyX25zcyA6IG5zczsKKwkJLyogemVybyBvdXQgYml0cyAxOSAtIDIxIHRvIHJlY292ZXIgdGhlIGFjdHVhbCByYXRlICovCisJCW1icHN4MTBfcmF0ZSAmPSB+MHg3MDAwMDAwMDsKKwl9IGVsc2UgaWYgKG1icHN4MTBfcmF0ZSA8PSBXTUFfTUNBU1RfMVgxX0NVVF9PRkZfUkFURSkgeworCQkvKiBpZiB0aGUgaW5wdXQgcmF0ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIHRoZQorCQkgKiAxeDEgY3V0b2ZmIHJhdGUgd2UgdXNlIDF4MSBvbmx5CisJCSAqLworCQluc3MgPSAwOworCX0KKwkvKiBlbmNvZGUgTlNTIGJpdHMgKGJpdCA0LCBiaXQgNSkgKi8KKwkqcmF0ZSA9IChuc3MgJiAweDMpIDw8IDQ7CisJLyogaWYgbWNhc3QgaW5wdXQgcmF0ZSBleGNlZWRzIHRoZSBvZmRtL2NjayBtYXggcmF0ZSA1NG1wYnMKKwkgKiB3ZSB0cnkgdG8gY2hvb3NlIGJlc3QgaHQvdmh0IG1jcyByYXRlCisJICovCisJaWYgKDU0MCA8IG1icHN4MTBfcmF0ZSkgeworCQkvKiBjYW5ub3QgdXNlIG9mZG0vY2NrLCBjaG9vc2UgY2xvc2VzdCBodC92aHQgbWNzIHJhdGUgKi8KKwkJdWludDhfdCByYXRlX2h0ID0gKnJhdGU7CisJCXVpbnQ4X3QgcmF0ZV92aHQgPSAqcmF0ZTsKKwkJaW50MzJfdCBzdHJlYW1fcmF0ZV9odCA9IDA7CisJCWludDMyX3Qgc3RyZWFtX3JhdGVfdmh0ID0gMDsKKwkJaW50MzJfdCBzdHJlYW1fcmF0ZSA9IDA7CisKKwkJcmV0ID0gd21hX2ZpbGxfaHRfbWNhc3RfcmF0ZShzaG9ydGdpLCBjaHdpZHRoLCBtYnBzeDEwX3JhdGUsCisJCQkJCSAgICAgbnNzLCBjaGFubW9kZSwgJnJhdGVfaHQsCisJCQkJCSAgICAgJnN0cmVhbV9yYXRlX2h0KTsKKwkJaWYgKHJldCAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXN0cmVhbV9yYXRlX2h0ID0gMDsKKwkJfQorCQlpZiAobWh6IDwgV01BXzJfNF9HSFpfTUFYX0ZSRVEpIHsKKwkJCS8qIG5vdCBpbiA1IEdIWiBmcmVxdWVuY3kgKi8KKwkJCSpyYXRlID0gcmF0ZV9odDsKKwkJCXN0cmVhbV9yYXRlID0gc3RyZWFtX3JhdGVfaHQ7CisJCQlnb3RvIGh0X3ZodF9kb25lOworCQl9CisJCS8qIGNhcGFibGUgZG9pbmcgMTFBQyBtY2FzdCBzbyB0aGF0IHNlYXJjaCB2aHQgdGFibGVzICovCisJCXJldCA9IHdtYV9maWxsX3ZodF9tY2FzdF9yYXRlKHNob3J0Z2ksIGNod2lkdGgsIG1icHN4MTBfcmF0ZSwKKwkJCQkJICAgICAgbnNzLCBjaGFubW9kZSwgJnJhdGVfdmh0LAorCQkJCQkgICAgICAmc3RyZWFtX3JhdGVfdmh0KTsKKwkJaWYgKHJldCAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWlmIChzdHJlYW1fcmF0ZV9odCAhPSAwKQorCQkJCXJldCA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCSpyYXRlID0gcmF0ZV9odDsKKwkJCXN0cmVhbV9yYXRlID0gc3RyZWFtX3JhdGVfaHQ7CisJCQlnb3RvIGh0X3ZodF9kb25lOworCQl9CisJCWlmIChzdHJlYW1fcmF0ZV9odCA9PSAwKSB7CisJCQkvKiBvbmx5IHZodCByYXRlIGF2YWlsYWJsZSAqLworCQkJKnJhdGUgPSByYXRlX3ZodDsKKwkJCXN0cmVhbV9yYXRlID0gc3RyZWFtX3JhdGVfdmh0OworCQl9IGVsc2UgeworCQkJLyogc2V0IGh0IGFzIGRlZmF1bHQgZmlyc3QgKi8KKwkJCSpyYXRlID0gcmF0ZV9odDsKKwkJCXN0cmVhbV9yYXRlID0gc3RyZWFtX3JhdGVfaHQ7CisJCQlpZiAoc3RyZWFtX3JhdGUgPCBtYnBzeDEwX3JhdGUpIHsKKwkJCQlpZiAobWJwc3gxMF9yYXRlIDw9IHN0cmVhbV9yYXRlX3ZodCB8fAorCQkJCSAgICBzdHJlYW1fcmF0ZSA8IHN0cmVhbV9yYXRlX3ZodCkgeworCQkJCQkqcmF0ZSA9IHJhdGVfdmh0OworCQkJCQlzdHJlYW1fcmF0ZSA9IHN0cmVhbV9yYXRlX3ZodDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChzdHJlYW1fcmF0ZV92aHQgPj0gbWJwc3gxMF9yYXRlICYmCisJCQkJICAgIHN0cmVhbV9yYXRlX3ZodCA8IHN0cmVhbV9yYXRlKSB7CisJCQkJCSpyYXRlID0gcmF0ZV92aHQ7CisJCQkJCXN0cmVhbV9yYXRlID0gc3RyZWFtX3JhdGVfdmh0OworCQkJCX0KKwkJCX0KKwkJfQoraHRfdmh0X2RvbmU6CisJCVdNQV9MT0dFKCIlczogTlNTID0gJWQsIHVjYXN0X2NoYW5tb2RlID0gJWQsICIKKwkJCSAiZnJlcSA9ICVkLCBpbnB1dF9yYXRlID0gJWQsIGNod2lkdGggPSAlZCAiCisJCQkgInJhdGUgPSAweCV4LCBzdHJlYW1pbmdfcmF0ZSA9ICVkIiwKKwkJCSBfX2Z1bmNfXywgbnNzLCBjaGFubW9kZSwgbWh6LAorCQkJIG1icHN4MTBfcmF0ZSwgY2h3aWR0aCwgKnJhdGUsIHN0cmVhbV9yYXRlKTsKKwl9IGVsc2UgeworCQlpZiAobWJwc3gxMF9yYXRlID4gMCkKKwkJCXJldCA9IHdtYV9maWxsX29mZG1fY2NrX21jYXN0X3JhdGUobWJwc3gxMF9yYXRlLAorCQkJCQkJCSAgIG5zcywgcmF0ZSk7CisJCWVsc2UKKwkJCSpyYXRlID0gMHhGRjsKKworCQlXTUFfTE9HRSgiJXM6IE5TUyA9ICVkLCB1Y2FzdF9jaGFubW9kZSA9ICVkLCAiCisJCQkgImlucHV0X3JhdGUgPSAlZCwgcmF0ZSA9IDB4JXgiLAorCQkJIF9fZnVuY19fLCBuc3MsIGNoYW5tb2RlLCBtYnBzeDEwX3JhdGUsICpyYXRlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfc2V0X2Jzc19yYXRlX2ZsYWdzKCkgLSBzZXQgcmF0ZSBmbGFncyBiYXNlZCBvbiBCU1MgY2FwYWJpbGl0eQorICogQGlmYWNlOiB0eHJ4X25vZGUgY3R4CisgKiBAYWRkX2JzczogYWRkX2JzcyBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfc2V0X2Jzc19yYXRlX2ZsYWdzKHN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZSwKKwkJCQkgICB0cEFkZEJzc1BhcmFtcyBhZGRfYnNzKQoreworCWlmYWNlLT5yYXRlX2ZsYWdzID0gMDsKKworCWlmIChhZGRfYnNzLT52aHRDYXBhYmxlKSB7CisJCWlmIChhZGRfYnNzLT5jaF93aWR0aCA9PSBDSF9XSURUSF84MFA4ME1IWikKKwkJCWlmYWNlLT5yYXRlX2ZsYWdzIHw9IGVIQUxfVFhfUkFURV9WSFQ4MDsKKwkJaWYgKGFkZF9ic3MtPmNoX3dpZHRoID09IENIX1dJRFRIXzE2ME1IWikKKwkJCWlmYWNlLT5yYXRlX2ZsYWdzIHw9IGVIQUxfVFhfUkFURV9WSFQ4MDsKKwkJaWYgKGFkZF9ic3MtPmNoX3dpZHRoID09IENIX1dJRFRIXzgwTUhaKQorCQkJaWZhY2UtPnJhdGVfZmxhZ3MgfD0gZUhBTF9UWF9SQVRFX1ZIVDgwOworCQllbHNlIGlmIChhZGRfYnNzLT5jaF93aWR0aCkKKwkJCWlmYWNlLT5yYXRlX2ZsYWdzIHw9IGVIQUxfVFhfUkFURV9WSFQ0MDsKKwkJZWxzZQorCQkJaWZhY2UtPnJhdGVfZmxhZ3MgfD0gZUhBTF9UWF9SQVRFX1ZIVDIwOworCX0KKwkvKiBhdm9pZCB0byBjb25mbGljdCB3aXRoIGh0Q2FwYWJsZSBmbGFnICovCisJZWxzZSBpZiAoYWRkX2Jzcy0+aHRDYXBhYmxlKSB7CisJCWlmIChhZGRfYnNzLT5jaF93aWR0aCkKKwkJCWlmYWNlLT5yYXRlX2ZsYWdzIHw9IGVIQUxfVFhfUkFURV9IVDQwOworCQllbHNlCisJCQlpZmFjZS0+cmF0ZV9mbGFncyB8PSBlSEFMX1RYX1JBVEVfSFQyMDsKKwl9CisKKwlpZiAoYWRkX2Jzcy0+c3RhQ29udGV4dC5mU2hvcnRHSTIwTWh6IHx8CisJICAgIGFkZF9ic3MtPnN0YUNvbnRleHQuZlNob3J0R0k0ME1oeikKKwkJaWZhY2UtPnJhdGVfZmxhZ3MgfD0gZUhBTF9UWF9SQVRFX1NHSTsKKworCWlmICghYWRkX2Jzcy0+aHRDYXBhYmxlICYmICFhZGRfYnNzLT52aHRDYXBhYmxlKQorCQlpZmFjZS0+cmF0ZV9mbGFncyA9IGVIQUxfVFhfUkFURV9MRUdBQ1k7Cit9CisKKy8qKgorICogd21pX3VuaWZpZWRfc2VuZF90eGJmKCkgLSBzZXQgdHhiZiBwYXJhbWV0ZXIgdG8gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwYXJhbXM6IHR4YmYgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludDMyX3Qgd21pX3VuaWZpZWRfc2VuZF90eGJmKHRwX3dtYV9oYW5kbGUgd21hLCB0cEFkZFN0YVBhcmFtcyBwYXJhbXMpCit7CisJd21pX3ZkZXZfdHhiZl9lbiB0eGJmX2VuOworCisJLyogVGhpcyBpcyBzZXQgd2hlbiBPdGhlciBwYXJ0bmVyIGlzIEJmb3JtZXIKKwkgKiBhbmQgd2UgYXJlIGNhcGFibGUgYmZvcm1lZShlbmFibGVkIGJvdGggaW4gaW5pIGFuZCBmdykKKwkgKi8KKwl0eGJmX2VuLnN1dHhiZmVlID0gcGFyYW1zLT52aHRUeEJGQ2FwYWJsZTsKKwl0eGJmX2VuLm11dHhiZmVlID0gcGFyYW1zLT52aHRUeE1VQmZvcm1lZUNhcGFibGU7CisJdHhiZl9lbi5zdXR4YmZlciA9IHBhcmFtcy0+ZW5hYmxlX3N1X3R4X2Jmb3JtZXI7CisJdHhiZl9lbi5tdXR4YmZlciA9IDA7CisKKwkvKiBXaGVuIE1VIFR4QmZlZSBpcyBzZXQsIFNVIFR4QmZlZSBtdXN0IGJlIHNldCBieSBkZWZhdWx0ICovCisJaWYgKHR4YmZfZW4ubXV0eGJmZWUpCisJCXR4YmZfZW4uc3V0eGJmZWUgPSB0eGJmX2VuLm11dHhiZmVlOworCisJV01BX0xPR0QoInR4YmZfZW4uc3V0eGJmZWUgJWQgdHhiZl9lbi5tdXR4YmZlZSAlZCwgc3V0eGJmZXIgJWQiLAorCQkgdHhiZl9lbi5zdXR4YmZlZSwgdHhiZl9lbi5tdXR4YmZlZSwgdHhiZl9lbi5zdXR4YmZlcik7CisKKwlyZXR1cm4gd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCh3bWEtPndtaV9oYW5kbGUsCisJCQkJCQlwYXJhbXMtPnNtZXNlc3Npb25JZCwKKwkJCQkJCVdNSV9WREVWX1BBUkFNX1RYQkYsCisJCQkJCQkqKChBX1VJTlQ4ICopICZ0eGJmX2VuKSk7Cit9CisKKy8qKgorICogd21hX2RhdGFfdHhfYWNrX3dvcmtfaGFuZGxlcigpIC0gcHJvY2VzcyBkYXRhIHR4IGFjaworICogQGFja193b3JrOiB3b3JrIHN0cnVjdHVyZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfZGF0YV90eF9hY2tfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqYWNrX3dvcmspCit7CisJc3RydWN0IHdtYV90eF9hY2tfd29ya19jdHggKndvcms7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlOworCXBXTUFBY2tGblR4Q29tcCBhY2tfY2I7CisKKwlpZiAoY2RzX2lzX2xvYWRfdW5sb2FkX2luX3Byb2dyZXNzKCkpIHsKKwkJV01BX0xPR0UoIiVzOiBEcml2ZXIgbG9hZC91bmxvYWQgaW4gcHJvZ3Jlc3MiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl3b3JrID0gY29udGFpbmVyX29mKGFja193b3JrLCBzdHJ1Y3Qgd21hX3R4X2Fja193b3JrX2N0eCwgYWNrX2NtcF93b3JrKTsKKwl3bWFfaGFuZGxlID0gd29yay0+d21hX2hhbmRsZTsKKwlhY2tfY2IgPSB3bWFfaGFuZGxlLT51bWFjX2RhdGFfb3RhX2Fja19jYjsKKworCWlmICh3b3JrLT5zdGF0dXMpCisJCVdNQV9MT0dFKCJEYXRhIFR4IEFjayBDYiBTdGF0dXMgJWQiLCB3b3JrLT5zdGF0dXMpOworCWVsc2UKKwkJV01BX0xPR0QoIkRhdGEgVHggQWNrIENiIFN0YXR1cyAlZCIsIHdvcmstPnN0YXR1cyk7CisKKwkvKiBDYWxsIHRoZSBBY2sgQ2IgcmVnaXN0ZXJlZCBieSBVTUFDICovCisJaWYgKGFja19jYikKKwkJYWNrX2NiKCh0cEFuaVNpckdsb2JhbCkgKHdtYV9oYW5kbGUtPm1hY19jb250ZXh0KSwKKwkJCXdvcmstPnN0YXR1cyA/IDAgOiAxKTsKKwllbHNlCisJCVdNQV9MT0dFKCJEYXRhIFR4IEFjayBDYiBpcyBOVUxMIik7CisKKwl3bWFfaGFuZGxlLT51bWFjX2RhdGFfb3RhX2Fja19jYiA9IE5VTEw7CisJd21hX2hhbmRsZS0+bGFzdF91bWFjX2RhdGFfbmJ1ZiA9IE5VTEw7CisJY2RmX21lbV9mcmVlKHdvcmspOworCXdtYV9oYW5kbGUtPmFja193b3JrX2N0eCA9IE5VTEw7Cit9CisKKy8qKgorICogd21hX2RhdGFfdHhfYWNrX2NvbXBfaGRscigpIC0gaGFuZGxlcyB0eCBkYXRhIGFjayBjb21wbGV0aW9uCisgKiBAY29udGV4dDogY29udGV4dCB3aXRoIHdoaWNoIHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQKKyAqIEBuZXRidWY6IHR4IGRhdGEgbmJ1ZgorICogQGVycjogc3RhdHVzIG9mIHR4IGNvbXBsZXRpb24KKyAqCisgKiBUaGlzIGlzIHRoZSBjYiByZWdpc3RlcmVkIHdpdGggVHhSeCBmb3IKKyAqIEFjayBDb21wbGV0ZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkCit3bWFfZGF0YV90eF9hY2tfY29tcF9oZGxyKHZvaWQgKndtYV9jb250ZXh0LCBjZGZfbmJ1Zl90IG5ldGJ1ZiwgaW50MzJfdCBzdGF0dXMpCit7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2OworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSB3bWFfY29udGV4dDsKKworCWlmIChOVUxMID09IHdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBIYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisKKwlpZiAoTlVMTCA9PSBwZGV2KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCBwZGV2IiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBpZiBuZXRCdWYgZG9lcyBub3QgbWF0Y2ggd2l0aCBwZW5kaW5nIG5idWYgdGhlbiBqdXN0IGZyZWUgdGhlCisJICogbmV0YnVmIGFuZCBkbyBub3QgY2FsbCBhY2sgY2IKKwkgKi8KKwlpZiAod21hX2hhbmRsZS0+bGFzdF91bWFjX2RhdGFfbmJ1ZiAhPSBuZXRidWYpIHsKKwkJaWYgKHdtYV9oYW5kbGUtPnVtYWNfZGF0YV9vdGFfYWNrX2NiKSB7CisJCQlXTUFfTE9HRSgiJXM6IG5idWYgZG9lcyBub3QgbWF0Y2ggYnV0IHVtYWNfZGF0YV9vdGFfYWNrX2NiIGlzIG5vdCBudWxsIiwKKwkJCQlfX2Z1bmNfXyk7CisJCX0gZWxzZSB7CisJCQlXTUFfTE9HRSgiJXM6IG5idWYgZG9lcyBub3QgbWF0Y2ggYW5kIHVtYWNfZGF0YV9vdGFfYWNrX2NiIGlzIGFsc28gbnVsbCIsCisJCQkJX19mdW5jX18pOworCQl9CisJCWdvdG8gZnJlZV9uYnVmOworCX0KKworCWlmICh3bWFfaGFuZGxlICYmIHdtYV9oYW5kbGUtPnVtYWNfZGF0YV9vdGFfYWNrX2NiKSB7CisJCXN0cnVjdCB3bWFfdHhfYWNrX3dvcmtfY3R4ICphY2tfd29yazsKKworCQlhY2tfd29yayA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd21hX3R4X2Fja193b3JrX2N0eCkpOworCQl3bWFfaGFuZGxlLT5hY2tfd29ya19jdHggPSBhY2tfd29yazsKKwkJaWYgKGFja193b3JrKSB7CisjaWZkZWYgQ09ORklHX0NOU1MKKwkJCWNuc3NfaW5pdF93b3JrKCZhY2tfd29yay0+YWNrX2NtcF93b3JrLAorCQkJCSAgICAgICB3bWFfZGF0YV90eF9hY2tfd29ya19oYW5kbGVyKTsKKyNlbHNlCisJCQlJTklUX1dPUksoJmFja193b3JrLT5hY2tfY21wX3dvcmssCisJCQkJICB3bWFfZGF0YV90eF9hY2tfd29ya19oYW5kbGVyKTsKKyNlbmRpZiAvKiBDT05GSUdfQ05TUyAqLworCQkJYWNrX3dvcmstPndtYV9oYW5kbGUgPSB3bWFfaGFuZGxlOworCQkJYWNrX3dvcmstPnN1Yl90eXBlID0gMDsKKwkJCWFja193b3JrLT5zdGF0dXMgPSBzdGF0dXM7CisKKwkJCS8qIFNjaGVkdWUgdGhlIFdvcmsgKi8KKwkJCXNjaGVkdWxlX3dvcmsoJmFja193b3JrLT5hY2tfY21wX3dvcmspOworCQl9CisJfQorCitmcmVlX25idWY6CisJLyogdW5tYXAgYW5kIGZyZWVpbmcgdGhlIHR4IGJ1ZiBhcyB0eHJ4IGlzIG5vdCB0YWtpbmcgY2FyZSAqLworCWNkZl9uYnVmX3VubWFwX3NpbmdsZShwZGV2LT5vc2RldiwgbmV0YnVmLCBDREZfRE1BX1RPX0RFVklDRSk7CisJY2RmX25idWZfZnJlZShuZXRidWYpOworfQorCisvKioKKyAqIHdtYV91cGRhdGVfdHhyeF9jaGFpbm1hc2soKSAtIHVwZGF0ZSB0eHJ4IGNoYWlubWFzaworICogQG51bV9yZl9jaGFpbnM6IG51bWJlciByZiBjaGFpbnMKKyAqIEBjbWRfdmFsdWU6IGNvbW1hbmQgdmFsdWUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfdXBkYXRlX3R4cnhfY2hhaW5tYXNrKGludCBudW1fcmZfY2hhaW5zLCBpbnQgKmNtZF92YWx1ZSkKK3sKKwlpZiAoKmNtZF92YWx1ZSA+IFdNQV9NQVhfUkZfQ0hBSU5TKG51bV9yZl9jaGFpbnMpKSB7CisJCVdNQV9MT0dFKCIlczogQ2hhaW5tYXNrIHZhbHVlIGV4Y2VlZHMgdGhlIG1heGltdW0iCisJCQkgIiBzdXBwb3J0ZWQgcmFuZ2Ugc2V0dGluZyBpdCB0byIKKwkJCSAiIG1heGltdW0gdmFsdWUuIFJlcXVlc3RlZCB2YWx1ZSAlZCIKKwkJCSAiIFVwZGF0ZWQgdmFsdWUgJWQiLCBfX2Z1bmNfXywgKmNtZF92YWx1ZSwKKwkJCSBXTUFfTUFYX1JGX0NIQUlOUyhudW1fcmZfY2hhaW5zKSk7CisJCSpjbWRfdmFsdWUgPSBXTUFfTUFYX1JGX0NIQUlOUyhudW1fcmZfY2hhaW5zKTsKKwl9IGVsc2UgaWYgKCpjbWRfdmFsdWUgPCBXTUFfTUlOX1JGX0NIQUlOUykgeworCQlXTUFfTE9HRSgiJXM6IENoYWlubWFzayB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0iCisJCQkgIiBzdXBwb3J0ZWQgcmFuZ2Ugc2V0dGluZyBpdCB0byIKKwkJCSAiIG1pbmltdW0gdmFsdWUuIFJlcXVlc3RlZCB2YWx1ZSAlZCIKKwkJCSAiIFVwZGF0ZWQgdmFsdWUgJWQiLCBfX2Z1bmNfXywgKmNtZF92YWx1ZSwKKwkJCSBXTUFfTUlOX1JGX0NIQUlOUyk7CisJCSpjbWRfdmFsdWUgPSBXTUFfTUlOX1JGX0NIQUlOUzsKKwl9Cit9CisKKy8qKgorICogd21hX3BlZXJfc3RhdGVfY2hhbmdlX2V2ZW50X2hhbmRsZXIoKSAtIHBlZXIgc3RhdGUgY2hhbmdlIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBldmVudF9idWZmOiBldmVudCBidWZmZXIKKyAqIEBsZW46IGxlbmd0aCBvZiBidWZmZXIKKyAqCisgKiBUaGlzIGV2ZW50IGhhbmRsZXIgdW5wYXVzZXMgdmRldiBpZiBwZWVyIHN0YXRlIGNoYW5nZSB0byBBVVRIT1JJWkVEIFNUQVRFCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV9wZWVyX3N0YXRlX2NoYW5nZV9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkJdWludDhfdCAqZXZlbnRfYnVmZiwKKwkJCQkJdWludDMyX3QgbGVuKQoreworCVdNSV9QRUVSX1NUQVRFX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9wZWVyX3N0YXRlX2V2ZW50X2ZpeGVkX3BhcmFtICpldmVudDsKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXY7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKworCWlmICghZXZlbnRfYnVmZikgeworCQlXTUFfTE9HRSgiJXM6IFJlY2VpdmVkIE5VTEwgZXZlbnQgcHRyIGZyb20gRlciLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYXJhbV9idWYgPSAoV01JX1BFRVJfU1RBVEVfRVZFTlRJRF9wYXJhbV90bHZzICopIGV2ZW50X2J1ZmY7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIiVzOiBSZWNlaXZlZCBOVUxMIGJ1ZiBwdHIgZnJvbSBGVyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCXZkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2lkKHdtYV9oYW5kbGUsIGV2ZW50LT52ZGV2X2lkKTsKKwlpZiAoTlVMTCA9PSB2ZGV2KSB7CisJCVdNQV9MT0dQKCIlczogQ291bGRuJ3QgZmluZCB2ZGV2IGZvciB2ZGV2X2lkOiAlZCIsCisJCQkgX19mdW5jX18sIGV2ZW50LT52ZGV2X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZkZXYtPm9wbW9kZSA9PSB3bGFuX29wX21vZGVfc3RhCisJICAgICYmIGV2ZW50LT5zdGF0ZSA9PSBXTUlfUEVFUl9TVEFURV9BVVRIT1JJWkVEKSB7CisJCS8qCisJCSAqIHNldCBldmVudCBzbyB0aGF0IGhkZAorCQkgKiBjYW4gcHJvY2NlZCBhbmQgdW5wYXVzZSB0eCBxdWV1ZQorCQkgKi8KKyNpZmRlZiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTAorCQlpZiAoIXdtYV9oYW5kbGUtPnBlZXJfYXV0aG9yaXplZF9jYikgeworCQkJV01BX0xPR0UoIiVzOiBwZWVyIGF1dGhvcml6ZWQgY2Igbm90IHJlZ2lzdGVyZWQiLAorCQkJCSBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl3bWFfaGFuZGxlLT5wZWVyX2F1dGhvcml6ZWRfY2IodmRldi0+dmRldl9pZCk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfc2V0X2VuYWJsZV9kaXNhYmxlX21jY19hZGFwdGl2ZV9zY2hlZHVsZXIoKSAtZW5hYmxlL2Rpc2FibGUgbWNjIHNjaGVkdWxlcgorICogQG1jY19hZGFwdGl2ZV9zY2hlZHVsZXI6IGVuYWJsZS9kaXNhYmxlCisgKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGUvZGlzYWJsZSBtY2MgYWRhcHRpdmUgc2NoZWR1bGVyIGluIGZ3LgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGZvciBzdWNlc3Mgb3IgZXJyb3IgY29kZQorICovCitDREZfU1RBVFVTIHdtYV9zZXRfZW5hYmxlX2Rpc2FibGVfbWNjX2FkYXB0aXZlX3NjaGVkdWxlcih1aW50MzJfdAorCQkJCQkJCSBtY2NfYWRhcHRpdmVfc2NoZWR1bGVyKQoreworCWludCByZXQgPSAtMTsKKwl3bWlfYnVmX3QgYnVmID0gMDsKKwl3bWlfcmVzbWdyX2FkYXB0aXZlX29jc19lbmFibGVfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0gKmNtZCA9IE5VTEw7CisJdHBfd21hX2hhbmRsZSB3bWEgPSBOVUxMOworCXVpbnQxNl90IGxlbiA9CisJCXNpemVvZih3bWlfcmVzbWdyX2FkYXB0aXZlX29jc19lbmFibGVfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0pOworCisJd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoTlVMTCA9PSB3bWEpIHsKKwkJV01BX0xPR0UoIiVzIDogRmFpbGVkIHRvIGdldCB3bWEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR1AoIiVzIDogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCWNtZCA9ICh3bWlfcmVzbWdyX2FkYXB0aXZlX29jc19lbmFibGVfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0gKikKKwkJd21pX2J1Zl9kYXRhKGJ1Zik7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcmVzbWdyX2FkYXB0aXZlX29jc19lbmFibGVfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3Jlc21ncl9hZGFwdGl2ZV9vY3NfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT5lbmFibGUgPSBtY2NfYWRhcHRpdmVfc2NoZWR1bGVyOworCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfUkVTTUdSX0FEQVBUSVZFX09DU19FTkFCTEVfRElTQUJMRV9DTURJRCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byBzZW5kIGVuYWJsZS9kaXNhYmxlIE1DQyIKKwkJCSAiIGFkYXB0aXZlIHNjaGVkdWxlciBjb21tYW5kIiwgX19mdW5jX18pOworCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3NldF9tY2NfY2hhbm5lbF90aW1lX2xhdGVuY3koKSAtc2V0IE1DQyBjaGFubmVsIHRpbWUgbGF0ZW5jeQorICogQHdtYTogd21hIGhhbmRsZQorICogQG1jY19jaGFubmVsOiBtY2MgY2hhbm5lbAorICogQG1jY19jaGFubmVsX3RpbWVfbGF0ZW5jeTogTUNDIGNoYW5uZWwgdGltZSBsYXRlbmN5LgorICoKKyAqIEN1cnJlbnRseSB1c2VkIHRvIHNldCB0aW1lIGxhdGVuY3kgZm9yIGFuIE1DQyB2ZGV2L2FkYXB0ZXIgdXNpbmcgb3BlcmF0aW5nCisgKiBjaGFubmVsIG9mIGl0IGFuZCBjaGFubmVsIG51bWJlci4gVGhlIGluZm8gaXMgcHJvdmlkZWQgcnVuIHRpbWUgdXNpbmcKKyAqIGl3cHJpdiBjb21tYW5kOiBpd3ByaXYgPHdsYW4wIHwgcDJwMD4gc2V0TWNjTGF0ZW5jeSA8bGF0ZW5jeSBpbiBtcz4uCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3NldF9tY2NfY2hhbm5lbF90aW1lX2xhdGVuY3kKKwkodHBfd21hX2hhbmRsZSB3bWEsCisJdWludDMyX3QgbWNjX2NoYW5uZWwsIHVpbnQzMl90IG1jY19jaGFubmVsX3RpbWVfbGF0ZW5jeSkKK3sKKwlpbnQgcmV0ID0gLTE7CisJd21pX2J1Zl90IGJ1ZiA9IDA7CisJd21pX3Jlc21ncl9zZXRfY2hhbl9sYXRlbmN5X2NtZF9maXhlZF9wYXJhbSAqY21kVEwgPSBOVUxMOworCXVpbnQxNl90IGxlbiA9IDA7CisJdWludDhfdCAqYnVmX3B0ciA9IE5VTEw7CisJdWludDMyX3QgY2ZnX3ZhbCA9IDA7CisJd21pX3Jlc21ncl9jaGFuX2xhdGVuY3kgY2hhbl9sYXRlbmN5OworCXN0cnVjdCBzQW5pU2lyR2xvYmFsICpwTWFjID0gTlVMTDsKKwkvKiBOb3RlOiB3ZSBvbmx5IHN1cHBvcnQgTUNDIHRpbWUgbGF0ZW5jeSBmb3IgYSBzaW5nbGUgY2hhbm5lbCAqLworCXVpbnQzMl90IG51bV9jaGFubmVscyA9IDE7CisJdWludDMyX3QgY2hhbm5lbDEgPSBtY2NfY2hhbm5lbDsKKwl1aW50MzJfdCBjaGFuMV9mcmVxID0gY2RzX2NoYW5fdG9fZnJlcShjaGFubmVsMSk7CisJdWludDMyX3QgbGF0ZW5jeV9jaGFuMSA9IG1jY19jaGFubmVsX3RpbWVfbGF0ZW5jeTsKKworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCIlczpOVUxMIHdtYSBwdHIuIEV4aXRpbmciLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcE1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKwlpZiAoIXBNYWMpIHsKKwkJV01BX0xPR0UoIiVzOk5VTEwgcE1hYyBwdHIuIEV4aXRpbmciLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwkvKiBGaXJzdCBzdGVwIGlzIHRvIGNvbmZpcm0gaWYgTUNDIGlzIGFjdGl2ZSAqLworCWlmICghbGltX2lzX2luX21jYyhwTWFjKSkgeworCQlXTUFfTE9HRSgiJXM6IE1DQyBpcyBub3QgYWN0aXZlLiBFeGl0aW5nIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIENvbmZpcm0gTUNDIGFkYXB0aXZlIHNjaGVkdWxlciBmZWF0dXJlIGlzIGRpc2FibGVkICovCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19FTkFCTEVfTUNDX0FEQVBUSVZFX1NDSEVELAorCQkJICAgICAmY2ZnX3ZhbCkgPT0gZVNJUl9TVUNDRVNTKSB7CisJCWlmIChjZmdfdmFsID09IFdOSV9DRkdfRU5BQkxFX01DQ19BREFQVElWRV9TQ0hFRF9TVEFNQVgpIHsKKwkJCVdNQV9MT0dEKCIlczogQ2FuJ3Qgc2V0IGNoYW5uZWwgbGF0ZW5jeSB3aGlsZSBNQ0MgIgorCQkJCSAiQURBUFRJVkUgU0NIRUQgaXMgZW5hYmxlZC4gRXhpdCIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9IGVsc2UgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIE1DQ19BREFQVElWRV9TQ0hFRCwgIgorCQkJICJFeGl0IHcvbyBzZXR0aW5nIGxhdGVuY3kiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyogSWYgMG1zIGxhdGVuY3kgaXMgcHJvdmlkZWQsIHRoZW4gRlcgd2lsbCBzZXQgdG8gYSBkZWZhdWx0LgorCSAqIE90aGVyd2lzZSwgbGF0ZW5jeSBtdXN0IGJlIGF0IGxlYXN0IDMwbXMuCisJICovCisJaWYgKChsYXRlbmN5X2NoYW4xID4gMCkgJiYKKwkgICAgKGxhdGVuY3lfY2hhbjEgPCBXTUlfTUNDX01JTl9OT05fWkVST19DSEFOTkVMX0xBVEVOQ1kpKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCB0aW1lIGxhdGVuY3kgZm9yIENoYW5uZWwgIzEgPSAlZG1zICIKKwkJCSAiTWluaW11bSBpcyAzMG1zIChvciAwIHRvIHVzZSBkZWZhdWx0IHZhbHVlIGJ5ICIKKwkJCSAiZmlybXdhcmUpIiwgX19mdW5jX18sIGxhdGVuY3lfY2hhbjEpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCS8qICAgU2V0IFdNSSBDTUQgZm9yIGNoYW5uZWwgdGltZSBsYXRlbmN5IGhlcmUgKi8KKwlsZW4gPSBzaXplb2Yod21pX3Jlc21ncl9zZXRfY2hhbl9sYXRlbmN5X2NtZF9maXhlZF9wYXJhbSkgKworCSAgICAgIFdNSV9UTFZfSERSX1NJWkUgKyAgLypQbGFjZSBob2xkZXIgZm9yIGNoYW5fdGltZV9sYXRlbmN5IGFycmF5ICovCisJICAgICAgbnVtX2NoYW5uZWxzICogc2l6ZW9mKHdtaV9yZXNtZ3JfY2hhbl9sYXRlbmN5KTsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXMgOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCWNtZFRMID0gKHdtaV9yZXNtZ3Jfc2V0X2NoYW5fbGF0ZW5jeV9jbWRfZml4ZWRfcGFyYW0gKikKKwkJd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZFRMLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcmVzbWdyX3NldF9jaGFuX2xhdGVuY3lfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9yZXNtZ3Jfc2V0X2NoYW5fbGF0ZW5jeV9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWRUTC0+bnVtX2NoYW5zID0gbnVtX2NoYW5uZWxzOworCS8qIFVwZGF0ZSBjaGFubmVsIHRpbWUgbGF0ZW5jeSBpbmZvcm1hdGlvbiBmb3IgaG9tZSBjaGFubmVsKHMpICovCisJYnVmX3B0ciArPSBzaXplb2YoKmNtZFRMKTsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsCisJCSAgICAgICBudW1fY2hhbm5lbHMgKiBzaXplb2Yod21pX3Jlc21ncl9jaGFuX2xhdGVuY3kpKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJY2hhbl9sYXRlbmN5LmNoYW5fbWh6ID0gY2hhbjFfZnJlcTsKKwljaGFuX2xhdGVuY3kubGF0ZW5jeSA9IGxhdGVuY3lfY2hhbjE7CisJY2RmX21lbV9jb3B5KGJ1Zl9wdHIsICZjaGFuX2xhdGVuY3ksIHNpemVvZihjaGFuX2xhdGVuY3kpKTsKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9SRVNNR1JfU0VUX0NIQU5fTEFURU5DWV9DTURJRCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZW5kIE1DQyBDaGFubmVsIFRpbWUgTGF0ZW5jeSBjb21tYW5kIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9zZXRfbWNjX2NoYW5uZWxfdGltZV9xdW90YSgpIC1zZXQgTUNDIGNoYW5uZWwgdGltZSBxdW90YQorICogQHdtYTogd21hIGhhbmRsZQorICogQGFkYXB0ZXJfMV9jaGFuX251bWJlcjogYWRhcHRlciAxIGNoYW5uZWwgbnVtYmVyCisgKiBAYWRhcHRlcl8xX3F1b3RhOiBhZGFwdGVyIDEgcXVvdGEKKyAqIEBhZGFwdGVyXzJfY2hhbl9udW1iZXI6IGFkYXB0ZXIgMiBjaGFubmVsIG51bWJlcgorICoKKyAqIEN1cnJlbnRseSB1c2VkIHRvIHNldCB0aW1lIHF1b3RhIGZvciAyIE1DQyB2ZGV2cy9hZGFwdGVycyB1c2luZyAob3BlcmF0aW5nCisgKiBjaGFubmVsLCBxdW90YSkgZm9yIGVhY2ggbW9kZSAuIFRoZSBpbmZvIGlzIHByb3ZpZGVkIHJ1biB0aW1lIHVzaW5nCisgKiBpd3ByaXYgY29tbWFuZDogaXdwcml2IDx3bGFuMCB8IHAycDA+IHNldE1jY1F1b3RhIDxxdW90YSBpbiBtcz4uCisgKiBOb3RlOiB0aGUgcXVvdGEgcHJvdmlkZWQgaW4gY29tbWFuZCBpcyBmb3IgdGhlIHNhbWUgbW9kZSBpbiBjbWQuIEhERAorICogY2hlY2tzIGlmIE1DQyBtb2RlIGlzIGFjdGl2ZSwgZ2V0cyB0aGUgc2Vjb25kIG1vZGUgYW5kIGl0cyBvcGVyYXRpbmcgY2hhbi4KKyAqIFF1b3RhIGZvciB0aGUgMm5kIHJvbGUgaXMgY2FsY3VsYXRlZCBhcyAxMDAgLSBxdW90YSBvZiBmaXJzdCBtb2RlLgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9zZXRfbWNjX2NoYW5uZWxfdGltZV9xdW90YQorCSh0cF93bWFfaGFuZGxlIHdtYSwKKwl1aW50MzJfdCBhZGFwdGVyXzFfY2hhbl9udW1iZXIsCisJdWludDMyX3QgYWRhcHRlcl8xX3F1b3RhLCB1aW50MzJfdCBhZGFwdGVyXzJfY2hhbl9udW1iZXIpCit7CisJaW50IHJldCA9IC0xOworCXdtaV9idWZfdCBidWYgPSAwOworCXVpbnQxNl90IGxlbiA9IDA7CisJdWludDhfdCAqYnVmX3B0ciA9IE5VTEw7CisJdWludDMyX3QgY2ZnX3ZhbCA9IDA7CisJc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMgPSBOVUxMOworCXdtaV9yZXNtZ3Jfc2V0X2NoYW5fdGltZV9xdW90YV9jbWRfZml4ZWRfcGFyYW0gKmNtZFRRID0gTlVMTDsKKwl3bWlfcmVzbWdyX2NoYW5fdGltZV9xdW90YSBjaGFuX3F1b3RhOworCXVpbnQzMl90IGNoYW5uZWwxID0gYWRhcHRlcl8xX2NoYW5fbnVtYmVyOworCXVpbnQzMl90IGNoYW5uZWwyID0gYWRhcHRlcl8yX2NoYW5fbnVtYmVyOworCXVpbnQzMl90IHF1b3RhX2NoYW4xID0gYWRhcHRlcl8xX3F1b3RhOworCS8qIEtub3dpbmcgcXVvdGEgb2YgMXN0IGNoYW4uLCBkZXJpdmUgcXVvdGEgZm9yIDJuZCBjaGFuLiAqLworCXVpbnQzMl90IHF1b3RhX2NoYW4yID0gMTAwIC0gcXVvdGFfY2hhbjE7CisJLyogTm90ZTogc2V0dGluZyB0aW1lIHF1b3RhIGZvciBNQ0MgcmVxdWlyZXMgaW5mbyBmb3IgMiBjaGFubmVscyAqLworCXVpbnQzMl90IG51bV9jaGFubmVscyA9IDI7CisJdWludDMyX3QgY2hhbjFfZnJlcSA9IGNkc19jaGFuX3RvX2ZyZXEoYWRhcHRlcl8xX2NoYW5fbnVtYmVyKTsKKwl1aW50MzJfdCBjaGFuMl9mcmVxID0gY2RzX2NoYW5fdG9fZnJlcShhZGFwdGVyXzJfY2hhbl9udW1iZXIpOworCisJV01BX0xPR0QoIiVzOiBDaGFubmVsMTolZCwgZnJlcTE6JWRNSHosIFF1b3RhMTolZG1zLCAiCisJCSAiQ2hhbm5lbDI6JWQsIGZyZXEyOiVkTUh6LCBRdW90YTI6JWRtcyIsIF9fZnVuY19fLAorCQkgY2hhbm5lbDEsIGNoYW4xX2ZyZXEsIHF1b3RhX2NoYW4xLCBjaGFubmVsMiwgY2hhbjJfZnJlcSwKKwkJIHF1b3RhX2NoYW4yKTsKKworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCIlczpOVUxMIHdtYSBwdHIuIEV4aXRpbmciLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcE1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKwlpZiAoIXBNYWMpIHsKKwkJV01BX0xPR0UoIiVzOk5VTEwgcE1hYyBwdHIuIEV4aXRpbmciLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwkvKiBGaXJzdCBzdGVwIGlzIHRvIGNvbmZpcm0gaWYgTUNDIGlzIGFjdGl2ZSAqLworCWlmICghbGltX2lzX2luX21jYyhwTWFjKSkgeworCQlXTUFfTE9HRCgiJXM6IE1DQyBpcyBub3QgYWN0aXZlLiBFeGl0aW5nIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyogQ29uZmlybSBNQ0MgYWRhcHRpdmUgc2NoZWR1bGVyIGZlYXR1cmUgaXMgZGlzYWJsZWQgKi8KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX0VOQUJMRV9NQ0NfQURBUFRJVkVfU0NIRUQsCisJCQkgICAgICZjZmdfdmFsKSA9PSBlU0lSX1NVQ0NFU1MpIHsKKwkJaWYgKGNmZ192YWwgPT0gV05JX0NGR19FTkFCTEVfTUNDX0FEQVBUSVZFX1NDSEVEX1NUQU1BWCkgeworCQkJV01BX0xPR0QoIiVzOiBDYW4ndCBzZXQgY2hhbm5lbCBxdW90YSB3aGlsZSAiCisJCQkJICJNQ0NfQURBUFRJVkVfU0NIRUQgaXMgZW5hYmxlZC4gRXhpdCIsCisJCQkJIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwl9IGVsc2UgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byByZXRyaWV2ZSAiCisJCQkgIldOSV9DRkdfRU5BQkxFX01DQ19BREFQVElWRV9TQ0hFRC4gRXhpdCIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qCisJICogUGVyZm9ybSBzYW5pdHkgY2hlY2sgb24gdGltZSBxdW90YSB2YWx1ZXMgcHJvdmlkZWQuCisJICovCisJaWYgKHF1b3RhX2NoYW4xIDwgV01JX01DQ19NSU5fQ0hBTk5FTF9RVU9UQSB8fAorCSAgICBxdW90YV9jaGFuMSA+IFdNSV9NQ0NfTUFYX0NIQU5ORUxfUVVPVEEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIHRpbWUgcXVvdGEgZm9yIENoYW5uZWwgIzE9JWRtcy4gTWluaW11bSAiCisJCQkgImlzIDIwbXMgJiBtYXhpbXVtIGlzIDgwbXMiLCBfX2Z1bmNfXywgcXVvdGFfY2hhbjEpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKwkvKiBTZXQgV01JIENNRCBmb3IgY2hhbm5lbCB0aW1lIHF1b3RhIGhlcmUgKi8KKwlsZW4gPSBzaXplb2Yod21pX3Jlc21ncl9zZXRfY2hhbl90aW1lX3F1b3RhX2NtZF9maXhlZF9wYXJhbSkgKworCSAgICAgIFdNSV9UTFZfSERSX1NJWkUgKyAgICAgICAvKiBQbGFjZSBob2xkZXIgZm9yIGNoYW5fdGltZV9xdW90YSBhcnJheSAqLworCSAgICAgIG51bV9jaGFubmVscyAqIHNpemVvZih3bWlfcmVzbWdyX2NoYW5fdGltZV9xdW90YSk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzIDogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwljbWRUUSA9ICh3bWlfcmVzbWdyX3NldF9jaGFuX3RpbWVfcXVvdGFfY21kX2ZpeGVkX3BhcmFtICopCisJCXdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWRUUS0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3Jlc21ncl9zZXRfY2hhbl90aW1lX3F1b3RhX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcmVzbWdyX3NldF9jaGFuX3RpbWVfcXVvdGFfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kVFEtPm51bV9jaGFucyA9IG51bV9jaGFubmVsczsKKworCS8qIFVwZGF0ZSBjaGFubmVsIHRpbWUgcXVvdGEgaW5mb3JtYXRpb24gZm9yIGhvbWUgY2hhbm5lbChzKSAqLworCWJ1Zl9wdHIgKz0gc2l6ZW9mKCpjbWRUUSk7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9CWVRFLAorCQkgICAgICAgbnVtX2NoYW5uZWxzICogc2l6ZW9mKHdtaV9yZXNtZ3JfY2hhbl90aW1lX3F1b3RhKSk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCWNoYW5fcXVvdGEuY2hhbl9taHogPSBjaGFuMV9mcmVxOworCWNoYW5fcXVvdGEuY2hhbm5lbF90aW1lX3F1b3RhID0gcXVvdGFfY2hhbjE7CisJY2RmX21lbV9jb3B5KGJ1Zl9wdHIsICZjaGFuX3F1b3RhLCBzaXplb2YoY2hhbl9xdW90YSkpOworCS8qIENvbnN0cnVjdCBjaGFubmVsIGFuZCBxdW90YSByZWNvcmQgZm9yIHRoZSAybmQgTUNDIG1vZGUuICovCisJYnVmX3B0ciArPSBzaXplb2YoY2hhbl9xdW90YSk7CisJY2hhbl9xdW90YS5jaGFuX21oeiA9IGNoYW4yX2ZyZXE7CisJY2hhbl9xdW90YS5jaGFubmVsX3RpbWVfcXVvdGEgPSBxdW90YV9jaGFuMjsKKwljZGZfbWVtX2NvcHkoYnVmX3B0ciwgJmNoYW5fcXVvdGEsIHNpemVvZihjaGFuX3F1b3RhKSk7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9SRVNNR1JfU0VUX0NIQU5fVElNRV9RVU9UQV9DTURJRCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgTUNDIENoYW5uZWwgVGltZSBRdW90YSBjb21tYW5kIik7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9zZXRfbGlua3N0YXRlKCkgLSBzZXQgd21hIGxpbmtzdGF0ZQorICogQHdtYTogd21hIGhhbmRsZQorICogQHBhcmFtczogbGluayBzdGF0ZSBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfc2V0X2xpbmtzdGF0ZSh0cF93bWFfaGFuZGxlIHdtYSwgdHBMaW5rU3RhdGVQYXJhbXMgcGFyYW1zKQoreworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldjsKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXY7CisJb2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyOworCXVpbnQ4X3QgdmRldl9pZCwgcGVlcl9pZDsKKwlib29sIHJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCXBhcmFtcy0+c3RhdHVzID0gdHJ1ZTsKKwlXTUFfTE9HRCgiJXM6IHN0YXRlICVkIHNlbGZtYWMgJXBNIiwgX19mdW5jX18sCisJCSBwYXJhbXMtPnN0YXRlLCBwYXJhbXMtPnNlbGZNYWNBZGRyKTsKKwlpZiAoKHBhcmFtcy0+c3RhdGUgIT0gZVNJUl9MSU5LX1BSRUFTU09DX1NUQVRFKSAmJgorCSAgICAocGFyYW1zLT5zdGF0ZSAhPSBlU0lSX0xJTktfRE9XTl9TVEFURSkpIHsKKwkJV01BX0xPR0QoIiVzOiB1bnN1cHBvcnRlZCBsaW5rIHN0YXRlICVkIiwKKwkJCSBfX2Z1bmNfXywgcGFyYW1zLT5zdGF0ZSk7CisJCWdvdG8gb3V0OworCX0KKworCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKworCWlmIChOVUxMID09IHBkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IFRYUlggY29udGV4dCIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCisJdmRldiA9IHdtYV9maW5kX3ZkZXZfYnlfYWRkcih3bWEsIHBhcmFtcy0+c2VsZk1hY0FkZHIsICZ2ZGV2X2lkKTsKKwlpZiAoIXZkZXYpIHsKKwkJV01BX0xPR1AoIiVzOiB2ZGV2IG5vdCBmb3VuZCBmb3IgYWRkcjogJXBNIiwKKwkJCSBfX2Z1bmNfXywgcGFyYW1zLT5zZWxmTWFjQWRkcik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh3bWFfaXNfdmRldl9pbl9hcF9tb2RlKHdtYSwgdmRldl9pZCkpIHsKKwkJV01BX0xPR0QoIiVzOiBJZ25vcmluZyBzZXQgbGluayByZXEgaW4gYXAgbW9kZSIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHBhcmFtcy0+c3RhdGUgPT0gZVNJUl9MSU5LX1BSRUFTU09DX1NUQVRFKSB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCQlpZiAod21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MpIHsKKwkJCXJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MgPSB0cnVlOworCQl9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRCAqLworCQlzdGF0dXMgPSB3bWFfY3JlYXRlX3BlZXIod21hLCBwZGV2LCB2ZGV2LCBwYXJhbXMtPmJzc2lkLAorCQkJCVdNSV9QRUVSX1RZUEVfREVGQVVMVCwgdmRldl9pZCwKKwkJCQlyb2FtX3N5bmNoX2luX3Byb2dyZXNzKTsKKwkJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQlwYXJhbXMtPnN0YXR1cyA9IGZhbHNlOworCX0gZWxzZSB7CisJCVdNQV9MT0dEKCIlcywgdmRldl9pZDogJWQsIHBhdXNpbmcgdHhfbGxfcXVldWUgZm9yIFZERVZfU1RPUCIsCisJCQkgX19mdW5jX18sIHZkZXZfaWQpOworCQlvbF90eHJ4X3ZkZXZfcGF1c2Uod21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmhhbmRsZSwKKwkJCQkgICBPTF9UWFFfUEFVU0VfUkVBU09OX1ZERVZfU1RPUCk7CisJCXdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5wYXVzZV9iaXRtYXAgfD0gKDEgPDwgUEFVU0VfVFlQRV9IT1NUKTsKKwkJaWYgKHdtaV91bmlmaWVkX3ZkZXZfc3RvcF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCkpIHsKKwkJCVdNQV9MT0dQKCIlczogJWQgRmFpbGVkIHRvIHNlbmQgdmRldiBzdG9wIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJfQorCQlwZWVyID0gb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcihwZGV2LCBwYXJhbXMtPmJzc2lkLCAmcGVlcl9pZCk7CisJCWlmIChwZWVyKSB7CisJCQlXTUFfTE9HUCgiJXM6IERlbGV0aW5nIHBlZXIgJXBNIHZkZXYgaWQgJWQiLAorCQkJCSBfX2Z1bmNfXywgcGFyYW1zLT5ic3NpZCwgdmRldl9pZCk7CisJCQl3bWFfcmVtb3ZlX3BlZXIod21hLCBwYXJhbXMtPmJzc2lkLCB2ZGV2X2lkLCBwZWVyLAorCQkJCQlyb2FtX3N5bmNoX2luX3Byb2dyZXNzKTsKKwkJfQorCX0KK291dDoKKwl3bWFfc2VuZF9tc2cod21hLCBXTUFfU0VUX0xJTktfU1RBVEVfUlNQLCAodm9pZCAqKXBhcmFtcywgMCk7Cit9CisKKy8qKgorICogd21hX3VucGF1c2VfdmRldiAtIHVucGF1c2UgYWxsIHZkZXYKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqCisgKiB1bnBhdXNlIGFsbCB2ZGV2IGFmdHRlciByZXN1bWUvY29taW5nIG91dCBvZiB3b3cgbW9kZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV91bnBhdXNlX3ZkZXYodHBfd21hX2hhbmRsZSB3bWEpCit7CisJaW50OF90IHZkZXZfaWQ7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlOworCisJZm9yICh2ZGV2X2lkID0gMDsgdmRldl9pZCA8IHdtYS0+bWF4X2Jzc2lkOyB2ZGV2X2lkKyspIHsKKwkJaWYgKCF3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uaGFuZGxlKQorCQkJY29udGludWU7CisKKyNpZiBkZWZpbmVkKFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MKSB8fCBkZWZpbmVkKFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIpCisJCS8qIFdoZW4gaG9zdCByZXN1bWUsIGJ5IGRlZmF1bHQsIHVucGF1c2UgYWxsIGFjdGl2ZSB2ZGV2ICovCisJCWlmICh3bWEtPmludGVyZmFjZXNbdmRldl9pZF0ucGF1c2VfYml0bWFwKSB7CisJCQlvbF90eHJ4X3ZkZXZfdW5wYXVzZSh3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uaGFuZGxlLAorCQkJCQkgICAgIDB4ZmZmZmZmZmYpOworCQkJd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnBhdXNlX2JpdG1hcCA9IDA7CisJCX0KKyNlbmRpZiAvKiBRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCAqLworCisJCWlmYWNlID0gJndtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXTsKKwkJaWZhY2UtPmNvbm5fc3RhdGUgPSBmYWxzZTsKKwl9Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3NfcmF0ZV91cGRhdGVfaW5kYXRlKCkgLSByYXRlIHVwZGF0ZSBpbmRpY2F0aW9uCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcFJhdGVVcGRhdGVQYXJhbXM6IFJhdGUgdXBkYXRlIHBhcmFtcworICoKKyAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlIHJhdGUgJiBzaG9ydCBHSSBpbnRlcnZhbCB0byBmdyBiYXNlZCBvbiBwYXJhbXMKKyAqIHNlbmQgYnkgU01FLgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX3JhdGVfdXBkYXRlX2luZGljYXRlKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkgICAgdFNpclJhdGVVcGRhdGVJbmQgKgorCQkJCQkgICAgcFJhdGVVcGRhdGVQYXJhbXMpCit7CisJaW50MzJfdCByZXQgPSAwOworCXVpbnQ4X3QgdmRldl9pZCA9IDA7CisJdm9pZCAqcGRldjsKKwlpbnQzMl90IG1icHN4MTBfcmF0ZSA9IC0xOworCXVpbnQzMl90IHBhcmFtSWQ7CisJdWludDhfdCByYXRlID0gMDsKKwl1aW50MzJfdCBzaG9ydF9naTsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaW50ciA9IHdtYS0+aW50ZXJmYWNlczsKKworCS8qIEdldCB0aGUgdmRldiBpZCAqLworCXBkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2FkZHIod21hLCBwUmF0ZVVwZGF0ZVBhcmFtcy0+YnNzaWQsICZ2ZGV2X2lkKTsKKwlpZiAoIXBkZXYpIHsKKwkJV01BX0xPR0UoInZkZXYgaGFuZGxlIGlzIGludmFsaWQgZm9yICVwTSIsCisJCQkgcFJhdGVVcGRhdGVQYXJhbXMtPmJzc2lkKTsKKwkJY2RmX21lbV9mcmVlKHBSYXRlVXBkYXRlUGFyYW1zKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJc2hvcnRfZ2kgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5zaG9ydGdpOworCWlmIChzaG9ydF9naSA9PSAwKQorCQlzaG9ydF9naSA9IChpbnRyW3ZkZXZfaWRdLnJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfU0dJKSA/CisJCQkJCQkJCSB0cnVlIDogZmFsc2U7CisJLyogZmlyc3QgY2hlY2sgaWYgcmVsaWFibGUgVFggbWNhc3QgcmF0ZSBpcyB1c2VkLiBJZiBub3QgY2hlY2sgdGhlIGJjYXN0LgorCSAqIFRoZW4gaXMgbWNhc3QuIE1jYXN0IHJhdGUgaXMgc2F2ZWQgaW4gbWNhc3REYXRhUmF0ZTI0R0h6CisJICovCisJaWYgKHBSYXRlVXBkYXRlUGFyYW1zLT5yZWxpYWJsZU1jYXN0RGF0YVJhdGVUeEZsYWcgPiAwKSB7CisJCW1icHN4MTBfcmF0ZSA9IHBSYXRlVXBkYXRlUGFyYW1zLT5yZWxpYWJsZU1jYXN0RGF0YVJhdGU7CisJCXBhcmFtSWQgPSBXTUlfVkRFVl9QQVJBTV9NQ0FTVF9EQVRBX1JBVEU7CisJCWlmIChwUmF0ZVVwZGF0ZVBhcmFtcy0+CisJCSAgICByZWxpYWJsZU1jYXN0RGF0YVJhdGVUeEZsYWcgJiBlSEFMX1RYX1JBVEVfU0dJKQorCQkJc2hvcnRfZ2kgPSAxOyAgIC8qIHVwcGVyIGxheWVyIHNwZWNpZmllZCBzaG9ydCBHSSAqLworCX0gZWxzZSBpZiAocFJhdGVVcGRhdGVQYXJhbXMtPmJjYXN0RGF0YVJhdGUgPiAtMSkgeworCQltYnBzeDEwX3JhdGUgPSBwUmF0ZVVwZGF0ZVBhcmFtcy0+YmNhc3REYXRhUmF0ZTsKKwkJcGFyYW1JZCA9IFdNSV9WREVWX1BBUkFNX0JDQVNUX0RBVEFfUkFURTsKKwl9IGVsc2UgeworCQltYnBzeDEwX3JhdGUgPSBwUmF0ZVVwZGF0ZVBhcmFtcy0+bWNhc3REYXRhUmF0ZTI0R0h6OworCQlwYXJhbUlkID0gV01JX1ZERVZfUEFSQU1fTUNBU1RfREFUQV9SQVRFOworCQlpZiAocFJhdGVVcGRhdGVQYXJhbXMtPgorCQkgICAgbWNhc3REYXRhUmF0ZTI0R0h6VHhGbGFnICYgZUhBTF9UWF9SQVRFX1NHSSkKKwkJCXNob3J0X2dpID0gMTsgICAvKiB1cHBlciBsYXllciBzcGVjaWZpZWQgc2hvcnQgR0kgKi8KKwl9CisJV01BX0xPR0UoIiVzOiBkZXZfaWQgPSAlZCwgZGV2X3R5cGUgPSAlZCwgZGV2X21vZGUgPSAlZCwgIgorCQkgIm1hYyA9ICVwTSwgY29uZmlnLnNob3J0Z2kgPSAlZCwgcmF0ZV9mbGFncyA9IDB4JXgiLAorCQkgX19mdW5jX18sIHZkZXZfaWQsIGludHJbdmRldl9pZF0udHlwZSwKKwkJIHBSYXRlVXBkYXRlUGFyYW1zLT5kZXZfbW9kZSwgcFJhdGVVcGRhdGVQYXJhbXMtPmJzc2lkLAorCQkgaW50clt2ZGV2X2lkXS5jb25maWcuc2hvcnRnaSwgaW50clt2ZGV2X2lkXS5yYXRlX2ZsYWdzKTsKKwlyZXQgPSB3bWFfZW5jb2RlX21jX3JhdGUoc2hvcnRfZ2ksIGludHJbdmRldl9pZF0uY29uZmlnLmNod2lkdGgsCisJCQkJIGludHJbdmRldl9pZF0uY2hhbm1vZGUsIGludHJbdmRldl9pZF0ubWh6LAorCQkJCSBtYnBzeDEwX3JhdGUsIHBSYXRlVXBkYXRlUGFyYW1zLT5uc3MsICZyYXRlKTsKKwlpZiAocmV0ICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HRSgiJXM6IEVycm9yLCBJbnZhbGlkIGlucHV0IHJhdGUgdmFsdWUiLCBfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShwUmF0ZVVwZGF0ZVBhcmFtcyk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkgICAgICBXTUlfVkRFVl9QQVJBTV9TR0ksIHNob3J0X2dpKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIFNldCBXTUlfVkRFVl9QQVJBTV9TR0kgKCVkKSwgcmV0ID0gJWQiLAorCQkJIF9fZnVuY19fLCBzaG9ydF9naSwgcmV0KTsKKwkJY2RmX21lbV9mcmVlKHBSYXRlVXBkYXRlUGFyYW1zKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJICAgICAgdmRldl9pZCwgcGFyYW1JZCwgcmF0ZSk7CisJY2RmX21lbV9mcmVlKHBSYXRlVXBkYXRlUGFyYW1zKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIFNldCByYXRlLCByZXQgPSAlZCIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfbWdtdF90eF9hY2tfd29ya19oYW5kbGVyKCkgLSBtZ210IHR4IGFjayB3b3JrIHF1ZXVlCisgKiBAYWNrX3dvcms6IHdvcmsgc3RydWN0dXJlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9tZ210X3R4X2Fja193b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICphY2tfd29yaykKK3sKKwlzdHJ1Y3Qgd21hX3R4X2Fja193b3JrX2N0eCAqd29yazsKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGU7CisJcFdNQUFja0ZuVHhDb21wIGFja19jYjsKKworCWlmIChjZHNfaXNfbG9hZF91bmxvYWRfaW5fcHJvZ3Jlc3MoKSkgeworCQlXTUFfTE9HRSgiJXM6IERyaXZlciBsb2FkL3VubG9hZCBpbiBwcm9ncmVzcyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXdvcmsgPSBjb250YWluZXJfb2YoYWNrX3dvcmssIHN0cnVjdCB3bWFfdHhfYWNrX3dvcmtfY3R4LCBhY2tfY21wX3dvcmspOworCXdtYV9oYW5kbGUgPSB3b3JrLT53bWFfaGFuZGxlOworCWFja19jYiA9IHdtYV9oYW5kbGUtPnVtYWNfb3RhX2Fja19jYlt3b3JrLT5zdWJfdHlwZV07CisKKwlXTUFfTE9HRCgiVHggQWNrIENiIFN1YlR5cGUgJWQgU3RhdHVzICVkIiwKKwkJIHdvcmstPnN1Yl90eXBlLCB3b3JrLT5zdGF0dXMpOworCisJLyogQ2FsbCB0aGUgQWNrIENiIHJlZ2lzdGVyZWQgYnkgVU1BQyAqLworCWFja19jYigodHBBbmlTaXJHbG9iYWwpICh3bWFfaGFuZGxlLT5tYWNfY29udGV4dCksCisJICAgICAgIHdvcmstPnN0YXR1cyA/IDAgOiAxKTsKKworCWNkZl9tZW1fZnJlZSh3b3JrKTsKKwl3bWFfaGFuZGxlLT5hY2tfd29ya19jdHggPSBOVUxMOworfQorCisvKioKKyAqIHdtYV9tZ210X3R4X2NvbXBfY29uZl9pbmQoKSAtIFBvc3QgbWdtdCB0eCBjb21wbGV0ZSBpbmRpY2F0aW9uIHRvIFBFLgorICogQHdtYV9oYW5kbGU6IFBvaW50ZXIgdG8gV01BIGhhbmRsZQorICogQHN1Yl90eXBlOiBUeCBtZ210IGZyYW1lIHN1YiB0eXBlCisgKiBAc3RhdHVzOiBNZ210IGZyYW1lIHR4IHN0YXR1cworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgbWdtdCBjb21wbGl0aW9uIGNvbmZpcm1hdGlvbiB0byBQRSBmb3IgZGVhdXRoCisgKiBhbmQgZGVhc3NvYyBmcmFtZXMuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCit3bWFfbWdtdF90eF9jb21wX2NvbmZfaW5kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgdWludDhfdCBzdWJfdHlwZSwKKwkJCSAgaW50MzJfdCBzdGF0dXMpCit7CisJaW50MzJfdCB0eF9jb21wX3N0YXR1czsKKworCXR4X2NvbXBfc3RhdHVzID0gc3RhdHVzID8gMCA6IDE7CisJaWYgKHN1Yl90eXBlID09IFNJUl9NQUNfTUdNVF9ESVNBU1NPQykgeworCQl3bWFfc2VuZF9tc2cod21hX2hhbmRsZSwgV01BX0RJU0FTU09DX1RYX0NPTVAsIE5VTEwsCisJCQkgICAgIHR4X2NvbXBfc3RhdHVzKTsKKwl9IGVsc2UgaWYgKHN1Yl90eXBlID09IFNJUl9NQUNfTUdNVF9ERUFVVEgpIHsKKwkJd21hX3NlbmRfbXNnKHdtYV9oYW5kbGUsIFdNQV9ERUFVVEhfVFhfQ09NUCwgTlVMTCwKKwkJCSAgICAgdHhfY29tcF9zdGF0dXMpOworCX0KK30KKworLyoqCisgKiB3bWFfbWdtdF90eF9hY2tfY29tcF9oZGxyKCkgLSBoYW5kbGVzIHR4IGFjayBtZ210IGNvbXBsZXRpb24KKyAqIEBjb250ZXh0OiBjb250ZXh0IHdpdGggd2hpY2ggdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZAorICogQG5ldGJ1ZjogdHggbWdtdCBuYnVmCisgKiBAc3RhdHVzOiBzdGF0dXMgb2YgdHggY29tcGxldGlvbgorICoKKyAqIFRoaXMgaXMgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIFR4UnggZm9yCisgKiBBY2sgQ29tcGxldGUuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCit3bWFfbWdtdF90eF9hY2tfY29tcF9oZGxyKHZvaWQgKndtYV9jb250ZXh0LCBjZGZfbmJ1Zl90IG5ldGJ1ZiwgaW50MzJfdCBzdGF0dXMpCit7CisJdHBTaXJNYWNGcmFtZUN0bCBwRmMgPSAodHBTaXJNYWNGcmFtZUN0bCkgKGNkZl9uYnVmX2RhdGEobmV0YnVmKSk7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIHdtYV9jb250ZXh0OworCisJaWYgKHdtYV9oYW5kbGUgJiYgd21hX2hhbmRsZS0+dW1hY19vdGFfYWNrX2NiW3BGYy0+c3ViVHlwZV0pIHsKKwkJaWYgKChwRmMtPnN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0RJU0FTU09DKSB8fAorCQkgICAgKHBGYy0+c3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfREVBVVRIKSkgeworCQkJd21hX21nbXRfdHhfY29tcF9jb25mX2luZCh3bWFfaGFuZGxlLAorCQkJCQkJICAodWludDhfdCkgcEZjLT5zdWJUeXBlLAorCQkJCQkJICBzdGF0dXMpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHdtYV90eF9hY2tfd29ya19jdHggKmFja193b3JrOworCisJCQlhY2tfd29yayA9CisJCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCB3bWFfdHhfYWNrX3dvcmtfY3R4KSk7CisKKwkJCWlmIChhY2tfd29yaykgeworI2lmZGVmIENPTkZJR19DTlNTCisJCQkJY25zc19pbml0X3dvcmsoJmFja193b3JrLT5hY2tfY21wX3dvcmssCisJCQkJCSAgICAgICB3bWFfbWdtdF90eF9hY2tfd29ya19oYW5kbGVyKTsKKyNlbHNlCisJCQkJSU5JVF9XT1JLKCZhY2tfd29yay0+YWNrX2NtcF93b3JrLAorCQkJCQkgIHdtYV9tZ210X3R4X2Fja193b3JrX2hhbmRsZXIpOworI2VuZGlmIC8qIENPTkZJR19DTlNTICovCisJCQkJYWNrX3dvcmstPndtYV9oYW5kbGUgPSB3bWFfaGFuZGxlOworCQkJCWFja193b3JrLT5zdWJfdHlwZSA9IHBGYy0+c3ViVHlwZTsKKwkJCQlhY2tfd29yay0+c3RhdHVzID0gc3RhdHVzOworCisJCQkJLyogU2NoZWR1ZSB0aGUgV29yayAqLworCQkJCXNjaGVkdWxlX3dvcmsoJmFja193b3JrLT5hY2tfY21wX3dvcmspOworCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqIHdtYV9tZ210X3R4X2Rsb2FkX2NvbXBfaGxkcigpIC0gaGFuZGxlcyB0eCBtZ210IGNvbXBsZXRpb24KKyAqIEBjb250ZXh0OiBjb250ZXh0IHdpdGggd2hpY2ggdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZAorICogQG5ldGJ1ZjogdHggbWdtdCBuYnVmCisgKiBAc3RhdHVzOiBzdGF0dXMgb2YgdHggY29tcGxldGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgcmVnaXN0ZXJlZCBkb3dubG9hZCBjYWxsYmFjayB3aGlsZSBzZW5kaW5nIG1nbXQgcGFja2V0LgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZAord21hX21nbXRfdHhfZGxvYWRfY29tcF9obGRyKHZvaWQgKndtYV9jb250ZXh0LCBjZGZfbmJ1Zl90IG5ldGJ1ZiwKKwkJCSAgICBpbnQzMl90IHN0YXR1cykKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUgPSAodHBfd21hX2hhbmRsZSkgd21hX2NvbnRleHQ7CisJdm9pZCAqbWFjX2NvbnRleHQgPSB3bWFfaGFuZGxlLT5tYWNfY29udGV4dDsKKworCVdNQV9MT0dEKCJUeCBDb21wbGV0ZSBTdGF0dXMgJWQiLCBzdGF0dXMpOworCisJaWYgKCF3bWFfaGFuZGxlLT50eF9mcm1fZG93bmxvYWRfY29tcF9jYikgeworCQlXTUFfTE9HRSgiVHggQ29tcGxldGUgQ2Igbm90IHJlZ2lzdGVyZWQgYnkgdW1hYyIpOworCQlyZXR1cm47CisJfQorCisJLyogQ2FsbCBUeCBNZ210IENvbXBsZXRlIENhbGxiYWNrIHJlZ2lzdGVyZWQgYnkgdW1hYyAqLworCXdtYV9oYW5kbGUtPnR4X2ZybV9kb3dubG9hZF9jb21wX2NiKG1hY19jb250ZXh0LCBuZXRidWYsIDApOworCisJLyogUmVzZXQgQ2FsbGJhY2sgKi8KKwl3bWFfaGFuZGxlLT50eF9mcm1fZG93bmxvYWRfY29tcF9jYiA9IE5VTEw7CisKKwkvKiBTZXQgdGhlIFR4IE1nbXQgQ29tcGxldGUgRXZlbnQgKi8KKwljZGZfc3RhdHVzID0gY2RmX2V2ZW50X3NldCgmd21hX2hhbmRsZS0+dHhfZnJtX2Rvd25sb2FkX2NvbXBfZXZlbnQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQorCQlXTUFfTE9HUCgiJXM6IEV2ZW50IFNldCBmYWlsZWQgLSB0eF9mcm1fY29tcF9ldmVudCIsIF9fZnVuY19fKTsKK30KKworLyoqCisgKiB3bWFfdHhfYXR0YWNoKCkgLSBhdHRhY2ggdHggcmVsYXRlZCBjYWxsYmFja3MKKyAqIEBwd21hQ3R4OiB3bWEgY29udGV4dAorICoKKyAqIGF0dGFjaGVzIHR4IGZuIHdpdGggdW5kZXJseWluZyBsYXllci4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfdHhfYXR0YWNoKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSkKK3sKKwkvKiBHZXQgdGhlIFZvcyBDb250ZXh0ICovCisJcF9jZHNfY29udGV4dFR5cGUgY2RzX2hhbmRsZSA9CisJCShwX2Nkc19jb250ZXh0VHlwZSkgKHdtYV9oYW5kbGUtPmNkc19jb250ZXh0KTsKKworCS8qIEdldCB0aGUgdHhSeCBQZGV2IGhhbmRsZSAqLworCW9sX3R4cnhfcGRldl9oYW5kbGUgdHhyeF9wZGV2ID0KKwkJKG9sX3R4cnhfcGRldl9oYW5kbGUpIChjZHNfaGFuZGxlLT5wZGV2X3R4cnhfY3R4KTsKKworCS8qIFJlZ2lzdGVyIGZvciBUeCBNYW5hZ2VtZW50IEZyYW1lcyAqLworCW9sX3R4cnhfbWdtdF90eF9jYl9zZXQodHhyeF9wZGV2LCBHRU5FUklDX05PRE9XTE9BRF9BQ0tfQ09NUF9JTkRFWCwKKwkJCSAgICAgIE5VTEwsIHdtYV9tZ210X3R4X2Fja19jb21wX2hkbHIsIHdtYV9oYW5kbGUpOworCisJb2xfdHhyeF9tZ210X3R4X2NiX3NldCh0eHJ4X3BkZXYsIEdFTkVSSUNfRE9XTkxEX0NPTVBfTk9BQ0tfQ09NUF9JTkRFWCwKKwkJCSAgICAgIHdtYV9tZ210X3R4X2Rsb2FkX2NvbXBfaGxkciwgTlVMTCwgd21hX2hhbmRsZSk7CisKKwlvbF90eHJ4X21nbXRfdHhfY2Jfc2V0KHR4cnhfcGRldiwgR0VORVJJQ19ET1dOTERfQ09NUF9BQ0tfQ09NUF9JTkRFWCwKKwkJCSAgICAgIHdtYV9tZ210X3R4X2Rsb2FkX2NvbXBfaGxkciwKKwkJCSAgICAgIHdtYV9tZ210X3R4X2Fja19jb21wX2hkbHIsIHdtYV9oYW5kbGUpOworCisJLyogU3RvcmUgdGhlIE1hYyBDb250ZXh0ICovCisJd21hX2hhbmRsZS0+bWFjX2NvbnRleHQgPSBjZHNfaGFuZGxlLT5wTUFDQ29udGV4dDsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3R4X2RldGFjaCgpIC0gZGV0YWNoIHR4IHJlbGF0ZWQgY2FsbGJhY2tzCisgKiBAdHBfd21hX2hhbmRsZTogd21hIGNvbnRleHQKKyAqCisgKiBEZXJlZ2lzdGVyIHdpdGggVHhSeCBmb3IgVHggTWdtdCBEb3dubG9hZCBhbmQgQWNrIGNvbXBsZXRpb24uCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3R4X2RldGFjaCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpCit7CisJdWludDMyX3QgZnJhbWVfaW5kZXggPSAwOworCisJLyogR2V0IHRoZSBWb3MgQ29udGV4dCAqLworCXBfY2RzX2NvbnRleHRUeXBlIGNkc19oYW5kbGUgPQorCQkocF9jZHNfY29udGV4dFR5cGUpICh3bWFfaGFuZGxlLT5jZHNfY29udGV4dCk7CisKKwkvKiBHZXQgdGhlIHR4UnggUGRldiBoYW5kbGUgKi8KKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHR4cnhfcGRldiA9CisJCShvbF90eHJ4X3BkZXZfaGFuZGxlKSAoY2RzX2hhbmRsZS0+cGRldl90eHJ4X2N0eCk7CisKKwkvKiBEZXJlZ2lzdGVyIHdpdGggVHhSeCBmb3IgVHggTWdtdCBjb21wbGV0aW9uIGNhbGwgYmFjayAqLworCWZvciAoZnJhbWVfaW5kZXggPSAwOyBmcmFtZV9pbmRleCA8IEZSQU1FX0lOREVYX01BWDsgZnJhbWVfaW5kZXgrKykKKwkJb2xfdHhyeF9tZ210X3R4X2NiX3NldCh0eHJ4X3BkZXYsIGZyYW1lX2luZGV4LCBOVUxMLCBOVUxMLAorCQkJCSAgICAgICB0eHJ4X3BkZXYpOworCisJLyogRGVzdHJveSBUeCBGcmFtZSBDb21wbGV0ZSBldmVudCAqLworCWNkZl9ldmVudF9kZXN0cm95KCZ3bWFfaGFuZGxlLT50eF9mcm1fZG93bmxvYWRfY29tcF9ldmVudCk7CisKKwkvKiBUeCBxdWV1ZSBlbXB0eSBjaGVjayBldmVudCAoZHVtbXkgZXZlbnQpICovCisJY2RmX2V2ZW50X2Rlc3Ryb3koJndtYV9oYW5kbGUtPnR4X3F1ZXVlX2VtcHR5X2V2ZW50KTsKKworCS8qIFJlc2V0IFR4IEZybSBDYWxsYmFja3MgKi8KKwl3bWFfaGFuZGxlLT50eF9mcm1fZG93bmxvYWRfY29tcF9jYiA9IE5VTEw7CisKKwkvKiBSZXNldCBUeCBEYXRhIEZyYW1lIEFjayBDYiAqLworCXdtYV9oYW5kbGUtPnVtYWNfZGF0YV9vdGFfYWNrX2NiID0gTlVMTDsKKworCS8qIFJlc2V0IGxhc3QgVHggRGF0YSBGcmFtZSBuYnVmIHB0ciAqLworCXdtYV9oYW5kbGUtPmxhc3RfdW1hY19kYXRhX25idWYgPSBOVUxMOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmIGRlZmluZWQoUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wpIHx8IGRlZmluZWQoUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMikKKy8qKgorICogd21hX21jY192ZGV2X3R4X3BhdXNlX2V2dF9oYW5kbGVyKCkgLSBwYXVzZSBldmVudCBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZXZlbnQ6IGV2ZW50IGJ1ZmZlcgorICogQGxlbjogZGF0YSBsZW5ndGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZSBwYXVzZSBldmVudCBmcm9tIGZ3IGFuZCBwYXVzZS91bnBhdXNlCisgKiB2ZGV2LgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlLgorICovCitpbnQgd21hX21jY192ZGV2X3R4X3BhdXNlX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsCisJCQkJICAgICAgdWludDMyX3QgbGVuKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlXTUlfVFhfUEFVU0VfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX3R4X3BhdXNlX2V2ZW50X2ZpeGVkX3BhcmFtICp3bWlfZXZlbnQ7CisJdWludDhfdCB2ZGV2X2lkOworCUFfVUlOVDMyIHZkZXZfbWFwOworCisJcGFyYW1fYnVmID0gKFdNSV9UWF9QQVVTRV9FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnQ7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgcm9hbSBldmVudCBidWZmZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdtYV9nZXRfd293X2J1c19zdXNwZW5kKHdtYSkpIHsKKwkJV01BX0xPR0QoIiBTdXNwZW5kIGlzIGluIHByb2dyZXNzOiBQYXVzZS9VbnBhdXNlIFR4IGlzIE5vT3AiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd21pX2V2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwl2ZGV2X21hcCA9IHdtaV9ldmVudC0+dmRldl9tYXA7CisJLyogRlcgbWFwcGVkIHZkZXYgZnJvbSBJRAorCSAqIHZkZXZfbWFwID0gKDEgPDwgdmRldl9pZCkKKwkgKiBTbywgaG9zdCBzaG91bGQgdW5tYXAgdG8gSUQgKi8KKwlmb3IgKHZkZXZfaWQgPSAwOyB2ZGV2X21hcCAhPSAwOyB2ZGV2X2lkKyspIHsKKwkJaWYgKCEodmRldl9tYXAgJiAweDEpKSB7CisJCQkvKiBObyBWZGV2ICovCisJCX0gZWxzZSB7CisJCQlpZiAoIXdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5oYW5kbGUpIHsKKwkJCQlXTUFfTE9HRSgiJXM6IGludmFsaWQgdmRldiBJRCAlZCIsIF9fZnVuY19fLAorCQkJCQkgdmRldl9pZCk7CisJCQkJLyogVGVzdCBOZXh0IFZERVYgKi8KKwkJCQl2ZGV2X21hcCA+Pj0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogUEFVU0UgYWN0aW9uLCBhZGQgYml0bWFwICovCisJCQlpZiAoQUNUSU9OX1BBVVNFID09IHdtaV9ldmVudC0+YWN0aW9uKSB7CisJCQkJLyoKKwkJCQkgKiBOb3cgb25seSBzdXBwb3J0IHBlci1kZXYgcGF1c2Ugc28gaXQgaXMgbm90CisJCQkJICogbmVjZXNzYXJ5IHRvIHBhdXNlIGEgcGF1c2VkIHF1ZXVlIGFnYWluLgorCQkJCSAqLworCQkJCWlmICghd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnBhdXNlX2JpdG1hcCkKKwkJCQkJb2xfdHhyeF92ZGV2X3BhdXNlKAorCQkJCQkJd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLgorCQkJCQkJaGFuZGxlLAorCQkJCQkJT0xfVFhRX1BBVVNFX1JFQVNPTl9GVyk7CisJCQkJd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnBhdXNlX2JpdG1hcCB8PQorCQkJCQkoMSA8PCB3bWlfZXZlbnQtPnBhdXNlX3R5cGUpOworCQkJfQorCQkJLyogVU5QQVVTRSBhY3Rpb24sIGNsZWFuIGJpdG1hcCAqLworCQkJZWxzZSBpZiAoQUNUSU9OX1VOUEFVU0UgPT0gd21pX2V2ZW50LT5hY3Rpb24pIHsKKwkJCQkvKiBIYW5kbGUgdW5wYXVzZSBvbmx5IGlmIGFscmVhZHkgcGF1c2VkICovCisJCQkJaWYgKHdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5wYXVzZV9iaXRtYXApIHsKKwkJCQkJd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnBhdXNlX2JpdG1hcCAmPQorCQkJCQkJfigxIDw8IHdtaV9ldmVudC0+cGF1c2VfdHlwZSk7CisKKwkJCQkJaWYgKCF3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uCisJCQkJCSAgICBwYXVzZV9iaXRtYXApIHsKKwkJCQkJCS8qIFBBVVNFIEJJVCBNQVAgaXMgY2xlYXJlZAorCQkJCQkJICogVU5QQVVTRSBWREVWICovCisJCQkJCQlvbF90eHJ4X3ZkZXZfdW5wYXVzZSgKKwkJCQkJCQl3bWEtPmludGVyZmFjZXNbdmRldl9pZF0KKwkJCQkJCQkJLmhhbmRsZSwKKwkJCQkJCQlPTF9UWFFfUEFVU0VfUkVBU09OX0ZXKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJV01BX0xPR0UoIk5vdCBWYWxpZCBBY3Rpb24gVHlwZSAlZCIsCisJCQkJCSB3bWlfZXZlbnQtPmFjdGlvbik7CisJCQl9CisKKwkJCVdNQV9MT0dECisJCQkJKCJ2ZGV2X2lkICVkLCBwYXVzZV9tYXAgMHgleCwgcGF1c2UgdHlwZSAlZCwgYWN0aW9uICVkIiwKKwkJCQl2ZGV2X2lkLCB3bWEtPmludGVyZmFjZXNbdmRldl9pZF0ucGF1c2VfYml0bWFwLAorCQkJCXdtaV9ldmVudC0+cGF1c2VfdHlwZSwgd21pX2V2ZW50LT5hY3Rpb24pOworCQl9CisJCS8qIFRlc3QgTmV4dCBWREVWICovCisJCXZkZXZfbWFwID4+PSAxOworCX0KKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wgKi8KKworLyoqCisgKiB3bWFfcHJvY2Vzc19pbml0X3RoZXJtYWxfaW5mbygpIC0gaW5pdGlhbGl6ZSB0aGVybWFsIGluZm8KKyAqIEB3bWE6IFBvaW50ZXIgdG8gV01BIGhhbmRsZQorICogQHBUaGVybWFsUGFyYW1zOiBQb2ludGVyIHRvIHRoZXJtYWwgbWl0aWdhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgdGhlcm1hbCBtYW5hZ2VtZW50IHRhYmxlIGluIFdNQSwKKyAqIHNlbmRzIGRvd24gdGhlIGluaXRpYWwgdGVtcGVyYXR1cmUgdGhyZXNob2xkcyB0byB0aGUgZmlybXdhcmUKKyAqIGFuZCBjb25maWd1cmVzIHRoZSB0aHJvdHRsZSBwZXJpb2QgaW4gdGhlIHR4IHJ4IG1vZHVsZQorICoKKyAqIFJldHVybnM6IENERl9TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvdGhlcndpc2UgZmFpbHVyZQorICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX2luaXRfdGhlcm1hbF9pbmZvKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkgdF90aGVybWFsX21nbXQgKnBUaGVybWFsUGFyYW1zKQoreworCXRfdGhlcm1hbF9jbWRfcGFyYW1zIHRoZXJtYWxfcGFyYW1zOworCW9sX3R4cnhfcGRldl9oYW5kbGUgY3Vycl9wZGV2OworCisJaWYgKE5VTEwgPT0gd21hIHx8IE5VTEwgPT0gcFRoZXJtYWxQYXJhbXMpIHsKKwkJV01BX0xPR0UoIlRNIEludmFsaWQgaW5wdXQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWN1cnJfcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCWlmIChOVUxMID09IGN1cnJfcGRldikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgcGRldiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCVdNQV9MT0dEKCJUTSBlbmFibGUgJWQgcGVyaW9kICVkIiwgcFRoZXJtYWxQYXJhbXMtPnRoZXJtYWxNZ210RW5hYmxlZCwKKwkJIHBUaGVybWFsUGFyYW1zLT50aHJvdHRsZVBlcmlvZCk7CisKKwl3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxNZ210RW5hYmxlZCA9CisJCXBUaGVybWFsUGFyYW1zLT50aGVybWFsTWdtdEVuYWJsZWQ7CisJd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTGV2ZWxzWzBdLm1pblRlbXBUaHJlc2hvbGQgPQorCQlwVGhlcm1hbFBhcmFtcy0+dGhlcm1hbExldmVsc1swXS5taW5UZW1wVGhyZXNob2xkOworCXdtYS0+dGhlcm1hbF9tZ210X2luZm8udGhlcm1hbExldmVsc1swXS5tYXhUZW1wVGhyZXNob2xkID0KKwkJcFRoZXJtYWxQYXJhbXMtPnRoZXJtYWxMZXZlbHNbMF0ubWF4VGVtcFRocmVzaG9sZDsKKwl3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxMZXZlbHNbMV0ubWluVGVtcFRocmVzaG9sZCA9CisJCXBUaGVybWFsUGFyYW1zLT50aGVybWFsTGV2ZWxzWzFdLm1pblRlbXBUaHJlc2hvbGQ7CisJd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTGV2ZWxzWzFdLm1heFRlbXBUaHJlc2hvbGQgPQorCQlwVGhlcm1hbFBhcmFtcy0+dGhlcm1hbExldmVsc1sxXS5tYXhUZW1wVGhyZXNob2xkOworCXdtYS0+dGhlcm1hbF9tZ210X2luZm8udGhlcm1hbExldmVsc1syXS5taW5UZW1wVGhyZXNob2xkID0KKwkJcFRoZXJtYWxQYXJhbXMtPnRoZXJtYWxMZXZlbHNbMl0ubWluVGVtcFRocmVzaG9sZDsKKwl3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxMZXZlbHNbMl0ubWF4VGVtcFRocmVzaG9sZCA9CisJCXBUaGVybWFsUGFyYW1zLT50aGVybWFsTGV2ZWxzWzJdLm1heFRlbXBUaHJlc2hvbGQ7CisJd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTGV2ZWxzWzNdLm1pblRlbXBUaHJlc2hvbGQgPQorCQlwVGhlcm1hbFBhcmFtcy0+dGhlcm1hbExldmVsc1szXS5taW5UZW1wVGhyZXNob2xkOworCXdtYS0+dGhlcm1hbF9tZ210X2luZm8udGhlcm1hbExldmVsc1szXS5tYXhUZW1wVGhyZXNob2xkID0KKwkJcFRoZXJtYWxQYXJhbXMtPnRoZXJtYWxMZXZlbHNbM10ubWF4VGVtcFRocmVzaG9sZDsKKwl3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxDdXJyTGV2ZWwgPSBXTEFOX1dNQV9USEVSTUFMX0xFVkVMXzA7CisKKwlXTUFfTE9HRCgiVE0gbGV2ZWwgbWluIG1heDpcbiIKKwkJICIwICVkICAgJWRcbiIKKwkJICIxICVkICAgJWRcbiIKKwkJICIyICVkICAgJWRcbiIKKwkJICIzICVkICAgJWQiLAorCQkgd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTGV2ZWxzWzBdLm1pblRlbXBUaHJlc2hvbGQsCisJCSB3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxMZXZlbHNbMF0ubWF4VGVtcFRocmVzaG9sZCwKKwkJIHdtYS0+dGhlcm1hbF9tZ210X2luZm8udGhlcm1hbExldmVsc1sxXS5taW5UZW1wVGhyZXNob2xkLAorCQkgd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTGV2ZWxzWzFdLm1heFRlbXBUaHJlc2hvbGQsCisJCSB3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxMZXZlbHNbMl0ubWluVGVtcFRocmVzaG9sZCwKKwkJIHdtYS0+dGhlcm1hbF9tZ210X2luZm8udGhlcm1hbExldmVsc1syXS5tYXhUZW1wVGhyZXNob2xkLAorCQkgd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTGV2ZWxzWzNdLm1pblRlbXBUaHJlc2hvbGQsCisJCSB3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxMZXZlbHNbM10ubWF4VGVtcFRocmVzaG9sZCk7CisKKwlpZiAod21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTWdtdEVuYWJsZWQpIHsKKwkJb2xfdHhfdGhyb3R0bGVfaW5pdF9wZXJpb2QoY3Vycl9wZGV2LAorCQkJCQkgICBwVGhlcm1hbFBhcmFtcy0+dGhyb3R0bGVQZXJpb2QpOworCisJCS8qIEdldCB0aGUgdGVtcGVyYXR1cmUgdGhyZXNob2xkcyB0byBzZXQgaW4gZmlybXdhcmUgKi8KKwkJdGhlcm1hbF9wYXJhbXMubWluVGVtcCA9CisJCQl3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxMZXZlbHNbV0xBTl9XTUFfVEhFUk1BTF9MRVZFTF8wXS5taW5UZW1wVGhyZXNob2xkOworCQl0aGVybWFsX3BhcmFtcy5tYXhUZW1wID0KKwkJCXdtYS0+dGhlcm1hbF9tZ210X2luZm8udGhlcm1hbExldmVsc1tXTEFOX1dNQV9USEVSTUFMX0xFVkVMXzBdLm1heFRlbXBUaHJlc2hvbGQ7CisJCXRoZXJtYWxfcGFyYW1zLnRoZXJtYWxFbmFibGUgPQorCQkJd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTWdtdEVuYWJsZWQ7CisKKwkJV01BX0xPR0UoIlRNIHNlbmRpbmcgdGhlIGZvbGxvd2luZyB0byBmaXJtd2FyZTogbWluICVkIG1heCAlZCBlbmFibGUgJWQiLAorCQkJdGhlcm1hbF9wYXJhbXMubWluVGVtcCwgdGhlcm1hbF9wYXJhbXMubWF4VGVtcCwKKwkJCXRoZXJtYWxfcGFyYW1zLnRoZXJtYWxFbmFibGUpOworCisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJICAgIHdtYV9zZXRfdGhlcm1hbF9tZ210KHdtYSwgdGhlcm1hbF9wYXJhbXMpKSB7CisJCQlXTUFfTE9HRSgiQ291bGQgbm90IHNlbmQgdGhlcm1hbCBtZ210IGNvbW1hbmQgdG8gdGhlIGZpcm13YXJlISIpOworCQl9CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3NldF90aGVybWFsX2xldmVsX2luZCgpIC0gc2VuZCBTTUUgc2V0IHRoZXJtYWwgbGV2ZWwgaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBAbGV2ZWw6ICB0aGVybWFsIGxldmVsCisgKgorICogU2VuZCBTTUUgU0VUX1RIRVJNQUxfTEVWRUxfSU5EIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm5zOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9zZXRfdGhlcm1hbF9sZXZlbF9pbmQodV9pbnQ4X3QgbGV2ZWwpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWNkc19tc2dfdCBzbWVfbXNnID0gezB9OworCisJV01BX0xPR0koRkwoIlRoZXJtYWwgbGV2ZWw6ICVkIiksIGxldmVsKTsKKworCXNtZV9tc2cudHlwZSA9IGVXTklfU01FX1NFVF9USEVSTUFMX0xFVkVMX0lORDsKKwlzbWVfbXNnLmJvZHlwdHIgPSBOVUxMOworCXNtZV9tc2cuYm9keXZhbCA9IGxldmVsOworCisJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9TTUUsICZzbWVfbXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkKKwkJV01BX0xPR0UoRkwoCisJCQkiRmFpbCB0byBwb3N0IHNldCB0aGVybWFsIGxldmVsIGluZCBtc2ciKSk7Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3Nfc2V0X3RoZXJtYWxfbGV2ZWwoKSAtIHNldHMgdGhlcm1hbCBsZXZlbAorICogQHdtYTogUG9pbnRlciB0byBXTUEgaGFuZGxlCisgKiBAdGhlcm1hbF9sZXZlbCA6IFRoZXJtYWwgbGV2ZWwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIG5ldyB0aGVybWFsIHRocm90dGxlIGxldmVsIGluIHRoZQorICogdHhyeCBtb2R1bGUgYW5kIHNlbmRzIGRvd24gdGhlIGNvcnJlc3BvbmRpbmcgdGVtcGVyYXR1cmUKKyAqIHRocmVzaG9sZHMgdG8gdGhlIGZpcm13YXJlCisgKgorICogUmV0dXJuczogQ0RGX1NUQVRVU19TVUNDRVNTIGZvciBzdWNjZXNzIG90aGVyd2lzZSBmYWlsdXJlCisgKi8KK0NERl9TVEFUVVMgd21hX3Byb2Nlc3Nfc2V0X3RoZXJtYWxfbGV2ZWwodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCSB1aW50OF90IHRoZXJtYWxfbGV2ZWwpCit7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBjdXJyX3BkZXY7CisKKwlpZiAoTlVMTCA9PSB3bWEpIHsKKwkJV01BX0xPR0UoIlRNIEludmFsaWQgaW5wdXQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWN1cnJfcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCWlmIChOVUxMID09IGN1cnJfcGRldikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgcGRldiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCVdNQV9MT0dFKCJUTSBzZXQgbGV2ZWwgJWQiLCB0aGVybWFsX2xldmVsKTsKKworCS8qIENoZWNrIGlmIHRoZXJtYWwgbWl0aWdhdGlvbiBpcyBlbmFibGVkICovCisJaWYgKCF3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxNZ210RW5hYmxlZCkgeworCQlXTUFfTE9HRSgiVGhlcm1hbCBtZ210IGlzIG5vdCBlbmFibGVkLCBpZ25vcmluZyBzZXQgbGV2ZWwgY29tbWFuZCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKHRoZXJtYWxfbGV2ZWwgPj0gV0xBTl9XTUFfTUFYX1RIRVJNQUxfTEVWRUxTKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIHRoZXJtYWwgbGV2ZWwgc2V0ICVkIiwgdGhlcm1hbF9sZXZlbCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAodGhlcm1hbF9sZXZlbCA9PSB3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxDdXJyTGV2ZWwpIHsKKwkJV01BX0xPR0QoIkN1cnJlbnQgbGV2ZWwgJWQgaXMgc2FtZSBhcyB0aGUgc2V0IGxldmVsLCBpZ25vcmluZyIsCisJCQkgd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsQ3VyckxldmVsKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwl3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxDdXJyTGV2ZWwgPSB0aGVybWFsX2xldmVsOworCisJb2xfdHhfdGhyb3R0bGVfc2V0X2xldmVsKGN1cnJfcGRldiwgdGhlcm1hbF9sZXZlbCk7CisKKwkvKiBTZW5kIFNNRSBTRVRfVEhFUk1BTF9MRVZFTF9JTkQgbWVzc2FnZSAqLworCXdtYV9zZXRfdGhlcm1hbF9sZXZlbF9pbmQodGhlcm1hbF9sZXZlbCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKgorICogd21hX3NldF90aGVybWFsX21nbXQoKSAtIHNldCB0aGVybWFsIG1nbXQgY29tbWFuZCB0byBmdworICogQHdtYV9oYW5kbGU6IFBvaW50ZXIgdG8gV01BIGhhbmRsZQorICogQHRoZXJtYWxfaW5mbzogVGhlcm1hbCBjb21tYW5kIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgdGhlcm1hbCBtYW5hZ2VtZW50IGNvbW1hbmQKKyAqIHRvIHRoZSBmaXJtd2FyZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGZvciBzdWNjZXNzIG90aGVyd2lzZSBmYWlsdXJlCisgKi8KK0NERl9TVEFUVVMgd21hX3NldF90aGVybWFsX21nbXQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCXRfdGhlcm1hbF9jbWRfcGFyYW1zIHRoZXJtYWxfaW5mbykKK3sKKwl3bWlfdGhlcm1hbF9tZ210X2NtZF9maXhlZF9wYXJhbSAqY21kID0gTlVMTDsKKwl3bWlfYnVmX3QgYnVmID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1aW50MzJfdCBsZW4gPSAwOworCisJbGVuID0gc2l6ZW9mKCpjbWQpOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIHRvIHNlbmQgc2V0IGtleSBjbWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNtZCA9ICh3bWlfdGhlcm1hbF9tZ210X2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV90aGVybWFsX21nbXRfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV90aGVybWFsX21nbXRfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwljbWQtPmxvd2VyX3RocmVzaF9kZWdyZWVDID0gdGhlcm1hbF9pbmZvLm1pblRlbXA7CisJY21kLT51cHBlcl90aHJlc2hfZGVncmVlQyA9IHRoZXJtYWxfaW5mby5tYXhUZW1wOworCWNtZC0+ZW5hYmxlID0gdGhlcm1hbF9pbmZvLnRoZXJtYWxFbmFibGU7CisKKwlXTUFfTE9HRSgiVE0gU2VuZGluZyB0aGVybWFsIG1nbXQgY21kOiBsb3cgdGVtcCAlZCwgdXBwZXIgdGVtcCAlZCwgZW5hYmxlZCAlZCIsCisJCWNtZC0+bG93ZXJfdGhyZXNoX2RlZ3JlZUMsIGNtZC0+dXBwZXJfdGhyZXNoX2RlZ3JlZUMsIGNtZC0+ZW5hYmxlKTsKKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgICAgIFdNSV9USEVSTUFMX01HTVRfQ01ESUQpOworCWlmIChzdGF0dXMpIHsKKwkJY2RmX25idWZfZnJlZShidWYpOworCQlXTUFfTE9HRSgiJXM6RmFpbGVkIHRvIHNlbmQgdGhlcm1hbCBtZ210IGNvbW1hbmQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV90aGVybWFsX21nbXRfZ2V0X2xldmVsKCkgLSByZXR1cm5zIHRocm90dGxlIGxldmVsCisgKiBAaGFuZGxlOiBQb2ludGVyIHRvIFdNQSBoYW5kbGUKKyAqIEB0ZW1wOiB0ZW1wZXJhdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdGhlcm1hbCh0aHJvdHRsZSkgbGV2ZWwKKyAqIGdpdmVuIHRoZSB0ZW1wZXJhdHVyZQorICoKKyAqIFJldHVybjogdGhlcm1hbCAodGhyb3R0bGUpIGxldmVsCisgKi8KK3VpbnQ4X3Qgd21hX3RoZXJtYWxfbWdtdF9nZXRfbGV2ZWwodm9pZCAqaGFuZGxlLCB1aW50MzJfdCB0ZW1wKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlpbnQgaTsKKwl1aW50OF90IGxldmVsOworCisJbGV2ZWwgPSBpID0gd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsQ3VyckxldmVsOworCXdoaWxlICh0ZW1wIDwgd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTGV2ZWxzW2ldLm1pblRlbXBUaHJlc2hvbGQKKwkgICAgICAgJiYgaSA+IDApIHsKKwkJaS0tOworCQlsZXZlbCA9IGk7CisJfQorCisJaSA9IHdtYS0+dGhlcm1hbF9tZ210X2luZm8udGhlcm1hbEN1cnJMZXZlbDsKKwl3aGlsZSAodGVtcCA+IHdtYS0+dGhlcm1hbF9tZ210X2luZm8udGhlcm1hbExldmVsc1tpXS5tYXhUZW1wVGhyZXNob2xkCisJICAgICAgICYmIGkgPCAoV0xBTl9XTUFfTUFYX1RIRVJNQUxfTEVWRUxTIC0gMSkpIHsKKwkJaSsrOworCQlsZXZlbCA9IGk7CisJfQorCisJV01BX0xPR1coIkNoYW5nZSB0aGVybWFsIGxldmVsIGZyb20gJWQgLT4gJWRcbiIsCisJCSB3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxDdXJyTGV2ZWwsIGxldmVsKTsKKworCXJldHVybiBsZXZlbDsKK30KKworLyoqCisgKiB3bWFfdGhlcm1hbF9tZ210X2V2dF9oYW5kbGVyKCkgLSB0aGVybWFsIG1nbXQgZXZlbnQgaGFuZGxlcgorICogQHdtYV9oYW5kbGU6IFBvaW50ZXIgdG8gV01BIGhhbmRsZQorICogQGV2ZW50OiBUaGVybWFsIGV2ZW50IGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSB0aGVybWFsIG1nbXQgZXZlbnQgZnJvbSB0aGUgZmlybXdhcmUgbGVuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG90aGVyd2lzZSBmYWlsdXJlCisgKi8KK2ludCB3bWFfdGhlcm1hbF9tZ210X2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsCisJCQkJCXVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKwl3bWlfdGhlcm1hbF9tZ210X2V2ZW50X2ZpeGVkX3BhcmFtICp0bV9ldmVudDsKKwl1aW50OF90IHRoZXJtYWxfbGV2ZWw7CisJdF90aGVybWFsX2NtZF9wYXJhbXMgdGhlcm1hbF9wYXJhbXM7CisJV01JX1RIRVJNQUxfTUdNVF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIGN1cnJfcGRldjsKKworCWlmIChOVUxMID09IGV2ZW50IHx8IE5VTEwgPT0gaGFuZGxlKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIHRoZXJtYWwgbWl0aWdhdGlvbiBldmVudCBidWZmZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd21hID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKworCWlmIChOVUxMID09IHdtYSkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgd21hIGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFyYW1fYnVmID0gKFdNSV9USEVSTUFMX01HTVRfRVZFTlRJRF9wYXJhbV90bHZzICopIGV2ZW50OworCisJY3Vycl9wZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJaWYgKE5VTEwgPT0gY3Vycl9wZGV2KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCBwZGV2IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGVybWFsIG1pdGlnYXRpb24gaXMgZW5hYmxlZCAqLworCWlmICghd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTWdtdEVuYWJsZWQpIHsKKwkJV01BX0xPR0UoIlRoZXJtYWwgbWdtdCBpcyBub3QgZW5hYmxlZCwgaWdub3JpbmcgZXZlbnQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdG1fZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCVdNQV9MT0dEKCJUaGVybWFsIG1nbXQgZXZlbnQgcmVjZWl2ZWQgd2l0aCB0ZW1wZXJhdHVyZSAlZCIsCisJCSB0bV9ldmVudC0+dGVtcGVyYXR1cmVfZGVncmVlQyk7CisKKwkvKiBHZXQgdGhlIHRoZXJtYWwgbWl0aWdhdGlvbiBsZXZlbCBmb3IgdGhlIHJlcG9ydGVkIHRlbXBlcmF0dXJlICovCisJdGhlcm1hbF9sZXZlbCA9CisJCXdtYV90aGVybWFsX21nbXRfZ2V0X2xldmVsKGhhbmRsZSwgdG1fZXZlbnQtPnRlbXBlcmF0dXJlX2RlZ3JlZUMpOworCVdNQV9MT0dEKCJUaGVybWFsIG1nbXQgbGV2ZWwgICVkIiwgdGhlcm1hbF9sZXZlbCk7CisKKwlpZiAodGhlcm1hbF9sZXZlbCA9PSB3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxDdXJyTGV2ZWwpIHsKKwkJV01BX0xPR0QoIkN1cnJlbnQgbGV2ZWwgJWQgaXMgc2FtZSBhcyB0aGUgc2V0IGxldmVsLCBpZ25vcmluZyIsCisJCQkgd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsQ3VyckxldmVsKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsQ3VyckxldmVsID0gdGhlcm1hbF9sZXZlbDsKKworCS8qIEluZm9ybSB0eHJ4ICovCisJb2xfdHhfdGhyb3R0bGVfc2V0X2xldmVsKGN1cnJfcGRldiwgdGhlcm1hbF9sZXZlbCk7CisKKwkvKiBTZW5kIFNNRSBTRVRfVEhFUk1BTF9MRVZFTF9JTkQgbWVzc2FnZSAqLworCXdtYV9zZXRfdGhlcm1hbF9sZXZlbF9pbmQodGhlcm1hbF9sZXZlbCk7CisKKwkvKiBHZXQgdGhlIHRlbXBlcmF0dXJlIHRocmVzaG9sZHMgdG8gc2V0IGluIGZpcm13YXJlICovCisJdGhlcm1hbF9wYXJhbXMubWluVGVtcCA9CisJCXdtYS0+dGhlcm1hbF9tZ210X2luZm8udGhlcm1hbExldmVsc1t0aGVybWFsX2xldmVsXS4KKwkJbWluVGVtcFRocmVzaG9sZDsKKwl0aGVybWFsX3BhcmFtcy5tYXhUZW1wID0KKwkJd21hLT50aGVybWFsX21nbXRfaW5mby50aGVybWFsTGV2ZWxzW3RoZXJtYWxfbGV2ZWxdLgorCQltYXhUZW1wVGhyZXNob2xkOworCXRoZXJtYWxfcGFyYW1zLnRoZXJtYWxFbmFibGUgPQorCQl3bWEtPnRoZXJtYWxfbWdtdF9pbmZvLnRoZXJtYWxNZ210RW5hYmxlZDsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gd21hX3NldF90aGVybWFsX21nbXQod21hLCB0aGVybWFsX3BhcmFtcykpIHsKKwkJV01BX0xPR0UoIkNvdWxkIG5vdCBzZW5kIHRoZXJtYWwgbWdtdCBjb21tYW5kIHRvIHRoZSBmaXJtd2FyZSEiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX2RlY2FwX3RvXzgwMjMoKSAtIERlY2Fwc3VsYXRlIHRvIDgwMi4zIGZvcm1hdAorICogQG1zZHU6IHNrYiBidWZmZXIKKyAqIEBpbmZvOiBkZWNhcHN1bGF0ZSBpbmZvCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9kZWNhcF90b184MDIzKGNkZl9uYnVmX3QgbXNkdSwgc3RydWN0IHdtYV9kZWNhcF9pbmZvX3QgKmluZm8pCit7CisJc3RydWN0IGxsY19zbmFwX2hkcl90ICpsbGNfaGRyOworCXVpbnQxNl90IGV0aGVyX3R5cGU7CisJdWludDE2X3QgbDJfaGRyX3NwYWNlOworCXN0cnVjdCBpZWVlODAyMTFfcW9zZnJhbWVfYWRkcjQgKndoOworCXVpbnQ4X3QgbG9jYWxfYnVmW0VUSEVSTkVUX0hEUl9MRU5dOworCXVpbnQ4X3QgKmJ1ZjsKKwlzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QgKmV0aHJfaGRyOworCisJYnVmID0gKHVpbnQ4X3QgKikgY2RmX25idWZfZGF0YShtc2R1KTsKKwlsbGNfaGRyID0gKHN0cnVjdCBsbGNfc25hcF9oZHJfdCAqKWJ1ZjsKKwlldGhlcl90eXBlID0gKGxsY19oZHItPmV0aGVydHlwZVswXSA8PCA4KSB8IGxsY19oZHItPmV0aGVydHlwZVsxXTsKKwkvKiBkbyBsbGMgcmVtb3ZlIGlmIG5lZWRlZCAqLworCWwyX2hkcl9zcGFjZSA9IDA7CisJaWYgKElTX1NOQVAobGxjX2hkcikpIHsKKwkJaWYgKElTX0JURVAobGxjX2hkcikpIHsKKwkJCS8qIHJlbW92ZSBsbGMgKi8KKwkJCWwyX2hkcl9zcGFjZSArPSBzaXplb2Yoc3RydWN0IGxsY19zbmFwX2hkcl90KTsKKwkJCWxsY19oZHIgPSBOVUxMOworCQl9IGVsc2UgaWYgKElTX1JGQzEwNDIobGxjX2hkcikpIHsKKwkJCWlmICghKGV0aGVyX3R5cGUgPT0gRVRIRVJUWVBFX0FBUlAgfHwKKwkJCSAgICAgIGV0aGVyX3R5cGUgPT0gRVRIRVJUWVBFX0lQWCkpIHsKKwkJCQkvKiByZW1vdmUgbGxjICovCisJCQkJbDJfaGRyX3NwYWNlICs9IHNpemVvZihzdHJ1Y3QgbGxjX3NuYXBfaGRyX3QpOworCQkJCWxsY19oZHIgPSBOVUxMOworCQkJfQorCQl9CisJfQorCWlmIChsMl9oZHJfc3BhY2UgPiBFVEhFUk5FVF9IRFJfTEVOKSB7CisJCWJ1ZiA9IGNkZl9uYnVmX3B1bGxfaGVhZChtc2R1LCBsMl9oZHJfc3BhY2UgLSBFVEhFUk5FVF9IRFJfTEVOKTsKKwl9IGVsc2UgaWYgKGwyX2hkcl9zcGFjZSA8IEVUSEVSTkVUX0hEUl9MRU4pIHsKKwkJYnVmID0gY2RmX25idWZfcHVzaF9oZWFkKG1zZHUsIEVUSEVSTkVUX0hEUl9MRU4gLSBsMl9oZHJfc3BhY2UpOworCX0KKworCS8qIG1wZHUgaGRyIHNob3VsZCBiZSBwcmVzZW50IGluIGluZm8scmUtY3JlYXRlIGV0aHJfaGRyIGJhc2VkIG9uIG1wZHUgaGRyICovCisJd2ggPSAoc3RydWN0IGllZWU4MDIxMV9xb3NmcmFtZV9hZGRyNCAqKWluZm8tPmhkcjsKKwlldGhyX2hkciA9IChzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QgKilsb2NhbF9idWY7CisJc3dpdGNoICh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfRElSX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9GQzFfRElSX05PRFM6CisJCWNkZl9tZW1fY29weShldGhyX2hkci0+ZGVzdF9hZGRyLCB3aC0+aV9hZGRyMSwKKwkJCSAgICAgRVRIRVJORVRfQUREUl9MRU4pOworCQljZGZfbWVtX2NvcHkoZXRocl9oZHItPnNyY19hZGRyLCB3aC0+aV9hZGRyMiwKKwkJCSAgICAgRVRIRVJORVRfQUREUl9MRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQzFfRElSX1RPRFM6CisJCWNkZl9tZW1fY29weShldGhyX2hkci0+ZGVzdF9hZGRyLCB3aC0+aV9hZGRyMywKKwkJCSAgICAgRVRIRVJORVRfQUREUl9MRU4pOworCQljZGZfbWVtX2NvcHkoZXRocl9oZHItPnNyY19hZGRyLCB3aC0+aV9hZGRyMiwKKwkJCSAgICAgRVRIRVJORVRfQUREUl9MRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQzFfRElSX0ZST01EUzoKKwkJY2RmX21lbV9jb3B5KGV0aHJfaGRyLT5kZXN0X2FkZHIsIHdoLT5pX2FkZHIxLAorCQkJICAgICBFVEhFUk5FVF9BRERSX0xFTik7CisJCWNkZl9tZW1fY29weShldGhyX2hkci0+c3JjX2FkZHIsIHdoLT5pX2FkZHIzLAorCQkJICAgICBFVEhFUk5FVF9BRERSX0xFTik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTOgorCQljZGZfbWVtX2NvcHkoZXRocl9oZHItPmRlc3RfYWRkciwgd2gtPmlfYWRkcjMsCisJCQkgICAgIEVUSEVSTkVUX0FERFJfTEVOKTsKKwkJY2RmX21lbV9jb3B5KGV0aHJfaGRyLT5zcmNfYWRkciwgd2gtPmlfYWRkcjQsCisJCQkgICAgIEVUSEVSTkVUX0FERFJfTEVOKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGxsY19oZHIgPT0gTlVMTCkgeworCQlldGhyX2hkci0+ZXRoZXJ0eXBlWzBdID0gKGV0aGVyX3R5cGUgPj4gOCkgJiAweGZmOworCQlldGhyX2hkci0+ZXRoZXJ0eXBlWzFdID0gKGV0aGVyX3R5cGUpICYgMHhmZjsKKwl9IGVsc2UgeworCQl1aW50MzJfdCBwa3RsZW4gPQorCQkJY2RmX25idWZfbGVuKG1zZHUpIC0gc2l6ZW9mKGV0aHJfaGRyLT5ldGhlcnR5cGUpOworCQlldGhlcl90eXBlID0gKHVpbnQxNl90KSBwa3RsZW47CisJCWV0aGVyX3R5cGUgPSBjZGZfbmJ1Zl9sZW4obXNkdSkgLSBzaXplb2Yoc3RydWN0IGV0aGVybmV0X2hkcl90KTsKKwkJZXRocl9oZHItPmV0aGVydHlwZVswXSA9IChldGhlcl90eXBlID4+IDgpICYgMHhmZjsKKwkJZXRocl9oZHItPmV0aGVydHlwZVsxXSA9IChldGhlcl90eXBlKSAmIDB4ZmY7CisJfQorCWNkZl9tZW1fY29weShidWYsIGV0aHJfaGRyLCBFVEhFUk5FVF9IRFJfTEVOKTsKK30KKworLyoqCisgKiB3bWFfaWVlZTgwMjExX2hkcnNpemUoKSAtIGdldCA4MDIuMTEgaGVhZGVyIHNpemUKKyAqIEBkYXRhOiA4MDIxMSBmcmFtZQorICoKKyAqIFJldHVybjogc2l6ZSBvZiBoZWFkZXIKKyAqLworc3RhdGljIGludDMyX3Qgd21hX2llZWU4MDIxMV9oZHJzaXplKGNvbnN0IHZvaWQgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqd2ggPSAoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKWRhdGE7CisJaW50MzJfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUpOworCisJaWYgKCh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfRElSX01BU0spID09IElFRUU4MDIxMV9GQzFfRElSX0RTVE9EUykKKwkJc2l6ZSArPSBJRUVFODAyMTFfQUREUl9MRU47CisJaWYgKElFRUU4MDIxMV9RT1NfSEFTX1NFUSh3aCkpCisJCXNpemUgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwlyZXR1cm4gc2l6ZTsKK30KKworLyoqCisgKiB3bWlfZGVzY19wb29sX2luaXQoKSAtIEluaXRpYWxpemUgdGhlIFdNSSBkZXNjcmlwdG9yIHBvb2wKKyAqIEB3bWFfaGFuZGxlOiBoYW5kbGUgdG8gd21hCisgKiBAcG9vbF9zaXplOiBTaXplIG9mIHdtYSBwb29sCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCB3bWlfZGVzY19wb29sX2luaXQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLCB1aW50MzJfdCBwb29sX3NpemUpCit7CisJaW50IGk7CisKKwlpZiAoIXBvb2xfc2l6ZSkgeworCQlXTUFfTE9HRSgiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBkZXNjIHBvb2wiLCBfX2Z1bmNfXyk7CisJCWNkZl9hc3NlcnRfYWx3YXlzKHBvb2xfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlXTUFfTE9HRSgiJXM6IGluaXRpYWxpemUgZGVzYyBwb29sIG9mIHNpemUgJWQiLCBfX2Z1bmNfXywgcG9vbF9zaXplKTsKKwl3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLnBvb2xfc2l6ZSA9IHBvb2xfc2l6ZTsKKwl3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLm51bV9mcmVlID0gcG9vbF9zaXplOworCXdtYV9oYW5kbGUtPndtaV9kZXNjX3Bvb2wuYXJyYXkgPSBjZGZfbWVtX21hbGxvYyhwb29sX3NpemUgKgorCQkJCQlzaXplb2YodW5pb24gd21pX2Rlc2NfZWxlbV90KSk7CisJaWYgKCF3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLmFycmF5KSB7CisJCVdNQV9MT0dFKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGRlc2MgcG9vbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXdtYV9oYW5kbGUtPndtaV9kZXNjX3Bvb2wuZnJlZWxpc3QgPSAmd21hX2hhbmRsZS0+CisJCXdtaV9kZXNjX3Bvb2wuYXJyYXlbMF07CisKKwlmb3IgKGkgPSAwOyBpIDwgKHBvb2xfc2l6ZSAtIDEpOyBpKyspIHsKKwkJd21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC5hcnJheVtpXS53bWlfZGVzYy5kZXNjX2lkID0gaTsKKwkJd21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC5hcnJheVtpXS5uZXh0ID0KKwkJCSZ3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLmFycmF5W2kgKyAxXTsKKwl9CisKKwl3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLmFycmF5W2ldLm5leHQgPSBOVUxMOworCXdtYV9oYW5kbGUtPndtaV9kZXNjX3Bvb2wuYXJyYXlbaV0ud21pX2Rlc2MuZGVzY19pZCA9IGk7CisKKwljZGZfc3BpbmxvY2tfaW5pdCgmd21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC53bWlfZGVzY19wb29sX2xvY2spOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtaV9kZXNjX3Bvb2xfZGVpbml0KCkgLSBEZWluaXRpYWxpemUgdGhlIFdNSSBkZXNjcmlwdG9yIHBvb2wKKyAqIEB3bWFfaGFuZGxlOiBoYW5kbGUgdG8gd21hCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd21pX2Rlc2NfcG9vbF9kZWluaXQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCWNkZl9zcGluX2xvY2tfYmgoJndtYV9oYW5kbGUtPndtaV9kZXNjX3Bvb2wud21pX2Rlc2NfcG9vbF9sb2NrKTsKKwlpZiAod21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC5hcnJheSkgeworCQljZGZfbWVtX2ZyZWUod21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC5hcnJheSk7CisJCXdtYV9oYW5kbGUtPndtaV9kZXNjX3Bvb2wuYXJyYXkgPSBOVUxMOworCX0gZWxzZSB7CisJCVdNQV9MT0dFKCIlczogRW1wdHkgV01JIGRlc2NyaXB0b3IgcG9vbCIsIF9fZnVuY19fKTsKKwl9CisKKwl3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLmZyZWVsaXN0ID0gTlVMTDsKKwl3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLnBvb2xfc2l6ZSA9IDA7CisJd21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC5udW1fZnJlZSA9IDA7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLndtaV9kZXNjX3Bvb2xfbG9jayk7CisJY2RmX3NwaW5sb2NrX2Rlc3Ryb3koJndtYV9oYW5kbGUtPndtaV9kZXNjX3Bvb2wud21pX2Rlc2NfcG9vbF9sb2NrKTsKK30KKworLyoqCisgKiB3bWlfZGVzY19nZXQoKSAtIEdldCB3bWkgZGVzY3JpcHRvciBmcm9tIHdtaSBmcmVlIGRlc2NyaXB0b3IgcG9vbAorICogQHdtYV9oYW5kbGU6IGhhbmRsZSB0byB3bWEKKyAqCisgKiBSZXR1cm46IHBvaW50ZXIgdG8gd21pIGRlc2NyaXB0b3IsIE5VTEwgb24gZmFpbHVyZQorICovCitzdHJ1Y3Qgd21pX2Rlc2NfdCAqd21pX2Rlc2NfZ2V0KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSkKK3sKKwlzdHJ1Y3Qgd21pX2Rlc2NfdCAqd21pX2Rlc2MgPSBOVUxMOworCisJY2RmX3NwaW5fbG9ja19iaCgmd21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC53bWlfZGVzY19wb29sX2xvY2spOworCWlmICh3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLmZyZWVsaXN0KSB7CisJCXdtYV9oYW5kbGUtPndtaV9kZXNjX3Bvb2wubnVtX2ZyZWUtLTsKKwkJd21pX2Rlc2MgPSAmd21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC5mcmVlbGlzdC0+d21pX2Rlc2M7CisJCXdtYV9oYW5kbGUtPndtaV9kZXNjX3Bvb2wuZnJlZWxpc3QgPQorCQkJd21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC5mcmVlbGlzdC0+bmV4dDsKKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLndtaV9kZXNjX3Bvb2xfbG9jayk7CisKKwlyZXR1cm4gd21pX2Rlc2M7Cit9CisKKy8qKgorICogd21pX2Rlc2NfcHV0KCkgLSBQdXQgd21pIGRlc2NyaXB0b3IgdG8gd21pIGZyZWUgZGVzY3JpcHRvciBwb29sCisgKiBAd21hX2hhbmRsZTogaGFuZGxlIHRvIHdtYQorICogQHdtaV9kZXNjOiB3bWkgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIHdtaV9kZXNjX3B1dCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsIHN0cnVjdCB3bWlfZGVzY190ICp3bWlfZGVzYykKK3sKKwljZGZfc3Bpbl9sb2NrX2JoKCZ3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLndtaV9kZXNjX3Bvb2xfbG9jayk7CisJKCh1bmlvbiB3bWlfZGVzY19lbGVtX3QgKil3bWlfZGVzYyktPm5leHQgPQorCQl3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLmZyZWVsaXN0OworCXdtYV9oYW5kbGUtPndtaV9kZXNjX3Bvb2wuZnJlZWxpc3QgPSAodW5pb24gd21pX2Rlc2NfZWxlbV90ICopd21pX2Rlc2M7CisJd21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC5udW1fZnJlZSsrOworCWNkZl9zcGluX3VubG9ja19iaCgmd21hX2hhbmRsZS0+d21pX2Rlc2NfcG9vbC53bWlfZGVzY19wb29sX2xvY2spOworfQorCisjZGVmaW5lIG1nbXRfdHhfZGxfZnJtX2xlbiA2NAorc3RhdGljIGlubGluZSBDREZfU1RBVFVTCittZ210X3dtaV91bmlmaWVkX2NtZF9zZW5kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgdm9pZCAqdHhfZnJhbWUsCisJCQkgIHVpbnQxNl90IGZybUxlbiwgdWludDhfdCB2ZGV2X2lkLAorCQkJICBwV01BVHhSeENvbXBGdW5jIHR4X2NvbXBsZXRlX2NiLAorCQkJICBwV01BQWNrRm5UeENvbXAgIHR4X290YV9wb3N0X3Byb2NfY2IsCisJCQkgIHVpbnQxNl90IGNoYW5mcmVxLCB2b2lkICpwRGF0YSkKK3sKKwl3bWlfYnVmX3QgYnVmOworCXdtaV9tZ210X3R4X3NlbmRfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJaW50MzJfdCBjbWRfbGVuOworCXVpbnQ2NF90IGRtYV9hZGRyOworCXN0cnVjdCB3bWlfZGVzY190ICp3bWlfZGVzYyA9IE5VTEw7CisJdm9pZCAqY2RmX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0NERl9ERVZJQ0UpOworCXVpbnQ4X3QgKmJ1ZnA7CisJaW50MzJfdCBidWZwX2xlbiA9IChmcm1MZW4gPCBtZ210X3R4X2RsX2ZybV9sZW4pID8gZnJtTGVuIDoKKwkJbWdtdF90eF9kbF9mcm1fbGVuOworCisJY21kX2xlbiA9IHNpemVvZih3bWlfbWdtdF90eF9zZW5kX2NtZF9maXhlZF9wYXJhbSkgKworCQlXTUlfVExWX0hEUl9TSVpFICsgcm91bmR1cChidWZwX2xlbiwgc2l6ZW9mKHVpbnQzMl90KSk7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGNtZF9sZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczp3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljbWQgPSAod21pX21nbXRfdHhfc2VuZF9jbWRfZml4ZWRfcGFyYW0gKil3bWlfYnVmX2RhdGEoYnVmKTsKKwlidWZwID0gKHVpbnQ4X3QgKikgY21kOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCVdNSVRMVl9UQUdfU1RSVUNfd21pX21nbXRfdHhfc2VuZF9jbWRfZml4ZWRfcGFyYW0sCisJCVdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkod21pX21nbXRfdHhfc2VuZF9jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisKKwl3bWlfZGVzYyA9IHdtaV9kZXNjX2dldCh3bWFfaGFuZGxlKTsKKwlpZiAoIXdtaV9kZXNjKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCB3bWlfZGVzYyIsIF9fZnVuY19fKTsKKwkJZ290byBlcnIyOworCX0KKwl3bWlfZGVzYy0+bmJ1ZiA9IHR4X2ZyYW1lOworCXdtaV9kZXNjLT50eF9jbXBsX2NiID0gdHhfY29tcGxldGVfY2I7CisJd21pX2Rlc2MtPm90YV9wb3N0X3Byb2NfY2IgPSB0eF9vdGFfcG9zdF9wcm9jX2NiOworCisJY21kLT5kZXNjX2lkID0gd21pX2Rlc2MtPmRlc2NfaWQ7CisJY21kLT5jaGFuZnJlcSA9IGNoYW5mcmVxOworCWJ1ZnAgKz0gc2l6ZW9mKHdtaV9tZ210X3R4X3NlbmRfY21kX2ZpeGVkX3BhcmFtKTsKKwlXTUlUTFZfU0VUX0hEUihidWZwLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIHJvdW5kdXAoYnVmcF9sZW4sCisJCQkJCQkJICAgIHNpemVvZih1aW50MzJfdCkpKTsKKwlidWZwICs9IFdNSV9UTFZfSERSX1NJWkU7CisJY2RmX21lbV9jb3B5KGJ1ZnAsIHBEYXRhLCBidWZwX2xlbik7CisJY2RmX25idWZfbWFwX3NpbmdsZShjZGZfY3R4LCB0eF9mcmFtZSwgQ0RGX0RNQV9UT19ERVZJQ0UpOworCWRtYV9hZGRyID0gY2RmX25idWZfZ2V0X2ZyYWdfcGFkZHJfbG8odHhfZnJhbWUsIDApOworCWNtZC0+cGFkZHJfbG8gPSAodWludDMyX3QpKGRtYV9hZGRyICYgMHhmZmZmZmZmZik7CisjaWYgZGVmaW5lZChIRUxJVU1QTFVTX1BBRERSNjQpCisJY21kLT5wYWRkcl9oaSA9ICh1aW50MzJfdCkoKGRtYV9hZGRyID4+IDMyKSAmIDB4MUYpOworI2VuZGlmCisJY21kLT5mcmFtZV9sZW4gPSBmcm1MZW47CisJY21kLT5idWZfbGVuID0gYnVmcF9sZW47CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBjbWRfbGVuLAorCQkJCSAgICAgIFdNSV9NR01UX1RYX1NFTkRfQ01ESUQpKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNlbmQgbWdtdCBUeCIsIF9fZnVuY19fKTsKKwkJZ290byBlcnIxOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworZXJyMToKKwl3bWlfZGVzY19wdXQod21hX2hhbmRsZSwgd21pX2Rlc2MpOworZXJyMjoKKwl3bWlfYnVmX2ZyZWUoYnVmKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKy8qKgorICogd21hX3R4X3BhY2tldCgpIC0gU2VuZHMgVHggRnJhbWUgdG8gVHhSeAorICogQHdtYV9jb250ZXh0OiB3bWEgY29udGV4dAorICogQHR4X2ZyYW1lOiBmcmFtZSBidWZmZXIKKyAqIEBmcm1MZW46IGZyYW1lIGxlbmd0aAorICogQGZybVR5cGU6IGZyYW1lIHR5cGUKKyAqIEB0eERpcjogdHggZGllY3Rpb24KKyAqIEB0aWQ6IFRJRAorICogQHR4X2ZybV9kb3dubG9hZF9jb21wX2NiOiB0eCBkb3dubG9hZCBjYWxsYmFjayBoYW5kbGVyCisgKiBAdHhfZnJtX290YV9jb21wX2NiOiBPVEEgY29tcGxpdGlvbiBoYW5kbGVyCisgKiBAdHhfZmxhZzogdHggZmxhZworICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEB0ZGxzRmxhZzogdGRscyBmbGFnCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgZnJhbWUgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqIGdpdmVuIHZkZXYgaWQuCisgKiBUaGlzIGlzIGJsb2NraW5nIGNhbGwgdGlsbCB0aGUgZG93bmxvYWRpbmcgb2YgZnJhbWUgaXMgY29tcGxldGUuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3R4X3BhY2tldCh2b2lkICp3bWFfY29udGV4dCwgdm9pZCAqdHhfZnJhbWUsIHVpbnQxNl90IGZybUxlbiwKKwkJCSBlRnJhbWVUeXBlIGZybVR5cGUsIGVGcmFtZVR4RGlyIHR4RGlyLCB1aW50OF90IHRpZCwKKwkJCSBwV01BVHhSeENvbXBGdW5jIHR4X2ZybV9kb3dubG9hZF9jb21wX2NiLCB2b2lkICpwRGF0YSwKKwkJCSBwV01BQWNrRm5UeENvbXAgdHhfZnJtX290YV9jb21wX2NiLCB1aW50OF90IHR4X2ZsYWcsCisJCQkgdWludDhfdCB2ZGV2X2lkLCBib29sIHRkbHNGbGFnLCB1aW50MTZfdCBjaGFubmVsX2ZyZXEpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpICh3bWFfY29udGV4dCk7CisJaW50MzJfdCBzdGF0dXM7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWludDMyX3QgaXNfaGlnaF9sYXRlbmN5OworCW9sX3R4cnhfdmRldl9oYW5kbGUgdHhyeF92ZGV2OworCWVudW0gZnJhbWVfaW5kZXggdHhfZnJtX2luZGV4ID0gR0VORVJJQ19OT0RPV05MRF9OT0FDS19DT01QX0lOREVYOworCXRwU2lyTWFjRnJhbWVDdGwgcEZjID0gKHRwU2lyTWFjRnJhbWVDdGwpIChjZGZfbmJ1Zl9kYXRhKHR4X2ZyYW1lKSk7CisJdWludDhfdCB1c2VfNm1icHMgPSAwOworCXVpbnQ4X3QgZG93bmxkX2NvbXBfcmVxdWlyZWQgPSAwOworCXVpbnQxNl90IGNoYW5mcmVxOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKwl1aW50OF90ICpwRnJhbWUgPSBOVUxMOworCXZvaWQgKnBQYWNrZXQgPSBOVUxMOworCXVpbnQxNl90IG5ld0ZybUxlbiA9IDA7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExVyAqLworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjOworCXRwU2lyTWFjTWdtdEhkciBtSGRyOworI2lmZGVmIFFDQV9QS1RfUFJPVE9fVFJBQ0UKKwl1aW50OF90IHByb3RvX3R5cGUgPSAwOworI2VuZGlmIC8qIFFDQV9QS1RfUFJPVE9fVFJBQ0UgKi8KKworCWlmIChOVUxMID09IHdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIndtYV9oYW5kbGUgaXMgTlVMTCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmYWNlID0gJndtYV9oYW5kbGUtPmludGVyZmFjZXNbdmRldl9pZF07CisJLyogR2V0IHRoZSB2ZGV2IGhhbmRsZSBmcm9tIHZkZXYgaWQgKi8KKwl0eHJ4X3ZkZXYgPSB3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmhhbmRsZTsKKworCWlmICghdHhyeF92ZGV2KSB7CisJCVdNQV9MT0dFKCJUeFJ4IFZkZXYgSGFuZGxlIGlzIE5VTEwiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChmcm1UeXBlID49IFRYUlhfRlJNX01BWCkgeworCQlXTUFfTE9HRSgiSW52YWxpZCBGcmFtZSBUeXBlIEZhaWwgdG8gc2VuZCBGcmFtZSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcE1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKwlpZiAoIXBNYWMpIHsKKwkJV01BX0xPR0UoInBNYWMgSGFuZGxlIGlzIE5VTEwiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwkvKgorCSAqIEN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdG8KKwkgKiBzZW5kIDgwMjExIE1nbXQgYW5kIDgwMjExIERhdGEgYXJlIGFkZGVkLgorCSAqLworCWlmICghKChmcm1UeXBlID09IFRYUlhfRlJNXzgwMl8xMV9NR01UKSB8fAorCSAgICAgIChmcm1UeXBlID09IFRYUlhfRlJNXzgwMl8xMV9EQVRBKSkpIHsKKwkJV01BX0xPR0UoIk5vIFN1cHBvcnQgdG8gc2VuZCBvdGhlciBmcmFtZXMgZXhjZXB0IDgwMi4xMSBNZ210L0RhdGEiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwltSGRyID0gKHRwU2lyTWFjTWdtdEhkciljZGZfbmJ1Zl9kYXRhKHR4X2ZyYW1lKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJaWYgKChpZmFjZSAmJiBpZmFjZS0+cm1mRW5hYmxlZCkgJiYKKwkgICAgKGZybVR5cGUgPT0gVFhSWF9GUk1fODAyXzExX01HTVQpICYmCisJICAgIChwRmMtPnN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0RJU0FTU09DIHx8CisJICAgICBwRmMtPnN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0RFQVVUSCB8fAorCSAgICAgcEZjLT5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9BQ1RJT04pKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopY2RmX25idWZfZGF0YSh0eF9mcmFtZSk7CisJCWlmICghSUVFRTgwMjExX0lTX0JST0FEQ0FTVCh3aC0+aV9hZGRyMSkgJiYKKwkJICAgICFJRUVFODAyMTFfSVNfTVVMVElDQVNUKHdoLT5pX2FkZHIxKSkgeworCQkJaWYgKHBGYy0+d2VwKSB7CisJCQkJLyogQWxsb2NhdGUgZXh0cmEgYnl0ZXMgZm9yIHByaXZhY3kgaGVhZGVyIGFuZCB0cmFpbGVyICovCisJCQkJbmV3RnJtTGVuID0gZnJtTGVuICsgSUVFRTgwMjExX0NDTVBfSEVBREVSTEVOICsKKwkJCQkJICAgIElFRUU4MDIxMV9DQ01QX01JQ0xFTjsKKwkJCQljZGZfc3RhdHVzID0KKwkJCQkJY2RzX3BhY2tldF9hbGxvYygodWludDE2X3QpIG5ld0ZybUxlbiwKKwkJCQkJCQkgKHZvaWQgKiopJnBGcmFtZSwKKwkJCQkJCQkgKHZvaWQgKiopJnBQYWNrZXQpOworCisJCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCQkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIFJNRiBzdGF0dXMgIgorCQkJCQkJImNvZGUgKCV4KSIsIF9fZnVuY19fLCBuZXdGcm1MZW4sCisJCQkJCQljZGZfc3RhdHVzKTsKKwkJCQkJLyogRnJlZSB0aGUgb3JpZ2luYWwgcGFja2V0IG1lbW9yeSAqLworCQkJCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKil0eF9mcmFtZSk7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBJbml0aWFsaXplIHRoZSBmcmFtZSB3aXRoIDAncyBhbmQgb25seSBmaWxsCisJCQkJICogTUFDIGhlYWRlciBhbmQgZGF0YSwgS2VlcCB0aGUgQ0NNUCBoZWFkZXIgYW5kCisJCQkJICogdHJhaWxlciBhcyAwJ3MsIGZpcm13YXJlIHNoYWxsIGZpbGwgdGhpcworCQkJCSAqLworCQkJCWNkZl9tZW1fc2V0KHBGcmFtZSwgbmV3RnJtTGVuLCAwKTsKKwkJCQljZGZfbWVtX2NvcHkocEZyYW1lLCB3aCwgc2l6ZW9mKCp3aCkpOworCQkJCWNkZl9tZW1fY29weShwRnJhbWUgKyBzaXplb2YoKndoKSArCisJCQkJCSAgICAgSUVFRTgwMjExX0NDTVBfSEVBREVSTEVOLAorCQkJCQkgICAgIHBEYXRhICsgc2l6ZW9mKCp3aCksCisJCQkJCSAgICAgZnJtTGVuIC0gc2l6ZW9mKCp3aCkpOworCisJCQkJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopdHhfZnJhbWUpOworCQkJCXR4X2ZyYW1lID0gcFBhY2tldDsKKwkJCQlmcm1MZW4gPSBuZXdGcm1MZW47CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBBbGxvY2F0ZSBleHRyYSBieXRlcyBmb3IgTU1JRSAqLworCQkJbmV3RnJtTGVuID0gZnJtTGVuICsgSUVFRTgwMjExX01NSUVfTEVOOworCQkJY2RmX3N0YXR1cyA9IGNkc19wYWNrZXRfYWxsb2MoKHVpbnQxNl90KSBuZXdGcm1MZW4sCisJCQkJCQkgICAgICAodm9pZCAqKikmcEZyYW1lLAorCQkJCQkJICAgICAgKHZvaWQgKiopJnBQYWNrZXQpOworCisJCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBSTUYgc3RhdHVzICIKKwkJCQkJImNvZGUgKCV4KSIsIF9fZnVuY19fLCBuZXdGcm1MZW4sCisJCQkJCWNkZl9zdGF0dXMpOworCQkJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHBhY2tldCBtZW1vcnkgKi8KKwkJCQljZHNfcGFja2V0X2ZyZWUoKHZvaWQgKil0eF9mcmFtZSk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCS8qCisJCQkgKiBJbml0aWFsaXplIHRoZSBmcmFtZSB3aXRoIDAncyBhbmQgb25seSBmaWxsCisJCQkgKiBNQUMgaGVhZGVyIGFuZCBkYXRhLiBNTUlFIGZpZWxkIHdpbGwgYmUKKwkJCSAqIGZpbGxlZCBieSBjZHNfYXR0YWNoX21taWUgQVBJCisJCQkgKi8KKwkJCWNkZl9tZW1fc2V0KHBGcmFtZSwgbmV3RnJtTGVuLCAwKTsKKwkJCWNkZl9tZW1fY29weShwRnJhbWUsIHdoLCBzaXplb2YoKndoKSk7CisJCQljZGZfbWVtX2NvcHkocEZyYW1lICsgc2l6ZW9mKCp3aCksCisJCQkJICAgICBwRGF0YSArIHNpemVvZigqd2gpLCBmcm1MZW4gLSBzaXplb2YoKndoKSk7CisJCQlpZiAoIWNkc19hdHRhY2hfbW1pZShpZmFjZS0+a2V5LmtleSwKKwkJCQkJICAgICBpZmFjZS0+a2V5LmtleV9pZFswXS5pcG4sCisJCQkJCSAgICAgV01BX0lHVEtfS0VZX0lOREVYXzQsCisJCQkJCSAgICAgcEZyYW1lLAorCQkJCQkgICAgIHBGcmFtZSArIG5ld0ZybUxlbiwgbmV3RnJtTGVuKSkgeworCQkJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIGF0dGFjaCBNTUlFIGF0IHRoZSBlbmQgb2YgIgorCQkJCQkiZnJhbWUiLCBfX2Z1bmNfXyk7CisJCQkJLyogRnJlZSB0aGUgb3JpZ2luYWwgcGFja2V0IG1lbW9yeSAqLworCQkJCWNkc19wYWNrZXRfZnJlZSgodm9pZCAqKXR4X2ZyYW1lKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJY2RzX3BhY2tldF9mcmVlKCh2b2lkICopdHhfZnJhbWUpOworCQkJdHhfZnJhbWUgPSBwUGFja2V0OworCQkJZnJtTGVuID0gbmV3RnJtTGVuOworCQl9CisJfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMVcgKi8KKworCWlmICgoZnJtVHlwZSA9PSBUWFJYX0ZSTV84MDJfMTFfTUdNVCkgJiYKKwkgICAgKHBGYy0+c3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfUFJPQkVfUlNQKSkgeworCQl1aW50NjRfdCBhZGp1c3RlZF90c2ZfbGU7CisJCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopY2RmX25idWZfZGF0YSh0eF9mcmFtZSk7CisKKwkJLyogTWFrZSB0aGUgVFNGIG9mZnNldCBuZWdhdGl2ZSB0byBtYXRjaCBUU0YgaW4gYmVhY29ucyAqLworCQlhZGp1c3RlZF90c2ZfbGUgPSBjcHVfdG9fbGU2NCgwVUxMIC0KKwkJCQkJICAgICAgd21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS4KKwkJCQkJICAgICAgdHNmYWRqdXN0KTsKKwkJQV9NRU1DUFkoJndoWzFdLCAmYWRqdXN0ZWRfdHNmX2xlLCBzaXplb2YoYWRqdXN0ZWRfdHNmX2xlKSk7CisJfQorCWlmIChmcm1UeXBlID09IFRYUlhfRlJNXzgwMl8xMV9EQVRBKSB7CisJCWNkZl9uYnVmX3QgcmV0OworCQljZGZfbmJ1Zl90IHNrYiA9IChjZGZfbmJ1Zl90KSB0eF9mcmFtZTsKKwkJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2ID0KKwkJCWNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCisJCXN0cnVjdCB3bWFfZGVjYXBfaW5mb190IGRlY2FwX2luZm87CisJCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopY2RmX25idWZfZGF0YShza2IpOworCQl2X1RJTUVfdCBjdXJyX3RpbWVzdGFtcCA9IGNkZl9tY190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisKKwkJaWYgKHBkZXYgPT0gTlVMTCkgeworCQkJV01BX0xPR0UoIiVzOiBwZGV2IHBvaW50ZXIgaXMgbm90IGF2YWlsYWJsZSIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCX0KKworCQkvKgorCQkgKiAxKSBUeFJ4IE1vZHVsZSBleHBlY3RzIGRhdGEgaW5wdXQgdG8gYmUgODAyLjMgZm9ybWF0CisJCSAqIFNvIERlY2Fwc3VsYXRpb24gaGFzIHRvIGJlIGRvbmUuCisJCSAqIDIpIE9ubHkgb25lIE91dHN0YW5kaW5nIERhdGEgcGVuZGluZyBmb3IgQWNrIGlzIGFsbG93ZWQKKwkJICovCisJCWlmICh0eF9mcm1fb3RhX2NvbXBfY2IpIHsKKwkJCWlmICh3bWFfaGFuZGxlLT51bWFjX2RhdGFfb3RhX2Fja19jYikgeworCQkJCS8qCisJCQkJICogSWYgbGFzdCBkYXRhIGZyYW1lIHdhcyBzZW50IG1vcmUgdGhhbiA1IHNlY29uZHMKKwkJCQkgKiBhZ28gYW5kIHN0aWxsIHdlIGRpZCBub3QgcmVjZWl2ZSBhY2svbmFjayBmcm9tCisJCQkJICogZncgdGhlbiBhbGxvdyBUeCBvZiB0aGlzIGRhdGEgZnJhbWUKKwkJCQkgKi8KKwkJCQlpZiAoY3Vycl90aW1lc3RhbXAgPj0KKwkJCQkgICAgd21hX2hhbmRsZS0+bGFzdF91bWFjX2RhdGFfb3RhX3RpbWVzdGFtcCArCisJCQkJICAgIDUwMCkgeworCQkJCQlXTUFfTE9HRSgiJXM6IE5vIFR4IEFjayBmb3IgbGFzdCBkYXRhIGZyYW1lIGZvciBtb3JlIHRoYW4gNSBzZWNzLCBhbGxvdyBUeCBvZiBjdXJyZW50IGRhdGEgZnJhbWUiLAorCQkJCQkJX19mdW5jX18pOworCQkJCX0gZWxzZSB7CisJCQkJCVdNQV9MT0dFKCIlczogQWxyZWFkeSBvbmUgRGF0YSBwZW5kaW5nIGZvciBBY2ssIHJlamVjdCBUeCBvZiBkYXRhIGZyYW1lIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBEYXRhIEZyYW1lcyBhcmUgc2VudCB0aHJvdWdoIFR4UnggTm9uIFN0YW5kYXJkIERhdGEgUGF0aAorCQkJICogc28gQWNrIENvbXBsZXRlIENiIGlzIG11c3QKKwkJCSAqLworCQkJV01BX0xPR0UoIk5vIEFjayBDb21wbGV0ZSBDYi4gRG9uJ3QgQWxsb3ciKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfQorCisJCS8qIFRha2Ugb3V0IDgwMi4xMSBoZWFkZXIgZnJvbSBza2IgKi8KKwkJZGVjYXBfaW5mby5oZHJfbGVuID0gd21hX2llZWU4MDIxMV9oZHJzaXplKHdoKTsKKwkJY2RmX21lbV9jb3B5KGRlY2FwX2luZm8uaGRyLCB3aCwgZGVjYXBfaW5mby5oZHJfbGVuKTsKKwkJY2RmX25idWZfcHVsbF9oZWFkKHNrYiwgZGVjYXBfaW5mby5oZHJfbGVuKTsKKworCQkvKiAgRGVjYXBzdWxhdGUgdG8gODAyLjMgZm9ybWF0ICovCisJCXdtYV9kZWNhcF90b184MDIzKHNrYiwgJmRlY2FwX2luZm8pOworCisJCS8qIFplcm8gb3V0IHNrYidzIGNvbnRleHQgYnVmZmVyIGZvciB0aGUgZHJpdmVyIHRvIHVzZSAqLworCQljZGZfbWVtX3NldChza2ItPmNiLCBzaXplb2Yoc2tiLT5jYiksIDApOworCisJCS8qIERvIHRoZSBETUEgTWFwcGluZyAqLworCQljZGZfbmJ1Zl9tYXBfc2luZ2xlKHBkZXYtPm9zZGV2LCBza2IsIENERl9ETUFfVE9fREVWSUNFKTsKKworCQkvKiBUZXJtaW5hdGUgdGhlIChzaW5nbGUtZWxlbWVudCkgbGlzdCBvZiB0eCBmcmFtZXMgKi8KKwkJc2tiLT5uZXh0ID0gTlVMTDsKKworCQkvKiBTdG9yZSB0aGUgQWNrIENvbXBsZXRlIENiICovCisJCXdtYV9oYW5kbGUtPnVtYWNfZGF0YV9vdGFfYWNrX2NiID0gdHhfZnJtX290YV9jb21wX2NiOworCisJCS8qIFN0b3JlIHRoZSB0aW1lc3RhbXAgYW5kIG5idWYgZm9yIHRoaXMgZGF0YSBUeCAqLworCQl3bWFfaGFuZGxlLT5sYXN0X3VtYWNfZGF0YV9vdGFfdGltZXN0YW1wID0gY3Vycl90aW1lc3RhbXA7CisJCXdtYV9oYW5kbGUtPmxhc3RfdW1hY19kYXRhX25idWYgPSBza2I7CisKKwkJLyogU2VuZCB0aGUgRGF0YSBmcmFtZSB0byBUeFJ4IGluIE5vbiBTdGFuZGFyZCBQYXRoICovCisJCXJldCA9IG9sX3R4X25vbl9zdGQodHhyeF92ZGV2LCBvbF90eF9zcGVjX25vX2ZyZWUsIHNrYik7CisKKwkJaWYgKHJldCkgeworCQkJV01BX0xPR0UoIlR4UnggUmVqZWN0ZWQuIEZhaWwgdG8gZG8gVHgiKTsKKwkJCWNkZl9uYnVmX3VubWFwX3NpbmdsZShwZGV2LT5vc2Rldiwgc2tiLAorCQkJCQkgICAgICBDREZfRE1BX1RPX0RFVklDRSk7CisJCQkvKiBDYWxsIERvd25sb2FkIENiIHNvIHRoYXQgdW1hYyBjYW4gZnJlZSB0aGUgYnVmZmVyICovCisJCQlpZiAodHhfZnJtX2Rvd25sb2FkX2NvbXBfY2IpCisJCQkJdHhfZnJtX2Rvd25sb2FkX2NvbXBfY2Iod21hX2hhbmRsZS0+bWFjX2NvbnRleHQsCisJCQkJCQkJdHhfZnJhbWUsCisJCQkJCQkJV01BX1RYX0ZSQU1FX0JVRkZFUl9GUkVFKTsKKwkJCXdtYV9oYW5kbGUtPnVtYWNfZGF0YV9vdGFfYWNrX2NiID0gTlVMTDsKKwkJCXdtYV9oYW5kbGUtPmxhc3RfdW1hY19kYXRhX25idWYgPSBOVUxMOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisKKwkJLyogQ2FsbCBEb3dubG9hZCBDYWxsYmFjayBpZiBwYXNzZWQgKi8KKwkJaWYgKHR4X2ZybV9kb3dubG9hZF9jb21wX2NiKQorCQkJdHhfZnJtX2Rvd25sb2FkX2NvbXBfY2Iod21hX2hhbmRsZS0+bWFjX2NvbnRleHQsCisJCQkJCQl0eF9mcmFtZSwKKwkJCQkJCVdNQV9UWF9GUkFNRV9CVUZGRVJfTk9fRlJFRSk7CisKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlpc19oaWdoX2xhdGVuY3kgPQorCQlvbF9jZmdfaXNfaGlnaF9sYXRlbmN5KHR4cnhfdmRldi0+cGRldi0+Y3RybF9wZGV2KTsKKworCWRvd25sZF9jb21wX3JlcXVpcmVkID0gdHhfZnJtX2Rvd25sb2FkX2NvbXBfY2IgJiYgaXNfaGlnaF9sYXRlbmN5OworCisJLyogRmlsbCB0aGUgZnJhbWUgaW5kZXggdG8gc2VuZCAqLworCWlmIChwRmMtPnR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKSB7CisJCWlmICh0eF9mcm1fb3RhX2NvbXBfY2IpIHsKKwkJCWlmIChkb3dubGRfY29tcF9yZXF1aXJlZCkKKwkJCQl0eF9mcm1faW5kZXggPQorCQkJCQlHRU5FUklDX0RPV05MRF9DT01QX0FDS19DT01QX0lOREVYOworCQkJZWxzZQorCQkJCXR4X2ZybV9pbmRleCA9IEdFTkVSSUNfTk9ET1dMT0FEX0FDS19DT01QX0lOREVYOworCisJCQkvKiBTdG9yZSB0aGUgQWNrIENiIHNlbnQgYnkgVU1BQyAqLworCQkJaWYgKHBGYy0+c3ViVHlwZSA8IFNJUl9NQUNfTUdNVF9SRVNFUlZFRDE1KSB7CisJCQkJd21hX2hhbmRsZS0+dW1hY19vdGFfYWNrX2NiW3BGYy0+c3ViVHlwZV0gPQorCQkJCQl0eF9mcm1fb3RhX2NvbXBfY2I7CisJCQl9CisjaWZkZWYgUUNBX1BLVF9QUk9UT19UUkFDRQorCQkJaWYgKHBGYy0+c3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQUNUSU9OKQorCQkJCXByb3RvX3R5cGUgPSBjZHNfcGt0X2dldF9wcm90b190eXBlKHR4X2ZyYW1lLAorCQkJCQkJcE1hYy0+ZkVuYWJsZURlYnVnTG9nLAorCQkJCQkJTkJVRl9QS1RfVFJBQ19UWVBFX01HTVRfQUNUSU9OKTsKKwkJCWlmIChwcm90b190eXBlICYgTkJVRl9QS1RfVFJBQ19UWVBFX01HTVRfQUNUSU9OKQorCQkJCWNkc19wa3RfdHJhY2VfYnVmX3VwZGF0ZSgiV006VDpNQUNUIik7CisJCQljZGZfbmJ1Zl90cmFjZV9zZXRfcHJvdG9fdHlwZSh0eF9mcmFtZSwgcHJvdG9fdHlwZSk7CisjZW5kaWYgLyogUUNBX1BLVF9QUk9UT19UUkFDRSAqLworCQl9IGVsc2UgeworCQkJaWYgKGRvd25sZF9jb21wX3JlcXVpcmVkKQorCQkJCXR4X2ZybV9pbmRleCA9CisJCQkJCUdFTkVSSUNfRE9XTkxEX0NPTVBfTk9BQ0tfQ09NUF9JTkRFWDsKKwkJCWVsc2UKKwkJCQl0eF9mcm1faW5kZXggPQorCQkJCQlHRU5FUklDX05PRE9XTkxEX05PQUNLX0NPTVBfSU5ERVg7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIERvd2xvYWQgQ29tcGxldGUgaXMgcmVxdWlyZWQKKwkgKiBXYWl0IGZvciBkb3dubG9hZCBjb21wbGV0ZQorCSAqLworCWlmIChkb3dubGRfY29tcF9yZXF1aXJlZCkgeworCQkvKiBTdG9yZSBUeCBDb21wIENiICovCisJCXdtYV9oYW5kbGUtPnR4X2ZybV9kb3dubG9hZF9jb21wX2NiID0gdHhfZnJtX2Rvd25sb2FkX2NvbXBfY2I7CisKKwkJLyogUmVzZXQgdGhlIFR4IEZyYW1lIENvbXBsZXRlIEV2ZW50ICovCisJCWNkZl9zdGF0dXMgPQorCQkJY2RmX2V2ZW50X3Jlc2V0KCZ3bWFfaGFuZGxlLT50eF9mcm1fZG93bmxvYWRfY29tcF9ldmVudCk7CisKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCVdNQV9MT0dQKCIlczogRXZlbnQgUmVzZXQgZmFpbGVkIHR4IGNvbXAgZXZlbnQgJXgiLAorCQkJCSBfX2Z1bmNfXywgY2RmX3N0YXR1cyk7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJLyogSWYgdGhlIGZyYW1lIGhhcyB0byBiZSBzZW50IGF0IEJEIFJhdGUyIGluZm9ybSBUeFJ4ICovCisJaWYgKHR4X2ZsYWcgJiBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FKQorCQl1c2VfNm1icHMgPSAxOworCisJaWYgKHdtYV9oYW5kbGUtPnJvYW1fcHJlYXV0aF9zY2FuX3N0YXRlID09IFdNQV9ST0FNX1BSRUFVVEhfT05fQ0hBTikgeworCQljaGFuZnJlcSA9IHdtYV9oYW5kbGUtPnJvYW1fcHJlYXV0aF9jaGFuZnJlcTsKKwkJV01BX0xPR0koIiVzOiBQcmVhdXRoIGZyYW1lIG9uIGNoYW5uZWwgJWQiLCBfX2Z1bmNfXywgY2hhbmZyZXEpOworCX0gZWxzZSBpZiAocEZjLT5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApIHsKKwkJY2hhbmZyZXEgPSB3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLm1oejsKKwkJV01BX0xPR0koIiVzOiBQcm9iZSByZXNwb25zZSBmcmFtZSBvbiBjaGFubmVsICVkIiwgX19mdW5jX18sCisJCQkgY2hhbmZyZXEpOworCQlXTUFfTE9HSSgiJXM6IFByb2JlIHJlc3BvbnNlIGZyYW1lIG9uIHZkZXYgaWQgJWQiLCBfX2Z1bmNfXywKKwkJCSB2ZGV2X2lkKTsKKwl9IGVsc2UgaWYgKHBGYy0+c3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQUNUSU9OKSB7CisJCWNoYW5mcmVxID0gY2hhbm5lbF9mcmVxOworCX0gZWxzZSB7CisJCWNoYW5mcmVxID0gMDsKKwl9CisJaWYgKHBNYWMtPmZFbmFibGVEZWJ1Z0xvZyAmIDB4MSkgeworCQlpZiAoKHBGYy0+dHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpICYmCisJCSAgICAocEZjLT5zdWJUeXBlICE9IFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpICYmCisJCSAgICAocEZjLT5zdWJUeXBlICE9IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApKSB7CisJCQlXTUFfTE9HRSgiVFggTUdNVCAtIFR5cGUgJWh1LCBTdWJUeXBlICVodSBzZXFfbnVtWyVkXSIsCisJCQkJIHBGYy0+dHlwZSwgcEZjLT5zdWJUeXBlLAorCQkJCSAoKG1IZHItPnNlcUNvbnRyb2wuc2VxTnVtSGkgPDwgNCkgfAorCQkJCSBtSGRyLT5zZXFDb250cm9sLnNlcU51bUxvKSk7CisJCX0KKwl9CisKKwlpZiAoV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWFfaGFuZGxlLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJICAgV01JX1NFUlZJQ0VfTUdNVF9UWF9XTUkpKSB7CisJCXN0YXR1cyA9IG1nbXRfd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZSwgdHhfZnJhbWUsIGZybUxlbiwKKwkJCQkJCSAgIHZkZXZfaWQsCisJCQkJCQkgICB0eF9mcm1fZG93bmxvYWRfY29tcF9jYiwKKwkJCQkJCSAgIHR4X2ZybV9vdGFfY29tcF9jYiwKKwkJCQkJCSAgIGNoYW5mcmVxLCBwRGF0YSk7CisJfSBlbHNlIHsKKwkJLyogSGFuZCBvdmVyIHRoZSBUeCBNZ210IGZyYW1lIHRvIFR4UnggKi8KKwkJc3RhdHVzID0gb2xfdHhyeF9tZ210X3NlbmQodHhyeF92ZGV2LCB0eF9mcmFtZSwgdHhfZnJtX2luZGV4LAorCQkJCQkgICB1c2VfNm1icHMsIGNoYW5mcmVxKTsKKwl9CisKKwkvKgorCSAqIEZhaWxlZCB0byBzZW5kIFR4IE1nbXQgRnJhbWUKKwkgKi8KKwlpZiAoc3RhdHVzKSB7CisJLyogQ2FsbCBEb3dubG9hZCBDYiBzbyB0aGF0IHVtYWMgY2FuIGZyZWUgdGhlIGJ1ZmZlciAqLworCQlpZiAodHhfZnJtX2Rvd25sb2FkX2NvbXBfY2IpCisJCQl0eF9mcm1fZG93bmxvYWRfY29tcF9jYih3bWFfaGFuZGxlLT5tYWNfY29udGV4dCwKKwkJCQkJCXR4X2ZyYW1lLAorCQkJCQkJV01BX1RYX0ZSQU1FX0JVRkZFUl9GUkVFKTsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gc2VuZCBNZ210IEZyYW1lIiwgX19mdW5jX18pOworCQlnb3RvIGVycm9yOworCX0KKworCWlmICghdHhfZnJtX2Rvd25sb2FkX2NvbXBfY2IpCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkvKgorCSAqIFdhaXQgZm9yIERvd25sb2FkIENvbXBsZXRlCisJICogaWYgcmVxdWlyZWQKKwkgKi8KKwlpZiAoZG93bmxkX2NvbXBfcmVxdWlyZWQpIHsKKwkJLyoKKwkJICogV2FpdCBmb3IgRG93bmxvYWQgQ29tcGxldGUKKwkJICogQCBJbnRlZ3JhdGVkIDogRHhlIENvbXBsZXRlCisJCSAqIEAgRGlzY3JldGUgOiBUYXJnZXQgRG93bmxvYWQgQ29tcGxldGUKKwkJICovCisJCWNkZl9zdGF0dXMgPQorCQkJY2RmX3dhaXRfc2luZ2xlX2V2ZW50KCZ3bWFfaGFuZGxlLT4KKwkJCQkJICAgICAgdHhfZnJtX2Rvd25sb2FkX2NvbXBfZXZlbnQsCisJCQkJCSAgICAgIFdNQV9UWF9GUkFNRV9DT01QTEVURV9USU1FT1VUKTsKKworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQkJV01BX0xPR1AoIldhaXQgRXZlbnQgZmFpbGVkIHR4ZnJtX2NvbXBfZXZlbnQiKTsKKwkJCS8qCisJCQkgKiBASW50ZWdyYXRlZDogU29tZXRoaW5nIFdyb25nIHdpdGggRHhlCisJCQkgKiAgIFRPRE86IFNvbWUgRGVidWcgQ29kZQorCQkJICogSGVyZSBXZSBuZWVkIHRvIHRyaWdnZXIgU1NSIHNpbmNlCisJCQkgKiBzaW5jZSBzeXN0ZW0gd2VudCBpbnRvIGEgYmFkIHN0YXRlIHdoZXJlCisJCQkgKiB3ZSBkaWRuJ3QgZ2V0IERvd25sb2FkIENvbXBsZXRlIGZvciBhbG1vc3QKKwkJCSAqIFdNQV9UWF9GUkFNRV9DT01QTEVURV9USU1FT1VUICgxIHNlYykKKwkJCSAqLworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRm9yIExvdyBMYXRlbmN5IERldmljZXMKKwkJICogQ2FsbCB0aGUgZG93bmxvYWQgY29tcGxldGUKKwkJICogY2FsbGJhY2sgb25jZSB0aGUgZnJhbWUgaXMgc3VjY2Vzc2Z1bGx5CisJCSAqIGdpdmVuIHRvIHR4cnggbW9kdWxlCisJCSAqLworCQl0eF9mcm1fZG93bmxvYWRfY29tcF9jYih3bWFfaGFuZGxlLT5tYWNfY29udGV4dCwgdHhfZnJhbWUsCisJCQkJCVdNQV9UWF9GUkFNRV9CVUZGRVJfTk9fRlJFRSk7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworZXJyb3I6CisJd21hX2hhbmRsZS0+dHhfZnJtX2Rvd25sb2FkX2NvbXBfY2IgPSBOVUxMOworCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKK30KKworLyoqCisgKiB3bWFfZHNfcGVla19yeF9wYWNrZXRfaW5mbygpIC0gcGVlayByeCBwYWNrZXQgaW5mbworICogQHBrdDogcGFja2V0CisgKiBAcGt0X21ldGE6IHBhY2tldCBtZXRhCisgKiBAYlN3YXA6IGJ5dGUgc3dhcAorICoKKyAqIEZ1bmN0aW9uIGZpbGxzIHRoZSByeCBwYWNrZXQgbWV0YSBpbmZvIGZyb20gdGhlIHRoZSBjZHMgcGFja2V0CisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX2RzX3BlZWtfcnhfcGFja2V0X2luZm8oY2RzX3BrdF90ICpwa3QsIHZvaWQgKipwa3RfbWV0YSwKKwkJCQkgICAgICBib29sIGJTd2FwKQoreworCS8qIFNhbml0eSBDaGVjayAqLworCWlmIChwa3QgPT0gTlVMTCkgeworCQlXTUFfTE9HRSgid21hOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gd21hX3BlZWtfcnhfcGt0X2luZm8iKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwkqcGt0X21ldGEgPSAmKHBrdC0+cGt0X21ldGEpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBvbF9yeF9lcnIoKSAtIG9sIHJ4IGVyciBoYW5kbGVyCisgKiBAcGRldjogb2wgcGRldgorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBwZWVyX21hY19hZGRyOiBwZWVyIG1hYyBhZGRyZXNzCisgKiBAdGlkOiBUSUQKKyAqIEB0c2YzMjogVFNGCisgKiBAZXJyX3R5cGU6IGVycm9yIHR5cGUKKyAqIEByeF9mcmFtZTogcnggZnJhbWUKKyAqIEBwbjogUE4gTnVtYmVyCisgKiBAa2V5X2lkOiBrZXkgaWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcnggZXJyb3IgYW5kIHNlbmQgTUlDIGVycm9yIGZhaWx1cmUgdG8gTElNCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgb2xfcnhfZXJyKG9sX3BkZXZfaGFuZGxlIHBkZXYsIHVpbnQ4X3QgdmRldl9pZCwKKwkgICAgICAgdWludDhfdCAqcGVlcl9tYWNfYWRkciwgaW50IHRpZCwgdWludDMyX3QgdHNmMzIsCisJICAgICAgIGVudW0gb2xfcnhfZXJyX3R5cGUgZXJyX3R5cGUsIGNkZl9uYnVmX3QgcnhfZnJhbWUsCisJICAgICAgIHVpbnQ2NF90ICpwbiwgdWludDhfdCBrZXlfaWQpCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCXRwU2lyU21lTWljRmFpbHVyZUluZCBtaWNfZXJyX2luZDsKKwlzdHJ1Y3QgZXRoZXJfaGVhZGVyICpldGhfaGRyOworCWNkc19tc2dfdCBjZHNfbXNnOworCisJaWYgKE5VTEwgPT0gd21hKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCB3bWEiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZXJyX3R5cGUgIT0gT0xfUlhfRVJSX1RLSVBfTUlDKQorCQlyZXR1cm47CisKKwlpZiAoY2RmX25idWZfbGVuKHJ4X2ZyYW1lKSA8IHNpemVvZigqZXRoX2hkcikpCisJCXJldHVybjsKKwlldGhfaGRyID0gKHN0cnVjdCBldGhlcl9oZWFkZXIgKiljZGZfbmJ1Zl9kYXRhKHJ4X2ZyYW1lKTsKKwltaWNfZXJyX2luZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqbWljX2Vycl9pbmQpKTsKKwlpZiAoIW1pY19lcnJfaW5kKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgTUlDIGluZGljYXRpb24gbWVzc2FnZSIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV9zZXQoKHZvaWQgKiltaWNfZXJyX2luZCwgc2l6ZW9mKCptaWNfZXJyX2luZCksIDApOworCisJbWljX2Vycl9pbmQtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfTUlDX0ZBSUxVUkVfSU5EOworCW1pY19lcnJfaW5kLT5sZW5ndGggPSBzaXplb2YoKm1pY19lcnJfaW5kKTsKKwltaWNfZXJyX2luZC0+c2Vzc2lvbklkID0gdmRldl9pZDsKKwljZGZfbWVtX2NvcHkobWljX2Vycl9pbmQtPmJzc0lkLAorCQkgICAgIChzdHJ1Y3QgY2RmX21hY19hZGRyICopIHdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5ic3NpZCwKKwkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKwljZGZfbWVtX2NvcHkobWljX2Vycl9pbmQtPmluZm8udGFNYWNBZGRyLAorCQkgICAgIChzdHJ1Y3QgY2RmX21hY19hZGRyICopIHBlZXJfbWFjX2FkZHIsCisJCQlzaXplb2YodFNpck1hY0FkZHIpKTsKKwljZGZfbWVtX2NvcHkobWljX2Vycl9pbmQtPmluZm8uc3JjTWFjQWRkciwKKwkJICAgICAoc3RydWN0IGNkZl9tYWNfYWRkciAqKSBldGhfaGRyLT5ldGhlcl9zaG9zdCwKKwkJCXNpemVvZih0U2lyTWFjQWRkcikpOworCWNkZl9tZW1fY29weShtaWNfZXJyX2luZC0+aW5mby5kc3RNYWNBZGRyLAorCQkgICAgIChzdHJ1Y3QgY2RmX21hY19hZGRyICopIGV0aF9oZHItPmV0aGVyX2Rob3N0LAorCQkJc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisJbWljX2Vycl9pbmQtPmluZm8ua2V5SWQgPSBrZXlfaWQ7CisJbWljX2Vycl9pbmQtPmluZm8ubXVsdGljYXN0ID0KKwkJSUVFRTgwMjExX0lTX01VTFRJQ0FTVChldGhfaGRyLT5ldGhlcl9kaG9zdCk7CisJY2RmX21lbV9jb3B5KG1pY19lcnJfaW5kLT5pbmZvLlRTQywgcG4sIFNJUl9DSVBIRVJfU0VRX0NUUl9TSVpFKTsKKworCWNkZl9tZW1fc2V0KCZjZHNfbXNnLCBzaXplb2YoY2RzX21zZ190KSwgMCk7CisJY2RzX21zZy50eXBlID0gZVdOSV9TTUVfTUlDX0ZBSUxVUkVfSU5EOworCWNkc19tc2cuYm9keXB0ciA9ICh2b2lkICopIG1pY19lcnJfaW5kOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCQljZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9TTUUsIChjZHNfbXNnX3QgKikgJmNkc19tc2cpKSB7CisJCVdNQV9MT0dFKCIlczogY291bGQgbm90IHBvc3QgbWljIGZhaWx1cmUgaW5kaWNhdGlvbiB0byBTTUUiLAorCQkJIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKCh2b2lkICopbWljX2Vycl9pbmQpOworCX0KK30KKworLyoqCisgKiB3bWFfdHhfYWJvcnQoKSAtIGFib3J0IHR4CisgKiBAdmRldl9pZDogdmRldiBpZAorICoKKyAqIEluIGNhc2Ugb2YgZGVhdXRoIGhvc3QgYWJvcnQgdHJhbnNtaXR0aW5nIHBhY2tldC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfdHhfYWJvcnQodWludDhfdCB2ZGV2X2lkKQoreworI2RlZmluZSBQRUVSX0FMTF9USURfQklUTUFTSyAweGZmZmZmZmZmCisJdHBfd21hX2hhbmRsZSB3bWE7CisJdWludDMyX3QgcGVlcl90aWRfYml0bWFwID0gUEVFUl9BTExfVElEX0JJVE1BU0s7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlOworCisJd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoTlVMTCA9PSB3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWEgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmYWNlID0gJndtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXTsKKwlpZiAoIWlmYWNlLT5oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGlmYWNlIGhhbmRsZTogJXAiLAorCQkJIF9fZnVuY19fLCBpZmFjZS0+aGFuZGxlKTsKKwkJcmV0dXJuOworCX0KKwlXTUFfTE9HQSgiJXM6IHZkZXZpZCAlZCBic3NpZCAlcE0iLCBfX2Z1bmNfXywgdmRldl9pZCwgaWZhY2UtPmJzc2lkKTsKKwlpZmFjZS0+cGF1c2VfYml0bWFwIHw9ICgxIDw8IFBBVVNFX1RZUEVfSE9TVCk7CisJb2xfdHhyeF92ZGV2X3BhdXNlKGlmYWNlLT5oYW5kbGUsIE9MX1RYUV9QQVVTRV9SRUFTT05fVFhfQUJPUlQpOworCisJLyogRmx1c2ggYWxsIFRJRHMgZXhjZXB0IE1HTVQgVElEIGZvciB0aGlzIHBlZXIgaW4gVGFyZ2V0ICovCisJcGVlcl90aWRfYml0bWFwICY9IH4oMHgxIDw8IFdNSV9NR01UX1RJRCk7CisJd21pX3VuaWZpZWRfcGVlcl9mbHVzaF90aWRzX3NlbmQod21hLT53bWlfaGFuZGxlLCBpZmFjZS0+YnNzaWQsCisJCQkJCSBwZWVyX3RpZF9iaXRtYXAsIHZkZXZfaWQpOworfQorCisjaWYgZGVmaW5lZChGRUFUVVJFX0xSTykKKy8qKgorICogd21hX2xyb19jb25maWdfY21kKCkgLSBwcm9jZXNzIHRoZSBMUk8gY29uZmlnIGNvbW1hbmQKKyAqIEB3bWE6IFBvaW50ZXIgdG8gV01BIGhhbmRsZQorICogQHdtYV9scm9fY21kOiBQb2ludGVyIHRvIExSTyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGRvd24gdGhlIExSTyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdG8KKyAqIHRoZSBmaXJtd2FyZSB0byBlbmFibGUgTFJPLCBzZXRzIHRoZSBUQ1AgZmxhZ3MgYW5kIHNldHMgdGhlCisgKiBzZWVkIHZhbHVlcyBmb3IgdGhlIHRvZXBsaXR6IGhhc2ggZ2VuZXJhdGlvbgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGZvciBzdWNjZXNzIG90aGVyd2lzZSBmYWlsdXJlCisgKi8KK0NERl9TVEFUVVMgd21hX2xyb19jb25maWdfY21kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkgc3RydWN0IHdtYV9scm9fY29uZmlnX2NtZF90ICp3bWFfbHJvX2NtZCkKK3sKKwl3bWlfbHJvX2luZm9fY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQgc3RhdHVzOworCisJaWYgKE5VTEwgPT0gd21hX2hhbmRsZSB8fCBOVUxMID09IHdtYV9scm9fY21kKSB7CisJCVdNQV9MT0dFKCJ3bWFfbHJvX2NvbmZpZ19jbWQnOiBpbnZhbGlkIGlucHV0ISIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBzaXplb2YoKmNtZCkpOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIHRvIHNlbmQgc2V0IGtleSBjbWQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNtZCA9ICh3bWlfbHJvX2luZm9fY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJIFdNSVRMVl9UQUdfU1RSVUNfd21pX2xyb19pbmZvX2NtZF9maXhlZF9wYXJhbSwKKwkJIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfbHJvX2luZm9fY21kX2ZpeGVkX3BhcmFtKSk7CisKKwljbWQtPmxyb19lbmFibGUgPSB3bWFfbHJvX2NtZC0+bHJvX2VuYWJsZTsKKwlXTUlfTFJPX0lORk9fVENQX0ZMQUdfVkFMU19TRVQoY21kLT50Y3BfZmxhZ191MzIsCisJCSB3bWFfbHJvX2NtZC0+dGNwX2ZsYWcpOworCVdNSV9MUk9fSU5GT19UQ1BfRkxBR1NfTUFTS19TRVQoY21kLT50Y3BfZmxhZ191MzIsCisJCSB3bWFfbHJvX2NtZC0+dGNwX2ZsYWdfbWFzayk7CisJY21kLT50b2VwbGl0el9oYXNoX2lwdjRfMF8zID0KKwkJIHdtYV9scm9fY21kLT50b2VwbGl0el9oYXNoX2lwdjRbMF07CisJY21kLT50b2VwbGl0el9oYXNoX2lwdjRfNF83ID0KKwkJIHdtYV9scm9fY21kLT50b2VwbGl0el9oYXNoX2lwdjRbMV07CisJY21kLT50b2VwbGl0el9oYXNoX2lwdjRfOF8xMSA9CisJCSB3bWFfbHJvX2NtZC0+dG9lcGxpdHpfaGFzaF9pcHY0WzJdOworCWNtZC0+dG9lcGxpdHpfaGFzaF9pcHY0XzEyXzE1ID0KKwkJIHdtYV9scm9fY21kLT50b2VwbGl0el9oYXNoX2lwdjRbM107CisJY21kLT50b2VwbGl0el9oYXNoX2lwdjRfMTYgPQorCQkgd21hX2xyb19jbWQtPnRvZXBsaXR6X2hhc2hfaXB2NFs0XTsKKworCWNtZC0+dG9lcGxpdHpfaGFzaF9pcHY2XzBfMyA9CisJCSB3bWFfbHJvX2NtZC0+dG9lcGxpdHpfaGFzaF9pcHY2WzBdOworCWNtZC0+dG9lcGxpdHpfaGFzaF9pcHY2XzRfNyA9CisJCSB3bWFfbHJvX2NtZC0+dG9lcGxpdHpfaGFzaF9pcHY2WzFdOworCWNtZC0+dG9lcGxpdHpfaGFzaF9pcHY2XzhfMTEgPQorCQkgd21hX2xyb19jbWQtPnRvZXBsaXR6X2hhc2hfaXB2NlsyXTsKKwljbWQtPnRvZXBsaXR6X2hhc2hfaXB2Nl8xMl8xNSA9CisJCSB3bWFfbHJvX2NtZC0+dG9lcGxpdHpfaGFzaF9pcHY2WzNdOworCWNtZC0+dG9lcGxpdHpfaGFzaF9pcHY2XzE2XzE5ID0KKwkJIHdtYV9scm9fY21kLT50b2VwbGl0el9oYXNoX2lwdjZbNF07CisJY21kLT50b2VwbGl0el9oYXNoX2lwdjZfMjBfMjMgPQorCQkgd21hX2xyb19jbWQtPnRvZXBsaXR6X2hhc2hfaXB2Nls1XTsKKwljbWQtPnRvZXBsaXR6X2hhc2hfaXB2Nl8yNF8yNyA9CisJCSB3bWFfbHJvX2NtZC0+dG9lcGxpdHpfaGFzaF9pcHY2WzZdOworCWNtZC0+dG9lcGxpdHpfaGFzaF9pcHY2XzI4XzMxID0KKwkJIHdtYV9scm9fY21kLT50b2VwbGl0el9oYXNoX2lwdjZbN107CisJY21kLT50b2VwbGl0el9oYXNoX2lwdjZfMzJfMzUgPQorCQkgd21hX2xyb19jbWQtPnRvZXBsaXR6X2hhc2hfaXB2Nls4XTsKKwljbWQtPnRvZXBsaXR6X2hhc2hfaXB2Nl8zNl8zOSA9CisJCSB3bWFfbHJvX2NtZC0+dG9lcGxpdHpfaGFzaF9pcHY2WzldOworCWNtZC0+dG9lcGxpdHpfaGFzaF9pcHY2XzQwID0KKwkJIHdtYV9scm9fY21kLT50b2VwbGl0el9oYXNoX2lwdjZbMTBdOworCisJV01BX0xPR0QoIldNSV9MUk9fQ09ORklHOiBscm9fZW5hYmxlICVkLCB0Y3BfZmxhZyAweCV4IiwKKwkJY21kLT5scm9fZW5hYmxlLCBjbWQtPnRjcF9mbGFnX3UzMik7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCSBzaXplb2YoKmNtZCksIFdNSV9MUk9fQ09ORklHX0NNRElEKTsKKwlpZiAoc3RhdHVzKSB7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwkJV01BX0xPR0UoIiVzOkZhaWxlZCB0byBzZW5kIFdNSV9MUk9fQ09ORklHX0NNRElEIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS93bWEvc3JjL3dtYV9kZXZfaWYuYyBiL2NvcmUvd21hL3NyYy93bWFfZGV2X2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3YjMyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvd21hL3NyYy93bWFfZGV2X2lmLmMKQEAgLTAsMCArMSw0NDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqICBET0M6ICAgIHdtYV9kZXZfaWYuYworICogIFRoaXMgZmlsZSBjb250YWlucyB2ZGV2ICYgcGVlciByZWxhdGVkIG9wZXJhdGlvbnMuCisgKi8KKworLyogSGVhZGVyIGZpbGVzICovCisKKyNpbmNsdWRlICJ3bWEuaCIKKyNpbmNsdWRlICJ3bWFfYXBpLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgIndtaV91bmlmaWVkX2FwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3N5cy5oIgorI2luY2x1ZGUgInduaV9hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAid21pX3VuaWZpZWQuaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgIm9sX3R4cnhfY3RybF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3RndF9kZWZfY29uZmlnLmgiCisKKyNpbmNsdWRlICJjZGZfbmJ1Zi5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgIm9sX3R4cnhfYXBpLmgiCisjaW5jbHVkZSAiY2RmX21lbW9yeS5oIgorI2luY2x1ZGUgIm9sX3R4cnhfdHlwZXMuaCIKKyNpbmNsdWRlICJvbF90eHJ4X3BlZXJfZmluZC5oIgorCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX2FwaS5oIgorI2luY2x1ZGUgImxpbV9zZXNzaW9uX3V0aWxzLmgiCisKKyNpbmNsdWRlICJjZHNfdXRpbHMuaCIKKworI2lmICFkZWZpbmVkKFJFTU9WRV9QS1RfTE9HKQorI2luY2x1ZGUgInBrdGxvZ19hYy5oIgorI2VuZGlmIC8qIFJFTU9WRV9QS1RfTE9HICovCisKKyNpbmNsdWRlICJkYmdsb2dfaG9zdC5oIgorLyogRklYTUU6IEluY2x1c2lvbiBvZiAuYyBsb29rcyBvZGQgYnV0IHRoaXMgaXMgaG93IGl0IGlzIGluIGludGVybmFsIGNvZGViYXNlICovCisjaW5jbHVkZSAiY3NyX2FwaS5oIgorI2luY2x1ZGUgIm9sX2Z3LmgiCisKKyNpbmNsdWRlICJkZnMuaCIKKyNpbmNsdWRlICJ3bWFfaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIndtYV9vY2IuaCIKKworLyoqCisgKiB3bWFfZmluZF92ZGV2X2J5X2FkZHIoKSAtIGZpbmQgdmRldl9pZCBmcm9tIG1hYyBhZGRyZXNzCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAYWRkcjogbWFjIGFkZHJlc3MKKyAqIEB2ZGV2X2lkOiByZXR1cm4gdmRldl9pZAorICoKKyAqIFJldHVybjogUmV0dXJucyB2ZGV2IGhhbmRsZSBvciBOVUxMIGlmIG1hYyBhZGRyZXNzIGRvbid0IG1hdGNoCisgKi8KK3ZvaWQgKndtYV9maW5kX3ZkZXZfYnlfYWRkcih0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCAqYWRkciwKKwkJCQkgICB1aW50OF90ICp2ZGV2X2lkKQoreworCXVpbnQ4X3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCB3bWEtPm1heF9ic3NpZDsgaSsrKSB7CisJCWlmIChjZGZfaXNfbWFjYWRkcl9lcXVhbCgKKwkJCShzdHJ1Y3QgY2RmX21hY19hZGRyICopIHdtYS0+aW50ZXJmYWNlc1tpXS5hZGRyLAorCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgYWRkcikgPT0gdHJ1ZSkgeworCQkJKnZkZXZfaWQgPSBpOworCQkJcmV0dXJuIHdtYS0+aW50ZXJmYWNlc1tpXS5oYW5kbGU7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoqCisgKiB3bWFfaXNfdmRldl9pbl9hcF9tb2RlKCkgLSBjaGVjayB0aGF0IHZkZXYgaXMgaW4gYXAgbW9kZSBvciBub3QKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGtub3cgd2hldGhlciBnaXZlbiB2ZGV2IGlkCisgKiBpcyBpbiBBUCBtb2RlIG9yIG5vdC4KKyAqCisgKiBSZXR1cm46IFRydWUvRmFsc2UKKyAqLworYm9vbCB3bWFfaXNfdmRldl9pbl9hcF9tb2RlKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IHZkZXZfaWQpCit7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmludGYgPSB3bWEtPmludGVyZmFjZXM7CisKKwlpZiAodmRldl9pZCA+IHdtYS0+bWF4X2Jzc2lkKSB7CisJCVdNQV9MT0dQKCIlczogSW52YWxpZCB2ZGV2X2lkICVodSIsIF9fZnVuY19fLCB2ZGV2X2lkKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICgoaW50Zlt2ZGV2X2lkXS50eXBlID09IFdNSV9WREVWX1RZUEVfQVApICYmCisJICAgICgoaW50Zlt2ZGV2X2lkXS5zdWJfdHlwZSA9PSBXTUlfVU5JRklFRF9WREVWX1NVQlRZUEVfUDJQX0dPKSB8fAorCSAgICAgKGludGZbdmRldl9pZF0uc3ViX3R5cGUgPT0gMCkpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKy8qKgorICogd21hX2lzX3ZkZXZfaW5faWJzc19tb2RlKCkgLSBjaGVjayB0aGF0IHZkZXYgaXMgaW4gaWJzcyBtb2RlIG9yIG5vdAorICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8ga25vdyB3aGV0aGVyIGdpdmVuIHZkZXYgaWQKKyAqIGlzIGluIElCU1MgbW9kZSBvciBub3QuCisgKgorICogUmV0dXJuOiBUcnVlL0ZhbHNlCisgKi8KK2Jvb2wgd21hX2lzX3ZkZXZfaW5faWJzc19tb2RlKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IHZkZXZfaWQpCit7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmludGYgPSB3bWEtPmludGVyZmFjZXM7CisKKwlpZiAodmRldl9pZCA+IHdtYS0+bWF4X2Jzc2lkKSB7CisJCVdNQV9MT0dQKCIlczogSW52YWxpZCB2ZGV2X2lkICVodSIsIF9fZnVuY19fLCB2ZGV2X2lkKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChpbnRmW3ZkZXZfaWRdLnR5cGUgPT0gV01JX1ZERVZfVFlQRV9JQlNTKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZiAvKiBRQ0FfSUJTU19TVVBQT1JUICovCisKKworLyoqCisgKiB3bWFfZmluZF92ZGV2X2J5X2Jzc2lkKCkgLSBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmRldl9pZCBmcm9tIEJTU0lECisgKiBAd21hIC0gd21hIGhhbmRsZQorICogQHZkZXZfaWQgLSB2ZGV2IElECisgKgorICogUmV0dXJuOiBmaWxsIHZkZXZfaWQgd2l0aCBhcHByb3ByaWF0ZSB2ZGV2IGlkIGFuZCByZXR1cm4gdmRldgorICogICAgICAgICBoYW5kbGUgb3IgTlVMTCBpZiBub3QgZm91bmQuCisgKi8KK3ZvaWQgKndtYV9maW5kX3ZkZXZfYnlfYnNzaWQodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgKmJzc2lkLAorCQkJCSAgICB1aW50OF90ICp2ZGV2X2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHdtYS0+bWF4X2Jzc2lkOyBpKyspIHsKKwkJaWYgKGNkZl9pc19tYWNhZGRyX2VxdWFsKAorCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgd21hLT5pbnRlcmZhY2VzW2ldLmJzc2lkLAorCQkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgYnNzaWQpID09IHRydWUpIHsKKwkJCSp2ZGV2X2lkID0gaTsKKwkJCXJldHVybiB3bWEtPmludGVyZmFjZXNbaV0uaGFuZGxlOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogd21hX2dldF90eHJ4X3ZkZXZfdHlwZSgpIC0gcmV0dXJuIG9wZXJhdGluZyBtb2RlIG9mIHZkZXYKKyAqIEB0eXBlOiB2ZGV2X3R5cGUKKyAqCisgKiBSZXR1cm46IHJldHVybiBvcGVyYXRpbmcgbW9kZSBhcyBlbnVtIHdsYW5fb3BfbW9kZSB0eXBlCisgKi8KK2VudW0gd2xhbl9vcF9tb2RlIHdtYV9nZXRfdHhyeF92ZGV2X3R5cGUodWludDMyX3QgdHlwZSkKK3sKKwllbnVtIHdsYW5fb3BfbW9kZSB2ZGV2X3R5cGUgPSB3bGFuX29wX21vZGVfdW5rbm93bjsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFdNSV9WREVWX1RZUEVfQVA6CisJCXZkZXZfdHlwZSA9IHdsYW5fb3BfbW9kZV9hcDsKKwkJYnJlYWs7CisJY2FzZSBXTUlfVkRFVl9UWVBFX1NUQToKKwkJdmRldl90eXBlID0gd2xhbl9vcF9tb2RlX3N0YTsKKwkJYnJlYWs7CisjaWZkZWYgUUNBX0lCU1NfU1VQUE9SVAorCWNhc2UgV01JX1ZERVZfVFlQRV9JQlNTOgorCQl2ZGV2X3R5cGUgPSB3bGFuX29wX21vZGVfaWJzczsKKwkJYnJlYWs7CisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworCWNhc2UgV01JX1ZERVZfVFlQRV9PQ0I6CisJCXZkZXZfdHlwZSA9IHdsYW5fb3BfbW9kZV9vY2I7CisJCWJyZWFrOworCWNhc2UgV01JX1ZERVZfVFlQRV9NT05JVE9SOgorCWRlZmF1bHQ6CisJCVdNQV9MT0dFKCJJbnZhbGlkIHZkZXYgdHlwZSAldSIsIHR5cGUpOworCQl2ZGV2X3R5cGUgPSB3bGFuX29wX21vZGVfdW5rbm93bjsKKwl9CisKKwlyZXR1cm4gdmRldl90eXBlOworfQorCisvKioKKyAqIHdtYV91bmlmaWVkX3ZkZXZfY3JlYXRlX3NlbmQoKSAtIHNlbmQgVkRFViBjcmVhdGUgY29tbWFuZCB0byBmdworICogQHdtaV9oYW5kbGU6IHdtaSBoYW5kbGUKKyAqIEBpZl9pZDogdmRldiBpZAorICogQHR5cGU6IHZkZXYgdHlwZQorICogQHN1YnR5cGU6IHZkZXYgc3VidHlwZQorICogQG1hY2FkZHI6IHZkZXYgbWFjIGFkZHJlc3MKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX3VuaWZpZWRfdmRldl9jcmVhdGVfc2VuZCh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIHVpbnQ4X3QgaWZfaWQsCisJCQkJIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHN1YnR5cGUsCisJCQkJIHVpbnQ4X3QgbWFjYWRkcltJRUVFODAyMTFfQUREUl9MRU5dKQoreworCXdtaV92ZGV2X2NyZWF0ZV9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCWludCBsZW4gPSBzaXplb2YoKmNtZCk7CisJaW50IHJldDsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HUCgiJXM6d21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY21kID0gKHdtaV92ZGV2X2NyZWF0ZV9jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfY3JlYXRlX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfdmRldl9jcmVhdGVfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gaWZfaWQ7CisJY21kLT52ZGV2X3R5cGUgPSB0eXBlOworCWNtZC0+dmRldl9zdWJ0eXBlID0gc3VidHlwZTsKKwlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUihtYWNhZGRyLCAmY21kLT52ZGV2X21hY2FkZHIpOworCVdNQV9MT0dFKCIlczogSUQgPSAlZCBWQVAgQWRkciA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJIF9fZnVuY19fLCBpZl9pZCwKKwkJIG1hY2FkZHJbMF0sIG1hY2FkZHJbMV0sIG1hY2FkZHJbMl0sCisJCSBtYWNhZGRyWzNdLCBtYWNhZGRyWzRdLCBtYWNhZGRyWzVdKTsKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWlfaGFuZGxlLCBidWYsIGxlbiwgV01JX1ZERVZfQ1JFQVRFX0NNRElEKTsKKwlpZiAocmV0ICE9IEVPSykgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgV01JX1ZERVZfQ1JFQVRFX0NNRElEIik7CisJCXdtaV9idWZfZnJlZShidWYpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtYV91bmlmaWVkX3ZkZXZfZGVsZXRlX3NlbmQoKSAtIHNlbmQgVkRFViBkZWxldGUgY29tbWFuZCB0byBmdworICogQHdtaV9oYW5kbGU6IHdtaSBoYW5kbGUKKyAqIEBpZl9pZDogdmRldiBpZAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd21hX3VuaWZpZWRfdmRldl9kZWxldGVfc2VuZCh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIHVpbnQ4X3QgaWZfaWQpCit7CisJd21pX3ZkZXZfZGVsZXRlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50IHJldDsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21pX2hhbmRsZSwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HUCgiJXM6d21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljbWQgPSAod21pX3ZkZXZfZGVsZXRlX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9kZWxldGVfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV92ZGV2X2RlbGV0ZV9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSBpZl9pZDsKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWlfaGFuZGxlLCBidWYsCisJCQkJICAgc2l6ZW9mKHdtaV92ZGV2X2RlbGV0ZV9jbWRfZml4ZWRfcGFyYW0pLAorCQkJCSAgIFdNSV9WREVWX0RFTEVURV9DTURJRCk7CisJaWYgKHJldCAhPSBFT0spIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIFdNSV9WREVWX0RFTEVURV9DTURJRCIpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfZmluZF9yZXEoKSAtIGZpbmQgdGFyZ2V0IHJlcXVlc3QgZm9yIHZkZXYgaWQKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAdHlwZTogcmVxdWVzdCB0eXBlCisgKgorICogUmV0dXJuOiByZXR1cm4gdGFyZ2V0IHJlcXVlc3QgaWYgZm91bmQgb3IgTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCB3bWFfdGFyZ2V0X3JlcSAqd21hX2ZpbmRfcmVxKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkgICB1aW50OF90IHZkZXZfaWQsIHVpbnQ4X3QgdHlwZSkKK3sKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKnJlcV9tc2cgPSBOVUxMOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwljZGZfbGlzdF9ub2RlX3QgKm5vZGUxID0gTlVMTCwgKm5vZGUyID0gTlVMTDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCWNkZl9zcGluX2xvY2tfYmgoJndtYS0+d21hX2hvbGRfcmVxX3FfbG9jayk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfbGlzdF9wZWVrX2Zyb250KCZ3bWEtPndtYV9ob2xkX3JlcV9xdWV1ZSwKKwkJCQkJCSAgICAgICZub2RlMikpIHsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZ3bWEtPndtYV9ob2xkX3JlcV9xX2xvY2spOworCQlXTUFfTE9HRShGTCgidW5hYmxlIHRvIGdldCBtc2cgbm9kZSBmcm9tIHJlcXVlc3QgcXVldWUiKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWRvIHsKKwkJbm9kZTEgPSBub2RlMjsKKwkJcmVxX21zZyA9IGNkZl9jb250YWluZXJfb2Yobm9kZTEsIHN0cnVjdCB3bWFfdGFyZ2V0X3JlcSwgbm9kZSk7CisJCWlmIChyZXFfbXNnLT52ZGV2X2lkICE9IHZkZXZfaWQpCisJCQljb250aW51ZTsKKwkJaWYgKHJlcV9tc2ctPnR5cGUgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCisJCWZvdW5kID0gdHJ1ZTsKKwkJc3RhdHVzID0gY2RmX2xpc3RfcmVtb3ZlX25vZGUoJndtYS0+d21hX2hvbGRfcmVxX3F1ZXVlLCBub2RlMSk7CisJCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCQljZGZfc3Bpbl91bmxvY2tfYmgoJndtYS0+d21hX2hvbGRfcmVxX3FfbG9jayk7CisJCQlXTUFfTE9HRChGTCgiRmFpbGVkIHRvIHJlbW92ZSByZXF1ZXN0IGZvciB2ZGV2X2lkICVkIHR5cGUgJWQiKSwKKwkJCQkgdmRldl9pZCwgdHlwZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlicmVhazsKKwl9IHdoaWxlIChDREZfU1RBVFVTX1NVQ0NFU1MgID09CisJCQljZGZfbGlzdF9wZWVrX25leHQoJndtYS0+d21hX2hvbGRfcmVxX3F1ZXVlLCBub2RlMSwKKwkJCQkJICAgJm5vZGUyKSk7CisKKwlpZiAoIWZvdW5kKSB7CisJCWNkZl9zcGluX3VubG9ja19iaCgmd21hLT53bWFfaG9sZF9yZXFfcV9sb2NrKTsKKwkJV01BX0xPR0UoRkwoInRhcmdldCByZXF1ZXN0IG5vdCBmb3VuZCBmb3IgdmRldl9pZCAlZCB0eXBlICVkIiksCisJCQkgdmRldl9pZCwgdHlwZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWNkZl9zcGluX3VubG9ja19iaCgmd21hLT53bWFfaG9sZF9yZXFfcV9sb2NrKTsKKwlXTUFfTE9HRChGTCgidGFyZ2V0IHJlcXVlc3QgZm91bmQgZm9yIHZkZXYgaWQ6ICVkIHR5cGUgJWQiKSwKKwkJIHZkZXZfaWQsIHR5cGUpOworCisJcmV0dXJuIHJlcV9tc2c7Cit9CisKKy8qKgorICogd21hX2ZpbmRfdmRldl9yZXEoKSAtIGZpbmQgdGFyZ2V0IHJlcXVlc3QgZm9yIHZkZXYgaWQKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAdHlwZTogcmVxdWVzdCB0eXBlCisgKgorICogUmV0dXJuOiByZXR1cm4gdGFyZ2V0IHJlcXVlc3QgaWYgZm91bmQgb3IgTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCB3bWFfdGFyZ2V0X3JlcSAqd21hX2ZpbmRfdmRldl9yZXEodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCQl1aW50OF90IHZkZXZfaWQsIHVpbnQ4X3QgdHlwZSkKK3sKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKnJlcV9tc2cgPSBOVUxMLCAqdG1wOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCWNkZl9zcGluX2xvY2tfYmgoJndtYS0+dmRldl9yZXNwcV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxX21zZywgdG1wLCAmd21hLT52ZGV2X3Jlc3BfcXVldWUsIG5vZGUpIHsKKwkJaWYgKHJlcV9tc2ctPnZkZXZfaWQgIT0gdmRldl9pZCkKKwkJCWNvbnRpbnVlOworCQlpZiAocmVxX21zZy0+dHlwZSAhPSB0eXBlKQorCQkJY29udGludWU7CisKKwkJZm91bmQgPSB0cnVlOworCQlsaXN0X2RlbCgmcmVxX21zZy0+bm9kZSk7CisJCWJyZWFrOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJndtYS0+dmRldl9yZXNwcV9sb2NrKTsKKwlpZiAoIWZvdW5kKSB7CisJCVdNQV9MT0dQKCIlczogdGFyZ2V0IHJlcXVlc3Qgbm90IGZvdW5kIGZvciB2ZGV2X2lkICVkIHR5cGUgJWQiLAorCQkJIF9fZnVuY19fLCB2ZGV2X2lkLCB0eXBlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVdNQV9MT0dEKCIlczogdGFyZ2V0IHJlcXVlc3QgZm91bmQgZm9yIHZkZXYgaWQ6ICVkIHR5cGUgJWQgbXNnICVkIiwKKwkJIF9fZnVuY19fLCB2ZGV2X2lkLCB0eXBlLCByZXFfbXNnLT5tc2dfdHlwZSk7CisJcmV0dXJuIHJlcV9tc2c7Cit9CisKKy8qKgorICogd21hX3ZkZXZfZGV0YWNoX2NhbGxiYWNrKCkgLSBzZW5kIHZkZXYgZGV0YWNoIHJlc3BvbnNlIHRvIHVwcGVyIGxheWVyCisgKiBAY3R4OiB0eHJ4IG5vZGUgcHRyCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3ZkZXZfZGV0YWNoX2NhbGxiYWNrKHZvaWQgKmN0eCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaWZhY2UgPSAoc3RydWN0IHdtYV90eHJ4X25vZGUgKiljdHg7CisJc3RydWN0IGRlbF9zdGFfc2VsZl9wYXJhbXMgKnBhcmFtOworCXN0cnVjdCB3bWFfdGFyZ2V0X3JlcSAqcmVxX21zZzsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwljZHNfbXNnX3Qgc21lX21zZyA9IHsgMCB9OworCisJd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKworCWlmICghd21hIHx8ICFpZmFjZS0+ZGVsX3N0YXNlbGZfcmVxKSB7CisJCVdNQV9MT0dQKCIlczogd21hICVwIGlmYWNlICVwIiwgX19mdW5jX18sIHdtYSwKKwkJCSBpZmFjZS0+ZGVsX3N0YXNlbGZfcmVxKTsKKwkJcmV0dXJuOworCX0KKwlwYXJhbSA9IChzdHJ1Y3QgZGVsX3N0YV9zZWxmX3BhcmFtcyAqKSBpZmFjZS0+ZGVsX3N0YXNlbGZfcmVxOworCVdNQV9MT0dEKCIlczogc2VuZGluZyBlV05JX1NNRV9ERUxfU1RBX1NFTEZfUlNQIGZvciB2ZGV2ICVkIiwKKwkJIF9fZnVuY19fLCBwYXJhbS0+c2Vzc2lvbl9pZCk7CisKKwlyZXFfbXNnID0gd21hX2ZpbmRfdmRldl9yZXEod21hLCBwYXJhbS0+c2Vzc2lvbl9pZCwKKwkJCQkgICAgV01BX1RBUkdFVF9SRVFfVFlQRV9WREVWX0RFTCk7CisJaWYgKHJlcV9tc2cpIHsKKwkJV01BX0xPR0QoIiVzOiBGb3VuZCB2ZGV2IHJlcXVlc3QgZm9yIHZkZXYgaWQgJWQiLAorCQkJIF9fZnVuY19fLCBwYXJhbS0+c2Vzc2lvbl9pZCk7CisJCWNkZl9tY190aW1lcl9zdG9wKCZyZXFfbXNnLT5ldmVudF90aW1lb3V0KTsKKwkJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnJlcV9tc2ctPmV2ZW50X3RpbWVvdXQpOworCQljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJfQorCWlmIChpZmFjZS0+YWRkQnNzU3RhQ29udGV4dCkKKwkJY2RmX21lbV9mcmVlKGlmYWNlLT5hZGRCc3NTdGFDb250ZXh0KTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAoaWZhY2UtPnN0YUtleVBhcmFtcykKKwkJY2RmX21lbV9mcmVlKGlmYWNlLT5zdGFLZXlQYXJhbXMpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisJY2RmX21lbV96ZXJvKGlmYWNlLCBzaXplb2YoKmlmYWNlKSk7CisJcGFyYW0tPnN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlzbWVfbXNnLnR5cGUgPSBlV05JX1NNRV9ERUxfU1RBX1NFTEZfUlNQOworCXNtZV9tc2cuYm9keXB0ciA9IHBhcmFtOworCXNtZV9tc2cuYm9keXZhbCA9IDA7CisKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfU01FLCAmc21lX21zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHBvc3QgZVdOSV9TTUVfQUREX1NUQV9TRUxGX1JTUCIpOworCQljZGZfbWVtX2ZyZWUocGFyYW0pOworCX0KK30KKworLyoqCisgKiB3bWFfdmRldl9kZXRhY2goKSAtIHNlbmQgdmRldiBkZWxldGUgY29tbWFuZCB0byBmdworICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBwZGVsX3N0YV9zZWxmX3JlcV9wYXJhbTogZGVsIHN0YSBwYXJhbXMKKyAqIEBnZW5lcmF0ZVJzcDogZ2VuZXJhdGUgUmVzcG9uc2UgZmxhZworICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV92ZGV2X2RldGFjaCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQlzdHJ1Y3QgZGVsX3N0YV9zZWxmX3BhcmFtcyAqcGRlbF9zdGFfc2VsZl9yZXFfcGFyYW0sCisJCQl1aW50OF90IGdlbmVyYXRlUnNwKQoreworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCW9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlcjsKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXY7CisJdWludDhfdCBwZWVyX2lkOworCXVpbnQ4X3QgdmRldl9pZCA9IHBkZWxfc3RhX3NlbGZfcmVxX3BhcmFtLT5zZXNzaW9uX2lkOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZSA9ICZ3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3ZkZXZfaWRdOworCXN0cnVjdCB3bWFfdGFyZ2V0X3JlcSAqbXNnOworCWNkc19tc2dfdCBzbWVfbXNnID0geyAwIH07CisKKwlpZiAoKGlmYWNlLT50eXBlID09IFdNSV9WREVWX1RZUEVfQVApICYmCisJICAgIChpZmFjZS0+c3ViX3R5cGUgPT0gV01JX1VOSUZJRURfVkRFVl9TVUJUWVBFX1AyUF9ERVZJQ0UpKSB7CisKKwkJV01BX0xPR0EoIlAyUCBEZXZpY2U6IHJlbW92aW5nIHNlbGYgcGVlciAlcE0iLAorCQkJIHBkZWxfc3RhX3NlbGZfcmVxX3BhcmFtLT5zZWxmX21hY19hZGRyKTsKKworCQlwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisKKwkJaWYgKE5VTEwgPT0gcGRldikgeworCQkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHBkZXYiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCQl9CisKKwkJcGVlciA9IG9sX3R4cnhfZmluZF9wZWVyX2J5X2FkZHIocGRldiwKKwkJCQkgcGRlbF9zdGFfc2VsZl9yZXFfcGFyYW0tPnNlbGZfbWFjX2FkZHIsCisJCQkJICZwZWVyX2lkKTsKKwkJaWYgKCFwZWVyKSB7CisJCQlXTUFfTE9HRSgiJXMgRmFpbGVkIHRvIGZpbmQgcGVlciAlcE0iLCBfX2Z1bmNfXywKKwkJCQkgcGRlbF9zdGFfc2VsZl9yZXFfcGFyYW0tPnNlbGZfbWFjX2FkZHIpOworCQl9CisJCXdtYV9yZW1vdmVfcGVlcih3bWFfaGFuZGxlLAorCQkJCXBkZWxfc3RhX3NlbGZfcmVxX3BhcmFtLT5zZWxmX21hY19hZGRyLAorCQkJCXZkZXZfaWQsIHBlZXIsIGZhbHNlKTsKKwl9CisJaWYgKGNkZl9hdG9taWNfcmVhZCgmaWZhY2UtPmJzc19zdGF0dXMpID09IFdNQV9CU1NfU1RBVFVTX1NUQVJURUQpIHsKKwkJV01BX0xPR0EoIkJTUyBpcyBub3QgeWV0IHN0b3BwZWQuIERlZmVyaW5nIHZkZXYodmRldiBpZCAleCkgZGVsZXRpb24iLAorCQkJdmRldl9pZCk7CisJCWlmYWNlLT5kZWxfc3Rhc2VsZl9yZXEgPSBwZGVsX3N0YV9zZWxmX3JlcV9wYXJhbTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoIWlmYWNlLT5oYW5kbGUpIHsKKwkJV01BX0xPR0UoImhhbmRsZSBvZiB2ZGV2X2lkICVkIGlzIE5VTEwgdmRldiBpcyBhbHJlYWR5IGZyZWVkIiwKKwkJCSB2ZGV2X2lkKTsKKwkJY2RmX21lbV9mcmVlKHBkZWxfc3RhX3NlbGZfcmVxX3BhcmFtKTsKKwkJcGRlbF9zdGFfc2VsZl9yZXFfcGFyYW0gPSBOVUxMOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCisJLyogcmVtb3ZlIHRoZSBpbnRlcmZhY2UgZnJvbSBhdGhfZGV2ICovCisJaWYgKHdtYV91bmlmaWVkX3ZkZXZfZGVsZXRlX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgdmRldl9pZCkpIHsKKwkJV01BX0xPR0UoIlVuYWJsZSB0byByZW1vdmUgYW4gaW50ZXJmYWNlIGZvciBhdGhfZGV2LiIpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBvdXQ7CisJfQorCisJV01BX0xPR0EoInZkZXZfaWQ6JWh1IHZkZXZfaGRsOiVwIiwgdmRldl9pZCwgaWZhY2UtPmhhbmRsZSk7CisJaWYgKCFnZW5lcmF0ZVJzcCkgeworCQlXTUFfTE9HRSgiQ2FsbCB0eHJ4IGRldGFjaCB3L28gY2FsbGJhY2sgZm9yIHZkZXYgJWQiLCB2ZGV2X2lkKTsKKwkJb2xfdHhyeF92ZGV2X2RldGFjaChpZmFjZS0+aGFuZGxlLCBOVUxMLCBOVUxMKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWZhY2UtPmRlbF9zdGFzZWxmX3JlcSA9IHBkZWxfc3RhX3NlbGZfcmVxX3BhcmFtOworCW1zZyA9IHdtYV9maWxsX3ZkZXZfcmVxKHdtYV9oYW5kbGUsIHZkZXZfaWQsIFdNQV9ERUxfU1RBX1NFTEZfUkVRLAorCQkJCVdNQV9UQVJHRVRfUkVRX1RZUEVfVkRFVl9ERUwsIGlmYWNlLCAyMDAwKTsKKwlpZiAoIW1zZykgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBmaWxsIHZkZXYgcmVxdWVzdCBmb3IgdmRldl9pZCAlZCIsCisJCQkgX19mdW5jX18sIHZkZXZfaWQpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlXTUFfTE9HRSgiQ2FsbCB0eHJ4IGRldGFjaCB3aXRoIGNhbGxiYWNrIGZvciB2ZGV2ICVkIiwgdmRldl9pZCk7CisJb2xfdHhyeF92ZGV2X2RldGFjaChpZmFjZS0+aGFuZGxlLCBOVUxMLCBOVUxMKTsKKwl3bWFfdmRldl9kZXRhY2hfY2FsbGJhY2soaWZhY2UpOworCXJldHVybiBzdGF0dXM7CitvdXQ6CisJaWYgKGlmYWNlLT5hZGRCc3NTdGFDb250ZXh0KQorCQljZGZfbWVtX2ZyZWUoaWZhY2UtPmFkZEJzc1N0YUNvbnRleHQpOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwlpZiAoaWZhY2UtPnN0YUtleVBhcmFtcykKKwkJY2RmX21lbV9mcmVlKGlmYWNlLT5zdGFLZXlQYXJhbXMpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisJY2RmX21lbV96ZXJvKGlmYWNlLCBzaXplb2YoKmlmYWNlKSk7CisJcGRlbF9zdGFfc2VsZl9yZXFfcGFyYW0tPnN0YXR1cyA9IHN0YXR1czsKKwlpZiAoZ2VuZXJhdGVSc3ApIHsKKwkJc21lX21zZy50eXBlID0gZVdOSV9TTUVfREVMX1NUQV9TRUxGX1JTUDsKKwkJc21lX21zZy5ib2R5cHRyID0gcGRlbF9zdGFfc2VsZl9yZXFfcGFyYW07CisJCXNtZV9tc2cuYm9keXZhbCA9IDA7CisKKwkJc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1NNRSwgJnNtZV9tc2cpOworCQlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHBvc3QgZVdOSV9TTUVfQUREX1NUQV9TRUxGX1JTUCIpOworCQkJY2RmX21lbV9mcmVlKHBkZWxfc3RhX3NlbGZfcmVxX3BhcmFtKTsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHdtaV91bmlmaWVkX3BlZXJfZGVsZXRlX3NlbmQoKSAtIHNlbmQgUEVFUiBkZWxldGUgY29tbWFuZCB0byBmdworICogQHdtaTogd21pIGhhbmRsZQorICogQHBlZXJfYWRkcjogcGVlciBtYWMgYWRkcgorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50MzJfdCB3bWlfdW5pZmllZF9wZWVyX2RlbGV0ZV9zZW5kKHdtaV91bmlmaWVkX3Qgd21pLAorCQkJCQkgICAgdWludDhfdAorCQkJCQkgICAgcGVlcl9hZGRyW0lFRUU4MDIxMV9BRERSX0xFTl0sCisJCQkJCSAgICB1aW50OF90IHZkZXZfaWQpCit7CisJd21pX3BlZXJfZGVsZXRlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtaSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HUCgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY21kID0gKHdtaV9wZWVyX2RlbGV0ZV9jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfZGVsZXRlX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcGVlcl9kZWxldGVfY21kX2ZpeGVkX3BhcmFtKSk7CisJV01JX0NIQVJfQVJSQVlfVE9fTUFDX0FERFIocGVlcl9hZGRyLCAmY21kLT5wZWVyX21hY2FkZHIpOworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21pLCBidWYsIGxlbiwgV01JX1BFRVJfREVMRVRFX0NNRElEKSkgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byBzZW5kIHBlZXIgZGVsZXRlIGNvbW1hbmQiLCBfX2Z1bmNfXyk7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCVdNQV9MT0dEKCIlczogcGVlcl9hZGRyICVwTSB2ZGV2X2lkICVkIiwgX19mdW5jX18sIHBlZXJfYWRkciwgdmRldl9pZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX3ZkZXZfc3RhcnRfcnNwKCkgLSBzZW5kIHZkZXYgc3RhcnQgcmVzcG9uc2UgdG8gdXBwZXIgbGF5ZXIKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBhZGRfYnNzOiBhZGQgYnNzIHBhcmFtcworICogQHJlc3BfZXZlbnQ6IHJlc3BvbnNlIHBhcmFtcworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfdmRldl9zdGFydF9yc3AodHBfd21hX2hhbmRsZSB3bWEsCisJCQkgICAgICAgdHBBZGRCc3NQYXJhbXMgYWRkX2JzcywKKwkJCSAgICAgICB3bWlfdmRldl9zdGFydF9yZXNwb25zZV9ldmVudF9maXhlZF9wYXJhbSAqCisJCQkgICAgICAgcmVzcF9ldmVudCkKK3sKKwlzdHJ1Y3QgYmVhY29uX2luZm8gKmJjbjsKKworI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwlXTUFfTE9HRCgiJXM6IHZkZXYgc3RhcnQgcmVzcG9uc2UgcmVjZWl2ZWQgZm9yICVzIG1vZGUiLCBfX2Z1bmNfXywKKwkJIGFkZF9ic3MtPm9wZXJNb2RlID09CisJCSBCU1NfT1BFUkFUSU9OQUxfTU9ERV9JQlNTID8gIklCU1MiIDogIm5vbi1JQlNTIik7CisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworCisJaWYgKHJlc3BfZXZlbnQtPnN0YXR1cykgeworCQlhZGRfYnNzLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBzZW5kX2ZhaWxfcmVzcDsKKwl9CisKKwlpZiAoKGFkZF9ic3MtPm9wZXJNb2RlID09IEJTU19PUEVSQVRJT05BTF9NT0RFX0FQKQorI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwkgICAgfHwgKGFkZF9ic3MtPm9wZXJNb2RlID09IEJTU19PUEVSQVRJT05BTF9NT0RFX0lCU1MpCisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworCSAgICApIHsKKwkJd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLmJlYWNvbiA9CisJCQljZGZfbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IGJlYWNvbl9pbmZvKSk7CisKKwkJYmNuID0gd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLmJlYWNvbjsKKwkJaWYgKCFiY24pIHsKKwkJCVdNQV9MT0dFKCIlczogRmFpbGVkIGFsbG9jIG1lbW9yeSBmb3IgYmVhY29uIHN0cnVjdCIsCisJCQkJIF9fZnVuY19fKTsKKwkJCWFkZF9ic3MtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWdvdG8gc2VuZF9mYWlsX3Jlc3A7CisJCX0KKwkJY2RmX21lbV96ZXJvKGJjbiwgc2l6ZW9mKCpiY24pKTsKKwkJYmNuLT5idWYgPSBjZGZfbmJ1Zl9hbGxvYyhOVUxMLCBXTUFfQkNOX0JVRl9NQVhfU0laRSwgMCwKKwkJCQkJICBzaXplb2YodWludDMyX3QpLCAwKTsKKwkJaWYgKCFiY24tPmJ1ZikgeworCQkJV01BX0xPR0UoIiVzOiBObyBtZW1vcnkgYWxsb2NhdGVkIGZvciBiZWFjb24gYnVmZmVyIiwKKwkJCQkgX19mdW5jX18pOworCQkJY2RmX21lbV9mcmVlKGJjbik7CisJCQlhZGRfYnNzLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWdvdG8gc2VuZF9mYWlsX3Jlc3A7CisJCX0KKwkJYmNuLT5zZXFfbm8gPSBNSU5fU1dfU0VROworCQljZGZfc3BpbmxvY2tfaW5pdCgmYmNuLT5sb2NrKTsKKwkJY2RmX2F0b21pY19zZXQoJndtYS0+aW50ZXJmYWNlc1tyZXNwX2V2ZW50LT52ZGV2X2lkXS5ic3Nfc3RhdHVzLAorCQkJICAgICAgIFdNQV9CU1NfU1RBVFVTX1NUQVJURUQpOworCQlXTUFfTE9HRCgiJXM6IEFQIG1vZGUgKHR5cGUgJWQgc3VidHlwZSAlZCkgQlNTIGlzIHN0YXJ0ZWQiLAorCQkJIF9fZnVuY19fLCB3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF0udHlwZSwKKwkJCSB3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF0uc3ViX3R5cGUpOworCisJCVdNQV9MT0dEKCIlczogQWxsb2NhdGVkIGJlYWNvbiBzdHJ1Y3QgJXAsIHRlbXBsYXRlIG1lbW9yeSAlcCIsCisJCQkgX19mdW5jX18sIGJjbiwgYmNuLT5idWYpOworCX0KKwlhZGRfYnNzLT5zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJYWRkX2Jzcy0+YnNzSWR4ID0gcmVzcF9ldmVudC0+dmRldl9pZDsKKwlhZGRfYnNzLT5jaGFpbk1hc2sgPSByZXNwX2V2ZW50LT5jaGFpbl9tYXNrOworCWlmICgoMiAhPSByZXNwX2V2ZW50LT5jZmdkX3J4X3N0cmVhbXMpIHx8CisJCSgyICE9IHJlc3BfZXZlbnQtPmNmZ2RfdHhfc3RyZWFtcykpIHsKKwkJYWRkX2Jzcy0+bnNzID0gMTsKKwl9CisJYWRkX2Jzcy0+c21wc01vZGUgPSBob3N0X21hcF9zbXBzX21vZGUocmVzcF9ldmVudC0+c21wc19tb2RlKTsKKwlpZiAoV01BX0RFRkFVTFRfSFdfTU9ERV9JTkRFWCA9PSB3bWEtPm5ld19od19tb2RlX2luZGV4KSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBpbmRleCB0byB1cGRhdGUgZm9yIHZkZXZfaWQgJWQiLAorCQkJIF9fZnVuY19fLCByZXNwX2V2ZW50LT52ZGV2X2lkKTsKKwl9IGVsc2UgeworCQl3bWFfdXBkYXRlX2ludGZfaHdfbW9kZV9wYXJhbXMocmVzcF9ldmVudC0+dmRldl9pZCwKKwkJCQlyZXNwX2V2ZW50LT5tYWNfaWQsIHdtYS0+bmV3X2h3X21vZGVfaW5kZXgpOworCX0KK3NlbmRfZmFpbF9yZXNwOgorCVdNQV9MT0dEKCIlczogU2VuZGluZyBhZGQgYnNzIHJzcCB0byB1bWFjKHZkZXYgJWQgc3RhdHVzICVkKSIsCisJCSBfX2Z1bmNfXywgcmVzcF9ldmVudC0+dmRldl9pZCwgYWRkX2Jzcy0+c3RhdHVzKTsKKwl3bWFfc2VuZF9tc2cod21hLCBXTUFfQUREX0JTU19SU1AsICh2b2lkICopYWRkX2JzcywgMCk7Cit9CisKKyNpZmRlZiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UKKy8qKgorICogd21hX2ZpbmRfbWNjX2FwKCkgLSBmaW5kcyBpZiBkZXZpY2UgaXMgb3BlcmF0aW5nIEFQIGluIE1DQyBtb2RlIG9yIG5vdAorICogQHdtYTogd21hIGhhbmRsZS4KKyAqIEB2ZGV2X2lkOiB2ZGV2IElEIG9mIGRldmljZSBmb3Igd2hpY2ggTUNDIGhhcyB0byBiZSBjaGVja2VkCisgKiBAYWRkOiBmbGFnIGluZGljYXRpbmcgaWYgY3VycmVudCBkZXZpY2UgaXMgYWRkZWQgb3IgZGVsZXRlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRocm91Z2ggYWxsIHRoZSBpbnRlcmZhY2VzIGluIHdtYSBhbmQgZmluZHMgaWYKKyAqIGFueSBvZiB0aG9zZSBkZXZjZXMgYXJlIGluIE1DQyBtb2RlIHdpdGggQVAuIElmIHN1Y2ggYSB2ZGV2IGlzIGZvdW5kCisgKiBpbnZvbHZlZCBBUCB2ZGV2cyBhcmUgc2VudCBXREFfVVBEQVRFX1EyUV9JRV9JTkQgbXNnIHRvIHVwZGF0ZSB0aGVpcgorICogYmVhY29uIHRlbXBsYXRlIHRvIGluY2x1ZGUgUTJRIElFLgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9maW5kX21jY19hcCh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkLCBib29sIGFkZCkKK3sKKwl1aW50OF90IGk7CisJdWludDE2X3QgcHJldl9jaF9mcmVxID0gMDsKKwlib29sIGlzX2FwID0gZmFsc2U7CisJYm9vbCByZXN1bHQgPSBmYWxzZTsKKwl1aW50OF90ICphcF92ZGV2X2lkcyA9IE5VTEw7CisJdWludDhfdCBudW1fY2ggPSAwOworCisJYXBfdmRldl9pZHMgPSBjZGZfbWVtX21hbGxvYyh3bWEtPm1heF9ic3NpZCk7CisJaWYgKCFhcF92ZGV2X2lkcykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHdtYS0+bWF4X2Jzc2lkOyBpKyspIHsKKwkJYXBfdmRldl9pZHNbaV0gPSAtMTsKKwkJaWYgKGFkZCA9PSBmYWxzZSAmJiBpID09IHZkZXZfaWQpCisJCQljb250aW51ZTsKKworCQlpZiAod21hLT5pbnRlcmZhY2VzW2ldLnZkZXZfdXAgfHwgKGkgPT0gdmRldl9pZCAmJiBhZGQpKSB7CisJCQlpZiAod21hLT5pbnRlcmZhY2VzW2ldLnR5cGUgPT0gV01JX1ZERVZfVFlQRV9BUCkgeworCQkJCWlzX2FwID0gdHJ1ZTsKKwkJCQlhcF92ZGV2X2lkc1tpXSA9IGk7CisJCQl9CisKKwkJCWlmICh3bWEtPmludGVyZmFjZXNbaV0ubWh6ICE9IHByZXZfY2hfZnJlcSkgeworCQkJCW51bV9jaCsrOworCQkJCXByZXZfY2hfZnJlcSA9IHdtYS0+aW50ZXJmYWNlc1tpXS5taHo7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaXNfYXAgJiYgKG51bV9jaCA+IDEpKQorCQlyZXN1bHQgPSB0cnVlOworCWVsc2UKKwkJcmVzdWx0ID0gZmFsc2U7CisKKwl3bWFfc2VuZF9tc2cod21hLCBXTUFfVVBEQVRFX1EyUV9JRV9JTkQsICh2b2lkICopYXBfdmRldl9pZHMsIHJlc3VsdCk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFICovCisKKy8qKgorICogd21hX3ZkZXZfc3RhcnRfcmVzcF9oYW5kbGVyKCkgLSB2ZGV2IHN0YXJ0IHJlc3BvbnNlIGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZXZlbnQgYnVmZmVyCisgKiBAbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV92ZGV2X3N0YXJ0X3Jlc3BfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCXVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX1ZERVZfU1RBUlRfUkVTUF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfdmRldl9zdGFydF9yZXNwb25zZV9ldmVudF9maXhlZF9wYXJhbSAqcmVzcF9ldmVudDsKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKnJlcV9tc2c7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlOworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisJaWYgKE5VTEwgPT0gbWFjX2N0eCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgbWFjX2N0eCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCisJV01BX0xPR0QoIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKwlwYXJhbV9idWYgPSAoV01JX1ZERVZfU1RBUlRfUkVTUF9FVkVOVElEX3BhcmFtX3RsdnMgKikgY21kX3BhcmFtX2luZm87CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgc3RhcnQgcmVzcG9uc2UgZXZlbnQgYnVmZmVyIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlc3BfZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCWlmICghcmVzcF9ldmVudCkgeworCQlXTUFfTE9HRSgiSW52YWxpZCBzdGFydCByZXNwb25zZSBldmVudCBidWZmZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlc3BfZXZlbnQtPnN0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLnR4X3N0cmVhbXMgPQorCQkJcmVzcF9ldmVudC0+Y2ZnZF90eF9zdHJlYW1zOworCQl3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF0ucnhfc3RyZWFtcyA9CisJCQlyZXNwX2V2ZW50LT5jZmdkX3J4X3N0cmVhbXM7CisJCXdtYS0+aW50ZXJmYWNlc1tyZXNwX2V2ZW50LT52ZGV2X2lkXS5jaGFpbl9tYXNrID0KKwkJCXJlc3BfZXZlbnQtPmNoYWluX21hc2s7CisJCXdtYS0+aW50ZXJmYWNlc1tyZXNwX2V2ZW50LT52ZGV2X2lkXS5tYWNfaWQgPQorCQkJcmVzcF9ldmVudC0+bWFjX2lkOworCQlXTUFfTE9HSSgiJXM6IHZkZXY6JWQgdHggc3M9JWQgcnggc3M9JWQgY2hhaW4gbWFzaz0lZCBtYWM9JWQiLAorCQkJCV9fZnVuY19fLAorCQkJCXJlc3BfZXZlbnQtPnZkZXZfaWQsCisJCQkJd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLnR4X3N0cmVhbXMsCisJCQkJd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLnJ4X3N0cmVhbXMsCisJCQkJd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLmNoYWluX21hc2ssCisJCQkJd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLm1hY19pZCk7CisJfQorCisJaWYgKChyZXNwX2V2ZW50LT52ZGV2X2lkIDw9IHdtYS0+bWF4X2Jzc2lkKSAmJgorCSAgICAoY2RmX2F0b21pY19yZWFkCisJCSgmd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuaGlkZGVuX3NzaWRfcmVzdGFydF9pbl9wcm9ncmVzcykpCisJICAgICYmICh3bWFfaXNfdmRldl9pbl9hcF9tb2RlKHdtYSwgcmVzcF9ldmVudC0+dmRldl9pZCkgPT0gdHJ1ZSkpIHsKKwkJV01BX0xPR0UoIiVzOiB2ZGV2IHJlc3RhcnQgZXZlbnQgcmVjZXZpZWQgZm9yIGhpZGRlbiBzc2lkIHNldCB1c2luZyBJT0NUTCIsCisJCQlfX2Z1bmNfXyk7CisKKwkJaWYgKHdtaV91bmlmaWVkX3ZkZXZfdXBfc2VuZAorCQkJICAgICh3bWEtPndtaV9oYW5kbGUsIHJlc3BfZXZlbnQtPnZkZXZfaWQsIDAsCisJCQkgICAgd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLmJzc2lkKSA8IDApIHsKKwkJCVdNQV9MT0dFKCIlcyA6IGZhaWxlZCB0byBzZW5kIHZkZXYgdXAiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCQljZGZfYXRvbWljX3NldCgmd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLgorCQkJICAgICAgIHZkZXZfcmVzdGFydF9wYXJhbXMuCisJCQkgICAgICAgaGlkZGVuX3NzaWRfcmVzdGFydF9pbl9wcm9ncmVzcywgMCk7CisJCXdtYS0+aW50ZXJmYWNlc1tyZXNwX2V2ZW50LT52ZGV2X2lkXS52ZGV2X3VwID0gdHJ1ZTsKKwl9CisKKwlyZXFfbXNnID0gd21hX2ZpbmRfdmRldl9yZXEod21hLCByZXNwX2V2ZW50LT52ZGV2X2lkLAorCQkJCSAgICBXTUFfVEFSR0VUX1JFUV9UWVBFX1ZERVZfU1RBUlQpOworCisJaWYgKCFyZXFfbXNnKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGxvb2t1cCByZXF1ZXN0IG1lc3NhZ2UgZm9yIHZkZXYgJWQiLAorCQkJIF9fZnVuY19fLCByZXNwX2V2ZW50LT52ZGV2X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2RmX21jX3RpbWVyX3N0b3AoJnJlcV9tc2ctPmV2ZW50X3RpbWVvdXQpOworCisjaWZkZWYgRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFCisJaWYgKHJlc3BfZXZlbnQtPnN0YXR1cyA9PSBDREZfU1RBVFVTX1NVQ0NFU1MKKwkJJiYgbWFjX2N0eC0+c2FwLnNhcF9jaGFubmVsX2F2b2lkYW5jZSkKKwkJd21hX2ZpbmRfbWNjX2FwKHdtYSwgcmVzcF9ldmVudC0+dmRldl9pZCwgdHJ1ZSk7CisjZW5kaWYgLyogRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFICovCisKKwlpZmFjZSA9ICZ3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF07CisJaWYgKHJlcV9tc2ctPm1zZ190eXBlID09IFdNQV9DSE5MX1NXSVRDSF9SRVEpIHsKKwkJdHBTd2l0Y2hDaGFubmVsUGFyYW1zIHBhcmFtcyA9CisJCQkodHBTd2l0Y2hDaGFubmVsUGFyYW1zKSByZXFfbXNnLT51c2VyX2RhdGE7CisJCWlmICghcGFyYW1zKSB7CisJCQlXTUFfTE9HRSgiJXM6IGNoYW5uZWwgc3dpdGNoIHBhcmFtcyBpcyBOVUxMIGZvciB2ZGV2ICVkIiwKKwkJCQlfX2Z1bmNfXywgcmVzcF9ldmVudC0+dmRldl9pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCVdNQV9MT0dEKCIlczogU2VuZCBjaGFubmVsIHN3aXRjaCByZXNwIHZkZXYgJWQgc3RhdHVzICVkIiwKKwkJCSBfX2Z1bmNfXywgcmVzcF9ldmVudC0+dmRldl9pZCwgcmVzcF9ldmVudC0+c3RhdHVzKTsKKwkJcGFyYW1zLT5jaGFpbk1hc2sgPSByZXNwX2V2ZW50LT5jaGFpbl9tYXNrOworCQlpZiAoKDIgIT0gcmVzcF9ldmVudC0+Y2ZnZF9yeF9zdHJlYW1zKSB8fAorCQkJKDIgIT0gcmVzcF9ldmVudC0+Y2ZnZF90eF9zdHJlYW1zKSkgeworCQkJcGFyYW1zLT5uc3MgPSAxOworCQl9CisJCXBhcmFtcy0+c21wc01vZGUgPSBob3N0X21hcF9zbXBzX21vZGUocmVzcF9ldmVudC0+c21wc19tb2RlKTsKKwkJcGFyYW1zLT5zdGF0dXMgPSByZXNwX2V2ZW50LT5zdGF0dXM7CisJCWlmIChyZXNwX2V2ZW50LT5yZXNwX3R5cGUgPT0gV01JX1ZERVZfUkVTVEFSVF9SRVNQX0VWRU5UICYmCisJCSAgICAoaWZhY2UtPnR5cGUgPT0gV01JX1ZERVZfVFlQRV9TVEEpKSB7CisJCQlpZiAod21pX3VuaWZpZWRfdmRldl91cF9zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgICAgcmVzcF9ldmVudC0+dmRldl9pZCwKKwkJCQkJCSAgICAgaWZhY2UtPmFpZCwKKwkJCQkJCSAgICAgaWZhY2UtPmJzc2lkKSkgeworCQkJCVdNQV9MT0dFKCIlczp2ZGV2X3VwIGZhaWxlZCB2ZGV2X2lkICVkIiwKKwkJCQkJIF9fZnVuY19fLCByZXNwX2V2ZW50LT52ZGV2X2lkKTsKKwkJCQl3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF0udmRldl91cCA9CisJCQkJCWZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQl3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF0udmRldl91cCA9CisJCQkJCXRydWU7CisJCQl9CisJCX0KKworCQl3bWFfc2VuZF9tc2cod21hLCBXTUFfU1dJVENIX0NIQU5ORUxfUlNQLCAodm9pZCAqKXBhcmFtcywgMCk7CisJfSBlbHNlIGlmIChyZXFfbXNnLT5tc2dfdHlwZSA9PSBXTUFfQUREX0JTU19SRVEpIHsKKwkJdHBBZGRCc3NQYXJhbXMgYnNzUGFyYW1zID0gKHRwQWRkQnNzUGFyYW1zKSByZXFfbXNnLT51c2VyX2RhdGE7CisJCWNkZl9tZW1fY29weShpZmFjZS0+YnNzaWQsIGJzc1BhcmFtcy0+YnNzSWQsCisJCQkJSUVFRTgwMjExX0FERFJfTEVOKTsKKwkJd21hX3ZkZXZfc3RhcnRfcnNwKHdtYSwgYnNzUGFyYW1zLCByZXNwX2V2ZW50KTsKKwl9IGVsc2UgaWYgKHJlcV9tc2ctPm1zZ190eXBlID09IFdNQV9PQ0JfU0VUX0NPTkZJR19DTUQpIHsKKwkJaWYgKHdtaV91bmlmaWVkX3ZkZXZfdXBfc2VuZCh3bWEtPndtaV9oYW5kbGUsCisJCQkJCSAgICAgcmVzcF9ldmVudC0+dmRldl9pZCwgaWZhY2UtPmFpZCwKKwkJCQkJICAgICBpZmFjZS0+YnNzaWQpIDwgMCkgeworCQkJV01BX0xPR0UoRkwoImZhaWxlZCB0byBzZW5kIHZkZXYgdXAiKSk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCQlpZmFjZS0+dmRldl91cCA9IHRydWU7CisKKwkJd21hX29jYl9zdGFydF9yZXNwX2luZF9jb250KHdtYSk7CisJfQorCisJaWYgKCh3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF0udHlwZSA9PSBXTUlfVkRFVl9UWVBFX0FQKSAmJgorCQl3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF0udmRldl91cCkKKwkJd21hX3NldF9zYXBfa2VlcGFsaXZlKHdtYSwgcmVzcF9ldmVudC0+dmRldl9pZCk7CisKKwljZGZfbWNfdGltZXJfZGVzdHJveSgmcmVxX21zZy0+ZXZlbnRfdGltZW91dCk7CisJY2RmX21lbV9mcmVlKHJlcV9tc2cpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCgpIC0gc2V0IHBlciB2ZGV2IHBhcmFtcyBpbiBmdworICogQHdtaV9oYW5kbGU6IHdtaSBoYW5kbGUKKyAqIEBpZl9pZjogdmRldiBpZAorICogQHBhcmFtX2lkOiBwYXJhbWV0ZXIgaWQKKyAqIEBwYXJhbV92YWx1ZTogcGFyYW1ldGVyIHZhbHVlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50Cit3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwgdWludDMyX3QgaWZfaWQsCisJCQkJdWludDMyX3QgcGFyYW1faWQsIHVpbnQzMl90IHBhcmFtX3ZhbHVlKQoreworCWludCByZXQ7CisJd21pX3ZkZXZfc2V0X3BhcmFtX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJdWludDE2X3QgbGVuID0gc2l6ZW9mKCpjbWQpOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczp3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNtZCA9ICh3bWlfdmRldl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3ZkZXZfc2V0X3BhcmFtX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IGlmX2lkOworCWNtZC0+cGFyYW1faWQgPSBwYXJhbV9pZDsKKwljbWQtPnBhcmFtX3ZhbHVlID0gcGFyYW1fdmFsdWU7CisJV01BX0xPR0QoIlNldHRpbmcgdmRldiAlZCBwYXJhbSA9ICV4LCB2YWx1ZSA9ICV1IiwKKwkJIGlmX2lkLCBwYXJhbV9pZCwgcGFyYW1fdmFsdWUpOworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9WREVWX1NFVF9QQVJBTV9DTURJRCk7CisJaWYgKHJldCA8IDApIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIHNldCBwYXJhbSBjb21tYW5kIHJldCA9ICVkIiwgcmV0KTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd21pX3VuaWZpZWRfcGVlcl9mbHVzaF90aWRzX3NlbmQoKSAtIGZsdXNoIHBlZXIgdGlkcyBwYWNrZXRzIGluIGZ3CisgKiBAd21pOiB3bWkgaGFuZGxlCisgKiBAcGVlcl9hZGRyOiBwZWVyIG1hYyBhZGRyZXNzCisgKiBAcGVlcl90aWRfYml0bWFwOiBwZWVyIHRpZCBiaXRtYXAKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQzMl90IHdtaV91bmlmaWVkX3BlZXJfZmx1c2hfdGlkc19zZW5kKHdtaV91bmlmaWVkX3Qgd21pLAorCQkJCQkgdWludDhfdCBwZWVyX2FkZHJbSUVFRTgwMjExX0FERFJfTEVOXSwKKwkJCQkJIHVpbnQzMl90IHBlZXJfdGlkX2JpdG1hcCwKKwkJCQkJIHVpbnQ4X3QgdmRldl9pZCkKK3sKKwl3bWlfcGVlcl9mbHVzaF90aWRzX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtaSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HUCgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY21kID0gKHdtaV9wZWVyX2ZsdXNoX3RpZHNfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2ZsdXNoX3RpZHNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9wZWVyX2ZsdXNoX3RpZHNfY21kX2ZpeGVkX3BhcmFtKSk7CisJV01JX0NIQVJfQVJSQVlfVE9fTUFDX0FERFIocGVlcl9hZGRyLCAmY21kLT5wZWVyX21hY2FkZHIpOworCWNtZC0+cGVlcl90aWRfYml0bWFwID0gcGVlcl90aWRfYml0bWFwOworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21pLCBidWYsIGxlbiwgV01JX1BFRVJfRkxVU0hfVElEU19DTURJRCkpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gc2VuZCBmbHVzaCB0aWQgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZShidWYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJV01BX0xPR0QoIiVzOiBwZWVyX2FkZHIgJXBNIHZkZXZfaWQgJWQiLCBfX2Z1bmNfXywgcGVlcl9hZGRyLCB2ZGV2X2lkKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfc2V0X3BlZXJfYXV0aG9yaXplZF9jYigpIC0gc2V0IHBlZXIgYXV0aG9yaXplZCBjYWxsYmFjayBmdW5jdGlvbgorICogQHdtYV9DdHg6IHdtYSBoYW5kbGUKKyAqIEBhdXRoX2NiOiBwZWVyIGF1dGhvcml6ZWQgY2FsbGJhY2sKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfc2V0X3BlZXJfYXV0aG9yaXplZF9jYih2b2lkICp3bWFfY3R4LCB3bWFfcGVlcl9hdXRob3JpemVkX2ZwIGF1dGhfY2IpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIHdtYV9jdHg7CisJd21hX2hhbmRsZS0+cGVlcl9hdXRob3JpemVkX2NiID0gYXV0aF9jYjsKK30KKworLyoqCisgKiB3bWFfc2V0X3BlZXJfcGFyYW0oKSAtIHNldCBwZWVyIHBhcmFtZXRlciBpbiBmdworICogQHdtYV9jdHg6IHdtYSBoYW5kbGUKKyAqIEBwZWVyX2FkZHI6IHBlZXIgbWFjIGFkZHJlc3MKKyAqIEBwYXJhbV9pZDogcGFyYW1ldGVyIGlkCisgKiBAcGFyYW1fdmFsdWU6IHBhcmFtZXRlciB2YWx1ZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX3NldF9wZWVyX3BhcmFtKHZvaWQgKndtYV9jdHgsIHVpbnQ4X3QgKnBlZXJfYWRkciwgdWludDMyX3QgcGFyYW1faWQsCisJCSAgICAgICB1aW50MzJfdCBwYXJhbV92YWx1ZSwgdWludDMyX3QgdmRldl9pZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUgPSAodHBfd21hX2hhbmRsZSkgd21hX2N0eDsKKwl3bWlfcGVlcl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQgZXJyOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBzaXplb2YoKmNtZCkpOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIHRvIHNlbmQgc2V0X3BhcmFtIGNtZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY21kID0gKHdtaV9wZWVyX3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfc2V0X3BhcmFtX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJCSh3bWlfcGVlcl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gdmRldl9pZDsKKwlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUihwZWVyX2FkZHIsICZjbWQtPnBlZXJfbWFjYWRkcik7CisJY21kLT5wYXJhbV9pZCA9IHBhcmFtX2lkOworCWNtZC0+cGFyYW1fdmFsdWUgPSBwYXJhbV92YWx1ZTsKKwllcnIgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCQkJICAgc2l6ZW9mKHdtaV9wZWVyX3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0pLAorCQkJCSAgIFdNSV9QRUVSX1NFVF9QQVJBTV9DTURJRCk7CisJaWYgKGVycikgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgc2V0X3BhcmFtIGNtZCIpOworCQljZGZfbWVtX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9yZW1vdmVfcGVlcigpIC0gc2VuZCByZW1vdmUgcGVlciBjb21tYW5kIHRvIGZ3CisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAYnNzaWQ6IG1hYyBhZGRyZXNzCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHBlZXI6IHBlZXIgcHRyCisgKiBAcm9hbV9zeW5jaF9pbl9wcm9ncmVzczogcm9hbSBpbiBwcm9ncmVzcyBmbGFnCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3JlbW92ZV9wZWVyKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90ICpic3NpZCwKKwkJCSAgICB1aW50OF90IHZkZXZfaWQsIG9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlciwKKwkJCSAgICBib29sIHJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MpCit7CisjZGVmaW5lIFBFRVJfQUxMX1RJRF9CSVRNQVNLIDB4ZmZmZmZmZmYKKwl1aW50MzJfdCBwZWVyX3RpZF9iaXRtYXAgPSBQRUVSX0FMTF9USURfQklUTUFTSzsKKwl1aW50OF90ICpwZWVyX2FkZHIgPSBic3NpZDsKKwlpZiAoIXdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5wZWVyX2NvdW50KSB7CisJCVdNQV9MT0dFKCIlczogQ2FuJ3QgcmVtb3ZlIHBlZXIgd2l0aCBwZWVyX2FkZHIgJXBNIHZkZXZpZCAlZCBwZWVyX2NvdW50ICVkIiwKKwkJCV9fZnVuY19fLCBic3NpZCwgdmRldl9pZCwKKwkJCXdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5wZWVyX2NvdW50KTsKKwkJcmV0dXJuOworCX0KKwlpZiAocGVlcikKKwkJb2xfdHhyeF9wZWVyX2RldGFjaChwZWVyKTsKKworCXdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5wZWVyX2NvdW50LS07CisJV01BX0xPR0UoIiVzOiBSZW1vdmVkIHBlZXIgd2l0aCBwZWVyX2FkZHIgJXBNIHZkZXZpZCAlZCBwZWVyX2NvdW50ICVkIiwKKwkJIF9fZnVuY19fLCBic3NpZCwgdmRldl9pZCwgd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnBlZXJfY291bnQpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlpZiAocm9hbV9zeW5jaF9pbl9wcm9ncmVzcykKKwkJcmV0dXJuOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQgKi8KKwkvKiBGbHVzaCBhbGwgVElEcyBleGNlcHQgTUdNVCBUSUQgZm9yIHRoaXMgcGVlciBpbiBUYXJnZXQgKi8KKwlwZWVyX3RpZF9iaXRtYXAgJj0gfigweDEgPDwgV01JX01HTVRfVElEKTsKKwl3bWlfdW5pZmllZF9wZWVyX2ZsdXNoX3RpZHNfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJzc2lkLAorCQkJCQkgcGVlcl90aWRfYml0bWFwLCB2ZGV2X2lkKTsKKworI2lmIGRlZmluZWQoUUNBX0lCU1NfU1VQUE9SVCkKKwlpZiAoKHBlZXIpICYmICh3bWFfaXNfdmRldl9pbl9pYnNzX21vZGUod21hLCB2ZGV2X2lkKSkpIHsKKwkJV01BX0xPR0QoIiVzOiBic3NpZCAlcE0gcGVlci0+bWFjX2FkZHIgJXBNIiwgX19mdW5jX18sCisJCQkgYnNzaWQsIHBlZXItPm1hY19hZGRyLnJhdyk7CisJCXBlZXJfYWRkciA9IHBlZXItPm1hY19hZGRyLnJhdzsKKwl9CisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworCisJd21pX3VuaWZpZWRfcGVlcl9kZWxldGVfc2VuZCh3bWEtPndtaV9oYW5kbGUsIHBlZXJfYWRkciwgdmRldl9pZCk7CisjdW5kZWYgUEVFUl9BTExfVElEX0JJVE1BU0sKK30KKworLyoqCisgKiB3bWlfdW5pZmllZF9wZWVyX2NyZWF0ZV9zZW5kKCkgLSBzZW5kIHBlZXIgY3JlYXRlIGNvbW1hbmQgdG8gZncKKyAqIEB3bWk6IHdtaSBoYW5kbGUKKyAqIEBwZWVyX2FkZHI6IHBlZXIgbWFjIGFkZHJlc3MKKyAqIEBwZWVyX3R5cGU6IHBlZXIgdHlwZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHdtaV91bmlmaWVkX3BlZXJfY3JlYXRlX3NlbmQod21pX3VuaWZpZWRfdCB3bWksCisJCQkJCWNvbnN0IHVpbnQ4X3QgKnBlZXJfYWRkciwKKwkJCQkJdWludDMyX3QgcGVlcl90eXBlLCB1aW50MzJfdCB2ZGV2X2lkKQoreworCXdtaV9wZWVyX2NyZWF0ZV9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCWludDMyX3QgbGVuID0gc2l6ZW9mKCpjbWQpOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWksIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR1AoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNtZCA9ICh3bWlfcGVlcl9jcmVhdGVfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2NyZWF0ZV9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3BlZXJfY3JlYXRlX2NtZF9maXhlZF9wYXJhbSkpOworCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKHBlZXJfYWRkciwgJmNtZC0+cGVlcl9tYWNhZGRyKTsKKwljbWQtPnBlZXJfdHlwZSA9IHBlZXJfdHlwZTsKKwljbWQtPnZkZXZfaWQgPSB2ZGV2X2lkOworCisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtaSwgYnVmLCBsZW4sIFdNSV9QRUVSX0NSRUFURV9DTURJRCkpIHsKKwkJV01BX0xPR1AoIiVzOiBmYWlsZWQgdG8gc2VuZCBXTUlfUEVFUl9DUkVBVEVfQ01ESUQiLCBfX2Z1bmNfXyk7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCVdNQV9MT0dEKCIlczogcGVlcl9hZGRyICVwTSB2ZGV2X2lkICVkIiwgX19mdW5jX18sIHBlZXJfYWRkciwgdmRldl9pZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX2NyZWF0ZV9wZWVyKCkgLSBzZW5kIHBlZXIgY3JlYXRlIGNvbW1hbmQgdG8gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwZGV2OiB0eHJ4IHBkZXYgcHRyCisgKiBAdmRldjogdHhyeCB2ZGV2IHB0cgorICogQHBlZXJfYWRkcjogcGVlciBtYWMgYWRkcgorICogQHBlZXJfdHlwZTogcGVlciB0eXBlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHJvYW1fc3luY2hfaW5fcHJvZ3Jlc3M6IHJvYW0gaW4gcHJvZ3Jlc3MKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfY3JlYXRlX3BlZXIodHBfd21hX2hhbmRsZSB3bWEsIG9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCSAgb2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2LAorCQkJICB1OCBwZWVyX2FkZHJbSUVFRTgwMjExX0FERFJfTEVOXSwKKwkJCSAgdWludDMyX3QgcGVlcl90eXBlLCB1aW50OF90IHZkZXZfaWQsCisJCQkgIGJvb2wgcm9hbV9zeW5jaF9pbl9wcm9ncmVzcykKK3sKKwlvbF90eHJ4X3BlZXJfaGFuZGxlIHBlZXI7CisKKwlpZiAoKyt3bWEtPmludGVyZmFjZXNbdmRldl9pZF0ucGVlcl9jb3VudCA+CisJICAgIHdtYS0+d2xhbl9yZXNvdXJjZV9jb25maWcubnVtX3BlZXJzKSB7CisJCVdNQV9MT0dQKCIlcywgdGhlIHBlZXIgY291bnQgZXhjZWVkcyB0aGUgbGltaXQgJWQiLCBfX2Z1bmNfXywKKwkJCSB3bWEtPmludGVyZmFjZXNbdmRldl9pZF0ucGVlcl9jb3VudCAtIDEpOworCQlnb3RvIGVycjsKKwl9CisJcGVlciA9IG9sX3R4cnhfcGVlcl9hdHRhY2gocGRldiwgdmRldiwgcGVlcl9hZGRyKTsKKwlpZiAoIXBlZXIpIHsKKwkJV01BX0xPR0UoIiVzIDogVW5hYmxlIHRvIGF0dGFjaCBwZWVyICVwTSIsIF9fZnVuY19fLCBwZWVyX2FkZHIpOworCQlnb3RvIGVycjsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmIChyb2FtX3N5bmNoX2luX3Byb2dyZXNzKSB7CisKKwkJV01BX0xPR0UoIiVzOiBDcmVhdGVkIHBlZXIgd2l0aCBwZWVyX2FkZHIgJXBNIHZkZXZfaWQgJWQsIgorCQkJICJwZWVyX2NvdW50IC0gJWQiLCBfX2Z1bmNfXywgcGVlcl9hZGRyLCB2ZGV2X2lkLAorCQkJIHdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5wZWVyX2NvdW50KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRCAqLworCWlmICh3bWlfdW5pZmllZF9wZWVyX2NyZWF0ZV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgcGVlcl9hZGRyLAorCQkJCQkgcGVlcl90eXBlLCB2ZGV2X2lkKSA8IDApIHsKKwkJV01BX0xPR1AoIiVzIDogVW5hYmxlIHRvIGNyZWF0ZSBwZWVyIGluIFRhcmdldCIsIF9fZnVuY19fKTsKKwkJb2xfdHhyeF9wZWVyX2RldGFjaChwZWVyKTsKKwkJZ290byBlcnI7CisJfQorCVdNQV9MT0dFKCIlczogQ3JlYXRlZCBwZWVyIHdpdGggcGVlcl9hZGRyICVwTSB2ZGV2X2lkICVkLCBwZWVyX2NvdW50IC0gJWQiLAorCQlfX2Z1bmNfXywgcGVlcl9hZGRyLCB2ZGV2X2lkLCB3bWEtPmludGVyZmFjZXNbdmRldl9pZF0ucGVlcl9jb3VudCk7CisKKyNpZmRlZiBRQ0FfSUJTU19TVVBQT1JUCisJLyogZm9yIGVhY2ggcmVtb3RlIGlic3MgcGVlciwgY2xlYXIgaXRzIGtleXMgKi8KKwlpZiAod21hX2lzX3ZkZXZfaW5faWJzc19tb2RlKHdtYSwgdmRldl9pZCkgJiYKKwkgICAgIWNkZl9tZW1fY29tcGFyZShwZWVyX2FkZHIsIHZkZXYtPm1hY19hZGRyLnJhdywKKwkJCQlJRUVFODAyMTFfQUREUl9MRU4pKSB7CisKKwkJdFNldFN0YUtleVBhcmFtcyBrZXlfaW5mbzsKKwkJV01BX0xPR0QoIiVzOiByZW1vdGUgaWJzcyBwZWVyICVwTSBrZXkgY2xlYXJpbmdcbiIsIF9fZnVuY19fLAorCQkJIHBlZXJfYWRkcik7CisJCWNkZl9tZW1fc2V0KCZrZXlfaW5mbywgc2l6ZW9mKGtleV9pbmZvKSwgMCk7CisJCWtleV9pbmZvLnNtZXNlc3Npb25JZCA9IHZkZXZfaWQ7CisJCWNkZl9tZW1fY29weShrZXlfaW5mby5wZWVyTWFjQWRkciwgcGVlcl9hZGRyLAorCQkJCUlFRUU4MDIxMV9BRERSX0xFTik7CisJCWtleV9pbmZvLnNlbmRSc3AgPSBmYWxzZTsKKworCQl3bWFfc2V0X3N0YWtleSh3bWEsICZrZXlfaW5mbyk7CisJfQorI2VuZGlmIC8qIFFDQV9JQlNTX1NVUFBPUlQgKi8KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CitlcnI6CisJd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnBlZXJfY291bnQtLTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKy8qKgorICogd21pX3VuaWZpZWRfdmRldl9kb3duX3NlbmQoKSAtIHNlbmQgdmRldiBkb3duIGNvbW1hbmQgdG8gZncKKyAqIEB3bWk6IHdtaSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCB3bWlfdW5pZmllZF92ZGV2X2Rvd25fc2VuZCh3bWlfdW5pZmllZF90IHdtaSwgdWludDhfdCB2ZGV2X2lkKQoreworCXdtaV92ZGV2X2Rvd25fY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQzMl90IGxlbiA9IHNpemVvZigqY21kKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21pLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dQKCIlcyA6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY21kID0gKHdtaV92ZGV2X2Rvd25fY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X2Rvd25fY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV92ZGV2X2Rvd25fY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gdmRldl9pZDsKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21pLCBidWYsIGxlbiwgV01JX1ZERVZfRE9XTl9DTURJRCkpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gc2VuZCB2ZGV2IGRvd24iLCBfX2Z1bmNfXyk7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCVdNQV9MT0dFKCIlczogdmRldl9pZCAlZCIsIF9fZnVuY19fLCB2ZGV2X2lkKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKworLyoqCisgKiB3bWFfZGVsZXRlX2FsbF9pYnNzX3BlZXJzKCkgLSBkZWxldGUgYWxsIGlic3MgcGVlciBmb3IgdmRldl9pZAorICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmQgcGVlciBkZWxldGUgY29tbWFuZCB0byBmdyBmb3IgYWxsCisgKiBwZWVycyBpbiBwZWVyX2xpc3QgIGFuZCByZW1vdmUgcmVmIGNvdW50IGZvciBwZWVyIGlkCisgKiBwZWVyIHdpbGwgYWN0dWFsbHkgcmVtb3ZlIGZyb20gbGlzdCBhZnRlciByZWNldmluZworICogdW5tYXAgZXZlbnQgZnJvbSBmaXJtd2FyZS4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX2RlbGV0ZV9hbGxfaWJzc19wZWVycyh0cF93bWFfaGFuZGxlIHdtYSwgQV9VSU5UMzIgdmRldl9pZCkKK3sKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXY7CisJb2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyLCB0ZW1wOworCisJaWYgKCF3bWEgfHwgdmRldl9pZCA+IHdtYS0+bWF4X2Jzc2lkKQorCQlyZXR1cm47CisKKwl2ZGV2ID0gd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmhhbmRsZTsKKwlpZiAoIXZkZXYpCisJCXJldHVybjsKKworCS8qIHJlbW92ZSBhbGwgcmVtb3RlIHBlZXJzIG9mIElCU1MgKi8KKwljZGZfc3Bpbl9sb2NrX2JoKCZ2ZGV2LT5wZGV2LT5wZWVyX3JlZl9tdXRleCk7CisKKwl0ZW1wID0gTlVMTDsKKwlUQUlMUV9GT1JFQUNIX1JFVkVSU0UocGVlciwgJnZkZXYtPnBlZXJfbGlzdCwgcGVlcl9saXN0X3QsIHBlZXJfbGlzdF9lbGVtKSB7CisJCWlmICh0ZW1wKSB7CisJCQljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPnBkZXYtPnBlZXJfcmVmX211dGV4KTsKKwkJCWlmIChjZGZfYXRvbWljX3JlYWQoJnRlbXAtPmRlbGV0ZV9pbl9wcm9ncmVzcykgPT0gMCkgeworCQkJCXdtYV9yZW1vdmVfcGVlcih3bWEsIHRlbXAtPm1hY19hZGRyLnJhdywKKwkJCQkJdmRldl9pZCwgdGVtcCwgZmFsc2UpOworCQkJfQorCQkJY2RmX3NwaW5fbG9ja19iaCgmdmRldi0+cGRldi0+cGVlcl9yZWZfbXV0ZXgpOworCQl9CisJCS8qIHNlbGYgcGVlciBpcyBkZWxldGVkIGxhc3QgKi8KKwkJaWYgKHBlZXIgPT0gVEFJTFFfRklSU1QoJnZkZXYtPnBlZXJfbGlzdCkpIHsKKwkJCVdNQV9MT0dFKCIlczogc2VsZiBwZWVyIHJlbW92ZWQgYnkgY2FsbGVyICIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCXRlbXAgPSBwZWVyOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPnBkZXYtPnBlZXJfcmVmX211dGV4KTsKKworCS8qIHJlbW92ZSBJQlNTIGJzcyBwZWVyIGxhc3QgKi8KKwlwZWVyID0gVEFJTFFfRklSU1QoJnZkZXYtPnBlZXJfbGlzdCk7CisJd21hX3JlbW92ZV9wZWVyKHdtYSwgd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmJzc2lkLCB2ZGV2X2lkLCBwZWVyLAorCQkJZmFsc2UpOworfQorCisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworCisvKioKKyAqIHdtYV9kZWxldGVfYWxsX2FwX3JlbW90ZV9wZWVycygpIC0gZGVsZXRlIGFsbCBhcCBwZWVyIGZvciB2ZGV2X2lkCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZCBwZWVyIGRlbGV0ZSBjb21tYW5kIHRvIGZ3IGZvciBhbGwKKyAqIHBlZXJzIGluIHBlZXJfbGlzdCAgYW5kIHJlbW92ZSByZWYgY291bnQgZm9yIHBlZXIgaWQKKyAqIHBlZXIgd2lsbCBhY3R1YWxseSByZW1vdmUgZnJvbSBsaXN0IGFmdGVyIHJlY2V2aW5nCisgKiB1bm1hcCBldmVudCBmcm9tIGZpcm13YXJlLgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfZGVsZXRlX2FsbF9hcF9yZW1vdGVfcGVlcnModHBfd21hX2hhbmRsZSB3bWEsIEFfVUlOVDMyIHZkZXZfaWQpCit7CisJb2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2OworCW9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlciwgdGVtcDsKKworCWlmICghd21hIHx8IHZkZXZfaWQgPiB3bWEtPm1heF9ic3NpZCkKKwkJcmV0dXJuOworCisJdmRldiA9IHdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5oYW5kbGU7CisJaWYgKCF2ZGV2KQorCQlyZXR1cm47CisKKwlXTUFfTE9HRSgiJXM6IHZkZXZfaWQgLSAlZCIsIF9fZnVuY19fLCB2ZGV2X2lkKTsKKwkvKiByZW1vdmUgYWxsIHJlbW90ZSBwZWVycyBvZiBTQVAgKi8KKwljZGZfc3Bpbl9sb2NrX2JoKCZ2ZGV2LT5wZGV2LT5wZWVyX3JlZl9tdXRleCk7CisKKwl0ZW1wID0gTlVMTDsKKwlUQUlMUV9GT1JFQUNIX1JFVkVSU0UocGVlciwgJnZkZXYtPnBlZXJfbGlzdCwgcGVlcl9saXN0X3QsCisJCQkgICAgICBwZWVyX2xpc3RfZWxlbSkgeworCQlpZiAodGVtcCkgeworCQkJY2RmX3NwaW5fdW5sb2NrX2JoKCZ2ZGV2LT5wZGV2LT5wZWVyX3JlZl9tdXRleCk7CisJCQlpZiAoY2RmX2F0b21pY19yZWFkKCZ0ZW1wLT5kZWxldGVfaW5fcHJvZ3Jlc3MpID09IDApIHsKKwkJCQl3bWFfcmVtb3ZlX3BlZXIod21hLCB0ZW1wLT5tYWNfYWRkci5yYXcsCisJCQkJCQl2ZGV2X2lkLCB0ZW1wLCBmYWxzZSk7CisJCQl9CisJCQljZGZfc3Bpbl9sb2NrX2JoKCZ2ZGV2LT5wZGV2LT5wZWVyX3JlZl9tdXRleCk7CisJCX0KKwkJLyogc2VsZiBwZWVyIGlzIGRlbGV0ZWQgYnkgY2FsbGVyICovCisJCWlmIChwZWVyID09IFRBSUxRX0ZJUlNUKCZ2ZGV2LT5wZWVyX2xpc3QpKSB7CisJCQlXTUFfTE9HRSgiJXM6IHNlbGYgcGVlciByZW1vdmVkIGJ5IGNhbGxlciAiLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQl0ZW1wID0gcGVlcjsKKwl9CisKKwljZGZfc3Bpbl91bmxvY2tfYmgoJnZkZXYtPnBkZXYtPnBlZXJfcmVmX211dGV4KTsKK30KKworI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKworLyoqCisgKiB3bWFfcmVjcmVhdGVfaWJzc192ZGV2X2FuZF9ic3NfcGVlcigpIC0gcmVjcmVhdGUgSUJTUyB2ZGV2IGFuZCBjcmVhdGUgcGVlcgorICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX3JlY3JlYXRlX2lic3NfdmRldl9hbmRfYnNzX3BlZXIodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCQl1aW50OF90IHZkZXZfaWQpCit7CisJb2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2OworCXN0cnVjdCBhZGRfc3RhX3NlbGZfcGFyYW1zIGFkZF9zdGFfc2VsZl9wYXJhbTsKKwlzdHJ1Y3QgZGVsX3N0YV9zZWxmX3BhcmFtcyBkZWxfc3RhX3BhcmFtOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBOdWxsIHdtYSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl2ZGV2ID0gd21hX2ZpbmRfdmRldl9ieV9pZCh3bWEsIHZkZXZfaWQpOworCWlmICghdmRldikgeworCQlXTUFfTE9HRSgiJXM6IENhbid0IGZpbmQgdmRldiB3aXRoIGlkICVkIiwgX19mdW5jX18sIHZkZXZfaWQpOworCQlyZXR1cm47CisJfQorCisJY2RmX2NvcHlfbWFjYWRkcigKKwkJKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgJihhZGRfc3RhX3NlbGZfcGFyYW0uc2VsZl9tYWNfYWRkciksCisJCShzdHJ1Y3QgY2RmX21hY19hZGRyICopICYodmRldi0+bWFjX2FkZHIpKTsKKwlhZGRfc3RhX3NlbGZfcGFyYW0uc2Vzc2lvbl9pZCA9IHZkZXZfaWQ7CisJYWRkX3N0YV9zZWxmX3BhcmFtLnR5cGUgPSBXTUlfVkRFVl9UWVBFX0lCU1M7CisJYWRkX3N0YV9zZWxmX3BhcmFtLnN1Yl90eXBlID0gMDsKKwlhZGRfc3RhX3NlbGZfcGFyYW0uc3RhdHVzID0gMDsKKworCS8qIGRlbGV0ZSBvbGQgaWJzcyB2ZGV2ICovCisJZGVsX3N0YV9wYXJhbS5zZXNzaW9uX2lkID0gdmRldl9pZDsKKwljZGZfbWVtX2NvcHkoKHZvaWQgKilkZWxfc3RhX3BhcmFtLnNlbGZfbWFjX2FkZHIsCisJCSAgICAgKHZvaWQgKikmKHZkZXYtPm1hY19hZGRyKSwgQ0RGX01BQ19BRERSX1NJWkUpOworCXdtYV92ZGV2X2RldGFjaCh3bWEsICZkZWxfc3RhX3BhcmFtLCAwKTsKKworCS8qIGNyZWF0ZSBuZXcgdmRldiBmb3IgaWJzcyAqLworCXZkZXYgPSB3bWFfdmRldl9hdHRhY2god21hLCAmYWRkX3N0YV9zZWxmX3BhcmFtLCAwKTsKKwlpZiAoIXZkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHZkZXYiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZWdpc3RlciB3aXRoIFR4UnggTW9kdWxlIGZvciBEYXRhIEFjayBDb21wbGV0ZSBDYiAqLworCW9sX3R4cnhfZGF0YV90eF9jYl9zZXQodmRldiwgd21hX2RhdGFfdHhfYWNrX2NvbXBfaGRsciwgd21hKTsKKwlXTUFfTE9HQSgibmV3IElCU1MgdmRldiBjcmVhdGVkIHdpdGggbWFjICVwTSIsCisJCSBhZGRfc3RhX3NlbGZfcGFyYW0uc2VsZl9tYWNfYWRkcik7CisKKwkvKiBjcmVhdGUgaWJzcyBic3MgcGVlciAqLworCXN0YXR1cyA9IHdtYV9jcmVhdGVfcGVlcih3bWEsIHZkZXYtPnBkZXYsIHZkZXYsIHZkZXYtPm1hY19hZGRyLnJhdywKKwkJCQkgV01JX1BFRVJfVFlQRV9ERUZBVUxULCB2ZGV2X2lkLCBmYWxzZSk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBJQlNTIGJzcyBwZWVyIiwgX19mdW5jX18pOworCWVsc2UKKwkJV01BX0xPR0EoIklCU1MgQlNTIHBlZXIgY3JlYXRlZCB3aXRoIG1hYyAlcE0iLAorCQkJIHZkZXYtPm1hY19hZGRyLnJhdyk7Cit9CisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworCisvKioKKyAqIHdtYV9oaWRkZW5fc3NpZF92ZGV2X3Jlc3RhcnRfb25fdmRldl9zdG9wKCkgLSByZXN0YXJ0IHZkZXYgdG8gc2V0IGhpZGRlbiBzc2lkCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQHNlc3Npb25JZDogc2Vzc2lvbiBpZAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9oaWRkZW5fc3NpZF92ZGV2X3Jlc3RhcnRfb25fdmRldl9zdG9wKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJICAgICAgIHVpbnQ4X3Qgc2Vzc2lvbklkKQoreworCXdtaV92ZGV2X3N0YXJ0X3JlcXVlc3RfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwl3bWlfY2hhbm5lbCAqY2hhbjsKKwlpbnQzMl90IGxlbjsKKwl1aW50OF90ICpidWZfcHRyOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppbnRyID0gd21hX2hhbmRsZS0+aW50ZXJmYWNlczsKKwlpbnQzMl90IHJldCA9IDA7CisKKwlsZW4gPSBzaXplb2YoKmNtZCkgKyBzaXplb2Yod21pX2NoYW5uZWwpICsgV01JX1RMVl9IRFJfU0laRTsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzIDogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWNkZl9hdG9taWNfc2V0KCZpbnRyW3Nlc3Npb25JZF0udmRldl9yZXN0YXJ0X3BhcmFtcy4KKwkJCSAgICAgICBoaWRkZW5fc3NpZF9yZXN0YXJ0X2luX3Byb2dyZXNzLCAwKTsKKwkJcmV0dXJuOworCX0KKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJY21kID0gKHdtaV92ZGV2X3N0YXJ0X3JlcXVlc3RfY21kX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJY2hhbiA9ICh3bWlfY2hhbm5lbCAqKSAoYnVmX3B0ciArIHNpemVvZigqY21kKSk7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9zdGFydF9yZXF1ZXN0X2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfdmRldl9zdGFydF9yZXF1ZXN0X2NtZF9maXhlZF9wYXJhbSkpOworCisJV01JVExWX1NFVF9IRFIoJmNoYW4tPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGFubmVsLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV9jaGFubmVsKSk7CisKKwljbWQtPnZkZXZfaWQgPSBzZXNzaW9uSWQ7CisJY21kLT5zc2lkLnNzaWRfbGVuID0gaW50cltzZXNzaW9uSWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuc3NpZC5zc2lkX2xlbjsKKwljZGZfbWVtX2NvcHkoY21kLT5zc2lkLnNzaWQsCisJCSAgICAgaW50cltzZXNzaW9uSWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuc3NpZC5zc2lkLAorCQkgICAgIGNtZC0+c3NpZC5zc2lkX2xlbik7CisJY21kLT5mbGFncyA9IGludHJbc2Vzc2lvbklkXS52ZGV2X3Jlc3RhcnRfcGFyYW1zLmZsYWdzOworCWlmIChpbnRyW3Nlc3Npb25JZF0udmRldl9yZXN0YXJ0X3BhcmFtcy5zc2lkSGlkZGVuKQorCQljbWQtPmZsYWdzIHw9IFdNSV9VTklGSUVEX1ZERVZfU1RBUlRfSElEREVOX1NTSUQ7CisJZWxzZQorCQljbWQtPmZsYWdzICY9ICgweEZGRkZGRkZFKTsKKwljbWQtPnJlcXVlc3Rvcl9pZCA9IGludHJbc2Vzc2lvbklkXS52ZGV2X3Jlc3RhcnRfcGFyYW1zLnJlcXVlc3Rvcl9pZDsKKwljbWQtPmRpc2FibGVfaHdfYWNrID0KKwkJaW50cltzZXNzaW9uSWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuZGlzYWJsZV9od19hY2s7CisKKwljaGFuLT5taHogPSBpbnRyW3Nlc3Npb25JZF0udmRldl9yZXN0YXJ0X3BhcmFtcy5jaGFuLm1oejsKKwljaGFuLT5iYW5kX2NlbnRlcl9mcmVxMSA9CisJCWludHJbc2Vzc2lvbklkXS52ZGV2X3Jlc3RhcnRfcGFyYW1zLmNoYW4uYmFuZF9jZW50ZXJfZnJlcTE7CisJY2hhbi0+YmFuZF9jZW50ZXJfZnJlcTIgPQorCQlpbnRyW3Nlc3Npb25JZF0udmRldl9yZXN0YXJ0X3BhcmFtcy5jaGFuLmJhbmRfY2VudGVyX2ZyZXEyOworCWNoYW4tPmluZm8gPSBpbnRyW3Nlc3Npb25JZF0udmRldl9yZXN0YXJ0X3BhcmFtcy5jaGFuLmluZm87CisJY2hhbi0+cmVnX2luZm9fMSA9IGludHJbc2Vzc2lvbklkXS52ZGV2X3Jlc3RhcnRfcGFyYW1zLmNoYW4ucmVnX2luZm9fMTsKKwljaGFuLT5yZWdfaW5mb18yID0gaW50cltzZXNzaW9uSWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuY2hhbi5yZWdfaW5mb18yOworCisJY21kLT5udW1fbm9hX2Rlc2NyaXB0b3JzID0gMDsKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgKCgodWludDhfdCAqKSBjbWQpICsgc2l6ZW9mKCpjbWQpICsKKwkJCSAgICAgICBzaXplb2Yod21pX2NoYW5uZWwpKTsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkgICAgICAgY21kLT5udW1fbm9hX2Rlc2NyaXB0b3JzICoKKwkJICAgICAgIHNpemVvZih3bWlfcDJwX25vYV9kZXNjcmlwdG9yKSk7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfVkRFVl9SRVNUQVJUX1JFUVVFU1RfQ01ESUQpOworCWlmIChyZXQgPCAwKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNlbmQgdmRldiByZXN0YXJ0IGNvbW1hbmQiLCBfX2Z1bmNfXyk7CisJCWNkZl9hdG9taWNfc2V0KCZpbnRyW3Nlc3Npb25JZF0udmRldl9yZXN0YXJ0X3BhcmFtcy4KKwkJCSAgICAgICBoaWRkZW5fc3NpZF9yZXN0YXJ0X2luX3Byb2dyZXNzLCAwKTsKKwkJY2RmX25idWZfZnJlZShidWYpOworCX0KK30KKworLyoqCisgKiB3bWFfdmRldl9zdG9wX3Jlc3BfaGFuZGxlcigpIC0gdmRldiBzdG9wIHJlc3BvbnNlIGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZXZlbnQgYnVmZmVyCisgKiBAbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV92ZGV2X3N0b3BfcmVzcF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkgICAgICAgdTMyIGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX1ZERVZfU1RPUFBFRF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfdmRldl9zdG9wcGVkX2V2ZW50X2ZpeGVkX3BhcmFtICpyZXNwX2V2ZW50OworCXN0cnVjdCB3bWFfdGFyZ2V0X3JlcSAqcmVxX21zZzsKKwlvbF90eHJ4X3BlZXJfaGFuZGxlIHBlZXI7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2OworCXVpbnQ4X3QgcGVlcl9pZDsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaWZhY2U7CisJaW50MzJfdCBzdGF0dXMgPSAwOworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisJaWYgKE5VTEwgPT0gbWFjX2N0eCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgbWFjX2N0eCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCisJV01BX0xPR0koIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKwlwYXJhbV9idWYgPSAoV01JX1ZERVZfU1RPUFBFRF9FVkVOVElEX3BhcmFtX3RsdnMgKikgY21kX3BhcmFtX2luZm87CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgZXZlbnQgYnVmZmVyIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXNwX2V2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKworCWlmICgocmVzcF9ldmVudC0+dmRldl9pZCA8PSB3bWEtPm1heF9ic3NpZCkgJiYKKwkgICAgKGNkZl9hdG9taWNfcmVhZAorCQkgICAgICgmd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuCisJCSAgICAgaGlkZGVuX3NzaWRfcmVzdGFydF9pbl9wcm9ncmVzcykpCisJICAgICYmICgod21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLnR5cGUgPT0gV01JX1ZERVZfVFlQRV9BUCkKKwkJJiYgKHdtYS0+aW50ZXJmYWNlc1tyZXNwX2V2ZW50LT52ZGV2X2lkXS5zdWJfdHlwZSA9PSAwKSkpIHsKKwkJV01BX0xPR0UoIiVzOiB2ZGV2IHN0b3AgZXZlbnQgcmVjZXZpZWQgZm9yIGhpZGRlbiBzc2lkIHNldCB1c2luZyBJT0NUTCAiLAorCQkJX19mdW5jX18pOworCQl3bWFfaGlkZGVuX3NzaWRfdmRldl9yZXN0YXJ0X29uX3ZkZXZfc3RvcCh3bWEsCisJCQkJCQkJICByZXNwX2V2ZW50LT52ZGV2X2lkKTsKKwl9CisKKwlyZXFfbXNnID0gd21hX2ZpbmRfdmRldl9yZXEod21hLCByZXNwX2V2ZW50LT52ZGV2X2lkLAorCQkJCSAgICBXTUFfVEFSR0VUX1JFUV9UWVBFX1ZERVZfU1RPUCk7CisJaWYgKCFyZXFfbXNnKSB7CisJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIGxvb2t1cCB2ZGV2IHJlcXVlc3QgZm9yIHZkZXYgaWQgJWQiLAorCQkJIF9fZnVuY19fLCByZXNwX2V2ZW50LT52ZGV2X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlpZiAoIXBkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBwZGV2IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWNkZl9tY190aW1lcl9zdG9wKCZyZXFfbXNnLT5ldmVudF90aW1lb3V0KTsKKwkJZ290byBmcmVlX3JlcV9tc2c7CisJfQorCisJY2RmX21jX3RpbWVyX3N0b3AoJnJlcV9tc2ctPmV2ZW50X3RpbWVvdXQpOworCWlmIChyZXFfbXNnLT5tc2dfdHlwZSA9PSBXTUFfREVMRVRFX0JTU19SRVEpIHsKKwkJdHBEZWxldGVCc3NQYXJhbXMgcGFyYW1zID0KKwkJCSh0cERlbGV0ZUJzc1BhcmFtcykgcmVxX21zZy0+dXNlcl9kYXRhOworCQlzdHJ1Y3QgYmVhY29uX2luZm8gKmJjbjsKKwkJaWYgKHJlc3BfZXZlbnQtPnZkZXZfaWQgPiB3bWEtPm1heF9ic3NpZCkgeworCQkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIHZkZXZfaWQgJWQiLCBfX2Z1bmNfXywKKwkJCQkgcmVzcF9ldmVudC0+dmRldl9pZCk7CisJCQlzdGF0dXMgPSAtRUlOVkFMOworCQkJZ290byBmcmVlX3JlcV9tc2c7CisJCX0KKworCQlpZmFjZSA9ICZ3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF07CisJCWlmIChpZmFjZS0+aGFuZGxlID09IE5VTEwpIHsKKwkJCVdNQV9MT0dFKCIlcyB2ZGV2IGlkICVkIGlzIGFscmVhZHkgZGVsZXRlZCIsCisJCQkJIF9fZnVuY19fLCByZXNwX2V2ZW50LT52ZGV2X2lkKTsKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQlnb3RvIGZyZWVfcmVxX21zZzsKKwkJfQorI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwkJaWYgKHdtYV9pc192ZGV2X2luX2lic3NfbW9kZSh3bWEsIHJlc3BfZXZlbnQtPnZkZXZfaWQpKQorCQkJd21hX2RlbGV0ZV9hbGxfaWJzc19wZWVycyh3bWEsIHJlc3BfZXZlbnQtPnZkZXZfaWQpOworCQllbHNlCisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworCQl7CisJCQlpZiAod21hX2lzX3ZkZXZfaW5fYXBfbW9kZSh3bWEsIHJlc3BfZXZlbnQtPnZkZXZfaWQpKSB7CisJCQkJd21hX2RlbGV0ZV9hbGxfYXBfcmVtb3RlX3BlZXJzKHdtYSwKKwkJCQkJCXJlc3BfZXZlbnQtPnZkZXZfaWQpOworCQkJfQorCQkJcGVlciA9IG9sX3R4cnhfZmluZF9wZWVyX2J5X2FkZHIocGRldiwgcGFyYW1zLT5ic3NpZCwKKwkJCQkJCQkgJnBlZXJfaWQpOworCQkJaWYgKCFwZWVyKQorCQkJCVdNQV9MT0dEKCIlcyBGYWlsZWQgdG8gZmluZCBwZWVyICVwTSIsCisJCQkJCSBfX2Z1bmNfXywgcGFyYW1zLT5ic3NpZCk7CisJCQl3bWFfcmVtb3ZlX3BlZXIod21hLCBwYXJhbXMtPmJzc2lkLCByZXNwX2V2ZW50LT52ZGV2X2lkLAorCQkJCQlwZWVyLCBmYWxzZSk7CisJCX0KKworCQlpZiAod21pX3VuaWZpZWRfdmRldl9kb3duX3NlbmQKKwkJCSAgICAod21hLT53bWlfaGFuZGxlLCByZXNwX2V2ZW50LT52ZGV2X2lkKSA8IDApIHsKKwkJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCB2ZGV2IGRvd24gY21kOiB2ZGV2ICVkIiwKKwkJCQkgcmVzcF9ldmVudC0+dmRldl9pZCk7CisJCX0gZWxzZSB7CisJCQl3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF0udmRldl91cCA9IGZhbHNlOworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCQlpZiAobWFjX2N0eC0+c2FwLnNhcF9jaGFubmVsX2F2b2lkYW5jZSkKKwkJCXdtYV9maW5kX21jY19hcCh3bWEsIHJlc3BfZXZlbnQtPnZkZXZfaWQsIGZhbHNlKTsKKyNlbmRpZiAvKiBGRUFUVVJFX0FQX01DQ19DSF9BVk9JREFOQ0UgKi8KKwkJfQorCQlvbF90eHJ4X3ZkZXZfZmx1c2goaWZhY2UtPmhhbmRsZSk7CisJCVdNQV9MT0dEKCIlcywgdmRldl9pZDogJWQsIHVuLXBhdXNpbmcgdHhfbGxfcXVldWUgZm9yIFZERVZfU1RPUCByc3AiLAorCQkJIF9fZnVuY19fLCByZXNwX2V2ZW50LT52ZGV2X2lkKTsKKwkJb2xfdHhyeF92ZGV2X3VucGF1c2UoaWZhY2UtPmhhbmRsZSwKKwkJCQkgICAgIE9MX1RYUV9QQVVTRV9SRUFTT05fVkRFVl9TVE9QKTsKKwkJaWZhY2UtPnBhdXNlX2JpdG1hcCAmPSB+KDEgPDwgUEFVU0VfVFlQRV9IT1NUKTsKKwkJY2RmX2F0b21pY19zZXQoJmlmYWNlLT5ic3Nfc3RhdHVzLCBXTUFfQlNTX1NUQVRVU19TVE9QUEVEKTsKKwkJV01BX0xPR0QoIiVzOiAodHlwZSAlZCBzdWJ0eXBlICVkKSBCU1MgaXMgc3RvcHBlZCIsCisJCQkgX19mdW5jX18sIGlmYWNlLT50eXBlLCBpZmFjZS0+c3ViX3R5cGUpOworCQliY24gPSB3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF0uYmVhY29uOworCisJCWlmIChiY24pIHsKKwkJCVdNQV9MT0dEKCIlczogRnJlZWluZyBiZWFjb24gc3RydWN0ICVwLCAiCisJCQkJICJ0ZW1wbGF0ZSBtZW1vcnkgJXAiLCBfX2Z1bmNfXywgYmNuLCBiY24tPmJ1Zik7CisJCQlpZiAoYmNuLT5kbWFfbWFwcGVkKQorCQkJCWNkZl9uYnVmX3VubWFwX3NpbmdsZShwZGV2LT5vc2RldiwgYmNuLT5idWYsCisJCQkJCQkgICAgICBDREZfRE1BX1RPX0RFVklDRSk7CisJCQljZGZfbmJ1Zl9mcmVlKGJjbi0+YnVmKTsKKwkJCWNkZl9tZW1fZnJlZShiY24pOworCQkJd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLmJlYWNvbiA9IE5VTEw7CisJCX0KKyNpZmRlZiBRQ0FfSUJTU19TVVBQT1JUCisJCS8qIHJlY3JlYXRlIGlic3MgdmRldiBhbmQgYnNzIHBlZXIgZm9yIHNjYW4gcHVycG9zZSAqLworCQlpZiAod21hX2lzX3ZkZXZfaW5faWJzc19tb2RlKHdtYSwgcmVzcF9ldmVudC0+dmRldl9pZCkpCisJCQl3bWFfcmVjcmVhdGVfaWJzc192ZGV2X2FuZF9ic3NfcGVlcih3bWEsCisJCQkJCQlyZXNwX2V2ZW50LT52ZGV2X2lkKTsKKyNlbmRpZiAvKiBRQ0FfSUJTU19TVVBQT1JUICovCisJCS8qIFRpbWVvdXQgc3RhdHVzIG1lYW5zIGl0cyBXTUEgZ2VuZXJhdGVkIERFTCBCU1MgUkVRIHdoZW4gQURECisJCSAqIEJTUyBSRVEgd2FzIHRpbWVkIG91dCB0byBzdG9wIHRoZSBWREVWIGluIHRoaXMgY2FzZSBubyBuZWVkCisJCSAqIHRvIHNlbmQgcmVzcG9uc2UgdG8gVU1BQworCQkgKi8KKwkJaWYgKHBhcmFtcy0+c3RhdHVzID09IENERl9TVEFUVVNfRldfTVNHX1RJTUVET1VUKSB7CisJCQljZGZfbWVtX2ZyZWUocGFyYW1zKTsKKwkJCVdNQV9MT0dFKCIlczogREVMIEJTUyBmcm9tIEFERCBCU1MgdGltZW91dCBkbyBub3Qgc2VuZCAiCisJCQkJICJyZXNwIHRvIFVNQUMgKHZkZXYgaWQgJXgpIiwKKwkJCQkgX19mdW5jX18sIHJlc3BfZXZlbnQtPnZkZXZfaWQpOworCQl9IGVsc2UgeworCQkJcGFyYW1zLT5zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCQl3bWFfc2VuZF9tc2cod21hLCBXTUFfREVMRVRFX0JTU19SU1AsICh2b2lkICopcGFyYW1zLAorCQkJCSAgICAgMCk7CisJCX0KKworCQlpZiAoaWZhY2UtPmRlbF9zdGFzZWxmX3JlcSkgeworCQkJV01BX0xPR0EoInNjaGVkdWxpbmcgZGVmZXJlZCBkZWxldGlvbiAodmRldiBpZCAleCkiLAorCQkJCSByZXNwX2V2ZW50LT52ZGV2X2lkKTsKKwkJCXdtYV92ZGV2X2RldGFjaCh3bWEsIGlmYWNlLT5kZWxfc3Rhc2VsZl9yZXEsIDEpOworCQl9CisJfQorZnJlZV9yZXFfbXNnOgorCWNkZl9tY190aW1lcl9kZXN0cm95KCZyZXFfbXNnLT5ldmVudF90aW1lb3V0KTsKKwljZGZfbWVtX2ZyZWUocmVxX21zZyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiB3bWFfdmRldl9hdHRhY2goKSAtIGNyZWF0ZSB2ZGV2IGluIGZ3CisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQHNlbGZfc3RhX3JlcTogc2VsZiBzdGEgcmVxdWVzdAorICogQGdlbmVyYXRlUnNwOiBnZW5lcmF0ZSByZXNwb25zZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB2ZGV2IGluIHRhcmdldCBhbmQKKyAqIGF0dGFjaCB0aGlzIHZkZXYgdG8gdHhyeCBtb2R1bGUuIEl0IGFsc28gc2V0CisgKiB2ZGV2IHJlbGF0ZWQgcGFyYW1zIHRvIGZ3LgorICoKKyAqIFJldHVybjogdHhyeCB2ZGV2IGhhbmRsZQorICovCitvbF90eHJ4X3ZkZXZfaGFuZGxlIHdtYV92ZGV2X2F0dGFjaCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJc3RydWN0IGFkZF9zdGFfc2VsZl9wYXJhbXMgKnNlbGZfc3RhX3JlcSwKKwkJCQl1aW50OF90IGdlbmVyYXRlUnNwKQoreworCW9sX3R4cnhfdmRldl9oYW5kbGUgdHhyeF92ZGV2X2hhbmRsZSA9IE5VTEw7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSB0eHJ4X3BkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwllbnVtIHdsYW5fb3BfbW9kZSB0eHJ4X3ZkZXZfdHlwZTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqbWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCXVpbnQzMl90IGNmZ192YWw7CisJdWludDE2X3QgdmFsMTY7CisJaW50IHJldDsKKwl0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyAqcGh0Q2FwSW5mbzsKKwljZHNfbXNnX3Qgc21lX21zZyA9IHsgMCB9OworCisJaWYgKE5VTEwgPT0gbWFjKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCBtYWMiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZW5kOworCX0KKworCS8qIENyZWF0ZSBhIHZkZXYgaW4gdGFyZ2V0ICovCisJaWYgKHdtYV91bmlmaWVkX3ZkZXZfY3JlYXRlX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJIHNlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZCwKKwkJCQkJIHNlbGZfc3RhX3JlcS0+dHlwZSwKKwkJCQkJIHNlbGZfc3RhX3JlcS0+c3ViX3R5cGUsCisJCQkJCSBzZWxmX3N0YV9yZXEtPnNlbGZfbWFjX2FkZHIpKSB7CisJCVdNQV9MT0dQKCIlczogVW5hYmxlIHRvIGFkZCBhbiBpbnRlcmZhY2UgZm9yIGF0aF9kZXYiLAorCQkJIF9fZnVuY19fKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX1JFU09VUkNFUzsKKwkJZ290byBlbmQ7CisJfQorCisJdHhyeF92ZGV2X3R5cGUgPSB3bWFfZ2V0X3R4cnhfdmRldl90eXBlKHNlbGZfc3RhX3JlcS0+dHlwZSk7CisKKwlpZiAod2xhbl9vcF9tb2RlX3Vua25vd24gPT0gdHhyeF92ZGV2X3R5cGUpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBnZXQgdHhyeCB2ZGV2IHR5cGUiKTsKKwkJd21hX3VuaWZpZWRfdmRldl9kZWxldGVfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICAgIHNlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZCk7CisJCWdvdG8gZW5kOworCX0KKworCXR4cnhfdmRldl9oYW5kbGUgPSBvbF90eHJ4X3ZkZXZfYXR0YWNoKHR4cnhfcGRldiwKKwkJCQkJICAgICAgIHNlbGZfc3RhX3JlcS0+c2VsZl9tYWNfYWRkciwKKwkJCQkJICAgICAgIHNlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZCwKKwkJCQkJICAgICAgIHR4cnhfdmRldl90eXBlKTsKKwl3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3NlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZF0ucGF1c2VfYml0bWFwID0gMDsKKworCVdNQV9MT0dBKCJ2ZGV2X2lkICVodSwgdHhyeF92ZGV2X2hhbmRsZSA9ICVwIiwgc2VsZl9zdGFfcmVxLT5zZXNzaW9uX2lkLAorCQkgdHhyeF92ZGV2X2hhbmRsZSk7CisKKwlpZiAoTlVMTCA9PSB0eHJ4X3ZkZXZfaGFuZGxlKSB7CisJCVdNQV9MT0dQKCIlczogb2xfdHhyeF92ZGV2X2F0dGFjaCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl3bWFfdW5pZmllZF92ZGV2X2RlbGV0ZV9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCSAgICAgc2VsZl9zdGFfcmVxLT5zZXNzaW9uX2lkKTsKKwkJZ290byBlbmQ7CisJfQorCXdtYV9oYW5kbGUtPmludGVyZmFjZXNbc2VsZl9zdGFfcmVxLT5zZXNzaW9uX2lkXS5oYW5kbGUgPQorCQl0eHJ4X3ZkZXZfaGFuZGxlOworCisJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tzZWxmX3N0YV9yZXEtPnNlc3Npb25faWRdLnB0cm5fbWF0Y2hfZW5hYmxlID0KKwkJd21hX2hhbmRsZS0+cHRybl9tYXRjaF9lbmFibGVfYWxsX3ZkZXYgPyB0cnVlIDogZmFsc2U7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWMsIFdOSV9DRkdfV09XTEFOX0RFQVVUSF9FTkFCTEUsICZjZmdfdmFsKQorCSAgICAhPSBlU0lSX1NVQ0NFU1MpCisJCXdtYV9oYW5kbGUtPndvdy5kZWF1dGhfZW5hYmxlID0gdHJ1ZTsKKwllbHNlCisJCXdtYV9oYW5kbGUtPndvdy5kZWF1dGhfZW5hYmxlID0gY2ZnX3ZhbCA/IHRydWUgOiBmYWxzZTsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hYywgV05JX0NGR19XT1dMQU5fRElTQVNTT0NfRU5BQkxFLCAmY2ZnX3ZhbCkKKwkgICAgIT0gZVNJUl9TVUNDRVNTKQorCQl3bWFfaGFuZGxlLT53b3cuZGlzYXNzb2NfZW5hYmxlID0gdHJ1ZTsKKwllbHNlCisJCXdtYV9oYW5kbGUtPndvdy5kaXNhc3NvY19lbmFibGUgPSBjZmdfdmFsID8gdHJ1ZSA6IGZhbHNlOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjLCBXTklfQ0ZHX1dPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTiwgJmNmZ192YWwpCisJICAgICE9IGVTSVJfU1VDQ0VTUykKKwkJd21hX2hhbmRsZS0+d293LmJtaXNzX2VuYWJsZSA9IHRydWU7CisJZWxzZQorCQl3bWFfaGFuZGxlLT53b3cuYm1pc3NfZW5hYmxlID0gY2ZnX3ZhbCA/IHRydWUgOiBmYWxzZTsKKworCWNkZl9tZW1fY29weSh3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3NlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZF0uYWRkciwKKwkJICAgICBzZWxmX3N0YV9yZXEtPnNlbGZfbWFjX2FkZHIsCisJCSAgICAgc2l6ZW9mKHdtYV9oYW5kbGUtPmludGVyZmFjZXNbc2VsZl9zdGFfcmVxLT5zZXNzaW9uX2lkXS4KKwkJCSAgICBhZGRyKSk7CisJc3dpdGNoIChzZWxmX3N0YV9yZXEtPnR5cGUpIHsKKwljYXNlIFdNSV9WREVWX1RZUEVfU1RBOgorCQlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWMsIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9ELAorCQkJCSAgICAgJmNmZ192YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yICIKKwkJCQkgIldOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EIik7CisJCQljZmdfdmFsID0gREVGQVVMVF9JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0Q7CisJCX0KKworCQl3bWFfc2V0X3N0YV9rZWVwX2FsaXZlKHdtYV9oYW5kbGUsCisJCQkJICAgICAgIHNlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZCwKKwkJCQkgICAgICAgU0lSX0tFRVBfQUxJVkVfTlVMTF9QS1QsCisJCQkJICAgICAgIGNmZ192YWwsIE5VTEwsIE5VTEwsIE5VTEwpOworCQlicmVhazsKKwl9CisKKwl3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3NlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZF0udHlwZSA9CisJCXNlbGZfc3RhX3JlcS0+dHlwZTsKKwl3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3NlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZF0uc3ViX3R5cGUgPQorCQlzZWxmX3N0YV9yZXEtPnN1Yl90eXBlOworCWNkZl9hdG9taWNfaW5pdCgmd21hX2hhbmRsZS0+aW50ZXJmYWNlcworCQkJW3NlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZF0uYnNzX3N0YXR1cyk7CisKKwlpZiAoKChzZWxmX3N0YV9yZXEtPnR5cGUgPT0gV01JX1ZERVZfVFlQRV9BUCkgJiYKKwkgICAgKHNlbGZfc3RhX3JlcS0+c3ViX3R5cGUgPT0gV01JX1VOSUZJRURfVkRFVl9TVUJUWVBFX1AyUF9ERVZJQ0UpKSB8fAorCSAgICAoc2VsZl9zdGFfcmVxLT50eXBlID09IFdNSV9WREVWX1RZUEVfT0NCKSkgeworCQlXTUFfTE9HQSgiUDJQIERldmljZTogY3JlYXRpbmcgc2VsZiBwZWVyICVwTSwgdmRldl9pZCAlaHUiLAorCQkJIHNlbGZfc3RhX3JlcS0+c2VsZl9tYWNfYWRkciwgc2VsZl9zdGFfcmVxLT5zZXNzaW9uX2lkKTsKKwkJc3RhdHVzID0gd21hX2NyZWF0ZV9wZWVyKHdtYV9oYW5kbGUsIHR4cnhfcGRldiwKKwkJCQkJIHR4cnhfdmRldl9oYW5kbGUsCisJCQkJCSBzZWxmX3N0YV9yZXEtPnNlbGZfbWFjX2FkZHIsCisJCQkJCSBXTUlfUEVFUl9UWVBFX0RFRkFVTFQsCisJCQkJCSBzZWxmX3N0YV9yZXEtPnNlc3Npb25faWQsIGZhbHNlKTsKKwkJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBwZWVyIiwgX19mdW5jX18pOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQl3bWFfdW5pZmllZF92ZGV2X2RlbGV0ZV9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCQkgICAgIHNlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZCk7CisJCX0KKwl9CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJc2VsZl9zdGFfcmVxLT5zZXNzaW9uX2lkLAorCQkJCVdNSV9WREVWX1BBUkFNX01DQ19SVFNDVFNfUFJPVEVDVElPTl9FTkFCTEUsCisJCQkJbWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm1jY19ydHNfY3RzX3Byb3RfZW5hYmxlKTsKKwlpZiAocmV0KQorCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNldCBXTUkgVkRFViBNQ0NfUlRTQ1RTX1BST1RFQ1RJT05fRU5BQkxFIik7CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQlzZWxmX3N0YV9yZXEtPnNlc3Npb25faWQsCisJCQlXTUlfVkRFVl9QQVJBTV9NQ0NfQlJPQURDQVNUX1BST0JFX0VOQUJMRSwKKwkJCW1hYy0+cm9hbS5jb25maWdQYXJhbS5tY2NfYmNhc3RfcHJvYl9yZXNwX2VuYWJsZSk7CisJaWYgKHJldCkKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXQgV01JIFZERVYgTUNDX0JST0FEQ0FTVF9QUk9CRV9FTkFCTEUiKTsKKworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hYywgV05JX0NGR19SVFNfVEhSRVNIT0xELAorCQkJICAgICAmY2ZnX3ZhbCkgPT0gZVNJUl9TVUNDRVNTKSB7CisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgICAgIHNlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZCwKKwkJCQkJCSAgICAgIFdNSV9WREVWX1BBUkFNX1JUU19USFJFU0hPTEQsCisJCQkJCQkgICAgICBjZmdfdmFsKTsKKwkJaWYgKHJldCkKKwkJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2V0IFdNSV9WREVWX1BBUkFNX1JUU19USFJFU0hPTEQiKTsKKwl9IGVsc2UgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19SVFNfVEhSRVNIT0xELCBsZWF2aW5nIHVuY2hhbmdlZCIpOworCX0KKworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hYywgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwKKwkJCSAgICAgJmNmZ192YWwpID09IGVTSVJfU1VDQ0VTUykgeworCQlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCQkgICAgICBzZWxmX3N0YV9yZXEtPnNlc3Npb25faWQsCisJCQkJCQkgICAgICBXTUlfVkRFVl9QQVJBTV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwKKwkJCQkJCSAgICAgIGNmZ192YWwpOworCQlpZiAocmV0KQorCQkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXQgV01JX1ZERVZfUEFSQU1fRlJBR01FTlRBVElPTl9USFJFU0hPTEQiKTsKKwl9IGVsc2UgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwgbGVhdmluZyB1bmNoYW5nZWQiKTsKKwl9CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZjZmdfdmFsKSA9PSBlU0lSX1NVQ0NFU1MpIHsKKwkJdmFsMTYgPSAodWludDE2X3QpIGNmZ192YWw7CisJCXBodENhcEluZm8gPSAodFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gKikgJmNmZ192YWw7CisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgICAgIHNlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZCwKKwkJCQkJCSAgICAgIFdNSV9WREVWX1BBUkFNX1RYX1NUQkMsCisJCQkJCQkgICAgICBwaHRDYXBJbmZvLT50eFNUQkMpOworCQlpZiAocmV0KQorCQkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXQgV01JX1ZERVZfUEFSQU1fVFhfU1RCQyIpOworCX0gZWxzZSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gZ2V0IHZhbHVlIG9mIEhUX0NBUCwgVFggU1RCQyB1bmNoYW5nZWQiKTsKKwl9CisJLyogSW5pdGlhbGl6ZSByb2FtaW5nIG9mZmxvYWQgc3RhdGUgKi8KKwlpZiAoKHNlbGZfc3RhX3JlcS0+dHlwZSA9PSBXTUlfVkRFVl9UWVBFX1NUQSkgJiYKKwkgICAgKHNlbGZfc3RhX3JlcS0+c3ViX3R5cGUgPT0gMCkpIHsKKwkJd21hX2hhbmRsZS0+cm9hbV9vZmZsb2FkX2VuYWJsZWQgPSB0cnVlOworCQl3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCQlzZWxmX3N0YV9yZXEtPnNlc3Npb25faWQsCisJCQkJCQlXTUlfVkRFVl9QQVJBTV9ST0FNX0ZXX09GRkxPQUQsCisJCQkJCQkoV01JX1JPQU1fRldfT0ZGTE9BRF9FTkFCTEVfRkxBRyB8CisJCQkJCQkgV01JX1JPQU1fQk1JU1NfRklOQUxfU0NBTl9FTkFCTEVfRkxBRykpOworCX0KKworCS8qIEluaXRpYWxpemUgQk1JU1MgcGFyYW1ldGVycyAqLworCWlmICgoc2VsZl9zdGFfcmVxLT50eXBlID09IFdNSV9WREVWX1RZUEVfU1RBKSAmJgorCSAgICAoc2VsZl9zdGFfcmVxLT5zdWJfdHlwZSA9PSAwKSkKKwkJd21hX3JvYW1fc2Nhbl9ibWlzc19jbnQod21hX2hhbmRsZSwKKwkJbWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uUm9hbUJtaXNzRmlyc3RCY250LAorCQltYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5Sb2FtQm1pc3NGaW5hbEJjbnQsCisJCXNlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZCk7CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWMsIFdOSV9DRkdfRU5BQkxFX01DQ19BREFQVElWRV9TQ0hFRCwKKwkJCSAgICAgJmNmZ192YWwpID09IGVTSVJfU1VDQ0VTUykgeworCQlXTUFfTE9HRCgiJXM6IHNldHRpbmcgaW5pIHZhbHVlIGZvciBXTklfQ0ZHX0VOQUJMRV9NQ0NfQURBUFRJVkVfU0NIRUQ6ICVkIiwKKwkJCV9fZnVuY19fLCBjZmdfdmFsKTsKKwkJcmV0ID0gd21hX3NldF9lbmFibGVfZGlzYWJsZV9tY2NfYWRhcHRpdmVfc2NoZWR1bGVyKGNmZ192YWwpOworCQlpZiAocmV0ICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXQgV05JX0NGR19FTkFCTEVfTUNDX0FEQVBUSVZFX1NDSEVEIik7CisJCX0KKwl9IGVsc2UgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19FTkFCTEVfTUNDX0FEQVBUSVZFX1NDSEVELCBsZWF2aW5nIHVuY2hhbmdlZCIpOworCX0KKworCXdtYV9yZWdpc3Rlcl93b3dfd2FrZXVwX2V2ZW50cyh3bWFfaGFuZGxlLCBzZWxmX3N0YV9yZXEtPnNlc3Npb25faWQsCisJCQkJCXNlbGZfc3RhX3JlcS0+dHlwZSwKKwkJCQkJc2VsZl9zdGFfcmVxLT5zdWJfdHlwZSk7CisJd21hX3JlZ2lzdGVyX3dvd19kZWZhdWx0X3BhdHRlcm5zKHdtYV9oYW5kbGUsIHNlbGZfc3RhX3JlcS0+c2Vzc2lvbl9pZCk7CisKK2VuZDoKKwlzZWxmX3N0YV9yZXEtPnN0YXR1cyA9IHN0YXR1czsKKworI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwlpZiAoZ2VuZXJhdGVSc3ApCisjZW5kaWYKKwl7CisJCXNtZV9tc2cudHlwZSA9IGVXTklfU01FX0FERF9TVEFfU0VMRl9SU1A7CisJCXNtZV9tc2cuYm9keXB0ciA9IHNlbGZfc3RhX3JlcTsKKwkJc21lX21zZy5ib2R5dmFsID0gMDsKKworCQlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfU01FLCAmc21lX21zZyk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKwkJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcG9zdCBlV05JX1NNRV9BRERfU1RBX1NFTEZfUlNQIik7CisJCQljZGZfbWVtX2ZyZWUoc2VsZl9zdGFfcmVxKTsKKwkJfQorCX0KKwlyZXR1cm4gdHhyeF92ZGV2X2hhbmRsZTsKK30KKworLyoqCisgKiB3bWFfZ2V0X2NlbnRlcl9jaGFubmVsKCkgLSBnZXQgY2VudGVyIGNoYW5uZWwKKyAqIEBjaGFuOiBjaGFubmVsIG51bWJlcgorICogQGNoYW5fb2Zmc2V0OiBjaGFubmVsIG9mZnNldAorICoKKyAqIFJldHVybjogY2VudGVyIGNoYW5uZWwKKyAqLwordWludDhfdCB3bWFfZ2V0X2NlbnRlcl9jaGFubmVsKHVpbnQ4X3QgY2hhbiwgdWludDhfdCBjaGFuX29mZnNldCkKK3sKKwl1aW50OF90IGJhbmRfY2VudGVyX2NoYW4gPSAwOworCisJaWYgKChjaGFuX29mZnNldCA9PSBQSFlfUVVBRFJVUExFX0NIQU5ORUxfMjBNSFpfTE9XXzQwTUhaX0NFTlRFUkVEKSB8fAorCSAgICAoY2hhbl9vZmZzZXQgPT0gUEhZX1FVQURSVVBMRV9DSEFOTkVMXzIwTUhaX0hJR0hfNDBNSFpfTE9XKSkKKwkJYmFuZF9jZW50ZXJfY2hhbiA9IGNoYW4gKyAyOworCWVsc2UgaWYgKGNoYW5fb2Zmc2V0ID09IFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfTE9XKQorCQliYW5kX2NlbnRlcl9jaGFuID0gY2hhbiArIDY7CisJZWxzZSBpZiAoKGNoYW5fb2Zmc2V0ID09IFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9MT1dfNDBNSFpfSElHSCkgfHwKKwkJIChjaGFuX29mZnNldCA9PQorCQkgIFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0NFTlRFUkVEKSkKKwkJYmFuZF9jZW50ZXJfY2hhbiA9IGNoYW4gLSAyOworCWVsc2UgaWYgKGNoYW5fb2Zmc2V0ID09IFBIWV9RVUFEUlVQTEVfQ0hBTk5FTF8yME1IWl9ISUdIXzQwTUhaX0hJR0gpCisJCWJhbmRfY2VudGVyX2NoYW4gPSBjaGFuIC0gNjsKKworCXJldHVybiBiYW5kX2NlbnRlcl9jaGFuOworfQorCisvKioKKyAqIHdtYV92ZGV2X3N0YXJ0KCkgLSBzZW5kIHZkZXYgc3RhcnQgcmVxdWVzdCB0byBmdworICogQHdtYTogd21hIGhhbmRsZQorICogQHJlcTogdmRldiBzdGFydCBwYXJhbXMKKyAqIEBpc1Jlc3RhcnQ6IGlzUmVzdGFydCBmbGFnCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3ZkZXZfc3RhcnQodHBfd21hX2hhbmRsZSB3bWEsCisJCQkgIHN0cnVjdCB3bWFfdmRldl9zdGFydF9yZXEgKnJlcSwgYm9vbCBpc1Jlc3RhcnQpCit7CisJd21pX3ZkZXZfc3RhcnRfcmVxdWVzdF9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCXdtaV9jaGFubmVsICpjaGFuOworCWludDMyX3QgbGVuLCByZXQ7CisJV0xBTl9QSFlfTU9ERSBjaGFubW9kZTsKKwl1aW50OF90ICpidWZfcHRyOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppbnRyID0gd21hLT5pbnRlcmZhY2VzOworCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBOVUxMOworCXN0cnVjdCBhdGhfZGZzICpkZnM7CisKKwltYWNfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCWlmIChtYWNfY3R4ID09IE5VTEwpIHsKKwkJV01BX0xPR0UoIiVzOiB2ZGV2IHN0YXJ0IGZhaWxlZCBhcyBtYWNfY3R4IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlkZnMgPSAoc3RydWN0IGF0aF9kZnMgKil3bWEtPmRmc19pYy0+aWNfZGZzOworCisJV01BX0xPR0QoIiVzOiBFbnRlciBpc1Jlc3RhcnQ9JWQgdmRldj0lZCIsIF9fZnVuY19fLCBpc1Jlc3RhcnQsCisJCSByZXEtPnZkZXZfaWQpOworCWxlbiA9IHNpemVvZigqY21kKSArIHNpemVvZih3bWlfY2hhbm5lbCkgKyBXTUlfVExWX0hEUl9TSVpFOworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlcyA6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJY21kID0gKHdtaV92ZGV2X3N0YXJ0X3JlcXVlc3RfY21kX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJY2hhbiA9ICh3bWlfY2hhbm5lbCAqKSAoYnVmX3B0ciArIHNpemVvZigqY21kKSk7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc3RhcnRfcmVxdWVzdF9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3ZkZXZfc3RhcnRfcmVxdWVzdF9jbWRfZml4ZWRfcGFyYW0pKTsKKwlXTUlUTFZfU0VUX0hEUigmY2hhbi0+dGx2X2hlYWRlciwgV01JVExWX1RBR19TVFJVQ193bWlfY2hhbm5lbCwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfY2hhbm5lbCkpOworCWNtZC0+dmRldl9pZCA9IHJlcS0+dmRldl9pZDsKKworCS8qIEZpbGwgY2hhbm5lbCBpbmZvICovCisJY2hhbi0+bWh6ID0gY2RzX2NoYW5fdG9fZnJlcShyZXEtPmNoYW4pOworCWNoYW5tb2RlID0gd21hX2NoYW5fdG9fbW9kZShyZXEtPmNoYW4sIHJlcS0+Y2hhbl93aWR0aCwKKwkJCQkgICAgcmVxLT52aHRfY2FwYWJsZSwgcmVxLT5kb3QxMV9tb2RlKTsKKworCWludHJbY21kLT52ZGV2X2lkXS5jaGFubW9kZSA9IGNoYW5tb2RlOyAvKiBzYXZlIGNoYW5uZWwgbW9kZSAqLworCWludHJbY21kLT52ZGV2X2lkXS5odF9jYXBhYmxlID0gcmVxLT5odF9jYXBhYmxlOworCWludHJbY21kLT52ZGV2X2lkXS52aHRfY2FwYWJsZSA9IHJlcS0+dmh0X2NhcGFibGU7CisJaW50cltjbWQtPnZkZXZfaWRdLmNvbmZpZy5ndHhfaW5mby5ndHhSVE1hc2tbMF0gPQorCQlDRkdfVEdUX0RFRkFVTFRfR1RYX0hUX01BU0s7CisJaW50cltjbWQtPnZkZXZfaWRdLmNvbmZpZy5ndHhfaW5mby5ndHhSVE1hc2tbMV0gPQorCQlDRkdfVEdUX0RFRkFVTFRfR1RYX1ZIVF9NQVNLOworCWludHJbY21kLT52ZGV2X2lkXS5jb25maWcuZ3R4X2luZm8uZ3R4VXNyY2ZnID0KKwkJQ0ZHX1RHVF9ERUZBVUxUX0dUWF9VU1JfQ0ZHOworCWludHJbY21kLT52ZGV2X2lkXS5jb25maWcuZ3R4X2luZm8uZ3R4UEVSVGhyZXNob2xkID0KKwkJQ0ZHX1RHVF9ERUZBVUxUX0dUWF9QRVJfVEhSRVNIT0xEOworCWludHJbY21kLT52ZGV2X2lkXS5jb25maWcuZ3R4X2luZm8uZ3R4UEVSTWFyZ2luID0KKwkJQ0ZHX1RHVF9ERUZBVUxUX0dUWF9QRVJfTUFSR0lOOworCWludHJbY21kLT52ZGV2X2lkXS5jb25maWcuZ3R4X2luZm8uZ3R4VFBDc3RlcCA9CisJCUNGR19UR1RfREVGQVVMVF9HVFhfVFBDX1NURVA7CisJaW50cltjbWQtPnZkZXZfaWRdLmNvbmZpZy5ndHhfaW5mby5ndHhUUENNaW4gPQorCQlDRkdfVEdUX0RFRkFVTFRfR1RYX1RQQ19NSU47CisJaW50cltjbWQtPnZkZXZfaWRdLmNvbmZpZy5ndHhfaW5mby5ndHhCV01hc2sgPQorCQlDRkdfVEdUX0RFRkFVTFRfR1RYX0JXX01BU0s7CisJaW50cltjbWQtPnZkZXZfaWRdLm1oeiA9IGNoYW4tPm1oejsKKworCVdNSV9TRVRfQ0hBTk5FTF9NT0RFKGNoYW4sIGNoYW5tb2RlKTsKKwljaGFuLT5iYW5kX2NlbnRlcl9mcmVxMSA9IGNoYW4tPm1oejsKKworCWlmIChDSF9XSURUSF8yME1IWiAhPSByZXEtPmNoYW5fd2lkdGgpCisJCWNoYW4tPmJhbmRfY2VudGVyX2ZyZXExID0KKwkJCWNkc19jaGFuX3RvX2ZyZXEocmVxLT5jaF9jZW50ZXJfZnJlcV9zZWcwKTsKKwlpZiAoQ0hfV0lEVEhfODBQODBNSFogPT0gcmVxLT5jaGFuX3dpZHRoKQorCQljaGFuLT5iYW5kX2NlbnRlcl9mcmVxMiA9CisJCQljZHNfY2hhbl90b19mcmVxKHJlcS0+Y2hfY2VudGVyX2ZyZXFfc2VnMSk7CisJZWxzZQorCQljaGFuLT5iYW5kX2NlbnRlcl9mcmVxMiA9IDA7CisKKwkvKiBTZXQgaGFsZiBvciBxdWFydGVyIHJhdGUgV01JIGZsYWdzICovCisJaWYgKHJlcS0+aXNfaGFsZl9yYXRlKQorCQlXTUlfU0VUX0NIQU5ORUxfRkxBRyhjaGFuLCBXTUlfQ0hBTl9GTEFHX0hBTEZfUkFURSk7CisJZWxzZSBpZiAocmVxLT5pc19xdWFydGVyX3JhdGUpCisJCVdNSV9TRVRfQ0hBTk5FTF9GTEFHKGNoYW4sIFdNSV9DSEFOX0ZMQUdfUVVBUlRFUl9SQVRFKTsKKworCS8qCisJICogSWYgdGhlIGNoYW5uZWwgaGFzIERGUyBzZXQsIGZsaXAgb24gcmFkYXIgcmVwb3J0aW5nLgorCSAqCisJICogSXQgbWF5IGJlIHRoYXQgdGhpcyBzaG91bGQgb25seSBiZSBkb25lIGZvciBJQlNTL2hvc3RhcCBvcGVyYXRpb24KKwkgKiBhcyB0aGlzIGZsYWcgbWF5IGJlIGludGVycHJldGVkIChhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUpCisJICogYnkgdGhlIGZpcm13YXJlIGFzICJvaCwgYW5kIHBsZWFzZSBkbyByYWRhciBERVRFQ1RJT04uIgorCSAqCisJICogSWYgdGhhdCBpcyBldmVyIHRoZSBjYXNlIHdlIHdvdWxkIGluc2VydCB0aGUgZGVjaXNpb24gd2hldGhlciB0bworCSAqIGVuYWJsZSB0aGUgZmlybXdhcmUgZmxhZyBoZXJlLgorCSAqLworCisJLyoKKwkgKiBJZiB0aGUgQ2hhbm5lbCBpcyBERlMsCisJICogc2V0IHRoZSBXTUlfQ0hBTl9GTEFHX0RGUyBmbGFnCisJICovCisJaWYgKHJlcS0+aXNfZGZzKSB7CisJCVdNSV9TRVRfQ0hBTk5FTF9GTEFHKGNoYW4sIFdNSV9DSEFOX0ZMQUdfREZTKTsKKwkJY21kLT5kaXNhYmxlX2h3X2FjayA9IHRydWU7CisKKwkJcmVxLT5kZnNfcHJpX211bHRpcGxpZXIgPSB3bWEtPmRmc19wcmlfbXVsdGlwbGllcjsKKworCQkvKgorCQkgKiBDb25maWd1cmUgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwKKwkJICogdG8gREZTIG1vZHVsZSBvbmx5IGlmIHRoZSBkZXZpY2Ugb3BlcmF0aW5nCisJCSAqIG1vZGUgaXMgQVAuCisJCSAqIEVuYWJsZS9EaXNhYmxlIFBoeWVyciBmaWx0ZXJpbmcgb2ZmbG9hZAorCQkgKiBkZXBlbmRpbmcgb24gZGZzX3BoeWVycl9maWx0ZXJfb2ZmbG9hZAorCQkgKiBmbGFnIHN0YXR1cyBhcyBzZXQgaW4gaW5pIGZvciBTQVAgbW9kZS4KKwkJICogQ3VycmVudGx5LCBvbmx5IEFQIHN1cHBvcnRzIERGUyBtYXN0ZXIKKwkJICogbW9kZSBvcGVyYXRpb24gb24gREZTIGNoYW5uZWxzLCBQMlAtR08KKwkJICogZG9lcyBub3Qgc3VwcG9ydCBvcGVyYXRpb24gb24gREZTIENoYW5uZWxzLgorCQkgKi8KKwkJaWYgKHdtYV9pc192ZGV2X2luX2FwX21vZGUod21hLCBjbWQtPnZkZXZfaWQpID09IHRydWUpIHsKKwkJCS8qCisJCQkgKiBJZiBERlMgcmVndWxhdG9yeSBkb21haW4gaXMgaW52YWxpZCwKKwkJCSAqIHRoZW4sIERGUyByYWRhciBmaWx0ZXJzIGludGlhbGl6YXRpb24KKwkJCSAqIHdpbGwgZmFpbC4gU28sIGRvIG5vdCBjb25maWd1cmUgdGhlCisJCQkgKiBjaGFubmVsIGluIHRvIERGUyBtb2RsdWUsIGRvIG5vdAorCQkJICogaW5kaWNhdGUgaWYgcGh5ZXJyb3IgZmlsdGVyaW5nIG9mZmxvYWQKKwkJCSAqIGlzIGVuYWJsZWQgb3Igbm90IHRvIHRoZSBmaXJtd2FyZSwgc2ltcGx5CisJCQkgKiBmYWlsIHRoZSBWREVWIHN0YXJ0IG9uIHRoZSBERlMgY2hhbm5lbAorCQkJICogZWFybHkgb24sIHRvIHByb3RlY3QgdGhlIERGUyBtb2R1bGUgZnJvbQorCQkJICogcHJvY2Vzc2luZyBwaHllcnJvcnMgd2l0aG91dCBiZWluZyBpbnRpYWxpemVkLgorCQkJICovCisJCQlpZiAoREZTX1VOSU5JVF9ET01BSU4gPT0KKwkJCSAgICB3bWEtPmRmc19pYy0+Y3VycmVudF9kZnNfcmVnZG9tYWluKSB7CisJCQkJV01BX0xPR0UoIiVzWyVkXTpERlMgQ29uZmlndXJlZCB3aXRoIEludmFsaWQgcmVnZG9tYWluIgorCQkJCQkiIEZhaWxlZCB0byBzZW5kIFZERVYgU1RBUlQgY29tbWFuZCIsCisJCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkJCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJfQorCisJCQljZGZfbXV0ZXhfYWNxdWlyZSgmd21hLT5kZnNfaWMtPmNoYW5fbG9jayk7CisJCQlpZiAod21hLT5kZnNfaWMtPmljX2N1cmNoYW4pIHsKKwkJCQlPU19GUkVFKHdtYS0+ZGZzX2ljLT5pY19jdXJjaGFuKTsKKwkJCQl3bWEtPmRmc19pYy0+aWNfY3VyY2hhbiA9IE5VTEw7CisJCQl9CisKKwkJCS8qIHByb3ZpZGUgdGhlIGN1cnJlbnQgY2hhbm5lbCB0byBERlMgKi8KKwkJCXdtYS0+ZGZzX2ljLT5pY19jdXJjaGFuID0KKwkJCQl3bWFfZGZzX2NvbmZpZ3VyZV9jaGFubmVsKHdtYS0+ZGZzX2ljLCBjaGFuLAorCQkJCQkJCSAgY2hhbm1vZGUsIHJlcSk7CisJCQljZGZfbXV0ZXhfcmVsZWFzZSgmd21hLT5kZnNfaWMtPmNoYW5fbG9jayk7CisKKwkJCXdtYV91bmlmaWVkX2Rmc19waHllcnJfZmlsdGVyX29mZmxvYWRfZW5hYmxlKHdtYSk7CisJCQlkZnMtPmRpc2FibGVfZGZzX2NoX3N3aXRjaCA9CisJCQkJbWFjX2N0eC0+c2FwLlNhcERmc0luZm8uZGlzYWJsZV9kZnNfY2hfc3dpdGNoOworCQl9CisJfQorCisJY21kLT5iZWFjb25faW50ZXJ2YWwgPSByZXEtPmJlYWNvbl9pbnR2YWw7CisJY21kLT5kdGltX3BlcmlvZCA9IHJlcS0+ZHRpbV9wZXJpb2Q7CisJLyogRklYTUU6IEZpbmQgb3V0IG1pbiwgbWF4IGFuZCByZWd1bGF0b3J5IHBvd2VyIGxldmVscyAqLworCVdNSV9TRVRfQ0hBTk5FTF9SRUdfUE9XRVIoY2hhbiwgcmVxLT5tYXhfdHhwb3cpOworCVdNSV9TRVRfQ0hBTk5FTF9NQVhfVFhfUE9XRVIoY2hhbiwgcmVxLT5tYXhfdHhwb3cpOworCisJLyogVE9ETzogSGFuZGxlIHJlZ3VsYXRvcnkgY2xhc3MsIG1heCBhbnRlbm5hICovCisJaWYgKCFpc1Jlc3RhcnQpIHsKKwkJY21kLT5iZWFjb25faW50ZXJ2YWwgPSByZXEtPmJlYWNvbl9pbnR2YWw7CisJCWNtZC0+ZHRpbV9wZXJpb2QgPSByZXEtPmR0aW1fcGVyaW9kOworCisJCS8qIENvcHkgdGhlIFNTSUQgKi8KKwkJaWYgKHJlcS0+c3NpZC5sZW5ndGgpIHsKKwkJCWlmIChyZXEtPnNzaWQubGVuZ3RoIDwgc2l6ZW9mKGNtZC0+c3NpZC5zc2lkKSkKKwkJCQljbWQtPnNzaWQuc3NpZF9sZW4gPSByZXEtPnNzaWQubGVuZ3RoOworCQkJZWxzZQorCQkJCWNtZC0+c3NpZC5zc2lkX2xlbiA9IHNpemVvZihjbWQtPnNzaWQuc3NpZCk7CisJCQljZGZfbWVtX2NvcHkoY21kLT5zc2lkLnNzaWQsIHJlcS0+c3NpZC5zc0lkLAorCQkJCSAgICAgY21kLT5zc2lkLnNzaWRfbGVuKTsKKwkJfQorCisJCWlmIChyZXEtPmhpZGRlbl9zc2lkKQorCQkJY21kLT5mbGFncyB8PSBXTUlfVU5JRklFRF9WREVWX1NUQVJUX0hJRERFTl9TU0lEOworCisJCWlmIChyZXEtPnBtZl9lbmFibGVkKQorCQkJY21kLT5mbGFncyB8PSBXTUlfVU5JRklFRF9WREVWX1NUQVJUX1BNRl9FTkFCTEVEOworCX0KKworCWNtZC0+bnVtX25vYV9kZXNjcmlwdG9ycyA9IDA7CisJY21kLT5wcmVmZXJyZWRfcnhfc3RyZWFtcyA9IHJlcS0+cHJlZmVycmVkX3J4X3N0cmVhbXM7CisJY21kLT5wcmVmZXJyZWRfdHhfc3RyZWFtcyA9IHJlcS0+cHJlZmVycmVkX3R4X3N0cmVhbXM7CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgKCgodWludHB0cl90KSBjbWQpICsgc2l6ZW9mKCpjbWQpICsKKwkJCSAgICAgICBzaXplb2Yod21pX2NoYW5uZWwpKTsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkgICAgICAgY21kLT5udW1fbm9hX2Rlc2NyaXB0b3JzICoKKwkJICAgICAgIHNpemVvZih3bWlfcDJwX25vYV9kZXNjcmlwdG9yKSk7CisJV01BX0xPR0EoIlxuJXM6IHZkZXZfaWQgJWQgZnJlcSAlZCBjaGFubmVsICVkIGNoYW5tb2RlICVkIGlzX2RmcyAlZCAiCisJCSJiZWFjb24gaW50ZXJ2YWwgJWQgZHRpbSAlZCBjZW50ZXJfY2hhbiAlZCBjZW50ZXJfZnJlcTIgJWQgIgorCQkicmVnX2luZm9fMTogMHgleCByZWdfaW5mb18yOiAweCV4LCByZXEtPm1heF90eHBvdzogMHgleCAiCisJCSJUeCBTUyAlZCwgUnggU1MgJWQiLAorCQlfX2Z1bmNfXywgcmVxLT52ZGV2X2lkLCBjaGFuLT5taHosIHJlcS0+Y2hhbiwgY2hhbm1vZGUsCisJCXJlcS0+aXNfZGZzLCByZXEtPmJlYWNvbl9pbnR2YWwsIGNtZC0+ZHRpbV9wZXJpb2QsCisJCWNoYW4tPmJhbmRfY2VudGVyX2ZyZXExLCBjaGFuLT5iYW5kX2NlbnRlcl9mcmVxMiwKKwkJY2hhbi0+cmVnX2luZm9fMSwgY2hhbi0+cmVnX2luZm9fMiwgcmVxLT5tYXhfdHhwb3csCisJCXJlcS0+cHJlZmVycmVkX3R4X3N0cmVhbXMsIHJlcS0+cHJlZmVycmVkX3J4X3N0cmVhbXMpOworCisJLyogU3RvcmUgdmRldiBwYXJhbXMgaW4gU0FQIG1vZGUgd2hpY2ggY2FuIGJlIHVzZWQgaW4gdmRldiByZXN0YXJ0ICovCisJaWYgKGludHJbcmVxLT52ZGV2X2lkXS50eXBlID09IFdNSV9WREVWX1RZUEVfQVAgJiYKKwkgICAgaW50cltyZXEtPnZkZXZfaWRdLnN1Yl90eXBlID09IDApIHsKKwkJaW50cltyZXEtPnZkZXZfaWRdLnZkZXZfcmVzdGFydF9wYXJhbXMudmRldl9pZCA9IHJlcS0+dmRldl9pZDsKKwkJaW50cltyZXEtPnZkZXZfaWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuc3NpZC5zc2lkX2xlbiA9CisJCQljbWQtPnNzaWQuc3NpZF9sZW47CisJCWNkZl9tZW1fY29weShpbnRyW3JlcS0+dmRldl9pZF0udmRldl9yZXN0YXJ0X3BhcmFtcy5zc2lkLnNzaWQsCisJCQkgICAgIGNtZC0+c3NpZC5zc2lkLCBjbWQtPnNzaWQuc3NpZF9sZW4pOworCQlpbnRyW3JlcS0+dmRldl9pZF0udmRldl9yZXN0YXJ0X3BhcmFtcy5mbGFncyA9IGNtZC0+ZmxhZ3M7CisJCWludHJbcmVxLT52ZGV2X2lkXS52ZGV2X3Jlc3RhcnRfcGFyYW1zLnJlcXVlc3Rvcl9pZCA9CisJCQljbWQtPnJlcXVlc3Rvcl9pZDsKKwkJaW50cltyZXEtPnZkZXZfaWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuZGlzYWJsZV9od19hY2sgPQorCQkJY21kLT5kaXNhYmxlX2h3X2FjazsKKwkJaW50cltyZXEtPnZkZXZfaWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuY2hhbi5taHogPSBjaGFuLT5taHo7CisJCWludHJbcmVxLT52ZGV2X2lkXS52ZGV2X3Jlc3RhcnRfcGFyYW1zLmNoYW4uYmFuZF9jZW50ZXJfZnJlcTEgPQorCQkJY2hhbi0+YmFuZF9jZW50ZXJfZnJlcTE7CisJCWludHJbcmVxLT52ZGV2X2lkXS52ZGV2X3Jlc3RhcnRfcGFyYW1zLmNoYW4uYmFuZF9jZW50ZXJfZnJlcTIgPQorCQkJY2hhbi0+YmFuZF9jZW50ZXJfZnJlcTI7CisJCWludHJbcmVxLT52ZGV2X2lkXS52ZGV2X3Jlc3RhcnRfcGFyYW1zLmNoYW4uaW5mbyA9IGNoYW4tPmluZm87CisJCWludHJbcmVxLT52ZGV2X2lkXS52ZGV2X3Jlc3RhcnRfcGFyYW1zLmNoYW4ucmVnX2luZm9fMSA9CisJCQljaGFuLT5yZWdfaW5mb18xOworCQlpbnRyW3JlcS0+dmRldl9pZF0udmRldl9yZXN0YXJ0X3BhcmFtcy5jaGFuLnJlZ19pbmZvXzIgPQorCQkJY2hhbi0+cmVnX2luZm9fMjsKKwl9CisKKwlpZiAoaXNSZXN0YXJ0KSB7CisJCS8qCisJCSAqIE1hcmtpbmcgdGhlIFZERVYgVVAgU1RBVFVTIHRvIGZhbHNlCisJCSAqIHNpbmNlLCBWREVWIFJFU1RBUlQgd2lsbCBkbyBhIFZERVYgRE9XTgorCQkgKiBpbiB0aGUgZmlybXdhcmUuCisJCSAqLworCQlpbnRyW2NtZC0+dmRldl9pZF0udmRldl91cCA9IGZhbHNlOworCisJCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJCSAgIFdNSV9WREVWX1JFU1RBUlRfUkVRVUVTVF9DTURJRCk7CisKKwl9IGVsc2UgeworCQlXTUFfTE9HRCgiJXMsIHZkZXZfaWQ6ICVkLCB1bnBhdXNpbmcgdHhfbGxfcXVldWUgYXQgVkRFVl9TVEFSVCIsCisJCQkgX19mdW5jX18sIGNtZC0+dmRldl9pZCk7CisJCW9sX3R4cnhfdmRldl91bnBhdXNlKHdtYS0+aW50ZXJmYWNlc1tjbWQtPnZkZXZfaWRdLmhhbmRsZSwKKwkJCQkgICAgIDB4ZmZmZmZmZmYpOworCQl3bWEtPmludGVyZmFjZXNbY21kLT52ZGV2X2lkXS5wYXVzZV9iaXRtYXAgPSAwOworCQlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCQkgICBXTUlfVkRFVl9TVEFSVF9SRVFVRVNUX0NNRElEKTsKKwl9CisKKwlpZiAocmV0IDwgMCkgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byBzZW5kIHZkZXYgc3RhcnQgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZShidWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfcGVlcl9hc3NvY19jb25mX2hhbmRsZXIoKSAtIHBlZXIgYXNzb2MgY29uZiBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAY21kX3BhcmFtX2luZm86IGV2ZW50IGJ1ZmZlcgorICogQGxlbjogYnVmZmVyIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfcGVlcl9hc3NvY19jb25mX2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpjbWRfcGFyYW1faW5mbywKKwkJCQl1aW50MzJfdCBsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCVdNSV9QRUVSX0FTU09DX0NPTkZfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX3BlZXJfYXNzb2NfY29uZl9ldmVudF9maXhlZF9wYXJhbSAqZXZlbnQ7CisJc3RydWN0IHdtYV90YXJnZXRfcmVxICpyZXFfbXNnOworCXVpbnQ4X3QgbWFjYWRkcltJRUVFODAyMTFfQUREUl9MRU5dOworCWludCBzdGF0dXMgPSAwOworCisJV01BX0xPR0QoRkwoIkVudGVyIikpOworCXBhcmFtX2J1ZiA9IChXTUlfUEVFUl9BU1NPQ19DT05GX0VWRU5USURfcGFyYW1fdGx2cyAqKSBjbWRfcGFyYW1faW5mbzsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiSW52YWxpZCBwZWVyIGFzc29jIGNvbmYgZXZlbnQgYnVmZmVyIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWV2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlpZiAoIWV2ZW50KSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIHBlZXIgYXNzb2MgY29uZiBldmVudCBidWZmZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJV01JX01BQ19BRERSX1RPX0NIQVJfQVJSQVkoJmV2ZW50LT5wZWVyX21hY2FkZHIsIG1hY2FkZHIpOworCVdNQV9MT0dEKEZMKCJwZWVyIGFzc29jIGNvbmYgZm9yIHZkZXY6JWQgbWFjPSVwTSIpLAorCQkgZXZlbnQtPnZkZXZfaWQsIG1hY2FkZHIpOworCisJcmVxX21zZyA9IHdtYV9maW5kX3JlcSh3bWEsIGV2ZW50LT52ZGV2X2lkLAorCQkJCSAgICBXTUFfUEVFUl9BU1NPQ19DTkZfU1RBUlQpOworCisJaWYgKCFyZXFfbXNnKSB7CisJCVdNQV9MT0dFKEZMKCJGYWlsZWQgdG8gbG9va3VwIHJlcXVlc3QgbWVzc2FnZSBmb3IgdmRldiAlZCIpLAorCQkJIGV2ZW50LT52ZGV2X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2RmX21jX3RpbWVyX3N0b3AoJnJlcV9tc2ctPmV2ZW50X3RpbWVvdXQpOworCisJaWYgKHJlcV9tc2ctPm1zZ190eXBlID09IFdNQV9BRERfU1RBX1JFUSkgeworCQl0cEFkZFN0YVBhcmFtcyBwYXJhbXMgPSAodHBBZGRTdGFQYXJhbXMpcmVxX21zZy0+dXNlcl9kYXRhOworCQlpZiAoIXBhcmFtcykgeworCQkJV01BX0xPR0UoRkwoImFkZCBTVEEgcGFyYW1zIGlzIE5VTEwgZm9yIHZkZXYgJWQiKSwKKwkJCQkgZXZlbnQtPnZkZXZfaWQpOworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCWdvdG8gZnJlZV9yZXFfbXNnOworCQl9CisKKwkJLyogcGVlciBhc3NvYyBjb25mIGV2ZW50IG1lYW5zIHRoZSBjbWQgc3VjY2VlZHMgKi8KKwkJcGFyYW1zLT5zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCVdNQV9MT0dFKEZMKCJTZW5kIEFERF9TVEFfUlNQOiBzdGF0eXBlICVkIHZkZXZfaWQgJWQgYWlkICVkIGJzc2lkICVwTSBzdGFJZHggJWQgc3RhdHVzICVkIiksCisJCQkgcGFyYW1zLT5zdGFUeXBlLCBwYXJhbXMtPnNtZXNlc3Npb25JZCwKKwkJCSBwYXJhbXMtPmFzc29jSWQsIHBhcmFtcy0+YnNzSWQsIHBhcmFtcy0+c3RhSWR4LAorCQkJIHBhcmFtcy0+c3RhdHVzKTsKKwkJd21hX3NlbmRfbXNnKHdtYSwgV01BX0FERF9TVEFfUlNQLCAodm9pZCAqKXBhcmFtcywgMCk7CisJfSBlbHNlIGlmIChyZXFfbXNnLT5tc2dfdHlwZSA9PSBXTUFfQUREX0JTU19SRVEpIHsKKwkJdHBBZGRCc3NQYXJhbXMgIHBhcmFtcyA9ICh0cEFkZEJzc1BhcmFtcykgcmVxX21zZy0+dXNlcl9kYXRhOworCQlpZiAoIXBhcmFtcykgeworCQkJV01BX0xPR0UoRkwoImFkZCBCU1MgcGFyYW1zIGlzIE5VTEwgZm9yIHZkZXYgJWQiKSwKKwkJCQkgZXZlbnQtPnZkZXZfaWQpOworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCWdvdG8gZnJlZV9yZXFfbXNnOworCQl9CisKKwkJLyogcGVlciBhc3NvYyBjb25mIGV2ZW50IG1lYW5zIHRoZSBjbWQgc3VjY2VlZHMgKi8KKwkJcGFyYW1zLT5zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCVdNQV9MT0dFKEZMKCJTZW5kIEFERCBCU1MgUlNQOiBvcGVybW9kZSAlZCB1cGRhdGVfYnNzICVkIG53X3R5cGUgJWQgYnNzaWQgJXBNIgorCQkJIiBzdGFJZHggJWQgc3RhdHVzICVkIiksIHBhcmFtcy0+b3Blck1vZGUsCisJCQlwYXJhbXMtPnVwZGF0ZUJzcywgcGFyYW1zLT5ud1R5cGUsIHBhcmFtcy0+YnNzSWQsCisJCQlwYXJhbXMtPnN0YUNvbnRleHQuc3RhSWR4LCBwYXJhbXMtPnN0YXR1cyk7CisJCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9BRERfQlNTX1JTUCwgKHZvaWQgKilwYXJhbXMsIDApOworCX0gZWxzZSB7CisJCVdNQV9MT0dFKEZMKCJVbmhhbmRsZWQgcmVxdWVzdCBtZXNzYWdlIHR5cGU6ICVkIiksCisJCXJlcV9tc2ctPm1zZ190eXBlKTsKKwl9CisKK2ZyZWVfcmVxX21zZzoKKwljZGZfbWNfdGltZXJfZGVzdHJveSgmcmVxX21zZy0+ZXZlbnRfdGltZW91dCk7CisJY2RmX21lbV9mcmVlKHJlcV9tc2cpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiB3bWFfaG9sZF9yZXFfdGltZXIoKSAtIHdtYSBob2xkIHJlcXVlc3QgdGltZW91dCBmdW5jdGlvbgorICogQGRhdGE6IHRhcmdldCByZXF1ZXN0IHBhcmFtcworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9ob2xkX3JlcV90aW1lcih2b2lkICpkYXRhKQoreworCXRwX3dtYV9oYW5kbGUgd21hOworCXN0cnVjdCB3bWFfdGFyZ2V0X3JlcSAqdGd0X3JlcSA9IChzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKilkYXRhOworCXN0cnVjdCB3bWFfdGFyZ2V0X3JlcSAqbXNnOworCisJd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoTlVMTCA9PSB3bWEpIHsKKwkJV01BX0xPR0UoRkwoIkZhaWxlZCB0byBnZXQgd21hIikpOworCQlnb3RvIGZyZWVfdGd0X3JlcTsKKwl9CisKKwlXTUFfTE9HQShGTCgicmVxdWVzdCAlZCBpcyB0aW1lZCBvdXQgZm9yIHZkZXZfaWQgLSAlZCIpLAorCQkgdGd0X3JlcS0+bXNnX3R5cGUsIHRndF9yZXEtPnZkZXZfaWQpOworCW1zZyA9IHdtYV9maW5kX3JlcSh3bWEsIHRndF9yZXEtPnZkZXZfaWQsIHRndF9yZXEtPnR5cGUpOworCisJaWYgKCFtc2cpIHsKKwkJV01BX0xPR0UoRkwoIkZhaWxlZCB0byBsb29rdXAgcmVxdWVzdCBtZXNzYWdlIC0gJWQiKSwKKwkJCSB0Z3RfcmVxLT5tc2dfdHlwZSk7CisJCWdvdG8gZnJlZV90Z3RfcmVxOworCX0KKworCWlmICh0Z3RfcmVxLT5tc2dfdHlwZSA9PSBXTUFfQUREX1NUQV9SRVEpIHsKKwkJdHBBZGRTdGFQYXJhbXMgcGFyYW1zID0gKHRwQWRkU3RhUGFyYW1zKSB0Z3RfcmVxLT51c2VyX2RhdGE7CisJCXBhcmFtcy0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX1RJTUVPVVQ7CisJCVdNQV9MT0dBKEZMKCJXTUFfQUREX1NUQV9SRVEgdGltZWQgb3V0IikpOworCQlXTUFfTE9HRChGTCgiU2VuZGluZyBhZGQgc3RhIHJzcCB0byB1bWFjIChtYWM6JXBNLCBzdGF0dXM6JWQpIiksCisJCQkgcGFyYW1zLT5zdGFNYWMsIHBhcmFtcy0+c3RhdHVzKTsKKwkJd21hX3NlbmRfbXNnKHdtYSwgV01BX0FERF9TVEFfUlNQLCAodm9pZCAqKXBhcmFtcywgMCk7CisJfQorZnJlZV90Z3RfcmVxOgorCWNkZl9tY190aW1lcl9kZXN0cm95KCZ0Z3RfcmVxLT5ldmVudF90aW1lb3V0KTsKKwljZGZfbWVtX2ZyZWUodGd0X3JlcSk7Cit9CisKKy8qKgorICogd21hX2ZpbGxfaG9sZF9yZXEoKSAtIGZpbGwgd21hIHJlcXVlc3QKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBtc2dfdHlwZTogbWVzc2FnZSB0eXBlCisgKiBAdHlwZTogcmVxdWVzdCB0eXBlCisgKiBAcGFyYW1zOiByZXF1ZXN0IHBhcmFtcworICogQHRpbWVvdXQ6IHRpbWVvdXQgdmFsdWUKKyAqCisgKiBSZXR1cm46IHdtYV90YXJnZXRfcmVxIHB0cgorICovCitzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKndtYV9maWxsX2hvbGRfcmVxKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkgdWludDhfdCB2ZGV2X2lkLAorCQkJCQkgdWludDMyX3QgbXNnX3R5cGUsIHVpbnQ4X3QgdHlwZSwKKwkJCQkJIHZvaWQgKnBhcmFtcywgdWludDMyX3QgdGltZW91dCkKK3sKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKnJlcTsKKwlDREZfU1RBVFVTIHN0YXR1czsKKworCXJlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcmVxKSk7CisJaWYgKCFyZXEpIHsKKwkJV01BX0xPR1AoRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1zZyAlZCB2ZGV2ICVkIiksCisJCQkgbXNnX3R5cGUsIHZkZXZfaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlXTUFfTE9HRShGTCgidmRldl9pZCAlZCBtc2cgJWQgdHlwZSAlZCIpLCB2ZGV2X2lkLCBtc2dfdHlwZSwgdHlwZSk7CisJcmVxLT52ZGV2X2lkID0gdmRldl9pZDsKKwlyZXEtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJcmVxLT50eXBlID0gdHlwZTsKKwlyZXEtPnVzZXJfZGF0YSA9IHBhcmFtczsKKwljZGZfbWNfdGltZXJfaW5pdCgmcmVxLT5ldmVudF90aW1lb3V0LCBDREZfVElNRVJfVFlQRV9TVywKKwkJCSAgd21hX2hvbGRfcmVxX3RpbWVyLCByZXEpOworCWNkZl9tY190aW1lcl9zdGFydCgmcmVxLT5ldmVudF90aW1lb3V0LCB0aW1lb3V0KTsKKwljZGZfc3Bpbl9sb2NrX2JoKCZ3bWEtPndtYV9ob2xkX3JlcV9xX2xvY2spOworCXN0YXR1cyA9IGNkZl9saXN0X2luc2VydF9iYWNrKCZ3bWEtPndtYV9ob2xkX3JlcV9xdWV1ZSwgJnJlcS0+bm9kZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZ3bWEtPndtYV9ob2xkX3JlcV9xX2xvY2spOworCQlXTUFfTE9HRShGTCgiRmFpbGVkIGFkZCByZXF1ZXN0IGluIHF1ZXVlIikpOworCQljZGZfbWVtX2ZyZWUocmVxKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNkZl9zcGluX3VubG9ja19iaCgmd21hLT53bWFfaG9sZF9yZXFfcV9sb2NrKTsKKwlyZXR1cm4gcmVxOworfQorCisvKioKKyAqIHdtYV9yZW1vdmVfcmVxKCkgLSByZW1vdmUgcmVxdWVzdAorICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEB0eXBlOiB0eXBlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3JlbW92ZV9yZXEodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCwKKwkJICAgIHVpbnQ4X3QgdHlwZSkKK3sKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKnJlcV9tc2c7CisKKwlXTUFfTE9HRShGTCgiUmVtb3ZlIHJlcSBmb3IgdmRldjogJWQgdHlwZTogJWQiKSwgdmRldl9pZCwgdHlwZSk7CisJcmVxX21zZyA9IHdtYV9maW5kX3JlcSh3bWEsIHZkZXZfaWQsIHR5cGUpOworCWlmICghcmVxX21zZykgeworCQlXTUFfTE9HRShGTCgidGFyZ2V0IHJlcSBub3QgZm91bmQgZm9yIHZkZXY6ICVkIHR5cGU6ICVkIiksCisJCQkgdmRldl9pZCwgdHlwZSk7CisJCXJldHVybjsKKwl9CisKKwljZGZfbWNfdGltZXJfc3RvcCgmcmVxX21zZy0+ZXZlbnRfdGltZW91dCk7CisJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnJlcV9tc2ctPmV2ZW50X3RpbWVvdXQpOworCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKK30KKworLyoqCisgKiB3bWFfdmRldl9yZXNwX3RpbWVyKCkgLSB3bWEgcmVzcG9uc2UgdGltZW91dCBmdW5jdGlvbgorICogQGRhdGE6IHRhcmdldCByZXF1ZXN0IHBhcmFtcworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV92ZGV2X3Jlc3BfdGltZXIodm9pZCAqZGF0YSkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKnRndF9yZXEgPSAoc3RydWN0IHdtYV90YXJnZXRfcmVxICopZGF0YTsKKwlvbF90eHJ4X3BlZXJfaGFuZGxlIHBlZXI7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2OworCXVpbnQ4X3QgcGVlcl9pZDsKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKm1zZzsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwljZHNfbXNnX3Qgc21lX21zZyA9IHsgMCB9OworI2lmZGVmIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRQorCXRwQW5pU2lyR2xvYmFsIG1hY19jdHggPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisJaWYgKE5VTEwgPT0gbWFjX2N0eCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgbWFjX2N0eCIsIF9fZnVuY19fKTsKKwkJZ290byBmcmVlX3RndF9yZXE7CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCisJd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKworCWlmIChOVUxMID09IHdtYSkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgd21hIiwgX19mdW5jX18pOworCQlnb3RvIGZyZWVfdGd0X3JlcTsKKwl9CisKKwlwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisKKwlpZiAoTlVMTCA9PSBwZGV2KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCBwZGV2IiwgX19mdW5jX18pOworCQljZGZfbWNfdGltZXJfc3RvcCgmdGd0X3JlcS0+ZXZlbnRfdGltZW91dCk7CisJCWdvdG8gZnJlZV90Z3RfcmVxOworCX0KKworCVdNQV9MT0dBKCIlczogcmVxdWVzdCAlZCBpcyB0aW1lZCBvdXQgZm9yIHZkZXZfaWQgLSAlZCIsIF9fZnVuY19fLAorCQkgdGd0X3JlcS0+bXNnX3R5cGUsIHRndF9yZXEtPnZkZXZfaWQpOworCW1zZyA9IHdtYV9maW5kX3ZkZXZfcmVxKHdtYSwgdGd0X3JlcS0+dmRldl9pZCwgdGd0X3JlcS0+dHlwZSk7CisKKwlpZiAoIW1zZykgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBsb29rdXAgcmVxdWVzdCBtZXNzYWdlIC0gJWQiLAorCQkJIF9fZnVuY19fLCB0Z3RfcmVxLT5tc2dfdHlwZSk7CisJCWdvdG8gZnJlZV90Z3RfcmVxOworCX0KKworCWlmICh0Z3RfcmVxLT5tc2dfdHlwZSA9PSBXTUFfQ0hOTF9TV0lUQ0hfUkVRKSB7CisJCXRwU3dpdGNoQ2hhbm5lbFBhcmFtcyBwYXJhbXMgPQorCQkJKHRwU3dpdGNoQ2hhbm5lbFBhcmFtcykgdGd0X3JlcS0+dXNlcl9kYXRhOworCQlwYXJhbXMtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9USU1FT1VUOworCQlXTUFfTE9HQSgiJXM6IFdNQV9TV0lUQ0hfQ0hBTk5FTF9SRVEgdGltZWRvdXQiLCBfX2Z1bmNfXyk7CisJCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9TV0lUQ0hfQ0hBTk5FTF9SU1AsICh2b2lkICopcGFyYW1zLCAwKTsKKwkJd21hLT5yb2FtX3ByZWF1dGhfY2hhbl9jb250ZXh0ID0gTlVMTDsKKwkJd21hLT5yb2FtX3ByZWF1dGhfc2Nhbl9pZCA9IC0xOworCX0gZWxzZSBpZiAodGd0X3JlcS0+bXNnX3R5cGUgPT0gV01BX0RFTEVURV9CU1NfUkVRKSB7CisJCXRwRGVsZXRlQnNzUGFyYW1zIHBhcmFtcyA9CisJCQkodHBEZWxldGVCc3NQYXJhbXMpIHRndF9yZXEtPnVzZXJfZGF0YTsKKwkJc3RydWN0IGJlYWNvbl9pbmZvICpiY247CisJCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZTsKKworCQlpZiAodGd0X3JlcS0+dmRldl9pZCA+IHdtYS0+bWF4X2Jzc2lkKSB7CisJCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgdmRldl9pZCAlZCIsIF9fZnVuY19fLAorCQkJCSB0Z3RfcmVxLT52ZGV2X2lkKTsKKwkJCWNkZl9tY190aW1lcl9zdG9wKCZ0Z3RfcmVxLT5ldmVudF90aW1lb3V0KTsKKwkJCWdvdG8gZnJlZV90Z3RfcmVxOworCQl9CisKKwkJaWZhY2UgPSAmd21hLT5pbnRlcmZhY2VzW3RndF9yZXEtPnZkZXZfaWRdOworCQlpZiAoaWZhY2UtPmhhbmRsZSA9PSBOVUxMKSB7CisJCQlXTUFfTE9HRSgiJXMgdmRldiBpZCAlZCBpcyBhbHJlYWR5IGRlbGV0ZWQiLAorCQkJCSBfX2Z1bmNfXywgdGd0X3JlcS0+dmRldl9pZCk7CisJCQljZGZfbWNfdGltZXJfc3RvcCgmdGd0X3JlcS0+ZXZlbnRfdGltZW91dCk7CisJCQlnb3RvIGZyZWVfdGd0X3JlcTsKKwkJfQorI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwkJaWYgKHdtYV9pc192ZGV2X2luX2lic3NfbW9kZSh3bWEsIHRndF9yZXEtPnZkZXZfaWQpKQorCQkJd21hX2RlbGV0ZV9hbGxfaWJzc19wZWVycyh3bWEsIHRndF9yZXEtPnZkZXZfaWQpOworCQllbHNlCisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworCQl7CisJCQlpZiAod21hX2lzX3ZkZXZfaW5fYXBfbW9kZSh3bWEsIHRndF9yZXEtPnZkZXZfaWQpKSB7CisJCQkJd21hX2RlbGV0ZV9hbGxfYXBfcmVtb3RlX3BlZXJzKHdtYSwKKwkJCQkJCQkgICAgICAgdGd0X3JlcS0+CisJCQkJCQkJICAgICAgIHZkZXZfaWQpOworCQkJfQorCQkJcGVlciA9IG9sX3R4cnhfZmluZF9wZWVyX2J5X2FkZHIocGRldiwgcGFyYW1zLT5ic3NpZCwKKwkJCQkJCQkgJnBlZXJfaWQpOworCQkJd21hX3JlbW92ZV9wZWVyKHdtYSwgcGFyYW1zLT5ic3NpZCwgdGd0X3JlcS0+dmRldl9pZCwKKwkJCQkJcGVlciwgZmFsc2UpOworCQl9CisKKwkJaWYgKHdtaV91bmlmaWVkX3ZkZXZfZG93bl9zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJICAgICAgIHRndF9yZXEtPnZkZXZfaWQpIDwgMCkgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIHZkZXYgZG93biBjbWQ6IHZkZXYgJWQiLAorCQkJCSB0Z3RfcmVxLT52ZGV2X2lkKTsKKwkJfSBlbHNlIHsKKwkJCXdtYS0+aW50ZXJmYWNlc1t0Z3RfcmVxLT52ZGV2X2lkXS52ZGV2X3VwID0gZmFsc2U7CisjaWZkZWYgRkVBVFVSRV9BUF9NQ0NfQ0hfQVZPSURBTkNFCisJCWlmIChtYWNfY3R4LT5zYXAuc2FwX2NoYW5uZWxfYXZvaWRhbmNlKQorCQkJd21hX2ZpbmRfbWNjX2FwKHdtYSwgdGd0X3JlcS0+dmRldl9pZCwgZmFsc2UpOworI2VuZGlmIC8qIEZFQVRVUkVfQVBfTUNDX0NIX0FWT0lEQU5DRSAqLworCQl9CisJCW9sX3R4cnhfdmRldl9mbHVzaChpZmFjZS0+aGFuZGxlKTsKKwkJV01BX0xPR0QoIiVzLCB2ZGV2X2lkOiAlZCwgdW4tcGF1c2luZyB0eF9sbF9xdWV1ZSBmb3IgV0RBX0RFTEVURV9CU1NfUkVRIHRpbWVvdXQiLAorCQkJIF9fZnVuY19fLCB0Z3RfcmVxLT52ZGV2X2lkKTsKKwkJb2xfdHhyeF92ZGV2X3VucGF1c2UoaWZhY2UtPmhhbmRsZSwKKwkJCQkgICAgIE9MX1RYUV9QQVVTRV9SRUFTT05fVkRFVl9TVE9QKTsKKwkJaWZhY2UtPnBhdXNlX2JpdG1hcCAmPSB+KDEgPDwgUEFVU0VfVFlQRV9IT1NUKTsKKwkJY2RmX2F0b21pY19zZXQoJmlmYWNlLT5ic3Nfc3RhdHVzLCBXTUFfQlNTX1NUQVRVU19TVE9QUEVEKTsKKwkJV01BX0xPR0QoIiVzOiAodHlwZSAlZCBzdWJ0eXBlICVkKSBCU1MgaXMgc3RvcHBlZCIsCisJCQkgX19mdW5jX18sIGlmYWNlLT50eXBlLCBpZmFjZS0+c3ViX3R5cGUpOworCisJCWJjbiA9IHdtYS0+aW50ZXJmYWNlc1t0Z3RfcmVxLT52ZGV2X2lkXS5iZWFjb247CisKKwkJaWYgKGJjbikgeworCQkJV01BX0xPR0QoIiVzOiBGcmVlaW5nIGJlYWNvbiBzdHJ1Y3QgJXAsICIKKwkJCQkgInRlbXBsYXRlIG1lbW9yeSAlcCIsIF9fZnVuY19fLCBiY24sIGJjbi0+YnVmKTsKKwkJCWlmIChiY24tPmRtYV9tYXBwZWQpCisJCQkJY2RmX25idWZfdW5tYXBfc2luZ2xlKHBkZXYtPm9zZGV2LCBiY24tPmJ1ZiwKKwkJCQkJCSAgICAgIENERl9ETUFfVE9fREVWSUNFKTsKKwkJCWNkZl9uYnVmX2ZyZWUoYmNuLT5idWYpOworCQkJY2RmX21lbV9mcmVlKGJjbik7CisJCQl3bWEtPmludGVyZmFjZXNbdGd0X3JlcS0+dmRldl9pZF0uYmVhY29uID0gTlVMTDsKKwkJfQorI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwkJLyogcmVjcmVhdGUgaWJzcyB2ZGV2IGFuZCBic3MgcGVlciBmb3Igc2NhbiBwdXJwb3NlICovCisJCWlmICh3bWFfaXNfdmRldl9pbl9pYnNzX21vZGUod21hLCB0Z3RfcmVxLT52ZGV2X2lkKSkKKwkJCXdtYV9yZWNyZWF0ZV9pYnNzX3ZkZXZfYW5kX2Jzc19wZWVyKHdtYSwKKwkJCQkJCQkgICAgdGd0X3JlcS0+dmRldl9pZCk7CisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworCQlwYXJhbXMtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9USU1FT1VUOworCQlXTUFfTE9HQSgiJXM6IFdNQV9ERUxFVEVfQlNTX1JFUSB0aW1lZG91dCIsIF9fZnVuY19fKTsKKwkJd21hX3NlbmRfbXNnKHdtYSwgV01BX0RFTEVURV9CU1NfUlNQLCAodm9pZCAqKXBhcmFtcywgMCk7CisJCWlmIChpZmFjZS0+ZGVsX3N0YXNlbGZfcmVxKSB7CisJCQlXTUFfTE9HQSgic2NoZWR1bGluZyBkZWZlcmVkIGRlbGV0aW9uKHZkZXYgaWQgJXgpIiwKKwkJCQkgdGd0X3JlcS0+dmRldl9pZCk7CisJCQl3bWFfdmRldl9kZXRhY2god21hLCBpZmFjZS0+ZGVsX3N0YXNlbGZfcmVxLCAxKTsKKwkJfQorCX0gZWxzZSBpZiAodGd0X3JlcS0+bXNnX3R5cGUgPT0gV01BX0RFTF9TVEFfU0VMRl9SRVEpIHsKKwkJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlID0KKwkJCShzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqKXRndF9yZXEtPnVzZXJfZGF0YTsKKwkJc3RydWN0IGRlbF9zdGFfc2VsZl9wYXJhbXMgKnBhcmFtcyA9CisJCQkoc3RydWN0IGRlbF9zdGFfc2VsZl9wYXJhbXMgKikgaWZhY2UtPmRlbF9zdGFzZWxmX3JlcTsKKworCQlwYXJhbXMtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9USU1FT1VUOworCQlXTUFfTE9HQSgiJXM6IFdNQV9ERUxfU1RBX1NFTEZfUkVRIHRpbWVkb3V0IiwgX19mdW5jX18pOworCQlzbWVfbXNnLnR5cGUgPSBlV05JX1NNRV9ERUxfU1RBX1NFTEZfUlNQOworCQlzbWVfbXNnLmJvZHlwdHIgPSBpZmFjZS0+ZGVsX3N0YXNlbGZfcmVxOworCQlzbWVfbXNnLmJvZHl2YWwgPSAwOworCisJCXN0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9TTUUsICZzbWVfbXNnKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBwb3N0IGVXTklfU01FX0FERF9TVEFfU0VMRl9SU1AiKTsKKwkJCWNkZl9tZW1fZnJlZShpZmFjZS0+ZGVsX3N0YXNlbGZfcmVxKTsKKwkJfQorCQlpZiAoaWZhY2UtPmFkZEJzc1N0YUNvbnRleHQpCisJCQljZGZfbWVtX2ZyZWUoaWZhY2UtPmFkZEJzc1N0YUNvbnRleHQpOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJaWYgKGlmYWNlLT5zdGFLZXlQYXJhbXMpCisJCQljZGZfbWVtX2ZyZWUoaWZhY2UtPnN0YUtleVBhcmFtcyk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKwkJY2RmX21lbV96ZXJvKGlmYWNlLCBzaXplb2YoKmlmYWNlKSk7CisJfSBlbHNlIGlmICh0Z3RfcmVxLT5tc2dfdHlwZSA9PSBXTUFfQUREX0JTU19SRVEpIHsKKwkJdHBBZGRCc3NQYXJhbXMgcGFyYW1zID0gKHRwQWRkQnNzUGFyYW1zKSB0Z3RfcmVxLT51c2VyX2RhdGE7CisJCXREZWxldGVCc3NQYXJhbXMgKmRlbF9ic3NfcGFyYW1zID0KKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0RGVsZXRlQnNzUGFyYW1zKSk7CisJCWlmIChOVUxMID09IGRlbF9ic3NfcGFyYW1zKSB7CisJCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGVsX2Jzc19wYXJhbXMiKTsKKwkJCXBlZXIgPSBvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyKHBkZXYsIHBhcmFtcy0+YnNzSWQsCisJCQkJCQkJICAmcGVlcl9pZCk7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCisJCWRlbF9ic3NfcGFyYW1zLT5zdGF0dXMgPSBwYXJhbXMtPnN0YXR1cyA9CisJCQkJCQkgQ0RGX1NUQVRVU19GV19NU0dfVElNRURPVVQ7CisJCWRlbF9ic3NfcGFyYW1zLT5zZXNzaW9uSWQgPSBwYXJhbXMtPnNlc3Npb25JZDsKKwkJZGVsX2Jzc19wYXJhbXMtPmJzc0lkeCA9IHBhcmFtcy0+YnNzSWR4OworCQljZGZfbWVtX2NvcHkoZGVsX2Jzc19wYXJhbXMtPmJzc2lkLCBwYXJhbXMtPmJzc0lkLAorCQkJICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCQlXTUFfTE9HQSgiJXM6IFdNQV9BRERfQlNTX1JFUSB0aW1lZG91dCIsIF9fZnVuY19fKTsKKwkJcGVlciA9IG9sX3R4cnhfZmluZF9wZWVyX2J5X2FkZHIocGRldiwgcGFyYW1zLT5ic3NJZCwgJnBlZXJfaWQpOworCQlpZiAoIXBlZXIpIHsKKwkJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIGZpbmQgcGVlciAlcE0iLCBfX2Z1bmNfXywKKwkJCQkgcGFyYW1zLT5ic3NJZCk7CisJCX0KKwkJbXNnID0gd21hX2ZpbGxfdmRldl9yZXEod21hLCB0Z3RfcmVxLT52ZGV2X2lkLCBXTUFfREVMRVRFX0JTU19SRVEsCisJCQkJCSAgV01BX1RBUkdFVF9SRVFfVFlQRV9WREVWX1NUT1AsCisJCQkJCSAgZGVsX2Jzc19wYXJhbXMsCisJCQkJCSAgV01BX1ZERVZfU1RPUF9SRVFVRVNUX1RJTUVPVVQpOworCQlpZiAoIW1zZykgeworCQkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gZmlsbCB2ZGV2IHJlcXVlc3QgZm9yIHZkZXZfaWQgJWQiLAorCQkJCV9fZnVuY19fLCB0Z3RfcmVxLT52ZGV2X2lkKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCVdNQV9MT0dEKCIlcywgdmRldl9pZDogJWQsIHBhdXNpbmcgdHhfbGxfcXVldWUgZm9yIFZERVZfU1RPUCAoV0RBX0FERF9CU1NfUkVRIHRpbWVkb3V0KSIsCisJCQkgX19mdW5jX18sIHRndF9yZXEtPnZkZXZfaWQpOworCQlvbF90eHJ4X3ZkZXZfcGF1c2Uod21hLT5pbnRlcmZhY2VzW3RndF9yZXEtPnZkZXZfaWRdLmhhbmRsZSwKKwkJCQkgICBPTF9UWFFfUEFVU0VfUkVBU09OX1ZERVZfU1RPUCk7CisJCXdtYS0+aW50ZXJmYWNlc1t0Z3RfcmVxLT52ZGV2X2lkXS5wYXVzZV9iaXRtYXAgfD0KKwkJCQkJCQkoMSA8PCBQQVVTRV9UWVBFX0hPU1QpOworCQlpZiAod21pX3VuaWZpZWRfdmRldl9zdG9wX3NlbmQKKwkJCSAgICAod21hLT53bWlfaGFuZGxlLCB0Z3RfcmVxLT52ZGV2X2lkKSkgeworCQkJV01BX0xPR1AoIiVzOiAlZCBGYWlsZWQgdG8gc2VuZCB2ZGV2IHN0b3AiLCBfX2Z1bmNfXywKKwkJCQkgX19MSU5FX18pOworCQkJd21hX3JlbW92ZV92ZGV2X3JlcSh3bWEsIHRndF9yZXEtPnZkZXZfaWQsCisJCQkJCSAgICBXTUFfVEFSR0VUX1JFUV9UWVBFX1ZERVZfU1RPUCk7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlXTUFfTE9HSSgiJXM6IGJzc2lkICVwTSB2ZGV2X2lkICVkIiwgX19mdW5jX18sIHBhcmFtcy0+YnNzSWQsCisJCQkgdGd0X3JlcS0+dmRldl9pZCk7CisJCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9BRERfQlNTX1JTUCwgKHZvaWQgKilwYXJhbXMsIDApOworCQlnb3RvIGZyZWVfdGd0X3JlcTsKK2Vycm9yMDoKKwkJaWYgKHBlZXIpCisJCQl3bWFfcmVtb3ZlX3BlZXIod21hLCBwYXJhbXMtPmJzc0lkLAorCQkJCQl0Z3RfcmVxLT52ZGV2X2lkLCBwZWVyLCBmYWxzZSk7CisJCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9BRERfQlNTX1JTUCwgKHZvaWQgKilwYXJhbXMsIDApOworCX0gZWxzZSBpZiAodGd0X3JlcS0+bXNnX3R5cGUgPT0gV01BX09DQl9TRVRfQ09ORklHX0NNRCkgeworCQlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaWZhY2U7CisKKwkJV01BX0xPR0UoRkwoIkZhaWxlZCB0byBzZW5kIE9DQiBzZXQgY29uZmlnIGNtZCIpKTsKKwkJaWZhY2UgPSAmd21hLT5pbnRlcmZhY2VzW3RndF9yZXEtPnZkZXZfaWRdOworCQlpZmFjZS0+dmRldl91cCA9IGZhbHNlOworCQl3bWFfb2NiX3NldF9jb25maWdfcmVzcCh3bWEsIENERl9TVEFUVVNfRV9USU1FT1VUKTsKKwl9CitmcmVlX3RndF9yZXE6CisJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnRndF9yZXEtPmV2ZW50X3RpbWVvdXQpOworCWNkZl9tZW1fZnJlZSh0Z3RfcmVxKTsKK30KKworLyoqCisgKiB3bWFfZmlsbF92ZGV2X3JlcSgpIC0gZmlsbCB2ZGV2IHJlcXVlc3QKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBtc2dfdHlwZTogbWVzc2FnZSB0eXBlCisgKiBAdHlwZTogcmVxdWVzdCB0eXBlCisgKiBAcGFyYW1zOiByZXF1ZXN0IHBhcmFtcworICogQHRpbWVvdXQ6IHRpbWVvdXQgdmFsdWUKKyAqCisgKiBSZXR1cm46IHdtYV90YXJnZXRfcmVxIHB0cgorICovCitzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKndtYV9maWxsX3ZkZXZfcmVxKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkgdWludDhfdCB2ZGV2X2lkLAorCQkJCQkgdWludDMyX3QgbXNnX3R5cGUsIHVpbnQ4X3QgdHlwZSwKKwkJCQkJIHZvaWQgKnBhcmFtcywgdWludDMyX3QgdGltZW91dCkKK3sKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKnJlcTsKKworCXJlcSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcmVxKSk7CisJaWYgKCFyZXEpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBtc2cgJWQgdmRldiAlZCIsCisJCQkgX19mdW5jX18sIG1zZ190eXBlLCB2ZGV2X2lkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJV01BX0xPR0QoIiVzOiB2ZGV2X2lkICVkIG1zZyAlZCIsIF9fZnVuY19fLCB2ZGV2X2lkLCBtc2dfdHlwZSk7CisJcmVxLT52ZGV2X2lkID0gdmRldl9pZDsKKwlyZXEtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJcmVxLT50eXBlID0gdHlwZTsKKwlyZXEtPnVzZXJfZGF0YSA9IHBhcmFtczsKKwljZGZfbWNfdGltZXJfaW5pdCgmcmVxLT5ldmVudF90aW1lb3V0LCBDREZfVElNRVJfVFlQRV9TVywKKwkJCSAgd21hX3ZkZXZfcmVzcF90aW1lciwgcmVxKTsKKwljZGZfbWNfdGltZXJfc3RhcnQoJnJlcS0+ZXZlbnRfdGltZW91dCwgdGltZW91dCk7CisJY2RmX3NwaW5fbG9ja19iaCgmd21hLT52ZGV2X3Jlc3BxX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnJlcS0+bm9kZSwgJndtYS0+dmRldl9yZXNwX3F1ZXVlKTsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJndtYS0+dmRldl9yZXNwcV9sb2NrKTsKKwlyZXR1cm4gcmVxOworfQorCisvKioKKyAqIHdtYV9yZW1vdmVfdmRldl9yZXEoKSAtIHJlbW92ZSB2ZGV2IHJlcXVlc3QKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAdHlwZTogdHlwZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9yZW1vdmVfdmRldl9yZXEodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCwKKwkJCQl1aW50OF90IHR5cGUpCit7CisJc3RydWN0IHdtYV90YXJnZXRfcmVxICpyZXFfbXNnOworCisJcmVxX21zZyA9IHdtYV9maW5kX3ZkZXZfcmVxKHdtYSwgdmRldl9pZCwgdHlwZSk7CisJaWYgKCFyZXFfbXNnKQorCQlyZXR1cm47CisKKwljZGZfbWNfdGltZXJfc3RvcCgmcmVxX21zZy0+ZXZlbnRfdGltZW91dCk7CisJY2RmX21jX3RpbWVyX2Rlc3Ryb3koJnJlcV9tc2ctPmV2ZW50X3RpbWVvdXQpOworCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKK30KKworLyoqCisgKiB3bWFfdmRldl9zZXRfYnNzX3BhcmFtcygpIC0gQlNTIHNldCBwYXJhbXMgZnVuY3Rpb25zCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQGJlYWNvbkludGVydmFsOiBiZWFjb24gaW50ZXJ2YWwKKyAqIEBkdGltUGVyaW9kOiBEVElNIHBlcmlvZAorICogQHNob3J0U2xvdFRpbWVTdXBwb3J0ZWQ6IHNob3J0IHNsb3QgdGltZQorICogQGxsYkNvZXhpc3Q6IGxsYkNvZXhpc3QKKyAqIEBtYXhUeFBvd2VyOiBtYXggdHggcG93ZXIKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQKK3dtYV92ZGV2X3NldF9ic3NfcGFyYW1zKHRwX3dtYV9oYW5kbGUgd21hLCBpbnQgdmRldl9pZCwKKwkJCXRTaXJNYWNCZWFjb25JbnRlcnZhbCBiZWFjb25JbnRlcnZhbCwKKwkJCXVpbnQ4X3QgZHRpbVBlcmlvZCwgdWludDhfdCBzaG9ydFNsb3RUaW1lU3VwcG9ydGVkLAorCQkJdWludDhfdCBsbGJDb2V4aXN0LCB0UG93ZXJkQm0gbWF4VHhQb3dlcikKK3sKKwlpbnQgcmV0OworCXVpbnQzMl90IHNsb3RfdGltZTsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaW50ciA9IHdtYS0+aW50ZXJmYWNlczsKKworCS8qIEJlYWNvbiBJbnRlcnZhbCBzZXR0aW5nICovCisJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJCSAgICAgIFdNSV9WREVWX1BBUkFNX0JFQUNPTl9JTlRFUlZBTCwKKwkJCQkJICAgICAgYmVhY29uSW50ZXJ2YWwpOworCisJaWYgKHJldCkKKwkJV01BX0xPR0UoImZhaWxlZCB0byBzZXQgV01JX1ZERVZfUEFSQU1fQkVBQ09OX0lOVEVSVkFMIik7CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9ndHhfY2ZnX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkJJmludHJbdmRldl9pZF0uY29uZmlnLmd0eF9pbmZvKTsKKwlpZiAocmV0KQorCQlXTUFfTE9HRSgiZmFpbGVkIHRvIHNldCBXTUlfVkRFVl9QQVJBTV9EVElNX1BFUklPRCIpOworCisJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJCSAgICAgIFdNSV9WREVWX1BBUkFNX0RUSU1fUEVSSU9ELAorCQkJCQkgICAgICBkdGltUGVyaW9kKTsKKwlpZiAocmV0KQorCQlXTUFfTE9HRSgiZmFpbGVkIHRvIHNldCBXTUlfVkRFVl9QQVJBTV9EVElNX1BFUklPRCIpOworCisJaWYgKCFtYXhUeFBvd2VyKSB7CisJCVdNQV9MT0dXKCJTZXR0aW5nIFR4IHBvd2VyIGxpbWl0IHRvIDAiKTsKKwl9CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwKKwkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fVFhfUFdSTElNSVQsCisJCQkJCSAgICAgIG1heFR4UG93ZXIpOworCWlmIChyZXQpCisJCVdNQV9MT0dFKCJmYWlsZWQgdG8gc2V0IFdNSV9WREVWX1BBUkFNX1RYX1BXUkxJTUlUIik7CisJZWxzZQorCQlpbnRyW3ZkZXZfaWRdLm1heF90eF9wb3dlciA9IG1heFR4UG93ZXI7CisKKwkvKiBTbG90IHRpbWUgKi8KKwlpZiAoc2hvcnRTbG90VGltZVN1cHBvcnRlZCkKKwkJc2xvdF90aW1lID0gV01JX1ZERVZfU0xPVF9USU1FX1NIT1JUOworCWVsc2UKKwkJc2xvdF90aW1lID0gV01JX1ZERVZfU0xPVF9USU1FX0xPTkc7CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwKKwkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fU0xPVF9USU1FLAorCQkJCQkgICAgICBzbG90X3RpbWUpOworCWlmIChyZXQpCisJCVdNQV9MT0dFKCJmYWlsZWQgdG8gc2V0IFdNSV9WREVWX1BBUkFNX1NMT1RfVElNRSIpOworCisJLyogSW5pdGlhbGl6ZSBwcm90ZWN0aW9uIG1vZGUgaW4gY2FzZSBvZiBjb2V4aXN0ZW5jZSAqLworCXdtYV91cGRhdGVfcHJvdGVjdGlvbl9tb2RlKHdtYSwgdmRldl9pZCwgbGxiQ29leGlzdCk7Cit9CisKKy8qKgorICogd21hX2FkZF9ic3NfYXBfbW9kZSgpIC0gcHJvY2VzcyBhZGQgYnNzIHJlcXVlc3QgaW4gYXAgbW9kZQorICogQHdtYTogd21hIGhhbmRsZQorICogQGFkZF9ic3M6IGFkZCBic3MgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfYWRkX2Jzc19hcF9tb2RlKHRwX3dtYV9oYW5kbGUgd21hLCB0cEFkZEJzc1BhcmFtcyBhZGRfYnNzKQoreworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldjsKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXY7CisJc3RydWN0IHdtYV92ZGV2X3N0YXJ0X3JlcSByZXE7CisJb2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyOworCXN0cnVjdCB3bWFfdGFyZ2V0X3JlcSAqbXNnOworCXVpbnQ4X3QgdmRldl9pZCwgcGVlcl9pZDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwl0UG93ZXJkQm0gbWF4VHhQb3dlcjsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJaW50IHJldCA9IDA7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExVyAqLworCXN0cnVjdCBzaXJfaHdfbW9kZV9wYXJhbXMgaHdfbW9kZSA9IHswfTsKKworCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKworCWlmIChOVUxMID09IHBkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHBkZXYiLCBfX2Z1bmNfXyk7CisJCWdvdG8gc2VuZF9mYWlsX3Jlc3A7CisJfQorCisJdmRldiA9IHdtYV9maW5kX3ZkZXZfYnlfYWRkcih3bWEsIGFkZF9ic3MtPmJzc0lkLCAmdmRldl9pZCk7CisJaWYgKCF2ZGV2KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCB2ZGV2IGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJZ290byBzZW5kX2ZhaWxfcmVzcDsKKwl9CisJaWYgKFNBUF9XUFNfRElTQUJMRUQgPT0gYWRkX2Jzcy0+d3BzX3N0YXRlKQorCQl3bWFfZW5hYmxlX2Rpc2FibGVfd2FrZXVwX2V2ZW50KHdtYSwgdmRldl9pZCwKKwkJCSgxIDw8IFdPV19QUk9CRV9SRVFfV1BTX0lFX0VWRU5UKSwgZmFsc2UpOworCXdtYV9zZXRfYnNzX3JhdGVfZmxhZ3MoJndtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXSwgYWRkX2Jzcyk7CisJc3RhdHVzID0gd21hX2NyZWF0ZV9wZWVyKHdtYSwgcGRldiwgdmRldiwgYWRkX2Jzcy0+YnNzSWQsCisJCQkJIFdNSV9QRUVSX1RZUEVfREVGQVVMVCwgdmRldl9pZCwgZmFsc2UpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBwZWVyIiwgX19mdW5jX18pOworCQlnb3RvIHNlbmRfZmFpbF9yZXNwOworCX0KKworCXBlZXIgPSBvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyKHBkZXYsIGFkZF9ic3MtPmJzc0lkLCAmcGVlcl9pZCk7CisJaWYgKCFwZWVyKSB7CisJCVdNQV9MT0dFKCIlcyBGYWlsZWQgdG8gZmluZCBwZWVyICVwTSIsIF9fZnVuY19fLAorCQkJIGFkZF9ic3MtPmJzc0lkKTsKKwkJZ290byBzZW5kX2ZhaWxfcmVzcDsKKwl9CisJbXNnID0gd21hX2ZpbGxfdmRldl9yZXEod21hLCB2ZGV2X2lkLCBXTUFfQUREX0JTU19SRVEsCisJCQkJV01BX1RBUkdFVF9SRVFfVFlQRV9WREVWX1NUQVJULCBhZGRfYnNzLAorCQkJCVdNQV9WREVWX1NUQVJUX1JFUVVFU1RfVElNRU9VVCk7CisJaWYgKCFtc2cpIHsKKwkJV01BX0xPR1AoIiVzIEZhaWxlZCB0byBhbGxvY2F0ZSB2ZGV2IHJlcXVlc3QgdmRldl9pZCAlZCIsCisJCQkgX19mdW5jX18sIHZkZXZfaWQpOworCQlnb3RvIHBlZXJfY2xlYW51cDsKKwl9CisKKwlhZGRfYnNzLT5zdGFDb250ZXh0LnN0YUlkeCA9IG9sX3R4cnhfbG9jYWxfcGVlcl9pZChwZWVyKTsKKworCWNkZl9tZW1femVybygmcmVxLCBzaXplb2YocmVxKSk7CisJcmVxLnZkZXZfaWQgPSB2ZGV2X2lkOworCXJlcS5jaGFuID0gYWRkX2Jzcy0+Y3VycmVudE9wZXJDaGFubmVsOworCXJlcS5jaGFuX3dpZHRoID0gYWRkX2Jzcy0+Y2hfd2lkdGg7CisJcmVxLmNoX2NlbnRlcl9mcmVxX3NlZzAgPSBhZGRfYnNzLT5jaF9jZW50ZXJfZnJlcV9zZWcwOworCXJlcS5jaF9jZW50ZXJfZnJlcV9zZWcxID0gYWRkX2Jzcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMTsKKwlyZXEudmh0X2NhcGFibGUgPSBhZGRfYnNzLT52aHRDYXBhYmxlOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCXJlcS5tYXhfdHhwb3cgPSBhZGRfYnNzLT5tYXhUeFBvd2VyOworCW1heFR4UG93ZXIgPSBhZGRfYnNzLT5tYXhUeFBvd2VyOworI2Vsc2UKKwlyZXEubWF4X3R4cG93ID0gMDsKKwltYXhUeFBvd2VyID0gMDsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWlmIChhZGRfYnNzLT5ybWZFbmFibGVkKSB7CisJCS8qCisJCSAqIHdoZW4gODAyLjExdyBQTUYgaXMgZW5hYmxlZCBmb3IgaHcgZW5jci9kZWNyCisJCSAqIHVzZSBodyBNRlAgUW9zIGJpdHMgMHgxMAorCQkgKi8KKwkJcmV0ID0gd21pX3VuaWZpZWRfcGRldl9zZXRfcGFyYW0od21hLT53bWlfaGFuZGxlLAorCQkJCQkJIFdNSV9QREVWX1BBUkFNX1BNRl9RT1MsIHRydWUpOworCQlpZiAocmV0KSB7CisJCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgUU9TIE1GUC9QTUYgKCVkKSIsCisJCQkJIF9fZnVuY19fLCByZXQpOworCQl9IGVsc2UgeworCQkJV01BX0xPR0koIiVzOiBRT1MgTUZQL1BNRiBzZXQgdG8gJWQiLCBfX2Z1bmNfXywgdHJ1ZSk7CisJCX0KKwl9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExVyAqLworCisJcmVxLmJlYWNvbl9pbnR2YWwgPSBhZGRfYnNzLT5iZWFjb25JbnRlcnZhbDsKKwlyZXEuZHRpbV9wZXJpb2QgPSBhZGRfYnNzLT5kdGltUGVyaW9kOworCXJlcS5oaWRkZW5fc3NpZCA9IGFkZF9ic3MtPmJIaWRkZW5TU0lERW47CisJcmVxLmlzX2RmcyA9IGFkZF9ic3MtPmJTcGVjdHJ1bU1ndEVuYWJsZWQ7CisJcmVxLm9wZXJfbW9kZSA9IEJTU19PUEVSQVRJT05BTF9NT0RFX0FQOworCXJlcS5zc2lkLmxlbmd0aCA9IGFkZF9ic3MtPnNzSWQubGVuZ3RoOworCWlmIChyZXEuc3NpZC5sZW5ndGggPiAwKQorCQljZGZfbWVtX2NvcHkocmVxLnNzaWQuc3NJZCwgYWRkX2Jzcy0+c3NJZC5zc0lkLAorCQkJICAgICBhZGRfYnNzLT5zc0lkLmxlbmd0aCk7CisJc3RhdHVzID0gd21hX2dldF9jdXJyZW50X2h3X21vZGUoJmh3X21vZGUpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisJCVdNQV9MT0dFKCJ3bWFfZ2V0X2N1cnJlbnRfaHdfbW9kZSBmYWlsZWQiKTsKKworCWlmICgoYWRkX2Jzcy0+bnNzID09IDIpICYmICFod19tb2RlLmRic19jYXApIHsKKwkJcmVxLnByZWZlcnJlZF9yeF9zdHJlYW1zID0gMjsKKwkJcmVxLnByZWZlcnJlZF90eF9zdHJlYW1zID0gMjsKKwl9IGVsc2UgeworCQlyZXEucHJlZmVycmVkX3J4X3N0cmVhbXMgPSAxOworCQlyZXEucHJlZmVycmVkX3R4X3N0cmVhbXMgPSAxOworCX0KKworCXN0YXR1cyA9IHdtYV92ZGV2X3N0YXJ0KHdtYSwgJnJlcSwgZmFsc2UpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCXdtYV9yZW1vdmVfdmRldl9yZXEod21hLCB2ZGV2X2lkLAorCQkJCSAgICBXTUFfVEFSR0VUX1JFUV9UWVBFX1ZERVZfU1RBUlQpOworCQlnb3RvIHBlZXJfY2xlYW51cDsKKwl9CisKKwl3bWFfdmRldl9zZXRfYnNzX3BhcmFtcyh3bWEsIHZkZXZfaWQsCisJCQkJYWRkX2Jzcy0+YmVhY29uSW50ZXJ2YWwsIGFkZF9ic3MtPmR0aW1QZXJpb2QsCisJCQkJYWRkX2Jzcy0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCwKKwkJCQlhZGRfYnNzLT5sbGJDb2V4aXN0LCBtYXhUeFBvd2VyKTsKKworCXJldHVybjsKKworcGVlcl9jbGVhbnVwOgorCXdtYV9yZW1vdmVfcGVlcih3bWEsIGFkZF9ic3MtPmJzc0lkLCB2ZGV2X2lkLCBwZWVyLCBmYWxzZSk7CitzZW5kX2ZhaWxfcmVzcDoKKwlhZGRfYnNzLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl3bWFfc2VuZF9tc2cod21hLCBXTUFfQUREX0JTU19SU1AsICh2b2lkICopYWRkX2JzcywgMCk7Cit9CisKKyNpZmRlZiBRQ0FfSUJTU19TVVBQT1JUCisvKioKKyAqIHdtYV9hZGRfYnNzX2lic3NfbW9kZSgpIC0gIHByb2Nlc3MgYWRkIGJzcyByZXF1ZXN0IGluIElCU1MgbW9kZQorICogQHdtYTogd21hIGhhbmRsZQorICogQGFkZF9ic3M6IGFkZCBic3MgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfYWRkX2Jzc19pYnNzX21vZGUodHBfd21hX2hhbmRsZSB3bWEsIHRwQWRkQnNzUGFyYW1zIGFkZF9ic3MpCit7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2OworCW9sX3R4cnhfdmRldl9oYW5kbGUgdmRldjsKKwlzdHJ1Y3Qgd21hX3ZkZXZfc3RhcnRfcmVxIHJlcTsKKwlvbF90eHJ4X3BlZXJfaGFuZGxlIHBlZXIgPSBOVUxMOworCXN0cnVjdCB3bWFfdGFyZ2V0X3JlcSAqbXNnOworCXVpbnQ4X3QgdmRldl9pZCwgcGVlcl9pZDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlzdHJ1Y3QgYWRkX3N0YV9zZWxmX3BhcmFtcyBhZGRfc3RhX3NlbGZfcGFyYW07CisJc3RydWN0IGRlbF9zdGFfc2VsZl9wYXJhbXMgZGVsX3N0YV9wYXJhbTsKKwl0U2V0QnNzS2V5UGFyYW1zIGtleV9pbmZvOworCXN0cnVjdCBzaXJfaHdfbW9kZV9wYXJhbXMgaHdfbW9kZSA9IHswfTsKKworCVdNQV9MT0dEKCIlczogYWRkX2Jzcy0+c2Vzc2lvbklkID0gJWQiLCBfX2Z1bmNfXywgYWRkX2Jzcy0+c2Vzc2lvbklkKTsKKwl2ZGV2X2lkID0gYWRkX2Jzcy0+c2Vzc2lvbklkOworCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKworCWlmIChOVUxMID09IHBkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHBkZXYiLCBfX2Z1bmNfXyk7CisJCWdvdG8gc2VuZF9mYWlsX3Jlc3A7CisJfQorCXdtYV9zZXRfYnNzX3JhdGVfZmxhZ3MoJndtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXSwgYWRkX2Jzcyk7CisKKwl2ZGV2ID0gd21hX2ZpbmRfdmRldl9ieV9pZCh3bWEsIHZkZXZfaWQpOworCWlmICghdmRldikgeworCQlXTUFfTE9HRSgiJXM6IHZkZXYgbm90IGZvdW5kIGZvciB2ZGV2IGlkICVkLiIsCisJCQkgX19mdW5jX18sIHZkZXZfaWQpOworCQlnb3RvIHNlbmRfZmFpbF9yZXNwOworCX0KKworCS8qIG9ubHkgY2hhbmdlIHZkZXYgdHlwZSB0byBpYnNzIGR1cmluZyAxc3QgdGltZSBqb2luX2lic3MgaGFuZGxpbmcgKi8KKworCWlmIChmYWxzZSA9PSB3bWFfaXNfdmRldl9pbl9pYnNzX21vZGUod21hLCB2ZGV2X2lkKSkgeworCisJCVdNQV9MT0dEKCIlczogdmRldiBmb3VuZCBmb3IgdmRldiBpZCAlZC4gZGVsZXRpbmcgdGhlIHZkZXYiLAorCQkJIF9fZnVuY19fLCB2ZGV2X2lkKTsKKworCQkvKiByZW1vdmUgcGVlcnMgb24gdGhlIGV4aXN0aW5nIG5vbi1pYnNzIHZkZXYgKi8KKwkJVEFJTFFfRk9SRUFDSChwZWVyLCAmdmRldi0+cGVlcl9saXN0LCBwZWVyX2xpc3RfZWxlbSkgeworCQkJV01BX0xPR0UoIiVzOiBwZWVyIGZvdW5kIGZvciB2ZGV2IGlkICVkLiBkZWxldGluZyB0aGUgcGVlciIsCisJCQkJX19mdW5jX18sIHZkZXZfaWQpOworCQkJd21hX3JlbW92ZV9wZWVyKHdtYSwgKHVpbnQ4X3QgKikgJnZkZXYtPm1hY19hZGRyLAorCQkJCQl2ZGV2X2lkLCBwZWVyLCBmYWxzZSk7CisJCX0KKworCQkvKiByZW1vdmUgdGhlIG5vbi1pYnNzIHZkZXYgKi8KKwkJY2RmX2NvcHlfbWFjYWRkcigKKwkJCShzdHJ1Y3QgY2RmX21hY19hZGRyICopICYoZGVsX3N0YV9wYXJhbS5zZWxmX21hY19hZGRyKSwKKwkJCShzdHJ1Y3QgY2RmX21hY19hZGRyICopICYodmRldi0+bWFjX2FkZHIpKTsKKwkJZGVsX3N0YV9wYXJhbS5zZXNzaW9uX2lkID0gdmRldl9pZDsKKwkJZGVsX3N0YV9wYXJhbS5zdGF0dXMgPSAwOworCisJCXdtYV92ZGV2X2RldGFjaCh3bWEsICZkZWxfc3RhX3BhcmFtLCAwKTsKKworCQkvKiBjcmVhdGUgbmV3IHZkZXYgZm9yIGlic3MgKi8KKwkJY2RmX2NvcHlfbWFjYWRkcigoc3RydWN0IGNkZl9tYWNfYWRkciAqKSAmCisJCQkgKGFkZF9zdGFfc2VsZl9wYXJhbS5zZWxmX21hY19hZGRyKSwKKwkJCSAoc3RydWN0IGNkZl9tYWNfYWRkciAqKSAmKGFkZF9ic3MtPnNlbGZNYWNBZGRyKSk7CisJCWFkZF9zdGFfc2VsZl9wYXJhbS5zZXNzaW9uX2lkID0gdmRldl9pZDsKKwkJYWRkX3N0YV9zZWxmX3BhcmFtLnR5cGUgPSBXTUlfVkRFVl9UWVBFX0lCU1M7CisJCWFkZF9zdGFfc2VsZl9wYXJhbS5zdWJfdHlwZSA9IDA7CisJCWFkZF9zdGFfc2VsZl9wYXJhbS5zdGF0dXMgPSAwOworCisJCXZkZXYgPSB3bWFfdmRldl9hdHRhY2god21hLCAmYWRkX3N0YV9zZWxmX3BhcmFtLCAwKTsKKwkJaWYgKCF2ZGV2KSB7CisJCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgdmRldiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gc2VuZF9mYWlsX3Jlc3A7CisJCX0KKworCQkvKiBSZWdpc3RlciB3aXRoIFR4UnggTW9kdWxlIGZvciBEYXRhIEFjayBDb21wbGV0ZSBDYiAqLworCQlvbF90eHJ4X2RhdGFfdHhfY2Jfc2V0KHZkZXYsIHdtYV9kYXRhX3R4X2Fja19jb21wX2hkbHIsIHdtYSk7CisJCVdNQV9MT0dBKCJuZXcgSUJTUyB2ZGV2IGNyZWF0ZWQgd2l0aCBtYWMgJXBNIiwKKwkJCSBhZGRfYnNzLT5zZWxmTWFjQWRkcik7CisKKwkJLyogY3JlYXRlIGlic3MgYnNzIHBlZXIgKi8KKwkJc3RhdHVzID0gd21hX2NyZWF0ZV9wZWVyKHdtYSwgcGRldiwgdmRldiwgYWRkX2Jzcy0+c2VsZk1hY0FkZHIsCisJCQkJCSBXTUlfUEVFUl9UWVBFX0RFRkFVTFQsIHZkZXZfaWQsCisJCQkJCSBmYWxzZSk7CisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgcGVlciIsIF9fZnVuY19fKTsKKwkJCWdvdG8gc2VuZF9mYWlsX3Jlc3A7CisJCX0KKwkJV01BX0xPR0EoIklCU1MgQlNTIHBlZXIgY3JlYXRlZCB3aXRoIG1hYyAlcE0iLAorCQkJIGFkZF9ic3MtPnNlbGZNYWNBZGRyKTsKKwl9CisKKwlwZWVyID0gb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcihwZGV2LCBhZGRfYnNzLT5zZWxmTWFjQWRkciwgJnBlZXJfaWQpOworCWlmICghcGVlcikgeworCQlXTUFfTE9HRSgiJXMgRmFpbGVkIHRvIGZpbmQgcGVlciAlcE0iLCBfX2Z1bmNfXywKKwkJCSBhZGRfYnNzLT5zZWxmTWFjQWRkcik7CisJCWdvdG8gc2VuZF9mYWlsX3Jlc3A7CisJfQorCisJLyogY2xlYXIgbGVmdG92ZXIgaWJzcyBrZXlzIG9uIGJzcyBwZWVyICovCisKKwlXTUFfTE9HRCgiJXM6IGlic3MgYnNzIGtleSBjbGVhcmluZyIsIF9fZnVuY19fKTsKKwljZGZfbWVtX3NldCgma2V5X2luZm8sIHNpemVvZihrZXlfaW5mbyksIDApOworCWtleV9pbmZvLnNtZXNlc3Npb25JZCA9IHZkZXZfaWQ7CisJa2V5X2luZm8ubnVtS2V5cyA9IFNJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVM7CisJY2RmX21lbV9jb3B5KCZ3bWEtPmlic3NrZXlfaW5mbywgJmtleV9pbmZvLCBzaXplb2YodFNldEJzc0tleVBhcmFtcykpOworCisJLyogc3RhcnQgaWJzcyB2ZGV2ICovCisKKwlhZGRfYnNzLT5vcGVyTW9kZSA9IEJTU19PUEVSQVRJT05BTF9NT0RFX0lCU1M7CisKKwltc2cgPSB3bWFfZmlsbF92ZGV2X3JlcSh3bWEsIHZkZXZfaWQsIFdNQV9BRERfQlNTX1JFUSwKKwkJCQlXTUFfVEFSR0VUX1JFUV9UWVBFX1ZERVZfU1RBUlQsIGFkZF9ic3MsCisJCQkJV01BX1ZERVZfU1RBUlRfUkVRVUVTVF9USU1FT1VUKTsKKwlpZiAoIW1zZykgeworCQlXTUFfTE9HUCgiJXMgRmFpbGVkIHRvIGFsbG9jYXRlIHZkZXYgcmVxdWVzdCB2ZGV2X2lkICVkIiwKKwkJCSBfX2Z1bmNfXywgdmRldl9pZCk7CisJCWdvdG8gcGVlcl9jbGVhbnVwOworCX0KKwlXTUFfTE9HRCgiJXM6IHZkZXYgc3RhcnQgcmVxdWVzdCBmb3IgSUJTUyBlbnF1ZXVlZCIsIF9fZnVuY19fKTsKKworCWFkZF9ic3MtPnN0YUNvbnRleHQuc3RhSWR4ID0gb2xfdHhyeF9sb2NhbF9wZWVyX2lkKHBlZXIpOworCisJLyoKKwkgKiBJZiBJQlNTIFBvd2VyIFNhdmUgaXMgc3VwcG9ydGVkIGJ5IGZpcm13YXJlCisJICogc2V0IHRoZSBJQlNTIHBvd2VyIHNhdmUgcGFyYW1zIHRvIGZpcm13YXJlLgorCSAqLworCWlmIChXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCSAgIFdNSV9TRVJWSUNFX0lCU1NfUFdSU0FWRSkpIHsKKwkJc3RhdHVzID0gd21hX3NldF9pYnNzX3B3cnNhdmVfcGFyYW1zKHdtYSwgdmRldl9pZCk7CisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBTZXQgSUJTUyBQb3dlciBTYXZlIFBhcmFtcyB0byBmaXJtd2FyZSIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBwZWVyX2NsZWFudXA7CisJCX0KKwl9CisKKwljZGZfbWVtX3plcm8oJnJlcSwgc2l6ZW9mKHJlcSkpOworCXJlcS52ZGV2X2lkID0gdmRldl9pZDsKKwlyZXEuY2hhbiA9IGFkZF9ic3MtPmN1cnJlbnRPcGVyQ2hhbm5lbDsKKwlyZXEuY2hhbl93aWR0aCA9IGFkZF9ic3MtPmNoX3dpZHRoOworCXJlcS5jaF9jZW50ZXJfZnJlcV9zZWcwID0gYWRkX2Jzcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMDsKKwlyZXEuY2hfY2VudGVyX2ZyZXFfc2VnMSA9IGFkZF9ic3MtPmNoX2NlbnRlcl9mcmVxX3NlZzE7CisJcmVxLnZodF9jYXBhYmxlID0gYWRkX2Jzcy0+dmh0Q2FwYWJsZTsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRgorCXJlcS5tYXhfdHhwb3cgPSBhZGRfYnNzLT5tYXhUeFBvd2VyOworI2Vsc2UKKwlyZXEubWF4X3R4cG93ID0gMDsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUYgKi8KKwlyZXEuYmVhY29uX2ludHZhbCA9IGFkZF9ic3MtPmJlYWNvbkludGVydmFsOworCXJlcS5kdGltX3BlcmlvZCA9IGFkZF9ic3MtPmR0aW1QZXJpb2Q7CisJcmVxLmhpZGRlbl9zc2lkID0gYWRkX2Jzcy0+YkhpZGRlblNTSURFbjsKKwlyZXEuaXNfZGZzID0gYWRkX2Jzcy0+YlNwZWN0cnVtTWd0RW5hYmxlZDsKKwlyZXEub3Blcl9tb2RlID0gQlNTX09QRVJBVElPTkFMX01PREVfSUJTUzsKKwlyZXEuc3NpZC5sZW5ndGggPSBhZGRfYnNzLT5zc0lkLmxlbmd0aDsKKwlpZiAocmVxLnNzaWQubGVuZ3RoID4gMCkKKwkJY2RmX21lbV9jb3B5KHJlcS5zc2lkLnNzSWQsIGFkZF9ic3MtPnNzSWQuc3NJZCwKKwkJCSAgICAgYWRkX2Jzcy0+c3NJZC5sZW5ndGgpOworCXN0YXR1cyA9IHdtYV9nZXRfY3VycmVudF9od19tb2RlKCZod19tb2RlKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQlXTUFfTE9HRSgid21hX2dldF9jdXJyZW50X2h3X21vZGUgZmFpbGVkIik7CisKKwlpZiAoKGFkZF9ic3MtPm5zcyA9PSAyKSAmJiAhaHdfbW9kZS5kYnNfY2FwKSB7CisJCXJlcS5wcmVmZXJyZWRfcnhfc3RyZWFtcyA9IDI7CisJCXJlcS5wcmVmZXJyZWRfdHhfc3RyZWFtcyA9IDI7CisJfSBlbHNlIHsKKwkJcmVxLnByZWZlcnJlZF9yeF9zdHJlYW1zID0gMTsKKwkJcmVxLnByZWZlcnJlZF90eF9zdHJlYW1zID0gMTsKKwl9CisKKwlXTUFfTE9HRCgiJXM6IGNoYW4gJWQgY2hhbl93aWR0aCAlZCIsIF9fZnVuY19fLCByZXEuY2hhbiwKKwkJIHJlcS5jaGFuX3dpZHRoKTsKKwlXTUFfTE9HRCgiJXM6IHNzaWQgPSAlcyIsIF9fZnVuY19fLCByZXEuc3NpZC5zc0lkKTsKKworCXN0YXR1cyA9IHdtYV92ZGV2X3N0YXJ0KHdtYSwgJnJlcSwgZmFsc2UpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCXdtYV9yZW1vdmVfdmRldl9yZXEod21hLCB2ZGV2X2lkLAorCQkJCSAgICBXTUFfVEFSR0VUX1JFUV9UWVBFX1ZERVZfU1RBUlQpOworCQlnb3RvIHBlZXJfY2xlYW51cDsKKwl9CisJV01BX0xPR0QoIiVzOiB2ZGV2IHN0YXJ0IHJlcXVlc3QgZm9yIElCU1Mgc2VudCB0byB0YXJnZXQiLCBfX2Z1bmNfXyk7CisKKwkvKiBJbml0aWFsaXplIHByb3RlY3Rpb24gbW9kZSB0byBubyBwcm90ZWN0aW9uICovCisJaWYgKHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkgICAgV01JX1ZERVZfUEFSQU1fUFJPVEVDVElPTl9NT0RFLAorCQkJCQkgICAgSUVFRTgwMjExX1BST1RfTk9ORSkpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIHByb3RlY3Rpb24gbW9kZSIpOworCX0KKworCXJldHVybjsKKworcGVlcl9jbGVhbnVwOgorCWlmIChwZWVyKSB7CisJCXdtYV9yZW1vdmVfcGVlcih3bWEsIGFkZF9ic3MtPmJzc0lkLCB2ZGV2X2lkLCBwZWVyLCBmYWxzZSk7CisJfQorc2VuZF9mYWlsX3Jlc3A6CisJYWRkX2Jzcy0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJd21hX3NlbmRfbXNnKHdtYSwgV01BX0FERF9CU1NfUlNQLCAodm9pZCAqKWFkZF9ic3MsIDApOworfQorI2VuZGlmIC8qIFFDQV9JQlNTX1NVUFBPUlQgKi8KKworLyoqCisgKiB3bWFfYWRkX2Jzc19zdGFfbW9kZSgpIC0gIHByb2Nlc3MgYWRkIGJzcyByZXF1ZXN0IGluIHN0YSBtb2RlCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAYWRkX2JzczogYWRkIGJzcyBwYXJhbWV0ZXJzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9hZGRfYnNzX3N0YV9tb2RlKHRwX3dtYV9oYW5kbGUgd21hLCB0cEFkZEJzc1BhcmFtcyBhZGRfYnNzKQoreworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldjsKKwlzdHJ1Y3Qgd21hX3ZkZXZfc3RhcnRfcmVxIHJlcTsKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKm1zZzsKKwl1aW50OF90IHZkZXZfaWQsIHBlZXJfaWQ7CisJb2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyOworCUNERl9TVEFUVVMgc3RhdHVzOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcHBzX3ZhbCA9IDA7CisJYm9vbCByb2FtX3N5bmNoX2luX3Byb2dyZXNzID0gZmFsc2U7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKwlzdHJ1Y3Qgc2lyX2h3X21vZGVfcGFyYW1zIGh3X21vZGUgPSB7MH07CisJYm9vbCBwZWVyX2Fzc29jX3NlbnQgPSBmYWxzZTsKKworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJV01BX0xPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IFBFIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gc2VuZF9mYWlsX3Jlc3A7CisJfQorCisJcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCisJaWYgKE5VTEwgPT0gcGRldikgeworCQlXTUFfTE9HRSgiJXMgRmFpbGVkIHRvIGdldCBwZGV2IiwgX19mdW5jX18pOworCQlnb3RvIHNlbmRfZmFpbF9yZXNwOworCX0KKworCXZkZXZfaWQgPSBhZGRfYnNzLT5zdGFDb250ZXh0LnNtZXNlc3Npb25JZDsKKwlpZmFjZSA9ICZ3bWEtPmludGVyZmFjZXNbdmRldl9pZF07CisKKwl3bWFfc2V0X2Jzc19yYXRlX2ZsYWdzKGlmYWNlLCBhZGRfYnNzKTsKKwlpZiAoYWRkX2Jzcy0+b3Blck1vZGUpIHsKKwkJLyogU2F2ZSBwYXJhbWV0ZXJzIGxhdGVyIG5lZWRlZCBieSBXTUFfQUREX1NUQV9SRVEgKi8KKwkJaWYgKGlmYWNlLT5hZGRCc3NTdGFDb250ZXh0KSB7CisJCQljZGZfbWVtX2ZyZWUoaWZhY2UtPmFkZEJzc1N0YUNvbnRleHQpOworCQl9CisJCWlmYWNlLT5hZGRCc3NTdGFDb250ZXh0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBZGRTdGFQYXJhbXMpKTsKKwkJaWYgKCFpZmFjZS0+YWRkQnNzU3RhQ29udGV4dCkgeworCQkJV01BX0xPR0UoIiVzIEZhaWxlZCB0byBhbGxvY2F0IG1lbW9yeSIsIF9fZnVuY19fKTsKKwkJCWdvdG8gc2VuZF9mYWlsX3Jlc3A7CisJCX0KKwkJY2RmX21lbV9jb3B5KGlmYWNlLT5hZGRCc3NTdGFDb250ZXh0LCAmYWRkX2Jzcy0+c3RhQ29udGV4dCwKKwkJCSAgICAgc2l6ZW9mKHRBZGRTdGFQYXJhbXMpKTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKwkJaWYgKGlmYWNlLT5zdGFLZXlQYXJhbXMpIHsKKwkJCWNkZl9tZW1fZnJlZShpZmFjZS0+c3RhS2V5UGFyYW1zKTsKKwkJCWlmYWNlLT5zdGFLZXlQYXJhbXMgPSBOVUxMOworCQl9CisJCWlmIChhZGRfYnNzLT5leHRTZXRTdGFLZXlQYXJhbVZhbGlkKSB7CisJCQlpZmFjZS0+c3RhS2V5UGFyYW1zID0KKwkJCQljZGZfbWVtX21hbGxvYyhzaXplb2YodFNldFN0YUtleVBhcmFtcykpOworCQkJaWYgKCFpZmFjZS0+c3RhS2V5UGFyYW1zKSB7CisJCQkJV01BX0xPR0UoIiVzIEZhaWxlZCB0byBhbGxvY2F0IG1lbW9yeSIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQkJZ290byBzZW5kX2ZhaWxfcmVzcDsKKwkJCX0KKwkJCWNkZl9tZW1fY29weShpZmFjZS0+c3RhS2V5UGFyYW1zLAorCQkJCSAgICAgJmFkZF9ic3MtPmV4dFNldFN0YUtleVBhcmFtLAorCQkJCSAgICAgc2l6ZW9mKHRTZXRTdGFLZXlQYXJhbXMpKTsKKwkJfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisJCS8qIFNhdmUgcGFyYW1ldGVycyBsYXRlciBuZWVkZWQgYnkgV01BX0FERF9TVEFfUkVRICovCisJCWlmYWNlLT5ybWZFbmFibGVkID0gYWRkX2Jzcy0+cm1mRW5hYmxlZDsKKwkJaWZhY2UtPmJlYWNvbkludGVydmFsID0gYWRkX2Jzcy0+YmVhY29uSW50ZXJ2YWw7CisJCWlmYWNlLT5kdGltUGVyaW9kID0gYWRkX2Jzcy0+ZHRpbVBlcmlvZDsKKwkJaWZhY2UtPmxsYkNvZXhpc3QgPSBhZGRfYnNzLT5sbGJDb2V4aXN0OworCQlpZmFjZS0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCA9IGFkZF9ic3MtPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQ7CisJCWlmYWNlLT5ud1R5cGUgPSBhZGRfYnNzLT5ud1R5cGU7CisJCWlmIChhZGRfYnNzLT5ub25Sb2FtUmVhc3NvYykgeworCQkJcGVlciA9IG9sX3R4cnhfZmluZF9wZWVyX2J5X2FkZHIocGRldiwgYWRkX2Jzcy0+YnNzSWQsCisJCQkJCQkJICAmcGVlcl9pZCk7CisJCQlpZiAocGVlcikgeworCQkJCWFkZF9ic3MtPnN0YUNvbnRleHQuc3RhSWR4ID0KKwkJCQkJb2xfdHhyeF9sb2NhbF9wZWVyX2lkKHBlZXIpOworCQkJCWdvdG8gc2VuZF9ic3NfcmVzcDsKKwkJCX0KKwkJfQorCQlpZiAoYWRkX2Jzcy0+cmVhc3NvY1JlcSkgeworI2lmIGRlZmluZWQoUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wpIHx8IGRlZmluZWQoUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMikKKwkJCW9sX3R4cnhfdmRldl9oYW5kbGUgdmRldjsKKyNlbmRpZgorCQkJLyogQ2FsbGVkIGluIHByZWFzc29jIHN0YXRlLiBCU1NJRCBwZWVyIGlzIGFscmVhZHkgYWRkZWQgYnkgc2V0X2xpbmtzdGF0ZSAqLworCQkJcGVlciA9IG9sX3R4cnhfZmluZF9wZWVyX2J5X2FkZHIocGRldiwgYWRkX2Jzcy0+YnNzSWQsCisJCQkJCQkJICAmcGVlcl9pZCk7CisJCQlpZiAoIXBlZXIpIHsKKwkJCQlXTUFfTE9HRSgiJXMgRmFpbGVkIHRvIGZpbmQgcGVlciAlcE0iLCBfX2Z1bmNfXywKKwkJCQkJIGFkZF9ic3MtPmJzc0lkKTsKKwkJCQlnb3RvIHNlbmRfZmFpbF9yZXNwOworCQkJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkJCWlmIChpZmFjZS0+cm9hbV9zeW5jaF9pbl9wcm9ncmVzcykgeworCQkJCWFkZF9ic3MtPnN0YUNvbnRleHQuc3RhSWR4ID0KKwkJCQkJb2xfdHhyeF9sb2NhbF9wZWVyX2lkKHBlZXIpOworCQkJCWdvdG8gc2VuZF9ic3NfcmVzcDsKKwkJCX0KKyNlbmRpZgorCQkJbXNnID0gd21hX2ZpbGxfdmRldl9yZXEod21hLCB2ZGV2X2lkLCBXTUFfQUREX0JTU19SRVEsCisJCQkJCQlXTUFfVEFSR0VUX1JFUV9UWVBFX1ZERVZfU1RBUlQsCisJCQkJCQlhZGRfYnNzLAorCQkJCQkJV01BX1ZERVZfU1RBUlRfUkVRVUVTVF9USU1FT1VUKTsKKwkJCWlmICghbXNnKSB7CisJCQkJV01BX0xPR1AoIiVzIEZhaWxlZCB0byBhbGxvY2F0ZSB2ZGV2IHJlcXVlc3QgdmRldl9pZCAlZCIsCisJCQkJCV9fZnVuY19fLCB2ZGV2X2lkKTsKKwkJCQlnb3RvIHBlZXJfY2xlYW51cDsKKwkJCX0KKworCQkJYWRkX2Jzcy0+c3RhQ29udGV4dC5zdGFJZHggPQorCQkJCW9sX3R4cnhfbG9jYWxfcGVlcl9pZChwZWVyKTsKKworCQkJY2RmX21lbV96ZXJvKCZyZXEsIHNpemVvZihyZXEpKTsKKwkJCXJlcS52ZGV2X2lkID0gdmRldl9pZDsKKwkJCXJlcS5jaGFuID0gYWRkX2Jzcy0+Y3VycmVudE9wZXJDaGFubmVsOworCQkJcmVxLmNoYW5fd2lkdGggPSBhZGRfYnNzLT5jaF93aWR0aDsKKwkJCXJlcS5jaF9jZW50ZXJfZnJlcV9zZWcwID0gYWRkX2Jzcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMDsKKwkJCXJlcS5jaF9jZW50ZXJfZnJlcV9zZWcxID0gYWRkX2Jzcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMTsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwkJCXJlcS5tYXhfdHhwb3cgPSBhZGRfYnNzLT5tYXhUeFBvd2VyOworI2Vsc2UKKwkJCXJlcS5tYXhfdHhwb3cgPSAwOworI2VuZGlmCisJCQlyZXEuYmVhY29uX2ludHZhbCA9IGFkZF9ic3MtPmJlYWNvbkludGVydmFsOworCQkJcmVxLmR0aW1fcGVyaW9kID0gYWRkX2Jzcy0+ZHRpbVBlcmlvZDsKKwkJCXJlcS5oaWRkZW5fc3NpZCA9IGFkZF9ic3MtPmJIaWRkZW5TU0lERW47CisJCQlyZXEuaXNfZGZzID0gYWRkX2Jzcy0+YlNwZWN0cnVtTWd0RW5hYmxlZDsKKwkJCXJlcS5zc2lkLmxlbmd0aCA9IGFkZF9ic3MtPnNzSWQubGVuZ3RoOworCQkJcmVxLm9wZXJfbW9kZSA9IEJTU19PUEVSQVRJT05BTF9NT0RFX1NUQTsKKwkJCWlmIChyZXEuc3NpZC5sZW5ndGggPiAwKQorCQkJCWNkZl9tZW1fY29weShyZXEuc3NpZC5zc0lkLCBhZGRfYnNzLT5zc0lkLnNzSWQsCisJCQkJCSAgICAgYWRkX2Jzcy0+c3NJZC5sZW5ndGgpOworCQkJc3RhdHVzID0gd21hX2dldF9jdXJyZW50X2h3X21vZGUoJmh3X21vZGUpOworCQkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCQlXTUFfTE9HRSgid21hX2dldF9jdXJyZW50X2h3X21vZGUgZmFpbGVkIik7CisKKwkJCWlmICgoYWRkX2Jzcy0+bnNzID09IDIpICYmICFod19tb2RlLmRic19jYXApIHsKKwkJCQlyZXEucHJlZmVycmVkX3J4X3N0cmVhbXMgPSAyOworCQkJCXJlcS5wcmVmZXJyZWRfdHhfc3RyZWFtcyA9IDI7CisJCQl9IGVsc2UgeworCQkJCXJlcS5wcmVmZXJyZWRfcnhfc3RyZWFtcyA9IDE7CisJCQkJcmVxLnByZWZlcnJlZF90eF9zdHJlYW1zID0gMTsKKwkJCX0KKworCQkJc3RhdHVzID0gd21hX3ZkZXZfc3RhcnQod21hLCAmcmVxLCBmYWxzZSk7CisJCQlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJCXdtYV9yZW1vdmVfdmRldl9yZXEod21hLCB2ZGV2X2lkLAorCQkJCQkJICAgIFdNQV9UQVJHRVRfUkVRX1RZUEVfVkRFVl9TVEFSVCk7CisJCQkJZ290byBwZWVyX2NsZWFudXA7CisJCQl9CisjaWYgZGVmaW5lZChRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCkgfHwgZGVmaW5lZChRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyKQorCQkJdmRldiA9IHdtYV9maW5kX3ZkZXZfYnlfaWQod21hLCB2ZGV2X2lkKTsKKwkJCWlmICghdmRldikgeworCQkJCVdNQV9MT0dFKCIlcyBJbnZhbGlkIHR4cnggdmRldiIsIF9fZnVuY19fKTsKKwkJCQlnb3RvIHBlZXJfY2xlYW51cDsKKwkJCX0KKwkJCW9sX3R4cnhfdmRldl9wYXVzZSh2ZGV2LAorCQkJCQkgICBPTF9UWFFfUEFVU0VfUkVBU09OX1BFRVJfVU5BVVRIT1JJWkVEKTsKKyNlbmRpZgorCQkJLyogQUREX0JTU19SRVNQIHdpbGwgYmUgZGVmZXJyZWQgdG8gY29tcGxldGlvbiBvZiBWREVWX1NUQVJUICovCisKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIWFkZF9ic3MtPnVwZGF0ZUJzcykgeworCQkJZ290byBzZW5kX2Jzc19yZXNwOworCisJCX0KKwkJLyogVXBkYXRlIHBlZXIgc3RhdGUgKi8KKwkJaWYgKGFkZF9ic3MtPnN0YUNvbnRleHQuZW5jcnlwdFR5cGUgPT0gZVNJUl9FRF9OT05FKSB7CisJCQlXTUFfTE9HRCgiJXM6IFVwZGF0ZSBwZWVyKCVwTSkgc3RhdGUgaW50byBhdXRoIiwKKwkJCQkgX19mdW5jX18sIGFkZF9ic3MtPmJzc0lkKTsKKwkJCW9sX3R4cnhfcGVlcl9zdGF0ZV91cGRhdGUocGRldiwgYWRkX2Jzcy0+YnNzSWQsCisJCQkJCQkgIG9sX3R4cnhfcGVlcl9zdGF0ZV9hdXRoKTsKKwkJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MKSB8fCBkZWZpbmVkKFFDQV9MTF9UWF9GTE9XX0NPTlRST0xfVjIpCisJCQlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXY7CisjZW5kaWYKKwkJCVdNQV9MT0dEKCIlczogVXBkYXRlIHBlZXIoJXBNKSBzdGF0ZSBpbnRvIGNvbm4iLAorCQkJCSBfX2Z1bmNfXywgYWRkX2Jzcy0+YnNzSWQpOworCQkJb2xfdHhyeF9wZWVyX3N0YXRlX3VwZGF0ZShwZGV2LCBhZGRfYnNzLT5ic3NJZCwKKwkJCQkJCSAgb2xfdHhyeF9wZWVyX3N0YXRlX2Nvbm4pOworI2lmIGRlZmluZWQoUUNBX0xMX0xFR0FDWV9UWF9GTE9XX0NPTlRST0wpIHx8IGRlZmluZWQoUUNBX0xMX1RYX0ZMT1dfQ09OVFJPTF9WMikKKwkJCXBlZXIgPSBvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyKHBkZXYsIGFkZF9ic3MtPmJzc0lkLAorCQkJCQkJCSAgJnBlZXJfaWQpOworCQkJaWYgKCFwZWVyKSB7CisJCQkJV01BX0xPR0UoIiVzOiVkIEZhaWxlZCB0byBmaW5kIHBlZXIgJXBNIiwKKwkJCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgYWRkX2Jzcy0+YnNzSWQpOworCQkJCWdvdG8gc2VuZF9mYWlsX3Jlc3A7CisJCQl9CisKKwkJCXZkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2lkKHdtYSwgdmRldl9pZCk7CisJCQlpZiAoIXZkZXYpIHsKKwkJCQlXTUFfTE9HRSgiJXMgSW52YWxpZCB0eHJ4IHZkZXYiLCBfX2Z1bmNfXyk7CisJCQkJZ290byBwZWVyX2NsZWFudXA7CisJCQl9CisJCQlvbF90eHJ4X3ZkZXZfcGF1c2UodmRldiwKKwkJCQkJICBPTF9UWFFfUEFVU0VfUkVBU09OX1BFRVJfVU5BVVRIT1JJWkVEKTsKKyNlbmRpZgorCQl9CisKKwkJd21pX3VuaWZpZWRfc2VuZF90eGJmKHdtYSwgJmFkZF9ic3MtPnN0YUNvbnRleHQpOworCisJCXBwc192YWwgPQorCQkJKChwTWFjLT4KKwkJCSAgZW5hYmxlNWdFQlQgPDwgMzEpICYgMHhmZmZmMDAwMCkgfCAoUEtUX1BXUl9TQVZFXzVHX0VCVCAmCisJCQkJCQkJICAgICAgMHhmZmZmKTsKKwkJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJCQkJV01JX1ZERVZfUEFSQU1fUEFDS0VUX1BPV0VSU0FWRSwKKwkJCQkJCQlwcHNfdmFsKTsKKwkJaWYgKHJldCkKKwkJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCB3bWkgcGFja2V0IHBvd2VyIHNhdmUgY21kIik7CisJCWVsc2UKKwkJCVdNQV9MT0dEKCJTZW50IFBLVF9QV1JfU0FWRV81R19FQlQgY21kIHRvIHRhcmdldCwgdmFsID0gJXgsIHJldCA9ICVkIiwKKwkJCQlwcHNfdmFsLCByZXQpOworCisJCXdtaV91bmlmaWVkX3NlbmRfcGVlcl9hc3NvYyh3bWEsIGFkZF9ic3MtPm53VHlwZSwKKwkJCQkJICAgICZhZGRfYnNzLT5zdGFDb250ZXh0KTsKKwkJcGVlcl9hc3NvY19zZW50ID0gdHJ1ZTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJCWlmIChhZGRfYnNzLT5ybWZFbmFibGVkKSB7CisJCQkvKiB3aGVuIDgwMi4xMXcgUE1GIGlzIGVuYWJsZWQgZm9yIGh3IGVuY3IvZGVjcgorCQkJICAgdXNlIGh3IE1GUCBRb3MgYml0cyAweDEwICovCisJCQlyZXQgPSB3bWlfdW5pZmllZF9wZGV2X3NldF9wYXJhbSh3bWEtPndtaV9oYW5kbGUsCisJCQkJCQkJIFdNSV9QREVWX1BBUkFNX1BNRl9RT1MsCisJCQkJCQkJIHRydWUpOworCQkJaWYgKHJldCkgeworCQkJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNldCBRT1MgTUZQL1BNRiAoJWQpIiwKKwkJCQkJIF9fZnVuY19fLCByZXQpOworCQkJfSBlbHNlIHsKKwkJCQlXTUFfTE9HSSgiJXM6IFFPUyBNRlAvUE1GIHNldCB0byAlZCIsCisJCQkJCSBfX2Z1bmNfXywgdHJ1ZSk7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFXICovCisKKwkJd21hX3ZkZXZfc2V0X2Jzc19wYXJhbXMod21hLCBhZGRfYnNzLT5zdGFDb250ZXh0LnNtZXNlc3Npb25JZCwKKwkJCQkJYWRkX2Jzcy0+YmVhY29uSW50ZXJ2YWwsCisJCQkJCWFkZF9ic3MtPmR0aW1QZXJpb2QsCisJCQkJCWFkZF9ic3MtPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQsCisJCQkJCWFkZF9ic3MtPmxsYkNvZXhpc3QsCisJCQkJCWFkZF9ic3MtPm1heFR4UG93ZXIpOworCisJCS8qCisJCSAqIFN0b3JlIHRoZSBic3NpZCBpbiBpbnRlcmZhY2UgdGFibGUsIGJzc2lkIHdpbGwKKwkJICogYmUgdXNlZCBkdXJpbmcgZ3JvdXAga2V5IHNldHRpbmcgc3RhIG1vZGUuCisJCSAqLworCQljZGZfbWVtX2NvcHkoaWZhY2UtPmJzc2lkLCBhZGRfYnNzLT5ic3NJZCwgSUVFRTgwMjExX0FERFJfTEVOKTsKKworCX0KK3NlbmRfYnNzX3Jlc3A6CisJb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcihwZGV2LCBhZGRfYnNzLT5ic3NJZCwKKwkJCQkgICZhZGRfYnNzLT5zdGFDb250ZXh0LnN0YUlkeCk7CisJYWRkX2Jzcy0+c3RhdHVzID0gKGFkZF9ic3MtPnN0YUNvbnRleHQuc3RhSWR4IDwgMCkgPworCQkJICBDREZfU1RBVFVTX0VfRkFJTFVSRSA6IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlhZGRfYnNzLT5ic3NJZHggPSBhZGRfYnNzLT5zdGFDb250ZXh0LnNtZXNlc3Npb25JZDsKKwljZGZfbWVtX2NvcHkoYWRkX2Jzcy0+c3RhQ29udGV4dC5zdGFNYWMsIGFkZF9ic3MtPmJzc0lkLAorCQkgICAgIHNpemVvZihhZGRfYnNzLT5zdGFDb250ZXh0LnN0YU1hYykpOworCisJaWYgKCFXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCSAgICBXTUlfU0VSVklDRV9QRUVSX0FTU09DX0NPTkYpKSB7CisJCVdNQV9MT0dFKEZMKCJXTUlfU0VSVklDRV9QRUVSX0FTU09DX0NPTkYgbm90IGVuYWJsZWQiKSk7CisJCWdvdG8gc2VuZF9maW5hbF9yc3A7CisJfQorCisJLyogSW4gY2FzZSBvZiByZWFzc29jLCBwZWVyIGFzc29jIGNtZCB3aWxsIG5vdCBiZSBzZW50ICovCisJaWYgKCFwZWVyX2Fzc29jX3NlbnQpCisJCWdvdG8gc2VuZF9maW5hbF9yc3A7CisKKwltc2cgPSB3bWFfZmlsbF9ob2xkX3JlcSh3bWEsIHZkZXZfaWQsIFdNQV9BRERfQlNTX1JFUSwKKwkJCSAgIFdNQV9QRUVSX0FTU09DX0NORl9TVEFSVCwgYWRkX2JzcywKKwkJCSAgIFdNQV9QRUVSX0FTU09DX1RJTUVPVVQpOworCWlmICghbXNnKSB7CisJCVdNQV9MT0dQKEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWVzdCBmb3IgdmRldl9pZCAlZCIpLAorCQkJIHZkZXZfaWQpOworCQl3bWFfcmVtb3ZlX3JlcSh3bWEsIHZkZXZfaWQsIFdNQV9QRUVSX0FTU09DX0NORl9TVEFSVCk7CisJCWdvdG8gcGVlcl9jbGVhbnVwOworCX0KKwlyZXR1cm47CisKK3NlbmRfZmluYWxfcnNwOgorCVdNQV9MT0dEKCIlczogb3Blcm1vZGUgJWQgdXBkYXRlX2JzcyAlZCBud190eXBlICVkIGJzc2lkICVwTSIKKwkJICIgc3RhSWR4ICVkIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBhZGRfYnNzLT5vcGVyTW9kZSwKKwkJIGFkZF9ic3MtPnVwZGF0ZUJzcywgYWRkX2Jzcy0+bndUeXBlLCBhZGRfYnNzLT5ic3NJZCwKKwkJIGFkZF9ic3MtPnN0YUNvbnRleHQuc3RhSWR4LCBhZGRfYnNzLT5zdGF0dXMpOworCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9BRERfQlNTX1JTUCwgKHZvaWQgKilhZGRfYnNzLCAwKTsKKwlyZXR1cm47CisKK3BlZXJfY2xlYW51cDoKKwl3bWFfcmVtb3ZlX3BlZXIod21hLCBhZGRfYnNzLT5ic3NJZCwgdmRldl9pZCwgcGVlciwKKwkJCXJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MpOworc2VuZF9mYWlsX3Jlc3A6CisJYWRkX2Jzcy0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJd21hX3NlbmRfbXNnKHdtYSwgV01BX0FERF9CU1NfUlNQLCAodm9pZCAqKWFkZF9ic3MsIDApOworfQorCisvKioKKyAqIHdtYV9hZGRfYnNzKCkgLSBBZGQgQlNTIHJlcXVlc3QgdG8gZncgYXMgcGVyIG9wbW9kZQorICogQHdtYTogd21hIGhhbmRsZQorICogQHBhcmFtczogYWRkIGJzcyBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfYWRkX2Jzcyh0cF93bWFfaGFuZGxlIHdtYSwgdHBBZGRCc3NQYXJhbXMgcGFyYW1zKQoreworCVdNQV9MT0dEKCIlczogYWRkX2Jzc19wYXJhbS5oYWxQZXJzb25hID0gJWQiLAorCQkgX19mdW5jX18sIHBhcmFtcy0+aGFsUGVyc29uYSk7CisKKwlzd2l0Y2ggKHBhcmFtcy0+aGFsUGVyc29uYSkgeworCisJY2FzZSBDREZfU0FQX01PREU6CisJY2FzZSBDREZfUDJQX0dPX01PREU6CisJCS8qSWYgY3VycmVudCBicmluZyB1cCBTQVAvUDJQIGNoYW5uZWwgbWF0Y2hlcyB0aGUgcHJldmlvdXMKKwkJICpyYWRhciBmb3VuZCBjaGFubmVsIHRoZW4gcmVzZXQgdGhlIGxhc3RfcmFkYXJfZm91bmRfY2hhbgorCQkgKnZhcmlhYmxlIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucy4KKwkJICovCisJCWlmIChwYXJhbXMtPmN1cnJlbnRPcGVyQ2hhbm5lbCA9PQorCQkJd21hLT5kZnNfaWMtPmxhc3RfcmFkYXJfZm91bmRfY2hhbikKKwkJCXdtYS0+ZGZzX2ljLT5sYXN0X3JhZGFyX2ZvdW5kX2NoYW4gPSAwOworCisJCXdtYV9hZGRfYnNzX2FwX21vZGUod21hLCBwYXJhbXMpOworCQlicmVhazsKKworI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwljYXNlIENERl9JQlNTX01PREU6CisJCXdtYV9hZGRfYnNzX2lic3NfbW9kZSh3bWEsIHBhcmFtcyk7CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQl3bWFfYWRkX2Jzc19zdGFfbW9kZSh3bWEsIHBhcmFtcyk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiB3bWlfdW5pZmllZF92ZGV2X3VwX3NlbmQoKSAtIHNlbmQgdmRldiB1cCBjb21tYW5kIGluIGZ3CisgKiBAd21pOiB3bWkgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQGFpZDogYXNzb2NpYXRpb24gSUQKKyAqIEBic3NpZDogYnNzaWQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21pX3VuaWZpZWRfdmRldl91cF9zZW5kKHdtaV91bmlmaWVkX3Qgd21pLAorCQkJICAgICB1aW50OF90IHZkZXZfaWQsIHVpbnQxNl90IGFpZCwKKwkJCSAgICAgdWludDhfdCBic3NpZFtJRUVFODAyMTFfQUREUl9MRU5dKQoreworCXdtaV92ZGV2X3VwX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisKKwlXTUFfTE9HRCgiJXM6IFZERVZfVVAiLCBfX2Z1bmNfXyk7CisJV01BX0xPR0QoIiVzOiB2ZGV2X2lkICVkIGFpZCAlZCBic3NpZCAlcE0iLCBfX2Z1bmNfXywKKwkJIHZkZXZfaWQsIGFpZCwgYnNzaWQpOworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21pLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dQKCIlczogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljbWQgPSAod21pX3ZkZXZfdXBfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3VwX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfdmRldl91cF9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSB2ZGV2X2lkOworCWNtZC0+dmRldl9hc3NvY19pZCA9IGFpZDsKKwlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUihic3NpZCwgJmNtZC0+dmRldl9ic3NpZCk7CisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtaSwgYnVmLCBsZW4sIFdNSV9WREVWX1VQX0NNRElEKSkgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byBzZW5kIHZkZXYgdXAgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZShidWYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX2FkZF9zdGFfcmVxX2FwX21vZGUoKSAtIHByb2Nlc3MgYWRkIHN0YSByZXF1ZXN0IGluIGFwIG1vZGUKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBhZGRfc3RhOiBhZGQgc3RhIHBhcmFtcworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfYWRkX3N0YV9yZXFfYXBfbW9kZSh0cF93bWFfaGFuZGxlIHdtYSwgdHBBZGRTdGFQYXJhbXMgYWRkX3N0YSkKK3sKKwllbnVtIG9sX3R4cnhfcGVlcl9zdGF0ZSBzdGF0ZSA9IG9sX3R4cnhfcGVlcl9zdGF0ZV9jb25uOworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldjsKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXY7CisJb2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyOworCXVpbnQ4X3QgcGVlcl9pZDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwlpbnQzMl90IHJldDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlID0gTlVMTDsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFXICovCisJc3RydWN0IHdtYV90YXJnZXRfcmVxICptc2c7CisJYm9vbCBwZWVyX2Fzc29jX2NuZiA9IGZhbHNlOworCisJcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCisJaWYgKE5VTEwgPT0gcGRldikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHBkZXYiLCBfX2Z1bmNfXyk7CisJCWFkZF9zdGEtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIHNlbmRfcnNwOworCX0KKwkvKiBVTUFDIHNlbmRzIFdNQV9BRERfU1RBX1JFUSBtc2cgdHdpY2UgdG8gV01BIHdoZW4gdGhlIHN0YXRpb24KKwkgKiBhc3NvY2lhdGVzLiBGaXJzdCBXTUFfQUREX1NUQV9SRVEgd2lsbCBoYXZlIHN0YVR5cGUgYXMKKwkgKiBTVEFfRU5UUllfUEVFUiBhbmQgc2Vjb25kIHBvc3Rpbmcgd2lsbCBoYXZlIFNUQV9FTlRSWV9TRUxGLgorCSAqIFBlZXIgY3JlYXRpb24gaXMgZG9uZSBpbiBmaXJzdCBXTUFfQUREX1NUQV9SRVEgYW5kIHNlY29uZAorCSAqIFdNQV9BRERfU1RBX1JFUSB3aGljaCBoYXMgU1RBX0VOVFJZX1NFTEYgaXMgaWdub3JlZCBhbmQKKwkgKiBzZW5kIGZha2UgcmVzcG9uc2Ugd2l0aCBzdWNjZXNzIHRvIFVNQUMuIE90aGVyd2lzZSBVTUFDCisJICogd2lsbCBnZXQgYmxvY2tlZC4KKwkgKi8KKwlpZiAoYWRkX3N0YS0+c3RhVHlwZSAhPSBTVEFfRU5UUllfUEVFUikgeworCQlhZGRfc3RhLT5zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCWdvdG8gc2VuZF9yc3A7CisJfQorCisJdmRldiA9IHdtYV9maW5kX3ZkZXZfYnlfaWQod21hLCBhZGRfc3RhLT5zbWVzZXNzaW9uSWQpOworCWlmICghdmRldikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHZkZXYiLCBfX2Z1bmNfXyk7CisJCWFkZF9zdGEtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIHNlbmRfcnNwOworCX0KKworCXBlZXIgPSBvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyX2FuZF92ZGV2KHBkZXYsCisJCQkJCQkgIHZkZXYsCisJCQkJCQkgIGFkZF9zdGEtPnN0YU1hYywgJnBlZXJfaWQpOworCWlmIChwZWVyKSB7CisJCXdtYV9yZW1vdmVfcGVlcih3bWEsIGFkZF9zdGEtPnN0YU1hYywgYWRkX3N0YS0+c21lc2Vzc2lvbklkLAorCQkJCXBlZXIsIGZhbHNlKTsKKwkJV01BX0xPR0UoIiVzOiBQZWVyIGFscmVhZHkgZXhpc3RzLCBEZWxldGVkIHBlZXIgd2l0aCBwZWVyX2FkZHIgJXBNIiwKKwkJCV9fZnVuY19fLCBhZGRfc3RhLT5zdGFNYWMpOworCX0KKworCXN0YXR1cyA9IHdtYV9jcmVhdGVfcGVlcih3bWEsIHBkZXYsIHZkZXYsIGFkZF9zdGEtPnN0YU1hYywKKwkJCQkgV01JX1BFRVJfVFlQRV9ERUZBVUxULCBhZGRfc3RhLT5zbWVzZXNzaW9uSWQsCisJCQkJIGZhbHNlKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgcGVlciBmb3IgJXBNIiwKKwkJCSBfX2Z1bmNfXywgYWRkX3N0YS0+c3RhTWFjKTsKKwkJYWRkX3N0YS0+c3RhdHVzID0gc3RhdHVzOworCQlnb3RvIHNlbmRfcnNwOworCX0KKworCXBlZXIgPSBvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyX2FuZF92ZGV2KHBkZXYsCisJCQkJCQkgIHZkZXYsCisJCQkJCQkgIGFkZF9zdGEtPnN0YU1hYywgJnBlZXJfaWQpOworCWlmICghcGVlcikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHBlZXIgaGFuZGxlIHVzaW5nIHBlZXIgbWFjICVwTSIsCisJCQkgX19mdW5jX18sIGFkZF9zdGEtPnN0YU1hYyk7CisJCWFkZF9zdGEtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl3bWFfcmVtb3ZlX3BlZXIod21hLCBhZGRfc3RhLT5zdGFNYWMsIGFkZF9zdGEtPnNtZXNlc3Npb25JZCwKKwkJCQlwZWVyLCBmYWxzZSk7CisJCWdvdG8gc2VuZF9yc3A7CisJfQorCisJd21pX3VuaWZpZWRfc2VuZF90eGJmKHdtYSwgYWRkX3N0YSk7CisKKwlpZiAoV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWEtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkgICAgV01JX1NFUlZJQ0VfUEVFUl9BU1NPQ19DT05GKSkgeworCQlwZWVyX2Fzc29jX2NuZiA9IHRydWU7CisJCW1zZyA9IHdtYV9maWxsX2hvbGRfcmVxKHdtYSwgYWRkX3N0YS0+c21lc2Vzc2lvbklkLAorCQkJCSAgIFdNQV9BRERfU1RBX1JFUSwgV01BX1BFRVJfQVNTT0NfQ05GX1NUQVJULAorCQkJCSAgIGFkZF9zdGEsIFdNQV9QRUVSX0FTU09DX1RJTUVPVVQpOworCQlpZiAoIW1zZykgeworCQkJV01BX0xPR1AoRkwoIkZhaWxlZCB0byBhbGxvYyByZXF1ZXN0IGZvciB2ZGV2X2lkICVkIiksCisJCQkJIGFkZF9zdGEtPnNtZXNlc3Npb25JZCk7CisJCQlhZGRfc3RhLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCXdtYV9yZW1vdmVfcmVxKHdtYSwgYWRkX3N0YS0+c21lc2Vzc2lvbklkLAorCQkJCSAgICAgICBXTUFfUEVFUl9BU1NPQ19DTkZfU1RBUlQpOworCQkJd21hX3JlbW92ZV9wZWVyKHdtYSwgYWRkX3N0YS0+c3RhTWFjLAorCQkJCWFkZF9zdGEtPnNtZXNlc3Npb25JZCwgcGVlciwgZmFsc2UpOworCQkJcGVlcl9hc3NvY19jbmYgPSBmYWxzZTsKKwkJCWdvdG8gc2VuZF9yc3A7CisJCX0KKwl9IGVsc2UgeworCQlXTUFfTE9HRShGTCgiV01JX1NFUlZJQ0VfUEVFUl9BU1NPQ19DT05GIG5vdCBlbmFibGVkIikpOworCX0KKworCXJldCA9IHdtaV91bmlmaWVkX3NlbmRfcGVlcl9hc3NvYyh3bWEsIGFkZF9zdGEtPm53VHlwZSwgYWRkX3N0YSk7CisJaWYgKHJldCkgeworCQlhZGRfc3RhLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJd21hX3JlbW92ZV9wZWVyKHdtYSwgYWRkX3N0YS0+c3RhTWFjLCBhZGRfc3RhLT5zbWVzZXNzaW9uSWQsCisJCQkJcGVlciwgZmFsc2UpOworCQlnb3RvIHNlbmRfcnNwOworCX0KKyNpZmRlZiBRQ0FfSUJTU19TVVBQT1JUCisJLyoKKwkgKiBJbiBJQlNTIG1vZGUgc2VuZCB0aGUgcGVlcgorCSAqIEF0aW0gV2luZG93IGxlbmd0aCBpZiBJQlNTCisJICogcG93ZXIgc2F2ZSBpcyBlbmFibGVkIGJ5IHRoZQorCSAqIGZpcm13YXJlLgorCSAqLworCWlmICh3bWFfaXNfdmRldl9pbl9pYnNzX21vZGUod21hLCBhZGRfc3RhLT5zbWVzZXNzaW9uSWQpICYmCisJICAgIFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod21hLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJICAgV01JX1NFUlZJQ0VfSUJTU19QV1JTQVZFKSkgeworCQkvKgorCQkgKiBJZiBBVElNIFdpbmRvdyBpcyBwcmVzZW50IGluIHRoZSBwZWVyCisJCSAqIGJlYWNvbiB0aGVuIHNlbmQgaXQgdG8gZmlybXdhcmUgZWxzZQorCQkgKiBjb25maWd1cmUgWmVybyBBVElNIFdpbmRvdyBsZW5ndGggdG8KKwkJICogZmlybXdhcmUuCisJCSAqLworCQlpZiAoYWRkX3N0YS0+YXRpbUllUHJlc2VudCkgeworCQkJd21hX3NldF9wZWVyX3BhcmFtKHdtYSwgYWRkX3N0YS0+c3RhTWFjLAorCQkJCQkgICBXTUlfUEVFUl9JQlNTX0FUSU1fV0lORE9XX0xFTkdUSCwKKwkJCQkJICAgYWRkX3N0YS0+cGVlckF0aW1XaW5kb3dMZW5ndGgsCisJCQkJCSAgIGFkZF9zdGEtPnNtZXNlc3Npb25JZCk7CisJCX0gZWxzZSB7CisJCQl3bWFfc2V0X3BlZXJfcGFyYW0od21hLCBhZGRfc3RhLT5zdGFNYWMsCisJCQkJCSAgIFdNSV9QRUVSX0lCU1NfQVRJTV9XSU5ET1dfTEVOR1RILAorCQkJCQkgICAwLCBhZGRfc3RhLT5zbWVzZXNzaW9uSWQpOworCQl9CisJfQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJaWYgKGFkZF9zdGEtPnJtZkVuYWJsZWQpIHsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBzdG9yZSB0aGUgc3RhdGUgb2YgUE1GIGNvbm5lY3Rpb24KKwkJICogcGVyIFNUQSBmb3IgU0FQIGNhc2UKKwkJICogV2Ugd2lsbCBpc29sYXRlIHRoZSBpZmFjZXMgYmFzZWQgb24gdmRldmlkCisJCSAqLworCQlpZmFjZSA9ICZ3bWEtPmludGVyZmFjZXNbdmRldi0+dmRldl9pZF07CisJCWlmYWNlLT5ybWZFbmFibGVkID0gYWRkX3N0YS0+cm1mRW5hYmxlZDsKKwkJLyoKKwkJICogd2hlbiA4MDIuMTF3IFBNRiBpcyBlbmFibGVkIGZvciBodyBlbmNyL2RlY3IKKwkJICogdXNlIGh3IE1GUCBRb3MgYml0cyAweDEwCisJCSAqLworCQlyZXQgPSB3bWlfdW5pZmllZF9wZGV2X3NldF9wYXJhbSh3bWEtPndtaV9oYW5kbGUsCisJCQkJCQkgV01JX1BERVZfUEFSQU1fUE1GX1FPUywgdHJ1ZSk7CisJCWlmIChyZXQpIHsKKwkJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNldCBRT1MgTUZQL1BNRiAoJWQpIiwKKwkJCQkgX19mdW5jX18sIHJldCk7CisJCX0gZWxzZSB7CisJCQlXTUFfTE9HSSgiJXM6IFFPUyBNRlAvUE1GIHNldCB0byAlZCIsIF9fZnVuY19fLCB0cnVlKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFXICovCisKKwlpZiAoYWRkX3N0YS0+dUFQU0QpIHsKKwkJcmV0ID0gd21hX3NldF9hcF9wZWVyX3VhcHNkKHdtYSwgYWRkX3N0YS0+c21lc2Vzc2lvbklkLAorCQkJCQkgICAgYWRkX3N0YS0+c3RhTWFjLAorCQkJCQkgICAgYWRkX3N0YS0+dUFQU0QsIGFkZF9zdGEtPm1heFNQTGVuKTsKKwkJaWYgKHJldCkgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXQgcGVlciB1YXBzZCBwYXJhbSBmb3IgJXBNIiwKKwkJCQkgYWRkX3N0YS0+c3RhTWFjKTsKKwkJCWFkZF9zdGEtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJd21hX3JlbW92ZV9wZWVyKHdtYSwgYWRkX3N0YS0+c3RhTWFjLAorCQkJCQlhZGRfc3RhLT5zbWVzZXNzaW9uSWQsIHBlZXIsIGZhbHNlKTsKKwkJCWdvdG8gc2VuZF9yc3A7CisJCX0KKwl9CisKKwlXTUFfTE9HRCgiJXM6IE1vdmluZyBwZWVyICVwTSB0byBzdGF0ZSAlZCIsCisJCSBfX2Z1bmNfXywgYWRkX3N0YS0+c3RhTWFjLCBzdGF0ZSk7CisJb2xfdHhyeF9wZWVyX3N0YXRlX3VwZGF0ZShwZGV2LCBhZGRfc3RhLT5zdGFNYWMsIHN0YXRlKTsKKworCWFkZF9zdGEtPnN0YUlkeCA9IG9sX3R4cnhfbG9jYWxfcGVlcl9pZChwZWVyKTsKKwlhZGRfc3RhLT5zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CitzZW5kX3JzcDoKKwkvKiBEbyBub3Qgc2VuZCBhZGQgc3RhdCByZXNwIHdoZW4gcGVlciBhc3NvYyBjbmYgaXMgZW5hYmxlZCAqLworCWlmIChwZWVyX2Fzc29jX2NuZikgeworCQlXTUFfTE9HSShGTCgiV01JX1NFUlZJQ0VfUEVFUl9BU1NPQ19DT05GIGlzIGVuYWJsZWQiKSk7CisJCXJldHVybjsKKwl9CisKKwlXTUFfTE9HRShGTCgic3RhdHlwZSAlZCB2ZGV2X2lkICVkIGFpZCAlZCBic3NpZCAlcE0gc3RhSWR4ICVkIHN0YXR1cyAlZCIpLAorCQkgYWRkX3N0YS0+c3RhVHlwZSwgYWRkX3N0YS0+c21lc2Vzc2lvbklkLAorCQkgYWRkX3N0YS0+YXNzb2NJZCwgYWRkX3N0YS0+YnNzSWQsIGFkZF9zdGEtPnN0YUlkeCwKKwkJIGFkZF9zdGEtPnN0YXR1cyk7CisJd21hX3NlbmRfbXNnKHdtYSwgV01BX0FERF9TVEFfUlNQLCAodm9pZCAqKWFkZF9zdGEsIDApOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKy8qKgorICogd21hX2FkZF90ZGxzX3N0YSgpIC0gcHJvY2VzcyBhZGQgc3RhIHJlcXVlc3QgaW4gVERMUyBtb2RlCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAYWRkX3N0YTogYWRkIHN0YSBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX2FkZF90ZGxzX3N0YSh0cF93bWFfaGFuZGxlIHdtYSwgdHBBZGRTdGFQYXJhbXMgYWRkX3N0YSkKK3sKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXY7CisJb2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2OworCW9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlcjsKKwl1aW50OF90IHBlZXJfaWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJaW50MzJfdCByZXQ7CisJdFRkbHNQZWVyU3RhdGVQYXJhbXMgKnBlZXJTdGF0ZVBhcmFtczsKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKm1zZzsKKwlib29sIHBlZXJfYXNzb2NfY25mID0gZmFsc2U7CisKKwlXTUFfTE9HRCgiJXM6IHN0YVR5cGU6ICVkLCBzdGFJZHg6ICVkLCB1cGRhdGVTdGE6ICVkLCAiCisJCSAiYnNzSWQ6ICVwTSwgc3RhTWFjOiAlcE0iLAorCQkgX19mdW5jX18sIGFkZF9zdGEtPnN0YVR5cGUsIGFkZF9zdGEtPnN0YUlkeCwKKwkJIGFkZF9zdGEtPnVwZGF0ZVN0YSwgYWRkX3N0YS0+YnNzSWQsIGFkZF9zdGEtPnN0YU1hYyk7CisKKwlwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisKKwlpZiAoTlVMTCA9PSBwZGV2KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgcGRldiIsIF9fZnVuY19fKTsKKwkJYWRkX3N0YS0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gc2VuZF9yc3A7CisJfQorCisJdmRldiA9IHdtYV9maW5kX3ZkZXZfYnlfaWQod21hLCBhZGRfc3RhLT5zbWVzZXNzaW9uSWQpOworCWlmICghdmRldikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHZkZXYiLCBfX2Z1bmNfXyk7CisJCWFkZF9zdGEtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIHNlbmRfcnNwOworCX0KKworCWlmICgwID09IGFkZF9zdGEtPnVwZGF0ZVN0YSkgeworCQkvKiBpdHMgYSBhZGQgc3RhIHJlcXVlc3QgKiAqLworCQlXTUFfTE9HRCgiJXM6IGFkZFN0YSwgY2FsbGluZyB3bWFfY3JlYXRlX3BlZXIgZm9yICVwTSwgdmRldl9pZCAlaHUiLAorCQkJX19mdW5jX18sIGFkZF9zdGEtPnN0YU1hYywgYWRkX3N0YS0+c21lc2Vzc2lvbklkKTsKKworCQlzdGF0dXMgPSB3bWFfY3JlYXRlX3BlZXIod21hLCBwZGV2LCB2ZGV2LCBhZGRfc3RhLT5zdGFNYWMsCisJCQkJCSBXTUlfUEVFUl9UWVBFX1RETFMsCisJCQkJCSBhZGRfc3RhLT5zbWVzZXNzaW9uSWQsIGZhbHNlKTsKKwkJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBwZWVyIGZvciAlcE0iLAorCQkJCSBfX2Z1bmNfXywgYWRkX3N0YS0+c3RhTWFjKTsKKwkJCWFkZF9zdGEtPnN0YXR1cyA9IHN0YXR1czsKKwkJCWdvdG8gc2VuZF9yc3A7CisJCX0KKworCQlwZWVyID0gb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcihwZGV2LCBhZGRfc3RhLT5zdGFNYWMsICZwZWVyX2lkKTsKKwkJaWYgKCFwZWVyKSB7CisJCQlXTUFfTE9HRSgiJXM6IGFkZFN0YSwgZmFpbGVkIHRvIGZpbmQgcGVlciBoYW5kbGUgZm9yIG1hYyAlcE0iLAorCQkJCV9fZnVuY19fLCBhZGRfc3RhLT5zdGFNYWMpOworCQkJYWRkX3N0YS0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQl3bWFfcmVtb3ZlX3BlZXIod21hLCBhZGRfc3RhLT5zdGFNYWMsCisJCQkJCWFkZF9zdGEtPnNtZXNlc3Npb25JZCwgcGVlciwgZmFsc2UpOworCQkJZ290byBzZW5kX3JzcDsKKwkJfQorCisJCWFkZF9zdGEtPnN0YUlkeCA9IG9sX3R4cnhfbG9jYWxfcGVlcl9pZChwZWVyKTsKKwkJV01BX0xPR0QoIiVzOiBhZGRTdGEsIGFmdGVyIGNhbGxpbmcgb2xfdHhyeF9sb2NhbF9wZWVyX2lkLCAiCisJCQkgInN0YUlkeDogJWQsIHN0YU1hYzogJXBNIiwKKwkJCSBfX2Z1bmNfXywgYWRkX3N0YS0+c3RhSWR4LCBhZGRfc3RhLT5zdGFNYWMpOworCisJCXBlZXJTdGF0ZVBhcmFtcyA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0VGRsc1BlZXJTdGF0ZVBhcmFtcykpOworCQlpZiAoIXBlZXJTdGF0ZVBhcmFtcykgeworCQkJV01BX0xPR0UKKwkJCQkoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwZWVyU3RhdGVQYXJhbXMgZm9yICVwTSIsCisJCQkJX19mdW5jX18sIGFkZF9zdGEtPnN0YU1hYyk7CisJCQlhZGRfc3RhLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCQlnb3RvIHNlbmRfcnNwOworCQl9CisKKwkJY2RmX21lbV96ZXJvKHBlZXJTdGF0ZVBhcmFtcywgc2l6ZW9mKCpwZWVyU3RhdGVQYXJhbXMpKTsKKwkJcGVlclN0YXRlUGFyYW1zLT5wZWVyU3RhdGUgPSBXTUlfVERMU19QRUVSX1NUQVRFX1BFRVJJTkc7CisJCXBlZXJTdGF0ZVBhcmFtcy0+dmRldklkID0gdmRldi0+dmRldl9pZDsKKwkJY2RmX21lbV9jb3B5KCZwZWVyU3RhdGVQYXJhbXMtPnBlZXJNYWNBZGRyLAorCQkJICAgICAmYWRkX3N0YS0+c3RhTWFjLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKwkJd21hX3VwZGF0ZV90ZGxzX3BlZXJfc3RhdGUod21hLCBwZWVyU3RhdGVQYXJhbXMpOworCX0gZWxzZSB7CisJCS8qIGl0cyBhIGNoYW5nZSBzdGEgcmVxdWVzdCAqICovCisJCXBlZXIgPQorCQkJb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcihwZGV2LCBhZGRfc3RhLT5zdGFNYWMsICZwZWVyX2lkKTsKKwkJaWYgKCFwZWVyKSB7CisJCQlXTUFfTE9HRSgiJXM6IGNoYW5nZVN0YSxmYWlsZWQgdG8gZmluZCBwZWVyIGhhbmRsZSBmb3IgbWFjICVwTSIsCisJCQkJX19mdW5jX18sIGFkZF9zdGEtPnN0YU1hYyk7CisJCQlhZGRfc3RhLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCXdtYV9yZW1vdmVfcGVlcih3bWEsIGFkZF9zdGEtPnN0YU1hYywKKwkJCQkJYWRkX3N0YS0+c21lc2Vzc2lvbklkLCBwZWVyLCBmYWxzZSk7CisJCQlnb3RvIHNlbmRfcnNwOworCQl9CisKKwkJaWYgKFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod21hLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJCSAgICBXTUlfU0VSVklDRV9QRUVSX0FTU09DX0NPTkYpKSB7CisJCQlXTUFfTE9HRShGTCgiV01JX1NFUlZJQ0VfUEVFUl9BU1NPQ19DT05GIGlzIGVuYWJsZWQiKSk7CisJCQlwZWVyX2Fzc29jX2NuZiA9IHRydWU7CisJCQltc2cgPSB3bWFfZmlsbF9ob2xkX3JlcSh3bWEsIGFkZF9zdGEtPnNtZXNlc3Npb25JZCwKKwkJCQlXTUFfQUREX1NUQV9SRVEsIFdNQV9QRUVSX0FTU09DX0NORl9TVEFSVCwKKwkJCQlhZGRfc3RhLCBXTUFfUEVFUl9BU1NPQ19USU1FT1VUKTsKKwkJCWlmICghbXNnKSB7CisJCQkJV01BX0xPR1AoRkwoIkZhaWxlZCB0byBhbGxvYyByZXF1ZXN0IGZvciB2ZGV2X2lkICVkIiksCisJCQkJCSBhZGRfc3RhLT5zbWVzZXNzaW9uSWQpOworCQkJCWFkZF9zdGEtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJCXdtYV9yZW1vdmVfcmVxKHdtYSwgYWRkX3N0YS0+c21lc2Vzc2lvbklkLAorCQkJCQkgICAgICAgV01BX1BFRVJfQVNTT0NfQ05GX1NUQVJUKTsKKwkJCQl3bWFfcmVtb3ZlX3BlZXIod21hLCBhZGRfc3RhLT5zdGFNYWMsCisJCQkJCWFkZF9zdGEtPnNtZXNlc3Npb25JZCwgcGVlciwgZmFsc2UpOworCQkJCXBlZXJfYXNzb2NfY25mID0gZmFsc2U7CisJCQkJZ290byBzZW5kX3JzcDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVdNQV9MT0dFKEZMKCJXTUlfU0VSVklDRV9QRUVSX0FTU09DX0NPTkYgbm90IGVuYWJsZWQiKSk7CisJCX0KKworCQlXTUFfTE9HRCgiJXM6IGNoYW5nZVN0YSwgY2FsbGluZyB3bWlfdW5pZmllZF9zZW5kX3BlZXJfYXNzb2MiLAorCQkJIF9fZnVuY19fKTsKKworCQlyZXQgPQorCQkJd21pX3VuaWZpZWRfc2VuZF9wZWVyX2Fzc29jKHdtYSwgYWRkX3N0YS0+bndUeXBlLCBhZGRfc3RhKTsKKwkJaWYgKHJldCkgeworCQkJYWRkX3N0YS0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQl3bWFfcmVtb3ZlX3BlZXIod21hLCBhZGRfc3RhLT5zdGFNYWMsCisJCQkJCWFkZF9zdGEtPnNtZXNlc3Npb25JZCwgcGVlciwgZmFsc2UpOworCQkJZ290byBzZW5kX3JzcDsKKwkJfQorCX0KKworc2VuZF9yc3A6CisJLyogRG8gbm90IHNlbmQgYWRkIHN0YXQgcmVzcCB3aGVuIHBlZXIgYXNzb2MgY25mIGlzIGVuYWJsZWQgKi8KKwlpZiAocGVlcl9hc3NvY19jbmYpCisJCXJldHVybjsKKworCVdNQV9MT0dFKEZMKCJzdGF0eXBlICVkIHZkZXZfaWQgJWQgYWlkICVkIGJzc2lkICVwTSBzdGFJZHggJWQgc3RhdHVzICVkIiksCisJCSBhZGRfc3RhLT5zdGFUeXBlLCBhZGRfc3RhLT5zbWVzZXNzaW9uSWQsCisJCSBhZGRfc3RhLT5hc3NvY0lkLCBhZGRfc3RhLT5ic3NJZCwgYWRkX3N0YS0+c3RhSWR4LAorCQkgYWRkX3N0YS0+c3RhdHVzKTsKKwl3bWFfc2VuZF9tc2cod21hLCBXTUFfQUREX1NUQV9SU1AsICh2b2lkICopYWRkX3N0YSwgMCk7Cit9CisjZW5kaWYKKworLyoqCisgKiB3bWFfYWRkX3N0YV9yZXFfc3RhX21vZGUoKSAtIHByb2Nlc3MgYWRkIHN0YSByZXF1ZXN0IGluIHN0YSBtb2RlCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAYWRkX3N0YTogYWRkIHN0YSBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX2FkZF9zdGFfcmVxX3N0YV9tb2RlKHRwX3dtYV9oYW5kbGUgd21hLCB0cEFkZFN0YVBhcmFtcyBwYXJhbXMpCit7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2OworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCW9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlcjsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaWZhY2U7CisJdFBvd2VyZEJtIG1heFR4UG93ZXI7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdtYV90YXJnZXRfcmVxICptc2c7CisJYm9vbCBwZWVyX2Fzc29jX2NuZiA9IGZhbHNlOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwlpZiAoU1RBX0VOVFJZX1RETFNfUEVFUiA9PSBwYXJhbXMtPnN0YVR5cGUpIHsKKwkJd21hX2FkZF90ZGxzX3N0YSh3bWEsIHBhcmFtcyk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKworCWlmIChOVUxMID09IHBkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IHBkZXYiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKworCWlmYWNlID0gJndtYS0+aW50ZXJmYWNlc1twYXJhbXMtPnNtZXNlc3Npb25JZF07CisJaWYgKHBhcmFtcy0+c3RhVHlwZSAhPSBTVEFfRU5UUllfU0VMRikgeworCQlXTUFfTE9HUCgiJXM6IHVuc3VwcG9ydGVkIHN0YXRpb24gdHlwZSAlZCIsCisJCQkgX19mdW5jX18sIHBhcmFtcy0+c3RhVHlwZSk7CisJCWdvdG8gb3V0OworCX0KKwlwZWVyID0gb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcihwZGV2LCBwYXJhbXMtPmJzc0lkLCAmcGFyYW1zLT5zdGFJZHgpOworCWlmIChwYXJhbXMtPm5vblJvYW1SZWFzc29jKSB7CisJCW9sX3R4cnhfcGVlcl9zdGF0ZV91cGRhdGUocGRldiwgcGFyYW1zLT5ic3NJZCwKKwkJCQkJICBvbF90eHJ4X3BlZXJfc3RhdGVfYXV0aCk7CisJCWNkZl9hdG9taWNfc2V0KCZpZmFjZS0+YnNzX3N0YXR1cywgV01BX0JTU19TVEFUVVNfU1RBUlRFRCk7CisJCWlmYWNlLT5haWQgPSBwYXJhbXMtPmFzc29jSWQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh3bWEtPmludGVyZmFjZXNbcGFyYW1zLT5zbWVzZXNzaW9uSWRdLnZkZXZfdXAgPT0gdHJ1ZSkgeworCQlXTUFfTE9HRSgiJXM6IHZkZXYgaWQgJWQgaXMgYWxyZWFkeSBVUCBmb3IgJXBNIiwgX19mdW5jX18sCisJCQlwYXJhbXMtPnNtZXNlc3Npb25JZCwgcGFyYW1zLT5ic3NJZCk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocGVlciAhPSBOVUxMICYmIHBlZXItPnN0YXRlID09IG9sX3R4cnhfcGVlcl9zdGF0ZV9kaXNjKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgdGhlIGNhc2UgZm9yIHJlYXNzb2NpYXRpb24uCisJCSAqIHBlZXIgc3RhdGUgdXBkYXRlIGFuZCBwZWVyX2Fzc29jIGlzIHJlcXVpcmVkIHNpbmNlIGl0CisJCSAqIHdhcyBub3QgZG9uZSBieSBXTUFfQUREX0JTU19SRVEuCisJCSAqLworCisJCS8qIFVwZGF0ZSBwZWVyIHN0YXRlICovCisJCWlmIChwYXJhbXMtPmVuY3J5cHRUeXBlID09IGVTSVJfRURfTk9ORSkgeworCQkJV01BX0xPR0QoIiVzOiBVcGRhdGUgcGVlciglcE0pIHN0YXRlIGludG8gYXV0aCIsCisJCQkJIF9fZnVuY19fLCBwYXJhbXMtPmJzc0lkKTsKKwkJCW9sX3R4cnhfcGVlcl9zdGF0ZV91cGRhdGUocGRldiwgcGFyYW1zLT5ic3NJZCwKKwkJCQkJCSAgb2xfdHhyeF9wZWVyX3N0YXRlX2F1dGgpOworCQl9IGVsc2UgeworCQkJV01BX0xPR0QoIiVzOiBVcGRhdGUgcGVlciglcE0pIHN0YXRlIGludG8gY29ubiIsCisJCQkJIF9fZnVuY19fLCBwYXJhbXMtPmJzc0lkKTsKKwkJCW9sX3R4cnhfcGVlcl9zdGF0ZV91cGRhdGUocGRldiwgcGFyYW1zLT5ic3NJZCwKKwkJCQkJCSAgb2xfdHhyeF9wZWVyX3N0YXRlX2Nvbm4pOworCQl9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJCWlmIChpZmFjZS0+cm9hbV9zeW5jaF9pbl9wcm9ncmVzcykgeworCQkJLyogaWZhY2UtPm5zcyA9IHBhcmFtcy0+bnNzOyAqLworCQkJLypJbiBMRlIyLjAsIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIGFzCisJCQkgKiBwYXJ0IG9mIHdtaV91bmlmaWVkX3NlbmRfcGVlcl9hc3NvYy4gQXMgd2UgYXJlCisJCQkgKiBza2lwcGluZyB0aGlzIG9wZXJhdGlvbiwgd2UgYXJlIGp1c3QgZXhlY3V0aW5nIHRoZQorCQkJICogZm9sbG93aW5nIHdoaWNoIGFyZSB1c2VmdWwgZm9yIExGUjMuMC4qLworCQkJb2xfdHhyeF9wZWVyX3N0YXRlX3VwZGF0ZShwZGV2LCBwYXJhbXMtPmJzc0lkLAorCQkJCQkJICBvbF90eHJ4X3BlZXJfc3RhdGVfYXV0aCk7CisJCQljZGZfYXRvbWljX3NldCgmaWZhY2UtPmJzc19zdGF0dXMsCisJCQkJICAgICAgIFdNQV9CU1NfU1RBVFVTX1NUQVJURUQpOworCQkJaWZhY2UtPmFpZCA9IHBhcmFtcy0+YXNzb2NJZDsKKwkJCWdvdG8gb3V0OworCQl9CisjZW5kaWYKKwkJd21pX3VuaWZpZWRfc2VuZF90eGJmKHdtYSwgcGFyYW1zKTsKKworCQlpZiAoV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWEtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkJICAgIFdNSV9TRVJWSUNFX1BFRVJfQVNTT0NfQ09ORikpIHsKKwkJCVdNQV9MT0dFKEZMKCJXTUlfU0VSVklDRV9QRUVSX0FTU09DX0NPTkYgaXMgZW5hYmxlZCIpKTsKKwkJCXBlZXJfYXNzb2NfY25mID0gdHJ1ZTsKKwkJCW1zZyA9IHdtYV9maWxsX2hvbGRfcmVxKHdtYSwgcGFyYW1zLT5zbWVzZXNzaW9uSWQsCisJCQkJV01BX0FERF9TVEFfUkVRLCBXTUFfUEVFUl9BU1NPQ19DTkZfU1RBUlQsCisJCQkJcGFyYW1zLCBXTUFfUEVFUl9BU1NPQ19USU1FT1VUKTsKKwkJCWlmICghbXNnKSB7CisJCQkJV01BX0xPR1AoRkwoIkZhaWxlZCB0byBhbGxvYyByZXF1ZXN0IGZvciB2ZGV2X2lkICVkIiksCisJCQkJCSBwYXJhbXMtPnNtZXNlc3Npb25JZCk7CisJCQkJcGFyYW1zLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCQl3bWFfcmVtb3ZlX3JlcSh3bWEsIHBhcmFtcy0+c21lc2Vzc2lvbklkLAorCQkJCQkgICAgICAgV01BX1BFRVJfQVNTT0NfQ05GX1NUQVJUKTsKKwkJCQl3bWFfcmVtb3ZlX3BlZXIod21hLCBwYXJhbXMtPnN0YU1hYywKKwkJCQkJcGFyYW1zLT5zbWVzZXNzaW9uSWQsIHBlZXIsIGZhbHNlKTsKKwkJCQlwZWVyX2Fzc29jX2NuZiA9IGZhbHNlOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgeworCQkJV01BX0xPR0UoRkwoIldNSV9TRVJWSUNFX1BFRVJfQVNTT0NfQ09ORiBub3QgZW5hYmxlZCIpKTsKKwkJfQorCisJCXJldCA9IHdtaV91bmlmaWVkX3NlbmRfcGVlcl9hc3NvYyh3bWEsCisJCQkJaWZhY2UtPm53VHlwZSwKKwkJCQkodEFkZFN0YVBhcmFtcyAqKSBpZmFjZS0+YWRkQnNzU3RhQ29udGV4dCk7CisJCWlmIChyZXQpIHsKKwkJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJd21hX3JlbW92ZV9wZWVyKHdtYSwgcGFyYW1zLT5ic3NJZCwKKwkJCQkJcGFyYW1zLT5zbWVzZXNzaW9uSWQsIHBlZXIsIGZhbHNlKTsKKwkJCWdvdG8gb3V0OworCQl9CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQlpZiAocGFyYW1zLT5ybWZFbmFibGVkKSB7CisJCQkvKiB3aGVuIDgwMi4xMXcgUE1GIGlzIGVuYWJsZWQgZm9yIGh3IGVuY3IvZGVjcgorCQkJICAgdXNlIGh3IE1GUCBRb3MgYml0cyAweDEwICovCisJCQlyZXQgPSB3bWlfdW5pZmllZF9wZGV2X3NldF9wYXJhbSh3bWEtPndtaV9oYW5kbGUsCisJCQkJCQkJIFdNSV9QREVWX1BBUkFNX1BNRl9RT1MsCisJCQkJCQkJIHRydWUpOworCQkJaWYgKHJldCkgeworCQkJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNldCBRT1MgTUZQL1BNRiAoJWQpIiwKKwkJCQkJIF9fZnVuY19fLCByZXQpOworCQkJfSBlbHNlIHsKKwkJCQlXTUFfTE9HSSgiJXM6IFFPUyBNRlAvUE1GIHNldCB0byAlZCIsCisJCQkJCSBfX2Z1bmNfXywgdHJ1ZSk7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFXICovCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCQkvKgorCQkgKiBTZXQgdGhlIFBUSyBpbiAxMXIgbW9kZSBiZWNhdXNlIHdlIGFscmVhZHkgaGF2ZSBpdC4KKwkJICovCisJCWlmIChpZmFjZS0+c3RhS2V5UGFyYW1zKSB7CisJCQl3bWFfc2V0X3N0YWtleSh3bWEsCisJCQkJICAgICAgICh0cFNldFN0YUtleVBhcmFtcykgaWZhY2UtPnN0YUtleVBhcmFtcyk7CisJCX0KKyNlbmRpZgorCX0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwltYXhUeFBvd2VyID0gcGFyYW1zLT5tYXhUeFBvd2VyOworI2Vsc2UKKwltYXhUeFBvd2VyID0gMDsKKyNlbmRpZgorCXdtYV92ZGV2X3NldF9ic3NfcGFyYW1zKHdtYSwgcGFyYW1zLT5zbWVzZXNzaW9uSWQsCisJCQkJaWZhY2UtPmJlYWNvbkludGVydmFsLCBpZmFjZS0+ZHRpbVBlcmlvZCwKKwkJCQlpZmFjZS0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCwKKwkJCQlpZmFjZS0+bGxiQ29leGlzdCwgbWF4VHhQb3dlcik7CisKKwlwYXJhbXMtPmNzYU9mZmxvYWRFbmFibGUgPSAwOworCWlmIChXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCSAgIFdNSV9TRVJWSUNFX0NTQV9PRkZMT0FEKSkgeworCQlwYXJhbXMtPmNzYU9mZmxvYWRFbmFibGUgPSAxOworCQlpZiAod21pX3VuaWZpZWRfY3NhX29mZmxvYWRfZW5hYmxlKHdtYSwgcGFyYW1zLT5zbWVzZXNzaW9uSWQpIDwKKwkJICAgIDApIHsKKwkJCVdNQV9MT0dFKCJVbmFibGUgdG8gZW5hYmxlIENTQSBvZmZsb2FkIGZvciB2ZGV2X2lkOiVkIiwKKwkJCQkgcGFyYW1zLT5zbWVzZXNzaW9uSWQpOworCQl9CisJfQorCisJaWYgKFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod21hLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJICAgV01JX1NFUlZJQ0VfRklMVEVSX0lQU0VDX05BVEtFRVBBTElWRSkpIHsKKwkJaWYgKHdtaV91bmlmaWVkX25hdF9rZWVwYWxpdmVfZW5hYmxlKHdtYSwgcGFyYW1zLT5zbWVzZXNzaW9uSWQpCisJCSAgICA8IDApIHsKKwkJCVdNQV9MT0dFKCJVbmFibGUgdG8gZW5hYmxlIE5BVCBrZWVwYWxpdmUgZm9yIHZkZXZfaWQ6JWQiLAorCQkJCXBhcmFtcy0+c21lc2Vzc2lvbklkKTsKKwkJfQorCX0KKworCWlmICh3bWlfdW5pZmllZF92ZGV2X3VwX3NlbmQod21hLT53bWlfaGFuZGxlLCBwYXJhbXMtPnNtZXNlc3Npb25JZCwKKwkJCQkgICAgIHBhcmFtcy0+YXNzb2NJZCwgcGFyYW1zLT5ic3NJZCkgPCAwKSB7CisJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIHNlbmQgdmRldiB1cCBjbWQ6IHZkZXYgJWQgYnNzaWQgJXBNIiwKKwkJCSBfX2Z1bmNfXywgcGFyYW1zLT5zbWVzZXNzaW9uSWQsIHBhcmFtcy0+YnNzSWQpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9IGVsc2UgeworCQl3bWEtPmludGVyZmFjZXNbcGFyYW1zLT5zbWVzZXNzaW9uSWRdLnZkZXZfdXAgPSB0cnVlOworCX0KKworCWNkZl9hdG9taWNfc2V0KCZpZmFjZS0+YnNzX3N0YXR1cywgV01BX0JTU19TVEFUVVNfU1RBUlRFRCk7CisJV01BX0xPR0QoIiVzOiBTVEEgbW9kZSAodHlwZSAlZCBzdWJ0eXBlICVkKSBCU1MgaXMgc3RhcnRlZCIsCisJCSBfX2Z1bmNfXywgaWZhY2UtPnR5cGUsIGlmYWNlLT5zdWJfdHlwZSk7CisJLyogU3RhIGlzIG5vdyBhc3NvY2lhdGVkLCBjb25maWd1cmUgdmFyaW91cyBwYXJhbXMgKi8KKworCS8qIFNNIHBvd2VyIHNhdmUsIGNvbmZpZ3VyZSB0aGUgaC93IGFzIGNvbmZpZ3VyZWQKKwkgKiBpbiB0aGUgaW5pIGZpbGUuIFNNUFMgaXMgbm90IHB1Ymxpc2hlZCBpbiBhc3NvYworCSAqIHJlcXVlc3QuIE9uY2UgY29uZmlndXJlZCwgZncgc2VuZHMgdGhlIHJlcXVpcmVkCisJICogYWN0aW9uIGZyYW1lIHRvIEFQLgorCSAqLworCWlmIChwYXJhbXMtPmVuYWJsZUh0U21wcykKKwkJd21hX3NldF9taW1vcHMod21hLCBwYXJhbXMtPnNtZXNlc3Npb25JZCwgcGFyYW1zLT5odFNtcHNjb25maWcpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwkvKiBQYXJ0aWFsIEFJRCBtYXRjaCBwb3dlciBzYXZlLCBlbmFibGUgd2hlbiBTVSBiZm9ybWVlICovCisJaWYgKHBhcmFtcy0+ZW5hYmxlVmh0cEFpZCAmJiBwYXJhbXMtPnZodFR4QkZDYXBhYmxlKQorCQl3bWFfc2V0X3Bwc2NvbmZpZyhwYXJhbXMtPnNtZXNlc3Npb25JZCwKKwkJCQkgIFdNQV9WSFRfUFBTX1BBSURfTUFUQ0gsIDEpOworI2VuZGlmCisKKwkvKiBFbmFibGUgQU1QRFUgcG93ZXIgc2F2ZSwgaWYgaHRDYXBhYmxlL3ZodENhcGFibGUgKi8KKwlpZiAocGFyYW1zLT5lbmFibGVBbXBkdVBzICYmIChwYXJhbXMtPmh0Q2FwYWJsZSB8fCBwYXJhbXMtPnZodENhcGFibGUpKQorCQl3bWFfc2V0X3Bwc2NvbmZpZyhwYXJhbXMtPnNtZXNlc3Npb25JZCwKKwkJCQkgIFdNQV9WSFRfUFBTX0RFTElNX0NSQ19GQUlMLCAxKTsKKwlpZmFjZS0+YWlkID0gcGFyYW1zLT5hc3NvY0lkOworb3V0OgorCS8qIERvIG5vdCBzZW5kIGFkZCBzdGF0IHJlc3Agd2hlbiBwZWVyIGFzc29jIGNuZiBpcyBlbmFibGVkICovCisJaWYgKHBlZXJfYXNzb2NfY25mKQorCQlyZXR1cm47CisKKwlwYXJhbXMtPnN0YXR1cyA9IHN0YXR1czsKKwlXTUFfTE9HRShGTCgic3RhdHlwZSAlZCB2ZGV2X2lkICVkIGFpZCAlZCBic3NpZCAlcE0gc3RhSWR4ICVkIHN0YXR1cyAlZCIpLAorCQkgcGFyYW1zLT5zdGFUeXBlLCBwYXJhbXMtPnNtZXNlc3Npb25JZCwKKwkJIHBhcmFtcy0+YXNzb2NJZCwgcGFyYW1zLT5ic3NJZCwgcGFyYW1zLT5zdGFJZHgsCisJCSBwYXJhbXMtPnN0YXR1cyk7CisJd21hX3NlbmRfbXNnKHdtYSwgV01BX0FERF9TVEFfUlNQLCAodm9pZCAqKXBhcmFtcywgMCk7Cit9CisKKy8qKgorICogd21hX2RlbGV0ZV9zdGFfcmVxX2FwX21vZGUoKSAtIHByb2NlcyBkZWxldGUgc3RhIHJlcXVlc3QgZnJvbSBVTUFDIGluIEFQIG1vZGUKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBkZWxfc3RhOiBkZWxldGUgc3RhIHBhcmFtcworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfZGVsZXRlX3N0YV9yZXFfYXBfbW9kZSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgICAgICAgdHBEZWxldGVTdGFQYXJhbXMgZGVsX3N0YSkKK3sKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXY7CisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyOworCisJcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCisJaWYgKE5VTEwgPT0gcGRldikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgcGRldiIsIF9fZnVuY19fKTsKKwkJZGVsX3N0YS0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gc2VuZF9kZWxfcnNwOworCX0KKworCXBlZXIgPSBvbF90eHJ4X3BlZXJfZmluZF9ieV9sb2NhbF9pZChwZGV2LCBkZWxfc3RhLT5zdGFJZHgpOworCWlmICghcGVlcikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgcGVlciBoYW5kbGUgdXNpbmcgcGVlciBpZCAlZCIsCisJCQkgX19mdW5jX18sIGRlbF9zdGEtPnN0YUlkeCk7CisJCWRlbF9zdGEtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIHNlbmRfZGVsX3JzcDsKKwl9CisKKwl3bWFfcmVtb3ZlX3BlZXIod21hLCBwZWVyLT5tYWNfYWRkci5yYXcsIGRlbF9zdGEtPnNtZXNlc3Npb25JZCwgcGVlciwKKwkJCWZhbHNlKTsKKwlkZWxfc3RhLT5zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKK3NlbmRfZGVsX3JzcDoKKwlpZiAoZGVsX3N0YS0+cmVzcFJlcWQpIHsKKwkJV01BX0xPR0QoIiVzOiBTZW5kaW5nIGRlbCByc3AgdG8gdW1hYyAoc3RhdHVzOiAlZCkiLAorCQkJIF9fZnVuY19fLCBkZWxfc3RhLT5zdGF0dXMpOworCQl3bWFfc2VuZF9tc2cod21hLCBXTUFfREVMRVRFX1NUQV9SU1AsICh2b2lkICopZGVsX3N0YSwgMCk7CisJfQorfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKy8qKgorICogd21hX2RlbF90ZGxzX3N0YSgpIC0gcHJvY2VzIGRlbGV0ZSBzdGEgcmVxdWVzdCBmcm9tIFVNQUMgaW4gVERMUworICogQHdtYTogd21hIGhhbmRsZQorICogQGRlbF9zdGE6IGRlbGV0ZSBzdGEgcGFyYW1zCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9kZWxfdGRsc19zdGEodHBfd21hX2hhbmRsZSB3bWEsIHRwRGVsZXRlU3RhUGFyYW1zIGRlbF9zdGEpCit7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2OworCW9sX3R4cnhfdmRldl9oYW5kbGUgdmRldjsKKwlzdHJ1Y3Qgb2xfdHhyeF9wZWVyX3QgKnBlZXI7CisJdFRkbHNQZWVyU3RhdGVQYXJhbXMgKnBlZXJTdGF0ZVBhcmFtczsKKworCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKworCWlmIChOVUxMID09IHBkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBwZGV2IiwgX19mdW5jX18pOworCQlkZWxfc3RhLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBzZW5kX2RlbF9yc3A7CisJfQorCisJdmRldiA9IHdtYV9maW5kX3ZkZXZfYnlfaWQod21hLCBkZWxfc3RhLT5zbWVzZXNzaW9uSWQpOworCWlmICghdmRldikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHZkZXYiLCBfX2Z1bmNfXyk7CisJCWRlbF9zdGEtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIHNlbmRfZGVsX3JzcDsKKwl9CisKKwlwZWVyID0gb2xfdHhyeF9wZWVyX2ZpbmRfYnlfbG9jYWxfaWQocGRldiwgZGVsX3N0YS0+c3RhSWR4KTsKKwlpZiAoIXBlZXIpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHBlZXIgaGFuZGxlIHVzaW5nIHBlZXIgaWQgJWQiLAorCQkJIF9fZnVuY19fLCBkZWxfc3RhLT5zdGFJZHgpOworCQlkZWxfc3RhLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBzZW5kX2RlbF9yc3A7CisJfQorCisJcGVlclN0YXRlUGFyYW1zID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRUZGxzUGVlclN0YXRlUGFyYW1zKSk7CisJaWYgKCFwZWVyU3RhdGVQYXJhbXMpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwZWVyU3RhdGVQYXJhbXMgZm9yOiAlcE0iLAorCQkJX19mdW5jX18sIGRlbF9zdGEtPnN0YU1hYyk7CisJCWRlbF9zdGEtPnN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZ290byBzZW5kX2RlbF9yc3A7CisJfQorCisJY2RmX21lbV96ZXJvKHBlZXJTdGF0ZVBhcmFtcywgc2l6ZW9mKCpwZWVyU3RhdGVQYXJhbXMpKTsKKwlwZWVyU3RhdGVQYXJhbXMtPnBlZXJTdGF0ZSA9IFdNQV9URExTX1BFRVJfU1RBVEVfVEVBUkRPV047CisJcGVlclN0YXRlUGFyYW1zLT52ZGV2SWQgPSB2ZGV2LT52ZGV2X2lkOworCWNkZl9tZW1fY29weSgmcGVlclN0YXRlUGFyYW1zLT5wZWVyTWFjQWRkciwKKwkJICAgICAmZGVsX3N0YS0+c3RhTWFjLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworCVdNQV9MT0dEKCIlczogc2VuZGluZyB0ZGxzX3BlZXJfc3RhdGUgZm9yIHBlZXIgbWFjOiAlcE0sICIKKwkJICIgcGVlclN0YXRlOiAlZCIsCisJCSBfX2Z1bmNfXywgcGVlclN0YXRlUGFyYW1zLT5wZWVyTWFjQWRkciwKKwkJIHBlZXJTdGF0ZVBhcmFtcy0+cGVlclN0YXRlKTsKKworCXdtYV91cGRhdGVfdGRsc19wZWVyX3N0YXRlKHdtYSwgcGVlclN0YXRlUGFyYW1zKTsKKworCWRlbF9zdGEtPnN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworc2VuZF9kZWxfcnNwOgorCWlmIChkZWxfc3RhLT5yZXNwUmVxZCkgeworCQlXTUFfTE9HRCgiJXM6IFNlbmRpbmcgZGVsIHJzcCB0byB1bWFjIChzdGF0dXM6ICVkKSIsCisJCQkgX19mdW5jX18sIGRlbF9zdGEtPnN0YXR1cyk7CisJCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9ERUxFVEVfU1RBX1JTUCwgKHZvaWQgKilkZWxfc3RhLCAwKTsKKwl9Cit9CisjZW5kaWYKKworLyoqCisgKiB3bWFfZGVsZXRlX3N0YV9yZXFfc3RhX21vZGUoKSAtIHByb2NlcyBkZWxldGUgc3RhIHJlcXVlc3QgZnJvbSBVTUFDCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcGFyYW1zOiBkZWxldGUgc3RhIHBhcmFtcworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfZGVsZXRlX3N0YV9yZXFfc3RhX21vZGUodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCXRwRGVsZXRlU3RhUGFyYW1zIHBhcmFtcykKK3sKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaWZhY2U7CisJaWZhY2UgPSAmd21hLT5pbnRlcmZhY2VzW3BhcmFtcy0+c21lc2Vzc2lvbklkXTsKKwlpZmFjZS0+dWFwc2RfY2FjaGVkX3ZhbCA9IDA7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJLyogSW4gY2FzZSBvZiBMRlIzLjAgd2UgbmVlZCBub3Qgc2VuZCBhbnkKKwkgKiBXTUkgY29tbWFuZHMgdG8gRlcgYmVmb3JlIFNZTkNIX0NPTkZJUk0gKi8KKwlpZiAoaWZhY2UtPnJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MpCisJCWdvdG8gc2VuZF9kZWxfc3RhX3JzcDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJaWYgKFNUQV9FTlRSWV9URExTX1BFRVIgPT0gcGFyYW1zLT5zdGFUeXBlKSB7CisJCXdtYV9kZWxfdGRsc19zdGEod21hLCBwYXJhbXMpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorc2VuZF9kZWxfc3RhX3JzcDoKKyNlbmRpZgorCXBhcmFtcy0+c3RhdHVzID0gc3RhdHVzOworCWlmIChwYXJhbXMtPnJlc3BSZXFkKSB7CisJCVdNQV9MT0dEKCIlczogdmRldl9pZCAlZCBzdGF0dXMgJWQiLCBfX2Z1bmNfXywKKwkJCSBwYXJhbXMtPnNtZXNlc3Npb25JZCwgc3RhdHVzKTsKKwkJd21hX3NlbmRfbXNnKHdtYSwgV01BX0RFTEVURV9TVEFfUlNQLCAodm9pZCAqKXBhcmFtcywgMCk7CisJfQorfQorCisvKioKKyAqIHdtYV9hZGRfc3RhKCkgLSBwcm9jZXNzIGFkZCBzdGEgcmVxdWVzdCBhcyBwZXIgb3Btb2RlCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAYWRkX1N0YTogYWRkIHN0YSBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfYWRkX3N0YSh0cF93bWFfaGFuZGxlIHdtYSwgdHBBZGRTdGFQYXJhbXMgYWRkX3N0YSkKK3sKKwl1aW50OF90IG9wZXJfbW9kZSA9IEJTU19PUEVSQVRJT05BTF9NT0RFX1NUQTsKKworCVdNQV9MT0dEKCIlczogYWRkX3N0YS0+c2Vzc2lvbklkID0gJWQuIiwgX19mdW5jX18sCisJCSBhZGRfc3RhLT5zbWVzZXNzaW9uSWQpOworCVdNQV9MT0dEKCIlczogYWRkX3N0YS0+YnNzSWQgPSAleDoleDoleDoleDoleDoleCIsIF9fZnVuY19fLAorCQkgYWRkX3N0YS0+YnNzSWRbMF0sIGFkZF9zdGEtPmJzc0lkWzFdLCBhZGRfc3RhLT5ic3NJZFsyXSwKKwkJIGFkZF9zdGEtPmJzc0lkWzNdLCBhZGRfc3RhLT5ic3NJZFs0XSwgYWRkX3N0YS0+YnNzSWRbNV0pOworCisJaWYgKHdtYV9pc192ZGV2X2luX2FwX21vZGUod21hLCBhZGRfc3RhLT5zbWVzZXNzaW9uSWQpKQorCQlvcGVyX21vZGUgPSBCU1NfT1BFUkFUSU9OQUxfTU9ERV9BUDsKKyNpZmRlZiBRQ0FfSUJTU19TVVBQT1JUCisJZWxzZSBpZiAod21hX2lzX3ZkZXZfaW5faWJzc19tb2RlKHdtYSwgYWRkX3N0YS0+c21lc2Vzc2lvbklkKSkKKwkJb3Blcl9tb2RlID0gQlNTX09QRVJBVElPTkFMX01PREVfSUJTUzsKKyNlbmRpZgorCisJc3dpdGNoIChvcGVyX21vZGUpIHsKKwljYXNlIEJTU19PUEVSQVRJT05BTF9NT0RFX1NUQToKKwkJd21hX2FkZF9zdGFfcmVxX3N0YV9tb2RlKHdtYSwgYWRkX3N0YSk7CisJCWJyZWFrOworCisjaWZkZWYgUUNBX0lCU1NfU1VQUE9SVAorCWNhc2UgQlNTX09QRVJBVElPTkFMX01PREVfSUJTUzogLyogSUJTUyBzaG91bGQgc2hhcmUgdGhlIHNhbWUgY29kZSBhcyBBUCBtb2RlICovCisjZW5kaWYKKwljYXNlIEJTU19PUEVSQVRJT05BTF9NT0RFX0FQOgorCQloaWZfdm90ZV9saW5rX3VwKCk7CisJCXdtYV9hZGRfc3RhX3JlcV9hcF9tb2RlKHdtYSwgYWRkX3N0YSk7CisJCWJyZWFrOworCX0KKworI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwkvKiBhZGp1c3QgaGVhcnQgYmVhdCB0aHJlc29sZCB0aW1lciB2YWx1ZSBmb3IgZGV0ZWN0aW5nIGlic3MgcGVlciBkZXBhcnR1cmUgKi8KKwlpZiAob3Blcl9tb2RlID09IEJTU19PUEVSQVRJT05BTF9NT0RFX0lCU1MpCisJCXdtYV9hZGp1c3RfaWJzc19oZWFydF9iZWF0X3RpbWVyKHdtYSwgYWRkX3N0YS0+c21lc2Vzc2lvbklkLCAxKTsKKyNlbmRpZgorCit9CisKKy8qKgorICogd21hX2RlbGV0ZV9zdGEoKSAtIHByb2Nlc3MgZGVsIHN0YSByZXF1ZXN0IGFzIHBlciBvcG1vZGUKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBkZWxfc3RhOiBkZWxldGUgc3RhIHBhcmFtcworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9kZWxldGVfc3RhKHRwX3dtYV9oYW5kbGUgd21hLCB0cERlbGV0ZVN0YVBhcmFtcyBkZWxfc3RhKQoreworCXVpbnQ4X3Qgb3Blcl9tb2RlID0gQlNTX09QRVJBVElPTkFMX01PREVfU1RBOworCXVpbnQ4X3Qgc21lc2Vzc2lvbl9pZCA9IGRlbF9zdGEtPnNtZXNlc3Npb25JZDsKKwlib29sIHJzcF9yZXF1ZXN0ZWQgPSBkZWxfc3RhLT5yZXNwUmVxZDsKKworCWlmICh3bWFfaXNfdmRldl9pbl9hcF9tb2RlKHdtYSwgc21lc2Vzc2lvbl9pZCkpCisJCW9wZXJfbW9kZSA9IEJTU19PUEVSQVRJT05BTF9NT0RFX0FQOworI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwlpZiAod21hX2lzX3ZkZXZfaW5faWJzc19tb2RlKHdtYSwgc21lc2Vzc2lvbl9pZCkpIHsKKwkJb3Blcl9tb2RlID0gQlNTX09QRVJBVElPTkFMX01PREVfSUJTUzsKKwkJV01BX0xPR0QoIiVzOiB0byBkZWxldGUgc3RhIGZvciBJQlNTIG1vZGUiLCBfX2Z1bmNfXyk7CisJfQorI2VuZGlmCisKKwlzd2l0Y2ggKG9wZXJfbW9kZSkgeworCWNhc2UgQlNTX09QRVJBVElPTkFMX01PREVfU1RBOgorCQl3bWFfZGVsZXRlX3N0YV9yZXFfc3RhX21vZGUod21hLCBkZWxfc3RhKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBRQ0FfSUJTU19TVVBQT1JUCisJY2FzZSBCU1NfT1BFUkFUSU9OQUxfTU9ERV9JQlNTOiAvKiBJQlNTIHNoYXJlcyBBUCBjb2RlICovCisjZW5kaWYKKwljYXNlIEJTU19PUEVSQVRJT05BTF9NT0RFX0FQOgorCQloaWZfdm90ZV9saW5rX2Rvd24oKTsKKwkJd21hX2RlbGV0ZV9zdGFfcmVxX2FwX21vZGUod21hLCBkZWxfc3RhKTsKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgUUNBX0lCU1NfU1VQUE9SVAorCS8qIGFkanVzdCBoZWFydCBiZWF0IHRocmVzb2xkIHRpbWVyIHZhbHVlIGZvcgorCSAqIGRldGVjdGluZyBpYnNzIHBlZXIgZGVwYXJ0dXJlCisJICovCisJaWYgKG9wZXJfbW9kZSA9PSBCU1NfT1BFUkFUSU9OQUxfTU9ERV9JQlNTKQorCQl3bWFfYWRqdXN0X2lic3NfaGVhcnRfYmVhdF90aW1lcih3bWEsIHNtZXNlc3Npb25faWQsIC0xKTsKKyNlbmRpZgorCWlmICghcnNwX3JlcXVlc3RlZCkgeworCQlXTUFfTE9HRCgiJXM6IHZkZXZfaWQgJWQgc3RhdHVzICVkIiwgX19mdW5jX18sCisJCQkgZGVsX3N0YS0+c21lc2Vzc2lvbklkLCBkZWxfc3RhLT5zdGF0dXMpOworCQljZGZfbWVtX2ZyZWUoZGVsX3N0YSk7CisJfQorfQorCisvKioKKyAqIHdtaV91bmlmaWVkX3ZkZXZfc3RvcF9zZW5kKCkgLSBzZW5kIHZkZXYgc3RvcCBjb21tYW5kIHRvIGZ3CisgKiBAd21pOiB3bWkgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvIGNvZGUKKyAqLworaW50MzJfdCB3bWlfdW5pZmllZF92ZGV2X3N0b3Bfc2VuZCh3bWlfdW5pZmllZF90IHdtaSwgdWludDhfdCB2ZGV2X2lkKQoreworCXdtaV92ZGV2X3N0b3BfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQzMl90IGxlbiA9IHNpemVvZigqY21kKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21pLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dQKCIlcyA6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY21kID0gKHdtaV92ZGV2X3N0b3BfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3N0b3BfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV92ZGV2X3N0b3BfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gdmRldl9pZDsKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21pLCBidWYsIGxlbiwgV01JX1ZERVZfU1RPUF9DTURJRCkpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gc2VuZCB2ZGV2IHN0b3AgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZShidWYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX2RlbGV0ZV9ic3MoKSAtIHByb2Nlc3MgZGVsZXRlIGJzcyByZXF1ZXN0IGZyb20gdXBwZXIgbGF5ZXIKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwYXJhbXM6IGRlbCBic3MgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9kZWxldGVfYnNzKHRwX3dtYV9oYW5kbGUgd21hLCB0cERlbGV0ZUJzc1BhcmFtcyBwYXJhbXMpCit7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2OworCW9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlciA9IE5VTEw7CisJc3RydWN0IHdtYV90YXJnZXRfcmVxICptc2c7CisJQ0RGX1NUQVRVUyBzdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJdWludDhfdCBwZWVyX2lkOworCXVpbnQ4X3QgbWF4X3dhaXRfaXRlcmF0aW9ucyA9IDA7CisJb2xfdHhyeF92ZGV2X2hhbmRsZSB0eHJ4X3ZkZXYgPSBOVUxMOworCWJvb2wgcm9hbV9zeW5jaF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCisJcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCisJaWYgKE5VTEwgPT0gcGRldikgeworCQlXTUFfTE9HRSgiJXM6VW5hYmxlIHRvIGdldCBUWFJYIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKyNpZmRlZiBRQ0FfSUJTU19TVVBQT1JUCisJaWYgKHdtYV9pc192ZGV2X2luX2lic3NfbW9kZSh3bWEsIHBhcmFtcy0+c21lc2Vzc2lvbklkKSkKKwkJLyogaW4gcm9tZSBpYnNzIGNhc2UsIHNlbGYgbWFjIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBic3MgcGVlciAqLworCQlwZWVyID0gb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcihwZGV2LAorCQkJd21hLT5pbnRlcmZhY2VzW3BhcmFtcy0+c21lc2Vzc2lvbklkXS5hZGRyLAorCQkJJnBlZXJfaWQpOworCWVsc2UKKyNlbmRpZgorCXBlZXIgPSBvbF90eHJ4X2ZpbmRfcGVlcl9ieV9hZGRyKHBkZXYsIHBhcmFtcy0+YnNzaWQsICZwZWVyX2lkKTsKKworCWlmICghcGVlcikgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byBmaW5kIHBlZXIgJXBNIiwgX19mdW5jX18sCisJCQkgcGFyYW1zLT5ic3NpZCk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIG91dDsKKwl9CisKKwljZGZfbWVtX3plcm8od21hLT5pbnRlcmZhY2VzW3BhcmFtcy0+c21lc2Vzc2lvbklkXS5ic3NpZCwKKwkJCUlFRUU4MDIxMV9BRERSX0xFTik7CisKKwl0eHJ4X3ZkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2lkKHdtYSwgcGFyYW1zLT5zbWVzZXNzaW9uSWQpOworCWlmICghdHhyeF92ZGV2KSB7CisJCVdNQV9MT0dFKCIlczpJbnZhbGlkIHZkZXYgaGFuZGxlIiwgX19mdW5jX18pOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBvdXQ7CisJfQorCisJLypGcmVlIHRoZSBhbGxvY2F0ZWQgc3RhdHMgcmVzcG9uc2UgYnVmZmVyIGZvciB0aGUgdGhlIHNlc3Npb24gKi8KKwlpZiAod21hLT5pbnRlcmZhY2VzW3BhcmFtcy0+c21lc2Vzc2lvbklkXS5zdGF0c19yc3ApIHsKKwkJY2RmX21lbV9mcmVlKHdtYS0+aW50ZXJmYWNlc1twYXJhbXMtPnNtZXNlc3Npb25JZF0uc3RhdHNfcnNwKTsKKwkJd21hLT5pbnRlcmZhY2VzW3BhcmFtcy0+c21lc2Vzc2lvbklkXS5zdGF0c19yc3AgPSBOVUxMOworCX0KKworCWlmICh3bWEtPmludGVyZmFjZXNbcGFyYW1zLT5zbWVzZXNzaW9uSWRdLnBzbnJfcmVxKSB7CisJCWNkZl9tZW1fZnJlZSh3bWEtPmludGVyZmFjZXNbcGFyYW1zLT5zbWVzZXNzaW9uSWRdLnBzbnJfcmVxKTsKKwkJd21hLT5pbnRlcmZhY2VzW3BhcmFtcy0+c21lc2Vzc2lvbklkXS5wc25yX3JlcSA9IE5VTEw7CisJfQorCisJaWYgKHdsYW5fb3BfbW9kZV9pYnNzID09IHR4cnhfdmRldi0+b3Btb2RlKSB7CisJCXdtYS0+aWJzc19zdGFydGVkID0gMDsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmICh3bWEtPmludGVyZmFjZXNbcGFyYW1zLT5zbWVzZXNzaW9uSWRdLnJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MpIHsKKwkJcm9hbV9zeW5jaF9pbl9wcm9ncmVzcyA9IHRydWU7CisJCVdNQV9MT0dEKCJMRlIzOiVzOiBTZXR0aW5nIHZkZXZfdXAgdG8gRkFMU0UgZm9yIHNlc3Npb24gJWQiLAorCQkJX19mdW5jX18sIHBhcmFtcy0+c21lc2Vzc2lvbklkKTsKKwkJd21hLT5pbnRlcmZhY2VzW3BhcmFtcy0+c21lc2Vzc2lvbklkXS52ZGV2X3VwID0gZmFsc2U7CisJCWdvdG8gZGV0YWNoX3BlZXI7CisJfQorI2VuZGlmCisJbXNnID0gd21hX2ZpbGxfdmRldl9yZXEod21hLCBwYXJhbXMtPnNtZXNlc3Npb25JZCwgV01BX0RFTEVURV9CU1NfUkVRLAorCQkJCVdNQV9UQVJHRVRfUkVRX1RZUEVfVkRFVl9TVE9QLCBwYXJhbXMsCisJCQkJV01BX1ZERVZfU1RPUF9SRVFVRVNUX1RJTUVPVVQpOworCWlmICghbXNnKSB7CisJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIGZpbGwgdmRldiByZXF1ZXN0IGZvciB2ZGV2X2lkICVkIiwKKwkJCSBfX2Z1bmNfXywgcGFyYW1zLT5zbWVzZXNzaW9uSWQpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gZGV0YWNoX3BlZXI7CisJfQorCisJV01BX0xPR1coRkwoIk91dHN0YW5kaW5nIG1zZHUgcGFja2V0czogJWQiKSwKKwkJIG9sX3R4cnhfZ2V0X3R4X3BlbmRpbmcocGRldikpOworCisJbWF4X3dhaXRfaXRlcmF0aW9ucyA9CisJCXdtYS0+aW50ZXJmYWNlc1twYXJhbXMtPnNtZXNlc3Npb25JZF0uZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcCAvCisJCVdNQV9UWF9RX1JFQ0hFQ0tfVElNRVJfV0FJVDsKKworCXdoaWxlIChvbF90eHJ4X2dldF90eF9wZW5kaW5nKHBkZXYpICYmIG1heF93YWl0X2l0ZXJhdGlvbnMpIHsKKwkJV01BX0xPR1coRkwoIldhaXRpbmcgZm9yIG91dHN0YW5kaW5nIHBhY2tldCB0byBkcmFpbi4iKSk7CisJCWNkZl93YWl0X3NpbmdsZV9ldmVudCgmd21hLT50eF9xdWV1ZV9lbXB0eV9ldmVudCwKKwkJCQkgICAgICBXTUFfVFhfUV9SRUNIRUNLX1RJTUVSX01BWF9XQUlUKTsKKwkJbWF4X3dhaXRfaXRlcmF0aW9ucy0tOworCX0KKworCWlmIChvbF90eHJ4X2dldF90eF9wZW5kaW5nKHBkZXYpKSB7CisJCVdNQV9MT0dXKEZMKCJPdXRzdGFuZGluZyBtc2R1IHBhY2tldHMgYmVmb3JlIFZERVZfU1RPUCA6ICVkIiksCisJCQkgb2xfdHhyeF9nZXRfdHhfcGVuZGluZyhwZGV2KSk7CisJfQorCisJV01BX0xPR0QoIiVzLCB2ZGV2X2lkOiAlZCwgcGF1c2luZyB0eF9sbF9xdWV1ZSBmb3IgVkRFVl9TVE9QIChkZWxfYnNzKSIsCisJCSBfX2Z1bmNfXywgcGFyYW1zLT5zbWVzZXNzaW9uSWQpOworCW9sX3R4cnhfdmRldl9wYXVzZSh3bWEtPmludGVyZmFjZXNbcGFyYW1zLT5zbWVzZXNzaW9uSWRdLmhhbmRsZSwKKwkJCSAgIE9MX1RYUV9QQVVTRV9SRUFTT05fVkRFVl9TVE9QKTsKKwl3bWEtPmludGVyZmFjZXNbcGFyYW1zLT5zbWVzZXNzaW9uSWRdLnBhdXNlX2JpdG1hcCB8PQorCQkJCQkJCSgxIDw8IFBBVVNFX1RZUEVfSE9TVCk7CisKKwlpZiAod21pX3VuaWZpZWRfdmRldl9zdG9wX3NlbmQod21hLT53bWlfaGFuZGxlLCBwYXJhbXMtPnNtZXNlc3Npb25JZCkpIHsKKwkJV01BX0xPR1AoIiVzOiAlZCBGYWlsZWQgdG8gc2VuZCB2ZGV2IHN0b3AiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQl3bWFfcmVtb3ZlX3ZkZXZfcmVxKHdtYSwgcGFyYW1zLT5zbWVzZXNzaW9uSWQsCisJCQkJICAgIFdNQV9UQVJHRVRfUkVRX1RZUEVfVkRFVl9TVE9QKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZGV0YWNoX3BlZXI7CisJfQorCVdNQV9MT0dEKCIlczogYnNzaWQgJXBNIHZkZXZfaWQgJWQiLAorCQkgX19mdW5jX18sIHBhcmFtcy0+YnNzaWQsIHBhcmFtcy0+c21lc2Vzc2lvbklkKTsKKwlyZXR1cm47CitkZXRhY2hfcGVlcjoKKwl3bWFfcmVtb3ZlX3BlZXIod21hLCBwYXJhbXMtPmJzc2lkLCBwYXJhbXMtPnNtZXNlc3Npb25JZCwgcGVlciwKKwkJCXJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MpOworb3V0OgorCXBhcmFtcy0+c3RhdHVzID0gc3RhdHVzOworCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9ERUxFVEVfQlNTX1JTUCwgKHZvaWQgKilwYXJhbXMsIDApOworfQorCisvKioKKyAqIHdtYV9maW5kX2lic3NfdmRldigpIC0gVGhpcyBmdW5jdGlvbiBmaW5kcyB2ZGV2X2lkIGJhc2VkIG9uIGlucHV0IHR5cGUKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB0eXBlOiB2ZGV2IHR5cGUKKyAqCisgKiBSZXR1cm46IHZkZXYgaWQKKyAqLworaW50MzJfdCB3bWFfZmluZF92ZGV2X2J5X3R5cGUodHBfd21hX2hhbmRsZSB3bWEsIGludDMyX3QgdHlwZSkKK3sKKwlpbnQzMl90IHZkZXZfaWQgPSAwOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppbnRmID0gd21hLT5pbnRlcmZhY2VzOworCisJZm9yICh2ZGV2X2lkID0gMDsgdmRldl9pZCA8IHdtYS0+bWF4X2Jzc2lkOyB2ZGV2X2lkKyspIHsKKwkJaWYgKE5VTEwgIT0gaW50ZikgeworCQkJaWYgKGludGZbdmRldl9pZF0udHlwZSA9PSB0eXBlKQorCQkJCXJldHVybiB2ZGV2X2lkOworCQl9CisJfQorCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKy8qKgorICogd21hX3NldF92ZGV2X2ludHJhYnNzX2Z3ZCgpIC0gc2V0IGludHJhX2Z3ZCB2YWx1ZSB0byB3bmlfaW4uCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQHBkaXNfaW50cmFfZndkOiBQb2ludGVyIHRvIERpc2FibGVJbnRyYUJzc0Z3ZCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfc2V0X3ZkZXZfaW50cmFic3NfZndkKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICAgICB0cERpc2FibGVJbnRyYUJzc0Z3ZCBwZGlzX2ludHJhX2Z3ZCkKK3sKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHR4cnhfdmRldjsKKwlXTUFfTE9HRCgiJXM6aW50cmFfZndkOnZkZXYoJWQpIGludHJhYnNzX2Rpcz0lcyIsCisJCSBfX2Z1bmNfXywgcGRpc19pbnRyYV9md2QtPnNlc3Npb25JZCwKKwkJIChwZGlzX2ludHJhX2Z3ZC0+ZGlzYWJsZWludHJhYnNzZndkID8gInRydWUiIDogImZhbHNlIikpOworCisJdHhyeF92ZGV2ID0gd21hX2hhbmRsZS0+aW50ZXJmYWNlc1twZGlzX2ludHJhX2Z3ZC0+c2Vzc2lvbklkXS5oYW5kbGU7CisJb2xfdmRldl9yeF9zZXRfaW50cmFic3NfZndkKHR4cnhfdmRldiwKKwkJCQkgICAgcGRpc19pbnRyYV9md2QtPmRpc2FibGVpbnRyYWJzc2Z3ZCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3dtYS9zcmMvd21hX2Rmc19pbnRlcmZhY2UuYyBiL2NvcmUvd21hL3NyYy93bWFfZGZzX2ludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMGZjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dtYS9zcmMvd21hX2Rmc19pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBET0M6IHdtYV9kZnNfaW50ZXJmYWNlLmMKKyAqCisgKiBTb3VyY2UgY29kZSBib3Jyb3dlZCBmcm9tIFFDQV9NQUlOIERGUyBtb2R1bGUKKyAqLworCisjaW5jbHVkZSAid21hLmgiCisjaW5jbHVkZSAiYXRoX2Rmc19zdHJ1Y3RzLmgiCisjaW5jbHVkZSAid21hX2Rmc19pbnRlcmZhY2UuaCIKKworI2lmbmRlZiBBVEhfU1VQUE9SVF9ERlMKKyNkZWZpbmUgQVRIX1NVUFBPUlRfREZTIDEKKyNlbmRpZgorCisvKioKKyAqIG9sX2lmX2Rmc19hdHRhY2goKSAtIGRmcyBhdHRhY2gKKyAqIEBpYzogaWVlZTgwMjExY29tIHB0cgorICogQHB0cjogYXRoX2Rmc19jYXBzIHB0cgorICogQHJhZGFyX2luZm86IHJhZGFyIGluZm8KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgb2xfaWZfZGZzX2F0dGFjaChzdHJ1Y3QgaWVlZTgwMjExY29tICppYywgdm9pZCAqcHRyLCB2b2lkICpyYWRhcl9pbmZvKQoreworCXN0cnVjdCBhdGhfZGZzX2NhcHMgKnBDYXAgPSAoc3RydWN0IGF0aF9kZnNfY2FwcyAqKXB0cjsKKworCWNkZl9wcmludCgiJXM6IGNhbGxlZDsgcHRyPSVwLCByYWRhcl9pbmZvPSVwXG4iLAorCQkgIF9fZnVuY19fLCBwdHIsIHJhZGFyX2luZm8pOworCisJcENhcC0+YXRoX2NoaXBfaXNfYmJfdGx2ID0gMTsKKwlwQ2FwLT5hdGhfZGZzX2NvbWJpbmVkX3Jzc2lfb2sgPSAwOworCXBDYXAtPmF0aF9kZnNfZXh0X2NoYW5fb2sgPSAwOworCXBDYXAtPmF0aF9kZnNfdXNlX2VuaGFuY2VtZW50ID0gMDsKKwlwQ2FwLT5hdGhfc3Ryb25nX3NpZ25hbF9kaXZlcnNpcnkgPSAwOworCXBDYXAtPmF0aF9mYXN0ZGl2X3ZhbCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBvbF9pZl9nZXRfdHNmNjQoKSAtIFBsYWNlIEhvbGRlciBBUEkKKyAqIEBpYzogaWVlZTgwMjExY29tIHB0cgorICoKKyAqIFdlIGdldCB0aGUgdHNmIGZyb20gRmlybXdhcmUuCisgKgorICogUmV0dXJuOiBhbHdheXMgcmV0dXJuIHN1Y2Nlc3MoMCkKKyAqLwordWludDY0X3Qgb2xfaWZfZ2V0X3RzZjY0KHN0cnVjdCBpZWVlODAyMTFjb20gKmljKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIG9sX2lmX2Rmc19kaXNhYmxlKCkgLSBQbGFjZSBIb2xkZXIgQVBJCisgKiBAaWM6IGllZWU4MDIxMWNvbSBwdHIKKyAqCisgKiBpY19kZnNfZGlzYWJsZSBpcyBqdXN0IGEgcGxhY2UgaG9sZGVyCisgKiBmdW5jdGlvbiBzaW5jZSBmaXJtd2FyZSB0YWtlcyBjYXJlIG9mCisgKiBkaXNhYmxpbmcgdGhlIGRmcyBwaHllcnJvcnMgZGlzYWJsaW5nLgorICoKKyAqIFJldHVybjogYWx3YXlzIHJldHVybiBzdWNjZXNzKDApCisgKi8KK2ludCBvbF9pZl9kZnNfZGlzYWJsZShzdHJ1Y3QgaWVlZTgwMjExY29tICppYykKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpZWVlODAyMTFfZmluZF9jaGFubmVsKCkgLSBmaW5kIGllZWU4MDIxMSBjaGFubmVsCisgKiBAaWM6IGllZWU4MDIxMWNvbSBwdHIKKyAqIEBmcmVxOiBmcmVxdWVuY3kKKyAqIEBmbGFnczogZmxhZ3MKKyAqCisgKiBMb2NhdGUgYSBjaGFubmVsIGdpdmVuIGEgZnJlcXVlbmN5K2ZsYWdzLiBXZSBjYWNoZQorICogdGhlIHByZXZpb3VzIGxvb2t1cCB0byBvcHRpbWl6ZSBzd2l0aGluZyBiZXR3ZWVuCisgKiB0d28gY2hhbm5lbHMtLWFzIGhhcHBlbnMgd2l0aCBkeW5hbWljIHR1cmJvLgorICogVGhpcyB2ZXJpZmllcyB0aGF0IGZvdW5kIGNoYW5uZWxzIGhhdmUgbm90IGJlZW4KKyAqIGV4Y2x1ZGVkIGJlY2F1c2Ugb2YgMTFkLgorICoKKyAqIFJldHVybjogcmV0dXJucyBpZWVlODAyMTFfY2hhbm5lbCBvciBOVUxMIGZvciBlcnJvcgorICovCitzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmllZWU4MDIxMV9maW5kX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsCisJCQkJCQkgaW50IGZyZXEsIHVpbnQzMl90IGZsYWdzKQoreworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqYzsKKwlpbnQgaTsKKworCWZsYWdzICY9IElFRUU4MDIxMV9DSEFOX0FMTFRVUkJPOworCS8qIGJydXRlIGZvcmNlIHNlYXJjaCAqLworCWZvciAoaSA9IDA7IGkgPCBpYy0+aWNfbmNoYW5zOyBpKyspIHsKKwkJYyA9ICZpYy0+aWNfY2hhbm5lbHNbaV07CisKKwkJaWYgKCghSUVFRTgwMjExX0lTX0NIQU5fMTFEX0VYQ0xVREVEKGMpKSAmJgorCQkgICAgKGMtPmljX2ZyZXEgPT0gZnJlcSkgJiYKKwkJICAgICgoYy0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9BTExUVVJCTykgPT0gZmxhZ3MpKSB7CisJCQlyZXR1cm4gYzsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGljX2Rmc19lbmFibGUoKSAtIGVuYWJsZSBERlMKKyAqIEBpYzogaWVlZTgwMjExY29tIHB0cgorICogQGlzX2Zhc3RjbGs6IGlzIGZhc3RjbG9jaworICoKKyAqIEZvciBvZmZsb2FkIHNvbHV0aW9ucywgcmFkYXIgUEhZIGVycm9ycyB3aWxsIGJlIGVuYWJsZWQKKyAqIGJ5IHRoZSB0YXJnZXQgZmlybXdhcmUgd2hlbiBERlMgaXMgcmVxdWVzdGVkIGZvciB0aGUKKyAqIGN1cnJlbnQgY2hhbm5lbC4KKyAqCisgKiBSZXR1cm46IEFsd2F5cyByZXR1cm5zIHN1Y2Nlc3MKKyAqLworaW50IG9sX2lmX2Rmc19lbmFibGUoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsIGludCAqaXNfZmFzdGNsaywgdm9pZCAqcGUpCit7CisJLyoKKwkgKiBGb3IgcGVyZWdyaW5lLCB0cmVhdCBmYXN0Y2xrIGFzIHRoZSAib3ZlcnNhbXBsaW5nIiBtb2RlLgorCSAqIEl0J3Mgb24gYnkgZGVmYXVsdC4gIFRoaXMgbWF5IGNoYW5nZSBhdCBzb21lIHBvaW50LCBzbworCSAqIHdlIHNob3VsZCByZWFsbHkgcXVlcnkgdGhlIGZpcm13YXJlIHRvIGZpbmQgb3V0IHdoYXQKKwkgKiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGlzLgorCSAqLworCSgqaXNfZmFzdGNsaykgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWVlZTgwMjExX2llZWUybWh6KCkgLSBDb252ZXJ0IElFRUUgY2hhbm5lbCBudW1iZXIgdG8gTUh6IGZyZXF1ZW5jeS4KKyAqIEBjaGFuOiBjaGFubmVsIG51bWJlcgorICogQGZsYWdzOiBmbGFncworICoKKyAqIFJldHVybjogZnJlcXVlbmN5IGluIE1IegorICovCit1aW50MzJfdCBpZWVlODAyMTFfaWVlZTJtaHoodWludDMyX3QgY2hhbiwgdWludDMyX3QgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fMkdIWikgeworCQkvKiAyR0h6IGJhbmQgKi8KKwkJaWYgKGNoYW4gPT0gMTQpCisJCQlyZXR1cm4gMjQ4NDsKKwkJaWYgKGNoYW4gPCAxNCkKKwkJCXJldHVybiAyNDA3ICsgY2hhbiAqIDU7CisJCWVsc2UKKwkJCXJldHVybiAyNTEyICsgKChjaGFuIC0gMTUpICogMjApOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl81R0haKSB7CisJCS8qIDVHaHogYmFuZCAqLworCQlyZXR1cm4gNTAwMCArIChjaGFuICogNSk7CisJfSBlbHNlIHsKKwkJLyogZWl0aGVyLCBndWVzcyAqLworCQlpZiAoY2hhbiA9PSAxNCkKKwkJCXJldHVybiAyNDg0OworCQlpZiAoY2hhbiA8IDE0KSAgLyogMC0xMyAqLworCQkJcmV0dXJuIDI0MDcgKyBjaGFuICogNTsKKwkJaWYgKGNoYW4gPCAyNykgIC8qIDE1LTI2ICovCisJCQlyZXR1cm4gMjUxMiArICgoY2hhbiAtIDE1KSAqIDIwKTsKKwkJcmV0dXJuIDUwMDAgKyAoY2hhbiAqIDUpOworCX0KK30KKworLyoqCisgKiBvbF9pZl9kZnNfZ2V0X2V4dF9idXN5KCkgLSBQbGFjZSBob2xkZXIgZnVuY3Rpb24gaWNfZ2V0X2V4dF9idXN5CisgKiBAaWM6IGllZWU4MDIxMWNvbSBwdHIKKyAqCisgKiBSZXR1cm46IEFsd2F5cyByZXR1cm4gc3VjY2VzcyAoMCkKKyAqLworaW50IG9sX2lmX2Rmc19nZXRfZXh0X2J1c3koc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogb2xfaWZfZGZzX2dldF9taWJfY3ljbGVfY291bnRzX3BjdCgpIC0gUGxhY2UgaG9sZGVyIGZ1bmN0aW9uCisgKiBAaWM6IGllZWU4MDIxMWNvbSBwdHIKKyAqCisgKiBSZXR1cm46IEFsd2F5cyByZXR1cm4gc3VjY2VzcyAoMCkKKyAqLworaW50CitvbF9pZl9kZnNfZ2V0X21pYl9jeWNsZV9jb3VudHNfcGN0KHN0cnVjdCBpZWVlODAyMTFjb20gKmljLAorCQkJCSAgIHVpbnQzMl90ICpyeGNfcGNudCwgdWludDMyX3QgKnJ4Zl9wY250LAorCQkJCSAgIHVpbnQzMl90ICp0eGZfcGNudCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBvbF9pZl9kZnNfdXNlbm9sKCkgLSBkZnMgdXNlbm9sIGNhbGwKKyAqIEBpYzogaWVlZTgwMjExY29tIHB0cgorICoKKyAqIFJldHVybjogMCBmbyBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLwordWludDE2X3Qgb2xfaWZfZGZzX3VzZW5vbChzdHJ1Y3QgaWVlZTgwMjExY29tICppYykKK3sKKyNpZiBBVEhfU1VQUE9SVF9ERlMKKwlyZXR1cm4gZGZzX3VzZW5vbChpYyk7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmIC8qIEFUSF9TVVBQT1JUX0RGUyAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIGllZWU4MDIxMV9tYXJrX2RmcygpIC0gaW5kaWNhdGUgcmFkYXIgb24gY3VycmVudCBvcGVyYXRpbmcgZnJlcQorICogQGljOiBpZWVlODAyMTFjb20gcHRyCisgKiBAaWNoYW46IGNoYW5uZWwKKyAqCisgKiBGdW5jdGlvbiB0byBpbmRpY2F0ZSBSYWRhciBvbiB0aGUgY3VycmVudAorICogU0FQIG9wZXJhdGluZyBjaGFubmVsLlRoaXMgaW5kaWNhdGlvbiB3aWxsCisgKiBiZSBwb3N0ZWQgdG8gU0FQIHRvIHNlbGVjdCBhIG5ldyBjaGFubmVsCisgKiByYW5kb21seSBhbmQgaXNzdWUgYSB2ZGV2IHJlc3RhcnQgdG8KKyAqIG9wZXJhdGUgb24gdGhlIG5ldyBjaGFubmVsLgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkCitpZWVlODAyMTFfbWFya19kZnMoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqaWNoYW4pCit7CisJaW50IHN0YXR1czsKKwlzdGF0dXMgPSB3bWFfZGZzX2luZGljYXRlX3JhZGFyKGljLCBpY2hhbik7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3dtYS9zcmMvd21hX2ZlYXR1cmVzLmMgYi9jb3JlL3dtYS9zcmMvd21hX2ZlYXR1cmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1ZjJlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvd21hL3NyYy93bWFfZmVhdHVyZXMuYwpAQCAtMCwwICsxLDcxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogIERPQzogICAgd21hX2ZlYXR1cmVzLmMKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgZGlmZmVyZW50IGZlYXR1cmVzIHJlbGF0ZWQgZnVuY3Rpb25zIGxpa2UgV29XLAorICogIE9mZmxvYWRzLCBURExTIGV0Yy4KKyAqLworCisvKiBIZWFkZXIgZmlsZXMgKi8KKworI2luY2x1ZGUgIndtYS5oIgorI2luY2x1ZGUgIndtYV9hcGkuaCIKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAid21pX3VuaWZpZWRfYXBpLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfc3lzLmgiCisjaW5jbHVkZSAid25pX2FwaS5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJ3bWlfdW5pZmllZC5oIgorI2luY2x1ZGUgInduaV9jZmcuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAib2xfdHhyeF9jdHJsX2FwaS5oIgorI2luY2x1ZGUgIndsYW5fdGd0X2RlZl9jb25maWcuaCIKKworI2luY2x1ZGUgImNkZl9uYnVmLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAib2xfdHhyeF9hcGkuaCIKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisjaW5jbHVkZSAib2xfdHhyeF90eXBlcy5oIgorI2luY2x1ZGUgIm9sX3R4cnhfcGVlcl9maW5kLmgiCisKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJsaW1fYXBpLmgiCisjaW5jbHVkZSAibGltX3Nlc3Npb25fdXRpbHMuaCIKKworI2luY2x1ZGUgImNkc191dGlscy5oIgorCisjaWYgIWRlZmluZWQoUkVNT1ZFX1BLVF9MT0cpCisjaW5jbHVkZSAicGt0bG9nX2FjLmgiCisjZW5kaWYgLyogUkVNT1ZFX1BLVF9MT0cgKi8KKworI2luY2x1ZGUgImRiZ2xvZ19ob3N0LmgiCisjaW5jbHVkZSAiY3NyX2FwaS5oIgorI2luY2x1ZGUgIm9sX2Z3LmgiCisKKyNpbmNsdWRlICJkZnMuaCIKKyNpbmNsdWRlICJyYWRhcl9maWx0ZXJzLmgiCisjaW5jbHVkZSAid21hX2ludGVybmFsLmgiCisKKyNpZm5kZWYgQVJSQVlfTEVOR1RICisjZGVmaW5lIEFSUkFZX0xFTkdUSChhKSAgICAgICAgIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKyNlbmRpZgorCisjZGVmaW5lIFdNQV9XT1dfU1RBX1dBS0VfVVBfRVZFTlRTICgoMSA8PCBXT1dfQ1NBX0lFX0VWRU5UKSB8XAorCQkJCSgxIDw8IFdPV19DTElFTlRfS0lDS09VVF9FVkVOVCkgfFwKKwkJCQkoMSA8PCBXT1dfUEFUVEVSTl9NQVRDSF9FVkVOVCkgfFwKKwkJCQkoMSA8PCBXT1dfTUFHSUNfUEtUX1JFQ1ZEX0VWRU5UKSB8XAorCQkJCSgxIDw8IFdPV19ERUFVVEhfUkVDVkRfRVZFTlQpIHxcCisJCQkJKDEgPDwgV09XX0RJU0FTU09DX1JFQ1ZEX0VWRU5UKSB8XAorCQkJCSgxIDw8IFdPV19CTUlTU19FVkVOVCkgfFwKKwkJCQkoMSA8PCBXT1dfR1RLX0VSUl9FVkVOVCkgfFwKKwkJCQkoMSA8PCBXT1dfQkVUVEVSX0FQX0VWRU5UKSB8XAorCQkJCSgxIDw8IFdPV19IVFRfRVZFTlQpIHxcCisJCQkJKDEgPDwgV09XX1JBX01BVENIX0VWRU5UKSB8XAorCQkJCSgxIDw8IFdPV19OTE9fREVURUNURURfRVZFTlQpIHxcCisJCQkJKDEgPDwgV09XX0VYVFNDQU5fRVZFTlQpKVwKKworI2RlZmluZSBXTUFfV09XX1NBUF9XQUtFX1VQX0VWRU5UUyAoKDEgPDwgV09XX1BST0JFX1JFUV9XUFNfSUVfRVZFTlQpIHxcCisJCQkJKDEgPDwgV09XX1BBVFRFUk5fTUFUQ0hfRVZFTlQpIHxcCisJCQkJKDEgPDwgV09XX0FVVEhfUkVRX0VWRU5UKSB8XAorCQkJCSgxIDw8IFdPV19BU1NPQ19SRVFfRVZFTlQpIHxcCisJCQkJKDEgPDwgV09XX0RFQVVUSF9SRUNWRF9FVkVOVCkgfFwKKwkJCQkoMSA8PCBXT1dfRElTQVNTT0NfUkVDVkRfRVZFTlQpIHxcCisJCQkJKDEgPDwgV09XX0hUVF9FVkVOVCkpXAorCitzdGF0aWMgY29uc3QgdWludDhfdCBhcnBfcHRybltdID0gezB4MDgsIDB4MDZ9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXJwX21hc2tbXSA9IHsweGZmLCAweGZmfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IG5zX3B0cm5bXSA9IHsweDg2LCAweEREfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGRpc2N2cl9wdHJuW10gPSB7MHhlMCwgMHgwMCwgMHgwMCwgMHhmOH07CitzdGF0aWMgY29uc3QgdWludDhfdCBkaXNjdnJfbWFza1tdID0gezB4ZjAsIDB4MDAsIDB4MDAsIDB4Zjh9OworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKy8qKgorICogd21hX3Bvc3RfYXV0b19zaHV0ZG93bl9tc2coKSAtIHRvIHBvc3QgYXV0byBzaHV0ZG93biBldmVudCB0byBzbWUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHdtYV9wb3N0X2F1dG9fc2h1dGRvd25fbXNnKHZvaWQpCit7CisJdFNpckF1dG9TaHV0ZG93bkV2dFBhcmFtcyAqYXV0b19zaF9ldnQ7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCWNkc19tc2dfdCBzbWVfbXNnID0geyAwIH07CisKKwlhdXRvX3NoX2V2dCA9ICh0U2lyQXV0b1NodXRkb3duRXZ0UGFyYW1zICopCisJCSAgICAgIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyQXV0b1NodXRkb3duRXZ0UGFyYW1zKSk7CisJaWYgKCFhdXRvX3NoX2V2dCkgeworCQlXTUFfTE9HRShGTCgiTm8gTWVtIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlhdXRvX3NoX2V2dC0+c2h1dGRvd25fcmVhc29uID0KKwkJV01JX0hPU1RfQVVUT19TSFVURE9XTl9SRUFTT05fVElNRVJfRVhQSVJZOworCXNtZV9tc2cudHlwZSA9IGVXTklfU01FX0FVVE9fU0hVVERPV05fSU5EOworCXNtZV9tc2cuYm9keXB0ciA9IGF1dG9fc2hfZXZ0OworCXNtZV9tc2cuYm9keXZhbCA9IDA7CisKKwljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1NNRSwgJnNtZV9tc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCVdNQV9MT0dFKCJGYWlsIHRvIHBvc3QgZVdOSV9TTUVfQVVUT19TSFVURE9XTl9JTkQgbXNnIHRvIFNNRSIpOworCQljZGZfbWVtX2ZyZWUoYXV0b19zaF9ldnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorLyoqCisgKiB3bWFfc2VuZF9zbnJfcmVxdWVzdCgpIC0gc2VuZCByZXF1ZXN0IHRvIGZ3IHRvIGdldCBSU1NJIHN0YXRzCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQHBHZXRSc3NpUmVxOiBnZXQgUlNTSSByZXF1ZXN0CisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3NlbmRfc25yX3JlcXVlc3QodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCXZvaWQgKnBHZXRSc3NpUmVxKQoreworCXdtaV9idWZfdCBidWY7CisJd21pX3JlcXVlc3Rfc3RhdHNfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJdWludDhfdCBsZW4gPSBzaXplb2Yod21pX3JlcXVlc3Rfc3RhdHNfY21kX2ZpeGVkX3BhcmFtKTsKKwl0QW5pR2V0UnNzaVJlcSAqcFJzc2lCa1VwID0gTlVMTDsKKworCS8qIGNvbW1hbmQgaXMgaW4gcHJvZ2VzcyAqLworCWlmIChOVUxMICE9IHdtYV9oYW5kbGUtPnBHZXRSc3NpUmVxKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJLyogY3JlYXRlIGEgY29weSBvZiBjc3JSc3NpQ2FsbGJhY2sgdG8gc2VuZCByc3NpIHZhbHVlCisJICogYWZ0ZXIgd21pIGV2ZW50CisJICovCisJaWYgKHBHZXRSc3NpUmVxKSB7CisJCXBSc3NpQmtVcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih0QW5pR2V0UnNzaVJlcSkpOworCQlpZiAoIXBSc3NpQmtVcCkgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRBbmlHZXRSc3NpUmVxIik7CisJCQl3bWFfaGFuZGxlLT5wR2V0UnNzaVJlcSA9IE5VTEw7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisJCWNkZl9tZW1fc2V0KHBSc3NpQmtVcCwgc2l6ZW9mKHRBbmlHZXRSc3NpUmVxKSwgMCk7CisJCXBSc3NpQmtVcC0+c2Vzc2lvbklkID0KKwkJCSgodEFuaUdldFJzc2lSZXEgKikgcEdldFJzc2lSZXEpLT5zZXNzaW9uSWQ7CisJCXBSc3NpQmtVcC0+cnNzaUNhbGxiYWNrID0KKwkJCSgodEFuaUdldFJzc2lSZXEgKikgcEdldFJzc2lSZXEpLT5yc3NpQ2FsbGJhY2s7CisJCXBSc3NpQmtVcC0+cERldkNvbnRleHQgPQorCQkJKCh0QW5pR2V0UnNzaVJlcSAqKSBwR2V0UnNzaVJlcSktPnBEZXZDb250ZXh0OworCQl3bWFfaGFuZGxlLT5wR2V0UnNzaVJlcSA9ICh2b2lkICopcFJzc2lCa1VwOworCX0KKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUocFJzc2lCa1VwKTsKKwkJd21hX2hhbmRsZS0+cEdldFJzc2lSZXEgPSBOVUxMOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJY21kID0gKHdtaV9yZXF1ZXN0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcmVxdWVzdF9zdGF0c19jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3JlcXVlc3Rfc3RhdHNfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT5zdGF0c19pZCA9IFdNSV9SRVFVRVNUX1ZERVZfU1RBVDsKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQKKwkJICAgICh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsIGxlbiwgV01JX1JFUVVFU1RfU1RBVFNfQ01ESUQpKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCBob3N0IHN0YXRzIHJlcXVlc3QgdG8gZnciKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCWNkZl9tZW1fZnJlZShwUnNzaUJrVXApOworCQl3bWFfaGFuZGxlLT5wR2V0UnNzaVJlcSA9IE5VTEw7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfZ2V0X3NucigpIC0gZ2V0IFJTU0kgZnJvbSBmdworICogQHBzbnJfcmVxOiByZXF1ZXN0IHBhcmFtcworICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9nZXRfc25yKHRBbmlHZXRTbnJSZXEgKnBzbnJfcmVxKQoreworCXdtaV9idWZfdCBidWY7CisJd21pX3JlcXVlc3Rfc3RhdHNfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJdEFuaUdldFNuclJlcSAqcHNucl9yZXFfYmtwOworCXVpbnQ4X3QgbGVuID0gc2l6ZW9mKHdtaV9yZXF1ZXN0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSk7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaW50cjsKKworCXdtYV9oYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCisJaWYgKE5VTEwgPT0gd21hX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXMgOiBGYWlsZWQgdG8gZ2V0IHdtYV9oYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJaW50ciA9ICZ3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3BzbnJfcmVxLT5zZXNzaW9uSWRdOworCS8qIGNvbW1hbmQgaXMgaW4gcHJvZ2VzcyAqLworCWlmIChOVUxMICE9IGludHItPnBzbnJfcmVxKSB7CisJCVdNQV9MT0dFKCIlcyA6IHByZXZpb3VzIHNuciByZXF1ZXN0IGlzIHBlbmRpbmciLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJcHNucl9yZXFfYmtwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRBbmlHZXRTbnJSZXEpKTsKKwlpZiAoIXBzbnJfcmVxX2JrcCkgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdEFuaUdldFNuclJlcSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNkZl9tZW1fc2V0KHBzbnJfcmVxX2JrcCwgc2l6ZW9mKHRBbmlHZXRTbnJSZXEpLCAwKTsKKwlwc25yX3JlcV9ia3AtPnN0YUlkID0gcHNucl9yZXEtPnN0YUlkOworCXBzbnJfcmVxX2JrcC0+cERldkNvbnRleHQgPSBwc25yX3JlcS0+cERldkNvbnRleHQ7CisJcHNucl9yZXFfYmtwLT5zbnJDYWxsYmFjayA9IHBzbnJfcmVxLT5zbnJDYWxsYmFjazsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKHBzbnJfcmVxX2JrcCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljbWQgPSAod21pX3JlcXVlc3Rfc3RhdHNfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCWNtZC0+dmRldl9pZCA9IHBzbnJfcmVxLT5zZXNzaW9uSWQ7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcmVxdWVzdF9zdGF0c19jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3JlcXVlc3Rfc3RhdHNfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT5zdGF0c19pZCA9IFdNSV9SRVFVRVNUX1ZERVZfU1RBVDsKKwlpbnRyLT5wc25yX3JlcSA9ICh2b2lkICopcHNucl9yZXFfYmtwOworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgV01JX1JFUVVFU1RfU1RBVFNfQ01ESUQpKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCBob3N0IHN0YXRzIHJlcXVlc3QgdG8gZnciKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCWNkZl9tZW1fZnJlZShwc25yX3JlcV9ia3ApOworCQlpbnRyLT5wc25yX3JlcSA9IE5VTEw7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9wcm9jZXNzX2xpbmtfc3RhdHVzX3JlcSgpIC0gcHJvY2VzcyBsaW5rIHN0YXR1cyByZXF1ZXN0IGZyb20gVU1BQworICogQHdtYTogd21hIGhhbmRsZQorICogQHBHZXRMaW5rU3RhdHVzOiBnZXQgbGluayBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfcHJvY2Vzc19saW5rX3N0YXR1c19yZXEodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJIHRBbmlHZXRMaW5rU3RhdHVzICpwR2V0TGlua1N0YXR1cykKK3sKKwl3bWlfYnVmX3QgYnVmOworCXdtaV9yZXF1ZXN0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXVpbnQ4X3QgbGVuID0gc2l6ZW9mKHdtaV9yZXF1ZXN0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSk7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlID0KKwkJJndtYS0+aW50ZXJmYWNlc1twR2V0TGlua1N0YXR1cy0+c2Vzc2lvbklkXTsKKworCWlmIChpZmFjZS0+cGxpbmtfc3RhdHVzX3JlcSkgeworCQlXTUFfTE9HRSgiJXM6cHJldmlvdXMgbGluayBzdGF0dXMgcmVxdWVzdCBpcyBwZW5kaW5nLGRlbGV0aW5nIHRoZSBuZXcgcmVxdWVzdCIsCisJCQlfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShwR2V0TGlua1N0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZmFjZS0+cGxpbmtfc3RhdHVzX3JlcSA9IHBHZXRMaW5rU3RhdHVzOworCWNtZCA9ICh3bWlfcmVxdWVzdF9zdGF0c19jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JlcXVlc3Rfc3RhdHNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9yZXF1ZXN0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+c3RhdHNfaWQgPSBXTUlfUkVRVUVTVF9WREVWX1JBVEVfU1RBVDsKKwljbWQtPnZkZXZfaWQgPSBwR2V0TGlua1N0YXR1cy0+c2Vzc2lvbklkOworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSBXTUlfUkVRVUVTVF9TVEFUU19DTURJRCkpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIFdNSSBsaW5rICBzdGF0dXMgcmVxdWVzdCB0byBmdyIpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJaWZhY2UtPnBsaW5rX3N0YXR1c19yZXEgPSBOVUxMOworCQlnb3RvIGVuZDsKKwl9CisKKwlyZXR1cm47CisKK2VuZDoKKwl3bWFfcG9zdF9saW5rX3N0YXR1cyhwR2V0TGlua1N0YXR1cywgTElOS19TVEFUVVNfTEVHQUNZKTsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9MUEhCCisvKioKKyAqIHdtYV9scGhiX2NvbmZfaGJlbmFibGUoKSAtIGVuYWJsZSBjb21tYW5kIG9mIExQSEIgY29uZmlndXJhdGlvbiByZXF1ZXN0cworICogQHdtYV9oYW5kbGU6IFdNQSBoYW5kbGUKKyAqIEBscGhiX2NvbmZfcmVxOiBjb25maWd1cmF0aW9uIGluZm8KKyAqIEBieV91c2VyOiB3aGV0aGVyIHRoaXMgY2FsbCBpcyBmcm9tIHVzZXIgb3IgY2FjaGVkIHJlc2VudAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9scGhiX2NvbmZfaGJlbmFibGUodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgdFNpckxQSEJSZXEgKmxwaGJfY29uZl9yZXEsIGJvb2wgYnlfdXNlcikKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaW50IHN0YXR1cyA9IDA7CisJdFNpckxQSEJFbmFibGVTdHJ1Y3QgKnRzX2xwaGJfZW5hYmxlOworCXdtaV9idWZfdCBidWYgPSBOVUxMOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX2hiX3NldF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtICpoYl9lbmFibGVfZnA7CisJaW50IGxlbiA9IHNpemVvZih3bWlfaGJfc2V0X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0pOworCWludCBpOworCisJaWYgKGxwaGJfY29uZl9yZXEgPT0gTlVMTCkgeworCQlXTUFfTE9HRSgiJXMgOiBMUEhCIGNvbmZpZ3VyYXRpb24gaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXRzX2xwaGJfZW5hYmxlID0gJihscGhiX2NvbmZfcmVxLT5wYXJhbXMubHBoYkVuYWJsZVJlcSk7CisJV01BX0xPR0koIiVzOiBXTUEgLS0+IFdNSV9IQl9TRVRfRU5BQkxFIGVuYWJsZT0lZCwgaXRlbT0lZCwgc2Vzc2lvbj0lZCIsCisJCSBfX2Z1bmNfXywKKwkJIHRzX2xwaGJfZW5hYmxlLT5lbmFibGUsCisJCSB0c19scGhiX2VuYWJsZS0+aXRlbSwgdHNfbHBoYl9lbmFibGUtPnNlc3Npb24pOworCisJaWYgKCh0c19scGhiX2VuYWJsZS0+aXRlbSAhPSAxKSAmJiAodHNfbHBoYl9lbmFibGUtPml0ZW0gIT0gMikpIHsKKwkJV01BX0xPR0UoIiVzIDogTFBIQiBjb25maWd1cmF0aW9uIHdyb25nIGl0ZW0gJWQiLAorCQkJIF9fZnVuY19fLCB0c19scGhiX2VuYWJsZS0+aXRlbSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzIDogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCWhiX2VuYWJsZV9mcCA9ICh3bWlfaGJfc2V0X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmaGJfZW5hYmxlX2ZwLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfaGJfc2V0X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX2hiX3NldF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwkvKiBmaWxsIGluIHZhbHVlcyAqLworCWhiX2VuYWJsZV9mcC0+dmRldl9pZCA9IHRzX2xwaGJfZW5hYmxlLT5zZXNzaW9uOworCWhiX2VuYWJsZV9mcC0+ZW5hYmxlID0gdHNfbHBoYl9lbmFibGUtPmVuYWJsZTsKKwloYl9lbmFibGVfZnAtPml0ZW0gPSB0c19scGhiX2VuYWJsZS0+aXRlbTsKKwloYl9lbmFibGVfZnAtPnNlc3Npb24gPSB0c19scGhiX2VuYWJsZS0+c2Vzc2lvbjsKKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgICAgICBsZW4sIFdNSV9IQl9TRVRfRU5BQkxFX0NNRElEKTsKKwlpZiAoc3RhdHVzICE9IEVPSykgeworCQlXTUFfTE9HRSgid21pX3VuaWZpZWRfY21kX3NlbmQgV01JX0hCX1NFVF9FTkFCTEUgcmV0dXJuZWQgRXJyb3IgJWQiLAorCQkJc3RhdHVzKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChieV91c2VyKSB7CisJCS8qIHRhcmdldCBhbHJlYWR5IGNvbmZpZ3VyZWQsIG5vdyBjYWNoZSBjb21tYW5kIHN0YXR1cyAqLworCQlpZiAodHNfbHBoYl9lbmFibGUtPmVuYWJsZSkgeworCQkJaSA9IHRzX2xwaGJfZW5hYmxlLT5pdGVtIC0gMTsKKwkJCXdtYV9oYW5kbGUtPndvdy5scGhiX2NhY2hlW2ldLmNtZAorCQkJCT0gTFBIQl9TRVRfRU5fUEFSQU1TX0lORElEOworCQkJd21hX2hhbmRsZS0+d293LmxwaGJfY2FjaGVbaV0ucGFyYW1zLmxwaGJFbmFibGVSZXEuCisJCQllbmFibGUgPSB0c19scGhiX2VuYWJsZS0+ZW5hYmxlOworCQkJd21hX2hhbmRsZS0+d293LmxwaGJfY2FjaGVbaV0ucGFyYW1zLmxwaGJFbmFibGVSZXEuCisJCQlpdGVtID0gdHNfbHBoYl9lbmFibGUtPml0ZW07CisJCQl3bWFfaGFuZGxlLT53b3cubHBoYl9jYWNoZVtpXS5wYXJhbXMubHBoYkVuYWJsZVJlcS4KKwkJCXNlc3Npb24gPSB0c19scGhiX2VuYWJsZS0+c2Vzc2lvbjsKKworCQkJV01BX0xPR0koIiVzOiBjYWNoZWQgTFBIQiBzdGF0dXMgaW4gV01BIGNvbnRleHQgZm9yIGl0ZW0gJWQiLAorCQkJCV9fZnVuY19fLCBpKTsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tZW1femVybygodm9pZCAqKSZ3bWFfaGFuZGxlLT53b3cubHBoYl9jYWNoZSwKKwkJCQkgICAgIHNpemVvZih3bWFfaGFuZGxlLT53b3cubHBoYl9jYWNoZSkpOworCQkJV01BX0xPR0koIiVzOiBjbGVhcmVkIGFsbCBjYWNoZWQgTFBIQiBzdGF0dXMgaW4gV01BIGNvbnRleHQiLAorCQkJCV9fZnVuY19fKTsKKwkJfQorCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CitlcnJvcjoKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiB3bWFfbHBoYl9jb25mX3RjcF9wYXJhbXMoKSAtIHNldCB0Y3AgcGFyYW1zIG9mIExQSEIgY29uZmlndXJhdGlvbiByZXF1ZXN0cworICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBscGhiX2NvbmZfcmVxOiBscGhiIGNvbmZpZyByZXF1ZXN0CisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX2xwaGJfY29uZl90Y3BfcGFyYW1zKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICAgdFNpckxQSEJSZXEgKmxwaGJfY29uZl9yZXEpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWludCBzdGF0dXMgPSAwOworCXRTaXJMUEhCVGNwUGFyYW1TdHJ1Y3QgKnRzX2xwaGJfdGNwX3BhcmFtOworCXdtaV9idWZfdCBidWYgPSBOVUxMOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX2hiX3NldF90Y3BfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSAqaGJfdGNwX3BhcmFtc19mcDsKKwlpbnQgbGVuID0gc2l6ZW9mKHdtaV9oYl9zZXRfdGNwX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0pOworCisJaWYgKGxwaGJfY29uZl9yZXEgPT0gTlVMTCkgeworCQlXTUFfTE9HRSgiJXMgOiBMUEhCIGNvbmZpZ3VyYXRpb24gaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXRzX2xwaGJfdGNwX3BhcmFtID0gJihscGhiX2NvbmZfcmVxLT5wYXJhbXMubHBoYlRjcFBhcmFtUmVxKTsKKwlXTUFfTE9HSSgiJXM6IFdNQSAtLT4gV01JX0hCX1NFVF9UQ1BfUEFSQU1TIHNydl9pcD0lMDh4LCBkZXZfaXA9JTA4eCwgc3JjX3BvcnQ9JWQsICIKKwkJImRzdF9wb3J0PSVkLCB0aW1lb3V0PSVkLCBzZXNzaW9uPSVkLCBnYXRld2F5X21hYz0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCwgIgorCQkidGltZVBlcmlvZFNlYz0lZCwgdGNwU249JWQiLCBfX2Z1bmNfXywgdHNfbHBoYl90Y3BfcGFyYW0tPnNydl9pcCwKKwkJdHNfbHBoYl90Y3BfcGFyYW0tPmRldl9pcCwgdHNfbHBoYl90Y3BfcGFyYW0tPnNyY19wb3J0LAorCQl0c19scGhiX3RjcF9wYXJhbS0+ZHN0X3BvcnQsIHRzX2xwaGJfdGNwX3BhcmFtLT50aW1lb3V0LAorCQl0c19scGhiX3RjcF9wYXJhbS0+c2Vzc2lvbiwgdHNfbHBoYl90Y3BfcGFyYW0tPmdhdGV3YXlfbWFjWzBdLAorCQl0c19scGhiX3RjcF9wYXJhbS0+Z2F0ZXdheV9tYWNbMV0sCisJCXRzX2xwaGJfdGNwX3BhcmFtLT5nYXRld2F5X21hY1syXSwKKwkJdHNfbHBoYl90Y3BfcGFyYW0tPmdhdGV3YXlfbWFjWzNdLAorCQl0c19scGhiX3RjcF9wYXJhbS0+Z2F0ZXdheV9tYWNbNF0sCisJCXRzX2xwaGJfdGNwX3BhcmFtLT5nYXRld2F5X21hY1s1XSwKKwkJdHNfbHBoYl90Y3BfcGFyYW0tPnRpbWVQZXJpb2RTZWMsIHRzX2xwaGJfdGNwX3BhcmFtLT50Y3BTbik7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzIDogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCWhiX3RjcF9wYXJhbXNfZnAgPSAod21pX2hiX3NldF90Y3BfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZoYl90Y3BfcGFyYW1zX2ZwLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfaGJfc2V0X3RjcF9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9oYl9zZXRfdGNwX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0pKTsKKworCS8qIGZpbGwgaW4gdmFsdWVzICovCisJaGJfdGNwX3BhcmFtc19mcC0+dmRldl9pZCA9IHRzX2xwaGJfdGNwX3BhcmFtLT5zZXNzaW9uOworCWhiX3RjcF9wYXJhbXNfZnAtPnNydl9pcCA9IHRzX2xwaGJfdGNwX3BhcmFtLT5zcnZfaXA7CisJaGJfdGNwX3BhcmFtc19mcC0+ZGV2X2lwID0gdHNfbHBoYl90Y3BfcGFyYW0tPmRldl9pcDsKKwloYl90Y3BfcGFyYW1zX2ZwLT5zZXEgPSB0c19scGhiX3RjcF9wYXJhbS0+dGNwU247CisJaGJfdGNwX3BhcmFtc19mcC0+c3JjX3BvcnQgPSB0c19scGhiX3RjcF9wYXJhbS0+c3JjX3BvcnQ7CisJaGJfdGNwX3BhcmFtc19mcC0+ZHN0X3BvcnQgPSB0c19scGhiX3RjcF9wYXJhbS0+ZHN0X3BvcnQ7CisJaGJfdGNwX3BhcmFtc19mcC0+aW50ZXJ2YWwgPSB0c19scGhiX3RjcF9wYXJhbS0+dGltZVBlcmlvZFNlYzsKKwloYl90Y3BfcGFyYW1zX2ZwLT50aW1lb3V0ID0gdHNfbHBoYl90Y3BfcGFyYW0tPnRpbWVvdXQ7CisJaGJfdGNwX3BhcmFtc19mcC0+c2Vzc2lvbiA9IHRzX2xwaGJfdGNwX3BhcmFtLT5zZXNzaW9uOworCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKHRzX2xwaGJfdGNwX3BhcmFtLT5nYXRld2F5X21hYywKKwkJCQkgICAmaGJfdGNwX3BhcmFtc19mcC0+Z2F0ZXdheV9tYWMpOworCisJc3RhdHVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLAorCQkJCSAgICAgIGxlbiwgV01JX0hCX1NFVF9UQ1BfUEFSQU1TX0NNRElEKTsKKwlpZiAoc3RhdHVzICE9IEVPSykgeworCQlXTUFfTE9HRSgid21pX3VuaWZpZWRfY21kX3NlbmQgV01JX0hCX1NFVF9UQ1BfUEFSQU1TIHJldHVybmVkIEVycm9yICVkIiwKKwkJCXN0YXR1cyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworZXJyb3I6CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogd21hX2xwaGJfY29uZl90Y3BfcGt0X2ZpbHRlcigpIC0gY29uZmlndXJlIHRjcCBwYWNrZXQgZmlsdGVyIGNvbW1hbmQgb2YgTFBIQgorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBscGhiX2NvbmZfcmVxOiBscGhiIGNvbmZpZyByZXF1ZXN0CisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX2xwaGJfY29uZl90Y3BfcGt0X2ZpbHRlcih0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJCXRTaXJMUEhCUmVxICpscGhiX2NvbmZfcmVxKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlpbnQgc3RhdHVzID0gMDsKKwl0U2lyTFBIQlRjcEZpbHRlclN0cnVjdCAqdHNfbHBoYl90Y3BfZmlsdGVyOworCXdtaV9idWZfdCBidWYgPSBOVUxMOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX2hiX3NldF90Y3BfcGt0X2ZpbHRlcl9jbWRfZml4ZWRfcGFyYW0gKmhiX3RjcF9maWx0ZXJfZnA7CisJaW50IGxlbiA9IHNpemVvZih3bWlfaGJfc2V0X3RjcF9wa3RfZmlsdGVyX2NtZF9maXhlZF9wYXJhbSk7CisKKwlpZiAobHBoYl9jb25mX3JlcSA9PSBOVUxMKSB7CisJCVdNQV9MT0dFKCIlcyA6IExQSEIgY29uZmlndXJhdGlvbiBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJdHNfbHBoYl90Y3BfZmlsdGVyID0gJihscGhiX2NvbmZfcmVxLT5wYXJhbXMubHBoYlRjcEZpbHRlclJlcSk7CisJV01BX0xPR0koIiVzOiBXTUEgLS0+IFdNSV9IQl9TRVRfVENQX1BLVF9GSUxURVIgbGVuZ3RoPSVkLCBvZmZzZXQ9JWQsIHNlc3Npb249JWQsICIKKwkJImZpbHRlcj0lMng6JTJ4OiUyeDolMng6JTJ4OiUyeCAuLi4iLCBfX2Z1bmNfXywKKwkJdHNfbHBoYl90Y3BfZmlsdGVyLT5sZW5ndGgsIHRzX2xwaGJfdGNwX2ZpbHRlci0+b2Zmc2V0LAorCQl0c19scGhiX3RjcF9maWx0ZXItPnNlc3Npb24sIHRzX2xwaGJfdGNwX2ZpbHRlci0+ZmlsdGVyWzBdLAorCQl0c19scGhiX3RjcF9maWx0ZXItPmZpbHRlclsxXSwgdHNfbHBoYl90Y3BfZmlsdGVyLT5maWx0ZXJbMl0sCisJCXRzX2xwaGJfdGNwX2ZpbHRlci0+ZmlsdGVyWzNdLCB0c19scGhiX3RjcF9maWx0ZXItPmZpbHRlcls0XSwKKwkJdHNfbHBoYl90Y3BfZmlsdGVyLT5maWx0ZXJbNV0pOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlcyA6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwloYl90Y3BfZmlsdGVyX2ZwID0KKwkJKHdtaV9oYl9zZXRfdGNwX3BrdF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmhiX3RjcF9maWx0ZXJfZnAtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9oYl9zZXRfdGNwX3BrdF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9oYl9zZXRfdGNwX3BrdF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwkvKiBmaWxsIGluIHZhbHVlcyAqLworCWhiX3RjcF9maWx0ZXJfZnAtPnZkZXZfaWQgPSB0c19scGhiX3RjcF9maWx0ZXItPnNlc3Npb247CisJaGJfdGNwX2ZpbHRlcl9mcC0+bGVuZ3RoID0gdHNfbHBoYl90Y3BfZmlsdGVyLT5sZW5ndGg7CisJaGJfdGNwX2ZpbHRlcl9mcC0+b2Zmc2V0ID0gdHNfbHBoYl90Y3BfZmlsdGVyLT5vZmZzZXQ7CisJaGJfdGNwX2ZpbHRlcl9mcC0+c2Vzc2lvbiA9IHRzX2xwaGJfdGNwX2ZpbHRlci0+c2Vzc2lvbjsKKwltZW1jcHkoKHZvaWQgKikmaGJfdGNwX2ZpbHRlcl9mcC0+ZmlsdGVyLAorCSAgICAgICAodm9pZCAqKSZ0c19scGhiX3RjcF9maWx0ZXItPmZpbHRlciwKKwkgICAgICAgV01JX1dMQU5fSEJfTUFYX0ZJTFRFUl9TSVpFKTsKKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgICAgICBsZW4sIFdNSV9IQl9TRVRfVENQX1BLVF9GSUxURVJfQ01ESUQpOworCWlmIChzdGF0dXMgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCJ3bWlfdW5pZmllZF9jbWRfc2VuZCBXTUlfSEJfU0VUX1RDUF9QS1RfRklMVEVSIHJldHVybmVkIEVycm9yICVkIiwKKwkJCXN0YXR1cyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworZXJyb3I6CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogd21hX2xwaGJfY29uZl91ZHBfcGFyYW1zKCkgLSBjb25maWd1cmUgdWRwIHBhcmFtIGNvbW1hbmQgb2YgTFBIQgorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBscGhiX2NvbmZfcmVxOiBscGhiIGNvbmZpZyByZXF1ZXN0CisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX2xwaGJfY29uZl91ZHBfcGFyYW1zKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICAgdFNpckxQSEJSZXEgKmxwaGJfY29uZl9yZXEpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWludCBzdGF0dXMgPSAwOworCXRTaXJMUEhCVWRwUGFyYW1TdHJ1Y3QgKnRzX2xwaGJfdWRwX3BhcmFtOworCXdtaV9idWZfdCBidWYgPSBOVUxMOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX2hiX3NldF91ZHBfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSAqaGJfdWRwX3BhcmFtc19mcDsKKwlpbnQgbGVuID0gc2l6ZW9mKHdtaV9oYl9zZXRfdWRwX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0pOworCisJaWYgKGxwaGJfY29uZl9yZXEgPT0gTlVMTCkgeworCQlXTUFfTE9HRSgiJXMgOiBMUEhCIGNvbmZpZ3VyYXRpb24gaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXRzX2xwaGJfdWRwX3BhcmFtID0gJihscGhiX2NvbmZfcmVxLT5wYXJhbXMubHBoYlVkcFBhcmFtUmVxKTsKKwlXTUFfTE9HSSgiJXM6IFdNQSAtLT4gV01JX0hCX1NFVF9VRFBfUEFSQU1TIHNydl9pcD0lZCwgZGV2X2lwPSVkLCBzcmNfcG9ydD0lZCwgIgorCQkiZHN0X3BvcnQ9JWQsIGludGVydmFsPSVkLCB0aW1lb3V0PSVkLCBzZXNzaW9uPSVkLCAiCisJCSJnYXRld2F5X21hYz0lMng6JTJ4OiUyeDolMng6JTJ4OiUyeCIsIF9fZnVuY19fLAorCQl0c19scGhiX3VkcF9wYXJhbS0+c3J2X2lwLCB0c19scGhiX3VkcF9wYXJhbS0+ZGV2X2lwLAorCQl0c19scGhiX3VkcF9wYXJhbS0+c3JjX3BvcnQsIHRzX2xwaGJfdWRwX3BhcmFtLT5kc3RfcG9ydCwKKwkJdHNfbHBoYl91ZHBfcGFyYW0tPmludGVydmFsLCB0c19scGhiX3VkcF9wYXJhbS0+dGltZW91dCwKKwkJdHNfbHBoYl91ZHBfcGFyYW0tPnNlc3Npb24sIHRzX2xwaGJfdWRwX3BhcmFtLT5nYXRld2F5X21hY1swXSwKKwkJdHNfbHBoYl91ZHBfcGFyYW0tPmdhdGV3YXlfbWFjWzFdLAorCQl0c19scGhiX3VkcF9wYXJhbS0+Z2F0ZXdheV9tYWNbMl0sCisJCXRzX2xwaGJfdWRwX3BhcmFtLT5nYXRld2F5X21hY1szXSwKKwkJdHNfbHBoYl91ZHBfcGFyYW0tPmdhdGV3YXlfbWFjWzRdLAorCQl0c19scGhiX3VkcF9wYXJhbS0+Z2F0ZXdheV9tYWNbNV0pOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlcyA6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwloYl91ZHBfcGFyYW1zX2ZwID0gKHdtaV9oYl9zZXRfdWRwX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmaGJfdWRwX3BhcmFtc19mcC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2hiX3NldF91ZHBfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfaGJfc2V0X3VkcF9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwkvKiBmaWxsIGluIHZhbHVlcyAqLworCWhiX3VkcF9wYXJhbXNfZnAtPnZkZXZfaWQgPSB0c19scGhiX3VkcF9wYXJhbS0+c2Vzc2lvbjsKKwloYl91ZHBfcGFyYW1zX2ZwLT5zcnZfaXAgPSB0c19scGhiX3VkcF9wYXJhbS0+c3J2X2lwOworCWhiX3VkcF9wYXJhbXNfZnAtPmRldl9pcCA9IHRzX2xwaGJfdWRwX3BhcmFtLT5kZXZfaXA7CisJaGJfdWRwX3BhcmFtc19mcC0+c3JjX3BvcnQgPSB0c19scGhiX3VkcF9wYXJhbS0+c3JjX3BvcnQ7CisJaGJfdWRwX3BhcmFtc19mcC0+ZHN0X3BvcnQgPSB0c19scGhiX3VkcF9wYXJhbS0+ZHN0X3BvcnQ7CisJaGJfdWRwX3BhcmFtc19mcC0+aW50ZXJ2YWwgPSB0c19scGhiX3VkcF9wYXJhbS0+aW50ZXJ2YWw7CisJaGJfdWRwX3BhcmFtc19mcC0+dGltZW91dCA9IHRzX2xwaGJfdWRwX3BhcmFtLT50aW1lb3V0OworCWhiX3VkcF9wYXJhbXNfZnAtPnNlc3Npb24gPSB0c19scGhiX3VkcF9wYXJhbS0+c2Vzc2lvbjsKKwlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUih0c19scGhiX3VkcF9wYXJhbS0+Z2F0ZXdheV9tYWMsCisJCQkJICAgJmhiX3VkcF9wYXJhbXNfZnAtPmdhdGV3YXlfbWFjKTsKKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgICAgICBsZW4sIFdNSV9IQl9TRVRfVURQX1BBUkFNU19DTURJRCk7CisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIndtaV91bmlmaWVkX2NtZF9zZW5kIFdNSV9IQl9TRVRfVURQX1BBUkFNUyByZXR1cm5lZCBFcnJvciAlZCIsCisJCQlzdGF0dXMpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK2Vycm9yOgorCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9scGhiX2NvbmZfdWRwX3BrdF9maWx0ZXIoKSAtIGNvbmZpZ3VyZSB1ZHAgcGt0IGZpbHRlciBjb21tYW5kIG9mIExQSEIKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAbHBoYl9jb25mX3JlcTogbHBoYiBjb25maWcgcmVxdWVzdAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9scGhiX2NvbmZfdWRwX3BrdF9maWx0ZXIodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQl0U2lyTFBIQlJlcSAqbHBoYl9jb25mX3JlcSkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaW50IHN0YXR1cyA9IDA7CisJdFNpckxQSEJVZHBGaWx0ZXJTdHJ1Y3QgKnRzX2xwaGJfdWRwX2ZpbHRlcjsKKwl3bWlfYnVmX3QgYnVmID0gTlVMTDsKKwl1aW50OF90ICpidWZfcHRyOworCXdtaV9oYl9zZXRfdWRwX3BrdF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtICpoYl91ZHBfZmlsdGVyX2ZwOworCWludCBsZW4gPSBzaXplb2Yod21pX2hiX3NldF91ZHBfcGt0X2ZpbHRlcl9jbWRfZml4ZWRfcGFyYW0pOworCisJaWYgKGxwaGJfY29uZl9yZXEgPT0gTlVMTCkgeworCQlXTUFfTE9HRSgiJXMgOiBMUEhCIGNvbmZpZ3VyYXRpb24gaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXRzX2xwaGJfdWRwX2ZpbHRlciA9ICYobHBoYl9jb25mX3JlcS0+cGFyYW1zLmxwaGJVZHBGaWx0ZXJSZXEpOworCVdNQV9MT0dJKCIlczogV01BIC0tPiBXTUlfSEJfU0VUX1VEUF9QS1RfRklMVEVSIGxlbmd0aD0lZCwgb2Zmc2V0PSVkLCBzZXNzaW9uPSVkLCAiCisJCSJmaWx0ZXI9JTJ4OiUyeDolMng6JTJ4OiUyeDolMnggLi4uIiwgX19mdW5jX18sCisJCXRzX2xwaGJfdWRwX2ZpbHRlci0+bGVuZ3RoLCB0c19scGhiX3VkcF9maWx0ZXItPm9mZnNldCwKKwkJdHNfbHBoYl91ZHBfZmlsdGVyLT5zZXNzaW9uLCB0c19scGhiX3VkcF9maWx0ZXItPmZpbHRlclswXSwKKwkJdHNfbHBoYl91ZHBfZmlsdGVyLT5maWx0ZXJbMV0sIHRzX2xwaGJfdWRwX2ZpbHRlci0+ZmlsdGVyWzJdLAorCQl0c19scGhiX3VkcF9maWx0ZXItPmZpbHRlclszXSwgdHNfbHBoYl91ZHBfZmlsdGVyLT5maWx0ZXJbNF0sCisJCXRzX2xwaGJfdWRwX2ZpbHRlci0+ZmlsdGVyWzVdKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXMgOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJaGJfdWRwX2ZpbHRlcl9mcCA9CisJCSh3bWlfaGJfc2V0X3VkcF9wa3RfZmlsdGVyX2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZoYl91ZHBfZmlsdGVyX2ZwLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfaGJfc2V0X3VkcF9wa3RfZmlsdGVyX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfaGJfc2V0X3VkcF9wa3RfZmlsdGVyX2NtZF9maXhlZF9wYXJhbSkpOworCisJLyogZmlsbCBpbiB2YWx1ZXMgKi8KKwloYl91ZHBfZmlsdGVyX2ZwLT52ZGV2X2lkID0gdHNfbHBoYl91ZHBfZmlsdGVyLT5zZXNzaW9uOworCWhiX3VkcF9maWx0ZXJfZnAtPmxlbmd0aCA9IHRzX2xwaGJfdWRwX2ZpbHRlci0+bGVuZ3RoOworCWhiX3VkcF9maWx0ZXJfZnAtPm9mZnNldCA9IHRzX2xwaGJfdWRwX2ZpbHRlci0+b2Zmc2V0OworCWhiX3VkcF9maWx0ZXJfZnAtPnNlc3Npb24gPSB0c19scGhiX3VkcF9maWx0ZXItPnNlc3Npb247CisJbWVtY3B5KCh2b2lkICopJmhiX3VkcF9maWx0ZXJfZnAtPmZpbHRlciwKKwkgICAgICAgKHZvaWQgKikmdHNfbHBoYl91ZHBfZmlsdGVyLT5maWx0ZXIsCisJICAgICAgIFdNSV9XTEFOX0hCX01BWF9GSUxURVJfU0laRSk7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCQkJICAgICAgbGVuLCBXTUlfSEJfU0VUX1VEUF9QS1RfRklMVEVSX0NNRElEKTsKKwlpZiAoc3RhdHVzICE9IEVPSykgeworCQlXTUFfTE9HRSgid21pX3VuaWZpZWRfY21kX3NlbmQgV01JX0hCX1NFVF9VRFBfUEtUX0ZJTFRFUiByZXR1cm5lZCBFcnJvciAlZCIsCisJCQlzdGF0dXMpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK2Vycm9yOgorCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9wcm9jZXNzX2xwaGJfY29uZl9yZXEoKSAtIGhhbmRsZSBMUEhCIGNvbmZpZ3VyYXRpb24gcmVxdWVzdHMKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAbHBoYl9jb25mX3JlcTogbHBoYiBjb25maWcgcmVxdWVzdAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX2xwaGJfY29uZl9yZXEodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICAgdFNpckxQSEJSZXEgKmxwaGJfY29uZl9yZXEpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJaWYgKGxwaGJfY29uZl9yZXEgPT0gTlVMTCkgeworCQlXTUFfTE9HRSgiJXMgOiBMUEhCIGNvbmZpZ3VyYXRpb24gaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCVdNQV9MT0dJKCIlcyA6IExQSEIgY29uZmlndXJhdGlvbiBjbWQgaWQgaXMgJWQiLCBfX2Z1bmNfXywKKwkJIGxwaGJfY29uZl9yZXEtPmNtZCk7CisJc3dpdGNoIChscGhiX2NvbmZfcmVxLT5jbWQpIHsKKwljYXNlIExQSEJfU0VUX0VOX1BBUkFNU19JTkRJRDoKKwkJY2RmX3N0YXR1cyA9IHdtYV9scGhiX2NvbmZfaGJlbmFibGUod21hX2hhbmRsZSwKKwkJCQkJCSAgICBscGhiX2NvbmZfcmVxLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIExQSEJfU0VUX1RDUF9QQVJBTVNfSU5ESUQ6CisJCWNkZl9zdGF0dXMgPSB3bWFfbHBoYl9jb25mX3RjcF9wYXJhbXMod21hX2hhbmRsZSwKKwkJCQkJCSAgICAgIGxwaGJfY29uZl9yZXEpOworCQlicmVhazsKKworCWNhc2UgTFBIQl9TRVRfVENQX1BLVF9GSUxURVJfSU5ESUQ6CisJCWNkZl9zdGF0dXMgPSB3bWFfbHBoYl9jb25mX3RjcF9wa3RfZmlsdGVyKHdtYV9oYW5kbGUsCisJCQkJCQkJICBscGhiX2NvbmZfcmVxKTsKKwkJYnJlYWs7CisKKwljYXNlIExQSEJfU0VUX1VEUF9QQVJBTVNfSU5ESUQ6CisJCWNkZl9zdGF0dXMgPSB3bWFfbHBoYl9jb25mX3VkcF9wYXJhbXMod21hX2hhbmRsZSwKKwkJCQkJCSAgICAgIGxwaGJfY29uZl9yZXEpOworCQlicmVhazsKKworCWNhc2UgTFBIQl9TRVRfVURQX1BLVF9GSUxURVJfSU5ESUQ6CisJCWNkZl9zdGF0dXMgPSB3bWFfbHBoYl9jb25mX3VkcF9wa3RfZmlsdGVyKHdtYV9oYW5kbGUsCisJCQkJCQkJICBscGhiX2NvbmZfcmVxKTsKKwkJYnJlYWs7CisKKwljYXNlIExQSEJfU0VUX05FVFdPUktfSU5GT19JTkRJRDoKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwljZGZfbWVtX2ZyZWUobHBoYl9jb25mX3JlcSk7CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0xQSEIgKi8KKworLyoqCisgKiB3bWFfcHJvY2Vzc19kaGNwX2luZCgpIC0gcHJvY2VzcyBkaGNwIGluZGljYXRpb24gZnJvbSBTTUUKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdGFfZGhjcF9pbmQ6IERIQ1AgaW5kaWNhdGlvbgorICoKKyAqIFJldHVybjogQ0RGIFN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX2RoY3BfaW5kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQl0QW5pREhDUEluZCAqdGFfZGhjcF9pbmQpCit7CisJdWludDhfdCB2ZGV2X2lkOworCWludCBzdGF0dXMgPSAwOworCXdtaV9idWZfdCBidWYgPSBOVUxMOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX3BlZXJfc2V0X3BhcmFtX2NtZF9maXhlZF9wYXJhbSAqcGVlcl9zZXRfcGFyYW1fZnA7CisJaW50IGxlbiA9IHNpemVvZih3bWlfcGVlcl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtKTsKKworCWlmICghdGFfZGhjcF9pbmQpIHsKKwkJV01BX0xPR0UoIiVzIDogREhDUCBpbmRpY2F0aW9uIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoIXdtYV9maW5kX3ZkZXZfYnlfYWRkcih3bWFfaGFuZGxlLCB0YV9kaGNwX2luZC0+YWRhcHRlck1hY0FkZHIsCisJCQkJICAgJnZkZXZfaWQpKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgdmRldiBpZCBmb3IgREhDUCBpbmRpY2F0aW9uIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlXTUFfTE9HSSgiJXM6IFdNQSAtLT4gV01JX1BFRVJfU0VUX1BBUkFNIHRyaWdnZXJlZCBieSBESENQLCAiCisJCSAibXNnVHlwZT0lcywiCisJCSAiZGV2aWNlX21vZGU9JWQsIG1hY0FkZHI9IiBNQUNfQUREUkVTU19TVFIsCisJCSBfX2Z1bmNfXywKKwkJIHRhX2RoY3BfaW5kLT5tc2dUeXBlID09IFdNQV9ESENQX1NUQVJUX0lORCA/CisJCSAiV01BX0RIQ1BfU1RBUlRfSU5EIiA6ICJXTUFfREhDUF9TVE9QX0lORCIsCisJCSB0YV9kaGNwX2luZC0+ZGV2aWNlX21vZGUsCisJCSBNQUNfQUREUl9BUlJBWSh0YV9kaGNwX2luZC0+cGVlck1hY0FkZHIpKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXMgOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJcGVlcl9zZXRfcGFyYW1fZnAgPSAod21pX3BlZXJfc2V0X3BhcmFtX2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZwZWVyX3NldF9wYXJhbV9mcC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfc2V0X3BhcmFtX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcGVlcl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtKSk7CisKKwkvKiBmaWxsIGluIHZhbHVlcyAqLworCXBlZXJfc2V0X3BhcmFtX2ZwLT52ZGV2X2lkID0gdmRldl9pZDsKKwlwZWVyX3NldF9wYXJhbV9mcC0+cGFyYW1faWQgPSBXTUlfUEVFUl9DUklUX1BST1RPX0hJTlRfRU5BQkxFRDsKKwlpZiAoV01BX0RIQ1BfU1RBUlRfSU5EID09IHRhX2RoY3BfaW5kLT5tc2dUeXBlKQorCQlwZWVyX3NldF9wYXJhbV9mcC0+cGFyYW1fdmFsdWUgPSAxOworCWVsc2UKKwkJcGVlcl9zZXRfcGFyYW1fZnAtPnBhcmFtX3ZhbHVlID0gMDsKKwlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUih0YV9kaGNwX2luZC0+cGVlck1hY0FkZHIsCisJCQkJICAgJnBlZXJfc2V0X3BhcmFtX2ZwLT5wZWVyX21hY2FkZHIpOworCisJc3RhdHVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLAorCQkJCSAgICAgIGxlbiwgV01JX1BFRVJfU0VUX1BBUkFNX0NNRElEKTsKKwlpZiAoc3RhdHVzICE9IEVPSykgeworCQlXTUFfTE9HRSgiJXM6IHdtaV91bmlmaWVkX2NtZF9zZW5kIFdNSV9QRUVSX1NFVF9QQVJBTV9DTUQiCisJCQkgIiByZXR1cm5lZCBFcnJvciAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfY2hhbl90b19tb2RlKCkgLSBjb252ZXJ0IGNoYW5uZWwgdG8gcGh5IG1vZGUKKyAqIEBjaGFuOiBjaGFubmVsIG51bWJlcgorICogQGNoYW5fd2lkdGg6IGNoYW5uZWwgd2lkdGgKKyAqIEB2aHRfY2FwYWJsZTogdmh0IGNhcGFibGUKKyAqIEBkb3QxMV9tb2RlOiA4MDIuMTEgbW9kZQorICoKKyAqIFJldHVybjogcmV0dXJuIHBoeSBtb2RlCisgKi8KK1dMQU5fUEhZX01PREUgd21hX2NoYW5fdG9fbW9kZSh1OCBjaGFuLCBwaHlfY2hfd2lkdGggY2hhbl93aWR0aCwKKwkJCQkgICAgICB1OCB2aHRfY2FwYWJsZSwgdTggZG90MTFfbW9kZSkKK3sKKwlXTEFOX1BIWV9NT0RFIHBoeW1vZGUgPSBNT0RFX1VOS05PV047CisKKwkvKiAyLjQgR0h6IGJhbmQgKi8KKwlpZiAoKGNoYW4gPj0gV01BXzExR19DSEFOTkVMX0JFR0lOKSAmJiAoY2hhbiA8PSBXTUFfMTFHX0NIQU5ORUxfRU5EKSkgeworCQlzd2l0Y2ggKGNoYW5fd2lkdGgpIHsKKwkJY2FzZSBDSF9XSURUSF8yME1IWjoKKwkJCS8qIEluIGNhc2Ugb2Ygbm8gY2hhbm5lbCBib25kaW5nLCB1c2UgZG90MTFfbW9kZQorCQkJICogdG8gc2V0IHBoeSBtb2RlCisJCQkgKi8KKwkJCXN3aXRjaCAoZG90MTFfbW9kZSkgeworCQkJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFBOgorCQkJCXBoeW1vZGUgPSBNT0RFXzExQTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV05JX0NGR19ET1QxMV9NT0RFXzExQjoKKwkJCQlwaHltb2RlID0gTU9ERV8xMUI7CisJCQkJYnJlYWs7CisJCQljYXNlIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUc6CisJCQkJcGh5bW9kZSA9IE1PREVfMTFHOworCQkJCWJyZWFrOworCQkJY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFHX09OTFk6CisJCQkJcGh5bW9kZSA9IE1PREVfMTFHT05MWTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogQ29uZmlndXJlIE1PREVfMTFOR19IVDIwIGZvcgorCQkJCSAqIHNlbGYgdmRldihmb3Igdmh0IHRvbykKKwkJCQkgKi8KKwkJCQlwaHltb2RlID0gTU9ERV8xMU5HX0hUMjA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDSF9XSURUSF80ME1IWjoKKwkJCXBoeW1vZGUgPSB2aHRfY2FwYWJsZSA/IE1PREVfMTFBQ19WSFQ0MCA6CisJCQkJCQlNT0RFXzExTkdfSFQ0MDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiA1IEdIeiBiYW5kICovCisJaWYgKChjaGFuID49IFdNQV8xMUFfQ0hBTk5FTF9CRUdJTikgJiYgKGNoYW4gPD0gV01BXzExQV9DSEFOTkVMX0VORCkpIHsKKwkJc3dpdGNoIChjaGFuX3dpZHRoKSB7CisJCWNhc2UgQ0hfV0lEVEhfMjBNSFo6CisJCQlwaHltb2RlID0gdmh0X2NhcGFibGUgPyBNT0RFXzExQUNfVkhUMjAgOgorCQkJCQkJTU9ERV8xMU5BX0hUMjA7CisJCQlicmVhazsKKwkJY2FzZSBDSF9XSURUSF80ME1IWjoKKwkJCXBoeW1vZGUgPSB2aHRfY2FwYWJsZSA/IE1PREVfMTFBQ19WSFQ0MCA6CisJCQkJCQlNT0RFXzExTkFfSFQ0MDsKKwkJCWJyZWFrOworCQljYXNlIENIX1dJRFRIXzgwTUhaOgorCQkJcGh5bW9kZSA9IE1PREVfMTFBQ19WSFQ4MDsKKwkJCWJyZWFrOworI2lmIENPTkZJR18xNjBNSFpfU1VQUE9SVCAhPSAwCisJCWNhc2UgQ0hfV0lEVEhfMTYwTUhaOgorCQkJcGh5bW9kZSA9IE1PREVfMTFBQ19WSFQxNjA7CisJCQlicmVhazsKKwkJY2FzZSBDSF9XSURUSF84MFA4ME1IWjoKKwkJCXBoeW1vZGUgPSBNT0RFXzExQUNfVkhUODBfODA7CisJCQlicmVhazsKKyNlbmRpZgorCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIDUuOSBHSHogQmFuZCAqLworCWlmICgoY2hhbiA+PSBXTUFfMTFQX0NIQU5ORUxfQkVHSU4pICYmIChjaGFuIDw9IFdNQV8xMVBfQ0hBTk5FTF9FTkQpKQorCQkvKiBPbmx5IExlZ2FjeSBNb2R1bGF0aW9uIFNjaGVtZXMgYXJlIHN1cHBvcnRlZCAqLworCQlwaHltb2RlID0gTU9ERV8xMUE7CisKKwlXTUFfTE9HRCgiJXM6IHBoeW1vZGUgJWQgY2hhbm5lbCAlZCBjaF93aWR0aCAlZCB2aHRfY2FwYWJsZSAlZCAiCisJCSAiZG90MTFfbW9kZSAlZCIsIF9fZnVuY19fLCBwaHltb2RlLCBjaGFuLAorCQkgY2hhbl93aWR0aCwgdmh0X2NhcGFibGUsIGRvdDExX21vZGUpOworCisJcmV0dXJuIHBoeW1vZGU7Cit9CisKKy8qKgorICogd21hX2dldF9saW5rX3NwZWVkKCkgLXNlbmQgY29tbWFuZCB0byBnZXQgbGlua3NwZWVkCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcExpbmtTcGVlZDogbGluayBzcGVlZCBpbmZvCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX2dldF9saW5rX3NwZWVkKFdNQV9IQU5ETEUgaGFuZGxlLCB0U2lyTGlua1NwZWVkSW5mbyAqcExpbmtTcGVlZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCXdtaV9wZWVyX2dldF9lc3RpbWF0ZWRfbGlua3NwZWVkX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCB3bWlfYnVmOworCXVpbnQzMl90IGxlbjsKKwl1aW50OF90ICpidWZfcHRyOworCisJaWYgKCF3bWFfaGFuZGxlIHx8ICF3bWFfaGFuZGxlLT53bWlfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogV01BIGlzIGNsb3NlZCwgY2FuIG5vdCBpc3N1ZSBnZXQgbGluayBzcGVlZCBjbWQiLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJaWYgKCFXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYV9oYW5kbGUtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkgICAgV01JX1NFUlZJQ0VfRVNUSU1BVEVfTElOS1NQRUVEKSkgeworCQlXTUFfTE9HRSgiJXM6IExpbmtzcGVlZCBmZWF0dXJlIGJpdCBub3QgZW5hYmxlZCIKKwkJCSAiIFNlbmRpbmcgdmFsdWUgMCBhcyBsaW5rIHNwZWVkLiIsIF9fZnVuY19fKTsKKwkJd21hX3NlbmRfbGlua19zcGVlZCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlsZW4gPSBzaXplb2Yod21pX3BlZXJfZ2V0X2VzdGltYXRlZF9saW5rc3BlZWRfY21kX2ZpeGVkX3BhcmFtKTsKKwl3bWlfYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghd21pX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKHdtaV9idWYpOworCisJY21kID0gKHdtaV9wZWVyX2dldF9lc3RpbWF0ZWRfbGlua3NwZWVkX2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2dldF9lc3RpbWF0ZWRfbGlua3NwZWVkX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcGVlcl9nZXRfZXN0aW1hdGVkX2xpbmtzcGVlZF9jbWRfZml4ZWRfcGFyYW0pKTsKKworCS8qIENvcHkgdGhlIHBlZXIgbWFjYWRkcmVzcyB0byB0aGUgd21hIGJ1ZmZlciAqLworCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKHBMaW5rU3BlZWQtPnBlZXJfbWFjYWRkciwKKwkJCQkgICAmY21kLT5wZWVyX21hY2FkZHIpOworCisJV01BX0xPR0QoIiVzOiBwTGlua1NwZWVkLT5wZWVyTWFjQWRkcjogJXBNLCAiCisJCSAicGVlcl9tYWNhZGRyLm1hY19hZGRyMzF0bzA6IDB4JXgsIHBlZXJfbWFjYWRkci5tYWNfYWRkcjQ3dG8zMjogMHgleCIsCisJCSBfX2Z1bmNfXywgcExpbmtTcGVlZC0+cGVlcl9tYWNhZGRyLAorCQkgY21kLT5wZWVyX21hY2FkZHIubWFjX2FkZHIzMXRvMCwKKwkJIGNtZC0+cGVlcl9tYWNhZGRyLm1hY19hZGRyNDd0bzMyKTsKKworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCB3bWlfYnVmLCBsZW4sCisJCQkJIFdNSV9QRUVSX0dFVF9FU1RJTUFURURfTElOS1NQRUVEX0NNRElEKSkgeworCQlXTUFfTE9HRSgiJXM6IGZhaWxlZCB0byBzZW5kIGxpbmsgc3BlZWQgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZSh3bWlfYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgRkVBVFVSRV9HUkVFTl9BUAorCisvKioKKyAqIHdtaV91bmlmaWVkX3BkZXZfZ3JlZW5fYXBfcHNfZW5hYmxlX2NtZCgpIC0gZW5hYmxlIGdyZWVuIGFwIHBvd2Vyc2F2ZSBjb21tYW5kCisgKiBAd21pX2hhbmRsZTogd21pIGhhbmRsZQorICogQHZhbHVlOiB2YWx1ZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludDMyX3Qgd21pX3VuaWZpZWRfcGRldl9ncmVlbl9hcF9wc19lbmFibGVfY21kKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCQkJCSAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKwl3bWlfcGRldl9ncmVlbl9hcF9wc19lbmFibGVfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQzMl90IGxlbiA9IHNpemVvZigqY21kKTsKKworCVdNQV9MT0dEKCJTZXQgR3JlZW4gQVAgUFMgdmFsICVkIiwgdmFsdWUpOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dQKCIlczogR3JlZW4gQVAgUFMgTWVtIEFsbG9jIEZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kID0gKHdtaV9wZGV2X2dyZWVuX2FwX3BzX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfZ3JlZW5fYXBfcHNfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcGRldl9ncmVlbl9hcF9wc19lbmFibGVfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT5yZXNlcnZlZDAgPSAwOworCWNtZC0+ZW5hYmxlID0gdmFsdWU7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJIFdNSV9QREVWX0dSRUVOX0FQX1BTX0VOQUJMRV9DTURJRCkpIHsKKwkJV01BX0xPR0UoIlNldCBHcmVlbiBBUCBQUyBwYXJhbSBGYWlsZWQgdmFsICVkIiwgdmFsdWUpOworCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0dSRUVOX0FQICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTFBIQgorLyoqCisgKiB3bWFfbHBoYl9oYW5kbGVyKCkgLSBzZW5kIExQSEIgaW5kaWNhdGlvbiB0byBTTUUKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBldmVudDogZXZlbnQgaGFuZGxlcgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd21hX2xwaGJfaGFuZGxlcih0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCAqZXZlbnQpCit7CisJd21pX2hiX2luZF9ldmVudF9maXhlZF9wYXJhbSAqaGJfZnA7CisJdFNpckxQSEJJbmQgKnNscGhiX2luZGljYXRpb247CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCWNkc19tc2dfdCBzbWVfbXNnID0geyAwIH07CisKKwloYl9mcCA9ICh3bWlfaGJfaW5kX2V2ZW50X2ZpeGVkX3BhcmFtICopIGV2ZW50OworCWlmICghaGJfZnApIHsKKwkJV01BX0xPR0UoIkludmFsaWQgd21pX2hiX2luZF9ldmVudF9maXhlZF9wYXJhbSBidWZmZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJV01BX0xPR0QoImxwaGIgaW5kaWNhdGlvbiByZWNlaXZlZCB3aXRoIHZkZXZfaWQ9JWQsIHNlc3Npb249JWQsIHJlYXNvbj0lZCIsCisJCWhiX2ZwLT52ZGV2X2lkLCBoYl9mcC0+c2Vzc2lvbiwgaGJfZnAtPnJlYXNvbik7CisKKwlzbHBoYl9pbmRpY2F0aW9uID0gKHRTaXJMUEhCSW5kICopIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyTFBIQkluZCkpOworCisJaWYgKCFzbHBoYl9pbmRpY2F0aW9uKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIExQSEIgaW5kaWNhdGlvbiBidWZmZXIiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc2xwaGJfaW5kaWNhdGlvbi0+c2Vzc2lvbklkeCA9IGhiX2ZwLT5zZXNzaW9uOworCXNscGhiX2luZGljYXRpb24tPnByb3RvY29sVHlwZSA9IGhiX2ZwLT5yZWFzb247CisJc2xwaGJfaW5kaWNhdGlvbi0+ZXZlbnRSZWFzb24gPSBoYl9mcC0+cmVhc29uOworCisJc21lX21zZy50eXBlID0gZVdOSV9TTUVfTFBIQl9JTkQ7CisJc21lX21zZy5ib2R5cHRyID0gc2xwaGJfaW5kaWNhdGlvbjsKKwlzbWVfbXNnLmJvZHl2YWwgPSAwOworCisJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9TTUUsICZzbWVfbXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlXTUFfTE9HRSgiRmFpbCB0byBwb3N0IGVXTklfU01FX0xQSEJfSU5EIG1zZyB0byBTTUUiKTsKKwkJY2RmX21lbV9mcmVlKHNscGhiX2luZGljYXRpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTFBIQiAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1JBX0ZJTFRFUklORworLyoqCisgKiB3bWFfd293X3N0YV9yYV9maWx0ZXIoKSAtIHNldCBSQSBmaWx0ZXIgcGF0dGVybiBpbiBmdworICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworc3RhdGljIENERl9TVEFUVVMgd21hX3dvd19zdGFfcmFfZmlsdGVyKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IHZkZXZfaWQpCit7CisKKwlXTUlfV09XX0FERF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSAqY21kOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZTsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJaW50MzJfdCBsZW47CisJaW50IHJldDsKKworCWlmYWNlID0gJndtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXTsKKworCWxlbiA9IHNpemVvZihXTUlfV09XX0FERF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSkgKworCSAgICAgIFdNSV9UTFZfSERSX1NJWkUgKworCSAgICAgIDAgKiBzaXplb2YoV09XX0JJVE1BUF9QQVRURVJOX1QpICsKKwkgICAgICBXTUlfVExWX0hEUl9TSVpFICsKKwkgICAgICAwICogc2l6ZW9mKFdPV19JUFY0X1NZTkNfUEFUVEVSTl9UKSArCisJICAgICAgV01JX1RMVl9IRFJfU0laRSArCisJICAgICAgMCAqIHNpemVvZihXT1dfSVBWNl9TWU5DX1BBVFRFUk5fVCkgKworCSAgICAgIFdNSV9UTFZfSERSX1NJWkUgKworCSAgICAgIDAgKiBzaXplb2YoV09XX01BR0lDX1BBVFRFUk5fQ01EKSArCisJICAgICAgV01JX1RMVl9IRFJfU0laRSArCisJICAgICAgMCAqIHNpemVvZihBX1VJTlQzMikgKyBXTUlfVExWX0hEUl9TSVpFICsgMSAqIHNpemVvZihBX1VJTlQzMik7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCBhbGxvY2F0ZSB3bWkgYnVmZmVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNtZCA9IChXTUlfV09XX0FERF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgY21kOworCisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfV01JX1dPV19BRERfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAoV01JX1dPV19BRERfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSB2ZGV2X2lkOworCWNtZC0+cGF0dGVybl9pZCA9IGlmYWNlLT5udW1fd293X2RlZmF1bHRfcGF0dGVybnMrKywKKwljbWQtPnBhdHRlcm5fdHlwZSA9IFdPV19JUFY2X1JBX1BBVFRFUk47CisJYnVmX3B0ciArPSBzaXplb2YoV01JX1dPV19BRERfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0pOworCisJLyogRmlsbCBUTFYgZm9yIFdNSVRMVl9UQUdfU1RSVUNfV09XX0JJVE1BUF9QQVRURVJOX1QgYnV0IG5vIGRhdGEuICovCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgMCk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCisJLyogRmlsbCBUTFYgZm9yIFdNSVRMVl9UQUdfU1RSVUNfV09XX0lQVjRfU1lOQ19QQVRURVJOX1QgYnV0IG5vIGRhdGEuICovCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgMCk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCisJLyogRmlsbCBUTFYgZm9yIFdNSVRMVl9UQUdfU1RSVUNfV09XX0lQVjZfU1lOQ19QQVRURVJOX1QgYnV0IG5vIGRhdGEuICovCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgMCk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCisJLyogRmlsbCBUTFYgZm9yIFdNSVRMVl9UQUdfU1RSVUNfV09XX01BR0lDX1BBVFRFUk5fQ01EIGJ1dCBubyBkYXRhLiAqLworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIDApOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKworCS8qIEZpbGwgVExWIGZvciBwYXR0ZXJuX2luZm9fdGltZW91dCBidXQgbm8gZGF0YS4gKi8KKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwgMCk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCisJLyogRmlsbCBUTFYgZm9yIHJhX3JhdGVsaW1pdF9pbnRlcnZhbC4gKi8KKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwgc2l6ZW9mKEFfVUlOVDMyKSk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCisJKigoQV9VSU5UMzIgKikgYnVmX3B0cikgPSB3bWEtPlJBcmF0ZUxpbWl0SW50ZXJ2YWw7CisKKwlXTUFfTE9HRCgiJXM6IHNlbmQgUkEgcmF0ZSBsaW1pdCBbJWRdIHRvIGZ3IHZkZXYgPSAlZCIsIF9fZnVuY19fLAorCQkgd21hLT5SQXJhdGVMaW1pdEludGVydmFsLCB2ZGV2X2lkKTsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX1dPV19BRERfV0FLRV9QQVRURVJOX0NNRElEKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNlbmQgUkEgcmF0ZSBsaW1pdCB0byBmdyIsIF9fZnVuY19fKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCWlmYWNlLT5udW1fd293X2RlZmF1bHRfcGF0dGVybnMtLTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fUkFfRklMVEVSSU5HICovCisKKy8qKgorICogd21pX3VuaWZpZWRfbmF0X2tlZXBhbGl2ZV9lbmFibGUoKSAtIGVuYWJsZSBOQVQga2VlcGFsaXZlIGZpbHRlcgorICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21pX3VuaWZpZWRfbmF0X2tlZXBhbGl2ZV9lbmFibGUodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCkKK3sKKwlXTUlfVkRFVl9JUFNFQ19OQVRLRUVQQUxJVkVfRklMVEVSX0NNRF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisKKwlXTUFfTE9HRCgiJXM6IHZkZXZfaWQgJWQiLCBfX2Z1bmNfXywgdmRldl9pZCk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR1AoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNtZCA9IChXTUlfVkRFVl9JUFNFQ19OQVRLRUVQQUxJVkVfRklMVEVSX0NNRF9maXhlZF9wYXJhbSAqKQorCQl3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ19XTUlfVkRFVl9JUFNFQ19OQVRLRUVQQUxJVkVfRklMVEVSX0NNRF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgIChXTUlfVkRFVl9JUFNFQ19OQVRLRUVQQUxJVkVfRklMVEVSX0NNRF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJY21kLT5hY3Rpb24gPSBJUFNFQ19OQVRLRUVQQUxJVkVfRklMVEVSX0VOQUJMRTsKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgV01JX1ZERVZfSVBTRUNfTkFUS0VFUEFMSVZFX0ZJTFRFUl9DTURJRCkpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gc2VuZCBOQVQga2VlcGFsaXZlIGVuYWJsZSBjb21tYW5kIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21pX3VuaWZpZWRfY3NhX29mZmxvYWRfZW5hYmxlKCkgLSBzZW4gQ1NBIG9mZmxvYWQgZW5hYmxlIGNvbW1hbmQKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtaV91bmlmaWVkX2NzYV9vZmZsb2FkX2VuYWJsZSh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkKQoreworCXdtaV9jc2Ffb2ZmbG9hZF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQzMl90IGxlbiA9IHNpemVvZigqY21kKTsKKworCVdNQV9MT0dEKCIlczogdmRldl9pZCAlZCIsIF9fZnVuY19fLCB2ZGV2X2lkKTsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HUCgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY21kID0gKHdtaV9jc2Ffb2ZmbG9hZF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jc2Ffb2ZmbG9hZF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9jc2Ffb2ZmbG9hZF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gdmRldl9pZDsKKwljbWQtPmNzYV9vZmZsb2FkX2VuYWJsZSA9IFdNSV9DU0FfT0ZGTE9BRF9FTkFCTEU7CisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJIFdNSV9DU0FfT0ZGTE9BRF9FTkFCTEVfQ01ESUQpKSB7CisJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIHNlbmQgQ1NBIG9mZmxvYWQgZW5hYmxlIGNvbW1hbmQiLAorCQkJIF9fZnVuY19fKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9OQU4KKy8qKgorICogd21hX25hbl9yc3BfZXZlbnRfaGFuZGxlcigpIC0gRnVuY3Rpb24gaXMgdXNlZCB0byBoYW5kbGUgbmFuIHJlc3BvbnNlCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZXZlbnRfYnVmOiBldmVudCBidWZmZXIKKyAqIEBsZW46IGxlbmd0aCBvZiBidWZmZXIKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX25hbl9yc3BfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50X2J1ZiwKKwkJCSAgICAgIHVpbnQzMl90IGxlbikKK3sKKwlXTUlfTkFOX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXRTaXJOYW5FdmVudCAqbmFuX3JzcF9ldmVudDsKKwl3bWlfbmFuX2V2ZW50X2hkciAqbmFuX3JzcF9ldmVudF9oZHI7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJY2RzX21zZ190IGNkc19tc2c7CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50MzJfdCBhbGxvY19sZW47CisKKwkvKgorCSAqIFRoaXMgaXMgaG93IHJlY2VpdmVkIGV2ZW50X2J1ZiBsb29rcyBsaWtlCisJICoKKwkgKiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0gZXZlbnRfYnVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCSAqCisJICogPC0td21pX25hbl9ldmVudF9oZHItLT48LS0tV01JX1RMVl9IRFJfU0laRS0tLT48LS0tLS0gZGF0YSAtLS0tLS0tLT4KKwkgKgorCSAqICstLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogfCB0bHZfaGVhZGVyfCBkYXRhX2xlbnwgV01JVExWX1RBR19BUlJBWV9CWVRFIHwgbmFuX3JzcF9ldmVudF9kYXRhIHwKKwkgKiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqLworCisJV01BX0xPR0QoIiVzOiBQb3N0aW5nIE5hTiByZXNwb25zZSBldmVudCB0byBTTUUiLCBfX2Z1bmNfXyk7CisJcGFyYW1fYnVmID0gKFdNSV9OQU5fRVZFTlRJRF9wYXJhbV90bHZzICopIGV2ZW50X2J1ZjsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgbmFuIHJlc3BvbnNlIGV2ZW50IGJ1ZiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW5hbl9yc3BfZXZlbnRfaGRyID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgbmFuX3JzcF9ldmVudF9oZHI7CisJYWxsb2NfbGVuID0gc2l6ZW9mKHRTaXJOYW5FdmVudCk7CisJYWxsb2NfbGVuICs9IG5hbl9yc3BfZXZlbnRfaGRyLT5kYXRhX2xlbjsKKwluYW5fcnNwX2V2ZW50ID0gKHRTaXJOYW5FdmVudCAqKSBjZGZfbWVtX21hbGxvYyhhbGxvY19sZW4pOworCWlmIChOVUxMID09IG5hbl9yc3BfZXZlbnQpIHsKKwkJV01BX0xPR0UoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwluYW5fcnNwX2V2ZW50LT5ldmVudF9kYXRhX2xlbiA9IG5hbl9yc3BfZXZlbnRfaGRyLT5kYXRhX2xlbjsKKwljZGZfbWVtX2NvcHkobmFuX3JzcF9ldmVudC0+ZXZlbnRfZGF0YSwgYnVmX3B0ciArCisJCSAgICAgc2l6ZW9mKHdtaV9uYW5fZXZlbnRfaGRyKSArIFdNSV9UTFZfSERSX1NJWkUsCisJCSAgICAgbmFuX3JzcF9ldmVudC0+ZXZlbnRfZGF0YV9sZW4pOworCWNkc19tc2cudHlwZSA9IGVXTklfU01FX05BTl9FVkVOVDsKKwljZHNfbXNnLmJvZHlwdHIgPSAodm9pZCAqKW5hbl9yc3BfZXZlbnQ7CisJY2RzX21zZy5ib2R5dmFsID0gMDsKKworCXN0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1NNRSwgJmNkc19tc2cpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHBvc3QgTmFOIHJlc3BvbnNlIGV2ZW50IHRvIFNNRSIsCisJCQkgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUobmFuX3JzcF9ldmVudCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlXTUFfTE9HRCgiJXM6IE5hTiByZXNwb25zZSBldmVudCBQb3N0ZWQgdG8gU01FIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9OQU4gKi8KKworLyoqCisgKiB3bWFfY3NhX29mZmxvYWRfaGFuZGxlcigpIC0gQ1NBIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBldmVudDogZXZlbnQgYnVmZmVyCisgKiBAbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogVGhpcyBldmVudCBpcyBzZW50IGJ5IGZpcm13YXJlIHdoZW4gaXQgcmVjZWl2ZXMgQ1NBIElFLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfY3NhX29mZmxvYWRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50LCB1aW50MzJfdCBsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCVdNSV9DU0FfSEFORExJTkdfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX2NzYV9ldmVudF9maXhlZF9wYXJhbSAqY3NhX2V2ZW50OworCXVpbnQ4X3QgYnNzaWRbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1aW50OF90IHZkZXZfaWQgPSAwOworCXVpbnQ4X3QgY3VyX2NoYW4gPSAwOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbHN3aXRjaF9pZSAqY3NhX2llOworCXRwQ1NBT2ZmbG9hZFBhcmFtcyBjc2Ffb2ZmbG9hZF9ldmVudDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2V4dGVuZGVkY2hhbm5lbHN3aXRjaF9pZSAqeGNzYV9pZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2llX3dpZGVfYndfc3dpdGNoICp3Yl9pZTsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaW50ciA9IHdtYS0+aW50ZXJmYWNlczsKKworCXBhcmFtX2J1ZiA9IChXTUlfQ1NBX0hBTkRMSU5HX0VWRU5USURfcGFyYW1fdGx2cyAqKSBldmVudDsKKworCVdNQV9MT0dEKCIlczogRW50ZXIiLCBfX2Z1bmNfXyk7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgY3NhIGV2ZW50IGJ1ZmZlciIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY3NhX2V2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlXTUlfTUFDX0FERFJfVE9fQ0hBUl9BUlJBWSgmY3NhX2V2ZW50LT5pX2FkZHIyLCAmYnNzaWRbMF0pOworCisJaWYgKHdtYV9maW5kX3ZkZXZfYnlfYnNzaWQod21hLCBic3NpZCwgJnZkZXZfaWQpID09IE5VTEwpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgYnNzaWQgcmVjZWl2ZWQgJXM6JWQiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljc2Ffb2ZmbG9hZF9ldmVudCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqY3NhX29mZmxvYWRfZXZlbnQpKTsKKwlpZiAoIWNzYV9vZmZsb2FkX2V2ZW50KSB7CisJCVdNQV9MT0dFKCJDREYgTUVNIEFsbG9jIEZhaWxlZCBmb3IgY3NhX29mZmxvYWRfZXZlbnQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2RmX21lbV96ZXJvKGNzYV9vZmZsb2FkX2V2ZW50LCBzaXplb2YoKmNzYV9vZmZsb2FkX2V2ZW50KSk7CisJY2RmX21lbV9jb3B5KGNzYV9vZmZsb2FkX2V2ZW50LT5ic3NJZCwgJmJzc2lkLCBJRUVFODAyMTFfQUREUl9MRU4pOworCisJaWYgKGNzYV9ldmVudC0+aWVzX3ByZXNlbnRfZmxhZyAmIFdNSV9DU0FfSUVfUFJFU0VOVCkgeworCQljc2FfaWUgPSAoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsc3dpdGNoX2llICopCisJCQkJCQkoJmNzYV9ldmVudC0+Y3NhX2llWzBdKTsKKwkJY3NhX29mZmxvYWRfZXZlbnQtPmNoYW5uZWwgPSBjc2FfaWUtPm5ld2NoYW5uZWw7CisJCWNzYV9vZmZsb2FkX2V2ZW50LT5zd2l0Y2htb2RlID0gY3NhX2llLT5zd2l0Y2htb2RlOworCX0gZWxzZSBpZiAoY3NhX2V2ZW50LT5pZXNfcHJlc2VudF9mbGFnICYgV01JX1hDU0FfSUVfUFJFU0VOVCkgeworCQl4Y3NhX2llID0gKHN0cnVjdCBpZWVlODAyMTFfZXh0ZW5kZWRjaGFubmVsc3dpdGNoX2llICopCisJCQkJCQkoJmNzYV9ldmVudC0+eGNzYV9pZVswXSk7CisJCWNzYV9vZmZsb2FkX2V2ZW50LT5jaGFubmVsID0geGNzYV9pZS0+bmV3Y2hhbm5lbDsKKwkJY3NhX29mZmxvYWRfZXZlbnQtPnN3aXRjaG1vZGUgPSB4Y3NhX2llLT5zd2l0Y2htb2RlOworCX0gZWxzZSB7CisJCVdNQV9MT0dFKCJDU0EgRXZlbnQgZXJyb3I6IE5vIENTQSBJRSBwcmVzZW50Iik7CisJCWNkZl9tZW1fZnJlZShjc2Ffb2ZmbG9hZF9ldmVudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjc2FfZXZlbnQtPmllc19wcmVzZW50X2ZsYWcgJiBXTUlfV0JXX0lFX1BSRVNFTlQpIHsKKwkJd2JfaWUgPSAoc3RydWN0IGllZWU4MDIxMV9pZV93aWRlX2J3X3N3aXRjaCAqKQorCQkJCQkJKCZjc2FfZXZlbnQtPndiX2llWzBdKTsKKwkJY3NhX29mZmxvYWRfZXZlbnQtPm5ld19jaF93aWR0aCA9IHdiX2llLT5uZXdfY2hfd2lkdGg7CisJCWNzYV9vZmZsb2FkX2V2ZW50LT5uZXdfY2hfZnJlcV9zZWcxID0gd2JfaWUtPm5ld19jaF9mcmVxX3NlZzE7CisJCWNzYV9vZmZsb2FkX2V2ZW50LT5uZXdfY2hfZnJlcV9zZWcyID0gd2JfaWUtPm5ld19jaF9mcmVxX3NlZzI7CisJfQorCisJY3NhX29mZmxvYWRfZXZlbnQtPmllc19wcmVzZW50X2ZsYWcgPSBjc2FfZXZlbnQtPmllc19wcmVzZW50X2ZsYWc7CisKKwlXTUFfTE9HRCgiQ1NBOiBOZXcgQ2hhbm5lbCA9ICVkIEJTU0lEOiVwTSIsCisJCSBjc2Ffb2ZmbG9hZF9ldmVudC0+Y2hhbm5lbCwgY3NhX29mZmxvYWRfZXZlbnQtPmJzc0lkKTsKKworCWN1cl9jaGFuID0gY2RzX2ZyZXFfdG9fY2hhbihpbnRyW3ZkZXZfaWRdLm1oeik7CisJLyoKKwkgKiBiYXNpYyBzYW5pdHkgY2hlY2s6IHJlcXVlc3RlZCBjaGFubmVsIHNob3VsZCBub3QgYmUgMAorCSAqIGFuZCBlcXVhbCB0byBob21lIGNoYW5uZWwKKwkgKi8KKwlpZiAoKDAgPT0gY3NhX29mZmxvYWRfZXZlbnQtPmNoYW5uZWwpIHx8CisJICAgIChjdXJfY2hhbiA9PSBjc2Ffb2ZmbG9hZF9ldmVudC0+Y2hhbm5lbCkpIHsKKwkJV01BX0xPR0UoIkNTQSBFdmVudCB3aXRoIGNoYW5uZWwgJWQuIElnbm9yZSAhISIsCisJCQkgY3NhX29mZmxvYWRfZXZlbnQtPmNoYW5uZWwpOworCQljZGZfbWVtX2ZyZWUoY3NhX29mZmxvYWRfZXZlbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmlzX2NoYW5uZWxfc3dpdGNoID0gdHJ1ZTsKKwl3bWFfc2VuZF9tc2cod21hLCBXTUFfQ1NBX09GRkxPQURfRVZFTlQsICh2b2lkICopY3NhX29mZmxvYWRfZXZlbnQsIDApOworCXJldHVybiAwOworfQorCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisKKy8qKgorICogd21hX29lbV9jYXBhYmlsaXR5X2V2ZW50X2NhbGxiYWNrKCkgLSBPRU0gY2FwYWJpbGl0eSBldmVudCBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZGF0YXA6IGRhdGEgcHRyCisgKiBAbGVuOiBkYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfb2VtX2NhcGFiaWxpdHlfZXZlbnRfY2FsbGJhY2sodm9pZCAqaGFuZGxlLAorCQkJCSAgICAgIHVpbnQ4X3QgKmRhdGFwLCB1aW50MzJfdCBsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCVdNSV9PRU1fQ0FQQUJJTElUWV9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl1aW50OF90ICpkYXRhOworCXVpbnQzMl90IGRhdGFsZW47CisJdWludDMyX3QgKm1zZ19zdWJ0eXBlOworCXRTdGFydE9lbURhdGFSc3AgKnBTdGFydE9lbURhdGFSc3A7CisKKwlwYXJhbV9idWYgPSAoV01JX09FTV9DQVBBQklMSVRZX0VWRU5USURfcGFyYW1fdGx2cyAqKSBkYXRhcDsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IFJlY2VpdmVkIE5VTEwgYnVmIHB0ciBmcm9tIEZXIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkYXRhID0gcGFyYW1fYnVmLT5kYXRhOworCWRhdGFsZW4gPSBwYXJhbV9idWYtPm51bV9kYXRhOworCisJaWYgKCFkYXRhKSB7CisJCVdNQV9MT0dFKCIlczogUmVjZWl2ZWQgTlVMTCBkYXRhIGZyb20gRlciLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHdtYSBwdXRzIDQgYnl0ZXMgcHJlZml4IGZvciBtc2cgc3VidHlwZSwgc28gbGVuZ3RoCisJICogb2YgZGF0YSByZWNlaXZlZCBmcm9tIHRhcmdldCBzaG91bGQgYmUgNCBieXRlcyBsZXNzCisJICogdGhlbiBtYXggYWxsb3dlZAorCSAqLworCWlmIChkYXRhbGVuID4gKE9FTV9EQVRBX1JTUF9TSVpFIC0gNCkpIHsKKwkJV01BX0xPR0UoIiVzOiBSZWNlaXZlZCBkYXRhIGxlbiAoJWQpIGV4Y2VlZHMgbWF4IHZhbHVlICglZCkiLAorCQkJIF9fZnVuY19fLCBkYXRhbGVuLCAoT0VNX0RBVEFfUlNQX1NJWkUgLSA0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBTdGFydE9lbURhdGFSc3AgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnBTdGFydE9lbURhdGFSc3ApKTsKKwlpZiAoIXBTdGFydE9lbURhdGFSc3ApIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gYWxsb2MgcFN0YXJ0T2VtRGF0YVJzcCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2RmX21lbV96ZXJvKHBTdGFydE9lbURhdGFSc3AsIHNpemVvZih0U3RhcnRPZW1EYXRhUnNwKSk7CisJbXNnX3N1YnR5cGUgPSAodWludDMyX3QgKikgKCZwU3RhcnRPZW1EYXRhUnNwLT5vZW1EYXRhUnNwWzBdKTsKKwkqbXNnX3N1YnR5cGUgPSBXTUlfT0VNX0NBUEFCSUxJVFlfUlNQOworCWNkZl9tZW1fY29weSgmcFN0YXJ0T2VtRGF0YVJzcC0+b2VtRGF0YVJzcFs0XSwgZGF0YSwgZGF0YWxlbik7CisKKwlXTUFfTE9HSSgiJXM6IFNlbmRpbmcgV01BX1NUQVJUX09FTV9EQVRBX1JTUCwgZGF0YSBsZW4gKCVkKSIsCisJCSBfX2Z1bmNfXywgZGF0YWxlbik7CisKKwl3bWFfc2VuZF9tc2cod21hLCBXTUFfU1RBUlRfT0VNX0RBVEFfUlNQLCAodm9pZCAqKXBTdGFydE9lbURhdGFSc3AsIDApOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9vZW1fbWVhc3VyZW1lbnRfcmVwb3J0X2V2ZW50X2NhbGxiYWNrKCkgLSBPRU0gbWVhc3VyZW1lbnQgcmVwb3J0IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBkYXRhcDogZGF0YSBwdHIKKyAqIEBsZW46IGRhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV9vZW1fbWVhc3VyZW1lbnRfcmVwb3J0X2V2ZW50X2NhbGxiYWNrKHZvaWQgKmhhbmRsZSwKKwkJCQkJICAgICAgdWludDhfdCAqZGF0YXAsCisJCQkJCSAgICAgIHVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX09FTV9NRUFTVVJFTUVOVF9SRVBPUlRfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJdWludDhfdCAqZGF0YTsKKwl1aW50MzJfdCBkYXRhbGVuOworCXVpbnQzMl90ICptc2dfc3VidHlwZTsKKwl0U3RhcnRPZW1EYXRhUnNwICpwU3RhcnRPZW1EYXRhUnNwOworCisJcGFyYW1fYnVmID0gKFdNSV9PRU1fTUVBU1VSRU1FTlRfUkVQT1JUX0VWRU5USURfcGFyYW1fdGx2cyAqKSBkYXRhcDsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IFJlY2VpdmVkIE5VTEwgYnVmIHB0ciBmcm9tIEZXIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkYXRhID0gcGFyYW1fYnVmLT5kYXRhOworCWRhdGFsZW4gPSBwYXJhbV9idWYtPm51bV9kYXRhOworCisJaWYgKCFkYXRhKSB7CisJCVdNQV9MT0dFKCIlczogUmVjZWl2ZWQgTlVMTCBkYXRhIGZyb20gRlciLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHdtYSBwdXRzIDQgYnl0ZXMgcHJlZml4IGZvciBtc2cgc3VidHlwZSwgc28gbGVuZ3RoCisJICogb2YgZGF0YSByZWNlaXZlZCBmcm9tIHRhcmdldCBzaG91bGQgYmUgNCBieXRlcyBsZXNzCisJICogdGhlbiBtYXggYWxsb3dlZAorCSAqLworCWlmIChkYXRhbGVuID4gKE9FTV9EQVRBX1JTUF9TSVpFIC0gNCkpIHsKKwkJV01BX0xPR0UoIiVzOiBSZWNlaXZlZCBkYXRhIGxlbiAoJWQpIGV4Y2VlZHMgbWF4IHZhbHVlICglZCkiLAorCQkJIF9fZnVuY19fLCBkYXRhbGVuLCAoT0VNX0RBVEFfUlNQX1NJWkUgLSA0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBTdGFydE9lbURhdGFSc3AgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnBTdGFydE9lbURhdGFSc3ApKTsKKwlpZiAoIXBTdGFydE9lbURhdGFSc3ApIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gYWxsb2MgcFN0YXJ0T2VtRGF0YVJzcCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2RmX21lbV96ZXJvKHBTdGFydE9lbURhdGFSc3AsIHNpemVvZih0U3RhcnRPZW1EYXRhUnNwKSk7CisJbXNnX3N1YnR5cGUgPSAodWludDMyX3QgKikgKCZwU3RhcnRPZW1EYXRhUnNwLT5vZW1EYXRhUnNwWzBdKTsKKwkqbXNnX3N1YnR5cGUgPSBXTUlfT0VNX01FQVNVUkVNRU5UX1JTUDsKKwljZGZfbWVtX2NvcHkoJnBTdGFydE9lbURhdGFSc3AtPm9lbURhdGFSc3BbNF0sIGRhdGEsIGRhdGFsZW4pOworCisJV01BX0xPR0koIiVzOiBTZW5kaW5nIFdNQV9TVEFSVF9PRU1fREFUQV9SU1AsIGRhdGEgbGVuICglZCkiLAorCQkgX19mdW5jX18sIGRhdGFsZW4pOworCisJd21hX3NlbmRfbXNnKHdtYSwgV01BX1NUQVJUX09FTV9EQVRBX1JTUCwgKHZvaWQgKilwU3RhcnRPZW1EYXRhUnNwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfb2VtX2Vycm9yX3JlcG9ydF9ldmVudF9jYWxsYmFjaygpIC0gT0VNIGVycm9yIHJlcG9ydCBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZGF0YXA6IGRhdGEgcHRyCisgKiBAbGVuOiBkYXRhIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfb2VtX2Vycm9yX3JlcG9ydF9ldmVudF9jYWxsYmFjayh2b2lkICpoYW5kbGUsCisJCQkJCXVpbnQ4X3QgKmRhdGFwLCB1aW50MzJfdCBsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCVdNSV9PRU1fRVJST1JfUkVQT1JUX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXVpbnQ4X3QgKmRhdGE7CisJdWludDMyX3QgZGF0YWxlbjsKKwl1aW50MzJfdCAqbXNnX3N1YnR5cGU7CisJdFN0YXJ0T2VtRGF0YVJzcCAqcFN0YXJ0T2VtRGF0YVJzcDsKKworCXBhcmFtX2J1ZiA9IChXTUlfT0VNX0VSUk9SX1JFUE9SVF9FVkVOVElEX3BhcmFtX3RsdnMgKikgZGF0YXA7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIiVzOiBSZWNlaXZlZCBOVUxMIGJ1ZiBwdHIgZnJvbSBGVyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGF0YSA9IHBhcmFtX2J1Zi0+ZGF0YTsKKwlkYXRhbGVuID0gcGFyYW1fYnVmLT5udW1fZGF0YTsKKworCWlmICghZGF0YSkgeworCQlXTUFfTE9HRSgiJXM6IFJlY2VpdmVkIE5VTEwgZGF0YSBmcm9tIEZXIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB3bWEgcHV0cyA0IGJ5dGVzIHByZWZpeCBmb3IgbXNnIHN1YnR5cGUsIHNvIGxlbmd0aAorCSAqIG9mIGRhdGEgcmVjZWl2ZWQgZnJvbSB0YXJnZXQgc2hvdWxkIGJlIDQgYnl0ZXMgbGVzcworCSAqIHRoZW4gbWF4IGFsbG93ZWQKKwkgKi8KKwlpZiAoZGF0YWxlbiA+IChPRU1fREFUQV9SU1BfU0laRSAtIDQpKSB7CisJCVdNQV9MT0dFKCIlczogUmVjZWl2ZWQgZGF0YSBsZW4gKCVkKSBleGNlZWRzIG1heCB2YWx1ZSAoJWQpIiwKKwkJCSBfX2Z1bmNfXywgZGF0YWxlbiwgKE9FTV9EQVRBX1JTUF9TSVpFIC0gNCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwU3RhcnRPZW1EYXRhUnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwU3RhcnRPZW1EYXRhUnNwKSk7CisJaWYgKCFwU3RhcnRPZW1EYXRhUnNwKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGFsbG9jIHBTdGFydE9lbURhdGFSc3AiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNkZl9tZW1femVybyhwU3RhcnRPZW1EYXRhUnNwLCBzaXplb2YodFN0YXJ0T2VtRGF0YVJzcCkpOworCW1zZ19zdWJ0eXBlID0gKHVpbnQzMl90ICopICgmcFN0YXJ0T2VtRGF0YVJzcC0+b2VtRGF0YVJzcFswXSk7CisJKm1zZ19zdWJ0eXBlID0gV01JX09FTV9FUlJPUl9SRVBPUlRfUlNQOworCWNkZl9tZW1fY29weSgmcFN0YXJ0T2VtRGF0YVJzcC0+b2VtRGF0YVJzcFs0XSwgZGF0YSwgZGF0YWxlbik7CisKKwlXTUFfTE9HSSgiJXM6IFNlbmRpbmcgV01BX1NUQVJUX09FTV9EQVRBX1JTUCwgZGF0YSBsZW4gKCVkKSIsCisJCSBfX2Z1bmNfXywgZGF0YWxlbik7CisKKwl3bWFfc2VuZF9tc2cod21hLCBXTUFfU1RBUlRfT0VNX0RBVEFfUlNQLCAodm9pZCAqKXBTdGFydE9lbURhdGFSc3AsIDApOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9zdGFydF9vZW1fZGF0YV9yZXEoKSAtIHN0YXJ0IE9FTSBkYXRhIHJlcXVlc3QgdG8gdGFyZ2V0CisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQHN0YXJ0T2VtRGF0YVJlcTogc3RhcnQgcmVxdWVzdCBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfc3RhcnRfb2VtX2RhdGFfcmVxKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCSAgICB0U3RhcnRPZW1EYXRhUmVxICpzdGFydE9lbURhdGFSZXEpCit7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50OF90ICpjbWQ7CisJaW50IHJldCA9IDA7CisJdWludDMyX3QgKm1zZ19zdWJ0eXBlOworCXRTdGFydE9lbURhdGFSc3AgKnBTdGFydE9lbURhdGFSc3A7CisKKwlXTUFfTE9HRCgiJXM6IFNlbmQgT0VNIERhdGEgUmVxdWVzdCB0byB0YXJnZXQiLCBfX2Z1bmNfXyk7CisKKwlpZiAoIXN0YXJ0T2VtRGF0YVJlcSkgeworCQlXTUFfTE9HRSgiJXM6IHN0YXJ0T2VtRGF0YVJlcSBpcyBudWxsIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXdtYV9oYW5kbGUgfHwgIXdtYV9oYW5kbGUtPndtaV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBXTUEgaXMgY2xvc2VkLCBjYW4gbm90IHNlbmQgT2VtIGRhdGEgcmVxdWVzdCBjbWQiLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCSAgICAoT0VNX0RBVEFfUkVRX1NJWkUgKyBXTUlfVExWX0hEUl9TSVpFKSk7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOndtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisKKwljbWQgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKworCVdNSVRMVl9TRVRfSERSKGNtZCwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBPRU1fREFUQV9SRVFfU0laRSk7CisJY21kICs9IFdNSV9UTFZfSERSX1NJWkU7CisJY2RmX21lbV9jb3B5KGNtZCwgJnN0YXJ0T2VtRGF0YVJlcS0+b2VtRGF0YVJlcVswXSwgT0VNX0RBVEFfUkVRX1NJWkUpOworCisJV01BX0xPR0koIiVzOiBTZW5kaW5nIE9FTSBEYXRhIFJlcXVlc3QgdG8gdGFyZ2V0LCBkYXRhIGxlbiAoJWQpIiwKKwkJIF9fZnVuY19fLCBPRU1fREFUQV9SRVFfU0laRSk7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCQkJICAgKE9FTV9EQVRBX1JFUV9TSVpFICsKKwkJCQkgICAgV01JX1RMVl9IRFJfU0laRSksIFdNSV9PRU1fUkVRX0NNRElEKTsKKworCWlmIChyZXQgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCIlczp3bWkgY21kIHNlbmQgZmFpbGVkIiwgX19mdW5jX18pOworCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJfQorCitvdXQ6CisJLyogZnJlZSBvZW0gZGF0YSByZXEgYnVmZmVyIHJlY2VpdmVkIGZyb20gVU1BQyAqLworCWlmIChzdGFydE9lbURhdGFSZXEpCisJCWNkZl9tZW1fZnJlZShzdGFydE9lbURhdGFSZXEpOworCisJLyogTm93IHNlbmQgZGF0YSByZXNwIGJhY2sgdG8gUEUvU01FIHdpdGggbWVzc2FnZSBzdWItdHlwZSBvZgorCSAqIFdNSV9PRU1fSU5URVJOQUxfUlNQLiBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQgUEUvU01FIGNsZWFycworCSAqIHVwIHBlbmRpbmcgYWN0aXZlIGNvbW1hbmQuIExhdGVyIHdoZW4gZGVzaXJlZCBvZW0gcmVzcG9uc2UocykKKwkgKiBjb21lcyBhcyB3bWkgZXZlbnQgZnJvbSB0YXJnZXQgdGhlbiB0aG9zZSBzaGFsbCBiZSBwYXNzZWQKKwkgKiB0byBvZW0gYXBwbGljYXRpb24KKwkgKi8KKwlwU3RhcnRPZW1EYXRhUnNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwU3RhcnRPZW1EYXRhUnNwKSk7CisJaWYgKCFwU3RhcnRPZW1EYXRhUnNwKSB7CisJCVdNQV9MT0dFKCIlczpmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBPRU0gRGF0YSBSZXNwIHRvIFBFIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJY2RmX21lbV96ZXJvKHBTdGFydE9lbURhdGFSc3AsIHNpemVvZih0U3RhcnRPZW1EYXRhUnNwKSk7CisJbXNnX3N1YnR5cGUgPSAodWludDMyX3QgKikgKCZwU3RhcnRPZW1EYXRhUnNwLT5vZW1EYXRhUnNwWzBdKTsKKwkqbXNnX3N1YnR5cGUgPSBXTUlfT0VNX0lOVEVSTkFMX1JTUDsKKworCVdNQV9MT0dJKCIlczogU2VuZGluZyBXTUFfU1RBUlRfT0VNX0RBVEFfUlNQIHRvIGNsZWFyIHVwIFBFL1NNRSBwZW5kaW5nIGNtZCIsCisJCV9fZnVuY19fKTsKKworCXdtYV9zZW5kX21zZyh3bWFfaGFuZGxlLCBXTUFfU1RBUlRfT0VNX0RBVEFfUlNQLAorCQkgICAgICh2b2lkICopcFN0YXJ0T2VtRGF0YVJzcCwgMCk7CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUICovCisKKworLyoqCisgKiB3bWFfdW5pZmllZF9kZnNfcmFkYXJfcnhfZXZlbnRfaGFuZGxlcigpIC0gZGZzIHJhZGFyIHJ4IGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBkYXRhOiBkYXRhIGJ1ZmZlcgorICogQGRhdGFsZW46IGRhdGEgbGVuZ3RoCisgKgorICogV01JIGhhbmRsZXIgZm9yIFdNSV9ERlNfUkFEQVJfRVZFTlRJRAorICogVGhpcyBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIGhhbmRsaW5nCisgKiBmaWx0ZXJlZCBERlMgUGh5ZXJyb3IuIFRoaXMgaGFuZGxlciBpcworICogd2lsbCBiZSBpbnZva2VkIG9ubHkgd2hlbiBERlMgUGh5ZXJyCisgKiBmaWx0ZXJpbmcgb2ZmbG9hZCBpcyBlbmFibGVkLgorICoKKyAqIFJldHVybjogMSBmb3IgU3VjY2VzcyBhbmQgMCBmb3IgZXJyb3IKKyAqLworc3RhdGljIGludCB3bWFfdW5pZmllZF9kZnNfcmFkYXJfcnhfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsCisJCQkJCQkgIHVpbnQ4X3QgKmRhdGEsCisJCQkJCQkgIHVpbnQzMl90IGRhdGFsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCXN0cnVjdCBpZWVlODAyMTFjb20gKmljOworCXN0cnVjdCBhdGhfZGZzICpkZnM7CisJc3RydWN0IGRmc19ldmVudCAqZXZlbnQ7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOworCWludCBlbXB0eTsKKwlpbnQgZG9fY2hlY2tfY2hpcnAgPSAwOworCWludCBpc19od19jaGlycCA9IDA7CisJaW50IGlzX3N3X2NoaXJwID0gMDsKKwlpbnQgaXNfcHJpID0gMDsKKworCVdNSV9ERlNfUkFEQVJfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV90bHZzOworCXdtaV9kZnNfcmFkYXJfZXZlbnRfZml4ZWRfcGFyYW0gKnJhZGFyX2V2ZW50OworCisJaWMgPSB3bWEtPmRmc19pYzsKKwlpZiAoTlVMTCA9PSBpYykgeworCQlXTUFfTE9HRSgiJXM6IGRmc19pYyBpcyAgTlVMTCAiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCWRmcyA9IChzdHJ1Y3QgYXRoX2RmcyAqKWljLT5pY19kZnM7CisJcGFyYW1fdGx2cyA9IChXTUlfREZTX1JBREFSX0VWRU5USURfcGFyYW1fdGx2cyAqKSBkYXRhOworCisJaWYgKE5VTEwgPT0gZGZzKSB7CisJCVdNQV9MT0dFKCIlczogZGZzIGlzICBOVUxMICIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogVGhpcyBwYXJhbWV0ZXIgaG9sZHMgdGhlIG51bWJlcgorCSAqIG9mIHBoeWVycm9yIGludGVycnVwdHMgdG8gdGhlIGhvc3QKKwkgKiBhZnRlciB0aGUgcGh5ZXJyb3JzIGhhdmUgcGFzc2VkIHRocm91Z2gKKwkgKiBmYWxzZSBkZXRlY3QgZmlsdGVycyBpbiB0aGUgZmlybXdhcmUuCisJICovCisJZGZzLT5kZnNfcGh5ZXJyX2NvdW50Kys7CisKKwlpZiAoIXBhcmFtX3RsdnMpIHsKKwkJV01BX0xPR0UoIiVzOiBSZWNlaXZlZCBOVUxMIGRhdGEgZnJvbSBGVyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmFkYXJfZXZlbnQgPSBwYXJhbV90bHZzLT5maXhlZF9wYXJhbTsKKworCWNkZl9tdXRleF9hY3F1aXJlKCZpYy0+Y2hhbl9sb2NrKTsKKwljaGFuID0gaWMtPmljX2N1cmNoYW47CisJaWYgKENIQU5ORUxfU1RBVEVfREZTICE9IGNkc19nZXRfY2hhbm5lbF9zdGF0ZShjaGFuLT5pY19pZWVlKSkgeworCQlXTUFfTE9HRQorCQkJKCIlczogSW52YWxpZCBERlMgUGh5ZXJyb3IgZXZlbnQuIENoYW5uZWw9JWQgaXMgTm9uLURGUyIsCisJCQlfX2Z1bmNfXywgY2hhbi0+aWNfaWVlZSk7CisJCWNkZl9tdXRleF9yZWxlYXNlKCZpYy0+Y2hhbl9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2RmX211dGV4X3JlbGVhc2UoJmljLT5jaGFuX2xvY2spOworCWRmcy0+YXRoX2Rmc19zdGF0cy50b3RhbF9waHlfZXJyb3JzKys7CisKKwlpZiAoZGZzLT5kZnNfY2Fwcy5hdGhfY2hpcF9pc19iYl90bHYpIHsKKwkJZG9fY2hlY2tfY2hpcnAgPSAxOworCQlpc19wcmkgPSAxOworCQlpc19od19jaGlycCA9IHJhZGFyX2V2ZW50LT5wdWxzZV9pc19jaGlycDsKKworCQlpZiAoKHVpbnQzMl90KSBkZnMtPmRmc19waHllcnJfZnJlcV9taW4gPgorCQkgICAgcmFkYXJfZXZlbnQtPnB1bHNlX2NlbnRlcl9mcmVxKSB7CisJCQlkZnMtPmRmc19waHllcnJfZnJlcV9taW4gPQorCQkJCShpbnQpcmFkYXJfZXZlbnQtPnB1bHNlX2NlbnRlcl9mcmVxOworCQl9CisKKwkJaWYgKGRmcy0+ZGZzX3BoeWVycl9mcmVxX21heCA8CisJCSAgICAoaW50KXJhZGFyX2V2ZW50LT5wdWxzZV9jZW50ZXJfZnJlcSkgeworCQkJZGZzLT5kZnNfcGh5ZXJyX2ZyZXFfbWF4ID0KKwkJCQkoaW50KXJhZGFyX2V2ZW50LT5wdWxzZV9jZW50ZXJfZnJlcTsKKwkJfQorCX0KKworCS8qCisJICogTm93LCBhZGQgdGhlIHBhcnNlZCwgY2hlY2tlZCBhbmQgZmlsdGVyZWQKKwkgKiByYWRhciBwaHllcnJvciBldmVudCByYWRhciBwdWxzZSBldmVudCBsaXN0LgorCSAqIFRoaXMgZXZlbnQgd2lsbCB0aGVuIGJlIHByb2Nlc3NlZCBieQorCSAqIGRmc19yYWRhcl9wcm9jZXNzZXZlbnQoKSB0byBzZWUgaWYgdGhlIHBhdHRlcm4KKwkgKiBvZiBwdWxzZXMgaW4gcmFkYXIgcHVsc2UgbGlzdCBtYXRjaCBhbnkgcmFkYXIKKwkgKiBzaW5nbmF0dXJlIGluIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorCSAqLworCisJQVRIX0RGU0VWRU5UUV9MT0NLKGRmcyk7CisJZW1wdHkgPSBTVEFJTFFfRU1QVFkoJihkZnMtPmRmc19ldmVudHEpKTsKKwlBVEhfREZTRVZFTlRRX1VOTE9DSyhkZnMpOworCWlmIChlbXB0eSkgeworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBBZGQgdGhlIGV2ZW50IHRvIHRoZSBsaXN0LCBpZiB0aGVyZSdzIHNwYWNlLgorCSAqLworCUFUSF9ERlNFVkVOVFFfTE9DSyhkZnMpOworCWV2ZW50ID0gU1RBSUxRX0ZJUlNUKCYoZGZzLT5kZnNfZXZlbnRxKSk7CisJaWYgKGV2ZW50ID09IE5VTEwpIHsKKwkJQVRIX0RGU0VWRU5UUV9VTkxPQ0soZGZzKTsKKwkJV01BX0xPR0UoIiVzOiBObyBtb3JlIHNwYWNlIGxlZnQgZm9yIHF1ZXVpbmcgREZTIFBoeWVycm9yIGV2ZW50cyIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlTVEFJTFFfUkVNT1ZFX0hFQUQoJihkZnMtPmRmc19ldmVudHEpLCByZV9saXN0KTsKKwlBVEhfREZTRVZFTlRRX1VOTE9DSyhkZnMpOworCWRmcy0+ZGZzX3BoeWVycl9xdWV1ZWRfY291bnQrKzsKKwlkZnMtPmRmc19waHllcnJfdzUzX2NvdW50ZXIrKzsKKwlldmVudC0+cmVfZHVyID0gKHVpbnQ4X3QpIHJhZGFyX2V2ZW50LT5wdWxzZV9kdXJhdGlvbjsKKwlldmVudC0+cmVfcnNzaSA9IHJhZGFyX2V2ZW50LT5yc3NpOworCWV2ZW50LT5yZV90cyA9IHJhZGFyX2V2ZW50LT5wdWxzZV9kZXRlY3RfdHMgJiBERlNfVFNNQVNLOworCWV2ZW50LT5yZV9mdWxsX3RzID0gKCgodWludDY0X3QpIHJhZGFyX2V2ZW50LT51cGxvYWRfZnVsbHRzX2hpZ2gpIDw8IDMyKQorCQkJICAgIHwgcmFkYXJfZXZlbnQtPnVwbG9hZF9mdWxsdHNfbG93OworCisJLyoKKwkgKiBJbmRleCBvZiBwZWFrIG1hZ25pdHVkZQorCSAqLworCWV2ZW50LT5zaWR4ID0gcmFkYXJfZXZlbnQtPnBlYWtfc2lkeDsKKworCS8qCisJICogSGFuZGxlIGNoaXJwIGZsYWdzLgorCSAqLworCWlmIChkb19jaGVja19jaGlycCkgeworCQlldmVudC0+cmVfZmxhZ3MgfD0gREZTX0VWRU5UX0NIRUNLQ0hJUlA7CisJCWlmIChpc19od19jaGlycCkgeworCQkJZXZlbnQtPnJlX2ZsYWdzIHw9IERGU19FVkVOVF9IV19DSElSUDsKKwkJfQorCQlpZiAoaXNfc3dfY2hpcnApIHsKKwkJCWV2ZW50LT5yZV9mbGFncyB8PSBERlNfRVZFTlRfU1dfQ0hJUlA7CisJCX0KKwl9CisJLyoKKwkgKiBDb3JyZWN0bHkgc2V0IHdoaWNoIGNoYW5uZWwgaXMgYmVpbmcgcmVwb3J0ZWQgb24KKwkgKi8KKwlpZiAoaXNfcHJpKSB7CisJCWV2ZW50LT5yZV9jaGFuaW5kZXggPSAodWludDhfdCkgZGZzLT5kZnNfY3VyY2hhbl9yYWRpbmRleDsKKwl9IGVsc2UgeworCQlpZiAoZGZzLT5kZnNfZXh0Y2hhbl9yYWRpbmRleCA9PSAtMSkgeworCQkJV01BX0xPR0koIiVzIHBoeWVyciBvbiBleHQgY2hhbm5lbCIsIF9fZnVuY19fKTsKKwkJfQorCQlldmVudC0+cmVfY2hhbmluZGV4ID0gKHVpbnQ4X3QpIGRmcy0+ZGZzX2V4dGNoYW5fcmFkaW5kZXg7CisJCVdNQV9MT0dJKCIlczpOZXcgZXh0ZW5zaW9uIGNoYW5uZWwgZXZlbnQgaXMgYWRkZWQgdG8gcXVldWUiLAorCQkJIF9fZnVuY19fKTsKKwl9CisKKwlBVEhfREZTUV9MT0NLKGRmcyk7CisKKwlTVEFJTFFfSU5TRVJUX1RBSUwoJihkZnMtPmRmc19yYWRhcnEpLCBldmVudCwgcmVfbGlzdCk7CisKKwllbXB0eSA9IFNUQUlMUV9FTVBUWSgmZGZzLT5kZnNfcmFkYXJxKTsKKworCUFUSF9ERlNRX1VOTE9DSyhkZnMpOworCisJaWYgKCFlbXB0eSAmJiAhZGZzLT5hdGhfcmFkYXJfdGFza3NjaGVkKSB7CisJCWRmcy0+YXRoX3JhZGFyX3Rhc2tzY2hlZCA9IDE7CisJCU9TX1NFVF9USU1FUigmZGZzLT5hdGhfZGZzX3Rhc2tfdGltZXIsIDApOworCX0KKworCXJldHVybiAxOworCit9CisKKy8qKgorICogd21hX3VuaWZpZWRfcGh5ZXJyX3J4X2V2ZW50X2hhbmRsZXIoKSAtIHBoeWVyciBldmVudCBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZGF0YTogZGF0YSBidWZmZXIKKyAqIEBkYXRhbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogV01JIEhhbmRsZXIgZm9yIFdNSV9QSFlFUlJfRVZFTlRJRCBldmVudCBmcm9tIGZpcm13YXJlLgorICogVGhpcyBoYW5kbGVyIGlzIGN1cnJlbnRseSBoYW5kbGluZyBvbmx5IERGUyBwaHkgZXJyb3JzLgorICogVGhpcyBoYW5kbGVyIHdpbGwgYmUgaW52b2tlZCBvbmx5IHdoZW4gdGhlIERGUyBwaHllcnJvcgorICogZmlsdGVyaW5nIG9mZmxvYWQgaXMgZGlzYWJsZWQuCisgKgorICogUmV0dXJuOiAgMTpTdWNjZXNzLCAwOkZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bWFfdW5pZmllZF9waHllcnJfcnhfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsCisJCQkJCSAgICAgICB1aW50OF90ICpkYXRhLCB1aW50MzJfdCBkYXRhbGVuKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlXTUlfUEhZRVJSX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fdGx2czsKKwl3bWlfY29tYl9waHllcnJfcnhfaGRyICpwZV9oZHI7CisJdWludDhfdCAqYnVmcDsKKwl3bWlfc2luZ2xlX3BoeWVycl9yeF9ldmVudCAqZXY7CisJc3RydWN0IGllZWU4MDIxMWNvbSAqaWMgPSB3bWEtPmRmc19pYzsKKwljZGZfc2l6ZV90IG47CisJQV9VSU5UNjQgdHNmNjQgPSAwOworCWludCBwaHlfZXJyX2NvZGUgPSAwOworCWludCBlcnJvciA9IDA7CisJdHBBbmlTaXJHbG9iYWwgbWFjX2N0eCA9CisJCSh0cEFuaVNpckdsb2JhbCljZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisJYm9vbCBlbmFibGVfbG9nID0gZmFsc2U7CisKKwlpZiAoTlVMTCA9PSBtYWNfY3R4KSB7CisJCVdNQV9MT0dFKCIlczogbWFjX2N0eCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJZW5hYmxlX2xvZyA9IG1hY19jdHgtPnNhcC5lbmFibGVfZGZzX3BoeV9lcnJvcl9sb2dzOworCisJcGFyYW1fdGx2cyA9IChXTUlfUEhZRVJSX0VWRU5USURfcGFyYW1fdGx2cyAqKSBkYXRhOworCisJaWYgKCFwYXJhbV90bHZzKSB7CisJCVdNQV9MT0dFKCIlczogUmVjZWl2ZWQgTlVMTCBkYXRhIGZyb20gRlciLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXBlX2hkciA9IHBhcmFtX3RsdnMtPmhkcjsKKwlpZiAocGVfaGRyID09IE5VTEwpIHsKKwkJV01BX0xPR0UoIiVzOiBSZWNlaXZlZCBEYXRhIFBFIEhlYWRlciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBFbnN1cmUgaXQncyBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyICovCisJaWYgKGRhdGFsZW4gPCBzaXplb2YoKnBlX2hkcikpIHsKKwkJV01BX0xPR0UoIiVzOiAgRXhwZWN0ZWQgbWluaW11bSBzaXplICV6dSwgcmVjZWl2ZWQgJWQiLAorCQkJIF9fZnVuY19fLCBzaXplb2YoKnBlX2hkciksIGRhdGFsZW4pOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHBlX2hkci0+YnVmX2xlbiA+IERGU19NQVhfQlVGX0xFTkdIVCkgeworCQlXTUFfTE9HRSgiJXM6IFJlY2VpdmVkIEludmFsaWQgUGh5ZXJyb3IgZXZlbnQgYnVmZmVyIGxlbmd0aCA9ICVkIgorCQkJIk1heGltdW0gYWxsb3dlZCBidWYgbGVuZ3RoID0gJWQiLCBfX2Z1bmNfXywKKwkJCXBlX2hkci0+YnVmX2xlbiwgREZTX01BWF9CVUZfTEVOR0hUKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFJlY29uc3RydWN0IHRoZSA2NCBiaXQgZXZlbnQgVFNGLiBUaGlzIGlzbid0IGZyb20gdGhlIE1BQywgaXQncworCSAqIGF0IHRoZSB0aW1lIHRoZSBldmVudCB3YXMgc2VudCB0byB1cywgdGhlIFRTRiB2YWx1ZSB3aWxsIGJlCisJICogaW4gdGhlIGZ1dHVyZS4KKwkgKi8KKwl0c2Y2NCA9IHBlX2hkci0+dHNmX2wzMjsKKwl0c2Y2NCB8PSAoKCh1aW50NjRfdCkgcGVfaGRyLT50c2ZfdTMyKSA8PCAzMik7CisKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgYnVmcCwgZXh0cmFjdGluZyBvdXQgcGh5ZXJyb3JzCisJICogd21pX3VuaWZpZWRfY29tYl9waHllcnJfcnhfZXZlbnQuYnVmcCBpcyBhIGNoYXIgcG9pbnRlciwKKwkgKiB3aGljaCBpc24ndCBjb3JyZWN0IGhlcmUgLSB3aGF0IHdlIGhhdmUgcmVjZWl2ZWQgaGVyZQorCSAqIGlzIGFuIGFycmF5IG9mIFRMVi1zdHlsZSBQSFkgZXJyb3JzLgorCSAqLworCW4gPSAwOyAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGhlYWRlciAqLworCWJ1ZnAgPSBwYXJhbV90bHZzLT5idWZwOworCXdoaWxlIChuIDwgcGVfaGRyLT5idWZfbGVuKSB7CisJCS8qIGVuc3VyZSB0aGVyZSdzIGF0IGxlYXN0IHNwYWNlIGZvciB0aGUgaGVhZGVyICovCisJCWlmICgocGVfaGRyLT5idWZfbGVuIC0gbikgPCBzaXplb2YoZXYtPmhkcikpIHsKKwkJCVdNQV9MT0dFKCIlczogTm90IGVub3VnaCBzcGFjZS4oZGF0YWxlbj0lZCwgbj0lenUsIGhkcj0lenUgYnl0ZXMiLAorCQkJCV9fZnVuY19fLCBwZV9oZHItPmJ1Zl9sZW4sIG4sIHNpemVvZihldi0+aGRyKSk7CisJCQllcnJvciA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBPYnRhaW4gYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgZXZlbnQuCisJCSAqIGRhdGFbMF0gaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgV01JIHBheWxvYWQuCisJCSAqLworCQlldiA9ICh3bWlfc2luZ2xlX3BoeWVycl9yeF9ldmVudCAqKSAmYnVmcFtuXTsKKworCQkvKgorCQkgKiBTYW5pdHkgY2hlY2sgdGhlIGJ1ZmZlciBsZW5ndGggb2YgdGhlIGV2ZW50IGFnYWluc3QKKwkJICogd2hhdCB3ZSBjdXJyZW50bHkgaGF2ZS4KKwkJICogU2luY2UgYnVmX2xlbiBpcyAzMiBiaXRzLCB3ZSBjaGVjayBpZiBpdCBvdmVyZmxvd3MKKwkJICogYSBsYXJnZSAzMiBiaXQgdmFsdWUuIEl0J3Mgbm90IDB4N2ZmZmZmZmYgYmVjYXVzZQorCQkgKiB3ZSBpbmNyZWFzZSBuIGJ5IChidWZfbGVuICsgc2l6ZW9mKGhkcikpLCB3aGljaCB3b3VsZAorCQkgKiBpbiBpdHNlbGYgY2F1c2UgbiB0byBvdmVyZmxvdy4KKwkJICogSWYgImludCIgaXMgNjQgYml0cyB0aGVuIHRoaXMgYmVjb21lcyBhIG1vb3QgcG9pbnQuCisJCSAqLworCQlpZiAoZXYtPmhkci5idWZfbGVuID4gMHg3ZjAwMDAwMCkgeworCQkJV01BX0xPR0UoIiVzOmJ1Zl9sZW4gaXMgZ2FyYmFnZSAoMHgleCkiLCBfX2Z1bmNfXywKKwkJCQkgZXYtPmhkci5idWZfbGVuKTsKKwkJCWVycm9yID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChuICsgZXYtPmhkci5idWZfbGVuID4gcGVfaGRyLT5idWZfbGVuKSB7CisJCQlXTUFfTE9HRSgiJXM6IGJ1Zl9sZW4gZXhjZWVkcyBhdmFpbGFibGUgc3BhY2Ugbj0lenUsIgorCQkJCSAiYnVmX2xlbj0lZCwgZGF0YWxlbj0lZCIsCisJCQkJIF9fZnVuY19fLCBuLCBldi0+aGRyLmJ1Zl9sZW4sIHBlX2hkci0+YnVmX2xlbik7CisJCQllcnJvciA9IDE7CisJCQlicmVhazsKKwkJfQorCQlwaHlfZXJyX2NvZGUgPSBXTUlfVU5JRklFRF9QSFlFUlJDT0RFX0dFVCgmZXYtPmhkcik7CisKKwkJLyoKKwkJICogSWYgdGhlIHBoeWVycm9yIGNhdGVnb3J5IG1hdGNoZXMsCisJCSAqIHBhc3MgcmFkYXIgZXZlbnRzIHRvIHRoZSBkZnMgcGF0dGVybiBtYXRjaGluZyBjb2RlLgorCQkgKiBEb24ndCBwYXNzIHJhZGFyIGV2ZW50cyB3aXRoIG5vIGJ1ZmZlciBwYXlsb2FkLgorCQkgKi8KKwkJaWYgKHBoeV9lcnJfY29kZSA9PSAweDUgfHwgcGh5X2Vycl9jb2RlID09IDB4MjQpIHsKKwkJCWlmIChldi0+aGRyLmJ1Zl9sZW4gPiAwKSB7CisJCQkJLyogQ2FsbGluZyBpbiB0byB0aGUgREZTIG1vZHVsZSB0byBwcm9jZXNzIHRoZSBwaHllcnIgKi8KKwkJCQlkZnNfcHJvY2Vzc19waHllcnIoaWMsICZldi0+YnVmcFswXSwKKwkJCQkJCSAgIGV2LT5oZHIuYnVmX2xlbiwKKwkJCQkJCSAgIFdNSV9VTklGSUVEX1JTU0lfQ09NQl9HRVQKKwkJCQkJCQkgICAoJmV2LT5oZHIpICYgMHhmZiwKKwkJCQkJCSAgIC8qIEV4dGVuc2lvbiBSU1NJICovCisJCQkJCQkgICBXTUlfVU5JRklFRF9SU1NJX0NPTUJfR0VUCisJCQkJCQkJICAgKCZldi0+aGRyKSAmIDB4ZmYsCisJCQkJCQkgICBldi0+aGRyLnRzZl90aW1lc3RhbXAsCisJCQkJCQkgICB0c2Y2NCwgZW5hYmxlX2xvZyk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBBZHZhbmNlIHRoZSBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBQSFkgZXJyb3IuCisJCSAqIGJ1ZmxlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoaXMgcGF5bG9hZCwgc28gd2UgbmVlZCB0bworCQkgKiBhZHZhbmNlIHBhc3QgdGhlIGN1cnJlbnQgaGVhZGVyIF9BTkRfIHRoZSBwYXlsb2FkLgorCQkgKi8KKwkJbiArPSBzaXplb2YoKmV2KSArIGV2LT5oZHIuYnVmX2xlbjsKKworCX0gLyplbmQgd2hpbGUoKSAqLworCWlmIChlcnJvcikKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworLyoqCisgKiB3bWFfcmVnaXN0ZXJfZGZzX2V2ZW50X2hhbmRsZXIoKSAtIHJlZ2lzdGVyIGRmcyBldmVudCBoYW5kbGVyCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICoKKyAqIFJlZ2lzdGVyIGFwcHJvcHJpYXRlIGRmcyBwaHllcnJvciBldmVudCBoYW5kbGVyCisgKiBiYXNlZCBvbiBwaHllcnJvciBmaWx0ZXJpbmcgb2ZmbG9hZCBpcyBlbmFibGVkCisgKiBvciBkaXNhYmxlZC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfcmVnaXN0ZXJfZGZzX2V2ZW50X2hhbmRsZXIodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCWlmIChOVUxMID09IHdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOndtYV9oYW5kbGUgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmYWxzZSA9PSB3bWFfaGFuZGxlLT5kZnNfcGh5ZXJyX2ZpbHRlcl9vZmZsb2FkKSB7CisJCS8qCisJCSAqIFJlZ2lzdGVyIHRoZSB3bWFfdW5pZmllZF9waHllcnJfcnhfZXZlbnRfaGFuZGxlcgorCQkgKiBmb3IgZmlsdGVyaW5nIG9mZmxvYWQgZGlzYWJsZWQgY2FzZSB0byBoYW5kbGUKKwkJICogdGhlIERGUyBwaHllcnJvcnMuCisJCSAqLworCQlXTUFfTE9HRCgiJXM6UGh5ZXJyb3IgRmlsdGVyaW5nIG9mZmxvYWQgaXMgRGlzYWJsZWQgaW4gaW5pIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgIFdNSV9QSFlFUlJfRVZFTlRJRCwKKwkJCQkJCSAgIHdtYV91bmlmaWVkX3BoeWVycl9yeF9ldmVudF9oYW5kbGVyKTsKKwkJV01BX0xPR0QoIiVzOiBXTUlfUEhZRVJSX0VWRU5USUQgZXZlbnQgaGFuZGxlciByZWdpc3RlcmVkIiwKKwkJCSBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJV01BX0xPR0QoIiVzOlBoeWVycm9yIEZpbHRlcmluZyBvZmZsb2FkIGlzIEVuYWJsZWQgaW4gaW5pIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgIFdNSV9ERlNfUkFEQVJfRVZFTlRJRCwKKwkJCQkJCSAgIHdtYV91bmlmaWVkX2Rmc19yYWRhcl9yeF9ldmVudF9oYW5kbGVyKTsKKwkJV01BX0xPR0QoIiVzOldNSV9ERlNfUkFEQVJfRVZFTlRJRCBldmVudCBoYW5kbGVyIHJlZ2lzdGVyZWQiLAorCQkJIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiB3bWFfdW5pZmllZF9kZnNfcGh5ZXJyX2ZpbHRlcl9vZmZsb2FkX2VuYWJsZSgpIC0gZW5hYmxlIGRmcyBwaHllcnIgZmlsdGVyCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICoKKyAqIFNlbmQgV01JX0RGU19QSFlFUlJfRklMVEVSX0VOQV9DTURJRCBvcgorICogV01JX0RGU19QSFlFUlJfRklMVEVSX0RJU19DTURJRCBjb21tYW5kCisgKiB0byBmaXJtd2FyZSBiYXNlZCBvbiBwaHllcnIgZmlsdGVyaW5nCisgKiBvZmZsb2FkIHN0YXR1cy4KKyAqCisgKiBSZXR1cm46IDEgc3VjY2VzcywgMCBmYWlsdXJlCisgKi8KK2ludAord21hX3VuaWZpZWRfZGZzX3BoeWVycl9maWx0ZXJfb2ZmbG9hZF9lbmFibGUodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCXdtaV9kZnNfcGh5ZXJyX2ZpbHRlcl9lbmFfY21kX2ZpeGVkX3BhcmFtICplbmFibGVfcGh5ZXJyX29mZmxvYWRfY21kOworCXdtaV9kZnNfcGh5ZXJyX2ZpbHRlcl9kaXNfY21kX2ZpeGVkX3BhcmFtICpkaXNhYmxlX3BoeWVycl9vZmZsb2FkX2NtZDsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQxNl90IGxlbjsKKwlpbnQgcmV0OworCisJaWYgKE5VTEwgPT0gd21hX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6d21hX2hhbmRsZSBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZmFsc2UgPT0gd21hX2hhbmRsZS0+ZGZzX3BoeWVycl9maWx0ZXJfb2ZmbG9hZCkgeworCQlXTUFfTE9HRCgiJXM6UGh5ZXJyb3IgRmlsdGVyaW5nIG9mZmxvYWQgaXMgRGlzYWJsZWQgaW4gaW5pIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWxlbiA9IHNpemVvZigqZGlzYWJsZV9waHllcnJfb2ZmbG9hZF9jbWQpOworCQlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJCWlmICghYnVmKSB7CisJCQlXTUFfTE9HRSgiJXM6d21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkaXNhYmxlX3BoeWVycl9vZmZsb2FkX2NtZCA9CisJCQkod21pX2Rmc19waHllcnJfZmlsdGVyX2Rpc19jbWRfZml4ZWRfcGFyYW0gKikKKwkJCXdtaV9idWZfZGF0YShidWYpOworCisJCVdNSVRMVl9TRVRfSERSKCZkaXNhYmxlX3BoeWVycl9vZmZsb2FkX2NtZC0+dGx2X2hlYWRlciwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kZnNfcGh5ZXJyX2ZpbHRlcl9kaXNfY21kX2ZpeGVkX3BhcmFtLAorCQkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJCSAgICAgICAod21pX2Rmc19waHllcnJfZmlsdGVyX2Rpc19jbWRfZml4ZWRfcGFyYW0pKTsKKworCQkvKgorCQkgKiBTZW5kIFdNSV9ERlNfUEhZRVJSX0ZJTFRFUl9ESVNfQ01ESUQKKwkJICogdG8gdGhlIGZpcm13YXJlIHRvIGRpc2FibGUgdGhlIHBoeWVycm9yCisJCSAqIGZpbHRlcmluZyBvZmZsb2FkLgorCQkgKi8KKwkJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJCSAgIFdNSV9ERlNfUEhZRVJSX0ZJTFRFUl9ESVNfQ01ESUQpOworCQlpZiAocmV0IDwgMCkgeworCQkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gc2VuZCBXTUlfREZTX1BIWUVSUl9GSUxURVJfRElTX0NNRElEIHJldD0lZCIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJCXJldHVybiAwOworCQl9CisJCVdNQV9MT0dEKCIlczogV01JX0RGU19QSFlFUlJfRklMVEVSX0RJU19DTURJRCBTZW5kIFN1Y2Nlc3MiLAorCQkJIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlXTUFfTE9HRCgiJXM6UGh5ZXJyb3IgRmlsdGVyaW5nIG9mZmxvYWQgaXMgRW5hYmxlZCBpbiBpbmkiLAorCQkJIF9fZnVuY19fKTsKKworCQlsZW4gPSBzaXplb2YoKmVuYWJsZV9waHllcnJfb2ZmbG9hZF9jbWQpOworCQlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJCWlmICghYnVmKSB7CisJCQlXTUFfTE9HRSgiJXM6d21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWVuYWJsZV9waHllcnJfb2ZmbG9hZF9jbWQgPQorCQkJKHdtaV9kZnNfcGh5ZXJyX2ZpbHRlcl9lbmFfY21kX2ZpeGVkX3BhcmFtICopCisJCQl3bWlfYnVmX2RhdGEoYnVmKTsKKworCQlXTUlUTFZfU0VUX0hEUigmZW5hYmxlX3BoeWVycl9vZmZsb2FkX2NtZC0+dGx2X2hlYWRlciwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kZnNfcGh5ZXJyX2ZpbHRlcl9lbmFfY21kX2ZpeGVkX3BhcmFtLAorCQkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJCSAgICAgICAod21pX2Rmc19waHllcnJfZmlsdGVyX2VuYV9jbWRfZml4ZWRfcGFyYW0pKTsKKworCQkvKgorCQkgKiBTZW5kIGEgV01JX0RGU19QSFlFUlJfRklMVEVSX0VOQV9DTURJRAorCQkgKiB0byB0aGUgZmlybXdhcmUgdG8gZW5hYmxlIHRoZSBwaHllcnJvcgorCQkgKiBmaWx0ZXJpbmcgb2ZmbG9hZC4KKwkJICovCisJCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCQkgICBXTUlfREZTX1BIWUVSUl9GSUxURVJfRU5BX0NNRElEKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gc2VuZCBXTUlfREZTX1BIWUVSUl9GSUxURVJfRU5BX0NNRElEIHJldD0lZCIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJCXJldHVybiAwOworCQl9CisJCVdNQV9MT0dEKCIlczogV01JX0RGU19QSFlFUlJfRklMVEVSX0VOQV9DTURJRCBTZW5kIFN1Y2Nlc3MiLAorCQkJIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2lmICFkZWZpbmVkKFJFTU9WRV9QS1RfTE9HKQorLyoqCisgKiB3bWFfcGt0bG9nX3dtaV9zZW5kX2NtZCgpIC0gc2VuZCBwa3Rsb2cgZW5hYmxlL2Rpc2FibGUgY29tbWFuZCB0byB0YXJnZXQKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBwYXJhbXM6IHBrdGxvZyBwYXJhbXMKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfcGt0bG9nX3dtaV9zZW5kX2NtZChXTUFfSEFORExFIGhhbmRsZSwKKwkJCQkgICBzdHJ1Y3QgYXRoX3BrdGxvZ193bWlfcGFyYW1zICpwYXJhbXMpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlXTUlfUEtUTE9HX0VWRU5UIFBLVExPR19FVkVOVDsKKwlXTUlfQ01EX0lEIENNRF9JRDsKKwl3bWlfcGRldl9wa3Rsb2dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9wZGV2X3BrdGxvZ19kaXNhYmxlX2NtZF9maXhlZF9wYXJhbSAqZGlzYWJsZV9jbWQ7CisJaW50IGxlbiA9IDA7CisJd21pX2J1Zl90IGJ1ZjsKKworCS8qQ2hlY2sgaWYgcGFja2V0IGxvZyBpcyBlbmFibGVkIGluIGNmZy5pbmkgKi8KKwlpZiAoIWNkc19pc19wYWNrZXRfbG9nX2VuYWJsZWQoKSkgeworCQlXTUFfTE9HRSgiJXM6cGt0IGxvZyBpcyBub3QgZW5hYmxlZCBpbiBjZmcuaW5pIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJUEtUTE9HX0VWRU5UID0gcGFyYW1zLT5wa3Rsb2dfZXZlbnQ7CisJQ01EX0lEID0gcGFyYW1zLT5jbWRfaWQ7CisKKwlzd2l0Y2ggKENNRF9JRCkgeworCWNhc2UgV01JX1BERVZfUEtUTE9HX0VOQUJMRV9DTURJRDoKKwkJbGVuID0gc2l6ZW9mKCpjbWQpOworCQlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJCWlmICghYnVmKSB7CisJCQlXTUFfTE9HRSgiJXM6d21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisJCWNtZCA9ICh3bWlfcGRldl9wa3Rsb2dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAqKQorCQkJd21pX2J1Zl9kYXRhKGJ1Zik7CisJCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9wa3Rsb2dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwKKwkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCQkgICAgICAgKHdtaV9wZGV2X3BrdGxvZ19lbmFibGVfY21kX2ZpeGVkX3BhcmFtKSk7CisJCWNtZC0+ZXZsaXN0ID0gUEtUTE9HX0VWRU5UOworCQlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJCSBXTUlfUERFVl9QS1RMT0dfRU5BQkxFX0NNRElEKSkgeworCQkJV01BX0xPR0UoImZhaWxlZCB0byBzZW5kIHBrdGxvZyBlbmFibGUgY21kaWQiKTsKKwkJCWdvdG8gd21pX3NlbmRfZmFpbGVkOworCQl9CisJCWJyZWFrOworCWNhc2UgV01JX1BERVZfUEtUTE9HX0RJU0FCTEVfQ01ESUQ6CisJCWxlbiA9IHNpemVvZigqZGlzYWJsZV9jbWQpOworCQlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJCWlmICghYnVmKSB7CisJCQlXTUFfTE9HRSgiJXM6d21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisJCWRpc2FibGVfY21kID0gKHdtaV9wZGV2X3BrdGxvZ19kaXNhYmxlX2NtZF9maXhlZF9wYXJhbSAqKQorCQkJICAgICAgd21pX2J1Zl9kYXRhKGJ1Zik7CisJCVdNSVRMVl9TRVRfSERSKCZkaXNhYmxlX2NtZC0+dGx2X2hlYWRlciwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3BrdGxvZ19kaXNhYmxlX2NtZF9maXhlZF9wYXJhbSwKKwkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCQkgICAgICAgKHdtaV9wZGV2X3BrdGxvZ19kaXNhYmxlX2NtZF9maXhlZF9wYXJhbSkpOworCQlkaXNhYmxlX2NtZC0+cmVzZXJ2ZWQwID0gMDsKKwkJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCQkgV01JX1BERVZfUEtUTE9HX0RJU0FCTEVfQ01ESUQpKSB7CisJCQlXTUFfTE9HRSgiZmFpbGVkIHRvIHNlbmQgcGt0bG9nIGRpc2FibGUgY21kaWQiKTsKKwkJCWdvdG8gd21pX3NlbmRfZmFpbGVkOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdNQV9MT0dEKCIlczogaW52YWxpZCBQS1RMT0cgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKword21pX3NlbmRfZmFpbGVkOgorCXdtaV9idWZfZnJlZShidWYpOworCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKK30KKyNlbmRpZiAvKiBSRU1PVkVfUEtUX0xPRyAqLworCitzdGF0aWMgdm9pZCB3bWFfc2VuZF9zdGF0dXNfdG9fc3VzcGVuZF9pbmQodHBfd21hX2hhbmRsZSB3bWEsIGJvb2wgc3VzcGVuZGVkKQoreworCXRTaXJSZWFkeVRvU3VzcGVuZEluZCAqcmVhZHlfdG9fc3VzcGVuZDsKKwlDREZfU1RBVFVTIHN0YXR1czsKKwljZHNfbXNnX3QgY2RzX21zZzsKKwl1aW50OF90IGxlbjsKKworCVdNQV9MT0dEKCJQb3N0aW5nIHJlYWR5IHRvIHN1c3BlbmQgaW5kaWNhdGlvbiB0byB1bWFjIik7CisKKwlsZW4gPSBzaXplb2YodFNpclJlYWR5VG9TdXNwZW5kSW5kKTsKKwlyZWFkeV90b19zdXNwZW5kID0gKHRTaXJSZWFkeVRvU3VzcGVuZEluZCAqKSBjZGZfbWVtX21hbGxvYyhsZW4pOworCisJaWYgKE5VTEwgPT0gcmVhZHlfdG9fc3VzcGVuZCkgeworCQlXTUFfTE9HRSgiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlyZWFkeV90b19zdXNwZW5kLT5tZXNnVHlwZSA9IGVXTklfU01FX1JFQURZX1RPX1NVU1BFTkRfSU5EOworCXJlYWR5X3RvX3N1c3BlbmQtPm1lc2dMZW4gPSBsZW47CisJcmVhZHlfdG9fc3VzcGVuZC0+c3VzcGVuZGVkID0gc3VzcGVuZGVkOworCisJY2RzX21zZy50eXBlID0gZVdOSV9TTUVfUkVBRFlfVE9fU1VTUEVORF9JTkQ7CisJY2RzX21zZy5ib2R5cHRyID0gKHZvaWQgKilyZWFkeV90b19zdXNwZW5kOworCWNkc19tc2cuYm9keXZhbCA9IDA7CisKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9TTUUsICZjZHNfbXNnKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHBvc3QgcmVhZHkgdG8gc3VzcGVuZCIpOworCQljZGZfbWVtX2ZyZWUocmVhZHlfdG9fc3VzcGVuZCk7CisJfQorfQorCisvKioKKyAqIHdtYV93b3dfd2FrZV9yZWFzb25fc3RyKCkgLSAgQ29udmVydHMgd293IHdha2V1cCByZWFzb24gY29kZSB0byB0ZXh0IGZvcm1hdAorICogQHdha2VfcmVhc29uIC0gV09XIHdha2UgcmVhc29uCisgKgorICogUmV0dXJuOiByZWFzb24gY29kZSBpbiBzdHJpbmcgZm9ybWF0CisgKi8KK3N0YXRpYyBjb25zdCB1OCAqd21hX3dvd193YWtlX3JlYXNvbl9zdHIoQV9JTlQzMiB3YWtlX3JlYXNvbikKK3sKKwlzd2l0Y2ggKHdha2VfcmVhc29uKSB7CisJY2FzZSBXT1dfUkVBU09OX1VOU1BFQ0lGSUVEOgorCQlyZXR1cm4gIlVOU1BFQ0lGSUVEIjsKKwljYXNlIFdPV19SRUFTT05fTkxPRDoKKwkJcmV0dXJuICJOTE9EIjsKKwljYXNlIFdPV19SRUFTT05fQVBfQVNTT0NfTE9TVDoKKwkJcmV0dXJuICJBUF9BU1NPQ19MT1NUIjsKKwljYXNlIFdPV19SRUFTT05fTE9XX1JTU0k6CisJCXJldHVybiAiTE9XX1JTU0kiOworCWNhc2UgV09XX1JFQVNPTl9ERUFVVEhfUkVDVkQ6CisJCXJldHVybiAiREVBVVRIX1JFQ1ZEIjsKKwljYXNlIFdPV19SRUFTT05fRElTQVNTT0NfUkVDVkQ6CisJCXJldHVybiAiRElTQVNTT0NfUkVDVkQiOworCWNhc2UgV09XX1JFQVNPTl9HVEtfSFNfRVJSOgorCQlyZXR1cm4gIkdUS19IU19FUlIiOworCWNhc2UgV09XX1JFQVNPTl9FQVBfUkVROgorCQlyZXR1cm4gIkVBUF9SRVEiOworCWNhc2UgV09XX1JFQVNPTl9GT1VSV0FZX0hTX1JFQ1Y6CisJCXJldHVybiAiRk9VUldBWV9IU19SRUNWIjsKKwljYXNlIFdPV19SRUFTT05fVElNRVJfSU5UUl9SRUNWOgorCQlyZXR1cm4gIlRJTUVSX0lOVFJfUkVDViI7CisJY2FzZSBXT1dfUkVBU09OX1BBVFRFUk5fTUFUQ0hfRk9VTkQ6CisJCXJldHVybiAiUEFUVEVSTl9NQVRDSF9GT1VORCI7CisJY2FzZSBXT1dfUkVBU09OX1JFQ1ZfTUFHSUNfUEFUVEVSTjoKKwkJcmV0dXJuICJSRUNWX01BR0lDX1BBVFRFUk4iOworCWNhc2UgV09XX1JFQVNPTl9QMlBfRElTQzoKKwkJcmV0dXJuICJQMlBfRElTQyI7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0xQSEIKKwljYXNlIFdPV19SRUFTT05fV0xBTl9IQjoKKwkJcmV0dXJuICJXTEFOX0hCIjsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTFBIQiAqLworCisJY2FzZSBXT1dfUkVBU09OX0NTQV9FVkVOVDoKKwkJcmV0dXJuICJDU0FfRVZFTlQiOworCWNhc2UgV09XX1JFQVNPTl9QUk9CRV9SRVFfV1BTX0lFX1JFQ1Y6CisJCXJldHVybiAiUFJPQkVfUkVRX1JFQ1YiOworCWNhc2UgV09XX1JFQVNPTl9BVVRIX1JFUV9SRUNWOgorCQlyZXR1cm4gIkFVVEhfUkVRX1JFQ1YiOworCWNhc2UgV09XX1JFQVNPTl9BU1NPQ19SRVFfUkVDVjoKKwkJcmV0dXJuICJBU1NPQ19SRVFfUkVDViI7CisJY2FzZSBXT1dfUkVBU09OX0hUVF9FVkVOVDoKKwkJcmV0dXJuICJXT1dfUkVBU09OX0hUVF9FVkVOVCI7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1JBX0ZJTFRFUklORworCWNhc2UgV09XX1JFQVNPTl9SQV9NQVRDSDoKKwkJcmV0dXJuICJXT1dfUkVBU09OX1JBX01BVENIIjsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fUkFfRklMVEVSSU5HICovCisJY2FzZSBXT1dfUkVBU09OX0JFQUNPTl9SRUNWOgorCQlyZXR1cm4gIldPV19SRUFTT05fSUJTU19CRUFDT05fUkVDViI7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKwljYXNlIFdPV19SRUFTT05fSE9TVF9BVVRPX1NIVVRET1dOOgorCQlyZXR1cm4gIldPV19SRUFTT05fSE9TVF9BVVRPX1NIVVRET1dOIjsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTiAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwljYXNlIFdPV19SRUFTT05fUk9BTV9ITzoKKwkJcmV0dXJuICJXT1dfUkVBU09OX1JPQU1fSE8iOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCWNhc2UgV09XX1JFQVNPTl9FWFRTQ0FOOgorCQlyZXR1cm4gIldPV19SRUFTT05fRVhUU0NBTiI7CisjZW5kaWYKKwljYXNlIFdPV19SRUFTT05fUlNTSV9CUkVBQ0hfRVZFTlQ6CisJCXJldHVybiAiV09XX1JFQVNPTl9SU1NJX0JSRUFDSF9FVkVOVCI7CisJfQorCXJldHVybiAidW5rbm93biI7Cit9CisKKy8qKgorICogd21hX3dvd193YWtlX3VwX3N0YXRzX2Rpc3BsYXkoKSAtIGRpc3BsYXkgd293IHdha2UgdXAgc3RhdHMKKyAqIEB3bWE6IFBvaW50ZXIgdG8gd21hIGhhbmRsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfd293X3dha2VfdXBfc3RhdHNfZGlzcGxheSh0cF93bWFfaGFuZGxlIHdtYSkKK3sKKwlXTUFfTE9HQSgidWMgJWQgYmMgJWQgdjRfbWMgJWQgdjZfbWMgJWQgcmEgJWQgbnMgJWQgbmEgJWQgcG5vX21hdGNoICVkIHBub19jb21wbGV0ZSAlZCBnc2NhbiAlZCBsb3dfcnNzaSAlZCByc3NpX2JyZWFjaCAlZCIsCisJCXdtYS0+d293X3VjYXN0X3dha2VfdXBfY291bnQsCisJCXdtYS0+d293X2JjYXN0X3dha2VfdXBfY291bnQsCisJCXdtYS0+d293X2lwdjRfbWNhc3Rfd2FrZV91cF9jb3VudCwKKwkJd21hLT53b3dfaXB2Nl9tY2FzdF93YWtlX3VwX2NvdW50LAorCQl3bWEtPndvd19pcHY2X21jYXN0X3JhX3N0YXRzLAorCQl3bWEtPndvd19pcHY2X21jYXN0X25zX3N0YXRzLAorCQl3bWEtPndvd19pcHY2X21jYXN0X25hX3N0YXRzLAorCQl3bWEtPndvd19wbm9fbWF0Y2hfd2FrZV91cF9jb3VudCwKKwkJd21hLT53b3dfcG5vX2NvbXBsZXRlX3dha2VfdXBfY291bnQsCisJCXdtYS0+d293X2dzY2FuX3dha2VfdXBfY291bnQsCisJCXdtYS0+d293X2xvd19yc3NpX3dha2VfdXBfY291bnQsCisJCXdtYS0+d293X3Jzc2lfYnJlYWNoX3dha2VfdXBfY291bnQpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIHdtYV93b3dfaXB2Nl9tY2FzdF9zdGF0cygpIC0gaXB2NiBtY2FzdCB3YWtlIHVwIHN0YXRzCisgKiBAd21hOiBQb2ludGVyIHRvIHdtYSBoYW5kbGUKKyAqIEBkYXRhOiBQb2ludGVyIHRvIHBhdHRlcm4gbWF0Y2ggZGF0YQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfd293X2lwdjZfbWNhc3Rfc3RhdHModHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgKmRhdGEpCit7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgaXB2Nl9tY2FzdFtdID0gezB4ODYsIDB4RER9OworCisJaWYgKCFtZW1jbXAoaXB2Nl9tY2FzdCwgKGRhdGEgKyBXTUFfRVRIRVJfVFlQRV9PRkZTRVQpLAorCQkJCQkJc2l6ZW9mKGlwdjZfbWNhc3QpKSkgeworCQlpZiAoV01BX0lDTVBfVjZfSEVBREVSX1RZUEUgPT0KKwkJCSooZGF0YSArIFdNQV9JQ01QX1Y2X0hFQURFUl9PRkZTRVQpKSB7CisJCQlpZiAoV01BX0lDTVBfVjZfUkFfVFlQRSA9PQorCQkJCSooZGF0YSArIFdNQV9JQ01QX1Y2X1RZUEVfT0ZGU0VUKSkKKwkJCQl3bWEtPndvd19pcHY2X21jYXN0X3JhX3N0YXRzKys7CisJCQllbHNlIGlmIChXTUFfSUNNUF9WNl9OU19UWVBFID09CisJCQkJKihkYXRhICsgV01BX0lDTVBfVjZfVFlQRV9PRkZTRVQpKQorCQkJCXdtYS0+d293X2lwdjZfbWNhc3RfbnNfc3RhdHMrKzsKKwkJCWVsc2UgaWYgKFdNQV9JQ01QX1Y2X05BX1RZUEUgPT0KKwkJCQkqKGRhdGEgKyBXTUFfSUNNUF9WNl9UWVBFX09GRlNFVCkpCisJCQkJd21hLT53b3dfaXB2Nl9tY2FzdF9uYV9zdGF0cysrOworCQkJZWxzZQorCQkJCVdNQV9MT0dBKCJJQ01QIFY2IHR5cGUgOiAweCV4IiwKKwkJCQkJKihkYXRhICsgV01BX0lDTVBfVjZfVFlQRV9PRkZTRVQpKTsKKwkJfSBlbHNlIHsKKwkJCVdNQV9MT0dBKCJJQ01QX1Y2IGhlYWRlciAweCV4IiwKKwkJCQkqKGRhdGEgKyBXTUFfSUNNUF9WNl9IRUFERVJfT0ZGU0VUKSk7CisJCX0KKwl9IGVsc2UgeworCQlXTUFfTE9HQSgiRXRoZXJ0eXBlIHgleDoweCV4IiwKKwkJCSooZGF0YSArIFdNQV9FVEhFUl9UWVBFX09GRlNFVCksCisJCQkqKGRhdGEgKyBXTUFfRVRIRVJfVFlQRV9PRkZTRVQgKyAxKSk7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIHdtYV93b3dfd2FrZV91cF9zdGF0cygpIC0gbWFpbnRhaW4gd293IHBhdHRlcm4gbWF0Y2ggd2FrZSB1cCBzdGF0cworICogQHdtYTogUG9pbnRlciB0byB3bWEgaGFuZGxlCisgKiBAZGF0YTogUG9pbnRlciB0byBwYXR0ZXJuIG1hdGNoIGRhdGEKKyAqIEBsZW46IFBhdHRlcm4gbWF0Y2ggZGF0YSBsZW5ndGgKKyAqIEBldmVudDogV2FrZSB1cCBldmVudAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfd293X3dha2VfdXBfc3RhdHModHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgKmRhdGEsCisJaW50MzJfdCBsZW4sIFdPV19XQUtFX1JFQVNPTl9UWVBFIGV2ZW50KQoreworCXN3aXRjaCAoZXZlbnQpIHsKKworCWNhc2UgV09XX1JFQVNPTl9QQVRURVJOX01BVENIX0ZPVU5EOgorCQlpZiAoV01BX0JDQVNUX01BQ19BRERSID09ICpkYXRhKSB7CisJCQl3bWEtPndvd19iY2FzdF93YWtlX3VwX2NvdW50Kys7CisJCX0gZWxzZSBpZiAoV01BX01DQVNUX0lQVjRfTUFDX0FERFIgPT0gKmRhdGEpIHsKKwkJCXdtYS0+d293X2lwdjRfbWNhc3Rfd2FrZV91cF9jb3VudCsrOworCQl9IGVsc2UgaWYgKFdNQV9NQ0FTVF9JUFY2X01BQ19BRERSID09ICpkYXRhKSB7CisJCQl3bWEtPndvd19pcHY2X21jYXN0X3dha2VfdXBfY291bnQrKzsKKwkJCWlmIChsZW4gPiBXTUFfSUNNUF9WNl9UWVBFX09GRlNFVCkKKwkJCQl3bWFfd293X2lwdjZfbWNhc3Rfc3RhdHMod21hLCBkYXRhKTsKKwkJCWVsc2UKKwkJCQlXTUFfTE9HQSgiSUNNUF9WNiBkYXRhIGxlbiAlZCIsIGxlbik7CisJCX0gZWxzZSB7CisJCQl3bWEtPndvd191Y2FzdF93YWtlX3VwX2NvdW50Kys7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdPV19SRUFTT05fUkFfTUFUQ0g6CisJCXdtYS0+d293X2lwdjZfbWNhc3RfcmFfc3RhdHMrKzsKKwkJYnJlYWs7CisKKwljYXNlIFdPV19SRUFTT05fTkxPRDoKKwkJd21hLT53b3dfcG5vX21hdGNoX3dha2VfdXBfY291bnQrKzsKKwkJYnJlYWs7CisKKwljYXNlIFdPV19SRUFTT05fTkxPX1NDQU5fQ09NUExFVEU6CisJCXdtYS0+d293X3Bub19jb21wbGV0ZV93YWtlX3VwX2NvdW50Kys7CisJCWJyZWFrOworCisJY2FzZSBXT1dfUkVBU09OX0xPV19SU1NJOgorCQl3bWEtPndvd19sb3dfcnNzaV93YWtlX3VwX2NvdW50Kys7CisJCWJyZWFrOworCisJY2FzZSBXT1dfUkVBU09OX0VYVFNDQU46CisJCXdtYS0+d293X2dzY2FuX3dha2VfdXBfY291bnQrKzsKKwkJYnJlYWs7CisKKwljYXNlIFdPV19SRUFTT05fUlNTSV9CUkVBQ0hfRVZFTlQ6CisJCXdtYS0+d293X3Jzc2lfYnJlYWNoX3dha2VfdXBfY291bnQrKzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlXTUFfTE9HRSgiVW5rbm93biB3YWtlIHVwIHJlYXNvbiIpOworCQlicmVhazsKKwl9CisKKwl3bWFfd293X3dha2VfdXBfc3RhdHNfZGlzcGxheSh3bWEpOworCXJldHVybjsKK30KKworLyoqCisgKiB3bWFfd293X3dha2V1cF9ob3N0X2V2ZW50KCkgLSB3YWtldXAgaG9zdCBldmVudCBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZXZlbnQ6IGV2ZW50IGRhdGEKKyAqIEBsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBIYW5kbGVyIHRvIGNhdGNoIHdvdyB3YWtldXAgaG9zdCBldmVudC4gVGhpcyBldmVudCB3aWxsIGhhdmUKKyAqIHJlYXNvbiB3aHkgdGhlIGZpcm13YXJlIGhhcyB3b2tlbiB0aGUgaG9zdC4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IKKyAqLworaW50IHdtYV93b3dfd2FrZXVwX2hvc3RfZXZlbnQodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwKKwkJCSAgICAgIHVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX1dPV19XQUtFVVBfSE9TVF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwlXT1dfRVZFTlRfSU5GT19maXhlZF9wYXJhbSAqd2FrZV9pbmZvOworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICpub2RlOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCXVpbnQzMl90IHdha2VfbG9ja19kdXJhdGlvbiA9IDA7CisJdWludDMyX3Qgd293X2J1Zl9wa3RfbGVuID0gMDsKKworCXBhcmFtX2J1ZiA9IChXTUlfV09XX1dBS0VVUF9IT1NUX0VWRU5USURfcGFyYW1fdGx2cyAqKSBldmVudDsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiSW52YWxpZCB3b3cgd2FrZXVwIGhvc3QgZXZlbnQgYnVmIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdha2VfaW5mbyA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisKKwlXTUFfTE9HQSgiV09XIHdha2V1cCBob3N0IGV2ZW50IHJlY2VpdmVkIChyZWFzb246ICVzKCVkKSkgZm9yIHZkZXYgJWQiLAorCQkgd21hX3dvd193YWtlX3JlYXNvbl9zdHIod2FrZV9pbmZvLT53YWtlX3JlYXNvbiksCisJCSB3YWtlX2luZm8tPndha2VfcmVhc29uLCB3YWtlX2luZm8tPnZkZXZfaWQpOworCisJY2RmX2V2ZW50X3NldCgmd21hLT53bWFfcmVzdW1lX2V2ZW50KTsKKworCXN3aXRjaCAod2FrZV9pbmZvLT53YWtlX3JlYXNvbikgeworCWNhc2UgV09XX1JFQVNPTl9BVVRIX1JFUV9SRUNWOgorCQl3YWtlX2xvY2tfZHVyYXRpb24gPSBXTUFfQVVUSF9SRVFfUkVDVl9XQUtFX0xPQ0tfVElNRU9VVDsKKwkJYnJlYWs7CisKKwljYXNlIFdPV19SRUFTT05fQVNTT0NfUkVRX1JFQ1Y6CisJCXdha2VfbG9ja19kdXJhdGlvbiA9IFdNQV9BU1NPQ19SRVFfUkVDVl9XQUtFX0xPQ0tfRFVSQVRJT047CisJCWJyZWFrOworCisJY2FzZSBXT1dfUkVBU09OX0RFQVVUSF9SRUNWRDoKKwkJd2FrZV9sb2NrX2R1cmF0aW9uID0gV01BX0RFQVVUSF9SRUNWX1dBS0VfTE9DS19EVVJBVElPTjsKKwkJYnJlYWs7CisKKwljYXNlIFdPV19SRUFTT05fRElTQVNTT0NfUkVDVkQ6CisJCXdha2VfbG9ja19kdXJhdGlvbiA9IFdNQV9ESVNBU1NPQ19SRUNWX1dBS0VfTE9DS19EVVJBVElPTjsKKwkJYnJlYWs7CisKKwljYXNlIFdPV19SRUFTT05fQVBfQVNTT0NfTE9TVDoKKwkJd2FrZV9sb2NrX2R1cmF0aW9uID0gV01BX0JNSVNTX0VWRU5UX1dBS0VfTE9DS19EVVJBVElPTjsKKwkJV01BX0xPR0EoIkJlYWNvbiBtaXNzIGluZGljYXRpb24gb24gdmRldiAleCIsCisJCQkgd2FrZV9pbmZvLT52ZGV2X2lkKTsKKwkJd21hX2JlYWNvbl9taXNzX2hhbmRsZXIod21hLCB3YWtlX2luZm8tPnZkZXZfaWQpOworCQlicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fUkFfRklMVEVSSU5HCisJY2FzZSBXT1dfUkVBU09OX1JBX01BVENIOgorCQl3bWFfd293X3dha2VfdXBfc3RhdHMod21hLCBOVUxMLCAwLCBXT1dfUkVBU09OX1JBX01BVENIKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1JBX0ZJTFRFUklORyAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOCisJY2FzZSBXT1dfUkVBU09OX0hPU1RfQVVUT19TSFVURE9XTjoKKwkJd2FrZV9sb2NrX2R1cmF0aW9uID0gV01BX0FVVE9fU0hVVERPV05fV0FLRV9MT0NLX0RVUkFUSU9OOworCQlXTUFfTE9HQSgiUmVjZWl2ZWQgV09XIEF1dG8gU2h1dGRvd24gdHJpZ2dlciBpbiBzdXNwZW5kIik7CisJCWlmICh3bWFfcG9zdF9hdXRvX3NodXRkb3duX21zZygpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisJY2FzZSBXT1dfUkVBU09OX05MT0Q6CisJCXdtYV93b3dfd2FrZV91cF9zdGF0cyh3bWEsIE5VTEwsIDAsIFdPV19SRUFTT05fTkxPRCk7CisJCW5vZGUgPSAmd21hLT5pbnRlcmZhY2VzW3dha2VfaW5mby0+dmRldl9pZF07CisJCWlmIChub2RlKSB7CisJCQlXTUFfTE9HRCgiTkxPIG1hdGNoIGhhcHBlbmVkIik7CisJCQlub2RlLT5ubG9fbWF0Y2hfZXZ0X3JlY2VpdmVkID0gdHJ1ZTsKKwkJCWNkZl93YWtlX2xvY2tfdGltZW91dF9hY3F1aXJlKCZ3bWEtPnBub193YWtlX2xvY2ssCisJCQkJCVdNQV9QTk9fTUFUQ0hfV0FLRV9MT0NLX1RJTUVPVVQsCisJCQkJCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfUE5PKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKworCWNhc2UgV09XX1JFQVNPTl9DU0FfRVZFTlQ6CisJeworCQlXTUlfQ1NBX0hBTkRMSU5HX0VWRU5USURfcGFyYW1fdGx2cyBwYXJhbTsKKwkJV01BX0xPR0QoIkhvc3Qgd29rZW4gdXAgYmVjYXVzZSBvZiBDU0EgSUUiKTsKKwkJcGFyYW0uZml4ZWRfcGFyYW0gPSAod21pX2NzYV9ldmVudF9maXhlZF9wYXJhbSAqKQorCQkJCSAgICAoKCh1aW50OF90ICopIHdha2VfaW5mbykKKwkJCQkgICAgICsgc2l6ZW9mKFdPV19FVkVOVF9JTkZPX2ZpeGVkX3BhcmFtKQorCQkJCSAgICAgKyBXT1dfQ1NBX0VWRU5UX09GRlNFVCk7CisJCXdtYV9jc2Ffb2ZmbG9hZF9oYW5kbGVyKGhhbmRsZSwgKHVpbnQ4X3QgKikgJnBhcmFtLAorCQkJCQlzaXplb2YocGFyYW0pKTsKKwl9CisJYnJlYWs7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTFBIQgorCWNhc2UgV09XX1JFQVNPTl9XTEFOX0hCOgorCQl3bWFfbHBoYl9oYW5kbGVyKHdtYSwgKHVpbnQ4X3QgKikgcGFyYW1fYnVmLT5oYl9pbmRldnQpOworCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTFBIQiAqLworCisJY2FzZSBXT1dfUkVBU09OX0hUVF9FVkVOVDoKKwkJYnJlYWs7CisJY2FzZSBXT1dfUkVBU09OX1BBVFRFUk5fTUFUQ0hfRk9VTkQ6CisJCXdtYV93b3dfd2FrZV91cF9zdGF0c19kaXNwbGF5KHdtYSk7CisJCVdNQV9MT0dEKCJXYWtlIHVwIGZvciBSeCBwYWNrZXQsIGR1bXAgc3RhcnRpbmcgZnJvbSBldGhlcm5ldCBoZHIiKTsKKwkJaWYgKHBhcmFtX2J1Zi0+d293X3BhY2tldF9idWZmZXIpIHsKKwkJCS8qIEZpcnN0IDQtYnl0ZXMgb2Ygd293X3BhY2tldF9idWZmZXIgaXMgdGhlIGxlbmd0aCAqLworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZ3b3dfYnVmX3BrdF9sZW4sCisJCQkJICAgICBwYXJhbV9idWYtPndvd19wYWNrZXRfYnVmZmVyLCA0KTsKKwkJCXdtYV93b3dfd2FrZV91cF9zdGF0cyh3bWEsCisJCQkJcGFyYW1fYnVmLT53b3dfcGFja2V0X2J1ZmZlciArIDQsCisJCQkJd293X2J1Zl9wa3RfbGVuLAorCQkJCVdPV19SRUFTT05fUEFUVEVSTl9NQVRDSF9GT1VORCk7CisJCQljZGZfdHJhY2VfaGV4X2R1bXAoQ0RGX01PRFVMRV9JRF9XTUEsCisJCQkJCSAgIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkJICAgcGFyYW1fYnVmLT53b3dfcGFja2V0X2J1ZmZlciArIDQsCisJCQkJCSAgIHdvd19idWZfcGt0X2xlbik7CisJCX0gZWxzZSB7CisJCQlXTUFfTE9HRSgiTm8gd293IHBhY2tldCBidWZmZXIgcHJlc2VudCIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBXT1dfUkVBU09OX0xPV19SU1NJOgorCXsKKwkJLyogV09XX1JFQVNPTl9MT1dfUlNTSSBpcyB1c2VkIGZvciBhbGwgcm9hbWluZyBldmVudHMuCisJCSAqIFdNSV9ST0FNX1JFQVNPTl9CRVRURVJfQVAsIFdNSV9ST0FNX1JFQVNPTl9CTUlTUywKKwkJICogV01JX1JPQU1fUkVBU09OX1NVSVRBQkxFX0FQIHdpbGwgYmUgaGFuZGxlZCBieQorCQkgKiB3bWFfcm9hbV9ldmVudF9jYWxsYmFjaygpLgorCQkgKi8KKwkJV01JX1JPQU1fRVZFTlRJRF9wYXJhbV90bHZzIHBhcmFtOworCQl3bWFfd293X3dha2VfdXBfc3RhdHMod21hLCBOVUxMLCAwLCBXT1dfUkVBU09OX0xPV19SU1NJKTsKKwkJaWYgKHBhcmFtX2J1Zi0+d293X3BhY2tldF9idWZmZXIpIHsKKwkJCS8qIFJvYW0gZXZlbnQgaXMgZW1iZWRkZWQgaW4gd293X3BhY2tldF9idWZmZXIgKi8KKwkJCVdNQV9MT0dEKCJIb3N0IHdva2VuIHVwIGJlY2F1c2Ugb2Ygcm9hbSBldmVudCIpOworCQkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopICZ3b3dfYnVmX3BrdF9sZW4sCisJCQkJICAgICBwYXJhbV9idWYtPndvd19wYWNrZXRfYnVmZmVyLCA0KTsKKwkJCVdNQV9MT0dEKCJ3b3dfcGFja2V0X2J1ZmZlciBkdW1wIik7CisJCQljZGZfdHJhY2VfaGV4X2R1bXAoQ0RGX01PRFVMRV9JRF9XTUEsCisJCQkJCSAgIENERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQkJICAgcGFyYW1fYnVmLT53b3dfcGFja2V0X2J1ZmZlciwKKwkJCQkJICAgd293X2J1Zl9wa3RfbGVuKTsKKwkJCWlmICh3b3dfYnVmX3BrdF9sZW4gPj0gc2l6ZW9mKHBhcmFtKSkgeworCQkJCXBhcmFtLmZpeGVkX3BhcmFtID0KKwkJCQkJKHdtaV9yb2FtX2V2ZW50X2ZpeGVkX3BhcmFtICopCisJCQkJCShwYXJhbV9idWYtPndvd19wYWNrZXRfYnVmZmVyICsgNCk7CisJCQkJd21hX3JvYW1fZXZlbnRfY2FsbGJhY2soaGFuZGxlLAorCQkJCQkJCSh1aW50OF90ICopICYKKwkJCQkJCQlwYXJhbSwKKwkJCQkJCQlzaXplb2YocGFyYW0pKTsKKwkJCX0gZWxzZSB7CisJCQkJV01BX0xPR0UoIldyb25nIGxlbmd0aCBmb3Igcm9hbSBldmVudCA9ICVkIGJ5dGVzIiwKKwkJCQkJd293X2J1Zl9wa3RfbGVuKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE5vIHdvd19wYWNrZXRfYnVmZmVyIG1lYW5zIGEgYmV0dGVyIEFQIGJlYWNvbgorCQkJICogd2lsbCBmb2xsb3cgaW4gYSBsYXRlciBldmVudC4KKwkJCSAqLworCQkJV01BX0xPR0QoIkhvc3Qgd29rZW4gdXAgYmVjYXVzZSBvZiBiZXR0ZXIgQVAgYmVhY29uIik7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgV09XX1JFQVNPTl9DTElFTlRfS0lDS09VVF9FVkVOVDoKKwkJeworCQlXTUlfUEVFUl9TVEFfS0lDS09VVF9FVkVOVElEX3BhcmFtX3RsdnMgcGFyYW07CisJCWlmIChwYXJhbV9idWYtPndvd19wYWNrZXRfYnVmZmVyKSB7CisJCSAgICAvKiBzdGF0aW9uIGtpY2tvdXQgZXZlbnQgZW1iZWRkZWQgaW4gd293X3BhY2tldF9idWZmZXIgKi8KKwkJICAgIFdNQV9MT0dEKCJIb3N0IHdva2VuIHVwIGJlY2F1c2Ugb2Ygc3RhX2tpY2tvdXQgZXZlbnQiKTsKKwkJICAgIGNkZl9tZW1fY29weSgodV9pbnQ4X3QgKikgJndvd19idWZfcGt0X2xlbiwKKwkJCQlwYXJhbV9idWYtPndvd19wYWNrZXRfYnVmZmVyLCA0KTsKKwkJICAgIFdNQV9MT0dEKCJ3b3dfcGFja2V0X2J1ZmZlciBkdW1wIik7CisJCQkJY2RmX3RyYWNlX2hleF9kdW1wKENERl9NT0RVTEVfSURfV01BLAorCQkJCUNERl9UUkFDRV9MRVZFTF9ERUJVRywKKwkJCQlwYXJhbV9idWYtPndvd19wYWNrZXRfYnVmZmVyLCB3b3dfYnVmX3BrdF9sZW4pOworCQkgICAgaWYgKHdvd19idWZfcGt0X2xlbiA+PSBzaXplb2YocGFyYW0pKSB7CisJCQlwYXJhbS5maXhlZF9wYXJhbSA9ICh3bWlfcGVlcl9zdGFfa2lja291dF9ldmVudF9maXhlZF9wYXJhbSAqKQorCQkJCQkocGFyYW1fYnVmLT53b3dfcGFja2V0X2J1ZmZlciArIDQpOworCQkJd21hX3BlZXJfc3RhX2tpY2tvdXRfZXZlbnRfaGFuZGxlcihoYW5kbGUsCisJCQkJCSh1X2ludDhfdCAqKSZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisJCSAgICB9IGVsc2UgeworCQkJV01BX0xPR0UoIldyb25nIGxlbmd0aCBmb3Igc3RhX2tpY2tvdXQgZXZlbnQgPSAlZCBieXRlcyIsCisJCQkJCXdvd19idWZfcGt0X2xlbik7CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICBXTUFfTE9HRCgiTm8gd293X3BhY2tldF9idWZmZXIgcHJlc2VudCIpOworCQl9CisJCWJyZWFrOworCX0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCWNhc2UgV09XX1JFQVNPTl9FWFRTQ0FOOgorCQlXTUFfTE9HRCgiSG9zdCB3b2tlbiB1cCBiZWNhdXNlIG9mIGV4dHNjYW4gcmVhc29uIik7CisJCXdtYV93b3dfd2FrZV91cF9zdGF0cyh3bWEsIE5VTEwsIDAsIFdPV19SRUFTT05fRVhUU0NBTik7CisJCWlmIChwYXJhbV9idWYtPndvd19wYWNrZXRfYnVmZmVyKSB7CisJCQl3b3dfYnVmX3BrdF9sZW4gPQorCQkJCSoodWludDMyX3QgKilwYXJhbV9idWYtPndvd19wYWNrZXRfYnVmZmVyOworCQkJd21hX2V4dHNjYW5fd293X2V2ZW50X2NhbGxiYWNrKGhhbmRsZSwKKwkJCQkodV9pbnQ4X3QgKikocGFyYW1fYnVmLT53b3dfcGFja2V0X2J1ZmZlciArIDQpLAorCQkJCXdvd19idWZfcGt0X2xlbik7CisJCX0gZWxzZQorCQkJV01BX0xPR0UoIndvd19wYWNrZXRfYnVmZmVyIGlzIGVtcHR5Iik7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBXT1dfUkVBU09OX1JTU0lfQlJFQUNIX0VWRU5UOgorCQl7CisJCQlXTUlfUlNTSV9CUkVBQ0hfRVZFTlRJRF9wYXJhbV90bHZzIHBhcmFtOworCisJCQl3bWFfd293X3dha2VfdXBfc3RhdHMod21hLCBOVUxMLCAwLAorCQkJCVdPV19SRUFTT05fUlNTSV9CUkVBQ0hfRVZFTlQpOworCQkJV01BX0xPR0QoIkhvc3Qgd29rZW4gdXAgYmVjYXVzZSBvZiByc3NpIGJyZWFjaCByZWFzb24iKTsKKwkJCS8qIHJzc2kgYnJlYWNoIGV2ZW50IGlzIGVtYmVkZGVkIGluIHdvd19wYWNrZXRfYnVmZmVyICovCisJCQlpZiAocGFyYW1fYnVmLT53b3dfcGFja2V0X2J1ZmZlcikgeworCQkJCWNkZl9tZW1fY29weSgodV9pbnQ4X3QgKikgJndvd19idWZfcGt0X2xlbiwKKwkJCQkJcGFyYW1fYnVmLT53b3dfcGFja2V0X2J1ZmZlciwgNCk7CisJCQkJaWYgKHdvd19idWZfcGt0X2xlbiA+PSBzaXplb2YocGFyYW0pKSB7CisJCQkJCXBhcmFtLmZpeGVkX3BhcmFtID0KKwkJCQkJKHdtaV9yc3NpX2JyZWFjaF9ldmVudF9maXhlZF9wYXJhbSAqKQorCQkJCQkocGFyYW1fYnVmLT53b3dfcGFja2V0X2J1ZmZlciArIDQpOworCQkJCQl3bWFfcnNzaV9icmVhY2hlZF9ldmVudF9oYW5kbGVyKGhhbmRsZSwKKwkJCQkJCQkodV9pbnQ4X3QgKikmcGFyYW0sCisJCQkJCQkJc2l6ZW9mKHBhcmFtKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJV01BX0xPR0UoIiVzOiBXcm9uZyBsZW5ndGg6ICVkIGJ5dGVzIiwKKwkJCQkJCV9fZnVuY19fLCB3b3dfYnVmX3BrdF9sZW4pOworCQkJCX0KKwkJCX0gZWxzZQorCQkJICAgIFdNQV9MT0dEKCJObyB3b3dfcGFja2V0X2J1ZmZlciBwcmVzZW50Iik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHdha2VfbG9ja19kdXJhdGlvbikgeworCQljZGZfd2FrZV9sb2NrX3RpbWVvdXRfYWNxdWlyZSgmd21hLT53b3dfd2FrZV9sb2NrLAorCQkJCQkgICAgICB3YWtlX2xvY2tfZHVyYXRpb24sCisJCQkJCSAgICAgIFdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfV09XKTsKKwkJV01BX0xPR0EoIkhvbGRpbmcgJWQgbXNlYyB3YWtlX2xvY2siLCB3YWtlX2xvY2tfZHVyYXRpb24pOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9wZGV2X3Jlc3VtZV9ldmVudF9oYW5kbGVyKCkgLSBQREVWIHJlc3VtZSBldmVudCBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZXZlbnQ6IGV2ZW50IGRhdGEKKyAqIEBsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IKKyAqLworaW50IHdtYV9wZGV2X3Jlc3VtZV9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsIHVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisKKwlXTUFfTE9HQSgiUmVjZWl2ZWQgUERFViByZXN1bWUgZXZlbnQiKTsKKworCWNkZl9ldmVudF9zZXQoJndtYS0+d21hX3Jlc3VtZV9ldmVudCk7CisKKwlyZXR1cm4gMDsKK30KKy8qKgorICogd21hX3NldF93b3dfYnVzX3N1c3BlbmQoKSAtIHNldCBzdXNwZW5kIGZsYWcKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2YWw6IHZhbHVlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3bWFfc2V0X3dvd19idXNfc3VzcGVuZCh0cF93bWFfaGFuZGxlIHdtYSwgaW50IHZhbCkKK3sKKworCWNkZl9hdG9taWNfc2V0KCZ3bWEtPmlzX3dvd19idXNfc3VzcGVuZGVkLCB2YWwpOworfQorCisKKworLyoqCisgKiB3bWFfYWRkX3dvd193YWtldXBfZXZlbnQoKSAtICBDb25maWd1cmVzIHdvdyB3YWtldXAgZXZlbnRzLgorICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBiaXRtYXA6IEV2ZW50IGJpdG1hcAorICogQGVuYWJsZTogZW5hYmxlL2Rpc2FibGUKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworc3RhdGljIENERl9TVEFUVVMgd21hX2FkZF93b3dfd2FrZXVwX2V2ZW50KHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQl1aW50MzJfdCB2ZGV2X2lkLAorCQkJCQl1aW50MzJfdCBiaXRtYXAsCisJCQkJCWJvb2wgZW5hYmxlKQoreworCVdNSV9XT1dfQUREX0RFTF9FVlRfQ01EX2ZpeGVkX3BhcmFtICpjbWQ7CisJdWludDE2X3QgbGVuOworCXdtaV9idWZfdCBidWY7CisJaW50IHJldDsKKworCWxlbiA9IHNpemVvZihXTUlfV09XX0FERF9ERUxfRVZUX0NNRF9maXhlZF9wYXJhbSk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2NhdGUgd21pIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJY21kID0gKFdNSV9XT1dfQUREX0RFTF9FVlRfQ01EX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfQUREX0RFTF9FVlRfQ01EX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKFdNSV9XT1dfQUREX0RFTF9FVlRfQ01EX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gdmRldl9pZDsKKwljbWQtPmlzX2FkZCA9IGVuYWJsZTsKKwljbWQtPmV2ZW50X2JpdG1hcCA9IGJpdG1hcDsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX1dPV19FTkFCTEVfRElTQUJMRV9XQUtFX0VWRU5UX0NNRElEKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gY29uZmlnIHdvdyB3YWtldXAgZXZlbnQiKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlXTUFfTE9HRCgiV2FrZXVwIHBhdHRlcm4gMHgleCAlcyBpbiBmdyIsIGJpdG1hcCwKKwkJIGVuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfc2VuZF93b3dfcGF0dGVybnNfdG9fZncoKSAtIFNlbmRzIFdPVyBwYXR0ZXJucyB0byBGVy4KKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAcHRybl9pZDogcGF0dGVybiBpZAorICogQHB0cm46IHBhdHRlcm4KKyAqIEBwdHJuX2xlbjogcGF0dGVybiBsZW5ndGgKKyAqIEBwdHJuX29mZnNldDogcGF0dGVybiBvZmZzZXQKKyAqIEBtYXNrOiBtYXNrCisgKiBAbWFza19sZW46IG1hc2sgbGVuZ3RoCisgKiBAdXNlcjogdHJ1ZSBmb3IgdXNlciBjb25maWd1cmVkIHBhdHRlcm4gYW5kIGZhbHNlIGZvciBkZWZhdWx0IHBhdHRlcm4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworc3RhdGljIENERl9TVEFUVVMgd21hX3NlbmRfd293X3BhdHRlcm5zX3RvX2Z3KHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCXVpbnQ4X3QgdmRldl9pZCwgdWludDhfdCBwdHJuX2lkLAorCQkJCWNvbnN0IHVpbnQ4X3QgKnB0cm4sIHVpbnQ4X3QgcHRybl9sZW4sCisJCQkJdWludDhfdCBwdHJuX29mZnNldCwgY29uc3QgdWludDhfdCAqbWFzaywKKwkJCQl1aW50OF90IG1hc2tfbGVuLCBib29sIHVzZXIpCit7CisJV01JX1dPV19BRERfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0gKmNtZDsKKwlXT1dfQklUTUFQX1BBVFRFUk5fVCAqYml0bWFwX3BhdHRlcm47CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlOworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwlpbnQzMl90IGxlbjsKKwlpbnQgcmV0OworCisJaWZhY2UgPSAmd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdOworCisJbGVuID0gc2l6ZW9mKFdNSV9XT1dfQUREX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtKSArCisJICAgICAgV01JX1RMVl9IRFJfU0laRSArCisJICAgICAgMSAqIHNpemVvZihXT1dfQklUTUFQX1BBVFRFUk5fVCkgKworCSAgICAgIFdNSV9UTFZfSERSX1NJWkUgKworCSAgICAgIDAgKiBzaXplb2YoV09XX0lQVjRfU1lOQ19QQVRURVJOX1QpICsKKwkgICAgICBXTUlfVExWX0hEUl9TSVpFICsKKwkgICAgICAwICogc2l6ZW9mKFdPV19JUFY2X1NZTkNfUEFUVEVSTl9UKSArCisJICAgICAgV01JX1RMVl9IRFJfU0laRSArCisJICAgICAgMCAqIHNpemVvZihXT1dfTUFHSUNfUEFUVEVSTl9DTUQpICsKKwkgICAgICBXTUlfVExWX0hEUl9TSVpFICsKKwkgICAgICAwICogc2l6ZW9mKEFfVUlOVDMyKSArIFdNSV9UTFZfSERSX1NJWkUgKyAxICogc2l6ZW9mKEFfVUlOVDMyKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIGFsbG9jYXRlIHdtaSBidWZmZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY21kID0gKFdNSV9XT1dfQUREX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSBjbWQ7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ19XTUlfV09XX0FERF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgIChXTUlfV09XX0FERF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJLyoKKwkgKiBGb3IgdXNlciBjb25maWd1cmVkIHdvdyBwYXR0ZXJuIHVzZSBwYXR0ZXJuIGlkIHNlbnQgYnkgSERECisJICogYW5kIGZvciBkZWZhdWx0IHdvdyBwYXR0ZXJucyBnZW5lcmF0ZSBwYXR0ZXJuIGlkIGludGVybmFsbHkKKwkgKi8KKwlpZiAodXNlcikKKwkJY21kLT5wYXR0ZXJuX2lkID0gcHRybl9pZDsKKwllbHNlCisJCWNtZC0+cGF0dGVybl9pZCA9IGlmYWNlLT5udW1fd293X2RlZmF1bHRfcGF0dGVybnMrKzsKKworCWNtZC0+cGF0dGVybl90eXBlID0gV09XX0JJVE1BUF9QQVRURVJOOworCWJ1Zl9wdHIgKz0gc2l6ZW9mKFdNSV9XT1dfQUREX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtKTsKKworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCSAgICAgICBzaXplb2YoV09XX0JJVE1BUF9QQVRURVJOX1QpKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJYml0bWFwX3BhdHRlcm4gPSAoV09XX0JJVE1BUF9QQVRURVJOX1QgKikgYnVmX3B0cjsKKworCVdNSVRMVl9TRVRfSERSKCZiaXRtYXBfcGF0dGVybi0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfV09XX0JJVE1BUF9QQVRURVJOX1QsCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oV09XX0JJVE1BUF9QQVRURVJOX1QpKTsKKworCWNkZl9tZW1fY29weSgmYml0bWFwX3BhdHRlcm4tPnBhdHRlcm5idWZbMF0sIHB0cm4sIHB0cm5fbGVuKTsKKwljZGZfbWVtX2NvcHkoJmJpdG1hcF9wYXR0ZXJuLT5iaXRtYXNrYnVmWzBdLCBtYXNrLCBtYXNrX2xlbik7CisKKwliaXRtYXBfcGF0dGVybi0+cGF0dGVybl9vZmZzZXQgPSBwdHJuX29mZnNldDsKKwliaXRtYXBfcGF0dGVybi0+cGF0dGVybl9sZW4gPSBwdHJuX2xlbjsKKworCWlmIChiaXRtYXBfcGF0dGVybi0+cGF0dGVybl9sZW4gPiBXT1dfREVGQVVMVF9CSVRNQVBfUEFUVEVSTl9TSVpFKQorCQliaXRtYXBfcGF0dGVybi0+cGF0dGVybl9sZW4gPSBXT1dfREVGQVVMVF9CSVRNQVBfUEFUVEVSTl9TSVpFOworCisJaWYgKGJpdG1hcF9wYXR0ZXJuLT5wYXR0ZXJuX2xlbiA+IFdPV19ERUZBVUxUX0JJVE1BU0tfU0laRSkKKwkJYml0bWFwX3BhdHRlcm4tPnBhdHRlcm5fbGVuID0gV09XX0RFRkFVTFRfQklUTUFTS19TSVpFOworCisJYml0bWFwX3BhdHRlcm4tPmJpdG1hc2tfbGVuID0gYml0bWFwX3BhdHRlcm4tPnBhdHRlcm5fbGVuOworCWJpdG1hcF9wYXR0ZXJuLT5wYXR0ZXJuX2lkID0gcHRybl9pZDsKKworCVdNQV9MT0dJKCJ2ZGV2IGlkIDogJWQsIHB0cm4gaWQ6ICVkLCBwdHJuIGxlbjogJWQsIHB0cm4gb2Zmc2V0OiAlZCB1c2VyICVkIiwKKwkJIGNtZC0+dmRldl9pZCwgY21kLT5wYXR0ZXJuX2lkLCBiaXRtYXBfcGF0dGVybi0+cGF0dGVybl9sZW4sCisJCSBiaXRtYXBfcGF0dGVybi0+cGF0dGVybl9vZmZzZXQsIHVzZXIpOworCisJV01BX0xPR0koIlBhdHRlcm4gOiAiKTsKKwlDREZfVFJBQ0VfSEVYX0RVTVAoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkmYml0bWFwX3BhdHRlcm4tPnBhdHRlcm5idWZbMF0sIGJpdG1hcF9wYXR0ZXJuLT5wYXR0ZXJuX2xlbik7CisKKwlXTUFfTE9HSSgiTWFzayA6ICIpOworCUNERl9UUkFDRV9IRVhfRFVNUChDREZfTU9EVUxFX0lEX1dNQSwgQ0RGX1RSQUNFX0xFVkVMX0lORk8sCisJCSZiaXRtYXBfcGF0dGVybi0+Yml0bWFza2J1ZlswXSwgYml0bWFwX3BhdHRlcm4tPnBhdHRlcm5fbGVuKTsKKworCWJ1Zl9wdHIgKz0gc2l6ZW9mKFdPV19CSVRNQVBfUEFUVEVSTl9UKTsKKworCS8qIEZpbGwgVExWIGZvciBXTUlUTFZfVEFHX1NUUlVDX1dPV19JUFY0X1NZTkNfUEFUVEVSTl9UIGJ1dCBubyBkYXRhLiAqLworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIDApOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKworCS8qIEZpbGwgVExWIGZvciBXTUlUTFZfVEFHX1NUUlVDX1dPV19JUFY2X1NZTkNfUEFUVEVSTl9UIGJ1dCBubyBkYXRhLiAqLworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIDApOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKworCS8qIEZpbGwgVExWIGZvciBXTUlUTFZfVEFHX1NUUlVDX1dPV19NQUdJQ19QQVRURVJOX0NNRCBidXQgbm8gZGF0YS4gKi8KKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCAwKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisKKwkvKiBGaWxsIFRMViBmb3IgcGF0dGVybl9pbmZvX3RpbWVvdXQgYnV0IG5vIGRhdGEuICovCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9VSU5UMzIsIDApOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKworCS8qIEZpbGwgVExWIGZvciByYV9yYXRlbGltaXRfaW50ZXJ2YWwgd2l0aCBkdW1teSBkYXRhIGFzIHRoaXMgZml4IGVsZW0gKi8KKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwgMSAqIHNpemVvZihBX1VJTlQzMikpOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwkqKEFfVUlOVDMyICopIGJ1Zl9wdHIgPSAwOworCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfV09XX0FERF9XQUtFX1BBVFRFUk5fQ01ESUQpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gc2VuZCB3b3cgcHRybiB0byBmdyIsIF9fZnVuY19fKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCWlmICghdXNlcikKKwkJCWlmYWNlLT5udW1fd293X2RlZmF1bHRfcGF0dGVybnMtLTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmICh1c2VyKQorCQlpZmFjZS0+bnVtX3dvd191c2VyX3BhdHRlcm5zKys7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV93b3dfYXAoKSAtIHNldCBXT1cgcGF0dGVybnMgaW4gYXAgbW9kZQorICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBDb25maWd1cmVzIGRlZmF1bHQgV09XIHBhdHRlcm4gZm9yIHRoZSBnaXZlbiB2ZGV2X2lkIHdoaWNoIGlzIGluIEFQIG1vZGUuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdtYV93b3dfYXAodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCkKK3sKKwlDREZfU1RBVFVTIHJldDsKKwl1aW50OF90IGFycF9vZmZzZXQgPSAyMDsKKwl1aW50OF90IG1hY19tYXNrW0lFRUU4MDIxMV9BRERSX0xFTl07CisKKwkvKiBTZXR1cCB1bmljYXN0IHBrdCBwYXR0ZXJuICovCisJY2RmX21lbV9zZXQoJm1hY19tYXNrLCBJRUVFODAyMTFfQUREUl9MRU4sIDB4RkYpOworCXJldCA9IHdtYV9zZW5kX3dvd19wYXR0ZXJuc190b19mdyh3bWEsIHZkZXZfaWQsIDAsCisJCQkJd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmFkZHIsCisJCQkJSUVFRTgwMjExX0FERFJfTEVOLCAwLCBtYWNfbWFzaywKKwkJCQlJRUVFODAyMTFfQUREUl9MRU4sIGZhbHNlKTsKKwlpZiAocmV0ICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGFkZCBXT1cgdW5pY2FzdCBwYXR0ZXJuIHJldCAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBTZXR1cCBhbGwgQVJQIHBrdCBwYXR0ZXJuLiBUaGlzIGlzIGR1bW15IHBhdHRlcm4gaGVuY2UgdGhlIGxlbmd0aAorCSAqIGlzIHplcm8KKwkgKi8KKwlyZXQgPSB3bWFfc2VuZF93b3dfcGF0dGVybnNfdG9fZncod21hLCB2ZGV2X2lkLCAwLAorCQkJYXJwX3B0cm4sIDAsIGFycF9vZmZzZXQsIGFycF9tYXNrLCAwLCBmYWxzZSk7CisJaWYgKHJldCAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBhZGQgV09XIEFSUCBwYXR0ZXJuIHJldCAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfd293X3N0YSgpIC0gc2V0IFdPVyBwYXR0ZXJucyBpbiBzdGEgbW9kZQorICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBDb25maWd1cmVzIGRlZmF1bHQgV09XIHBhdHRlcm4gZm9yIHRoZSBnaXZlbiB2ZGV2X2lkIHdoaWNoIGlzIGluIHN0YSBtb2RlLgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitzdGF0aWMgQ0RGX1NUQVRVUyB3bWFfd293X3N0YSh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkKQoreworCXVpbnQ4X3QgYXJwX29mZnNldCA9IDEyOworCXVpbnQ4X3QgZGlzY3ZyX29mZnNldCA9IDMwOworCXVpbnQ4X3QgbWFjX21hc2tbSUVFRTgwMjExX0FERFJfTEVOXTsKKwlDREZfU1RBVFVTIHJldCA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCS8qIFNldHVwIHVuaWNhc3QgcGt0IHBhdHRlcm4gKi8KKwljZGZfbWVtX3NldCgmbWFjX21hc2ssIElFRUU4MDIxMV9BRERSX0xFTiwgMHhGRik7CisJcmV0ID0gd21hX3NlbmRfd293X3BhdHRlcm5zX3RvX2Z3KHdtYSwgdmRldl9pZCwgMCwKKwkJCQl3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uYWRkciwKKwkJCQlJRUVFODAyMTFfQUREUl9MRU4sIDAsIG1hY19tYXNrLAorCQkJCUlFRUU4MDIxMV9BRERSX0xFTiwgZmFsc2UpOworCWlmIChyZXQgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gYWRkIFdPVyB1bmljYXN0IHBhdHRlcm4gcmV0ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFNldHVwIG11bHRpY2FzdCBwYXR0ZXJuIGZvciBtRE5TIDIyNC4wLjAuMjUxLAorCSAqIFNTRFAgMjM5LjI1NS4yNTUuMjUwIGFuZCBMTE1OUiAyMjQuMC4wLjI1MgorCSAqLworCWlmICh3bWEtPnNzZHApIHsKKwkJcmV0ID0gd21hX3NlbmRfd293X3BhdHRlcm5zX3RvX2Z3KHdtYSwgdmRldl9pZCwgMCwKKwkJCQlkaXNjdnJfcHRybiwgc2l6ZW9mKGRpc2N2cl9wdHJuKSwgZGlzY3ZyX29mZnNldCwKKwkJCQlkaXNjdnJfbWFzaywgc2l6ZW9mKGRpc2N2cl9wdHJuKSwgZmFsc2UpOworCQlpZiAocmV0ICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBhZGQgV09XIG1ETlMvU1NEUC9MTE1OUiBwYXR0ZXJuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlCisJCVdNQV9MT0dEKCJtRE5TLCBTU0RQLCBMTE1OUiBwYXR0ZXJucyBhcmUgZGlzYWJsZWQgZnJvbSBpbmkiKTsKKworCS8qIHdoZW4gYXJwIG9mZmxvYWQgb3IgbnMgb2ZmbG9hZGVkIGlzIGRpc2FibGVkCisJICogZnJvbSBpbmkgZmlsZSwgY29uZmlndXJlIGJyb2FkIGNhc3QgYXJwIHBhdHRlcm4KKwkgKiB0byBmdywgc28gdGhhdCBob3N0IGNhbiB3YWtlIHVwCisJICovCisJaWYgKCEod21hLT5vbF9pbmlfaW5mbyAmIDB4MSkpIHsKKwkJLyogU2V0dXAgYWxsIEFSUCBwa3QgcGF0dGVybiAqLworCQlyZXQgPSB3bWFfc2VuZF93b3dfcGF0dGVybnNfdG9fZncod21hLCB2ZGV2X2lkLCAwLAorCQkJCWFycF9wdHJuLCBzaXplb2YoYXJwX3B0cm4pLCBhcnBfb2Zmc2V0LAorCQkJCWFycF9tYXNrLCBzaXplb2YoYXJwX21hc2spLCBmYWxzZSk7CisJCWlmIChyZXQgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGFkZCBXT1cgQVJQIHBhdHRlcm4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBmb3IgTlMgb3IgTkRQIG9mZmxvYWQgcGFja2V0cyAqLworCWlmICghKHdtYS0+b2xfaW5pX2luZm8gJiAweDIpKSB7CisJCS8qIFNldHVwIGFsbCBOUyBwa3QgcGF0dGVybiAqLworCQlyZXQgPSB3bWFfc2VuZF93b3dfcGF0dGVybnNfdG9fZncod21hLCB2ZGV2X2lkLCAwLAorCQkJCW5zX3B0cm4sIHNpemVvZihhcnBfcHRybiksIGFycF9vZmZzZXQsCisJCQkJYXJwX21hc2ssIHNpemVvZihhcnBfbWFzayksIGZhbHNlKTsKKwkJaWYgKHJldCAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCVdNQV9MT0dFKCJGYWlsZWQgdG8gYWRkIFdPVyBOUyBwYXR0ZXJuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfcmVnaXN0ZXJfd293X2RlZmF1bHRfcGF0dGVybnMoKSAtIHJlZ2lzdGVyIGRlZmF1bHQgd293IHBhdHRlcm5zIHdpdGggZncKKyAqIEBoYW5kbGU6IFBvaW50ZXIgdG8gd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBXb1cgZGVmYXVsdCB3YWtlIHVwIHBhdHRlcm4gcnVsZSBpczoKKyAqICAtIEZvciBTVEEgJiBQMlAgQ0xJIG1vZGUgcmVnaXN0ZXIgZm9yIHNhbWUgU1RBIHNwZWNpZmljIHdvdyBwYXR0ZXJucworICogIC0gRm9yIFNBUC9QMlAgR08gJiBJQlNTIG1vZGUgcmVnaXN0ZXIgZm9yIHNhbWUgU0FQIHNwZWNpZmljIHdvdyBwYXR0ZXJucworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9yZWdpc3Rlcl93b3dfZGVmYXVsdF9wYXR0ZXJucyhXTUFfSEFORExFIGhhbmRsZSwgdWludDhfdCB2ZGV2X2lkKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gaGFuZGxlOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZTsKKworCWlmICh2ZGV2X2lkID4gd21hLT5tYXhfYnNzaWQpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgdmRldiBpZCAlZCIsIHZkZXZfaWQpOworCQlyZXR1cm47CisJfQorCWlmYWNlID0gJndtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXTsKKworCWlmIChpZmFjZS0+cHRybl9tYXRjaF9lbmFibGUpIHsKKwkJaWYgKHdtYV9pc192ZGV2X2luX2FwX21vZGUod21hLCB2ZGV2X2lkKQorI2lmZGVmIFFDQV9JQlNTX1NVUFBPUlQKKwkJCXx8CisJCQl3bWFfaXNfdmRldl9pbl9pYnNzX21vZGUod21hLCB2ZGV2X2lkKQorI2VuZGlmCisJCQkpIHsKKwkJCS8qIENvbmZpZ3VyZSBTQVAvR08vSUJTUyBtb2RlIGRlZmF1bHQgd293IHBhdHRlcm5zICovCisJCQlXTUFfTE9HSSgiQ29uZmlnIFNBUCBzcGVjaWZpYyBkZWZhdWx0IHdvdyBwYXR0ZXJucyB2ZGV2X2lkICVkIiwKKwkJCQkgdmRldl9pZCk7CisJCQl3bWFfd293X2FwKHdtYSwgdmRldl9pZCk7CisJCX0gZWxzZSB7CisJCQkvKiBDb25maWd1cmUgU1RBL1AyUCBDTEkgbW9kZSBkZWZhdWx0IHdvdyBwYXR0ZXJucyAqLworCQkJV01BX0xPR0koIkNvbmZpZyBTVEEgc3BlY2lmaWMgZGVmYXVsdCB3b3cgcGF0dGVybnMgdmRldl9pZCAlZCIsCisJCQkJdmRldl9pZCk7CisJCQl3bWFfd293X3N0YSh3bWEsIHZkZXZfaWQpOworCQkJaWYgKHdtYS0+SXNSQXJhdGVMaW1pdEVuYWJsZWQpIHsKKwkJCQlXTUFfTE9HSSgiQ29uZmlnIFNUQSBSQSBsaW1pdCB3b3cgcGF0dGVybnMgdmRldl9pZCAlZCIsCisJCQkJCXZkZXZfaWQpOworCQkJCXdtYV93b3dfc3RhX3JhX2ZpbHRlcih3bWEsIHZkZXZfaWQpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIHdtYV9yZWdpc3Rlcl93b3dfd2FrZXVwX2V2ZW50cygpIC0gcmVnaXN0ZXIgdmRldiBzcGVjaWZpYyB3YWtlIGV2ZW50cyB3aXRoIGZ3CisgKiBAaGFuZGxlOiBQb2ludGVyIHRvIHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IElkCisgKiBAdmRldl90eXBlOiB2ZGV2IHR5cGUKKyAqIEB2ZGV2X3N1YnR5cGU6IHZkZXYgc3ViIHR5cGUKKyAqCisgKiBXb1cgd2FrZSB1cCBldmVudCBydWxlIGlzIGZvbGxvd2luZzoKKyAqIDEpIFNUQSBtb2RlIGFuZCBQMlAgQ0xJIG1vZGUgd2FrZSB1cCBldmVudHMgYXJlIHNhbWUKKyAqIDIpIFNBUCBtb2RlIGFuZCBQMlAgR08gbW9kZSB3YWtlIHVwIGV2ZW50cyBhcmUgc2FtZQorICogMykgSUJTUyBtb2RlIHdha2UgZXZlbnRzIGFyZSBzYW1lIGFzIFNUQSBtb2RlIHBsdXMgV09XX0JFQUNPTl9FVkVOVAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9yZWdpc3Rlcl93b3dfd2FrZXVwX2V2ZW50cyhXTUFfSEFORExFIGhhbmRsZSwKKwkJCQl1aW50OF90IHZkZXZfaWQsCisJCQkJdWludDhfdCB2ZGV2X3R5cGUsCisJCQkJdWludDhfdCB2ZGV2X3N1YnR5cGUpCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSBoYW5kbGU7CisJdWludDMyX3QgZXZlbnRfYml0bWFwOworCisJV01BX0xPR0koInZkZXZfdHlwZSAlZCB2ZGV2X3N1YnR5cGUgJWQgdmRldl9pZCAlZCIsIHZkZXZfdHlwZSwKKwkJCXZkZXZfc3VidHlwZSwgdmRldl9pZCk7CisKKwlpZiAoKFdNSV9WREVWX1RZUEVfU1RBID09IHZkZXZfdHlwZSkgfHwKKwkJKChXTUlfVkRFVl9UWVBFX0FQID09IHZkZXZfdHlwZSkgJiYKKwkJIChXTUlfVU5JRklFRF9WREVWX1NVQlRZUEVfUDJQX0RFVklDRSA9PSB2ZGV2X3N1YnR5cGUpKSkgeworCQkvKiBDb25maWd1cmUgU1RBL1AyUCBDTEkgbW9kZSBzcGVjaWZpYyBkZWZhdWx0IHdha2UgdXAgZXZlbnRzICovCisJCWV2ZW50X2JpdG1hcCA9IFdNQV9XT1dfU1RBX1dBS0VfVVBfRVZFTlRTOworCQlXTUFfTE9HSSgiU1RBIHNwZWNpZmljIGRlZmF1bHQgd2FrZSB1cCBldmVudCAweCV4IHZkZXYgaWQgJWQiLAorCQkJZXZlbnRfYml0bWFwLCB2ZGV2X2lkKTsKKwl9IGVsc2UgaWYgKFdNSV9WREVWX1RZUEVfSUJTUyA9PSB2ZGV2X3R5cGUpIHsKKwkJLyogQ29uZmlndXJlIElCU1MgbW9kZSBzcGVjaWZpYyBkZWZhdWx0IHdha2UgdXAgZXZlbnRzICovCisJCWV2ZW50X2JpdG1hcCA9IChXTUFfV09XX1NUQV9XQUtFX1VQX0VWRU5UUyB8CisJCQkJKDEgPDwgV09XX0JFQUNPTl9FVkVOVCkpOworCQlXTUFfTE9HSSgiSUJTUyBzcGVjaWZpYyBkZWZhdWx0IHdha2UgdXAgZXZlbnQgMHgleCB2ZGV2IGlkICVkIiwKKwkJCWV2ZW50X2JpdG1hcCwgdmRldl9pZCk7CisJfSBlbHNlIGlmIChXTUlfVkRFVl9UWVBFX0FQID09IHZkZXZfdHlwZSkgeworCQkvKiBDb25maWd1cmUgU0FQL0dPIG1vZGUgc3BlY2lmaWMgZGVmYXVsdCB3YWtlIHVwIGV2ZW50cyAqLworCQlldmVudF9iaXRtYXAgPSBXTUFfV09XX1NBUF9XQUtFX1VQX0VWRU5UUzsKKwkJV01BX0xPR0koIlNBUCBzcGVjaWZpYyBkZWZhdWx0IHdha2UgdXAgZXZlbnQgMHgleCB2ZGV2IGlkICVkIiwKKwkJCWV2ZW50X2JpdG1hcCwgdmRldl9pZCk7CisJfSBlbHNlIHsKKwkJV01BX0xPR0UoInVua25vd24gdHlwZSAlZCBzdWJ0eXBlICVkIiwgdmRldl90eXBlLCB2ZGV2X3N1YnR5cGUpOworCQlyZXR1cm47CisJfQorCisJd21hX2FkZF93b3dfd2FrZXVwX2V2ZW50KHdtYSwgdmRldl9pZCwgZXZlbnRfYml0bWFwLCB0cnVlKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiB3bWFfZW5hYmxlX2Rpc2FibGVfd2FrZXVwX2V2ZW50KCkgLSAgQ29uZmlndXJlcyB3b3cgd2FrZXVwIGV2ZW50cworICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBiaXRtYXA6IEV2ZW50IGJpdG1hcAorICogQGVuYWJsZTogZW5hYmxlL2Rpc2FibGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfZW5hYmxlX2Rpc2FibGVfd2FrZXVwX2V2ZW50KFdNQV9IQU5ETEUgaGFuZGxlLAorCQkJCXVpbnQzMl90IHZkZXZfaWQsCisJCQkJdWludDMyX3QgYml0bWFwLAorCQkJCWJvb2wgZW5hYmxlKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gaGFuZGxlOworCisJV01BX0xPR0koInZkZXZfaWQgJWQgd2FrZSB1cCBldmVudCAweCV4IGVuYWJsZSAlZCIsCisJCXZkZXZfaWQsIGJpdG1hcCwgZW5hYmxlKTsKKwl3bWFfYWRkX3dvd193YWtldXBfZXZlbnQod21hLCB2ZGV2X2lkLCBiaXRtYXAsIGVuYWJsZSk7Cit9CisKKy8qKgorICogd21hX2VuYWJsZV93b3dfaW5fZncoKSAtIHduYWJsZSB3b3cgaW4gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfZW5hYmxlX3dvd19pbl9mdyhXTUFfSEFORExFIGhhbmRsZSkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9IGhhbmRsZTsKKwl3bWlfd293X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCWludDMyX3QgbGVuOworCWludCByZXQ7CisJc3RydWN0IG9sX3NvZnRjICpzY247CisJaW50IGhvc3RfY3JlZGl0czsKKwlpbnQgd21pX3BlbmRpbmdfY21kczsKKyNpZmRlZiBDT05GSUdfQ05TUworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCVdNQV9MT0dFKCIlczogVW5hYmxlIHRvIGdldCBQRSBjb250ZXh0IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorI2VuZGlmIC8qIENPTkZJR19DTlNTICovCisKKwlsZW4gPSBzaXplb2Yod21pX3dvd19lbmFibGVfY21kX2ZpeGVkX3BhcmFtKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIGFsbG9jYXRlIHdtaSBidWZmZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY21kID0gKHdtaV93b3dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfd293X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3dvd19lbmFibGVfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT5lbmFibGUgPSB0cnVlOworCWlmIChoaWZfY2FuX3N1c3BlbmRfbGluaygpKQorCQljbWQtPnBhdXNlX2lmYWNlX2NvbmZpZyA9IFdPV19JRkFDRV9QQVVTRV9FTkFCTEVEOworCWVsc2UKKwkJY21kLT5wYXVzZV9pZmFjZV9jb25maWcgPSBXT1dfSUZBQ0VfUEFVU0VfRElTQUJMRUQ7CisKKwlXTUFfTE9HSSgic3VzcGVuZCB0eXBlOiAlcyIsCisJCWNtZC0+cGF1c2VfaWZhY2VfY29uZmlnID09IFdPV19JRkFDRV9QQVVTRV9FTkFCTEVEID8KKwkJIldPV19JRkFDRV9QQVVTRV9FTkFCTEVEIiA6ICJXT1dfSUZBQ0VfUEFVU0VfRElTQUJMRUQiKTsKKworCWNkZl9ldmVudF9yZXNldCgmd21hLT50YXJnZXRfc3VzcGVuZCk7CisJd21hLT53b3dfbmFjayA9IDA7CisKKwlob3N0X2NyZWRpdHMgPSB3bWlfZ2V0X2hvc3RfY3JlZGl0cyh3bWEtPndtaV9oYW5kbGUpOworCXdtaV9wZW5kaW5nX2NtZHMgPSB3bWlfZ2V0X3BlbmRpbmdfY21kcyh3bWEtPndtaV9oYW5kbGUpOworCisJV01BX0xPR0QoIkNyZWRpdHM6JWQ7IFBlbmRpbmdfQ21kczogJWQiLAorCQkgaG9zdF9jcmVkaXRzLCB3bWlfcGVuZGluZ19jbWRzKTsKKworCWlmIChob3N0X2NyZWRpdHMgPCBXTUlfV09XX1JFUVVJUkVEX0NSRURJVFMpIHsKKwkJV01BX0xPR0UoIiVzOiBIb3N0IERvZXNuJ3QgaGF2ZSBlbm91Z2ggY3JlZGl0cyB0byBQb3N0IFdNSV9XT1dfRU5BQkxFX0NNRElEISAiCisJCQkiQ3JlZGl0czolZCwgcGVuZGluZ19jbWRzOiVkXG4iLCBfX2Z1bmNfXywgaG9zdF9jcmVkaXRzLAorCQkJd21pX3BlbmRpbmdfY21kcyk7CisjaWZuZGVmIFFDQV9XSUZJXzNfMF9FTVUKKwkJZ290byBlcnJvcjsKKyNlbmRpZgorCX0KKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX1dPV19FTkFCTEVfQ01ESUQpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBlbmFibGUgd293IGluIGZ3Iik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJd21pX3NldF90YXJnZXRfc3VzcGVuZCh3bWEtPndtaV9oYW5kbGUsIHRydWUpOworCisJaWYgKGNkZl93YWl0X3NpbmdsZV9ldmVudCgmd21hLT50YXJnZXRfc3VzcGVuZCwKKwkJCQkgIFdNQV9UR1RfU1VTUEVORF9DT01QTEVURV9USU1FT1VUKQorCSAgICAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byByZWNlaXZlIFdvVyBFbmFibGUgQWNrIGZyb20gRlciKTsKKwkJV01BX0xPR0UoIkNyZWRpdHM6JWQ7IFBlbmRpbmdfQ21kczogJWQiLAorCQkJIHdtaV9nZXRfaG9zdF9jcmVkaXRzKHdtYS0+d21pX2hhbmRsZSksCisJCQkgd21pX2dldF9wZW5kaW5nX2NtZHMod21hLT53bWlfaGFuZGxlKSk7CisjaWZkZWYgQ09ORklHX0NOU1MKKwkJaWYgKHBNYWMtPnNtZS5lbmFibGVTZWxmUmVjb3ZlcnkpIHsKKwkJCWNkc190cmlnZ2VyX3JlY292ZXJ5KCk7CisJCX0gZWxzZSB7CisJCQlDREZfQlVHKDApOworCQl9CisjZWxzZQorCQlDREZfQlVHKDApOworI2VuZGlmIC8qIENPTkZJR19DTlNTICovCisJCXdtaV9zZXRfdGFyZ2V0X3N1c3BlbmQod21hLT53bWlfaGFuZGxlLCBmYWxzZSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAod21hLT53b3dfbmFjaykgeworCQlXTUFfTE9HRSgiRlcgbm90IHJlYWR5IHRvIFdPVyIpOworCQl3bWlfc2V0X3RhcmdldF9zdXNwZW5kKHdtYS0+d21pX2hhbmRsZSwgZmFsc2UpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0FHQUlOOworCX0KKworCWhvc3RfY3JlZGl0cyA9IHdtaV9nZXRfaG9zdF9jcmVkaXRzKHdtYS0+d21pX2hhbmRsZSk7CisJd21pX3BlbmRpbmdfY21kcyA9IHdtaV9nZXRfcGVuZGluZ19jbWRzKHdtYS0+d21pX2hhbmRsZSk7CisKKwlpZiAoaG9zdF9jcmVkaXRzIDwgV01JX1dPV19SRVFVSVJFRF9DUkVESVRTKSB7CisJCVdNQV9MT0dFKCIlczogTm8gQ3JlZGl0cyBhZnRlciBIVEMgQUNLOiVkLCBwZW5kaW5nX2NtZHM6JWQsICIKKwkJCSAiY2Fubm90IHJlc3VtZSBiYWNrIiwgX19mdW5jX18sIGhvc3RfY3JlZGl0cywKKwkJCSB3bWlfcGVuZGluZ19jbWRzKTsKKwkJaHRjX2R1bXBfY291bnRlcl9pbmZvKHdtYS0+aHRjX2hhbmRsZSk7CisJCWlmICghY2RzX2lzX2xvZ3BfaW5fcHJvZ3Jlc3MoKSkKKwkJCUNERl9CVUcoMCk7CisJCWVsc2UKKwkJCVdNQV9MT0dFKCIlczogU1NSIGluIHByb2dyZXNzLCBpZ25vcmUgbm8gY3JlZGl0IGlzc3VlIiwKKwkJCQkgX19mdW5jX18pOworCX0KKworCVdNQV9MT0dEKCJXT1cgZW5hYmxlZCBzdWNjZXNzZnVsbHkgaW4gZnc6IGNyZWRpdHM6JWQiCisJCSAicGVuZGluZ19jbWRzOiAlZCIsIGhvc3RfY3JlZGl0cywgd21pX3BlbmRpbmdfY21kcyk7CisKKwlzY24gPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCisJaWYgKHNjbiA9PSBOVUxMKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCBISUYgY29udGV4dCIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQVVMVDsKKwl9CisKKwlodGNfY2FuY2VsX2RlZmVycmVkX3RhcmdldF9zbGVlcChzY24pOworCisJd21hLT53b3cud293X2VuYWJsZV9jbWRfc2VudCA9IHRydWU7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCitlcnJvcjoKKwl3bWlfYnVmX2ZyZWUoYnVmKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKy8qKgorICogd21hX3Jlc3VtZV9yZXEoKSAtIGNsZWFyIGNvbmZpZ3VyZWQgd293IHBhdHRlcm5zIGluIGZ3CisgKiBAd21hOiB3bWEgaGFuZGxlCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3Jlc3VtZV9yZXEodHBfd21hX2hhbmRsZSB3bWEpCit7CisJd21hLT5ub19vZl9yZXN1bWVfaW5kKys7CisKKwlpZiAod21hLT5ub19vZl9yZXN1bWVfaW5kIDwgd21hX2dldF92ZGV2X2NvdW50KHdtYSkpCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwl3bWEtPm5vX29mX3Jlc3VtZV9pbmQgPSAwOworCisJLyogUmVzZXQgdGhlIERUSU0gUGFyYW1ldGVycyAqLworCXdtYV9zZXRfcmVzdW1lX2R0aW0od21hKTsKKwkvKiBuZWVkIHRvIHJlc2V0IGlmIGhpZl9wY2lfc3VzcGVuZF9mYWlscyAqLworCXdtYV9zZXRfd293X2J1c19zdXNwZW5kKHdtYSwgMCk7CisJLyogdW5wYXVzZSB0aGUgdmRldiBpZiBsZWZ0IHBhdXNlZCBhbmQgaGlmX3BjaV9zdXNwZW5kIGZhaWxzICovCisJd21hX3VucGF1c2VfdmRldih3bWEpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfd293X2RlbGV0ZV9wYXR0ZXJuKCkgLSBkZWxldGUgd293IHBhdHRlcm4gaW4gdGFyZ2V0CisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcHRybl9pZDogcGF0dGVybiBpZAorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEB1c2VyOiB0cnVlIGZvciB1c2VyIHBhdHRlcm4gYW5kIGZhbHNlIGZvciBkZWZhdWx0IHBhdHRlcm4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworc3RhdGljIENERl9TVEFUVVMgd21hX3dvd19kZWxldGVfcGF0dGVybih0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCBwdHJuX2lkLAorCQkJCQl1aW50OF90IHZkZXZfaWQsIGJvb2wgdXNlcikKK3sKKwlXTUlfV09XX0RFTF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSAqY21kOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZTsKKwl3bWlfYnVmX3QgYnVmOworCWludDMyX3QgbGVuOworCWludCByZXQ7CisKKwlsZW4gPSBzaXplb2YoV01JX1dPV19ERUxfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0pOworCisJaWZhY2UgPSAmd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2NhdGUgd21pIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljbWQgPSAoV01JX1dPV19ERUxfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ19XTUlfV09XX0RFTF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTigKKwkJCQlXTUlfV09XX0RFTF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJY21kLT5wYXR0ZXJuX2lkID0gcHRybl9pZDsKKwljbWQtPnBhdHRlcm5fdHlwZSA9IFdPV19CSVRNQVBfUEFUVEVSTjsKKworCVdNQV9MT0dJKCJEZWxldGluZyBwYXR0ZXJuIGlkOiAlZCB2ZGV2IGlkICVkIGluIGZ3IiwKKwkJY21kLT5wYXR0ZXJuX2lkLCB2ZGV2X2lkKTsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX1dPV19ERUxfV0FLRV9QQVRURVJOX0NNRElEKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGRlbGV0ZSB3b3cgcHRybiBmcm9tIGZ3IiwgX19mdW5jX18pOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmICh1c2VyKQorCQlpZmFjZS0+bnVtX3dvd191c2VyX3BhdHRlcm5zLS07CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV93b3dfYWRkX3BhdHRlcm4oKSAtIGFkZCB3b3cgcGF0dGVybiBpbiB0YXJnZXQKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwdHJuOiB3b3cgcGF0dGVybgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBmb2xsb3dpbmc6CisgKiAxKSBEZWxldGUgYWxsIGRlZmF1bHQgcGF0dGVybnMgb2YgdGhlIHZkZXYKKyAqIDIpIEFkZCByZWNlaXZlZCB3b3cgcGF0dGVybnMgZm9yIGdpdmVuIHZkZXYgaW4gdGFyZ2V0LgorICoKKyAqIFRhcmdldCBpcyByZXNwb25zaWJsZSBmb3IgY2FjaGluZyB3b3cgcGF0dGVybnMgYWNjcm9zcyBtdWx0aXBsZQorICogc3VzcGVuZC9yZXN1bWVzIHVudGlsIHRoZSBwYXR0ZXJuIGlzIGRlbGV0ZWQgYnkgdXNlcgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV93b3dfYWRkX3BhdHRlcm4odHBfd21hX2hhbmRsZSB3bWEsIHN0cnVjdCB3b3dfYWRkX3BhdHRlcm4gKnB0cm4pCit7CisJdWludDhfdCBpZDsKKwl1aW50OF90IGJpdF90b19jaGVjaywgcG9zOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZTsKKwlDREZfU1RBVFVTIHJldCA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl1aW50OF90IG5ld19tYXNrW1NJUl9XT1dMX0JDQVNUX1BBVFRFUk5fTUFYX1NJWkVdOworCisJaWYgKHB0cm4tPnNlc3Npb25faWQgPiB3bWEtPm1heF9ic3NpZCkgeworCQlXTUFfTE9HRSgiSW52YWxpZCB2ZGV2IGlkICglZCkiLCBwdHJuLT5zZXNzaW9uX2lkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwlpZmFjZSA9ICZ3bWEtPmludGVyZmFjZXNbcHRybi0+c2Vzc2lvbl9pZF07CisKKwkvKiBjbGVhciBhbGwgZGVmYXVsdCBwYXR0ZXJucyBjb2ZpZ3VyZWQgYnkgd21hICovCisJZm9yIChpZCA9IDA7IGlkIDwgaWZhY2UtPm51bV93b3dfZGVmYXVsdF9wYXR0ZXJuczsgaWQrKykKKwkJd21hX3dvd19kZWxldGVfcGF0dGVybih3bWEsIGlkLCBwdHJuLT5zZXNzaW9uX2lkLCBmYWxzZSk7CisKKwlpZmFjZS0+bnVtX3dvd19kZWZhdWx0X3BhdHRlcm5zID0gMDsKKworCVdNQV9MT0dJKCJBZGQgdXNlciBwYXNzZWQgd293IHBhdHRlcm4gaWQgJWQgdmRldiBpZCAlZCIsCisJCXB0cm4tPnBhdHRlcm5faWQsIHB0cm4tPnNlc3Npb25faWQpOworCS8qCisJICogQ29udmVydCByZWNlaXZlZCBwYXR0ZXJuIG1hc2sgdmFsdWUgZnJvbSBiaXQgcmVwcmVzZW50YXRpb24KKwkgKiB0byBieXRlIHJlcHJlc2VudGF0aW9uLgorCSAqCisJICogRm9yIGV4YW1wbGUsIHJlY2VpdmVkIHZhbHVlIGZyb20gdW1hYywKKwkgKgorCSAqICAgICAgTWFzayB2YWx1ZSAgICA6IEExIChlcXVpdmFsZW50IGJpbmFyeSBpcyAiMTAxMCAwMDAxIikKKwkgKiAgICAgIFBhdHRlcm4gdmFsdWUgOiAxMjowMDoxMzowMDowMDowMDowMDo0NAorCSAqCisJICogVGhlIHZhbHVlIHdoaWNoIGdvZXMgdG8gRlcgYWZ0ZXIgdGhlIGNvbnZlcnNpb24gZnJvbSB0aGlzCisJICogZnVuY3Rpb24gKDEgaW4gbWFzayB2YWx1ZSB3aWxsIGJlY29tZSBGRiBhbmQgMCB3aWxsCisJICogYmVjb21lIDAwKSwKKwkgKgorCSAqICAgICAgTWFzayB2YWx1ZSAgICA6IEZGOjAwOkZGOjAwOjA6MDA6MDA6RkYKKwkgKiAgICAgIFBhdHRlcm4gdmFsdWUgOiAxMjowMDoxMzowMDowMDowMDowMDo0NAorCSAqLworCWNkZl9tZW1femVybyhuZXdfbWFzaywgc2l6ZW9mKG5ld19tYXNrKSk7CisJZm9yIChwb3MgPSAwOyBwb3MgPCBwdHJuLT5wYXR0ZXJuX3NpemU7IHBvcysrKSB7CisJCWJpdF90b19jaGVjayA9IChXTUFfTlVNX0JJVFNfSU5fQllURSAtIDEpIC0KKwkJCSAgICAgICAocG9zICUgV01BX05VTV9CSVRTX0lOX0JZVEUpOworCQliaXRfdG9fY2hlY2sgPSAweDEgPDwgYml0X3RvX2NoZWNrOworCQlpZiAocHRybi0+cGF0dGVybl9tYXNrW3BvcyAvIFdNQV9OVU1fQklUU19JTl9CWVRFXSAmCisJCQkJCQkJYml0X3RvX2NoZWNrKQorCQkJbmV3X21hc2tbcG9zXSA9IFdNQV9XT1dfUFRSTl9NQVNLX1ZBTElEOworCX0KKworCXJldCA9IHdtYV9zZW5kX3dvd19wYXR0ZXJuc190b19mdyh3bWEsIHB0cm4tPnNlc3Npb25faWQsCisJCQlwdHJuLT5wYXR0ZXJuX2lkLAorCQkJcHRybi0+cGF0dGVybiwgcHRybi0+cGF0dGVybl9zaXplLAorCQkJcHRybi0+cGF0dGVybl9ieXRlX29mZnNldCwgbmV3X21hc2ssCisJCQlwdHJuLT5wYXR0ZXJuX3NpemUsIHRydWUpOworCWlmIChyZXQgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGFkZCB3b3cgcGF0dGVybiAlZCIsIHB0cm4tPnBhdHRlcm5faWQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfd293X2RlbGV0ZV91c2VyX3BhdHRlcm4oKSAtIGRlbGV0ZSB1c2VyIGNvbmZpZ3VyZWQgd293IHBhdHRlcm4gaW4gdGFyZ2V0CisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcHRybjogd293IHBhdHRlcm4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgZm9sbG93aW5nOgorICogMSkgRGVsZXRlcyBhIHBhcnRpY3VsYXIgdXNlciBjb25maWd1cmVkIHdvdyBwYXR0ZXJuIGluIHRhcmdldAorICogMikgQWZ0ZXIgZGVsZXRpbmcgYWxsIHVzZXIgd293IHBhdHRlcm5zIGFkZCBkZWZhdWx0IHdvdyBwYXR0ZXJucworICogICAgc3BlY2lmaWMgdG8gdGhhdCB2ZGV2LgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV93b3dfZGVsZXRlX3VzZXJfcGF0dGVybih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJc3RydWN0IHdvd19kZWxldGVfcGF0dGVybiAqcGF0dGVybikKK3sKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaWZhY2U7CisKKwlpZiAocGF0dGVybi0+c2Vzc2lvbl9pZCA+IHdtYS0+bWF4X2Jzc2lkKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIHZkZXYgaWQgJWQiLCBwYXR0ZXJuLT5zZXNzaW9uX2lkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwlpZmFjZSA9ICZ3bWEtPmludGVyZmFjZXNbcGF0dGVybi0+c2Vzc2lvbl9pZF07CisJaWYgKGlmYWNlLT5udW1fd293X3VzZXJfcGF0dGVybnMgPD0gMCkgeworCQlXTUFfTE9HRSgiTm8gdmFsaWQgdXNlciBwYXR0ZXJuLiBOdW0gdXNlciBwYXR0ZXJuICV1IHZkZXYgJWQiLAorCQkJaWZhY2UtPm51bV93b3dfdXNlcl9wYXR0ZXJucywgcGF0dGVybi0+c2Vzc2lvbl9pZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJV01BX0xPR0koIkRlbGV0ZSB1c2VyIHBhc3NlZCB3b3cgcGF0dGVybiBpZCAlZCB0b3RhbCB1c2VyIHBhdHRlcm4gJWQiLAorCQlwYXR0ZXJuLT5wYXR0ZXJuX2lkLCBpZmFjZS0+bnVtX3dvd191c2VyX3BhdHRlcm5zKTsKKworCXdtYV93b3dfZGVsZXRlX3BhdHRlcm4od21hLCBwYXR0ZXJuLT5wYXR0ZXJuX2lkLAorCQkJCXBhdHRlcm4tPnNlc3Npb25faWQsIHRydWUpOworCisJLyogY29uZmlndXJlIGRlZmF1bHQgcGF0dGVybnMgb25jZSBhbGwgdXNlciBwYXR0ZXJucyBhcmUgZGVsZXRlZCAqLworCWlmICghaWZhY2UtPm51bV93b3dfdXNlcl9wYXR0ZXJucykKKwkJd21hX3JlZ2lzdGVyX3dvd19kZWZhdWx0X3BhdHRlcm5zKHdtYSwgcGF0dGVybi0+c2Vzc2lvbl9pZCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV93b3dfZW50ZXIoKSAtIHN0b3JlIGVuYWJsZS9kaXNhYmxlIHN0YXR1cyBmb3IgcGF0dGVybgorICogQHdtYTogd21hIGhhbmRsZQorICogQGluZm86IHdvdyBwYXJhbWV0ZXJzCisgKgorICogUmVjb3JkcyBwYXR0ZXJuIGVuYWJsZS9kaXNhYmxlIHN0YXR1cyBsb2NhbGx5LiBUaGlzIGNob2ljZSB3aWxsCisgKiB0YWtlIGVmZmVjdCB3aGVuIHRoZSBkcml2ZXIgZW50ZXIgaW50byBzdXNwZW5kIHN0YXRlLgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV93b3dfZW50ZXIodHBfd21hX2hhbmRsZSB3bWEsIHRwU2lySGFsV293bEVudGVyUGFyYW1zIGluZm8pCit7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlOworCisJV01BX0xPR0QoIndvdyBlbmFibGUgcmVxIHJlY2VpdmVkIGZvciB2ZGV2IGlkOiAlZCIsIGluZm8tPnNlc3Npb25JZCk7CisKKwlpZiAoaW5mby0+c2Vzc2lvbklkID4gd21hLT5tYXhfYnNzaWQpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgdmRldiBpZCAoJWQpIiwgaW5mby0+c2Vzc2lvbklkKTsKKwkJY2RmX21lbV9mcmVlKGluZm8pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWlmYWNlID0gJndtYS0+aW50ZXJmYWNlc1tpbmZvLT5zZXNzaW9uSWRdOworCWlmYWNlLT5wdHJuX21hdGNoX2VuYWJsZSA9IGluZm8tPnVjUGF0dGVybkZpbHRlcmluZ0VuYWJsZSA/CisJCQkJICAgdHJ1ZSA6IGZhbHNlOworCXdtYS0+d293Lm1hZ2ljX3B0cm5fZW5hYmxlID0gaW5mby0+dWNNYWdpY1BrdEVuYWJsZSA/IHRydWUgOiBmYWxzZTsKKwl3bWEtPndvdy5kZWF1dGhfZW5hYmxlID0gaW5mby0+dWNXb3dEZWF1dGhSY3YgPyB0cnVlIDogZmFsc2U7CisJd21hLT53b3cuZGlzYXNzb2NfZW5hYmxlID0gaW5mby0+dWNXb3dEZWF1dGhSY3YgPyB0cnVlIDogZmFsc2U7CisJd21hLT53b3cuYm1pc3NfZW5hYmxlID0gaW5mby0+dWNXb3dNYXhNaXNzZWRCZWFjb25zID8gdHJ1ZSA6IGZhbHNlOworCisJY2RmX21lbV9mcmVlKGluZm8pOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfd293X2V4aXQoKSAtIGNsZWFyIGFsbCB3bWEgc3RhdGVzCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAaW5mbzogd293IHBhcmFtcworICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV93b3dfZXhpdCh0cF93bWFfaGFuZGxlIHdtYSwgdHBTaXJIYWxXb3dsRXhpdFBhcmFtcyBpbmZvKQoreworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZTsKKworCVdNQV9MT0dEKCJ3b3cgZGlzYWJsZSByZXEgcmVjZWl2ZWQgZm9yIHZkZXYgaWQ6ICVkIiwgaW5mby0+c2Vzc2lvbklkKTsKKworCWlmIChpbmZvLT5zZXNzaW9uSWQgPiB3bWEtPm1heF9ic3NpZCkgeworCQlXTUFfTE9HRSgiSW52YWxpZCB2ZGV2IGlkICglZCkiLCBpbmZvLT5zZXNzaW9uSWQpOworCQljZGZfbWVtX2ZyZWUoaW5mbyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJaWZhY2UgPSAmd21hLT5pbnRlcmZhY2VzW2luZm8tPnNlc3Npb25JZF07CisJaWZhY2UtPnB0cm5fbWF0Y2hfZW5hYmxlID0gZmFsc2U7CisJd21hLT53b3cubWFnaWNfcHRybl9lbmFibGUgPSBmYWxzZTsKKwljZGZfbWVtX2ZyZWUoaW5mbyk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9zdXNwZW5kX3JlcSgpIC0gIEhhbmRsZXMgc3VzcGVuZCBpbmRpY2F0aW9uIHJlcXVlc3QgcmVjZWl2ZWQgZnJvbSB1bWFjLgorICogQHdtYTogd21hIGhhbmRsZQorICogQGluZm86IHN1c3BlbmQgcGFyYW1zCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3N1c3BlbmRfcmVxKHRwX3dtYV9oYW5kbGUgd21hLCB0cFNpcldsYW5TdXNwZW5kUGFyYW0gaW5mbykKK3sKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaWZhY2U7CisJYm9vbCBjb25uZWN0ZWQgPSBmYWxzZSwgcG5vX2luX3Byb2dyZXNzID0gZmFsc2U7CisJdWludDhfdCBpOworCWJvb2wgZXh0c2Nhbl9pbl9wcm9ncmVzcyA9IGZhbHNlOworCisJd21hLT5ub19vZl9zdXNwZW5kX2luZCsrOworCisJaWYgKGluZm8tPnNlc3Npb25JZCA+IHdtYS0+bWF4X2Jzc2lkKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIHZkZXYgaWQgKCVkKSIsIGluZm8tPnNlc3Npb25JZCk7CisJCWNkZl9tZW1fZnJlZShpbmZvKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwlpZmFjZSA9ICZ3bWEtPmludGVyZmFjZXNbaW5mby0+c2Vzc2lvbklkXTsKKwlpZiAoIWlmYWNlKSB7CisJCVdNQV9MT0dEKCJ2ZGV2ICVkIG5vZGUgaXMgbm90IGZvdW5kIiwgaW5mby0+c2Vzc2lvbklkKTsKKwkJY2RmX21lbV9mcmVlKGluZm8pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCWlmICghd21hLT53b3cubWFnaWNfcHRybl9lbmFibGUgJiYgIWlmYWNlLT5wdHJuX21hdGNoX2VuYWJsZSkgeworCQljZGZfbWVtX2ZyZWUoaW5mbyk7CisKKwkJaWYgKHdtYS0+bm9fb2Zfc3VzcGVuZF9pbmQgPT0gd21hX2dldF92ZGV2X2NvdW50KHdtYSkpIHsKKwkJCVdNQV9MT0dEKCJCb3RoIG1hZ2ljIGFuZCBwYXR0ZXJuIGJ5dGUgbWF0Y2ggYXJlIGRpc2FibGVkIik7CisJCQl3bWEtPm5vX29mX3N1c3BlbmRfaW5kID0gMDsKKwkJCWdvdG8gc2VuZF9yZWFkeV90b19zdXNwZW5kOworCQl9CisKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlpZmFjZS0+Y29ubl9zdGF0ZSA9IChpbmZvLT5jb25uZWN0ZWRTdGF0ZSkgPyB0cnVlIDogZmFsc2U7CisKKwkvKgorCSAqIE9uY2UgV09XIGlzIGVuYWJsZWQgaW4gRlcsIGhvc3QgY2FuJ3Qgc2VuZCBhbnltb3JlCisJICogZGF0YSB0byBmdy4gdW1hYyBzZW5kcyBzdXNwZW5kIGluZGljYXRpb24gb24gZWFjaAorCSAqIHZkZXYgZHVyaW5nIHBsYXRmb3JtIHN1c3BlbmQuIFdNQSBoYXMgdG8gd2FpdCB1bnRpbAorCSAqIHN1c3BlbmQgaW5kaWNhdGlvbiByZWNlaXZlZCBvbiBsYXN0IHZkZXYgYmVmb3JlCisJICogZW5hYmxpbmcgd293IGluIGZ3LgorCSAqLworCWlmICh3bWEtPm5vX29mX3N1c3BlbmRfaW5kIDwgd21hX2dldF92ZGV2X2NvdW50KHdtYSkpIHsKKwkJY2RmX21lbV9mcmVlKGluZm8pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCXdtYS0+bm9fb2Zfc3VzcGVuZF9pbmQgPSAwOworCXdtYS0+d293Lmd0a19wZGV2X2VuYWJsZSA9IDA7CisJLyoKKwkgKiBFbmFibGUgV09XIGlmIGFueSBvbmUgb2YgdGhlIGNvbmRpdGlvbiBtZWV0cywKKwkgKiAgMSkgSXMgYW55IG9uZSBvZiB2ZGV2IGluIGJlYWNvbm5pbmcgbW9kZSAoaW4gQVAgbW9kZSkgPworCSAqICAyKSBJcyBhbnkgb25lIG9mIHZkZXYgaW4gY29ubmVjdGVkIHN0YXRlIChpbiBTVEEgbW9kZSkgPworCSAqICAzKSBJcyBQTk8gaW4gcHJvZ3Jlc3MgaW4gYW55IG9uZSBvZiB2ZGV2ID8KKwkgKiAgNCkgSXMgRXh0c2NhbiBpbiBwcm9ncmVzcyBpbiBhbnkgb25lIG9mIHZkZXYgPworCSAqLworCWZvciAoaSA9IDA7IGkgPCB3bWEtPm1heF9ic3NpZDsgaSsrKSB7CisJCWlmICgod21hX2lzX3ZkZXZfaW5fYXBfbW9kZSh3bWEsIGkpCisjaWZkZWYgUUNBX0lCU1NfU1VQUE9SVAorCQkgICAgIHx8IHdtYV9pc192ZGV2X2luX2lic3NfbW9kZSh3bWEsIGkpCisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworCQkgICAgICkgJiYgd21hLT5pbnRlcmZhY2VzW2ldLnZkZXZfdXAgJiYKKwkJICAgIFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod21hLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJCSAgIFdNSV9TRVJWSUNFX0JFQUNPTl9PRkZMT0FEKSkgeworCQkJV01BX0xPR0QoInZkZXYgJWQgaXMgaW4gYmVhY29ubmluZyBtb2RlLCBlbmFibGluZyB3b3ciLAorCQkJCSBpKTsKKwkJCWdvdG8gZW5hYmxlX3dvdzsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgd21hLT5tYXhfYnNzaWQ7IGkrKykgeworCQlpZiAod21hLT5pbnRlcmZhY2VzW2ldLmNvbm5fc3RhdGUpIHsKKwkJCWNvbm5lY3RlZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCQlpZiAod21hLT5pbnRlcmZhY2VzW2ldLnBub19pbl9wcm9ncmVzcykgeworCQkJV01BX0xPR0QoIlBOTyBpcyBpbiBwcm9ncmVzcywgZW5hYmxpbmcgd293Iik7CisJCQlwbm9faW5fcHJvZ3Jlc3MgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCQlpZiAod21hLT5pbnRlcmZhY2VzW2ldLmV4dHNjYW5faW5fcHJvZ3Jlc3MpIHsKKwkJCVdNQV9MT0dEKCJFeHRzY2FuIGlzIGluIHByb2dyZXNzLCBlbmFibGluZyB3b3ciKTsKKwkJCWV4dHNjYW5faW5fcHJvZ3Jlc3MgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCX0KKwlmb3IgKGkgPSAwOyBpIDwgd21hLT5tYXhfYnNzaWQ7IGkrKykgeworCQl3bWEtPndvdy5ndGtfcGRldl9lbmFibGUgfD0gd21hLT53b3cuZ3RrX2Vycl9lbmFibGVbaV07CisJCVdNQV9MT0dEKCJWREVWX0lEOiVkLCBndGtfZXJyX2VuYWJsZVslZF06JWQsIGd0a19wZGV2X2VuYWJsZTolZCIsIGksCisJCQlpLCB3bWEtPndvdy5ndGtfZXJyX2VuYWJsZVtpXSwgd21hLT53b3cuZ3RrX3BkZXZfZW5hYmxlKTsKKwl9CisKKwlpZiAoIWNvbm5lY3RlZCAmJiAhcG5vX2luX3Byb2dyZXNzICYmICFleHRzY2FuX2luX3Byb2dyZXNzKSB7CisJCVdNQV9MT0dEKCJBbGwgdmRldiBhcmUgaW4gZGlzY29ubmVjdGVkIHN0YXRlIGFuZCBwbm8vZXh0c2NhbiBpcyBub3QgaW4gcHJvZ3Jlc3MsIHNraXBwaW5nIHdvdyIpOworCQljZGZfbWVtX2ZyZWUoaW5mbyk7CisJCWdvdG8gc2VuZF9yZWFkeV90b19zdXNwZW5kOworCX0KKworZW5hYmxlX3dvdzoKKwlXTUFfTE9HRSgiV09XIFN1c3BlbmQiKTsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgc3VzcGVuZCBpbmRpY2F0aW9uIGlzIHJlY2VpdmVkIG9uCisJICogbGFzdCB2ZGV2LiBJdCdzIHRoZSB0aW1lIHRvIGVuYWJsZSB3b3cgaW4gZncuCisJICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0xQSEIKKwkvKiBMUEhCIGNhY2hlLCBpZiBhbnkgaXRlbSB3YXMgZW5hYmxlZCwgc2hvdWxkIGJlCisJICogYXBwbGllZC4KKwkgKi8KKwlXTUFfTE9HRCgiJXM6IGNoZWNraW5nIExQSEIgY2FjaGUiLCBfX2Z1bmNfXyk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAod21hLT53b3cubHBoYl9jYWNoZVtpXS5wYXJhbXMubHBoYkVuYWJsZVJlcS5lbmFibGUpIHsKKwkJCVdNQV9MT0dEKCIlczogTFBIQiBjYWNoZSBmb3IgaXRlbSAlZCBpcyBtYXJrZWQgYXMgZW5hYmxlIiwKKwkJCQlfX2Z1bmNfXywgaSArIDEpOworCQkJd21hX2xwaGJfY29uZl9oYmVuYWJsZSh3bWEsICYod21hLT53b3cubHBoYl9jYWNoZVtpXSksCisJCQkJCSAgICAgICBmYWxzZSk7CisJCX0KKwl9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0xQSEIgKi8KKworCXdtYS0+d293Lndvd19lbmFibGUgPSB0cnVlOworCXdtYS0+d293Lndvd19lbmFibGVfY21kX3NlbnQgPSBmYWxzZTsKKworCWNkZl9tZW1fZnJlZShpbmZvKTsKKworc2VuZF9yZWFkeV90b19zdXNwZW5kOgorCS8qIFNldCB0aGUgU3VzcGVuZCBEVElNIFBhcmFtZXRlcnMgKi8KKwl3bWFfc2V0X3N1c3BlbmRfZHRpbSh3bWEpOworCXdtYV9zZW5kX3N0YXR1c190b19zdXNwZW5kX2luZCh3bWEsIHRydWUpOworCisJLyogdG8gaGFuZGxlIHJhY2UgYmV0d2VlbiBoaWZfcGNpX3N1c3BlbmQgYW5kCisJICogdW5wYXVzZS9wYXVzZSB0eCBoYW5kbGVyCisJICovCisJd21hX3NldF93b3dfYnVzX3N1c3BlbmQod21hLCAxKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3NlbmRfaG9zdF93YWtldXBfaW5kX3RvX2Z3KCkgLSBzZW5kIHdha2V1cCBpbmQgdG8gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqCisgKiBTZW5kcyBob3N0IHdha2V1cCBpbmRpY2F0aW9uIHRvIEZXLiBPbiByZWNlaXZpbmcgdGhpcyBpbmRpY2F0aW9uLAorICogRlcgd2lsbCBjb21lIG91dCBvZiBXT1cuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdtYV9zZW5kX2hvc3Rfd2FrZXVwX2luZF90b19mdyh0cF93bWFfaGFuZGxlIHdtYSkKK3sKKwl3bWlfd293X2hvc3R3YWtldXBfZnJvbV9zbGVlcF9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwlpbnQzMl90IGxlbjsKKwlpbnQgcmV0OworI2lmZGVmIENPTkZJR19DTlNTCisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCVdNQV9MT0dFKCIlczogVW5hYmxlIHRvIGdldCBQRSBjb250ZXh0IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorI2VuZGlmIC8qIENPTkZJR19DTlNTICovCisKKwlsZW4gPSBzaXplb2Yod21pX3dvd19ob3N0d2FrZXVwX2Zyb21fc2xlZXBfY21kX2ZpeGVkX3BhcmFtKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIGFsbG9jYXRlIHdtaSBidWZmZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY21kID0gKHdtaV93b3dfaG9zdHdha2V1cF9mcm9tX3NsZWVwX2NtZF9maXhlZF9wYXJhbSAqKQorCSAgICAgIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV93b3dfaG9zdHdha2V1cF9mcm9tX3NsZWVwX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfd293X2hvc3R3YWtldXBfZnJvbV9zbGVlcF9jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNkZl9ldmVudF9yZXNldCgmd21hLT53bWFfcmVzdW1lX2V2ZW50KTsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX1dPV19IT1NUV0FLRVVQX0ZST01fU0xFRVBfQ01ESUQpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIGhvc3Qgd2FrZXVwIGluZGljYXRpb24gdG8gZnciKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlXTUFfTE9HRCgiSG9zdCB3YWtldXAgaW5kaWNhdGlvbiBzZW50IHRvIGZ3Iik7CisKKwljZGZfc3RhdHVzID0gY2RmX3dhaXRfc2luZ2xlX2V2ZW50KCYod21hLT53bWFfcmVzdW1lX2V2ZW50KSwKKwkJCQkJICAgV01BX1JFU1VNRV9USU1FT1VUKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJV01BX0xPR1AoIiVzOiBUaW1lb3V0IHdhaXRpbmcgZm9yIHJlc3VtZSBldmVudCBmcm9tIEZXIiwKKwkJCSBfX2Z1bmNfXyk7CisJCVdNQV9MT0dQKCIlczogUGVuZGluZyBjb21tYW5kcyAlZCBjcmVkaXRzICVkIiwgX19mdW5jX18sCisJCQkgd21pX2dldF9wZW5kaW5nX2NtZHMod21hLT53bWlfaGFuZGxlKSwKKwkJCSB3bWlfZ2V0X2hvc3RfY3JlZGl0cyh3bWEtPndtaV9oYW5kbGUpKTsKKwkJaWYgKCFjZHNfaXNfbG9ncF9pbl9wcm9ncmVzcygpKSB7CisjaWZkZWYgQ09ORklHX0NOU1MKKwkJCWlmIChwTWFjLT5zbWUuZW5hYmxlU2VsZlJlY292ZXJ5KSB7CisJCQkJY2RzX3RyaWdnZXJfcmVjb3ZlcnkoKTsKKwkJCX0gZWxzZSB7CisJCQkJQ0RGX0JVRygwKTsKKwkJCX0KKyNlbHNlCisJCQlDREZfQlVHKDApOworI2VuZGlmIC8qIENPTkZJR19DTlNTICovCisJCX0gZWxzZSB7CisJCQlXTUFfTE9HRSgiJXM6IFNTUiBpbiBwcm9ncmVzcywgaWdub3JlIHJlc3VtZSB0aW1lb3V0IiwKKwkJCQkgX19mdW5jX18pOworCQl9CisJfSBlbHNlIHsKKwkJV01BX0xPR0QoIkhvc3Qgd2FrZXVwIHJlY2VpdmVkIik7CisJfQorCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfc3RhdHVzKQorCQl3bWlfc2V0X3RhcmdldF9zdXNwZW5kKHdtYS0+d21pX2hhbmRsZSwgZmFsc2UpOworCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogd21hX2Rpc2FibGVfd293X2luX2Z3KCkgLSAgRGlzYWJsZSB3b3cgaW4gUENJZSByZXN1bWUgY29udGV4dC4KKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitDREZfU1RBVFVTIHdtYV9kaXNhYmxlX3dvd19pbl9mdyhXTUFfSEFORExFIGhhbmRsZSkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9IGhhbmRsZTsKKwlDREZfU1RBVFVTIHJldDsKKworCWlmICghd21hLT53b3cud293X2VuYWJsZSB8fCAhd21hLT53b3cud293X2VuYWJsZV9jbWRfc2VudCkKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXJldCA9IHdtYV9zZW5kX2hvc3Rfd2FrZXVwX2luZF90b19mdyh3bWEpOworCisJaWYgKHJldCAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiByZXQ7CisKKwl3bWEtPndvdy53b3dfZW5hYmxlID0gZmFsc2U7CisJd21hLT53b3cud293X2VuYWJsZV9jbWRfc2VudCA9IGZhbHNlOworCisJLyogVG8gYWxsb3cgdGhlIHR4IHBhdXNlL3VucGF1c2UgZXZlbnRzICovCisJd21hX3NldF93b3dfYnVzX3N1c3BlbmQod21hLCAwKTsKKwkvKiBVbnBhdXNlIHRoZSB2ZGV2IGFzIHdlIGFyZSByZXN1bWluZyAqLworCXdtYV91bnBhdXNlX3ZkZXYod21hKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTFBTUworLyoqCisgKiB3bWFfaXNfbHBhc3NfZW5hYmxlZCgpIC0gY2hlY2sgaWYgbHBhc3MgaXMgZW5hYmxlZAorICogQGhhbmRsZTogUG9pbnRlciB0byB3bWEgaGFuZGxlCisgKgorICogV29XIGlzIG5lZWRlZCBpZiBMUEFTUyBvciBOYU4gZmVhdHVyZSBpcyBlbmFibGVkIGluIElOSSBiZWNhdXNlCisgKiB0YXJnZXQgY2FuJ3Qgd2FrZSB1cCBpdHNlbGYgaWYgaXRzIHB1dCBpbiBQREVWIHN1c3BlbmQgd2hlbiBMUEFTUworICogb3IgTmFOIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgbHBhc3MgaXMgZW5hYmxlZCBlbHNlIGZhbHNlCisgKi8KK2Jvb2wgc3RhdGljIHdtYV9pc19scGFzc19lbmFibGVkKHRwX3dtYV9oYW5kbGUgd21hKQoreworCWlmICh3bWEtPmlzX2xwYXNzX2VuYWJsZWQpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorI2Vsc2UKK2Jvb2wgc3RhdGljIHdtYV9pc19scGFzc19lbmFibGVkKHRwX3dtYV9oYW5kbGUgd21hKQoreworCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorLyoqCisgKiB3bWFfaXNfbmFuX2VuYWJsZWQoKSAtIGNoZWNrIGlmIE5hTiBpcyBlbmFibGVkCisgKiBAaGFuZGxlOiBQb2ludGVyIHRvIHdtYSBoYW5kbGUKKyAqCisgKiBXb1cgaXMgbmVlZGVkIGlmIExQQVNTIG9yIE5hTiBmZWF0dXJlIGlzIGVuYWJsZWQgaW4gSU5JIGJlY2F1c2UKKyAqIHRhcmdldCBjYW4ndCB3YWtlIHVwIGl0c2VsZiBpZiBpdHMgcHV0IGluIFBERVYgc3VzcGVuZCB3aGVuIExQQVNTCisgKiBvciBOYU4gZmVhdHVyZXMgYXJlIHN1cHBvcnRlZAorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBOYU4gaXMgZW5hYmxlZCBlbHNlIGZhbHNlCisgKi8KK2Jvb2wgc3RhdGljIHdtYV9pc19uYW5fZW5hYmxlZCh0cF93bWFfaGFuZGxlIHdtYSkKK3sKKwlpZiAod21hLT5pc19uYW5fZW5hYmxlZCkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisjZWxzZQorYm9vbCBzdGF0aWMgd21hX2lzX25hbl9lbmFibGVkKHRwX3dtYV9oYW5kbGUgd21hKQoreworCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCisvKioKKyAqIHdtYV9pc193b3dfbW9kZV9zZWxlY3RlZCgpIC0gY2hlY2sgaWYgd293IG5lZWRzIHRvIGJlIGVuYWJsZWQgaW4gZncKKyAqIEBoYW5kbGU6IFBvaW50ZXIgdG8gd21hIGhhbmRsZQorICoKKyAqIElmIGxwYXNzIGlzIGVuYWJsZWQgdGhlbiBhbHdheXMgZG8gd293IGVsc2UgY2hlY2sgd293X2VuYWJsZSBjb25maWcKKyAqCisgKiBSZXR1cm46IHRydWUgaXMgd293IG1vZGUgaXMgbmVlZGVkIGVsc2UgZmFsc2UKKyAqLworaW50IHdtYV9pc193b3dfbW9kZV9zZWxlY3RlZChXTUFfSEFORExFIGhhbmRsZSkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisKKwlpZiAod21hX2lzX2xwYXNzX2VuYWJsZWQod21hKSkgeworCQlXTUFfTE9HRCgiTFBBU1MgaXMgZW5hYmxlZCBzZWxlY3QgV29XIik7CisJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAod21hX2lzX25hbl9lbmFibGVkKHdtYSkpIHsKKwkJV01BX0xPR0QoIk5BTiBpcyBlbmFibGVkIHNlbGVjdCBXb1ciKTsKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJV01BX0xPR0QoIldvVyBlbmFibGUgJWQiLCB3bWEtPndvdy53b3dfZW5hYmxlKTsKKwkJcmV0dXJuIHdtYS0+d293Lndvd19lbmFibGU7CisJfQorfQorCisvKioKKyAqIHdtYV9kZWxfdHNfcmVxKCkgLSBzZW5kIERFTFRTIHJlcXVlc3QgdG8gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBtc2c6IGRlbHRzIHBhcmFtcworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9kZWxfdHNfcmVxKHRwX3dtYV9oYW5kbGUgd21hLCB0RGVsVHNQYXJhbXMgKm1zZykKK3sKKwl3bWlfdmRldl93bW1fZGVsdHNfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQzMl90IGxlbiA9IHNpemVvZigqY21kKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dQKCIlczogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKwljbWQgPSAod21pX3ZkZXZfd21tX2RlbHRzX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl93bW1fZGVsdHNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV92ZGV2X3dtbV9kZWx0c19jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSBtc2ctPnNlc3Npb25JZDsKKwljbWQtPmFjID0gVElEX1RPX1dNRV9BQyhtc2ctPnVzZXJQcmlvKTsKKworCVdNQV9MT0dEKCJEZWx0cyB2ZGV2OiVkLCBhYzolZCwgJXM6JWQiLAorCQkgY21kLT52ZGV2X2lkLCBjbWQtPmFjLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgV01JX1ZERVZfV01NX0RFTFRTX0NNRElEKSkgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byBzZW5kIHZkZXYgREVMVFMgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZShidWYpOworCX0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJaWYgKG1zZy0+c2V0UklDcGFyYW1zID09IHRydWUpCisJCXdtYV9zZXRfcmljX3JlcSh3bWEsIG1zZywgZmFsc2UpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQgKi8KKworZXJyOgorCWNkZl9tZW1fZnJlZShtc2cpOworfQorCisvKioKKyAqIHdtYV9hZ2dyX3Fvc19yZXEoKSAtIHNlbmQgYWdnciBxb3MgcmVxdWVzdCB0byBmdworICogQHdtYTogaGFuZGxlIHRvIHdtYQorICogQHBBZ2dyUW9zUnNwTXNnIC0gY29tYmluZWQgc3RydWN0IGZvciBhbGwgQUREX1RTIHJlcXVlc3RzLgorICoKKyAqIEEgZnVuY3Rpb24gdG8gaGFuZGxlIFdNQV9BR0dSX1FPU19SRVEuIFRoaXMgd2lsbCBzZW5kIG91dAorICogQUREX1RTIHJlcXVlc3RlcyB0byBmaXJtd2FyZSBpbiBsb29wIGZvciBhbGwgdGhlIEFDcyB3aXRoCisgKiBhY3RpdmUgZmxvdy4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfYWdncl9xb3NfcmVxKHRwX3dtYV9oYW5kbGUgd21hLAorCQkgICAgICB0QWdnckFkZFRzUGFyYW1zICpwQWdnclFvc1JzcE1zZykKK3sKKwlpbnQgaSA9IDA7CisJd21pX3ZkZXZfd21tX2FkZHRzX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEFMX1FPU19OVU1fQUNfTUFYOyBpKyspIHsKKwkJLyogaWYgZmxvdyBpbiB0aGlzIEFDIGlzIGFjdGl2ZSAqLworCQlpZiAoKCgxIDw8IGkpICYgcEFnZ3JRb3NSc3BNc2ctPnRzcGVjSWR4KSkgeworCQkJLyoKKwkJCSAqIGFzIHBlciBpbXBsZW1lbnRhdGlvbiBvZiB3bWFfYWRkX3RzX3JlcSgpIHdlCisJCQkgKiBhcmUgbm90IHdhaXRpbmcgYW55IHJlc3BvbnNlIGZyb20gZmlybXdhcmUgc28KKwkJCSAqIGFwYXJ0IGZyb20gc2VuZGluZyBBRERUUyB0byBmaXJtd2FyZSBqdXN0IHNlbmQKKwkJCSAqIHN1Y2Nlc3MgdG8gdXBwZXIgbGF5ZXJzCisJCQkgKi8KKwkJCXBBZ2dyUW9zUnNwTXNnLT5zdGF0dXNbaV0gPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkJCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCQkJaWYgKCFidWYpIHsKKwkJCQlXTUFfTE9HUCgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQkJCWdvdG8gYWdncl9xb3NfZXhpdDsKKwkJCX0KKwkJCWNtZCA9ICh3bWlfdmRldl93bW1fYWRkdHNfY21kX2ZpeGVkX3BhcmFtICopCisJCQkJd21pX2J1Zl9kYXRhKGJ1Zik7CisJCQlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3dtbV9hZGR0c19jbWRfZml4ZWRfcGFyYW0sCisJCQkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJCQkgICAgICAgKHdtaV92ZGV2X3dtbV9hZGR0c19jbWRfZml4ZWRfcGFyYW0pKTsKKwkJCWNtZC0+dmRldl9pZCA9IHBBZ2dyUW9zUnNwTXNnLT5zZXNzaW9uSWQ7CisJCQljbWQtPmFjID0KKwkJCQlUSURfVE9fV01FX0FDKHBBZ2dyUW9zUnNwTXNnLT50c3BlY1tpXS50c2luZm8uCisJCQkJCSAgICAgIHRyYWZmaWMudXNlclByaW8pOworCQkJY21kLT5tZWRpdW1fdGltZV91cyA9CisJCQkJcEFnZ3JRb3NSc3BNc2ctPnRzcGVjW2ldLm1lZGl1bVRpbWUgKiAzMjsKKwkJCWNtZC0+ZG93bmdyYWRlX3R5cGUgPSBXTU1fQUNfRE9XTkdSQURFX0RFUFJJTzsKKwkJCVdNQV9MT0dEKCIlczolZDogQWRkdHMgdmRldjolZCwgYWM6JWQsIG1lZGl1bVRpbWU6JWQgZG93bmdyYWRlX3R5cGU6JWQiLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgY21kLT52ZGV2X2lkLCBjbWQtPmFjLAorCQkJCWNtZC0+bWVkaXVtX3RpbWVfdXMsIGNtZC0+ZG93bmdyYWRlX3R5cGUpOworCQkJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kCisJCQkJICAgICh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgICBXTUlfVkRFVl9XTU1fQUREVFNfQ01ESUQpKSB7CisJCQkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gc2VuZCB2ZGV2IEFERFRTIGNvbW1hbmQiLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcEFnZ3JRb3NSc3BNc2ctPnN0YXR1c1tpXSA9CisJCQkJCUNERl9TVEFUVVNfRV9GQUlMVVJFOworCQkJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwkJCX0KKwkJfQorCX0KKworYWdncl9xb3NfZXhpdDoKKwkvKiBzZW5kIHJlcG9uc2UgdG8gdXBwZXIgbGF5ZXJzIGZyb20gaGVyZSBvbmx5LiAqLworCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9BR0dSX1FPU19SU1AsIHBBZ2dyUW9zUnNwTXNnLCAwKTsKK30KKworLyoqCisgKiB3bWFfYWRkX3RzX3JlcSgpIC0gc2VuZCBBRERUUyByZXF1ZXN0IHRvIGZ3CisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAbXNnOiBBRERUUyBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfYWRkX3RzX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwgdEFkZFRzUGFyYW1zICptc2cpCit7CisJd21pX3ZkZXZfd21tX2FkZHRzX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJLyoKKwkgKiBtc210X2ludGVydmFsIGlzIGluIHVuaXQgY2FsbGVkIFRVICgxIFRVID0gMTAyNCB1cykKKwkgKiBtYXggdmFsdWUgb2YgbXNtdF9pbnRlcnZhbCBjYW5ub3QgbWFrZSByZXN1bHRpbmcKKwkgKiBpbnRlcnZhbF9taWxpc2Vjb25kcyBvdmVyZmxvdyAzMiBiaXQKKwkgKi8KKwl1aW50MzJfdCBpbnRlcnZhbE1pbGlzZWNvbmRzOworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCWlmIChOVUxMID09IHBkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHBkZXYiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCWludGVydmFsTWlsaXNlY29uZHMgPSAobXNnLT50c21faW50ZXJ2YWwgKiAxMDI0KSAvIDEwMDA7CisKKwlvbF90eF9zZXRfY29tcHV0ZV9pbnRlcnZhbChwZGV2LCBpbnRlcnZhbE1pbGlzZWNvbmRzKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICovCisJbXNnLT5zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HUCgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisJY21kID0gKHdtaV92ZGV2X3dtbV9hZGR0c19jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfd21tX2FkZHRzX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfdmRldl93bW1fYWRkdHNfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gbXNnLT5zbWVfc2Vzc2lvbl9pZDsKKwljbWQtPmFjID0gVElEX1RPX1dNRV9BQyhtc2ctPnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvKTsKKwljbWQtPm1lZGl1bV90aW1lX3VzID0gbXNnLT50c3BlYy5tZWRpdW1UaW1lICogMzI7CisJY21kLT5kb3duZ3JhZGVfdHlwZSA9IFdNTV9BQ19ET1dOR1JBREVfRFJPUDsKKwlXTUFfTE9HRCgiQWRkdHMgdmRldjolZCwgYWM6JWQsIG1lZGl1bVRpbWU6JWQsIGRvd25ncmFkZV90eXBlOiVkICVzOiVkIiwKKwkJIGNtZC0+dmRldl9pZCwgY21kLT5hYywgY21kLT5tZWRpdW1fdGltZV91cywKKwkJIGNtZC0+ZG93bmdyYWRlX3R5cGUsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJIFdNSV9WREVWX1dNTV9BRERUU19DTURJRCkpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gc2VuZCB2ZGV2IEFERFRTIGNvbW1hbmQiLCBfX2Z1bmNfXyk7CisJCW1zZy0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwl9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmIChtc2ctPnNldFJJQ3BhcmFtcyA9PSB0cnVlKQorCQl3bWFfc2V0X3JpY19yZXEod21hLCBtc2csIHRydWUpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQgKi8KKworZXJyOgorCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9BRERfVFNfUlNQLCBtc2csIDApOworfQorCisvKioKKyAqIHdtYV9lbmFibGVfZGlzYWJsZV9wYWNrZXRfZmlsdGVyKCkgLSBlbmFibGUvZGlzYWJsZSBwYWNrZXQgZmlsdGVyIGluIHRhcmdldAorICogQHdtYTogUG9pbnRlciB0byB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQGVuYWJsZTogRmxhZyB0byBlbmFibGUvZGlzYWJsZSBwYWNrZXQgZmlsdGVyCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCB3bWFfZW5hYmxlX2Rpc2FibGVfcGFja2V0X2ZpbHRlcih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJdWludDhfdCB2ZGV2X2lkLCBib29sIGVuYWJsZSkKK3sKKwlpbnQzMl90IGxlbjsKKwlpbnQgcmV0ID0gMDsKKwl3bWlfYnVmX3QgYnVmOworCVdNSV9QQUNLRVRfRklMVEVSX0VOQUJMRV9DTURfZml4ZWRfcGFyYW0gKmNtZDsKKworCWxlbiA9IHNpemVvZihXTUlfUEFDS0VUX0ZJTFRFUl9FTkFCTEVfQ01EX2ZpeGVkX3BhcmFtKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIGFsbG9jYXRlIHdtaSBidWZmZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNtZCA9IChXTUlfUEFDS0VUX0ZJTFRFUl9FTkFCTEVfQ01EX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BhY2tldF9maWx0ZXJfZW5hYmxlX2ZpeGVkX3BhcmFtLAorCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oCisJCVdNSV9QQUNLRVRfRklMVEVSX0VOQUJMRV9DTURfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJaWYgKGVuYWJsZSkKKwkJY21kLT5lbmFibGUgPSBQQUNLRVRfRklMVEVSX1NFVF9FTkFCTEU7CisJZWxzZQorCQljbWQtPmVuYWJsZSA9IFBBQ0tFVF9GSUxURVJfU0VUX0RJU0FCTEU7CisKKwlXTUFfTE9HRSgiJXM6IFBhY2tldCBmaWx0ZXIgZW5hYmxlICVkIGZvciB2ZGV2X2lkICVkIiwKKwkJX19mdW5jX18sIGNtZC0+ZW5hYmxlLCB2ZGV2X2lkKTsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkgV01JX1BBQ0tFVF9GSUxURVJfRU5BQkxFX0NNRElEKTsKKwlpZiAocmV0KQorCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgcGFja2V0IGZpbHRlciB3bWkgY21kIHRvIGZ3Iik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtYV9jb25maWdfcGFja2V0X2ZpbHRlcigpIC0gY29uZmlndXJlIHBhY2tldCBmaWx0ZXIgaW4gdGFyZ2V0CisgKiBAd21hOiBQb2ludGVyIHRvIHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAcmN2X2ZpbHRlcl9wYXJhbTogUGFja2V0IGZpbHRlciBwYXJhbWV0ZXJzCisgKiBAZmlsdGVyX2lkOiBGaWx0ZXIgaWQKKyAqIEBlbmFibGU6IEZsYWcgdG8gYWRkL2RlbGV0ZSBwYWNrZXQgZmlsdGVyIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHdtYV9jb25maWdfcGFja2V0X2ZpbHRlcih0cF93bWFfaGFuZGxlIHdtYSwKKwkJdWludDhfdCB2ZGV2X2lkLCB0U2lyUmN2UGt0RmlsdGVyQ2ZnVHlwZSAqcmN2X2ZpbHRlcl9wYXJhbSwKKwkJdWludDhfdCBmaWx0ZXJfaWQsIGJvb2wgZW5hYmxlKQoreworCWludCBsZW4sIGk7CisJaW50IGVyciA9IDA7CisJd21pX2J1Zl90IGJ1ZjsKKwlXTUlfUEFDS0VUX0ZJTFRFUl9DT05GSUdfQ01EX2ZpeGVkX3BhcmFtICpjbWQ7CisKKworCS8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgKi8KKwlsZW4gPSBzaXplb2YoKmNtZCk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgdG8gc2VuZCBzZXRfcGFyYW0gY21kIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNtZCA9IChXTUlfUEFDS0VUX0ZJTFRFUl9DT05GSUdfQ01EX2ZpeGVkX3BhcmFtICopd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJV01JVExWX1RBR19TVFJVQ193bWlfcGFja2V0X2ZpbHRlcl9jb25maWdfZml4ZWRfcGFyYW0sCisJCVdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgIChXTUlfUEFDS0VUX0ZJTFRFUl9DT05GSUdfQ01EX2ZpeGVkX3BhcmFtKSk7CisKKwljbWQtPnZkZXZfaWQgPSB2ZGV2X2lkOworCWNtZC0+ZmlsdGVyX2lkID0gZmlsdGVyX2lkOworCWlmIChlbmFibGUpCisJCWNtZC0+ZmlsdGVyX2FjdGlvbiA9IFBBQ0tFVF9GSUxURVJfU0VUX0FDVElWRTsKKwllbHNlCisJCWNtZC0+ZmlsdGVyX2FjdGlvbiA9IFBBQ0tFVF9GSUxURVJfU0VUX0lOQUNUSVZFOworCisJaWYgKGVuYWJsZSkgeworCQljbWQtPm51bV9wYXJhbXMgPSBDREZfTUlOKAorCQkJCQlXTUlfUEFDS0VUX0ZJTFRFUl9NQVhfQ01QX1BFUl9QQUNLRVRfRklMVEVSLAorCQkJCQlyY3ZfZmlsdGVyX3BhcmFtLT5udW1GaWVsZFBhcmFtcyk7CisJCWNtZC0+ZmlsdGVyX3R5cGUgPSByY3ZfZmlsdGVyX3BhcmFtLT5maWx0ZXJUeXBlOworCQljbWQtPmNvYWxlc2NlX3RpbWUgPSByY3ZfZmlsdGVyX3BhcmFtLT5jb2FsZXNjZVRpbWU7CisKKwkJZm9yIChpID0gMDsgaSA8IGNtZC0+bnVtX3BhcmFtczsgaSsrKSB7CisJCQljbWQtPnBhcmFtc0RhdGFbaV0ucHJvdG9fdHlwZSA9CisJCQkJcmN2X2ZpbHRlcl9wYXJhbS0+cGFyYW1zRGF0YVtpXS5wcm90b2NvbExheWVyOworCQkJY21kLT5wYXJhbXNEYXRhW2ldLmNtcF90eXBlID0KKwkJCQlyY3ZfZmlsdGVyX3BhcmFtLT5wYXJhbXNEYXRhW2ldLmNtcEZsYWc7CisJCQljbWQtPnBhcmFtc0RhdGFbaV0uZGF0YV9sZW5ndGggPQorCQkJCXJjdl9maWx0ZXJfcGFyYW0tPnBhcmFtc0RhdGFbaV0uZGF0YUxlbmd0aDsKKwkJCWNtZC0+cGFyYW1zRGF0YVtpXS5kYXRhX29mZnNldCA9CisJCQkJcmN2X2ZpbHRlcl9wYXJhbS0+cGFyYW1zRGF0YVtpXS5kYXRhT2Zmc2V0OworCQkJbWVtY3B5KCZjbWQtPnBhcmFtc0RhdGFbaV0uY29tcGFyZURhdGEsCisJCQkJcmN2X2ZpbHRlcl9wYXJhbS0+cGFyYW1zRGF0YVtpXS5jb21wYXJlRGF0YSwKKwkJCQlzaXplb2YoY21kLT5wYXJhbXNEYXRhW2ldLmNvbXBhcmVEYXRhKSk7CisJCQltZW1jcHkoJmNtZC0+cGFyYW1zRGF0YVtpXS5kYXRhTWFzaywKKwkJCQlyY3ZfZmlsdGVyX3BhcmFtLT5wYXJhbXNEYXRhW2ldLmRhdGFNYXNrLAorCQkJCXNpemVvZihjbWQtPnBhcmFtc0RhdGFbaV0uZGF0YU1hc2spKTsKKwkJfQorCX0KKworCVdNQV9MT0dFKCJQYWNrZXQgZmlsdGVyIGFjdGlvbiAlZCBmaWx0ZXIgd2l0aCBpZDogJWQsIG51bV9wYXJhbXM9JWQiLAorCQljbWQtPmZpbHRlcl9hY3Rpb24sIGNtZC0+ZmlsdGVyX2lkLCBjbWQtPm51bV9wYXJhbXMpOworCS8qIHNlbmQgdGhlIGNvbW1hbmQgYWxvbmcgd2l0aCBkYXRhICovCisJZXJyID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQlXTUlfUEFDS0VUX0ZJTFRFUl9DT05GSUdfQ01ESUQpOworCWlmIChlcnIpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIHBrdF9maWx0ZXIgY21kIik7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBFbmFibGUgcGFja2V0IGZpbHRlciAqLworCWlmIChlbmFibGUpCisJCXdtYV9lbmFibGVfZGlzYWJsZV9wYWNrZXRfZmlsdGVyKHdtYSwgdmRldl9pZCwgdHJ1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc19yZWNlaXZlX2ZpbHRlcl9zZXRfZmlsdGVyX3JlcSgpIC0gZW5hYmxlIHBhY2tldCBmaWx0ZXIKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcmN2X2ZpbHRlcl9wYXJhbTogZmlsdGVyIHBhcmFtcworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfcHJvY2Vzc19yZWNlaXZlX2ZpbHRlcl9zZXRfZmlsdGVyX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQl0U2lyUmN2UGt0RmlsdGVyQ2ZnVHlwZSAqcmN2X2ZpbHRlcl9wYXJhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50OF90IHZkZXZfaWQ7CisKKwkvKiBHZXQgdGhlIHZkZXYgaWQgKi8KKwlpZiAoIXdtYV9maW5kX3ZkZXZfYnlfYnNzaWQod21hLCByY3ZfZmlsdGVyX3BhcmFtLT5ic3NJZCwgJnZkZXZfaWQpKSB7CisJCVdNQV9MT0dFKCJ2ZGV2IGhhbmRsZSBpcyBpbnZhbGlkIGZvciAlcE0iLAorCQkJcmN2X2ZpbHRlcl9wYXJhbS0+YnNzSWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSB3bWFfY29uZmlnX3BhY2tldF9maWx0ZXIod21hLCB2ZGV2X2lkLCByY3ZfZmlsdGVyX3BhcmFtLAorCQkJCXJjdl9maWx0ZXJfcGFyYW0tPmZpbHRlcklkLCB0cnVlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3NfcmVjZWl2ZV9maWx0ZXJfY2xlYXJfZmlsdGVyX3JlcSgpIC0gZGlzYWJsZSBwYWNrZXQgZmlsdGVyCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQHJjdl9jbGVhcl9wYXJhbTogZmlsdGVyIHBhcmFtcworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfcHJvY2Vzc19yZWNlaXZlX2ZpbHRlcl9jbGVhcl9maWx0ZXJfcmVxKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCXRTaXJSY3ZGbHRQa3RDbGVhclBhcmFtICpyY3ZfY2xlYXJfcGFyYW0pCit7CisJaW50IHJldCA9IDA7CisJdWludDhfdCB2ZGV2X2lkOworCisJLyogR2V0IHRoZSB2ZGV2IGlkICovCisJaWYgKCF3bWFfZmluZF92ZGV2X2J5X2Jzc2lkKHdtYSwgcmN2X2NsZWFyX3BhcmFtLT5ic3NJZCwgJnZkZXZfaWQpKSB7CisJCVdNQV9MT0dFKCJ2ZGV2IGhhbmRsZSBpcyBpbnZhbGlkIGZvciAlcE0iLCByY3ZfY2xlYXJfcGFyYW0tPmJzc0lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gd21hX2NvbmZpZ19wYWNrZXRfZmlsdGVyKHdtYSwgdmRldl9pZCwgTlVMTCwKKwkJCXJjdl9jbGVhcl9wYXJhbS0+ZmlsdGVySWQsIGZhbHNlKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisKKyNkZWZpbmUgVFNNX0RFTEFZX0hJU1RST0dSQU1fQklOUyA0CisvKioKKyAqIHdtYV9wcm9jZXNzX3RzbV9zdGF0c19yZXEoKSAtIHByb2Nlc3MgdHNtIHN0YXRzIHJlcXVlc3QKKyAqIEB3bWFfaGFuZGxlciAtIGhhbmRsZSB0byB3bWEKKyAqIEBwVHNtU3RhdHNNc2cgLSBUU00gc3RhdHMgc3RydWN0IHRoYXQgbmVlZHMgdG8gYmUgcG9wdWxhdGVkIGFuZAorICogICAgICAgICBwYXNzZWQgaW4gbWVzc2FnZS4KKyAqCisgKiBBIHBhcmFsbGVsIGZ1bmN0aW9uIHRvIFdNQV9Qcm9jZXNzVHNtU3RhdHNSZXEgZm9yIHByb250by4gVGhpcworICogZnVuY3Rpb24gZmV0Y2hlcyBzdGF0cyBmcm9tIGRhdGEgcGF0aCBBUElzIGFuZCBwb3N0CisgKiBXTUFfVFNNX1NUQVRTX1JTUCBtc2cgYmFjayB0byBMSU0uCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3Byb2Nlc3NfdHNtX3N0YXRzX3JlcSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGVyLAorCQkJCSAgICAgdm9pZCAqcFRzbVN0YXRzTXNnKQoreworCXVpbnQ4X3QgY291bnRlcjsKKwl1aW50MzJfdCBxdWV1ZV9kZWxheV9taWNyb3NlYyA9IDA7CisJdWludDMyX3QgdHhfZGVsYXlfbWljcm9zZWMgPSAwOworCXVpbnQxNl90IHBhY2tldF9jb3VudCA9IDA7CisJdWludDE2X3QgcGFja2V0X2xvc3NfY291bnQgPSAwOworCXRwQW5pVHJhZlN0cm1NZXRyaWNzIHBUc21NZXRyaWMgPSBOVUxMOworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECisJdHBBbmlHZXRUc21TdGF0c1JlcSBwU3RhdHMgPSAodHBBbmlHZXRUc21TdGF0c1JlcSkgcFRzbVN0YXRzTXNnOworCXRwQW5pR2V0VHNtU3RhdHNSc3AgcFRzbVJzcFBhcmFtcyA9IE5VTEw7CisjZWxzZQorCXRwVFNNU3RhdHMgcFN0YXRzID0gKHRwVFNNU3RhdHMpIHBUc21TdGF0c01zZzsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworCWludCB0aWQgPSBwU3RhdHMtPnRpZDsKKwkvKgorCSAqIFRoZSBudW1iZXIgb2YgaGlzdHJvZ3JhbSBiaW4gcmVwb3J0IGJ5IGRhdGEgcGF0aCBhcGkgYXJlIGRpZmZlcmVudAorCSAqIHRoYW4gcmVxdWlyZWQgYnkgVFNNLCBoZW5jZSBkaWZmZXJlbnQgKDYpIHNpemUgYXJyYXkgdXNlZAorCSAqLworCXVpbnQxNl90IGJpbl92YWx1ZXNbUUNBX1RYX0RFTEFZX0hJU1RfUkVQT1JUX0JJTlNdID0geyAwLCB9OworCisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisKKwlpZiAoTlVMTCA9PSBwZGV2KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCBwZGV2IiwgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUocFRzbVN0YXRzTXNnKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwkvKiBnZXQgcmVxdWlyZWQgdmFsdWVzIGZyb20gZGF0YSBwYXRoIEFQSXMgKi8KKwlvbF90eF9kZWxheShwZGV2LCAmcXVldWVfZGVsYXlfbWljcm9zZWMsICZ0eF9kZWxheV9taWNyb3NlYywgdGlkKTsKKwlvbF90eF9kZWxheV9oaXN0KHBkZXYsIGJpbl92YWx1ZXMsIHRpZCk7CisJb2xfdHhfcGFja2V0X2NvdW50KHBkZXYsICZwYWNrZXRfY291bnQsICZwYWNrZXRfbG9zc19jb3VudCwgdGlkKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECisJcFRzbVJzcFBhcmFtcyA9CisJCSh0cEFuaUdldFRzbVN0YXRzUnNwKSBjZGZfbWVtX21hbGxvYyhzaXplb2YodEFuaUdldFRzbVN0YXRzUnNwKSk7CisJaWYgKE5VTEwgPT0gcFRzbVJzcFBhcmFtcykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIiVzOiBDREYgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCWNkZl9tZW1fZnJlZShwVHNtU3RhdHNNc2cpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwlwVHNtUnNwUGFyYW1zLT5zdGFJZCA9IHBTdGF0cy0+c3RhSWQ7CisJcFRzbVJzcFBhcmFtcy0+cmMgPSBlU0lSX0ZBSUxVUkU7CisJcFRzbVJzcFBhcmFtcy0+dHNtU3RhdHNSZXEgPSBwU3RhdHM7CisJcFRzbU1ldHJpYyA9ICZwVHNtUnNwUGFyYW1zLT50c21NZXRyaWNzOworI2Vsc2UKKwlwVHNtTWV0cmljID0gKHRwQW5pVHJhZlN0cm1NZXRyaWNzKSYocFN0YXRzLT50c21NZXRyaWNzKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworCS8qIHBvcHVsYXRlIHBUc21NZXRyaWMgKi8KKwlwVHNtTWV0cmljLT5VcGxpbmtQa3RRdWV1ZURseSA9IHF1ZXVlX2RlbGF5X21pY3Jvc2VjOworCS8qIHN0b3JlIG9ubHkgcmVxdWlyZWQgbnVtYmVyIG9mIGJpbiB2YWx1ZXMgKi8KKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgVFNNX0RFTEFZX0hJU1RST0dSQU1fQklOUzsgY291bnRlcisrKSB7CisJCXBUc21NZXRyaWMtPlVwbGlua1BrdFF1ZXVlRGx5SGlzdFtjb3VudGVyXSA9CisJCQliaW5fdmFsdWVzW2NvdW50ZXJdOworCX0KKwlwVHNtTWV0cmljLT5VcGxpbmtQa3RUeERseSA9IHR4X2RlbGF5X21pY3Jvc2VjOworCXBUc21NZXRyaWMtPlVwbGlua1BrdExvc3MgPSBwYWNrZXRfbG9zc19jb3VudDsKKwlwVHNtTWV0cmljLT5VcGxpbmtQa3RDb3VudCA9IHBhY2tldF9jb3VudDsKKworCS8qCisJICogTm8gbmVlZCB0byBwb3B1bGF0ZSByb2FtaW5nIGRlbGF5IGFuZCByb2FtaW5nIGNvdW50IGFzIHRoZXkgYXJlCisJICogYmVpbmcgcG9wdWxhdGVkIGp1c3QgYmVmb3JlIHNlbmRpbmcgSUFQUCBmcmFtZSBvdXQKKwkgKi8KKwkvKiBwb3N0IHRoaXMgbWVzc2FnZSB0byBMSU0vUEUgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAorCXdtYV9zZW5kX21zZyh3bWFfaGFuZGxlciwgV01BX1RTTV9TVEFUU19SU1AsICh2b2lkICopcFRzbVJzcFBhcmFtcywgMCk7CisjZWxzZQorCXdtYV9zZW5kX21zZyh3bWFfaGFuZGxlciwgV01BX1RTTV9TVEFUU19SU1AsICh2b2lkICopcFRzbVN0YXRzTXNnLCAwKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFICovCisKKy8qKgorICogd21hX2FkZF9jbGVhcl9tY2JjX2ZpbHRlcigpIC0gc2V0IG1jYXN0IGZpbHRlciBjb21tYW5kIHRvIGZ3CisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBtdWx0aWNhc3RBZGRyOiBtY2FzdCBhZGRyZXNzCisgKiBAY2xlYXJMaXN0OiBjbGVhciBsaXN0IGZsYWcKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHdtYV9hZGRfY2xlYXJfbWNiY19maWx0ZXIodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLCB1aW50OF90IHZkZXZfaWQsCisJCQkJICAgICB0U2lyTWFjQWRkciBtdWx0aWNhc3RBZGRyLCBib29sIGNsZWFyTGlzdCkKK3sKKwlXTUlfU0VUX01DQVNUQkNBU1RfRklMVEVSX0NNRF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50IGVycjsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciB0byBzZW5kIHNldF9wYXJhbSBjbWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kID0gKFdNSV9TRVRfTUNBU1RCQ0FTVF9GSUxURVJfQ01EX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCWNkZl9tZW1femVybyhjbWQsIHNpemVvZigqY21kKSk7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ19XTUlfU0VUX01DQVNUQkNBU1RfRklMVEVSX0NNRF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgIChXTUlfU0VUX01DQVNUQkNBU1RfRklMVEVSX0NNRF9maXhlZF9wYXJhbSkpOworCWNtZC0+YWN0aW9uID0KKwkJKGNsZWFyTGlzdCA/IFdNSV9NQ0FTVF9GSUxURVJfREVMRVRFIDogV01JX01DQVNUX0ZJTFRFUl9TRVQpOworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJV01JX0NIQVJfQVJSQVlfVE9fTUFDX0FERFIobXVsdGljYXN0QWRkciwgJmNtZC0+bWNhc3RiZGNhc3RhZGRyKTsKKwllcnIgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCQkJICAgc2l6ZW9mKCpjbWQpLAorCQkJCSAgIFdNSV9TRVRfTUNBU1RCQ0FTVF9GSUxURVJfQ01ESUQpOworCWlmIChlcnIpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIHNldF9wYXJhbSBjbWQiKTsKKwkJY2RmX21lbV9mcmVlKGJ1Zik7CisJCXJldHVybiAtRUlPOworCX0KKwlXTUFfTE9HRCgiQWN0aW9uOiVkOyB2ZGV2X2lkOiVkOyBjbGVhckxpc3Q6JWRcbiIsCisJCSBjbWQtPmFjdGlvbiwgdmRldl9pZCwgY2xlYXJMaXN0KTsKKwlXTUFfTE9HRCgiTUNCQyBNQUMgQWRkcjogJTB4OiUweDolMHg6JTB4OiUweDolMHhcbiIsCisJCSBtdWx0aWNhc3RBZGRyWzBdLCBtdWx0aWNhc3RBZGRyWzFdLCBtdWx0aWNhc3RBZGRyWzJdLAorCQkgbXVsdGljYXN0QWRkclszXSwgbXVsdGljYXN0QWRkcls0XSwgbXVsdGljYXN0QWRkcls1XSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3NfbWNiY19zZXRfZmlsdGVyX3JlcSgpIC0gcHJvY2VzcyBtY2JjIHNldCBmaWx0ZXIgcmVxdWVzdAorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBtY2JjX3BhcmFtOiBtY2JjIHBhcmFtcworICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX21jYmNfc2V0X2ZpbHRlcl9yZXEodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgICB0U2lyUmN2Rmx0TWNBZGRyTGlzdCAqIG1jYmNfcGFyYW0pCit7CisJdWludDhfdCB2ZGV2X2lkID0gMDsKKwlpbnQgaTsKKworCWlmIChtY2JjX3BhcmFtLT51bE11bHRpY2FzdEFkZHJDbnQgPD0gMCkgeworCQlXTUFfTE9HRSgiTnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgaXMgMCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKCF3bWFfZmluZF92ZGV2X2J5X2FkZHIKKwkJICAgICh3bWFfaGFuZGxlLCBtY2JjX3BhcmFtLT5zZWxmTWFjQWRkciwgJnZkZXZfaWQpKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgdmRldiBpZCBmb3IgJXBNIiwgX19mdW5jX18sCisJCQkgbWNiY19wYXJhbS0+YnNzSWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIHNldCBtY2JjX3BhcmFtLT5hY3Rpb24gdG8gY2xlYXIgTUNMaXN0IGFuZCByZXNldAorCSAqIHRvIGNvbmZpZ3VyZSB0aGUgTUNMaXN0IGluIEZXCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbWNiY19wYXJhbS0+dWxNdWx0aWNhc3RBZGRyQ250OyBpKyspIHsKKwkJd21hX2FkZF9jbGVhcl9tY2JjX2ZpbHRlcih3bWFfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkgIG1jYmNfcGFyYW0tPm11bHRpY2FzdEFkZHJbaV0sCisJCQkJCSAgKG1jYmNfcGFyYW0tPmFjdGlvbiA9PSAwKSk7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKyNkZWZpbmUgR1RLX09GRkxPQURfRU5BQkxFICAgICAgMAorI2RlZmluZSBHVEtfT0ZGTE9BRF9ESVNBQkxFICAgICAxCisKKy8qKgorICogd21hX2d0a19vZmZsb2FkX3N0YXR1c19ldmVudCgpIC0gR1RLIG9mZmxvYWQgc3RhdHVzIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBldmVudDogZXZlbnQgYnVmZmVyCisgKiBAbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV9ndGtfb2ZmbG9hZF9zdGF0dXNfZXZlbnQodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwKKwkJCQkgdWludDMyX3QgbGVuKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlXTUlfR1RLX09GRkxPQURfU1RBVFVTX0VWRU5UX2ZpeGVkX3BhcmFtICpzdGF0dXM7CisJV01JX0dUS19PRkZMT0FEX1NUQVRVU19FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zIHJlc3A7CisJY2RzX21zZ190IGNkc19tc2c7CisJdWludDhfdCAqYnNzaWQ7CisKKwlXTUFfTE9HRCgiJXMgRW50ZXIiLCBfX2Z1bmNfXyk7CisKKwlwYXJhbV9idWYgPSAoV01JX0dUS19PRkZMT0FEX1NUQVRVU19FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnQ7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoInBhcmFtX2J1ZiBpcyBOVUxMIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0YXR1cyA9IChXTUlfR1RLX09GRkxPQURfU1RBVFVTX0VWRU5UX2ZpeGVkX3BhcmFtICopIHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisKKwlpZiAobGVuIDwgc2l6ZW9mKFdNSV9HVEtfT0ZGTE9BRF9TVEFUVVNfRVZFTlRfZml4ZWRfcGFyYW0pKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIGxlbmd0aCBmb3IgR1RLIHN0YXR1cyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYnNzaWQgPSB3bWFfZmluZF9ic3NpZF9ieV92ZGV2X2lkKHdtYSwgc3RhdHVzLT52ZGV2X2lkKTsKKwlpZiAoIWJzc2lkKSB7CisJCVdNQV9MT0dFKCJpbnZhbGlkIGJzc2lkIGZvciB2ZGV2IGlkICVkIiwgc3RhdHVzLT52ZGV2X2lkKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcmVzcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcmVzcCkpOworCWlmICghcmVzcCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBhbGxvYyByZXNwb25zZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNkZl9tZW1femVybyhyZXNwLCBzaXplb2YoKnJlc3ApKTsKKwlyZXNwLT5tZXNnVHlwZSA9IGVXTklfUE1DX0dUS19PRkZMT0FEX0dFVElORk9fUlNQOworCXJlc3AtPm1lc2dMZW4gPSBzaXplb2YoKnJlc3ApOworCXJlc3AtPnVsU3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXJlc3AtPnVsVG90YWxSZWtleUNvdW50ID0gc3RhdHVzLT5yZWZyZXNoX2NudDsKKwkvKiBUT0RPOiBJcyB0aGUgdG90YWwgcmVrZXkgY291bnQgYW5kIEdUSyByZWtleSBjb3VudCBzYW1lPyAqLworCXJlc3AtPnVsR1RLUmVrZXlDb3VudCA9IHN0YXR1cy0+cmVmcmVzaF9jbnQ7CisKKwljZGZfbWVtX2NvcHkoJnJlc3AtPnVsbEtleVJlcGxheUNvdW50ZXIsICZzdGF0dXMtPnJlcGxheV9jb3VudGVyLAorCQkgICAgIEdUS19SRVBMQVlfQ09VTlRFUl9CWVRFUyk7CisKKwljZGZfbWVtX2NvcHkocmVzcC0+YnNzSWQsIGJzc2lkLCBJRUVFODAyMTFfQUREUl9MRU4pOworCisjaWZkZWYgSUdUS19PRkZMT0FECisJLyogVE9ETzogSXMgdGhlIHJlZnJlc2ggY291bnQgc2FtZSBmb3IgR1RLIGFuZCBJR1RLPyAqLworCXJlc3AtPnVsSUdUS1Jla2V5Q291bnQgPSBzdGF0dXMtPnJlZnJlc2hfY250OworI2VuZGlmIC8qIElHVEtfT0ZGTE9BRCAqLworCisJY2RzX21zZy50eXBlID0gZVdOSV9QTUNfR1RLX09GRkxPQURfR0VUSU5GT19SU1A7CisJY2RzX21zZy5ib2R5cHRyID0gKHZvaWQgKilyZXNwOworCWNkc19tc2cuYm9keXZhbCA9IDA7CisKKwlpZiAoY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfU01FLCAoY2RzX21zZ190ICopICZjZHNfbXNnKQorCSAgICAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBwb3N0IEdUSyByZXNwb25zZSB0byBTTUUiKTsKKwkJY2RmX21lbV9mcmVlKHJlc3ApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlXTUFfTE9HRCgiR1RLOiBnb3QgdGFyZ2V0IHN0YXR1cyB3aXRoIHJlcGxheSBjb3VudGVyICIKKwkJICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeC4gdmRldiAlZCAiCisJCSAiUmVmcmVzaCBHVEsgJWQgdGltZXMgZXhjaGFuZ2VzIHNpbmNlIGxhc3Qgc2V0IG9wZXJhdGlvbiIsCisJCSBzdGF0dXMtPnJlcGxheV9jb3VudGVyWzBdLAorCQkgc3RhdHVzLT5yZXBsYXlfY291bnRlclsxXSwKKwkJIHN0YXR1cy0+cmVwbGF5X2NvdW50ZXJbMl0sCisJCSBzdGF0dXMtPnJlcGxheV9jb3VudGVyWzNdLAorCQkgc3RhdHVzLT5yZXBsYXlfY291bnRlcls0XSwKKwkJIHN0YXR1cy0+cmVwbGF5X2NvdW50ZXJbNV0sCisJCSBzdGF0dXMtPnJlcGxheV9jb3VudGVyWzZdLAorCQkgc3RhdHVzLT5yZXBsYXlfY291bnRlcls3XSwKKwkJIHN0YXR1cy0+dmRldl9pZCwgc3RhdHVzLT5yZWZyZXNoX2NudCk7CisKKwlXTUFfTE9HRCgiJXMgRXhpdCIsIF9fZnVuY19fKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9zZW5kX2d0a19vZmZsb2FkX3JlcSgpIC0gc2VuZCBHVEsgb2ZmbG9hZCBjb21tYW5kIHRvIGZ3CisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHBhcmFtczogR1RLIG9mZmxvYWQgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitzdGF0aWMgQ0RGX1NUQVRVUyB3bWFfc2VuZF9ndGtfb2ZmbG9hZF9yZXEodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCwKKwkJCQkJICAgdHBTaXJHdGtPZmZsb2FkUGFyYW1zIHBhcmFtcykKK3sKKwlpbnQgbGVuOworCXdtaV9idWZfdCBidWY7CisJV01JX0dUS19PRkZMT0FEX0NNRF9maXhlZF9wYXJhbSAqY21kOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJV01BX0xPR0QoIiVzIEVudGVyIiwgX19mdW5jX18pOworCisJbGVuID0gc2l6ZW9mKCpjbWQpOworCisJLyogYWxsb2Mgd21pIGJ1ZmZlciAqLworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCJ3bWlfYnVmX2FsbG9jIGZhaWxlZCBmb3IgV01JX0dUS19PRkZMT0FEX0NNRCIpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWNtZCA9IChXTUlfR1RLX09GRkxPQURfQ01EX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX1dNSV9HVEtfT0ZGTE9BRF9DTURfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAoV01JX0dUS19PRkZMT0FEX0NNRF9maXhlZF9wYXJhbSkpOworCisJY21kLT52ZGV2X2lkID0gdmRldl9pZDsKKworCS8qIFJlcXVlc3QgdGFyZ2V0IHRvIGVuYWJsZSBHVEsgb2ZmbG9hZCAqLworCWlmIChwYXJhbXMtPnVsRmxhZ3MgPT0gR1RLX09GRkxPQURfRU5BQkxFKSB7CisJCWNtZC0+ZmxhZ3MgPSBHVEtfT0ZGTE9BRF9FTkFCTEVfT1BDT0RFOworCQl3bWEtPndvdy5ndGtfZXJyX2VuYWJsZVt2ZGV2X2lkXSA9IHRydWU7CisKKwkJLyogQ29weSB0aGUga2V5cyBhbmQgcmVwbGF5IGNvdW50ZXIgKi8KKwkJY2RmX21lbV9jb3B5KGNtZC0+S0NLLCBwYXJhbXMtPmFLQ0ssIEdUS19PRkZMT0FEX0tDS19CWVRFUyk7CisJCWNkZl9tZW1fY29weShjbWQtPktFSywgcGFyYW1zLT5hS0VLLCBHVEtfT0ZGTE9BRF9LRUtfQllURVMpOworCQljZGZfbWVtX2NvcHkoY21kLT5yZXBsYXlfY291bnRlciwgJnBhcmFtcy0+dWxsS2V5UmVwbGF5Q291bnRlciwKKwkJCSAgICAgR1RLX1JFUExBWV9DT1VOVEVSX0JZVEVTKTsKKwl9IGVsc2UgeworCQl3bWEtPndvdy5ndGtfZXJyX2VuYWJsZVt2ZGV2X2lkXSA9IGZhbHNlOworCQljbWQtPmZsYWdzID0gR1RLX09GRkxPQURfRElTQUJMRV9PUENPREU7CisJfQorCisJLyogc2VuZCB0aGUgd21pIGNvbW1hbmQgKi8KKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgV01JX0dUS19PRkZMT0FEX0NNRElEKSkgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgV01JX0dUS19PRkZMT0FEX0NNRElEIik7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlXTUFfTE9HRCgiVkRFVklEOiAlZCwgR1RLX0ZMQUdTOiB4JXgiLCB2ZGV2X2lkLCBjbWQtPmZsYWdzKTsKK291dDoKKwlXTUFfTE9HRCgiJXMgRXhpdCIsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9wcm9jZXNzX2d0a19vZmZsb2FkX3JlcSgpIC0gcHJvY2VzcyBHVEsgb2ZmbG9hZCByZXEgZnJvbSB1bWFjCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcGFyYW1zOiBHVEsgb2ZmbG9hZCBwYXJhbXMKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19ndGtfb2ZmbG9hZF9yZXEodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJICAgICAgIHRwU2lyR3RrT2ZmbG9hZFBhcmFtcyBwYXJhbXMpCit7CisJdWludDhfdCB2ZGV2X2lkOworCUNERl9TVEFUVVMgc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJV01BX0xPR0QoIiVzIEVudGVyIiwgX19mdW5jX18pOworCisJLyogR2V0IHRoZSB2ZGV2IGlkICovCisJaWYgKCF3bWFfZmluZF92ZGV2X2J5X2Jzc2lkKHdtYSwgcGFyYW1zLT5ic3NJZCwgJnZkZXZfaWQpKSB7CisJCVdNQV9MT0dFKCJ2ZGV2IGhhbmRsZSBpcyBpbnZhbGlkIGZvciAlcE0iLCBwYXJhbXMtPmJzc0lkKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBWYWxpZGF0ZSB2ZGV2IGlkICovCisJaWYgKHZkZXZfaWQgPj0gd21hLT5tYXhfYnNzaWQpIHsKKwkJV01BX0xPR0UoImludmFsaWQgdmRldl9pZCAlZCBmb3IgJXBNIiwgdmRldl9pZCwgcGFyYW1zLT5ic3NJZCk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChwYXJhbXMtPnVsRmxhZ3MgPT0gR1RLX09GRkxPQURfRU5BQkxFKSAmJgorCSAgICAod21hLT53b3cuZ3RrX2Vycl9lbmFibGVbdmRldl9pZF0gPT0gdHJ1ZSkpIHsKKwkJV01BX0xPR0UoIiVzIEdUSyBPZmZsb2FkIGFscmVhZHkgZW5hYmxlZC4gRGlzYWJsZSBpdCBmaXJzdCAiCisJCQkgInZkZXZfaWQgJWQiLCBfX2Z1bmNfXywgdmRldl9pZCk7CisJCXBhcmFtcy0+dWxGbGFncyA9IEdUS19PRkZMT0FEX0RJU0FCTEU7CisJCXN0YXR1cyA9IHdtYV9zZW5kX2d0a19vZmZsb2FkX3JlcSh3bWEsIHZkZXZfaWQsIHBhcmFtcyk7CisJCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlXTUFfTE9HRSgiJXMgRmFpbGVkIHRvIGRpc2FibGUgR1RLIE9mZmxvYWQiLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlXTUFfTE9HRCgiJXMgRW5hYmxlIEdUSyBPZmZsb2FkIGFnYWluIHdpdGggdXBkYXRlZCBpbnB1dHMiLAorCQkJIF9fZnVuY19fKTsKKwkJcGFyYW1zLT51bEZsYWdzID0gR1RLX09GRkxPQURfRU5BQkxFOworCX0KKwlzdGF0dXMgPSB3bWFfc2VuZF9ndGtfb2ZmbG9hZF9yZXEod21hLCB2ZGV2X2lkLCBwYXJhbXMpOworb3V0OgorCWNkZl9tZW1fZnJlZShwYXJhbXMpOworCVdNQV9MT0dEKCIlcyBFeGl0IiwgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3NfZ3RrX29mZmxvYWRfZ2V0aW5mb19yZXEoKSAtIHNlbmQgR1RLIG9mZmxvYWQgY21kIHRvIGZ3CisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcGFyYW1zOiBHVEsgb2ZmbG9hZCBwYXJhbXMKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19ndGtfb2ZmbG9hZF9nZXRpbmZvX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQl0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zIHBhcmFtcykKK3sKKwl1aW50OF90IHZkZXZfaWQ7CisJaW50IGxlbjsKKwl3bWlfYnVmX3QgYnVmOworCVdNSV9HVEtfT0ZGTE9BRF9DTURfZml4ZWRfcGFyYW0gKmNtZDsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCVdNQV9MT0dEKCIlcyBFbnRlciIsIF9fZnVuY19fKTsKKworCS8qIEdldCB0aGUgdmRldiBpZCAqLworCWlmICghd21hX2ZpbmRfdmRldl9ieV9ic3NpZCh3bWEsIHBhcmFtcy0+YnNzSWQsICZ2ZGV2X2lkKSkgeworCQlXTUFfTE9HRSgidmRldiBoYW5kbGUgaXMgaW52YWxpZCBmb3IgJXBNIiwgcGFyYW1zLT5ic3NJZCk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9JTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJbGVuID0gc2l6ZW9mKCpjbWQpOworCisJLyogYWxsb2Mgd21pIGJ1ZmZlciAqLworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCJ3bWlfYnVmX2FsbG9jIGZhaWxlZCBmb3IgV01JX0dUS19PRkZMT0FEX0NNRCIpOworCQlzdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWNtZCA9IChXTUlfR1RLX09GRkxPQURfQ01EX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX1dNSV9HVEtfT0ZGTE9BRF9DTURfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAoV01JX0dUS19PRkZMT0FEX0NNRF9maXhlZF9wYXJhbSkpOworCisJLyogUmVxdWVzdCBmb3IgR1RLIG9mZmxvYWQgc3RhdHVzICovCisJY21kLT5mbGFncyA9IEdUS19PRkZMT0FEX1JFUVVFU1RfU1RBVFVTX09QQ09ERTsKKwljbWQtPnZkZXZfaWQgPSB2ZGV2X2lkOworCisJLyogc2VuZCB0aGUgd21pIGNvbW1hbmQgKi8KKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgV01JX0dUS19PRkZMT0FEX0NNRElEKSkgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgV01JX0dUS19PRkZMT0FEX0NNRElEIGZvciByZXEgaW5mbyIpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorb3V0OgorCWNkZl9tZW1fZnJlZShwYXJhbXMpOworCVdNQV9MT0dEKCIlcyBFeGl0IiwgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FEICovCisKKy8qKgorICogd21hX2VuYWJsZV9hcnBfbnNfb2ZmbG9hZCgpIC0gZW5hYmxlIEFSUCBOUyBvZmZsb2FkCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAdHBTaXJIb3N0T2ZmbG9hZFJlcTogb2ZmbG9hZCByZXF1ZXN0CisgKiBAYkFycE9ubHk6IGZsYWcKKyAqCisgKiBUbyBjb25maWd1cmUgQVJQIE5TIG9mZiBsb2FkIGRhdGEgdG8gZmlybXdhcmUKKyAqIHdoZW4gdGFyZ2V0IGdvZXMgdG8gd293IG1vZGUuCisgKgorICogUmV0dXJuOiBDREYgU3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX2VuYWJsZV9hcnBfbnNfb2ZmbG9hZCh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJICAgIHRwU2lySG9zdE9mZmxvYWRSZXEKKwkJCQkJICAgIHBIb3N0T2ZmbG9hZFBhcmFtcywgYm9vbCBiQXJwT25seSkKK3sKKwlpbnQzMl90IGk7CisJaW50MzJfdCByZXM7CisJV01JX1NFVF9BUlBfTlNfT0ZGTE9BRF9DTURfZml4ZWRfcGFyYW0gKmNtZDsKKwlXTUlfTlNfT0ZGTE9BRF9UVVBMRSAqbnNfdHVwbGU7CisJV01JX0FSUF9PRkZMT0FEX1RVUExFICphcnBfdHVwbGU7CisJQV9VSU5UOCAqYnVmX3B0cjsKKwl3bWlfYnVmX3QgYnVmOworCWludDMyX3QgbGVuOworCXVpbnQ4X3QgdmRldl9pZDsKKwl1aW50MzJfdCBjb3VudCA9IDAsIG51bV9uc19leHRfdHVwbGVzID0gMDsKKworCS8qIEdldCB0aGUgdmRldiBpZCAqLworCWlmICghd21hX2ZpbmRfdmRldl9ieV9ic3NpZCh3bWEsIHBIb3N0T2ZmbG9hZFBhcmFtcy0+YnNzSWQsICZ2ZGV2X2lkKSkgeworCQlXTUFfTE9HRSgidmRldiBoYW5kbGUgaXMgaW52YWxpZCBmb3IgJXBNIiwKKwkJCSBwSG9zdE9mZmxvYWRQYXJhbXMtPmJzc0lkKTsKKwkJY2RmX21lbV9mcmVlKHBIb3N0T2ZmbG9hZFBhcmFtcyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJaWYgKCF3bWEtPmludGVyZmFjZXNbdmRldl9pZF0udmRldl91cCkgeworCisJCVdNQV9MT0dFKCJ2ZGV2ICVkIGlzIG5vdCB1cCBza2lwcGluZyBhcnAvbnMgb2ZmbG9hZCIsIHZkZXZfaWQpOworCQljZGZfbWVtX2ZyZWUocEhvc3RPZmZsb2FkUGFyYW1zKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmICghYkFycE9ubHkpCisJCWNvdW50ID0gcEhvc3RPZmZsb2FkUGFyYW1zLT5udW1fbnNfb2ZmbG9hZF9jb3VudDsKKworCisJbGVuID0gc2l6ZW9mKFdNSV9TRVRfQVJQX05TX09GRkxPQURfQ01EX2ZpeGVkX3BhcmFtKSArIFdNSV9UTFZfSERSX1NJWkUgKyAgICAgICAvKiBUTFYgcGxhY2UgaG9sZGVyIHNpemUgZm9yIGFycmF5IG9mIE5TIHR1cGxlcyAqLworCSAgICAgIFdNSV9NQVhfTlNfT0ZGTE9BRFMgKiBzaXplb2YoV01JX05TX09GRkxPQURfVFVQTEUpICsgV01JX1RMVl9IRFJfU0laRSArICAgLyogVExWIHBsYWNlIGhvbGRlciBzaXplIGZvciBhcnJheSBvZiBBUlAgdHVwbGVzICovCisJICAgICAgV01JX01BWF9BUlBfT0ZGTE9BRFMgKiBzaXplb2YoV01JX0FSUF9PRkZMT0FEX1RVUExFKTsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBXTUlfTUFYX05TX09GRkxPQURTIGFkZHJlc3NlcyB0aGVuIGFsbG9jYXRlCisJICogZXh0cmEgbGVuZ3RoIGZvciBleHRlbmRlZCBOUyBvZmZsb2FkIHR1cGxlcyB3aGljaCBmb2xsb3dzIEFSUCBvZmZsb2FkCisJICogdHVwbGVzLiBIb3N0IG5lZWRzIHRvIGZpbGwgdGhpcyBzdHJ1Y3R1cmUgaW4gZm9sbG93aW5nIGZvcm1hdDoKKwkgKiAyIE5TIG9mbG9hZCB0dXBsZXMKKwkgKiAyIEFSUCBvZmZsb2FkIHR1cGxlcworCSAqIE4gbnVtYmVycyBvZiBleHRlbmRlZCBOUyBvZmZsb2FkIHR1cGxlcyBpZiBIREQgaGFzIGdpdmVuIG1vcmUgdGhhbgorCSAqIDIgTlMgb2ZmbG9hZCBhZGRyZXNzZXMKKwkgKi8KKwlpZiAoIWJBcnBPbmx5ICYmIGNvdW50ID4gV01JX01BWF9OU19PRkZMT0FEUykgeworCQludW1fbnNfZXh0X3R1cGxlcyA9IGNvdW50IC0gV01JX01BWF9OU19PRkZMT0FEUzsKKwkJbGVuICs9IFdNSV9UTFZfSERSX1NJWkUgKyBudW1fbnNfZXh0X3R1cGxlcyAqCisJCQkJCXNpemVvZihXTUlfTlNfT0ZGTE9BRF9UVVBMRSk7CisJfQorCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKHBIb3N0T2ZmbG9hZFBhcmFtcyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJYnVmX3B0ciA9IChBX1VJTlQ4ICopIHdtaV9idWZfZGF0YShidWYpOworCWNtZCA9IChXTUlfU0VUX0FSUF9OU19PRkZMT0FEX0NNRF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX1dNSV9TRVRfQVJQX05TX09GRkxPQURfQ01EX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKFdNSV9TRVRfQVJQX05TX09GRkxPQURfQ01EX2ZpeGVkX3BhcmFtKSk7CisJY21kLT5mbGFncyA9IDA7CisJY21kLT52ZGV2X2lkID0gdmRldl9pZDsKKwlpZiAoIWJBcnBPbmx5KQorCQljbWQtPm51bV9uc19leHRfdHVwbGVzID0gbnVtX25zX2V4dF90dXBsZXM7CisKKwlXTUFfTE9HRCgiQVJQIE5TIE9mZmxvYWQgdmRldl9pZDogJWQiLCBjbWQtPnZkZXZfaWQpOworCisJLyogSGF2ZSBjb3B5IG9mIGFycCBpbmZvIHRvIHNlbmQgYWxvbmcgd2l0aCBOUywgU2luY2UgRlcgZXhwZWN0cworCSAqIGJvdGggQVJQIGFuZCBOUyBpbmZvIGluIHNpbmdsZSBjbWQgKi8KKwlpZiAoYkFycE9ubHkpCisJCWNkZl9tZW1fY29weSgmd21hLT5tQXJwSW5mbywgcEhvc3RPZmZsb2FkUGFyYW1zLAorCQkJICAgICBzaXplb2YodFNpckhvc3RPZmZsb2FkUmVxKSk7CisKKwlidWZfcHRyICs9IHNpemVvZihXTUlfU0VUX0FSUF9OU19PRkZMT0FEX0NNRF9maXhlZF9wYXJhbSk7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJICAgICAgIChXTUlfTUFYX05TX09GRkxPQURTICogc2l6ZW9mKFdNSV9OU19PRkZMT0FEX1RVUExFKSkpOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwlmb3IgKGkgPSAwOyBpIDwgV01JX01BWF9OU19PRkZMT0FEUzsgaSsrKSB7CisJCW5zX3R1cGxlID0gKFdNSV9OU19PRkZMT0FEX1RVUExFICopIGJ1Zl9wdHI7CisJCVdNSVRMVl9TRVRfSERSKCZuc190dXBsZS0+dGx2X2hlYWRlciwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX1dNSV9OU19PRkZMT0FEX1RVUExFLAorCQkJICAgICAgIChzaXplb2YoV01JX05TX09GRkxPQURfVFVQTEUpIC0KKwkJCQlXTUlfVExWX0hEUl9TSVpFKSk7CisKKwkJLyogRmlsbCBkYXRhIG9ubHkgZm9yIE5TIG9mZmxvYWQgaW4gdGhlIGZpcnN0IEFSUCB0dXBsZSBmb3IgTEEgKi8KKwkJaWYgKCFiQXJwT25seSAmJgorCQkgICAgKChwSG9zdE9mZmxvYWRQYXJhbXMtPmVuYWJsZU9yRGlzYWJsZSAmIFNJUl9PRkZMT0FEX0VOQUJMRSkpKSB7CisJCQluc190dXBsZS0+ZmxhZ3MgfD0gV01JX05TT0ZGX0ZMQUdTX1ZBTElEOworCisjaWZkZWYgV0xBTl9OU19PRkZMT0FECisJCQkvKkNvcHkgdGhlIHRhcmdldC9zb2xpY2l0YXRpb24vcmVtb3RlIGlwIGFkZHIgKi8KKwkJCWlmIChwSG9zdE9mZmxvYWRQYXJhbXMtPm5zT2ZmbG9hZEluZm8uCisJCQkgICAgdGFyZ2V0SVB2NkFkZHJWYWxpZFtpXSkKKwkJCQlBX01FTUNQWSgmbnNfdHVwbGUtPnRhcmdldF9pcGFkZHJbMF0sCisJCQkJCSAmcEhvc3RPZmZsb2FkUGFyYW1zLT5uc09mZmxvYWRJbmZvLgorCQkJCQkgdGFyZ2V0SVB2NkFkZHJbaV0sCisJCQkJCSBzaXplb2YoV01JX0lQVjZfQUREUikpOworCQkJQV9NRU1DUFkoJm5zX3R1cGxlLT5zb2xpY2l0YXRpb25faXBhZGRyLAorCQkJCSAmcEhvc3RPZmZsb2FkUGFyYW1zLT5uc09mZmxvYWRJbmZvLgorCQkJCSBzZWxmSVB2NkFkZHJbaV0sIHNpemVvZihXTUlfSVBWNl9BRERSKSk7CisJCQlXTUFfTE9HRCgiTlMgc29saWNpdGVkSXA6ICVwSTYsIHRhcmdldElwOiAlcEk2IiwKKwkJCQkgJnBIb3N0T2ZmbG9hZFBhcmFtcy0+bnNPZmZsb2FkSW5mby5zZWxmSVB2NkFkZHJbaV0sCisJCQkJICZwSG9zdE9mZmxvYWRQYXJhbXMtPm5zT2ZmbG9hZEluZm8uCisJCQkJIHRhcmdldElQdjZBZGRyW2ldKTsKKworCQkJLyogdGFyZ2V0IE1BQyBpcyBvcHRpb25hbCwgY2hlY2sgaWYgaXQgaXMgdmFsaWQsCisJCQkgKiBpZiB0aGlzIGlzIG5vdCB2YWxpZCwgdGhlIHRhcmdldCB3aWxsIHVzZSB0aGUga25vd24KKwkJCSAqIGxvY2FsIE1BQyBhZGRyZXNzIHJhdGhlciB0aGFuIHRoZSB0dXBsZQorCQkJICovCisJCQlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUihwSG9zdE9mZmxvYWRQYXJhbXMtPgorCQkJCQkJICAgbnNPZmZsb2FkSW5mby5zZWxmTWFjQWRkciwKKwkJCQkJCSAgICZuc190dXBsZS0+dGFyZ2V0X21hYyk7CisjZW5kaWYgLyogV0xBTl9OU19PRkZMT0FEICovCisJCQlpZiAoKG5zX3R1cGxlLT50YXJnZXRfbWFjLm1hY19hZGRyMzF0bzAgIT0gMCkgfHwKKwkJCSAgICAobnNfdHVwbGUtPnRhcmdldF9tYWMubWFjX2FkZHI0N3RvMzIgIT0gMCkpIHsKKwkJCQluc190dXBsZS0+ZmxhZ3MgfD0gV01JX05TT0ZGX0ZMQUdTX01BQ19WQUxJRDsKKwkJCX0KKwkJfQorCQlidWZfcHRyICs9IHNpemVvZihXTUlfTlNfT0ZGTE9BRF9UVVBMRSk7CisJfQorCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJICAgICAgIChXTUlfTUFYX0FSUF9PRkZMT0FEUyAqIHNpemVvZihXTUlfQVJQX09GRkxPQURfVFVQTEUpKSk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCWZvciAoaSA9IDA7IGkgPCBXTUlfTUFYX0FSUF9PRkZMT0FEUzsgaSsrKSB7CisJCWFycF90dXBsZSA9IChXTUlfQVJQX09GRkxPQURfVFVQTEUgKikgYnVmX3B0cjsKKwkJV01JVExWX1NFVF9IRFIoJmFycF90dXBsZS0+dGx2X2hlYWRlciwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX1dNSV9BUlBfT0ZGTE9BRF9UVVBMRSwKKwkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oV01JX0FSUF9PRkZMT0FEX1RVUExFKSk7CisKKwkJLyogRmlsbCBkYXRhIGZvciBBUlAgYW5kIE5TIGluIHRoZSBmaXJzdCB0dXBwbGUgZm9yIExBICovCisJCWlmICgod21hLT5tQXJwSW5mby5lbmFibGVPckRpc2FibGUgJiBTSVJfT0ZGTE9BRF9FTkFCTEUpCisJCSAgICAmJiAoaSA9PSAwKSkgeworCQkJLypDb3B5IHRoZSB0YXJnZXQgaXAgYWRkciBhbmQgZmxhZ3MgKi8KKwkJCWFycF90dXBsZS0+ZmxhZ3MgPSBXTUlfQVJQT0ZGX0ZMQUdTX1ZBTElEOworCQkJQV9NRU1DUFkoJmFycF90dXBsZS0+dGFyZ2V0X2lwYWRkciwKKwkJCQkgd21hLT5tQXJwSW5mby5wYXJhbXMuaG9zdElwdjRBZGRyLAorCQkJCSBTSVJfSVBWNF9BRERSX0xFTik7CisJCQlXTUFfTE9HRCgiQVJQT2ZmbG9hZCBJUDQgYWRkcmVzczogJXBJNCIsCisJCQkJIHdtYS0+bUFycEluZm8ucGFyYW1zLmhvc3RJcHY0QWRkcik7CisJCX0KKwkJYnVmX3B0ciArPSBzaXplb2YoV01JX0FSUF9PRkZMT0FEX1RVUExFKTsKKwl9CisKKwkvKiBQb3B1bGF0ZSBleHRlbmRlZCBOUyBvZmZsb2FkIHR1cGxlcyAqLworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCQkJCShudW1fbnNfZXh0X3R1cGxlcypzaXplb2YoV01JX05TX09GRkxPQURfVFVQTEUpKSk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCisJaWYgKG51bV9uc19leHRfdHVwbGVzKSB7CisJCWZvciAoaSA9IFdNSV9NQVhfTlNfT0ZGTE9BRFM7IGkgPCBjb3VudDsgaSsrKSB7CisJCQluc190dXBsZSA9IChXTUlfTlNfT0ZGTE9BRF9UVVBMRSAqKWJ1Zl9wdHI7CisJCQlXTUlUTFZfU0VUX0hEUigmbnNfdHVwbGUtPnRsdl9oZWFkZXIsCisJCQkJV01JVExWX1RBR19TVFJVQ19XTUlfTlNfT0ZGTE9BRF9UVVBMRSwKKwkJCQkoc2l6ZW9mKFdNSV9OU19PRkZMT0FEX1RVUExFKS1XTUlfVExWX0hEUl9TSVpFKSk7CisKKwkJCS8qIEZpbGwgZGF0YSBvbmx5IGZvciBOUyBvZmZsb2FkIGluIHRoZSBmaXJzdCBBUlAgdHVwbGUgZm9yIExBICovCisJCQlpZiAoIWJBcnBPbmx5ICAmJgorCQkJCSgocEhvc3RPZmZsb2FkUGFyYW1zLT5lbmFibGVPckRpc2FibGUgJiBTSVJfT0ZGTE9BRF9FTkFCTEUpKSkgeworCQkJCW5zX3R1cGxlLT5mbGFncyB8PSBXTUlfTlNPRkZfRkxBR1NfVkFMSUQ7CisjaWZkZWYgV0xBTl9OU19PRkZMT0FECisJCQkJLypDb3B5IHRoZSB0YXJnZXQvc29saWNpdGF0aW9uL3JlbW90ZSBpcCBhZGRyICovCisJCQkJaWYgKHBIb3N0T2ZmbG9hZFBhcmFtcy0+bnNPZmZsb2FkSW5mby50YXJnZXRJUHY2QWRkclZhbGlkW2ldKQorCQkJCQlBX01FTUNQWSgmbnNfdHVwbGUtPnRhcmdldF9pcGFkZHJbMF0sCisJCQkJCQkmcEhvc3RPZmZsb2FkUGFyYW1zLT5uc09mZmxvYWRJbmZvLnRhcmdldElQdjZBZGRyW2ldLAorCQkJCQkJc2l6ZW9mKFdNSV9JUFY2X0FERFIpKTsKKwkJCQlBX01FTUNQWSgmbnNfdHVwbGUtPnNvbGljaXRhdGlvbl9pcGFkZHIsCisJCQkJCSZwSG9zdE9mZmxvYWRQYXJhbXMtPm5zT2ZmbG9hZEluZm8uc2VsZklQdjZBZGRyW2ldLAorCQkJCQlzaXplb2YoV01JX0lQVjZfQUREUikpOworCQkJCVdNQV9MT0dEKCJJbmRleCAlZCBOUyBzb2xpY2l0ZWRJcDogJXBJNiwgdGFyZ2V0SXA6ICVwSTYiLCBpLAorCQkJCQkmcEhvc3RPZmZsb2FkUGFyYW1zLT5uc09mZmxvYWRJbmZvLnNlbGZJUHY2QWRkcltpXSwKKwkJCQkJJnBIb3N0T2ZmbG9hZFBhcmFtcy0+bnNPZmZsb2FkSW5mby50YXJnZXRJUHY2QWRkcltpXSk7CisKKwkJCQkvKiB0YXJnZXQgTUFDIGlzIG9wdGlvbmFsLCBjaGVjayBpZiBpdCBpcyB2YWxpZCwgaWYgdGhpcyBpcyBub3QgdmFsaWQsCisJCQkJICogdGhlIHRhcmdldCB3aWxsIHVzZSB0aGUga25vd24gbG9jYWwgTUFDIGFkZHJlc3MgcmF0aGVyIHRoYW4gdGhlIHR1cGxlICovCisJCQkJIFdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKHBIb3N0T2ZmbG9hZFBhcmFtcy0+bnNPZmZsb2FkSW5mby5zZWxmTWFjQWRkciwKKwkJCQkJJm5zX3R1cGxlLT50YXJnZXRfbWFjKTsKKyNlbmRpZgorCQkJCWlmICgobnNfdHVwbGUtPnRhcmdldF9tYWMubWFjX2FkZHIzMXRvMCAhPSAwKSB8fAorCQkJCQkobnNfdHVwbGUtPnRhcmdldF9tYWMubWFjX2FkZHI0N3RvMzIgIT0gMCkpIHsKKwkJCQkJbnNfdHVwbGUtPmZsYWdzIHw9IFdNSV9OU09GRl9GTEFHU19NQUNfVkFMSUQ7CisJCQkJfQorCQkJfQorCQkJYnVmX3B0ciArPSBzaXplb2YoV01JX05TX09GRkxPQURfVFVQTEUpOworCQl9CisJfQorCisJcmVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICAgIFdNSV9TRVRfQVJQX05TX09GRkxPQURfQ01ESUQpOworCWlmIChyZXMpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBlbmFibGUgQVJQIE5EUC9OU2ZmbG9hZCIpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJY2RmX21lbV9mcmVlKHBIb3N0T2ZmbG9hZFBhcmFtcyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwljZGZfbWVtX2ZyZWUocEhvc3RPZmZsb2FkUGFyYW1zKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9wcm9jZXNzX2FkZF9wZXJpb2RpY190eF9wdHJuX2luZCAtIGFkZCBwZXJpb2RpYyB0eCBwdHJuCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcEFkZFBlcmlvZGljVHhQdHJuUGFyYW1zOiB0eCBwdHJuIHBhcmFtcworICoKKyAqIFJldHJ1bjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX2FkZF9wZXJpb2RpY190eF9wdHJuX2luZChXTUFfSEFORExFIGhhbmRsZSwKKwkJCQkJCXRTaXJBZGRQZXJpb2RpY1R4UHRybiAqCisJCQkJCQlwQWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlXTUlfQUREX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IHdtaV9idWY7CisJdWludDMyX3QgbGVuOworCXVpbnQ4X3QgdmRldl9pZDsKKwl1aW50OF90ICpidWZfcHRyOworCXVpbnQzMl90IHB0cm5fbGVuLCBwdHJuX2xlbl9hbGlnbmVkOworCWludCBqOworCisJaWYgKCF3bWFfaGFuZGxlIHx8ICF3bWFfaGFuZGxlLT53bWlfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogV01BIGlzIGNsb3NlZCwgY2FuIG5vdCBpc3N1ZSBmdyBhZGQgcGF0dGVybiBjbWQiLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJcHRybl9sZW4gPSBwQWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMtPnVjUHRyblNpemU7CisJcHRybl9sZW5fYWxpZ25lZCA9IHJvdW5kdXAocHRybl9sZW4sIHNpemVvZih1aW50MzJfdCkpOworCWxlbiA9IHNpemVvZihXTUlfQUREX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtKSArCisJICAgICAgV01JX1RMVl9IRFJfU0laRSArIHB0cm5fbGVuX2FsaWduZWQ7CisKKwl3bWlfYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghd21pX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwlpZiAoIXdtYV9maW5kX3ZkZXZfYnlfYWRkcih3bWFfaGFuZGxlLAorCQkJCSAgIHBBZGRQZXJpb2RpY1R4UHRyblBhcmFtcy0+bWFjQWRkcmVzcywKKwkJCQkgICAmdmRldl9pZCkpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCB2ZGV2IGlkIGZvciAlcE0iLCBfX2Z1bmNfXywKKwkJCSBwQWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMtPm1hY0FkZHJlc3MpOworCQljZGZfbmJ1Zl9mcmVlKHdtaV9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKHdtaV9idWYpOworCisJY21kID0gKFdNSV9BRERfUFJPQUNUSVZFX0FSUF9SU1BfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ19XTUlfQUREX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKFdNSV9BRERfUFJPQUNUSVZFX0FSUF9SU1BfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0pKTsKKworCS8qIFBhc3MgdGhlIHBhdHRlcm4gaWQgdG8gZGVsZXRlIGZvciB0aGUgY29ycmVzcG9uZGluZyB2ZGV2IGlkICovCisJY21kLT52ZGV2X2lkID0gdmRldl9pZDsKKwljbWQtPnBhdHRlcm5faWQgPSBwQWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMtPnVjUHRybklkOworCWNtZC0+dGltZW91dCA9IHBBZGRQZXJpb2RpY1R4UHRyblBhcmFtcy0+dXNQdHJuSW50ZXJ2YWxNczsKKwljbWQtPmxlbmd0aCA9IHBBZGRQZXJpb2RpY1R4UHRyblBhcmFtcy0+dWNQdHJuU2l6ZTsKKworCS8qIFBhdHRlcm4gaW5mbyAqLworCWJ1Zl9wdHIgKz0gc2l6ZW9mKFdNSV9BRERfUFJPQUNUSVZFX0FSUF9SU1BfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0pOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgcHRybl9sZW5fYWxpZ25lZCk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCWNkZl9tZW1fY29weShidWZfcHRyLCBwQWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMtPnVjUGF0dGVybiwgcHRybl9sZW4pOworCWZvciAoaiA9IDA7IGogPCBwQWRkUGVyaW9kaWNUeFB0cm5QYXJhbXMtPnVjUHRyblNpemU7IGorKykgeworCQlXTUFfTE9HRCgiJXM6IEFkZCBQdHJuOiAlMDJ4IiwgX19mdW5jX18sIGJ1Zl9wdHJbal0gJiAweGZmKTsKKwl9CisJV01BX0xPR0QoIiVzOiBBZGQgcHRybiBpZDogJWQgdmRldl9pZDogJWQiLAorCQkgX19mdW5jX18sIGNtZC0+cGF0dGVybl9pZCwgY21kLT52ZGV2X2lkKTsKKworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCB3bWlfYnVmLCBsZW4sCisJCQkJIFdNSV9BRERfUFJPQUNUSVZFX0FSUF9SU1BfUEFUVEVSTl9DTURJRCkpIHsKKwkJV01BX0xPR0UoIiVzOiBmYWlsZWQgdG8gYWRkIHBhdHRlcm4gc2V0IHN0YXRlIGNvbW1hbmQiLAorCQkJIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZSh3bWlfYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9wcm9jZXNzX2RlbF9wZXJpb2RpY190eF9wdHJuX2luZCAtIGRlbCBwZXJpb2RpYyB0eCBwdHJuCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcERlbFBlcmlvZGljVHhQdHJuUGFyYW1zOiB0eCBwdHJuIHBhcmFtcworICoKKyAqIFJldHJ1bjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX2RlbF9wZXJpb2RpY190eF9wdHJuX2luZChXTUFfSEFORExFIGhhbmRsZSwKKwkJCQkJCXRTaXJEZWxQZXJpb2RpY1R4UHRybiAqCisJCQkJCQlwRGVsUGVyaW9kaWNUeFB0cm5QYXJhbXMpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlXTUlfREVMX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IHdtaV9idWY7CisJdWludDhfdCB2ZGV2X2lkOworCXVpbnQzMl90IGxlbiA9CisJCXNpemVvZihXTUlfREVMX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtKTsKKworCWlmICghd21hX2hhbmRsZSB8fCAhd21hX2hhbmRsZS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBpcyBjbG9zZWQsIGNhbiBub3QgaXNzdWUgRGVsIFBhdHRlcm4gY21kIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCXdtaV9idWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCF3bWlfYnVmKSB7CisJCVdNQV9MT0dFKCIlczogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCWlmICghd21hX2ZpbmRfdmRldl9ieV9hZGRyKHdtYV9oYW5kbGUsCisJCQkJICAgcERlbFBlcmlvZGljVHhQdHJuUGFyYW1zLT5tYWNBZGRyZXNzLAorCQkJCSAgICZ2ZGV2X2lkKSkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHZkZXYgaWQgZm9yICVwTSIsIF9fZnVuY19fLAorCQkJIHBEZWxQZXJpb2RpY1R4UHRyblBhcmFtcy0+bWFjQWRkcmVzcyk7CisJCWNkZl9uYnVmX2ZyZWUod21pX2J1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCWNtZCA9IChXTUlfREVMX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtICopCisJCXdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ19XTUlfREVMX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKFdNSV9ERUxfUFJPQUNUSVZFX0FSUF9SU1BfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0pKTsKKworCS8qIFBhc3MgdGhlIHBhdHRlcm4gaWQgdG8gZGVsZXRlIGZvciB0aGUgY29ycmVzcG9uZGluZyB2ZGV2IGlkICovCisJY21kLT52ZGV2X2lkID0gdmRldl9pZDsKKwljbWQtPnBhdHRlcm5faWQgPSBwRGVsUGVyaW9kaWNUeFB0cm5QYXJhbXMtPnVjUHRybklkOworCVdNQV9MT0dEKCIlczogRGVsIHB0cm4gaWQ6ICVkIHZkZXZfaWQ6ICVkIiwKKwkJIF9fZnVuY19fLCBjbWQtPnBhdHRlcm5faWQsIGNtZC0+dmRldl9pZCk7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgd21pX2J1ZiwgbGVuLAorCQkJCSBXTUlfREVMX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01ESUQpKSB7CisJCVdNQV9MT0dFKCIlczogZmFpbGVkIHRvIHNlbmQgZGVsIHBhdHRlcm4gY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZSh3bWlfYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1NUQVRTX0VYVAorLyoqCisgKiB3bWFfc3RhdHNfZXh0X3JlcSgpIC0gcmVxdWVzdCBleHQgc3RhdHMgZnJvbSBmdworICogQHdtYV9wdHI6IHdtYSBoYW5kbGUKKyAqIEBwcmVxOiBzdGF0cyBleHQgcGFyYW1zCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3N0YXRzX2V4dF9yZXEodm9pZCAqd21hX3B0ciwgdHBTdGF0c0V4dFJlcXVlc3QgcHJlcSkKK3sKKwlpbnQzMl90IHJldDsKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSB3bWFfcHRyOworCXdtaV9yZXFfc3RhdHNfZXh0X2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJdWludDE2X3QgbGVuOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisKKwlsZW4gPSBzaXplb2YoKmNtZCkgKyBXTUlfVExWX0hEUl9TSVpFICsgcHJlcS0+cmVxdWVzdF9kYXRhX2xlbjsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczp3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCWNtZCA9ICh3bWlfcmVxX3N0YXRzX2V4dF9jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZXFfc3RhdHNfZXh0X2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcmVxX3N0YXRzX2V4dF9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSBwcmVxLT52ZGV2X2lkOworCWNtZC0+ZGF0YV9sZW4gPSBwcmVxLT5yZXF1ZXN0X2RhdGFfbGVuOworCisJV01BX0xPR0QoIiVzOiBUaGUgZGF0YSBsZW4gdmFsdWUgaXMgJXUgYW5kIHZkZXYgaWQgc2V0IGlzICV1ICIsCisJCSBfX2Z1bmNfXywgcHJlcS0+cmVxdWVzdF9kYXRhX2xlbiwgcHJlcS0+dmRldl9pZCk7CisKKwlidWZfcHRyICs9IHNpemVvZih3bWlfcmVxX3N0YXRzX2V4dF9jbWRfZml4ZWRfcGFyYW0pOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgY21kLT5kYXRhX2xlbik7CisKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJY2RmX21lbV9jb3B5KGJ1Zl9wdHIsIHByZXEtPnJlcXVlc3RfZGF0YSwgY21kLT5kYXRhX2xlbik7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9SRVFVRVNUX1NUQVRTX0VYVF9DTURJRCk7CisJaWYgKHJldCAhPSBFT0spIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gc2VuZCBub3RpZnkgY21kIHJldCA9ICVkIiwgX19mdW5jX18sCisJCQkgcmV0KTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9TVEFUU19FWFQgKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9FWFRXT1dfU1VQUE9SVAorLyoqCisgKiB3bWFfc2VuZF9zdGF0dXNfb2ZfZXh0X3dvdygpIC0gc2VuZCBleHQgd293IHN0YXR1cyB0byBTTUUKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBzdGF0dXM6IHN0YXR1cworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfc2VuZF9zdGF0dXNfb2ZfZXh0X3dvdyh0cF93bWFfaGFuZGxlIHdtYSwgYm9vbCBzdGF0dXMpCit7CisJdFNpclJlYWR5VG9FeHRXb1dJbmQgKnJlYWR5X3RvX2V4dHdvdzsKKwlDREZfU1RBVFVTIHZzdGF0dXM7CisJY2RzX21zZ190IGNkc19tc2c7CisJdWludDhfdCBsZW47CisKKwlXTUFfTE9HRCgiUG9zdGluZyByZWFkeSB0byBzdXNwZW5kIGluZGljYXRpb24gdG8gdW1hYyIpOworCisJbGVuID0gc2l6ZW9mKHRTaXJSZWFkeVRvRXh0V29XSW5kKTsKKwlyZWFkeV90b19leHR3b3cgPSAodFNpclJlYWR5VG9FeHRXb1dJbmQgKikgY2RmX21lbV9tYWxsb2MobGVuKTsKKworCWlmIChOVUxMID09IHJlYWR5X3RvX2V4dHdvdykgeworCQlXTUFfTE9HRSgiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlyZWFkeV90b19leHR3b3ctPm1lc2dUeXBlID0gZVdOSV9TTUVfUkVBRFlfVE9fRVhUV09XX0lORDsKKwlyZWFkeV90b19leHR3b3ctPm1lc2dMZW4gPSBsZW47CisJcmVhZHlfdG9fZXh0d293LT5zdGF0dXMgPSBzdGF0dXM7CisKKwljZHNfbXNnLnR5cGUgPSBlV05JX1NNRV9SRUFEWV9UT19FWFRXT1dfSU5EOworCWNkc19tc2cuYm9keXB0ciA9ICh2b2lkICopcmVhZHlfdG9fZXh0d293OworCWNkc19tc2cuYm9keXZhbCA9IDA7CisKKwl2c3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfU01FLCAmY2RzX21zZyk7CisJaWYgKHZzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcG9zdCByZWFkeSB0byBzdXNwZW5kIik7CisJCWNkZl9tZW1fZnJlZShyZWFkeV90b19leHR3b3cpOworCX0KK30KKworLyoqCisgKiB3bWFfZW5hYmxlX2V4dF93b3coKSAtIGVuYWJsZSBleHQgd293IGluIGZ3CisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcGFyYW1zOiBleHQgd293IHBhcmFtcworICoKKyAqIFJldHVybjowIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV9lbmFibGVfZXh0X3dvdyh0cF93bWFfaGFuZGxlIHdtYSwgdHBTaXJFeHRXb1dQYXJhbXMgcGFyYW1zKQoreworCXdtaV9leHR3b3dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW47CisJaW50IHJldDsKKworCWxlbiA9IHNpemVvZih3bWlfZXh0d293X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0pOworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIGFsbG9jYXRlIHdtaSBidWZmZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY21kID0gKHdtaV9leHR3b3dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHR3b3dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfZXh0d293X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+dmRldl9pZCA9IHBhcmFtcy0+dmRldl9pZDsKKwljbWQtPnR5cGUgPSBwYXJhbXMtPnR5cGU7CisJY21kLT53YWtldXBfcGluX251bSA9IHBhcmFtcy0+d2FrZXVwX3Bpbl9udW07CisKKwlXTUFfTE9HRCgiJXM6IHZkZXZfaWQgJWQgdHlwZSAlZCBXYWtldXBfcGluX251bSAleCIsCisJCSBfX2Z1bmNfXywgY21kLT52ZGV2X2lkLCBjbWQtPnR5cGUsIGNtZC0+d2FrZXVwX3Bpbl9udW0pOworCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfRVhUV09XX0VOQUJMRV9DTURJRCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgRVhUV09XIEVuYWJsZSIsIF9fZnVuY19fKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXdtYV9zZW5kX3N0YXR1c19vZl9leHRfd293KHdtYSwgZmFsc2UpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJd21hX3NlbmRfc3RhdHVzX29mX2V4dF93b3cod21hLCB0cnVlKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCit9CisKKy8qKgorICogd21hX3NldF9hcHBfdHlwZTFfcGFyYW1zX2luX2Z3KCkgLSBzZXQgYXBwIHR5cGUxIHBhcmFtcyBpbiBmdworICogQHdtYTogd21hIGhhbmRsZQorICogQGFwcFR5cGUxUGFyYW1zOiBhcHAgdHlwZTEgcGFyYW1zCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK2ludCB3bWFfc2V0X2FwcF90eXBlMV9wYXJhbXNfaW5fZncodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJICAgdHBTaXJBcHBUeXBlMVBhcmFtcyBhcHBUeXBlMVBhcmFtcykKK3sKKwl3bWlfZXh0d293X3NldF9hcHBfdHlwZTFfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW47CisJaW50IHJldDsKKworCWxlbiA9IHNpemVvZih3bWlfZXh0d293X3NldF9hcHBfdHlwZTFfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2NhdGUgd21pIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljbWQgPSAod21pX2V4dHdvd19zZXRfYXBwX3R5cGUxX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0gKikKKwkgICAgICB3bWlfYnVmX2RhdGEoYnVmKTsKKworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHR3b3dfc2V0X2FwcF90eXBlMV9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9leHR3b3dfc2V0X2FwcF90eXBlMV9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwljbWQtPnZkZXZfaWQgPSBhcHBUeXBlMVBhcmFtcy0+dmRldl9pZDsKKwlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUihhcHBUeXBlMVBhcmFtcy0+d2FrZWVfbWFjX2FkZHIsCisJCQkJICAgJmNtZC0+d2FrZWVfbWFjKTsKKwljZGZfbWVtX2NvcHkoY21kLT5pZGVudCwgYXBwVHlwZTFQYXJhbXMtPmlkZW50aWZpY2F0aW9uX2lkLCA4KTsKKwljbWQtPmlkZW50X2xlbiA9IGFwcFR5cGUxUGFyYW1zLT5pZF9sZW5ndGg7CisJY2RmX21lbV9jb3B5KGNtZC0+cGFzc3dkLCBhcHBUeXBlMVBhcmFtcy0+cGFzc3dvcmQsIDE2KTsKKwljbWQtPnBhc3N3ZF9sZW4gPSBhcHBUeXBlMVBhcmFtcy0+cGFzc19sZW5ndGg7CisKKwlXTUFfTE9HRCgiJXM6IHZkZXZfaWQgJWQgd2FrZWVfbWFjX2FkZHIgJXBNICIKKwkJICJpZGVudGlmaWNhdGlvbl9pZCAlLjhzIGlkX2xlbmd0aCAldSAiCisJCSAicGFzc3dvcmQgJS4xNnMgcGFzc19sZW5ndGggJXUiLAorCQkgX19mdW5jX18sIGNtZC0+dmRldl9pZCwgYXBwVHlwZTFQYXJhbXMtPndha2VlX21hY19hZGRyLAorCQkgY21kLT5pZGVudCwgY21kLT5pZGVudF9sZW4sIGNtZC0+cGFzc3dkLCBjbWQtPnBhc3N3ZF9sZW4pOworCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfRVhUV09XX1NFVF9BUFBfVFlQRTFfUEFSQU1TX0NNRElEKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNldCBBUFAgVFlQRTEgUEFSQU1TIiwgX19mdW5jX18pOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3NldF9hcHBfdHlwZTJfcGFyYW1zX2luX2Z3KCkgLSBzZXQgYXBwIHR5cGUyIHBhcmFtcyBpbiBmdworICogQHdtYTogd21hIGhhbmRsZQorICogQGFwcFR5cGUyUGFyYW1zOiBhcHAgdHlwZTIgcGFyYW1zCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK2ludCB3bWFfc2V0X2FwcF90eXBlMl9wYXJhbXNfaW5fZncodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCSAgdHBTaXJBcHBUeXBlMlBhcmFtcyBhcHBUeXBlMlBhcmFtcykKK3sKKwl3bWlfZXh0d293X3NldF9hcHBfdHlwZTJfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW47CisJaW50IHJldDsKKworCWxlbiA9IHNpemVvZih3bWlfZXh0d293X3NldF9hcHBfdHlwZTJfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2NhdGUgd21pIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljbWQgPSAod21pX2V4dHdvd19zZXRfYXBwX3R5cGUyX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0gKikKKwkgICAgICB3bWlfYnVmX2RhdGEoYnVmKTsKKworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHR3b3dfc2V0X2FwcF90eXBlMl9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9leHR3b3dfc2V0X2FwcF90eXBlMl9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwljbWQtPnZkZXZfaWQgPSBhcHBUeXBlMlBhcmFtcy0+dmRldl9pZDsKKworCWNkZl9tZW1fY29weShjbWQtPnJjNF9rZXksIGFwcFR5cGUyUGFyYW1zLT5yYzRfa2V5LCAxNik7CisJY21kLT5yYzRfa2V5X2xlbiA9IGFwcFR5cGUyUGFyYW1zLT5yYzRfa2V5X2xlbjsKKworCWNtZC0+aXBfaWQgPSBhcHBUeXBlMlBhcmFtcy0+aXBfaWQ7CisJY21kLT5pcF9kZXZpY2VfaXAgPSBhcHBUeXBlMlBhcmFtcy0+aXBfZGV2aWNlX2lwOworCWNtZC0+aXBfc2VydmVyX2lwID0gYXBwVHlwZTJQYXJhbXMtPmlwX3NlcnZlcl9pcDsKKworCWNtZC0+dGNwX3NyY19wb3J0ID0gYXBwVHlwZTJQYXJhbXMtPnRjcF9zcmNfcG9ydDsKKwljbWQtPnRjcF9kc3RfcG9ydCA9IGFwcFR5cGUyUGFyYW1zLT50Y3BfZHN0X3BvcnQ7CisJY21kLT50Y3Bfc2VxID0gYXBwVHlwZTJQYXJhbXMtPnRjcF9zZXE7CisJY21kLT50Y3BfYWNrX3NlcSA9IGFwcFR5cGUyUGFyYW1zLT50Y3BfYWNrX3NlcTsKKworCWNtZC0+a2VlcGFsaXZlX2luaXQgPSBhcHBUeXBlMlBhcmFtcy0+a2VlcGFsaXZlX2luaXQ7CisJY21kLT5rZWVwYWxpdmVfbWluID0gYXBwVHlwZTJQYXJhbXMtPmtlZXBhbGl2ZV9taW47CisJY21kLT5rZWVwYWxpdmVfbWF4ID0gYXBwVHlwZTJQYXJhbXMtPmtlZXBhbGl2ZV9tYXg7CisJY21kLT5rZWVwYWxpdmVfaW5jID0gYXBwVHlwZTJQYXJhbXMtPmtlZXBhbGl2ZV9pbmM7CisKKwlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUihhcHBUeXBlMlBhcmFtcy0+Z2F0ZXdheV9tYWMsCisJCQkJICAgJmNtZC0+Z2F0ZXdheV9tYWMpOworCWNtZC0+dGNwX3R4X3RpbWVvdXRfdmFsID0gYXBwVHlwZTJQYXJhbXMtPnRjcF90eF90aW1lb3V0X3ZhbDsKKwljbWQtPnRjcF9yeF90aW1lb3V0X3ZhbCA9IGFwcFR5cGUyUGFyYW1zLT50Y3BfcnhfdGltZW91dF92YWw7CisKKwlXTUFfTE9HRCgiJXM6IHZkZXZfaWQgJWQgZ2F0ZXdheV9tYWMgJXBNICIKKwkJICJyYzRfa2V5ICUuMTZzIHJjNF9rZXlfbGVuICV1ICIKKwkJICJpcF9pZCAleCBpcF9kZXZpY2VfaXAgJXggaXBfc2VydmVyX2lwICV4ICIKKwkJICJ0Y3Bfc3JjX3BvcnQgJXUgdGNwX2RzdF9wb3J0ICV1IHRjcF9zZXEgJXUgIgorCQkgInRjcF9hY2tfc2VxICV1IGtlZXBhbGl2ZV9pbml0ICV1IGtlZXBhbGl2ZV9taW4gJXUgIgorCQkgImtlZXBhbGl2ZV9tYXggJXUga2VlcGFsaXZlX2luYyAldSAiCisJCSAidGNwX3R4X3RpbWVvdXRfdmFsICV1IHRjcF9yeF90aW1lb3V0X3ZhbCAldSIsCisJCSBfX2Z1bmNfXywgY21kLT52ZGV2X2lkLCBhcHBUeXBlMlBhcmFtcy0+Z2F0ZXdheV9tYWMsCisJCSBjbWQtPnJjNF9rZXksIGNtZC0+cmM0X2tleV9sZW4sCisJCSBjbWQtPmlwX2lkLCBjbWQtPmlwX2RldmljZV9pcCwgY21kLT5pcF9zZXJ2ZXJfaXAsCisJCSBjbWQtPnRjcF9zcmNfcG9ydCwgY21kLT50Y3BfZHN0X3BvcnQsIGNtZC0+dGNwX3NlcSwKKwkJIGNtZC0+dGNwX2Fja19zZXEsIGNtZC0+a2VlcGFsaXZlX2luaXQsIGNtZC0+a2VlcGFsaXZlX21pbiwKKwkJIGNtZC0+a2VlcGFsaXZlX21heCwgY21kLT5rZWVwYWxpdmVfaW5jLAorCQkgY21kLT50Y3BfdHhfdGltZW91dF92YWwsIGNtZC0+dGNwX3J4X3RpbWVvdXRfdmFsKTsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX0VYVFdPV19TRVRfQVBQX1RZUEUyX1BBUkFNU19DTURJRCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgQVBQIFRZUEUyIFBBUkFNUyIsIF9fZnVuY19fKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgorLyoqCisgKiB3bWFfYXV0b19zaHV0ZG93bl9ldmVudF9oYW5kbGVyKCkgLSBwcm9jZXNzIGF1dG8gc2h1dGRvd24gdGltZXIgdHJpZ2dlcgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGV2ZW50OiBldmVudCBidWZmZXIKKyAqIEBsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX2F1dG9fc2h1dGRvd25fZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50LAorCQkJCSAgICB1aW50MzJfdCBsZW4pCit7CisJd21pX2hvc3RfYXV0b19zaHV0ZG93bl9ldmVudF9maXhlZF9wYXJhbSAqd21pX2F1dG9fc2hfZXZ0OworCVdNSV9IT1NUX0FVVE9fU0hVVERPV05fRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWYgPQorCQkoV01JX0hPU1RfQVVUT19TSFVURE9XTl9FVkVOVElEX3BhcmFtX3RsdnMgKikKKwkJZXZlbnQ7CisKKwlpZiAoIXBhcmFtX2J1ZiB8fCAhcGFyYW1fYnVmLT5maXhlZF9wYXJhbSkgeworCQlXTUFfTE9HRSgiJXM6JWQ6IEludmFsaWQgQXV0byBzaHV0ZG93biB0aW1lciBldnQiLCBfX2Z1bmNfXywKKwkJCSBfX0xJTkVfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdtaV9hdXRvX3NoX2V2dCA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisKKwlpZiAod21pX2F1dG9fc2hfZXZ0LT5zaHV0ZG93bl9yZWFzb24KKwkgICAgIT0gV01JX0hPU1RfQVVUT19TSFVURE9XTl9SRUFTT05fVElNRVJfRVhQSVJZKSB7CisJCVdNQV9MT0dFKCIlczolZDogSW52YWxpZCBBdXRvIHNodXRkb3duIHRpbWVyIGV2dCIsIF9fZnVuY19fLAorCQkJIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJV01BX0xPR0QoIiVzOiVkOiBBdXRvIFNodXRkb3duIEV2dDogJWQiLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCSB3bWlfYXV0b19zaF9ldnQtPnNodXRkb3duX3JlYXNvbik7CisJcmV0dXJuIHdtYV9wb3N0X2F1dG9fc2h1dGRvd25fbXNnKCk7Cit9CisKKy8qKgorICogd21hX3NldF9hdXRvX3NodXRkb3duX3RpbWVyX3JlcSgpIC0gc2V0cyBhdXRvIHNodXRkb3duIHRpbWVyIGluIGZpcm13YXJlCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAYXV0b19zaF9jbWQ6IGF1dG8gc2h1dGRvd24gdGltZXIgdmFsdWUKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfc2V0X2F1dG9fc2h1dGRvd25fdGltZXJfcmVxKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJCSAgdFNpckF1dG9TaHV0ZG93bkNtZFBhcmFtcyAqCisJCQkJCQkgIGF1dG9fc2hfY21kKQoreworCWludCBzdGF0dXMgPSAwOworCXdtaV9idWZfdCBidWYgPSBOVUxMOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX2hvc3RfYXV0b19zaHV0ZG93bl9jZmdfY21kX2ZpeGVkX3BhcmFtICp3bWlfYXV0b19zaF9jbWQ7CisJaW50IGxlbiA9IHNpemVvZih3bWlfaG9zdF9hdXRvX3NodXRkb3duX2NmZ19jbWRfZml4ZWRfcGFyYW0pOworCisJaWYgKGF1dG9fc2hfY21kID09IE5VTEwpIHsKKwkJV01BX0xPR0UoIiVzIDogSW52YWxpZCBBdXRvc2h1dGRvd24gY2ZnIGNtZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCVdNQV9MT0dEKCIlczogU2V0IFdNSV9IT1NUX0FVVE9fU0hVVERPV05fQ0ZHX0NNRElEOlRJTUVSX1ZBTD0lZCIsCisJCSBfX2Z1bmNfXywgYXV0b19zaF9jbWQtPnRpbWVyX3ZhbCk7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzIDogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCXdtaV9hdXRvX3NoX2NtZCA9CisJCSh3bWlfaG9zdF9hdXRvX3NodXRkb3duX2NmZ19jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwl3bWlfYXV0b19zaF9jbWQtPnRpbWVyX3ZhbHVlID0gYXV0b19zaF9jbWQtPnRpbWVyX3ZhbDsKKworCVdNSVRMVl9TRVRfSERSKCZ3bWlfYXV0b19zaF9jbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ob3N0X2F1dG9fc2h1dGRvd25fY2ZnX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfaG9zdF9hdXRvX3NodXRkb3duX2NmZ19jbWRfZml4ZWRfcGFyYW0pKTsKKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgICAgICBsZW4sIFdNSV9IT1NUX0FVVE9fU0hVVERPV05fQ0ZHX0NNRElEKTsKKwlpZiAoc3RhdHVzICE9IEVPSykgeworCQlXTUFfTE9HRSgiJXM6IFdNSV9IT1NUX0FVVE9fU0hVVERPV05fQ0ZHX0NNRElEIEVyciAlZCIsCisJCQkgX19mdW5jX18sIHN0YXR1cyk7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTiAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorLyoqCisgKiB3bWFfbmFuX3JlcSgpIC0gdG8gc2VuZCBuYW4gcmVxdWVzdCB0byB0YXJnZXQKKyAqIEB3bWE6IHdtYV9oYW5kbGUKKyAqIEBuYW5fcmVxOiByZXF1ZXN0IGRhdGEgd2hpY2ggd2lsbCBiZSBub24tbnVsbAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9uYW5fcmVxKHZvaWQgKndtYV9wdHIsIHRwTmFuUmVxdWVzdCBuYW5fcmVxKQoreworCWludCByZXQ7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIHdtYV9wdHI7CisJd21pX25hbl9jbWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQxNl90IGxlbiA9IHNpemVvZigqY21kKTsKKwl1aW50MTZfdCBuYW5fZGF0YV9sZW4sIG5hbl9kYXRhX2xlbl9hbGlnbmVkOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisKKwkvKgorCSAqICAgIDwtLS0tLSBjbWQgLS0tLS0tLS0tLS0tPjwtLSBXTUlfVExWX0hEUl9TSVpFIC0tPjwtLS0gZGF0YSAtLS0tPgorCSAqICAgICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKwkgKiAgICB8IHRsdl9oZWFkZXIgfCBkYXRhX2xlbiB8IFdNSVRMVl9UQUdfQVJSQVlfQllURSB8IG5hbl9yZXFfZGF0YSB8CisJICogICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworCSAqLworCWlmICghbmFuX3JlcSkgeworCQlXTUFfTE9HRSgiJXM6bmFuIHJlcSBpcyBub3QgdmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJbmFuX2RhdGFfbGVuID0gbmFuX3JlcS0+cmVxdWVzdF9kYXRhX2xlbjsKKwluYW5fZGF0YV9sZW5fYWxpZ25lZCA9IHJvdW5kdXAobmFuX3JlcS0+cmVxdWVzdF9kYXRhX2xlbiwKKwkJCQkgICAgICAgc2l6ZW9mKHVpbnQzMl90KSk7CisJbGVuICs9IFdNSV9UTFZfSERSX1NJWkUgKyBuYW5fZGF0YV9sZW5fYWxpZ25lZDsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOndtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJY21kID0gKHdtaV9uYW5fY21kX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX25hbl9jbWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX25hbl9jbWRfcGFyYW0pKTsKKwljbWQtPmRhdGFfbGVuID0gbmFuX3JlcS0+cmVxdWVzdF9kYXRhX2xlbjsKKwlXTUFfTE9HRCgiJXM6IFRoZSBkYXRhIGxlbiB2YWx1ZSBpcyAldSIsCisJCSBfX2Z1bmNfXywgbmFuX3JlcS0+cmVxdWVzdF9kYXRhX2xlbik7CisJYnVmX3B0ciArPSBzaXplb2Yod21pX25hbl9jbWRfcGFyYW0pOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgbmFuX2RhdGFfbGVuX2FsaWduZWQpOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwljZGZfbWVtX2NvcHkoYnVmX3B0ciwgbmFuX3JlcS0+cmVxdWVzdF9kYXRhLCBjbWQtPmRhdGFfbGVuKTsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9OQU5fQ01ESUQpOworCWlmIChyZXQgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCIlcyBGYWlsZWQgdG8gc2VuZCBzZXQgcGFyYW0gY29tbWFuZCByZXQgPSAlZCIsCisJCQkgX19mdW5jX18sIHJldCk7CisJCXdtaV9idWZfZnJlZShidWYpOworCX0KKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9OQU4gKi8KKworI2lmZGVmIERIQ1BfU0VSVkVSX09GRkxPQUQKKy8qKgorICogd21hX3Byb2Nlc3NfZGhjcHNlcnZlcl9vZmZsb2FkKCkgLSBlbmFibGUgREhDUCBzZXJ2ZXIgb2ZmbG9hZAorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBwRGhjcFNydk9mZmxvYWRJbmZvOiBESENQIHNlcnZlciBvZmZsb2FkIGluZm8KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX3Byb2Nlc3NfZGhjcHNlcnZlcl9vZmZsb2FkKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJICB0U2lyRGhjcFNydk9mZmxvYWRJbmZvICoKKwkJCQkJICBwRGhjcFNydk9mZmxvYWRJbmZvKQoreworCXdtaV9zZXRfZGhjcF9zZXJ2ZXJfb2ZmbG9hZF9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCWludCBlcnI7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIHNpemVvZigqY21kKSk7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgdG8gc2VuZCAiCisJCQkgInNldF9kaGNwX3NlcnZlcl9vZmZsb2FkIGNtZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljbWQgPSAod21pX3NldF9kaGNwX3NlcnZlcl9vZmZsb2FkX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwljZGZfbWVtX3plcm8oY21kLCBzaXplb2YoKmNtZCkpOworCisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NldF9kaGNwX3NlcnZlcl9vZmZsb2FkX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfc2V0X2RoY3Bfc2VydmVyX29mZmxvYWRfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gcERoY3BTcnZPZmZsb2FkSW5mby0+dmRldl9pZDsKKwljbWQtPmVuYWJsZSA9IHBEaGNwU3J2T2ZmbG9hZEluZm8tPmRoY3BTcnZPZmZsb2FkRW5hYmxlZDsKKwljbWQtPm51bV9jbGllbnQgPSBwRGhjcFNydk9mZmxvYWRJbmZvLT5kaGNwQ2xpZW50TnVtOworCWNtZC0+c3J2X2lwdjQgPSBwRGhjcFNydk9mZmxvYWRJbmZvLT5kaGNwU3J2SVA7CisJY21kLT5zdGFydF9sc2IgPSAwOworCWVyciA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgICBzaXplb2YoKmNtZCksCisJCQkJICAgV01JX1NFVF9ESENQX1NFUlZFUl9PRkZMT0FEX0NNRElEKTsKKwlpZiAoZXJyKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCBzZXRfZGhjcF9zZXJ2ZXJfb2ZmbG9hZCBjbWQiKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiAtRUlPOworCX0KKwlXTUFfTE9HRCgiU2V0IGRoY3Agc2VydmVyIG9mZmxvYWQgdG8gdmRldklkICVkIiwKKwkJIHBEaGNwU3J2T2ZmbG9hZEluZm8tPnZkZXZfaWQpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIERIQ1BfU0VSVkVSX09GRkxPQUQgKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9HUElPX0xFRF9GTEFTSElORworLyoqCisgKiB3bWFfc2V0X2xlZF9mbGFzaGluZygpIC0gc2V0IGxlZCBmbGFzaGluZyBpbiBmdworICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBmbGFzaGluZzogZmxhc2hpbmcgcmVxdWVzdAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9zZXRfbGVkX2ZsYXNoaW5nKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQl0U2lyTGVkRmxhc2hpbmdSZXEgKmZsYXNoaW5nKQoreworCXdtaV9zZXRfbGVkX2ZsYXNoaW5nX2NtZF9maXhlZF9wYXJhbSAqY21kOworCWludCBzdGF0dXMgPSAwOworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwlpbnQzMl90IGxlbiA9IHNpemVvZih3bWlfc2V0X2xlZF9mbGFzaGluZ19jbWRfZml4ZWRfcGFyYW0pOworCisJaWYgKCF3bWFfaGFuZGxlIHx8ICF3bWFfaGFuZGxlLT53bWlfaGFuZGxlKSB7CisJCVdNQV9MT0dFKEZMKCJXTUEgaXMgY2xvc2VkLCBjYW4gbm90IGlzc3VlIGNtZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJaWYgKCFmbGFzaGluZykgeworCQlXTUFfTE9HRShGTCgiaW52YWxpZCBwYXJhbWV0ZXI6IGZsYXNoaW5nIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HUChGTCgid21pX2J1Zl9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJY21kID0gKHdtaV9zZXRfbGVkX2ZsYXNoaW5nX2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zZXRfbGVkX2ZsYXNoaW5nX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfc2V0X2xlZF9mbGFzaGluZ19jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnBhdHRlcm5faWQgPSBmbGFzaGluZy0+cGF0dGVybl9pZDsKKwljbWQtPmxlZF94MCA9IGZsYXNoaW5nLT5sZWRfeDA7CisJY21kLT5sZWRfeDEgPSBmbGFzaGluZy0+bGVkX3gxOworCisJc3RhdHVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgICAgV01JX1BERVZfU0VUX0xFRF9GTEFTSElOR19DTURJRCk7CisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfdW5pZmllZF9jbWRfc2VuZCBXTUlfUEVFUl9TRVRfUEFSQU1fQ01EIgorCQkJICIgcmV0dXJuZWQgRXJyb3IgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9HUElPX0xFRF9GTEFTSElORyAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NIX0FWT0lECisvKioKKyAqIHdtYV9jaGFubmVsX2F2b2lkX2V2dF9oYW5kbGVyKCkgLSAgcHJvY2VzcyBjaGFubmVsIHRvIGF2b2lkIGV2ZW50IGZyb20gRlcuCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZXZlbnQ6IGV2ZW50IGJ1ZmZlcgorICogQGxlbjogYnVmZmVyIGxlbmd0aAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfY2hhbm5lbF9hdm9pZF9ldnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50LAorCQkJCSAgdWludDMyX3QgbGVuKQoreworCXdtaV9hdm9pZF9mcmVxX3Jhbmdlc19ldmVudF9maXhlZF9wYXJhbSAqYWZyX2ZpeGVkX3BhcmFtOworCXdtaV9hdm9pZF9mcmVxX3JhbmdlX2Rlc2MgKmFmcl9kZXNjOworCXVpbnQzMl90IG51bV9mcmVxX3JhbmdlcywgZnJlcV9yYW5nZV9pZHg7CisJdFNpckNoQXZvaWRJbmRUeXBlICpzY2FfaW5kaWNhdGlvbjsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJY2RzX21zZ190IHNtZV9tc2cgPSB7IDAgfTsKKwlXTUlfV0xBTl9GUkVRX0FWT0lEX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmID0KKwkJKFdNSV9XTEFOX0ZSRVFfQVZPSURfRVZFTlRJRF9wYXJhbV90bHZzICopIGV2ZW50OworCisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgY2hhbm5lbCBhdm9pZCBldmVudCBidWZmZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWZyX2ZpeGVkX3BhcmFtID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlpZiAoIWFmcl9maXhlZF9wYXJhbSkgeworCQlXTUFfTE9HRSgiSW52YWxpZCBjaGFubmVsIGF2b2lkIGV2ZW50IGZpeGVkIHBhcmFtIGJ1ZmZlciIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwludW1fZnJlcV9yYW5nZXMgPQorCQkoYWZyX2ZpeGVkX3BhcmFtLT5udW1fZnJlcV9yYW5nZXMgPgorCQkgU0lSX0NIX0FWT0lEX01BWF9SQU5HRSkgPyBTSVJfQ0hfQVZPSURfTUFYX1JBTkdFIDoKKwkJYWZyX2ZpeGVkX3BhcmFtLT5udW1fZnJlcV9yYW5nZXM7CisKKwlXTUFfTE9HRCgiQ2hhbm5lbCBhdm9pZCBldmVudCByZWNlaXZlZCB3aXRoICVkIHJhbmdlcyIsCisJCSBudW1fZnJlcV9yYW5nZXMpOworCWZvciAoZnJlcV9yYW5nZV9pZHggPSAwOyBmcmVxX3JhbmdlX2lkeCA8IG51bV9mcmVxX3JhbmdlczsKKwkgICAgIGZyZXFfcmFuZ2VfaWR4KyspIHsKKwkJYWZyX2Rlc2MgPSAod21pX2F2b2lkX2ZyZXFfcmFuZ2VfZGVzYyAqKQorCQkJCSgodm9pZCAqKXBhcmFtX2J1Zi0+YXZkX2ZyZXFfcmFuZ2UgKworCQkJCWZyZXFfcmFuZ2VfaWR4ICogc2l6ZW9mKHdtaV9hdm9pZF9mcmVxX3JhbmdlX2Rlc2MpKTsKKworCQlXTUFfTE9HRCgicmFuZ2UgJWQ6IHRsdiBpZCA9ICV1LCBzdGFydCBmcmVxID0gJXUsICBlbmQgZnJlcSA9ICV1IiwKKwkJCWZyZXFfcmFuZ2VfaWR4LCBhZnJfZGVzYy0+dGx2X2hlYWRlciwgYWZyX2Rlc2MtPnN0YXJ0X2ZyZXEsCisJCQlhZnJfZGVzYy0+ZW5kX2ZyZXEpOworCX0KKworCXNjYV9pbmRpY2F0aW9uID0gKHRTaXJDaEF2b2lkSW5kVHlwZSAqKQorCQkJIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyQ2hBdm9pZEluZFR5cGUpKTsKKwlpZiAoIXNjYV9pbmRpY2F0aW9uKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIGNoYW5uZWwgYXZvaWQgaW5kaWNhdGlvbiBidWZmZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2NhX2luZGljYXRpb24tPmF2b2lkX3JhbmdlX2NvdW50ID0gbnVtX2ZyZXFfcmFuZ2VzOworCWZvciAoZnJlcV9yYW5nZV9pZHggPSAwOyBmcmVxX3JhbmdlX2lkeCA8IG51bV9mcmVxX3JhbmdlczsKKwkgICAgIGZyZXFfcmFuZ2VfaWR4KyspIHsKKwkJYWZyX2Rlc2MgPSAod21pX2F2b2lkX2ZyZXFfcmFuZ2VfZGVzYyAqKQorCQkJCSgodm9pZCAqKXBhcmFtX2J1Zi0+YXZkX2ZyZXFfcmFuZ2UgKworCQkJCWZyZXFfcmFuZ2VfaWR4ICogc2l6ZW9mKHdtaV9hdm9pZF9mcmVxX3JhbmdlX2Rlc2MpKTsKKwkJc2NhX2luZGljYXRpb24tPmF2b2lkX2ZyZXFfcmFuZ2VbZnJlcV9yYW5nZV9pZHhdLnN0YXJ0X2ZyZXEgPQorCQkJYWZyX2Rlc2MtPnN0YXJ0X2ZyZXE7CisJCXNjYV9pbmRpY2F0aW9uLT5hdm9pZF9mcmVxX3JhbmdlW2ZyZXFfcmFuZ2VfaWR4XS5lbmRfZnJlcSA9CisJCQlhZnJfZGVzYy0+ZW5kX2ZyZXE7CisJfQorCisJc21lX21zZy50eXBlID0gZVdOSV9TTUVfQ0hfQVZPSURfSU5EOworCXNtZV9tc2cuYm9keXB0ciA9IHNjYV9pbmRpY2F0aW9uOworCXNtZV9tc2cuYm9keXZhbCA9IDA7CisKKwljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1NNRSwgJnNtZV9tc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCVdNQV9MT0dFKCJGYWlsIHRvIHBvc3QgZVdOSV9TTUVfQ0hfQVZPSURfSU5EIG1zZyB0byBTTUUiKTsKKwkJY2RmX21lbV9mcmVlKHNjYV9pbmRpY2F0aW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3NfY2hfYXZvaWRfdXBkYXRlX3JlcSgpIC0gaGFuZGxlcyBjaGFubmVsIGF2b2lkIHVwZGF0ZSByZXF1ZXN0CisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQGNoX2F2b2lkX3VwZGF0ZV9yZXE6IGNoYW5uZWwgYXZvaWQgdXBkYXRlIHBhcmFtcworICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX2NoX2F2b2lkX3VwZGF0ZV9yZXEodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgICB0U2lyQ2hBdm9pZFVwZGF0ZVJlcSAqCisJCQkJCSAgIGNoX2F2b2lkX3VwZGF0ZV9yZXEpCit7CisJaW50IHN0YXR1cyA9IDA7CisJd21pX2J1Zl90IGJ1ZiA9IE5VTEw7CisJdWludDhfdCAqYnVmX3B0cjsKKwl3bWlfY2hhbl9hdm9pZF91cGRhdGVfY21kX3BhcmFtICpjaF9hdm9pZF91cGRhdGVfZnA7CisJaW50IGxlbiA9IHNpemVvZih3bWlfY2hhbl9hdm9pZF91cGRhdGVfY21kX3BhcmFtKTsKKworCWlmIChjaF9hdm9pZF91cGRhdGVfcmVxID09IE5VTEwpIHsKKwkJV01BX0xPR0UoIiVzIDogY2hfYXZvaWRfdXBkYXRlX3JlcSBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJV01BX0xPR0koIiVzOiBXTUEgLS0+IFdNSV9DSEFOX0FWT0lEX1VQREFURSIsIF9fZnVuY19fKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXMgOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJY2hfYXZvaWRfdXBkYXRlX2ZwID0gKHdtaV9jaGFuX2F2b2lkX3VwZGF0ZV9jbWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY2hfYXZvaWRfdXBkYXRlX2ZwLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfY2hhbl9hdm9pZF91cGRhdGVfY21kX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9jaGFuX2F2b2lkX3VwZGF0ZV9jbWRfcGFyYW0pKTsKKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgICAgICBsZW4sIFdNSV9DSEFOX0FWT0lEX1VQREFURV9DTURJRCk7CisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIndtaV91bmlmaWVkX2NtZF9zZW5kIgorCQkJICIgV01JVExWX1RBQkxFX1dNSV9DSEFOX0FWT0lEX1VQREFURSIKKwkJCSAiIHJldHVybmVkIEVycm9yICVkIiwgc3RhdHVzKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlXTUFfTE9HSSgiJXM6IFdNQSAtLT4gV01JX0NIQU5fQVZPSURfVVBEQVRFIHNlbnQgdGhyb3VnaCBXTUkiLAorCQkgX19mdW5jX18pOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NIX0FWT0lEICovCisKKy8qKgorICogd21hX3NldF9yZWdfZG9tYWluKCkgLSBzZXQgcmVnIGRvbWFpbgorICogQGNsaWVudEN0eHQ6IGNsaWVudCBjb250ZXh0CisgKiBAcmVnSWQ6IHJlZyBpZAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9zZXRfcmVnX2RvbWFpbih2b2lkICpjbGllbnRDdHh0LCB2X1JFR0RPTUFJTl90IHJlZ0lkKQoreworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkgICAgY2RzX3NldF9yZWdfZG9tYWluKGNsaWVudEN0eHQsIHJlZ0lkKSkKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3NlbmRfcmVnZG9tYWluX2luZm9fdG9fZncoKSAtIHNlbmQgcmVnZG9tYWluIGluZm8gdG8gZncKKyAqIEByZWdfZG1uOiByZWcgZG9tYWluCisgKiBAcmVnZG1uMkc6IDJHIHJlZyBkb21haW4KKyAqIEByZWdkbW41RzogNUcgcmVnIGRvbWFpbgorICogQGN0bDJHOiAyRyB0ZXN0IGxpbWl0CisgKiBAY3RsNUc6IDVHIHRlc3QgbGltaXQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfc2VuZF9yZWdkb21haW5faW5mb190b19mdyh1aW50MzJfdCByZWdfZG1uLCB1aW50MTZfdCByZWdkbW4yRywKKwkJCQkgICB1aW50MTZfdCByZWdkbW41RywgaW50OF90IGN0bDJHLAorCQkJCSAgIGludDhfdCBjdGw1RykKK3sKKwl3bWlfYnVmX3QgYnVmOworCXdtaV9wZGV2X3NldF9yZWdkb21haW5fY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJaW50MzJfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisJdHBfd21hX2hhbmRsZSB3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWludDMyX3QgY2NrX21hc2tfdmFsID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChOVUxMID09IHdtYSkgeworCQlXTUFfTE9HRSgiJXM6IHdtYSBjb250ZXh0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HUCgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWNtZCA9ICh3bWlfcGRldl9zZXRfcmVnZG9tYWluX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zZXRfcmVnZG9tYWluX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcGRldl9zZXRfcmVnZG9tYWluX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+cmVnX2RvbWFpbiA9IHJlZ19kbW47CisJY21kLT5yZWdfZG9tYWluXzJHID0gcmVnZG1uMkc7CisJY21kLT5yZWdfZG9tYWluXzVHID0gcmVnZG1uNUc7CisJY21kLT5jb25mb3JtYW5jZV90ZXN0X2xpbWl0XzJHID0gY3RsMkc7CisJY21kLT5jb25mb3JtYW5jZV90ZXN0X2xpbWl0XzVHID0gY3RsNUc7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgV01JX1BERVZfU0VUX1JFR0RPTUFJTl9DTURJRCkpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gc2VuZCBwZGV2IHNldCByZWdkb21haW4gY29tbWFuZCIsCisJCQkgX19mdW5jX18pOworCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJfQorCisJaWYgKCgoKHJlZ19kbW4gJiB+Q09VTlRSWV9FUkRfRkxBRykgPT0gQ1RSWV9KQVBBTikgfHwKKwkgICAgICgocmVnX2RtbiAmIH5DT1VOVFJZX0VSRF9GTEFHKSA9PSBDVFJZX0tPUkVBX1JPQykpICYmCisJICAgICh0cnVlID09IHdtYS0+dHhfY2hhaW5fbWFza19jY2spKQorCQljY2tfbWFza192YWwgPSAxOworCisJY2NrX21hc2tfdmFsIHw9ICh3bWEtPnNlbGZfZ2VuX2ZybV9wd3IgPDwgMTYpOworCXJldCA9IHdtaV91bmlmaWVkX3BkZXZfc2V0X3BhcmFtKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJIFdNSV9QREVWX1BBUkFNX1RYX0NIQUlOX01BU0tfQ0NLLAorCQkJCQkgY2NrX21hc2tfdmFsKTsKKwlpZiAocmV0KQorCQlXTUFfTE9HRSgiZmFpbGVkIHRvIHNldCBQREVWIHR4X2NoYWluX21hc2tfY2NrICVkIiwKKwkJCSByZXQpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIHdtYV9idXNfc3VzcGVuZCgpIC0gaGFuZGxlcyBidXMgc3VzcGVuZCByZXF1ZXN0IGZyb20gaGRkCisgKgorICogQ2FsbHMgdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBhbmQgZXZlbnQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX2J1c19zdXNwZW5kKHZvaWQpCit7CisJV01BX0hBTkRMRSBoYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmIChOVUxMID09IGhhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IHdtYSBjb250ZXh0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCVdNQV9MT0dFKCIlczogd293IG1vZGUgc2VsZWN0ZWQgJWQiLCBfX2Z1bmNfXywKKwkgICAgICAgd21hX2lzX3dvd19tb2RlX3NlbGVjdGVkKGhhbmRsZSkpOworCisJaWYgKHdtYV9jaGVja19zY2FuX2luX3Byb2dyZXNzKGhhbmRsZSkpIHsKKwkJV01BX0xPR0UoIiVzOiBTY2FuIGluIHByb2dyZXNzLiBBYm9ydGluZyBzdXNwZW5kIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICh3bWFfaXNfd293X21vZGVfc2VsZWN0ZWQoaGFuZGxlKSkKKwkJcmV0dXJuIGNkZl9zdGF0dXNfdG9fb3NfcmV0dXJuKHdtYV9lbmFibGVfd293X2luX2Z3KGhhbmRsZSkpOworCisJcmV0dXJuIHdtYV9zdXNwZW5kX3RhcmdldChoYW5kbGUsIDApOworfQorCisvKioKKyAqIHdtYV9idXNfcmVzdW1lKCkgLSBoYW5kbGVzIGJ1cyByZXN1bWUgcmVxdWVzdCBmcm9tIGhkZAorICogQGhhbmRsZTogdmFsaWQgd21hIGhhbmRsZQorICoKKyAqIENhbGxzIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX2J1c19yZXN1bWUodm9pZCkKK3sKKwlXTUFfSEFORExFIGhhbmRsZSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaW50IHdvd19tb2RlOworCWlmIChOVUxMID09IGhhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IHdtYSBjb250ZXh0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXdvd19tb2RlID0gd21hX2lzX3dvd19tb2RlX3NlbGVjdGVkKGhhbmRsZSk7CisJV01BX0xPR0UoIiVzOiB3b3cgbW9kZSAlZCIsIF9fZnVuY19fLCB3b3dfbW9kZSk7CisKKwlpZiAoIXdvd19tb2RlKQorCQlyZXR1cm4gd21hX3Jlc3VtZV90YXJnZXQoaGFuZGxlKTsKKworCXJldHVybiBjZGZfc3RhdHVzX3RvX29zX3JldHVybih3bWFfZGlzYWJsZV93b3dfaW5fZncoaGFuZGxlKSk7Cit9CisKKy8qKgorICogd21hX3N1c3BlbmRfdGFyZ2V0KCkgLSBzdXNwZW5kIHRhcmdldAorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGRpc2FibGVfdGFyZ2V0X2ludHI6IGRpc2FibGUgdGFyZ2V0IGludGVycnVwdAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfc3VzcGVuZF90YXJnZXQoV01BX0hBTkRMRSBoYW5kbGUsIGludCBkaXNhYmxlX3RhcmdldF9pbnRyKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJd21pX3BkZXZfc3VzcGVuZF9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3Qgd21pYnVmOworCXVpbnQzMl90IGxlbiA9IHNpemVvZigqY21kKTsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbjsKKwlpbnQgcmV0OworCisJaWYgKCF3bWFfaGFuZGxlIHx8ICF3bWFfaGFuZGxlLT53bWlfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCJXTUEgaXMgY2xvc2VkLiBjYW4gbm90IGlzc3VlIHN1c3BlbmQgY21kIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKgorCSAqIHNlbmQgdGhlIGNvbWFuZCB0byBUYXJnZXQgdG8gaWdub3JlIHRoZQorCSAqIFBDSUUgcmVzZXQgc28gYXMgdG8gZW5zdXJlIHRoYXQgSG9zdCBhbmQgdGFyZ2V0CisJICogc3RhdGVzIGFyZSBpbiBzeW5jCisJICovCisJd21pYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICh3bWlidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbWQgPSAod21pX3BkZXZfc3VzcGVuZF9jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKHdtaWJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc3VzcGVuZF9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3BkZXZfc3VzcGVuZF9jbWRfZml4ZWRfcGFyYW0pKTsKKwlpZiAoZGlzYWJsZV90YXJnZXRfaW50cikgeworCQljbWQtPnN1c3BlbmRfb3B0ID0gV01JX1BERVZfU1VTUEVORF9BTkRfRElTQUJMRV9JTlRSOworCX0gZWxzZSB7CisJCWNtZC0+c3VzcGVuZF9vcHQgPSBXTUlfUERFVl9TVVNQRU5EOworCX0KKwljZGZfZXZlbnRfcmVzZXQoJndtYV9oYW5kbGUtPnRhcmdldF9zdXNwZW5kKTsKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCB3bWlidWYsIGxlbiwKKwkJCQkgV01JX1BERVZfU1VTUEVORF9DTURJRCk7CisJaWYgKHJldCA8IDApIHsKKwkJY2RmX25idWZfZnJlZSh3bWlidWYpOworCQlyZXR1cm4gcmV0OworCX0KKworCXdtaV9zZXRfdGFyZ2V0X3N1c3BlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgdHJ1ZSk7CisKKwlpZiAoY2RmX3dhaXRfc2luZ2xlX2V2ZW50KCZ3bWFfaGFuZGxlLT50YXJnZXRfc3VzcGVuZCwKKwkJCQkgIFdNQV9UR1RfU1VTUEVORF9DT01QTEVURV9USU1FT1VUKQorCSAgICAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBnZXQgQUNLIGZyb20gZmlybXdhcmUgZm9yIHBkZXYgc3VzcGVuZCIpOworCQl3bWlfc2V0X3RhcmdldF9zdXNwZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGZhbHNlKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc2NuID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKworCWlmIChzY24gPT0gTlVMTCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgSElGIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWh0Y19jYW5jZWxfZGVmZXJyZWRfdGFyZ2V0X3NsZWVwKHNjbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfdGFyZ2V0X3N1c3BlbmRfYWNrbm93bGVkZ2UoKSAtIHVwZGF0ZSB0YXJnZXQgc3Vzc3BlbmQgc3RhdHVzCisgKiBAY29udGV4dDogd21hIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfdGFyZ2V0X3N1c3BlbmRfYWNrbm93bGVkZ2Uodm9pZCAqY29udGV4dCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaW50IHdvd19uYWNrID0gKigoaW50ICopY29udGV4dCk7CisKKwlpZiAoTlVMTCA9PSB3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWEgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXdtYS0+d293X25hY2sgPSB3b3dfbmFjazsKKwljZGZfZXZlbnRfc2V0KCZ3bWEtPnRhcmdldF9zdXNwZW5kKTsKKwlpZiAod293X25hY2spCisJCWNkZl93YWtlX2xvY2tfdGltZW91dF9hY3F1aXJlKCZ3bWEtPndvd193YWtlX2xvY2ssCisJCQkJCSAgICAgIFdNQV9XQUtFX0xPQ0tfVElNRU9VVCwKKwkJCQkJICAgICAgV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19XT1cpOworfQorCisvKioKKyAqIHdtYV9yZXN1bWVfdGFyZ2V0KCkgLSByZXN1bWUgdGFyZ2V0CisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV9yZXN1bWVfdGFyZ2V0KFdNQV9IQU5ETEUgaGFuZGxlKQoreworCWludCByZXQ7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCXdtaV9idWZfdCB3bWlidWY7CisJd21pX3BkZXZfcmVzdW1lX2NtZF9maXhlZF9wYXJhbSAqY21kOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKyNpZmRlZiBDT05GSUdfQ05TUworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisJaWYgKE5VTEwgPT0gcE1hYykgeworCQlXTUFfTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgUEUgY29udGV4dCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmIC8qIENPTkZJR19DTlNTICovCisKKwl3bWlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAod21pYnVmID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNtZCA9ICh3bWlfcGRldl9yZXN1bWVfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YSh3bWlidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3Jlc3VtZV9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3BkZXZfcmVzdW1lX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+cmVzZXJ2ZWQwID0gMDsKKwljZGZfZXZlbnRfcmVzZXQoJndtYS0+d21hX3Jlc3VtZV9ldmVudCk7CisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCB3bWlidWYsIHNpemVvZigqY21kKSwKKwkJCQkgICBXTUlfUERFVl9SRVNVTUVfQ01ESUQpOworCWlmIChyZXQgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCBXTUlfUERFVl9SRVNVTUVfQ01ESUQgY29tbWFuZCIpOworCQl3bWlfYnVmX2ZyZWUod21pYnVmKTsKKwl9CisKKwljZGZfc3RhdHVzID0gY2RmX3dhaXRfc2luZ2xlX2V2ZW50KCYod21hLT53bWFfcmVzdW1lX2V2ZW50KSwKKwkJCVdNQV9SRVNVTUVfVElNRU9VVCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfc3RhdHVzKSB7CisJCVdNQV9MT0dQKCIlczogVGltZW91dCB3YWl0aW5nIGZvciByZXN1bWUgZXZlbnQgZnJvbSBGVyIsCisJCQlfX2Z1bmNfXyk7CisJCVdNQV9MT0dQKCIlczogUGVuZGluZyBjb21tYW5kcyAlZCBjcmVkaXRzICVkIiwgX19mdW5jX18sCisJCQl3bWlfZ2V0X3BlbmRpbmdfY21kcyh3bWEtPndtaV9oYW5kbGUpLAorCQkJd21pX2dldF9ob3N0X2NyZWRpdHMod21hLT53bWlfaGFuZGxlKSk7CisJCWlmICghY2RzX2lzX2xvZ3BfaW5fcHJvZ3Jlc3MoKSkgeworI2lmZGVmIENPTkZJR19DTlNTCisJCQlpZiAocE1hYy0+c21lLmVuYWJsZVNlbGZSZWNvdmVyeSkgeworCQkJCWNkc190cmlnZ2VyX3JlY292ZXJ5KCk7CisJCQl9IGVsc2UgeworCQkJCUNERl9CVUcoMCk7CisJCQl9CisjZWxzZQorCQkJQ0RGX0JVRygwKTsKKyNlbmRpZiAvKiBDT05GSUdfQ05TUyAqLworCQl9IGVsc2UgeworCQkJV01BX0xPR0UoIiVzOiBTU1IgaW4gcHJvZ3Jlc3MsIGlnbm9yZSByZXN1bWUgdGltZW91dCIsCisJCQkJX19mdW5jX18pOworCQl9CisJfSBlbHNlIHsKKwkJV01BX0xPR0QoIkhvc3Qgd2FrZXVwIHJlY2VpdmVkIik7CisJfQorCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyA9PSBjZGZfc3RhdHVzKQorCQl3bWlfc2V0X3RhcmdldF9zdXNwZW5kKHdtYS0+d21pX2hhbmRsZSwgZmFsc2UpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfZ2V0X21vZGVzZWxlY3QoKSAtIGdldCBtb2RlU2VsZWN0IGZsYWcgYmFzZWQgb24gcGh5X2NhcGFiaWxpdHkKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBtb2RlU2VsZWN0OiBtb2RlIFNlbGVjdAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9nZXRfbW9kZXNlbGVjdCh0cF93bWFfaGFuZGxlIHdtYSwgdWludDMyX3QgKm1vZGVTZWxlY3QpCit7CisKKwlzd2l0Y2ggKHdtYS0+cGh5X2NhcGFiaWxpdHkpIHsKKwljYXNlIFdNSV8xMUdfQ0FQQUJJTElUWToKKwljYXNlIFdNSV8xMU5HX0NBUEFCSUxJVFk6CisJCSptb2RlU2VsZWN0ICY9IH4oUkVHRE1OX01PREVfMTFBIHwgUkVHRE1OX01PREVfVFVSQk8gfAorCQkJCSBSRUdETU5fTU9ERV8xMDhBIHwgUkVHRE1OX01PREVfMTFBX0hBTEZfUkFURSB8CisJCQkJIFJFR0RNTl9NT0RFXzExQV9RVUFSVEVSX1JBVEUgfAorCQkJCSBSRUdETU5fTU9ERV8xMU5BX0hUMjAgfAorCQkJCSBSRUdETU5fTU9ERV8xMU5BX0hUNDBQTFVTIHwKKwkJCQkgUkVHRE1OX01PREVfMTFOQV9IVDQwTUlOVVMgfAorCQkJCSBSRUdETU5fTU9ERV8xMUFDX1ZIVDIwIHwKKwkJCQkgUkVHRE1OX01PREVfMTFBQ19WSFQ0MFBMVVMgfAorCQkJCSBSRUdETU5fTU9ERV8xMUFDX1ZIVDQwTUlOVVMgfAorCQkJCSBSRUdETU5fTU9ERV8xMUFDX1ZIVDgwKTsKKwkJYnJlYWs7CisJY2FzZSBXTUlfMTFBX0NBUEFCSUxJVFk6CisJY2FzZSBXTUlfMTFOQV9DQVBBQklMSVRZOgorCWNhc2UgV01JXzExQUNfQ0FQQUJJTElUWToKKwkJKm1vZGVTZWxlY3QgJj0gfihSRUdETU5fTU9ERV8xMUIgfCBSRUdETU5fTU9ERV8xMUcgfAorCQkJCSBSRUdETU5fTU9ERV8xMDhHIHwgUkVHRE1OX01PREVfMTFOR19IVDIwIHwKKwkJCQkgUkVHRE1OX01PREVfMTFOR19IVDQwUExVUyB8CisJCQkJIFJFR0RNTl9NT0RFXzExTkdfSFQ0ME1JTlVTIHwKKwkJCQkgUkVHRE1OX01PREVfMTFBQ19WSFQyMF8yRyB8CisJCQkJIFJFR0RNTl9NT0RFXzExQUNfVkhUNDBfMkcgfAorCQkJCSBSRUdETU5fTU9ERV8xMUFDX1ZIVDgwXzJHKTsKKwkJYnJlYWs7CisJfQorfQorCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworLyoqCisgKiB3bWFfdGRsc19ldmVudF9oYW5kbGVyKCkgLSBoYW5kbGUgVERMUyBldmVudAorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGV2ZW50OiBldmVudCBidWZmZXIKKyAqIEBsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX3RkbHNfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50LCB1aW50MzJfdCBsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCVdNSV9URExTX1BFRVJfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWYgPSBOVUxMOworCXdtaV90ZGxzX3BlZXJfZXZlbnRfZml4ZWRfcGFyYW0gKnBlZXJfZXZlbnQgPSBOVUxMOworCXRTaXJUZGxzRXZlbnRub3RpZnkgKnRkbHNfZXZlbnQ7CisKKwlpZiAoIWV2ZW50KSB7CisJCVdNQV9MT0dFKCIlczogZXZlbnQgcGFyYW0gbnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFyYW1fYnVmID0gKFdNSV9URExTX1BFRVJfRVZFTlRJRF9wYXJhbV90bHZzICopIGV2ZW50OworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCIlczogcmVjZWl2ZWQgbnVsbCBidWYgZnJvbSB0YXJnZXQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBlZXJfZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCWlmICghcGVlcl9ldmVudCkgeworCQlXTUFfTE9HRSgiJXM6IHJlY2VpdmVkIG51bGwgZXZlbnQgZGF0YSBmcm9tIHRhcmdldCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGRsc19ldmVudCA9ICh0U2lyVGRsc0V2ZW50bm90aWZ5ICopCisJCSAgICAgY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCp0ZGxzX2V2ZW50KSk7CisJaWYgKCF0ZGxzX2V2ZW50KSB7CisJCVdNQV9MT0dFKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGRsc19ldmVudCIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0ZGxzX2V2ZW50LT5zZXNzaW9uSWQgPSBwZWVyX2V2ZW50LT52ZGV2X2lkOworCVdNSV9NQUNfQUREUl9UT19DSEFSX0FSUkFZKCZwZWVyX2V2ZW50LT5wZWVyX21hY2FkZHIsCisJCQkJICAgdGRsc19ldmVudC0+cGVlck1hYyk7CisKKwlzd2l0Y2ggKHBlZXJfZXZlbnQtPnBlZXJfc3RhdHVzKSB7CisJY2FzZSBXTUlfVERMU19TSE9VTERfRElTQ09WRVI6CisJCXRkbHNfZXZlbnQtPm1lc3NhZ2VUeXBlID0gV01BX1RETFNfU0hPVUxEX0RJU0NPVkVSX0NNRDsKKwkJYnJlYWs7CisJY2FzZSBXTUlfVERMU19TSE9VTERfVEVBUkRPV046CisJCXRkbHNfZXZlbnQtPm1lc3NhZ2VUeXBlID0gV01BX1RETFNfU0hPVUxEX1RFQVJET1dOX0NNRDsKKwkJYnJlYWs7CisJY2FzZSBXTUlfVERMU19QRUVSX0RJU0NPTk5FQ1RFRDoKKwkJdGRsc19ldmVudC0+bWVzc2FnZVR5cGUgPSBXTUFfVERMU19QRUVSX0RJU0NPTk5FQ1RFRF9DTUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdNQV9MT0dFKCIlczogRGlzY2FyZGluZyB1bmtub3duIHRkbHMgZXZlbnQoJWQpIGZyb20gdGFyZ2V0IiwKKwkJCSBfX2Z1bmNfXywgcGVlcl9ldmVudC0+cGVlcl9zdGF0dXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHBlZXJfZXZlbnQtPnBlZXJfcmVhc29uKSB7CisJY2FzZSBXTUlfVERMU19URUFSRE9XTl9SRUFTT05fVFg6CisJCXRkbHNfZXZlbnQtPnBlZXJfcmVhc29uID0gZVdOSV9URExTX1RFQVJET1dOX1JFQVNPTl9UWDsKKwkJYnJlYWs7CisJY2FzZSBXTUlfVERMU19URUFSRE9XTl9SRUFTT05fUlNTSToKKwkJdGRsc19ldmVudC0+cGVlcl9yZWFzb24gPSBlV05JX1RETFNfVEVBUkRPV05fUkVBU09OX1JTU0k7CisJCWJyZWFrOworCWNhc2UgV01JX1RETFNfVEVBUkRPV05fUkVBU09OX1NDQU46CisJCXRkbHNfZXZlbnQtPnBlZXJfcmVhc29uID0gZVdOSV9URExTX1RFQVJET1dOX1JFQVNPTl9TQ0FOOworCQlicmVhazsKKwljYXNlIFdNSV9URExTX0RJU0NPTk5FQ1RFRF9SRUFTT05fUEVFUl9ERUxFVEU6CisJCXRkbHNfZXZlbnQtPnBlZXJfcmVhc29uID0KKwkJCWVXTklfVERMU19ESVNDT05ORUNURURfUkVBU09OX1BFRVJfREVMRVRFOworCQlicmVhazsKKwljYXNlIFdNSV9URExTX1RFQVJET1dOX1JFQVNPTl9QVFJfVElNRU9VVDoKKwkJdGRsc19ldmVudC0+cGVlcl9yZWFzb24gPSBlV05JX1RETFNfVEVBUkRPV05fUkVBU09OX1BUUl9USU1FT1VUOworCQlicmVhazsKKwljYXNlIFdNSV9URExTX1RFQVJET1dOX1JFQVNPTl9CQURfUFRSOgorCQl0ZGxzX2V2ZW50LT5wZWVyX3JlYXNvbiA9IGVXTklfVERMU19URUFSRE9XTl9SRUFTT05fQkFEX1BUUjsKKwkJYnJlYWs7CisJY2FzZSBXTUlfVERMU19URUFSRE9XTl9SRUFTT05fTk9fUkVTUE9OU0U6CisJCXRkbHNfZXZlbnQtPnBlZXJfcmVhc29uID0gZVdOSV9URExTX1RFQVJET1dOX1JFQVNPTl9OT19SRVNQT05TRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV01BX0xPR0UoIiVzOiB1bmtub3duIHJlYXNvbiglZCkgaW4gdGRscyBldmVudCglZCkgZnJvbSB0YXJnZXQiLAorCQkJIF9fZnVuY19fLCBwZWVyX2V2ZW50LT5wZWVyX3JlYXNvbiwKKwkJCSBwZWVyX2V2ZW50LT5wZWVyX3N0YXR1cyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCVdNQV9MT0dEKCIlczogc2VuZGluZyBtc2cgdG8gdW1hYywgbWVzc2FnZVR5cGU6IDB4JXgsICIKKwkJICJmb3IgcGVlcjogJXBNLCByZWFzb246ICVkLCBzbWVzZXNzaW9uSWQ6ICVkIiwKKwkJIF9fZnVuY19fLCB0ZGxzX2V2ZW50LT5tZXNzYWdlVHlwZSwgdGRsc19ldmVudC0+cGVlck1hYywKKwkJIHRkbHNfZXZlbnQtPnBlZXJfcmVhc29uLCB0ZGxzX2V2ZW50LT5zZXNzaW9uSWQpOworCisJd21hX3NlbmRfbXNnKHdtYSwgdGRsc19ldmVudC0+bWVzc2FnZVR5cGUsICh2b2lkICopdGRsc19ldmVudCwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX3NldF90ZGxzX29mZmNoYW5fbW9kZSgpIC0gc2V0IHRkbHMgb2ZmIGNoYW5uZWwgbW9kZQorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGNoYW5fc3dpdGNoX3BhcmFtczogUG9pbnRlciB0byB0ZGxzIGNoYW5uZWwgc3dpdGNoIHBhcmFtZXRlciBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGRscyBvZmYgY2hhbm5lbCBtb2RlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IE5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQorICovCitpbnQgd21hX3NldF90ZGxzX29mZmNoYW5fbW9kZShXTUFfSEFORExFIGhhbmRsZSwKKwkJCSAgICAgIHRkbHNfY2hhbl9zd2l0Y2hfcGFyYW1zICpjaGFuX3N3aXRjaF9wYXJhbXMpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwl3bWlfdGRsc19zZXRfb2ZmY2hhbl9tb2RlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCB3bWlfYnVmOworCXVfaW50MTZfdCBsZW4gPSBzaXplb2Yod21pX3RkbHNfc2V0X29mZmNoYW5fbW9kZV9jbWRfZml4ZWRfcGFyYW0pOworCWludCByZXQgPSAwOworCisJaWYgKCF3bWFfaGFuZGxlIHx8ICF3bWFfaGFuZGxlLT53bWlfaGFuZGxlKSB7CisJCVdNQV9MT0dFKEZMKAorCQkJICAgICJXTUEgaXMgY2xvc2VkLCBjYW4gbm90IGlzc3VlIHRkbHMgb2ZmIGNoYW5uZWwgY21kIgorCQkJICkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJd21pX2J1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIXdtaV9idWYpIHsKKwkJV01BX0xPR0UoRkwoIndtaV9idWZfYWxsb2MgZmFpbGVkIikpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVuZDsKKwl9CisJY21kID0gKHdtaV90ZGxzX3NldF9vZmZjaGFuX21vZGVfY21kX2ZpeGVkX3BhcmFtICopCisJCXdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV90ZGxzX3NldF9vZmZjaGFuX21vZGVfY21kX2ZpeGVkX3BhcmFtLAorCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oCisJCQl3bWlfdGRsc19zZXRfb2ZmY2hhbl9tb2RlX2NtZF9maXhlZF9wYXJhbSkpOworCisJV01JX0NIQVJfQVJSQVlfVE9fTUFDX0FERFIoY2hhbl9zd2l0Y2hfcGFyYW1zLT5wZWVyX21hY19hZGRyLAorCQkJCSZjbWQtPnBlZXJfbWFjYWRkcik7CisJY21kLT52ZGV2X2lkID0gY2hhbl9zd2l0Y2hfcGFyYW1zLT52ZGV2X2lkOworCWNtZC0+b2ZmY2hhbl9tb2RlID0gY2hhbl9zd2l0Y2hfcGFyYW1zLT50ZGxzX3N3X21vZGU7CisJY21kLT5pc19wZWVyX3Jlc3BvbmRlciA9IGNoYW5fc3dpdGNoX3BhcmFtcy0+aXNfcmVzcG9uZGVyOworCWNtZC0+b2ZmY2hhbl9udW0gPSBjaGFuX3N3aXRjaF9wYXJhbXMtPnRkbHNfb2ZmX2NoOworCWNtZC0+b2ZmY2hhbl9id19iaXRtYXAgPSBjaGFuX3N3aXRjaF9wYXJhbXMtPnRkbHNfb2ZmX2NoX2J3X29mZnNldDsKKwljbWQtPm9mZmNoYW5fb3Blcl9jbGFzcyA9IGNoYW5fc3dpdGNoX3BhcmFtcy0+b3Blcl9jbGFzczsKKworCVdNQV9MT0dEKEZMKCJQZWVyIE1BQyBBZGRyIG1hY19hZGRyMzF0bzA6IDB4JXgsIG1hY19hZGRyNDd0bzMyOiAweCV4IiksCisJCSBjbWQtPnBlZXJfbWFjYWRkci5tYWNfYWRkcjMxdG8wLAorCQkgY21kLT5wZWVyX21hY2FkZHIubWFjX2FkZHI0N3RvMzIpOworCisJV01BX0xPR0QoRkwoCisJCSAidmRldl9pZDogJWQsIG9mZiBjaGFubmVsIG1vZGU6ICVkLCBvZmYgY2hhbm5lbCBOdW06ICVkLCBvZmYgY2hhbm5lbCBvZmZzZXQ6IDB4JXgsIGlzX3BlZXJfcmVzcG9uZGVyOiAlZCwgb3BlcmF0aW5nIGNsYXNzOiAlZCIKKwkJICAgKSwKKwkJIGNtZC0+dmRldl9pZCwKKwkJIGNtZC0+b2ZmY2hhbl9tb2RlLAorCQkgY21kLT5vZmZjaGFuX251bSwKKwkJIGNtZC0+b2ZmY2hhbl9id19iaXRtYXAsCisJCSBjbWQtPmlzX3BlZXJfcmVzcG9uZGVyLAorCQkgY21kLT5vZmZjaGFuX29wZXJfY2xhc3MpOworCisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIHdtaV9idWYsIGxlbiwKKwkJV01JX1RETFNfU0VUX09GRkNIQU5fTU9ERV9DTURJRCkpIHsKKwkJV01BX0xPR1AoRkwoImZhaWxlZCB0byBzZW5kIHRkbHMgb2ZmIGNoYW4gY29tbWFuZCIpKTsKKwkJY2RmX25idWZfZnJlZSh3bWlfYnVmKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisKK2VuZDoKKwlpZiAoY2hhbl9zd2l0Y2hfcGFyYW1zKQorCQljZGZfbWVtX2ZyZWUoY2hhbl9zd2l0Y2hfcGFyYW1zKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtYV91cGRhdGVfZndfdGRsc19zdGF0ZSgpIC0gc2VuZCBlbmFibGUvZGlzYWJsZSB0ZGxzIGZvciBhIHZkZXYKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwd21hVGRsc3BhcmFtczogVERMUyBwYXJhbXMKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfdXBkYXRlX2Z3X3RkbHNfc3RhdGUoV01BX0hBTkRMRSBoYW5kbGUsIHZvaWQgKnB3bWFUZGxzcGFyYW1zKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJd21pX3RkbHNfc2V0X3N0YXRlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCB3bWlfYnVmOworCXRfd21hX3RkbHNfbW9kZSB0ZGxzX21vZGU7CisJdF93bWFfdGRsc19wYXJhbXMgKndtYV90ZGxzID0gKHRfd21hX3RkbHNfcGFyYW1zICopIHB3bWFUZGxzcGFyYW1zOworCXVpbnQxNl90IGxlbiA9IHNpemVvZih3bWlfdGRsc19zZXRfc3RhdGVfY21kX2ZpeGVkX3BhcmFtKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghd21hX2hhbmRsZSB8fCAhd21hX2hhbmRsZS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBpcyBjbG9zZWQsIGNhbiBub3QgaXNzdWUgZncgdGRscyBzdGF0ZSBjbWQiLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmRfZndfdGRsc19zdGF0ZTsKKwl9CisKKwl3bWlfYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghd21pX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IHdtYWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gRU5PTUVNOworCQlnb3RvIGVuZF9md190ZGxzX3N0YXRlOworCX0KKwl0ZGxzX21vZGUgPSB3bWFfdGRscy0+dGRsc19zdGF0ZTsKKwljbWQgPSAod21pX3RkbHNfc2V0X3N0YXRlX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEod21pX2J1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3RkbHNfc2V0X3N0YXRlX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfdGRsc19zZXRfc3RhdGVfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gd21hX3RkbHMtPnZkZXZfaWQ7CisKKwlpZiAoV01BX1RETFNfU1VQUE9SVF9FWFBMSUNJVF9UUklHR0VSX09OTFkgPT0gdGRsc19tb2RlKSB7CisJCWNtZC0+c3RhdGUgPSBXTUlfVERMU19FTkFCTEVfUEFTU0lWRTsKKwl9IGVsc2UgaWYgKFdNQV9URExTX1NVUFBPUlRfRU5BQkxFRCA9PSB0ZGxzX21vZGUpIHsKKwkJY21kLT5zdGF0ZSA9IFdNSV9URExTX0VOQUJMRV9BQ1RJVkU7CisJfSBlbHNlIHsKKwkJY21kLT5zdGF0ZSA9IFdNSV9URExTX0RJU0FCTEU7CisJfQorCisJY21kLT5ub3RpZmljYXRpb25faW50ZXJ2YWxfbXMgPSB3bWFfdGRscy0+bm90aWZpY2F0aW9uX2ludGVydmFsX21zOworCWNtZC0+dHhfZGlzY292ZXJ5X3RocmVzaG9sZCA9IHdtYV90ZGxzLT50eF9kaXNjb3ZlcnlfdGhyZXNob2xkOworCWNtZC0+dHhfdGVhcmRvd25fdGhyZXNob2xkID0gd21hX3RkbHMtPnR4X3RlYXJkb3duX3RocmVzaG9sZDsKKwljbWQtPnJzc2lfdGVhcmRvd25fdGhyZXNob2xkID0gd21hX3RkbHMtPnJzc2lfdGVhcmRvd25fdGhyZXNob2xkOworCWNtZC0+cnNzaV9kZWx0YSA9IHdtYV90ZGxzLT5yc3NpX2RlbHRhOworCWNtZC0+dGRsc19vcHRpb25zID0gd21hX3RkbHMtPnRkbHNfb3B0aW9uczsKKwljbWQtPnRkbHNfcGVlcl90cmFmZmljX2luZF93aW5kb3cgPSB3bWFfdGRscy0+cGVlcl90cmFmZmljX2luZF93aW5kb3c7CisJY21kLT50ZGxzX3BlZXJfdHJhZmZpY19yZXNwb25zZV90aW1lb3V0X21zID0KKwkJd21hX3RkbHMtPnBlZXJfdHJhZmZpY19yZXNwb25zZV90aW1lb3V0OworCWNtZC0+dGRsc19wdWFwc2RfbWFzayA9IHdtYV90ZGxzLT5wdWFwc2RfbWFzazsKKwljbWQtPnRkbHNfcHVhcHNkX2luYWN0aXZpdHlfdGltZV9tcyA9IHdtYV90ZGxzLT5wdWFwc2RfaW5hY3Rpdml0eV90aW1lOworCWNtZC0+dGRsc19wdWFwc2RfcnhfZnJhbWVfdGhyZXNob2xkID0KKwkJd21hX3RkbHMtPnB1YXBzZF9yeF9mcmFtZV90aHJlc2hvbGQ7CisKKwlXTUFfTE9HRCgiJXM6IHRkbHNfbW9kZTogJWQsIHN0YXRlOiAlZCwgIgorCQkgIm5vdGlmaWNhdGlvbl9pbnRlcnZhbF9tczogJWQsICIKKwkJICJ0eF9kaXNjb3ZlcnlfdGhyZXNob2xkOiAlZCwgIgorCQkgInR4X3RlYXJkb3duX3RocmVzaG9sZDogJWQsICIKKwkJICJyc3NpX3RlYXJkb3duX3RocmVzaG9sZDogJWQsICIKKwkJICJyc3NpX2RlbHRhOiAlZCwgIgorCQkgInRkbHNfb3B0aW9uczogMHgleCwgIgorCQkgInRkbHNfcGVlcl90cmFmZmljX2luZF93aW5kb3c6ICVkLCAiCisJCSAidGRsc19wZWVyX3RyYWZmaWNfcmVzcG9uc2VfdGltZW91dDogJWQsICIKKwkJICJ0ZGxzX3B1YXBzZF9tYXNrOiAweCV4LCAiCisJCSAidGRsc19wdWFwc2RfaW5hY3Rpdml0eV90aW1lOiAlZCwgIgorCQkgInRkbHNfcHVhcHNkX3J4X2ZyYW1lX3RocmVzaG9sZDogJWQgIiwKKwkJIF9fZnVuY19fLCB0ZGxzX21vZGUsIGNtZC0+c3RhdGUsCisJCSBjbWQtPm5vdGlmaWNhdGlvbl9pbnRlcnZhbF9tcywKKwkJIGNtZC0+dHhfZGlzY292ZXJ5X3RocmVzaG9sZCwKKwkJIGNtZC0+dHhfdGVhcmRvd25fdGhyZXNob2xkLAorCQkgY21kLT5yc3NpX3RlYXJkb3duX3RocmVzaG9sZCwKKwkJIGNtZC0+cnNzaV9kZWx0YSwKKwkJIGNtZC0+dGRsc19vcHRpb25zLAorCQkgY21kLT50ZGxzX3BlZXJfdHJhZmZpY19pbmRfd2luZG93LAorCQkgY21kLT50ZGxzX3BlZXJfdHJhZmZpY19yZXNwb25zZV90aW1lb3V0X21zLAorCQkgY21kLT50ZGxzX3B1YXBzZF9tYXNrLAorCQkgY21kLT50ZGxzX3B1YXBzZF9pbmFjdGl2aXR5X3RpbWVfbXMsCisJCSBjbWQtPnRkbHNfcHVhcHNkX3J4X2ZyYW1lX3RocmVzaG9sZCk7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgd21pX2J1ZiwgbGVuLAorCQkJCSBXTUlfVERMU19TRVRfU1RBVEVfQ01ESUQpKSB7CisJCVdNQV9MT0dQKCIlczogZmFpbGVkIHRvIHNlbmQgdGRscyBzZXQgc3RhdGUgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZSh3bWlfYnVmKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlbmRfZndfdGRsc19zdGF0ZTsKKwl9CisJV01BX0xPR0QoIiVzOiB2ZGV2X2lkICVkIiwgX19mdW5jX18sIHdtYV90ZGxzLT52ZGV2X2lkKTsKKworZW5kX2Z3X3RkbHNfc3RhdGU6CisJaWYgKHB3bWFUZGxzcGFyYW1zKQorCQljZGZfbWVtX2ZyZWUocHdtYVRkbHNwYXJhbXMpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd21hX3VwZGF0ZV90ZGxzX3BlZXJfc3RhdGUoKSAtIHVwZGF0ZSBURExTIHBlZXIgc3RhdGUKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBwZWVyU3RhdGVQYXJhbXM6IFRETFMgcGVlciBzdGF0ZSBwYXJhbXMKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX3VwZGF0ZV90ZGxzX3BlZXJfc3RhdGUoV01BX0hBTkRMRSBoYW5kbGUsCisJCQkgICAgICAgdFRkbHNQZWVyU3RhdGVQYXJhbXMgKnBlZXJTdGF0ZVBhcmFtcykKK3sKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCXdtaV90ZGxzX3BlZXJfdXBkYXRlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV90ZGxzX3BlZXJfY2FwYWJpbGl0aWVzICpwZWVyX2NhcDsKKwl3bWlfY2hhbm5lbCAqY2hhbl9pbmZvOworCXdtaV9idWZfdCB3bWlfYnVmOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJdWludDMyX3QgaTsKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXY7CisJdWludDhfdCBwZWVyX2lkOworCXN0cnVjdCBvbF90eHJ4X3BlZXJfdCAqcGVlcjsKKwlpbnQzMl90IGxlbiA9IHNpemVvZih3bWlfdGRsc19wZWVyX3VwZGF0ZV9jbWRfZml4ZWRfcGFyYW0pICsKKwkJICAgICAgc2l6ZW9mKHdtaV90ZGxzX3BlZXJfY2FwYWJpbGl0aWVzKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghd21hX2hhbmRsZSB8fCAhd21hX2hhbmRsZS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBpcyBjbG9zZWQsIGNhbiBub3QgaXNzdWUgY21kIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZF90ZGxzX3BlZXJfc3RhdGU7CisJfQorCisJLyogcGVlciBjYXBhYmlsaXR5IGluZm8gaXMgdmFsaWQgb25seSB3aGVuIHBlZXIgc3RhdGUgaXMgY29ubmVjdGVkICovCisJaWYgKFdNQV9URExTX1BFRVJfU1RBVEVfQ09OTkVDVEVEICE9IHBlZXJTdGF0ZVBhcmFtcy0+cGVlclN0YXRlKSB7CisJCWNkZl9tZW1femVybygmcGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLAorCQkJICAgICBzaXplb2YodFRkbHNQZWVyQ2FwUGFyYW1zKSk7CisJfQorCisJbGVuICs9IFdNSV9UTFZfSERSX1NJWkUgKworCSAgICAgICBzaXplb2Yod21pX2NoYW5uZWwpICogcGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLnBlZXJDaGFuTGVuOworCisJd21pX2J1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIXdtaV9idWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gRU5PTUVNOworCQlnb3RvIGVuZF90ZGxzX3BlZXJfc3RhdGU7CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKwljbWQgPSAod21pX3RkbHNfcGVlcl91cGRhdGVfY21kX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3RkbHNfcGVlcl91cGRhdGVfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV90ZGxzX3BlZXJfdXBkYXRlX2NtZF9maXhlZF9wYXJhbSkpOworCisJY21kLT52ZGV2X2lkID0gcGVlclN0YXRlUGFyYW1zLT52ZGV2SWQ7CisJV01JX0NIQVJfQVJSQVlfVE9fTUFDX0FERFIocGVlclN0YXRlUGFyYW1zLT5wZWVyTWFjQWRkciwKKwkJCQkgICAmY21kLT5wZWVyX21hY2FkZHIpOworCisJc3dpdGNoIChwZWVyU3RhdGVQYXJhbXMtPnBlZXJTdGF0ZSkgeworCWNhc2UgV01BX1RETFNfUEVFUl9TVEFURV9QRUVSSU5HOgorCQljbWQtPnBlZXJfc3RhdGUgPSBXTUlfVERMU19QRUVSX1NUQVRFX1BFRVJJTkc7CisJCWJyZWFrOworCWNhc2UgV01BX1RETFNfUEVFUl9TVEFURV9DT05ORUNURUQ6CisJCWNtZC0+cGVlcl9zdGF0ZSA9IFdNSV9URExTX1BFRVJfU1RBVEVfQ09OTkVDVEVEOworCQlicmVhazsKKwljYXNlIFdNQV9URExTX1BFRVJfU1RBVEVfVEVBUkRPV046CisJCWNtZC0+cGVlcl9zdGF0ZSA9IFdNSV9URExTX1BFRVJfU1RBVEVfVEVBUkRPV047CisJCWJyZWFrOworCX0KKworCVdNQV9MT0dEKCIlczogdmRldl9pZDogJWQsIHBlZXJTdGF0ZVBhcmFtcy0+cGVlck1hY0FkZHI6ICVwTSwgIgorCQkgInBlZXJfbWFjYWRkci5tYWNfYWRkcjMxdG8wOiAweCV4LCAiCisJCSAicGVlcl9tYWNhZGRyLm1hY19hZGRyNDd0bzMyOiAweCV4LCBwZWVyX3N0YXRlOiAlZCIsCisJCSBfX2Z1bmNfXywgY21kLT52ZGV2X2lkLCBwZWVyU3RhdGVQYXJhbXMtPnBlZXJNYWNBZGRyLAorCQkgY21kLT5wZWVyX21hY2FkZHIubWFjX2FkZHIzMXRvMCwKKwkJIGNtZC0+cGVlcl9tYWNhZGRyLm1hY19hZGRyNDd0bzMyLCBjbWQtPnBlZXJfc3RhdGUpOworCisJYnVmX3B0ciArPSBzaXplb2Yod21pX3RkbHNfcGVlcl91cGRhdGVfY21kX2ZpeGVkX3BhcmFtKTsKKwlwZWVyX2NhcCA9ICh3bWlfdGRsc19wZWVyX2NhcGFiaWxpdGllcyAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZwZWVyX2NhcC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3RkbHNfcGVlcl9jYXBhYmlsaXRpZXMsCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX3RkbHNfcGVlcl9jYXBhYmlsaXRpZXMpKTsKKworCWlmICgocGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLnBlZXJVYXBzZFF1ZXVlICYgMHgwOCkgPj4gMykKKwkJV01JX1NFVF9URExTX1BFRVJfVk9fVUFQU0QocGVlcl9jYXApOworCWlmICgocGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLnBlZXJVYXBzZFF1ZXVlICYgMHgwNCkgPj4gMikKKwkJV01JX1NFVF9URExTX1BFRVJfVklfVUFQU0QocGVlcl9jYXApOworCWlmICgocGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLnBlZXJVYXBzZFF1ZXVlICYgMHgwMikgPj4gMSkKKwkJV01JX1NFVF9URExTX1BFRVJfQktfVUFQU0QocGVlcl9jYXApOworCWlmIChwZWVyU3RhdGVQYXJhbXMtPnBlZXJDYXAucGVlclVhcHNkUXVldWUgJiAweDAxKQorCQlXTUlfU0VUX1RETFNfUEVFUl9CRV9VQVBTRChwZWVyX2NhcCk7CisKKwkvKiBBY2sgYW5kIE1vcmUgRGF0YSBBY2sgYXJlIHNlbnQgYXMgMCwgc28gbm8gbmVlZCB0byBzZXQKKwkgKiBidXQgZmlsbCBTUAorCSAqLworCVdNSV9TRVRfVERMU19QRUVSX1NQX1VBUFNEKHBlZXJfY2FwLAorCQkJCSAgIHBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyTWF4U3ApOworCisJcGVlcl9jYXAtPmJ1ZmZfc3RhX3N1cHBvcnQgPQorCQlwZWVyU3RhdGVQYXJhbXMtPnBlZXJDYXAucGVlckJ1ZmZTdGFTdXBwb3J0OworCXBlZXJfY2FwLT5vZmZfY2hhbl9zdXBwb3J0ID0KKwkJcGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLnBlZXJPZmZDaGFuU3VwcG9ydDsKKwlwZWVyX2NhcC0+cGVlcl9jdXJyX29wZXJjbGFzcyA9CisJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyQ3Vyck9wZXJDbGFzczsKKwkvKiBzZWxmIGN1cnIgb3BlcmNsYXNzIGlzIG5vdCBiZWluZyB1c2VkIGFuZCBzbyBwYXNzIG9wIGNsYXNzIGZvcgorCSAqIHByZWZlcnJlZCBvZmYgY2hhbiBpbiBpdC4KKwkgKi8KKwlwZWVyX2NhcC0+c2VsZl9jdXJyX29wZXJjbGFzcyA9CisJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5vcENsYXNzRm9yUHJlZk9mZkNoYW47CisJcGVlcl9jYXAtPnBlZXJfY2hhbl9sZW4gPSBwZWVyU3RhdGVQYXJhbXMtPnBlZXJDYXAucGVlckNoYW5MZW47CisJcGVlcl9jYXAtPnBlZXJfb3BlcmNsYXNzX2xlbiA9CisJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyT3BlckNsYXNzTGVuOworCisJV01BX0xPR0QoIiVzOiBwZWVyX29wZXJjbGFzc19sZW46ICVkIiwKKwkJIF9fZnVuY19fLCBwZWVyX2NhcC0+cGVlcl9vcGVyY2xhc3NfbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgV01JX1RETFNfTUFYX1NVUFBfT1BFUl9DTEFTU0VTOyBpKyspIHsKKwkJcGVlcl9jYXAtPnBlZXJfb3BlcmNsYXNzW2ldID0KKwkJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyT3BlckNsYXNzW2ldOworCQlXTUFfTE9HRCgiJXM6IHBlZXJfb3BlcmNsYXNzWyVkXTogJWQiLAorCQkJIF9fZnVuY19fLCBpLCBwZWVyX2NhcC0+cGVlcl9vcGVyY2xhc3NbaV0pOworCX0KKworCXBlZXJfY2FwLT5pc19wZWVyX3Jlc3BvbmRlciA9IHBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5pc1BlZXJSZXNwb25kZXI7CisJcGVlcl9jYXAtPnByZWZfb2ZmY2hhbl9udW0gPSBwZWVyU3RhdGVQYXJhbXMtPnBlZXJDYXAucHJlZk9mZkNoYW5OdW07CisJcGVlcl9jYXAtPnByZWZfb2ZmY2hhbl9idyA9CisJCXBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wcmVmT2ZmQ2hhbkJhbmR3aWR0aDsKKworCVdNQV9MT0dECisJCSgiJXM6IHBlZXJfcW9zOiAweCV4LCBidWZmX3N0YV9zdXBwb3J0OiAlZCwgb2ZmX2NoYW5fc3VwcG9ydDogJWQsIHBlZXJfY3Vycl9vcGVyY2xhc3M6ICVkLCBzZWxmX2N1cnJfb3BlcmNsYXNzOiAlZCwgcGVlcl9jaGFuX2xlbjogJWQsIHBlZXJfb3BlcmNsYXNzX2xlbjogJWQsIGlzX3BlZXJfcmVzcG9uZGVyOiAlZCwgcHJlZl9vZmZjaGFuX251bTogJWQsIHByZWZfb2ZmY2hhbl9idzogJWQiLAorCQlfX2Z1bmNfXywgcGVlcl9jYXAtPnBlZXJfcW9zLCBwZWVyX2NhcC0+YnVmZl9zdGFfc3VwcG9ydCwKKwkJcGVlcl9jYXAtPm9mZl9jaGFuX3N1cHBvcnQsIHBlZXJfY2FwLT5wZWVyX2N1cnJfb3BlcmNsYXNzLAorCQlwZWVyX2NhcC0+c2VsZl9jdXJyX29wZXJjbGFzcywgcGVlcl9jYXAtPnBlZXJfY2hhbl9sZW4sCisJCXBlZXJfY2FwLT5wZWVyX29wZXJjbGFzc19sZW4sIHBlZXJfY2FwLT5pc19wZWVyX3Jlc3BvbmRlciwKKwkJcGVlcl9jYXAtPnByZWZfb2ZmY2hhbl9udW0sIHBlZXJfY2FwLT5wcmVmX29mZmNoYW5fYncpOworCisJLyogbmV4dCBmaWxsIHZhcmlhYmxlIHNpemUgYXJyYXkgb2YgcGVlciBjaGFuIGluZm8gKi8KKwlidWZfcHRyICs9IHNpemVvZih3bWlfdGRsc19wZWVyX2NhcGFiaWxpdGllcyk7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwKKwkJICAgICAgIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCSAgICAgICBzaXplb2Yod21pX2NoYW5uZWwpICoKKwkJICAgICAgIHBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyQ2hhbkxlbik7CisJY2hhbl9pbmZvID0gKHdtaV9jaGFubmVsICopIChidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLnBlZXJDaGFuTGVuOyArK2kpIHsKKwkJV01JVExWX1NFVF9IRFIoJmNoYW5faW5mby0+dGx2X2hlYWRlciwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGFubmVsLAorCQkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfY2hhbm5lbCkpOworCQljaGFuX2luZm8tPm1oeiA9CisJCQljZHNfY2hhbl90b19mcmVxKHBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyQ2hhbltpXS4KKwkJCQkJIGNoYW5JZCk7CisJCWNoYW5faW5mby0+YmFuZF9jZW50ZXJfZnJlcTEgPSBjaGFuX2luZm8tPm1oejsKKwkJY2hhbl9pbmZvLT5iYW5kX2NlbnRlcl9mcmVxMiA9IDA7CisKKwkJV01BX0xPR0QoIiVzOiBjaGFuWyVkXSA9ICV1IiwgX19mdW5jX18sIGksIGNoYW5faW5mby0+bWh6KTsKKworCQlpZiAocGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLnBlZXJDaGFuW2ldLmRmc1NldCkgeworCQkJV01JX1NFVF9DSEFOTkVMX0ZMQUcoY2hhbl9pbmZvLCBXTUlfQ0hBTl9GTEFHX1BBU1NJVkUpOworCQkJV01BX0xPR0koImNoYW5bJWRdIERGU1slZF1cbiIsCisJCQkJIHBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyQ2hhbltpXS5jaGFuSWQsCisJCQkJIHBlZXJTdGF0ZVBhcmFtcy0+cGVlckNhcC5wZWVyQ2hhbltpXS5kZnNTZXQpOworCQl9CisKKwkJaWYgKGNoYW5faW5mby0+bWh6IDwgV01BXzJfNF9HSFpfTUFYX0ZSRVEpIHsKKwkJCVdNSV9TRVRfQ0hBTk5FTF9NT0RFKGNoYW5faW5mbywgTU9ERV8xMUcpOworCQl9IGVsc2UgeworCQkJV01JX1NFVF9DSEFOTkVMX01PREUoY2hhbl9pbmZvLCBNT0RFXzExQSk7CisJCX0KKworCQlXTUlfU0VUX0NIQU5ORUxfTUFYX1RYX1BPV0VSKGNoYW5faW5mbywKKwkJCQkJICAgICBwZWVyU3RhdGVQYXJhbXMtPnBlZXJDYXAuCisJCQkJCSAgICAgcGVlckNoYW5baV0ucHdyKTsKKworCQlXTUlfU0VUX0NIQU5ORUxfUkVHX1BPV0VSKGNoYW5faW5mbywKKwkJCQkJICBwZWVyU3RhdGVQYXJhbXMtPnBlZXJDYXAucGVlckNoYW5baV0uCisJCQkJCSAgcHdyKTsKKwkJV01BX0xPR0QoIkNoYW5uZWwgVFggcG93ZXJbJWRdID0gJXU6ICVkIiwgaSwgY2hhbl9pbmZvLT5taHosCisJCQkgcGVlclN0YXRlUGFyYW1zLT5wZWVyQ2FwLnBlZXJDaGFuW2ldLnB3cik7CisKKwkJY2hhbl9pbmZvKys7CisJfQorCisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIHdtaV9idWYsIGxlbiwKKwkJCQkgV01JX1RETFNfUEVFUl9VUERBVEVfQ01ESUQpKSB7CisJCVdNQV9MT0dFKCIlczogZmFpbGVkIHRvIHNlbmQgdGRscyBwZWVyIHVwZGF0ZSBzdGF0ZSBjb21tYW5kIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWNkZl9uYnVmX2ZyZWUod21pX2J1Zik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZW5kX3RkbHNfcGVlcl9zdGF0ZTsKKwl9CisKKwkvKiBpbiBjYXNlIG9mIHRlYXJkb3duLCByZW1vdmUgcGVlciBmcm9tIGZ3ICovCisJaWYgKFdNQV9URExTX1BFRVJfU1RBVEVfVEVBUkRPV04gPT0gcGVlclN0YXRlUGFyYW1zLT5wZWVyU3RhdGUpIHsKKwkJcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCQlpZiAoIXBkZXYpIHsKKwkJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgcGRldiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVuZF90ZGxzX3BlZXJfc3RhdGU7CisJCX0KKworCQlwZWVyID0gb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcihwZGV2LAorCQkJCQkJIHBlZXJTdGF0ZVBhcmFtcy0+cGVlck1hY0FkZHIsCisJCQkJCQkgJnBlZXJfaWQpOworCQlpZiAoIXBlZXIpIHsKKwkJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCBwZWVyIGhhbmRsZSB1c2luZyBwZWVyIG1hYyAlcE0iLAorCQkJCV9fZnVuY19fLCBwZWVyU3RhdGVQYXJhbXMtPnBlZXJNYWNBZGRyKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVuZF90ZGxzX3BlZXJfc3RhdGU7CisJCX0KKworCQlXTUFfTE9HRCgiJXM6IGNhbGxpbmcgd21hX3JlbW92ZV9wZWVyIGZvciBwZWVyICIgTUFDX0FERFJFU1NfU1RSCisJCQkgIiB2ZGV2SWQ6ICVkIiwgX19mdW5jX18sCisJCQkgTUFDX0FERFJfQVJSQVkocGVlci0+bWFjX2FkZHIucmF3KSwKKwkJCSBwZWVyU3RhdGVQYXJhbXMtPnZkZXZJZCk7CisJCXdtYV9yZW1vdmVfcGVlcih3bWFfaGFuZGxlLCBwZWVyLT5tYWNfYWRkci5yYXcsCisJCQkJcGVlclN0YXRlUGFyYW1zLT52ZGV2SWQsIHBlZXIsIGZhbHNlKTsKKwl9CisKK2VuZF90ZGxzX3BlZXJfc3RhdGU6CisJaWYgKHBlZXJTdGF0ZVBhcmFtcykKKwkJY2RmX21lbV9mcmVlKHBlZXJTdGF0ZVBhcmFtcyk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fVERMUyAqLworCisKKy8qKgorICogd21hX2Rmc19hdHRhY2goKSAtIEF0dGFjaCBERlMgbWV0aG9kcyB0byB0aGUgdW1hYyBzdGF0ZS4KKyAqIEBkZnNfaWM6IGllZWU4MDIxMWNvbSBwdHIKKyAqCisgKiBSZXR1cm46IFJldHVybiBpZWVlODAyMTFjb20gcHRyIHdpdGggdXBkYXRlZCBpbmZvCisgKi8KK3N0cnVjdCBpZWVlODAyMTFjb20gKndtYV9kZnNfYXR0YWNoKHN0cnVjdCBpZWVlODAyMTFjb20gKmRmc19pYykKK3sKKwkvKkFsbG9jYXRlIG1lbW9yeSBmb3IgZGZzX2ljIGJlZm9yZSBwYXNzaW5nIGl0IHVwIHRvIGRmc19hdHRhY2goKSAqLworCWRmc19pYyA9IChzdHJ1Y3QgaWVlZTgwMjExY29tICopCisJCSBvc19tYWxsb2MoTlVMTCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFjb20pLCBHRlBfQVRPTUlDKTsKKwlpZiAoZGZzX2ljID09IE5VTEwpIHsKKwkJV01BX0xPR0UoIiVzOkFsbG9jYXRpb24gb2YgZGZzX2ljIGZhaWxlZCAlenUiLAorCQkJIF9fZnVuY19fLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMWNvbSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJT1NfTUVNWkVSTyhkZnNfaWMsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExY29tKSk7CisJLyogREZTIHBhdHRlcm4gbWF0Y2hpbmcgaG9va3MgKi8KKwlkZnNfaWMtPmljX2Rmc19hdHRhY2ggPSBvbF9pZl9kZnNfYXR0YWNoOworCWRmc19pYy0+aWNfZGZzX2Rpc2FibGUgPSBvbF9pZl9kZnNfZGlzYWJsZTsKKwlkZnNfaWMtPmljX2ZpbmRfY2hhbm5lbCA9IGllZWU4MDIxMV9maW5kX2NoYW5uZWw7CisJZGZzX2ljLT5pY19kZnNfZW5hYmxlID0gb2xfaWZfZGZzX2VuYWJsZTsKKwlkZnNfaWMtPmljX2llZWUybWh6ID0gaWVlZTgwMjExX2llZWUybWh6OworCisJLyogSGFyZHdhcmUgZmFjaW5nIGhvb2tzICovCisJZGZzX2ljLT5pY19nZXRfZXh0X2J1c3kgPSBvbF9pZl9kZnNfZ2V0X2V4dF9idXN5OworCWRmc19pYy0+aWNfZ2V0X21pYl9jeWNsZV9jb3VudHNfcGN0ID0KKwkJb2xfaWZfZGZzX2dldF9taWJfY3ljbGVfY291bnRzX3BjdDsKKwlkZnNfaWMtPmljX2dldF9UU0Y2NCA9IG9sX2lmX2dldF90c2Y2NDsKKworCS8qIE5PTCByZWxhdGVkIGhvb2tzICovCisJZGZzX2ljLT5pY19kZnNfdXNlbm9sID0gb2xfaWZfZGZzX3VzZW5vbDsKKwkvKgorCSAqIEhvb2tzIGZyb20gd21hL2Rmcy8gYmFjaworCSAqIGludG8gdGhlIFBFL1NNRQorCSAqIGFuZCBzaGFyZWQgREZTIGNvZGUKKwkgKi8KKwlkZnNfaWMtPmljX2Rmc19ub3RpZnlfcmFkYXIgPSBpZWVlODAyMTFfbWFya19kZnM7CisJY2RmX211dGV4X2luaXQoJmRmc19pYy0+Y2hhbl9sb2NrKTsKKwkvKiBJbml0aWFsaXplcyBERlMgRGF0YSBTdHJ1Y3R1cmVzIGFuZCBxdWV1ZXMgKi8KKwlkZnNfYXR0YWNoKGRmc19pYyk7CisKKwlyZXR1cm4gZGZzX2ljOworfQorCisvKioKKyAqIHdtYV9kZnNfZGV0YWNoKCkgLSBEZXRhY2ggREZTIG1ldGhvZHMKKyAqIEBkZnNfaWM6IGllZWU4MDIxMWNvbSBwdHIKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfZGZzX2RldGFjaChzdHJ1Y3QgaWVlZTgwMjExY29tICpkZnNfaWMpCit7CisJZGZzX2RldGFjaChkZnNfaWMpOworCisJY2RmX211dGV4X2Rlc3Ryb3koJmRmc19pYy0+Y2hhbl9sb2NrKTsKKwlpZiAoTlVMTCAhPSBkZnNfaWMtPmljX2N1cmNoYW4pIHsKKwkJT1NfRlJFRShkZnNfaWMtPmljX2N1cmNoYW4pOworCQlkZnNfaWMtPmljX2N1cmNoYW4gPSBOVUxMOworCX0KKworCU9TX0ZSRUUoZGZzX2ljKTsKK30KKworLyoqCisgKiB3bWFfZGZzX2NvbmZpZ3VyZSgpIC0gY29uZmlndXJlIGRmcworICogQGljOiBpZWVlODAyMTFjb20gcHRyCisgKgorICogQ29uZmlndXJlcyBSYWRhciBGaWx0ZXJzIGR1cmluZworICogdmRldiBzdGFydC9jaGFubmVsIGNoYW5nZS9yZWd1bGF0b3J5IGRvbWFpbgorICogY2hhbmdlLlRoaXMgQ29uZmlndXJhdGlvbiBlbmFibGVzIHRvIHByb2dyYW0KKyAqIHRoZSBERlMgcGF0dGVybiBtYXRjaGluZyBtb2R1bGUuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX2Rmc19jb25maWd1cmUoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpCit7CisJc3RydWN0IGF0aF9kZnNfcmFkYXJfdGFiX2luZm8gcmluZm87CisJaW50IGRmc2RvbWFpbjsKKwlpbnQgcmFkYXJfZW5hYmxlZF9zdGF0dXMgPSAwOworCWlmIChpYyA9PSBOVUxMKSB7CisJCVdNQV9MT0dFKCIlczogREZTIGljIGlzIEludmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlkZnNkb21haW4gPSBpYy0+Y3VycmVudF9kZnNfcmVnZG9tYWluOworCisJLyogRmV0Y2ggY3VycmVudCByYWRhciBwYXR0ZXJucyBmcm9tIHRoZSBsbWFjICovCisJT1NfTUVNWkVSTygmcmluZm8sIHNpemVvZihyaW5mbykpOworCisJLyoKKwkgKiBMb29rIHVwIHRoZSBjdXJyZW50IERGUworCSAqIHJlZ3VsYXRvcnkgZG9tYWluIGFuZCBkZWNpZGUKKwkgKiB3aGljaCByYWRhciBwdWxzZXMgdG8gdXNlLgorCSAqLworCXN3aXRjaCAoZGZzZG9tYWluKSB7CisJY2FzZSBERlNfRkNDX0RPTUFJTjoKKwkJV01BX0xPR0koIiVzOiBERlMtRkNDIGRvbWFpbiIsIF9fZnVuY19fKTsKKwkJcmluZm8uZGZzZG9tYWluID0gREZTX0ZDQ19ET01BSU47CisJCXJpbmZvLmRmc19yYWRhcnMgPSBkZnNfZmNjX3JhZGFyczsKKwkJcmluZm8ubnVtcmFkYXJzID0gQ0RGX0FSUkFZX1NJWkUoZGZzX2ZjY19yYWRhcnMpOworCQlyaW5mby5iNXB1bHNlcyA9IGRmc19mY2NfYmluNXB1bHNlczsKKwkJcmluZm8ubnVtYjVyYWRhcnMgPSBDREZfQVJSQVlfU0laRShkZnNfZmNjX2JpbjVwdWxzZXMpOworCQlicmVhazsKKwljYXNlIERGU19FVFNJX0RPTUFJTjoKKwkJV01BX0xPR0koIiVzOiBERlMtRVRTSSBkb21haW4iLCBfX2Z1bmNfXyk7CisJCXJpbmZvLmRmc2RvbWFpbiA9IERGU19FVFNJX0RPTUFJTjsKKwkJcmluZm8uZGZzX3JhZGFycyA9IGRmc19ldHNpX3JhZGFyczsKKwkJcmluZm8ubnVtcmFkYXJzID0gQ0RGX0FSUkFZX1NJWkUoZGZzX2V0c2lfcmFkYXJzKTsKKwkJcmluZm8uYjVwdWxzZXMgPSBOVUxMOworCQlyaW5mby5udW1iNXJhZGFycyA9IDA7CisJCWJyZWFrOworCWNhc2UgREZTX01LSzRfRE9NQUlOOgorCQlXTUFfTE9HSSgiJXM6IERGUy1NS0s0IGRvbWFpbiIsIF9fZnVuY19fKTsKKwkJcmluZm8uZGZzZG9tYWluID0gREZTX01LSzRfRE9NQUlOOworCQlyaW5mby5kZnNfcmFkYXJzID0gZGZzX21razRfcmFkYXJzOworCQlyaW5mby5udW1yYWRhcnMgPSBDREZfQVJSQVlfU0laRShkZnNfbWtrNF9yYWRhcnMpOworCQlyaW5mby5iNXB1bHNlcyA9IGRmc19qcG5fYmluNXB1bHNlczsKKwkJcmluZm8ubnVtYjVyYWRhcnMgPSBDREZfQVJSQVlfU0laRShkZnNfanBuX2JpbjVwdWxzZXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXTUFfTE9HSSgiJXM6IERGUy1VTklOVCBkb21haW4iLCBfX2Z1bmNfXyk7CisJCXJpbmZvLmRmc2RvbWFpbiA9IERGU19VTklOSVRfRE9NQUlOOworCQlyaW5mby5kZnNfcmFkYXJzID0gTlVMTDsKKwkJcmluZm8ubnVtcmFkYXJzID0gMDsKKwkJcmluZm8uYjVwdWxzZXMgPSBOVUxMOworCQlyaW5mby5udW1iNXJhZGFycyA9IDA7CisJCWJyZWFrOworCX0KKworCXJpbmZvLmRmc19wcmlfbXVsdGlwbGllciA9IGljLT5kZnNfcHJpX211bHRpcGxpZXI7CisKKwkvKgorCSAqIFNldCB0aGUgcmVndWxhdG9yeSBkb21haW4sCisJICogcmFkYXIgcHVsc2UgdGFibGUgYW5kIGVuYWJsZQorCSAqIHJhZGFyIGV2ZW50cyBpZiByZXF1aXJlZC4KKwkgKiBkZnNfcmFkYXJfZW5hYmxlKCkgcmV0dXJucworCSAqIDAgb24gc3VjY2VzcyBhbmQgbm9uLXplcm8KKwkgKiBmYWlsdXJlLgorCSAqLworCXJhZGFyX2VuYWJsZWRfc3RhdHVzID0gZGZzX3JhZGFyX2VuYWJsZShpYywgJnJpbmZvKTsKKwlpZiAocmFkYXJfZW5hYmxlZF9zdGF0dXMgIT0gREZTX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCIlc1slZF06IERGUy0gUmFkYXIgRGV0ZWN0aW9uIEVuYWJsaW5nIEZhaWxlZCIsCisJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwl9Cit9CisKKy8qKgorICogd21hX2Rmc19jb25maWd1cmVfY2hhbm5lbCgpIC0gY29uZmlndXJlIERGUyBjaGFubmVsCisgKiBAZGZzX2ljOiBpZWVlODAyMTFjb20gcHRyCisgKiBAY2hhbjogd21pIGNoYW5uZWwKKyAqIEBjaGFubW9kZTogY2hhbm5lbCBtb2RlCisgKiBAIHJlcTogdmRldiBzdGFydCByZXF1ZXN0CisgKgorICogU2V0IHRoZSBDaGFubmVsIHBhcmFtZXRlcnMgaW4gdG8gREZTIG1vZHVsZQorICogQWxzbyxjb25maWd1cmUgdGhlIERGUyByYWRhciBmaWx0ZXJzIGZvcgorICogbWF0Y2hpbmcgdGhlIERGUyBwaHllcnJvcnMuCisgKgorICogUmV0dXJuOiBpZWVlODAyMTEgY2hhbm5lbCAvIE5VTEwgZm9yIGVycm9yCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqd21hX2Rmc19jb25maWd1cmVfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExY29tICpkZnNfaWMsCisJCQkJCQkgICAgd21pX2NoYW5uZWwgKmNoYW4sCisJCQkJCQkgICAgV0xBTl9QSFlfTU9ERSBjaGFubW9kZSwKKwkJCQkJCSAgICBzdHJ1Y3Qgd21hX3ZkZXZfc3RhcnRfcmVxCisJCQkJCQkgICAgKnJlcSkKK3sKKwlpZiAoZGZzX2ljID09IE5VTEwpIHsKKwkJV01BX0xPR0UoIiVzOiBERlMgaWMgaXMgSW52YWxpZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWRmc19pYy0+aWNfY3VyY2hhbiA9IChzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKilvc19tYWxsb2MoTlVMTCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCksCisJCQkJCQkJCSAgIEdGUF9BVE9NSUMpOworCWlmIChkZnNfaWMtPmljX2N1cmNoYW4gPT0gTlVMTCkgeworCQlXTUFfTE9HRSgiJXM6IGFsbG9jYXRpb24gb2YgZGZzX2ljLT5pY19jdXJjaGFuIGZhaWxlZCAlenUiLAorCQkJIF9fZnVuY19fLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlPU19NRU1aRVJPKGRmc19pYy0+aWNfY3VyY2hhbiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCkpOworCisJZGZzX2ljLT5pY19jdXJjaGFuLT5pY19pZWVlID0gcmVxLT5jaGFuOworCWRmc19pYy0+aWNfY3VyY2hhbi0+aWNfZnJlcSA9IGNoYW4tPm1oejsKKwlkZnNfaWMtPmljX2N1cmNoYW4tPmljX3ZodG9wX2NoX2ZyZXFfc2VnMSA9IGNoYW4tPmJhbmRfY2VudGVyX2ZyZXExOworCWRmc19pYy0+aWNfY3VyY2hhbi0+aWNfdmh0b3BfY2hfZnJlcV9zZWcyID0gY2hhbi0+YmFuZF9jZW50ZXJfZnJlcTI7CisJZGZzX2ljLT5pY19jdXJjaGFuLT5pY19wcmlfZnJlcV9jZW50ZXJfZnJlcV9taHpfc2VwYXJhdGlvbiA9CisJCQkJCWRmc19pYy0+aWNfY3VyY2hhbi0+aWNfZnJlcSAtCisJCQkJZGZzX2ljLT5pY19jdXJjaGFuLT5pY192aHRvcF9jaF9mcmVxX3NlZzE7CisKKwlpZiAoKGRmc19pYy0+aWNfY3VyY2hhbi0+aWNfaWVlZSA+PSBXTUFfMTFBX0NIQU5ORUxfQkVHSU4pICYmCisJICAgIChkZnNfaWMtPmljX2N1cmNoYW4tPmljX2llZWUgPD0gV01BXzExQV9DSEFOTkVMX0VORCkpIHsKKwkJZGZzX2ljLT5pY19jdXJjaGFuLT5pY19mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl81R0haOworCX0KKwlpZiAoQ0hfV0lEVEhfODBNSFogPT0gcmVxLT5jaGFuX3dpZHRoKSB7CisJCWRmc19pYy0+aWNfY3VyY2hhbi0+aWNfZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fVkhUODA7CisJfQorCWlmIChDSF9XSURUSF80ME1IWiA9PSByZXEtPmNoYW5fd2lkdGgpIHsKKwkJaWYgKHJlcS0+Y2hhbiA8IHJlcS0+Y2hfY2VudGVyX2ZyZXFfc2VnMCkKKwkJCWRmc19pYy0+aWNfY3VyY2hhbi0+aWNfZmxhZ3MgfD0gKHJlcS0+dmh0X2NhcGFibGUgPworCQkJCQlJRUVFODAyMTFfQ0hBTl9WSFQ0MFBMVVMgOgorCQkJCQlJRUVFODAyMTFfQ0hBTl9IVDQwUExVUyk7CisJCWVsc2UKKwkJCWRmc19pYy0+aWNfY3VyY2hhbi0+aWNfZmxhZ3MgfD0gKHJlcS0+dmh0X2NhcGFibGUgPworCQkJCQlJRUVFODAyMTFfQ0hBTl9WSFQ0ME1JTlVTIDoKKwkJCQkJSUVFRTgwMjExX0NIQU5fSFQ0ME1JTlVTKTsKKwl9IGVsc2UgaWYgKENIX1dJRFRIXzIwTUhaID09IHJlcS0+Y2hhbl93aWR0aCkgeworCQlkZnNfaWMtPmljX2N1cmNoYW4tPmljX2ZsYWdzIHw9CisJCQkocmVxLT52aHRfY2FwYWJsZSA/IElFRUU4MDIxMV9DSEFOX1ZIVDIwIDoKKwkJCQkJCUlFRUU4MDIxMV9DSEFOX0hUMjApOworCX0KKwlkZnNfaWMtPmljX2N1cmNoYW4tPmljX2ZsYWdleHQgfD0gSUVFRTgwMjExX0NIQU5fREZTOworCisJaWYgKHJlcS0+b3Blcl9tb2RlID09IEJTU19PUEVSQVRJT05BTF9NT0RFX0FQKSB7CisJCWRmc19pYy0+aWNfb3Btb2RlID0gSUVFRTgwMjExX01fSE9TVEFQOworCQlkZnNfaWMtPnZkZXZfaWQgPSByZXEtPnZkZXZfaWQ7CisJfQorCisJZGZzX2ljLT5kZnNfcHJpX211bHRpcGxpZXIgPSByZXEtPmRmc19wcmlfbXVsdGlwbGllcjsKKworCS8qCisJICogQ29uZmlndXJpbmcgdGhlIERGUyB3aXRoIGN1cnJlbnQgY2hhbm5lbCBhbmQgdGhlIHJhZGFyIGZpbHRlcnMKKwkgKi8KKwl3bWFfZGZzX2NvbmZpZ3VyZShkZnNfaWMpOworCVdNQV9MT0dJKCIlczogREZTLSBDSEFOTkVMIENPTkZJR1VSRUQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIGRmc19pYy0+aWNfY3VyY2hhbjsKK30KKworCisvKioKKyAqIHdtYV9zZXRfZGZzX3JlZ2lvbigpIC0gc2V0IERGUyByZWdpb24KKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqCisgKiBDb25maWd1cmUgdGhlIERGUyByZWdpb24gZm9yIERGUyByYWRhciBmaWx0ZXIgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfc2V0X2Rmc19yZWdpb24odHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgZGZzX3JlZ2lvbikKK3sKKwkvKiBkZnMgaW5mb3JtYXRpb24gaXMgcGFzc2VkICovCisJaWYgKGRmc19yZWdpb24gPiBERlNfTUtLNF9ET01BSU4gfHwgZGZzX3JlZ2lvbiA9PSBERlNfVU5JTklUX0RPTUFJTikKKwkJLyogYXNzaWduIERGU19GQ0NfRE9NQUlOIGFzIGRlZmF1bHQgZG9tYWluKi8KKwkJd21hLT5kZnNfaWMtPmN1cnJlbnRfZGZzX3JlZ2RvbWFpbiA9IERGU19GQ0NfRE9NQUlOOworCWVsc2UKKwkJd21hLT5kZnNfaWMtPmN1cnJlbnRfZGZzX3JlZ2RvbWFpbiA9IGRmc19yZWdpb247CisKKwlXTUFfTE9HSSgiJXM6IERGUyBSZWdpb24gRG9tYWluOiAlZCIsIF9fZnVuY19fLAorCQkJIHdtYS0+ZGZzX2ljLT5jdXJyZW50X2Rmc19yZWdkb21haW4pOworfQorCisvKioKKyAqIHdtYV9nZXRfY2hhbm5lbHMoKSAtIHByZXBhcmUgZGZzIHJhZGFyIGNoYW5uZWwgbGlzdAorICogQGljaGFuOiBjaGFubmVsCisgKiBAY2hhbl9saXN0OiByZXR1cm4gY2hhbm5lbCBsaXN0CisgKgorICogUmV0dXJuOiByZXR1cm4gbnVtYmVyIG9mIGNoYW5uZWxzCisgKi8KK2ludCB3bWFfZ2V0X2NoYW5uZWxzKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqaWNoYW4sCisJCSAgICAgc3RydWN0IHdtYV9kZnNfcmFkYXJfY2hhbm5lbF9saXN0ICpjaGFuX2xpc3QpCit7CisJdWludDhfdCBjZW50ZXJfY2hhbiA9IGNkc19mcmVxX3RvX2NoYW4oaWNoYW4tPmljX3ZodG9wX2NoX2ZyZXFfc2VnMSk7CisKKwljaGFuX2xpc3QtPm5jaGFubmVscyA9IDA7CisKKwlpZiAoSUVFRTgwMjExX0lTX0NIQU5fMTFBQ19WSFQ4MChpY2hhbikpIHsKKwkJY2hhbl9saXN0LT5uY2hhbm5lbHMgPSA0OworCQljaGFuX2xpc3QtPmNoYW5uZWxzWzBdID0gY2VudGVyX2NoYW4gLSA2OworCQljaGFuX2xpc3QtPmNoYW5uZWxzWzFdID0gY2VudGVyX2NoYW4gLSAyOworCQljaGFuX2xpc3QtPmNoYW5uZWxzWzJdID0gY2VudGVyX2NoYW4gKyAyOworCQljaGFuX2xpc3QtPmNoYW5uZWxzWzNdID0gY2VudGVyX2NoYW4gKyA2OworCX0gZWxzZSBpZiAoSUVFRTgwMjExX0lTX0NIQU5fMTFOX0hUNDAoaWNoYW4pIHx8CisJCSAgIElFRUU4MDIxMV9JU19DSEFOXzExQUNfVkhUNDAoaWNoYW4pKSB7CisJCWNoYW5fbGlzdC0+bmNoYW5uZWxzID0gMjsKKwkJY2hhbl9saXN0LT5jaGFubmVsc1swXSA9IGNlbnRlcl9jaGFuIC0gMjsKKwkJY2hhbl9saXN0LT5jaGFubmVsc1sxXSA9IGNlbnRlcl9jaGFuICsgMjsKKwl9IGVsc2UgeworCQljaGFuX2xpc3QtPm5jaGFubmVscyA9IDE7CisJCWNoYW5fbGlzdC0+Y2hhbm5lbHNbMF0gPSBjZW50ZXJfY2hhbjsKKwl9CisKKwlyZXR1cm4gY2hhbl9saXN0LT5uY2hhbm5lbHM7Cit9CisKKworLyoqCisgKiB3bWFfZGZzX2luZGljYXRlX3JhZGFyKCkgLSBJbmRpY2F0ZSBSYWRhciB0byBTQVAvSERECisgKiBAaWM6IGllZWU4MDIxMWNvbSBwdHIKKyAqIEBpY2hhbjogaWVlZSA4MDIxMSBjaGFubmVsCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV9kZnNfaW5kaWNhdGVfcmFkYXIoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmljaGFuKQoreworCXRwX3dtYV9oYW5kbGUgd21hOworCXZvaWQgKmhkZF9jdHg7CisJc3RydWN0IHdtYV9kZnNfcmFkYXJfaW5kaWNhdGlvbiAqcmFkYXJfZXZlbnQ7CisJc3RydWN0IHdtYV9kZnNfcmFkYXJfaW5kIHdtYV9yYWRhcl9ldmVudDsKKwl0cEFuaVNpckdsb2JhbCBwbWFjID0gTlVMTDsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKHdtYSA9PSBOVUxMKSB7CisJCVdNQV9MT0dFKCIlczogREZTLSBJbnZhbGlkIHdtYSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaGRkX2N0eCA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hERCk7CisJcG1hYyA9ICh0cEFuaVNpckdsb2JhbCkKKwkJY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCisJaWYgKCFwbWFjKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBNQUMgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAod21hLT5kZnNfaWMgIT0gaWMpIHsKKwkJV01BX0xPR0UoIiVzOkRGUy0gSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJcmFkYXJfZXZlbnQgPSAoc3RydWN0IHdtYV9kZnNfcmFkYXJfaW5kaWNhdGlvbiAqKQorCQkgICAgICBjZGZfbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IHdtYV9kZnNfcmFkYXJfaW5kaWNhdGlvbikpOworCWlmIChyYWRhcl9ldmVudCA9PSBOVUxMKSB7CisJCVdNQV9MT0dFKCIlczpERlMtIEludmFsaWQgcmFkYXJfZXZlbnQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogRG8gbm90IHBvc3QgbXVsdGlwbGUgUmFkYXIgZXZlbnRzIG9uIHRoZSBzYW1lIGNoYW5uZWwuCisJICogQnV0LCB3aGVuIERGUyB0ZXN0IG1vZGUgaXMgZW5hYmxlZCwgYWxsb3cgbXVsdGlwbGUgZGZzCisJICogcmFkYXIgZXZlbnRzIHRvIGJlIHBvc3RlZCBvbiB0aGUgc2FtZSBjaGFubmVsLgorCSAqLworCWlmICgoaWNoYW4tPmljX2llZWUgIT0gKHdtYS0+ZGZzX2ljLT5sYXN0X3JhZGFyX2ZvdW5kX2NoYW4pKSB8fAorCSAgICAocG1hYy0+c2FwLlNhcERmc0luZm8uZGlzYWJsZV9kZnNfY2hfc3dpdGNoID09IHRydWUpKSB7CisJCXdtYS0+ZGZzX2ljLT5sYXN0X3JhZGFyX2ZvdW5kX2NoYW4gPSBpY2hhbi0+aWNfaWVlZTsKKwkJLyogSW5kaWNhdGUgdGhlIHJhZGFyIGV2ZW50IHRvIEhERCB0byBzdG9wIHRoZSBuZXRpZiBUeCBxdWV1ZXMgKi8KKwkJd21hX3JhZGFyX2V2ZW50LmllZWVfY2hhbl9udW1iZXIgPSBpY2hhbi0+aWNfaWVlZTsKKwkJd21hX3JhZGFyX2V2ZW50LmNoYW5fZnJlcSA9IGljaGFuLT5pY19mcmVxOworCQl3bWFfcmFkYXJfZXZlbnQuZGZzX3JhZGFyX3N0YXR1cyA9IFdNQV9ERlNfUkFEQVJfRk9VTkQ7CisJCXdtYS0+ZGZzX3JhZGFyX2luZGljYXRpb25fY2IoaGRkX2N0eCwgJndtYV9yYWRhcl9ldmVudCk7CisJCVdNQV9MT0dFKCIlczpERlMtIFJBREFSIElORElDQVRFRCBUTyBIREQiLCBfX2Z1bmNfXyk7CisKKwkJLyoKKwkJICogSW5kaWNhdGUgdG8gdGhlIHJhZGFyIGV2ZW50IHRvIFNBUCB0bworCQkgKiBzZWxlY3QgYSBuZXcgY2hhbm5lbCBhbmQgc2V0IENTQSBJRQorCQkgKi8KKwkJcmFkYXJfZXZlbnQtPnZkZXZfaWQgPSBpYy0+dmRldl9pZDsKKwkJd21hX2dldF9jaGFubmVscyhpY2hhbiwgJnJhZGFyX2V2ZW50LT5jaGFuX2xpc3QpOworCQlyYWRhcl9ldmVudC0+ZGZzX3JhZGFyX3N0YXR1cyA9IFdNQV9ERlNfUkFEQVJfRk9VTkQ7CisJCXJhZGFyX2V2ZW50LT51c2Vfbm9sID0gaWMtPmljX2Rmc191c2Vub2woaWMpOworCQl3bWFfc2VuZF9tc2cod21hLCBXTUFfREZTX1JBREFSX0lORCwgKHZvaWQgKilyYWRhcl9ldmVudCwgMCk7CisJCVdNQV9MT0dFKCIlczpERlMtIFdNQV9ERlNfUkFEQVJfSU5EIE1lc3NhZ2UgUG9zdGVkIiwgX19mdW5jX18pOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX01FTURVTVAKKy8qCisgKiB3bWFfcHJvY2Vzc19md19tZW1fZHVtcF9yZXEoKSAtIEZ1bmN0aW9uIHRvIHJlcXVlc3QgZncgbWVtb3J5IGR1bXAgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJtd2FyZQorICogQHdtYTogICAgICAgICAgICAgICAgUG9pbnRlciB0byBXTUEgaGFuZGxlCisgKiBAbWVtX2R1bXBfcmVxOiAgICAgICBQb2ludGVyIGZvciBtZW1fZHVtcF9yZXEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIG1lbW9yeSBkdW1wIHJlcXVlc3QgdG8gZmlybXdhcmUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvdGhlcndpc2UgZmFpbHVyZQorICoKKyAqLworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19md19tZW1fZHVtcF9yZXEodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCXN0cnVjdCBmd19kdW1wX3JlcSAqbWVtX2R1bXBfcmVxKQoreworCXdtaV9nZXRfZndfbWVtX2R1bXBfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfZndfbWVtX2R1bXAgKmR1bXBfcGFyYW1zOworCXN0cnVjdCBmd19kdW1wX3NlZ19yZXEgKnNlZ19yZXE7CisJaW50MzJfdCBsZW47CisJd21pX2J1Zl90IGJ1ZjsKKwl1X2ludDhfdCAqYnVmX3B0cjsKKwlpbnQgcmV0LCBsb29wOworCisJaWYgKCFtZW1fZHVtcF9yZXEgfHwgIXdtYSkgeworCQlXTUFfTE9HRShGTCgiaW5wdXQgcG9pbnRlciBpcyBOVUxMIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyoKKwkgKiBsZW4gPSBzaXplb2YoZml4ZWQgcGFyYW0pIHRoYXQgaW5jbHVkZXMgdGx2IGhlYWRlciArCisJICogICAgICAgdGx2IGhlYWRlciBmb3IgYXJyYXkgb2Ygc3RydWMgKworCSAqICAgICAgIHNpemVvZiAoZWFjaCBzdHJ1Y3QpCisJICovCisJbGVuID0gc2l6ZW9mKCpjbWQpICsgV01JX1RMVl9IRFJfU0laRTsKKwlsZW4gKz0gbWVtX2R1bXBfcmVxLT5udW1fc2VnICogc2l6ZW9mKHdtaV9md19tZW1fZHVtcCk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRShGTCgiRmFpbGVkIGFsbG9jYXRlIHdtaSBidWZmZXIiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1X2ludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwljZGZfbWVtX3plcm8oYnVmX3B0ciwgbGVuKTsKKwljbWQgPSAod21pX2dldF9md19tZW1fZHVtcF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJV01JVExWX1RBR19TVFJVQ193bWlfZ2V0X2Z3X21lbV9kdW1wX2ZpeGVkX3BhcmFtLAorCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX2dldF9md19tZW1fZHVtcF9maXhlZF9wYXJhbSkpOworCisJY21kLT5yZXF1ZXN0X2lkID0gbWVtX2R1bXBfcmVxLT5yZXF1ZXN0X2lkOworCWNtZC0+bnVtX2Z3X21lbV9kdW1wX3NlZ3MgPSBtZW1fZHVtcF9yZXEtPm51bV9zZWc7CisKKwkvKiBUTFYgaW5kaWNhdGluZyBhcnJheSBvZiBzdHJ1Y3R1cmVzIHRvIGZvbGxvdyAqLworCWJ1Zl9wdHIgKz0gc2l6ZW9mKHdtaV9nZXRfZndfbWVtX2R1bXBfZml4ZWRfcGFyYW0pOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCSAgICAgICBzaXplb2Yod21pX2Z3X21lbV9kdW1wKSAqCisJCSAgICAgICBjbWQtPm51bV9md19tZW1fZHVtcF9zZWdzKTsKKworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwlkdW1wX3BhcmFtcyA9ICh3bWlfZndfbWVtX2R1bXAgKikgYnVmX3B0cjsKKworCVdNQV9MT0dJKEZMKCJyZXF1ZXN0X2lkOiVkIG51bV9zZWc6JWQiKSwKKwkJICAgIG1lbV9kdW1wX3JlcS0+cmVxdWVzdF9pZCwgbWVtX2R1bXBfcmVxLT5udW1fc2VnKTsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgY21kLT5udW1fZndfbWVtX2R1bXBfc2VnczsgbG9vcCsrKSB7CisJCXNlZ19yZXEgPSAoc3RydWN0IGZ3X2R1bXBfc2VnX3JlcSAqKQorCQkJICAoKHVpbnQ4X3QgKikobWVtX2R1bXBfcmVxLT5zZWdtZW50KSArCisJCQkgICAgbG9vcCAqIHNpemVvZigqc2VnX3JlcSkpOworCQlXTUlUTFZfU0VUX0hEUigmZHVtcF9wYXJhbXMtPnRsdl9oZWFkZXIsCisJCQkgICAgV01JVExWX1RBR19TVFJVQ193bWlfZndfbWVtX2R1bXBfcGFyYW1zLAorCQkJICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfZndfbWVtX2R1bXApKTsKKwkJZHVtcF9wYXJhbXMtPnNlZ19pZCA9IHNlZ19yZXEtPnNlZ19pZDsKKwkJZHVtcF9wYXJhbXMtPnNlZ19zdGFydF9hZGRyX2xvID0gc2VnX3JlcS0+c2VnX3N0YXJ0X2FkZHJfbG87CisJCWR1bXBfcGFyYW1zLT5zZWdfc3RhcnRfYWRkcl9oaSA9IHNlZ19yZXEtPnNlZ19zdGFydF9hZGRyX2hpOworCQlkdW1wX3BhcmFtcy0+c2VnX2xlbmd0aCA9IHNlZ19yZXEtPnNlZ19sZW5ndGg7CisJCWR1bXBfcGFyYW1zLT5kZXN0X2FkZHJfbG8gPSBzZWdfcmVxLT5kc3RfYWRkcl9sbzsKKwkJZHVtcF9wYXJhbXMtPmRlc3RfYWRkcl9oaSA9IHNlZ19yZXEtPmRzdF9hZGRyX2hpOworCQlXTUFfTE9HSShGTCgic2VnX251bWJlcjolZCIpLCBsb29wKTsKKwkJV01BX0xPR0koRkwoInNlZ19pZDolZCBzdGFydF9hZGRyX2xvOjB4JXggc3RhcnRfYWRkcl9oaToweCV4IiksCisJCQkgZHVtcF9wYXJhbXMtPnNlZ19pZCwgZHVtcF9wYXJhbXMtPnNlZ19zdGFydF9hZGRyX2xvLAorCQkJIGR1bXBfcGFyYW1zLT5zZWdfc3RhcnRfYWRkcl9oaSk7CisJCVdNQV9MT0dJKEZMKCJzZWdfbGVuZ3RoOiVkIGRzdF9hZGRyX2xvOjB4JXggZHN0X2FkZHJfaGk6MHgleCIpLAorCQkJIGR1bXBfcGFyYW1zLT5zZWdfbGVuZ3RoLCBkdW1wX3BhcmFtcy0+ZGVzdF9hZGRyX2xvLAorCQkJIGR1bXBfcGFyYW1zLT5kZXN0X2FkZHJfaGkpOworCQlkdW1wX3BhcmFtcysrOworCX0KKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX0dFVF9GV19NRU1fRFVNUF9DTURJRCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRShGTCgiRmFpbGVkIHRvIHNlbmQgZ2V0IGZpcm13YXJlIG1lbSBkdW1wIHJlcXVlc3QiKSk7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJV01BX0xPR0koRkwoIkdldCBmaXJtd2FyZSBtZW0gZHVtcCByZXF1ZXN0IHNlbnQgc3VjY2Vzc2Z1bGx5IikpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2Z3X21lbV9kdW1wX3JzcCgpIC0gc2VuZCBmdyBtZW0gZHVtcCByZXNwb25zZSB0byBTTUUKKyAqCisgKiBAcmVxX2lkIC0gcmVxdWVzdCBpZC4KKyAqIEBzdGF0dXMgLSBjb3B5IHN0YXR1cyBmcm9tIHRoZSBmaXJtd2FyZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgbWVtb3J5IGR1bXAgcmVzcG9uc2UgaGFuZGxlciB0bworICogaW5kaWNhdGUgU01FIHRoYXQgZmlybXdhcmUgZHVtcCBjb3B5IGlzIGNvbXBsZXRlCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTCisgKi8KK3N0YXRpYyBDREZfU1RBVFVTIHdtYV9md19tZW1fZHVtcF9yc3AodWludDMyX3QgcmVxX2lkLCB1aW50MzJfdCBzdGF0dXMpCit7CisJc3RydWN0IGZ3X2R1bXBfcnNwICpkdW1wX3JzcDsKKwljZHNfbXNnX3Qgc21lX21zZyA9IHswfTsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlkdW1wX3JzcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqZHVtcF9yc3ApKTsKKworCWlmICghZHVtcF9yc3ApIHsKKwkJV01BX0xPR0UoRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4iKSk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCXJldHVybiBjZGZfc3RhdHVzOworCX0KKworCVdNQV9MT0dJKEZMKCJGVyBtZW1vcnkgZHVtcCBjb3B5IGNvbXBsZXRlIHN0YXR1czogJWQgZm9yIHJlcXVlc3Q6ICVkIiksCisJCSBzdGF0dXMsIHJlcV9pZCk7CisKKwlkdW1wX3JzcC0+cmVxdWVzdF9pZCA9IHJlcV9pZDsKKwlkdW1wX3JzcC0+ZHVtcF9jb21wbGV0ZSA9IHN0YXR1czsKKworCXNtZV9tc2cudHlwZSA9IGVXTklfU01FX0ZXX0RVTVBfSU5EOworCXNtZV9tc2cuYm9keXB0ciA9IGR1bXBfcnNwOworCXNtZV9tc2cuYm9keXZhbCA9IDA7CisKKwljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1NNRSwgJnNtZV9tc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCVdNQV9MT0dFKEZMKCJGYWlsIHRvIHBvc3QgZncgbWVtIGR1bXAgaW5kIG1zZyIpKTsKKwkJY2RmX21lbV9mcmVlKGR1bXBfcnNwKTsKKwl9CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiB3bWFfZndfbWVtX2R1bXBfZXZlbnRfaGFuZGxlcigpIC0gaGFuZGxlcyBmdyBtZW1vcnkgZHVtcCBldmVudAorICoKKyAqIEBoYW5kbGU6IHBvaW50ZXIgdG8gd21hIGhhbmRsZS4KKyAqIEBjbWRfcGFyYW1faW5mbzogcG9pbnRlciB0byBUTFYgaW5mbyByZWNlaXZlZCBpbiB0aGUgZXZlbnQuCisgKiBAbGVuOiBsZW5ndGggb2YgZGF0YSBpbiBAY21kX3BhcmFtX2luZm8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgaGFuZGxlciBmb3IgZmlybXdhcmUgbWVtb3J5IGR1bXAgZXZlbnQuCisgKgorICogUmV0dXJuOiBpbnRlZ2VyICgwIGZvciBzdWNjZXNzIGFuZCBlcnJvciBjb2RlIG90aGVyd2lzZSkKKyAqLworaW50IHdtYV9md19tZW1fZHVtcF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdV9pbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgdV9pbnQzMl90IGxlbikKK3sKKwlXTUlfVVBEQVRFX0ZXX01FTV9EVU1QX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV91cGRhdGVfZndfbWVtX2R1bXBfZml4ZWRfcGFyYW0gKmV2ZW50OworCUNERl9TVEFUVVMgc3RhdHVzOworCisJcGFyYW1fYnVmID0KKwkgICAgKFdNSV9VUERBVEVfRldfTUVNX0RVTVBfRVZFTlRJRF9wYXJhbV90bHZzICopIGNtZF9wYXJhbV9pbmZvOworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dBKCIlczogSW52YWxpZCBzdGF0cyBldmVudCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCisJc3RhdHVzID0gd21hX2Z3X21lbV9kdW1wX3JzcChldmVudC0+cmVxdWVzdF9pZCwKKwkJCQkJIGV2ZW50LT5md19tZW1fZHVtcF9jb21wbGV0ZSk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJV01BX0xPR0UoIkVycm9yIHBvc3RpbmcgRlcgTUVNIERVTVAgUlNQLiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlXTUFfTE9HSSgiRlcgTUVNIERVTVAgUlNQIHBvc3RlZCBzdWNjZXNzZnVsbHkiKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTUVNRFVNUCAqLworCisvKgorICogd21hX3Byb2Nlc3Nfc2V0X2llX2luZm8oKSAtIEZ1bmN0aW9uIHRvIHNlbmQgSUUgaW5mbyB0byBmaXJtd2FyZQorICogQHdtYTogICAgICAgICAgICAgICAgUG9pbnRlciB0byBXTUEgaGFuZGxlCisgKiBAaWVfZGF0YTogICAgICAgUG9pbnRlciBmb3IgaWUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgSUUgaW5mb3JtYXRpb24gdG8gZmlybXdhcmUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvdGhlcndpc2UgZmFpbHVyZQorICoKKyAqLworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19zZXRfaWVfaW5mbyh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgICBzdHJ1Y3QgdmRldl9pZV9pbmZvICppZV9pbmZvKQoreworCXdtaV92ZGV2X3NldF9pZV9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJdWludDMyX3QgbGVuLCBpZV9sZW5fYWxpZ25lZDsKKwlpbnQgcmV0OworCisJaWYgKCFpZV9pbmZvIHx8ICF3bWEpIHsKKwkJV01BX0xPR0UoRkwoImlucHV0IHBvaW50ZXIgaXMgTlVMTCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIFZhbGlkYXRlIHRoZSBpbnB1dCAqLworCWlmIChpZV9pbmZvLT5sZW5ndGggIDw9IDApIHsKKwkJV01BX0xPR0UoRkwoIkludmFsaWQgSUUgbGVuZ3RoIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWllX2xlbl9hbGlnbmVkID0gcm91bmR1cChpZV9pbmZvLT5sZW5ndGgsIHNpemVvZih1aW50MzJfdCkpOworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFdNSSBjb21tYW5kICovCisJbGVuID0gc2l6ZW9mKCpjbWQpICsgV01JX1RMVl9IRFJfU0laRSArIGllX2xlbl9hbGlnbmVkOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoRkwoIndtaV9idWZfYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWJ1Zl9wdHIgPSB3bWlfYnVmX2RhdGEoYnVmKTsKKwljZGZfbWVtX3plcm8oYnVmX3B0ciwgbGVuKTsKKworCS8qIFBvcHVsYXRlIHRoZSBXTUkgY29tbWFuZCAqLworCWNtZCA9ICh3bWlfdmRldl9zZXRfaWVfY21kX2ZpeGVkX3BhcmFtICopYnVmX3B0cjsKKworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF9pZV9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oCisJCQl3bWlfdmRldl9zZXRfaWVfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gaWVfaW5mby0+dmRldl9pZDsKKwljbWQtPmllX2lkID0gaWVfaW5mby0+aWVfaWQ7CisJY21kLT5pZV9sZW4gPSBpZV9pbmZvLT5sZW5ndGg7CisKKwlXTUFfTE9HRChGTCgiSUU6JWQgb2Ygc2l6ZTolZCBzZW50IGZvciB2ZGV2OiVkIiksIGllX2luZm8tPmllX2lkLAorCQkgaWVfaW5mby0+bGVuZ3RoLCBpZV9pbmZvLT52ZGV2X2lkKTsKKworCWJ1Zl9wdHIgKz0gc2l6ZW9mKCpjbWQpOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgaWVfbGVuX2FsaWduZWQpOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKworCWNkZl9tZW1fY29weShidWZfcHRyLCBpZV9pbmZvLT5kYXRhLCBjbWQtPmllX2xlbik7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9WREVWX1NFVF9JRV9DTURJRCk7CisJaWYgKHJldCAhPSBFT0spIHsKKwkJV01BX0xPR0UoRkwoIkZhaWxlZCB0byBzZW5kIHNldCBJRSBjb21tYW5kIHJldCA9ICVkIiksIHJldCk7CisJCXdtaV9idWZfZnJlZShidWYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2NvcmUvd21hL3NyYy93bWFfbWFpbi5jIGIvY29yZS93bWEvc3JjL3dtYV9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3NjY4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvd21hL3NyYy93bWFfbWFpbi5jCkBAIC0wLDAgKzEsNTM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiAgRE9DOiAgd21hX21haW4uYworICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgd21hIGluaXRpYWxpemF0aW9uIGFuZCBGVyBleGNoYW5nZQorICogIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKKy8qIEhlYWRlciBmaWxlcyAqLworCisjaW5jbHVkZSAid21hLmgiCisjaW5jbHVkZSAid21hX2FwaS5oIgorI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJ3bWlfdW5pZmllZF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9zeXMuaCIKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgIndtaV91bmlmaWVkLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJvbF90eHJ4X2N0cmxfYXBpLmgiCisjaW5jbHVkZSAid2xhbl90Z3RfZGVmX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiY2RmX25idWYuaCIKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJvbF90eHJ4X2FwaS5oIgorI2luY2x1ZGUgImNkZl9tZW1vcnkuaCIKKyNpbmNsdWRlICJvbF90eHJ4X3R5cGVzLmgiCisjaW5jbHVkZSAib2xfdHhyeF9wZWVyX2ZpbmQuaCIKKworI2luY2x1ZGUgIndtYV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV9hcGkuaCIKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbl91dGlscy5oIgorCisjaW5jbHVkZSAiY2RzX3V0aWxzLmgiCisKKyNpZiAhZGVmaW5lZChSRU1PVkVfUEtUX0xPRykKKyNpbmNsdWRlICJwa3Rsb2dfYWMuaCIKKyNlbmRpZiAvKiBSRU1PVkVfUEtUX0xPRyAqLworCisjaW5jbHVkZSAiZGJnbG9nX2hvc3QuaCIKKy8qIEZJWE1FOiBJbmNsdXNpb24gb2YgLmMgbG9va3Mgb2RkCisgKiBidXQgdGhpcyBpcyBob3cgaXQgaXMgaW4gaW50ZXJuYWwgY29kZWJhc2UKKyAqLworI2luY2x1ZGUgIndtaV92ZXJzaW9uX3doaXRlbGlzdC5jIgorI2luY2x1ZGUgImNzcl9hcGkuaCIKKyNpbmNsdWRlICJvbF9mdy5oIgorCisjaW5jbHVkZSAiZGZzLmgiCisjaW5jbHVkZSAid21hX2ludGVybmFsLmgiCisKKyNpbmNsdWRlICJ3bWFfb2NiLmgiCisKKyNkZWZpbmUgV01BX0xPR19DT01QTEVUSU9OX1RJTUVSIDEwMDAwIC8qIDEwIHNlY29uZHMgKi8KKyNkZWZpbmUgV01BX1NFUlZJQ0VfUkVBRFlfRVhUX1RJTUVPVVQgMjAwMCAvKiAyIHNlY29uZHMgKi8KKworc3RhdGljIHVpbnQzMl90IGdfZndfd2xhbl9mZWF0X2NhcHM7CisKKy8qKgorICogd21hX2dldF9md193bGFuX2ZlYXRfY2FwcygpIC0gZ2V0IGZ3IGZlYXR1cmUgY2FwYWJsaXR5CisgKiBAZmVhdEVudW1WYWx1ZTogZmVhdHVyZSBlbnVtIHZhbHVlCisgKgorICogUmV0dXJuOiB0cnVlL2ZhbHNlCisgKi8KK3VpbnQ4X3Qgd21hX2dldF9md193bGFuX2ZlYXRfY2Fwcyh1aW50OF90IGZlYXRFbnVtVmFsdWUpCit7CisJcmV0dXJuIChnX2Z3X3dsYW5fZmVhdF9jYXBzICYgKDEgPDwgZmVhdEVudW1WYWx1ZSkpID8gdHJ1ZSA6IGZhbHNlOworfQorCisvKioKKyAqIHdtYV9zZXRfZGVmYXVsdF90Z3RfY29uZmlnKCkgLSBzZXQgZGVmYXVsdCB0Z3QgY29uZmlnCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfc2V0X2RlZmF1bHRfdGd0X2NvbmZpZyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpCit7CisJc3RydWN0IG9sX3NvZnRjICpzY247CisJdWludDhfdCBub19vZl9wZWVyc19zdXBwb3J0ZWQ7CisJd21pX3Jlc291cmNlX2NvbmZpZyB0Z3RfY2ZnID0geworCQkwLCAgICAgICAgICAgICAgLyogRmlsbGluZyB6ZXJvIGZvciBUTFYgVGFnIGFuZCBMZW5ndGggZmllbGRzICovCisJCUNGR19UR1RfTlVNX1ZERVYsCisJCUNGR19UR1RfTlVNX1BFRVJTICsgQ0ZHX1RHVF9OVU1fVkRFViArIDIsCisJCUNGR19UR1RfTlVNX09GRkxPQURfUEVFUlMsCisJCUNGR19UR1RfTlVNX09GRkxPQURfUkVPUkRFUl9CVUZGUywKKwkJQ0ZHX1RHVF9OVU1fUEVFUl9LRVlTLAorCQlDRkdfVEdUX05VTV9USURTLAorCQlDRkdfVEdUX0FTVF9TS0lEX0xJTUlULAorCQlDRkdfVEdUX0RFRkFVTFRfVFhfQ0hBSU5fTUFTSywKKwkJQ0ZHX1RHVF9ERUZBVUxUX1JYX0NIQUlOX01BU0ssCisJCXtDRkdfVEdUX1JYX1RJTUVPVVRfTE9fUFJJLCBDRkdfVEdUX1JYX1RJTUVPVVRfTE9fUFJJLAorCQkgQ0ZHX1RHVF9SWF9USU1FT1VUX0xPX1BSSSwgQ0ZHX1RHVF9SWF9USU1FT1VUX0hJX1BSSX0sCisJCUNGR19UR1RfUlhfREVDQVBfTU9ERSwKKwkJQ0ZHX1RHVF9ERUZBVUxUX1NDQU5fTUFYX1JFUVMsCisJCUNGR19UR1RfREVGQVVMVF9CTUlTU19PRkZMT0FEX01BWF9WREVWLAorCQlDRkdfVEdUX0RFRkFVTFRfUk9BTV9PRkZMT0FEX01BWF9WREVWLAorCQlDRkdfVEdUX0RFRkFVTFRfUk9BTV9PRkZMT0FEX01BWF9QUk9GSUxFUywKKwkJQ0ZHX1RHVF9ERUZBVUxUX05VTV9NQ0FTVF9HUk9VUFMsCisJCUNGR19UR1RfREVGQVVMVF9OVU1fTUNBU1RfVEFCTEVfRUxFTVMsCisJCUNGR19UR1RfREVGQVVMVF9NQ0FTVDJVQ0FTVF9NT0RFLAorCQlDRkdfVEdUX0RFRkFVTFRfVFhfREJHX0xPR19TSVpFLAorCQlDRkdfVEdUX1dEU19FTlRSSUVTLAorCQlDRkdfVEdUX0RFRkFVTFRfRE1BX0JVUlNUX1NJWkUsCisJCUNGR19UR1RfREVGQVVMVF9NQUNfQUdHUl9ERUxJTSwKKwkJQ0ZHX1RHVF9ERUZBVUxUX1JYX1NLSVBfREVGUkFHX1RJTUVPVVRfRFVQX0RFVEVDVElPTl9DSEVDSywKKwkJQ0ZHX1RHVF9ERUZBVUxUX1ZPV19DT05GSUcsCisJCUNGR19UR1RfREVGQVVMVF9HVEtfT0ZGTE9BRF9NQVhfVkRFViwKKwkJQ0ZHX1RHVF9OVU1fTVNEVV9ERVNDLAorCQlDRkdfVEdUX01BWF9GUkFHX1RBQkxFX0VOVFJJRVMsCisJCUNGR19UR1RfTlVNX1RETFNfVkRFVlMsCisJCUNGR19UR1RfTlVNX1RETFNfQ09OTl9UQUJMRV9FTlRSSUVTLAorCQlDRkdfVEdUX0RFRkFVTFRfQkVBQ09OX1RYX09GRkxPQURfTUFYX1ZERVYsCisJCUNGR19UR1RfTUFYX01VTFRJQ0FTVF9GSUxURVJfRU5UUklFUywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJQ0ZHX1RHVF9OVU1fVERMU19DT05DX1NMRUVQX1NUQVMsCisJCUNGR19UR1RfTlVNX1RETFNfQ09OQ19CVUZGRVJfU1RBUywKKwkJMCwKKwkJQ0ZHX1RHVF9OVU1fT0NCX1ZERVZTLAorCQlDRkdfVEdUX05VTV9PQ0JfQ0hBTk5FTFMsCisJCUNGR19UR1RfTlVNX09DQl9TQ0hFRFVMRVMsCisJfTsKKworCS8qIFVwZGF0ZSB0aGUgbWF4IG51bWJlciBvZiBwZWVycyAqLworCXNjbiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0hJRik7CisJaWYgKCFzY24pIHsKKwkJV01BX0xPR0UoIiVzOiBjZHNfY29udGV4dCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCW5vX29mX3BlZXJzX3N1cHBvcnRlZCA9IG9sX2dldF9udW1iZXJfb2ZfcGVlcnNfc3VwcG9ydGVkKHNjbik7CisJdGd0X2NmZy5udW1fcGVlcnMgPSBub19vZl9wZWVyc19zdXBwb3J0ZWQgKyBDRkdfVEdUX05VTV9WREVWICsgMjsKKwl0Z3RfY2ZnLm51bV90aWRzID0gKDIgKiAobm9fb2ZfcGVlcnNfc3VwcG9ydGVkICsgQ0ZHX1RHVF9OVU1fVkRFViArIDIpKTsKKwl0Z3RfY2ZnLnNjYW5fbWF4X3BlbmRpbmdfcmVxID0gd21hX2hhbmRsZS0+bWF4X3NjYW47CisKKwlXTUlUTFZfU0VUX0hEUigmdGd0X2NmZy50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcmVzb3VyY2VfY29uZmlnLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV9yZXNvdXJjZV9jb25maWcpKTsKKwkvKiByZWR1Y2UgdGhlIHBlZXIvdmRldiBpZiBDRkdfVEdUX05VTV9NU0RVX0RFU0MgZXhjZWVkcyAxMDAwICovCisjaWZkZWYgUEVSRV9JUF9IRFJfQUxJR05NRU5UX1dBUgorCWlmIChzY24tPmhvc3RfODAyMTFfZW5hYmxlKSB7CisJCS8qCisJCSAqIFRvIG1ha2UgdGhlIElQIGhlYWRlciBiZWdpbnMgYXQgZHdvcmQgYWxpZ25lZCBhZGRyZXNzLAorCQkgKiB3ZSBtYWtlIHRoZSBkZWNhcHN1bGF0aW9uIG1vZGUgYXMgTmF0aXZlIFdpZmkuCisJCSAqLworCQl0Z3RfY2ZnLnJ4X2RlY2FwX21vZGUgPSBDRkdfVEdUX1JYX0RFQ0FQX01PREVfTldJRkk7CisJfQorI2VuZGlmIC8qIFBFUkVfSVBfSERSX0FMSUdOTUVOVF9XQVIgKi8KKwl3bWFfaGFuZGxlLT53bGFuX3Jlc291cmNlX2NvbmZpZyA9IHRndF9jZmc7Cit9CisKKy8qKgorICogd21hX2NsaV9nZXRfY29tbWFuZCgpIC0gV01BICJnZXQiIGNvbW1hbmQgcHJvY2Vzc29yCisgKiBAdmRldl9pZDogdmlydHVhbCBkZXZpY2UgZm9yIHRoZSBjb21tYW5kCisgKiBAcGFyYW1faWQ6IHBhcmFtZXRlciBpZAorICogQHZwZGV2OiBwYXJhbWV0ZXIgY2F0ZWdvcnkKKyAqCisgKiBSZXR1cm46IHBhcmFtZXRlciB2YWx1ZSBvbiBzdWNjZXNzLCAtRUlOVkFMIG9uIGZhaWx1cmUKKyAqLworaW50IHdtYV9jbGlfZ2V0X2NvbW1hbmQoaW50IHZkZXZfaWQsIGludCBwYXJhbV9pZCwgaW50IHZwZGV2KQoreworCWludCByZXQgPSAwOworCXRwX3dtYV9oYW5kbGUgd21hOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppbnRyID0gTlVMTDsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisKKwlpZiAoTlVMTCA9PSB3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIHdtYSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWludHIgPSB3bWEtPmludGVyZmFjZXM7CisKKwlpZiAoVkRFVl9DTUQgPT0gdnBkZXYpIHsKKwkJc3dpdGNoIChwYXJhbV9pZCkgeworCQljYXNlIFdNSV9WREVWX1BBUkFNX05TUzoKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLm5zczsKKwkJCWJyZWFrOworI2lmZGVmIFFDQV9TVVBQT1JUX0dUWAorCQljYXNlIFdNSV9WREVWX1BBUkFNX0dUWF9IVF9NQ1M6CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5ndHhfaW5mby5ndHhSVE1hc2tbMF07CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9HVFhfVkhUX01DUzoKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLmd0eF9pbmZvLmd0eFJUTWFza1sxXTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BBUkFNX0dUWF9VU1JfQ0ZHOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcuZ3R4X2luZm8uZ3R4VXNyY2ZnOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fR1RYX1RIUkU6CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5ndHhfaW5mby5ndHhQRVJUaHJlc2hvbGQ7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9HVFhfTUFSR0lOOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcuZ3R4X2luZm8uZ3R4UEVSTWFyZ2luOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fR1RYX1NURVA6CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5ndHhfaW5mby5ndHhUUENzdGVwOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fR1RYX01JTlRQQzoKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLmd0eF9pbmZvLmd0eFRQQ01pbjsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BBUkFNX0dUWF9CV19NQVNLOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcuZ3R4X2luZm8uZ3R4QldNYXNrOworCQkJYnJlYWs7CisjZW5kaWYgLyogUUNBX1NVUFBPUlRfR1RYICovCisJCWNhc2UgV01JX1ZERVZfUEFSQU1fTERQQzoKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLmxkcGM7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9UWF9TVEJDOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcudHhfc3RiYzsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BBUkFNX1JYX1NUQkM6CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5yeF9zdGJjOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fU0dJOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcuc2hvcnRnaTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BBUkFNX0VOQUJMRV9SVFNDVFM6CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5ydHNjdHNfZW47CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9DSFdJRFRIOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcuY2h3aWR0aDsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BBUkFNX0ZJWEVEX1JBVEU6CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy50eF9yYXRlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlXTUFfTE9HRSgiSW52YWxpZCBjbGlfZ2V0IHZkZXYgY29tbWFuZC9Ob3QiCisJCQkJICIgeWV0IGltcGxlbWVudGVkIDB4JXgiLCBwYXJhbV9pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoUERFVl9DTUQgPT0gdnBkZXYpIHsKKwkJc3dpdGNoIChwYXJhbV9pZCkgeworCQljYXNlIFdNSV9QREVWX1BBUkFNX0FOSV9FTkFCTEU6CisJCQlyZXQgPSB3bWEtPnBkZXZjb25maWcuYW5pX2VuYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9QREVWX1BBUkFNX0FOSV9QT0xMX1BFUklPRDoKKwkJCXJldCA9IHdtYS0+cGRldmNvbmZpZy5hbmlfcG9sbF9sZW47CisJCQlicmVhazsKKwkJY2FzZSBXTUlfUERFVl9QQVJBTV9BTklfTElTVEVOX1BFUklPRDoKKwkJCXJldCA9IHdtYS0+cGRldmNvbmZpZy5hbmlfbGlzdGVuX2xlbjsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9QREVWX1BBUkFNX0FOSV9PRkRNX0xFVkVMOgorCQkJcmV0ID0gd21hLT5wZGV2Y29uZmlnLmFuaV9vZmRtX2xldmVsOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fQU5JX0NDS19MRVZFTDoKKwkJCXJldCA9IHdtYS0+cGRldmNvbmZpZy5hbmlfY2NrX2xldmVsOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fRFlOQU1JQ19CVzoKKwkJCXJldCA9IHdtYS0+cGRldmNvbmZpZy5jd21lbmFibGU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfUERFVl9QQVJBTV9DVFNfQ0JXOgorCQkJcmV0ID0gd21hLT5wZGV2Y29uZmlnLmN0c19jYnc7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfUERFVl9QQVJBTV9UWF9DSEFJTl9NQVNLOgorCQkJcmV0ID0gd21hLT5wZGV2Y29uZmlnLnR4Y2hhaW5tYXNrOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fUlhfQ0hBSU5fTUFTSzoKKwkJCXJldCA9IHdtYS0+cGRldmNvbmZpZy5yeGNoYWlubWFzazsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9QREVWX1BBUkFNX1RYUE9XRVJfTElNSVQyRzoKKwkJCXJldCA9IHdtYS0+cGRldmNvbmZpZy50eHBvdzJnOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fVFhQT1dFUl9MSU1JVDVHOgorCQkJcmV0ID0gd21hLT5wZGV2Y29uZmlnLnR4cG93NWc7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfUERFVl9QQVJBTV9QT1dFUl9HQVRJTkdfU0xFRVA6CisJCQlyZXQgPSB3bWEtPnBkZXZjb25maWcucHdyZ2F0aW5nOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fQlVSU1RfRU5BQkxFOgorCQkJcmV0ID0gd21hLT5wZGV2Y29uZmlnLmJ1cnN0X2VuYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9QREVWX1BBUkFNX0JVUlNUX0RVUjoKKwkJCXJldCA9IHdtYS0+cGRldmNvbmZpZy5idXJzdF9kdXI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdNQV9MT0dFKCJJbnZhbGlkIGNsaV9nZXQgcGRldiBjb21tYW5kL05vdCIKKwkJCQkgIiB5ZXQgaW1wbGVtZW50ZWQgMHgleCIsIHBhcmFtX2lkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmIChHRU5fQ01EID09IHZwZGV2KSB7CisJCXN3aXRjaCAocGFyYW1faWQpIHsKKwkJY2FzZSBHRU5fVkRFVl9QQVJBTV9BTVBEVToKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLmFtcGR1OworCQkJYnJlYWs7CisJCWNhc2UgR0VOX1ZERVZfUEFSQU1fQU1TRFU6CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5hbXNkdTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJV01BX0xPR0UoIkludmFsaWQgZ2VuZXJpYyB2ZGV2IGNvbW1hbmQvTm90IgorCQkJCSAiIHlldCBpbXBsZW1lbnRlZCAweCV4IiwgcGFyYW1faWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKFBQU19DTUQgPT0gdnBkZXYpIHsKKwkJc3dpdGNoIChwYXJhbV9pZCkgeworCQljYXNlIFdNSV9WREVWX1BQU19QQUlEX01BVENIOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcucHBzX3BhcmFtcy5wYWlkX21hdGNoX2VuYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BQU19HSURfTUFUQ0g6CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5wcHNfcGFyYW1zLmdpZF9tYXRjaF9lbmFibGU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QUFNfRUFSTFlfVElNX0NMRUFSOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcucHBzX3BhcmFtcy50aW1fY2xlYXI7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QUFNfRUFSTFlfRFRJTV9DTEVBUjoKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLnBwc19wYXJhbXMuZHRpbV9jbGVhcjsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BQU19FT0ZfUEFEX0RFTElNOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcucHBzX3BhcmFtcy5lb2ZfZGVsaW07CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QUFNfTUFDQUREUl9NSVNNQVRDSDoKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLnBwc19wYXJhbXMubWFjX21hdGNoOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUFBTX0RFTElNX0NSQ19GQUlMOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcucHBzX3BhcmFtcy5kZWxpbV9mYWlsOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUFBTX0dJRF9OU1RTX1pFUk86CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5wcHNfcGFyYW1zLm5zdHNfemVybzsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BQU19SU1NJX0NIRUNLOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcucHBzX3BhcmFtcy5yc3NpX2NoazsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJV01BX0xPR0UoIkludmFsaWQgcHBzIHZkZXYgY29tbWFuZC9Ob3QiCisJCQkJICIgeWV0IGltcGxlbWVudGVkIDB4JXgiLCBwYXJhbV9pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoUVBPV0VSX0NNRCA9PSB2cGRldikgeworCQlzd2l0Y2ggKHBhcmFtX2lkKSB7CisJCWNhc2UgV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfUFNQT0xMX0NPVU5UOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcucXBvd2VyX3BhcmFtcy4KKwkJCSAgICAgIG1heF9wc19wb2xsX2NudDsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9TVEFfUFNfUEFSQU1fUVBPV0VSX01BWF9UWF9CRUZPUkVfV0FLRToKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLnFwb3dlcl9wYXJhbXMuCisJCQkgICAgICBtYXhfdHhfYmVmb3JlX3dha2U7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfU1RBX1BTX1BBUkFNX1FQT1dFUl9TUEVDX1BTUE9MTF9XQUtFX0lOVEVSVkFMOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcucXBvd2VyX3BhcmFtcy4KKwkJCSAgICAgIHNwZWNfcHNfcG9sbF93YWtlX2ludGVydmFsOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfU1BFQ19NQVhfU1BFQ19OT0RBVEFfUFNQT0xMOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcucXBvd2VyX3BhcmFtcy4KKwkJCSAgICAgIG1heF9zcGVjX25vZGF0YV9wc19wb2xsOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlXTUFfTE9HRSgiSW52YWxpZCBnZW5lcmljIHZkZXYgY29tbWFuZC9Ob3QiCisJCQkJICIgeWV0IGltcGxlbWVudGVkIDB4JXgiLCBwYXJhbV9pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoR1RYX0NNRCA9PSB2cGRldikgeworCQlzd2l0Y2ggKHBhcmFtX2lkKSB7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fR1RYX0hUX01DUzoKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLmd0eF9pbmZvLmd0eFJUTWFza1swXTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BBUkFNX0dUWF9WSFRfTUNTOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcuZ3R4X2luZm8uZ3R4UlRNYXNrWzFdOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fR1RYX1VTUl9DRkc6CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5ndHhfaW5mby5ndHhVc3JjZmc7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9HVFhfVEhSRToKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLmd0eF9pbmZvLmd0eFBFUlRocmVzaG9sZDsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BBUkFNX0dUWF9NQVJHSU46CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5ndHhfaW5mby5ndHhQRVJNYXJnaW47CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9HVFhfU1RFUDoKKwkJCXJldCA9IGludHJbdmRldl9pZF0uY29uZmlnLmd0eF9pbmZvLmd0eFRQQ3N0ZXA7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9HVFhfTUlOVFBDOgorCQkJcmV0ID0gaW50clt2ZGV2X2lkXS5jb25maWcuZ3R4X2luZm8uZ3R4VFBDTWluOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fR1RYX0JXX01BU0s6CisJCQlyZXQgPSBpbnRyW3ZkZXZfaWRdLmNvbmZpZy5ndHhfaW5mby5ndHhCV01hc2s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdNQV9MT0dFKCJJbnZhbGlkIGdlbmVyaWMgdmRldiBjb21tYW5kL05vdCIKKwkJCQkgIiB5ZXQgaW1wbGVtZW50ZWQgMHgleCIsIHBhcmFtX2lkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd21hX2NsaV9zZXQyX2NvbW1hbmQoKSAtIFdNQSAic2V0IDIgcGFyYW1zIiBjb21tYW5kIHByb2Nlc3NvcgorICogQHZkZXZfaWQ6IHZpcnR1YWwgZGV2aWNlIGZvciB0aGUgY29tbWFuZAorICogQHBhcmFtX2lkOiBwYXJhbWV0ZXIgaWQKKyAqIEBzdmFsMTogZmlyc3QgcGFyYW1ldGVyIHZhbHVlCisgKiBAc3ZhbDI6IHNlY29uZCBwYXJhbWV0ZXIgdmFsdWUKKyAqIEB2cGRldjogcGFyYW1ldGVyIGNhdGVnb3J5CisgKgorICogQ29tbWFuZCBoYW5kbGVyIGZvciBzZXQgb3BlcmF0aW9ucyB3aGljaCByZXF1aXJlIDIgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlCisgKi8KK2ludCB3bWFfY2xpX3NldDJfY29tbWFuZChpbnQgdmRldl9pZCwgaW50IHBhcmFtX2lkLCBpbnQgc3ZhbDEsCisJCQkgaW50IHN2YWwyLCBpbnQgdnBkZXYpCit7CisJY2RzX21zZ190IG1zZyA9IHsgMCB9OworCXdtYV9jbGlfc2V0X2NtZF90ICppd2NtZDsKKworCWl3Y21kID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCppd2NtZCkpOworCWlmICghaXdjbWQpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2MgbWVtb3J5IGZvciBpd2NtZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2RmX21lbV96ZXJvKGl3Y21kLCBzaXplb2YoKml3Y21kKSk7CisJaXdjbWQtPnBhcmFtX3ZhbHVlID0gc3ZhbDE7CisJaXdjbWQtPnBhcmFtX3NlY192YWx1ZSA9IHN2YWwyOworCWl3Y21kLT5wYXJhbV92ZGV2X2lkID0gdmRldl9pZDsKKwlpd2NtZC0+cGFyYW1faWQgPSBwYXJhbV9pZDsKKwlpd2NtZC0+cGFyYW1fdnBfZGV2ID0gdnBkZXY7CisJbXNnLnR5cGUgPSBXTUFfQ0xJX1NFVF9DTUQ7CisJbXNnLnJlc2VydmVkID0gMDsKKwltc2cuYm9keXB0ciA9IGl3Y21kOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPQorCSAgICBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfV01BLCAmbXNnKSkgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byBwb3N0IFdNQV9DTElfU0VUX0NNRCBtc2ciLAorCQkJICBfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShpd2NtZCk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfY2xpX3NldF9jb21tYW5kKCkgLSBXTUEgInNldCIgY29tbWFuZCBwcm9jZXNzb3IKKyAqIEB2ZGV2X2lkOiB2aXJ0dWFsIGRldmljZSBmb3IgdGhlIGNvbW1hbmQKKyAqIEBwYXJhbV9pZDogcGFyYW1ldGVyIGlkCisgKiBAc3ZhbDogcGFyYW1ldGVyIHZhbHVlCisgKiBAdnBkZXY6IHBhcmFtZXRlciBjYXRlZ29yeQorICoKKyAqIENvbW1hbmQgaGFuZGxlciBmb3Igc2V0IG9wZXJhdGlvbnMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZQorICovCitpbnQgd21hX2NsaV9zZXRfY29tbWFuZChpbnQgdmRldl9pZCwgaW50IHBhcmFtX2lkLCBpbnQgc3ZhbCwgaW50IHZwZGV2KQoreworCXJldHVybiB3bWFfY2xpX3NldDJfY29tbWFuZCh2ZGV2X2lkLCBwYXJhbV9pZCwgc3ZhbCwgMCwgdnBkZXYpOworCit9CisKKy8qKgorICogd21hX3NldF9wcml2X2NmZygpIC0gc2V0IHByaXZhdGUgY29uZmlnIHBhcmFtZXRlcnMKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcHJpdmNtZDogcHJpdmF0ZSBjb21tYW5kCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludDMyX3Qgd21hX3NldF9wcml2X2NmZyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJd21hX2NsaV9zZXRfY21kX3QgKnByaXZjbWQpCit7CisJaW50MzJfdCByZXQgPSAwOworCisJc3dpdGNoIChwcml2Y21kLT5wYXJhbV9pZCkgeworCWNhc2UgV01BX1ZERVZfVFhSWF9GV1NUQVRTX0VOQUJMRV9DTURJRDoKKwkJcmV0ID0gd21hX3NldF90eHJ4X2Z3X3N0YXRzX2xldmVsKHdtYV9oYW5kbGUsCisJCQkJCQkgIHByaXZjbWQtPnBhcmFtX3ZkZXZfaWQsCisJCQkJCQkgIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfVkRFVl9UWFJYX0ZXU1RBVFNfUkVTRVRfQ01ESUQ6CisJCXJldCA9IHdtYV90eHJ4X2Z3X3N0YXRzX3Jlc2V0KHdtYV9oYW5kbGUsCisJCQkJCSAgICAgIHByaXZjbWQtPnBhcmFtX3ZkZXZfaWQsCisJCQkJCSAgICAgIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBXTUlfU1RBX1NNUFNfRk9SQ0VfTU9ERV9DTURJRDoKKwkJd21hX3NldF9taW1vcHMod21hX2hhbmRsZSwgcHJpdmNtZC0+cGFyYW1fdmRldl9pZCwKKwkJCSAgICAgICBwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgV01JX1NUQV9TTVBTX1BBUkFNX0NNRElEOgorCQl3bWFfc2V0X3NtcHNfcGFyYW1zKHdtYV9oYW5kbGUsIHByaXZjbWQtPnBhcmFtX3ZkZXZfaWQsCisJCQkJICAgIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfVkRFVl9NQ0NfU0VUX1RJTUVfTEFURU5DWToKKwl7CisJCS8qIEV4dHJhY3QgZmlyc3QgTUNDIGFkYXB0ZXIvdmRldiBjaGFubmVsIG51bWJlciBhbmQgbGF0ZW5jeSAqLworCQl1aW50OF90IG1jY19jaGFubmVsID0gcHJpdmNtZC0+cGFyYW1fdmFsdWUgJiAweDAwMDAwMEZGOworCQl1aW50OF90IG1jY19jaGFubmVsX2xhdGVuY3kgPQorCQkJKHByaXZjbWQtPnBhcmFtX3ZhbHVlICYgMHgwMDAwRkYwMCkgPj4gODsKKwkJaW50IHJldCA9IC0xOworCQlXTUFfTE9HRCgiJXM6IFBhcnNlZCBpbnB1dDogQ2hhbm5lbCAjMTolZCwgbGF0ZW5jeTolZG1zIiwKKwkJCV9fZnVuY19fLCBtY2NfY2hhbm5lbCwgbWNjX2NoYW5uZWxfbGF0ZW5jeSk7CisJCXJldCA9IHdtYV9zZXRfbWNjX2NoYW5uZWxfdGltZV9sYXRlbmN5KHdtYV9oYW5kbGUsCisJCQkJCQkgICAgICAgbWNjX2NoYW5uZWwsCisJCQkJCQkgICAgICAgbWNjX2NoYW5uZWxfbGF0ZW5jeSk7CisJfQorCQlicmVhazsKKwljYXNlIFdNQV9WREVWX01DQ19TRVRfVElNRV9RVU9UQToKKwl7CisJCS8qIEV4dHJhY3QgdGhlIE1DQyAyIGFkYXB0ZXJzL3ZkZXZzIGNoYW5uZWwgbnVtYmVycyBhbmQgdGltZQorCQkgKiBxdW90YSB2YWx1ZSBmb3IgdGhlIGZpcnN0IGFkYXB0ZXIgb25seSAod2hpY2ggaXMgc3BlY2lmaWVkCisJCSAqIGluIGl3cHJpdiBjb21tYW5kLgorCQkgKi8KKwkJdWludDhfdCBhZGFwdGVyXzJfY2hhbl9udW1iZXIgPQorCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWUgJiAweDAwMDAwMEZGOworCQl1aW50OF90IGFkYXB0ZXJfMV9jaGFuX251bWJlciA9CisJCQkocHJpdmNtZC0+cGFyYW1fdmFsdWUgJiAweDAwMDBGRjAwKSA+PiA4OworCQl1aW50OF90IGFkYXB0ZXJfMV9xdW90YSA9CisJCQkocHJpdmNtZC0+cGFyYW1fdmFsdWUgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJaW50IHJldCA9IC0xOworCisJCVdNQV9MT0dEKCIlczogUGFyc2VkIGlucHV0OiBDaGFubmVsICMxOiVkLCBDaGFubmVsICMyOiVkLCBxdW90YSAxOiVkbXMiLAorCQkJICBfX2Z1bmNfXywgYWRhcHRlcl8xX2NoYW5fbnVtYmVyLAorCQkJIGFkYXB0ZXJfMl9jaGFuX251bWJlciwgYWRhcHRlcl8xX3F1b3RhKTsKKworCQlyZXQgPSB3bWFfc2V0X21jY19jaGFubmVsX3RpbWVfcXVvdGEod21hX2hhbmRsZSwKKwkJCQkJCSAgICAgYWRhcHRlcl8xX2NoYW5fbnVtYmVyLAorCQkJCQkJICAgICBhZGFwdGVyXzFfcXVvdGEsCisJCQkJCQkgICAgIGFkYXB0ZXJfMl9jaGFuX251bWJlcik7CisJfQorCQlicmVhazsKKwljYXNlIFdNQV9WREVWX0lCU1NfU0VUX0FUSU1fV0lORE9XX1NJWkU6CisJeworCQl3bWFfaGFuZGxlLT53bWFfaWJzc19wb3dlcl9zYXZlX3BhcmFtcy5hdGltV2luZG93TGVuZ3RoID0KKwkJCQkJCQlwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJV01BX0xPR0QoIiVzOiBJQlNTIHBvd2VyIHNhdmUgQVRJTSBXaW5kb3cgPSAlZCIsCisJCQkgX19mdW5jX18sIHdtYV9oYW5kbGUtPndtYV9pYnNzX3Bvd2VyX3NhdmVfcGFyYW1zLgorCQkJIGF0aW1XaW5kb3dMZW5ndGgpOworCX0KKwkJYnJlYWs7CisJY2FzZSBXTUFfVkRFVl9JQlNTX1NFVF9QT1dFUl9TQVZFX0FMTE9XRUQ6CisJeworCQl3bWFfaGFuZGxlLT53bWFfaWJzc19wb3dlcl9zYXZlX3BhcmFtcy5pc1Bvd2VyU2F2ZUFsbG93ZWQgPQorCQkJCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQlXTUFfTE9HRCgiJXM6IElCU1MgaXMgUG93ZXIgU2F2ZSBBbGxvd2VkID0gJWQiLAorCQkJIF9fZnVuY19fLCB3bWFfaGFuZGxlLT53bWFfaWJzc19wb3dlcl9zYXZlX3BhcmFtcy4KKwkJCSBpc1Bvd2VyU2F2ZUFsbG93ZWQpOworCX0KKwkJYnJlYWs7CisJY2FzZSBXTUFfVkRFVl9JQlNTX1NFVF9QT1dFUl9DT0xMQVBTRV9BTExPV0VEOgorCXsKKwkJd21hX2hhbmRsZS0+d21hX2lic3NfcG93ZXJfc2F2ZV9wYXJhbXMuCWlzUG93ZXJDb2xsYXBzZUFsbG93ZWQgPQorCQkJCQkJCSBwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJV01BX0xPR0QoIiVzOiBJQlNTIGlzIFBvd2VyIENvbGxhcHNlIEFsbG93ZWQgPSAlZCIsCisJCQkgX19mdW5jX18sIHdtYV9oYW5kbGUtPndtYV9pYnNzX3Bvd2VyX3NhdmVfcGFyYW1zLgorCQkJIGlzUG93ZXJDb2xsYXBzZUFsbG93ZWQpOworCX0KKwkJYnJlYWs7CisJY2FzZSBXTUFfVkRFVl9JQlNTX1NFVF9BV0FLRV9PTl9UWF9SWDoKKwl7CisJCXdtYV9oYW5kbGUtPndtYV9pYnNzX3Bvd2VyX3NhdmVfcGFyYW1zLmlzQXdha2VvblR4UnhFbmFibGVkID0KKwkJCQkJCQkgcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCVdNQV9MT0dEKCIlczogSUJTUyBQb3dlciBTYXZlIEF3YWtlIG9uIFR4L1J4IEVuYWJsZWQgPSAlZCIsCisJCQlfX2Z1bmNfXywgd21hX2hhbmRsZS0+d21hX2lic3NfcG93ZXJfc2F2ZV9wYXJhbXMuCisJCQlpc0F3YWtlb25UeFJ4RW5hYmxlZCk7CisJfQorCQlicmVhazsKKwljYXNlIFdNQV9WREVWX0lCU1NfU0VUX0lOQUNUSVZJVFlfVElNRToKKwl7CisJCXdtYV9oYW5kbGUtPndtYV9pYnNzX3Bvd2VyX3NhdmVfcGFyYW1zLmluYWN0aXZpdHlDb3VudCA9CisJCQkJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCVdNQV9MT0dEKCIlczogSUJTUyBQb3dlciBTYXZlIERhdGEgSW5hY3Rpdml0eSBDb3VudCA9ICVkIiwKKwkJCV9fZnVuY19fLCB3bWFfaGFuZGxlLT53bWFfaWJzc19wb3dlcl9zYXZlX3BhcmFtcy4KKwkJCWluYWN0aXZpdHlDb3VudCk7CisJfQorCQlicmVhazsKKwljYXNlIFdNQV9WREVWX0lCU1NfU0VUX1RYU1BfRU5EX0lOQUNUSVZJVFlfVElNRToKKwl7CisJCXdtYV9oYW5kbGUtPndtYV9pYnNzX3Bvd2VyX3NhdmVfcGFyYW1zLnR4U1BFbmRJbmFjdGl2aXR5VGltZSA9CisJCQkJCQkJIHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQlXTUFfTE9HRCgiJXM6IElCU1MgUG93ZXIgU2F2ZSBUcmFuc21pdCBFT1NQIGluYWN0aXZpdHkgdGltZSBvdXQgPSAlZCIsCisJCQlfX2Z1bmNfXywgd21hX2hhbmRsZS0+d21hX2lic3NfcG93ZXJfc2F2ZV9wYXJhbXMuCisJCQl0eFNQRW5kSW5hY3Rpdml0eVRpbWUpOworCX0KKwkJYnJlYWs7CisJY2FzZSBXTUFfVkRFVl9ERlNfQ09OVFJPTF9DTURJRDoKKwl7CisJCXN0cnVjdCBpZWVlODAyMTFjb20gKmRmc19pYyA9IHdtYV9oYW5kbGUtPmRmc19pYzsKKwkJc3RydWN0IGF0aF9kZnMgKmRmczsKKworCQlpZiAoIWRmc19pYykgeworCQkJcmV0ID0gLUVOT0VOVDsKKwkJfSBlbHNlIHsKKwkJCWlmIChkZnNfaWMtPmljX2N1cmNoYW4pIHsKKwkJCQlXTUFfTE9HRCgiJXM6IERlYnVnIGNtZDogJXMgcmVjZWl2ZWQgb24gY2g6ICVkIiwKKwkJCQkJX19mdW5jX18sICJXTUFfVkRFVl9ERlNfQ09OVFJPTF9DTURJRCIsCisJCQkJCWRmc19pYy0+aWNfY3VyY2hhbi0+aWNfaWVlZSk7CisKKwkJCQlpZiAoZGZzX2ljLT5pY19jdXJjaGFuLT5pY19mbGFnZXh0ICYKKwkJCQkgICAgSUVFRTgwMjExX0NIQU5fREZTKSB7CisJCQkJCWRmcyA9IChzdHJ1Y3QgYXRoX2RmcyAqKWRmc19pYy0+aWNfZGZzOworCQkJCQlkZnMtPmRmc19iYW5ncmFkYXIgPSAxOworCQkJCQlkZnMtPmF0aF9yYWRhcl90YXNrc2NoZWQgPSAxOworCQkJCQlPU19TRVRfVElNRVIoJmRmcy0+YXRoX2Rmc190YXNrX3RpbWVyLAorCQkJCQkJICAgICAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXQgPSAtRU5PRU5UOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gLUVOT0VOVDsKKwkJCX0KKwkJfQorCisJCWlmIChyZXQgPT0gLUVOT0VOVCkgeworCQkJV01BX0xPR0UoIiVzOiBPcGVyYXRpbmcgY2hhbm5lbCBpcyBub3QgREZTIGNhcGFibGUsaWdub3JpbmcgJXMiLAorCQkJCSAgX19mdW5jX18sICJXTUFfVkRFVl9ERlNfQ09OVFJPTF9DTURJRCIpOworCQl9IGVsc2UgaWYgKHJldCkgeworCQkJV01BX0xPR0UoIiVzOiBTZW5kaW5nIGNvbW1hbmQgJXMgZmFpbGVkIHdpdGggJWRcbiIsCisJCQkJX19mdW5jX18sICJXTUFfVkRFVl9ERlNfQ09OVFJPTF9DTURJRCIsCisJCQkJcmV0KTsKKwkJfQorCX0KKwkJYnJlYWs7CisJY2FzZSBXTUFfVkRFVl9JQlNTX1BTX1NFVF9XQVJNVVBfVElNRV9TRUNTOgorCXsKKwkJd21hX2hhbmRsZS0+d21hX2lic3NfcG93ZXJfc2F2ZV9wYXJhbXMuaWJzc1BzV2FybXVwVGltZSA9CisJCQkJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCVdNQV9MT0dEKCIlczogSUJTUyBQb3dlciBTYXZlIFdhcm0gVXAgVGltZSBpbiBTZWNvbmRzID0gJWQiLAorCQkJX19mdW5jX18sIHdtYV9oYW5kbGUtPndtYV9pYnNzX3Bvd2VyX3NhdmVfcGFyYW1zLgorCQkJaWJzc1BzV2FybXVwVGltZSk7CisJfQorCQlicmVhazsKKwljYXNlIFdNQV9WREVWX0lCU1NfUFNfU0VUXzFSWF9DSEFJTl9JTl9BVElNX1dJTkRPVzoKKwl7CisJCXdtYV9oYW5kbGUtPndtYV9pYnNzX3Bvd2VyX3NhdmVfcGFyYW1zLmlic3NQczFSeENoYWluSW5BdGltRW5hYmxlCisJCQkJCQkJID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCVdNQV9MT0dEKCIlczogSUJTUyBQb3dlciBTYXZlIHNpbmdsZSBSWCBDaGFpbiBFbmFibGUgSW4gQVRJTSAgPSAlZCIsCisJCQlfX2Z1bmNfXywgd21hX2hhbmRsZS0+d21hX2lic3NfcG93ZXJfc2F2ZV9wYXJhbXMuCisJCQlpYnNzUHMxUnhDaGFpbkluQXRpbUVuYWJsZSk7CisJfQorCQlicmVhazsKKworCWNhc2UgV01BX1ZERVZfVFhSWF9HRVRfSVBBX1VDX0ZXX1NUQVRTX0NNRElEOgorCXsKKwkJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2OworCisJCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwkJaWYgKCFwZGV2KSB7CisJCQlXTUFfTE9HRSgicGRldiBOVUxMIGZvciB1YyBzdGF0Iik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlvbF90eHJ4X2lwYV91Y19nZXRfc3RhdChwZGV2KTsKKwl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJV01BX0xPR0UoIkludmFsaWQgd21hIGNvbmZpZyBjb21tYW5kIGlkOiVkIiwgcHJpdmNtZC0+cGFyYW1faWQpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtaV91bmlmaWVkX3BkZXZfc2V0X3BhcmFtKCkgLSBzZXQgcGRldiBwYXJhbWV0ZXJzCisgKiBAd21pX2hhbmRsZTogd21pIGhhbmRsZQorICogQHBhcmFtX2lkOiBwYXJhbWV0ZXIgaWQKKyAqIEBwYXJhbV92YWx1ZTogcGFyYW1ldGVyIHZhbHVlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUKKyAqLworaW50Cit3bWlfdW5pZmllZF9wZGV2X3NldF9wYXJhbSh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIFdNSV9QREVWX1BBUkFNIHBhcmFtX2lkLAorCQkJICAgdWludDMyX3QgcGFyYW1fdmFsdWUpCit7CisJaW50IHJldDsKKwl3bWlfcGRldl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50MTZfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOndtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY21kID0gKHdtaV9wZGV2X3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc2V0X3BhcmFtX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcGRldl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT5yZXNlcnZlZDAgPSAwOworCWNtZC0+cGFyYW1faWQgPSBwYXJhbV9pZDsKKwljbWQtPnBhcmFtX3ZhbHVlID0gcGFyYW1fdmFsdWU7CisJV01BX0xPR0QoIlNldHRpbmcgcGRldiBwYXJhbSA9ICV4LCB2YWx1ZSA9ICV1IiwgcGFyYW1faWQsIHBhcmFtX3ZhbHVlKTsKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfUERFVl9TRVRfUEFSQU1fQ01ESUQpOworCWlmIChyZXQgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCBzZXQgcGFyYW0gY29tbWFuZCByZXQgPSAlZCIsIHJldCk7CisJCXdtaV9idWZfZnJlZShidWYpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtYV9zZXRfbW9kdWxhdGVkX2R0aW0oKSAtIGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSBtb2R1bGF0ZWQgZHRpbQorICogQHdtYTogd21hIGhhbmRsZQorICogQHByaXZjbWQ6IHN0cnVjdHVyZSBjb250YWluaW5nIHBhcmFtZXRlcnMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIG1vZHVsYXRlZCBkdGltIGluIGZpcm13YXJlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9zZXRfbW9kdWxhdGVkX2R0aW0odHBfd21hX2hhbmRsZSB3bWEsCisJCQkJICAgd21hX2NsaV9zZXRfY21kX3QgKnByaXZjbWQpCit7CisJdWludDhfdCB2ZGV2X2lkID0gcHJpdmNtZC0+cGFyYW1fdmRldl9pZDsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaWZhY2UgPQorCQkmd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdOworCWJvb2wgcHJldl9kdGltX2VuYWJsZWQ7CisJdWludDMyX3QgbGlzdGVuX2ludGVydmFsOworCWludCByZXQ7CisKKwlpZmFjZS0+YWx0X21vZHVsYXRlZF9kdGltID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisKKwlwcmV2X2R0aW1fZW5hYmxlZCA9IGlmYWNlLT5hbHRfbW9kdWxhdGVkX2R0aW1fZW5hYmxlZDsKKworCWlmICgxICE9IHByaXZjbWQtPnBhcmFtX3ZhbHVlKQorCQlpZmFjZS0+YWx0X21vZHVsYXRlZF9kdGltX2VuYWJsZWQgPSB0cnVlOworCWVsc2UKKwkJaWZhY2UtPmFsdF9tb2R1bGF0ZWRfZHRpbV9lbmFibGVkID0gZmFsc2U7CisKKwlpZiAoKHRydWUgPT0gaWZhY2UtPmFsdF9tb2R1bGF0ZWRfZHRpbV9lbmFibGVkKSB8fAorCSAgICAodHJ1ZSA9PSBwcmV2X2R0aW1fZW5hYmxlZCkpIHsKKworCQlsaXN0ZW5faW50ZXJ2YWwgPSBpZmFjZS0+YWx0X21vZHVsYXRlZF9kdGltCisJCQkqIGlmYWNlLT5kdGltUGVyaW9kOworCisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLAorCQkJCQkJcHJpdmNtZC0+cGFyYW1fdmRldl9pZCwKKwkJCQkJCVdNSV9WREVWX1BBUkFNX0xJU1RFTl9JTlRFUlZBTCwKKwkJCQkJCWxpc3Rlbl9pbnRlcnZhbCk7CisJCWlmIChyZXQpCisJCQkvKiBFdmVuIGlmIGl0IGZhaWxzLCBjb250aW51ZSAqLworCQkJV01BX0xPR1coIkZhaWxlZCB0byBzZXQgbGlzdGVuIGludGVydmFsICVkIiwKKwkJCQkgbGlzdGVuX2ludGVydmFsKTsKKworCQlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJCXByaXZjbWQtPnBhcmFtX3ZkZXZfaWQsCisJCQkJCQlXTUlfVkRFVl9QQVJBTV9EVElNX1BPTElDWSAsCisJCQkJCQlOT1JNQUxfRFRJTSk7CisJCWlmIChyZXQpCisJCQlXTUFfTE9HRSgiRmFpbGVkIHRvIFNldCB0byBOb3JtYWwgRFRJTSBwb2xpY3kiKTsKKwl9Cit9CisKKworLyoqCisgKiB3bWFfcHJvY2Vzc19jbGlfc2V0X2NtZCgpIC0gc2V0IHBhcmFtZXRlcnMgdG8gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwcml2Y21kOiBjb21tYW5kCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9wcm9jZXNzX2NsaV9zZXRfY21kKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCSAgICB3bWFfY2xpX3NldF9jbWRfdCAqcHJpdmNtZCkKK3sKKwlpbnQgcmV0ID0gMCwgdmlkID0gcHJpdmNtZC0+cGFyYW1fdmRldl9pZCwgcHBzX3ZhbCA9IDA7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmludHIgPSB3bWEtPmludGVyZmFjZXM7CisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKwlzdHJ1Y3QgcXBvd2VyX3BhcmFtcyAqcXBhcmFtcyA9ICZpbnRyW3ZpZF0uY29uZmlnLnFwb3dlcl9wYXJhbXM7CisKKwlXTUFfTE9HRCgid21paGFuZGxlICVwIiwgd21hLT53bWlfaGFuZGxlKTsKKworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHBNYWMiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocHJpdmNtZC0+cGFyYW1faWQgPj0gV01JX0NNRElEX01BWCkgeworCQkvKgorCQkgKiBUaGlzIGNvbmZpZ3VyYXRpb24gc2V0dGluZyBpcyBub3QgZG9uZSB1c2luZyBhbnkgd21pCisJCSAqIGNvbW1hbmQsIGNhbGwgYXBwcm9wcmlhdGUgaGFuZGxlci4KKwkJICovCisJCWlmICh3bWFfc2V0X3ByaXZfY2ZnKHdtYSwgcHJpdmNtZCkpCisJCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNldCB3bWEgcHJpdiBjb25naXVyYXRpb24iKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAocHJpdmNtZC0+cGFyYW1fdnBfZGV2KSB7CisJY2FzZSBWREVWX0NNRDoKKwkJV01BX0xPR0QoInZkZXYgaWQgJWQgcGlkICVkIHB2YWwgJWQiLCBwcml2Y21kLT5wYXJhbV92ZGV2X2lkLAorCQkJIHByaXZjbWQtPnBhcmFtX2lkLCBwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLAorCQkJCQkJICAgICAgcHJpdmNtZC0+cGFyYW1fdmRldl9pZCwKKwkJCQkJCSAgICAgIHByaXZjbWQtPnBhcmFtX2lkLAorCQkJCQkJICAgICAgcHJpdmNtZC0+cGFyYW1fdmFsdWUpOworCQlpZiAocmV0KSB7CisJCQlXTUFfTE9HRSgid21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCBmYWlsZWQgcmV0ICVkIiwKKwkJCQkgIHJldCk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQREVWX0NNRDoKKwkJV01BX0xPR0QoInBkZXYgcGlkICVkIHB2YWwgJWQiLCBwcml2Y21kLT5wYXJhbV9pZCwKKwkJCSBwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCWlmICgocHJpdmNtZC0+cGFyYW1faWQgPT0gV01JX1BERVZfUEFSQU1fUlhfQ0hBSU5fTUFTSykgfHwKKwkJICAgIChwcml2Y21kLT5wYXJhbV9pZCA9PSBXTUlfUERFVl9QQVJBTV9UWF9DSEFJTl9NQVNLKSkgeworCQkJd21hX3VwZGF0ZV90eHJ4X2NoYWlubWFzayh3bWEtPm51bV9yZl9jaGFpbnMsCisJCQkJCQkgICZwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCX0KKwkJcmV0ID0gd21pX3VuaWZpZWRfcGRldl9zZXRfcGFyYW0od21hLT53bWlfaGFuZGxlLAorCQkJCQkJIHByaXZjbWQtPnBhcmFtX2lkLAorCQkJCQkJIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJaWYgKHJldCkgeworCQkJV01BX0xPR0UoIndtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQgZmFpbGVkIHJldCAlZCIsCisJCQkJIHJldCk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHRU5fQ01EOgorCXsKKwkJb2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2ID0gTlVMTDsKKwkJc3RydWN0IHdtYV90eHJ4X25vZGUgKmludHIgPSB3bWEtPmludGVyZmFjZXM7CisKKwkJdmRldiA9IHdtYV9maW5kX3ZkZXZfYnlfaWQod21hLCBwcml2Y21kLT5wYXJhbV92ZGV2X2lkKTsKKwkJaWYgKCF2ZGV2KSB7CisJCQlXTUFfTE9HRSgiJXM6SW52YWxpZCB2ZGV2IGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCisJCVdNQV9MT0dEKCJnZW4gcGlkICVkIHB2YWwgJWQiLCBwcml2Y21kLT5wYXJhbV9pZCwKKwkJCSBwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisKKwkJc3dpdGNoIChwcml2Y21kLT5wYXJhbV9pZCkgeworCQljYXNlIEdFTl9WREVWX1BBUkFNX0FNUERVOgorCQkJcmV0ID0gb2xfdHhyeF9hZ2dyX2NmZyh2ZGV2LCBwcml2Y21kLT5wYXJhbV92YWx1ZSwgMCk7CisJCQlpZiAocmV0KQorCQkJCVdNQV9MT0dFKCJvbF90eHJ4X2FnZ3JfY2ZnIHNldCBhbXBkdSBmYWlsZWQgcmV0ICVkIiwKKwkJCQkJIHJldCk7CisJCQllbHNlCisJCQkJaW50cltwcml2Y21kLT5wYXJhbV92ZGV2X2lkXS5jb25maWcuYW1wZHUgPQorCQkJCQkJCSBwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIEdFTl9WREVWX1BBUkFNX0FNU0RVOgorCQkJcmV0ID0gb2xfdHhyeF9hZ2dyX2NmZyh2ZGV2LCAwLCBwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCQlpZiAocmV0KQorCQkJCVdNQV9MT0dFKCJvbF90eHJ4X2FnZ3JfY2ZnIHNldCBhbXNkdSBmYWlsZWQgcmV0ICVkIiwKKwkJCQkJIHJldCk7CisJCQllbHNlCisJCQkJaW50cltwcml2Y21kLT5wYXJhbV92ZGV2X2lkXS5jb25maWcuCisJCQkJYW1zZHUgPSBwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIEdFTl9QQVJBTV9EVU1QX0FHQ19TVEFSVDoKKwkJCWh0Y19kdW1wKHdtYS0+aHRjX2hhbmRsZSwgQUdDX0RVTVAsIHRydWUpOworCQkJYnJlYWs7CisJCWNhc2UgR0VOX1BBUkFNX0RVTVBfQUdDOgorCQkJaHRjX2R1bXAod21hLT5odGNfaGFuZGxlLCBBR0NfRFVNUCwgZmFsc2UpOworCQkJYnJlYWs7CisJCWNhc2UgR0VOX1BBUkFNX0RVTVBfQ0hBTklORk9fU1RBUlQ6CisJCQlodGNfZHVtcCh3bWEtPmh0Y19oYW5kbGUsIENIQU5fRFVNUCwgdHJ1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBHRU5fUEFSQU1fRFVNUF9DSEFOSU5GTzoKKwkJCWh0Y19kdW1wKHdtYS0+aHRjX2hhbmRsZSwgQ0hBTl9EVU1QLCBmYWxzZSk7CisJCQlicmVhazsKKwkJY2FzZSBHRU5fUEFSQU1fRFVNUF9XQVRDSERPRzoKKwkJCWh0Y19kdW1wKHdtYS0+aHRjX2hhbmRsZSwgV0RfRFVNUCwgZmFsc2UpOworCQkJYnJlYWs7CisJCWNhc2UgR0VOX1BBUkFNX0NSQVNIX0lOSkVDVDoKKwkJCXJldCA9IHdtaV9jcmFzaF9pbmplY3Qod21hLT53bWlfaGFuZGxlLAorCQkJCQkgICAgICAgcHJpdmNtZC0+cGFyYW1fdmFsdWUsCisJCQkJCSAgICAgICBwcml2Y21kLT5wYXJhbV9zZWNfdmFsdWUpOworCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0FUSF9QQ0lFX0FDQ0VTU19ERUJVRworCQljYXNlIEdFTl9QQVJBTV9EVU1QX1BDSUVfQUNDRVNTX0xPRzoKKwkJCWh0Y19kdW1wKHdtYS0+aHRjX2hhbmRsZSwgUENJRV9EVU1QLCBmYWxzZSk7CisJCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfQVRIX1BDSUVfQUNDRVNTX0RFQlVHICovCisJCWNhc2UgR0VOX1BBUkFNX01PRFVMQVRFRF9EVElNOgorCQkJd21hX3NldF9tb2R1bGF0ZWRfZHRpbSh3bWEsIHByaXZjbWQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlXTUFfTE9HRSgiSW52YWxpZCBwYXJhbSBpZCAweCV4IiwKKwkJCQkgcHJpdmNtZC0+cGFyYW1faWQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgREJHX0NNRDoKKwkJV01BX0xPR0QoImRiZyBwaWQgJWQgcHZhbCAlZCIsIHByaXZjbWQtPnBhcmFtX2lkLAorCQkJIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJc3dpdGNoIChwcml2Y21kLT5wYXJhbV9pZCkgeworCQljYXNlIFdNSV9EQkdMT0dfTE9HX0xFVkVMOgorCQkJcmV0ID0gZGJnbG9nX3NldF9sb2dfbHZsKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJCWlmIChyZXQpCisJCQkJV01BX0xPR0UoImRiZ2xvZ19zZXRfbG9nX2x2bCBmYWlsZWQgcmV0ICVkIiwKKwkJCQkJIHJldCk7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfREJHTE9HX1ZBUF9FTkFCTEU6CisJCQlyZXQgPSBkYmdsb2dfdmFwX2xvZ19lbmFibGUod21hLT53bWlfaGFuZGxlLAorCQkJCQkJICAgIHByaXZjbWQtPnBhcmFtX3ZhbHVlLCB0cnVlKTsKKwkJCWlmIChyZXQpCisJCQkJV01BX0xPR0UoImRiZ2xvZ192YXBfbG9nX2VuYWJsZSBmYWlsZWQgcmV0ICVkIiwKKwkJCQkJIHJldCk7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfREJHTE9HX1ZBUF9ESVNBQkxFOgorCQkJcmV0ID0gZGJnbG9nX3ZhcF9sb2dfZW5hYmxlKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlLCBmYWxzZSk7CisJCQlpZiAocmV0KQorCQkJCVdNQV9MT0dFKCJkYmdsb2dfdmFwX2xvZ19lbmFibGUgZmFpbGVkIHJldCAlZCIsCisJCQkJCSByZXQpOworCQkJYnJlYWs7CisJCWNhc2UgV01JX0RCR0xPR19NT0RVTEVfRU5BQkxFOgorCQkJcmV0ID0gZGJnbG9nX21vZHVsZV9sb2dfZW5hYmxlKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlLCB0cnVlKTsKKwkJCWlmIChyZXQpCisJCQkJV01BX0xPR0UoImRiZ2xvZ19tb2R1bGVfbG9nX2VuYWJsZSBmYWlsZWQgcmV0ICVkIiwKKwkJCQkJIHJldCk7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfREJHTE9HX01PRFVMRV9ESVNBQkxFOgorCQkJcmV0ID0gZGJnbG9nX21vZHVsZV9sb2dfZW5hYmxlKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlLCBmYWxzZSk7CisJCQlpZiAocmV0KQorCQkJCVdNQV9MT0dFKCJkYmdsb2dfbW9kdWxlX2xvZ19lbmFibGUgZmFpbGVkIHJldCAlZCIsCisJCQkJCSByZXQpOworCQkJYnJlYWs7CisJCWNhc2UgV01JX0RCR0xPR19NT0RfTE9HX0xFVkVMOgorCQkJcmV0ID0gZGJnbG9nX3NldF9tb2RfbG9nX2x2bCh3bWEtPndtaV9oYW5kbGUsCisJCQkJCQkgICAgICAgcHJpdmNtZC0+cGFyYW1fdmFsdWUpOworCQkJaWYgKHJldCkKKwkJCQlXTUFfTE9HRSgiZGJnbG9nX21vZHVsZV9sb2dfZW5hYmxlIGZhaWxlZCByZXQgJWQiLAorCQkJCQkgcmV0KTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9EQkdMT0dfVFlQRToKKwkJCXJldCA9IGRiZ2xvZ19wYXJzZXJfdHlwZV9pbml0KHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJCQlwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCQlpZiAocmV0KQorCQkJCVdNQV9MT0dFKCJkYmdsb2dfcGFyc2VyX3R5cGVfaW5pdCBmYWlsZWQgcmV0ICVkIiwKKwkJCQkJIHJldCk7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfREJHTE9HX1JFUE9SVF9FTkFCTEU6CisJCQlyZXQgPSBkYmdsb2dfcmVwb3J0X2VuYWJsZSh3bWEtPndtaV9oYW5kbGUsCisJCQkJCQkgICAgIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJCWlmIChyZXQpCisJCQkJV01BX0xPR0UoImRiZ2xvZ19yZXBvcnRfZW5hYmxlIGZhaWxlZCByZXQgJWQiLAorCQkJCQkgcmV0KTsKKwkJCWJyZWFrOworI2lmZGVmIEZFQVRVUkVfR1JFRU5fQVAKKwkJY2FzZSBXTUlfUERFVl9HUkVFTl9BUF9QU19FTkFCTEVfQ01ESUQ6CisJCQkvKiBTZXQgdGhlIEdyZWVuIEFQICovCisJCQlyZXQgPSB3bWlfdW5pZmllZF9wZGV2X2dyZWVuX2FwX3BzX2VuYWJsZV9jbWQKKwkJCQkJKHdtYS0+d21pX2hhbmRsZSwgcHJpdmNtZC0+cGFyYW1fdmFsdWUpOworCQkJaWYgKHJldCkgeworCQkJCVdNQV9MT0dFKCJTZXQgR3JlZW5BUCBGYWlsZWQgdmFsICVkIiwKKwkJCQkJIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfR1JFRU5fQVAgKi8KKworCQlkZWZhdWx0OgorCQkJV01BX0xPR0UoIkludmFsaWQgcGFyYW0gaWQgMHgleCIsIHByaXZjbWQtPnBhcmFtX2lkKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgUFBTX0NNRDoKKwkJV01BX0xPR0QoImRiZyBwaWQgJWQgcHZhbCAlZCIsIHByaXZjbWQtPnBhcmFtX2lkLAorCQkJIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJc3dpdGNoIChwcml2Y21kLT5wYXJhbV9pZCkgeworCisJCWNhc2UgV01JX1ZERVZfUFBTX1BBSURfTUFUQ0g6CisJCQlwcHNfdmFsID0gKChwcml2Y21kLT5wYXJhbV92YWx1ZSA8PCAzMSkgJiAweGZmZmYwMDAwKSB8CisJCQkJICAoUEtUX1BXUl9TQVZFX1BBSURfTUFUQ0ggJiAweGZmZmYpOworCQkJaW50clt2aWRdLmNvbmZpZy5wcHNfcGFyYW1zLnBhaWRfbWF0Y2hfZW5hYmxlID0KKwkJCQlwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BQU19HSURfTUFUQ0g6CisJCQlwcHNfdmFsID0gKChwcml2Y21kLT5wYXJhbV92YWx1ZSA8PCAzMSkgJiAweGZmZmYwMDAwKSB8CisJCQkJICAoUEtUX1BXUl9TQVZFX0dJRF9NQVRDSCAmIDB4ZmZmZik7CisJCQlpbnRyW3ZpZF0uY29uZmlnLnBwc19wYXJhbXMuZ2lkX21hdGNoX2VuYWJsZSA9CisJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QUFNfRUFSTFlfVElNX0NMRUFSOgorCQkJcHBzX3ZhbCA9ICgocHJpdmNtZC0+cGFyYW1fdmFsdWUgPDwgMzEpICYgMHhmZmZmMDAwMCkgfAorCQkJCSAgKFBLVF9QV1JfU0FWRV9FQVJMWV9USU1fQ0xFQVIgJiAweGZmZmYpOworCQkJaW50clt2aWRdLmNvbmZpZy5wcHNfcGFyYW1zLnRpbV9jbGVhciA9CisJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QUFNfRUFSTFlfRFRJTV9DTEVBUjoKKwkJCXBwc192YWwgPSAoKHByaXZjbWQtPnBhcmFtX3ZhbHVlIDw8IDMxKSAmIDB4ZmZmZjAwMDApIHwKKwkJCQkgIChQS1RfUFdSX1NBVkVfRUFSTFlfRFRJTV9DTEVBUiAmIDB4ZmZmZik7CisJCQlpbnRyW3ZpZF0uY29uZmlnLnBwc19wYXJhbXMuZHRpbV9jbGVhciA9CisJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QUFNfRU9GX1BBRF9ERUxJTToKKwkJCXBwc192YWwgPSAoKHByaXZjbWQtPnBhcmFtX3ZhbHVlIDw8IDMxKSAmIDB4ZmZmZjAwMDApIHwKKwkJCQkgIChQS1RfUFdSX1NBVkVfRU9GX1BBRF9ERUxJTSAmIDB4ZmZmZik7CisJCQlpbnRyW3ZpZF0uY29uZmlnLnBwc19wYXJhbXMuZW9mX2RlbGltID0KKwkJCQlwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BQU19NQUNBRERSX01JU01BVENIOgorCQkJcHBzX3ZhbCA9ICgocHJpdmNtZC0+cGFyYW1fdmFsdWUgPDwgMzEpICYgMHhmZmZmMDAwMCkgfAorCQkJCSAgKFBLVF9QV1JfU0FWRV9NQUNBRERSX01JU01BVENIICYgMHhmZmZmKTsKKwkJCWludHJbdmlkXS5jb25maWcucHBzX3BhcmFtcy5tYWNfbWF0Y2ggPQorCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUFBTX0RFTElNX0NSQ19GQUlMOgorCQkJcHBzX3ZhbCA9ICgocHJpdmNtZC0+cGFyYW1fdmFsdWUgPDwgMzEpICYgMHhmZmZmMDAwMCkgfAorCQkJCSAgKFBLVF9QV1JfU0FWRV9ERUxJTV9DUkNfRkFJTCAmIDB4ZmZmZik7CisJCQlpbnRyW3ZpZF0uY29uZmlnLnBwc19wYXJhbXMuZGVsaW1fZmFpbCA9CisJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QUFNfR0lEX05TVFNfWkVSTzoKKwkJCXBwc192YWwgPSAoKHByaXZjbWQtPnBhcmFtX3ZhbHVlIDw8IDMxKSAmIDB4ZmZmZjAwMDApIHwKKwkJCQkgIChQS1RfUFdSX1NBVkVfR0lEX05TVFNfWkVSTyAmIDB4ZmZmZik7CisJCQlpbnRyW3ZpZF0uY29uZmlnLnBwc19wYXJhbXMubnN0c196ZXJvID0KKwkJCQlwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BQU19SU1NJX0NIRUNLOgorCQkJcHBzX3ZhbCA9ICgocHJpdmNtZC0+cGFyYW1fdmFsdWUgPDwgMzEpICYgMHhmZmZmMDAwMCkgfAorCQkJCSAgKFBLVF9QV1JfU0FWRV9SU1NJX0NIRUNLICYgMHhmZmZmKTsKKwkJCWludHJbdmlkXS5jb25maWcucHBzX3BhcmFtcy5yc3NpX2NoayA9CisJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QUFNfNUdfRUJUOgorCQkJcHBzX3ZhbCA9ICgocHJpdmNtZC0+cGFyYW1fdmFsdWUgPDwgMzEpICYgMHhmZmZmMDAwMCkgfAorCQkJCSAgKFBLVF9QV1JfU0FWRV81R19FQlQgJiAweGZmZmYpOworCQkJaW50clt2aWRdLmNvbmZpZy5wcHNfcGFyYW1zLmVidF81ZyA9CisJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdNQV9MT0dFKCJJbnZhbGlkIHBhcmFtIGlkIDB4JXgiLCBwcml2Y21kLT5wYXJhbV9pZCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUVBPV0VSX0NNRDoKKwkJV01BX0xPR0QoIlFQT1dFUiBDTEkgQ01EIHBpZCAlZCBwdmFsICVkIiwgcHJpdmNtZC0+cGFyYW1faWQsCisJCQkgcHJpdmNtZC0+cGFyYW1fdmFsdWUpOworCQlzd2l0Y2ggKHByaXZjbWQtPnBhcmFtX2lkKSB7CisJCWNhc2UgV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfUFNQT0xMX0NPVU5UOgorCQkJV01BX0xPR0QoIlFQT1dFUiBDTEkgQ01EOlBzIFBvbGwgQ250IHZhbCAlZCIsCisJCQkJIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJCS8qIFNldCB0aGUgUVBvd2VyIFBzIFBvbGwgQ291bnQgKi8KKwkJCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLAorCQkJCXZpZCwgV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfUFNQT0xMX0NPVU5ULAorCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlXTUFfTE9HRSgiU2V0IFEtUHNQb2xsQ250IEZhaWxlZCB2ZGV2SWQgJWQgdmFsICVkIiwKKwkJCQkJdmlkLCBwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCXFwYXJhbXMtPm1heF9wc19wb2xsX2NudCA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfTUFYX1RYX0JFRk9SRV9XQUtFOgorCQkJV01BX0xPR0QoIlFQT1dFUiBDTEkgQ01EOk1heCBUeCBCZWZvcmUgd2FrZSB2YWwgJWQiLAorCQkJCSBwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCQkvKiBTZXQgdGhlIFFQb3dlciBNYXggVHggQmVmb3JlIFdha2UgKi8KKwkJCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLAorCQkJCXZpZCwgV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfTUFYX1RYX0JFRk9SRV9XQUtFLAorCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlXTUFfTE9HRSgiU2V0IFEtTWF4VHhCZWZXYWtlIEZhaWxlZCB2SWQgJWQgdmFsICVkIiwKKwkJCQkJdmlkLCBwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCXFwYXJhbXMtPm1heF90eF9iZWZvcmVfd2FrZSA9CisJCQkJCQlwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdNSV9TVEFfUFNfUEFSQU1fUVBPV0VSX1NQRUNfUFNQT0xMX1dBS0VfSU5URVJWQUw6CisJCQlXTUFfTE9HRCgiUVBPV0VSIENMSSBDTUQ6UHMgUG9sbCBXYWtlIEludiB2YWwgJWQiLAorCQkJCSBwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCQkvKiBTZXQgdGhlIFFQb3dlciBTcGVjIFBzIFBvbGwgV2FrZSBJbnYgKi8KKwkJCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLAorCQkJCXZpZCwgV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfU1BFQ19QU1BPTExfV0FLRV9JTlRFUlZBTCwKKwkJCQlwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCQlpZiAocmV0KSB7CisJCQkJV01BX0xPR0UoIlNldCBRLVBzUG9sbCBXYWtlSW50diBGYWlsZWQgdklkICVkIHZhbCAlZCIsCisJCQkJCXZpZCwgcHJpdmNtZC0+cGFyYW1fdmFsdWUpOworCQkJfSBlbHNlIHsKKwkJCQlxcGFyYW1zLT5zcGVjX3BzX3BvbGxfd2FrZV9pbnRlcnZhbCA9CisJCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfU1BFQ19NQVhfU1BFQ19OT0RBVEFfUFNQT0xMOgorCQkJV01BX0xPR0QoIlFQT1dFUiBDTEkgQ01EOlNwZWMgTm9EYXRhIFBzIFBvbGwgdmFsICVkIiwKKwkJCQkgcHJpdmNtZC0+cGFyYW1fdmFsdWUpOworCQkJLyogU2V0IHRoZSBRUG93ZXIgU3BlYyBOb0RhdGEgUHNQb2xsICovCisJCQlyZXQgPSB3bWlfdW5pZmllZF9zZXRfc3RhX3BzX3BhcmFtKHdtYS0+d21pX2hhbmRsZSwKKwkJCQl2aWQsIFdNSV9TVEFfUFNfUEFSQU1fUVBPV0VSX1NQRUNfTUFYX1NQRUNfTk9EQVRBX1BTUE9MTCwKKwkJCQlwcml2Y21kLT5wYXJhbV92YWx1ZSk7CisJCQlpZiAocmV0KSB7CisJCQkJV01BX0xPR0UoIlNldCBRLVNwZWNOb0RhdGFQc1BvbGwgRmFpbGVkIHZJZCAlZCB2YWwgJWQiLAorCQkJCQl2aWQsIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJCX0gZWxzZSB7CisJCQkJcXBhcmFtcy0+bWF4X3NwZWNfbm9kYXRhX3BzX3BvbGwgPQorCQkJCQlwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlXTUFfTE9HRSgiSW52YWxpZCBwYXJhbSBpZCAweCV4IiwgcHJpdmNtZC0+cGFyYW1faWQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHVFhfQ01EOgorCQlXTUFfTE9HRCgidmRldiBpZCAlZCBwaWQgJWQgcHZhbCAlZCIsIHByaXZjbWQtPnBhcmFtX3ZkZXZfaWQsCisJCQkgcHJpdmNtZC0+cGFyYW1faWQsIHByaXZjbWQtPnBhcmFtX3ZhbHVlKTsKKwkJc3dpdGNoIChwcml2Y21kLT5wYXJhbV9pZCkgeworCQljYXNlIFdNSV9WREVWX1BBUkFNX0dUWF9IVF9NQ1M6CisJCQlpbnRyW3ZpZF0uY29uZmlnLmd0eF9pbmZvLmd0eFJUTWFza1swXSA9CisJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9ndHhfY2ZnX3NlbmQod21hLT53bWlfaGFuZGxlLAorCQkJCQlwcml2Y21kLT5wYXJhbV92ZGV2X2lkLAorCQkJCQkmaW50clt2aWRdLmNvbmZpZy5ndHhfaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9HVFhfVkhUX01DUzoKKwkJCWludHJbdmlkXS5jb25maWcuZ3R4X2luZm8uZ3R4UlRNYXNrWzFdID0KKwkJCQlwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X2d0eF9jZmdfc2VuZCh3bWEtPndtaV9oYW5kbGUsCisJCQkJCXByaXZjbWQtPnBhcmFtX3ZkZXZfaWQsCisJCQkJCSZpbnRyW3ZpZF0uY29uZmlnLmd0eF9pbmZvKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV01JX1ZERVZfUEFSQU1fR1RYX1VTUl9DRkc6CisJCQlpbnRyW3ZpZF0uY29uZmlnLmd0eF9pbmZvLmd0eFVzcmNmZyA9CisJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9ndHhfY2ZnX3NlbmQod21hLT53bWlfaGFuZGxlLAorCQkJCQlwcml2Y21kLT5wYXJhbV92ZGV2X2lkLAorCQkJCQkmaW50clt2aWRdLmNvbmZpZy5ndHhfaW5mbyk7CisJCQlicmVhazsKKworCQljYXNlIFdNSV9WREVWX1BBUkFNX0dUWF9USFJFOgorCQkJaW50clt2aWRdLmNvbmZpZy5ndHhfaW5mby5ndHhQRVJUaHJlc2hvbGQgPQorCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfZ3R4X2NmZ19zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJcHJpdmNtZC0+cGFyYW1fdmRldl9pZCwKKwkJCQkJJmludHJbdmlkXS5jb25maWcuZ3R4X2luZm8pOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9HVFhfTUFSR0lOOgorCQkJaW50clt2aWRdLmNvbmZpZy5ndHhfaW5mby5ndHhQRVJNYXJnaW4gPQorCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfZ3R4X2NmZ19zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJcHJpdmNtZC0+cGFyYW1fdmRldl9pZCwKKwkJCQkJJmludHJbdmlkXS5jb25maWcuZ3R4X2luZm8pOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9HVFhfU1RFUDoKKwkJCWludHJbdmlkXS5jb25maWcuZ3R4X2luZm8uZ3R4VFBDc3RlcCA9CisJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9ndHhfY2ZnX3NlbmQod21hLT53bWlfaGFuZGxlLAorCQkJCQlwcml2Y21kLT5wYXJhbV92ZGV2X2lkLAorCQkJCQkmaW50clt2aWRdLmNvbmZpZy5ndHhfaW5mbyk7CisJCQlicmVhazsKKworCQljYXNlIFdNSV9WREVWX1BBUkFNX0dUWF9NSU5UUEM6CisJCQlpbnRyW3ZpZF0uY29uZmlnLmd0eF9pbmZvLmd0eFRQQ01pbiA9CisJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9ndHhfY2ZnX3NlbmQod21hLT53bWlfaGFuZGxlLAorCQkJCQlwcml2Y21kLT5wYXJhbV92ZGV2X2lkLAorCQkJCQkmaW50clt2aWRdLmNvbmZpZy5ndHhfaW5mbyk7CisJCQlicmVhazsKKworCQljYXNlIFdNSV9WREVWX1BBUkFNX0dUWF9CV19NQVNLOgorCQkJaW50clt2aWRdLmNvbmZpZy5ndHhfaW5mby5ndHhCV01hc2sgPQorCQkJCXByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfZ3R4X2NmZ19zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJcHJpdmNtZC0+cGFyYW1fdmRldl9pZCwKKwkJCQkJJmludHJbdmlkXS5jb25maWcuZ3R4X2luZm8pOworCQkJaWYgKHJldCkgeworCQkJCVdNQV9MT0dFKCJ3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kIgorCQkJCQkgIiBmYWlsZWQgcmV0ICVkIiwgcmV0KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJV01BX0xPR0UoIkludmFsaWQgdnBkZXYgY29tbWFuZCBpZCIpOworCX0KKwlpZiAoMSA9PSBwcml2Y21kLT5wYXJhbV92cF9kZXYpIHsKKwkJc3dpdGNoIChwcml2Y21kLT5wYXJhbV9pZCkgeworCQljYXNlIFdNSV9WREVWX1BBUkFNX05TUzoKKwkJCWludHJbdmlkXS5jb25maWcubnNzID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9MRFBDOgorCQkJaW50clt2aWRdLmNvbmZpZy5sZHBjID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9UWF9TVEJDOgorCQkJaW50clt2aWRdLmNvbmZpZy50eF9zdGJjID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9SWF9TVEJDOgorCQkJaW50clt2aWRdLmNvbmZpZy5yeF9zdGJjID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9TR0k6CisJCQlpbnRyW3ZpZF0uY29uZmlnLnNob3J0Z2kgPSBwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BBUkFNX0VOQUJMRV9SVFNDVFM6CisJCQlpbnRyW3ZpZF0uY29uZmlnLnJ0c2N0c19lbiA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fQ0hXSURUSDoKKwkJCWludHJbdmlkXS5jb25maWcuY2h3aWR0aCA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fRklYRURfUkFURToKKwkJCWludHJbdmlkXS5jb25maWcudHhfcmF0ZSA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfQURKVVNUX0VOQUJMRToKKwkJCWludHJbdmlkXS5jb25maWcuZXJ4X2FkanVzdCA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfVEdUX0JNSVNTX05VTToKKwkJCWludHJbdmlkXS5jb25maWcuZXJ4X2JtaXNzX251bSA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfQk1JU1NfU0FNUExFX0NZQ0xFOgorCQkJaW50clt2aWRdLmNvbmZpZy5lcnhfYm1pc3NfY3ljbGUgPSBwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BBUkFNX0VBUkxZX1JYX1NMT1BfU1RFUDoKKwkJCWludHJbdmlkXS5jb25maWcuZXJ4X3Nsb3Bfc3RlcCA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfSU5JVF9TTE9QOgorCQkJaW50clt2aWRdLmNvbmZpZy5lcnhfaW5pdF9zbG9wID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfVkRFVl9QQVJBTV9FQVJMWV9SWF9BREpVU1RfUEFVU0U6CisJCQlpbnRyW3ZpZF0uY29uZmlnLmVyeF9hZGpfcGF1c2UgPSBwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9WREVWX1BBUkFNX0VBUkxZX1JYX0RSSUZUX1NBTVBMRToKKwkJCWludHJbdmlkXS5jb25maWcuZXJ4X2RyaV9zYW1wbGUgPSBwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJV01BX0xPR0UoIkludmFsaWQgd21hX2NsaV9zZXQgdmRldiBjb21tYW5kL05vdCIKKwkJCQkgIiB5ZXQgaW1wbGVtZW50ZWQgMHgleCIsIHByaXZjbWQtPnBhcmFtX2lkKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICgyID09IHByaXZjbWQtPnBhcmFtX3ZwX2RldikgeworCQlzd2l0Y2ggKHByaXZjbWQtPnBhcmFtX2lkKSB7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fQU5JX0VOQUJMRToKKwkJCXdtYS0+cGRldmNvbmZpZy5hbmlfZW5hYmxlID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfUERFVl9QQVJBTV9BTklfUE9MTF9QRVJJT0Q6CisJCQl3bWEtPnBkZXZjb25maWcuYW5pX3BvbGxfbGVuID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfUERFVl9QQVJBTV9BTklfTElTVEVOX1BFUklPRDoKKwkJCXdtYS0+cGRldmNvbmZpZy5hbmlfbGlzdGVuX2xlbiA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fQU5JX09GRE1fTEVWRUw6CisJCQl3bWEtPnBkZXZjb25maWcuYW5pX29mZG1fbGV2ZWwgPSBwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9QREVWX1BBUkFNX0FOSV9DQ0tfTEVWRUw6CisJCQl3bWEtPnBkZXZjb25maWcuYW5pX2Nja19sZXZlbCA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fRFlOQU1JQ19CVzoKKwkJCXdtYS0+cGRldmNvbmZpZy5jd21lbmFibGUgPSBwcml2Y21kLT5wYXJhbV92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdNSV9QREVWX1BBUkFNX0NUU19DQlc6CisJCQl3bWEtPnBkZXZjb25maWcuY3RzX2NidyA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fVFhfQ0hBSU5fTUFTSzoKKwkJCXdtYS0+cGRldmNvbmZpZy50eGNoYWlubWFzayA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fUlhfQ0hBSU5fTUFTSzoKKwkJCXdtYS0+cGRldmNvbmZpZy5yeGNoYWlubWFzayA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgV01JX1BERVZfUEFSQU1fQlVSU1RfRU5BQkxFOgorCQkJd21hLT5wZGV2Y29uZmlnLmJ1cnN0X2VuYWJsZSA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJaWYgKCh3bWEtPnBkZXZjb25maWcuYnVyc3RfZW5hYmxlID09IDEpICYmCisJCQkgICAgKHdtYS0+cGRldmNvbmZpZy5idXJzdF9kdXIgPT0gMCkpCisJCQkJd21hLT5wZGV2Y29uZmlnLmJ1cnN0X2R1ciA9CisJCQkJCVdNQV9ERUZBVUxUX1NJRlNfQlVSU1RfRFVSQVRJT047CisJCQllbHNlIGlmICh3bWEtPnBkZXZjb25maWcuYnVyc3RfZW5hYmxlID09IDApCisJCQkJd21hLT5wZGV2Y29uZmlnLmJ1cnN0X2R1ciA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfUERFVl9QQVJBTV9CVVJTVF9EVVI6CisJCQl3bWEtPnBkZXZjb25maWcuYnVyc3RfZHVyID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfUERFVl9QQVJBTV9QT1dFUl9HQVRJTkdfU0xFRVA6CisJCQl3bWEtPnBkZXZjb25maWcucHdyZ2F0aW5nID0gcHJpdmNtZC0+cGFyYW1fdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBXTUlfUERFVl9QQVJBTV9UWFBPV0VSX0xJTUlUMkc6CisJCQl3bWEtPnBkZXZjb25maWcudHhwb3cyZyA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJaWYgKChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmJhbmRDYXBhYmlsaXR5ID09CisJCQkgICAgIGVDU1JfQkFORF9BTEwpIHx8CisJCQkgICAgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYmFuZENhcGFiaWxpdHkgPT0KKwkJCSAgICAgZUNTUl9CQU5EXzI0KSkgeworCQkJCWlmIChjZmdfc2V0X2ludChwTWFjLAorCQkJCQkJV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMLAorCQkJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWUpICE9CisJCQkJICAgIAkJCQllU0lSX1NVQ0NFU1MpCisJCQkJCVdNQV9MT0dFKCJjb3VsZCBub3Qgc2V0IFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTCIpOworCisJCQl9IGVsc2UgeworCQkJCVdNQV9MT0dFKCJDdXJyZW50IGJhbmQgaXMgbm90IDJHIik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXTUlfUERFVl9QQVJBTV9UWFBPV0VSX0xJTUlUNUc6CisJCQl3bWEtPnBkZXZjb25maWcudHhwb3c1ZyA9IHByaXZjbWQtPnBhcmFtX3ZhbHVlOworCQkJaWYgKChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmJhbmRDYXBhYmlsaXR5ID09CisJCQkgICAgIGVDU1JfQkFORF9BTEwpIHx8CisJCQkgICAgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYmFuZENhcGFiaWxpdHkgPT0KKwkJCSAgICAgZUNTUl9CQU5EXzVHKSkgeworCQkJCWlmIChjZmdfc2V0X2ludChwTWFjLAorCQkJCQkJV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMLAorCQkJCQkJcHJpdmNtZC0+cGFyYW1fdmFsdWUpICE9CisJCQkJCQkgCSAgICBlU0lSX1NVQ0NFU1MpCisJCQkJCVdNQV9MT0dFKCJjb3VsZCBub3Qgc2V0IFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTCIpOworCisJCQl9IGVsc2UgeworCQkJCVdNQV9MT0dFKCJDdXJyZW50IGJhbmQgaXMgbm90IDVHIik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdNQV9MT0dFKCJJbnZhbGlkIHdtYV9jbGlfc2V0IHBkZXYgY29tbWFuZC9Ob3QgeWV0IGltcGxlbWVudGVkIDB4JXgiLAorCQkJCSBwcml2Y21kLT5wYXJhbV9pZCk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoNSA9PSBwcml2Y21kLT5wYXJhbV92cF9kZXYpIHsKKwkJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCh3bWEtPndtaV9oYW5kbGUsCisJCQkJCQkgICAgICBwcml2Y21kLT5wYXJhbV92ZGV2X2lkLAorCQkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fUEFDS0VUX1BPV0VSU0FWRSwKKwkJCQkJCSAgICAgIHBwc192YWwpOworCQlpZiAocmV0KQorCQkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIHdtaSBwYWNrZXQgcG93ZXIgc2F2ZSBjbWQiKTsKKwkJZWxzZQorCQkJV01BX0xPR0QoIlNlbnQgcGFja2V0IHBvd2VyIHNhdmUgY21kICVkIHZhbHVlICV4IHRvIHRhcmdldCIsCisJCQkJcHJpdmNtZC0+cGFyYW1faWQsIHBwc192YWwpOworCX0KK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc19md19ldmVudCgpIC0gcHJvY2VzcyBhbnkgZncgZXZlbnQKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBidWY6IGZ3IGV2ZW50IGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyBhbnkgZncgZXZlbnQgdG8gc2VyaWFsaXplIGl0IHRocm91Z2ggbWMgdGhyZWFkLgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW50IHdtYV9wcm9jZXNzX2Z3X2V2ZW50KHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCXdtYV9wcm9jZXNzX2Z3X2V2ZW50X3BhcmFtcyAqYnVmKQoreworCXN0cnVjdCB3bWlfdW5pZmllZCAqd21pX2hhbmRsZSA9IChzdHJ1Y3Qgd21pX3VuaWZpZWQgKilidWYtPndtaV9oYW5kbGU7CisKKwl3bWlfcHJvY2Vzc19md19ldmVudCh3bWlfaGFuZGxlLCBidWYtPmV2dF9idWYpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9wcm9jZXNzX2Z3X2V2ZW50X2hhbmRsZXIoKSAtIGNvbW1vbiBldmVudCBoYW5kbGVyIHRvIHNlcmlhbGl6ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgcHJvY2Vzc2luZyB0aHJvdWdoIG1jX3RocmVhZAorICogQHdtaV9oYW5kbGU6IHdtaSBoYW5kbGUKKyAqIEBldnRfYnVmOiBldmVudCBidWZmZXIKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZQorICovCitpbnQgd21hX3Byb2Nlc3NfZndfZXZlbnRfaGFuZGxlcihzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUsCisJCQkJIHdtaV9idWZfdCBldnRfYnVmKQoreworCXdtYV9wcm9jZXNzX2Z3X2V2ZW50X3BhcmFtcyAqcGFyYW1zX2J1ZjsKKwljZHNfbXNnX3QgY2RzX21zZyA9IHsgMCB9OworCisJcGFyYW1zX2J1ZiA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZih3bWFfcHJvY2Vzc19md19ldmVudF9wYXJhbXMpKTsKKwlpZiAoIXBhcmFtc19idWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2MgbWVtb3J5IGZvciBwYXJhbXNfYnVmIiwgX19mdW5jX18pOworCQljZGZfbmJ1Zl9mcmVlKGV2dF9idWYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwYXJhbXNfYnVmLT53bWlfaGFuZGxlID0gd21pX2hhbmRsZTsKKwlwYXJhbXNfYnVmLT5ldnRfYnVmID0gZXZ0X2J1ZjsKKworCWNkc19tc2cudHlwZSA9IFdNQV9QUk9DRVNTX0ZXX0VWRU5UOworCWNkc19tc2cuYm9keXB0ciA9IHBhcmFtc19idWY7CisJY2RzX21zZy5ib2R5dmFsID0gMDsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0KKwkJY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfV01BLCAmY2RzX21zZykpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gcG9zdCBXTUFfUFJPQ0VTU19GV19FVkVOVCBtc2ciLAorCQkJIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZShldnRfYnVmKTsKKwkJY2RmX21lbV9mcmVlKHBhcmFtc19idWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJV01BX0xPR0QoIldNQV9QUk9DRVNTX0ZXX0VWRU5UIHBvc3RlZCIpOworCXJldHVybiAwOworCit9CisKKyNpZmRlZiBRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyCisvKioKKyAqIG9sX2NmZ19zZXRfZmxvd19jb250cm9sX3BhcmFtZXRlcnMoKSAtIHNldCBmbG93IGNvbnRyb2wgcGFyYW1ldGVycworICogQG9sQ2ZnOiBjZmcgcGFyYW1ldGVycworICogQG1hY19wYXJhbXM6IG1hYyBwYXJhbWV0ZXJzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYwordm9pZCBvbF9jZmdfc2V0X2Zsb3dfY29udHJvbF9wYXJhbWV0ZXJzKHN0cnVjdCB0eHJ4X3BkZXZfY2ZnX3BhcmFtX3QgKm9sQ2ZnLAorCQl0TWFjT3BlblBhcmFtZXRlcnMgKm1hY19wYXJhbXMpCit7CisJb2xDZmctPnR4X2Zsb3dfc3RhcnRfcXVldWVfb2Zmc2V0ID0KKwkJCQltYWNfcGFyYW1zLT50eF9mbG93X3N0YXJ0X3F1ZXVlX29mZnNldDsKKwlvbENmZy0+dHhfZmxvd19zdG9wX3F1ZXVlX3RoID0KKwkJCQltYWNfcGFyYW1zLT50eF9mbG93X3N0b3BfcXVldWVfdGg7Cit9CisjZWxzZQorc3RhdGljCit2b2lkIG9sX2NmZ19zZXRfZmxvd19jb250cm9sX3BhcmFtZXRlcnMoc3RydWN0IHR4cnhfcGRldl9jZmdfcGFyYW1fdCAqb2xDZmcsCisJCXRNYWNPcGVuUGFyYW1ldGVycyAqbWFjX3BhcmFtcykKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9OQU4KKy8qKgorICogd21hX3NldF9uYW5fZW5hYmxlKCkgLSBzZXQgbmFuIGVuYWJsZSBmbGFnIGluIFdNQSBoYW5kbGUKKyAqIEB3bWFfaGFuZGxlOiBQb2ludGVyIHRvIHdtYSBoYW5kbGUKKyAqIEBtYWNfcGFyYW06IFBvaW50ZXIgdG8gbWFjX3BhcmFtCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9zZXRfbmFuX2VuYWJsZSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJdE1hY09wZW5QYXJhbWV0ZXJzICptYWNfcGFyYW0pCit7CisJd21hX2hhbmRsZS0+aXNfbmFuX2VuYWJsZWQgPSBtYWNfcGFyYW0tPmlzX25hbl9lbmFibGVkOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHdtYV9zZXRfbmFuX2VuYWJsZSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJdE1hY09wZW5QYXJhbWV0ZXJzICptYWNfcGFyYW0pCit7Cit9CisjZW5kaWYKKworLyoqCisgKiB3bWFfb3BlbigpIC0gQWxsb2NhdGUgd21hIGNvbnRleHQgYW5kIGluaXRpYWxpemUgaXQuCisgKiBAY2RzX2NvbnRleHQ6ICBjZHMgY29udGV4dAorICogQHdtYV90Z3RfY2ZnX2NiOiB0Z3QgY29uZmlnIGNhbGxiYWNrIGZ1bgorICogQHJhZGFyX2luZF9jYjogZGZzIHJhZGFyIGluZGljYXRpb24gY2FsbGJhY2sKKyAqIEBtYWNfcGFyYW1zOiAgbWFjIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZQorICovCitDREZfU1RBVFVTIHdtYV9vcGVuKHZvaWQgKmNkc19jb250ZXh0LAorCQkgICAgd21hX3RndF9jZmdfY2IgdGd0X2NmZ19jYiwKKwkJICAgIHdtYV9kZnNfcmFkYXJfaW5kaWNhdGlvbl9jYiByYWRhcl9pbmRfY2IsCisJCSAgICB0TWFjT3BlblBhcmFtZXRlcnMgKm1hY19wYXJhbXMpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlOworCUhUQ19IQU5ETEUgaHRjX2hhbmRsZTsKKwljZGZfZGV2aWNlX3QgY2RmX2RldjsKKwl2b2lkICp3bWlfaGFuZGxlOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwlzdHJ1Y3Qgb2xfc29mdGMgKnNjbjsKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ19wYXJhbV90IG9sQ2ZnID0geyAwIH07CisKKwlXTUFfTE9HRCgiJXM6IEVudGVyIiwgX19mdW5jX18pOworCisJY2RmX2RldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX0NERl9ERVZJQ0UpOworCWh0Y19oYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9IVEMpOworCisJaWYgKCFodGNfaGFuZGxlKSB7CisJCVdNQV9MT0dQKCIlczogSW52YWxpZCBIVEMgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCS8qIEFsbG9jIG1lbW9yeSBmb3IgV01BIENvbnRleHQgKi8KKwljZGZfc3RhdHVzID0gY2RzX2FsbG9jX2NvbnRleHQoY2RzX2NvbnRleHQsIENERl9NT0RVTEVfSURfV01BLAorCQkJCSAgICAgICAodm9pZCAqKikmd21hX2hhbmRsZSwKKwkJCQkgICAgICAgc2l6ZW9mKHRfd21hX2hhbmRsZSkpOworCisJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dQKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciB3bWFfaGFuZGxlIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBjZGZfc3RhdHVzOworCX0KKworCWNkZl9tZW1femVybyh3bWFfaGFuZGxlLCBzaXplb2YodF93bWFfaGFuZGxlKSk7CisKKwlpZiAoY2RzX2dldF9jb25wYXJhbSgpICE9IENERl9GVE1fTU9ERSkgeworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCQljZGZfd2FrZV9sb2NrX2luaXQoJndtYV9oYW5kbGUtPnBub193YWtlX2xvY2ssICJ3bGFuX3Bub193bCIpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisJCWNkZl93YWtlX2xvY2tfaW5pdCgmd21hX2hhbmRsZS0+ZXh0c2Nhbl93YWtlX2xvY2ssCisJCQkJCSJ3bGFuX2V4dHNjYW5fd2wiKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVhUU0NBTiAqLworCQljZGZfd2FrZV9sb2NrX2luaXQoJndtYV9oYW5kbGUtPndvd193YWtlX2xvY2ssICJ3bGFuX3dvd193bCIpOworCX0KKworCS8qIGF0dGFjaCB0aGUgd21pICovCisJd21pX2hhbmRsZSA9IHdtaV91bmlmaWVkX2F0dGFjaCh3bWFfaGFuZGxlLAorCQkJCQl3bWFfcHJvY2Vzc19md19ldmVudF9oYW5kbGVyKTsKKwlpZiAoIXdtaV9oYW5kbGUpIHsKKwkJV01BX0xPR1AoIiVzOiBmYWlsZWQgdG8gYXR0YWNoIFdNSSIsIF9fZnVuY19fKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJZ290byBlcnJfd21hX2hhbmRsZTsKKwl9CisKKwlXTUFfTE9HQSgiV01BIC0tPiB3bWlfdW5pZmllZF9hdHRhY2ggLSBzdWNjZXNzIik7CisKKwkvKiBTYXZlIHRoZSBXTUkgJiBIVEMgaGFuZGxlICovCisJd21hX2hhbmRsZS0+d21pX2hhbmRsZSA9IHdtaV9oYW5kbGU7CisJd21hX2hhbmRsZS0+aHRjX2hhbmRsZSA9IGh0Y19oYW5kbGU7CisJd21hX2hhbmRsZS0+Y2RzX2NvbnRleHQgPSBjZHNfY29udGV4dDsKKwl3bWFfaGFuZGxlLT5jZGZfZGV2ID0gY2RmX2RldjsKKwl3bWFfaGFuZGxlLT5tYXhfc2NhbiA9IG1hY19wYXJhbXMtPm1heF9zY2FuOworCisJLyogaW5pdGlhbGl6ZSBkZWZhdWx0IHRhcmdldCBjb25maWcgKi8KKwl3bWFfc2V0X2RlZmF1bHRfdGd0X2NvbmZpZyh3bWFfaGFuZGxlKTsKKworCW9sQ2ZnLmlzX3VjX29mZmxvYWRfZW5hYmxlZCA9IG1hY19wYXJhbXMtPnVjT2ZmbG9hZEVuYWJsZWQ7CisJb2xDZmcudWNfdHhfYnVmZmVyX2NvdW50ID0gbWFjX3BhcmFtcy0+dWNUeEJ1ZkNvdW50OworCW9sQ2ZnLnVjX3R4X2J1ZmZlcl9zaXplID0gbWFjX3BhcmFtcy0+dWNUeEJ1ZlNpemU7CisJb2xDZmcudWNfcnhfaW5kaWNhdGlvbl9yaW5nX2NvdW50ID0gbWFjX3BhcmFtcy0+dWNSeEluZFJpbmdDb3VudDsKKwlvbENmZy51Y190eF9wYXJ0aXRpb25fYmFzZSA9IG1hY19wYXJhbXMtPnVjVHhQYXJ0aXRpb25CYXNlOworCisKKwl3bWFfaGFuZGxlLT50eF9jaGFpbl9tYXNrX2NjayA9IG1hY19wYXJhbXMtPnR4X2NoYWluX21hc2tfY2NrOworCXdtYV9oYW5kbGUtPnNlbGZfZ2VuX2ZybV9wd3IgPSBtYWNfcGFyYW1zLT5zZWxmX2dlbl9mcm1fcHdyOworCisJLyogQWxsb2NhdGUgY2ZnIGhhbmRsZSAqLworCisJLyogUlggRnVsbCByZW9yZGVyIHNob3VsZCBlbmFibGUgZm9yIFBDSWUsIFJPTUUzLlggcHJvamVjdCBvbmx5IG5vdworCSAqIE1ETSBzaG91bGQgZW5hYmxlIGxhdGVyLCBzY2hlZHVsZSBUQkQKKwkgKiBITCBhbHNvIHNkb3VsZCBiZSBlbmFibGVkLCBzY2hlZHVsZSBUQkQKKwkgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUlhfRlVMTF9SRU9SREVSX09MCisJb2xDZmcuaXNfZnVsbF9yZW9yZGVyX29mZmxvYWQgPSBtYWNfcGFyYW1zLT5yZW9yZGVyT2ZmbG9hZDsKKyNlbHNlCisJb2xDZmcuaXNfZnVsbF9yZW9yZGVyX29mZmxvYWQgPSAwOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9SWF9GVUxMX1JFT1JERVJfT0wgKi8KKwlvbENmZy5lbmFibGVfcnh0aHJlYWQgPSBtYWNfcGFyYW1zLT5lbmFibGVfcnh0aHJlYWQ7CisJb2xDZmcuaXBfdGNwX3VkcF9jaGVja3N1bV9vZmZsb2FkID0KKwkJCW1hY19wYXJhbXMtPmlwX3RjcF91ZHBfY2hlY2tzdW1fb2ZmbG9hZDsKKwlvbENmZy5jZV9jbGFzc2lmeV9lbmFibGVkID0gbWFjX3BhcmFtcy0+Y2VfY2xhc3NpZnlfZW5hYmxlZDsKKworCW9sX2NmZ19zZXRfZmxvd19jb250cm9sX3BhcmFtZXRlcnMoJm9sQ2ZnLCBtYWNfcGFyYW1zKTsKKworCSgocF9jZHNfY29udGV4dFR5cGUpIGNkc19jb250ZXh0KS0+Y2ZnX2N0eCA9CisJCW9sX3BkZXZfY2ZnX2F0dGFjaCgoKHBfY2RzX2NvbnRleHRUeXBlKSBjZHNfY29udGV4dCktPmNkZl9jdHgsCisJCQkJICAgb2xDZmcpOworCWlmICghKCgocF9jZHNfY29udGV4dFR5cGUpIGNkc19jb250ZXh0KS0+Y2ZnX2N0eCkpIHsKKwkJV01BX0xPR1AoIiVzOiBmYWlsZWQgdG8gaW5pdCBjZmcgaGFuZGxlIiwgX19mdW5jX18pOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQlnb3RvIGVycl93bWlfaGFuZGxlOworCX0KKworCS8qIGFkanVzdCB0aGUgY2ZnX2N0eCBkZWZhdWx0IHZhbHVlIGJhc2VkIG9uIHNldHRpbmcgKi8KKwlvbF9zZXRfY2ZnX3J4X2Z3ZF9kaXNhYmxlZCgob2xfcGRldl9oYW5kbGUpCisJCQkJICAgKChwX2Nkc19jb250ZXh0VHlwZSkgY2RzX2NvbnRleHQpLT5jZmdfY3R4LAorCQkJCSAgICh1aW50OF90KSBtYWNfcGFyYW1zLT5hcERpc2FibGVJbnRyYUJzc0Z3ZCk7CisKKwkvKiBhZGp1c3QgdGhlIHBhY2tldCBsb2cgZW5hYmxlIGRlZmF1bHQgdmFsdWUgYmFzZWQgb24gQ0ZHIElOSSBzZXR0aW5nICovCisJb2xfc2V0X2NmZ19wYWNrZXRfbG9nX2VuYWJsZWQoKG9sX3BkZXZfaGFuZGxlKQorCQkJCQkoKHBfY2RzX2NvbnRleHRUeXBlKSBjZHNfY29udGV4dCktPgorCQkJCQkJY2ZnX2N0eCwKKwkJCQkgICAgICAodWludDhfdCljZHNfaXNfcGFja2V0X2xvZ19lbmFibGVkKCkpOworCisJLyogQWxsb2NhdGUgZGZzX2ljIGFuZCBpbml0aWFsaXplIERGUyAqLworCXdtYV9oYW5kbGUtPmRmc19pYyA9IHdtYV9kZnNfYXR0YWNoKHdtYV9oYW5kbGUtPmRmc19pYyk7CisJaWYgKHdtYV9oYW5kbGUtPmRmc19pYyA9PSBOVUxMKSB7CisJCVdNQV9MT0dFKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBkZnNfaWMiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3dtaV9oYW5kbGU7CisJfQorI2lmIGRlZmluZWQoUUNBX1dJRklfRlRNKQorCWlmIChjZHNfZ2V0X2NvbnBhcmFtKCkgPT0gQ0RGX0ZUTV9NT0RFKQorCQl3bWFfdXRmX2F0dGFjaCh3bWFfaGFuZGxlKTsKKyNlbmRpZiAvKiBRQ0FfV0lGSV9GVE0gKi8KKworCS8qVE9ETzogUmVjaGVjayBiZWxvdyBwYXJhbWV0ZXJzICovCisJc2NuID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKworCWlmIChOVUxMID09IHNjbikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgc2NuIiwgX19mdW5jX18pOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQlnb3RvIGVycl9zY25fY29udGV4dDsKKwl9CisKKwltYWNfcGFyYW1zLT5tYXhTdGF0aW9uID0gb2xfZ2V0X251bWJlcl9vZl9wZWVyc19zdXBwb3J0ZWQoc2NuKTsKKworCW1hY19wYXJhbXMtPm1heEJzc0lkID0gV01BX01BWF9TVVBQT1JURURfQlNTOworCW1hY19wYXJhbXMtPmZyYW1lVHJhbnNSZXF1aXJlZCA9IDA7CisKKwl3bWFfaGFuZGxlLT53bGFuX3Jlc291cmNlX2NvbmZpZy5udW1fd293X2ZpbHRlcnMgPQorCQltYWNfcGFyYW1zLT5tYXhXb1dGaWx0ZXJzOworCXdtYV9oYW5kbGUtPndsYW5fcmVzb3VyY2VfY29uZmlnLm51bV9rZWVwX2FsaXZlX3BhdHRlcm4gPQorCQlXTUFfTUFYTlVNX1BFUklPRElDX1RYX1BUUk5TOworCisJLyogVGhlIGN1cnJlbnQgZmlybXdhcmUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlIG51bWJlciBvZgorICAgICAgICAgKiBvZmZsb2FkIHBlZXJzIHNob3VsZCBiZSAobnVtYmVyIG9mIHZkZXZzICsgMSkuCisJICovCisJd21hX2hhbmRsZS0+d2xhbl9yZXNvdXJjZV9jb25maWcubnVtX29mZmxvYWRfcGVlcnMgPQorCQltYWNfcGFyYW1zLT5hcE1heE9mZmxvYWRQZWVycyArIDE7CisKKwl3bWFfaGFuZGxlLT53bGFuX3Jlc291cmNlX2NvbmZpZy5udW1fb2ZmbG9hZF9yZW9yZGVyX2J1ZmZzID0KKwkJbWFjX3BhcmFtcy0+YXBNYXhPZmZsb2FkUmVvcmRlckJ1ZmZzICsgMTsKKworCXdtYV9oYW5kbGUtPm9sX2luaV9pbmZvID0gbWFjX3BhcmFtcy0+b2xJbmlJbmZvOworCXdtYV9oYW5kbGUtPm1heF9zdGF0aW9uID0gbWFjX3BhcmFtcy0+bWF4U3RhdGlvbjsKKwl3bWFfaGFuZGxlLT5tYXhfYnNzaWQgPSBtYWNfcGFyYW1zLT5tYXhCc3NJZDsKKwl3bWFfaGFuZGxlLT5mcmFtZV94bG5fcmVxZCA9IG1hY19wYXJhbXMtPmZyYW1lVHJhbnNSZXF1aXJlZDsKKwl3bWFfaGFuZGxlLT5kcml2ZXJfdHlwZSA9IG1hY19wYXJhbXMtPmRyaXZlclR5cGU7CisJd21hX2hhbmRsZS0+c3NkcCA9IG1hY19wYXJhbXMtPnNzZHA7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1JBX0ZJTFRFUklORworCXdtYV9oYW5kbGUtPklzUkFyYXRlTGltaXRFbmFibGVkID0gbWFjX3BhcmFtcy0+SXNSQXJhdGVMaW1pdEVuYWJsZWQ7CisJd21hX2hhbmRsZS0+UkFyYXRlTGltaXRJbnRlcnZhbCA9IG1hY19wYXJhbXMtPlJBcmF0ZUxpbWl0SW50ZXJ2YWw7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1JBX0ZJTFRFUklORyAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisJd21hX2hhbmRsZS0+aXNfbHBhc3NfZW5hYmxlZCA9IG1hY19wYXJhbXMtPmlzX2xwYXNzX2VuYWJsZWQ7CisjZW5kaWYKKwl3bWFfc2V0X25hbl9lbmFibGUod21hX2hhbmRsZSwgbWFjX3BhcmFtcyk7CisJLyoKKwkgKiBJbmRpY2F0ZXMgaWYgREZTIFBoeWVyciBmaWx0ZXJpbmcgb2ZmbG9hZAorCSAqIGlzIEVuYWJsZWQvRGlzYWJlZCBmcm9tIGluaQorCSAqLworCXdtYV9oYW5kbGUtPmRmc19waHllcnJfZmlsdGVyX29mZmxvYWQgPQorCQltYWNfcGFyYW1zLT5kZnNQaHllcnJGaWx0ZXJPZmZsb2FkOworCXdtYV9oYW5kbGUtPmRmc19wcmlfbXVsdGlwbGllciA9IG1hY19wYXJhbXMtPmRmc1JhZGFyUHJpTXVsdGlwbGllcjsKKwl3bWFfaGFuZGxlLT5pbnRlcmZhY2VzID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCB3bWFfdHhyeF9ub2RlKSAqCisJCQkJCQl3bWFfaGFuZGxlLT5tYXhfYnNzaWQpOworCWlmICghd21hX2hhbmRsZS0+aW50ZXJmYWNlcykgeworCQlXTUFfTE9HUCgiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBpbnRlcmZhY2UgdGFibGUiLCBfX2Z1bmNfXyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gZXJyX3Njbl9jb250ZXh0OworCX0KKwljZGZfbWVtX3plcm8od21hX2hhbmRsZS0+aW50ZXJmYWNlcywgc2l6ZW9mKHN0cnVjdCB3bWFfdHhyeF9ub2RlKSAqCisJCSAgICAgd21hX2hhbmRsZS0+bWF4X2Jzc2lkKTsKKwkvKiBSZWdpc3RlciB0aGUgZGVidWcgcHJpbnQgZXZlbnQgaGFuZGxlciAqLworCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJICAgV01JX0RFQlVHX1BSSU5UX0VWRU5USUQsCisJCQkJCSAgIHdtYV91bmlmaWVkX2RlYnVnX3ByaW50X2V2ZW50X2hhbmRsZXIpOworCisJd21hX2hhbmRsZS0+dGd0X2NmZ191cGRhdGVfY2IgPSB0Z3RfY2ZnX2NiOworCXdtYV9oYW5kbGUtPmRmc19yYWRhcl9pbmRpY2F0aW9uX2NiID0gcmFkYXJfaW5kX2NiOworCXdtYV9oYW5kbGUtPm9sZF9od19tb2RlX2luZGV4ID0gV01BX0RFRkFVTFRfSFdfTU9ERV9JTkRFWDsKKwl3bWFfaGFuZGxlLT5uZXdfaHdfbW9kZV9pbmRleCA9IFdNQV9ERUZBVUxUX0hXX01PREVfSU5ERVg7CisJd21hX2hhbmRsZS0+c2F2ZWRfd21pX2luaXRfY21kLmJ1ZiA9IE5VTEw7CisKKwljZGZfc3RhdHVzID0gY2RmX2V2ZW50X2luaXQoJndtYV9oYW5kbGUtPndtYV9yZWFkeV9ldmVudCk7CisJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dQKCIlczogd21hX3JlYWR5X2V2ZW50IGluaXRpYWxpemF0aW9uIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfZXZlbnRfaW5pdDsKKwl9CisJY2RmX3N0YXR1cyA9IGNkZl9ldmVudF9pbml0KCZ3bWFfaGFuZGxlLT50YXJnZXRfc3VzcGVuZCk7CisJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dQKCIlczogdGFyZ2V0IHN1c3BlbmQgZXZlbnQgaW5pdGlhbGl6YXRpb24gZmFpbGVkIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2V2ZW50X2luaXQ7CisJfQorCisJLyogSW5pdCBUeCBGcmFtZSBDb21wbGV0ZSBldmVudCAqLworCWNkZl9zdGF0dXMgPSBjZGZfZXZlbnRfaW5pdCgmd21hX2hhbmRsZS0+dHhfZnJtX2Rvd25sb2FkX2NvbXBfZXZlbnQpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCVdNQV9MT0dQKCIlczogZmFpbGVkIHRvIGluaXQgdHhfZnJtX2Rvd25sb2FkX2NvbXBfZXZlbnQiLAorCQkJIF9fZnVuY19fKTsKKwkJZ290byBlcnJfZXZlbnRfaW5pdDsKKwl9CisKKwkvKiBJbml0IHR4IHF1ZXVlIGVtcHR5IGNoZWNrIGV2ZW50ICovCisJY2RmX3N0YXR1cyA9IGNkZl9ldmVudF9pbml0KCZ3bWFfaGFuZGxlLT50eF9xdWV1ZV9lbXB0eV9ldmVudCk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJV01BX0xPR1AoIiVzOiBmYWlsZWQgdG8gaW5pdCB0eF9xdWV1ZV9lbXB0eV9ldmVudCIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfZXZlbnRfaW5pdDsKKwl9CisKKwljZGZfc3RhdHVzID0gY2RmX2V2ZW50X2luaXQoJndtYV9oYW5kbGUtPndtYV9yZXN1bWVfZXZlbnQpOworCWlmIChjZGZfc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HUCgiJXM6IHdtYV9yZXN1bWVfZXZlbnQgaW5pdGlhbGl6YXRpb24gZmFpbGVkIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2V2ZW50X2luaXQ7CisJfQorCisJY2RmX3N0YXR1cyA9IGNkZl9ldmVudF9pbml0KCZ3bWFfaGFuZGxlLT5yZWNvdmVyeV9ldmVudCk7CisJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dQKCIlczogcmVjb3ZlcnkgZXZlbnQgaW5pdGlhbGl6YXRpb24gZmFpbGVkIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9ldmVudF9pbml0OworCX0KKworCUlOSVRfTElTVF9IRUFEKCZ3bWFfaGFuZGxlLT52ZGV2X3Jlc3BfcXVldWUpOworCWNkZl9zcGlubG9ja19pbml0KCZ3bWFfaGFuZGxlLT52ZGV2X3Jlc3BxX2xvY2spOworCWNkZl9saXN0X2luaXQoJndtYV9oYW5kbGUtPndtYV9ob2xkX3JlcV9xdWV1ZSwKKwkJICAgICAgTUFYX0VOVFJZX0hPTERfUkVRX1FVRVVFKTsKKwljZGZfc3BpbmxvY2tfaW5pdCgmd21hX2hhbmRsZS0+d21hX2hvbGRfcmVxX3FfbG9jayk7CisJY2RmX2F0b21pY19pbml0KCZ3bWFfaGFuZGxlLT5pc193b3dfYnVzX3N1c3BlbmRlZCk7CisJY2RmX2F0b21pY19pbml0KCZ3bWFfaGFuZGxlLT5zY2FuX2lkX2NvdW50ZXIpOworCisJLyogUmVnaXN0ZXIgdmRldiBzdGFydCByZXNwb25zZSBldmVudCBoYW5kbGVyICovCisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfVkRFVl9TVEFSVF9SRVNQX0VWRU5USUQsCisJCQkJCSAgIHdtYV92ZGV2X3N0YXJ0X3Jlc3BfaGFuZGxlcik7CisKKwkvKiBSZWdpc3RlciB2ZGV2IHN0b3AgcmVzcG9uc2UgZXZlbnQgaGFuZGxlciAqLworCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJICAgV01JX1ZERVZfU1RPUFBFRF9FVkVOVElELAorCQkJCQkgICB3bWFfdmRldl9zdG9wX3Jlc3BfaGFuZGxlcik7CisKKwkvKiByZWdpc3RlciBmb3IgU1RBIGtpY2tvdXQgZnVuY3Rpb24gKi8KKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCSAgIFdNSV9QRUVSX1NUQV9LSUNLT1VUX0VWRU5USUQsCisJCQkJCSAgIHdtYV9wZWVyX3N0YV9raWNrb3V0X2V2ZW50X2hhbmRsZXIpOworCisJLyogcmVnaXN0ZXIgZm9yIHN0YXRzIHJlc3BvbnNlIGV2ZW50ICovCisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfVVBEQVRFX1NUQVRTX0VWRU5USUQsCisJCQkJCSAgIHdtYV9zdGF0c19ldmVudF9oYW5kbGVyKTsKKwkvKiByZWdpc3RlciBmb3IgbGlua3NwZWVkIHJlc3BvbnNlIGV2ZW50ICovCisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfUEVFUl9FU1RJTUFURURfTElOS1NQRUVEX0VWRU5USUQsCisJCQkJCSAgIHdtYV9saW5rX3NwZWVkX2V2ZW50X2hhbmRsZXIpOworCisjaWZkZWYgRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUCisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfT0VNX0NBUEFCSUxJVFlfRVZFTlRJRCwKKwkJCQkJICAgd21hX29lbV9jYXBhYmlsaXR5X2V2ZW50X2NhbGxiYWNrKTsKKworCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJICAgV01JX09FTV9NRUFTVVJFTUVOVF9SRVBPUlRfRVZFTlRJRCwKKwkJCQkJICAgd21hX29lbV9tZWFzdXJlbWVudF9yZXBvcnRfZXZlbnRfY2FsbGJhY2spOworCisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfT0VNX0VSUk9SX1JFUE9SVF9FVkVOVElELAorCQkJCQkgICB3bWFfb2VtX2Vycm9yX3JlcG9ydF9ldmVudF9jYWxsYmFjayk7CisjZW5kaWYgLyogRkVBVFVSRV9PRU1fREFUQV9TVVBQT1JUICovCisJLyoKKwkgKiBSZWdpc3RlciBhcHByb3ByaWF0ZSBERlMgcGh5ZXJyIGV2ZW50IGhhbmRsZXIgZm9yCisJICogUGh5ZXJyb3IgZXZlbnRzLiBIYW5kbGVycyBkaWZmZXIgZm9yIHBoeWVyciBmaWx0ZXJpbmcKKwkgKiBvZmZsb2FkIGVuYWJsZSBhbmQgZGlzYWJsZSBjYXNlcy4KKwkgKi8KKwl3bWFfcmVnaXN0ZXJfZGZzX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZSk7CisKKwkvKiBSZWdpc3RlciBwZWVyIGNoYW5nZSBldmVudCBoYW5kbGVyICovCisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfUEVFUl9TVEFURV9FVkVOVElELAorCQkJCQkgICB3bWFfcGVlcl9zdGF0ZV9jaGFuZ2VfZXZlbnRfaGFuZGxlcik7CisKKwkvKiBSZWdpc3RlciBiZWFjb24gdHggY29tcGxldGUgZXZlbnQgaWQuIFRoZSBldmVudCBpcyByZXF1aXJlZAorCSAqIGZvciBzZW5kaW5nIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBmcmFtZXMKKwkgKi8KKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCSAgIFdNSV9PRkZMT0FEX0JDTl9UWF9TVEFUVVNfRVZFTlRJRCwKKwkJCQkJICAgd21hX3VuaWZpZWRfYmNudHhfc3RhdHVzX2V2ZW50X2hhbmRsZXIpOworCisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfVVBEQVRFX1ZERVZfUkFURV9TVEFUU19FVkVOVElELAorCQkJCQkgICB3bWFfbGlua19zdGF0dXNfZXZlbnRfaGFuZGxlcik7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKKwkvKiBSZWdpc3RlciBldmVudCBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIExpbmsgTGF5ZXIgU3RhdHMKKwkgKiByZXNwb25zZSBmcm9tIHRoZSBGVworCSAqLworCXdtYV9yZWdpc3Rlcl9sbF9zdGF0c19ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUpOworCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMgKi8KKworCS8qCisJICogUmVnaXN0ZXIgZXZlbnQgaGFuZGxlciB0byByZWNlaXZlIGZpcm13YXJlIG1lbSBkdW1wCisJICogY29weSBjb21wbGV0ZSBpbmRpY2F0aW9uCisJICovCisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJV01JX1VQREFURV9GV19NRU1fRFVNUF9FVkVOVElELAorCQkJd21hX2Z3X21lbV9kdW1wX2V2ZW50X2hhbmRsZXIpOworCisJLyogRmlybXdhcmUgZGVidWcgbG9nICovCisJY2RmX3N0YXR1cyA9IGRiZ2xvZ19pbml0KHdtYV9oYW5kbGUtPndtaV9oYW5kbGUpOworCWlmIChjZGZfc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HUCgiJXM6IEZpcm13YXJlIERiZ2xvZyBpbml0aWFsaXphdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2RiZ2xvZ19pbml0OworCX0KKworCS8qCisJICogVXBkYXRlIFBvd2Vyc2F2ZSBtb2RlCisJICogMSAtIExlZ2FjeSBQb3dlcnNhdmUgKyBEZWVwc2xlZXAgRGlzYWJsZWQKKwkgKiAyIC0gUVBvd2VyICsgRGVlcHNsZWVwIERpc2FibGVkCisJICogMyAtIExlZ2FjeSBQb3dlcnNhdmUgKyBEZWVwc2xlZXAgRW5hYmxlZAorCSAqIDQgLSBRUG93ZXIgKyBEZWVwc2xlZXAgRW5hYmxlZAorCSAqLworCXdtYV9oYW5kbGUtPnBvd2Vyc2F2ZV9tb2RlID0gbWFjX3BhcmFtcy0+cG93ZXJzYXZlT2ZmbG9hZEVuYWJsZWQ7CisJd21hX2hhbmRsZS0+c3RhTWF4TElNb2REdGltID0gbWFjX3BhcmFtcy0+c3RhTWF4TElNb2REdGltOworCXdtYV9oYW5kbGUtPnN0YU1vZER0aW0gPSBtYWNfcGFyYW1zLT5zdGFNb2REdGltOworCXdtYV9oYW5kbGUtPnN0YUR5bmFtaWNEdGltID0gbWFjX3BhcmFtcy0+c3RhRHluYW1pY0R0aW07CisKKwkvKgorCSAqIFZhbHVlIG9mIG1hY19wYXJhbXMtPndvd0VuYWJsZSBjYW4gYmUsCisJICogMCAtIERpc2FibGUgYm90aCBtYWdpYyBwYXR0ZXJuIG1hdGNoIGFuZCBwYXR0ZXJuIGJ5dGUgbWF0Y2guCisJICogMSAtIEVuYWJsZSBtYWdpYyBwYXR0ZXJuIG1hdGNoIG9uIGFsbCBpbnRlcmZhY2VzLgorCSAqIDIgLSBFbmFibGUgcGF0dGVybiBieXRlIG1hdGNoIG9uIGFsbCBpbnRlcmZhY2VzLgorCSAqIDMgLSBFbmFibGUgYm90aCBtYWdpYyBwYXR0ZXIgYW5kIHBhdHRlcm4gYnl0ZSBtYXRjaCBvbgorCSAqICAgICBhbGwgaW50ZXJmYWNlcy4KKwkgKi8KKwl3bWFfaGFuZGxlLT53b3cubWFnaWNfcHRybl9lbmFibGUgPQorCQkobWFjX3BhcmFtcy0+d293RW5hYmxlICYgMHgwMSkgPyB0cnVlIDogZmFsc2U7CisJd21hX2hhbmRsZS0+cHRybl9tYXRjaF9lbmFibGVfYWxsX3ZkZXYgPQorCQkobWFjX3BhcmFtcy0+d293RW5hYmxlICYgMHgwMikgPyB0cnVlIDogZmFsc2U7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJICAgV01JX1RETFNfUEVFUl9FVkVOVElELAorCQkJCQkgICB3bWFfdGRsc19ldmVudF9oYW5kbGVyKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fVERMUyAqLworCisJLyogcmVnaXN0ZXIgZm9yIGluc3RhbGwga2V5IGNvbXBsZXRpb24gZXZlbnQgKi8KKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCSAgIFdNSV9WREVWX0lOU1RBTExfS0VZX0NPTVBMRVRFX0VWRU5USUQsCisJCQkJCSAgIHdtYV92ZGV2X2luc3RhbGxfa2V5X2NvbXBsZXRlX2V2ZW50X2hhbmRsZXIpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9OQU4KKwkvKiByZWdpc3RlciBmb3IgbmFuIHJlc3BvbnNlIGV2ZW50ICovCisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfTkFOX0VWRU5USUQsCisJCQkJCSAgIHdtYV9uYW5fcnNwX2V2ZW50X2hhbmRsZXIpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9OQU4gKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9TVEFUU19FWFQKKwkvKiByZWdpc3RlciBmb3IgZXh0ZW5kZWQgc3RhdHMgZXZlbnQgKi8KKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCSAgIFdNSV9TVEFUU19FWFRfRVZFTlRJRCwKKwkJCQkJICAgd21hX3N0YXRzX2V4dF9ldmVudF9oYW5kbGVyKTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwl3bWFfcmVnaXN0ZXJfZXh0c2Nhbl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9TVEFUU19FWFQgKi8KKworCVdNQV9MT0dEKCIlczogRXhpdCIsIF9fZnVuY19fKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCSAgIFdNSV9ST0FNX1NZTkNIX0VWRU5USUQsCisJCQkJCSAgIHdtYV9yb2FtX3N5bmNoX2V2ZW50X2hhbmRsZXIpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQgKi8KKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJV01JX1JTU0lfQlJFQUNIX0VWRU5USUQsCisJCQkJd21hX3Jzc2lfYnJlYWNoZWRfZXZlbnRfaGFuZGxlcik7CisKKwkvKiBSZWdpc3RlciBwZWVyIGFzc29jIGNvbmYgZXZlbnQgaGFuZGxlciAqLworCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJICAgV01JX1BFRVJfQVNTT0NfQ09ORl9FVkVOVElELAorCQkJCQkgICB3bWFfcGVlcl9hc3NvY19jb25mX2hhbmRsZXIpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworZXJyX2RiZ2xvZ19pbml0OgorCWNkZl9zcGlubG9ja19kZXN0cm95KCZ3bWFfaGFuZGxlLT52ZGV2X3Jlc3BxX2xvY2spOworCWNkZl9zcGlubG9ja19kZXN0cm95KCZ3bWFfaGFuZGxlLT53bWFfaG9sZF9yZXFfcV9sb2NrKTsKK2Vycl9ldmVudF9pbml0OgorCXdtaV91bmlmaWVkX3VucmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICAgIFdNSV9ERUJVR19QUklOVF9FVkVOVElEKTsKKwljZGZfbWVtX2ZyZWUod21hX2hhbmRsZS0+aW50ZXJmYWNlcyk7CitlcnJfc2NuX2NvbnRleHQ6CisJd21hX2Rmc19kZXRhY2god21hX2hhbmRsZS0+ZGZzX2ljKTsKKyNpZiBkZWZpbmVkKFFDQV9XSUZJX0ZUTSkKKwl3bWFfdXRmX2RldGFjaCh3bWFfaGFuZGxlKTsKKyNlbmRpZiAvKiBRQ0FfV0lGSV9GVE0gKi8KK2Vycl93bWlfaGFuZGxlOgorCWNkZl9tZW1fZnJlZSgoKHBfY2RzX2NvbnRleHRUeXBlKSBjZHNfY29udGV4dCktPmNmZ19jdHgpOworCU9TX0ZSRUUod21pX2hhbmRsZSk7CisKK2Vycl93bWFfaGFuZGxlOgorCisJaWYgKGNkc19nZXRfY29ucGFyYW0oKSAhPSBDREZfRlRNX01PREUpIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwkJY2RmX3dha2VfbG9ja19kZXN0cm95KCZ3bWFfaGFuZGxlLT5wbm9fd2FrZV9sb2NrKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCQljZGZfd2FrZV9sb2NrX2Rlc3Ryb3koJndtYV9oYW5kbGUtPmV4dHNjYW5fd2FrZV9sb2NrKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVhUU0NBTiAqLworCQljZGZfd2FrZV9sb2NrX2Rlc3Ryb3koJndtYV9oYW5kbGUtPndvd193YWtlX2xvY2spOworCX0KKwljZHNfZnJlZV9jb250ZXh0KGNkc19jb250ZXh0LCBDREZfTU9EVUxFX0lEX1dNQSwgd21hX2hhbmRsZSk7CisKKwlXTUFfTE9HRCgiJXM6IEV4aXQiLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiB3bWFfcHJlX3N0YXJ0KCkgLSB3bWEgcHJlIHN0YXJ0CisgKiBAY2RzX2N0eDogIGNkcyBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUKKyAqLworQ0RGX1NUQVRVUyB3bWFfcHJlX3N0YXJ0KHZvaWQgKmNkc19jdHgpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCUFfU1RBVFVTIHN0YXR1cyA9IEFfT0s7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlOworCWNkc19tc2dfdCB3bWFfbXNnID0geyAwIH07CisKKwlXTUFfTE9HRCgiJXM6IEVudGVyIiwgX19mdW5jX18pOworCisJd21hX2hhbmRsZSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisKKwkvKiBWYWxpZGF0ZSB0aGUgd21hX2hhbmRsZSAqLworCWlmIChOVUxMID09IHdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR1AoIiVzOiBpbnZhbGlkIGFyZ3VtZW50IiwgX19mdW5jX18pOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJLyogT3BlbiBlbmRwb2ludCBmb3IgY3RybCBwYXRoIC0gV01JIDwtLT4gSFRDICovCisJc3RhdHVzID0gd21pX3VuaWZpZWRfY29ubmVjdF9odGNfc2VydmljZSh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkJIHdtYV9oYW5kbGUtPmh0Y19oYW5kbGUpOworCWlmIChBX09LICE9IHN0YXR1cykgeworCQlXTUFfTE9HUCgiJXM6IHdtaV91bmlmaWVkX2Nvbm5lY3RfaHRjX3NlcnZpY2UiLCBfX2Z1bmNfXyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCWdvdG8gZW5kOworCX0KKworCVdNQV9MT0dBKCJXTUEgLS0+IHdtaV91bmlmaWVkX2Nvbm5lY3RfaHRjX3NlcnZpY2UgLSBzdWNjZXNzIik7CisKKwkvKiBUcmlnZ2VyIHRoZSBDRkcgRE9XTkxPQUQgKi8KKwl3bWFfbXNnLnR5cGUgPSBXTklfQ0ZHX0ROTERfUkVROworCXdtYV9tc2cuYm9keXB0ciA9IE5VTEw7CisJd21hX21zZy5ib2R5dmFsID0gMDsKKworCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9XTUEsICZ3bWFfbXNnKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9zdGF0dXMpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gcG9zdCBXTklfQ0ZHX0ROTERfUkVRIG1zZyIsIF9fZnVuY19fKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KK2VuZDoKKwlXTUFfTE9HRCgiJXM6IEV4aXQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogd21hX3NlbmRfbXNnKCkgLSBTZW5kIHdtYSBtZXNzYWdlIHRvIFBFLgorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBtc2dfdHlwZTogbWVzc2FnZSB0eXBlCisgKiBAYm9keV9wdHI6IG1lc3NhZ2UgYm9keSBwdHIKKyAqIEBib2R5X3ZhbDogbWVzc2FnZSBib2R5IHZhbHVlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3NlbmRfbXNnKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgdWludDE2X3QgbXNnX3R5cGUsCisJCQkgdm9pZCAqYm9keV9wdHIsIHVpbnQzMl90IGJvZHlfdmFsKQoreworCXRTaXJNc2dRIG1zZyA9IHsgMCB9OworCXVpbnQzMl90IHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCW1zZy50eXBlID0gbXNnX3R5cGU7CisJbXNnLmJvZHl2YWwgPSBib2R5X3ZhbDsKKwltc2cuYm9keXB0ciA9IGJvZHlfcHRyOworCXN0YXR1cyA9IGxpbV9wb3N0X21zZ19hcGkocE1hYywgJm1zZyk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaWYgKE5VTEwgIT0gYm9keV9wdHIpCisJCQljZGZfbWVtX2ZyZWUoYm9keV9wdHIpOworCQlDREZfQVNTRVJUKDApOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogd21hX3NldF9iYXNlX21hY2FkZHJfaW5kaWNhdGUoKSAtIHNldCBiYXNlIG1hYyBhZGRyZXNzIGluIGZ3CisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQGN1c3RvbUFkZHI6IGJhc2UgbWFjIGFkZHJlc3MKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHdtYV9zZXRfYmFzZV9tYWNhZGRyX2luZGljYXRlKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJIHRTaXJNYWNBZGRyICpjdXN0b21BZGRyKQoreworCXdtaV9wZGV2X3NldF9iYXNlX21hY2FkZHJfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQgZXJyOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBzaXplb2YoKmNtZCkpOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIHRvIHNlbmQgc2V0X2Jhc2VfbWFjYWRkciBjbWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kID0gKHdtaV9wZGV2X3NldF9iYXNlX21hY2FkZHJfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCWNkZl9tZW1femVybyhjbWQsIHNpemVvZigqY21kKSk7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zZXRfYmFzZV9tYWNhZGRyX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcGRldl9zZXRfYmFzZV9tYWNhZGRyX2NtZF9maXhlZF9wYXJhbSkpOworCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKCpjdXN0b21BZGRyLCAmY21kLT5iYXNlX21hY2FkZHIpOworCWVyciA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgICBzaXplb2YoKmNtZCksCisJCQkJICAgV01JX1BERVZfU0VUX0JBU0VfTUFDQUREUl9DTURJRCk7CisJaWYgKGVycikgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgc2V0X2Jhc2VfbWFjYWRkciBjbWQiKTsKKwkJY2RmX21lbV9mcmVlKGJ1Zik7CisJCXJldHVybiAtRUlPOworCX0KKwlXTUFfTE9HRCgiQmFzZSBNQUMgQWRkcjogIiBNQUNfQUREUkVTU19TVFIsCisJCSBNQUNfQUREUl9BUlJBWSgoKmN1c3RvbUFkZHIpKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfbG9nX3N1cHBvcnRlZF9ldnRfaGFuZGxlcigpIC0gRW5hYmxlL0Rpc2FibGUgRlcgZGlhZy9sb2cgZXZlbnRzCisgKiBAaGFuZGxlOiBXTUEgaGFuZGxlCisgKiBAZXZlbnQ6ICBFdmVudCByZWNlaXZlZCBmcm9tIEZXCisgKiBAbGVuOiAgICBMZW5ndGggb2YgdGhlIGV2ZW50CisgKgorICogRW5hYmxlcyB0aGUgbG93IGZyZXF1ZW5jeSBldmVudHMgYW5kIGRpc2FibGVzIHRoZSBoaWdoIGZyZXF1ZW5jeQorICogZXZlbnRzLiBCaXQgMTcgaW5kaWNhdGVzIGlmIHRoZSBldmVudCBpZiBsb3cvaGlnaCBmcmVxdWVuY3kuCisgKiAxIC0gaGlnaCBmcmVxdWVuY3ksIDAgLSBsb3cgZnJlcXVlbmN5CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3NmdWxseSBlbmFibGluZy9kaXNhYmxpbmcgdGhlIGV2ZW50cworICovCitzdGF0aWMgaW50IHdtYV9sb2dfc3VwcG9ydGVkX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJdWludDhfdCAqZXZlbnQsCisJCXVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJdWludDMyX3QgbnVtX29mX2RpYWdfZXZlbnRzX2xvZ3M7CisJd21pX2RpYWdfZXZlbnRfbG9nX2NvbmZpZ19maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50MzJfdCAqY21kX2FyZ3MsICpldnRfYXJnczsKKwl1aW50MzJfdCBidWZfbGVuLCBpOworCisJV01JX0RJQUdfRVZFTlRfTE9HX1NVUFBPUlRFRF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfZGlhZ19ldmVudF9sb2dfc3VwcG9ydGVkX2V2ZW50X2ZpeGVkX3BhcmFtcyAqd21pX2V2ZW50OworCisJV01BX0xPR0koIlJlY2VpdmVkIFdNSV9ESUFHX0VWRU5UX0xPR19TVVBQT1JURURfRVZFTlRJRCIpOworCisJcGFyYW1fYnVmID0gKFdNSV9ESUFHX0VWRU5UX0xPR19TVVBQT1JURURfRVZFTlRJRF9wYXJhbV90bHZzICopIGV2ZW50OworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIGxvZyBzdXBwb3J0ZWQgZXZlbnQgYnVmZmVyIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl3bWlfZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCW51bV9vZl9kaWFnX2V2ZW50c19sb2dzID0gd21pX2V2ZW50LT5udW1fb2ZfZGlhZ19ldmVudHNfbG9nczsKKwlldnRfYXJncyA9IHBhcmFtX2J1Zi0+ZGlhZ19ldmVudHNfbG9nc19saXN0OworCWlmICghZXZ0X2FyZ3MpIHsKKwkJV01BX0xPR0UoIiVzOiBFdmVudCBsaXN0IGlzIGVtcHR5LCBudW1fb2ZfZGlhZ19ldmVudHNfbG9ncz0lZCIsCisJCQkJX19mdW5jX18sIG51bV9vZl9kaWFnX2V2ZW50c19sb2dzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJV01BX0xPR0QoIiVzOiBudW1fb2ZfZGlhZ19ldmVudHNfbG9ncz0lZCIsCisJCQlfX2Z1bmNfXywgbnVtX29mX2RpYWdfZXZlbnRzX2xvZ3MpOworCisJLyogRnJlZSBhbnkgcHJldmlvdXMgYWxsb2NhdGlvbiAqLworCWlmICh3bWEtPmV2ZW50c19sb2dzX2xpc3QpCisJCWNkZl9tZW1fZnJlZSh3bWEtPmV2ZW50c19sb2dzX2xpc3QpOworCisJLyogU3RvcmUgdGhlIGV2ZW50IGxpc3QgZm9yIHJ1biB0aW1lIGVuYWJsZS9kaXNhYmxlICovCisJd21hLT5ldmVudHNfbG9nc19saXN0ID0gY2RmX21lbV9tYWxsb2MobnVtX29mX2RpYWdfZXZlbnRzX2xvZ3MgKgorCQkJc2l6ZW9mKHVpbnQzMl90KSk7CisJaWYgKCF3bWEtPmV2ZW50c19sb2dzX2xpc3QpIHsKKwkJV01BX0xPR0UoIiVzOiBldmVudCBsb2cgbGlzdCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXdtYS0+bnVtX29mX2RpYWdfZXZlbnRzX2xvZ3MgPSBudW1fb2ZfZGlhZ19ldmVudHNfbG9nczsKKworCS8qIFByZXBhcmUgdGhlIHNlbmQgYnVmZmVyICovCisJYnVmX2xlbiA9IHNpemVvZigqY21kKSArIFdNSV9UTFZfSERSX1NJWkUgKworCQkobnVtX29mX2RpYWdfZXZlbnRzX2xvZ3MgKiBzaXplb2YodWludDMyX3QpKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBidWZfbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQljZGZfbWVtX2ZyZWUod21hLT5ldmVudHNfbG9nc19saXN0KTsKKwkJd21hLT5ldmVudHNfbG9nc19saXN0ID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kID0gKHdtaV9kaWFnX2V2ZW50X2xvZ19jb25maWdfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJYnVmX3B0ciA9ICh1aW50OF90ICopIGNtZDsKKworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kaWFnX2V2ZW50X2xvZ19jb25maWdfZml4ZWRfcGFyYW0sCisJCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oCisJCQkJd21pX2RpYWdfZXZlbnRfbG9nX2NvbmZpZ19maXhlZF9wYXJhbSkpOworCisJY21kLT5udW1fb2ZfZGlhZ19ldmVudHNfbG9ncyA9IG51bV9vZl9kaWFnX2V2ZW50c19sb2dzOworCisJYnVmX3B0ciArPSBzaXplb2Yod21pX2RpYWdfZXZlbnRfbG9nX2NvbmZpZ19maXhlZF9wYXJhbSk7CisKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwKKwkJCShudW1fb2ZfZGlhZ19ldmVudHNfbG9ncyAqIHNpemVvZih1aW50MzJfdCkpKTsKKworCWNtZF9hcmdzID0gKHVpbnQzMl90ICopIChidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisKKwkvKiBQb3B1bGF0ZSB0aGUgZXZlbnRzICovCisJZm9yIChpID0gMDsgaSA8IG51bV9vZl9kaWFnX2V2ZW50c19sb2dzOyBpKyspIHsKKwkJLyogTG93IGZyZXEgKDApIC0gRW5hYmxlICgxKSB0aGUgZXZlbnQKKwkJICogSGlnaCBmcmVxICgxKSAtIERpc2FibGUgKDApIHRoZSBldmVudAorCQkgKi8KKwkJV01JX0RJQUdfSURfRU5BQkxFRF9ESVNBQkxFRF9TRVQoY21kX2FyZ3NbaV0sCisJCQkJIShXTUlfRElBR19GUkVRVUVOQ1lfR0VUKGV2dF9hcmdzW2ldKSkpOworCQkvKiBTZXQgdGhlIGV2ZW50IElEICovCisJCVdNSV9ESUFHX0lEX1NFVChjbWRfYXJnc1tpXSwKKwkJCQlXTUlfRElBR19JRF9HRVQoZXZ0X2FyZ3NbaV0pKTsKKwkJLyogU2V0IHRoZSB0eXBlICovCisJCVdNSV9ESUFHX1RZUEVfU0VUKGNtZF9hcmdzW2ldLAorCQkJCVdNSV9ESUFHX1RZUEVfR0VUKGV2dF9hcmdzW2ldKSk7CisJCS8qIFN0b3JpbmcgdGhlIGV2ZW50L2xvZyBsaXN0IGluIFdNQSAqLworCQl3bWEtPmV2ZW50c19sb2dzX2xpc3RbaV0gPSBldnRfYXJnc1tpXTsKKwl9CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGJ1Zl9sZW4sCisJCQkJV01JX0RJQUdfRVZFTlRfTE9HX0NPTkZJR19DTURJRCkpIHsKKwkJV01BX0xPR0UoIiVzOiBXTUlfRElBR19FVkVOVF9MT0dfQ09ORklHX0NNRElEIGZhaWxlZCIsCisJCQkJX19mdW5jX18pOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJLyogTm90IGNsZWFyaW5nIGV2ZW50c19sb2dzX2xpc3QsIHRob3VnaCB3bWkgY21kIGZhaWxlZC4KKwkJICogSG9zdCBjYW4gc3RpbGwgaGF2ZSB0aGlzIGxpc3QKKwkJICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9mbHVzaF9jb21wbGV0ZV9ldnRfaGFuZGxlcigpIC0gRlcgbG9nIGZsdXNoIGNvbXBsZXRlIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IFdNSSBoYW5kbGUKKyAqIEBldmVudDogIEV2ZW50IHJlY2V2aWVkIGZyb20gRlcKKyAqIEBsZW46ICAgIExlbmd0aCBvZiB0aGUgZXZlbnQKKyAqCisgKi8KK3N0YXRpYyBpbnQgd21hX2ZsdXNoX2NvbXBsZXRlX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJdV9pbnQ4X3QgKmV2ZW50LAorCQl1X2ludDMyX3QgbGVuKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKworCVdNSV9ERUJVR19NRVNHX0ZMVVNIX0NPTVBMRVRFX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9kZWJ1Z19tZXNnX2ZsdXNoX2NvbXBsZXRlX2ZpeGVkX3BhcmFtICp3bWlfZXZlbnQ7CisJdWludDMyX3QgcmVhc29uX2NvZGU7CisKKwlwYXJhbV9idWYgPSAoV01JX0RFQlVHX01FU0dfRkxVU0hfQ09NUExFVEVfRVZFTlRJRF9wYXJhbV90bHZzICopIGV2ZW50OworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIGxvZyBmbHVzaCBjb21wbGV0ZSBldmVudCBidWZmZXIiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXdtaV9ldmVudCA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJcmVhc29uX2NvZGUgPSB3bWlfZXZlbnQtPnJlc2VydmVkMDsKKworCS8qCisJICogcmVhc29uX2NvZGUgPSAwOyBGbHVzaCBldmVudCBpbiByZXNwb25zZSB0byBmbHVzaCBjb21tYW5kCisJICogcmVhc29uX2NvZGUgPSBvdGhlciB2YWx1ZTsgQXN5bmNocm9ub3VzIGZsdXNoIGV2ZW50IGZvciBmYXRhbCBldmVudHMKKwkgKi8KKwlpZiAoIXJlYXNvbl9jb2RlICYmIChjZHNfaXNfbG9nX3JlcG9ydF9pbl9wcm9ncmVzcygpID09IGZhbHNlKSkgeworCQlXTUFfTE9HRSgiUmVjZWl2ZWQgV01JIGZsdXNoIGV2ZW50IHdpdGhvdXQgc2VuZGluZyBDTUQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICghcmVhc29uX2NvZGUgJiYgY2RzX2lzX2xvZ19yZXBvcnRfaW5fcHJvZ3Jlc3MoKSA9PSB0cnVlKSB7CisJCS8qIEZsdXNoIGV2ZW50IGluIHJlc3BvbnNlIHRvIGZsdXNoIGNvbW1hbmQgKi8KKwkJV01BX0xPR0koIlJlY2VpdmVkIFdNSSBmbHVzaCBldmVudCBpbiByZXNwb25zZSB0byBmbHVzaCBDTUQiKTsKKwkJc3RhdHVzID0gY2RmX21jX3RpbWVyX3N0b3AoJndtYS0+bG9nX2NvbXBsZXRpb25fdGltZXIpOworCQlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc3RvcCB0aGUgbG9nIGNvbXBsZXRpb24gdGltZW91dCIpOworCQljZHNfbG9nZ2luZ19zZXRfZndfZmx1c2hfY29tcGxldGUoKTsKKwl9IGVsc2UgaWYgKHJlYXNvbl9jb2RlICYmIGNkc19pc19sb2dfcmVwb3J0X2luX3Byb2dyZXNzKCkgPT0gZmFsc2UpIHsKKwkJLyogQXN5bmNocm9ub3VzIGZsdXNoIGV2ZW50IGZvciBmYXRhbCBldmVudHMgKi8KKwkJV01BX0xPR0UoIlJlY2VpdmVkIGFzeW5jaHJvbm91cyBXTUkgZmx1c2ggZXZlbnQ6IHJlYXNvbj0lZCIsCisJCQkJcmVhc29uX2NvZGUpOworCQlzdGF0dXMgPSBjZHNfc2V0X2xvZ19jb21wbGV0aW9uKFdMQU5fTE9HX1RZUEVfRkFUQUwsCisJCQkJV0xBTl9MT0dfSU5ESUNBVE9SX0ZJUk1XQVJFLAorCQkJCXJlYXNvbl9jb2RlKTsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNldCBsb2cgdHJpZ2dlciBwYXJhbXMiLAorCQkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCX0KKwkJY2RzX2xvZ2dpbmdfc2V0X2Z3X2ZsdXNoX2NvbXBsZXRlKCk7CisJCXJldHVybiBzdGF0dXM7CisJfSBlbHNlIHsKKwkJLyogQXN5bmNocm9ub3VzIGZsdXNoIGV2ZW50IGZvciBmYXRhbCBldmVudCwKKwkJICogYnV0LCByZXBvcnQgaW4gcHJvZ3Jlc3MgYWxyZWFkeQorCQkgKi8KKwkJV01BX0xPR0koIiVzOiBCdWcgcmVwb3J0IGFscmVhZHkgaW4gcHJvZ3Jlc3MgLSBkcm9wcGluZyEgdHlwZTolZCwgaW5kaWNhdG9yPSVkIHJlYXNvbl9jb2RlPSVkIiwKKwkJCQlfX2Z1bmNfXywgV0xBTl9MT0dfVFlQRV9GQVRBTCwKKwkJCQlXTEFOX0xPR19JTkRJQ0FUT1JfRklSTVdBUkUsIHJlYXNvbl9jb2RlKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfc29jX3NldF9od19tb2RlX3Jlc3BfZXZ0X2hhbmRsZXIoKSAtIFNldCBIVyBtb2RlIHJlc3AgZXZ0IGhhbmRsZXIKKyAqIEBoYW5kbGU6IFdNSSBoYW5kbGUKKyAqIEBldmVudDogIEV2ZW50IHJlY2V2aWVkIGZyb20gRlcKKyAqIEBsZW46ICAgIExlbmd0aCBvZiB0aGUgZXZlbnQKKyAqCisgKiBFdmVudCBoYW5kbGVyIGZvciBXTUlfU09DX1NFVF9IV19NT0RFX1JFU1BfRVZFTlRJRCB0aGF0IGlzIHNlbnQgdG8gaG9zdAorICogZHJpdmVyIGluIHJlc3BvbnNlIHRvIGEgV01JX1NPQ19TRVRfSFdfTU9ERV9DTURJRCBiZWluZyBzZW50IHRvIFdMQU4gZmlybXdhcmUKKyAqCisgKiBSZXR1cm46IFN1Y2Nlc3Mgb24gcmVjZWl2aW5nIHZhbGlkIHBhcmFtcyBmcm9tIEZXCisgKi8KK3N0YXRpYyBpbnQgd21hX3NvY19zZXRfaHdfbW9kZV9yZXNwX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJdWludDhfdCAqZXZlbnQsCisJCXVpbnQzMl90IGxlbikKK3sKKwlXTUlfU09DX1NFVF9IV19NT0RFX1JFU1BfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX3NvY19zZXRfaHdfbW9kZV9yZXNwb25zZV9ldmVudF9maXhlZF9wYXJhbSAqd21pX2V2ZW50OworCXdtaV9zb2Nfc2V0X2h3X21vZGVfcmVzcG9uc2VfdmRldl9tYWNfZW50cnkgKnZkZXZfbWFjX2VudHJ5OworCXVpbnQzMl90IGk7CisJc3RydWN0IHNpcl9zZXRfaHdfbW9kZV9yZXNwICpod19tb2RlX3Jlc3A7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCS8qIFNpbmNlIFdNQSBoYW5kbGUgaXRzZWxmIGlzIE5VTEwsIHdlIGNhbm5vdCBzZW5kIGZhaWwKKwkJICogcmVzcG9uc2UgYmFjayB0byBMSU0gaGVyZQorCQkgKi8KKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OVUxMX1ZBTFVFOworCX0KKworCWh3X21vZGVfcmVzcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqaHdfbW9kZV9yZXNwKSk7CisJaWYgKCFod19tb2RlX3Jlc3ApIHsKKwkJV01BX0xPR0koIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCS8qIFNpbmNlIHRoaXMgbWVtb3J5IGFsbG9jYXRpb24gaXRzZWxmIGZhaWxlZCwgd2UgY2Fubm90CisJCSAqIHNlbmQgZmFpbCByZXNwb25zZSBiYWNrIHRvIExJTSBoZXJlCisJCSAqLworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05VTExfVkFMVUU7CisJfQorCisJcGFyYW1fYnVmID0gKFdNSV9TT0NfU0VUX0hXX01PREVfUkVTUF9FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnQ7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgV01JX1NPQ19TRVRfSFdfTU9ERV9SRVNQX0VWRU5USUQgZXZlbnQiKTsKKwkJLyogTmVlZCB0byBzZW5kIHJlc3BvbnNlIGJhY2sgdG8gdXBwZXIgbGF5ZXIgdG8gZnJlZQorCQkgKiBhY3RpdmUgY29tbWFuZCBsaXN0CisJCSAqLworCQlnb3RvIGZhaWw7CisJfQorCisJd21pX2V2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlod19tb2RlX3Jlc3AtPnN0YXR1cyA9IHdtaV9ldmVudC0+c3RhdHVzOworCWh3X21vZGVfcmVzcC0+Y2ZnZF9od19tb2RlX2luZGV4ID0gd21pX2V2ZW50LT5jZmdkX2h3X21vZGVfaW5kZXg7CisJaHdfbW9kZV9yZXNwLT5udW1fdmRldl9tYWNfZW50cmllcyA9IHdtaV9ldmVudC0+bnVtX3ZkZXZfbWFjX2VudHJpZXM7CisKKwlXTUFfTE9HSSgiJXM6IHN0YXR1czolZCBjZmdkX2h3X21vZGVfaW5kZXg6JWQgbnVtX3ZkZXZfbWFjX2VudHJpZXM6JWQiLAorCQkJX19mdW5jX18sIHdtaV9ldmVudC0+c3RhdHVzLAorCQkJd21pX2V2ZW50LT5jZmdkX2h3X21vZGVfaW5kZXgsCisJCQl3bWlfZXZlbnQtPm51bV92ZGV2X21hY19lbnRyaWVzKTsKKwl2ZGV2X21hY19lbnRyeSA9CisJCXBhcmFtX2J1Zi0+d21pX3NvY19zZXRfaHdfbW9kZV9yZXNwb25zZV92ZGV2X21hY19tYXBwaW5nOworCisJLyogU3RvcmUgdGhlIHZkZXYtbWFjIG1hcCBpbiBXTUEgYW5kIHByZXBhcmUgdG8gc2VuZCB0byBQRSAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgd21pX2V2ZW50LT5udW1fdmRldl9tYWNfZW50cmllczsgaSsrKSB7CisJCXVpbnQzMl90IHZkZXZfaWQsIG1hY19pZDsKKwkJdmRldl9pZCA9IHZkZXZfbWFjX2VudHJ5W2ldLnZkZXZfaWQ7CisJCW1hY19pZCA9IHZkZXZfbWFjX2VudHJ5W2ldLm1hY19pZDsKKworCQlXTUFfTE9HSSgiJXM6IHZkZXZfaWQ6JWQgbWFjX2lkOiVkIiwKKwkJCV9fZnVuY19fLCB2ZGV2X2lkLCBtYWNfaWQpOworCisJCWh3X21vZGVfcmVzcC0+dmRldl9tYWNfbWFwW2ldLnZkZXZfaWQgPSB2ZGV2X2lkOworCQlod19tb2RlX3Jlc3AtPnZkZXZfbWFjX21hcFtpXS5tYWNfaWQgPSBtYWNfaWQ7CisJCXdtYV91cGRhdGVfaW50Zl9od19tb2RlX3BhcmFtcyh2ZGV2X2lkLCBtYWNfaWQsCisJCQkJd21pX2V2ZW50LT5jZmdkX2h3X21vZGVfaW5kZXgpOworCX0KKworCWlmIChod19tb2RlX3Jlc3AtPnN0YXR1cyA9PSBTRVRfSFdfTU9ERV9TVEFUVVNfT0spIHsKKwkJaWYgKFdNQV9ERUZBVUxUX0hXX01PREVfSU5ERVggPT0gd21hLT5uZXdfaHdfbW9kZV9pbmRleCkgeworCQkJd21hLT5uZXdfaHdfbW9kZV9pbmRleCA9IHdtaV9ldmVudC0+Y2ZnZF9od19tb2RlX2luZGV4OworCQl9IGVsc2UgeworCQkJd21hLT5vbGRfaHdfbW9kZV9pbmRleCA9IHdtYS0+bmV3X2h3X21vZGVfaW5kZXg7CisJCQl3bWEtPm5ld19od19tb2RlX2luZGV4ID0gd21pX2V2ZW50LT5jZmdkX2h3X21vZGVfaW5kZXg7CisJCX0KKwl9CisKKwlXTUFfTE9HSSgiJXM6IFVwZGF0ZWQ6IG9sZF9od19tb2RlX2luZGV4OiVkIG5ld19od19tb2RlX2luZGV4OiVkIiwKKwkJX19mdW5jX18sIHdtYS0+b2xkX2h3X21vZGVfaW5kZXgsIHdtYS0+bmV3X2h3X21vZGVfaW5kZXgpOworCisJd21hX3NlbmRfbXNnKHdtYSwgU0lSX0hBTF9TT0NfU0VUX0hXX01PREVfUkVTUCwKKwkJICAgICAodm9pZCAqKSBod19tb2RlX3Jlc3AsIDApOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworZmFpbDoKKwlXTUFfTE9HRSgiJXM6IFNlbmRpbmcgZmFpbCByZXNwb25zZSB0byBMSU0iLCBfX2Z1bmNfXyk7CisJaHdfbW9kZV9yZXNwLT5zdGF0dXMgPSBTRVRfSFdfTU9ERV9TVEFUVVNfRUNBTkNFTEVEOworCWh3X21vZGVfcmVzcC0+Y2ZnZF9od19tb2RlX2luZGV4ID0gMDsKKwlod19tb2RlX3Jlc3AtPm51bV92ZGV2X21hY19lbnRyaWVzID0gMDsKKwl3bWFfc2VuZF9tc2cod21hLCBTSVJfSEFMX1NPQ19TRVRfSFdfTU9ERV9SRVNQLAorCQkJKHZvaWQgKikgaHdfbW9kZV9yZXNwLCAwKTsKKworCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKK30KKworLyoqCisgKiB3bWFfc29jX2h3X21vZGVfdHJhbnNpdGlvbl9ldnRfaGFuZGxlcigpIC0gSFcgbW9kZSB0cmFuc2l0aW9uIGV2dCBoYW5kbGVyCisgKiBAaGFuZGxlOiBXTUkgaGFuZGxlCisgKiBAZXZlbnQ6ICBFdmVudCByZWNldmllZCBmcm9tIEZXCisgKiBAbGVuOiAgICBMZW5ndGggb2YgdGhlIGV2ZW50CisgKgorICogRXZlbnQgaGFuZGxlciBmb3IgV01JX1NPQ19IV19NT0RFX1RSQU5TSVRJT05fRVZFTlRJRCB0aGF0IGluZGljYXRlcyBhbgorICogYXN5bmNocm9ub3VzIGhhcmR3YXJlIG1vZGUgdHJhbnNpdGlvbi4gVGhpcyBldmVudCBub3RpZmllcyB0aGUgaG9zdCBkcml2ZXIKKyAqIHRoYXQgZmlybXdhcmUgaW5kZXBlbmRlbnRseSBjaGFuZ2VkIHRoZSBoYXJkd2FyZSBtb2RlIGZvciBzb21lIHJlYXNvbiwgc3VjaAorICogYXMgQ29leCwgTEZSIDMuMCwgZXRjCisgKgorICogUmV0dXJuOiBTdWNjZXNzIG9uIHJlY2VpdmluZyB2YWxpZCBwYXJhbXMgZnJvbSBGVworICovCitzdGF0aWMgaW50IHdtYV9zb2NfaHdfbW9kZV90cmFuc2l0aW9uX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJdWludDhfdCAqZXZlbnQsCisJCXVpbnQzMl90IGxlbikKK3sKKwl1aW50MzJfdCBpOworCVdNSV9TT0NfSFdfTU9ERV9UUkFOU0lUSU9OX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9zb2NfaHdfbW9kZV90cmFuc2l0aW9uX2V2ZW50X2ZpeGVkX3BhcmFtICp3bWlfZXZlbnQ7CisJd21pX3NvY19zZXRfaHdfbW9kZV9yZXNwb25zZV92ZGV2X21hY19lbnRyeSAqdmRldl9tYWNfZW50cnk7CisJc3RydWN0IHNpcl9od19tb2RlX3RyYW5zX2luZCAqaHdfbW9kZV90cmFuc19pbmQ7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCisJaWYgKCF3bWEpIHsKKwkJLyogVGhpcyBpcyBhbiBhc3luYyBldmVudC4gU28sIG5vdCBzZW5kaW5nIGFueSBldmVudCB0byBMSU0gKi8KKwkJV01BX0xPR0UoIkludmFsaWQgV01BIGhhbmRsZSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05VTExfVkFMVUU7CisJfQorCisJcGFyYW1fYnVmID0gKFdNSV9TT0NfSFdfTU9ERV9UUkFOU0lUSU9OX0VWRU5USURfcGFyYW1fdGx2cyAqKSBldmVudDsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQkvKiBUaGlzIGlzIGFuIGFzeW5jIGV2ZW50LiBTbywgbm90IHNlbmRpbmcgYW55IGV2ZW50IHRvIExJTSAqLworCQlXTUFfTE9HRSgiSW52YWxpZCBXTUlfU09DX0hXX01PREVfVFJBTlNJVElPTl9FVkVOVElEIGV2ZW50Iik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlod19tb2RlX3RyYW5zX2luZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqaHdfbW9kZV90cmFuc19pbmQpKTsKKwlpZiAoIWh3X21vZGVfdHJhbnNfaW5kKSB7CisJCVdNQV9MT0dJKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05VTExfVkFMVUU7CisJfQorCisJd21pX2V2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlod19tb2RlX3RyYW5zX2luZC0+b2xkX2h3X21vZGVfaW5kZXggPSB3bWlfZXZlbnQtPm9sZF9od19tb2RlX2luZGV4OworCWh3X21vZGVfdHJhbnNfaW5kLT5uZXdfaHdfbW9kZV9pbmRleCA9IHdtaV9ldmVudC0+bmV3X2h3X21vZGVfaW5kZXg7CisJaHdfbW9kZV90cmFuc19pbmQtPm51bV92ZGV2X21hY19lbnRyaWVzID0KKwkJCQkJCXdtaV9ldmVudC0+bnVtX3ZkZXZfbWFjX2VudHJpZXM7CisJV01BX0xPR0koIiVzOiBvbGRfaHdfbW9kZV9pbmRleDolZCBuZXdfaHdfbW9kZV9pbmRleDolZCBlbnRyaWVzPSVkIiwKKwkJX19mdW5jX18sIHdtaV9ldmVudC0+b2xkX2h3X21vZGVfaW5kZXgsCisJCXdtaV9ldmVudC0+bmV3X2h3X21vZGVfaW5kZXgsIHdtaV9ldmVudC0+bnVtX3ZkZXZfbWFjX2VudHJpZXMpOworCisJdmRldl9tYWNfZW50cnkgPQorCQlwYXJhbV9idWYtPndtaV9zb2Nfc2V0X2h3X21vZGVfcmVzcG9uc2VfdmRldl9tYWNfbWFwcGluZzsKKworCS8qIFN0b3JlIHRoZSB2ZGV2LW1hYyBtYXAgaW4gV01BIGFuZCBwcmVwYXJlIHRvIHNlbmQgdG8gSEREICAqLworCWZvciAoaSA9IDA7IGkgPCB3bWlfZXZlbnQtPm51bV92ZGV2X21hY19lbnRyaWVzOyBpKyspIHsKKwkJdWludDMyX3QgdmRldl9pZCwgbWFjX2lkOworCQl2ZGV2X2lkID0gdmRldl9tYWNfZW50cnlbaV0udmRldl9pZDsKKwkJbWFjX2lkID0gdmRldl9tYWNfZW50cnlbaV0ubWFjX2lkOworCisJCVdNQV9MT0dJKCIlczogdmRldl9pZDolZCBtYWNfaWQ6JWQiLAorCQkJCV9fZnVuY19fLCB2ZGV2X2lkLCBtYWNfaWQpOworCisJCWh3X21vZGVfdHJhbnNfaW5kLT52ZGV2X21hY19tYXBbaV0udmRldl9pZCA9IHZkZXZfaWQ7CisJCWh3X21vZGVfdHJhbnNfaW5kLT52ZGV2X21hY19tYXBbaV0ubWFjX2lkID0gbWFjX2lkOworCQl3bWFfdXBkYXRlX2ludGZfaHdfbW9kZV9wYXJhbXModmRldl9pZCwgbWFjX2lkLAorCQkJCXdtaV9ldmVudC0+bmV3X2h3X21vZGVfaW5kZXgpOworCX0KKwl3bWEtPm9sZF9od19tb2RlX2luZGV4ID0gd21pX2V2ZW50LT5vbGRfaHdfbW9kZV9pbmRleDsKKwl3bWEtPm5ld19od19tb2RlX2luZGV4ID0gd21pX2V2ZW50LT5uZXdfaHdfbW9kZV9pbmRleDsKKworCVdNQV9MT0dJKCIlczogVXBkYXRlZDogb2xkX2h3X21vZGVfaW5kZXg6JWQgbmV3X2h3X21vZGVfaW5kZXg6JWQiLAorCQlfX2Z1bmNfXywgd21hLT5vbGRfaHdfbW9kZV9pbmRleCwgd21hLT5uZXdfaHdfbW9kZV9pbmRleCk7CisKKwkvKiBQYXNzIHRoZSBtZXNzYWdlIHRvIFBFICovCisJd21hX3NlbmRfbXNnKHdtYSwgU0lSX0hBTF9TT0NfSFdfTU9ERV9UUkFOU19JTkQsCisJCSAgICAgKHZvaWQgKikgaHdfbW9kZV90cmFuc19pbmQsIDApOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfc29jX3NldF9kdWFsX21vZGVfY29uZmlnX3Jlc3BfZXZ0X2hhbmRsZXIoKSAtIER1YWwgbW9kZSBldnQgaGFuZGxlcgorICogQGhhbmRsZTogV01JIGhhbmRsZQorICogQGV2ZW50OiAgRXZlbnQgcmVjZWl2ZWQgZnJvbSBGVworICogQGxlbjogICAgTGVuZ3RoIG9mIHRoZSBldmVudAorICoKKyAqIE5vdGlmaWVzIHRoZSBob3N0IGRyaXZlciBvZiB0aGUgY29tcGxldGlvbiBvciBmYWlsdXJlIG9mIGEKKyAqIFdNSV9TT0NfU0VUX0RVQUxfTUFDX0NPTkZJR19DTURJRCBjb21tYW5kLiBUaGlzIGV2ZW50IHdvdWxkIGJlIHJldHVybmVkIHRvCisgKiB0aGUgaG9zdCBkcml2ZXIgb25jZSB0aGUgZmlybXdhcmUgaGFzIGNvbXBsZXRlZCBhIHJlY29uZmlndXJhdGlvbiBvZiB0aGUgU2NhbgorICogYW5kIEZXIG1vZGUgY29uZmlndXJhdGlvbi4gVGhpcyBjaGFuZ2VzIGNvdWxkIGluY2x1ZGUgZW50ZXJpbmcgb3IgbGVhdmluZyBhCisgKiBkdWFsIG1hYyBjb25maWd1cmF0aW9uIGZvciBlaXRoZXIgc2NhbiBhbmQvb3IgbW9yZSBwZXJtYW5lbnQgZmlybXdhcmUgbW9kZS4KKyAqCisgKiBSZXR1cm46IFN1Y2Nlc3Mgb24gcmVjZWl2aW5nIHZhbGlkIHBhcmFtcyBmcm9tIEZXCisgKi8KK3N0YXRpYyBpbnQgd21hX3NvY19zZXRfZHVhbF9tb2RlX2NvbmZpZ19yZXNwX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJdWludDhfdCAqZXZlbnQsCisJCXVpbnQzMl90IGxlbikKK3sKKwlXTUlfU09DX1NFVF9EVUFMX01BQ19DT05GSUdfUkVTUF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfc29jX3NldF9kdWFsX21hY19jb25maWdfcmVzcG9uc2VfZXZlbnRfZml4ZWRfcGFyYW0gKndtaV9ldmVudDsKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJc3RydWN0IHNpcl9kdWFsX21hY19jb25maWdfcmVzcCAqZHVhbF9tYWNfY2ZnX3Jlc3A7CisKKwlpZiAoIXdtYSkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgV01BIGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJLyogU2luY2UgdGhlIFdNQSBoYW5kbGUgaXMgTlVMTCwgd2UgY2Fubm90IHNlbmQgcmVzcCB0byBMSU0uCisJCSAqIFNvLCByZXR1cm5pbmcgZnJvbSBoZXJlLgorCQkgKi8KKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OVUxMX1ZBTFVFOworCX0KKworCWR1YWxfbWFjX2NmZ19yZXNwID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpkdWFsX21hY19jZmdfcmVzcCkpOworCWlmICghZHVhbF9tYWNfY2ZnX3Jlc3ApIHsKKwkJV01BX0xPR0UoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCS8qIFNpbmNlIHRoZSBtZW0gYWxsb2MgZmFpbGVkLCB3ZSBjYW5ub3Qgc2VuZCByZXNwIHRvIExJTS4KKwkJICogU28sIHJldHVybmluZyBmcm9tIGhlcmUuCisJCSAqLworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05VTExfVkFMVUU7CisJfQorCisJcGFyYW1fYnVmID0gKFdNSV9TT0NfU0VUX0RVQUxfTUFDX0NPTkZJR19SRVNQX0VWRU5USURfcGFyYW1fdGx2cyAqKQorCQlldmVudDsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgZXZlbnQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwl3bWlfZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCVdNQV9MT0dJKCIlczogc3RhdHVzOiVkIiwgX19mdW5jX18sIHdtaV9ldmVudC0+c3RhdHVzKTsKKwlkdWFsX21hY19jZmdfcmVzcC0+c3RhdHVzID0gd21pX2V2ZW50LT5zdGF0dXM7CisKKwlpZiAoU0VUX0hXX01PREVfU1RBVFVTX09LID09IGR1YWxfbWFjX2NmZ19yZXNwLT5zdGF0dXMpIHsKKwkJd21hLT5kdWFsX21hY19jZmcucHJldl9zY2FuX2NvbmZpZyA9CisJCQl3bWEtPmR1YWxfbWFjX2NmZy5jdXJfc2Nhbl9jb25maWc7CisJCXdtYS0+ZHVhbF9tYWNfY2ZnLnByZXZfZndfbW9kZV9jb25maWcgPQorCQkJd21hLT5kdWFsX21hY19jZmcuY3VyX2Z3X21vZGVfY29uZmlnOworCQl3bWEtPmR1YWxfbWFjX2NmZy5jdXJfc2Nhbl9jb25maWcgPQorCQkJd21hLT5kdWFsX21hY19jZmcucmVxX3NjYW5fY29uZmlnOworCQl3bWEtPmR1YWxfbWFjX2NmZy5jdXJfZndfbW9kZV9jb25maWcgPQorCQkJd21hLT5kdWFsX21hY19jZmcucmVxX2Z3X21vZGVfY29uZmlnOworCX0KKworCS8qIFBhc3MgdGhlIG1lc3NhZ2UgdG8gUEUgKi8KKwl3bWFfc2VuZF9tc2cod21hLCBTSVJfSEFMX1NPQ19EVUFMX01BQ19DRkdfUkVTUCwKKwkJCSh2b2lkICopIGR1YWxfbWFjX2NmZ19yZXNwLCAwKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKK2ZhaWw6CisJV01BX0xPR0UoIiVzOiBTZW5kaW5nIGZhaWwgcmVzcG9uc2UgdG8gTElNIiwgX19mdW5jX18pOworCWR1YWxfbWFjX2NmZ19yZXNwLT5zdGF0dXMgPSBTRVRfSFdfTU9ERV9TVEFUVVNfRUNBTkNFTEVEOworCXdtYV9zZW5kX21zZyh3bWEsIFNJUl9IQUxfU09DX0RVQUxfTUFDX0NGR19SRVNQLAorCQkJKHZvaWQgKikgZHVhbF9tYWNfY2ZnX3Jlc3AsIDApOworCisJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCit9CisKKy8qKgorICogd21hX3N0YXJ0KCkgLSB3bWEgc3RhcnQgZnVuY3Rpb24uCisgKiAgICAgICAgICAgICAgIEludGlhbGl6ZSBldmVudCBoYW5kbGVycyBhbmQgdGltZXJzLgorICogQGNkc19jdHg6IGNkcyBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIENERiBFcnJvciBvbiBmYWlsdXJlCisgKi8KK0NERl9TVEFUVVMgd21hX3N0YXJ0KHZvaWQgKmNkc19jdHgpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZTsKKwlpbnQgc3RhdHVzOworCVdNQV9MT0dEKCIlczogRW50ZXIiLCBfX2Z1bmNfXyk7CisKKwl3bWFfaGFuZGxlID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKworCS8qIHZhbGlkYXRlIHRoZSB3bWFfaGFuZGxlICovCisJaWYgKE5VTEwgPT0gd21hX2hhbmRsZSkgeworCQlXTUFfTE9HUCgiJXM6IEludmFsaWQgaGFuZGxlIiwgX19mdW5jX18pOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCQkgICAgV01JX1NDQU5fRVZFTlRJRCwKKwkJCQkJCSAgICB3bWFfc2Nhbl9ldmVudF9jYWxsYmFjayk7CisJaWYgKDAgIT0gc3RhdHVzKSB7CisJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIHNjYW4gY2FsbGJhY2siLCBfX2Z1bmNfXyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlbmQ7CisJfQorCisJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkJICAgIFdNSV9ST0FNX0VWRU5USUQsCisJCQkJCQkgICAgd21hX3JvYW1fZXZlbnRfY2FsbGJhY2spOworCWlmICgwICE9IHN0YXR1cykgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBSb2FtIGNhbGxiYWNrIiwgX19mdW5jX18pOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZW5kOworCX0KKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgICBXTUlfV09XX1dBS0VVUF9IT1NUX0VWRU5USUQsCisJCQkJCQkgICAgd21hX3dvd193YWtldXBfaG9zdF9ldmVudCk7CisJaWYgKHN0YXR1cykgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byByZWdpc3RlciB3b3cgd2FrZXVwIGhvc3QgZXZlbnQgaGFuZGxlciIsCisJCQkgX19mdW5jX18pOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZW5kOworCX0KKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQlXTUlfUERFVl9SRVNVTUVfRVZFTlRJRCwKKwkJCQl3bWFfcGRldl9yZXN1bWVfZXZlbnRfaGFuZGxlcik7CisJaWYgKHN0YXR1cykgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBQREVWIHJlc3VtZSBldmVudCBoYW5kbGVyIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlbmQ7CisJfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisJaWYgKFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod21hX2hhbmRsZS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCSAgIFdNSV9TRVJWSUNFX05MTykpIHsKKworCQlXTUFfTE9HRCgiRlcgc3VwcG9ydHMgcG5vIG9mZmxvYWQsIHJlZ2lzdGVyaW5nIG5sbyBtYXRjaCBoYW5kbGVyIik7CisKKwkJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkJCSAgIFdNSV9OTE9fTUFUQ0hfRVZFTlRJRCwKKwkJCQkJCQkgICB3bWFfbmxvX21hdGNoX2V2dF9oYW5kbGVyKTsKKwkJaWYgKHN0YXR1cykgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byByZWdpc3RlciBubG8gbWF0Y2ggZXZlbnQgY2IiKTsKKwkJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWdvdG8gZW5kOworCQl9CisKKwkJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkJCSAgIFdNSV9OTE9fU0NBTl9DT01QTEVURV9FVkVOVElELAorCQkJCQkJCSAgIHdtYV9ubG9fc2Nhbl9jbXBfZXZ0X2hhbmRsZXIpOworCQlpZiAoc3RhdHVzKSB7CisJCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHJlZ2lzdGVyIG5sbyBzY2FuIGNvbXAgZXZlbnQgY2IiKTsKKwkJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCisjaWYgZGVmaW5lZChRQ0FfTExfTEVHQUNZX1RYX0ZMT1dfQ09OVFJPTCkgfHwgZGVmaW5lZChRQ0FfTExfVFhfRkxPV19DT05UUk9MX1YyKQorCVdNQV9MT0dFKCJNQ0MgVFggUGF1c2UgRXZlbnQgSGFuZGxlciByZWdpc3RlciIpOworCXN0YXR1cyA9IHdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgICBXTUlfVFhfUEFVU0VfRVZFTlRJRCwKKwkJCQkJCSAgICB3bWFfbWNjX3ZkZXZfdHhfcGF1c2VfZXZ0X2hhbmRsZXIpOworI2VuZGlmIC8qIFFDQV9MTF9MRUdBQ1lfVFhfRkxPV19DT05UUk9MICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQKKwlXTUFfTE9HRCgiUmVnaXN0ZXJpbmcgY2hhbm5lbCB0byBhdm9pZCBoYW5kbGVyIik7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCQkgICAgV01JX1dMQU5fRlJFUV9BVk9JRF9FVkVOVElELAorCQkJCQkJICAgIHdtYV9jaGFubmVsX2F2b2lkX2V2dF9oYW5kbGVyKTsKKwlpZiAoc3RhdHVzKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgY2hhbm5lbCB0byBhdm9pZCBldmVudCBjYiIpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZW5kOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0hfQVZPSUQgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQVVUT19TSFVURE9XTgorCVdNQV9MT0dEKCJSZWdpc3RlcmluZyBhdXRvIHNodXRkb3duIGhhbmRsZXIiKTsKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCQkgICAgV01JX0hPU1RfQVVUT19TSFVURE9XTl9FVkVOVElELAorCQkJCQkJICAgIHdtYV9hdXRvX3NodXRkb3duX2V2ZW50X2hhbmRsZXIpOworCWlmIChzdGF0dXMpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byByZWdpc3RlciBXTUkgQXV0byBzaHV0ZG93biBldmVudCBoYW5kbGVyIik7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlbmQ7CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOICovCisJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkJICAgIFdNSV9USEVSTUFMX01HTVRfRVZFTlRJRCwKKwkJCQkJCSAgICB3bWFfdGhlcm1hbF9tZ210X2V2dF9oYW5kbGVyKTsKKwlpZiAoc3RhdHVzKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgdGhlcm1hbCBtaXRpZ2F0aW9uIGV2ZW50IGNiIik7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlbmQ7CisJfQorCisJc3RhdHVzID0gd21hX29jYl9yZWdpc3Rlcl9ldmVudF9oYW5kbGVycyh3bWFfaGFuZGxlKTsKKwlpZiAoc3RhdHVzKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgb2NiIGV2ZW50IGhhbmRsZXJzIik7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlbmQ7CisJfQorCisJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworI2lmZGVmIFFDQV9XSUZJX0ZUTQorCS8qCisJICogVHggbWdtdCBhdHRhY2ggcmVxdWlyZXMgVFhSWCBjb250ZXh0IHdoaWNoIGlzIG5vdCBjcmVhdGVkCisJICogaW4gRlRNIG1vZGUuIFNvIHNraXAgdGhlIFRYIG1nbXQgYXR0YWNoLgorCSAqLworCWlmIChjZHNfZ2V0X2NvbnBhcmFtKCkgPT0gQ0RGX0ZUTV9NT0RFKQorCQlnb3RvIGVuZDsKKyNlbmRpZiAvKiBRQ0FfV0lGSV9GVE0gKi8KKworCWNkZl9zdGF0dXMgPSB3bWFfdHhfYXR0YWNoKHdtYV9oYW5kbGUpOworCWlmIChjZGZfc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byByZWdpc3RlciB0eCBtYW5hZ2VtZW50IiwgX19mdW5jX18pOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBJbml0aWFsaXplIGxvZyBjb21wbGV0aW9uIHRpbWVvdXQgKi8KKwljZGZfc3RhdHVzID0gY2RmX21jX3RpbWVyX2luaXQoJndtYV9oYW5kbGUtPmxvZ19jb21wbGV0aW9uX3RpbWVyLAorCQkJQ0RGX1RJTUVSX1RZUEVfU1csCisJCQl3bWFfbG9nX2NvbXBsZXRpb25fdGltZW91dCwKKwkJCXdtYV9oYW5kbGUpOworCWlmIChjZGZfc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgbG9nIGNvbXBsZXRpb24gdGltZW91dCIpOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBnZXQgdGVtcGVyYXR1cmUgZXZlbnQgaGFuZGxlciAqLworCXN0YXR1cyA9IHdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgICBXTUlfUERFVl9URU1QRVJBVFVSRV9FVkVOVElELAorCQkJCQkJICAgIHdtYV9wZGV2X3RlbXBlcmF0dXJlX2V2dF9oYW5kbGVyKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHJlZ2lzdGVyIGdldF90ZW1wZXJhdHVyZSBldmVudCBjYiIpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZW5kOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGxvZyBmbHVzaCBjb21wbGV0ZSBldmVudCBoYW5kbGVyICovCisJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJV01JX0RFQlVHX01FU0dfRkxVU0hfQ09NUExFVEVfRVZFTlRJRCwKKwkJCXdtYV9mbHVzaF9jb21wbGV0ZV9ldnRfaGFuZGxlcik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byByZWdpc3RlciBsb2cgZmx1c2ggY29tcGxldGUgZXZlbnQgY2IiKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBXTUlfU09DX1NFVF9IV19NT0RFX1JFU1BfRVZFTlRJRCBldmVudCBoYW5kbGVyICovCisJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJV01JX1NPQ19TRVRfSFdfTU9ERV9SRVNQX0VWRU5USUQsCisJCQl3bWFfc29jX3NldF9od19tb2RlX3Jlc3BfZXZ0X2hhbmRsZXIpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgc2V0IGh3IG1vZGUgcmVzcCBldmVudCBjYiIpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZW5kOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIFdNSV9TT0NfSFdfTU9ERV9UUkFOU0lUSU9OX0VWRU5USUQgZXZlbnQgaGFuZGxlciAqLworCXN0YXR1cyA9IHdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCVdNSV9TT0NfSFdfTU9ERV9UUkFOU0lUSU9OX0VWRU5USUQsCisJCQl3bWFfc29jX2h3X21vZGVfdHJhbnNpdGlvbl9ldnRfaGFuZGxlcik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byByZWdpc3RlciBodyBtb2RlIHRyYW5zaXRpb24gZXZlbnQgY2IiKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBzZXQgZHVhbCBtYWMgY29uZmlndXJhdGlvbiBldmVudCBoYW5kbGVyICovCisJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJV01JX1NPQ19TRVRfRFVBTF9NQUNfQ09ORklHX1JFU1BfRVZFTlRJRCwKKwkJCXdtYV9zb2Nfc2V0X2R1YWxfbW9kZV9jb25maWdfcmVzcF9ldnRfaGFuZGxlcik7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byByZWdpc3RlciBodyBtb2RlIHRyYW5zaXRpb24gZXZlbnQgY2IiKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIGVuZDsKKwl9CisKKwljZGZfc3RhdHVzID0gY2RmX2V2ZW50X2luaXQoJndtYV9oYW5kbGUtPnNlcnZpY2VfcmVhZHlfZXh0X2V2dCk7CisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfc3RhdHVzKSB7CisJCVdNQV9MT0dFKCJVbmFibGUgdG8gaW5pdCBzZXJ2aWNlX3JlYWR5X2V4dF9ldnQiKTsKKwkJZ290byBlbmQ7CisJfQorCitlbmQ6CisJV01BX0xPR0QoIiVzOiBFeGl0IiwgX19mdW5jX18pOworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9zdG9wKCkgLSB3bWEgc3RvcCBmdW5jdGlvbi4KKyAqICAgICAgICAgICAgICBjbGVhbnVwIHRpbWVycyBhbmQgc3VzcGVuZCB0YXJnZXQuCisgKiBAY2RzX2N0eDogY2RzIGNvbnRleHQKKyAqIEByZWFzb246IHJlYXNvbiBmb3Igd21hX3N0b3AuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIENERiBFcnJvciBvbiBmYWlsdXJlCisgKi8KK0NERl9TVEFUVVMgd21hX3N0b3Aodm9pZCAqY2RzX2N0eCwgdWludDhfdCByZWFzb24pCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCXdtYV9oYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCisJV01BX0xPR0QoIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKworCS8qIHZhbGlkYXRlIHRoZSB3bWFfaGFuZGxlICovCisJaWYgKE5VTEwgPT0gd21hX2hhbmRsZSkgeworCQlXTUFfTE9HUCgiJXM6IEludmFsaWQgaGFuZGxlIiwgX19mdW5jX18pOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQlnb3RvIGVuZDsKKwl9CisjaWZkZWYgUUNBX1dJRklfRlRNCisJLyoKKwkgKiBUeCBtZ210IGRldGFjaCByZXF1aXJlcyBUWFJYIGNvbnRleHQgd2hpY2ggaXMgbm90IGNyZWF0ZWQKKwkgKiBpbiBGVE0gbW9kZS4gU28gc2tpcCB0aGUgVFggbWdtdCBkZXRhY2guCisJICovCisJaWYgKGNkc19nZXRfY29ucGFyYW0oKSA9PSBDREZfRlRNX01PREUpIHsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJZ290byBlbmQ7CisJfQorI2VuZGlmIC8qIFFDQV9XSUZJX0ZUTSAqLworCisJaWYgKHdtYV9oYW5kbGUtPmFja193b3JrX2N0eCkgeworCQljZHNfZmx1c2hfd29yaygmd21hX2hhbmRsZS0+YWNrX3dvcmtfY3R4LT5hY2tfY21wX3dvcmspOworCQljZGZfbWVtX2ZyZWUod21hX2hhbmRsZS0+YWNrX3dvcmtfY3R4KTsKKwkJd21hX2hhbmRsZS0+YWNrX3dvcmtfY3R4ID0gTlVMTDsKKwl9CisKKwkvKiBEZXN0cm95IHRoZSB0aW1lciBmb3IgbG9nIGNvbXBsZXRpb24gKi8KKwljZGZfc3RhdHVzID0gY2RmX21jX3RpbWVyX2Rlc3Ryb3koJndtYV9oYW5kbGUtPmxvZ19jb21wbGV0aW9uX3RpbWVyKTsKKwlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBkZXN0cm95IHRoZSBsb2cgY29tcGxldGlvbiB0aW1lciIpOworCX0KKworCS8qIFRoZXJlJ3Mgbm8gbmVlZCBzdXNwZW5kIHRhcmdldCB3aGljaCBpcyBhbHJlYWR5IGRvd24gZHVyaW5nIFNTUi4gKi8KKwlpZiAoIWNkc19pc19sb2dwX2luX3Byb2dyZXNzKCkpIHsKKyNpZmRlZiBISUZfVVNCCisJCS8qIFN1c3BlbmQgdGhlIHRhcmdldCBhbmQgZW5hYmxlIGludGVycnVwdCAqLworCQlpZiAod21hX3N1c3BlbmRfdGFyZ2V0KHdtYV9oYW5kbGUsIDApKQorCQkJV01BX0xPR0UoIkZhaWxlZCB0byBzdXNwZW5kIHRhcmdldCIpOworI2Vsc2UKKwkJLyogU3VzcGVuZCB0aGUgdGFyZ2V0IGFuZCBkaXNhYmxlIGludGVycnVwdCAqLworCQlpZiAod21hX3N1c3BlbmRfdGFyZ2V0KHdtYV9oYW5kbGUsIDEpKQorCQkJV01BX0xPR0UoIkZhaWxlZCB0byBzdXNwZW5kIHRhcmdldCIpOworI2VuZGlmIC8qIEhJRl9VU0IgKi8KKwl9CisKKwljZGZfc3RhdHVzID0gd21hX3R4X2RldGFjaCh3bWFfaGFuZGxlKTsKKwlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gZGVyZWdpc3RlciB0eCBtYW5hZ2VtZW50IiwgX19mdW5jX18pOworCQlnb3RvIGVuZDsKKwl9CisKKwljZGZfc3RhdHVzID0gY2RmX2V2ZW50X2Rlc3Ryb3koJndtYV9oYW5kbGUtPnNlcnZpY2VfcmVhZHlfZXh0X2V2dCk7CisJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gZGVzdHJveSBzZXJ2aWNlX3JlYWR5X2V4dF9ldnQiKTsKKwkJZ290byBlbmQ7CisJfQorCitlbmQ6CisJV01BX0xPR0QoIiVzOiBFeGl0IiwgX19mdW5jX18pOworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9jbGVhbnVwX2hvbGRfcmVxKCkgLSBjbGVhbnVwIGhvbGQgcmVxdWVzdCBxdWV1ZQorICogQHdtYTogd21hIGhhbmRsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfY2xlYW51cF9ob2xkX3JlcSh0cF93bWFfaGFuZGxlIHdtYSkKK3sKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKnJlcV9tc2cgPSBOVUxMOworCWNkZl9saXN0X25vZGVfdCAqbm9kZTEgPSBOVUxMLCAqbm9kZTIgPSBOVUxMOworCUNERl9TVEFUVVMgc3RhdHVzOworCisJY2RmX3NwaW5fbG9ja19iaCgmd21hLT53bWFfaG9sZF9yZXFfcV9sb2NrKTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IGNkZl9saXN0X3BlZWtfZnJvbnQoJndtYS0+d21hX2hvbGRfcmVxX3F1ZXVlLAorCQkJCQkJICAgICAgJm5vZGUyKSkgeworCQljZGZfc3Bpbl91bmxvY2tfYmgoJndtYS0+d21hX2hvbGRfcmVxX3FfbG9jayk7CisJCVdNQV9MT0dJKEZMKCJyZXF1ZXN0IHF1ZXVlIG1heWJlIGVtcHR5IikpOworCQlyZXR1cm47CisJfQorCisJZG8geworCQlub2RlMSA9IG5vZGUyOworCQlyZXFfbXNnID0gKHN0cnVjdCB3bWFfdGFyZ2V0X3JlcSAqKW5vZGUxOworCQlzdGF0dXMgPSBjZGZfbGlzdF9yZW1vdmVfbm9kZSgmd21hLT53bWFfaG9sZF9yZXFfcXVldWUsIG5vZGUxKTsKKwkJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJCWNkZl9zcGluX3VubG9ja19iaCgmd21hLT53bWFfaG9sZF9yZXFfcV9sb2NrKTsKKwkJCVdNQV9MT0dFKEZMKCJGYWlsZWQgdG8gcmVtb3ZlIHJlcXVlc3QgZm9yIHZkZXZfaWQgJWQgdHlwZSAlZCIpLAorCQkJCSByZXFfbXNnLT52ZGV2X2lkLCByZXFfbXNnLT50eXBlKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWNkZl9tY190aW1lcl9kZXN0cm95KCZyZXFfbXNnLT5ldmVudF90aW1lb3V0KTsKKwkJCWNkZl9tZW1fZnJlZShyZXFfbXNnKTsKKwkJfQorCX0gd2hpbGUgKENERl9TVEFUVVNfU1VDQ0VTUyAgPT0KKwkJCWNkZl9saXN0X3BlZWtfbmV4dCgmd21hLT53bWFfaG9sZF9yZXFfcXVldWUsIG5vZGUxLAorCQkJCQkgICAmbm9kZTIpKTsKKworCWNkZl9zcGluX3VubG9ja19iaCgmd21hLT53bWFfaG9sZF9yZXFfcV9sb2NrKTsKK30KKworLyoqCisgKiB3bWFfY2xlYW51cF92ZGV2X3Jlc3AoKSAtIGNsZWFudXAgdmRldiByZXNwb25zZSBxdWV1ZQorICogQHdtYTogd21hIGhhbmRsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfY2xlYW51cF92ZGV2X3Jlc3AodHBfd21hX2hhbmRsZSB3bWEpCit7CisJc3RydWN0IHdtYV90YXJnZXRfcmVxICptc2csICp0bXA7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZ3bWEtPnZkZXZfcmVzcHFfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgdG1wLCAmd21hLT52ZGV2X3Jlc3BfcXVldWUsIG5vZGUpIHsKKwkJbGlzdF9kZWwoJm1zZy0+bm9kZSk7CisJCWNkZl9tY190aW1lcl9kZXN0cm95KCZtc2ctPmV2ZW50X3RpbWVvdXQpOworCQljZGZfbWVtX2ZyZWUobXNnKTsKKwl9CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ3bWEtPnZkZXZfcmVzcHFfbG9jayk7Cit9CisKKy8qKgorICogd21hX3dtaV9zZXJ2aWNlX2Nsb3NlKCkgLSBjbG9zZSB3bWEgd21pIHNlcnZpY2UgaW50ZXJmYWNlLgorICogQGNkc19jdHg6IGNkcyBjb250ZXh0CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIENERiBFcnJvciBvbiBmYWlsdXJlCisgKi8KK0NERl9TVEFUVVMgd21hX3dtaV9zZXJ2aWNlX2Nsb3NlKHZvaWQgKmNkc19jdHgpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlOworCXN0cnVjdCBiZWFjb25faW5mbyAqYmNuOworCWludCBpOworCisJV01BX0xPR0QoIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKworCXdtYV9oYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCisJLyogdmFsaWRhdGUgdGhlIHdtYV9oYW5kbGUgKi8KKwlpZiAoTlVMTCA9PSB3bWFfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCB3bWEgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCS8qIHZhbGlkYXRlIHRoZSB3bWkgaGFuZGxlICovCisJaWYgKE5VTEwgPT0gd21hX2hhbmRsZS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgd21pIGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwkvKiBkZXR0YWNoIHRoZSB3bWkgc2VyaWNlICovCisJV01BX0xPR0QoImNhbGxpbmcgd21pX3VuaWZpZWRfZGV0YWNoIik7CisJd21pX3VuaWZpZWRfZGV0YWNoKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUpOworCXdtYV9oYW5kbGUtPndtaV9oYW5kbGUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHdtYV9oYW5kbGUtPm1heF9ic3NpZDsgaSsrKSB7CisJCWJjbiA9IHdtYV9oYW5kbGUtPmludGVyZmFjZXNbaV0uYmVhY29uOworCisJCWlmIChiY24pIHsKKwkJCWlmIChiY24tPmRtYV9tYXBwZWQpCisJCQkJY2RmX25idWZfdW5tYXBfc2luZ2xlKHdtYV9oYW5kbGUtPmNkZl9kZXYsCisJCQkJCWJjbi0+YnVmLCBDREZfRE1BX1RPX0RFVklDRSk7CisJCQljZGZfbmJ1Zl9mcmVlKGJjbi0+YnVmKTsKKwkJCWNkZl9tZW1fZnJlZShiY24pOworCQkJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tpXS5iZWFjb24gPSBOVUxMOworCQl9CisKKwkJaWYgKHdtYV9oYW5kbGUtPmludGVyZmFjZXNbaV0uaGFuZGxlKSB7CisJCQljZGZfbWVtX2ZyZWUod21hX2hhbmRsZS0+aW50ZXJmYWNlc1tpXS5oYW5kbGUpOworCQkJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tpXS5oYW5kbGUgPSBOVUxMOworCQl9CisJfQorCisJY2RmX21lbV9mcmVlKHdtYV9oYW5kbGUtPmludGVyZmFjZXMpOworCS8qIGZyZWUgdGhlIHdtYV9oYW5kbGUgKi8KKwljZHNfZnJlZV9jb250ZXh0KHdtYV9oYW5kbGUtPmNkc19jb250ZXh0LCBDREZfTU9EVUxFX0lEX1dNQSwKKwkJCSB3bWFfaGFuZGxlKTsKKworCWNkZl9tZW1fZnJlZSgoKHBfY2RzX2NvbnRleHRUeXBlKSBjZHNfY3R4KS0+Y2ZnX2N0eCk7CisJV01BX0xPR0QoIiVzOiBFeGl0IiwgX19mdW5jX18pOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworCisvKioKKyAqIHdtYV9jbG9zZSgpIC0gd21hIGNsb3NlIGZ1bmN0aW9uLgorICogICAgICAgICAgICAgICBjbGVhbnVwIHJlc291cmNlcyBhdHRhY2hlZCB3aXRoIHdtYS4KKyAqIEBjZHNfY3R4OiBjZHMgY29udGV4dAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBDREYgRXJyb3Igb24gZmFpbHVyZQorICovCitDREZfU1RBVFVTIHdtYV9jbG9zZSh2b2lkICpjZHNfY3R4KQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZTsKKwl1aW50MzJfdCBpZHg7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJV01BX0xPR0QoIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKworCXdtYV9oYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCisJLyogdmFsaWRhdGUgdGhlIHdtYV9oYW5kbGUgKi8KKwlpZiAoTlVMTCA9PSB3bWFfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCB3bWEgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCS8qIHZhbGlkYXRlIHRoZSB3bWkgaGFuZGxlICovCisJaWYgKE5VTEwgPT0gd21hX2hhbmRsZS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HUCgiJXM6IEludmFsaWQgd21pIGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwkvKiBGcmVlIERCUyBsaXN0ICovCisJaWYgKHdtYV9oYW5kbGUtPmh3X21vZGUuaHdfbW9kZV9saXN0KSB7CisJCWNkZl9tZW1fZnJlZSh3bWFfaGFuZGxlLT5od19tb2RlLmh3X21vZGVfbGlzdCk7CisJCXdtYV9oYW5kbGUtPmh3X21vZGUuaHdfbW9kZV9saXN0ID0gTlVMTDsKKwkJV01BX0xPR0koIiVzOiBEQlMgbGlzdCBpcyBmcmVlZCIsIF9fZnVuY19fKTsKKwl9CisKKwlpZiAod21hX2hhbmRsZS0+ZXZlbnRzX2xvZ3NfbGlzdCkgeworCQljZGZfbWVtX2ZyZWUod21hX2hhbmRsZS0+ZXZlbnRzX2xvZ3NfbGlzdCk7CisJCXdtYV9oYW5kbGUtPmV2ZW50c19sb2dzX2xpc3QgPSBOVUxMOworCQlXTUFfTE9HRCgiJXM6IEV2ZW50IGxvZyBsaXN0IGZyZWVkIiwgX19mdW5jX18pOworCX0KKworCWlmICh3bWFfaGFuZGxlLT5zYXZlZF93bWlfaW5pdF9jbWQuYnVmKSB7CisJCXdtaV9idWZfZnJlZSh3bWFfaGFuZGxlLT5zYXZlZF93bWlfaW5pdF9jbWQuYnVmKTsKKwkJd21hX2hhbmRsZS0+c2F2ZWRfd21pX2luaXRfY21kLmJ1ZiA9IE5VTEw7CisJfQorCisJaWYgKGNkc19nZXRfY29ucGFyYW0oKSAhPSBDREZfRlRNX01PREUpIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwkJY2RmX3dha2VfbG9ja19kZXN0cm95KCZ3bWFfaGFuZGxlLT5wbm9fd2FrZV9sb2NrKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVhUU0NBTgorCQljZGZfd2FrZV9sb2NrX2Rlc3Ryb3koJndtYV9oYW5kbGUtPmV4dHNjYW5fd2FrZV9sb2NrKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVhUU0NBTiAqLworCQljZGZfd2FrZV9sb2NrX2Rlc3Ryb3koJndtYV9oYW5kbGUtPndvd193YWtlX2xvY2spOworCX0KKworCS8qIHVucmVnaXN0ZXIgRmlybXdhcmUgZGVidWcgbG9nICovCisJY2RmX3N0YXR1cyA9IGRiZ2xvZ19kZWluaXQod21hX2hhbmRsZS0+d21pX2hhbmRsZSk7CisJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQlXTUFfTE9HUCgiJXM6IGRiZ2xvZ19kZWluaXQgZmFpbGVkIiwgX19mdW5jX18pOworCisJLyogY2xvc2UgdGhlIGNkZiBldmVudHMgKi8KKwljZGZfZXZlbnRfZGVzdHJveSgmd21hX2hhbmRsZS0+d21hX3JlYWR5X2V2ZW50KTsKKwljZGZfZXZlbnRfZGVzdHJveSgmd21hX2hhbmRsZS0+dGFyZ2V0X3N1c3BlbmQpOworCWNkZl9ldmVudF9kZXN0cm95KCZ3bWFfaGFuZGxlLT53bWFfcmVzdW1lX2V2ZW50KTsKKwljZGZfZXZlbnRfZGVzdHJveSgmd21hX2hhbmRsZS0+cmVjb3ZlcnlfZXZlbnQpOworCXdtYV9jbGVhbnVwX3ZkZXZfcmVzcCh3bWFfaGFuZGxlKTsKKwl3bWFfY2xlYW51cF9ob2xkX3JlcSh3bWFfaGFuZGxlKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHdtYV9oYW5kbGUtPm51bV9tZW1fY2h1bmtzOyArK2lkeCkgeworCQljZGZfb3NfbWVtX2ZyZWVfY29uc2lzdGVudCh3bWFfaGFuZGxlLT5jZGZfZGV2LAorCQkJCQkgICB3bWFfaGFuZGxlLT5tZW1fY2h1bmtzW2lkeF0ubGVuLAorCQkJCQkgICB3bWFfaGFuZGxlLT5tZW1fY2h1bmtzW2lkeF0udmFkZHIsCisJCQkJCSAgIHdtYV9oYW5kbGUtPm1lbV9jaHVua3NbaWR4XS5wYWRkciwKKwkJCQkJICAgY2RmX2dldF9kbWFfbWVtX2NvbnRleHQoCisJCQkJCQkoJih3bWFfaGFuZGxlLT5tZW1fY2h1bmtzW2lkeF0pKSwKKwkJCQkJCQkJICAgbWVtY3R4KSk7CisJfQorCisjaWYgZGVmaW5lZChRQ0FfV0lGSV9GVE0pCisJLyogRGV0YWNoIFVURiBhbmQgdW5yZWdpc3RlciB0aGUgaGFuZGxlciAqLworCWlmIChjZHNfZ2V0X2NvbnBhcmFtKCkgPT0gQ0RGX0ZUTV9NT0RFKQorCQl3bWFfdXRmX2RldGFjaCh3bWFfaGFuZGxlKTsKKyNlbmRpZiAvKiBRQ0FfV0lGSV9GVE0gKi8KKworCWlmIChOVUxMICE9IHdtYV9oYW5kbGUtPmRmc19pYykgeworCQl3bWFfZGZzX2RldGFjaCh3bWFfaGFuZGxlLT5kZnNfaWMpOworCQl3bWFfaGFuZGxlLT5kZnNfaWMgPSBOVUxMOworCX0KKworCWlmIChOVUxMICE9IHdtYV9oYW5kbGUtPnBHZXRSc3NpUmVxKSB7CisJCWNkZl9tZW1fZnJlZSh3bWFfaGFuZGxlLT5wR2V0UnNzaVJlcSk7CisJCXdtYV9oYW5kbGUtPnBHZXRSc3NpUmVxID0gTlVMTDsKKwl9CisJaWYgKFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod21hX2hhbmRsZS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCSAgIFdNSV9TRVJWSUNFX01HTVRfVFhfV01JKSkgeworCQl3bWlfZGVzY19wb29sX2RlaW5pdCh3bWFfaGFuZGxlKTsKKwl9CisKKwlXTUFfTE9HRCgiJXM6IEV4aXQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfdXBkYXRlX2Z3X2NvbmZpZygpIC0gdXBkYXRlIGZ3IGNvbmZpZ3VyYXRpb24KKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdGd0X2NhcDogdGFyZ2V0IGNhcGFiYWxpdHkKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX3VwZGF0ZV9md19jb25maWcodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSBzdHJ1Y3Qgd21hX3RhcmdldF9jYXAgKnRndF9jYXApCit7CisJLyoKKwkgKiB0Z3RfY2FwIGNvbnRhaW5zIGRlZmF1bHQgdGFyZ2V0IHJlc291cmNlIGNvbmZpZ3VyYXRpb24KKwkgKiB3aGljaCBjYW4gYmUgbW9kaWZpZWQgaGVyZSwgaWYgcmVxdWlyZWQKKwkgKi8KKwkvKiBPdmVycmlkZSB0aGUgbm8uIG9mIG1heCBmcmFnbWVudHMgYXMgcGVyIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gKi8KKwl0Z3RfY2FwLT53bGFuX3Jlc291cmNlX2NvbmZpZy5tYXhfZnJhZ19lbnRyaWVzID0KKwkJCQkJQ0RGX01JTihRQ0FfT0xfMTFBQ19UWF9NQVhfRlJBR1MsCisJCQkJCQl3bWFfaGFuZGxlLT5tYXhfZnJhZ19lbnRyeSk7CisJd21hX2hhbmRsZS0+bWF4X2ZyYWdfZW50cnkgPQorCQl0Z3RfY2FwLT53bGFuX3Jlc291cmNlX2NvbmZpZy5tYXhfZnJhZ19lbnRyaWVzOworfQorCisvKioKKyAqIHdtYV9hbGxvY19ob3N0X21lbV9jaHVuaygpIC0gYWxsb2NhdGUgaG9zdCBtZW1vcnkKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcmVxX2lkOiByZXF1ZXN0IGlkCisgKiBAaWR4OiBpbmRleAorICogQG51bV91bml0czogbnVtYmVyIG9mIHVuaXRzCisgKiBAdW5pdF9sZW46IHVuaXQgbGVuZ3RoCisgKgorICogYWxsb2NhdGUgYSBjaHVuayBvZiBtZW1vcnkgYXQgdGhlIGluZGV4IGluZGljYXRlZCBhbmQKKyAqIGlmIGFsbG9jYXRpb24gZmFpbCBhbGxvY2F0ZSBzbWFsbGVzdCBzaXplIHBvc3NpYmxyIGFuZAorICogcmV0dXJuIG51bWJlciBvZiB1bml0cyBhbGxvY2F0ZWQuCisgKgorICogUmV0dXJuOiBudW1iZXIgb2YgdW5pdHMgb3IgMCBmb3IgZXJyb3IuCisgKi8KK3N0YXRpYyB1aW50MzJfdCB3bWFfYWxsb2NfaG9zdF9tZW1fY2h1bmsodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgdWludDMyX3QgcmVxX2lkLCB1aW50MzJfdCBpZHgsCisJCQkJCSB1aW50MzJfdCBudW1fdW5pdHMsIHVpbnQzMl90IHVuaXRfbGVuKQoreworCWNkZl9kbWFfYWRkcl90IHBhZGRyOworCWlmICghbnVtX3VuaXRzIHx8ICF1bml0X2xlbikgeworCQlyZXR1cm4gMDsKKwl9CisJd21hX2hhbmRsZS0+bWVtX2NodW5rc1tpZHhdLnZhZGRyID0gTlVMTDsKKwkvKiogcmVkdWNlIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbiBieSBoYWxmIHVudGlsIGFsbG9jYXRpb24gc3VjY2VlZHMgKi8KKwl3aGlsZSAod21hX2hhbmRsZS0+bWVtX2NodW5rc1tpZHhdLnZhZGRyID09IE5VTEwgJiYgbnVtX3VuaXRzKSB7CisJCXdtYV9oYW5kbGUtPm1lbV9jaHVua3NbaWR4XS52YWRkciA9CisJCQljZGZfb3NfbWVtX2FsbG9jX2NvbnNpc3RlbnQod21hX2hhbmRsZS0+Y2RmX2RldiwKKwkJCQkJCSAgICBudW1fdW5pdHMgKiB1bml0X2xlbiwgJnBhZGRyLAorCQkJCQkJICAgIGNkZl9nZXRfZG1hX21lbV9jb250ZXh0KAorCQkJCQkJCSgmKHdtYV9oYW5kbGUtPm1lbV9jaHVua3NbaWR4XSkpLAorCQkJCQkJCQltZW1jdHgpKTsKKwkJaWYgKHdtYV9oYW5kbGUtPm1lbV9jaHVua3NbaWR4XS52YWRkciA9PSBOVUxMKSB7CisJCQludW1fdW5pdHMgPSAobnVtX3VuaXRzID4+IDEpOy8qIHJlZHVjZSBsZW5ndGggYnkgaGFsZiAqLworCQl9IGVsc2UgeworCQkJd21hX2hhbmRsZS0+bWVtX2NodW5rc1tpZHhdLnBhZGRyID0gcGFkZHI7CisJCQl3bWFfaGFuZGxlLT5tZW1fY2h1bmtzW2lkeF0ubGVuID0gbnVtX3VuaXRzICogdW5pdF9sZW47CisJCQl3bWFfaGFuZGxlLT5tZW1fY2h1bmtzW2lkeF0ucmVxX2lkID0gcmVxX2lkOworCQl9CisJfQorCXJldHVybiBudW1fdW5pdHM7Cit9CisKKyNkZWZpbmUgSE9TVF9NRU1fU0laRV9VTklUIDQKKy8qKgorICogd21hX2FsbG9jX2hvc3RfbWVtKCkgLSBhbGxvY2F0ZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVlc3RlZCBieSBGVy4KKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcmVxX2lkOiByZXF1ZXN0IGlkCisgKiBAbnVtX3VuaXRzOiBudW1iZXIgb2YgdW5pdHMKKyAqIEB1bml0X2xlbjogdW5pdCBsZW5ndGgKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX2FsbG9jX2hvc3RfbWVtKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgdWludDMyX3QgcmVxX2lkLAorCQkJICAgICAgIHVpbnQzMl90IG51bV91bml0cywgdWludDMyX3QgdW5pdF9sZW4pCit7CisJdWludDMyX3QgcmVtYWluaW5nX3VuaXRzLCBhbGxvY2F0ZWRfdW5pdHMsIGlkeDsKKworCS8qIGFkanVzdCB0aGUgbGVuZ3RoIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgdW5pdCBzaXplICovCisJdW5pdF9sZW4gPSAodW5pdF9sZW4gKyAoSE9TVF9NRU1fU0laRV9VTklUIC0gMSkpICYKKwkJICAgKH4oSE9TVF9NRU1fU0laRV9VTklUIC0gMSkpOworCWlkeCA9IHdtYV9oYW5kbGUtPm51bV9tZW1fY2h1bmtzOworCXJlbWFpbmluZ191bml0cyA9IG51bV91bml0czsKKwl3aGlsZSAocmVtYWluaW5nX3VuaXRzKSB7CisJCWFsbG9jYXRlZF91bml0cyA9IHdtYV9hbGxvY19ob3N0X21lbV9jaHVuayh3bWFfaGFuZGxlLCByZXFfaWQsCisJCQkJCQkJICAgaWR4LCByZW1haW5pbmdfdW5pdHMsCisJCQkJCQkJICAgdW5pdF9sZW4pOworCQlpZiAoYWxsb2NhdGVkX3VuaXRzID09IDApIHsKKwkJCVdNQV9MT0dFKCJGQUlMRUQgVE8gQUxMT0NBVEVEIG1lbW9yeSB1bml0IGxlbiAlZCIKKwkJCQkgIiB1bml0cyByZXF1ZXN0ZWQgJWQgdW5pdHMgYWxsb2NhdGVkICVkICIsCisJCQkJIHVuaXRfbGVuLCBudW1fdW5pdHMsCisJCQkJIChudW1fdW5pdHMgLSByZW1haW5pbmdfdW5pdHMpKTsKKwkJCXdtYV9oYW5kbGUtPm51bV9tZW1fY2h1bmtzID0gaWR4OworCQkJYnJlYWs7CisJCX0KKwkJcmVtYWluaW5nX3VuaXRzIC09IGFsbG9jYXRlZF91bml0czsKKwkJKytpZHg7CisJCWlmIChpZHggPT0gTUFYX01FTV9DSFVOS1MpIHsKKwkJCVdNQV9MT0dFKCJSV0FDSEVEIE1BWCBDSFVOSyBMSU1JVCBmb3IgbWVtb3J5IHVuaXRzICVkIgorCQkJCSAiIHVuaXQgbGVuICVkIHJlcXVlc3RlZCBieSBGVywiCisJCQkJICIgb25seSBhbGxvY2F0ZWQgJWQgIiwKKwkJCQkgbnVtX3VuaXRzLCB1bml0X2xlbiwKKwkJCQkgKG51bV91bml0cyAtIHJlbWFpbmluZ191bml0cykpOworCQkJd21hX2hhbmRsZS0+bnVtX21lbV9jaHVua3MgPSBpZHg7CisJCQlicmVhazsKKwkJfQorCX0KKwl3bWFfaGFuZGxlLT5udW1fbWVtX2NodW5rcyA9IGlkeDsKK30KKworLyoqCisgKiB3bWFfdXBkYXRlX3RhcmdldF9zZXJ2aWNlcygpIC0gdXBkYXRlIHRhcmdldCBzZXJ2aWNlcyBmcm9tIHdtYSBoYW5kbGUKKyAqIEB3aDogd21hIGhhbmRsZQorICogQGNmZzogdGFyZ2V0IHNlcnZpY2VzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3bWFfdXBkYXRlX3RhcmdldF9zZXJ2aWNlcyh0cF93bWFfaGFuZGxlIHdoLAorCQkJCQkgICAgICBzdHJ1Y3Qgd21hX3RndF9zZXJ2aWNlcyAqY2ZnKQoreworCS8qIFNUQSBwb3dlciBzYXZlICovCisJY2ZnLT5zdGFfcG93ZXJfc2F2ZSA9IFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod2gtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkJCSAgICAgV01JX1NFUlZJQ0VfU1RBX1BXUlNBVkUpOworCisJLyogRW5hYmxlIFVBUFNEICovCisJY2ZnLT51YXBzZCA9IFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod2gtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkJICAgIFdNSV9TRVJWSUNFX0FQX1VBUFNEKTsKKworCS8qIFVwZGF0ZSBBUCBERlMgc2VydmljZSAqLworCWNmZy0+YXBfZGZzID0gV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3aC0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCQkgICAgIFdNSV9TRVJWSUNFX0FQX0RGUyk7CisKKwkvKiBFbmFibGUgMTFBQyAqLworCWNmZy0+ZW5fMTFhYyA9IFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod2gtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkJICAgICAgV01JX1NFUlZJQ0VfMTFBQyk7CisJaWYgKGNmZy0+ZW5fMTFhYykKKwkJZ19md193bGFuX2ZlYXRfY2FwcyB8PSAoMSA8PCBET1QxMUFDKTsKKworCS8qIFByb2FjdGl2ZSBBUlAgcmVzcG9uc2UgKi8KKwlnX2Z3X3dsYW5fZmVhdF9jYXBzIHw9ICgxIDw8IFdMQU5fUEVSSU9ESUNfVFhfUFRSTik7CisKKwkvKiBFbmFibGUgV09XICovCisJZ19md193bGFuX2ZlYXRfY2FwcyB8PSAoMSA8PCBXT1cpOworCisJLyogQVJQIG9mZmxvYWQgKi8KKwljZmctPmFycF9vZmZsb2FkID0gV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3aC0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCQkJICBXTUlfU0VSVklDRV9BUlBOU19PRkZMT0FEKTsKKworCS8qIEFkYXB0aXZlIGVhcmx5LXJ4ICovCisJY2ZnLT5lYXJseV9yeCA9IFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod2gtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkJICAgICAgIFdNSV9TRVJWSUNFX0VBUkxZX1JYKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKwkvKiBQTk8gb2ZmbG9hZCAqLworCWlmIChXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdoLT53bWlfc2VydmljZV9iaXRtYXAsIFdNSV9TRVJWSUNFX05MTykpCisJCWNmZy0+cG5vX29mZmxvYWQgPSB0cnVlOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTyAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwlpZiAoV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3aC0+d21pX3NlcnZpY2VfYml0bWFwLCBXTUlfU0VSVklDRV9FWFRTQ0FOKSkgeworCQlnX2Z3X3dsYW5fZmVhdF9jYXBzIHw9ICgxIDw8IEVYVEVOREVEX1NDQU4pOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVhUU0NBTiAqLworCWNmZy0+bHRlX2NvZXhfYW50X3NoYXJlID0gV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3aC0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCQlXTUlfU0VSVklDRV9MVEVfQU5UX1NIQVJFX1NVUFBPUlQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJLyogRW5hYmxlIFRETFMgKi8KKwlpZiAoV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3aC0+d21pX3NlcnZpY2VfYml0bWFwLCBXTUlfU0VSVklDRV9URExTKSkgeworCQljZmctPmVuX3RkbHMgPSAxOworCQlnX2Z3X3dsYW5fZmVhdF9jYXBzIHw9ICgxIDw8IFRETFMpOworCX0KKwkvKiBFbmFibGUgYWR2YW5jZWQgVERMUyBmZWF0dXJlcyAqLworCWlmIChXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdoLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJICAgV01JX1NFUlZJQ0VfVERMU19PRkZDSEFOKSkgeworCQljZmctPmVuX3RkbHNfb2ZmY2hhbiA9IDE7CisJCWdfZndfd2xhbl9mZWF0X2NhcHMgfD0gKDEgPDwgVERMU19PRkZfQ0hBTk5FTCk7CisJfQorCisJY2ZnLT5lbl90ZGxzX3VhcHNkX2J1Zl9zdGEgPQorCQlXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdoLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJICAgICAgIFdNSV9TRVJWSUNFX1RETFNfVUFQU0RfQlVGRkVSX1NUQSk7CisJY2ZnLT5lbl90ZGxzX3VhcHNkX3NsZWVwX3N0YSA9CisJCVdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod2gtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkgICAgICAgV01JX1NFUlZJQ0VfVERMU19VQVBTRF9TTEVFUF9TVEEpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9URExTICovCisJaWYgKFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQKKwkJICAgICh3aC0+d21pX3NlcnZpY2VfYml0bWFwLCBXTUlfU0VSVklDRV9CRUFDT05fT0ZGTE9BRCkpCisJCWNmZy0+YmVhY29uX29mZmxvYWQgPSB0cnVlOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkvKiBFbmFibGUgUm9hbSBPZmZsb2FkICovCisJY2ZnLT5lbl9yb2FtX29mZmxvYWQgPSBXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdoLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJCQkgICAgICBXTUlfU0VSVklDRV9ST0FNX0hPX09GRkxPQUQpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkFOCisJaWYgKFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod2gtPndtaV9zZXJ2aWNlX2JpdG1hcCwgV01JX1NFUlZJQ0VfTkFOKSkKKwkJZ19md193bGFuX2ZlYXRfY2FwcyB8PSAoMSA8PCBOQU4pOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9OQU4gKi8KKworCWlmIChXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdoLT53bWlfc2VydmljZV9iaXRtYXAsIFdNSV9TRVJWSUNFX1JUVCkpCisJCWdfZndfd2xhbl9mZWF0X2NhcHMgfD0gKDEgPDwgUlRUKTsKK30KKworLyoqCisgKiB3bWFfdXBkYXRlX3RhcmdldF9odF9jYXAoKSAtIHVwZGF0ZSBodCBjYXBhYmFsaXR5IGZyb20gd21hIGhhbmRsZQorICogQHdoOiB3bWEgaGFuZGxlCisgKiBAY2ZnOiBodCBjYXBhYmFsaXR5CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3bWFfdXBkYXRlX3RhcmdldF9odF9jYXAodHBfd21hX2hhbmRsZSB3aCwKKwkJCQkJICAgIHN0cnVjdCB3bWFfdGd0X2h0X2NhcCAqY2ZnKQoreworCS8qIFJYIFNUQkMgKi8KKwljZmctPmh0X3J4X3N0YmMgPSAhISh3aC0+aHRfY2FwX2luZm8gJiBXTUlfSFRfQ0FQX1JYX1NUQkMpOworCisJLyogVFggU1RCQyAqLworCWNmZy0+aHRfdHhfc3RiYyA9ICEhKHdoLT5odF9jYXBfaW5mbyAmIFdNSV9IVF9DQVBfVFhfU1RCQyk7CisKKwkvKiBNUERVIGRlbnNpdHkgKi8KKwljZmctPm1wZHVfZGVuc2l0eSA9IHdoLT5odF9jYXBfaW5mbyAmIFdNSV9IVF9DQVBfTVBEVV9ERU5TSVRZOworCisJLyogSFQgUlggTERQQyAqLworCWNmZy0+aHRfcnhfbGRwYyA9ICEhKHdoLT5odF9jYXBfaW5mbyAmIFdNSV9IVF9DQVBfTERQQyk7CisKKwkvKiBIVCBTR0kgKi8KKwljZmctPmh0X3NnaV8yMCA9ICEhKHdoLT5odF9jYXBfaW5mbyAmIFdNSV9IVF9DQVBfSFQyMF9TR0kpOworCisJY2ZnLT5odF9zZ2lfNDAgPSAhISh3aC0+aHRfY2FwX2luZm8gJiBXTUlfSFRfQ0FQX0hUNDBfU0dJKTsKKworCS8qIFJGIGNoYWlucyAqLworCWNmZy0+bnVtX3JmX2NoYWlucyA9IHdoLT5udW1fcmZfY2hhaW5zOworCisJV01BX0xPR0QoIiVzOiBodF9jYXBfaW5mbyAtICV4IGh0X3J4X3N0YmMgLSAlZCwgaHRfdHhfc3RiYyAtICVkXG5cCisJCSBtcGR1X2RlbnNpdHkgLSAlZCBodF9yeF9sZHBjIC0gJWQgaHRfc2dpXzIwIC0gJWRcblwKKwkJIGh0X3NnaV80MCAtICVkIG51bV9yZl9jaGFpbnMgLSAlZCAiLCBfX2Z1bmNfXywgd2gtPmh0X2NhcF9pbmZvLAorCQkgY2ZnLT5odF9yeF9zdGJjLCBjZmctPmh0X3R4X3N0YmMsIGNmZy0+bXBkdV9kZW5zaXR5LAorCQkgY2ZnLT5odF9yeF9sZHBjLCBjZmctPmh0X3NnaV8yMCwgY2ZnLT5odF9zZ2lfNDAsCisJCSBjZmctPm51bV9yZl9jaGFpbnMpOworCit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworLyoqCisgKiB3bWFfdXBkYXRlX3RhcmdldF92aHRfY2FwKCkgLSB1cGRhdGUgdmh0IGNhcGFiYWxpdHkgZnJvbSB3bWEgaGFuZGxlCisgKiBAd2g6IHdtYSBoYW5kbGUKKyAqIEBjZmc6IHZodCBjYXBhYmFsaXR5CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3bWFfdXBkYXRlX3RhcmdldF92aHRfY2FwKHRwX3dtYV9oYW5kbGUgd2gsCisJCQkJCSAgICAgc3RydWN0IHdtYV90Z3Rfdmh0X2NhcCAqY2ZnKQoreworCisJaWYgKHdoLT52aHRfY2FwX2luZm8gJiBXTUlfVkhUX0NBUF9NQVhfTVBEVV9MRU5fMTE0NTQpCisJCWNmZy0+dmh0X21heF9tcGR1ID0gV01JX1ZIVF9DQVBfTUFYX01QRFVfTEVOXzExNDU0OworCWVsc2UgaWYgKHdoLT52aHRfY2FwX2luZm8gJiBXTUlfVkhUX0NBUF9NQVhfTVBEVV9MRU5fNzkzNSkKKwkJY2ZnLT52aHRfbWF4X21wZHUgPSBXTUlfVkhUX0NBUF9NQVhfTVBEVV9MRU5fNzkzNTsKKwllbHNlCisJCWNmZy0+dmh0X21heF9tcGR1ID0gMDsKKworCisJaWYgKHdoLT52aHRfY2FwX2luZm8gJiBXTUlfVkhUX0NBUF9DSF9XSURUSF84MFA4MF8xNjBNSFopIHsKKwkJY2ZnLT5zdXBwX2NoYW5fd2lkdGggPSAxIDw8IGVIVF9DSEFOTkVMX1dJRFRIXzgwUDgwTUhaOworCQljZmctPnN1cHBfY2hhbl93aWR0aCB8PSAxIDw8IGVIVF9DSEFOTkVMX1dJRFRIXzE2ME1IWjsKKwl9IGVsc2UgaWYgKHdoLT52aHRfY2FwX2luZm8gJiBXTUlfVkhUX0NBUF9DSF9XSURUSF8xNjBNSFopCisJCWNmZy0+c3VwcF9jaGFuX3dpZHRoID0gMSA8PCBlSFRfQ0hBTk5FTF9XSURUSF8xNjBNSFo7CisJZWxzZQorCQljZmctPnN1cHBfY2hhbl93aWR0aCA9IDEgPDwgZUhUX0NIQU5ORUxfV0lEVEhfODBNSFo7CisKKwljZmctPnZodF9yeF9sZHBjID0gd2gtPnZodF9jYXBfaW5mbyAmIFdNSV9WSFRfQ0FQX1JYX0xEUEM7CisKKwljZmctPnZodF9zaG9ydF9naV84MCA9IHdoLT52aHRfY2FwX2luZm8gJiBXTUlfVkhUX0NBUF9TR0lfODBNSFo7CisJY2ZnLT52aHRfc2hvcnRfZ2lfMTYwID0gd2gtPnZodF9jYXBfaW5mbyAmIFdNSV9WSFRfQ0FQX1NHSV8xNjBNSFo7CisKKwljZmctPnZodF90eF9zdGJjID0gd2gtPnZodF9jYXBfaW5mbyAmIFdNSV9WSFRfQ0FQX1RYX1NUQkM7CisKKwljZmctPnZodF9yeF9zdGJjID0gKHdoLT52aHRfY2FwX2luZm8gJiBXTUlfVkhUX0NBUF9SWF9TVEJDXzFTUykgfAorCQkod2gtPnZodF9jYXBfaW5mbyAmIFdNSV9WSFRfQ0FQX1JYX1NUQkNfMlNTKSB8CisJCSh3aC0+dmh0X2NhcF9pbmZvICYgV01JX1ZIVF9DQVBfUlhfU1RCQ18zU1MpIDsKKworCWNmZy0+dmh0X21heF9hbXBkdV9sZW5fZXhwID0gKHdoLT52aHRfY2FwX2luZm8gJgorCQkJCSAgICAgIFdNSV9WSFRfQ0FQX01BWF9BTVBEVV9MRU5fRVhQKQorCQkJCSAgICAgPj4gV01JX1ZIVF9DQVBfTUFYX0FNUERVX0xFTl9FWFBfU0hJRlQ7CisKKwljZmctPnZodF9zdV9iZm9ybWVyID0gd2gtPnZodF9jYXBfaW5mbyAmIFdNSV9WSFRfQ0FQX1NVX0JGT1JNRVI7CisKKwljZmctPnZodF9zdV9iZm9ybWVlID0gd2gtPnZodF9jYXBfaW5mbyAmIFdNSV9WSFRfQ0FQX1NVX0JGT1JNRUU7CisKKwljZmctPnZodF9tdV9iZm9ybWVyID0gd2gtPnZodF9jYXBfaW5mbyAmIFdNSV9WSFRfQ0FQX01VX0JGT1JNRVI7CisKKwljZmctPnZodF9tdV9iZm9ybWVlID0gd2gtPnZodF9jYXBfaW5mbyAmIFdNSV9WSFRfQ0FQX01VX0JGT1JNRUU7CisKKwljZmctPnZodF90eG9wX3BzID0gd2gtPnZodF9jYXBfaW5mbyAmIFdNSV9WSFRfQ0FQX1RYT1BfUFM7CisKKwlXTUFfTE9HRCgiICVzOiBtYXhfbXBkdSAlZCBzdXBwX2NoYW5fd2lkdGggJXggcnhfbGRwYyAleFxuIFwKKwkJIHNob3J0X2dpXzgwICV4IHR4X3N0YmMgJXggcnhfc3RiYyAleCB0eG9wX3BzICV4XG4gXAorCQkgc3VfYmZvcm1lZSAleCBtdV9iZm9ybWVlICV4IG1heF9hbXBkdV9sZW5fZXhwICVkIiwgX19mdW5jX18sCisJCSBjZmctPnZodF9tYXhfbXBkdSwgY2ZnLT5zdXBwX2NoYW5fd2lkdGgsIGNmZy0+dmh0X3J4X2xkcGMsCisJCSBjZmctPnZodF9zaG9ydF9naV84MCwgY2ZnLT52aHRfdHhfc3RiYywgY2ZnLT52aHRfcnhfc3RiYywKKwkJIGNmZy0+dmh0X3R4b3BfcHMsIGNmZy0+dmh0X3N1X2Jmb3JtZWUsIGNmZy0+dmh0X211X2Jmb3JtZWUsCisJCSBjZmctPnZodF9tYXhfYW1wZHVfbGVuX2V4cCk7Cit9CisjZW5kaWYgLyogI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDICovCisKKy8qKgorICogd21hX3VwZGF0ZV9oZGRfY2ZnKCkgLSB1cGRhdGUgSEREIGNvbmZpZworICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX3VwZGF0ZV9oZGRfY2ZnKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSkKK3sKKwlzdHJ1Y3Qgd21hX3RndF9jZmcgdGd0X2NmZzsKKwl2b2lkICpoZGRfY3R4ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSEREKTsKKworCXRndF9jZmcucmVnX2RvbWFpbiA9IHdtYV9oYW5kbGUtPnJlZ19jYXAuZWVwcm9tX3JkOworCXRndF9jZmcuZWVwcm9tX3JkX2V4dCA9IHdtYV9oYW5kbGUtPnJlZ19jYXAuZWVwcm9tX3JkX2V4dDsKKworCXN3aXRjaCAod21hX2hhbmRsZS0+cGh5X2NhcGFiaWxpdHkpIHsKKwljYXNlIFdNSV8xMUdfQ0FQQUJJTElUWToKKwljYXNlIFdNSV8xMU5HX0NBUEFCSUxJVFk6CisJCXRndF9jZmcuYmFuZF9jYXAgPSBlQ1NSX0JBTkRfMjQ7CisJCWJyZWFrOworCWNhc2UgV01JXzExQV9DQVBBQklMSVRZOgorCWNhc2UgV01JXzExTkFfQ0FQQUJJTElUWToKKwljYXNlIFdNSV8xMUFDX0NBUEFCSUxJVFk6CisJCXRndF9jZmcuYmFuZF9jYXAgPSBlQ1NSX0JBTkRfNUc7CisJCWJyZWFrOworCWNhc2UgV01JXzExQUdfQ0FQQUJJTElUWToKKwljYXNlIFdNSV8xMU5BR19DQVBBQklMSVRZOgorCWRlZmF1bHQ6CisJCXRndF9jZmcuYmFuZF9jYXAgPSBlQ1NSX0JBTkRfQUxMOworCX0KKworCXRndF9jZmcubWF4X2ludGZfY291bnQgPSB3bWFfaGFuZGxlLT53bGFuX3Jlc291cmNlX2NvbmZpZy5udW1fdmRldnM7CisKKwljZGZfbWVtX2NvcHkodGd0X2NmZy5od19tYWNhZGRyLmJ5dGVzLCB3bWFfaGFuZGxlLT5od2FkZHIsCisJCSAgICAgQVRIX01BQ19MRU4pOworCisJd21hX3VwZGF0ZV90YXJnZXRfc2VydmljZXMod21hX2hhbmRsZSwgJnRndF9jZmcuc2VydmljZXMpOworCXdtYV91cGRhdGVfdGFyZ2V0X2h0X2NhcCh3bWFfaGFuZGxlLCAmdGd0X2NmZy5odF9jYXApOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJd21hX3VwZGF0ZV90YXJnZXRfdmh0X2NhcCh3bWFfaGFuZGxlLCAmdGd0X2NmZy52aHRfY2FwKTsKKyNlbmRpZiAvKiAjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMgKi8KKworCXRndF9jZmcudGFyZ2V0X2Z3X3ZlcnNpb24gPSB3bWFfaGFuZGxlLT50YXJnZXRfZndfdmVyc2lvbjsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTFBTUworCXRndF9jZmcubHBzc19zdXBwb3J0ID0gd21hX2hhbmRsZS0+bHBzc19zdXBwb3J0OworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MUFNTICovCisJdGd0X2NmZy5hcF9hcnBuc19zdXBwb3J0ID0gd21hX2hhbmRsZS0+YXBfYXJwbnNfc3VwcG9ydDsKKwl3bWFfaGFuZGxlLT50Z3RfY2ZnX3VwZGF0ZV9jYihoZGRfY3R4LCAmdGd0X2NmZyk7Cit9CisKKy8qKgorICogd21hX3NldHVwX3dtaV9pbml0X21zZygpIC0gZmlsbCB3bWkgaW5pdCBtZXNzYWdlIGJ1ZmZlcgorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBldjogcmVhZHkgZXZlbnQgZml4ZWQgcGFyYW1zCisgKiBAcGFyYW1fYnVmOiByZWR5IGV2ZW50IFRMVnMKKyAqIEBsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBSZXR1cm46IHdtaSBidWZmZXIgb3IgTlVMTCBmb3IgZXJyb3IKKyAqLworc3RhdGljIHdtaV9idWZfdCB3bWFfc2V0dXBfd21pX2luaXRfbXNnKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJd21pX3NlcnZpY2VfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW0gKmV2LAorCQkJCQlXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZiwKKwkJCQkJIHVpbnQzMl90ICpsZW4pCit7CisJd21pX2J1Zl90IGJ1ZjsKKwl3bWlfaW5pdF9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bGFuX2hvc3RfbWVtX3JlcSAqZXZfbWVtX3JlcXM7CisJd21pX2FiaV92ZXJzaW9uIG15X3ZlcnM7CisJaW50IG51bV93aGl0ZWxpc3Q7CisJdWludDhfdCAqYnVmX3B0cjsKKwl3bWlfcmVzb3VyY2VfY29uZmlnICpyZXNvdXJjZV9jZmc7CisJd2xhbl9ob3N0X21lbW9yeV9jaHVuayAqaG9zdF9tZW1fY2h1bmtzOworCXVpbnQzMl90IG1lbV9jaHVua19sZW4gPSAwOworCXVpbnQxNl90IGlkeDsKKwl1aW50MzJfdCBudW1fdW5pdHM7CisKKwkqbGVuID0gc2l6ZW9mKCpjbWQpICsgc2l6ZW9mKHdtaV9yZXNvdXJjZV9jb25maWcpICsgV01JX1RMVl9IRFJfU0laRTsKKwltZW1fY2h1bmtfbGVuID0gKHNpemVvZih3bGFuX2hvc3RfbWVtb3J5X2NodW5rKSAqIE1BWF9NRU1fQ0hVTktTKTsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsICpsZW4gKyBtZW1fY2h1bmtfbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HUCgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlldl9tZW1fcmVxcyA9IHBhcmFtX2J1Zi0+bWVtX3JlcXM7CisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCWNtZCA9ICh3bWlfaW5pdF9jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlyZXNvdXJjZV9jZmcgPSAod21pX3Jlc291cmNlX2NvbmZpZyAqKSAoYnVmX3B0ciArIHNpemVvZigqY21kKSk7CisJaG9zdF9tZW1fY2h1bmtzID0gKHdsYW5faG9zdF9tZW1vcnlfY2h1bmsgKikKKwkJCSAgKGJ1Zl9wdHIgKyBzaXplb2YoKmNtZCkgKyBzaXplb2Yod21pX3Jlc291cmNlX2NvbmZpZykKKwkJCSAgICsgV01JX1RMVl9IRFJfU0laRSk7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2luaXRfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV9pbml0X2NtZF9maXhlZF9wYXJhbSkpOworCisJKnJlc291cmNlX2NmZyA9IHdtYV9oYW5kbGUtPndsYW5fcmVzb3VyY2VfY29uZmlnOworCVdNSVRMVl9TRVRfSERSKCZyZXNvdXJjZV9jZmctPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZXNvdXJjZV9jb25maWcsCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX3Jlc291cmNlX2NvbmZpZykpOworCisJLyogYWxsb2NhdGUgbWVtb3J5IHJlcXVlc3RlZCBieSBGVyAqLworCWlmIChldi0+bnVtX21lbV9yZXFzID4gV01JX01BWF9NRU1fUkVRUykgeworCQlDREZfQVNTRVJUKDApOworCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiBOVUxMOworCX0KKworCWNtZC0+bnVtX2hvc3RfbWVtX2NodW5rcyA9IDA7CisJZm9yIChpZHggPSAwOyBpZHggPCBldi0+bnVtX21lbV9yZXFzOyArK2lkeCkgeworCQludW1fdW5pdHMgPSBldl9tZW1fcmVxc1tpZHhdLm51bV91bml0czsKKwkJaWYgKGV2X21lbV9yZXFzW2lkeF0ubnVtX3VuaXRfaW5mbyAmIE5VTV9VTklUU19JU19OVU1fUEVFUlMpIHsKKwkJCS8qCisJCQkgKiBudW1iZXIgb2YgdW5pdHMgdG8gYWxsb2NhdGUgaXMgbnVtYmVyCisJCQkgKiBvZiBwZWVycywgMSBleHRyYSBmb3Igc2VsZiBwZWVyIG9uCisJCQkgKiB0YXJnZXQuIHRoaXMgbmVlZHMgdG8gYmUgZmllZCwgaG9zdAorCQkJICogYW5kIHRhcmdldCBjYW4gZ2V0IG91dCBvZiBzeW5jCisJCQkgKi8KKwkJCW51bV91bml0cyA9IHJlc291cmNlX2NmZy0+bnVtX3BlZXJzICsgMTsKKwkJfQorCQlXTUFfTE9HRAorCQkJKCJpZHggJWQgcmVxICVkICBudW1fdW5pdHMgJWQgbnVtX3VuaXRfaW5mbyAlZCB1bml0IHNpemUgJWQgYWN0dWFsIHVuaXRzICVkICIsCisJCQlpZHgsIGV2X21lbV9yZXFzW2lkeF0ucmVxX2lkLAorCQkJZXZfbWVtX3JlcXNbaWR4XS5udW1fdW5pdHMsCisJCQlldl9tZW1fcmVxc1tpZHhdLm51bV91bml0X2luZm8sCisJCQlldl9tZW1fcmVxc1tpZHhdLnVuaXRfc2l6ZSwgbnVtX3VuaXRzKTsKKwkJd21hX2FsbG9jX2hvc3RfbWVtKHdtYV9oYW5kbGUsIGV2X21lbV9yZXFzW2lkeF0ucmVxX2lkLAorCQkJCSAgIG51bV91bml0cywgZXZfbWVtX3JlcXNbaWR4XS51bml0X3NpemUpOworCX0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHdtYV9oYW5kbGUtPm51bV9tZW1fY2h1bmtzOyArK2lkeCkgeworCQlXTUlUTFZfU0VUX0hEUigmKGhvc3RfbWVtX2NodW5rc1tpZHhdLnRsdl9oZWFkZXIpLAorCQkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd2xhbl9ob3N0X21lbW9yeV9jaHVuaywKKwkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCQkgICAgICAgKHdsYW5faG9zdF9tZW1vcnlfY2h1bmspKTsKKwkJaG9zdF9tZW1fY2h1bmtzW2lkeF0ucHRyID0gd21hX2hhbmRsZS0+bWVtX2NodW5rc1tpZHhdLnBhZGRyOworCQlob3N0X21lbV9jaHVua3NbaWR4XS5zaXplID0gd21hX2hhbmRsZS0+bWVtX2NodW5rc1tpZHhdLmxlbjsKKwkJaG9zdF9tZW1fY2h1bmtzW2lkeF0ucmVxX2lkID0KKwkJCXdtYV9oYW5kbGUtPm1lbV9jaHVua3NbaWR4XS5yZXFfaWQ7CisJCVdNQV9MT0dEKCJjaHVuayAlZCBsZW4gJWQgcmVxdWVzdGVkICxwdHIgIDB4JXggIiwKKwkJCSBpZHgsIGhvc3RfbWVtX2NodW5rc1tpZHhdLnNpemUsCisJCQkgaG9zdF9tZW1fY2h1bmtzW2lkeF0ucHRyKTsKKwl9CisJY21kLT5udW1faG9zdF9tZW1fY2h1bmtzID0gd21hX2hhbmRsZS0+bnVtX21lbV9jaHVua3M7CisJbGVuICs9ICh3bWFfaGFuZGxlLT5udW1fbWVtX2NodW5rcyAqIHNpemVvZih3bGFuX2hvc3RfbWVtb3J5X2NodW5rKSk7CisJV01JVExWX1NFVF9IRFIoKGJ1Zl9wdHIgKyBzaXplb2YoKmNtZCkgKyBzaXplb2Yod21pX3Jlc291cmNlX2NvbmZpZykpLAorCQkgICAgICAgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJICAgICAgIChzaXplb2Yod2xhbl9ob3N0X21lbW9yeV9jaHVuaykgKgorCQkJd21hX2hhbmRsZS0+bnVtX21lbV9jaHVua3MpKTsKKwljZGZfbWVtX2NvcHkoJndtYV9oYW5kbGUtPnRhcmdldF9hYmlfdmVycywKKwkJICAgICAmcGFyYW1fYnVmLT5maXhlZF9wYXJhbS0+ZndfYWJpX3ZlcnMsCisJCSAgICAgc2l6ZW9mKHdtaV9hYmlfdmVyc2lvbikpOworCW51bV93aGl0ZWxpc3QgPSBzaXplb2YodmVyc2lvbl93aGl0ZWxpc3QpIC8KKwkJCXNpemVvZih3bWlfd2hpdGVsaXN0X3ZlcnNpb25faW5mbyk7CisJbXlfdmVycy5hYmlfdmVyc2lvbl8wID0gV01JX0FCSV9WRVJTSU9OXzA7CisJbXlfdmVycy5hYmlfdmVyc2lvbl8xID0gV01JX0FCSV9WRVJTSU9OXzE7CisJbXlfdmVycy5hYmlfdmVyc2lvbl9uc18wID0gV01JX0FCSV9WRVJTSU9OX05TXzA7CisJbXlfdmVycy5hYmlfdmVyc2lvbl9uc18xID0gV01JX0FCSV9WRVJTSU9OX05TXzE7CisJbXlfdmVycy5hYmlfdmVyc2lvbl9uc18yID0gV01JX0FCSV9WRVJTSU9OX05TXzI7CisJbXlfdmVycy5hYmlfdmVyc2lvbl9uc18zID0gV01JX0FCSV9WRVJTSU9OX05TXzM7CisKKwl3bWlfY21wX2FuZF9zZXRfYWJpX3ZlcnNpb24obnVtX3doaXRlbGlzdCwgdmVyc2lvbl93aGl0ZWxpc3QsCisJCQkJICAgICZteV92ZXJzLAorCQkJCSAgICAmcGFyYW1fYnVmLT5maXhlZF9wYXJhbS0+ZndfYWJpX3ZlcnMsCisJCQkJICAgICZjbWQtPmhvc3RfYWJpX3ZlcnMpOworCisJV01BX0xPR0QoIiVzOiBJTklUX0NNRCB2ZXJzaW9uOiAlZCwgJWQsIDB4JXgsIDB4JXgsIDB4JXgsIDB4JXgiLAorCQkgX19mdW5jX18sIFdNSV9WRVJfR0VUX01BSk9SKGNtZC0+aG9zdF9hYmlfdmVycy5hYmlfdmVyc2lvbl8wKSwKKwkJIFdNSV9WRVJfR0VUX01JTk9SKGNtZC0+aG9zdF9hYmlfdmVycy5hYmlfdmVyc2lvbl8wKSwKKwkJIGNtZC0+aG9zdF9hYmlfdmVycy5hYmlfdmVyc2lvbl9uc18wLAorCQkgY21kLT5ob3N0X2FiaV92ZXJzLmFiaV92ZXJzaW9uX25zXzEsCisJCSBjbWQtPmhvc3RfYWJpX3ZlcnMuYWJpX3ZlcnNpb25fbnNfMiwKKwkJIGNtZC0+aG9zdF9hYmlfdmVycy5hYmlfdmVyc2lvbl9uc18zKTsKKworCWNkZl9tZW1fY29weSgmd21hX2hhbmRsZS0+ZmluYWxfYWJpX3ZlcnMsICZjbWQtPmhvc3RfYWJpX3ZlcnMsCisJCSAgICAgc2l6ZW9mKHdtaV9hYmlfdmVyc2lvbikpOworCXJldHVybiBidWY7Cit9CisKKy8qKgorICogd21hX2R1bXBfZGJzX2h3X21vZGUoKSAtIFByaW50IHRoZSBEQlMgSFcgbW9kZXMKKyAqIEB3bWFfaGFuZGxlOiBXTUEgaGFuZGxlCisgKgorICogUHJpbnRzIHRoZSBEQlMgSFcgbW9kZXMgc2VudCBieSB0aGUgRlcgYXMgcGFydAorICogb2YgV01JIHJlYWR5IGV2ZW50CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd21hX2R1bXBfZGJzX2h3X21vZGUodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCXVpbnQzMl90IGksIHBhcmFtOworCisJaWYgKCF3bWFfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IHdtYV9oYW5kbGUtPm51bV9kYnNfaHdfbW9kZXM7IGkrKykgeworCQlwYXJhbSA9IHdtYV9oYW5kbGUtPmh3X21vZGUuaHdfbW9kZV9saXN0W2ldOworCQlXTUFfTE9HQSgiJXM6WyVkXS1NQUMwOiB0eF9zczolZCByeF9zczolZCBid19pZHg6JWQiLAorCQkJX19mdW5jX18sIGksCisJCQlXTUlfREJTX0hXX01PREVfTUFDMF9UWF9TVFJFQU1TX0dFVChwYXJhbSksCisJCQlXTUlfREJTX0hXX01PREVfTUFDMF9SWF9TVFJFQU1TX0dFVChwYXJhbSksCisJCQlXTUlfREJTX0hXX01PREVfTUFDMF9CQU5EV0lEVEhfR0VUKHBhcmFtKSk7CisJCVdNQV9MT0dBKCIlczpbJWRdLU1BQzE6IHR4X3NzOiVkIHJ4X3NzOiVkIGJ3X2lkeDolZCIsCisJCQlfX2Z1bmNfXywgaSwKKwkJCVdNSV9EQlNfSFdfTU9ERV9NQUMxX1RYX1NUUkVBTVNfR0VUKHBhcmFtKSwKKwkJCVdNSV9EQlNfSFdfTU9ERV9NQUMxX1JYX1NUUkVBTVNfR0VUKHBhcmFtKSwKKwkJCVdNSV9EQlNfSFdfTU9ERV9NQUMxX0JBTkRXSURUSF9HRVQocGFyYW0pKTsKKwkJV01BX0xPR0EoIiVzOlslZF0gREJTOiVkIEFnaWxlIERGUzolZCIsIF9fZnVuY19fLCBpLAorCQkJV01JX0RCU19IV19NT0RFX0RCU19NT0RFX0dFVChwYXJhbSksCisJCQlXTUlfREJTX0hXX01PREVfQUdJTEVfREZTX0dFVChwYXJhbSkpOworCX0KK30KKworLyoqCisgKiB3bWFfaW5pdF9zY2FuX2Z3X21vZGVfY29uZmlnKCkgLSBJbml0aWFsaXplIHNjYW4vZncgbW9kZSBjb25maWcKKyAqIEB3bWFfaGFuZGxlOiBXTUEgaGFuZGxlCisgKgorICogRW5hYmxlcyBhbGwgdGhlIHZhbGlkIGJpdHMgb2YgY29uY3VycmVudF9zY2FuX2NvbmZpZ19iaXRzIGFuZAorICogZndfbW9kZV9jb25maWdfYml0cy4KKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCB3bWFfaW5pdF9zY2FuX2Z3X21vZGVfY29uZmlnKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSkKK3sKKwl0cEFuaVNpckdsb2JhbCBtYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisKKwlXTUFfTE9HRCgiJXM6IEVudGVyIiwgX19mdW5jX18pOworCisJaWYgKCFtYWMpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIG1hYyBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl3bWFfaGFuZGxlLT5kdWFsX21hY19jZmcuY3VyX3NjYW5fY29uZmlnID0gMDsKKwl3bWFfaGFuZGxlLT5kdWFsX21hY19jZmcuY3VyX2Z3X21vZGVfY29uZmlnID0gMDsKKworCS8qIElmIGR1YWwgbWFjIGZlYXR1cmVzIGFyZSBkaXNhYmxlZCBpbiB0aGUgSU5JLCB3ZQorCSAqIG5lZWQgbm90IHByb2NlZWQgZnVydGhlcgorCSAqLworCWlmIChtYWMtPmR1YWxfbWFjX2ZlYXR1cmVfZGlzYWJsZSkgeworCQlXTUFfTE9HRSgiJXM6IERpc2FibGluZyBkdWFsIG1hYyBjYXBhYmlsaXRpZXMiLCBfX2Z1bmNfXyk7CisJCS8qIEFsbCBjYXBhYmlsaXRlcyBhcmUgaW5pdGlhbGl6ZWQgdG8gMC4gV2UgY2FuIHJldHVybiAqLworCQlnb3RvIGRvbmU7CisJfQorCisJLyogVGhlIGlucHV0IGZyb20gRlcgdGVhbSBpcyB0aGF0LCBieSBkZWZhdWx0IGFsbCB0aGUKKwkgKiBiaXRzIG9mIGNvbmN1cnJlbnRfc2Nhbl9jb25maWdfYml0cyBhbmQKKwkgKiBGV19tb2RlX2NvbmZpZ19iaXRzIHdpbGwgYmUgZW5hYmxlZC4gU28sCisJICogZW5hYmxpbmcgYWxsIHRoZSBiaXRzIGhlcmUuIEFkZGluZyB0aGlzIEFQSSBzbyB0aGF0CisJICogaW4gdGhlIGZ1dHVyZS92YXJpYW50IGNoaXBzZXRzLCB3aGVuIG5vdCBhbGwgYml0cyBhcmUKKwkgKiBlbmFibGVkLCBGVyBjYW4gc2VuZCB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uIG9mIHRoZSBhYm92ZQorCSAqIHR3byBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBzZXJ2aWNlIHJlYWR5IGV2ZW50IGFuZCB0aGV5CisJICogY2FuIGJlIGluaXRpYWxpemVkIGhlcmUuCisJICovCisJLyogSW5pdGlhbGl6ZSBjb25jdXJyZW50X3NjYW5fY29uZmlnX2JpdHMgKi8KKwlXTUlfREJTX0NPTkNfU0NBTl9DRkdfREJTX1NDQU5fU0VUKAorCQkJd21hX2hhbmRsZS0+ZHVhbF9tYWNfY2ZnLmN1cl9zY2FuX2NvbmZpZywgMSk7CisJV01JX0RCU19DT05DX1NDQU5fQ0ZHX0FHSUxFX1NDQU5fU0VUKAorCQkJd21hX2hhbmRsZS0+ZHVhbF9tYWNfY2ZnLmN1cl9zY2FuX2NvbmZpZywgMSk7CisJV01JX0RCU19DT05DX1NDQU5fQ0ZHX0FHSUxFX0RGU19TQ0FOX1NFVCgKKwkJCXdtYV9oYW5kbGUtPmR1YWxfbWFjX2NmZy5jdXJfc2Nhbl9jb25maWcsIDEpOworCisJLyogSW5pdGlhbGl6ZSBGV19tb2RlX2NvbmZpZ19iaXRzICovCisJV01JX0RCU19GV19NT0RFX0NGR19EQlNfU0VUKAorCQkJd21hX2hhbmRsZS0+ZHVhbF9tYWNfY2ZnLmN1cl9md19tb2RlX2NvbmZpZywgMSk7CisJV01JX0RCU19GV19NT0RFX0NGR19BR0lMRV9ERlNfU0VUKAorCQkJd21hX2hhbmRsZS0+ZHVhbF9tYWNfY2ZnLmN1cl9md19tb2RlX2NvbmZpZywgMSk7Citkb25lOgorCS8qIEluaXRpYWxpemUgdGhlIHByZXZpb3VzIHNjYW4vZncgbW9kZSBjb25maWcgKi8KKwl3bWFfaGFuZGxlLT5kdWFsX21hY19jZmcucHJldl9zY2FuX2NvbmZpZyA9CisJCXdtYV9oYW5kbGUtPmR1YWxfbWFjX2NmZy5jdXJfc2Nhbl9jb25maWc7CisJd21hX2hhbmRsZS0+ZHVhbF9tYWNfY2ZnLnByZXZfZndfbW9kZV9jb25maWcgPQorCQl3bWFfaGFuZGxlLT5kdWFsX21hY19jZmcuY3VyX2Z3X21vZGVfY29uZmlnOworCisJV01BX0xPR0QoIiVzOiBjdXJfc2Nhbl9jb25maWc6JXggY3VyX2Z3X21vZGVfY29uZmlnOiV4IiwKKwkJCV9fZnVuY19fLAorCQkJd21hX2hhbmRsZS0+ZHVhbF9tYWNfY2ZnLmN1cl9zY2FuX2NvbmZpZywKKwkJCXdtYV9oYW5kbGUtPmR1YWxfbWFjX2NmZy5jdXJfZndfbW9kZV9jb25maWcpOworfQorCisvKioKKyAqIHdtYV9yeF9zZXJ2aWNlX3JlYWR5X2V2ZW50KCkgLSBldmVudCBoYW5kbGVyIHRvIHByb2Nlc3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bWkgcnggc2V2aWNlIHJlYWR5IGV2ZW50LgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGNtZF9wYXJhbV9pbmZvOiBjb21tYW5kIHBhcmFtcyBpbmZvCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3J4X3NlcnZpY2VfcmVhZHlfZXZlbnQoV01BX0hBTkRMRSBoYW5kbGUsIHZvaWQgKmNtZF9wYXJhbV9pbmZvKQoreworCXdtaV9idWZfdCBidWY7CisJdWludDMyX3QgbGVuOworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJc3RydWN0IHdtYV90YXJnZXRfY2FwIHRhcmdldF9jYXA7CisJV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX3NlcnZpY2VfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW0gKmV2OworCWludCBzdGF0dXM7CisJdWludDMyX3QgKmV2X3dsYW5fZGJzX2h3X21vZGVfbGlzdDsKKworCVdNQV9MT0dEKCIlczogRW50ZXIiLCBfX2Z1bmNfXyk7CisKKwlwYXJhbV9idWYgPSAoV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF9wYXJhbV90bHZzICopIGNtZF9wYXJhbV9pbmZvOworCWlmICghKGhhbmRsZSAmJiBwYXJhbV9idWYpKSB7CisJCVdNQV9MT0dQKCIlczogSW52YWxpZCBhcmd1bWVudHMiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlldiA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJaWYgKCFldikgeworCQlXTUFfTE9HUCgiJXM6IEludmFsaWQgYnVmZmVyIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJV01BX0xPR0EoIldNQSA8LS0gV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRCIpOworCisJd21hX2hhbmRsZS0+bnVtX2Ric19od19tb2RlcyA9IGV2LT5udW1fZGJzX2h3X21vZGVzOworCWV2X3dsYW5fZGJzX2h3X21vZGVfbGlzdCA9IHBhcmFtX2J1Zi0+d2xhbl9kYnNfaHdfbW9kZV9saXN0OworCXdtYV9oYW5kbGUtPmh3X21vZGUuaHdfbW9kZV9saXN0ID0KKwkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCp3bWFfaGFuZGxlLT5od19tb2RlLmh3X21vZGVfbGlzdCkgKgorCQkJCXdtYV9oYW5kbGUtPm51bV9kYnNfaHdfbW9kZXMpOworCWlmICghd21hX2hhbmRsZS0+aHdfbW9kZS5od19tb2RlX2xpc3QpIHsKKwkJV01BX0xPR0UoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIERCUyIsIF9fZnVuY19fKTsKKwkJLyogQ29udGludWluZyB3aXRoIHRoZSByZXN0IG9mIHRoZSBwcm9jZXNzaW5nICovCisJfQorCWNkZl9tZW1fY29weSh3bWFfaGFuZGxlLT5od19tb2RlLmh3X21vZGVfbGlzdCwKKwkJCWV2X3dsYW5fZGJzX2h3X21vZGVfbGlzdCwKKwkJCShzaXplb2YoKndtYV9oYW5kbGUtPmh3X21vZGUuaHdfbW9kZV9saXN0KSAqCisJCQkJCQl3bWFfaGFuZGxlLT5udW1fZGJzX2h3X21vZGVzKSk7CisKKwl3bWFfZHVtcF9kYnNfaHdfbW9kZSh3bWFfaGFuZGxlKTsKKworCXdtYV9pbml0X3NjYW5fZndfbW9kZV9jb25maWcod21hX2hhbmRsZSk7CisKKwl3bWFfaGFuZGxlLT5waHlfY2FwYWJpbGl0eSA9IGV2LT5waHlfY2FwYWJpbGl0eTsKKwl3bWFfaGFuZGxlLT5tYXhfZnJhZ19lbnRyeSA9IGV2LT5tYXhfZnJhZ19lbnRyeTsKKwl3bWFfaGFuZGxlLT5udW1fcmZfY2hhaW5zID0gZXYtPm51bV9yZl9jaGFpbnM7CisJY2RmX21lbV9jb3B5KCZ3bWFfaGFuZGxlLT5yZWdfY2FwLCBwYXJhbV9idWYtPmhhbF9yZWdfY2FwYWJpbGl0aWVzLAorCQkgICAgIHNpemVvZihIQUxfUkVHX0NBUEFCSUxJVElFUykpOworCXdtYV9oYW5kbGUtPmh0X2NhcF9pbmZvID0gZXYtPmh0X2NhcF9pbmZvOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJd21hX2hhbmRsZS0+dmh0X2NhcF9pbmZvID0gZXYtPnZodF9jYXBfaW5mbzsKKwl3bWFfaGFuZGxlLT52aHRfc3VwcF9tY3MgPSBldi0+dmh0X3N1cHBfbWNzOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMUFDICovCisJd21hX2hhbmRsZS0+bnVtX3JmX2NoYWlucyA9IGV2LT5udW1fcmZfY2hhaW5zOworCisJd21hX2hhbmRsZS0+dGFyZ2V0X2Z3X3ZlcnNpb24gPSBldi0+ZndfYnVpbGRfdmVyczsKKwlvbF90eF9zZXRfZGVzY19nbG9iYWxfcG9vbF9zaXplKGV2LT5udW1fbXNkdV9kZXNjKTsKKwl3bWFfaGFuZGxlLT5uZXdfaHdfbW9kZV9pbmRleCA9IGV2LT5kZWZhdWx0X2Ric19od19tb2RlX2luZGV4OworCisJV01BX0xPR0QoIiVzOiBGaXJtd2FyZSBkZWZhdWx0IGh3IG1vZGUgaW5kZXggOiAlZCIsCisJCSBfX2Z1bmNfXywgZXYtPmRlZmF1bHRfZGJzX2h3X21vZGVfaW5kZXgpOworCVdNQV9MT0dFKCIlczogRmlybXdhcmUgYnVpbGQgdmVyc2lvbiA6ICUwOHgiLAorCQkgX19mdW5jX18sIGV2LT5md19idWlsZF92ZXJzKTsKKworCWlmIChldi0+aHdfYmRfaWQpIHsKKwkJd21hX2hhbmRsZS0+aHdfYmRfaWQgPSBldi0+aHdfYmRfaWQ7CisJCWNkZl9tZW1fY29weSh3bWFfaGFuZGxlLT5od19iZF9pbmZvLAorCQkJICAgICBldi0+aHdfYmRfaW5mbywgc2l6ZW9mKGV2LT5od19iZF9pbmZvKSk7CisKKwkJV01BX0xPR0UoIiVzOiBCb2FyZCB2ZXJzaW9uOiAleC4leCIsCisJCQkgX19mdW5jX18sCisJCQkgd21hX2hhbmRsZS0+aHdfYmRfaW5mb1swXSwgd21hX2hhbmRsZS0+aHdfYmRfaW5mb1sxXSk7CisJfSBlbHNlIHsKKwkJd21hX2hhbmRsZS0+aHdfYmRfaWQgPSAwOworCQljZGZfbWVtX3plcm8od21hX2hhbmRsZS0+aHdfYmRfaW5mbywKKwkJCSAgICAgc2l6ZW9mKHdtYV9oYW5kbGUtPmh3X2JkX2luZm8pKTsKKwkJV01BX0xPR0UoIiVzOiBCb2FyZCB2ZXJzaW9uIGlzIHVua25vd24hIiwgX19mdW5jX18pOworCX0KKworCS8qIFRPRE86IFJlY2hlY2sgYmVsb3cgbGluZSB0byBkdW1wIHNlcnZpY2UgcmVhZHkgZXZlbnQgKi8KKwkvKiBkYmdfcHJpbnRfd21pX3NlcnZpY2VfMTFhYyhldik7ICovCisKKwkvKiB3bWkgc2VydmljZSBpcyByZWFkeSAqLworCWNkZl9tZW1fY29weSh3bWFfaGFuZGxlLT53bWlfc2VydmljZV9iaXRtYXAsCisJCSAgICAgcGFyYW1fYnVmLT53bWlfc2VydmljZV9iaXRtYXAsCisJCSAgICAgc2l6ZW9mKHdtYV9oYW5kbGUtPndtaV9zZXJ2aWNlX2JpdG1hcCkpOworCS8qIFNXQkEgZXZlbnQgaGFuZGxlciBmb3IgYmVhY29uIHRyYW5zbWlzc2lvbiAqLworCXN0YXR1cyA9IHdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgICBXTUlfSE9TVF9TV0JBX0VWRU5USUQsCisJCQkJCQkgICAgd21hX2JlYWNvbl9zd2JhX2hhbmRsZXIpOworCWlmIChzdGF0dXMpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byByZWdpc3RlciBzd2JhIGJlYWNvbiBldmVudCBjYiIpOworCQlyZXR1cm47CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9MUFNTCisJd21hX2hhbmRsZS0+bHBzc19zdXBwb3J0ID0KKwkJV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWFfaGFuZGxlLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJICAgICAgIFdNSV9TRVJWSUNFX0xQQVNTKTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTFBTUyAqLworCisJLyoKKwkgKiBUaGlzIFNlcnZpY2UgYml0IGlzIGFkZGVkIHRvIGNoZWNrIGZvciBBUlAvTlMgT2ZmbG9hZAorCSAqIHN1cHBvcnQgZm9yIExML0hMIHRhcmdldHMKKwkgKi8KKwl3bWFfaGFuZGxlLT5hcF9hcnBuc19zdXBwb3J0ID0KKwkJV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWFfaGFuZGxlLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJV01JX1NFUlZJQ0VfQVBfQVJQTlNfT0ZGTE9BRCk7CisKKwlpZiAoV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWFfaGFuZGxlLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJICAgV01JX1NFUlZJQ0VfQ1NBX09GRkxPQUQpKSB7CisJCVdNQV9MT0dEKCIlczogRlcgc3VwcG9ydCBDU0Egb2ZmbG9hZCBjYXBhYmlsaXR5IiwgX19mdW5jX18pOworCQlzdGF0dXMgPQorCQkJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkJCSAgIFdNSV9DU0FfSEFORExJTkdfRVZFTlRJRCwKKwkJCQkJCQkgICB3bWFfY3NhX29mZmxvYWRfaGFuZGxlcik7CisJCWlmIChzdGF0dXMpIHsKKwkJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgQ1NBIG9mZmxvYWQgZXZlbnQgY2IiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlmIChXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYV9oYW5kbGUtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkgICBXTUlfU0VSVklDRV9NR01UX1RYX1dNSSkpIHsKKwkJV01BX0xPR0UoIkZpcm13YXJlIHN1cHBvcnRzIG1hbmFnZW1lbnQgVFggb3ZlciBXTUksdXNlIFdNSSBpbnRlcmZhY2UgaW5zdGVhZCBvZiBIVFQgZm9yIG1hbmFnZW1lbnQgVHgiKTsKKwkJc3RhdHVzID0gd21pX2Rlc2NfcG9vbF9pbml0KHdtYV9oYW5kbGUsIFdNSV9ERVNDX1BPT0xfTUFYKTsKKwkJaWYgKHN0YXR1cykgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIHdtaSBkZXNjcmlwdG9yIHBvb2wiKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKgorCQkgKiBSZWdpc3RlciBUeCBjb21wbGV0aW9uIGV2ZW50IGhhbmRsZXIgZm9yIE1HTVQgVHggb3ZlciBXTUkKKwkJICogY2FzZQorCQkgKi8KKwkJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcigKKwkJCQkJd21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJV01JX01HTVRfVFhfQ09NUExFVElPTl9FVkVOVElELAorCQkJCQl3bWFfbWdtdF90eF9jb21wbGV0aW9uX2hhbmRsZXIpOworCQlpZiAoc3RhdHVzKSB7CisJCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHJlZ2lzdGVyIE1HTVQgb3ZlciBXTUkgY29tcGxldGlvbiBoYW5kbGVyIik7CisJCQlyZXR1cm47CisJCX0KKworCX0gZWxzZSB7CisJCVdNQV9MT0dFKCJGVyBkb2Vzbm90IHN1cHBvcnQgV01JX1NFUlZJQ0VfTUdNVF9UWF9XTUksIFVzZSBIVFQgaW50ZXJmYWNlIGZvciBNYW5hZ2VtZW50IFR4Iik7CisJfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCWlmIChXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYV9oYW5kbGUtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkgICBXTUlfU0VSVklDRV9HVEtfT0ZGTE9BRCkpIHsKKwkJc3RhdHVzID0KKwkJCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCQkgICBXTUlfR1RLX09GRkxPQURfU1RBVFVTX0VWRU5USUQsCisJCQkJCQkJICAgd21hX2d0a19vZmZsb2FkX3N0YXR1c19ldmVudCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgR1RLIG9mZmxvYWQgZXZlbnQgY2IiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQgKi8KKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgICBXTUlfUDJQX05PQV9FVkVOVElELAorCQkJCQkJICAgIHdtYV9wMnBfbm9hX2V2ZW50X2hhbmRsZXIpOworCWlmIChzdGF0dXMpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byByZWdpc3RlciBXTUlfUDJQX05PQV9FVkVOVElEIGNhbGxiYWNrIik7CisJCXJldHVybjsKKwl9CisJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkJICAgIFdNSV9UQlRUT0ZGU0VUX1VQREFURV9FVkVOVElELAorCQkJCQkJICAgIHdtYV90YnR0b2Zmc2V0X3VwZGF0ZV9ldmVudF9oYW5kbGVyKTsKKwlpZiAoc3RhdHVzKSB7CisJCVdNQV9MT0dFCisJCQkoIkZhaWxlZCB0byByZWdpc3RlciBXTUlfVEJUVE9GRlNFVF9VUERBVEVfRVZFTlRJRCBjYWxsYmFjayIpOworCQlyZXR1cm47CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgbG9nIHN1cHBvcnRlZCBldmVudCBoYW5kbGVyICovCisJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJV01JX0RJQUdfRVZFTlRfTE9HX1NVUFBPUlRFRF9FVkVOVElELAorCQkJd21hX2xvZ19zdXBwb3J0ZWRfZXZ0X2hhbmRsZXIpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgbG9nIHN1cHBvcnRlZCBldmVudCBjYiIpOworCQlyZXR1cm47CisJfQorCisJY2RmX21lbV9jb3B5KHRhcmdldF9jYXAud21pX3NlcnZpY2VfYml0bWFwLAorCQkgICAgIHBhcmFtX2J1Zi0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkgICAgIHNpemVvZih3bWFfaGFuZGxlLT53bWlfc2VydmljZV9iaXRtYXApKTsKKwl0YXJnZXRfY2FwLndsYW5fcmVzb3VyY2VfY29uZmlnID0gd21hX2hhbmRsZS0+d2xhbl9yZXNvdXJjZV9jb25maWc7CisJd21hX3VwZGF0ZV9md19jb25maWcod21hX2hhbmRsZSwgJnRhcmdldF9jYXApOworCWNkZl9tZW1fY29weSh3bWFfaGFuZGxlLT53bWlfc2VydmljZV9iaXRtYXAsCisJCSAgICAgdGFyZ2V0X2NhcC53bWlfc2VydmljZV9iaXRtYXAsCisJCSAgICAgc2l6ZW9mKHdtYV9oYW5kbGUtPndtaV9zZXJ2aWNlX2JpdG1hcCkpOworCXdtYV9oYW5kbGUtPndsYW5fcmVzb3VyY2VfY29uZmlnID0gdGFyZ2V0X2NhcC53bGFuX3Jlc291cmNlX2NvbmZpZzsKKworCWJ1ZiA9IHdtYV9zZXR1cF93bWlfaW5pdF9tc2cod21hX2hhbmRsZSwgZXYsIHBhcmFtX2J1ZiwgJmxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXR1cCBidWZmZXIgZm9yIHdtYSBpbml0IGNvbW1hbmQiKTsKKwkJcmV0dXJuOworCX0KKworCVdNQV9MT0dBKCJXTUEgLS0+IFdNSV9JTklUX0NNRElEIik7CisJc3RhdHVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQlXTUlfSU5JVF9DTURJRCk7CisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIFdNSV9JTklUX0NNRElEIGNvbW1hbmQiKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogd21hX3J4X3NlcnZpY2VfcmVhZHlfZXh0X2V2ZW50KCkgLSBldnQgaGFuZGxlciBmb3Igc2V2aWNlIHJlYWR5IGV4dCBldmVudC4KKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBldmVudDogcGFyYW1zIG9mIHRoZSBzZXJ2aWNlIHJlYWR5IGV4dGVuZGVkIGV2ZW50CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3J4X3NlcnZpY2VfcmVhZHlfZXh0X2V2ZW50KFdNQV9IQU5ETEUgaGFuZGxlLCB2b2lkICpldmVudCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCVdNSV9TRVJWSUNFX1JFQURZX0VYVF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfc2VydmljZV9yZWFkeV9leHRfZXZlbnRfZml4ZWRfcGFyYW0gKmV2OworCWludCBzdGF0dXM7CisJQ0RGX1NUQVRVUyByZXQ7CisKKwlXTUFfTE9HRCgiJXM6IEVudGVyIiwgX19mdW5jX18pOworCisJaWYgKCF3bWFfaGFuZGxlKSB7CisJCVdNQV9MT0dQKCIlczogSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcGFyYW1fYnVmID0gKFdNSV9TRVJWSUNFX1JFQURZX0VYVF9FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnQ7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR1AoIiVzOiBJbnZhbGlkIGV2ZW50IiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJZXYgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCWlmICghZXYpIHsKKwkJV01BX0xPR1AoIiVzOiBJbnZhbGlkIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCVdNQV9MT0dBKCJXTUEgPC0tIFdNSV9TRVJWSUNFX1JFQURZX0VYVF9FVkVOVElEIik7CisKKwlpZiAoIXdtYV9oYW5kbGUtPnNhdmVkX3dtaV9pbml0X2NtZC5idWYpIHsKKwkJV01BX0xPR1AoIlNlcnZpY2UgcmVhZHkgZXh0IGV2ZW50IHcvbyBXTUlfU0VSVklDRV9FWFRfTVNHISIpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gY2RmX2V2ZW50X3NldCgmd21hX2hhbmRsZS0+c2VydmljZV9yZWFkeV9leHRfZXZ0KTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHJldCkgeworCQlXTUFfTE9HUCgiRmFpbGVkIHRvIHNldCBzZXJ2aWNlX3JlYWR5X2V4dF9ldnQiKTsKKwkJcmV0dXJuOworCX0KKworCVdNQV9MT0dBKCJXTUEgLS0+IFdNSV9JTklUX0NNRElEIik7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCXdtYV9oYW5kbGUtPnNhdmVkX3dtaV9pbml0X2NtZC5idWYsCisJCQkJd21hX2hhbmRsZS0+c2F2ZWRfd21pX2luaXRfY21kLmJ1Zl9sZW4sCisJCQkJV01JX0lOSVRfQ01ESUQpOworCWlmIChzdGF0dXMgIT0gRU9LKSB7CisJCS8qIEluIHN1Y2Nlc3MgY2FzZSwgV01JIGxheWVyIHdpbGwgZnJlZSBhZnRlciBnZXR0aW5nIGNvcHkKKwkJICogZW5naW5lIFRYIGNvbXBsZXRlIGludGVycnVwdAorCQkgKi8KKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIFdNSV9JTklUX0NNRElEIGNvbW1hbmQiKTsKKwkJd21pX2J1Zl9mcmVlKHdtYV9oYW5kbGUtPnNhdmVkX3dtaV9pbml0X2NtZC5idWYpOworCX0KKwl3bWFfaGFuZGxlLT5zYXZlZF93bWlfaW5pdF9jbWQuYnVmID0gTlVMTDsKKworfQorCisvKioKKyAqIHdtYV9yeF9yZWFkeV9ldmVudCgpIC0gZXZlbnQgaGFuZGxlciB0byBwcm9jZXNzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdtaSByeCByZWFkeSBldmVudC4KKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogY29tbWFuZCBwYXJhbXMgaW5mbworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9yeF9yZWFkeV9ldmVudChXTUFfSEFORExFIGhhbmRsZSwgdm9pZCAqY21kX3BhcmFtX2luZm8pCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlXTUlfUkVBRFlfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWYgPSBOVUxMOworCXdtaV9yZWFkeV9ldmVudF9maXhlZF9wYXJhbSAqZXYgPSBOVUxMOworCisJV01BX0xPR0QoIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKworCXBhcmFtX2J1ZiA9IChXTUlfUkVBRFlfRVZFTlRJRF9wYXJhbV90bHZzICopIGNtZF9wYXJhbV9pbmZvOworCWlmICghKHdtYV9oYW5kbGUgJiYgcGFyYW1fYnVmKSkgeworCQlXTUFfTE9HUCgiJXM6IEludmFsaWQgYXJndW1lbnRzIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm47CisJfQorCisJV01BX0xPR0EoIldNQSA8LS0gV01JX1JFQURZX0VWRU5USUQiKTsKKworCWV2ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwkvKiBJbmRpY2F0ZSB0byB0aGUgd2FpdGluZyB0aHJlYWQgdGhhdCB0aGUgcmVhZHkKKwkgKiBldmVudCB3YXMgcmVjZWl2ZWQgKi8KKwl3bWFfaGFuZGxlLT53bWlfcmVhZHkgPSB0cnVlOworCXdtYV9oYW5kbGUtPndsYW5faW5pdF9zdGF0dXMgPSBldi0+c3RhdHVzOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGNoZWNrIHRoZSBXTUkgdmVyc2lvbnMgYW5kIG1ha2Ugc3VyZSBib3RoCisJICogaG9zdCBhbmQgZncgYXJlIGNvbXBhdGlibGUuCisJICovCisJaWYgKCF3bWlfdmVyc2lvbnNfYXJlX2NvbXBhdGlibGUoJndtYV9oYW5kbGUtPmZpbmFsX2FiaV92ZXJzLAorCQkJCQkgJmV2LT5md19hYmlfdmVycykpIHsKKwkJLyoKKwkJICogRXJyb3I6IE91ciBob3N0IHZlcnNpb24gYW5kIHRoZSBnaXZlbiBmaXJtd2FyZSB2ZXJzaW9uCisJCSAqIGFyZSBpbmNvbXBhdGlibGUuCisJCSAqLworCQlXTUFfTE9HRSgiJXM6IEVycm9yOiBJbmNvbXBhdGlibGUgV01JIHZlcnNpb24uIgorCQkJICJIb3N0OiAlZCwlZCwweCV4IDB4JXggMHgleCAweCV4LCBGVzogJWQsJWQsMHgleCAweCV4IDB4JXggMHgleCIsCisJCQkgX19mdW5jX18sCisJCQkgV01JX1ZFUl9HRVRfTUFKT1Iod21hX2hhbmRsZS0+ZmluYWxfYWJpX3ZlcnMuCisJCQkJCSAgIGFiaV92ZXJzaW9uXzApLAorCQkJIFdNSV9WRVJfR0VUX01JTk9SKHdtYV9oYW5kbGUtPmZpbmFsX2FiaV92ZXJzLgorCQkJCQkgICBhYmlfdmVyc2lvbl8wKSwKKwkJCSB3bWFfaGFuZGxlLT5maW5hbF9hYmlfdmVycy5hYmlfdmVyc2lvbl9uc18wLAorCQkJIHdtYV9oYW5kbGUtPmZpbmFsX2FiaV92ZXJzLmFiaV92ZXJzaW9uX25zXzEsCisJCQkgd21hX2hhbmRsZS0+ZmluYWxfYWJpX3ZlcnMuYWJpX3ZlcnNpb25fbnNfMiwKKwkJCSB3bWFfaGFuZGxlLT5maW5hbF9hYmlfdmVycy5hYmlfdmVyc2lvbl9uc18zLAorCQkJIFdNSV9WRVJfR0VUX01BSk9SKGV2LT5md19hYmlfdmVycy5hYmlfdmVyc2lvbl8wKSwKKwkJCSBXTUlfVkVSX0dFVF9NSU5PUihldi0+ZndfYWJpX3ZlcnMuYWJpX3ZlcnNpb25fMCksCisJCQkgZXYtPmZ3X2FiaV92ZXJzLmFiaV92ZXJzaW9uX25zXzAsCisJCQkgZXYtPmZ3X2FiaV92ZXJzLmFiaV92ZXJzaW9uX25zXzEsCisJCQkgZXYtPmZ3X2FiaV92ZXJzLmFiaV92ZXJzaW9uX25zXzIsCisJCQkgZXYtPmZ3X2FiaV92ZXJzLmFiaV92ZXJzaW9uX25zXzMpOworCQlpZiAod21hX2hhbmRsZS0+d2xhbl9pbml0X3N0YXR1cyA9PSBXTEFOX0lOSVRfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCS8qIEZhaWxlZCB0aGlzIGNvbm5lY3Rpb24gdG8gRlcgKi8KKwkJCXdtYV9oYW5kbGUtPndsYW5faW5pdF9zdGF0dXMgPQorCQkJCVdMQU5fSU5JVF9TVEFUVVNfR0VOX0ZBSUxFRDsKKwkJfQorCX0KKwljZGZfbWVtX2NvcHkoJndtYV9oYW5kbGUtPmZpbmFsX2FiaV92ZXJzLCAmZXYtPmZ3X2FiaV92ZXJzLAorCQkgICAgIHNpemVvZih3bWlfYWJpX3ZlcnNpb24pKTsKKwljZGZfbWVtX2NvcHkoJndtYV9oYW5kbGUtPnRhcmdldF9hYmlfdmVycywgJmV2LT5md19hYmlfdmVycywKKwkJICAgICBzaXplb2Yod21pX2FiaV92ZXJzaW9uKSk7CisKKwkvKiBjb3B5IHRoZSBtYWMgYWRkciAqLworCVdNSV9NQUNfQUREUl9UT19DSEFSX0FSUkFZKCZldi0+bWFjX2FkZHIsIHdtYV9oYW5kbGUtPm15YWRkcik7CisJV01JX01BQ19BRERSX1RPX0NIQVJfQVJSQVkoJmV2LT5tYWNfYWRkciwgd21hX2hhbmRsZS0+aHdhZGRyKTsKKworCXdtYV91cGRhdGVfaGRkX2NmZyh3bWFfaGFuZGxlKTsKKworCWNkZl9ldmVudF9zZXQoJndtYV9oYW5kbGUtPndtYV9yZWFkeV9ldmVudCk7CisKKwlXTUFfTE9HRCgiRXhpdCIpOworfQorCisvKioKKyAqIHdtYV9zZXRuZWVkc2h1dGRvd24oKSAtIHNldHRpbmcgd21hIG5lZWRzaHV0ZG93biBmbGFnCisgKiBAY2RzX2N0eDogY2RzIGNvbnRleHQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfc2V0bmVlZHNodXRkb3duKHZvaWQgKmNkc19jdHgpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlOworCisJV01BX0xPR0QoIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKworCXdtYV9oYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCisJaWYgKE5VTEwgPT0gd21hX2hhbmRsZSkgeworCQlXTUFfTE9HUCgiJXM6IEludmFsaWQgYXJndW1lbnRzIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm47CisJfQorCisJd21hX2hhbmRsZS0+bmVlZFNodXRkb3duID0gdHJ1ZTsKKwlXTUFfTE9HRCgiJXM6IEV4aXQiLCBfX2Z1bmNfXyk7Cit9CisKKy8qKgorICogd21hX25lZWRzaHV0ZG93bigpIC0gSXMgd21hIG5lZWRzIHNodXRkb3duPworICogQGNkc19jdHg6IGNkcyBjb250ZXh0CisgKgorICogUmV0dXJuOiByZXR1cm5zIHRydWUvZmFsc2UKKyAqLworYm9vbCB3bWFfbmVlZHNodXRkb3duKHZvaWQgKmNkc19jdHgpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlOworCisJV01BX0xPR0QoIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKworCXdtYV9oYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCisJaWYgKE5VTEwgPT0gd21hX2hhbmRsZSkgeworCQlXTUFfTE9HUCgiJXM6IEludmFsaWQgYXJndW1lbnRzIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJV01BX0xPR0QoIiVzOiBFeGl0IiwgX19mdW5jX18pOworCXJldHVybiB3bWFfaGFuZGxlLT5uZWVkU2h1dGRvd247Cit9CisKKy8qKgorICogd21hX3dhaXRfZm9yX3JlYWR5X2V2ZW50KCkgLSB3YWl0IGZvciB3bWEgcmVhZHkgZXZlbnQKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgQ0RGIGVycm9yCisgKi8KK0NERl9TVEFUVVMgd21hX3dhaXRfZm9yX3JlYWR5X2V2ZW50KFdNQV9IQU5ETEUgaGFuZGxlKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCisJLyogd2FpdCB1bnRpbCBXTUlfUkVBRFlfRVZFTlRJRCByZWNlaXZlZCBmcm9tIEZXICovCisJY2RmX3N0YXR1cyA9IGNkZl93YWl0X3NpbmdsZV9ldmVudCgmKHdtYV9oYW5kbGUtPndtYV9yZWFkeV9ldmVudCksCisJCQkJCSAgIFdNQV9SRUFEWV9FVkVOVElEX1RJTUVPVVQpOworCisJaWYgKENERl9TVEFUVVNfU1VDQ0VTUyAhPSBjZGZfc3RhdHVzKSB7CisJCVdNQV9MT0dQKCIlczogVGltZW91dCB3YWl0aW5nIGZvciByZWFkeSBldmVudCBmcm9tIEZXIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogd21hX3NldF9wcHNjb25maWcoKSAtIHNldCBwcHMgY29uZmlnIGluIGZ3CisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHBwc19wYXJhbTogcHBzIHBhcmFtcworICogQHZhbCA6IHBhcmFtIHZhbHVlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIENERiBlcnJvcgorICovCitDREZfU1RBVFVTIHdtYV9zZXRfcHBzY29uZmlnKHVpbnQ4X3QgdmRldl9pZCwgdWludDE2X3QgcHBzX3BhcmFtLAorCQkJCSAgICBpbnQgdmFsKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpbnQgcmV0ID0gLUVJTzsKKwl1aW50MzJfdCBwcHNfdmFsOworCisJaWYgKE5VTEwgPT0gd21hKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCB3bWEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJc3dpdGNoIChwcHNfcGFyYW0pIHsKKwljYXNlIFdNQV9WSFRfUFBTX1BBSURfTUFUQ0g6CisJCXBwc192YWwgPSAoKHZhbCA8PCAzMSkgJiAweGZmZmYwMDAwKSB8CisJCQkgIChQS1RfUFdSX1NBVkVfUEFJRF9NQVRDSCAmIDB4ZmZmZik7CisJCWdvdG8gcGt0X3B3cl9zYXZlX2NvbmZpZzsKKwljYXNlIFdNQV9WSFRfUFBTX0dJRF9NQVRDSDoKKwkJcHBzX3ZhbCA9ICgodmFsIDw8IDMxKSAmIDB4ZmZmZjAwMDApIHwKKwkJCSAgKFBLVF9QV1JfU0FWRV9HSURfTUFUQ0ggJiAweGZmZmYpOworCQlnb3RvIHBrdF9wd3Jfc2F2ZV9jb25maWc7CisJY2FzZSBXTUFfVkhUX1BQU19ERUxJTV9DUkNfRkFJTDoKKwkJcHBzX3ZhbCA9ICgodmFsIDw8IDMxKSAmIDB4ZmZmZjAwMDApIHwKKwkJCSAgKFBLVF9QV1JfU0FWRV9ERUxJTV9DUkNfRkFJTCAmIDB4ZmZmZik7CisJCWdvdG8gcGt0X3B3cl9zYXZlX2NvbmZpZzsKKworCQkvKiBFbmFibGUgdGhlIGNvZGUgYmVsb3cgYXMgYW5kIHdoZW4gdGhlIGZ1bmN0aW9uYWxpdHkKKwkJICogaXMgc3VwcG9ydGVkL2FkZGVkIGluIGhvc3QuCisJCSAqLworI2lmZGVmIE5PVF9ZRVQKKwljYXNlIFdNQV9WSFRfUFBTX0VBUkxZX1RJTV9DTEVBUjoKKwkJcHBzX3ZhbCA9ICgodmFsIDw8IDMxKSAmIDB4ZmZmZjAwMDApIHwKKwkJCSAgKFBLVF9QV1JfU0FWRV9FQVJMWV9USU1fQ0xFQVIgJiAweGZmZmYpOworCQlnb3RvIHBrdF9wd3Jfc2F2ZV9jb25maWc7CisJY2FzZSBXTUFfVkhUX1BQU19FQVJMWV9EVElNX0NMRUFSOgorCQlwcHNfdmFsID0gKCh2YWwgPDwgMzEpICYgMHhmZmZmMDAwMCkgfAorCQkJICAoUEtUX1BXUl9TQVZFX0VBUkxZX0RUSU1fQ0xFQVIgJiAweGZmZmYpOworCQlnb3RvIHBrdF9wd3Jfc2F2ZV9jb25maWc7CisJY2FzZSBXTUFfVkhUX1BQU19FT0ZfUEFEX0RFTElNOgorCQlwcHNfdmFsID0gKCh2YWwgPDwgMzEpICYgMHhmZmZmMDAwMCkgfAorCQkJICAoUEtUX1BXUl9TQVZFX0VPRl9QQURfREVMSU0gJiAweGZmZmYpOworCQlnb3RvIHBrdF9wd3Jfc2F2ZV9jb25maWc7CisJY2FzZSBXTUFfVkhUX1BQU19NQUNBRERSX01JU01BVENIOgorCQlwcHNfdmFsID0gKCh2YWwgPDwgMzEpICYgMHhmZmZmMDAwMCkgfAorCQkJICAoUEtUX1BXUl9TQVZFX01BQ0FERFJfTUlTTUFUQ0ggJiAweGZmZmYpOworCQlnb3RvIHBrdF9wd3Jfc2F2ZV9jb25maWc7CisJY2FzZSBXTUFfVkhUX1BQU19HSURfTlNUU19aRVJPOgorCQlwcHNfdmFsID0gKCh2YWwgPDwgMzEpICYgMHhmZmZmMDAwMCkgfAorCQkJICAoUEtUX1BXUl9TQVZFX0dJRF9OU1RTX1pFUk8gJiAweGZmZmYpOworCQlnb3RvIHBrdF9wd3Jfc2F2ZV9jb25maWc7CisJY2FzZSBXTUFfVkhUX1BQU19SU1NJX0NIRUNLOgorCQlwcHNfdmFsID0gKCh2YWwgPDwgMzEpICYgMHhmZmZmMDAwMCkgfAorCQkJICAoUEtUX1BXUl9TQVZFX1JTU0lfQ0hFQ0sgJiAweGZmZmYpOworCQlnb3RvIHBrdF9wd3Jfc2F2ZV9jb25maWc7CisjZW5kaWYgLyogTk9UX1lFVCAqLworcGt0X3B3cl9zYXZlX2NvbmZpZzoKKwkJV01BX0xPR0QoInZkZXZfaWQ6JWQgdmFsOjB4JXggcHBzX3ZhbDoweCV4IiwgdmRldl9pZCwKKwkJCSB2YWwsIHBwc192YWwpOworCQlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwKKwkJCQkJCSAgICAgIFdNSV9WREVWX1BBUkFNX1BBQ0tFVF9QT1dFUlNBVkUsCisJCQkJCQkgICAgICBwcHNfdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV01BX0xPR0UoIiVzOklOVkFMSUQgUFBTIENPTkZJRyIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gKHJldCkgPyBDREZfU1RBVFVTX0VfRkFJTFVSRSA6IENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc19zZXRfbWFzKCkgLSBGdW5jdGlvbiB0byBlbmFibGUvZGlzYWJsZSBNQVMKKyAqIEB3bWE6CVBvaW50ZXIgdG8gV01BIGhhbmRsZQorICogQG1hc192YWw6CTEtRW5hYmxlIE1BUywgMC1EaXNhYmxlIE1BUworICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcy9kaXNhYmxlcyB0aGUgTUFTIHZhbHVlCisgKgorICogUmV0dXJuOiBDREZfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvdGhlcndpc2UgZmFpbHVyZQorICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX3NldF9tYXModHBfd21hX2hhbmRsZSB3bWEsCisJCXVpbnQzMl90ICptYXNfdmFsKQoreworCXVpbnQzMl90IHZhbDsKKworCWlmIChOVUxMID09IHdtYSB8fCBOVUxMID09IG1hc192YWwpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIGlucHV0IHRvIGVuYWJsZS9kaXNhYmxlIE1BUyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXZhbCA9ICgqbWFzX3ZhbCk7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCQl3bWFfc2V0X2VuYWJsZV9kaXNhYmxlX21jY19hZGFwdGl2ZV9zY2hlZHVsZXIodmFsKSkgeworCQlXTUFfTE9HRSgiJXM6IFVuYWJsZSB0byBlbmFibGUvZGlzYWJsZSBNQVMiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9IGVsc2UgeworCQlXTUFfTE9HRSgiJXM6IFZhbHVlIGlzICVkIiwgX19mdW5jX18sIHZhbCk7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc19zZXRfbWlyYWNhc3QoKSAtIEZ1bmN0aW9uIHRvIHNldCBtaXJhY2FzdCB2YWx1ZSBpbiBXTUEKKyAqIEB3bWE6CQlQb2ludGVyIHRvIFdNQSBoYW5kbGUKKyAqIEBtaXJhY2FzdF92YWw6CTAtRGlzYWJsZWQsMS1Tb3VyY2UsMi1TaW5rCisgKgorICogVGhpcyBmdW5jdGlvbiBzdG9yZXMgdGhlIG1pcmFjYXN0IHZhbHVlIGluIFdNQQorICoKKyAqIFJldHVybjogQ0RGX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGZhaWx1cmUKKyAqCisgKi8KK0NERl9TVEFUVVMgd21hX3Byb2Nlc3Nfc2V0X21pcmFjYXN0KHRwX3dtYV9oYW5kbGUgd21hLCB1aW50MzJfdCAqbWlyYWNhc3RfdmFsKQoreworCWlmIChOVUxMID09IHdtYSB8fCBOVUxMID09IG1pcmFjYXN0X3ZhbCkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgaW5wdXQgdG8gc3RvcmUgbWlyYWNhc3QgdmFsdWUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwl3bWEtPm1pcmFjYXN0X3ZhbHVlID0gKm1pcmFjYXN0X3ZhbDsKKwlXTUFfTE9HRSgiJXM6IE1pcmFjYXN0IHZhbHVlIGlzICVkIiwgX19mdW5jX18sIHdtYS0+bWlyYWNhc3RfdmFsdWUpOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfY29uZmlnX3N0YXRzX2ZhY3RvcigpIC0gRnVuY3Rpb24gdG8gY29uZmlndXJlIHN0YXRzIGF2Zy4gZmFjdG9yCisgKiBAd21hOiAgcG9pbnRlciB0byBXTUEgaGFuZGxlCisgKiBAYXZnX2ZhY3RvcjoJc3RhdHMuIGF2Zy4gZmFjdG9yIHBhc3NlZCBkb3duIGJ5IHVzZXJzcGFjZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgYXZnLiBzdGF0cyB2YWx1ZSBpbiBmaXJtd2FyZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGZvciBzdWNjZXNzIG90aGVyd2lzZSBmYWlsdXJlCisgKgorICovCitzdGF0aWMgQ0RGX1NUQVRVUyB3bWFfY29uZmlnX3N0YXRzX2ZhY3Rvcih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgICAgICBzdHJ1Y3Qgc2lyX3N0YXRzX2F2Z19mYWN0b3IgKmF2Z19mYWN0b3IpCit7CisJaW50IHJldDsKKworCWlmIChOVUxMID09IHdtYSB8fCBOVUxMID09IGF2Z19mYWN0b3IpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIGlucHV0IG9mIHN0YXRzIGF2ZyBmYWN0b3IiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJICAgIGF2Z19mYWN0b3ItPnZkZXZfaWQsCisJCQkJCSAgICBXTUlfVkRFVl9QQVJBTV9TVEFUU19BVkdfRkFDVE9SLAorCQkJCQkgICAgYXZnX2ZhY3Rvci0+c3RhdHNfYXZnX2ZhY3Rvcik7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiIGZhaWxlZCB0byBzZXQgYXZnX2ZhY3RvciBmb3IgdmRldl9pZCAlZCIsCisJCQkgYXZnX2ZhY3Rvci0+dmRldl9pZCk7CisJfQorCisJV01BX0xPR0QoIiVzOiBTZXQgc3RhdHNfYXZnX2ZhY3RvciAlZCBmb3IgdmRldl9pZCAlZCIsIF9fZnVuY19fLAorCQkgYXZnX2ZhY3Rvci0+c3RhdHNfYXZnX2ZhY3RvciwgYXZnX2ZhY3Rvci0+dmRldl9pZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtYV9jb25maWdfZ3VhcmRfdGltZSgpIC0gRnVuY3Rpb24gdG8gc2V0IGd1YXJkIHRpbWUgaW4gZmlybXdhcmUKKyAqIEB3bWE6ICBwb2ludGVyIHRvIFdNQSBoYW5kbGUKKyAqIEBndWFyZF90aW1lOiAgZ3VhcmQgdGltZSBwYXNzZWQgZG93biBieSB1c2Vyc3BhY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIGd1YXJkIHRpbWUgaW4gZmlybXdhcmUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvdGhlcndpc2UgZmFpbHVyZQorICoKKyAqLworc3RhdGljIENERl9TVEFUVVMgd21hX2NvbmZpZ19ndWFyZF90aW1lKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCSAgIHN0cnVjdCBzaXJfZ3VhcmRfdGltZV9yZXF1ZXN0ICpndWFyZF90aW1lKQoreworCWludCByZXQ7CisKKwlpZiAoTlVMTCA9PSB3bWEgfHwgTlVMTCA9PSBndWFyZF90aW1lKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBpbnB1dCBvZiBndWFyZCB0aW1lIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCh3bWEtPndtaV9oYW5kbGUsCisJCQkJCSAgICAgIGd1YXJkX3RpbWUtPnZkZXZfaWQsCisJCQkJCSAgICAgIFdNSV9WREVWX1BBUkFNX1JYX0xFQUtfV0lORE9XLAorCQkJCQkgICAgICBndWFyZF90aW1lLT5ndWFyZF90aW1lKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIgZmFpbGVkIHRvIHNldCBndWFyZCB0aW1lIGZvciB2ZGV2X2lkICVkIiwKKwkJCSBndWFyZF90aW1lLT52ZGV2X2lkKTsKKwl9CisKKwlXTUFfTE9HRCgiU2V0IGd1YXJkIHRpbWUgJWQgZm9yIHZkZXZfaWQgJWQiLAorCQkgZ3VhcmRfdGltZS0+Z3VhcmRfdGltZSwgZ3VhcmRfdGltZS0+dmRldl9pZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtYV9lbmFibGVfc3BlY2lmaWNfZndfbG9ncygpIC0gU3RhcnQvU3RvcCBsb2dnaW5nIG9mIGRpYWcgZXZlbnQvbG9nIGlkCisgKiBAd21hX2hhbmRsZTogV01BIGhhbmRsZQorICogQHN0YXJ0X2xvZzogU3RhcnQgbG9nZ2luZyByZWxhdGVkIHBhcmFtZXRlcnMKKyAqCisgKiBTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBGVyBiYXNlZCBvbiB3aGljaCBzcGVjaWZpYyBsb2dnaW5nIG9mIGRpYWcKKyAqIGV2ZW50L2xvZyBpZCBjYW4gYmUgc3RhcnRlZC9zdG9wcGVkCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd21hX2VuYWJsZV9zcGVjaWZpY19md19sb2dzKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJc3RydWN0IHNpcl93aWZpX3N0YXJ0X2xvZyAqc3RhcnRfbG9nKQoreworCXdtaV9kaWFnX2V2ZW50X2xvZ19jb25maWdfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJdWludDMyX3QgbGVuLCBjb3VudCwgbG9nX2xldmVsLCBpOworCXVpbnQzMl90ICpjbWRfYXJnczsKKwl1aW50MzJfdCB0b3RhbF9sZW47CisJY291bnQgPSAwOworCisJaWYgKCFzdGFydF9sb2cpIHsKKwkJV01BX0xPR0UoIiVzOiBzdGFydF9sb2cgcG9pbnRlciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWlmICghd21hX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgd21hIGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghKChzdGFydF9sb2ctPnJpbmdfaWQgPT0gUklOR19JRF9DT05ORUNUSVZJVFkpIHx8CisJCQkoc3RhcnRfbG9nLT5yaW5nX2lkID09IFJJTkdfSURfRklSTVdBUkVfREVCVUcpKSkgeworCQlXTUFfTE9HRCgiJXM6IE5vdCBjb25uZWN0aXZpdHkgb3IgZncgZGVidWcgcmluZzogJWQiLAorCQkJCV9fZnVuY19fLCBzdGFydF9sb2ctPnJpbmdfaWQpOworCQlyZXR1cm47CisJfQorCisJaWYgKCF3bWFfaGFuZGxlLT5ldmVudHNfbG9nc19saXN0KSB7CisJCVdNQV9MT0dFKCIlczogTm90IHJlY2VpdmVkIGV2ZW50L2xvZyBsaXN0IGZyb20gRlcsIHlldCIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyogdG90YWxfbGVuIHN0b3JlcyB0aGUgbnVtYmVyIG9mIGV2ZW50cyB3aGVyZSBCSVRTIDE3IGFuZCAxOCBhcmUgc2V0LgorCSAqIGkuZS4sIGV2ZW50cyBvZiBoaWdoIGZyZXF1ZW5jeSAoMTcpIGFuZCBmb3IgZXh0ZW5kZWQgZGVidWdnaW5nICgxOCkKKwkgKi8KKwl0b3RhbF9sZW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCB3bWFfaGFuZGxlLT5udW1fb2ZfZGlhZ19ldmVudHNfbG9nczsgaSsrKSB7CisJCWlmICgoV01JX0RJQUdfRlJFUVVFTkNZX0dFVCh3bWFfaGFuZGxlLT5ldmVudHNfbG9nc19saXN0W2ldKSkgJiYKKwkJICAgIChXTUlfRElBR19FWFRfRkVBVFVSRV9HRVQod21hX2hhbmRsZS0+ZXZlbnRzX2xvZ3NfbGlzdFtpXSkpKQorCQkJdG90YWxfbGVuKys7CisJfQorCisJbGVuID0gc2l6ZW9mKCpjbWQpICsgV01JX1RMVl9IRFJfU0laRSArCisJCSh0b3RhbF9sZW4gKiBzaXplb2YodWludDMyX3QpKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWNtZCA9ICh3bWlfZGlhZ19ldmVudF9sb2dfY29uZmlnX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSBjbWQ7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkJV01JVExWX1RBR19TVFJVQ193bWlfZGlhZ19ldmVudF9sb2dfY29uZmlnX2ZpeGVkX3BhcmFtLAorCQkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKAorCQkJCXdtaV9kaWFnX2V2ZW50X2xvZ19jb25maWdfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+bnVtX29mX2RpYWdfZXZlbnRzX2xvZ3MgPSB0b3RhbF9sZW47CisKKwlidWZfcHRyICs9IHNpemVvZih3bWlfZGlhZ19ldmVudF9sb2dfY29uZmlnX2ZpeGVkX3BhcmFtKTsKKworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLAorCQkJKHRvdGFsX2xlbiAqIHNpemVvZih1aW50MzJfdCkpKTsKKworCWNtZF9hcmdzID0gKHVpbnQzMl90ICopIChidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisKKwlpZiAoc3RhcnRfbG9nLT52ZXJib3NlX2xldmVsID49IExPR19MRVZFTF9BQ1RJVkUpCisJCWxvZ19sZXZlbCA9IDE7CisJZWxzZQorCQlsb2dfbGV2ZWwgPSAwOworCisJV01BX0xPR0QoIiVzOiBMZW5ndGg6JWQsIExvZ19sZXZlbDolZCIsIF9fZnVuY19fLCB0b3RhbF9sZW4sIGxvZ19sZXZlbCk7CisJZm9yIChpID0gMDsgaSA8IHdtYV9oYW5kbGUtPm51bV9vZl9kaWFnX2V2ZW50c19sb2dzOyBpKyspIHsKKwkJdWludDMyX3QgdmFsID0gd21hX2hhbmRsZS0+ZXZlbnRzX2xvZ3NfbGlzdFtpXTsKKwkJaWYgKChXTUlfRElBR19GUkVRVUVOQ1lfR0VUKHZhbCkpICYmCisJCQkJKFdNSV9ESUFHX0VYVF9GRUFUVVJFX0dFVCh2YWwpKSkgeworCisJCQlXTUlfRElBR19JRF9TRVQoY21kX2FyZ3NbY291bnRdLAorCQkJCQlXTUlfRElBR19JRF9HRVQodmFsKSk7CisJCQlXTUlfRElBR19UWVBFX1NFVChjbWRfYXJnc1tjb3VudF0sCisJCQkJCVdNSV9ESUFHX1RZUEVfR0VUKHZhbCkpOworCQkJV01JX0RJQUdfSURfRU5BQkxFRF9ESVNBQkxFRF9TRVQoY21kX2FyZ3NbY291bnRdLAorCQkJCQlsb2dfbGV2ZWwpOworCQkJV01BX0xPR0QoIiVzOiBJZHg6JWQsIHZhbDoleCIsIF9fZnVuY19fLCBpLCB2YWwpOworCQkJY291bnQrKzsKKwkJfQorCX0KKworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQlXTUlfRElBR19FVkVOVF9MT0dfQ09ORklHX0NNRElEKSkgeworCQlXTUFfTE9HRSgiJXM6IFdNSV9ESUFHX0VWRU5UX0xPR19DT05GSUdfQ01ESUQgZmFpbGVkIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXdtaV9idWZfZnJlZShidWYpOworCX0KKwlyZXR1cm47Cit9CisKKyNpZiAhZGVmaW5lZChSRU1PVkVfUEtUX0xPRykKKy8qKgorICogd21hX3NldF93aWZpX3N0YXJ0X3BhY2tldF9zdGF0cygpIC0gU3RhcnQvc3RvcCBwYWNrZXQgc3RhdHMKKyAqIEB3bWFfaGFuZGxlOiBXTUEgaGFuZGxlCisgKiBAc3RhcnRfbG9nOiBTdHJ1dHVyZSBjb250YWluaW5nIHRoZSBzdGFydCB3aWZpIGxvZ2dlciBwYXJhbXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCB0aGUgV01BIGNvbW1hbmRzIHRvIHN0YXJ0L3N0b3AgbG9nZ2luZworICogb2YgcGVyIHBhY2tldCBzdGF0aXN0aWNzCisgKgorICogUmV0dXJuOiBOb25lCisgKgorICovCit2b2lkIHdtYV9zZXRfd2lmaV9zdGFydF9wYWNrZXRfc3RhdHModm9pZCAqd21hX2hhbmRsZSwKKwkJc3RydWN0IHNpcl93aWZpX3N0YXJ0X2xvZyAqc3RhcnRfbG9nKQoreworCXN0cnVjdCBvbF9zb2Z0YyAqc2NuOworCXVpbnQzMl90IGxvZ19zdGF0ZTsKKworCWlmICghc3RhcnRfbG9nKSB7CisJCVdNQV9MT0dFKCIlczogc3RhcnRfbG9nIHBvaW50ZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIHdtYSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBObyBuZWVkIHRvIHJlZ2lzdGVyIGZvciByaW5nIElEcyBvdGhlciB0aGFuIHBhY2tldCBzdGF0cyAqLworCWlmIChzdGFydF9sb2ctPnJpbmdfaWQgIT0gUklOR19JRF9QRVJfUEFDS0VUX1NUQVRTKSB7CisJCVdNQV9MT0dJKCIlczogUmluZyBpZCBpcyBub3QgZm9yIHBlciBwYWNrZXQgc3RhdHM6ICVkIiwKKwkJCV9fZnVuY19fLCBzdGFydF9sb2ctPnJpbmdfaWQpOworCQlyZXR1cm47CisJfQorCisJc2NuID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfSElGKTsKKworCWxvZ19zdGF0ZSA9IEFUSF9QS1RMT0dfQU5JIHwgQVRIX1BLVExPR19SQ1VQREFURSB8IEFUSF9QS1RMT0dfUkNGSU5EIHwKKwkJQVRIX1BLVExPR19SWCB8IEFUSF9QS1RMT0dfVFggfCBBVEhfUEtUTE9HX1RFWFQ7CisKKwlpZiAoc3RhcnRfbG9nLT52ZXJib3NlX2xldmVsID09IFdMQU5fTE9HX0xFVkVMX0FDVElWRSkgeworCQlwa3Rsb2dfZW5hYmxlKHNjbiwgbG9nX3N0YXRlKTsKKwkJV01BX0xPR0koIiVzOiBFbmFibGluZyBwZXIgcGFja2V0IHN0YXRzIiwgX19mdW5jX18pOworCX0gZWxzZSB7CisJCXBrdGxvZ19lbmFibGUoc2NuLCAwKTsKKwkJV01BX0xPR0koIiVzOiBEaXNhYmxpbmcgcGVyIHBhY2tldCBzdGF0cyIsIF9fZnVuY19fKTsKKwl9Cit9CisjZW5kaWYKKworLyoqCisgKiB3bWFfc2VuZF9mbHVzaF9sb2dzX3RvX2Z3KCkgLSBTZW5kIGxvZyBmbHVzaCBjb21tYW5kIHRvIEZXCisgKiBAd21hX2hhbmRsZTogV01JIGhhbmRsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIHRoZSBmbHVzaCBjb21tYW5kIHRvIHRoZSBGVywKKyAqIHRoYXQgd2lsbCBmbHVzaCB0aGUgZncgbG9ncyB0aGF0IGFyZSByZXNpZHVlIGluIHRoZSBGVworICoKKyAqIFJldHVybjogTm9uZQorICovCit2b2lkIHdtYV9zZW5kX2ZsdXNoX2xvZ3NfdG9fZncodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCUNERl9TVEFUVVMgc3RhdHVzOworCXdtaV9kZWJ1Z19tZXNnX2ZsdXNoX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQgbGVuID0gc2l6ZW9mKCpjbWQpOworCWludCByZXQ7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR1AoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNtZCA9ICh3bWlfZGVidWdfbWVzZ19mbHVzaF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkJV01JVExWX1RBR19TVFJVQ193bWlfZGVidWdfbWVzZ19mbHVzaF9maXhlZF9wYXJhbSwKKwkJCVdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTigKKwkJCQl3bWlfZGVidWdfbWVzZ19mbHVzaF9maXhlZF9wYXJhbSkpOworCWNtZC0+cmVzZXJ2ZWQwID0gMDsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQlidWYsCisJCQlsZW4sCisJCQlXTUlfREVCVUdfTUVTR19GTFVTSF9DTURJRCk7CisJaWYgKHJldCAhPSBFT0spIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIFdNSV9ERUJVR19NRVNHX0ZMVVNIX0NNRElEIik7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm47CisJfQorCVdNQV9MT0dJKCJTZW50IFdNSV9ERUJVR19NRVNHX0ZMVVNIX0NNRElEIHRvIEZXIik7CisKKwlzdGF0dXMgPSBjZGZfbWNfdGltZXJfc3RhcnQoJndtYV9oYW5kbGUtPmxvZ19jb21wbGV0aW9uX3RpbWVyLAorCQkJV01BX0xPR19DT01QTEVUSU9OX1RJTUVSKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzdGFydCB0aGUgbG9nIGNvbXBsZXRpb24gdGltZXIiKTsKK30KKworLyoqCisgKiB3bWFfbWNfcHJvY2Vzc19tc2coKSAtIHByb2Nlc3Mgd21hIG1lc3NhZ2VzIGFuZCBjYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uLgorICogQGNkc19jb250ZXh0OiBjZHMgY29udGV4dAorICogQG1zZzogbWVzc2FnZQorICoKKyAqIFJldHVybjogQ0RGX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGZhaWx1cmUKKyAqLworQ0RGX1NUQVRVUyB3bWFfbWNfcHJvY2Vzc19tc2codm9pZCAqY2RzX2NvbnRleHQsIGNkc19tc2dfdCAqbXNnKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGU7CisJb2xfdHhyeF92ZGV2X2hhbmRsZSB0eHJ4X3ZkZXZfaGFuZGxlID0gTlVMTDsKKwlleHRlcm4gdWludDhfdCAqbWFjX3RyYWNlX2dldF93bWFfbXNnX3N0cmluZyh1aW50MTZfdCB3bWFNc2cpOworCisJV01BX0xPR0koIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKwlpZiAoTlVMTCA9PSBtc2cpIHsKKwkJV01BX0xPR0UoIm1zZyBpcyBOVUxMIik7CisJCUNERl9BU1NFUlQoMCk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKworCVdNQV9MT0dEKCJtc2ctPnR5cGUgPSAleCAlcyIsIG1zZy0+dHlwZSwKKwkJIG1hY190cmFjZV9nZXRfd21hX21zZ19zdHJpbmcobXNnLT50eXBlKSk7CisKKwl3bWFfaGFuZGxlID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKworCWlmIChOVUxMID09IHdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR1AoIiVzOiB3bWFfaGFuZGxlIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0lOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwlzd2l0Y2ggKG1zZy0+dHlwZSkgeworCisJLyogTWVzc2FnZSBwb3N0ZWQgYnkgd21pIGZvciBhbGwgY29udHJvbCBwYXRoIHJlbGF0ZWQKKwkgKiBGVyBldmVudHMgdG8gc2VyaWFsaXplIHRocm91Z2ggbWNfdGhyZWFkLgorCSAqLworCWNhc2UgV01BX1BST0NFU1NfRldfRVZFTlQ6CisJCXdtYV9wcm9jZXNzX2Z3X2V2ZW50KHdtYV9oYW5kbGUsCisJCQkJKHdtYV9wcm9jZXNzX2Z3X2V2ZW50X3BhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCisJY2FzZSBXTUFfVFNNX1NUQVRTX1JFUToKKwkJV01BX0xPR0EoIk1jVGhyZWFkOiBXTUFfVFNNX1NUQVRTX1JFUSIpOworCQl3bWFfcHJvY2Vzc190c21fc3RhdHNfcmVxKHdtYV9oYW5kbGUsICh2b2lkICopbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRSAqLworCWNhc2UgV05JX0NGR19ETkxEX1JFUToKKwkJV01BX0xPR0EoIk1jVGhyZWFkOiBXTklfQ0ZHX0ROTERfUkVRIik7CisJCWNkZl9zdGF0dXMgPSB3bWFfd25pX2NmZ19kbmxkKHdtYV9oYW5kbGUpOworCQlpZiAoQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQljZHNfd21hX2NvbXBsZXRlX2NiYWNrKGNkc19jb250ZXh0KTsKKwkJfSBlbHNlIHsKKwkJCVdNQV9MT0dEKCJjb25maWcgZG93bmxvYWQgZmFpbHVyZSIpOworCQl9CisJCWJyZWFrOworCWNhc2UgV01BX0FERF9TVEFfU0VMRl9SRVE6CisJCXR4cnhfdmRldl9oYW5kbGUgPQorCQkJd21hX3ZkZXZfYXR0YWNoKHdtYV9oYW5kbGUsCisJCQkJKHN0cnVjdCBhZGRfc3RhX3NlbGZfcGFyYW1zICopIG1zZy0+CisJCQkJYm9keXB0ciwgMSk7CisJCWlmICghdHhyeF92ZGV2X2hhbmRsZSkgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBhdHRhY2ggdmRldiIpOworCQl9IGVsc2UgeworCQkJLyogUmVnaXN0ZXIgd2l0aCBUeFJ4IE1vZHVsZSBmb3IgRGF0YSBBY2sgQ29tcGxldGUgQ2IgKi8KKwkJCW9sX3R4cnhfZGF0YV90eF9jYl9zZXQodHhyeF92ZGV2X2hhbmRsZSwKKwkJCQkJICAgICAgd21hX2RhdGFfdHhfYWNrX2NvbXBfaGRsciwKKwkJCQkJICAgICAgd21hX2hhbmRsZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXTUFfREVMX1NUQV9TRUxGX1JFUToKKwkJd21hX3ZkZXZfZGV0YWNoKHdtYV9oYW5kbGUsCisJCQkJKHN0cnVjdCBkZWxfc3RhX3NlbGZfcGFyYW1zICopIG1zZy0+Ym9keXB0ciwgMSk7CisJCWJyZWFrOworCWNhc2UgV01BX1NUQVJUX1NDQU5fT0ZGTE9BRF9SRVE6CisJCXdtYV9zdGFydF9zY2FuKHdtYV9oYW5kbGUsIG1zZy0+Ym9keXB0ciwgbXNnLT50eXBlKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX1NUT1BfU0NBTl9PRkZMT0FEX1JFUToKKwkJd21hX3N0b3Bfc2Nhbih3bWFfaGFuZGxlLCBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfVVBEQVRFX0NIQU5fTElTVF9SRVE6CisJCXdtYV91cGRhdGVfY2hhbm5lbF9saXN0KHdtYV9oYW5kbGUsCisJCQkJCSh0U2lyVXBkYXRlQ2hhbkxpc3QgKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX1NFVF9MSU5LX1NUQVRFOgorCQl3bWFfc2V0X2xpbmtzdGF0ZSh3bWFfaGFuZGxlLCAodHBMaW5rU3RhdGVQYXJhbXMpIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0NITkxfU1dJVENIX1JFUToKKwkJd21hX3NldF9jaGFubmVsKHdtYV9oYW5kbGUsCisJCQkJKHRwU3dpdGNoQ2hhbm5lbFBhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfQUREX0JTU19SRVE6CisJCXdtYV9hZGRfYnNzKHdtYV9oYW5kbGUsICh0cEFkZEJzc1BhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfQUREX1NUQV9SRVE6CisJCXdtYV9hZGRfc3RhKHdtYV9oYW5kbGUsICh0cEFkZFN0YVBhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfU0VUX0JTU0tFWV9SRVE6CisJCXdtYV9zZXRfYnNza2V5KHdtYV9oYW5kbGUsICh0cFNldEJzc0tleVBhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfU0VUX1NUQUtFWV9SRVE6CisJCXdtYV9zZXRfc3Rha2V5KHdtYV9oYW5kbGUsICh0cFNldFN0YUtleVBhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfREVMRVRFX1NUQV9SRVE6CisJCXdtYV9kZWxldGVfc3RhKHdtYV9oYW5kbGUsICh0cERlbGV0ZVN0YVBhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfREVMRVRFX0JTU19SRVE6CisJCXdtYV9kZWxldGVfYnNzKHdtYV9oYW5kbGUsICh0cERlbGV0ZUJzc1BhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfVVBEQVRFX0VEQ0FfUFJPRklMRV9JTkQ6CisJCXdtYV9wcm9jZXNzX3VwZGF0ZV9lZGNhX3BhcmFtX3JlcSh3bWFfaGFuZGxlLAorCQkJCQkJICAodEVkY2FQYXJhbXMgKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX1NFTkRfQkVBQ09OX1JFUToKKwkJd21hX3NlbmRfYmVhY29uKHdtYV9oYW5kbGUsICh0cFNlbmRiZWFjb25QYXJhbXMpIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9TRU5EX1BST0JFX1JTUF9UTVBMOgorCQl3bWFfc2VuZF9wcm9iZV9yc3BfdG1wbCh3bWFfaGFuZGxlLAorCQkJCQkodHBTZW5kUHJvYmVSZXNwUGFyYW1zKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfQ0xJX1NFVF9DTUQ6CisJCXdtYV9wcm9jZXNzX2NsaV9zZXRfY21kKHdtYV9oYW5kbGUsCisJCQkJCSh3bWFfY2xpX3NldF9jbWRfdCAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjaWYgIWRlZmluZWQoUkVNT1ZFX1BLVF9MT0cpCisJY2FzZSBXTUFfUEtUTE9HX0VOQUJMRV9SRVE6CisJCXdtYV9wa3Rsb2dfd21pX3NlbmRfY21kKHdtYV9oYW5kbGUsCisJCQkoc3RydWN0IGF0aF9wa3Rsb2dfd21pX3BhcmFtcyAqKW1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKyNlbmRpZiAvKiBSRU1PVkVfUEtUX0xPRyAqLworI2lmIGRlZmluZWQoUUNBX1dJRklfRlRNKQorCWNhc2UgV01BX0ZUTV9DTURfUkVROgorCQl3bWFfcHJvY2Vzc19mdG1fY29tbWFuZCh3bWFfaGFuZGxlLAorCQkJCShzdHJ1Y3QgYXI2a190ZXN0bW9kZV9jbWRfZGF0YSAqKW1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmIC8qIFFDQV9XSUZJX0ZUTSAqLworCWNhc2UgV01BX0VOVEVSX1BTX1JFUToKKwkJd21hX2VuYWJsZV9zdGFfcHNfbW9kZSh3bWFfaGFuZGxlLAorCQkJCSAgICAgICAodHBFbmFibGVQc1BhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0VYSVRfUFNfUkVROgorCQl3bWFfZGlzYWJsZV9zdGFfcHNfbW9kZSh3bWFfaGFuZGxlLAorCQkJCQkodHBEaXNhYmxlUHNQYXJhbXMpIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9FTkFCTEVfVUFQU0RfUkVROgorCQl3bWFfZW5hYmxlX3VhcHNkX21vZGUod21hX2hhbmRsZSwKKwkJCQkgICAgICAodHBFbmFibGVVYXBzZFBhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0RJU0FCTEVfVUFQU0RfUkVROgorCQl3bWFfZGlzYWJsZV91YXBzZF9tb2RlKHdtYV9oYW5kbGUsCisJCQkJICAgICAgICh0cERpc2FibGVVYXBzZFBhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX1NFVF9UWF9QT1dFUl9SRVE6CisJCXdtYV9zZXRfdHhfcG93ZXIod21hX2hhbmRsZSwgKHRwTWF4VHhQb3dlclBhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfU0VUX01BWF9UWF9QT1dFUl9SRVE6CisJCXdtYV9zZXRfbWF4X3R4X3Bvd2VyKHdtYV9oYW5kbGUsCisJCQkJICAgICAodHBNYXhUeFBvd2VyUGFyYW1zKSBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9TRVRfS0VFUF9BTElWRToKKwkJd21hX3NldF9rZWVwYWxpdmVfcmVxKHdtYV9oYW5kbGUsCisJCQkJICAgICAgKHRTaXJLZWVwQWxpdmVSZXEgKikgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisJY2FzZSBXTUFfU0VUX1BOT19SRVE6CisJCXdtYV9jb25maWdfcG5vKHdtYV9oYW5kbGUsICh0cFNpclBOT1NjYW5SZXEpIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCisJY2FzZSBXTUFfU01FX1NDQU5fQ0FDSEVfVVBEQVRFRDoKKwkJd21hX3NjYW5fY2FjaGVfdXBkYXRlZF9pbmQod21hX2hhbmRsZSwgbXNnLT5ib2R5dmFsKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1NDQU5fUE5PICovCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQorCWNhc2UgV01BX1NFVF9QTE1fUkVROgorCQl3bWFfY29uZmlnX3BsbSh3bWFfaGFuZGxlLCAodHBTaXJQbG1SZXEpIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBXTUFfR0VUX1NUQVRJU1RJQ1NfUkVROgorCQl3bWFfZ2V0X3N0YXRzX3JlcSh3bWFfaGFuZGxlLAorCQkJCSAgKHRBbmlHZXRQRVN0YXRzUmVxICopIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCisJY2FzZSBXTUFfQ09ORklHX1BBUkFNX1VQREFURV9SRVE6CisJCXdtYV91cGRhdGVfY2ZnX3BhcmFtcyh3bWFfaGFuZGxlLCAodFNpck1zZ1EgKikgbXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNQV9VUERBVEVfT1BfTU9ERToKKwkJd21hX3Byb2Nlc3NfdXBkYXRlX29wbW9kZSh3bWFfaGFuZGxlLAorCQkJCQkgICh0VXBkYXRlVkhUT3BNb2RlICopIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9VUERBVEVfUlhfTlNTOgorCQl3bWFfcHJvY2Vzc191cGRhdGVfcnhfbnNzKHdtYV9oYW5kbGUsCisJCQkJCSAgKHRVcGRhdGVSeE5zcyAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwljYXNlIFdNQV9VUERBVEVfTUVNQkVSU0hJUDoKKwkJd21hX3Byb2Nlc3NfdXBkYXRlX21lbWJlcnNoaXAod21hX2hhbmRsZSwKKwkJCSh0VXBkYXRlTWVtYmVyc2hpcCAqKSBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9VUERBVEVfVVNFUlBPUzoKKwkJd21hX3Byb2Nlc3NfdXBkYXRlX3VzZXJwb3Mod21hX2hhbmRsZSwKKwkJCQkJICAgKHRVcGRhdGVVc2VyUG9zICopIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMUFDICovCisJY2FzZSBXTUFfVVBEQVRFX0JFQUNPTl9JTkQ6CisJCXdtYV9wcm9jZXNzX3VwZGF0ZV9iZWFjb25fcGFyYW1zKHdtYV9oYW5kbGUsCisJCQkodFVwZGF0ZUJlYWNvblBhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNQV9BRERfVFNfUkVROgorCQl3bWFfYWRkX3RzX3JlcSh3bWFfaGFuZGxlLCAodEFkZFRzUGFyYW1zICopIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCisJY2FzZSBXTUFfREVMX1RTX1JFUToKKwkJd21hX2RlbF90c19yZXEod21hX2hhbmRsZSwgKHREZWxUc1BhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKworCWNhc2UgV01BX0FHR1JfUU9TX1JFUToKKwkJd21hX2FnZ3JfcW9zX3JlcSh3bWFfaGFuZGxlLCAodEFnZ3JBZGRUc1BhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKworCWNhc2UgV01BX1JFQ0VJVkVfRklMVEVSX1NFVF9GSUxURVJfUkVROgorCQl3bWFfcHJvY2Vzc19yZWNlaXZlX2ZpbHRlcl9zZXRfZmlsdGVyX3JlcSh3bWFfaGFuZGxlLAorCQkJCSh0U2lyUmN2UGt0RmlsdGVyQ2ZnVHlwZSAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNQV9SRUNFSVZFX0ZJTFRFUl9DTEVBUl9GSUxURVJfUkVROgorCQl3bWFfcHJvY2Vzc19yZWNlaXZlX2ZpbHRlcl9jbGVhcl9maWx0ZXJfcmVxKHdtYV9oYW5kbGUsCisJCQkJKHRTaXJSY3ZGbHRQa3RDbGVhclBhcmFtICopIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKworCWNhc2UgV01BX1dPV19BRERfUFRSTjoKKwkJd21hX3dvd19hZGRfcGF0dGVybih3bWFfaGFuZGxlLAorCQkJCSAgICAoc3RydWN0IHdvd19hZGRfcGF0dGVybiAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfV09XX0RFTF9QVFJOOgorCQl3bWFfd293X2RlbGV0ZV91c2VyX3BhdHRlcm4od21hX2hhbmRsZSwKKwkJCQkgICAgKHN0cnVjdCB3b3dfZGVsZXRlX3BhdHRlcm4gKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX1dPV0xfRU5URVJfUkVROgorCQl3bWFfd293X2VudGVyKHdtYV9oYW5kbGUsCisJCQkgICAgICAodHBTaXJIYWxXb3dsRW50ZXJQYXJhbXMpIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX1dPV0xfRVhJVF9SRVE6CisJCXdtYV93b3dfZXhpdCh3bWFfaGFuZGxlLCAodHBTaXJIYWxXb3dsRXhpdFBhcmFtcykgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfV0xBTl9TVVNQRU5EX0lORDoKKwkJd21hX3N1c3BlbmRfcmVxKHdtYV9oYW5kbGUsCisJCQkJKHRwU2lyV2xhblN1c3BlbmRQYXJhbSkgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfODAyM19NVUxUSUNBU1RfTElTVF9SRVE6CisJCXdtYV9wcm9jZXNzX21jYmNfc2V0X2ZpbHRlcl9yZXEod21hX2hhbmRsZSwKKwkJCQkodHBTaXJSY3ZGbHRNY0FkZHJMaXN0KSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisJY2FzZSBXTUFfR1RLX09GRkxPQURfUkVROgorCQl3bWFfcHJvY2Vzc19ndGtfb2ZmbG9hZF9yZXEod21hX2hhbmRsZSwKKwkJCQkodHBTaXJHdGtPZmZsb2FkUGFyYW1zKSBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKworCWNhc2UgV01BX0dUS19PRkZMT0FEX0dFVElORk9fUkVROgorCQl3bWFfcHJvY2Vzc19ndGtfb2ZmbG9hZF9nZXRpbmZvX3JlcSh3bWFfaGFuZGxlLAorCQkJCSh0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zKW1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRCAqLworI2lmZGVmIEZFQVRVUkVfT0VNX0RBVEFfU1VQUE9SVAorCWNhc2UgV01BX1NUQVJUX09FTV9EQVRBX1JFUToKKwkJd21hX3N0YXJ0X29lbV9kYXRhX3JlcSh3bWFfaGFuZGxlLAorCQkJCSAgICAgICAodFN0YXJ0T2VtRGF0YVJlcSAqKSBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX09FTV9EQVRBX1NVUFBPUlQgKi8KKwljYXNlIFdNQV9TRVRfSE9TVF9PRkZMT0FEOgorCQl3bWFfZW5hYmxlX2FycF9uc19vZmZsb2FkKHdtYV9oYW5kbGUsCisJCQkJCSAgKHRwU2lySG9zdE9mZmxvYWRSZXEpIG1zZy0+Ym9keXB0ciwKKwkJCQkJICB0cnVlKTsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9OU19PRkZMT0FECisJY2FzZSBXTUFfU0VUX05TX09GRkxPQUQ6CisJCXdtYV9lbmFibGVfYXJwX25zX29mZmxvYWQod21hX2hhbmRsZSwKKwkJCQkJICAodHBTaXJIb3N0T2ZmbG9hZFJlcSkgbXNnLT5ib2R5cHRyLAorCQkJCQkgIGZhbHNlKTsKKwkJYnJlYWs7CisjZW5kaWYgLypXTEFOX05TX09GRkxPQUQgKi8KKwljYXNlIFdNQV9ST0FNX1NDQU5fT0ZGTE9BRF9SRVE6CisJCS8qCisJCSAqIE1haW4gZW50cnkgcG9pbnQgb3Igcm9hbWluZyBkaXJlY3RpdmVzIGZyb20gQ1NSLgorCQkgKi8KKwkJd21hX3Byb2Nlc3Nfcm9hbV9zY2FuX3JlcSh3bWFfaGFuZGxlLAorCQkJCSh0U2lyUm9hbU9mZmxvYWRTY2FuUmVxICopIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCisJY2FzZSBXTUFfUkFURV9VUERBVEVfSU5EOgorCQl3bWFfcHJvY2Vzc19yYXRlX3VwZGF0ZV9pbmRpY2F0ZSh3bWFfaGFuZGxlLAorCQkJCSh0U2lyUmF0ZVVwZGF0ZUluZCAqKSBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCisJY2FzZSBXTUFfVVBEQVRFX0ZXX1RETFNfU1RBVEU6CisJCXdtYV91cGRhdGVfZndfdGRsc19zdGF0ZSh3bWFfaGFuZGxlLAorCQkJCQkgKHRfd21hX3RkbHNfcGFyYW1zICopIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX1VQREFURV9URExTX1BFRVJfU1RBVEU6CisJCXdtYV91cGRhdGVfdGRsc19wZWVyX3N0YXRlKHdtYV9oYW5kbGUsCisJCQkJKHRUZGxzUGVlclN0YXRlUGFyYW1zICopIG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX1RETFNfU0VUX09GRkNIQU5fTU9ERToKKwkJd21hX3NldF90ZGxzX29mZmNoYW5fbW9kZSh3bWFfaGFuZGxlLAorCQkJKHRkbHNfY2hhbl9zd2l0Y2hfcGFyYW1zICopbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KKwljYXNlIFdNQV9BRERfUEVSSU9ESUNfVFhfUFRSTl9JTkQ6CisJCXdtYV9wcm9jZXNzX2FkZF9wZXJpb2RpY190eF9wdHJuX2luZCh3bWFfaGFuZGxlLAorCQkJCSh0U2lyQWRkUGVyaW9kaWNUeFB0cm4gKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0RFTF9QRVJJT0RJQ19UWF9QVFJOX0lORDoKKwkJd21hX3Byb2Nlc3NfZGVsX3BlcmlvZGljX3R4X3B0cm5faW5kKHdtYV9oYW5kbGUsCisJCQkJKHRTaXJEZWxQZXJpb2RpY1R4UHRybiAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfVFhfUE9XRVJfTElNSVQ6CisJCXdtYV9wcm9jZXNzX3R4X3Bvd2VyX2xpbWl0cyh3bWFfaGFuZGxlLAorCQkJCQkgICAgKHRTaXJUeFBvd2VyTGltaXQgKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9MUEhCCisJY2FzZSBXTUFfTFBIQl9DT05GX1JFUToKKwkJd21hX3Byb2Nlc3NfbHBoYl9jb25mX3JlcSh3bWFfaGFuZGxlLAorCQkJCQkgICh0U2lyTFBIQlJlcSAqKSBtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTFBIQiAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NIX0FWT0lECisJY2FzZSBXTUFfQ0hfQVZPSURfVVBEQVRFX1JFUToKKwkJd21hX3Byb2Nlc3NfY2hfYXZvaWRfdXBkYXRlX3JlcSh3bWFfaGFuZGxlLAorCQkJCSh0U2lyQ2hBdm9pZFVwZGF0ZVJlcSAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NIX0FWT0lEICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0FVVE9fU0hVVERPV04KKwljYXNlIFdNQV9TRVRfQVVUT19TSFVURE9XTl9USU1FUl9SRVE6CisJCXdtYV9zZXRfYXV0b19zaHV0ZG93bl90aW1lcl9yZXEod21hX2hhbmRsZSwgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9BVVRPX1NIVVRET1dOICovCisJY2FzZSBXTUFfREhDUF9TVEFSVF9JTkQ6CisJY2FzZSBXTUFfREhDUF9TVE9QX0lORDoKKwkJd21hX3Byb2Nlc3NfZGhjcF9pbmQod21hX2hhbmRsZSwgKHRBbmlESENQSW5kICopIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKworCWNhc2UgV01BX0lOSVRfVEhFUk1BTF9JTkZPX0NNRDoKKwkJd21hX3Byb2Nlc3NfaW5pdF90aGVybWFsX2luZm8od21hX2hhbmRsZSwKKwkJCQkJICAgICAgKHRfdGhlcm1hbF9tZ210ICopIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKworCWNhc2UgV01BX1NFVF9USEVSTUFMX0xFVkVMOgorCQl3bWFfcHJvY2Vzc19zZXRfdGhlcm1hbF9sZXZlbCh3bWFfaGFuZGxlLCBtc2ctPmJvZHl2YWwpOworCQlicmVhazsKKworCWNhc2UgV01BX1NFVF9QMlBfR09fTk9BX1JFUToKKwkJd21hX3Byb2Nlc3Nfc2V0X3AycGdvX25vYV9yZXEod21hX2hhbmRsZSwKKwkJCQkJICAgICAgKHRQMnBQc1BhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfU0VUX01JTU9QU19SRVE6CisJCXdtYV9wcm9jZXNzX3NldF9taW1vcHNfcmVxKHdtYV9oYW5kbGUsCisJCQkJCSAgICh0U2V0TUlNT1BTICopIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9TRVRfU0FQX0lOVFJBQlNTX0RJUzoKKwkJd21hX3NldF92ZGV2X2ludHJhYnNzX2Z3ZCh3bWFfaGFuZGxlLAorCQkJCQkgICh0RGlzYWJsZUludHJhQnNzRndkICopIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9HRVRfTElOS19TUEVFRDoKKwkJd21hX2dldF9saW5rX3NwZWVkKHdtYV9oYW5kbGUsIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9NT0RFTV9QT1dFUl9TVEFURV9JTkQ6CisJCXdtYV9ub3RpZnlfbW9kZW1fcG93ZXJfc3RhdGUod21hX2hhbmRsZSwKKwkJCQkodFNpck1vZGVtUG93ZXJTdGF0ZUluZCAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfV0xBTl9SRVNVTUVfUkVROgorCQl3bWFfcmVzdW1lX3JlcSh3bWFfaGFuZGxlKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUCisJY2FzZSBXTUFfU1RBVFNfRVhUX1JFUVVFU1Q6CisJCXdtYV9zdGF0c19leHRfcmVxKHdtYV9oYW5kbGUsCisJCQkJICAodHBTdGF0c0V4dFJlcXVlc3QpIChtc2ctPmJvZHlwdHIpKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9TVEFUU19FWFQgKi8KKwljYXNlIFdNQV9ISURERU5fU1NJRF9WREVWX1JFU1RBUlQ6CisJCXdtYV9oaWRkZW5fc3NpZF92ZGV2X3Jlc3RhcnQod21hX2hhbmRsZSwKKwkJCQkodEhhbEhpZGRlblNzaWRWZGV2UmVzdGFydCAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUCisJY2FzZSBXTUFfV0xBTl9FWFRfV09XOgorCQl3bWFfZW5hYmxlX2V4dF93b3cod21hX2hhbmRsZSwKKwkJCQkgICAodFNpckV4dFdvV1BhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfV0xBTl9TRVRfQVBQX1RZUEUxX1BBUkFNUzoKKwkJd21hX3NldF9hcHBfdHlwZTFfcGFyYW1zX2luX2Z3KHdtYV9oYW5kbGUsCisJCQkJKHRTaXJBcHBUeXBlMVBhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfV0xBTl9TRVRfQVBQX1RZUEUyX1BBUkFNUzoKKwkJd21hX3NldF9hcHBfdHlwZTJfcGFyYW1zX2luX2Z3KHdtYV9oYW5kbGUsCisJCQkJKHRTaXJBcHBUeXBlMlBhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0VYVFdPV19TVVBQT1JUICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0VYVFNDQU4KKwljYXNlIFdNQV9FWFRTQ0FOX1NUQVJUX1JFUToKKwkJd21hX3N0YXJ0X2V4dHNjYW4od21hX2hhbmRsZSwKKwkJCQkgICh0U2lyV2lmaVNjYW5DbWRSZXFQYXJhbXMgKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0VYVFNDQU5fU1RPUF9SRVE6CisJCXdtYV9zdG9wX2V4dHNjYW4od21hX2hhbmRsZSwKKwkJCQkgKHRTaXJFeHRTY2FuU3RvcFJlcVBhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfRVhUU0NBTl9TRVRfQlNTSURfSE9UTElTVF9SRVE6CisJCXdtYV9leHRzY2FuX3N0YXJ0X2hvdGxpc3RfbW9uaXRvcih3bWFfaGFuZGxlLAorCQkJKHRTaXJFeHRTY2FuU2V0QnNzaWRIb3RMaXN0UmVxUGFyYW1zICopIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9FWFRTQ0FOX1JFU0VUX0JTU0lEX0hPVExJU1RfUkVROgorCQl3bWFfZXh0c2Nhbl9zdG9wX2hvdGxpc3RfbW9uaXRvcih3bWFfaGFuZGxlLAorCQkJKHRTaXJFeHRTY2FuUmVzZXRCc3NpZEhvdGxpc3RSZXFQYXJhbXMgKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0VYVFNDQU5fU0VUX1NJR05GX0NIQU5HRV9SRVE6CisJCXdtYV9leHRzY2FuX3N0YXJ0X2NoYW5nZV9tb25pdG9yKHdtYV9oYW5kbGUsCisJCQkodFNpckV4dFNjYW5TZXRTaWdDaGFuZ2VSZXFQYXJhbXMgKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0VYVFNDQU5fUkVTRVRfU0lHTkZfQ0hBTkdFX1JFUToKKwkJd21hX2V4dHNjYW5fc3RvcF9jaGFuZ2VfbW9uaXRvcih3bWFfaGFuZGxlLAorCQkJKHRTaXJFeHRTY2FuUmVzZXRTaWduaWZpY2FudENoYW5nZVJlcVBhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfRVhUU0NBTl9HRVRfQ0FDSEVEX1JFU1VMVFNfUkVROgorCQl3bWFfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHMod21hX2hhbmRsZSwKKwkJCSh0U2lyRXh0U2NhbkdldENhY2hlZFJlc3VsdHNSZXFQYXJhbXMgKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0VYVFNDQU5fR0VUX0NBUEFCSUxJVElFU19SRVE6CisJCXdtYV9leHRzY2FuX2dldF9jYXBhYmlsaXRpZXMod21hX2hhbmRsZSwKKwkJCSh0U2lyR2V0RXh0U2NhbkNhcGFiaWxpdGllc1JlcVBhcmFtcyAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfU0VUX0VQTk9fTElTVF9SRVE6CisJCXdtYV9zZXRfZXBub19uZXR3b3JrX2xpc3Qod21hX2hhbmRsZSwKKwkJCShzdHJ1Y3Qgd2lmaV9lcG5vX3BhcmFtcyAqKW1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9TRVRfUEFTU1BPSU5UX0xJU1RfUkVROgorCQkvKiBJc3N1ZSByZXNldCBwYXNzcG9pbnQgbmV0d29yayBsaXN0IGZpcnN0IGFuZCBjbGVhcgorCQkgKiB0aGUgZW50cmllcyAqLworCQl3bWFfcmVzZXRfcGFzc3BvaW50X25ldHdvcmtfbGlzdCh3bWFfaGFuZGxlLAorCQkJKHN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKiltc2ctPmJvZHlwdHIpOworCisJCXdtYV9zZXRfcGFzc3BvaW50X25ldHdvcmtfbGlzdCh3bWFfaGFuZGxlLAorCQkJKHN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfUkVTRVRfUEFTU1BPSU5UX0xJU1RfUkVROgorCQl3bWFfcmVzZXRfcGFzc3BvaW50X25ldHdvcmtfbGlzdCh3bWFfaGFuZGxlLAorCQkJKHN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKiltc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9FWFRTQ0FOX1NFVF9TU0lEX0hPVExJU1RfUkVROgorCQl3bWFfc2V0X3NzaWRfaG90bGlzdCh3bWFfaGFuZGxlLAorCQkJKHN0cnVjdCBzaXJfc2V0X3NzaWRfaG90bGlzdF9yZXF1ZXN0ICopbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FWFRTQ0FOICovCisJY2FzZSBXTUFfU0VUX1NDQU5fTUFDX09VSV9SRVE6CisJCXdtYV9zY2FuX3Byb2JlX3NldG91aSh3bWFfaGFuZGxlLCBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKKwljYXNlIFdNQV9MSU5LX0xBWUVSX1NUQVRTX0NMRUFSX1JFUToKKwkJd21hX3Byb2Nlc3NfbGxfc3RhdHNfY2xlYXJfcmVxKHdtYV9oYW5kbGUsCisJCQkodHBTaXJMTFN0YXRzQ2xlYXJSZXEpIG1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9MSU5LX0xBWUVSX1NUQVRTX1NFVF9SRVE6CisJCXdtYV9wcm9jZXNzX2xsX3N0YXRzX3NldF9yZXEod21hX2hhbmRsZSwKKwkJCQkJICAgICAodHBTaXJMTFN0YXRzU2V0UmVxKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfTElOS19MQVlFUl9TVEFUU19HRVRfUkVROgorCQl3bWFfcHJvY2Vzc19sbF9zdGF0c19nZXRfcmVxKHdtYV9oYW5kbGUsCisJCQkJCSAgICAgKHRwU2lyTExTdGF0c0dldFJlcSkgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTICovCisJY2FzZSBTSVJfSEFMX1VOSVRfVEVTVF9DTUQ6CisJCXdtYV9wcm9jZXNzX3VuaXRfdGVzdF9jbWQod21hX2hhbmRsZSwKKwkJCQkJICAodF93bWFfdW5pdF90ZXN0X2NtZCAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWNhc2UgV01BX1JPQU1fT0ZGTE9BRF9TWU5DSF9DTkY6CisJCXdtYV9wcm9jZXNzX3JvYW1fc3luY2hfY29tcGxldGUod21hX2hhbmRsZSwKKwkJCSh0U2lyU21lUm9hbU9mZmxvYWRTeW5jaENuZiAqKW1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9ST0FNX09GRkxPQURfU1lOQ0hfRkFJTDoKKwkJd21hX3Byb2Nlc3Nfcm9hbV9zeW5jaF9mYWlsKHdtYV9oYW5kbGUsCisJCQkoc3RydWN0IHJvYW1fb2ZmbG9hZF9zeW5jaF9mYWlsICopbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgU0lSX0hBTF9ST0FNX0lOVk9LRToKKwkJd21hX3Byb2Nlc3Nfcm9hbV9pbnZva2Uod21hX2hhbmRsZSwKKwkJCShzdHJ1Y3Qgd21hX3JvYW1faW52b2tlX2NtZCAqKW1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FEICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX05BTgorCWNhc2UgV01BX05BTl9SRVFVRVNUOgorCQl3bWFfbmFuX3JlcSh3bWFfaGFuZGxlLCAodE5hblJlcXVlc3QgKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9OQU4gKi8KKwljYXNlIFNJUl9IQUxfU0VUX0JBU0VfTUFDQUREUl9JTkQ6CisJCXdtYV9zZXRfYmFzZV9tYWNhZGRyX2luZGljYXRlKHdtYV9oYW5kbGUsCisJCQkJCSAgICAgICh0U2lyTWFjQWRkciAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfTElOS19TVEFUVVNfR0VUX1JFUToKKwkJd21hX3Byb2Nlc3NfbGlua19zdGF0dXNfcmVxKHdtYV9oYW5kbGUsCisJCQkJCSAgICAodEFuaUdldExpbmtTdGF0dXMgKikgbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfR0VUX1RFTVBFUkFUVVJFX1JFUToKKwkJd21hX2dldF90ZW1wZXJhdHVyZSh3bWFfaGFuZGxlKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2lmZGVmIERIQ1BfU0VSVkVSX09GRkxPQUQKKwljYXNlIFdNQV9TRVRfREhDUF9TRVJWRVJfT0ZGTE9BRF9DTUQ6CisJCXdtYV9wcm9jZXNzX2RoY3BzZXJ2ZXJfb2ZmbG9hZCh3bWFfaGFuZGxlLAorCQkJKHRTaXJEaGNwU3J2T2ZmbG9hZEluZm8gKikgbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworI2VuZGlmIC8qIERIQ1BfU0VSVkVSX09GRkxPQUQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1BJT19MRURfRkxBU0hJTkcKKwljYXNlIFdNQV9MRURfRkxBU0hJTkdfUkVROgorCQl3bWFfc2V0X2xlZF9mbGFzaGluZyh3bWFfaGFuZGxlLAorCQkJCSAgICAgKHRTaXJMZWRGbGFzaGluZ1JlcSAqKSBtc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX0dQSU9fTEVEX0ZMQVNISU5HICovCisJY2FzZSBTSVJfSEFMX1NFVF9NQVM6CisJCXdtYV9wcm9jZXNzX3NldF9tYXMod21hX2hhbmRsZSwKKwkJCQkodWludDMyX3QgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfSEFMX1NFVF9NSVJBQ0FTVDoKKwkJd21hX3Byb2Nlc3Nfc2V0X21pcmFjYXN0KHdtYV9oYW5kbGUsCisJCQkJKHVpbnQzMl90ICopbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgU0lSX0hBTF9DT05GSUdfU1RBVFNfRkFDVE9SOgorCQl3bWFfY29uZmlnX3N0YXRzX2ZhY3Rvcih3bWFfaGFuZGxlLAorCQkJCQkoc3RydWN0IHNpcl9zdGF0c19hdmdfZmFjdG9yICopCisJCQkJCW1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFNJUl9IQUxfQ09ORklHX0dVQVJEX1RJTUU6CisJCXdtYV9jb25maWdfZ3VhcmRfdGltZSh3bWFfaGFuZGxlLAorCQkJCSAgICAgIChzdHJ1Y3Qgc2lyX2d1YXJkX3RpbWVfcmVxdWVzdCAqKQorCQkJCSAgICAgIG1zZy0+Ym9keXB0cik7CisJY2FzZSBXTUFfSVBBX09GRkxPQURfRU5BQkxFX0RJU0FCTEU6CisJCXdtYV9pcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZSh3bWFfaGFuZGxlLAorCQkJKHN0cnVjdCBzaXJfaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGUgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfSEFMX1NUQVJUX1NUT1BfTE9HR0lORzoKKwkJd21hX3NldF93aWZpX3N0YXJ0X3BhY2tldF9zdGF0cyh3bWFfaGFuZGxlLAorCQkJCShzdHJ1Y3Qgc2lyX3dpZmlfc3RhcnRfbG9nICopbXNnLT5ib2R5cHRyKTsKKwkJd21hX2VuYWJsZV9zcGVjaWZpY19md19sb2dzKHdtYV9oYW5kbGUsCisJCQkJKHN0cnVjdCBzaXJfd2lmaV9zdGFydF9sb2cgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfSEFMX0ZMVVNIX0xPR19UT19GVzoKKwkJd21hX3NlbmRfZmx1c2hfbG9nc190b19mdyh3bWFfaGFuZGxlKTsKKwkJLyogQm9keSBwdHIgaXMgTlVMTCBoZXJlICovCisJCWJyZWFrOworCWNhc2UgV01BX1NFVF9SU1NJX01PTklUT1JfUkVROgorCQl3bWFfc2V0X3Jzc2lfbW9uaXRvcmluZyh3bWFfaGFuZGxlLAorCQkJKHN0cnVjdCByc3NpX21vbml0b3JfcmVxICopbXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfRldfTUVNX0RVTVBfUkVROgorCQl3bWFfcHJvY2Vzc19md19tZW1fZHVtcF9yZXEod21hX2hhbmRsZSwKKwkJCShzdHJ1Y3QgZndfZHVtcF9yZXEgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfSEFMX1NPQ19TRVRfUENMX1RPX0ZXOgorCQl3bWFfc2VuZF9zb2Nfc2V0X3BjbF9jbWQod21hX2hhbmRsZSwKKwkJCQkJKHN0cnVjdCBzaXJfcGNsX2xpc3QgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfSEFMX1NPQ19TRVRfSFdfTU9ERToKKwkJd21hX3NlbmRfc29jX3NldF9od19tb2RlX2NtZCh3bWFfaGFuZGxlLAorCQkJCShzdHJ1Y3Qgc2lyX2h3X21vZGUgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfT0NCX1NFVF9DT05GSUdfQ01EOgorCQl3bWFfb2NiX3NldF9jb25maWdfcmVxKHdtYV9oYW5kbGUsCisJCQkoc3RydWN0IHNpcl9vY2JfY29uZmlnICopbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX09DQl9TRVRfVVRDX1RJTUVfQ01EOgorCQl3bWFfb2NiX3NldF91dGNfdGltZSh3bWFfaGFuZGxlLAorCQkJKHN0cnVjdCBzaXJfb2NiX3V0YyAqKW1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9PQ0JfU1RBUlRfVElNSU5HX0FEVkVSVF9DTUQ6CisJCXdtYV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydCh3bWFfaGFuZGxlLAorCQkJKHN0cnVjdCBzaXJfb2NiX3RpbWluZ19hZHZlcnQgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9DTUQ6CisJCXdtYV9vY2Jfc3RvcF90aW1pbmdfYWR2ZXJ0KHdtYV9oYW5kbGUsCisJCQkoc3RydWN0IHNpcl9vY2JfdGltaW5nX2FkdmVydCAqKW1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9EQ0NfQ0xFQVJfU1RBVFNfQ01EOgorCQl3bWFfZGNjX2NsZWFyX3N0YXRzKHdtYV9oYW5kbGUsCisJCQkoc3RydWN0IHNpcl9kY2NfY2xlYXJfc3RhdHMgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTUFfT0NCX0dFVF9UU0ZfVElNRVJfQ01EOgorCQl3bWFfb2NiX2dldF90c2ZfdGltZXIod21hX2hhbmRsZSwKKwkJCShzdHJ1Y3Qgc2lyX29jYl9nZXRfdHNmX3RpbWVyICopbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0RDQ19HRVRfU1RBVFNfQ01EOgorCQl3bWFfZGNjX2dldF9zdGF0cyh3bWFfaGFuZGxlLAorCQkJKHN0cnVjdCBzaXJfZGNjX2dldF9zdGF0cyAqKW1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9EQ0NfVVBEQVRFX05ETF9DTUQ6CisJCXdtYV9kY2NfdXBkYXRlX25kbCh3bWFfaGFuZGxlLAorCQkJKHN0cnVjdCBzaXJfZGNjX3VwZGF0ZV9uZGwgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJY2FzZSBTSVJfSEFMX1NPQ19EVUFMX01BQ19DRkdfUkVROgorCQl3bWFfc2VuZF9zb2Nfc2V0X2R1YWxfbWFjX2NvbmZpZyh3bWFfaGFuZGxlLAorCQkJCShzdHJ1Y3Qgc2lyX2R1YWxfbWFjX2NvbmZpZyAqKW1zZy0+Ym9keXB0cik7CisJCWNkZl9tZW1fZnJlZShtc2ctPmJvZHlwdHIpOworCQlicmVhazsKKwljYXNlIFdNQV9TRVRfSUVfSU5GTzoKKwkJd21hX3Byb2Nlc3Nfc2V0X2llX2luZm8od21hX2hhbmRsZSwKKwkJCShzdHJ1Y3QgdmRldl9pZV9pbmZvICopbXNnLT5ib2R5cHRyKTsKKwkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCWJyZWFrOworCWNhc2UgV01BX0xST19DT05GSUdfQ01EOgorCQl3bWFfbHJvX2NvbmZpZ19jbWQod21hX2hhbmRsZSwKKwkJCShzdHJ1Y3Qgd21hX2xyb19jb25maWdfY21kX3QgKiltc2ctPmJvZHlwdHIpOworCQljZGZfbWVtX2ZyZWUobXNnLT5ib2R5cHRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV01BX0xPR0QoInVua25vdyBtc2cgdHlwZSAleCIsIG1zZy0+dHlwZSk7CisJCS8qIERvIE5vdGhpbmc/IE1TRyBCb2R5IHNob3VsZCBiZSBmcmVlZCBhdCBoZXJlICovCisJCWlmIChOVUxMICE9IG1zZy0+Ym9keXB0cikgeworCQkJY2RmX21lbV9mcmVlKG1zZy0+Ym9keXB0cik7CisJCX0KKwl9CitlbmQ6CisJV01BX0xPR0koIiVzOiBFeGl0IiwgX19mdW5jX18pOworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9sb2dfY29tcGxldGlvbl90aW1lb3V0KCkgLSBMb2cgY29tcGxldGlvbiB0aW1lb3V0CisgKiBAZGF0YTogVGltZW91dCBoYW5kbGVyIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGxvZyBjb21wbGV0aW9uIHRpbWVyIGV4cGlyZXMKKyAqCisgKiBSZXR1cm46IE5vbmUKKyAqLwordm9pZCB3bWFfbG9nX2NvbXBsZXRpb25fdGltZW91dCh2b2lkICpkYXRhKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZTsKKworCVdNQV9MT0dFKCIlczogVGltZW91dCBvY2N1cmVkIGZvciBsb2cgY29tcGxldGlvbiBjb21tYW5kIiwgX19mdW5jX18pOworCisJd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSBkYXRhOworCWlmICghd21hX2hhbmRsZSkKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisKKwkvKiBUaG91Z2ggd2UgZGlkIG5vdCByZWNlaXZlIGFueSBldmVudCBmcm9tIEZXLAorCSAqIHdlIGNhbiBmbHVzaCB3aGF0ZXZlciBsb2dzIHdlIGhhdmUgd2l0aCB1cyAqLworCWNkc19sb2dnaW5nX3NldF9md19mbHVzaF9jb21wbGV0ZSgpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIHdtYV9zZW5kX3NvY19zZXRfcGNsX2NtZCgpIC0gU2VuZCBXTUlfU09DX1NFVF9QQ0xfQ01ESUQgdG8gRlcKKyAqIEB3bWFfaGFuZGxlOiBXTUEgaGFuZGxlCisgKiBAbXNnOiBQQ0wgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIFBDTCBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscworICoKKyAqIFdNSV9TT0NfU0VUX1BDTF9DTURJRCBwcm92aWRlcyBhIFByZWZlcnJlZCBDaGFubmVsIExpc3QgKFBDTCkgdG8gdGhlIFdMQU4KKyAqIGZpcm13YXJlLiBUaGUgREJTIE1hbmFnZXIgaXMgdGhlIGNvbnN1bWVyIG9mIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIFdMQU4KKyAqIGZpcm13YXJlLiBUaGUgY2hhbm5lbCBsaXN0IHdpbGwgYmUgdXNlZCB3aGVuIGEgVmlydHVhbCBERVZpY2UgKFZERVYpIG5lZWRzCisgKiB0byBtaWdyYXRlIHRvIGEgbmV3IGNoYW5uZWwgd2l0aG91dCBob3N0IGRyaXZlciBpbnZvbHZlbWVudC4gQW4gZXhhbXBsZSBvZgorICogdGhpcyBiZWhhdmlvciBpcyBMZWdhY3kgRmFzdCBSb2FtaW5nIChMRlIgMy4wKS4gR2VuZXJhbGx5LCB0aGUgaG9zdCB3aWxsCisgKiBtYW5hZ2UgdGhlIGNoYW5uZWwgc2VsZWN0aW9uIHdpdGhvdXQgZmlybXdhcmUgaW52b2x2ZW1lbnQuCisgKgorICogUmV0dXJuOiBTdWNjZXNzIGlmIHRoZSBjbWQgaXMgc2VudCBzdWNjZXNzZnVsbHkgdG8gdGhlIGZpcm13YXJlCisgKi8KK0NERl9TVEFUVVMgd21hX3NlbmRfc29jX3NldF9wY2xfY21kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQlzdHJ1Y3Qgc2lyX3BjbF9saXN0ICptc2cpCit7CisJd21pX3NvY19zZXRfcGNsX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50MzJfdCAqY21kX2FyZ3MsIGksIGxlbjsKKworCWlmICghd21hX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBoYW5kbGUgaXMgTlVMTC4gQ2Fubm90IGlzc3VlIGNvbW1hbmQiLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OVUxMX1ZBTFVFOworCX0KKworCWxlbiA9IHNpemVvZigqY21kKSArCisJCVdNSV9UTFZfSERSX1NJWkUgKyAobXNnLT5wY2xfbGVuICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljbWQgPSAod21pX3NvY19zZXRfcGNsX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgY21kOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCVdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfcGNsX2NtZF9maXhlZF9wYXJhbSwKKwkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV9zb2Nfc2V0X3BjbF9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPm51bV9jaGFuID0gbXNnLT5wY2xfbGVuOworCVdNQV9MT0dJKCIlczogUENMIGxlbjolZCIsIF9fZnVuY19fLCBjbWQtPm51bV9jaGFuKTsKKworCWJ1Zl9wdHIgKz0gc2l6ZW9mKHdtaV9zb2Nfc2V0X3BjbF9jbWRfZml4ZWRfcGFyYW0pOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLAorCQkJKG1zZy0+cGNsX2xlbiAqIHNpemVvZih1aW50MzJfdCkpKTsKKwljbWRfYXJncyA9ICh1aW50MzJfdCAqKSAoYnVmX3B0ciArIFdNSV9UTFZfSERSX1NJWkUpOworCWZvciAoaSA9IDA7IGkgPCBtc2ctPnBjbF9sZW4gOyBpKyspIHsKKwkJY21kX2FyZ3NbaV0gPSBtc2ctPnBjbF9saXN0W2ldOworCQlXTUFfTE9HSSgiJXM6IFBDTCBjaGFuOiVkIiwgX19mdW5jX18sIGNtZF9hcmdzW2ldKTsKKwl9CisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCVdNSV9TT0NfU0VUX1BDTF9DTURJRCkpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gc2VuZCBXTUlfU09DX1NFVF9QQ0xfQ01ESUQiLCBfX2Z1bmNfXyk7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9zZW5kX3NvY19zZXRfaHdfbW9kZV9jbWQoKSAtIFNlbmQgV01JX1NPQ19TRVRfSFdfTU9ERV9DTURJRCB0byBGVworICogQHdtYV9oYW5kbGU6IFdNQSBoYW5kbGUKKyAqIEBtc2c6IFN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycworICoKKyAqIC0gaHdfbW9kZV9pbmRleDogVGhlIEhXX01vZGUgZmllbGQgaXMgYSBlbnVtZXJhdGVkIHR5cGUgdGhhdCBpcyBzZWxlY3RlZAorICogZnJvbSB0aGUgSFdfTW9kZSB0YWJsZSwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIFdNSV9TRVJWSUNFX1JFQURZX0VWRU5USUQuCisgKgorICogUHJvdmlkZXMgbm90aWZpY2F0aW9uIHRvIHRoZSBXTEFOIGZpcm13YXJlIHRoYXQgaG9zdCBkcml2ZXIgaXMgcmVxdWVzdGluZyBhCisgKiBIYXJkV2FyZSAoSFcpIE1vZGUgY2hhbmdlLiBUaGlzIGNvbW1hbmQgaXMgbmVlZGVkIHRvIHN1cHBvcnQgaUhlbGl1bSBpbiB0aGUKKyAqIGNvbmZpZ3VyYXRpb25zIHRoYXQgaW5jbHVkZSB0aGUgRHVhbCBCYW5kIFNpbXVsdGFuZW91cyAoREJTKSBmZWF0dXJlLgorICoKKyAqIFJldHVybjogU3VjY2VzcyBpZiB0aGUgY21kIGlzIHNlbnQgc3VjY2Vzc2Z1bGx5IHRvIHRoZSBmaXJtd2FyZQorICovCitDREZfU1RBVFVTIHdtYV9zZW5kX3NvY19zZXRfaHdfbW9kZV9jbWQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCXN0cnVjdCBzaXJfaHdfbW9kZSAqbXNnKQoreworCXdtaV9zb2Nfc2V0X2h3X21vZGVfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50MzJfdCBsZW47CisJc3RydWN0IHNpcl9zZXRfaHdfbW9kZV9yZXNwICpwYXJhbTsKKworCWlmICghd21hX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBoYW5kbGUgaXMgTlVMTC4gQ2Fubm90IGlzc3VlIGNvbW1hbmQiLAorCQkJCV9fZnVuY19fKTsKKwkJLyogSGFuZGxlIGlzIE5VTEwuIFdpbGwgbm90IGJlIGFibGUgdG8gc2VuZCBmYWlsdXJlCisJCSAqIHJlc3BvbnNlIGFzIHdlbGwKKwkJICovCisJCXJldHVybiBDREZfU1RBVFVTX0VfTlVMTF9WQUxVRTsKKwl9CisKKwlpZiAoIW1zZykgeworCQlXTUFfTE9HRSgiJXM6IFNldCBIVyBtb2RlIHBhcmFtIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCS8qIExldHMgdHJ5IHRvIGZyZWUgdGhlIGFjdGl2ZSBjb21tYW5kIGxpc3QgKi8KKwkJZ290byBmYWlsOworCX0KKworCWxlbiA9IHNpemVvZigqY21kKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCisJY21kID0gKHdtaV9zb2Nfc2V0X2h3X21vZGVfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCVdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfaHdfbW9kZV9jbWRfZml4ZWRfcGFyYW0sCisJCVdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfc29jX3NldF9od19tb2RlX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+aHdfbW9kZV9pbmRleCA9IG1zZy0+aHdfbW9kZV9pbmRleDsKKwlXTUFfTE9HSSgiJXM6IEhXIG1vZGUgaW5kZXg6JWQiLCBfX2Z1bmNfXywgY21kLT5od19tb2RlX2luZGV4KTsKKworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQlXTUlfU09DX1NFVF9IV19NT0RFX0NNRElEKSkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZW5kIFdNSV9TT0NfU0VUX0hXX01PREVfQ01ESUQiLAorCQkJX19mdW5jX18pOworCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK2ZhaWw6CisJcGFyYW0gPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnBhcmFtKSk7CisJaWYgKCFwYXJhbSkgeworCQlXTUFfTE9HRSgiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OVUxMX1ZBTFVFOworCX0KKwlwYXJhbS0+c3RhdHVzID0gU0VUX0hXX01PREVfU1RBVFVTX0VDQU5DRUxFRDsKKwlwYXJhbS0+Y2ZnZF9od19tb2RlX2luZGV4ID0gMDsKKwlwYXJhbS0+bnVtX3ZkZXZfbWFjX2VudHJpZXMgPSAwOworCVdNQV9MT0dFKCIlczogU2VuZGluZyBIVyBtb2RlIGZhaWwgcmVzcG9uc2UgdG8gTElNIiwgX19mdW5jX18pOworCXdtYV9zZW5kX21zZyh3bWFfaGFuZGxlLCBTSVJfSEFMX1NPQ19TRVRfSFdfTU9ERV9SRVNQLAorCQkJKHZvaWQgKikgcGFyYW0sIDApOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3NlbmRfc29jX3NldF9kdWFsX21hY19jb25maWcoKSAtIFNldCBkdWFsIG1hYyBjb25maWcgdG8gRlcKKyAqIEB3bWFfaGFuZGxlOiBXTUEgaGFuZGxlCisgKiBAbXNnOiBEdWFsIE1BQyBjb25maWcgcGFyYW1ldGVycworICoKKyAqIENvbmZpZ3VyZXMgV0xBTiBmaXJtd2FyZSB3aXRoIHRoZSBkdWFsIE1BQyBmZWF0dXJlcworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUy4gMCBvbiBzdWNjZXNzLgorICovCitDREZfU1RBVFVTIHdtYV9zZW5kX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJc3RydWN0IHNpcl9kdWFsX21hY19jb25maWcgKm1zZykKK3sKKwl3bWlfc29jX3NldF9kdWFsX21hY19jb25maWdfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50MzJfdCBsZW47CisKKwlpZiAoIXdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBXTUEgaGFuZGxlIGlzIE5VTEwuIENhbm5vdCBpc3N1ZSBjb21tYW5kIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTlVMTF9WQUxVRTsKKwl9CisKKwlpZiAoIW1zZykgeworCQlXTUFfTE9HRSgiJXM6IFNldCBkdWFsIG1vZGUgY29uZmlnIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTlVMTF9WQUxVRTsKKwl9CisKKwlsZW4gPSBzaXplb2YoKmNtZCk7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWNtZCA9ICh3bWlfc29jX3NldF9kdWFsX21hY19jb25maWdfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCVdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnX2NtZF9maXhlZF9wYXJhbSwKKwkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKAorCQkJd21pX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+Y29uY3VycmVudF9zY2FuX2NvbmZpZ19iaXRzID0gbXNnLT5zY2FuX2NvbmZpZzsKKwljbWQtPmZ3X21vZGVfY29uZmlnX2JpdHMgPSBtc2ctPmZ3X21vZGVfY29uZmlnOworCVdNQV9MT0dJKCIlczogc2Nhbl9jb25maWc6JXggZndfbW9kZV9jb25maWc6JXgiLAorCQkJX19mdW5jX18sIG1zZy0+c2Nhbl9jb25maWcsIG1zZy0+ZndfbW9kZV9jb25maWcpOworCisJd21hX2hhbmRsZS0+ZHVhbF9tYWNfY2ZnLnJlcV9zY2FuX2NvbmZpZyA9IG1zZy0+c2Nhbl9jb25maWc7CisJd21hX2hhbmRsZS0+ZHVhbF9tYWNfY2ZnLnJlcV9md19tb2RlX2NvbmZpZyA9IG1zZy0+ZndfbW9kZV9jb25maWc7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJV01JX1NPQ19TRVRfRFVBTF9NQUNfQ09ORklHX0NNRElEKSkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZW5kIFdNSV9TT0NfU0VUX0RVQUxfTUFDX0NPTkZJR19DTURJRCIsCisJCQkJX19mdW5jX18pOworCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2NyYXNoX2luamVjdCgpIC0gc2VuZHMgY29tbWFuZCB0byBGVyB0byBzaW11bGF0ZSBjcmFzaAorICogQHdtYV9oYW5kbGU6ICAgICAgICAgcG9pbnRlciBvZiBXTUEgY29udGV4dAorICogQHR5cGU6ICAgICAgICAgICAgICAgc3VidHlwZSBvZiB0aGUgY29tbWFuZAorICogQGRlbGF5X3RpbWVfbXM6ICAgICAgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIEZXIHRvIGRlbGF5IHRoZSBjcmFzaAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGEgY29tbWFuZCB0byBGVyBpbiBvcmRlciB0byBzaW11bGF0ZSBkaWZmZXJlbnQKKyAqIGtpbmRzIG9mIEZXIGNyYXNoZXMuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIHJlYXNvbnMgZm9yIGZhaWx1cmUKKyAqLworaW50IHdtYV9jcmFzaF9pbmplY3QodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLCB1aW50MzJfdCB0eXBlLAorCQkJdWludDMyX3QgZGVsYXlfdGltZV9tcykKK3sKKwlyZXR1cm4gd21pX2NyYXNoX2luamVjdCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCB0eXBlLCBkZWxheV90aW1lX21zKTsKK30KKyNpZiBkZWZpbmVkKEZFQVRVUkVfTFJPKQorLyoqCisgKiB3bWFfbHJvX2luaXQoKSAtIHNlbmRzIExSTyBjb25maWd1cmF0aW9uIHRvIEZXCisgKiBAbHJvX2NvbmZpZzogICAgICAgICBwb2ludGVyIHRvIHRoZSBjb25maWcgcGFyYW1ldGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5kcyBMUk8gY29uZmlndXJhdGlvbiB0byBGVy4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgcmVhc29ucyBmb3IgZmFpbHVyZQorICovCitpbnQgd21hX2xyb19pbml0KHN0cnVjdCB3bWFfbHJvX2NvbmZpZ19jbWRfdCAqbHJvX2NvbmZpZykKK3sKKwljZHNfbXNnX3QgbXNnID0gezB9OworCXN0cnVjdCB3bWFfbHJvX2NvbmZpZ19jbWRfdCAqaXdjbWQ7CisKKwlpd2NtZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqaXdjbWQpKTsKKwlpZiAoIWl3Y21kKSB7CisJCVdNQV9MT0dFKCJtZW1vcnkgYWxsb2NhdGlvbiBmb3IgV01BX0xST19DT05GSUdfQ01EIGZhaWxlZCEiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJKml3Y21kID0gKmxyb19jb25maWc7CisKKwltc2cudHlwZSA9IFdNQV9MUk9fQ09ORklHX0NNRDsKKwltc2cucmVzZXJ2ZWQgPSAwOworCW1zZy5ib2R5cHRyID0gaXdjbWQ7CisKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCWNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9XTUEsICZtc2cpKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcG9zdCBXTUFfTFJPX0NPTkZJR19DTUQgbXNnISIpOworCQljZGZfbWVtX2ZyZWUoaXdjbWQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlXTUFfTE9HRCgic2VuZGluZyB0aGUgTFJPIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGZ3Iik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvd21hL3NyYy93bWFfbWdtdC5jIGIvY29yZS93bWEvc3JjL3dtYV9tZ210LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMGIzYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvd21hL3NyYy93bWFfbWdtdC5jCkBAIC0wLDAgKzEsMzIwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiAgRE9DOiAgd21hX21nbXQuYworICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgU1RBL1NBUC9JQlNTIGFuZCBwcm90b2NvbCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCisvKiBIZWFkZXIgZmlsZXMgKi8KKworI2luY2x1ZGUgIndtYS5oIgorI2luY2x1ZGUgIndtYV9hcGkuaCIKKyNpbmNsdWRlICJjZHNfYXBpLmgiCisjaW5jbHVkZSAid21pX3VuaWZpZWRfYXBpLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfc3lzLmgiCisjaW5jbHVkZSAid25pX2FwaS5oIgorI2luY2x1ZGUgImFuaV9nbG9iYWwuaCIKKyNpbmNsdWRlICJ3bWlfdW5pZmllZC5oIgorI2luY2x1ZGUgInduaV9jZmcuaCIKKyNpbmNsdWRlICJjZmdfYXBpLmgiCisjaW5jbHVkZSAib2xfdHhyeF9jdHJsX2FwaS5oIgorI2luY2x1ZGUgIndsYW5fdGd0X2RlZl9jb25maWcuaCIKKworI2luY2x1ZGUgImNkZl9uYnVmLmgiCisjaW5jbHVkZSAiY2RmX3R5cGVzLmgiCisjaW5jbHVkZSAib2xfdHhyeF9hcGkuaCIKKyNpbmNsdWRlICJjZGZfbWVtb3J5LmgiCisjaW5jbHVkZSAib2xfdHhyeF90eXBlcy5oIgorI2luY2x1ZGUgIm9sX3R4cnhfcGVlcl9maW5kLmgiCisKKyNpbmNsdWRlICJ3bWFfdHlwZXMuaCIKKyNpbmNsdWRlICJsaW1fYXBpLmgiCisjaW5jbHVkZSAibGltX3Nlc3Npb25fdXRpbHMuaCIKKworI2luY2x1ZGUgImNkc191dGlscy5oIgorCisjaWYgIWRlZmluZWQoUkVNT1ZFX1BLVF9MT0cpCisjaW5jbHVkZSAicGt0bG9nX2FjLmgiCisjZW5kaWYgLyogUkVNT1ZFX1BLVF9MT0cgKi8KKworI2luY2x1ZGUgImRiZ2xvZ19ob3N0LmgiCisjaW5jbHVkZSAiY3NyX2FwaS5oIgorI2luY2x1ZGUgIm9sX2Z3LmgiCisjaW5jbHVkZSAiZGZzLmgiCisjaW5jbHVkZSAid21hX2ludGVybmFsLmgiCisKKy8qKgorICogd21hX3NlbmRfYmNuX2J1Zl9sbCgpIC0gcHJlcGFyZSBhbmQgc2VuZCBiZWFjb24gYnVmZmVyIHRvIGZ3IGZvciBMTAorICogQHdtYTogd21hIGhhbmRsZQorICogQHBkZXY6IHR4cnggcGRldgorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBwYXJhbV9idWY6IFNXQkEgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfc2VuZF9iY25fYnVmX2xsKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiwKKwkJCQl1aW50OF90IHZkZXZfaWQsCisJCQkJV01JX0hPU1RfU1dCQV9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZikKK3sKKwl3bWlfYmNuX3NlbmRfZnJvbV9ob3N0X2NtZF9maXhlZF9wYXJhbSAqY21kOworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoOworCXN0cnVjdCBiZWFjb25faW5mbyAqYmNuOworCXdtaV90aW1faW5mbyAqdGltX2luZm8gPSBwYXJhbV9idWYtPnRpbV9pbmZvOworCXVpbnQ4X3QgKmJjbl9wYXlsb2FkOworCXdtaV9idWZfdCB3bWlfYnVmOworCUNERl9TVEFUVVMgcmV0OworCXN0cnVjdCBiZWFjb25fdGltX2llICp0aW1faWU7CisJd21pX3AycF9ub2FfaW5mbyAqcDJwX25vYV9pbmZvID0gcGFyYW1fYnVmLT5wMnBfbm9hX2luZm87CisJc3RydWN0IHAycF9zdWJfZWxlbWVudF9ub2Egbm9hX2llOworCXVpbnQ4X3QgaTsKKwlpbnQgc3RhdHVzOworCisJYmNuID0gd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmJlYWNvbjsKKwlpZiAoIWJjbi0+YnVmKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBiZWFjb24gYnVmZmVyIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJd21pX2J1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBzaXplb2YoKmNtZCkpOworCWlmICghd21pX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJY2RmX3NwaW5fbG9ja19iaCgmYmNuLT5sb2NrKTsKKworCWJjbl9wYXlsb2FkID0gY2RmX25idWZfZGF0YShiY24tPmJ1Zik7CisKKwl0aW1faWUgPSAoc3RydWN0IGJlYWNvbl90aW1faWUgKikoJmJjbl9wYXlsb2FkW2Jjbi0+dGltX2llX29mZnNldF0pOworCisJaWYgKHRpbV9pbmZvLT50aW1fY2hhbmdlZCkgeworCQlpZiAodGltX2luZm8tPnRpbV9udW1fcHNfcGVuZGluZykKKwkJCWNkZl9tZW1fY29weSgmdGltX2llLT50aW1fYml0bWFwLCB0aW1faW5mby0+dGltX2JpdG1hcCwKKwkJCQkgICAgIFdNQV9USU1fU1VQUE9SVEVEX1BWQl9MRU5HVEgpOworCQllbHNlCisJCQljZGZfbWVtX3plcm8oJnRpbV9pZS0+dGltX2JpdG1hcCwKKwkJCQkgICAgIFdNQV9USU1fU1VQUE9SVEVEX1BWQl9MRU5HVEgpOworCQkvKgorCQkgKiBDdXJyZW50bHkgd2Ugc3VwcG9ydCBmaXhlZCBudW1iZXIgb2YKKwkJICogcGVlcnMgYXMgbGltaXRlZCBieSBIQUxfTlVNX1NUQS4KKwkJICogdGltIG9mZnNldCBpcyBhbHdheXMgMAorCQkgKi8KKwkJdGltX2llLT50aW1fYml0Y3RsID0gMDsKKwl9CisKKwkvKiBVcGRhdGUgRFRJTSBDb3VudCAqLworCWlmICh0aW1faWUtPmR0aW1fY291bnQgPT0gMCkKKwkJdGltX2llLT5kdGltX2NvdW50ID0gdGltX2llLT5kdGltX3BlcmlvZCAtIDE7CisJZWxzZQorCQl0aW1faWUtPmR0aW1fY291bnQtLTsKKworCS8qCisJICogRFRJTSBjb3VudCBuZWVkcyB0byBiZSBiYWNrZWR1cCBzbyB0aGF0CisJICogd2hlbiB1bWFjIHVwZGF0ZXMgdGhlIGJlYWNvbiB0ZW1wbGF0ZQorCSAqIGN1cnJlbnQgZHRpbSBjb3VudCBjYW4gYmUgdXBkYXRlZCBwcm9wZXJseQorCSAqLworCWJjbi0+ZHRpbV9jb3VudCA9IHRpbV9pZS0+ZHRpbV9jb3VudDsKKworCS8qIHVwZGF0ZSBzdGF0ZSBmb3IgYnVmZmVyZWQgbXVsdGljYXN0IGZyYW1lcyBvbiBEVElNICovCisJaWYgKHRpbV9pbmZvLT50aW1fbWNhc3QgJiYgKHRpbV9pZS0+ZHRpbV9jb3VudCA9PSAwIHx8CisJCQkJICAgIHRpbV9pZS0+ZHRpbV9wZXJpb2QgPT0gMSkpCisJCXRpbV9pZS0+dGltX2JpdGN0bCB8PSAxOworCWVsc2UKKwkJdGltX2llLT50aW1fYml0Y3RsICY9IH4xOworCisJLyogVG8gYXZvaWQgc3cgZ2VuZXJhdGVkIGZyYW1lIHNlcXVlbmNlIHRoZSBzYW1lIGFzIEgvVyBnZW5lcmF0ZWQgZnJhbWUsCisJICogdGhlIHZhbHVlIGxvd2VyIHRoYW4gbWluX3N3X3NlcSBpcyByZXNlcnZlZCBmb3IgSFcgZ2VuZXJhdGVkIGZyYW1lICovCisJaWYgKChiY24tPnNlcV9ubyAmIElFRUU4MDIxMV9TRVFfTUFTSykgPCBNSU5fU1dfU0VRKQorCQliY24tPnNlcV9ubyA9IE1JTl9TV19TRVE7CisKKwl3aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopYmNuX3BheWxvYWQ7CisJKih1aW50MTZfdCAqKSAmd2gtPmlfc2VxWzBdID0gaHRvbGUxNihiY24tPnNlcV9ubworCQkJCQkgICAgICA8PCBJRUVFODAyMTFfU0VRX1NFUV9TSElGVCk7CisJYmNuLT5zZXFfbm8rKzsKKworCWlmIChXTUlfVU5JRklFRF9OT0FfQVRUUl9JU19NT0RJRklFRChwMnBfbm9hX2luZm8pKSB7CisJCWNkZl9tZW1femVybygmbm9hX2llLCBzaXplb2Yobm9hX2llKSk7CisKKwkJbm9hX2llLmluZGV4ID0KKwkJCSh1aW50OF90KSBXTUlfVU5JRklFRF9OT0FfQVRUUl9JTkRFWF9HRVQocDJwX25vYV9pbmZvKTsKKwkJbm9hX2llLm9wcFBTID0KKwkJCSh1aW50OF90KSBXTUlfVU5JRklFRF9OT0FfQVRUUl9PUFBfUFNfR0VUKHAycF9ub2FfaW5mbyk7CisJCW5vYV9pZS5jdHdpbmRvdyA9CisJCQkodWludDhfdCkgV01JX1VOSUZJRURfTk9BX0FUVFJfQ1RXSU5fR0VUKHAycF9ub2FfaW5mbyk7CisJCW5vYV9pZS5udW1fZGVzY3JpcHRvcnMgPQorCQkJKHVpbnQ4X3QpIFdNSV9VTklGSUVEX05PQV9BVFRSX05VTV9ERVNDX0dFVChwMnBfbm9hX2luZm8pOworCQlXTUFfTE9HSSgiJXM6IGluZGV4ICV1LCBvcHBQcyAldSwgY3R3aW5kb3cgJXUsICIKKwkJCSAibnVtX2Rlc2NyaXB0b3JzID0gJXUiLCBfX2Z1bmNfXywgbm9hX2llLmluZGV4LAorCQkJIG5vYV9pZS5vcHBQUywgbm9hX2llLmN0d2luZG93LCBub2FfaWUubnVtX2Rlc2NyaXB0b3JzKTsKKwkJZm9yIChpID0gMDsgaSA8IG5vYV9pZS5udW1fZGVzY3JpcHRvcnM7IGkrKykgeworCQkJbm9hX2llLm5vYV9kZXNjcmlwdG9yc1tpXS50eXBlX2NvdW50ID0KKwkJCQkodWludDhfdCkgcDJwX25vYV9pbmZvLT5ub2FfZGVzY3JpcHRvcnNbaV0uCisJCQkJdHlwZV9jb3VudDsKKwkJCW5vYV9pZS5ub2FfZGVzY3JpcHRvcnNbaV0uZHVyYXRpb24gPQorCQkJCXAycF9ub2FfaW5mby0+bm9hX2Rlc2NyaXB0b3JzW2ldLmR1cmF0aW9uOworCQkJbm9hX2llLm5vYV9kZXNjcmlwdG9yc1tpXS5pbnRlcnZhbCA9CisJCQkJcDJwX25vYV9pbmZvLT5ub2FfZGVzY3JpcHRvcnNbaV0uaW50ZXJ2YWw7CisJCQlub2FfaWUubm9hX2Rlc2NyaXB0b3JzW2ldLnN0YXJ0X3RpbWUgPQorCQkJCXAycF9ub2FfaW5mby0+bm9hX2Rlc2NyaXB0b3JzW2ldLnN0YXJ0X3RpbWU7CisJCQlXTUFfTE9HSSgiJXM6IE5vQSBkZXNjcmlwdG9yWyVkXSB0eXBlX2NvdW50ICV1LCAiCisJCQkJICJkdXJhdGlvbiAldSwgaW50ZXJ2YWwgJXUsIHN0YXJ0X3RpbWUgPSAldSIsCisJCQkJIF9fZnVuY19fLCBpLAorCQkJCSBub2FfaWUubm9hX2Rlc2NyaXB0b3JzW2ldLnR5cGVfY291bnQsCisJCQkJIG5vYV9pZS5ub2FfZGVzY3JpcHRvcnNbaV0uZHVyYXRpb24sCisJCQkJIG5vYV9pZS5ub2FfZGVzY3JpcHRvcnNbaV0uaW50ZXJ2YWwsCisJCQkJIG5vYV9pZS5ub2FfZGVzY3JpcHRvcnNbaV0uc3RhcnRfdGltZSk7CisJCX0KKwkJd21hX3VwZGF0ZV9ub2EoYmNuLCAmbm9hX2llKTsKKworCQkvKiBTZW5kIGEgbXNnIHRvIExJTSB0byB1cGRhdGUgdGhlIE5vQSBJRSBpbiBwcm9iZSByZXNwb25zZQorCQkgKiBmcmFtZXMgdHJhbnNtaXR0ZWQgYnkgdGhlIGhvc3QgKi8KKwkJd21hX3VwZGF0ZV9wcm9iZV9yZXNwX25vYSh3bWEsICZub2FfaWUpOworCX0KKworCWlmIChiY24tPmRtYV9tYXBwZWQpIHsKKwkJY2RmX25idWZfdW5tYXBfc2luZ2xlKHBkZXYtPm9zZGV2LCBiY24tPmJ1ZiwgQ0RGX0RNQV9UT19ERVZJQ0UpOworCQliY24tPmRtYV9tYXBwZWQgPSAwOworCX0KKwlyZXQgPSBjZGZfbmJ1Zl9tYXBfc2luZ2xlKHBkZXYtPm9zZGV2LCBiY24tPmJ1ZiwgQ0RGX0RNQV9UT19ERVZJQ0UpOworCWlmIChyZXQgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCWNkZl9uYnVmX2ZyZWUod21pX2J1Zik7CisJCVdNQV9MT0dFKCIlczogZmFpbGVkIG1hcCBiZWFjb24gYnVmIHRvIERNQSByZWdpb24iLCBfX2Z1bmNfXyk7CisJCWNkZl9zcGluX3VubG9ja19iaCgmYmNuLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWJjbi0+ZG1hX21hcHBlZCA9IDE7CisJY21kID0gKHdtaV9iY25fc2VuZF9mcm9tX2hvc3RfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfYmNuX3NlbmRfZnJvbV9ob3N0X2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfYmNuX3NlbmRfZnJvbV9ob3N0X2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJY21kLT5kYXRhX2xlbiA9IGJjbi0+bGVuOworCWNtZC0+ZnJhbWVfY3RybCA9ICooKEFfVUlOVDE2ICopIHdoLT5pX2ZjKTsKKwljbWQtPmZyYWdfcHRyID0gY2RmX25idWZfZ2V0X2ZyYWdfcGFkZHJfbG8oYmNuLT5idWYsIDApOworCisJLyogbm90aWZ5IEZpcm13YXJlIG9mIERUTSBhbmQgbWNhc3QvYmNhc3QgdHJhZmZpYyAqLworCWlmICh0aW1faWUtPmR0aW1fY291bnQgPT0gMCkgeworCQljbWQtPmR0aW1fZmxhZyB8PSBXTUlfQkNOX1NFTkRfRFRJTV9aRVJPOworCQkvKiBkZWxpdmVyIG1jYXN0L2JjYXN0IHRyYWZmaWMgaW4gbmV4dCBEVElNIGJlYWNvbiAqLworCQlpZiAodGltX2llLT50aW1fYml0Y3RsICYgMHgwMSkKKwkJCWNtZC0+ZHRpbV9mbGFnIHw9IFdNSV9CQ05fU0VORF9EVElNX0JJVENUTF9TRVQ7CisJfQorCisJc3RhdHVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCB3bWlfYnVmLCBzaXplb2YoKmNtZCksCisJCQkJICAgICAgV01JX1BERVZfU0VORF9CQ05fQ01ESUQpOworCisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIFdNSV9QREVWX1NFTkRfQkNOX0NNRElEIGNvbW1hbmQiKTsKKwkJd21pX2J1Zl9mcmVlKHdtaV9idWYpOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJmJjbi0+bG9jayk7Cit9CisKKy8qKgorICogd21hX2JlYWNvbl9zd2JhX2hhbmRsZXIoKSAtIHN3YmEgZXZlbnQgaGFuZGxlcgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGV2ZW50OiBldmVudCBkYXRhCisgKiBAbGVuOiBkYXRhIGxlbmd0aAorICoKKyAqIFNXQkEgZXZlbnQgaXMgYWxlcnQgZXZlbnQgdG8gSG9zdCByZXF1ZXN0aW5nIGhvc3QgdG8gUXVldWUgYSBiZWFjb24KKyAqIGZvciB0cmFuc21pc3Npb24gdXNlIG9ubHkgaW4gaG9zdCBiZWFjb24gbW9kZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfYmVhY29uX3N3YmFfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50LCB1aW50MzJfdCBsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCVdNSV9IT1NUX1NXQkFfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX2hvc3Rfc3diYV9ldmVudF9maXhlZF9wYXJhbSAqc3diYV9ldmVudDsKKwl1aW50MzJfdCB2ZGV2X21hcDsKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXY7CisJdWludDhfdCB2ZGV2X2lkID0gMDsKKworCXBhcmFtX2J1ZiA9IChXTUlfSE9TVF9TV0JBX0VWRU5USURfcGFyYW1fdGx2cyAqKSBldmVudDsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiSW52YWxpZCBzd2JhIGV2ZW50IGJ1ZmZlciIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3diYV9ldmVudCA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJdmRldl9tYXAgPSBzd2JhX2V2ZW50LT52ZGV2X21hcDsKKworCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKwlpZiAoIXBkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBwZGV2IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoOyB2ZGV2X21hcDsgdmRldl9pZCsrLCB2ZGV2X21hcCA+Pj0gMSkgeworCQlpZiAoISh2ZGV2X21hcCAmIDB4MSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFvbF9jZmdfaXNfaGlnaF9sYXRlbmN5KHBkZXYtPmN0cmxfcGRldikpCisJCQl3bWFfc2VuZF9iY25fYnVmX2xsKHdtYSwgcGRldiwgdmRldl9pZCwgcGFyYW1fYnVmKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9wZWVyX3N0YV9raWNrb3V0X2V2ZW50X2hhbmRsZXIoKSAtIGtpY2tvdXQgZXZlbnQgaGFuZGxlcgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGV2ZW50OiBldmVudCBkYXRhCisgKiBAbGVuOiBkYXRhIGxlbmd0aAorICoKKyAqIEtpY2tvdXQgZXZlbnQgaXMgcmVjZWl2ZWQgZnJvbSBmaXJtd2FyZSBvbiBvYnNlcnZpbmcgYmVhY29uIG1pc3MKKyAqIEl0IGhhbmRsZXMga2lja291dCBldmVudCBmb3IgZGlmZmVyZW50IG1vZGVzIGFuZCBpbmRpY2F0ZSB0bworICogdXBwZXIgbGF5ZXJzLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfcGVlcl9zdGFfa2lja291dF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdTggKmV2ZW50LCB1MzIgbGVuKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlXTUlfUEVFUl9TVEFfS0lDS09VVF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZiA9IE5VTEw7CisJd21pX3BlZXJfc3RhX2tpY2tvdXRfZXZlbnRfZml4ZWRfcGFyYW0gKmtpY2tvdXRfZXZlbnQgPSBOVUxMOworCXVpbnQ4X3QgdmRldl9pZCwgcGVlcl9pZCwgbWFjYWRkcltJRUVFODAyMTFfQUREUl9MRU5dOworCW9sX3R4cnhfcGVlcl9oYW5kbGUgcGVlcjsKKwlvbF90eHJ4X3BkZXZfaGFuZGxlIHBkZXY7CisJdHBEZWxldGVTdGFDb250ZXh0IGRlbF9zdGFfY3R4OworCXRwU2lySWJzc1BlZXJJbmFjdGl2aXR5SW5kIHBfaW5hY3Rpdml0eTsKKworCVdNQV9MT0dEKCIlczogRW50ZXIiLCBfX2Z1bmNfXyk7CisJcGFyYW1fYnVmID0gKFdNSV9QRUVSX1NUQV9LSUNLT1VUX0VWRU5USURfcGFyYW1fdGx2cyAqKSBldmVudDsKKwlraWNrb3V0X2V2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJaWYgKCFwZGV2KSB7CisJCVdNQV9MT0dFKCIlczogcGRldiBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJV01JX01BQ19BRERSX1RPX0NIQVJfQVJSQVkoJmtpY2tvdXRfZXZlbnQtPnBlZXJfbWFjYWRkciwgbWFjYWRkcik7CisJcGVlciA9IG9sX3R4cnhfZmluZF9wZWVyX2J5X2FkZHIocGRldiwgbWFjYWRkciwgJnBlZXJfaWQpOworCWlmICghcGVlcikgeworCQlXTUFfTE9HRSgiUEVFUiBbJXBNXSBub3QgZm91bmQiLCBtYWNhZGRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG9sX3R4cnhfZ2V0X3ZkZXZpZChwZWVyLCAmdmRldl9pZCkgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCJOb3QgYWJsZSB0byBmaW5kIEJTU0lEIGZvciBwZWVyIFslcE1dIiwgbWFjYWRkcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCVdNQV9MT0dBKCIlczogUEVFUjpbJXBNXSwgQUREUjpbJXBOXSwgSU5URVJGQUNFOiVkLCBwZWVyX2lkOiVkLCByZWFzb246JWQiLAorCQlfX2Z1bmNfXywgbWFjYWRkciwgd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmFkZHIsIHZkZXZfaWQsCisJCSBwZWVyX2lkLCBraWNrb3V0X2V2ZW50LT5yZWFzb24pOworCisJc3dpdGNoIChraWNrb3V0X2V2ZW50LT5yZWFzb24pIHsKKwljYXNlIFdNSV9QRUVSX1NUQV9LSUNLT1VUX1JFQVNPTl9JQlNTX0RJU0NPTk5FQ1Q6CisJCXBfaW5hY3Rpdml0eSA9ICh0cFNpcklic3NQZWVySW5hY3Rpdml0eUluZCkKKwkJCSAgICAgICBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpcklic3NQZWVySW5hY3Rpdml0eUluZCkpOworCQlpZiAoIXBfaW5hY3Rpdml0eSkgeworCQkJV01BX0xPR0UoIkNERiBNRU0gQWxsb2MgRmFpbGVkIGZvciB0U2lySWJzc1BlZXJJbmFjdGl2aXR5Iik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXBfaW5hY3Rpdml0eS0+c3RhSWR4ID0gcGVlcl9pZDsKKwkJY2RmX21lbV9jb3B5KHBfaW5hY3Rpdml0eS0+cGVlckFkZHIsIG1hY2FkZHIsCisJCQkgICAgIElFRUU4MDIxMV9BRERSX0xFTik7CisJCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9JQlNTX1BFRVJfSU5BQ1RJVklUWV9JTkQsCisJCQkgICAgICh2b2lkICopcF9pbmFjdGl2aXR5LCAwKTsKKwkJZ290byBleGl0X2hhbmRsZXI7CisJCWJyZWFrOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKKwljYXNlIFdNSV9QRUVSX1NUQV9LSUNLT1VUX1JFQVNPTl9URExTX0RJU0NPTk5FQ1Q6CisJCWRlbF9zdGFfY3R4ID0gKHRwRGVsZXRlU3RhQ29udGV4dCkKKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0RGVsZXRlU3RhQ29udGV4dCkpOworCQlpZiAoIWRlbF9zdGFfY3R4KSB7CisJCQlXTUFfTE9HRSgiJXM6IG1lbSBhbGxvYyBmYWlsZWQgZm9yIHREZWxldGVTdGFDb250ZXh0IGZvciBURExTIHBlZXI6ICVwTSIsCisJCQkJX19mdW5jX18sIG1hY2FkZHIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlkZWxfc3RhX2N0eC0+c3RhSWQgPSBwZWVyX2lkOworCQljZGZfbWVtX2NvcHkoZGVsX3N0YV9jdHgtPmFkZHIyLCBtYWNhZGRyLCBJRUVFODAyMTFfQUREUl9MRU4pOworCQljZGZfbWVtX2NvcHkoZGVsX3N0YV9jdHgtPmJzc0lkLCB3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uYnNzaWQsCisJCQkgICAgIElFRUU4MDIxMV9BRERSX0xFTik7CisJCWRlbF9zdGFfY3R4LT5yZWFzb25Db2RlID0gSEFMX0RFTF9TVEFfUkVBU09OX0NPREVfS0VFUF9BTElWRTsKKwkJd21hX3NlbmRfbXNnKHdtYSwgU0lSX0xJTV9ERUxFVEVfU1RBX0NPTlRFWFRfSU5ELAorCQkJICAgICAodm9pZCAqKWRlbF9zdGFfY3R4LCAwKTsKKwkJZ290byBleGl0X2hhbmRsZXI7CisJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9URExTICovCisKKwljYXNlIFdNSV9QRUVSX1NUQV9LSUNLT1VUX1JFQVNPTl9YUkVUUlk6CisJCWlmICh3bWEtPmludGVyZmFjZXNbdmRldl9pZF0udHlwZSA9PSBXTUlfVkRFVl9UWVBFX1NUQSAmJgorCQkgICAgKHdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5zdWJfdHlwZSA9PSAwIHx8CisJCSAgICAgd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnN1Yl90eXBlID09CisJCSAgICAgV01JX1VOSUZJRURfVkRFVl9TVUJUWVBFX1AyUF9DTElFTlQpICYmCisJCSAgICBjZGZfbWVtX2NvbXBhcmUod21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmJzc2lkLAorCQkJCSAgICBtYWNhZGRyLCBJRUVFODAyMTFfQUREUl9MRU4pKSB7CisJCQkvKgorCQkJICogS0lDS09VVCBldmVudCBpcyBmb3IgY3VycmVudCBzdGF0aW9uLUFQIGNvbm5lY3Rpb24uCisJCQkgKiBUcmVhdCBpdCBsaWtlIGZpbmFsIGJlYWNvbiBtaXNzLiBTdGF0aW9uIG1heSBub3QgaGF2ZQorCQkJICogbWlzc2VkIGJlYWNvbnMgYnV0IG5vdCBhYmxlIHRvIHRyYW5zbWl0IGZyYW1lcyB0byBBUAorCQkJICogZm9yIGEgbG9uZyB0aW1lLiBNdXN0IGRpc2Nvbm5lY3QgdG8gZ2V0IG91dCBvZgorCQkJICogdGhpcyBzdGlja3kgc2l0dWF0aW9uLgorCQkJICogSW4gZnV0dXJlIGltcGxlbWVudGF0aW9uLCByb2FtaW5nIG1vZHVsZSB3aWxsIGFsc28KKwkJCSAqIGhhbmRsZSB0aGlzIGV2ZW50IGFuZCBwZXJmb3JtIGEgc2Nhbi4KKwkJCSAqLworCQkJV01BX0xPR1coIiVzOiBXTUlfUEVFUl9TVEFfS0lDS09VVF9SRUFTT05fWFJFVFJZIGV2ZW50IGZvciBTVEEiLAorCQkJCV9fZnVuY19fKTsKKwkJCXdtYV9iZWFjb25fbWlzc19oYW5kbGVyKHdtYSwgdmRldl9pZCk7CisJCQlnb3RvIGV4aXRfaGFuZGxlcjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgV01JX1BFRVJfU1RBX0tJQ0tPVVRfUkVBU09OX1VOU1BFQ0lGSUVEOgorCQkvKgorCQkgKiBEZWZhdWx0IGxlZ2FjeSB2YWx1ZSB1c2VkIGJ5IG9yaWdpbmFsIGZpcm13YXJlIGltcGxlbWVudGF0aW9uLgorCQkgKi8KKwkJaWYgKHdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS50eXBlID09IFdNSV9WREVWX1RZUEVfU1RBICYmCisJCSAgICAod21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnN1Yl90eXBlID09IDAgfHwKKwkJICAgICB3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uc3ViX3R5cGUgPT0KKwkJICAgICBXTUlfVU5JRklFRF9WREVWX1NVQlRZUEVfUDJQX0NMSUVOVCkgJiYKKwkJICAgIGNkZl9tZW1fY29tcGFyZSh3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uYnNzaWQsCisJCQkJICAgIG1hY2FkZHIsIElFRUU4MDIxMV9BRERSX0xFTikpIHsKKwkJCS8qCisJCQkgKiBLSUNLT1VUIGV2ZW50IGlzIGZvciBjdXJyZW50IHN0YXRpb24tQVAgY29ubmVjdGlvbi4KKwkJCSAqIFRyZWF0IGl0IGxpa2UgZmluYWwgYmVhY29uIG1pc3MuIFN0YXRpb24gbWF5IG5vdCBoYXZlCisJCQkgKiBtaXNzZWQgYmVhY29ucyBidXQgbm90IGFibGUgdG8gdHJhbnNtaXQgZnJhbWVzIHRvIEFQCisJCQkgKiBmb3IgYSBsb25nIHRpbWUuIE11c3QgZGlzY29ubmVjdCB0byBnZXQgb3V0IG9mCisJCQkgKiB0aGlzIHN0aWNreSBzaXR1YXRpb24uCisJCQkgKiBJbiBmdXR1cmUgaW1wbGVtZW50YXRpb24sIHJvYW1pbmcgbW9kdWxlIHdpbGwgYWxzbworCQkJICogaGFuZGxlIHRoaXMgZXZlbnQgYW5kIHBlcmZvcm0gYSBzY2FuLgorCQkJICovCisJCQlXTUFfTE9HVygiJXM6IFdNSV9QRUVSX1NUQV9LSUNLT1VUX1JFQVNPTl9VTlNQRUNJRklFRCBldmVudCBmb3IgU1RBIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQl3bWFfYmVhY29uX21pc3NfaGFuZGxlcih3bWEsIHZkZXZfaWQpOworCQkJZ290byBleGl0X2hhbmRsZXI7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdNSV9QRUVSX1NUQV9LSUNLT1VUX1JFQVNPTl9JTkFDVElWSVRZOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qCisJICogZGVmYXVsdCBhY3Rpb24gaXMgdG8gc2VuZCBkZWxldGUgc3RhdGlvbiBjb250ZXh0IGluZGljYXRpb24gdG8gTElNCisJICovCisJZGVsX3N0YV9jdHggPQorCQkodHBEZWxldGVTdGFDb250ZXh0KSBjZGZfbWVtX21hbGxvYyhzaXplb2YodERlbGV0ZVN0YUNvbnRleHQpKTsKKwlpZiAoIWRlbF9zdGFfY3R4KSB7CisJCVdNQV9MT0dFKCJDREYgTUVNIEFsbG9jIEZhaWxlZCBmb3IgdERlbGV0ZVN0YUNvbnRleHQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGVsX3N0YV9jdHgtPnN0YUlkID0gcGVlcl9pZDsKKwljZGZfbWVtX2NvcHkoZGVsX3N0YV9jdHgtPmFkZHIyLCBtYWNhZGRyLCBJRUVFODAyMTFfQUREUl9MRU4pOworCWNkZl9tZW1fY29weShkZWxfc3RhX2N0eC0+YnNzSWQsIHdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5hZGRyLAorCQkgICAgIElFRUU4MDIxMV9BRERSX0xFTik7CisJZGVsX3N0YV9jdHgtPnJlYXNvbkNvZGUgPSBIQUxfREVMX1NUQV9SRUFTT05fQ09ERV9LRUVQX0FMSVZFOworCXdtYV9zZW5kX21zZyh3bWEsIFNJUl9MSU1fREVMRVRFX1NUQV9DT05URVhUX0lORCwgKHZvaWQgKilkZWxfc3RhX2N0eCwKKwkJICAgICAwKTsKKworZXhpdF9oYW5kbGVyOgorCVdNQV9MT0dEKCIlczogRXhpdCIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfdW5pZmllZF9iY250eF9zdGF0dXNfZXZlbnRfaGFuZGxlcigpIC0gYmVhY29uIHR4IHN0YXR1cyBldmVudCBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAY21kX3BhcmFtX2luZm86IGV2ZW50IGRhdGEKKyAqIEBsZW46IGRhdGEgbGVuZ3RoCisgKgorICogV01JIEhhbmRsZXIgZm9yIFdNSV9PRkZMT0FEX0JDTl9UWF9TVEFUVVNfRVZFTlRJRCBldmVudCBmcm9tIGZpcm13YXJlLgorICogVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYnkgRlcgd2hlbiB0aGUgYmVhY29uIHRyYW5zbWlzc2lvbiBpcyBvZmZsb2FkZWQKKyAqIGFuZCB0aGUgaG9zdCBwZXJmb3JtcyBiZWFjb24gdGVtcGxhdGUgbW9kaWZpY2F0aW9uIHVzaW5nIFdNSV9CQ05fVE1QTF9DTURJRAorICogVGhlIEZXIGdlbmVyYXRlcyB0aGlzIGV2ZW50IHdoZW4gdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgYmVhY29uIHRyYW5zbWlzc2lvbgorICogYWZ0ZXIgdGVtcGxhdGUgdXBkYXRlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV91bmlmaWVkX2JjbnR4X3N0YXR1c19ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkJICAgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJCSAgIHVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX09GRkxPQURfQkNOX1RYX1NUQVRVU19FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfb2ZmbG9hZF9iY25fdHhfc3RhdHVzX2V2ZW50X2ZpeGVkX3BhcmFtICpyZXNwX2V2ZW50OworCXRTaXJGaXJzdEJlYWNvblR4Q29tcGxldGVJbmQgKmJlYWNvbl90eF9jb21wbGV0ZV9pbmQ7CisKKwlwYXJhbV9idWYgPQorCQkoV01JX09GRkxPQURfQkNOX1RYX1NUQVRVU19FVkVOVElEX3BhcmFtX3RsdnMgKikgY21kX3BhcmFtX2luZm87CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgYmNuIHR4IHJlc3BvbnNlIGV2ZW50IGJ1ZmZlciIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXNwX2V2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKworCS8qIENoZWNrIGZvciB2YWxpZCBoYW5kbGUgdG8gZW5zdXJlIHNlc3Npb24gaXMgbm90CisJICogZGVsZXRlZCBpbiBhbnkgcmFjZQorCSAqLworCWlmICghd21hLT5pbnRlcmZhY2VzW3Jlc3BfZXZlbnQtPnZkZXZfaWRdLmhhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFRoZSBzZXNzaW9uIGRvZXMgbm90IGV4aXN0IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBCZWFjb24gVHggSW5kaWNhdGlvbiBzdXBwb3J0cyBvbmx5IEFQIG1vZGUuIElnbm9yZSBpbiBvdGhlciBtb2RlcyAqLworCWlmICh3bWFfaXNfdmRldl9pbl9hcF9tb2RlKHdtYSwgcmVzcF9ldmVudC0+dmRldl9pZCkgPT0gZmFsc2UpIHsKKwkJV01BX0xPR0koIiVzOiBCZWFjb24gVHggSW5kaWNhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHR5cGUgJWQgYW5kIHN1Yl90eXBlICVkIiwKKwkJCV9fZnVuY19fLCB3bWEtPmludGVyZmFjZXNbcmVzcF9ldmVudC0+dmRldl9pZF0udHlwZSwKKwkJCXdtYS0+aW50ZXJmYWNlc1tyZXNwX2V2ZW50LT52ZGV2X2lkXS5zdWJfdHlwZSk7CisJCXJldHVybiAwOworCX0KKworCWJlYWNvbl90eF9jb21wbGV0ZV9pbmQgPSAodFNpckZpcnN0QmVhY29uVHhDb21wbGV0ZUluZCAqKQorCQkJY2RmX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJGaXJzdEJlYWNvblR4Q29tcGxldGVJbmQpKTsKKwlpZiAoIWJlYWNvbl90eF9jb21wbGV0ZV9pbmQpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gYWxsb2MgYmVhY29uX3R4X2NvbXBsZXRlX2luZCIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwliZWFjb25fdHhfY29tcGxldGVfaW5kLT5tZXNzYWdlVHlwZSA9IFdNQV9ERlNfQkVBQ09OX1RYX1NVQ0NFU1NfSU5EOworCWJlYWNvbl90eF9jb21wbGV0ZV9pbmQtPmxlbmd0aCA9IHNpemVvZih0U2lyRmlyc3RCZWFjb25UeENvbXBsZXRlSW5kKTsKKwliZWFjb25fdHhfY29tcGxldGVfaW5kLT5ic3NJZHggPSByZXNwX2V2ZW50LT52ZGV2X2lkOworCisJd21hX3NlbmRfbXNnKHdtYSwgV01BX0RGU19CRUFDT05fVFhfU1VDQ0VTU19JTkQsCisJCSAgICAgKHZvaWQgKiliZWFjb25fdHhfY29tcGxldGVfaW5kLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfZ2V0X2xpbmtfcHJvYmVfdGltZW91dCgpIC0gZ2V0IGxpbmsgdGltZW91dCBiYXNlZCBvbiBzdWIgdHlwZQorICogQG1hYzogVU1BQyBoYW5kbGVyCisgKiBAc3ViX3R5cGU6IHZkZXYgc3liIHR5cGUKKyAqIEBtYXhfaW5hY3RpdmVfdGltZTogcmV0dXJuIG1heCBpbmFjdGl2ZSB0aW1lCisgKiBAbWF4X3VucmVzcG9uc2l2ZV90aW1lOiByZXR1cm4gbWF4IHVucmVzcG9uc2l2ZSB0aW1lCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3bWFfZ2V0X2xpbmtfcHJvYmVfdGltZW91dChzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqbWFjLAorCQkJCQkgICAgICB1aW50MzJfdCBzdWJfdHlwZSwKKwkJCQkJICAgICAgdWludDMyX3QgKm1heF9pbmFjdGl2ZV90aW1lLAorCQkJCQkgICAgICB1aW50MzJfdCAqbWF4X3VucmVzcG9uc2l2ZV90aW1lKQoreworCXVpbnQzMl90IGtlZXBfYWxpdmU7CisJdWludDE2X3QgbG1faWQsIGthX2lkOworCisJc3dpdGNoIChzdWJfdHlwZSkgeworCWNhc2UgV01JX1VOSUZJRURfVkRFVl9TVUJUWVBFX1AyUF9HTzoKKwkJbG1faWQgPSBXTklfQ0ZHX0dPX0xJTktfTU9OSVRPUl9USU1FT1VUOworCQlrYV9pZCA9IFdOSV9DRkdfR09fS0VFUF9BTElWRV9USU1FT1VUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKkZvciBzb2Z0QXAgdGhlIHN1YnR5cGUgdmFsdWUgd2lsbCBiZSB6ZXJvICovCisJCWxtX2lkID0gV05JX0NGR19BUF9MSU5LX01PTklUT1JfVElNRU9VVDsKKwkJa2FfaWQgPSBXTklfQ0ZHX0FQX0tFRVBfQUxJVkVfVElNRU9VVDsKKwl9CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWMsIGxtX2lkLCBtYXhfaW5hY3RpdmVfdGltZSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcmVhZCBsaW5rIG1vbml0b3IgZm9yIHN1YnR5cGUgJWQiLAorCQkJIHN1Yl90eXBlKTsKKwkJKm1heF9pbmFjdGl2ZV90aW1lID0gV01BX0xJTktfTU9OSVRPUl9ERUZBVUxUX1RJTUVfU0VDUzsKKwl9CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWMsIGthX2lkLCAma2VlcF9hbGl2ZSkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcmVhZCBrZWVwIGFsaXZlIGZvciBzdWJ0eXBlICVkIiwgc3ViX3R5cGUpOworCQlrZWVwX2FsaXZlID0gV01BX0tFRVBfQUxJVkVfREVGQVVMVF9USU1FX1NFQ1M7CisJfQorCSptYXhfdW5yZXNwb25zaXZlX3RpbWUgPSAqbWF4X2luYWN0aXZlX3RpbWUgKyBrZWVwX2FsaXZlOworfQorCisvKioKKyAqIHdtYV9zZXRfc2FwX2tlZXBhbGl2ZSgpIC0gc2V0IFNBUCBrZWVwIGFsaXZlIHBhcmFtZXRlcnMgdG8gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3NldF9zYXBfa2VlcGFsaXZlKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IHZkZXZfaWQpCit7CisJdWludDMyX3QgbWluX2luYWN0aXZlX3RpbWUsIG1heF9pbmFjdGl2ZV90aW1lLCBtYXhfdW5yZXNwb25zaXZlX3RpbWU7CisJc3RydWN0IHNBbmlTaXJHbG9iYWwgKm1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKworCWlmIChOVUxMID09IG1hYykgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgbWFjIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJd21hX2dldF9saW5rX3Byb2JlX3RpbWVvdXQobWFjLCB3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uc3ViX3R5cGUsCisJCQkJICAgJm1heF9pbmFjdGl2ZV90aW1lLCAmbWF4X3VucmVzcG9uc2l2ZV90aW1lKTsKKworCW1pbl9pbmFjdGl2ZV90aW1lID0gbWF4X2luYWN0aXZlX3RpbWUgLyAyOworCisJaWYgKHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLAorCQl2ZGV2X2lkLCBXTUlfVkRFVl9QQVJBTV9BUF9LRUVQQUxJVkVfTUlOX0lETEVfSU5BQ1RJVkVfVElNRV9TRUNTLAorCQkJCQltaW5faW5hY3RpdmVfdGltZSkpCisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gU2V0IEFQIE1JTiBJRExFIElOQUNUSVZFIFRJTUUiKTsKKworCWlmICh3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJdmRldl9pZCwgV01JX1ZERVZfUEFSQU1fQVBfS0VFUEFMSVZFX01BWF9JRExFX0lOQUNUSVZFX1RJTUVfU0VDUywKKwkJCQkJICAgIG1heF9pbmFjdGl2ZV90aW1lKSkKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBTZXQgQVAgTUFYIElETEUgSU5BQ1RJVkUgVElNRSIpOworCisJaWYgKHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLAorCQl2ZGV2X2lkLCBXTUlfVkRFVl9QQVJBTV9BUF9LRUVQQUxJVkVfTUFYX1VOUkVTUE9OU0lWRV9USU1FX1NFQ1MsCisJCQkJCSAgICBtYXhfdW5yZXNwb25zaXZlX3RpbWUpKQorCQlXTUFfTE9HRSgiRmFpbGVkIHRvIFNldCBNQVggVU5SRVNQT05TSVZFIFRJTUUiKTsKKworCVdNQV9MT0dEKCIlczp2ZGV2X2lkOiVkIG1pbl9pbmFjdGl2ZV90aW1lOiAldSBtYXhfaW5hY3RpdmVfdGltZTogJXUiCisJCSAiIG1heF91bnJlc3BvbnNpdmVfdGltZTogJXUiLCBfX2Z1bmNfXywgdmRldl9pZCwKKwkJIG1pbl9pbmFjdGl2ZV90aW1lLCBtYXhfaW5hY3RpdmVfdGltZSwgbWF4X3VucmVzcG9uc2l2ZV90aW1lKTsKK30KKworLyoqCisgKiB3bWFfc2V0X3N0YV9rZWVwX2FsaXZlKCkgLSBzZXQgc3RhIGtlZXAgYWxpdmUgcGFyYW1ldGVycworICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBtZXRob2Q6IG1ldGhvZCBmb3Iga2VlcCBhbGl2ZQorICogQHRpbWVwZXJpb2Q6IHRpbWUgcGVyaW9kCisgKiBAaG9zdHY0YWRkcjogaG9zdCBpcHY0IGFkZHJlc3MKKyAqIEBkZXN0djRhZGRyOiBkc3QgaXB2NCBhZGRyZXNzCisgKiBAZGVzdG1hYzogZGVzdGluYXRpb24gbWFjCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIGtlZXAgYWxpdmUgcmVsYXRlZCBwYXJhbWV0ZXJzIGluIGZ3LgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9zZXRfc3RhX2tlZXBfYWxpdmUodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCwKKwkJCSAgICB1aW50MzJfdCBtZXRob2QsIHVpbnQzMl90IHRpbWVwZXJpb2QsCisJCQkgICAgdWludDhfdCAqaG9zdHY0YWRkciwgdWludDhfdCAqZGVzdHY0YWRkciwKKwkJCSAgICB1aW50OF90ICpkZXN0bWFjKQoreworCXdtaV9idWZfdCBidWY7CisJV01JX1NUQV9LRUVQQUxJVkVfQ01EX2ZpeGVkX3BhcmFtICpjbWQ7CisJV01JX1NUQV9LRUVQQUxWRV9BUlBfUkVTUE9OU0UgKmFycF9yc3A7CisJdWludDhfdCAqYnVmX3B0cjsKKwlpbnQgbGVuOworCisJV01BX0xPR0QoIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKworCWlmICh0aW1lcGVyaW9kID4gV05JX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfU1RBTUFYKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIHBlcmlvZCAlZCBNYXggbGltaXQgJWQiLCB0aW1lcGVyaW9kLAorCQkJV05JX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfU1RBTUFYKTsKKwkJcmV0dXJuOworCX0KKworCWxlbiA9IHNpemVvZigqY21kKSArIHNpemVvZigqYXJwX3JzcCk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIndtaV9idWZfYWxsb2MgZmFpbGVkIik7CisJCXJldHVybjsKKwl9CisKKwljbWQgPSAoV01JX1NUQV9LRUVQQUxJVkVfQ01EX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSBjbWQ7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfV01JX1NUQV9LRUVQQUxJVkVfQ01EX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKFdNSV9TVEFfS0VFUEFMSVZFX0NNRF9maXhlZF9wYXJhbSkpOworCWNtZC0+aW50ZXJ2YWwgPSB0aW1lcGVyaW9kOworCWNtZC0+ZW5hYmxlID0gKHRpbWVwZXJpb2QpID8gMSA6IDA7CisJY21kLT52ZGV2X2lkID0gdmRldl9pZDsKKwlXTUFfTE9HRCgiS2VlcCBBbGl2ZTogdmRldl9pZDolZCBpbnRlcnZhbDoldSBtZXRob2Q6JWQiLCB2ZGV2X2lkLAorCQkgdGltZXBlcmlvZCwgbWV0aG9kKTsKKwlhcnBfcnNwID0gKFdNSV9TVEFfS0VFUEFMVkVfQVJQX1JFU1BPTlNFICopIChidWZfcHRyICsgc2l6ZW9mKCpjbWQpKTsKKwlXTUlUTFZfU0VUX0hEUigmYXJwX3JzcC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfV01JX1NUQV9LRUVQQUxWRV9BUlBfUkVTUE9OU0UsCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oV01JX1NUQV9LRUVQQUxWRV9BUlBfUkVTUE9OU0UpKTsKKworCWlmIChtZXRob2QgPT0gU0lSX0tFRVBfQUxJVkVfVU5TT0xJQ0lUX0FSUF9SU1ApIHsKKwkJY21kLT5tZXRob2QgPSBXTUlfU1RBX0tFRVBBTElWRV9NRVRIT0RfVU5TT0xJQ0lURURfQVJQX1JFU1BPTlNFOworCQljZGZfbWVtX2NvcHkoJmFycF9yc3AtPnNlbmRlcl9wcm90X2FkZHIsIGhvc3R2NGFkZHIsCisJCQkgICAgIFNJUl9JUFY0X0FERFJfTEVOKTsKKwkJY2RmX21lbV9jb3B5KCZhcnBfcnNwLT50YXJnZXRfcHJvdF9hZGRyLCBkZXN0djRhZGRyLAorCQkJICAgICBTSVJfSVBWNF9BRERSX0xFTik7CisJCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKGRlc3RtYWMsICZhcnBfcnNwLT5kZXN0X21hY19hZGRyKTsKKwl9IGVsc2UgeworCQljbWQtPm1ldGhvZCA9IFdNSV9TVEFfS0VFUEFMSVZFX01FVEhPRF9OVUxMX0ZSQU1FOworCX0KKworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSBXTUlfU1RBX0tFRVBBTElWRV9DTURJRCkpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXQgS2VlcEFsaXZlIik7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwl9CisKKwlXTUFfTE9HRCgiJXM6IEV4aXQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuOworfQorCisvKioKKyAqIHdtYV92ZGV2X2luc3RhbGxfa2V5X2NvbXBsZXRlX2V2ZW50X2hhbmRsZXIoKSAtIGluc3RhbGwga2V5IGNvbXBsZXRlIGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBldmVudDogZXZlbnQgZGF0YQorICogQGxlbjogZGF0YSBsZW5ndGgKKyAqCisgKiBUaGlzIGV2ZW50IGlzIHNlbnQgYnkgZncgb25jZSBXUEEvV1BBMiBrZXlzIGFyZSBpbnN0YWxsZWQgaW4gZncuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV92ZGV2X2luc3RhbGxfa2V5X2NvbXBsZXRlX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkJdWludDhfdCAqZXZlbnQsCisJCQkJCQl1aW50MzJfdCBsZW4pCit7CisJV01JX1ZERVZfSU5TVEFMTF9LRVlfQ09NUExFVEVfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWYgPSBOVUxMOworCXdtaV92ZGV2X2luc3RhbGxfa2V5X2NvbXBsZXRlX2V2ZW50X2ZpeGVkX3BhcmFtICprZXlfZnAgPSBOVUxMOworCisJaWYgKCFldmVudCkgeworCQlXTUFfTE9HRSgiJXM6IGV2ZW50IHBhcmFtIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcmFtX2J1ZiA9IChXTUlfVkRFVl9JTlNUQUxMX0tFWV9DT01QTEVURV9FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnQ7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIiVzOiByZWNlaXZlZCBudWxsIGJ1ZiBmcm9tIHRhcmdldCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJa2V5X2ZwID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlpZiAoIWtleV9mcCkgeworCQlXTUFfTE9HRSgiJXM6IHJlY2VpdmVkIG51bGwgZXZlbnQgZGF0YSBmcm9tIHRhcmdldCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qCisJICogRG8gbm90aGluZyBmb3Igbm93LiBDb21wbGV0aW9uIG9mIHNldCBrZXkgaXMgYWxyZWFkeSBpbmRpY2F0ZWQgdG8gbGltCisJICovCisJV01BX0xPR0koIiVzOiBXTUlfVkRFVl9JTlNUQUxMX0tFWV9DT01QTEVURV9FVkVOVElEIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorLyoKKyAqIDgwMi4xMW4gRDIuMCBkZWZpbmVkIHZhbHVlcyBmb3IgIk1pbmltdW0gTVBEVSBTdGFydCBTcGFjaW5nIjoKKyAqICAgMCBmb3Igbm8gcmVzdHJpY3Rpb24KKyAqICAgMSBmb3IgMS80IHVzIC0gT3VyIGxvd2VyIGxheWVyIGNhbGN1bGF0aW9ucyBsaW1pdCBvdXIgcHJlY2lzaW9uIHRvIDEgbXNlYworICogICAyIGZvciAxLzIgdXMgLSBPdXIgbG93ZXIgbGF5ZXIgY2FsY3VsYXRpb25zIGxpbWl0IG91ciBwcmVjaXNpb24gdG8gMSBtc2VjCisgKiAgIDMgZm9yIDEgdXMKKyAqICAgNCBmb3IgMiB1cworICogICA1IGZvciA0IHVzCisgKiAgIDYgZm9yIDggdXMKKyAqICAgNyBmb3IgMTYgdXMKKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgd21hX21wZHVfc3BhY2luZ1tdID0geyAwLCAxLCAxLCAxLCAyLCA0LCA4LCAxNiB9OworCisvKioKKyAqIHdtYV9wYXJzZV9tcGR1ZGVuc2l0eSgpIC0gZ2l2ZSBtcGR1IHNwYWNpbmcgZnJvbSBtcGR1IGRlbnNpdHkKKyAqIEBtcGR1ZGVuc2l0eTogbXBkdSBkZW5zaXR5CisgKgorICogUmV0dXJuOiBtcGR1IHNwYWNpbmcgb3IgMCBmb3IgZXJyb3IKKyAqLworc3RhdGljIGlubGluZSB1aW50OF90IHdtYV9wYXJzZV9tcGR1ZGVuc2l0eSh1aW50OF90IG1wZHVkZW5zaXR5KQoreworCWlmIChtcGR1ZGVuc2l0eSA8IHNpemVvZih3bWFfbXBkdV9zcGFjaW5nKSkKKwkJcmV0dXJuIHdtYV9tcGR1X3NwYWNpbmdbbXBkdWRlbnNpdHldOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21pX3VuaWZpZWRfc2VuZF9wZWVyX2Fzc29jKCkgLSBzZW5kIHBlZXIgYXNzb2MgY29tbWFuZCB0byBmdworICogQHdtYTogd21hIGhhbmRsZQorICogQG53X3R5cGU6IG53IHR5cGUKKyAqIEBwYXJhbXM6IGFkZCBzdGEgcGFyYW1zCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kIHBlZXIgYXNzb2MgY29tbWFuZCB0byBmaXJtd2FyZSB3aXRoCisgKiBkaWZmZXJlbnQgcGFyYW1ldGVycy4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQzMl90IHdtaV91bmlmaWVkX3NlbmRfcGVlcl9hc3NvYyh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgICAgdFNpck53VHlwZSBud190eXBlLAorCQkJCSAgICB0cEFkZFN0YVBhcmFtcyBwYXJhbXMpCit7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2OworCXdtaV9wZWVyX2Fzc29jX2NvbXBsZXRlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW47CisJaW50MzJfdCByZXQsIG1heF9yYXRlcywgaTsKKwl1aW50OF90IHJ4X3N0YmMsIHR4X3N0YmM7CisJdWludDhfdCAqcmF0ZV9wb3MsICpidWZfcHRyOworCXdtaV9yYXRlX3NldCBwZWVyX2xlZ2FjeV9yYXRlcywgcGVlcl9odF9yYXRlczsKKwl3bWlfdmh0X3JhdGVfc2V0ICptY3M7CisJdWludDMyX3QgbnVtX3BlZXJfbGVnYWN5X3JhdGVzOworCXVpbnQzMl90IG51bV9wZWVyX2h0X3JhdGVzOworCXVpbnQzMl90IG51bV9wZWVyXzExYl9yYXRlcyA9IDA7CisJdWludDMyX3QgbnVtX3BlZXJfMTFhX3JhdGVzID0gMDsKKwl1aW50MzJfdCBwaHltb2RlOworCXVpbnQzMl90IHBlZXJfbnNzID0gMTsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaW50ciA9IE5VTEw7CisKKwlpZiAoTlVMTCA9PSBwYXJhbXMpIHsKKwkJV01BX0xPR0UoIiVzOiBwYXJhbXMgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWludHIgPSAmd21hLT5pbnRlcmZhY2VzW3BhcmFtcy0+c21lc2Vzc2lvbklkXTsKKworCXBkZXYgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9UWFJYKTsKKworCWlmIChOVUxMID09IHBkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHBkZXYiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNkZl9tZW1femVybygmcGVlcl9sZWdhY3lfcmF0ZXMsIHNpemVvZih3bWlfcmF0ZV9zZXQpKTsKKwljZGZfbWVtX3plcm8oJnBlZXJfaHRfcmF0ZXMsIHNpemVvZih3bWlfcmF0ZV9zZXQpKTsKKworCXBoeW1vZGUgPSB3bWFfcGVlcl9waHltb2RlKG53X3R5cGUsIHBhcmFtcy0+c3RhVHlwZSwKKwkJCQkgICBwYXJhbXMtPmh0Q2FwYWJsZSwKKwkJCQkgICBwYXJhbXMtPmNoX3dpZHRoLAorCQkJCSAgIHBhcmFtcy0+dmh0Q2FwYWJsZSk7CisKKwkvKiBMZWdhY3kgUmF0ZXNldCAqLworCXJhdGVfcG9zID0gKHVpbnQ4X3QgKikgcGVlcl9sZWdhY3lfcmF0ZXMucmF0ZXM7CisJZm9yIChpID0gMDsgaSA8IFNJUl9OVU1fMTFCX1JBVEVTOyBpKyspIHsKKwkJaWYgKCFwYXJhbXMtPnN1cHBvcnRlZFJhdGVzLmxsYlJhdGVzW2ldKQorCQkJY29udGludWU7CisJCXJhdGVfcG9zW3BlZXJfbGVnYWN5X3JhdGVzLm51bV9yYXRlcysrXSA9CisJCQlwYXJhbXMtPnN1cHBvcnRlZFJhdGVzLmxsYlJhdGVzW2ldOworCQludW1fcGVlcl8xMWJfcmF0ZXMrKzsKKwl9CisJZm9yIChpID0gMDsgaSA8IFNJUl9OVU1fMTFBX1JBVEVTOyBpKyspIHsKKwkJaWYgKCFwYXJhbXMtPnN1cHBvcnRlZFJhdGVzLmxsYVJhdGVzW2ldKQorCQkJY29udGludWU7CisJCXJhdGVfcG9zW3BlZXJfbGVnYWN5X3JhdGVzLm51bV9yYXRlcysrXSA9CisJCQlwYXJhbXMtPnN1cHBvcnRlZFJhdGVzLmxsYVJhdGVzW2ldOworCQludW1fcGVlcl8xMWFfcmF0ZXMrKzsKKwl9CisKKwlpZiAoKHBoeW1vZGUgPT0gTU9ERV8xMUEgJiYgbnVtX3BlZXJfMTFhX3JhdGVzID09IDApIHx8CisJICAgIChwaHltb2RlID09IE1PREVfMTFCICYmIG51bV9wZWVyXzExYl9yYXRlcyA9PSAwKSkgeworCQlXTUFfTE9HVygiJXM6IEludmFsaWQgcGh5IHJhdGVzLiBwaHltb2RlIDB4JXgsIDExYl9yYXRlcyAlZCwgMTFhX3JhdGVzICVkIiwKKwkJCV9fZnVuY19fLCBwaHltb2RlLCBudW1fcGVlcl8xMWJfcmF0ZXMsIG51bV9wZWVyXzExYV9yYXRlcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBTZXQgdGhlIExlZ2FjeSBSYXRlcyB0byBXb3JkIEFsaWduZWQgKi8KKwludW1fcGVlcl9sZWdhY3lfcmF0ZXMgPSByb3VuZHVwKHBlZXJfbGVnYWN5X3JhdGVzLm51bV9yYXRlcywKKwkJCQkJc2l6ZW9mKHVpbnQzMl90KSk7CisKKwkvKiBIVCBSYXRlc2V0ICovCisJbWF4X3JhdGVzID0gc2l6ZW9mKHBlZXJfaHRfcmF0ZXMucmF0ZXMpIC8KKwkJICAgIHNpemVvZihwZWVyX2h0X3JhdGVzLnJhdGVzWzBdKTsKKwlyYXRlX3BvcyA9ICh1aW50OF90ICopIHBlZXJfaHRfcmF0ZXMucmF0ZXM7CisJZm9yIChpID0gMDsgaSA8IE1BWF9TVVBQT1JURURfUkFURVM7IGkrKykgeworCQlpZiAocGFyYW1zLT5zdXBwb3J0ZWRSYXRlcy5zdXBwb3J0ZWRNQ1NTZXRbaSAvIDhdICYKKwkJICAgICgxIDw8IChpICUgOCkpKSB7CisJCQlyYXRlX3Bvc1twZWVyX2h0X3JhdGVzLm51bV9yYXRlcysrXSA9IGk7CisJCQlpZiAoaSA+PSA4KSB7CisJCQkJLyogTUNTOCBvciBoaWdoZXIgcmF0ZSBpcyBwcmVzZW50LCBtdXN0IGJlIDJ4MiAqLworCQkJCXBlZXJfbnNzID0gMjsKKwkJCX0KKwkJfQorCQlpZiAocGVlcl9odF9yYXRlcy5udW1fcmF0ZXMgPT0gbWF4X3JhdGVzKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHBhcmFtcy0+aHRDYXBhYmxlICYmICFwZWVyX2h0X3JhdGVzLm51bV9yYXRlcykgeworCQl1aW50OF90IHRlbXBfbmlfcmF0ZXNbOF0gPSB7IDB4MCwgMHgxLCAweDIsIDB4MywKKwkJCQkJICAgICAweDQsIDB4NSwgMHg2LCAweDd9OworCQkvKgorCQkgKiBXb3JrYXJvdW5kIGZvciBFViAxMTYzODI6IFRoZSBwZWVyIGlzIG1hcmtlZCBIVCBidXQgd2l0aAorCQkgKiBzdXBwb3J0ZWQgcnggbWNzIHNldCBpcyBzZXQgdG8gMC4gMTFuIHNwZWMgbWFuZGF0ZXMgTUNTMC03CisJCSAqIGZvciBhIEhUIFNUQS4gU28gZm9yY2luZyB0aGUgc3VwcG9ydGVkIHJ4IG1jcyByYXRlIHRvCisJCSAqIE1DUyAwLTcuIFRoaXMgd29ya2Fyb3VuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSB3ZSBnZXQKKwkJICogY2xhcmlmaWNhdGlvbiBmcm9tIFdGQSByZWdhcmRpbmcgdGhpcyBTVEEgYmVoYXZpb3IuCisJCSAqLworCisJCS8qIFRPRE86IERvIHdlIHJlYWxseSBuZWVkIHRoaXM/ICovCisJCVdNQV9MT0dXKCJQZWVyIGlzIG1hcmtlZCBhcyBIVCBjYXBhYmxlIGJ1dCBzdXBwb3J0ZWQgbWNzIHJhdGUgaXMgMCIpOworCQlwZWVyX2h0X3JhdGVzLm51bV9yYXRlcyA9IHNpemVvZih0ZW1wX25pX3JhdGVzKTsKKwkJY2RmX21lbV9jb3B5KCh1aW50OF90ICopIHBlZXJfaHRfcmF0ZXMucmF0ZXMsIHRlbXBfbmlfcmF0ZXMsCisJCQkgICAgIHBlZXJfaHRfcmF0ZXMubnVtX3JhdGVzKTsKKwl9CisKKwkvKiBTZXQgdGhlIFBlZXIgSFQgUmF0ZXMgdG8gV29yZCBBbGlnbmVkICovCisJbnVtX3BlZXJfaHRfcmF0ZXMgPSByb3VuZHVwKHBlZXJfaHRfcmF0ZXMubnVtX3JhdGVzLCBzaXplb2YodWludDMyX3QpKTsKKworCWxlbiA9IHNpemVvZigqY21kKSArIFdNSV9UTFZfSERSX1NJWkUgKyAvKiBQbGFjZSBob2xkZXIgZm9yIHBlZXIgbGVnYWN5IHJhdGUgYXJyYXkgKi8KKwkgICAgICAobnVtX3BlZXJfbGVnYWN5X3JhdGVzICogc2l6ZW9mKHVpbnQ4X3QpKSArIC8qIHBlZXIgbGVnYWN5IHJhdGUgYXJyYXkgc2l6ZSAqLworCSAgICAgIFdNSV9UTFZfSERSX1NJWkUgKyAvKiBQbGFjZSBob2xkZXIgZm9yIHBlZXIgSHQgcmF0ZSBhcnJheSAqLworCSAgICAgIChudW1fcGVlcl9odF9yYXRlcyAqIHNpemVvZih1aW50OF90KSkgKyAgIC8qIHBlZXIgSFQgcmF0ZSBhcnJheSBzaXplICovCisJICAgICAgc2l6ZW9mKHdtaV92aHRfcmF0ZV9zZXQpOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCWNtZCA9ICh3bWlfcGVlcl9hc3NvY19jb21wbGV0ZV9jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9hc3NvY19jb21wbGV0ZV9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3BlZXJfYXNzb2NfY29tcGxldGVfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwkvKiBpbiBhcC9pYnNzIG1vZGUgYW5kIGZvciB0ZGxzIHBlZXIsIHVzZSBtYWMgYWRkcmVzcyBvZiB0aGUgcGVlciBpbgorCSAqIHRoZSBvdGhlciBlbmQgYXMgdGhlIG5ldyBwZWVyIGFkZHJlc3M7IGluIHN0YSBtb2RlLCB1c2UgYnNzIGlkIHRvCisJICogYmUgdGhlIG5ldyBwZWVyIGFkZHJlc3MKKwkgKi8KKwlpZiAoKHdtYV9pc192ZGV2X2luX2FwX21vZGUod21hLCBwYXJhbXMtPnNtZXNlc3Npb25JZCkpCisjaWZkZWYgUUNBX0lCU1NfU1VQUE9SVAorCSAgICB8fCAod21hX2lzX3ZkZXZfaW5faWJzc19tb2RlKHdtYSwgcGFyYW1zLT5zbWVzZXNzaW9uSWQpKQorI2VuZGlmIC8qIFFDQV9JQlNTX1NVUFBPUlQgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCSAgICB8fCAoU1RBX0VOVFJZX1RETFNfUEVFUiA9PSBwYXJhbXMtPnN0YVR5cGUpCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KKwkgICAgKQorCQlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUihwYXJhbXMtPnN0YU1hYywgJmNtZC0+cGVlcl9tYWNhZGRyKTsKKwllbHNlCisJCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKHBhcmFtcy0+YnNzSWQsICZjbWQtPnBlZXJfbWFjYWRkcik7CisJY21kLT52ZGV2X2lkID0gcGFyYW1zLT5zbWVzZXNzaW9uSWQ7CisJY21kLT5wZWVyX25ld19hc3NvYyA9IDE7CisJY21kLT5wZWVyX2Fzc29jaWQgPSBwYXJhbXMtPmFzc29jSWQ7CisKKwkvKgorCSAqIFRoZSB0YXJnZXQgb25seSBuZWVkcyBhIHN1YnNldCBvZiB0aGUgZmxhZ3MgbWFpbnRhaW5lZCBpbiB0aGUgaG9zdC4KKwkgKiBKdXN0IHBvcHVsYXRlIHRob3NlIGZsYWdzIGFuZCBzZW5kIGl0IGRvd24KKwkgKi8KKwljbWQtPnBlZXJfZmxhZ3MgPSAwOworCisJaWYgKHBhcmFtcy0+d21tRW5hYmxlZCkKKwkJY21kLT5wZWVyX2ZsYWdzIHw9IFdNSV9QRUVSX1FPUzsKKworCWlmIChwYXJhbXMtPnVBUFNEKSB7CisJCWNtZC0+cGVlcl9mbGFncyB8PSBXTUlfUEVFUl9BUFNEOworCQlXTUFfTE9HRCgiU2V0IFdNSV9QRUVSX0FQU0Q6IHVhcHNkIE1hc2sgJWQiLCBwYXJhbXMtPnVBUFNEKTsKKwl9CisKKwlpZiAocGFyYW1zLT5odENhcGFibGUpIHsKKwkJY21kLT5wZWVyX2ZsYWdzIHw9IChXTUlfUEVFUl9IVCB8IFdNSV9QRUVSX1FPUyk7CisJCWNtZC0+cGVlcl9yYXRlX2NhcHMgfD0gV01JX1JDX0hUX0ZMQUc7CisJfQorCisJaWYgKHBhcmFtcy0+Y2hfd2lkdGgpIHsKKwkJY21kLT5wZWVyX2ZsYWdzIHw9IFdNSV9QRUVSXzQwTUhaOworCQljbWQtPnBlZXJfcmF0ZV9jYXBzIHw9IFdNSV9SQ19DVzQwX0ZMQUc7CisJCWlmIChwYXJhbXMtPmZTaG9ydEdJNDBNaHopCisJCQljbWQtPnBlZXJfcmF0ZV9jYXBzIHw9IFdNSV9SQ19TR0lfRkxBRzsKKwl9IGVsc2UgaWYgKHBhcmFtcy0+ZlNob3J0R0kyME1oeikKKwkJY21kLT5wZWVyX3JhdGVfY2FwcyB8PSBXTUlfUkNfU0dJX0ZMQUc7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFBQworCWlmIChwYXJhbXMtPnZodENhcGFibGUpIHsKKwkJY21kLT5wZWVyX2ZsYWdzIHw9IChXTUlfUEVFUl9IVCB8IFdNSV9QRUVSX1ZIVCB8IFdNSV9QRUVSX1FPUyk7CisJCWNtZC0+cGVlcl9yYXRlX2NhcHMgfD0gV01JX1JDX0hUX0ZMQUc7CisJfQorCisJaWYgKHBhcmFtcy0+Y2hfd2lkdGggPT0gQ0hfV0lEVEhfODBNSFopCisJCWNtZC0+cGVlcl9mbGFncyB8PSBXTUlfUEVFUl84ME1IWjsKKwllbHNlIGlmIChwYXJhbXMtPmNoX3dpZHRoID09IENIX1dJRFRIXzE2ME1IWikKKwkJY21kLT5wZWVyX2ZsYWdzIHw9IFdNSV9QRUVSXzE2ME1IWjsKKwllbHNlIGlmIChwYXJhbXMtPmNoX3dpZHRoID09IENIX1dJRFRIXzgwUDgwTUhaKQorCQljbWQtPnBlZXJfZmxhZ3MgfD0gV01JX1BFRVJfMTYwTUhaOworCisJY21kLT5wZWVyX3ZodF9jYXBzID0gcGFyYW1zLT52aHRfY2FwczsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFBQyAqLworCisJaWYgKHBhcmFtcy0+cm1mRW5hYmxlZCkKKwkJY21kLT5wZWVyX2ZsYWdzIHw9IFdNSV9QRUVSX1BNRjsKKworCXJ4X3N0YmMgPSAocGFyYW1zLT5odF9jYXBzICYgSUVFRTgwMjExX0hUQ0FQX0NfUlhTVEJDKSA+PgorCQkgIElFRUU4MDIxMV9IVENBUF9DX1JYU1RCQ19TOworCWlmIChyeF9zdGJjKSB7CisJCWNtZC0+cGVlcl9mbGFncyB8PSBXTUlfUEVFUl9TVEJDOworCQljbWQtPnBlZXJfcmF0ZV9jYXBzIHw9IChyeF9zdGJjIDw8IFdNSV9SQ19SWF9TVEJDX0ZMQUdfUyk7CisJfQorCisJdHhfc3RiYyA9IChwYXJhbXMtPmh0X2NhcHMgJiBJRUVFODAyMTFfSFRDQVBfQ19UWFNUQkMpID4+CisJCSAgSUVFRTgwMjExX0hUQ0FQX0NfVFhTVEJDX1M7CisJaWYgKHR4X3N0YmMpIHsKKwkJY21kLT5wZWVyX2ZsYWdzIHw9IFdNSV9QRUVSX1NUQkM7CisJCWNtZC0+cGVlcl9yYXRlX2NhcHMgfD0gKHR4X3N0YmMgPDwgV01JX1JDX1RYX1NUQkNfRkxBR19TKTsKKwl9CisKKwlpZiAocGFyYW1zLT5odExkcGNDYXBhYmxlIHx8IHBhcmFtcy0+dmh0TGRwY0NhcGFibGUpCisJCWNtZC0+cGVlcl9mbGFncyB8PSBXTUlfUEVFUl9MRFBDOworCisJc3dpdGNoIChwYXJhbXMtPm1pbW9QUykgeworCWNhc2UgZVNJUl9IVF9NSU1PX1BTX1NUQVRJQzoKKwkJY21kLT5wZWVyX2ZsYWdzIHw9IFdNSV9QRUVSX1NUQVRJQ19NSU1PUFM7CisJCWJyZWFrOworCWNhc2UgZVNJUl9IVF9NSU1PX1BTX0RZTkFNSUM6CisJCWNtZC0+cGVlcl9mbGFncyB8PSBXTUlfUEVFUl9EWU5fTUlNT1BTOworCQlicmVhazsKKwljYXNlIGVTSVJfSFRfTUlNT19QU19OT19MSU1JVDoKKwkJY21kLT5wZWVyX2ZsYWdzIHw9IFdNSV9QRUVSX1NQQVRJQUxfTVVYOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUworCWlmIChTVEFfRU5UUllfVERMU19QRUVSID09IHBhcmFtcy0+c3RhVHlwZSkKKwkJY21kLT5wZWVyX2ZsYWdzIHw9IFdNSV9QRUVSX0FVVEg7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KKworCWlmIChwYXJhbXMtPndwYV9yc24KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorCSAgICB8fCBwYXJhbXMtPmVuY3J5cHRUeXBlID09IGVTSVJfRURfV1BJCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKwkgICAgKQorCQljbWQtPnBlZXJfZmxhZ3MgfD0gV01JX1BFRVJfTkVFRF9QVEtfNF9XQVk7CisJaWYgKHBhcmFtcy0+d3BhX3JzbiA+PiAxKQorCQljbWQtPnBlZXJfZmxhZ3MgfD0gV01JX1BFRVJfTkVFRF9HVEtfMl9XQVk7CisKKwlvbF90eHJ4X3BlZXJfc3RhdGVfdXBkYXRlKHBkZXYsIHBhcmFtcy0+YnNzSWQsIG9sX3R4cnhfcGVlcl9zdGF0ZV9hdXRoKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJaWYgKHBhcmFtcy0+ZW5jcnlwdFR5cGUgPT0gZVNJUl9FRF9XUEkpIHsKKwkJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCh3bWEtPndtaV9oYW5kbGUsCisJCQkJCQkgICAgICBwYXJhbXMtPnNtZXNlc3Npb25JZCwKKwkJCQkJCSAgICAgIFdNSV9WREVWX1BBUkFNX0RST1BfVU5FTkNSWSwKKwkJCQkJCSAgICAgIGZhbHNlKTsKKwkJaWYgKHJldCkgeworCQkJV01BX0xPR0UKKwkJCQkoIlNldCBXTUlfVkRFVl9QQVJBTV9EUk9QX1VORU5DUlkgUGFyYW0gc3RhdHVzOiVkXG4iLAorCQkJCXJldCk7CisJCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKwljbWQtPnBlZXJfY2FwcyA9IHBhcmFtcy0+Y2FwYWJfaW5mbzsKKwljbWQtPnBlZXJfbGlzdGVuX2ludHZhbCA9IHBhcmFtcy0+bGlzdGVuSW50ZXJ2YWw7CisJY21kLT5wZWVyX2h0X2NhcHMgPSBwYXJhbXMtPmh0X2NhcHM7CisJY21kLT5wZWVyX21heF9tcGR1ID0gKDEgPDwgKElFRUU4MDIxMV9IVENBUF9NQVhSWEFNUERVX0ZBQ1RPUiArCisJCQkJICAgIHBhcmFtcy0+bWF4QW1wZHVTaXplKSkgLSAxOworCWNtZC0+cGVlcl9tcGR1X2RlbnNpdHkgPSB3bWFfcGFyc2VfbXBkdWRlbnNpdHkocGFyYW1zLT5tYXhBbXBkdURlbnNpdHkpOworCisJaWYgKHBhcmFtcy0+c3VwcG9ydGVkUmF0ZXMuc3VwcG9ydGVkTUNTU2V0WzFdICYmCisJICAgIHBhcmFtcy0+c3VwcG9ydGVkUmF0ZXMuc3VwcG9ydGVkTUNTU2V0WzJdKQorCQljbWQtPnBlZXJfcmF0ZV9jYXBzIHw9IFdNSV9SQ19UU19GTEFHOworCWVsc2UgaWYgKHBhcmFtcy0+c3VwcG9ydGVkUmF0ZXMuc3VwcG9ydGVkTUNTU2V0WzFdKQorCQljbWQtPnBlZXJfcmF0ZV9jYXBzIHw9IFdNSV9SQ19EU19GTEFHOworCisJLyogVXBkYXRlIHBlZXIgbGVnYWN5IHJhdGUgaW5mb3JtYXRpb24gKi8KKwlidWZfcHRyICs9IHNpemVvZigqY21kKTsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIG51bV9wZWVyX2xlZ2FjeV9yYXRlcyk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCWNtZC0+bnVtX3BlZXJfbGVnYWN5X3JhdGVzID0gcGVlcl9sZWdhY3lfcmF0ZXMubnVtX3JhdGVzOworCWNkZl9tZW1fY29weShidWZfcHRyLCBwZWVyX2xlZ2FjeV9yYXRlcy5yYXRlcywKKwkJICAgICBwZWVyX2xlZ2FjeV9yYXRlcy5udW1fcmF0ZXMpOworCisJLyogVXBkYXRlIHBlZXIgSFQgcmF0ZSBpbmZvcm1hdGlvbiAqLworCWJ1Zl9wdHIgKz0gbnVtX3BlZXJfbGVnYWN5X3JhdGVzOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgbnVtX3BlZXJfaHRfcmF0ZXMpOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwljbWQtPm51bV9wZWVyX2h0X3JhdGVzID0gcGVlcl9odF9yYXRlcy5udW1fcmF0ZXM7CisJY2RmX21lbV9jb3B5KGJ1Zl9wdHIsIHBlZXJfaHRfcmF0ZXMucmF0ZXMsIHBlZXJfaHRfcmF0ZXMubnVtX3JhdGVzKTsKKworCS8qIFZIVCBSYXRlcyAqLworCWJ1Zl9wdHIgKz0gbnVtX3BlZXJfaHRfcmF0ZXM7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19TVFJVQ193bWlfdmh0X3JhdGVfc2V0LAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV92aHRfcmF0ZV9zZXQpKTsKKworCWNtZC0+cGVlcl9uc3MgPSBwZWVyX25zczsKKworCVdNQV9MT0dEKCJwZWVyX25zcyAlZCBwZWVyX2h0X3JhdGVzLm51bV9yYXRlcyAlZCAiLCBjbWQtPnBlZXJfbnNzLAorCQkgcGVlcl9odF9yYXRlcy5udW1fcmF0ZXMpOworCisJbWNzID0gKHdtaV92aHRfcmF0ZV9zZXQgKikgYnVmX3B0cjsKKwlpZiAocGFyYW1zLT52aHRDYXBhYmxlKSB7CisjZGVmaW5lIFZIVDJ4Mk1DU01BU0sgMHhjCisJCW1jcy0+cnhfbWF4X3JhdGUgPSBwYXJhbXMtPnN1cHBvcnRlZFJhdGVzLnZodFJ4SGlnaGVzdERhdGFSYXRlOworCQltY3MtPnJ4X21jc19zZXQgPSBwYXJhbXMtPnN1cHBvcnRlZFJhdGVzLnZodFJ4TUNTTWFwOworCQltY3MtPnR4X21heF9yYXRlID0gcGFyYW1zLT5zdXBwb3J0ZWRSYXRlcy52aHRUeEhpZ2hlc3REYXRhUmF0ZTsKKwkJbWNzLT50eF9tY3Nfc2V0ID0gcGFyYW1zLT5zdXBwb3J0ZWRSYXRlcy52aHRUeE1DU01hcDsKKworCQlpZiAocGFyYW1zLT52aHRTdXBwb3J0ZWRSeE5zcykgeworCQkJY21kLT5wZWVyX25zcyA9IHBhcmFtcy0+dmh0U3VwcG9ydGVkUnhOc3M7CisJCX0gZWxzZSB7CisJCQljbWQtPnBlZXJfbnNzID0gKChtY3MtPnJ4X21jc19zZXQgJiBWSFQyeDJNQ1NNQVNLKQorCQkJCQkgPT0gVkhUMngyTUNTTUFTSykgPyAxIDogMjsKKwkJfQorCX0KKworCS8qCisJICogTGltaXQgbnNzIHRvIG1heCBudW1iZXIgb2YgcmYgY2hhaW4gc3VwcG9ydGVkIGJ5IHRhcmdldAorCSAqIE90aGVyd2lzZSBGdyB3aWxsIGNyYXNoCisJICovCisJd21hX3VwZGF0ZV90eHJ4X2NoYWlubWFzayh3bWEtPm51bV9yZl9jaGFpbnMsICZjbWQtPnBlZXJfbnNzKTsKKworCWludHItPm5zcyA9IGNtZC0+cGVlcl9uc3M7CisJY21kLT5wZWVyX3BoeW1vZGUgPSBwaHltb2RlOworCVdNQV9MT0dEKCIlczogdmRldl9pZCAlZCBhc3NvY2lkICVkIHBlZXJfZmxhZ3MgJXggcmF0ZV9jYXBzICV4ICIKKwkJICJwZWVyX2NhcHMgJXggbGlzdGVuX2ludHZhbCAlZCBodF9jYXBzICV4IG1heF9tcGR1ICVkICIKKwkJICJuc3MgJWQgcGh5bW9kZSAlZCBwZWVyX21wZHVfZGVuc2l0eSAlZCBlbmNyX3R5cGUgJWQgIgorCQkgImNtZC0+cGVlcl92aHRfY2FwcyAleCIsIF9fZnVuY19fLAorCQkgY21kLT52ZGV2X2lkLCBjbWQtPnBlZXJfYXNzb2NpZCwgY21kLT5wZWVyX2ZsYWdzLAorCQkgY21kLT5wZWVyX3JhdGVfY2FwcywgY21kLT5wZWVyX2NhcHMsCisJCSBjbWQtPnBlZXJfbGlzdGVuX2ludHZhbCwgY21kLT5wZWVyX2h0X2NhcHMsCisJCSBjbWQtPnBlZXJfbWF4X21wZHUsIGNtZC0+cGVlcl9uc3MsIGNtZC0+cGVlcl9waHltb2RlLAorCQkgY21kLT5wZWVyX21wZHVfZGVuc2l0eSwgcGFyYW1zLT5lbmNyeXB0VHlwZSwKKwkJIGNtZC0+cGVlcl92aHRfY2Fwcyk7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9QRUVSX0FTU09DX0NNRElEKTsKKwlpZiAocmV0ICE9IEVPSykgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byBzZW5kIHBlZXIgYXNzb2MgY29tbWFuZCByZXQgPSAlZCIsCisJCQkgX19mdW5jX18sIHJldCk7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWlfdW5pZmllZF92ZGV2X3NldF9ndHhfY2ZnX3NlbmQoKSAtIHNldCBHVFggcGFyYW1zCisgKiBAd21pX2hhbmRsZTogd21pIGhhbmRsZQorICogQGlmX2lkOiB2ZGV2IGlkCisgKiBAZ3R4X2luZm86IEdUWCBjb25maWcgcGFyYW1zCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXQgR1RYIHJlbGF0ZWQgcGFyYW1zIGluIGZpcm13YXJlLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWlfdW5pZmllZF92ZGV2X3NldF9ndHhfY2ZnX3NlbmQod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCB1aW50MzJfdCBpZl9pZCwKKwkJCQkgIGd0eF9jb25maWdfdCAqZ3R4X2luZm8pCit7CisJd21pX3ZkZXZfc2V0X2d0eF9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQgbGVuID0gc2l6ZW9mKHdtaV92ZGV2X3NldF9ndHhfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczp3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljbWQgPSAod21pX3ZkZXZfc2V0X2d0eF9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF9ndHhfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfdmRldl9zZXRfZ3R4X3BhcmFtc19jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSBpZl9pZDsKKworCWNtZC0+Z3R4UlRNYXNrWzBdID0gZ3R4X2luZm8tPmd0eFJUTWFza1swXTsKKwljbWQtPmd0eFJUTWFza1sxXSA9IGd0eF9pbmZvLT5ndHhSVE1hc2tbMV07CisJY21kLT51c2VyR3R4TWFzayA9IGd0eF9pbmZvLT5ndHhVc3JjZmc7CisJY21kLT5ndHhQRVJUaHJlc2hvbGQgPSBndHhfaW5mby0+Z3R4UEVSVGhyZXNob2xkOworCWNtZC0+Z3R4UEVSTWFyZ2luID0gZ3R4X2luZm8tPmd0eFBFUk1hcmdpbjsKKwljbWQtPmd0eFRQQ3N0ZXAgPSBndHhfaW5mby0+Z3R4VFBDc3RlcDsKKwljbWQtPmd0eFRQQ01pbiA9IGd0eF9pbmZvLT5ndHhUUENNaW47CisJY21kLT5ndHhCV01hc2sgPSBndHhfaW5mby0+Z3R4QldNYXNrOworCisJV01BX0xPR0QoIlNldHRpbmcgdmRldiVkIEdUWCB2YWx1ZXM6aHRtY3MgMHgleCwgdmh0bWNzIDB4JXgsIHVzZXJtYXNrIDB4JXgsIFwKKwkJZ3R4UEVSVGhyZXNob2xkICVkLCBndHhQRVJNYXJnaW4gJWQsIGd0eFRQQ3N0ZXAgJWQsIGd0eFRQQ01pbiAlZCwgXAorCQlndHhCV01hc2sgMHgleC4iLCBpZl9pZCwgY21kLT5ndHhSVE1hc2tbMF0sIGNtZC0+Z3R4UlRNYXNrWzFdLAorCQkgY21kLT51c2VyR3R4TWFzaywgY21kLT5ndHhQRVJUaHJlc2hvbGQsIGNtZC0+Z3R4UEVSTWFyZ2luLAorCQkgY21kLT5ndHhUUENzdGVwLCBjbWQtPmd0eFRQQ01pbiwgY21kLT5ndHhCV01hc2spOworCXJldHVybiB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICAgV01JX1ZERVZfU0VUX0dUWF9QQVJBTVNfQ01ESUQpOworfQorCisvKioKKyAqIHdtYV91cGRhdGVfcHJvdGVjdGlvbl9tb2RlKCkgLSB1cGRhdGUgcHJvdGVjdGlvbiBtb2RlCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQGxsYmNvZXhpc3Q6IHByb3RlY3Rpb24gbW9kZSBpbmZvCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXQgcHJvdGVjdGlvbiBtb2RlKFJUUy9DVFMpIHRvIGZ3IGZvciBwYXNzZWQgdmRldiBpZC4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfdXBkYXRlX3Byb3RlY3Rpb25fbW9kZSh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkLAorCQkJICAgdWludDhfdCBsbGJjb2V4aXN0KQoreworCWludCByZXQ7CisJZW51bSBpZWVlODAyMTFfcHJvdG1vZGUgcHJvdF9tb2RlOworCisJcHJvdF9tb2RlID0gbGxiY29leGlzdCA/IElFRUU4MDIxMV9QUk9UX0NUU09OTFkgOiBJRUVFODAyMTFfUFJPVF9OT05FOworCisJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJCSAgICAgIFdNSV9WREVWX1BBUkFNX1BST1RFQ1RJT05fTU9ERSwKKwkJCQkJICAgICAgcHJvdF9tb2RlKTsKKworCWlmIChyZXQpCisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCB3bWkgcHJvdGVjdGlvbiBtb2RlIGNtZCIpOworCWVsc2UKKwkJV01BX0xPR0QoIlVwZGF0ZWQgcHJvdGVjdGlvbiBtb2RlICVkIHRvIHRhcmdldCIsIHByb3RfbW9kZSk7Cit9CisKKy8qKgorICogd21hX3VwZGF0ZV9iZWFjb25faW50ZXJ2YWwoKSAtIHVwZGF0ZSBiZWFjb24gaW50ZXJ2YWwgaW4gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAYmVhY29uSW50ZXJ2YWw6IGJlY29uIGludGVydmFsCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkCit3bWFfdXBkYXRlX2JlYWNvbl9pbnRlcnZhbCh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkLAorCQkJICAgdWludDE2X3QgYmVhY29uSW50ZXJ2YWwpCit7CisJaW50IHJldDsKKworCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkgICAgICBXTUlfVkRFVl9QQVJBTV9CRUFDT05fSU5URVJWQUwsCisJCQkJCSAgICAgIGJlYWNvbkludGVydmFsKTsKKworCWlmIChyZXQpCisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gdXBkYXRlIGJlYWNvbiBpbnRlcnZhbCIpOworCWVsc2UKKwkJV01BX0xPR0koIlVwZGF0ZWQgYmVhY29uIGludGVydmFsICVkIGZvciB2ZGV2ICVkIiwKKwkJCSBiZWFjb25JbnRlcnZhbCwgdmRldl9pZCk7Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3NfdXBkYXRlX2JlYWNvbl9wYXJhbXMoKSAtIHVwZGF0ZSBiZWFjb24gcGFyYW1ldGVycyB0byB0YXJnZXQKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBiY25fcGFyYW1zOiBiZWFjb24gcGFyYW1ldGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkCit3bWFfcHJvY2Vzc191cGRhdGVfYmVhY29uX3BhcmFtcyh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgdFVwZGF0ZUJlYWNvblBhcmFtcyAqYmNuX3BhcmFtcykKK3sKKwlpZiAoIWJjbl9wYXJhbXMpIHsKKwkJV01BX0xPR0UoImJjbl9wYXJhbXMgTlVMTCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGJjbl9wYXJhbXMtPnNtZVNlc3Npb25JZCA+PSB3bWEtPm1heF9ic3NpZCkgeworCQlXTUFfTE9HRSgiSW52YWxpZCB2ZGV2IGlkICVkIiwgYmNuX3BhcmFtcy0+c21lU2Vzc2lvbklkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChiY25fcGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCAmIFBBUkFNX0JDTl9JTlRFUlZBTF9DSEFOR0VEKSB7CisJCXdtYV91cGRhdGVfYmVhY29uX2ludGVydmFsKHdtYSwgYmNuX3BhcmFtcy0+c21lU2Vzc2lvbklkLAorCQkJCQkgICBiY25fcGFyYW1zLT5iZWFjb25JbnRlcnZhbCk7CisJfQorCisJaWYgKGJjbl9wYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwICYgUEFSQU1fbGxCQ09FWElTVF9DSEFOR0VEKQorCQl3bWFfdXBkYXRlX3Byb3RlY3Rpb25fbW9kZSh3bWEsIGJjbl9wYXJhbXMtPnNtZVNlc3Npb25JZCwKKwkJCQkJICAgYmNuX3BhcmFtcy0+bGxiQ29leGlzdCk7Cit9CisKKy8qKgorICogd21hX3VwZGF0ZV9jZmdfcGFyYW1zKCkgLSB1cGRhdGUgY2ZnIHBhcmFtZXRlcnMgdG8gdGFyZ2V0CisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAY2ZnUGFyYW06IGNmZyBwYXJhbWV0ZXIKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfdXBkYXRlX2NmZ19wYXJhbXModHBfd21hX2hhbmRsZSB3bWEsIHRTaXJNc2dRICpjZmdQYXJhbSkKK3sKKwl1aW50OF90IHZkZXZfaWQ7CisJdWludDMyX3QgcGFyYW1faWQ7CisJdWludDMyX3QgY2ZnX3ZhbDsKKwlpbnQgcmV0OworCS8qIGdldCBtYWMgdG8gYWNlc3MgQ0ZHIGRhdGEgYmFzZSAqLworCXN0cnVjdCBzQW5pU2lyR2xvYmFsICpwbWFjOworCisJc3dpdGNoIChjZmdQYXJhbS0+Ym9keXZhbCkgeworCWNhc2UgV05JX0NGR19SVFNfVEhSRVNIT0xEOgorCQlwYXJhbV9pZCA9IFdNSV9WREVWX1BBUkFNX1JUU19USFJFU0hPTEQ7CisJCWJyZWFrOworCWNhc2UgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKwkJcGFyYW1faWQgPSBXTUlfVkRFVl9QQVJBTV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV01BX0xPR0QoIlVuaGFuZGxlZCBjZmcgcGFyYW1ldGVyICVkIiwgY2ZnUGFyYW0tPmJvZHl2YWwpOworCQlyZXR1cm47CisJfQorCisJcG1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKworCWlmIChOVUxMID09IHBtYWMpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHBtYWMiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwbWFjLCAodWludDE2X3QpIGNmZ1BhcmFtLT5ib2R5dmFsLAorCQkJICAgICAmY2ZnX3ZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBDRkcgUEFSQU1TICVkLiByZXR1cm5pbmcgd2l0aG91dCB1cGRhdGluZyIsCisJCQljZmdQYXJhbS0+Ym9keXZhbCk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKHZkZXZfaWQgPSAwOyB2ZGV2X2lkIDwgd21hLT5tYXhfYnNzaWQ7IHZkZXZfaWQrKykgeworCQlpZiAod21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmhhbmRsZSAhPSAwKSB7CisJCQlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkJCQkgICAgICB2ZGV2X2lkLCBwYXJhbV9pZCwKKwkJCQkJCQkgICAgICBjZmdfdmFsKTsKKwkJCWlmIChyZXQpCisJCQkJV01BX0xPR0UoIlVwZGF0ZSBjZmcgcGFyYW1zIGZhaWxlZCBmb3IgdmRldklkICVkIiwKKwkJCQkJdmRldl9pZCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogd21hX3JlYWRfY2ZnX3dlcGtleSgpIC0gZmlsbCBrZXlfaW5mbyBmb3IgV0VQIGtleQorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBrZXlfaW5mbzoga2V5X2luZm8gcHRyCisgKiBAZGVmX2tleV9pZHg6IGRlZmF1bHQga2V5IGluZGV4CisgKiBAbnVtX2tleXM6IG51bWJlciBvZiBrZXlzCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyBXRVAga2V5cyBmcm9tIGNmZyBhbmQgZmlsbHMKKyAqIHVwIGtleV9pbmZvLgorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfcmVhZF9jZmdfd2Vwa2V5KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQl0U2lyS2V5cyAqa2V5X2luZm8sIHVpbnQzMl90ICpkZWZfa2V5X2lkeCwKKwkJCQl1aW50OF90ICpudW1fa2V5cykKK3sKKwl0U2lyUmV0U3RhdHVzIHN0YXR1czsKKwl1aW50MzJfdCB2YWwgPSBTSVJfTUFDX0tFWV9MRU5HVEg7CisJdWludDhfdCBpLCBqOworCisJV01BX0xPR0QoIlJlYWRpbmcgV0VQIGtleXMgZnJvbSBjZmciKTsKKwkvKiBOT1RFOmRlZl9rZXlfaWR4IGlzIGluaXRpYWxpemVkIHRvIDAgYnkgdGhlIGNhbGxlciAqLworCXN0YXR1cyA9IHdsYW5fY2ZnX2dldF9pbnQod21hX2hhbmRsZS0+bWFjX2NvbnRleHQsCisJCQkJICBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlELCBkZWZfa2V5X2lkeCk7CisJaWYgKHN0YXR1cyAhPSBlU0lSX1NVQ0NFU1MpCisJCVdNQV9MT0dFKCJVbmFibGUgdG8gcmVhZCBkZWZhdWx0IGlkLCBkZWZhdWx0aW5nIHRvIDAiKTsKKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZUzsgaSsrKSB7CisJCXN0YXR1cyA9IHdsYW5fY2ZnX2dldF9zdHIod21hX2hhbmRsZS0+bWFjX2NvbnRleHQsCisJCQkJCSAgKHVpbnQxNl90KSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8xICsKKwkJCQkJICBpLCBrZXlfaW5mb1tqXS5rZXksICZ2YWwpOworCQlpZiAoc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykgeworCQkJV01BX0xPR0UoIldFUCBrZXkgaXMgbm90IGNvbmZpZ3VyZWQgYXQgOiVkIiwgaSk7CisJCX0gZWxzZSB7CisJCQlrZXlfaW5mb1tqXS5rZXlJZCA9IGk7CisJCQlrZXlfaW5mb1tqXS5rZXlMZW5ndGggPSAodWludDE2X3QpIHZhbDsKKwkJCWorKzsKKwkJfQorCX0KKwkqbnVtX2tleXMgPSBqOworfQorCisvKioKKyAqIHdtYV9zZXR1cF9pbnN0YWxsX2tleV9jbWQoKSAtIGZpbGwgd21pIGJ1ZmZlciBhcyBwZXIga2V5IHBhcmFtZXRlcnMKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAa2V5X3BhcmFtczoga2V5IHBhcmFtZXRlcnMKKyAqIEBsZW46IGxlbmd0aAorICogQG1vZGU6IG9wIG1vZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHN1cCB3bWkgYnVmZmVyIGZyb20gaW5mb3JtYXRpb24KKyAqIHBhc3NlZCBpbiBrZXlfcGFyYW1zLgorICoKKyAqIFJldHVybjogZmlsbGVkIHdtaSBidWZmZXIgcHRyIG9yIE5VTEwgZm9yIGVycm9yCisgKi8KK3N0YXRpYyB3bWlfYnVmX3Qgd21hX3NldHVwX2luc3RhbGxfa2V5X2NtZCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJCSAgIHN0cnVjdCB3bWFfc2V0X2tleV9wYXJhbXMKKwkJCQkJICAgKmtleV9wYXJhbXMsIHVpbnQzMl90ICpsZW4sCisJCQkJCSAgIHVpbnQ4X3QgbW9kZSkKK3sKKwl3bWlfdmRldl9pbnN0YWxsX2tleV9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJdWludDhfdCAqa2V5X2RhdGE7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZSA9IE5VTEw7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFXzExVyAqLworCWlmICgoa2V5X3BhcmFtcy0+a2V5X3R5cGUgPT0gZVNJUl9FRF9OT05FICYmCisJICAgICBrZXlfcGFyYW1zLT5rZXlfbGVuKSB8fCAoa2V5X3BhcmFtcy0+a2V5X3R5cGUgIT0gZVNJUl9FRF9OT05FICYmCisJCQkJICAgICAgIWtleV9wYXJhbXMtPmtleV9sZW4pKSB7CisJCVdNQV9MT0dFKCIlczpJbnZhbGlkIHNldCBrZXkgcmVxdWVzdCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKmxlbiA9IHNpemVvZigqY21kKSArIHJvdW5kdXAoa2V5X3BhcmFtcy0+a2V5X2xlbiwgc2l6ZW9mKHVpbnQzMl90KSkgKworCSAgICAgICBXTUlfVExWX0hEUl9TSVpFOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCAqbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciB0byBzZW5kIHNldCBrZXkgY21kIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwljbWQgPSAod21pX3ZkZXZfaW5zdGFsbF9rZXlfY21kX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfaW5zdGFsbF9rZXlfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV92ZGV2X2luc3RhbGxfa2V5X2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IGtleV9wYXJhbXMtPnZkZXZfaWQ7CisJY21kLT5rZXlfaXggPSBrZXlfcGFyYW1zLT5rZXlfaWR4OworCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKGtleV9wYXJhbXMtPnBlZXJfbWFjLCAmY21kLT5wZWVyX21hY2FkZHIpOworCWlmIChrZXlfcGFyYW1zLT51bmljYXN0KQorCQljbWQtPmtleV9mbGFncyB8PSBQQUlSV0lTRV9VU0FHRTsKKwllbHNlCisJCWNtZC0+a2V5X2ZsYWdzIHw9IEdST1VQX1VTQUdFOworCisJc3dpdGNoIChrZXlfcGFyYW1zLT5rZXlfdHlwZSkgeworCWNhc2UgZVNJUl9FRF9OT05FOgorCQljbWQtPmtleV9jaXBoZXIgPSBXTUlfQ0lQSEVSX05PTkU7CisJCWJyZWFrOworCWNhc2UgZVNJUl9FRF9XRVA0MDoKKwljYXNlIGVTSVJfRURfV0VQMTA0OgorCQljbWQtPmtleV9jaXBoZXIgPSBXTUlfQ0lQSEVSX1dFUDsKKwkJaWYgKGtleV9wYXJhbXMtPnVuaWNhc3QgJiYKKwkJICAgIGNtZC0+a2V5X2l4ID09IGtleV9wYXJhbXMtPmRlZl9rZXlfaWR4KQorCQkJY21kLT5rZXlfZmxhZ3MgfD0gVFhfVVNBR0U7CisJCWJyZWFrOworCWNhc2UgZVNJUl9FRF9US0lQOgorCQljbWQtPmtleV90eG1pY19sZW4gPSBXTUFfVFhNSUNfTEVOOworCQljbWQtPmtleV9yeG1pY19sZW4gPSBXTUFfUlhNSUNfTEVOOworCQljbWQtPmtleV9jaXBoZXIgPSBXTUlfQ0lQSEVSX1RLSVA7CisJCWJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisjZGVmaW5lIFdQSV9JVl9MRU4gMTYKKwljYXNlIGVTSVJfRURfV1BJOgorCXsKKwkJLyppbml0aWFsaXplIHJlY2VpdmUgYW5kIHRyYW5zbWl0IElWIHdpdGggZGVmYXVsdCB2YWx1ZXMgKi8KKwkJLyogKipOb3RlOiB0eF9pdiBtdXN0IGJlIHNlbnQgaW4gcmV2ZXJzZSoqICovCisJCXVuc2lnbmVkIGNoYXIgdHhfaXZbMTZdID0geyAweDM2LCAweDVjLCAweDM2LCAweDVjLCAweDM2LCAweDVjLAorCQkJCQkgICAgMHgzNiwgMHg1YywgMHgzNiwgMHg1YywgMHgzNiwgMHg1YywKKwkJCQkJICAgIDB4MzYsIDB4NWMsIDB4MzYsIDB4NWN9OworCQl1bnNpZ25lZCBjaGFyIHJ4X2l2WzE2XSA9IHsgMHg1YywgMHgzNiwgMHg1YywgMHgzNiwgMHg1YywgMHgzNiwKKwkJCQkJICAgIDB4NWMsIDB4MzYsIDB4NWMsIDB4MzYsIDB4NWMsIDB4MzYsCisJCQkJCSAgICAweDVjLCAweDM2LCAweDVjLCAweDM3fTsKKwkJaWYgKG1vZGUgPT0gd2xhbl9vcF9tb2RlX2FwKSB7CisJCQkvKiBBdXRoZW50aWNhdG9yIGluaXRpYWxpemVzIHRoZSB2YWx1ZSBvZiBQTiBhcworCQkJICogMHg1QzM2NUMzNjVDMzY1QzM2NUMzNjVDMzY1QzM2NUMzNiBmb3IgTUNhc3RrZXkgVXBkYXRlCisJCQkgKi8KKwkJCWlmIChrZXlfcGFyYW1zLT51bmljYXN0KQorCQkJCXR4X2l2WzBdID0gMHgzNzsKKworCQkJcnhfaXZbV1BJX0lWX0xFTiAtIDFdID0gMHgzNjsKKwkJfSBlbHNlIHsKKwkJCWlmICgha2V5X3BhcmFtcy0+dW5pY2FzdCkKKwkJCQlyeF9pdltXUElfSVZfTEVOIC0gMV0gPSAweDM2OworCQl9CisKKwkJY21kLT5rZXlfdHhtaWNfbGVuID0gV01BX1RYTUlDX0xFTjsKKwkJY21kLT5rZXlfcnhtaWNfbGVuID0gV01BX1JYTUlDX0xFTjsKKworCQljZGZfbWVtX2NvcHkoJmNtZC0+d3BpX2tleV9yc2NfY291bnRlciwgJnJ4X2l2LAorCQkJICAgICBXUElfSVZfTEVOKTsKKwkJY2RmX21lbV9jb3B5KCZjbWQtPndwaV9rZXlfdHNjX2NvdW50ZXIsICZ0eF9pdiwKKwkJCSAgICAgV1BJX0lWX0xFTik7CisJCWNtZC0+a2V5X2NpcGhlciA9IFdNSV9DSVBIRVJfV0FQSTsKKwkJYnJlYWs7CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisJY2FzZSBlU0lSX0VEX0NDTVA6CisJCWNtZC0+a2V5X2NpcGhlciA9IFdNSV9DSVBIRVJfQUVTX0NDTTsKKwkJYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWNhc2UgZVNJUl9FRF9BRVNfMTI4X0NNQUM6CisJCWNtZC0+a2V5X2NpcGhlciA9IFdNSV9DSVBIRVJfQUVTX0NNQUM7CisJCWJyZWFrOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMVcgKi8KKwlkZWZhdWx0OgorCQkvKiBUT0RPOiBNRlAgPyAqLworCQlXTUFfTE9HRSgiJXM6SW52YWxpZCBlbmNyeXB0aW9uIHR5cGU6JWQiLCBfX2Z1bmNfXywKKwkJCSBrZXlfcGFyYW1zLT5rZXlfdHlwZSk7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYnVmX3B0ciArPSBzaXplb2Yod21pX3ZkZXZfaW5zdGFsbF9rZXlfY21kX2ZpeGVkX3BhcmFtKTsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsCisJCSAgICAgICByb3VuZHVwKGtleV9wYXJhbXMtPmtleV9sZW4sIHNpemVvZih1aW50MzJfdCkpKTsKKwlrZXlfZGF0YSA9IChBX1VJTlQ4ICopIChidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisjaWZkZWYgQklHX0VORElBTl9IT1NUCisJeworCQkvKiBmb3IgYmlnIGVuZGlhbiBob3N0LCBjb3B5IGVuZ2luZSBieXRlX3N3YXAgaXMgZW5hYmxlZAorCQkgKiBCdXQgdGhlIGtleSBkYXRhIGNvbnRlbnQgaXMgaW4gbmV0d29yayBieXRlIG9yZGVyCisJCSAqIE5lZWQgdG8gYnl0ZSBzd2FwIHRoZSBrZXkgZGF0YSBjb250ZW50IC0gc28gd2hlbiBjb3B5IGVuZ2luZQorCQkgKiBkb2VzIGJ5dGVfc3dhcCAtIHRhcmdldCBnZXRzIGtleV9kYXRhIGNvbnRlbnQgaW4gdGhlIGNvcnJlY3QKKwkJICogb3JkZXIuCisJCSAqLworCQlpbnQ4X3QgaTsKKwkJdWludDMyX3QgKmRlc3RwLCAqc3JjcDsKKworCQlkZXN0cCA9ICh1aW50MzJfdCAqKSBrZXlfZGF0YTsKKwkJc3JjcCA9ICh1aW50MzJfdCAqKSBrZXlfcGFyYW1zLT5rZXlfZGF0YTsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgcm91bmR1cChrZXlfcGFyYW1zLT5rZXlfbGVuLCBzaXplb2YodWludDMyX3QpKSAvIDQ7CisJCSAgICAgaSsrKSB7CisJCQkqZGVzdHAgPSBsZTMyX3RvX2NwdSgqc3JjcCk7CisJCQlkZXN0cCsrOworCQkJc3JjcCsrOworCQl9CisJfQorI2Vsc2UKKwljZGZfbWVtX2NvcHkoKHZvaWQgKilrZXlfZGF0YSwKKwkJICAgICAoY29uc3Qgdm9pZCAqKWtleV9wYXJhbXMtPmtleV9kYXRhLCBrZXlfcGFyYW1zLT5rZXlfbGVuKTsKKyNlbmRpZiAvKiBCSUdfRU5ESUFOX0hPU1QgKi8KKwljbWQtPmtleV9sZW4gPSBrZXlfcGFyYW1zLT5rZXlfbGVuOworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCWlmIChrZXlfcGFyYW1zLT5rZXlfdHlwZSA9PSBlU0lSX0VEX0FFU18xMjhfQ01BQykgeworCQlpZmFjZSA9ICZ3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW2tleV9wYXJhbXMtPnZkZXZfaWRdOworCQlpZiAoaWZhY2UpIHsKKwkJCWlmYWNlLT5rZXkua2V5X2xlbmd0aCA9IGtleV9wYXJhbXMtPmtleV9sZW47CisJCQljZGZfbWVtX2NvcHkoaWZhY2UtPmtleS5rZXksCisJCQkJICAgICAoY29uc3Qgdm9pZCAqKWtleV9wYXJhbXMtPmtleV9kYXRhLAorCQkJCSAgICAgaWZhY2UtPmtleS5rZXlfbGVuZ3RoKTsKKwkJCWlmICgoY21kLT5rZXlfaXggPT0gV01BX0lHVEtfS0VZX0lOREVYXzQpIHx8CisJCQkgICAgKGNtZC0+a2V5X2l4ID09IFdNQV9JR1RLX0tFWV9JTkRFWF81KSkKKwkJCQljZGZfbWVtX3plcm8oaWZhY2UtPmtleS5rZXlfaWRbY21kLT5rZXlfaXggLQorCQkJCQkJICAgIFdNQV9JR1RLX0tFWV9JTkRFWF80XS5pcG4sCisJCQkJCSAgICAgQ01BQ19JUE5fTEVOKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFXICovCisKKwlXTUFfTE9HRCgiS2V5IHNldHVwIDogdmRldl9pZCAlZCBrZXlfaWR4ICVkIGtleV90eXBlICVkIGtleV9sZW4gJWQiCisJCSAiIHVuaWNhc3QgJWQgcGVlcl9tYWMgJXBNIGRlZl9rZXlfaWR4ICVkIiwga2V5X3BhcmFtcy0+dmRldl9pZCwKKwkJIGtleV9wYXJhbXMtPmtleV9pZHgsIGtleV9wYXJhbXMtPmtleV90eXBlLCBrZXlfcGFyYW1zLT5rZXlfbGVuLAorCQkga2V5X3BhcmFtcy0+dW5pY2FzdCwga2V5X3BhcmFtcy0+cGVlcl9tYWMsCisJCSBrZXlfcGFyYW1zLT5kZWZfa2V5X2lkeCk7CisKKwlyZXR1cm4gYnVmOworfQorCisvKioKKyAqIHdtYV9zZXRfYnNza2V5KCkgLSBzZXQgZW5jcnlwdGlvbiBrZXkgdG8gZncuCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQGtleV9pbmZvOiBrZXkgaW5mbworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9zZXRfYnNza2V5KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgdHBTZXRCc3NLZXlQYXJhbXMga2V5X2luZm8pCit7CisJc3RydWN0IHdtYV9zZXRfa2V5X3BhcmFtcyBrZXlfcGFyYW1zOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgbGVuID0gMCwgaTsKKwl1aW50MzJfdCBkZWZfa2V5X2lkeCA9IDA7CisJb2xfdHhyeF92ZGV2X2hhbmRsZSB0eHJ4X3ZkZXY7CisKKwlXTUFfTE9HRCgiQlNTIGtleSBzZXR1cCIpOworCXR4cnhfdmRldiA9IHdtYV9maW5kX3ZkZXZfYnlfaWQod21hX2hhbmRsZSwga2V5X2luZm8tPnNtZXNlc3Npb25JZCk7CisJaWYgKCF0eHJ4X3ZkZXYpIHsKKwkJV01BX0xPR0UoIiVzOkludmFsaWQgdmRldiBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCWtleV9pbmZvLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBGb3IgSUJTUywgV01JIGV4cGVjdHMgdGhlIEJTUyBrZXkgdG8gYmUgc2V0IHBlciBwZWVyIGtleQorCSAqIFNvIGNhY2hlIHRoZSBCU1Mga2V5IGluIHRoZSB3bWFfaGFuZGxlIGFuZCByZS11c2UgaXQgd2hlbiB0aGUKKwkgKiBTVEEga2V5IGlzIGJlZW4gc2V0dXAgZm9yIGEgcGVlcgorCSAqLworCWlmICh3bGFuX29wX21vZGVfaWJzcyA9PSB0eHJ4X3ZkZXYtPm9wbW9kZSkgeworCQlrZXlfaW5mby0+c3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCQlpZiAod21hX2hhbmRsZS0+aWJzc19zdGFydGVkID4gMCkKKwkJCWdvdG8gb3V0OworCQlXTUFfTE9HRCgiQ2FjaGluZyBJQlNTIEtleSIpOworCQljZGZfbWVtX2NvcHkoJndtYV9oYW5kbGUtPmlic3NrZXlfaW5mbywga2V5X2luZm8sCisJCQkgICAgIHNpemVvZih0U2V0QnNzS2V5UGFyYW1zKSk7CisJfQorCisJY2RmX21lbV9zZXQoJmtleV9wYXJhbXMsIHNpemVvZihrZXlfcGFyYW1zKSwgMCk7CisJa2V5X3BhcmFtcy52ZGV2X2lkID0ga2V5X2luZm8tPnNtZXNlc3Npb25JZDsKKwlrZXlfcGFyYW1zLmtleV90eXBlID0ga2V5X2luZm8tPmVuY1R5cGU7CisJa2V5X3BhcmFtcy5zaW5nbF90aWRfcmMgPSBrZXlfaW5mby0+c2luZ2xlVGlkUmM7CisJa2V5X3BhcmFtcy51bmljYXN0ID0gZmFsc2U7CisJaWYgKHR4cnhfdmRldi0+b3Btb2RlID09IHdsYW5fb3BfbW9kZV9zdGEpIHsKKwkJY2RmX21lbV9jb3B5KGtleV9wYXJhbXMucGVlcl9tYWMsCisJCQl3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW2tleV9pbmZvLT5zbWVzZXNzaW9uSWRdLmJzc2lkLAorCQkJSUVFRTgwMjExX0FERFJfTEVOKTsKKwl9IGVsc2UgeworCQkvKiB2ZGV2IG1hYyBhZGRyZXNzIHdpbGwgYmUgcGFzc2VkIGZvciBhbGwgb3RoZXIgbW9kZXMgKi8KKwkJY2RmX21lbV9jb3B5KGtleV9wYXJhbXMucGVlcl9tYWMsIHR4cnhfdmRldi0+bWFjX2FkZHIucmF3LAorCQkJICAgICBJRUVFODAyMTFfQUREUl9MRU4pOworCQlXTUFfTE9HQSgiQlNTIEtleSBzZXR1cCB3aXRoIHZkZXZfbWFjICVwTVxuIiwKKwkJCSB0eHJ4X3ZkZXYtPm1hY19hZGRyLnJhdyk7CisJfQorCisJaWYgKGtleV9pbmZvLT5udW1LZXlzID09IDAgJiYKKwkgICAgKGtleV9pbmZvLT5lbmNUeXBlID09IGVTSVJfRURfV0VQNDAgfHwKKwkgICAgIGtleV9pbmZvLT5lbmNUeXBlID09IGVTSVJfRURfV0VQMTA0KSkgeworCQl3bWFfcmVhZF9jZmdfd2Vwa2V5KHdtYV9oYW5kbGUsIGtleV9pbmZvLT5rZXksCisJCQkJICAgICZkZWZfa2V5X2lkeCwgJmtleV9pbmZvLT5udW1LZXlzKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwga2V5X2luZm8tPm51bUtleXM7IGkrKykgeworCQlpZiAoa2V5X3BhcmFtcy5rZXlfdHlwZSAhPSBlU0lSX0VEX05PTkUgJiYKKwkJICAgICFrZXlfaW5mby0+a2V5W2ldLmtleUxlbmd0aCkKKwkJCWNvbnRpbnVlOworCQlpZiAoa2V5X2luZm8tPmVuY1R5cGUgPT0gZVNJUl9FRF9XUEkpIHsKKwkJCWtleV9wYXJhbXMua2V5X2lkeCA9IGtleV9pbmZvLT5rZXlbaV0ua2V5SWQ7CisJCQlrZXlfcGFyYW1zLmRlZl9rZXlfaWR4ID0ga2V5X2luZm8tPmtleVtpXS5rZXlJZDsKKwkJfSBlbHNlCisJCQlrZXlfcGFyYW1zLmtleV9pZHggPSBrZXlfaW5mby0+a2V5W2ldLmtleUlkOworCisJCWtleV9wYXJhbXMua2V5X2xlbiA9IGtleV9pbmZvLT5rZXlbaV0ua2V5TGVuZ3RoOworCQlpZiAoa2V5X2luZm8tPmVuY1R5cGUgPT0gZVNJUl9FRF9US0lQKSB7CisJCQljZGZfbWVtX2NvcHkoa2V5X3BhcmFtcy5rZXlfZGF0YSwKKwkJCQkgICAgIGtleV9pbmZvLT5rZXlbaV0ua2V5LCAxNik7CisJCQljZGZfbWVtX2NvcHkoJmtleV9wYXJhbXMua2V5X2RhdGFbMTZdLAorCQkJCSAgICAgJmtleV9pbmZvLT5rZXlbaV0ua2V5WzI0XSwgOCk7CisJCQljZGZfbWVtX2NvcHkoJmtleV9wYXJhbXMua2V5X2RhdGFbMjRdLAorCQkJCSAgICAgJmtleV9pbmZvLT5rZXlbaV0ua2V5WzE2XSwgOCk7CisJCX0gZWxzZQorCQkJY2RmX21lbV9jb3B5KCh2b2lkICopa2V5X3BhcmFtcy5rZXlfZGF0YSwKKwkJCQkgICAgIChjb25zdCB2b2lkICopa2V5X2luZm8tPmtleVtpXS5rZXksCisJCQkJICAgICBrZXlfaW5mby0+a2V5W2ldLmtleUxlbmd0aCk7CisKKwkJV01BX0xPR0QoIiVzOiBic3Mga2V5WyVkXSBsZW5ndGggJWQiLCBfX2Z1bmNfXywgaSwKKwkJCSBrZXlfaW5mby0+a2V5W2ldLmtleUxlbmd0aCk7CisKKwkJYnVmID0gd21hX3NldHVwX2luc3RhbGxfa2V5X2NtZCh3bWFfaGFuZGxlLCAma2V5X3BhcmFtcywgJmxlbiwKKwkJCQkJCXR4cnhfdmRldi0+b3Btb2RlKTsKKwkJaWYgKCFidWYpIHsKKwkJCVdNQV9MT0dFKCIlczpGYWlsZWQgdG8gc2V0dXAgaW5zdGFsbCBrZXkgYnVmIiwKKwkJCQkgX19mdW5jX18pOworCQkJa2V5X2luZm8tPnN0YXR1cyA9IENERl9TVEFUVVNfRV9OT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3RhdHVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJCSAgICAgIFdNSV9WREVWX0lOU1RBTExfS0VZX0NNRElEKTsKKwkJaWYgKHN0YXR1cykgeworCQkJY2RmX25idWZfZnJlZShidWYpOworCQkJV01BX0xPR0UoIiVzOkZhaWxlZCB0byBzZW5kIGluc3RhbGwga2V5IGNvbW1hbmQiLAorCQkJCSBfX2Z1bmNfXyk7CisJCQlrZXlfaW5mby0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXdtYV9oYW5kbGUtPmlic3Nfc3RhcnRlZCsrOworCS8qIFRPRE86IFNob3VsZCB3ZSB3YWl0IHRpbGwgd2UgZ2V0IEhUVF9UMkhfTVNHX1RZUEVfU0VDX0lORD8gKi8KKwlrZXlfaW5mby0+c3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCitvdXQ6CisJd21hX3NlbmRfbXNnKHdtYV9oYW5kbGUsIFdNQV9TRVRfQlNTS0VZX1JTUCwgKHZvaWQgKilrZXlfaW5mbywgMCk7Cit9CisKKyNpZmRlZiBRQ0FfSUJTU19TVVBQT1JUCisvKioKKyAqIHdtYV9jYWxjX2lic3NfaGVhcnRfYmVhdF90aW1lcigpIC0gY2FsY3VsYXRlIElCU1MgaGVhcnQgYmVhdCB0aW1lcgorICogQHBlZXJfbnVtOiBudW1iZXIgb2YgcGVlcnMKKyAqCisgKiBSZXR1cm46IGhlYXJ0IGJlYXQgdGltZXIgdmFsdWUKKyAqLworc3RhdGljIHVpbnQxNl90IHdtYV9jYWxjX2lic3NfaGVhcnRfYmVhdF90aW1lcihpbnQxNl90IHBlZXJfbnVtKQoreworCS8qIGhlYXJ0IGJlYXQgdGltZXIgdmFsdWUgbG9vay11cCB0YWJsZSAqLworCS8qIGVudHJ5IGluZGV4IDogKHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBwZWVycykgLSAxCisJICAgZW50cnkgdmFsdWUgOiB0aGUgaGVhcnQgdGltZSB0aHJlc2hvbGQgdmFsdWUgaW4gc2Vjb25kcyBmb3IKKwkgICBkZXRlY3RpbmcgaWJzcyBwZWVyIGRlcGFydHVyZSAqLworCXN0YXRpYyBjb25zdCB1aW50MTZfdCBoZWFydF9iZWF0X3RpbWVyW01BWF9JQlNTX1BFRVJTXSA9IHsKKwkJNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKwkJOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKwkJMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorCQkxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKKwl9OworCisJaWYgKHBlZXJfbnVtIDwgMSB8fCBwZWVyX251bSA+IE1BWF9JQlNTX1BFRVJTKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBoZWFydF9iZWF0X3RpbWVyW3BlZXJfbnVtIC0gMV07CisKK30KKworLyoqCisgKiB3bWFfYWRqdXN0X2lic3NfaGVhcnRfYmVhdF90aW1lcigpIC0gc2V0IGlic3MgaGVhcnQgYmVhdCB0aW1lciBpbiBmdy4KKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAcGVlcl9udW1fZGVsdGE6IHBlZXIgbnVtYmVyIGRlbHRhIHZhbHVlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX2FkanVzdF9pYnNzX2hlYXJ0X2JlYXRfdGltZXIodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJICAgICAgdWludDhfdCB2ZGV2X2lkLAorCQkJCSAgICAgIGludDhfdCBwZWVyX251bV9kZWx0YSkKK3sKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXY7CisJaW50MTZfdCBuZXdfcGVlcl9udW07CisJdWludDE2X3QgbmV3X3RpbWVyX3ZhbHVlX3NlYzsKKwl1aW50MzJfdCBuZXdfdGltZXJfdmFsdWVfbXM7CisKKwlpZiAocGVlcl9udW1fZGVsdGEgIT0gMSAmJiBwZWVyX251bV9kZWx0YSAhPSAtMSkgeworCQlXTUFfTE9HRSgiSW52YWxpZCBwZWVyX251bV9kZWx0YSB2YWx1ZSAlZCIsIHBlZXJfbnVtX2RlbHRhKTsKKwkJcmV0dXJuOworCX0KKworCXZkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2lkKHdtYSwgdmRldl9pZCk7CisJaWYgKCF2ZGV2KSB7CisJCVdNQV9MT0dFKCJ2ZGV2IG5vdCBmb3VuZCA6IHZkZXZfaWQgJWQiLCB2ZGV2X2lkKTsKKwkJcmV0dXJuOworCX0KKworCW5ld19wZWVyX251bSA9IHZkZXYtPmlic3NfcGVlcl9udW0gKyBwZWVyX251bV9kZWx0YTsKKwlpZiAobmV3X3BlZXJfbnVtID4gTUFYX0lCU1NfUEVFUlMgfHwgbmV3X3BlZXJfbnVtIDwgMCkgeworCQlXTUFfTE9HRSgibmV3IHBlZXIgbnVtICVkIG91dCBvZiB2YWxpZCBib3VuZGFyeSIsIG5ld19wZWVyX251bSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBhZGp1c3QgcGVlciBudW1iZXJzICovCisJdmRldi0+aWJzc19wZWVyX251bSA9IG5ld19wZWVyX251bTsKKworCS8qIHJlc2V0IHRpbWVyIHZhbHVlIGlmIGFsbCBwZWVycyBkZXBhcnRlZCAqLworCWlmIChuZXdfcGVlcl9udW0gPT0gMCkgeworCQl2ZGV2LT5pYnNzX3BlZXJfaGVhcnRfYmVhdF90aW1lciA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKiBjYWxjdWxhdGUgbmV3IHRpbWVyIHZhbHVlICovCisJbmV3X3RpbWVyX3ZhbHVlX3NlYyA9IHdtYV9jYWxjX2lic3NfaGVhcnRfYmVhdF90aW1lcihuZXdfcGVlcl9udW0pOworCWlmIChuZXdfdGltZXJfdmFsdWVfc2VjID09IDApIHsKKwkJV01BX0xPR0UoInRpbWVyIHZhbHVlICVkIGlzIGludmFsaWQgZm9yIHBlZXIgbnVtYmVyICVkIiwKKwkJCSBuZXdfdGltZXJfdmFsdWVfc2VjLCBuZXdfcGVlcl9udW0pOworCQlyZXR1cm47CisJfQorCWlmIChuZXdfdGltZXJfdmFsdWVfc2VjID09IHZkZXYtPmlic3NfcGVlcl9oZWFydF9iZWF0X3RpbWVyKSB7CisJCVdNQV9MT0dEKCJ0aW1lciB2YWx1ZSAlZCBzdGF5cyBzYW1lLCBubyBuZWVkIHRvIG5vdGlmeSB0YXJnZXQiLAorCQkJIG5ld190aW1lcl92YWx1ZV9zZWMpOworCQlyZXR1cm47CisJfQorCisJLyogc2VuZCBuZXcgdGltZXIgdmFsdWUgdG8gdGFyZ2V0ICovCisJdmRldi0+aWJzc19wZWVyX2hlYXJ0X2JlYXRfdGltZXIgPSBuZXdfdGltZXJfdmFsdWVfc2VjOworCisJbmV3X3RpbWVyX3ZhbHVlX21zID0gKCh1aW50MzJfdCkgbmV3X3RpbWVyX3ZhbHVlX3NlYykgKiAxMDAwOworCisJaWYgKHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkgICAgV01JX1ZERVZfUEFSQU1fSUJTU19NQVhfQkNOX0xPU1RfTVMsCisJCQkJCSAgICBuZXdfdGltZXJfdmFsdWVfbXMpKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2V0IElCU1MgbGluayBtb25pdG9yaW5nIHRpbWVyIHZhbHVlIik7CisJCXJldHVybjsKKwl9CisKKwlXTUFfTE9HRCgiU2V0IElCU1MgbGluayBtb25pdG9yIHRpbWVyOiBwZWVyX251bSA9ICVkIHRpbWVyX3ZhbHVlID0gJWQiLAorCQkgbmV3X3BlZXJfbnVtLCBuZXdfdGltZXJfdmFsdWVfbXMpOworfQorCisjZW5kaWYgLyogUUNBX0lCU1NfU1VQUE9SVCAqLworLyoqCisgKiB3bWFfc2V0X2lic3NrZXlfaGVscGVyKCkgLSBjYWNoZWQgSUJTUyBrZXkgaW4gd21hIGhhbmRsZQorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBrZXlfaW5mbzogc2V0IGJzcyBrZXkgaW5mbworICogQHBlZXJNYWNBZGRyOiBwZWVyIG1hYyBhZGRyZXNzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9zZXRfaWJzc2tleV9oZWxwZXIodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgIHRwU2V0QnNzS2V5UGFyYW1zIGtleV9pbmZvLAorCQkJCSAgIHVpbnQ4X3QgKnBlZXJNYWNBZGRyKQoreworCXN0cnVjdCB3bWFfc2V0X2tleV9wYXJhbXMga2V5X3BhcmFtczsKKwl3bWlfYnVmX3QgYnVmOworCWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IGxlbiA9IDAsIGk7CisJdWludDMyX3QgZGVmX2tleV9pZHggPSAwOworCW9sX3R4cnhfdmRldl9oYW5kbGUgdHhyeF92ZGV2OworCisJV01BX0xPR0QoIkJTUyBrZXkgc2V0dXAgZm9yIHBlZXIiKTsKKwlBU1NFUlQoTlVMTCAhPSBwZWVyTWFjQWRkcik7CisJdHhyeF92ZGV2ID0gd21hX2ZpbmRfdmRldl9ieV9pZCh3bWFfaGFuZGxlLCBrZXlfaW5mby0+c21lc2Vzc2lvbklkKTsKKwlpZiAoIXR4cnhfdmRldikgeworCQlXTUFfTE9HRSgiJXM6SW52YWxpZCB2ZGV2IGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJa2V5X2luZm8tPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlyZXR1cm47CisJfQorCisJY2RmX21lbV9zZXQoJmtleV9wYXJhbXMsIHNpemVvZihrZXlfcGFyYW1zKSwgMCk7CisJa2V5X3BhcmFtcy52ZGV2X2lkID0ga2V5X2luZm8tPnNtZXNlc3Npb25JZDsKKwlrZXlfcGFyYW1zLmtleV90eXBlID0ga2V5X2luZm8tPmVuY1R5cGU7CisJa2V5X3BhcmFtcy5zaW5nbF90aWRfcmMgPSBrZXlfaW5mby0+c2luZ2xlVGlkUmM7CisJa2V5X3BhcmFtcy51bmljYXN0ID0gZmFsc2U7CisJQVNTRVJUKHdsYW5fb3BfbW9kZV9pYnNzID09IHR4cnhfdmRldi0+b3Btb2RlKTsKKworCWNkZl9tZW1fY29weShrZXlfcGFyYW1zLnBlZXJfbWFjLCBwZWVyTWFjQWRkciwgSUVFRTgwMjExX0FERFJfTEVOKTsKKworCWlmIChrZXlfaW5mby0+bnVtS2V5cyA9PSAwICYmCisJICAgIChrZXlfaW5mby0+ZW5jVHlwZSA9PSBlU0lSX0VEX1dFUDQwIHx8CisJICAgICBrZXlfaW5mby0+ZW5jVHlwZSA9PSBlU0lSX0VEX1dFUDEwNCkpIHsKKwkJd21hX3JlYWRfY2ZnX3dlcGtleSh3bWFfaGFuZGxlLCBrZXlfaW5mby0+a2V5LAorCQkJCSAgICAmZGVmX2tleV9pZHgsICZrZXlfaW5mby0+bnVtS2V5cyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGtleV9pbmZvLT5udW1LZXlzOyBpKyspIHsKKwkJaWYgKGtleV9wYXJhbXMua2V5X3R5cGUgIT0gZVNJUl9FRF9OT05FICYmCisJCSAgICAha2V5X2luZm8tPmtleVtpXS5rZXlMZW5ndGgpCisJCQljb250aW51ZTsKKwkJa2V5X3BhcmFtcy5rZXlfaWR4ID0ga2V5X2luZm8tPmtleVtpXS5rZXlJZDsKKwkJa2V5X3BhcmFtcy5rZXlfbGVuID0ga2V5X2luZm8tPmtleVtpXS5rZXlMZW5ndGg7CisJCWlmIChrZXlfaW5mby0+ZW5jVHlwZSA9PSBlU0lSX0VEX1RLSVApIHsKKwkJCWNkZl9tZW1fY29weShrZXlfcGFyYW1zLmtleV9kYXRhLAorCQkJCSAgICAga2V5X2luZm8tPmtleVtpXS5rZXksIDE2KTsKKwkJCWNkZl9tZW1fY29weSgma2V5X3BhcmFtcy5rZXlfZGF0YVsxNl0sCisJCQkJICAgICAma2V5X2luZm8tPmtleVtpXS5rZXlbMjRdLCA4KTsKKwkJCWNkZl9tZW1fY29weSgma2V5X3BhcmFtcy5rZXlfZGF0YVsyNF0sCisJCQkJICAgICAma2V5X2luZm8tPmtleVtpXS5rZXlbMTZdLCA4KTsKKwkJfSBlbHNlCisJCQljZGZfbWVtX2NvcHkoKHZvaWQgKilrZXlfcGFyYW1zLmtleV9kYXRhLAorCQkJCSAgICAgKGNvbnN0IHZvaWQgKilrZXlfaW5mby0+a2V5W2ldLmtleSwKKwkJCQkgICAgIGtleV9pbmZvLT5rZXlbaV0ua2V5TGVuZ3RoKTsKKworCQlXTUFfTE9HRCgiJXM6IHBlZXIgYmNhc3Qga2V5WyVkXSBsZW5ndGggJWQiLCBfX2Z1bmNfXywgaSwKKwkJCSBrZXlfaW5mby0+a2V5W2ldLmtleUxlbmd0aCk7CisKKwkJYnVmID0gd21hX3NldHVwX2luc3RhbGxfa2V5X2NtZCh3bWFfaGFuZGxlLCAma2V5X3BhcmFtcywgJmxlbiwKKwkJCQkJCXR4cnhfdmRldi0+b3Btb2RlKTsKKwkJaWYgKCFidWYpIHsKKwkJCVdNQV9MT0dFKCIlczpGYWlsZWQgdG8gc2V0dXAgaW5zdGFsbCBrZXkgYnVmIiwKKwkJCQkgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisKKwkJc3RhdHVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJCSAgICAgIFdNSV9WREVWX0lOU1RBTExfS0VZX0NNRElEKTsKKwkJaWYgKHN0YXR1cykgeworCQkJY2RmX25idWZfZnJlZShidWYpOworCQkJV01BX0xPR0UoIiVzOkZhaWxlZCB0byBzZW5kIGluc3RhbGwga2V5IGNvbW1hbmQiLAorCQkJCSBfX2Z1bmNfXyk7CisJCX0KKwl9Cit9CisKKy8qKgorICogd21hX3NldF9zdGFrZXkoKSAtIHNldCBlbmNyeXB0aW9uIGtleQorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBrZXlfaW5mbzogc3RhdGlvbiBrZXkgaW5mbworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyBlbmNyeXB0aW9uIGtleSBmb3IgV0VQL1dQQS9XUEEyCisgKiBlbmNyeXB0aW9uIG1vZGUgaW4gZmlybXdhcmUgYW5kIHNlbmQgcmVzcG9uc2UgdG8gdXBwZXIgbGF5ZXIuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3NldF9zdGFrZXkodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLCB0cFNldFN0YUtleVBhcmFtcyBrZXlfaW5mbykKK3sKKwl3bWlfYnVmX3QgYnVmOworCWludDMyX3Qgc3RhdHVzLCBpOworCXVpbnQzMl90IGxlbiA9IDA7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSB0eHJ4X3BkZXY7CisJb2xfdHhyeF92ZGV2X2hhbmRsZSB0eHJ4X3ZkZXY7CisJc3RydWN0IG9sX3R4cnhfcGVlcl90ICpwZWVyOworCXVpbnQ4X3QgbnVtX2tleXMgPSAwLCBwZWVyX2lkOworCXN0cnVjdCB3bWFfc2V0X2tleV9wYXJhbXMga2V5X3BhcmFtczsKKwl1aW50MzJfdCBkZWZfa2V5X2lkeCA9IDA7CisKKwlXTUFfTE9HRCgiU1RBIGtleSBzZXR1cCIpOworCisJLyogR2V0IHRoZSB0eFJ4IFBkZXYgaGFuZGxlICovCisJdHhyeF9wZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJaWYgKCF0eHJ4X3BkZXYpIHsKKwkJV01BX0xPR0UoIiVzOkludmFsaWQgdHhyeCBwZGV2IGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJa2V5X2luZm8tPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIG91dDsKKwl9CisKKwlwZWVyID0gb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcih0eHJ4X3BkZXYsIGtleV9pbmZvLT5wZWVyTWFjQWRkciwKKwkJCQkJICZwZWVyX2lkKTsKKwlpZiAoIXBlZXIpIHsKKwkJV01BX0xPR0UoIiVzOkludmFsaWQgcGVlciBmb3Iga2V5IHNldHRpbmciLCBfX2Z1bmNfXyk7CisJCWtleV9pbmZvLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBvdXQ7CisJfQorCisJdHhyeF92ZGV2ID0gd21hX2ZpbmRfdmRldl9ieV9pZCh3bWFfaGFuZGxlLCBrZXlfaW5mby0+c21lc2Vzc2lvbklkKTsKKwlpZiAoIXR4cnhfdmRldikgeworCQlXTUFfTE9HRSgiJXM6VHhSeCBWZGV2IEhhbmRsZSBpcyBOVUxMIiwgX19mdW5jX18pOworCQlrZXlfaW5mby0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChrZXlfaW5mby0+ZGVmV0VQSWR4ID09IFdNQV9JTlZBTElEX0tFWV9JRFggJiYKKwkgICAgKGtleV9pbmZvLT5lbmNUeXBlID09IGVTSVJfRURfV0VQNDAgfHwKKwkgICAgIGtleV9pbmZvLT5lbmNUeXBlID09IGVTSVJfRURfV0VQMTA0KSAmJgorCSAgICB0eHJ4X3ZkZXYtPm9wbW9kZSAhPSB3bGFuX29wX21vZGVfYXApIHsKKwkJd21hX3JlYWRfY2ZnX3dlcGtleSh3bWFfaGFuZGxlLCBrZXlfaW5mby0+a2V5LAorCQkJCSAgICAmZGVmX2tleV9pZHgsICZudW1fa2V5cyk7CisJCWtleV9pbmZvLT5kZWZXRVBJZHggPSBkZWZfa2V5X2lkeDsKKwl9IGVsc2UgeworCQludW1fa2V5cyA9IFNJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVM7CisJCWlmIChrZXlfaW5mby0+ZW5jVHlwZSAhPSBlU0lSX0VEX05PTkUpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW1fa2V5czsgaSsrKSB7CisJCQkJaWYgKGtleV9pbmZvLT5rZXlbaV0ua2V5RGlyZWN0aW9uID09CisJCQkJICAgIGVTSVJfVFhfREVGQVVMVCkgeworCQkJCQlrZXlfaW5mby0+ZGVmV0VQSWR4ID0gaTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWNkZl9tZW1fc2V0KCZrZXlfcGFyYW1zLCBzaXplb2Yoa2V5X3BhcmFtcyksIDApOworCWtleV9wYXJhbXMudmRldl9pZCA9IGtleV9pbmZvLT5zbWVzZXNzaW9uSWQ7CisJa2V5X3BhcmFtcy5rZXlfdHlwZSA9IGtleV9pbmZvLT5lbmNUeXBlOworCWtleV9wYXJhbXMuc2luZ2xfdGlkX3JjID0ga2V5X2luZm8tPnNpbmdsZVRpZFJjOworCWtleV9wYXJhbXMudW5pY2FzdCA9IHRydWU7CisJa2V5X3BhcmFtcy5kZWZfa2V5X2lkeCA9IGtleV9pbmZvLT5kZWZXRVBJZHg7CisJY2RmX21lbV9jb3B5KCh2b2lkICopa2V5X3BhcmFtcy5wZWVyX21hYywKKwkJICAgICAoY29uc3Qgdm9pZCAqKWtleV9pbmZvLT5wZWVyTWFjQWRkciwgSUVFRTgwMjExX0FERFJfTEVOKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2tleXM7IGkrKykgeworCQlpZiAoa2V5X3BhcmFtcy5rZXlfdHlwZSAhPSBlU0lSX0VEX05PTkUgJiYKKwkJICAgICFrZXlfaW5mby0+a2V5W2ldLmtleUxlbmd0aCkKKwkJCWNvbnRpbnVlOworCQlpZiAoa2V5X2luZm8tPmVuY1R5cGUgPT0gZVNJUl9FRF9US0lQKSB7CisJCQljZGZfbWVtX2NvcHkoa2V5X3BhcmFtcy5rZXlfZGF0YSwKKwkJCQkgICAgIGtleV9pbmZvLT5rZXlbaV0ua2V5LCAxNik7CisJCQljZGZfbWVtX2NvcHkoJmtleV9wYXJhbXMua2V5X2RhdGFbMTZdLAorCQkJCSAgICAgJmtleV9pbmZvLT5rZXlbaV0ua2V5WzI0XSwgOCk7CisJCQljZGZfbWVtX2NvcHkoJmtleV9wYXJhbXMua2V5X2RhdGFbMjRdLAorCQkJCSAgICAgJmtleV9pbmZvLT5rZXlbaV0ua2V5WzE2XSwgOCk7CisJCX0gZWxzZQorCQkJY2RmX21lbV9jb3B5KGtleV9wYXJhbXMua2V5X2RhdGEsIGtleV9pbmZvLT5rZXlbaV0ua2V5LAorCQkJCSAgICAga2V5X2luZm8tPmtleVtpXS5rZXlMZW5ndGgpOworCQlpZiAoa2V5X2luZm8tPmVuY1R5cGUgPT0gZVNJUl9FRF9XUEkpIHsKKwkJCWtleV9wYXJhbXMua2V5X2lkeCA9IGtleV9pbmZvLT5rZXlbaV0ua2V5SWQ7CisJCQlrZXlfcGFyYW1zLmRlZl9rZXlfaWR4ID0ga2V5X2luZm8tPmtleVtpXS5rZXlJZDsKKwkJfSBlbHNlCisJCQlrZXlfcGFyYW1zLmtleV9pZHggPSBpOworCisJCWtleV9wYXJhbXMua2V5X2xlbiA9IGtleV9pbmZvLT5rZXlbaV0ua2V5TGVuZ3RoOworCQlidWYgPSB3bWFfc2V0dXBfaW5zdGFsbF9rZXlfY21kKHdtYV9oYW5kbGUsICZrZXlfcGFyYW1zLCAmbGVuLAorCQkJCQkJdHhyeF92ZGV2LT5vcG1vZGUpOworCQlpZiAoIWJ1ZikgeworCQkJV01BX0xPR0UoIiVzOkZhaWxlZCB0byBzZXR1cCBpbnN0YWxsIGtleSBidWYiLAorCQkJCSBfX2Z1bmNfXyk7CisJCQlrZXlfaW5mby0+c3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQlXTUFfTE9HRCgiJXM6IHBlZXIgdW5pY2FzdCBrZXlbJWRdICVkICIsIF9fZnVuY19fLCBpLAorCQkJIGtleV9pbmZvLT5rZXlbaV0ua2V5TGVuZ3RoKTsKKworCQlzdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkJICAgICAgV01JX1ZERVZfSU5TVEFMTF9LRVlfQ01ESUQpOworCQlpZiAoc3RhdHVzKSB7CisJCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJCQlXTUFfTE9HRSgiJXM6RmFpbGVkIHRvIHNlbmQgaW5zdGFsbCBrZXkgY29tbWFuZCIsCisJCQkJIF9fZnVuY19fKTsKKwkJCWtleV9pbmZvLT5zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogSW4gSUJTUyBtb2RlLCBzZXQgdGhlIEJTUyBLRVkgZm9yIHRoaXMgcGVlcgorCSAqIEJTUyBrZXkgaXMgc3VwcG9zZWQgdG8gYmUgY2FjaGUgaW50byB3bWFfaGFuZGxlCisJICovCisJaWYgKHdsYW5fb3BfbW9kZV9pYnNzID09IHR4cnhfdmRldi0+b3Btb2RlKSB7CisJCXdtYV9zZXRfaWJzc2tleV9oZWxwZXIod21hX2hhbmRsZSwgJndtYV9oYW5kbGUtPmlic3NrZXlfaW5mbywKKwkJCQkgICAgICAga2V5X2luZm8tPnBlZXJNYWNBZGRyKTsKKwl9CisKKwkvKiBUT0RPOiBTaG91bGQgd2Ugd2FpdCB0aWxsIHdlIGdldCBIVFRfVDJIX01TR19UWVBFX1NFQ19JTkQ/ICovCisJa2V5X2luZm8tPnN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKK291dDoKKwlpZiAoa2V5X2luZm8tPnNlbmRSc3ApCisJCXdtYV9zZW5kX21zZyh3bWFfaGFuZGxlLCBXTUFfU0VUX1NUQUtFWV9SU1AsICh2b2lkICopa2V5X2luZm8sCisJCQkgICAgIDApOworfQorCisvKioKKyAqIHdtYV9wcm9jZXNzX3VwZGF0ZV9lZGNhX3BhcmFtX3JlcSgpIC0gdXBkYXRlIEVEQ0EgcGFyYW1zCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZWRjYV9wYXJhbXM6IGVkY2EgcGFyYW1ldGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBFRENBIHBhcmFtZXRlcnMgdG8gdGhlIHRhcmdldAorICoKKyAqIFJldHVybjogQ0RGIFN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX3VwZGF0ZV9lZGNhX3BhcmFtX3JlcShXTUFfSEFORExFIGhhbmRsZSwKKwkJCQkJICAgICB0RWRjYVBhcmFtcyAqZWRjYV9wYXJhbXMpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwl1aW50OF90ICpidWZfcHRyOworCXdtaV9idWZfdCBidWY7CisJd21pX3ZkZXZfc2V0X3dtbV9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX3dtbV92cGFyYW1zICp3bW1fcGFyYW07CisJdFNpck1hY0VkY2FQYXJhbVJlY29yZCAqZWRjYV9yZWNvcmQ7CisJaW50IGFjOworCWludCBsZW4gPSBzaXplb2YoKmNtZCk7CisJb2xfdHhyeF9wZGV2X2hhbmRsZSBwZGV2OworCXN0cnVjdCBvbF90eF93bW1fcGFyYW1fdCBvbF90eF93bW1fcGFyYW07CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwljbWQgPSAod21pX3ZkZXZfc2V0X3dtbV9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc2V0X3dtbV9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV92ZGV2X3NldF93bW1fcGFyYW1zX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IGVkY2FfcGFyYW1zLT5ic3NJZHg7CisKKwlmb3IgKGFjID0gMDsgYWMgPCBXTUVfTlVNX0FDOyBhYysrKSB7CisJCXdtbV9wYXJhbSA9ICh3bWlfd21tX3ZwYXJhbXMgKikgKCZjbWQtPndtbV9wYXJhbXNbYWNdKTsKKwkJV01JVExWX1NFVF9IRFIoJndtbV9wYXJhbS0+dGx2X2hlYWRlciwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF93bW1fcGFyYW1zX2NtZF9maXhlZF9wYXJhbSwKKwkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX3dtbV92cGFyYW1zKSk7CisJCXN3aXRjaCAoYWMpIHsKKwkJY2FzZSBXTUVfQUNfQkU6CisJCQllZGNhX3JlY29yZCA9ICZlZGNhX3BhcmFtcy0+YWNiZTsKKwkJCWJyZWFrOworCQljYXNlIFdNRV9BQ19CSzoKKwkJCWVkY2FfcmVjb3JkID0gJmVkY2FfcGFyYW1zLT5hY2JrOworCQkJYnJlYWs7CisJCWNhc2UgV01FX0FDX1ZJOgorCQkJZWRjYV9yZWNvcmQgPSAmZWRjYV9wYXJhbXMtPmFjdmk7CisJCQlicmVhazsKKwkJY2FzZSBXTUVfQUNfVk86CisJCQllZGNhX3JlY29yZCA9ICZlZGNhX3BhcmFtcy0+YWN2bzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBmYWlsOworCQl9CisKKwkJd21hX3VwZGF0ZV9lZGNhX3BhcmFtc19mb3JfYWMoZWRjYV9yZWNvcmQsIHdtbV9wYXJhbSwgYWMpOworCisJCW9sX3R4X3dtbV9wYXJhbS5hY1thY10uYWlmcyA9IHdtbV9wYXJhbS0+YWlmczsKKwkJb2xfdHhfd21tX3BhcmFtLmFjW2FjXS5jd21pbiA9IHdtbV9wYXJhbS0+Y3dtaW47CisJCW9sX3R4X3dtbV9wYXJhbS5hY1thY10uY3dtYXggPSB3bW1fcGFyYW0tPmN3bWF4OworCX0KKworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgV01JX1ZERVZfU0VUX1dNTV9QQVJBTVNfQ01ESUQpKQorCQlnb3RvIGZhaWw7CisKKwlwZGV2ID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfVFhSWCk7CisJb2xfdHhyeF9zZXRfd21tX3BhcmFtKHBkZXYsIG9sX3R4X3dtbV9wYXJhbSk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCitmYWlsOgorCXdtaV9idWZfZnJlZShidWYpOworCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNldCBXTU0gUGFyZW1ldGVycyIsIF9fZnVuY19fKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKy8qKgorICogd21pX3VuaWZpZWRfcHJvYmVfcnNwX3RtcGxfc2VuZCgpIC0gc2VuZCBwcm9iZSByZXNwb25zZSB0ZW1wbGF0ZSB0byBmdworICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBwcm9iZV9yc3BfaW5mbzogcHJvYmUgcmVzcG9uc2UgaW5mbworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd21pX3VuaWZpZWRfcHJvYmVfcnNwX3RtcGxfc2VuZCh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJICAgdWludDhfdCB2ZGV2X2lkLAorCQkJCQkgICB0cFNlbmRQcm9iZVJlc3BQYXJhbXMgcHJvYmVfcnNwX2luZm8pCit7CisJd21pX3ByYl90bXBsX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9iY25fcHJiX2luZm8gKmJjbl9wcmJfaW5mbzsKKwl3bWlfYnVmX3Qgd21pX2J1ZjsKKwl1aW50MzJfdCB0bXBsX2xlbiwgdG1wbF9sZW5fYWxpZ25lZCwgd21pX2J1Zl9sZW47CisJdWludDhfdCAqZnJtLCAqYnVmX3B0cjsKKwlpbnQgcmV0OworCXVpbnQ2NF90IGFkanVzdGVkX3RzZl9sZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aDsKKworCVdNQV9MT0dEKEZMKCJTZW5kIHByb2JlIHJlc3BvbnNlIHRlbXBsYXRlIGZvciB2ZGV2ICVkIiksIHZkZXZfaWQpOworCisJZnJtID0gcHJvYmVfcnNwX2luZm8tPnBQcm9iZVJlc3BUZW1wbGF0ZTsKKwl0bXBsX2xlbiA9IHByb2JlX3JzcF9pbmZvLT5wcm9iZVJlc3BUZW1wbGF0ZUxlbjsKKwl0bXBsX2xlbl9hbGlnbmVkID0gcm91bmR1cCh0bXBsX2xlbiwgc2l6ZW9mKEFfVUlOVDMyKSk7CisJLyoKKwkgKiBNYWtlIHRoZSBUU0Ygb2Zmc2V0IG5lZ2F0aXZlIHNvIHByb2JlIHJlc3BvbnNlIGluIHRoZSBzYW1lCisJICogc3RhZ2dlcmVkIGJhdGNoIGhhdmUgdGhlIHNhbWUgVFNGLgorCSAqLworCWFkanVzdGVkX3RzZl9sZSA9IGNwdV90b19sZTY0KDBVTEwgLQorCQkJCSAgICAgIHdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS50c2ZhZGp1c3QpOworCS8qIFVwZGF0ZSB0aGUgdGltc3RhbXAgaW4gdGhlIHByb2JlIHJlc3BvbnNlIGJ1ZmZlciB3aXRoIGFkanVzdGVkIFRTRiAqLworCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKilmcm07CisJQV9NRU1DUFkoJndoWzFdLCAmYWRqdXN0ZWRfdHNmX2xlLCBzaXplb2YoYWRqdXN0ZWRfdHNmX2xlKSk7CisKKwl3bWlfYnVmX2xlbiA9IHNpemVvZih3bWlfcHJiX3RtcGxfY21kX2ZpeGVkX3BhcmFtKSArCisJCQlzaXplb2Yod21pX2Jjbl9wcmJfaW5mbykgKyBXTUlfVExWX0hEUl9TSVpFICsKKwkJCXRtcGxfbGVuX2FsaWduZWQ7CisKKwlpZiAod21pX2J1Zl9sZW4gPiBCRUFDT05fVFhfQlVGRkVSX1NJWkUpIHsKKwkJV01BX0xPR0UoRkwoIndtaV9idWZfbGVuOiAlZCA+ICVkLiBDYW4ndCBzZW5kIHdtaSBjbWQiKSwKKwkJd21pX2J1Zl9sZW4sIEJFQUNPTl9UWF9CVUZGRVJfU0laRSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdtaV9idWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgd21pX2J1Zl9sZW4pOworCWlmICghd21pX2J1ZikgeworCQlXTUFfTE9HRShGTCgid21pX2J1Zl9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEod21pX2J1Zik7CisKKwljbWQgPSAod21pX3ByYl90bXBsX2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wcmJfdG1wbF9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX3ByYl90bXBsX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJY21kLT5idWZfbGVuID0gdG1wbF9sZW47CisJYnVmX3B0ciArPSBzaXplb2Yod21pX3ByYl90bXBsX2NtZF9maXhlZF9wYXJhbSk7CisKKwliY25fcHJiX2luZm8gPSAod21pX2Jjbl9wcmJfaW5mbyAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZiY25fcHJiX2luZm8tPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9iY25fcHJiX2luZm8sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX2Jjbl9wcmJfaW5mbykpOworCWJjbl9wcmJfaW5mby0+Y2FwcyA9IDA7CisJYmNuX3ByYl9pbmZvLT5lcnAgPSAwOworCWJ1Zl9wdHIgKz0gc2l6ZW9mKHdtaV9iY25fcHJiX2luZm8pOworCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9CWVRFLCB0bXBsX2xlbl9hbGlnbmVkKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJY2RmX21lbV9jb3B5KGJ1Zl9wdHIsIGZybSwgdG1wbF9sZW4pOworCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLAorCQkJCSAgIHdtaV9idWYsIHdtaV9idWZfbGVuLCBXTUlfUFJCX1RNUExfQ01ESUQpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoRkwoIkZhaWxlZCB0byBzZW5kIFBSQiBSU1AgdG1wbDogJWQiKSwgcmV0KTsKKwkJd21pX2J1Zl9mcmVlKHdtaV9idWYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd21pX3VuaWZpZWRfYmNuX3RtcGxfc2VuZCgpIC0gc2VuZCBiZWFjb24gdGVtcGxhdGUgdG8gZncKKyAqIEB3bWE6d21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBiY25faW5mbzogYmVhY29uIGluZm8KKyAqIEBieXRlc190b19zdHJpcDogYnl0ZXMgdG8gc3RyaXAKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHdtaV91bmlmaWVkX2Jjbl90bXBsX3NlbmQodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJICAgICB1aW50OF90IHZkZXZfaWQsCisJCQkJICAgICB0cFNlbmRiZWFjb25QYXJhbXMgYmNuX2luZm8sCisJCQkJICAgICB1aW50OF90IGJ5dGVzX3RvX3N0cmlwKQoreworCXdtaV9iY25fdG1wbF9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYmNuX3ByYl9pbmZvICpiY25fcHJiX2luZm87CisJd21pX2J1Zl90IHdtaV9idWY7CisJdWludDMyX3QgdG1wbF9sZW4sIHRtcGxfbGVuX2FsaWduZWQsIHdtaV9idWZfbGVuOworCXVpbnQ4X3QgKmZybSwgKmJ1Zl9wdHI7CisJaW50IHJldDsKKwl1aW50OF90ICpwMnBfaWU7CisJdWludDE2X3QgcDJwX2llX2xlbiA9IDA7CisJdWludDY0X3QgYWRqdXN0ZWRfdHNmX2xlOworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoOworCisJV01BX0xPR0QoIlNlbmQgYmVhY29uIHRlbXBsYXRlIGZvciB2ZGV2ICVkIiwgdmRldl9pZCk7CisKKwlpZiAoYmNuX2luZm8tPnAycEllT2Zmc2V0KSB7CisJCXAycF9pZSA9IGJjbl9pbmZvLT5iZWFjb24gKyBiY25faW5mby0+cDJwSWVPZmZzZXQ7CisJCXAycF9pZV9sZW4gPSAodWludDE2X3QpIHAycF9pZVsxXSArIDI7CisJfQorCisJLyoKKwkgKiBYWFg6IFRoZSBmaXJzdCBieXRlIG9mIGJlYWNvbiBidWZmZXIgY29udGFpbnMgYmVhY29uIGxlbmd0aAorCSAqIG9ubHkgd2hlbiBVTUFDIGluIHNlbmRpbmcgdGhlIGJlYWNvbiB0ZW1wbGF0ZS4gSW4gb3RoZXJjYXNlcworCSAqIChleDogZnJvbSB0YnR0IHVwZGF0ZSkgYmVhY29uIGxlbmd0aCBpcyByZWFkIGZyb20gYmVhY29uCisJICogaW5mb3JtYXRpb24uCisJICovCisJaWYgKGJ5dGVzX3RvX3N0cmlwKQorCQl0bXBsX2xlbiA9ICoodWludDMyX3QgKikgJmJjbl9pbmZvLT5iZWFjb25bMF07CisJZWxzZQorCQl0bXBsX2xlbiA9IGJjbl9pbmZvLT5iZWFjb25MZW5ndGg7CisJaWYgKHAycF9pZV9sZW4pIHsKKwkJdG1wbF9sZW4gLT0gKHVpbnQzMl90KSBwMnBfaWVfbGVuOworCX0KKworCWZybSA9IGJjbl9pbmZvLT5iZWFjb24gKyBieXRlc190b19zdHJpcDsKKwl0bXBsX2xlbl9hbGlnbmVkID0gcm91bmR1cCh0bXBsX2xlbiwgc2l6ZW9mKEFfVUlOVDMyKSk7CisJLyoKKwkgKiBNYWtlIHRoZSBUU0Ygb2Zmc2V0IG5lZ2F0aXZlIHNvIGJlYWNvbnMgaW4gdGhlIHNhbWUKKwkgKiBzdGFnZ2VyZWQgYmF0Y2ggaGF2ZSB0aGUgc2FtZSBUU0YuCisJICovCisJYWRqdXN0ZWRfdHNmX2xlID0gY3B1X3RvX2xlNjQoMFVMTCAtCisJCQkJICAgICAgd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnRzZmFkanVzdCk7CisJLyogVXBkYXRlIHRoZSB0aW1zdGFtcCBpbiB0aGUgYmVhY29uIGJ1ZmZlciB3aXRoIGFkanVzdGVkIFRTRiAqLworCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKilmcm07CisJQV9NRU1DUFkoJndoWzFdLCAmYWRqdXN0ZWRfdHNmX2xlLCBzaXplb2YoYWRqdXN0ZWRfdHNmX2xlKSk7CisKKwl3bWlfYnVmX2xlbiA9IHNpemVvZih3bWlfYmNuX3RtcGxfY21kX2ZpeGVkX3BhcmFtKSArCisJCSAgICAgIHNpemVvZih3bWlfYmNuX3ByYl9pbmZvKSArIFdNSV9UTFZfSERSX1NJWkUgKworCQkgICAgICB0bXBsX2xlbl9hbGlnbmVkOworCisJd21pX2J1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCB3bWlfYnVmX2xlbik7CisJaWYgKCF3bWlfYnVmKSB7CisJCVdNQV9MT0dFKCIlcyA6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKHdtaV9idWYpOworCisJY21kID0gKHdtaV9iY25fdG1wbF9jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfYmNuX3RtcGxfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV9iY25fdG1wbF9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSB2ZGV2X2lkOworCWNtZC0+dGltX2llX29mZnNldCA9IGJjbl9pbmZvLT50aW1JZU9mZnNldCAtIGJ5dGVzX3RvX3N0cmlwOworCWNtZC0+YnVmX2xlbiA9IHRtcGxfbGVuOworCWJ1Zl9wdHIgKz0gc2l6ZW9mKHdtaV9iY25fdG1wbF9jbWRfZml4ZWRfcGFyYW0pOworCisJYmNuX3ByYl9pbmZvID0gKHdtaV9iY25fcHJiX2luZm8gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmYmNuX3ByYl9pbmZvLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfYmNuX3ByYl9pbmZvLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV9iY25fcHJiX2luZm8pKTsKKwliY25fcHJiX2luZm8tPmNhcHMgPSAwOworCWJjbl9wcmJfaW5mby0+ZXJwID0gMDsKKwlidWZfcHRyICs9IHNpemVvZih3bWlfYmNuX3ByYl9pbmZvKTsKKworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgdG1wbF9sZW5fYWxpZ25lZCk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCWNkZl9tZW1fY29weShidWZfcHRyLCBmcm0sIHRtcGxfbGVuKTsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJCQkgICB3bWlfYnVmLCB3bWlfYnVmX2xlbiwgV01JX0JDTl9UTVBMX0NNRElEKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNlbmQgYmNuIHRtcGw6ICVkIiwgX19mdW5jX18sIHJldCk7CisJCXdtaV9idWZfZnJlZSh3bWlfYnVmKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtYV9zdG9yZV9iY25fdG1wbCgpIC0gc3RvcmUgYmVhY29uIHRlbXBsYXRlCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQGJjbl9pbmZvOiBiZWFjb24gcGFyYW1zCisgKgorICogVGhpcyBmdW5jdGlvbiBzdG9yZXMgYmVhY29uIHRlbXBsYXRlIGxvY2FsbHkuCisgKiBUaGlzIHdpbGwgc2VuZCB0byB0YXJnZXQgb24gdGhlIHJlY2VwdGlvbiBvZgorICogU1dCQSBldmVudC4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfc3RvcmVfYmNuX3RtcGwodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCwKKwkJCSAgICAgIHRwU2VuZGJlYWNvblBhcmFtcyBiY25faW5mbykKK3sKKwlzdHJ1Y3QgYmVhY29uX2luZm8gKmJjbjsKKwl1aW50MzJfdCBsZW47CisJdWludDhfdCAqYmNuX3BheWxvYWQ7CisJc3RydWN0IGJlYWNvbl90aW1faWUgKnRpbV9pZTsKKworCWJjbiA9IHdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5iZWFjb247CisJaWYgKCFiY24gfHwgIWJjbi0+YnVmKSB7CisJCVdNQV9MT0dFKCIlczogTWVtb3J5IGlzIG5vdCBhbGxvY2F0ZWQgdG8gaG9sZCBiY24gdGVtcGxhdGUiLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwlsZW4gPSAqKHUzMiAqKSAmYmNuX2luZm8tPmJlYWNvblswXTsKKwlpZiAobGVuID4gV01BX0JDTl9CVUZfTUFYX1NJWkUpIHsKKwkJV01BX0xPR0UoIiVzOiBSZWNlaXZlZCBiZWFjb24gbGVuICVkIGV4Y2VlZGluZyBtYXggbGltaXQgJWQiLAorCQkJIF9fZnVuY19fLCBsZW4sIFdNQV9CQ05fQlVGX01BWF9TSVpFKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJV01BX0xPR0QoIiVzOiBTdG9yaW5nIHJlY2VpdmVkIGJlYWNvbiB0ZW1wbGF0ZSBidWYgdG8gbG9jYWwgYnVmZmVyIiwKKwkJIF9fZnVuY19fKTsKKwljZGZfc3Bpbl9sb2NrX2JoKCZiY24tPmxvY2spOworCisJLyoKKwkgKiBDb3B5IHJlY2VpdmVkIGJlYWNvbiB0ZW1wbGF0ZSBjb250ZW50IGluIGxvY2FsIGJ1ZmZlci4KKwkgKiB0aGlzIHdpbGwgYmUgc2VuZCB0byB0YXJnZXQgb24gdGhlIHJlY2VwdGlvbiBvZiBTV0JBCisJICogZXZlbnQgZnJvbSB0YXJnZXQuCisJICovCisJY2RmX25idWZfdHJpbV90YWlsKGJjbi0+YnVmLCBjZGZfbmJ1Zl9sZW4oYmNuLT5idWYpKTsKKwltZW1jcHkoY2RmX25idWZfZGF0YShiY24tPmJ1ZiksCisJICAgICAgIGJjbl9pbmZvLT5iZWFjb24gKyA0IC8qIEV4Y2x1ZGUgYmVhY29uIGxlbmd0aCBmaWVsZCAqLywKKwkgICAgICAgbGVuKTsKKwlpZiAoYmNuX2luZm8tPnRpbUllT2Zmc2V0ID4gMykgeworCQliY24tPnRpbV9pZV9vZmZzZXQgPSBiY25faW5mby0+dGltSWVPZmZzZXQgLSA0OworCX0gZWxzZSB7CisJCWJjbi0+dGltX2llX29mZnNldCA9IGJjbl9pbmZvLT50aW1JZU9mZnNldDsKKwl9CisKKwlpZiAoYmNuX2luZm8tPnAycEllT2Zmc2V0ID4gMykgeworCQliY24tPnAycF9pZV9vZmZzZXQgPSBiY25faW5mby0+cDJwSWVPZmZzZXQgLSA0OworCX0gZWxzZSB7CisJCWJjbi0+cDJwX2llX29mZnNldCA9IGJjbl9pbmZvLT5wMnBJZU9mZnNldDsKKwl9CisJYmNuX3BheWxvYWQgPSBjZGZfbmJ1Zl9kYXRhKGJjbi0+YnVmKTsKKwlpZiAoYmNuLT50aW1faWVfb2Zmc2V0KSB7CisJCXRpbV9pZSA9CisJCQkoc3RydWN0IGJlYWNvbl90aW1faWUgKikoJmJjbl9wYXlsb2FkW2Jjbi0+dGltX2llX29mZnNldF0pOworCQkvKgorCQkgKiBJbnRpYWwgVmFsdWUgb2YgYmNuLT5kdGltX2NvdW50IHdpbGwgYmUgMC4KKwkJICogQnV0IGlmIHRoZSBiZWFjb24gZ2V0cyB1cGRhdGVkIHRoZW4gY3VycmVudCBkdGltCisJCSAqIGNvdW50IHdpbGwgYmUgcmVzdG9yZWQKKwkJICovCisJCXRpbV9pZS0+ZHRpbV9jb3VudCA9IGJjbi0+ZHRpbV9jb3VudDsKKwkJdGltX2llLT50aW1fYml0Y3RsID0gMDsKKwl9CisKKwljZGZfbmJ1Zl9wdXRfdGFpbChiY24tPmJ1ZiwgbGVuKTsKKwliY24tPmxlbiA9IGxlbjsKKworCWNkZl9zcGluX3VubG9ja19iaCgmYmNuLT5sb2NrKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3RidHRvZmZzZXRfdXBkYXRlX2V2ZW50X2hhbmRsZXIoKSAtIHRidHQgb2Zmc2V0IHVwZGF0ZSBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZXZlbnQ6IGV2ZW50IGJ1ZmZlcgorICogQGxlbjogZGF0YSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX3RidHRvZmZzZXRfdXBkYXRlX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwKKwkJCQkJICAgICAgIHVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX1RCVFRPRkZTRVRfVVBEQVRFX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV90YnR0X29mZnNldF9ldmVudF9maXhlZF9wYXJhbSAqdGJ0dF9vZmZzZXRfZXZlbnQ7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmludGY7CisJc3RydWN0IGJlYWNvbl9pbmZvICpiY247CisJdFNlbmRiZWFjb25QYXJhbXMgYmNuX2luZm87CisJdWludDMyX3QgKmFkanVzdGVkX3RzZiA9IE5VTEw7CisJdWludDMyX3QgaWZfaWQgPSAwLCB2ZGV2X21hcDsKKworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIHdtYSBoYW5kbGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFyYW1fYnVmID0gKFdNSV9UQlRUT0ZGU0VUX1VQREFURV9FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnQ7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgdGJ0dCB1cGRhdGUgZXZlbnQgYnVmZmVyIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRidHRfb2Zmc2V0X2V2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlpbnRmID0gd21hLT5pbnRlcmZhY2VzOworCXZkZXZfbWFwID0gdGJ0dF9vZmZzZXRfZXZlbnQtPnZkZXZfbWFwOworCWFkanVzdGVkX3RzZiA9IHBhcmFtX2J1Zi0+dGJ0dG9mZnNldF9saXN0OworCWlmICghYWRqdXN0ZWRfdHNmKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBhZGp1c3RlZF90c2YiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoOyAodmRldl9tYXApOyB2ZGV2X21hcCA+Pj0gMSwgaWZfaWQrKykgeworCQlpZiAoISh2ZGV2X21hcCAmIDB4MSkgfHwgKCEoaW50ZltpZl9pZF0uaGFuZGxlKSkpCisJCQljb250aW51ZTsKKworCQliY24gPSBpbnRmW2lmX2lkXS5iZWFjb247CisJCWlmICghYmNuKSB7CisJCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgYmVhY29uIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKCFiY24tPmJ1ZikgeworCQkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIGJlYWNvbiBidWZmZXIiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBTYXZlIHRoZSBhZGp1c3RlZCBUU0YgKi8KKwkJaW50ZltpZl9pZF0udHNmYWRqdXN0ID0gYWRqdXN0ZWRfdHNmW2lmX2lkXTsKKworCQljZGZfc3Bpbl9sb2NrX2JoKCZiY24tPmxvY2spOworCQljZGZfbWVtX3plcm8oJmJjbl9pbmZvLCBzaXplb2YoYmNuX2luZm8pKTsKKwkJYmNuX2luZm8uYmVhY29uID0gY2RmX25idWZfZGF0YShiY24tPmJ1Zik7CisJCWJjbl9pbmZvLnAycEllT2Zmc2V0ID0gYmNuLT5wMnBfaWVfb2Zmc2V0OworCQliY25faW5mby5iZWFjb25MZW5ndGggPSBiY24tPmxlbjsKKwkJYmNuX2luZm8udGltSWVPZmZzZXQgPSBiY24tPnRpbV9pZV9vZmZzZXQ7CisJCWNkZl9zcGluX3VubG9ja19iaCgmYmNuLT5sb2NrKTsKKworCQkvKiBVcGRhdGUgYmVhY29uIHRlbXBsYXRlIGluIGZpcm13YXJlICovCisJCXdtaV91bmlmaWVkX2Jjbl90bXBsX3NlbmQod21hLCBpZl9pZCwgJmJjbl9pbmZvLCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX3AycF9nb19zZXRfYmVhY29uX2llKCkgLSBzZXQgYmVhY29uIElFIGZvciBwMnAgZ28KKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHAycEllOiBwMnAgSUUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHdtYV9wMnBfZ29fc2V0X2JlYWNvbl9pZSh0X3dtYV9oYW5kbGUgKndtYV9oYW5kbGUsCisJCQkJICAgIEFfVUlOVDMyIHZkZXZfaWQsIHVpbnQ4X3QgKnAycEllKQoreworCWludCByZXQ7CisJd21pX3AycF9nb19zZXRfYmVhY29uX2llX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IHdtaV9idWY7CisJdWludDMyX3QgaWVfbGVuLCBpZV9sZW5fYWxpZ25lZCwgd21pX2J1Zl9sZW47CisJdWludDhfdCAqYnVmX3B0cjsKKworCWllX2xlbiA9ICh1aW50MzJfdCkgKHAycEllWzFdICsgMik7CisKKwkvKiBNb3JlIHRoYW4gb25lIFAyUCBJRSBtYXkgYmUgaW5jbHVkZWQgaW4gYSBzaW5nbGUgZnJhbWUuCisJICAgSWYgbXVsdGlwbGUgUDJQIElFcyBhcmUgcHJlc2VudCwgdGhlIGNvbXBsZXRlIFAyUCBhdHRyaWJ1dGUKKwkgICBkYXRhIGNvbnNpc3RzIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBQMlAgQXR0cmlidXRlCisJICAgZmllbGRzIG9mIHRoZSBQMlAgSUVzLiBUaGUgUDJQIEF0dHJpYnV0ZXMgZmllbGQgb2YgZWFjaAorCSAgIFAyUCBJRSBtYXkgYmUgYW55IGxlbmd0aCB1cCB0byB0aGUgbWF4aW11bSAoMjUxIG9jdGV0cykuCisJICAgSW4gdGhpcyBjYXNlIGhvc3Qgc2VuZHMgb25lIFAyUCBJRSB0byBmaXJtd2FyZSBzbyB0aGUgbGVuZ3RoCisJICAgc2hvdWxkIG5vdCBleGNlZWQgbW9yZSB0aGFuIDI1MSBieXRlcworCSAqLworCWlmIChpZV9sZW4gPiAyNTEpIHsKKwkJV01BX0xPR0UoIiVzIDogaW52YWxpZCBwMnAgaWUgbGVuZ3RoICV1IiwgX19mdW5jX18sIGllX2xlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWllX2xlbl9hbGlnbmVkID0gcm91bmR1cChpZV9sZW4sIHNpemVvZihBX1VJTlQzMikpOworCisJd21pX2J1Zl9sZW4gPQorCQlzaXplb2Yod21pX3AycF9nb19zZXRfYmVhY29uX2llX2ZpeGVkX3BhcmFtKSArIGllX2xlbl9hbGlnbmVkICsKKwkJV01JX1RMVl9IRFJfU0laRTsKKworCXdtaV9idWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIHdtaV9idWZfbGVuKTsKKwlpZiAoIXdtaV9idWYpIHsKKwkJV01BX0xPR0UoIiVzIDogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEod21pX2J1Zik7CisKKwljbWQgPSAod21pX3AycF9nb19zZXRfYmVhY29uX2llX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3AycF9nb19zZXRfYmVhY29uX2llX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9wMnBfZ29fc2V0X2JlYWNvbl9pZV9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJY21kLT5pZV9idWZfbGVuID0gaWVfbGVuOworCisJYnVmX3B0ciArPSBzaXplb2Yod21pX3AycF9nb19zZXRfYmVhY29uX2llX2ZpeGVkX3BhcmFtKTsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIGllX2xlbl9hbGlnbmVkKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJY2RmX21lbV9jb3B5KGJ1Zl9wdHIsIHAycEllLCBpZV9sZW4pOworCisJV01BX0xPR0koIiVzOiBTZW5kaW5nIFdNSV9QMlBfR09fU0VUX0JFQUNPTl9JRSIsIF9fZnVuY19fKTsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJICAgd21pX2J1Ziwgd21pX2J1Zl9sZW4sCisJCQkJICAgV01JX1AyUF9HT19TRVRfQkVBQ09OX0lFKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCBiY24gdG1wbDogJWQiLCByZXQpOworCQl3bWlfYnVmX2ZyZWUod21pX2J1Zik7CisJfQorCisJV01BX0xPR0koIiVzOiBTdWNjZXNzZnVsbHkgc2VudCBXTUlfUDJQX0dPX1NFVF9CRUFDT05fSUUiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfc2VuZF9wcm9iZV9yc3BfdG1wbCgpIC0gc2VuZCBwcm9iZSByZXNwIHRlbXBsYXRlCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcHJvYmVfcnNwX2luZm86IHByb2JlIHJlc3BvbnNlIGluZm8KKyAqCisgKiBUaGlzIGZ1bmNpdG9uIHNlbmRzIHByb2JlIHJlc3BvbnNlIHRlbXBsYXRlIHRvIGZ3IHdoaWNoCisgKiBmaXJtd2FyZSB3aWxsIHVzZSBpbiBjYXNlIG9mIHByb2JlIHJlc3BvbnNlIG9mZmxvYWQuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3NlbmRfcHJvYmVfcnNwX3RtcGwodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJICAgIHRwU2VuZFByb2JlUmVzcFBhcmFtcyBwcm9iZV9yc3BfaW5mbykKK3sKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXY7CisJdWludDhfdCB2ZGV2X2lkOworCXRwQW5pUHJvYmVSc3BTdHJ1Y3QgcHJvYmVfcnNwOworCisJaWYgKCFwcm9iZV9yc3BfaW5mbykgeworCQlXTUFfTE9HRShGTCgicHJvYmVfcnNwX2luZm8gaXMgTlVMTCIpKTsKKwkJcmV0dXJuOworCX0KKworCXByb2JlX3JzcCA9ICh0cEFuaVByb2JlUnNwU3RydWN0KSAocHJvYmVfcnNwX2luZm8tPnBQcm9iZVJlc3BUZW1wbGF0ZSk7CisJaWYgKCFwcm9iZV9yc3ApIHsKKwkJV01BX0xPR0UoRkwoInByb2JlX3JzcCBpcyBOVUxMIikpOworCQlyZXR1cm47CisJfQorCisJdmRldiA9IHdtYV9maW5kX3ZkZXZfYnlfYWRkcih3bWEsIHByb2JlX3JzcC0+bWFjSGRyLnNhLCAmdmRldl9pZCk7CisJaWYgKCF2ZGV2KSB7CisJCVdNQV9MT0dFKEZMKCJmYWlsZWQgdG8gZ2V0IHZkZXYgaGFuZGxlIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod21hLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJICAgV01JX1NFUlZJQ0VfQkVBQ09OX09GRkxPQUQpKSB7CisJCVdNQV9MT0dJKCJCZWFjb24gT2ZmbG9hZCBFbmFibGVkIFNlbmRpbmcgVW5pZmllZCBjb21tYW5kIik7CisJCWlmICh3bWlfdW5pZmllZF9wcm9iZV9yc3BfdG1wbF9zZW5kKHdtYSwgdmRldl9pZCwKKwkJCQkJCSAgICBwcm9iZV9yc3BfaW5mbykgPCAwKSB7CisJCQlXTUFfTE9HRShGTCgid21pX3VuaWZpZWRfcHJvYmVfcnNwX3RtcGxfc2VuZCBGYWlsZWQgIikpOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisvKioKKyAqIHdtYV9zZW5kX2JlYWNvbigpIC0gc2VuZCBiZWFjb24gdGVtcGxhdGUKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBiY25faW5mbzogYmVhY29uIGluZm8KKyAqCisgKiBUaGlzIGZ1bmNpdG9uIHN0b3JlIGJlYWNvbiB0ZW1wbGF0ZSBsb2NhbGx5IGFuZAorICogdXBkYXRlIGtlZXAgYWxpdmUgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9zZW5kX2JlYWNvbih0cF93bWFfaGFuZGxlIHdtYSwgdHBTZW5kYmVhY29uUGFyYW1zIGJjbl9pbmZvKQoreworCW9sX3R4cnhfdmRldl9oYW5kbGUgdmRldjsKKwl1aW50OF90IHZkZXZfaWQ7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDhfdCAqcDJwX2llOworCXRwQW5pQmVhY29uU3RydWN0IGJlYWNvbjsKKworCWJlYWNvbiA9ICh0cEFuaUJlYWNvblN0cnVjdCkgKGJjbl9pbmZvLT5iZWFjb24pOworCXZkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2FkZHIod21hLCBiZWFjb24tPm1hY0hkci5zYSwgJnZkZXZfaWQpOworCWlmICghdmRldikgeworCQlXTUFfTE9HRSgiJXMgOiBmYWlsZWQgdG8gZ2V0IHZkZXYgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKFdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod21hLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJICAgV01JX1NFUlZJQ0VfQkVBQ09OX09GRkxPQUQpKSB7CisJCVdNQV9MT0dJKCJCZWFjb24gT2ZmbG9hZCBFbmFibGVkIFNlbmRpbmcgVW5pZmllZCBjb21tYW5kIik7CisJCWlmICh3bWlfdW5pZmllZF9iY25fdG1wbF9zZW5kKHdtYSwgdmRldl9pZCwgYmNuX2luZm8sIDQpIDwgMCkgeworCQkJV01BX0xPR0UoIiVzIDogd21pX3VuaWZpZWRfYmNuX3RtcGxfc2VuZCBGYWlsZWQgIiwKKwkJCQkgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGJjbl9pbmZvLT5wMnBJZU9mZnNldCkgeworCQkJcDJwX2llID0gYmNuX2luZm8tPmJlYWNvbiArIGJjbl9pbmZvLT5wMnBJZU9mZnNldDsKKwkJCVdNQV9MT0dJCisJCQkJKCIgJXM6IHAycEllIGlzIHByZXNlbnQgLSB2ZGV2X2lkICVodSwgcDJwX2llID0gJXAsIHAycCBpZSBsZW4gPSAlaHUiLAorCQkJCV9fZnVuY19fLCB2ZGV2X2lkLCBwMnBfaWUsIHAycF9pZVsxXSk7CisJCQlpZiAod21hX3AycF9nb19zZXRfYmVhY29uX2llKHdtYSwgdmRldl9pZCwgcDJwX2llKSA8IDApIHsKKwkJCQlXTUFfTE9HRQorCQkJCQkoIiVzIDogd21pX3VuaWZpZWRfYmNuX3RtcGxfc2VuZCBGYWlsZWQgIiwKKwkJCQkJX19mdW5jX18pOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKwlzdGF0dXMgPSB3bWFfc3RvcmVfYmNuX3RtcGwod21hLCB2ZGV2X2lkLCBiY25faW5mbyk7CisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIiVzIDogd21hX3N0b3JlX2Jjbl90bXBsIEZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS52ZGV2X3VwKSB7CisJCWlmICh3bWlfdW5pZmllZF92ZGV2X3VwX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLCAwLAorCQkJCQkgICAgIGJjbl9pbmZvLT5ic3NJZCkgPCAwKSB7CisJCQlXTUFfTE9HRSgiJXMgOiBmYWlsZWQgdG8gc2VuZCB2ZGV2IHVwIiwgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisJCXdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS52ZGV2X3VwID0gdHJ1ZTsKKwkJd21hX3NldF9zYXBfa2VlcGFsaXZlKHdtYSwgdmRldl9pZCk7CisJfQorfQorCisvKioKKyAqIHdtYV9zZXRfa2VlcGFsaXZlX3JlcSgpIC0gc2VuZCBrZWVwIGFsaXZlIHJlcXVlc3QgdG8gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBrZWVwYWxpdmU6IGtlZXAgYWxpdmUgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9zZXRfa2VlcGFsaXZlX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCSAgIHRTaXJLZWVwQWxpdmVSZXEgKmtlZXBhbGl2ZSkKK3sKKwlXTUFfTE9HRCgiS0VFUEFMSVZFOlBhY2tldFR5cGU6JWQiLCBrZWVwYWxpdmUtPnBhY2tldFR5cGUpOworCXdtYV9zZXRfc3RhX2tlZXBfYWxpdmUod21hLCBrZWVwYWxpdmUtPnNlc3Npb25JZCwKKwkJCSAgICAgICBrZWVwYWxpdmUtPnBhY2tldFR5cGUsCisJCQkgICAgICAga2VlcGFsaXZlLT50aW1lUGVyaW9kLAorCQkJICAgICAgIGtlZXBhbGl2ZS0+aG9zdElwdjRBZGRyLAorCQkJICAgICAgIGtlZXBhbGl2ZS0+ZGVzdElwdjRBZGRyLCBrZWVwYWxpdmUtPmRlc3RNYWNBZGRyKTsKKworCWNkZl9tZW1fZnJlZShrZWVwYWxpdmUpOworfQorCisvKioKKyAqIHdtYV9iZWFjb25fbWlzc19oYW5kbGVyKCkgLSBiZWFjb24gbWlzcyBldmVudCBoYW5kbGVyCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZCBiZWFjb24gbWlzcyBpbmRpY2F0aW9uIHRvIHVwcGVyIGxheWVycy4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfYmVhY29uX21pc3NfaGFuZGxlcih0cF93bWFfaGFuZGxlIHdtYSwgdWludDMyX3QgdmRldl9pZCkKK3sKKwl0U2lyU21lTWlzc2VkQmVhY29uSW5kICpiZWFjb25fbWlzc19pbmQ7CisKKwliZWFjb25fbWlzc19pbmQgPSAodFNpclNtZU1pc3NlZEJlYWNvbkluZCAqKSBjZGZfbWVtX21hbGxvYworCQkJCSAgKHNpemVvZih0U2lyU21lTWlzc2VkQmVhY29uSW5kKSk7CisKKwlpZiAoTlVMTCA9PSBiZWFjb25fbWlzc19pbmQpIHsKKwkJV01BX0xPR0UoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWJlYWNvbl9taXNzX2luZC0+bWVzc2FnZVR5cGUgPSBXTUFfTUlTU0VEX0JFQUNPTl9JTkQ7CisJYmVhY29uX21pc3NfaW5kLT5sZW5ndGggPSBzaXplb2YodFNpclNtZU1pc3NlZEJlYWNvbkluZCk7CisJYmVhY29uX21pc3NfaW5kLT5ic3NJZHggPSB2ZGV2X2lkOworCisJd21hX3NlbmRfbXNnKHdtYSwgV01BX01JU1NFRF9CRUFDT05fSU5ELCAodm9pZCAqKWJlYWNvbl9taXNzX2luZCwgMCk7Cit9CisKKy8qKgorICogd21hX21nbXRfdHhfY29tcGxldGlvbl9oYW5kbGVyKCkgLSB3bWEgbWdtdCBUeCBjb21wbGV0aW9uIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbXBsX2V2ZW50X3BhcmFtczogY29tcGxldGlvbiBldmVudCBoYW5kbGVyIGRhdGEKKyAqIEBsZW46IGxlbmd0aCBvZiBAY21wbF9ldmVudF9wYXJhbXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCisKK2ludCB3bWFfbWdtdF90eF9jb21wbGV0aW9uX2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpjbXBsX2V2ZW50X3BhcmFtcywKKwkJCQkgICB1aW50MzJfdCBsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpaGFuZGxlOworCVdNSV9NR01UX1RYX0NPTVBMRVRJT05fRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX21nbXRfdHhfY29tcGxfZXZlbnRfZml4ZWRfcGFyYW0JKmNtcGxfcGFyYW1zOworCXN0cnVjdCB3bWlfZGVzY190ICp3bWlfZGVzYzsKKworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCisJcGFyYW1fYnVmID0gKFdNSV9NR01UX1RYX0NPTVBMRVRJT05fRVZFTlRJRF9wYXJhbV90bHZzICopCisJCWNtcGxfZXZlbnRfcGFyYW1zOworCWlmICghcGFyYW1fYnVmICYmICF3bWFfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBtZ210IFR4IGNvbXBsZXRpb24gZXZlbnQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljbXBsX3BhcmFtcyA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisKKwlXTUFfTE9HSSgiJXM6IHN0YXR1czolZCB3bWlfZGVzY19pZDolZCIsIF9fZnVuY19fLCBjbXBsX3BhcmFtcy0+c3RhdHVzLAorCQkgY21wbF9wYXJhbXMtPmRlc2NfaWQpOworCisJd21pX2Rlc2MgPSAoc3RydWN0IHdtaV9kZXNjX3QgKikKKwkJKCZ3bWFfaGFuZGxlLT53bWlfZGVzY19wb29sLmFycmF5W2NtcGxfcGFyYW1zLT5kZXNjX2lkXSk7CisKKwlpZiAoIXdtaV9kZXNjKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCB3bWkgZGVzYyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdtaV9kZXNjLT5uYnVmKQorCQljZGZfbmJ1Zl91bm1hcF9zaW5nbGUocGRldi0+b3NkZXYsIHdtaV9kZXNjLT5uYnVmLAorCQkJCSAgICAgIENERl9ETUFfVE9fREVWSUNFKTsKKwlpZiAod21pX2Rlc2MtPnR4X2NtcGxfY2IpCisJCXdtaV9kZXNjLT50eF9jbXBsX2NiKHdtYV9oYW5kbGUtPm1hY19jb250ZXh0LAorCQkJCSAgICAgICB3bWlfZGVzYy0+bmJ1ZiwgMSk7CisKKwlpZiAod21pX2Rlc2MtPm90YV9wb3N0X3Byb2NfY2IpCisJCXdtaV9kZXNjLT5vdGFfcG9zdF9wcm9jX2NiKCh0cEFuaVNpckdsb2JhbCkKKwkJCQkJICAgICB3bWFfaGFuZGxlLT5tYWNfY29udGV4dCwKKwkJCQkJICAgICBjbXBsX3BhcmFtcy0+c3RhdHVzKTsKKworCXdtaV9kZXNjX3B1dCh3bWFfaGFuZGxlLCB3bWlfZGVzYyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc191cGRhdGVfb3Btb2RlKCkgLSBwcm9jZXNzIHVwZGF0ZSBWSFQgb3Btb2RlIGNtZCBmcm9tIFVNQUMKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdXBkYXRlX3ZodF9vcG1vZGU6IHZodCBvcG1vZGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfcHJvY2Vzc191cGRhdGVfb3Btb2RlKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCSAgICAgICB0VXBkYXRlVkhUT3BNb2RlICp1cGRhdGVfdmh0X29wbW9kZSkKK3sKKwlXTUFfTE9HRCgiJXM6IG9wTW9kZSA9ICVkIiwgX19mdW5jX18sIHVwZGF0ZV92aHRfb3Btb2RlLT5vcE1vZGUpOworCisJd21hX3NldF9wZWVyX3BhcmFtKHdtYV9oYW5kbGUsIHVwZGF0ZV92aHRfb3Btb2RlLT5wZWVyX21hYywKKwkJCSAgIFdNSV9QRUVSX0NIV0lEVEgsIHVwZGF0ZV92aHRfb3Btb2RlLT5vcE1vZGUsCisJCQkgICB1cGRhdGVfdmh0X29wbW9kZS0+c21lc2Vzc2lvbklkKTsKK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc191cGRhdGVfcnhfbnNzKCkgLSBwcm9jZXNzIHVwZGF0ZSBSWCBOU1MgY21kIGZyb20gVU1BQworICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEB1cGRhdGVfcnhfbnNzOiByeCBuc3MgdmFsdWUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfcHJvY2Vzc191cGRhdGVfcnhfbnNzKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCSAgICAgICB0VXBkYXRlUnhOc3MgKnVwZGF0ZV9yeF9uc3MpCit7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmludHIgPQorCQkmd21hX2hhbmRsZS0+aW50ZXJmYWNlc1t1cGRhdGVfcnhfbnNzLT5zbWVzZXNzaW9uSWRdOworCWludCByeF9uc3MgPSB1cGRhdGVfcnhfbnNzLT5yeE5zczsKKworCXdtYV91cGRhdGVfdHhyeF9jaGFpbm1hc2sod21hX2hhbmRsZS0+bnVtX3JmX2NoYWlucywgJnJ4X25zcyk7CisKKwlpbnRyLT5uc3MgPSAodWludDhfdClyeF9uc3M7CisJdXBkYXRlX3J4X25zcy0+cnhOc3MgPSAodWludDMyX3QpcnhfbnNzOworCisJV01BX0xPR0QoIiVzOiBSeCBOc3MgPSAlZCIsIF9fZnVuY19fLCB1cGRhdGVfcnhfbnNzLT5yeE5zcyk7CisKKwl3bWFfc2V0X3BlZXJfcGFyYW0od21hX2hhbmRsZSwgdXBkYXRlX3J4X25zcy0+cGVlcl9tYWMsCisJCQkgICBXTUlfUEVFUl9OU1MsIHVwZGF0ZV9yeF9uc3MtPnJ4TnNzLAorCQkJICAgdXBkYXRlX3J4X25zcy0+c21lc2Vzc2lvbklkKTsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisvKioKKyAqIHdtYV9wcm9jZXNzX3VwZGF0ZV9tZW1iZXJzaGlwKCkgLSBwcm9jZXNzIHVwZGF0ZSBncm91cCBtZW1iZXJzaGlwIGNtZAorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBtZW1iZXJzaGlwOiBncm91cCBtZW1iZXJzaGlwIGluZm8KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfcHJvY2Vzc191cGRhdGVfbWVtYmVyc2hpcCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICAgdFVwZGF0ZU1lbWJlcnNoaXAgKm1lbWJlcnNoaXApCit7CisJV01BX0xPR0QoIiVzOiBtZW1iZXJzaGlwID0gJXggIiwgX19mdW5jX18sIG1lbWJlcnNoaXAtPm1lbWJlcnNoaXApOworCisJd21hX3NldF9wZWVyX3BhcmFtKHdtYV9oYW5kbGUsIG1lbWJlcnNoaXAtPnBlZXJfbWFjLAorCQkJICAgV01JX1BFRVJfTUVNQkVSU0hJUCwgbWVtYmVyc2hpcC0+bWVtYmVyc2hpcCwKKwkJCSAgIG1lbWJlcnNoaXAtPnNtZXNlc3Npb25JZCk7Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3NfdXBkYXRlX3VzZXJwb3MoKSAtIHByb2Nlc3MgdXBkYXRlIHVzZXIgcG9zIGNtZCBmcm9tIFVNQUMKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdXNlcnBvczogdXNlciBwb3MgdmFsdWUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfcHJvY2Vzc191cGRhdGVfdXNlcnBvcyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJdFVwZGF0ZVVzZXJQb3MgKnVzZXJwb3MpCit7CisJV01BX0xPR0QoIiVzOiB1c2VyUG9zID0gJXggIiwgX19mdW5jX18sIHVzZXJwb3MtPnVzZXJQb3MpOworCisJd21hX3NldF9wZWVyX3BhcmFtKHdtYV9oYW5kbGUsIHVzZXJwb3MtPnBlZXJfbWFjLAorCQkJICAgV01JX1BFRVJfVVNFUlBPUywgdXNlcnBvcy0+dXNlclBvcywKKwkJCSAgIHVzZXJwb3MtPnNtZXNlc3Npb25JZCk7CisKKwkvKiBOb3cgdGhhdCBtZW1iZXJzaGlwL3VzZXJwb3MgaXMgdXBkYXRlZCBpbiBmdywKKwkgKiBlbmFibGUgR0lEIFBQUy4KKwkgKi8KKwl3bWFfc2V0X3Bwc2NvbmZpZyh1c2VycG9zLT5zbWVzZXNzaW9uSWQsIFdNQV9WSFRfUFBTX0dJRF9NQVRDSCwgMSk7CisKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFBQyAqLworCisvKioKKyAqIHdtYV9zZXRfaHRjb25maWcoKSAtIHNldCBodCBjb25maWcgcGFyYW1ldGVycyB0byB0YXJnZXQKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAaHRfY2FwYWI6IGh0IGNhcGFibGl0eQorICogQHZhbHVlOiB2YWx1ZSBvZiBodCBwYXJhbQorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9zZXRfaHRjb25maWcodWludDhfdCB2ZGV2X2lkLCB1aW50MTZfdCBodF9jYXBhYiwgaW50IHZhbHVlKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpbnQgcmV0ID0gLUVJTzsKKworCWlmIChOVUxMID09IHdtYSkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgd21hIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCXN3aXRjaCAoaHRfY2FwYWIpIHsKKwljYXNlIFdOSV9DRkdfSFRfQ0FQX0lORk9fQURWQU5DRV9DT0RJTkc6CisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fTERQQywKKwkJCQkJCSAgICAgIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1RYX1NUQkM6CisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fVFhfU1RCQywKKwkJCQkJCSAgICAgIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1JYX1NUQkM6CisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fUlhfU1RCQywKKwkJCQkJCSAgICAgIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NIT1JUX0dJXzIwTUhaOgorCWNhc2UgV05JX0NGR19IVF9DQVBfSU5GT19TSE9SVF9HSV80ME1IWjoKKwkJV01BX0xPR0UoIiVzOiBodF9jYXBhYiA9ICVkLCB2YWx1ZSA9ICVkIiwgX19mdW5jX18sIGh0X2NhcGFiLAorCQkJIHZhbHVlKTsKKwkJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJCQlXTUlfVkRFVl9QQVJBTV9TR0ksIHZhbHVlKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmNvbmZpZy5zaG9ydGdpID0gdmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdNQV9MT0dFKCIlczpJTlZBTElEIEhUIENPTkZJRyIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gKHJldCkgPyBDREZfU1RBVFVTX0VfRkFJTFVSRSA6IENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfaGlkZGVuX3NzaWRfdmRldl9yZXN0YXJ0KCkgLSB2ZGV2IHJlc3RhcnQgZm9yIGhpZGRlbiBzc2lkCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQHBSZXE6IGhpZGRlbiBzc2lkIHZkZXYgcmVzdGFydCByZXF1ZXN0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX2hpZGRlbl9zc2lkX3ZkZXZfcmVzdGFydCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICB0SGFsSGlkZGVuU3NpZFZkZXZSZXN0YXJ0ICpwUmVxKQoreworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppbnRyID0gd21hX2hhbmRsZS0+aW50ZXJmYWNlczsKKworCWlmICgocFJlcS0+c2Vzc2lvbklkICE9CisJICAgICBpbnRyW3BSZXEtPnNlc3Npb25JZF0udmRldl9yZXN0YXJ0X3BhcmFtcy52ZGV2X2lkKQorCSAgICB8fCAhKChpbnRyW3BSZXEtPnNlc3Npb25JZF0udHlwZSA9PSBXTUlfVkRFVl9UWVBFX0FQKQorCQkgJiYgKGludHJbcFJlcS0+c2Vzc2lvbklkXS5zdWJfdHlwZSA9PSAwKSkpIHsKKwkJV01BX0xPR0UoIiVzIDogaW52YWxpZCBzZXNzaW9uIGlkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaW50cltwUmVxLT5zZXNzaW9uSWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuc3NpZEhpZGRlbiA9IHBSZXEtPnNzaWRIaWRkZW47CisJY2RmX2F0b21pY19zZXQoJmludHJbcFJlcS0+c2Vzc2lvbklkXS52ZGV2X3Jlc3RhcnRfcGFyYW1zLgorCQkgICAgICAgaGlkZGVuX3NzaWRfcmVzdGFydF9pbl9wcm9ncmVzcywgMSk7CisKKwkvKiB2ZGV2IHN0b3AgLT4gdmRldiByZXN0YXJ0IC0+IHZkZXYgdXAgKi8KKwlXTUFfTE9HRCgiJXMsIHZkZXZfaWQ6ICVkLCBwYXVzaW5nIHR4X2xsX3F1ZXVlIGZvciBWREVWX1NUT1AiLAorCQkgX19mdW5jX18sIHBSZXEtPnNlc3Npb25JZCk7CisJb2xfdHhyeF92ZGV2X3BhdXNlKHdtYV9oYW5kbGUtPmludGVyZmFjZXNbcFJlcS0+c2Vzc2lvbklkXS5oYW5kbGUsCisJCQkgICBPTF9UWFFfUEFVU0VfUkVBU09OX1ZERVZfU1RPUCk7CisJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1twUmVxLT5zZXNzaW9uSWRdLnBhdXNlX2JpdG1hcCB8PQorCQkJCQkJCSgxIDw8IFBBVVNFX1RZUEVfSE9TVCk7CisJaWYgKHdtaV91bmlmaWVkX3ZkZXZfc3RvcF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIHBSZXEtPnNlc3Npb25JZCkpIHsKKwkJV01BX0xPR0UoIiVzOiAlZCBGYWlsZWQgdG8gc2VuZCB2ZGV2IHN0b3AiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQljZGZfYXRvbWljX3NldCgmaW50cltwUmVxLT5zZXNzaW9uSWRdLnZkZXZfcmVzdGFydF9wYXJhbXMuCisJCQkgICAgICAgaGlkZGVuX3NzaWRfcmVzdGFydF9pbl9wcm9ncmVzcywgMCk7CisJCXJldHVybjsKKwl9Cit9CisKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKworLyoqCisgKiB3bWFfZXh0cmFjdF9jY21wX3BuKCkgLSBleHRyYWN0IDYgYnl0ZSBQTiBmcm9tIHRoZSBDQ01QIGhlYWRlcgorICogQGNjbXBfcHRyOiBDQ01QIGhlYWRlcgorICoKKyAqIFJldHVybjogUE4gZXh0cmFjdGVkIGZyb20gaGVhZGVyLgorICovCitzdGF0aWMgdWludDY0X3Qgd21hX2V4dHJhY3RfY2NtcF9wbih1aW50OF90ICpjY21wX3B0cikKK3sKKwl1aW50OF90IHJzdmQsIGtleSwgcG5bNl07CisJdWludDY0X3QgbmV3X3BuOworCisJLyoKKwkgKiAgICstLS0tLSstLS0tLSstLS0tLS0rLS0tLS0tLS0tLSstLS0tLSstLS0tLSstLS0tLSstLS0tLSsKKwkgKiAgIHwgUE4wIHwgUE4xIHwgcnN2ZCB8IHJzdmQva2V5IHwgUE4yIHwgUE4zIHwgUE40IHwgUE41IHwKKwkgKiAgICstLS0tLSstLS0tLSstLS0tLS0rLS0tLS0tLS0tLSstLS0tLSstLS0tLSstLS0tLSstLS0tLSsKKwkgKiAgICAgICAgICAgICAgICAgICBDQ01QIEhlYWRlciBGb3JtYXQKKwkgKi8KKworCS8qIEV4dHJhY3QgaW5kaXZpZHVhbCBieXRlcyAqLworCXBuWzBdID0gKHVpbnQ4X3QpICpjY21wX3B0cjsKKwlwblsxXSA9ICh1aW50OF90KSAqKGNjbXBfcHRyICsgMSk7CisJcnN2ZCA9ICh1aW50OF90KSAqKGNjbXBfcHRyICsgMik7CisJa2V5ID0gKHVpbnQ4X3QpICooY2NtcF9wdHIgKyAzKTsKKwlwblsyXSA9ICh1aW50OF90KSAqKGNjbXBfcHRyICsgNCk7CisJcG5bM10gPSAodWludDhfdCkgKihjY21wX3B0ciArIDUpOworCXBuWzRdID0gKHVpbnQ4X3QpICooY2NtcF9wdHIgKyA2KTsKKwlwbls1XSA9ICh1aW50OF90KSAqKGNjbXBfcHRyICsgNyk7CisKKwkvKiBGb3JtIDYgYnl0ZSBQTiB3aXRoIDYgaW5kaXZpZHVhbCBieXRlcyBvZiBQTiAqLworCW5ld19wbiA9ICgodWludDY0X3QpIHBuWzVdIDw8IDQwKSB8CisJCSAoKHVpbnQ2NF90KSBwbls0XSA8PCAzMikgfAorCQkgKCh1aW50NjRfdCkgcG5bM10gPDwgMjQpIHwKKwkJICgodWludDY0X3QpIHBuWzJdIDw8IDE2KSB8CisJCSAoKHVpbnQ2NF90KSBwblsxXSA8PCA4KSB8ICgodWludDY0X3QpIHBuWzBdIDw8IDApOworCisJV01BX0xPR0UoIlBOIG9mIHJlY2VpdmVkIHBhY2tldCBpcyAlbGx1IiwgbmV3X3BuKTsKKwlyZXR1cm4gbmV3X3BuOworfQorCisvKioKKyAqIHdtYV9pc19jY21wX3BuX3JlcGxheV9hdHRhY2soKSAtIGRldGVjdCByZXBsYXkgYXR0YWNraW5nIHVzaW5nIFBOIGluIENDTVAKKyAqIEBjZHNfY3R4OiBjZHMgY29udGV4dAorICogQHdoOiA4MDIuMTEgZnJhbWUgaGVhZGVyCisgKiBAY2NtcF9wdHI6IENDTVAgZnJhbWUgaGVhZGVyCisgKgorICogUmV0dXJuOiB0cnVlL2ZhbHNlCisgKi8KK3N0YXRpYyBib29sCit3bWFfaXNfY2NtcF9wbl9yZXBsYXlfYXR0YWNrKHZvaWQgKmNkc19jdHgsIHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoLAorCQkJIHVpbnQ4X3QgKmNjbXBfcHRyKQoreworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldjsKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXY7CisJb2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyOworCXVpbnQ4X3QgdmRldl9pZCwgcGVlcl9pZDsKKwl1aW50OF90ICpsYXN0X3BuX3ZhbGlkOworCXVpbnQ2NF90ICpsYXN0X3BuLCBuZXdfcG47CisJdWludDMyX3QgKnJtZl9wbl9yZXBsYXlzOworCisJcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCWlmICghcGRldikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHBkZXYiLCBfX2Z1bmNfXyk7CisJCXJldHVybiB0cnVlOworCX0KKworCXZkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2FkZHIoY2RzX2N0eCwgd2gtPmlfYWRkcjIsICZ2ZGV2X2lkKTsKKwlpZiAoIXZkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCB2ZGV2IiwgX19mdW5jX18pOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBSZXRyaWV2ZSB0aGUgcGVlciBiYXNlZCBvbiB2ZGV2IGFuZCBhZGRyICovCisJcGVlciA9IG9sX3R4cnhfZmluZF9wZWVyX2J5X2FkZHJfYW5kX3ZkZXYocGRldiwgdmRldiwgd2gtPmlfYWRkcjIsCisJCQkJCQkgICZwZWVyX2lkKTsKKworCWlmIChOVUxMID09IHBlZXIpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBwZWVyLCBOb3QgYWJsZSB0byB2YWxpZGF0ZSBQTiIsCisJCQkgICAgX19mdW5jX18pOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwluZXdfcG4gPSB3bWFfZXh0cmFjdF9jY21wX3BuKGNjbXBfcHRyKTsKKwlsYXN0X3BuX3ZhbGlkID0gJnBlZXItPmxhc3Rfcm1mX3BuX3ZhbGlkOworCWxhc3RfcG4gPSAmcGVlci0+bGFzdF9ybWZfcG47CisJcm1mX3BuX3JlcGxheXMgPSAmcGVlci0+cm1mX3BuX3JlcGxheXM7CisKKwlpZiAoKmxhc3RfcG5fdmFsaWQpIHsKKwkJaWYgKG5ld19wbiA+ICpsYXN0X3BuKSB7CisJCQkqbGFzdF9wbiA9IG5ld19wbjsKKwkJCVdNQV9MT0dFKCIlczogUE4gdmFsaWRhdGlvbiBzdWNjZXNzZnVsIiwgX19mdW5jX18pOworCQl9IGVsc2UgeworCQkJV01BX0xPR0UoIiVzOiBQTiBSZXBsYXkgYXR0YWNrIGRldGVjdGVkIiwgX19mdW5jX18pOworCQkJLyogcGVyIDExVyBhbWVuZG1lbnQsIGtlZXBpbmcgdHJhY2sgb2YgcmVwbGF5IGF0dGFja3MgKi8KKwkJCSpybWZfcG5fcmVwbGF5cyArPSAxOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9IGVsc2UgeworCQkqbGFzdF9wbl92YWxpZCA9IDE7CisJCSpsYXN0X3BuID0gbmV3X3BuOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc19ybWZfZnJhbWUoKSAtIHByb2Nlc3Mgcm1mIGZyYW1lCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQGlmYWNlOiB0eHJ4IG5vZGUKKyAqIEB3aDogODAyMTEgZnJhbWUKKyAqIEByeF9wa3Q6IHJ4IHBhY2tldAorICogQHdidWY6IEJ1ZmZlcgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK3N0YXRpYworaW50IHdtYV9wcm9jZXNzX3JtZl9mcmFtZSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlLAorCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoLAorCWNkc19wa3RfdCAqcnhfcGt0LAorCWNkZl9uYnVmX3Qgd2J1ZikKK3sKKwl1aW50OF90ICplZnJtLCAqb3JpZ19oZHI7CisJdWludDE2X3Qga2V5X2lkOworCXVpbnQ4X3QgKmNjbXA7CisKKwlpZiAoKHdoKS0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfV0VQKSB7CisJCWlmIChJRUVFODAyMTFfSVNfQlJPQURDQVNUKHdoLT5pX2FkZHIxKSB8fAorCQkgICAgSUVFRTgwMjExX0lTX01VTFRJQ0FTVCh3aC0+aV9hZGRyMSkpIHsKKwkJCVdNQV9MT0dFKCJFbmNyeXB0ZWQgQkMvTUMgZnJhbWUgZHJvcHBpbmcgdGhlIGZyYW1lIik7CisJCQljZHNfcGt0X3JldHVybl9wYWNrZXQocnhfcGt0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJb3JpZ19oZHIgPSAodWludDhfdCAqKSBjZGZfbmJ1Zl9kYXRhKHdidWYpOworCQkvKiBQb2ludGVyIHRvIGhlYWQgb2YgQ0NNUCBoZWFkZXIgKi8KKwkJY2NtcCA9IG9yaWdfaGRyICsgc2l6ZW9mKCp3aCk7CisJCWlmICh3bWFfaXNfY2NtcF9wbl9yZXBsYXlfYXR0YWNrKAorCQkJd21hX2hhbmRsZSwgd2gsIGNjbXApKSB7CisJCQlXTUFfTE9HRSgiRHJvcHBpbmcgdGhlIGZyYW1lIik7CisJCQljZHNfcGt0X3JldHVybl9wYWNrZXQocnhfcGt0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogU3RyaXAgcHJpdmFjeSBoZWFkZXJzIChhbmQgdHJhaWxlcikKKwkJICogZm9yIGEgcmVjZWl2ZWQgZnJhbWUKKwkJICovCisJCWNkZl9tZW1fbW92ZShvcmlnX2hkciArCisJCQlJRUVFODAyMTFfQ0NNUF9IRUFERVJMRU4sIHdoLAorCQkJc2l6ZW9mKCp3aCkpOworCQljZGZfbmJ1Zl9wdWxsX2hlYWQod2J1ZiwKKwkJCUlFRUU4MDIxMV9DQ01QX0hFQURFUkxFTik7CisJCQljZGZfbmJ1Zl90cmltX3RhaWwod2J1ZiwgSUVFRTgwMjExX0NDTVBfTUlDTEVOKTsKKworCQlyeF9wa3QtPnBrdF9tZXRhLm1wZHVfaGRyX3B0ciA9CisJCQkJY2RmX25idWZfZGF0YSh3YnVmKTsKKwkJcnhfcGt0LT5wa3RfbWV0YS5tcGR1X2xlbiA9IGNkZl9uYnVmX2xlbih3YnVmKTsKKwkJcnhfcGt0LT5wa3RfbWV0YS5tcGR1X2RhdGFfbGVuID0KKwkJcnhfcGt0LT5wa3RfbWV0YS5tcGR1X2xlbiAtCisJCXJ4X3BrdC0+cGt0X21ldGEubXBkdV9oZHJfbGVuOworCQlyeF9wa3QtPnBrdF9tZXRhLm1wZHVfZGF0YV9wdHIgPQorCQlyeF9wa3QtPnBrdF9tZXRhLm1wZHVfaGRyX3B0ciArCisJCXJ4X3BrdC0+cGt0X21ldGEubXBkdV9oZHJfbGVuOworCQlyeF9wa3QtPnBrdF9tZXRhLnRzZl9kZWx0YSA9IHJ4X3BrdC0+cGt0X21ldGEudHNmX2RlbHRhOworCQlyeF9wa3QtPnBrdF9idWYgPSB3YnVmOworCQlXTUFfTE9HRChGTCgiQlNTSUQ6ICJNQUNfQUREUkVTU19TVFIiIHRzZl9kZWx0YTogJXUiKSwKKwkJICAgIE1BQ19BRERSX0FSUkFZKHdoLT5pX2FkZHIzKSwgcnhfcGt0LT5wa3RfbWV0YS50c2ZfZGVsdGEpOworCX0gZWxzZSB7CisJCWlmIChJRUVFODAyMTFfSVNfQlJPQURDQVNUKHdoLT5pX2FkZHIxKSB8fAorCQkgICAgSUVFRTgwMjExX0lTX01VTFRJQ0FTVCh3aC0+aV9hZGRyMSkpIHsKKwkJCWVmcm0gPSBjZGZfbmJ1Zl9kYXRhKHdidWYpICsKKwkJCQkJY2RmX25idWZfbGVuKHdidWYpOworCisJCQlrZXlfaWQgPSAodWludDE2X3QpKihlZnJtIC0gY2RzX2dldF9tbWllX3NpemUoKSArIDIpOworCQkJaWYgKCEoKGtleV9pZCA9PSBXTUFfSUdUS19LRVlfSU5ERVhfNCkKKwkJCSAgICAgfHwgKGtleV9pZCA9PSBXTUFfSUdUS19LRVlfSU5ERVhfNSkpKSB7CisJCQkJV01BX0xPR0UoIkludmFsaWQgS2V5SUQoJWQpIGRyb3BwaW5nIHRoZSBmcmFtZSIsIGtleV9pZCk7CisJCQkJY2RzX3BrdF9yZXR1cm5fcGFja2V0KHJ4X3BrdCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmIChjZHNfaXNfbW1pZV92YWxpZChpZmFjZS0+a2V5LmtleSwKKwkJCQlpZmFjZS0+a2V5LmtleV9pZFtrZXlfaWQgLSBXTUFfSUdUS19LRVlfSU5ERVhfNF0uaXBuLAorCQkJCSh1aW50OF90ICopIHdoLCBlZnJtKSkgeworCQkJCVdNQV9MT0dFKCJQcm90ZWN0ZWQgQkMvTUMgZnJhbWUgTU1JRSB2YWxpZGF0aW9uIHN1Y2Nlc3NmdWwiKTsKKwkJCQkvKiBSZW1vdmUgTU1JRSAqLworCQkJCWNkZl9uYnVmX3RyaW1fdGFpbCh3YnVmLAorCQkJCQljZHNfZ2V0X21taWVfc2l6ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJV01BX0xPR0UoIkJDL01DIE1JQyBlcnJvciBvciBNTUlFIG5vdCBwcmVzZW50LCBkcm9wcGluZyB0aGUgZnJhbWUiKTsKKwkJCQljZHNfcGt0X3JldHVybl9wYWNrZXQocnhfcGt0KTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVdNQV9MT0dFKCJSeCB1bnByb3RlY3RlZCB1bmljYXN0IG1nbXQgZnJhbWUiKTsKKwkJCXJ4X3BrdC0+cGt0X21ldGEuZHB1RmVlZGJhY2sgPQorCQkJCURQVV9GRUVEQkFDS19VTlBST1RFQ1RFRF9FUlJPUjsKKwkJfQorCX0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKioKKyAqIHdtYV9tZ210X3J4X3Byb2Nlc3MoKSAtIHByb2Nlc3MgbWFuYWdlbWVudCByeCBmcmFtZS4KKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBkYXRhOiByeCBkYXRhCisgKiBAZGF0YV9sZW46IGRhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCB3bWFfbWdtdF9yeF9wcm9jZXNzKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZGF0YSwKKwkJCQkgIHVpbnQzMl90IGRhdGFfbGVuKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX01HTVRfUlhfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV90bHZzID0gTlVMTDsKKwl3bWlfbWdtdF9yeF9oZHIgKmhkciA9IE5VTEw7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlID0gTlVMTDsKKwl1aW50OF90IHZkZXZfaWQ7CisJY2RzX3BrdF90ICpyeF9wa3Q7CisJY2RmX25idWZfdCB3YnVmOworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKndoOworCXVpbnQ4X3QgbWd0X3R5cGUsIG1ndF9zdWJ0eXBlOworCWludCBzdGF0dXM7CisKKwlpZiAoIXdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IFdNQSAgY29udGV4dCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFyYW1fdGx2cyA9IChXTUlfTUdNVF9SWF9FVkVOVElEX3BhcmFtX3RsdnMgKikgZGF0YTsKKwlpZiAoIXBhcmFtX3RsdnMpIHsKKwkJV01BX0xPR0UoIkdldCBOVUxMIHBvaW50IG1lc3NhZ2UgZnJvbSBGVyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZHIgPSBwYXJhbV90bHZzLT5oZHI7CisJaWYgKCFoZHIpIHsKKwkJV01BX0xPR0UoIlJ4IGV2ZW50IGlzIE5VTEwiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGhkci0+YnVmX2xlbiA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lKSkgeworCQlXTUFfTE9HRSgiSW52YWxpZCByeCBtZ210IHBhY2tldCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyeF9wa3QgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnJ4X3BrdCkpOworCWlmICghcnhfcGt0KSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgcnggcGFja2V0Iik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNkZl9tZW1femVybyhyeF9wa3QsIHNpemVvZigqcnhfcGt0KSk7CisKKwkvKgorCSAqIEZpbGwgaW4gbWV0YSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgcGUvbGltCisJICogVE9ETzogVHJ5IHRvIG1haW50YWluIHJ4IG1ldGFpbmZvIGFzIHBhcnQgb2Ygc2tiLT5kYXRhLgorCSAqLworCXJ4X3BrdC0+cGt0X21ldGEuY2hhbm5lbCA9IGhkci0+Y2hhbm5lbDsKKwlyeF9wa3QtPnBrdF9tZXRhLnNjYW5fc3JjID0gaGRyLT5mbGFnczsKKwkvKkdldCB0aGUgYWJzb2x1dGUgcnNzaSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJzc2kgdmFsdWUKKwkgKnRoZSBzaW5yIHZhbHVlIGlzIGhhcmRjb2RlZCBpbnRvIDAgaW4gdGhlIGNvcmUgc3RhY2sqLworCXJ4X3BrdC0+cGt0X21ldGEucnNzaSA9IGhkci0+c25yICsgV01BX1RHVF9OT0lTRV9GTE9PUl9EQk07CisJcnhfcGt0LT5wa3RfbWV0YS5zbnIgPSBoZHItPnNucjsKKwkvKgorCSAqIEZJWE1FOiBBc3NpZ25pbmcgdGhlIGxvY2FsIHRpbWVzdGFtcCBhcyBodyB0aW1lc3RhbXAgaXMgbm90CisJICogYXZhaWxhYmxlLiBOZWVkIHRvIHNlZSBpZiBwZS9saW0gcmVhbGx5IHVzZXMgdGhpcyBkYXRhLgorCSAqLworCXJ4X3BrdC0+cGt0X21ldGEudGltZXN0YW1wID0gKHVpbnQzMl90KSBqaWZmaWVzOworCXJ4X3BrdC0+cGt0X21ldGEubXBkdV9oZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUpOworCXJ4X3BrdC0+cGt0X21ldGEubXBkdV9sZW4gPSBoZHItPmJ1Zl9sZW47CisJcnhfcGt0LT5wa3RfbWV0YS5tcGR1X2RhdGFfbGVuID0gaGRyLT5idWZfbGVuIC0KKwkJCQkJIHJ4X3BrdC0+cGt0X21ldGEubXBkdV9oZHJfbGVuOworCisJcnhfcGt0LT5wa3RfbWV0YS5yb2FtQ2FuZGlkYXRlSW5kID0gMDsKKworCS8qIFdoeSBub3QganVzdCB1c2UgcnhfZXZlbnQtPmhkci5idWZfbGVuPyAqLworCXdidWYgPSBjZGZfbmJ1Zl9hbGxvYyhOVUxMLCByb3VuZHVwKGhkci0+YnVmX2xlbiwgNCksIDAsIDQsIGZhbHNlKTsKKwlpZiAoIXdidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgd2J1ZiBmb3IgbWdtdCByeCBsZW4oJXUpIiwKKwkJCSAgICBfX2Z1bmNfXywgaGRyLT5idWZfbGVuKTsKKwkJY2RmX21lbV9mcmVlKHJ4X3BrdCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNkZl9uYnVmX3B1dF90YWlsKHdidWYsIGhkci0+YnVmX2xlbik7CisJY2RmX25idWZfc2V0X3Byb3RvY29sKHdidWYsIEVUSF9QX0NPTlRST0wpOworCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKiljZGZfbmJ1Zl9kYXRhKHdidWYpOworCisJcnhfcGt0LT5wa3RfbWV0YS5tcGR1X2hkcl9wdHIgPSBjZGZfbmJ1Zl9kYXRhKHdidWYpOworCXJ4X3BrdC0+cGt0X21ldGEubXBkdV9kYXRhX3B0ciA9IHJ4X3BrdC0+cGt0X21ldGEubXBkdV9oZHJfcHRyICsKKwkJCQkJIHJ4X3BrdC0+cGt0X21ldGEubXBkdV9oZHJfbGVuOworCXJ4X3BrdC0+cGt0X21ldGEudHNmX2RlbHRhID0gaGRyLT50c2ZfZGVsdGE7CisJcnhfcGt0LT5wa3RfYnVmID0gd2J1ZjsKKworCVdNQV9MT0dEKEZMKCJCU1NJRDogIk1BQ19BRERSRVNTX1NUUiIgdHNmX2RlbHRhOiAldSIpLAorCQkgTUFDX0FERFJfQVJSQVkod2gtPmlfYWRkcjMpLCBoZHItPnRzZl9kZWx0YSk7CisKKyNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKKwl7CisJCS8qCisJCSAqIGZvciBiaWcgZW5kaWFuIGhvc3QsIGNvcHkgZW5naW5lIGJ5dGVfc3dhcCBpcyBlbmFibGVkCisJCSAqIEJ1dCB0aGUgcnggbWdtdCBmcmFtZSBidWZmZXIgY29udGVudCBpcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKwkJICogTmVlZCB0byBieXRlIHN3YXAgdGhlIG1nbXQgZnJhbWUgYnVmZmVyIGNvbnRlbnQgLSBzbyB3aGVuCisJCSAqIGNvcHkgZW5naW5lIGRvZXMgYnl0ZV9zd2FwIC0gaG9zdCBnZXRzIGJ1ZmZlciBjb250ZW50IGluIHRoZQorCQkgKiBjb3JyZWN0IGJ5dGUgb3JkZXIuCisJCSAqLworCQlpbnQgaTsKKwkJdWludDMyX3QgKmRlc3RwLCAqc3JjcDsKKwkJZGVzdHAgPSAodWludDMyX3QgKikgd2g7CisJCXNyY3AgPSAodWludDMyX3QgKikgcGFyYW1fdGx2cy0+YnVmcDsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgKHJvdW5kdXAoaGRyLT5idWZfbGVuLCBzaXplb2YodWludDMyX3QpKSAvIDQpOyBpKyspIHsKKwkJCSpkZXN0cCA9IGNwdV90b19sZTMyKCpzcmNwKTsKKwkJCWRlc3RwKys7CisJCQlzcmNwKys7CisJCX0KKwl9CisjZWxzZQorCWNkZl9tZW1fY29weSh3aCwgcGFyYW1fdGx2cy0+YnVmcCwgaGRyLT5idWZfbGVuKTsKKyNlbmRpZgorCisJaWYgKCF3bWFfaGFuZGxlLT5tZ210X3J4KSB7CisJCVdNQV9MT0dFKCJOb3QgcmVnaXN0ZXJlZCBmb3IgTWdtdCByeCwgZHJvcHBpbmcgdGhlIGZyYW1lIik7CisJCWNkc19wa3RfcmV0dXJuX3BhY2tldChyeF9wa3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiBpdCBpcyBhIGJlYWNvbi9wcm9iZSByZXNwb25zZSwgc2F2ZSBpdCBmb3IgZnV0dXJlIHVzZSAqLworCW1ndF90eXBlID0gKHdoKS0+aV9mY1swXSAmIElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLOworCW1ndF9zdWJ0eXBlID0gKHdoKS0+aV9mY1swXSAmIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLOworCisJaWZhY2UgPSB3bWFfZmluZF92ZGV2X2J5X2FkZHIod21hX2hhbmRsZSwgd2gtPmlfYWRkcjMsICZ2ZGV2X2lkKTsKKwlyeF9wa3QtPnBrdF9tZXRhLnNlc3Npb25JZCA9IHZkZXZfaWQ7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJaWYgKG1ndF90eXBlID09IElFRUU4MDIxMV9GQzBfVFlQRV9NR1QgJiYKKwkgICAgKG1ndF9zdWJ0eXBlID09IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9ESVNBU1NPQyB8fAorCSAgICAgbWd0X3N1YnR5cGUgPT0gSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RFQVVUSCB8fAorCSAgICAgbWd0X3N1YnR5cGUgPT0gSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FDVElPTikpIHsKKwkJaWYgKGlmYWNlICYmIGlmYWNlLT5ybWZFbmFibGVkKSB7CisJCQlzdGF0dXMgPSB3bWFfcHJvY2Vzc19ybWZfZnJhbWUod21hX2hhbmRsZSwKKwkJCQlpZmFjZSwgd2gsIHJ4X3BrdCwgd2J1Zik7CisJCQlpZiAoc3RhdHVzICE9IDApCisJCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFXICovCisJd21hX2hhbmRsZS0+bWdtdF9yeCh3bWFfaGFuZGxlLCByeF9wa3QpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9kZV9yZWdpc3Rlcl9tZ210X2ZybV9jbGllbnQoKSAtIGRlcmVnaXN0ZXIgbWFuYWdlbWVudCBmcmFtZQorICogQGNkc19jdHg6IGNkcyBjb250ZXh0CisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX2RlX3JlZ2lzdGVyX21nbXRfZnJtX2NsaWVudCh2b2lkICpjZHNfY3R4KQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZTsKKworI2lmZGVmIFFDQV9XSUZJX0ZUTQorCWlmIChjZHNfZ2V0X2NvbnBhcmFtKCkgPT0gQ0RGX0ZUTV9NT0RFKQorCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworI2VuZGlmCisKKwl3bWFfaGFuZGxlID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoIXdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IFdNQSBjb250ZXh0IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKHdtaV91bmlmaWVkX3VucmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkJIFdNSV9NR01UX1JYX0VWRU5USUQpICE9IDApIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBVbnJlZ2lzdGVyIHJ4IG1nbXQgaGFuZGxlciB3aXRoIHdtaSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXdtYV9oYW5kbGUtPm1nbXRfcnggPSBOVUxMOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3JlZ2lzdGVyX21nbXRfZnJtX2NsaWVudCgpIC0gcmVnaXN0ZXIgbWFuYWdlbWVudCBmcmFtZSBjYWxsYmFjaworICogQGNkc19jdHg6IGNkcyBjb250ZXh0CisgKiBAbWdtdF9mcm1fcng6IG1hbmFnZW1lbnQgZnJhbWUKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfcmVnaXN0ZXJfbWdtdF9mcm1fY2xpZW50KAorCXZvaWQgKmNkc19jdHgsIHdtYV9tZ210X2ZyYW1lX3J4X2NhbGxiYWNrIG1nbXRfZnJtX3J4KQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisKKwlpZiAoIXdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IFdNQSBjb250ZXh0IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKHdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJICAgICAgIFdNSV9NR01UX1JYX0VWRU5USUQsCisJCQkJCSAgICAgICB3bWFfbWdtdF9yeF9wcm9jZXNzKSAhPSAwKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgcnggbWdtdCBoYW5kbGVyIHdpdGggd21pIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJd21hX2hhbmRsZS0+bWdtdF9yeCA9IG1nbXRfZnJtX3J4OworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmUvd21hL3NyYy93bWFfb2NiLmMgYi9jb3JlL3dtYS9zcmMvd21hX29jYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDMyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dtYS9zcmMvd21hX29jYi5jCkBAIC0wLDAgKzEsMTExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiBET0M6IHdtYV9vY2IuYworICoKKyAqIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIDgwMi4xMXAgT0NCIGltcGxlbWVudGF0aW9uCisgKi8KKworI2luY2x1ZGUgIndtYV9vY2IuaCIKKyNpbmNsdWRlICJ3bWlfdW5pZmllZF9hcGkuaCIKKyNpbmNsdWRlICJjZHNfdXRpbHMuaCIKKworLyoqCisgKiB3bWFfb2NiX3Jlc3AoKSAtIHNlbmQgdGhlIE9DQiBzZXQgY29uZmlnIHJlc3BvbnNlIHZpYSBjYWxsYmFjaworICogQHdtYV9oYW5kbGU6IHBvaW50ZXIgdG8gdGhlIFdNQSBoYW5kbGUKKyAqIEBzdGF0dXM6IHN0YXR1cyBvZiB0aGUgc2V0IGNvbmZpZyBjb21tYW5kCisgKi8KK2ludCB3bWFfb2NiX3NldF9jb25maWdfcmVzcCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsIHVpbnQ4X3Qgc3RhdHVzKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwlzdHJ1Y3Qgc2lyX29jYl9zZXRfY29uZmlnX3Jlc3BvbnNlICpyZXNwOworCWNkc19tc2dfdCBtc2cgPSB7MH07CisJc3RydWN0IHNpcl9vY2JfY29uZmlnICpyZXEgPSB3bWFfaGFuZGxlLT5vY2JfY29uZmlnX3JlcTsKKwlvbF90eHJ4X3ZkZXZfaGFuZGxlIHZkZXYgPSAocmVxID8KKwkJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tyZXEtPnNlc3Npb25faWRdLmhhbmRsZSA6IE5VTEwpOworCisJLyoKKwkgKiBJZiB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bCwgc2F2ZSB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBpbiB0aGUKKwkgKiB2ZGV2LgorCSAqLworCWlmIChzdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTICYmIHZkZXYgJiYgcmVxKSB7CisJCWlmICh2ZGV2LT5vY2JfY2hhbm5lbF9pbmZvKQorCQkJY2RmX21lbV9mcmVlKHZkZXYtPm9jYl9jaGFubmVsX2luZm8pOworCQl2ZGV2LT5vY2JfY2hhbm5lbF9jb3VudCA9CisJCQlyZXEtPmNoYW5uZWxfY291bnQ7CisJCWlmIChyZXEtPmNoYW5uZWxfY291bnQpIHsKKwkJCWludCBpOworCQkJaW50IGJ1Zl9zaXplID0gc2l6ZW9mKCp2ZGV2LT5vY2JfY2hhbm5lbF9pbmZvKSAqCisJCQkgICAgcmVxLT5jaGFubmVsX2NvdW50OworCQkJdmRldi0+b2NiX2NoYW5uZWxfaW5mbyA9CisJCQkJY2RmX21lbV9tYWxsb2MoYnVmX3NpemUpOworCQkJY2RmX21lbV96ZXJvKHZkZXYtPm9jYl9jaGFubmVsX2luZm8sIGJ1Zl9zaXplKTsKKwkJCWZvciAoaSA9IDA7IGkgPCByZXEtPmNoYW5uZWxfY291bnQ7IGkrKykgeworCQkJCXZkZXYtPm9jYl9jaGFubmVsX2luZm9baV0uY2hhbl9mcmVxID0KKwkJCQkJcmVxLT5jaGFubmVsc1tpXS5jaGFuX2ZyZXE7CisJCQkJaWYgKHJlcS0+Y2hhbm5lbHNbaV0uZmxhZ3MgJgorCQkJCQlPQ0JfQ0hBTk5FTF9GTEFHX0RJU0FCTEVfUlhfU1RBVFNfSERSKQorCQkJCQl2ZGV2LT5vY2JfY2hhbm5lbF9pbmZvW2ldLgorCQkJCQlkaXNhYmxlX3J4X3N0YXRzX2hkciA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2ZGV2LT5vY2JfY2hhbm5lbF9pbmZvID0gMDsKKwkJfQorCX0KKworCS8qIEZyZWUgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgc2F2ZWQgaW4gd21hX29jYl9zZXRfY29uZmlnLiAqLworCWNkZl9tZW1fZnJlZSh3bWFfaGFuZGxlLT5vY2JfY29uZmlnX3JlcSk7CisJd21hX2hhbmRsZS0+b2NiX2NvbmZpZ19yZXEgPSBOVUxMOworCisJcmVzcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcmVzcCkpOworCWlmICghcmVzcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXNwLT5zdGF0dXMgPSBzdGF0dXM7CisKKwltc2cudHlwZSA9IGVXTklfU01FX09DQl9TRVRfQ09ORklHX1JTUDsKKwltc2cuYm9keXB0ciA9IHJlc3A7CisKKwljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1NNRSwgJm1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJV01BX0xPR0UoRkwoIkZhaWwgdG8gcG9zdCBtc2cgdG8gU01FIikpOworCQljZGZfbWVtX2ZyZWUocmVzcCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNvcHlfc2lyX29jYl9jb25maWcoKSAtIGRlZXAgY29weSBvZiBhbiBPQ0IgY29uZmlnIHN0cnVjdAorICogQHNyYzogcG9pbnRlciB0byB0aGUgc291cmNlIHN0cnVjdAorICoKKyAqIFJldHVybjogcG9pbnRlciB0byB0aGUgY29waWVkIHN0cnVjdAorICovCitzdGF0aWMgc3RydWN0IHNpcl9vY2JfY29uZmlnICpjb3B5X3Npcl9vY2JfY29uZmlnKHN0cnVjdCBzaXJfb2NiX2NvbmZpZyAqc3JjKQoreworCXN0cnVjdCBzaXJfb2NiX2NvbmZpZyAqZHN0OworCXVpbnQzMl90IGxlbmd0aDsKKwl2b2lkICpjdXJzb3I7CisKKwlsZW5ndGggPSBzaXplb2YoKnNyYykgKworCQlzcmMtPmNoYW5uZWxfY291bnQgKiBzaXplb2YoKnNyYy0+Y2hhbm5lbHMpICsKKwkJc3JjLT5zY2hlZHVsZV9zaXplICogc2l6ZW9mKCpzcmMtPnNjaGVkdWxlKSArCisJCXNyYy0+ZGNjX25kbF9jaGFuX2xpc3RfbGVuICsKKwkJc3JjLT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbjsKKworCWRzdCA9IGNkZl9tZW1fbWFsbG9jKGxlbmd0aCk7CisJaWYgKCFkc3QpCisJCXJldHVybiBOVUxMOworCisJKmRzdCA9ICpzcmM7CisKKwljdXJzb3IgPSBkc3Q7CisJY3Vyc29yICs9IHNpemVvZigqZHN0KTsKKwlkc3QtPmNoYW5uZWxzID0gY3Vyc29yOworCWN1cnNvciArPSBzcmMtPmNoYW5uZWxfY291bnQgKiBzaXplb2YoKmRzdC0+Y2hhbm5lbHMpOworCWNkZl9tZW1fY29weShkc3QtPmNoYW5uZWxzLCBzcmMtPmNoYW5uZWxzLAorCQkgICAgIHNyYy0+Y2hhbm5lbF9jb3VudCAqIHNpemVvZigqZHN0LT5jaGFubmVscykpOworCWRzdC0+c2NoZWR1bGUgPSBjdXJzb3I7CisJY3Vyc29yICs9IHNyYy0+c2NoZWR1bGVfc2l6ZSAqIHNpemVvZigqZHN0LT5zY2hlZHVsZSk7CisJY2RmX21lbV9jb3B5KGRzdC0+c2NoZWR1bGUsIHNyYy0+c2NoZWR1bGUsCisJCSAgICAgc3JjLT5zY2hlZHVsZV9zaXplICogc2l6ZW9mKCpkc3QtPnNjaGVkdWxlKSk7CisJZHN0LT5kY2NfbmRsX2NoYW5fbGlzdCA9IGN1cnNvcjsKKwljdXJzb3IgKz0gc3JjLT5kY2NfbmRsX2NoYW5fbGlzdF9sZW47CisJY2RmX21lbV9jb3B5KGRzdC0+ZGNjX25kbF9jaGFuX2xpc3QsIHNyYy0+ZGNjX25kbF9jaGFuX2xpc3QsCisJCSAgICAgc3JjLT5kY2NfbmRsX2NoYW5fbGlzdF9sZW4pOworCWRzdC0+ZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdCA9IGN1cnNvcjsKKwljdXJzb3IgKz0gc3JjLT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbjsKKwljZGZfbWVtX2NvcHkoZHN0LT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0LAorCQkgICAgIHNyYy0+ZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdCwKKwkJICAgICBzcmMtPmRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3RfbGVuKTsKKwlyZXR1cm4gZHN0OworfQorCisvKioKKyAqIHdtYV9vY2Jfc2V0X2NvbmZpZ19yZXEoKSAtIHNlbmQgdGhlIE9DQiBjb25maWcgcmVxdWVzdAorICogQHdtYV9oYW5kbGU6IHBvaW50ZXIgdG8gdGhlIFdNQSBoYW5kbGUKKyAqIEBjb25maWdfcmVxOiB0aGUgY29uZmlndXJhdGlvbiB0byBiZSBzZXQuCisgKi8KK2ludCB3bWFfb2NiX3NldF9jb25maWdfcmVxKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBzaXJfb2NiX2NvbmZpZyAqY29uZmlnX3JlcSkKK3sKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKm1zZzsKKwlzdHJ1Y3Qgd21hX3ZkZXZfc3RhcnRfcmVxIHJlcTsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKworCS8qIGlmIHZkZXYgaXMgbm90IHlldCB1cCwgc2VuZCB2ZGV2IHN0YXJ0IHJlcXVlc3QgYW5kIHdhaXQgZm9yIHJlc3BvbnNlLgorCSAqIE9DQiBzZXRfY29uZmlnIHJlcXVlc3Qgc2hvdWxkIGJlIHNlbnQgb24gcmVjZWl2aW5nCisJICogdmRldiBzdGFydCByZXNwb25zZSBtZXNzYWdlCisJICovCisJaWYgKCF3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW2NvbmZpZ19yZXEtPnNlc3Npb25faWRdLnZkZXZfdXApIHsKKwkJY2RmX21lbV96ZXJvKCZyZXEsIHNpemVvZihyZXEpKTsKKwkJLyogRW5xdWV1ZSBPQ0IgU2V0IFNjaGVkdWxlIHJlcXVlc3QgbWVzc2FnZSAqLworCQltc2cgPSB3bWFfZmlsbF92ZGV2X3JlcSh3bWFfaGFuZGxlLCBjb25maWdfcmVxLT5zZXNzaW9uX2lkLAorCQkJCQlXTUFfT0NCX1NFVF9DT05GSUdfQ01ELAorCQkJCQlXTUFfVEFSR0VUX1JFUV9UWVBFX1ZERVZfU1RBUlQsCisJCQkJCSh2b2lkICopY29uZmlnX3JlcSwgMTAwMCk7CisJCWlmICghbXNnKSB7CisJCQlXTUFfTE9HRShGTCgiRmFpbGVkIHRvIGZpbGwgdmRldiByZXEgJWQiKSwgcmVxLnZkZXZfaWQpOworCQkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlyZXEuY2hhbiA9IGNkc19mcmVxX3RvX2NoYW4oY29uZmlnX3JlcS0+Y2hhbm5lbHNbMF0uY2hhbl9mcmVxKTsKKwkJcmVxLnZkZXZfaWQgPSBtc2ctPnZkZXZfaWQ7CisJCWlmIChjZHNfY2hhbl90b19iYW5kKHJlcS5jaGFuKSA9PSBDRFNfQkFORF8yR0haKQorCQkJcmVxLmRvdDExX21vZGUgPSBXTklfQ0ZHX0RPVDExX01PREVfMTFHOworCQllbHNlCisJCQlyZXEuZG90MTFfbW9kZSA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUE7CisKKwkJaWYgKHdtYV9oYW5kbGUtPm9jYl9jb25maWdfcmVxKQorCQkJY2RmX21lbV9mcmVlKHdtYV9oYW5kbGUtPm9jYl9jb25maWdfcmVxKTsKKwkJd21hX2hhbmRsZS0+b2NiX2NvbmZpZ19yZXEgPSBjb3B5X3Npcl9vY2JfY29uZmlnKGNvbmZpZ19yZXEpOworCQlyZXEucHJlZmVycmVkX3J4X3N0cmVhbXMgPSAyOworCQlyZXEucHJlZmVycmVkX3R4X3N0cmVhbXMgPSAyOworCisJCXN0YXR1cyA9IHdtYV92ZGV2X3N0YXJ0KHdtYV9oYW5kbGUsICZyZXEsIGZhbHNlKTsKKwkJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXdtYV9yZW1vdmVfdmRldl9yZXEod21hX2hhbmRsZSwgcmVxLnZkZXZfaWQsCisJCQkJCSAgICBXTUFfVEFSR0VUX1JFUV9UWVBFX1ZERVZfU1RBUlQpOworCQkJV01BX0xPR0UoRkwoInZkZXZfc3RhcnQgZmFpbGVkLCBzdGF0dXMgPSAlZCIpLCBzdGF0dXMpOworCQl9CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiB3bWFfb2NiX3NldF9jb25maWcod21hX2hhbmRsZSwgY29uZmlnX3JlcSk7CisJfQorfQorCitpbnQgd21hX29jYl9zdGFydF9yZXNwX2luZF9jb250KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSAwOworCisJaWYgKCF3bWFfaGFuZGxlLT5vY2JfY29uZmlnX3JlcSkgeworCQlXTUFfTE9HRShGTCgiVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIGZvdW5kIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0VNUFRZOworCX0KKworCWNkZl9zdGF0dXMgPSB3bWFfb2NiX3NldF9jb25maWcod21hX2hhbmRsZSwgd21hX2hhbmRsZS0+b2NiX2NvbmZpZ19yZXEpOworCXJldHVybiBjZGZfc3RhdHVzOworfQorCitzdGF0aWMgV0xBTl9QSFlfTU9ERSB3bWFfb2NiX2ZyZXFfdG9fbW9kZSh1aW50MzJfdCBmcmVxKQoreworCWlmIChjZHNfY2hhbl90b19iYW5kKGNkc19mcmVxX3RvX2NoYW4oZnJlcSkpID09IENEU19CQU5EXzJHSFopCisJCXJldHVybiBNT0RFXzExRzsKKwllbHNlCisJCXJldHVybiBNT0RFXzExQTsKK30KKworLyoqCisgKiB3bWFfc2VuZF9vY2Jfc2V0X2NvbmZpZygpIC0gc2VuZCB0aGUgT0NCIGNvbmZpZyB0byB0aGUgRlcKKyAqIEB3bWFfaGFuZGxlOiBwb2ludGVyIHRvIHRoZSBXTUEgaGFuZGxlCisgKiBAY29uZmlnOiB0aGUgT0NCIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcworICovCitpbnQgd21hX29jYl9zZXRfY29uZmlnKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgc3RydWN0IHNpcl9vY2JfY29uZmlnICpjb25maWcpCit7CisJaW50MzJfdCByZXQ7CisJd21pX29jYl9zZXRfY29uZmlnX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9jaGFubmVsICpjaGFuOworCXdtaV9vY2JfY2hhbm5lbCAqb2NiX2NoYW47CisJd21pX3Fvc19wYXJhbWV0ZXIgKnFvc19wYXJhbTsKKwl3bWlfZGNjX25kbF9jaGFuICpuZGxfY2hhbjsKKwl3bWlfZGNjX25kbF9hY3RpdmVfc3RhdGVfY29uZmlnICpuZGxfYWN0aXZlX2NvbmZpZzsKKwl3bWlfb2NiX3NjaGVkdWxlX2VsZW1lbnQgKnNjaGVkX2VsZW07CisJdWludDhfdCAqYnVmX3B0cjsKKwl3bWlfYnVmX3QgYnVmOworCWludDMyX3QgbGVuOworCWludDMyX3QgaSwgaiwgYWN0aXZlX3N0YXRlX2NvdW50OworCisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUgZGNjX25kbF9jaGFuX2xpc3RfbGVuIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIGFjdGl2ZQorCSAqIHN0YXRlcy4gVmFsaWRhdGUgZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdF9sZW4uCisJICovCisJYWN0aXZlX3N0YXRlX2NvdW50ID0gMDsKKwlpZiAoY29uZmlnLT5kY2NfbmRsX2NoYW5fbGlzdF9sZW4pIHsKKwkJaWYgKCFjb25maWctPmRjY19uZGxfY2hhbl9saXN0IHx8CisJCQljb25maWctPmRjY19uZGxfY2hhbl9saXN0X2xlbiAhPQorCQkJY29uZmlnLT5jaGFubmVsX2NvdW50ICogc2l6ZW9mKHdtaV9kY2NfbmRsX2NoYW4pKSB7CisJCQlXTUFfTE9HRShGTCgiTkRMIGNoYW5uZWwgaXMgaW52YWxpZC4gTGlzdCBsZW46ICVkIiksCisJCQkJIGNvbmZpZy0+ZGNjX25kbF9jaGFuX2xpc3RfbGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZm9yIChpID0gMCwgbmRsX2NoYW4gPSBjb25maWctPmRjY19uZGxfY2hhbl9saXN0OworCQkJCWkgPCBjb25maWctPmNoYW5uZWxfY291bnQ7ICsraSwgKytuZGxfY2hhbikKKwkJCWFjdGl2ZV9zdGF0ZV9jb3VudCArPQorCQkJCVdNSV9ORExfTlVNX0FDVElWRV9TVEFURV9HRVQobmRsX2NoYW4pOworCisJCWlmIChhY3RpdmVfc3RhdGVfY291bnQpIHsKKwkJCWlmICghY29uZmlnLT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0IHx8CisJCQkJY29uZmlnLT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbiAhPQorCQkJCWFjdGl2ZV9zdGF0ZV9jb3VudCAqCisJCQkJc2l6ZW9mKHdtaV9kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9jb25maWcpKSB7CisJCQkJV01BX0xPR0UoRkwoIk5ETCBhY3RpdmUgc3RhdGUgaXMgaW52YWxpZC4iKSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwlsZW4gPSBzaXplb2YoKmNtZCkgKworCQlXTUlfVExWX0hEUl9TSVpFICsgY29uZmlnLT5jaGFubmVsX2NvdW50ICoKKwkJCXNpemVvZih3bWlfY2hhbm5lbCkgKworCQlXTUlfVExWX0hEUl9TSVpFICsgY29uZmlnLT5jaGFubmVsX2NvdW50ICoKKwkJCXNpemVvZih3bWlfb2NiX2NoYW5uZWwpICsKKwkJV01JX1RMVl9IRFJfU0laRSArIGNvbmZpZy0+Y2hhbm5lbF9jb3VudCAqCisJCQlzaXplb2Yod21pX3Fvc19wYXJhbWV0ZXIpICogV0xBTl9NQVhfQUMgKworCQlXTUlfVExWX0hEUl9TSVpFICsgY29uZmlnLT5kY2NfbmRsX2NoYW5fbGlzdF9sZW4gKworCQlXTUlfVExWX0hEUl9TSVpFICsgYWN0aXZlX3N0YXRlX2NvdW50ICoKKwkJCXNpemVvZih3bWlfZGNjX25kbF9hY3RpdmVfc3RhdGVfY29uZmlnKSArCisJCVdNSV9UTFZfSERSX1NJWkUgKyBjb25maWctPnNjaGVkdWxlX3NpemUgKgorCQkJc2l6ZW9mKHdtaV9vY2Jfc2NoZWR1bGVfZWxlbWVudCk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKEZMKCJ3bWlfYnVmX2FsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopd21pX2J1Zl9kYXRhKGJ1Zik7CisJY21kID0gKHdtaV9vY2Jfc2V0X2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0gKilidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCVdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9zZXRfY29uZmlnX2NtZF9maXhlZF9wYXJhbSwKKwkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV9vY2Jfc2V0X2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSBjb25maWctPnNlc3Npb25faWQ7CisJY21kLT5jaGFubmVsX2NvdW50ID0gY29uZmlnLT5jaGFubmVsX2NvdW50OworCWNtZC0+c2NoZWR1bGVfc2l6ZSA9IGNvbmZpZy0+c2NoZWR1bGVfc2l6ZTsKKwljbWQtPmZsYWdzID0gY29uZmlnLT5mbGFnczsKKwlidWZfcHRyICs9IHNpemVvZigqY21kKTsKKworCS8qIEFkZCB0aGUgd21pX2NoYW5uZWwgaW5mbyAqLworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCSAgICAgICBjb25maWctPmNoYW5uZWxfY291bnQqc2l6ZW9mKHdtaV9jaGFubmVsKSk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmNoYW5uZWxfY291bnQ7IGkrKykgeworCQljaGFuID0gKHdtaV9jaGFubmVsICopYnVmX3B0cjsKKwkJV01JVExWX1NFVF9IRFIoJmNoYW4tPnRsdl9oZWFkZXIsCisJCQkJV01JVExWX1RBR19TVFJVQ193bWlfY2hhbm5lbCwKKwkJCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX2NoYW5uZWwpKTsKKwkJY2hhbi0+bWh6ID0gY29uZmlnLT5jaGFubmVsc1tpXS5jaGFuX2ZyZXE7CisJCWNoYW4tPmJhbmRfY2VudGVyX2ZyZXExID0gY29uZmlnLT5jaGFubmVsc1tpXS5jaGFuX2ZyZXE7CisJCWNoYW4tPmJhbmRfY2VudGVyX2ZyZXEyID0gMDsKKwkJY2hhbi0+aW5mbyA9IDA7CisKKwkJV01JX1NFVF9DSEFOTkVMX01PREUoY2hhbiwgd21hX29jYl9mcmVxX3RvX21vZGUoY2hhbi0+bWh6KSk7CisJCVdNSV9TRVRfQ0hBTk5FTF9NQVhfUE9XRVIoY2hhbiwgY29uZmlnLT5jaGFubmVsc1tpXS5tYXhfcHdyKTsKKwkJV01JX1NFVF9DSEFOTkVMX01JTl9QT1dFUihjaGFuLCBjb25maWctPmNoYW5uZWxzW2ldLm1pbl9wd3IpOworCQlXTUlfU0VUX0NIQU5ORUxfTUFYX1RYX1BPV0VSKGNoYW4sIGNvbmZpZy0+Y2hhbm5lbHNbaV0ubWF4X3B3cik7CisJCVdNSV9TRVRfQ0hBTk5FTF9SRUdfUE9XRVIoY2hhbiwgY29uZmlnLT5jaGFubmVsc1tpXS5yZWdfcHdyKTsKKwkJV01JX1NFVF9DSEFOTkVMX0FOVEVOTkFfTUFYKGNoYW4sCisJCQkJCSAgICBjb25maWctPmNoYW5uZWxzW2ldLmFudGVubmFfbWF4KTsKKworCQlpZiAoY29uZmlnLT5jaGFubmVsc1tpXS5iYW5kd2lkdGggPCAxMCkKKwkJCVdNSV9TRVRfQ0hBTk5FTF9GTEFHKGNoYW4sIFdNSV9DSEFOX0ZMQUdfUVVBUlRFUl9SQVRFKTsKKwkJZWxzZSBpZiAoY29uZmlnLT5jaGFubmVsc1tpXS5iYW5kd2lkdGggPCAyMCkKKwkJCVdNSV9TRVRfQ0hBTk5FTF9GTEFHKGNoYW4sIFdNSV9DSEFOX0ZMQUdfSEFMRl9SQVRFKTsKKwkJYnVmX3B0ciArPSBzaXplb2YoKmNoYW4pOworCX0KKworCS8qIEFkZCB0aGUgd21pX29jYl9jaGFubmVsIGluZm8gKi8KKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkgICAgICAgY29uZmlnLT5jaGFubmVsX2NvdW50KnNpemVvZih3bWlfb2NiX2NoYW5uZWwpKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7CisJCW9jYl9jaGFuID0gKHdtaV9vY2JfY2hhbm5lbCAqKWJ1Zl9wdHI7CisJCVdNSVRMVl9TRVRfSERSKCZvY2JfY2hhbi0+dGx2X2hlYWRlciwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2JfY2hhbm5lbCwKKwkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX29jYl9jaGFubmVsKSk7CisJCW9jYl9jaGFuLT5iYW5kd2lkdGggPSBjb25maWctPmNoYW5uZWxzW2ldLmJhbmR3aWR0aDsKKwkJV01JX0NIQVJfQVJSQVlfVE9fTUFDX0FERFIoY29uZmlnLT5jaGFubmVsc1tpXS5tYWNfYWRkcmVzcywKKwkJCQkJICAgJm9jYl9jaGFuLT5tYWNfYWRkcmVzcyk7CisJCWJ1Zl9wdHIgKz0gc2l6ZW9mKCpvY2JfY2hhbik7CisJfQorCisJLyogQWRkIHRoZSB3bWlfcW9zX3BhcmFtZXRlciBpbmZvICovCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJY29uZmlnLT5jaGFubmVsX2NvdW50ICogc2l6ZW9mKHdtaV9xb3NfcGFyYW1ldGVyKSpXTEFOX01BWF9BQyk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCS8qIFdMQU5fTUFYX0FDIHBhcmFtZXRlcnMgZm9yIGVhY2ggY2hhbm5lbCAqLworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmNoYW5uZWxfY291bnQ7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgV0xBTl9NQVhfQUM7IGorKykgeworCQkJcW9zX3BhcmFtID0gKHdtaV9xb3NfcGFyYW1ldGVyICopYnVmX3B0cjsKKwkJCVdNSVRMVl9TRVRfSERSKCZxb3NfcGFyYW0tPnRsdl9oZWFkZXIsCisJCQkJV01JVExWX1RBR19TVFJVQ193bWlfcW9zX3BhcmFtZXRlciwKKwkJCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX3Fvc19wYXJhbWV0ZXIpKTsKKwkJCXFvc19wYXJhbS0+YWlmc24gPQorCQkJCWNvbmZpZy0+Y2hhbm5lbHNbaV0ucW9zX3BhcmFtc1tqXS5haWZzbjsKKwkJCXFvc19wYXJhbS0+Y3dtaW4gPQorCQkJCWNvbmZpZy0+Y2hhbm5lbHNbaV0ucW9zX3BhcmFtc1tqXS5jd21pbjsKKwkJCXFvc19wYXJhbS0+Y3dtYXggPQorCQkJCWNvbmZpZy0+Y2hhbm5lbHNbaV0ucW9zX3BhcmFtc1tqXS5jd21heDsKKwkJCWJ1Zl9wdHIgKz0gc2l6ZW9mKCpxb3NfcGFyYW0pOworCQl9CisJfQorCisJLyogQWRkIHRoZSB3bWlfZGNjX25kbF9jaGFuIChwZXIgY2hhbm5lbCkgKi8KKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkgICAgICAgY29uZmlnLT5kY2NfbmRsX2NoYW5fbGlzdF9sZW4pOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwlpZiAoY29uZmlnLT5kY2NfbmRsX2NoYW5fbGlzdF9sZW4pIHsKKwkJbmRsX2NoYW4gPSAod21pX2RjY19uZGxfY2hhbiAqKWJ1Zl9wdHI7CisJCWNkZl9tZW1fY29weShuZGxfY2hhbiwgY29uZmlnLT5kY2NfbmRsX2NoYW5fbGlzdCwKKwkJCSAgICAgY29uZmlnLT5kY2NfbmRsX2NoYW5fbGlzdF9sZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5jaGFubmVsX2NvdW50OyBpKyspCisJCQlXTUlUTFZfU0VUX0hEUigmKG5kbF9jaGFuW2ldLnRsdl9oZWFkZXIpLAorCQkJCVdNSVRMVl9UQUdfU1RSVUNfd21pX2RjY19uZGxfY2hhbiwKKwkJCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX2RjY19uZGxfY2hhbikpOworCQlidWZfcHRyICs9IGNvbmZpZy0+ZGNjX25kbF9jaGFuX2xpc3RfbGVuOworCX0KKworCS8qIEFkZCB0aGUgd21pX2RjY19uZGxfYWN0aXZlX3N0YXRlX2NvbmZpZyAqLworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIGFjdGl2ZV9zdGF0ZV9jb3VudCAqCisJCSAgICAgICBzaXplb2Yod21pX2RjY19uZGxfYWN0aXZlX3N0YXRlX2NvbmZpZykpOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwlpZiAoYWN0aXZlX3N0YXRlX2NvdW50KSB7CisJCW5kbF9hY3RpdmVfY29uZmlnID0gKHdtaV9kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9jb25maWcgKilidWZfcHRyOworCQljZGZfbWVtX2NvcHkobmRsX2FjdGl2ZV9jb25maWcsCisJCQljb25maWctPmRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3QsCisJCQlhY3RpdmVfc3RhdGVfY291bnQgKiBzaXplb2YoKm5kbF9hY3RpdmVfY29uZmlnKSk7CisJCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfc3RhdGVfY291bnQ7ICsraSkKKwkJCVdNSVRMVl9TRVRfSERSKCYobmRsX2FjdGl2ZV9jb25maWdbaV0udGx2X2hlYWRlciksCisJCQkgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RjY19uZGxfYWN0aXZlX3N0YXRlX2NvbmZpZywKKwkJCSAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKAorCQkJCXdtaV9kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9jb25maWcpKTsKKwkJYnVmX3B0ciArPSBhY3RpdmVfc3RhdGVfY291bnQgKgorCQkJc2l6ZW9mKCpuZGxfYWN0aXZlX2NvbmZpZyk7CisJfQorCisJLyogQWRkIHRoZSB3bWlfb2NiX3NjaGVkdWxlX2VsZW1lbnQgaW5mbyAqLworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCWNvbmZpZy0+c2NoZWR1bGVfc2l6ZSAqIHNpemVvZih3bWlfb2NiX3NjaGVkdWxlX2VsZW1lbnQpKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+c2NoZWR1bGVfc2l6ZTsgaSsrKSB7CisJCXNjaGVkX2VsZW0gPSAod21pX29jYl9zY2hlZHVsZV9lbGVtZW50ICopYnVmX3B0cjsKKwkJV01JVExWX1NFVF9IRFIoJnNjaGVkX2VsZW0tPnRsdl9oZWFkZXIsCisJCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc2NoZWR1bGVfZWxlbWVudCwKKwkJCVdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfb2NiX3NjaGVkdWxlX2VsZW1lbnQpKTsKKwkJc2NoZWRfZWxlbS0+Y2hhbm5lbF9mcmVxID0gY29uZmlnLT5zY2hlZHVsZVtpXS5jaGFuX2ZyZXE7CisJCXNjaGVkX2VsZW0tPnRvdGFsX2R1cmF0aW9uID0gY29uZmlnLT5zY2hlZHVsZVtpXS50b3RhbF9kdXJhdGlvbjsKKwkJc2NoZWRfZWxlbS0+Z3VhcmRfaW50ZXJ2YWwgPSBjb25maWctPnNjaGVkdWxlW2ldLmd1YXJkX2ludGVydmFsOworCQlidWZfcHRyICs9IHNpemVvZigqc2NoZWRfZWxlbSk7CisJfQorCisJLyoKKwkgKiBTYXZlIHRoZSBjb25maWd1cmF0aW9uIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgaW4KKwkgKiB3bWFfb2NiX3NldF9jb25maWdfZXZlbnRfaGFuZGxlci4KKwkgKi8KKwlpZiAod21hX2hhbmRsZS0+b2NiX2NvbmZpZ19yZXEgIT0gY29uZmlnKSB7CisJCWlmICh3bWFfaGFuZGxlLT5vY2JfY29uZmlnX3JlcSkKKwkJCWNkZl9tZW1fZnJlZSh3bWFfaGFuZGxlLT5vY2JfY29uZmlnX3JlcSk7CisJCXdtYV9oYW5kbGUtPm9jYl9jb25maWdfcmVxID0gY29weV9zaXJfb2NiX2NvbmZpZyhjb25maWcpOworCX0KKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9PQ0JfU0VUX0NPTkZJR19DTURJRCk7CisJaWYgKHJldCAhPSBFT0spIHsKKwkJaWYgKHdtYV9oYW5kbGUtPm9jYl9jb25maWdfcmVxKSB7CisJCQljZGZfbWVtX2ZyZWUod21hX2hhbmRsZS0+b2NiX2NvbmZpZ19yZXEpOworCQkJd21hX2hhbmRsZS0+b2NiX2NvbmZpZ19yZXEgPSBOVUxMOworCQl9CisKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXQgT0NCIGNvbmZpZyIpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9vY2Jfc2V0X2NvbmZpZ19ldmVudF9oYW5kbGVyKCkgLSBSZXNwb25zZSBldmVudCBmb3IgdGhlIHNldCBjb25maWcgY21kCisgKiBAaGFuZGxlOiB0aGUgV01BIGhhbmRsZQorICogQGV2ZW50X2J1ZjogYnVmZmVyIHdpdGggdGhlIGV2ZW50IHBhcmFtZXRlcnMKKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgYnVmZmVyCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MKKyAqLworaW50IHdtYV9vY2Jfc2V0X2NvbmZpZ19ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnRfYnVmLAorCQkJCSAgICAgdWludDMyX3QgbGVuKQoreworCVdNSV9PQ0JfU0VUX0NPTkZJR19SRVNQX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fdGx2czsKKwl3bWlfb2NiX3NldF9jb25maWdfcmVzcF9ldmVudF9maXhlZF9wYXJhbSAqZml4X3BhcmFtOworCXBhcmFtX3RsdnMgPSAoV01JX09DQl9TRVRfQ09ORklHX1JFU1BfRVZFTlRJRF9wYXJhbV90bHZzICopZXZlbnRfYnVmOworCWZpeF9wYXJhbSA9IHBhcmFtX3RsdnMtPmZpeGVkX3BhcmFtOworCXJldHVybiB3bWFfb2NiX3NldF9jb25maWdfcmVzcChoYW5kbGUsIGZpeF9wYXJhbS0+c3RhdHVzKTsKK307CisKKy8qKgorICogd21hX29jYl9zZXRfdXRjX3RpbWUoKSAtIHNlbmQgdGhlIFVUQyB0aW1lIHRvIHRoZSBmaXJtd2FyZQorICogQHdtYV9oYW5kbGU6IHBvaW50ZXIgdG8gdGhlIFdNQSBoYW5kbGUKKyAqIEB1dGM6IHBvaW50ZXIgdG8gdGhlIFVUQyB0aW1lIHN0cnVjdAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXMKKyAqLworaW50IHdtYV9vY2Jfc2V0X3V0Y190aW1lKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgc3RydWN0IHNpcl9vY2JfdXRjICp1dGMpCit7CisJaW50MzJfdCByZXQ7CisJd21pX29jYl9zZXRfdXRjX3RpbWVfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50MzJfdCBsZW4sIGk7CisJd21pX2J1Zl90IGJ1ZjsKKworCWxlbiA9IHNpemVvZigqY21kKTsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoRkwoIndtaV9idWZfYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKil3bWlfYnVmX2RhdGEoYnVmKTsKKwljbWQgPSAod21pX29jYl9zZXRfdXRjX3RpbWVfY21kX2ZpeGVkX3BhcmFtICopYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc2V0X3V0Y190aW1lX2NtZF9maXhlZF9wYXJhbSwKKwkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV9vY2Jfc2V0X3V0Y190aW1lX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHV0Yy0+dmRldl9pZDsKKworCWZvciAoaSA9IDA7IGkgPCBTSVpFX1VUQ19USU1FOyBpKyspCisJCVdNSV9VVENfVElNRV9TRVQoY21kLCBpLCB1dGMtPnV0Y190aW1lW2ldKTsKKworCWZvciAoaSA9IDA7IGkgPCBTSVpFX1VUQ19USU1FX0VSUk9SOyBpKyspCisJCVdNSV9USU1FX0VSUk9SX1NFVChjbWQsIGksIHV0Yy0+dGltZV9lcnJvcltpXSk7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfT0NCX1NFVF9VVENfVElNRV9DTURJRCk7CisJaWYgKHJldCAhPSBFT0spIHsKKwkJV01BX0xPR0UoRkwoIkZhaWxlZCB0byBzZXQgT0NCIFVUQyB0aW1lIikpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX29jYl9zdGFydF90aW1pbmdfYWR2ZXJ0KCkgLSBzdGFydCBzZW5kaW5nIHRoZSB0aW1pbmcgYWR2ZXJ0aXNlbWVudAorICoJCQkJICAgZnJhbWVzIG9uIGEgY2hhbm5lbAorICogQHdtYV9oYW5kbGU6IHBvaW50ZXIgdG8gdGhlIFdNQSBoYW5kbGUKKyAqIEB0aW1pbmdfYWR2ZXJ0OiBwb2ludGVyIHRvIHRoZSB0aW1pbmcgYWR2ZXJ0aXNlbWVudCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzCisgKi8KK2ludCB3bWFfb2NiX3N0YXJ0X3RpbWluZ19hZHZlcnQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCXN0cnVjdCBzaXJfb2NiX3RpbWluZ19hZHZlcnQgKnRpbWluZ19hZHZlcnQpCit7CisJaW50MzJfdCByZXQ7CisJd21pX29jYl9zdGFydF90aW1pbmdfYWR2ZXJ0X2NtZF9maXhlZF9wYXJhbSAqY21kOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJdWludDMyX3QgbGVuLCBsZW5fdGVtcGxhdGU7CisJd21pX2J1Zl90IGJ1ZjsKKworCWxlbiA9IHNpemVvZigqY21kKSArCisJCSAgICAgV01JX1RMVl9IRFJfU0laRTsKKworCWxlbl90ZW1wbGF0ZSA9IHRpbWluZ19hZHZlcnQtPnRlbXBsYXRlX2xlbmd0aDsKKwkvKiBBZGQgcGFkZGluZyB0byB0aGUgdGVtcGxhdGUgaWYgbmVlZGVkICovCisJaWYgKGxlbl90ZW1wbGF0ZSAlIDQgIT0gMCkKKwkJbGVuX3RlbXBsYXRlICs9IDQgLSAobGVuX3RlbXBsYXRlICUgNCk7CisJbGVuICs9IGxlbl90ZW1wbGF0ZTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRShGTCgid21pX2J1Zl9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKXdtaV9idWZfZGF0YShidWYpOworCWNtZCA9ICh3bWlfb2NiX3N0YXJ0X3RpbWluZ19hZHZlcnRfY21kX2ZpeGVkX3BhcmFtICopYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW0sCisJCVdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTigKKwkJCXdtaV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSB0aW1pbmdfYWR2ZXJ0LT52ZGV2X2lkOworCWNtZC0+cmVwZWF0X3JhdGUgPSB0aW1pbmdfYWR2ZXJ0LT5yZXBlYXRfcmF0ZTsKKwljbWQtPmNoYW5uZWxfZnJlcSA9IHRpbWluZ19hZHZlcnQtPmNoYW5fZnJlcTsKKwljbWQtPnRpbWVzdGFtcF9vZmZzZXQgPSB0aW1pbmdfYWR2ZXJ0LT50aW1lc3RhbXBfb2Zmc2V0OworCWNtZC0+dGltZV92YWx1ZV9vZmZzZXQgPSB0aW1pbmdfYWR2ZXJ0LT50aW1lX3ZhbHVlX29mZnNldDsKKwljbWQtPnRpbWluZ19hZHZlcnRfdGVtcGxhdGVfbGVuZ3RoID0gdGltaW5nX2FkdmVydC0+dGVtcGxhdGVfbGVuZ3RoOworCWJ1Zl9wdHIgKz0gc2l6ZW9mKCpjbWQpOworCisJLyogQWRkIHRoZSB0aW1pbmcgYWR2ZXJ0IHRlbXBsYXRlICovCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9CWVRFLAorCQkgICAgICAgbGVuX3RlbXBsYXRlKTsKKwljZGZfbWVtX2NvcHkoYnVmX3B0ciArIFdNSV9UTFZfSERSX1NJWkUsCisJCSAgICAgKHVpbnQ4X3QgKil0aW1pbmdfYWR2ZXJ0LT50ZW1wbGF0ZV92YWx1ZSwKKwkJICAgICB0aW1pbmdfYWR2ZXJ0LT50ZW1wbGF0ZV9sZW5ndGgpOworCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX09DQl9TVEFSVF9USU1JTkdfQURWRVJUX0NNRElEKTsKKwlpZiAocmV0ICE9IEVPSykgeworCQlXTUFfTE9HRShGTCgiRmFpbGVkIHRvIHN0YXJ0IE9DQiB0aW1pbmcgYWR2ZXJ0IikpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX29jYl9zdG9wX3RpbWluZ19hZHZlcnQoKSAtIHN0b3Agc2VuZGluZyB0aGUgdGltaW5nIGFkdmVydGlzZW1lbnQgZnJhbWVzCisgKgkJCQkgIG9uIGEgY2hhbm5lbAorICogQHdtYV9oYW5kbGU6IHBvaW50ZXIgdG8gdGhlIFdNQSBoYW5kbGUKKyAqIEB0aW1pbmdfYWR2ZXJ0OiBwb2ludGVyIHRvIHRoZSB0aW1pbmcgYWR2ZXJ0aXNlbWVudCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzCisgKi8KK2ludCB3bWFfb2NiX3N0b3BfdGltaW5nX2FkdmVydCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJc3RydWN0IHNpcl9vY2JfdGltaW5nX2FkdmVydCAqdGltaW5nX2FkdmVydCkKK3sKKwlpbnQzMl90IHJldDsKKwl3bWlfb2NiX3N0b3BfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl1aW50OF90ICpidWZfcHRyOworCXVpbnQzMl90IGxlbjsKKwl3bWlfYnVmX3QgYnVmOworCisJbGVuID0gc2l6ZW9mKCpjbWQpOworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRShGTCgid21pX2J1Zl9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKXdtaV9idWZfZGF0YShidWYpOworCWNtZCA9ICh3bWlfb2NiX3N0b3BfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW0gKilidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCVdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9zdG9wX3RpbWluZ19hZHZlcnRfY21kX2ZpeGVkX3BhcmFtLAorCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oCisJCQl3bWlfb2NiX3N0b3BfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSB0aW1pbmdfYWR2ZXJ0LT52ZGV2X2lkOworCWNtZC0+Y2hhbm5lbF9mcmVxID0gdGltaW5nX2FkdmVydC0+Y2hhbl9mcmVxOworCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX09DQl9TVE9QX1RJTUlOR19BRFZFUlRfQ01ESUQpOworCWlmIChyZXQgIT0gRU9LKSB7CisJCVdNQV9MT0dFKEZMKCJGYWlsZWQgdG8gc3RvcCBPQ0IgdGltaW5nIGFkdmVydCIpKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9vY2JfZ2V0X3RzZl90aW1lcigpIC0gc3RvcCBzZW5kaW5nIHRoZSB0aW1pbmcgYWR2ZXJ0aXNlbWVudCBmcmFtZXMgb24gYQorICoJCQkgICAgIGNoYW5uZWwKKyAqIEB3bWFfaGFuZGxlOiBwb2ludGVyIHRvIHRoZSBXTUEgaGFuZGxlCisgKiBAcmVxdWVzdDogcG9pbnRlciB0byB0aGUgcmVxdWVzdAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXMKKyAqLworaW50IHdtYV9vY2JfZ2V0X3RzZl90aW1lcih0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkgIHN0cnVjdCBzaXJfb2NiX2dldF90c2ZfdGltZXIgKnJlcXVlc3QpCit7CisJQ0RGX1NUQVRVUyByZXQ7CisJd21pX29jYl9nZXRfdHNmX3RpbWVyX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQzMl90IGxlbjsKKworCWxlbiA9IHNpemVvZigqY21kKTsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoRkwoIndtaV9idWZfYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJYnVmX3B0ciA9ICh1aW50OF90ICopd21pX2J1Zl9kYXRhKGJ1Zik7CisKKwljbWQgPSAod21pX29jYl9nZXRfdHNmX3RpbWVyX2NtZF9maXhlZF9wYXJhbSAqKWJ1Zl9wdHI7CisJY2RmX21lbV96ZXJvKGNtZCwgbGVuKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2JfZ2V0X3RzZl90aW1lcl9jbWRfZml4ZWRfcGFyYW0sCisJCVdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTigKKwkJCXdtaV9vY2JfZ2V0X3RzZl90aW1lcl9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSByZXF1ZXN0LT52ZGV2X2lkOworCisJLyogU2VuZCB0aGUgV01JIGNvbW1hbmQgKi8KKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfT0NCX0dFVF9UU0ZfVElNRVJfQ01ESUQpOworCS8qIElmIHRoZXJlIGlzIGFuIGVycm9yLCBzZXQgdGhlIGNvbXBsZXRpb24gZXZlbnQgKi8KKwlpZiAocmV0ICE9IEVPSykgeworCQlXTUFfTE9HRShGTCgiRmFpbGVkIHRvIHNlbmQgV01JIG1lc3NhZ2U6ICVkIiksIHJldCk7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX29jYl9nZXRfdHNmX3RpbWVyX3Jlc3BfZXZlbnRfaGFuZGxlcigpIC0gRXZlbnQgZm9yIHRoZSBnZXQgVFNGIHRpbWVyIGNtZAorICogQGhhbmRsZTogdGhlIFdNQSBoYW5kbGUKKyAqIEBldmVudF9idWY6IGJ1ZmZlciB3aXRoIHRoZSBldmVudCBwYXJhbWV0ZXJzCisgKiBAbGVuOiBsZW5ndGggb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzCisgKi8KK2ludCB3bWFfb2NiX2dldF90c2ZfdGltZXJfcmVzcF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnRfYnVmLAorCQkJCQkgICAgIHVpbnQzMl90IGxlbikKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJc3RydWN0IHNpcl9vY2JfZ2V0X3RzZl90aW1lcl9yZXNwb25zZSAqcmVzcG9uc2U7CisJV01JX09DQl9HRVRfVFNGX1RJTUVSX1JFU1BfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV90bHZzOworCXdtaV9vY2JfZ2V0X3RzZl90aW1lcl9yZXNwX2V2ZW50X2ZpeGVkX3BhcmFtICpmaXhfcGFyYW07CisJY2RzX21zZ190IG1zZyA9IHswfTsKKworCXBhcmFtX3RsdnMgPSAoV01JX09DQl9HRVRfVFNGX1RJTUVSX1JFU1BfRVZFTlRJRF9wYXJhbV90bHZzICopZXZlbnRfYnVmOworCWZpeF9wYXJhbSA9IHBhcmFtX3RsdnMtPmZpeGVkX3BhcmFtOworCisJLyogQWxsb2NhdGUgYW5kIHBvcHVsYXRlIHRoZSByZXNwb25zZSAqLworCXJlc3BvbnNlID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpyZXNwb25zZSkpOworCWlmIChyZXNwb25zZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXNwb25zZS0+dmRldl9pZCA9IGZpeF9wYXJhbS0+dmRldl9pZDsKKwlyZXNwb25zZS0+dGltZXJfaGlnaCA9IGZpeF9wYXJhbS0+dHNmX3RpbWVyX2hpZ2g7CisJcmVzcG9uc2UtPnRpbWVyX2xvdyA9IGZpeF9wYXJhbS0+dHNmX3RpbWVyX2xvdzsKKworCW1zZy50eXBlID0gZVdOSV9TTUVfT0NCX0dFVF9UU0ZfVElNRVJfUlNQOworCW1zZy5ib2R5cHRyID0gcmVzcG9uc2U7CisKKwljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1NNRSwgJm1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJV01BX0xPR0UoRkwoIkZhaWxlZCB0byBwb3N0IG1zZyB0byBTTUUiKSk7CisJCWNkZl9tZW1fZnJlZShyZXNwb25zZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9kY2NfZ2V0X3N0YXRzKCkgLSBnZXQgdGhlIERDQyBjaGFubmVsIHN0YXRzCisgKiBAd21hX2hhbmRsZTogcG9pbnRlciB0byB0aGUgV01BIGhhbmRsZQorICogQGdldF9zdGF0c19wYXJhbTogcG9pbnRlciB0byB0aGUgZGNjIHN0YXRzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2NlcworICovCitpbnQgd21hX2RjY19nZXRfc3RhdHModHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkgICAgICBzdHJ1Y3Qgc2lyX2RjY19nZXRfc3RhdHMgKmdldF9zdGF0c19wYXJhbSkKK3sKKwlpbnQzMl90IHJldDsKKwl3bWlfZGNjX2dldF9zdGF0c19jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfZGNjX2NoYW5uZWxfc3RhdHNfcmVxdWVzdCAqY2hhbm5lbF9zdGF0c19hcnJheTsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJdWludDMyX3QgbGVuOworCXVpbnQzMl90IGk7CisKKwkvKiBWYWxpZGF0ZSB0aGUgaW5wdXQgKi8KKwlpZiAoZ2V0X3N0YXRzX3BhcmFtLT5yZXF1ZXN0X2FycmF5X2xlbiAhPQorCSAgICBnZXRfc3RhdHNfcGFyYW0tPmNoYW5uZWxfY291bnQgKiBzaXplb2YoKmNoYW5uZWxfc3RhdHNfYXJyYXkpKSB7CisJCVdNQV9MT0dFKEZMKCJJbnZhbGlkIHBhcmFtZXRlciIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgV01JIGNvbW1hbmQgKi8KKwlsZW4gPSBzaXplb2YoKmNtZCkgKyBXTUlfVExWX0hEUl9TSVpFICsKKwkJZ2V0X3N0YXRzX3BhcmFtLT5yZXF1ZXN0X2FycmF5X2xlbjsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRShGTCgid21pX2J1Zl9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJYnVmX3B0ciA9IHdtaV9idWZfZGF0YShidWYpOworCWNkZl9tZW1femVybyhidWZfcHRyLCBsZW4pOworCisJLyogUG9wdWxhdGUgdGhlIFdNSSBjb21tYW5kICovCisJY21kID0gKHdtaV9kY2NfZ2V0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqKWJ1Zl9wdHI7CisJYnVmX3B0ciArPSBzaXplb2YoKmNtZCk7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfZGNjX2dldF9zdGF0c19jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oCisJCQkgICB3bWlfZGNjX2dldF9zdGF0c19jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSBnZXRfc3RhdHNfcGFyYW0tPnZkZXZfaWQ7CisJY21kLT5udW1fY2hhbm5lbHMgPSBnZXRfc3RhdHNfcGFyYW0tPmNoYW5uZWxfY291bnQ7CisKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkgICAgICAgZ2V0X3N0YXRzX3BhcmFtLT5yZXF1ZXN0X2FycmF5X2xlbik7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCisJY2hhbm5lbF9zdGF0c19hcnJheSA9ICh3bWlfZGNjX2NoYW5uZWxfc3RhdHNfcmVxdWVzdCAqKWJ1Zl9wdHI7CisJY2RmX21lbV9jb3B5KGNoYW5uZWxfc3RhdHNfYXJyYXksIGdldF9zdGF0c19wYXJhbS0+cmVxdWVzdF9hcnJheSwKKwkJICAgICBnZXRfc3RhdHNfcGFyYW0tPnJlcXVlc3RfYXJyYXlfbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5udW1fY2hhbm5lbHM7IGkrKykKKwkJV01JVExWX1NFVF9IRFIoJmNoYW5uZWxfc3RhdHNfYXJyYXlbaV0udGx2X2hlYWRlciwKKwkJCVdNSVRMVl9UQUdfU1RSVUNfd21pX2RjY19jaGFubmVsX3N0YXRzX3JlcXVlc3QsCisJCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oCisJCQkgICAgd21pX2RjY19jaGFubmVsX3N0YXRzX3JlcXVlc3QpKTsKKworCS8qIFNlbmQgdGhlIFdNSSBjb21tYW5kICovCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX0RDQ19HRVRfU1RBVFNfQ01ESUQpOworCisJaWYgKHJldCAhPSBFT0spIHsKKwkJV01BX0xPR0UoRkwoIkZhaWxlZCB0byBzZW5kIFdNSSBtZXNzYWdlOiAlZCIpLCByZXQpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX2RjY19nZXRfc3RhdHNfcmVzcF9ldmVudF9oYW5kbGVyKCkgLSBSZXNwb25zZSBldmVudCBmb3IgdGhlIGdldCBzdGF0cyBjbWQKKyAqIEBoYW5kbGU6IHRoZSBXTUEgaGFuZGxlCisgKiBAZXZlbnRfYnVmOiBidWZmZXIgd2l0aCB0aGUgZXZlbnQgcGFyYW1ldGVycworICogQGxlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcworICovCitpbnQgd21hX2RjY19nZXRfc3RhdHNfcmVzcF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnRfYnVmLAorCQkJCXVpbnQzMl90IGxlbikKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJc3RydWN0IHNpcl9kY2NfZ2V0X3N0YXRzX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlXTUlfRENDX0dFVF9TVEFUU19SRVNQX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fdGx2czsKKwl3bWlfZGNjX2dldF9zdGF0c19yZXNwX2V2ZW50X2ZpeGVkX3BhcmFtICpmaXhfcGFyYW07CisJY2RzX21zZ190IG1zZyA9IHswfTsKKworCXBhcmFtX3RsdnMgPSAoV01JX0RDQ19HRVRfU1RBVFNfUkVTUF9FVkVOVElEX3BhcmFtX3RsdnMgKilldmVudF9idWY7CisJZml4X3BhcmFtID0gcGFyYW1fdGx2cy0+Zml4ZWRfcGFyYW07CisKKwkvKiBBbGxvY2F0ZSBhbmQgcG9wdWxhdGUgdGhlIHJlc3BvbnNlICovCisJcmVzcG9uc2UgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YoKnJlc3BvbnNlKSArIGZpeF9wYXJhbS0+bnVtX2NoYW5uZWxzICoKKwkJc2l6ZW9mKHdtaV9kY2NfbmRsX3N0YXRzX3Blcl9jaGFubmVsKSk7CisJaWYgKHJlc3BvbnNlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzcG9uc2UtPnZkZXZfaWQgPSBmaXhfcGFyYW0tPnZkZXZfaWQ7CisJcmVzcG9uc2UtPm51bV9jaGFubmVscyA9IGZpeF9wYXJhbS0+bnVtX2NoYW5uZWxzOworCXJlc3BvbnNlLT5jaGFubmVsX3N0YXRzX2FycmF5X2xlbiA9CisJCWZpeF9wYXJhbS0+bnVtX2NoYW5uZWxzICogc2l6ZW9mKHdtaV9kY2NfbmRsX3N0YXRzX3Blcl9jaGFubmVsKTsKKwlyZXNwb25zZS0+Y2hhbm5lbF9zdGF0c19hcnJheSA9ICgodm9pZCAqKXJlc3BvbnNlKSArIHNpemVvZigqcmVzcG9uc2UpOworCWNkZl9tZW1fY29weShyZXNwb25zZS0+Y2hhbm5lbF9zdGF0c19hcnJheSwKKwkJICAgICBwYXJhbV90bHZzLT5zdGF0c19wZXJfY2hhbm5lbF9saXN0LAorCQkgICAgIHJlc3BvbnNlLT5jaGFubmVsX3N0YXRzX2FycmF5X2xlbik7CisKKwltc2cudHlwZSA9IGVXTklfU01FX0RDQ19HRVRfU1RBVFNfUlNQOworCW1zZy5ib2R5cHRyID0gcmVzcG9uc2U7CisKKwljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1NNRSwgJm1zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJV01BX0xPR0UoRkwoIkZhaWxlZCB0byBwb3N0IG1zZyB0byBTTUUiKSk7CisJCWNkZl9tZW1fZnJlZShyZXNwb25zZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9kY2NfY2xlYXJfc3RhdHMoKSAtIGNvbW1hbmQgdG8gY2xlYXIgdGhlIERDQyBzdGF0cworICogQHdtYV9oYW5kbGU6IHBvaW50ZXIgdG8gdGhlIFdNQSBoYW5kbGUKKyAqIEBjbGVhcl9zdGF0c19wYXJhbTogcGFyYW1ldGVycyB0byB0aGUgY29tbWFuZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXMKKyAqLworaW50IHdtYV9kY2NfY2xlYXJfc3RhdHModHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJc3RydWN0IHNpcl9kY2NfY2xlYXJfc3RhdHMgKmNsZWFyX3N0YXRzX3BhcmFtKQoreworCWludDMyX3QgcmV0OworCXdtaV9kY2NfY2xlYXJfc3RhdHNfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50OF90ICpidWZfcHRyOworCXVpbnQzMl90IGxlbjsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFdNSSBjb21tYW5kICovCisJbGVuID0gc2l6ZW9mKCpjbWQpOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKEZMKCJ3bWlfYnVmX2FsbG9jIGZhaWxlZCIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYnVmX3B0ciA9IHdtaV9idWZfZGF0YShidWYpOworCWNkZl9tZW1femVybyhidWZfcHRyLCBsZW4pOworCisJLyogUG9wdWxhdGUgdGhlIFdNSSBjb21tYW5kICovCisJY21kID0gKHdtaV9kY2NfY2xlYXJfc3RhdHNfY21kX2ZpeGVkX3BhcmFtICopYnVmX3B0cjsKKworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfY2xlYXJfc3RhdHNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKAorCQkJICAgd21pX2RjY19jbGVhcl9zdGF0c19jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSBjbGVhcl9zdGF0c19wYXJhbS0+dmRldl9pZDsKKwljbWQtPmRjY19zdGF0c19iaXRtYXAgPSBjbGVhcl9zdGF0c19wYXJhbS0+ZGNjX3N0YXRzX2JpdG1hcDsKKworCS8qIFNlbmQgdGhlIFdNSSBjb21tYW5kICovCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX0RDQ19DTEVBUl9TVEFUU19DTURJRCk7CisJaWYgKHJldCAhPSBFT0spIHsKKwkJV01BX0xPR0UoRkwoIkZhaWxlZCB0byBzZW5kIHRoZSBXTUkgY29tbWFuZCIpKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9kY2NfdXBkYXRlX25kbCgpIC0gY29tbWFuZCB0byB1cGRhdGUgdGhlIE5ETCBkYXRhCisgKiBAd21hX2hhbmRsZTogcG9pbnRlciB0byB0aGUgV01BIGhhbmRsZQorICogQHVwZGF0ZV9uZGxfcGFyYW06IHBvaW50ZXIgdG8gdGhlIHJlcXVlc3QgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzCisgKi8KK2ludCB3bWFfZGNjX3VwZGF0ZV9uZGwodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkgICAgICAgc3RydWN0IHNpcl9kY2NfdXBkYXRlX25kbCAqdXBkYXRlX25kbF9wYXJhbSkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJd21pX2RjY191cGRhdGVfbmRsX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9kY2NfbmRsX2NoYW4gKm5kbF9jaGFuX2FycmF5OworCXdtaV9kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9jb25maWcgKm5kbF9hY3RpdmVfc3RhdGVfYXJyYXk7CisJdWludDMyX3QgYWN0aXZlX3N0YXRlX2NvdW50OworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50MzJfdCBsZW47CisJdWludDMyX3QgaTsKKworCS8qIHZhbGlkYXRlIHRoZSBpbnB1dCAqLworCWlmICh1cGRhdGVfbmRsX3BhcmFtLT5kY2NfbmRsX2NoYW5fbGlzdF9sZW4gIT0KKwkgICAgdXBkYXRlX25kbF9wYXJhbS0+Y2hhbm5lbF9jb3VudCAqIHNpemVvZigqbmRsX2NoYW5fYXJyYXkpKSB7CisJCVdNQV9MT0dFKEZMKCJJbnZhbGlkIHBhcmFtZXRlciIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJYWN0aXZlX3N0YXRlX2NvdW50ID0gMDsKKwluZGxfY2hhbl9hcnJheSA9IHVwZGF0ZV9uZGxfcGFyYW0tPmRjY19uZGxfY2hhbl9saXN0OworCWZvciAoaSA9IDA7IGkgPCB1cGRhdGVfbmRsX3BhcmFtLT5jaGFubmVsX2NvdW50OyBpKyspCisJCWFjdGl2ZV9zdGF0ZV9jb3VudCArPQorCQkJV01JX05ETF9OVU1fQUNUSVZFX1NUQVRFX0dFVCgmbmRsX2NoYW5fYXJyYXlbaV0pOworCWlmICh1cGRhdGVfbmRsX3BhcmFtLT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0X2xlbiAhPQorCSAgICBhY3RpdmVfc3RhdGVfY291bnQgKiBzaXplb2YoKm5kbF9hY3RpdmVfc3RhdGVfYXJyYXkpKSB7CisJCVdNQV9MT0dFKEZMKCJJbnZhbGlkIHBhcmFtZXRlciIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBXTUkgY29tbWFuZCAqLworCWxlbiA9IHNpemVvZigqY21kKSArCisJCVdNSV9UTFZfSERSX1NJWkUgKyB1cGRhdGVfbmRsX3BhcmFtLT5kY2NfbmRsX2NoYW5fbGlzdF9sZW4gKworCQlXTUlfVExWX0hEUl9TSVpFICsKKwkJdXBkYXRlX25kbF9wYXJhbS0+ZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdF9sZW47CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoRkwoIndtaV9idWZfYWxsb2MgZmFpbGVkIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlidWZfcHRyID0gd21pX2J1Zl9kYXRhKGJ1Zik7CisJY2RmX21lbV96ZXJvKGJ1Zl9wdHIsIGxlbik7CisKKwkvKiBQb3B1bGF0ZSB0aGUgV01JIGNvbW1hbmQgKi8KKwljbWQgPSAod21pX2RjY191cGRhdGVfbmRsX2NtZF9maXhlZF9wYXJhbSAqKWJ1Zl9wdHI7CisJYnVmX3B0ciArPSBzaXplb2YoKmNtZCk7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfZGNjX3VwZGF0ZV9uZGxfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKAorCQkJICAgd21pX2RjY191cGRhdGVfbmRsX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHVwZGF0ZV9uZGxfcGFyYW0tPnZkZXZfaWQ7CisJY21kLT5udW1fY2hhbm5lbCA9IHVwZGF0ZV9uZGxfcGFyYW0tPmNoYW5uZWxfY291bnQ7CisKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkgICAgICAgdXBkYXRlX25kbF9wYXJhbS0+ZGNjX25kbF9jaGFuX2xpc3RfbGVuKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisKKwluZGxfY2hhbl9hcnJheSA9ICh3bWlfZGNjX25kbF9jaGFuICopYnVmX3B0cjsKKwljZGZfbWVtX2NvcHkobmRsX2NoYW5fYXJyYXksIHVwZGF0ZV9uZGxfcGFyYW0tPmRjY19uZGxfY2hhbl9saXN0LAorCQkgICAgIHVwZGF0ZV9uZGxfcGFyYW0tPmRjY19uZGxfY2hhbl9saXN0X2xlbik7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+bnVtX2NoYW5uZWw7IGkrKykKKwkJV01JVExWX1NFVF9IRFIoJm5kbF9jaGFuX2FycmF5W2ldLnRsdl9oZWFkZXIsCisJCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfbmRsX2NoYW4sCisJCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oCisJCQkgICAgd21pX2RjY19uZGxfY2hhbikpOworCWJ1Zl9wdHIgKz0gdXBkYXRlX25kbF9wYXJhbS0+ZGNjX25kbF9jaGFuX2xpc3RfbGVuOworCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJICAgICAgIHVwZGF0ZV9uZGxfcGFyYW0tPmRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3RfbGVuKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisKKwluZGxfYWN0aXZlX3N0YXRlX2FycmF5ID0gKHdtaV9kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9jb25maWcgKikgYnVmX3B0cjsKKwljZGZfbWVtX2NvcHkobmRsX2FjdGl2ZV9zdGF0ZV9hcnJheSwKKwkJICAgICB1cGRhdGVfbmRsX3BhcmFtLT5kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9saXN0LAorCQkgICAgIHVwZGF0ZV9uZGxfcGFyYW0tPmRjY19uZGxfYWN0aXZlX3N0YXRlX2xpc3RfbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX3N0YXRlX2NvdW50OyBpKyspIHsKKwkJV01JVExWX1NFVF9IRFIoJm5kbF9hY3RpdmVfc3RhdGVfYXJyYXlbaV0udGx2X2hlYWRlciwKKwkJCVdNSVRMVl9UQUdfU1RSVUNfd21pX2RjY19uZGxfYWN0aXZlX3N0YXRlX2NvbmZpZywKKwkJCVdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTigKKwkJCSAgICB3bWlfZGNjX25kbF9hY3RpdmVfc3RhdGVfY29uZmlnKSk7CisJfQorCWJ1Zl9wdHIgKz0gdXBkYXRlX25kbF9wYXJhbS0+ZGNjX25kbF9hY3RpdmVfc3RhdGVfbGlzdF9sZW47CisKKwkvKiBTZW5kIHRoZSBXTUkgY29tbWFuZCAqLworCWNkZl9zdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfRENDX1VQREFURV9ORExfQ01ESUQpOworCS8qIElmIHRoZXJlIGlzIGFuIGVycm9yLCBzZXQgdGhlIGNvbXBsZXRpb24gZXZlbnQgKi8KKwlpZiAoY2RmX3N0YXR1cykgeworCQlXTUFfTE9HRShGTCgiRmFpbGVkIHRvIHNlbmQgV01JIG1lc3NhZ2U6ICVkIiksIGNkZl9zdGF0dXMpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX2RjY191cGRhdGVfbmRsX3Jlc3BfZXZlbnRfaGFuZGxlcigpIC0gUmVzcG9uc2UgZXZlbnQgZm9yIHRoZSB1cGRhdGUgTkRMCisgKiBjb21tYW5kCisgKiBAaGFuZGxlOiB0aGUgV01BIGhhbmRsZQorICogQGV2ZW50X2J1ZjogYnVmZmVyIHdpdGggdGhlIGV2ZW50IHBhcmFtZXRlcnMKKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgYnVmZmVyCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MKKyAqLworaW50IHdtYV9kY2NfdXBkYXRlX25kbF9yZXNwX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudF9idWYsCisJCQkJCSAgdWludDMyX3QgbGVuKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwlzdHJ1Y3Qgc2lyX2RjY191cGRhdGVfbmRsX3Jlc3BvbnNlICpyZXNwOworCVdNSV9EQ0NfVVBEQVRFX05ETF9SRVNQX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fdGx2czsKKwl3bWlfZGNjX3VwZGF0ZV9uZGxfcmVzcF9ldmVudF9maXhlZF9wYXJhbSAqZml4X3BhcmFtOworCWNkc19tc2dfdCBtc2cgPSB7MH07CisKKwlwYXJhbV90bHZzID0gKFdNSV9EQ0NfVVBEQVRFX05ETF9SRVNQX0VWRU5USURfcGFyYW1fdGx2cyAqKWV2ZW50X2J1ZjsKKwlmaXhfcGFyYW0gPSBwYXJhbV90bHZzLT5maXhlZF9wYXJhbTsKKwkvKiBBbGxvY2F0ZSBhbmQgcG9wdWxhdGUgdGhlIHJlc3BvbnNlICovCisJcmVzcCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcmVzcCkpOworCWlmICghcmVzcCkgeworCQlXTUFfTE9HRShGTCgiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIHRoZSByZXNwb25zZS4iKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXNwLT52ZGV2X2lkID0gZml4X3BhcmFtLT52ZGV2X2lkOworCXJlc3AtPnN0YXR1cyA9IGZpeF9wYXJhbS0+c3RhdHVzOworCisJbXNnLnR5cGUgPSBlV05JX1NNRV9EQ0NfVVBEQVRFX05ETF9SU1A7CisJbXNnLmJvZHlwdHIgPSByZXNwOworCisJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9TTUUsICZtc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQl7CisJCVdNQV9MT0dFKEZMKCJGYWlsZWQgdG8gcG9zdCBtc2cgdG8gU01FIikpOworCQljZGZfbWVtX2ZyZWUocmVzcCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9kY2Nfc3RhdHNfZXZlbnRfaGFuZGxlcigpIC0gUmVzcG9uc2UgZXZlbnQgZm9yIHRoZSBnZXQgc3RhdHMgY21kCisgKiBAaGFuZGxlOiB0aGUgV01BIGhhbmRsZQorICogQGV2ZW50X2J1ZjogYnVmZmVyIHdpdGggdGhlIGV2ZW50IHBhcmFtZXRlcnMKKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgYnVmZmVyCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MKKyAqLworaW50IHdtYV9kY2Nfc3RhdHNfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50X2J1ZiwKKwkJCQl1aW50MzJfdCBsZW4pCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXN0cnVjdCBzaXJfZGNjX2dldF9zdGF0c19yZXNwb25zZSAqcmVzcG9uc2U7CisJV01JX0RDQ19TVEFUU19FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX3RsdnM7CisJd21pX2RjY19zdGF0c19ldmVudF9maXhlZF9wYXJhbSAqZml4X3BhcmFtOworCWNkc19tc2dfdCBtc2cgPSB7MH07CisKKwlwYXJhbV90bHZzID0gKFdNSV9EQ0NfU1RBVFNfRVZFTlRJRF9wYXJhbV90bHZzICopZXZlbnRfYnVmOworCWZpeF9wYXJhbSA9IHBhcmFtX3RsdnMtPmZpeGVkX3BhcmFtOworCS8qIEFsbG9jYXRlIGFuZCBwb3B1bGF0ZSB0aGUgcmVzcG9uc2UgKi8KKwlyZXNwb25zZSA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqcmVzcG9uc2UpICsKKwkgICAgZml4X3BhcmFtLT5udW1fY2hhbm5lbHMgKiBzaXplb2Yod21pX2RjY19uZGxfc3RhdHNfcGVyX2NoYW5uZWwpKTsKKwlpZiAocmVzcG9uc2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmVzcG9uc2UtPnZkZXZfaWQgPSBmaXhfcGFyYW0tPnZkZXZfaWQ7CisJcmVzcG9uc2UtPm51bV9jaGFubmVscyA9IGZpeF9wYXJhbS0+bnVtX2NoYW5uZWxzOworCXJlc3BvbnNlLT5jaGFubmVsX3N0YXRzX2FycmF5X2xlbiA9CisJCWZpeF9wYXJhbS0+bnVtX2NoYW5uZWxzICogc2l6ZW9mKHdtaV9kY2NfbmRsX3N0YXRzX3Blcl9jaGFubmVsKTsKKwlyZXNwb25zZS0+Y2hhbm5lbF9zdGF0c19hcnJheSA9ICgodm9pZCAqKXJlc3BvbnNlKSArIHNpemVvZigqcmVzcG9uc2UpOworCWNkZl9tZW1fY29weShyZXNwb25zZS0+Y2hhbm5lbF9zdGF0c19hcnJheSwKKwkJICAgICBwYXJhbV90bHZzLT5zdGF0c19wZXJfY2hhbm5lbF9saXN0LAorCQkgICAgIHJlc3BvbnNlLT5jaGFubmVsX3N0YXRzX2FycmF5X2xlbik7CisKKwltc2cudHlwZSA9IGVXTklfU01FX0RDQ19TVEFUU19FVkVOVDsKKwltc2cuYm9keXB0ciA9IHJlc3BvbnNlOworCisJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9TTUUsICZtc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKQl7CisJCVdNQV9MT0dFKEZMKCJGYWlsZWQgdG8gcG9zdCBtc2cgdG8gU01FIikpOworCQljZGZfbWVtX2ZyZWUocmVzcG9uc2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfb2NiX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXJzKCkgLSByZWdpc3RlciBoYW5kbGVycyBmb3IgdGhlIE9DQiBXTUkKKyAqIGV2ZW50cworICogQHdtYV9oYW5kbGU6IHBvaW50ZXIgdG8gdGhlIFdNQSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZQorICovCitpbnQgd21hX29jYl9yZWdpc3Rlcl9ldmVudF9oYW5kbGVycyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpCit7CisJaW50IHN0YXR1czsKKworCWlmICghd21hX2hhbmRsZSkgeworCQlXTUFfTE9HRShGTCgid21hX2hhbmRsZSBpcyBOVUxMIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBtZW1iZXJzIGluIFdNQSB1c2VkIGJ5IHdtYV9vY2IgKi8KKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQlXTUlfT0NCX1NFVF9DT05GSUdfUkVTUF9FVkVOVElELAorCQkJd21hX29jYl9zZXRfY29uZmlnX2V2ZW50X2hhbmRsZXIpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKAorCQkJd21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCVdNSV9PQ0JfR0VUX1RTRl9USU1FUl9SRVNQX0VWRU5USUQsCisJCQl3bWFfb2NiX2dldF90c2ZfdGltZXJfcmVzcF9ldmVudF9oYW5kbGVyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcigKKwkJCXdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQlXTUlfRENDX0dFVF9TVEFUU19SRVNQX0VWRU5USUQsCisJCQl3bWFfZGNjX2dldF9zdGF0c19yZXNwX2V2ZW50X2hhbmRsZXIpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKAorCQkJd21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCVdNSV9EQ0NfVVBEQVRFX05ETF9SRVNQX0VWRU5USUQsCisJCQl3bWFfZGNjX3VwZGF0ZV9uZGxfcmVzcF9ldmVudF9oYW5kbGVyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJc3RhdHVzID0gd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJV01JX0RDQ19TVEFUU19FVkVOVElELAorCQkJd21hX2RjY19zdGF0c19ldmVudF9oYW5kbGVyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmUvd21hL3NyYy93bWFfb2NiLmggYi9jb3JlL3dtYS9zcmMvd21hX29jYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZTVhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dtYS9zcmMvd21hX29jYi5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fV01BX09DQl9ICisjZGVmaW5lIF9fV01BX09DQl9ICisKKyNpbmNsdWRlICJ3bWEuaCIKKyNpbmNsdWRlICJzaXJfYXBpLmgiCisKK2ludCB3bWFfb2NiX3NldF9jb25maWdfcmVzcCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsIHVpbnQ4X3Qgc3RhdHVzKTsKKworaW50IHdtYV9vY2Jfc2V0X2NvbmZpZ19yZXEodHBfd21hX2hhbmRsZSBoYW5kbGUsCisJCQkgICBzdHJ1Y3Qgc2lyX29jYl9jb25maWcgKmNvbmZpZ19yZXEpOworCitpbnQgd21hX29jYl9zZXRfY29uZmlnX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudF9idWYsCisJCQkJICAgICB1aW50MzJfdCBsZW4pOworCitpbnQgd21hX29jYl9zdGFydF9yZXNwX2luZF9jb250KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSk7CisKK2ludCB3bWFfb2NiX3NldF9jb25maWcodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLCBzdHJ1Y3Qgc2lyX29jYl9jb25maWcgKmNvbmZpZyk7CisKK2ludCB3bWFfb2NiX3NldF91dGNfdGltZSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsIHN0cnVjdCBzaXJfb2NiX3V0YyAqdXRjKTsKKworaW50IHdtYV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJc3RydWN0IHNpcl9vY2JfdGltaW5nX2FkdmVydCAqdGltaW5nX2FkdmVydCk7CisKK2ludCB3bWFfb2NiX3N0b3BfdGltaW5nX2FkdmVydCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkgICAgICAgc3RydWN0IHNpcl9vY2JfdGltaW5nX2FkdmVydCAqdGltaW5nX2FkdmVydCk7CisKK2ludCB3bWFfb2NiX2dldF90c2ZfdGltZXIodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJICBzdHJ1Y3Qgc2lyX29jYl9nZXRfdHNmX3RpbWVyICpyZXF1ZXN0KTsKKworaW50IHdtYV9kY2NfZ2V0X3N0YXRzKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJICAgICAgc3RydWN0IHNpcl9kY2NfZ2V0X3N0YXRzICpnZXRfc3RhdHNfcGFyYW0pOworCitpbnQgd21hX2RjY19jbGVhcl9zdGF0cyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQlzdHJ1Y3Qgc2lyX2RjY19jbGVhcl9zdGF0cyAqY2xlYXJfc3RhdHNfcGFyYW0pOworCitpbnQgd21hX2RjY191cGRhdGVfbmRsKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJICAgICAgIHN0cnVjdCBzaXJfZGNjX3VwZGF0ZV9uZGwgKnVwZGF0ZV9uZGxfcGFyYW0pOworCitpbnQgd21hX29jYl9yZWdpc3Rlcl9ldmVudF9oYW5kbGVycyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpOworCisjZW5kaWYgLyogX19XTUFfT0NCX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvd21hL3NyYy93bWFfcG93ZXIuYyBiL2NvcmUvd21hL3NyYy93bWFfcG93ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWU3OTc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS93bWEvc3JjL3dtYV9wb3dlci5jCkBAIC0wLDAgKzEsMjI1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiAgRE9DOiAgICB3bWFfcG93ZXIuYworICogIFRoaXMgZmlsZSBjb250YWlucyBwb3dlcnNhdmUgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworLyogSGVhZGVyIGZpbGVzICovCisKKyNpbmNsdWRlICJ3bWEuaCIKKyNpbmNsdWRlICJ3bWFfYXBpLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgIndtaV91bmlmaWVkX2FwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3N5cy5oIgorI2luY2x1ZGUgInduaV9hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAid21pX3VuaWZpZWQuaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgIm9sX3R4cnhfY3RybF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3RndF9kZWZfY29uZmlnLmgiCisKKyNpbmNsdWRlICJjZGZfbmJ1Zi5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgIm9sX3R4cnhfYXBpLmgiCisjaW5jbHVkZSAiY2RmX21lbW9yeS5oIgorI2luY2x1ZGUgIm9sX3R4cnhfdHlwZXMuaCIKKyNpbmNsdWRlICJvbF90eHJ4X3BlZXJfZmluZC5oIgorCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX2FwaS5oIgorI2luY2x1ZGUgImxpbV9zZXNzaW9uX3V0aWxzLmgiCisKKyNpbmNsdWRlICJjZHNfdXRpbHMuaCIKKworI2lmICFkZWZpbmVkKFJFTU9WRV9QS1RfTE9HKQorI2luY2x1ZGUgInBrdGxvZ19hYy5oIgorI2VuZGlmIC8qIFJFTU9WRV9QS1RfTE9HICovCisKKyNpbmNsdWRlICJkYmdsb2dfaG9zdC5oIgorI2luY2x1ZGUgImNzcl9hcGkuaCIKKyNpbmNsdWRlICJvbF9mdy5oIgorCisjaW5jbHVkZSAiZGZzLmgiCisjaW5jbHVkZSAid21hX2ludGVybmFsLmgiCisKKy8qKgorICogd21pX3VuaWZpZWRfbW9kZW1fcG93ZXJfc3RhdGUoKSAtIHNldCBtb2RlbSBwb3dlciBzdGF0ZSB0byBmdworICogQHdtaV9oYW5kbGU6IHdtaSBoYW5kbGUKKyAqIEBwYXJhbV92YWx1ZTogcGFyYW1ldGVyIHZhbHVlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludAord21pX3VuaWZpZWRfbW9kZW1fcG93ZXJfc3RhdGUod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCB1aW50MzJfdCBwYXJhbV92YWx1ZSkKK3sKKwlpbnQgcmV0OworCXdtaV9tb2RlbV9wb3dlcl9zdGF0ZV9jbWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQxNl90IGxlbiA9IHNpemVvZigqY21kKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6d21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljbWQgPSAod21pX21vZGVtX3Bvd2VyX3N0YXRlX2NtZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfbW9kZW1fcG93ZXJfc3RhdGVfY21kX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9tb2RlbV9wb3dlcl9zdGF0ZV9jbWRfcGFyYW0pKTsKKwljbWQtPm1vZGVtX3Bvd2VyX3N0YXRlID0gcGFyYW1fdmFsdWU7CisJV01BX0xPR0QoIiVzOiBTZXR0aW5nIGNtZC0+bW9kZW1fcG93ZXJfc3RhdGUgPSAldSIsIF9fZnVuY19fLAorCQkgcGFyYW1fdmFsdWUpOworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgICAgV01JX01PREVNX1BPV0VSX1NUQVRFX0NNRElEKTsKKwlpZiAocmV0ICE9IEVPSykgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgbm90aWZ5IGNtZCByZXQgPSAlZCIsIHJldCk7CisJCXdtaV9idWZfZnJlZShidWYpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0oKSAtIHNldCBzdGEgcG93ZXIgc2F2ZSBwYXJhbWV0ZXIgdG8gZncKKyAqIEB3bWlfaGFuZGxlOiB3bWkgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHBhcmFtOiBwYXJhbQorICogQHZhbHVlOiBwYXJhbWV0ZXIgdmFsdWUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAqLworaW50MzJfdCB3bWlfdW5pZmllZF9zZXRfc3RhX3BzX3BhcmFtKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCQkJICAgIHVpbnQzMl90IHZkZXZfaWQsIHVpbnQzMl90IHBhcmFtLAorCQkJCQkgICAgdWludDMyX3QgdmFsdWUpCit7CisJd21pX3N0YV9wb3dlcnNhdmVfcGFyYW1fY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQzMl90IGxlbiA9IHNpemVvZigqY21kKTsKKwl0cF93bWFfaGFuZGxlIHdtYTsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaWZhY2U7CisKKwl3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmIChOVUxMID09IHdtYSkgeworCQlXTUFfTE9HRSgiJXM6IHdtYSBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWZhY2UgPSAmd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdOworCisJV01BX0xPR0QoIlNldCBTdGEgUHMgcGFyYW0gdmRldklkICVkIFBhcmFtICVkIHZhbCAlZCIsCisJCSB2ZGV2X2lkLCBwYXJhbSwgdmFsdWUpOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dQKCIlczogU2V0IFN0YSBQcyBwYXJhbSBNZW0gQWxsb2MgRmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljbWQgPSAod21pX3N0YV9wb3dlcnNhdmVfcGFyYW1fY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfcG93ZXJzYXZlX3BhcmFtX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfc3RhX3Bvd2Vyc2F2ZV9wYXJhbV9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSB2ZGV2X2lkOworCWNtZC0+cGFyYW0gPSBwYXJhbTsKKwljbWQtPnZhbHVlID0gdmFsdWU7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJIFdNSV9TVEFfUE9XRVJTQVZFX1BBUkFNX0NNRElEKSkgeworCQlXTUFfTE9HRSgiU2V0IFN0YSBQcyBwYXJhbSBGYWlsZWQgdmRldklkICVkIFBhcmFtICVkIHZhbCAlZCIsCisJCQkgdmRldl9pZCwgcGFyYW0sIHZhbHVlKTsKKwkJY2RmX25idWZfZnJlZShidWYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLyogU3RvcmUgdGhlIFBTIFN0YXR1cyAqLworCWlmYWNlLT5wc19lbmFibGVkID0gdmFsdWUgPyB0cnVlIDogZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBRQ0FfSUJTU19TVVBQT1JUCisvKioKKyAqIHdtYV9zZXRfaWJzc19wd3JzYXZlX3BhcmFtcygpIC0gc2V0IGlic3MgcG93ZXIgc2F2ZSBwYXJhbWV0ZXIgdG8gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCisgKi8KK0NERl9TVEFUVVMKK3dtYV9zZXRfaWJzc19wd3JzYXZlX3BhcmFtcyh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwKKwkJCVdNSV9WREVWX1BBUkFNX0FUSU1fV0lORE9XX0xFTkdUSCwKKwkJCXdtYS0+d21hX2lic3NfcG93ZXJfc2F2ZV9wYXJhbXMuYXRpbVdpbmRvd0xlbmd0aCk7CisJaWYgKHJldCA8IDApIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXQgV01JX1ZERVZfUEFSQU1fQVRJTV9XSU5ET1dfTEVOR1RIIHJldCA9ICVkIiwKKwkJCXJldCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwKKwkJCVdNSV9WREVWX1BBUkFNX0lTX0lCU1NfUE9XRVJfU0FWRV9BTExPV0VELAorCQkJd21hLT53bWFfaWJzc19wb3dlcl9zYXZlX3BhcmFtcy5pc1Bvd2VyU2F2ZUFsbG93ZWQpOworCWlmIChyZXQgPCAwKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQsIHNldCBXTUlfVkRFVl9QQVJBTV9JU19JQlNTX1BPV0VSX1NBVkVfQUxMT1dFRCByZXQ9JWQiLAorCQkJcmV0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJV01JX1ZERVZfUEFSQU1fSVNfUE9XRVJfQ09MTEFQU0VfQUxMT1dFRCwKKwkJCXdtYS0+d21hX2lic3NfcG93ZXJfc2F2ZV9wYXJhbXMuaXNQb3dlckNvbGxhcHNlQWxsb3dlZCk7CisJaWYgKHJldCA8IDApIHsKKwkJV01BX0xPR0UoIkZhaWxlZCwgc2V0IFdNSV9WREVWX1BBUkFNX0lTX1BPV0VSX0NPTExBUFNFX0FMTE9XRUQgcmV0PSVkIiwKKwkJCXJldCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwKKwkJCSBXTUlfVkRFVl9QQVJBTV9JU19BV0FLRV9PTl9UWFJYX0VOQUJMRUQsCisJCQkgd21hLT53bWFfaWJzc19wb3dlcl9zYXZlX3BhcmFtcy5pc0F3YWtlb25UeFJ4RW5hYmxlZCk7CisJaWYgKHJldCA8IDApIHsKKwkJV01BX0xPR0UoIkZhaWxlZCwgc2V0IFdNSV9WREVWX1BBUkFNX0lTX0FXQUtFX09OX1RYUlhfRU5BQkxFRCByZXQ9JWQiLAorCQkJcmV0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJV01JX1ZERVZfUEFSQU1fSU5BQ1RJVklUWV9DTlQsCisJCQl3bWEtPndtYV9pYnNzX3Bvd2VyX3NhdmVfcGFyYW1zLmluYWN0aXZpdHlDb3VudCk7CisJaWYgKHJldCA8IDApIHsKKwkJV01BX0xPR0UoIkZhaWxlZCwgc2V0IFdNSV9WREVWX1BBUkFNX0lOQUNUSVZJVFlfQ05UIHJldD0lZCIsCisJCQkgcmV0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJV01JX1ZERVZfUEFSQU1fVFhTUF9FTkRfSU5BQ1RJVklUWV9USU1FX01TLAorCQkJd21hLT53bWFfaWJzc19wb3dlcl9zYXZlX3BhcmFtcy50eFNQRW5kSW5hY3Rpdml0eVRpbWUpOworCWlmIChyZXQgPCAwKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQsIHNldCBXTUlfVkRFVl9QQVJBTV9UWFNQX0VORF9JTkFDVElWSVRZX1RJTUVfTVMgcmV0PSVkIiwKKwkJCXJldCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwKKwkJCVdNSV9WREVWX1BBUkFNX0lCU1NfUFNfV0FSTVVQX1RJTUVfU0VDUywKKwkJCXdtYS0+d21hX2lic3NfcG93ZXJfc2F2ZV9wYXJhbXMuaWJzc1BzV2FybXVwVGltZSk7CisJaWYgKHJldCA8IDApIHsKKwkJV01BX0xPR0UoIkZhaWxlZCwgc2V0IFdNSV9WREVWX1BBUkFNX0lCU1NfUFNfV0FSTVVQX1RJTUVfU0VDUyByZXQ9JWQiLAorCQkJcmV0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJV01JX1ZERVZfUEFSQU1fSUJTU19QU18xUlhfQ0hBSU5fSU5fQVRJTV9XSU5ET1dfRU5BQkxFLAorCQkJd21hLT53bWFfaWJzc19wb3dlcl9zYXZlX3BhcmFtcy5pYnNzUHMxUnhDaGFpbkluQXRpbUVuYWJsZSk7CisJaWYgKHJldCA8IDApIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXQgSUJTU19QU18xUlhfQ0hBSU5fSU5fQVRJTV9XSU5ET1dfRU5BQkxFIHJldD0lZCIsCisJCQlyZXQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBRQ0FfSUJTU19TVVBQT1JUICovCisKKy8qKgorICogd21pX3VuaWZpZWRfc2V0X2FwX3BzX3BhcmFtKCkgLSBzZXQgYXAgcG93ZXJzYXZlIHBhcmFtZXRlcnMKKyAqIEB3bWFfY3R4OiB3bWEgY29udGV4dAorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBwZWVyX2FkZHI6IHBlZXIgbWFjIGFkZHJlc3MKKyAqIEBwYXJhbTogcGFyYW1ldGVyCisgKiBAdmFsdWU6IHByYW1ldGVyIHZhbHVlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludDMyX3Qgd21pX3VuaWZpZWRfc2V0X2FwX3BzX3BhcmFtKHZvaWQgKndtYV9jdHgsIHVpbnQzMl90IHZkZXZfaWQsCisJCQkJCSAgIHVpbnQ4X3QgKnBlZXJfYWRkciwgdWludDMyX3QgcGFyYW0sCisJCQkJCSAgIHVpbnQzMl90IHZhbHVlKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSB3bWFfY3R4OworCXdtaV9hcF9wc19wZWVyX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBlcnI7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIHNpemVvZigqY21kKSk7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgdG8gc2VuZCBzZXRfYXBfcHNfcGFyYW0gY21kIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljbWQgPSAod21pX2FwX3BzX3BlZXJfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hcF9wc19wZWVyX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfYXBfcHNfcGVlcl9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSB2ZGV2X2lkOworCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKHBlZXJfYWRkciwgJmNtZC0+cGVlcl9tYWNhZGRyKTsKKwljbWQtPnBhcmFtID0gcGFyYW07CisJY21kLT52YWx1ZSA9IHZhbHVlOworCWVyciA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgICBzaXplb2YoKmNtZCksIFdNSV9BUF9QU19QRUVSX1BBUkFNX0NNRElEKTsKKwlpZiAoZXJyKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCBzZXRfYXBfcHNfcGFyYW0gY21kIik7CisJCWNkZl9tZW1fZnJlZShidWYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX3NldF9hcF9wZWVyX3VhcHNkKCkgLSBzZXQgcG93ZXJzYXZlIHBhcmFtZXRlcnMgaW4gYXAgbW9kZSB0byBmdworICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBwZWVyX2FkZHI6IHBlZXIgbWFjIGFkZHJlc3MKKyAqIEB1YXBzZF92YWx1ZTogdWFwc2QgdmFsdWUKKyAqIEBtYXhfc3A6IG1heGltdW0gc2VydmljZSBwZXJpb2QKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAqLworaW50MzJfdCB3bWFfc2V0X2FwX3BlZXJfdWFwc2QodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQzMl90IHZkZXZfaWQsCisJCQkgICAgICB1aW50OF90ICpwZWVyX2FkZHIsIHVpbnQ4X3QgdWFwc2RfdmFsdWUsCisJCQkgICAgICB1aW50OF90IG1heF9zcCkKK3sKKwl1aW50MzJfdCB1YXBzZCA9IDA7CisJdWludDMyX3QgbWF4X3NwX2xlbiA9IDA7CisJaW50MzJfdCByZXQgPSAwOworCisJaWYgKHVhcHNkX3ZhbHVlICYgVUFQU0RfVk9fRU5BQkxFRCkgeworCQl1YXBzZCB8PSBXTUlfQVBfUFNfVUFQU0RfQUMzX0RFTElWRVJZX0VOIHwKKwkJCSBXTUlfQVBfUFNfVUFQU0RfQUMzX1RSSUdHRVJfRU47CisJfQorCisJaWYgKHVhcHNkX3ZhbHVlICYgVUFQU0RfVklfRU5BQkxFRCkgeworCQl1YXBzZCB8PSBXTUlfQVBfUFNfVUFQU0RfQUMyX0RFTElWRVJZX0VOIHwKKwkJCSBXTUlfQVBfUFNfVUFQU0RfQUMyX1RSSUdHRVJfRU47CisJfQorCisJaWYgKHVhcHNkX3ZhbHVlICYgVUFQU0RfQktfRU5BQkxFRCkgeworCQl1YXBzZCB8PSBXTUlfQVBfUFNfVUFQU0RfQUMxX0RFTElWRVJZX0VOIHwKKwkJCSBXTUlfQVBfUFNfVUFQU0RfQUMxX1RSSUdHRVJfRU47CisJfQorCisJaWYgKHVhcHNkX3ZhbHVlICYgVUFQU0RfQkVfRU5BQkxFRCkgeworCQl1YXBzZCB8PSBXTUlfQVBfUFNfVUFQU0RfQUMwX0RFTElWRVJZX0VOIHwKKwkJCSBXTUlfQVBfUFNfVUFQU0RfQUMwX1RSSUdHRVJfRU47CisJfQorCisJc3dpdGNoIChtYXhfc3ApIHsKKwljYXNlIFVBUFNEX01BWF9TUF9MRU5fMjoKKwkJbWF4X3NwX2xlbiA9IFdNSV9BUF9QU19QRUVSX1BBUkFNX01BWF9TUF8yOworCQlicmVhazsKKwljYXNlIFVBUFNEX01BWF9TUF9MRU5fNDoKKwkJbWF4X3NwX2xlbiA9IFdNSV9BUF9QU19QRUVSX1BBUkFNX01BWF9TUF80OworCQlicmVhazsKKwljYXNlIFVBUFNEX01BWF9TUF9MRU5fNjoKKwkJbWF4X3NwX2xlbiA9IFdNSV9BUF9QU19QRUVSX1BBUkFNX01BWF9TUF82OworCQlicmVhazsKKwlkZWZhdWx0OgorCQltYXhfc3BfbGVuID0gV01JX0FQX1BTX1BFRVJfUEFSQU1fTUFYX1NQX1VOTElNSVRFRDsKKwkJYnJlYWs7CisJfQorCisJV01BX0xPR0QoIlNldCBXTUlfQVBfUFNfUEVFUl9QQVJBTV9VQVBTRCAweCV4IGZvciAlcE0iLAorCQkgdWFwc2QsIHBlZXJfYWRkcik7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9zZXRfYXBfcHNfcGFyYW0od21hLCB2ZGV2X2lkLAorCQkJCQkgIHBlZXJfYWRkciwKKwkJCQkJICBXTUlfQVBfUFNfUEVFUl9QQVJBTV9VQVBTRCwgdWFwc2QpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZXQgV01JX0FQX1BTX1BFRVJfUEFSQU1fVUFQU0QgZm9yICVwTSIsCisJCQkgcGVlcl9hZGRyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlXTUFfTE9HRCgiU2V0IFdNSV9BUF9QU19QRUVSX1BBUkFNX01BWF9TUCAweCV4IGZvciAlcE0iLAorCQkgbWF4X3NwX2xlbiwgcGVlcl9hZGRyKTsKKworCXJldCA9IHdtaV91bmlmaWVkX3NldF9hcF9wc19wYXJhbSh3bWEsIHZkZXZfaWQsCisJCQkJCSAgcGVlcl9hZGRyLAorCQkJCQkgIFdNSV9BUF9QU19QRUVSX1BBUkFNX01BWF9TUCwKKwkJCQkJICBtYXhfc3BfbGVuKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2V0IFdNSV9BUF9QU19QRUVSX1BBUkFNX01BWF9TUCBmb3IgJXBNIiwKKwkJCSBwZWVyX2FkZHIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfdXBkYXRlX2VkY2FfcGFyYW1zX2Zvcl9hYygpIC0gdG8gdXBkYXRlIHBlciBhYyBFRENBIHBhcmFtZXRlcnMKKyAqIEBlZGNhX3BhcmFtOiBFRENBIHBhcmFtZXRlcnMKKyAqIEB3bW1fcGFyYW06IHdtbSBwYXJhbWV0ZXJzCisgKiBAYWM6IGFjY2VzcyBjYXRlZ29yeQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV91cGRhdGVfZWRjYV9wYXJhbXNfZm9yX2FjKHRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgKmVkY2FfcGFyYW0sCisJCQkJICAgd21pX3dtbV92cGFyYW1zICp3bW1fcGFyYW0sIGludCBhYykKK3sKKyNkZWZpbmUgV01BX1dNTV9FWFBPX1RPX1ZBTCh2YWwpICAgICAgICAoKDEgPDwgKHZhbCkpIC0gMSkKKwl3bW1fcGFyYW0tPmN3bWluID0gV01BX1dNTV9FWFBPX1RPX1ZBTChlZGNhX3BhcmFtLT5jdy5taW4pOworCXdtbV9wYXJhbS0+Y3dtYXggPSBXTUFfV01NX0VYUE9fVE9fVkFMKGVkY2FfcGFyYW0tPmN3Lm1heCk7CisJd21tX3BhcmFtLT5haWZzID0gZWRjYV9wYXJhbS0+YWNpLmFpZnNuOworCXdtbV9wYXJhbS0+dHhvcGxpbWl0ID0gZWRjYV9wYXJhbS0+dHhvcGxpbWl0OworCXdtbV9wYXJhbS0+YWNtID0gZWRjYV9wYXJhbS0+YWNpLmFjbTsKKworCS8qIFRPRE86IE5vIGFjayBpcyBub3QgcHJlc2VudCBpbiBFZGNhUGFyYW1SZWNvcmQgKi8KKwl3bW1fcGFyYW0tPm5vX2FjayA9IDA7CisKKwlXTUFfTE9HSSgiV01NIFBBUkFNUyBBQ1slZF06IEFJRlMgJWQgTWluICVkIE1heCAlZCBUWE9QICVkIEFDTSAlZCBOT0FDSyAlZCIsCisJCWFjLCB3bW1fcGFyYW0tPmFpZnMsIHdtbV9wYXJhbS0+Y3dtaW4sIHdtbV9wYXJhbS0+Y3dtYXgsCisJCXdtbV9wYXJhbS0+dHhvcGxpbWl0LCB3bW1fcGFyYW0tPmFjbSwgd21tX3BhcmFtLT5ub19hY2spOworfQorCisvKioKKyAqIHdtYV9zZXRfdHhfcG93ZXIoKSAtIHNldCB0eCBwb3dlciBsaW1pdCBpbiBmdworICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQHR4X3B3cl9wYXJhbXM6IHR4IHBvd2VyIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfc2V0X3R4X3Bvd2VyKFdNQV9IQU5ETEUgaGFuZGxlLAorCQkgICAgICB0TWF4VHhQb3dlclBhcmFtcyAqdHhfcHdyX3BhcmFtcykKK3sKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCXVpbnQ4X3QgdmRldl9pZDsKKwlpbnQgcmV0ID0gLTE7CisJdm9pZCAqcGRldjsKKworCWlmICh0eF9wd3JfcGFyYW1zLT5kZXZfbW9kZSA9PSBDREZfU0FQX01PREUgfHwKKwkgICAgdHhfcHdyX3BhcmFtcy0+ZGV2X21vZGUgPT0gQ0RGX1AyUF9HT19NT0RFKSB7CisJCXBkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2FkZHIod21hX2hhbmRsZSwKKwkJCQkJICAgICB0eF9wd3JfcGFyYW1zLT5ic3NJZCwgJnZkZXZfaWQpOworCX0gZWxzZSB7CisJCXBkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2Jzc2lkKHdtYV9oYW5kbGUsCisJCQkJCSAgICAgIHR4X3B3cl9wYXJhbXMtPmJzc0lkLCAmdmRldl9pZCk7CisJfQorCWlmICghcGRldikgeworCQlXTUFfTE9HRSgidmRldiBoYW5kbGUgaXMgaW52YWxpZCBmb3IgJXBNIiwKKwkJCSB0eF9wd3JfcGFyYW1zLT5ic3NJZCk7CisJCWNkZl9tZW1fZnJlZSh0eF9wd3JfcGFyYW1zKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghKHdtYV9oYW5kbGUtPmludGVyZmFjZXNbdmRldl9pZF0udmRldl91cCkpIHsKKwkJV01BX0xPR0UoIiVzOiB2ZGV2IGlkICVkIGlzIG5vdCB1cCBmb3IgJXBNIiwgX19mdW5jX18sIHZkZXZfaWQsCisJCQkgdHhfcHdyX3BhcmFtcy0+YnNzSWQpOworCQljZGZfbWVtX2ZyZWUodHhfcHdyX3BhcmFtcyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHhfcHdyX3BhcmFtcy0+cG93ZXIgPT0gMCkgeworCQkvKiBzZXQgdG8gZGVmYXVsdC4gU2luY2UgdGhlIGFwcCBkb2VzIG5vdCBjYXJlIHRoZSB0eCBwb3dlcgorCQkgKiB3ZSBrZWVwIHRoZSBwcmV2aW91cyBzZXR0aW5nICovCisJCXdtYV9oYW5kbGUtPmludGVyZmFjZXNbdmRldl9pZF0udHhfcG93ZXIgPSAwOworCQlyZXQgPSAwOworCQlnb3RvIGVuZDsKKwl9CisJaWYgKHdtYV9oYW5kbGUtPmludGVyZmFjZXNbdmRldl9pZF0ubWF4X3R4X3Bvd2VyICE9IDApIHsKKwkJLyogbWFrZSBzdXJlIHR4X3Bvd2VyIGxlc3MgdGhhbiBtYXhfdHhfcG93ZXIgKi8KKwkJaWYgKHR4X3B3cl9wYXJhbXMtPnBvd2VyID4KKwkJICAgIHdtYV9oYW5kbGUtPmludGVyZmFjZXNbdmRldl9pZF0ubWF4X3R4X3Bvd2VyKSB7CisJCQl0eF9wd3JfcGFyYW1zLT5wb3dlciA9CisJCQkJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5tYXhfdHhfcG93ZXI7CisJCX0KKwl9CisJaWYgKHdtYV9oYW5kbGUtPmludGVyZmFjZXNbdmRldl9pZF0udHhfcG93ZXIgIT0gdHhfcHdyX3BhcmFtcy0+cG93ZXIpIHsKKworCQkvKiB0eF9wb3dlciBjaGFuZ2VkLCBQdXNoIHRoZSB0eF9wb3dlciB0byBGVyAqLworCQlXTUFfTE9HVygiJXM6IFNldCBUWCBwb3dlciBsaW1pdCBbV01JX1ZERVZfUEFSQU1fVFhfUFdSTElNSVRdIHRvICVkIiwKKwkJCV9fZnVuY19fLCB0eF9wd3JfcGFyYW1zLT5wb3dlcik7CisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSAgICAgIHZkZXZfaWQsCisJCQkJCQkgICAgICBXTUlfVkRFVl9QQVJBTV9UWF9QV1JMSU1JVCwKKwkJCQkJCSAgICAgIHR4X3B3cl9wYXJhbXMtPnBvd2VyKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS50eF9wb3dlciA9CisJCQkJdHhfcHdyX3BhcmFtcy0+cG93ZXI7CisJfSBlbHNlIHsKKwkJLyogbm8gdHhfcG93ZXIgY2hhbmdlICovCisJCXJldCA9IDA7CisJfQorZW5kOgorCWNkZl9tZW1fZnJlZSh0eF9wd3JfcGFyYW1zKTsKKwlpZiAocmV0KQorCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNldCB2ZGV2IHBhcmFtIFdNSV9WREVWX1BBUkFNX1RYX1BXUkxJTUlUIik7Cit9CisKKy8qKgorICogd21hX3NldF9tYXhfdHhfcG93ZXIoKSAtIHNldCBtYXggdHggcG93ZXIgbGltaXQgaW4gZncKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEB0eF9wd3JfcGFyYW1zOiB0eCBwb3dlciBwYXJhbWV0ZXJzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3NldF9tYXhfdHhfcG93ZXIoV01BX0hBTkRMRSBoYW5kbGUsCisJCQkgIHRNYXhUeFBvd2VyUGFyYW1zICp0eF9wd3JfcGFyYW1zKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJdWludDhfdCB2ZGV2X2lkOworCWludCByZXQgPSAtMTsKKwl2b2lkICpwZGV2OworCXRQb3dlcmRCbSBwcmV2X21heF9wb3dlcjsKKworCXBkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2FkZHIod21hX2hhbmRsZSwgdHhfcHdyX3BhcmFtcy0+YnNzSWQsICZ2ZGV2X2lkKTsKKwlpZiAocGRldiA9PSBOVUxMKSB7CisJCS8qIG5vdCBpbiBTQVAgYXJyYXkuIFRyeSB0aGUgc3RhdGlvbi9wMnAgYXJyYXkgKi8KKwkJcGRldiA9IHdtYV9maW5kX3ZkZXZfYnlfYnNzaWQod21hX2hhbmRsZSwKKwkJCQkJICAgICAgdHhfcHdyX3BhcmFtcy0+YnNzSWQsICZ2ZGV2X2lkKTsKKwl9CisJaWYgKCFwZGV2KSB7CisJCVdNQV9MT0dFKCJ2ZGV2IGhhbmRsZSBpcyBpbnZhbGlkIGZvciAlcE0iLAorCQkJIHR4X3B3cl9wYXJhbXMtPmJzc0lkKTsKKwkJY2RmX21lbV9mcmVlKHR4X3B3cl9wYXJhbXMpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEod21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS52ZGV2X3VwKSkgeworCQlXTUFfTE9HRSgiJXM6IHZkZXYgaWQgJWQgaXMgbm90IHVwIiwgX19mdW5jX18sIHZkZXZfaWQpOworCQljZGZfbWVtX2ZyZWUodHhfcHdyX3BhcmFtcyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAod21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5tYXhfdHhfcG93ZXIgPT0KKwkgICAgdHhfcHdyX3BhcmFtcy0+cG93ZXIpIHsKKwkJcmV0ID0gMDsKKwkJZ290byBlbmQ7CisJfQorCXByZXZfbWF4X3Bvd2VyID0gd21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5tYXhfdHhfcG93ZXI7CisJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5tYXhfdHhfcG93ZXIgPSB0eF9wd3JfcGFyYW1zLT5wb3dlcjsKKwlpZiAod21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5tYXhfdHhfcG93ZXIgPT0gMCkgeworCQlyZXQgPSAwOworCQlnb3RvIGVuZDsKKwl9CisJV01BX0xPR1coIlNldCBNQVggVFggcG93ZXIgbGltaXQgW1dNSV9WREVWX1BBUkFNX1RYX1BXUkxJTUlUXSB0byAlZCIsCisJCSB3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLm1heF90eF9wb3dlcik7CisJcmV0ID0gd21pX3VuaWZpZWRfdmRldl9zZXRfcGFyYW1fc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCVdNSV9WREVWX1BBUkFNX1RYX1BXUkxJTUlULAorCQkJCXdtYV9oYW5kbGUtPmludGVyZmFjZXNbdmRldl9pZF0ubWF4X3R4X3Bvd2VyKTsKKwlpZiAocmV0ID09IDApCisJCXdtYV9oYW5kbGUtPmludGVyZmFjZXNbdmRldl9pZF0udHhfcG93ZXIgPQorCQkJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5tYXhfdHhfcG93ZXI7CisJZWxzZQorCQl3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLm1heF90eF9wb3dlciA9IHByZXZfbWF4X3Bvd2VyOworZW5kOgorCWNkZl9tZW1fZnJlZSh0eF9wd3JfcGFyYW1zKTsKKwlpZiAocmV0KQorCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgdmRldiBwYXJhbSBXTUlfVkRFVl9QQVJBTV9UWF9QV1JMSU1JVCIsCisJCQlfX2Z1bmNfXyk7Cit9CisKKy8qKgorICogd21pX3VuaWZpZWRfc2V0X3N0YV9wcygpIC0gc2V0IHN0YSBwb3dlcnNhdmUgcGFyYW1zIGluIGZ3CisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHZhbDogdmFsdWUKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAqLworaW50MzJfdCB3bWlfdW5pZmllZF9zZXRfc3RhX3BzKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCSAgICAgICB1aW50MzJfdCB2ZGV2X2lkLCB1aW50OF90IHZhbCkKK3sKKwl3bWlfc3RhX3Bvd2Vyc2F2ZV9tb2RlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisKKwlXTUFfTE9HRCgiU2V0IFN0YSBNb2RlIFBzIHZkZXZJZCAlZCB2YWwgJWQiLCB2ZGV2X2lkLCB2YWwpOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dQKCIlczogU2V0IFN0YSBNb2RlIFBzIE1lbSBBbGxvYyBGYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljbWQgPSAod21pX3N0YV9wb3dlcnNhdmVfbW9kZV9jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YV9wb3dlcnNhdmVfbW9kZV9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3N0YV9wb3dlcnNhdmVfbW9kZV9jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnZkZXZfaWQgPSB2ZGV2X2lkOworCWlmICh2YWwpCisJCWNtZC0+c3RhX3BzX21vZGUgPSBXTUlfU1RBX1BTX01PREVfRU5BQkxFRDsKKwllbHNlCisJCWNtZC0+c3RhX3BzX21vZGUgPSBXTUlfU1RBX1BTX01PREVfRElTQUJMRUQ7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJIFdNSV9TVEFfUE9XRVJTQVZFX01PREVfQ01ESUQpKSB7CisJCVdNQV9MT0dFKCJTZXQgU3RhIE1vZGUgUHMgRmFpbGVkIHZkZXZJZCAlZCB2YWwgJWQiLAorCQkJIHZkZXZfaWQsIHZhbCk7CisJCWNkZl9uYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9nZXRfdWFwc2RfbWFzaygpIC0gZ2V0IHVhcHNkIG1hc2sgYmFzZWQgb24gdWFwc2QgcGFyYW1ldGVycworICogQHVhcHNkX3BhcmFtczogdWFwc2VkIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IHVhcHNkIG1hc2sKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCB3bWFfZ2V0X3VhcHNkX21hc2sodHBVYXBzZF9QYXJhbXMgdWFwc2RfcGFyYW1zKQoreworCXVpbnQzMl90IHVhcHNkX3ZhbCA9IDA7CisKKwlpZiAodWFwc2RfcGFyYW1zLT5iZURlbGl2ZXJ5RW5hYmxlZCkKKwkJdWFwc2RfdmFsIHw9IFdNSV9TVEFfUFNfVUFQU0RfQUMwX0RFTElWRVJZX0VOOworCisJaWYgKHVhcHNkX3BhcmFtcy0+YmVUcmlnZ2VyRW5hYmxlZCkKKwkJdWFwc2RfdmFsIHw9IFdNSV9TVEFfUFNfVUFQU0RfQUMwX1RSSUdHRVJfRU47CisKKwlpZiAodWFwc2RfcGFyYW1zLT5ia0RlbGl2ZXJ5RW5hYmxlZCkKKwkJdWFwc2RfdmFsIHw9IFdNSV9TVEFfUFNfVUFQU0RfQUMxX0RFTElWRVJZX0VOOworCisJaWYgKHVhcHNkX3BhcmFtcy0+YmtUcmlnZ2VyRW5hYmxlZCkKKwkJdWFwc2RfdmFsIHw9IFdNSV9TVEFfUFNfVUFQU0RfQUMxX1RSSUdHRVJfRU47CisKKwlpZiAodWFwc2RfcGFyYW1zLT52aURlbGl2ZXJ5RW5hYmxlZCkKKwkJdWFwc2RfdmFsIHw9IFdNSV9TVEFfUFNfVUFQU0RfQUMyX0RFTElWRVJZX0VOOworCisJaWYgKHVhcHNkX3BhcmFtcy0+dmlUcmlnZ2VyRW5hYmxlZCkKKwkJdWFwc2RfdmFsIHw9IFdNSV9TVEFfUFNfVUFQU0RfQUMyX1RSSUdHRVJfRU47CisKKwlpZiAodWFwc2RfcGFyYW1zLT52b0RlbGl2ZXJ5RW5hYmxlZCkKKwkJdWFwc2RfdmFsIHw9IFdNSV9TVEFfUFNfVUFQU0RfQUMzX0RFTElWRVJZX0VOOworCisJaWYgKHVhcHNkX3BhcmFtcy0+dm9UcmlnZ2VyRW5hYmxlZCkKKwkJdWFwc2RfdmFsIHw9IFdNSV9TVEFfUFNfVUFQU0RfQUMzX1RSSUdHRVJfRU47CisKKwlyZXR1cm4gdWFwc2RfdmFsOworfQorCisvKioKKyAqIHdtYV9zZXRfZm9yY2Vfc2xlZXAoKSAtIHNldCBwb3dlciBzYXZlIHBhcmFtZXRlcnMgdG8gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAZW5hYmxlOiBlbmFibGUvZGlzYWJsZQorICogQHFwb3dlcl9jb25maWc6IHFwb3dlciBjb25maWd1cmF0aW9uCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludDMyX3Qgd21hX3NldF9mb3JjZV9zbGVlcCh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQl1aW50MzJfdCB2ZGV2X2lkLAorCQkJCXVpbnQ4X3QgZW5hYmxlLAorCQkJCWVudW0gcG93ZXJzYXZlX3Fwb3dlcl9tb2RlIHFwb3dlcl9jb25maWcpCit7CisJaW50MzJfdCByZXQ7CisJdWludDMyX3QgY2ZnX2RhdGFfdmFsID0gMDsKKwkvKiBnZXQgbWFjIHRvIGFjZXNzIENGRyBkYXRhIGJhc2UgKi8KKwlzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqbWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCXVpbnQzMl90IHJ4X3dha2VfcG9saWN5OworCXVpbnQzMl90IHR4X3dha2VfdGhyZXNob2xkOworCXVpbnQzMl90IHBzcG9sbF9jb3VudDsKKwl1aW50MzJfdCBpbmFjdGl2aXR5X3RpbWU7CisJdWludDMyX3QgcHNtb2RlOworCisJV01BX0xPR0QoIlNldCBGb3JjZSBTbGVlcCB2ZGV2SWQgJWQgdmFsICVkIiwgdmRldl9pZCwgZW5hYmxlKTsKKworCWlmIChOVUxMID09IG1hYykgeworCQlXTUFfTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgUEUgY29udGV4dCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogU2V0IFR4L1J4IERhdGEgSW5BY3Rpdml0eSBUaW1lb3V0ICAgKi8KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWMsIFdOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVQsCisJCQkgICAgICZjZmdfZGF0YV92YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgV05JX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVCIpOworCQljZmdfZGF0YV92YWwgPSBQT1dFUlNBVkVfREVGQVVMVF9JTkFDVElWSVRZX1RJTUU7CisJfQorCWluYWN0aXZpdHlfdGltZSA9ICh1aW50MzJfdCkgY2ZnX2RhdGFfdmFsOworCisJaWYgKGVuYWJsZSkgeworCQkvKiBvdmVycmlkZSBub3JtYWwgY29uZmlndXJhdGlvbiBhbmQgZm9yY2Ugc3RhdGlvbiBhc2xlZXAgKi8KKwkJcnhfd2FrZV9wb2xpY3kgPSBXTUlfU1RBX1BTX1JYX1dBS0VfUE9MSUNZX1BPTExfVUFQU0Q7CisJCXR4X3dha2VfdGhyZXNob2xkID0gV01JX1NUQV9QU19UWF9XQUtFX1RIUkVTSE9MRF9ORVZFUjsKKworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWMsIFdOSV9DRkdfTUFYX1BTX1BPTEwsCisJCQkJICAgICAmY2ZnX2RhdGFfdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1dNQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfTUFYX1BTX1BPTEwiKTsKKwkJfQorCQlpZiAoY2ZnX2RhdGFfdmFsKQorCQkJcHNwb2xsX2NvdW50ID0gKHVpbnQzMl90KSBjZmdfZGF0YV92YWw7CisJCWVsc2UKKwkJCXBzcG9sbF9jb3VudCA9IFdNQV9ERUZBVUxUX01BWF9QU1BPTExfQkVGT1JFX1dBS0U7CisKKwkJcHNtb2RlID0gV01JX1NUQV9QU19NT0RFX0VOQUJMRUQ7CisJfSBlbHNlIHsKKwkJLyogUHMgUG9sbCBXYWtlIFBvbGljeSAqLworCQlpZiAod2xhbl9jZmdfZ2V0X2ludChtYWMsIFdOSV9DRkdfTUFYX1BTX1BPTEwsCisJCQkJICAgICAmY2ZnX2RhdGFfdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1dNQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJCSAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfTUFYX1BTX1BPTEwiKTsKKwkJfQorCQlpZiAoY2ZnX2RhdGFfdmFsKSB7CisJCQkvKiBQcyBQb2xsIGlzIGVuYWJsZWQgKi8KKwkJCXJ4X3dha2VfcG9saWN5ID0gV01JX1NUQV9QU19SWF9XQUtFX1BPTElDWV9QT0xMX1VBUFNEOworCQkJcHNwb2xsX2NvdW50ID0gKHVpbnQzMl90KSBjZmdfZGF0YV92YWw7CisJCQl0eF93YWtlX3RocmVzaG9sZCA9IFdNSV9TVEFfUFNfVFhfV0FLRV9USFJFU0hPTERfTkVWRVI7CisJCX0gZWxzZSB7CisJCQlyeF93YWtlX3BvbGljeSA9IFdNSV9TVEFfUFNfUlhfV0FLRV9QT0xJQ1lfV0FLRTsKKwkJCXBzcG9sbF9jb3VudCA9IFdNSV9TVEFfUFNfUFNQT0xMX0NPVU5UX05PX01BWDsKKwkJCXR4X3dha2VfdGhyZXNob2xkID0gV01JX1NUQV9QU19UWF9XQUtFX1RIUkVTSE9MRF9BTFdBWVM7CisJCX0KKwkJcHNtb2RlID0gV01JX1NUQV9QU19NT0RFX0VOQUJMRUQ7CisJfQorCisJLyoKKwkgKiBRUG93ZXIgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGluIEZpcm13YXJlCisJICogU28gRGlzYWJsZSBRUG93ZXIgZXhwbGljaXRseQorCSAqLworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkgICBXTUlfU1RBX1BTX0VOQUJMRV9RUE9XRVIsCisJCQkJCSAgIHFwb3dlcl9jb25maWcpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIkRpc2FibGUgUVBvd2VyIEZhaWxlZCB2ZGV2SWQgJWQiLCB2ZGV2X2lkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJV01BX0xPR0QoIlFQb3dlciBEaXNhYmxlZCB2ZGV2SWQgJWQiLCB2ZGV2X2lkKTsKKworCS8qIFNldCB0aGUgV2FrZSBQb2xpY3kgdG8gV01JX1NUQV9QU19SWF9XQUtFX1BPTElDWV9QT0xMX1VBUFNEICovCisJcmV0ID0gd21pX3VuaWZpZWRfc2V0X3N0YV9wc19wYXJhbSh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJCSAgIFdNSV9TVEFfUFNfUEFSQU1fUlhfV0FLRV9QT0xJQ1ksCisJCQkJCSAgIHJ4X3dha2VfcG9saWN5KTsKKworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIlNldHRpbmcgd2FrZSBwb2xpY3kgRmFpbGVkIHZkZXZJZCAlZCIsIHZkZXZfaWQpOworCQlyZXR1cm4gcmV0OworCX0KKwlXTUFfTE9HRCgiU2V0dGluZyB3YWtlIHBvbGljeSB0byAlZCB2ZGV2SWQgJWQiLAorCQkgcnhfd2FrZV9wb2xpY3ksIHZkZXZfaWQpOworCisJLyogU2V0IHRoZSBUeCBXYWtlIFRocmVzaG9sZCAqLworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkgICBXTUlfU1RBX1BTX1BBUkFNX1RYX1dBS0VfVEhSRVNIT0xELAorCQkJCQkgICB0eF93YWtlX3RocmVzaG9sZCk7CisKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJTZXR0aW5nIFR4V2FrZSBUaHJlc2hvbGQgdmRldklkICVkIiwgdmRldl9pZCk7CisJCXJldHVybiByZXQ7CisJfQorCVdNQV9MT0dEKCJTZXR0aW5nIFR4V2FrZSBUaHJlc2hvbGQgdG8gJWQgdmRldklkICVkIiwKKwkJIHR4X3dha2VfdGhyZXNob2xkLCB2ZGV2X2lkKTsKKworCS8qIFNldCB0aGUgUHMgUG9sbCBDb3VudCAqLworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkgICBXTUlfU1RBX1BTX1BBUkFNX1BTUE9MTF9DT1VOVCwKKwkJCQkJICAgcHNwb2xsX2NvdW50KTsKKworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIlNldCBQcyBQb2xsIENvdW50IEZhaWxlZCB2ZGV2SWQgJWQgcHMgcG9sbCBjbnQgJWQiLAorCQkJIHZkZXZfaWQsIHBzcG9sbF9jb3VudCk7CisJCXJldHVybiByZXQ7CisJfQorCVdNQV9MT0dEKCJTZXQgUHMgUG9sbCBDb3VudCB2ZGV2SWQgJWQgcHMgcG9sbCBjbnQgJWQiLAorCQkgdmRldl9pZCwgcHNwb2xsX2NvdW50KTsKKworCS8qIFNldCB0aGUgVHgvUnggSW5BY3Rpdml0eSAqLworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkgICBXTUlfU1RBX1BTX1BBUkFNX0lOQUNUSVZJVFlfVElNRSwKKwkJCQkJICAgaW5hY3Rpdml0eV90aW1lKTsKKworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIlNldHRpbmcgVHgvUnggSW5BY3Rpdml0eSBGYWlsZWQgdmRldklkICVkIEluQWN0ICVkIiwKKwkJCSB2ZGV2X2lkLCBpbmFjdGl2aXR5X3RpbWUpOworCQlyZXR1cm4gcmV0OworCX0KKwlXTUFfTE9HRCgiU2V0IFR4L1J4IEluQWN0aXZpdHkgdmRldklkICVkIEluQWN0ICVkIiwKKwkJIHZkZXZfaWQsIGluYWN0aXZpdHlfdGltZSk7CisKKwkvKiBFbmFibGUgU3RhIE1vZGUgUG93ZXIgc2F2ZSAqLworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHMod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLCB0cnVlKTsKKworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIkVuYWJsZSBTdGEgTW9kZSBQcyBGYWlsZWQgdmRldklkICVkIiwgdmRldl9pZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogU2V0IExpc3RlbiBJbnRlcnZhbCAqLworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hYywgV05JX0NGR19MSVNURU5fSU5URVJWQUwsCisJCQkgICAgICZjZmdfZGF0YV92YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMIik7CisJCWNmZ19kYXRhX3ZhbCA9IFBPV0VSU0FWRV9ERUZBVUxUX0xJU1RFTl9JTlRFUlZBTDsKKwl9CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwKKwkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fTElTVEVOX0lOVEVSVkFMLAorCQkJCQkgICAgICBjZmdfZGF0YV92YWwpOworCWlmIChyZXQpIHsKKwkJLyogRXZlbiBpdCBmYWlscyBjb250aW51ZSBGdyB3aWxsIHRha2UgZGVmYXVsdCBMSSAqLworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIFNldCBMaXN0ZW4gSW50ZXJ2YWwgdmRldklkICVkIiwgdmRldl9pZCk7CisJfQorCVdNQV9MT0dEKCJTZXQgTGlzdGVuIEludGVydmFsIHZkZXZJZCAlZCBMaXN0ZW4gSW50diAlZCIsCisJCSB2ZGV2X2lkLCBjZmdfZGF0YV92YWwpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9zZXRfcXBvd2VyX2ZvcmNlX3NsZWVwKCkgLSBzZXQgcXBvd2VyIHBhcmFtcyBpbiBmdworICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEBlbmFibGU6IHZhbHVlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCisgKi8KK2ludDMyX3Qgd21hX3NldF9xcG93ZXJfZm9yY2Vfc2xlZXAodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQzMl90IHZkZXZfaWQsCisJCQkJICAgdWludDhfdCBlbmFibGUpCit7CisJaW50MzJfdCByZXQ7CisJdWludDMyX3QgY2ZnX2RhdGFfdmFsID0gMDsKKwkvKiBnZXQgbWFjIHRvIGFjZXNzIENGRyBkYXRhIGJhc2UgKi8KKwlzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqbWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCXVpbnQzMl90IHBzcG9sbF9jb3VudCA9IFdNQV9ERUZBVUxUX01BWF9QU1BPTExfQkVGT1JFX1dBS0U7CisKKwlXTUFfTE9HRSgiU2V0IFFQb3dlciBGb3JjZSgxKS9Ob3JtYWwoMCkgU2xlZXAgdmRldklkICVkIHZhbCAlZCIsCisJCSB2ZGV2X2lkLCBlbmFibGUpOworCisJaWYgKE5VTEwgPT0gbWFjKSB7CisJCVdNQV9MT0dFKCIlczogVW5hYmxlIHRvIGdldCBQRSBjb250ZXh0IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBHZXQgQ29uZmlndXJlZCBQcyBQb2xsIENvdW50ICovCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQobWFjLCBXTklfQ0ZHX01BWF9QU19QT0xMLAorCQkJICAgICAmY2ZnX2RhdGFfdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfV01BLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX01BWF9QU19QT0xMIik7CisJfQorCWlmIChjZmdfZGF0YV92YWwpIHsKKwkJcHNwb2xsX2NvdW50ID0gKHVpbnQzMl90KSBjZmdfZGF0YV92YWw7CisJfQorCisJLyogRW5hYmxlIFFQb3dlciAqLworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkgICBXTUlfU1RBX1BTX0VOQUJMRV9RUE9XRVIsIDEpOworCisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiRW5hYmxlIFFQb3dlciBGYWlsZWQgdmRldklkICVkIiwgdmRldl9pZCk7CisJCXJldHVybiByZXQ7CisJfQorCVdNQV9MT0dEKCJRUG93ZXIgRW5hYmxlZCB2ZGV2SWQgJWQiLCB2ZGV2X2lkKTsKKworCS8qIFNldCB0aGUgV2FrZSBQb2xpY3kgdG8gV01JX1NUQV9QU19SWF9XQUtFX1BPTElDWV9QT0xMX1VBUFNEICovCisJcmV0ID0gd21pX3VuaWZpZWRfc2V0X3N0YV9wc19wYXJhbSh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJCSAgIFdNSV9TVEFfUFNfUEFSQU1fUlhfV0FLRV9QT0xJQ1ksCisJCQkJCSAgIFdNSV9TVEFfUFNfUlhfV0FLRV9QT0xJQ1lfUE9MTF9VQVBTRCk7CisKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJTZXR0aW5nIHdha2UgcG9saWN5IHRvIHBzcG9sbC91YXBzZCBGYWlsZWQgdmRldklkICVkIiwKKwkJCSB2ZGV2X2lkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJV01BX0xPR0QoIldha2UgcG9saWN5IHNldCB0byB0byBwc3BvbGwvdWFwc2QgdmRldklkICVkIiwgdmRldl9pZCk7CisKKwlpZiAoZW5hYmxlKSB7CisJCS8qIFNldCB0aGUgVHggV2FrZSBUaHJlc2hvbGQgKi8KKwkJcmV0ID0gd21pX3VuaWZpZWRfc2V0X3N0YV9wc19wYXJhbSh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJCQkgICBXTUlfU1RBX1BTX1BBUkFNX1RYX1dBS0VfVEhSRVNIT0xELAorCQkJCQkJICAgV01JX1NUQV9QU19UWF9XQUtFX1RIUkVTSE9MRF9ORVZFUik7CisKKwkJaWYgKHJldCkgeworCQkJV01BX0xPR0UoIlNldHRpbmcgVHhXYWtlIFRocmVzaG9sZCB2ZGV2SWQgJWQiLCB2ZGV2X2lkKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJV01BX0xPR0QoIlR4V2FrZSBUaHJlc2hvbGQgc2V0IHRvIFRYX1dBS0VfVEhSRVNIT0xEX05FVkVSICVkIiwKKwkJCSB2ZGV2X2lkKTsKKwl9CisKKwkvKiBTZXQgdGhlIFFQb3dlciBQcyBQb2xsIENvdW50ICovCisJcmV0ID0gd21pX3VuaWZpZWRfc2V0X3N0YV9wc19wYXJhbSh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJCSAgIFdNSV9TVEFfUFNfUEFSQU1fUVBPV0VSX1BTUE9MTF9DT1VOVCwKKwkJCQkJICAgcHNwb2xsX2NvdW50KTsKKworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIlNldCBRUG93ZXIgUHMgUG9sbCBDb3VudCBGYWlsZWQgdmRldklkICVkIHBzIHBvbGwgY250ICVkIiwKKwkJCXZkZXZfaWQsIHBzcG9sbF9jb3VudCk7CisJCXJldHVybiByZXQ7CisJfQorCVdNQV9MT0dEKCJTZXQgUVBvd2VyIFBzIFBvbGwgQ291bnQgdmRldklkICVkIHBzIHBvbGwgY250ICVkIiwKKwkJIHZkZXZfaWQsIHBzcG9sbF9jb3VudCk7CisKKwkvKiBFbmFibGUgU3RhIE1vZGUgUG93ZXIgc2F2ZSAqLworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHMod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLCB0cnVlKTsKKworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIkVuYWJsZSBTdGEgTW9kZSBQcyBGYWlsZWQgdmRldklkICVkIiwgdmRldl9pZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogU2V0IExpc3RlbiBJbnRlcnZhbCAqLworCWlmICh3bGFuX2NmZ19nZXRfaW50KG1hYywgV05JX0NGR19MSVNURU5fSU5URVJWQUwsCisJCQkgICAgICZjZmdfZGF0YV92YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMIik7CisJCWNmZ19kYXRhX3ZhbCA9IFBPV0VSU0FWRV9ERUZBVUxUX0xJU1RFTl9JTlRFUlZBTDsKKwl9CisKKwlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwKKwkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fTElTVEVOX0lOVEVSVkFMLAorCQkJCQkgICAgICBjZmdfZGF0YV92YWwpOworCWlmIChyZXQpIHsKKwkJLyogRXZlbiBpdCBmYWlscyBjb250aW51ZSBGdyB3aWxsIHRha2UgZGVmYXVsdCBMSSAqLworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIFNldCBMaXN0ZW4gSW50ZXJ2YWwgdmRldklkICVkIiwgdmRldl9pZCk7CisJfQorCVdNQV9MT0dEKCJTZXQgTGlzdGVuIEludGVydmFsIHZkZXZJZCAlZCBMaXN0ZW4gSW50diAlZCIsCisJCSB2ZGV2X2lkLCBjZmdfZGF0YV92YWwpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9nZXRfcXBvd2VyX2NvbmZpZygpIC0gZ2V0IHFwb3dlciBjb25maWd1cmF0aW9uCisgKiBAd21hOiBXTUEgaGFuZGxlCisgKgorICogUG93ZXIgU2F2ZSBPZmZsb2FkIGNvbmZpZ3VyYXRpb246CisgKiAwIC0+IFBvd2VyIHNhdmUgb2ZmbG9hZCBpcyBkaXNhYmxlZAorICogMSAtPiBMZWdhY3kgUG93ZXIgc2F2ZSBlbmFibGVkICsgRGVlcCBzbGVlcCBEaXNhYmxlZAorICogMiAtPiBRUG93ZXIgZW5hYmxlZCArIERlZXAgc2xlZXAgRGlzYWJsZWQKKyAqIDMgLT4gTGVnYWN5IFBvd2VyIHNhdmUgZW5hYmxlZCArIERlZXAgc2xlZXAgRW5hYmxlZAorICogNCAtPiBRUG93ZXIgZW5hYmxlZCArIERlZXAgc2xlZXAgRW5hYmxlZAorICogNSAtPiBEdXR5IGN5Y2xpbmcgUVBvd2VyIGVuYWJsZWQKKyAqCisgKiBSZXR1cm46IGVudW0gcG93ZXJzYXZlX3Fwb3dlcl9tb2RlIHdpdGggYmVsb3cgdmFsdWVzCisgKiBRUE9XRVJfRElTQUJMRUQgaWYgUVBPV0VSIGlzIGRpc2FibGVkCisgKiBRUE9XRVJfRU5BQkxFRCBpZiBRUE9XRVIgaXMgZW5hYmxlZAorICogUVBPV0VSX0RVVFlfQ1lDTElORyBpZiBEVVRZIENZQ0xJTkcgUVBPV0VSIGlzIGVuYWJsZWQKKyAqLworc3RhdGljIGVudW0gcG93ZXJzYXZlX3Fwb3dlcl9tb2RlIHdtYV9nZXRfcXBvd2VyX2NvbmZpZyh0cF93bWFfaGFuZGxlIHdtYSkKK3sKKwlzd2l0Y2ggKHdtYS0+cG93ZXJzYXZlX21vZGUpIHsKKwljYXNlIFBTX1FQT1dFUl9OT0RFRVBTTEVFUDoKKwljYXNlIFBTX1FQT1dFUl9ERUVQU0xFRVA6CisJCVdNQV9MT0dJKCJRUE9XRVIgaXMgZW5hYmxlZCBpbiBwb3dlciBzYXZlIG1vZGUgJWQiLAorCQkJd21hLT5wb3dlcnNhdmVfbW9kZSk7CisJCXJldHVybiBRUE9XRVJfRU5BQkxFRDsKKwljYXNlIFBTX0RVVFlfQ1lDTElOR19RUE9XRVI6CisJCVdNQV9MT0dJKCJEVVRZIGN5Y2xpbmcgUVBPV0VSIGlzIGVuYWJsZWQgaW4gcG93ZXIgc2F2ZSBtb2RlICVkIiwKKwkJCXdtYS0+cG93ZXJzYXZlX21vZGUpOworCQlyZXR1cm4gUVBPV0VSX0RVVFlfQ1lDTElORzsKKworCWRlZmF1bHQ6CisJCVdNQV9MT0dJKCJRUE9XRVIgaXMgZGlzYWJsZWQgaW4gcG93ZXIgc2F2ZSBtb2RlICVkIiwKKwkJCXdtYS0+cG93ZXJzYXZlX21vZGUpOworCQlyZXR1cm4gUVBPV0VSX0RJU0FCTEVEOworCX0KK30KKworLyoqCisgKiB3bWFfZW5hYmxlX3N0YV9wc19tb2RlKCkgLSBlbmFibGUgc3RhIHBvd2Vyc2F2ZSBwYXJhbXMgaW4gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwc19yZXE6IHBvd2VyIHNhdmUgcmVxdWVzdAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9lbmFibGVfc3RhX3BzX21vZGUodHBfd21hX2hhbmRsZSB3bWEsIHRwRW5hYmxlUHNQYXJhbXMgcHNfcmVxKQoreworCXVpbnQzMl90IHZkZXZfaWQgPSBwc19yZXEtPnNlc3Npb25pZDsKKwlpbnQzMl90IHJldDsKKwllbnVtIHBvd2Vyc2F2ZV9xcG93ZXJfbW9kZSBxcG93ZXJfY29uZmlnID0gd21hX2dldF9xcG93ZXJfY29uZmlnKHdtYSk7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlID0gJndtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXTsKKwlpZiAoIWlmYWNlLT5oYW5kbGUpIHsKKwkJV01BX0xPR0UoInZkZXYgaWQgJWQgaXMgbm90IGFjdGl2ZSIsIHZkZXZfaWQpOworCQlyZXR1cm47CisJfQorCWlmIChlU0lSX0FERE9OX05PVEhJTkcgPT0gcHNfcmVxLT5wc1NldHRpbmcpIHsKKwkJV01BX0xPR0QoIkVuYWJsZSBTdGEgTW9kZSBQcyB2ZGV2SWQgJWQiLCB2ZGV2X2lkKTsKKwkJcmV0ID0gd21pX3VuaWZpZWRfc2V0X3N0YV9wc19wYXJhbSh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJV01JX1NUQV9QU19QQVJBTV9VQVBTRCwgMCk7CisJCWlmIChyZXQpIHsKKwkJCVdNQV9MT0dFKCJTZXQgVWFwc2QgcGFyYW0gMCBGYWlsZWQgdmRldklkICVkIiwgdmRldl9pZCk7CisJCQlyZXR1cm47CisJCX0KKworCQlyZXQgPSB3bWFfc2V0X2ZvcmNlX3NsZWVwKHdtYSwgdmRldl9pZCwgZmFsc2UsCisJCQkJcXBvd2VyX2NvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCVdNQV9MT0dFKCJFbmFibGUgU3RhIFBzIEZhaWxlZCB2ZGV2SWQgJWQiLCB2ZGV2X2lkKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSBpZiAoZVNJUl9BRERPTl9FTkFCTEVfVUFQU0QgPT0gcHNfcmVxLT5wc1NldHRpbmcpIHsKKwkJdWludDMyX3QgdWFwc2RfdmFsID0gMDsKKwkJdWFwc2RfdmFsID0gd21hX2dldF91YXBzZF9tYXNrKCZwc19yZXEtPnVhcHNkUGFyYW1zKTsKKworCQlpZiAodWFwc2RfdmFsICE9IGlmYWNlLT51YXBzZF9jYWNoZWRfdmFsKSB7CisJCQlXTUFfTE9HRCgiRW5hYmxlIFVhcHNkIHZkZXZJZCAlZCBNYXNrICVkIiwKKwkJCQkJdmRldl9pZCwgdWFwc2RfdmFsKTsKKwkJCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLAorCQkJCQl2ZGV2X2lkLAorCQkJCQlXTUlfU1RBX1BTX1BBUkFNX1VBUFNELAorCQkJCQl1YXBzZF92YWwpOworCQkJaWYgKHJldCkgeworCQkJCVdNQV9MT0dFKCJFbmFibGUgVWFwc2QgRmFpbGVkIHZkZXZJZCAlZCIsCisJCQkJCQl2ZGV2X2lkKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvKiBDYWNoZSB0aGUgVWFwc2QgTWFzayAqLworCQkJaWZhY2UtPnVhcHNkX2NhY2hlZF92YWwgPSB1YXBzZF92YWw7CisJCX0gZWxzZSB7CisJCQlXTUFfTE9HRCgiQWxyZWFkeSBVYXBzZCBFbmFibGVkIHZkZXZJZCAlZCBNYXNrICVkIiwKKwkJCQkJdmRldl9pZCwgdWFwc2RfdmFsKTsKKwkJfQorCisJCVdNQV9MT0dEKCJFbmFibGUgRm9yY2VkIFNsZWVwIHZkZXZJZCAlZCIsIHZkZXZfaWQpOworCQlyZXQgPSB3bWFfc2V0X2ZvcmNlX3NsZWVwKHdtYSwgdmRldl9pZCwgdHJ1ZSwKKwkJCQlxcG93ZXJfY29uZmlnKTsKKworCQlpZiAocmV0KSB7CisJCQlXTUFfTE9HRSgiRW5hYmxlIEZvcmNlZCBTbGVlcCBGYWlsZWQgdmRldklkICVkIiwKKwkJCQkJdmRldl9pZCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWZhY2UtPmR0aW1QZXJpb2QgPSBwc19yZXEtPmJjbkR0aW1QZXJpb2Q7Cit9CisKKy8qKgorICogd21hX2Rpc2FibGVfc3RhX3BzX21vZGUoKSAtIGRpc2FibGUgc3RhIHBvd2Vyc2F2ZSBwYXJhbXMgaW4gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwc19yZXE6IHBvd2VyIHNhdmUgcmVxdWVzdAorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9kaXNhYmxlX3N0YV9wc19tb2RlKHRwX3dtYV9oYW5kbGUgd21hLCB0cERpc2FibGVQc1BhcmFtcyBwc19yZXEpCit7CisJaW50MzJfdCByZXQ7CisJdWludDMyX3QgdmRldl9pZCA9IHBzX3JlcS0+c2Vzc2lvbmlkOworCisJV01BX0xPR0QoIkRpc2FibGUgU3RhIE1vZGUgUHMgdmRldklkICVkIiwgdmRldl9pZCk7CisKKwkvKiBEaXNhYmxlIFN0YSBNb2RlIFBvd2VyIHNhdmUgKi8KKwlyZXQgPSB3bWlfdW5pZmllZF9zZXRfc3RhX3BzKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIkRpc2FibGUgU3RhIE1vZGUgUHMgRmFpbGVkIHZkZXZJZCAlZCIsIHZkZXZfaWQpOworCQlyZXR1cm47CisJfQorCisJLyogRGlzYWJsZSBVQVBTRCBpbmNhc2UgaWYgYWRkaXRpb25hbCBSZXEgY2FtZSAqLworCWlmIChlU0lSX0FERE9OX0RJU0FCTEVfVUFQU0QgPT0gcHNfcmVxLT5wc1NldHRpbmcpIHsKKwkJV01BX0xPR0QoIkRpc2FibGUgVWFwc2QgdmRldklkICVkIiwgdmRldl9pZCk7CisJCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCVdNSV9TVEFfUFNfUEFSQU1fVUFQU0QsIDApOworCQlpZiAocmV0KSB7CisJCQlXTUFfTE9HRSgiRGlzYWJsZSBVYXBzZCBGYWlsZWQgdmRldklkICVkIiwgdmRldl9pZCk7CisJCQkvKgorCQkJICogRXZlbiB0aGlzIGZhaWxzIHdlIGNhbiBwcm9jZWVkIGFzIHN1Y2Nlc3MKKwkJCSAqIHNpbmNlIHdlIGRpc2FibGVkIHBvd2Vyc2F2ZQorCQkJICovCisJCX0KKwl9Cit9CisKKy8qKgorICogd21hX2VuYWJsZV91YXBzZF9tb2RlKCkgLSBlbmFibGUgdWFwc2QgbW9kZSBpbiBmdworICogQHdtYTogd21hIGhhbmRsZQorICogQHBzX3JlcTogcG93ZXIgc2F2ZSByZXF1ZXN0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX2VuYWJsZV91YXBzZF9tb2RlKHRwX3dtYV9oYW5kbGUgd21hLCB0cEVuYWJsZVVhcHNkUGFyYW1zIHBzX3JlcSkKK3sKKwlpbnQzMl90IHJldDsKKwl1aW50MzJfdCB2ZGV2X2lkID0gcHNfcmVxLT5zZXNzaW9uaWQ7CisJdWludDMyX3QgdWFwc2RfdmFsID0gMDsKKwllbnVtIHBvd2Vyc2F2ZV9xcG93ZXJfbW9kZSBxcG93ZXJfY29uZmlnID0gd21hX2dldF9xcG93ZXJfY29uZmlnKHdtYSk7CisKKwkvKiBEaXNhYmxlIFN0YSBNb2RlIFBvd2VyIHNhdmUgKi8KKwlyZXQgPSB3bWlfdW5pZmllZF9zZXRfc3RhX3BzKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIkRpc2FibGUgU3RhIE1vZGUgUHMgRmFpbGVkIHZkZXZJZCAlZCIsIHZkZXZfaWQpOworCQlyZXR1cm47CisJfQorCisJdWFwc2RfdmFsID0gd21hX2dldF91YXBzZF9tYXNrKCZwc19yZXEtPnVhcHNkUGFyYW1zKTsKKworCVdNQV9MT0dEKCJFbmFibGUgVWFwc2QgdmRldklkICVkIE1hc2sgJWQiLCB2ZGV2X2lkLCB1YXBzZF92YWwpOworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJV01JX1NUQV9QU19QQVJBTV9VQVBTRCwgdWFwc2RfdmFsKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJFbmFibGUgVWFwc2QgRmFpbGVkIHZkZXZJZCAlZCIsIHZkZXZfaWQpOworCQlyZXR1cm47CisJfQorCisJV01BX0xPR0QoIkVuYWJsZSBGb3JjZWQgU2xlZXAgdmRldklkICVkIiwgdmRldl9pZCk7CisJcmV0ID0gd21hX3NldF9mb3JjZV9zbGVlcCh3bWEsIHZkZXZfaWQsIHRydWUsCisJCQlxcG93ZXJfY29uZmlnKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJFbmFibGUgRm9yY2VkIFNsZWVwIEZhaWxlZCB2ZGV2SWQgJWQiLCB2ZGV2X2lkKTsKKwkJcmV0dXJuOworCX0KKworfQorCisvKioKKyAqIHdtYV9kaXNhYmxlX3VhcHNkX21vZGUoKSAtIGRpc2FibGUgdWFwc2QgbW9kZSBpbiBmdworICogQHdtYTogd21hIGhhbmRsZQorICogQHBzX3JlcTogcG93ZXIgc2F2ZSByZXF1ZXN0CisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX2Rpc2FibGVfdWFwc2RfbW9kZSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCSAgICB0cERpc2FibGVVYXBzZFBhcmFtcyBwc19yZXEpCit7CisJaW50MzJfdCByZXQ7CisJdWludDMyX3QgdmRldl9pZCA9IHBzX3JlcS0+c2Vzc2lvbmlkOworCWVudW0gcG93ZXJzYXZlX3Fwb3dlcl9tb2RlIHFwb3dlcl9jb25maWcgPSB3bWFfZ2V0X3Fwb3dlcl9jb25maWcod21hKTsKKworCVdNQV9MT0dEKCJEaXNhYmxlIFVhcHNkIHZkZXZJZCAlZCIsIHZkZXZfaWQpOworCisJLyogRGlzYWJsZSBTdGEgTW9kZSBQb3dlciBzYXZlICovCisJcmV0ID0gd21pX3VuaWZpZWRfc2V0X3N0YV9wcyh3bWEtPndtaV9oYW5kbGUsIHZkZXZfaWQsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJEaXNhYmxlIFN0YSBNb2RlIFBzIEZhaWxlZCB2ZGV2SWQgJWQiLCB2ZGV2X2lkKTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfcHNfcGFyYW0od21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJV01JX1NUQV9QU19QQVJBTV9VQVBTRCwgMCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiRGlzYWJsZSBVYXBzZCBGYWlsZWQgdmRldklkICVkIiwgdmRldl9pZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZSBlbmFibGUgU3RhIE1vZGUgUG93ZXJzYXZlIHdpdGggcHJvcGVyIGNvbmZpZ3VyYXRpb24gKi8KKwlyZXQgPSB3bWFfc2V0X2ZvcmNlX3NsZWVwKHdtYSwgdmRldl9pZCwgZmFsc2UsCisJCQlxcG93ZXJfY29uZmlnKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJEaXNhYmxlIEZvcmNlZCBTbGVlcCBGYWlsZWQgdmRldklkICVkIiwgdmRldl9pZCk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogd21pX3VuaWZpZWRfc2V0X3N0YV91YXBzZF9hdXRvX3RyaWdfY21kKCkgLSBzZXQgdWFwc2QgYXV0byB0cmlnZ2VyIGNvbW1hbmQKKyAqIEB3bWlfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdmRldmlkOiB2ZGV2IGlkCisgKiBAcGVlcl9hZGRyOiBwZWVyIG1hYyBhZGRyZXNzCisgKiBAYXV0b1RyaWdnZXJwYXJhbTogYXV0byB0cmlnZ2VyIHBhcmFtZXRlcnMKKyAqIEBudW1fYWM6IG51bWJlciBvZiBhY2Nlc3MgY2F0ZWdvcnkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHRyaWdnZXIKKyAqIHVhcHNkIHBhcmFtcyBzdWNoIGFzIHNlcnZpY2UgaW50ZXJ2YWwsIGRlbGF5IGludGVydmFsCisgKiBhbmQgc3VzcGVuZCBpbnRlcnZhbCB3aGljaCB3aWxsIGJlIHVzZWQgYnkgdGhlIGZpcm13YXJlCisgKiB0byBzZW5kIHRyaWdnZXIgZnJhbWVzIHBlcmlvZGljYWxseSB3aGVuIHRoZXJlIGlzIG5vCisgKiB0cmFmZmljIG9uIHRoZSB0cmFuc21pdCBzaWRlLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlLgorICovCitpbnQzMl90Cit3bWlfdW5pZmllZF9zZXRfc3RhX3VhcHNkX2F1dG9fdHJpZ19jbWQod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLAorCQkJCQl1aW50MzJfdCB2ZGV2aWQsCisJCQkJCXVpbnQ4X3QgcGVlcl9hZGRyW0lFRUU4MDIxMV9BRERSX0xFTl0sCisJCQkJCXVpbnQ4X3QgKmF1dG9UcmlnZ2VycGFyYW0sCisJCQkJCXVpbnQzMl90IG51bV9hYykKK3sKKwl3bWlfc3RhX3VhcHNkX2F1dG9fdHJpZ19jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwlpbnQzMl90IHJldDsKKwl1aW50MzJfdCBwYXJhbV9sZW4gPSBudW1fYWMgKiBzaXplb2Yod21pX3N0YV91YXBzZF9hdXRvX3RyaWdfcGFyYW0pOworCXVpbnQzMl90IGNtZF9sZW4gPSBzaXplb2YoKmNtZCkgKyBwYXJhbV9sZW4gKyBXTUlfVExWX0hEUl9TSVpFOworCXVpbnQzMl90IGk7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50OF90ICpidWZfcHRyOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWlfaGFuZGxlLCBjbWRfbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6d21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwljbWQgPSAod21pX3N0YV91YXBzZF9hdXRvX3RyaWdfY21kX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YV91YXBzZF9hdXRvX3RyaWdfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9zdGFfdWFwc2RfYXV0b190cmlnX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHZkZXZpZDsKKwljbWQtPm51bV9hYyA9IG51bV9hYzsKKwlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUihwZWVyX2FkZHIsICZjbWQtPnBlZXJfbWFjYWRkcik7CisKKwkvKiBUTFYgaW5kaWNhdGluZyBhcnJheSBvZiBzdHJ1Y3R1cmVzIHRvIGZvbGxvdyAqLworCWJ1Zl9wdHIgKz0gc2l6ZW9mKCpjbWQpOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHBhcmFtX2xlbik7CisKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJY2RmX21lbV9jb3B5KGJ1Zl9wdHIsIGF1dG9UcmlnZ2VycGFyYW0sIHBhcmFtX2xlbik7CisKKwkvKgorCSAqIFVwZGF0ZSB0YWcgYW5kIGxlbmd0aCBmb3IgdWFwc2QgYXV0byB0cmlnZ2VyIHBhcmFtcyAodGhpcyB3aWxsIHRha2UKKwkgKiBjYXJlIG9mIHVwZGF0aW5nIHRhZyBhbmQgbGVuZ3RoIGlmIGl0IGlzIG5vdCBwcmUtZmlsbGVkIGJ5IGNhbGxlcikuCisJICovCisJZm9yIChpID0gMDsgaSA8IG51bV9hYzsgaSsrKSB7CisJCVdNSVRMVl9TRVRfSERSKChidWZfcHRyICsKKwkJCQkoaSAqIHNpemVvZih3bWlfc3RhX3VhcHNkX2F1dG9fdHJpZ19wYXJhbSkpKSwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfdWFwc2RfYXV0b190cmlnX3BhcmFtLAorCQkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJCSAgICAgICAod21pX3N0YV91YXBzZF9hdXRvX3RyaWdfcGFyYW0pKTsKKwl9CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWlfaGFuZGxlLCBidWYsIGNtZF9sZW4sCisJCQkJICAgV01JX1NUQV9VQVBTRF9BVVRPX1RSSUdfQ01ESUQpOworCWlmIChyZXQgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCBzZXQgdWFwc2QgcGFyYW0gcmV0ID0gJWQiLCByZXQpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfdHJpZ2dlcl91YXBzZF9wYXJhbXMoKSAtIHNldCB0cmlnZ2VyIHVhcHNkIHBhcmFtZXRlcgorICogQHdtaV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAdHJpZ2dlcl91YXBzZF9wYXJhbXM6IHRyaWdnZXIgdWFwc2QgcGFyYW1ldGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdHJpZ2dlciB1YXBzZAorICogcGFyYW1zIHN1Y2ggYXMgc2VydmljZSBpbnRlcnZhbCwgZGVsYXkKKyAqIGludGVydmFsIGFuZCBzdXNwZW5kIGludGVydmFsIHdoaWNoCisgKiB3aWxsIGJlIHVzZWQgYnkgdGhlIGZpcm13YXJlIHRvIHNlbmQKKyAqIHRyaWdnZXIgZnJhbWVzIHBlcmlvZGljYWxseSB3aGVuIHRoZXJlCisgKiBpcyBubyB0cmFmZmljIG9uIHRoZSB0cmFuc21pdCBzaWRlLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCisgKi8KK0NERl9TVEFUVVMgd21hX3RyaWdnZXJfdWFwc2RfcGFyYW1zKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgdWludDMyX3QgdmRldl9pZCwKKwkJCQkgICAgdHBfd21hX3RyaWdnZXJfdWFwc2RfcGFyYW1zCisJCQkJICAgIHRyaWdnZXJfdWFwc2RfcGFyYW1zKQoreworCWludDMyX3QgcmV0OworCXdtaV9zdGFfdWFwc2RfYXV0b190cmlnX3BhcmFtIHVhcHNkX3RyaWdnZXJfcGFyYW07CisKKwlXTUFfTE9HRCgiVHJpZ2dlciB1YXBzZCBwYXJhbXMgdmRldiBpZCAlZCIsIHZkZXZfaWQpOworCisJV01BX0xPR0QoIldNTSBBQyAlZCBVc2VyIFByaW9yaXR5ICVkIFN2Y0ludHYgJWQgRGVsSW50diAlZCBTdXNJbnR2ICVkIiwKKwkJIHRyaWdnZXJfdWFwc2RfcGFyYW1zLT53bW1fYWMsCisJCSB0cmlnZ2VyX3VhcHNkX3BhcmFtcy0+dXNlcl9wcmlvcml0eSwKKwkJIHRyaWdnZXJfdWFwc2RfcGFyYW1zLT5zZXJ2aWNlX2ludGVydmFsLAorCQkgdHJpZ2dlcl91YXBzZF9wYXJhbXMtPmRlbGF5X2ludGVydmFsLAorCQkgdHJpZ2dlcl91YXBzZF9wYXJhbXMtPnN1c3BlbmRfaW50ZXJ2YWwpOworCisJaWYgKCFXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYV9oYW5kbGUtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkgICAgV01JX1NUQV9VQVBTRF9CQVNJQ19BVVRPX1RSSUcpIHx8CisJICAgICFXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYV9oYW5kbGUtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkgICAgV01JX1NUQV9VQVBTRF9WQVJfQVVUT19UUklHKSkgeworCQlXTUFfTE9HRCgiVHJpZ2dlciB1YXBzZCBpcyBub3Qgc3VwcG9ydGVkIHZkZXYgaWQgJWQiLCB2ZGV2X2lkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwl1YXBzZF90cmlnZ2VyX3BhcmFtLndtbV9hYyA9IHRyaWdnZXJfdWFwc2RfcGFyYW1zLT53bW1fYWM7CisJdWFwc2RfdHJpZ2dlcl9wYXJhbS51c2VyX3ByaW9yaXR5ID0gdHJpZ2dlcl91YXBzZF9wYXJhbXMtPnVzZXJfcHJpb3JpdHk7CisJdWFwc2RfdHJpZ2dlcl9wYXJhbS5zZXJ2aWNlX2ludGVydmFsID0KKwkJdHJpZ2dlcl91YXBzZF9wYXJhbXMtPnNlcnZpY2VfaW50ZXJ2YWw7CisJdWFwc2RfdHJpZ2dlcl9wYXJhbS5zdXNwZW5kX2ludGVydmFsID0KKwkJdHJpZ2dlcl91YXBzZF9wYXJhbXMtPnN1c3BlbmRfaW50ZXJ2YWw7CisJdWFwc2RfdHJpZ2dlcl9wYXJhbS5kZWxheV9pbnRlcnZhbCA9CisJCXRyaWdnZXJfdWFwc2RfcGFyYW1zLT5kZWxheV9pbnRlcnZhbDsKKworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfdWFwc2RfYXV0b190cmlnX2NtZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJdmRldl9pZCwgd21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5ic3NpZCwKKwkJCSh1aW50OF90ICopICgmdWFwc2RfdHJpZ2dlcl9wYXJhbSksIDEpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIkZhaWwgdG8gc2VuZCB1YXBzZCBwYXJhbSBjbWQgZm9yIHZkZXZpZCAlZCByZXQgPSAlZCIsCisJCQkgcmV0LCB2ZGV2X2lkKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9kaXNhYmxlX3VhcHNkX3Blcl9hYygpIC0gZGlzYWJsZSB1YXBzZCBwZXIgYWMKKyAqIEB3bWlfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQGFjOiBhY2Nlc3MgY2F0ZWdvcnkKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlLgorICovCitDREZfU1RBVFVTIHdtYV9kaXNhYmxlX3VhcHNkX3Blcl9hYyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICAgIHVpbnQzMl90IHZkZXZfaWQsIGVudW0gdWFwc2RfYWMgYWMpCit7CisJaW50MzJfdCByZXQ7CisJc3RydWN0IHdtYV90eHJ4X25vZGUgKmlmYWNlID0gJndtYV9oYW5kbGUtPmludGVyZmFjZXNbdmRldl9pZF07CisJd21pX3N0YV91YXBzZF9hdXRvX3RyaWdfcGFyYW0gdWFwc2RfdHJpZ2dlcl9wYXJhbTsKKwllbnVtIHVhcHNkX3VwIHVzZXJfcHJpb3JpdHk7CisKKwlXTUFfTE9HRCgiRGlzYWJsZSBVYXBzZCBwZXIgYWMgdmRldklkICVkIGFjICVkIiwgdmRldl9pZCwgYWMpOworCisJc3dpdGNoIChhYykgeworCWNhc2UgVUFQU0RfVk86CisJCWlmYWNlLT51YXBzZF9jYWNoZWRfdmFsICY9CisJCQl+KFdNSV9TVEFfUFNfVUFQU0RfQUMzX0RFTElWRVJZX0VOIHwKKwkJCSAgV01JX1NUQV9QU19VQVBTRF9BQzNfVFJJR0dFUl9FTik7CisJCXVzZXJfcHJpb3JpdHkgPSBVQVBTRF9VUF9WTzsKKwkJYnJlYWs7CisJY2FzZSBVQVBTRF9WSToKKwkJaWZhY2UtPnVhcHNkX2NhY2hlZF92YWwgJj0KKwkJCX4oV01JX1NUQV9QU19VQVBTRF9BQzJfREVMSVZFUllfRU4gfAorCQkJICBXTUlfU1RBX1BTX1VBUFNEX0FDMl9UUklHR0VSX0VOKTsKKwkJdXNlcl9wcmlvcml0eSA9IFVBUFNEX1VQX1ZJOworCQlicmVhazsKKwljYXNlIFVBUFNEX0JLOgorCQlpZmFjZS0+dWFwc2RfY2FjaGVkX3ZhbCAmPQorCQkJfihXTUlfU1RBX1BTX1VBUFNEX0FDMV9ERUxJVkVSWV9FTiB8CisJCQkgIFdNSV9TVEFfUFNfVUFQU0RfQUMxX1RSSUdHRVJfRU4pOworCQl1c2VyX3ByaW9yaXR5ID0gVUFQU0RfVVBfQks7CisJCWJyZWFrOworCWNhc2UgVUFQU0RfQkU6CisJCWlmYWNlLT51YXBzZF9jYWNoZWRfdmFsICY9CisJCQl+KFdNSV9TVEFfUFNfVUFQU0RfQUMwX0RFTElWRVJZX0VOIHwKKwkJCSAgV01JX1NUQV9QU19VQVBTRF9BQzBfVFJJR0dFUl9FTik7CisJCXVzZXJfcHJpb3JpdHkgPSBVQVBTRF9VUF9CRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV01BX0xPR0UoIkludmFsaWQgQUMgdmRldklkICVkIGFjICVkIiwgdmRldl9pZCwgYWMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyoKKwkgKiBEaXNhYmxlIEF1dG8gVHJpZ2dlciBGdW5jdGlvbmFsaXR5IGJlZm9yZQorCSAqIGRpc2FibGluZyB1YXBzZCBmb3IgYSBwYXJ0aWN1bGFyIEFDCisJICovCisJdWFwc2RfdHJpZ2dlcl9wYXJhbS53bW1fYWMgPSBhYzsKKwl1YXBzZF90cmlnZ2VyX3BhcmFtLnVzZXJfcHJpb3JpdHkgPSB1c2VyX3ByaW9yaXR5OworCXVhcHNkX3RyaWdnZXJfcGFyYW0uc2VydmljZV9pbnRlcnZhbCA9IDA7CisJdWFwc2RfdHJpZ2dlcl9wYXJhbS5zdXNwZW5kX2ludGVydmFsID0gMDsKKwl1YXBzZF90cmlnZ2VyX3BhcmFtLmRlbGF5X2ludGVydmFsID0gMDsKKworCXJldCA9IHdtaV91bmlmaWVkX3NldF9zdGFfdWFwc2RfYXV0b190cmlnX2NtZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQl2ZGV2X2lkLCB3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmJzc2lkLAorCQkodWludDhfdCAqKSgmdWFwc2RfdHJpZ2dlcl9wYXJhbSksIDEpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIkZhaWwgdG8gc2VuZCBhdXRvIHRyaWcgY21kIGZvciB2ZGV2aWQgJWQgcmV0ID0gJWQiLAorCQkJIHJldCwgdmRldl9pZCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXQgPSB3bWlfdW5pZmllZF9zZXRfc3RhX3BzX3BhcmFtKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIHZkZXZfaWQsCisJCQkJCSAgIFdNSV9TVEFfUFNfUEFSQU1fVUFQU0QsCisJCQkJCSAgIGlmYWNlLT51YXBzZF9jYWNoZWRfdmFsKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJEaXNhYmxlIFVhcHNkIHBlciBhYyBGYWlsZWQgdmRldklkICVkIGFjICVkIiwgdmRldl9pZCwKKwkJCSBhYyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJV01BX0xPR0QoIkRpc2FibGUgVWFwc2QgcGVyIGFjIHZkZXZJZCAlZCB2YWwgJWQiLCB2ZGV2X2lkLAorCQkgaWZhY2UtPnVhcHNkX2NhY2hlZF92YWwpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2dldF90ZW1wZXJhdHVyZSgpIC0gZ2V0IHBkZXYgdGVtcGVyYXR1cmUgcmVxCisgKiBAd21pX2hhbmRsZTogd21hIGhhbmRsZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCisgKi8KK0NERl9TVEFUVVMgd21hX2dldF90ZW1wZXJhdHVyZSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpCit7CisJd21pX3BkZXZfZ2V0X3RlbXBlcmF0dXJlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCB3bWlfYnVmOworCXVpbnQzMl90IGxlbiA9IHNpemVvZih3bWlfcGRldl9nZXRfdGVtcGVyYXR1cmVfY21kX2ZpeGVkX3BhcmFtKTsKKwl1aW50OF90ICpidWZfcHRyOworCisJaWYgKCF3bWFfaGFuZGxlKSB7CisJCVdNQV9MT0dFKEZMKCJXTUEgaXMgY2xvc2VkLCBjYW4gbm90IGlzc3VlIGNtZCIpKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisKKwl3bWlfYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghd21pX2J1ZikgeworCQlXTUFfTE9HRShGTCgid21pX2J1Zl9hbGxvYyBmYWlsZWQiKSk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKworCWNtZCA9ICh3bWlfcGRldl9nZXRfdGVtcGVyYXR1cmVfY21kX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfZ2V0X3RlbXBlcmF0dXJlX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcGRldl9nZXRfdGVtcGVyYXR1cmVfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgd21pX2J1ZiwgbGVuLAorCQkJCSBXTUlfUERFVl9HRVRfVEVNUEVSQVRVUkVfQ01ESUQpKSB7CisJCVdNQV9MT0dFKEZMKCJmYWlsZWQgdG8gc2VuZCBnZXQgdGVtcGVyYXR1cmUgY29tbWFuZCIpKTsKKwkJd21pX2J1Zl9mcmVlKHdtaV9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3BkZXZfdGVtcGVyYXR1cmVfZXZ0X2hhbmRsZXIoKSAtIHBkZXYgdGVtcGVyYXR1cmUgZXZlbnQgaGFuZGxlcgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGV2ZW50OiBldmVudCBidWZmZXIKKyAqIEBsZW4gOiBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAqLworaW50IHdtYV9wZGV2X3RlbXBlcmF0dXJlX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsCisJCQkJICAgICB1aW50MzJfdCBsZW4pCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWNkc19tc2dfdCBzbWVfbXNnID0geyAwIH07CisJV01JX1BERVZfVEVNUEVSQVRVUkVfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX3BkZXZfdGVtcGVyYXR1cmVfZXZlbnRfZml4ZWRfcGFyYW0gKndtaV9ldmVudDsKKworCXBhcmFtX2J1ZiA9IChXTUlfUERFVl9URU1QRVJBVFVSRV9FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnQ7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgcGRldl90ZW1wZXJhdHVyZSBldmVudCBidWZmZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd21pX2V2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlXTUFfTE9HSShGTCgidGVtcGVyYXR1cmU6ICVkIiksIHdtaV9ldmVudC0+dmFsdWUpOworCisJc21lX21zZy50eXBlID0gZVdOSV9TTUVfTVNHX0dFVF9URU1QRVJBVFVSRV9JTkQ7CisJc21lX21zZy5ib2R5cHRyID0gTlVMTDsKKwlzbWVfbXNnLmJvZHl2YWwgPSB3bWlfZXZlbnQtPnZhbHVlOworCisJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9TTUUsICZzbWVfbXNnKTsKKwlpZiAoIUNERl9JU19TVEFUVVNfU1VDQ0VTUyhjZGZfc3RhdHVzKSkgeworCQlXTUFfTE9HRShGTCgiRmFpbCB0byBwb3N0IGdldCB0ZW1wZXJhdHVyZSBpbmQgbXNnIikpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9wcm9jZXNzX3R4X3Bvd2VyX2xpbWl0cygpIC0gc2VuZHMgdGhlIHBvd2VyIGxpbWl0cyBmb3IgMmcvNWcgdG8gZmlybXdhcmUKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBwdHhsaW06IHBvd2VyIGxpbWl0IHZhbHVlCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAqLworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc190eF9wb3dlcl9saW1pdHMoV01BX0hBTkRMRSBoYW5kbGUsCisJCQkJICAgICAgIHRTaXJUeFBvd2VyTGltaXQgKnB0eGxpbSkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJaW50MzJfdCByZXQgPSAwOworCXVpbnQzMl90IHR4cG93ZXJfcGFyYW1zMmcgPSAwOworCXVpbnQzMl90IHR4cG93ZXJfcGFyYW1zNWcgPSAwOworCisJaWYgKCF3bWEgfHwgIXdtYS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBpcyBjbG9zZWQsIGNhbiBub3QgaXNzdWUgdHggcG93ZXIgbGltaXQiLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJLyogU2V0IHZhbHVlIGFuZCByZWFzb24gY29kZSBmb3IgMmcgYW5kIDVnIHBvd2VyIGxpbWl0ICovCisKKwlTRVRfUERFVl9QQVJBTV9UWFBPV0VSX1JFQVNPTih0eHBvd2VyX3BhcmFtczJnLAorCQkJCSAgICAgIFdNSV9QREVWX1BBUkFNX1RYUE9XRVJfUkVBU09OX1NBUik7CisJU0VUX1BERVZfUEFSQU1fVFhQT1dFUl9WQUxVRSh0eHBvd2VyX3BhcmFtczJnLCBwdHhsaW0tPnR4UG93ZXIyZyk7CisKKwlTRVRfUERFVl9QQVJBTV9UWFBPV0VSX1JFQVNPTih0eHBvd2VyX3BhcmFtczVnLAorCQkJCSAgICAgIFdNSV9QREVWX1BBUkFNX1RYUE9XRVJfUkVBU09OX1NBUik7CisJU0VUX1BERVZfUEFSQU1fVFhQT1dFUl9WQUxVRSh0eHBvd2VyX3BhcmFtczVnLCBwdHhsaW0tPnR4UG93ZXI1Zyk7CisKKwlXTUFfTE9HRCgiJXM6IHR4cG93ZXIyZzogJXggdHhwb3dlcjVnOiAleCIsCisJCSBfX2Z1bmNfXywgdHhwb3dlcl9wYXJhbXMyZywgdHhwb3dlcl9wYXJhbXM1Zyk7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9wZGV2X3NldF9wYXJhbSh3bWEtPndtaV9oYW5kbGUsCisJCQkJCSBXTUlfUERFVl9QQVJBTV9UWFBPV0VSX0xJTUlUMkcsCisJCQkJCSB0eHBvd2VyX3BhcmFtczJnKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNldCB0eHBvd2VyIDJnICglZCkiLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXQgPSB3bWlfdW5pZmllZF9wZGV2X3NldF9wYXJhbSh3bWEtPndtaV9oYW5kbGUsCisJCQkJCSBXTUlfUERFVl9QQVJBTV9UWFBPV0VSX0xJTUlUNUcsCisJCQkJCSB0eHBvd2VyX3BhcmFtczVnKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNldCB0eHBvd2VyIDVnICglZCkiLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9hZGRfcDJwX2llKCkgLSBhZGQgcDJwIElFCisgKiBAZnJtOiBwdHIgd2hlcmUgcDJwIGllIG5lZWRzIHRvIGFkZAorICoKKyAqIFJldHVybjogcHRyIGFmdGVyIHAycCBpZQorICovCit1aW50OF90ICp3bWFfYWRkX3AycF9pZSh1aW50OF90ICpmcm0pCit7CisJdWludDhfdCB3ZmFfb3VpWzNdID0gV01BX1AyUF9XRkFfT1VJOworCXN0cnVjdCBwMnBfaWUgKnAycF9pZSA9IChzdHJ1Y3QgcDJwX2llICopZnJtOworCisJcDJwX2llLT5wMnBfaWQgPSBXTUFfUDJQX0lFX0lEOworCXAycF9pZS0+cDJwX291aVswXSA9IHdmYV9vdWlbMF07CisJcDJwX2llLT5wMnBfb3VpWzFdID0gd2ZhX291aVsxXTsKKwlwMnBfaWUtPnAycF9vdWlbMl0gPSB3ZmFfb3VpWzJdOworCXAycF9pZS0+cDJwX291aV90eXBlID0gV01BX1AyUF9XRkFfVkVSOworCXAycF9pZS0+cDJwX2xlbiA9IDQ7CisJcmV0dXJuIGZybSArIHNpemVvZihzdHJ1Y3QgcDJwX2llKTsKK30KKworLyoqCisgKiB3bWFfdXBkYXRlX2JlYWNvbl9ub2FfaWUoKSAtIHVwZGF0ZSBiZWFjb24gaWUKKyAqIEBiY246IGJlYWNvbiBpbmZvCisgKiBAbmV3X25vYV9zdWJfaWVfbGVuOiBpZSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX3VwZGF0ZV9iZWFjb25fbm9hX2llKHN0cnVjdCBiZWFjb25faW5mbyAqYmNuLAorCQkJCSAgICAgdWludDE2X3QgbmV3X25vYV9zdWJfaWVfbGVuKQoreworCXN0cnVjdCBwMnBfaWUgKnAycF9pZTsKKwl1aW50OF90ICpidWY7CisKKwkvKiBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGFkZCwganVzdCByZXR1cm4gKi8KKwlpZiAobmV3X25vYV9zdWJfaWVfbGVuID09IDApIHsKKwkJaWYgKGJjbi0+bm9hX3N1Yl9pZV9sZW4gJiYgYmNuLT5ub2FfaWUpIHsKKwkJCVdNQV9MT0dEKCIlczogTm9BIGlzIHByZXNlbnQgaW4gcHJldmlvdXMgYmVhY29uLCAiCisJCQkJICJidXQgbm90IHByZXNlbnQgaW4gc3diYSBldmVudCwgIgorCQkJCSAiU28gUmVzZXQgdGhlIE5vQSIsIF9fZnVuY19fKTsKKwkJCS8qIFRPRE86IEFzc3VtaW5nIHAycCBub2EgaWUgaXMgbGFzdCBpZSBpbiB0aGUgYmVhY29uICovCisJCQljZGZfbWVtX3plcm8oYmNuLT5ub2FfaWUsIChiY24tPm5vYV9zdWJfaWVfbGVuICsKKwkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgcDJwX2llKSkpOworCQkJYmNuLT5sZW4gLT0gKGJjbi0+bm9hX3N1Yl9pZV9sZW4gKworCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBwMnBfaWUpKTsKKwkJCWJjbi0+bm9hX2llID0gTlVMTDsKKwkJCWJjbi0+bm9hX3N1Yl9pZV9sZW4gPSAwOworCQl9CisJCVdNQV9MT0dEKCIlczogTm8gbmVlZCB0byB1cGRhdGUgTm9BIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKGJjbi0+bm9hX3N1Yl9pZV9sZW4gJiYgYmNuLT5ub2FfaWUpIHsKKwkJLyogTm9BIHByZXNlbnQgaW4gcHJldmlvdXMgYmVhY29uLCB1cGRhdGUgaXQgKi8KKwkJV01BX0xPR0QoIiVzOiBOb0EgcHJlc2VudCBpbiBwcmV2aW91cyBiZWFjb24sICIKKwkJCSAidXBkYXRlIHRoZSBOb0EgSUUsIGJjbi0+bGVuICV1IgorCQkJICJiY24tPm5vYV9zdWJfaWVfbGVuICV1IiwKKwkJCSBfX2Z1bmNfXywgYmNuLT5sZW4sIGJjbi0+bm9hX3N1Yl9pZV9sZW4pOworCQliY24tPmxlbiAtPSAoYmNuLT5ub2Ffc3ViX2llX2xlbiArIHNpemVvZihzdHJ1Y3QgcDJwX2llKSk7CisJCWNkZl9tZW1femVybyhiY24tPm5vYV9pZSwKKwkJCSAgICAgKGJjbi0+bm9hX3N1Yl9pZV9sZW4gKyBzaXplb2Yoc3RydWN0IHAycF9pZSkpKTsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBOb0EgaXMgbm90IHByZXNlbnQgaW4gcHJldmlvdXMgYmVhY29uICovCisJCVdNQV9MT0dEKCIlczogTm9BIG5vdCBwcmVzZW50IGluIHByZXZpb3VzIGJlYWNvbiwgYWRkIGl0IgorCQkJICJiY24tPmxlbiAldSIsIF9fZnVuY19fLCBiY24tPmxlbik7CisJCWJ1ZiA9IGNkZl9uYnVmX2RhdGEoYmNuLT5idWYpOworCQliY24tPm5vYV9pZSA9IGJ1ZiArIGJjbi0+bGVuOworCX0KKworCWJjbi0+bm9hX3N1Yl9pZV9sZW4gPSBuZXdfbm9hX3N1Yl9pZV9sZW47CisJd21hX2FkZF9wMnBfaWUoYmNuLT5ub2FfaWUpOworCXAycF9pZSA9IChzdHJ1Y3QgcDJwX2llICopYmNuLT5ub2FfaWU7CisJcDJwX2llLT5wMnBfbGVuICs9IG5ld19ub2Ffc3ViX2llX2xlbjsKKwljZGZfbWVtX2NvcHkoKGJjbi0+bm9hX2llICsgc2l6ZW9mKHN0cnVjdCBwMnBfaWUpKSwgYmNuLT5ub2Ffc3ViX2llLAorCQkgICAgIG5ld19ub2Ffc3ViX2llX2xlbik7CisKKwliY24tPmxlbiArPSAobmV3X25vYV9zdWJfaWVfbGVuICsgc2l6ZW9mKHN0cnVjdCBwMnBfaWUpKTsKKwlXTUFfTE9HSSgiJXM6IFVwZGF0ZWQgYmVhY29uIGxlbmd0aCB3aXRoIE5vQSBJZSBpcyAldSIsCisJCSBfX2Z1bmNfXywgYmNuLT5sZW4pOworfQorCisvKioKKyAqIHdtYV9wMnBfY3JlYXRlX3N1Yl9pZV9ub2EoKSAtIHB1dCBwMnAgbm9hIGllCisgKiBAYnVmOiBidWZmZXIKKyAqIEBub2E6IG5vYSBlbGVtZW50IGllCisgKiBAbmV3X25vYV9zdWJfaWVfbGVuOiBpZSBsZW5ndGgKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX3AycF9jcmVhdGVfc3ViX2llX25vYSh1aW50OF90ICpidWYsCisJCQkJICAgICAgc3RydWN0IHAycF9zdWJfZWxlbWVudF9ub2EgKm5vYSwKKwkJCQkgICAgICB1aW50MTZfdCAqbmV3X25vYV9zdWJfaWVfbGVuKQoreworCXVpbnQ4X3QgdG1wX29jdGV0ID0gMDsKKwlpbnQgaTsKKwl1aW50OF90ICpidWZfc3RhcnQgPSBidWY7CisKKwkqYnVmKysgPSBXTUFfUDJQX1NVQl9FTEVNRU5UX05PQTsgICAgICAgLyogc3ViLWVsZW1lbnQgaWQgKi8KKwlBU1NFUlQobm9hLT5udW1fZGVzY3JpcHRvcnMgPD0gV01BX01BWF9OT0FfREVTQ1JJUFRPUlMpOworCisJLyoKKwkgKiBMZW5ndGggPSAoMiBvY3RldHMgZm9yIEluZGV4IGFuZCBDVFdpbi9PcHAgUFMpIGFuZAorCSAqICgxMyBvY3RldHMgZm9yIGVhY2ggTk9BIERlc2NyaXB0b3JzKQorCSAqLworCVAyUElFX1BVVF9MRTE2KGJ1ZiwgV01BX05PQV9JRV9TSVpFKG5vYS0+bnVtX2Rlc2NyaXB0b3JzKSk7CisJYnVmICs9IDI7CisKKwkqYnVmKysgPSBub2EtPmluZGV4OyAgICAvKiBJbnN0YW5jZSBJbmRleCAqLworCisJdG1wX29jdGV0ID0gbm9hLT5jdHdpbmRvdyAmIFdNQV9QMlBfTk9BX0lFX0NUV0lOX01BU0s7CisJaWYgKG5vYS0+b3BwUFMpIHsKKwkJdG1wX29jdGV0IHw9IFdNQV9QMlBfTk9BX0lFX09QUF9QU19TRVQ7CisJfQorCSpidWYrKyA9IHRtcF9vY3RldDsgICAgIC8qIE9wcCBQcyBhbmQgQ1RXaW4gY2FwYWJpbGl0aWVzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbm9hLT5udW1fZGVzY3JpcHRvcnM7IGkrKykgeworCQlBU1NFUlQobm9hLT5ub2FfZGVzY3JpcHRvcnNbaV0udHlwZV9jb3VudCAhPSAwKTsKKworCQkqYnVmKysgPSBub2EtPm5vYV9kZXNjcmlwdG9yc1tpXS50eXBlX2NvdW50OworCisJCVAyUElFX1BVVF9MRTMyKGJ1Ziwgbm9hLT5ub2FfZGVzY3JpcHRvcnNbaV0uZHVyYXRpb24pOworCQlidWYgKz0gNDsKKwkJUDJQSUVfUFVUX0xFMzIoYnVmLCBub2EtPm5vYV9kZXNjcmlwdG9yc1tpXS5pbnRlcnZhbCk7CisJCWJ1ZiArPSA0OworCQlQMlBJRV9QVVRfTEUzMihidWYsIG5vYS0+bm9hX2Rlc2NyaXB0b3JzW2ldLnN0YXJ0X3RpbWUpOworCQlidWYgKz0gNDsKKwl9CisJKm5ld19ub2Ffc3ViX2llX2xlbiA9IChidWYgLSBidWZfc3RhcnQpOworfQorCisvKioKKyAqIHdtYV91cGRhdGVfbm9hKCkgLSB1cGRhdGUgbm9hIHBhcmFtcworICogQGJlYWNvbjogYmVhY29uIGluZm8KKyAqIEBub2FfaWU6IG5vYSBpZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV91cGRhdGVfbm9hKHN0cnVjdCBiZWFjb25faW5mbyAqYmVhY29uLAorCQkgICAgc3RydWN0IHAycF9zdWJfZWxlbWVudF9ub2EgKm5vYV9pZSkKK3sKKwl1aW50MTZfdCBuZXdfbm9hX3N1Yl9pZV9sZW47CisKKwkvKiBDYWxsIHRoaXMgZnVuY3Rpb24gYnkgaG9sZGluZyB0aGUgc3BpbmxvY2sgb24gYmVhY29uLT5sb2NrICovCisKKwlpZiAobm9hX2llKSB7CisJCWlmICgobm9hX2llLT5jdHdpbmRvdyA9PSAwKSAmJiAobm9hX2llLT5vcHBQUyA9PSAwKSAmJgorCQkgICAgKG5vYV9pZS0+bnVtX2Rlc2NyaXB0b3JzID09IDApKSB7CisJCQkvKiBOb0EgaXMgbm90IHByZXNlbnQgKi8KKwkJCVdNQV9MT0dEKCIlczogTm9BIGlzIG5vdCBwcmVzZW50IiwgX19mdW5jX18pOworCQkJbmV3X25vYV9zdWJfaWVfbGVuID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIENyZWF0ZSB0aGUgYmluYXJ5IGJsb2IgY29udGFpbmluZyBOT0Egc3ViLUlFICovCisJCQlXTUFfTE9HRCgiJXM6IENyZWF0ZSBOT0Egc3ViIGllIiwgX19mdW5jX18pOworCQkJd21hX3AycF9jcmVhdGVfc3ViX2llX25vYSgmYmVhY29uLT5ub2Ffc3ViX2llWzBdLAorCQkJCQkJICBub2FfaWUsICZuZXdfbm9hX3N1Yl9pZV9sZW4pOworCQl9CisJfSBlbHNlIHsKKwkJV01BX0xPR0QoIiVzOiBObyBuZWVkIHRvIGFkZCBOT0EiLCBfX2Z1bmNfXyk7CisJCW5ld19ub2Ffc3ViX2llX2xlbiA9IDA7IC8qIG5vIE5PQSBJRSBzdWItYXR0cmlidXRlcyAqLworCX0KKworCXdtYV91cGRhdGVfYmVhY29uX25vYV9pZShiZWFjb24sIG5ld19ub2Ffc3ViX2llX2xlbik7Cit9CisKKy8qKgorICogd21hX3VwZGF0ZV9wcm9iZV9yZXNwX25vYSgpIC0gdXBkYXRlIG5vYSBJRSBpbiBwcm9iZSByZXNwb25zZQorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBub2FfaWU6IG5vYSBpZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV91cGRhdGVfcHJvYmVfcmVzcF9ub2EodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJICAgICAgIHN0cnVjdCBwMnBfc3ViX2VsZW1lbnRfbm9hICpub2FfaWUpCit7CisJdFNpclAyUE5vYUF0dHIgKm5vYV9hdHRyID0KKwkJKHRTaXJQMlBOb2FBdHRyICopIGNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyUDJQTm9hQXR0cikpOworCVdNQV9MT0dEKCJSZWNlaXZlZCB1cGRhdGUgTm9BIGV2ZW50Iik7CisJaWYgKCFub2FfYXR0cikgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdFNpclAyUE5vYUF0dHIiKTsKKwkJcmV0dXJuOworCX0KKworCWNkZl9tZW1femVybyhub2FfYXR0ciwgc2l6ZW9mKHRTaXJQMlBOb2FBdHRyKSk7CisKKwlub2FfYXR0ci0+aW5kZXggPSBub2FfaWUtPmluZGV4OworCW5vYV9hdHRyLT5vcHBQc0ZsYWcgPSBub2FfaWUtPm9wcFBTOworCW5vYV9hdHRyLT5jdFdpbiA9IG5vYV9pZS0+Y3R3aW5kb3c7CisJaWYgKCFub2FfaWUtPm51bV9kZXNjcmlwdG9ycykgeworCQlXTUFfTE9HRCgiWmVybyBOb0EgZGVzY3JpcHRvcnMiKTsKKwl9IGVsc2UgeworCQlXTUFfTE9HRCgiJWQgTm9BIGRlc2NyaXB0b3JzIiwgbm9hX2llLT5udW1fZGVzY3JpcHRvcnMpOworCQlub2FfYXR0ci0+dU5vYTFJbnRlcnZhbENudCA9CisJCQlub2FfaWUtPm5vYV9kZXNjcmlwdG9yc1swXS50eXBlX2NvdW50OworCQlub2FfYXR0ci0+dU5vYTFEdXJhdGlvbiA9IG5vYV9pZS0+bm9hX2Rlc2NyaXB0b3JzWzBdLmR1cmF0aW9uOworCQlub2FfYXR0ci0+dU5vYTFJbnRlcnZhbCA9IG5vYV9pZS0+bm9hX2Rlc2NyaXB0b3JzWzBdLmludGVydmFsOworCQlub2FfYXR0ci0+dU5vYTFTdGFydFRpbWUgPQorCQkJbm9hX2llLT5ub2FfZGVzY3JpcHRvcnNbMF0uc3RhcnRfdGltZTsKKwkJaWYgKG5vYV9pZS0+bnVtX2Rlc2NyaXB0b3JzID4gMSkgeworCQkJbm9hX2F0dHItPnVOb2EySW50ZXJ2YWxDbnQgPQorCQkJCW5vYV9pZS0+bm9hX2Rlc2NyaXB0b3JzWzFdLnR5cGVfY291bnQ7CisJCQlub2FfYXR0ci0+dU5vYTJEdXJhdGlvbiA9CisJCQkJbm9hX2llLT5ub2FfZGVzY3JpcHRvcnNbMV0uZHVyYXRpb247CisJCQlub2FfYXR0ci0+dU5vYTJJbnRlcnZhbCA9CisJCQkJbm9hX2llLT5ub2FfZGVzY3JpcHRvcnNbMV0uaW50ZXJ2YWw7CisJCQlub2FfYXR0ci0+dU5vYTJTdGFydFRpbWUgPQorCQkJCW5vYV9pZS0+bm9hX2Rlc2NyaXB0b3JzWzFdLnN0YXJ0X3RpbWU7CisJCX0KKwl9CisJV01BX0xPR0koIlNlbmRpbmcgU0lSX0hBTF9QMlBfTk9BX0FUVFJfSU5EIHRvIExJTSIpOworCXdtYV9zZW5kX21zZyh3bWFfaGFuZGxlLCBTSVJfSEFMX1AyUF9OT0FfQVRUUl9JTkQsICh2b2lkICopbm9hX2F0dHIsIDApOworfQorCisvKioKKyAqIHdtYV9wMnBfbm9hX2V2ZW50X2hhbmRsZXIoKSAtIHAycCBub2EgZXZlbnQgaGFuZGxlcgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGV2ZW50OiBldmVudCBkYXRhCisgKiBAbGVuOiBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAqLworaW50IHdtYV9wMnBfbm9hX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpldmVudCwKKwkJCSAgICAgIHVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX1AyUF9OT0FfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX3AycF9ub2FfZXZlbnRfZml4ZWRfcGFyYW0gKnAycF9ub2FfZXZlbnQ7CisJdWludDhfdCB2ZGV2X2lkLCBpOworCXdtaV9wMnBfbm9hX2luZm8gKnAycF9ub2FfaW5mbzsKKwlzdHJ1Y3QgcDJwX3N1Yl9lbGVtZW50X25vYSBub2FfaWU7CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50MzJfdCBkZXNjcmlwdG9yczsKKworCXBhcmFtX2J1ZiA9IChXTUlfUDJQX05PQV9FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnQ7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgUDJQIE5vQSBldmVudCBidWZmZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcDJwX25vYV9ldmVudCA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJYnVmX3B0ciA9ICh1aW50OF90ICopIHAycF9ub2FfZXZlbnQ7CisJYnVmX3B0ciArPSBzaXplb2Yod21pX3AycF9ub2FfZXZlbnRfZml4ZWRfcGFyYW0pOworCXAycF9ub2FfaW5mbyA9ICh3bWlfcDJwX25vYV9pbmZvICopIChidWZfcHRyKTsKKwl2ZGV2X2lkID0gcDJwX25vYV9ldmVudC0+dmRldl9pZDsKKworCWlmIChXTUlfVU5JRklFRF9OT0FfQVRUUl9JU19NT0RJRklFRChwMnBfbm9hX2luZm8pKSB7CisKKwkJY2RmX21lbV96ZXJvKCZub2FfaWUsIHNpemVvZihub2FfaWUpKTsKKwkJbm9hX2llLmluZGV4ID0KKwkJCSh1aW50OF90KSBXTUlfVU5JRklFRF9OT0FfQVRUUl9JTkRFWF9HRVQocDJwX25vYV9pbmZvKTsKKwkJbm9hX2llLm9wcFBTID0KKwkJCSh1aW50OF90KSBXTUlfVU5JRklFRF9OT0FfQVRUUl9PUFBfUFNfR0VUKHAycF9ub2FfaW5mbyk7CisJCW5vYV9pZS5jdHdpbmRvdyA9CisJCQkodWludDhfdCkgV01JX1VOSUZJRURfTk9BX0FUVFJfQ1RXSU5fR0VUKHAycF9ub2FfaW5mbyk7CisJCWRlc2NyaXB0b3JzID0gV01JX1VOSUZJRURfTk9BX0FUVFJfTlVNX0RFU0NfR0VUKHAycF9ub2FfaW5mbyk7CisJCW5vYV9pZS5udW1fZGVzY3JpcHRvcnMgPSAodWludDhfdCkgZGVzY3JpcHRvcnM7CisKKwkJV01BX0xPR0koIiVzOiBpbmRleCAldSwgb3BwUHMgJXUsIGN0d2luZG93ICV1LCAiCisJCQkgIm51bV9kZXNjcmlwdG9ycyA9ICV1IiwgX19mdW5jX18sIG5vYV9pZS5pbmRleCwKKwkJCSBub2FfaWUub3BwUFMsIG5vYV9pZS5jdHdpbmRvdywgbm9hX2llLm51bV9kZXNjcmlwdG9ycyk7CisJCWZvciAoaSA9IDA7IGkgPCBub2FfaWUubnVtX2Rlc2NyaXB0b3JzOyBpKyspIHsKKwkJCW5vYV9pZS5ub2FfZGVzY3JpcHRvcnNbaV0udHlwZV9jb3VudCA9CisJCQkJKHVpbnQ4X3QpIHAycF9ub2FfaW5mby0+bm9hX2Rlc2NyaXB0b3JzW2ldLgorCQkJCXR5cGVfY291bnQ7CisJCQlub2FfaWUubm9hX2Rlc2NyaXB0b3JzW2ldLmR1cmF0aW9uID0KKwkJCQlwMnBfbm9hX2luZm8tPm5vYV9kZXNjcmlwdG9yc1tpXS5kdXJhdGlvbjsKKwkJCW5vYV9pZS5ub2FfZGVzY3JpcHRvcnNbaV0uaW50ZXJ2YWwgPQorCQkJCXAycF9ub2FfaW5mby0+bm9hX2Rlc2NyaXB0b3JzW2ldLmludGVydmFsOworCQkJbm9hX2llLm5vYV9kZXNjcmlwdG9yc1tpXS5zdGFydF90aW1lID0KKwkJCQlwMnBfbm9hX2luZm8tPm5vYV9kZXNjcmlwdG9yc1tpXS5zdGFydF90aW1lOworCQkJV01BX0xPR0koIiVzOiBOb0EgZGVzY3JpcHRvclslZF0gdHlwZV9jb3VudCAldSwgIgorCQkJCSAiZHVyYXRpb24gJXUsIGludGVydmFsICV1LCBzdGFydF90aW1lID0gJXUiLAorCQkJCSBfX2Z1bmNfXywgaSwKKwkJCQkgbm9hX2llLm5vYV9kZXNjcmlwdG9yc1tpXS50eXBlX2NvdW50LAorCQkJCSBub2FfaWUubm9hX2Rlc2NyaXB0b3JzW2ldLmR1cmF0aW9uLAorCQkJCSBub2FfaWUubm9hX2Rlc2NyaXB0b3JzW2ldLmludGVydmFsLAorCQkJCSBub2FfaWUubm9hX2Rlc2NyaXB0b3JzW2ldLnN0YXJ0X3RpbWUpOworCQl9CisKKwkJLyogU2VuZCBhIG1zZyB0byBMSU0gdG8gdXBkYXRlIHRoZSBOb0EgSUUgaW4gcHJvYmUgcmVzcG9uc2UKKwkJICogZnJhbWVzIHRyYW5zbWl0dGVkIGJ5IHRoZSBob3N0ICovCisJCXdtYV91cGRhdGVfcHJvYmVfcmVzcF9ub2Eod21hLCAmbm9hX2llKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfc2V0X3AycGdvX25vYV9yZXEoKSAtIHNlbmQgcDJwIGdvIG5vYSByZXF1ZXN0IHRvIGZ3CisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAbm9hOiBwMnAgcG93ZXIgc2F2ZSBwYXJhbWV0ZXJzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9zZXRfcDJwZ29fbm9hX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwgdFAycFBzUGFyYW1zICpub2EpCit7CisJd21pX3AycF9zZXRfbm9hX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9wMnBfbm9hX2Rlc2NyaXB0b3IgKm5vYV9kaXNjcmlwdG9yOworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50MTZfdCBsZW47CisJaW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgZHVyYXRpb247CisKKwlXTUFfTE9HRCgiJXM6IEVudGVyIiwgX19mdW5jX18pOworCWxlbiA9IHNpemVvZigqY21kKSArIFdNSV9UTFZfSERSX1NJWkUgKyBzaXplb2YoKm5vYV9kaXNjcmlwdG9yKTsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJY21kID0gKHdtaV9wMnBfc2V0X25vYV9jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcDJwX3NldF9ub2FfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9wMnBfc2V0X25vYV9jbWRfZml4ZWRfcGFyYW0pKTsKKwlkdXJhdGlvbiA9IChub2EtPmNvdW50ID09IDEpID8gbm9hLT5zaW5nbGVfbm9hX2R1cmF0aW9uIDogbm9hLT5kdXJhdGlvbjsKKwljbWQtPnZkZXZfaWQgPSBub2EtPnNlc3Npb25JZDsKKwljbWQtPmVuYWJsZSA9IChkdXJhdGlvbikgPyB0cnVlIDogZmFsc2U7CisJY21kLT5udW1fbm9hID0gMTsKKworCVdNSVRMVl9TRVRfSERSKChidWZfcHRyICsgc2l6ZW9mKHdtaV9wMnBfc2V0X25vYV9jbWRfZml4ZWRfcGFyYW0pKSwKKwkJICAgICAgIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHNpemVvZih3bWlfcDJwX25vYV9kZXNjcmlwdG9yKSk7CisJbm9hX2Rpc2NyaXB0b3IgPSAod21pX3AycF9ub2FfZGVzY3JpcHRvciAqKSAoYnVmX3B0ciArCisJCQkJCQkgICAgIHNpemVvZgorCQkJCQkJICAgICAod21pX3AycF9zZXRfbm9hX2NtZF9maXhlZF9wYXJhbSkKKwkJCQkJCSAgICAgKyBXTUlfVExWX0hEUl9TSVpFKTsKKwlXTUlUTFZfU0VUX0hEUigmbm9hX2Rpc2NyaXB0b3ItPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wMnBfbm9hX2Rlc2NyaXB0b3IsCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX3AycF9ub2FfZGVzY3JpcHRvcikpOworCW5vYV9kaXNjcmlwdG9yLT50eXBlX2NvdW50ID0gbm9hLT5jb3VudDsKKwlub2FfZGlzY3JpcHRvci0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKwlub2FfZGlzY3JpcHRvci0+aW50ZXJ2YWwgPSBub2EtPmludGVydmFsOworCW5vYV9kaXNjcmlwdG9yLT5zdGFydF90aW1lID0gMDsKKworCVdNQV9MT0dJKCJTRVQgUDJQIEdPIE5PQTp2ZGV2X2lkOiVkIGNvdW50OiVkIGR1cmF0aW9uOiVkIGludGVydmFsOiVkIiwKKwkJIGNtZC0+dmRldl9pZCwgbm9hLT5jb3VudCwgbm9hX2Rpc2NyaXB0b3ItPmR1cmF0aW9uLAorCQkgbm9hLT5pbnRlcnZhbCk7CisJc3RhdHVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICAgICBXTUlfRldURVNUX1AyUF9TRVRfTk9BX1BBUkFNX0NNRElEKTsKKwlpZiAoc3RhdHVzICE9IEVPSykgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgV01JX0ZXVEVTVF9QMlBfU0VUX05PQV9QQVJBTV9DTURJRCIpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwl9CisKK2VuZDoKKwlXTUFfTE9HRCgiJXM6IEV4aXQiLCBfX2Z1bmNfXyk7Cit9CisKKy8qKgorICogd21hX3NldF9wMnBnb19vcHBwc19yZXEoKSAtIHNlbmQgcDJwIGdvIG9wcCBwb3dlciBzYXZlIHJlcXVlc3QgdG8gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBub2E6IHAycCBvcHAgcG93ZXIgc2F2ZSBwYXJhbWV0ZXJzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9zZXRfcDJwZ29fb3BwcHNfcmVxKHRwX3dtYV9oYW5kbGUgd21hLCB0UDJwUHNQYXJhbXMgKm9wcHBzKQoreworCXdtaV9wMnBfc2V0X29wcHBzX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJaW50MzJfdCBzdGF0dXM7CisKKwlXTUFfTE9HRCgiJXM6IEVudGVyIiwgX19mdW5jX18pOworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBzaXplb2YoKmNtZCkpOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5Iik7CisJCWdvdG8gZW5kOworCX0KKworCWNtZCA9ICh3bWlfcDJwX3NldF9vcHBwc19jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3AycF9zZXRfb3BwcHNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9wMnBfc2V0X29wcHBzX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IG9wcHBzLT5zZXNzaW9uSWQ7CisJaWYgKG9wcHBzLT5jdFdpbmRvdykKKwkJV01JX1VOSUZJRURfT1BQUFNfQVRUUl9FTkFCTEVEX1NFVChjbWQpOworCisJV01JX1VOSUZJRURfT1BQUFNfQVRUUl9DVFdJTl9TRVQoY21kLCBvcHBwcy0+Y3RXaW5kb3cpOworCVdNQV9MT0dJKCJTRVQgUDJQIEdPIE9QUFBTOnZkZXZfaWQ6JWQgY3R3aW5kb3c6JWQiLAorCQkgY21kLT52ZGV2X2lkLCBvcHBwcy0+Y3RXaW5kb3cpOworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBzaXplb2YoKmNtZCksCisJCQkJICAgICAgV01JX1AyUF9TRVRfT1BQUFNfUEFSQU1fQ01ESUQpOworCWlmIChzdGF0dXMgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCBXTUlfUDJQX1NFVF9PUFBQU19QQVJBTV9DTURJRCIpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwl9CisKK2VuZDoKKwlXTUFfTE9HRCgiJXM6IEV4aXQiLCBfX2Z1bmNfXyk7Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3Nfc2V0X3AycGdvX25vYV9yZXEoKSAtIHByb2Nlc3MgcDJwZ28gbm9hIHJlcXVlc3QKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBwc19wYXJhbXM6IHBvd2Vyc2F2ZSBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfcHJvY2Vzc19zZXRfcDJwZ29fbm9hX3JlcSh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgICB0UDJwUHNQYXJhbXMgKnBzX3BhcmFtcykKK3sKKwlXTUFfTE9HRCgiJXM6IEVudGVyIiwgX19mdW5jX18pOworCWlmIChwc19wYXJhbXMtPm9wcF9wcykgeworCQl3bWFfc2V0X3AycGdvX29wcHBzX3JlcSh3bWEsIHBzX3BhcmFtcyk7CisJfSBlbHNlIHsKKwkJd21hX3NldF9wMnBnb19ub2FfcmVxKHdtYSwgcHNfcGFyYW1zKTsKKwl9CisKKwlXTUFfTE9HRCgiJXM6IEV4aXQiLCBfX2Z1bmNfXyk7Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3Nfc2V0X21pbW9wc19yZXEoKSAtIFNldCB0aGUgcmVjZWl2ZWQgTWlNbyBQUyBzdGF0ZSB0byBmaXJtd2FyZQorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQG1pbW9wczogTUlNTyBwb3dlcnNhdmUgcGFyYW1zCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3Byb2Nlc3Nfc2V0X21pbW9wc19yZXEodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCXRTZXRNSU1PUFMgKm1pbW9wcykKK3sKKwkvKiBUcmFuc2xhdGUgdG8gd2hhdCBmaXJtd2FyZSB1bmRlcnN0YW5kcyAqLworCWlmIChtaW1vcHMtPmh0TUlNT1BTU3RhdGUgPT0gZVNJUl9IVF9NSU1PX1BTX0RZTkFNSUMpCisJCW1pbW9wcy0+aHRNSU1PUFNTdGF0ZSA9IFdNSV9QRUVSX01JTU9fUFNfRFlOQU1JQzsKKwllbHNlIGlmIChtaW1vcHMtPmh0TUlNT1BTU3RhdGUgPT0gZVNJUl9IVF9NSU1PX1BTX1NUQVRJQykKKwkJbWltb3BzLT5odE1JTU9QU1N0YXRlID0gV01JX1BFRVJfTUlNT19QU19TVEFUSUM7CisJZWxzZSBpZiAobWltb3BzLT5odE1JTU9QU1N0YXRlID09IGVTSVJfSFRfTUlNT19QU19OT19MSU1JVCkKKwkJbWltb3BzLT5odE1JTU9QU1N0YXRlID0gV01JX1BFRVJfTUlNT19QU19OT05FOworCisJV01BX0xPR0QoIiVzOiBodE1JTU9QU1N0YXRlID0gJWQsIHNlc3Npb25JZCA9ICVkIFwKKwkJIHBlZXJNYWMgPCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4PiIsIF9fZnVuY19fLAorCQkgbWltb3BzLT5odE1JTU9QU1N0YXRlLCBtaW1vcHMtPnNlc3Npb25JZCwgbWltb3BzLT5wZWVyTWFjWzBdLAorCQkgbWltb3BzLT5wZWVyTWFjWzFdLCBtaW1vcHMtPnBlZXJNYWNbMl0sIG1pbW9wcy0+cGVlck1hY1szXSwKKwkJIG1pbW9wcy0+cGVlck1hY1s0XSwgbWltb3BzLT5wZWVyTWFjWzVdKTsKKworCXdtYV9zZXRfcGVlcl9wYXJhbSh3bWFfaGFuZGxlLCBtaW1vcHMtPnBlZXJNYWMsCisJCQkgICBXTUlfUEVFUl9NSU1PX1BTX1NUQVRFLCBtaW1vcHMtPmh0TUlNT1BTU3RhdGUsCisJCQkgICBtaW1vcHMtPnNlc3Npb25JZCk7Cit9CisKKy8qKgorICogd21hX3NldF9taW1vcHMoKSAtIHNldCBNSU1PIHBvd2Vyc2F2ZQorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEB2YWx1ZTogdmFsdWUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlLgorICovCitDREZfU1RBVFVTIHdtYV9zZXRfbWltb3BzKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IHZkZXZfaWQsIGludCB2YWx1ZSkKK3sKKwlpbnQgcmV0ID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXdtaV9zdGFfc21wc19mb3JjZV9tb2RlX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCBidWY7CisJdWludDE2X3QgbGVuID0gc2l6ZW9mKCpjbWQpOworCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOndtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY21kID0gKHdtaV9zdGFfc21wc19mb3JjZV9tb2RlX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfc3RhX3NtcHNfZm9yY2VfbW9kZV9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3N0YV9zbXBzX2ZvcmNlX21vZGVfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwljbWQtPnZkZXZfaWQgPSB2ZGV2X2lkOworCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMDoKKwkJY21kLT5mb3JjZWRfbW9kZSA9IFdNSV9TTVBTX0ZPUkNFRF9NT0RFX05PTkU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJY21kLT5mb3JjZWRfbW9kZSA9IFdNSV9TTVBTX0ZPUkNFRF9NT0RFX0RJU0FCTEVEOworCQlicmVhazsKKwljYXNlIDI6CisJCWNtZC0+Zm9yY2VkX21vZGUgPSBXTUlfU01QU19GT1JDRURfTU9ERV9TVEFUSUM7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJY21kLT5mb3JjZWRfbW9kZSA9IFdNSV9TTVBTX0ZPUkNFRF9NT0RFX0RZTkFNSUM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdNQV9MT0dFKCIlczpJTlZBTElEIE1pbW8gUFMgQ09ORklHIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJV01BX0xPR0QoIlNldHRpbmcgdmRldiAlZCB2YWx1ZSA9ICV1IiwgdmRldl9pZCwgdmFsdWUpOworCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfU1RBX1NNUFNfRk9SQ0VfTU9ERV9DTURJRCk7CisJaWYgKHJldCA8IDApIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIHNldCBNaW1vIFBTIHJldCA9ICVkIiwgcmV0KTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfbm90aWZ5X21vZGVtX3Bvd2VyX3N0YXRlKCkgLSBub3RpZnkgbW9kZW0gcG93ZXIgc3RhdGUKKyAqIEB3bWFfcHRyOiB3bWEgaGFuZGxlCisgKiBAcFJlcTogbW9kZW0gcG93ZXIgc3RhdGUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlLgorICovCitDREZfU1RBVFVTIHdtYV9ub3RpZnlfbW9kZW1fcG93ZXJfc3RhdGUodm9pZCAqd21hX3B0ciwKKwkJCQkJdFNpck1vZGVtUG93ZXJTdGF0ZUluZCAqcFJlcSkKK3sKKwlpbnQzMl90IHJldDsKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSB3bWFfcHRyOworCisJV01BX0xPR0QoIiVzOiBXTUEgbm90aWZ5IE1vZGVtIFBvd2VyIFN0YXRlICVkIiwgX19mdW5jX18sIHBSZXEtPnBhcmFtKTsKKworCXJldCA9IHdtaV91bmlmaWVkX21vZGVtX3Bvd2VyX3N0YXRlKHdtYS0+d21pX2hhbmRsZSwgcFJlcS0+cGFyYW0pOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsIHRvIG5vdGlmeSBNb2RlbSBQb3dlciBTdGF0ZSAlZCIsCisJCQkgX19mdW5jX18sIHBSZXEtPnBhcmFtKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCVdNQV9MT0dEKCJTdWNjZXNzZnVsbHkgbm90aWZ5IE1vZGVtIFBvd2VyIFN0YXRlICVkIiwgcFJlcS0+cGFyYW0pOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3NldF9pZGxlX3BzX2NvbmZpZygpIC0gZW5hYmxlL2Rpc2JsZSBMb3cgUG93ZXIgU3VwcG9ydChQZGV2IFNwZWNpZmljKQorICogQHdtYV9wdHI6IHdtYSBoYW5kbGUKKyAqIEBpZGxlX3BzOiBpZGxlIHBvd2Vyc2F2ZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCisgKi8KK0NERl9TVEFUVVMgd21hX3NldF9pZGxlX3BzX2NvbmZpZyh2b2lkICp3bWFfcHRyLCB1aW50MzJfdCBpZGxlX3BzKQoreworCWludDMyX3QgcmV0OworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIHdtYV9wdHI7CisKKwlXTUFfTE9HRCgiV01BIFNldCBJZGxlIFBzIENvbmZpZyBbMTpzZXQgMDpjbGVhcl0gdmFsICVkIiwgaWRsZV9wcyk7CisKKwkvKiBTZXQgSWRsZSBNb2RlIFBvd2VyIFNhdmUgQ29uZmlnICovCisJcmV0ID0gd21pX3VuaWZpZWRfcGRldl9zZXRfcGFyYW0od21hLT53bWlfaGFuZGxlLAorCQkJCQkgV01JX1BERVZfUEFSQU1fSURMRV9QU19DT05GSUcsCisJCQkJCSBpZGxlX3BzKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCJGYWlsIHRvIFNldCBJZGxlIFBzIENvbmZpZyAlZCIsIGlkbGVfcHMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJV01BX0xPR0QoIlN1Y2Nlc3NmdWxseSBTZXQgSWRsZSBQcyBDb25maWcgJWQiLCBpZGxlX3BzKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9zZXRfc21wc19wYXJhbXMoKSAtIHNldCBzbXBzIHBhcmFtcworICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqIEB2YWx1ZTogdmFsdWUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlLgorICovCitDREZfU1RBVFVTIHdtYV9zZXRfc21wc19wYXJhbXModHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCwKKwkJCSAgICAgICBpbnQgdmFsdWUpCit7CisJaW50IHJldCA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl3bWlfc3RhX3NtcHNfcGFyYW1fY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50MTZfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6d21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljbWQgPSAod21pX3N0YV9zbXBzX3BhcmFtX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfc3RhX3NtcHNfcGFyYW1fY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9zdGFfc21wc19wYXJhbV9jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJY21kLT52YWx1ZSA9IHZhbHVlICYgV01BX1NNUFNfTUFTS19MT1dFUl8xNkJJVFM7CisJY21kLT5wYXJhbSA9CisJCSh2YWx1ZSA+PiBXTUFfU01QU19QQVJBTV9WQUxVRV9TKSAmIFdNQV9TTVBTX01BU0tfVVBQRVJfM0JJVFM7CisKKwlXTUFfTE9HRCgiU2V0dGluZyB2ZGV2ICVkIHZhbHVlID0gJXggcGFyYW0gJXgiLCB2ZGV2X2lkLCBjbWQtPnZhbHVlLAorCQkgY21kLT5wYXJhbSk7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9TVEFfU01QU19QQVJBTV9DTURJRCk7CisJaWYgKHJldCA8IDApIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBzZW5kIHNldCBNaW1vIFBTIHJldCA9ICVkIiwgcmV0KTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfc2V0X3ZkZXZfc3VzcGVuZF9kdGltKCkgLSBzZXQgc3VzcGVuZCBkdGltIHBhcmFtZXRlcnMgaW4gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9zZXRfdmRldl9zdXNwZW5kX2R0aW0odHBfd21hX2hhbmRsZSB3bWEsIHVpbnQ4X3QgdmRldl9pZCkKK3sKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaWZhY2UgPSAmd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdOworCWVudW0gcG93ZXJzYXZlX3Fwb3dlcl9tb2RlIHFwb3dlcl9jb25maWcgPSB3bWFfZ2V0X3Fwb3dlcl9jb25maWcod21hKTsKKworCWlmICgoaWZhY2UtPnR5cGUgPT0gV01JX1ZERVZfVFlQRV9TVEEpICYmCisJICAgIChpZmFjZS0+cHNfZW5hYmxlZCA9PSB0cnVlKSAmJgorCSAgICAoaWZhY2UtPmR0aW1QZXJpb2QgIT0gMCkpIHsKKwkJaW50MzJfdCByZXQ7CisJCXVpbnQzMl90IGxpc3Rlbl9pbnRlcnZhbDsKKwkJdWludDMyX3QgbWF4X21vZF9kdGltOworCisJCWlmICh3bWEtPnN0YUR5bmFtaWNEdGltKSB7CisJCQlsaXN0ZW5faW50ZXJ2YWwgPSB3bWEtPnN0YUR5bmFtaWNEdGltOworCQl9IGVsc2UgaWYgKCh3bWEtPnN0YU1vZER0aW0pICYmCisJCQkgICAod21hLT5zdGFNYXhMSU1vZER0aW0pKSB7CisJCQkvKgorCQkJICogV2hlbiB0aGUgc3lzdGVtIGlzIGluIHN1c3BlbmQKKwkJCSAqIChtYXhpbXVtIGJlYWNvbiB3aWxsIGJlIGF0IDFzID09IDEwKQorCQkJICogSWYgbWF4TW9kdWxhdGVkRFRJTSAoKE1BWF9MSV9WQUwgPSAxMCkgLyBBUF9EVElNKQorCQkJICogZXF1YWwgb3IgbGFyZ2VyIHRoYW4gTURUSU0KKwkJCSAqIChjb25maWd1cmVkIGluIFdDTlNTX3Fjb21fY2ZnLmluaSkKKwkJCSAqIFNldCBMSSB0byBNRFRJTSAqIEFQX0RUSU0KKwkJCSAqIElmIER0aW0gPSAyIGFuZCBNZHRpbSA9IDIgdGhlbiBMSSBpcyA0CisJCQkgKiBFbHNlCisJCQkgKiBTZXQgTEkgdG8gbWF4TW9kdWxhdGVkRFRJTSAqIEFQX0RUSU0KKwkJCSAqLworCQkJbWF4X21vZF9kdGltID0gd21hLT5zdGFNYXhMSU1vZER0aW0gLyBpZmFjZS0+ZHRpbVBlcmlvZDsKKwkJCWlmIChtYXhfbW9kX2R0aW0gPj0gd21hLT5zdGFNb2REdGltKSB7CisJCQkJbGlzdGVuX2ludGVydmFsID0KKwkJCQkJKHdtYS0+c3RhTW9kRHRpbSAqIGlmYWNlLT5kdGltUGVyaW9kKTsKKwkJCX0gZWxzZSB7CisJCQkJbGlzdGVuX2ludGVydmFsID0KKwkJCQkJKG1heF9tb2RfZHRpbSAqIGlmYWNlLT5kdGltUGVyaW9kKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fTElTVEVOX0lOVEVSVkFMLAorCQkJCQkJICAgICAgbGlzdGVuX2ludGVydmFsKTsKKwkJaWYgKHJldCkgeworCQkJLyogRXZlbiBpdCBmYWlscyBjb250aW51ZSBGdyB3aWxsIHRha2UgZGVmYXVsdCBMSSAqLworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBTZXQgTGlzdGVuIEludGVydmFsIHZkZXZJZCAlZCIsCisJCQkJIHZkZXZfaWQpOworCQl9CisKKwkJV01BX0xPR0QoIlNldCBMaXN0ZW4gSW50ZXJ2YWwgdmRldklkICVkIExpc3RlbiBJbnR2ICVkIiwKKwkJCSB2ZGV2X2lkLCBsaXN0ZW5faW50ZXJ2YWwpOworCisJCWlmIChxcG93ZXJfY29uZmlnKSB7CisJCQlXTUFfTE9HRCgiZGlzYWJsZSBRcG93ZXIgaW4gc3VzcGVuZCBtb2RlISIpOworCQkJcmV0ID0gd21pX3VuaWZpZWRfc2V0X3N0YV9wc19wYXJhbSh3bWEtPndtaV9oYW5kbGUsCisJCQkJCQl2ZGV2X2lkLAorCQkJCQkJV01JX1NUQV9QU19FTkFCTEVfUVBPV0VSLAorCQkJCQkJMCk7CisJCQlpZiAocmV0KQorCQkJCVdNQV9MT0dFKCJGYWlsZWQgdG8gZGlzYWJsZSBRcG93ZXIgaW4gc3VzcGVuZCBtb2RlISIpOworCisJCQlpZmFjZS0+cHNfZW5hYmxlZCA9IHRydWU7CisJCX0KKworCQlyZXQgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwgdmRldl9pZCwKKwkJCQkJCSAgICAgIFdNSV9WREVWX1BBUkFNX0RUSU1fUE9MSUNZLAorCQkJCQkJICAgICAgTk9STUFMX0RUSU0pOworCQlpZiAocmV0KQorCQkJV01BX0xPR0UoIkZhaWxlZCB0byBTZXQgdG8gTm9ybWFsIERUSU0gdmRldklkICVkIiwKKwkJCQkgdmRldl9pZCk7CisKKwkJLyogU2V0IGl0IHRvIE5vcm1hbCBEVElNICovCisJCWlmYWNlLT5kdGltX3BvbGljeSA9IE5PUk1BTF9EVElNOworCQlXTUFfTE9HRCgiU2V0IERUSU0gUG9saWN5IHRvIE5vcm1hbCBEdGltIHZkZXZJZCAlZCIsIHZkZXZfaWQpOworCX0KK30KKworLyoqCisgKiB3bWFfc2V0X3N1c3BlbmRfZHRpbSgpIC0gc2V0IHN1c3BlbmQgZHRpbQorICogQHdtYTogd21hIGhhbmRsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9zZXRfc3VzcGVuZF9kdGltKHRwX3dtYV9oYW5kbGUgd21hKQoreworCXVpbnQ4X3QgaTsKKworCWlmIChOVUxMID09IHdtYSkgeworCQlXTUFfTE9HRSgiJXM6IHdtYSBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IHdtYS0+bWF4X2Jzc2lkOyBpKyspIHsKKwkgIGlmICgod21hLT5pbnRlcmZhY2VzW2ldLmhhbmRsZSkgJiYKKwkgICAgICAoZmFsc2UgPT0gd21hLT5pbnRlcmZhY2VzW2ldLmFsdF9tb2R1bGF0ZWRfZHRpbV9lbmFibGVkKSkgeworCQkJd21hX3NldF92ZGV2X3N1c3BlbmRfZHRpbSh3bWEsIGkpOworCQl9CisJfQorfQorCisvKioKKyAqIHdtYV9zZXRfdmRldl9yZXN1bWVfZHRpbSgpIC0gc2V0IHJlc3VtZSBkdGltIHBhcmFtZXRlcnMgaW4gZncKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV9zZXRfdmRldl9yZXN1bWVfZHRpbSh0cF93bWFfaGFuZGxlIHdtYSwgdWludDhfdCB2ZGV2X2lkKQoreworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppZmFjZSA9ICZ3bWEtPmludGVyZmFjZXNbdmRldl9pZF07CisJZW51bSBwb3dlcnNhdmVfcXBvd2VyX21vZGUgcXBvd2VyX2NvbmZpZyA9IHdtYV9nZXRfcXBvd2VyX2NvbmZpZyh3bWEpOworCisJaWYgKChpZmFjZS0+dHlwZSA9PSBXTUlfVkRFVl9UWVBFX1NUQSkgJiYKKwkgICAgKGlmYWNlLT5wc19lbmFibGVkID09IHRydWUpICYmCisJICAgIChpZmFjZS0+ZHRpbV9wb2xpY3kgPT0gTk9STUFMX0RUSU0pKSB7CisJCWludDMyX3QgcmV0OworCQl1aW50MzJfdCBjZmdfZGF0YV92YWwgPSAwOworCQkvKiBnZXQgbWFjIHRvIGFjZXNzIENGRyBkYXRhIGJhc2UgKi8KKwkJc3RydWN0IHNBbmlTaXJHbG9iYWwgKm1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKwkJLyogU2V0IExpc3RlbiBJbnRlcnZhbCAqLworCQlpZiAoKE5VTEwgPT0gbWFjKSB8fCAod2xhbl9jZmdfZ2V0X2ludChtYWMsCisJCQkJCQkgICAgICAgV05JX0NGR19MSVNURU5fSU5URVJWQUwsCisJCQkJCQkgICAgICAgJmNmZ19kYXRhX3ZhbCkgIT0KKwkJCQkgICAgICBlU0lSX1NVQ0NFU1MpKSB7CisJCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCQkgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBsaXN0ZW4gaW50ZXJ2YWwiKTsKKwkJCWNmZ19kYXRhX3ZhbCA9IFBPV0VSU0FWRV9ERUZBVUxUX0xJU1RFTl9JTlRFUlZBTDsKKwkJfQorCisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fTElTVEVOX0lOVEVSVkFMLAorCQkJCQkJICAgICAgY2ZnX2RhdGFfdmFsKTsKKwkJaWYgKHJldCkgeworCQkJLyogRXZlbiBpdCBmYWlscyBjb250aW51ZSBGdyB3aWxsIHRha2UgZGVmYXVsdCBMSSAqLworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBTZXQgTGlzdGVuIEludGVydmFsIHZkZXZJZCAlZCIsCisJCQkJIHZkZXZfaWQpOworCQl9CisKKwkJV01BX0xPR0QoIlNldCBMaXN0ZW4gSW50ZXJ2YWwgdmRldklkICVkIExpc3RlbiBJbnR2ICVkIiwKKwkJCSB2ZGV2X2lkLCBjZmdfZGF0YV92YWwpOworCisJCXJldCA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hLT53bWlfaGFuZGxlLCB2ZGV2X2lkLAorCQkJCQkJICAgICAgV01JX1ZERVZfUEFSQU1fRFRJTV9QT0xJQ1ksCisJCQkJCQkgICAgICBTVElDS19EVElNKTsKKwkJaWYgKHJldCkgeworCQkJLyogU2V0IGl0IGJhY2sgdG8gU3RpY2sgRFRJTSAqLworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBTZXQgdG8gU3RpY2sgRFRJTSB2ZGV2SWQgJWQiLAorCQkJCSB2ZGV2X2lkKTsKKwkJfQorCQlpZmFjZS0+ZHRpbV9wb2xpY3kgPSBTVElDS19EVElNOworCQlXTUFfTE9HRCgiU2V0IERUSU0gUG9saWN5IHRvIFN0aWNrIER0aW0gdmRldklkICVkIiwgdmRldl9pZCk7CisKKwkJaWYgKHFwb3dlcl9jb25maWcpIHsKKwkJCVdNQV9MT0dEKCJlbmFibGUgUXBvd2VyIGluIHJlc3VtZSBtb2RlISIpOworCQkJcmV0ID0gd21pX3VuaWZpZWRfc2V0X3N0YV9wc19wYXJhbSh3bWEtPndtaV9oYW5kbGUsCisJCQkJCQl2ZGV2X2lkLAorCQkJCQkJV01JX1NUQV9QU19FTkFCTEVfUVBPV0VSLAorCQkJCQkJMSk7CisJCQlpZiAocmV0KQorCQkJCVdNQV9MT0dFKCJGYWlsZWQgdG8gZW5hYmxlIFFwb3dlciBpbiByZXN1bWUgbW9kZSEiKTsKKwkJfQorCX0KK30KKworLyoqCisgKiB3bWFfc2V0X3Jlc3VtZV9kdGltKCkgLSBzZXQgcmVzdW1lIGR0aW0KKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfc2V0X3Jlc3VtZV9kdGltKHRwX3dtYV9oYW5kbGUgd21hKQoreworCXVpbnQ4X3QgaTsKKworCWlmIChOVUxMID09IHdtYSkgeworCQlXTUFfTE9HRSgiJXM6IHdtYSBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IHdtYS0+bWF4X2Jzc2lkOyBpKyspIHsKKwkgIGlmICgod21hLT5pbnRlcmZhY2VzW2ldLmhhbmRsZSkgJiYKKwkgICAgICAoZmFsc2UgPT0gd21hLT5pbnRlcmZhY2VzW2ldLmFsdF9tb2R1bGF0ZWRfZHRpbV9lbmFibGVkKSkgeworCQkJd21hX3NldF92ZGV2X3Jlc3VtZV9kdGltKHdtYSwgaSk7CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhL2NvcmUvd21hL3NyYy93bWFfc2Nhbl9yb2FtLmMgYi9jb3JlL3dtYS9zcmMvd21hX3NjYW5fcm9hbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODIwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dtYS9zcmMvd21hX3NjYW5fcm9hbS5jCkBAIC0wLDAgKzEsNjg4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoqCisgKiAgRE9DOiAgICB3bWFfc2Nhbl9yb2FtLmMKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gc2NhbiBhbmQKKyAqICByb2FtaW5nIGZ1bmN0aW9uYWxpdHkuCisgKi8KKworLyogSGVhZGVyIGZpbGVzICovCisKKyNpbmNsdWRlICJ3bWEuaCIKKyNpbmNsdWRlICJ3bWFfYXBpLmgiCisjaW5jbHVkZSAiY2RzX2FwaS5oIgorI2luY2x1ZGUgIndtaV91bmlmaWVkX2FwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3N5cy5oIgorI2luY2x1ZGUgInduaV9hcGkuaCIKKyNpbmNsdWRlICJhbmlfZ2xvYmFsLmgiCisjaW5jbHVkZSAid21pX3VuaWZpZWQuaCIKKyNpbmNsdWRlICJ3bmlfY2ZnLmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgIm9sX3R4cnhfY3RybF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3RndF9kZWZfY29uZmlnLmgiCisKKyNpbmNsdWRlICJjZGZfbmJ1Zi5oIgorI2luY2x1ZGUgImNkZl90eXBlcy5oIgorI2luY2x1ZGUgIm9sX3R4cnhfYXBpLmgiCisjaW5jbHVkZSAiY2RmX21lbW9yeS5oIgorI2luY2x1ZGUgIm9sX3R4cnhfdHlwZXMuaCIKKyNpbmNsdWRlICJvbF90eHJ4X3BlZXJfZmluZC5oIgorCisjaW5jbHVkZSAid21hX3R5cGVzLmgiCisjaW5jbHVkZSAibGltX2FwaS5oIgorI2luY2x1ZGUgImxpbV9zZXNzaW9uX3V0aWxzLmgiCisKKyNpbmNsdWRlICJjZHNfdXRpbHMuaCIKKworI2lmICFkZWZpbmVkKFJFTU9WRV9QS1RfTE9HKQorI2luY2x1ZGUgInBrdGxvZ19hYy5oIgorI2VuZGlmIC8qIFJFTU9WRV9QS1RfTE9HICovCisKKyNpbmNsdWRlICJkYmdsb2dfaG9zdC5oIgorLyogRklYTUU6IEluY2x1c2lvbiBvZiAuYyBsb29rcyBvZGQgYnV0IHRoaXMgaXMgaG93IGl0IGlzIGluIGludGVybmFsIGNvZGViYXNlICovCisjaW5jbHVkZSAiY3NyX2FwaS5oIgorI2luY2x1ZGUgIm9sX2Z3LmgiCisKKyNpbmNsdWRlICJkZnMuaCIKKyNpbmNsdWRlICJ3bWFfaW50ZXJuYWwuaCIKKworI2RlZmluZSBXTUFfTUNDX01JUkFDQVNUX1JFU1RfVElNRSA0MDAKKyNkZWZpbmUgV01BX1NDQU5fSURfTUFTSyAweDBmZmYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisvKioKKyAqIGVudW0gZXh0c2Nhbl9yZXBvcnRfZXZlbnRzX3R5cGUgLSBleHRzY2FuIHJlcG9ydCBldmVudHMgdHlwZQorICogQEVYVFNDQU5fUkVQT1JUX0VWRU5UU19CVUZGRVJfRlVMTDogcmVwb3J0IG9ubHkgd2hlbiBzY2FuIGhpc3RvcnkgaXMgJSBmdWxsCisgKiBARVhUU0NBTl9SRVBPUlRfRVZFTlRTX0VBQ0hfU0NBTjogcmVwb3J0IGEgc2NhbiBjb21wbGV0aW9uIGV2ZW50IGFmdGVyIHNjYW4KKyAqIEBFWFRTQ0FOX1JFUE9SVF9FVkVOVFNfRlVMTF9SRVNVTFRTOiBmb3J3YXJkIHNjYW4gcmVzdWx0cworICoJCShiZWFjb25zL3Byb2JlIHJlc3BvbnNlcyArIElFcykKKyAqCQlpbiByZWFsIHRpbWUgdG8gSEFMLCBpbiBhZGRpdGlvbiB0byBjb21wbGV0aW9uIGV2ZW50cy4KKyAqCQlOb3RlOiBUbyBrZWVwIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksCisgKgkJZmlyZSBjb21wbGV0aW9uIGV2ZW50cyByZWdhcmRsZXNzIG9mIFJFUE9SVF9FVkVOVFNfRUFDSF9TQ0FOLgorICogQEVYVFNDQU5fUkVQT1JUX0VWRU5UU19OT19CQVRDSDogY29udHJvbHMgYmF0Y2hpbmcsCisgKgkJMCA9PiBiYXRjaGluZywgMSA9PiBubyBiYXRjaGluZworICovCitlbnVtIGV4dHNjYW5fcmVwb3J0X2V2ZW50c190eXBlIHsKKwlFWFRTQ0FOX1JFUE9SVF9FVkVOVFNfQlVGRkVSX0ZVTEwgICA9IDB4MDAsCisJRVhUU0NBTl9SRVBPUlRfRVZFTlRTX0VBQ0hfU0NBTiAgICAgPSAweDAxLAorCUVYVFNDQU5fUkVQT1JUX0VWRU5UU19GVUxMX1JFU1VMVFMgID0gMHgwMiwKKwlFWFRTQ0FOX1JFUE9SVF9FVkVOVFNfTk9fQkFUQ0ggICAgICA9IDB4MDQsCit9OworCisjZGVmaW5lIFdNQV9FWFRTQ0FOX0NZQ0xFX1dBS0VfTE9DS19EVVJBVElPTiAoNSAqIDEwMDApIC8qIGluIG1zZWMgKi8KKyNlbmRpZgorCisvKioKKyAqIHdtYV9zZXRfcDJwX3NjYW5faW5mbygpIC0gc2V0IHAycCBzY2FuIGluZm8gaW4gd21hIGhhbmRsZQorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBzY2FuX2lkOiBzY2FuIGlkCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHAycF9zY2FuX3R5cGU6IHAycCBzY2FuIHR5cGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdtYV9zZXRfcDJwX3NjYW5faW5mbyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJICAgICB1aW50MzJfdCBzY2FuX2lkLAorCQkJCSAgICAgdWludDMyX3QgdmRldl9pZCwKKwkJCQkgICAgIHRTaXJQMnBTY2FuVHlwZSBwMnBfc2Nhbl90eXBlKQoreworCXdtYV9oYW5kbGUtPmludGVyZmFjZXNbdmRldl9pZF0ucDJwX3NjYW5faW5mby5zY2FuX2lkID0gc2Nhbl9pZDsKKwl3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnAycF9zY2FuX2luZm8ucDJwX3NjYW5fdHlwZSA9CisJCXAycF9zY2FuX3R5cGU7Cit9CisKKy8qKgorICogd21hX3Jlc2V0X3AycF9zY2FuX2luZm8oKSAtIHJlc2V0IHNjYW4gaW5mbyBmcm9tIHdtYSBoYW5kbGUKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd21hX3Jlc2V0X3AycF9zY2FuX2luZm8odHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICAgICB1aW50OF90IHZkZXZfaWQpCit7CisJY2RmX21lbV96ZXJvKCh2b2lkICopJih3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnAycF9zY2FuX2luZm8pLAorCQkgICAgIHNpemVvZihzdHJ1Y3QgcDJwX3NjYW5fcGFyYW0pKTsKK30KKworLyoqCisgKiB3bWFfaXNfbWNjXzI0RygpIC0gY2hlY2sgdGhhdCBpZiBkZXZpY2UgaXMgaW4gMi40R0h6IE1DQworICogQGhhbmRsZTogd21hIGhhbmRsZQorICoKKyAqIFJldHVybjogdHJ1ZS9mYWxzZQorICovCitzdGF0aWMgYm9vbCB3bWFfaXNfbWNjXzI0RyhXTUFfSEFORExFIGhhbmRsZSkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCWludDMyX3QgcHJldl9jaGFuID0gMDsKKwlpbnQzMl90IGk7CisKKwlpZiAoTlVMTCA9PSB3bWFfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogd21hX2hhbmRsZSBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWZvciAoaSA9IDA7IGkgPCB3bWFfaGFuZGxlLT5tYXhfYnNzaWQ7IGkrKykgeworCQlpZiAod21hX2hhbmRsZS0+aW50ZXJmYWNlc1tpXS5oYW5kbGUgJiYKKwkJCQl3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW2ldLnZkZXZfdXApIHsKKwkJCWlmICgocHJldl9jaGFuICE9IDAgJiYKKwkJCQlwcmV2X2NoYW4gIT0gd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tpXS5taHopICYmCisJCQkJKHdtYV9oYW5kbGUtPmludGVyZmFjZXNbaV0ubWh6IDw9CisJCQkJIENEU19DSEFOXzE0X0ZSRVEpKQorCQkJCXJldHVybiB0cnVlOworCQkJZWxzZQorCQkJCXByZXZfY2hhbiA9IHdtYV9oYW5kbGUtPmludGVyZmFjZXNbaV0ubWh6OworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB3bWFfZ2V0X2J1Zl9zdGFydF9zY2FuX2NtZCgpIC0gRmlsbCBzdGFydCBzY2FuIGNvbW1hbmQKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAc2Nhbl9yZXE6IHNjYW4gcmVxdWVzdAorICogQGJ1Zjogd21pIGJ1ZmZlciB0byBiZSBmaWxsZWQgaW4KKyAqIEBidWZfbGVuOiBidWYgbGVuZ3RoCisgKgorICogRmlsbCBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIHdtaV9zdGFydF9zY2FuX3JlcSBhbmQgVExWIGZvcgorICogY2hhbm5lbCBsaXN0LCBic3NpZCwgc3NpZCBldGMuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX2dldF9idWZfc3RhcnRfc2Nhbl9jbWQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICAgIHRTaXJTY2FuT2ZmbG9hZFJlcSAqc2Nhbl9yZXEsCisJCQkJICAgICAgd21pX2J1Zl90ICpidWYsIGludCAqYnVmX2xlbikKK3sKKwl3bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfY2hhbl9saXN0ICpjaGFuX2xpc3QgPSBOVUxMOworCXdtaV9tYWNfYWRkciAqYnNzaWQ7CisJd21pX3NzaWQgKnNzaWQgPSBOVUxMOworCXVpbnQzMl90ICp0bXBfcHRyLCBpZV9sZW5fd2l0aF9wYWQ7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50MzJfdCBkd2VsbF90aW1lOworCXVpbnQ4X3QgU1NJRF9udW07CisJaW50IGk7CisJaW50IGxlbiA9IHNpemVvZigqY21kKTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCisJaWYgKCFwTWFjKSB7CisJCVdNQV9MT0dQKCIlczogcE1hYyBpcyBOVUxMISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWxlbiArPSBXTUlfVExWX0hEUl9TSVpFOyAgICAgICAgLyogTGVuZ3RoIFRMViBwbGFjZWhvbGRlciBmb3IgYXJyYXkgb2YgdWludDMyX3QgKi8KKwkvKiBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBidWZmZXIgcmVxdWlyZWQgKi8KKwlpZiAoc2Nhbl9yZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzKQorCQlsZW4gKz0gc2Nhbl9yZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzICogc2l6ZW9mKHVpbnQzMl90KTsKKworCWxlbiArPSBXTUlfVExWX0hEUl9TSVpFOyAgICAgICAgLyogTGVuZ3RoIFRMViBwbGFjZWhvbGRlciBmb3IgYXJyYXkgb2Ygd21pX3NzaWQgc3RydWN0dXJlcyAqLworCWlmIChzY2FuX3JlcS0+bnVtU3NpZCkKKwkJbGVuICs9IHNjYW5fcmVxLT5udW1Tc2lkICogc2l6ZW9mKHdtaV9zc2lkKTsKKworCWxlbiArPSBXTUlfVExWX0hEUl9TSVpFOyAgICAgICAgLyogTGVuZ3RoIFRMViBwbGFjZWhvbGRlciBmb3IgYXJyYXkgb2Ygd21pX21hY19hZGRyIHN0cnVjdHVyZXMgKi8KKwlsZW4gKz0gc2l6ZW9mKHdtaV9tYWNfYWRkcik7CisKKwlsZW4gKz0gV01JX1RMVl9IRFJfU0laRTsgICAgICAgIC8qIExlbmd0aCBUTFYgcGxhY2Vob2xkZXIgZm9yIGFycmF5IG9mIGJ5dGVzICovCisJaWYgKHNjYW5fcmVxLT51SUVGaWVsZExlbikKKwkJbGVuICs9IHJvdW5kdXAoc2Nhbl9yZXEtPnVJRUZpZWxkTGVuLCBzaXplb2YodWludDMyX3QpKTsKKworCS8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgKi8KKwkqYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghKmJ1ZikgeworCQlXTUFfTE9HUCgiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0YXJ0IHNjYW4gY21kIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKCpidWYpOworCWNtZCA9ICh3bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3N0YXJ0X3NjYW5fY21kX2ZpeGVkX3BhcmFtKSk7CisKKwljbWQtPnZkZXZfaWQgPSBzY2FuX3JlcS0+c2Vzc2lvbklkOworCS8qCisJICogaG9zdCBjeWNsZXMgdGhyb3VnaCB0aGUgbG93ZXIgMTIgYml0cyBmb3Igc2NhbiBpZCBnZW5lcmF0aW9uCisJICogYW5kIHByZWZpeCAweEEwMDAgdG8gc2NhbiBpZAorCSAqLworCWlmIChzY2FuX3JlcS0+c2Nhbl9pZCA8IFdNQV9IT1NUX1NDQU5fUkVRSURfUFJFRklYKSB7CisJCVdNQV9MT0dFKCJSZWNlaXZlZCBzY2FuX2lkIDB4JXggaXMgd3JvbmciLAorCQkJIGNtZC0+c2Nhbl9pZCk7CisJCXNjYW5fcmVxLT5zY2FuX2lkID0gc2Nhbl9yZXEtPnNjYW5faWQgJiBXTUFfU0NBTl9JRF9NQVNLOworCQkvKiBBcHBlbmRpbmcgdGhlIDB4QTAwMCB0byBzY2FuIElkKi8KKwkJY21kLT5zY2FuX2lkID0gc2Nhbl9yZXEtPnNjYW5faWQgfCBXTUFfSE9TVF9TQ0FOX1JFUUlEX1BSRUZJWDsKKwl9IGVsc2UgeworCQljbWQtPnNjYW5faWQgPSBzY2FuX3JlcS0+c2Nhbl9pZDsKKwl9CisJY21kLT5zY2FuX3ByaW9yaXR5ID0gV01JX1NDQU5fUFJJT1JJVFlfTE9XOworCWNtZC0+c2Nhbl9yZXFfaWQgPSBXTUFfSE9TVF9TQ0FOX1JFUVVFU1RPUl9JRF9QUkVGSVggfAorCQkJICAgV01BX0RFRkFVTFRfU0NBTl9SRVFVRVNURVJfSUQ7CisKKwkvKiBTZXQgdGhlIHNjYW4gZXZlbnRzIHdoaWNoIHRoZSBkcml2ZXIgaXMgaW50ZXJlc2V0ZWQgdG8gcmVjZWl2ZSAqLworCS8qIFRPRE86IGhhbmRsZSBhbGwgdGhlIG90aGVyIGZsYWdzIGFsc28gKi8KKwljbWQtPm5vdGlmeV9zY2FuX2V2ZW50cyA9IFdNSV9TQ0FOX0VWRU5UX1NUQVJURUQgfAorCQkJCSAgV01JX1NDQU5fRVZFTlRfU1RBUlRfRkFJTEVEIHwKKwkJCQkgIFdNSV9TQ0FOX0VWRU5UX0ZPUkVJR05fQ0hBTk5FTCB8CisJCQkJICBXTUlfU0NBTl9FVkVOVF9DT01QTEVURUQgfAorCQkJCSAgV01JX1NDQU5fRVZFTlRfREVRVUVVRUQgfAorCQkJCSAgV01JX1NDQU5fRVZFTlRfUFJFRU1QVEVEIHwgV01JX1NDQU5fRVZFTlRfUkVTVEFSVEVEOworCisJY21kLT5kd2VsbF90aW1lX2FjdGl2ZSA9IHNjYW5fcmVxLT5tYXhDaGFubmVsVGltZTsKKworCWlmIChzY2FuX3JlcS0+c2NhblR5cGUgPT0gZVNJUl9BQ1RJVkVfU0NBTikgeworCQkvKiBJbiBBY3RpdmUgc2NhbiBjYXNlLCB0aGUgZmlybXdhcmUgaGFzIHRvIGRvIHBhc3NpdmUgc2NhbiBvbiBERlMgY2hhbm5lbHMKKwkJICogU28gdGhlIHBhc3NpdmUgc2NhbiBkdXJhdGlvbiBzaG91bGQgYmUgdXBkYXRlZCBwcm9wZXJseSBzbyB0aGF0IHRoZSBkdXJhdGlvbgorCQkgKiB3aWxsIGJlIHN1ZmZpY2llbnQgZW5vdWdoIHRvIHJlY2VpdmUgdGhlIGJlYWNvbiBmcm9tIEFQICovCisKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FLAorCQkJCSAgICAgJmR3ZWxsX3RpbWUpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJV01BX0xPR0UoIkZhaWxlZCB0byBnZXQgcGFzc2l2ZSBtYXggY2hhbm5lbCB2YWx1ZSIKKwkJCQkgInVzaW5nIGRlZmF1bHQgdmFsdWUiKTsKKwkJCWR3ZWxsX3RpbWUgPSBXTUFfRFdFTExfVElNRV9QQVNTSVZFX0RFRkFVTFQ7CisJCX0KKwkJY21kLT5kd2VsbF90aW1lX3Bhc3NpdmUgPSBkd2VsbF90aW1lOworCX0gZWxzZQorCQljbWQtPmR3ZWxsX3RpbWVfcGFzc2l2ZSA9IHNjYW5fcmVxLT5tYXhDaGFubmVsVGltZTsKKworCVdNQV9MT0dJKCJTY2FuIFR5cGUgJXgsIEFjdGl2ZSBkd2VsbCB0aW1lICV1LCBQYXNzaXZlIGR3ZWxsIHRpbWUgJXUiLAorCQkgc2Nhbl9yZXEtPnNjYW5UeXBlLCBjbWQtPmR3ZWxsX3RpbWVfYWN0aXZlLAorCQkgY21kLT5kd2VsbF90aW1lX3Bhc3NpdmUpOworCisJLyogRW5zdXJlIGNvcnJlY3QgbnVtYmVyIG9mIHByb2JlcyBhcmUgc2VudCBvbiBhY3RpdmUgY2hhbm5lbCAqLworCWNtZC0+cmVwZWF0X3Byb2JlX3RpbWUgPQorCQljbWQtPmR3ZWxsX3RpbWVfYWN0aXZlIC8gV01BX1NDQU5fTlBST0JFU19ERUZBVUxUOworCisJLyogQ1NSIHNlbmRzIG9ubHkgb25lIHZhbHVlIHJlc3RUaW1lIGZvciBzdGF5aW5nIG9uIGhvbWUgY2hhbm5lbAorCSAqIHRvIGNvbnRpbnVlIGRhdGEgdHJhZmZpYy4gUm9tZSBmdyBoYXMgZmFjaWxpdHkgdG8gbW9uaXRvciB0aGUgdHJhZmZpYworCSAqIGFuZCBtb3ZlIHRvIG5leHQgY2hhbm5lbC4gU3RheSBvbiB0aGUgY2hhbm5lbCBmb3IgYXQgbGVhc3QgaGFsZgorCSAqIG9mIHRoZSByZXF1ZXN0ZWQgdGltZSBhbmQgdGhlbiBsZWF2ZSBpZiB0aGVyZSBpcyBubyB0cmFmZmljLgorCSAqLworCWNtZC0+bWluX3Jlc3RfdGltZSA9IHNjYW5fcmVxLT5yZXN0VGltZSAvIDI7CisJY21kLT5tYXhfcmVzdF90aW1lID0gc2Nhbl9yZXEtPnJlc3RUaW1lOworCisJLyogQ2hlY2sgZm9yIHRyYWZmaWMgYXQgaWRsZV90aW1lIGludGVydmFsIGFmdGVyIG1pbl9yZXN0X3RpbWUuCisJICogRGVmYXVsdCB2YWx1ZSBpcyAyNSBtcyB0byBhbGxvdyBmdWxsIHVzZSBvZiBtYXhfcmVzdF90aW1lCisJICogd2hlbiB2b2ljZSBwYWNrZXRzIGFyZSBydW5uaW5nIGF0IDIwIG1zIGludGVydmFsLgorCSAqLworCWNtZC0+aWRsZV90aW1lID0gV01BX1NDQU5fSURMRV9USU1FX0RFRkFVTFQ7CisKKwkvKiBMYXJnZSB0aW1lb3V0IHZhbHVlIGZvciBmdWxsIHNjYW4gY3ljbGUsIDMwIHNlY29uZHMgKi8KKwljbWQtPm1heF9zY2FuX3RpbWUgPSBXTUFfSFdfREVGX1NDQU5fTUFYX0RVUkFUSU9OOworCisJLyogZG8gbm90IGFkZCBPRkRNIHJhdGVzIGluIDExQiBtb2RlICovCisJaWYgKHNjYW5fcmVxLT5kb3QxMW1vZGUgIT0gV05JX0NGR19ET1QxMV9NT0RFXzExQikKKwkJY21kLT5zY2FuX2N0cmxfZmxhZ3MgfD0gV01JX1NDQU5fQUREX09GRE1fUkFURVM7CisJZWxzZQorCQlXTUFfTE9HRCgiT0ZETV9SQVRFUyBub3QgaW5jbHVkZWQgaW4gMTFCIG1vZGUiKTsKKworCS8qIERvIG5vdCBjb21iaW5lIG11bHRpcGxlIGNoYW5uZWxzIGluIGEgc2luZ2xlIGJ1cnN0LiBDb21lIGJhY2sKKwkgKiB0byBob21lIGNoYW5uZWwgZm9yIGRhdGEgdHJhZmZpYyBhZnRlciBldmVyeSBmb3JlaWduIGNoYW5uZWwuCisJICogQnkgZGVmYXVsdCwgcHJlZmVyIHRocm91Z2hwdXQgcGVyZm9ybWFuY2Ugb3ZlciBzY2FuIGN5Y2xlIHRpbWUuCisJICovCisJY21kLT5idXJzdF9kdXJhdGlvbiA9IDA7CisKKwlpZiAoIXNjYW5fcmVxLT5wMnBTY2FuVHlwZSkgeworCQlXTUFfTE9HRCgiTm9ybWFsIFNjYW4gcmVxdWVzdCIpOworCQljbWQtPnNjYW5fY3RybF9mbGFncyB8PSBXTUlfU0NBTl9BRERfQ0NLX1JBVEVTOworCQlpZiAoIXNjYW5fcmVxLT5udW1Tc2lkKQorCQkJY21kLT5zY2FuX2N0cmxfZmxhZ3MgfD0gV01JX1NDQU5fQUREX0JDQVNUX1BST0JFX1JFUTsKKwkJaWYgKHNjYW5fcmVxLT5zY2FuVHlwZSA9PSBlU0lSX1BBU1NJVkVfU0NBTikKKwkJCWNtZC0+c2Nhbl9jdHJsX2ZsYWdzIHw9IFdNSV9TQ0FOX0ZMQUdfUEFTU0lWRTsKKwkJY21kLT5zY2FuX2N0cmxfZmxhZ3MgfD0gV01JX1NDQU5fRklMVEVSX1BST0JFX1JFUTsKKworCQkvKgorCQkgKiBEZWNpZGUgYnVyc3RfZHVyYXRpb24gYW5kIGR3ZWxsX3RpbWVfYWN0aXZlIGJhc2VkIG9uCisJCSAqIHdoYXQgdHlwZSBvZiBkZXZpY2VzIGFyZSBhY3RpdmUuCisJCSAqLworCQlkbyB7CisJCQlpZiAod21hX2lzX3NhcF9hY3RpdmUod21hX2hhbmRsZSkgJiYKKwkJCQkJd21hX2lzX3AycF9nb19hY3RpdmUod21hX2hhbmRsZSkgJiYKKwkJCQkJd21hX2lzX3N0YV9hY3RpdmUod21hX2hhbmRsZSkpIHsKKwkJCQlpZiAoc2Nhbl9yZXEtPm1heENoYW5uZWxUaW1lIDw9CisJCQkJCVdNQV8zUE9SVF9DT05DX1NDQU5fTUFYX0JVUlNUX0RVUkFUSU9OKQorCQkJCQljbWQtPmJ1cnN0X2R1cmF0aW9uID0KKwkJCQkJCXNjYW5fcmVxLT5tYXhDaGFubmVsVGltZTsKKwkJCQllbHNlCisJCQkJCWNtZC0+YnVyc3RfZHVyYXRpb24gPQorCQkJCQlXTUFfM1BPUlRfQ09OQ19TQ0FOX01BWF9CVVJTVF9EVVJBVElPTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICh3bWFfaXNfc2FwX2FjdGl2ZSh3bWFfaGFuZGxlKSkgeworCQkJCS8qIEJhY2tncm91bmQgc2NhbiB3aGlsZSBTb2Z0QVAgaXMgc2VuZGluZyBiZWFjb25zLgorCQkJCSAqIE1heCBkdXJhdGlvbiBvZiBDVFMyc2VsZiBpcyAzMiBtcywgd2hpY2ggbGltaXRzCisJCQkJICogdGhlIGR3ZWxsIHRpbWUuCisJCQkJICovCisJCQkJY21kLT5kd2VsbF90aW1lX2FjdGl2ZSA9CisJCQkJICAgQ0RGX01JTihzY2FuX3JlcS0+bWF4Q2hhbm5lbFRpbWUsCisJCQkJCSAgIChXTUFfQ1RTX0RVUkFUSU9OX01TX01BWCAtCisJCQkJCSAgICBXTUFfUk9BTV9TQ0FOX0NIQU5ORUxfU1dJVENIX1RJTUUpKTsKKwkJCQljbWQtPmR3ZWxsX3RpbWVfcGFzc2l2ZSA9CisJCQkJCWNtZC0+ZHdlbGxfdGltZV9hY3RpdmU7CisJCQkJY21kLT5idXJzdF9kdXJhdGlvbiA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAod21hX2hhbmRsZS0+bWlyYWNhc3RfdmFsdWUgJiYKKwkJCQkJd21hX2lzX21jY18yNEcod21hX2hhbmRsZSkpIHsKKwkJCQljbWQtPm1heF9yZXN0X3RpbWUgPQorCQkJCQlwTWFjLT5mX3N0YV9taXJhY2FzdF9tY2NfcmVzdF90aW1lX3ZhbDsKKwkJCX0KKwkJCWlmICh3bWFfaXNfcDJwX2dvX2FjdGl2ZSh3bWFfaGFuZGxlKSkgeworCQkJCS8qIEJhY2tncm91bmQgc2NhbiB3aGlsZSBHTyBpcyBzZW5kaW5nIGJlYWNvbnMuCisJCQkJICogRXZlcnkgb2ZmLWNoYW5uZWwgdHJhbnNpdGlvbiBoYXMgb3ZlcmhlYWQgb2YgMiBiZWFjb24KKwkJCQkgKiBpbnRlcnZhbHMgZm9yIE5PQS4gTWF4aW1pemUgbnVtYmVyIG9mIGNoYW5uZWxzIGluCisJCQkJICogZXZlcnkgdHJhbnNpdGlvbiBieSB1c2luZyBidXJzdCBzY2FuLgorCQkJCSAqLworCQkJCWlmICh3bWFfaGFuZGxlLT5taXJhY2FzdF92YWx1ZSkgeworCQkJCQkvKiBXaGVuIG1pcmFjYXN0IGlzIHJ1bm5pbmcsIGJ1cnN0IGR1cmF0aW9uCisJCQkJCSAqIG5lZWRzIHRvIGJlIG1pbmltdW0gdG8gYXZvaWQgYW55IHN0dXR0ZXIKKwkJCQkJICogb3IgZ2xpdGNoIGluIG1pcmFjYXN0IGR1cmluZyBzdGF0aW9uIHNjYW4KKwkJCQkJICovCisJCQkJCWlmIChzY2FuX3JlcS0+bWF4Q2hhbm5lbFRpbWUgPD0KKwkJCQkJICAgIFdNQV9HT19NSU5fQUNUSVZFX1NDQU5fQlVSU1RfRFVSQVRJT04pCisJCQkJCQljbWQtPmJ1cnN0X2R1cmF0aW9uID0KKwkJCQkJCQlzY2FuX3JlcS0+bWF4Q2hhbm5lbFRpbWU7CisJCQkJCWVsc2UKKwkJCQkJCWNtZC0+YnVyc3RfZHVyYXRpb24gPQorCQkJCQkJCVdNQV9HT19NSU5fQUNUSVZFX1NDQU5fQlVSU1RfRFVSQVRJT047CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogSWYgbWlyYWNhc3QgaXMgbm90IHJ1bm5pbmcsIGFjY29tb2RhdGUgbWF4CisJCQkJCSAqIHN0YXRpb25zIHRvIG1ha2UgdGhlIHNjYW5zIGZhc3RlcgorCQkJCQkgKi8KKwkJCQkJY21kLT5idXJzdF9kdXJhdGlvbiA9CisJCQkJCQlXTUFfQlVSU1RfU0NBTl9NQVhfTlVNX09GRkNIQU5ORUxTICoKKwkJCQkJCXNjYW5fcmVxLT5tYXhDaGFubmVsVGltZTsKKwkJCQkJaWYgKGNtZC0+YnVyc3RfZHVyYXRpb24gPgorCQkJCQkgICAgV01BX0dPX01BWF9BQ1RJVkVfU0NBTl9CVVJTVF9EVVJBVElPTikgeworCQkJCQkJdWludDhfdCBjaGFubmVscyA9CisJCQkJCQkJV01BX1AyUF9TQ0FOX01BWF9CVVJTVF9EVVJBVElPTgorCQkJCQkJCS8gc2Nhbl9yZXEtPm1heENoYW5uZWxUaW1lOworCQkJCQkJaWYgKGNoYW5uZWxzKQorCQkJCQkJCWNtZC0+YnVyc3RfZHVyYXRpb24gPQorCQkJCQkJCQljaGFubmVscyAqCisJCQkJCQkJCXNjYW5fcmVxLT5tYXhDaGFubmVsVGltZTsKKwkJCQkJCWVsc2UKKwkJCQkJCQljbWQtPmJ1cnN0X2R1cmF0aW9uID0KKwkJCQkJCQkJV01BX0dPX01BWF9BQ1RJVkVfU0NBTl9CVVJTVF9EVVJBVElPTjsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICh3bWFfaXNfc3RhX2FjdGl2ZSh3bWFfaGFuZGxlKSB8fAorCQkJICAgIHdtYV9pc19wMnBfY2xpX2FjdGl2ZSh3bWFfaGFuZGxlKSkgeworCQkJCS8qIFR5cGljYWwgYmFja2dyb3VuZCBzY2FuLiBEaXNhYmxlIGJ1cnN0IHNjYW4gZm9yIG5vdy4gKi8KKwkJCQljbWQtPmJ1cnN0X2R1cmF0aW9uID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSB3aGlsZSAoMCk7CisKKwl9IGVsc2UgeworCQlXTUFfTE9HRCgiUDJQIFNjYW4iKTsKKwkJc3dpdGNoIChzY2FuX3JlcS0+cDJwU2NhblR5cGUpIHsKKwkJY2FzZSBQMlBfU0NBTl9UWVBFX0xJU1RFTjoKKwkJCVdNQV9MT0dEKCJQMlBfU0NBTl9UWVBFX0xJU1RFTiIpOworCQkJY21kLT5zY2FuX2N0cmxfZmxhZ3MgfD0gV01JX1NDQU5fRkxBR19QQVNTSVZFOworCQkJY21kLT5ub3RpZnlfc2Nhbl9ldmVudHMgfD0KKwkJCQlXTUlfU0NBTl9FVkVOVF9GT1JFSUdOX0NIQU5ORUw7CisJCQljbWQtPnJlcGVhdF9wcm9iZV90aW1lID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFAyUF9TQ0FOX1RZUEVfU0VBUkNIOgorCQkJV01BX0xPR0QoIlAyUF9TQ0FOX1RZUEVfU0VBUkNIIik7CisJCQljbWQtPnNjYW5fY3RybF9mbGFncyB8PSBXTUlfU0NBTl9GSUxURVJfUFJPQkVfUkVROworCQkJLyogRGVmYXVsdCBQMlAgYnVyc3QgZHVyYXRpb24gb2YgMTIwIG1zIHdpbGwgY292ZXIKKwkJCSAqIDMgY2hhbm5lbHMgd2l0aCBkZWZhdWx0IG1heCBkd2VsbCB0aW1lIDQwIG1zLgorCQkJICogQ2FwIGxpbWl0IHdpbGwgYmUgc2V0IGJ5CisJCQkgKiBXTUFfUDJQX1NDQU5fTUFYX0JVUlNUX0RVUkFUSU9OLiBCdXJzdCBkdXJhdGlvbgorCQkJICogc2hvdWxkIGJlIHN1Y2ggdGhhdCBubyBjaGFubmVsIGlzIHNjYW5uZWQgbGVzcworCQkJICogdGhhbiB0aGUgZHdlbGwgdGltZSBpbiBub3JtYWwgc2NlbmFyaW9zLgorCQkJICovCisJCQlpZiAoc2Nhbl9yZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzID09CisJCQkgICAgUDJQX1NPQ0lBTF9DSEFOTkVMUworCQkJICAgICYmICghKHdtYV9oYW5kbGUtPm1pcmFjYXN0X3ZhbHVlKSkpCisJCQkJY21kLT5yZXBlYXRfcHJvYmVfdGltZSA9CisJCQkJCXNjYW5fcmVxLT5tYXhDaGFubmVsVGltZSAvIDU7CisJCQllbHNlCisJCQkJY21kLT5yZXBlYXRfcHJvYmVfdGltZSA9CisJCQkJCXNjYW5fcmVxLT5tYXhDaGFubmVsVGltZSAvIDM7CisKKwkJCWNtZC0+YnVyc3RfZHVyYXRpb24gPQorCQkJCVdNQV9CVVJTVF9TQ0FOX01BWF9OVU1fT0ZGQ0hBTk5FTFMgKgorCQkJCXNjYW5fcmVxLT5tYXhDaGFubmVsVGltZTsKKwkJCWlmIChjbWQtPmJ1cnN0X2R1cmF0aW9uID4KKwkJCSAgICBXTUFfUDJQX1NDQU5fTUFYX0JVUlNUX0RVUkFUSU9OKSB7CisJCQkJdWludDhfdCBjaGFubmVscyA9CisJCQkJCVdNQV9QMlBfU0NBTl9NQVhfQlVSU1RfRFVSQVRJT04gLworCQkJCQlzY2FuX3JlcS0+bWF4Q2hhbm5lbFRpbWU7CisJCQkJaWYgKGNoYW5uZWxzKQorCQkJCQljbWQtPmJ1cnN0X2R1cmF0aW9uID0KKwkJCQkJCWNoYW5uZWxzICogc2Nhbl9yZXEtPm1heENoYW5uZWxUaW1lOworCQkJCWVsc2UKKwkJCQkJY21kLT5idXJzdF9kdXJhdGlvbiA9CisJCQkJCQlXTUFfUDJQX1NDQU5fTUFYX0JVUlNUX0RVUkFUSU9OOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlXTUFfTE9HRSgiSW52YWxpZCBzY2FuIHR5cGUiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwljbWQtPm5fcHJvYmVzID0gKGNtZC0+cmVwZWF0X3Byb2JlX3RpbWUgPiAwKSA/CisJCQljbWQtPmR3ZWxsX3RpbWVfYWN0aXZlIC8gY21kLT5yZXBlYXRfcHJvYmVfdGltZSA6IDA7CisKKwlidWZfcHRyICs9IHNpemVvZigqY21kKTsKKwl0bXBfcHRyID0gKHVpbnQzMl90ICopIChidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisKKwlpZiAoc2Nhbl9yZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzKSB7CisJCWNoYW5fbGlzdCA9ICh3bWlfY2hhbl9saXN0ICopIHRtcF9wdHI7CisJCWNtZC0+bnVtX2NoYW4gPSBzY2FuX3JlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHM7CisJCWZvciAoaSA9IDA7IGkgPCBzY2FuX3JlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHM7ICsraSkgeworCQkJdG1wX3B0cltpXSA9CisJCQkJY2RzX2NoYW5fdG9fZnJlcShzY2FuX3JlcS0+Y2hhbm5lbExpc3QuCisJCQkJCQkgY2hhbm5lbE51bWJlcltpXSk7CisJCX0KKwl9CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwKKwkJICAgICAgIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLAorCQkgICAgICAgKGNtZC0+bnVtX2NoYW4gKiBzaXplb2YodWludDMyX3QpKSk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFICsgKGNtZC0+bnVtX2NoYW4gKiBzaXplb2YodWludDMyX3QpKTsKKwlpZiAoc2Nhbl9yZXEtPm51bVNzaWQgPiBTSVJfU0NBTl9NQVhfTlVNX1NTSUQpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgdmFsdWUgZm9yIG51bVNzaWQiKTsKKwkJZ290byBlcnJvcjsKKwl9CisJY21kLT5udW1fc3NpZHMgPSBzY2FuX3JlcS0+bnVtU3NpZDsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX0ZJWEVEX1NUUlVDLAorCQkgICAgICAgKGNtZC0+bnVtX3NzaWRzICogc2l6ZW9mKHdtaV9zc2lkKSkpOworCWlmIChzY2FuX3JlcS0+bnVtU3NpZCkgeworCQlzc2lkID0gKHdtaV9zc2lkICopIChidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisJCWZvciAoaSA9IDA7IGkgPCBzY2FuX3JlcS0+bnVtU3NpZDsgKytpKSB7CisJCQlzc2lkLT5zc2lkX2xlbiA9IHNjYW5fcmVxLT5zc0lkW2ldLmxlbmd0aDsKKwkJCWNkZl9tZW1fY29weShzc2lkLT5zc2lkLCBzY2FuX3JlcS0+c3NJZFtpXS5zc0lkLAorCQkJCSAgICAgc2Nhbl9yZXEtPnNzSWRbaV0ubGVuZ3RoKTsKKwkJCXNzaWQrKzsKKwkJfQorCX0KKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkUgKyAoY21kLT5udW1fc3NpZHMgKiBzaXplb2Yod21pX3NzaWQpKTsKKworCWNtZC0+bnVtX2Jzc2lkID0gMTsKKworCWlmICghc2Nhbl9yZXEtPnAycFNjYW5UeXBlKSB7CisJCWlmICh3bWFfaXNfc2FwX2FjdGl2ZSh3bWFfaGFuZGxlKSkgeworCQkJU1NJRF9udW0gPSBjbWQtPm51bV9zc2lkcyAqIGNtZC0+bnVtX2Jzc2lkOworCQkJY21kLT5yZXBlYXRfcHJvYmVfdGltZSA9IHByb2JlX3RpbWVfZHdlbGxfdGltZV9tYXBbCisJCQkJQ0RGX01JTihTU0lEX251bSwKKwkJCQkJV01BX0RXRUxMX1RJTUVfUFJPQkVfVElNRV9NQVBfU0laRQorCQkJCQktIDEpXS5wcm9iZV90aW1lOworCQl9CisJfQorCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9GSVhFRF9TVFJVQywKKwkJICAgICAgIChjbWQtPm51bV9ic3NpZCAqIHNpemVvZih3bWlfbWFjX2FkZHIpKSk7CisJYnNzaWQgPSAod21pX21hY19hZGRyICopIChidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisJV01JX0NIQVJfQVJSQVlfVE9fTUFDX0FERFIoc2Nhbl9yZXEtPmJzc0lkLCBic3NpZCk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFICsgKGNtZC0+bnVtX2Jzc2lkICogc2l6ZW9mKHdtaV9tYWNfYWRkcikpOworCisJY21kLT5pZV9sZW4gPSBzY2FuX3JlcS0+dUlFRmllbGRMZW47CisJaWVfbGVuX3dpdGhfcGFkID0gcm91bmR1cChzY2FuX3JlcS0+dUlFRmllbGRMZW4sIHNpemVvZih1aW50MzJfdCkpOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgaWVfbGVuX3dpdGhfcGFkKTsKKwlpZiAoc2Nhbl9yZXEtPnVJRUZpZWxkTGVuKSB7CisJCWNkZl9tZW1fY29weShidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSwKKwkJCSAgICAgKHVpbnQ4X3QgKikgc2Nhbl9yZXEgKworCQkJICAgICAoc2Nhbl9yZXEtPnVJRUZpZWxkT2Zmc2V0KSwgc2Nhbl9yZXEtPnVJRUZpZWxkTGVuKTsKKwl9CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFICsgaWVfbGVuX3dpdGhfcGFkOworCisJKmJ1Zl9sZW4gPSBsZW47CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK2Vycm9yOgorCWNkZl9tZW1fZnJlZSgqYnVmKTsKKwkqYnVmID0gTlVMTDsKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiB3bWFfZ2V0X2J1Zl9zdG9wX3NjYW5fY21kKCkgLSBGaWxsIHN0b3Agc2NhbiBjb21tYW5kCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQGJ1Zjogd21pIGJ1ZmZlciB0byBiZSBmaWxsZWQgaW4KKyAqIEBidWZfbGVuOiBidWYgbGVuZ3RoCisgKiBAYWJvcnRfc2Nhbl9yZXE6IGFib3J0IHNjYW4gcmVxdWVzdAorICoKKyAqIEZpbGwgd21pX3N0b3Bfc2Nhbl9jbWQgYnVmZmVyLgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9nZXRfYnVmX3N0b3Bfc2Nhbl9jbWQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICAgd21pX2J1Zl90ICpidWYsCisJCQkJICAgICBpbnQgKmJ1Zl9sZW4sCisJCQkJICAgICB0QWJvcnRTY2FuUGFyYW1zICphYm9ydF9zY2FuX3JlcSkKK3sKKwl3bWlfc3RvcF9zY2FuX2NtZF9maXhlZF9wYXJhbSAqY21kOworCUNERl9TVEFUVVMgY2RmX3N0YXR1czsKKwlpbnQgbGVuID0gc2l6ZW9mKCpjbWQpOworCisJLyogQWxsb2NhdGUgdGhlIG1lbW9yeSAqLworCSpidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCEqYnVmKSB7CisJCVdNQV9MT0dQKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RvcCBzY2FuIGNtZCIsCisJCQkgX19mdW5jX18pOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZXJyb3I7CisJfQorCisJY21kID0gKHdtaV9zdG9wX3NjYW5fY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YSgqYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfc3RvcF9zY2FuX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfc3RvcF9zY2FuX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IGFib3J0X3NjYW5fcmVxLT5TZXNzaW9uSWQ7CisJY21kLT5yZXF1ZXN0b3IgPSBXTUFfSE9TVF9TQ0FOX1JFUVVFU1RPUl9JRF9QUkVGSVggfAorCQkJV01BX0RFRkFVTFRfU0NBTl9SRVFVRVNURVJfSUQ7CisJY21kLT5zY2FuX2lkID0gYWJvcnRfc2Nhbl9yZXEtPnNjYW5faWQ7CisJLyogc3RvcCB0aGUgc2NhbiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHNjYW5faWQgKi8KKwljbWQtPnJlcV90eXBlID0gV01JX1NDQU5fU1RPUF9PTkU7CisKKwkqYnVmX2xlbiA9IGxlbjsKKwljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworZXJyb3I6CisJcmV0dXJuIGNkZl9zdGF0dXM7CisKK30KKworCisvKioKKyAqIHdtYV9zdGFydF9zY2FuKCkgLSBzdGFydCBzY2FuIGNvbW1hbmQKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAc2Nhbl9yZXE6IHNjYW4gcmVxdWVzdCBwYXJhbXMKKyAqIEBtc2dfdHlwZTogbWVzc2FnZSB0aW1lCisgKgorICogU2VuZCBzdGFydCBzY2FuIGNvbW1hbmQgdG8gZncuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3N0YXJ0X3NjYW4odHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJICB0U2lyU2Nhbk9mZmxvYWRSZXEgKnNjYW5fcmVxLCB1aW50MTZfdCBtc2dfdHlwZSkKK3sKKwl1aW50MzJfdCB2ZGV2X2lkLCBzY2FuX2lkOworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl3bWlfYnVmX3QgYnVmID0gTlVMTDsKKwl3bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgbGVuOworCXRTaXJTY2FuT2ZmbG9hZEV2ZW50ICpzY2FuX2V2ZW50OworCisJaWYgKHNjYW5fcmVxLT5zZXNzaW9uSWQgPiB3bWFfaGFuZGxlLT5tYXhfYnNzaWQpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIHZkZXZfaWQgJWQsIG1zZ190eXBlIDogMHgleCIsIF9fZnVuY19fLAorCQkJIHNjYW5fcmVxLT5zZXNzaW9uSWQsIG1zZ190eXBlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBTYW5pdHkgY2hlY2sgdG8gZmluZCB3aGV0aGVyIHZkZXYgaWQgYWN0aXZlIG9yIG5vdCAqLworCWlmIChtc2dfdHlwZSAhPSBXTUFfU1RBUlRfU0NBTl9PRkZMT0FEX1JFUSAmJgorCQkhd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tzY2FuX3JlcS0+c2Vzc2lvbklkXS5oYW5kbGUpIHsKKwkJV01BX0xPR0EoInZkZXYgaWQgWyVkXSBpcyBub3QgYWN0aXZlIiwgc2Nhbl9yZXEtPnNlc3Npb25JZCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogRmlsbCBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIHdtaV9zdGFydF9zY2FuX3JlcSBhbmQKKwkgKiBUTFYgZm9yIGNoYW5uZWwgbGlzdCwgYnNzaWQsIHNzaWQgZXRjIC4uLiAqLworCWNkZl9zdGF0dXMgPSB3bWFfZ2V0X2J1Zl9zdGFydF9zY2FuX2NtZCh3bWFfaGFuZGxlLCBzY2FuX3JlcSwKKwkJCQkJCSZidWYsICZsZW4pOworCWlmIChjZGZfc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIGdldCBidWZmZXIgZm9yIHN0YXJ0IHNjYW4gY21kIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKE5VTEwgPT0gYnVmKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gZ2V0IGJ1ZmZlciBmb3Igc2F2aW5nIGN1cnJlbnQgc2NhbiBpbmZvIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogU2F2ZSBjdXJyZW50IHNjYW4gaW5mbyAqLworCWNtZCA9ICh3bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJaWYgKG1zZ190eXBlID09IFdNQV9DSE5MX1NXSVRDSF9SRVEpIHsKKwkJLyogQWRqdXN0IHBhcmFtZXRlcnMgZm9yIGNoYW5uZWwgc3dpdGNoIHNjYW4gKi8KKwkJY21kLT5taW5fcmVzdF90aW1lID0gV01BX1JPQU1fUFJFQVVUSF9SRVNUX1RJTUU7CisJCWNtZC0+bWF4X3Jlc3RfdGltZSA9IFdNQV9ST0FNX1BSRUFVVEhfUkVTVF9USU1FOworCQljbWQtPm1heF9zY2FuX3RpbWUgPSBXTUFfUk9BTV9QUkVBVVRIX01BWF9TQ0FOX1RJTUU7CisJCWNtZC0+c2Nhbl9wcmlvcml0eSA9IFdNSV9TQ0FOX1BSSU9SSVRZX0hJR0g7CisJCWNtZC0+c2Nhbl9pZCA9IHNjYW5fcmVxLT5zY2FuX2lkOworCQl3bWFfaGFuZGxlLT5yb2FtX3ByZWF1dGhfc2Nhbl9pZCA9IGNtZC0+c2Nhbl9pZDsKKwl9CisJaWYgKHNjYW5fcmVxLT5wMnBTY2FuVHlwZSA9PSBQMlBfU0NBTl9UWVBFX0xJU1RFTikKKwkJd21hX3NldF9wMnBfc2Nhbl9pbmZvKHdtYV9oYW5kbGUsIGNtZC0+c2Nhbl9pZCwKKwkJCSBjbWQtPnZkZXZfaWQsIFAyUF9TQ0FOX1RZUEVfTElTVEVOKTsKKwlXTUFfTE9HRSgic2Nhbl9pZCAweCV4LCB2ZGV2X2lkICVkLCBwMnBTY2FuVHlwZSAlZCwgbXNnX3R5cGUgMHgleCIsCisJCSBjbWQtPnNjYW5faWQsIGNtZC0+dmRldl9pZCwgc2Nhbl9yZXEtPnAycFNjYW5UeXBlLCBtc2dfdHlwZSk7CisJLyoKKwkgKiBDYWNoZSB2ZGV2X2lkIGFuZCBzY2FuX2lkIGJlY2F1c2UgY21kIGlzIGZyZWVkIGFmdGVyIGNhbGxpbmcKKwkgKiB3bWlfdW5pZmllZF9jbWRfc2VuZCBjbWQuIFdNSSBpbnRlcm5hbGx5IGZyZWVzIGNtZCBidWZmZXIgYWZ0ZXIKKwkgKiBnZXR0aW5nIFRYIGNvbXBsZXRlIGZyb20gQ0UKKwkgKi8KKwl2ZGV2X2lkID0gY21kLT52ZGV2X2lkOworCXNjYW5faWQgPSBjbWQtPnNjYW5faWQ7CisJV01BX0xPR0koIkFjdGl2ZUR3ZWxsICVkLCBQYXNzaXZlRHdlbGwgJWQsIFNjYW5GbGFncyAweCV4IE51bUNoYW4gJWQiLAorCQkgY21kLT5kd2VsbF90aW1lX2FjdGl2ZSwgY21kLT5kd2VsbF90aW1lX3Bhc3NpdmUsCisJCSBjbWQtPnNjYW5fY3RybF9mbGFncywgY21kLT5udW1fY2hhbik7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCQkJICAgICAgbGVuLCBXTUlfU1RBUlRfU0NBTl9DTURJRCk7CisJLyogQ2FsbCB0aGUgd21pIGFwaSB0byByZXF1ZXN0IHRoZSBzY2FuICovCisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIndtaV91bmlmaWVkX2NtZF9zZW5kIHJldHVybmVkIEVycm9yICVkIiwgc3RhdHVzKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIGVycm9yOworCX0KKworCVdNQV9MT0dJKCJXTUEgLS0+IFdNSV9TVEFSVF9TQ0FOX0NNRElEIik7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworZXJyb3I6CisJLyogU2VuZCBjb21wbGV0aW9uIGV2ZW50IGZvciBvbmx5IGZvciBzdGFydCBzY2FuIHJlcXVlc3QgKi8KKwlpZiAobXNnX3R5cGUgPT0gV01BX1NUQVJUX1NDQU5fT0ZGTE9BRF9SRVEpIHsKKwkJc2Nhbl9ldmVudCA9CisJCQkodFNpclNjYW5PZmZsb2FkRXZlbnQgKikKKwkJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU2Nhbk9mZmxvYWRFdmVudCkpOworCQlpZiAoIXNjYW5fZXZlbnQpIHsKKwkJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc2NhbiByc3AiLAorCQkJCSBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCQl9CisJCW1lbXNldChzY2FuX2V2ZW50LCAweDAwLCBzaXplb2YoKnNjYW5fZXZlbnQpKTsKKwkJc2Nhbl9ldmVudC0+ZXZlbnQgPSBXTUlfU0NBTl9FVkVOVF9DT01QTEVURUQ7CisJCXNjYW5fZXZlbnQtPnJlYXNvbkNvZGUgPSBlU0lSX1NNRV9TQ0FOX0ZBSUxFRDsKKwkJc2Nhbl9ldmVudC0+c2Vzc2lvbklkID0gc2Nhbl9yZXEtPnNlc3Npb25JZDsKKwkJc2Nhbl9ldmVudC0+cDJwU2NhblR5cGUgPSBzY2FuX3JlcS0+cDJwU2NhblR5cGU7CisJCXNjYW5fZXZlbnQtPnNjYW5JZCA9IHNjYW5fcmVxLT5zY2FuX2lkOworCQl3bWFfc2VuZF9tc2cod21hX2hhbmRsZSwgV01BX1JYX1NDQU5fRVZFTlQsICh2b2lkICopc2Nhbl9ldmVudCwKKwkJCSAgICAgMCk7CisJfQorCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9zdG9wX3NjYW4oKSAtIHN0b3Agc2NhbiBjb21tYW5kCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQGFib3J0X3NjYW5fcmVxOiBhYm9ydCBzY2FuIHBhcmFtcworICoKKyAqIFNlbmQgc3RvcCBzY2FuIGNvbW1hbmQgdG8gZncuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3N0b3Bfc2Nhbih0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkgdEFib3J0U2NhblBhcmFtcyAqYWJvcnRfc2Nhbl9yZXEpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXdtaV9idWZfdCBidWY7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGxlbjsKKworCWNkZl9zdGF0dXMgPSB3bWFfZ2V0X2J1Zl9zdG9wX3NjYW5fY21kKHdtYV9oYW5kbGUsICZidWYsICZsZW4sCisJCQkJCSAgICAgICBhYm9ydF9zY2FuX3JlcSk7CisJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gZ2V0IGJ1ZmZlciBmb3Igc3RvcCBzY2FuIGNtZCIpOworCQlnb3RvIGVycm9yMTsKKwl9CisKKwlpZiAoTlVMTCA9PSBidWYpIHsKKwkJV01BX0xPR0UoIkZhaWxlZCB0byBnZXQgYnVmZmVyIGZvciBzdG9wIHNjYW4gY21kIik7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFVTFQ7CisJCWdvdG8gZXJyb3IxOworCX0KKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgICAgICBsZW4sIFdNSV9TVE9QX1NDQU5fQ01ESUQpOworCS8qIENhbGwgdGhlIHdtaSBhcGkgdG8gcmVxdWVzdCB0aGUgc2NhbiAqLworCWlmIChzdGF0dXMgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCJ3bWlfdW5pZmllZF9jbWRfc2VuZCBXTUlfU1RPUF9TQ0FOX0NNRElEIHJldHVybmVkIEVycm9yICVkIiwKKwkJCXN0YXR1cyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlcnJvcjsKKwl9CisJV01BX0xPR0UoInNjYW5faWQgJXgsIHZkZXZfaWQgJXgiLAorCQkgYWJvcnRfc2Nhbl9yZXEtPnNjYW5faWQsIGFib3J0X3NjYW5fcmVxLT5TZXNzaW9uSWQpOworCVdNQV9MT0dJKCJXTUEgLS0+IFdNSV9TVE9QX1NDQU5fQ01ESUQiKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CitlcnJvcjoKKwlpZiAoYnVmKQorCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CitlcnJvcjE6CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogd21hX3VwZGF0ZV9jaGFubmVsX2xpc3QoKSAtIHVwZGF0ZSBjaGFubmVsIGxpc3QKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjaGFuX2xpc3Q6IGNoYW5uZWwgbGlzdAorICoKKyAqIEZ1bmN0aW9uIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdXBwb3J0IGNoYW5uZWwgbGlzdCBpbiBmdy4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfdXBkYXRlX2NoYW5uZWxfbGlzdChXTUFfSEFORExFIGhhbmRsZSwKKwkJCQkgICB0U2lyVXBkYXRlQ2hhbkxpc3QgKmNoYW5fbGlzdCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCXdtaV9idWZfdCBidWY7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXdtaV9zY2FuX2NoYW5fbGlzdF9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwlpbnQgc3RhdHVzLCBpOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX2NoYW5uZWwgKmNoYW5faW5mbzsKKwl1aW50MTZfdCBsZW4gPSBzaXplb2YoKmNtZCkgKyBXTUlfVExWX0hEUl9TSVpFOworCisJbGVuICs9IHNpemVvZih3bWlfY2hhbm5lbCkgKiBjaGFuX2xpc3QtPm51bUNoYW47CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5Iik7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwljbWQgPSAod21pX3NjYW5fY2hhbl9saXN0X2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zY2FuX2NoYW5fbGlzdF9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3NjYW5fY2hhbl9saXN0X2NtZF9maXhlZF9wYXJhbSkpOworCisJV01BX0xPR0QoIm5vIG9mIGNoYW5uZWxzID0gJWQsIGxlbiA9ICVkIiwgY2hhbl9saXN0LT5udW1DaGFuLCBsZW4pOworCisJY21kLT5udW1fc2Nhbl9jaGFucyA9IGNoYW5fbGlzdC0+bnVtQ2hhbjsKKwlXTUlUTFZfU0VUX0hEUigoYnVmX3B0ciArIHNpemVvZih3bWlfc2Nhbl9jaGFuX2xpc3RfY21kX2ZpeGVkX3BhcmFtKSksCisJCSAgICAgICBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkgICAgICAgc2l6ZW9mKHdtaV9jaGFubmVsKSAqIGNoYW5fbGlzdC0+bnVtQ2hhbik7CisJY2hhbl9pbmZvID0gKHdtaV9jaGFubmVsICopIChidWZfcHRyICsgc2l6ZW9mKCpjbWQpICsgV01JX1RMVl9IRFJfU0laRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hhbl9saXN0LT5udW1DaGFuOyArK2kpIHsKKwkJV01JVExWX1NFVF9IRFIoJmNoYW5faW5mby0+dGx2X2hlYWRlciwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGFubmVsLAorCQkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfY2hhbm5lbCkpOworCQljaGFuX2luZm8tPm1oeiA9CisJCQljZHNfY2hhbl90b19mcmVxKGNoYW5fbGlzdC0+Y2hhblBhcmFtW2ldLmNoYW5JZCk7CisJCWNoYW5faW5mby0+YmFuZF9jZW50ZXJfZnJlcTEgPSBjaGFuX2luZm8tPm1oejsKKwkJY2hhbl9pbmZvLT5iYW5kX2NlbnRlcl9mcmVxMiA9IDA7CisKKwkJV01BX0xPR0QoImNoYW5bJWRdID0gJXUiLCBpLCBjaGFuX2luZm8tPm1oeik7CisJCWlmIChjaGFuX2xpc3QtPmNoYW5QYXJhbVtpXS5kZnNTZXQpIHsKKwkJCVdNSV9TRVRfQ0hBTk5FTF9GTEFHKGNoYW5faW5mbywgV01JX0NIQU5fRkxBR19QQVNTSVZFKTsKKwkJCVdNQV9MT0dJKCJjaGFuWyVkXSBERlNbJWRdXG4iLAorCQkJCSBjaGFuX2xpc3QtPmNoYW5QYXJhbVtpXS5jaGFuSWQsCisJCQkJIGNoYW5fbGlzdC0+Y2hhblBhcmFtW2ldLmRmc1NldCk7CisJCX0KKworCQlpZiAoY2hhbl9pbmZvLT5taHogPCBXTUFfMl80X0dIWl9NQVhfRlJFUSkKKwkJCVdNSV9TRVRfQ0hBTk5FTF9NT0RFKGNoYW5faW5mbywgTU9ERV8xMUcpOworCQllbHNlCisJCQlXTUlfU0VUX0NIQU5ORUxfTU9ERShjaGFuX2luZm8sIE1PREVfMTFBKTsKKworCQlpZiAoY2hhbl9saXN0LT5jaGFuUGFyYW1baV0uaGFsZl9yYXRlKQorCQkJV01JX1NFVF9DSEFOTkVMX0ZMQUcoY2hhbl9pbmZvLAorCQkJCVdNSV9DSEFOX0ZMQUdfSEFMRl9SQVRFKTsKKwkJZWxzZSBpZiAoY2hhbl9saXN0LT5jaGFuUGFyYW1baV0ucXVhcnRlcl9yYXRlKQorCQkJV01JX1NFVF9DSEFOTkVMX0ZMQUcoY2hhbl9pbmZvLAorCQkJCVdNSV9DSEFOX0ZMQUdfUVVBUlRFUl9SQVRFKTsKKworCQlXTUlfU0VUX0NIQU5ORUxfTUFYX1RYX1BPV0VSKGNoYW5faW5mbywKKwkJCQkJICAgICBjaGFuX2xpc3QtPmNoYW5QYXJhbVtpXS5wd3IpOworCisJCVdNSV9TRVRfQ0hBTk5FTF9SRUdfUE9XRVIoY2hhbl9pbmZvLAorCQkJCQkgIGNoYW5fbGlzdC0+Y2hhblBhcmFtW2ldLnB3cik7CisJCVdNQV9MT0dEKCJDaGFubmVsIFRYIHBvd2VyWyVkXSA9ICV1OiAlZCIsIGksIGNoYW5faW5mby0+bWh6LAorCQkJIGNoYW5fbGlzdC0+Y2hhblBhcmFtW2ldLnB3cik7CisJCS8qVE9ETzogU2V0IFdNSV9TRVRfQ0hBTk5FTF9NSU5fUE9XRVIgKi8KKwkJLypUT0RPOiBTZXQgV01JX1NFVF9DSEFOTkVMX0FOVEVOTkFfTUFYICovCisJCS8qVE9ETzogV01JX1NFVF9DSEFOTkVMX1JFR19DTEFTU0lEICovCisJCWNoYW5faW5mbysrOworCX0KKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgICAgIFdNSV9TQ0FOX0NIQU5fTElTVF9DTURJRCk7CisKKwlpZiAoc3RhdHVzICE9IEVPSykgeworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gc2VuZCBXTUlfU0NBTl9DSEFOX0xJU1RfQ01ESUQiKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJfQorZW5kOgorCXJldHVybiBjZGZfc3RhdHVzOworfQorCisKKy8qKgorICogd21hX3JvYW1fc2Nhbl9vZmZsb2FkX21vZGUoKSAtIHNlbmQgcm9hbSBzY2FuIG1vZGUgcmVxdWVzdCB0byBmdworICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBzY2FuX2NtZF9mcDogc3RhcnQgc2NhbiBjb21tYW5kIHB0cgorICogQHJvYW1fcmVxOiByb2FtIHJlcXVlc3QgcGFyYW0KKyAqIEBtb2RlOiBtb2RlCisgKiBAdmRldl9pZDogdmRldiBpZAorICoKKyAqIHNlbmQgV01JX1JPQU1fU0NBTl9NT0RFIFRMViB0byBmaXJtd2FyZS4gSXQgaGFzIGEgcGlnZ3liYWNrCisgKiBvZiBXTUlfUk9BTV9TQ0FOX01PREUuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9vZmZsb2FkX21vZGUodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICAgIHdtaV9zdGFydF9zY2FuX2NtZF9maXhlZF9wYXJhbSAqCisJCQkJICAgICAgc2Nhbl9jbWRfZnAsCisJCQkJICAgICAgdFNpclJvYW1PZmZsb2FkU2NhblJlcSAqcm9hbV9yZXEsCisJCQkJICAgICAgdWludDMyX3QgbW9kZSwgdWludDMyX3QgdmRldl9pZCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJd21pX2J1Zl90IGJ1ZiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGxlbjsKKwl1aW50OF90ICpidWZfcHRyOworCXdtaV9yb2FtX3NjYW5fbW9kZV9maXhlZF9wYXJhbSAqcm9hbV9zY2FuX21vZGVfZnA7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWludCBhdXRoX21vZGUgPSBXTUlfQVVUSF9OT05FOworCXdtaV9yb2FtX29mZmxvYWRfdGx2X3BhcmFtICpyb2FtX29mZmxvYWRfcGFyYW1zOworCXdtaV9yb2FtXzExaV9vZmZsb2FkX3Rsdl9wYXJhbSAqcm9hbV9vZmZsb2FkXzExaTsKKwl3bWlfcm9hbV8xMXJfb2ZmbG9hZF90bHZfcGFyYW0gKnJvYW1fb2ZmbG9hZF8xMXI7CisJd21pX3JvYW1fZXNlX29mZmxvYWRfdGx2X3BhcmFtICpyb2FtX29mZmxvYWRfZXNlOworCWlmIChyb2FtX3JlcSkKKwkJYXV0aF9tb2RlID0gZV9jc3JfYXV0aF90eXBlX3RvX3Jzbl9hdXRobW9kZQorCQkJCSAgICAocm9hbV9yZXEtPkNvbm5lY3RlZE5ldHdvcmsuYXV0aGVudGljYXRpb24sCisJCQkJICAgIHJvYW1fcmVxLT5Db25uZWN0ZWROZXR3b3JrLmVuY3J5cHRpb24pOworCVdNQV9MT0dEKCIlcyA6IGF1dGggbW9kZSA9ICVkIiwgX19mdW5jX18sIGF1dGhfbW9kZSk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRCAqLworCS8qIE5lZWQgdG8gY3JlYXRlIGEgYnVmIHdpdGggcm9hbV9zY2FuIGNvbW1hbmQgYXQKKwkgKiBmcm9udCBhbmQgcGlnZ3liYWNrIHdpdGggc2NhbiBjb21tYW5kICovCisJbGVuID0gc2l6ZW9mKHdtaV9yb2FtX3NjYW5fbW9kZV9maXhlZF9wYXJhbSkgKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwkgICAgICAoMiAqIFdNSV9UTFZfSERSX1NJWkUpICsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FEICovCisJICAgICAgc2l6ZW9mKHdtaV9zdGFydF9zY2FuX2NtZF9maXhlZF9wYXJhbSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRAorCWlmIChyb2FtX3JlcSAmJiByb2FtX3JlcS0+Um9hbU9mZmxvYWRFbmFibGVkKSB7CisJCWxlbiArPSBzaXplb2Yod21pX3JvYW1fb2ZmbG9hZF90bHZfcGFyYW0pOworCQlsZW4gKz0gV01JX1RMVl9IRFJfU0laRTsKKwkJaWYgKChhdXRoX21vZGUgIT0gV01JX0FVVEhfTk9ORSkgJiYKKwkJICAgICgoYXV0aF9tb2RlICE9IFdNSV9BVVRIX09QRU4pIHx8CisJCSAgICAgKGF1dGhfbW9kZSA9PSBXTUlfQVVUSF9PUEVOICYmCisJCSAgICAgIHJvYW1fcmVxLT5NRElELm1kaWVQcmVzZW50KSB8fCByb2FtX3JlcS0+SXNFU0VBc3NvYykpIHsKKwkJCWxlbiArPSBXTUlfVExWX0hEUl9TSVpFOworCQkJaWYgKHJvYW1fcmVxLT5Jc0VTRUFzc29jKQorCQkJCWxlbiArPSBzaXplb2Yod21pX3JvYW1fZXNlX29mZmxvYWRfdGx2X3BhcmFtKTsKKwkJCWVsc2UgaWYgKGF1dGhfbW9kZSA9PSBXTUlfQVVUSF9GVF9SU05BIHx8CisJCQkJIGF1dGhfbW9kZSA9PSBXTUlfQVVUSF9GVF9SU05BX1BTSyB8fAorCQkJCSAoYXV0aF9tb2RlID09IFdNSV9BVVRIX09QRU4gJiYKKwkJCQkgIHJvYW1fcmVxLT5NRElELm1kaWVQcmVzZW50KSkKKwkJCQlsZW4gKz0gc2l6ZW9mKHdtaV9yb2FtXzExcl9vZmZsb2FkX3Rsdl9wYXJhbSk7CisJCQllbHNlCisJCQkJbGVuICs9IHNpemVvZih3bWlfcm9hbV8xMWlfb2ZmbG9hZF90bHZfcGFyYW0pOworCQl9IGVsc2UgeworCQkJbGVuICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocm9hbV9yZXEpCisJCQlXTUFfTE9HRCgiJXMgOiByb2FtIG9mZmxvYWQgPSAlZCIsCisJCQkJIF9fZnVuY19fLCByb2FtX3JlcS0+Um9hbU9mZmxvYWRFbmFibGVkKTsKKwkJZWxzZQorCQkJV01BX0xPR0QoIiVzIDogcm9hbV9yZXEgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJbGVuICs9ICgyICogV01JX1RMVl9IRFJfU0laRSk7CisJfQorCWlmIChyb2FtX3JlcSAmJiByb2FtX3JlcS0+Um9hbU9mZmxvYWRFbmFibGVkKSB7CisJCW1vZGUgPSBtb2RlIHwgV01JX1JPQU1fU0NBTl9NT0RFX1JPQU1PRkZMT0FEOworCX0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FEICovCisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlcyA6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlyb2FtX3NjYW5fbW9kZV9mcCA9ICh3bWlfcm9hbV9zY2FuX21vZGVfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmcm9hbV9zY2FuX21vZGVfZnAtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX3NjYW5fbW9kZV9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcm9hbV9zY2FuX21vZGVfZml4ZWRfcGFyYW0pKTsKKworCXJvYW1fc2Nhbl9tb2RlX2ZwLT5yb2FtX3NjYW5fbW9kZSA9IG1vZGU7CisJcm9hbV9zY2FuX21vZGVfZnAtPnZkZXZfaWQgPSB2ZGV2X2lkOworCS8qIEZpbGwgaW4gc2NhbiBwYXJhbWV0ZXJzIHN1aXRhYmxlIGZvciByb2FtaW5nIHNjYW4gKi8KKwlidWZfcHRyICs9IHNpemVvZih3bWlfcm9hbV9zY2FuX21vZGVfZml4ZWRfcGFyYW0pOworCWNkZl9tZW1fY29weShidWZfcHRyLCBzY2FuX2NtZF9mcCwKKwkJICAgICBzaXplb2Yod21pX3N0YXJ0X3NjYW5fY21kX2ZpeGVkX3BhcmFtKSk7CisJLyogRW5zdXJlIHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgSUVzICovCisJc2Nhbl9jbWRfZnAtPmllX2xlbiA9IDA7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YXJ0X3NjYW5fY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9zdGFydF9zY2FuX2NtZF9maXhlZF9wYXJhbSkpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKwlidWZfcHRyICs9IHNpemVvZih3bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0pOworCWlmIChyb2FtX3JlcSAmJiByb2FtX3JlcS0+Um9hbU9mZmxvYWRFbmFibGVkKSB7CisJCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCQkgICAgICAgc2l6ZW9mKHdtaV9yb2FtX29mZmxvYWRfdGx2X3BhcmFtKSk7CisJCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwkJcm9hbV9vZmZsb2FkX3BhcmFtcyA9ICh3bWlfcm9hbV9vZmZsb2FkX3Rsdl9wYXJhbSAqKSBidWZfcHRyOworCQlXTUlUTFZfU0VUX0hEUihidWZfcHRyLAorCQkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fb2ZmbG9hZF90bHZfcGFyYW0sCisJCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkJICAgICAgICh3bWlfcm9hbV9vZmZsb2FkX3Rsdl9wYXJhbSkpOworCQlyb2FtX29mZmxvYWRfcGFyYW1zLT5wcmVmZXJfNWcgPSByb2FtX3JlcS0+UHJlZmVyNUdIejsKKwkJcm9hbV9vZmZsb2FkX3BhcmFtcy0+cnNzaV9jYXRfZ2FwID0gcm9hbV9yZXEtPlJvYW1Sc3NpQ2F0R2FwOworCQlyb2FtX29mZmxvYWRfcGFyYW1zLT5zZWxlY3RfNWdfbWFyZ2luID0KKwkJCXJvYW1fcmVxLT5TZWxlY3Q1R0h6TWFyZ2luOworCQlyb2FtX29mZmxvYWRfcGFyYW1zLT5yZWFzc29jX2ZhaWx1cmVfdGltZW91dCA9CisJCQlyb2FtX3JlcS0+UmVhc3NvY0ZhaWx1cmVUaW1lb3V0OworCQkvKiBGaWxsIHRoZSBjYXBhYmlsaXRpZXMgKi8KKwkJd21hX3JvYW1fc2Nhbl9maWxsX3NlbGZfY2Fwcyh3bWFfaGFuZGxlLCByb2FtX29mZmxvYWRfcGFyYW1zLAorCQkJCQkgICAgIHJvYW1fcmVxKTsKKwkJYnVmX3B0ciArPSBzaXplb2Yod21pX3JvYW1fb2ZmbG9hZF90bHZfcGFyYW0pOworCQkvKiBUaGUgVExWJ3MgYXJlIGluIHRoZSBvcmRlciBvZiAxMWksIDExUiwgRVNFLiBIZW5jZSwKKwkJICogdGhleSBhcmUgZmlsbGVkIGluIHRoZSBzYW1lIG9yZGVyLkRlcGVuZGluZyBvbiB0aGUKKwkJICogYXV0aGVudGljYXRpb24gdHlwZSwgdGhlIG90aGVyIG1vZGUgVExWJ3MgYXJlIG51bGxpZmllZAorCQkgKiBhbmQgb25seSBoZWFkZXJzIGFyZSBmaWxsZWQuKi8KKwkJaWYgKChhdXRoX21vZGUgIT0gV01JX0FVVEhfTk9ORSkgJiYKKwkJICAgICgoYXV0aF9tb2RlICE9IFdNSV9BVVRIX09QRU4pIHx8CisJCSAgICAgKGF1dGhfbW9kZSA9PSBXTUlfQVVUSF9PUEVOCisJCSAgICAgICYmIHJvYW1fcmVxLT5NRElELm1kaWVQcmVzZW50KSB8fCByb2FtX3JlcS0+SXNFU0VBc3NvYykpIHsKKwkJCWlmIChyb2FtX3JlcS0+SXNFU0VBc3NvYykgeworCQkJCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCQkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oMCkpOworCQkJCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwkJCQlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkJCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKDApKTsKKwkJCQlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCQkJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJCQkJc2l6ZW9mKHdtaV9yb2FtX2VzZV9vZmZsb2FkX3Rsdl9wYXJhbSkpOworCQkJCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwkJCQlyb2FtX29mZmxvYWRfZXNlID0KKwkJCQkJKHdtaV9yb2FtX2VzZV9vZmZsb2FkX3Rsdl9wYXJhbSAqKSBidWZfcHRyOworCQkJCWNkZl9tZW1fY29weShyb2FtX29mZmxvYWRfZXNlLT5rcmssCisJCQkJCSAgICAgcm9hbV9yZXEtPktSSywKKwkJCQkJICAgICBzaXplb2Yocm9hbV9yZXEtPktSSykpOworCQkJCWNkZl9tZW1fY29weShyb2FtX29mZmxvYWRfZXNlLT5idGssCisJCQkJCSAgICAgcm9hbV9yZXEtPkJUSywKKwkJCQkJICAgICBzaXplb2Yocm9hbV9yZXEtPkJUSykpOworCQkJCVdNSVRMVl9TRVRfSERSKCZyb2FtX29mZmxvYWRfZXNlLT50bHZfaGVhZGVyLAorCQkJCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX2VzZV9vZmZsb2FkX3Rsdl9wYXJhbSwKKwkJCQkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkJCSh3bWlfcm9hbV9lc2Vfb2ZmbG9hZF90bHZfcGFyYW0pKTsKKwkJCQlidWZfcHRyICs9CisJCQkJCXNpemVvZih3bWlfcm9hbV9lc2Vfb2ZmbG9hZF90bHZfcGFyYW0pOworCQkJfSBlbHNlIGlmIChhdXRoX21vZGUgPT0gV01JX0FVVEhfRlRfUlNOQQorCQkJCSAgIHx8IGF1dGhfbW9kZSA9PSBXTUlfQVVUSF9GVF9SU05BX1BTSworCQkJCSAgIHx8IChhdXRoX21vZGUgPT0gV01JX0FVVEhfT1BFTgorCQkJCSAgICAgICAmJiByb2FtX3JlcS0+TURJRC5tZGllUHJlc2VudCkpIHsKKwkJCQlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkJCQkgICAgICAgMCk7CisJCQkJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCQkJCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCQkJCXNpemVvZih3bWlfcm9hbV8xMXJfb2ZmbG9hZF90bHZfcGFyYW0pKTsKKwkJCQlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCQkJcm9hbV9vZmZsb2FkXzExciA9CisJCQkJCSh3bWlfcm9hbV8xMXJfb2ZmbG9hZF90bHZfcGFyYW0gKikgYnVmX3B0cjsKKwkJCQlyb2FtX29mZmxvYWRfMTFyLT5yMGtoX2lkX2xlbiA9CisJCQkJCXJvYW1fcmVxLT5SMEtIX0lEX0xlbmd0aDsKKwkJCQljZGZfbWVtX2NvcHkocm9hbV9vZmZsb2FkXzExci0+cjBraF9pZCwKKwkJCQkJICAgICByb2FtX3JlcS0+UjBLSF9JRCwKKwkJCQkJICAgICByb2FtX29mZmxvYWRfMTFyLT5yMGtoX2lkX2xlbik7CisJCQkJY2RmX21lbV9jb3B5KHJvYW1fb2ZmbG9hZF8xMXItPnBza19tc2ssCisJCQkJCSAgICAgcm9hbV9yZXEtPlBTS19QTUssCisJCQkJCSAgICAgc2l6ZW9mKHJvYW1fcmVxLT5QU0tfUE1LKSk7CisJCQkJcm9hbV9vZmZsb2FkXzExci0+cHNrX21za19sZW4gPQorCQkJCQlyb2FtX3JlcS0+cG1rX2xlbjsKKwkJCQlyb2FtX29mZmxvYWRfMTFyLT5tZGllX3ByZXNlbnQgPQorCQkJCQlyb2FtX3JlcS0+TURJRC5tZGllUHJlc2VudDsKKwkJCQlyb2FtX29mZmxvYWRfMTFyLT5tZGlkID0KKwkJCQkJcm9hbV9yZXEtPk1ESUQubW9iaWxpdHlEb21haW47CisJCQkJaWYgKGF1dGhfbW9kZSA9PSBXTUlfQVVUSF9PUEVOKSB7CisJCQkJCS8qIElmIEZULU9wZW4gZW5zdXJlIHBtayBsZW5ndGgKKwkJCQkJICAgYW5kIHIwa2hpZCBsZW4gYXJlIHplcm8gKi8KKwkJCQkJcm9hbV9vZmZsb2FkXzExci0+cjBraF9pZF9sZW4gPSAwOworCQkJCQlyb2FtX29mZmxvYWRfMTFyLT5wc2tfbXNrX2xlbiA9IDA7CisJCQkJfQorCQkJCVdNSVRMVl9TRVRfSERSKCZyb2FtX29mZmxvYWRfMTFyLT50bHZfaGVhZGVyLAorCQkJCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtXzExcl9vZmZsb2FkX3Rsdl9wYXJhbSwKKwkJCQkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkJCSh3bWlfcm9hbV8xMXJfb2ZmbG9hZF90bHZfcGFyYW0pKTsKKwkJCQlidWZfcHRyICs9CisJCQkJCXNpemVvZih3bWlfcm9hbV8xMXJfb2ZmbG9hZF90bHZfcGFyYW0pOworCQkJCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCQkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oMCkpOworCQkJCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwkJCX0gZWxzZSB7CisJCQkJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJCQkJc2l6ZW9mKHdtaV9yb2FtXzExaV9vZmZsb2FkX3Rsdl9wYXJhbSkpOworCQkJCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwkJCQlyb2FtX29mZmxvYWRfMTFpID0KKwkJCQkJKHdtaV9yb2FtXzExaV9vZmZsb2FkX3Rsdl9wYXJhbSAqKSBidWZfcHRyOworCQkJCWlmIChyb2FtX3JlcS0+Um9hbUtleU1nbXRPZmZsb2FkRW5hYmxlZCkgeworCQkJCQlXTUlfU0VUX1JPQU1fT0ZGTE9BRF9PS0NfRU5BQkxFRAorCQkJCQkJKHJvYW1fb2ZmbG9hZF8xMWktPmZsYWdzKTsKKwkJCQkJV01BX0xPR0UoIkxGUjM6T0tDIEVuYWJsZWQiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlXTUlfU0VUX1JPQU1fT0ZGTE9BRF9PS0NfRElTQUJMRUQKKwkJCQkJCShyb2FtX29mZmxvYWRfMTFpLT5mbGFncyk7CisJCQkJCVdNQV9MT0dFKCJMRlIzOk9LQyBEaXNhYmxlZCIpOworCQkJCX0KKworCQkJCWNkZl9tZW1fY29weShyb2FtX29mZmxvYWRfMTFpLT5wbWssCisJCQkJCSAgICAgcm9hbV9yZXEtPlBTS19QTUssCisJCQkJCSAgICAgc2l6ZW9mKHJvYW1fcmVxLT5QU0tfUE1LKSk7CisJCQkJcm9hbV9vZmZsb2FkXzExaS0+cG1rX2xlbiA9IHJvYW1fcmVxLT5wbWtfbGVuOworCQkJCVdNSVRMVl9TRVRfSERSKCZyb2FtX29mZmxvYWRfMTFpLT50bHZfaGVhZGVyLAorCQkJCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtXzExaV9vZmZsb2FkX3Rsdl9wYXJhbSwKKwkJCQkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkJCSh3bWlfcm9hbV8xMWlfb2ZmbG9hZF90bHZfcGFyYW0pKTsKKwkJCQlidWZfcHRyICs9CisJCQkJCXNpemVvZih3bWlfcm9hbV8xMWlfb2ZmbG9hZF90bHZfcGFyYW0pOworCQkJCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCQkJCSAgICAgICAwKTsKKwkJCQlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCQkJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJCQkJICAgICAgIDApOworCQkJCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCQkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTigwKSk7CisJCQlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCQlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oMCkpOworCQkJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCQkJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKDApKTsKKwkJfQorCX0gZWxzZSB7CisJCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKDApKTsKKwkJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCQlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTigwKSk7CisJCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwkJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oMCkpOworCQlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKDApKTsKKwl9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1JPQU1fT0ZGTE9BRCAqLworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgICAgICBsZW4sIFdNSV9ST0FNX1NDQU5fTU9ERSk7CisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIndtaV91bmlmaWVkX2NtZF9zZW5kIFdNSV9ST0FNX1NDQU5fTU9ERSByZXR1cm5lZCBFcnJvciAlZCIsCisJCQlzdGF0dXMpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZXJyb3I7CisJfQorCisJV01BX0xPR0koIiVzOiBXTUEgLS0+IFdNSV9ST0FNX1NDQU5fTU9ERSIsIF9fZnVuY19fKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworZXJyb3I6CisJd21pX2J1Zl9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiB3bWFfcm9hbV9zY2FuX29mZmxvYWRfcnNzaV90aHJlc2hvbGQoKSAtIHNldCBzY2FuIG9mZmxvYWQgcnNzaSB0aHJlYXNob2xkCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQHJvYW1fcmVxOiAgIFJvYW1pbmcgcmVxdWVzdCBidWZmZXIKKyAqCisgKiBTZW5kIFdNSV9ST0FNX1NDQU5fUlNTSV9USFJFU0hPTEQgVExWIHRvIGZpcm13YXJlCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9vZmZsb2FkX3Jzc2lfdGhyZXNoKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwl0U2lyUm9hbU9mZmxvYWRTY2FuUmVxICpyb2FtX3JlcSkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJd21pX2J1Zl90IGJ1ZiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGxlbiwgcnNzaV90aHJlc2gsIHJzc2lfdGhyZXNoX2RpZmY7CisJdWludDhfdCAqYnVmX3B0cjsKKwl3bWlfcm9hbV9zY2FuX3Jzc2lfdGhyZXNob2xkX2ZpeGVkX3BhcmFtICpyc3NpX3RocmVzaG9sZF9mcDsKKwl3bWlfcm9hbV9zY2FuX2V4dGVuZGVkX3RocmVzaG9sZF9wYXJhbSAqZXh0X3RocmVzaG9sZHMgPSBOVUxMOworCXN0cnVjdCByb2FtX2V4dF9wYXJhbXMgKnJvYW1fcGFyYW1zOworCWludDMyX3QgZ29vZF9yc3NpX3RocmVzaG9sZDsKKwl1aW50MzJfdCBoaXJzc2lfc2Nhbl9tYXhfY291bnQ7CisJdWludDMyX3QgaGlyc3NpX3NjYW5fZGVsdGE7CisJaW50MzJfdCBoaXJzc2lfdXBwZXJfYm91bmQ7CisKKwkvKiBTZW5kIHJzc2kgdGhyZXNob2xkICovCisJcm9hbV9wYXJhbXMgPSAmcm9hbV9yZXEtPnJvYW1fcGFyYW1zOworCXJzc2lfdGhyZXNoID0gcm9hbV9yZXEtPkxvb2t1cFRocmVzaG9sZCAtIFdNQV9OT0lTRV9GTE9PUl9EQk1fREVGQVVMVDsKKwlyc3NpX3RocmVzaF9kaWZmID0gcm9hbV9yZXEtPk9wcG9ydHVuaXN0aWNTY2FuVGhyZXNob2xkRGlmZjsKKwloaXJzc2lfc2Nhbl9tYXhfY291bnQgPSByb2FtX3JlcS0+aGlfcnNzaV9zY2FuX21heF9jb3VudDsKKwloaXJzc2lfc2Nhbl9kZWx0YSA9IHJvYW1fcmVxLT5oaV9yc3NpX3NjYW5fcnNzaV9kZWx0YTsKKwloaXJzc2lfdXBwZXJfYm91bmQgPSByb2FtX3JlcS0+aGlfcnNzaV9zY2FuX3Jzc2lfdWIgLQorCQkJCSAgICAgV01BX05PSVNFX0ZMT09SX0RCTV9ERUZBVUxUOworCWxlbiA9IHNpemVvZih3bWlfcm9hbV9zY2FuX3Jzc2lfdGhyZXNob2xkX2ZpeGVkX3BhcmFtKTsKKwlsZW4gKz0gV01JX1RMVl9IRFJfU0laRTsgLyogVExWIGZvciBleHRfdGhyZXNob2xkcyovCisJbGVuICs9IHNpemVvZih3bWlfcm9hbV9zY2FuX2V4dGVuZGVkX3RocmVzaG9sZF9wYXJhbSk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlcyA6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlyc3NpX3RocmVzaG9sZF9mcCA9CisJCSh3bWlfcm9hbV9zY2FuX3Jzc2lfdGhyZXNob2xkX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJnJzc2lfdGhyZXNob2xkX2ZwLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX3Jzc2lfdGhyZXNob2xkX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9yb2FtX3NjYW5fcnNzaV90aHJlc2hvbGRfZml4ZWRfcGFyYW0pKTsKKwkvKiBmaWxsIGluIHRocmVzaG9sZCB2YWx1ZXMgKi8KKwlyc3NpX3RocmVzaG9sZF9mcC0+dmRldl9pZCA9IHJvYW1fcmVxLT5zZXNzaW9uSWQ7CisJcnNzaV90aHJlc2hvbGRfZnAtPnJvYW1fc2Nhbl9yc3NpX3RocmVzaCA9IHJzc2lfdGhyZXNoICYgMHgwMDAwMDBmZjsKKwlyc3NpX3RocmVzaG9sZF9mcC0+cm9hbV9yc3NpX3RocmVzaF9kaWZmID0KKwkJcnNzaV90aHJlc2hfZGlmZiAmIDB4MDAwMDAwZmY7CisJcnNzaV90aHJlc2hvbGRfZnAtPmhpcnNzaV9zY2FuX21heF9jb3VudCA9IGhpcnNzaV9zY2FuX21heF9jb3VudDsKKwlyc3NpX3RocmVzaG9sZF9mcC0+aGlyc3NpX3NjYW5fZGVsdGEgPSBoaXJzc2lfc2Nhbl9kZWx0YTsKKwlyc3NpX3RocmVzaG9sZF9mcC0+aGlyc3NpX3VwcGVyX2JvdW5kID0gaGlyc3NpX3VwcGVyX2JvdW5kICYgMHgwMDAwMGZmOworCisJYnVmX3B0ciArPSBzaXplb2Yod21pX3JvYW1fc2Nhbl9yc3NpX3RocmVzaG9sZF9maXhlZF9wYXJhbSk7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwKKwkJCVdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCQlzaXplb2Yod21pX3JvYW1fc2Nhbl9leHRlbmRlZF90aHJlc2hvbGRfcGFyYW0pKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJZXh0X3RocmVzaG9sZHMgPSAod21pX3JvYW1fc2Nhbl9leHRlbmRlZF90aHJlc2hvbGRfcGFyYW0gKikgYnVmX3B0cjsKKwkvKgorCSAqIFRoZSBjdXJyZW50IE5vaXNlIGZsb29yIGluIGZpcm13YXJlIGlzIC05NmRCbS4gUGVuYWx0eS9Cb29zdAorCSAqIHRocmVzaG9sZCBpcyBhcHBsaWVkIG9uIGEgd2Vha2VyIHNpZ25hbCB0byBtYWtlIGl0IGV2ZW4gbW9yZSB3ZWFrZXIuCisJICogU28sIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgdGhlIHVzZXIgbWF5IGNvbmZpZ3VyZSBhIHZlcnkgbG93CisJICogUGVuYWx0eS9Cb29zdCB0aHJlc2hvbGQgYmV5b25kIHRoZSBub2lzZSBmbG9vci4gSWYgdGhhdCBpcyB0aGUgY2FzZSwKKwkgKiB0aGVuIHN1cHByZXNzIHRoZSBwZW5hbHR5L2Jvb3N0IHRocmVzaG9sZCB0byB0aGUgbm9pc2UgZmxvb3IuCisJICovCisJaWYgKHJvYW1fcGFyYW1zLT5yYWlzZV9yc3NpX3RocmVzaF81ZyA8IFdNQV9OT0lTRV9GTE9PUl9EQk1fREVGQVVMVCkKKwkJZXh0X3RocmVzaG9sZHMtPnBlbmFsdHlfdGhyZXNob2xkXzVnID0gMDsKKwllbHNlCisJCWV4dF90aHJlc2hvbGRzLT5ib29zdF90aHJlc2hvbGRfNWcgPQorCQkJKHJvYW1fcGFyYW1zLT5yYWlzZV9yc3NpX3RocmVzaF81ZyAtCisJCQkgV01BX05PSVNFX0ZMT09SX0RCTV9ERUZBVUxUKSAmIDB4MDAwMDAwZmY7CisJaWYgKHJvYW1fcGFyYW1zLT5kcm9wX3Jzc2lfdGhyZXNoXzVnIDwgV01BX05PSVNFX0ZMT09SX0RCTV9ERUZBVUxUKQorCQlleHRfdGhyZXNob2xkcy0+cGVuYWx0eV90aHJlc2hvbGRfNWcgPSAwOworCWVsc2UKKwkJZXh0X3RocmVzaG9sZHMtPnBlbmFsdHlfdGhyZXNob2xkXzVnID0KKwkJCShyb2FtX3BhcmFtcy0+ZHJvcF9yc3NpX3RocmVzaF81ZyAtCisJCQkgV01BX05PSVNFX0ZMT09SX0RCTV9ERUZBVUxUKSAmIDB4MDAwMDAwZmY7CisJZXh0X3RocmVzaG9sZHMtPmJvb3N0X2FsZ29yaXRobV81ZyA9CisJCVdNSV9ST0FNXzVHX0JPT1NUX1BFTkFMSVpFX0FMR09fTElORUFSOworCWV4dF90aHJlc2hvbGRzLT5ib29zdF9mYWN0b3JfNWcgPSByb2FtX3BhcmFtcy0+cmFpc2VfZmFjdG9yXzVnOworCWV4dF90aHJlc2hvbGRzLT5wZW5hbHR5X2FsZ29yaXRobV81ZyA9CisJCVdNSV9ST0FNXzVHX0JPT1NUX1BFTkFMSVpFX0FMR09fTElORUFSOworCWV4dF90aHJlc2hvbGRzLT5wZW5hbHR5X2ZhY3Rvcl81ZyA9IHJvYW1fcGFyYW1zLT5kcm9wX2ZhY3Rvcl81ZzsKKwlleHRfdGhyZXNob2xkcy0+bWF4X2Jvb3N0XzVnID0gcm9hbV9wYXJhbXMtPm1heF9yYWlzZV9yc3NpXzVnOworCWV4dF90aHJlc2hvbGRzLT5tYXhfcGVuYWx0eV81ZyA9IHJvYW1fcGFyYW1zLT5tYXhfZHJvcF9yc3NpXzVnOworCisJaWYgKHJvYW1fcGFyYW1zLT5nb29kX3Jzc2lfcm9hbSkKKwkJZ29vZF9yc3NpX3RocmVzaG9sZCA9IFdNQV9OT0lTRV9GTE9PUl9EQk1fREVGQVVMVDsKKwllbHNlCisJCWdvb2RfcnNzaV90aHJlc2hvbGQgPSAwOworCWV4dF90aHJlc2hvbGRzLT5nb29kX3Jzc2lfdGhyZXNob2xkID0KKwkgICAgKGdvb2RfcnNzaV90aHJlc2hvbGQgLSBXTUFfTk9JU0VfRkxPT1JfREJNX0RFRkFVTFQpICYgMHgwMDAwMDBmZjsKKworCVdNQV9MT0dEKCJXTUEgLS0+IGdvb2RfcnNzaV90aHJlc2hvbGQ9JWQiLAorCQkgZXh0X3RocmVzaG9sZHMtPmdvb2RfcnNzaV90aHJlc2hvbGQpOworCisJV01JVExWX1NFVF9IRFIoJmV4dF90aHJlc2hvbGRzLT50bHZfaGVhZGVyLAorCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX3NjYW5fZXh0ZW5kZWRfdGhyZXNob2xkX3BhcmFtLAorCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJKHdtaV9yb2FtX3NjYW5fZXh0ZW5kZWRfdGhyZXNob2xkX3BhcmFtKSk7CisJc3RhdHVzID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLAorCQkJCSAgICAgIGxlbiwgV01JX1JPQU1fU0NBTl9SU1NJX1RIUkVTSE9MRCk7CisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoImNtZCBXTUlfUk9BTV9TQ0FOX1JTU0lfVEhSRVNIT0xEIHJldHVybmVkIEVycm9yICVkIiwKKwkJCXN0YXR1cyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlXTUFfTE9HSShGTCgicm9hbV9zY2FuX3Jzc2lfdGhyZXNoPSVkLCByb2FtX3Jzc2lfdGhyZXNoX2RpZmY9JWQiKSwKKwkJcnNzaV90aHJlc2gsIHJzc2lfdGhyZXNoX2RpZmYpOworCVdNQV9MT0dJKAorCQlGTCgiaGlyc3NpX3NjYW4gbWF4X2NvdW50PSVkLCBkZWx0YT0lZCwgaGlyc3NpX3VwcGVyX2JvdW5kPSVkIiksCisJCWhpcnNzaV9zY2FuX21heF9jb3VudCwgaGlyc3NpX3NjYW5fZGVsdGEsIGhpcnNzaV91cHBlcl9ib3VuZCk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK2Vycm9yOgorCXdtaV9idWZfZnJlZShidWYpOworCisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogd21hX3JvYW1fc2Nhbl9vZmZsb2FkX3NjYW5fcGVyaW9kKCkgLSBzZXQgcm9hbSBvZmZsb2FkIHNjYW4gcGVyaW9kCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQHNjYW5fcGVyaW9kOiBzY2FuIHBlcmlvZAorICogQHNjYW5fYWdlOiBzY2FuIGFnZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBTZW5kIFdNSV9ST0FNX1NDQU5fUEVSSU9EIHBhcmFtZXRlcnMgdG8gZncuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9vZmZsb2FkX3NjYW5fcGVyaW9kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJICAgICB1aW50MzJfdCBzY2FuX3BlcmlvZCwKKwkJCQkJICAgICB1aW50MzJfdCBzY2FuX2FnZSwKKwkJCQkJICAgICB1aW50MzJfdCB2ZGV2X2lkKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl3bWlfYnVmX3QgYnVmID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgbGVuOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX3JvYW1fc2Nhbl9wZXJpb2RfZml4ZWRfcGFyYW0gKnNjYW5fcGVyaW9kX2ZwOworCisJLyogU2VuZCBzY2FuIHBlcmlvZCB2YWx1ZXMgKi8KKwlsZW4gPSBzaXplb2Yod21pX3JvYW1fc2Nhbl9wZXJpb2RfZml4ZWRfcGFyYW0pOworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXMgOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJc2Nhbl9wZXJpb2RfZnAgPSAod21pX3JvYW1fc2Nhbl9wZXJpb2RfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmc2Nhbl9wZXJpb2RfZnAtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX3NjYW5fcGVyaW9kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9yb2FtX3NjYW5fcGVyaW9kX2ZpeGVkX3BhcmFtKSk7CisJLyogZmlsbCBpbiBzY2FuIHBlcmlvZCB2YWx1ZXMgKi8KKwlzY2FuX3BlcmlvZF9mcC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJc2Nhbl9wZXJpb2RfZnAtPnJvYW1fc2Nhbl9wZXJpb2QgPSBzY2FuX3BlcmlvZDsgLyogMjAgc2Vjb25kcyAqLworCXNjYW5fcGVyaW9kX2ZwLT5yb2FtX3NjYW5fYWdlID0gc2Nhbl9hZ2U7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCQkJICAgICAgbGVuLCBXTUlfUk9BTV9TQ0FOX1BFUklPRCk7CisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIndtaV91bmlmaWVkX2NtZF9zZW5kIFdNSV9ST0FNX1NDQU5fUEVSSU9EIHJldHVybmVkIEVycm9yICVkIiwKKwkJCXN0YXR1cyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlXTUFfTE9HSSgiJXM6IFdNQSAtLT4gV01JX1JPQU1fU0NBTl9QRVJJT0Qgcm9hbV9zY2FuX3BlcmlvZD0lZCwgcm9hbV9zY2FuX2FnZT0lZCIsCisJCV9fZnVuY19fLCBzY2FuX3BlcmlvZCwgc2Nhbl9hZ2UpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CitlcnJvcjoKKwl3bWlfYnVmX2ZyZWUoYnVmKTsKKworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9yc3NpX2NoYW5nZSgpIC0gc2V0IHJvYW0gb2ZmbG9hZCBSU1NJIGNoYW5nZSB0aHJlc2hvbGQKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcnNzaV9jaGFuZ2VfdGhyZXNoOiBSU1NJIENoYW5nZSB0aHJlc2hvbGQKKyAqIEBiY25fcnNzaV93ZWlnaHQ6IGJlYWNvbiBSU1NJIHdlaWdodAorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBTZW5kIFdNSV9ST0FNX1NDQU5fUlNTSV9DSEFOR0VfVEhSRVNIT0xEIHBhcmFtZXRlcnMgdG8gZncuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9vZmZsb2FkX3Jzc2lfY2hhbmdlKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwl1aW50MzJfdCB2ZGV2X2lkLAorCWludDMyX3QgcnNzaV9jaGFuZ2VfdGhyZXNoLAorCXVpbnQzMl90IGJjbl9yc3NpX3dlaWdodCwKKwl1aW50MzJfdCBoaXJzc2lfZGVsYXlfYnR3X3NjYW5zKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl3bWlfYnVmX3QgYnVmID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgbGVuOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX3JvYW1fc2Nhbl9yc3NpX2NoYW5nZV90aHJlc2hvbGRfZml4ZWRfcGFyYW0gKnJzc2lfY2hhbmdlX2ZwOworCisJLyogU2VuZCByc3NpIGNoYW5nZSBwYXJhbWV0ZXJzICovCisJbGVuID0gc2l6ZW9mKHdtaV9yb2FtX3NjYW5fcnNzaV9jaGFuZ2VfdGhyZXNob2xkX2ZpeGVkX3BhcmFtKTsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzIDogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCXJzc2lfY2hhbmdlX2ZwID0KKwkJKHdtaV9yb2FtX3NjYW5fcnNzaV9jaGFuZ2VfdGhyZXNob2xkX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJnJzc2lfY2hhbmdlX2ZwLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX3Jzc2lfY2hhbmdlX3RocmVzaG9sZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcm9hbV9zY2FuX3Jzc2lfY2hhbmdlX3RocmVzaG9sZF9maXhlZF9wYXJhbSkpOworCS8qIGZpbGwgaW4gcnNzaSBjaGFuZ2UgdGhyZXNob2xkIChoeXN0ZXJlc2lzKSB2YWx1ZXMgKi8KKwlyc3NpX2NoYW5nZV9mcC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJcnNzaV9jaGFuZ2VfZnAtPnJvYW1fc2Nhbl9yc3NpX2NoYW5nZV90aHJlc2ggPSByc3NpX2NoYW5nZV90aHJlc2g7CisJcnNzaV9jaGFuZ2VfZnAtPmJjbl9yc3NpX3dlaWdodCA9IGJjbl9yc3NpX3dlaWdodDsKKwlyc3NpX2NoYW5nZV9mcC0+aGlyc3NpX2RlbGF5X2J0d19zY2FucyA9IGhpcnNzaV9kZWxheV9idHdfc2NhbnM7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCQkJICAgICAgbGVuLCBXTUlfUk9BTV9TQ0FOX1JTU0lfQ0hBTkdFX1RIUkVTSE9MRCk7CisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIndtaV91bmlmaWVkX2NtZF9zZW5kIFdNSV9ST0FNX1NDQU5fUlNTSV9DSEFOR0VfVEhSRVNIT0xEIHJldHVybmVkIEVycm9yICVkIiwKKwkJCXN0YXR1cyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlXTUFfTE9HSShGTCgicm9hbV9zY2FuX3Jzc2lfY2hhbmdlX3RocmVzaD0lZCwgYmNuX3Jzc2lfd2VpZ2h0PSVkIiksCisJCXJzc2lfY2hhbmdlX3RocmVzaCwgYmNuX3Jzc2lfd2VpZ2h0KTsKKwlXTUFfTE9HSShGTCgiaGlyc3NpX2RlbGF5X2J0d19zY2Fucz0lZCIpLCBoaXJzc2lfZGVsYXlfYnR3X3NjYW5zKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworZXJyb3I6CisJd21pX2J1Zl9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiB3bWFfcm9hbV9zY2FuX29mZmxvYWRfY2hhbl9saXN0KCkgLSBzZXQgcm9hbSBvZmZsb2FkIGNoYW5uZWwgbGlzdAorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjaGFuX2NvdW50OiBjaGFubmVsIGNvdW50CisgKiBAY2hhbl9saXN0OiBjaGFubmVsIGxpc3QKKyAqIEBsaXN0X3R5cGU6IGxpc3QgdHlwZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBTZXQgcm9hbSBvZmZsb2FkIGNoYW5uZWwgbGlzdC4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfcm9hbV9zY2FuX29mZmxvYWRfY2hhbl9saXN0KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJICAgdWludDhfdCBjaGFuX2NvdW50LAorCQkJCQkgICB1aW50OF90ICpjaGFuX2xpc3QsCisJCQkJCSAgIHVpbnQ4X3QgbGlzdF90eXBlLCB1aW50MzJfdCB2ZGV2X2lkKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl3bWlfYnVmX3QgYnVmID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgbGVuLCBsaXN0X3Rsdl9sZW47CisJaW50IGk7CisJdWludDhfdCAqYnVmX3B0cjsKKwl3bWlfcm9hbV9jaGFuX2xpc3RfZml4ZWRfcGFyYW0gKmNoYW5fbGlzdF9mcDsKKwlBX1VJTlQzMiAqcm9hbV9jaGFuX2xpc3RfYXJyYXk7CisKKwlpZiAoY2hhbl9jb3VudCA9PSAwKSB7CisJCVdNQV9MT0dEKCIlcyA6IGludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzICVkIiwgX19mdW5jX18sCisJCQkgY2hhbl9jb3VudCk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRU1QVFk7CisJfQorCS8qIENoYW5uZWwgbGlzdCBpcyBhIHRhYmxlIG9mIDIgVExWJ3MgKi8KKwlsaXN0X3Rsdl9sZW4gPSBXTUlfVExWX0hEUl9TSVpFICsgY2hhbl9jb3VudCAqIHNpemVvZihBX1VJTlQzMik7CisJbGVuID0gc2l6ZW9mKHdtaV9yb2FtX2NoYW5fbGlzdF9maXhlZF9wYXJhbSkgKyBsaXN0X3Rsdl9sZW47CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlcyA6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwljaGFuX2xpc3RfZnAgPSAod21pX3JvYW1fY2hhbl9saXN0X2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNoYW5fbGlzdF9mcC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fY2hhbl9saXN0X2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9yb2FtX2NoYW5fbGlzdF9maXhlZF9wYXJhbSkpOworCWNoYW5fbGlzdF9mcC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJY2hhbl9saXN0X2ZwLT5udW1fY2hhbiA9IGNoYW5fY291bnQ7CisJaWYgKGNoYW5fY291bnQgPiAwICYmIGxpc3RfdHlwZSA9PSBDSEFOTkVMX0xJU1RfU1RBVElDKSB7CisJCS8qIGV4dGVybmFsIGFwcCBpcyBjb250cm9sbGluZyBjaGFubmVsIGxpc3QgKi8KKwkJY2hhbl9saXN0X2ZwLT5jaGFuX2xpc3RfdHlwZSA9CisJCQlXTUlfUk9BTV9TQ0FOX0NIQU5fTElTVF9UWVBFX1NUQVRJQzsKKwl9IGVsc2UgeworCQkvKiB1bWFjIHN1cHBsaWVkIG9jY3VwaWVkIGNoYW5uZWwgbGlzdCBpbiBMRlIgKi8KKwkJY2hhbl9saXN0X2ZwLT5jaGFuX2xpc3RfdHlwZSA9CisJCQlXTUlfUk9BTV9TQ0FOX0NIQU5fTElTVF9UWVBFX0RZTkFNSUM7CisJfQorCisJYnVmX3B0ciArPSBzaXplb2Yod21pX3JvYW1fY2hhbl9saXN0X2ZpeGVkX3BhcmFtKTsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwKKwkJICAgICAgIChjaGFuX2xpc3RfZnAtPm51bV9jaGFuICogc2l6ZW9mKHVpbnQzMl90KSkpOworCXJvYW1fY2hhbl9saXN0X2FycmF5ID0gKEFfVUlOVDMyICopIChidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisJV01BX0xPR0koIiVzOiAlZCBjaGFubmVscyA9ICIsIF9fZnVuY19fLCBjaGFuX2xpc3RfZnAtPm51bV9jaGFuKTsKKwlmb3IgKGkgPSAwOyAoKGkgPCBjaGFuX2xpc3RfZnAtPm51bV9jaGFuKSAmJgorCQkgICAgIChpIDwgU0lSX1JPQU1fTUFYX0NIQU5ORUxTKSk7IGkrKykgeworCQlyb2FtX2NoYW5fbGlzdF9hcnJheVtpXSA9IGNkc19jaGFuX3RvX2ZyZXEoY2hhbl9saXN0W2ldKTsKKwkJV01BX0xPR0koIiVkLCIsIHJvYW1fY2hhbl9saXN0X2FycmF5W2ldKTsKKwl9CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCQkJICAgICAgbGVuLCBXTUlfUk9BTV9DSEFOX0xJU1QpOworCWlmIChzdGF0dXMgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCJ3bWlfdW5pZmllZF9jbWRfc2VuZCBXTUlfUk9BTV9DSEFOX0xJU1QgcmV0dXJuZWQgRXJyb3IgJWQiLAorCQkJc3RhdHVzKTsKKwkJY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIGVycm9yOworCX0KKworCVdNQV9MT0dJKCIlczogV01BIC0tPiBXTUlfUk9BTV9TQ0FOX0NIQU5fTElTVCIsIF9fZnVuY19fKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworZXJyb3I6CisJd21pX2J1Zl9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiBlX2Nzcl9hdXRoX3R5cGVfdG9fcnNuX2F1dGhtb2RlKCkgLSBtYXAgY3NyIGF1dGggdHlwZSB0byByc24gYXV0aG1vZGUKKyAqIEBhdXRodHlwZTogQ1NSIGF1dGh0eXBlCisgKiBAZW5jcjogQ1NSIEVuY3J5cHRpb24KKyAqCisgKiBNYXAgQ1NSJ3MgYXV0aGVudGljYXRpb24gdHlwZSBpbnRvIFJTTiBhdXRoIG1vZGUgdXNlZCBieSBmaXJtd2FyZQorICoKKyAqIFJldHVybjogV01JIFJTTiBhdXRoIG1vZGUKKyAqLworQV9VSU5UMzIgZV9jc3JfYXV0aF90eXBlX3RvX3Jzbl9hdXRobW9kZShlQ3NyQXV0aFR5cGUgYXV0aHR5cGUsCisJCQkJCSBlQ3NyRW5jcnlwdGlvblR5cGUgZW5jcikKK3sKKwlzd2l0Y2ggKGF1dGh0eXBlKSB7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTToKKwkJcmV0dXJuIFdNSV9BVVRIX09QRU47CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEE6CisJCXJldHVybiBXTUlfQVVUSF9XUEE7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLOgorCQlyZXR1cm4gV01JX0FVVEhfV1BBX1BTSzsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1JTTjoKKwkJcmV0dXJuIFdNSV9BVVRIX1JTTkE7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLOgorCQlyZXR1cm4gV01JX0FVVEhfUlNOQV9QU0s7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfRlRfUlNOOgorCQlyZXR1cm4gV01JX0FVVEhfRlRfUlNOQTsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX0ZUX1JTTl9QU0s6CisJCXJldHVybiBXTUlfQVVUSF9GVF9SU05BX1BTSzsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9DRVJUSUZJQ0FURToKKwkJcmV0dXJuIFdNSV9BVVRIX1dBUEk7CisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9QU0s6CisJCXJldHVybiBXTUlfQVVUSF9XQVBJX1BTSzsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0UKKwljYXNlIGVDU1JfQVVUSF9UWVBFX0NDS01fV1BBOgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU046CisJCXJldHVybiBXTUlfQVVUSF9DQ0tNOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0UgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLX1NIQTI1NjoKKwkJcmV0dXJuIFdNSV9BVVRIX1JTTkFfUFNLX1NIQTI1NjsKKwljYXNlIGVDU1JfQVVUSF9UWVBFX1JTTl84MDIxWF9TSEEyNTY6CisJCXJldHVybiBXTUlfQVVUSF9SU05BXzgwMjFYX1NIQTI1NjsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFXICovCisJY2FzZSBlQ1NSX0FVVEhfVFlQRV9OT05FOgorCWNhc2UgZUNTUl9BVVRIX1RZUEVfQVVUT1NXSVRDSDoKKwkJLyogSW4gY2FzZSBvZiBXRVAgYW5kIG90aGVyIGtleXMsIE5PTkUgbWVhbnMgT1BFTiBhdXRoICovCisJCWlmIChlbmNyID09IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWSB8fAorCQkgICAgZW5jciA9PSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZIHx8CisJCSAgICBlbmNyID09IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwIHx8CisJCSAgICBlbmNyID09IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNCB8fAorCQkgICAgZW5jciA9PSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQIHx8CisJCSAgICBlbmNyID09IGVDU1JfRU5DUllQVF9UWVBFX0FFUykgeworCQkJcmV0dXJuIFdNSV9BVVRIX09QRU47CisJCX0KKwkJcmV0dXJuIFdNSV9BVVRIX05PTkU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFdNSV9BVVRIX05PTkU7CisJfQorfQorCisvKioKKyAqIGVfY3NyX2VuY3J5cHRpb25fdHlwZV90b19yc25fY2lwaGVyc2V0KCkgLSBtYXAgY3NyIGVuYyB0eXBlIHRvIEVTTiBjaXBoZXIKKyAqIEBlbmNyOiBDU1IgRW5jcnlwdGlvbgorICoKKyAqIE1hcCBDU1IncyBlbmNyeXB0aW9uIHR5cGUgaW50byBSU04gY2lwaGVyIHR5cGVzIHVzZWQgYnkgZmlybXdhcmUKKyAqCisgKiBSZXR1cm46IFdNSSBSU04gY2lwaGVyCisgKi8KK0FfVUlOVDMyIGVfY3NyX2VuY3J5cHRpb25fdHlwZV90b19yc25fY2lwaGVyc2V0KGVDc3JFbmNyeXB0aW9uVHlwZSBlbmNyKQoreworCisJc3dpdGNoIChlbmNyKSB7CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk6CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA6CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ6CisJCXJldHVybiBXTUlfQ0lQSEVSX1dFUDsKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1RLSVA6CisJCXJldHVybiBXTUlfQ0lQSEVSX1RLSVA7CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM6CisJCXJldHVybiBXTUlfQ0lQSEVSX0FFU19DQ007CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwljYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dQSToKKwkJcmV0dXJuIFdNSV9DSVBIRVJfV0FQSTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCWNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQU5ZOgorCQlyZXR1cm4gV01JX0NJUEhFUl9BTlk7CisJY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOgorCWRlZmF1bHQ6CisJCXJldHVybiBXTUlfQ0lQSEVSX05PTkU7CisJfQorfQorCisvKioKKyAqIHdtYV9yb2FtX3NjYW5fZmlsbF9hcF9wcm9maWxlKCkgLSBmaWxsIGFwX3Byb2ZpbGUKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcE1hYzogTWFjIHB0cgorICogQHJvYW1fcmVxOiByb2FtIG9mZmxvYWQgc2NhbiByZXF1ZXN0CisgKiBAYXBfcHJvZmlsZV9wOiBhcCBwcm9maWxlCisgKgorICogRmlsbCBhcF9wcm9maWxlIHN0cnVjdHVyZSBmcm9tIGNvbmZpZ3VyZWQgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9yb2FtX3NjYW5fZmlsbF9hcF9wcm9maWxlKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICB0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgIHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgKnJvYW1fcmVxLAorCQkJCSAgIHdtaV9hcF9wcm9maWxlICphcF9wcm9maWxlX3ApCit7CisJY2RmX21lbV96ZXJvKGFwX3Byb2ZpbGVfcCwgc2l6ZW9mKHdtaV9hcF9wcm9maWxlKSk7CisJaWYgKHJvYW1fcmVxID09IE5VTEwpIHsKKwkJYXBfcHJvZmlsZV9wLT5zc2lkLnNzaWRfbGVuID0gMDsKKwkJYXBfcHJvZmlsZV9wLT5zc2lkLnNzaWRbMF0gPSAwOworCQlhcF9wcm9maWxlX3AtPnJzbl9hdXRobW9kZSA9IFdNSV9BVVRIX05PTkU7CisJCWFwX3Byb2ZpbGVfcC0+cnNuX3VjYXN0Y2lwaGVyc2V0ID0gV01JX0NJUEhFUl9OT05FOworCQlhcF9wcm9maWxlX3AtPnJzbl9tY2FzdGNpcGhlcnNldCA9IFdNSV9DSVBIRVJfTk9ORTsKKwkJYXBfcHJvZmlsZV9wLT5yc25fbWNhc3RtZ210Y2lwaGVyc2V0ID0gV01JX0NJUEhFUl9OT05FOworCQlhcF9wcm9maWxlX3AtPnJzc2lfdGhyZXNob2xkID0gV01BX1JPQU1fUlNTSV9ESUZGX0RFRkFVTFQ7CisJfSBlbHNlIHsKKwkJYXBfcHJvZmlsZV9wLT5zc2lkLnNzaWRfbGVuID0KKwkJCXJvYW1fcmVxLT5Db25uZWN0ZWROZXR3b3JrLnNzSWQubGVuZ3RoOworCQljZGZfbWVtX2NvcHkoYXBfcHJvZmlsZV9wLT5zc2lkLnNzaWQsCisJCQkgICAgIHJvYW1fcmVxLT5Db25uZWN0ZWROZXR3b3JrLnNzSWQuc3NJZCwKKwkJCSAgICAgYXBfcHJvZmlsZV9wLT5zc2lkLnNzaWRfbGVuKTsKKwkJYXBfcHJvZmlsZV9wLT5yc25fYXV0aG1vZGUgPQorCQkJZV9jc3JfYXV0aF90eXBlX3RvX3Jzbl9hdXRobW9kZShyb2FtX3JlcS0+Q29ubmVjdGVkTmV0d29yay5hdXRoZW50aWNhdGlvbiwKKwkJCQkJCQlyb2FtX3JlcS0+Q29ubmVjdGVkTmV0d29yay5lbmNyeXB0aW9uKTsKKwkJYXBfcHJvZmlsZV9wLT5yc25fdWNhc3RjaXBoZXJzZXQgPQorCQkJZV9jc3JfZW5jcnlwdGlvbl90eXBlX3RvX3Jzbl9jaXBoZXJzZXQocm9hbV9yZXEtPkNvbm5lY3RlZE5ldHdvcmsuZW5jcnlwdGlvbik7CisJCWFwX3Byb2ZpbGVfcC0+cnNuX21jYXN0Y2lwaGVyc2V0ID0KKwkJCWVfY3NyX2VuY3J5cHRpb25fdHlwZV90b19yc25fY2lwaGVyc2V0KHJvYW1fcmVxLT5Db25uZWN0ZWROZXR3b3JrLm1jZW5jcnlwdGlvbik7CisJCWFwX3Byb2ZpbGVfcC0+cnNuX21jYXN0bWdtdGNpcGhlcnNldCA9CisJCQlhcF9wcm9maWxlX3AtPnJzbl9tY2FzdGNpcGhlcnNldDsKKwkJYXBfcHJvZmlsZV9wLT5yc3NpX3RocmVzaG9sZCA9IHJvYW1fcmVxLT5Sb2FtUnNzaURpZmY7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworCQlpZiAocm9hbV9yZXEtPkNvbm5lY3RlZE5ldHdvcmsubWZwX2VuYWJsZWQpCisJCQlhcF9wcm9maWxlX3AtPmZsYWdzIHw9IFdNSV9BUF9QUk9GSUxFX0ZMQUdfUE1GOworI2VuZGlmCisJfQorfQorCisvKioKKyAqIHdtYV9yb2FtX3NjYW5fc2Nhbl9wYXJhbXMoKSAtIGZpbGwgcm9hbSBzY2FuIHBhcmFtcworICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBwTWFjOiBNYWMgcHRyCisgKiBAc2Nhbl9wYXJhbXM6IHNjYW4gcGFyYW1ldGVycworICogQHJvYW1fcmVxOiBOVUxMIGlmIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgYmVmb3JlIGNvbm5lY3QKKyAqICAgICAgICAgICAgSXQgd2lsbCBiZSBub24tTlVMTCBpZiBjYWxsZWQgYWZ0ZXIgYXNzb2MuCisgKgorICogRmlsbCBzY2FuX3BhcmFtcyBzdHJ1Y3R1cmUgZnJvbSBjb25maWd1cmVkIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfcm9hbV9zY2FuX2ZpbGxfc2Nhbl9wYXJhbXModHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICB0cEFuaVNpckdsb2JhbCBwTWFjLAorCQkJCSAgICB0U2lyUm9hbU9mZmxvYWRTY2FuUmVxICpyb2FtX3JlcSwKKwkJCQkgICAgd21pX3N0YXJ0X3NjYW5fY21kX2ZpeGVkX3BhcmFtICoKKwkJCQkgICAgc2Nhbl9wYXJhbXMpCit7CisJdWludDhfdCBjaGFubmVsc19wZXJfYnVyc3QgPSAwOworCXVpbnQzMl90IHZhbCA9IDA7CisKKwlpZiAoTlVMTCA9PSBwTWFjKSB7CisJCVdNQV9MT0dFKCIlczogcE1hYyBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJY2RmX21lbV96ZXJvKHNjYW5fcGFyYW1zLCBzaXplb2Yod21pX3N0YXJ0X3NjYW5fY21kX2ZpeGVkX3BhcmFtKSk7CisJc2Nhbl9wYXJhbXMtPnNjYW5fY3RybF9mbGFncyA9IFdNSV9TQ0FOX0FERF9DQ0tfUkFURVMgfAorCQkJCSAgICAgICBXTUlfU0NBTl9BRERfT0ZETV9SQVRFUzsKKwlpZiAocm9hbV9yZXEgIT0gTlVMTCkgeworCQkvKiBQYXJhbWV0ZXJzIHVwZGF0ZWQgYWZ0ZXIgYXNzb2NpYXRpb24gaXMgY29tcGxldGUgKi8KKwkJV01BX0xPR0koIiVzOiBJbnB1dCBwYXJhbWV0ZXJzOiBOZWlnaGJvclNjYW5DaGFubmVsTWluVGltZSIKKwkJCSAiID0gJWQsIE5laWdoYm9yU2NhbkNoYW5uZWxNYXhUaW1lID0gJWQiLAorCQkJIF9fZnVuY19fLAorCQkJIHJvYW1fcmVxLT5OZWlnaGJvclNjYW5DaGFubmVsTWluVGltZSwKKwkJCSByb2FtX3JlcS0+TmVpZ2hib3JTY2FuQ2hhbm5lbE1heFRpbWUpOworCQlXTUFfTE9HSSgiJXM6IElucHV0IHBhcmFtZXRlcnM6IE5laWdoYm9yU2NhblRpbWVyUGVyaW9kID0iCisJCQkgIiAlZCwgSG9tZUF3YXlUaW1lID0gJWQsIG5Qcm9iZXMgPSAlZCIsCisJCQkgX19mdW5jX18sCisJCQkgcm9hbV9yZXEtPk5laWdoYm9yU2NhblRpbWVyUGVyaW9kLAorCQkJIHJvYW1fcmVxLT5Ib21lQXdheVRpbWUsIHJvYW1fcmVxLT5uUHJvYmVzKTsKKworCQkvKgorCQkgKiByb2FtX3JlcS0+TmVpZ2hib3JTY2FuQ2hhbm5lbE1heFRpbWUgPSBTQ0FOX0NIQU5ORUxfVElNRQorCQkgKiByb2FtX3JlcS0+SG9tZUF3YXlUaW1lICAgICAgICAgICAgICAgPSBTQ0FOX0hPTUVfQVdBWV9USU1FCisJCSAqIHJvYW1fcmVxLT5OZWlnaGJvclNjYW5UaW1lclBlcmlvZCAgICA9IFNDQU5fSE9NRV9USU1FCisJCSAqCisJCSAqIHNjYW5fcGFyYW1zLT5kd2VsbF90aW1lX2FjdGl2ZSAgPSB0aW1lIHN0YXRpb24gc3RheXMgb24gY2hhbm5lbAorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbmRzIHByb2JlczsKKwkJICogc2Nhbl9wYXJhbXMtPmR3ZWxsX3RpbWVfcGFzc2l2ZSA9IHRpbWUgc3RhdGlvbiBzdGF5cyBvbiBjaGFubmVsCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbGlzdGVucyBwcm9iZXM7CisJCSAqIHNjYW5fcGFyYW1zLT5idXJzdF9kdXJhdGlvbiAgICAgPSB0aW1lIHN0YXRpb24gZ29lcyBvZmYgY2hhbm5lbAorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2NhbjsKKwkJICovCisKKwkJaWYgKHdsYW5fY2ZnX2dldF9pbnQKKwkJCSAgICAocE1hYywgV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FLAorCQkJICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQkJLyoKKwkJCSAqIENvdWxkIG5vdCBnZXQgbWF4IGNoYW5uZWwgdmFsdWUgZnJvbSBDRkcuIExvZyBlcnJvci4KKwkJCSAqLworCQkJV01BX0xPR0UKKwkJCQkoImNvdWxkIG5vdCByZXRyaWV2ZSBwYXNzaXZlIG1heCBjaGFubmVsIHZhbHVlIik7CisKKwkJCS8qIHVzZSBhIGRlZmF1bHQgdmFsdWUgb2YgMTEwbXMgKi8KKwkJCXZhbCA9IFdNQV9ST0FNX0RXRUxMX1RJTUVfUEFTU0lWRV9ERUZBVUxUOworCQl9CisKKwkJc2Nhbl9wYXJhbXMtPmR3ZWxsX3RpbWVfcGFzc2l2ZSA9IHZhbDsKKwkJLyoKKwkJICogSGVyZSBpcyB0aGUgZm9ybXVsYSwKKwkJICogVChIb21lQXdheSkgPSBOICogVChkd2VsbCkgKyAoTisxKSAqIFQoY3MpCisJCSAqIHdoZXJlIE4gaXMgbnVtYmVyIG9mIGNoYW5uZWxzIHNjYW5uZWQgaW4gc2luZ2xlIGJ1cnN0CisJCSAqLworCQlzY2FuX3BhcmFtcy0+ZHdlbGxfdGltZV9hY3RpdmUgPQorCQkJcm9hbV9yZXEtPk5laWdoYm9yU2NhbkNoYW5uZWxNYXhUaW1lOworCQlpZiAocm9hbV9yZXEtPkhvbWVBd2F5VGltZSA8CisJCSAgICAyICogV01BX1JPQU1fU0NBTl9DSEFOTkVMX1NXSVRDSF9USU1FKSB7CisJCQkvKiBjbGVhcmx5IHdlIGNhbid0IGZvbGxvdyBob21lIGF3YXkgdGltZS4KKwkJCSAqIE1ha2UgaXQgYSBzcGxpdCBzY2FuLgorCQkJICovCisJCQlzY2FuX3BhcmFtcy0+YnVyc3RfZHVyYXRpb24gPSAwOworCQl9IGVsc2UgeworCQkJY2hhbm5lbHNfcGVyX2J1cnN0ID0KKwkJCQkocm9hbV9yZXEtPkhvbWVBd2F5VGltZSAtCisJCQkJIFdNQV9ST0FNX1NDQU5fQ0hBTk5FTF9TV0lUQ0hfVElNRSkKKwkJCQkvIChzY2FuX3BhcmFtcy0+ZHdlbGxfdGltZV9hY3RpdmUgKworCQkJCSAgIFdNQV9ST0FNX1NDQU5fQ0hBTk5FTF9TV0lUQ0hfVElNRSk7CisKKwkJCWlmIChjaGFubmVsc19wZXJfYnVyc3QgPCAxKSB7CisJCQkJLyogZHdlbGwgdGltZSBhbmQgaG9tZSBhd2F5IHRpbWUgY29uZmxpY3RzICovCisJCQkJLyogd2Ugd2lsbCBvdmVycmlkZSBkd2VsbCB0aW1lICovCisJCQkJc2Nhbl9wYXJhbXMtPmR3ZWxsX3RpbWVfYWN0aXZlID0KKwkJCQkJcm9hbV9yZXEtPkhvbWVBd2F5VGltZSAtCisJCQkJCTIgKiBXTUFfUk9BTV9TQ0FOX0NIQU5ORUxfU1dJVENIX1RJTUU7CisJCQkJc2Nhbl9wYXJhbXMtPmJ1cnN0X2R1cmF0aW9uID0KKwkJCQkJc2Nhbl9wYXJhbXMtPmR3ZWxsX3RpbWVfYWN0aXZlOworCQkJfSBlbHNlIHsKKwkJCQlzY2FuX3BhcmFtcy0+YnVyc3RfZHVyYXRpb24gPQorCQkJCQljaGFubmVsc19wZXJfYnVyc3QgKgorCQkJCQlzY2FuX3BhcmFtcy0+ZHdlbGxfdGltZV9hY3RpdmU7CisJCQl9CisJCX0KKwkJaWYgKHJvYW1fcmVxLT5hbGxvd0RGU0NoYW5uZWxSb2FtID09CisJCSAgICBTSVJfUk9BTUlOR19ERlNfQ0hBTk5FTF9FTkFCTEVEX05PUk1BTAorCQkgICAgJiYgcm9hbV9yZXEtPkhvbWVBd2F5VGltZSA+IDAKKwkJICAgICYmIHJvYW1fcmVxLT5DaGFubmVsQ2FjaGVUeXBlICE9IENIQU5ORUxfTElTVF9TVEFUSUMpIHsKKwkJCS8qIFJvYW1pbmcgb24gREZTIGNoYW5uZWxzIGlzIHN1cHBvcnRlZCBhbmQgaXQgaXMgbm90CisJCQkgKiBhcHAgY2hhbm5lbCBsaXN0LiBJdCBpcyBvayB0byBvdmVycmlkZSBob21lQXdheVRpbWUKKwkJCSAqIHRvIGFjY29tb2RhdGUgREZTIGR3ZWxsIHRpbWUgaW4gYnVyc3QKKwkJCSAqIGR1cmF0aW9uLgorCQkJICovCisJCQlzY2FuX3BhcmFtcy0+YnVyc3RfZHVyYXRpb24gPQorCQkJCUNERl9NQVgoc2Nhbl9wYXJhbXMtPmJ1cnN0X2R1cmF0aW9uLAorCQkJCQlzY2FuX3BhcmFtcy0+ZHdlbGxfdGltZV9wYXNzaXZlKTsKKwkJfQorCQlzY2FuX3BhcmFtcy0+bWluX3Jlc3RfdGltZSA9IHJvYW1fcmVxLT5OZWlnaGJvclNjYW5UaW1lclBlcmlvZDsKKwkJc2Nhbl9wYXJhbXMtPm1heF9yZXN0X3RpbWUgPSByb2FtX3JlcS0+TmVpZ2hib3JTY2FuVGltZXJQZXJpb2Q7CisJCXNjYW5fcGFyYW1zLT5yZXBlYXRfcHJvYmVfdGltZSA9IChyb2FtX3JlcS0+blByb2JlcyA+IDApID8KKwkJCQkJCSBDREZfTUFYKHNjYW5fcGFyYW1zLT5kd2VsbF90aW1lX2FjdGl2ZSAvIHJvYW1fcmVxLT5uUHJvYmVzLAorCQkJCQkJCSAxKSA6IDA7CisJCXNjYW5fcGFyYW1zLT5wcm9iZV9zcGFjaW5nX3RpbWUgPSAwOworCQlzY2FuX3BhcmFtcy0+cHJvYmVfZGVsYXkgPSAwOworCQkvKiAzMCBzZWNvbmRzIGZvciBmdWxsIHNjYW4gY3ljbGUgKi8KKwkJc2Nhbl9wYXJhbXMtPm1heF9zY2FuX3RpbWUgPSBXTUFfSFdfREVGX1NDQU5fTUFYX0RVUkFUSU9OOworCQlzY2FuX3BhcmFtcy0+aWRsZV90aW1lID0gc2Nhbl9wYXJhbXMtPm1pbl9yZXN0X3RpbWU7CisJCXNjYW5fcGFyYW1zLT5uX3Byb2JlcyA9IHJvYW1fcmVxLT5uUHJvYmVzOworCQlpZiAocm9hbV9yZXEtPmFsbG93REZTQ2hhbm5lbFJvYW0gPT0KKwkJICAgIFNJUl9ST0FNSU5HX0RGU19DSEFOTkVMX0RJU0FCTEVEKSB7CisJCQlzY2FuX3BhcmFtcy0+c2Nhbl9jdHJsX2ZsYWdzIHw9IFdNSV9TQ0FOX0JZUEFTU19ERlNfQ0hOOworCQl9IGVsc2UgeworCQkJLyogUm9hbWluZyBzY2FuIG9uIERGUyBjaGFubmVsIGlzIGFsbG93ZWQuCisJCQkgKiBObyBuZWVkIHRvIGNoYW5nZSBhbnkgZmxhZ3MgZm9yIGRlZmF1bHQKKwkJCSAqIGFsbG93REZTQ2hhbm5lbFJvYW0gPSAxLgorCQkJICogU3BlY2lhbCBjYXNlIHdoZXJlIHN0YXRpYyBjaGFubmVsIGxpc3QgaXMgZ2l2ZW4gYnlcCisJCQkgKiBhcHBsaWNhdGlvbiB0aGF0IGNvbnRhaW5zIERGUyBjaGFubmVscy4KKwkJCSAqIEFzc3VtZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBoYXMga25vd2xlZGdlIG9mIG1hdGNoaW5nCisJCQkgKiBBUHMgYmVpbmcgYWN0aXZlIGFuZCB0aGF0IHByb2JlIHJlcXVlc3QgdHJhbnNtaXNzaW9uCisJCQkgKiBpcyBwZXJtaXR0ZWQgb24gdGhvc2UgY2hhbm5lbC4KKwkJCSAqIEZvcmNlIGFjdGl2ZSBzY2FucyBvbiB0aG9zZSBjaGFubmVscy4KKwkJCSAqLworCisJCQlpZiAocm9hbV9yZXEtPmFsbG93REZTQ2hhbm5lbFJvYW0gPT0KKwkJCSAgICBTSVJfUk9BTUlOR19ERlNfQ0hBTk5FTF9FTkFCTEVEX0FDVElWRSAmJgorCQkJICAgIHJvYW1fcmVxLT5DaGFubmVsQ2FjaGVUeXBlID09IENIQU5ORUxfTElTVF9TVEFUSUMgJiYKKwkJCSAgICByb2FtX3JlcS0+Q29ubmVjdGVkTmV0d29yay5DaGFubmVsQ291bnQgPiAwKSB7CisJCQkJc2Nhbl9wYXJhbXMtPnNjYW5fY3RybF9mbGFncyB8PQorCQkJCQlXTUlfU0NBTl9GTEFHX0ZPUkNFX0FDVElWRV9PTl9ERlM7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiByb2FtX3JlcSA9IE5VTEwgZHVyaW5nIGluaXRpYWwgb3IgcHJlLWFzc29jIGludm9jYXRpb24gKi8KKwkJc2Nhbl9wYXJhbXMtPmR3ZWxsX3RpbWVfYWN0aXZlID0KKwkJCVdNQV9ST0FNX0RXRUxMX1RJTUVfQUNUSVZFX0RFRkFVTFQ7CisJCXNjYW5fcGFyYW1zLT5kd2VsbF90aW1lX3Bhc3NpdmUgPQorCQkJV01BX1JPQU1fRFdFTExfVElNRV9QQVNTSVZFX0RFRkFVTFQ7CisJCXNjYW5fcGFyYW1zLT5taW5fcmVzdF90aW1lID0gV01BX1JPQU1fTUlOX1JFU1RfVElNRV9ERUZBVUxUOworCQlzY2FuX3BhcmFtcy0+bWF4X3Jlc3RfdGltZSA9IFdNQV9ST0FNX01BWF9SRVNUX1RJTUVfREVGQVVMVDsKKwkJc2Nhbl9wYXJhbXMtPnJlcGVhdF9wcm9iZV90aW1lID0gMDsKKwkJc2Nhbl9wYXJhbXMtPnByb2JlX3NwYWNpbmdfdGltZSA9IDA7CisJCXNjYW5fcGFyYW1zLT5wcm9iZV9kZWxheSA9IDA7CisJCXNjYW5fcGFyYW1zLT5tYXhfc2Nhbl90aW1lID0gV01BX0hXX0RFRl9TQ0FOX01BWF9EVVJBVElPTjsKKwkJc2Nhbl9wYXJhbXMtPmlkbGVfdGltZSA9IHNjYW5fcGFyYW1zLT5taW5fcmVzdF90aW1lOworCQlzY2FuX3BhcmFtcy0+YnVyc3RfZHVyYXRpb24gPSAwOworCQlzY2FuX3BhcmFtcy0+bl9wcm9iZXMgPSAwOworCX0KKworCVdNQV9MT0dJKCIlczogUm9tZSByb2FtIHNjYW4gcGFyYW1ldGVyczoiCisJCSAiIGR3ZWxsX3RpbWVfYWN0aXZlID0gJWQsIGR3ZWxsX3RpbWVfcGFzc2l2ZSA9ICVkIiwKKwkJIF9fZnVuY19fLAorCQkgc2Nhbl9wYXJhbXMtPmR3ZWxsX3RpbWVfYWN0aXZlLAorCQkgc2Nhbl9wYXJhbXMtPmR3ZWxsX3RpbWVfcGFzc2l2ZSk7CisJV01BX0xPR0koIiVzOiBtaW5fcmVzdF90aW1lID0gJWQsIG1heF9yZXN0X3RpbWUgPSAlZCwiCisJCSAiIHJlcGVhdF9wcm9iZV90aW1lID0gJWQgbl9wcm9iZXMgPSAlZCIsCisJCSBfX2Z1bmNfXywKKwkJIHNjYW5fcGFyYW1zLT5taW5fcmVzdF90aW1lLAorCQkgc2Nhbl9wYXJhbXMtPm1heF9yZXN0X3RpbWUsCisJCSBzY2FuX3BhcmFtcy0+cmVwZWF0X3Byb2JlX3RpbWUsIHNjYW5fcGFyYW1zLT5uX3Byb2Jlcyk7CisJV01BX0xPR0koIiVzOiBtYXhfc2Nhbl90aW1lID0gJWQsIGlkbGVfdGltZSA9ICVkLCIKKwkJICIgYnVyc3RfZHVyYXRpb24gPSAlZCwgc2Nhbl9jdHJsX2ZsYWdzID0gMHgleCIsCisJCSBfX2Z1bmNfXywKKwkJIHNjYW5fcGFyYW1zLT5tYXhfc2Nhbl90aW1lLAorCQkgc2Nhbl9wYXJhbXMtPmlkbGVfdGltZSwKKwkJIHNjYW5fcGFyYW1zLT5idXJzdF9kdXJhdGlvbiwgc2Nhbl9wYXJhbXMtPnNjYW5fY3RybF9mbGFncyk7Cit9CisKKy8qKgorICogd21hX3JvYW1fc2Nhbl9vZmZsb2FkX2FwX3Byb2ZpbGUoKSAtIHNldCByb2FtIGFwIHByb2ZpbGUgaW4gZncKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAYXBfcHJvZmlsZV9wOiBhcCBwcm9maWxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICoKKyAqIFNlbmQgV01JX1JPQU1fQVBfUFJPRklMRSB0byBmaXJtd2FyZQorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9hcF9wcm9maWxlKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJICAgIHdtaV9hcF9wcm9maWxlICphcF9wcm9maWxlX3AsCisJCQkJCSAgICB1aW50MzJfdCB2ZGV2X2lkKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl3bWlfYnVmX3QgYnVmID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgbGVuOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX3JvYW1fYXBfcHJvZmlsZV9maXhlZF9wYXJhbSAqcm9hbV9hcF9wcm9maWxlX2ZwOworCisJbGVuID0gc2l6ZW9mKHdtaV9yb2FtX2FwX3Byb2ZpbGVfZml4ZWRfcGFyYW0pICsgc2l6ZW9mKHdtaV9hcF9wcm9maWxlKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXMgOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJcm9hbV9hcF9wcm9maWxlX2ZwID0gKHdtaV9yb2FtX2FwX3Byb2ZpbGVfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmcm9hbV9hcF9wcm9maWxlX2ZwLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9hcF9wcm9maWxlX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9yb2FtX2FwX3Byb2ZpbGVfZml4ZWRfcGFyYW0pKTsKKwkvKiBmaWxsIGluIHRocmVzaG9sZCB2YWx1ZXMgKi8KKwlyb2FtX2FwX3Byb2ZpbGVfZnAtPnZkZXZfaWQgPSB2ZGV2X2lkOworCXJvYW1fYXBfcHJvZmlsZV9mcC0+aWQgPSAwOworCWJ1Zl9wdHIgKz0gc2l6ZW9mKHdtaV9yb2FtX2FwX3Byb2ZpbGVfZml4ZWRfcGFyYW0pOworCisJY2RmX21lbV9jb3B5KGJ1Zl9wdHIsIGFwX3Byb2ZpbGVfcCwgc2l6ZW9mKHdtaV9hcF9wcm9maWxlKSk7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2FwX3Byb2ZpbGUsCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX2FwX3Byb2ZpbGUpKTsKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCQkJICAgICAgbGVuLCBXTUlfUk9BTV9BUF9QUk9GSUxFKTsKKwlpZiAoc3RhdHVzICE9IEVPSykgeworCQlXTUFfTE9HRSgid21pX3VuaWZpZWRfY21kX3NlbmQgV01JX1JPQU1fQVBfUFJPRklMRSByZXR1cm5lZCBFcnJvciAlZCIsCisJCQlzdGF0dXMpOworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCWdvdG8gZXJyb3I7CisJfQorCisJV01BX0xPR0koIldNQSAtLT4gV01JX1JPQU1fQVBfUFJPRklMRSBhbmQgb3RoZXIgcGFyYW1ldGVycyIpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CitlcnJvcjoKKwl3bWlfYnVmX2ZyZWUoYnVmKTsKKworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9yb2FtX3NjYW5fZmlsdGVyKCkgLSBGaWx0ZXIgdG8gYmUgYXBwbGllZCB3aGlsZSByb2FtaW5nCisgKiBAd21hX2hhbmRsZTogICAgIEdsb2JhbCBXTUEgSGFuZGxlCisgKiBAcm9hbV9yZXE6ICAgICAgIFJlcXVlc3Qgd2hpY2ggY29udGFpbnMgdGhlIGZpbHRlcnMKKyAqCisgKiBUaGVyZSBhcmUgZmlsdGVycyBzdWNoIGFzIHdoaXRlbGlzdCwgYmxhY2tsaXN0IGFuZCBwcmVmZXJyZWQKKyAqIGxpc3QgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNjYW4gcmVzdWx0cyB0byBmb3JtIHRoZQorICogcHJvYmFibGUgY2FuZGlkYXRlcyBmb3Igcm9hbWluZy4KKyAqCisgKiBSZXR1cm46IFJldHVybiBzdWNjZXNzIHVwb24gc3VjY2VzZnVsbHkgcGFzc2luZyB0aGUKKyAqICAgICAgICAgcGFyYW1ldGVycyB0byB0aGUgZmlybXdhcmUsIG90aGVyd2lzZSBmYWlsdXJlLgorICovCitDREZfU1RBVFVTIHdtYV9yb2FtX3NjYW5fZmlsdGVyKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwl0U2lyUm9hbU9mZmxvYWRTY2FuUmVxICpyb2FtX3JlcSkKK3sKKwl3bWlfYnVmX3QgYnVmID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMCwgaTsKKwl1aW50MzJfdCBsZW4sIG51bV9ic3NpZF9ibGFja19saXN0ID0gMCwgbnVtX3NzaWRfd2hpdGVfbGlzdCA9IDAsCisJICAgbnVtX2Jzc2lkX3ByZWZlcnJlZF9saXN0ID0gMDsKKwl1aW50MzJfdCBvcF9iaXRtYXAgPSAwOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJd21pX3JvYW1fZmlsdGVyX2ZpeGVkX3BhcmFtICpyb2FtX2ZpbHRlcjsKKwl1aW50OF90ICpic3NpZF9zcmNfcHRyID0gTlVMTDsKKwl3bWlfbWFjX2FkZHIgKmJzc2lkX2RzdF9wdHIgPSBOVUxMOworCXdtaV9zc2lkICpzc2lkX3B0ciA9IE5VTEw7CisJdWludDMyX3QgKmJzc2lkX3ByZWZlcnJlZF9mYWN0b3JfcHRyID0gTlVMTDsKKwlzdHJ1Y3Qgcm9hbV9leHRfcGFyYW1zICpyb2FtX3BhcmFtczsKKworCXJvYW1fcGFyYW1zID0gJnJvYW1fcmVxLT5yb2FtX3BhcmFtczsKKwlsZW4gPSBzaXplb2Yod21pX3JvYW1fZmlsdGVyX2ZpeGVkX3BhcmFtKTsKKwlsZW4gKz0gV01JX1RMVl9IRFJfU0laRTsKKwlpZiAocm9hbV9yZXEtPkNvbW1hbmQgIT0gUk9BTV9TQ0FOX09GRkxPQURfU1RPUCkgeworCQlzd2l0Y2ggKHJvYW1fcmVxLT5yZWFzb24pIHsKKwkJY2FzZSBSRUFTT05fUk9BTV9TRVRfQkxBQ0tMSVNUX0JTU0lEOgorCQkJb3BfYml0bWFwIHw9IDB4MTsKKwkJCW51bV9ic3NpZF9ibGFja19saXN0ID0KKwkJCQlyb2FtX3BhcmFtcy0+bnVtX2Jzc2lkX2F2b2lkX2xpc3Q7CisJCQlsZW4gKz0gbnVtX2Jzc2lkX2JsYWNrX2xpc3QgKiBzaXplb2Yod21pX21hY19hZGRyKTsKKwkJCWxlbiArPSBXTUlfVExWX0hEUl9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVBU09OX1JPQU1fU0VUX1NTSURfQUxMT1dFRDoKKwkJCW9wX2JpdG1hcCB8PSAweDI7CisJCQludW1fc3NpZF93aGl0ZV9saXN0ID0KKwkJCQlyb2FtX3BhcmFtcy0+bnVtX3NzaWRfYWxsb3dlZF9saXN0OworCQkJbGVuICs9IG51bV9zc2lkX3doaXRlX2xpc3QgKiBzaXplb2Yod21pX3NzaWQpOworCQkJbGVuICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCQlicmVhazsKKwkJY2FzZSBSRUFTT05fUk9BTV9TRVRfRkFWT1JFRF9CU1NJRDoKKwkJCW9wX2JpdG1hcCB8PSAweDQ7CisJCQludW1fYnNzaWRfcHJlZmVycmVkX2xpc3QgPQorCQkJCXJvYW1fcGFyYW1zLT5udW1fYnNzaWRfZmF2b3JlZDsKKwkJCWxlbiArPSBudW1fYnNzaWRfcHJlZmVycmVkX2xpc3QgKiBzaXplb2Yod21pX21hY19hZGRyKTsKKwkJCWxlbiArPSBXTUlfVExWX0hEUl9TSVpFOworCQkJbGVuICs9IG51bV9ic3NpZF9wcmVmZXJyZWRfbGlzdCAqIHNpemVvZihBX1VJTlQzMik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdNQV9MT0dEKCIlcyA6IFJvYW0gRmlsdGVyIG5lZWQgbm90IGJlIHNlbnQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJbiBjYXNlIG9mIFNUT1AgY29tbWFuZCwgcmVzZXQgYWxsIHRoZSB2YXJpYWJsZXMKKwkJICogZXhjZXB0IGZvciBibGFja2xpc3QgQlNTSUQgd2hpY2ggc2hvdWxkIGJlIHJldGFpbmVkCisJCSAqIGFjcm9zcyBjb25uZWN0aW9ucy4qLworCQlvcF9iaXRtYXAgPSAweDIgfCAweDQ7CisJCW51bV9zc2lkX3doaXRlX2xpc3QgPSByb2FtX3BhcmFtcy0+bnVtX3NzaWRfYWxsb3dlZF9saXN0OworCQlsZW4gKz0gbnVtX3NzaWRfd2hpdGVfbGlzdCAqIHNpemVvZih3bWlfc3NpZCk7CisJCW51bV9ic3NpZF9wcmVmZXJyZWRfbGlzdCA9IHJvYW1fcGFyYW1zLT5udW1fYnNzaWRfZmF2b3JlZDsKKwkJbGVuICs9IG51bV9ic3NpZF9wcmVmZXJyZWRfbGlzdCAqIHNpemVvZih3bWlfbWFjX2FkZHIpOworCQlsZW4gKz0gbnVtX2Jzc2lkX3ByZWZlcnJlZF9saXN0ICogc2l6ZW9mKEFfVUlOVDMyKTsKKwkJbGVuICs9ICgyICogV01JX1RMVl9IRFJfU0laRSk7CisJfQorCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXMgOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVfaW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCXJvYW1fZmlsdGVyID0gKHdtaV9yb2FtX2ZpbHRlcl9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZyb2FtX2ZpbHRlci0+dGx2X2hlYWRlciwKKwkJV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9maWx0ZXJfZml4ZWRfcGFyYW0sCisJCVdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfcm9hbV9maWx0ZXJfZml4ZWRfcGFyYW0pKTsKKwkvKiBmaWxsIGluIGZpeGVkIHZhbHVlcyAqLworCXJvYW1fZmlsdGVyLT52ZGV2X2lkID0gcm9hbV9yZXEtPnNlc3Npb25JZDsKKwlyb2FtX2ZpbHRlci0+ZmxhZ3MgPSAwOworCXJvYW1fZmlsdGVyLT5vcF9iaXRtYXAgPSBvcF9iaXRtYXA7CisJcm9hbV9maWx0ZXItPm51bV9ic3NpZF9ibGFja19saXN0ID0gbnVtX2Jzc2lkX2JsYWNrX2xpc3Q7CisJcm9hbV9maWx0ZXItPm51bV9zc2lkX3doaXRlX2xpc3QgPSBudW1fc3NpZF93aGl0ZV9saXN0OworCXJvYW1fZmlsdGVyLT5udW1fYnNzaWRfcHJlZmVycmVkX2xpc3QgPSBudW1fYnNzaWRfcHJlZmVycmVkX2xpc3Q7CisJYnVmX3B0ciArPSBzaXplb2Yod21pX3JvYW1fZmlsdGVyX2ZpeGVkX3BhcmFtKTsKKworCVdNSVRMVl9TRVRfSERSKChidWZfcHRyKSwKKwkJV01JVExWX1RBR19BUlJBWV9GSVhFRF9TVFJVQywKKwkJKG51bV9ic3NpZF9ibGFja19saXN0ICogc2l6ZW9mKHdtaV9tYWNfYWRkcikpKTsKKwlic3NpZF9zcmNfcHRyID0gKHVpbnQ4X3QgKikmcm9hbV9wYXJhbXMtPmJzc2lkX2F2b2lkX2xpc3Q7CisJYnNzaWRfZHN0X3B0ciA9ICh3bWlfbWFjX2FkZHIgKikoYnVmX3B0ciArIFdNSV9UTFZfSERSX1NJWkUpOworCWZvciAoaSA9IDA7IGkgPCBudW1fYnNzaWRfYmxhY2tfbGlzdDsgaSsrKSB7CisJCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKGJzc2lkX3NyY19wdHIsIGJzc2lkX2RzdF9wdHIpOworCQlic3NpZF9zcmNfcHRyICs9IEFUSF9NQUNfTEVOOworCQlic3NpZF9kc3RfcHRyKys7CisJfQorCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRSArCisJCShudW1fYnNzaWRfYmxhY2tfbGlzdCAqIHNpemVvZih3bWlfbWFjX2FkZHIpKTsKKwlXTUlUTFZfU0VUX0hEUigoYnVmX3B0ciksCisJCVdNSVRMVl9UQUdfQVJSQVlfRklYRURfU1RSVUMsCisJCShudW1fc3NpZF93aGl0ZV9saXN0ICogc2l6ZW9mKHdtaV9zc2lkKSkpOworCXNzaWRfcHRyID0gKHdtaV9zc2lkICopKGJ1Zl9wdHIgKyBXTUlfVExWX0hEUl9TSVpFKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3NzaWRfd2hpdGVfbGlzdDsgaSsrKSB7CisJCW1lbWNweSgmc3NpZF9wdHItPnNzaWQsICZyb2FtX3BhcmFtcy0+c3NpZF9hbGxvd2VkX2xpc3RbaV0uc3NJZCwKKwkJCXJvYW1fcGFyYW1zLT5zc2lkX2FsbG93ZWRfbGlzdFtpXS5sZW5ndGgpOworCQlzc2lkX3B0ci0+c3NpZF9sZW4gPSByb2FtX3BhcmFtcy0+c3NpZF9hbGxvd2VkX2xpc3RbaV0ubGVuZ3RoOworCQlXTUFfTE9HRCgiJXM6IFNTSUQgbGVuZ3RoPSVkIiwgX19mdW5jX18sIHNzaWRfcHRyLT5zc2lkX2xlbik7CisJCUNERl9UUkFDRV9IRVhfRFVNUChDREZfTU9EVUxFX0lEX1dNQSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCSh1aW50OF90ICopc3NpZF9wdHItPnNzaWQsCisJCQkJc3NpZF9wdHItPnNzaWRfbGVuKTsKKwkJc3NpZF9wdHIrKzsKKwl9CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFICsgKG51bV9zc2lkX3doaXRlX2xpc3QgKiBzaXplb2Yod21pX3NzaWQpKTsKKwlXTUlUTFZfU0VUX0hEUigoYnVmX3B0ciksCisJCVdNSVRMVl9UQUdfQVJSQVlfRklYRURfU1RSVUMsCisJCShudW1fYnNzaWRfcHJlZmVycmVkX2xpc3QgKiBzaXplb2Yod21pX21hY19hZGRyKSkpOworCWJzc2lkX3NyY19wdHIgPSAodWludDhfdCAqKSZyb2FtX3BhcmFtcy0+YnNzaWRfZmF2b3JlZDsKKwlic3NpZF9kc3RfcHRyID0gKHdtaV9tYWNfYWRkciAqKShidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9ic3NpZF9wcmVmZXJyZWRfbGlzdDsgaSsrKSB7CisJCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKGJzc2lkX3NyY19wdHIsCisJCQkJKHdtaV9tYWNfYWRkciAqKWJzc2lkX2RzdF9wdHIpOworCQlic3NpZF9zcmNfcHRyICs9IEFUSF9NQUNfTEVOOworCQlic3NpZF9kc3RfcHRyKys7CisJfQorCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRSArCisJCShudW1fYnNzaWRfcHJlZmVycmVkX2xpc3QgKiBzaXplb2Yod21pX21hY19hZGRyKSk7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9VSU5UMzIsCisJCQkobnVtX2Jzc2lkX3ByZWZlcnJlZF9saXN0ICogc2l6ZW9mKHVpbnQzMl90KSkpOworCWJzc2lkX3ByZWZlcnJlZF9mYWN0b3JfcHRyID0gKHVpbnQzMl90ICopKGJ1Zl9wdHIgKyBXTUlfVExWX0hEUl9TSVpFKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jzc2lkX3ByZWZlcnJlZF9saXN0OyBpKyspIHsKKwkJKmJzc2lkX3ByZWZlcnJlZF9mYWN0b3JfcHRyID0KKwkJCXJvYW1fcGFyYW1zLT5ic3NpZF9mYXZvcmVkX2ZhY3RvcltpXTsKKwkJYnNzaWRfcHJlZmVycmVkX2ZhY3Rvcl9wdHIrKzsKKwl9CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFICsKKwkJKG51bV9ic3NpZF9wcmVmZXJyZWRfbGlzdCAqIHNpemVvZih1aW50MzJfdCkpOworCXN0YXR1cyA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJbGVuLCBXTUlfUk9BTV9GSUxURVJfQ01ESUQpOworCWlmIChzdGF0dXMgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCJjbWQgV01JX1JPQU1fRklMVEVSX0NNRElEIHJldHVybmVkIEVycm9yICVkIiwKKwkJCQlzdGF0dXMpOworCQlnb3RvIGVycm9yOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworZXJyb3I6CisJd21pX2J1Zl9mcmVlKGJ1Zik7CisJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworfQorCisvKioKKyAqIHdtYV9yb2FtX3NjYW5fYm1pc3NfY250KCkgLSBzZXQgYm1pc3MgY291bnQgdG8gZncKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZmlyc3RfYmNudDogZmlyc3QgYm1pc3MgY291bnQKKyAqIEBmaW5hbF9iY250OiBmaW5hbCBibWlzcyBjb3VudAorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBzZXQgZmlyc3QgJiBmaW5hbCBiaXNzIGNvdW50IHRvIGZ3LgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9yb2FtX3NjYW5fYm1pc3NfY250KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICBBX0lOVDMyIGZpcnN0X2JjbnQsCisJCQkJICAgQV9VSU5UMzIgZmluYWxfYmNudCwgdWludDMyX3QgdmRldl9pZCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCVdNQV9MT0dJKCIlczogZmlyc3RfYmNudD0lZCwgZmluYWxfYmNudD0lZCIsIF9fZnVuY19fLCBmaXJzdF9iY250LAorCQkgZmluYWxfYmNudCk7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCQkgdmRldl9pZCwKKwkJCQkJCSBXTUlfVkRFVl9QQVJBTV9CTUlTU19GSVJTVF9CQ05ULAorCQkJCQkJIGZpcnN0X2JjbnQpOworCWlmIChzdGF0dXMgIT0gRU9LKSB7CisJCVdNQV9MT0dFKCJ3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kIFdNSV9WREVWX1BBUkFNX0JNSVNTX0ZJUlNUX0JDTlQgcmV0dXJuZWQgRXJyb3IgJWQiLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXN0YXR1cyA9IHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCSB2ZGV2X2lkLAorCQkJCQkJIFdNSV9WREVWX1BBUkFNX0JNSVNTX0ZJTkFMX0JDTlQsCisJCQkJCQkgZmluYWxfYmNudCk7CisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIndtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQgV01JX1ZERVZfUEFSQU1fQk1JU1NfRklOQUxfQkNOVCByZXR1cm5lZCBFcnJvciAlZCIsCisJCQlzdGF0dXMpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfcm9hbV9zY2FuX29mZmxvYWRfY29tbWFuZCgpIC0gc2V0IHJvYW0gb2ZmbG9hZCBjb21tYW5kCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQGNvbW1hbmQ6IGNvbW1hbmQKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXQgcm9hbSBvZmZsb2FkIGNvbW1hbmQgdG8gZncuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9vZmZsb2FkX2NvbW1hbmQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgdWludDMyX3QgY29tbWFuZCwgdWludDMyX3QgdmRldl9pZCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXM7CisJd21pX3JvYW1fc2Nhbl9jbWRfZml4ZWRfcGFyYW0gKmNtZF9mcDsKKwl3bWlfYnVmX3QgYnVmID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgbGVuOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisKKwlsZW4gPSBzaXplb2Yod21pX3JvYW1fc2Nhbl9jbWRfZml4ZWRfcGFyYW0pOworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXMgOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisKKwljbWRfZnAgPSAod21pX3JvYW1fc2Nhbl9jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kX2ZwLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfcm9hbV9zY2FuX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZF9mcC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJY21kX2ZwLT5jb21tYW5kX2FyZyA9IGNvbW1hbmQ7CisKKwlzdGF0dXMgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBidWYsCisJCQkJICAgICAgbGVuLCBXTUlfUk9BTV9TQ0FOX0NNRCk7CisJaWYgKHN0YXR1cyAhPSBFT0spIHsKKwkJV01BX0xPR0UoIndtaV91bmlmaWVkX2NtZF9zZW5kIFdNSV9ST0FNX1NDQU5fQ01EIHJldHVybmVkIEVycm9yICVkIiwKKwkJCXN0YXR1cyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlXTUFfTE9HSSgiJXM6IFdNQSAtLT4gV01JX1JPQU1fU0NBTl9DTUQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKKworZXJyb3I6CisJd21pX2J1Zl9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc19yb2FtX3NjYW5fcmVxKCkgLSBwcm9jZXNzIHJvYW0gcmVxdWVzdAorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEByb2FtX3JlcTogcm9hbSByZXF1ZXN0IHBhcmFtZXRlcnMKKyAqCisgKiBNYWluIHJvdXRpbmUgdG8gaGFuZGxlIFJPQU0gY29tbWFuZHMgY29taW5nIGZyb20gQ1NSIG1vZHVsZS4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19yb2FtX3NjYW5fcmVxKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICAgIHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgKnJvYW1fcmVxKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl3bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0gc2Nhbl9wYXJhbXM7CisJd21pX2FwX3Byb2ZpbGUgYXBfcHJvZmlsZTsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCXVpbnQzMl90IG1vZGUgPSAwOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppbnRyID0gTlVMTDsKKworCVdNQV9MT0dJKCIlczogY29tbWFuZCAweCV4LCByZWFzb24gJWQiLCBfX2Z1bmNfXywgcm9hbV9yZXEtPkNvbW1hbmQsCisJCSByb2FtX3JlcS0+cmVhc29uKTsKKworCWlmIChOVUxMID09IHBNYWMpIHsKKwkJV01BX0xPR0UoIiVzOiBwTWFjIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoIXdtYV9oYW5kbGUtPnJvYW1fb2ZmbG9hZF9lbmFibGVkKSB7CisJCS8qIHJvYW0gc2NhbiBvZmZsb2FkIGlzIG5vdCBlbmFibGVkIGluIGZpcm13YXJlLgorCQkgKiBDYW5ub3QgaW5pdGlhbGl6ZSBpdCBpbiB0aGUgbWlkZGxlIG9mIGNvbm5lY3Rpb24uCisJCSAqLworCQljZGZfbWVtX2ZyZWUocm9hbV9yZXEpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX1BFUk07CisJfQorCXN3aXRjaCAocm9hbV9yZXEtPkNvbW1hbmQpIHsKKwljYXNlIFJPQU1fU0NBTl9PRkZMT0FEX1NUQVJUOgorCQlpbnRyID0gJndtYV9oYW5kbGUtPmludGVyZmFjZXNbcm9hbV9yZXEtPnNlc3Npb25JZF07CisJCWludHItPmRlbGF5X2JlZm9yZV92ZGV2X3N0b3AgPSByb2FtX3JlcS0+ZGVsYXlfYmVmb3JlX3ZkZXZfc3RvcDsKKwkJLyoKKwkJICogU2Nhbi9Sb2FtIHRocmVzaG9sZCBwYXJhbWV0ZXJzIGFyZSB0cmFuc2xhdGVkIGZyb20gZmllbGRzIG9mCisJCSAqIHRTaXJSb2FtT2ZmbG9hZFNjYW5SZXEgdG8gV01JVExWIHZhbHVlcyBzZW50IHRvIFJvbWUgZmlybXdhcmUuCisJCSAqIHNvbWUgb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUgY29uZmlndXJhYmxlIGluIHFjb21fY2ZnLmluaSBmaWxlLgorCQkgKi8KKworCQkvKiBGaXJzdCBwYXJhbWV0ZXIgaXMgcG9zaXRpdmUgcnNzaSB2YWx1ZSB0byB0cmlnZ2VyIHJzc2kgYmFzZWQgc2Nhbi4KKwkJICogT3Bwb3J0dW5pc3RpYyBzY2FuIGlzIHN0YXJ0ZWQgYXQgMzAgZEIgaGlnaGVyIHRoYXQgdHJpZ2dlciByc3NpLgorCQkgKi8KKwkJd21hX2hhbmRsZS0+c3VpdGFibGVfYXBfaGJfZmFpbHVyZSA9IGZhbHNlOworCisJCWNkZl9zdGF0dXMgPSB3bWFfcm9hbV9zY2FuX29mZmxvYWRfcnNzaV90aHJlc2god21hX2hhbmRsZSwKKwkJCQkJCQkJcm9hbV9yZXEpOworCQlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwkJY2RmX3N0YXR1cyA9IHdtYV9yb2FtX3NjYW5fYm1pc3NfY250KHdtYV9oYW5kbGUsCisJCQkJCQkgICAgIHJvYW1fcmVxLT5Sb2FtQm1pc3NGaXJzdEJjbnQsCisJCQkJCQkgICAgIHJvYW1fcmVxLT5Sb2FtQm1pc3NGaW5hbEJjbnQsCisJCQkJCQkgICAgIHJvYW1fcmVxLT5zZXNzaW9uSWQpOworCQlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQkvKiBPcHBvcnR1bmlzdGljIHNjYW4gcnVucyBvbiBhIHRpbWVyLCB2YWx1ZSBzZXQgYnkKKwkJICogRW1wdHlSZWZyZXNoU2NhblBlcmlvZC4gQWdlIG91dCB0aGUgZW50cmllcyBhZnRlciAzIHN1Y2gKKwkJICogY3ljbGVzLgorCQkgKi8KKwkJaWYgKHJvYW1fcmVxLT5FbXB0eVJlZnJlc2hTY2FuUGVyaW9kID4gMCkgeworCQkJY2RmX3N0YXR1cyA9CisJCQkJd21hX3JvYW1fc2Nhbl9vZmZsb2FkX3NjYW5fcGVyaW9kKHdtYV9oYW5kbGUsCisJCQkJCQkJCSAgcm9hbV9yZXEtPkVtcHR5UmVmcmVzaFNjYW5QZXJpb2QsCisJCQkJCQkJCSAgcm9hbV9yZXEtPkVtcHR5UmVmcmVzaFNjYW5QZXJpb2QgKiAzLAorCQkJCQkJCQkgIHJvYW1fcmVxLT5zZXNzaW9uSWQpOworCQkJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJCWJyZWFrOworCisJCQltb2RlID0gV01JX1JPQU1fU0NBTl9NT0RFX1BFUklPRElDOworCQkJLyogRG9uJ3QgdXNlIHJzc2kgdHJpZ2dlcmVkIHJvYW0gc2NhbnMgaWYgZXh0ZXJuYWwgYXBwCisJCQkgKiBpcyBpbiBjb250cm9sIG9mIGNoYW5uZWwgbGlzdC4KKwkJCSAqLworCQkJaWYgKHJvYW1fcmVxLT5DaGFubmVsQ2FjaGVUeXBlICE9IENIQU5ORUxfTElTVF9TVEFUSUMpCisJCQkJbW9kZSB8PSBXTUlfUk9BTV9TQ0FOX01PREVfUlNTSV9DSEFOR0U7CisKKwkJfSBlbHNlIHsKKwkJCW1vZGUgPSBXTUlfUk9BTV9TQ0FOX01PREVfUlNTSV9DSEFOR0U7CisJCX0KKworCQkvKiBTdGFydCBuZXcgcnNzaSB0cmlnZ2VyZWQgc2NhbiBvbmx5IGlmIGl0IGNoYW5nZXMgYnkgUm9hbVJzc2lEaWZmIHZhbHVlLgorCQkgKiBCZWFjb24gd2VpZ2h0IG9mIDE0IG1lYW5zIGF2ZXJhZ2UgcnNzaSBpcyB0YWtlbiBvdmVyIDE0IHByZXZpb3VzIHNhbXBsZXMgKworCQkgKiAyIHRpbWVzIHRoZSBjdXJyZW50IGJlYWNvbidzIHJzc2kuCisJCSAqLworCQljZGZfc3RhdHVzID0gd21hX3JvYW1fc2Nhbl9vZmZsb2FkX3Jzc2lfY2hhbmdlKHdtYV9oYW5kbGUsCisJCQkJCXJvYW1fcmVxLT5zZXNzaW9uSWQsCisJCQkJCXJvYW1fcmVxLT5Sb2FtUmVzY2FuUnNzaURpZmYsCisJCQkJCXJvYW1fcmVxLT5Sb2FtQmVhY29uUnNzaVdlaWdodCwKKwkJCQkJcm9hbV9yZXEtPmhpX3Jzc2lfc2Nhbl9kZWxheSk7CisKKwkJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJd21hX3JvYW1fc2Nhbl9maWxsX2FwX3Byb2ZpbGUod21hX2hhbmRsZSwgcE1hYywgcm9hbV9yZXEsCisJCQkJCSAgICAgICZhcF9wcm9maWxlKTsKKworCQljZGZfc3RhdHVzID0gd21hX3JvYW1fc2Nhbl9vZmZsb2FkX2FwX3Byb2ZpbGUod21hX2hhbmRsZSwKKwkJCQkJCQkgICAgICAmYXBfcHJvZmlsZSwKKwkJCQkJCQkgICAgICByb2FtX3JlcS0+c2Vzc2lvbklkKTsKKwkJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJY2RmX3N0YXR1cyA9IHdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9jaGFuX2xpc3Qod21hX2hhbmRsZSwKKwkJCQkJCQkgICAgIHJvYW1fcmVxLT5Db25uZWN0ZWROZXR3b3JrLkNoYW5uZWxDb3VudCwKKwkJCQkJCQkgICAgICZyb2FtX3JlcS0+Q29ubmVjdGVkTmV0d29yay5DaGFubmVsQ2FjaGVbMF0sCisJCQkJCQkJICAgICByb2FtX3JlcS0+Q2hhbm5lbENhY2hlVHlwZSwKKwkJCQkJCQkgICAgIHJvYW1fcmVxLT5zZXNzaW9uSWQpOworCQlpZiAoKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSAmJgorCQkJKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19FX0VNUFRZKSkKKwkJCWJyZWFrOworCisKKwkJd21hX3JvYW1fc2Nhbl9maWxsX3NjYW5fcGFyYW1zKHdtYV9oYW5kbGUsIHBNYWMsIHJvYW1fcmVxLAorCQkJCQkgICAgICAgJnNjYW5fcGFyYW1zKTsKKwkJY2RmX3N0YXR1cyA9CisJCQl3bWFfcm9hbV9zY2FuX29mZmxvYWRfbW9kZSh3bWFfaGFuZGxlLCAmc2Nhbl9wYXJhbXMsCisJCQkJCQkgICByb2FtX3JlcSwgbW9kZSwKKwkJCQkJCSAgIHJvYW1fcmVxLT5zZXNzaW9uSWQpOworCQlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwkJY2RmX3N0YXR1cyA9IHdtYV9yb2FtX3NjYW5fZmlsdGVyKHdtYV9oYW5kbGUsIHJvYW1fcmVxKTsKKwkJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlXTUFfTE9HRSgiU2VuZGluZyBzdGFydCBmb3Igcm9hbSBzY2FuIGZpbHRlciBmYWlsZWQiKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBST0FNX1NDQU5fT0ZGTE9BRF9TVE9QOgorCQl3bWFfaGFuZGxlLT5zdWl0YWJsZV9hcF9oYl9mYWlsdXJlID0gZmFsc2U7CisJCWlmICh3bWFfaGFuZGxlLT5yb2FtX29mZmxvYWRfZW5hYmxlZCkgeworCisJCQl3bWFfcm9hbV9zY2FuX2ZpbGxfc2Nhbl9wYXJhbXMod21hX2hhbmRsZSwgcE1hYywKKwkJCQkJCSAgICAgICBOVUxMLCAmc2Nhbl9wYXJhbXMpOworCQkJY2RmX3N0YXR1cyA9IHdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9tb2RlKHdtYV9oYW5kbGUsCisJCQkJCQkJCSZzY2FuX3BhcmFtcywKKwkJCQkJCQkJTlVMTCwKKwkJCQkJCQkJV01JX1JPQU1fU0NBTl9NT0RFX05PTkUsCisJCQkJCQkJCXJvYW1fcmVxLT5zZXNzaW9uSWQpOworCQl9CisJCS8qCisJCSAqIElmIHRoZSBTVE9QIGNvbW1hbmQgaXMgZHVlIHRvIGEgZGlzY29ubmVjdCwgdGhlbgorCQkgKiBzZW5kIHRoZSBmaWx0ZXIgY29tbWFuZCB0byBjbGVhciBhbGwgdGhlIGZpbHRlcgorCQkgKiBlbnRyaWVzLiBJZiBpdCBpcyByb2FtaW5nIHNjZW5hcmlvLCB0aGVuIGRvIG5vdAorCQkgKiBzZW5kIHRoZSBjbGVhcmVkIGVudHJpZXMuCisJCSAqLworCQlpZiAoIXJvYW1fcmVxLT5taWRkbGVfb2Zfcm9hbWluZykgeworCQkJY2RmX3N0YXR1cyA9IHdtYV9yb2FtX3NjYW5fZmlsdGVyKHdtYV9oYW5kbGUsIHJvYW1fcmVxKTsKKwkJCWlmIChjZGZfc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQkJCVdNQV9MT0dFKCJjbGVhciBmb3Igcm9hbSBzY2FuIGZpbHRlciBmYWlsZWQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChyb2FtX3JlcS0+cmVhc29uID09CisJCSAgICBSRUFTT05fT1NfUkVRVUVTVEVEX1JPQU1JTkdfTk9XKSB7CisJCQljZHNfbXNnX3QgY2RzX21zZzsKKwkJCXRTaXJSb2FtT2ZmbG9hZFNjYW5Sc3AgKnNjYW5fb2ZmbG9hZF9yc3A7CisJCQlzY2FuX29mZmxvYWRfcnNwID0KKwkJCQljZGZfbWVtX21hbGxvYyhzaXplb2YoKnNjYW5fb2ZmbG9hZF9yc3ApKTsKKwkJCWlmICghc2Nhbl9vZmZsb2FkX3JzcCkgeworCQkJCVdNQV9MT0dFKCIlczogQWxsb2MgZmFpbGVkIGZvciBzY2FuX29mZmxvYWRfcnNwIiwKKwkJCQkJX19mdW5jX18pOworCQkJCWNkZl9tZW1fZnJlZShyb2FtX3JlcSk7CisJCQkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwkJCX0KKwkJCWNkc19tc2cudHlwZSA9IGVXTklfU01FX1JPQU1fU0NBTl9PRkZMT0FEX1JTUDsKKwkJCXNjYW5fb2ZmbG9hZF9yc3AtPnNlc3Npb25JZCA9IHJvYW1fcmVxLT5zZXNzaW9uSWQ7CisJCQlzY2FuX29mZmxvYWRfcnNwLT5yZWFzb24gPSByb2FtX3JlcS0+cmVhc29uOworCQkJY2RzX21zZy5ib2R5cHRyID0gc2Nhbl9vZmZsb2FkX3JzcDsKKwkJCS8qCisJCQkgKiBTaW5jZSBSRUFTU09DIHJlcXVlc3QgaXMgcHJvY2Vzc2VkIGluCisJCQkgKiBSb2FtX1NjYW5fT2ZmbG9hZF9Sc3AgcG9zdCBhIGR1bW15IHJzcCBtc2cgYmFjayB0bworCQkJICogU01FIHdpdGggcHJvcGVyIHJlYXNvbiBjb2RlLgorCQkJICovCisJCQlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9CisJCQkgICAgY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfU01FLAorCQkJCQkJKGNkc19tc2dfdCAqKSAmY2RzX21zZykpIHsKKwkJCQljZGZfbWVtX2ZyZWUoc2Nhbl9vZmZsb2FkX3JzcCk7CisJCQkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfV01BLAorCQkJCQkgIENERl9UUkFDRV9MRVZFTF9JTkZPLAorCQkJCQkgICIlczogRmFpbGVkIHRvIHBvc3QgU2NhbiBPZmZsb2FkIFJzcCB0byBVTUFDIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJPQU1fU0NBTl9PRkZMT0FEX0FCT1JUX1NDQU46CisJCS8qIElmIHJvYW0gc2NhbiBpcyBydW5uaW5nLCBzdG9wIHRoYXQgY3ljbGUuCisJCSAqIEl0IHdpbGwgY29udGludWUgYXV0b21hdGljYWxseSBvbiBuZXh0IHRyaWdnZXIuCisJCSAqLworCQljZGZfc3RhdHVzID0gd21hX3JvYW1fc2Nhbl9vZmZsb2FkX2NvbW1hbmQod21hX2hhbmRsZSwKKwkJCQkJCQkgICBXTUlfUk9BTV9TQ0FOX1NUT1BfQ01ELAorCQkJCQkJCSAgIHJvYW1fcmVxLT5zZXNzaW9uSWQpOworCQlicmVhazsKKworCWNhc2UgUk9BTV9TQ0FOX09GRkxPQURfUkVTVEFSVDoKKwkJLyogUm9tZSBvZmZsb2FkIGVuZ2luZSBkb2VzIG5vdCBzdG9wIGFmdGVyIGFueSBzY2FuLgorCQkgKiBJZiB0aGlzIGNvbW1hbmQgaXMgc2VudCBiZWNhdXNlIGFsbCBwcmVhdXRoIGF0dGVtcHRzIGZhaWxlZAorCQkgKiBhbmQgV01JX1JPQU1fUkVBU09OX1NVSVRBQkxFX0FQIGV2ZW50IHdhcyByZWNlaXZlZCBlYXJsaWVyLAorCQkgKiBub3cgaXQgaXMgdGltZSB0byBjYWxsIGl0IGhlYXJ0YmVhdCBmYWlsdXJlLgorCQkgKi8KKwkJaWYgKChyb2FtX3JlcS0+cmVhc29uID09IFJFQVNPTl9QUkVBVVRIX0ZBSUxFRF9GT1JfQUxMKQorCQkgICAgJiYgd21hX2hhbmRsZS0+c3VpdGFibGVfYXBfaGJfZmFpbHVyZSkgeworCQkJV01BX0xPR0UoIiVzOiBTZW5kaW5nIGhlYXJ0YmVhdCBmYWlsdXJlIGFmdGVyIHByZWF1dGggZmFpbHVyZXMiLAorCQkJCV9fZnVuY19fKTsKKwkJCXdtYV9iZWFjb25fbWlzc19oYW5kbGVyKHdtYV9oYW5kbGUsCisJCQkJCQlyb2FtX3JlcS0+c2Vzc2lvbklkKTsKKwkJCXdtYV9oYW5kbGUtPnN1aXRhYmxlX2FwX2hiX2ZhaWx1cmUgPSBmYWxzZTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUk9BTV9TQ0FOX09GRkxPQURfVVBEQVRFX0NGRzoKKwkJd21hX2hhbmRsZS0+c3VpdGFibGVfYXBfaGJfZmFpbHVyZSA9IGZhbHNlOworCQl3bWFfcm9hbV9zY2FuX2ZpbGxfc2Nhbl9wYXJhbXMod21hX2hhbmRsZSwgcE1hYywgcm9hbV9yZXEsCisJCQkJCSAgICAgICAmc2Nhbl9wYXJhbXMpOworCQljZGZfc3RhdHVzID0KKwkJCXdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9tb2RlKHdtYV9oYW5kbGUsICZzY2FuX3BhcmFtcywKKwkJCQkJCSAgIHJvYW1fcmVxLAorCQkJCQkJICAgV01JX1JPQU1fU0NBTl9NT0RFX05PTkUsCisJCQkJCQkgICByb2FtX3JlcS0+c2Vzc2lvbklkKTsKKwkJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJaWYgKHJvYW1fcmVxLT5Sb2FtU2Nhbk9mZmxvYWRFbmFibGVkID09IGZhbHNlKQorCQkJYnJlYWs7CisKKwkJY2RmX3N0YXR1cyA9IHdtYV9yb2FtX3NjYW5fYm1pc3NfY250KHdtYV9oYW5kbGUsCisJCQkJCQkgICAgIHJvYW1fcmVxLT5Sb2FtQm1pc3NGaXJzdEJjbnQsCisJCQkJCQkgICAgIHJvYW1fcmVxLT5Sb2FtQm1pc3NGaW5hbEJjbnQsCisJCQkJCQkgICAgIHJvYW1fcmVxLT5zZXNzaW9uSWQpOworCQlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwkJY2RmX3N0YXR1cyA9IHdtYV9yb2FtX3NjYW5fZmlsdGVyKHdtYV9oYW5kbGUsIHJvYW1fcmVxKTsKKwkJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCQlXTUFfTE9HRSgiU2VuZGluZyB1cGRhdGUgZm9yIHJvYW0gc2NhbiBmaWx0ZXIgZmFpbGVkIik7CisJCQlicmVhazsKKwkJfQorCisKKwkJLyoKKwkJICogUnVudGltZSAoYWZ0ZXIgYXNzb2NpYXRpb24pIGNoYW5nZXMgdG8gcnNzaSB0aHJlc2hvbGRzIGFuZAorCQkgKiBvdGhlciBwYXJhbWV0ZXJzLgorCQkgKi8KKwkJY2RmX3N0YXR1cyA9IHdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9jaGFuX2xpc3Qod21hX2hhbmRsZSwKKwkJCQkJCQkgICAgIHJvYW1fcmVxLT5Db25uZWN0ZWROZXR3b3JrLkNoYW5uZWxDb3VudCwKKwkJCQkJCQkgICAgICZyb2FtX3JlcS0+Q29ubmVjdGVkTmV0d29yay5DaGFubmVsQ2FjaGVbMF0sCisJCQkJCQkJICAgICByb2FtX3JlcS0+Q2hhbm5lbENhY2hlVHlwZSwKKwkJCQkJCQkgICAgIHJvYW1fcmVxLT5zZXNzaW9uSWQpOworCQkvKgorCQkgKiBFdmVuIHRob3VnaCB0aGUgY2hhbm5lbCBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4KKwkJICogc3RpbGwgZ28gYWhlYWQgYW5kIHN0YXJ0IFJvYW1pbmcuCisJCSAqLworCQlpZiAoKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSAmJgorCQkJKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19FX0VNUFRZKSkKKwkJCWJyZWFrOworCisKKwkJY2RmX3N0YXR1cyA9IHdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9yc3NpX3RocmVzaCh3bWFfaGFuZGxlLAorCQkJCQkJCSAgICAgICByb2FtX3JlcSk7CisJCWlmIChjZGZfc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCWlmIChyb2FtX3JlcS0+RW1wdHlSZWZyZXNoU2NhblBlcmlvZCA+IDApIHsKKwkJCWNkZl9zdGF0dXMgPQorCQkJCXdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9zY2FuX3BlcmlvZCh3bWFfaGFuZGxlLAorCQkJCQkJCQkgIHJvYW1fcmVxLT5FbXB0eVJlZnJlc2hTY2FuUGVyaW9kLAorCQkJCQkJCQkgIHJvYW1fcmVxLT5FbXB0eVJlZnJlc2hTY2FuUGVyaW9kICogMywKKwkJCQkJCQkJICByb2FtX3JlcS0+c2Vzc2lvbklkKTsKKwkJCWlmIChjZGZfc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJCQlicmVhazsKKworCQkJbW9kZSA9IFdNSV9ST0FNX1NDQU5fTU9ERV9QRVJJT0RJQzsKKwkJCS8qIERvbid0IHVzZSByc3NpIHRyaWdnZXJlZCByb2FtIHNjYW5zIGlmIGV4dGVybmFsIGFwcAorCQkJICogaXMgaW4gY29udHJvbCBvZiBjaGFubmVsIGxpc3QuCisJCQkgKi8KKwkJCWlmIChyb2FtX3JlcS0+Q2hhbm5lbENhY2hlVHlwZSAhPSBDSEFOTkVMX0xJU1RfU1RBVElDKQorCQkJCW1vZGUgfD0gV01JX1JPQU1fU0NBTl9NT0RFX1JTU0lfQ0hBTkdFOworCisJCX0gZWxzZSB7CisJCQltb2RlID0gV01JX1JPQU1fU0NBTl9NT0RFX1JTU0lfQ0hBTkdFOworCQl9CisKKwkJY2RmX3N0YXR1cyA9IHdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9yc3NpX2NoYW5nZSh3bWFfaGFuZGxlLAorCQkJCSAgICByb2FtX3JlcS0+c2Vzc2lvbklkLAorCQkJCSAgICByb2FtX3JlcS0+Um9hbVJlc2NhblJzc2lEaWZmLAorCQkJCSAgICByb2FtX3JlcS0+Um9hbUJlYWNvblJzc2lXZWlnaHQsCisJCQkJICAgIHJvYW1fcmVxLT5oaV9yc3NpX3NjYW5fZGVsYXkpOworCQlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQl3bWFfcm9hbV9zY2FuX2ZpbGxfYXBfcHJvZmlsZSh3bWFfaGFuZGxlLCBwTWFjLCByb2FtX3JlcSwKKwkJCQkJICAgICAgJmFwX3Byb2ZpbGUpOworCQljZGZfc3RhdHVzID0KKwkJCXdtYV9yb2FtX3NjYW5fb2ZmbG9hZF9hcF9wcm9maWxlKHdtYV9oYW5kbGUsICZhcF9wcm9maWxlLAorCQkJCQkJCSByb2FtX3JlcS0+c2Vzc2lvbklkKTsKKwkJaWYgKGNkZl9zdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJd21hX3JvYW1fc2Nhbl9maWxsX3NjYW5fcGFyYW1zKHdtYV9oYW5kbGUsIHBNYWMsIHJvYW1fcmVxLAorCQkJCQkgICAgICAgJnNjYW5fcGFyYW1zKTsKKwkJY2RmX3N0YXR1cyA9CisJCQl3bWFfcm9hbV9zY2FuX29mZmxvYWRfbW9kZSh3bWFfaGFuZGxlLCAmc2Nhbl9wYXJhbXMsCisJCQkJCQkgICByb2FtX3JlcSwgbW9kZSwKKwkJCQkJCSAgIHJvYW1fcmVxLT5zZXNzaW9uSWQpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWNkZl9tZW1fZnJlZShyb2FtX3JlcSk7CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogd21hX3JvYW1fcHJlYXV0aF9jaGFuX3NldCgpIC0gc2V0IHByZWF1dGggY2hhbm5lbAorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBwYXJhbXM6IHN3aXRjaCBjaGFubmVsIHBhcmFtcworICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBTZW5kIGEgc2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIHJlcXVlc3QKKyAqIHRvIGhhbmRsZSBzZXRfY2hhbm5lbCBvcGVyYXRpb24gZm9yIHByZWF1dGgKKyAqCisgKiBSZXR1cm46IENERiBhdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfcm9hbV9wcmVhdXRoX2NoYW5fc2V0KHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkgICAgIHRwU3dpdGNoQ2hhbm5lbFBhcmFtcyBwYXJhbXMsCisJCQkJICAgICB1aW50OF90IHZkZXZfaWQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXRTaXJTY2FuT2ZmbG9hZFJlcSBzY2FuX3JlcTsKKwl1aW50OF90IGJzc2lkW0lFRUU4MDIxMV9BRERSX0xFTl0gPSB7CisJCQkJCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCisJV01BX0xPR0koIiVzOiBjaGFubmVsICVkIiwgX19mdW5jX18sIHBhcmFtcy0+Y2hhbm5lbE51bWJlcik7CisKKwkvKiBDaGVjayBmb3IgcHJpb3Igb3BlcmF0aW9uIGluIHByb2dyZXNzICovCisJaWYgKHdtYV9oYW5kbGUtPnJvYW1fcHJlYXV0aF9jaGFuX2NvbnRleHQgIT0gTlVMTCkgeworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCVdNQV9MT0dFKCIlczogUmVqZWN0ZWQgcmVxdWVzdC4gUHJldmlvdXMgb3BlcmF0aW9uIGluIHByb2dyZXNzIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWdvdG8gc2VuZF9yZXNwOworCX0KKwl3bWFfaGFuZGxlLT5yb2FtX3ByZWF1dGhfY2hhbl9jb250ZXh0ID0gcGFyYW1zOworCisJLyogUHJlcGFyZSBhIGR1bW15IHNjYW4gcmVxdWVzdCBhbmQgZ2V0IHRoZQorCSAqIHdtaV9zdGFydF9zY2FuX2NtZF9maXhlZF9wYXJhbSBzdHJ1Y3R1cmUgZmlsbGVkIHByb3Blcmx5CisJICovCisJY2RmX21lbV96ZXJvKCZzY2FuX3JlcSwgc2l6ZW9mKHNjYW5fcmVxKSk7CisJY2RmX2NvcHlfbWFjYWRkcigoc3RydWN0IGNkZl9tYWNfYWRkciAqKSAmc2Nhbl9yZXEuYnNzSWQsCisJCQkgKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgYnNzaWQpOworCWNkZl9jb3B5X21hY2FkZHIoKHN0cnVjdCBjZGZfbWFjX2FkZHIgKikgJnNjYW5fcmVxLnNlbGZNYWNBZGRyLAorCQkJIChzdHJ1Y3QgY2RmX21hY19hZGRyICopICZwYXJhbXMtPnNlbGZTdGFNYWNBZGRyKTsKKwlzY2FuX3JlcS5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9IDE7CisJc2Nhbl9yZXEuY2hhbm5lbExpc3QuY2hhbm5lbE51bWJlclswXSA9IHBhcmFtcy0+Y2hhbm5lbE51bWJlcjsKKwlzY2FuX3JlcS5udW1Tc2lkID0gMDsKKwlzY2FuX3JlcS5taW5DaGFubmVsVGltZSA9IFdNQV9ST0FNX1BSRUFVVEhfU0NBTl9USU1FOworCXNjYW5fcmVxLm1heENoYW5uZWxUaW1lID0gV01BX1JPQU1fUFJFQVVUSF9TQ0FOX1RJTUU7CisJc2Nhbl9yZXEuc2NhblR5cGUgPSBlU0lSX1BBU1NJVkVfU0NBTjsKKwlzY2FuX3JlcS5wMnBTY2FuVHlwZSA9IFAyUF9TQ0FOX1RZUEVfTElTVEVOOworCXNjYW5fcmVxLnNlc3Npb25JZCA9IHZkZXZfaWQ7CisJd21hX2dldF9zY2FuX2lkKCZzY2FuX3JlcS5zY2FuX2lkKTsKKwl3bWFfaGFuZGxlLT5yb2FtX3ByZWF1dGhfY2hhbmZyZXEgPQorCQljZHNfY2hhbl90b19mcmVxKHBhcmFtcy0+Y2hhbm5lbE51bWJlcik7CisKKwkvKiBzZXQgdGhlIHN0YXRlIGluIGFkdmFuY2UgYmVmb3JlIGNhbGxpbmcgd21hX3N0YXJ0X3NjYW4gYW5kIGJlIHJlYWR5CisJICogdG8gaGFuZGxlIHNjYW4gZXZlbnRzIGZyb20gZmlybXdhcmUuIE90aGVyd2lzZSBwcmludCBzdGF0bWVudHMKKwkgKiBpbiB3bWFfc3RhcnRfY2FuIGNyZWF0ZSBhIHJhY2UgY29uZGl0aW9uLgorCSAqLworCXdtYV9oYW5kbGUtPnJvYW1fcHJlYXV0aF9zY2FuX3N0YXRlID0gV01BX1JPQU1fUFJFQVVUSF9DSEFOX1JFUVVFU1RFRDsKKwljZGZfc3RhdHVzID0gd21hX3N0YXJ0X3NjYW4od21hX2hhbmRsZSwgJnNjYW5fcmVxLCBXTUFfQ0hOTF9TV0lUQ0hfUkVRKTsKKworCWlmIChjZGZfc3RhdHVzID09IENERl9TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIGNkZl9zdGF0dXM7CisJd21hX2hhbmRsZS0+cm9hbV9wcmVhdXRoX3NjYW5fc3RhdGUgPSBXTUFfUk9BTV9QUkVBVVRIX0NIQU5fTk9ORTsKKwkvKiBGYWlsZWQgb3BlcmF0aW9uLiBTYWZlbHkgY2xlYXIgY29udGV4dCAqLworCXdtYV9oYW5kbGUtPnJvYW1fcHJlYXV0aF9jaGFuX2NvbnRleHQgPSBOVUxMOworCitzZW5kX3Jlc3A6CisJV01BX0xPR0koIiVzOiBzZW5kaW5nIFdNQV9TV0lUQ0hfQ0hBTk5FTF9SU1AsIHN0YXR1cyA9IDB4JXgiLAorCQkgX19mdW5jX18sIGNkZl9zdGF0dXMpOworCXBhcmFtcy0+Y2hhaW5NYXNrID0gd21hX2hhbmRsZS0+cGRldmNvbmZpZy50eGNoYWlubWFzazsKKwlwYXJhbXMtPnNtcHNNb2RlID0gU01QU19NT0RFX0RJU0FCTEVEOworCXBhcmFtcy0+c3RhdHVzID0gY2RmX3N0YXR1czsKKwl3bWFfc2VuZF9tc2cod21hX2hhbmRsZSwgV01BX1NXSVRDSF9DSEFOTkVMX1JTUCwgKHZvaWQgKilwYXJhbXMsIDApOworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9yb2FtX3ByZWF1dGhfY2hhbl9jYW5jZWwoKSAtIGNhbmNlbCBwcmVhdXRoIHNjYW4KKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcGFyYW1zOiBzd2l0Y2ggY2hhbm5lbCBwYXJhbWV0ZXJzCisgKiBAdmRldl9pZDogdmRldiBpZAorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9yb2FtX3ByZWF1dGhfY2hhbl9jYW5jZWwodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQl0cFN3aXRjaENoYW5uZWxQYXJhbXMgcGFyYW1zLAorCQkJCQl1aW50OF90IHZkZXZfaWQpCit7CisJdEFib3J0U2NhblBhcmFtcyBhYm9ydF9zY2FuX3JlcTsKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwlXTUFfTE9HSSgiJXM6IGNoYW5uZWwgJWQiLCBfX2Z1bmNfXywgcGFyYW1zLT5jaGFubmVsTnVtYmVyKTsKKwkvKiBDaGVjayBmb3IgcHJpb3Igb3BlcmF0aW9uIGluIHByb2dyZXNzICovCisJaWYgKHdtYV9oYW5kbGUtPnJvYW1fcHJlYXV0aF9jaGFuX2NvbnRleHQgIT0gTlVMTCkgeworCQljZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJCVdNQV9MT0dFKCIlczogUmVqZWN0ZWQgcmVxdWVzdC4gUHJldmlvdXMgb3BlcmF0aW9uIGluIHByb2dyZXNzIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWdvdG8gc2VuZF9yZXNwOworCX0KKwl3bWFfaGFuZGxlLT5yb2FtX3ByZWF1dGhfY2hhbl9jb250ZXh0ID0gcGFyYW1zOworCisJYWJvcnRfc2Nhbl9yZXEuU2Vzc2lvbklkID0gdmRldl9pZDsKKwl3bWFfaGFuZGxlLT5yb2FtX3ByZWF1dGhfc2Nhbl9zdGF0ZSA9CisJCVdNQV9ST0FNX1BSRUFVVEhfQ0hBTl9DQU5DRUxfUkVRVUVTVEVEOworCWNkZl9zdGF0dXMgPSB3bWFfc3RvcF9zY2FuKHdtYV9oYW5kbGUsICZhYm9ydF9zY2FuX3JlcSk7CisJaWYgKGNkZl9zdGF0dXMgPT0gQ0RGX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gY2RmX3N0YXR1czsKKwkvKiBGYWlsZWQgb3BlcmF0aW9uLiBTYWZlbHkgY2xlYXIgY29udGV4dCAqLworCXdtYV9oYW5kbGUtPnJvYW1fcHJlYXV0aF9jaGFuX2NvbnRleHQgPSBOVUxMOworCitzZW5kX3Jlc3A6CisJV01BX0xPR0koIiVzOiBzZW5kaW5nIFdNQV9TV0lUQ0hfQ0hBTk5FTF9SU1AsIHN0YXR1cyA9IDB4JXgiLAorCQkgX19mdW5jX18sIGNkZl9zdGF0dXMpOworCXBhcmFtcy0+Y2hhaW5NYXNrID0gd21hX2hhbmRsZS0+cGRldmNvbmZpZy50eGNoYWlubWFzazsKKwlwYXJhbXMtPnNtcHNNb2RlID0gU01QU19NT0RFX0RJU0FCTEVEOworCXBhcmFtcy0+c3RhdHVzID0gY2RmX3N0YXR1czsKKwl3bWFfc2VuZF9tc2cod21hX2hhbmRsZSwgV01BX1NXSVRDSF9DSEFOTkVMX1JTUCwgKHZvaWQgKilwYXJhbXMsIDApOworCXJldHVybiBjZGZfc3RhdHVzOworfQorCisvKioKKyAqIHdtYV9yb2FtX3ByZWF1dGhfc2Nhbl9ldmVudF9oYW5kbGVyKCkgLSBwcmVhdXRoIHNjYW4gZXZlbnQgaGFuZGxlcgorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAd21pX2V2ZW50OiBldmVudCBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHByZWF1dGggc2NhbiBldmVudCBhbmQgc2VuZCBhcHByb3ByaWF0ZQorICogbWVzc2FnZSB0byB1cHBlciBsYXllcnMuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3JvYW1fcHJlYXV0aF9zY2FuX2V2ZW50X2hhbmRsZXIodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgdWludDhfdCB2ZGV2X2lkLAorCQkJCQkgd21pX3NjYW5fZXZlbnRfZml4ZWRfcGFyYW0gKgorCQkJCQkgd21pX2V2ZW50KQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl0U3dpdGNoQ2hhbm5lbFBhcmFtcyAqcGFyYW1zOworCisJV01BX0xPR0koIiVzOiBwcmVhdXRoX3NjYW5fc3RhdGUgJWQsIGV2ZW50IDB4JXgsIHJlYXNvbiAweCV4IiwKKwkJIF9fZnVuY19fLCB3bWFfaGFuZGxlLT5yb2FtX3ByZWF1dGhfc2Nhbl9zdGF0ZSwKKwkJIHdtaV9ldmVudC0+ZXZlbnQsIHdtaV9ldmVudC0+cmVhc29uKTsKKwlzd2l0Y2ggKHdtYV9oYW5kbGUtPnJvYW1fcHJlYXV0aF9zY2FuX3N0YXRlKSB7CisJY2FzZSBXTUFfUk9BTV9QUkVBVVRIX0NIQU5fUkVRVUVTVEVEOgorCQlpZiAod21pX2V2ZW50LT5ldmVudCAmIFdNSV9TQ0FOX0VWRU5UX0ZPUkVJR05fQ0hBTk5FTCkgeworCQkJLyogY29tcGxldGUgc2V0X2NoYW4gcmVxdWVzdCAqLworCQkJd21hX2hhbmRsZS0+cm9hbV9wcmVhdXRoX3NjYW5fc3RhdGUgPQorCQkJCVdNQV9ST0FNX1BSRUFVVEhfT05fQ0hBTjsKKwkJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJCX0gZWxzZSBpZiAod21pX2V2ZW50LT5ldmVudCAmIFdNSV9TQ0FOX0ZJTklTSF9FVkVOVFMpIHsKKwkJCS8qIEZhaWxlZCB0byBnZXQgcHJlYXV0aCBjaGFubmVsIG9yIGZpbmlzaGVkICh1bmxpa2VseSkgKi8KKwkJCXdtYV9oYW5kbGUtPnJvYW1fcHJlYXV0aF9zY2FuX3N0YXRlID0KKwkJCQlXTUFfUk9BTV9QUkVBVVRIX0NIQU5fTk9ORTsKKwkJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwkJfSBlbHNlCisJCQlyZXR1cm47CisJCWJyZWFrOworCWNhc2UgV01BX1JPQU1fUFJFQVVUSF9DSEFOX0NBTkNFTF9SRVFVRVNURUQ6CisJCS8qIENvbXBsZXRlZCBvciBjYW5jZWxsZWQsIGNvbXBsZXRlIHNldF9jaGFuIGNhbmNlbCByZXF1ZXN0ICovCisJCXdtYV9oYW5kbGUtPnJvYW1fcHJlYXV0aF9zY2FuX3N0YXRlID0KKwkJCVdNQV9ST0FNX1BSRUFVVEhfQ0hBTl9OT05FOworCQlicmVhazsKKworCWNhc2UgV01BX1JPQU1fUFJFQVVUSF9PTl9DSEFOOgorCQlpZiAoKHdtaV9ldmVudC0+ZXZlbnQgJiBXTUlfU0NBTl9FVkVOVF9CU1NfQ0hBTk5FTCkgfHwKKwkJICAgICh3bWlfZXZlbnQtPmV2ZW50ICYgV01JX1NDQU5fRklOSVNIX0VWRU5UUykpCisJCQl3bWFfaGFuZGxlLT5yb2FtX3ByZWF1dGhfc2Nhbl9zdGF0ZSA9CisJCQkJV01BX1JPQU1fUFJFQVVUSF9DSEFOX0NPTVBMRVRFRDsKKworCQkvKiBUaGVyZSBpcyBubyBXTUEgcmVxdWVzdCB0byBjb21wbGV0ZS4gTmV4dCBzZXQgY2hhbm5lbCByZXF1ZXN0IHdpbGwKKwkJICogbG9vayBhdCB0aGlzIHN0YXRlIGFuZCBjb21wbGV0ZSBpdC4KKwkJICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdNQV9MT0dFKCIlczogdW5oYW5kbGVkIGV2ZW50IDB4JXgsIHJlYXNvbiAweCV4IiwKKwkJCSBfX2Z1bmNfXywgd21pX2V2ZW50LT5ldmVudCwgd21pX2V2ZW50LT5yZWFzb24pOworCQlyZXR1cm47CisJfQorCisJcGFyYW1zID0gKHRwU3dpdGNoQ2hhbm5lbFBhcmFtcykgd21hX2hhbmRsZS0+cm9hbV9wcmVhdXRoX2NoYW5fY29udGV4dDsKKwlpZiAocGFyYW1zKSB7CisJCVdNQV9MT0dJKCIlczogc2VuZGluZyBXTUFfU1dJVENIX0NIQU5ORUxfUlNQLCBzdGF0dXMgPSAweCV4IiwKKwkJCSBfX2Z1bmNfXywgY2RmX3N0YXR1cyk7CisJCXBhcmFtcy0+Y2hhaW5NYXNrID0gd21hX2hhbmRsZS0+cGRldmNvbmZpZy50eGNoYWlubWFzazsKKwkJcGFyYW1zLT5zbXBzTW9kZSA9IFNNUFNfTU9ERV9ESVNBQkxFRDsKKwkJcGFyYW1zLT5zdGF0dXMgPSBjZGZfc3RhdHVzOworCQl3bWFfc2VuZF9tc2cod21hX2hhbmRsZSwgV01BX1NXSVRDSF9DSEFOTkVMX1JTUCwgKHZvaWQgKilwYXJhbXMsCisJCQkgICAgIDApOworCQl3bWFfaGFuZGxlLT5yb2FtX3ByZWF1dGhfY2hhbl9jb250ZXh0ID0gTlVMTDsKKwl9CisKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQKKworLyoqCisgKiB3bWFfcHJvY2Vzc19yb2FtX2ludm9rZSgpIC0gc2VuZCByb2FtIGludm9rZSBjb21tYW5kIHRvIGZ3LgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQHJvYW1pbnZva2U6IHJvYW0gaW52b2tlIGNvbW1hbmQKKyAqCisgKiBTZW5kIHJvYW0gaW52b2tlIGNvbW1hbmQgdG8gZncgZm9yIGZhc3RyZWFzc29jLgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9wcm9jZXNzX3JvYW1faW52b2tlKFdNQV9IQU5ETEUgaGFuZGxlLAorCQlzdHJ1Y3Qgd21hX3JvYW1faW52b2tlX2NtZCAqcm9hbWludm9rZSkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCXdtaV9yb2FtX2ludm9rZV9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3Qgd21pX2J1ZjsKKwl1X2ludDhfdCAqYnVmX3B0cjsKKwl1X2ludDE2X3QgbGVuLCBhcmdzX3Rsdl9sZW47CisJQV9VSU5UMzIgKmNoYW5uZWxfbGlzdDsKKwl3bWlfbWFjX2FkZHIgKmJzc2lkX2xpc3Q7CisKKwlpZiAoIXdtYV9oYW5kbGUgfHwgIXdtYV9oYW5kbGUtPndtaV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBXTUEgaXMgY2xvc2VkLCBjYW4gbm90IHNlbmQgcm9hbSBpbnZva2UiLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwkvKiBIb3N0IHNlbmRzIG9ubHkgb25lIGNoYW5uZWwgYW5kIG9uZSBic3NpZCAqLworCWFyZ3NfdGx2X2xlbiA9IDIgKiBXTUlfVExWX0hEUl9TSVpFICsgc2l6ZW9mKEFfVUlOVDMyKSArCisJCQlzaXplb2Yod21pX21hY19hZGRyKTsKKwlsZW4gPSBzaXplb2Yod21pX3JvYW1faW52b2tlX2NtZF9maXhlZF9wYXJhbSkgKyBhcmdzX3Rsdl9sZW47CisJd21pX2J1ZiA9IHdtaV9idWZfYWxsb2Mod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIXdtaV9idWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWFpX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwljbWQgPSAod21pX3JvYW1faW52b2tlX2NtZF9maXhlZF9wYXJhbSAqKXdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKwlidWZfcHRyID0gKHVfaW50OF90ICopIGNtZDsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1faW52b2tlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4od21pX3JvYW1faW52b2tlX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHJvYW1pbnZva2UtPnZkZXZfaWQ7CisJY21kLT5mbGFncyA9IDA7CisJY21kLT5yb2FtX3NjYW5fbW9kZSA9IDA7CisJY21kLT5yb2FtX2FwX3NlbF9tb2RlID0gMDsKKwljbWQtPnJvYW1fZGVsYXkgPSAwOworCWNtZC0+bnVtX2NoYW4gPSAxOworCWNtZC0+bnVtX2Jzc2lkID0gMTsKKwlidWZfcHRyICs9IHNpemVvZih3bWlfcm9hbV9pbnZva2VfY21kX2ZpeGVkX3BhcmFtKTsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwKKwkJCQkoc2l6ZW9mKHVfaW50MzJfdCkpKTsKKwljaGFubmVsX2xpc3QgPSAoQV9VSU5UMzIgKikoYnVmX3B0ciArIFdNSV9UTFZfSERSX1NJWkUpOworCSpjaGFubmVsX2xpc3QgPSAoQV9VSU5UMzIpY2RzX2NoYW5fdG9fZnJlcShyb2FtaW52b2tlLT5jaGFubmVsKTsKKwlidWZfcHRyICs9IHNpemVvZihBX1VJTlQzMikgKyBXTUlfVExWX0hEUl9TSVpFOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfRklYRURfU1RSVUMsCisJCQkJKHNpemVvZih3bWlfbWFjX2FkZHIpKSk7CisJYnNzaWRfbGlzdCA9ICh3bWlfbWFjX2FkZHIgKikoYnVmX3B0ciArIFdNSV9UTFZfSERSX1NJWkUpOworCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKHJvYW1pbnZva2UtPmJzc2lkLCBic3NpZF9saXN0KTsKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgd21pX2J1ZiwgbGVuLAorCQkJCQlXTUlfUk9BTV9JTlZPS0VfQ01ESUQpKSB7CisJCVdNQV9MT0dQKCIlczogZmFpbGVkIHRvIHNlbmQgcm9hbSBpbnZva2UgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJd21pX2J1Zl9mcmVlKHdtaV9idWYpOworCQlyZXR1cm47CisJfQorCXJldHVybjsKK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc19yb2FtX3N5bmNoX2ZhaWwoKSAtcm9hbSBzeW5jaCBmYWlsdXJlIGhhbmRsZQorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQHN5bmNoX2ZhaWw6IHJvYW0gc3luY2ggZmFpbCBwYXJhbWV0ZXJzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3Byb2Nlc3Nfcm9hbV9zeW5jaF9mYWlsKFdNQV9IQU5ETEUgaGFuZGxlLAorCQkJCSBzdHJ1Y3Qgcm9hbV9vZmZsb2FkX3N5bmNoX2ZhaWwgKnN5bmNoX2ZhaWwpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlpZiAoIXdtYV9oYW5kbGUgfHwgIXdtYV9oYW5kbGUtPndtaV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBXTUEgaXMgY2xvc2VkLCBjYW4gbm90IGNsZWFuLXVwIHJvYW0gc3luY2giLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCS8qIEhhbmQgT2ZmIEZhaWx1cmUgY291bGQgaGFwcGVuIGFzIGFuIGV4Y2VwdGlvbiwgd2hlbiBhIHJvYW0gc3luY2gKKwkgKiBpbmRpY2F0aW9uIGlzIHBvc3RlZCB0byBIb3N0LCBidXQgYSByb2FtIHN5bmNoIGNvbXBsZXRlIGlzIG5vdAorCSAqIHBvc3RlZCB0byB0aGUgZmlybXdhcmUuU28sIGNsZWFyIHRoZSByb2FtIHN5bmNoIGluIHByb2dyZXNzCisJICogZmxhZyBiZWZvcmUgZGlzY29ubmVjdGluZyB0aGUgc2Vzc2lvbiB0aHJvdWdoIHRoaXMgZXZlbnQuKi8KKwl3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3N5bmNoX2ZhaWwtPnNlc3Npb25faWRdLnJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MgPQorCQlmYWxzZTsKK30KKworLyoqCisgKiB3bWFfcm9hbV9zeW5jaF9ldmVudF9oYW5kbGVyKCkgLSByb2FtIHN5bmNoIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBldmVudDogZXZlbnQgZGF0YQorICogQGxlbjogbGVuZ3RoIG9mIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHJvYW0gc3luY2ggZXZlbnQgaGFuZGxlci4gSXQgc2VuZHMgcm9hbQorICogaW5kaWNhdGlvbiBmb3IgdXBwZXIgbGF5ZXIuCisgKi8KK2ludCB3bWFfcm9hbV9zeW5jaF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsCisJCQkJCXVpbnQzMl90IGxlbikKK3sKKwlXTUlfUk9BTV9TWU5DSF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZiA9IE5VTEw7CisJd21pX3JvYW1fc3luY2hfZXZlbnRfZml4ZWRfcGFyYW0gKnN5bmNoX2V2ZW50ID0gTlVMTDsKKwl1aW50OF90ICpiY25fcHJvYmVyc3BfcHRyID0gTlVMTDsKKwl1aW50OF90ICpyZWFzc29jX3JzcF9wdHIgPSBOVUxMOworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwl3bWlfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisJd21pX2tleV9tYXRlcmlhbCAqa2V5ID0gTlVMTDsKKwlpbnQgc2l6ZSA9IDA7CisJcm9hbV9vZmZsb2FkX3N5bmNoX2luZCAqcm9hbV9zeW5jaF9pbmRfcHRyOworCisJV01BX0xPR0QoIkxGUjM6JXMiLCBfX2Z1bmNfXyk7CisJaWYgKCFldmVudCkgeworCQlXTUFfTE9HRSgiJXM6IGV2ZW50IHBhcmFtIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcmFtX2J1ZiA9IChXTUlfUk9BTV9TWU5DSF9FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnQ7CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIiVzOiByZWNlaXZlZCBudWxsIGJ1ZiBmcm9tIHRhcmdldCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3luY2hfZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCWlmICghc3luY2hfZXZlbnQpIHsKKwkJV01BX0xPR0UoIiVzOiByZWNlaXZlZCBudWxsIGV2ZW50IGRhdGEgZnJvbSB0YXJnZXQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh3bWEtPmludGVyZmFjZXNbc3luY2hfZXZlbnQtPnZkZXZfaWRdLnJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MpIHsKKwkJV01BX0xPR0UoIiVzOiBJZ25vcmluZyBSU0kgc2luY2Ugb25lIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MiLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdtYS0+aW50ZXJmYWNlc1tzeW5jaF9ldmVudC0+dmRldl9pZF0ucm9hbV9zeW5jaF9pbl9wcm9ncmVzcyA9IHRydWU7CisJbGVuID0gc2l6ZW9mKHJvYW1fb2ZmbG9hZF9zeW5jaF9pbmQpICsKKwkgICAgICBzeW5jaF9ldmVudC0+YmNuX3Byb2JlX3JzcF9sZW4gKyBzeW5jaF9ldmVudC0+cmVhc3NvY19yc3BfbGVuOworCXJvYW1fc3luY2hfaW5kX3B0ciA9CisJCShyb2FtX29mZmxvYWRfc3luY2hfaW5kICopIGNkZl9tZW1fbWFsbG9jKGxlbik7CisJaWYgKCFyb2FtX3N5bmNoX2luZF9wdHIpIHsKKwkJV01BX0xPR0UoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByb2FtX3N5bmNoX2V2ZW50IiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGFib3J0IGV4aXN0aW5nIHNjYW4gaWYgYW55ICovCisJaWYgKHdtYS0+aW50ZXJmYWNlc1tzeW5jaF9ldmVudC0+dmRldl9pZF0uc2Nhbl9pbmZvLnNjYW5faWQgIT0gMCkgeworCQl0QWJvcnRTY2FuUGFyYW1zIGFib3J0X3NjYW47CisJCVdNQV9MT0dEKCJMRlIzOiBBYm9ydGluZyBTY2FuIHdpdGggc2Nhbl9pZD0lZFxuIiwKKwkJd21hLT5pbnRlcmZhY2VzW3N5bmNoX2V2ZW50LT52ZGV2X2lkXS5zY2FuX2luZm8uc2Nhbl9pZCk7CisJCWFib3J0X3NjYW4uU2Vzc2lvbklkID0gc3luY2hfZXZlbnQtPnZkZXZfaWQ7CisJCXdtYV9zdG9wX3NjYW4od21hLCAmYWJvcnRfc2Nhbik7CisJfQorCisJcm9hbV9zeW5jaF9pbmRfcHRyLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1JPQU1fT0ZGTE9BRF9TWU5DSF9JTkQ7CisJcm9hbV9zeW5jaF9pbmRfcHRyLT5sZW5ndGggPSBzaXplOworCXJvYW1fc3luY2hfaW5kX3B0ci0+cm9hbWVkVmRldklkID0gc3luY2hfZXZlbnQtPnZkZXZfaWQ7CisJcm9hbV9zeW5jaF9pbmRfcHRyLT5hdXRoU3RhdHVzID0gc3luY2hfZXZlbnQtPmF1dGhfc3RhdHVzOworCXJvYW1fc3luY2hfaW5kX3B0ci0+cm9hbVJlYXNvbiA9IHN5bmNoX2V2ZW50LT5yb2FtX3JlYXNvbjsKKwlyb2FtX3N5bmNoX2luZF9wdHItPnJzc2kgPSBzeW5jaF9ldmVudC0+cnNzaTsKKwlyb2FtX3N5bmNoX2luZF9wdHItPmlzQmVhY29uID0gc3luY2hfZXZlbnQtPmlzX2JlYWNvbjsKKwlXTUlfTUFDX0FERFJfVE9fQ0hBUl9BUlJBWSgmc3luY2hfZXZlbnQtPmJzc2lkLAorCQkJCSAgIHJvYW1fc3luY2hfaW5kX3B0ci0+YnNzSWQpOworCXJvYW1fc3luY2hfaW5kX3B0ci0+YmVhY29uUHJvYmVSZXNwT2Zmc2V0ID0KKwkJc2l6ZW9mKHJvYW1fb2ZmbG9hZF9zeW5jaF9pbmQpOworCWJjbl9wcm9iZXJzcF9wdHIgPQorCQkodWludDhfdCAqKSByb2FtX3N5bmNoX2luZF9wdHIgKworCQlyb2FtX3N5bmNoX2luZF9wdHItPmJlYWNvblByb2JlUmVzcE9mZnNldDsKKwlyb2FtX3N5bmNoX2luZF9wdHItPmJlYWNvblByb2JlUmVzcExlbmd0aCA9CisJCXN5bmNoX2V2ZW50LT5iY25fcHJvYmVfcnNwX2xlbjsKKwljZGZfbWVtX2NvcHkoYmNuX3Byb2JlcnNwX3B0ciwgcGFyYW1fYnVmLT5iY25fcHJvYmVfcnNwX2ZyYW1lLAorCQkgICAgIHJvYW1fc3luY2hfaW5kX3B0ci0+YmVhY29uUHJvYmVSZXNwTGVuZ3RoKTsKKwlyb2FtX3N5bmNoX2luZF9wdHItPnJlYXNzb2NSZXNwT2Zmc2V0ID0KKwkJc2l6ZW9mKHJvYW1fb2ZmbG9hZF9zeW5jaF9pbmQpICsKKwkJcm9hbV9zeW5jaF9pbmRfcHRyLT5iZWFjb25Qcm9iZVJlc3BMZW5ndGg7CisJcm9hbV9zeW5jaF9pbmRfcHRyLT5yZWFzc29jUmVzcExlbmd0aCA9IHN5bmNoX2V2ZW50LT5yZWFzc29jX3JzcF9sZW47CisJcmVhc3NvY19yc3BfcHRyID0gKHVpbnQ4X3QgKikgcm9hbV9zeW5jaF9pbmRfcHRyICsKKwkJCSAgcm9hbV9zeW5jaF9pbmRfcHRyLT5yZWFzc29jUmVzcE9mZnNldDsKKwljZGZfbWVtX2NvcHkocmVhc3NvY19yc3BfcHRyLAorCQkgICAgIHBhcmFtX2J1Zi0+cmVhc3NvY19yc3BfZnJhbWUsCisJCSAgICAgcm9hbV9zeW5jaF9pbmRfcHRyLT5yZWFzc29jUmVzcExlbmd0aCk7CisJY2hhbiA9ICh3bWlfY2hhbm5lbCAqKSBwYXJhbV9idWYtPmNoYW47CisJcm9hbV9zeW5jaF9pbmRfcHRyLT5jaGFuX2ZyZXEgPSBjaGFuLT5taHo7CisJa2V5ID0gKHdtaV9rZXlfbWF0ZXJpYWwgKikgcGFyYW1fYnVmLT5rZXk7CisJaWYgKGtleSAhPSBOVUxMKSB7CisJCUNERl9UUkFDRV9IRVhfRFVNUChDREZfTU9EVUxFX0lEX1dNQSwgQ0RGX1RSQUNFX0xFVkVMX0RFQlVHLAorCQkJCSAgIGtleS0+cmVwbGF5X2NvdW50ZXIsIFNJUl9SRVBMQVlfQ1RSX0xFTik7CisJCWNkZl9tZW1fY29weShyb2FtX3N5bmNoX2luZF9wdHItPmtjaywga2V5LT5rY2ssCisJCQkgICAgIFNJUl9LQ0tfS0VZX0xFTik7CisJCWNkZl9tZW1fY29weShyb2FtX3N5bmNoX2luZF9wdHItPmtlaywga2V5LT5rZWssCisJCQkgICAgIFNJUl9LRUtfS0VZX0xFTik7CisJCWNkZl9tZW1fY29weShyb2FtX3N5bmNoX2luZF9wdHItPnJlcGxheV9jdHIsCisJCQkgICAgIGtleS0+cmVwbGF5X2NvdW50ZXIsIFNJUl9SRVBMQVlfQ1RSX0xFTik7CisJfQorCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9ST0FNX09GRkxPQURfU1lOQ0hfSU5ELAorCQkJKHZvaWQgKikgcm9hbV9zeW5jaF9pbmRfcHRyLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfcnNzaV9icmVhY2hlZF9ldmVudF9oYW5kbGVyKCkgLSByc3NpIGJyZWFjaGVkIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZXZlbnQgaGFuZGxlciBkYXRhCisgKiBAbGVuOiBsZW5ndGggb2YgQGNtZF9wYXJhbV9pbmZvCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworaW50IHdtYV9yc3NpX2JyZWFjaGVkX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCXVfaW50OF90ICAqY21kX3BhcmFtX2luZm8sIHVfaW50MzJfdCBsZW4pCit7CisJV01JX1JTU0lfQlJFQUNIX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9yc3NpX2JyZWFjaF9ldmVudF9maXhlZF9wYXJhbSAgKmV2ZW50OworCXN0cnVjdCByc3NpX2JyZWFjaF9ldmVudCAgcnNzaTsKKwl0cEFuaVNpckdsb2JhbCBtYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisKKwlpZiAoIW1hYykgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgbWFjIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIW1hYy0+c21lLnJzc2lfdGhyZXNob2xkX2JyZWFjaGVkX2NiKSB7CisJCVdNQV9MT0dFKCIlczogQ2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYXJhbV9idWYgPSAoV01JX1JTU0lfQlJFQUNIX0VWRU5USURfcGFyYW1fdGx2cyAqKWNtZF9wYXJhbV9pbmZvOworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCByc3NpIGJyZWFjaGVkIGV2ZW50IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCisJcnNzaS5yZXF1ZXN0X2lkID0gZXZlbnQtPnJlcXVlc3RfaWQ7CisJcnNzaS5zZXNzaW9uX2lkID0gZXZlbnQtPnZkZXZfaWQ7CisJcnNzaS5jdXJyX3Jzc2kgPSBldmVudC0+cnNzaSArIFdNQV9UR1RfTk9JU0VfRkxPT1JfREJNOworCVdNSV9NQUNfQUREUl9UT19DSEFSX0FSUkFZKCZldmVudC0+YnNzaWQsIHJzc2kuY3Vycl9ic3NpZC5ieXRlcyk7CisKKwlXTUFfTE9HRCgiJXM6IHJlcV9pZDogJXUgdmRldl9pZDogJWQgY3Vycl9yc3NpOiAlZCIsIF9fZnVuY19fLAorCQlyc3NpLnJlcXVlc3RfaWQsIHJzc2kuc2Vzc2lvbl9pZCwgcnNzaS5jdXJyX3Jzc2kpOworCVdNQV9MT0dJKCIlczogY3Vycl9ic3NpZDogJXBNIiwgX19mdW5jX18sIHJzc2kuY3Vycl9ic3NpZC5ieXRlcyk7CisKKwltYWMtPnNtZS5yc3NpX3RocmVzaG9sZF9icmVhY2hlZF9jYihtYWMtPmhIZGQsICZyc3NpKTsKKwlXTUFfTE9HRCgiJXM6IEludm9rZSBIREQgcnNzaSBicmVhY2hlZCBjYWxsYmFjayIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfcm9hbV9zY2FuX2ZpbGxfc2VsZl9jYXBzKCkgLSBmaWxsIGNhcGFiaWxpdGllcworICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEByb2FtX29mZmxvYWRfcGFyYW1zOiBvZmZsb2FkIHBhcmFtZXRlcnMKKyAqIEByb2FtX3JlcTogcm9hbSByZXF1ZXN0CisgKgorICogVGhpcyBmdW5jdGlvbiBmaWxscyByb2FtIHNlbGYgY2FwYWJsaXRpZXMuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3JvYW1fc2Nhbl9maWxsX3NlbGZfY2Fwcyh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJCXdtaV9yb2FtX29mZmxvYWRfdGx2X3BhcmFtICoKKwkJCQkJcm9hbV9vZmZsb2FkX3BhcmFtcywKKwkJCQkJdFNpclJvYW1PZmZsb2FkU2NhblJlcSAqcm9hbV9yZXEpCit7CisJc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMgPSBOVUxMOworCXRTaXJNYWNDYXBhYmlsaXR5SW5mbyBzZWxmQ2FwczsKKwl1aW50MzJfdCB2YWwgPSAwOworCXVpbnQzMl90IG5DZmdWYWx1ZTsKKwl1aW50MTZfdCAqcENmZ1ZhbHVlMTY7CisJdWludDhfdCBuQ2ZnVmFsdWU4LCAqcENmZ1ZhbHVlODsKKwl0U2lyTWFjUW9zSW5mb1N0YXRpb24gbWFjUW9zSW5mb1N0YTsKKwl1bmlvbiB7CisJCXVpbnQxNl90IG5DZmdWYWx1ZTE2OworCQl0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyBodENhcEluZm87CisJCXRTaXJNYWNFeHRlbmRlZEhUQ2FwYWJpbGl0eUluZm8gZXh0SHRDYXBJbmZvOworCX0gdUhUQ2FwYWJpbGl0eUluZm87CisKKwljZGZfbWVtX3NldCgmbWFjUW9zSW5mb1N0YSwgc2l6ZW9mKHRTaXJNYWNRb3NJbmZvU3RhdGlvbiksIDApOworCS8qIFJvYW1pbmcgaXMgZG9uZSBvbmx5IGZvciBJTkZSQSBTVEEgdHlwZS4KKwkgKiBTbywgZXNzIHdpbGwgYmUgb25lIGFuZCBpYnNzIHdpbGwgYmUgWmVybyAqLworCXBNYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisJaWYgKCFwTWFjKSB7CisJCVdNQV9MT0dFKCIlczpOVUxMIHBNYWMgcHRyLiBFeGl0aW5nIiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19QUklWQUNZX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgV05JX0NGR19QUklWQUNZX0VOQUJMRUQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlzZWxmQ2Fwcy5lc3MgPSAxOworCXNlbGZDYXBzLmlic3MgPSAwOworCWlmICh2YWwpCisJCXNlbGZDYXBzLnByaXZhY3kgPSAxOworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEUsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgV05JX0NGR19TSE9SVF9QUkVBTUJMRSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICh2YWwpCisJCXNlbGZDYXBzLnNob3J0UHJlYW1ibGUgPSAxOworCisJc2VsZkNhcHMucGJjYyA9IDA7CisJc2VsZkNhcHMuY2hhbm5lbEFnaWxpdHkgPSAwOworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVELAorCQkJICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfV01BLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJGYWlsZWQgdG8gZ2V0IFdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVEIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJaWYgKHZhbCkKKwkJc2VsZkNhcHMuc2hvcnRTbG90VGltZSA9IDE7CisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR18xMUhfRU5BQkxFRCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1dNQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiRmFpbGVkIHRvIGdldCBXTklfQ0ZHXzExSF9FTkFCTEVEIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJaWYgKHZhbCkKKwkJc2VsZkNhcHMuc3BlY3RydW1NZ3QgPSAxOworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfUU9TX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgV05JX0NGR19RT1NfRU5BQkxFRCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICh2YWwpCisJCXNlbGZDYXBzLnFvcyA9IDE7CisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19BUFNEX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgV05JX0NGR19BUFNEX0VOQUJMRUQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlpZiAodmFsKQorCQlzZWxmQ2Fwcy5hcHNkID0gMTsKKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX1JSTV9FTkFCTEVELCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfV01BLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJGYWlsZWQgdG8gZ2V0IFdOSV9DRkdfUlJNX0VOQUJMRUQiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlpZiAodmFsKQorCQlzZWxmQ2Fwcy5ycm0gPSAxOworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRUQsICZ2YWwpICE9CisJICAgIGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXNlbGZDYXBzLmRlbGF5ZWRCQSA9CisJCSh1aW50MTZfdCkgKCh2YWwgPj4gV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9ERUxBWUVEKSAmIDEpOworCXNlbGZDYXBzLmltbWVkaWF0ZUJBID0KKwkJKHVpbnQxNl90KSAoKHZhbCA+PiBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEX0lNTUVESUFURSkgJiAxKTsKKwlwQ2ZnVmFsdWUxNiA9ICh1aW50MTZfdCAqKSAmc2VsZkNhcHM7CisJcm9hbV9vZmZsb2FkX3BhcmFtcy0+Y2FwYWJpbGl0eSA9ICgqcENmZ1ZhbHVlMTYpICYgMHhGRkZGOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgJm5DZmdWYWx1ZSkgIT0KKwkgICAgZVNJUl9TVUNDRVNTKSB7CisJCUNERl9UUkFDRShDREZfTU9EVUxFX0lEX1dNQSwgQ0RGX1RSQUNFX0xFVkVMX0VSUk9SLAorCQkJICAiRmFpbGVkIHRvIGdldCBXTklfQ0ZHX0hUX0NBUF9JTkZPIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJdUhUQ2FwYWJpbGl0eUluZm8ubkNmZ1ZhbHVlMTYgPSBuQ2ZnVmFsdWUgJiAweEZGRkY7CisJcm9hbV9vZmZsb2FkX3BhcmFtcy0+aHRfY2Fwc19pbmZvID0KKwkJdUhUQ2FwYWJpbGl0eUluZm8ubkNmZ1ZhbHVlMTYgJiAweEZGRkY7CisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19IVF9BTVBEVV9QQVJBTVMsICZuQ2ZnVmFsdWUpICE9CisJICAgIGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgV05JX0NGR19IVF9BTVBEVV9QQVJBTVMiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwkvKiB0U2lyTWFjSFRQYXJhbWV0ZXJzSW5mbyAqLworCW5DZmdWYWx1ZTggPSAodWludDhfdCkgbkNmZ1ZhbHVlOworCXJvYW1fb2ZmbG9hZF9wYXJhbXMtPmFtcGR1X3BhcmFtID0gKG5DZmdWYWx1ZTgpICYgMHhGRjsKKworCXZhbCA9IFJPQU1fT0ZGTE9BRF9OVU1fTUNTX1NFVDsKKwlpZiAod2xhbl9jZmdfZ2V0X3N0cihwTWFjLCBXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorCQkJICAgICAodWludDhfdCAqKSByb2FtX29mZmxvYWRfcGFyYW1zLT5tY3NzZXQsCisJCQkgICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgV05JX0NGR19TVVBQT1JURURfTUNTX1NFVCIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPLCAmbkNmZ1ZhbHVlKSAhPQorCSAgICBlU0lSX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfV01BLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJGYWlsZWQgdG8gZ2V0IFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyogdUhUQ2FwYWJpbGl0eUluZm8uZXh0SHRDYXBJbmZvICovCisJdUhUQ2FwYWJpbGl0eUluZm8ubkNmZ1ZhbHVlMTYgPSBuQ2ZnVmFsdWUgJiAweEZGRkY7CisJcm9hbV9vZmZsb2FkX3BhcmFtcy0+aHRfZXh0X2NhcCA9CisJCXVIVENhcGFiaWxpdHlJbmZvLm5DZmdWYWx1ZTE2ICYgMHhGRkZGOworCisJaWYgKHdsYW5fY2ZnX2dldF9pbnQocE1hYywgV05JX0NGR19UWF9CRl9DQVAsICZuQ2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgV05JX0NGR19UWF9CRl9DQVAiKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwkvKiB0U2lyTWFjVHhCRkNhcGFiaWxpdHlJbmZvICovCisJbkNmZ1ZhbHVlOCA9ICh1aW50OF90KSBuQ2ZnVmFsdWU7CisJcm9hbV9vZmZsb2FkX3BhcmFtcy0+aHRfdHhiZiA9IG5DZmdWYWx1ZTggJiAweEZGOworCWlmICh3bGFuX2NmZ19nZXRfaW50KHBNYWMsIFdOSV9DRkdfQVNfQ0FQLCAmbkNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKwkJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfV01BLCBDREZfVFJBQ0VfTEVWRUxfRVJST1IsCisJCQkgICJGYWlsZWQgdG8gZ2V0IFdOSV9DRkdfQVNfQ0FQIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJLyogdFNpck1hY0FTQ2FwYWJpbGl0eUluZm8gKi8KKwluQ2ZnVmFsdWU4ID0gKHVpbnQ4X3QpIG5DZmdWYWx1ZTsKKwlyb2FtX29mZmxvYWRfcGFyYW1zLT5hc2VsX2NhcCA9IG5DZmdWYWx1ZTggJiAweEZGOworCisJLyogUU9TIEluZm8gKi8KKwlpZiAod2xhbl9jZmdfZ2V0X2ludChwTWFjLCBXTklfQ0ZHX01BWF9TUF9MRU5HVEgsICZuQ2ZnVmFsdWUpICE9CisJICAgIGVTSVJfU1VDQ0VTUykgeworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgV05JX0NGR19NQVhfU1BfTEVOR1RIIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJbkNmZ1ZhbHVlOCA9ICh1aW50OF90KSBuQ2ZnVmFsdWU7CisJbWFjUW9zSW5mb1N0YS5tYXhTcExlbiA9IG5DZmdWYWx1ZTg7CisJbWFjUW9zSW5mb1N0YS5tb3JlRGF0YUFjayA9IDA7CisJbWFjUW9zSW5mb1N0YS5xYWNrID0gMDsKKwltYWNRb3NJbmZvU3RhLmFjYmVfdWFwc2QgPSByb2FtX3JlcS0+QWNVYXBzZC5hY2JlX3VhcHNkOworCW1hY1Fvc0luZm9TdGEuYWNia191YXBzZCA9IHJvYW1fcmVxLT5BY1VhcHNkLmFjYmtfdWFwc2Q7CisJbWFjUW9zSW5mb1N0YS5hY3ZpX3VhcHNkID0gcm9hbV9yZXEtPkFjVWFwc2QuYWN2aV91YXBzZDsKKwltYWNRb3NJbmZvU3RhLmFjdm9fdWFwc2QgPSByb2FtX3JlcS0+QWNVYXBzZC5hY3ZvX3VhcHNkOworCXBDZmdWYWx1ZTggPSAodWludDhfdCAqKSAmbWFjUW9zSW5mb1N0YTsKKwkvKiBtYWNRb3NJbmZvU3RhIE9ubHkgcXVldWVfcmVxdWVzdCBpcyBzZXQuUmVmZXIgdG8KKwkgKiBwb3B1bGF0ZV9kb3QxMWZfd21tX2NhcHMgZm9yIG1vcmUgZGV0YWlscworCSAqLworCXJvYW1fb2ZmbG9hZF9wYXJhbXMtPnFvc19jYXBzID0gKCpwQ2ZnVmFsdWU4KSAmIDB4RkY7CisJcm9hbV9vZmZsb2FkX3BhcmFtcy0+d21tX2NhcHMgPSAweDQgJiAweEZGOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3NldF9yaWNfcmVxKCkgLSBzZXQgcmljIHJlcXVlc3QgZWxlbWVudAorICogQHdtYTogd21hIGhhbmRsZQorICogQG1zZzogbWVzc2FnZQorICogQGlzX2FkZF90czogaXMgYWRkdHMgcmVxdWlyZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgcmljIHJlcXVlc3QgZWxlbWVudCBmb3IgMTFyIHJvYW1pbmcuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3NldF9yaWNfcmVxKHRwX3dtYV9oYW5kbGUgd21hLCB2b2lkICptc2csIHVpbnQ4X3QgaXNfYWRkX3RzKQoreworCXdtaV9yaWNfcmVxdWVzdF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9yaWNfdHNwZWMgKnRzcGVjX3BhcmFtOworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwl0U2lyTWFjVHNwZWNJRSAqcHRzcGVjSUU7CisJaW50MzJfdCBsZW4gPSBzaXplb2Yod21pX3JpY19yZXF1ZXN0X2ZpeGVkX3BhcmFtKSArCisJCSAgICAgIFdNSV9UTFZfSERSX1NJWkUgKyBzaXplb2Yod21pX3JpY190c3BlYyk7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HUCgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCisJY21kID0gKHdtaV9yaWNfcmVxdWVzdF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yaWNfcmVxdWVzdF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfcmljX3JlcXVlc3RfZml4ZWRfcGFyYW0pKTsKKwlpZiAoaXNfYWRkX3RzKQorCQljbWQtPnZkZXZfaWQgPSAoKHRBZGRUc1BhcmFtcyAqKSBtc2cpLT5zZXNzaW9uSWQ7CisJZWxzZQorCQljbWQtPnZkZXZfaWQgPSAoKHREZWxUc1BhcmFtcyAqKSBtc2cpLT5zZXNzaW9uSWQ7CisJY21kLT5udW1fcmljX3JlcXVlc3QgPSAxOyAgICAgICAvKiBUb2RheSB3ZSBhcmUgc2VuZGluZyBvbmx5IDEgcmljIGF0IG9uY2UgKi8KKwljbWQtPmlzX2FkZF9yaWMgPSBpc19hZGRfdHM7CisKKwlidWZfcHRyICs9IHNpemVvZih3bWlfcmljX3JlcXVlc3RfZml4ZWRfcGFyYW0pOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHNpemVvZih3bWlfcmljX3RzcGVjKSk7CisKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJdHNwZWNfcGFyYW0gPSAod21pX3JpY190c3BlYyAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZ0c3BlY19wYXJhbS0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JpY190c3BlYywKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfcmljX3RzcGVjKSk7CisKKwlpZiAoaXNfYWRkX3RzKQorCQlwdHNwZWNJRSA9ICYoKCh0QWRkVHNQYXJhbXMgKikgbXNnKS0+dHNwZWMpOworCWVsc2UKKwkJcHRzcGVjSUUgPSAmKCgodERlbFRzUGFyYW1zICopIG1zZyktPmRlbFRzSW5mby50c3BlYyk7CisKKwkvKiBGaWxsIHRoZSB0c2luZm8gaW4gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBmaXJtd2FyZSAqLworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKwljZGZfbWVtX2NvcHkoKCh1aW50OF90ICopICZ0c3BlY19wYXJhbS0+dHNfaW5mbykgKyAxLAorCQkgICAgICgodWludDhfdCAqKSAmcHRzcGVjSUUtPnRzaW5mbykgKyAxLCAyKTsKKyNlbHNlCisJY2RmX21lbV9jb3B5KCgodWludDhfdCAqKSAmdHNwZWNfcGFyYW0tPnRzX2luZm8pLAorCQkgICAgICgodWludDhfdCAqKSAmcHRzcGVjSUUtPnRzaW5mbykgKyAxLCAyKTsKKyNlbmRpZiAvKiBBTklfTElUVExFX0JJVF9FTkRJQU4gKi8KKworCXRzcGVjX3BhcmFtLT5ub21pbmFsX21zZHVfc2l6ZSA9IHB0c3BlY0lFLT5ub21Nc2R1U3o7CisJdHNwZWNfcGFyYW0tPm1heGltdW1fbXNkdV9zaXplID0gcHRzcGVjSUUtPm1heE1zZHVTejsKKwl0c3BlY19wYXJhbS0+bWluX3NlcnZpY2VfaW50ZXJ2YWwgPSBwdHNwZWNJRS0+bWluU3ZjSW50ZXJ2YWw7CisJdHNwZWNfcGFyYW0tPm1heF9zZXJ2aWNlX2ludGVydmFsID0gcHRzcGVjSUUtPm1heFN2Y0ludGVydmFsOworCXRzcGVjX3BhcmFtLT5pbmFjdGl2aXR5X2ludGVydmFsID0gcHRzcGVjSUUtPmluYWN0SW50ZXJ2YWw7CisJdHNwZWNfcGFyYW0tPnN1c3BlbnNpb25faW50ZXJ2YWwgPSBwdHNwZWNJRS0+c3VzcGVuZEludGVydmFsOworCXRzcGVjX3BhcmFtLT5zdmNfc3RhcnRfdGltZSA9IHB0c3BlY0lFLT5zdmNTdGFydFRpbWU7CisJdHNwZWNfcGFyYW0tPm1pbl9kYXRhX3JhdGUgPSBwdHNwZWNJRS0+bWluRGF0YVJhdGU7CisJdHNwZWNfcGFyYW0tPm1lYW5fZGF0YV9yYXRlID0gcHRzcGVjSUUtPm1lYW5EYXRhUmF0ZTsKKwl0c3BlY19wYXJhbS0+cGVha19kYXRhX3JhdGUgPSBwdHNwZWNJRS0+cGVha0RhdGFSYXRlOworCXRzcGVjX3BhcmFtLT5tYXhfYnVyc3Rfc2l6ZSA9IHB0c3BlY0lFLT5tYXhCdXJzdFN6OworCXRzcGVjX3BhcmFtLT5kZWxheV9ib3VuZCA9IHB0c3BlY0lFLT5kZWxheUJvdW5kOworCXRzcGVjX3BhcmFtLT5taW5fcGh5X3JhdGUgPSBwdHNwZWNJRS0+bWluUGh5UmF0ZTsKKwl0c3BlY19wYXJhbS0+c3VycGx1c19id19hbGxvd2FuY2UgPSBwdHNwZWNJRS0+c3VycGx1c0J3OworCXRzcGVjX3BhcmFtLT5tZWRpdW1fdGltZSA9IDA7CisKKwlXTUFfTE9HSSgiJXM6IFNldCBSSUMgUmVxIGlzX2FkZF90czolZCIsIF9fZnVuY19fLCBpc19hZGRfdHMpOworCisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJIFdNSV9ST0FNX1NFVF9SSUNfUkVRVUVTVF9DTURJRCkpIHsKKwkJV01BX0xPR1AoIiVzOiBGYWlsZWQgdG8gc2VuZCB2ZGV2IFNldCBSSUMgUmVxIGNvbW1hbmQiLAorCQkJIF9fZnVuY19fKTsKKwkJaWYgKGlzX2FkZF90cykKKwkJCSgodEFkZFRzUGFyYW1zICopIG1zZyktPnN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJfQorfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9ST0FNX09GRkxPQUQgKi8KKworLyoqCisgKiB3bWFfcHJvY2Vzc191bml0X3Rlc3RfY21kKCkgLSBzZW5kIHVuaXQgdGVzdCBjb21tYW5kIHRvIGZ3LgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQHdtYV91dGVzdDogdW5pdCB0ZXN0IGNvbW1hbmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmQgdW5pdCB0ZXN0IGNvbW1hbmQgdG8gZncuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3Byb2Nlc3NfdW5pdF90ZXN0X2NtZChXTUFfSEFORExFIGhhbmRsZSwKKwkJCSAgICAgICB0X3dtYV91bml0X3Rlc3RfY21kICp3bWFfdXRlc3QpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwl3bWlfdW5pdF90ZXN0X2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCB3bWlfYnVmOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJaW50IGk7CisJdWludDE2X3QgbGVuLCBhcmdzX3Rsdl9sZW47CisJQV9VSU5UMzIgKnVuaXRfdGVzdF9jbWRfYXJnczsKKworCWFyZ3NfdGx2X2xlbiA9CisJCVdNSV9UTFZfSERSX1NJWkUgKyB3bWFfdXRlc3QtPm51bV9hcmdzICogc2l6ZW9mKEFfVUlOVDMyKTsKKwlsZW4gPSBzaXplb2Yod21pX3VuaXRfdGVzdF9jbWRfZml4ZWRfcGFyYW0pICsgYXJnc190bHZfbGVuOworCWlmICghd21hX2hhbmRsZSB8fCAhd21hX2hhbmRsZS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBpcyBjbG9zZWQsIGNhbiBub3QgaXNzdWUgZncgdW5pdCB0ZXN0IGNtZCIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXdtaV9idWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCF3bWlfYnVmKSB7CisJCVdNQV9MT0dFKCIlczogd21haV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJY21kID0gKHdtaV91bml0X3Rlc3RfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgY21kOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV91bml0X3Rlc3RfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKHdtaV91bml0X3Rlc3RfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gd21hX3V0ZXN0LT52ZGV2X2lkOworCWNtZC0+bW9kdWxlX2lkID0gd21hX3V0ZXN0LT5tb2R1bGVfaWQ7CisJY21kLT5udW1fYXJncyA9IHdtYV91dGVzdC0+bnVtX2FyZ3M7CisJYnVmX3B0ciArPSBzaXplb2Yod21pX3VuaXRfdGVzdF9jbWRfZml4ZWRfcGFyYW0pOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLAorCQkgICAgICAgKHdtYV91dGVzdC0+bnVtX2FyZ3MgKiBzaXplb2YodWludDMyX3QpKSk7CisJdW5pdF90ZXN0X2NtZF9hcmdzID0gKEFfVUlOVDMyICopIChidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisJV01BX0xPR0koIiVzOiAlZCBudW0gb2YgYXJncyA9ICIsIF9fZnVuY19fLCB3bWFfdXRlc3QtPm51bV9hcmdzKTsKKwlmb3IgKGkgPSAwOyAoaSA8IHdtYV91dGVzdC0+bnVtX2FyZ3MgJiYgaSA8IFdNQV9NQVhfTlVNX0FSR1MpOyBpKyspIHsKKwkJdW5pdF90ZXN0X2NtZF9hcmdzW2ldID0gd21hX3V0ZXN0LT5hcmdzW2ldOworCQlXTUFfTE9HSSgiJWQsIiwgd21hX3V0ZXN0LT5hcmdzW2ldKTsKKwl9CisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIHdtaV9idWYsIGxlbiwKKwkJCQkgV01JX1VOSVRfVEVTVF9DTURJRCkpIHsKKwkJV01BX0xPR1AoIiVzOiBmYWlsZWQgdG8gc2VuZCB1bml0IHRlc3QgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZSh3bWlfYnVmKTsKKwkJcmV0dXJuOworCX0KKwlyZXR1cm47Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisKKy8qKgorICogd21hX3JvYW1faG9fZmFpbF9oYW5kbGVyKCkgLSBMRlIzLjAgcm9hbSBoYW5kIG9mZiBmYWlsZWQgaGFuZGxlcgorICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX3JvYW1faG9fZmFpbF9oYW5kbGVyKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50MzJfdCB2ZGV2X2lkKQoreworCXRTaXJTbWVIT0ZhaWx1cmVJbmQgKmhvX2ZhaWx1cmVfaW5kOworCWNkc19tc2dfdCBzbWVfbXNnID0geyAwIH07CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCisJaG9fZmFpbHVyZV9pbmQgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclNtZUhPRmFpbHVyZUluZCkpOworCisJaWYgKE5VTEwgPT0gaG9fZmFpbHVyZV9pbmQpIHsKKwkJV01BX0xPR0UoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWhvX2ZhaWx1cmVfaW5kLT5zZXNzaW9uSWQgPSB2ZGV2X2lkOworCXNtZV9tc2cudHlwZSA9IGVXTklfU01FX0hPX0ZBSUxfSU5EOworCXNtZV9tc2cuYm9keXB0ciA9IGhvX2ZhaWx1cmVfaW5kOworCXNtZV9tc2cuYm9keXZhbCA9IDA7CisKKwljZGZfc3RhdHVzID0gY2RzX21xX3Bvc3RfbWVzc2FnZShDREZfTU9EVUxFX0lEX1NNRSwgJnNtZV9tc2cpOworCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCVdNQV9MT0dFKCJGYWlsIHRvIHBvc3QgZVdOSV9TTUVfSE9fRkFJTF9JTkQgbXNnIHRvIFNNRSIpOworCQljZGZfbWVtX2ZyZWUoaG9fZmFpbHVyZV9pbmQpOworCQlyZXR1cm47CisJfQorCXJldHVybjsKK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc19yb2FtX3N5bmNoX2NvbXBsZXRlKCkgLSByb2FtIHN5bmNoIGNvbXBsZXRlIGNvbW1hbmQgdG8gZncuCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAc3luY2hjbmY6IG9mZmxvYWQgc3luY2ggY29uZmlybWF0aW9uIHBhcmFtcworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgcm9hbSBzeW5jaCBjb21wbGV0ZSBldmVudCB0byBmdy4KKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfcHJvY2Vzc19yb2FtX3N5bmNoX2NvbXBsZXRlKFdNQV9IQU5ETEUgaGFuZGxlLAorCQkJCSAgICAgdFNpclNtZVJvYW1PZmZsb2FkU3luY2hDbmYgKnN5bmNoY25mKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJd21pX3JvYW1fc3luY2hfY29tcGxldGVfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3Qgd21pX2J1ZjsKKwl1aW50OF90ICpidWZfcHRyOworCXVpbnQxNl90IGxlbjsKKwlib29sIHJvYW1fc3luY2hfaW5fcHJvZ3Jlc3M7CisJbGVuID0gc2l6ZW9mKHdtaV9yb2FtX3N5bmNoX2NvbXBsZXRlX2ZpeGVkX3BhcmFtKTsKKworCWlmICghd21hX2hhbmRsZSB8fCAhd21hX2hhbmRsZS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBpcyBjbG9zZWQsIGNhbiBub3QgaXNzdWUgcm9hbSBzeW5jaCBjbmYiLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlyb2FtX3N5bmNoX2luX3Byb2dyZXNzID0KKwkJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tzeW5jaGNuZi0+c2Vzc2lvbklkXS5yb2FtX3N5bmNoX2luX3Byb2dyZXNzOworCWlmIChyb2FtX3N5bmNoX2luX3Byb2dyZXNzID09IGZhbHNlKSB7CisJCVdNQV9MT0dFKCIlczogRG9udCBzZW5kIHJvYW0gc3luY2ggY29tcGxldGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQl3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW3N5bmNoY25mLT5zZXNzaW9uSWRdLnJvYW1fc3luY2hfaW5fcHJvZ3Jlc3MgPQorCQkJZmFsc2U7CisJfQorCXdtaV9idWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCF3bWlfYnVmKSB7CisJCVdNQV9MT0dFKCIlczogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJY21kID0gKHdtaV9yb2FtX3N5bmNoX2NvbXBsZXRlX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgY21kOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX3N5bmNoX2NvbXBsZXRlX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9yb2FtX3N5bmNoX2NvbXBsZXRlX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gc3luY2hjbmYtPnNlc3Npb25JZDsKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgd21pX2J1ZiwgbGVuLAorCQkJCSBXTUlfUk9BTV9TWU5DSF9DT01QTEVURSkpIHsKKwkJV01BX0xPR1AoIiVzOiBmYWlsZWQgdG8gc2VuZCByb2FtIHN5bmNoIGNvbmZpcm1hdGlvbiIsCisJCQkgX19mdW5jX18pOworCQljZGZfbmJ1Zl9mcmVlKHdtaV9idWYpOworCQlyZXR1cm47CisJfQorCXJldHVybjsKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FEICovCisKKy8qKgorICogd21hX3NldF9jaGFubmVsKCkgLSBzZXQgY2hhbm5lbAorICogQHdtYTogd21hIGhhbmRsZQorICogQHBhcmFtczogc3dpdGNoIGNoYW5uZWwgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9zZXRfY2hhbm5lbCh0cF93bWFfaGFuZGxlIHdtYSwgdHBTd2l0Y2hDaGFubmVsUGFyYW1zIHBhcmFtcykKK3sKKwlzdHJ1Y3Qgd21hX3ZkZXZfc3RhcnRfcmVxIHJlcTsKKwlzdHJ1Y3Qgd21hX3RhcmdldF9yZXEgKm1zZzsKKwlDREZfU1RBVFVTIHN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl1aW50OF90IHZkZXZfaWQsIHBlZXJfaWQ7CisJb2xfdHhyeF9wZWVyX2hhbmRsZSBwZWVyOworCW9sX3R4cnhfcGRldl9oYW5kbGUgcGRldjsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqaW50ciA9IHdtYS0+aW50ZXJmYWNlczsKKwlzdHJ1Y3Qgc2lyX2h3X21vZGVfcGFyYW1zIGh3X21vZGUgPSB7MH07CisKKwlXTUFfTE9HRCgiJXM6IEVudGVyIiwgX19mdW5jX18pOworCWlmICghd21hX2ZpbmRfdmRldl9ieV9hZGRyKHdtYSwgcGFyYW1zLT5zZWxmU3RhTWFjQWRkciwgJnZkZXZfaWQpKSB7CisJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIGZpbmQgdmRldiBpZCBmb3IgJXBNIiwKKwkJCSBfX2Z1bmNfXywgcGFyYW1zLT5zZWxmU3RhTWFjQWRkcik7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIHNlbmRfcmVzcDsKKwl9CisJcGRldiA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1RYUlgpOworCWlmIChOVUxMID09IHBkZXYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHBkZXYiLCBfX2Z1bmNfXyk7CisJCXN0YXR1cyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCQlnb3RvIHNlbmRfcmVzcDsKKwl9CisKKwlwZWVyID0gb2xfdHhyeF9maW5kX3BlZXJfYnlfYWRkcihwZGV2LCBpbnRyW3ZkZXZfaWRdLmJzc2lkLCAmcGVlcl9pZCk7CisKKwkvKgorCSAqIFJvYW0gb2ZmbG9hZCBmZWF0dXJlIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBvbmx5IGluIFNUQSBtb2RlLiBPdGhlciBtb2RlcyBzdGlsbCByZXF1aXJlCisJICogdG8gaXNzdWUgYSBWZGV2IFN0YXJ0L1ZkZXYgUmVzdGFydCBmb3IKKwkgKiBjaGFubmVsIGNoYW5nZS4KKwkgKi8KKwlpZiAoKCh3bWEtPmludGVyZmFjZXNbdmRldl9pZF0udHlwZSA9PSBXTUlfVkRFVl9UWVBFX1NUQSkgJiYKKwkgICAgICh3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uc3ViX3R5cGUgPT0gMCkpICYmCisJICAgICF3bWEtPmludGVyZmFjZXNbdmRldl9pZF0uaXNfY2hhbm5lbF9zd2l0Y2gpIHsKKworCQlpZiAocGVlciAmJiAocGVlci0+c3RhdGUgPT0gb2xfdHhyeF9wZWVyX3N0YXRlX2Nvbm4gfHwKKwkJCSAgICAgcGVlci0+c3RhdGUgPT0gb2xfdHhyeF9wZWVyX3N0YXRlX2F1dGgpKSB7CisJCQkvKiBUcnlpbmcgdG8gY2hhbmdlIGNoYW5uZWwgd2hpbGUgY29ubmVjdGVkCisJCQkgKiBzaG91bGQgbm90IGludm9rZSBWREVWX1NUQVJULgorCQkJICogSW5zdGVhZCwgdXNlIHN0YXJ0IHNjYW4gY29tbWFuZCBpbiBwYXNzaXZlCisJCQkgKiBtb2RlIHRvIHBhcmsgc3RhdGlvbiBvbiB0aGF0IGNoYW5uZWwKKwkJCSAqLworCQkJV01BX0xPR0koIiVzOiBjYWxsaW5nIHNldF9zY2FuLCBzdGF0ZSAweCV4IiwKKwkJCQkgX19mdW5jX18sIHdtYS0+cm9hbV9wcmVhdXRoX3NjYW5fc3RhdGUpOworCQkJaWYgKHdtYS0+cm9hbV9wcmVhdXRoX3NjYW5fc3RhdGUgPT0KKwkJCSAgICBXTUFfUk9BTV9QUkVBVVRIX0NIQU5fTk9ORSkgeworCQkJCS8qIElzIGNoYW5uZWwgY2hhbmdlIHJlcXVpcmVkPworCQkJCSAqLworCQkJCWlmIChjZHNfY2hhbl90b19mcmVxKHBhcmFtcy0+Y2hhbm5lbE51bWJlcikgIT0KKwkJCQkgICAgd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLm1oeikgeworCQkJCQlzdGF0dXMgPSB3bWFfcm9hbV9wcmVhdXRoX2NoYW5fc2V0KHdtYSwKKwkJCQkJCQkJCSAgIHBhcmFtcywKKwkJCQkJCQkJCSAgIHZkZXZfaWQpOworCQkJCQkvKiByZXNwb25zZSB3aWxsIGJlIGFzeW5jaHJvbm91cyAqLworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfSBlbHNlIGlmICh3bWEtPnJvYW1fcHJlYXV0aF9zY2FuX3N0YXRlID09CisJCQkJICAgV01BX1JPQU1fUFJFQVVUSF9DSEFOX1JFUVVFU1RFRCB8fAorCQkJCSAgIHdtYS0+cm9hbV9wcmVhdXRoX3NjYW5fc3RhdGUgPT0KKwkJCQkgICBXTUFfUk9BTV9QUkVBVVRIX09OX0NIQU4pIHsKKwkJCQlzdGF0dXMgPQorCQkJCQl3bWFfcm9hbV9wcmVhdXRoX2NoYW5fY2FuY2VsKHdtYSwgcGFyYW1zLAorCQkJCQkJCQkgICAgIHZkZXZfaWQpOworCQkJCS8qIHJlc3BvbnNlIHdpbGwgYmUgYXN5bmNocm9ub3VzICovCisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh3bWEtPnJvYW1fcHJlYXV0aF9zY2FuX3N0YXRlID09CisJCQkJICAgV01BX1JPQU1fUFJFQVVUSF9DSEFOX0NPTVBMRVRFRCkgeworCQkJCS8qIEFscmVhZHkgYmFjayBvbiBob21lIGNoYW5uZWwuIENvbXBsZXRlIHRoZSByZXF1ZXN0ICovCisJCQkJd21hLT5yb2FtX3ByZWF1dGhfc2Nhbl9zdGF0ZSA9CisJCQkJCVdNQV9ST0FNX1BSRUFVVEhfQ0hBTl9OT05FOworCQkJCXN0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwkJCX0KKwkJCWdvdG8gc2VuZF9yZXNwOworCQl9CisJfQorCWNkZl9tZW1femVybygmcmVxLCBzaXplb2YocmVxKSk7CisJcmVxLnZkZXZfaWQgPSB2ZGV2X2lkOworCW1zZyA9IHdtYV9maWxsX3ZkZXZfcmVxKHdtYSwgcmVxLnZkZXZfaWQsIFdNQV9DSE5MX1NXSVRDSF9SRVEsCisJCQkJV01BX1RBUkdFVF9SRVFfVFlQRV9WREVWX1NUQVJULCBwYXJhbXMsCisJCQkJV01BX1ZERVZfU1RBUlRfUkVRVUVTVF9USU1FT1VUKTsKKwlpZiAoIW1zZykgeworCQlXTUFfTE9HUCgiJXM6IEZhaWxlZCB0byBmaWxsIGNoYW5uZWwgc3dpdGNoIHJlcXVlc3QgZm9yIHZkZXYgJWQiLAorCQkJX19mdW5jX18sIHJlcS52ZGV2X2lkKTsKKwkJc3RhdHVzID0gQ0RGX1NUQVRVU19FX05PTUVNOworCQlnb3RvIHNlbmRfcmVzcDsKKwl9CisJcmVxLmNoYW4gPSBwYXJhbXMtPmNoYW5uZWxOdW1iZXI7CisJcmVxLmNoYW5fd2lkdGggPSBwYXJhbXMtPmNoX3dpZHRoOworCXJlcS52aHRfY2FwYWJsZSA9IHBhcmFtcy0+dmh0Q2FwYWJsZTsKKwlyZXEuY2hfY2VudGVyX2ZyZXFfc2VnMCA9IHBhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMDsKKwlyZXEuY2hfY2VudGVyX2ZyZXFfc2VnMSA9IHBhcmFtcy0+Y2hfY2VudGVyX2ZyZXFfc2VnMTsKKwlyZXEuZG90MTFfbW9kZSA9IHBhcmFtcy0+ZG90MTFfbW9kZTsKKwlzdGF0dXMgPSB3bWFfZ2V0X2N1cnJlbnRfaHdfbW9kZSgmaHdfbW9kZSk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwkJV01BX0xPR0UoIndtYV9nZXRfY3VycmVudF9od19tb2RlIGZhaWxlZCIpOworCisJaWYgKChwYXJhbXMtPm5zcyA9PSAyKSAmJiAhaHdfbW9kZS5kYnNfY2FwKSB7CisJCXJlcS5wcmVmZXJyZWRfcnhfc3RyZWFtcyA9IDI7CisJCXJlcS5wcmVmZXJyZWRfdHhfc3RyZWFtcyA9IDI7CisJfSBlbHNlIHsKKwkJcmVxLnByZWZlcnJlZF9yeF9zdHJlYW1zID0gMTsKKwkJcmVxLnByZWZlcnJlZF90eF9zdHJlYW1zID0gMTsKKwl9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJCisJcmVxLm1heF90eHBvdyA9IHBhcmFtcy0+bWF4VHhQb3dlcjsKKyNlbHNlCisJcmVxLm1heF90eHBvdyA9IHBhcmFtcy0+bG9jYWxQb3dlckNvbnN0cmFpbnQ7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSSAqLworCXJlcS5iZWFjb25faW50dmFsID0gMTAwOworCXJlcS5kdGltX3BlcmlvZCA9IDE7CisJcmVxLmlzX2RmcyA9IHBhcmFtcy0+aXNEZnNDaGFubmVsOworCisJLyogSW4gY2FzZSBvZiBBUCBtb2RlLCBvbmNlIHJhZGFyIGlzIGRldGVjdGVkLCB3ZSBuZWVkIHRvCisJICogaXNzdXNlIFZERVYgUkVTVEFSVCwgc28gd2UgbWFraW5nIGlzX2NoYW5uZWxfc3dpdGNoIGFzCisJICogdHJ1ZQorCSAqLworCWlmICgod21hX2lzX3ZkZXZfaW5fYXBfbW9kZSh3bWEsIHJlcS52ZGV2X2lkKSA9PSB0cnVlKSB8fAorCQkocGFyYW1zLT5yZXN0YXJ0X29uX2NoYW5fc3dpdGNoID09IHRydWUpKQorCQl3bWEtPmludGVyZmFjZXNbcmVxLnZkZXZfaWRdLmlzX2NoYW5uZWxfc3dpdGNoID0gdHJ1ZTsKKworCXN0YXR1cyA9IHdtYV92ZGV2X3N0YXJ0KHdtYSwgJnJlcSwKKwkJCQl3bWEtPmludGVyZmFjZXNbcmVxLnZkZXZfaWRdLmlzX2NoYW5uZWxfc3dpdGNoKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQl3bWFfcmVtb3ZlX3ZkZXZfcmVxKHdtYSwgcmVxLnZkZXZfaWQsCisJCQkJICAgIFdNQV9UQVJHRVRfUkVRX1RZUEVfVkRFVl9TVEFSVCk7CisJCVdNQV9MT0dQKCIlczogdmRldiBzdGFydCBmYWlsZWQgc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJZ290byBzZW5kX3Jlc3A7CisJfQorCisJaWYgKHdtYS0+aW50ZXJmYWNlc1tyZXEudmRldl9pZF0uaXNfY2hhbm5lbF9zd2l0Y2gpCisJCXdtYS0+aW50ZXJmYWNlc1tyZXEudmRldl9pZF0uaXNfY2hhbm5lbF9zd2l0Y2ggPSBmYWxzZTsKKwlyZXR1cm47CitzZW5kX3Jlc3A6CisJV01BX0xPR0QoIiVzOiBjaGFubmVsICVkIGNoX3dpZHRoICVkIHR4cG93ZXIgJWQgc3RhdHVzICVkIiwgX19mdW5jX18sCisJCSBwYXJhbXMtPmNoYW5uZWxOdW1iZXIsIHBhcmFtcy0+Y2hfd2lkdGgsCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCQkgcGFyYW1zLT5tYXhUeFBvd2VyLAorI2Vsc2UKKwkJIHBhcmFtcy0+bG9jYWxQb3dlckNvbnN0cmFpbnQsCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSSAqLworCQkgc3RhdHVzKTsKKwlwYXJhbXMtPnN0YXR1cyA9IHN0YXR1czsKKwlXTUFfTE9HSSgiJXM6IHNlbmRpbmcgV01BX1NXSVRDSF9DSEFOTkVMX1JTUCwgc3RhdHVzID0gMHgleCIsCisJCSBfX2Z1bmNfXywgc3RhdHVzKTsKKwl3bWFfc2VuZF9tc2cod21hLCBXTUFfU1dJVENIX0NIQU5ORUxfUlNQLCAodm9pZCAqKXBhcmFtcywgMCk7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworLyoqCisgKiB3bWFfcG5vX3N0YXJ0KCkgLSBQTk8gc3RhcnQgcmVxdWVzdAorICogQHdtYTogd21hIGhhbmRsZQorICogQHBubzogUE5PIHJlcXVlc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcXVlc3QgRlcgdG8gc3RhcnQgUE5PIHJlcXVlc3QuCisgKiBSZXF1ZXN0OiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3Bub19zdGFydCh0cF93bWFfaGFuZGxlIHdtYSwgdHBTaXJQTk9TY2FuUmVxIHBubykKK3sKKwl3bWlfbmxvX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwlubG9fY29uZmlndXJlZF9wYXJhbWV0ZXJzICpubG9fbGlzdDsKKwl1aW50MzJfdCAqY2hhbm5lbF9saXN0OworCWludDMyX3QgbGVuOworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50OF90IGk7CisJaW50IHJldDsKKworCVdNQV9MT0dEKCJQTk8gU3RhcnQiKTsKKworCWxlbiA9IHNpemVvZigqY21kKSArIFdNSV9UTFZfSERSX1NJWkUgKyAvKiBUTFYgcGxhY2UgaG9sZGVyIGZvciBhcnJheSBvZiBzdHJ1Y3R1cmVzIG5sb19jb25maWd1cmVkX3BhcmFtZXRlcnMobmxvX2xpc3QpICovCisJICAgICAgV01JX1RMVl9IRFJfU0laRTsgLyogVExWIHBsYWNlIGhvbGRlciBmb3IgYXJyYXkgb2YgdWludDMyX3QgY2hhbm5lbF9saXN0ICovCisKKwlsZW4gKz0gc2l6ZW9mKHVpbnQzMl90KSAqIENERl9NSU4ocG5vLT5hTmV0d29ya3NbMF0udWNDaGFubmVsQ291bnQsCisJCQkJCSAgV01JX05MT19NQVhfQ0hBTik7CisJbGVuICs9IHNpemVvZihubG9fY29uZmlndXJlZF9wYXJhbWV0ZXJzKSAqCisJICAgICAgIENERl9NSU4ocG5vLT51Y05ldHdvcmtzQ291bnQsIFdNSV9OTE9fTUFYX1NTSURTKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIGFsbG9jYXRlIHdtaSBidWZmZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY21kID0gKHdtaV9ubG9fY29uZmlnX2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSBjbWQ7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX25sb19jb25maWdfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9ubG9fY29uZmlnX2NtZF9maXhlZF9wYXJhbSkpOworCWNtZC0+dmRldl9pZCA9IHBuby0+c2Vzc2lvbklkOworCWNtZC0+ZmxhZ3MgPSBXTUlfTkxPX0NPTkZJR19TVEFSVCB8IFdNSV9OTE9fQ09ORklHX1NTSURfSElERV9FTjsKKworCS8qIENvcHkgc2NhbiBpbnRlcnZhbCAqLworCWlmIChwbm8tPnNjYW5UaW1lcnMudWNTY2FuVGltZXJzQ291bnQpIHsKKwkJY21kLT5mYXN0X3NjYW5fcGVyaW9kID0KKwkJCVdNQV9TRUNfVE9fTVNFQyhwbm8tPnNjYW5UaW1lcnMuYVRpbWVyVmFsdWVzWzBdLgorCQkJCQl1VGltZXJWYWx1ZSk7CisJCWNtZC0+c2xvd19zY2FuX3BlcmlvZCA9IGNtZC0+ZmFzdF9zY2FuX3BlcmlvZDsKKwkJV01BX0xPR0QoIlNjYW4gcGVyaW9kIDogJWQgbXNlYyIsIGNtZC0+c2xvd19zY2FuX3BlcmlvZCk7CisJfQorCisJYnVmX3B0ciArPSBzaXplb2Yod21pX25sb19jb25maWdfY21kX2ZpeGVkX3BhcmFtKTsKKworCWNtZC0+bm9fb2Zfc3NpZHMgPSBDREZfTUlOKHBuby0+dWNOZXR3b3Jrc0NvdW50LCBXTUlfTkxPX01BWF9TU0lEUyk7CisJV01BX0xPR0QoIlNTSUQgY291bnQgOiAlZCIsIGNtZC0+bm9fb2Zfc3NpZHMpOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCSAgICAgICBjbWQtPm5vX29mX3NzaWRzICogc2l6ZW9mKG5sb19jb25maWd1cmVkX3BhcmFtZXRlcnMpKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisKKwlubG9fbGlzdCA9IChubG9fY29uZmlndXJlZF9wYXJhbWV0ZXJzICopIGJ1Zl9wdHI7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+bm9fb2Zfc3NpZHM7IGkrKykgeworCQlXTUlUTFZfU0VUX0hEUigmbmxvX2xpc3RbaV0udGx2X2hlYWRlciwKKwkJCSAgICAgICBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsCisJCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkJICAgICAgIChubG9fY29uZmlndXJlZF9wYXJhbWV0ZXJzKSk7CisJCS8qIENvcHkgc3NpZCBhbmQgaXQncyBsZW5ndGggKi8KKwkJbmxvX2xpc3RbaV0uc3NpZC52YWxpZCA9IHRydWU7CisJCW5sb19saXN0W2ldLnNzaWQuc3NpZC5zc2lkX2xlbiA9IHBuby0+YU5ldHdvcmtzW2ldLnNzSWQubGVuZ3RoOworCQljZGZfbWVtX2NvcHkobmxvX2xpc3RbaV0uc3NpZC5zc2lkLnNzaWQsCisJCQkgICAgIHBuby0+YU5ldHdvcmtzW2ldLnNzSWQuc3NJZCwKKwkJCSAgICAgbmxvX2xpc3RbaV0uc3NpZC5zc2lkLnNzaWRfbGVuKTsKKwkJV01BX0xPR0QoImluZGV4OiAlZCBzc2lkOiAlLipzIGxlbjogJWQiLCBpLAorCQkJIG5sb19saXN0W2ldLnNzaWQuc3NpZC5zc2lkX2xlbiwKKwkJCSAoY2hhciAqKW5sb19saXN0W2ldLnNzaWQuc3NpZC5zc2lkLAorCQkJIG5sb19saXN0W2ldLnNzaWQuc3NpZC5zc2lkX2xlbik7CisKKwkJLyogQ29weSByc3NpIHRocmVzaG9sZCAqLworCQlpZiAocG5vLT5hTmV0d29ya3NbaV0ucnNzaVRocmVzaG9sZCAmJgorCQkgICAgcG5vLT5hTmV0d29ya3NbaV0ucnNzaVRocmVzaG9sZCA+IFdNQV9SU1NJX1RIT0xEX0RFRkFVTFQpIHsKKwkJCW5sb19saXN0W2ldLnJzc2lfY29uZC52YWxpZCA9IHRydWU7CisJCQlubG9fbGlzdFtpXS5yc3NpX2NvbmQucnNzaSA9CisJCQkJcG5vLT5hTmV0d29ya3NbaV0ucnNzaVRocmVzaG9sZDsKKwkJCVdNQV9MT0dEKCJSU1NJIHRocmVzaG9sZCA6ICVkIGRCbSIsCisJCQkJIG5sb19saXN0W2ldLnJzc2lfY29uZC5yc3NpKTsKKwkJfQorCQlubG9fbGlzdFtpXS5iY2FzdF9ud190eXBlLnZhbGlkID0gdHJ1ZTsKKwkJbmxvX2xpc3RbaV0uYmNhc3RfbndfdHlwZS5iY2FzdF9ud190eXBlID0KKwkJCXBuby0+YU5ldHdvcmtzW2ldLmJjYXN0TmV0d1R5cGU7CisJCVdNQV9MT0dJKCJCcm9hZGNhc3QgTlcgdHlwZSAoJXUpIiwKKwkJCSBubG9fbGlzdFtpXS5iY2FzdF9ud190eXBlLmJjYXN0X253X3R5cGUpOworCX0KKwlidWZfcHRyICs9IGNtZC0+bm9fb2Zfc3NpZHMgKiBzaXplb2YobmxvX2NvbmZpZ3VyZWRfcGFyYW1ldGVycyk7CisKKwkvKiBDb3B5IGNoYW5uZWwgaW5mbyAqLworCWNtZC0+bnVtX29mX2NoYW5uZWxzID0gQ0RGX01JTihwbm8tPmFOZXR3b3Jrc1swXS51Y0NoYW5uZWxDb3VudCwKKwkJCQkgICAgICAgV01JX05MT19NQVhfQ0hBTik7CisJV01BX0xPR0QoIkNoYW5uZWwgY291bnQ6ICVkIiwgY21kLT5udW1fb2ZfY2hhbm5lbHMpOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLAorCQkgICAgICAgKGNtZC0+bnVtX29mX2NoYW5uZWxzICogc2l6ZW9mKHVpbnQzMl90KSkpOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKworCWNoYW5uZWxfbGlzdCA9ICh1aW50MzJfdCAqKSBidWZfcHRyOworCWZvciAoaSA9IDA7IGkgPCBjbWQtPm51bV9vZl9jaGFubmVsczsgaSsrKSB7CisJCWNoYW5uZWxfbGlzdFtpXSA9IHBuby0+YU5ldHdvcmtzWzBdLmFDaGFubmVsc1tpXTsKKworCQlpZiAoY2hhbm5lbF9saXN0W2ldIDwgV01BX05MT19GUkVRX1RIUkVTSCkKKwkJCWNoYW5uZWxfbGlzdFtpXSA9IGNkc19jaGFuX3RvX2ZyZXEoY2hhbm5lbF9saXN0W2ldKTsKKworCQlXTUFfTE9HRCgiQ2hbJWRdOiAlZCBNSHoiLCBpLCBjaGFubmVsX2xpc3RbaV0pOworCX0KKwlidWZfcHRyICs9IGNtZC0+bnVtX29mX2NoYW5uZWxzICogc2l6ZW9mKHVpbnQzMl90KTsKKworCS8qIFRPRE86IERpc2NyZXRlIGZpcm13YXJlIGRvZXNuJ3QgaGF2ZSBjb21tYW5kL29wdGlvbiB0byBjb25maWd1cmUKKwkgKiBBcHAgSUUgd2hpY2ggY29tZXMgZnJvbSB3cGFfc3VwcGxpY2FudCBhcyBvZiBwYXJ0IFBOTyBzdGFydCByZXF1ZXN0LgorCSAqLworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX05FVFdPUktfTElTVF9PRkZMT0FEX0NPTkZJR19DTURJRCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZW5kIG5sbyB3bWkgY21kIiwgX19mdW5jX18pOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXdtYS0+aW50ZXJmYWNlc1twbm8tPnNlc3Npb25JZF0ucG5vX2luX3Byb2dyZXNzID0gdHJ1ZTsKKworCVdNQV9MT0dEKCJQTk8gc3RhcnQgcmVxdWVzdCBzZW50IHN1Y2Nlc3NmdWxseSBmb3IgdmRldiAlZCIsCisJCSBwbm8tPnNlc3Npb25JZCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9wbm9fc3RvcCgpIC0gUE5PIHN0b3AgcmVxdWVzdAorICogQHdtYTogd21hIGhhbmRsZQorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcXVlc3QgRlcgdG8gc3RvcCBvbmdvaW5nIFBOTyBvcGVyYXRpb24uCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3Bub19zdG9wKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IHZkZXZfaWQpCit7CisJd21pX25sb19jb25maWdfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJaW50MzJfdCBsZW4gPSBzaXplb2YoKmNtZCk7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50OF90ICpidWZfcHRyOworCWludCByZXQ7CisKKwlpZiAoIXdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5wbm9faW5fcHJvZ3Jlc3MpIHsKKwkJV01BX0xPR0QoIk5vIGFjdGl2ZSBwbm8gc2Vzc2lvbiBmb3VuZCBmb3IgdmRldiAlZCwgc2tpcCBwbm8gc3RvcCByZXF1ZXN0IiwKKwkJCXZkZXZfaWQpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCX0KKworCVdNQV9MT0dEKCJQTk8gU3RvcCIpOworCisJbGVuICs9IFdNSV9UTFZfSERSX1NJWkUgKyAvKiBUTFYgcGxhY2UgaG9sZGVyIGZvciBhcnJheSBvZiBzdHJ1Y3R1cmVzIG5sb19jb25maWd1cmVkX3BhcmFtZXRlcnMobmxvX2xpc3QpICovCisJICAgICAgIFdNSV9UTFZfSERSX1NJWkU7ICAvKiBUTFYgcGxhY2UgaG9sZGVyIGZvciBhcnJheSBvZiB1aW50MzJfdCBjaGFubmVsX2xpc3QgKi8KKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCBhbGxvY2F0ZSB3bWkgYnVmZmVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNtZCA9ICh3bWlfbmxvX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJYnVmX3B0ciA9ICh1aW50OF90ICopIGNtZDsKKworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ubG9fY29uZmlnX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfbmxvX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+dmRldl9pZCA9IHZkZXZfaWQ7CisJY21kLT5mbGFncyA9IFdNSV9OTE9fQ09ORklHX1NUT1A7CisJYnVmX3B0ciArPSBzaXplb2YoKmNtZCk7CisKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCAwKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwgMCk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFOworCisJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgICBXTUlfTkVUV09SS19MSVNUX09GRkxPQURfQ09ORklHX0NNRElEKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNlbmQgbmxvIHdtaSBjbWQiLCBfX2Z1bmNfXyk7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnBub19pbl9wcm9ncmVzcyA9IGZhbHNlOworCisJV01BX0xPR0QoIlBOTyBzdG9wIHJlcXVlc3Qgc2VudCBzdWNjZXNzZnVsbHkgZm9yIHZkZXYgJWQiLCB2ZGV2X2lkKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2NvbmZpZ19wbm8oKSAtIGNvbmZpZyBQTk8KKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwbm86IFBOTyByZXF1ZXN0IHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfY29uZmlnX3Bubyh0cF93bWFfaGFuZGxlIHdtYSwgdHBTaXJQTk9TY2FuUmVxIHBubykKK3sKKwlDREZfU1RBVFVTIHJldDsKKworCWlmIChwbm8tPmVuYWJsZSkKKwkJcmV0ID0gd21hX3Bub19zdGFydCh3bWEsIHBubyk7CisJZWxzZQorCQlyZXQgPSB3bWFfcG5vX3N0b3Aod21hLCBwbm8tPnNlc3Npb25JZCk7CisKKwlpZiAocmV0KQorCQlXTUFfTE9HRSgiJXM6IFBOTyAlcyBmYWlsZWQgJWQiLCBfX2Z1bmNfXywKKwkJCSBwbm8tPmVuYWJsZSA/ICJzdGFydCIgOiAic3RvcCIsIHJldCk7CisKKwkvKiBTTUUgZXhwZWN0cyBXTUEgdG8gZnJlZSB0cFNpclBOT1NjYW5SZXEgbWVtb3J5IGFmdGVyCisJICogcHJvY2Vzc2luZyBQTk8gcmVxdWVzdC4gKi8KKwljZGZfbWVtX2ZyZWUocG5vKTsKK30KKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKKworLyoqCisgKiB3bWFfcGxtX3N0YXJ0KCkgLSBwbG0gc3RhcnQgcmVxdWVzdAorICogQHdtYTogd21hIGhhbmRsZQorICogQHBsbTogcGxtIHJlcXVlc3QgcGFyYW1ldGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVxdWVzdCBGVyB0byBzdGFydCBQTE0uCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX3BsbV9zdGFydCh0cF93bWFfaGFuZGxlIHdtYSwgY29uc3QgdHBTaXJQbG1SZXEgcGxtKQoreworCXdtaV92ZGV2X3BsbXJlcV9zdGFydF9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl1aW50MzJfdCAqY2hhbm5lbF9saXN0OworCWludDMyX3QgbGVuOworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50OF90IGNvdW50OworCWludCByZXQ7CisKKwlpZiAoTlVMTCA9PSBwbG0gfHwgTlVMTCA9PSB3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBpbnB1dCBwb2ludGVyIGlzIE5VTEwgIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCVdNQV9MT0dEKCJQTE0gU3RhcnQiKTsKKworCWxlbiA9IHNpemVvZigqY21kKSArIFdNSV9UTFZfSERSX1NJWkU7ICAvKiBUTFYgcGxhY2UgaG9sZGVyIGZvciBjaGFubmVsX2xpc3QgKi8KKwlsZW4gKz0gc2l6ZW9mKHVpbnQzMl90KSAqIHBsbS0+cGxtTnVtQ2g7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCBhbGxvY2F0ZSB3bWkgYnVmZmVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKwljbWQgPSAod21pX3ZkZXZfcGxtcmVxX3N0YXJ0X2NtZF9maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKworCWJ1Zl9wdHIgPSAodWludDhfdCAqKSBjbWQ7CisKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9wbG1yZXFfc3RhcnRfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV92ZGV2X3BsbXJlcV9zdGFydF9jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+dmRldl9pZCA9IHBsbS0+c2Vzc2lvbklkOworCisJY21kLT5tZWFzX3Rva2VuID0gcGxtLT5tZWFzX3Rva2VuOworCWNtZC0+ZGlhbG9nX3Rva2VuID0gcGxtLT5kaWFnX3Rva2VuOworCWNtZC0+bnVtYmVyX2J1cnN0cyA9IHBsbS0+bnVtQnVyc3RzOworCWNtZC0+YnVyc3RfaW50ZXJ2YWwgPSBXTUFfU0VDX1RPX01TRUMocGxtLT5idXJzdEludCk7CisJY21kLT5vZmZfZHVyYXRpb24gPSBwbG0tPm1lYXNEdXJhdGlvbjsKKwljbWQtPmJ1cnN0X2N5Y2xlID0gcGxtLT5idXJzdExlbjsKKwljbWQtPnR4X3Bvd2VyID0gcGxtLT5kZXNpcmVkVHhQd3I7CisJV01JX0NIQVJfQVJSQVlfVE9fTUFDX0FERFIocGxtLT5tYWNBZGRyLCAmY21kLT5kZXN0X21hYyk7CisJY21kLT5udW1fY2hhbnMgPSBwbG0tPnBsbU51bUNoOworCisJYnVmX3B0ciArPSBzaXplb2Yod21pX3ZkZXZfcGxtcmVxX3N0YXJ0X2NtZF9maXhlZF9wYXJhbSk7CisKKwlXTUFfTE9HRCgidmRldiA6ICVkIG1lYXN1IHRva2VuIDogJWQiLCBjbWQtPnZkZXZfaWQsIGNtZC0+bWVhc190b2tlbik7CisJV01BX0xPR0QoImRpYWxvZ190b2tlbjogJWQiLCBjbWQtPmRpYWxvZ190b2tlbik7CisJV01BX0xPR0QoIm51bWJlcl9idXJzdHM6ICVkIiwgY21kLT5udW1iZXJfYnVyc3RzKTsKKwlXTUFfTE9HRCgiYnVyc3RfaW50ZXJ2YWw6ICVkIiwgY21kLT5idXJzdF9pbnRlcnZhbCk7CisJV01BX0xPR0QoIm9mZl9kdXJhdGlvbjogJWQiLCBjbWQtPm9mZl9kdXJhdGlvbik7CisJV01BX0xPR0QoImJ1cnN0X2N5Y2xlOiAlZCIsIGNtZC0+YnVyc3RfY3ljbGUpOworCVdNQV9MT0dEKCJ0eF9wb3dlcjogJWQiLCBjbWQtPnR4X3Bvd2VyKTsKKwlXTUFfTE9HRCgiTnVtYmVyIG9mIGNoYW5uZWxzIDogJWQiLCBjbWQtPm51bV9jaGFucyk7CisKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwKKwkJICAgICAgIChjbWQtPm51bV9jaGFucyAqIHNpemVvZih1aW50MzJfdCkpKTsKKworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKwlpZiAoY21kLT5udW1fY2hhbnMpIHsKKwkJY2hhbm5lbF9saXN0ID0gKHVpbnQzMl90ICopIGJ1Zl9wdHI7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGNtZC0+bnVtX2NoYW5zOyBjb3VudCsrKSB7CisJCQljaGFubmVsX2xpc3RbY291bnRdID0gcGxtLT5wbG1DaExpc3RbY291bnRdOworCQkJaWYgKGNoYW5uZWxfbGlzdFtjb3VudF0gPCBXTUFfTkxPX0ZSRVFfVEhSRVNIKQorCQkJCWNoYW5uZWxfbGlzdFtjb3VudF0gPQorCQkJCQljZHNfY2hhbl90b19mcmVxKGNoYW5uZWxfbGlzdFtjb3VudF0pOworCQkJV01BX0xPR0QoIkNoWyVkXTogJWQgTUh6IiwgY291bnQsIGNoYW5uZWxfbGlzdFtjb3VudF0pOworCQl9CisJCWJ1Zl9wdHIgKz0gY21kLT5udW1fY2hhbnMgKiBzaXplb2YodWludDMyX3QpOworCX0KKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX1ZERVZfUExNUkVRX1NUQVJUX0NNRElEKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNlbmQgcGxtIHN0YXJ0IHdtaSBjbWQiLCBfX2Z1bmNfXyk7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXdtYS0+aW50ZXJmYWNlc1twbG0tPnNlc3Npb25JZF0ucGxtX2luX3Byb2dyZXNzID0gdHJ1ZTsKKworCVdNQV9MT0dEKCJQbG0gc3RhcnQgcmVxdWVzdCBzZW50IHN1Y2Nlc3NmdWxseSBmb3IgdmRldiAlZCIsCisJCSBwbG0tPnNlc3Npb25JZCk7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9wbG1fc3RvcCgpIC0gcGxtIHN0b3AgcmVxdWVzdAorICogQHdtYTogd21hIGhhbmRsZQorICogQHBsbTogcGxtIHJlcXVlc3QgcGFyYW1ldGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVxdWVzdCBGVyB0byBzdG9wIFBMTS4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfcGxtX3N0b3AodHBfd21hX2hhbmRsZSB3bWEsIGNvbnN0IHRwU2lyUGxtUmVxIHBsbSkKK3sKKwl3bWlfdmRldl9wbG1yZXFfc3RvcF9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwlpbnQzMl90IGxlbjsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJaW50IHJldDsKKworCWlmIChOVUxMID09IHBsbSB8fCBOVUxMID09IHdtYSkgeworCQlXTUFfTE9HRSgiJXM6IGlucHV0IHBvaW50ZXIgaXMgTlVMTCAiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoZmFsc2UgPT0gd21hLT5pbnRlcmZhY2VzW3BsbS0+c2Vzc2lvbklkXS5wbG1faW5fcHJvZ3Jlc3MpIHsKKwkJV01BX0xPR0UoIk5vIGFjdGl2ZSBwbG0gcmVxIGZvdW5kLCBza2lwIHBsbSBzdG9wIHJlcSIpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJV01BX0xPR0QoIlBMTSBTdG9wIik7CisKKwlsZW4gPSBzaXplb2YoKmNtZCk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2NhdGUgd21pIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljbWQgPSAod21pX3ZkZXZfcGxtcmVxX3N0b3BfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCisJYnVmX3B0ciA9ICh1aW50OF90ICopIGNtZDsKKworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3BsbXJlcV9zdG9wX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfdmRldl9wbG1yZXFfc3RvcF9jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+dmRldl9pZCA9IHBsbS0+c2Vzc2lvbklkOworCisJY21kLT5tZWFzX3Rva2VuID0gcGxtLT5tZWFzX3Rva2VuOworCVdNQV9MT0dEKCJ2ZGV2ICVkIG1lYXMgdG9rZW4gJWQiLCBjbWQtPnZkZXZfaWQsIGNtZC0+bWVhc190b2tlbik7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9WREVWX1BMTVJFUV9TVE9QX0NNRElEKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNlbmQgcGxtIHN0b3Agd21pIGNtZCIsIF9fZnVuY19fKTsKKwkJd21pX2J1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJd21hLT5pbnRlcmZhY2VzW3BsbS0+c2Vzc2lvbklkXS5wbG1faW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKworCVdNQV9MT0dEKCJQbG0gc3RvcCByZXF1ZXN0IHNlbnQgc3VjY2Vzc2Z1bGx5IGZvciB2ZGV2ICVkIiwKKwkJIHBsbS0+c2Vzc2lvbklkKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2NvbmZpZ19wbG0oKS0gY29uZmlnIFBMTQorICogQHdtYTogd21hIGhhbmRsZQorICogQHBsbTogcGxtIHJlcXVlc3QgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9jb25maWdfcGxtKHRwX3dtYV9oYW5kbGUgd21hLCB0cFNpclBsbVJlcSBwbG0pCit7CisJQ0RGX1NUQVRVUyByZXQgPSAwOworCisJaWYgKE5VTEwgPT0gcGxtIHx8IE5VTEwgPT0gd21hKQorCQlyZXR1cm47CisKKwlpZiAocGxtLT5lbmFibGUpCisJCXJldCA9IHdtYV9wbG1fc3RhcnQod21hLCBwbG0pOworCWVsc2UKKwkJcmV0ID0gd21hX3BsbV9zdG9wKHdtYSwgcGxtKTsKKworCWlmIChyZXQpCisJCVdNQV9MT0dFKCIlczogUExNICVzIGZhaWxlZCAlZCIsIF9fZnVuY19fLAorCQkJIHBsbS0+ZW5hYmxlID8gInN0YXJ0IiA6ICJzdG9wIiwgcmV0KTsKKworCS8qIFNNRSBleHBlY3RzIFdNQSB0byBmcmVlIHRwU2lyUGxtUmVxIG1lbW9yeSBhZnRlcgorCSAqIHByb2Nlc3NpbmcgUExNIHJlcXVlc3QuICovCisJY2RmX21lbV9mcmVlKHBsbSk7CisJcGxtID0gTlVMTDsKK30KKyNlbmRpZgorCisvKioKKyAqIHdtYV9zY2FuX2NhY2hlX3VwZGF0ZWRfaW5kKCkgLSBzY2FuIHVwZGF0ZSBpbmRpY2F0aW9uCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAc2Vzc2lvbklkOiBzZXNzaW9uIElECisgKgorICogQWZ0ZXIgcHVzaGluZyBjYWNoZWQgc2NhbiByZXN1bHRzICh0aGF0IGFyZSBzdG9yZWQgaW4gTElNKSB0byBTTUUsCisgKiBQRSB3aWxsIHBvc3QgV01BX1NNRV9TQ0FOX0NBQ0hFX1VQREFURUQgbWVzc2FnZSBpbmRpY2F0aW9uIHRvCisgKiB3bWEgYW5kIGludGVybiB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhhdCBtZXNzYWdlLiBUaGlzIGZ1bmN0aW9uIHdpbGwKKyAqIGNoZWNrIGZvciBQTk8gY29tcGxldGlvbiAoYnkgY2hlY2tpbmcgTkxPIG1hdGNoIGV2ZW50KSBhbmQgcG9zdCBQTk8KKyAqIGNvbXBsZXRpb24gYmFjayB0byBTTUUgaWYgUE5PIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9zY2FuX2NhY2hlX3VwZGF0ZWRfaW5kKHRwX3dtYV9oYW5kbGUgd21hLCB1aW50OF90IHNlc3Npb25JZCkKK3sKKwl0U2lyUHJlZk5ldHdvcmtGb3VuZEluZCAqbndfZm91bmRfaW5kOworCUNERl9TVEFUVVMgc3RhdHVzOworCWNkc19tc2dfdCBjZHNfbXNnOworCXVpbnQ4X3QgbGVuLCBpOworCisJZm9yIChpID0gMDsgaSA8IHdtYS0+bWF4X2Jzc2lkOyBpKyspIHsKKwkJaWYgKHdtYS0+aW50ZXJmYWNlc1tpXS5ubG9fbWF0Y2hfZXZ0X3JlY2VpdmVkKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gd21hLT5tYXhfYnNzaWQpIHsKKwkJV01BX0xPR0QoIlBOTyBtYXRjaCBldmVudCBpcyBub3QgcmVjZWl2ZWQgaW4gYW55IHZkZXYsIHNraXAgc2NhbiBjYWNoZSB1cGRhdGUgaW5kaWNhdGlvbiIpOworCQlyZXR1cm47CisJfQorCXdtYS0+aW50ZXJmYWNlc1tpXS5ubG9fbWF0Y2hfZXZ0X3JlY2VpdmVkID0gZmFsc2U7CisKKwlXTUFfTE9HRCgiUG9zdGluZyBQTk8gY29tcGxldGlvbiB0byB1bWFjIik7CisKKwlsZW4gPSBzaXplb2YodFNpclByZWZOZXR3b3JrRm91bmRJbmQpOworCW53X2ZvdW5kX2luZCA9ICh0U2lyUHJlZk5ldHdvcmtGb3VuZEluZCAqKSBjZGZfbWVtX21hbGxvYyhsZW4pOworCisJaWYgKE5VTEwgPT0gbndfZm91bmRfaW5kKSB7CisJCVdNQV9MT0dFKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCW53X2ZvdW5kX2luZC0+bWVzZ1R5cGUgPSBlV05JX1NNRV9QUkVGX05FVFdPUktfRk9VTkRfSU5EOworCW53X2ZvdW5kX2luZC0+bWVzZ0xlbiA9IGxlbjsKKwlud19mb3VuZF9pbmQtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworCWNkc19tc2cudHlwZSA9IGVXTklfU01FX1BSRUZfTkVUV09SS19GT1VORF9JTkQ7CisJY2RzX21zZy5ib2R5cHRyID0gKHZvaWQgKilud19mb3VuZF9pbmQ7CisJY2RzX21zZy5ib2R5dmFsID0gMDsKKworCXN0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RTX01RX0lEX1NNRSwgJmNkc19tc2cpOworCWlmIChzdGF0dXMgIT0gQ0RGX1NUQVRVU19TVUNDRVNTKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHBvc3QgUE5PIGNvbXBsZXRpb24gbWF0Y2ggZXZlbnQgdG8gU01FIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShud19mb3VuZF9pbmQpOworCX0KK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisvKioKKyAqIHdtYV9leHRzY2FuX2dldF9ldmVudGlkX2Zyb21fdGx2dGFnKCkgLSBtYXAgdGx2IHRhZyB0byBjb3JyZXNwb25kaW5nIGV2ZW50IGlkCisgKiBAdGFnOiBXTUkgVExWIHRhZworICoKKyAqIFJldHVybjoKKyAqCTAgaWYgVExWIHRhZyBpcyBpbnZhbGlkCisgKgllbHNlIHJldHVybiBjb3JyZXNwb25kaW5nIFdNSSBldmVudCBpZAorICovCitzdGF0aWMgaW50IHdtYV9leHRzY2FuX2dldF9ldmVudGlkX2Zyb21fdGx2dGFnKHVpbnQzMl90IHRhZykKK3sKKwl1aW50MzJfdCBldmVudF9pZDsKKworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3N0YXJ0X3N0b3BfZXZlbnRfZml4ZWRfcGFyYW06CisJCWV2ZW50X2lkID0gV01JX0VYVFNDQU5fU1RBUlRfU1RPUF9FVkVOVElEOworCQlicmVhazsKKworCWNhc2UgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9vcGVyYXRpb25fZXZlbnRfZml4ZWRfcGFyYW06CisJCWV2ZW50X2lkID0gV01JX0VYVFNDQU5fT1BFUkFUSU9OX0VWRU5USUQ7CisJCWJyZWFrOworCisJY2FzZSBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3RhYmxlX3VzYWdlX2V2ZW50X2ZpeGVkX3BhcmFtOgorCQlldmVudF9pZCA9IFdNSV9FWFRTQ0FOX1RBQkxFX1VTQUdFX0VWRU5USUQ7CisJCWJyZWFrOworCisJY2FzZSBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2V2ZW50X2ZpeGVkX3BhcmFtOgorCQlldmVudF9pZCA9IFdNSV9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX0VWRU5USUQ7CisJCWJyZWFrOworCisJY2FzZSBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3dsYW5fY2hhbmdlX3Jlc3VsdHNfZXZlbnRfZml4ZWRfcGFyYW06CisJCWV2ZW50X2lkID0gV01JX0VYVFNDQU5fV0xBTl9DSEFOR0VfUkVTVUxUU19FVkVOVElEOworCQlicmVhazsKKworCWNhc2UgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9ob3RsaXN0X21hdGNoX2V2ZW50X2ZpeGVkX3BhcmFtOgorCQlldmVudF9pZCA9IFdNSV9FWFRTQ0FOX0hPVExJU1RfTUFUQ0hfRVZFTlRJRDsKKwkJYnJlYWs7CisKKwljYXNlIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY2FwYWJpbGl0aWVzX2V2ZW50X2ZpeGVkX3BhcmFtOgorCQlldmVudF9pZCA9IFdNSV9FWFRTQ0FOX0NBUEFCSUxJVElFU19FVkVOVElEOworCQlicmVhazsKKworCWNhc2UgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9ob3RsaXN0X3NzaWRfbWF0Y2hfZXZlbnRfZml4ZWRfcGFyYW06CisJCWV2ZW50X2lkID0gV01JX0VYVFNDQU5fSE9UTElTVF9TU0lEX01BVENIX0VWRU5USUQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXZlbnRfaWQgPSAwOworCQlXTUFfTE9HRSgiJXM6IFVua25vd24gdGFnOiAlZCIsIF9fZnVuY19fLCB0YWcpOworCQlicmVhazsKKwl9CisKKwlXTUFfTE9HSSgiJXM6IEZvciB0YWcgJWQgV01JIGV2ZW50IDB4JXgiLCBfX2Z1bmNfXywgdGFnLCBldmVudF9pZCk7CisJcmV0dXJuIGV2ZW50X2lkOworfQorCisvKioKKyAqIHdtYV9leHRzY2FuX3dvd19ldmVudF9jYWxsYmFjaygpIC0gZXh0c2NhbiB3b3cgZXZlbnQgY2FsbGJhY2sKKyAqIEBoYW5kbGU6IFdNQSBoYW5kbGUKKyAqIEBldmVudDogZXZlbnQgYnVmZmVyCisgKiBAbGVuOiBsZW5ndGggb2YgQGV2ZW50IGJ1ZmZlcgorICoKKyAqIEluIHdvdyBjYXNlLCB0aGUgd293IGV2ZW50IGlzIGZvbGxvd2VkIGJ5IHRoZSBwYXlsb2FkIG9mIHRoZSBldmVudAorICogd2hpY2ggZ2VuZXJhdGVkIHRoZSB3b3cgZXZlbnQuCisgKiBwYXlsb2FkIGlzIDQgYnl0ZXMgb2YgbGVuZ3RoIGZvbGxvd2VkIGJ5IGV2ZW50IGJ1ZmZlci4gdGhlIGZpcnN0IDQgYnl0ZXMKKyAqIG9mIGV2ZW50IGJ1ZmZlciBpcyBjb21tb24gdGx2IGhlYWRlciwgd2hpY2ggaXMgYSBjb21iaW5hdGlvbgorICogb2YgdGFnIChoaWdoZXIgMiBieXRlcykgYW5kIGxlbmd0aCAobG93ZXIgMiBieXRlcykuIFRoZSB0YWcgaXMgdXNlZCB0bworICogaWRlbnRpZnkgdGhlIGV2ZW50IHdoaWNoIHRyaWdnZXJlZCB3b3cgZXZlbnQuCisgKgorICogQFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV9leHRzY2FuX3dvd19ldmVudF9jYWxsYmFjayh2b2lkICpoYW5kbGUsIHZvaWQgKmV2ZW50LCB1aW50MzJfdCBsZW4pCit7CisJdWludDMyX3QgaWQ7CisJaW50IHRsdl9va19zdGF0dXMgPSAwOworCXZvaWQgKndtaV9jbWRfc3RydWN0X3B0ciA9IE5VTEw7CisJdWludDMyX3QgdGFnID0gV01JVExWX0dFVF9UTFZUQUcoV01JVExWX0dFVF9IRFIoZXZlbnQpKTsKKworCWlkID0gd21hX2V4dHNjYW5fZ2V0X2V2ZW50aWRfZnJvbV90bHZ0YWcodGFnKTsKKwlpZiAoIWlkKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCAgVGFnOiAlZCIsIF9fZnVuY19fLCB0YWcpOworCQlyZXR1cm47CisJfQorCisJdGx2X29rX3N0YXR1cyA9IHdtaXRsdl9jaGVja19hbmRfcGFkX2V2ZW50X3RsdnMoCisJCQkJaGFuZGxlLCBldmVudCwgbGVuLCBpZCwKKwkJCQkmd21pX2NtZF9zdHJ1Y3RfcHRyKTsKKwlpZiAodGx2X29rX3N0YXR1cyAhPSAwKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBUYWc6ICVkIGNvdWxkIG5vdCBjaGVjayBhbmQgcGFkIHRsdnMiLAorCQkJIF9fZnVuY19fLCB0YWcpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoICh0YWcpIHsKKwljYXNlIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fc3RhcnRfc3RvcF9ldmVudF9maXhlZF9wYXJhbToKKwkJd21hX2V4dHNjYW5fc3RhcnRfc3RvcF9ldmVudF9oYW5kbGVyKGhhbmRsZSwKKwkJCQl3bWlfY21kX3N0cnVjdF9wdHIsIGxlbik7CisJCWJyZWFrOworCisJY2FzZSBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX29wZXJhdGlvbl9ldmVudF9maXhlZF9wYXJhbToKKwkJd21hX2V4dHNjYW5fb3BlcmF0aW9uc19ldmVudF9oYW5kbGVyKGhhbmRsZSwKKwkJCQl3bWlfY21kX3N0cnVjdF9wdHIsIGxlbik7CisJCWJyZWFrOworCisJY2FzZSBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3RhYmxlX3VzYWdlX2V2ZW50X2ZpeGVkX3BhcmFtOgorCQl3bWFfZXh0c2Nhbl90YWJsZV91c2FnZV9ldmVudF9oYW5kbGVyKGhhbmRsZSwKKwkJCQl3bWlfY21kX3N0cnVjdF9wdHIsIGxlbik7CisJCWJyZWFrOworCisJY2FzZSBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2V2ZW50X2ZpeGVkX3BhcmFtOgorCQl3bWFfZXh0c2Nhbl9jYWNoZWRfcmVzdWx0c19ldmVudF9oYW5kbGVyKGhhbmRsZSwKKwkJCQl3bWlfY21kX3N0cnVjdF9wdHIsIGxlbik7CisJCWJyZWFrOworCisJY2FzZSBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3dsYW5fY2hhbmdlX3Jlc3VsdHNfZXZlbnRfZml4ZWRfcGFyYW06CisJCXdtYV9leHRzY2FuX2NoYW5nZV9yZXN1bHRzX2V2ZW50X2hhbmRsZXIoaGFuZGxlLAorCQkJCXdtaV9jbWRfc3RydWN0X3B0ciwgbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5faG90bGlzdF9tYXRjaF9ldmVudF9maXhlZF9wYXJhbToKKwkJd21hX2V4dHNjYW5faG90bGlzdF9tYXRjaF9ldmVudF9oYW5kbGVyKGhhbmRsZSwKKwkJCQl3bWlfY21kX3N0cnVjdF9wdHIsIGxlbik7CisJCWJyZWFrOworCisJY2FzZSBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2NhcGFiaWxpdGllc19ldmVudF9maXhlZF9wYXJhbToKKwkJd21hX2V4dHNjYW5fY2FwYWJpbGl0aWVzX2V2ZW50X2hhbmRsZXIoaGFuZGxlLAorCQkJCXdtaV9jbWRfc3RydWN0X3B0ciwgbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5faG90bGlzdF9zc2lkX21hdGNoX2V2ZW50X2ZpeGVkX3BhcmFtOgorCQl3bWFfZXh0c2Nhbl9ob3RsaXN0X3NzaWRfbWF0Y2hfZXZlbnRfaGFuZGxlcihoYW5kbGUsCisJCQkJd21pX2NtZF9zdHJ1Y3RfcHRyLCBsZW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVdNQV9MT0dFKCIlczogVW5rbm93biB0YWc6ICVkIiwgX19mdW5jX18sIHRhZyk7CisJCWJyZWFrOworCX0KKwl3bWl0bHZfZnJlZV9hbGxvY2F0ZWRfZXZlbnRfdGx2cyhpZCwgJndtaV9jbWRfc3RydWN0X3B0cik7CisKKwlyZXR1cm47Cit9CisjZW5kaWYKKworLyoqCisgKiB3bWFfbmxvX21hdGNoX2V2dF9oYW5kbGVyKCkgLSBubG8gbWF0Y2ggZXZlbnQgaGFuZGxlcgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGV2ZW50OiBldmVudCBkYXRhCisgKiBAbGVuOiBkYXRhIGxlbmd0aAorICoKKyAqIFJlY29yZCBOTE8gbWF0Y2ggZXZlbnQgY29tZXMgZnJvbSBGVy4gSXQncyBhIGluZGljYXRpb24gdGhhdAorICogb25lIG9mIHRoZSBwcm9maWxlIGlzIG1hdGNoZWQuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCisgKi8KK2ludCB3bWFfbmxvX21hdGNoX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsCisJCQkJICAgICB1aW50MzJfdCBsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCXdtaV9ubG9fZXZlbnQgKm5sb19ldmVudDsKKwlXTUlfTkxPX01BVENIX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmID0KKwkJKFdNSV9OTE9fTUFUQ0hfRVZFTlRJRF9wYXJhbV90bHZzICopIGV2ZW50OworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICpub2RlOworCisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgTkxPIG1hdGNoIGV2ZW50IGJ1ZmZlciIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlubG9fZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCVdNQV9MT0dEKCJQTk8gbWF0Y2ggZXZlbnQgcmVjZWl2ZWQgZm9yIHZkZXYgJWQiLCBubG9fZXZlbnQtPnZkZXZfaWQpOworCisJbm9kZSA9ICZ3bWEtPmludGVyZmFjZXNbbmxvX2V2ZW50LT52ZGV2X2lkXTsKKwlpZiAobm9kZSkKKwkJbm9kZS0+bmxvX21hdGNoX2V2dF9yZWNlaXZlZCA9IHRydWU7CisKKwljZGZfd2FrZV9sb2NrX3RpbWVvdXRfYWNxdWlyZSgmd21hLT5wbm9fd2FrZV9sb2NrLAorCQkJCSAgICAgIFdNQV9QTk9fTUFUQ0hfV0FLRV9MT0NLX1RJTUVPVVQsCisJCQkJICAgICAgV0lGSV9QT1dFUl9FVkVOVF9XQUtFTE9DS19QTk8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX25sb19zY2FuX2NtcF9ldnRfaGFuZGxlcigpIC0gbmxvIHNjYW4gY29tcGxldGlvbiBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZXZlbnQ6IGV2ZW50IGhhbmRsZXIKKyAqIEBsZW46IGxlbmd0aCBvZiBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIE5MTyBzY2FuIGNvbXBsZXRpb24gZXZlbnQuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCisgKi8KK2ludCB3bWFfbmxvX3NjYW5fY21wX2V2dF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZXZlbnQsCisJCQkJCXVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJd21pX25sb19ldmVudCAqbmxvX2V2ZW50OworCVdNSV9OTE9fU0NBTl9DT01QTEVURV9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZiA9CisJCShXTUlfTkxPX1NDQU5fQ09NUExFVEVfRVZFTlRJRF9wYXJhbV90bHZzICopIGV2ZW50OworCXRTaXJTY2FuT2ZmbG9hZEV2ZW50ICpzY2FuX2V2ZW50OworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICpub2RlOworCisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0UoIkludmFsaWQgTkxPIHNjYW4gY29tcCBldmVudCBidWZmZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmxvX2V2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlXTUFfTE9HRCgiUE5PIHNjYW4gY29tcGxldGlvbiBldmVudCByZWNlaXZlZCBmb3IgdmRldiAlZCIsCisJCSBubG9fZXZlbnQtPnZkZXZfaWQpOworCisJbm9kZSA9ICZ3bWEtPmludGVyZmFjZXNbbmxvX2V2ZW50LT52ZGV2X2lkXTsKKworCS8qIEhhbmRsZSBzY2FuIGNvbXBsZXRpb24gZXZlbnQgb25seSBhZnRlciBOTE8gbWF0Y2ggZXZlbnQuICovCisJaWYgKCFub2RlIHx8ICFub2RlLT5ubG9fbWF0Y2hfZXZ0X3JlY2VpdmVkKSB7CisKKwkJV01BX0xPR0QoIk5MTyBtYXRjaCBub3QgcmVjaWV2ZWQgc2tpcHBpbmcgUE5PIGNvbXBsZXRlIGluZCBmb3IgdmRldiAlZCIsCisJCQlubG9fZXZlbnQtPnZkZXZfaWQpOworCQlnb3RvIHNraXBfcG5vX2NtcF9pbmQ7CisJfQorCisJY2RmX3dha2VfbG9ja19yZWxlYXNlKCZ3bWEtPnBub193YWtlX2xvY2ssCisJCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfUE5PKTsKKwlzY2FuX2V2ZW50ID0KKwkJKHRTaXJTY2FuT2ZmbG9hZEV2ZW50ICopCisJCWNkZl9tZW1fbWFsbG9jKHNpemVvZih0U2lyU2Nhbk9mZmxvYWRFdmVudCkpOworCWlmIChzY2FuX2V2ZW50KSB7CisJCS8qIFBvc3Rpbmcgc2NhbiBjb21wbGV0aW9uIG1zZyB3b3VsZCB0YWtlIHNjYW4gY2FjaGUgcmVzdWx0CisJCSAqIGZyb20gTElNIG1vZHVsZSBhbmQgdXBkYXRlIGluIHNjYW4gY2FjaGUgbWFpbnRhaW5lZCBpbiBTTUUuKi8KKwkJV01BX0xPR0UoIlBvc3RpbmcgUE5PIFNjYW4gY29tcGxldGlvbiB0byB1bWFjIik7CisJCWNkZl93YWtlX2xvY2tfdGltZW91dF9hY3F1aXJlKCZ3bWEtPnBub193YWtlX2xvY2ssCisJCQkJV01BX1BOT19TQ0FOX0NPTVBMRVRFX1dBS0VfTE9DS19USU1FT1VULAorCQkJCVdJRklfUE9XRVJfRVZFTlRfV0FLRUxPQ0tfUE5PKTsKKwkJY2RmX21lbV96ZXJvKHNjYW5fZXZlbnQsIHNpemVvZih0U2lyU2Nhbk9mZmxvYWRFdmVudCkpOworCQlzY2FuX2V2ZW50LT5yZWFzb25Db2RlID0gZVNJUl9QTk9fU0NBTl9TVUNDRVNTOworCQlzY2FuX2V2ZW50LT5ldmVudCA9IFNDQU5fRVZFTlRfQ09NUExFVEVEOworCQlzY2FuX2V2ZW50LT5zZXNzaW9uSWQgPSBubG9fZXZlbnQtPnZkZXZfaWQ7CisJCXdtYV9zZW5kX21zZyh3bWEsIFdNQV9SWF9TQ0FOX0VWRU5ULCAodm9pZCAqKXNjYW5fZXZlbnQsIDApOworCX0gZWxzZSB7CisJCVdNQV9MT0dFKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHRTaXJTY2FuT2ZmbG9hZEV2ZW50Iik7CisJfQorCitza2lwX3Bub19jbXBfaW5kOgorCXJldHVybiAwOworfQorCisjZW5kaWYKKworLyoqCisgKiB3bWFfcmVnaXN0ZXJfZXh0c2Nhbl9ldmVudF9oYW5kbGVyKCkgLSByZWdpc3RlciBleHRzY2FuIGV2ZW50IGhhbmRsZXIKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKgorICogVGhpcyBmdW5jdGlvbiByZWdpc3RlciBleHRzY2FuIHJlbGF0ZWQgZXZlbnQgaGFuZGxlcnMuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3JlZ2lzdGVyX2V4dHNjYW5fZXZlbnRfaGFuZGxlcih0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpCit7CisJaWYgKCF3bWFfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogZXh0c2NhbiB3bWFfaGFuZGxlIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfRVhUU0NBTl9TVEFSVF9TVE9QX0VWRU5USUQsCisJCQkJCSAgIHdtYV9leHRzY2FuX3N0YXJ0X3N0b3BfZXZlbnRfaGFuZGxlcik7CisKKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCSAgIFdNSV9FWFRTQ0FOX0NBUEFCSUxJVElFU19FVkVOVElELAorCQkJCQkgICB3bWFfZXh0c2Nhbl9jYXBhYmlsaXRpZXNfZXZlbnRfaGFuZGxlcik7CisKKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCSAgIFdNSV9FWFRTQ0FOX0hPVExJU1RfTUFUQ0hfRVZFTlRJRCwKKwkJCQkJICAgd21hX2V4dHNjYW5faG90bGlzdF9tYXRjaF9ldmVudF9oYW5kbGVyKTsKKworCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJICAgV01JX0VYVFNDQU5fV0xBTl9DSEFOR0VfUkVTVUxUU19FVkVOVElELAorCQkJCQkgICB3bWFfZXh0c2Nhbl9jaGFuZ2VfcmVzdWx0c19ldmVudF9oYW5kbGVyKTsKKworCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJICAgV01JX0VYVFNDQU5fT1BFUkFUSU9OX0VWRU5USUQsCisJCQkJCSAgIHdtYV9leHRzY2FuX29wZXJhdGlvbnNfZXZlbnRfaGFuZGxlcik7CisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfRVhUU0NBTl9UQUJMRV9VU0FHRV9FVkVOVElELAorCQkJCQkgICB3bWFfZXh0c2Nhbl90YWJsZV91c2FnZV9ldmVudF9oYW5kbGVyKTsKKworCXdtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJICAgV01JX0VYVFNDQU5fQ0FDSEVEX1JFU1VMVFNfRVZFTlRJRCwKKwkJCQkJICAgd21hX2V4dHNjYW5fY2FjaGVkX3Jlc3VsdHNfZXZlbnRfaGFuZGxlcik7CisKKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQlXTUlfUEFTU1BPSU5UX01BVENIX0VWRU5USUQsCisJCQl3bWFfcGFzc3BvaW50X21hdGNoX2V2ZW50X2hhbmRsZXIpOworCisKKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQlXTUlfRVhUU0NBTl9IT1RMSVNUX1NTSURfTUFUQ0hfRVZFTlRJRCwKKwkJCXdtYV9leHRzY2FuX2hvdGxpc3Rfc3NpZF9tYXRjaF9ldmVudF9oYW5kbGVyKTsKKworCXJldHVybjsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9FWFRTQ0FOCisKKy8qKgorICogd21hX2V4dHNjYW5fc3RhcnRfc3RvcF9ldmVudF9oYW5kbGVyKCkgLSAgZXh0c2NhbiBzdGFydC9zdG9wIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZXZlbnQgYnVmZmVyCisgKiBAbGVuOiBkYXRhIGxlbmd0aAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBkaWZmZXJlbnQgZXh0c2NhbiByZWxhdGVkIGNvbW1hbmRzCisgKiBsaWtlIHN0YXJ0L3N0b3AvZ2V0IHJlc3VsdHMgZXRjIGFuZCBpbmRpY2F0ZSB0byB1cHBlciBsYXllcnMuCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCisgKi8KK2ludCB3bWFfZXh0c2Nhbl9zdGFydF9zdG9wX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJCSB1aW50MzJfdCBsZW4pCit7CisJV01JX0VYVFNDQU5fU1RBUlRfU1RPUF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfZXh0c2Nhbl9zdGFydF9zdG9wX2V2ZW50X2ZpeGVkX3BhcmFtICpldmVudDsKKwlzdHJ1Y3Qgc2lyX2V4dHNjYW5fZ2VuZXJpY19yZXNwb25zZSAgICpleHRzY2FuX2luZDsKKwl1aW50MTZfdCBldmVudF90eXBlOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisJaWYgKCFwTWFjKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBwTWFjIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFwTWFjLT5zbWUucEV4dFNjYW5JbmRDYikgeworCQlXTUFfTE9HRSgiJXM6IENhbGxiYWNrIG5vdCByZWdpc3RlcmVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGFyYW1fYnVmID0gKFdNSV9FWFRTQ0FOX1NUQVJUX1NUT1BfRVZFTlRJRF9wYXJhbV90bHZzICopCisJCSAgICBjbWRfcGFyYW1faW5mbzsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgZXh0c2NhbiBldmVudCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWV2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlleHRzY2FuX2luZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqZXh0c2Nhbl9pbmQpKTsKKwlpZiAoIWV4dHNjYW5faW5kKSB7CisJCVdNQV9MT0dFKCIlczogZXh0c2NhbiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzd2l0Y2ggKGV2ZW50LT5jb21tYW5kKSB7CisJY2FzZSBXTUlfRVhUU0NBTl9TVEFSVF9DTURJRDoKKwkJZXZlbnRfdHlwZSA9IGVTSVJfRVhUU0NBTl9TVEFSVF9SU1A7CisJCWV4dHNjYW5faW5kLT5zdGF0dXMgPSBldmVudC0+c3RhdHVzOworCQlleHRzY2FuX2luZC0+cmVxdWVzdF9pZCA9IGV2ZW50LT5yZXF1ZXN0X2lkOworCQlicmVhazsKKwljYXNlIFdNSV9FWFRTQ0FOX1NUT1BfQ01ESUQ6CisJCWV2ZW50X3R5cGUgPSBlU0lSX0VYVFNDQU5fU1RPUF9SU1A7CisJCWV4dHNjYW5faW5kLT5zdGF0dXMgPSBldmVudC0+c3RhdHVzOworCQlleHRzY2FuX2luZC0+cmVxdWVzdF9pZCA9IGV2ZW50LT5yZXF1ZXN0X2lkOworCQlicmVhazsKKwljYXNlIFdNSV9FWFRTQ0FOX0NPTkZJR1VSRV9XTEFOX0NIQU5HRV9NT05JVE9SX0NNRElEOgorCQlleHRzY2FuX2luZC0+c3RhdHVzID0gZXZlbnQtPnN0YXR1czsKKwkJZXh0c2Nhbl9pbmQtPnJlcXVlc3RfaWQgPSBldmVudC0+cmVxdWVzdF9pZDsKKwkJaWYgKGV2ZW50LT5tb2RlID09IFdNSV9FWFRTQ0FOX01PREVfU1RPUCkgeworCQkJZXZlbnRfdHlwZSA9CisJCQkJZVNJUl9FWFRTQ0FOX1JFU0VUX1NJR05JRklDQU5UX1dJRklfQ0hBTkdFX1JTUDsKKwkJfSBlbHNlIHsKKwkJCWV2ZW50X3R5cGUgPQorCQkJCWVTSVJfRVhUU0NBTl9TRVRfU0lHTklGSUNBTlRfV0lGSV9DSEFOR0VfUlNQOworCQl9CisJCWJyZWFrOworCWNhc2UgV01JX0VYVFNDQU5fQ09ORklHVVJFX0hPVExJU1RfTU9OSVRPUl9DTURJRDoKKwkJZXh0c2Nhbl9pbmQtPnN0YXR1cyA9IGV2ZW50LT5zdGF0dXM7CisJCWV4dHNjYW5faW5kLT5yZXF1ZXN0X2lkID0gZXZlbnQtPnJlcXVlc3RfaWQ7CisJCWlmIChldmVudC0+bW9kZSA9PSBXTUlfRVhUU0NBTl9NT0RFX1NUT1ApIHsKKwkJCWV2ZW50X3R5cGUgPSBlU0lSX0VYVFNDQU5fUkVTRVRfQlNTSURfSE9UTElTVF9SU1A7CisJCX0gZWxzZSB7CisJCQlldmVudF90eXBlID0gZVNJUl9FWFRTQ0FOX1NFVF9CU1NJRF9IT1RMSVNUX1JTUDsKKwkJfQorCQlicmVhazsKKwljYXNlIFdNSV9FWFRTQ0FOX0dFVF9DQUNIRURfUkVTVUxUU19DTURJRDoKKwkJZXh0c2Nhbl9pbmQtPnN0YXR1cyA9IGV2ZW50LT5zdGF0dXM7CisJCWV4dHNjYW5faW5kLT5yZXF1ZXN0X2lkID0gZXZlbnQtPnJlcXVlc3RfaWQ7CisJCWV2ZW50X3R5cGUgPSBlU0lSX0VYVFNDQU5fQ0FDSEVEX1JFU1VMVFNfUlNQOworCQlicmVhazsKKwljYXNlIFdNSV9FWFRTQ0FOX0NPTkZJR1VSRV9IT1RMSVNUX1NTSURfTU9OSVRPUl9DTURJRDoKKwkJZXh0c2Nhbl9pbmQtPnN0YXR1cyA9IGV2ZW50LT5zdGF0dXM7CisJCWV4dHNjYW5faW5kLT5yZXF1ZXN0X2lkID0gZXZlbnQtPnJlcXVlc3RfaWQ7CisJCWlmIChldmVudC0+bW9kZSA9PSBXTUlfRVhUU0NBTl9NT0RFX1NUT1ApIHsKKwkJCWV2ZW50X3R5cGUgPQorCQkJCWVTSVJfRVhUU0NBTl9SRVNFVF9TU0lEX0hPVExJU1RfUlNQOworCQl9IGVsc2UgeworCQkJZXZlbnRfdHlwZSA9CisJCQkJZVNJUl9FWFRTQ0FOX1NFVF9TU0lEX0hPVExJU1RfUlNQOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdNQV9MT0dFKCIlczogVW5rbm93biBldmVudCglZCkgZnJvbSB0YXJnZXQiLAorCQkJIF9fZnVuY19fLCBldmVudC0+c3RhdHVzKTsKKwkJY2RmX21lbV9mcmVlKGV4dHNjYW5faW5kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBNYWMtPnNtZS5wRXh0U2NhbkluZENiKHBNYWMtPmhIZGQsIGV2ZW50X3R5cGUsIGV4dHNjYW5faW5kKTsKKwlXTUFfTE9HRCgiJXM6IHNlbmRpbmcgZXZlbnQgdG8gdW1hYyBmb3IgcmVxdWVzdGlkICV1IgorCQkgIndpdGggc3RhdHVzICVkIiwgX19mdW5jX18sCisJCSBleHRzY2FuX2luZC0+cmVxdWVzdF9pZCwgZXh0c2Nhbl9pbmQtPnN0YXR1cyk7CisJY2RmX21lbV9mcmVlKGV4dHNjYW5faW5kKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfZXh0c2Nhbl9vcGVyYXRpb25zX2V2ZW50X2hhbmRsZXIoKSAtIGV4dHNjYW4gb3BlcmF0aW9uIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZXZlbnQgYnVmZmVyCisgKiBAbGVuOiBsZW5ndGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZGlmZmVyZW50IG9wZXJhdGlvbnMgcmVsYXRlZCBldmVudCBhbmQgaW5kaWNhdGUKKyAqIHVwcGVyIGxheWVycyB3aXRoIGFwcHJvcHJpYXRlIGNhbGxiYWNrLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlLgorICovCitpbnQgd21hX2V4dHNjYW5fb3BlcmF0aW9uc19ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkJIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgdWludDMyX3QgbGVuKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlXTUlfRVhUU0NBTl9PUEVSQVRJT05fRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX2V4dHNjYW5fb3BlcmF0aW9uX2V2ZW50X2ZpeGVkX3BhcmFtICpvcHJuX2V2ZW50OworCXRTaXJFeHRTY2FuT25TY2FuRXZlbnRJbmRQYXJhbXMgKm9wcm5faW5kOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisJaWYgKCFwTWFjKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBwTWFjIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFwTWFjLT5zbWUucEV4dFNjYW5JbmRDYikgeworCQlXTUFfTE9HRSgiJXM6IENhbGxiYWNrIG5vdCByZWdpc3RlcmVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGFyYW1fYnVmID0gKFdNSV9FWFRTQ0FOX09QRVJBVElPTl9FVkVOVElEX3BhcmFtX3RsdnMgKikKKwkJICAgIGNtZF9wYXJhbV9pbmZvOworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBzY2FuIG9wZXJhdGlvbiBldmVudCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW9wcm5fZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCW9wcm5faW5kID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpvcHJuX2luZCkpOworCWlmICghb3Bybl9pbmQpIHsKKwkJV01BX0xPR0UoIiVzOiBleHRzY2FuIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKG9wcm5faW5kKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJb3Bybl9pbmQtPnJlcXVlc3RJZCA9IG9wcm5fZXZlbnQtPnJlcXVlc3RfaWQ7CisKKwlzd2l0Y2ggKG9wcm5fZXZlbnQtPmV2ZW50KSB7CisJY2FzZSBXTUlfRVhUU0NBTl9CVUNLRVRfQ09NUExFVEVEX0VWRU5UOgorCQlvcHJuX2luZC0+c2NhbkV2ZW50VHlwZSA9IFdJRklfU0NBTl9DT01QTEVURTsKKwkJb3Bybl9pbmQtPnN0YXR1cyA9IDA7CisJCWJyZWFrOworCWNhc2UgV01JX0VYVFNDQU5fQ1lDTEVfU1RBUlRFRF9FVkVOVDoKKwkJV01BX0xPR0QoIiVzOiByZWNlaXZlZCBXTUlfRVhUU0NBTl9DWUNMRV9TVEFSVEVEX0VWRU5UIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWNkZl93YWtlX2xvY2tfdGltZW91dF9hY3F1aXJlKCZ3bWEtPmV4dHNjYW5fd2FrZV9sb2NrLAorCQkJCSAgICAgIFdNQV9FWFRTQ0FOX0NZQ0xFX1dBS0VfTE9DS19EVVJBVElPTiwKKwkJCQkgICAgICBXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX0VYVF9TQ0FOKTsKKwkJZ290byBleGl0X2hhbmRsZXI7CisJY2FzZSBXTUlfRVhUU0NBTl9DWUNMRV9DT01QTEVURURfRVZFTlQ6CisJCVdNQV9MT0dEKCIlczogcmVjZWl2ZWQgV01JX0VYVFNDQU5fQ1lDTEVfQ09NUExFVEVEX0VWRU5UIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWNkZl93YWtlX2xvY2tfcmVsZWFzZSgmd21hLT5leHRzY2FuX3dha2VfbG9jaywKKwkJCQkgICAgICBXSUZJX1BPV0VSX0VWRU5UX1dBS0VMT0NLX0VYVF9TQ0FOKTsKKwkJZ290byBleGl0X2hhbmRsZXI7CisJZGVmYXVsdDoKKwkJV01BX0xPR0UoIiVzOiBVbmtub3duIGV2ZW50KCVkKSBmcm9tIHRhcmdldCIsCisJCQkgX19mdW5jX18sIG9wcm5fZXZlbnQtPmV2ZW50KTsKKwkJY2RmX21lbV9mcmVlKG9wcm5faW5kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBNYWMtPnNtZS5wRXh0U2NhbkluZENiKHBNYWMtPmhIZGQsCisJCQkJZVNJUl9FWFRTQ0FOX1NDQU5fUFJPR1JFU1NfRVZFTlRfSU5ELCBvcHJuX2luZCk7CisJV01BX0xPR0koIiVzOiBzZW5kaW5nIHNjYW4gcHJvZ3Jlc3MgZXZlbnQgdG8gaGRkIiwgX19mdW5jX18pOworZXhpdF9oYW5kbGVyOgorCWNkZl9tZW1fZnJlZShvcHJuX2luZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX2V4dHNjYW5fdGFibGVfdXNhZ2VfZXZlbnRfaGFuZGxlcigpIC0gZXh0c2NhbiB0YWJsZSB1c2FnZSBldmVudCBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAY21kX3BhcmFtX2luZm86IGV2ZW50IGJ1ZmZlcgorICogQGxlbjogbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRhYmxlIHVzYWdlIHJlbGF0ZWQgZXZlbnQgYW5kIGluZGljYXRlCisgKiB1cHBlciBsYXllcnMgd2l0aCBhcHByb3ByaWF0ZSBjYWxsYmFjay4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAqLworaW50IHdtYV9leHRzY2FuX3RhYmxlX3VzYWdlX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkgIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgIHVpbnQzMl90IGxlbikKK3sKKwlXTUlfRVhUU0NBTl9UQUJMRV9VU0FHRV9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfZXh0c2Nhbl90YWJsZV91c2FnZV9ldmVudF9maXhlZF9wYXJhbSAqZXZlbnQ7CisJdFNpckV4dFNjYW5SZXN1bHRzQXZhaWxhYmxlSW5kUGFyYW1zICp0YmxfdXNnX2luZDsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCWlmICghcE1hYykgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgcE1hYyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghcE1hYy0+c21lLnBFeHRTY2FuSW5kQ2IpIHsKKwkJV01BX0xPR0UoIiVzOiBDYWxsYmFjayBub3QgcmVnaXN0ZXJlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmFtX2J1ZiA9IChXTUlfRVhUU0NBTl9UQUJMRV9VU0FHRV9FVkVOVElEX3BhcmFtX3RsdnMgKikKKwkJICAgIGNtZF9wYXJhbV9pbmZvOworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCB0YWJsZSB1c2FnZSBldmVudCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWV2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwl0YmxfdXNnX2luZCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqdGJsX3VzZ19pbmQpKTsKKwlpZiAoIXRibF91c2dfaW5kKSB7CisJCVdNQV9MT0dFKCIlczogdGFibGUgdXNhZ2UgYWxsb2NhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0YmxfdXNnX2luZC0+cmVxdWVzdElkID0gZXZlbnQtPnJlcXVlc3RfaWQ7CisJdGJsX3VzZ19pbmQtPm51bVJlc3VsdHNBdmFpbGFibGUgPSBldmVudC0+ZW50cmllc19pbl91c2U7CisKKwlwTWFjLT5zbWUucEV4dFNjYW5JbmRDYihwTWFjLT5oSGRkLAorCQkJCWVTSVJfRVhUU0NBTl9TQ0FOX1JFU19BVkFJTEFCTEVfSU5ELAorCQkJCXRibF91c2dfaW5kKTsKKwlXTUFfTE9HSSgiJXM6IHNlbmRpbmcgc2Nhbl9yZXMgYXZhaWxhYmxlIGV2ZW50IHRvIGhkZCIsIF9fZnVuY19fKTsKKwljZGZfbWVtX2ZyZWUodGJsX3VzZ19pbmQpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9leHRzY2FuX2NhcGFiaWxpdGllc19ldmVudF9oYW5kbGVyKCkgLSBleHRzY2FuIGNhcGFiaWxpdGllcyBldmVudCBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAY21kX3BhcmFtX2luZm86IGV2ZW50IGJ1ZmZlcgorICogQGxlbjogbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGNhcGFiaWxpdGllcyBldmVudCBhbmQgaW5kaWNhdGUKKyAqIHVwcGVyIGxheWVycyB3aXRoIHJlZ2lzdGVyZWQgY2FsbGJhY2suCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCisgKi8KK2ludCB3bWFfZXh0c2Nhbl9jYXBhYmlsaXRpZXNfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsCisJCQkJCSAgIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgICB1aW50MzJfdCBsZW4pCit7CisJV01JX0VYVFNDQU5fQ0FQQUJJTElUSUVTX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9leHRzY2FuX2NhcGFiaWxpdGllc19ldmVudF9maXhlZF9wYXJhbSAqZXZlbnQ7CisJd21pX2V4dHNjYW5fY2FjaGVfY2FwYWJpbGl0aWVzICpzcmNfY2FjaGU7CisJd21pX2V4dHNjYW5faG90bGlzdF9tb25pdG9yX2NhcGFiaWxpdGllcyAqc3JjX2hvdGxpc3Q7CisJd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfbW9uaXRvcl9jYXBhYmlsaXRpZXMgKnNyY19jaGFuZ2U7CisKKwlzdHJ1Y3QgZXh0X3NjYW5fY2FwYWJpbGl0aWVzX3Jlc3BvbnNlICAqZGVzdF9jYXBhYjsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCWlmICghcE1hYykgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgcE1hYyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghcE1hYy0+c21lLnBFeHRTY2FuSW5kQ2IpIHsKKwkJV01BX0xPR0UoIiVzOiBDYWxsYmFjayBub3QgcmVnaXN0ZXJlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmFtX2J1ZiA9IChXTUlfRVhUU0NBTl9DQVBBQklMSVRJRVNfRVZFTlRJRF9wYXJhbV90bHZzICopCisJCSAgICBjbWRfcGFyYW1faW5mbzsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgY2FwYWJpbGl0aWVzIGV2ZW50IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCXNyY19jYWNoZSA9IHBhcmFtX2J1Zi0+ZXh0c2Nhbl9jYWNoZV9jYXBhYmlsaXRpZXM7CisJc3JjX2hvdGxpc3QgPSBwYXJhbV9idWYtPmhvdGxpc3RfY2FwYWJpbGl0aWVzOworCXNyY19jaGFuZ2UgPSBwYXJhbV9idWYtPndsYW5fY2hhbmdlX2NhcGFiaWxpdGllczsKKworCWlmICghc3JjX2NhY2hlIHx8ICFzcmNfaG90bGlzdCB8fCAhc3JjX2NoYW5nZSkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgY2FwYWJpbGl0aWVzIGxpc3QiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXN0X2NhcGFiID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpkZXN0X2NhcGFiKSk7CisJaWYgKCFkZXN0X2NhcGFiKSB7CisJCVdNQV9MT0dFKCIlczogQWxsb2NhdGlvbiBmYWlsZWQgZm9yIGNhcGFiaWxpdGllcyBidWZmZXIiLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRlc3RfY2FwYWItPnJlcXVlc3RJZCA9IGV2ZW50LT5yZXF1ZXN0X2lkOworCWRlc3RfY2FwYWItPm1heF9zY2FuX2J1Y2tldHMgPSBzcmNfY2FjaGUtPm1heF9idWNrZXRzOworCWRlc3RfY2FwYWItPm1heF9zY2FuX2NhY2hlX3NpemUgPSBzcmNfY2FjaGUtPnNjYW5fY2FjaGVfZW50cnlfc2l6ZTsKKwlkZXN0X2NhcGFiLT5tYXhfYXBfY2FjaGVfcGVyX3NjYW4gPSBzcmNfY2FjaGUtPm1heF9ic3NpZF9wZXJfc2NhbjsKKwlkZXN0X2NhcGFiLT5tYXhfc2Nhbl9yZXBvcnRpbmdfdGhyZXNob2xkID0KKwkJc3JjX2NhY2hlLT5tYXhfdGFibGVfdXNhZ2VfdGhyZXNob2xkOworCisJZGVzdF9jYXBhYi0+bWF4X2hvdGxpc3RfYnNzaWRzID0gc3JjX2hvdGxpc3QtPm1heF9ob3RsaXN0X2VudHJpZXM7CisJZGVzdF9jYXBhYi0+bWF4X3Jzc2lfc2FtcGxlX3NpemUgPSBzcmNfY2hhbmdlLT5tYXhfcnNzaV9hdmVyYWdpbmdfc2FtcGxlczsKKwlkZXN0X2NhcGFiLT5tYXhfYnNzaWRfaGlzdG9yeV9lbnRyaWVzID0KKwkJc3JjX2NoYW5nZS0+bWF4X3Jzc2lfaGlzdG9yeV9lbnRyaWVzOworCWRlc3RfY2FwYWItPm1heF9zaWduaWZpY2FudF93aWZpX2NoYW5nZV9hcHMgPQorCQlzcmNfY2hhbmdlLT5tYXhfd2xhbl9jaGFuZ2VfZW50cmllczsKKwlkZXN0X2NhcGFiLT5tYXhfaG90bGlzdF9zc2lkcyA9CisJCQkJZXZlbnQtPm51bV9leHRzY2FuX2hvdGxpc3Rfc3NpZDsKKwlkZXN0X2NhcGFiLT5tYXhfbnVtYmVyX2Vwbm9fbmV0d29ya3MgPQorCQkJCWV2ZW50LT5udW1fZXBub19uZXR3b3JrczsKKwlkZXN0X2NhcGFiLT5tYXhfbnVtYmVyX2Vwbm9fbmV0d29ya3NfYnlfc3NpZCA9CisJCQkJZXZlbnQtPm51bV9lcG5vX25ldHdvcmtzOworCWRlc3RfY2FwYWItPm1heF9udW1iZXJfb2Zfd2hpdGVfbGlzdGVkX3NzaWQgPQorCQkJCWV2ZW50LT5udW1fcm9hbV9zc2lkX3doaXRlbGlzdDsKKwlkZXN0X2NhcGFiLT5zdGF0dXMgPSAwOworCisJV01BX0xPR0QoIiVzOiByZXF1ZXN0X2lkOiAldSBzdGF0dXM6ICVkIiwKKwkJX19mdW5jX18sIGRlc3RfY2FwYWItPnJlcXVlc3RJZCwgZGVzdF9jYXBhYi0+c3RhdHVzKTsKKworCVdNQV9MT0dEKCIlczogQ2FwYWJpbGl0aWVzOiBtYXhfc2Nhbl9idWNrZXRzOiAlZCwiCisJCSJtYXhfaG90bGlzdF9ic3NpZHM6ICVkLCBtYXhfc2Nhbl9jYWNoZV9zaXplOiAlZCwiCisJCSJtYXhfYXBfY2FjaGVfcGVyX3NjYW46ICVkLCBtYXhfc2Nhbl9yZXBvcnRpbmdfdGhyZXNob2xkOiAlZCwiCisJCSJtYXhfcnNzaV9zYW1wbGVfc2l6ZTogJWQsIG1heF9ic3NpZF9oaXN0b3J5X2VudHJpZXM6ICVkLCIKKwkJIm1heF9zaWduaWZpY2FudF93aWZpX2NoYW5nZV9hcHM6ICVkIiwKKwkJIF9fZnVuY19fLCBkZXN0X2NhcGFiLT5tYXhfc2Nhbl9idWNrZXRzLAorCQlkZXN0X2NhcGFiLT5tYXhfaG90bGlzdF9ic3NpZHMsCisJCWRlc3RfY2FwYWItPm1heF9zY2FuX2NhY2hlX3NpemUsCisJCWRlc3RfY2FwYWItPm1heF9hcF9jYWNoZV9wZXJfc2NhbiwKKwkJZGVzdF9jYXBhYi0+bWF4X3NjYW5fcmVwb3J0aW5nX3RocmVzaG9sZCwKKwkJZGVzdF9jYXBhYi0+bWF4X3Jzc2lfc2FtcGxlX3NpemUsCisJCWRlc3RfY2FwYWItPm1heF9ic3NpZF9oaXN0b3J5X2VudHJpZXMsCisJCWRlc3RfY2FwYWItPm1heF9zaWduaWZpY2FudF93aWZpX2NoYW5nZV9hcHMpOworCisJV01BX0xPR0QoIiVzOiBDYXBhYmlsaXRpZXM6IG1heF9ob3RsaXN0X3NzaWRzOiAlZCwiCisJCSAibWF4X251bWJlcl9lcG5vX25ldHdvcmtzOiAlZCwgbWF4X251bWJlcl9lcG5vX25ldHdvcmtzX2J5X3NzaWQ6ICVkLCIKKwkJICJtYXhfbnVtYmVyX29mX3doaXRlX2xpc3RlZF9zc2lkOiAlZCIsCisJCSBfX2Z1bmNfXywgZGVzdF9jYXBhYi0+bWF4X2hvdGxpc3Rfc3NpZHMsCisJCWRlc3RfY2FwYWItPm1heF9udW1iZXJfZXBub19uZXR3b3JrcywKKwkJZGVzdF9jYXBhYi0+bWF4X251bWJlcl9lcG5vX25ldHdvcmtzX2J5X3NzaWQsCisJCWRlc3RfY2FwYWItPm1heF9udW1iZXJfb2Zfd2hpdGVfbGlzdGVkX3NzaWQpOworCisJcE1hYy0+c21lLnBFeHRTY2FuSW5kQ2IocE1hYy0+aEhkZCwKKwkJCQllU0lSX0VYVFNDQU5fR0VUX0NBUEFCSUxJVElFU19JTkQsIGRlc3RfY2FwYWIpOworCVdNQV9MT0dJKCIlczogc2VuZGluZyBjYXBhYmlsaXRpZXMgZXZlbnQgdG8gaGRkIiwgX19mdW5jX18pOworCWNkZl9tZW1fZnJlZShkZXN0X2NhcGFiKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfZXh0c2Nhbl9ob3RsaXN0X21hdGNoX2V2ZW50X2hhbmRsZXIoKSAtIGhvdGxpc3QgbWF0Y2ggZXZlbnQgaGFuZGxlcgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGNtZF9wYXJhbV9pbmZvOiBldmVudCBidWZmZXIKKyAqIEBsZW46IGxlbmd0aAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBob3RsaXN0IG1hdGNoIGV2ZW50IGFuZCBpbmRpY2F0ZQorICogdXBwZXIgbGF5ZXJzIHdpdGggcmVnaXN0ZXJlZCBjYWxsYmFjay4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAqLworaW50IHdtYV9leHRzY2FuX2hvdGxpc3RfbWF0Y2hfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsCisJCQkJCSAgICB1aW50OF90ICpjbWRfcGFyYW1faW5mbywKKwkJCQkJICAgIHVpbnQzMl90IGxlbikKK3sKKwlXTUlfRVhUU0NBTl9IT1RMSVNUX01BVENIX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9leHRzY2FuX2hvdGxpc3RfbWF0Y2hfZXZlbnRfZml4ZWRfcGFyYW0gKmV2ZW50OworCXN0cnVjdCBleHRzY2FuX2hvdGxpc3RfbWF0Y2ggKmRlc3RfaG90bGlzdDsKKwl0U2lyV2lmaVNjYW5SZXN1bHQgKmRlc3RfYXA7CisJd21pX2V4dHNjYW5fd2xhbl9kZXNjcmlwdG9yICpzcmNfaG90bGlzdDsKKwlpbnQgbnVtYXAsIGosIGFwX2ZvdW5kID0gMDsKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCisJaWYgKCFwTWFjKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBwTWFjIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFwTWFjLT5zbWUucEV4dFNjYW5JbmRDYikgeworCQlXTUFfTE9HRSgiJXM6IENhbGxiYWNrIG5vdCByZWdpc3RlcmVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGFyYW1fYnVmID0gKFdNSV9FWFRTQ0FOX0hPVExJU1RfTUFUQ0hfRVZFTlRJRF9wYXJhbV90bHZzICopCisJCSAgICBjbWRfcGFyYW1faW5mbzsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgaG90bGlzdCBtYXRjaCBldmVudCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWV2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlzcmNfaG90bGlzdCA9IHBhcmFtX2J1Zi0+aG90bGlzdF9tYXRjaDsKKwludW1hcCA9IGV2ZW50LT50b3RhbF9lbnRyaWVzOworCisJaWYgKCFzcmNfaG90bGlzdCB8fCAhbnVtYXApIHsKKwkJV01BX0xPR0UoIiVzOiBIb3RsaXN0IEFQJ3MgbGlzdCBpbnZhbGlkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGVzdF9ob3RsaXN0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpkZXN0X2hvdGxpc3QpICsKKwkJCQkgICAgICBzaXplb2YoKmRlc3RfYXApICogbnVtYXApOworCWlmICghZGVzdF9ob3RsaXN0KSB7CisJCVdNQV9MT0dFKCIlczogQWxsb2NhdGlvbiBmYWlsZWQgZm9yIGhvdGxpc3QgYnVmZmVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGVzdF9hcCA9ICZkZXN0X2hvdGxpc3QtPmFwWzBdOworCWRlc3RfaG90bGlzdC0+bnVtT2ZBcHMgPSBldmVudC0+dG90YWxfZW50cmllczsKKwlkZXN0X2hvdGxpc3QtPnJlcXVlc3RJZCA9IGV2ZW50LT5jb25maWdfcmVxdWVzdF9pZDsKKworCWlmIChldmVudC0+Zmlyc3RfZW50cnlfaW5kZXggKworCQlldmVudC0+bnVtX2VudHJpZXNfaW5fcGFnZSA8IGV2ZW50LT50b3RhbF9lbnRyaWVzKQorCQlkZXN0X2hvdGxpc3QtPm1vcmVEYXRhID0gMTsKKwllbHNlCisJCWRlc3RfaG90bGlzdC0+bW9yZURhdGEgPSAwOworCisJV01BX0xPR0QoIiVzOiBIb3RsaXN0IG1hdGNoOiByZXF1ZXN0SWQ6ICV1LCIKKwkJICJudW1PZkFwczogJWQiLCBfX2Z1bmNfXywKKwkJIGRlc3RfaG90bGlzdC0+cmVxdWVzdElkLCBkZXN0X2hvdGxpc3QtPm51bU9mQXBzKTsKKworCS8qCisJICogQ3VycmVudGx5IGZpcm13YXJlIHNlbmRzIG9ubHkgb25lIGJzcyBpbmZvcm1hdGlvbiBpbi1jYXNlCisJICogb2YgYm90aCBob3RsaXN0IGFwIGZvdW5kIGFuZCBsb3N0LgorCSAqLworCWZvciAoaiA9IDA7IGogPCBudW1hcDsgaisrKSB7CisJCWRlc3RfYXAtPnJzc2kgPSAwOworCQlkZXN0X2FwLT5jaGFubmVsID0gc3JjX2hvdGxpc3QtPmNoYW5uZWw7CisJCWRlc3RfYXAtPnRzID0gc3JjX2hvdGxpc3QtPnRzdGFtcDsKKwkJYXBfZm91bmQgPSBzcmNfaG90bGlzdC0+ZmxhZ3MgJiBXTUlfSE9UTElTVF9GTEFHX1BSRVNFTkNFOworCQlkZXN0X2FwLT5ydHQgPSBzcmNfaG90bGlzdC0+cnR0OworCQlkZXN0X2FwLT5ydHRfc2QgPSBzcmNfaG90bGlzdC0+cnR0X3NkOworCQlkZXN0X2FwLT5iZWFjb25QZXJpb2QgPSBzcmNfaG90bGlzdC0+YmVhY29uX2ludGVydmFsOworCQlkZXN0X2FwLT5jYXBhYmlsaXR5ID0gc3JjX2hvdGxpc3QtPmNhcGFiaWxpdGllczsKKwkJZGVzdF9hcC0+aWVMZW5ndGggPSBzcmNfaG90bGlzdC0+aWVfbGVuZ3RoOworCQlXTUlfTUFDX0FERFJfVE9fQ0hBUl9BUlJBWSgmc3JjX2hvdGxpc3QtPmJzc2lkLAorCQkJCQkgICBkZXN0X2FwLT5ic3NpZC5ieXRlcyk7CisJCWNkZl9tZW1fY29weShkZXN0X2FwLT5zc2lkLCBzcmNfaG90bGlzdC0+c3NpZC5zc2lkLAorCQkJICAgICBzcmNfaG90bGlzdC0+c3NpZC5zc2lkX2xlbik7CisJCWRlc3RfYXAtPnNzaWRbc3JjX2hvdGxpc3QtPnNzaWQuc3NpZF9sZW5dID0gJ1wwJzsKKwkJZGVzdF9hcCsrOworCQlzcmNfaG90bGlzdCsrOworCX0KKwlkZXN0X2hvdGxpc3QtPmFwX2ZvdW5kID0gYXBfZm91bmQ7CisJcE1hYy0+c21lLnBFeHRTY2FuSW5kQ2IocE1hYy0+aEhkZCwKKwkJCQllU0lSX0VYVFNDQU5fSE9UTElTVF9NQVRDSF9JTkQsIGRlc3RfaG90bGlzdCk7CisJV01BX0xPR0koIiVzOiBzZW5kaW5nIGhvdGxpc3QgbWF0Y2ggZXZlbnQgdG8gaGRkIiwgX19mdW5jX18pOworCWNkZl9tZW1fZnJlZShkZXN0X2hvdGxpc3QpOworCXJldHVybiAwOworfQorCisvKiogd21hX2V4dHNjYW5fZmluZF91bmlxdWVfc2Nhbl9pZHMoKSAtIGZpbmQgdW5pcXVlIHNjYW4gaWRzCisgKiBAY21kX3BhcmFtX2luZm86IGV2ZW50IGRhdGEuCisgKgorICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIHBhcnNlcyB0aGUgaW5wdXQgYnNzIHRhYmxlIG9mIGluZm9ybWF0aW9uCisgKiBhbmQgZmluZCB0aGUgdW5pcXVlIG51bWJlciBvZiBzY2FuIGlkcworICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgd21hX2V4dHNjYW5fZmluZF91bmlxdWVfc2Nhbl9pZHMoY29uc3QgdV9pbnQ4X3QgKmNtZF9wYXJhbV9pbmZvKQoreworCVdNSV9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2V2ZW50X2ZpeGVkX3BhcmFtICAqZXZlbnQ7CisJd21pX2V4dHNjYW5fd2xhbl9kZXNjcmlwdG9yICAqc3JjX2hvdGxpc3Q7CisJd21pX2V4dHNjYW5fcnNzaV9pbmZvICAqc3JjX3Jzc2k7CisJaW50IHByZXZfc2Nhbl9pZCwgc2Nhbl9pZHNfY250LCBpOworCisJcGFyYW1fYnVmID0gKFdNSV9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX0VWRU5USURfcGFyYW1fdGx2cyAqKQorCQkJCQkJY21kX3BhcmFtX2luZm87CisJZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCXNyY19ob3RsaXN0ID0gcGFyYW1fYnVmLT5ic3NpZF9saXN0OworCXNyY19yc3NpID0gcGFyYW1fYnVmLT5yc3NpX2xpc3Q7CisKKwkvKiBGaW5kIHRoZSB1bmlxdWUgbnVtYmVyIG9mIHNjYW5faWQncyBmb3IgZ3JvdXBpbmcgKi8KKwlwcmV2X3NjYW5faWQgPSBzcmNfcnNzaS0+c2Nhbl9jeWNsZV9pZDsKKwlzY2FuX2lkc19jbnQgPSAxOworCWZvciAoaSA9IDE7IGkgPCBldmVudC0+bnVtX2VudHJpZXNfaW5fcGFnZTsgaSsrKSB7CisJCXNyY19yc3NpKys7CisKKwkJaWYgKHByZXZfc2Nhbl9pZCAhPSBzcmNfcnNzaS0+c2Nhbl9jeWNsZV9pZCkgeworCQkJc2Nhbl9pZHNfY250Kys7CisJCQlwcmV2X3NjYW5faWQgPSBzcmNfcnNzaS0+c2Nhbl9jeWNsZV9pZDsKKwkJfQorCX0KKworCXJldHVybiBzY2FuX2lkc19jbnQ7Cit9CisKKy8qKiB3bWFfZmlsbF9udW1fcmVzdWx0c19wZXJfc2Nhbl9pZCgpIC0gZmlsbCBudW1iZXIgb2YgYnNzIHBlciBzY2FuIGlkCisgKiBAY21kX3BhcmFtX2luZm86IGV2ZW50IGRhdGEuCisgKiBAc2Nhbl9pZF9ncm91cDogcG9pbnRlciB0byBzY2FuIGlkIGdyb3VwLgorICoKKyAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBwYXJzZXMgdGhlIGlucHV0IGJzcyB0YWJsZSBvZiBpbmZvcm1hdGlvbgorICogYW5kIGZpbmRzIGhvdyBtYW55IGJzcyBhcmUgdGhlcmUgcGVyIHVuaXF1ZSBzY2FuIGlkLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzOyBlcnJvciBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgd21hX2ZpbGxfbnVtX3Jlc3VsdHNfcGVyX3NjYW5faWQoY29uc3QgdV9pbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJc3RydWN0IGV4dHNjYW5fY2FjaGVkX3NjYW5fcmVzdWx0ICpzY2FuX2lkX2dyb3VwKQoreworCVdNSV9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2V2ZW50X2ZpeGVkX3BhcmFtICAqZXZlbnQ7CisJd21pX2V4dHNjYW5fd2xhbl9kZXNjcmlwdG9yICAqc3JjX2hvdGxpc3Q7CisJd21pX2V4dHNjYW5fcnNzaV9pbmZvICAqc3JjX3Jzc2k7CisJc3RydWN0IGV4dHNjYW5fY2FjaGVkX3NjYW5fcmVzdWx0ICp0X3NjYW5faWRfZ3JwOworCWludCBpLCBwcmV2X3NjYW5faWQ7CisKKwlwYXJhbV9idWYgPSAoV01JX0VYVFNDQU5fQ0FDSEVEX1JFU1VMVFNfRVZFTlRJRF9wYXJhbV90bHZzICopCisJCQkJCQljbWRfcGFyYW1faW5mbzsKKwlldmVudCA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJc3JjX2hvdGxpc3QgPSBwYXJhbV9idWYtPmJzc2lkX2xpc3Q7CisJc3JjX3Jzc2kgPSBwYXJhbV9idWYtPnJzc2lfbGlzdDsKKwl0X3NjYW5faWRfZ3JwID0gc2Nhbl9pZF9ncm91cDsKKworCXByZXZfc2Nhbl9pZCA9IHNyY19yc3NpLT5zY2FuX2N5Y2xlX2lkOworCisJdF9zY2FuX2lkX2dycC0+c2Nhbl9pZCA9IHNyY19yc3NpLT5zY2FuX2N5Y2xlX2lkOworCXRfc2Nhbl9pZF9ncnAtPmZsYWdzID0gc3JjX3Jzc2ktPmZsYWdzOworCXRfc2Nhbl9pZF9ncnAtPm51bV9yZXN1bHRzID0gMTsKKwlmb3IgKGkgPSAxOyBpIDwgZXZlbnQtPm51bV9lbnRyaWVzX2luX3BhZ2U7IGkrKykgeworCQlzcmNfcnNzaSsrOworCQlpZiAocHJldl9zY2FuX2lkID09IHNyY19yc3NpLT5zY2FuX2N5Y2xlX2lkKSB7CisJCQl0X3NjYW5faWRfZ3JwLT5udW1fcmVzdWx0cysrOworCQl9IGVsc2UgeworCQkJdF9zY2FuX2lkX2dycCsrOworCQkJcHJldl9zY2FuX2lkID0gdF9zY2FuX2lkX2dycC0+c2Nhbl9pZCA9CisJCQkJc3JjX3Jzc2ktPnNjYW5fY3ljbGVfaWQ7CisJCQl0X3NjYW5faWRfZ3JwLT5mbGFncyA9IHNyY19yc3NpLT5mbGFnczsKKwkJCXRfc2Nhbl9pZF9ncnAtPm51bV9yZXN1bHRzID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqIHdtYV9ncm91cF9udW1fYnNzX3RvX3NjYW5faWQoKSAtIGdyb3VwIGJzcyB0byBzY2FuIGlkIHRhYmxlCisgKiBAY21kX3BhcmFtX2luZm86IGV2ZW50IGRhdGEuCisgKiBAY2FjaGVkX3Jlc3VsdDogcG9pbnRlciB0byBjYWNoZWQgdGFibGUuCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgYnNzIGluZm9ybWF0aW9uIGZyb20gdGhlIGZvcm1hdAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IGJzcyBpbmZvIHtyc3NpLCBjaGFubmVsLCBzc2lkLCBic3NpZCwgdGltZXN0YW1wfSB8IHNjYW4gaWRfMSB8IGZsYWdzIHwKKyAqIHwgYnNzIGluZm8ge3Jzc2ksIGNoYW5uZWwsIHNzaWQsIGJzc2lkLCB0aW1lc3RhbXB9IHwgc2NhbiBpZF8yIHwgZmxhZ3MgfAorICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgKiB8IGJzcyBpbmZvIHtyc3NpLCBjaGFubmVsLCBzc2lkLCBic3NpZCwgdGltZXN0YW1wfSB8IHNjYW4gaWRfTiB8IGZsYWdzIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGFuZCBjb252ZXJ0cyBpdCBpbnRvIHRoZSBiZWxvdyBmb3JtYXQgYW5kIHN0b3JlIGl0CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IHNjYW4gaWRfMSB8IC0+IGJzcyBpbmZvXzEgLT4gYnNzIGluZm9fMiAtPiAuLi4uIGJzcyBpbmZvX00xCisgKiB8IHNjYW4gaWRfMiB8IC0+IGJzcyBpbmZvXzEgLT4gYnNzIGluZm9fMiAtPiAuLi4uIGJzcyBpbmZvX00yCisgKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgKiB8IHNjYW4gaWRfTiB8IC0+IGJzcyBpbmZvXzEgLT4gYnNzIGluZm9fMiAtPiAuLi4uIGJzcyBpbmZvX01uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzczsgZXJyb3IgbnVtYmVyIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHdtYV9ncm91cF9udW1fYnNzX3RvX3NjYW5faWQoY29uc3QgdV9pbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJc3RydWN0IGV4dHNjYW5fY2FjaGVkX3NjYW5fcmVzdWx0cyAqY2FjaGVkX3Jlc3VsdCkKK3sKKwlXTUlfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfZXh0c2Nhbl9jYWNoZWRfcmVzdWx0c19ldmVudF9maXhlZF9wYXJhbSAgKmV2ZW50OworCXdtaV9leHRzY2FuX3dsYW5fZGVzY3JpcHRvciAgKnNyY19ob3RsaXN0OworCXdtaV9leHRzY2FuX3Jzc2lfaW5mbyAgKnNyY19yc3NpOworCXN0cnVjdCBleHRzY2FuX2NhY2hlZF9zY2FuX3Jlc3VsdHMgKnRfY2FjaGVkX3Jlc3VsdDsKKwlzdHJ1Y3QgZXh0c2Nhbl9jYWNoZWRfc2Nhbl9yZXN1bHQgKnRfc2Nhbl9pZF9ncnA7CisJaW50IGksIGo7CisJdFNpcldpZmlTY2FuUmVzdWx0ICphcDsKKworCXBhcmFtX2J1ZiA9IChXTUlfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19FVkVOVElEX3BhcmFtX3RsdnMgKikKKwkJCQkJCWNtZF9wYXJhbV9pbmZvOworCWV2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlzcmNfaG90bGlzdCA9IHBhcmFtX2J1Zi0+YnNzaWRfbGlzdDsKKwlzcmNfcnNzaSA9IHBhcmFtX2J1Zi0+cnNzaV9saXN0OworCXRfY2FjaGVkX3Jlc3VsdCA9IGNhY2hlZF9yZXN1bHQ7CisJdF9zY2FuX2lkX2dycCA9ICZ0X2NhY2hlZF9yZXN1bHQtPnJlc3VsdFswXTsKKworCVdNQV9MT0dEKCIlczogbnVtX3NjYW5faWRzOiVkIiwgX19mdW5jX18sCisJCQl0X2NhY2hlZF9yZXN1bHQtPm51bV9zY2FuX2lkcyk7CisJZm9yIChpID0gMDsgaSA8IHRfY2FjaGVkX3Jlc3VsdC0+bnVtX3NjYW5faWRzOyBpKyspIHsKKwkJV01BX0xPR0QoIiVzOiBudW1fcmVzdWx0czolZCIsIF9fZnVuY19fLAorCQkJdF9zY2FuX2lkX2dycC0+bnVtX3Jlc3VsdHMpOworCQl0X3NjYW5faWRfZ3JwLT5hcCA9IGNkZl9tZW1fbWFsbG9jKHRfc2Nhbl9pZF9ncnAtPm51bV9yZXN1bHRzICoKKwkJCQkJCXNpemVvZigqYXApKTsKKwkJaWYgKCF0X3NjYW5faWRfZ3JwLT5hcCkgeworCQkJV01BX0xPR0QoIiVzOiBjZGZfbWVtX21hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWFwID0gJnRfc2Nhbl9pZF9ncnAtPmFwWzBdOworCQlmb3IgKGogPSAwOyBqIDwgdF9zY2FuX2lkX2dycC0+bnVtX3Jlc3VsdHM7IGorKykgeworCQkJYXAtPmNoYW5uZWwgPSBzcmNfaG90bGlzdC0+Y2hhbm5lbDsKKwkJCWFwLT50cyA9IFdNQV9NU0VDX1RPX1VTRUMoc3JjX3Jzc2ktPnRzdGFtcCk7CisJCQlhcC0+cnR0ID0gc3JjX2hvdGxpc3QtPnJ0dDsKKwkJCWFwLT5ydHRfc2QgPSBzcmNfaG90bGlzdC0+cnR0X3NkOworCQkJYXAtPmJlYWNvblBlcmlvZCA9IHNyY19ob3RsaXN0LT5iZWFjb25faW50ZXJ2YWw7CisJCQlhcC0+Y2FwYWJpbGl0eSA9IHNyY19ob3RsaXN0LT5jYXBhYmlsaXRpZXM7CisJCQlhcC0+aWVMZW5ndGggPSBzcmNfaG90bGlzdC0+aWVfbGVuZ3RoOworCisJCQkvKiBGaXJtd2FyZSBhbHJlYWR5IGFwcGxpZWQgbm9pc2UgZmxvb3IgYWRqdXN0bWVudCBhbmQKKwkJCSAqIGR1ZSB0byBXTUkgaW50ZXJmYWNlICJVSU5UMzIgcnNzaSIsIGhvc3QgZHJpdmVyCisJCQkgKiByZWNlaXZlcyBhIHBvc2l0aXZlIHZhbHVlLCBoZW5jZSBjb252ZXJ0IHRvCisJCQkgKiBzaWduZWQgY2hhciB0byBnZXQgdGhlIGFic29sdXRlIHJzc2kuCisJCQkgKi8KKwkJCWFwLT5yc3NpID0gKHNpZ25lZCBjaGFyKSBzcmNfcnNzaS0+cnNzaTsKKwkJCVdNSV9NQUNfQUREUl9UT19DSEFSX0FSUkFZKCZzcmNfaG90bGlzdC0+YnNzaWQsCisJCQkJCQkgICBhcC0+YnNzaWQuYnl0ZXMpOworCisJCQljZGZfbWVtX2NvcHkoYXAtPnNzaWQsIHNyY19ob3RsaXN0LT5zc2lkLnNzaWQsCisJCQkJCXNyY19ob3RsaXN0LT5zc2lkLnNzaWRfbGVuKTsKKwkJCWFwLT5zc2lkW3NyY19ob3RsaXN0LT5zc2lkLnNzaWRfbGVuXSA9ICdcMCc7CisJCQlhcCsrOworCQkJc3JjX3Jzc2krKzsKKwkJCXNyY19ob3RsaXN0Kys7CisJCX0KKwkJdF9zY2FuX2lkX2dycCsrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfZXh0c2Nhbl9jYWNoZWRfcmVzdWx0c19ldmVudF9oYW5kbGVyKCkgLSBjYWNoZWQgcmVzdWx0cyBldmVudCBoYW5kbGVyCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAY21kX3BhcmFtX2luZm86IGV2ZW50IGJ1ZmZlcgorICogQGxlbjogbGVuZ3RoIG9mIEBjbWRfcGFyYW1faW5mbworICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBjYWNoZWQgcmVzdWx0cyBldmVudCBhbmQgaW5kaWNhdGUKKyAqIGNhY2hlZCByZXN1bHRzIHRvIHVwcGVyIGxheWVyLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlLgorICovCitpbnQgd21hX2V4dHNjYW5fY2FjaGVkX3Jlc3VsdHNfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsCisJCQkJCSAgICAgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJCSAgICAgdWludDMyX3QgbGVuKQoreworCVdNSV9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2V2ZW50X2ZpeGVkX3BhcmFtICpldmVudDsKKwlzdHJ1Y3QgZXh0c2Nhbl9jYWNoZWRfc2Nhbl9yZXN1bHRzICpkZXN0X2NhY2hlbGlzdDsKKwlzdHJ1Y3QgZXh0c2Nhbl9jYWNoZWRfc2Nhbl9yZXN1bHQgKmRlc3RfcmVzdWx0OworCXN0cnVjdCBleHRzY2FuX2NhY2hlZF9zY2FuX3Jlc3VsdHMgZW1wdHlfY2FjaGVsaXN0OworCXdtaV9leHRzY2FuX3dsYW5fZGVzY3JpcHRvciAqc3JjX2hvdGxpc3Q7CisJd21pX2V4dHNjYW5fcnNzaV9pbmZvICpzcmNfcnNzaTsKKwlpbnQgbnVtYXAsIGksIG1vcmVkYXRhLCBzY2FuX2lkc19jbnQsIGJ1Zl9sZW47CisKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCWlmICghcE1hYykgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgcE1hYyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghcE1hYy0+c21lLnBFeHRTY2FuSW5kQ2IpIHsKKwkJV01BX0xPR0UoIiVzOiBDYWxsYmFjayBub3QgcmVnaXN0ZXJlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmFtX2J1ZiA9IChXTUlfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19FVkVOVElEX3BhcmFtX3RsdnMgKikKKwkJICAgIGNtZF9wYXJhbV9pbmZvOworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBjYWNoZWQgcmVzdWx0cyBldmVudCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWV2ZW50ID0gcGFyYW1fYnVmLT5maXhlZF9wYXJhbTsKKwlzcmNfaG90bGlzdCA9IHBhcmFtX2J1Zi0+YnNzaWRfbGlzdDsKKwlzcmNfcnNzaSA9IHBhcmFtX2J1Zi0+cnNzaV9saXN0OworCW51bWFwID0gZXZlbnQtPm51bV9lbnRyaWVzX2luX3BhZ2U7CisJV01BX0xPR0koIlRvdGFsX2VudHJpZXMgJXUgZmlyc3RfZW50cnlfaW5kZXggJXUiLCBldmVudC0+dG90YWxfZW50cmllcywKKwkJCWV2ZW50LT5maXJzdF9lbnRyeV9pbmRleCk7CisJV01BX0xPR0koIm51bV9lbnRyaWVzX2luX3BhZ2UgJWQiLCBudW1hcCk7CisJaWYgKCFzcmNfaG90bGlzdCB8fCAhc3JjX3Jzc2kgfHwgIW51bWFwKSB7CisJCVdNQV9MT0dFKCIlczogQ2FjaGVkIHJlc3VsdHMgZW1wdHksIHNlbmQgMCByZXN1bHRzIiwgX19mdW5jX18pOworCQlnb3RvIG5vcmVzdWx0czsKKwl9CisJaWYgKGV2ZW50LT5maXJzdF9lbnRyeV9pbmRleCArCisJICAgIGV2ZW50LT5udW1fZW50cmllc19pbl9wYWdlIDwgZXZlbnQtPnRvdGFsX2VudHJpZXMpCisJCW1vcmVkYXRhID0gMTsKKwllbHNlCisJCW1vcmVkYXRhID0gMDsKKworCWRlc3RfY2FjaGVsaXN0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpkZXN0X2NhY2hlbGlzdCkpOworCWlmICghZGVzdF9jYWNoZWxpc3QpIHsKKwkJV01BX0xPR0UoIiVzOiBjZGZfbWVtX21hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljZGZfbWVtX3plcm8oZGVzdF9jYWNoZWxpc3QsIHNpemVvZigqZGVzdF9jYWNoZWxpc3QpKTsKKwlkZXN0X2NhY2hlbGlzdC0+cmVxdWVzdF9pZCA9IGV2ZW50LT5yZXF1ZXN0X2lkOworCWRlc3RfY2FjaGVsaXN0LT5tb3JlX2RhdGEgPSBtb3JlZGF0YTsKKworCXNjYW5faWRzX2NudCA9IHdtYV9leHRzY2FuX2ZpbmRfdW5pcXVlX3NjYW5faWRzKGNtZF9wYXJhbV9pbmZvKTsKKwlXTUFfTE9HSSgiJXM6IHNjYW5faWRzX2NudCAlZCIsIF9fZnVuY19fLCBzY2FuX2lkc19jbnQpOworCWRlc3RfY2FjaGVsaXN0LT5udW1fc2Nhbl9pZHMgPSBzY2FuX2lkc19jbnQ7CisKKwlidWZfbGVuID0gc2l6ZW9mKCpkZXN0X3Jlc3VsdCkgKiBzY2FuX2lkc19jbnQ7CisJZGVzdF9jYWNoZWxpc3QtPnJlc3VsdCA9IGNkZl9tZW1fbWFsbG9jKGJ1Zl9sZW4pOworCWlmICghZGVzdF9jYWNoZWxpc3QtPnJlc3VsdCkgeworCQlXTUFfTE9HRSgiJXM6IEFsbG9jYXRpb24gZmFpbGVkIGZvciBzY2FuaWQgZ3JvdXBpbmciLCBfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShkZXN0X2NhY2hlbGlzdCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRlc3RfcmVzdWx0ID0gZGVzdF9jYWNoZWxpc3QtPnJlc3VsdDsKKwl3bWFfZmlsbF9udW1fcmVzdWx0c19wZXJfc2Nhbl9pZChjbWRfcGFyYW1faW5mbywgZGVzdF9yZXN1bHQpOworCXdtYV9ncm91cF9udW1fYnNzX3RvX3NjYW5faWQoY21kX3BhcmFtX2luZm8sIGRlc3RfY2FjaGVsaXN0KTsKKworCXBNYWMtPnNtZS5wRXh0U2NhbkluZENiKHBNYWMtPmhIZGQsCisJCQkJZVNJUl9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX0lORCwKKwkJCQlkZXN0X2NhY2hlbGlzdCk7CisJV01BX0xPR0koIiVzOiBzZW5kaW5nIGNhY2hlZCByZXN1bHRzIGV2ZW50IiwgX19mdW5jX18pOworCWRlc3RfcmVzdWx0ID0gZGVzdF9jYWNoZWxpc3QtPnJlc3VsdDsKKwlmb3IgKGkgPSAwOyBpIDwgZGVzdF9jYWNoZWxpc3QtPm51bV9zY2FuX2lkczsgaSsrKSB7CisJCWNkZl9tZW1fZnJlZShkZXN0X3Jlc3VsdC0+YXApOworCQlkZXN0X3Jlc3VsdCsrOworCX0KKwljZGZfbWVtX2ZyZWUoZGVzdF9jYWNoZWxpc3QtPnJlc3VsdCk7CisJY2RmX21lbV9mcmVlKGRlc3RfY2FjaGVsaXN0KTsKKwlyZXR1cm4gMDsKKworbm9yZXN1bHRzOgorCWVtcHR5X2NhY2hlbGlzdC5yZXF1ZXN0X2lkID0gZXZlbnQtPnJlcXVlc3RfaWQ7CisJZW1wdHlfY2FjaGVsaXN0Lm1vcmVfZGF0YSA9IDA7CisJZW1wdHlfY2FjaGVsaXN0Lm51bV9zY2FuX2lkcyA9IDA7CisKKwlwTWFjLT5zbWUucEV4dFNjYW5JbmRDYihwTWFjLT5oSGRkLAorCQkJCWVTSVJfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19JTkQsCisJCQkJJmVtcHR5X2NhY2hlbGlzdCk7CisJV01BX0xPR0koIiVzOiBzZW5kaW5nIGNhY2hlZCByZXN1bHRzIGV2ZW50IiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9leHRzY2FuX2NoYW5nZV9yZXN1bHRzX2V2ZW50X2hhbmRsZXIoKSAtIGNoYW5nZSByZXN1bHRzIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZXZlbnQgYnVmZmVyCisgKiBAbGVuOiBsZW5ndGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgY2hhbmdlIHJlc3VsdHMgZXZlbnQgYW5kIGluZGljYXRlCisgKiBjaGFuZ2UgcmVzdWx0cyB0byB1cHBlciBsYXllci4KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAqLworaW50IHdtYV9leHRzY2FuX2NoYW5nZV9yZXN1bHRzX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLAorCQkJCQkgICAgIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgICAgIHVpbnQzMl90IGxlbikKK3sKKwlXTUlfRVhUU0NBTl9XTEFOX0NIQU5HRV9SRVNVTFRTX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9leHRzY2FuX3dsYW5fY2hhbmdlX3Jlc3VsdHNfZXZlbnRfZml4ZWRfcGFyYW0gKmV2ZW50OworCXRTaXJXaWZpU2lnbmlmaWNhbnRDaGFuZ2VFdmVudCAqZGVzdF9jaGdsaXN0OworCXRTaXJXaWZpU2lnbmlmaWNhbnRDaGFuZ2UgKmRlc3RfYXA7CisJd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfcmVzdWx0X2Jzc2lkICpzcmNfY2hnbGlzdDsKKworCWludCBudW1hcDsKKwlpbnQgaSwgazsKKwl1aW50OF90ICpzcmNfcnNzaTsKKwlpbnQgY291bnQgPSAwOworCWludCBtb3JlZGF0YTsKKwlpbnQgcnNzaV9udW0gPSAwOworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisJaWYgKCFwTWFjKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBwTWFjIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFwTWFjLT5zbWUucEV4dFNjYW5JbmRDYikgeworCQlXTUFfTE9HRSgiJXM6IENhbGxiYWNrIG5vdCByZWdpc3RlcmVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGFyYW1fYnVmID0gKFdNSV9FWFRTQ0FOX1dMQU5fQ0hBTkdFX1JFU1VMVFNfRVZFTlRJRF9wYXJhbV90bHZzICopCisJCSAgICBjbWRfcGFyYW1faW5mbzsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgY2hhbmdlIG1vbml0b3IgZXZlbnQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlldmVudCA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJc3JjX2NoZ2xpc3QgPSBwYXJhbV9idWYtPmJzc2lkX3NpZ25hbF9kZXNjcmlwdG9yX2xpc3Q7CisJc3JjX3Jzc2kgPSBwYXJhbV9idWYtPnJzc2lfbGlzdDsKKwludW1hcCA9IGV2ZW50LT5udW1fZW50cmllc19pbl9wYWdlOworCisJaWYgKCFzcmNfY2hnbGlzdCB8fCAhbnVtYXApIHsKKwkJV01BX0xPR0UoIiVzOiBSZXN1bHRzIGludmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnVtYXA7IGkrKykgeworCQlyc3NpX251bSArPSBzcmNfY2hnbGlzdC0+bnVtX3Jzc2lfc2FtcGxlczsKKwl9CisJaWYgKGV2ZW50LT5maXJzdF9lbnRyeV9pbmRleCArCisJICAgIGV2ZW50LT5udW1fZW50cmllc19pbl9wYWdlIDwgZXZlbnQtPnRvdGFsX2VudHJpZXMpIHsKKwkJbW9yZWRhdGEgPSAxOworCX0gZWxzZSB7CisJCW1vcmVkYXRhID0gMDsKKwl9CisJZGVzdF9jaGdsaXN0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpkZXN0X2NoZ2xpc3QpICsKKwkJCQkgICAgICBzaXplb2YoKmRlc3RfYXApICogbnVtYXAgKworCQkJCSAgICAgIHNpemVvZihpbnQzMl90KSAqIHJzc2lfbnVtKTsKKwlpZiAoIWRlc3RfY2hnbGlzdCkgeworCQlXTUFfTE9HRSgiJXM6IEFsbG9jYXRpb24gZmFpbGVkIGZvciBjaGFuZ2UgbW9uaXRvciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRlc3RfYXAgPSAmZGVzdF9jaGdsaXN0LT5hcFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtYXA7IGkrKykgeworCQlkZXN0X2FwLT5jaGFubmVsID0gc3JjX2NoZ2xpc3QtPmNoYW5uZWw7CisJCVdNSV9NQUNfQUREUl9UT19DSEFSX0FSUkFZKCZzcmNfY2hnbGlzdC0+YnNzaWQsCisJCQkJCSAgIGRlc3RfYXAtPmJzc2lkLmJ5dGVzKTsKKwkJZGVzdF9hcC0+bnVtT2ZSc3NpID0gc3JjX2NoZ2xpc3QtPm51bV9yc3NpX3NhbXBsZXM7CisJCWlmIChkZXN0X2FwLT5udW1PZlJzc2kpIHsKKwkJCWZvciAoayA9IDA7IGsgPCBkZXN0X2FwLT5udW1PZlJzc2k7IGsrKykgeworCQkJCWRlc3RfYXAtPnJzc2lba10gPSBXTUFfVEdUX05PSVNFX0ZMT09SX0RCTSArCisJCQkJCQkgICBzcmNfcnNzaVtjb3VudCsrXTsKKwkJCX0KKwkJfQorCQlkZXN0X2FwICs9IGRlc3RfYXAtPm51bU9mUnNzaSAqIHNpemVvZihpbnQzMl90KTsKKwkJc3JjX2NoZ2xpc3QrKzsKKwl9CisJZGVzdF9jaGdsaXN0LT5yZXF1ZXN0SWQgPSBldmVudC0+cmVxdWVzdF9pZDsKKwlkZXN0X2NoZ2xpc3QtPm1vcmVEYXRhID0gbW9yZWRhdGE7CisJZGVzdF9jaGdsaXN0LT5udW1SZXN1bHRzID0gZXZlbnQtPnRvdGFsX2VudHJpZXM7CisKKwlwTWFjLT5zbWUucEV4dFNjYW5JbmRDYihwTWFjLT5oSGRkLAorCQkJCWVTSVJfRVhUU0NBTl9TSUdOSUZJQ0FOVF9XSUZJX0NIQU5HRV9SRVNVTFRTX0lORCwKKwkJCQlkZXN0X2NoZ2xpc3QpOworCVdNQV9MT0dJKCIlczogc2VuZGluZyBjaGFuZ2UgbW9uaXRvciByZXN1bHRzIiwgX19mdW5jX18pOworCWNkZl9tZW1fZnJlZShkZXN0X2NoZ2xpc3QpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9wYXNzcG9pbnRfbWF0Y2hfZXZlbnRfaGFuZGxlcigpIC0gcGFzc3BvaW50IG1hdGNoIGZvdW5kIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IFdNQSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZXZlbnQgZGF0YQorICogQGxlbjogZXZlbnQgZGF0YSBsZW5ndGgKKyAqCisgKiBUaGlzIGlzIHRoZSBwYXNzcG9pbnQgbWF0Y2ggZm91bmQgZXZlbnQgaGFuZGxlcjsgaXQgcmVhZHMgZXZlbnQgZGF0YSBmcm9tCisgKiBAY21kX3BhcmFtX2luZm8gYW5kIGZpbGwgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBhbmQgc2VuZHMgaW5kaWNhdGlvbgorICogdXAgbGF5ZXIuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworaW50IHdtYV9wYXNzcG9pbnRfbWF0Y2hfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsCisJCQkJICAgICB1aW50OF90ICAqY21kX3BhcmFtX2luZm8sCisJCQkJICAgICB1aW50MzJfdCBsZW4pCit7CisJV01JX1BBU1NQT0lOVF9NQVRDSF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl3bWlfcGFzc3BvaW50X2V2ZW50X2hkciAgKmV2ZW50OworCXN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9tYXRjaCAgKmRlc3RfbWF0Y2g7CisJdFNpcldpZmlTY2FuUmVzdWx0ICAgICAgKmRlc3RfYXA7CisJdWludDhfdCAqYnVmX3B0cjsKKwl0cEFuaVNpckdsb2JhbCBtYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisKKwlpZiAoIW1hYykgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgbWFjIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFtYWMtPnNtZS5wRXh0U2NhbkluZENiKSB7CisJCVdNQV9MT0dFKCIlczogQ2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcmFtX2J1ZiA9IChXTUlfUEFTU1BPSU5UX01BVENIX0VWRU5USURfcGFyYW1fdGx2cyAqKSBjbWRfcGFyYW1faW5mbzsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgcGFzc3BvaW50IG1hdGNoIGV2ZW50IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCWJ1Zl9wdHIgPSAodWludDhfdCAqKXBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisKKwlkZXN0X21hdGNoID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpkZXN0X21hdGNoKSArCisJCQkJZXZlbnQtPmllX2xlbmd0aCArIGV2ZW50LT5hbnFwX2xlbmd0aCk7CisJaWYgKCFkZXN0X21hdGNoKSB7CisJCVdNQV9MT0dFKCIlczogY2RmX21lbV9tYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGVzdF9hcCA9ICZkZXN0X21hdGNoLT5hcDsKKwlkZXN0X21hdGNoLT5yZXF1ZXN0X2lkID0gMDsKKwlkZXN0X21hdGNoLT5pZCA9IGV2ZW50LT5pZDsKKwlkZXN0X21hdGNoLT5hbnFwX2xlbiA9IGV2ZW50LT5hbnFwX2xlbmd0aDsKKwlXTUFfTE9HSSgiJXM6IHBhc3Nwb2ludCBtYXRjaDogaWQ6ICV1IGFucXAgbGVuZ3RoICV1IiwgX19mdW5jX18sCisJCSBkZXN0X21hdGNoLT5pZCwgZGVzdF9tYXRjaC0+YW5xcF9sZW4pOworCisJZGVzdF9hcC0+Y2hhbm5lbCA9IGV2ZW50LT5jaGFubmVsX21oejsKKwlkZXN0X2FwLT50cyA9IGV2ZW50LT50aW1lc3RhbXA7CisJZGVzdF9hcC0+cnR0ID0gZXZlbnQtPnJ0dDsKKwlkZXN0X2FwLT5yc3NpID0gZXZlbnQtPnJzc2k7CisJZGVzdF9hcC0+cnR0X3NkID0gZXZlbnQtPnJ0dF9zZDsKKwlkZXN0X2FwLT5iZWFjb25QZXJpb2QgPSBldmVudC0+YmVhY29uX3BlcmlvZDsKKwlkZXN0X2FwLT5jYXBhYmlsaXR5ID0gZXZlbnQtPmNhcGFiaWxpdHk7CisJZGVzdF9hcC0+aWVMZW5ndGggPSBldmVudC0+aWVfbGVuZ3RoOworCVdNSV9NQUNfQUREUl9UT19DSEFSX0FSUkFZKCZldmVudC0+YnNzaWQsIGRlc3RfYXAtPmJzc2lkLmJ5dGVzKTsKKwljZGZfbWVtX2NvcHkoZGVzdF9hcC0+c3NpZCwgZXZlbnQtPnNzaWQuc3NpZCwKKwkJCQlldmVudC0+c3NpZC5zc2lkX2xlbik7CisJZGVzdF9hcC0+c3NpZFtldmVudC0+c3NpZC5zc2lkX2xlbl0gPSAnXDAnOworCWNkZl9tZW1fY29weShkZXN0X2FwLT5pZURhdGEsIGJ1Zl9wdHIgKyBzaXplb2YoKmV2ZW50KSArCisJCQlXTUlfVExWX0hEUl9TSVpFLCBkZXN0X2FwLT5pZUxlbmd0aCk7CisJY2RmX21lbV9jb3B5KGRlc3RfbWF0Y2gtPmFucXAsIGJ1Zl9wdHIgKyBzaXplb2YoKmV2ZW50KSArCisJCQlXTUlfVExWX0hEUl9TSVpFICsgZGVzdF9hcC0+aWVMZW5ndGgsCisJCQlkZXN0X21hdGNoLT5hbnFwX2xlbik7CisKKwltYWMtPnNtZS5wRXh0U2NhbkluZENiKG1hYy0+aEhkZCwKKwkJCQllU0lSX1BBU1NQT0lOVF9ORVRXT1JLX0ZPVU5EX0lORCwKKwkJCQlkZXN0X21hdGNoKTsKKwlXTUFfTE9HSSgiJXM6IHNlbmRpbmcgcGFzc3BvaW50IG1hdGNoIGV2ZW50IHRvIGhkZCIsIF9fZnVuY19fKTsKKwljZGZfbWVtX2ZyZWUoZGVzdF9tYXRjaCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX2V4dHNjYW5faG90bGlzdF9zc2lkX21hdGNoX2V2ZW50X2hhbmRsZXIoKSAtCisgKglIYW5kbGVyIGZvciBTU0lEIGhvdGxpc3QgbWF0Y2ggZXZlbnQgZnJvbSBmaXJtd2FyZQorICogQGhhbmRsZTogV01BIGhhbmRsZQorICogQGNtZF9wYXJhbV9pbmZvOiBXTUkgY29tbWFuZCBidWZmZXIKKyAqIEBsZW46IGxlbmd0aCBvZiBAY21kX3BhcmFtX2luZm8KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZQorICovCitpbnQKK3dtYV9leHRzY2FuX2hvdGxpc3Rfc3NpZF9tYXRjaF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkJICAgICB1aW50OF90ICpjbWRfcGFyYW1faW5mbywKKwkJCQkJICAgICB1aW50MzJfdCBsZW4pCit7CisJV01JX0VYVFNDQU5fSE9UTElTVF9TU0lEX01BVENIX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXdtaV9leHRzY2FuX2hvdGxpc3Rfc3NpZF9tYXRjaF9ldmVudF9maXhlZF9wYXJhbSAgKmV2ZW50OworCXRTaXJXaWZpU2NhblJlc3VsdEV2ZW50ICAqZGVzdF9ob3RsaXN0OworCXRTaXJXaWZpU2NhblJlc3VsdCAgICAgICpkZXN0X2FwOworCXdtaV9leHRzY2FuX3dsYW5fZGVzY3JpcHRvciAgICAqc3JjX2hvdGxpc3Q7CisJaW50IG51bWFwLCBqOworCWJvb2wgc3NpZF9mb3VuZCA9IGZhbHNlOworCXRwQW5pU2lyR2xvYmFsIG1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKworCWlmICghbWFjKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBtYWMiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghbWFjLT5zbWUucEV4dFNjYW5JbmRDYikgeworCQlXTUFfTE9HRSgiJXM6IENhbGxiYWNrIG5vdCByZWdpc3RlcmVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwYXJhbV9idWYgPSAoV01JX0VYVFNDQU5fSE9UTElTVF9TU0lEX01BVENIX0VWRU5USURfcGFyYW1fdGx2cyAqKQorCQkJCQljbWRfcGFyYW1faW5mbzsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgaG90bGlzdCBtYXRjaCBldmVudCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCXNyY19ob3RsaXN0ID0gcGFyYW1fYnVmLT5ob3RsaXN0X3NzaWRfbWF0Y2g7CisJbnVtYXAgPSBldmVudC0+dG90YWxfZW50cmllczsKKwlpZiAoIXNyY19ob3RsaXN0IHx8ICFudW1hcCkgeworCQlXTUFfTE9HRSgiJXM6IEhvdGxpc3QgQVAncyBsaXN0IGludmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRlc3RfaG90bGlzdCA9IGNkZl9tZW1fbWFsbG9jKHNpemVvZigqZGVzdF9ob3RsaXN0KSArCisJCQkJCXNpemVvZigqZGVzdF9hcCkgKiBudW1hcCk7CisJaWYgKCFkZXN0X2hvdGxpc3QpIHsKKwkJV01BX0xPR0UoIiVzOiBBbGxvY2F0aW9uIGZhaWxlZCBmb3IgaG90bGlzdCBidWZmZXIiLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXN0X2FwID0gJmRlc3RfaG90bGlzdC0+YXBbMF07CisJZGVzdF9ob3RsaXN0LT5udW1PZkFwcyA9IGV2ZW50LT50b3RhbF9lbnRyaWVzOworCWRlc3RfaG90bGlzdC0+cmVxdWVzdElkID0gZXZlbnQtPmNvbmZpZ19yZXF1ZXN0X2lkOworCisJaWYgKGV2ZW50LT5maXJzdF9lbnRyeV9pbmRleCArCisJCWV2ZW50LT5udW1fZW50cmllc19pbl9wYWdlIDwgZXZlbnQtPnRvdGFsX2VudHJpZXMpCisJCWRlc3RfaG90bGlzdC0+bW9yZURhdGEgPSAxOworCWVsc2UKKwkJZGVzdF9ob3RsaXN0LT5tb3JlRGF0YSA9IDA7CisKKwlXTUFfTE9HRCgiJXM6IEhvdGxpc3QgbWF0Y2g6IHJlcXVlc3RJZDogJXUsbnVtT2ZBcHM6ICVkIiwgX19mdW5jX18sCisJCSBkZXN0X2hvdGxpc3QtPnJlcXVlc3RJZCwgZGVzdF9ob3RsaXN0LT5udW1PZkFwcyk7CisKKwlmb3IgKGogPSAwOyBqIDwgbnVtYXA7IGorKykgeworCQlkZXN0X2FwLT5jaGFubmVsID0gc3JjX2hvdGxpc3QtPmNoYW5uZWw7CisJCWRlc3RfYXAtPnRzID0gc3JjX2hvdGxpc3QtPnRzdGFtcDsKKwkJc3NpZF9mb3VuZCA9IHNyY19ob3RsaXN0LT5mbGFncyAmIFdNSV9IT1RMSVNUX0ZMQUdfUFJFU0VOQ0U7CisJCWRlc3RfYXAtPnJ0dCA9IHNyY19ob3RsaXN0LT5ydHQ7CisJCWRlc3RfYXAtPnJ0dF9zZCA9IHNyY19ob3RsaXN0LT5ydHRfc2Q7CisJCWRlc3RfYXAtPmJlYWNvblBlcmlvZCA9IHNyY19ob3RsaXN0LT5iZWFjb25faW50ZXJ2YWw7CisJCWRlc3RfYXAtPmNhcGFiaWxpdHkgPSBzcmNfaG90bGlzdC0+Y2FwYWJpbGl0aWVzOworCQlkZXN0X2FwLT5pZUxlbmd0aCA9IHNyY19ob3RsaXN0LT5pZV9sZW5ndGg7CisJCVdNSV9NQUNfQUREUl9UT19DSEFSX0FSUkFZKCZzcmNfaG90bGlzdC0+YnNzaWQsCisJCQkJCSAgIGRlc3RfYXAtPmJzc2lkLmJ5dGVzKTsKKwkJY2RmX21lbV9jb3B5KGRlc3RfYXAtPnNzaWQsIHNyY19ob3RsaXN0LT5zc2lkLnNzaWQsCisJCQkJCXNyY19ob3RsaXN0LT5zc2lkLnNzaWRfbGVuKTsKKwkJZGVzdF9hcC0+c3NpZFtzcmNfaG90bGlzdC0+c3NpZC5zc2lkX2xlbl0gPSAnXDAnOworCQlkZXN0X2FwKys7CisJCXNyY19ob3RsaXN0Kys7CisJfQorCisJZGVzdF9ob3RsaXN0LT5hcF9mb3VuZCA9IHNzaWRfZm91bmQ7CisJbWFjLT5zbWUucEV4dFNjYW5JbmRDYihtYWMtPmhIZGQsCisJCQkgICAgICAgZVNJUl9FWFRTQ0FOX0hPVExJU1RfU1NJRF9NQVRDSF9JTkQsCisJCQkgICAgICAgZGVzdF9ob3RsaXN0KTsKKwlXTUFfTE9HSSgiJXM6IHNlbmRpbmcgaG90bGlzdCBzc2lkIG1hdGNoIGV2ZW50IiwgX19mdW5jX18pOworCWNkZl9tZW1fZnJlZShkZXN0X2hvdGxpc3QpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV9nZXRfYnVmX2V4dHNjYW5fc3RhcnRfY21kKCkgLSBGaWxsIGV4dHNjYW4gc3RhcnQgcmVxdWVzdAorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQHBzdGFydDogc2NhbiBjb21tYW5kIHJlcXVlc3QgcGFyYW1zCisgKiBAYnVmOiBldmVudCBidWZmZXIKKyAqIEBidWZfbGVuOiBsZW5ndGggb2YgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBmaWxscyBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIGV4dHNjYW4gcmVxdWVzdCBhbmQKKyAqIFRMViBmb3IgYnVja2V0cywgY2hhbm5lbCBsaXN0LgorICoKKyAqIFJldHVybjogQ0RGIFN0YXR1cy4KKyAqLworQ0RGX1NUQVRVUyB3bWFfZ2V0X2J1Zl9leHRzY2FuX3N0YXJ0X2NtZCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJCSB0U2lyV2lmaVNjYW5DbWRSZXFQYXJhbXMgKnBzdGFydCwKKwkJCQkJIHdtaV9idWZfdCAqYnVmLCBpbnQgKmJ1Zl9sZW4pCit7CisJd21pX2V4dHNjYW5fc3RhcnRfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2V4dHNjYW5fYnVja2V0ICpkZXN0X2JsaXN0OworCXdtaV9leHRzY2FuX2J1Y2tldF9jaGFubmVsICpkZXN0X2NsaXN0OworCXRTaXJXaWZpU2NhbkJ1Y2tldFNwZWMgKnNyY19idWNrZXQgPSBwc3RhcnQtPmJ1Y2tldHM7CisJdFNpcldpZmlTY2FuQ2hhbm5lbFNwZWMgKnNyY19jaGFubmVsID0gc3JjX2J1Y2tldC0+Y2hhbm5lbHM7CisJdFNpcldpZmlTY2FuQ2hhbm5lbFNwZWMgc2F2ZV9jaGFubmVsW1dMQU5fRVhUU0NBTl9NQVhfQ0hBTk5FTFNdOworCisJdWludDhfdCAqYnVmX3B0cjsKKwlpbnQgaSwgaywgY291bnQgPSAwOworCWludCBsZW4gPSBzaXplb2YoKmNtZCk7CisJaW50IG5idWNrZXRzID0gcHN0YXJ0LT5udW1CdWNrZXRzOworCWludCBuY2hhbm5lbHMgPSAwOworCisJLyogVGhlc2UgVExWJ3MgYXJlIGFyZSBOVUxMIGJ5IGRlZmF1bHQgKi8KKwl1aW50MzJfdCBpZV9sZW5fd2l0aF9wYWQgPSAwOworCWludCBudW1fc3NpZCA9IDA7CisJaW50IG51bV9ic3NpZCA9IDA7CisJaW50IGllX2xlbiA9IDA7CisKKwl1aW50MzJfdCBiYXNlX3BlcmlvZCA9IHBzdGFydC0+YmFzZVBlcmlvZDsKKworCS8qIFRMViBwbGFjZWhvbGRlciBmb3Igc3NpZF9saXN0IChOVUxMKSAqLworCWxlbiArPSBXTUlfVExWX0hEUl9TSVpFOworCWxlbiArPSBudW1fc3NpZCAqIHNpemVvZih3bWlfc3NpZCk7CisKKwkvKiBUTFYgcGxhY2Vob2xkZXIgZm9yIGJzc2lkX2xpc3QgKE5VTEwpICovCisJbGVuICs9IFdNSV9UTFZfSERSX1NJWkU7CisJbGVuICs9IG51bV9ic3NpZCAqIHNpemVvZih3bWlfbWFjX2FkZHIpOworCisJLyogVExWIHBsYWNlaG9sZGVyIGZvciBpZV9kYXRhIChOVUxMKSAqLworCWxlbiArPSBXTUlfVExWX0hEUl9TSVpFOworCWxlbiArPSBpZV9sZW4gKiBzaXplb2YodWludDMyX3QpOworCisJLyogVExWIHBsYWNlaG9sZGVyIGZvciBidWNrZXQgKi8KKwlsZW4gKz0gV01JX1RMVl9IRFJfU0laRTsKKwlsZW4gKz0gbmJ1Y2tldHMgKiBzaXplb2Yod21pX2V4dHNjYW5fYnVja2V0KTsKKworCS8qIFRMViBjaGFubmVsIHBsYWNlaG9sZGVyICovCisJbGVuICs9IFdNSV9UTFZfSERSX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IG5idWNrZXRzOyBpKyspIHsKKwkJbmNoYW5uZWxzICs9IHNyY19idWNrZXQtPm51bUNoYW5uZWxzOworCQlzcmNfYnVja2V0Kys7CisJfQorCisJV01BX0xPR0QoIiVzOiBUb3RhbCBidWNrZXRzOiAlZCB0b3RhbCAjb2YgY2hhbm5lbHMgaXMgJWQiLAorCQlfX2Z1bmNfXywgbmJ1Y2tldHMsIG5jaGFubmVscyk7CisJbGVuICs9IG5jaGFubmVscyAqIHNpemVvZih3bWlfZXh0c2Nhbl9idWNrZXRfY2hhbm5lbCk7CisJLyogQWxsb2NhdGUgdGhlIG1lbW9yeSAqLworCSpidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCEqYnVmKSB7CisJCVdNQV9MT0dQKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIKKwkJCSAiIGZvciBzdGFydCBleHRzY2FuIGNtZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YSgqYnVmKTsKKwljbWQgPSAod21pX2V4dHNjYW5fc3RhcnRfY21kX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fc3RhcnRfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9leHRzY2FuX3N0YXJ0X2NtZF9maXhlZF9wYXJhbSkpOworCisJY21kLT5yZXF1ZXN0X2lkID0gcHN0YXJ0LT5yZXF1ZXN0SWQ7CisJY21kLT52ZGV2X2lkID0gcHN0YXJ0LT5zZXNzaW9uSWQ7CisJY21kLT5iYXNlX3BlcmlvZCA9IHBzdGFydC0+YmFzZVBlcmlvZDsKKwljbWQtPm51bV9idWNrZXRzID0gbmJ1Y2tldHM7CisJY21kLT5jb25maWd1cmF0aW9uX2ZsYWdzID0gMDsKKwlpZiAocHN0YXJ0LT5jb25maWd1cmF0aW9uX2ZsYWdzICYgRVhUU0NBTl9MUF9FWFRFTkRFRF9CQVRDSElORykKKwkJY21kLT5jb25maWd1cmF0aW9uX2ZsYWdzIHw9IFdNSV9FWFRTQ0FOX0VYVEVOREVEX0JBVENISU5HX0VOOworCVdNQV9MT0dJKCIlczogY29uZmlndXJhdGlvbl9mbGFnczogMHgleCIsIF9fZnVuY19fLAorCQkJY21kLT5jb25maWd1cmF0aW9uX2ZsYWdzKTsKKworCWNtZC0+bWluX3Jlc3RfdGltZSA9IFdNQV9FWFRTQ0FOX1JFU1RfVElNRTsKKwljbWQtPm1heF9yZXN0X3RpbWUgPSBXTUFfRVhUU0NBTl9SRVNUX1RJTUU7CisJY21kLT5tYXhfYnNzaWRzX3Blcl9zY2FuX2N5Y2xlID0gcHN0YXJ0LT5tYXhBUHBlclNjYW47CisKKwkvKiBUaGUgbWF4IGR3ZWxsIHRpbWUgaXMgcmV0cmlldmVkIGZyb20gdGhlIGZpcnN0IGNoYW5uZWwKKwkgKiBvZiB0aGUgZmlyc3QgYnVja2V0IGFuZCBrZXB0IGNvbW1vbiBmb3IgYWxsIGNoYW5uZWxzLgorCSAqLworCWNtZC0+bWluX2R3ZWxsX3RpbWVfYWN0aXZlID0gcHN0YXJ0LT5taW5fZHdlbGxfdGltZV9hY3RpdmU7CisJY21kLT5tYXhfZHdlbGxfdGltZV9hY3RpdmUgPSBwc3RhcnQtPm1heF9kd2VsbF90aW1lX2FjdGl2ZTsKKwljbWQtPm1pbl9kd2VsbF90aW1lX3Bhc3NpdmUgPSBwc3RhcnQtPm1pbl9kd2VsbF90aW1lX3Bhc3NpdmU7CisJY21kLT5tYXhfZHdlbGxfdGltZV9wYXNzaXZlID0gcHN0YXJ0LT5tYXhfZHdlbGxfdGltZV9wYXNzaXZlOworCWNtZC0+bWF4X2Jzc2lkc19wZXJfc2Nhbl9jeWNsZSA9IHBzdGFydC0+bWF4QVBwZXJTY2FuOworCWNtZC0+bWF4X3RhYmxlX3VzYWdlID0gcHN0YXJ0LT5yZXBvcnRfdGhyZXNob2xkX3BlcmNlbnQ7CisJY21kLT5yZXBvcnRfdGhyZXNob2xkX251bV9zY2FucyA9IHBzdGFydC0+cmVwb3J0X3RocmVzaG9sZF9udW1fc2NhbnM7CisKKwljbWQtPnJlcGVhdF9wcm9iZV90aW1lID0gY21kLT5tYXhfZHdlbGxfdGltZV9hY3RpdmUgLworCQkJCQlXTUFfU0NBTl9OUFJPQkVTX0RFRkFVTFQ7CisJY21kLT5tYXhfc2Nhbl90aW1lID0gV01BX0VYVFNDQU5fTUFYX1NDQU5fVElNRTsKKwljbWQtPnByb2JlX2RlbGF5ID0gMDsKKwljbWQtPnByb2JlX3NwYWNpbmdfdGltZSA9IDA7CisJY21kLT5pZGxlX3RpbWUgPSAwOworCWNtZC0+YnVyc3RfZHVyYXRpb24gPSBXTUFfRVhUU0NBTl9CVVJTVF9EVVJBVElPTjsKKwljbWQtPnNjYW5fY3RybF9mbGFncyA9IFdNSV9TQ0FOX0FERF9CQ0FTVF9QUk9CRV9SRVEgfAorCQkJICAgICAgIFdNSV9TQ0FOX0FERF9DQ0tfUkFURVMgfAorCQkJICAgICAgIFdNSV9TQ0FOX0FERF9PRkRNX1JBVEVTIHwgV01JX1NDQU5fQUREX1NQT09GRURfTUFDX0lOX1BST0JFX1JFUTsKKwljbWQtPnNjYW5fcHJpb3JpdHkgPSBXTUlfU0NBTl9QUklPUklUWV9ISUdIOworCWNtZC0+bnVtX3NzaWRzID0gMDsKKwljbWQtPm51bV9ic3NpZCA9IDA7CisJY21kLT5pZV9sZW4gPSAwOworCWNtZC0+bl9wcm9iZXMgPSAoY21kLT5yZXBlYXRfcHJvYmVfdGltZSA+IDApID8KKwkJCWNtZC0+bWF4X2R3ZWxsX3RpbWVfYWN0aXZlIC8gY21kLT5yZXBlYXRfcHJvYmVfdGltZSA6IDA7CisKKwlidWZfcHRyICs9IHNpemVvZigqY21kKTsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLAorCQkgICAgICAgV01JVExWX1RBR19BUlJBWV9GSVhFRF9TVFJVQywKKwkJICAgICAgIG51bV9zc2lkICogc2l6ZW9mKHdtaV9zc2lkKSk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFICsgKG51bV9zc2lkICogc2l6ZW9mKHdtaV9zc2lkKSk7CisKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLAorCQkgICAgICAgV01JVExWX1RBR19BUlJBWV9GSVhFRF9TVFJVQywKKwkJICAgICAgIG51bV9ic3NpZCAqIHNpemVvZih3bWlfbWFjX2FkZHIpKTsKKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkUgKyAobnVtX2Jzc2lkICogc2l6ZW9mKHdtaV9tYWNfYWRkcikpOworCisJaWVfbGVuX3dpdGhfcGFkID0gMDsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIGllX2xlbl93aXRoX3BhZCk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFICsgaWVfbGVuX3dpdGhfcGFkOworCisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwKKwkJICAgICAgIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCSAgICAgICBuYnVja2V0cyAqIHNpemVvZih3bWlfZXh0c2Nhbl9idWNrZXQpKTsKKwlkZXN0X2JsaXN0ID0gKHdtaV9leHRzY2FuX2J1Y2tldCAqKQorCQkgICAgIChidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRSk7CisJc3JjX2J1Y2tldCA9IHBzdGFydC0+YnVja2V0czsKKworCS8qIFJldHJpZXZlIHNjYW5uaW5nIGluZm9ybWF0aW9uIGZyb20gZWFjaCBidWNrZXQgYW5kCisJICogY2hhbm5lbHMgYW5kIHNlbmQgaXQgdG8gdGhlIHRhcmdldAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBuYnVja2V0czsgaSsrKSB7CisJCVdNSVRMVl9TRVRfSERSKGRlc3RfYmxpc3QsCisJCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9idWNrZXRfY21kX2ZpeGVkX3BhcmFtLAorCQkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih3bWlfZXh0c2Nhbl9idWNrZXQpKTsKKworCQlkZXN0X2JsaXN0LT5idWNrZXRfaWQgPSBzcmNfYnVja2V0LT5idWNrZXQ7CisJCWRlc3RfYmxpc3QtPmJhc2VfcGVyaW9kX211bHRpcGxpZXIgPQorCQkJc3JjX2J1Y2tldC0+cGVyaW9kIC8gYmFzZV9wZXJpb2Q7CisJCWRlc3RfYmxpc3QtPm1pbl9wZXJpb2QgPSBzcmNfYnVja2V0LT5wZXJpb2Q7CisJCWRlc3RfYmxpc3QtPm1heF9wZXJpb2QgPSBzcmNfYnVja2V0LT5tYXhfcGVyaW9kOworCQlkZXN0X2JsaXN0LT5leHBfYmFja29mZiA9IHNyY19idWNrZXQtPmV4cG9uZW50OworCQlkZXN0X2JsaXN0LT5leHBfbWF4X3N0ZXBfY291bnQgPSBzcmNfYnVja2V0LT5zdGVwX2NvdW50OworCQlkZXN0X2JsaXN0LT5jaGFubmVsX2JhbmQgPSBzcmNfYnVja2V0LT5iYW5kOworCQlkZXN0X2JsaXN0LT5udW1fY2hhbm5lbHMgPSBzcmNfYnVja2V0LT5udW1DaGFubmVsczsKKwkJZGVzdF9ibGlzdC0+bm90aWZ5X2V4dHNjYW5fZXZlbnRzID0gMDsKKworCQlpZiAoc3JjX2J1Y2tldC0+cmVwb3J0RXZlbnRzICYgRVhUU0NBTl9SRVBPUlRfRVZFTlRTX0VBQ0hfU0NBTikKKwkJCWRlc3RfYmxpc3QtPm5vdGlmeV9leHRzY2FuX2V2ZW50cyA9CisJCQkJCVdNSV9FWFRTQ0FOX0JVQ0tFVF9DT01QTEVURURfRVZFTlQ7CisKKwkJaWYgKHNyY19idWNrZXQtPnJlcG9ydEV2ZW50cyAmCisJCQkJRVhUU0NBTl9SRVBPUlRfRVZFTlRTX0ZVTExfUkVTVUxUUykgeworCQkJZGVzdF9ibGlzdC0+Zm9yd2FyZGluZ19mbGFncyA9CisJCQkJV01JX0VYVFNDQU5fRk9SV0FSRF9GUkFNRV9UT19IT1NUOworCQkJZGVzdF9ibGlzdC0+bm90aWZ5X2V4dHNjYW5fZXZlbnRzIHw9CisJCQkJV01JX0VYVFNDQU5fQlVDS0VUX0NPTVBMRVRFRF9FVkVOVCB8CisJCQkJV01JX0VYVFNDQU5fQ1lDTEVfU1RBUlRFRF9FVkVOVCB8CisJCQkJV01JX0VYVFNDQU5fQ1lDTEVfQ09NUExFVEVEX0VWRU5UOworCQl9IGVsc2UgeworCQkJZGVzdF9ibGlzdC0+Zm9yd2FyZGluZ19mbGFncyA9CisJCQkJV01JX0VYVFNDQU5fTk9fRk9SV0FSRElORzsKKwkJfQorCisJCWlmIChzcmNfYnVja2V0LT5yZXBvcnRFdmVudHMgJiBFWFRTQ0FOX1JFUE9SVF9FVkVOVFNfTk9fQkFUQ0gpCisJCQlkZXN0X2JsaXN0LT5jb25maWd1cmF0aW9uX2ZsYWdzID0gMDsKKwkJZWxzZQorCQkJZGVzdF9ibGlzdC0+Y29uZmlndXJhdGlvbl9mbGFncyA9CisJCQkJV01JX0VYVFNDQU5fQlVDS0VUX0NBQ0hFX1JFU1VMVFM7CisKKwkJV01BX0xPR0koIiVzOiBudGZ5X2V4dHNjYW5fZXZlbnRzOiV1IGNmZ19mbGFnczoldSBmd2RfZmxhZ3M6JXUiLAorCQkJX19mdW5jX18sIGRlc3RfYmxpc3QtPm5vdGlmeV9leHRzY2FuX2V2ZW50cywKKwkJCWRlc3RfYmxpc3QtPmNvbmZpZ3VyYXRpb25fZmxhZ3MsCisJCQlkZXN0X2JsaXN0LT5mb3J3YXJkaW5nX2ZsYWdzKTsKKworCQlkZXN0X2JsaXN0LT5taW5fZHdlbGxfdGltZV9hY3RpdmUgPSBzcmNfYnVja2V0LT5taW5fZHdlbGxfdGltZV9hY3RpdmU7CisJCWRlc3RfYmxpc3QtPm1heF9kd2VsbF90aW1lX2FjdGl2ZSA9IHNyY19idWNrZXQtPm1heF9kd2VsbF90aW1lX2FjdGl2ZTsKKwkJZGVzdF9ibGlzdC0+bWluX2R3ZWxsX3RpbWVfcGFzc2l2ZSA9IHNyY19idWNrZXQtPm1pbl9kd2VsbF90aW1lX3Bhc3NpdmU7CisJCWRlc3RfYmxpc3QtPm1heF9kd2VsbF90aW1lX3Bhc3NpdmUgPSBzcmNfYnVja2V0LT5tYXhfZHdlbGxfdGltZV9wYXNzaXZlOworCQlzcmNfY2hhbm5lbCA9IHNyY19idWNrZXQtPmNoYW5uZWxzOworCisJCS8qIHNhdmUgdGhlIGNoYW5uZWwgaW5mbyB0byBsYXRlciBwb3B1bGF0ZQorCQkgKiB0aGUgIGNoYW5uZWwgVExWCisJCSAqLworCQlmb3IgKGsgPSAwOyBrIDwgc3JjX2J1Y2tldC0+bnVtQ2hhbm5lbHM7IGsrKykgeworCQkJc2F2ZV9jaGFubmVsW2NvdW50KytdLmNoYW5uZWwgPSBzcmNfY2hhbm5lbC0+Y2hhbm5lbDsKKwkJCXNyY19jaGFubmVsKys7CisJCX0KKwkJZGVzdF9ibGlzdCsrOworCQlzcmNfYnVja2V0Kys7CisJfQorCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRSArIChuYnVja2V0cyAqIHNpemVvZih3bWlfZXh0c2Nhbl9idWNrZXQpKTsKKwlXTUlUTFZfU0VUX0hEUihidWZfcHRyLAorCQkgICAgICAgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJICAgICAgIG5jaGFubmVscyAqIHNpemVvZih3bWlfZXh0c2Nhbl9idWNrZXRfY2hhbm5lbCkpOworCWRlc3RfY2xpc3QgPSAod21pX2V4dHNjYW5fYnVja2V0X2NoYW5uZWwgKikKKwkJICAgICAoYnVmX3B0ciArIFdNSV9UTFZfSERSX1NJWkUpOworCisJLyogQWN0aXZlIG9yIHBhc3NpdmUgc2NhbiBpcyBiYXNlZCBvbiB0aGUgYnVja2V0IGR3ZWxsIHRpbWUKKwkgKiBhbmQgY2hhbm5lbCBzcGVjaWZpYyBhY3RpdmUscGFzc2l2ZSBzY2FucyBhcmUgbm90CisJICogc3VwcG9ydGVkIHlldAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBuY2hhbm5lbHM7IGkrKykgeworCQlXTUlUTFZfU0VUX0hEUihkZXN0X2NsaXN0LAorCQkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fYnVja2V0X2NoYW5uZWxfZXZlbnRfZml4ZWRfcGFyYW0sCisJCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkJICAgICAgICh3bWlfZXh0c2Nhbl9idWNrZXRfY2hhbm5lbCkpOworCQlkZXN0X2NsaXN0LT5jaGFubmVsID0gc2F2ZV9jaGFubmVsW2ldLmNoYW5uZWw7CisJCWRlc3RfY2xpc3QrKzsKKwl9CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFICsKKwkJICAgKG5jaGFubmVscyAqIHNpemVvZih3bWlfZXh0c2Nhbl9idWNrZXRfY2hhbm5lbCkpOworCSpidWZfbGVuID0gbGVuOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3N0YXJ0X2V4dHNjYW4oKSAtIHN0YXJ0IGV4dHNjYW4gY29tbWFuZCB0byBmdy4KKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBwc3RhcnQ6IHNjYW4gY29tbWFuZCByZXF1ZXN0IHBhcmFtcworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgc3RhcnQgZXh0c2NhbiByZXF1ZXN0IHRvIGZ3LgorICoKKyAqIFJldHVybjogQ0RGIFN0YXR1cy4KKyAqLworQ0RGX1NUQVRVUyB3bWFfc3RhcnRfZXh0c2Nhbih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCSAgICAgdFNpcldpZmlTY2FuQ21kUmVxUGFyYW1zICpwc3RhcnQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCXdtaV9idWZfdCBidWY7CisJaW50IGxlbjsKKwlpZiAoIXdtYSB8fCAhd21hLT53bWlfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogV01BIGlzIGNsb3NlZCxjYW4gbm90IGlzc3VlIGV4dHNjYW4gY21kIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCWlmICghV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWEtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkgICAgV01JX1NFUlZJQ0VfRVhUU0NBTikpIHsKKwkJV01BX0xPR0UoIiVzOiBleHRzY2FuIGZlYXR1cmUgYml0IG5vdCBlbmFibGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCS8qIEZpbGwgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiBleHRzY2FuIHJlcXVlc3QgYW5kCisJICogVExWIGZvciBidWNrZXRzLCBjaGFubmVsIGxpc3QuCisJICovCisJY2RmX3N0YXR1cyA9IHdtYV9nZXRfYnVmX2V4dHNjYW5fc3RhcnRfY21kKHdtYSwgcHN0YXJ0LCAmYnVmLCAmbGVuKTsKKwlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGJ1ZmZlciBmb3IgZXh0IHNjYW4gY21kIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczpGYWlsZWQgdG8gZ2V0IGJ1ZmZlciIKKwkJCSAiZm9yIGN1cnJlbnQgZXh0c2NhbiBpbmZvIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwKKwkJCQkgbGVuLCBXTUlfRVhUU0NBTl9TVEFSVF9DTURJRCkpIHsKKwkJV01BX0xPR0UoIiVzOiBmYWlsZWQgdG8gc2VuZCBjb21tYW5kIiwgX19mdW5jX18pOworCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJd21hLT5pbnRlcmZhY2VzW3BzdGFydC0+c2Vzc2lvbklkXS5leHRzY2FuX2luX3Byb2dyZXNzID0gdHJ1ZTsKKwlXTUFfTE9HRCgiRXh0c2NhbiBzdGFydCByZXF1ZXN0IHNlbnQgc3VjY2Vzc2Z1bGx5IGZvciB2ZGV2ICVkIiwKKwkJIHBzdGFydC0+c2Vzc2lvbklkKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3N0b3BfZXh0c2NhbigpIC0gc3RvcCBleHRzY2FuIGNvbW1hbmQgdG8gZncuCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcHN0b3BjbWQ6IHN0b3Agc2NhbiBjb21tYW5kIHJlcXVlc3QgcGFyYW1zCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBzdG9wIGV4dHNjYW4gcmVxdWVzdCB0byBmdy4KKyAqCisgKiBSZXR1cm46IENERiBTdGF0dXMuCisgKi8KK0NERl9TVEFUVVMgd21hX3N0b3BfZXh0c2Nhbih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCSAgICB0U2lyRXh0U2NhblN0b3BSZXFQYXJhbXMgKnBzdG9wY21kKQoreworCXdtaV9leHRzY2FuX3N0b3BfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IHdtaV9idWY7CisJdWludDMyX3QgbGVuOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisKKwlpZiAoIXdtYSB8fCAhd21hLT53bWlfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogV01BIGlzIGNsb3NlZCwgY2Fubm90IGlzc3VlIGNtZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJaWYgKCFXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCSAgICBXTUlfU0VSVklDRV9FWFRTQ0FOKSkgeworCQlXTUFfTE9HRSgiJXM6IGV4dHNjYW4gbm90IGVuYWJsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJbGVuID0gc2l6ZW9mKCpjbWQpOworCXdtaV9idWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIXdtaV9idWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKwljbWQgPSAod21pX2V4dHNjYW5fc3RvcF9jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9zdG9wX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfZXh0c2Nhbl9zdG9wX2NtZF9maXhlZF9wYXJhbSkpOworCisJY21kLT5yZXF1ZXN0X2lkID0gcHN0b3BjbWQtPnJlcXVlc3RJZDsKKwljbWQtPnZkZXZfaWQgPSBwc3RvcGNtZC0+c2Vzc2lvbklkOworCisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgd21pX2J1ZiwgbGVuLAorCQkJCSBXTUlfRVhUU0NBTl9TVE9QX0NNRElEKSkgeworCQlXTUFfTE9HRSgiJXM6IGZhaWxlZCB0byAgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZSh3bWlfYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwl3bWEtPmludGVyZmFjZXNbcHN0b3BjbWQtPnNlc3Npb25JZF0uZXh0c2Nhbl9pbl9wcm9ncmVzcyA9IGZhbHNlOworCVdNQV9MT0dEKCJFeHRzY2FuIHN0b3AgcmVxdWVzdCBzZW50IHN1Y2Nlc3NmdWxseSBmb3IgdmRldiAlZCIsCisJCSBwc3RvcGNtZC0+c2Vzc2lvbklkKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKiB3bWFfZ2V0X2hvdGxpc3RfZW50cmllc19wZXJfcGFnZSgpIC0gaG90bGlzdCBlbnRyaWVzIHBlciBwYWdlCisgKiBAd21pX2hhbmRsZTogd21pIGhhbmRsZS4KKyAqIEBjbWQ6IHNpemUgb2YgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKiBAcGVyX2VudHJ5X3NpemU6IHBlciBlbnRyeSBzaXplLgorICoKKyAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjYWxjdWxhdGVzIGhvdyBtYW55IGhvdGxpc3QgZW50cmllcyBjYW4KKyAqIGZpdCBpbiBvbmUgcGFnZS4KKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBlbnRyaWVzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHdtYV9nZXRfaG90bGlzdF9lbnRyaWVzX3Blcl9wYWdlKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCQkJCSAgIHNpemVfdCBjbWRfc2l6ZSwKKwkJCQkJCSAgIHNpemVfdCBwZXJfZW50cnlfc2l6ZSkKK3sKKwl1aW50MzJfdCBhdmFpbF9zcGFjZSA9IDA7CisJaW50IG51bV9lbnRyaWVzID0gMDsKKwl1aW50MTZfdCBtYXhfbXNnX2xlbiA9IHdtaV9nZXRfbWF4X21zZ19sZW4od21pX2hhbmRsZSk7CisKKwkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGhvdGxpc3QgZW50cmllcyB0aGF0IGNhbgorCSAqIGJlIHBhc3NlZCBpbiB3bWEgbWVzc2FnZSByZXF1ZXN0LgorCSAqLworCWF2YWlsX3NwYWNlID0gbWF4X21zZ19sZW4gLSBjbWRfc2l6ZTsKKwludW1fZW50cmllcyA9IGF2YWlsX3NwYWNlIC8gcGVyX2VudHJ5X3NpemU7CisJcmV0dXJuIG51bV9lbnRyaWVzOworfQorCisvKioKKyAqIHdtYV9nZXRfYnVmX2V4dHNjYW5faG90bGlzdF9jbWQoKSAtIHByZXBhcmUgaG90bGlzdCBjb21tYW5kCisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcGhvdGxpc3Q6IGhvdGxpc3QgY29tbWFuZCBwYXJhbXMKKyAqIEBidWZfbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiBmaWxscyBpbmRpdmlkdWFsIGVsZW1lbnRzIGZvciAgaG90bGlzdCByZXF1ZXN0IGFuZAorICogVExWIGZvciBic3NpZCBlbnRyaWVzCisgKgorICogUmV0dXJuOiBDREYgU3RhdHVzLgorICovCitDREZfU1RBVFVTIHdtYV9nZXRfYnVmX2V4dHNjYW5faG90bGlzdF9jbWQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCQkgICB0U2lyRXh0U2NhblNldEJzc2lkSG90TGlzdFJlcVBhcmFtcyAqCisJCQkJCSAgIHBob3RsaXN0LCBpbnQgKmJ1Zl9sZW4pCit7CisJd21pX2V4dHNjYW5fY29uZmlndXJlX2hvdGxpc3RfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0gKmNtZCA9IE5VTEw7CisJd21pX2V4dHNjYW5faG90bGlzdF9lbnRyeSAqZGVzdF9ob3RsaXN0OworCXRTaXJBUFRocmVzaG9sZFBhcmFtICpzcmNfYXAgPSBwaG90bGlzdC0+YXA7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50OF90ICpidWZfcHRyOworCisJaW50IGosIGluZGV4ID0gMDsKKwlpbnQgY21kX2xlbiA9IDA7CisJaW50IG51bV9lbnRyaWVzID0gMDsKKwlpbnQgbWluX2VudHJpZXMgPSAwOworCWludCBudW1hcCA9IHBob3RsaXN0LT5udW1BcDsKKwlpbnQgbGVuID0gc2l6ZW9mKCpjbWQpOworCisJbGVuICs9IFdNSV9UTFZfSERSX1NJWkU7CisJY21kX2xlbiA9IGxlbjsKKworCS8qIHNldGJzc2lkIGhvdGxpc3QgZXhwZWN0cyB0aGUgYnNzaWQgbGlzdAorCSAqIHRvIGJlIG5vbiB6ZXJvIHZhbHVlCisJICovCisJaWYgKCFudW1hcCkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgbnVtYmVyIG9mIGJzc2lkJ3MiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCW51bV9lbnRyaWVzID0gd21hX2dldF9ob3RsaXN0X2VudHJpZXNfcGVyX3BhZ2Uod21hX2hhbmRsZS0+d21pX2hhbmRsZSwKKwkJCQkJCQljbWRfbGVuLAorCQkJCQkJCXNpemVvZigqZGVzdF9ob3RsaXN0KSk7CisKKwkvKiBTcGxpdCB0aGUgaG90IGxpc3QgZW50cnkgcGFnZXMgYW5kIHNlbmQgbXVsdGlwbGUgY29tbWFuZAorCSAqIHJlcXVlc3RzIGlmIHRoZSBidWZmZXIgcmVhY2hlcyB0aGUgbWF4aW11bSByZXF1ZXN0IHNpemUKKwkgKi8KKwl3aGlsZSAoaW5kZXggPCBudW1hcCkgeworCQltaW5fZW50cmllcyA9IENERl9NSU4obnVtX2VudHJpZXMsIG51bWFwKTsKKwkJbGVuICs9IG1pbl9lbnRyaWVzICogc2l6ZW9mKHdtaV9leHRzY2FuX2hvdGxpc3RfZW50cnkpOworCQlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJCWlmICghYnVmKSB7CisJCQlXTUFfTE9HUCgiJXM6IHdtaV9idWZfYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwkJY21kID0gKHdtaV9leHRzY2FuX2NvbmZpZ3VyZV9ob3RsaXN0X21vbml0b3JfY21kX2ZpeGVkX3BhcmFtICopCisJCSAgICAgIGJ1Zl9wdHI7CisJCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9jb25maWd1cmVfaG90bGlzdF9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSwKKwkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCQkgICAgICAgKHdtaV9leHRzY2FuX2NvbmZpZ3VyZV9ob3RsaXN0X21vbml0b3JfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwkJLyogTXVsdGlwbGUgcmVxdWVzdHMgYXJlIHNlbnQgdW50aWwgdGhlIG51bV9lbnRyaWVzX2luX3BhZ2UKKwkJICogbWF0Y2hlcyB0aGUgdG90YWxfZW50cmllcworCQkgKi8KKwkJY21kLT5yZXF1ZXN0X2lkID0gcGhvdGxpc3QtPnJlcXVlc3RJZDsKKwkJY21kLT52ZGV2X2lkID0gcGhvdGxpc3QtPnNlc3Npb25JZDsKKwkJY21kLT50b3RhbF9lbnRyaWVzID0gbnVtYXA7CisJCWNtZC0+bW9kZSA9IDE7CisJCWNtZC0+bnVtX2VudHJpZXNfaW5fcGFnZSA9IG1pbl9lbnRyaWVzOworCQljbWQtPmxvc3RfYXBfc2Nhbl9jb3VudCA9IHBob3RsaXN0LT5sb3N0X2FwX3NhbXBsZV9zaXplOworCQljbWQtPmZpcnN0X2VudHJ5X2luZGV4ID0gaW5kZXg7CisKKwkJV01BX0xPR0QoIiVzOiB2ZGV2IGlkOiVkIHRvdGFsX2VudHJpZXM6ICVkIG51bV9lbnRyaWVzOiAlZCBsb3N0X2FwX3NhbXBsZV9zaXplOiAlZCIsCisJCQlfX2Z1bmNfXywgY21kLT52ZGV2X2lkLCBjbWQtPnRvdGFsX2VudHJpZXMsCisJCQljbWQtPm51bV9lbnRyaWVzX2luX3BhZ2UsCisJCQljbWQtPmxvc3RfYXBfc2Nhbl9jb3VudCk7CisKKwkJYnVmX3B0ciArPSBzaXplb2YoKmNtZCk7CisJCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsCisJCQkgICAgICAgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJCSAgICAgICBtaW5fZW50cmllcyAqIHNpemVvZih3bWlfZXh0c2Nhbl9ob3RsaXN0X2VudHJ5KSk7CisJCWRlc3RfaG90bGlzdCA9ICh3bWlfZXh0c2Nhbl9ob3RsaXN0X2VudHJ5ICopCisJCQkgICAgICAgKGJ1Zl9wdHIgKyBXTUlfVExWX0hEUl9TSVpFKTsKKworCQkvKiBQb3B1bGF0ZSBic3NpZCwgY2hhbm5lbCBpbmZvIGFuZCByc3NpCisJCSAqIGZvciB0aGUgYnNzaWQncyB0aGF0IGFyZSBzZW50IGFzIGhvdGxpc3RzLgorCQkgKi8KKwkJZm9yIChqID0gMDsgaiA8IG1pbl9lbnRyaWVzOyBqKyspIHsKKwkJCVdNSVRMVl9TRVRfSERSKGRlc3RfaG90bGlzdCwKKwkJCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9idWNrZXRfY21kX2ZpeGVkX3BhcmFtLAorCQkJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCQkJICAgICAgICh3bWlfZXh0c2Nhbl9ob3RsaXN0X2VudHJ5KSk7CisKKwkJCWRlc3RfaG90bGlzdC0+bWluX3Jzc2kgPSBzcmNfYXAtPmxvdzsKKwkJCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKHNyY19hcC0+YnNzaWQuYnl0ZXMsCisJCQkJCQkgICAmZGVzdF9ob3RsaXN0LT5ic3NpZCk7CisKKwkJCVdNQV9MT0dEKCIlczpjaGFubmVsOiVkIG1pbl9yc3NpICVkIiwKKwkJCQkgX19mdW5jX18sIGRlc3RfaG90bGlzdC0+Y2hhbm5lbCwKKwkJCQkgZGVzdF9ob3RsaXN0LT5taW5fcnNzaSk7CisJCQlXTUFfTE9HRAorCQkJCSgiJXM6IGJzc2lkIG1hY19hZGRyMzF0bzA6IDB4JXgsIG1hY19hZGRyNDd0bzMyOiAweCV4IiwKKwkJCQlfX2Z1bmNfXywgZGVzdF9ob3RsaXN0LT5ic3NpZC5tYWNfYWRkcjMxdG8wLAorCQkJCWRlc3RfaG90bGlzdC0+YnNzaWQubWFjX2FkZHI0N3RvMzIpOworCQkJZGVzdF9ob3RsaXN0Kys7CisJCQlzcmNfYXArKzsKKwkJfQorCQlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkUgKworCQkJICAgKG1pbl9lbnRyaWVzICogc2l6ZW9mKHdtaV9leHRzY2FuX2hvdGxpc3RfZW50cnkpKTsKKworCQlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hX2hhbmRsZS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJCSBXTUlfRVhUU0NBTl9DT05GSUdVUkVfSE9UTElTVF9NT05JVE9SX0NNRElEKSkgeworCQkJV01BX0xPR0UoIiVzOiBmYWlsZWQgdG8gc2VuZCBjb21tYW5kIiwgX19mdW5jX18pOworCQkJY2RmX25idWZfZnJlZShidWYpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJCWluZGV4ID0gaW5kZXggKyBtaW5fZW50cmllczsKKwkJbnVtX2VudHJpZXMgPSBudW1hcCAtIG1pbl9lbnRyaWVzOworCQlsZW4gPSBjbWRfbGVuOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9leHRzY2FuX3N0YXJ0X2hvdGxpc3RfbW9uaXRvcigpIC0gc3RhcnQgaG90bGlzdCBtb25pdG9yCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcGhvdGxpc3Q6IGhvdGxpc3QgcmVxdWVzdCBwYXJhbXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgaG90bGlzdCBtb25pdG9yIGluIGZ3LgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9leHRzY2FuX3N0YXJ0X2hvdGxpc3RfbW9uaXRvcih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJICAgICB0U2lyRXh0U2NhblNldEJzc2lkSG90TGlzdFJlcVBhcmFtcworCQkJCQkgICAgICpwaG90bGlzdCkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJaW50IGxlbjsKKworCWlmICghd21hIHx8ICF3bWEtPndtaV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBXTUEgaXMgY2xvc2VkLCBjYW4gbm90IGlzc3VlIGhvdGxpc3QgY21kIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCS8qIEZpbGwgaW5kaXZpZHVhbCBlbGVtZW50cyBmb3IgIGhvdGxpc3QgcmVxdWVzdCBhbmQKKwkgKiBUTFYgZm9yIGJzc2lkIGVudHJpZXMKKwkgKi8KKwljZGZfc3RhdHVzID0gd21hX2dldF9idWZfZXh0c2Nhbl9ob3RsaXN0X2NtZCh3bWEsIHBob3RsaXN0LCAmbGVuKTsKKwlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGJ1ZmZlciIKKwkJCSAiZm9yIGhvdGxpc3Qgc2NhbiBjbWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfZXh0c2Nhbl9zdG9wX2hvdGxpc3RfbW9uaXRvcigpIC0gc3RvcCBob3RsaXN0IG1vbml0b3IKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwaG90bGlzdF9yZXNldDogaG90bGlzdCByZXNldCBwYXJhbXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgaG90bGlzdCBtb25pdG9yIHRvIHN0b3AgaW4gZncuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX2V4dHNjYW5fc3RvcF9ob3RsaXN0X21vbml0b3IodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCSAgICB0U2lyRXh0U2NhblJlc2V0QnNzaWRIb3RsaXN0UmVxUGFyYW1zCisJCQkJCSAgICAqcGhvdGxpc3RfcmVzZXQpCit7CisJd21pX2V4dHNjYW5fY29uZmlndXJlX2hvdGxpc3RfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3Qgd21pX2J1ZjsKKwl1aW50MzJfdCBsZW47CisJdWludDhfdCAqYnVmX3B0cjsKKwlpbnQgaG90bGlzdF9lbnRyaWVzID0gMDsKKworCWlmICghd21hIHx8ICF3bWEtPndtaV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBXTUEgaXMgY2xvc2VkLCBjYW4gbm90IGlzc3VlICBjbWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCWlmICghcGhvdGxpc3RfcmVzZXQpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIHJlc2V0IGhvdGxpc3QgYnVmZmVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKwlpZiAoIVdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod21hLT53bWlfc2VydmljZV9iaXRtYXAsCisJCQkJICAgIFdNSV9TRVJWSUNFX0VYVFNDQU4pKSB7CisJCVdNQV9MT0dFKCIlczogZXh0c2NhbiBub3QgZW5hYmxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlsZW4gPSBzaXplb2YoKmNtZCk7CisKKwkvKiByZXNldCBic3NpZCBob3RsaXN0IHdpdGggdGx2IHNldCB0byAwICovCisJbGVuICs9IFdNSV9UTFZfSERSX1NJWkU7CisJbGVuICs9IGhvdGxpc3RfZW50cmllcyAqIHNpemVvZih3bWlfZXh0c2Nhbl9ob3RsaXN0X2VudHJ5KTsKKworCXdtaV9idWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIXdtaV9idWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKHdtaV9idWYpOworCWNtZCA9ICh3bWlfZXh0c2Nhbl9jb25maWd1cmVfaG90bGlzdF9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSAqKQorCSAgICAgIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY29uZmlndXJlX2hvdGxpc3RfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX2V4dHNjYW5fY29uZmlndXJlX2hvdGxpc3RfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+cmVxdWVzdF9pZCA9IHBob3RsaXN0X3Jlc2V0LT5yZXF1ZXN0SWQ7CisJY21kLT52ZGV2X2lkID0gcGhvdGxpc3RfcmVzZXQtPnNlc3Npb25JZDsKKwljbWQtPm1vZGUgPSAwOworCisJYnVmX3B0ciArPSBzaXplb2YoKmNtZCk7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwKKwkJICAgICAgIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCSAgICAgICBob3RsaXN0X2VudHJpZXMgKiBzaXplb2Yod21pX2V4dHNjYW5faG90bGlzdF9lbnRyeSkpOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRSArCisJCSAgIChob3RsaXN0X2VudHJpZXMgKiBzaXplb2Yod21pX2V4dHNjYW5faG90bGlzdF9lbnRyeSkpOworCisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgd21pX2J1ZiwgbGVuLAorCQkJCSBXTUlfRVhUU0NBTl9DT05GSUdVUkVfSE9UTElTVF9NT05JVE9SX0NNRElEKSkgeworCQlXTUFfTE9HRSgiJXM6IGZhaWxlZCB0byAgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZSh3bWlfYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9nZXRfYnVmX2V4dHNjYW5fY2hhbmdlX21vbml0b3JfY21kKCkgLSBmaWxsIGNoYW5nZSBtb25pdG9yIHJlcXVlc3QKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwc2lnY2hhbmdlOiBjaGFuZ2UgbW9uaXRvciByZXF1ZXN0IHBhcmFtcworICogQGJ1Zjogd21pIGJ1ZmZlcgorICogQGJ1Zl9sZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIGVsZW1lbnRzIG9mIGNoYW5nZSBtb25pdG9yIHJlcXVlc3QgYnVmZmVyLgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9nZXRfYnVmX2V4dHNjYW5fY2hhbmdlX21vbml0b3JfY21kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwKKwkJCQkJCSAgdFNpckV4dFNjYW5TZXRTaWdDaGFuZ2VSZXFQYXJhbXMKKwkJCQkJCSAgKnBzaWdjaGFuZ2UsIHdtaV9idWZfdCAqYnVmLAorCQkJCQkJICBpbnQgKmJ1Zl9sZW4pCit7CisJd21pX2V4dHNjYW5fY29uZmlndXJlX3dsYW5fY2hhbmdlX21vbml0b3JfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfYnNzaWRfcGFyYW0gKmRlc3RfY2hnbGlzdDsKKwl1aW50OF90ICpidWZfcHRyOworCWludCBqOworCWludCBsZW4gPSBzaXplb2YoKmNtZCk7CisJaW50IG51bWFwID0gcHNpZ2NoYW5nZS0+bnVtQXA7CisJdFNpckFQVGhyZXNob2xkUGFyYW0gKnNyY19hcCA9IHBzaWdjaGFuZ2UtPmFwOworCisJaWYgKCFudW1hcCkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgbnVtYmVyIG9mIGJzc2lkJ3MiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCWxlbiArPSBXTUlfVExWX0hEUl9TSVpFOworCWxlbiArPSBudW1hcCAqIHNpemVvZih3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9ic3NpZF9wYXJhbSk7CisKKwkqYnVmID0gd21pX2J1Zl9hbGxvYyh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghKmJ1ZikgeworCQlXTUFfTE9HUCgiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNoYW5nZSBtb25pdG9yIGNtZCIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEoKmJ1Zik7CisJY21kID0KKwkJKHdtaV9leHRzY2FuX2NvbmZpZ3VyZV93bGFuX2NoYW5nZV9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSAqKQorCQlidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2NvbmZpZ3VyZV93bGFuX2NoYW5nZV9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfZXh0c2Nhbl9jb25maWd1cmVfd2xhbl9jaGFuZ2VfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+cmVxdWVzdF9pZCA9IHBzaWdjaGFuZ2UtPnJlcXVlc3RJZDsKKwljbWQtPnZkZXZfaWQgPSBwc2lnY2hhbmdlLT5zZXNzaW9uSWQ7CisJY21kLT50b3RhbF9lbnRyaWVzID0gbnVtYXA7CisJY21kLT5tb2RlID0gMTsKKwljbWQtPm51bV9lbnRyaWVzX2luX3BhZ2UgPSBudW1hcDsKKwljbWQtPmxvc3RfYXBfc2Nhbl9jb3VudCA9IHBzaWdjaGFuZ2UtPmxvc3RBcFNhbXBsZVNpemU7CisJY21kLT5tYXhfcnNzaV9zYW1wbGVzID0gcHNpZ2NoYW5nZS0+cnNzaVNhbXBsZVNpemU7CisJY21kLT5yc3NpX2F2ZXJhZ2luZ19zYW1wbGVzID0gcHNpZ2NoYW5nZS0+cnNzaVNhbXBsZVNpemU7CisJY21kLT5tYXhfb3V0X29mX3JhbmdlX2NvdW50ID0gcHNpZ2NoYW5nZS0+bWluQnJlYWNoaW5nOworCisJYnVmX3B0ciArPSBzaXplb2YoKmNtZCk7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwKKwkJICAgICAgIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJCSAgICAgICBudW1hcCAqIHNpemVvZih3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9ic3NpZF9wYXJhbSkpOworCWRlc3RfY2hnbGlzdCA9ICh3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9ic3NpZF9wYXJhbSAqKQorCQkgICAgICAgKGJ1Zl9wdHIgKyBXTUlfVExWX0hEUl9TSVpFKTsKKworCWZvciAoaiA9IDA7IGogPCBudW1hcDsgaisrKSB7CisJCVdNSVRMVl9TRVRfSERSKGRlc3RfY2hnbGlzdCwKKwkJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2J1Y2tldF9jbWRfZml4ZWRfcGFyYW0sCisJCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkJICAgICAgICh3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9ic3NpZF9wYXJhbSkpOworCisJCWRlc3RfY2hnbGlzdC0+bG93ZXJfcnNzaV9saW1pdCA9IHNyY19hcC0+bG93OworCQlkZXN0X2NoZ2xpc3QtPnVwcGVyX3Jzc2lfbGltaXQgPSBzcmNfYXAtPmhpZ2g7CisJCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKHNyY19hcC0+YnNzaWQuYnl0ZXMsCisJCQkJCSAgICZkZXN0X2NoZ2xpc3QtPmJzc2lkKTsKKworCQlXTUFfTE9HRCgiJXM6IG1pbl9yc3NpICVkIiwgX19mdW5jX18sCisJCQkgZGVzdF9jaGdsaXN0LT5sb3dlcl9yc3NpX2xpbWl0KTsKKwkJZGVzdF9jaGdsaXN0Kys7CisJCXNyY19hcCsrOworCX0KKwlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkUgKworCQkgICAobnVtYXAgKiBzaXplb2Yod21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfYnNzaWRfcGFyYW0pKTsKKwkqYnVmX2xlbiA9IGxlbjsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9leHRzY2FuX3N0YXJ0X2NoYW5nZV9tb25pdG9yKCkgLSBzZW5kIHN0YXJ0IGNoYW5nZSBtb25pdG9yIGNtZAorICogQHdtYTogd21hIGhhbmRsZQorICogQHBzaWdjaGFuZ2U6IGNoYW5nZSBtb25pdG9yIHJlcXVlc3QgcGFyYW1zCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBzdGFydCBjaGFuZ2UgbW9uaXRvciByZXF1ZXN0IHRvIGZ3LgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9leHRzY2FuX3N0YXJ0X2NoYW5nZV9tb25pdG9yKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQkgICAgdFNpckV4dFNjYW5TZXRTaWdDaGFuZ2VSZXFQYXJhbXMgKgorCQkJCQkgICAgcHNpZ2NoYW5nZSkKK3sKKwlDREZfU1RBVFVTIGNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJd21pX2J1Zl90IGJ1ZjsKKwlpbnQgbGVuOworCisJaWYgKCF3bWEgfHwgIXdtYS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBpcyBjbG9zZWQsY2FuIG5vdCBpc3N1ZSBleHRzY2FuIGNtZCIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKwkvKiBGaWxsIGluZGl2aWR1YWwgZWxlbWVudHMgb2YgY2hhbmdlIG1vbml0b3IgYW5kCisJICogVExWIGluZm8gLi4uICovCisKKwljZGZfc3RhdHVzID0gd21hX2dldF9idWZfZXh0c2Nhbl9jaGFuZ2VfbW9uaXRvcl9jbWQod21hLAorCQkJCQkJCSAgICBwc2lnY2hhbmdlLCAmYnVmLAorCQkJCQkJCSAgICAmbGVuKTsKKwlpZiAoY2RmX3N0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGJ1ZmZlciBmb3IgY2hhbmdlIG1vbml0b3IgY21kIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkgV01JX0VYVFNDQU5fQ09ORklHVVJFX1dMQU5fQ0hBTkdFX01PTklUT1JfQ01ESUQpKSB7CisJCVdNQV9MT0dFKCIlczogZmFpbGVkIHRvIHNlbmQgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJY2RmX25idWZfZnJlZShidWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2V4dHNjYW5fc3RvcF9jaGFuZ2VfbW9uaXRvcigpIC0gc2VuZCBzdG9wIGNoYW5nZSBtb25pdG9yIGNtZAorICogQHdtYTogd21hIGhhbmRsZQorICogQHBSZXNldFJlcTogUmVzZXQgY2hhbmdlIHJlcXVlc3QgcGFyYW1zCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBzdG9wIGNoYW5nZSBtb25pdG9yIHJlcXVlc3QgdG8gZncuCisgKgorICogUmV0dXJuOiBDREYgc3RhdHVzCisgKi8KK0NERl9TVEFUVVMgd21hX2V4dHNjYW5fc3RvcF9jaGFuZ2VfbW9uaXRvcih0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJICAgdFNpckV4dFNjYW5SZXNldFNpZ25pZmljYW50Q2hhbmdlUmVxUGFyYW1zCisJCQkJCSAgICpwUmVzZXRSZXEpCit7CisJd21pX2V4dHNjYW5fY29uZmlndXJlX3dsYW5fY2hhbmdlX21vbml0b3JfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IHdtaV9idWY7CisJdWludDMyX3QgbGVuOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJaW50IGNoYW5nZV9saXN0ID0gMDsKKworCWlmICghd21hIHx8ICF3bWEtPndtaV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBXTUEgaXMgY2xvc2VkLCBjYW4gbm90IGlzc3VlICBjbWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCWlmICghV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWEtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCQkgICAgV01JX1NFUlZJQ0VfRVhUU0NBTikpIHsKKwkJV01BX0xPR0UoIiVzOiBleHQgc2NhbiBub3QgZW5hYmxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKwlsZW4gPSBzaXplb2YoKmNtZCk7CisKKwkvKiByZXNldCBzaWduaWZpY2FudCBjaGFuZ2UgdGx2IGlzIHNldCB0byAwICovCisJbGVuICs9IFdNSV9UTFZfSERSX1NJWkU7CisJbGVuICs9IGNoYW5nZV9saXN0ICogc2l6ZW9mKHdtaV9leHRzY2FuX3dsYW5fY2hhbmdlX2Jzc2lkX3BhcmFtKTsKKwl3bWlfYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCF3bWlfYnVmKSB7CisJCVdNQV9MT0dFKCIlczogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEod21pX2J1Zik7CisKKwljbWQgPSAod21pX2V4dHNjYW5fY29uZmlndXJlX3dsYW5fY2hhbmdlX21vbml0b3JfY21kX2ZpeGVkX3BhcmFtICopCisJCWJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY29uZmlndXJlX3dsYW5fY2hhbmdlX21vbml0b3JfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9leHRzY2FuX2NvbmZpZ3VyZV93bGFuX2NoYW5nZV9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSkpOworCisJY21kLT5yZXF1ZXN0X2lkID0gcFJlc2V0UmVxLT5yZXF1ZXN0SWQ7CisJY21kLT52ZGV2X2lkID0gcFJlc2V0UmVxLT5zZXNzaW9uSWQ7CisJY21kLT5tb2RlID0gMDsKKworCWJ1Zl9wdHIgKz0gc2l6ZW9mKCpjbWQpOworCVdNSVRMVl9TRVRfSERSKGJ1Zl9wdHIsCisJCSAgICAgICBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkgICAgICAgY2hhbmdlX2xpc3QgKgorCQkgICAgICAgc2l6ZW9mKHdtaV9leHRzY2FuX3dsYW5fY2hhbmdlX2Jzc2lkX3BhcmFtKSk7CisJYnVmX3B0ciArPSBXTUlfVExWX0hEUl9TSVpFICsgKGNoYW5nZV9saXN0ICoKKwkJCQkgICAgICAgc2l6ZW9mCisJCQkJICAgICAgICh3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9ic3NpZF9wYXJhbSkpOworCisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgd21pX2J1ZiwgbGVuLAorCQkJCSBXTUlfRVhUU0NBTl9DT05GSUdVUkVfV0xBTl9DSEFOR0VfTU9OSVRPUl9DTURJRCkpIHsKKwkJV01BX0xPR0UoIiVzOiBmYWlsZWQgdG8gIGNvbW1hbmQiLCBfX2Z1bmNfXyk7CisJCWNkZl9uYnVmX2ZyZWUod21pX2J1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHMoKSAtIGV4dHNjYW4gZ2V0IGNhY2hlZCByZXN1bHRzCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcGNhY2hlZF9yZXN1bHRzOiBjYWNoZWQgcmVzdWx0cyBwYXJhbWV0ZXJzCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kIHJlcXVlc3QgdG8gZncgdG8gZ2V0IGNhY2hlZCByZXN1bHRzLgorICoKKyAqIFJldHVybjogQ0RGIHN0YXR1cworICovCitDREZfU1RBVFVTIHdtYV9leHRzY2FuX2dldF9jYWNoZWRfcmVzdWx0cyh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJICB0U2lyRXh0U2NhbkdldENhY2hlZFJlc3VsdHNSZXFQYXJhbXMgKgorCQkJCQkgIHBjYWNoZWRfcmVzdWx0cykKK3sKKwl3bWlfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHNfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IHdtaV9idWY7CisJdWludDMyX3QgbGVuOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisKKwlpZiAoIXdtYSB8fCAhd21hLT53bWlfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogV01BIGlzIGNsb3NlZCwgY2Fubm90IGlzc3VlIGNtZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJaWYgKCFXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCSAgICBXTUlfU0VSVklDRV9FWFRTQ0FOKSkgeworCQlXTUFfTE9HRSgiJXM6IGV4dHNjYW4gbm90IGVuYWJsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJbGVuID0gc2l6ZW9mKCpjbWQpOworCXdtaV9idWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIXdtaV9idWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKworCWNtZCA9ICh3bWlfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHNfY21kX2ZpeGVkX3BhcmFtICopIGJ1Zl9wdHI7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fZ2V0X2NhY2hlZF9yZXN1bHRzX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHNfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwljbWQtPnJlcXVlc3RfaWQgPSBwY2FjaGVkX3Jlc3VsdHMtPnJlcXVlc3RJZDsKKwljbWQtPnZkZXZfaWQgPSBwY2FjaGVkX3Jlc3VsdHMtPnNlc3Npb25JZDsKKwljbWQtPmNvbnRyb2xfZmxhZ3MgPSBwY2FjaGVkX3Jlc3VsdHMtPmZsdXNoOworCisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgd21pX2J1ZiwgbGVuLAorCQkJCSBXTUlfRVhUU0NBTl9HRVRfQ0FDSEVEX1JFU1VMVFNfQ01ESUQpKSB7CisJCVdNQV9MT0dFKCIlczogZmFpbGVkIHRvICBjb21tYW5kIiwgX19mdW5jX18pOworCQljZGZfbmJ1Zl9mcmVlKHdtaV9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2V4dHNjYW5fZ2V0X2NhcGFiaWxpdGllcygpIC0gZXh0c2NhbiBnZXQgY2FwYWJpbGl0aWVzCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcGdldGNhcGFiOiBnZXQgY2FwYWJpbGl0aWVzIHBhcmFtcworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZCByZXF1ZXN0IHRvIGZ3IHRvIGdldCBleHRzY2FuIGNhcGFiaWxpdGllcy4KKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfZXh0c2Nhbl9nZXRfY2FwYWJpbGl0aWVzKHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCQl0U2lyR2V0RXh0U2NhbkNhcGFiaWxpdGllc1JlcVBhcmFtcyAqCisJCQkJCXBnZXRjYXBhYikKK3sKKwl3bWlfZXh0c2Nhbl9nZXRfY2FwYWJpbGl0aWVzX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCB3bWlfYnVmOworCXVpbnQzMl90IGxlbjsKKwl1aW50OF90ICpidWZfcHRyOworCisJaWYgKCF3bWEgfHwgIXdtYS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBpcyBjbG9zZWQsIGNhbiBub3QgaXNzdWUgIGNtZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9JTlZBTDsKKwl9CisJaWYgKCFXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCSAgICBXTUlfU0VSVklDRV9FWFRTQ0FOKSkgeworCQlXTUFfTE9HRSgiJXM6IGV4dHNjYW4gbm90IGVuYWJsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJbGVuID0gc2l6ZW9mKCpjbWQpOworCXdtaV9idWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIXdtaV9idWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKworCWNtZCA9ICh3bWlfZXh0c2Nhbl9nZXRfY2FwYWJpbGl0aWVzX2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2dldF9jYXBhYmlsaXRpZXNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9leHRzY2FuX2dldF9jYXBhYmlsaXRpZXNfY21kX2ZpeGVkX3BhcmFtKSk7CisKKwljbWQtPnJlcXVlc3RfaWQgPSBwZ2V0Y2FwYWItPnJlcXVlc3RJZDsKKworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIHdtaV9idWYsIGxlbiwKKwkJCQkgV01JX0VYVFNDQU5fR0VUX0NBUEFCSUxJVElFU19DTURJRCkpIHsKKwkJV01BX0xPR0UoIiVzOiBmYWlsZWQgdG8gIGNvbW1hbmQiLCBfX2Z1bmNfXyk7CisJCWNkZl9uYnVmX2ZyZWUod21pX2J1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworQ0RGX1NUQVRVUyAgd21hX2lwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlKHRwX3dtYV9oYW5kbGUgd21hLAorCQlzdHJ1Y3Qgc2lyX2lwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlICppcGFfb2ZmbG9hZCkKK3sKKwl3bWlfaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJd21pX2J1Zl90IHdtaV9idWY7CisJdWludDMyX3QgbGVuOworCXVfaW50OF90ICpidWZfcHRyOworCW9sX3R4cnhfdmRldl9oYW5kbGUgdmRldjsKKwlzdHJ1Y3QgdHhyeF9wZGV2X2NmZ190ICpjZmc7CisJaW50MzJfdCBpbnRyYV9ic3NfZndkID0gMDsKKworCWlmICghd21hIHx8ICF3bWEtPndtaV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBXTUEgaXMgY2xvc2VkLCBjYW4gbm90IGlzc3VlICBjbWQiLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0lOVkFMOworCX0KKworCWlmICghV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWEtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCSgoaXBhX29mZmxvYWQtPm9mZmxvYWRfdHlwZSA9PSBBUF9SWF9EQVRBX09GRkxPQUQpID8KKwkJCVdNSV9TRVJWSUNFX0hTT0ZGTE9BRCA6CisJCQlXTUlfU0VSVklDRV9TVEFfUlhfSVBBX09GRkxPQURfU1VQUE9SVCkpKSB7CisJCVdNQV9MT0dFKCIlczogJXMgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fLAorCQkJKChpcGFfb2ZmbG9hZC0+b2ZmbG9hZF90eXBlID09IEFQX1JYX0RBVEFfT0ZGTE9BRCkgPworCQkJIldNSV9TRVJWSUNFX0hTT0ZGTE9BRCIgOgorCQkJIldNSV9TRVJWSUNFX1NUQV9SWF9JUEFfT0ZGTE9BRF9TVVBQT1JUIikpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJaWYgKGlwYV9vZmZsb2FkLT5vZmZsb2FkX3R5cGUgPiBTVEFfUlhfREFUQV9PRkZMT0FEKSB7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJbGVuICA9IHNpemVvZigqY21kKTsKKwl3bWlfYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCF3bWlfYnVmKSB7CisJCVdNQV9MT0dFKCIlczogd21pX2J1Zl9hbGxvYyBmYWlsZWQgKGxlbj0lZCkiLCBfX2Z1bmNfXywgbGVuKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlXTUFfTE9HRSgiJXM6IG9mZmxvYWRfdHlwZT0lZCwgZW5hYmxlPSVkIiwgX19mdW5jX18sCisJCWlwYV9vZmZsb2FkLT5vZmZsb2FkX3R5cGUsIGlwYV9vZmZsb2FkLT5lbmFibGUpOworCisJYnVmX3B0ciA9ICh1X2ludDhfdCAqKXdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKworCWNtZCA9ICh3bWlfaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtICopYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQlXTUlUTFZfVEFHX1NUUlVDVF93bWlfaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtLAorCQlXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oCisJCXdtaV9pcGFfb2ZmbG9hZF9lbmFibGVfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+b2ZmbG9hZF90eXBlID0gaXBhX29mZmxvYWQtPm9mZmxvYWRfdHlwZTsKKwljbWQtPnZkZXZfaWQgPSBpcGFfb2ZmbG9hZC0+dmRldl9pZDsKKwljbWQtPmVuYWJsZSA9IGlwYV9vZmZsb2FkLT5lbmFibGU7CisKKwlpZiAod21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCB3bWlfYnVmLCBsZW4sCisJCVdNSV9JUEFfT0ZGTE9BRF9FTkFCTEVfRElTQUJMRV9DTURJRCkpIHsKKwkJV01BX0xPR0UoIiVzOiBmYWlsZWQgdG8gY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJd21pX2J1Zl9mcmVlKHdtaV9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiBWREVWIGlzIGFscmVhZHkgZGVsZXRlZC4gSWYgZGVsZXRlZCwgZG9uJ3QKKwkgKiBzZW5kIElOVFJBIEJTUyBGV0QgV01JIGNvbW1hbmQKKwkgKi8KKwl2ZGV2ID0gd21hX2ZpbmRfdmRldl9ieV9pZCh3bWEsIGlwYV9vZmZsb2FkLT52ZGV2X2lkKTsKKwlpZiAoIXZkZXYpCisJCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7CisKKwkvKiBEaXNhYmxlIEludHJhLUJTUyBGV0Qgb2ZmbG9hZCB3aGVuIGdEaXNhYmxlSW50cmFCc3NGd2Q9MSBpbiBJTkkgKi8KKwljZmcgPSAoc3RydWN0IHR4cnhfcGRldl9jZmdfdCAqKXZkZXYtPnBkZXYtPmN0cmxfcGRldjsKKwlpZiAoIWlwYV9vZmZsb2FkLT5lbmFibGUgfHwgY2ZnLT5yeF9md2RfZGlzYWJsZWQpIHsKKwkJV01BX0xPR0UoIiVzOiBpcGFfb2ZmbG9hZC0+ZW5hYmxlPSVkLCByeF9md2RfZGlzYWJsZWQ9JWQiLAorCQkJCV9fZnVuY19fLAorCQkJCWlwYV9vZmZsb2FkLT5lbmFibGUsIGNmZy0+cnhfZndkX2Rpc2FibGVkKTsKKwkJaW50cmFfYnNzX2Z3ZCA9IDE7CisJfQorCisJLyogRGlzYWJsZS9lbmFibGUgV01JX1ZERVZfUEFSQU1fSU5UUkFfQlNTX0ZXRCAqLworCWlmICh3bWlfdW5pZmllZF92ZGV2X3NldF9wYXJhbV9zZW5kKHdtYS0+d21pX2hhbmRsZSwKKwkJaXBhX29mZmxvYWQtPnZkZXZfaWQsIFdNSV9WREVWX1BBUkFNX0lOVFJBX0JTU19GV0QsCisJCWludHJhX2Jzc19md2QpKSB7CisJCVdNQV9MT0dFKCJGYWlsZWQgdG8gZGlzYWJsZSBXTUlfVkRFVl9QQVJBTV9JTlRSQV9CU1NfRldEIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKiogd21hX3NldF9lcG5vX25ldHdvcmtfbGlzdCgpIC0gc2V0IGVwbm8gbmV0d29yayBsaXN0CisgKiBAd21hOiBXTUEgaGFuZGxlCisgKiBAcmVxOiBlcG5vIGNvbmZpZyBwYXJhbXMgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBpbmNvbWluZyBlcG5vIGNvbmZpZyByZXF1ZXN0IHN0cnVjdHVyZQorICogYW5kIGNvbnN0cnVjdHMgdGhlIFdNSSBtZXNzYWdlIHRvIHRoZSBmaXJtd2FyZS4KKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworQ0RGX1NUQVRVUyB3bWFfc2V0X2Vwbm9fbmV0d29ya19saXN0KHRwX3dtYV9oYW5kbGUgd21hLAorCQlzdHJ1Y3Qgd2lmaV9lcG5vX3BhcmFtcyAqcmVxKQoreworCXdtaV9ubG9fY29uZmlnX2NtZF9maXhlZF9wYXJhbSAqY21kOworCW5sb19jb25maWd1cmVkX3BhcmFtZXRlcnMgKm5sb19saXN0OworCXVfaW50OF90IGksICpidWZfcHRyOworCXdtaV9idWZfdCBidWY7CisJdWludDMyX3QgbGVuOworCWludCByZXQ7CisKKwlXTUFfTE9HRCgid21hX3NldF9lcG5vX25ldHdvcmtfbGlzdCIpOworCisJaWYgKCF3bWEgfHwgIXdtYS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBpcyBjbG9zZWQsIGNhbiBub3QgaXNzdWUgY21kIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICghV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWEtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCVdNSV9TRVJWSUNFX0VYVFNDQU4pKSB7CisJCVdNQV9MT0dFKCIlczogZXh0c2NhbiBub3QgZW5hYmxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT1NVUFBPUlQ7CisJfQorCisJLyogVExWIHBsYWNlIGhvbGRlciBmb3IgYXJyYXkgb2Ygc3RydWN0dXJlcworCSAqIG5sb19jb25maWd1cmVkX3BhcmFtZXRlcnMobmxvX2xpc3QpICovCisJbGVuID0gc2l6ZW9mKCpjbWQpICsgV01JX1RMVl9IRFJfU0laRTsKKwlsZW4gKz0gc2l6ZW9mKG5sb19jb25maWd1cmVkX3BhcmFtZXRlcnMpICoKKwkJCQlDREZfTUlOKHJlcS0+bnVtX25ldHdvcmtzLCBXTUlfTkxPX01BWF9TU0lEUyk7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKwlpZiAoIWJ1ZikgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCBhbGxvY2F0ZSB3bWkgYnVmZmVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PTUVNOworCX0KKworCWNtZCA9ICh3bWlfbmxvX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisKKwlidWZfcHRyID0gKHVfaW50OF90ICopIGNtZDsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfbmxvX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4oCisJCQkgICAgICAgd21pX25sb19jb25maWdfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT52ZGV2X2lkID0gcmVxLT5zZXNzaW9uX2lkOworCWNtZC0+ZmxhZ3MgPSBXTUlfTkxPX0NPTkZJR19FTkxPOworCisJYnVmX3B0ciArPSBzaXplb2Yod21pX25sb19jb25maWdfY21kX2ZpeGVkX3BhcmFtKTsKKworCWNtZC0+bm9fb2Zfc3NpZHMgPSBDREZfTUlOKHJlcS0+bnVtX25ldHdvcmtzLCBXTUlfTkxPX01BWF9TU0lEUyk7CisJV01BX0xPR0QoIlNTSUQgY291bnQ6ICVkIiwgY21kLT5ub19vZl9zc2lkcyk7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywKKwkJICAgICAgIGNtZC0+bm9fb2Zfc3NpZHMgKiBzaXplb2YobmxvX2NvbmZpZ3VyZWRfcGFyYW1ldGVycykpOworCWJ1Zl9wdHIgKz0gV01JX1RMVl9IRFJfU0laRTsKKworCW5sb19saXN0ID0gKG5sb19jb25maWd1cmVkX3BhcmFtZXRlcnMgKikgYnVmX3B0cjsKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5ub19vZl9zc2lkczsgaSsrKSB7CisJCVdNSVRMVl9TRVRfSERSKCZubG9fbGlzdFtpXS50bHZfaGVhZGVyLAorCQkJV01JVExWX1RBR19BUlJBWV9CWVRFLAorCQkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKG5sb19jb25maWd1cmVkX3BhcmFtZXRlcnMpKTsKKwkJLyogQ29weSBzc2lkIGFuZCBpdCdzIGxlbmd0aCAqLworCQlubG9fbGlzdFtpXS5zc2lkLnZhbGlkID0gdHJ1ZTsKKwkJbmxvX2xpc3RbaV0uc3NpZC5zc2lkLnNzaWRfbGVuID0gcmVxLT5uZXR3b3Jrc1tpXS5zc2lkLmxlbmd0aDsKKwkJY2RmX21lbV9jb3B5KG5sb19saXN0W2ldLnNzaWQuc3NpZC5zc2lkLAorCQkJICAgICByZXEtPm5ldHdvcmtzW2ldLnNzaWQuc3NJZCwKKwkJCSAgICAgbmxvX2xpc3RbaV0uc3NpZC5zc2lkLnNzaWRfbGVuKTsKKwkJV01BX0xPR0QoImluZGV4OiAlZCBzc2lkOiAlLipzIGxlbjogJWQiLCBpLAorCQkJIG5sb19saXN0W2ldLnNzaWQuc3NpZC5zc2lkX2xlbiwKKwkJCSAoY2hhciAqKSBubG9fbGlzdFtpXS5zc2lkLnNzaWQuc3NpZCwKKwkJCSBubG9fbGlzdFtpXS5zc2lkLnNzaWQuc3NpZF9sZW4pOworCisJCS8qIENvcHkgcnNzaSB0aHJlc2hvbGQgKi8KKwkJbmxvX2xpc3RbaV0ucnNzaV9jb25kLnZhbGlkID0gdHJ1ZTsKKwkJbmxvX2xpc3RbaV0ucnNzaV9jb25kLnJzc2kgPQorCQkJcmVxLT5uZXR3b3Jrc1tpXS5yc3NpX3RocmVzaG9sZDsKKwkJV01BX0xPR0QoIlJTU0kgdGhyZXNob2xkIDogJWQgZEJtIiwKKwkJCW5sb19saXN0W2ldLnJzc2lfY29uZC5yc3NpKTsKKworCQkvKiBDb3B5IHBubyBmbGFncyAqLworCQlubG9fbGlzdFtpXS5iY2FzdF9ud190eXBlLnZhbGlkID0gdHJ1ZTsKKwkJbmxvX2xpc3RbaV0uYmNhc3RfbndfdHlwZS5iY2FzdF9ud190eXBlID0KKwkJCQlyZXEtPm5ldHdvcmtzW2ldLmZsYWdzOworCQlXTUFfTE9HRCgiUE5PIGZsYWdzICgldSkiLAorCQkJCW5sb19saXN0W2ldLmJjYXN0X253X3R5cGUuYmNhc3RfbndfdHlwZSk7CisKKwkJLyogQ29weSBhdXRoIGJpdCBmaWVsZCAqLworCQlubG9fbGlzdFtpXS5hdXRoX3R5cGUudmFsaWQgPSB0cnVlOworCQlubG9fbGlzdFtpXS5hdXRoX3R5cGUuYXV0aF90eXBlID0KKwkJCQlyZXEtPm5ldHdvcmtzW2ldLmF1dGhfYml0X2ZpZWxkOworCQlXTUFfTE9HRCgiQXV0aCBiaXQgZmllbGQgKCV1KSIsCisJCQkJbmxvX2xpc3RbaV0uYXV0aF90eXBlLmF1dGhfdHlwZSk7CisJfQorCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX05FVFdPUktfTElTVF9PRkZMT0FEX0NPTkZJR19DTURJRCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZW5kIG5sbyB3bWkgY21kIiwgX19mdW5jX18pOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCVdNQV9MT0dEKCJzZXQgZVBOTyBsaXN0IHJlcXVlc3Qgc2VudCBzdWNjZXNzZnVsbHkgZm9yIHZkZXYgJWQiLAorCQkgcmVxLT5zZXNzaW9uX2lkKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3NldF9wYXNzcG9pbnRfbmV0d29ya19saXN0KCkgLSBzZXQgcGFzc3BvaW50IG5ldHdvcmsgbGlzdAorICogQGhhbmRsZTogV01BIGhhbmRsZQorICogQHJlcTogcGFzc3BvaW50IG5ldHdvcmsgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBpbmNvbWluZyBAcmVxIGFuZCBmaWxsIGluIHRoZSBkZXN0aW5hdGlvbgorICogV01JIHN0cnVjdHVyZSBhbmQgc2VuZCBkb3duIHRoZSBwYXNzcG9pbnQgY29uZmlncyBkb3duIHRvIHRoZSBmaXJtd2FyZQorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUyBlbnVtZXJhdGlvbgorICovCitDREZfU1RBVFVTIHdtYV9zZXRfcGFzc3BvaW50X25ldHdvcmtfbGlzdCh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJc3RydWN0IHdpZmlfcGFzc3BvaW50X3JlcSAqcmVxKQoreworCXdtaV9wYXNzcG9pbnRfY29uZmlnX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXVfaW50OF90IGksIGosICpieXRlczsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQzMl90IGxlbjsKKwlpbnQgcmV0OworCisJV01BX0xPR0QoIndtYV9zZXRfcGFzc3BvaW50X25ldHdvcmtfbGlzdCIpOworCisJaWYgKCF3bWEgfHwgIXdtYS0+d21pX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IFdNQSBpcyBjbG9zZWQsIGNhbiBub3QgaXNzdWUgY21kIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICghV01JX1NFUlZJQ0VfSVNfRU5BQkxFRCh3bWEtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCVdNSV9TRVJWSUNFX0VYVFNDQU4pKSB7CisJCVdNQV9MT0dFKCIlczogZXh0c2NhbiBub3QgZW5hYmxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT1NVUFBPUlQ7CisJfQorCisJbGVuID0gc2l6ZW9mKCpjbWQpOworCWZvciAoaSA9IDA7IGkgPCByZXEtPm51bV9uZXR3b3JrczsgaSsrKSB7CisJCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCQlpZiAoIWJ1ZikgeworCQkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2NhdGUgd21pIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJCX0KKworCQljbWQgPSAod21pX3Bhc3Nwb2ludF9jb25maWdfY21kX2ZpeGVkX3BhcmFtICopCisJCQkJd21pX2J1Zl9kYXRhKGJ1Zik7CisKKwkJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJCVdNSVRMVl9UQUdfU1RSVUNfd21pX3Bhc3Nwb2ludF9jb25maWdfY21kX2ZpeGVkX3BhcmFtLAorCQkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKAorCQkJd21pX3Bhc3Nwb2ludF9jb25maWdfY21kX2ZpeGVkX3BhcmFtKSk7CisJCWNtZC0+aWQgPSByZXEtPm5ldHdvcmtzW2ldLmlkOworCQlXTUFfTE9HRCgiJXM6IG5ldHdvcmsgaWQ6ICV1IiwgX19mdW5jX18sIGNtZC0+aWQpOworCQljZGZfbWVtX2NvcHkoY21kLT5yZWFsbSwgcmVxLT5uZXR3b3Jrc1tpXS5yZWFsbSwKKwkJCXN0cmxlbihyZXEtPm5ldHdvcmtzW2ldLnJlYWxtKSArIDEpOworCQlXTUFfTE9HRCgiJXM6IHJlYWxtOiAlcyIsIF9fZnVuY19fLCBjbWQtPnJlYWxtKTsKKwkJZm9yIChqID0gMDsgaiA8IFBBU1NQT0lOVF9ST0FNSU5HX0NPTlNPUlRJVU1fSURfTlVNOyBqKyspIHsKKwkJCWJ5dGVzID0gKHVpbnQ4X3QgKikgJnJlcS0+bmV0d29ya3NbaV0ucm9hbWluZ19jb25zb3J0aXVtX2lkc1tqXTsKKwkJCVdNQV9MT0dEKCJpbmRleDogJWQgcmNpZHM6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCIsCisJCQkJaiwgYnl0ZXNbMF0sIGJ5dGVzWzFdLCBieXRlc1syXSwgYnl0ZXNbM10sCisJCQkJYnl0ZXNbNF0sIGJ5dGVzWzVdLCBieXRlc1s2XSwgYnl0ZXNbN10pOworCisJCQljZGZfbWVtX2NvcHkoJmNtZC0+cm9hbWluZ19jb25zb3J0aXVtX2lkc1tqXSwKKwkJCQkmcmVxLT5uZXR3b3Jrc1tpXS5yb2FtaW5nX2NvbnNvcnRpdW1faWRzW2pdLAorCQkJCVBBU1NQT0lOVF9ST0FNSU5HX0NPTlNPUlRJVU1fSURfTEVOKTsKKwkJfQorCQljZGZfbWVtX2NvcHkoY21kLT5wbG1uLCByZXEtPm5ldHdvcmtzW2ldLnBsbW4sCisJCQkJUEFTU1BPSU5UX1BMTU5fSURfTEVOKTsKKwkJV01BX0xPR0QoIiVzOiBwbG1uOiAlMDJ4OiUwMng6JTAyeCIsIF9fZnVuY19fLAorCQkJY21kLT5wbG1uWzBdLCBjbWQtPnBsbW5bMV0sIGNtZC0+cGxtblsyXSk7CisKKwkJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21hLT53bWlfaGFuZGxlLCBidWYsIGxlbiwKKwkJCQkJICAgV01JX1BBU1NQT0lOVF9MSVNUX0NPTkZJR19DTURJRCk7CisJCWlmIChyZXQpIHsKKwkJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNlbmQgc2V0IHBhc3Nwb2ludCBuZXR3b3JrIGxpc3Qgd21pIGNtZCIsCisJCQkJIF9fZnVuY19fKTsKKwkJCXdtaV9idWZfZnJlZShidWYpOworCQkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCQl9CisJfQorCisJV01BX0xPR0QoIlNldCBwYXNzcG9pbnQgbmV0d29yayBsaXN0IHJlcXVlc3QgaXMgc2VudCBzdWNjZXNzZnVsbHkgZm9yIHZkZXYgJWQiLAorCQkgcmVxLT5zZXNzaW9uX2lkKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3Jlc2V0X3Bhc3Nwb2ludF9uZXR3b3JrX2xpc3QoKSAtIHJlc2V0IHBhc3Nwb2ludCBuZXR3b3JrIGxpc3QKKyAqIEBoYW5kbGU6IFdNQSBoYW5kbGUKKyAqIEByZXE6IHBhc3Nwb2ludCBuZXR3b3JrIHJlcXVlc3Qgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBkb3duIFdNSSBjb21tYW5kIHdpdGggbmV0d29yayBpZCBzZXQgdG8gd2lsZGNhcmQgaWQuCisgKiBmaXJtd2FyZSBzaGFsbCBjbGVhciBhbGwgdGhlIGNvbmZpZyBlbnRyaWVzCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTIGVudW1lcmF0aW9uCisgKi8KK0NERl9TVEFUVVMgd21hX3Jlc2V0X3Bhc3Nwb2ludF9uZXR3b3JrX2xpc3QodHBfd21hX2hhbmRsZSB3bWEsCisJCQkJCXN0cnVjdCB3aWZpX3Bhc3Nwb2ludF9yZXEgKnJlcSkKK3sKKwl3bWlfcGFzc3BvaW50X2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCXVpbnQzMl90IGxlbjsKKwlpbnQgcmV0OworCisJV01BX0xPR0QoIndtYV9yZXNldF9wYXNzcG9pbnRfbmV0d29ya19saXN0Iik7CisKKwlpZiAoIXdtYSB8fCAhd21hLT53bWlfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogV01BIGlzIGNsb3NlZCwgY2FuIG5vdCBpc3N1ZSBjbWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJaWYgKCFXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJV01JX1NFUlZJQ0VfRVhUU0NBTikpIHsKKwkJV01BX0xPR0UoIiVzOiBleHRzY2FuIG5vdCBlbmFibGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PU1VQUE9SVDsKKwl9CisKKwlsZW4gPSBzaXplb2YoKmNtZCk7CisJYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2NhdGUgd21pIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwljbWQgPSAod21pX3Bhc3Nwb2ludF9jb25maWdfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJCVdNSVRMVl9UQUdfU1RSVUNfd21pX3Bhc3Nwb2ludF9jb25maWdfY21kX2ZpeGVkX3BhcmFtLAorCQkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKAorCQkJd21pX3Bhc3Nwb2ludF9jb25maWdfY21kX2ZpeGVkX3BhcmFtKSk7CisJY21kLT5pZCA9IFdNSV9QQVNTUE9JTlRfTkVUV09SS19JRF9XSUxEQ0FSRDsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX1BBU1NQT0lOVF9MSVNUX0NPTkZJR19DTURJRCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZW5kIHJlc2V0IHBhc3Nwb2ludCBuZXR3b3JrIGxpc3Qgd21pIGNtZCIsCisJCQkgX19mdW5jX18pOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCVdNQV9MT0dEKCJSZXNldCBwYXNzcG9pbnQgbmV0d29yayBsaXN0IHJlcXVlc3QgaXMgc2VudCBzdWNjZXNzZnVsbHkgZm9yIHZkZXYgJWQiLAorCQkgcmVxLT5zZXNzaW9uX2lkKTsKKworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3NldF9zc2lkX2hvdGxpc3QoKSAtIEhhbmRsZSBhbiBTU0lEIGhvdGxpc3Qgc2V0IHJlcXVlc3QKKyAqIEB3bWE6IFdNQSBoYW5kbGUKKyAqIEByZXF1ZXN0OiBTU0lEIGhvdGxpc3Qgc2V0IHJlcXVlc3QgZnJvbSBTTUUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVMgZW51bWVyYXRpb24KKyAqLworQ0RGX1NUQVRVUword21hX3NldF9zc2lkX2hvdGxpc3QodHBfd21hX2hhbmRsZSB3bWEsCisJCSAgICAgc3RydWN0IHNpcl9zZXRfc3NpZF9ob3RsaXN0X3JlcXVlc3QgKnJlcXVlc3QpCit7CisJd21pX2V4dHNjYW5fY29uZmlndXJlX2hvdGxpc3Rfc3NpZF9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXdtaV9idWZfdCB3bWlfYnVmOworCXVpbnQzMl90IGxlbjsKKwl1aW50MzJfdCBhcnJheV9zaXplOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisKKwlpZiAoIXdtYSB8fCAhd21hLT53bWlfaGFuZGxlKSB7CisJCVdNQV9MT0dFKCIlczogV01BIGlzIGNsb3NlZCwgY2FuIG5vdCBpc3N1ZSBob3RsaXN0IGNtZCIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCWlmICghcmVxdWVzdCkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgcmVxdWVzdCBidWZmZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJaWYgKCFXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJCSAgICBXTUlfU0VSVklDRV9FWFRTQ0FOKSkgeworCQlXTUFfTE9HRSgiJXM6IGV4dHNjYW4gbm90IGVuYWJsZWQiLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX05PU1VQUE9SVDsKKwl9CisKKwkvKiBsZW5ndGggb2YgZml4ZWQgcG9ydGlvbiAqLworCWxlbiA9IHNpemVvZigqY21kKTsKKworCS8qIGxlbmd0aCBvZiB2YXJpYWJsZSBwb3J0aW9uICovCisJYXJyYXlfc2l6ZSA9CisJCXJlcXVlc3QtPnNzaWRfY291bnQgKiBzaXplb2Yod21pX2V4dHNjYW5faG90bGlzdF9zc2lkX2VudHJ5KTsKKwlsZW4gKz0gV01JX1RMVl9IRFJfU0laRSArIGFycmF5X3NpemU7CisKKwl3bWlfYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCF3bWlfYnVmKSB7CisJCVdNQV9MT0dFKCIlczogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YSh3bWlfYnVmKTsKKwljbWQgPSAod21pX2V4dHNjYW5fY29uZmlndXJlX2hvdGxpc3Rfc3NpZF9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSAqKQorCQkJCQkJYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUgorCQkoJmNtZC0+dGx2X2hlYWRlciwKKwkJIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY29uZmlndXJlX2hvdGxpc3Rfc3NpZF9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSwKKwkJIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJKHdtaV9leHRzY2FuX2NvbmZpZ3VyZV9ob3RsaXN0X3NzaWRfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+cmVxdWVzdF9pZCA9IHJlcXVlc3QtPnJlcXVlc3RfaWQ7CisJY21kLT5yZXF1ZXN0b3JfaWQgPSAwOworCWNtZC0+dmRldl9pZCA9IHJlcXVlc3QtPnNlc3Npb25faWQ7CisJY21kLT50YWJsZV9pZCA9IDA7CisJY21kLT5sb3N0X2FwX3NjYW5fY291bnQgPSByZXF1ZXN0LT5sb3N0X3NzaWRfc2FtcGxlX3NpemU7CisJY21kLT50b3RhbF9lbnRyaWVzID0gcmVxdWVzdC0+c3NpZF9jb3VudDsKKwljbWQtPm51bV9lbnRyaWVzX2luX3BhZ2UgPSByZXF1ZXN0LT5zc2lkX2NvdW50OworCWNtZC0+Zmlyc3RfZW50cnlfaW5kZXggPSAwOworCisJYnVmX3B0ciArPSBzaXplb2YoKmNtZCk7CisJV01JVExWX1NFVF9IRFIoYnVmX3B0ciwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgYXJyYXlfc2l6ZSk7CisKKwlpZiAocmVxdWVzdC0+c3NpZF9jb3VudCkgeworCQl3bWlfZXh0c2Nhbl9ob3RsaXN0X3NzaWRfZW50cnkgKmVudHJ5OworCQlpbnQgaTsKKworCQlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCWVudHJ5ID0gKHdtaV9leHRzY2FuX2hvdGxpc3Rfc3NpZF9lbnRyeSAqKWJ1Zl9wdHI7CisJCWZvciAoaSA9IDA7IGkgPCByZXF1ZXN0LT5zc2lkX2NvdW50OyBpKyspIHsKKwkJCVdNSVRMVl9TRVRfSERSCisJCQkJKGVudHJ5LAorCQkJCSBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLAorCQkJCSBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCQkJKHdtaV9leHRzY2FuX2hvdGxpc3Rfc3NpZF9lbnRyeSkpOworCQkJZW50cnktPnNzaWQuc3NpZF9sZW4gPSByZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLmxlbmd0aDsKKwkJCWNkZl9tZW1fY29weShlbnRyeS0+c3NpZC5zc2lkLAorCQkJCSAgICAgcmVxdWVzdC0+c3NpZHNbaV0uc3NpZC5zc0lkLAorCQkJCSAgICAgcmVxdWVzdC0+c3NpZHNbaV0uc3NpZC5sZW5ndGgpOworCQkJZW50cnktPmJhbmQgPSByZXF1ZXN0LT5zc2lkc1tpXS5iYW5kOworCQkJZW50cnktPm1pbl9yc3NpID0gcmVxdWVzdC0+c3NpZHNbaV0ucnNzaV9sb3c7CisJCQllbnRyeS0+bWF4X3Jzc2kgPSByZXF1ZXN0LT5zc2lkc1tpXS5yc3NpX2hpZ2g7CisJCQllbnRyeSsrOworCQl9CisJCWNtZC0+bW9kZSA9IFdNSV9FWFRTQ0FOX01PREVfU1RBUlQ7CisJfSBlbHNlIHsKKwkJY21kLT5tb2RlID0gV01JX0VYVFNDQU5fTU9ERV9TVE9QOworCX0KKworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZAorCQkod21hLT53bWlfaGFuZGxlLCB3bWlfYnVmLCBsZW4sCisJCSBXTUlfRVhUU0NBTl9DT05GSUdVUkVfSE9UTElTVF9TU0lEX01PTklUT1JfQ01ESUQpKSB7CisJCVdNQV9MT0dFKCIlczogZmFpbGVkIHRvIHNlbmQgY29tbWFuZCIsIF9fZnVuY19fKTsKKwkJd21pX2J1Zl9mcmVlKHdtaV9idWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworLyoqCisgKiB3bWFfc2Nhbl9wcm9iZV9zZXRvdWkoKSAtIHNldCBzY2FuIHByb2JlIE9VSQorICogQHdtYTogd21hIGhhbmRsZQorICogQHBzZXRvdWk6IE9VSSBwYXJhbWV0ZXJzCisgKgorICogc2V0IHNjYW4gcHJvYmUgT1VJIHBhcmFtZXRlcnMgaW4gZmlybXdhcmUKKyAqCisgKiBSZXR1cm46IENERiBzdGF0dXMKKyAqLworQ0RGX1NUQVRVUyB3bWFfc2Nhbl9wcm9iZV9zZXRvdWkodHBfd21hX2hhbmRsZSB3bWEsIHRTaXJTY2FuTWFjT3VpICpwc2V0b3VpKQoreworCXdtaV9zY2FuX3Byb2JfcmVxX291aV9jbWRfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3Qgd21pX2J1ZjsKKwl1aW50MzJfdCBsZW47CisJdWludDhfdCAqYnVmX3B0cjsKKwl1aW50MzJfdCAqb3VpX2J1ZjsKKworCWlmICghd21hIHx8ICF3bWEtPndtaV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiBXTUEgaXMgY2xvc2VkLCBjYW4gbm90IGlzc3VlICBjbWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCWxlbiA9IHNpemVvZigqY21kKTsKKwl3bWlfYnVmID0gd21pX2J1Zl9hbGxvYyh3bWEtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCF3bWlfYnVmKSB7CisJCVdNQV9MT0dFKCIlczogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCWJ1Zl9wdHIgPSAodWludDhfdCAqKSB3bWlfYnVmX2RhdGEod21pX2J1Zik7CisJY21kID0gKHdtaV9zY2FuX3Byb2JfcmVxX291aV9jbWRfZml4ZWRfcGFyYW0gKikgYnVmX3B0cjsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQkgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfc2Nhbl9wcm9iX3JlcV9vdWlfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9zY2FuX3Byb2JfcmVxX291aV9jbWRfZml4ZWRfcGFyYW0pKTsKKworCW91aV9idWYgPSAmY21kLT5wcm9iX3JlcV9vdWk7CisJY2RmX21lbV96ZXJvKG91aV9idWYsIHNpemVvZihjbWQtPnByb2JfcmVxX291aSkpOworCSpvdWlfYnVmID0gcHNldG91aS0+b3VpWzBdIDw8IDE2IHwgcHNldG91aS0+b3VpWzFdIDw8IDgKKwkJICAgfCBwc2V0b3VpLT5vdWlbMl07CisJV01BX0xPR0QoIiVzOiB3bWE6b3VpIHJlY2VpdmVkIGZyb20gaGRkICUwOHgiLCBfX2Z1bmNfXywKKwkJIGNtZC0+cHJvYl9yZXFfb3VpKTsKKworCWlmICh3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIHdtaV9idWYsIGxlbiwKKwkJCQkgV01JX1NDQU5fUFJPQl9SRVFfT1VJX0NNRElEKSkgeworCQlXTUFfTE9HRSgiJXM6IGZhaWxlZCB0byBzZW5kIGNvbW1hbmQiLCBfX2Z1bmNfXyk7CisJCWNkZl9uYnVmX2ZyZWUod21pX2J1Zik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfc2Nhbl9ldmVudF9jYWxsYmFjaygpIC0gc2NhbiBldmVudCBjYWxsYmFjaworICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGRhdGE6IGV2ZW50IGRhdGEKKyAqIEBsZW46IGRhdGEgbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzIHNjYW4gZXZlbnQgYW5kIHByb3ZpZGUgaW5kaWNhdGlvbgorICogdG8gdXBwZXIgbGF5ZXJzLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlLgorICovCitpbnQgd21hX3NjYW5fZXZlbnRfY2FsbGJhY2soV01BX0hBTkRMRSBoYW5kbGUsIHVpbnQ4X3QgKmRhdGEsCisJCQkgICAgdWludDMyX3QgbGVuKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX1NDQU5fRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWYgPSBOVUxMOworCXdtaV9zY2FuX2V2ZW50X2ZpeGVkX3BhcmFtICp3bWlfZXZlbnQgPSBOVUxMOworCXRTaXJTY2FuT2ZmbG9hZEV2ZW50ICpzY2FuX2V2ZW50OworCXVpbnQ4X3QgdmRldl9pZDsKKwl1aW50MzJfdCBzY2FuX2lkOworCisJcGFyYW1fYnVmID0gKFdNSV9TQ0FOX0VWRU5USURfcGFyYW1fdGx2cyAqKSBkYXRhOworCXdtaV9ldmVudCA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJdmRldl9pZCA9IHdtaV9ldmVudC0+dmRldl9pZDsKKwlzY2FuX2lkID0gd21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5zY2FuX2luZm8uc2Nhbl9pZDsKKworCWlmICh3bWFfaGFuZGxlLT5yb2FtX3ByZWF1dGhfc2Nhbl9pZCA9PSB3bWlfZXZlbnQtPnNjYW5faWQpIHsKKwkJLyogVGhpcyBpcyB0aGUgc2NhbiByZXF1ZXN0ZWQgYnkgcm9hbSBwcmVhdXRoIHNldF9jaGFubmVsIG9wZXJhdGlvbiAqLworCisJCWlmICh3bWlfZXZlbnQtPmV2ZW50ICYgV01JX1NDQU5fRklOSVNIX0VWRU5UUykgeworCQkJV01BX0xPR0UoInJvYW0gc2NhbiBjb21wbGV0ZTogc2Nhbl9pZCAweCV4LCB2ZGV2X2lkICVkIiwKKwkJCQkgd21pX2V2ZW50LT5zY2FuX2lkLCB2ZGV2X2lkKTsKKwkJCS8qd21hX3Jlc2V0X3NjYW5faW5mbyh3bWFfaGFuZGxlLCB2ZGV2X2lkKTsqLworCQl9CisKKwkJdmRldl9pZCA9IHdtaV9ldmVudC0+dmRldl9pZDsKKwkJaWYgKHZkZXZfaWQgPj0gd21hX2hhbmRsZS0+bWF4X2Jzc2lkKSB7CisJCQlXTUFfTE9HRSgiJXM6SW52YWxpZCB2ZGV2X2lkICVkIHdtaV9ldmVudCAlcCIsIF9fZnVuY19fLAorCQkJCQkgdmRldl9pZCwgd21pX2V2ZW50KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJd21hX3JvYW1fcHJlYXV0aF9zY2FuX2V2ZW50X2hhbmRsZXIod21hX2hhbmRsZSwKKwkJCQkJCSB2ZGV2X2lkLCB3bWlfZXZlbnQpOworCQlyZXR1cm4gMDsKKworCX0KKworCXNjYW5fZXZlbnQgPSAodFNpclNjYW5PZmZsb2FkRXZlbnQgKikgY2RmX21lbV9tYWxsb2MKKwkJCSAgICAgKHNpemVvZih0U2lyU2Nhbk9mZmxvYWRFdmVudCkpOworCWlmICghc2Nhbl9ldmVudCkgeworCQlXTUFfTE9HRSgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciB0U2lyU2Nhbk9mZmxvYWRFdmVudCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzY2FuX2V2ZW50LT5ldmVudCA9IHdtaV9ldmVudC0+ZXZlbnQ7CisKKwlXTUFfTE9HSSgiV01BIDwtLSB3bWlfc2Nhbl9ldmVudCA6IGV2ZW50ICV1LCBzY2FuX2lkICV1LCAiCisJCSAiZnJlcSAldSwgcmVhc29uICV1IiwKKwkJIHdtaV9ldmVudC0+ZXZlbnQsIHdtaV9ldmVudC0+c2Nhbl9pZCwKKwkJIHdtaV9ldmVudC0+Y2hhbm5lbF9mcmVxLCB3bWlfZXZlbnQtPnJlYXNvbik7CisKKwlzY2FuX2V2ZW50LT5zY2FuSWQgPSB3bWlfZXZlbnQtPnNjYW5faWQ7CisJc2Nhbl9ldmVudC0+Y2hhbkZyZXEgPSB3bWlfZXZlbnQtPmNoYW5uZWxfZnJlcTsKKworCWlmIChzY2FuX2V2ZW50LT5zY2FuSWQgPT0KKwkJd21hX2hhbmRsZS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5wMnBfc2Nhbl9pbmZvLnNjYW5faWQpIHsKKwkJc2Nhbl9ldmVudC0+cDJwU2NhblR5cGUgPSBQMlBfU0NBTl9UWVBFX0xJU1RFTjsKKwkJaWYgIChzY2FuX2V2ZW50LT5ldmVudCA9PSBTQ0FOX0VWRU5UX0NPTVBMRVRFRCkKKwkJCXdtYV9yZXNldF9wMnBfc2Nhbl9pbmZvKHdtYV9oYW5kbGUsIHZkZXZfaWQpOworCX0KKwlzY2FuX2V2ZW50LT5zZXNzaW9uSWQgPSB2ZGV2X2lkOworCisJaWYgKHdtaV9ldmVudC0+cmVhc29uID09IFdNSV9TQ0FOX1JFQVNPTl9DT01QTEVURUQgfHwKKwkgICAgd21pX2V2ZW50LT5yZWFzb24gPT0gV01JX1NDQU5fUkVBU09OX1RJTUVET1VUKQorCQlzY2FuX2V2ZW50LT5yZWFzb25Db2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKwllbHNlCisJCXNjYW5fZXZlbnQtPnJlYXNvbkNvZGUgPSBlU0lSX1NNRV9TQ0FOX0ZBSUxFRDsKKworCXN3aXRjaCAod21pX2V2ZW50LT5ldmVudCkgeworCWNhc2UgV01JX1NDQU5fRVZFTlRfQ09NUExFVEVEOgorCWNhc2UgV01JX1NDQU5fRVZFTlRfREVRVUVVRUQ6CisJCS8qCisJCSAqIHJldHVybiBzdWNjZXNzIGFsd2F5cyBzbyB0aGF0IFNNRSBjYW4gcGljayB3aGF0ZXZlciBzY2FuCisJCSAqIHJlc3VsdHMgaXMgYXZhaWxhYmxlIGluIHNjYW4gY2FjaGUoZHVlIHRvIHBhcnRpYWwgb3IKKwkJICogYWJvcnRlZCBzY2FuKQorCQkgKi8KKwkJc2Nhbl9ldmVudC0+ZXZlbnQgPSBXTUlfU0NBTl9FVkVOVF9DT01QTEVURUQ7CisJCXNjYW5fZXZlbnQtPnJlYXNvbkNvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCQlicmVhazsKKwljYXNlIFdNSV9TQ0FOX0VWRU5UX1NUQVJUX0ZBSUxFRDoKKwkJc2Nhbl9ldmVudC0+ZXZlbnQgPSBXTUlfU0NBTl9FVkVOVF9DT01QTEVURUQ7CisJCXNjYW5fZXZlbnQtPnJlYXNvbkNvZGUgPSBlU0lSX1NNRV9TQ0FOX0ZBSUxFRDsKKwkJYnJlYWs7CisJY2FzZSBXTUlfU0NBTl9FVkVOVF9QUkVFTVBURUQ6CisJCVdNQV9MT0dXKCIlczogVW5oYW5kbGVkIFNjYW4gRXZlbnQgV01JX1NDQU5fRVZFTlRfUFJFRU1QVEVEIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWJyZWFrOworCWNhc2UgV01JX1NDQU5fRVZFTlRfUkVTVEFSVEVEOgorCQlXTUFfTE9HVygiJXM6IFVuaGFuZGxlZCBTY2FuIEV2ZW50IFdNSV9TQ0FOX0VWRU5UX1JFU1RBUlRFRCIsCisJCQkgX19mdW5jX18pOworCQlicmVhazsKKwl9CisKKwkvKiBTdG9wIHRoZSBzY2FuIGNvbXBsZXRpb24gdGltZW91dCBpZiB0aGUgZXZlbnQgaXMgV01JX1NDQU5fRVZFTlRfQ09NUExFVEVEICovCisJaWYgKHNjYW5fZXZlbnQtPmV2ZW50ID09ICh0U2lyU2NhbkV2ZW50VHlwZSkgV01JX1NDQU5fRVZFTlRfQ09NUExFVEVEKSB7CisJCVdNQV9MT0dFKCIgc2NhbiBjb21wbGV0ZSAtIHNjYW5faWQgMHgleCwgdmRldl9pZCAlZCIsCisJCQkgd21pX2V2ZW50LT5zY2FuX2lkLCB2ZGV2X2lkKTsKKwl9CisKKwl3bWFfc2VuZF9tc2cod21hX2hhbmRsZSwgV01BX1JYX1NDQU5fRVZFTlQsICh2b2lkICopc2Nhbl9ldmVudCwgMCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiB3bWFfcm9hbV9iZXR0ZXJfYXBfaGFuZGxlcigpIC0gYmV0dGVyIGFwIGV2ZW50IGhhbmRsZXIKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogSGFuZGxlciBmb3IgV01JX1JPQU1fUkVBU09OX0JFVFRFUl9BUCBldmVudCBmcm9tIHJvYW0gZmlybXdhcmUgaW4gUm9tZS4KKyAqIFRoaXMgZXZlbnQgbWVhbnMgcm9hbSBhbGdvcml0aG0gaW4gUm9tZSBoYXMgZm91bmQgYSBiZXR0ZXIgbWF0Y2hpbmcKKyAqIGNhbmRpZGF0ZSBBUC4gVGhlIGluZGljYXRpb24gaXMgc2VudCB0byBTTUUuCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3JvYW1fYmV0dGVyX2FwX2hhbmRsZXIodHBfd21hX2hhbmRsZSB3bWEsIHVpbnQzMl90IHZkZXZfaWQpCit7CisJY2RzX21zZ190IGNkc19tc2c7CisJdFNpclNtZUNhbmRpZGF0ZUZvdW5kSW5kICpjYW5kaWRhdGVfaW5kOworCisJLyogYWJvcnQgZXhpc3Rpbmcgc2NhbnMgZnJvbSBHVUksIGJ1dCBub3Qgcm9hbWluZyBwcmVhdXRoIHNjYW4gKi8KKwlpZiAod21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLnNjYW5faW5mby5zY2FuX2lkICE9IDAgJiYKKwkgICAgKHdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5zY2FuX2luZm8uc2Nhbl9pZCAmCisJICAgICBXTUFfSE9TVF9ST0FNX1NDQU5fUkVRSURfUFJFRklYKSAhPQorCQlXTUFfSE9TVF9ST0FNX1NDQU5fUkVRSURfUFJFRklYKSB7CisJCXRBYm9ydFNjYW5QYXJhbXMgYWJvcnRTY2FuOworCQlhYm9ydFNjYW4uU2Vzc2lvbklkID0gdmRldl9pZDsKKwkJd21hX3N0b3Bfc2Nhbih3bWEsICZhYm9ydFNjYW4pOworCX0KKworCWNhbmRpZGF0ZV9pbmQgPSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpclNtZUNhbmRpZGF0ZUZvdW5kSW5kKSk7CisJaWYgKCFjYW5kaWRhdGVfaW5kKSB7CisJCVdNQV9MT0dFKCIlczogQWxsb2MgZmFpbGVkIGZvciB0U2lyU21lQ2FuZGlkYXRlRm91bmRJbmQiLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJY2FuZGlkYXRlX2luZC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9DQU5ESURBVEVfRk9VTkRfSU5EOworCWNhbmRpZGF0ZV9pbmQtPnNlc3Npb25JZCA9IHZkZXZfaWQ7CisJY2FuZGlkYXRlX2luZC0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJTbWVDYW5kaWRhdGVGb3VuZEluZCk7CisKKwljZHNfbXNnLnR5cGUgPSBlV05JX1NNRV9DQU5ESURBVEVfRk9VTkRfSU5EOworCWNkc19tc2cuYm9keXB0ciA9IGNhbmRpZGF0ZV9pbmQ7CisJQ0RGX1RSQUNFKENERl9NT0RVTEVfSURfV01BLCBDREZfVFJBQ0VfTEVWRUxfSU5GTywKKwkJICBGTCgicG9zdGluZyBjYW5kaWRhdGUgaW5kIHRvIFNNRSIpKTsKKworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gY2RzX21xX3Bvc3RfbWVzc2FnZShDRFNfTVFfSURfU01FLAorCQkJCQkJKGNkc19tc2dfdCAqKSAmY2RzX21zZykpIHsKKwkJY2RmX21lbV9mcmVlKGNhbmRpZGF0ZV9pbmQpOworCQlDREZfVFJBQ0UoQ0RGX01PRFVMRV9JRF9XTUEsIENERl9UUkFDRV9MRVZFTF9FUlJPUiwKKwkJCSAgRkwoIkZhaWxlZCB0byBwb3N0IGNhbmRpZGF0ZSBpbmQgdG8gU01FIikpOworCX0KK30KKworLyoqCisgKiB3bWFfcm9hbV9ldmVudF9jYWxsYmFjaygpIC0gcm9hbSBldmVudCBjYWxsYmFjaworICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGV2ZW50X2J1ZjogZXZlbnQgYnVmZmVyCisgKiBAbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogSGFuZGxlciBmb3IgYWxsIGV2ZW50cyBmcm9tIHJvYW0gZW5naW5lIGluIGZpcm13YXJlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV9yb2FtX2V2ZW50X2NhbGxiYWNrKFdNQV9IQU5ETEUgaGFuZGxlLCB1aW50OF90ICpldmVudF9idWYsCisJCQkJICAgdWludDMyX3QgbGVuKQoreworCXRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX1JPQU1fRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX3JvYW1fZXZlbnRfZml4ZWRfcGFyYW0gKndtaV9ldmVudDsKKworCXBhcmFtX2J1ZiA9IChXTUlfUk9BTV9FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnRfYnVmOworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCJJbnZhbGlkIHJvYW0gZXZlbnQgYnVmZmVyIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdtaV9ldmVudCA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJV01BX0xPR0QoIiVzOiBSZWFzb24gJXggZm9yIHZkZXZpZCAleCwgcnNzaSAlZCIsCisJCSBfX2Z1bmNfXywgd21pX2V2ZW50LT5yZWFzb24sIHdtaV9ldmVudC0+dmRldl9pZCwKKwkJIHdtaV9ldmVudC0+cnNzaSk7CisKKwlzd2l0Y2ggKHdtaV9ldmVudC0+cmVhc29uKSB7CisJY2FzZSBXTUlfUk9BTV9SRUFTT05fQk1JU1M6CisJCVdNQV9MT0dEKCJCZWFjb24gTWlzcyBmb3IgdmRldmlkICV4Iiwgd21pX2V2ZW50LT52ZGV2X2lkKTsKKwkJd21hX2JlYWNvbl9taXNzX2hhbmRsZXIod21hX2hhbmRsZSwgd21pX2V2ZW50LT52ZGV2X2lkKTsKKwkJYnJlYWs7CisJY2FzZSBXTUlfUk9BTV9SRUFTT05fQkVUVEVSX0FQOgorCQlXTUFfTE9HRCgiJXM6QmV0dGVyIEFQIGZvdW5kIGZvciB2ZGV2aWQgJXgsIHJzc2kgJWQiLCBfX2Z1bmNfXywKKwkJCSB3bWlfZXZlbnQtPnZkZXZfaWQsIHdtaV9ldmVudC0+cnNzaSk7CisJCXdtYV9oYW5kbGUtPnN1aXRhYmxlX2FwX2hiX2ZhaWx1cmUgPSBmYWxzZTsKKwkJd21hX3JvYW1fYmV0dGVyX2FwX2hhbmRsZXIod21hX2hhbmRsZSwgd21pX2V2ZW50LT52ZGV2X2lkKTsKKwkJYnJlYWs7CisJY2FzZSBXTUlfUk9BTV9SRUFTT05fU1VJVEFCTEVfQVA6CisJCXdtYV9oYW5kbGUtPnN1aXRhYmxlX2FwX2hiX2ZhaWx1cmUgPSB0cnVlOworCQlXTUFfTE9HRCgiJXM6Qm1pc3Mgc2NhbiBBUCBmb3VuZCBmb3IgdmRldmlkICV4LCByc3NpICVkIiwKKwkJCSBfX2Z1bmNfXywgd21pX2V2ZW50LT52ZGV2X2lkLCB3bWlfZXZlbnQtPnJzc2kpOworCQl3bWFfcm9hbV9iZXR0ZXJfYXBfaGFuZGxlcih3bWFfaGFuZGxlLCB3bWlfZXZlbnQtPnZkZXZfaWQpOworCQlicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9PRkZMT0FECisJY2FzZSBXTUlfUk9BTV9SRUFTT05fSE9fRkFJTEVEOgorCQlXTUFfTE9HRSgiTEZSMzpIYW5kLU9mZiBGYWlsZWQgZm9yIHZkZXZpZCAleCIsCisJCQkgd21pX2V2ZW50LT52ZGV2X2lkKTsKKwkJd21hX3JvYW1faG9fZmFpbF9oYW5kbGVyKHdtYV9oYW5kbGUsIHdtaV9ldmVudC0+dmRldl9pZCk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJV01BX0xPR0QoIiVzOlVuaGFuZGxlZCBSb2FtIEV2ZW50ICV4IGZvciB2ZGV2aWQgJXgiLCBfX2Z1bmNfXywKKwkJCSB3bWlfZXZlbnQtPnJlYXNvbiwgd21pX2V2ZW50LT52ZGV2X2lkKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisKKy8qKgorICogd21hX3NldF9yc3NpX21vbml0b3JpbmcoKSAtIHNldCByc3NpIG1vbml0b3JpbmcKKyAqIEBoYW5kbGU6IFdNQSBoYW5kbGUKKyAqIEByZXE6IHJzc2kgbW9uaXRvcmluZyByZXF1ZXN0IHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGluY29taW5nIEByZXEgYW5kIGZpbGwgaW4gdGhlIGRlc3RpbmF0aW9uCisgKiBXTUkgc3RydWN0dXJlIGFuZCBzZW5kIGRvd24gdGhlIHJzc2kgbW9uaXRvcmluZyBjb25maWdzIGRvd24gdG8gdGhlIGZpcm13YXJlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3M7IGVycm9yIG51bWJlciBvdGhlcndpc2UKKyAqLworQ0RGX1NUQVRVUyB3bWFfc2V0X3Jzc2lfbW9uaXRvcmluZyh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkJc3RydWN0IHJzc2lfbW9uaXRvcl9yZXEgKnJlcSkKK3sKKwl3bWlfcnNzaV9icmVhY2hfbW9uaXRvcl9jb25maWdfZml4ZWRfcGFyYW0gKmNtZDsKKwl3bWlfYnVmX3QgYnVmOworCWludCByZXQsIGxlbiA9IHNpemVvZigqY21kKTsKKworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCWlmICghYnVmKSB7CisJCVdNQV9MT0dQKCIlczogd21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJY21kID0gKHdtaV9yc3NpX2JyZWFjaF9tb25pdG9yX2NvbmZpZ19maXhlZF9wYXJhbSAqKSB3bWlfYnVmX2RhdGEoYnVmKTsKKwlXTUlUTFZfU0VUX0hEUigmY21kLT50bHZfaGVhZGVyLAorCQlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yc3NpX2JyZWFjaF9tb25pdG9yX2NvbmZpZ19maXhlZF9wYXJhbSwKKwkJV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOKAorCQkJd21pX3Jzc2lfYnJlYWNoX21vbml0b3JfY29uZmlnX2ZpeGVkX3BhcmFtKSk7CisKKwljbWQtPnZkZXZfaWQgPSByZXEtPnNlc3Npb25faWQ7CisJY21kLT5yZXF1ZXN0X2lkID0gcmVxLT5yZXF1ZXN0X2lkOworCWNtZC0+bG9fcnNzaV9yZWVuYWJsZV9oeXN0ZXJlc2lzID0gMDsKKwljbWQtPmhpX3Jzc2lfcmVlbmFibGVfaGlzdGVyZXNpcyA9IDA7CisJY21kLT5taW5fcmVwb3J0X2ludGVydmFsID0gMDsKKwljbWQtPm1heF9udW1fcmVwb3J0ID0gMTsKKwlpZiAocmVxLT5jb250cm9sKSB7CisJCS8qIGVuYWJsZSBvbmUgdGhyZXNob2xkIGZvciBlYWNoIG1pbi9tYXggKi8KKwkJY21kLT5lbmFibGVkX2JpdG1hcCA9IDB4MDk7CisJCWNtZC0+bG93X3Jzc2lfYnJlYWNoX3RocmVzaG9sZFswXSA9IHJlcS0+bWluX3Jzc2k7CisJCWNtZC0+aGlfcnNzaV9icmVhY2hfdGhyZXNob2xkWzBdID0gcmVxLT5tYXhfcnNzaTsKKwl9IGVsc2UgeworCQljbWQtPmVuYWJsZWRfYml0bWFwID0gMDsKKwkJY21kLT5sb3dfcnNzaV9icmVhY2hfdGhyZXNob2xkWzBdID0gMDsKKwkJY21kLT5oaV9yc3NpX2JyZWFjaF90aHJlc2hvbGRbMF0gPSAwOworCX0KKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX1JTU0lfQlJFQUNIX01PTklUT1JfQ09ORklHX0NNRElEKTsKKwlpZiAocmV0ICE9IEVPSykgeworCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgV01JX1JTU0lfQlJFQUNIX01PTklUT1JfQ09ORklHX0NNRElEIik7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJV01BX0xPR0koIlNlbnQgV01JX1JTU0lfQlJFQUNIX01PTklUT1JfQ09ORklHX0NNRElEIHRvIEZXIik7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfZ2V0X3NjYW5faWQoKSAtIEdlbmVyYXRlcyBzY2FuIGlkCisgKiBAc2Nhbl9pZDogU2NhbiBpZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHRoZSBzY2FuIGlkLgorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVUworICovCisKK0NERl9TVEFUVVMgd21hX2dldF9zY2FuX2lkKHVpbnQzMl90ICpzY2FuX2lkKQoreworCXRwX3dtYV9oYW5kbGUgd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKworCWlmICghc2Nhbl9pZCkgeworCQlXTUFfTE9HRSgiU2Nhbl9pZCBpcyBOVUxMIik7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFVTFQ7CisJfQorCisJLyogaG9zdCBuZWVkIHRvIGN5Y2xlIHRocm91Z2ggdGhlIGxvd2VyIDEyIGJpdHMgdG8gZ2VuZXJhdGUgaWRzICovCisJKnNjYW5faWQgPSBjZGZfYXRvbWljX2luY19yZXR1cm4oJndtYS0+c2Nhbl9pZF9jb3VudGVyKSAmCisJCQlXTUFfU0NBTl9JRF9NQVNLOworCS8qCisJICogRmlybXdhcmUgZXhwZWN0cyB0aGUgaG9zdCBzY2FuIHJlcXVlc3QgaWQgYXBwZW5kZWQKKwkgKiBieSBQUkVGSVggMHhBMDAwCisJICovCisJKnNjYW5faWQgPSAqc2Nhbl9pZCB8IFdNSV9IT1NUX1NDQU5fUkVRX0lEX1BSRUZJWDsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCmRpZmYgLS1naXQgYS9jb3JlL3dtYS9zcmMvd21hX3V0aWxzLmMgYi9jb3JlL3dtYS9zcmMvd21hX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxMWEzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvd21hL3NyYy93bWFfdXRpbHMuYwpAQCAtMCwwICsxLDM1MjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogIERPQzogICAgd21hX3V0aXMuYworICogIFRoaXMgZmlsZSBjb250YWlucyB1dGlsaXRpZXMgYW5kIHN0YXRzIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKKy8qIEhlYWRlciBmaWxlcyAqLworCisjaW5jbHVkZSAid21hLmgiCisjaW5jbHVkZSAid21hX2FwaS5oIgorI2luY2x1ZGUgImNkc19hcGkuaCIKKyNpbmNsdWRlICJ3bWlfdW5pZmllZF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9zeXMuaCIKKyNpbmNsdWRlICJ3bmlfYXBpLmgiCisjaW5jbHVkZSAiYW5pX2dsb2JhbC5oIgorI2luY2x1ZGUgIndtaV91bmlmaWVkLmgiCisjaW5jbHVkZSAid25pX2NmZy5oIgorI2luY2x1ZGUgImNmZ19hcGkuaCIKKyNpbmNsdWRlICJvbF90eHJ4X2N0cmxfYXBpLmgiCisjaW5jbHVkZSAid2xhbl90Z3RfZGVmX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiY2RmX25idWYuaCIKKyNpbmNsdWRlICJjZGZfdHlwZXMuaCIKKyNpbmNsdWRlICJvbF90eHJ4X2FwaS5oIgorI2luY2x1ZGUgImNkZl9tZW1vcnkuaCIKKyNpbmNsdWRlICJvbF90eHJ4X3R5cGVzLmgiCisjaW5jbHVkZSAib2xfdHhyeF9wZWVyX2ZpbmQuaCIKKworI2luY2x1ZGUgIndtYV90eXBlcy5oIgorI2luY2x1ZGUgImxpbV9hcGkuaCIKKyNpbmNsdWRlICJsaW1fc2Vzc2lvbl91dGlscy5oIgorCisjaW5jbHVkZSAiY2RzX3V0aWxzLmgiCisKKyNpZiAhZGVmaW5lZChSRU1PVkVfUEtUX0xPRykKKyNpbmNsdWRlICJwa3Rsb2dfYWMuaCIKKyNlbmRpZiAvKiBSRU1PVkVfUEtUX0xPRyAqLworCisjaW5jbHVkZSAiZGJnbG9nX2hvc3QuaCIKKyNpbmNsdWRlICJjc3JfYXBpLmgiCisjaW5jbHVkZSAib2xfZncuaCIKKworI2luY2x1ZGUgImRmcy5oIgorI2luY2x1ZGUgIndtYV9pbnRlcm5hbC5oIgorCisvKiBNQ1MgQmFzZWQgcmF0ZSB0YWJsZSAqLworLyogSFQgTUNTIHBhcmFtZXRlcnMgd2l0aCBOc3MgPSAxICovCitzdGF0aWMgc3RydWN0IGluZGV4X2RhdGFfcmF0ZV90eXBlIHN1cHBvcnRlZF9tY3NfcmF0ZV9uc3MxW10gPSB7CisJLyogTUNTICBMMjAgICBMNDAgICBTMjAgIFM0MCAqLworCXswLCB7NjUsIDEzNSwgNzIsIDE1MH0gfSwKKwl7MSwgezEzMCwgMjcwLCAxNDQsIDMwMH0gfSwKKwl7MiwgezE5NSwgNDA1LCAyMTcsIDQ1MH0gfSwKKwl7MywgezI2MCwgNTQwLCAyODksIDYwMH0gfSwKKwl7NCwgezM5MCwgODEwLCA0MzMsIDkwMH0gfSwKKwl7NSwgezUyMCwgMTA4MCwgNTc4LCAxMjAwfSB9LAorCXs2LCB7NTg1LCAxMjE1LCA2NTAsIDEzNTB9IH0sCisJezcsIHs2NTAsIDEzNTAsIDcyMiwgMTUwMH0gfQorfTsKKworLyogSFQgTUNTIHBhcmFtZXRlcnMgd2l0aCBOc3MgPSAyICovCitzdGF0aWMgc3RydWN0IGluZGV4X2RhdGFfcmF0ZV90eXBlIHN1cHBvcnRlZF9tY3NfcmF0ZV9uc3MyW10gPSB7CisJLyogTUNTICBMMjAgICAgTDQwICAgUzIwICAgUzQwICovCisJezAsIHsxMzAsIDI3MCwgMTQ0LCAzMDB9IH0sCisJezEsIHsyNjAsIDU0MCwgMjg5LCA2MDB9IH0sCisJezIsIHszOTAsIDgxMCwgNDMzLCA5MDB9IH0sCisJezMsIHs1MjAsIDEwODAsIDU3OCwgMTIwMH0gfSwKKwl7NCwgezc4MCwgMTYyMCwgODY3LCAxODAwfSB9LAorCXs1LCB7MTA0MCwgMjE2MCwgMTE1NiwgMjQwMH0gfSwKKwl7NiwgezExNzAsIDI0MzAsIDEzMDAsIDI3MDB9IH0sCisJezcsIHsxMzAwLCAyNzAwLCAxNDQ0LCAzMDAwfSB9Cit9OworCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKy8qIE1DUyBCYXNlZCBWSFQgcmF0ZSB0YWJsZSAqLworLyogTUNTIHBhcmFtZXRlcnMgd2l0aCBOc3MgPSAxKi8KK3N0YXRpYyBzdHJ1Y3QgaW5kZXhfdmh0X2RhdGFfcmF0ZV90eXBlIHN1cHBvcnRlZF92aHRfbWNzX3JhdGVfbnNzMVtdID0geworCS8qIE1DUyAgTDgwICAgIFM4MCAgICAgTDQwICAgUzQwICAgIEwyMCAgIFM0MCAqLworCXswLCB7MjkzLCAzMjV9LCB7MTM1LCAxNTB9LCB7NjUsIDcyfSB9LAorCXsxLCB7NTg1LCA2NTB9LCB7MjcwLCAzMDB9LCB7MTMwLCAxNDR9IH0sCisJezIsIHs4NzgsIDk3NX0sIHs0MDUsIDQ1MH0sIHsxOTUsIDIxN30gfSwKKwl7MywgezExNzAsIDEzMDB9LCB7NTQwLCA2MDB9LCB7MjYwLCAyODl9IH0sCisJezQsIHsxNzU1LCAxOTUwfSwgezgxMCwgOTAwfSwgezM5MCwgNDMzfSB9LAorCXs1LCB7MjM0MCwgMjYwMH0sIHsxMDgwLCAxMjAwfSwgezUyMCwgNTc4fSB9LAorCXs2LCB7MjYzMywgMjkyNX0sIHsxMjE1LCAxMzUwfSwgezU4NSwgNjUwfSB9LAorCXs3LCB7MjkyNSwgMzI1MH0sIHsxMzUwLCAxNTAwfSwgezY1MCwgNzIyfSB9LAorCXs4LCB7MzUxMCwgMzkwMH0sIHsxNjIwLCAxODAwfSwgezc4MCwgODY3fSB9LAorCXs5LCB7MzkwMCwgNDMzM30sIHsxODAwLCAyMDAwfSwgezc4MCwgODY3fSB9Cit9OworCisvKk1DUyBwYXJhbWV0ZXJzIHdpdGggTnNzID0gMiovCitzdGF0aWMgc3RydWN0IGluZGV4X3ZodF9kYXRhX3JhdGVfdHlwZSBzdXBwb3J0ZWRfdmh0X21jc19yYXRlX25zczJbXSA9IHsKKwkvKiBNQ1MgIEw4MCAgICBTODAgICAgIEw0MCAgIFM0MCAgICBMMjAgICBTNDAgKi8KKwl7MCwgezU4NSwgNjUwfSwgezI3MCwgMzAwfSwgezEzMCwgMTQ0fSB9LAorCXsxLCB7MTE3MCwgMTMwMH0sIHs1NDAsIDYwMH0sIHsyNjAsIDI4OX0gfSwKKwl7MiwgezE3NTUsIDE5NTB9LCB7ODEwLCA5MDB9LCB7MzkwLCA0MzN9IH0sCisJezMsIHsyMzQwLCAyNjAwfSwgezEwODAsIDEyMDB9LCB7NTIwLCA1Nzh9IH0sCisJezQsIHszNTEwLCAzOTAwfSwgezE2MjAsIDE4MDB9LCB7NzgwLCA4Njd9IH0sCisJezUsIHs0NjgwLCA1MjAwfSwgezIxNjAsIDI0MDB9LCB7MTA0MCwgMTE1Nn0gfSwKKwl7NiwgezUyNjUsIDU4NTB9LCB7MjQzMCwgMjcwMH0sIHsxMTcwLCAxMzAwfSB9LAorCXs3LCB7NTg1MCwgNjUwMH0sIHsyNzAwLCAzMDAwfSwgezEzMDAsIDE0NDR9IH0sCisJezgsIHs3MDIwLCA3ODAwfSwgezMyNDAsIDM2MDB9LCB7MTU2MCwgMTczM30gfSwKKwl7OSwgezc4MDAsIDg2Njd9LCB7MzYwMCwgNDAwMH0sIHsxNTYwLCAxNzMzfSB9Cit9OworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV8xMUFDICovCisKKyNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKKworLyogIyMjIyMjIyMjIyMjIyBmdW5jdGlvbiBkZWZpbml0aW9ucyAjIyMjIyMjIyMjIyMgKi8KKworLyoqCisgKiB3bWFfc3dhcF9ieXRlcygpIC0gc3dhcCBieXRlcworICogQHB2OiBidWZmZXIKKyAqIEBuOiBzd2FwIGJ5dGVzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3N3YXBfYnl0ZXModm9pZCAqcHYsIHVpbnQzMl90IG4pCit7CisJaW50MzJfdCBub193b3JkczsKKwlpbnQzMl90IGk7CisJdWludDMyX3QgKndvcmRfcHRyOworCisJbm9fd29yZHMgPSBuIC8gc2l6ZW9mKHVpbnQzMl90KTsKKwl3b3JkX3B0ciA9ICh1aW50MzJfdCAqKSBwdjsKKwlmb3IgKGkgPSAwOyBpIDwgbm9fd29yZHM7IGkrKykgeworCQkqKHdvcmRfcHRyICsgaSkgPSBfX2NwdV90b19sZTMyKCood29yZF9wdHIgKyBpKSk7CisJfQorfQorCisjZGVmaW5lIFNXQVBNRSh4LCBsZW4pIHdtYV9zd2FwX2J5dGVzKCZ4LCBsZW4pOworI2VuZGlmIC8qIEJJR19FTkRJQU5fSE9TVCAqLworCisvKioKKyAqIHdtYV9nZXRfbWNzX2lkeCgpIC0gZ2V0IG1jcyBpbmRleAorICogQG1heFJhdGU6IG1heCByYXRlCisgKiBAcmF0ZV9mbGFnczogcmF0ZSBmbGFncworICogQG5zczogbnVtYmVyIG9mIG5zcworICogQG1jc1JhdGVGbGFnOiBtY3MgcmF0ZSBmbGFnCisgKgorICogUmV0dXJuOiByZXR1cm4gbWNzIGluZGV4CisgKi8KK3N0YXRpYyB1aW50OF90IHdtYV9nZXRfbWNzX2lkeCh1aW50MTZfdCBtYXhSYXRlLCB1aW50OF90IHJhdGVfZmxhZ3MsCisJCQkgICAgICAgdWludDhfdCBuc3MsIHVpbnQ4X3QgKm1jc1JhdGVGbGFnKQoreworCXVpbnQ4X3QgcmF0ZUZsYWcgPSAwLCBjdXJJZHggPSAwOworCXVpbnQxNl90IGN1clJhdGU7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJc3RydWN0IGluZGV4X3ZodF9kYXRhX3JhdGVfdHlwZSAqc3VwcG9ydGVkX3ZodF9tY3NfcmF0ZTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFBQyAqLworCXN0cnVjdCBpbmRleF9kYXRhX3JhdGVfdHlwZSAqc3VwcG9ydGVkX21jc19yYXRlOworCisJV01BX0xPR0QoIiVzIHJhdGU6JWQgcmF0ZV9mbGdzOiVkIiwgX19mdW5jX18sIG1heFJhdGUsIHJhdGVfZmxhZ3MpOworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMUFDCisJc3VwcG9ydGVkX3ZodF9tY3NfcmF0ZSA9IChzdHJ1Y3QgaW5kZXhfdmh0X2RhdGFfcmF0ZV90eXBlICopCisJCQkJICgobnNzID09IDEpID8gJnN1cHBvcnRlZF92aHRfbWNzX3JhdGVfbnNzMSA6CisJCQkJICAmc3VwcG9ydGVkX3ZodF9tY3NfcmF0ZV9uc3MyKTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFBQyAqLworCXN1cHBvcnRlZF9tY3NfcmF0ZSA9IChzdHJ1Y3QgaW5kZXhfZGF0YV9yYXRlX3R5cGUgKikKKwkJCSAgICAgKChuc3MgPT0gMSkgPyAmc3VwcG9ydGVkX21jc19yYXRlX25zczEgOiAmc3VwcG9ydGVkX21jc19yYXRlX25zczIpOworCisJKm1jc1JhdGVGbGFnID0gcmF0ZV9mbGFnczsKKwkqbWNzUmF0ZUZsYWcgJj0gfmVIQUxfVFhfUkFURV9TR0k7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExQUMKKwlpZiAocmF0ZV9mbGFncyAmCisJICAgIChlSEFMX1RYX1JBVEVfVkhUMjAgfCBlSEFMX1RYX1JBVEVfVkhUNDAgfCBlSEFMX1RYX1JBVEVfVkhUODApKSB7CisKKwkJaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfVkhUODApIHsKKwkJCWZvciAoY3VySWR4ID0gMDsgY3VySWR4IDwgTUFYX1ZIVF9NQ1NfSURYOyBjdXJJZHgrKykgeworCQkJCXJhdGVGbGFnID0gMDsKKwkJCQlpZiAoY3VySWR4ID49IDcpIHsKKwkJCQkJaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfU0dJKQorCQkJCQkJcmF0ZUZsYWcgfD0gMHgxOworCQkJCX0KKworCQkJCWN1clJhdGUgPSBzdXBwb3J0ZWRfdmh0X21jc19yYXRlW2N1cklkeF0uc3VwcG9ydGVkX1ZIVDgwX3JhdGVbcmF0ZUZsYWddOworCQkJCWlmIChjdXJSYXRlID09IG1heFJhdGUpIHsKKwkJCQkJZm91bmQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoKGZvdW5kID09IGZhbHNlKSAmJgorCQkgICAgKChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1ZIVDgwKSB8fAorCQkgICAgIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1ZIVDQwKSkpIHsKKwkJCWZvciAoY3VySWR4ID0gMDsgY3VySWR4IDwgTUFYX1ZIVF9NQ1NfSURYOyBjdXJJZHgrKykgeworCQkJCXJhdGVGbGFnID0gMDsKKwkJCQlpZiAoY3VySWR4ID49IDcpIHsKKwkJCQkJaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfU0dJKQorCQkJCQkJcmF0ZUZsYWcgfD0gMHgxOworCQkJCX0KKworCQkJCWN1clJhdGUgPSBzdXBwb3J0ZWRfdmh0X21jc19yYXRlW2N1cklkeF0uc3VwcG9ydGVkX1ZIVDQwX3JhdGVbcmF0ZUZsYWddOworCQkJCWlmIChjdXJSYXRlID09IG1heFJhdGUpIHsKKwkJCQkJZm91bmQgPSB0cnVlOworCQkJCQkqbWNzUmF0ZUZsYWcgJj0gfmVIQUxfVFhfUkFURV9WSFQ4MDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKChmb3VuZCA9PSBmYWxzZSkgJiYKKwkJICAgICgocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9WSFQ4MCkgfHwKKwkJICAgICAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9WSFQ0MCkgfHwKKwkJICAgICAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9WSFQyMCkpKSB7CisJCQlmb3IgKGN1cklkeCA9IDA7IGN1cklkeCA8IE1BWF9WSFRfTUNTX0lEWDsgY3VySWR4KyspIHsKKwkJCQlyYXRlRmxhZyA9IDA7CisJCQkJaWYgKGN1cklkeCA+PSA3KSB7CisJCQkJCWlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1NHSSkKKwkJCQkJCXJhdGVGbGFnIHw9IDB4MTsKKwkJCQl9CisKKwkJCQljdXJSYXRlID0gc3VwcG9ydGVkX3ZodF9tY3NfcmF0ZVtjdXJJZHhdLnN1cHBvcnRlZF9WSFQyMF9yYXRlW3JhdGVGbGFnXTsKKwkJCQlpZiAoY3VyUmF0ZSA9PSBtYXhSYXRlKSB7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJKm1jc1JhdGVGbGFnICY9CisJCQkJCQl+KGVIQUxfVFhfUkFURV9WSFQ4MCB8CisJCQkJCQkgIGVIQUxfVFhfUkFURV9WSFQ0MCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfMTFBQyAqLworCWlmICgoZm91bmQgPT0gZmFsc2UpICYmCisJICAgIChyYXRlX2ZsYWdzICYgKGVIQUxfVFhfUkFURV9IVDQwIHwgZUhBTF9UWF9SQVRFX0hUMjApKSkgeworCQlpZiAocmF0ZV9mbGFncyAmIGVIQUxfVFhfUkFURV9IVDQwKSB7CisJCQlyYXRlRmxhZyA9IDB4MTsKKworCQkJZm9yIChjdXJJZHggPSAwOyBjdXJJZHggPCBNQVhfSFRfTUNTX0lEWDsgY3VySWR4KyspIHsKKwkJCQlpZiAoY3VySWR4ID09IDcpIHsKKwkJCQkJaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfU0dJKQorCQkJCQkJcmF0ZUZsYWcgfD0gMHgyOworCQkJCX0KKworCQkJCWN1clJhdGUgPSBzdXBwb3J0ZWRfbWNzX3JhdGVbY3VySWR4XS5zdXBwb3J0ZWRfcmF0ZVtyYXRlRmxhZ107CisJCQkJaWYgKGN1clJhdGUgPT0gbWF4UmF0ZSkgeworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCSptY3NSYXRlRmxhZyA9IGVIQUxfVFhfUkFURV9IVDQwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZm91bmQgPT0gZmFsc2UpIHsKKwkJCXJhdGVGbGFnID0gMDsKKwkJCWZvciAoY3VySWR4ID0gMDsgY3VySWR4IDwgTUFYX0hUX01DU19JRFg7IGN1cklkeCsrKSB7CisJCQkJaWYgKGN1cklkeCA9PSA3KSB7CisJCQkJCWlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1NHSSkKKwkJCQkJCXJhdGVGbGFnIHw9IDB4MjsKKwkJCQl9CisKKwkJCQljdXJSYXRlID0gc3VwcG9ydGVkX21jc19yYXRlW2N1cklkeF0uc3VwcG9ydGVkX3JhdGVbcmF0ZUZsYWddOworCQkJCWlmIChjdXJSYXRlID09IG1heFJhdGUpIHsKKwkJCQkJZm91bmQgPSB0cnVlOworCQkJCQkqbWNzUmF0ZUZsYWcgPSBlSEFMX1RYX1JBVEVfSFQyMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLypTR0kgcmF0ZXMgYXJlIHVzZWQgYnkgZmlybXdhcmUgb25seSBmb3IgTUNTID49IDcgKi8KKwlpZiAoZm91bmQgJiYgKGN1cklkeCA+PSA3KSkKKwkJKm1jc1JhdGVGbGFnIHw9IGVIQUxfVFhfUkFURV9TR0k7CisKKwlyZXR1cm4gIGZvdW5kID8gY3VySWR4IDogSU5WQUxJRF9NQ1NfSURYOworfQorCisvKioKKyAqIGhvc3RfbWFwX3NtcHNfbW9kZSgpIC0gbWFwIGZ3IHNtcHMgbW9kZSB0byB0U21wc01vZGVWYWx1ZQorICogQGZ3X3NtcHNfbW9kZTogZncgc21wcyBtb2RlCisgKgorICogUmV0dXJuOiByZXR1cm4gdFNtcHNNb2RlVmFsdWUKKyAqLwordFNtcHNNb2RlVmFsdWUgaG9zdF9tYXBfc21wc19tb2RlKEFfVUlOVDMyIGZ3X3NtcHNfbW9kZSkKK3sKKwl0U21wc01vZGVWYWx1ZSBzbXBzX21vZGUgPSBTTVBTX01PREVfRElTQUJMRUQ7CisJc3dpdGNoIChmd19zbXBzX21vZGUpIHsKKwljYXNlIFdNSV9TTVBTX0ZPUkNFRF9NT0RFX1NUQVRJQzoKKwkJc21wc19tb2RlID0gU1RBVElDX1NNUFNfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBXTUlfU01QU19GT1JDRURfTU9ERV9EWU5BTUlDOgorCQlzbXBzX21vZGUgPSBEWU5BTUlDX1NNUFNfTU9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc21wc19tb2RlID0gU01QU19NT0RFX0RJU0FCTEVEOworCX0KKworCXJldHVybiBzbXBzX21vZGU7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfU1RBVFNfRVhUCisvKioKKyAqIHdtYV9zdGF0c19leHRfZXZlbnRfaGFuZGxlcigpIC0gZXh0ZW5kZWQgc3RhdHMgZXZlbnQgaGFuZGxlcgorICogQGhhbmRsZTogICAgIHdtYSBoYW5kbGUKKyAqIEBldmVudF9idWY6ICBldmVudCBidWZmZXIgcmVjZWl2ZWQgZnJvbSBmdworICogQGxlbjogICAgICAgIGxlbmd0aCBvZiBkYXRhCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV9zdGF0c19leHRfZXZlbnRfaGFuZGxlcih2b2lkICpoYW5kbGUsIHVpbnQ4X3QgKmV2ZW50X2J1ZiwKKwkJCQl1aW50MzJfdCBsZW4pCit7CisJV01JX1NUQVRTX0VYVF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl0U2lyU3RhdHNFeHRFdmVudCAqc3RhdHNfZXh0X2V2ZW50OworCXdtaV9zdGF0c19leHRfZXZlbnRfZml4ZWRfcGFyYW0gKnN0YXRzX2V4dF9pbmZvOworCUNERl9TVEFUVVMgc3RhdHVzOworCWNkc19tc2dfdCBjZHNfbXNnOworCXVpbnQ4X3QgKmJ1Zl9wdHI7CisJdWludDMyX3QgYWxsb2NfbGVuOworCisJV01BX0xPR0QoIiVzOiBQb3N0aW5nIHN0YXRzIGV4dCBldmVudCB0byBTTUUiLCBfX2Z1bmNfXyk7CisKKwlwYXJhbV9idWYgPSAoV01JX1NUQVRTX0VYVF9FVkVOVElEX3BhcmFtX3RsdnMgKikgZXZlbnRfYnVmOworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBzdGF0cyBleHQgZXZlbnQgYnVmIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdGF0c19leHRfaW5mbyA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJYnVmX3B0ciA9ICh1aW50OF90ICopIHN0YXRzX2V4dF9pbmZvOworCisJYWxsb2NfbGVuID0gc2l6ZW9mKHRTaXJTdGF0c0V4dEV2ZW50KTsKKwlhbGxvY19sZW4gKz0gc3RhdHNfZXh0X2luZm8tPmRhdGFfbGVuOworCisJc3RhdHNfZXh0X2V2ZW50ID0gKHRTaXJTdGF0c0V4dEV2ZW50ICopIGNkZl9tZW1fbWFsbG9jKGFsbG9jX2xlbik7CisJaWYgKE5VTEwgPT0gc3RhdHNfZXh0X2V2ZW50KSB7CisJCVdNQV9MT0dFKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYnVmX3B0ciArPSBzaXplb2Yod21pX3N0YXRzX2V4dF9ldmVudF9maXhlZF9wYXJhbSkgKyBXTUlfVExWX0hEUl9TSVpFOworCisJc3RhdHNfZXh0X2V2ZW50LT52ZGV2X2lkID0gc3RhdHNfZXh0X2luZm8tPnZkZXZfaWQ7CisJc3RhdHNfZXh0X2V2ZW50LT5ldmVudF9kYXRhX2xlbiA9IHN0YXRzX2V4dF9pbmZvLT5kYXRhX2xlbjsKKwljZGZfbWVtX2NvcHkoc3RhdHNfZXh0X2V2ZW50LT5ldmVudF9kYXRhLAorCQkgICAgIGJ1Zl9wdHIsIHN0YXRzX2V4dF9ldmVudC0+ZXZlbnRfZGF0YV9sZW4pOworCisJY2RzX21zZy50eXBlID0gZVdOSV9TTUVfU1RBVFNfRVhUX0VWRU5UOworCWNkc19tc2cuYm9keXB0ciA9ICh2b2lkICopc3RhdHNfZXh0X2V2ZW50OworCWNkc19tc2cuYm9keXZhbCA9IDA7CisKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9TTUUsICZjZHNfbXNnKTsKKwlpZiAoc3RhdHVzICE9IENERl9TVEFUVVNfU1VDQ0VTUykgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBwb3N0IHN0YXRzIGV4dCBldmVudCB0byBTTUUiLCBfX2Z1bmNfXyk7CisJCWNkZl9tZW1fZnJlZShzdGF0c19leHRfZXZlbnQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlXTUFfTE9HRCgiJXM6IHN0YXRzIGV4dCBldmVudCBQb3N0ZWQgdG8gU01FIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9TVEFUU19FWFQgKi8KKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKKworLyoqCisgKiB3bWFfdW5pZmllZF9saW5rX3BlZXJfc3RhdHNfZXZlbnRfaGFuZGxlcigpIC0gcGVlciBzdGF0cyBldmVudCBoYW5kbGVyCisgKiBAaGFuZGxlOiAgICAgICAgICB3bWEgaGFuZGxlCisgKiBAY21kX3BhcmFtX2luZm86ICBkYXRhIHJlY2VpdmVkIHdpdGggZXZlbnQgZnJvbSBmdworICogQGxlbjogICAgICAgICAgICAgbGVuZ3RoIG9mIGRhdGEKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHdtYV91bmlmaWVkX2xpbmtfcGVlcl9zdGF0c19ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkJCSAgICAgdWludDhfdCAqY21kX3BhcmFtX2luZm8sCisJCQkJCQkgICAgIHVpbnQzMl90IGxlbikKK3sKKwlXTUlfUEVFUl9MSU5LX1NUQVRTX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fdGx2czsKKwl3bWlfcGVlcl9zdGF0c19ldmVudF9maXhlZF9wYXJhbSAqZml4ZWRfcGFyYW07CisJd21pX3BlZXJfbGlua19zdGF0cyAqcGVlcl9zdGF0cywgKnRlbXBfcGVlcl9zdGF0czsKKwl3bWlfcmF0ZV9zdGF0cyAqcmF0ZV9zdGF0czsKKwl0U2lyTExTdGF0c1Jlc3VsdHMgKmxpbmtfc3RhdHNfcmVzdWx0czsKKwl1aW50OF90ICpyZXN1bHRzLCAqdF9wZWVyX3N0YXRzLCAqdF9yYXRlX3N0YXRzOworCXVpbnQzMl90IGNvdW50LCBudW1fcmF0ZXMgPSAwOworCXVpbnQzMl90IG5leHRfcmVzX29mZnNldCwgbmV4dF9wZWVyX29mZnNldCwgbmV4dF9yYXRlX29mZnNldDsKKwlzaXplX3QgcGVlcl9pbmZvX3NpemUsIHBlZXJfc3RhdHNfc2l6ZSwgcmF0ZV9zdGF0c19zaXplOworCXNpemVfdCBsaW5rX3N0YXRzX3Jlc3VsdHNfc2l6ZTsKKworCXRwQW5pU2lyR2xvYmFsIHBNYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisKKwlpZiAoIXBNYWMpIHsKKwkJV01BX0xPR0QoIiVzOiBOVUxMIHBNYWMgcHRyLiBFeGl0aW5nIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXBNYWMtPnNtZS5wTGlua0xheWVyU3RhdHNJbmRDYWxsYmFjaykgeworCQlXTUFfTE9HRCgiJXM6IEhERCBjYWxsYmFjayBpcyBudWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlXTUFfTE9HRCgiJXM6IFBvc3RpbmcgUGVlciBTdGF0cyBldmVudCB0byBIREQiLCBfX2Z1bmNfXyk7CisJcGFyYW1fdGx2cyA9IChXTUlfUEVFUl9MSU5LX1NUQVRTX0VWRU5USURfcGFyYW1fdGx2cyAqKSBjbWRfcGFyYW1faW5mbzsKKwlpZiAoIXBhcmFtX3RsdnMpIHsKKwkJV01BX0xPR0EoIiVzOiBJbnZhbGlkIHN0YXRzIGV2ZW50IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyoKKwkgKiBjbWRfcGFyYW1faW5mbyBjb250YWlucworCSAqIHdtaV9wZWVyX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtIGZpeGVkX3BhcmFtOworCSAqIG51bV9wZWVycyAqIHNpemUgb2Yoc3RydWN0IHdtaV9wZWVyX2xpbmtfc3RhdHMpCisJICogbnVtX3JhdGVzICogc2l6ZSBvZihzdHJ1Y3Qgd21pX3JhdGVfc3RhdHMpCisJICogbnVtX3JhdGVzIGlzIHRoZSBzdW0gb2YgdGhlIHJhdGVzIG9mIGFsbCB0aGUgcGVlcnMuCisJICovCisJZml4ZWRfcGFyYW0gPSBwYXJhbV90bHZzLT5maXhlZF9wYXJhbTsKKwlwZWVyX3N0YXRzID0gcGFyYW1fdGx2cy0+cGVlcl9zdGF0czsKKwlyYXRlX3N0YXRzID0gcGFyYW1fdGx2cy0+cGVlcl9yYXRlX3N0YXRzOworCisJaWYgKCFmaXhlZF9wYXJhbSB8fCAhcGVlcl9zdGF0cyB8fAorCSAgICAocGVlcl9zdGF0cy0+bnVtX3JhdGVzICYmICFyYXRlX3N0YXRzKSkgeworCQlXTUFfTE9HQSgiJXM6IEludmFsaWQgcGFyYW1fdGx2cyBmb3IgUGVlciBTdGF0cyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBudW1fcmF0ZXMgLSBzdW0gb2YgdGhlIHJhdGVzIG9mIGFsbCB0aGUgcGVlcnMKKwkgKi8KKwl0ZW1wX3BlZXJfc3RhdHMgPSAod21pX3BlZXJfbGlua19zdGF0cyAqKSBwZWVyX3N0YXRzOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGZpeGVkX3BhcmFtLT5udW1fcGVlcnM7IGNvdW50KyspIHsKKwkJbnVtX3JhdGVzICs9IHRlbXBfcGVlcl9zdGF0cy0+bnVtX3JhdGVzOworCQl0ZW1wX3BlZXJfc3RhdHMrKzsKKwl9CisKKwlwZWVyX3N0YXRzX3NpemUgPSBzaXplb2YodFNpcldpZmlQZWVyU3RhdCk7CisJcGVlcl9pbmZvX3NpemUgPSBzaXplb2YodFNpcldpZmlQZWVySW5mbyk7CisJcmF0ZV9zdGF0c19zaXplID0gc2l6ZW9mKHRTaXJXaWZpUmF0ZVN0YXQpOworCWxpbmtfc3RhdHNfcmVzdWx0c19zaXplID0KKwkJc2l6ZW9mKCpsaW5rX3N0YXRzX3Jlc3VsdHMpICsgcGVlcl9zdGF0c19zaXplICsKKwkJKGZpeGVkX3BhcmFtLT5udW1fcGVlcnMgKiBwZWVyX2luZm9fc2l6ZSkgKworCQkobnVtX3JhdGVzICogcmF0ZV9zdGF0c19zaXplKTsKKworCWxpbmtfc3RhdHNfcmVzdWx0cyA9IGNkZl9tZW1fbWFsbG9jKGxpbmtfc3RhdHNfcmVzdWx0c19zaXplKTsKKwlpZiAoTlVMTCA9PSBsaW5rX3N0YXRzX3Jlc3VsdHMpIHsKKwkJV01BX0xPR0QoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtIGZvciBzdGF0cyByZXN1bHRzLWxlbiAlenUiLAorCQkJIF9fZnVuY19fLCBsaW5rX3N0YXRzX3Jlc3VsdHNfc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCVdNQV9MT0dEKCJQZWVyIHN0YXRzIGZyb20gRlcgZXZlbnQgYnVmIik7CisJV01BX0xPR0QoIkZpeGVkIFBhcmFtOiIpOworCVdNQV9MT0dEKCJyZXF1ZXN0X2lkICV1IG51bV9wZWVycyAldSBwZWVyX2V2ZW50X251bWJlciAldSBtb3JlX2RhdGEgJXUiLAorCQkgZml4ZWRfcGFyYW0tPnJlcXVlc3RfaWQsIGZpeGVkX3BhcmFtLT5udW1fcGVlcnMsCisJCSBmaXhlZF9wYXJhbS0+cGVlcl9ldmVudF9udW1iZXIsIGZpeGVkX3BhcmFtLT5tb3JlX2RhdGEpOworCisJY2RmX21lbV96ZXJvKGxpbmtfc3RhdHNfcmVzdWx0cywgbGlua19zdGF0c19yZXN1bHRzX3NpemUpOworCisJbGlua19zdGF0c19yZXN1bHRzLT5wYXJhbUlkID0gV01JX0xJTktfU1RBVFNfQUxMX1BFRVI7CisJbGlua19zdGF0c19yZXN1bHRzLT5yc3BJZCA9IGZpeGVkX3BhcmFtLT5yZXF1ZXN0X2lkOworCWxpbmtfc3RhdHNfcmVzdWx0cy0+aWZhY2VJZCA9IDA7CisJbGlua19zdGF0c19yZXN1bHRzLT5udW1fcGVlcnMgPSBmaXhlZF9wYXJhbS0+bnVtX3BlZXJzOworCWxpbmtfc3RhdHNfcmVzdWx0cy0+cGVlcl9ldmVudF9udW1iZXIgPSBmaXhlZF9wYXJhbS0+cGVlcl9ldmVudF9udW1iZXI7CisJbGlua19zdGF0c19yZXN1bHRzLT5tb3JlUmVzdWx0VG9Gb2xsb3cgPSBmaXhlZF9wYXJhbS0+bW9yZV9kYXRhOworCisJY2RmX21lbV9jb3B5KGxpbmtfc3RhdHNfcmVzdWx0cy0+cmVzdWx0cywKKwkJICAgICAmZml4ZWRfcGFyYW0tPm51bV9wZWVycywgcGVlcl9zdGF0c19zaXplKTsKKworCXJlc3VsdHMgPSAodWludDhfdCAqKSBsaW5rX3N0YXRzX3Jlc3VsdHMtPnJlc3VsdHM7CisJdF9wZWVyX3N0YXRzID0gKHVpbnQ4X3QgKikgcGVlcl9zdGF0czsKKwl0X3JhdGVfc3RhdHMgPSAodWludDhfdCAqKSByYXRlX3N0YXRzOworCW5leHRfcmVzX29mZnNldCA9IHBlZXJfc3RhdHNfc2l6ZTsKKwluZXh0X3BlZXJfb2Zmc2V0ID0gV01JX1RMVl9IRFJfU0laRTsKKwluZXh0X3JhdGVfb2Zmc2V0ID0gV01JX1RMVl9IRFJfU0laRTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBmaXhlZF9wYXJhbS0+bnVtX3BlZXJzOyBjb3VudCsrKSB7CisJCVdNQV9MT0dEKCJQZWVyIEluZm86Iik7CisJCVdNQV9MT0dEKCJwZWVyX3R5cGUgJXUgY2FwYWJpbGl0aWVzICV1IG51bV9yYXRlcyAldSIsCisJCQkgcGVlcl9zdGF0cy0+cGVlcl90eXBlLCBwZWVyX3N0YXRzLT5jYXBhYmlsaXRpZXMsCisJCQkgcGVlcl9zdGF0cy0+bnVtX3JhdGVzKTsKKworCQljZGZfbWVtX2NvcHkocmVzdWx0cyArIG5leHRfcmVzX29mZnNldCwKKwkJCSAgICAgdF9wZWVyX3N0YXRzICsgbmV4dF9wZWVyX29mZnNldCwgcGVlcl9pbmZvX3NpemUpOworCQluZXh0X3Jlc19vZmZzZXQgKz0gcGVlcl9pbmZvX3NpemU7CisKKwkJLyogQ29weSByYXRlIHN0YXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBlZXIgKi8KKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgcGVlcl9zdGF0cy0+bnVtX3JhdGVzOyBjb3VudCsrKSB7CisJCQlXTUFfTE9HRCgiUmF0ZSBTdGF0cyBJbmZvOiIpOworCQkJV01BX0xPR0QoInJhdGUgJXUgYml0cmF0ZSAldSB0eF9tcGR1ICV1IHJ4X21wZHUgJXUgIgorCQkJCSAibXBkdV9sb3N0ICV1IHJldHJpZXMgJXUgcmV0cmllc19zaG9ydCAldSAiCisJCQkJICJyZXRyaWVzX2xvbmcgJXUiLCByYXRlX3N0YXRzLT5yYXRlLAorCQkJCSByYXRlX3N0YXRzLT5iaXRyYXRlLCByYXRlX3N0YXRzLT50eF9tcGR1LAorCQkJCSByYXRlX3N0YXRzLT5yeF9tcGR1LCByYXRlX3N0YXRzLT5tcGR1X2xvc3QsCisJCQkJIHJhdGVfc3RhdHMtPnJldHJpZXMsIHJhdGVfc3RhdHMtPnJldHJpZXNfc2hvcnQsCisJCQkJIHJhdGVfc3RhdHMtPnJldHJpZXNfbG9uZyk7CisJCQlyYXRlX3N0YXRzKys7CisKKwkJCWNkZl9tZW1fY29weShyZXN1bHRzICsgbmV4dF9yZXNfb2Zmc2V0LAorCQkJCSAgICAgdF9yYXRlX3N0YXRzICsgbmV4dF9yYXRlX29mZnNldCwKKwkJCQkgICAgIHJhdGVfc3RhdHNfc2l6ZSk7CisJCQluZXh0X3Jlc19vZmZzZXQgKz0gcmF0ZV9zdGF0c19zaXplOworCQkJbmV4dF9yYXRlX29mZnNldCArPSBzaXplb2YoKnJhdGVfc3RhdHMpOworCQl9CisJCW5leHRfcGVlcl9vZmZzZXQgKz0gc2l6ZW9mKCpwZWVyX3N0YXRzKTsKKwkJcGVlcl9zdGF0cysrOworCX0KKworCS8qIGNhbGwgaGRkIGNhbGxiYWNrIHdpdGggTGluayBMYXllciBTdGF0aXN0aWNzCisJICogdmRldl9pZC9pZmFjSWQgaW4gbGlua19zdGF0c19yZXN1bHRzIHdpbGwgYmUKKwkgKiB1c2VkIHRvIHJldHJpZXZlIHRoZSBjb3JyZWN0IEhERCBjb250ZXh0CisJICovCisJcE1hYy0+c21lLnBMaW5rTGF5ZXJTdGF0c0luZENhbGxiYWNrKHBNYWMtPmhIZGQsCisJCQkJCSAgICAgV01BX0xJTktfTEFZRVJfU1RBVFNfUkVTVUxUU19SU1AsCisJCQkJCSAgICAgbGlua19zdGF0c19yZXN1bHRzKTsKKwlXTUFfTE9HRCgiJXM6IFBlZXIgU3RhdHMgZXZlbnQgcG9zdGVkIHRvIEhERCIsIF9fZnVuY19fKTsKKwljZGZfbWVtX2ZyZWUobGlua19zdGF0c19yZXN1bHRzKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogd21hX3VuaWZpZWRfbGlua19yYWRpb19zdGF0c19ldmVudF9oYW5kbGVyKCkgLSByYWRpbyBsaW5rIHN0YXRzIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6ICAgICAgICAgIHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogIGRhdGEgcmVjZWl2ZWQgd2l0aCBldmVudCBmcm9tIGZ3CisgKiBAbGVuOiAgICAgICAgICAgICBsZW5ndGggb2YgZGF0YQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd21hX3VuaWZpZWRfbGlua19yYWRpb19zdGF0c19ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkJCSAgICAgIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkJICAgICAgdWludDMyX3QgbGVuKQoreworCVdNSV9SQURJT19MSU5LX1NUQVRTX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fdGx2czsKKwl3bWlfcmFkaW9fbGlua19zdGF0c19ldmVudF9maXhlZF9wYXJhbSAqZml4ZWRfcGFyYW07CisJd21pX3JhZGlvX2xpbmtfc3RhdHMgKnJhZGlvX3N0YXRzOworCXdtaV9jaGFubmVsX3N0YXRzICpjaGFubmVsX3N0YXRzOworCXRTaXJMTFN0YXRzUmVzdWx0cyAqbGlua19zdGF0c19yZXN1bHRzOworCXVpbnQ4X3QgKnJlc3VsdHMsICp0X3JhZGlvX3N0YXRzLCAqdF9jaGFubmVsX3N0YXRzOworCXVpbnQzMl90IG5leHRfcmVzX29mZnNldCwgbmV4dF9jaGFuX29mZnNldCwgY291bnQ7CisJc2l6ZV90IHJhZGlvX3N0YXRzX3NpemUsIGNoYW5fc3RhdHNfc2l6ZTsKKwlzaXplX3QgbGlua19zdGF0c19yZXN1bHRzX3NpemU7CisKKwl0cEFuaVNpckdsb2JhbCBwTWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCisJaWYgKCFwTWFjKSB7CisJCVdNQV9MT0dEKCIlczogTlVMTCBwTWFjIHB0ci4gRXhpdGluZyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFwTWFjLT5zbWUucExpbmtMYXllclN0YXRzSW5kQ2FsbGJhY2spIHsKKwkJV01BX0xPR0QoIiVzOiBIREQgY2FsbGJhY2sgaXMgbnVsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJV01BX0xPR0QoIiVzOiBQb3N0aW5nIFJhZGlvIFN0YXRzIGV2ZW50IHRvIEhERCIsIF9fZnVuY19fKTsKKwlwYXJhbV90bHZzID0gKFdNSV9SQURJT19MSU5LX1NUQVRTX0VWRU5USURfcGFyYW1fdGx2cyAqKSBjbWRfcGFyYW1faW5mbzsKKwlpZiAoIXBhcmFtX3RsdnMpIHsKKwkJV01BX0xPR0EoIiVzOiBJbnZhbGlkIHN0YXRzIGV2ZW50IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIGNtZF9wYXJhbV9pbmZvIGNvbnRhaW5zCisJICogd21pX3JhZGlvX2xpbmtfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0gZml4ZWRfcGFyYW07CisJICogc2l6ZSBvZihzdHJ1Y3Qgd21pX3JhZGlvX2xpbmtfc3RhdHMpOworCSAqIG51bV9jaGFubmVscyAqIHNpemUgb2Yoc3RydWN0IHdtaV9jaGFubmVsX3N0YXRzKQorCSAqLworCWZpeGVkX3BhcmFtID0gcGFyYW1fdGx2cy0+Zml4ZWRfcGFyYW07CisJcmFkaW9fc3RhdHMgPSBwYXJhbV90bHZzLT5yYWRpb19zdGF0czsKKwljaGFubmVsX3N0YXRzID0gcGFyYW1fdGx2cy0+Y2hhbm5lbF9zdGF0czsKKworCWlmICghZml4ZWRfcGFyYW0gfHwgIXJhZGlvX3N0YXRzIHx8CisJICAgIChyYWRpb19zdGF0cy0+bnVtX2NoYW5uZWxzICYmICFjaGFubmVsX3N0YXRzKSkgeworCQlXTUFfTE9HQSgiJXM6IEludmFsaWQgcGFyYW1fdGx2cyBmb3IgUmFkaW8gU3RhdHMiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJhZGlvX3N0YXRzX3NpemUgPSBzaXplb2YodFNpcldpZmlSYWRpb1N0YXQpOworCWNoYW5fc3RhdHNfc2l6ZSA9IHNpemVvZih0U2lyV2lmaUNoYW5uZWxTdGF0cyk7CisJbGlua19zdGF0c19yZXN1bHRzX3NpemUgPSBzaXplb2YoKmxpbmtfc3RhdHNfcmVzdWx0cykgKworCQkJCSAgcmFkaW9fc3RhdHNfc2l6ZSArIChyYWRpb19zdGF0cy0+bnVtX2NoYW5uZWxzICogY2hhbl9zdGF0c19zaXplKTsKKworCWxpbmtfc3RhdHNfcmVzdWx0cyA9IGNkZl9tZW1fbWFsbG9jKGxpbmtfc3RhdHNfcmVzdWx0c19zaXplKTsKKwlpZiAoTlVMTCA9PSBsaW5rX3N0YXRzX3Jlc3VsdHMpIHsKKwkJV01BX0xPR0QoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtIGZvciBzdGF0cyByZXN1bHRzLWxlbiAlenUiLAorCQkJIF9fZnVuY19fLCBsaW5rX3N0YXRzX3Jlc3VsdHNfc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCVdNQV9MT0dEKCJSYWRpbyBzdGF0cyBmcm9tIEZXIGV2ZW50IGJ1ZiIpOworCVdNQV9MT0dEKCJGaXhlZCBQYXJhbToiKTsKKwlXTUFfTE9HRCgicmVxdWVzdF9pZCAldSBudW1fcmFkaW8gJXUgbW9yZV9yYWRpb19ldmVudHMgJXUiLAorCQkgZml4ZWRfcGFyYW0tPnJlcXVlc3RfaWQsIGZpeGVkX3BhcmFtLT5udW1fcmFkaW8sCisJCSBmaXhlZF9wYXJhbS0+bW9yZV9yYWRpb19ldmVudHMpOworCisJV01BX0xPR0QoIlJhZGlvIEluZm8iKTsKKwlXTUFfTE9HRCgicmFkaW9faWQgJXUgb25fdGltZSAldSB0eF90aW1lICV1IHJ4X3RpbWUgJXUgb25fdGltZV9zY2FuICV1ICIKKwkJICJvbl90aW1lX25iZCAldSBvbl90aW1lX2dzY2FuICV1IG9uX3RpbWVfcm9hbV9zY2FuICV1ICIKKwkJICJvbl90aW1lX3Bub19zY2FuICV1IG9uX3RpbWVfaHMyMCAldSBudW1fY2hhbm5lbHMgJXUiLAorCQkgcmFkaW9fc3RhdHMtPnJhZGlvX2lkLCByYWRpb19zdGF0cy0+b25fdGltZSwKKwkJIHJhZGlvX3N0YXRzLT50eF90aW1lLCByYWRpb19zdGF0cy0+cnhfdGltZSwKKwkJIHJhZGlvX3N0YXRzLT5vbl90aW1lX3NjYW4sIHJhZGlvX3N0YXRzLT5vbl90aW1lX25iZCwKKwkJIHJhZGlvX3N0YXRzLT5vbl90aW1lX2dzY2FuLAorCQkgcmFkaW9fc3RhdHMtPm9uX3RpbWVfcm9hbV9zY2FuLAorCQkgcmFkaW9fc3RhdHMtPm9uX3RpbWVfcG5vX3NjYW4sCisJCSByYWRpb19zdGF0cy0+b25fdGltZV9oczIwLCByYWRpb19zdGF0cy0+bnVtX2NoYW5uZWxzKTsKKworCWNkZl9tZW1femVybyhsaW5rX3N0YXRzX3Jlc3VsdHMsIGxpbmtfc3RhdHNfcmVzdWx0c19zaXplKTsKKworCWxpbmtfc3RhdHNfcmVzdWx0cy0+cGFyYW1JZCA9IFdNSV9MSU5LX1NUQVRTX1JBRElPOworCWxpbmtfc3RhdHNfcmVzdWx0cy0+cnNwSWQgPSBmaXhlZF9wYXJhbS0+cmVxdWVzdF9pZDsKKwlsaW5rX3N0YXRzX3Jlc3VsdHMtPmlmYWNlSWQgPSAwOworCWxpbmtfc3RhdHNfcmVzdWx0cy0+bnVtX3JhZGlvID0gZml4ZWRfcGFyYW0tPm51bV9yYWRpbzsKKwlsaW5rX3N0YXRzX3Jlc3VsdHMtPnBlZXJfZXZlbnRfbnVtYmVyID0gMDsKKwlsaW5rX3N0YXRzX3Jlc3VsdHMtPm1vcmVSZXN1bHRUb0ZvbGxvdyA9IGZpeGVkX3BhcmFtLT5tb3JlX3JhZGlvX2V2ZW50czsKKworCXJlc3VsdHMgPSAodWludDhfdCAqKSBsaW5rX3N0YXRzX3Jlc3VsdHMtPnJlc3VsdHM7CisJdF9yYWRpb19zdGF0cyA9ICh1aW50OF90ICopIHJhZGlvX3N0YXRzOworCXRfY2hhbm5lbF9zdGF0cyA9ICh1aW50OF90ICopIGNoYW5uZWxfc3RhdHM7CisKKwljZGZfbWVtX2NvcHkocmVzdWx0cywgdF9yYWRpb19zdGF0cyArIFdNSV9UTFZfSERSX1NJWkUsCisJCSAgICAgcmFkaW9fc3RhdHNfc2l6ZSk7CisKKwluZXh0X3Jlc19vZmZzZXQgPSByYWRpb19zdGF0c19zaXplOworCW5leHRfY2hhbl9vZmZzZXQgPSBXTUlfVExWX0hEUl9TSVpFOworCVdNQV9MT0dEKCJDaGFubmVsIFN0YXRzIEluZm8iKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCByYWRpb19zdGF0cy0+bnVtX2NoYW5uZWxzOyBjb3VudCsrKSB7CisJCVdNQV9MT0dEKCJjaGFubmVsX3dpZHRoICV1IGNlbnRlcl9mcmVxICV1IGNlbnRlcl9mcmVxMCAldSAiCisJCQkgImNlbnRlcl9mcmVxMSAldSByYWRpb19hd2FrZV90aW1lICV1IGNjYV9idXN5X3RpbWUgJXUiLAorCQkJIGNoYW5uZWxfc3RhdHMtPmNoYW5uZWxfd2lkdGgsCisJCQkgY2hhbm5lbF9zdGF0cy0+Y2VudGVyX2ZyZXEsCisJCQkgY2hhbm5lbF9zdGF0cy0+Y2VudGVyX2ZyZXEwLAorCQkJIGNoYW5uZWxfc3RhdHMtPmNlbnRlcl9mcmVxMSwKKwkJCSBjaGFubmVsX3N0YXRzLT5yYWRpb19hd2FrZV90aW1lLAorCQkJIGNoYW5uZWxfc3RhdHMtPmNjYV9idXN5X3RpbWUpOworCQljaGFubmVsX3N0YXRzKys7CisKKwkJY2RmX21lbV9jb3B5KHJlc3VsdHMgKyBuZXh0X3Jlc19vZmZzZXQsCisJCQkgICAgIHRfY2hhbm5lbF9zdGF0cyArIG5leHRfY2hhbl9vZmZzZXQsCisJCQkgICAgIGNoYW5fc3RhdHNfc2l6ZSk7CisJCW5leHRfcmVzX29mZnNldCArPSBjaGFuX3N0YXRzX3NpemU7CisJCW5leHRfY2hhbl9vZmZzZXQgKz0gc2l6ZW9mKCpjaGFubmVsX3N0YXRzKTsKKwl9CisKKwkvKiBjYWxsIGhkZCBjYWxsYmFjayB3aXRoIExpbmsgTGF5ZXIgU3RhdGlzdGljcworCSAqIHZkZXZfaWQvaWZhY0lkIGluIGxpbmtfc3RhdHNfcmVzdWx0cyB3aWxsIGJlCisJICogdXNlZCB0byByZXRyaWV2ZSB0aGUgY29ycmVjdCBIREQgY29udGV4dAorCSAqLworCXBNYWMtPnNtZS5wTGlua0xheWVyU3RhdHNJbmRDYWxsYmFjayhwTWFjLT5oSGRkLAorCQkJCQkgICAgIFdNQV9MSU5LX0xBWUVSX1NUQVRTX1JFU1VMVFNfUlNQLAorCQkJCQkgICAgIGxpbmtfc3RhdHNfcmVzdWx0cyk7CisJV01BX0xPR0QoIiVzOiBSYWRpbyBTdGF0cyBldmVudCBwb3N0ZWQgdG8gSEREIiwgX19mdW5jX18pOworCWNkZl9tZW1fZnJlZShsaW5rX3N0YXRzX3Jlc3VsdHMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX3JlZ2lzdGVyX2xsX3N0YXRzX2V2ZW50X2hhbmRsZXIoKSAtIHJlZ2lzdGVyIGxpbmsgbGF5ZXIgc3RhdHMgcmVsYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IGhhbmRsZXIKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3JlZ2lzdGVyX2xsX3N0YXRzX2V2ZW50X2hhbmRsZXIodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCWlmIChOVUxMID09IHdtYV9oYW5kbGUpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWFfaGFuZGxlIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCSAgIFdNSV9JRkFDRV9MSU5LX1NUQVRTX0VWRU5USUQsCisJCQkJCSAgIHdtYV91bmlmaWVkX2xpbmtfaWZhY2Vfc3RhdHNfZXZlbnRfaGFuZGxlcik7CisJd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkgICBXTUlfUEVFUl9MSU5LX1NUQVRTX0VWRU5USUQsCisJCQkJCSAgIHdtYV91bmlmaWVkX2xpbmtfcGVlcl9zdGF0c19ldmVudF9oYW5kbGVyKTsKKwl3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCSAgIFdNSV9SQURJT19MSU5LX1NUQVRTX0VWRU5USUQsCisJCQkJCSAgIHdtYV91bmlmaWVkX2xpbmtfcmFkaW9fc3RhdHNfZXZlbnRfaGFuZGxlcik7CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiB3bWFfcHJvY2Vzc19sbF9zdGF0c19jbGVhcl9yZXEoKSAtIGNsZWFyIGxpbmsgbGF5ZXIgc3RhdHMKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBjbGVhclJlcTogbGwgc3RhdHMgY2xlYXIgcmVxdWVzdCBjb21tYW5kIHBhcmFtcworICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworQ0RGX1NUQVRVUyB3bWFfcHJvY2Vzc19sbF9zdGF0c19jbGVhcl9yZXEKKwkodHBfd21hX2hhbmRsZSB3bWEsIGNvbnN0IHRwU2lyTExTdGF0c0NsZWFyUmVxIGNsZWFyUmVxKQoreworCXdtaV9jbGVhcl9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqY21kOworCWludDMyX3QgbGVuOworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwlpbnQgcmV0OworCisJaWYgKCFjbGVhclJlcSB8fCAhd21hKSB7CisJCVdNQV9MT0dFKCIlczogaW5wdXQgcG9pbnRlciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJbGVuID0gc2l6ZW9mKCpjbWQpOworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2NhdGUgd21pIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJY2RmX21lbV96ZXJvKGJ1Zl9wdHIsIGxlbik7CisJY21kID0gKHdtaV9jbGVhcl9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NsZWFyX2xpbmtfc3RhdHNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9jbGVhcl9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbSkpOworCisJY21kLT5zdG9wX3N0YXRzX2NvbGxlY3Rpb25fcmVxID0gY2xlYXJSZXEtPnN0b3BSZXE7CisJY21kLT52ZGV2X2lkID0gY2xlYXJSZXEtPnN0YUlkOworCWNtZC0+c3RhdHNfY2xlYXJfcmVxX21hc2sgPSBjbGVhclJlcS0+c3RhdHNDbGVhclJlcU1hc2s7CisKKwlXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUih3bWEtPmludGVyZmFjZXNbY2xlYXJSZXEtPnN0YUlkXS5hZGRyLAorCQkJCSAgICZjbWQtPnBlZXJfbWFjYWRkcik7CisKKwlXTUFfTE9HRCgiTElOS19MQVlFUl9TVEFUUyAtIENsZWFyIFJlcXVlc3QgUGFyYW1zIik7CisJV01BX0xPR0QoIlN0b3BSZXEgICAgICAgICA6ICVkIiwgY21kLT5zdG9wX3N0YXRzX2NvbGxlY3Rpb25fcmVxKTsKKwlXTUFfTE9HRCgiVmRldiBJZCAgICAgICAgIDogJWQiLCBjbWQtPnZkZXZfaWQpOworCVdNQV9MT0dEKCJDbGVhciBTdGF0IE1hc2sgOiAlZCIsIGNtZC0+c3RhdHNfY2xlYXJfcmVxX21hc2spOworCVdNQV9MT0dEKCJQZWVyIE1BQyBBZGRyICAgOiAlcE0iLAorCQkgd21hLT5pbnRlcmZhY2VzW2NsZWFyUmVxLT5zdGFJZF0uYWRkcik7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWEtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSAgIFdNSV9DTEVBUl9MSU5LX1NUQVRTX0NNRElEKTsKKwlpZiAocmV0KSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIHNlbmQgY2xlYXIgbGluayBzdGF0cyByZXEiLCBfX2Z1bmNfXyk7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJV01BX0xPR0QoIkNsZWFyIExpbmsgTGF5ZXIgU3RhdHMgcmVxdWVzdCBzZW50IHN1Y2Nlc3NmdWxseSIpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX3Byb2Nlc3NfbGxfc3RhdHNfc2V0X3JlcSgpIC0gbGluayBsYXllciBzdGF0cyBzZXQgcmVxdWVzdAorICogQHdtYTogICAgICAgd21hIGhhbmRsZQorICogQHNldFJlcTogIGxsIHN0YXRzIHNldCByZXF1ZXN0IGNvbW1hbmQgcGFyYW1zCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitDREZfU1RBVFVTIHdtYV9wcm9jZXNzX2xsX3N0YXRzX3NldF9yZXEKKwkodHBfd21hX2hhbmRsZSB3bWEsIGNvbnN0IHRwU2lyTExTdGF0c1NldFJlcSBzZXRSZXEpCit7CisJd21pX3N0YXJ0X2xpbmtfc3RhdHNfY21kX2ZpeGVkX3BhcmFtICpjbWQ7CisJaW50MzJfdCBsZW47CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50OF90ICpidWZfcHRyOworCWludCByZXQ7CisKKwlpZiAoIXNldFJlcSB8fCAhd21hKSB7CisJCVdNQV9MT0dFKCIlczogaW5wdXQgcG9pbnRlciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJbGVuID0gc2l6ZW9mKCpjbWQpOworCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21hLT53bWlfaGFuZGxlLCBsZW4pOworCisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgYWxsb2NhdGUgd21pIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT01FTTsKKwl9CisKKwlidWZfcHRyID0gKHVpbnQ4X3QgKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJY2RmX21lbV96ZXJvKGJ1Zl9wdHIsIGxlbik7CisJY21kID0gKHdtaV9zdGFydF9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YXJ0X2xpbmtfc3RhdHNfY21kX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKHdtaV9zdGFydF9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbSkpOworCisJY21kLT5tcGR1X3NpemVfdGhyZXNob2xkID0gc2V0UmVxLT5tcGR1U2l6ZVRocmVzaG9sZDsKKwljbWQtPmFnZ3Jlc3NpdmVfc3RhdGlzdGljc19nYXRoZXJpbmcgPQorCQlzZXRSZXEtPmFnZ3Jlc3NpdmVTdGF0aXN0aWNzR2F0aGVyaW5nOworCisJV01BX0xPR0QoIkxJTktfTEFZRVJfU1RBVFMgLSBTdGFydC9TZXQgUmVxdWVzdCBQYXJhbXMiKTsKKwlXTUFfTE9HRCgiTVBEVSBTaXplIFRocmVzaCA6ICVkIiwgY21kLT5tcGR1X3NpemVfdGhyZXNob2xkKTsKKwlXTUFfTE9HRCgiQWdncmVzc2l2ZSBHYXRoZXI6ICVkIiwgY21kLT5hZ2dyZXNzaXZlX3N0YXRpc3RpY3NfZ2F0aGVyaW5nKTsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX1NUQVJUX0xJTktfU1RBVFNfQ01ESUQpOworCWlmIChyZXQpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gc2VuZCBzZXQgbGluayBzdGF0cyByZXF1ZXN0IiwgX19mdW5jX18pOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCVdNQV9MT0dEKCJTZXQgTGluayBMYXllciBTdGF0cyByZXF1ZXN0IHNlbnQgc3VjY2Vzc2Z1bGx5Iik7CisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc19sbF9zdGF0c19nZXRfcmVxKCkgLSBsaW5rIGxheWVyIHN0YXRzIGdldCByZXF1ZXN0CisgKiBAd21hOndtYSBoYW5kbGUKKyAqIEBnZXRSZXE6bGwgc3RhdHMgZ2V0IHJlcXVlc3QgY29tbWFuZCBwYXJhbXMKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK0NERl9TVEFUVVMgd21hX3Byb2Nlc3NfbGxfc3RhdHNfZ2V0X3JlcQorCSh0cF93bWFfaGFuZGxlIHdtYSwgY29uc3QgdHBTaXJMTFN0YXRzR2V0UmVxIGdldFJlcSkKK3sKKwl3bWlfcmVxdWVzdF9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqY21kOworCWludDMyX3QgbGVuOworCXdtaV9idWZfdCBidWY7CisJdWludDhfdCAqYnVmX3B0cjsKKwlpbnQgcmV0OworCisJaWYgKCFnZXRSZXEgfHwgIXdtYSkgeworCQlXTUFfTE9HRSgiJXM6IGlucHV0IHBvaW50ZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWxlbiA9IHNpemVvZigqY21kKTsKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYS0+d21pX2hhbmRsZSwgbGVuKTsKKworCWlmICghYnVmKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIGFsbG9jYXRlIHdtaSBidWZmZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfTk9NRU07CisJfQorCisJYnVmX3B0ciA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCWNkZl9tZW1femVybyhidWZfcHRyLCBsZW4pOworCWNtZCA9ICh3bWlfcmVxdWVzdF9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqKSBidWZfcHRyOworCisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JlcXVlc3RfbGlua19zdGF0c19jbWRfZml4ZWRfcGFyYW0sCisJCSAgICAgICBXTUlUTFZfR0VUX1NUUlVDVF9UTFZMRU4KKwkJCSAgICAgICAod21pX3JlcXVlc3RfbGlua19zdGF0c19jbWRfZml4ZWRfcGFyYW0pKTsKKworCWNtZC0+cmVxdWVzdF9pZCA9IGdldFJlcS0+cmVxSWQ7CisJY21kLT5zdGF0c190eXBlID0gZ2V0UmVxLT5wYXJhbUlkTWFzazsKKwljbWQtPnZkZXZfaWQgPSBnZXRSZXEtPnN0YUlkOworCisJV01JX0NIQVJfQVJSQVlfVE9fTUFDX0FERFIod21hLT5pbnRlcmZhY2VzW2dldFJlcS0+c3RhSWRdLmFkZHIsCisJCQkJICAgJmNtZC0+cGVlcl9tYWNhZGRyKTsKKworCVdNQV9MT0dEKCJMSU5LX0xBWUVSX1NUQVRTIC0gR2V0IFJlcXVlc3QgUGFyYW1zIik7CisJV01BX0xPR0QoIlJlcXVlc3QgSUQgICAgICA6ICVkIiwgY21kLT5yZXF1ZXN0X2lkKTsKKwlXTUFfTE9HRCgiU3RhdHMgVHlwZSAgICAgIDogJWQiLCBjbWQtPnN0YXRzX3R5cGUpOworCVdNQV9MT0dEKCJWZGV2IElEICAgICAgICAgOiAlZCIsIGNtZC0+dmRldl9pZCk7CisJV01BX0xPR0QoIlBlZXIgTUFDIEFkZHIgICA6ICVwTSIsIHdtYS0+aW50ZXJmYWNlc1tnZXRSZXEtPnN0YUlkXS5hZGRyKTsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYS0+d21pX2hhbmRsZSwgYnVmLCBsZW4sCisJCQkJICAgV01JX1JFUVVFU1RfTElOS19TVEFUU19DTURJRCk7CisJaWYgKHJldCkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZW5kIGdldCBsaW5rIHN0YXRzIHJlcXVlc3QiLCBfX2Z1bmNfXyk7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJV01BX0xPR0QoIkdldCBMaW5rIExheWVyIFN0YXRzIHJlcXVlc3Qgc2VudCBzdWNjZXNzZnVsbHkiKTsKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV91bmlmaWVkX2xpbmtfaWZhY2Vfc3RhdHNfZXZlbnRfaGFuZGxlcigpIC0gbGluayBpZmFjZSBzdGF0cyBldmVudCBoYW5kbGVyCisgKiBAd21hOndtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZGF0YSBmcm9tIGV2ZW50CisgKiBAbGVuOiBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX3VuaWZpZWRfbGlua19pZmFjZV9zdGF0c19ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwKKwkJCQkJICAgICAgIHVpbnQ4X3QgKmNtZF9wYXJhbV9pbmZvLAorCQkJCQkgICAgICAgdWludDMyX3QgbGVuKQoreworCVdNSV9JRkFDRV9MSU5LX1NUQVRTX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fdGx2czsKKwl3bWlfaWZhY2VfbGlua19zdGF0c19ldmVudF9maXhlZF9wYXJhbSAqZml4ZWRfcGFyYW07CisJd21pX2lmYWNlX2xpbmtfc3RhdHMgKmxpbmtfc3RhdHM7CisJd21pX3dtbV9hY19zdGF0cyAqYWNfc3RhdHM7CisJdFNpckxMU3RhdHNSZXN1bHRzICpsaW5rX3N0YXRzX3Jlc3VsdHM7CisJdWludDhfdCAqcmVzdWx0cywgKnRfbGlua19zdGF0cywgKnRfYWNfc3RhdHM7CisJdWludDMyX3QgbmV4dF9yZXNfb2Zmc2V0LCBuZXh0X2FjX29mZnNldCwgY291bnQ7CisJdWludDMyX3Qgcm9hbWluZ19vZmZzZXQsIHJvYW1pbmdfc2l6ZTsKKwlzaXplX3QgbGlua19zdGF0c19zaXplLCBhY19zdGF0c19zaXplLCBpZmFjZV9pbmZvX3NpemU7CisJc2l6ZV90IGxpbmtfc3RhdHNfcmVzdWx0c19zaXplOworCisJdHBBbmlTaXJHbG9iYWwgcE1hYyA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1BFKTsKKworCWlmICghcE1hYykgeworCQlXTUFfTE9HRCgiJXM6IE5VTEwgcE1hYyBwdHIuIEV4aXRpbmciLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcE1hYy0+c21lLnBMaW5rTGF5ZXJTdGF0c0luZENhbGxiYWNrKSB7CisJCVdNQV9MT0dEKCIlczogSEREIGNhbGxiYWNrIGlzIG51bGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCVdNQV9MT0dEKCIlczogUG9zdGluZyBJZmFjZSBTdGF0cyBldmVudCB0byBIREQiLCBfX2Z1bmNfXyk7CisJcGFyYW1fdGx2cyA9IChXTUlfSUZBQ0VfTElOS19TVEFUU19FVkVOVElEX3BhcmFtX3RsdnMgKikgY21kX3BhcmFtX2luZm87CisJaWYgKCFwYXJhbV90bHZzKSB7CisJCVdNQV9MT0dBKCIlczogSW52YWxpZCBzdGF0cyBldmVudCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBjbWRfcGFyYW1faW5mbyBjb250YWlucworCSAqIHdtaV9pZmFjZV9saW5rX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtIGZpeGVkX3BhcmFtOworCSAqIHdtaV9pZmFjZV9saW5rX3N0YXRzIGlmYWNlX2xpbmtfc3RhdHM7CisJICogaWZhY2VfbGlua19zdGF0cy0+bnVtX2FjICogc2l6ZSBvZihzdHJ1Y3Qgd21pX3dtbV9hY19zdGF0cykKKwkgKi8KKwlmaXhlZF9wYXJhbSA9IHBhcmFtX3RsdnMtPmZpeGVkX3BhcmFtOworCWxpbmtfc3RhdHMgPSBwYXJhbV90bHZzLT5pZmFjZV9saW5rX3N0YXRzOworCWFjX3N0YXRzID0gcGFyYW1fdGx2cy0+YWM7CisKKwlpZiAoIWZpeGVkX3BhcmFtIHx8ICFsaW5rX3N0YXRzIHx8IChsaW5rX3N0YXRzLT5udW1fYWMgJiYgIWFjX3N0YXRzKSkgeworCQlXTUFfTE9HQSgiJXM6IEludmFsaWQgcGFyYW1fdGx2cyBmb3IgSWZhY2UgU3RhdHMiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxpbmtfc3RhdHNfc2l6ZSA9IHNpemVvZih0U2lyV2lmaUlmYWNlU3RhdCk7CisJaWZhY2VfaW5mb19zaXplID0gc2l6ZW9mKHRTaXJXaWZpSW50ZXJmYWNlSW5mbyk7CisJYWNfc3RhdHNfc2l6ZSA9IHNpemVvZih0U2lyV2lmaVdtbUFjU3RhdCk7CisJbGlua19zdGF0c19yZXN1bHRzX3NpemUgPSBzaXplb2YoKmxpbmtfc3RhdHNfcmVzdWx0cykgKyBsaW5rX3N0YXRzX3NpemU7CisKKwlsaW5rX3N0YXRzX3Jlc3VsdHMgPSBjZGZfbWVtX21hbGxvYyhsaW5rX3N0YXRzX3Jlc3VsdHNfc2l6ZSk7CisJaWYgKCFsaW5rX3N0YXRzX3Jlc3VsdHMpIHsKKwkJV01BX0xPR0QoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtIGZvciBzdGF0cyByZXN1bHRzLWxlbiAlenUiLAorCQkJIF9fZnVuY19fLCBsaW5rX3N0YXRzX3Jlc3VsdHNfc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCVdNQV9MT0dEKCJJbnRlcmZhY2Ugc3RhdHMgZnJvbSBGVyBldmVudCBidWYiKTsKKwlXTUFfTE9HRCgiRml4ZWQgUGFyYW06Iik7CisJV01BX0xPR0QoInJlcXVlc3RfaWQgJXUgdmRldl9pZCAldSIsCisJCSBmaXhlZF9wYXJhbS0+cmVxdWVzdF9pZCwgZml4ZWRfcGFyYW0tPnZkZXZfaWQpOworCisJV01BX0xPR0QoIklmYWNlIFN0YXRzOiIpOworCVdNQV9MT0dEKCJiZWFjb25fcnggJXUgbWdtdF9yeCAldSBtZ210X2FjdGlvbl9yeCAldSBtZ210X2FjdGlvbl90eCAldSAiCisJCSAicnNzaV9tZ210ICV1IHJzc2lfZGF0YSAldSByc3NpX2FjayAldSBudW1fcGVlcnMgJXUgIgorCQkgIm51bV9wZWVyX2V2ZW50cyAldSBudW1fYWMgJXUgcm9hbV9zdGF0ZSAldSIKKwkJICIgYXZnX2Jjbl9zcHJlYWRfb2Zmc2V0X2hpZ2ggJXUiCisJCSAiIGF2Z19iY25fc3ByZWFkX29mZnNldF9sb3cgJXUiCisJCSAiIGlzIGxlYWt5X2FwICV1IgorCQkgIiBhdmdfcnhfZnJhbWVzX2xlYWtlZCAldSIKKwkJICIgcnhfbGVha193aW5kb3cgJXUiLAorCQkgbGlua19zdGF0cy0+YmVhY29uX3J4LCBsaW5rX3N0YXRzLT5tZ210X3J4LAorCQkgbGlua19zdGF0cy0+bWdtdF9hY3Rpb25fcngsIGxpbmtfc3RhdHMtPm1nbXRfYWN0aW9uX3R4LAorCQkgbGlua19zdGF0cy0+cnNzaV9tZ210LCBsaW5rX3N0YXRzLT5yc3NpX2RhdGEsCisJCSBsaW5rX3N0YXRzLT5yc3NpX2FjaywgbGlua19zdGF0cy0+bnVtX3BlZXJzLAorCQkgbGlua19zdGF0cy0+bnVtX3BlZXJfZXZlbnRzLCBsaW5rX3N0YXRzLT5udW1fYWMsCisJCSBsaW5rX3N0YXRzLT5yb2FtX3N0YXRlLAorCQkgbGlua19zdGF0cy0+YXZnX2Jjbl9zcHJlYWRfb2Zmc2V0X2hpZ2gsCisJCSBsaW5rX3N0YXRzLT5hdmdfYmNuX3NwcmVhZF9vZmZzZXRfbG93LAorCQkgbGlua19zdGF0cy0+aXNfbGVha3lfYXAsCisJCSBsaW5rX3N0YXRzLT5hdmdfcnhfZnJtc19sZWFrZWQsCisJCSBsaW5rX3N0YXRzLT5yeF9sZWFrX3dpbmRvdyk7CisKKwljZGZfbWVtX3plcm8obGlua19zdGF0c19yZXN1bHRzLCBsaW5rX3N0YXRzX3Jlc3VsdHNfc2l6ZSk7CisKKwlsaW5rX3N0YXRzX3Jlc3VsdHMtPnBhcmFtSWQgPSBXTUlfTElOS19TVEFUU19JRkFDRTsKKwlsaW5rX3N0YXRzX3Jlc3VsdHMtPnJzcElkID0gZml4ZWRfcGFyYW0tPnJlcXVlc3RfaWQ7CisJbGlua19zdGF0c19yZXN1bHRzLT5pZmFjZUlkID0gZml4ZWRfcGFyYW0tPnZkZXZfaWQ7CisJbGlua19zdGF0c19yZXN1bHRzLT5udW1fcGVlcnMgPSBsaW5rX3N0YXRzLT5udW1fcGVlcnM7CisJbGlua19zdGF0c19yZXN1bHRzLT5wZWVyX2V2ZW50X251bWJlciA9IDA7CisJbGlua19zdGF0c19yZXN1bHRzLT5tb3JlUmVzdWx0VG9Gb2xsb3cgPSAwOworCisJcmVzdWx0cyA9ICh1aW50OF90ICopIGxpbmtfc3RhdHNfcmVzdWx0cy0+cmVzdWx0czsKKwl0X2xpbmtfc3RhdHMgPSAodWludDhfdCAqKSBsaW5rX3N0YXRzOworCXRfYWNfc3RhdHMgPSAodWludDhfdCAqKSBhY19zdGF0czsKKworCS8qIENvcHkgcm9hbWluZyBzdGF0ZSAqLworCXJvYW1pbmdfb2Zmc2V0ID0gb2Zmc2V0b2YodFNpcldpZmlJbnRlcmZhY2VJbmZvLCByb2FtaW5nKTsKKwlyb2FtaW5nX3NpemUgPSBtZW1iZXJfc2l6ZSh0U2lyV2lmaUludGVyZmFjZUluZm8sIHJvYW1pbmcpOworCisJY2RmX21lbV9jb3B5KHJlc3VsdHMgKyByb2FtaW5nX29mZnNldCwgJmxpbmtfc3RhdHMtPnJvYW1fc3RhdGUsCisJCSAgICAgcm9hbWluZ19zaXplKTsKKworCWNkZl9tZW1fY29weShyZXN1bHRzICsgaWZhY2VfaW5mb19zaXplLAorCQkgICAgIHRfbGlua19zdGF0cyArIFdNSV9UTFZfSERSX1NJWkUsCisJCSAgICAgbGlua19zdGF0c19zaXplIC0gaWZhY2VfaW5mb19zaXplIC0KKwkJICAgICBXSUZJX0FDX01BWCAqIGFjX3N0YXRzX3NpemUpOworCisJbmV4dF9yZXNfb2Zmc2V0ID0gbGlua19zdGF0c19zaXplIC0gV0lGSV9BQ19NQVggKiBhY19zdGF0c19zaXplOworCW5leHRfYWNfb2Zmc2V0ID0gV01JX1RMVl9IRFJfU0laRTsKKworCVdNQV9MT0dEKCJBQyBTdGF0czoiKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsaW5rX3N0YXRzLT5udW1fYWM7IGNvdW50KyspIHsKKwkJV01BX0xPR0QoImFjX3R5cGUgJXUgdHhfbXBkdSAldSByeF9tcGR1ICV1IHR4X21jYXN0ICV1ICIKKwkJCSAicnhfbWNhc3QgJXUgcnhfYW1wZHUgJXUgdHhfYW1wZHUgJXUgbXBkdV9sb3N0ICV1ICIKKwkJCSAicmV0cmllcyAldSByZXRyaWVzX3Nob3J0ICV1IHJldHJpZXNfbG9uZyAldSAiCisJCQkgImNvbnRlbnRpb25fdGltZV9taW4gJXUgY29udGVudGlvbl90aW1lX21heCAldSAiCisJCQkgImNvbnRlbnRpb25fdGltZV9hdmcgJXUgY29udGVudGlvbl9udW1fc2FtcGxlcyAldSIsCisJCQkgYWNfc3RhdHMtPmFjX3R5cGUsIGFjX3N0YXRzLT50eF9tcGR1LAorCQkJIGFjX3N0YXRzLT5yeF9tcGR1LCBhY19zdGF0cy0+dHhfbWNhc3QsCisJCQkgYWNfc3RhdHMtPnJ4X21jYXN0LCBhY19zdGF0cy0+cnhfYW1wZHUsCisJCQkgYWNfc3RhdHMtPnR4X2FtcGR1LCBhY19zdGF0cy0+bXBkdV9sb3N0LAorCQkJIGFjX3N0YXRzLT5yZXRyaWVzLCBhY19zdGF0cy0+cmV0cmllc19zaG9ydCwKKwkJCSBhY19zdGF0cy0+cmV0cmllc19sb25nLCBhY19zdGF0cy0+Y29udGVudGlvbl90aW1lX21pbiwKKwkJCSBhY19zdGF0cy0+Y29udGVudGlvbl90aW1lX21heCwKKwkJCSBhY19zdGF0cy0+Y29udGVudGlvbl90aW1lX2F2ZywKKwkJCSBhY19zdGF0cy0+Y29udGVudGlvbl9udW1fc2FtcGxlcyk7CisJCWFjX3N0YXRzKys7CisKKwkJY2RmX21lbV9jb3B5KHJlc3VsdHMgKyBuZXh0X3Jlc19vZmZzZXQsCisJCQkgICAgIHRfYWNfc3RhdHMgKyBuZXh0X2FjX29mZnNldCwgYWNfc3RhdHNfc2l6ZSk7CisJCW5leHRfcmVzX29mZnNldCArPSBhY19zdGF0c19zaXplOworCQluZXh0X2FjX29mZnNldCArPSBzaXplb2YoKmFjX3N0YXRzKTsKKwl9CisKKwkvKiBjYWxsIGhkZCBjYWxsYmFjayB3aXRoIExpbmsgTGF5ZXIgU3RhdGlzdGljcworCSAqIHZkZXZfaWQvaWZhY0lkIGluIGxpbmtfc3RhdHNfcmVzdWx0cyB3aWxsIGJlCisJICogdXNlZCB0byByZXRyaWV2ZSB0aGUgY29ycmVjdCBIREQgY29udGV4dAorCSAqLworCXBNYWMtPnNtZS5wTGlua0xheWVyU3RhdHNJbmRDYWxsYmFjayhwTWFjLT5oSGRkLAorCQkJCQkgICAgIFdNQV9MSU5LX0xBWUVSX1NUQVRTX1JFU1VMVFNfUlNQLAorCQkJCQkgICAgIGxpbmtfc3RhdHNfcmVzdWx0cyk7CisJV01BX0xPR0QoIiVzOiBJZmFjZSBTdGF0cyBldmVudCBwb3N0ZWQgdG8gSEREIiwgX19mdW5jX18pOworCWNkZl9tZW1fZnJlZShsaW5rX3N0YXRzX3Jlc3VsdHMpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUyAqLworCisvKioKKyAqIHdtYV91cGRhdGVfcGRldl9zdGF0cygpIC0gdXBkYXRlIHBkZXYgc3RhdHMKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBwZGV2X3N0YXRzOiBwZGV2IHN0YXRzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHdtYV91cGRhdGVfcGRldl9zdGF0cyh0cF93bWFfaGFuZGxlIHdtYSwKKwkJCQkgIHdtaV9wZGV2X3N0YXRzICpwZGV2X3N0YXRzKQoreworCXRBbmlHZXRQRVN0YXRzUnNwICpzdGF0c19yc3BfcGFyYW1zOworCXVpbnQzMl90IHRlbXBfbWFzazsKKwl1aW50OF90ICpzdGF0c19idWY7CisJdENzckdsb2JhbENsYXNzQVN0YXRzSW5mbyAqY2xhc3NhX3N0YXRzID0gTlVMTDsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqbm9kZTsKKwl1aW50OF90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd21hLT5tYXhfYnNzaWQ7IGkrKykgeworCQlub2RlID0gJndtYS0+aW50ZXJmYWNlc1tpXTsKKwkJc3RhdHNfcnNwX3BhcmFtcyA9IG5vZGUtPnN0YXRzX3JzcDsKKwkJaWYgKHN0YXRzX3JzcF9wYXJhbXMpIHsKKwkJCW5vZGUtPmZ3X3N0YXRzX3NldCB8PSBGV19QREVWX1NUQVRTX1NFVDsKKwkJCVdNQV9MT0dEKCI8LS0tRlcgUERFViBTVEFUUyByZWNlaXZlZCBmb3IgdmRldklkOiVkIiwgaSk7CisJCQlzdGF0c19idWYgPSAodWludDhfdCAqKSAoc3RhdHNfcnNwX3BhcmFtcyArIDEpOworCQkJdGVtcF9tYXNrID0gc3RhdHNfcnNwX3BhcmFtcy0+c3RhdHNNYXNrOworCQkJaWYgKHRlbXBfbWFzayAmICgxIDw8IGVDc3JTdW1tYXJ5U3RhdHMpKQorCQkJCXN0YXRzX2J1ZiArPSBzaXplb2YodENzclN1bW1hcnlTdGF0c0luZm8pOworCisJCQlpZiAodGVtcF9tYXNrICYgKDEgPDwgZUNzckdsb2JhbENsYXNzQVN0YXRzKSkgeworCQkJCWNsYXNzYV9zdGF0cyA9CisJCQkJCSh0Q3NyR2xvYmFsQ2xhc3NBU3RhdHNJbmZvICopIHN0YXRzX2J1ZjsKKwkJCQljbGFzc2Ffc3RhdHMtPm1heF9wd3IgPSBwZGV2X3N0YXRzLT5jaGFuX3R4X3B3cjsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiB3bWFfdXBkYXRlX3ZkZXZfc3RhdHMoKSAtIHVwZGF0ZSB2ZGV2IHN0YXRzCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAdmRldl9zdGF0czogdmRldiBzdGF0cworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfdXBkYXRlX3ZkZXZfc3RhdHModHBfd21hX2hhbmRsZSB3bWEsCisJCQkJICB3bWlfdmRldl9zdGF0cyAqdmRldl9zdGF0cykKK3sKKwl0QW5pR2V0UEVTdGF0c1JzcCAqc3RhdHNfcnNwX3BhcmFtczsKKwl0Q3NyU3VtbWFyeVN0YXRzSW5mbyAqc3VtbWFyeV9zdGF0cyA9IE5VTEw7CisJdWludDhfdCAqc3RhdHNfYnVmOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICpub2RlOworCXVpbnQ4X3QgaTsKKwlpbnQ4X3QgcnNzaSA9IDA7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCXRBbmlHZXRSc3NpUmVxICpwR2V0UnNzaVJlcSA9ICh0QW5pR2V0UnNzaVJlcSAqKSB3bWEtPnBHZXRSc3NpUmVxOworCWNkc19tc2dfdCBzbWVfbXNnID0geyAwIH07CisKKwlub2RlID0gJndtYS0+aW50ZXJmYWNlc1t2ZGV2X3N0YXRzLT52ZGV2X2lkXTsKKwlzdGF0c19yc3BfcGFyYW1zID0gbm9kZS0+c3RhdHNfcnNwOworCWlmIChzdGF0c19yc3BfcGFyYW1zKSB7CisJCXN0YXRzX2J1ZiA9ICh1aW50OF90ICopIChzdGF0c19yc3BfcGFyYW1zICsgMSk7CisJCW5vZGUtPmZ3X3N0YXRzX3NldCB8PSBGV19WREVWX1NUQVRTX1NFVDsKKwkJV01BX0xPR0QoIjwtLS1GVyBWREVWIFNUQVRTIHJlY2VpdmVkIGZvciB2ZGV2SWQ6JWQiLAorCQkJIHZkZXZfc3RhdHMtPnZkZXZfaWQpOworCQlpZiAoc3RhdHNfcnNwX3BhcmFtcy0+c3RhdHNNYXNrICYgKDEgPDwgZUNzclN1bW1hcnlTdGF0cykpIHsKKwkJCXN1bW1hcnlfc3RhdHMgPSAodENzclN1bW1hcnlTdGF0c0luZm8gKikgc3RhdHNfYnVmOworCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCXN1bW1hcnlfc3RhdHMtPnR4X2ZybV9jbnRbaV0gPQorCQkJCQl2ZGV2X3N0YXRzLT50eF9mcm1fY250W2ldOworCQkJCXN1bW1hcnlfc3RhdHMtPmZhaWxfY250W2ldID0KKwkJCQkJdmRldl9zdGF0cy0+ZmFpbF9jbnRbaV07CisJCQkJc3VtbWFyeV9zdGF0cy0+bXVsdGlwbGVfcmV0cnlfY250W2ldID0KKwkJCQkJdmRldl9zdGF0cy0+bXVsdGlwbGVfcmV0cnlfY250W2ldOworCQkJfQorCisJCQlzdW1tYXJ5X3N0YXRzLT5yeF9mcm1fY250ID0gdmRldl9zdGF0cy0+cnhfZnJtX2NudDsKKwkJCXN1bW1hcnlfc3RhdHMtPnJ4X2Vycm9yX2NudCA9IHZkZXZfc3RhdHMtPnJ4X2Vycl9jbnQ7CisJCQlzdW1tYXJ5X3N0YXRzLT5yeF9kaXNjYXJkX2NudCA9CisJCQkJdmRldl9zdGF0cy0+cnhfZGlzY2FyZF9jbnQ7CisJCQlzdW1tYXJ5X3N0YXRzLT5hY2tfZmFpbF9jbnQgPSB2ZGV2X3N0YXRzLT5hY2tfZmFpbF9jbnQ7CisJCQlzdW1tYXJ5X3N0YXRzLT5ydHNfc3VjY19jbnQgPSB2ZGV2X3N0YXRzLT5ydHNfc3VjY19jbnQ7CisJCQlzdW1tYXJ5X3N0YXRzLT5ydHNfZmFpbF9jbnQgPSB2ZGV2X3N0YXRzLT5ydHNfZmFpbF9jbnQ7CisJCX0KKwl9CisKKwlXTUFfTE9HRCgidmRldiBpZCAlZCBiZWFuY29uIHNuciAlZCBkYXRhIHNuciAlZCIsCisJCSB2ZGV2X3N0YXRzLT52ZGV2X2lkLAorCQkgdmRldl9zdGF0cy0+dmRldl9zbnIuYmNuX3NuciwgdmRldl9zdGF0cy0+dmRldl9zbnIuZGF0X3Nucik7CisKKwlpZiAocEdldFJzc2lSZXEgJiYgcEdldFJzc2lSZXEtPnNlc3Npb25JZCA9PSB2ZGV2X3N0YXRzLT52ZGV2X2lkKSB7CisJCWlmICgodmRldl9zdGF0cy0+dmRldl9zbnIuYmNuX3NuciA9PSBXTUFfVEdUX0lOVkFMSURfU05SKSAmJgorCQkgICAgKHZkZXZfc3RhdHMtPnZkZXZfc25yLmRhdF9zbnIgPT0gV01BX1RHVF9JTlZBTElEX1NOUikpIHsKKwkJCS8qCisJCQkgKiBGaXJtd2FyZSBzZW5kcyBpbnZhbGlkIHNuciB0aWxsIGl0IHNlZXMKKwkJCSAqIEJlYWNvbi9EYXRhIGFmdGVyIGNvbm5lY3Rpb24gc2luY2UgYWZ0ZXIKKwkJCSAqIHZkZXYgdXAgZncgcmVzZXRzIHRoZSBzbnIgdG8gaW52YWxpZC4KKwkJCSAqIEluIHRoaXMgZHVhcnRpb24gSG9zdCB3aWxsIHJldHVybiB0aGUgbGFzdCBrbm93CisJCQkgKiByc3NpIGR1cmluZyBjb25uZWN0aW9uLgorCQkJICovCisJCQlXTUFfTE9HRSgiSW52YWxpZCBTTlIgZnJvbSBmaXJtd2FyZSIpOworCisJCX0gZWxzZSB7CisJCQlpZiAodmRldl9zdGF0cy0+dmRldl9zbnIuYmNuX3NuciAhPSBXTUFfVEdUX0lOVkFMSURfU05SKSB7CisJCQkJcnNzaSA9IHZkZXZfc3RhdHMtPnZkZXZfc25yLmJjbl9zbnI7CisJCQl9IGVsc2UgaWYgKHZkZXZfc3RhdHMtPnZkZXZfc25yLmRhdF9zbnIgIT0KKwkJCQkgICBXTUFfVEdUX0lOVkFMSURfU05SKSB7CisJCQkJcnNzaSA9IHZkZXZfc3RhdHMtPnZkZXZfc25yLmRhdF9zbnI7CisJCQl9CisKKwkJCS8qCisJCQkgKiBHZXQgdGhlIGFic29sdXRlIHJzc2kgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByc3NpIHZhbHVlCisJCQkgKiB0aGUgc2luciB2YWx1ZSBpcyBoYXJkY29kZWQgaW50byAwIGluIHRoZSBjb3JlIHN0YWNrCisJCQkgKi8KKwkJCXJzc2kgPSByc3NpICsgV01BX1RHVF9OT0lTRV9GTE9PUl9EQk07CisJCX0KKworCQlXTUFfTE9HRCgiQXZlcmFnZSBSc3NpID0gJWQsIHZkZXYgaWQ9ICVkIiwgcnNzaSwKKwkJCSBwR2V0UnNzaVJlcS0+c2Vzc2lvbklkKTsKKworCQkvKiB1cGRhdGUgdGhlIGF2ZXJhZ2UgcnNzaSB2YWx1ZSB0byBVTUFDIGxheWVyICovCisJCWlmIChOVUxMICE9IHBHZXRSc3NpUmVxLT5yc3NpQ2FsbGJhY2spIHsKKwkJCSgodENzclJzc2lDYWxsYmFjaykgKHBHZXRSc3NpUmVxLT5yc3NpQ2FsbGJhY2spKShyc3NpLAorCQkJCQkJcEdldFJzc2lSZXEtPnN0YUlkLAorCQkJCQkJcEdldFJzc2lSZXEtPnBEZXZDb250ZXh0KTsKKwkJfQorCisJCWNkZl9tZW1fZnJlZShwR2V0UnNzaVJlcSk7CisJCXdtYS0+cEdldFJzc2lSZXEgPSBOVUxMOworCX0KKworCWlmIChub2RlLT5wc25yX3JlcSkgeworCQl0QW5pR2V0U25yUmVxICpwX3Nucl9yZXEgPSBub2RlLT5wc25yX3JlcTsKKworCQlpZiAodmRldl9zdGF0cy0+dmRldl9zbnIuYmNuX3NuciAhPSBXTUFfVEdUX0lOVkFMSURfU05SKQorCQkJcF9zbnJfcmVxLT5zbnIgPSB2ZGV2X3N0YXRzLT52ZGV2X3Nuci5iY25fc25yOworCQllbHNlIGlmICh2ZGV2X3N0YXRzLT52ZGV2X3Nuci5kYXRfc25yICE9IFdNQV9UR1RfSU5WQUxJRF9TTlIpCisJCQlwX3Nucl9yZXEtPnNuciA9IHZkZXZfc3RhdHMtPnZkZXZfc25yLmRhdF9zbnI7CisJCWVsc2UKKwkJCXBfc25yX3JlcS0+c25yID0gV01BX1RHVF9JTlZBTElEX1NOUjsKKworCQlzbWVfbXNnLnR5cGUgPSBlV05JX1NNRV9TTlJfSU5EOworCQlzbWVfbXNnLmJvZHlwdHIgPSBwX3Nucl9yZXE7CisJCXNtZV9tc2cuYm9keXZhbCA9IDA7CisKKwkJY2RmX3N0YXR1cyA9IGNkc19tcV9wb3N0X21lc3NhZ2UoQ0RGX01PRFVMRV9JRF9TTUUsICZzbWVfbXNnKTsKKwkJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJCVdNQV9MT0dFKCIlczogRmFpbCB0byBwb3N0IHNuciBpbmQgbXNnIiwgX19mdW5jX18pOworCQkJY2RmX21lbV9mcmVlKHBfc25yX3JlcSk7CisJCX0KKworCQlub2RlLT5wc25yX3JlcSA9IE5VTEw7CisJfQorfQorCisvKioKKyAqIHdtYV9wb3N0X3N0YXRzKCkgLSB1cGRhdGUgc3RhdHMgdG8gUEUKKyAqIEB3bWE6IHdtYSBoYW5kbGUKKyAqIEBub2RlOiB0eHJ4IG5vZGUKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLworc3RhdGljIHZvaWQgd21hX3Bvc3Rfc3RhdHModHBfd21hX2hhbmRsZSB3bWEsIHN0cnVjdCB3bWFfdHhyeF9ub2RlICpub2RlKQoreworCXRBbmlHZXRQRVN0YXRzUnNwICpzdGF0c19yc3BfcGFyYW1zOworCisJc3RhdHNfcnNwX3BhcmFtcyA9IG5vZGUtPnN0YXRzX3JzcDsKKwkvKiBzZW5kIHJlc3BvbnNlIHRvIFVNQUMgKi8KKwl3bWFfc2VuZF9tc2cod21hLCBXTUFfR0VUX1NUQVRJU1RJQ1NfUlNQLCAodm9pZCAqKXN0YXRzX3JzcF9wYXJhbXMsIDApOworCW5vZGUtPnN0YXRzX3JzcCA9IE5VTEw7CisJbm9kZS0+Zndfc3RhdHNfc2V0ID0gMDsKK30KKworLyoqCisgKiB3bWFfdXBkYXRlX3BlZXJfc3RhdHMoKSAtIHVwZGF0ZSBwZWVyIHN0YXRzCisgKiBAd21hOiB3bWEgaGFuZGxlCisgKiBAcGVlcl9zdGF0czogcGVlciBzdGF0cworICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfdXBkYXRlX3BlZXJfc3RhdHModHBfd21hX2hhbmRsZSB3bWEsCisJCQkJICB3bWlfcGVlcl9zdGF0cyAqcGVlcl9zdGF0cykKK3sKKwl0QW5pR2V0UEVTdGF0c1JzcCAqc3RhdHNfcnNwX3BhcmFtczsKKwl0Q3NyR2xvYmFsQ2xhc3NBU3RhdHNJbmZvICpjbGFzc2Ffc3RhdHMgPSBOVUxMOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICpub2RlOworCXVpbnQ4X3QgKnN0YXRzX2J1ZiwgdmRldl9pZCwgbWFjYWRkcltJRUVFODAyMTFfQUREUl9MRU5dLCBtY3NSYXRlRmxhZ3M7CisJdWludDMyX3QgdGVtcF9tYXNrOworCisJV01JX01BQ19BRERSX1RPX0NIQVJfQVJSQVkoJnBlZXJfc3RhdHMtPnBlZXJfbWFjYWRkciwgJm1hY2FkZHJbMF0pOworCWlmICghd21hX2ZpbmRfdmRldl9ieV9ic3NpZCh3bWEsIG1hY2FkZHIsICZ2ZGV2X2lkKSkKKwkJcmV0dXJuOworCisJbm9kZSA9ICZ3bWEtPmludGVyZmFjZXNbdmRldl9pZF07CisJaWYgKG5vZGUtPnN0YXRzX3JzcCkgeworCQlub2RlLT5md19zdGF0c19zZXQgfD0gRldfUEVFUl9TVEFUU19TRVQ7CisJCVdNQV9MT0dEKCI8LS0gRlcgUEVFUiBTVEFUUyByZWNlaXZlZCBmb3IgdmRldklkOiVkIiwgdmRldl9pZCk7CisJCXN0YXRzX3JzcF9wYXJhbXMgPSAodEFuaUdldFBFU3RhdHNSc3AgKikgbm9kZS0+c3RhdHNfcnNwOworCQlzdGF0c19idWYgPSAodWludDhfdCAqKSAoc3RhdHNfcnNwX3BhcmFtcyArIDEpOworCQl0ZW1wX21hc2sgPSBzdGF0c19yc3BfcGFyYW1zLT5zdGF0c01hc2s7CisJCWlmICh0ZW1wX21hc2sgJiAoMSA8PCBlQ3NyU3VtbWFyeVN0YXRzKSkKKwkJCXN0YXRzX2J1ZiArPSBzaXplb2YodENzclN1bW1hcnlTdGF0c0luZm8pOworCisJCWlmICh0ZW1wX21hc2sgJiAoMSA8PCBlQ3NyR2xvYmFsQ2xhc3NBU3RhdHMpKSB7CisJCQljbGFzc2Ffc3RhdHMgPSAodENzckdsb2JhbENsYXNzQVN0YXRzSW5mbyAqKSBzdGF0c19idWY7CisJCQlXTUFfTE9HRCgicGVlciB0eCByYXRlOiVkIiwgcGVlcl9zdGF0cy0+cGVlcl90eF9yYXRlKTsKKwkJCS8qVGhlIGxpbmtzcGVlZCByZXR1cm5lZCBieSBmdyBpcyBpbiBrYnBzIHNvIGNvbnZlcnQKKwkJCSAqaXQgaW4gdG8gdW5pdHMgb2YgNTAwa2JwcyB3aGljaCBpcyBleHBlY3RlZCBieSBVTUFDKi8KKwkJCWlmIChwZWVyX3N0YXRzLT5wZWVyX3R4X3JhdGUpIHsKKwkJCQljbGFzc2Ffc3RhdHMtPnR4X3JhdGUgPQorCQkJCQlwZWVyX3N0YXRzLT5wZWVyX3R4X3JhdGUgLyA1MDA7CisJCQl9CisKKwkJCWNsYXNzYV9zdGF0cy0+dHhfcmF0ZV9mbGFncyA9IG5vZGUtPnJhdGVfZmxhZ3M7CisJCQlpZiAoIShub2RlLT5yYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX0xFR0FDWSkpIHsKKwkJCQljbGFzc2Ffc3RhdHMtPm1jc19pbmRleCA9CisJCQkJCXdtYV9nZXRfbWNzX2lkeCgocGVlcl9zdGF0cy0+cGVlcl90eF9yYXRlIC8KKwkJCQkJCQkgMTAwKSwgbm9kZS0+cmF0ZV9mbGFncywKKwkJCQkJCQlub2RlLT5uc3MsICZtY3NSYXRlRmxhZ3MpOworCQkJCS8qIHJ4X2ZyYWdfY250IGFuZCBwcm9taXNjdW91c19yeF9mcmFnX2NudAorCQkJCSAqIHBhcmFtZXRlciBpcyBjdXJyZW50bHkgbm90IHVzZWQuIGxldHMgdXNlIHRoZQorCQkJCSAqIHNhbWUgcGFyYW1ldGVyIHRvIGhvbGQgdGhlIG5zcyB2YWx1ZSBhbmQgbWNzCisJCQkJICogcmF0ZSBmbGFncyAqLworCQkJCWNsYXNzYV9zdGF0cy0+cnhfZnJhZ19jbnQgPSBub2RlLT5uc3M7CisJCQkJY2xhc3NhX3N0YXRzLT5wcm9taXNjdW91c19yeF9mcmFnX2NudCA9CisJCQkJCW1jc1JhdGVGbGFnczsKKwkJCQlXTUFfTE9HRCgiQ29tcHV0ZWQgbWNzX2lkeDolZCBtY3NfcmF0ZV9mbGFnczolZCIsCisJCQkJCWNsYXNzYV9zdGF0cy0+bWNzX2luZGV4LCBtY3NSYXRlRmxhZ3MpOworCQkJfQorCQkJLyogRlcgcmV0dXJucyB0eCBwb3dlciBpbiBpbnRlcnZhbHMgb2YgMC41IGRCbQorCQkJICAgQ29udmVydCBpdCBiYWNrIHRvIGludGVydmFscyBvZiAxIGRCbSAqLworCQkJY2xhc3NhX3N0YXRzLT5tYXhfcHdyID0KKwkJCQlyb3VuZHVwKGNsYXNzYV9zdGF0cy0+bWF4X3B3ciwgMikgPj4gMTsKKwkJCVdNQV9MT0dEKCJwZWVyIHR4IHJhdGUgZmxhZ3M6JWQgbnNzOiVkIG1heF90eHB3cjolZCIsCisJCQkJIG5vZGUtPnJhdGVfZmxhZ3MsIG5vZGUtPm5zcywKKwkJCQkgY2xhc3NhX3N0YXRzLT5tYXhfcHdyKTsKKwkJfQorCisJCWlmIChub2RlLT5md19zdGF0c19zZXQgJiBGV19TVEFUU19TRVQpIHsKKwkJCVdNQV9MT0dEKCI8LS1TVEFUUyBSU1AgVkRFVl9JRDolZCIsIHZkZXZfaWQpOworCQkJd21hX3Bvc3Rfc3RhdHMod21hLCBub2RlKTsKKwkJfQorCX0KK30KKworLyoqCisgKiB3bWFfcG9zdF9saW5rX3N0YXR1cygpIC0gcG9zdCBsaW5rIHN0YXR1cyB0byBTTUUKKyAqIEBwR2V0TGlua1N0YXR1czogU01FIExpbmsgc3RhdHVzCisgKiBAbGlua19zdGF0dXM6IExpbmsgc3RhdHVzCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3Bvc3RfbGlua19zdGF0dXModEFuaUdldExpbmtTdGF0dXMgKnBHZXRMaW5rU3RhdHVzLAorCQkJICB1aW50OF90IGxpbmtfc3RhdHVzKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwljZHNfbXNnX3Qgc21lX21zZyA9IHsgMCB9OworCisJcEdldExpbmtTdGF0dXMtPmxpbmtTdGF0dXMgPSBsaW5rX3N0YXR1czsKKwlzbWVfbXNnLnR5cGUgPSBlV05JX1NNRV9MSU5LX1NUQVRVU19JTkQ7CisJc21lX21zZy5ib2R5cHRyID0gcEdldExpbmtTdGF0dXM7CisJc21lX21zZy5ib2R5dmFsID0gMDsKKworCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfU01FLCAmc21lX21zZyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsIHRvIHBvc3QgbGluayBzdGF0dXMgaW5kIG1zZyIsIF9fZnVuY19fKTsKKwkJY2RmX21lbV9mcmVlKHBHZXRMaW5rU3RhdHVzKTsKKwl9Cit9CisKKy8qKgorICogd21hX2xpbmtfc3RhdHVzX2V2ZW50X2hhbmRsZXIoKSAtIGxpbmsgc3RhdHVzIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZGF0YSBmcm9tIGV2ZW50CisgKiBAbGVuOiBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX2xpbmtfc3RhdHVzX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpjbWRfcGFyYW1faW5mbywKKwkJCQkgIHVpbnQzMl90IGxlbikKK3sKKwl0cF93bWFfaGFuZGxlIHdtYSA9ICh0cF93bWFfaGFuZGxlKSBoYW5kbGU7CisJV01JX1VQREFURV9WREVWX1JBVEVfU1RBVFNfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX3ZkZXZfcmF0ZV9zdGF0c19ldmVudF9maXhlZF9wYXJhbSAqZXZlbnQ7CisJd21pX3ZkZXZfcmF0ZV9odF9pbmZvICpodF9pbmZvOworCXN0cnVjdCB3bWFfdHhyeF9ub2RlICppbnRyID0gd21hLT5pbnRlcmZhY2VzOworCXVpbnQ4X3QgbGlua19zdGF0dXMgPSBMSU5LX1NUQVRVU19MRUdBQ1k7CisJaW50IGk7CisKKwlwYXJhbV9idWYgPQorCSAgICAgIChXTUlfVVBEQVRFX1ZERVZfUkFURV9TVEFUU19FVkVOVElEX3BhcmFtX3RsdnMgKikgY21kX3BhcmFtX2luZm87CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0EoIiVzOiBJbnZhbGlkIHN0YXRzIGV2ZW50IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlldmVudCA9ICh3bWlfdmRldl9yYXRlX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtICopIHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJaHRfaW5mbyA9ICh3bWlfdmRldl9yYXRlX2h0X2luZm8gKikgcGFyYW1fYnVmLT5odF9pbmZvOworCisJV01BX0xPR0QoIm51bV92ZGV2X3N0YXRzOiAlZCIsIGV2ZW50LT5udW1fdmRldl9zdGF0cyk7CisJZm9yIChpID0gMDsgKGkgPCBldmVudC0+bnVtX3ZkZXZfc3RhdHMpICYmIGh0X2luZm87IGkrKykgeworCQlXTUFfTE9HRCgiJXMgdmRldklkOiVkICB0eF9uc3M6JWQgcnhfbnNzOiVkIHR4X3ByZWFtYmxlOiVkIHJ4X3ByZWFtYmxlOiVkIiwKKwkJCV9fZnVuY19fLCBodF9pbmZvLT52ZGV2aWQsIGh0X2luZm8tPnR4X25zcywKKwkJCWh0X2luZm8tPnJ4X25zcywgaHRfaW5mby0+dHhfcHJlYW1ibGUsCisJCQlodF9pbmZvLT5yeF9wcmVhbWJsZSk7CisJCWlmIChodF9pbmZvLT52ZGV2aWQgPCB3bWEtPm1heF9ic3NpZAorCQkgICAgJiYgaW50cltodF9pbmZvLT52ZGV2aWRdLnBsaW5rX3N0YXR1c19yZXEpIHsKKwkJCWlmIChodF9pbmZvLT50eF9uc3MgfHwgaHRfaW5mby0+cnhfbnNzKQorCQkJCWxpbmtfc3RhdHVzID0gTElOS19TVEFUVVNfTUlNTzsKKworCQkJaWYgKChodF9pbmZvLT50eF9wcmVhbWJsZSA9PSBMSU5LX1JBVEVfVkhUKSB8fAorCQkJICAgIChodF9pbmZvLT5yeF9wcmVhbWJsZSA9PSBMSU5LX1JBVEVfVkhUKSkKKwkJCQlsaW5rX3N0YXR1cyB8PSBMSU5LX1NUQVRVU19WSFQ7CisKKwkJCWlmIChpbnRyW2h0X2luZm8tPnZkZXZpZF0ubnNzID09IDIpCisJCQkJbGlua19zdGF0dXMgfD0gTElOS19TVVBQT1JUX01JTU87CisKKwkJCWlmIChpbnRyW2h0X2luZm8tPnZkZXZpZF0ucmF0ZV9mbGFncyAmCisJCQkJKGVIQUxfVFhfUkFURV9WSFQyMCB8IGVIQUxfVFhfUkFURV9WSFQ0MCB8CisJCQkJZUhBTF9UWF9SQVRFX1ZIVDgwKSkKKwkJCQlsaW5rX3N0YXR1cyB8PSBMSU5LX1NVUFBPUlRfVkhUOworCisJCQl3bWFfcG9zdF9saW5rX3N0YXR1cyhpbnRyW2h0X2luZm8tPnZkZXZpZF0ucGxpbmtfc3RhdHVzX3JlcSwKKwkJCQkJCQkgbGlua19zdGF0dXMpOworCQkJaW50cltodF9pbmZvLT52ZGV2aWRdLnBsaW5rX3N0YXR1c19yZXEgPSBOVUxMOworCQkJbGlua19zdGF0dXMgPSBMSU5LX1NUQVRVU19MRUdBQ1k7CisJCX0KKworCQlodF9pbmZvKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX3N0YXRzX2V2ZW50X2hhbmRsZXIoKSAtIHN0YXRzIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZGF0YSBmcm9tIGV2ZW50CisgKiBAbGVuOiBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX3N0YXRzX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpjbWRfcGFyYW1faW5mbywKKwkJCSAgICB1aW50MzJfdCBsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWEgPSAodHBfd21hX2hhbmRsZSkgaGFuZGxlOworCVdNSV9VUERBVEVfU1RBVFNfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtICpldmVudDsKKwl3bWlfcGRldl9zdGF0cyAqcGRldl9zdGF0czsKKwl3bWlfdmRldl9zdGF0cyAqdmRldl9zdGF0czsKKwl3bWlfcGVlcl9zdGF0cyAqcGVlcl9zdGF0czsKKwl1aW50OF90IGksICp0ZW1wOworCisKKwlwYXJhbV9idWYgPSAoV01JX1VQREFURV9TVEFUU19FVkVOVElEX3BhcmFtX3RsdnMgKikgY21kX3BhcmFtX2luZm87CisJaWYgKCFwYXJhbV9idWYpIHsKKwkJV01BX0xPR0EoIiVzOiBJbnZhbGlkIHN0YXRzIGV2ZW50IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXZlbnQgPSBwYXJhbV9idWYtPmZpeGVkX3BhcmFtOworCXRlbXAgPSAodWludDhfdCAqKSBwYXJhbV9idWYtPmRhdGE7CisKKwlXTUFfTE9HRCgiJXM6IG51bV9zdGF0czogcGRldjogJXUgdmRldjogJXUgcGVlciAldSIsCisJCSBfX2Z1bmNfXywgZXZlbnQtPm51bV9wZGV2X3N0YXRzLCBldmVudC0+bnVtX3ZkZXZfc3RhdHMsCisJCSBldmVudC0+bnVtX3BlZXJfc3RhdHMpOworCWlmIChldmVudC0+bnVtX3BkZXZfc3RhdHMgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBldmVudC0+bnVtX3BkZXZfc3RhdHM7IGkrKykgeworCQkJcGRldl9zdGF0cyA9ICh3bWlfcGRldl9zdGF0cyAqKSB0ZW1wOworCQkJd21hX3VwZGF0ZV9wZGV2X3N0YXRzKHdtYSwgcGRldl9zdGF0cyk7CisJCQl0ZW1wICs9IHNpemVvZih3bWlfcGRldl9zdGF0cyk7CisJCX0KKwl9CisKKwlpZiAoZXZlbnQtPm51bV92ZGV2X3N0YXRzID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZXZlbnQtPm51bV92ZGV2X3N0YXRzOyBpKyspIHsKKwkJCXZkZXZfc3RhdHMgPSAod21pX3ZkZXZfc3RhdHMgKikgdGVtcDsKKwkJCXdtYV91cGRhdGVfdmRldl9zdGF0cyh3bWEsIHZkZXZfc3RhdHMpOworCQkJdGVtcCArPSBzaXplb2Yod21pX3ZkZXZfc3RhdHMpOworCQl9CisJfQorCisJaWYgKGV2ZW50LT5udW1fcGVlcl9zdGF0cyA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGV2ZW50LT5udW1fcGVlcl9zdGF0czsgaSsrKSB7CisJCQlwZWVyX3N0YXRzID0gKHdtaV9wZWVyX3N0YXRzICopIHRlbXA7CisJCQl3bWFfdXBkYXRlX3BlZXJfc3RhdHMod21hLCBwZWVyX3N0YXRzKTsKKwkJCXRlbXAgKz0gc2l6ZW9mKHdtaV9wZWVyX3N0YXRzKTsKKwkJfQorCX0KKworCVdNQV9MT0dJKCIlczogRXhpdCIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bWFfc2VuZF9saW5rX3NwZWVkKCkgLSBzZW5kIGxpbmsgc3BlZWQgdG8gU01FCisgKiBAbGlua19zcGVlZDogbGluayBzcGVlZAorICoKKyAqIFJldHVybjogQ0RGX1NUQVRVU19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworQ0RGX1NUQVRVUyB3bWFfc2VuZF9saW5rX3NwZWVkKHVpbnQzMl90IGxpbmtfc3BlZWQpCit7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzID0gQ0RGX1NUQVRVU19TVUNDRVNTOworCWNkc19tc2dfdCBzbWVfbXNnID0geyAwIH07CisJdFNpckxpbmtTcGVlZEluZm8gKmxzX2luZCA9CisJCSh0U2lyTGlua1NwZWVkSW5mbyAqKSBjZGZfbWVtX21hbGxvYyhzaXplb2YodFNpckxpbmtTcGVlZEluZm8pKTsKKwlpZiAoIWxzX2luZCkgeworCQlXTUFfTE9HRSgiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4iLCBfX2Z1bmNfXyk7CisJCWNkZl9zdGF0dXMgPSBDREZfU1RBVFVTX0VfTk9NRU07CisJfSBlbHNlIHsKKwkJbHNfaW5kLT5lc3RMaW5rU3BlZWQgPSBsaW5rX3NwZWVkOworCQlzbWVfbXNnLnR5cGUgPSBlV05JX1NNRV9MSU5LX1NQRUVEX0lORDsKKwkJc21lX21zZy5ib2R5cHRyID0gbHNfaW5kOworCQlzbWVfbXNnLmJvZHl2YWwgPSAwOworCisJCWNkZl9zdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENERl9NT0RVTEVfSURfU01FLCAmc21lX21zZyk7CisJCWlmICghQ0RGX0lTX1NUQVRVU19TVUNDRVNTKGNkZl9zdGF0dXMpKSB7CisJCQlXTUFfTE9HRSgiJXM6IEZhaWwgdG8gcG9zdCBsaW5rc3BlZWQgaW5kICBtc2ciLAorCQkJCSBfX2Z1bmNfXyk7CisJCQljZGZfbWVtX2ZyZWUobHNfaW5kKTsKKwkJfQorCX0KKwlyZXR1cm4gY2RmX3N0YXR1czsKK30KKworLyoqCisgKiB3bWFfbGlua19zcGVlZF9ldmVudF9oYW5kbGVyKCkgLSBsaW5rIHNwZWVkIGV2ZW50IGhhbmRsZXIKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEBjbWRfcGFyYW1faW5mbzogZXZlbnQgZGF0YQorICogQGxlbjogbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV9saW5rX3NwZWVkX2V2ZW50X2hhbmRsZXIodm9pZCAqaGFuZGxlLCB1aW50OF90ICpjbWRfcGFyYW1faW5mbywKKwkJCQkgdWludDMyX3QgbGVuKQoreworCVdNSV9QRUVSX0VTVElNQVRFRF9MSU5LU1BFRURfRVZFTlRJRF9wYXJhbV90bHZzICpwYXJhbV9idWY7CisJd21pX3BlZXJfZXN0aW1hdGVkX2xpbmtzcGVlZF9ldmVudF9maXhlZF9wYXJhbSAqZXZlbnQ7CisJQ0RGX1NUQVRVUyBjZGZfc3RhdHVzOworCisJcGFyYW1fYnVmID0KKwkJKFdNSV9QRUVSX0VTVElNQVRFRF9MSU5LU1BFRURfRVZFTlRJRF9wYXJhbV90bHZzICopIGNtZF9wYXJhbV9pbmZvOworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBsaW5rc3BlZWQgZXZlbnQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlldmVudCA9IHBhcmFtX2J1Zi0+Zml4ZWRfcGFyYW07CisJY2RmX3N0YXR1cyA9IHdtYV9zZW5kX2xpbmtfc3BlZWQoZXZlbnQtPmVzdF9saW5rc3BlZWRfa2Jwcyk7CisJaWYgKCFDREZfSVNfU1RBVFVTX1NVQ0NFU1MoY2RmX3N0YXR1cykpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHdtYV93bmlfY2ZnX2RubGQoKSAtIGNmZyBkb3dubG9hZCByZXF1ZXN0CisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitDREZfU1RBVFVTIHdtYV93bmlfY2ZnX2RubGQodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCUNERl9TVEFUVVMgY2RmX3N0YXR1cyA9IENERl9TVEFUVVNfU1VDQ0VTUzsKKwl2b2lkICptYWMgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9QRSk7CisKKwlXTUFfTE9HRCgiJXM6IEVudGVyIiwgX19mdW5jX18pOworCisJaWYgKE5VTEwgPT0gbWFjKSB7CisJCVdNQV9MT0dQKCIlczogSW52YWxpZCBjb250ZXh0IiwgX19mdW5jX18pOworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCisJcHJvY2Vzc19jZmdfZG93bmxvYWRfcmVxKG1hYyk7CisKKwlXTUFfTE9HRCgiJXM6IEV4aXQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIGNkZl9zdGF0dXM7Cit9CisKKy8qKgorICogd21hX3VuaWZpZWRfZGVidWdfcHJpbnRfZXZlbnRfaGFuZGxlcigpIC0gZGVidWcgcHJpbnQgZXZlbnQgaGFuZGxlcgorICogQGhhbmRsZTogd21hIGhhbmRsZQorICogQGRhdGFwOiBkYXRhIHBvaW50ZXIKKyAqIEBsZW46IGxlbmd0aAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2ludCB3bWFfdW5pZmllZF9kZWJ1Z19wcmludF9ldmVudF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgdWludDhfdCAqZGF0YXAsCisJCQkJCSAgdWludDMyX3QgbGVuKQoreworCVdNSV9ERUJVR19QUklOVF9FVkVOVElEX3BhcmFtX3RsdnMgKnBhcmFtX2J1ZjsKKwl1aW50OF90ICpkYXRhOworCXVpbnQzMl90IGRhdGFsZW47CisKKwlwYXJhbV9idWYgPSAoV01JX0RFQlVHX1BSSU5UX0VWRU5USURfcGFyYW1fdGx2cyAqKSBkYXRhcDsKKwlpZiAoIXBhcmFtX2J1ZikgeworCQlXTUFfTE9HRSgiR2V0IE5VTEwgcG9pbnQgbWVzc2FnZSBmcm9tIEZXIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkYXRhID0gcGFyYW1fYnVmLT5kYXRhOworCWRhdGFsZW4gPSBwYXJhbV9idWYtPm51bV9kYXRhOworCisjaWZkZWYgQklHX0VORElBTl9IT1NUCisJeworCQljaGFyIGRiZ2J1Zls1MDBdID0geyAwIH07CisJCW1lbWNweShkYmdidWYsIGRhdGEsIGRhdGFsZW4pOworCQlTV0FQTUUoZGJnYnVmLCBkYXRhbGVuKTsKKwkJV01BX0xPR0QoIkZJUk1XQVJFOiVzIiwgZGJnYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorI2Vsc2UKKwlXTUFfTE9HRCgiRklSTVdBUkU6JXMiLCBkYXRhKTsKKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBCSUdfRU5ESUFOX0hPU1QgKi8KK30KKworLyoqCisgKiB3bWFfY2hlY2tfc2Nhbl9pbl9wcm9ncmVzcygpIC0gY2hlY2sgc2NhbiBpcyBwcm9ncmVzcyBvciBub3QKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IHRydWUvZmFsc2UKKyAqLworYm9vbCB3bWFfY2hlY2tfc2Nhbl9pbl9wcm9ncmVzcyhXTUFfSEFORExFIGhhbmRsZSkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUgPSBoYW5kbGU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd21hX2hhbmRsZS0+bWF4X2Jzc2lkOyBpKyspIHsKKwkJaWYgKHdtYV9oYW5kbGUtPmludGVyZmFjZXNbaV0uc2Nhbl9pbmZvLnNjYW5faWQpIHsKKworCQkJV01BX0xPR0UoIiVzOiBzY2FuIGluIHByb2dyZXNzIG9uIGludGVyZmFjZVslZF0sc2NhbmlkID0gJWQiLAorCQkJCV9fZnVuY19fLCBpLAorCQkJCXdtYV9oYW5kbGUtPmludGVyZmFjZXNbaV0uc2Nhbl9pbmZvLnNjYW5faWQpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIHdtYV9pc19zYXBfYWN0aXZlKCkgLSBjaGVjayBzYXAgaXMgYWN0aXZlIG9yIG5vdAorICogQGhhbmRsZTogd21hIGhhbmRsZQorICoKKyAqIFJldHVybjogdHJ1ZS9mYWxzZQorICovCitib29sIHdtYV9pc19zYXBfYWN0aXZlKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB3bWFfaGFuZGxlLT5tYXhfYnNzaWQ7IGkrKykgeworCQlpZiAoIXdtYV9oYW5kbGUtPmludGVyZmFjZXNbaV0udmRldl91cCkKKwkJCWNvbnRpbnVlOworCQlpZiAod21hX2hhbmRsZS0+aW50ZXJmYWNlc1tpXS50eXBlID09IFdNSV9WREVWX1RZUEVfQVAgJiYKKwkJICAgIHdtYV9oYW5kbGUtPmludGVyZmFjZXNbaV0uc3ViX3R5cGUgPT0gMCkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogd21hX2lzX3AycF9nb19hY3RpdmUoKSAtIGNoZWNrIHAycCBnbyBpcyBhY3RpdmUgb3Igbm90CisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKgorICogUmV0dXJuOiB0cnVlL2ZhbHNlCisgKi8KK2Jvb2wgd21hX2lzX3AycF9nb19hY3RpdmUodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHdtYV9oYW5kbGUtPm1heF9ic3NpZDsgaSsrKSB7CisJCWlmICghd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tpXS52ZGV2X3VwKQorCQkJY29udGludWU7CisJCWlmICh3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW2ldLnR5cGUgPT0gV01JX1ZERVZfVFlQRV9BUCAmJgorCQkgICAgd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tpXS5zdWJfdHlwZSA9PQorCQkgICAgV01JX1VOSUZJRURfVkRFVl9TVUJUWVBFX1AyUF9HTykKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogd21hX2lzX3AycF9jbGlfYWN0aXZlKCkgLSBjaGVjayBwMnAgY2xpIGlzIGFjdGl2ZSBvciBub3QKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IHRydWUvZmFsc2UKKyAqLworYm9vbCB3bWFfaXNfcDJwX2NsaV9hY3RpdmUodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHdtYV9oYW5kbGUtPm1heF9ic3NpZDsgaSsrKSB7CisJCWlmICghd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tpXS52ZGV2X3VwKQorCQkJY29udGludWU7CisJCWlmICh3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW2ldLnR5cGUgPT0gV01JX1ZERVZfVFlQRV9TVEEgJiYKKwkJICAgIHdtYV9oYW5kbGUtPmludGVyZmFjZXNbaV0uc3ViX3R5cGUgPT0KKwkJICAgIFdNSV9VTklGSUVEX1ZERVZfU1VCVFlQRV9QMlBfQ0xJRU5UKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB3bWFfaXNfc3RhX2FjdGl2ZSgpIC0gY2hlY2sgc3RhIGlzIGFjdGl2ZSBvciBub3QKKyAqIEBoYW5kbGU6IHdtYSBoYW5kbGUKKyAqCisgKiBSZXR1cm46IHRydWUvZmFsc2UKKyAqLworYm9vbCB3bWFfaXNfc3RhX2FjdGl2ZSh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd21hX2hhbmRsZS0+bWF4X2Jzc2lkOyBpKyspIHsKKwkJaWYgKCF3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW2ldLnZkZXZfdXApCisJCQljb250aW51ZTsKKwkJaWYgKHdtYV9oYW5kbGUtPmludGVyZmFjZXNbaV0udHlwZSA9PSBXTUlfVkRFVl9UWVBFX1NUQSAmJgorCQkgICAgd21hX2hhbmRsZS0+aW50ZXJmYWNlc1tpXS5zdWJfdHlwZSA9PSAwKQorCQkJcmV0dXJuIHRydWU7CisJCWlmICh3bWFfaGFuZGxlLT5pbnRlcmZhY2VzW2ldLnR5cGUgPT0gV01JX1ZERVZfVFlQRV9JQlNTKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB3bWFfcGVlcl9waHltb2RlKCkgLSBnZXQgcGh5bW9kZQorICogQG53X3R5cGU6IG53IHR5cGUKKyAqIEBzdGFfdHlwZTogc3RhIHR5cGUKKyAqIEBpc19odDogaXMgaHQgc3VwcG9ydGVkCisgKiBAaXNfY3c0MDogaXMgY2hhbm5lbCB3aWR0aCA0MCBzdXBwb3J0ZWQKKyAqIEBpc192aHQ6IGlzIHZodCBzdXBwb3J0ZWQKKyAqIEBpc19jd192aHQ6IGlzIGNoYW5uZWwgd2lkdGggODAgc3VwcG9ydGVkCisgKgorICogUmV0dXJuOiBXTEFOX1BIWV9NT0RFCisgKi8KK1dMQU5fUEhZX01PREUgd21hX3BlZXJfcGh5bW9kZSh0U2lyTndUeXBlIG53X3R5cGUsIHVpbnQ4X3Qgc3RhX3R5cGUsCisJCQkgICAgICAgdWludDhfdCBpc19odCwgdWludDhfdCBjaF93aWR0aCwKKwkJCSAgICAgICB1aW50OF90IGlzX3ZodCkKK3sKKwlXTEFOX1BIWV9NT0RFIHBoeW1vZGUgPSBNT0RFX1VOS05PV047CisKKwlzd2l0Y2ggKG53X3R5cGUpIHsKKwljYXNlIGVTSVJfMTFCX05XX1RZUEU6CisJCXBoeW1vZGUgPSBNT0RFXzExQjsKKwkJaWYgKGlzX2h0IHx8IGlzX3ZodCkKKwkJCVdNQV9MT0dFKCJIVC9WSFQgaXMgZW5hYmxlZCB3aXRoIDExQiBOVyB0eXBlIik7CisJCWJyZWFrOworCWNhc2UgZVNJUl8xMUdfTldfVFlQRToKKwkJaWYgKCEoaXNfaHQgfHwgaXNfdmh0KSkgeworCQkJcGh5bW9kZSA9IE1PREVfMTFHOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKENIX1dJRFRIXzQwTUhaIDwgY2hfd2lkdGgpCisJCQlXTUFfTE9HRSgiODAvMTYwIE1IeiBCVyBzZW50IGluIDExRywgY29uZmlndXJlZCA0ME1IeiIpOworCQlpZiAoY2hfd2lkdGgpCisJCQlwaHltb2RlID0gKGlzX3ZodCkgPworCQkJCU1PREVfMTFBQ19WSFQ0MCA6IE1PREVfMTFOR19IVDQwOworCQllbHNlCisJCQlwaHltb2RlID0gKGlzX3ZodCkgPworCQkJCU1PREVfMTFBQ19WSFQyMCA6IE1PREVfMTFOR19IVDIwOworCQlicmVhazsKKwljYXNlIGVTSVJfMTFBX05XX1RZUEU6CisJCWlmICghKGlzX2h0IHx8IGlzX3ZodCkpIHsKKwkJCXBoeW1vZGUgPSBNT0RFXzExQTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpc192aHQpIHsKKyNpZiBDT05GSUdfMTYwTUhaX1NVUFBPUlQgIT0gMAorCQkJaWYgKGNoX3dpZHRoID09IENIX1dJRFRIXzE2ME1IWikKKwkJCQlwaHltb2RlID0gTU9ERV8xMUFDX1ZIVDE2MDsKKwkJCWVsc2UgaWYgKGNoX3dpZHRoID09IENIX1dJRFRIXzgwUDgwTUhaKQorCQkJCXBoeW1vZGUgPSBNT0RFXzExQUNfVkhUODBfODA7CisJCQllbHNlCisjZW5kaWYKKwkJCWlmIChjaF93aWR0aCA9PSBDSF9XSURUSF84ME1IWikKKwkJCQlwaHltb2RlID0gTU9ERV8xMUFDX1ZIVDgwOworCQkJZWxzZQorCQkJCXBoeW1vZGUgPSAoY2hfd2lkdGgpID8KKwkJCQkJICBNT0RFXzExQUNfVkhUNDAgOiBNT0RFXzExQUNfVkhUMjA7CisJCX0gZWxzZQorCQkJcGh5bW9kZSA9IChjaF93aWR0aCkgPyBNT0RFXzExTkFfSFQ0MCA6IE1PREVfMTFOQV9IVDIwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXTUFfTE9HUCgiJXM6IEludmFsaWQgbncgdHlwZSAlZCIsIF9fZnVuY19fLCBud190eXBlKTsKKwkJYnJlYWs7CisJfQorCVdNQV9MT0dEKCIlczogbndfdHlwZSAlZCBpc19odCAlZCBjaF93aWR0aCAlZCBpc192aHQgJWQgcGh5bW9kZSAlZCIsCisJCSAgX19mdW5jX18sIG53X3R5cGUsIGlzX2h0LCBjaF93aWR0aCwgaXNfdmh0LCBwaHltb2RlKTsKKworCXJldHVybiBwaHltb2RlOworfQorCisvKioKKyAqIHdtYV90eHJ4X2Z3X3N0YXRzX3Jlc2V0KCkgLSByZXNldCB0eHJ4IGZ3IHN0YXRpc3RpY3MKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHZhbHVlOiB2YWx1ZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciByZXR1cm4gZXJyb3IKKyAqLworaW50MzJfdCB3bWFfdHhyeF9md19zdGF0c19yZXNldCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQkJdWludDhfdCB2ZGV2X2lkLCB1aW50MzJfdCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgb2xfdHhyeF9zdGF0c19yZXEgcmVxOworCW9sX3R4cnhfdmRldl9oYW5kbGUgdmRldjsKKworCXZkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2lkKHdtYV9oYW5kbGUsIHZkZXZfaWQpOworCWlmICghdmRldikgeworCQlXTUFfTE9HRSgiJXM6SW52YWxpZCB2ZGV2IGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNkZl9tZW1femVybygmcmVxLCBzaXplb2YocmVxKSk7CisJcmVxLnN0YXRzX3R5cGVfcmVzZXRfbWFzayA9IHZhbHVlOworCW9sX3R4cnhfZndfc3RhdHNfZ2V0KHZkZXYsICZyZXEpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBIRUxJVU1QTFVTCisjZGVmaW5lIFNFVF9VUExPQURfTUFTSyhfbWFzaywgX3JhdGVfaW5mbykgCVwKKwkoKF9tYXNrKSA9IDEgPDwgKF9yYXRlX2luZm8gIyMgX1YyKSkKKyNlbHNlICAvKiAhSEVMSVVNUExVUyAqLworI2RlZmluZSBTRVRfVVBMT0FEX01BU0soX21hc2ssIF9yYXRlX2luZm8pIAlcCisJKChfbWFzaykgPSAxIDw8IChfcmF0ZV9pbmZvKSkKKyNlbmRpZgorCisvKioKKyAqIHdtYV9zZXRfdHhyeF9md19zdGF0c19sZXZlbCgpIC0gc2V0IHR4cnggZncgc3RhdHMgbGV2ZWwKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAdmRldl9pZDogdmRldiBpZAorICogQHZhbHVlOiB2YWx1ZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciByZXR1cm4gZXJyb3IKKyAqLworaW50MzJfdCB3bWFfc2V0X3R4cnhfZndfc3RhdHNfbGV2ZWwodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLAorCQkJCSAgICB1aW50OF90IHZkZXZfaWQsIHVpbnQzMl90IHZhbHVlKQoreworCXN0cnVjdCBvbF90eHJ4X3N0YXRzX3JlcSByZXE7CisJb2xfdHhyeF92ZGV2X2hhbmRsZSB2ZGV2OworCXVpbnQzMl90IGxfdXBfbWFzazsKKworCXZkZXYgPSB3bWFfZmluZF92ZGV2X2J5X2lkKHdtYV9oYW5kbGUsIHZkZXZfaWQpOworCWlmICghdmRldikgeworCQlXTUFfTE9HRSgiJXM6SW52YWxpZCB2ZGV2IGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNkZl9tZW1femVybygmcmVxLCBzaXplb2YocmVxKSk7CisJcmVxLnByaW50LnZlcmJvc2UgPSAxOworCisJc3dpdGNoICh2YWx1ZSkgeworCS8qIHR4cnhfZndfc3RhdHMgMSAqLworCWNhc2UgV01BX0ZXX1BIWV9TVEFUUzoKKwkJbF91cF9tYXNrID0gMSA8PCBIVFRfREJHX1NUQVRTX1dBTF9QREVWX1RYUlg7CisJCWJyZWFrOworCisJLyogdHhyeF9md19zdGF0cyAyICovCisJY2FzZSBXTUFfRldfUlhfUkVPUkRFUl9TVEFUUzoKKwkJbF91cF9tYXNrID0gMSA8PCBIVFRfREJHX1NUQVRTX1JYX1JFT1JERVI7CisJCWJyZWFrOworCisJLyogdHhyeF9md19zdGF0cyAzICovCisJY2FzZSBXTUFfRldfUlhfUkNfU1RBVFM6CisJCVNFVF9VUExPQURfTUFTSyhsX3VwX21hc2ssIEhUVF9EQkdfU1RBVFNfUlhfUkFURV9JTkZPKTsKKwkJYnJlYWs7CisKKwkvKiB0eHJ4X2Z3X3N0YXRzIDUgKi8KKwljYXNlIFdNQV9GV19UWF9DT05DSVNFX1NUQVRTOgorCQlyZXEucHJpbnQuY29uY2lzZSA9IDE7CisJCS8qIE5vIGJyZWFrIGhlcmUsIHNpbmNlIGxfdXBfbWFzayBpcyBzYW1lIGZvcgorCQkgKiBib3RoIFdNQV9GV19UWF9DT05DSVNFX1NUQVRTICYgV01BX0ZXX1RYX1BQRFVfU1RBVFMgKi8KKworCS8qIHR4cnhfZndfc3RhdHMgNCAqLworCWNhc2UgV01BX0ZXX1RYX1BQRFVfU1RBVFM6CisJCWxfdXBfbWFzayA9IDEgPDwgSFRUX0RCR19TVEFUU19UWF9QUERVX0xPRzsKKwkJYnJlYWs7CisKKwkvKiB0eHJ4X2Z3X3N0YXRzIDYgKi8KKwljYXNlIFdNQV9GV19UWF9SQ19TVEFUUzoKKwkJU0VUX1VQTE9BRF9NQVNLKGxfdXBfbWFzaywgSFRUX0RCR19TVEFUU19UWF9SQVRFX0lORk8pOworCQlicmVhazsKKworCS8qIHR4cnhfZndfc3RhdHMgMTIgKi8KKwkvKgorCSAqIFRoaXMgaXMgMToxIGNvcnJlc3BvbmRlbmNlIHdpdGggV01BIGRlZmluZWQgdmFsdWUKKwkgKiBhbmQgdGhlIGYvdyBiaXRtYXNrLgorCSAqLworCWNhc2UgV01BX0ZXX1JYX1JFTV9SSU5HX0JVRjoKKwkJbF91cF9tYXNrID0gMSA8PCBIVFRfREJHX1NUQVRTX1JYX1JFTU9URV9SSU5HX0JVRkZFUl9JTkZPOworCQlicmVhazsKKworCS8qIHR4cnhfZndfc3RhdHMgNyAqLworCWNhc2UgV01BX0ZXX1RYQkZfSU5GT19TVEFUUzoKKwkJbF91cF9tYXNrID0gMSA8PCBIVFRfREJHX1NUQVRTX1RYQkZfSU5GTzsKKwkJYnJlYWs7CisKKwkvKiB0eHJ4X2Z3X3N0YXRzIDggKi8KKwljYXNlIFdNQV9GV19TTkRfSU5GT19TVEFUUzoKKwkJbF91cF9tYXNrID0gMSA8PCBIVFRfREJHX1NUQVRTX1NORF9JTkZPOworCQlicmVhazsKKworCS8qIHR4cnhfZndfc3RhdHMgOSAqLworCWNhc2UgV01BX0ZXX0VSUk9SX0lORk9fU1RBVFM6CisJCWxfdXBfbWFzayA9IDEgPDwgSFRUX0RCR19TVEFUU19FUlJPUl9JTkZPOworCQlicmVhazsKKworCS8qIHR4cnhfZndfc3RhdHMgMTAgKi8KKwljYXNlIFdNQV9GV19UWF9TRUxGR0VOX0lORk9fU1RBVFM6CisJCWxfdXBfbWFzayA9IDEgPDwgSFRUX0RCR19TVEFUU19UWF9TRUxGR0VOX0lORk87CisJCWJyZWFrOworCisJLyogdHhyeF9md19zdGF0cyAxNSAqLworCS8qCisJICogVGhpcyBpcyAxOjEgY29ycmVzcG9uZGVuY2Ugd2l0aCBXTUEgZGVmaW5lZCB2YWx1ZQorCSAqIGFuZCB0aGUgZi93IGJpdG1hc2suCisJICovCisJY2FzZSBXTUFfRldfUlhfVFhCRl9NVVNVX05EUEE6CisJCWxfdXBfbWFzayA9IDEgPDwgSFRUX0RCR19TVEFUU19UWEJGX01VU1VfTkRQQV9QS1Q7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJY2RmX3ByaW50KCIlcyAlZCBJbnZhbGlkIHZhbHVlICVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmVxLnN0YXRzX3R5cGVfdXBsb2FkX21hc2sgPSBsX3VwX21hc2s7CisKKwlvbF90eHJ4X2Z3X3N0YXRzX2dldCh2ZGV2LCAmcmVxKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdtaV9jcmFzaF9pbmplY3QoKSAtIGluamVjdCBmdyBjcmFzaAorICogQHdtYV9oYW5kbGU6IHdtYSBoYW5kbGUKKyAqIEB0eXBlOiB0eXBlCisgKiBAZGVsYXlfdGltZV9tczogZGVsYXkgdGltZSBpbiBtcworICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciByZXR1cm4gZXJyb3IKKyAqLworaW50IHdtaV9jcmFzaF9pbmplY3Qod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCB1aW50MzJfdCB0eXBlLAorCQkgICAgIHVpbnQzMl90IGRlbGF5X3RpbWVfbXMpCit7CisJaW50IHJldCA9IDA7CisJV01JX0ZPUkNFX0ZXX0hBTkdfQ01EX2ZpeGVkX3BhcmFtICpjbWQ7CisJdWludDE2X3QgbGVuID0gc2l6ZW9mKCpjbWQpOworCXdtaV9idWZfdCBidWY7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiB3bWlfYnVmX2FsbG9jIGZhaWxlZCEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNtZCA9IChXTUlfRk9SQ0VfRldfSEFOR19DTURfZml4ZWRfcGFyYW0gKikgd21pX2J1Zl9kYXRhKGJ1Zik7CisJV01JVExWX1NFVF9IRFIoJmNtZC0+dGx2X2hlYWRlciwKKwkJICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfV01JX0ZPUkNFX0ZXX0hBTkdfQ01EX2ZpeGVkX3BhcmFtLAorCQkgICAgICAgV01JVExWX0dFVF9TVFJVQ1RfVExWTEVOCisJCQkgICAgICAgKFdNSV9GT1JDRV9GV19IQU5HX0NNRF9maXhlZF9wYXJhbSkpOworCWNtZC0+dHlwZSA9IHR5cGU7CisJY21kLT5kZWxheV90aW1lX21zID0gZGVsYXlfdGltZV9tczsKKworCXJldCA9IHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtaV9oYW5kbGUsIGJ1ZiwgbGVuLCBXTUlfRk9SQ0VfRldfSEFOR19DTURJRCk7CisJaWYgKHJldCA8IDApIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gc2VuZCBzZXQgcGFyYW0gY29tbWFuZCwgcmV0ID0gJWQiLAorCQkJIF9fZnVuY19fLCByZXQpOworCQl3bWlfYnVmX2ZyZWUoYnVmKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtYV9nZXRfc3RhdHNfcnNwX2J1ZigpIC0gZmlsbCBnZXQgc3RhdHMgcmVzcG9uc2UgYnVmZmVyCisgKiBAZ2V0X3N0YXRzX3BhcmFtOiBnZXQgc3RhdHMgcGFyYW1ldGVycworICoKKyAqIFJldHVybjogc3RhdHMgcmVzcG9uc2UgYnVmZmVyCisgKi8KK3N0YXRpYyB0QW5pR2V0UEVTdGF0c1JzcCAqd21hX2dldF9zdGF0c19yc3BfYnVmCisJCQkodEFuaUdldFBFU3RhdHNSZXEgKmdldF9zdGF0c19wYXJhbSkKK3sKKwl0QW5pR2V0UEVTdGF0c1JzcCAqc3RhdHNfcnNwX3BhcmFtczsKKwl1aW50MzJfdCBsZW4sIHRlbXBfbWFzaywgY291bnRlciA9IDA7CisKKwlsZW4gPSBzaXplb2YodEFuaUdldFBFU3RhdHNSc3ApOworCXRlbXBfbWFzayA9IGdldF9zdGF0c19wYXJhbS0+c3RhdHNNYXNrOworCisJd2hpbGUgKHRlbXBfbWFzaykgeworCQlpZiAodGVtcF9tYXNrICYgMSkgeworCQkJc3dpdGNoIChjb3VudGVyKSB7CisJCQljYXNlIGVDc3JTdW1tYXJ5U3RhdHM6CisJCQkJbGVuICs9IHNpemVvZih0Q3NyU3VtbWFyeVN0YXRzSW5mbyk7CisJCQkJYnJlYWs7CisJCQljYXNlIGVDc3JHbG9iYWxDbGFzc0FTdGF0czoKKwkJCQlsZW4gKz0gc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0FTdGF0c0luZm8pOworCQkJCWJyZWFrOworCQkJY2FzZSBlQ3NyR2xvYmFsQ2xhc3NCU3RhdHM6CisJCQkJbGVuICs9IHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NCU3RhdHNJbmZvKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgZUNzckdsb2JhbENsYXNzQ1N0YXRzOgorCQkJCWxlbiArPSBzaXplb2YodENzckdsb2JhbENsYXNzQ1N0YXRzSW5mbyk7CisJCQkJYnJlYWs7CisJCQljYXNlIGVDc3JHbG9iYWxDbGFzc0RTdGF0czoKKwkJCQlsZW4gKz0gc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0RTdGF0c0luZm8pOworCQkJCWJyZWFrOworCQkJY2FzZSBlQ3NyUGVyU3RhU3RhdHM6CisJCQkJbGVuICs9IHNpemVvZih0Q3NyUGVyU3RhU3RhdHNJbmZvKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWNvdW50ZXIrKzsKKwkJdGVtcF9tYXNrID4+PSAxOworCX0KKworCXN0YXRzX3JzcF9wYXJhbXMgPSAodEFuaUdldFBFU3RhdHNSc3AgKikgY2RmX21lbV9tYWxsb2MobGVuKTsKKwlpZiAoIXN0YXRzX3JzcF9wYXJhbXMpIHsKKwkJV01BX0xPR0UoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgdEFuaUdldFBFU3RhdHNSc3AiKTsKKwkJQ0RGX0FTU0VSVCgwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2RmX21lbV96ZXJvKHN0YXRzX3JzcF9wYXJhbXMsIGxlbik7CisJc3RhdHNfcnNwX3BhcmFtcy0+c3RhSWQgPSBnZXRfc3RhdHNfcGFyYW0tPnN0YUlkOworCXN0YXRzX3JzcF9wYXJhbXMtPnN0YXRzTWFzayA9IGdldF9zdGF0c19wYXJhbS0+c3RhdHNNYXNrOworCXN0YXRzX3JzcF9wYXJhbXMtPm1zZ1R5cGUgPSBXTUFfR0VUX1NUQVRJU1RJQ1NfUlNQOworCXN0YXRzX3JzcF9wYXJhbXMtPm1zZ0xlbiA9IGxlbiAtIHNpemVvZih0QW5pR2V0UEVTdGF0c1JzcCk7CisJc3RhdHNfcnNwX3BhcmFtcy0+cmMgPSBDREZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIHN0YXRzX3JzcF9wYXJhbXM7Cit9CisKKy8qKgorICogd21hX2dldF9zdGF0c19yZXEoKSAtIGdldCBzdGF0cyByZXF1ZXN0CisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZ2V0X3N0YXRzX3BhcmFtOiBzdGF0cyBwYXJhbXMKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB3bWFfZ2V0X3N0YXRzX3JlcShXTUFfSEFORExFIGhhbmRsZSwKKwkJICAgICAgIHRBbmlHZXRQRVN0YXRzUmVxICpnZXRfc3RhdHNfcGFyYW0pCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqbm9kZTsKKwl3bWlfYnVmX3QgYnVmOworCXdtaV9yZXF1ZXN0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqY21kOworCXRBbmlHZXRQRVN0YXRzUnNwICpwR2V0UEVTdGF0c1JzcFBhcmFtczsKKwl1aW50OF90IGxlbiA9IHNpemVvZih3bWlfcmVxdWVzdF9zdGF0c19jbWRfZml4ZWRfcGFyYW0pOworCisJV01BX0xPR0QoIiVzOiBFbnRlciIsIF9fZnVuY19fKTsKKwlub2RlID0gJndtYV9oYW5kbGUtPmludGVyZmFjZXNbZ2V0X3N0YXRzX3BhcmFtLT5zZXNzaW9uSWRdOworCWlmIChub2RlLT5zdGF0c19yc3ApIHsKKwkJcEdldFBFU3RhdHNSc3BQYXJhbXMgPSBub2RlLT5zdGF0c19yc3A7CisJCWlmIChwR2V0UEVTdGF0c1JzcFBhcmFtcy0+c3RhSWQgPT0gZ2V0X3N0YXRzX3BhcmFtLT5zdGFJZCAmJgorCQkgICAgcEdldFBFU3RhdHNSc3BQYXJhbXMtPnN0YXRzTWFzayA9PQorCQkgICAgZ2V0X3N0YXRzX3BhcmFtLT5zdGF0c01hc2spIHsKKwkJCVdNQV9MT0dJKCJTdGF0cyBmb3Igc3RhSWQgJWQgd2l0aCBzdGF0cyBtYXNrICVkICIKKwkJCQkgImlzIHBlbmRpbmcuLi4uIGlnbm9yZSBuZXcgcmVxdWVzdCIsCisJCQkJIGdldF9zdGF0c19wYXJhbS0+c3RhSWQsCisJCQkJIGdldF9zdGF0c19wYXJhbS0+c3RhdHNNYXNrKTsKKwkJCWdvdG8gZW5kOworCQl9IGVsc2UgeworCQkJY2RmX21lbV9mcmVlKG5vZGUtPnN0YXRzX3JzcCk7CisJCQlub2RlLT5zdGF0c19yc3AgPSBOVUxMOworCQkJbm9kZS0+Zndfc3RhdHNfc2V0ID0gMDsKKwkJfQorCX0KKworCXBHZXRQRVN0YXRzUnNwUGFyYW1zID0gd21hX2dldF9zdGF0c19yc3BfYnVmKGdldF9zdGF0c19wYXJhbSk7CisJaWYgKCFwR2V0UEVTdGF0c1JzcFBhcmFtcykKKwkJZ290byBlbmQ7CisKKwlidWYgPSB3bWlfYnVmX2FsbG9jKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGxlbik7CisJaWYgKCFidWYpIHsKKwkJV01BX0xPR0UoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgd21pIGJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJbm9kZS0+Zndfc3RhdHNfc2V0ID0gMDsKKwlub2RlLT5zdGF0c19yc3AgPSBwR2V0UEVTdGF0c1JzcFBhcmFtczsKKwljbWQgPSAod21pX3JlcXVlc3Rfc3RhdHNfY21kX2ZpeGVkX3BhcmFtICopIHdtaV9idWZfZGF0YShidWYpOworCVdNSVRMVl9TRVRfSERSKCZjbWQtPnRsdl9oZWFkZXIsCisJCSAgICAgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZXF1ZXN0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSwKKwkJICAgICAgIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTgorCQkJICAgICAgICh3bWlfcmVxdWVzdF9zdGF0c19jbWRfZml4ZWRfcGFyYW0pKTsKKwljbWQtPnN0YXRzX2lkID0KKwkJV01JX1JFUVVFU1RfUEVFUl9TVEFUIHwgV01JX1JFUVVFU1RfUERFVl9TVEFUIHwKKwkJV01JX1JFUVVFU1RfVkRFVl9TVEFUOworCWNtZC0+dmRldl9pZCA9IGdldF9zdGF0c19wYXJhbS0+c2Vzc2lvbklkOworCVdNSV9DSEFSX0FSUkFZX1RPX01BQ19BRERSKG5vZGUtPmJzc2lkLCAmY21kLT5wZWVyX21hY2FkZHIpOworCVdNQV9MT0dEKCJTVEFUUyBSRVEgVkRFVl9JRDolZC0tPiIsIGNtZC0+dmRldl9pZCk7CisJaWYgKHdtaV91bmlmaWVkX2NtZF9zZW5kKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsIGJ1ZiwgbGVuLAorCQkJCSBXTUlfUkVRVUVTVF9TVEFUU19DTURJRCkpIHsKKworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBzZW5kIFdNSV9SRVFVRVNUX1NUQVRTX0NNRElEIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXdtaV9idWZfZnJlZShidWYpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlnb3RvIGVuZDsKK2ZhaWxlZDoKKworCXBHZXRQRVN0YXRzUnNwUGFyYW1zLT5yYyA9IENERl9TVEFUVVNfRV9GQUlMVVJFOworCW5vZGUtPnN0YXRzX3JzcCA9IE5VTEw7CisJLyogc2VuZCByZXNwb25zZSB0byBVTUFDICovCisJd21hX3NlbmRfbXNnKHdtYV9oYW5kbGUsIFdNQV9HRVRfU1RBVElTVElDU19SU1AsIHBHZXRQRVN0YXRzUnNwUGFyYW1zLAorCQkgICAgIDApOworZW5kOgorCWNkZl9tZW1fZnJlZShnZXRfc3RhdHNfcGFyYW0pOworCVdNQV9MT0dEKCIlczogRXhpdCIsIF9fZnVuY19fKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogd21hX2dldF9iZWFjb25fYnVmZmVyX2J5X3ZkZXZfaWQoKSAtIGdldCB0aGUgYmVhY29uIGJ1ZmZlciBmcm9tIHZkZXYgSUQKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKiBAYnVmZmVyX3NpemU6IHNpemUgb2YgYnVmZmVyCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgKndtYV9nZXRfYmVhY29uX2J1ZmZlcl9ieV92ZGV2X2lkKHVpbnQ4X3QgdmRldl9pZCwgdWludDMyX3QgKmJ1ZmZlcl9zaXplKQoreworCXRwX3dtYV9oYW5kbGUgd21hOworCXN0cnVjdCBiZWFjb25faW5mbyAqYmVhY29uOworCXVpbnQ4X3QgKmJ1ZjsKKwl1aW50MzJfdCBidWZfc2l6ZTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICh2ZGV2X2lkID49IHdtYS0+bWF4X2Jzc2lkKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCB2ZGV2X2lkICV1IiwgX19mdW5jX18sIHZkZXZfaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIXdtYV9pc192ZGV2X2luX2FwX21vZGUod21hLCB2ZGV2X2lkKSkgeworCQlXTUFfTE9HRSgiJXM6IHZkZXZpZCAlZCBpcyBub3QgaW4gQVAgbW9kZSIsIF9fZnVuY19fLCB2ZGV2X2lkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYmVhY29uID0gd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmJlYWNvbjsKKworCWlmICghYmVhY29uKSB7CisJCVdNQV9MT0dFKCIlczogYmVhY29uIGludmFsaWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWNkZl9zcGluX2xvY2tfYmgoJmJlYWNvbi0+bG9jayk7CisKKwlidWZfc2l6ZSA9IGNkZl9uYnVmX2xlbihiZWFjb24tPmJ1Zik7CisJYnVmID0gY2RmX21lbV9tYWxsb2MoYnVmX3NpemUpOworCisJaWYgKCFidWYpIHsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZiZWFjb24tPmxvY2spOworCQlXTUFfTE9HRSgiJXM6IGFsbG9jIGZhaWxlZCBmb3IgYmVhY29uIGJ1ZiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2RmX21lbV9jb3B5KGJ1ZiwgY2RmX25idWZfZGF0YShiZWFjb24tPmJ1ZiksIGJ1Zl9zaXplKTsKKworCWNkZl9zcGluX3VubG9ja19iaCgmYmVhY29uLT5sb2NrKTsKKworCWlmIChidWZmZXJfc2l6ZSkKKwkJKmJ1ZmZlcl9zaXplID0gYnVmX3NpemU7CisKKwlyZXR1cm4gYnVmOworfQorCisvKioKKyAqIHdtYV9nZXRfdmRldl9hZGRyZXNzX2J5X3ZkZXZfaWQoKSAtIGxvb2t1cCBNQUMgYWRkcmVzcyBmcm9tIHZkZXYgSUQKKyAqIEB2ZGV2X2lkOiB2ZGV2IGlkCisgKgorICogUmV0dXJuOiBtYWMgYWRkcmVzcworICovCit1aW50OF90ICp3bWFfZ2V0X3ZkZXZfYWRkcmVzc19ieV92ZGV2X2lkKHVpbnQ4X3QgdmRldl9pZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICh2ZGV2X2lkID49IHdtYS0+bWF4X2Jzc2lkKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCB2ZGV2X2lkICV1IiwgX19mdW5jX18sIHZkZXZfaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gd21hLT5pbnRlcmZhY2VzW3ZkZXZfaWRdLmFkZHI7Cit9CisKKy8qKgorICogd21hX2dldF9pbnRlcmZhY2VfYnlfdmRldl9pZCgpIC0gbG9va3VwIGludGVyZmFjZSBlbnRyeSB1c2luZyB2ZGV2IElECisgKiBAdmRldl9pZDogdmRldiBpZAorICoKKyAqIFJldHVybjogZW50cnkgZnJvbSB2ZGV2IHRhYmxlCisgKi8KK3N0cnVjdCB3bWFfdHhyeF9ub2RlICAqd21hX2dldF9pbnRlcmZhY2VfYnlfdmRldl9pZCh1aW50OF90IHZkZXZfaWQpCit7CisJdHBfd21hX2hhbmRsZSB3bWE7CisKKwl3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodmRldl9pZCA+PSB3bWEtPm1heF9ic3NpZCkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgdmRldl9pZCAldSIsIF9fZnVuY19fLCB2ZGV2X2lkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuICZ3bWEtPmludGVyZmFjZXNbdmRldl9pZF07Cit9CisKKy8qKgorICogd21hX2lzX3ZkZXZfdXAoKSAtIHJldHVybiB3aGV0aGVyIGEgdmRldiBpcyB1cAorICogQHZkZXZfaWQ6IHZkZXYgaWQKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgdGhlIHZkZXYgaXMgdXAsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIHdtYV9pc192ZGV2X3VwKHVpbnQ4X3QgdmRldl9pZCkKK3sKKwlzdHJ1Y3Qgd21hX3R4cnhfbm9kZSAqdmRldiA9IHdtYV9nZXRfaW50ZXJmYWNlX2J5X3ZkZXZfaWQodmRldl9pZCk7CisJaWYgKHZkZXYpCisJCXJldHVybiB2ZGV2LT52ZGV2X3VwOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCisjaWYgZGVmaW5lZChRQ0FfV0lGSV9GVE0pCisvKioKKyAqIHdtYV91dGZfcnNwKCkgLSB1dGYgcmVzcG9uc2UKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAcGF5bG9hZDogcGF5bG9hZAorICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitpbnQgd21hX3V0Zl9yc3AodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlLCB1aW50OF90ICoqcGF5bG9hZCwgdWludDMyX3QgKmxlbikKK3sKKwlpbnQgcmV0ID0gLTE7CisJdWludDMyX3QgcGF5bG9hZF9sZW47CisKKwlwYXlsb2FkX2xlbiA9IHdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLmxlbmd0aDsKKwlpZiAocGF5bG9hZF9sZW4pIHsKKwkJcmV0ID0gMDsKKworCQkvKgorCQkgKiBUaGUgZmlyc3QgNCBieXRlcyBob2xkcyB0aGUgcGF5bG9hZCBzaXplCisJCSAqIGFuZCB0aGUgYWN0dWFsIHBheWxvYWQgc2l0cyBuZXh0IHRvIGl0CisJCSAqLworCQkqcGF5bG9hZCA9ICh1aW50OF90ICopIGNkZl9tZW1fbWFsbG9jKCh1aW50MzJfdCkgcGF5bG9hZF9sZW4KKwkJCQkJCSAgICAgICsgc2l6ZW9mKEFfVUlOVDMyKSk7CisJCSooQV9VSU5UMzIgKikgJigqcGF5bG9hZFswXSkgPQorCQkJd21hX2hhbmRsZS0+dXRmX2V2ZW50X2luZm8ubGVuZ3RoOworCQltZW1jcHkoKnBheWxvYWQgKyBzaXplb2YoQV9VSU5UMzIpLAorCQkgICAgICAgd21hX2hhbmRsZS0+dXRmX2V2ZW50X2luZm8uZGF0YSwgcGF5bG9hZF9sZW4pOworCQl3bWFfaGFuZGxlLT51dGZfZXZlbnRfaW5mby5sZW5ndGggPSAwOworCQkqbGVuID0gcGF5bG9hZF9sZW47CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfcG9zdF9mdG1fcmVzcG9uc2UoKSAtIHBvc3QgZnRtIHJlc3BvbnNlIHRvIHVwcGVyIGxheWVyCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCitzdGF0aWMgdm9pZCB3bWFfcG9zdF9mdG1fcmVzcG9uc2UodHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCWludCByZXQ7CisJdWludDhfdCAqcGF5bG9hZDsKKwl1aW50MzJfdCBkYXRhX2xlbjsKKwljZHNfbXNnX3QgbXNnID0geyAwIH07CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisKKwlyZXQgPSB3bWFfdXRmX3JzcCh3bWFfaGFuZGxlLCAmcGF5bG9hZCwgJmRhdGFfbGVuKTsKKworCWlmIChyZXQpIHsKKwkJcmV0dXJuOworCX0KKworCXN5c19idWlsZF9tZXNzYWdlX2hlYWRlcihTWVNfTVNHX0lEX0ZUTV9SU1AsICZtc2cpOworCW1zZy5ib2R5cHRyID0gcGF5bG9hZDsKKwltc2cuYm9keXZhbCA9IDA7CisKKwlzdGF0dXMgPSBjZHNfbXFfcG9zdF9tZXNzYWdlKENEU19NUV9JRF9TWVMsICZtc2cpOworCisJaWYgKHN0YXR1cyAhPSBDREZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJV01BX0xPR0UoImZhaWxlZCB0byBwb3N0IGZ0bSByZXNwb25zZSB0byBTWVMiKTsKKwkJY2RmX21lbV9mcmVlKHBheWxvYWQpOworCX0KK30KKworLyoqCisgKiB3bWFfcHJvY2Vzc191dGZfZXZlbnQoKSAtIHByb2Nlc3MgdXRmIGV2ZW50CisgKiBAaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZGF0YXA6IGRhdGEgYnVmZmVyCisgKiBAZGF0YXBsZW46IGRhdGEgbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludAord21hX3Byb2Nlc3NfdXRmX2V2ZW50KFdNQV9IQU5ETEUgaGFuZGxlLCB1aW50OF90ICpkYXRhcCwgdWludDMyX3QgZGF0YXBsZW4pCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlID0gKHRwX3dtYV9oYW5kbGUpIGhhbmRsZTsKKwlTRUdfSERSX0lORk9fU1RSVUNUIHNlZ0hkckluZm87CisJdWludDhfdCB0b3RhbE51bU9mU2VnbWVudHMsIGN1cnJlbnRTZXE7CisJV01JX1BERVZfVVRGX0VWRU5USURfcGFyYW1fdGx2cyAqcGFyYW1fYnVmOworCXVpbnQ4X3QgKmRhdGE7CisJdWludDMyX3QgZGF0YWxlbjsKKworCXBhcmFtX2J1ZiA9IChXTUlfUERFVl9VVEZfRVZFTlRJRF9wYXJhbV90bHZzICopIGRhdGFwOworCWlmICghcGFyYW1fYnVmKSB7CisJCVdNQV9MT0dFKCJHZXQgTlVMTCBwb2ludCBtZXNzYWdlIGZyb20gRlciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRhdGEgPSBwYXJhbV9idWYtPmRhdGE7CisJZGF0YWxlbiA9IHBhcmFtX2J1Zi0+bnVtX2RhdGE7CisKKwlzZWdIZHJJbmZvID0gKihTRUdfSERSX0lORk9fU1RSVUNUICopICYoZGF0YVswXSk7CisKKwl3bWFfaGFuZGxlLT51dGZfZXZlbnRfaW5mby5jdXJyZW50U2VxID0gKHNlZ0hkckluZm8uc2VnbWVudEluZm8gJiAweEYpOworCisJY3VycmVudFNlcSA9IChzZWdIZHJJbmZvLnNlZ21lbnRJbmZvICYgMHhGKTsKKwl0b3RhbE51bU9mU2VnbWVudHMgPSAoc2VnSGRySW5mby5zZWdtZW50SW5mbyA+PiA0KSAmIDB4RjsKKworCWRhdGFsZW4gPSBkYXRhbGVuIC0gc2l6ZW9mKHNlZ0hkckluZm8pOworCisJaWYgKGN1cnJlbnRTZXEgPT0gMCkgeworCQl3bWFfaGFuZGxlLT51dGZfZXZlbnRfaW5mby5leHBlY3RlZFNlcSA9IDA7CisJCXdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLm9mZnNldCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLmV4cGVjdGVkU2VxICE9IGN1cnJlbnRTZXEpCisJCQlXTUFfTE9HRSgiTWlzbWF0Y2ggaW4gZXhwZWN0aW5nIHNlcSBleHBlY3RlZCIKKwkJCQkgIiBTZXEgJWQgZ290IHNlcSAlZCIsCisJCQkJIHdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLmV4cGVjdGVkU2VxLAorCQkJCSBjdXJyZW50U2VxKTsKKwl9CisKKwltZW1jcHkoJndtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLgorCSAgICAgICBkYXRhW3dtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLm9mZnNldF0sCisJICAgICAgICZkYXRhW3NpemVvZihzZWdIZHJJbmZvKV0sIGRhdGFsZW4pOworCXdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLm9mZnNldCA9CisJCXdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLm9mZnNldCArIGRhdGFsZW47CisJd21hX2hhbmRsZS0+dXRmX2V2ZW50X2luZm8uZXhwZWN0ZWRTZXErKzsKKworCWlmICh3bWFfaGFuZGxlLT51dGZfZXZlbnRfaW5mby5leHBlY3RlZFNlcSA9PSB0b3RhbE51bU9mU2VnbWVudHMpIHsKKwkJaWYgKHdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLm9mZnNldCAhPSBzZWdIZHJJbmZvLmxlbikKKwkJCVdNQV9MT0dFKCJBbGwgc2VncyByZWNlaXZlZCB0b3RhbCBsZW4gbWlzbWF0Y2guLiIKKwkJCQkgIiBsZW4gJXp1IHRvdGFsIGxlbiAlZCIsCisJCQkJIHdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLm9mZnNldCwKKwkJCQkgc2VnSGRySW5mby5sZW4pOworCisJCXdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLmxlbmd0aCA9CisJCQl3bWFfaGFuZGxlLT51dGZfZXZlbnRfaW5mby5vZmZzZXQ7CisJfQorCisJd21hX3Bvc3RfZnRtX3Jlc3BvbnNlKHdtYV9oYW5kbGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd21hX3V0Zl9kZXRhY2goKSAtIHV0ZiBkZXRhY2gKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgd21hX3V0Zl9kZXRhY2godHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlKQoreworCWlmICh3bWFfaGFuZGxlLT51dGZfZXZlbnRfaW5mby5kYXRhKSB7CisJCWNkZl9tZW1fZnJlZSh3bWFfaGFuZGxlLT51dGZfZXZlbnRfaW5mby5kYXRhKTsKKwkJd21hX2hhbmRsZS0+dXRmX2V2ZW50X2luZm8uZGF0YSA9IE5VTEw7CisJCXdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLmxlbmd0aCA9IDA7CisJCXdtaV91bmlmaWVkX3VucmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWFfaGFuZGxlLT53bWlfaGFuZGxlLAorCQkJCQkJICAgICBXTUlfUERFVl9VVEZfRVZFTlRJRCk7CisJfQorfQorCisvKioKKyAqIHdtYV91dGZfYXR0YWNoKCkgLSB1dGYgYXR0YWNoCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICoKKyAqIFJldHVybjogbm9uZQorICovCit2b2lkIHdtYV91dGZfYXR0YWNoKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSkKK3sKKwlpbnQgcmV0OworCisJd21hX2hhbmRsZS0+dXRmX2V2ZW50X2luZm8uZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopCisJCQkJCSAgY2RmX21lbV9tYWxsb2MoTUFYX1VURl9FVkVOVF9MRU5HVEgpOworCXdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLmxlbmd0aCA9IDA7CisKKwlyZXQgPSB3bWlfdW5pZmllZF9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtYV9oYW5kbGUtPndtaV9oYW5kbGUsCisJCQkJCQkgV01JX1BERVZfVVRGX0VWRU5USUQsCisJCQkJCQkgd21hX3Byb2Nlc3NfdXRmX2V2ZW50KTsKKworCWlmIChyZXQpCisJCVdNQV9MT0dQKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIFVURiBldmVudCBjYWxsYmFjayIsIF9fZnVuY19fKTsKK30KKworLyoqCisgKiB3bWlfdW5pZmllZF9wZGV2X3V0Zl9jbWQoKSAtIHNlbmQgdXRmIGNvbW1hbmQgdG8gZncKKyAqIEB3bWlfaGFuZGxlOiB3bWkgaGFuZGxlCisgKiBAdXRmX3BheWxvYWQ6IHV0ZiBwYXlsb2FkCisgKiBAbGVuOiBsZW5ndGgKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50Cit3bWlfdW5pZmllZF9wZGV2X3V0Zl9jbWQod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCB1aW50OF90ICp1dGZfcGF5bG9hZCwKKwkJCSB1aW50MTZfdCBsZW4pCit7CisJd21pX2J1Zl90IGJ1ZjsKKwl1aW50OF90ICpjbWQ7CisJaW50IHJldCA9IDA7CisJc3RhdGljIHVpbnQ4X3QgbXNncmVmID0gMTsKKwl1aW50OF90IHNlZ051bWJlciA9IDAsIHNlZ0luZm8sIG51bVNlZ21lbnRzOworCXVpbnQxNl90IGNodW5rX2xlbiwgdG90YWxfYnl0ZXM7CisJdWludDhfdCAqYnVmcG9zOworCVNFR19IRFJfSU5GT19TVFJVQ1Qgc2VnSGRySW5mbzsKKworCWJ1ZnBvcyA9IHV0Zl9wYXlsb2FkOworCXRvdGFsX2J5dGVzID0gbGVuOworCUFTU0VSVCh0b3RhbF9ieXRlcyAvIE1BWF9XTUlfVVRGX0xFTiA9PQorCSAgICAgICAodWludDhfdCkgKHRvdGFsX2J5dGVzIC8gTUFYX1dNSV9VVEZfTEVOKSk7CisJbnVtU2VnbWVudHMgPSAodWludDhfdCkgKHRvdGFsX2J5dGVzIC8gTUFYX1dNSV9VVEZfTEVOKTsKKworCWlmIChsZW4gLSAobnVtU2VnbWVudHMgKiBNQVhfV01JX1VURl9MRU4pKQorCQludW1TZWdtZW50cysrOworCisJd2hpbGUgKGxlbikgeworCQlpZiAobGVuID4gTUFYX1dNSV9VVEZfTEVOKQorCQkJY2h1bmtfbGVuID0gTUFYX1dNSV9VVEZfTEVOOyAgICAvKiBNQVggbWVzc3NhZ2UgKi8KKwkJZWxzZQorCQkJY2h1bmtfbGVuID0gbGVuOworCisJCWJ1ZiA9IHdtaV9idWZfYWxsb2Mod21pX2hhbmRsZSwKKwkJCQkgICAgKGNodW5rX2xlbiArIHNpemVvZihzZWdIZHJJbmZvKSArCisJCQkJICAgICBXTUlfVExWX0hEUl9TSVpFKSk7CisJCWlmICghYnVmKSB7CisJCQlXTUFfTE9HRSgiJXM6d21pX2J1Zl9hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWNtZCA9ICh1aW50OF90ICopIHdtaV9idWZfZGF0YShidWYpOworCisJCXNlZ0hkckluZm8ubGVuID0gdG90YWxfYnl0ZXM7CisJCXNlZ0hkckluZm8ubXNncmVmID0gbXNncmVmOworCQlzZWdJbmZvID0gKChudW1TZWdtZW50cyA8PCA0KSAmIDB4RjApIHwgKHNlZ051bWJlciAmIDB4Rik7CisJCXNlZ0hkckluZm8uc2VnbWVudEluZm8gPSBzZWdJbmZvOworCQlzZWdIZHJJbmZvLnBhZCA9IDA7CisKKwkJV01BX0xPR0QoIiVzOnNlZ0hkckluZm8ubGVuID0gJWQsIHNlZ0hkckluZm8ubXNncmVmID0gJWQsIgorCQkJICIgc2VnSGRySW5mby5zZWdtZW50SW5mbyA9ICVkIiwKKwkJCSBfX2Z1bmNfXywgc2VnSGRySW5mby5sZW4sIHNlZ0hkckluZm8ubXNncmVmLAorCQkJIHNlZ0hkckluZm8uc2VnbWVudEluZm8pOworCisJCVdNQV9MT0dEKCIlczp0b3RhbF9ieXRlcyAlZCBzZWdOdW1iZXIgJWQgdG90YWxTZWdtZW50cyAlZCIKKwkJCSAiY2h1bmsgbGVuICVkIiwgX19mdW5jX18sIHRvdGFsX2J5dGVzLCBzZWdOdW1iZXIsCisJCQkgbnVtU2VnbWVudHMsIGNodW5rX2xlbik7CisKKwkJc2VnTnVtYmVyKys7CisKKwkJV01JVExWX1NFVF9IRFIoY21kLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsCisJCQkgICAgICAgKGNodW5rX2xlbiArIHNpemVvZihzZWdIZHJJbmZvKSkpOworCQljbWQgKz0gV01JX1RMVl9IRFJfU0laRTsKKwkJbWVtY3B5KGNtZCwgJnNlZ0hkckluZm8sIHNpemVvZihzZWdIZHJJbmZvKSk7ICAgLyogNCBieXRlcyAqLworCQltZW1jcHkoJmNtZFtzaXplb2Yoc2VnSGRySW5mbyldLCBidWZwb3MsIGNodW5rX2xlbik7CisKKwkJcmV0ID0gd21pX3VuaWZpZWRfY21kX3NlbmQod21pX2hhbmRsZSwgYnVmLAorCQkJCQkgICAoY2h1bmtfbGVuICsgc2l6ZW9mKHNlZ0hkckluZm8pICsKKwkJCQkJICAgIFdNSV9UTFZfSERSX1NJWkUpLAorCQkJCQkgICBXTUlfUERFVl9VVEZfQ01ESUQpOworCisJCWlmIChyZXQgIT0gRU9LKSB7CisJCQlXTUFfTE9HRSgiRmFpbGVkIHRvIHNlbmQgV01JX1BERVZfVVRGX0NNRElEIGNvbW1hbmQiKTsKKwkJCXdtaV9idWZfZnJlZShidWYpOworCQkJYnJlYWs7CisJCX0KKworCQlsZW4gLT0gY2h1bmtfbGVuOworCQlidWZwb3MgKz0gY2h1bmtfbGVuOworCX0KKworCW1zZ3JlZisrOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3bWFfdXRmX2NtZCgpIC0gdXRmIGNvbW1hbmQKKyAqIEB3bWFfaGFuZGxlOiB3bWEgaGFuZGxlCisgKiBAZGF0YTogZGF0YQorICogQGxlbjogbGVuZ3RoCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IHdtYV91dGZfY21kKHRwX3dtYV9oYW5kbGUgd21hX2hhbmRsZSwgdWludDhfdCAqZGF0YSwgdWludDE2X3QgbGVuKQoreworCXdtYV9oYW5kbGUtPnV0Zl9ldmVudF9pbmZvLmxlbmd0aCA9IDA7CisJcmV0dXJuIHdtaV91bmlmaWVkX3BkZXZfdXRmX2NtZCh3bWFfaGFuZGxlLT53bWlfaGFuZGxlLCBkYXRhLCBsZW4pOworfQorCisvKioKKyAqIHdtYV9wcm9jZXNzX2Z0bV9jb21tYW5kKCkgLSBwcm9jZXNzIGZ0bSBjb21tYW5kCisgKiBAd21hX2hhbmRsZTogd21hIGhhbmRsZQorICogQG1zZ19idWZmZXI6IG1lc3NhZ2UgYnVmZmVyCisgKgorICogUmV0dXJuOiBDREZfU1RBVFVTX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitDREZfU1RBVFVTCit3bWFfcHJvY2Vzc19mdG1fY29tbWFuZCh0cF93bWFfaGFuZGxlIHdtYV9oYW5kbGUsCisJCQlzdHJ1Y3QgYXI2a190ZXN0bW9kZV9jbWRfZGF0YSAqbXNnX2J1ZmZlcikKK3sKKwl1aW50OF90ICpkYXRhID0gTlVMTDsKKwl1aW50MTZfdCBsZW4gPSAwOworCWludCByZXQ7CisKKwlpZiAoIW1zZ19idWZmZXIpCisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisKKwlpZiAoY2RzX2dldF9jb25wYXJhbSgpICE9IENERl9GVE1fTU9ERSkgeworCQlXTUFfTE9HRSgiRlRNIGNvbW1hbmQgaXNzdWVkIGluIG5vbi1GVE0gbW9kZSIpOworCQljZGZfbWVtX2ZyZWUobXNnX2J1ZmZlci0+ZGF0YSk7CisJCWNkZl9tZW1fZnJlZShtc2dfYnVmZmVyKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9OT1NVUFBPUlQ7CisJfQorCisJZGF0YSA9IG1zZ19idWZmZXItPmRhdGE7CisJbGVuID0gbXNnX2J1ZmZlci0+bGVuOworCisJcmV0ID0gd21hX3V0Zl9jbWQod21hX2hhbmRsZSwgZGF0YSwgbGVuKTsKKworCWNkZl9tZW1fZnJlZShtc2dfYnVmZmVyLT5kYXRhKTsKKwljZGZfbWVtX2ZyZWUobXNnX2J1ZmZlcik7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8qIFFDQV9XSUZJX0ZUTSAqLworCisvKioKKyAqIHdtYV9nZXRfd2Nuc3Nfc29mdHdhcmVfdmVyc2lvbigpIC0gZ2V0IHdjbnNzIHNvZnR3YXJlIHZlcnNpb24KKyAqIEBwX2Nkc19nY3R4OiBjZHMgY29udGV4dAorICogQHBWZXJzaW9uOiB2ZXJzaW9uIHBvaW50ZXIKKyAqIEB2ZXJzaW9uQnVmZmVyU2l6ZTogYnVmZmVyIHNpemUKKyAqCisgKiBSZXR1cm46IENERl9TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK0NERl9TVEFUVVMgd21hX2dldF93Y25zc19zb2Z0d2FyZV92ZXJzaW9uKHZvaWQgKnBfY2RzX2djdHgsCisJCQkJCSAgdWludDhfdCAqcFZlcnNpb24sCisJCQkJCSAgdWludDMyX3QgdmVyc2lvbkJ1ZmZlclNpemUpCit7CisJdHBfd21hX2hhbmRsZSB3bWFfaGFuZGxlOworCXdtYV9oYW5kbGUgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCisJaWYgKE5VTEwgPT0gd21hX2hhbmRsZSkgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgd21hIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBVUxUOworCX0KKworCXNucHJpbnRmKHBWZXJzaW9uLCB2ZXJzaW9uQnVmZmVyU2l6ZSwgIiV4IiwKKwkJICh1bnNpZ25lZCBpbnQpd21hX2hhbmRsZS0+dGFyZ2V0X2Z3X3ZlcnNpb24pOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2dldF90eF9yeF9zc19mcm9tX2NvbmZpZygpIC0gR2V0IFR4L1J4IHNwYXRpYWwgc3RyZWFtIGZyb20gSFcgbW9kZSBjb25maWcKKyAqIEBtYWNfc3M6IENvbmZpZyB3aGljaCBpbmRpY2F0ZXMgdGhlIEhXIG1vZGUgYXMgcGVyICdod19tb2RlX3NzX2NvbmZpZycKKyAqIEB0eF9zczogQ29udGFpbnMgdGhlIFR4IHNwYXRpYWwgc3RyZWFtCisgKiBAcnhfc3M6IENvbnRhaW5zIHRoZSBSeCBzcGF0aWFsIHN0cmVhbQorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzcGF0aWFsIHN0cmVhbXMgb2YgVHggYW5kIFJ4CisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd21hX2dldF90eF9yeF9zc19mcm9tX2NvbmZpZyhlbnVtIGh3X21vZGVfc3NfY29uZmlnIG1hY19zcywKKwkJCQkgIHVpbnQzMl90ICp0eF9zcywKKwkJCQkgIHVpbnQzMl90ICpyeF9zcykKK3sKKwlzd2l0Y2ggKG1hY19zcykgeworCWNhc2UgSFdfTU9ERV9TU18weDA6CisJCSp0eF9zcyA9IDA7CisJCSpyeF9zcyA9IDA7CisJCWJyZWFrOworCWNhc2UgSFdfTU9ERV9TU18xeDE6CisJCSp0eF9zcyA9IDE7CisJCSpyeF9zcyA9IDE7CisJCWJyZWFrOworCWNhc2UgSFdfTU9ERV9TU18yeDI6CisJCSp0eF9zcyA9IDI7CisJCSpyeF9zcyA9IDI7CisJCWJyZWFrOworCWNhc2UgSFdfTU9ERV9TU18zeDM6CisJCSp0eF9zcyA9IDM7CisJCSpyeF9zcyA9IDM7CisJCWJyZWFrOworCWNhc2UgSFdfTU9ERV9TU180eDQ6CisJCSp0eF9zcyA9IDQ7CisJCSpyeF9zcyA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSp0eF9zcyA9IDA7CisJCSpyeF9zcyA9IDA7CisJfQorfQorCisvKioKKyAqIHdtYV9nZXRfbWF0Y2hpbmdfaHdfbW9kZV9pbmRleCgpIC0gR2V0IG1hdGNoaW5nIEhXIG1vZGUgaW5kZXgKKyAqIEB3bWE6IFdNQSBoYW5kbGUKKyAqIEBtYWMwX3R4X3NzOiBOdW1iZXIgb2YgdHggc3BhdGlhbCBzdHJlYW1zIG9mIE1BQzAKKyAqIEBtYWMwX3J4X3NzOiBOdW1iZXIgb2Ygcnggc3BhdGlhbCBzdHJlYW1zIG9mIE1BQzAKKyAqIEBtYWMwX2J3OiBCYW5kd2lkdGggb2YgTUFDMCBvZiB0eXBlICdod19tb2RlX2JhbmR3aWR0aCcKKyAqIEBtYWMxX3R4X3NzOiBOdW1iZXIgb2YgdHggc3BhdGlhbCBzdHJlYW1zIG9mIE1BQzEKKyAqIEBtYWMxX3J4X3NzOiBOdW1iZXIgb2Ygcnggc3BhdGlhbCBzdHJlYW1zIG9mIE1BQzEKKyAqIEBtYWMxX2J3OiBCYW5kd2lkdGggb2YgTUFDMSBvZiB0eXBlICdod19tb2RlX2JhbmR3aWR0aCcKKyAqIEBkYnM6IERCUyBjYXBhYmlsaXR5IG9mIHR5cGUgJ2h3X21vZGVfZGJzX2NhcGFiJworICogQGRmczogQWdpbGUgREZTIGNhcGFiaWxpdHkgb2YgdHlwZSAnaHdfbW9kZV9hZ2lsZV9kZnNfY2FwYWInCisgKgorICogRmV0Y2hlcyB0aGUgSFcgbW9kZSBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoZSBIVyBtb2RlIHByb3ZpZGVkCisgKgorICogUmV0dXJuOiBQb3NpdGl2ZSBodyBtb2RlIGluZGV4IGluIGNhc2UgYSBtYXRjaCBpcyBmb3VuZCBvciBhIG5lZ2F0aXZlCisgKiB2YWx1ZSwgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQ4X3Qgd21hX2dldF9tYXRjaGluZ19od19tb2RlX2luZGV4KHRwX3dtYV9oYW5kbGUgd21hLAorCQkJCXVpbnQzMl90IG1hYzBfdHhfc3MsIHVpbnQzMl90IG1hYzBfcnhfc3MsCisJCQkJZW51bSBod19tb2RlX2JhbmR3aWR0aCBtYWMwX2J3LAorCQkJCXVpbnQzMl90IG1hYzFfdHhfc3MsIHVpbnQzMl90IG1hYzFfcnhfc3MsCisJCQkJZW51bSBod19tb2RlX2JhbmR3aWR0aCBtYWMxX2J3LAorCQkJCWVudW0gaHdfbW9kZV9kYnNfY2FwYWIgZGJzLAorCQkJCWVudW0gaHdfbW9kZV9hZ2lsZV9kZnNfY2FwYWIgZGZzKQoreworCXVpbnQzMl90IGk7CisJdWludDMyX3QgdF9tYWMwX3R4X3NzLCB0X21hYzBfcnhfc3MsIHRfbWFjMF9idzsKKwl1aW50MzJfdCB0X21hYzFfdHhfc3MsIHRfbWFjMV9yeF9zcywgdF9tYWMxX2J3OworCXVpbnQzMl90IGRic19tb2RlLCBhZ2lsZV9kZnNfbW9kZTsKKwlpbnQ4X3QgZm91bmQgPSAtRUlOVkFMOworCisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmb3VuZDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgd21hLT5udW1fZGJzX2h3X21vZGVzOyBpKyspIHsKKwkJdF9tYWMwX3R4X3NzID0gV01JX0RCU19IV19NT0RFX01BQzBfVFhfU1RSRUFNU19HRVQoCisJCQkJd21hLT5od19tb2RlLmh3X21vZGVfbGlzdFtpXSk7CisJCWlmICh0X21hYzBfdHhfc3MgIT0gbWFjMF90eF9zcykKKwkJCWNvbnRpbnVlOworCisJCXRfbWFjMF9yeF9zcyA9IFdNSV9EQlNfSFdfTU9ERV9NQUMwX1JYX1NUUkVBTVNfR0VUKAorCQkJCXdtYS0+aHdfbW9kZS5od19tb2RlX2xpc3RbaV0pOworCQlpZiAodF9tYWMwX3J4X3NzICE9IG1hYzBfcnhfc3MpCisJCQljb250aW51ZTsKKworCQl0X21hYzBfYncgPSBXTUlfREJTX0hXX01PREVfTUFDMF9CQU5EV0lEVEhfR0VUKAorCQkJCXdtYS0+aHdfbW9kZS5od19tb2RlX2xpc3RbaV0pOworCQlpZiAodF9tYWMwX2J3ICE9IG1hYzBfYncpCisJCQljb250aW51ZTsKKworCQl0X21hYzFfdHhfc3MgPSBXTUlfREJTX0hXX01PREVfTUFDMV9UWF9TVFJFQU1TX0dFVCgKKwkJCQl3bWEtPmh3X21vZGUuaHdfbW9kZV9saXN0W2ldKTsKKwkJaWYgKHRfbWFjMV90eF9zcyAhPSBtYWMxX3R4X3NzKQorCQkJY29udGludWU7CisKKwkJdF9tYWMxX3J4X3NzID0gV01JX0RCU19IV19NT0RFX01BQzFfUlhfU1RSRUFNU19HRVQoCisJCQkJd21hLT5od19tb2RlLmh3X21vZGVfbGlzdFtpXSk7CisJCWlmICh0X21hYzFfcnhfc3MgIT0gbWFjMV9yeF9zcykKKwkJCWNvbnRpbnVlOworCisJCXRfbWFjMV9idyA9IFdNSV9EQlNfSFdfTU9ERV9NQUMxX0JBTkRXSURUSF9HRVQoCisJCQkJd21hLT5od19tb2RlLmh3X21vZGVfbGlzdFtpXSk7CisJCWlmICh0X21hYzFfYncgIT0gbWFjMV9idykKKwkJCWNvbnRpbnVlOworCisJCWRic19tb2RlID0gV01JX0RCU19IV19NT0RFX0RCU19NT0RFX0dFVCgKKwkJCQl3bWEtPmh3X21vZGUuaHdfbW9kZV9saXN0W2ldKTsKKwkJaWYgKGRic19tb2RlICE9IGRicykKKwkJCWNvbnRpbnVlOworCisJCWFnaWxlX2Rmc19tb2RlID0gV01JX0RCU19IV19NT0RFX0FHSUxFX0RGU19HRVQoCisJCQkJd21hLT5od19tb2RlLmh3X21vZGVfbGlzdFtpXSk7CisJCWlmIChhZ2lsZV9kZnNfbW9kZSAhPSBkZnMpCisJCQljb250aW51ZTsKKworCQlmb3VuZCA9IGk7CisJCVdNQV9MT0dJKCIlczogaHdfbW9kZSBpbmRleCAlZCBmb3VuZCIsCisJCQkJX19mdW5jX18sIGkpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGZvdW5kOworfQorCisvKioKKyAqIHdtYV9nZXRfaHdfbW9kZV9mcm9tX2Ric19od19saXN0KCkgLSBHZXQgaHdfbW9kZSBpbmRleAorICogQG1hYzBfc3M6IE1BQzAgc3BhdGlhbCBzdHJlYW0gY29uZmlndXJhdGlvbgorICogQG1hYzBfYnc6IE1BQzAgYmFuZHdpZHRoIGNvbmZpZ3VyYXRpb24KKyAqIEBtYWMxX3NzOiBNQUMxIHNwYXRpYWwgc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyAqIEBtYWMxX2J3OiBNQUMxIGJhbmR3aWR0aCBjb25maWd1cmF0aW9uCisgKiBAZGJzOiBIVyBEQlMgY2FwYWJpbGl0eQorICogQGRmczogSFcgQWdpbGUgREZTIGNhcGFiaWxpdHkKKyAqCisgKiBHZXQgdGhlIEhXIG1vZGUgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgSFcgbW9kZXMgc3BhdGlhbCBzdHJlYW0sCisgKiBiYW5kd2lkdGgsIERCUyBhbmQgQWdpbGUgREZTIGNhcGFiaWxpdHkKKyAqCisgKiBSZXR1cm46IEluZGV4IG51bWJlciBpZiBhIG1hdGNoIGlzIGZvdW5kIG9yIC1uZWdhdGl2ZSB2YWx1ZSBpZiBub3QgZm91bmQKKyAqLworaW50OF90IHdtYV9nZXRfaHdfbW9kZV9pZHhfZnJvbV9kYnNfaHdfbGlzdChlbnVtIGh3X21vZGVfc3NfY29uZmlnIG1hYzBfc3MsCisJCQkJCSAgICBlbnVtIGh3X21vZGVfYmFuZHdpZHRoIG1hYzBfYncsCisJCQkJCSAgICBlbnVtIGh3X21vZGVfc3NfY29uZmlnIG1hYzFfc3MsCisJCQkJCSAgICBlbnVtIGh3X21vZGVfYmFuZHdpZHRoIG1hYzFfYncsCisJCQkJCSAgICBlbnVtIGh3X21vZGVfZGJzX2NhcGFiIGRicywKKwkJCQkJICAgIGVudW0gaHdfbW9kZV9hZ2lsZV9kZnNfY2FwYWIgZGZzKQoreworCXRwX3dtYV9oYW5kbGUgd21hOworCXVpbnQzMl90IG1hYzBfdHhfc3MsIG1hYzBfcnhfc3M7CisJdWludDMyX3QgbWFjMV90eF9zcywgbWFjMV9yeF9zczsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdtYV9nZXRfdHhfcnhfc3NfZnJvbV9jb25maWcobWFjMF9zcywgJm1hYzBfdHhfc3MsICZtYWMwX3J4X3NzKTsKKwl3bWFfZ2V0X3R4X3J4X3NzX2Zyb21fY29uZmlnKG1hYzFfc3MsICZtYWMxX3R4X3NzLCAmbWFjMV9yeF9zcyk7CisKKwlXTUFfTE9HSSgiJXM6IE1BQzA6IFR4U1M9JWQsIFJ4U1M9JWQsIEJXPSVkIiwKKwkJX19mdW5jX18sIG1hYzBfdHhfc3MsIG1hYzBfcnhfc3MsIG1hYzBfYncpOworCVdNQV9MT0dJKCIlczogTUFDMTogVHhTUz0lZCwgUnhTUz0lZCwgQlc9JWQiLAorCQlfX2Z1bmNfXywgbWFjMV90eF9zcywgbWFjMV9yeF9zcywgbWFjMV9idyk7CisJV01BX0xPR0koIiVzOiBEQlMgY2FwYWI9JWQsIEFnaWxlIERGUyBjYXBhYj0lZCIsCisJCV9fZnVuY19fLCBkYnMsIGRmcyk7CisKKwlyZXR1cm4gd21hX2dldF9tYXRjaGluZ19od19tb2RlX2luZGV4KHdtYSwgbWFjMF90eF9zcywgbWFjMF9yeF9zcywKKwkJCQkJCW1hYzBfYncsCisJCQkJCQltYWMxX3R4X3NzLCBtYWMxX3J4X3NzLAorCQkJCQkJbWFjMV9idywKKwkJCQkJCWRicywgZGZzKTsKK30KKworLyoqCisgKiB3bWFfZ2V0X2h3X21vZGVfZnJvbV9pZHgoKSAtIEdldCBIVyBtb2RlIGJhc2VkIG9uIGluZGV4CisgKiBAaWR4OiBIVyBtb2RlIGluZGV4CisgKiBAaHdfbW9kZTogSFcgbW9kZSBwYXJhbXMKKyAqCisgKiBGZXRjaGVzIHRoZSBIVyBtb2RlIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46IFN1Y2Nlc3MgaWYgaHcgbW9kZSBpcyBvYnRhaW5lZCBhbmQgdGhlIGh3IG1vZGUgcGFyYW1zCisgKi8KK0NERl9TVEFUVVMgd21hX2dldF9od19tb2RlX2Zyb21faWR4KHVpbnQzMl90IGlkeCwKKwkJc3RydWN0IHNpcl9od19tb2RlX3BhcmFtcyAqaHdfbW9kZSkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKwl1aW50MzJfdCBwYXJhbTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfRkFJTFVSRTsKKwl9CisKKwlpZiAoaWR4ID4gd21hLT5udW1fZGJzX2h3X21vZGVzKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBpbmRleCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXBhcmFtID0gd21hLT5od19tb2RlLmh3X21vZGVfbGlzdFtpZHhdOworCisJaHdfbW9kZS0+bWFjMF90eF9zcyA9IFdNSV9EQlNfSFdfTU9ERV9NQUMwX1RYX1NUUkVBTVNfR0VUKHBhcmFtKTsKKwlod19tb2RlLT5tYWMwX3J4X3NzID0gV01JX0RCU19IV19NT0RFX01BQzBfUlhfU1RSRUFNU19HRVQocGFyYW0pOworCWh3X21vZGUtPm1hYzBfYncgPSBXTUlfREJTX0hXX01PREVfTUFDMF9CQU5EV0lEVEhfR0VUKHBhcmFtKTsKKwlod19tb2RlLT5tYWMxX3R4X3NzID0gV01JX0RCU19IV19NT0RFX01BQzFfVFhfU1RSRUFNU19HRVQocGFyYW0pOworCWh3X21vZGUtPm1hYzFfcnhfc3MgPSBXTUlfREJTX0hXX01PREVfTUFDMV9SWF9TVFJFQU1TX0dFVChwYXJhbSk7CisJaHdfbW9kZS0+bWFjMV9idyA9IFdNSV9EQlNfSFdfTU9ERV9NQUMxX0JBTkRXSURUSF9HRVQocGFyYW0pOworCWh3X21vZGUtPmRic19jYXAgPSBXTUlfREJTX0hXX01PREVfREJTX01PREVfR0VUKHBhcmFtKTsKKwlod19tb2RlLT5hZ2lsZV9kZnNfY2FwID0gV01JX0RCU19IV19NT0RFX0FHSUxFX0RGU19HRVQocGFyYW0pOworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfZ2V0X251bV9kYnNfaHdfbW9kZXMoKSAtIEdldCBudW1iZXIgb2YgSFcgbW9kZQorICoKKyAqIEZldGNoZXMgdGhlIG51bWJlciBvZiBEQlMgSFcgbW9kZXMgcmV0dXJuZWQgYnkgdGhlIEZXCisgKgorICogUmV0dXJuOiBOZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciBvciByZXR1cm5zIHRoZSBudW1iZXIgb2YgREJTIEhXIG1vZGVzCisgKi8KK2ludDhfdCB3bWFfZ2V0X251bV9kYnNfaHdfbW9kZXModm9pZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gd21hLT5udW1fZGJzX2h3X21vZGVzOworfQorCisvKioKKyAqIHdtYV9pc19od19kYnNfY2FwYWJsZSgpIC0gQ2hlY2sgaWYgSFcgaXMgREJTIGNhcGFibGUKKyAqCisgKiBDaGVja3MgaWYgdGhlIEhXIGlzIERCUyBjYXBhYmxlCisgKgorICogUmV0dXJuOiB0cnVlIGlmIHRoZSBIVyBpcyBEQlMgY2FwYWJsZQorICovCitib29sIHdtYV9pc19od19kYnNfY2FwYWJsZSh2b2lkKQoreworCXRwX3dtYV9oYW5kbGUgd21hOworCXVpbnQzMl90IHBhcmFtLCBpLCBmb3VuZCA9IDA7CisKKwl3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCF3bWFfaXNfZGJzX2VuYWJsZSgpKSB7CisJCVdNQV9MT0dJKCIlczogREJTIGlzIGRpc2FibGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJV01BX0xPR0koIiVzOiBEQlMgc2VydmljZSBiaXQgbWFwOiAlZCIsIF9fZnVuY19fLAorCQlXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQlXTUlfU0VSVklDRV9EVUFMX0JBTkRfU0lNVUxUQU5FT1VTX1NVUFBPUlQpKTsKKworCS8qIFRoZSBhZ3JlZW1lbnQgd2l0aCBGVyBpcyB0aGF0OiBUbyBrbm93IGlmIHRoZSB0YXJnZXQgaXMgREJTCisJICogY2FwYWJsZSwgREJTIG5lZWRzIHRvIGJlIHN1cHBvcnRlZCBib3RoIGluIHRoZSBIVyBtb2RlIGxpc3QKKwkgKiBhbmQgaW4gdGhlIHNlcnZpY2UgcmVhZHkgZXZlbnQKKwkgKi8KKwlpZiAoIShXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJV01JX1NFUlZJQ0VfRFVBTF9CQU5EX1NJTVVMVEFORU9VU19TVVBQT1JUKSkpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCB3bWEtPm51bV9kYnNfaHdfbW9kZXM7IGkrKykgeworCQlwYXJhbSA9IHdtYS0+aHdfbW9kZS5od19tb2RlX2xpc3RbaV07CisJCVdNQV9MT0dJKCIlczogSFcgcGFyYW06ICV4IiwgX19mdW5jX18sIHBhcmFtKTsKKwkJaWYgKFdNSV9EQlNfSFdfTU9ERV9EQlNfTU9ERV9HRVQocGFyYW0pKSB7CisJCQlXTUFfTE9HSSgiJXM6IEhXICglZCkgaXMgREJTIGNhcGFibGUiLCBfX2Z1bmNfXywgaSk7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChmb3VuZCkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogd21hX2lzX2h3X2FnaWxlX2Rmc19jYXBhYmxlKCkgLSBDaGVjayBpZiBIVyBpcyBhZ2lsZSBERlMgY2FwYWJsZQorICoKKyAqIENoZWNrcyBpZiB0aGUgSFcgaXMgYWdpbGUgREZTIGNhcGFibGUKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgdGhlIEhXIGlzIGFnaWxlIERGUyBjYXBhYmxlCisgKi8KK2Jvb2wgd21hX2lzX2h3X2FnaWxlX2Rmc19jYXBhYmxlKHZvaWQpCit7CisJdHBfd21hX2hhbmRsZSB3bWE7CisJdWludDMyX3QgcGFyYW0sIGksIGZvdW5kID0gMDsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIXdtYV9pc19hZ2lsZV9kZnNfZW5hYmxlKCkpIHsKKwkJV01BX0xPR0koIiVzOiBBZ2lsZSBERlMgaXMgZGlzYWJsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlXTUFfTE9HSSgiJXM6IERCUyBzZXJ2aWNlIGJpdCBtYXA6ICVkIiwgX19mdW5jX18sCisJCVdNSV9TRVJWSUNFX0lTX0VOQUJMRUQod21hLT53bWlfc2VydmljZV9iaXRtYXAsCisJCVdNSV9TRVJWSUNFX0RVQUxfQkFORF9TSU1VTFRBTkVPVVNfU1VQUE9SVCkpOworCisJLyogVGhlIGFncmVlbWVudCB3aXRoIEZXIGlzIHRoYXQgdG8ga25vdyBpZiB0aGUgdGFyZ2V0IGlzIEFnaWxlIERGUworCSAqIGNhcGFibGUsIERCUyBuZWVkcyB0byBiZSBzdXBwb3J0ZWQgaW4gdGhlIHNlcnZpY2UgYml0IG1hcCBhbmQKKwkgKiBBZ2lsZSBERlMgbmVlZHMgdG8gYmUgc3VwcG9ydGVkIGluIHRoZSBIVyBtb2RlIGxpc3QKKwkgKi8KKwlpZiAoIShXTUlfU0VSVklDRV9JU19FTkFCTEVEKHdtYS0+d21pX3NlcnZpY2VfYml0bWFwLAorCQkJV01JX1NFUlZJQ0VfRFVBTF9CQU5EX1NJTVVMVEFORU9VU19TVVBQT1JUKSkpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCB3bWEtPm51bV9kYnNfaHdfbW9kZXM7IGkrKykgeworCQlwYXJhbSA9IHdtYS0+aHdfbW9kZS5od19tb2RlX2xpc3RbaV07CisJCVdNQV9MT0dJKCIlczogSFcgcGFyYW06ICV4IiwgX19mdW5jX18sIHBhcmFtKTsKKwkJaWYgKFdNSV9EQlNfSFdfTU9ERV9BR0lMRV9ERlNfR0VUKHBhcmFtKSkgeworCQkJV01BX0xPR0koIiVzOiBIVyAlZCBpcyBhZ2lsZSBERlMgY2FwYWJsZSIsCisJCQkJX19mdW5jX18sIGkpOworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZm91bmQpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIHdtYV9nZXRfbWFjX2lkX29mX3ZkZXYoKSAtIEdldCBNQUMgaWQgY29ycmVzcG9uZGluZyB0byBhIHZkZXYKKyAqIEB2ZGV2X2lkOiBWREVWIHdob3NlIE1BQyBJRCBpcyByZXF1aXJlZAorICoKKyAqIEdldCBNQUMgaWQgY29ycmVzcG9uZGluZyB0byBhIHZkZXYgaWQgZnJvbSB0aGUgV01BIHN0cnVjdHVyZQorICoKKyAqIFJldHVybjogTmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZSBhbmQgTUFDIGlkIG9uIHN1Y2Nlc3MKKyAqLworaW50OF90IHdtYV9nZXRfbWFjX2lkX29mX3ZkZXYodWludDMyX3QgdmRldl9pZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh3bWEtPmludGVyZmFjZXMpCisJCXJldHVybiB3bWEtPmludGVyZmFjZXNbdmRldl9pZF0ubWFjX2lkOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogd21hX2dldF9vbGRfYW5kX25ld19od19pbmRleCgpIC0gR2V0IHRoZSBvbGQgYW5kIG5ldyBIVyBpbmRleAorICogQG9sZF9od19tb2RlX2luZGV4OiBWYWx1ZSBhdCB0aGlzIHBvaW50ZXIgY29udGFpbnMgdGhlIG9sZCBIVyBtb2RlIGluZGV4CisgKiBEZWZhdWx0IHZhbHVlIHdoZW4gbm90IGNvbmZpZ3VyZWQgaXMgV01BX0RFRkFVTFRfSFdfTU9ERV9JTkRFWAorICogQG5ld19od19tb2RlX2luZGV4OiBWYWx1ZSBhdCB0aGlzIHBvaW50ZXIgY29udGFpbnMgdGhlIG5ldyBIVyBtb2RlIGluZGV4CisgKiBEZWZhdWx0IHZhbHVlIHdoZW4gbm90IGNvbmZpZ3VyZWQgaXMgV01BX0RFRkFVTFRfSFdfTU9ERV9JTkRFWAorICoKKyAqIEdldCB0aGUgb2xkIGFuZCBuZXcgSFcgaW5kZXggY29uZmlndXJlZCBpbiB0aGUgZHJpdmVyCisgKgorICogUmV0dXJuOiBGYWlsdXJlIGluIGNhc2UgdGhlIEhXIG1vZGUgaW5kaWNlcyBjYW5ub3QgYmUgZmV0Y2hlZCBhbmQgU3VjY2VzcworICogb3RoZXJ3aXNlLiBXaGVuIG5vIEhXIG1vZGUgdHJhbnNpdGlvbiBoYXMgaGFwcGVuZWQgdGhlIHZhbHVlcyBvZgorICogb2xkX2h3X21vZGVfaW5kZXggYW5kIG5ld19od19tb2RlX2luZGV4IHdpbGwgYmUgdGhlIHNhbWUuCisgKi8KK0NERl9TVEFUVVMgd21hX2dldF9vbGRfYW5kX25ld19od19pbmRleCh1aW50MzJfdCAqb2xkX2h3X21vZGVfaW5kZXgsCisJCQkJICAgIHVpbnQzMl90ICpuZXdfaHdfbW9kZV9pbmRleCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBDREZfU1RBVFVTX0VfSU5WQUw7CisJfQorCisJKm9sZF9od19tb2RlX2luZGV4ID0gd21hLT5vbGRfaHdfbW9kZV9pbmRleDsKKwkqbmV3X2h3X21vZGVfaW5kZXggPSB3bWEtPm5ld19od19tb2RlX2luZGV4OworCisJcmV0dXJuIENERl9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiB3bWFfdXBkYXRlX2ludGZfaHdfbW9kZV9wYXJhbXMoKSAtIFVwZGF0ZSBXTUEgcGFyYW1zCisgKiBAdmRldl9pZDogVkRFViBpZCB3aG9zZSBwYXJhbXMgbmVlZHMgdG8gYmUgdXBkYXRlZAorICogQG1hY19pZDogTUFDIGlkIHRvIGJlIHVwZGF0ZWQKKyAqIEBjZmdkX2h3X21vZGVfaW5kZXg6IEhXIG1vZGUgaW5kZXggZnJvbSB3aGljaCBUeCBhbmQgUnggU1Mgd2lsbCBiZSB1cGRhdGVkCisgKgorICogVXBkYXRlcyB0aGUgTUFDIGlkLCB0eCBzcGF0aWFsIHN0cmVhbSwgcnggc3BhdGlhbCBzdHJlYW0gaW4gV01BCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd21hX3VwZGF0ZV9pbnRmX2h3X21vZGVfcGFyYW1zKHVpbnQzMl90IHZkZXZfaWQsIHVpbnQzMl90IG1hY19pZCwKKwkJCQkgICAgdWludDMyX3QgY2ZnZF9od19tb2RlX2luZGV4KQoreworCXRwX3dtYV9oYW5kbGUgd21hOworCisJd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoIXdtYSkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgV01BIGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghd21hLT5pbnRlcmZhY2VzKSB7CisJCVdNQV9MT0dFKCIlczogSW50ZXJmYWNlIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl3bWEtPmludGVyZmFjZXNbdmRldl9pZF0ubWFjX2lkID0gbWFjX2lkOworCWlmIChtYWNfaWQgPT0gMCkgeworCQl3bWEtPmludGVyZmFjZXNbdmRldl9pZF0udHhfc3RyZWFtcyA9CisJCQlXTUlfREJTX0hXX01PREVfTUFDMF9UWF9TVFJFQU1TX0dFVChjZmdkX2h3X21vZGVfaW5kZXgpOworCQl3bWEtPmludGVyZmFjZXNbdmRldl9pZF0ucnhfc3RyZWFtcyA9CisJCQlXTUlfREJTX0hXX01PREVfTUFDMF9SWF9TVFJFQU1TX0dFVChjZmdkX2h3X21vZGVfaW5kZXgpOworCX0gZWxzZSB7CisJCXdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS50eF9zdHJlYW1zID0KKwkJCVdNSV9EQlNfSFdfTU9ERV9NQUMxX1RYX1NUUkVBTVNfR0VUKGNmZ2RfaHdfbW9kZV9pbmRleCk7CisJCXdtYS0+aW50ZXJmYWNlc1t2ZGV2X2lkXS5yeF9zdHJlYW1zID0KKwkJCVdNSV9EQlNfSFdfTU9ERV9NQUMxX1JYX1NUUkVBTVNfR0VUKGNmZ2RfaHdfbW9kZV9pbmRleCk7CisJfQorfQorCisvKioKKyAqIHdtYV9nZXRfZGJzX2h3X21vZGVzKCkgLSBHZXQgdGhlIERCUyBIVyBtb2RlcyBmb3IgdXNlcnNwYWNlCisgKiBAb25lX2J5X29uZV9kYnM6IDF4MSBEQlMgY2FwYWJpbGl0eSBvZiBIVworICogQHR3b19ieV90d29fZGJzOiAyeDIgREJTIGNhcGFiaWxpdHkgb2YgSFcKKyAqCisgKiBQcm92aWRlcyB0aGUgREJTIEhXIG1vZGUgY2FwYWJpbGl0eSBzdWNoIGFzIHdoZXRoZXIKKyAqIDF4MSBEQlMsIDJ4MiBEQlMgaXMgc3VwcG9ydGVkIGJ5IHRoZSBIVyBvciBub3QuCisgKgorICogUmV0dXJuOiBGYWlsdXJlIGluIGNhc2Ugb2YgZXJyb3IgYW5kIDAgb24gc3VjY2VzcworICogICAgICAgICBvbmVfYnlfb25lX2Ricy90d29fYnlfdHdvX2RicyB3aWxsIGJlIGZhbHNlLAorICogICAgICAgICBpZiB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkLgorICogICAgICAgICBvbmVfYnlfb25lX2Ricy90d29fYnlfdHdvX2RicyB3aWxsIGJlIHRydWUsCisgKiAgICAgICAgIGlmIHRoZXkgYXJlIHN1cHBvcnRlZC4KKyAqICAgICAgICAgZmFsc2UgdmFsdWVzIG9mIG9uZV9ieV9vbmVfZGJzL3R3b19ieV90d29fZGJzLAorICogICAgICAgICBpbmRpY2F0ZSBEQlMgaXMgZGlzYWJsZWQKKyAqLworQ0RGX1NUQVRVUyB3bWFfZ2V0X2Ric19od19tb2Rlcyhib29sICpvbmVfYnlfb25lX2RicywgYm9vbCAqdHdvX2J5X3R3b19kYnMpCit7CisJdHBfd21hX2hhbmRsZSB3bWE7CisJdWludDMyX3QgaTsKKwlpbnQ4X3QgZm91bmRfb25lX2J5X29uZSA9IC1FSU5WQUwsIGZvdW5kX3R3b19ieV90d28gPSAtRUlOVkFMOworCXVpbnQzMl90IGNvbmYxX3R4X3NzLCBjb25mMV9yeF9zczsKKwl1aW50MzJfdCBjb25mMl90eF9zcywgY29uZjJfcnhfc3M7CisKKwkqb25lX2J5X29uZV9kYnMgPSBmYWxzZTsKKwkqdHdvX2J5X3R3b19kYnMgPSBmYWxzZTsKKworCWlmICh3bWFfaXNfaHdfZGJzX2NhcGFibGUoKSA9PSBmYWxzZSkgeworCQlXTUFfTE9HRSgiJXM6IEhXIGlzIG5vdCBEQlMgY2FwYWJsZSIsIF9fZnVuY19fKTsKKwkJLyogQ2FsbGVyIHdpbGwgdW5kZXJzdGFuZCB0aGF0IERCUyBpcyBkaXNhYmxlZCAqLworCQlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworCisJfQorCisJd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoIXdtYSkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgV01BIGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCS8qIFRvIGNoZWNrIDF4MSBjYXBhYmlsaXR5ICovCisJd21hX2dldF90eF9yeF9zc19mcm9tX2NvbmZpZyhIV19NT0RFX1NTXzF4MSwKKwkJCSZjb25mMV90eF9zcywgJmNvbmYxX3J4X3NzKTsKKwkvKiBUbyBjaGVjayAyeDIgY2FwYWJpbGl0eSAqLworCXdtYV9nZXRfdHhfcnhfc3NfZnJvbV9jb25maWcoSFdfTU9ERV9TU18yeDIsCisJCQkmY29uZjJfdHhfc3MsICZjb25mMl9yeF9zcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd21hLT5udW1fZGJzX2h3X21vZGVzOyBpKyspIHsKKwkJdWludDMyX3QgdF9jb25mMF90eF9zcywgdF9jb25mMF9yeF9zczsKKwkJdWludDMyX3QgdF9jb25mMV90eF9zcywgdF9jb25mMV9yeF9zczsKKwkJdWludDMyX3QgZGJzX21vZGU7CisKKwkJdF9jb25mMF90eF9zcyA9IFdNSV9EQlNfSFdfTU9ERV9NQUMwX1RYX1NUUkVBTVNfR0VUKAorCQkJCXdtYS0+aHdfbW9kZS5od19tb2RlX2xpc3RbaV0pOworCQl0X2NvbmYwX3J4X3NzID0gV01JX0RCU19IV19NT0RFX01BQzBfUlhfU1RSRUFNU19HRVQoCisJCQkJd21hLT5od19tb2RlLmh3X21vZGVfbGlzdFtpXSk7CisJCXRfY29uZjFfdHhfc3MgPSBXTUlfREJTX0hXX01PREVfTUFDMV9UWF9TVFJFQU1TX0dFVCgKKwkJCQl3bWEtPmh3X21vZGUuaHdfbW9kZV9saXN0W2ldKTsKKwkJdF9jb25mMV9yeF9zcyA9IFdNSV9EQlNfSFdfTU9ERV9NQUMxX1JYX1NUUkVBTVNfR0VUKAorCQkJCXdtYS0+aHdfbW9kZS5od19tb2RlX2xpc3RbaV0pOworCQlkYnNfbW9kZSA9IFdNSV9EQlNfSFdfTU9ERV9EQlNfTU9ERV9HRVQoCisJCQkJd21hLT5od19tb2RlLmh3X21vZGVfbGlzdFtpXSk7CisKKwkJaWYgKCgoKCh0X2NvbmYwX3R4X3NzID09IGNvbmYxX3R4X3NzKSAmJgorCQkgICAgKHRfY29uZjBfcnhfc3MgPT0gY29uZjFfcnhfc3MpKSB8fAorCQkgICAgKCh0X2NvbmYxX3R4X3NzID09IGNvbmYxX3R4X3NzKSAmJgorCQkgICAgKHRfY29uZjFfcnhfc3MgPT0gY29uZjFfcnhfc3MpKSkgJiYKKwkJICAgIChkYnNfbW9kZSA9PSBIV19NT0RFX0RCUykpICYmCisJCSAgICAoZm91bmRfb25lX2J5X29uZSA8IDApKSB7CisJCQlmb3VuZF9vbmVfYnlfb25lID0gaTsKKwkJCVdNQV9MT0dJKCIlczogMXgxIGh3X21vZGUgaW5kZXggJWQgZm91bmQiLAorCQkJCQlfX2Z1bmNfXywgaSk7CisJCQkvKiBPbmNlIGFuIGVudHJ5IGlzIGZvdW5kLCBuZWVkIG5vdCBjaGVjayBmb3IgMXgxCisJCQkgKiBhZ2FpbgorCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoKCgodF9jb25mMF90eF9zcyA9PSBjb25mMl90eF9zcykgJiYKKwkJICAgICh0X2NvbmYwX3J4X3NzID09IGNvbmYyX3J4X3NzKSkgfHwKKwkJICAgICgodF9jb25mMV90eF9zcyA9PSBjb25mMl90eF9zcykgJiYKKwkJICAgICh0X2NvbmYxX3J4X3NzID09IGNvbmYyX3J4X3NzKSkpICYmCisJCSAgICAoZGJzX21vZGUgPT0gSFdfTU9ERV9EQlMpKSAmJgorCQkgICAgKGZvdW5kX3R3b19ieV90d28gPCAwKSkgeworCQkJZm91bmRfdHdvX2J5X3R3byA9IGk7CisJCQlXTUFfTE9HSSgiJXM6IDJ4MiBod19tb2RlIGluZGV4ICVkIGZvdW5kIiwKKwkJCQkJX19mdW5jX18sIGkpOworCQkJLyogT25jZSBhbiBlbnRyeSBpcyBmb3VuZCwgbmVlZCBub3QgY2hlY2sgZm9yIDJ4MgorCQkJICogYWdhaW4KKwkJCSAqLworCQkJY29udGludWU7CisJCX0KKwl9CisKKwlpZiAoZm91bmRfb25lX2J5X29uZSA+PSAwKQorCQkqb25lX2J5X29uZV9kYnMgPSB0cnVlOworCWlmIChmb3VuZF90d29fYnlfdHdvID49IDApCisJCSp0d29fYnlfdHdvX2RicyA9IHRydWU7CisKKwlyZXR1cm4gQ0RGX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIHdtYV9nZXRfY3VycmVudF9od19tb2RlKCkgLSBHZXQgY3VycmVudCBIVyBtb2RlIHBhcmFtcworICogQGh3X21vZGU6IEhXIG1vZGUgcGFyYW1ldGVycworICoKKyAqIFByb3ZpZGVzIHRoZSBjdXJyZW50IEhXIG1vZGUgcGFyYW1ldGVycyBpZiB0aGUgSFcgbW9kZSBpcyBpbml0aWFsaXplZAorICogaW4gdGhlIGRyaXZlcgorICoKKyAqIFJldHVybjogU3VjY2VzcyBpZiB0aGUgY3VycmVudCBIVyBtb2RlIHBhcmFtcyBhcmUgc3VjY2Vzc2Z1bGx5IHBvcHVsYXRlZAorICovCitDREZfU1RBVFVTIHdtYV9nZXRfY3VycmVudF9od19tb2RlKHN0cnVjdCBzaXJfaHdfbW9kZV9wYXJhbXMgKmh3X21vZGUpCit7CisJQ0RGX1NUQVRVUyBzdGF0dXM7CisJdWludDMyX3Qgb2xkX2h3X2luZGV4ID0gMCwgbmV3X2h3X2luZGV4ID0gMDsKKworCVdNQV9MT0dJKCIlczogR2V0IHRoZSBjdXJyZW50IGh3IG1vZGUiLCBfX2Z1bmNfXyk7CisKKwlzdGF0dXMgPSB3bWFfZ2V0X29sZF9hbmRfbmV3X2h3X2luZGV4KCZvbGRfaHdfaW5kZXgsCisJCQkmbmV3X2h3X2luZGV4KTsKKwlpZiAoQ0RGX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlXTUFfTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgSFcgbW9kZSBpbmRleCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCWlmIChuZXdfaHdfaW5kZXggPT0gV01BX0RFRkFVTFRfSFdfTU9ERV9JTkRFWCkgeworCQlXTUFfTE9HRSgiJXM6IEhXIG1vZGUgaXMgbm90IHlldCBpbml0aWFsaXplZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIENERl9TVEFUVVNfRV9GQUlMVVJFOworCX0KKworCXN0YXR1cyA9IHdtYV9nZXRfaHdfbW9kZV9mcm9tX2lkeChuZXdfaHdfaW5kZXgsIGh3X21vZGUpOworCWlmIChDREZfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisJCVdNQV9MT0dFKCIlczogRmFpbGVkIHRvIGdldCBIVyBtb2RlIGluZGV4IiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2lzX2Ric19lbmFibGUoKSAtIENoZWNrIGlmIG1hc3RlciBEQlMgY29udHJvbCBpcyBlbmFibGVkCisgKgorICogQ2hlY2tzIGlmIHRoZSBtYXN0ZXIgREJTIGNvbnRyb2wgaXMgZW5hYmxlZC4gVGhpcyB3aWxsIGJlIHVzZWQKKyAqIHRvIG92ZXJyaWRlIGFueSBvdGhlciBEQlMgY2FwYWJpbGl0eQorICoKKyAqIFJldHVybjogVHJ1ZSBpZiBtYXN0ZXIgREJTIGNvbnRyb2wgaXMgZW5hYmxlZAorICovCitib29sIHdtYV9pc19kYnNfZW5hYmxlKHZvaWQpCit7CisJdHBfd21hX2hhbmRsZSB3bWE7CisKKwlpZiAod21hX2lzX2R1YWxfbWFjX2Rpc2FibGVkX2luX2luaSgpKQorCQlyZXR1cm4gZmFsc2U7CisKKwl3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJV01BX0xPR0QoIiVzOiBEQlM9JWQiLCBfX2Z1bmNfXywKKwkgICAgV01JX0RCU19GV19NT0RFX0NGR19EQlNfR0VUKHdtYS0+ZHVhbF9tYWNfY2ZnLmN1cl9md19tb2RlX2NvbmZpZykpOworCisJaWYgKFdNSV9EQlNfRldfTU9ERV9DRkdfREJTX0dFVCh3bWEtPmR1YWxfbWFjX2NmZy5jdXJfZndfbW9kZV9jb25maWcpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB3bWFfaXNfYWdpbGVfZGZzX2VuYWJsZSgpIC0gQ2hlY2sgaWYgbWFzdGVyIEFnaWxlIERGUyBjb250cm9sIGlzIGVuYWJsZWQKKyAqCisgKiBDaGVja3MgaWYgdGhlIG1hc3RlciBBZ2lsZSBERlMgY29udHJvbCBpcyBlbmFibGVkLiBUaGlzIHdpbGwgYmUgdXNlZAorICogdG8gb3ZlcnJpZGUgYW55IG90aGVyIEFnaWxlIERGUyBjYXBhYmlsaXR5CisgKgorICogUmV0dXJuOiBUcnVlIGlmIG1hc3RlciBBZ2lsZSBERlMgY29udHJvbCBpcyBlbmFibGVkCisgKi8KK2Jvb2wgd21hX2lzX2FnaWxlX2Rmc19lbmFibGUodm9pZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKworCWlmICh3bWFfaXNfZHVhbF9tYWNfZGlzYWJsZWRfaW5faW5pKCkpCisJCXJldHVybiBmYWxzZTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlXTUFfTE9HRCgiJXM6IERGUz0lZCBTaW5nbGUgbWFjIHdpdGggREZTPSVkIiwgX19mdW5jX18sCisJCQlXTUlfREJTX0ZXX01PREVfQ0ZHX0FHSUxFX0RGU19HRVQoCisJCQkJd21hLT5kdWFsX21hY19jZmcuY3VyX2Z3X21vZGVfY29uZmlnKSwKKwkJCVdNSV9EQlNfQ09OQ19TQ0FOX0NGR19BR0lMRV9ERlNfU0NBTl9HRVQoCisJCQkJd21hLT5kdWFsX21hY19jZmcuY3VyX3NjYW5fY29uZmlnKSk7CisKKwlpZiAoKFdNSV9EQlNfRldfTU9ERV9DRkdfQUdJTEVfREZTX0dFVCgKKwkJCXdtYS0+ZHVhbF9tYWNfY2ZnLmN1cl9md19tb2RlX2NvbmZpZykpICYmCisJCQkoV01JX0RCU19DT05DX1NDQU5fQ0ZHX0FHSUxFX0RGU19TQ0FOX0dFVCgKKwkJCQkJICAgIHdtYS0+ZHVhbF9tYWNfY2ZnLmN1cl9zY2FuX2NvbmZpZykpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB3bWFfZ2V0X3VwZGF0ZWRfc2Nhbl9jb25maWcoKSAtIEdldCB0aGUgdXBkYXRlZCBzY2FuIGNvbmZpZ3VyYXRpb24KKyAqIEBzY2FuX2NvbmZpZzogUG9pbnRlciBjb250YWluaW5nIHRoZSB1cGRhdGVkIHNjYW4gY29uZmlnCisgKiBAZGJzX3NjYW46IDAgb3IgMSBpbmRpY2F0aW5nIGlmIERCUyBzY2FuIG5lZWRzIHRvIGJlIGVuYWJsZWQvZGlzYWJsZWQKKyAqIEBkYnNfcGx1c19hZ2lsZV9zY2FuOiAwIG9yIDEgaW5kaWNhdGluZyBpZiBEQlMgcGx1cyBhZ2lsZSBzY2FuIG5lZWRzIHRvIGJlCisgKiBlbmFibGVkL2Rpc2FibGVkCisgKiBAc2luZ2xlX21hY19zY2FuX3dpdGhfZGZzOiAwIG9yIDEgaW5kaWNhdGluZyBpZiBzaW5nbGUgTUFDIHNjYW4gd2l0aCBERlMKKyAqIG5lZWRzIHRvIGJlIGVuYWJsZWQvZGlzYWJsZWQKKyAqCisgKiBUYWtlcyB0aGUgY3VycmVudCBzY2FuIGNvbmZpZ3VyYXRpb24gYW5kIHNldCB0aGUgbmVjZXNzYXJ5IHNjYW4gY29uZmlnCisgKiBiaXRzIHRvIGVpdGhlciAwLzEgYW5kIHByb3ZpZGVzIHRoZSB1cGRhdGVkIHZhbHVlIHRvIHRoZSBjYWxsZXIgd2hvCisgKiBjYW4gdXNlIHRoaXMgdG8gcGFzcyBpdCBvbiB0byB0aGUgRlcKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcworICovCitDREZfU1RBVFVTIHdtYV9nZXRfdXBkYXRlZF9zY2FuX2NvbmZpZyh1aW50MzJfdCAqc2Nhbl9jb25maWcsCisJCWJvb2wgZGJzX3NjYW4sCisJCWJvb2wgZGJzX3BsdXNfYWdpbGVfc2NhbiwKKwkJYm9vbCBzaW5nbGVfbWFjX3NjYW5fd2l0aF9kZnMpCit7CisJdHBfd21hX2hhbmRsZSB3bWE7CisKKwl3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCSpzY2FuX2NvbmZpZyA9IHdtYS0+ZHVhbF9tYWNfY2ZnLmN1cl9zY2FuX2NvbmZpZzsKKworCVdNSV9EQlNfQ09OQ19TQ0FOX0NGR19EQlNfU0NBTl9TRVQoKnNjYW5fY29uZmlnLCBkYnNfc2Nhbik7CisJV01JX0RCU19DT05DX1NDQU5fQ0ZHX0FHSUxFX1NDQU5fU0VUKCpzY2FuX2NvbmZpZywKKwkJCWRic19wbHVzX2FnaWxlX3NjYW4pOworCVdNSV9EQlNfQ09OQ19TQ0FOX0NGR19BR0lMRV9ERlNfU0NBTl9TRVQoKnNjYW5fY29uZmlnLAorCQkJc2luZ2xlX21hY19zY2FuX3dpdGhfZGZzKTsKKworCVdNQV9MT0dEKCIlczogKnNjYW5fY29uZmlnOiV4ICIsIF9fZnVuY19fLCAqc2Nhbl9jb25maWcpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2dldF91cGRhdGVkX2Z3X21vZGVfY29uZmlnKCkgLSBHZXQgdGhlIHVwZGF0ZWQgZncgbW9kZSBjb25maWd1cmF0aW9uCisgKiBAZndfbW9kZV9jb25maWc6IFBvaW50ZXIgY29udGFpbmluZyB0aGUgdXBkYXRlZCBmdyBtb2RlIGNvbmZpZworICogQGRiczogMCBvciAxIGluZGljYXRpbmcgaWYgREJTIG5lZWRzIHRvIGJlIGVuYWJsZWQvZGlzYWJsZWQKKyAqIEBhZ2lsZV9kZnM6IDAgb3IgMSBpbmRpY2F0aW5nIGlmIGFnaWxlIERGUyBuZWVkcyB0byBiZSBlbmFibGVkL2Rpc2FibGVkCisgKgorICogVGFrZXMgdGhlIGN1cnJlbnQgZncgbW9kZSBjb25maWd1cmF0aW9uIGFuZCBzZXQgdGhlIG5lY2Vzc2FyeSBmdyBtb2RlIGNvbmZpZworICogYml0cyB0byBlaXRoZXIgMC8xIGFuZCBwcm92aWRlcyB0aGUgdXBkYXRlZCB2YWx1ZSB0byB0aGUgY2FsbGVyIHdobworICogY2FuIHVzZSB0aGlzIHRvIHBhc3MgaXQgb24gdG8gdGhlIEZXCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MKKyAqLworQ0RGX1NUQVRVUyB3bWFfZ2V0X3VwZGF0ZWRfZndfbW9kZV9jb25maWcodWludDMyX3QgKmZ3X21vZGVfY29uZmlnLAorCQlib29sIGRicywKKwkJYm9vbCBhZ2lsZV9kZnMpCit7CisJdHBfd21hX2hhbmRsZSB3bWE7CisKKwl3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ0RGX1NUQVRVU19FX0ZBSUxVUkU7CisJfQorCSpmd19tb2RlX2NvbmZpZyA9IHdtYS0+ZHVhbF9tYWNfY2ZnLmN1cl9md19tb2RlX2NvbmZpZzsKKworCVdNSV9EQlNfRldfTU9ERV9DRkdfREJTX1NFVCgqZndfbW9kZV9jb25maWcsIGRicyk7CisJV01JX0RCU19GV19NT0RFX0NGR19BR0lMRV9ERlNfU0VUKCpmd19tb2RlX2NvbmZpZywgYWdpbGVfZGZzKTsKKworCVdNQV9MT0dEKCIlczogKmZ3X21vZGVfY29uZmlnOiV4ICIsIF9fZnVuY19fLCAqZndfbW9kZV9jb25maWcpOworCXJldHVybiBDREZfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogd21hX2dldF9kYnNfY29uZmlnKCkgLSBHZXQgREJTIGJpdAorICoKKyAqIEdldHMgdGhlIERCUyBiaXQgb2YgZndfbW9kZV9jb25maWdfYml0cworICoKKyAqIFJldHVybjogMCBvciAxIHRvIGluZGljYXRlIHRoZSBEQlMgYml0CisgKi8KK2Jvb2wgd21hX2dldF9kYnNfY29uZmlnKHZvaWQpCit7CisJdHBfd21hX2hhbmRsZSB3bWE7CisJdWludDMyX3QgZndfbW9kZV9jb25maWc7CisKKwlpZiAod21hX2lzX2R1YWxfbWFjX2Rpc2FibGVkX2luX2luaSgpKQorCQlyZXR1cm4gZmFsc2U7CisKKwl3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQkvKiBXZSB0YWtlIHRoYXQgaXQgaXMgZGlzYWJsZWQgYW5kIHByb2NlZWQgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKwlmd19tb2RlX2NvbmZpZyA9IHdtYS0+ZHVhbF9tYWNfY2ZnLmN1cl9md19tb2RlX2NvbmZpZzsKKworCXJldHVybiBXTUlfREJTX0ZXX01PREVfQ0ZHX0RCU19HRVQoZndfbW9kZV9jb25maWcpOworfQorCisvKioKKyAqIHdtYV9nZXRfYWdpbGVfZGZzX2NvbmZpZygpIC0gR2V0IEFnaWxlIERGUyBiaXQKKyAqCisgKiBHZXRzIHRoZSBBZ2lsZSBERlMgYml0IG9mIGZ3X21vZGVfY29uZmlnX2JpdHMKKyAqCisgKiBSZXR1cm46IDAgb3IgMSB0byBpbmRpY2F0ZSB0aGUgQWdpbGUgREZTIGJpdAorICovCitib29sIHdtYV9nZXRfYWdpbGVfZGZzX2NvbmZpZyh2b2lkKQoreworCXRwX3dtYV9oYW5kbGUgd21hOworCXVpbnQzMl90IGZ3X21vZGVfY29uZmlnOworCisJaWYgKHdtYV9pc19kdWFsX21hY19kaXNhYmxlZF9pbl9pbmkoKSkKKwkJcmV0dXJuIGZhbHNlOworCisJd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoIXdtYSkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgV01BIGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJLyogV2UgdGFrZSB0aGF0IGl0IGlzIGRpc2FibGVkIGFuZCBwcm9jZWVkICovCisJCXJldHVybiBmYWxzZTsKKwl9CisJZndfbW9kZV9jb25maWcgPSB3bWEtPmR1YWxfbWFjX2NmZy5jdXJfZndfbW9kZV9jb25maWc7CisKKwlyZXR1cm4gV01JX0RCU19GV19NT0RFX0NGR19BR0lMRV9ERlNfR0VUKGZ3X21vZGVfY29uZmlnKTsKK30KKworLyoqCisgKiB3bWFfZ2V0X2Ric19zY2FuX2NvbmZpZygpIC0gR2V0IERCUyBzY2FuIGJpdAorICoKKyAqIEdldHMgdGhlIERCUyBzY2FuIGJpdCBvZiBjb25jdXJyZW50X3NjYW5fY29uZmlnX2JpdHMKKyAqCisgKiBSZXR1cm46IDAgb3IgMSB0byBpbmRpY2F0ZSB0aGUgREJTIHNjYW4gYml0CisgKi8KK2Jvb2wgd21hX2dldF9kYnNfc2Nhbl9jb25maWcodm9pZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKwl1aW50MzJfdCBzY2FuX2NvbmZpZzsKKworCWlmICh3bWFfaXNfZHVhbF9tYWNfZGlzYWJsZWRfaW5faW5pKCkpCisJCXJldHVybiBmYWxzZTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCS8qIFdlIHRha2UgdGhhdCBpdCBpcyBkaXNhYmxlZCBhbmQgcHJvY2VlZCAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCXNjYW5fY29uZmlnID0gd21hLT5kdWFsX21hY19jZmcuY3VyX3NjYW5fY29uZmlnOworCisJcmV0dXJuIFdNSV9EQlNfQ09OQ19TQ0FOX0NGR19EQlNfU0NBTl9HRVQoc2Nhbl9jb25maWcpOworfQorCisvKioKKyAqIHdtYV9nZXRfZGJzX3BsdXNfYWdpbGVfc2Nhbl9jb25maWcoKSAtIEdldCBEQlMgcGx1cyBhZ2lsZSBzY2FuIGJpdAorICoKKyAqIEdldHMgdGhlIERCUyBwbHVzIGFnaWxlIHNjYW4gYml0IG9mIGNvbmN1cnJlbnRfc2Nhbl9jb25maWdfYml0cworICoKKyAqIFJldHVybjogMCBvciAxIHRvIGluZGljYXRlIHRoZSBEQlMgcGx1cyBhZ2lsZSBzY2FuIGJpdAorICovCitib29sIHdtYV9nZXRfZGJzX3BsdXNfYWdpbGVfc2Nhbl9jb25maWcodm9pZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKwl1aW50MzJfdCBzY2FuX2NvbmZpZzsKKworCWlmICh3bWFfaXNfZHVhbF9tYWNfZGlzYWJsZWRfaW5faW5pKCkpCisJCXJldHVybiBmYWxzZTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCS8qIFdlIHRha2UgdGhhdCBpdCBpcyBkaXNhYmxlZCBhbmQgcHJvY2VlZCAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCXNjYW5fY29uZmlnID0gd21hLT5kdWFsX21hY19jZmcuY3VyX3NjYW5fY29uZmlnOworCisJcmV0dXJuIFdNSV9EQlNfQ09OQ19TQ0FOX0NGR19BR0lMRV9TQ0FOX0dFVChzY2FuX2NvbmZpZyk7Cit9CisKKy8qKgorICogd21hX2dldF9zaW5nbGVfbWFjX3NjYW5fd2l0aF9kZnNfY29uZmlnKCkgLSBHZXQgU2luZ2xlIE1BQyBzY2FuIHdpdGggREZTIGJpdAorICoKKyAqIEdldHMgdGhlIFNpbmdsZSBNQUMgc2NhbiB3aXRoIERGUyBiaXQgb2YgY29uY3VycmVudF9zY2FuX2NvbmZpZ19iaXRzCisgKgorICogUmV0dXJuOiAwIG9yIDEgdG8gaW5kaWNhdGUgdGhlIFNpbmdsZSBNQUMgc2NhbiB3aXRoIERGUyBiaXQKKyAqLworYm9vbCB3bWFfZ2V0X3NpbmdsZV9tYWNfc2Nhbl93aXRoX2Rmc19jb25maWcodm9pZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKwl1aW50MzJfdCBzY2FuX2NvbmZpZzsKKworCWlmICh3bWFfaXNfZHVhbF9tYWNfZGlzYWJsZWRfaW5faW5pKCkpCisJCXJldHVybiBmYWxzZTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCS8qIFdlIHRha2UgdGhhdCBpdCBpcyBkaXNhYmxlZCBhbmQgcHJvY2VlZCAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCXNjYW5fY29uZmlnID0gd21hLT5kdWFsX21hY19jZmcuY3VyX3NjYW5fY29uZmlnOworCisJcmV0dXJuIFdNSV9EQlNfQ09OQ19TQ0FOX0NGR19BR0lMRV9ERlNfU0NBTl9HRVQoc2Nhbl9jb25maWcpOworfQorCisvKioKKyAqIHdtYV9pc19kdWFsX21hY19kaXNhYmxlZF9pbl9pbmkoKSAtIENoZWNrIGlmIGR1YWwgbWFjIGlzIGRpc2FibGVkIGluIElOSQorICoKKyAqIENoZWNrcyBpZiB0aGUgZHVhbCBtYWMgZmVhdHVyZSBpcyBkaXNhYmxlZCBpbiBJTkkKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgdGhlIGR1YWwgbWFjIGZlYXR1cmUgaXMgZGlzYWJsZWQgZnJvbSBJTkkKKyAqLworYm9vbCB3bWFfaXNfZHVhbF9tYWNfZGlzYWJsZWRfaW5faW5pKHZvaWQpCit7CisJdHBBbmlTaXJHbG9iYWwgbWFjID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfUEUpOworCisJaWYgKCFtYWMpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIG1hYyBwb2ludGVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlpZiAobWFjLT5kdWFsX21hY19mZWF0dXJlX2Rpc2FibGUpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIHdtYV9nZXRfcHJldl9kYnNfY29uZmlnKCkgLSBHZXQgcHJldiBEQlMgYml0CisgKgorICogR2V0cyB0aGUgcHJldmlvdXMgREJTIGJpdCBvZiBmd19tb2RlX2NvbmZpZ19iaXRzCisgKgorICogUmV0dXJuOiAwIG9yIDEgdG8gaW5kaWNhdGUgdGhlIERCUyBiaXQKKyAqLworYm9vbCB3bWFfZ2V0X3ByZXZfZGJzX2NvbmZpZyh2b2lkKQoreworCXRwX3dtYV9oYW5kbGUgd21hOworCXVpbnQzMl90IGZ3X21vZGVfY29uZmlnOworCisJaWYgKHdtYV9pc19kdWFsX21hY19kaXNhYmxlZF9pbl9pbmkoKSkKKwkJcmV0dXJuIGZhbHNlOworCisJd21hID0gY2RzX2dldF9jb250ZXh0KENERl9NT0RVTEVfSURfV01BKTsKKwlpZiAoIXdtYSkgeworCQlXTUFfTE9HRSgiJXM6IEludmFsaWQgV01BIGhhbmRsZSIsIF9fZnVuY19fKTsKKwkJLyogV2UgdGFrZSB0aGF0IGl0IGlzIGRpc2FibGVkIGFuZCBwcm9jZWVkICovCisJCXJldHVybiBmYWxzZTsKKwl9CisJZndfbW9kZV9jb25maWcgPSB3bWEtPmR1YWxfbWFjX2NmZy5wcmV2X2Z3X21vZGVfY29uZmlnOworCisJcmV0dXJuIFdNSV9EQlNfRldfTU9ERV9DRkdfREJTX0dFVChmd19tb2RlX2NvbmZpZyk7Cit9CisKKy8qKgorICogd21hX2dldF9wcmV2X2FnaWxlX2Rmc19jb25maWcoKSAtIEdldCBwcmV2IEFnaWxlIERGUyBiaXQKKyAqCisgKiBHZXRzIHRoZSBwcmV2aW91cyBBZ2lsZSBERlMgYml0IG9mIGZ3X21vZGVfY29uZmlnX2JpdHMKKyAqCisgKiBSZXR1cm46IDAgb3IgMSB0byBpbmRpY2F0ZSB0aGUgQWdpbGUgREZTIGJpdAorICovCitib29sIHdtYV9nZXRfcHJldl9hZ2lsZV9kZnNfY29uZmlnKHZvaWQpCit7CisJdHBfd21hX2hhbmRsZSB3bWE7CisJdWludDMyX3QgZndfbW9kZV9jb25maWc7CisKKwlpZiAod21hX2lzX2R1YWxfbWFjX2Rpc2FibGVkX2luX2luaSgpKQorCQlyZXR1cm4gZmFsc2U7CisKKwl3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQkvKiBXZSB0YWtlIHRoYXQgaXQgaXMgZGlzYWJsZWQgYW5kIHByb2NlZWQgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKwlmd19tb2RlX2NvbmZpZyA9IHdtYS0+ZHVhbF9tYWNfY2ZnLnByZXZfZndfbW9kZV9jb25maWc7CisKKwlyZXR1cm4gV01JX0RCU19GV19NT0RFX0NGR19BR0lMRV9ERlNfR0VUKGZ3X21vZGVfY29uZmlnKTsKK30KKworLyoqCisgKiB3bWFfZ2V0X3ByZXZfZGJzX3NjYW5fY29uZmlnKCkgLSBHZXQgcHJldiBEQlMgc2NhbiBiaXQKKyAqCisgKiBHZXRzIHRoZSBwcmV2aW91cyBEQlMgc2NhbiBiaXQgb2YgY29uY3VycmVudF9zY2FuX2NvbmZpZ19iaXRzCisgKgorICogUmV0dXJuOiAwIG9yIDEgdG8gaW5kaWNhdGUgdGhlIERCUyBzY2FuIGJpdAorICovCitib29sIHdtYV9nZXRfcHJldl9kYnNfc2Nhbl9jb25maWcodm9pZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKwl1aW50MzJfdCBzY2FuX2NvbmZpZzsKKworCWlmICh3bWFfaXNfZHVhbF9tYWNfZGlzYWJsZWRfaW5faW5pKCkpCisJCXJldHVybiBmYWxzZTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCS8qIFdlIHRha2UgdGhhdCBpdCBpcyBkaXNhYmxlZCBhbmQgcHJvY2VlZCAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCXNjYW5fY29uZmlnID0gd21hLT5kdWFsX21hY19jZmcucHJldl9zY2FuX2NvbmZpZzsKKworCXJldHVybiBXTUlfREJTX0NPTkNfU0NBTl9DRkdfREJTX1NDQU5fR0VUKHNjYW5fY29uZmlnKTsKK30KKworLyoqCisgKiB3bWFfZ2V0X3ByZXZfZGJzX3BsdXNfYWdpbGVfc2Nhbl9jb25maWcoKSAtIEdldCBwcmV2IERCUyBwbHVzIGFnaWxlIHNjYW4gYml0CisgKgorICogR2V0cyB0aGUgcHJldmlvdXMgREJTIHBsdXMgYWdpbGUgc2NhbiBiaXQgb2YgY29uY3VycmVudF9zY2FuX2NvbmZpZ19iaXRzCisgKgorICogUmV0dXJuOiAwIG9yIDEgdG8gaW5kaWNhdGUgdGhlIERCUyBwbHVzIGFnaWxlIHNjYW4gYml0CisgKi8KK2Jvb2wgd21hX2dldF9wcmV2X2Ric19wbHVzX2FnaWxlX3NjYW5fY29uZmlnKHZvaWQpCit7CisJdHBfd21hX2hhbmRsZSB3bWE7CisJdWludDMyX3Qgc2Nhbl9jb25maWc7CisKKwlpZiAod21hX2lzX2R1YWxfbWFjX2Rpc2FibGVkX2luX2luaSgpKQorCQlyZXR1cm4gZmFsc2U7CisKKwl3bWEgPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9XTUEpOworCWlmICghd21hKSB7CisJCVdNQV9MT0dFKCIlczogSW52YWxpZCBXTUEgaGFuZGxlIiwgX19mdW5jX18pOworCQkvKiBXZSB0YWtlIHRoYXQgaXQgaXMgZGlzYWJsZWQgYW5kIHByb2NlZWQgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKwlzY2FuX2NvbmZpZyA9IHdtYS0+ZHVhbF9tYWNfY2ZnLnByZXZfc2Nhbl9jb25maWc7CisKKwlyZXR1cm4gV01JX0RCU19DT05DX1NDQU5fQ0ZHX0FHSUxFX1NDQU5fR0VUKHNjYW5fY29uZmlnKTsKK30KKworLyoqCisgKiB3bWFfZ2V0X3ByZXZfc2luZ2xlX21hY19zY2FuX3dpdGhfZGZzX2NvbmZpZygpIC0gR2V0IHByZXYgU2luZ2xlIE1BQyBzY2FuCisgKiB3aXRoIERGUyBiaXQKKyAqCisgKiBHZXRzIHRoZSBwcmV2aW91cyBTaW5nbGUgTUFDIHNjYW4gd2l0aCBERlMgYml0IG9mIGNvbmN1cnJlbnRfc2Nhbl9jb25maWdfYml0cworICoKKyAqIFJldHVybjogMCBvciAxIHRvIGluZGljYXRlIHRoZSBTaW5nbGUgTUFDIHNjYW4gd2l0aCBERlMgYml0CisgKi8KK2Jvb2wgd21hX2dldF9wcmV2X3NpbmdsZV9tYWNfc2Nhbl93aXRoX2Rmc19jb25maWcodm9pZCkKK3sKKwl0cF93bWFfaGFuZGxlIHdtYTsKKwl1aW50MzJfdCBzY2FuX2NvbmZpZzsKKworCWlmICh3bWFfaXNfZHVhbF9tYWNfZGlzYWJsZWRfaW5faW5pKCkpCisJCXJldHVybiBmYWxzZTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCS8qIFdlIHRha2UgdGhhdCBpdCBpcyBkaXNhYmxlZCBhbmQgcHJvY2VlZCAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCXNjYW5fY29uZmlnID0gd21hLT5kdWFsX21hY19jZmcucHJldl9zY2FuX2NvbmZpZzsKKworCXJldHVybiBXTUlfREJTX0NPTkNfU0NBTl9DRkdfQUdJTEVfREZTX1NDQU5fR0VUKHNjYW5fY29uZmlnKTsKK30KKworLyoqCisgKiB3bWFfaXNfc2Nhbl9zaW11bHRhbmVvdXNfY2FwYWJsZSgpIC0gQ2hlY2sgaWYgc2NhbiBwYXJhbGxlbGl6YXRpb24gaXMKKyAqIHN1cHBvcnRlZCBvciBub3QKKyAqCisgKiBjdXJyZW50bHkgc2NhbiBwYXJhbGxlbGl6YXRpb24gZmVhdHVyZSBzdXBwb3J0IGlzIGRlcGVuZGVudCBvbiBEQlMgYnV0CisgKiBpdCBjYW4gYmUgaW5kZXBlbmRlbnQgaW4gZnV0dXJlLgorICoKKyAqIFJldHVybjogVHJ1ZSBpZiBtYXN0ZXIgREJTIGNvbnRyb2wgaXMgZW5hYmxlZAorICovCitib29sIHdtYV9pc19zY2FuX3NpbXVsdGFuZW91c19jYXBhYmxlKHZvaWQpCit7CisJaWYgKHdtYV9pc19od19kYnNfY2FwYWJsZSgpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvd21hL3NyYy93bWFfdXRpbHNfdXQuYyBiL2NvcmUvd21hL3NyYy93bWFfdXRpbHNfdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZjNmNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS93bWEvc3JjL3dtYV91dGlsc191dC5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqICBET0M6ICAgIHdtYV91dGlsc191dC5jCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHV0aWxpdGllcyByZWxhdGVkIHRvIHVuaXQgdGVzdCBmcmFtZXdvcmsKKyAqLworCisvKiBIZWFkZXIgZmlsZXMgKi8KKworI2luY2x1ZGUgIndtYS5oIgorCisvKioKKyAqIHdtYV9zZXRfZGJzX2NhcGFiaWxpdHlfdXQoKSAtIFNldCBEQlMgY2FwYWJpbGl0eSBmb3IgVVQgZnJhbWV3b3JrCisgKiBAZGJzOiBWYWx1ZSBvZiBEQlMgY2FwYWJpbGl0eSB0byBiZSBzZXQKKyAqCisgKiBTZXRzIHRoZSBEQlMgY2FwYWJpbGl0eSBmb3IgdW5pdCB0ZXN0IGZyYW1ld29yay4gSWYgdGhlIEhXIG1vZGUgaXMKKyAqIGFscmVhZHkgc2VudCBieSB0aGUgRlcsIG9ubHkgdGhlIERCUyBjYXBhYmlsaXR5IG5lZWRzIHRvIGJlIHNldC4gSWYgdGhlCisgKiBGVyBkaWQgbm90IHNlbmQgYW55IEhXIG1vZGUgbGlzdCwgYSBzaW5nbGUgZW50cnkgaXMgY3JlYXRlZCBhbmQgREJTIG1vZGUKKyAqIGlzIHNldCBpbiBpdC4gVGhlIERCUyBjYXBhYmlsaXR5IGlzIGFsc28gc2V0IGluIHRoZSBzZXJ2aWNlIGJpdCBtYXAuCisgKgorICogUmV0dXJuOiBOb25lCisgKi8KK3ZvaWQgd21hX3NldF9kYnNfY2FwYWJpbGl0eV91dCh1aW50MzJfdCBkYnMpCit7CisJdHBfd21hX2hhbmRsZSB3bWE7CisJdWludDMyX3QgaTsKKworCXdtYSA9IGNkc19nZXRfY29udGV4dChDREZfTU9EVUxFX0lEX1dNQSk7CisJaWYgKCF3bWEpIHsKKwkJV01BX0xPR0UoIiVzOiBJbnZhbGlkIFdNQSBoYW5kbGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBEQlMgbGlzdCB3YXMgbm90IGNvbmZpZ3VyZWQgYnkgdGhlIEZXLCBzbworCSAqIGZvciBVVCwgd2UgY2FuIGNvbmZpZ3VyZSBhIHNpbmdsZSBlbnRyeQorCSAqLworCWlmICh3bWEtPmh3X21vZGUuaHdfbW9kZV9saXN0ID09IE5VTEwpIHsKKwkJd21hLT5udW1fZGJzX2h3X21vZGVzID0gMTsKKwkJd21hLT5od19tb2RlLmh3X21vZGVfbGlzdCA9CisJCQljZGZfbWVtX21hbGxvYyhzaXplb2YoKndtYS0+aHdfbW9kZS5od19tb2RlX2xpc3QpICoKKwkJCQkJd21hLT5udW1fZGJzX2h3X21vZGVzKTsKKwkJaWYgKCF3bWEtPmh3X21vZGUuaHdfbW9kZV9saXN0KSB7CisJCQlXTUFfTE9HRSgiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgVVQtREJTIiwKKwkJCQkJX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisJCXdtYS0+aHdfbW9kZS5od19tb2RlX2xpc3RbMF0gPSAweDAwMDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHdtYS0+bnVtX2Ric19od19tb2RlczsgaSsrKSB7CisJCVdNSV9EQlNfSFdfTU9ERV9EQlNfTU9ERV9TRVQod21hLT5od19tb2RlLmh3X21vZGVfbGlzdFtpXSwKKwkJCQlkYnMpOworCX0KKworCVdNSV9TRVJWSUNFX0VOQUJMRSh3bWEtPndtaV9zZXJ2aWNlX2JpdG1hcCwKKwkJCVdNSV9TRVJWSUNFX0RVQUxfQkFORF9TSU1VTFRBTkVPVVNfU1VQUE9SVCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3dtaS93bWlfdGx2X2hlbHBlci5jIGIvY29yZS93bWkvd21pX3Rsdl9oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTM1NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS93bWkvd21pX3Rsdl9oZWxwZXIuYwpAQCAtMCwwICsxLDExOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qIHdtaV90bHZfcGxhdGZvcm0uYyBmaWxlIHdpbGwgYmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgY29tcG9uZW50cyBsaWtlIFByb250byBmaXJtd2FyZSwgUHJvbnRvIHdpbmRvd3MgaG9zdCBkcml2ZXIsCisgICAgIFByb250byBMQSBob3N0IGRyaXZlciBiZWNhdXNlIHRoZWlyIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBhcmUgZGlmZmVyZW50ICovCisjaW5jbHVkZSAid21pX3Rsdl9wbGF0Zm9ybS5jIgorI2luY2x1ZGUgIndtaV90bHZfZGVmcy5oIgorI2luY2x1ZGUgIndtaV92ZXJzaW9uLmgiCisKKyNkZWZpbmUgV01JVExWX0dFVF9BVFRSSUJfTlVNX1RMVlMgIDB4RkZGRkZGRkYKKworI2RlZmluZSBXTUlUTFZfR0VUX0NNRElEKHZhbCkgKHZhbCAmIDB4MDBGRkZGRkYpCisjZGVmaW5lIFdNSVRMVl9HRVRfTlVNX1RMVlModmFsKSAoKHZhbCA+PiAyNCkgJiAweEZGKQorCisjZGVmaW5lIFdNSVRMVl9HRVRfVEFHSUQodmFsKSAodmFsICYgMHgwMDAwMEZGRikKKyNkZWZpbmUgV01JVExWX0dFVF9UQUdfU1RSVUNUX1NJWkUodmFsKSAoKHZhbCA+PiAxMikgJiAweDAwMDAwMUZGKQorI2RlZmluZSBXTUlUTFZfR0VUX1RBR19BUlJBWV9TSVpFKHZhbCkgKCh2YWwgPj4gMjEpICYgMHgwMDAwMDFGRikKKyNkZWZpbmUgV01JVExWX0dFVF9UQUdfVkFSSUVEKHZhbCkgKCh2YWwgPj4gMzApICYgMHgwMDAwMDAwMSkKKworI2RlZmluZSBXTUlUTFZfU0VUX0FUVFJCMChpZCkgKChXTUlUTFZfR0VUX1RBR19OVU1fVExWX0FUVFJJQihpZCkgPDwgMjQpIHwgKGlkICYgMHgwMEZGRkZGRikpCisjZGVmaW5lIFdNSVRMVl9TRVRfQVRUUkIxKHRhZ0lELCB0YWdTdHJ1Y3RTaXplLCB0YWdBcnJheVNpemUsIHRhZ1ZhcmllZCkgKCgodGFnVmFyaWVkJjB4MSk8PDMwKSB8ICgodGFnQXJyYXlTaXplJjB4MUZGKTw8MjEpIHwgKCh0YWdTdHJ1Y3RTaXplJjB4MUZGKTw8MTIpIHwgKHRhZ0lEJjB4RkZGKSkKKworI2RlZmluZSBXTUlUTFZfT1BfU0VUX1RMVl9BVFRSSUJfbWFjcm8ocGFyYW1fcHRyLCBwYXJhbV9sZW4sIHdtaV9jbWRfZXZlbnRfaWQsIGVsZW1fdGx2X3RhZywgZWxlbV9zdHJ1Y190eXBlLCBlbGVtX25hbWUsIHZhcl9sZW4sIGFycl9zaXplKSAgXAorCVdNSVRMVl9TRVRfQVRUUkIxKGVsZW1fdGx2X3RhZywgc2l6ZW9mKGVsZW1fc3RydWNfdHlwZSksIGFycl9zaXplLCB2YXJfbGVuKSwKKworI2RlZmluZSBXTUlUTFZfR0VUX0NNRF9FVlRfQVRUUkJfTElTVChpZCkgXAorCVdNSVRMVl9TRVRfQVRUUkIwKGlkKSwgXAorCVdNSVRMVl9UQUJMRShpZCxTRVRfVExWX0FUVFJJQixOVUxMLDApCisKK0FfVUlOVDMyIGNtZF9hdHRyX2xpc3RbXSA9IHsKKwlXTUlUTFZfQUxMX0NNRF9MSVNUKFdNSVRMVl9HRVRfQ01EX0VWVF9BVFRSQl9MSVNUKQorfTsKKworQV9VSU5UMzIgZXZ0X2F0dHJfbGlzdFtdID0geworCVdNSVRMVl9BTExfRVZUX0xJU1QoV01JVExWX0dFVF9DTURfRVZUX0FUVFJCX0xJU1QpCit9OworCisjaWZkZWYgTk9fRFlOQU1JQ19NRU1fQUxMT0MKK3N0YXRpYyB3bWl0bHZfY21kX3BhcmFtX2luZm8gKmdfd21pX3N0YXRpY19jbWRfcGFyYW1faW5mb19idWYgPSBOVUxMOworQV9VSU5UMzIgZ193bWlfc3RhdGljX21heF9jbWRfcGFyYW1fdGx2cyA9IDA7CisjZW5kaWYKKworLyogVExWIGhlbHBlciByb3V0aW5lcyAqLworCisvKgorICogV01JIFRMViBIZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHRoZSBzdGF0aWMgY21kX3BhcmFtX3RsdiBzdHJ1Y3R1cmUgYW5kIG51bWJlciBvZiBUTFZzIHRoYXQgY2FuIGJlCisgKiBhY2NvbW9kYXRlZCBpbiB0aGUgc3RydWN0dXJlLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHdoZW4gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBpcyBub3QKKyAqIHN1cHBvcnRlZC4KKyAqCisgKiBXaGVuIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbnkgY29tcG9uZW50IHRoZW4gTk9fRFlOQU1JQ19NRU1BTExPQworICogbWFjcm8gaGFzIHRvIGJlIGRlZmluZWQgaW4gcmVzcGVjdGl2ZSB0bHZfcGxhdGZvcm0uYyBmaWxlLiBBbmQgcmVzcGVjdGl2ZSBjb21wb25lbnQgaGFzIHRvIGFsbG9jYXRlCisgKiBjbWRfcGFyYW1fdGx2IHN0cnVjdHVyZSBidWZmZXIgdG8gYWNjb21vZGF0ZSB3aGF0ZXZlciBudW1iZXIgb2YgVExWJ3MuIEJvdGggdGhlIGJ1ZmZlciBhZGRyZXNzCisgKiBhbmQgbnVtYmVyIG9mIFRMVidzIHRoYXQgY2FuIGJlIGFjY29tb2RhdGVkIGluIHRoZSBidWZmZXIgc2hvdWxkIGJlIHNlbnQgYXMgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJuIE5vbmUKKyAqLwordm9pZAord21pdGx2X3NldF9zdGF0aWNfcGFyYW1fdGx2X2J1Zih2b2lkICpwYXJhbV90bHZfYnVmLAorCQkJCUFfVUlOVDMyIG1heF90bHZzX2FjY29tb2RhdGVkKQoreworI2lmZGVmIE5PX0RZTkFNSUNfTUVNX0FMTE9DCisJZ193bWlfc3RhdGljX2NtZF9wYXJhbV9pbmZvX2J1ZiA9IHBhcmFtX3Rsdl9idWY7CisJZ193bWlfc3RhdGljX21heF9jbWRfcGFyYW1fdGx2cyA9IG1heF90bHZzX2FjY29tb2RhdGVkOworI2VuZGlmCit9CisKKy8qCisgKiBXTUkgVExWIEhlbHBlciBmdW5jdGlvbnMgdG8gZmluZCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgQ29tbWFuZC9FdmVudCBUTFZzLgorICogUmV0dXJuIDAgaWYgc3VjY2Vzcy4gUmV0dXJuID49MSBpZiBmYWlsdXJlLgorICovCitBX1VJTlQzMiB3bWl0bHZfZ2V0X2F0dHJpYnV0ZXMoQV9VSU5UMzIgaXNfY21kX2lkLCBBX1VJTlQzMiBjbWRfZXZlbnRfaWQsCisJCQkgICAgICAgQV9VSU5UMzIgY3Vycl90bHZfb3JkZXIsCisJCQkgICAgICAgd21pdGx2X2F0dHJpYnV0ZXNfc3RydWMgKnRsdl9hdHRyX3B0cikKK3sKKwlBX1VJTlQzMiBpLCBiYXNlX2luZGV4LCBudW1fdGx2cywgbnVtX2VudHJpZXM7CisJQV9VSU5UMzIgKnBBdHRyQXJyYXlMaXN0OworCisJaWYgKGlzX2NtZF9pZCkgeworCQlwQXR0ckFycmF5TGlzdCA9ICZjbWRfYXR0cl9saXN0WzBdOworCQludW1fZW50cmllcyA9IENERl9BUlJBWV9TSVpFKGNtZF9hdHRyX2xpc3QpOworCX0gZWxzZSB7CisJCXBBdHRyQXJyYXlMaXN0ID0gJmV2dF9hdHRyX2xpc3RbMF07CisJCW51bV9lbnRyaWVzID0gQ0RGX0FSUkFZX1NJWkUoZXZ0X2F0dHJfbGlzdCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKwkJbnVtX3RsdnMgPSBXTUlUTFZfR0VUX05VTV9UTFZTKHBBdHRyQXJyYXlMaXN0W2ldKTsKKwkJaWYgKFdNSVRMVl9HRVRfQ01ESUQoY21kX2V2ZW50X2lkKSA9PQorCQkgICAgV01JVExWX0dFVF9DTURJRChwQXR0ckFycmF5TGlzdFtpXSkpIHsKKwkJCXRsdl9hdHRyX3B0ci0+Y21kX251bV90bHYgPSBudW1fdGx2czsKKwkJCS8qIFJldHVybiBzdWNjZXNzIGZyb20gaGVyZSB3aGVuIG9ubHkgbnVtYmVyIG9mIFRMVlMgZm9yIHRoaXMgY29tbWFuZC9ldmVudCBpcyByZXF1aXJlZCAqLworCQkJaWYgKGN1cnJfdGx2X29yZGVyID09IFdNSVRMVl9HRVRfQVRUUklCX05VTV9UTFZTKSB7CisJCQkJd21pX3Rsdl9wcmludF92ZXJib3NlCisJCQkJCSgiJXM6IFdNSSBUTFYgYXR0cmlidXRlIGRlZmluaXRpb25zIGZvciAlczoweCV4IGZvdW5kOyBudW1fb2ZfdGx2czolZFxuIiwKKwkJCQkJX19mdW5jX18sIChpc19jbWRfaWQgPyAiQ21kIiA6ICJFdnQiKSwKKwkJCQkJY21kX2V2ZW50X2lkLCBudW1fdGx2cyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCS8qIFJldHVybiBmYWlsdXJlIGlmIHRsdl9vcmRlciBpcyBtb3JlIHRoYW4gdGhlIGV4cGVjdGVkIG51bWJlciBvZiBUTFZzICovCisJCQlpZiAoY3Vycl90bHZfb3JkZXIgPj0gbnVtX3RsdnMpIHsKKwkJCQl3bWlfdGx2X3ByaW50X2Vycm9yCisJCQkJCSgiJXM6IEVSUk9SOiBUTFYgb3JkZXIgJWQgZ3JlYXRlciB0aGFuIG51bV9vZl90bHZzOiVkIGZvciAlczoweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgY3Vycl90bHZfb3JkZXIsIG51bV90bHZzLAorCQkJCQkoaXNfY21kX2lkID8gIkNtZCIgOiAiRXZ0IiksIGNtZF9ldmVudF9pZCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCWJhc2VfaW5kZXggPSBpICsgMTsgICAgIC8qIGluZGV4IHRvIGZpcnN0IFRMViBhdHRyaWJ1dGVzICovCisJCQl3bWlfdGx2X3ByaW50X3ZlcmJvc2UKKwkJCQkoIiVzOiBXTUkgVExWIGF0dHJpYnV0ZXMgZm9yICVzOjB4JXggdGx2WyVkXToweCV4XG4iLAorCQkJCV9fZnVuY19fLCAoaXNfY21kX2lkID8gIkNtZCIgOiAiRXZ0IiksCisJCQkJY21kX2V2ZW50X2lkLCBjdXJyX3Rsdl9vcmRlciwKKwkJCQlwQXR0ckFycmF5TGlzdFsoYmFzZV9pbmRleCArIGN1cnJfdGx2X29yZGVyKV0pOworCQkJdGx2X2F0dHJfcHRyLT50YWdfb3JkZXIgPSBjdXJyX3Rsdl9vcmRlcjsKKwkJCXRsdl9hdHRyX3B0ci0+dGFnX2lkID0KKwkJCQlXTUlUTFZfR0VUX1RBR0lEKHBBdHRyQXJyYXlMaXN0CisJCQkJCQkgWyhiYXNlX2luZGV4ICsgY3Vycl90bHZfb3JkZXIpXSk7CisJCQl0bHZfYXR0cl9wdHItPnRhZ19zdHJ1Y3Rfc2l6ZSA9CisJCQkJV01JVExWX0dFVF9UQUdfU1RSVUNUX1NJWkUocEF0dHJBcnJheUxpc3QKKwkJCQkJCQkgICBbKGJhc2VfaW5kZXggKworCQkJCQkJCSAgICAgY3Vycl90bHZfb3JkZXIpXSk7CisJCQl0bHZfYXR0cl9wdHItPnRhZ192YXJpZWRfc2l6ZSA9CisJCQkJV01JVExWX0dFVF9UQUdfVkFSSUVEKHBBdHRyQXJyYXlMaXN0CisJCQkJCQkgICAgICBbKGJhc2VfaW5kZXggKworCQkJCQkJCWN1cnJfdGx2X29yZGVyKV0pOworCQkJdGx2X2F0dHJfcHRyLT50YWdfYXJyYXlfc2l6ZSA9CisJCQkJV01JVExWX0dFVF9UQUdfQVJSQVlfU0laRShwQXR0ckFycmF5TGlzdAorCQkJCQkJCSAgWyhiYXNlX2luZGV4ICsKKwkJCQkJCQkgICAgY3Vycl90bHZfb3JkZXIpXSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpICs9IG51bV90bHZzOworCX0KKworCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJKCIlczogRVJST1I6IERpZG4ndCBmb3VuZCBXTUkgVExWIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBmb3IgJXM6MHgleFxuIiwKKwkJX19mdW5jX18sIChpc19jbWRfaWQgPyAiQ21kIiA6ICJFdnQiKSwgY21kX2V2ZW50X2lkKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEhlbHBlciBGdW5jdGlvbiB0byB2YWlkYXRlIHRoZSBwcmVwYXJlZCBUTFYncyBmb3IgYW4gV01JIGV2ZW50L2NvbW1hbmQgdG8gYmUgc2VudAorICogUmV0dXJuIDAgaWYgc3VjY2Vzcy4KKyAqICAgICAgICAgICA8MCBpZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50Cit3bWl0bHZfY2hlY2tfdGx2X3BhcmFtcyh2b2lkICpvc19oYW5kbGUsIHZvaWQgKnBhcmFtX3N0cnVjX3B0ciwKKwkJCUFfVUlOVDMyIHBhcmFtX2J1Zl9sZW4sIEFfVUlOVDMyIGlzX2NtZF9pZCwKKwkJCUFfVUlOVDMyIHdtaV9jbWRfZXZlbnRfaWQpCit7CisJd21pdGx2X2F0dHJpYnV0ZXNfc3RydWMgYXR0cl9zdHJ1Y3RfcHRyOworCUFfVUlOVDMyIGJ1Zl9pZHggPSAwOworCUFfVUlOVDMyIHRsdl9pbmRleCA9IDA7CisJQV9VSU5UOCAqYnVmX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopcGFyYW1fc3RydWNfcHRyOworCUFfVUlOVDMyIGV4cGVjdGVkX251bV90bHZzLCBleHBlY3RlZF90bHZfbGVuOworCisJLyogR2V0IHRoZSBudW1iZXIgb2YgVExWcyBmb3IgdGhpcyBjb21tYW5kL2V2ZW50ICovCisJaWYgKHdtaXRsdl9nZXRfYXR0cmlidXRlcworCQkgICAgKGlzX2NtZF9pZCwgd21pX2NtZF9ldmVudF9pZCwgV01JVExWX0dFVF9BVFRSSUJfTlVNX1RMVlMsCisJCSAgICAmYXR0cl9zdHJ1Y3RfcHRyKSAhPSAwKSB7CisJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCSgiJXM6IEVSUk9SOiBDb3VsZG4ndCBnZXQgZXhwZWN0ZWQgbnVtYmVyIG9mIFRMVnMgZm9yIENtZD0lZFxuIiwKKwkJCV9fZnVuY19fLCB3bWlfY21kX2V2ZW50X2lkKTsKKwkJZ290byBFcnJvcl93bWl0bHZfY2hlY2tfdGx2X3BhcmFtczsKKwl9CisKKwkvKiBOT1RFOiB0aGUgcmV0dXJuZWQgbnVtYmVyIG9mIFRMVnMgaXMgaW4gImF0dHJfc3RydWN0X3B0ci5jbWRfbnVtX3RsdiIgKi8KKworCWV4cGVjdGVkX251bV90bHZzID0gYXR0cl9zdHJ1Y3RfcHRyLmNtZF9udW1fdGx2OworCisJd2hpbGUgKChidWZfaWR4ICsgV01JX1RMVl9IRFJfU0laRSkgPD0gcGFyYW1fYnVmX2xlbikgeworCQlBX1VJTlQzMiBjdXJyX3Rsdl90YWcgPQorCQkJV01JVExWX0dFVF9UTFZUQUcoV01JVExWX0dFVF9IRFIoYnVmX3B0cikpOworCQlBX1VJTlQzMiBjdXJyX3Rsdl9sZW4gPQorCQkJV01JVExWX0dFVF9UTFZMRU4oV01JVExWX0dFVF9IRFIoYnVmX3B0cikpOworCisJCWlmICgoYnVmX2lkeCArIFdNSV9UTFZfSERSX1NJWkUgKyBjdXJyX3Rsdl9sZW4pID4gcGFyYW1fYnVmX2xlbikgeworCQkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJCSgiJXM6IEVSUk9SOiBJbnZhbGlkIFRMViBsZW5ndGggZm9yIENtZD0lZCBUYWdfb3JkZXI9JWQgYnVmX2lkeD0lZCBUYWc6JWQgTGVuOiVkIFRvdGFsTGVuOiVkXG4iLAorCQkJCV9fZnVuY19fLCB3bWlfY21kX2V2ZW50X2lkLCB0bHZfaW5kZXgsIGJ1Zl9pZHgsCisJCQkJY3Vycl90bHZfdGFnLCBjdXJyX3Rsdl9sZW4sIHBhcmFtX2J1Zl9sZW4pOworCQkJZ290byBFcnJvcl93bWl0bHZfY2hlY2tfdGx2X3BhcmFtczsKKwkJfQorCisJCS8qIEdldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgVExWIHdpdGggdGhlIGdpdmVuIG9yZGVyIGluICJ0bHZfaW5kZXgiICovCisJCXdtaV90bHZfT1NfTUVNWkVSTygmYXR0cl9zdHJ1Y3RfcHRyLAorCQkJCSAgIHNpemVvZih3bWl0bHZfYXR0cmlidXRlc19zdHJ1YykpOworCQlpZiAod21pdGx2X2dldF9hdHRyaWJ1dGVzCisJCQkgICAgKGlzX2NtZF9pZCwgd21pX2NtZF9ldmVudF9pZCwgdGx2X2luZGV4LAorCQkJICAgICZhdHRyX3N0cnVjdF9wdHIpICE9IDApIHsKKwkJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCQkoIiVzOiBFUlJPUjogTm8gVExWIGF0dHJpYnV0ZXMgZm91bmQgZm9yIENtZD0lZCBUYWdfb3JkZXI9JWRcbiIsCisJCQkJX19mdW5jX18sIHdtaV9jbWRfZXZlbnRfaWQsIHRsdl9pbmRleCk7CisJCQlnb3RvIEVycm9yX3dtaXRsdl9jaGVja190bHZfcGFyYW1zOworCQl9CisKKwkJLyogRm91bmQgdGhlIFRMViB0aGF0IHdlIHdhbnRlZCAqLworCQl3bWlfdGx2X3ByaW50X3ZlcmJvc2UoIiVzOiBbdGx2ICVkXTogdGFnPSVkLCBsZW49JWRcbiIsCisJCQkJICAgICAgX19mdW5jX18sIHRsdl9pbmRleCwgY3Vycl90bHZfdGFnLAorCQkJCSAgICAgIGN1cnJfdGx2X2xlbik7CisKKwkJLyogVmFsaWRhdGluZyBUYWcgSUQgb3JkZXIgKi8KKwkJaWYgKGN1cnJfdGx2X3RhZyAhPSBhdHRyX3N0cnVjdF9wdHIudGFnX2lkKSB7CisJCQl3bWlfdGx2X3ByaW50X2Vycm9yCisJCQkJKCIlczogRVJST1I6IFRMViBoYXMgd3JvbmcgdGFnIGluIG9yZGVyIGZvciBDbWQ9MHgleC4gR2l2ZW49JWQsIEV4cGVjdGVkPSVkLlxuIiwKKwkJCQlfX2Z1bmNfXywgd21pX2NtZF9ldmVudF9pZCwgY3Vycl90bHZfdGFnLAorCQkJCWF0dHJfc3RydWN0X3B0ci50YWdfaWQpOworCQkJZ290byBFcnJvcl93bWl0bHZfY2hlY2tfdGx2X3BhcmFtczsKKwkJfQorCisJCS8qIFZhbGlkYXRlIFRhZyBsZW5ndGggKi8KKwkJLyogQXJyYXkgVExWcyBsZW5ndGggY2hlY2tpbmcgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyAqLworCQlpZiAoKGN1cnJfdGx2X3RhZyA+PSBXTUlUTFZfVEFHX0ZJUlNUX0FSUkFZX0VOVU0pCisJCSAgICAmJiAoY3Vycl90bHZfdGFnIDw9IFdNSVRMVl9UQUdfTEFTVF9BUlJBWV9FTlVNKSkgeworCQkJaWYgKGF0dHJfc3RydWN0X3B0ci50YWdfdmFyaWVkX3NpemUgPT0gV01JVExWX1NJWkVfRklYKSB7CisJCQkJLyogQXJyYXkgc2l6ZSBjYW4ndCBiZSBpbnZhbGlkIGZvciBmaXhlZCBzaXplIEFycmF5IFRMViAqLworCQkJCWlmIChXTUlUTFZfQVJSX1NJWkVfSU5WQUxJRCA9PQorCQkJCSAgICBhdHRyX3N0cnVjdF9wdHIudGFnX2FycmF5X3NpemUpIHsKKwkJCQkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJCQkJKCIlczogRVJST1I6IGFycmF5X3NpemUgY2FuJ3QgYmUgaW52YWxpZCBmb3IgQXJyYXkgVExWIENtZD0weCV4IFRhZz0lZFxuIiwKKwkJCQkJCV9fZnVuY19fLCB3bWlfY21kX2V2ZW50X2lkLAorCQkJCQkJY3Vycl90bHZfdGFnKTsKKwkJCQkJZ290byBFcnJvcl93bWl0bHZfY2hlY2tfdGx2X3BhcmFtczsKKwkJCQl9CisKKwkJCQlleHBlY3RlZF90bHZfbGVuID0KKwkJCQkJYXR0cl9zdHJ1Y3RfcHRyLnRhZ19hcnJheV9zaXplICoKKwkJCQkJYXR0cl9zdHJ1Y3RfcHRyLnRhZ19zdHJ1Y3Rfc2l6ZTsKKwkJCQkvKiBQYWRkZGluZyBpcyBvbmx5IHJlcXVpcmVkIGZvciBCeXRlIGFycmF5IFRsdnMgYWxsIG90aGVyIGFycmF5IHRsdidzIHNob3VsZCBiZSBhbGlnbmVkIHRvIDQgYnl0ZXMgZHVyaW5nIHRoZWlyIGRlZmluaXRpb24gKi8KKwkJCQlpZiAoV01JVExWX1RBR19BUlJBWV9CWVRFID09CisJCQkJICAgIGF0dHJfc3RydWN0X3B0ci50YWdfaWQpIHsKKwkJCQkJZXhwZWN0ZWRfdGx2X2xlbiA9CisJCQkJCQlyb3VuZHVwKGV4cGVjdGVkX3Rsdl9sZW4sCisJCQkJCQkJc2l6ZW9mKEFfVUlOVDMyKSk7CisJCQkJfQorCisJCQkJaWYgKGN1cnJfdGx2X2xlbiAhPSBleHBlY3RlZF90bHZfbGVuKSB7CisJCQkJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCQkJCSgiJXM6IEVSUk9SOiBUTFYgaGFzIHdyb25nIGxlbmd0aCBmb3IgQ21kPTB4JXguIFRhZ19vcmRlcj0lZCAgVGFnPSVkLCBHaXZlbl9MZW46JWQgRXhwZWN0ZWRfTGVuPSVkLlxuIiwKKwkJCQkJCV9fZnVuY19fLCB3bWlfY21kX2V2ZW50X2lkLAorCQkJCQkJdGx2X2luZGV4LCBjdXJyX3Rsdl90YWcsCisJCQkJCQljdXJyX3Rsdl9sZW4sIGV4cGVjdGVkX3Rsdl9sZW4pOworCQkJCQlnb3RvIEVycm9yX3dtaXRsdl9jaGVja190bHZfcGFyYW1zOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogQXJyYXkgc2l6ZSBzaG91bGQgYmUgaW52YWxpZCBmb3IgdmFyaWFibGUgc2l6ZSBBcnJheSBUTFYgKi8KKwkJCQlpZiAoV01JVExWX0FSUl9TSVpFX0lOVkFMSUQgIT0KKwkJCQkgICAgYXR0cl9zdHJ1Y3RfcHRyLnRhZ19hcnJheV9zaXplKSB7CisJCQkJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCQkJCSgiJXM6IEVSUk9SOiBhcnJheV9zaXplIHNob3VsZCBiZSBpbnZhbGlkIGZvciBBcnJheSBUTFYgQ21kPTB4JXggVGFnPSVkXG4iLAorCQkJCQkJX19mdW5jX18sIHdtaV9jbWRfZXZlbnRfaWQsCisJCQkJCQljdXJyX3Rsdl90YWcpOworCQkJCQlnb3RvIEVycm9yX3dtaXRsdl9jaGVja190bHZfcGFyYW1zOworCQkJCX0KKworCQkJCS8qIEluY2FzZSBvZiB2YXJpYWJsZSBsZW5ndGggVExWJ3MsIHRoZXJlIGlzIG5vIGV4cGVjdGF0aW9uIG9uIHRoZSBsZW5ndGggZmllbGQgc28gZG8gd2hhdGV2ZXIgY2hlY2tpbmcKKwkJCQkgICB5b3UgY2FuIGRlcGVuZGluZyBvbiB0aGUgVExWIHRhZyBpZiBUTFYgbGVuZ3RoIGlzIG5vbi16ZXJvICovCisJCQkJaWYgKGN1cnJfdGx2X2xlbiAhPSAwKSB7CisJCQkJCS8qIFZlcmlmeSBUTFYgbGVuZ3RoIGlzIGFsaWduZWQgdG8gdGhlIHNpemUgb2Ygc3RydWN0dXJlICovCisJCQkJCWlmICgoY3Vycl90bHZfbGVuICUKKwkJCQkJICAgICBhdHRyX3N0cnVjdF9wdHIudGFnX3N0cnVjdF9zaXplKSAhPQorCQkJCQkgICAgMCkgeworCQkJCQkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJCQkJCSgiJXM6IEVSUk9SOiBUTFYgbGVuZ3RoICVkIGZvciBDbWQ9MHgleCBpcyBub3QgYWxpZ25lZCB0byBzaXplIG9mIHN0cnVjdHVyZSglZCBieXRlcylcbiIsCisJCQkJCQkJX19mdW5jX18sIGN1cnJfdGx2X2xlbiwKKwkJCQkJCQl3bWlfY21kX2V2ZW50X2lkLAorCQkJCQkJCWF0dHJfc3RydWN0X3B0ci4KKwkJCQkJCQl0YWdfc3RydWN0X3NpemUpOworCQkJCQkJZ290byBFcnJvcl93bWl0bHZfY2hlY2tfdGx2X3BhcmFtczsKKwkJCQkJfQorCisJCQkJCWlmIChjdXJyX3Rsdl90YWcgPT0KKwkJCQkJICAgIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMpIHsKKwkJCQkJCUFfVUlOVDggKnRsdl9idWZfcHRyID0gTlVMTDsKKwkJCQkJCUFfVUlOVDMyIGluX3Rsdl9sZW47CisJCQkJCQlBX1VJTlQzMiBpZHg7CisJCQkJCQlBX1VJTlQzMiBudW1fb2ZfZWxlbXM7CisKKwkJCQkJCS8qIFZlcmlmeSBsZW5ndGggb2YgaW5uZXIgVExWcyAqLworCisJCQkJCQludW1fb2ZfZWxlbXMgPQorCQkJCQkJCWN1cnJfdGx2X2xlbiAvCisJCQkJCQkJYXR0cl9zdHJ1Y3RfcHRyLgorCQkJCQkJCXRhZ19zdHJ1Y3Rfc2l6ZTsKKwkJCQkJCS8qIFNldCB0bHZfYnVmX3B0ciB0byB0aGUgZmlyc3QgaW5uZXIgVExWIGFkZHJlc3MgKi8KKwkJCQkJCXRsdl9idWZfcHRyID0KKwkJCQkJCQlidWZfcHRyICsgV01JX1RMVl9IRFJfU0laRTsKKwkJCQkJCWZvciAoaWR4ID0gMDsKKwkJCQkJCSAgICAgaWR4IDwgbnVtX29mX2VsZW1zOworCQkJCQkJICAgICBpZHgrKykgeworCQkJCQkJCWluX3Rsdl9sZW4gPQorCQkJCQkJCQlXTUlUTFZfR0VUX1RMVkxFTgorCQkJCQkJCQkJKFdNSVRMVl9HRVRfSERSCisJCQkJCQkJCQkJKHRsdl9idWZfcHRyKSk7CisJCQkJCQkJaWYgKChpbl90bHZfbGVuICsKKwkJCQkJCQkgICAgIFdNSV9UTFZfSERSX1NJWkUpCisJCQkJCQkJICAgICE9CisJCQkJCQkJICAgIGF0dHJfc3RydWN0X3B0ci4KKwkJCQkJCQkgICAgdGFnX3N0cnVjdF9zaXplKSB7CisJCQkJCQkJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCQkJCQkJCSgiJXM6IEVSUk9SOiBUTFYgaGFzIHdyb25nIGxlbmd0aCBmb3IgQ21kPTB4JXguIFRhZ19vcmRlcj0lZCAgVGFnPSVkLCBHaXZlbl9MZW46JXp1IEV4cGVjdGVkX0xlbj0lZC5cbiIsCisJCQkJCQkJCQlfX2Z1bmNfXywKKwkJCQkJCQkJCXdtaV9jbWRfZXZlbnRfaWQsCisJCQkJCQkJCQl0bHZfaW5kZXgsCisJCQkJCQkJCQljdXJyX3Rsdl90YWcsCisJCQkJCQkJCQkoaW5fdGx2X2xlbgorCQkJCQkJCQkJICsKKwkJCQkJCQkJCSBXTUlfVExWX0hEUl9TSVpFKSwKKwkJCQkJCQkJCWF0dHJfc3RydWN0X3B0ci4KKwkJCQkJCQkJCXRhZ19zdHJ1Y3Rfc2l6ZSk7CisJCQkJCQkJCWdvdG8gRXJyb3Jfd21pdGx2X2NoZWNrX3Rsdl9wYXJhbXM7CisJCQkJCQkJfQorCQkJCQkJCXRsdl9idWZfcHRyICs9CisJCQkJCQkJCWluX3Rsdl9sZW4gKworCQkJCQkJCQlXTUlfVExWX0hEUl9TSVpFOworCQkJCQkJfQorCQkJCQl9IGVsc2UKKwkJCQkJaWYgKChjdXJyX3Rsdl90YWcgPT0KKwkJCQkJICAgICBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMikKKwkJCQkJICAgIHx8IChjdXJyX3Rsdl90YWcgPT0KKwkJCQkJCVdNSVRMVl9UQUdfQVJSQVlfQllURSkKKwkJCQkJICAgIHx8IChjdXJyX3Rsdl90YWcgPT0KKwkJCQkJCVdNSVRMVl9UQUdfQVJSQVlfRklYRURfU1RSVUMpKQorCQkJCQl7CisJCQkJCQkvKiBOb3RoaW5nIHRvIHZlcmlmeSBoZXJlICovCisJCQkJCX0gZWxzZSB7CisJCQkJCQl3bWlfdGx2X3ByaW50X2Vycm9yCisJCQkJCQkJKCIlcyBFUlJPUiBOZWVkIHRvIGhhbmRsZSB0aGUgQXJyYXkgdGx2ICVkIGZvciB2YXJpYWJsZSBsZW5ndGggZm9yIENtZD0weCV4XG4iLAorCQkJCQkJCV9fZnVuY19fLAorCQkJCQkJCWF0dHJfc3RydWN0X3B0ci50YWdfaWQsCisJCQkJCQkJd21pX2NtZF9ldmVudF9pZCk7CisJCQkJCQlnb3RvIEVycm9yX3dtaXRsdl9jaGVja190bHZfcGFyYW1zOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLyogTm9uLWFycmF5IFRMVi4gKi8KKworCQkJaWYgKChjdXJyX3Rsdl9sZW4gKyBXTUlfVExWX0hEUl9TSVpFKSAhPQorCQkJICAgIGF0dHJfc3RydWN0X3B0ci50YWdfc3RydWN0X3NpemUpIHsKKwkJCQl3bWlfdGx2X3ByaW50X2Vycm9yCisJCQkJCSgiJXM6IEVSUk9SOiBUTFYgaGFzIHdyb25nIGxlbmd0aCBmb3IgQ21kPTB4JXguIEdpdmVuPSV6dSwgRXhwZWN0ZWQ9JWQuXG4iLAorCQkJCQlfX2Z1bmNfXywgd21pX2NtZF9ldmVudF9pZCwKKwkJCQkJKGN1cnJfdGx2X2xlbiArIFdNSV9UTFZfSERSX1NJWkUpLAorCQkJCQlhdHRyX3N0cnVjdF9wdHIudGFnX3N0cnVjdF9zaXplKTsKKwkJCQlnb3RvIEVycm9yX3dtaXRsdl9jaGVja190bHZfcGFyYW1zOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgVExWIGxlbmd0aCBpcyBhbGlnbmVkIHRvIDQgYnl0ZXMgb3Igbm90ICovCisJCWlmICgoY3Vycl90bHZfbGVuICUgc2l6ZW9mKEFfVUlOVDMyKSkgIT0gMCkgeworCQkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJCSgiJXM6IEVSUk9SOiBUTFYgbGVuZ3RoICVkIGZvciBDbWQ9MHgleCBpcyBub3QgYWxpZ25lZCB0byAlenUgYnl0ZXNcbiIsCisJCQkJX19mdW5jX18sIGN1cnJfdGx2X2xlbiwgd21pX2NtZF9ldmVudF9pZCwKKwkJCQlzaXplb2YoQV9VSU5UMzIpKTsKKwkJCWdvdG8gRXJyb3Jfd21pdGx2X2NoZWNrX3Rsdl9wYXJhbXM7CisJCX0KKworCQl0bHZfaW5kZXgrKzsKKwkJYnVmX3B0ciArPSBjdXJyX3Rsdl9sZW4gKyBXTUlfVExWX0hEUl9TSVpFOworCQlidWZfaWR4ICs9IGN1cnJfdGx2X2xlbiArIFdNSV9UTFZfSERSX1NJWkU7CisJfQorCisJaWYgKHRsdl9pbmRleCAhPSBleHBlY3RlZF9udW1fdGx2cykgeworCQl3bWlfdGx2X3ByaW50X3ZlcmJvc2UKKwkJCSgiJXM6IElORk86IExlc3MgbnVtYmVyIG9mIFRMVnMgZmlsbGVkIGZvciBDbWQ9MHgleCBGaWxsZWQgJWQgRXhwZWN0ZWQ9JWRcbiIsCisJCQlfX2Z1bmNfXywgd21pX2NtZF9ldmVudF9pZCwgdGx2X2luZGV4LCBleHBlY3RlZF9udW1fdGx2cyk7CisJfQorCisJcmV0dXJuICgwKTsKK0Vycm9yX3dtaXRsdl9jaGVja190bHZfcGFyYW1zOgorCXJldHVybiAoLTEpOworfQorCisvKgorICogSGVscGVyIEZ1bmN0aW9uIHRvIHZhaWRhdGUgdGhlIHByZXBhcmVkIFRMVidzIGZvciBhbiBXTUkgZXZlbnQgdG8gYmUgc2VudAorICogUmV0dXJuIDAgaWYgc3VjY2Vzcy4KKyAqICAgICAgICAgICA8MCBpZiBmYWlsdXJlLgorICovCitpbnQKK3dtaXRsdl9jaGVja19ldmVudF90bHZfcGFyYW1zKHZvaWQgKm9zX2hhbmRsZSwgdm9pZCAqcGFyYW1fc3RydWNfcHRyLAorCQkJICAgICAgQV9VSU5UMzIgcGFyYW1fYnVmX2xlbiwgQV9VSU5UMzIgd21pX2NtZF9ldmVudF9pZCkKK3sKKwlBX1VJTlQzMiBpc19jbWRfaWQgPSAwOworCXJldHVybiAod21pdGx2X2NoZWNrX3Rsdl9wYXJhbXMKKwkJCShvc19oYW5kbGUsIHBhcmFtX3N0cnVjX3B0ciwgcGFyYW1fYnVmX2xlbiwgaXNfY21kX2lkLAorCQkJd21pX2NtZF9ldmVudF9pZCkpOworfQorCisvKgorICogSGVscGVyIEZ1bmN0aW9uIHRvIHZhaWRhdGUgdGhlIHByZXBhcmVkIFRMVidzIGZvciBhbiBXTUkgY29tbWFuZCB0byBiZSBzZW50CisgKiBSZXR1cm4gMCBpZiBzdWNjZXNzLgorICogICAgICAgICAgIDwwIGlmIGZhaWx1cmUuCisgKi8KK2ludAord21pdGx2X2NoZWNrX2NvbW1hbmRfdGx2X3BhcmFtcyh2b2lkICpvc19oYW5kbGUsIHZvaWQgKnBhcmFtX3N0cnVjX3B0ciwKKwkJCQlBX1VJTlQzMiBwYXJhbV9idWZfbGVuLAorCQkJCUFfVUlOVDMyIHdtaV9jbWRfZXZlbnRfaWQpCit7CisJQV9VSU5UMzIgaXNfY21kX2lkID0gMTsKKwlyZXR1cm4gKHdtaXRsdl9jaGVja190bHZfcGFyYW1zCisJCQkob3NfaGFuZGxlLCBwYXJhbV9zdHJ1Y19wdHIsIHBhcmFtX2J1Zl9sZW4sIGlzX2NtZF9pZCwKKwkJCXdtaV9jbWRfZXZlbnRfaWQpKTsKK30KKworLyoKKyAqIEhlbHBlciBGdW5jdGlvbiB0byB2YWlkYXRlIHRoZSBUTFYncyBjb21pbmcgZm9yIGFuIGV2ZW50L2NvbW1hbmQgYW5kIGFsc28gcGFkcyBkYXRhIHRvIFRMVidzIGlmIG5lY2Vzc2FyeQorICogUmV0dXJuIDAgaWYgc3VjY2Vzcy4KKyAgICAgICAgICAgICAgPDAgaWYgZmFpbHVyZS4KKyAqLworc3RhdGljIGludAord21pdGx2X2NoZWNrX2FuZF9wYWRfdGx2cyh2b2lkICpvc19oYW5kbGUsIHZvaWQgKnBhcmFtX3N0cnVjX3B0ciwKKwkJCSAgQV9VSU5UMzIgcGFyYW1fYnVmX2xlbiwgQV9VSU5UMzIgaXNfY21kX2lkLAorCQkJICBBX1VJTlQzMiB3bWlfY21kX2V2ZW50X2lkLCB2b2lkICoqd21pX2NtZF9zdHJ1Y3RfcHRyKQoreworCXdtaXRsdl9hdHRyaWJ1dGVzX3N0cnVjIGF0dHJfc3RydWN0X3B0cjsKKwlBX1VJTlQzMiBidWZfaWR4ID0gMDsKKwlBX1VJTlQzMiB0bHZfaW5kZXggPSAwOworCUFfVUlOVDMyIG51bV9vZl9lbGVtcyA9IDA7CisJaW50IHRsdl9zaXplX2RpZmYgPSAwOworCUFfVUlOVDggKmJ1Zl9wdHIgPSAodW5zaWduZWQgY2hhciAqKXBhcmFtX3N0cnVjX3B0cjsKKwl3bWl0bHZfY21kX3BhcmFtX2luZm8gKmNtZF9wYXJhbV90bHZzX3B0ciA9IE5VTEw7CisJQV9VSU5UMzIgcmVtYWluaW5nX2V4cGVjdGVkX3RsdnMgPSAweEZGRkZGRkZGOworCUFfVUlOVDMyIGxlbl93bWlfY21kX3N0cnVjdF9idWY7CisKKwkvKiBHZXQgdGhlIG51bWJlciBvZiBUTFZzIGZvciB0aGlzIGNvbW1hbmQvZXZlbnQgKi8KKwlpZiAod21pdGx2X2dldF9hdHRyaWJ1dGVzCisJCSAgICAoaXNfY21kX2lkLCB3bWlfY21kX2V2ZW50X2lkLCBXTUlUTFZfR0VUX0FUVFJJQl9OVU1fVExWUywKKwkJICAgICZhdHRyX3N0cnVjdF9wdHIpICE9IDApIHsKKwkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJKCIlczogRVJST1I6IENvdWxkbid0IGdldCBleHBlY3RlZCBudW1iZXIgb2YgVExWcyBmb3IgQ21kPSVkXG4iLAorCQkJX19mdW5jX18sIHdtaV9jbWRfZXZlbnRfaWQpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIE5PVEU6IHRoZSByZXR1cm5lZCBudW1iZXIgb2YgVExWcyBpcyBpbiAiYXR0cl9zdHJ1Y3RfcHRyLmNtZF9udW1fdGx2IiAqLworCisJLyogQ3JlYXRlIGJhc2Ugc3RydWN0dXJlIG9mIGZvcm1hdCB3bWlfY21kX2V2ZW50X2lkIyNfcGFyYW1fdGx2cyAqLworCWxlbl93bWlfY21kX3N0cnVjdF9idWYgPQorCQlhdHRyX3N0cnVjdF9wdHIuY21kX251bV90bHYgKiBzaXplb2Yod21pdGx2X2NtZF9wYXJhbV9pbmZvKTsKKyNpZm5kZWYgTk9fRFlOQU1JQ19NRU1fQUxMT0MKKwkvKiBEeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHN1cHBvcnRlZCAqLworCXdtaV90bHZfb3NfbWVtX2FsbG9jKG9zX2hhbmRsZSwgKndtaV9jbWRfc3RydWN0X3B0ciwKKwkJCSAgICAgbGVuX3dtaV9jbWRfc3RydWN0X2J1Zik7CisjZWxzZQorCS8qIER5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gaXMgbm90IHN1cHBvcnRlZC4gVXNlIHRoZSBidWZmZXIgZ193bWlfc3RhdGljX2NtZF9wYXJhbV9pbmZvX2J1Ziwgd2hpY2ggc2hvdWxkIGJlIHNldCB1c2luZyB3bWlfdGx2X3NldF9zdGF0aWNfcGFyYW1fdGx2X2J1ZigpLAorCSAgIGZvciBiYXNlIHN0cnVjdHVyZSBvZiBmb3JtYXQgd21pX2NtZF9ldmVudF9pZCMjX3BhcmFtX3RsdnMgKi8KKwkqd21pX2NtZF9zdHJ1Y3RfcHRyID0gZ193bWlfc3RhdGljX2NtZF9wYXJhbV9pbmZvX2J1ZjsKKwlpZiAoYXR0cl9zdHJ1Y3RfcHRyLmNtZF9udW1fdGx2ID4gZ193bWlfc3RhdGljX21heF9jbWRfcGFyYW1fdGx2cykgeworCQkvKiBFcnJvcjogRXhwZWN0aW5nIG1vcmUgVExWcyB0aGF0IGFjY29tb2RhdGVkIGZvciBzdGF0aWMgc3RydWN0dXJlICAqLworCQl3bWlfdGx2X3ByaW50X2Vycm9yCisJCQkoIiVzOiBFcnJvcjogRXhwZWN0aW5nIG1vcmUgVExWcyB0aGF0IGFjY29tb2RhdGVkIGZvciBzdGF0aWMgc3RydWN0dXJlLiBFeHBlY3RlZDolZCBBY2NvbW9kYXRlZDolZFxuIiwKKwkJCV9fZnVuY19fLCBhdHRyX3N0cnVjdF9wdHIuY21kX251bV90bHYsCisJCQlnX3dtaV9zdGF0aWNfbWF4X2NtZF9wYXJhbV90bHZzKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCWlmICgqd21pX2NtZF9zdHJ1Y3RfcHRyID09IE5VTEwpIHsKKwkJLyogRXJyb3I6IHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgKi8KKwkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJKCIlczogRXJyb3I6IHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgKHNpemU9JWQpIGZvciBUTFZcbiIsCisJCQlfX2Z1bmNfXywgbGVuX3dtaV9jbWRfc3RydWN0X2J1Zik7CisJCXJldHVybiAtMTsKKwl9CisKKwljbWRfcGFyYW1fdGx2c19wdHIgPSAod21pdGx2X2NtZF9wYXJhbV9pbmZvICopICp3bWlfY21kX3N0cnVjdF9wdHI7CisJd21pX3Rsdl9PU19NRU1aRVJPKGNtZF9wYXJhbV90bHZzX3B0ciwgbGVuX3dtaV9jbWRfc3RydWN0X2J1Zik7CisJcmVtYWluaW5nX2V4cGVjdGVkX3RsdnMgPSBhdHRyX3N0cnVjdF9wdHIuY21kX251bV90bHY7CisKKwl3aGlsZSAoKChidWZfaWR4ICsgV01JX1RMVl9IRFJfU0laRSkgPD0gcGFyYW1fYnVmX2xlbikKKwkgICAgICAgJiYgKHJlbWFpbmluZ19leHBlY3RlZF90bHZzKSkgeworCQlBX1VJTlQzMiBjdXJyX3Rsdl90YWcgPQorCQkJV01JVExWX0dFVF9UTFZUQUcoV01JVExWX0dFVF9IRFIoYnVmX3B0cikpOworCQlBX1VJTlQzMiBjdXJyX3Rsdl9sZW4gPQorCQkJV01JVExWX0dFVF9UTFZMRU4oV01JVExWX0dFVF9IRFIoYnVmX3B0cikpOworCQlpbnQgbnVtX3BhZGRpbmdfYnl0ZXMgPSAwOworCisJCS8qIEdldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgVExWIHdpdGggdGhlIGdpdmVuIG9yZGVyIGluICJ0bHZfaW5kZXgiICovCisJCXdtaV90bHZfT1NfTUVNWkVSTygmYXR0cl9zdHJ1Y3RfcHRyLAorCQkJCSAgIHNpemVvZih3bWl0bHZfYXR0cmlidXRlc19zdHJ1YykpOworCQlpZiAod21pdGx2X2dldF9hdHRyaWJ1dGVzCisJCQkgICAgKGlzX2NtZF9pZCwgd21pX2NtZF9ldmVudF9pZCwgdGx2X2luZGV4LAorCQkJICAgICZhdHRyX3N0cnVjdF9wdHIpICE9IDApIHsKKwkJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCQkoIiVzOiBFUlJPUjogTm8gVExWIGF0dHJpYnV0ZXMgZm91bmQgZm9yIENtZD0lZCBUYWdfb3JkZXI9JWRcbiIsCisJCQkJX19mdW5jX18sIHdtaV9jbWRfZXZlbnRfaWQsIHRsdl9pbmRleCk7CisJCQlnb3RvIEVycm9yX3dtaXRsdl9jaGVja19hbmRfcGFkX3RsdnM7CisJCX0KKworCQkvKiBGb3VuZCB0aGUgVExWIHRoYXQgd2Ugd2FudGVkICovCisJCXdtaV90bHZfcHJpbnRfdmVyYm9zZSgiJXM6IFt0bHYgJWRdOiB0YWc9JWQsIGxlbj0lZFxuIiwKKwkJCQkgICAgICBfX2Z1bmNfXywgdGx2X2luZGV4LCBjdXJyX3Rsdl90YWcsCisJCQkJICAgICAgY3Vycl90bHZfbGVuKTsKKworCQkvKiBWYWxpZGF0aW5nIFRhZyBvcmRlciAqLworCQlpZiAoY3Vycl90bHZfdGFnICE9IGF0dHJfc3RydWN0X3B0ci50YWdfaWQpIHsKKwkJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCQkoIiVzOiBFUlJPUjogVExWIGhhcyB3cm9uZyB0YWcgaW4gb3JkZXIgZm9yIENtZD0weCV4LiBHaXZlbj0lZCwgRXhwZWN0ZWQ9JWQuXG4iLAorCQkJCV9fZnVuY19fLCB3bWlfY21kX2V2ZW50X2lkLCBjdXJyX3Rsdl90YWcsCisJCQkJYXR0cl9zdHJ1Y3RfcHRyLnRhZ19pZCk7CisJCQlnb3RvIEVycm9yX3dtaXRsdl9jaGVja19hbmRfcGFkX3RsdnM7CisJCX0KKworCQlpZiAoKGN1cnJfdGx2X3RhZyA+PSBXTUlUTFZfVEFHX0ZJUlNUX0FSUkFZX0VOVU0pCisJCSAgICAmJiAoY3Vycl90bHZfdGFnIDw9IFdNSVRMVl9UQUdfTEFTVF9BUlJBWV9FTlVNKSkgeworCQkJLyogQ3VycmVudCBUYWcgaXMgYW4gYXJyYXkgb2Ygc29tZSBraW5kLiAqLworCQkJLyogU2tpcCB0aGUgVExWIGhlYWRlciBvZiB0aGlzIGFycmF5ICovCisJCQlidWZfcHRyICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCQlidWZfaWR4ICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCX0gZWxzZSB7CisJCQkvKiBOb24tYXJyYXkgVExWLiAqLworCQkJY3Vycl90bHZfbGVuICs9IFdNSV9UTFZfSERSX1NJWkU7CisJCX0KKworCQlpZiAoYXR0cl9zdHJ1Y3RfcHRyLnRhZ192YXJpZWRfc2l6ZSA9PSBXTUlUTFZfU0laRV9GSVgpIHsKKwkJCS8qIFRoaXMgVExWIGlzIGZpeGVkIGxlbmd0aCAqLworCQkJaWYgKFdNSVRMVl9BUlJfU0laRV9JTlZBTElEID09CisJCQkgICAgYXR0cl9zdHJ1Y3RfcHRyLnRhZ19hcnJheV9zaXplKSB7CisJCQkJdGx2X3NpemVfZGlmZiA9CisJCQkJCWN1cnJfdGx2X2xlbiAtCisJCQkJCWF0dHJfc3RydWN0X3B0ci50YWdfc3RydWN0X3NpemU7CisJCQkJbnVtX29mX2VsZW1zID0KKwkJCQkJKGN1cnJfdGx2X2xlbiA+IFdNSV9UTFZfSERSX1NJWkUpID8gMSA6IDA7CisJCQl9IGVsc2UgeworCQkJCXRsdl9zaXplX2RpZmYgPQorCQkJCQljdXJyX3Rsdl9sZW4gLQorCQkJCQkoYXR0cl9zdHJ1Y3RfcHRyLnRhZ19zdHJ1Y3Rfc2l6ZSAqCisJCQkJCSBhdHRyX3N0cnVjdF9wdHIudGFnX2FycmF5X3NpemUpOworCQkJCW51bV9vZl9lbGVtcyA9IGF0dHJfc3RydWN0X3B0ci50YWdfYXJyYXlfc2l6ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFRoaXMgVExWIGhhcyBhIHZhcmlhYmxlIG51bWJlciBvZiBlbGVtZW50cyAqLworCQkJaWYgKFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMgPT0gYXR0cl9zdHJ1Y3RfcHRyLnRhZ19pZCkgeworCQkJCUFfVUlOVDMyIGluX3Rsdl9sZW4gPSAwOworCisJCQkJaWYgKGN1cnJfdGx2X2xlbiAhPSAwKSB7CisJCQkJCWluX3Rsdl9sZW4gPQorCQkJCQkJV01JVExWX0dFVF9UTFZMRU4oV01JVExWX0dFVF9IRFIKKwkJCQkJCQkJCSAgKGJ1Zl9wdHIpKTsKKwkJCQkJaW5fdGx2X2xlbiArPSBXTUlfVExWX0hEUl9TSVpFOworCQkJCQl0bHZfc2l6ZV9kaWZmID0KKwkJCQkJCWluX3Rsdl9sZW4gLQorCQkJCQkJYXR0cl9zdHJ1Y3RfcHRyLnRhZ19zdHJ1Y3Rfc2l6ZTsKKwkJCQkJbnVtX29mX2VsZW1zID0KKwkJCQkJCWN1cnJfdGx2X2xlbiAvIGluX3Rsdl9sZW47CisJCQkJCXdtaV90bHZfcHJpbnRfdmVyYm9zZQorCQkJCQkJKCIlczogV0FSTjogVExWIGFycmF5IG9mIHN0cnVjdHVyZXMgaW5fdGx2X2xlbj0lZCBzdHJ1Y3Rfc2l6ZTolZCBkaWZmOiVkIG51bV9vZl9lbGVtcz0lZCBcbiIsCisJCQkJCQlfX2Z1bmNfXywgaW5fdGx2X2xlbiwKKwkJCQkJCWF0dHJfc3RydWN0X3B0ci50YWdfc3RydWN0X3NpemUsCisJCQkJCQl0bHZfc2l6ZV9kaWZmLCBudW1fb2ZfZWxlbXMpOworCQkJCX0gZWxzZSB7CisJCQkJCXRsdl9zaXplX2RpZmYgPSAwOworCQkJCQludW1fb2ZfZWxlbXMgPSAwOworCQkJCX0KKwkJCX0gZWxzZQorCQkJaWYgKChXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiA9PQorCQkJICAgICBhdHRyX3N0cnVjdF9wdHIudGFnX2lkKQorCQkJICAgIHx8IChXTUlUTFZfVEFHX0FSUkFZX0JZVEUgPT0KKwkJCQlhdHRyX3N0cnVjdF9wdHIudGFnX2lkKQorCQkJICAgIHx8IChXTUlUTFZfVEFHX0FSUkFZX0ZJWEVEX1NUUlVDID09CisJCQkJYXR0cl9zdHJ1Y3RfcHRyLnRhZ19pZCkpIHsKKwkJCQl0bHZfc2l6ZV9kaWZmID0gMDsKKwkJCQludW1fb2ZfZWxlbXMgPQorCQkJCQljdXJyX3Rsdl9sZW4gLworCQkJCQlhdHRyX3N0cnVjdF9wdHIudGFnX3N0cnVjdF9zaXplOworCQkJfSBlbHNlIHsKKwkJCQl3bWlfdGx2X3ByaW50X2Vycm9yCisJCQkJCSgiJXMgRVJST1IgTmVlZCB0byBoYW5kbGUgdGhpcyB0YWcgSUQgZm9yIHZhcmlhYmxlIGxlbmd0aCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGF0dHJfc3RydWN0X3B0ci50YWdfaWQpOworCQkJCWdvdG8gRXJyb3Jfd21pdGx2X2NoZWNrX2FuZF9wYWRfdGx2czsKKwkJCX0KKwkJfQorCisJCWlmICgoV01JVExWX1RBR19BUlJBWV9TVFJVQyA9PSBhdHRyX3N0cnVjdF9wdHIudGFnX2lkKSAmJgorCQkgICAgKHRsdl9zaXplX2RpZmYgIT0gMCkpIHsKKwkJCXZvaWQgKm5ld190bHZfYnVmID0gTlVMTDsKKwkJCUFfVUlOVDggKnRsdl9idWZfcHRyID0gTlVMTDsKKwkJCUFfVUlOVDMyIGluX3Rsdl9sZW47CisJCQlBX1VJTlQzMiBpOworCisJCQlpZiAoYXR0cl9zdHJ1Y3RfcHRyLnRhZ192YXJpZWRfc2l6ZSA9PSBXTUlUTFZfU0laRV9GSVgpIHsKKwkJCQkvKiBUaGlzIGlzIG5vdCBhbGxvd2VkLiBUaGUgdGFnIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHZhcmlhYmxlLWxlbmd0aCBzdHJ1Y3R1cmUgYXJyYXkKKwkJCQkgICBzaG91bGQgbm90IGhhdmUgYSBmaXhlZCBudW1iZXIgb2YgZWxlbWVudHMgKGNvbnRyYWRpY3RpbmcpLiBVc2UgV01JVExWX1RBR19BUlJBWV9GSVhFRF9TVFJVQyB0YWcgZm9yCisJCQkJICAgZml4ZWQgc2l6ZSBzdHJ1Y3R1cmUgYXJyYXkod2hlcmUgc3RydWN0dXJlIG5ldmVyIGNoYW5nZSB3aXRob3V0IGJyZWFraW5nIGNvbXBhdGliaWxpdHkpICovCisJCQkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJCQkoIiVzOiBFUlJPUjogVExWICh0YWc9JWQpIHNob3VsZCBiZSB2YXJpYWJsZS1sZW5ndGggYW5kIG5vdCBmaXhlZCBsZW5ndGhcbiIsCisJCQkJCV9fZnVuY19fLCBjdXJyX3Rsdl90YWcpOworCQkJCWdvdG8gRXJyb3Jfd21pdGx2X2NoZWNrX2FuZF9wYWRfdGx2czsKKwkJCX0KKworCQkJLyogV2FybmluZzogTmVlZHMgdG8gYWxsb2NhdGUgYSBsYXJnZXIgc3RydWN0dXJlIGFuZCBwYWQgd2l0aCB6ZXJvcyAqLworCQkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJCSgiJXM6IFdBUk46IFRMViBhcnJheSBvZiBzdHJ1Y3R1cmVzIG5lZWRzIHBhZGRpbmcuIHRsdl9zaXplX2RpZmY9JWRcbiIsCisJCQkJX19mdW5jX18sIHRsdl9zaXplX2RpZmYpOworCisJCQkvKiBpbmNvbWluZyBzdHJ1Y3R1cmUgbGVuZ3RoICovCisJCQlpbl90bHZfbGVuID0KKwkJCQlXTUlUTFZfR0VUX1RMVkxFTihXTUlUTFZfR0VUX0hEUihidWZfcHRyKSkgKworCQkJCVdNSV9UTFZfSERSX1NJWkU7CisjaWZuZGVmIE5PX0RZTkFNSUNfTUVNX0FMTE9DCisJCQl3bWlfdGx2X29zX21lbV9hbGxvYyhvc19oYW5kbGUsIG5ld190bHZfYnVmLAorCQkJCQkgICAgIChudW1fb2ZfZWxlbXMgKgorCQkJCQkgICAgICBhdHRyX3N0cnVjdF9wdHIudGFnX3N0cnVjdF9zaXplKSk7CisJCQlpZiAobmV3X3Rsdl9idWYgPT0gTlVMTCkgeworCQkJCS8qIEVycm9yOiB1bmFibGUgdG8gYWxsb2MgbWVtb3J5ICovCisJCQkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJCQkoIiVzOiBFcnJvcjogdW5hYmxlIHRvIGFsbG9jIG1lbW9yeSAoc2l6ZT0lZCkgZm9yIHBhZGRpbmcgdGhlIFRMViBhcnJheSAlZFxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCShudW1fb2ZfZWxlbXMgKgorCQkJCQkgYXR0cl9zdHJ1Y3RfcHRyLnRhZ19zdHJ1Y3Rfc2l6ZSksCisJCQkJCWN1cnJfdGx2X3RhZyk7CisJCQkJZ290byBFcnJvcl93bWl0bHZfY2hlY2tfYW5kX3BhZF90bHZzOworCQkJfQorCisJCQl3bWlfdGx2X09TX01FTVpFUk8obmV3X3Rsdl9idWYsCisJCQkJCSAgIChudW1fb2ZfZWxlbXMgKgorCQkJCQkgICAgYXR0cl9zdHJ1Y3RfcHRyLnRhZ19zdHJ1Y3Rfc2l6ZSkpOworCQkJdGx2X2J1Zl9wdHIgPSAoQV9VSU5UOCAqKSBuZXdfdGx2X2J1ZjsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfZWxlbXM7IGkrKykgeworCQkJCWlmICh0bHZfc2l6ZV9kaWZmID4gMCkgeworCQkJCQkvKiBJbmNvbWluZyBzdHJ1Y3R1cmUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gZXhwZWN0ZWQgc3RydWN0dXJlIHNpemUuCisJCQkJCSAgIHNvIGNvcHkgdGhlIG51bWJlciBvZiBieXRlcyBlcXVhbCB0byBleHBlY3RlZCBzdHJ1Y3R1cmUgc2l6ZSAqLworCQkJCQl3bWlfdGx2X09TX01FTUNQWSh0bHZfYnVmX3B0ciwKKwkJCQkJCQkgICh2b2lkICopKGJ1Zl9wdHIgKworCQkJCQkJCQkgICBpICoKKwkJCQkJCQkJICAgaW5fdGx2X2xlbiksCisJCQkJCQkJICBhdHRyX3N0cnVjdF9wdHIuCisJCQkJCQkJICB0YWdfc3RydWN0X3NpemUpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIEluY29taW5nIHN0cnVjdHVyZSBzaXplIGlzIHNtYWxsZXIgdGhhbiBleHBlY3RlZCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJCQkJICAgc28gY29weSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGVxdWFsIHRvIGluY29taW5nIHN0cnVjdHVyZSBzaXplCisJCQkJCSAgIChvdGhlciBieXRlcyB3b3VsZCBiZSB6ZXJvZXMpICovCisJCQkJCXdtaV90bHZfT1NfTUVNQ1BZKHRsdl9idWZfcHRyLAorCQkJCQkJCSAgKHZvaWQgKikoYnVmX3B0ciArCisJCQkJCQkJCSAgIGkgKgorCQkJCQkJCQkgICBpbl90bHZfbGVuKSwKKwkJCQkJCQkgIGluX3Rsdl9sZW4pOworCQkJCX0KKwkJCQl0bHZfYnVmX3B0ciArPSBhdHRyX3N0cnVjdF9wdHIudGFnX3N0cnVjdF9zaXplOworCQkJfQorI2Vsc2UKKwkJCXsKKwkJCQlBX1VJTlQ4ICpzcmNfYWRkcjsKKwkJCQlBX1VJTlQ4ICpkc3RfYWRkcjsKKwkJCQlBX1VJTlQzMiBidWZfbW92X2xlbjsKKworCQkJCWlmICh0bHZfc2l6ZV9kaWZmIDwgMCkgeworCQkJCQkvKiBJbmNvbWluZyBzdHJ1Y3R1cmUgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQgc2l6ZSB0aGVuIHRoaXMgbmVlZHMgcGFkZGluZyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSAqLworCisJCQkJCS8qIEZpbmQgYW1vdW50IG9mIGJ5dGVzIHRvIGJlIHBhZGRlZCBmb3Igb25lIGVsZW1lbnQgKi8KKwkJCQkJbnVtX3BhZGRpbmdfYnl0ZXMgPSB0bHZfc2l6ZV9kaWZmICogLTE7CisKKwkJCQkJLyogTW92ZSBzdWJzZXF1ZW50IFRMVnMgYnkgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHBhZGRlZCBmb3IgYWxsIGVsZW1lbnRzICovCisJCQkJCWlmIChwYXJhbV9idWZfbGVuID4KKwkJCQkJICAgIChidWZfaWR4ICsgY3Vycl90bHZfbGVuKSkgeworCQkJCQkJc3JjX2FkZHIgPQorCQkJCQkJCWJ1Zl9wdHIgKyBjdXJyX3Rsdl9sZW47CisJCQkJCQlkc3RfYWRkciA9CisJCQkJCQkJYnVmX3B0ciArIGN1cnJfdGx2X2xlbiArCisJCQkJCQkJKG51bV9wYWRkaW5nX2J5dGVzICoKKwkJCQkJCQkgbnVtX29mX2VsZW1zKTsKKwkJCQkJCWJ1Zl9tb3ZfbGVuID0KKwkJCQkJCQlwYXJhbV9idWZfbGVuIC0gKGJ1Zl9pZHggKworCQkJCQkJCQkJIGN1cnJfdGx2X2xlbik7CisKKwkJCQkJCXdtaV90bHZfT1NfTUVNTU9WRShkc3RfYWRkciwKKwkJCQkJCQkJICAgc3JjX2FkZHIsCisJCQkJCQkJCSAgIGJ1Zl9tb3ZfbGVuKTsKKwkJCQkJfQorCisJCQkJCS8qIE1vdmUgc3Vic2VxdWVudCBlbGVtZW50cyBvZiBhcnJheSBkb3duIGJ5IG51bWJlciBvZiBieXRlcyB0byBiZSBwYWRkZWQgZm9yIG9uZSBlbGVtZW50IGFuZCBhbHNlIHNldCBwYWRkaW5nIGJ5dGVzIHRvIHplcm8gKi8KKwkJCQkJdGx2X2J1Zl9wdHIgPSBidWZfcHRyOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2VsZW1zOyBpKyspIHsKKwkJCQkJCXNyY19hZGRyID0KKwkJCQkJCQl0bHZfYnVmX3B0ciArIGluX3Rsdl9sZW47CisJCQkJCQlpZiAoaSAhPSAobnVtX29mX2VsZW1zIC0gMSkpIHsKKwkJCQkJCQkvKiBOZWVkIG5vdCBtb3ZlIGFueXRoaW5nIGZvciBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5ICovCisJCQkJCQkJZHN0X2FkZHIgPQorCQkJCQkJCQl0bHZfYnVmX3B0ciArCisJCQkJCQkJCWluX3Rsdl9sZW4gKworCQkJCQkJCQludW1fcGFkZGluZ19ieXRlczsKKwkJCQkJCQlidWZfbW92X2xlbiA9CisJCQkJCQkJCWN1cnJfdGx2X2xlbiAtCisJCQkJCQkJCSgoaSArCisJCQkJCQkJCSAgMSkgKiBpbl90bHZfbGVuKTsKKworCQkJCQkJCXdtaV90bHZfT1NfTUVNTU9WRQorCQkJCQkJCQkoZHN0X2FkZHIsIHNyY19hZGRyLAorCQkJCQkJCQlidWZfbW92X2xlbik7CisJCQkJCQl9CisKKwkJCQkJCS8qIFNldCB0aGUgcGFkZGluZyBieXRlcyB0byB6ZXJvZXMgKi8KKwkJCQkJCXdtaV90bHZfT1NfTUVNWkVSTyhzcmNfYWRkciwKKwkJCQkJCQkJICAgbnVtX3BhZGRpbmdfYnl0ZXMpOworCisJCQkJCQl0bHZfYnVmX3B0ciArPQorCQkJCQkJCWF0dHJfc3RydWN0X3B0ci4KKwkJCQkJCQl0YWdfc3RydWN0X3NpemU7CisJCQkJCX0KKworCQkJCQkvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIHRvIHRvdGFsIG51bWJlciBvZiBieXRlcyBwYWRkZWQgZm9yIGFsbCBlbGVtZW50cyBpbiB0aGUgYXJyYXkgKi8KKwkJCQkJbnVtX3BhZGRpbmdfYnl0ZXMgPQorCQkJCQkJbnVtX3BhZGRpbmdfYnl0ZXMgKiBudW1fb2ZfZWxlbXM7CisKKwkJCQkJbmV3X3Rsdl9idWYgPSBidWZfcHRyOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIEluY29taW5nIHN0cnVjdHVyZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiBleHBlY3RlZCBzaXplIHRoZW4gdGhpcyBuZWVkcyBzaHJpbmtpbmcgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgKi8KKworCQkJCQkvKiBGaW5kIGFtb3VudCBvZiBieXRlcyB0byBiZSBzaHJpbmtlZCBmb3Igb25lIGVsZW1lbnQgKi8KKwkJCQkJbnVtX3BhZGRpbmdfYnl0ZXMgPSB0bHZfc2l6ZV9kaWZmICogLTE7CisKKwkJCQkJLyogTW92ZSBzdWJzZXF1ZW50IGVsZW1lbnRzIG9mIGFycmF5IHVwIGJ5IG51bWJlciBvZiBieXRlcyB0byBiZSBzaHJpbmtlZCBmb3Igb25lIGVsZW1lbnQgKi8KKwkJCQkJdGx2X2J1Zl9wdHIgPSBidWZfcHRyOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgKG51bV9vZl9lbGVtcyAtIDEpOyBpKyspIHsKKwkJCQkJCXNyY19hZGRyID0KKwkJCQkJCQl0bHZfYnVmX3B0ciArIGluX3Rsdl9sZW47CisJCQkJCQlkc3RfYWRkciA9CisJCQkJCQkJdGx2X2J1Zl9wdHIgKyBpbl90bHZfbGVuICsKKwkJCQkJCQludW1fcGFkZGluZ19ieXRlczsKKwkJCQkJCWJ1Zl9tb3ZfbGVuID0KKwkJCQkJCQljdXJyX3Rsdl9sZW4gLQorCQkJCQkJCSgoaSArIDEpICogaW5fdGx2X2xlbik7CisKKwkJCQkJCXdtaV90bHZfT1NfTUVNTU9WRShkc3RfYWRkciwKKwkJCQkJCQkJICAgc3JjX2FkZHIsCisJCQkJCQkJCSAgIGJ1Zl9tb3ZfbGVuKTsKKworCQkJCQkJdGx2X2J1Zl9wdHIgKz0KKwkJCQkJCQlhdHRyX3N0cnVjdF9wdHIuCisJCQkJCQkJdGFnX3N0cnVjdF9zaXplOworCQkJCQl9CisKKwkJCQkJLyogTW92ZSBzdWJzZXF1ZW50IFRMVnMgYnkgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHNocmlua2VkIGZvciBhbGwgZWxlbWVudHMgKi8KKwkJCQkJaWYgKHBhcmFtX2J1Zl9sZW4gPgorCQkJCQkgICAgKGJ1Zl9pZHggKyBjdXJyX3Rsdl9sZW4pKSB7CisJCQkJCQlzcmNfYWRkciA9CisJCQkJCQkJYnVmX3B0ciArIGN1cnJfdGx2X2xlbjsKKwkJCQkJCWRzdF9hZGRyID0KKwkJCQkJCQlidWZfcHRyICsgY3Vycl90bHZfbGVuICsKKwkJCQkJCQkobnVtX3BhZGRpbmdfYnl0ZXMgKgorCQkJCQkJCSBudW1fb2ZfZWxlbXMpOworCQkJCQkJYnVmX21vdl9sZW4gPQorCQkJCQkJCXBhcmFtX2J1Zl9sZW4gLSAoYnVmX2lkeCArCisJCQkJCQkJCQkgY3Vycl90bHZfbGVuKTsKKworCQkJCQkJd21pX3Rsdl9PU19NRU1NT1ZFKGRzdF9hZGRyLAorCQkJCQkJCQkgICBzcmNfYWRkciwKKwkJCQkJCQkJICAgYnVmX21vdl9sZW4pOworCQkJCQl9CisKKwkJCQkJLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyB0byB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgc2hyaW5rZWQgZm9yIGFsbCBlbGVtZW50cyBpbiB0aGUgYXJyYXkgKi8KKwkJCQkJbnVtX3BhZGRpbmdfYnl0ZXMgPQorCQkJCQkJbnVtX3BhZGRpbmdfYnl0ZXMgKiBudW1fb2ZfZWxlbXM7CisKKwkJCQkJbmV3X3Rsdl9idWYgPSBidWZfcHRyOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJY21kX3BhcmFtX3RsdnNfcHRyW3Rsdl9pbmRleF0udGx2X3B0ciA9IG5ld190bHZfYnVmOworCQkJY21kX3BhcmFtX3RsdnNfcHRyW3Rsdl9pbmRleF0ubnVtX2VsZW1lbnRzID0KKwkJCQludW1fb2ZfZWxlbXM7CisJCQljbWRfcGFyYW1fdGx2c19wdHJbdGx2X2luZGV4XS5idWZfaXNfYWxsb2NhdGVkID0gMTsgICAgIC8qIEluZGljYXRlcyB0aGF0IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgKi8KKworCQl9IGVsc2UgaWYgKHRsdl9zaXplX2RpZmYgPj0gMCkgeworCQkJLyogV2FybmluZzogc29tZSBwYXJhbWV0ZXIgdHJ1bmNhdGlvbiAqLworCQkJaWYgKHRsdl9zaXplX2RpZmYgPiAwKSB7CisJCQkJd21pX3Rsdl9wcmludF92ZXJib3NlCisJCQkJCSgiJXM6IFdBUk46IFRMViB0cnVuY2F0ZWQuIHRsdl9zaXplX2RpZmY9JWQsIGN1cnJfdGx2X2xlbj0lZFxuIiwKKwkJCQkJX19mdW5jX18sIHRsdl9zaXplX2RpZmYsIGN1cnJfdGx2X2xlbik7CisJCQl9CisJCQkvKiBUT0RPOiB0aGlzIG5leHQgbGluZSBuZWVkcyBtb3JlIGNvbW1lbnRzIGFuZCBleHBsYW5hdGlvbiAqLworCQkJY21kX3BhcmFtX3RsdnNfcHRyW3Rsdl9pbmRleF0udGx2X3B0ciA9CisJCQkJKGF0dHJfc3RydWN0X3B0ci50YWdfdmFyaWVkX3NpemUKKwkJCQkgJiYgIWN1cnJfdGx2X2xlbikgPyBOVUxMIDogKHZvaWQgKilidWZfcHRyOworCQkJY21kX3BhcmFtX3RsdnNfcHRyW3Rsdl9pbmRleF0ubnVtX2VsZW1lbnRzID0KKwkJCQludW1fb2ZfZWxlbXM7CisJCQljbWRfcGFyYW1fdGx2c19wdHJbdGx2X2luZGV4XS5idWZfaXNfYWxsb2NhdGVkID0gMDsgICAgIC8qIEluZGljYXRlcyB0aGF0IGJ1ZmZlciBpcyBub3QgYWxsb2NhdGVkICovCisJCX0gZWxzZSB7CisJCQl2b2lkICpuZXdfdGx2X2J1ZiA9IE5VTEw7CisKKwkJCS8qIFdhcm5pbmc6IE5lZWRzIHRvIGFsbG9jYXRlIGEgbGFyZ2VyIHN0cnVjdHVyZSBhbmQgcGFkIHdpdGggemVyb3MgKi8KKwkJCXdtaV90bHZfcHJpbnRfdmVyYm9zZQorCQkJCSgiJXM6IFdBUk46IFRMViBuZWVkcyBwYWRkaW5nLiB0bHZfc2l6ZV9kaWZmPSVkXG4iLAorCQkJCV9fZnVuY19fLCB0bHZfc2l6ZV9kaWZmKTsKKyNpZm5kZWYgTk9fRFlOQU1JQ19NRU1fQUxMT0MKKwkJCS8qIER5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gaXMgc3VwcG9ydGVkICovCisJCQl3bWlfdGx2X29zX21lbV9hbGxvYyhvc19oYW5kbGUsIG5ld190bHZfYnVmLAorCQkJCQkgICAgIChjdXJyX3Rsdl9sZW4gLSB0bHZfc2l6ZV9kaWZmKSk7CisJCQlpZiAobmV3X3Rsdl9idWYgPT0gTlVMTCkgeworCQkJCS8qIEVycm9yOiB1bmFibGUgdG8gYWxsb2MgbWVtb3J5ICovCisJCQkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJCQkoIiVzOiBFcnJvcjogdW5hYmxlIHRvIGFsbG9jIG1lbW9yeSAoc2l6ZT0lZCkgZm9yIHBhZGRpbmcgdGhlIFRMViAlZFxuIiwKKwkJCQkJX19mdW5jX18sIChjdXJyX3Rsdl9sZW4gLSB0bHZfc2l6ZV9kaWZmKSwKKwkJCQkJY3Vycl90bHZfdGFnKTsKKwkJCQlnb3RvIEVycm9yX3dtaXRsdl9jaGVja19hbmRfcGFkX3RsdnM7CisJCQl9CisKKwkJCXdtaV90bHZfT1NfTUVNWkVSTyhuZXdfdGx2X2J1ZiwKKwkJCQkJICAgKGN1cnJfdGx2X2xlbiAtIHRsdl9zaXplX2RpZmYpKTsKKwkJCXdtaV90bHZfT1NfTUVNQ1BZKG5ld190bHZfYnVmLCAodm9pZCAqKWJ1Zl9wdHIsCisJCQkJCSAgY3Vycl90bHZfbGVuKTsKKyNlbHNlCisJCQkvKiBEeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIFBhZGRpbmcgaGFzIHRvIGJlIGRvbmUgd2l0aCBpbiB0aGUgZXhpc3RpbmcgYnVmZmVyIGFzc3VtaW5nIHdlIGhhdmUgZW5vdWdoIHNwYWNlCisJCQkgICB0byBncm93ICovCisJCQl7CisJCQkJLyogTm90ZTogdGx2X3NpemVfZGlmZiBpcyBhIHZhbHVlIGxlc3MgdGhhbiB6ZXJvICovCisJCQkJLyogTW92ZSB0aGUgU3Vic2VxdWVudCBUTFZzIGJ5IGFtb3VudCBvZiBieXRlcyBuZWVkcyB0byBiZSBwYWRkZWQgKi8KKwkJCQlBX1VJTlQ4ICpzcmNfYWRkcjsKKwkJCQlBX1VJTlQ4ICpkc3RfYWRkcjsKKwkJCQlBX1VJTlQzMiBzcmNfbGVuOworCisJCQkJbnVtX3BhZGRpbmdfYnl0ZXMgPSAodGx2X3NpemVfZGlmZiAqIC0xKTsKKworCQkJCXNyY19hZGRyID0gYnVmX3B0ciArIGN1cnJfdGx2X2xlbjsKKwkJCQlkc3RfYWRkciA9CisJCQkJCWJ1Zl9wdHIgKyBjdXJyX3Rsdl9sZW4gKyBudW1fcGFkZGluZ19ieXRlczsKKwkJCQlzcmNfbGVuID0KKwkJCQkJcGFyYW1fYnVmX2xlbiAtIChidWZfaWR4ICsgY3Vycl90bHZfbGVuKTsKKworCQkJCXdtaV90bHZfT1NfTUVNTU9WRShkc3RfYWRkciwgc3JjX2FkZHIsIHNyY19sZW4pOworCisJCQkJLyogU2V0IHRoZSBwYWRkaW5nIGJ5dGVzIHRvIHplcm9lcyAqLworCQkJCXdtaV90bHZfT1NfTUVNWkVSTyhzcmNfYWRkciwgbnVtX3BhZGRpbmdfYnl0ZXMpOworCisJCQkJbmV3X3Rsdl9idWYgPSBidWZfcHRyOworCQkJfQorI2VuZGlmCisJCQljbWRfcGFyYW1fdGx2c19wdHJbdGx2X2luZGV4XS50bHZfcHRyID0gbmV3X3Rsdl9idWY7CisJCQljbWRfcGFyYW1fdGx2c19wdHJbdGx2X2luZGV4XS5udW1fZWxlbWVudHMgPQorCQkJCW51bV9vZl9lbGVtczsKKwkJCWNtZF9wYXJhbV90bHZzX3B0clt0bHZfaW5kZXhdLmJ1Zl9pc19hbGxvY2F0ZWQgPSAxOyAgICAgLyogSW5kaWNhdGVzIHRoYXQgYnVmZmVyIGlzIGFsbG9jYXRlZCAqLworCQl9CisKKwkJdGx2X2luZGV4Kys7CisJCXJlbWFpbmluZ19leHBlY3RlZF90bHZzLS07CisJCWJ1Zl9wdHIgKz0gY3Vycl90bHZfbGVuICsgbnVtX3BhZGRpbmdfYnl0ZXM7CisJCWJ1Zl9pZHggKz0gY3Vycl90bHZfbGVuICsgbnVtX3BhZGRpbmdfYnl0ZXM7CisJfQorCisJcmV0dXJuICgwKTsKK0Vycm9yX3dtaXRsdl9jaGVja19hbmRfcGFkX3RsdnM6CisJaWYgKGlzX2NtZF9pZCkgeworCQl3bWl0bHZfZnJlZV9hbGxvY2F0ZWRfY29tbWFuZF90bHZzKHdtaV9jbWRfZXZlbnRfaWQsCisJCQkJCQkgICB3bWlfY21kX3N0cnVjdF9wdHIpOworCX0gZWxzZSB7CisJCXdtaXRsdl9mcmVlX2FsbG9jYXRlZF9ldmVudF90bHZzKHdtaV9jbWRfZXZlbnRfaWQsCisJCQkJCQkgd21pX2NtZF9zdHJ1Y3RfcHRyKTsKKwl9CisJKndtaV9jbWRfc3RydWN0X3B0ciA9IE5VTEw7CisJcmV0dXJuICgtMSk7Cit9CisKKy8qCisgKiBIZWxwZXIgRnVuY3Rpb24gdG8gdmFsaWRhdGUgYW5kIHBhZChpZiBuZWNlc3NhcnkpIGZvciBpbmNvbWluZyBXTUkgRXZlbnQgVExWcworICogUmV0dXJuIDAgaWYgc3VjY2Vzcy4KKyAgICAgICAgICAgICAgPDAgaWYgZmFpbHVyZS4KKyAqLworaW50Cit3bWl0bHZfY2hlY2tfYW5kX3BhZF9ldmVudF90bHZzKHZvaWQgKm9zX2hhbmRsZSwgdm9pZCAqcGFyYW1fc3RydWNfcHRyLAorCQkJCUFfVUlOVDMyIHBhcmFtX2J1Zl9sZW4sCisJCQkJQV9VSU5UMzIgd21pX2NtZF9ldmVudF9pZCwKKwkJCQl2b2lkICoqd21pX2NtZF9zdHJ1Y3RfcHRyKQoreworCUFfVUlOVDMyIGlzX2NtZF9pZCA9IDA7CisJcmV0dXJuICh3bWl0bHZfY2hlY2tfYW5kX3BhZF90bHZzCisJCQkob3NfaGFuZGxlLCBwYXJhbV9zdHJ1Y19wdHIsIHBhcmFtX2J1Zl9sZW4sIGlzX2NtZF9pZCwKKwkJCXdtaV9jbWRfZXZlbnRfaWQsIHdtaV9jbWRfc3RydWN0X3B0cikpOworfQorCisvKgorICogSGVscGVyIEZ1bmN0aW9uIHRvIHZhbGlkYXRlIGFuZCBwYWQoaWYgbmVjZXNzYXJ5KSBmb3IgaW5jb21pbmcgV01JIENvbW1hbmQgVExWcworICogUmV0dXJuIDAgaWYgc3VjY2Vzcy4KKyAgICAgICAgICAgICAgPDAgaWYgZmFpbHVyZS4KKyAqLworaW50Cit3bWl0bHZfY2hlY2tfYW5kX3BhZF9jb21tYW5kX3RsdnModm9pZCAqb3NfaGFuZGxlLCB2b2lkICpwYXJhbV9zdHJ1Y19wdHIsCisJCQkJICBBX1VJTlQzMiBwYXJhbV9idWZfbGVuLAorCQkJCSAgQV9VSU5UMzIgd21pX2NtZF9ldmVudF9pZCwKKwkJCQkgIHZvaWQgKip3bWlfY21kX3N0cnVjdF9wdHIpCit7CisJQV9VSU5UMzIgaXNfY21kX2lkID0gMTsKKwlyZXR1cm4gKHdtaXRsdl9jaGVja19hbmRfcGFkX3RsdnMKKwkJCShvc19oYW5kbGUsIHBhcmFtX3N0cnVjX3B0ciwgcGFyYW1fYnVmX2xlbiwgaXNfY21kX2lkLAorCQkJd21pX2NtZF9ldmVudF9pZCwgd21pX2NtZF9zdHJ1Y3RfcHRyKSk7Cit9CisKKy8qCisgKiBIZWxwZXIgRnVuY3Rpb24gdG8gZnJlZSBhbnkgYWxsb2NhdGVkIGJ1ZmZlcnMgZm9yIFdNSSBFdmVudC9Db21tYW5kIFRMViBwcm9jZXNzaW5nCisgKiBSZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZCB3bWl0bHZfZnJlZV9hbGxvY2F0ZWRfdGx2cyhBX1VJTlQzMiBpc19jbWRfaWQsCisJCQkJICAgICAgIEFfVUlOVDMyIGNtZF9ldmVudF9pZCwKKwkJCQkgICAgICAgdm9pZCAqKndtaV9jbWRfc3RydWN0X3B0cikKK3sKKwl2b2lkICpwdHIgPSAqd21pX2NtZF9zdHJ1Y3RfcHRyOworCisJaWYgKCFwdHIpIHsKKwkJd21pX3Rsdl9wcmludF9lcnJvcigiJXM6IE5vdGhpbmcgdG8gZnJlZSBmb3IgQ01EL0V2ZW50IDB4JXhcbiIsCisJCQkJICAgIF9fZnVuY19fLCBjbWRfZXZlbnRfaWQpOworCQlyZXR1cm47CisJfQorI2lmbmRlZiBOT19EWU5BTUlDX01FTV9BTExPQworCisvKiBtYWNybyB0byBmcmVlIHRoYXQgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGlzIFRMVi4gV2hlbiAob3A9PUZSRUVfVExWX0VMRU0pLiAqLworI2RlZmluZSBXTUlUTFZfT1BfRlJFRV9UTFZfRUxFTV9tYWNybyhwYXJhbV9wdHIsIHBhcmFtX2xlbiwgd21pX2NtZF9ldmVudF9pZCwgZWxlbV90bHZfdGFnLCBlbGVtX3N0cnVjX3R5cGUsIGVsZW1fbmFtZSwgdmFyX2xlbiwgYXJyX3NpemUpICBcCisJaWYgKCgoKFdNSVRMVl9UWVBFREVGX1NUUlVDVF9QQVJBTVNfVExWUyh3bWlfY21kX2V2ZW50X2lkKSAqKXB0ciktPldNSVRMVl9GSUVMRF9CVUZfSVNfQUxMT0NBVEVEKGVsZW1fbmFtZSkpICYmCVwKKwkgICAgKCgoV01JVExWX1RZUEVERUZfU1RSVUNUX1BBUkFNU19UTFZTKHdtaV9jbWRfZXZlbnRfaWQpICopcHRyKS0+ZWxlbV9uYW1lICE9IE5VTEwpKSBcCisJeyBcCisJCXdtaV90bHZfb3NfbWVtX2ZyZWUoKChXTUlUTFZfVFlQRURFRl9TVFJVQ1RfUEFSQU1TX1RMVlMod21pX2NtZF9ldmVudF9pZCkgKilwdHIpLT5lbGVtX25hbWUpOyBcCisJfQorCisjZGVmaW5lIFdNSVRMVl9GUkVFX1RMVl9FTEVNUyhpZCkJICAgICBcCitjYXNlIGlkOiBcCit7IFwKKwlXTUlUTFZfVEFCTEUoaWQsIEZSRUVfVExWX0VMRU0sIE5VTEwsIDApICAgICBcCit9IFwKK2JyZWFrOworCisJaWYgKGlzX2NtZF9pZCkgeworCQlzd2l0Y2ggKGNtZF9ldmVudF9pZCkgeworCQkJV01JVExWX0FMTF9DTURfTElTVChXTUlUTFZfRlJFRV9UTFZfRUxFTVMpOworCQlkZWZhdWx0OgorCQkJd21pX3Rsdl9wcmludF9lcnJvcgorCQkJCSgiJXM6IEVSUk9SOiBDYW5ub3QgZmluZCB0aGUgVExWcyBhdHRyaWJ1dGVzIGZvciBDbWQ9MHgleCwgJWRcbiIsCisJCQkJX19mdW5jX18sIGNtZF9ldmVudF9pZCwgY21kX2V2ZW50X2lkKTsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoY21kX2V2ZW50X2lkKSB7CisJCQlXTUlUTFZfQUxMX0VWVF9MSVNUKFdNSVRMVl9GUkVFX1RMVl9FTEVNUyk7CisJCWRlZmF1bHQ6CisJCQl3bWlfdGx2X3ByaW50X2Vycm9yCisJCQkJKCIlczogRVJST1I6IENhbm5vdCBmaW5kIHRoZSBUTFZzIGF0dHJpYnV0ZXMgZm9yIENtZD0weCV4LCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgY21kX2V2ZW50X2lkLCBjbWRfZXZlbnRfaWQpOworCQl9CisJfQorCisJd21pX3Rsdl9vc19tZW1fZnJlZSgqd21pX2NtZF9zdHJ1Y3RfcHRyKTsKKwkqd21pX2NtZF9zdHJ1Y3RfcHRyID0gTlVMTDsKKyNlbmRpZgorCisJcmV0dXJuOworfQorCisvKgorICogSGVscGVyIEZ1bmN0aW9uIHRvIGZyZWUgYW55IGFsbG9jYXRlZCBidWZmZXJzIGZvciBXTUkgQ29tbWFuZCBUTFYgcHJvY2Vzc2luZworICogUmV0dXJuIE5vbmUKKyAqLwordm9pZCB3bWl0bHZfZnJlZV9hbGxvY2F0ZWRfY29tbWFuZF90bHZzKEFfVUlOVDMyIGNtZF9ldmVudF9pZCwKKwkJCQkJdm9pZCAqKndtaV9jbWRfc3RydWN0X3B0cikKK3sKKwl3bWl0bHZfZnJlZV9hbGxvY2F0ZWRfdGx2cygxLCBjbWRfZXZlbnRfaWQsIHdtaV9jbWRfc3RydWN0X3B0cik7Cit9CisKKy8qCisgKiBIZWxwZXIgRnVuY3Rpb24gdG8gZnJlZSBhbnkgYWxsb2NhdGVkIGJ1ZmZlcnMgZm9yIFdNSSBFdmVudCBUTFYgcHJvY2Vzc2luZworICogUmV0dXJuIE5vbmUKKyAqLwordm9pZCB3bWl0bHZfZnJlZV9hbGxvY2F0ZWRfZXZlbnRfdGx2cyhBX1VJTlQzMiBjbWRfZXZlbnRfaWQsCisJCQkJICAgICAgdm9pZCAqKndtaV9jbWRfc3RydWN0X3B0cikKK3sKKwl3bWl0bHZfZnJlZV9hbGxvY2F0ZWRfdGx2cygwLCBjbWRfZXZlbnRfaWQsIHdtaV9jbWRfc3RydWN0X3B0cik7Cit9CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgdGhlIHR3byBnaXZlbiB2ZXJzaW9ucyBhcmUgY29tcGF0aWJsZS4KKyAqIEVsc2UgcmV0dXJuIDAgaWYgSW5jb21wYXRpYmxlLgorICovCitpbnQKK3dtaV92ZXJzaW9uc19hcmVfY29tcGF0aWJsZSh3bWlfYWJpX3ZlcnNpb24gKnZlcnMxLCB3bWlfYWJpX3ZlcnNpb24gKnZlcnMyKQoreworCWlmICgodmVyczEtPmFiaV92ZXJzaW9uX25zXzAgIT0gdmVyczItPmFiaV92ZXJzaW9uX25zXzApIHx8CisJICAgICh2ZXJzMS0+YWJpX3ZlcnNpb25fbnNfMSAhPSB2ZXJzMi0+YWJpX3ZlcnNpb25fbnNfMSkgfHwKKwkgICAgKHZlcnMxLT5hYmlfdmVyc2lvbl9uc18yICE9IHZlcnMyLT5hYmlfdmVyc2lvbl9uc18yKSB8fAorCSAgICAodmVyczEtPmFiaV92ZXJzaW9uX25zXzMgIT0gdmVyczItPmFiaV92ZXJzaW9uX25zXzMpKSB7CisJCS8qIFRoZSBuYW1lc3BhY2VzIGFyZSBkaWZmZXJlbnQuIEluY29tcGF0aWJsZS4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHZlcnMxLT5hYmlfdmVyc2lvbl8wICE9IHZlcnMyLT5hYmlfdmVyc2lvbl8wKSB7CisJCS8qIFRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9ucyBhcmUgZGlmZmVyZW50LiBJbmNvbXBhdGlibGUgKi8KKwkJcmV0dXJuIDA7CisJfQorCS8qIFdlIGlnbm9yZSB0aGUgYnVpbGQgdmVyc2lvbiAqLworCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJucyAxIGlmIHRoZSB0d28gZ2l2ZW4gdmVyc2lvbnMgYXJlIGNvbXBhdGlibGUuCisgKiBFbHNlIHJldHVybiAwIGlmIEluY29tcGF0aWJsZS4KKyAqLworaW50Cit3bWlfdmVyc2lvbnNfY2FuX2Rvd25ncmFkZShpbnQgbnVtX3doaXRlbGlzdCwKKwkJCSAgIHdtaV93aGl0ZWxpc3RfdmVyc2lvbl9pbmZvICp2ZXJzaW9uX3doaXRlbGlzdF90YWJsZSwKKwkJCSAgIHdtaV9hYmlfdmVyc2lvbiAqbXlfdmVycywKKwkJCSAgIHdtaV9hYmlfdmVyc2lvbiAqb3BwX3ZlcnMsCisJCQkgICB3bWlfYWJpX3ZlcnNpb24gKm91dF92ZXJzKQoreworCUFfVUlOVDggY2FuX3RyeV90b19kb3duZ3JhZGU7CisJQV9VSU5UMzIgbXlfbWFqb3JfdmVycyA9IFdNSV9WRVJfR0VUX01BSk9SKG15X3ZlcnMtPmFiaV92ZXJzaW9uXzApOworCUFfVUlOVDMyIG15X21pbm9yX3ZlcnMgPSBXTUlfVkVSX0dFVF9NSU5PUihteV92ZXJzLT5hYmlfdmVyc2lvbl8wKTsKKwlBX1VJTlQzMiBvcHBfbWFqb3JfdmVycyA9IFdNSV9WRVJfR0VUX01BSk9SKG9wcF92ZXJzLT5hYmlfdmVyc2lvbl8wKTsKKwlBX1VJTlQzMiBvcHBfbWlub3JfdmVycyA9IFdNSV9WRVJfR0VUX01JTk9SKG9wcF92ZXJzLT5hYmlfdmVyc2lvbl8wKTsKKwlBX1VJTlQzMiBkb3duZ3JhZGVkX21pbm9yX3ZlcnM7CisKKwlpZiAoKG15X3ZlcnMtPmFiaV92ZXJzaW9uX25zXzAgIT0gb3BwX3ZlcnMtPmFiaV92ZXJzaW9uX25zXzApIHx8CisJICAgIChteV92ZXJzLT5hYmlfdmVyc2lvbl9uc18xICE9IG9wcF92ZXJzLT5hYmlfdmVyc2lvbl9uc18xKSB8fAorCSAgICAobXlfdmVycy0+YWJpX3ZlcnNpb25fbnNfMiAhPSBvcHBfdmVycy0+YWJpX3ZlcnNpb25fbnNfMikgfHwKKwkgICAgKG15X3ZlcnMtPmFiaV92ZXJzaW9uX25zXzMgIT0gb3BwX3ZlcnMtPmFiaV92ZXJzaW9uX25zXzMpKSB7CisJCS8qIFRoZSBuYW1lc3BhY2VzIGFyZSBkaWZmZXJlbnQuIEluY29tcGF0aWJsZS4gKi8KKwkJY2FuX3RyeV90b19kb3duZ3JhZGUgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKG15X21ham9yX3ZlcnMgIT0gb3BwX21ham9yX3ZlcnMpIHsKKwkJLyogTWFqb3IgdmVyc2lvbiBpcyBkaWZmZXJlbnQuIEluY29tcGF0aWJsZSBhbmQgY2Fubm90IGRvd25ncmFkZS4gKi8KKwkJY2FuX3RyeV90b19kb3duZ3JhZGUgPSBmYWxzZTsKKwl9IGVsc2UgeworCQkvKiBTYW1lIG1ham9yIHZlcnNpb24uICovCisKKwkJaWYgKG15X21pbm9yX3ZlcnMgPCBvcHBfbWlub3JfdmVycykgeworCQkJLyogT3Bwb3NpdGUgcGFydHkgaXMgbmV3ZXIuIEluY29tcGF0aWJsZSBhbmQgY2Fubm90IGRvd25ncmFkZS4gKi8KKwkJCWNhbl90cnlfdG9fZG93bmdyYWRlID0gZmFsc2U7CisJCX0gZWxzZSBpZiAobXlfbWlub3JfdmVycyA+IG9wcF9taW5vcl92ZXJzKSB7CisJCQkvKiBPcHBvc2l0ZSBwYXJ0eSBpcyBvbGRlci4gQ2hlY2sgd2hpdGVsaXN0IGlmIHdlIGNhbiBkb3duZ3JhZGUgKi8KKwkJCWNhbl90cnlfdG9fZG93bmdyYWRlID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNhbWUgdmVyc2lvbiAqLworCQkJd21pX3Rsdl9PU19NRU1DUFkob3V0X3ZlcnMsIG15X3ZlcnMsCisJCQkJCSAgc2l6ZW9mKHdtaV9hYmlfdmVyc2lvbikpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAoIWNhbl90cnlfdG9fZG93bmdyYWRlKSB7CisJCXdtaV90bHZfcHJpbnRfZXJyb3IoIiVzOiBXYXJuaW5nOiBpbmNvbXBhdGlibGUgV01JIHZlcnNpb24uXG4iLAorCQkJCSAgICBfX2Z1bmNfXyk7CisJCXdtaV90bHZfT1NfTUVNQ1BZKG91dF92ZXJzLCBteV92ZXJzLCBzaXplb2Yod21pX2FiaV92ZXJzaW9uKSk7CisJCXJldHVybiAwOworCX0KKwkvKiBUcnkgdG8gc2VlIHdlIGNhbiBkb3duZ3JhZGUgdGhlIHN1cHBvcnRlZCB2ZXJzaW9uICovCisJZG93bmdyYWRlZF9taW5vcl92ZXJzID0gbXlfbWlub3JfdmVyczsKKwl3aGlsZSAoZG93bmdyYWRlZF9taW5vcl92ZXJzID4gb3BwX21pbm9yX3ZlcnMpIHsKKwkJQV9VSU5UOCBkb3duZ3JhZGVkID0gZmFsc2U7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1fd2hpdGVsaXN0OyBpKyspIHsKKwkJCWlmICh2ZXJzaW9uX3doaXRlbGlzdF90YWJsZVtpXS5tYWpvciAhPSBteV9tYWpvcl92ZXJzKSB7CisJCQkJY29udGludWU7ICAgICAgIC8qIHNraXAgKi8KKwkJCX0KKwkJCWlmICgodmVyc2lvbl93aGl0ZWxpc3RfdGFibGVbaV0ubmFtZXNwYWNlXzAgIT0KKwkJCSAgICAgbXlfdmVycy0+YWJpX3ZlcnNpb25fbnNfMCkKKwkJCSAgICB8fCAodmVyc2lvbl93aGl0ZWxpc3RfdGFibGVbaV0ubmFtZXNwYWNlXzEgIT0KKwkJCQlteV92ZXJzLT5hYmlfdmVyc2lvbl9uc18xKQorCQkJICAgIHx8ICh2ZXJzaW9uX3doaXRlbGlzdF90YWJsZVtpXS5uYW1lc3BhY2VfMiAhPQorCQkJCW15X3ZlcnMtPmFiaV92ZXJzaW9uX25zXzIpCisJCQkgICAgfHwgKHZlcnNpb25fd2hpdGVsaXN0X3RhYmxlW2ldLm5hbWVzcGFjZV8zICE9CisJCQkJbXlfdmVycy0+YWJpX3ZlcnNpb25fbnNfMykpIHsKKwkJCQljb250aW51ZTsgICAgICAgLyogc2tpcCAqLworCQkJfQorCQkJaWYgKHZlcnNpb25fd2hpdGVsaXN0X3RhYmxlW2ldLm1pbm9yID09CisJCQkgICAgZG93bmdyYWRlZF9taW5vcl92ZXJzKSB7CisJCQkJLyogRm91bmQgdGhlIG5leHQgdmVyc2lvbiB0aGF0IEkgY2FuIGRvd25ncmFkZSAqLworCQkJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCQkJKCIlczogTm90ZTogZm91bmQgYSB3aGl0ZWxpc3QgZW50cnkgdG8gZG93bmdyYWRlLiB3aC4gbGlzdCB2ZXI6ICVkLCVkLDB4JXggMHgleCAweCV4IDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLCB2ZXJzaW9uX3doaXRlbGlzdF90YWJsZVtpXS5tYWpvciwKKwkJCQkJdmVyc2lvbl93aGl0ZWxpc3RfdGFibGVbaV0ubWlub3IsCisJCQkJCXZlcnNpb25fd2hpdGVsaXN0X3RhYmxlW2ldLm5hbWVzcGFjZV8wLAorCQkJCQl2ZXJzaW9uX3doaXRlbGlzdF90YWJsZVtpXS5uYW1lc3BhY2VfMSwKKwkJCQkJdmVyc2lvbl93aGl0ZWxpc3RfdGFibGVbaV0ubmFtZXNwYWNlXzIsCisJCQkJCXZlcnNpb25fd2hpdGVsaXN0X3RhYmxlW2ldLm5hbWVzcGFjZV8zKTsKKwkJCQlkb3duZ3JhZGVkX21pbm9yX3ZlcnMtLTsKKwkJCQlkb3duZ3JhZGVkID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWRvd25ncmFkZWQpIHsKKwkJCWJyZWFrOyAgLyogRG9uZSBzaW5jZSB3ZSBkaWQgbm90IGZpbmQgYW55IHdoaXRlbGlzdCB0byBkb3duZ3JhZGUgdmVyc2lvbiAqLworCQl9CisJfQorCXdtaV90bHZfT1NfTUVNQ1BZKG91dF92ZXJzLCBteV92ZXJzLCBzaXplb2Yod21pX2FiaV92ZXJzaW9uKSk7CisJb3V0X3ZlcnMtPmFiaV92ZXJzaW9uXzAgPQorCQlXTUlfVkVSX0dFVF9WRVJTSU9OXzAobXlfbWFqb3JfdmVycywgZG93bmdyYWRlZF9taW5vcl92ZXJzKTsKKwlpZiAoZG93bmdyYWRlZF9taW5vcl92ZXJzICE9IG9wcF9taW5vcl92ZXJzKSB7CisJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCSgiJXM6IFdhcm5pbmc6IGluY29tcGF0aWJsZSBXTUkgdmVyc2lvbiBhbmQgY2Fubm90IGRvd25ncmFkZS5cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAwOyAgICAgICAvKiBJbmNvbXBhdGlibGUgKi8KKwl9IGVsc2UgeworCQlyZXR1cm4gMTsgICAgICAgLyogQ29tcGF0aWJsZSAqLworCX0KK30KKworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGNvbXBhcmUgYW5kIHNldCB0aGUgV01JIEFCSSB2ZXJzaW9uLgorICogRmlyc3QsIGNvbXBhcmUgbXkgdmVyc2lvbiB3aXRoIHRoZSBvcHBvc2l0ZSBzaWRlJ3MgdmVyc2lvbi4KKyAqIElmIGluY29tcGF0aWJsZSwgdGhlbiBjaGVjayB0aGUgd2hpdGVsaXN0IHRvIHNlZSBpZiBvdXIgc2lkZSBjYW4gZG93bmdyYWRlLgorICogRmluYWxseSwgZmlsbCBpbiB0aGUgZmluYWwgQUJJIHZlcnNpb24gaW50byB0aGUgb3V0cHV0LCBvdXRfdmVycy4KKyAqIFJldHVybiAwIGlmIHRoZSBvdXRwdXQgdmVyc2lvbiBpcyBjb21wYXRpYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICogRWxzZSByZXR1cm4gMSBpZiB0aGUgb3V0cHV0IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICovCitpbnQKK3dtaV9jbXBfYW5kX3NldF9hYmlfdmVyc2lvbihpbnQgbnVtX3doaXRlbGlzdCwKKwkJCSAgICB3bWlfd2hpdGVsaXN0X3ZlcnNpb25faW5mbyAqCisJCQkgICAgdmVyc2lvbl93aGl0ZWxpc3RfdGFibGUsCisJCQkgICAgc3RydWN0IF93bWlfYWJpX3ZlcnNpb24gKm15X3ZlcnMsCisJCQkgICAgc3RydWN0IF93bWlfYWJpX3ZlcnNpb24gKm9wcF92ZXJzLAorCQkJICAgIHN0cnVjdCBfd21pX2FiaV92ZXJzaW9uICpvdXRfdmVycykKK3sKKwl3bWlfdGx2X3ByaW50X3ZlcmJvc2UKKwkJKCIlczogT3VyIFdNSSBWZXJzaW9uOiBNaj0lZCwgTW49JWQsIGJkPSVkLCBuczA9MHgleCBuczE6MHgleCBuczI6MHgleCBuczM6MHgleFxuIiwKKwkJX19mdW5jX18sIFdNSV9WRVJfR0VUX01BSk9SKG15X3ZlcnMtPmFiaV92ZXJzaW9uXzApLAorCQlXTUlfVkVSX0dFVF9NSU5PUihteV92ZXJzLT5hYmlfdmVyc2lvbl8wKSwgbXlfdmVycy0+YWJpX3ZlcnNpb25fMSwKKwkJbXlfdmVycy0+YWJpX3ZlcnNpb25fbnNfMCwgbXlfdmVycy0+YWJpX3ZlcnNpb25fbnNfMSwKKwkJbXlfdmVycy0+YWJpX3ZlcnNpb25fbnNfMiwgbXlfdmVycy0+YWJpX3ZlcnNpb25fbnNfMyk7CisKKwl3bWlfdGx2X3ByaW50X3ZlcmJvc2UKKwkJKCIlczogT3Bwb3NpdGUgc2lkZSBXTUkgVmVyc2lvbjogTWo9JWQsIE1uPSVkLCBiZD0lZCwgbnMwPTB4JXggbnMxOjB4JXggbnMyOjB4JXggbnMzOjB4JXhcbiIsCisJCV9fZnVuY19fLCBXTUlfVkVSX0dFVF9NQUpPUihvcHBfdmVycy0+YWJpX3ZlcnNpb25fMCksCisJCVdNSV9WRVJfR0VUX01JTk9SKG9wcF92ZXJzLT5hYmlfdmVyc2lvbl8wKSwKKwkJb3BwX3ZlcnMtPmFiaV92ZXJzaW9uXzEsIG9wcF92ZXJzLT5hYmlfdmVyc2lvbl9uc18wLAorCQlvcHBfdmVycy0+YWJpX3ZlcnNpb25fbnNfMSwgb3BwX3ZlcnMtPmFiaV92ZXJzaW9uX25zXzIsCisJCW9wcF92ZXJzLT5hYmlfdmVyc2lvbl9uc18zKTsKKworCS8qIEJ5IGRlZmF1bHQsIHRoZSBvdXRwdXQgdmVyc2lvbiBpcyBvdXIgdmVyc2lvbi4gKi8KKwl3bWlfdGx2X09TX01FTUNQWShvdXRfdmVycywgbXlfdmVycywgc2l6ZW9mKHdtaV9hYmlfdmVyc2lvbikpOworCWlmICghd21pX3ZlcnNpb25zX2FyZV9jb21wYXRpYmxlKG15X3ZlcnMsIG9wcF92ZXJzKSkgeworCQkvKiBPdXIgaG9zdCB2ZXJzaW9uIGFuZCB0aGUgZ2l2ZW4gZmlybXdhcmUgdmVyc2lvbiBhcmUgaW5jb21wYXRpYmxlLiAqLworCQlpZiAod21pX3ZlcnNpb25zX2Nhbl9kb3duZ3JhZGUKKwkJCSAgICAobnVtX3doaXRlbGlzdCwgdmVyc2lvbl93aGl0ZWxpc3RfdGFibGUsIG15X3ZlcnMsIG9wcF92ZXJzLAorCQkJICAgIG91dF92ZXJzKSkgeworCQkJLyogV2UgY2FuIGRvd25ncmFkZSBvdXIgaG9zdCB2ZXJzaW9ucyB0byBtYXRjaCBmaXJtd2FyZS4gKi8KKwkJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCQkoIiVzOiBIb3N0IGRvd25ncmFkZWQgV01JIFZlcnNpb25zIHRvIG1hdGNoIGZ3LiBSZXQgdmVyc2lvbjogTWo9JWQsIE1uPSVkLCBiZD0lZCwgbnMwPTB4JXggbnMxOjB4JXggbnMyOjB4JXggbnMzOjB4JXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJV01JX1ZFUl9HRVRfTUFKT1Iob3V0X3ZlcnMtPmFiaV92ZXJzaW9uXzApLAorCQkJCVdNSV9WRVJfR0VUX01JTk9SKG91dF92ZXJzLT5hYmlfdmVyc2lvbl8wKSwKKwkJCQlvdXRfdmVycy0+YWJpX3ZlcnNpb25fMSwKKwkJCQlvdXRfdmVycy0+YWJpX3ZlcnNpb25fbnNfMCwKKwkJCQlvdXRfdmVycy0+YWJpX3ZlcnNpb25fbnNfMSwKKwkJCQlvdXRfdmVycy0+YWJpX3ZlcnNpb25fbnNfMiwKKwkJCQlvdXRfdmVycy0+YWJpX3ZlcnNpb25fbnNfMyk7CisJCQlyZXR1cm4gMDsgICAgICAgLyogQ29tcGF0aWJsZSAqLworCQl9IGVsc2UgeworCQkJLyogV2FybjogV2UgY2Fubm90IGRvd25ncmFkZSBvdXIgaG9zdCB2ZXJzaW9ucyB0byBtYXRjaCBmaXJtd2FyZS4gKi8KKwkJCXdtaV90bHZfcHJpbnRfZXJyb3IKKwkJCQkoIiVzOiBXQVJOOiBIb3N0IFdNSSBWZXJzaW9ucyBtaXNtYXRjaCB3aXRoIGZ3LiBSZXQgdmVyc2lvbjogTWo9JWQsIE1uPSVkLCBiZD0lZCwgbnMwPTB4JXggbnMxOjB4JXggbnMyOjB4JXggbnMzOjB4JXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJV01JX1ZFUl9HRVRfTUFKT1Iob3V0X3ZlcnMtPmFiaV92ZXJzaW9uXzApLAorCQkJCVdNSV9WRVJfR0VUX01JTk9SKG91dF92ZXJzLT5hYmlfdmVyc2lvbl8wKSwKKwkJCQlvdXRfdmVycy0+YWJpX3ZlcnNpb25fMSwKKwkJCQlvdXRfdmVycy0+YWJpX3ZlcnNpb25fbnNfMCwKKwkJCQlvdXRfdmVycy0+YWJpX3ZlcnNpb25fbnNfMSwKKwkJCQlvdXRfdmVycy0+YWJpX3ZlcnNpb25fbnNfMiwKKwkJCQlvdXRfdmVycy0+YWJpX3ZlcnNpb25fbnNfMyk7CisKKwkJCXJldHVybiAxOyAgICAgICAvKiBJbmNvbXBhdGlibGUgKi8KKwkJfQorCX0gZWxzZSB7CisJCS8qIFdlIGFyZSBjb21wYXRpYmxlLiBPdXIgaG9zdCB2ZXJzaW9uIGlzIHRoZSBvdXRwdXQgdmVyc2lvbiAqLworCQl3bWlfdGx2X3ByaW50X3ZlcmJvc2UKKwkJCSgiJXM6IEhvc3QgYW5kIEZXIENvbXBhdGlibGUgV01JIFZlcnNpb25zLiBSZXQgdmVyc2lvbjogTWo9JWQsIE1uPSVkLCBiZD0lZCwgbnMwPTB4JXggbnMxOjB4JXggbnMyOjB4JXggbnMzOjB4JXhcbiIsCisJCQlfX2Z1bmNfXywgV01JX1ZFUl9HRVRfTUFKT1Iob3V0X3ZlcnMtPmFiaV92ZXJzaW9uXzApLAorCQkJV01JX1ZFUl9HRVRfTUlOT1Iob3V0X3ZlcnMtPmFiaV92ZXJzaW9uXzApLAorCQkJb3V0X3ZlcnMtPmFiaV92ZXJzaW9uXzEsIG91dF92ZXJzLT5hYmlfdmVyc2lvbl9uc18wLAorCQkJb3V0X3ZlcnMtPmFiaV92ZXJzaW9uX25zXzEsIG91dF92ZXJzLT5hYmlfdmVyc2lvbl9uc18yLAorCQkJb3V0X3ZlcnMtPmFiaV92ZXJzaW9uX25zXzMpOworCQlyZXR1cm4gMDsgICAgICAgLyogQ29tcGF0aWJsZSAqLworCX0KK30KZGlmZiAtLWdpdCBhL2NvcmUvd21pL3dtaV90bHZfcGxhdGZvcm0uYyBiL2NvcmUvd21pL3dtaV90bHZfcGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2MyMGJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS93bWkvd21pX3Rsdl9wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBMTUFDIG9mZmxvYWQgaW50ZXJmYWNlIGZ1bmN0aW9ucyBmb3IgV01JIFRMViBJbnRlcmZhY2UKKyAqLworCisjaW5jbHVkZSAib2xfaWZfYXRodmFyLmgiCisjaW5jbHVkZSA8Y2RmX21lbW9yeS5oPiAgICAgICAgIC8qIGNkZl9tZW1fbWFsbG9jLGZyZWUsIGV0Yy4gKi8KKyNpbmNsdWRlIDxvc2RlcC5oPgorI2luY2x1ZGUgImh0Y19hcGkuaCIKKyNpbmNsdWRlICJ3bWkuaCIKKyNpbmNsdWRlICJ3bWEuaCIKKworLyogUUNBIE1haW4gaG9zdCBoYXMgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgc2hvdWxkIG5vdCBkZWZpbmUgTk9fRFlOQU1JQ19NRU1fQUxMT0MgKi8KKy8qICNkZWZpbmUgTk9fRFlOQU1JQ19NRU1fQUxMT0MgKi8KKworLyogRm9sbG93aW5nIG1hY3JvIGRlZmluaXRpb25zIHVzZSBPUyBvciBwbGF0Zm9ybSBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KKy8qIEZvbGxvd2luZyBtYWNybyBkZWZpbml0aW9ucyB1c2UgUUNBIE1BSU4gd2luZG93cyBob3N0IGRyaXZlcihhcHBsaWNhYmxlIGZvciBQZXJpZ3JlbmUgYW5kIGl0cyBmdXR1cmUgcGxhdGZvcm1zLAorICAgIFByb250byBhbmQgaXRzIGZ1dHVyZSBwbGF0Zm9ybXMpIHNwZWNpZmljIEFQSXMgKi8KKyNkZWZpbmUgZHVtbXlfcHJpbnQoZm10LCAuLi4pIHt9CisjZGVmaW5lIHdtaV90bHZfcHJpbnRfdmVyYm9zZSBkdW1teV9wcmludAorI2RlZmluZSB3bWlfdGx2X3ByaW50X2Vycm9yICAgY2RmX3ByaW50CisjZGVmaW5lIHdtaV90bHZfT1NfTUVNQ1BZICAgICBPU19NRU1DUFkKKyNkZWZpbmUgd21pX3Rsdl9PU19NRU1aRVJPICAgIE9TX01FTVpFUk8KKyNkZWZpbmUgd21pX3Rsdl9PU19NRU1NT1ZFICAgIE9TX01FTU1PVkUKKworI2lmbmRlZiBOT19EWU5BTUlDX01FTV9BTExPQworI2RlZmluZSB3bWlfdGx2X29zX21lbV9hbGxvYyhzY24sIHB0ciwgbnVtQnl0ZXMpIFwKKwl7IFwKKwkJKHB0cikgPSBvc19tYWxsb2MoTlVMTCwgKG51bUJ5dGVzKSwgR0ZQX0FUT01JQyk7IFwKKwl9CisjZGVmaW5lIHdtaV90bHZfb3NfbWVtX2ZyZWUgICBjZGZfbWVtX2ZyZWUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS93bWkvd21pX3VuaWZpZWQuYyBiL2NvcmUvd21pL3dtaV91bmlmaWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhM2VhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvd21pL3dtaV91bmlmaWVkLmMKQEAgLTAsMCArMSwxMjIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIEhvc3QgV01JIHVuaWZpZWQgaW1wbGVtZW50YXRpb24KKyAqLworI2luY2x1ZGUgImF0aGRlZnMuaCIKKyNpbmNsdWRlICJvc2FwaV9saW51eC5oIgorI2luY2x1ZGUgImFfdHlwZXMuaCIKKyNpbmNsdWRlICJhX2RlYnVnLmgiCisjaW5jbHVkZSAib2xfaWZfYXRodmFyLmgiCisjaW5jbHVkZSAib2xfZGVmaW5lcy5oIgorI2luY2x1ZGUgIm9sX2Z3LmgiCisjaW5jbHVkZSAiaHRjX2FwaS5oIgorI2luY2x1ZGUgImh0Y19hcGkuaCIKKyNpbmNsdWRlICJkYmdsb2dfaG9zdC5oIgorI2luY2x1ZGUgIndtaS5oIgorI2luY2x1ZGUgIndtaV91bmlmaWVkX3ByaXYuaCIKKyNpbmNsdWRlICJ3bWFfYXBpLmgiCisjaW5jbHVkZSAid21hLmgiCisjaW5jbHVkZSAibWFjX3RyYWNlLmgiCisKKyNkZWZpbmUgV01JX01JTl9IRUFEX1JPT00gNjQKKworI2lmZGVmIFdNSV9JTlRFUkZBQ0VfRVZFTlRfTE9HR0lORworLyogV01JIGNvbW1hbmRzICovCit1aW50MzJfdCBnX3dtaV9jb21tYW5kX2J1Zl9pZHggPSAwOworc3RydWN0IHdtaV9jb21tYW5kX2RlYnVnIHdtaV9jb21tYW5kX2xvZ19idWZmZXJbV01JX0VWRU5UX0RFQlVHX01BWF9FTlRSWV07CisKKy8qIFdNSSBjb21tYW5kcyBUWCBjb21wbGV0ZWQgKi8KK3VpbnQzMl90IGdfd21pX2NvbW1hbmRfdHhfY21wX2J1Zl9pZHggPSAwOworc3RydWN0IHdtaV9jb21tYW5kX2RlYnVnCisJd21pX2NvbW1hbmRfdHhfY21wX2xvZ19idWZmZXJbV01JX0VWRU5UX0RFQlVHX01BWF9FTlRSWV07CisKKy8qIFdNSSBldmVudHMgd2hlbiBwcm9jZXNzZWQgKi8KK3VpbnQzMl90IGdfd21pX2V2ZW50X2J1Zl9pZHggPSAwOworc3RydWN0IHdtaV9ldmVudF9kZWJ1ZyB3bWlfZXZlbnRfbG9nX2J1ZmZlcltXTUlfRVZFTlRfREVCVUdfTUFYX0VOVFJZXTsKKworLyogV01JIGV2ZW50cyB3aGVuIHF1ZXVlZCAqLwordWludDMyX3QgZ193bWlfcnhfZXZlbnRfYnVmX2lkeCA9IDA7CitzdHJ1Y3Qgd21pX2V2ZW50X2RlYnVnIHdtaV9yeF9ldmVudF9sb2dfYnVmZmVyW1dNSV9FVkVOVF9ERUJVR19NQVhfRU5UUlldOworCisjZGVmaW5lIFdNSV9DT01NQU5EX1JFQ09SRChhLCBiKSB7CQkJCQlcCisJCWlmIChXTUlfRVZFTlRfREVCVUdfTUFYX0VOVFJZIDw9IGdfd21pX2NvbW1hbmRfYnVmX2lkeCkJCVwKKwkJCWdfd21pX2NvbW1hbmRfYnVmX2lkeCA9IDA7CQkJCVwKKwkJd21pX2NvbW1hbmRfbG9nX2J1ZmZlcltnX3dtaV9jb21tYW5kX2J1Zl9pZHhdLmNvbW1hbmQgPSBhOwlcCisJCWNkZl9tZW1fY29weSh3bWlfY29tbWFuZF9sb2dfYnVmZmVyW2dfd21pX2NvbW1hbmRfYnVmX2lkeF0uZGF0YSwgYiwgMTYpOyBcCisJCXdtaV9jb21tYW5kX2xvZ19idWZmZXJbZ193bWlfY29tbWFuZF9idWZfaWR4XS50aW1lID0JCVwKKwkJCWNkZl9nZXRfbG9nX3RpbWVzdGFtcCgpOwkJCQkJXAorCQlnX3dtaV9jb21tYW5kX2J1Zl9pZHgrKzsJCQkJCVwKK30KKworI2RlZmluZSBXTUlfQ09NTUFORF9UWF9DTVBfUkVDT1JEKGEsIGIpIHsJCQkJXAorCQlpZiAoV01JX0VWRU5UX0RFQlVHX01BWF9FTlRSWSA8PSBnX3dtaV9jb21tYW5kX3R4X2NtcF9idWZfaWR4KQlcCisJCQlnX3dtaV9jb21tYW5kX3R4X2NtcF9idWZfaWR4ID0gMDsJCQlcCisJCXdtaV9jb21tYW5kX3R4X2NtcF9sb2dfYnVmZmVyW2dfd21pX2NvbW1hbmRfdHhfY21wX2J1Zl9pZHhdLmNvbW1hbmQgPSBhOyBcCisJCWNkZl9tZW1fY29weSh3bWlfY29tbWFuZF90eF9jbXBfbG9nX2J1ZmZlcgkJCVwKKwkJCSAgICAgW2dfd21pX2NvbW1hbmRfdHhfY21wX2J1Zl9pZHhdLmRhdGEsIGIsIDE2KTsJICAgICBcCisJCXdtaV9jb21tYW5kX3R4X2NtcF9sb2dfYnVmZmVyW2dfd21pX2NvbW1hbmRfdHhfY21wX2J1Zl9pZHhdLnRpbWUgPSBcCisJCQljZGZfZ2V0X2xvZ190aW1lc3RhbXAoKTsJCQkJCVwKKwkJZ193bWlfY29tbWFuZF90eF9jbXBfYnVmX2lkeCsrOwkJCQkJXAorfQorCisjZGVmaW5lIFdNSV9FVkVOVF9SRUNPUkQoYSwgYikgewkJCQkJXAorCQlpZiAoV01JX0VWRU5UX0RFQlVHX01BWF9FTlRSWSA8PSBnX3dtaV9ldmVudF9idWZfaWR4KQkJXAorCQkJZ193bWlfZXZlbnRfYnVmX2lkeCA9IDA7CQkJCVwKKwkJd21pX2V2ZW50X2xvZ19idWZmZXJbZ193bWlfZXZlbnRfYnVmX2lkeF0uZXZlbnQgPSBhOwkJXAorCQljZGZfbWVtX2NvcHkod21pX2V2ZW50X2xvZ19idWZmZXJbZ193bWlfZXZlbnRfYnVmX2lkeF0uZGF0YSwgYiwgMTYpOyBcCisJCXdtaV9ldmVudF9sb2dfYnVmZmVyW2dfd21pX2V2ZW50X2J1Zl9pZHhdLnRpbWUgPQkJXAorCQkJY2RmX2dldF9sb2dfdGltZXN0YW1wKCk7CQkJCQlcCisJCWdfd21pX2V2ZW50X2J1Zl9pZHgrKzsJCQkJCQlcCit9CisKKyNkZWZpbmUgV01JX1JYX0VWRU5UX1JFQ09SRChhLGIpIHsJCQkJCVwKKwkJaWYgKFdNSV9FVkVOVF9ERUJVR19NQVhfRU5UUlkgPD0gZ193bWlfcnhfZXZlbnRfYnVmX2lkeCkJXAorCQkJZ193bWlfcnhfZXZlbnRfYnVmX2lkeCA9IDA7CQkJCQlcCisJCXdtaV9yeF9ldmVudF9sb2dfYnVmZmVyW2dfd21pX3J4X2V2ZW50X2J1Zl9pZHhdLmV2ZW50ID0gYTsJXAorCQljZGZfbWVtX2NvcHkod21pX3J4X2V2ZW50X2xvZ19idWZmZXJbZ193bWlfcnhfZXZlbnRfYnVmX2lkeF0uZGF0YSwgYiwgMTYpOyBcCisJCXdtaV9yeF9ldmVudF9sb2dfYnVmZmVyW2dfd21pX3J4X2V2ZW50X2J1Zl9pZHhdLnRpbWUgPQkJXAorCQkJY2RmX2dldF9sb2dfdGltZXN0YW1wKCk7CQkJCQlcCisJCWdfd21pX3J4X2V2ZW50X2J1Zl9pZHgrKzsJCQkJCVwKK30KKworI2VuZGlmIC8qV01JX0lOVEVSRkFDRV9FVkVOVF9MT0dHSU5HICovCisKK3N0YXRpYyB2b2lkIF9fd21pX2NvbnRyb2xfcngoc3RydWN0IHdtaV91bmlmaWVkICp3bWlfaGFuZGxlLCB3bWlfYnVmX3QgZXZ0X2J1Zik7CitpbnQgd21pX2dldF9ob3N0X2NyZWRpdHMod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlKTsKKy8qIFdNSSBidWZmZXIgQVBJcyAqLworCisjaWZkZWYgTUVNT1JZX0RFQlVHCit3bWlfYnVmX3QKK3dtaV9idWZfYWxsb2NfZGVidWcod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCB1aW50MTZfdCBsZW4sIHVpbnQ4X3QgKmZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGluZV9udW0pCit7CisJd21pX2J1Zl90IHdtaV9idWY7CisKKwlpZiAocm91bmR1cChsZW4gKyBXTUlfTUlOX0hFQURfUk9PTSwgNCkgPiB3bWlfaGFuZGxlLT5tYXhfbXNnX2xlbikgeworCQlDREZfQVNTRVJUKDApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3bWlfYnVmID0gY2RmX25idWZfYWxsb2NfZGVidWcoTlVMTCwKKwkJCQkgICAgICAgcm91bmR1cChsZW4gKyBXTUlfTUlOX0hFQURfUk9PTSwgNCksCisJCQkJICAgICAgIFdNSV9NSU5fSEVBRF9ST09NLCA0LCBmYWxzZSwgZmlsZV9uYW1lLAorCQkJCSAgICAgICBsaW5lX251bSk7CisKKwlpZiAoIXdtaV9idWYpCisJCXJldHVybiBOVUxMOworCisJLyogQ2xlYXIgdGhlIHdtaSBidWZmZXIgKi8KKwlPU19NRU1aRVJPKGNkZl9uYnVmX2RhdGEod21pX2J1ZiksIGxlbik7CisKKwkvKgorCSAqIFNldCB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgdG8gbWF0Y2ggdGhlIGFsbG9jYXRpb24gc2l6ZS4KKwkgKi8KKwljZGZfbmJ1Zl9zZXRfcGt0bGVuKHdtaV9idWYsIGxlbik7CisKKwlyZXR1cm4gd21pX2J1ZjsKK30KKwordm9pZCB3bWlfYnVmX2ZyZWUod21pX2J1Zl90IG5ldF9idWYpCit7CisJY2RmX25idWZfZnJlZShuZXRfYnVmKTsKK30KKyNlbHNlCit3bWlfYnVmX3Qgd21pX2J1Zl9hbGxvYyh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIHVpbnQxNl90IGxlbikKK3sKKwl3bWlfYnVmX3Qgd21pX2J1ZjsKKworCWlmIChyb3VuZHVwKGxlbiArIFdNSV9NSU5fSEVBRF9ST09NLCA0KSA+IHdtaV9oYW5kbGUtPm1heF9tc2dfbGVuKSB7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXdtaV9idWYgPSBjZGZfbmJ1Zl9hbGxvYyhOVUxMLCByb3VuZHVwKGxlbiArIFdNSV9NSU5fSEVBRF9ST09NLCA0KSwKKwkJCQlXTUlfTUlOX0hFQURfUk9PTSwgNCwgZmFsc2UpOworCWlmICghd21pX2J1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBDbGVhciB0aGUgd21pIGJ1ZmZlciAqLworCU9TX01FTVpFUk8oY2RmX25idWZfZGF0YSh3bWlfYnVmKSwgbGVuKTsKKworCS8qCisJICogU2V0IHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byBtYXRjaCB0aGUgYWxsb2NhdGlvbiBzaXplLgorCSAqLworCWNkZl9uYnVmX3NldF9wa3RsZW4od21pX2J1ZiwgbGVuKTsKKwlyZXR1cm4gd21pX2J1ZjsKK30KKwordm9pZCB3bWlfYnVmX2ZyZWUod21pX2J1Zl90IG5ldF9idWYpCit7CisJY2RmX25idWZfZnJlZShuZXRfYnVmKTsKK30KKyNlbmRpZgorCisvKioKKyAqIHdtaV9nZXRfbWF4X21zZ19sZW4oKSAtIGdldCBtYXhpbXVtIFdNSSBtZXNzYWdlIGxlbmd0aAorICogQHdtaV9oYW5kbGU6IFdNSSBoYW5kbGUuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBtYXhpbXVtIFdNSSBtZXNzYWdlIGxlbmd0aAorICoKKyAqIFJldHVybjogbWF4aW11bSBXTUkgbWVzc2FnZSBsZW5ndGgKKyAqLwordWludDE2X3Qgd21pX2dldF9tYXhfbXNnX2xlbih3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUpCit7CisJcmV0dXJuIHdtaV9oYW5kbGUtPm1heF9tc2dfbGVuIC0gV01JX01JTl9IRUFEX1JPT007Cit9CisKK3N0YXRpYyB1aW50OF90ICpnZXRfd21pX2NtZF9zdHJpbmcoV01JX0NNRF9JRCB3bWlfY29tbWFuZCkKK3sKKwlzd2l0Y2ggKHdtaV9jb21tYW5kKSB7CisJCS8qKiBpbml0aWFsaXplIHRoZSB3bGFuIHN1YiBzeXN0ZW0gKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9JTklUX0NNRElEKTsKKworCQkvKiBTY2FuIHNwZWNpZmljIGNvbW1hbmRzICovCisKKwkJLyoqIHN0YXJ0IHNjYW4gcmVxdWVzdCB0byBGVyAgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9TVEFSVF9TQ0FOX0NNRElEKTsKKwkJLyoqIHN0b3Agc2NhbiByZXF1ZXN0IHRvIEZXICAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1NUT1BfU0NBTl9DTURJRCk7CisJCS8qKiBmdWxsIGxpc3Qgb2YgY2hhbm5lbHMgYXMgZGVmaW5lZCBieSB0aGUgcmVndWxhdG9yeSB0aGF0IHdpbGwgYmUgdXNlZCBieSBzY2FubmVyICAgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9TQ0FOX0NIQU5fTElTVF9DTURJRCk7CisJCS8qKiBvdmVyd3JpdGUgZGVmYXVsdCBwcmlvcml0eSB0YWJsZSBpbiBzY2FuIHNjaGVkdWxlciAgICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU0NBTl9TQ0hfUFJJT19UQkxfQ01ESUQpOworCQkvKiogVGhpcyBjb21tYW5kIHRvIGFkanVzdCB0aGUgcHJpb3JpdHkgYW5kIG1pbi5tYXhfcmVzdF90aW1lCisJCSAqIG9mIGFuIG9uIG9uZ29pbmcgc2NhbiByZXF1ZXN0LgorCQkgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9TQ0FOX1VQREFURV9SRVFVRVNUX0NNRElEKTsKKworCQkvKiBQREVWKHBoeXNpY2FsIGRldmljZSkgc3BlY2lmaWMgY29tbWFuZHMgKi8KKwkJLyoqIHNldCByZWd1bGF0b3J0eSBjdGwgaWQgdXNlZCBieSBGVyB0byBkZXRlcm1pbmUgdGhlIGV4YWN0IGN0bCBwb3dlciBsaW1pdHMgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QREVWX1NFVF9SRUdET01BSU5fQ01ESUQpOworCQkvKiogc2V0IGNoYW5uZWwuIG1haW5seSB1c2VkIGZvciBzdXBwb3J0aW5nIG1vbml0b3IgbW9kZSAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BERVZfU0VUX0NIQU5ORUxfQ01ESUQpOworCQkvKiogc2V0IHBkZXYgc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BERVZfU0VUX1BBUkFNX0NNRElEKTsKKwkJLyoqIGVuYWJsZSBwYWNrZXQgbG9nICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUERFVl9QS1RMT0dfRU5BQkxFX0NNRElEKTsKKwkJLyoqIGRpc2FibGUgcGFja2V0IGxvZyovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUERFVl9QS1RMT0dfRElTQUJMRV9DTURJRCk7CisJCS8qKiBzZXQgd21tIHBhcmFtZXRlcnMgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QREVWX1NFVF9XTU1fUEFSQU1TX0NNRElEKTsKKwkJLyoqIHNldCBIVCBjYXAgaWUgdGhhdCBuZWVkcyB0byBiZSBjYXJyaWVkIHByb2JlIHJlcXVlc3RzIEhUL1ZIVCBjaGFubmVscyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BERVZfU0VUX0hUX0NBUF9JRV9DTURJRCk7CisJCS8qKiBzZXQgVkhUIGNhcCBpZSB0aGF0IG5lZWRzIHRvIGJlIGNhcnJpZWQgb24gcHJvYmUgcmVxdWVzdHMgb24gVkhUIGNoYW5uZWxzICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUERFVl9TRVRfVkhUX0NBUF9JRV9DTURJRCk7CisKKwkJLyoqIENvbW1hbmQgdG8gc2VuZCB0aGUgRFNDUC10by1USUQgbWFwIHRvIHRoZSB0YXJnZXQgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QREVWX1NFVF9EU0NQX1RJRF9NQVBfQ01ESUQpOworCQkvKiogc2V0IHF1aWV0IGllIHBhcmFtZXRlcnMuIHByaW1hcmlseSB1c2VkIGluIEFQIG1vZGUgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QREVWX1NFVF9RVUlFVF9NT0RFX0NNRElEKTsKKwkJLyoqIEVuYWJsZS9EaXNhYmxlIEdyZWVuIEFQIFBvd2VyIFNhdmUgICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUERFVl9HUkVFTl9BUF9QU19FTkFCTEVfQ01ESUQpOworCQkvKiogZ2V0IFRQQyBjb25maWcgZm9yIHRoZSBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUERFVl9HRVRfVFBDX0NPTkZJR19DTURJRCk7CisKKwkJLyoqIHNldCB0aGUgYmFzZSBNQUMgYWRkcmVzcyBmb3IgdGhlIHBoeXNpY2FsIGRldmljZSBiZWZvcmUgYSBWREVWIGlzIGNyZWF0ZWQuCisJCSAqICBGb3IgZmlybXdhcmUgdGhhdCBkb2VzbpJ0IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGFuZCB0aGlzIGNvbW1hbmQsIHRoZSBwZGV2CisJCSAqICBNQUMgYWRkcmVzcyB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BERVZfU0VUX0JBU0VfTUFDQUREUl9DTURJRCk7CisKKwkJLyogZWVwcm9tIGNvbnRlbnQgZHVtcCAsIHRoZSBzYW1lIHRvIGJkYm9hcmQgZGF0YSAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BERVZfRFVNUF9DTURJRCk7CisKKwkJLyogVkRFVih2aXJ0dWFsIGRldmljZSkgc3BlY2lmaWMgY29tbWFuZHMgKi8KKwkJLyoqIHZkZXYgY3JlYXRlICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfVkRFVl9DUkVBVEVfQ01ESUQpOworCQkvKiogdmRldiBkZWxldGUgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9WREVWX0RFTEVURV9DTURJRCk7CisJCS8qKiB2ZGV2IHN0YXJ0IHJlcXVlc3QgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9WREVWX1NUQVJUX1JFUVVFU1RfQ01ESUQpOworCQkvKiogdmRldiByZXN0YXJ0IHJlcXVlc3QgKFJYIG9ubHksIE5PIFRYLCB1c2VkIGZvciBDQUMgcGVyaW9kKSovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfVkRFVl9SRVNUQVJUX1JFUVVFU1RfQ01ESUQpOworCQkvKiogdmRldiB1cCByZXF1ZXN0ICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfVkRFVl9VUF9DTURJRCk7CisJCS8qKiB2ZGV2IHN0b3AgcmVxdWVzdCAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1ZERVZfU1RPUF9DTURJRCk7CisJCS8qKiB2ZGV2IGRvd24gcmVxdWVzdCAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1ZERVZfRE9XTl9DTURJRCk7CisJCS8qIHNldCBhIHZkZXYgcGFyYW0gKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9WREVWX1NFVF9QQVJBTV9DTURJRCk7CisJCS8qIHNldCBhIGtleSAodXNlZCBmb3Igc2V0dGluZyBwZXIgcGVlciB1bmljYXN0IGFuZCBwZXIgdmRldiBtdWx0aWNhc3QpICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfVkRFVl9JTlNUQUxMX0tFWV9DTURJRCk7CisKKwkJLyogd25tIHNsZWVwIG1vZGUgY29tbWFuZCAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1ZERVZfV05NX1NMRUVQTU9ERV9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfVkRFVl9XTU1fQUREVFNfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1ZERVZfV01NX0RFTFRTX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9WREVWX1NFVF9XTU1fUEFSQU1TX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9WREVWX1NFVF9HVFhfUEFSQU1TX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9WREVWX0lQU0VDX05BVEtFRVBBTElWRV9GSUxURVJfQ01ESUQpOworCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfVkRFVl9QTE1SRVFfU1RBUlRfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1ZERVZfUExNUkVRX1NUT1BfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1ZERVZfVFNGX1RTVEFNUF9BQ1RJT05fQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1ZERVZfU0VUX0lFX0NNRElEKTsKKworCQkvKiBwZWVyIHNwZWNpZmljIGNvbW1hbmRzICovCisKKwkJLyoqIGNyZWF0ZSBhIHBlZXIgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QRUVSX0NSRUFURV9DTURJRCk7CisJCS8qKiBkZWxldGUgYSBwZWVyICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUEVFUl9ERUxFVEVfQ01ESUQpOworCQkvKiogZmx1c2ggc3BlY2lmaWMgIHRpZCBxdWV1ZXMgb2YgYSBwZWVyICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUEVFUl9GTFVTSF9USURTX0NNRElEKTsKKwkJLyoqIHNldCBhIHBhcmFtZXRlciBvZiBhIHBlZXIgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QRUVSX1NFVF9QQVJBTV9DTURJRCk7CisJCS8qKiBzZXQgcGVlciB0byBhc3NvY2lhdGVkIHN0YXRlLiB3aWxsIGNhcnkgYWxsIHBhcmFtZXRlcnMgZGV0ZXJtaW5lZCBkdXJpbmcgYXNzb2NpY2F0aW9uIHRpbWUgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QRUVSX0FTU09DX0NNRElEKTsKKwkJLyoqYWRkIGEgd2RzICAoNCBhZGRyZXNzICkgZW50cnkuIHVzZWQgb25seSBmb3IgdGVzdGluZyBXRFMgZmVhdHVyZSBvbiBBUCBwcm9kdWN0cyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BFRVJfQUREX1dEU19FTlRSWV9DTURJRCk7CisJCS8qKnJlbW92ZSB3ZHMgICg0IGFkZHJlc3MgKSBlbnRyeS4gdXNlZCBvbmx5IGZvciB0ZXN0aW5nIFdEUyBmZWF0dXJlIG9uIEFQIHByb2R1Y3RzICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUEVFUl9SRU1PVkVfV0RTX0VOVFJZX0NNRElEKTsKKwkJLyoqIHNldCB1cCBtY2FzdCBncm91cCBpbmZvciBmb3IgbXVsdGljYXN0IHRvIHVuaWNhc3QgY29udmVyc2lvbiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BFRVJfTUNBU1RfR1JPVVBfQ01ESUQpOworCQkvKiogcmVxdWVzdCBwZWVyIGluZm8gZnJvbSBGVy4gRlcgc2hhbGwgcmVzcG9uZCB3aXRoIFBFRVJfSU5GT19FVkVOVElEICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUEVFUl9JTkZPX1JFUV9DTURJRCk7CisKKwkJLyogYmVhY29uL21hbmFnZW1lbnQgc3BlY2lmaWMgY29tbWFuZHMgKi8KKworCQkvKiogdHJhbnNtaXQgYmVhY29uIGJ5IHJlZmVyZW5jZSAuIHVzZWQgZm9yIHRyYW5zbWl0dGluZyBiZWFjb24gb24gbG93IGxhdGVuY3kgaW50ZXJmYWNlIGxpa2UgcGNpZSAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0JDTl9UWF9DTURJRCk7CisJCS8qKiB0cmFuc21pdCBiZWFjb24gYnkgdmFsdWUgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QREVWX1NFTkRfQkNOX0NNRElEKTsKKwkJLyoqIHNldCB0aGUgYmVhY29uIHRlbXBsYXRlLiB1c2VkIGluIGJlYWNvbiBvZmZsb2FkIG1vZGUgdG8gc2V0dXAgdGhlCisJCSAqICB0aGUgY29tbW9uIGJlYWNvbiB0ZW1wbGF0ZSB3aXRoIHRoZSBGVyB0byBiZSB1c2VkIGJ5IEZXIHRvIGdlbmVyYXRlIGJlYWNvbnMgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9CQ05fVE1QTF9DTURJRCk7CisJCS8qKiBzZXQgYmVhY29uIGZpbHRlciB3aXRoIEZXICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfQkNOX0ZJTFRFUl9SWF9DTURJRCk7CisJCS8qIGVuYWJsZS9kaXNhYmxlIGZpbHRlcmluZyBvZiBwcm9iZSByZXF1ZXN0cyBpbiB0aGUgZmlybXdhcmUgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QUkJfUkVRX0ZJTFRFUl9SWF9DTURJRCk7CisJCS8qKiB0cmFuc21pdCBtYW5hZ2VtZW50IGZyYW1lIGJ5IHZhbHVlLiB3aWxsIGJlIGRlcHJlY2F0ZWQgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9NR01UX1RYX0NNRElEKTsKKwkJLyoqIHNldCB0aGUgcHJvYmUgcmVzcG9uc2UgdGVtcGxhdGUuIHVzZWQgaW4gYmVhY29uIG9mZmxvYWQgbW9kZSB0byBzZXR1cCB0aGUKKwkJICogIHRoZSBjb21tb24gcHJvYmUgcmVzcG9uc2UgdGVtcGxhdGUgd2l0aCB0aGUgRlcgdG8gYmUgdXNlZCBieSBGVyB0byBnZW5lcmF0ZQorCQkgKiAgcHJvYmUgcmVzcG9uc2VzICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUFJCX1RNUExfQ01ESUQpOworCisJCS8qKiBjb21tYW5kcyB0byBkaXJlY3RseSBjb250cm9sIGJhIG5lZ290aWF0aW9uIGRpcmVjdGx5IGZyb20gaG9zdC4gb25seSB1c2VkIGluIHRlc3QgbW9kZSAqLworCisJCS8qKiB0dXJuIG9mZiBGVyBBdXRvIGFkZGJhIG1vZGUgYW5kIGxldCBob3N0IGNvbnRyb2wgYWRkYmEgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9BRERCQV9DTEVBUl9SRVNQX0NNRElEKTsKKwkJLyoqIHNlbmQgYWRkIGJhIHJlcXVlc3QgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9BRERCQV9TRU5EX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9BRERCQV9TVEFUVVNfQ01ESUQpOworCQkvKiogc2VuZCBkZWwgYmEgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9ERUxCQV9TRU5EX0NNRElEKTsKKwkJLyoqIHNldCBhZGQgYmEgcmVzcG9uc2Ugd2lsbCBiZSB1c2VkIGJ5IEZXIHRvIGdlbmVyYXRlIGFkZGJhIHJlc3BvbnNlKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9BRERCQV9TRVRfUkVTUF9DTURJRCk7CisJCS8qKiBzZW5kIHNpbmdsZSBWSFQgTVBEVSB3aXRoIEFNU0RVICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU0VORF9TSU5HTEVBTVNEVV9DTURJRCk7CisKKwkJLyoqIFN0YXRpb24gcG93ZXIgc2F2ZSBzcGVjaWZpYyBjb25maWcgKi8KKwkJLyoqIGVuYWJsZS9kaXNhYmxlIHN0YXRpb24gcG93ZXJzYXZlICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU1RBX1BPV0VSU0FWRV9NT0RFX0NNRElEKTsKKwkJLyoqIHNldCBzdGF0aW9uIHBvd2VyIHNhdmUgc3BlY2lmaWMgcGFyYW1ldGVyICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU1RBX1BPV0VSU0FWRV9QQVJBTV9DTURJRCk7CisJCS8qKiBzZXQgc3RhdGlvbiBtaW1vIHBvd2Vyc2F2ZSBtb2RlICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU1RBX01JTU9fUFNfTU9ERV9DTURJRCk7CisKKwkJLyoqIERGUy1zcGVjaWZpYyBjb21tYW5kcyAqLworCQkvKiogZW5hYmxlIERGUyAocmFkYXIgZGV0ZWN0aW9uKSovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUERFVl9ERlNfRU5BQkxFX0NNRElEKTsKKwkJLyoqIGRpc2FibGUgREZTIChyYWRhciBkZXRlY3Rpb24pKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QREVWX0RGU19ESVNBQkxFX0NNRElEKTsKKwkJLyoqIGVuYWJsZSBERlMgcGh5ZXJyL3BhcnNlIGZpbHRlciBvZmZsb2FkICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfREZTX1BIWUVSUl9GSUxURVJfRU5BX0NNRElEKTsKKwkJLyoqIGVuYWJsZSBERlMgcGh5ZXJyL3BhcnNlIGZpbHRlciBvZmZsb2FkICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfREZTX1BIWUVSUl9GSUxURVJfRElTX0NNRElEKTsKKworCQkvKiBSb2FtaW5nIHNwZWNpZmljICBjb21tYW5kcyAqLworCQkvKiogc2V0IHJvYW0gc2NhbiBtb2RlICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUk9BTV9TQ0FOX01PREUpOworCQkvKiogc2V0IHJvYW0gc2NhbiByc3NpIHRocmVzaG9sZCBiZWxvdyB3aGljaCByb2FtIHNjYW4gaXMgZW5hYmxlZCAgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9ST0FNX1NDQU5fUlNTSV9USFJFU0hPTEQpOworCQkvKiogc2V0IHJvYW0gc2NhbiBwZXJpb2QgZm9yIHBlcmlvZGljIHJvYW0gc2NhbiBtb2RlICAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JPQU1fU0NBTl9QRVJJT0QpOworCQkvKiogc2V0IHJvYW0gc2NhbiB0cmlnZ2VyIHJzc2kgY2hhbmdlIHRocmVzaG9sZCAgICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUk9BTV9TQ0FOX1JTU0lfQ0hBTkdFX1RIUkVTSE9MRCk7CisJCS8qKiBzZXQgcm9hbSBBUCBwcm9maWxlICAgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9ST0FNX0FQX1BST0ZJTEUpOworCQkvKiogc2V0IGNoYW5uZWwgbGlzdCBmb3Igcm9hbSBzY2FucyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JPQU1fQ0hBTl9MSVNUKTsKKwkJLyoqIG9mZmxvYWQgc2NhbiBzcGVjaWZpYyBjb21tYW5kcyAqLworCQkvKiogc2V0IG9mZmxvYWQgc2NhbiBBUCBwcm9maWxlICAgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9PRkxfU0NBTl9BRERfQVBfUFJPRklMRSk7CisJCS8qKiByZW1vdmUgb2ZmbG9hZCBzY2FuIEFQIHByb2ZpbGUgICAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX09GTF9TQ0FOX1JFTU9WRV9BUF9QUk9GSUxFKTsKKwkJLyoqIHNldCBvZmZsb2FkIHNjYW4gcGVyaW9kICAgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9PRkxfU0NBTl9QRVJJT0QpOworCisJCS8qIFAyUCBzcGVjaWZpYyBjb21tYW5kcyAqLworCQkvKipzZXQgUDJQIGRldmljZSBpbmZvLiBGVyB3aWxsIHVzZWQgYnkgRlcgdG8gY3JlYXRlIFAyUCBJRSB0byBiZSBjYXJyaWVkIGluIHByb2JlIHJlc3BvbnNlCisJCSAqIGdlbmVyYXRlZCBkdXJpbmcgcDJwIGxpc3RlbiBhbmQgZm9yIHAycCBkaXNjb3ZlcmFiaWxpdHkgICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUDJQX0RFVl9TRVRfREVWSUNFX0lORk8pOworCQkvKiogZW5hYmxlL2Rpc2FibGUgcDJwIGRpc2NvdmVyYWJpbGl0eSBvbiBTVEEvQVAgVkRFVnMgICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUDJQX0RFVl9TRVRfRElTQ09WRVJBQklMSVRZKTsKKwkJLyoqIHNldCBwMnAgaWUgdG8gYmUgY2FycmllZCBpbiBiZWFjb25zIGdlbmVyYXRlZCBieSBGVyBmb3IgR08gICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUDJQX0dPX1NFVF9CRUFDT05fSUUpOworCQkvKiogc2V0IHAycCBpZSB0byBiZSBjYXJyaWVkIGluIHByb2JlIHJlc3BvbnNlIGZyYW1lcyBnZW5lcmF0ZWQgYnkgRlcgZm9yIEdPICAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1AyUF9HT19TRVRfUFJPQkVfUkVTUF9JRSk7CisJCS8qKiBzZXQgdGhlIHZlbmRvciBzcGVjaWZpYyBwMnAgaWUgZGF0YS4gRlcgd2lsbCB1c2UgdGhpcyB0byBwYXJzZSB0aGUgUDJQIE5vQQorCQkgKiAgYXR0cmlidXRlIGluIHRoZSBiZWFjb25zL3Byb2JlIHJlc3BvbnNlcyByZWNlaXZlZC4KKwkJICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUDJQX1NFVF9WRU5ET1JfSUVfREFUQV9DTURJRCk7CisJCS8qKiBzZXQgdGhlIGNvbmZpZ3VyZSBvZiBwMnAgZmluZCBvZmZsb2FkICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUDJQX0RJU0NfT0ZGTE9BRF9DT05GSUdfQ01ESUQpOworCQkvKiogc2V0IHRoZSB2ZW5kb3Igc3BlY2lmaWMgcDJwIGllIGRhdGEgZm9yIHAycCBmaW5kIG9mZmxvYWQgdXNpbmcgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QMlBfRElTQ19PRkZMT0FEX0FQUElFX0NNRElEKTsKKwkJLyoqIHNldCB0aGUgQlNTSUQvZGV2aWNlIG5hbWUgcGF0dGVybiBvZiBwMnAgZmluZCBvZmZsb2FkICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUDJQX0RJU0NfT0ZGTE9BRF9QQVRURVJOX0NNRElEKTsKKwkJLyoqIHNldCBPcHBQUyByZWxhdGVkIHBhcmFtZXRlcnMgKiovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUDJQX1NFVF9PUFBQU19QQVJBTV9DTURJRCk7CisKKwkJLyoqIEFQIHBvd2VyIHNhdmUgc3BlY2lmaWMgY29uZmlnICovCisJCS8qKiBzZXQgQVAgcG93ZXIgc2F2ZSBzcGVjaWZpYyBwYXJhbSAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0FQX1BTX1BFRVJfUEFSQU1fQ01ESUQpOworCQkvKiogc2V0IEFQIFVBUFNEIGNvZXggcGVjaWZpYyBwYXJhbSAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0FQX1BTX1BFRVJfVUFQU0RfQ09FWF9DTURJRCk7CisKKwkJLyoqIFJhdGUtY29udHJvbCBzcGVjaWZpYyBjb21tYW5kcyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BFRVJfUkFURV9SRVRSWV9TQ0hFRF9DTURJRCk7CisKKwkJLyoqIFdMQU4gUHJvZmlsaW5nIGNvbW1hbmRzLiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1dMQU5fUFJPRklMRV9UUklHR0VSX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9XTEFOX1BST0ZJTEVfU0VUX0hJU1RfSU5UVkxfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1dMQU5fUFJPRklMRV9HRVRfUFJPRklMRV9EQVRBX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9XTEFOX1BST0ZJTEVfRU5BQkxFX1BST0ZJTEVfSURfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1dMQU5fUFJPRklMRV9MSVNUX1BST0ZJTEVfSURfQ01ESUQpOworCisJCS8qKiBTdXNwZW5kIHJlc3VtZSBjb21tYW5kIElkcyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BERVZfU1VTUEVORF9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUERFVl9SRVNVTUVfQ01ESUQpOworCisJCS8qIEJlYWNvbiBmaWx0ZXIgY29tbWFuZHMgKi8KKwkJLyoqIGFkZCBhIGJlYWNvbiBmaWx0ZXIgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9BRERfQkNOX0ZJTFRFUl9DTURJRCk7CisJCS8qKiByZW1vdmUgYSAgYmVhY29uIGZpbHRlciAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JNVl9CQ05fRklMVEVSX0NNRElEKTsKKworCQkvKiBXT1cgU3BlY2lmaWMgV01JIGNvbW1hbmRzICovCisJCS8qKiBhZGQgcGF0dGVybiBmb3IgYXdha2UgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9XT1dfQUREX1dBS0VfUEFUVEVSTl9DTURJRCk7CisJCS8qKiBkZWxldGEgYSB3YWtlIHBhdHRlcm4gKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9XT1dfREVMX1dBS0VfUEFUVEVSTl9DTURJRCk7CisJCS8qKiBlbmFibGUvZGVpc2FibGUgd2FrZSBldmVudCAgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9XT1dfRU5BQkxFX0RJU0FCTEVfV0FLRV9FVkVOVF9DTURJRCk7CisJCS8qKiBlbmFibGUgV09XICAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1dPV19FTkFCTEVfQ01ESUQpOworCQkvKiogaG9zdCB3b2tlIHVwIGZyb20gc2xlZXAgZXZlbnQgdG8gRlcuIEdlbmVyYXRlZCBpbiByZXNwb25zZSB0byBXT1cgSGFyZHdhcmUgZXZlbnQgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9XT1dfSE9TVFdBS0VVUF9GUk9NX1NMRUVQX0NNRElEKTsKKworCQkvKiBSVFQgbWVhc3VyZW1lbnQgcmVsYXRlZCBjbWQgKi8KKwkJLyoqIHJlcXVlcyB0byBtYWtlIGFuIFJUVCBtZWFzdXJlbWVudCAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JUVF9NRUFTUkVRX0NNRElEKTsKKwkJLyoqIHJlcXVlcyB0byByZXBvcnQgYSB0c2YgbWVhc3VyZW1lbnQgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9SVFRfVFNGX0NNRElEKTsKKworCQkvKiogc3BlY3RyYWwgc2NhbiBjb21tYW5kICovCisJCS8qKiBjb25maWd1cmUgc3BlY3RyYWwgc2NhbiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1ZERVZfU1BFQ1RSQUxfU0NBTl9DT05GSUdVUkVfQ01ESUQpOworCQkvKiogZW5hYmxlL2Rpc2FibGUgc3BlY3RyYWwgc2NhbiBhbmQgdHJpZ2dlciAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1ZERVZfU1BFQ1RSQUxfU0NBTl9FTkFCTEVfQ01ESUQpOworCisJCS8qIEYvVyBzdGF0cyAqLworCQkvKiogb25lIHRpbWUgcmVxdWVzdCBmb3Igc3RhdHMgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9SRVFVRVNUX1NUQVRTX0NNRElEKTsKKwkJLyoqIFB1c2ggTUNDIEFkYXB0aXZlIFNjaGVkdWxlciBTdGF0cyB0byBGaXJtd2FyZSAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX01DQ19TQ0hFRF9UUkFGRklDX1NUQVRTX0NNRElEKTsKKworCQkvKiogQVJQIE9GRkxPQUQgUkVRVUVTVCovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU0VUX0FSUF9OU19PRkZMT0FEX0NNRElEKTsKKworCQkvKiogUHJvYWN0aXZlIEFSUCBSZXNwb25zZSBBZGQgUGF0dGVybiBDb21tYW5kKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9BRERfUFJPQUNUSVZFX0FSUF9SU1BfUEFUVEVSTl9DTURJRCk7CisKKwkJLyoqIFByb2FjdGl2ZSBBUlAgUmVzcG9uc2UgRGVsIFBhdHRlcm4gQ29tbWFuZCovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfREVMX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01ESUQpOworCisJCS8qKiBOUyBvZmZsb2FkIGNvbmZpZCovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfTkVUV09SS19MSVNUX09GRkxPQURfQ09ORklHX0NNRElEKTsKKworCQkvKiBHVEsgb2ZmbG9hZCBTcGVjaWZpYyBXTUkgY29tbWFuZHMgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9HVEtfT0ZGTE9BRF9DTURJRCk7CisKKwkJLyogQ1NBIG9mZmxvYWQgU3BlY2lmaWMgV01JIGNvbW1hbmRzICovCisJCS8qKiBjc2Egb2ZmbG9hZCBlbmFibGUgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9DU0FfT0ZGTE9BRF9FTkFCTEVfQ01ESUQpOworCQkvKiogY2hhbiBzd2l0Y2ggY29tbWFuZCAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0NTQV9PRkZMT0FEX0NIQU5TV0lUQ0hfQ01ESUQpOworCisJCS8qIENoYXR0ZXIgY29tbWFuZHMgKi8KKwkJLyogQ2hhbmdlIGNoYXR0ZXIgbW9kZSBvZiBvcGVyYXRpb24gKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9DSEFUVEVSX1NFVF9NT0RFX0NNRElEKTsKKwkJLyoqIGNoYXR0ZXIgYWRkIGNvYWxlc2NpbmcgZmlsdGVyIGNvbW1hbmQgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9DSEFUVEVSX0FERF9DT0FMRVNDSU5HX0ZJTFRFUl9DTURJRCk7CisJCS8qKiBjaGF0dGVyIGRlbGV0ZSBjb2FsZXNjaW5nIGZpbHRlciBjb21tYW5kICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfQ0hBVFRFUl9ERUxFVEVfQ09BTEVTQ0lOR19GSUxURVJfQ01ESUQpOworCQkvKiogY2hhdHRlciBjb2FsZWNpbmcgcXVlcnkgY29tbWFuZCAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0NIQVRURVJfQ09BTEVTQ0lOR19RVUVSWV9DTURJRCk7CisKKwkJLyoqYWRkYmEgc3BlY2lmaWMgY29tbWFuZHMgKi8KKwkJLyoqIHN0YXJ0IHRoZSBhZ2dyZWdhdGlvbiBvbiB0aGlzIFRJRCAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BFRVJfVElEX0FEREJBX0NNRElEKTsKKwkJLyoqIHN0b3AgdGhlIGFnZ3JlZ2F0aW9uIG9uIHRoaXMgVElEICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUEVFUl9USURfREVMQkFfQ01ESUQpOworCisJCS8qKiBzZXQgc3RhdGlvbiBtaW1vIHBvd2Vyc2F2ZSBtZXRob2QgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9TVEFfRFRJTV9QU19NRVRIT0RfQ01ESUQpOworCQkvKiogQ29uZmlndXJlIHRoZSBTdGF0aW9uIFVBUFNEIEFDIEF1dG8gVHJpZ2dlciBQYXJhbWV0ZXJzICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU1RBX1VBUFNEX0FVVE9fVFJJR19DTURJRCk7CisJCS8qKiBDb25maWd1cmUgdGhlIEtlZXAgQWxpdmUgUGFyYW1ldGVycyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1NUQV9LRUVQQUxJVkVfQ01ESUQpOworCisJCS8qIFJlcXVlc3Qgc3NuIGZyb20gdGFyZ2V0IGZvciBhIHN0YS90aWQgcGFpciAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0JBX1JFUV9TU05fQ01ESUQpOworCQkvKiBtaXNjIGNvbW1hbmQgZ3JvdXAgKi8KKwkJLyoqIGVjaG8gY29tbWFuZCBtYWlubHkgdXNlZCBmb3IgdGVzdGluZyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0VDSE9fQ01ESUQpOworCisJCS8qICEhSU1QT1JUQU5UISEKKwkJICogSWYgeW91IG5lZWQgdG8gYWRkIGEgbmV3IFdNSSBjb21tYW5kIHRvIHRoZSBDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0dSUF9NSVNDIHN1Yi1ncm91cCwKKwkJICogcGxlYXNlIG1ha2Ugc3VyZSB5b3UgYWRkIGl0IEJFSElORCBDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BERVZfVVRGX0NNRElEKTsKKwkJICogYXMgd2UgTVVTVCBoYXZlIGEgZml4ZWQgdmFsdWUgaGVyZSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IGJldHdlZW4KKwkJICogVVRGIGFuZCB0aGUgQVJUMiBkcml2ZXIKKwkJICovCisJCS8qKiBVVEYgV01JIGNvbW1hbmRzICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUERFVl9VVEZfQ01ESUQpOworCisJCS8qKiBzZXQgZGVidWcgbG9nIGNvbmZpZyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0RCR0xPR19DRkdfQ01ESUQpOworCQkvKiBRVklUIHNwZWNpZmljIGNvbW1hbmQgaWQgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QREVWX1FWSVRfQ01ESUQpOworCQkvKiBGYWN0b3J5IFRlc3RpbmcgTW9kZSByZXF1ZXN0IGNvbW1hbmQKKwkJICogdXNlZCBmb3IgaW50ZWdyYXRlZCBjaGlwc2V0cyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BERVZfRlRNX0lOVEdfQ01ESUQpOworCQkvKiBzZXQgYW5kIGdldCBrZWVwYWxpdmUgcGFyYW1ldGVycyBjb21tYW5kICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfVkRFVl9TRVRfS0VFUEFMSVZFX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9WREVWX0dFVF9LRUVQQUxJVkVfQ01ESUQpOworCQkvKiBGb3IgZncgcmVjb3ZlcnkgdGVzdCBjb21tYW5kICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfRk9SQ0VfRldfSEFOR19DTURJRCk7CisJCS8qIFNldCBNY2FzdC9CZGNhc3QgZmlsdGVyICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU0VUX01DQVNUQkNBU1RfRklMVEVSX0NNRElEKTsKKwkJLyoqIHNldCB0aGVybWFsIG1hbmFnZW1lbnQgcGFyYW1zICoqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1RIRVJNQUxfTUdNVF9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUlNTSV9CUkVBQ0hfTU9OSVRPUl9DT05GSUdfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0xST19DT05GSUdfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX01BV0NfU0VOU09SX1JFUE9SVF9JTkRfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JPQU1fQ09ORklHVVJFX01BV0NfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX05MT19DT05GSUdVUkVfTUFXQ19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfRVhUU0NBTl9DT05GSUdVUkVfTUFXQ19DTURJRCk7CisJCS8qIEdQSU8gQ29uZmlndXJhdGlvbiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0dQSU9fQ09ORklHX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9HUElPX09VVFBVVF9DTURJRCk7CisKKwkJLyogVHhiZiBjb25maWd1cmF0aW9uIGNvbW1hbmQgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9UWEJGX0NNRElEKTsKKworCQkvKiBGV1RFU1QgQ29tbWFuZHMgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9GV1RFU1RfVkRFVl9NQ0NfU0VUX1RCVFRfTU9ERV9DTURJRCk7CisJCS8qKiBzZXQgTm9BIGRlc2NzICoqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0ZXVEVTVF9QMlBfU0VUX05PQV9QQVJBTV9DTURJRCk7CisKKwkJLyoqIFRETFMgQ29uZmlndXJhdGlvbiAqLworCQkvKiogZW5hYmxlL2Rpc2FibGUgVERMUyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1RETFNfU0VUX1NUQVRFX0NNRElEKTsKKwkJLyoqIHNldCB0ZGxzIHBlZXIgc3RhdGUgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9URExTX1BFRVJfVVBEQVRFX0NNRElEKTsKKworCQkvKiogUmVzbWdyIENvbmZpZ3VyYXRpb24gKi8KKwkJLyoqIEFkYXB0aXZlIE9DUyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gdGhlIEZXLiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0bworCQkgKiBkaXNhYmxlIEZXIGJhc2VkIGFkYXB0aXZlIE9DUy4KKwkJICovCisJCUNBU0VfUkVUVVJOX1NUUklORworCQkJKFdNSV9SRVNNR1JfQURBUFRJVkVfT0NTX0VOQUJMRV9ESVNBQkxFX0NNRElEKTsKKwkJLyoqIHNldCB0aGUgcmVxdWVzdGVkIGNoYW5uZWwgdGltZSBxdW90YSBmb3IgdGhlIGhvbWUgY2hhbm5lbHMgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9SRVNNR1JfU0VUX0NIQU5fVElNRV9RVU9UQV9DTURJRCk7CisJCS8qKiBzZXQgdGhlIHJlcXVlc3RlZCBsYXRlbmN5IGZvciB0aGUgaG9tZSBjaGFubmVscyAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JFU01HUl9TRVRfQ0hBTl9MQVRFTkNZX0NNRElEKTsKKworCQkvKiogU1RBIFNNUFMgQ29uZmlndXJhdGlvbiAqLworCQkvKiogZm9yY2UgU01QUyBtb2RlICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU1RBX1NNUFNfRk9SQ0VfTU9ERV9DTURJRCk7CisJCS8qKiBzZXQgU01QUyBwYXJhbWV0ZXJzICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU1RBX1NNUFNfUEFSQU1fQ01ESUQpOworCisJCS8qIFdsYW4gSEIgY29tbWFuZHMgKi8KKwkJLyogZW5hbGJlL2Rpc2FibGUgd2xhbiBIQiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0hCX1NFVF9FTkFCTEVfQ01ESUQpOworCQkvKiBzZXQgdGNwIHBhcmFtZXRlcnMgZm9yIHdsYW4gSEIgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9IQl9TRVRfVENQX1BBUkFNU19DTURJRCk7CisJCS8qIHNldCB0Y3AgcGt0IGZpbHRlciBmb3Igd2xhbiBIQiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0hCX1NFVF9UQ1BfUEtUX0ZJTFRFUl9DTURJRCk7CisJCS8qIHNldCB1ZHAgcGFyYW1ldGVycyBmb3Igd2xhbiBIQiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0hCX1NFVF9VRFBfUEFSQU1TX0NNRElEKTsKKwkJLyogc2V0IHVkcCBwa3QgZmlsdGVyIGZvciB3bGFuIEhCICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfSEJfU0VUX1VEUF9QS1RfRklMVEVSX0NNRElEKTsKKworCQkvKiogV2xhbiBSTUMgY29tbWFuZHMqLworCQkvKiogZW5hYmxlL2Rpc2FibGUgUk1DICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUk1DX1NFVF9NT0RFX0NNRElEKTsKKwkJLyoqIGNvbmZpZ3VyZSBhY3Rpb24gZnJhbWUgcGVyaW9kICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUk1DX1NFVF9BQ1RJT05fUEVSSU9EX0NNRElEKTsKKwkJLyoqIEZvciBkZWJ1Zy9mdXR1cmUgZW5oYW5jZW1lbnQgcHVycG9zZXMgb25seSwKKwkJICogIGNvbmZpZ3VyZXMvZmluZXR1bmVzIFJNQyBhbGdvcml0aG1zICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUk1DX0NPTkZJR19DTURJRCk7CisKKwkJLyoqIFdMQU4gTUhGIG9mZmxvYWQgY29tbWFuZHMgKi8KKwkJLyoqIGVuYWJsZS9kaXNhYmxlIE1IRiBvZmZsb2FkICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfTUhGX09GRkxPQURfU0VUX01PREVfQ01ESUQpOworCQkvKiogUGx1bWIgcm91dGluZyB0YWJsZSBmb3IgTUhGIG9mZmxvYWQgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9NSEZfT0ZGTE9BRF9QTFVNQl9ST1VUSU5HX1RCTF9DTURJRCk7CisKKwkJLypsb2NhdGlvbiBzY2FuIGNvbW1hbmRzICovCisJCS8qc3RhcnQgYmF0Y2ggc2NhbiAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0JBVENIX1NDQU5fRU5BQkxFX0NNRElEKTsKKwkJLypzdG9wIGJhdGNoIHNjYW4gKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9CQVRDSF9TQ0FOX0RJU0FCTEVfQ01ESUQpOworCQkvKmdldCBiYXRjaCBzY2FuIHJlc3VsdCAqLworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0JBVENIX1NDQU5fVFJJR0dFUl9SRVNVTFRfQ01ESUQpOworCQkvKiBPRU0gcmVsYXRlZCBjbWQgKi8KKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9PRU1fUkVRX0NNRElEKTsKKwkJLyogTkFOIHJlcXVlc3QgY21kICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfTkFOX0NNRElEKTsKKwkJLyogTW9kZW0gcG93ZXIgc3RhdGUgY21kICovCisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfTU9ERU1fUE9XRVJfU1RBVEVfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JFUVVFU1RfU1RBVFNfRVhUX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9PQlNTX1NDQU5fRU5BQkxFX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9PQlNTX1NDQU5fRElTQUJMRV9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUEVFUl9HRVRfRVNUSU1BVEVEX0xJTktTUEVFRF9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUk9BTV9TQ0FOX0NNRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUERFVl9TRVRfTEVEX0NPTkZJR19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfSE9TVF9BVVRPX1NIVVRET1dOX0NGR19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfQ0hBTl9BVk9JRF9VUERBVEVfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1dPV19JT0FDX0FERF9LRUVQQUxJVkVfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1dPV19JT0FDX0RFTF9LRUVQQUxJVkVfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1dPV19JT0FDX0FERF9XQUtFX1BBVFRFUk5fQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1dPV19JT0FDX0RFTF9XQUtFX1BBVFRFUk5fQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JFUVVFU1RfTElOS19TVEFUU19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU1RBUlRfTElOS19TVEFUU19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfQ0xFQVJfTElOS19TVEFUU19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfR0VUX0ZXX01FTV9EVU1QX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9MUElfTUdNVF9TTk9PUElOR19DT05GSUdfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0xQSV9TVEFSVF9TQ0FOX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9MUElfU1RPUF9TQ0FOX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9FWFRTQ0FOX1NUQVJUX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9FWFRTQ0FOX1NUT1BfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcKKwkJCShXTUlfRVhUU0NBTl9DT05GSUdVUkVfV0xBTl9DSEFOR0VfTU9OSVRPUl9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfRVhUU0NBTl9DT05GSUdVUkVfSE9UTElTVF9NT05JVE9SX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9FWFRTQ0FOX0dFVF9DQUNIRURfUkVTVUxUU19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfRVhUU0NBTl9HRVRfV0xBTl9DSEFOR0VfUkVTVUxUU19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfRVhUU0NBTl9TRVRfQ0FQQUJJTElUSUVTX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9FWFRTQ0FOX0dFVF9DQVBBQklMSVRJRVNfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0VYVFNDQU5fQ09ORklHVVJFX0hPVExJU1RfU1NJRF9NT05JVE9SX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9ST0FNX1NZTkNIX0NPTVBMRVRFKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9EMF9XT1dfRU5BQkxFX0RJU0FCTEVfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0VYVFdPV19FTkFCTEVfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0VYVFdPV19TRVRfQVBQX1RZUEUxX1BBUkFNU19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfRVhUV09XX1NFVF9BUFBfVFlQRTJfUEFSQU1TX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9VTklUX1RFU1RfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JPQU1fU0VUX1JJQ19SRVFVRVNUX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QREVWX0dFVF9URU1QRVJBVFVSRV9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU0VUX0RIQ1BfU0VSVkVSX09GRkxPQURfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9JUEFfT0ZGTE9BRF9FTkFCTEVfRElTQUJMRV9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU0NBTl9QUk9CX1JFUV9PVUlfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1RETFNfU0VUX09GRkNIQU5fTU9ERV9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUERFVl9TRVRfTEVEX0ZMQVNISU5HX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9NRE5TX09GRkxPQURfRU5BQkxFX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9NRE5TX1NFVF9GUUROX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9NRE5TX1NFVF9SRVNQT05TRV9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfTUROU19HRVRfU1RBVFNfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JPQU1fSU5WT0tFX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9TRVRfQU5URU5OQV9ESVZFUlNJVFlfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1NBUF9PRkxfRU5BQkxFX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9BUEZJTkRfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BBU1NQT0lOVF9MSVNUX0NPTkZJR19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfT0NCX1NFVF9TQ0hFRF9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfT0NCX1NFVF9DT05GSUdfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX09DQl9TRVRfVVRDX1RJTUVfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX09DQl9TVEFSVF9USU1JTkdfQURWRVJUX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9PQ0JfU1RPUF9USU1JTkdfQURWRVJUX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9PQ0JfR0VUX1RTRl9USU1FUl9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfRENDX0dFVF9TVEFUU19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfRENDX0NMRUFSX1NUQVRTX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9EQ0NfVVBEQVRFX05ETF9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUk9BTV9GSUxURVJfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1JPQU1fU1VCTkVUX0NIQU5HRV9DT05GSUdfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX0RFQlVHX01FU0dfRkxVU0hfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1BFRVJfU0VUX1JBVEVfUkVQT1JUX0NPTkRJVElPTl9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU09DX1NFVF9QQ0xfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1NPQ19TRVRfSFdfTU9ERV9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfU09DX1NFVF9EVUFMX01BQ19DT05GSUdfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1dPV19FTkFCTEVfSUNNUFY2X05BX0ZMVF9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfRElBR19FVkVOVF9MT0dfQ09ORklHX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9QQUNLRVRfRklMVEVSX0NPTkZJR19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUEFDS0VUX0ZJTFRFUl9FTkFCTEVfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1NBUF9TRVRfQkxBQ0tMSVNUX1BBUkFNX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9XT1dfVURQX1NWQ19PRkxEX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9NR01UX1RYX1NFTkRfQ01ESUQpOworCQlDQVNFX1JFVFVSTl9TVFJJTkcoV01JX1NPQ19TRVRfQU5URU5OQV9NT0RFX0NNRElEKTsKKwkJQ0FTRV9SRVRVUk5fU1RSSU5HKFdNSV9XT1dfSE9TVFdBS0VVUF9HUElPX1BJTl9QQVRURVJOX0NPTkZJR19DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfQVBfUFNfRUdBUF9QQVJBTV9DTURJRCk7CisJCUNBU0VfUkVUVVJOX1NUUklORyhXTUlfUE1GX09GRkxPQURfU0VUX1NBX1FVRVJZX0NNRElEKTsKKwl9CisJcmV0dXJuICJJbnZhbGlkIFdNSSBjbWQiOworfQorCisjaWZkZWYgUUNBX1dJRklfM18wX0VNVQorc3RhdGljIGlubGluZSB2b2lkIHdtYV9sb2dfY21kX2lkKFdNSV9DTURfSUQgY21kX2lkKQoreworCVdNQV9MT0dFKCJTZW5kIFdNSSBjb21tYW5kOiVzIGNvbW1hbmRfaWQ6JWQiLAorCQkgZ2V0X3dtaV9jbWRfc3RyaW5nKGNtZF9pZCksIGNtZF9pZCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHdtYV9sb2dfY21kX2lkKFdNSV9DTURfSUQgY21kX2lkKQoreworCVdNQV9MT0dEKCJTZW5kIFdNSSBjb21tYW5kOiVzIGNvbW1hbmRfaWQ6JWQiLAorCQkgZ2V0X3dtaV9jbWRfc3RyaW5nKGNtZF9pZCksIGNtZF9pZCk7Cit9CisjZW5kaWYKKworLyogV01JIGNvbW1hbmQgQVBJICovCitpbnQgd21pX3VuaWZpZWRfY21kX3NlbmQod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCB3bWlfYnVmX3QgYnVmLCBpbnQgbGVuLAorCQkJIFdNSV9DTURfSUQgY21kX2lkKQoreworCUhUQ19QQUNLRVQgKnBrdDsKKwlBX1NUQVRVUyBzdGF0dXM7CisJc3RydWN0IG9sX3NvZnRjICpzY247CisKKwlpZiAoY2RmX2F0b21pY19yZWFkKCZ3bWlfaGFuZGxlLT5pc190YXJnZXRfc3VzcGVuZGVkKSAmJgorCSAgICAoKFdNSV9XT1dfSE9TVFdBS0VVUF9GUk9NX1NMRUVQX0NNRElEICE9IGNtZF9pZCkgJiYKKwkgICAgIChXTUlfUERFVl9SRVNVTUVfQ01ESUQgIT0gY21kX2lkKSkpIHsKKwkJcHJfZXJyKCIlczogVGFyZ2V0IGlzIHN1c3BlbmRlZCAgY291bGQgbm90IHNlbmQgV01JIGNvbW1hbmRcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCUNERl9BU1NFUlQoMCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogRG8gc2FuaXR5IGNoZWNrIG9uIHRoZSBUTFYgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLworCXsKKwkJdm9pZCAqYnVmX3B0ciA9ICh2b2lkICopY2RmX25idWZfZGF0YShidWYpOworCisJCWlmICh3bWl0bHZfY2hlY2tfY29tbWFuZF90bHZfcGFyYW1zKE5VTEwsIGJ1Zl9wdHIsIGxlbiwgY21kX2lkKQorCQkgICAgIT0gMCkgeworCQkJY2RmX3ByaW50CisJCQkJKCJcbkVSUk9SOiAlczogSW52YWxpZCBXTUkgUGFyYW1ldGVyIEJ1ZmZlciBmb3IgQ21kOiVkXG4iLAorCQkJCV9fZnVuY19fLCBjbWRfaWQpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKGNkZl9uYnVmX3B1c2hfaGVhZChidWYsIHNpemVvZihXTUlfQ01EX0hEUikpID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlcywgRmFpbGVkIHRvIHNlbmQgY21kICV4LCBubyBtZW1vcnlcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY21kX2lkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJV01JX1NFVF9GSUVMRChjZGZfbmJ1Zl9kYXRhKGJ1ZiksIFdNSV9DTURfSERSLCBDT01NQU5ESUQsIGNtZF9pZCk7CisKKwljZGZfYXRvbWljX2luYygmd21pX2hhbmRsZS0+cGVuZGluZ19jbWRzKTsKKwlpZiAoY2RmX2F0b21pY19yZWFkKCZ3bWlfaGFuZGxlLT5wZW5kaW5nX2NtZHMpID49IFdNSV9NQVhfQ01EUykgeworCQlzY24gPSBjZHNfZ2V0X2NvbnRleHQoQ0RGX01PRFVMRV9JRF9ISUYpOworCQlwcl9lcnIoIlxuJXM6IGhvc3RjcmVkaXRzID0gJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgd21pX2dldF9ob3N0X2NyZWRpdHMod21pX2hhbmRsZSkpOworCQlodGNfZHVtcF9jb3VudGVyX2luZm8od21pX2hhbmRsZS0+aHRjX2hhbmRsZSk7CisJCS8qIGR1bXBfY2VfcmVnaXN0ZXIoc2NuKTsgKi8KKwkJLyogZHVtcF9jZV9kZWJ1Z19yZWdpc3RlcihzY24tPmhpZl9zYyk7ICovCisJCWNkZl9hdG9taWNfZGVjKCZ3bWlfaGFuZGxlLT5wZW5kaW5nX2NtZHMpOworCQlwcl9lcnIoIiVzOiBNQVggMTAyNCBXTUkgUGVuZGluZyBjbWRzIHJlYWNoZWQuXG4iLCBfX2Z1bmNfXyk7CisJCUNERl9CVUcoMCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcGt0ID0gY2RmX21lbV9tYWxsb2Moc2l6ZW9mKCpwa3QpKTsKKwlpZiAoIXBrdCkgeworCQljZGZfYXRvbWljX2RlYygmd21pX2hhbmRsZS0+cGVuZGluZ19jbWRzKTsKKwkJcHJfZXJyKCIlcywgRmFpbGVkIHRvIGFsbG9jIGh0YyBwYWNrZXQgJXgsIG5vIG1lbW9yeVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjbWRfaWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlTRVRfSFRDX1BBQ0tFVF9JTkZPX1RYKHBrdCwKKwkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIGNkZl9uYnVmX2RhdGEoYnVmKSwgbGVuICsgc2l6ZW9mKFdNSV9DTURfSERSKSwKKwkgICAgICAgICAgICAgICAgICAgICAgIC8qIGh0dF9ob3N0X2RhdGFfZGxfbGVuKGJ1ZikrMjAgKi8KKwkJCSAgICAgICB3bWlfaGFuZGxlLT53bWlfZW5kcG9pbnRfaWQsIDAgLypodGNfdGFnICovICk7CisKKwlTRVRfSFRDX1BBQ0tFVF9ORVRfQlVGX0NPTlRFWFQocGt0LCBidWYpOworCisJd21hX2xvZ19jbWRfaWQoY21kX2lkKTsKKworI2lmZGVmIFdNSV9JTlRFUkZBQ0VfRVZFTlRfTE9HR0lORworCWNkZl9zcGluX2xvY2tfYmgoJndtaV9oYW5kbGUtPndtaV9yZWNvcmRfbG9jayk7CisJLypSZWNvcmQgMTYgYnl0ZXMgb2YgV01JIGNtZCBkYXRhIC0gZXhjbHVkZSBUTFYgYW5kIFdNSSBoZWFkZXJzICovCisJV01JX0NPTU1BTkRfUkVDT1JEKGNtZF9pZCwgKCh1aW50MzJfdCAqKSBjZGZfbmJ1Zl9kYXRhKGJ1ZikgKyAyKSk7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ3bWlfaGFuZGxlLT53bWlfcmVjb3JkX2xvY2spOworI2VuZGlmCisKKwlzdGF0dXMgPSBodGNfc2VuZF9wa3Qod21pX2hhbmRsZS0+aHRjX2hhbmRsZSwgcGt0KTsKKworCWlmIChBX09LICE9IHN0YXR1cykgeworCQljZGZfYXRvbWljX2RlYygmd21pX2hhbmRsZS0+cGVuZGluZ19jbWRzKTsKKwkJcHJfZXJyKCIlcyAlZCwgaHRjX3NlbmRfcGt0IGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwl9CisKKwlyZXR1cm4gKChzdGF0dXMgPT0gQV9PSykgPyBFT0sgOiAtMSk7Cit9CisKKy8qIFdNSSBFdmVudCBoYW5kbGVyIHJlZ2lzdGVyIEFQSSAqLworaW50IHdtaV91bmlmaWVkX2dldF9ldmVudF9oYW5kbGVyX2l4KHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCQkgICAgIFdNSV9FVlRfSUQgZXZlbnRfaWQpCit7CisJdWludDMyX3QgaWR4ID0gMDsKKwlmb3IgKGlkeCA9IDA7IChpZHggPCB3bWlfaGFuZGxlLT5tYXhfZXZlbnRfaWR4ICYmCisJCSAgICAgICBpZHggPCBXTUlfVU5JRklFRF9NQVhfRVZFTlQpOyArK2lkeCkgeworCQlpZiAod21pX2hhbmRsZS0+ZXZlbnRfaWRbaWR4XSA9PSBldmVudF9pZCAmJgorCQkgICAgd21pX2hhbmRsZS0+ZXZlbnRfaGFuZGxlcltpZHhdICE9IE5VTEwpIHsKKwkJCXJldHVybiBpZHg7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQgd21pX3VuaWZpZWRfcmVnaXN0ZXJfZXZlbnRfaGFuZGxlcih3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsCisJCQkJICAgICAgIFdNSV9FVlRfSUQgZXZlbnRfaWQsCisJCQkJICAgICAgIHdtaV91bmlmaWVkX2V2ZW50X2hhbmRsZXIgaGFuZGxlcl9mdW5jKQoreworCXVpbnQzMl90IGlkeCA9IDA7CisKKwlpZiAod21pX3VuaWZpZWRfZ2V0X2V2ZW50X2hhbmRsZXJfaXgod21pX2hhbmRsZSwgZXZlbnRfaWQpICE9IC0xKSB7CisJCXByaW50aygiJXMgOiBldmVudCBoYW5kbGVyIGFscmVhZHkgcmVnaXN0ZXJlZCAweCV4IFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBldmVudF9pZCk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHdtaV9oYW5kbGUtPm1heF9ldmVudF9pZHggPT0gV01JX1VOSUZJRURfTUFYX0VWRU5UKSB7CisJCXByaW50aygiJXMgOiBubyBtb3JlIGV2ZW50IGhhbmRsZXJzIDB4JXggXG4iLAorCQkgICAgICAgX19mdW5jX18sIGV2ZW50X2lkKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZHggPSB3bWlfaGFuZGxlLT5tYXhfZXZlbnRfaWR4OworCXdtaV9oYW5kbGUtPmV2ZW50X2hhbmRsZXJbaWR4XSA9IGhhbmRsZXJfZnVuYzsKKwl3bWlfaGFuZGxlLT5ldmVudF9pZFtpZHhdID0gZXZlbnRfaWQ7CisJd21pX2hhbmRsZS0+bWF4X2V2ZW50X2lkeCsrOworCXJldHVybiAwOworfQorCitpbnQgd21pX3VuaWZpZWRfdW5yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCQkJIFdNSV9FVlRfSUQgZXZlbnRfaWQpCit7CisJdWludDMyX3QgaWR4ID0gMDsKKwlpZiAoKGlkeCA9CisJCSAgICAgd21pX3VuaWZpZWRfZ2V0X2V2ZW50X2hhbmRsZXJfaXgod21pX2hhbmRsZSwgZXZlbnRfaWQpKSA9PSAtMSkgeworCQlwcmludGsoIiVzIDogZXZlbnQgaGFuZGxlciBpcyBub3QgcmVnaXN0ZXJlZDogZXZlbnQgaWQgMHgleCBcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgZXZlbnRfaWQpOworCQlyZXR1cm4gLTE7CisJfQorCXdtaV9oYW5kbGUtPmV2ZW50X2hhbmRsZXJbaWR4XSA9IE5VTEw7CisJd21pX2hhbmRsZS0+ZXZlbnRfaWRbaWR4XSA9IDA7CisJLS13bWlfaGFuZGxlLT5tYXhfZXZlbnRfaWR4OworCXdtaV9oYW5kbGUtPmV2ZW50X2hhbmRsZXJbaWR4XSA9CisJCXdtaV9oYW5kbGUtPmV2ZW50X2hhbmRsZXJbd21pX2hhbmRsZS0+bWF4X2V2ZW50X2lkeF07CisJd21pX2hhbmRsZS0+ZXZlbnRfaWRbaWR4XSA9CisJCXdtaV9oYW5kbGUtPmV2ZW50X2lkW3dtaV9oYW5kbGUtPm1heF9ldmVudF9pZHhdOworCXJldHVybiAwOworfQorCisjaWYgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnRseSBub3QgdXNlZCAqLworc3RhdGljIGludCB3bWlfdW5pZmllZF9ldmVudF9yeChzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUsCisJCQkJd21pX2J1Zl90IGV2dF9idWYpCit7CisJdWludDMyX3QgaWQ7CisJdWludDhfdCAqZXZlbnQ7CisJdWludDE2X3QgbGVuOworCWludCBzdGF0dXMgPSAtMTsKKwl1aW50MzJfdCBpZHggPSAwOworCisJQVNTRVJUKGV2dF9idWYgIT0gTlVMTCk7CisKKwlpZCA9IFdNSV9HRVRfRklFTEQoY2RmX25idWZfZGF0YShldnRfYnVmKSwgV01JX0NNRF9IRFIsIENPTU1BTkRJRCk7CisKKwlpZiAoY2RmX25idWZfcHVsbF9oZWFkKGV2dF9idWYsIHNpemVvZihXTUlfQ01EX0hEUikpID09IE5VTEwpCisJCWdvdG8gZW5kOworCisJaWR4ID0gd21pX3VuaWZpZWRfZ2V0X2V2ZW50X2hhbmRsZXJfaXgod21pX2hhbmRsZSwgaWQpOworCWlmIChpZHggPT0gLTEpIHsKKwkJcHJfZXJyKCIlcyA6IGV2ZW50IGhhbmRsZXIgaXMgbm90IHJlZ2lzdGVyZWQ6IGV2ZW50IGlkOiAweCV4XG4iLAorCQkgICAgICAgX19mdW5jX18sIGlkKTsKKwkJZ290byBlbmQ7CisJfQorCisJZXZlbnQgPSBjZGZfbmJ1Zl9kYXRhKGV2dF9idWYpOworCWxlbiA9IGNkZl9uYnVmX2xlbihldnRfYnVmKTsKKworCS8qIENhbGwgdGhlIFdNSSByZWdpc3RlcmVkIGV2ZW50IGhhbmRsZXIgKi8KKwlzdGF0dXMgPSB3bWlfaGFuZGxlLT5ldmVudF9oYW5kbGVyW2lkeF0gKHdtaV9oYW5kbGUtPnNjbl9oYW5kbGUsCisJCQkJCQkgZXZlbnQsIGxlbik7CisKK2VuZDoKKwljZGZfbmJ1Zl9mcmVlKGV2dF9idWYpOworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogMCAqLworLyoKKyAqIEV2ZW50IHByb2Nlc3MgYnkgYmVsb3cgZnVuY3Rpb24gd2lsbCBiZSBpbiB0YXNrZXQgY29udGV4dC4KKyAqIFBsZWFzZSB1c2UgdGhpcyBtZXRob2Qgb25seSBmb3IgdGltZSBzZW5zaXRpdmUgZnVuY3Rpb25zLgorICovCitzdGF0aWMgdm9pZCB3bWlfcHJvY2Vzc19md19ldmVudF90YXNrbGV0X2N0eChzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUsCisJCQkJCSAgICAgSFRDX1BBQ0tFVCAqaHRjX3BhY2tldCkKK3sKKworCXdtaV9idWZfdCBldnRfYnVmOworCWV2dF9idWYgPSAod21pX2J1Zl90KSBodGNfcGFja2V0LT5wUGt0Q29udGV4dDsKKworCV9fd21pX2NvbnRyb2xfcngod21pX2hhbmRsZSwgZXZ0X2J1Zik7CisJcmV0dXJuOworfQorCisvKgorICogRXZlbnQgcHJvY2VzcyBieSBiZWxvdyBmdW5jdGlvbiB3aWxsIGJlIGluIG1jX3RocmVhZCBjb250ZXh0LgorICogQnkgZGVmYXVsdCBhbGwgZXZlbnQgd2lsbCBiZSBleGVjdXRlZCBpbiBtY190aHJlYWQgY29udGV4dC4KKyAqIFVzZSB0aGlzIG1ldGhvZCBmb3IgYWxsIGV2ZW50cyB3aGljaCBhcmUgcHJvY2Vzc2VkIGJ5IHByb3RvY29sIHN0YWNrLgorICogVGhpcyBtZXRob2Qgd2lsbCByZWR1Y2UgY29udGV4dCBzd2l0Y2hpbmcgYW5kIHJhY2UgY29uZGl0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgd21pX3Byb2Nlc3NfZndfZXZlbnRfbWNfdGhyZWFkX2N0eChzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUsCisJCQkJCSAgICAgICBIVENfUEFDS0VUICpodGNfcGFja2V0KQoreworCXdtaV9idWZfdCBldnRfYnVmOworCWV2dF9idWYgPSAod21pX2J1Zl90KSBodGNfcGFja2V0LT5wUGt0Q29udGV4dDsKKworCXdtaV9oYW5kbGUtPndtYV9wcm9jZXNzX2Z3X2V2ZW50X2hhbmRsZXJfY2JrKHdtaV9oYW5kbGUsIGV2dF9idWYpOworCXJldHVybjsKK30KKworLyoKKyAqIEV2ZW50IHByb2Nlc3MgYnkgYmVsb3cgZnVuY3Rpb24gd2lsbCBiZSBpbiB3b3JrZXIgdGhyZWFkIGNvbnRleHQuCisgKiBVc2UgdGhpcyBtZXRob2QgZm9yIGV2ZW50cyB3aGljaCBhcmUgbm90IGNyaXRpY2FsIGFuZCBub3QKKyAqIGhhbmRsZWQgaW4gcHJvdG9jb2wgc3RhY2suCisgKi8KK3N0YXRpYyB2b2lkIHdtaV9wcm9jZXNzX2Z3X2V2ZW50X3dvcmtlcl90aHJlYWRfY3R4CisJCShzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUsIEhUQ19QQUNLRVQgKmh0Y19wYWNrZXQpCit7CisJd21pX2J1Zl90IGV2dF9idWY7CisJdWludDMyX3QgaWQ7CisJdWludDhfdCAqZGF0YTsKKworCWV2dF9idWYgPSAod21pX2J1Zl90KSBodGNfcGFja2V0LT5wUGt0Q29udGV4dDsKKwlpZCA9IFdNSV9HRVRfRklFTEQoY2RmX25idWZfZGF0YShldnRfYnVmKSwgV01JX0NNRF9IRFIsIENPTU1BTkRJRCk7CisJZGF0YSA9IGNkZl9uYnVmX2RhdGEoZXZ0X2J1Zik7CisKKwljZGZfc3Bpbl9sb2NrX2JoKCZ3bWlfaGFuZGxlLT53bWlfcmVjb3JkX2xvY2spOworCS8qIEV4Y2x1ZGUgNCBieXRlcyBvZiBUTFYgaGVhZGVyICovCisJV01JX1JYX0VWRU5UX1JFQ09SRChpZCwgKCh1aW50OF90ICopIGRhdGEgKyA0KSk7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ3bWlfaGFuZGxlLT53bWlfcmVjb3JkX2xvY2spOworCWNkZl9zcGluX2xvY2tfYmgoJndtaV9oYW5kbGUtPmV2ZW50cV9sb2NrKTsKKwljZGZfbmJ1Zl9xdWV1ZV9hZGQoJndtaV9oYW5kbGUtPmV2ZW50X3F1ZXVlLCBldnRfYnVmKTsKKwljZGZfc3Bpbl91bmxvY2tfYmgoJndtaV9oYW5kbGUtPmV2ZW50cV9sb2NrKTsKKwlzY2hlZHVsZV93b3JrKCZ3bWlfaGFuZGxlLT5yeF9ldmVudF93b3JrKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUZW1wb3JhcmlseSBhZGRlZCB0byBzdXBwb3J0IG9sZGVyIFdNSSBldmVudHMuIFdlIHNob3VsZCBtb3ZlIGFsbCBldmVudHMgdG8gdW5pZmllZAorICogd2hlbiB0aGUgdGFyZ2V0IGlzIHJlYWR5IHRvIHN1cHBvcnQgaXQuCisgKi8KK3ZvaWQgd21pX2NvbnRyb2xfcngodm9pZCAqY3R4LCBIVENfUEFDS0VUICpodGNfcGFja2V0KQoreworCXN0cnVjdCB3bWlfdW5pZmllZCAqd21pX2hhbmRsZSA9IChzdHJ1Y3Qgd21pX3VuaWZpZWQgKiljdHg7CisJd21pX2J1Zl90IGV2dF9idWY7CisJdWludDMyX3QgaWQ7CisKKwlldnRfYnVmID0gKHdtaV9idWZfdCkgaHRjX3BhY2tldC0+cFBrdENvbnRleHQ7CisJaWQgPSBXTUlfR0VUX0ZJRUxEKGNkZl9uYnVmX2RhdGEoZXZ0X2J1ZiksIFdNSV9DTURfSERSLCBDT01NQU5ESUQpOworCXN3aXRjaCAoaWQpIHsKKwkvKkV2ZW50IHdpbGwgYmUgaGFuZGxlZCBpbiB0YXNrbGV0IGN0eCovCisJY2FzZSBXTUlfVFhfUEFVU0VfRVZFTlRJRDoKKwljYXNlIFdNSV9XT1dfV0FLRVVQX0hPU1RfRVZFTlRJRDoKKwljYXNlIFdNSV9QREVWX1JFU1VNRV9FVkVOVElEOgorCWNhc2UgV01JX0QwX1dPV19ESVNBQkxFX0FDS19FVkVOVElEOgorCQl3bWlfcHJvY2Vzc19md19ldmVudF90YXNrbGV0X2N0eAorCQkJCQkod21pX2hhbmRsZSwgaHRjX3BhY2tldCk7CisJCWJyZWFrOworCS8qRXZlbnQgd2lsbCBiZSBoYW5kbGVkIGluIHdvcmtlciB0aHJlYWQgY3R4Ki8KKwljYXNlIFdNSV9ERUJVR19NRVNHX0VWRU5USUQ6CisJY2FzZSBXTUlfREZTX1JBREFSX0VWRU5USUQ6CisJY2FzZSBXTUlfUEhZRVJSX0VWRU5USUQ6CisJY2FzZSBXTUlfUEVFUl9TVEFURV9FVkVOVElEOgorCWNhc2UgV01JX01HTVRfUlhfRVZFTlRJRDoKKwljYXNlIFdNSV9ST0FNX0VWRU5USUQ6CisJCXdtaV9wcm9jZXNzX2Z3X2V2ZW50X3dvcmtlcl90aHJlYWRfY3R4CisJCQkJCSh3bWlfaGFuZGxlLCBodGNfcGFja2V0KTsKKwkJYnJlYWs7CisJLypFdmVudCB3aWxsIGJlIGhhbmRsZWQgaW4gbWNfdGhyZWFkIGN0eCovCisJZGVmYXVsdDoKKwkJd21pX3Byb2Nlc3NfZndfZXZlbnRfbWNfdGhyZWFkX2N0eAorCQkJCQkod21pX2hhbmRsZSwgaHRjX3BhY2tldCk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCB3bWlfcHJvY2Vzc19md19ldmVudChzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUsIHdtaV9idWZfdCBldnRfYnVmKQoreworCV9fd21pX2NvbnRyb2xfcngod21pX2hhbmRsZSwgZXZ0X2J1Zik7Cit9CisKK3ZvaWQgX193bWlfY29udHJvbF9yeChzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUsIHdtaV9idWZfdCBldnRfYnVmKQoreworCXVpbnQzMl90IGlkOworCXVpbnQ4X3QgKmRhdGE7CisJdWludDMyX3QgbGVuOworCXZvaWQgKndtaV9jbWRfc3RydWN0X3B0ciA9IE5VTEw7CisJaW50IHRsdl9va19zdGF0dXMgPSAwOworCisJaWQgPSBXTUlfR0VUX0ZJRUxEKGNkZl9uYnVmX2RhdGEoZXZ0X2J1ZiksIFdNSV9DTURfSERSLCBDT01NQU5ESUQpOworCisJaWYgKGNkZl9uYnVmX3B1bGxfaGVhZChldnRfYnVmLCBzaXplb2YoV01JX0NNRF9IRFIpKSA9PSBOVUxMKQorCQlnb3RvIGVuZDsKKworCWRhdGEgPSBjZGZfbmJ1Zl9kYXRhKGV2dF9idWYpOworCWxlbiA9IGNkZl9uYnVmX2xlbihldnRfYnVmKTsKKworCS8qIFZhbGlkYXRlIGFuZCBwYWQoaWYgbmVjZXNzYXJ5KSB0aGUgVExWcyAqLworCXRsdl9va19zdGF0dXMgPSB3bWl0bHZfY2hlY2tfYW5kX3BhZF9ldmVudF90bHZzKHdtaV9oYW5kbGUtPnNjbl9oYW5kbGUsCisJCQkJCQkJZGF0YSwgbGVuLCBpZCwKKwkJCQkJCQkmd21pX2NtZF9zdHJ1Y3RfcHRyKTsKKwlpZiAodGx2X29rX3N0YXR1cyAhPSAwKSB7CisJCXByX2VycigiJXM6IEVycm9yOiBpZD0weCVkLCB3bWl0bHZfY2hlY2tfYW5kX3BhZF90bHZzIHJldD0lZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBpZCwgdGx2X29rX3N0YXR1cyk7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChpZCA+PSBXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX1NUQVJUKSkgeworCQl1aW50MzJfdCBpZHggPSAwOworCisJCWlkeCA9IHdtaV91bmlmaWVkX2dldF9ldmVudF9oYW5kbGVyX2l4KHdtaV9oYW5kbGUsIGlkKTsKKwkJaWYgKGlkeCA9PSAtMSkgeworCQkJcHJfZXJyCisJCQkJKCIlcyA6IGV2ZW50IGhhbmRsZXIgaXMgbm90IHJlZ2lzdGVyZWQ6IGV2ZW50IGlkIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIGlkKTsKKwkJCWdvdG8gZW5kOworCQl9CisjaWZkZWYgV01JX0lOVEVSRkFDRV9FVkVOVF9MT0dHSU5HCisJCWNkZl9zcGluX2xvY2tfYmgoJndtaV9oYW5kbGUtPndtaV9yZWNvcmRfbG9jayk7CisJCS8qIEV4Y2x1ZGUgNCBieXRlcyBvZiBUTFYgaGVhZGVyICovCisJCVdNSV9FVkVOVF9SRUNPUkQoaWQsICgodWludDhfdCAqKSBkYXRhICsgNCkpOworCQljZGZfc3Bpbl91bmxvY2tfYmgoJndtaV9oYW5kbGUtPndtaV9yZWNvcmRfbG9jayk7CisjZW5kaWYKKwkJLyogQ2FsbCB0aGUgV01JIHJlZ2lzdGVyZWQgZXZlbnQgaGFuZGxlciAqLworCQl3bWlfaGFuZGxlLT5ldmVudF9oYW5kbGVyW2lkeF0gKHdtaV9oYW5kbGUtPnNjbl9oYW5kbGUsCisJCQkJCQl3bWlfY21kX3N0cnVjdF9wdHIsIGxlbik7CisJCWdvdG8gZW5kOworCX0KKworCXN3aXRjaCAoaWQpIHsKKwlkZWZhdWx0OgorCQlwcl9pbmZvKCIlczogVW5oYW5kbGVkIFdNSSBldmVudCAlZFxuIiwgX19mdW5jX18sIGlkKTsKKwkJYnJlYWs7CisJY2FzZSBXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEOgorCQlwcl9pbmZvKCIlczogV01JIFVOSUZJRUQgU0VSVklDRSBSRUFEWSBldmVudFxuIiwgX19mdW5jX18pOworCQl3bWFfcnhfc2VydmljZV9yZWFkeV9ldmVudCh3bWlfaGFuZGxlLT5zY25faGFuZGxlLAorCQkJCQkgICB3bWlfY21kX3N0cnVjdF9wdHIpOworCQlicmVhazsKKwljYXNlIFdNSV9TRVJWSUNFX1JFQURZX0VYVF9FVkVOVElEOgorCQlXTUFfTE9HQSgiJXM6IFdNSSBVTklGSUVEIFNFUlZJQ0UgUkVBRFkgRXh0ZW5kZWQgZXZlbnQiLAorCQkJX19mdW5jX18pOworCQl3bWFfcnhfc2VydmljZV9yZWFkeV9leHRfZXZlbnQod21pX2hhbmRsZS0+c2NuX2hhbmRsZSwKKwkJCQkJCXdtaV9jbWRfc3RydWN0X3B0cik7CisJCWJyZWFrOworCWNhc2UgV01JX1JFQURZX0VWRU5USUQ6CisJCXByX2luZm8oIiVzOiAgV01JIFVOSUZJRUQgUkVBRFkgZXZlbnRcbiIsIF9fZnVuY19fKTsKKwkJd21hX3J4X3JlYWR5X2V2ZW50KHdtaV9oYW5kbGUtPnNjbl9oYW5kbGUsIHdtaV9jbWRfc3RydWN0X3B0cik7CisJCWJyZWFrOworCX0KK2VuZDoKKwl3bWl0bHZfZnJlZV9hbGxvY2F0ZWRfZXZlbnRfdGx2cyhpZCwgJndtaV9jbWRfc3RydWN0X3B0cik7CisJY2RmX25idWZfZnJlZShldnRfYnVmKTsKK30KKwordm9pZCB3bWlfcnhfZXZlbnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdtaV91bmlmaWVkICp3bWkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdtaV91bmlmaWVkLAorCQkJCQkgICAgICAgcnhfZXZlbnRfd29yayk7CisJd21pX2J1Zl90IGJ1ZjsKKworCWNkZl9zcGluX2xvY2tfYmgoJndtaS0+ZXZlbnRxX2xvY2spOworCWJ1ZiA9IGNkZl9uYnVmX3F1ZXVlX3JlbW92ZSgmd21pLT5ldmVudF9xdWV1ZSk7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ3bWktPmV2ZW50cV9sb2NrKTsKKwl3aGlsZSAoYnVmKSB7CisJCV9fd21pX2NvbnRyb2xfcngod21pLCBidWYpOworCQljZGZfc3Bpbl9sb2NrX2JoKCZ3bWktPmV2ZW50cV9sb2NrKTsKKwkJYnVmID0gY2RmX25idWZfcXVldWVfcmVtb3ZlKCZ3bWktPmV2ZW50X3F1ZXVlKTsKKwkJY2RmX3NwaW5fdW5sb2NrX2JoKCZ3bWktPmV2ZW50cV9sb2NrKTsKKwl9Cit9CisKKy8qIFdNSSBJbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8KKwordm9pZCAqd21pX3VuaWZpZWRfYXR0YWNoKG9sX3Njbl90IHNjbl9oYW5kbGUsCisJCQkgd21hX3Byb2Nlc3NfZndfZXZlbnRfaGFuZGxlcl9jYmsgZnVuYykKK3sKKwlzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGU7CisJd21pX2hhbmRsZSA9CisJCShzdHJ1Y3Qgd21pX3VuaWZpZWQgKilvc19tYWxsb2MoTlVMTCwgc2l6ZW9mKHN0cnVjdCB3bWlfdW5pZmllZCksCisJCQkJCQlHRlBfQVRPTUlDKTsKKwlpZiAod21pX2hhbmRsZSA9PSBOVUxMKSB7CisJCXByaW50aygiYWxsb2NhdGlvbiBvZiB3bWkgaGFuZGxlIGZhaWxlZCAlenUgXG4iLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB3bWlfdW5pZmllZCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJT1NfTUVNWkVSTyh3bWlfaGFuZGxlLCBzaXplb2Yoc3RydWN0IHdtaV91bmlmaWVkKSk7CisJd21pX2hhbmRsZS0+c2NuX2hhbmRsZSA9IHNjbl9oYW5kbGU7CisJY2RmX2F0b21pY19pbml0KCZ3bWlfaGFuZGxlLT5wZW5kaW5nX2NtZHMpOworCWNkZl9hdG9taWNfaW5pdCgmd21pX2hhbmRsZS0+aXNfdGFyZ2V0X3N1c3BlbmRlZCk7CisJY2RmX3NwaW5sb2NrX2luaXQoJndtaV9oYW5kbGUtPmV2ZW50cV9sb2NrKTsKKwljZGZfbmJ1Zl9xdWV1ZV9pbml0KCZ3bWlfaGFuZGxlLT5ldmVudF9xdWV1ZSk7CisjaWZkZWYgQ09ORklHX0NOU1MKKwljbnNzX2luaXRfd29yaygmd21pX2hhbmRsZS0+cnhfZXZlbnRfd29yaywgd21pX3J4X2V2ZW50X3dvcmspOworI2Vsc2UKKwlJTklUX1dPUksoJndtaV9oYW5kbGUtPnJ4X2V2ZW50X3dvcmssIHdtaV9yeF9ldmVudF93b3JrKTsKKyNlbmRpZgorI2lmZGVmIFdNSV9JTlRFUkZBQ0VfRVZFTlRfTE9HR0lORworCWNkZl9zcGlubG9ja19pbml0KCZ3bWlfaGFuZGxlLT53bWlfcmVjb3JkX2xvY2spOworI2VuZGlmCisJd21pX2hhbmRsZS0+d21hX3Byb2Nlc3NfZndfZXZlbnRfaGFuZGxlcl9jYmsgPSBmdW5jOworCXJldHVybiB3bWlfaGFuZGxlOworfQorCit2b2lkIHdtaV91bmlmaWVkX2RldGFjaChzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUpCit7CisJd21pX2J1Zl90IGJ1ZjsKKworCWNkc19mbHVzaF93b3JrKCZ3bWlfaGFuZGxlLT5yeF9ldmVudF93b3JrKTsKKwljZGZfc3Bpbl9sb2NrX2JoKCZ3bWlfaGFuZGxlLT5ldmVudHFfbG9jayk7CisJYnVmID0gY2RmX25idWZfcXVldWVfcmVtb3ZlKCZ3bWlfaGFuZGxlLT5ldmVudF9xdWV1ZSk7CisJd2hpbGUgKGJ1ZikgeworCQljZGZfbmJ1Zl9mcmVlKGJ1Zik7CisJCWJ1ZiA9IGNkZl9uYnVmX3F1ZXVlX3JlbW92ZSgmd21pX2hhbmRsZS0+ZXZlbnRfcXVldWUpOworCX0KKwljZGZfc3Bpbl91bmxvY2tfYmgoJndtaV9oYW5kbGUtPmV2ZW50cV9sb2NrKTsKKwlpZiAod21pX2hhbmRsZSAhPSBOVUxMKSB7CisJCU9TX0ZSRUUod21pX2hhbmRsZSk7CisJCXdtaV9oYW5kbGUgPSBOVUxMOworCX0KK30KKwordm9pZCB3bWlfaHRjX3R4X2NvbXBsZXRlKHZvaWQgKmN0eCwgSFRDX1BBQ0tFVCAqaHRjX3BrdCkKK3sKKwlzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUgPSAoc3RydWN0IHdtaV91bmlmaWVkICopY3R4OworCXdtaV9idWZfdCB3bWlfY21kX2J1ZiA9IEdFVF9IVENfUEFDS0VUX05FVF9CVUZfQ09OVEVYVChodGNfcGt0KTsKKyNpZmRlZiBXTUlfSU5URVJGQUNFX0VWRU5UX0xPR0dJTkcKKwl1aW50MzJfdCBjbWRfaWQ7CisjZW5kaWYKKworCUFTU0VSVCh3bWlfY21kX2J1Zik7CisjaWZkZWYgV01JX0lOVEVSRkFDRV9FVkVOVF9MT0dHSU5HCisJY21kX2lkID0gV01JX0dFVF9GSUVMRChjZGZfbmJ1Zl9kYXRhKHdtaV9jbWRfYnVmKSwKKwkJCSAgICAgICBXTUlfQ01EX0hEUiwgQ09NTUFORElEKTsKKworI2lmZGVmIFFDQV9XSUZJXzNfMF9FTVUKKwlwcmludGsoIlxuU2VudCBXTUkgY29tbWFuZDolcyBjb21tYW5kX2lkOjB4JXggb3ZlciBkbWEgYW5kIHJlY2lldmVkIHR4IGNvbXBsZXRlIGludGVydXB0XG4iLAorCQkgZ2V0X3dtaV9jbWRfc3RyaW5nKGNtZF9pZCksIGNtZF9pZCk7CisjZW5kaWYKKworCWNkZl9zcGluX2xvY2tfYmgoJndtaV9oYW5kbGUtPndtaV9yZWNvcmRfbG9jayk7CisJLyogUmVjb3JkIDE2IGJ5dGVzIG9mIFdNSSBjbWQgdHggY29tcGxldGUgZGF0YQorCSAgIC0gZXhjbHVkZSBUTFYgYW5kIFdNSSBoZWFkZXJzICovCisJV01JX0NPTU1BTkRfVFhfQ01QX1JFQ09SRChjbWRfaWQsCisJCQkJICAoKHVpbnQzMl90ICopIGNkZl9uYnVmX2RhdGEod21pX2NtZF9idWYpICsKKwkJCQkgICAyKSk7CisJY2RmX3NwaW5fdW5sb2NrX2JoKCZ3bWlfaGFuZGxlLT53bWlfcmVjb3JkX2xvY2spOworI2VuZGlmCisJY2RmX25idWZfZnJlZSh3bWlfY21kX2J1Zik7CisJY2RmX21lbV9mcmVlKGh0Y19wa3QpOworCWNkZl9hdG9taWNfZGVjKCZ3bWlfaGFuZGxlLT5wZW5kaW5nX2NtZHMpOworfQorCitpbnQKK3dtaV91bmlmaWVkX2Nvbm5lY3RfaHRjX3NlcnZpY2Uoc3RydWN0IHdtaV91bmlmaWVkICp3bWlfaGFuZGxlLAorCQkJCXZvaWQgKmh0Y19oYW5kbGUpCit7CisKKwlpbnQgc3RhdHVzOworCUhUQ19TRVJWSUNFX0NPTk5FQ1RfUkVTUCByZXNwb25zZTsKKwlIVENfU0VSVklDRV9DT05ORUNUX1JFUSBjb25uZWN0OworCisJT1NfTUVNWkVSTygmY29ubmVjdCwgc2l6ZW9mKGNvbm5lY3QpKTsKKwlPU19NRU1aRVJPKCZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisKKwkvKiBtZXRhIGRhdGEgaXMgdW51c2VkIGZvciBub3cgKi8KKwljb25uZWN0LnBNZXRhRGF0YSA9IE5VTEw7CisJY29ubmVjdC5NZXRhRGF0YUxlbmd0aCA9IDA7CisJLyogdGhlc2UgZmllbGRzIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHNlcnZpY2UgZW5kcG9pbnRzICovCisJY29ubmVjdC5FcENhbGxiYWNrcy5wQ29udGV4dCA9IHdtaV9oYW5kbGU7CisJY29ubmVjdC5FcENhbGxiYWNrcy5FcFR4Q29tcGxldGVNdWx0aXBsZSA9CisJCU5VTEwgLyogQ29udHJvbCBwYXRoIGNvbXBsZXRpb24gYXI2MDAwX3R4X2NvbXBsZXRlICovOworCWNvbm5lY3QuRXBDYWxsYmFja3MuRXBSZWN2ID0gd21pX2NvbnRyb2xfcnggLyogQ29udHJvbCBwYXRoIHJ4ICovOworCWNvbm5lY3QuRXBDYWxsYmFja3MuRXBSZWN2UmVmaWxsID0gTlVMTCAvKiBhcjYwMDBfcnhfcmVmaWxsICovOworCWNvbm5lY3QuRXBDYWxsYmFja3MuRXBTZW5kRnVsbCA9IE5VTEwgLyogYXI2MDAwX3R4X3F1ZXVlX2Z1bGwgKi87CisJY29ubmVjdC5FcENhbGxiYWNrcy5FcFR4Q29tcGxldGUgPQorCQl3bWlfaHRjX3R4X2NvbXBsZXRlIC8qIGFyNjAwMF90eF9xdWV1ZV9mdWxsICovOworCisJLyogY29ubmVjdCB0byBjb250cm9sIHNlcnZpY2UgKi8KKwljb25uZWN0LlNlcnZpY2VJRCA9IFdNSV9DT05UUk9MX1NWQzsKKworCWlmICgoc3RhdHVzID0KKwkJICAgICBodGNfY29ubmVjdF9zZXJ2aWNlKGh0Y19oYW5kbGUsICZjb25uZWN0LCAmcmVzcG9uc2UpKSAhPSBFT0spIHsKKwkJcHJpbnRrCisJCQkoIiBGYWlsZWQgdG8gY29ubmVjdCB0byBXTUkgQ09OVFJPTCAgc2VydmljZSBzdGF0dXM6JWQgXG4iLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuIC0xOzsKKwl9CisJd21pX2hhbmRsZS0+d21pX2VuZHBvaW50X2lkID0gcmVzcG9uc2UuRW5kcG9pbnQ7CisJd21pX2hhbmRsZS0+aHRjX2hhbmRsZSA9IGh0Y19oYW5kbGU7CisJd21pX2hhbmRsZS0+bWF4X21zZ19sZW4gPSByZXNwb25zZS5NYXhNc2dMZW5ndGg7CisKKwlyZXR1cm4gRU9LOworfQorCitpbnQgd21pX2dldF9ob3N0X2NyZWRpdHMod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlKQoreworCWludCBob3N0X2NyZWRpdHM7CisKKwlodGNfZ2V0X2NvbnRyb2xfZW5kcG9pbnRfdHhfaG9zdF9jcmVkaXRzKHdtaV9oYW5kbGUtPmh0Y19oYW5kbGUsCisJCQkJCQkgJmhvc3RfY3JlZGl0cyk7CisJcmV0dXJuIGhvc3RfY3JlZGl0czsKK30KKworaW50IHdtaV9nZXRfcGVuZGluZ19jbWRzKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSkKK3sKKwlyZXR1cm4gY2RmX2F0b21pY19yZWFkKCZ3bWlfaGFuZGxlLT5wZW5kaW5nX2NtZHMpOworfQorCit2b2lkIHdtaV9zZXRfdGFyZ2V0X3N1c3BlbmQod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCBBX0JPT0wgdmFsKQoreworCWNkZl9hdG9taWNfc2V0KCZ3bWlfaGFuZGxlLT5pc190YXJnZXRfc3VzcGVuZGVkLCB2YWwpOworfQorCmRpZmYgLS1naXQgYS9jb3JlL3dtaS93bWlfdW5pZmllZF9hcGkuaCBiL2NvcmUvd21pL3dtaV91bmlmaWVkX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzEzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dtaS93bWlfdW5pZmllZF9hcGkuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQVBJIGRlZmluaXRpb25zIGZvciB0aGUgVW5pZmllZCBXaXJlbGVzcyBNb2R1bGUgSW50ZXJmYWNlIChXTUkpLgorICovCisKKyNpZm5kZWYgX1dNSV9VTklGSUVEX0FQSV9IXworI2RlZmluZSBfV01JX1VOSUZJRURfQVBJX0hfCisKKyNpbmNsdWRlIDxvc2RlcC5oPgorI2luY2x1ZGUgImFfdHlwZXMuaCIKKyNpbmNsdWRlICJvbF9kZWZpbmVzLmgiCisjaW5jbHVkZSAid21pLmgiCisjaW5jbHVkZSAiaHRjX2FwaS5oIgorCit0eXBlZGVmIGNkZl9uYnVmX3Qgd21pX2J1Zl90OworI2RlZmluZSB3bWlfYnVmX2RhdGEoX2J1ZikgY2RmX25idWZfZGF0YShfYnVmKQorCisvKioKKyAqIGF0dGFjaCBmb3IgdW5pZmllZCBXTUkKKyAqCisgKiAgQHBhcmFtIHNjbl9oYW5kbGUgICAgICA6IGhhbmRsZSB0byBTQ04uCisgKiAgQHJldHVybiBvcGFxdWUgaGFuZGxlLgorICovCit2b2lkICp3bWlfdW5pZmllZF9hdHRhY2godm9pZCAqc2NuX2hhbmRsZSwKKwkJCSBpbnQgKCpmdW5jKShzdHJ1Y3Qgd21pX3VuaWZpZWQgKiwgd21pX2J1Zl90KSk7CisvKioKKyAqIGRldGFjaCBmb3IgdW5pZmllZCBXTUkKKyAqCisgKiAgQHBhcmFtIHdtaV9oYW5kbGUgICAgICA6IGhhbmRsZSB0byBXTUkuCisgKiAgQHJldHVybiB2b2lkLgorICovCit2b2lkIHdtaV91bmlmaWVkX2RldGFjaChzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUpOworCisvKioKKyAqIGdlbmVyaWMgZnVuY3Rpb24gdG8gYWxsb2NhdGUgV01JIGJ1ZmZlcgorICoKKyAqICBAcGFyYW0gd21pX2hhbmRsZSAgICAgIDogaGFuZGxlIHRvIFdNSS4KKyAqICBAcGFyYW0gbGVuICAgICAgICAgICAgIDogbGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqICBAcmV0dXJuIHdtaV9idWZfdC4KKyAqLworI2lmZGVmIE1FTU9SWV9ERUJVRworI2RlZmluZSB3bWlfYnVmX2FsbG9jKGgsIGwpIHdtaV9idWZfYWxsb2NfZGVidWcoaCwgbCwgX19GSUxFX18sIF9fTElORV9fKQord21pX2J1Zl90Cit3bWlfYnVmX2FsbG9jX2RlYnVnKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwgdWludDE2X3QgbGVuLAorCQkgICAgdWludDhfdCAqZmlsZV9uYW1lLCB1aW50MzJfdCBsaW5lX251bSk7CisjZWxzZQord21pX2J1Zl90IHdtaV9idWZfYWxsb2Mod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLCB1aW50MTZfdCBsZW4pOworI2VuZGlmCisKKy8qKgorICogZ2VuZXJpYyBmdW5jdGlvbiBmcmVlcyBXTUkgbmV0IGJ1ZmZlcgorICoKKyAqICBAcGFyYW0gbmV0X2J1ZiA6IFBvaW50ZXIgb3QgbmV0X2J1ZiB0byBiZSBmcmVlZAorICovCit2b2lkIHdtaV9idWZfZnJlZSh3bWlfYnVmX3QgbmV0X2J1Zik7CisKKy8qKgorICogZ2VuZXJpYyBmdW5jdGlvbiB0byBzZW5kIHVuaWZpZWQgV01JIGNvbW1hbmQKKyAqCisgKiAgQHBhcmFtIHdtaV9oYW5kbGUgICAgICA6IGhhbmRsZSB0byBXTUkuCisgKiAgQHBhcmFtIGJ1ZiAgICAgICAgICAgICA6IHdtaSBjb21tYW5kIGJ1ZmZlcgorICogIEBwYXJhbSBidWZsZW4gICAgICAgICAgOiB3bWkgY29tbWFuZCBidWZmZXIgbGVuZ3RoCisgKiAgQHJldHVybiAwICBvbiBzdWNjZXNzIGFuZCAtdmUgb24gZmFpbHVyZS4KKyAqLworaW50Cit3bWlfdW5pZmllZF9jbWRfc2VuZCh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUsIHdtaV9idWZfdCBidWYsIGludCBidWZsZW4sCisJCSAgICAgV01JX0NNRF9JRCBjbWRfaWQpOworCisvKioKKyAqIFdNSSBldmVudCBoYW5kbGVyIHJlZ2lzdGVyIGZ1bmN0aW9uCisgKgorICogIEBwYXJhbSB3bWlfaGFuZGxlICAgICAgOiBoYW5kbGUgdG8gV01JLgorICogIEBwYXJhbSBldmVudF9pZCAgICAgICAgOiBXTUkgZXZlbnQgSUQKKyAqICBAcGFyYW0gaGFuZGxlcl9mdW5jICAgIDogRXZlbnQgaGFuZGxlciBjYWxsIGJhY2sgZnVuY3Rpb24KKyAqICBAcmV0dXJuIDAgIG9uIHN1Y2Nlc3MgYW5kIC12ZSBvbiBmYWlsdXJlLgorICovCitpbnQKK3dtaV91bmlmaWVkX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIod21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlLAorCQkJCSAgIFdNSV9FVlRfSUQgZXZlbnRfaWQsCisJCQkJICAgd21pX3VuaWZpZWRfZXZlbnRfaGFuZGxlciBoYW5kbGVyX2Z1bmMpOworCisvKioKKyAqIFdNSSBldmVudCBoYW5kbGVyIHVucmVnaXN0ZXIgZnVuY3Rpb24KKyAqCisgKiAgQHBhcmFtIHdtaV9oYW5kbGUgICAgICA6IGhhbmRsZSB0byBXTUkuCisgKiAgQHBhcmFtIGV2ZW50X2lkICAgICAgICA6IFdNSSBldmVudCBJRAorICogIEByZXR1cm4gMCAgb24gc3VjY2VzcyBhbmQgLXZlIG9uIGZhaWx1cmUuCisgKi8KK2ludAord21pX3VuaWZpZWRfdW5yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwKKwkJCQkgICAgIFdNSV9FVlRfSUQgZXZlbnRfaWQpOworCisvKioKKyAqIHJlcXVlc3Qgd21pIHRvIGNvbm5ldCBpdHMgaHRjIHNlcnZpY2UuCisgKiAgQHBhcmFtIHdtaV9oYW5kbGUgICAgICA6IGhhbmRsZSB0byBXTUkuCisgKiAgQHJldHVybiB2b2lkCisgKi8KK2ludAord21pX3VuaWZpZWRfY29ubmVjdF9odGNfc2VydmljZShzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUsCisJCQkJdm9pZCAqaHRjX2hhbmRsZSk7CisKKy8qCisgKiBXTUkgQVBJIHRvIHZlcmlmeSB0aGUgaG9zdCBoYXMgZW5vdWdoIGNyZWRpdHMgdG8gc3VzcGVuZAorICovCisKK2ludCB3bWlfaXNfc3VzcGVuZF9yZWFkeSh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUpOworCisvKioKKyAgIFdNSSBBUEkgdG8gZ2V0IHVwZGF0ZWQgaG9zdF9jcmVkaXRzCisgKi8KKworaW50IHdtaV9nZXRfaG9zdF9jcmVkaXRzKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSk7CisKKy8qKgorICAgV01JIEFQSSB0byBnZXQgV01JIFBlbmRpbmcgQ29tbWFuZHMgaW4gdGhlIEhUQyBxdWV1ZQorICovCisKK2ludCB3bWlfZ2V0X3BlbmRpbmdfY21kcyh3bWlfdW5pZmllZF90IHdtaV9oYW5kbGUpOworCisvKioKKyAgIFdNSSBBUEkgdG8gc2V0IHRhcmdldCBzdXNwZW5kIHN0YXRlCisgKi8KKwordm9pZCB3bWlfc2V0X3RhcmdldF9zdXNwZW5kKHdtaV91bmlmaWVkX3Qgd21pX2hhbmRsZSwgQV9CT09MIHZhbCk7CisKKy8qKgorICogV01BIENhbGxiYWNrIHRvIHByb2Nlc3MgZncgZXZlbnQuCisgKi8KK3R5cGVkZWYgaW50ICgqd21hX3Byb2Nlc3NfZndfZXZlbnRfaGFuZGxlcl9jYmspKHN0cnVjdCB3bWlfdW5pZmllZCAqd21pX2hhbmRsZSwKKwkJCQkJCXdtaV9idWZfdCBldnRfYnVmKTsKKwordm9pZCB3bWlfcHJvY2Vzc19md19ldmVudChzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUsIHdtaV9idWZfdCBldnRfYnVmKTsKK3VpbnQxNl90IHdtaV9nZXRfbWF4X21zZ19sZW4od21pX3VuaWZpZWRfdCB3bWlfaGFuZGxlKTsKKyNlbmRpZiAvKiBfV01JX1VOSUZJRURfQVBJX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL3dtaS93bWlfdW5pZmllZF9wcml2LmggYi9jb3JlL3dtaS93bWlfdW5pZmllZF9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmODcwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvd21pL3dtaV91bmlmaWVkX3ByaXYuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBUEkgZGVmaW5pdGlvbnMgZm9yIHRoZSBVbmlmaWVkIFdpcmVsZXNzIE1vZHVsZSBJbnRlcmZhY2UgKFdNSSkuCisgKi8KKyNpZm5kZWYgX1dNSV9VTklGSUVEX1BSSVZfSF8KKyNkZWZpbmUgX1dNSV9VTklGSUVEX1BSSVZfSF8KKyNpbmNsdWRlIDxvc2RlcC5oPgorI2luY2x1ZGUgImFfdHlwZXMuaCIKKyNpbmNsdWRlICJ3bWkuaCIKKyNpbmNsdWRlICJ3bWlfdW5pZmllZC5oIgorI2luY2x1ZGUgImNkZl9hdG9taWMuaCIKKworI2RlZmluZSBXTUlfVU5JRklFRF9NQVhfRVZFTlQgMHgxMDAKKyNkZWZpbmUgV01JX01BWF9DTURTICAxMDI0CisKK3R5cGVkZWYgY2RmX25idWZfdCB3bWlfYnVmX3Q7CisKKyNpZmRlZiBXTUlfSU5URVJGQUNFX0VWRU5UX0xPR0dJTkcKKworI2RlZmluZSBXTUlfRVZFTlRfREVCVUdfTUFYX0VOVFJZICgxMDI0KQorCitzdHJ1Y3Qgd21pX2NvbW1hbmRfZGVidWcgeworCXVpbnQzMl90IGNvbW1hbmQ7CisJdWludDMyX3QgZGF0YVs0XTsgICAgICAgLyoxNiBieXRlcyBvZiBXTUkgY21kIGV4Y2x1ZGluZyBUTFYgYW5kIFdNSSBoZWFkZXJzICovCisJdWludDY0X3QgdGltZTsKK307CisKK3N0cnVjdCB3bWlfZXZlbnRfZGVidWcgeworCXVpbnQzMl90IGV2ZW50OworCXVpbnQzMl90IGRhdGFbNF07ICAgICAgIC8qMTYgYnl0ZXMgb2YgV01JIGV2ZW50IGRhdGEgZXhjbHVkaW5nIFRMViBoZWFkZXIgKi8KKwl1aW50NjRfdCB0aW1lOworfTsKKworI2VuZGlmIC8qV01JX0lOVEVSRkFDRV9FVkVOVF9MT0dHSU5HICovCisKKyNpZmRlZiBXTEFOX09QRU5fU09VUkNFCitzdHJ1Y3QgZndkZWJ1ZyB7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBmd2xvZ19xdWV1ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBmd2xvZ19jb21wbGV0aW9uOworCUFfQk9PTCBmd2xvZ19vcGVuOworfTsKKyNlbmRpZiAvKiBXTEFOX09QRU5fU09VUkNFICovCisKK3N0cnVjdCB3bWlfdW5pZmllZCB7CisJb2xfc2NuX3Qgc2NuX2hhbmRsZTsgICAgLyogaGFuZGxlIHRvIGRldmljZSAqLworCWNkZl9hdG9taWNfdCBwZW5kaW5nX2NtZHM7CisJSFRDX0VORFBPSU5UX0lEIHdtaV9lbmRwb2ludF9pZDsKKwl1aW50MTZfdCBtYXhfbXNnX2xlbjsKKwlXTUlfRVZUX0lEIGV2ZW50X2lkW1dNSV9VTklGSUVEX01BWF9FVkVOVF07CisJd21pX3VuaWZpZWRfZXZlbnRfaGFuZGxlciBldmVudF9oYW5kbGVyW1dNSV9VTklGSUVEX01BWF9FVkVOVF07CisJdWludDMyX3QgbWF4X2V2ZW50X2lkeDsKKwl2b2lkICpodGNfaGFuZGxlOworCWNkZl9zcGlubG9ja190IGV2ZW50cV9sb2NrOworCWNkZl9uYnVmX3F1ZXVlX3QgZXZlbnRfcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0IHJ4X2V2ZW50X3dvcms7CisjaWZkZWYgV0xBTl9PUEVOX1NPVVJDRQorCXN0cnVjdCBmd2RlYnVnIGRiZ2xvZzsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3BoeTsKKyNlbmRpZiAvKiBXTEFOX09QRU5fU09VUkNFICovCisKKyNpZmRlZiBXTUlfSU5URVJGQUNFX0VWRU5UX0xPR0dJTkcKKwljZGZfc3BpbmxvY2tfdCB3bWlfcmVjb3JkX2xvY2s7CisjZW5kaWYgLypXTUlfSU5URVJGQUNFX0VWRU5UX0xPR0dJTkcgKi8KKworCWNkZl9hdG9taWNfdCBpc190YXJnZXRfc3VzcGVuZGVkOworCWludCAoKndtYV9wcm9jZXNzX2Z3X2V2ZW50X2hhbmRsZXJfY2JrKShzdHJ1Y3Qgd21pX3VuaWZpZWQgKndtaV9oYW5kbGUsCisJCQkJCQl3bWlfYnVmX3QgZXZ0X2J1Zik7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3dtaS93bWlfdmVyc2lvbl93aGl0ZWxpc3QuYyBiL2NvcmUvd21pL3dtaV92ZXJzaW9uX3doaXRlbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYWQ3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dtaS93bWlfdmVyc2lvbl93aGl0ZWxpc3QuYwpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKgorICogRXZlcnkgUHJvZHVjdCBMaW5lIG9yIGNoaXBzZXQgb3IgdGVhbSBjYW4gaGF2ZSBpdHMgb3duIFdoaXRlbGlzdCB0YWJsZS4KKyAqIFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHZlcnNpb25zIHRoYXQgdGhlIHByZXNlbnQgc29mdHdhcmUgY2FuIHN1cHBvcnQKKyAqIGV2ZW4gdGhvdWdoIGl0cyB2ZXJzaW9ucyBhcmUgaW5jb21wYXRpYmxlLiBBbnkgZW50cnkgaGVyZSBtZWFucyB0aGF0IHRoZQorICogaW5kaWNhdGVkIHZlcnNpb24gZG9lcyBub3QgYnJlYWsgV01JIGNvbXBhdGliaWxpdHkgZXZlbiB0aG91Z2ggaXQgaGFzCisgKiBhIG1pbm9yIHZlcnNpb24gY2hhbmdlLgorICovCit3bWlfd2hpdGVsaXN0X3ZlcnNpb25faW5mbyB2ZXJzaW9uX3doaXRlbGlzdFtdID0geworCXswLCAwLCAweDVGNDE0MzUxLCAweDAwMDA0QzRELCAwLCAwfQorCSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFBsYWNlaG9sZGVyOiBNYWpvcj0wLCBNaW5vcj0wLCBOYW1lc3BhY2U9IlFDQV9NTCIgKER1bW15IGVudHJ5KSAqLworfTsKZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvYV9vc2FwaS5oIGIvdGFyZ2V0L2luYy9hX29zYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhYmVjMAotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9pbmMvYV9vc2FwaS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYmFzaWMgYXRoZXJvcyBkYXRhIHR5cGVzLiAqLworLyogSXQgaXMgdXNlZCB0byBtYXAgdGhlIGRhdGEgdHlwZXMgaW4gYXRoZXJvcyBmaWxlcyB0byBhIHBsYXRmb3JtIHNwZWNpZmljICovCisvKiB0eXBlLiAqLworLyogKi8KKy8qIEF1dGhvcihzKTogPSJBdGhlcm9zIiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjaWZuZGVmIF9BX09TQVBJX0hfCisjZGVmaW5lIF9BX09TQVBJX0hfCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgIWRlZmluZWQoTElOVVhfRU1VTEFUSU9OKQorI2luY2x1ZGUgIm9zYXBpX2xpbnV4LmgiCisjZW5kaWYKKworLyo9PT0gdGhlIGZvbGxvd2luZyBwcmltaXRpdmVzIGhhdmUgdGhlIHNhbWUgZGVmaW5pdGlvbiBmb3IgYWxsIHBsYXRmb3JtcyA9PT0qLworCisjZGVmaW5lIEFfQ09NUElMRV9USU1FX0FTU0VSVChhc3NlcnRpb25fbmFtZSwgcHJlZGljYXRlKSBcCisJdHlwZWRlZiBjaGFyIGFzc2VydGlvbl9uYW1lWyhwcmVkaWNhdGUpID8gMSA6IC0xXQorCisvKgorICogSWYgTiBpcyBhIHBvd2VyIG9mIDIsIHRoZW4gTiBhbmQgTi0xIGFyZSBvcnRob2dvbmFsCisgKiAoTi0xIGhhcyBhbGwgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdHMgc2V0IHdoaWNoIGFyZSB6ZXJvIGluIE4pCisgKiBzbyAgTiBeIChOLTEpID0gKE4gPDwgMSkgLSAxCisgKi8KKyNkZWZpbmUgQV9DT01QSUxFX1RJTUVfQVNTRVJUX0lTX1BXUjIoYXNzZXJ0aW9uX25hbWUsIHZhbHVlKSBcCisJQV9DT01QSUxFX1RJTUVfQVNTRVJUIChhc3NlcnRpb25fbmFtZSwJCQkgIFwKKwkJCSAgICAgICAoKCh2YWx1ZSkgXiAoKHZhbHVlKS0xKSkgPT0gKCh2YWx1ZSkgPDwgMSkgLSAxKSkKKworI2lmbmRlZiBfX3ViaWNvbTMyX18KKyNkZWZpbmUgSElGX01BTExPQ19ESUFHTUVNKG9zZGV2LCBzaXplLCBwYSwgY29udGV4dCwgcmV0cnkpIFwKKwlvc19tYWxsb2NfQ09OU0lTVEVOVChvc2Rldiwgc2l6ZSwgcGEsIGNvbnRleHQsIHJldHJ5KQorI2RlZmluZSBISUZfRlJFRV9ESUFHTUVNKG9zZGV2LCBzaXplLCB2YWRkciwgcGEsIGNvbnRleHQpIFwKKwlPU19GUkVFX0NPTlNJU1RFTlQob3NkZXYsIHNpemUsIHZhZGRyLCBwYSwgY29udGV4dCkKKyNkZWZpbmUgSElGX0RJQUdNRU1fU1lOQyhvc2RldiwgcGEsIHNpemUsIGRpciwgY29udGV4dCkKKyNlbHNlCisjZGVmaW5lIEhJRl9NQUxMT0NfRElBR01FTShvc2Rldiwgc2l6ZSwgcGEsIGNvbnRleHQsIHJldHJ5KSBcCisJb3NfbWFsbG9jX05PTkNPTlNJU1RFTlQob3NkZXYsIHNpemUsIHBhLCBjb250ZXh0LCByZXRyeSkKKyNkZWZpbmUgSElGX0ZSRUVfRElBR01FTShvc2Rldiwgc2l6ZSwgdmFkZHIsIHBhLCBjb250ZXh0KSBcCisJT1NfRlJFRV9OT05DT05TSVNURU5UKG9zZGV2LCBzaXplLCB2YWRkciwgcGEsIGNvbnRleHQpCisjZGVmaW5lIEhJRl9ESUFHTUVNX1NZTkMob3NkZXYsIHBhLCBzaXplLCBkaXIsIGNvbnRleHQpCVwKKwlPU19TWU5DX1NJTkdMRShvc2RldiwgcGEsIHNpemUsIGRpciwgY29udGV4dCkKKyNlbmRpZiAvKiB1Ymljb20zMiAqLworCisjZW5kaWYgLyogX09TQVBJX0hfICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL2FfdXNiX2RlZnMuaCBiL3RhcmdldC9pbmMvYV91c2JfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NjRhMGEKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL2FfdXNiX2RlZnMuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworLyoKKyAqICBTaGFyZWQgVVNCIGRlZmluaXRpb25zCisgKgorICoKKyAqCisgKgorICovCisKKyNpZm5kZWYgX19BX1VTQl9ERUZTX0hfXworI2RlZmluZSBfX0FfVVNCX0RFRlNfSF9fCisKKyNpZm5kZWYgQVRIX1RBUkdFVAorI2luY2x1ZGUgImF0aHN0YXJ0cGFjay5oIgorI2VuZGlmCisKKy8qIFVTQiBlbmRwb2ludCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIFVTQl9FUF9BRERSX0FQUF9DVFJMX0lOICAgICAgICAgIDB4ODEKKyNkZWZpbmUgVVNCX0VQX0FERFJfQVBQX0RBVEFfSU4gICAgICAgICAgMHg4MgorI2RlZmluZSBVU0JfRVBfQUREUl9BUFBfREFUQTJfSU4gICAgICAgICAweDgzCisjZGVmaW5lIFVTQl9FUF9BRERSX0FQUF9JTlRfSU4gICAgICAgICAgIDB4ODQKKworI2RlZmluZSBVU0JfRVBfQUREUl9BUFBfQ1RSTF9PVVQgICAgICAgICAweDAxCisjZGVmaW5lIFVTQl9FUF9BRERSX0FQUF9EQVRBX0xQX09VVCAgICAgIDB4MDIKKyNkZWZpbmUgVVNCX0VQX0FERFJfQVBQX0RBVEFfTVBfT1VUICAgICAgMHgwMworI2RlZmluZSBVU0JfRVBfQUREUl9BUFBfREFUQV9IUF9PVVQgICAgICAweDA0CisKKyNkZWZpbmUgVVNCX0NPTlRST0xfUkVRX1NFTkRfQk1JX0NNRCAgICAgICAgMQorI2RlZmluZSBVU0JfQ09OVFJPTF9SRVFfUkVDVl9CTUlfUkVTUCAgICAgICAyCisjZGVmaW5lIFVTQl9DT05UUk9MX1JFUV9ESUFHX0NNRCAgICAgICAgICAgIDMKKyNkZWZpbmUgVVNCX0NPTlRST0xfUkVRX0RJQUdfUkVTUCAgICAgICAgICAgNAorCisvKiAjZGVmaW5lIFVTQl9DT05UUk9MX01BWF9CTUlfVFJBTlNGRVJfU0laRSAgIDY0ICovCisjZGVmaW5lIFVTQl9DT05UUk9MX01BWF9CTUlfVFJBTlNGRVJfU0laRSAgIDI1MgorCisjZGVmaW5lIEhJRl9CTUlfTUFYX1RSQU5TRkVSX1NJWkUgICAgICAgICAgIFVTQl9DT05UUk9MX01BWF9CTUlfVFJBTlNGRVJfU0laRQorCisvKiA1MTIgQnl0ZXMgTWF4cCBmb3IgSGlnaCBTcGVlZCBmb3IgQlVMSyBFUCAqLworI2RlZmluZSBVU0JfSFNfQlVMS19NQVhQX1NJWkUgICAweDIwMAorLyogNjQgQnl0ZXMgTWF4cCBmb3IgRnVsbCBTcGVlZCBmb3IgQlVMSyBFUCAqLworI2RlZmluZSBVU0JfRlNfQlVMS19NQVhQX1NJWkUgICAweDQwCisKKy8qIGRpYWdub3N0aWMgY29tbWFuZCBkZWZuaXRpb25zICovCisjZGVmaW5lIFVTQl9DVFJMX0RJQUdfQ0NfUkVBRCAgICAgICAwCisjZGVmaW5lIFVTQl9DVFJMX0RJQUdfQ0NfV1JJVEUgICAgICAxCisjZGVmaW5lIFVTQl9DVFJMX0RJQUdfQ0NfV0FSTV9SRVNFVCAyCisKK3R5cGVkZWYgUFJFUEFDSyBzdHJ1Y3QgeworCUFfVUlOVDMyIENtZDsKKwlBX1VJTlQzMiBBZGRyZXNzOworCUFfVUlOVDMyIFZhbHVlOworCUFfVUlOVDMyIF9wYWRbMV07Cit9IFBPU1RQQUNLIFVTQl9DVFJMX0RJQUdfQ01EX1dSSVRFOworCit0eXBlZGVmIFBSRVBBQ0sgc3RydWN0IHsKKwlBX1VJTlQzMiBDbWQ7CisJQV9VSU5UMzIgQWRkcmVzczsKK30gUE9TVFBBQ0sgVVNCX0NUUkxfRElBR19DTURfUkVBRDsKKwordHlwZWRlZiBQUkVQQUNLIHN0cnVjdCB7CisJQV9VSU5UMzIgUmVhZFZhbHVlOworfSBQT1NUUEFDSyBVU0JfQ1RSTF9ESUFHX1JFU1BfUkVBRDsKKworI2RlZmluZSBVU0JfQ1RSTF9NQVhfRElBR19DTURfU0laRSAgKHNpemVvZihVU0JfQ1RSTF9ESUFHX0NNRF9XUklURSkpCisjZGVmaW5lIFVTQl9DVFJMX01BWF9ESUFHX1JFU1BfU0laRSAoc2l6ZW9mKFVTQl9DVFJMX0RJQUdfUkVTUF9SRUFEKSkKKworI2lmbmRlZiBBVEhfVEFSR0VUCisjaW5jbHVkZSAiYXRoZW5kcGFjay5oIgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy9hcGJfYXRocl93bGFuX21hcC5oIGIvdGFyZ2V0L2luYy9hcGJfYXRocl93bGFuX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDg1NDMKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL2FwYl9hdGhyX3dsYW5fbWFwLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQVBCX0FUSFJfV0xBTl9NQVBfSF8KKyNkZWZpbmUgX0FQQl9BVEhSX1dMQU5fTUFQX0hfCisKKyNkZWZpbmUgUlRDX1NPQ19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFJUQ19XTUFDX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwNTAwMAorI2RlZmluZSBNQUNfQ09FWF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDYwMDAKKyNkZWZpbmUgQlRfQ09FWF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAwMDA3MDAwCisjZGVmaW5lIFNPQ19QQ0lFX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBTT0NfQ09SRV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkwMDAKKyNkZWZpbmUgV0xBTl9VQVJUX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIFdMQU5fU0lfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBXTEFOX0dQSU9fQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MDAwMTQwMDAKKyNkZWZpbmUgV0xBTl9BTkFMT0dfSU5URl9CQVNFX0FERFJFU1MgICAgICAgICAgICAweDAwMDFjMDAwCisjZGVmaW5lIFdMQU5fTUFDX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBFRlVTRV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgRlBHQV9SRUdfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDM5MDAwCisjZGVmaW5lIFdMQU5fVUFSVDJfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDA1NGMwMAorI2RlZmluZSBDRV9XUkFQUEVSX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwNTcwMDAKKyNkZWZpbmUgQ0UwX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDU3NDAwCisjZGVmaW5lIENFMV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA1NzgwMAorI2RlZmluZSBDRTJfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNTdjMDAKKyNkZWZpbmUgQ0UzX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDU4MDAwCisjZGVmaW5lIENFNF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA1ODQwMAorI2RlZmluZSBDRTVfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNTg4MDAKKyNkZWZpbmUgQ0U2X0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDU4YzAwCisjZGVmaW5lIENFN19CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA1OTAwMAorI2RlZmluZSBEQklfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNjAwMDAKKyNkZWZpbmUgV0xBTl9NQk9YX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDY4MDAwCisjZGVmaW5lIFdMQU5fREJHX1VBUlRfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgMHgwMDA2OTAwMAorI2RlZmluZSBVU0JfRE1BX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwNmEwMDAKKworI2VuZGlmIC8qIF9BUEJfQVRIUl9XTEFOX01BUF9SRUdfSF8gKi8KZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvYXRoZGVmcy5oIGIvdGFyZ2V0L2luYy9hdGhkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlZTZjYgotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9pbmMvYXRoZGVmcy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQVRIREVGU19IX18KKyNkZWZpbmUgX19BVEhERUZTX0hfXworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIHRoYXQgbWF5IGJlIHVzZWQgYWNyb3NzIGJvdGgKKyAqIEhvc3QgYW5kIFRhcmdldCBzb2Z0d2FyZS4gIE5vdGhpbmcgaGVyZSBpcyBtb2R1bGUtZGVwZW5kZW50CisgKiBvciBwbGF0Zm9ybS1kZXBlbmRlbnQuCisgKi8KKworLyoKKyAqIEdlbmVyaWMgZXJyb3IgY29kZXMgdGhhdCBjYW4gYmUgdXNlZCBieSBodywgc3RhLCBhcCwgc2ltLCBkaworICogYW5kIGFueSBvdGhlciBlbnZpcm9ubWVudHMuIFNpbmNlIHRoZXNlIGFyZSBlbnVtcywgZmVlbCBmcmVlIHRvCisgKiBhZGQgYW55IG1vcmUgY29kZXMgdGhhdCB5b3UgbmVlZC4KKyAqLworCit0eXBlZGVmIGVudW0geworCUFfRVJST1IgPSAtMSwgICAgICAgICAgIC8qIEdlbmVyaWMgZXJyb3IgcmV0dXJuICovCisJQV9PSyA9IDAsICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLworCS8qIEZvbGxvd2luZyB2YWx1ZXMgc3RhcnQgYXQgMSAqLworCUFfREVWSUNFX05PVF9GT1VORCwgICAgIC8qIG5vdCBhYmxlIHRvIGZpbmQgUENJIGRldmljZSAqLworCUFfTk9fTUVNT1JZLCAgICAgICAgICAgIC8qIG5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSwgbm90IGF2YWlsYWJsZSAqLworCUFfTUVNT1JZX05PVF9BVkFJTCwgICAgIC8qIG1lbW9yeSByZWdpb24gaXMgbm90IGZyZWUgZm9yIG1hcHBpbmcgKi8KKwlBX05PX0ZSRUVfREVTQywgICAgICAgICAvKiBubyBmcmVlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSAqLworCUFfQkFEX0FERFJFU1MsICAgICAgICAgIC8qIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggZGVzY3JpcHRvciAqLworCUFfV0lOX0RSSVZFUl9FUlJPUiwgICAgIC8qIHVzZWQgaW4gTlRfSFcgdmVyc2lvbiwgaWYgcHJvYmxlbSBhdCBpbml0ICovCisJQV9SRUdTX05PVF9NQVBQRUQsICAgICAgLyogcmVnaXN0ZXJzIG5vdCBjb3JyZWN0bHkgbWFwcGVkICovCisJQV9FUEVSTSwgICAgICAgICAgICAgICAgLyogTm90IHN1cGVydXNlciAqLworCUFfRUFDQ0VTLCAgICAgICAgICAgICAgIC8qIEFjY2VzcyBkZW5pZWQgKi8KKwlBX0VOT0VOVCwgICAgICAgICAgICAgICAvKiBObyBzdWNoIGVudHJ5LCBzZWFyY2ggZmFpbGVkLCBldGMuICovCisJQV9FRVhJU1QsICAgICAgICAgICAgICAgLyogVGhlIG9iamVjdCBhbHJlYWR5IGV4aXN0cyAoY2FuJ3QgY3JlYXRlKSAqLworCUFfRUZBVUxULCAgICAgICAgICAgICAgIC8qIEJhZCBhZGRyZXNzIGZhdWx0ICovCisJQV9FQlVTWSwgICAgICAgICAgICAgICAgLyogT2JqZWN0IGlzIGJ1c3kgKi8KKwlBX0VJTlZBTCwgICAgICAgICAgICAgICAvKiBJbnZhbGlkIHBhcmFtZXRlciAqLworCUFfRU1TR1NJWkUsICAgICAgICAgICAgIC8qIEluYXBwcm9wcmlhdGUgbWVzc2FnZSBidWZmZXIgbGVuZ3RoICovCisJQV9FQ0FOQ0VMRUQsICAgICAgICAgICAgLyogT3BlcmF0aW9uIGNhbmNlbGVkICovCisJQV9FTk9UU1VQLCAgICAgICAgICAgICAgLyogT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgKi8KKwlBX0VDT01NLCAgICAgICAgICAgICAgICAvKiBDb21tdW5pY2F0aW9uIGVycm9yIG9uIHNlbmQgKi8KKwlBX0VQUk9UTywgICAgICAgICAgICAgICAvKiBQcm90b2NvbCBlcnJvciAqLworCUFfRU5PREVWLCAgICAgICAgICAgICAgIC8qIE5vIHN1Y2ggZGV2aWNlICovCisJQV9FREVWTk9UVVAsICAgICAgICAgICAgLyogZGV2aWNlIGlzIG5vdCBVUCAqLworCUFfTk9fUkVTT1VSQ0UsICAgICAgICAgIC8qIE5vIHJlc291cmNlcyBmb3IgcmVxdWVzdGVkIG9wZXJhdGlvbiAqLworCUFfSEFSRFdBUkUsICAgICAgICAgICAgIC8qIEhhcmR3YXJlIGZhaWx1cmUgKi8KKwlBX1BFTkRJTkcsICAgICAgICAgICAgICAvKiBBc3luY2hyb25vdXMgcm91dGluZTsgd2lsbCBzZW5kIHVwIHJlc3VsdHMgbGEKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXIgKHR5cGljYWxseSBpbiBjYWxsYmFjaykgKi8KKwlBX0VCQURDSEFOTkVMLCAgICAgICAgICAvKiBUaGUgY2hhbm5lbCBjYW5ub3QgYmUgdXNlZCAqLworCUFfREVDUllQVF9FUlJPUiwgICAgICAgIC8qIERlY3J5cHRpb24gZXJyb3IgKi8KKwlBX1BIWV9FUlJPUiwgICAgICAgICAgICAvKiBSWCBQSFkgZXJyb3IgKi8KKwlBX0NPTlNVTUVELCAgICAgICAgICAgICAvKiBPYmplY3Qgd2FzIGNvbnN1bWVkICovCisJQV9DTE9ORSwgICAgICAgICAgICAgICAgLyogVGhlIGJ1ZmZlciBpcyBjbG9uZWQgKi8KKwlBX1VTQl9FUlJPUiwgICAgICAgICAgICAvKiBSb21lIFVTQiBUYXJnZXQgZXJyb3IgKi8KK30gQV9TVEFUVVM7CisKKyNkZWZpbmUgQV9TVUNDRVNTKHgpICAgICAgICAoeCA9PSBBX09LKQorI2RlZmluZSBBX0ZBSUxFRCh4KSAgICAgICAgICghQV9TVUNDRVNTKHgpKQorCisjZW5kaWYgLyogX19BVEhERUZTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy9hdGhlbmRwYWNrLmggYi90YXJnZXQvaW5jL2F0aGVuZHBhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzc5MDllCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy9hdGhlbmRwYWNrLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmZGVmIFZYV09SS1MKKyNlbmRpZiAvKiBWWFdPUktTICovCisKKyNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKF9fbGludXhfXykKKyNlbmRpZiAvKiBMSU5VWCAqLworCisjaWZkZWYgUU5YCisjZW5kaWYgLyogUU5YICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL2Jpbl9zaWcuaCBiL3RhcmdldC9pbmMvYmluX3NpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MjNhY2MKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL2Jpbl9zaWcuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIEJJTl9TSUdOX0hfCisjZGVmaW5lIEJJTl9TSUdOX0hfCisKKyNkZWZpbmUgU0lHTl9IRUFERVJfTUFHSUMgMHg0NTRENEY1MgorCisvKiBTaWduZWQgYmluYXJ5IE1ldGFEYXRhICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1hZ2ljX251bTsKKwl1bnNpZ25lZCBpbnQgdG90YWxfbGVuOworCXVuc2lnbmVkIGludCByYW1wYXRjaF9sZW47CisJdW5zaWduZWQgaW50IHByb2R1Y3RfaWQ7CisJdW5zaWduZWQgaW50IHBhdGNoX3ZlcjsKKwl1bnNpZ25lZCBzaG9ydCBzaWduX2Zvcm1hdF92ZXI7CisJdW5zaWduZWQgc2hvcnQgc2lnbl9hbGdvcml0aG07CisJdW5zaWduZWQgY2hhciByZXNlcnZlZFs4XTsKK30gU0lHTl9IRUFERVJfVDsKKworI2VuZGlmIC8qICBCSU5fU0lHTl9IXyAqLwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy9ibWlfbXNnLmggYi90YXJnZXQvaW5jL2JtaV9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTk4MmNmCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy9ibWlfbXNnLmgKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19CTUlfTVNHX0hfXworI2RlZmluZSBfX0JNSV9NU0dfSF9fCisKKyNpZm5kZWYgQVRIX1RBUkdFVAorI2luY2x1ZGUgImF0aHN0YXJ0cGFjay5oIgorI2VuZGlmCisKKy8qCisgKiBCb290bG9hZGVyIE1lc3NhZ2luZyBJbnRlcmZhY2UgKEJNSSkKKyAqCisgKiBCTUkgaXMgYSB2ZXJ5IHNpbXBsZSBtZXNzYWdpbmcgaW50ZXJmYWNlIHVzZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uCisgKiB0byByZWFkIG1lbW9yeSwgd3JpdGUgbWVtb3J5LCBleGVjdXRlIGNvZGUsIGFuZCB0byBkZWZpbmUgYW4KKyAqIGFwcGxpY2F0aW9uIGVudHJ5IFBDLgorICoKKyAqIEl0IGlzIHVzZWQgdG8gZG93bmxvYWQgYW4gYXBwbGljYXRpb24gdG8gQVI2SywgdG8gcHJvdmlkZQorICogcGF0Y2hlcyB0byBjb2RlIHRoYXQgaXMgYWxyZWFkeSByZXNpZGVudCBvbiBBUjZLLCBhbmQgZ2VuZXJhbGx5CisgKiB0byBleGFtaW5lIGFuZCBtb2RpZnkgc3RhdGUuICBUaGUgSG9zdCBoYXMgYW4gb3Bwb3J0dW5pdHkgdG8gdXNlCisgKiBCTUkgb25seSBvbmNlIGR1cmluZyBib290dXAuICBPbmNlIHRoZSBIb3N0IGlzc3VlcyBhIEJNSV9ET05FCisgKiBjb21tYW5kLCB0aGlzIG9wcG9ydHVuaXR5IGVuZHMuCisgKgorICogVGhlIEhvc3Qgd3JpdGVzIEJNSSByZXF1ZXN0cyB0byBtYWlsYm94MCwgYW5kIHJlYWRzIEJNSSByZXNwb25zZXMKKyAqIGZyb20gbWFpbGJveDAuICAgQk1JIHJlcXVlc3RzIGFsbCBiZWdpbiB3aXRoIGEgY29tbWFuZAorICogKHNlZSBiZWxvdyBmb3Igc3BlY2lmaWMgY29tbWFuZHMpLCBhbmQgYXJlIGZvbGxvd2VkIGJ5CisgKiBjb21tYW5kLXNwZWNpZmljIGRhdGEuCisgKgorICogRmxvdyBjb250cm9sOgorICogVGhlIEhvc3QgY2FuIG9ubHkgaXNzdWUgYSBjb21tYW5kIG9uY2UgdGhlIFRhcmdldCBnaXZlcyBpdCBhCisgKiAiQk1JIENvbW1hbmQgQ3JlZGl0IiwgdXNpbmcgQVI2SyBDb3VudGVyICM0LiAgQXMgc29vbiBhcyB0aGUKKyAqIFRhcmdldCBoYXMgY29tcGxldGVkIGEgY29tbWFuZCwgaXQgaXNzdWVzIGFub3RoZXIgQk1JIENvbW1hbmQKKyAqIENyZWRpdCAoc28gdGhlIEhvc3QgY2FuIGlzc3VlIHRoZSBuZXh0IGNvbW1hbmQpLgorICoKKyAqIEJNSSBoYW5kbGVzIGFsbCByZXF1aXJlZCBUYXJnZXQtc2lkZSBjYWNoZSBmbHVzaGluZy4KKyAqLworCisvKiBNYXhpbXVtIGRhdGEgc2l6ZSB1c2VkIGZvciBCTUkgdHJhbnNmZXJzICovCisjZGVmaW5lIEJNSV9EQVRBU1pfTUFYICAgICAgICAgICAgICAgICAgICAgIDI1NgorCisvKiBCTUkgQ29tbWFuZHMgKi8KKworI2RlZmluZSBCTUlfTk9fQ09NTUFORCAgICAgICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgQk1JX0RPTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorLyoKKyAqIFNlbWFudGljczogSG9zdCBpcyBkb25lIHVzaW5nIEJNSQorICogUmVxdWVzdCBmb3JtYXQ6CisgKiAgICBBX1VJTlQzMiAgICAgIGNvbW1hbmQgKEJNSV9ET05FKQorICogUmVzcG9uc2UgZm9ybWF0OiBub25lCisgKi8KKworI2RlZmluZSBCTUlfUkVBRF9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAyCisvKgorICogU2VtYW50aWNzOiBIb3N0IHJlYWRzIEFSNksgbWVtb3J5CisgKiBSZXF1ZXN0IGZvcm1hdDoKKyAqICAgIEFfVUlOVDMyICAgICAgY29tbWFuZCAoQk1JX1JFQURfTUVNT1JZKQorICogICAgQV9VSU5UMzIgICAgICBhZGRyZXNzCisgKiAgICBBX1VJTlQzMiAgICAgIGxlbmd0aCwgYXQgbW9zdCBCTUlfREFUQVNaX01BWAorICogUmVzcG9uc2UgZm9ybWF0OgorICogICAgQV9VSU5UOCAgICAgICBkYXRhW2xlbmd0aF0KKyAqLworCisjZGVmaW5lIEJNSV9XUklURV9NRU1PUlkgICAgICAgICAgICAgICAgICAgIDMKKy8qCisgKiBTZW1hbnRpY3M6IEhvc3Qgd3JpdGVzIEFSNksgbWVtb3J5CisgKiBSZXF1ZXN0IGZvcm1hdDoKKyAqICAgIEFfVUlOVDMyICAgICAgY29tbWFuZCAoQk1JX1dSSVRFX01FTU9SWSkKKyAqICAgIEFfVUlOVDMyICAgICAgYWRkcmVzcworICogICAgQV9VSU5UMzIgICAgICBsZW5ndGgsIGF0IG1vc3QgQk1JX0RBVEFTWl9NQVgKKyAqICAgIEFfVUlOVDggICAgICAgZGF0YVtsZW5ndGhdCisgKiBSZXNwb25zZSBmb3JtYXQ6IG5vbmUKKyAqLworLyoKKyAqIENhcGJpbGl0eSB0byB3cml0ZSAic2VnbWVudGVkIGZpbGVzIiBpcyBwcm92aWRlZCBmb3IgdHdvIHJlYXNvbnMKKyAqIDEpIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBjZXJ0YWluIHNpdHVhdGlvbnMgd2hlcmUgSG9zdHMKKyAqICAgIGhhdmUgbGltaXRlZCBmbGV4aWJpbGl0eQorICogMikgYmVjYXVzZSBpdCdzIGRhcm4gY29udmVuaWVudC4KKyAqCisgKiBBIHNlZ21lbnRlZCBmaWxlIGNvbnNpc3RzIG9mIGEgZmlsZSBoZWFkZXIgZm9sbG93ZWQgYnkgYW4gYXJiaXRyYXJ5IG51bWJlcgorICogb2Ygc2VnbWVudHMuICBFYWNoIHNlZ21lbnQgY29udGFpbnMgc2VnbWVudCBtZXRhZGF0YSAtLSBhIFRhcmdldCBhZGRyZXNzIGFuZAorICogYSBsZW5ndGggLS0gZm9sbG93ZWQgYnkgImxlbmd0aCIgYnl0ZXMgb2YgZGF0YS4gQSBzZWdtZW50ZWQgZmlsZSBlbmRzIHdpdGgKKyAqIGEgc2VnbWVudCB0aGF0IHNwZWNpZmllcyBsZW5ndGg9Qk1JX1NHTVRGSUxFX0RPTkUuIFdoZW4gYSBzZWdtZW50ZWQgZmlsZQorICogaXMgc2VudCB0byB0aGUgVGFyZ2V0LCBmaXJtd2FyZSB3cml0ZXMgZWFjaCBzZWdtZW50IHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICogMSkgSWYgYSBzZWdtZW50J3MgbWV0YWRhdGEgaW5kaWNhdGVzIGxlbmd0aD1CTUlfU0dNVEZJTEVfRVhFQywgdGhlbiB0aGUKKyAqIHNwZWNpZmllZCBhZGRyZXNzIGlzIHVzZWQgYXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCBmb3IgYSBicmllZiBmdW5jdGlvbgorICogd2l0aCBwcm90b3R5cGUgIih2b2lkICopKHZvaWQpIi4gVGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkuCisgKiBBZnRlciBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlcywgZmlybXdhcmUgY29udGludWVzIHdpdGggdGhlCisgKiBuZXh0IHNlZ21lbnQuIE5vIGRhdGEgaXMgZXhwZWN0ZWQgd2hlbiBsZW5ndGg9Qk1JX1NHTVRGSUxFX0VYRUMuCisgKgorICogMikgSWYgYSBzZWdtZW50J3MgbWV0YWRhdGEgaW5kaWNhdGVzIGxlbmd0aD1CTUlfU0dNVEZJTEVfQkVHSU5BRERSLCB0aGVuCisgKiB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgaXMgZXN0YWJsaXNoZWQgYXMgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0IGFkZHJlc3MKKyAqIHNvIHRoYXQgYSBzdWJzZXF1ZW50IEJNSV9ET05FIGp1bXBzIHRoZXJlLgorICoKKyAqIDMpIElmIGEgc2VnbWVudCdzIG1ldGFkYXRhIGluZGljYXRlcyBsZW5ndGg9Qk1JX1NHTVRGSUxFX0JEREFUQSwgdGhlbgorICogdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHVzZWQgYXMgdGhlIChwb3NzaWJseSBjb21wcmVzc2VkKSBsZW5ndGggb2YgYm9hcmQKKyAqIGRhdGEsIHdoaWNoIGlzIGxvYWRlZCBpbnRvIHRoZSBwcm9wZXIgVGFyZ2V0IGFkZHJlc3MgYXMgc3BlY2lmaWVkIGJ5CisgKiBoaV9ib2FyZF9kYXRhLiBJbiBhZGRpdGlvbiwgdGhlIGhpX2JvYXJkX2RhdGFfaW5pdGlhbGl6ZWQgZmxhZyBpcyBzZXQuCisgKgorICogQSBzZWdtZW50ZWQgZmlsZSBpcyBzZW50IHRvIHRoZSBUYXJnZXQgdXNpbmcgYSBzZXF1ZW5jZSBvZiAxIG9yIG1vcmUKKyAqIEJNSV9XUklURV9NRU1PUlkgY29tbWFuZHMuICBUaGUgZmlyc3Qgc3VjaCBjb21tYW5kIG11c3QgaGF2ZQorICogYWRkcmVzcz1CTUlfU0VHTUVOVEVEX1dSSVRFX0FERFIuICBTdWJzZXF1ZW50IEJNSV9XUklURV9NRU1PUlkgY29tbWFuZHMKKyAqIGNhbiB1c2UgYW4gYXJiaXRyYXJ5IGFkZHJlc3MuICBJbiBlYWNoIEJNSV9XUklURV9NRU1PUlkgY29tbWFuZCwgdGhlCisgKiBsZW5ndGggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCAoZXhjZXB0IGZvciB0aGUKKyAqIHNwZWNpYWwgY2FzZXMgbGlzdGVkIGFib3ZlKS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCBhIHNlZ21lbnRlZCBmaWxlIG1heSBiZSBzZW50IHRvIHRoZSBUYXJnZXQgdXNpbmcgYQorICogQk1JX0xaX1NUUkVBTV9TVEFSVCBjb21tYW5kIHdpdGggYWRkcmVzcz1CTUlfU0VHTUVOVEVEX1dSSVRFX0FERFIKKyAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIEJNSV9MWl9EQVRBIGNvbW1hbmRzIHRoYXQgZWFjaCBzZW5kIHRoZSBuZXh0IHBvcnRpb24KKyAqIG9mIHRoZSBzZWdtZW50ZWQgZmlsZS4KKyAqCisgKiBUaGUgZGF0YSBzZWdtZW50cyBtYXkgYmUgbHo3NyBjb21wcmVzc2VkLiAgSW4gdGhpcyBjYXNlLCB0aGUgc2VnbWVudGVkIGZpbGUKKyAqIGhlYWRlciBmbGFnLCBCTUlfU0dNVEZJTEVfRkxBR19DT01QUkVTUywgbXVzdCBiZSBzZXQuICBOb3RlIHRoYXQgc2VnbWVudGVkCisgKiBmaWxlIE1FVEFkYXRhIGlzIG5ldmVyIGNvbXByZXNzZWQ7IG9ubHkgdGhlIGRhdGEgc2VnbWVudHMgdGhlbXNlbHZlcyBhcmUKKyAqIGNvbXByZXNzZWQuIFRoZXJlIGlzIG5vIHdheSB0byBtaXggY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIGRhdGEgc2VnbWVudHMKKyAqIGluIGEgc2luZ2xlIHNlZ21lbnRlZCBmaWxlLiBDb21wcmVzc2VkIChvciB1bmNvbXByZXNzZWQpIHNlZ21lbnRzIGFyZSBoYW5kbGVkCisgKiBieSBib3RoIEJNSV9XUklURV9NRU1PUlkgYW5kIGJ5IEJNSV9MWl9EQVRBIGNvbW1hbmRzLiAgKENvbXByZXNzaW9uIGlzIGFuCisgKiBhdHRyaWJ1dGUgb2YgdGhlIHNlZ21lbnRlZCBmaWxlIHJhdGhlciB0aGFuIG9mIHRoZSBjb21tYW5kIHVzZWQgdG8gdHJhbnNtaXQKKyAqIGl0LikKKyAqLworI2RlZmluZSBCTUlfU0VHTUVOVEVEX1dSSVRFX0FERFIgMHgxMjM0CisKKy8qIEZpbGUgaGVhZGVyIGZvciBhIHNlZ21lbnRlZCBmaWxlICovCitzdHJ1Y3QgYm1pX3NlZ21lbnRlZF9maWxlX2hlYWRlciB7CisJQV9VSU5UMzIgbWFnaWNfbnVtOworCUFfVUlOVDMyIGZpbGVfZmxhZ3M7Cit9OworI2RlZmluZSBCTUlfU0dNVEZJTEVfTUFHSUNfTlVNICAgICAgICAgIDB4NTQ0ZDQ3NTMgICAgICAvKiAiU0dNVCIgKi8KKyNkZWZpbmUgQk1JX1NHTVRGSUxFX0ZMQUdfQ09NUFJFU1MgICAgICAxCisKKy8qIE1ldGFkYXRhIGZvciBhIHNlZ21lbnRlZCBmaWxlIHNlZ21lbnQgKi8KK3N0cnVjdCBibWlfc2VnbWVudGVkX21ldGFkYXRhIHsKKwlBX1VJTlQzMiBhZGRyOworCUFfVUlOVDMyIGxlbmd0aDsKK307CisvKiBTcGVjaWFsIHZhbHVlcyBmb3IgYm1pX3NlZ21lbnRlZF9tZXRhZGF0YS5sZW5ndGggKGFsbCBoYXZlIGhpZ2ggYml0IHNldCkgKi8KKyNkZWZpbmUgQk1JX1NHTVRGSUxFX0RPTkUgICAgICAgICAgICAgICAweGZmZmZmZmZmICAgICAgLyogZW5kIG9mIHNlZ21lbnRlZCBkYXRhICovCisjZGVmaW5lIEJNSV9TR01URklMRV9CRERBVEEgICAgICAgICAgICAgMHhmZmZmZmZmZSAgICAgIC8qIEJvYXJkIERhdGEgc2VnbWVudCAqLworI2RlZmluZSBCTUlfU0dNVEZJTEVfQkVHSU5BRERSICAgICAgICAgIDB4ZmZmZmZmZmQgICAgICAvKiBzZXQgYmVnaW5uaW5nIGFkZHJlc3MgKi8KKyNkZWZpbmUgQk1JX1NHTVRGSUxFX0VYRUMgICAgICAgICAgICAgICAweGZmZmZmZmZjICAgICAgLyogaW1tZWRpYXRlIGZ1bmN0aW9uIGV4ZWN1dGlvbiAqLworCisjZGVmaW5lIEJNSV9FWEVDVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDQKKy8qCisgKiBTZW1hbnRpY3M6IENhdXNlcyBBUjZLIHRvIGV4ZWN1dGUgY29kZQorICogUmVxdWVzdCBmb3JtYXQ6CisgKiAgICBBX1VJTlQzMiAgICAgIGNvbW1hbmQgKEJNSV9FWEVDVVRFKQorICogICAgQV9VSU5UMzIgICAgICBhZGRyZXNzCisgKiAgICBBX1VJTlQzMiAgICAgIHBhcmFtZXRlcgorICogUmVzcG9uc2UgZm9ybWF0OgorICogICAgQV9VSU5UMzIgICAgICByZXR1cm4gdmFsdWUKKyAqLworLyoKKyAqIE5vdGU6IEluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHNlZ21lbnRlZCBmaWxlIGZlYXR1cmUKKyAqIChzZWUgQk1JX1dSSVRFX01FTU9SWSksIHdoZW4gdGhlIGFkZHJlc3Mgc3BlY2lmaWVkIGluIGEKKyAqIEJNSV9FWEVDVVRFIGNvbW1hbmQgbWF0Y2hlcyAoc2FtZSBwaHlzaWNhbCBhZGRyZXNzKQorICogQk1JX1NFR01FTlRFRF9XUklURV9BRERSLCBpdCBpcyBpZ25vcmVkLiBJbnN0ZWFkLCBleGVjdXRpb24KKyAqIGJlZ2lucyBhdCB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgYnkgaGlfYXBwX3N0YXJ0LgorICovCisKKyNkZWZpbmUgQk1JX1NFVF9BUFBfU1RBUlQgICAgICAgICAgICAgICAgICAgNQorLyoKKyAqIFNlbWFudGljczogU2V0IFRhcmdldCBhcHBsaWNhdGlvbiBzdGFydGluZyBhZGRyZXNzCisgKiBSZXF1ZXN0IGZvcm1hdDoKKyAqICAgIEFfVUlOVDMyICAgICAgY29tbWFuZCAoQk1JX1NFVF9BUFBfU1RBUlQpCisgKiAgICBBX1VJTlQzMiAgICAgIGFkZHJlc3MKKyAqIFJlc3BvbnNlIGZvcm1hdDogbm9uZQorICovCisKKyNkZWZpbmUgQk1JX1JFQURfU09DX1JFR0lTVEVSICAgICAgICAgICAgICAgNgorI2RlZmluZSBCTUlfUkVBRF9TT0NfV09SRCAgICAgICAgICAgICAgICAgICA2CisvKgorICogU2VtYW50aWNzOiBSZWFkIGEgMzItYml0IFRhcmdldCBTT0Mgd29yZC4KKyAqIFJlcXVlc3QgZm9ybWF0OgorICogICAgQV9VSU5UMzIgICAgICBjb21tYW5kIChCTUlfUkVBRF9SRUdJU1RFUikKKyAqICAgIEFfVUlOVDMyICAgICAgYWRkcmVzcworICogUmVzcG9uc2UgZm9ybWF0OgorICogICAgQV9VSU5UMzIgICAgICB2YWx1ZQorICovCisKKyNkZWZpbmUgQk1JX1dSSVRFX1NPQ19SRUdJU1RFUiAgICAgICAgICAgICAgNworI2RlZmluZSBCTUlfV1JJVEVfU09DX1dPUkQgICAgICAgICAgICAgICAgICA3CisvKgorICogU2VtYW50aWNzOiBXcml0ZSBhIDMyLWJpdCBUYXJnZXQgU09DIHdvcmQuCisgKiBSZXF1ZXN0IGZvcm1hdDoKKyAqICAgIEFfVUlOVDMyICAgICAgY29tbWFuZCAoQk1JX1dSSVRFX1JFR0lTVEVSKQorICogICAgQV9VSU5UMzIgICAgICBhZGRyZXNzCisgKiAgICBBX1VJTlQzMiAgICAgIHZhbHVlCisgKgorICogUmVzcG9uc2UgZm9ybWF0OiBub25lCisgKi8KKworI2RlZmluZSBCTUlfR0VUX1RBUkdFVF9JRCAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQk1JX0dFVF9UQVJHRVRfSU5GTyAgICAgICAgICAgICAgICA4CisvKgorICogU2VtYW50aWNzOiBGZXRjaCB0aGUgNC1ieXRlIFRhcmdldCBpbmZvcm1hdGlvbgorICogUmVxdWVzdCBmb3JtYXQ6CisgKiAgICBBX1VJTlQzMiAgICAgIGNvbW1hbmQgKEJNSV9HRVRfVEFSR0VUX0lEL0lORk8pCisgKgorICogUmVzcG9uc2UgZm9ybWF0MSAob2xkIGZpcm13YXJlKToKKyAqICAgIEFfVUlOVDMyICAgICAgVGFyZ2V0VmVyc2lvbklECisgKgorICogUmVzcG9uc2UgZm9ybWF0MiAoaW50ZXJtZWRpYXRlIGZpcm13YXJlLCBkdXJpbmcgdHJhbnNpdGlvbik6CisgKiAgICBBX1VJTlQzMiAgICAgIFRBUkdFVF9WRVJTSU9OX1NFTlRJTkFMCisgKiAgICBzdHJ1Y3QgYm1pX3RhcmdldF9pbmZvOworICoKKyAqIFJlc3BvbnNlIGZvcm1hdDMgKG5ld2VzdCBmaXJtd2FyZSkKKyAqICAgIHN0cnVjdCBibWlfdGFyZ2V0X2luZm87CisgKi8KKyNpZmRlZiBGRUFUVVJFX0JNSV8yCitQUkVQQUNLIHN0cnVjdCBibWlfdGFyZ2V0X2luZm8geworCS8qIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlBX1VJTlQzMiB0YXJnZXRfaW5mb19ieXRlX2NvdW50OworCUFfVUlOVDMyIHRhcmdldF92ZXI7CisJQV9VSU5UMzIgdGFyZ2V0X3R5cGU7CisJQV9VSU5UMzIgZmxhZ3M7Cit9IFBPU1RQQUNLOworI2Vsc2UKK1BSRVBBQ0sgc3RydWN0IGJtaV90YXJnZXRfaW5mbyB7CisJLyogc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSAqLworCUFfVUlOVDMyIHRhcmdldF9pbmZvX2J5dGVfY291bnQ7CisJQV9VSU5UMzIgdGFyZ2V0X3ZlcjsKKwlBX1VJTlQzMiB0YXJnZXRfdHlwZTsKK30gUE9TVFBBQ0s7CisjZW5kaWYKKyNkZWZpbmUgVEFSR0VUX1ZFUlNJT05fU0VOVElOQUwgMHhmZmZmZmZmZgorI2RlZmluZSBCTUlfUk9NUEFUQ0hfSU5TVEFMTCAgICAgICAgICAgICAgIDkKKy8qCisgKiBTZW1hbnRpY3M6IEluc3RhbGwgYSBST00gUGF0Y2guCisgKiBSZXF1ZXN0IGZvcm1hdDoKKyAqICAgIEFfVUlOVDMyICAgICAgY29tbWFuZCAoQk1JX1JPTVBBVENIX0lOU1RBTEwpCisgKiAgICBBX1VJTlQzMiAgICAgIFRhcmdldCBST00gQWRkcmVzcworICogICAgQV9VSU5UMzIgICAgICBUYXJnZXQgUkFNIEFkZHJlc3Mgb3IgVmFsdWUgKGRlcGVuZGluZyBvbiBUYXJnZXQgVHlwZSkKKyAqICAgIEFfVUlOVDMyICAgICAgU2l6ZSwgaW4gYnl0ZXMKKyAqICAgIEFfVUlOVDMyICAgICAgQWN0aXZhdGU/IDEtLT5hY3RpdmF0ZTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAtLT5pbnN0YWxsIGJ1dCBkbyBub3QgYWN0aXZhdGUKKyAqIFJlc3BvbnNlIGZvcm1hdDoKKyAqICAgIEFfVUlOVDMyICAgICAgUGF0Y2hJRAorICovCisKKyNkZWZpbmUgQk1JX1JPTVBBVENIX1VOSU5TVEFMTCAgICAgICAgICAgICAxMAorLyoKKyAqIFNlbWFudGljczogVW5pbnN0YWxsIGEgcHJldmlvdXNseS1pbnN0YWxsZWQgUk9NIFBhdGNoLAorICogYXV0b21hdGljYWxseSBkZWFjdGl2YXRpbmcsIGlmIG5lY2Vzc2FyeS4KKyAqIFJlcXVlc3QgZm9ybWF0OgorICogICAgQV9VSU5UMzIgICAgICBjb21tYW5kIChCTUlfUk9NUEFUQ0hfVU5JTlNUQUxMKQorICogICAgQV9VSU5UMzIgICAgICBQYXRjaElECisgKgorICogUmVzcG9uc2UgZm9ybWF0OiBub25lCisgKi8KKworI2RlZmluZSBCTUlfUk9NUEFUQ0hfQUNUSVZBVEUgICAgICAgICAgICAgIDExCisvKgorICogU2VtYW50aWNzOiBBY3RpdmF0ZSBhIGxpc3Qgb2YgcHJldmlvdXNseS1pbnN0YWxsZWQgUk9NIFBhdGNoZXMuCisgKiBSZXF1ZXN0IGZvcm1hdDoKKyAqICAgIEFfVUlOVDMyICAgICAgY29tbWFuZCAoQk1JX1JPTVBBVENIX0FDVElWQVRFKQorICogICAgQV9VSU5UMzIgICAgICByb21wYXRjaF9jb3VudAorICogICAgQV9VSU5UMzIgICAgICBQYXRjaElEW3JvbXBhdGNoX2NvdW50XQorICoKKyAqIFJlc3BvbnNlIGZvcm1hdDogbm9uZQorICovCisKKyNkZWZpbmUgQk1JX1JPTVBBVENIX0RFQUNUSVZBVEUgICAgICAgICAgICAxMgorLyoKKyAqIFNlbWFudGljczogRGVhY3RpdmF0ZSBhIGxpc3Qgb2YgYWN0aXZlIFJPTSBQYXRjaGVzLgorICogUmVxdWVzdCBmb3JtYXQ6CisgKiAgICBBX1VJTlQzMiAgICAgIGNvbW1hbmQgKEJNSV9ST01QQVRDSF9ERUFDVElWQVRFKQorICogICAgQV9VSU5UMzIgICAgICByb21wYXRjaF9jb3VudAorICogICAgQV9VSU5UMzIgICAgICBQYXRjaElEW3JvbXBhdGNoX2NvdW50XQorICoKKyAqIFJlc3BvbnNlIGZvcm1hdDogbm9uZQorICovCisKKyNkZWZpbmUgQk1JX0xaX1NUUkVBTV9TVEFSVCAgICAgICAgICAgICAgICAxMworLyoKKyAqIFNlbWFudGljczogQmVnaW4gYW4gTFotY29tcHJlc3NlZCBzdHJlYW0gb2YgaW5wdXQKKyAqIHdoaWNoIGlzIHRvIGJlIHVuY29tcHJlc3NlZCBieSB0aGUgVGFyZ2V0IHRvIGFuCisgKiBvdXRwdXQgYnVmZmVyIGF0IGFkZHJlc3MuICBUaGUgb3V0cHV0IGJ1ZmZlciBtdXN0CisgKiBiZSBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gaG9sZCB0aGUgdW5jb21wcmVzc2VkCisgKiBvdXRwdXQgZnJvbSB0aGUgY29tcHJlc3NlZCBpbnB1dCBzdHJlYW0uICBUaGlzIEJNSQorICogY29tbWFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgMSBvciBtb3JlCisgKiBCTUlfTFpfREFUQSBjb21tYW5kcy4KKyAqICAgIEFfVUlOVDMyICAgICAgY29tbWFuZCAoQk1JX0xaX1NUUkVBTV9TVEFSVCkKKyAqICAgIEFfVUlOVDMyICAgICAgYWRkcmVzcworICogTm90ZTogTm90IHN1cHBvcnRlZCBvbiBhbGwgdmVyc2lvbnMgb2YgUk9NIGZpcm13YXJlLgorICovCisKKyNkZWZpbmUgQk1JX0xaX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAxNAorLyoKKyAqIFNlbWFudGljczogSG9zdCB3cml0ZXMgQVI2SyBtZW1vcnkgd2l0aCBMWi1jb21wcmVzc2VkCisgKiBkYXRhIHdoaWNoIGlzIHVuY29tcHJlc3NlZCBieSB0aGUgVGFyZ2V0LiAgVGhpcyBjb21tYW5kCisgKiBtdXN0IGJlIHByZWNlZGVkIGJ5IGEgQk1JX0xaX1NUUkVBTV9TVEFSVCBjb21tYW5kLiBBIHNlcmllcworICogb2YgQk1JX0xaX0RBVEEgY29tbWFuZHMgYXJlIGNvbnNpZGVyZWQgcGFydCBvZiBhIHNpbmdsZQorICogaW5wdXQgc3RyZWFtIHVudGlsIGFub3RoZXIgQk1JX0xaX1NUUkVBTV9TVEFSVCBpcyBpc3N1ZWQuCisgKiBSZXF1ZXN0IGZvcm1hdDoKKyAqICAgIEFfVUlOVDMyICAgICAgY29tbWFuZCAoQk1JX0xaX0RBVEEpCisgKiAgICBBX1VJTlQzMiAgICAgIGxlbmd0aCAob2YgY29tcHJlc3NlZCBkYXRhKSwKKyAqICAgICAgICAgICAgICAgICAgYXQgbW9zdCBCTUlfREFUQVNaX01BWAorICogICAgQV9VSU5UOCAgICAgICBDb21wcmVzc2VkRGF0YVtsZW5ndGhdCisgKiBSZXNwb25zZSBmb3JtYXQ6IG5vbmUKKyAqIE5vdGU6IE5vdCBzdXBwb3J0ZWQgb24gYWxsIHZlcnNpb25zIG9mIFJPTSBmaXJtd2FyZS4KKyAqLworCisjZGVmaW5lIEJNSV9OVlJBTV9QUk9DRVNTICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQk1JX05WUkFNX1NFR19OQU1FX1NaIDE2CisvKgorICogU2VtYW50aWNzOiBDYXVzZSBUYXJnZXQgdG8gc2VhcmNoIE5WUkFNIChpZiBhbnkpIGZvciBhCisgKiBzZWdtZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBwcm9jZXNzIGl0IGFjY29yZGluZworICogdG8gTlZSQU0gbWV0YWRhdGEuCisgKiBSZXF1ZXN0IGZvcm1hdDoKKyAqICAgIEFfVUlOVDMyICAgICAgY29tbWFuZCAoQk1JX05WUkFNX1BST0NFU1MpCisgKiAgICBBX1VDSEFSICAgICAgIG5hbWVbQk1JX05WUkFNX1NFR19OQU1FX1NaXSBuYW1lIChMRSBmb3JtYXQpCisgKiBSZXNwb25zZSBmb3JtYXQ6CisgKiAgICBBX1VJTlQzMiAgICAgIDAsIGlmIG5vdGhpbmcgd2FzIGV4ZWN1dGVkOworICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICAgIGxhc3QgTlZSQU0gc2VnbWVudCB0aGF0IHdhcyBleGVjdXRlZAorICovCisKKyNkZWZpbmUgQk1JX1NJR05fU1RSRUFNX1NUQVJUICAgICAgICAgICAgICAgMTcKKy8qCisgKiBTZW1hbnRpY3M6IFRyaWdnZXIgdGFyZ2V0IHN0YXJ0L2VuZCBiaW5hcnkgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbgorICogZmxvdy4KKyAqIFJlcXVlc3QgZm9ybWF0OgorICogICAgQV9VSU5UMzIgICAgICBjb21tYW5kIChCTUlfU0lHTl9TVFJFQU1fU1RBUlQpCisgKiAgICBBX1VJTlQzMiAgICAgIGFkZHJlc3MKKyAqICAgIEFfVUlOVDMyICAgICAgbGVuZ3RoLCBhdCBtb3N0IEJNSV9EQVRBU1pfTUFYCisgKiAgICBBX1VJTlQ4ICAgICAgIGRhdGFbbGVuZ3RoXQorICogUmVzcG9uc2UgZm9ybWF0OiBub25lCisgKi8KKworI2lmbmRlZiBBVEhfVEFSR0VUCisjaW5jbHVkZSAiYXRoZW5kcGFjay5oIgorI2VuZGlmCisKKy8qIFRCRFhYWDogTmVlZCBhIGJldHRlciBwbGFjZSBmb3IgdGhlc2UgKi8KKyNkZWZpbmUgQk1JX0NFX05VTV9UT19UQVJHIDAKKyNkZWZpbmUgQk1JX0NFX05VTV9UT19IT1NUIDEKKworI2VuZGlmIC8qIF9fQk1JX01TR19IX18gKi8KZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvY2VwY2kuaCBiL3RhcmdldC9pbmMvY2VwY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2ViYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy9jZXBjaS5oCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQ0VQQ0lfSF9fCisjZGVmaW5lIF9fQ0VQQ0lfSF9fCisKKy8qCisgKiBTdXBwb3J0IGZvciBDb3B5IEVuZ2luZSBvdmVyIFBDSS4KKyAqIFN0cnVjdHVyZXMgc2hhcmVkIGJldHdlZW4gSG9zdCBzb2Z0d2FyZSBhbmQgVGFyZ2V0IGZpcm13YXJlLgorICovCisKKy8qCisgKiBUb3RhbCBudW1iZXIgb2YgUENJZSBNU0kgaW50ZXJydXB0cyByZXF1ZXN0ZWQgZm9yIGFsbCBpbnRlcnJ1cHQgc291cmNlcy4KKyAqIFBDSWUgc3RhbmRhcmQgZm9yY2VzIHRoaXMgdG8gYmUgYSBwb3dlciBvZiAyLgorICogU29tZSBIb3N0IE9TJ3MgbGltaXQgTVNJIHJlcXVlc3RzIHRoYXQgY2FuIGJlIGdyYW50ZWQgdG8gOAorICogc28gZm9yIG5vdyB3ZSBhYmlkZSBieSB0aGlzIGxpbWl0IGFuZCBhdm9pZCByZXF1ZXN0aW5nIG1vcmUKKyAqIHRoYW4gdGhhdC4KKyAqLworI2RlZmluZSBNU0lfTlVNX1JFUVVFU1RfTE9HMiAgNAorI2RlZmluZSBNU0lfTlVNX1JFUVVFU1QgICAgICAgMSAvKiAoMTw8TVNJX05VTV9SRVFVRVNUX0xPRzIpICovCisKKy8qCisgKiBHcmFudGVkIE1TSXMgYXJlIGFzc2lnbmVkIGFzIGZvbGxvd3M6CisgKiAgRmlybXdhcmUgdXNlcyB0aGUgZmlyc3QKKyAqICBSZW1haW5pbmcgTVNJcywgaWYgYW55LCBhcmUgdXNlZCBieSBDb3B5IEVuZ2luZXMKKyAqIFRoaXMgbWFwcGluZyBpcyBrbm93biB0byBib3RoIFRhcmdldCBmaXJtd2FyZSBhbmQgSG9zdCBzb2Z0d2FyZS4KKyAqIEl0IG1heSBiZSBjaGFuZ2VkIGFzIGxvbmcgYXMgSG9zdCBhbmQgVGFyZ2V0IGFyZSBrZXB0IGluIHN5bmMuCisgKi8KKyNkZWZpbmUgTVNJX0FTU0lHTl9GVyAgICAgICAgIDAgLyogMSBNU0kgZm9yIGZpcm13YXJlIChlcnJvcnMsIGV0Yy4pICovCisjZGVmaW5lIE1TSV9BU1NJR05fQ0VfSU5JVElBTCAxIC8qIDcgTVNJcyBmb3IgQ29weSBFbmdpbmVzICovCisjZGVmaW5lIE1TSV9BU1NJR05fQ0VfTUFYICAgICA3CisKKy8qCisgKiBQQ0ktc3BlY2lmaWMgVGFyZ2V0IHN0YXRlLiAgTXVjaCBvZiB0aGlzIG1heSBiZSBvZiBpbnRlcmVzdAorICogdG8gdGhlIEhvc3Qgc28gSE9TVF9JTlRFUkVTVC0+aGlfaW50ZXJjb25uZWN0X3N0YXRlIHBvaW50cworICogaGVyZSAoYW5kIGFsbCBtZW1iZXJzIGFyZSAzMi1iaXQgcXVhbnRpdGllcyBpbiBvcmRlciB0bworICogZmFjaWxpdGF0ZSBIb3N0IGFjY2VzcykuIEluIHBhcnRpY3VsYXIsIEhvc3Qgc29mdHdhcmUgaXMKKyAqIHJlcXVpcmVkIHRvIGluaXRpYWxpemUgcGlwZV9jZmdfYWRkciBhbmQgc3ZjX3RvX3BpcGVfbWFwLgorICovCitzdHJ1Y3QgcGNpZV9zdGF0ZV9zIHsKKwlBX1VJTlQzMiBwaXBlX2NmZ19hZGRyOyAvKiBQaXBlIGNvbmZpZ3VyYXRpb24gVGFyZ2V0IGFkZHJlc3MgKi8KKwkvKiBOQjogQ0VfcGlwZV9jb25maWdbQ0VfQ09VTlRdICovCisKKwlBX1VJTlQzMiBzdmNfdG9fcGlwZV9tYXA7ICAgICAgIC8qIFNlcnZpY2UgdG8gcGlwZSBtYXAgVGFyZ2V0IGFkZHJlc3MgKi8KKwkvKiBOQjogc2VydmljZV90b19waXBlW1BJUEVfVE9fQ0VfTUFQX0NOXSAqLworCisJQV9VSU5UMzIgTVNJX3JlcXVlc3RlZDsgLyogbnVtYmVyIG9mIE1TSSBpbnRlcnJ1cHRzIHJlcXVlc3RlZCAqLworCUFfVUlOVDMyIE1TSV9ncmFudGVkOyAgIC8qIG51bWJlciBvZiBNU0kgaW50ZXJydXB0cyBncmFudGVkICovCisJQV9VSU5UMzIgTVNJX2FkZHI7ICAgICAgLyogTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0IGFkZHJlc3MgKi8KKwlBX1VJTlQzMiBNU0lfZGF0YTsgICAgICAvKiBCYXNlIGRhdGEgKi8KKwlBX1VJTlQzMiBNU0lfZndfaW50cl9kYXRhOyAgICAgIC8qIERhdGEgZm9yIGZpcm13YXJlIGludGVycnVwdDsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TSSBkYXRhIGZvciBvdGhlciBpbnRlcnJ1cHRzIGFyZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdmFyaW91cyBTb0MgcmVnaXN0ZXJzICovCisKKwlBX1VJTlQzMiBwb3dlcl9tZ210X21ldGhvZDsgICAgIC8qIFBDSUVfUFdSX01FVEhPRF8qICovCisJQV9VSU5UMzIgY29uZmlnX2ZsYWdzOyAgLyogUENJRV9DT05GSUdfRkxBR18qICovCit9OworCisvKgorICogUENJRV9DT05GSUdfRkxBRyBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFBDSUVfQ09ORklHX0ZMQUdfRU5BQkxFX0wxICAgICAgICAgIDB4MDAwMDAwMQorI2RlZmluZSBQQ0lFX0NPTkZJR19GTEFHX0NMS19TV0lUQ0hfV0FJVCAgICAweDAwMDAwMDIKKyNkZWZpbmUgUENJRV9DT05GSUdfRkxBR19BWElfQ0xLX0dBVEUgICAgICAgMHgwMDAwMDA0CisKKyNkZWZpbmUgUElQRV9UT19DRV9NQVBfQ05UIDMyICAgLyogc2ltcGxlIGltcGxlbWVudGF0aW9uIGNvbnN0YW50ICovCisKKy8qCisgKiBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIENvcHkgRW5naW5lIHBpcGUuCisgKiBQYXNzZWQgZnJvbSBIb3N0IHRvIFRhcmdldCBkdXJpbmcgc3RhcnR1cCAob25lIHBlciBDRSkuCisgKi8KK3N0cnVjdCBDRV9waXBlX2NvbmZpZyB7CisJQV9VSU5UMzIgcGlwZW51bTsKKwlBX1VJTlQzMiBwaXBlZGlyOworCUFfVUlOVDMyIG5lbnRyaWVzOworCUFfVUlOVDMyIG5ieXRlc19tYXg7CisJQV9VSU5UMzIgZmxhZ3M7CisJQV9VSU5UMzIgcmVzZXJ2ZWQ7Cit9OworCisvKgorICogSElBIE1hcCBEZWZpbml0aW9uCisgKi8KK3N0cnVjdCBob3N0X2ludGVyZXN0X2FyZWFfdCB7CisJdWludDMyX3QgaGlfaW50ZXJjb25uZWN0X3N0YXRlOworCXVpbnQzMl90IGhpX2Vhcmx5X2FsbG9jOworCXVpbnQzMl90IGhpX29wdGlvbl9mbGFnMjsKKwl1aW50MzJfdCBoaV9ib2FyZF9kYXRhOworCXVpbnQzMl90IGhpX2JvYXJkX2RhdGFfaW5pdGlhbGl6ZWQ7CisJdWludDMyX3QgaGlfZmFpbHVyZV9zdGF0ZTsKKwl1aW50MzJfdCBoaV9yZGRpX21zaV9udW07CisJdWludDMyX3QgaGlfcGNpZV9wZXJzdF9jb3VwbGVfZW47CisJdWludDMyX3QgaGlfc3dfcHJvdG9jb2xfdmVyc2lvbjsKK307CisKK3N0cnVjdCBzaGFkb3dfcmVnX2NmZyB7CisJQV9VSU5UMTYgY2VfaWQ7CisJQV9VSU5UMTYgcmVnX29mZnNldDsKK307CisKKyNlbmRpZiAvKiBfX0NFUENJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy9kYmdsb2cuaCBiL3RhcmdldC9pbmMvZGJnbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjZjE1NAotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9pbmMvZGJnbG9nLmgKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9EQkdMT0dfSF8KKyNkZWZpbmUgX0RCR0xPR19IXworCisjaWZuZGVmIEFUSF9UQVJHRVQKKyNpbmNsdWRlICJhdGhzdGFydHBhY2suaCIKKyNlbmRpZgorCisjaW5jbHVkZSAid2xhbl9tb2R1bGVfaWRzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKyNkZWZpbmUgREJHTE9HX1RJTUVTVEFNUF9PRkZTRVQgICAgICAgICAgMAorI2RlZmluZSBEQkdMT0dfVElNRVNUQU1QX01BU0sgICAgICAgICAgICAweEZGRkZGRkZGICAgICAvKiBCaXQgMC0xNS4gQ29udGFpbnMgYml0CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC0yMyBvZiB0aGUgTEYwIHRpbWVyICovCisjZGVmaW5lIERCR0xPR19EQkdJRF9PRkZTRVQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREJHTE9HX0RCR0lEX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDNGRiAgICAgLyogQml0IDAtOSAqLworI2RlZmluZSBEQkdMT0dfREJHSURfTlVNX01BWCAgICAgICAgICAgICAyNTYgICAgLyogVXBwZXIgbGltaXQgaXMgd2lkdGggb2YgbWFzayAqLworCisjZGVmaW5lIERCR0xPR19NT0RVTEVJRF9PRkZTRVQgICAgICAgICAgIDEwCisjZGVmaW5lIERCR0xPR19NT0RVTEVJRF9NQVNLICAgICAgICAgICAgIDB4MDAwM0ZDMDAgICAgIC8qIEJpdCAxMC0xNyAqLworI2RlZmluZSBEQkdMT0dfTU9EVUxFSURfTlVNX01BWCAgICAgICAgICAzMiAgICAgLyogVXBwZXIgbGltaXQgaXMgd2lkdGggb2YgbWFzayAqLworCisjZGVmaW5lIERCR0xPR19WREVWSURfT0ZGU0VUICAgICAgICAgICAgICAxOAorI2RlZmluZSBEQkdMT0dfVkRFVklEX01BU0sgICAgICAgICAgICAgICAgMHgwM0ZDMDAwMCAgICAvKiBCaXQgMjAtMjUgKi8KKyNkZWZpbmUgREJHTE9HX1ZERVZJRF9OVU1fTUFYICAgICAgICAgICAgIDE2CisKKyNkZWZpbmUgREJHTE9HX05VTV9BUkdTX09GRlNFVCAgICAgICAgICAgIDI2CisjZGVmaW5lIERCR0xPR19OVU1fQVJHU19NQVNLICAgICAgICAgICAgICAweEZDMDAwMDAwICAgIC8qIEJpdCAyNi0zMSAqLworLyogaXQgaXMgbGltaXRlZCBiY296IG9mIGxpbWl0YXRpb25zIG9mIGNvcmVic3AgTVNHKigpIHRvIGFjY2VwdCBtYXggOSBhcmcgKi8KKyNkZWZpbmUgREJHTE9HX05VTV9BUkdTX01BWCAgICAgICAgICAgICAgIDkKKworI2RlZmluZSBEQkdMT0dfTE9HX0JVRkZFUl9TSVpFICAgICAgICAgICAgMTUwMAorI2RlZmluZSBEQkdMT0dfREJHSURfREVGSU5JVElPTl9MRU5fTUFYICAgOTAKKworI2RlZmluZSBEQkdMT0dfSE9TVF9MT0dfQlVGRkVSX1NJWkUgICAgICAgICAgICBEQkdMT0dfTE9HX0JVRkZFUl9TSVpFCisKKyNkZWZpbmUgREJHTE9HX0dFVF9EQkdJRChhcmcpIFwKKwkoKGFyZyAmIERCR0xPR19EQkdJRF9NQVNLKSA+PiBEQkdMT0dfREJHSURfT0ZGU0VUKQorCisjZGVmaW5lIERCR0xPR19HRVRfTU9EVUxFSUQoYXJnKSBcCisJKChhcmcgJiBEQkdMT0dfTU9EVUxFSURfTUFTSykgPj4gREJHTE9HX01PRFVMRUlEX09GRlNFVCkKKworI2RlZmluZSBEQkdMT0dfR0VUX1ZERVZJRChhcmcpIFwKKwkoKGFyZyAmIERCR0xPR19WREVWSURfTUFTSykgPj4gREJHTE9HX1ZERVZJRF9PRkZTRVQpCisKKyNkZWZpbmUgREJHTE9HX0dFVF9OVU1BUkdTKGFyZykJXAorCSgoYXJnICYgREJHTE9HX05VTV9BUkdTX01BU0spID4+IERCR0xPR19OVU1fQVJHU19PRkZTRVQpCisKKyNkZWZpbmUgREJHTE9HX0dFVF9USU1FX1NUQU1QKGFyZykgXAorCSgoYXJnICYgREJHTE9HX1RJTUVTVEFNUF9NQVNLKSA+PiBEQkdMT0dfVElNRVNUQU1QX09GRlNFVCkKKworI2RlZmluZSBESUFHX0ZXSURfT0ZGU0VUICAgICAgICAgICAgMjQKKyNkZWZpbmUgRElBR19GV0lEX01BU0sgICAgICAgICAgICAgIDB4RkYwMDAwMDAgIC8qIEJpdCAyNC0zMSAqLworCisjZGVmaW5lIERJQUdfVElNRVNUQU1QX09GRlNFVCAgICAgICAwCisjZGVmaW5lIERJQUdfVElNRVNUQU1QX01BU0sgICAgICAgICAweDAwRkZGRkZGICAvKiBCaXQgMC0yMyAqLworCisjZGVmaW5lIERJQUdfSURfT0ZGU0VUICAgICAgICAgICAgICAxNgorI2RlZmluZSBESUFHX0lEX01BU0sgICAgICAgICAgICAgICAgMHhGRkZGMDAwMCAgLyogQml0IDE2LTMxICovCisKKyNkZWZpbmUgRElBR19WREVWSURfT0ZGU0VUICAgICAgICAgIDExCisjZGVmaW5lIERJQUdfVkRFVklEX01BU0sgICAgICAgICAgICAweDAwMDBGODAwICAvKiBCaXQgMTEtMTUgKi8KKyNkZWZpbmUgRElBR19WREVWSURfTlVNX01BWCAgICAgICAgIDE2CisKKyNkZWZpbmUgRElBR19WREVWTEVWRUxfT0ZGU0VUICAgICAgIDgKKyNkZWZpbmUgRElBR19WREVWTEVWRUxfTUFTSyAgICAgICAgIDB4MDAwMDA3MDAgIC8qIEJpdCA4LTEwICovCisKKyNkZWZpbmUgRElBR19QQVlMRU5fT0ZGU0VUICAgICAgICAgIDAKKyNkZWZpbmUgRElBR19QQVlMRU5fTUFTSyAgICAgICAgICAgIDB4MDAwMDAwRkYgIC8qIEJpdCAwLTcgKi8KKworI2RlZmluZSBESUFHX1BBWUxFTl9PRkZTRVQxNiAgICAgICAgMAorI2RlZmluZSBESUFHX1BBWUxFTl9NQVNLMTYgICAgICAgICAgMHgwMDAwRkZGRiAgLyogQml0IDAtMTYgKi8KKworI2RlZmluZSBESUFHX0dFVF9UWVBFKGFyZykgXAorCSgoYXJnICYgRElBR19GV0lEX01BU0spID4+IERJQUdfRldJRF9PRkZTRVQpCisKKyNkZWZpbmUgRElBR19HRVRfVElNRV9TVEFNUChhcmcpIFwKKwkoKGFyZyAmIERJQUdfVElNRVNUQU1QX01BU0spID4+IERJQUdfVElNRVNUQU1QX09GRlNFVCkKKworI2RlZmluZSBESUFHX0dFVF9JRChhcmcpIFwKKwkoKGFyZyAmIERJQUdfSURfTUFTSykgPj4gRElBR19JRF9PRkZTRVQpCisKKyNkZWZpbmUgRElBR19HRVRfVkRFVklEKGFyZykgXAorCSgoYXJnICYgRElBR19WREVWSURfTUFTSykgPj4gRElBR19WREVWSURfT0ZGU0VUKQorCisjZGVmaW5lIERJQUdfR0VUX1ZERVZMRVZFTChhcmcpCVwKKwkoKGFyZyAmIERJQUdfVkRFVkxFVkVMX01BU0spID4+IERJQUdfVkRFVkxFVkVMX09GRlNFVCkKKworI2RlZmluZSBESUFHX0dFVF9QQVlMRU4oYXJnKSBcCisJKChhcmcgJiBESUFHX1BBWUxFTl9NQVNLKSA+PiBESUFHX1BBWUxFTl9PRkZTRVQpCisKKyNkZWZpbmUgRElBR19HRVRfUEFZTEVOMTYoYXJnKSBcCisJKChhcmcgJiBESUFHX1BBWUxFTl9NQVNLMTYpID4+IERJQUdfUEFZTEVOX09GRlNFVDE2KQorCisvKiBEZWJ1ZyBMb2cgbGV2ZWxzKi8KKwordHlwZWRlZiBlbnVtIHsKKwlEQkdMT0dfVkVSQk9TRSA9IDAsCisJREJHTE9HX0lORk8sCisJREJHTE9HX0lORk9fTFZMXzEsCisJREJHTE9HX0lORk9fTFZMXzIsCisJREJHTE9HX1dBUk4sCisJREJHTE9HX0VSUiwKKwlEQkdMT0dfTFZMX01BWAorfSBEQkdMT0dfTE9HX0xWTDsKKworUFJFUEFDSyBzdHJ1Y3QgZGJnbG9nX2J1Zl9zIHsKKwlzdHJ1Y3QgZGJnbG9nX2J1Zl9zICpuZXh0OworCUFfVUlOVDggKmJ1ZmZlcjsKKwlBX1VJTlQzMiBidWZzaXplOworCUFfVUlOVDMyIGxlbmd0aDsKKwlBX1VJTlQzMiBjb3VudDsKKwlBX1VJTlQzMiBmcmVlOworfSBQT1NUUEFDSzsKKworUFJFUEFDSyBzdHJ1Y3QgZGJnbG9nX2hkcl9zIHsKKwlzdHJ1Y3QgZGJnbG9nX2J1Zl9zICpkYnVmOworCUFfVUlOVDMyIGRyb3BwZWQ7Cit9IFBPU1RQQUNLOworCitQUkVQQUNLIHN0cnVjdCBkYmdsb2dfYnVmX2hvc3QgeworCUFfVUlOVDMyIG5leHQ7CisJQV9VSU5UMzIgYnVmZmVyOworCUFfVUlOVDMyIGJ1ZnNpemU7CisJQV9VSU5UMzIgbGVuZ3RoOworCUFfVUlOVDMyIGNvdW50OworCUFfVUlOVDMyIGZyZWU7Cit9IFBPU1RQQUNLOworCitQUkVQQUNLIHN0cnVjdCBkYmdsb2dfaGRyX2hvc3QgeworCUFfVUlOVDMyIGRidWY7CisJQV9VSU5UMzIgZHJvcHBlZDsKK30gUE9TVFBBQ0s7CisKKyNkZWZpbmUgREJHTE9HX01BWF9WREVWSUQgMTUgICAgLyogMC0xNSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9EQkdMT0dfSF8gKi8KZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvZGJnbG9nX2lkLmggYi90YXJnZXQvaW5jL2RiZ2xvZ19pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZGVhMmQKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL2RiZ2xvZ19pZC5oCkBAIC0wLDAgKzEsMTU4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfREJHTE9HX0lEX0hfCisjZGVmaW5lIF9EQkdMT0dfSURfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogVGhlIHRhcmdldCBzdGF0ZSBtYWNoaW5lIGZyYW1ld29yayB3aWxsIHNlbmQgZGJnbG9nIG1lc3NhZ2VzIG9uIGJlaGFsZiBvbgorICogb3RoZXIgbW9kdWxlcy4gV2UgZG8gdGhpcyBkbyBhdm9pZCBlYWNoIHRhcmdldCBtb2R1bGUgYWRkaW5nIGlkZW50aWNhbAorICogZGJnbG9nIGNvZGUgZm9yIHN0YXRlIHRyYW5zaXRpb25zIGFuZCBldmVudCBwcm9jZXNzaW5nLiBXZSBhbHNvIGRvbid0IHdhbnQKKyAqIHRvIGZvcmNlIGVhY2ggbW9kdWxlIHRvIGRlZmluZSB0aGUgdGhlIHNhbWUgWFhYX0RCR0lEX1NNX01TRyB3aXRoIHRoZSBzYW1lCisgKiB2YWx1ZSBiZWxvdy4gSW5zdGVhZCB3ZSB1c2UgYSBzcGVjaWFsIElEIHRoYXQgdGhlIGhvc3QgZGJnbG9nIGNvZGUKKyAqIHJlY29nbml6ZXMgYXMgYSBtZXNzYWdlIHNlbnQgYnkgdGhlIFNNIG9uIGJlaGFsZiBvbiBhbm90aGVyIG1vZHVsZS4KKyAqLworI2RlZmluZSBEQkdMT0dfREJHSURfU01fRlJBTUVXT1JLX1BST1hZX0RCR0xPR19NU0cgMTAwMAorCisvKgorICogVGhlIG5vbWVuY2xhdHVyZSBmb3IgdGhlIGRlYnVnIGlkZW50aWZpZXJzIGlzIE1PRFVMRV9ERVNDUklQVElPTi4KKyAqIFBsZWFzZSBlbnN1cmUgdGhhdCB0aGUgZGVmaW5pdGlvbiBvZiBhbnkgbmV3IGRlYnVnaWQgaW50cm9kdWNlZCBpcyBjYXB0dXJlZAorICogYmV0d2VlbiB0aGUgPE1PRFVMRT5fREJHSURfREVGSU5JVElPTl9TVEFSVCBhbmQKKyAqIDxNT0RVTEU+X0RCR0lEX0RFRklOSVRJT05fRU5EIGRlZmluZXMuIFRoZSBzdHJ1Y3R1cmUgaXMgcmVxdWlyZWQgZm9yIHRoZQorICogcGFyc2VyIHRvIGNvcnJlY3RseSBwaWNrIHVwIHRoZSB2YWx1ZXMgZm9yIGRpZmZlcmVudCBkZWJ1ZyBpZGVudGlmaWVycy4KKyAqLworCisvKgorICogVGhlIHRhcmdldCBzdGF0ZSBtYWNoaW5lIGZyYW1ld29yayB3aWxsIHNlbmQgZGJnbG9nIG1lc3NhZ2VzIG9uIGJlaGFsZiBvbgorICogb3RoZXIgbW9kdWxlcy4gV2UgZG8gdGhpcyBkbyBhdm9pZCBlYWNoIG1vZHVsZSBhZGRpbmcgaWRlbnRpY2FsIGRiZ2xvZyBjb2RlCisgKiBmb3Igc3RhdGUgdHJhbnNpdGlvbnMgYW5kIGV2ZW50IHByb2Nlc3NpbmcuIFdlIGFsc28gZG9uJ3Qgd2FudCB0byBmb3JjZSBlYWNoCisgKiBtb2R1bGUgdG8gZGVmaW5lIHRoZSB0aGUgc2FtZSBYWFhfREJHSURfU01fTVNHIHdpdGggdGhlIHNhbWUgdmFsdWUgYmVsb3cuCisgKiBJbnN0ZWFkIHdlIHVzZSBhIHNwZWNpYWwgSUQgdGhhdCB0aGUgaG9zdCBkYmdsb2cgY29kZSByZWNvZ25pemVzIGFzIGEKKyAqIG1lc3NhZ2Ugc2VudCBieSB0aGUgU00gb24gYmVoYWxmIG9uIGFub3RoZXIgbW9kdWxlLgorICovCisjZGVmaW5lIERCR0xPR19EQkdJRF9TTV9GUkFNRVdPUktfUFJPWFlfREJHTE9HX01TRyAxMDAwCisKKy8qIElORiBkZWJ1ZyBpZGVudGlmaWVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIElORl9EQkdJRF9ERUZJTklUSU9OX1NUQVJUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElORl9BU1NFUlRJT05fRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElORl9UQVJHRVRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIElORl9UQVJHRVRfTUVNX1JFTUFJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSU5GX1RBUkdFVF9NRU1fRVhUX1JFTUFJTkcgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSU5GX1RBUkdFVF9NRU1fQUxMT0NfVFJBQ0sgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgSU5GX1RBUkdFVF9NRU1fQUxMT0NfUkFNICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSU5GX0RCR0lEX0RFRklOSVRJT05fRU5EICAgICAgICAgICAgICAgICAgICAgIDcKKworLyogV01JIGRlYnVnIGlkZW50aWZpZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgV01JX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV01JX0NNRF9SWF9YVE5EX1BLVF9UT09fU0hPUlQgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV01JX0VYVEVOREVEX0NNRF9OT1RfSEFORExFRCAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV01JX0NNRF9SWF9QS1RfVE9PX1NIT1JUICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV01JX0NBTExJTkdfV01JX0VYVEVOU0lPTl9GTiAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV01JX0NNRF9OT1RfSEFORExFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV01JX0lOX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV01JX1RBUkdFVF9XTUlfU1lOQ19DTUQgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgV01JX1NFVF9TTlJfVEhSRVNIT0xEX1BBUkFNUyAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV01JX1NFVF9SU1NJX1RIUkVTSE9MRF9QQVJBTVMgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV01JX1NFVF9MUV9UUkVTSE9MRF9QQVJBTVMgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV01JX1RBUkdFVF9DUkVBVEVfUFNUUkVBTV9DTUQgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgV01JX1dJX0RUTV9JTlVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV01JX1RBUkdFVF9ERUxFVEVfUFNUUkVBTV9DTUQgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgV01JX1RBUkdFVF9JTVBMSUNJVF9ERUxFVEVfUFNUUkVBTV9DTUQgICAgICAgMTQKKyNkZWZpbmUgV01JX1RBUkdFVF9HRVRfQklUX1JBVEVfQ01EICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgV01JX0dFVF9SQVRFX01BU0tfQ01EX0ZJWF9SQVRFX01BU0tfSVMgICAgICAgMTYKKyNkZWZpbmUgV01JX1RBUkdFVF9HRVRfQVZBSUxBQkxFX0NIQU5ORUxTX0NNRCAgICAgICAgMTcKKyNkZWZpbmUgV01JX1RBUkdFVF9HRVRfVFhfUFdSX0NNRCAgICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgV01JX0ZSRUVfRVZCVUZfV01JQlVGICAgICAgICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgV01JX0ZSRUVfRVZCVUZfREFUQUJVRiAgICAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgV01JX0ZSRUVfRVZCVUZfQkFERkxBRyAgICAgICAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgV01JX0hUQ19SWF9FUlJPUl9EQVRBX1BBQ0tFVCAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgV01JX0hUQ19SWF9TWU5DX1BBVVNJTkdfRk9SX01CT1ggICAgICAgICAgICAgMjMKKyNkZWZpbmUgV01JX0lOQ09SUkVDVF9XTUlfREFUQV9IRFJfRFJPUFBJTkdfUEtUICAgICAgMjQKKyNkZWZpbmUgV01JX1NFTkRJTkdfUkVBRFlfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgV01JX1NFVFBPV0VSX01ET0VfVE9fTUFYUEVSRiAgICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgV01JX1NFVFBPV0VSX01ET0VfVE9fUkVDICAgICAgICAgICAgICAgICAgICAgMjcKKyNkZWZpbmUgV01JX0JTU0lORk9fRVZFTlRfRlJPTSAgICAgICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgV01JX1RBUkdFVF9HRVRfU1RBVFNfQ01EICAgICAgICAgICAgICAgICAgICAgMjkKKyNkZWZpbmUgV01JX1NFTkRJTkdfU0NBTl9DT01QTEVURV9FVkVOVCAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgV01JX1NFTkRJTkdfUlNTSV9JTkRCX1RIUkVTSE9MRF9FVkVOVCAgICAgICAgMzEKKyNkZWZpbmUgV01JX1NFTkRJTkdfUlNTSV9JTkRCTV9USFJFU0hPTERfRVZFTlQgICAgICAgMzIKKyNkZWZpbmUgV01JX1NFTkRJTkdfTElOS19RVUFMSVRZX1RIUkVTSE9MRF9FVkVOVCAgICAgMzMKKyNkZWZpbmUgV01JX1NFTkRJTkdfRVJST1JfUkVQT1JUX0VWRU5UICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgV01JX1NFTkRJTkdfQ0FDX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgV01JX1RBUkdFVF9HRVRfUk9BTV9UQUJMRV9DTUQgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgV01JX1RBUkdFVF9HRVRfUk9BTV9EQVRBX0NNRCAgICAgICAgICAgICAgICAgMzcKKyNkZWZpbmUgV01JX1NFTkRJTkdfR1BJT19JTlRSX0VWRU5UICAgICAgICAgICAgICAgICAgMzgKKyNkZWZpbmUgV01JX1NFTkRJTkdfR1BJT19BQ0tfRVZFTlQgICAgICAgICAgICAgICAgICAgMzkKKyNkZWZpbmUgV01JX1NFTkRJTkdfR1BJT19EQVRBX0VWRU5UICAgICAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgV01JX0NNRF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgV01JX0NNRF9SWF9YVE5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIKKyNkZWZpbmUgV01JX0VWRU5UX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMKKyNkZWZpbmUgV01JX0VWRU5UX1NFTkRfWFRORCAgICAgICAgICAgICAgICAgICAgICAgICAgNDQKKyNkZWZpbmUgV01JX0NNRF9QQVJBTVNfRFVNUF9TVEFSVCAgICAgICAgICAgICAgICAgICAgNDUKKyNkZWZpbmUgV01JX0NNRF9QQVJBTVNfRFVNUF9FTkQgICAgICAgICAgICAgICAgICAgICAgNDYKKyNkZWZpbmUgV01JX0NNRF9QQVJBTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcKKyNkZWZpbmUgV01JX0VWRU5UX0FMTE9DX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgNDgKKyNkZWZpbmUgV01JX0RCR0lEX0RDU19QQVJBTV9DTUQgICAgICAgICAgICAgICAgICAgICAgNDkKKyNkZWZpbmUgV01JX1NFTkRfRVZFTlRfV1JPTkdfVExWICAgICAgICAgICAgICAgICAgICAgNTAKKyNkZWZpbmUgV01JX1NFTkRfRVZFTlRfTk9fVExWX0RFRiAgICAgICAgICAgICAgICAgICAgNTEKKyNkZWZpbmUgV01JX0RCR0lEX0RFRklOSVRJT05fRU5EICAgICAgICAgICAgICAgICAgICAgNTIKKworLyogIFBNIE1lc3NhZ2UgZGVmaW5pdGlvbiovCisjZGVmaW5lIFBTX1NUQV9ERUZJTklUSU9OX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQU19TVEFfUE1fQVJCX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUFNfU1RBX0RFTElWRVJfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBTX1NUQV9QU1BPTExfU0VRX0RPTkUgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBQU19TVEFfQ09FWF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUFNfU1RBX1BTUE9MTF9BTExPVyAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFBTX1NUQV9TRVRfUEFSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBQU19TVEFfU1BFQ1BPTExfVElNRVJfU1RBUlRFRCAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgUFNfU1RBX1NQRUNQT0xMX1RJTUVSX1NUT1BQRUQgICAgICAgICAgICAgICA4CisjZGVmaW5lIFBTX1NUQV9BVkdfQ0hBTk5FTF9DT05HRVNUSU9OICAgICAgICAgICAgICAgOQorI2RlZmluZSBQU19TVEFfREVGSU5JVElPTl9FTkQgICAgICAgICAgICAgICAgICAgICAgIDEwCisKKy8qKiBSRVNNR1IgZGJnIGlkcyAqLworLyogVE9ETzogMS4gU2VncmVnYXRlIElEcyBhcyBwZXIgc3ViLW1vZHVsZS4gKEdpdmUgMTAwIHBlciBzdWItbW9kdWxlPykKKyAqICAgICAgIDIuIEFkZCBjaG1nciBJRHMgb3ZlciBoZXJlLgorICogICAgICAgMy4gVXBkYXRlIHByaW50cyBpbiBkYmdsb2dfaG9zdC5jCisgKiAgICAgICA0LiBEZXByZWNhdGUgV0xBTl9NT0RVTEVfUkVTTUdSX0NIQU5fTUFOQUdFUiAqLworI2RlZmluZSBSRVNNR1JfREVGSU5JVElPTl9TVEFSVCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVTTUdSX09DU19BTExPQ1JBTV9TSVpFICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJFU01HUl9PQ1NfUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSRVNNR1JfTElOS19DUkVBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUkVTTUdSX0xJTktfREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFJFU01HUl9PQ1NfQ0hSRVFfQ1JFQVRFICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBSRVNNR1JfT0NTX0NIUkVRX0RFTEVURSAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkVTTUdSX09DU19DSFJFUV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFJFU01HUl9PQ1NfQ0hSRVFfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBSRVNNR1JfT0NTX1NDSEVEVUxFUl9JTlZPS0VEICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgUkVTTUdSX09DU19DSFJFUV9HUkFOVCAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBSRVNNR1JfT0NTX0NIUkVRX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFJFU01HUl9PQ1NfTkVYVF9UU0ZUSU1FICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUkVTTUdSX09DU19UU0ZfVElNRU9VVF9VUyAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBSRVNNR1JfT0NTX0NVUlJfQ0FUX1dJTkRPVyAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFJFU01HUl9PQ1NfQ1VSUl9DQVRfV0lORE9XX1JFUSAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgUkVTTUdSX09DU19DVVJSX0NBVF9XSU5ET1dfVElNRVNMT1QgICAgICAgICAxNgorI2RlZmluZSBSRVNNR1JfT0NTX0NIUkVRX1JFU1RBUlQgICAgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIFJFU01HUl9PQ1NfQ0xFQU5VUF9DSF9BTExPQ0FUT1JTICAgICAgICAgICAgMTgKKyNkZWZpbmUgUkVTTUdSX09DU19QVVJHRV9DSFJFUSAgICAgICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBSRVNNR1JfT0NTX0NIX0FMTE9DQVRPUl9GUkVFICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFJFU01HUl9PQ1NfUkVDT01QVVRFX1NDSEVEVUxFICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgUkVTTUdSX09DU19ORVdfQ0FUX1dJTkRPV19SRVEgICAgICAgICAgICAgICAyMgorI2RlZmluZSBSRVNNR1JfT0NTX05FV19DQVRfV0lORE9XX1RJTUVTTE9UICAgICAgICAgIDIzCisjZGVmaW5lIFJFU01HUl9PQ1NfQ1VSX0NIX0FMTE9DICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgUkVTTUdSX09DU19XSU5fQ0hfQUxMT0MgICAgICAgICAgICAgICAgICAgICAyNQorI2RlZmluZSBSRVNNR1JfT0NTX1NDSEVEX0NIX0NIQU5HRSAgICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIFJFU01HUl9PQ1NfQ09OU1RSVUNUX0NBVF9XSU4gICAgICAgICAgICAgICAgMjcKKyNkZWZpbmUgUkVTTUdSX09DU19DSFJFUV9QUkVFTVBURUQgICAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBSRVNNR1JfT0NTX0NIX1NXSVRDSF9SRVEgICAgICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFJFU01HUl9PQ1NfQ0hBTk5FTF9TV0lUQ0hFRCAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgUkVTTUdSX09DU19DTEVBTlVQX1NUQUxFX1JFUVMgICAgICAgICAgICAgICAzMQorI2RlZmluZSBSRVNNR1JfT0NTX0NIUkVRX1VQREFURSAgICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFJFU01HUl9PQ1NfUkVHX05PQV9OT1RJRiAgICAgICAgICAgICAgICAgICAgMzMKKyNkZWZpbmUgUkVTTUdSX09DU19ERVJFR19OT0FfTk9USUYgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBSRVNNR1JfT0NTX0dFTl9QRVJJT0RJQ19OT0EgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIFJFU01HUl9PQ1NfUkVDQUxfUVVPVEFTICAgICAgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgUkVTTUdSX09DU19HUkFOVEVEX1FVT1RBX1NUQVRTICAgICAgICAgICAgICAzNworI2RlZmluZSBSRVNNR1JfT0NTX0FMTE9DQVRFRF9RVU9UQV9TVEFUUyAgICAgICAgICAgIDM4CisjZGVmaW5lIFJFU01HUl9PQ1NfUkVRX1FVT1RBX1NUQVRTICAgICAgICAgICAgICAgICAgMzkKKyNkZWZpbmUgUkVTTUdSX09DU19UUkFDS0lOR19USU1FX0ZJUkVEICAgICAgICAgICAgICA0MAorI2RlZmluZSBSRVNNR1JfVkNfQVJCSVRSQVRFX0FUVFJJQlVURVMgICAgICAgICAgICAgIDQxCisjZGVmaW5lIFJFU01HUl9PQ1NfTEFURU5DWV9TVFJJQ1RfVElNRV9TTE9UICAgICAgICAgNDIKKyNkZWZpbmUgUkVTTUdSX09DU19DVVJSX1RTRiAgICAgICAgICAgICAgICAgICAgICAgICA0MworI2RlZmluZSBSRVNNR1JfT0NTX1FVT1RBX1JFTSAgICAgICAgICAgICAgICAgICAgICAgIDQ0CisjZGVmaW5lIFJFU01HUl9PQ1NfTEFURU5DWV9DQVNFX05PICAgICAgICAgICAgICAgICAgNDUKKyNkZWZpbmUgUkVTTUdSX09DU19XSU5fQ0FUX0RVUiAgICAgICAgICAgICAgICAgICAgICA0NgorI2RlZmluZSBSRVNNR1JfVkNfVVBEQVRFX0NVUl9WQyAgICAgICAgICAgICAgICAgICAgIDQ3CisjZGVmaW5lIFJFU01HUl9WQ19SRUdfVU5SRUdfTElOSyAgICAgICAgICAgICAgICAgICAgNDgKKyNkZWZpbmUgUkVTTUdSX1ZDX1BSSU5UX0xJTksgICAgICAgICAgICAgICAgICAgICAgICA0OQorI2RlZmluZSBSRVNNR1JfT0NTX01JU1NfVE9MRVJBTkNFICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIFJFU01HUl9EWU5fU0NIX0FMTE9DUkFNX1NJWkUgICAgICAgICAgICAgICAgNTEKKyNkZWZpbmUgUkVTTUdSX0RZTl9TQ0hfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICA1MgorI2RlZmluZSBSRVNNR1JfRFlOX1NDSF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgIDUzCisjZGVmaW5lIFJFU01HUl9EWU5fU0NIX0NIX1NUQVRTX1NUQVJUICAgICAgICAgICAgICAgNTQKKyNkZWZpbmUgUkVTTUdSX0RZTl9TQ0hfQ0hfU1hfU1RBVFMgICAgICAgICAgICAgICAgICA1NQorI2RlZmluZSBSRVNNR1JfRFlOX1NDSF9UT1RfVVRJTF9QRVIgICAgICAgICAgICAgICAgIDU2CisjZGVmaW5lIFJFU01HUl9EWU5fU0NIX0hPTUVfQ0hfUVVPVEEgICAgICAgICAgICAgICAgNTcKKyNkZWZpbmUgUkVTTUdSX09DU19SRUdfUkVDQUxfUVVPVEFfTk9USUYgICAgICAgICAgICA1OAorI2RlZmluZSBSRVNNR1JfT0NTX0RFUkVHX1JFQ0FMX1FVT1RBX05PVElGICAgICAgICAgIDU5CisjZGVmaW5lIFJFU01HUl9EWU5fU0NIX0NIX1NUQVRTX0VORCAgICAgICAgICAgICAgICAgNjAKKyNkZWZpbmUgUkVTTUdSX0RFRklOSVRJT05fRU5EICAgICAgICAgICAgICAgICAgICAgICA2MQorCisvKiBSRVNNR1IgQ0hOTUdSIGRlYnVnIGlkcyAqLworI2RlZmluZSBSRVNNR1JfQ0hNR1JfREVGSU5JVElPTl9TVEFSVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVTTUdSX0NITUdSX1BBVVNFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJFU01HUl9DSE1HUl9DSEFOTkVMX0NIQU5HRSAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSRVNNR1JfQ0hNR1JfUkVTVU1FX0NPTVBMRVRFICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUkVTTUdSX0NITUdSX1ZERVZfUEFVU0UgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFJFU01HUl9DSE1HUl9WREVWX1VOUEFVU0UgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBSRVNNR1JfQ0hNR1JfQ1RTMlNfVFhfQ09NUCAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkVTTUdSX0NITUdSX0NGRU5EX1RYX0NPTVAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFJFU01HUl9DSE1HUl9ERUZJTklUSU9OX0VORCAgICAgICAgICAgICAgICAgOAorCisvKiBWREVWIG1hbmFnZXIgZGVidWcgaWRzICovCisjZGVmaW5lIFZERVZfTUdSX0RFRklOSVRJT05fU1RBUlQgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWREVWX01HUl9GSVJTVF9CTUlTU19ERVRFQ1RFRCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVkRFVl9NR1JfRklOQUxfQk1JU1NfREVURUNURUQgICAgICAgICAgICAgICAyCisjZGVmaW5lIFZERVZfTUdSX0JDTl9JTl9TWU5DICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBWREVWX01HUl9BUF9LRUVQQUxJVkVfSURMRSAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVkRFVl9NR1JfQVBfS0VFUEFMSVZFX0lOQUNUSVZFICAgICAgICAgICAgICA1CisjZGVmaW5lIFZERVZfTUdSX0FQX0tFRVBBTElWRV9VTlJFU1BPTlNJVkUgICAgICAgICAgNgorI2RlZmluZSBWREVWX01HUl9BUF9UQlRUX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgVkRFVl9NR1JfRklSU1RfQkNOX1JFQ0VJVkVEICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFZERVZfTUdSX1ZERVZfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBWREVWX01HUl9WREVWX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFZERVZfTUdSX1BFRVJfQVVUSE9SSVpFRCAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgVkRFVl9NR1JfT0NTX0hQX0xQX1JFUV9QT1NURUQgICAgICAgICAgICAgICAxMgorI2RlZmluZSBWREVWX01HUl9WREVWX1NUQVJUX09DU19IUF9SRVFfQ09NUExFVEUgICAgIDEzCisjZGVmaW5lIFZERVZfTUdSX1ZERVZfU1RBUlRfT0NTX0hQX1JFUV9TVE9QICAgICAgICAgMTQKKyNkZWZpbmUgVkRFVl9NR1JfSFBfU1RBUlRfVElNRSAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBWREVWX01HUl9WREVWX1BBVVNFX0RFTEFZX1VQREFURSAgICAgICAgICAgIDE2CisjZGVmaW5lIFZERVZfTUdSX1ZERVZfUEFVU0VfRkFJTCAgICAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgVkRFVl9NR1JfR0VOX1BFUklPRElDX05PQSAgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBWREVWX01HUl9PRkZfQ0hBTl9HT19DSF9SRVFfU0VUVVAgICAgICAgICAgIDE5CisjZGVmaW5lIFZERVZfTUdSX0RFRklOSVRJT05fRU5EICAgICAgICAgICAgICAgICAgICAgMjAKKworLyogV0hBTCBkZWJ1ZyBpZGVudGlmaWVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFdIQUxfREJHSURfREVGSU5JVElPTl9TVEFSVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXSEFMX0VSUk9SX0FOSV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV0hBTF9FUlJPUl9DSElQX1RFU1QxICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdIQUxfRVJST1JfQ0hJUF9URVNUMiAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXSEFMX0VSUk9SX0VFUFJPTV9DSEVDS1NVTSAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV0hBTF9FUlJPUl9FRVBST01fTUFDQUREUiAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdIQUxfRVJST1JfSU5URVJSVVBUX0hJVSAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXSEFMX0VSUk9SX0tFWUNBQ0hFX1JFU0VUICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgV0hBTF9FUlJPUl9LRVlDQUNIRV9TRVQgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdIQUxfRVJST1JfS0VZQ0FDSEVfVFlQRSAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBXSEFMX0VSUk9SX0tFWUNBQ0hFX1RLSVBFTlRSWSAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV0hBTF9FUlJPUl9LRVlDQUNIRV9XRVBMRU5HVEggICAgICAgICAgICAgIDExCisjZGVmaW5lIFdIQUxfRVJST1JfUEhZX0lOVkFMSURfQ0hBTk5FTCAgICAgICAgICAgICAxMgorI2RlZmluZSBXSEFMX0VSUk9SX1BPV0VSX0FXQUtFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgV0hBTF9FUlJPUl9QT1dFUl9TRVQgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdIQUxfRVJST1JfUkVDVl9TVE9QRE1BICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBXSEFMX0VSUk9SX1JFQ1ZfU1RPUFBDVSAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgV0hBTF9FUlJPUl9SRVNFVF9DSEFOTkYxICAgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIFdIQUxfRVJST1JfUkVTRVRfQ0hBTk5GMiAgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBXSEFMX0VSUk9SX1JFU0VUX1BNICAgICAgICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgV0hBTF9FUlJPUl9SRVNFVF9PRkZTRVRDQUwgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFdIQUxfRVJST1JfUkVTRVRfUkZHUkFOVCAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBXSEFMX0VSUk9SX1JFU0VUX1JYRlJBTUUgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgV0hBTF9FUlJPUl9SRVNFVF9TVE9QRE1BICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFdIQUxfRVJST1JfUkVTRVRfRVJSSUQgICAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBXSEFMX0VSUk9SX1JFU0VUX0FEQ0RDQ0FMMSAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgV0hBTF9FUlJPUl9SRVNFVF9BRENEQ0NBTDIgICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIFdIQUxfRVJST1JfUkVTRVRfVFhJUUNBTCAgICAgICAgICAgICAgICAgICAyNworI2RlZmluZSBXSEFMX0VSUk9SX1JFU0VUX1JYSVFDQUwgICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgV0hBTF9FUlJPUl9SRVNFVF9DQVJSSUVSTEVBSyAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFdIQUxfRVJST1JfWE1JVF9DT01QVVRFICAgICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBXSEFMX0VSUk9SX1hNSVRfTk9RVUVVRSAgICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgV0hBTF9FUlJPUl9YTUlUX0FDVElWRVFVRVVFICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFdIQUxfRVJST1JfWE1JVF9CQURUWVBFICAgICAgICAgICAgICAgICAgICAzMworI2RlZmluZSBXSEFMX0VSUk9SX1hNSVRfU1RPUERNQSAgICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgV0hBTF9FUlJPUl9JTlRFUlJVUFRfQkJfUEFOSUMgICAgICAgICAgICAgIDM1CisjZGVmaW5lIFdIQUxfRVJST1JfUEFQUkRfTUFYR0FJTl9BQk9WRV9XSU5ET1cgICAgICAzNgorI2RlZmluZSBXSEFMX0VSUk9SX1FDVV9IV19QQVVTRV9NSVNNQVRDSCAgICAgICAgICAgMzcKKyNkZWZpbmUgV0hBTF9FUlJPUl9QT1dFUl9SRkxQX0NPTkZJRyAgICAgICAgICAgICAgIDM4CisjZGVmaW5lIFdIQUxfRVJST1JfUE9XRVJfUkZMUF9TWU5USEJZUEFTU19DT05GSUcgICAzOQorI2RlZmluZSBXSEFMX0VSUk9SX1BPV0VSX1JGTFBfQklBUzJYX0NPTkZJRyAgICAgICAgNDAKKyNkZWZpbmUgV0hBTF9FUlJPUl9QT1dFUl9SRkxQX1BMTEJZUEFTU19DT05GSUcgICAgIDQxCisjZGVmaW5lIFdIQUxfRVJST1JfUE9XRVJfUkZMUF9PRkYxQ0hBTl9DT05GSUcgICAgICA0MgorI2RlZmluZSBXSEFMX0VSUk9SX1BPV0VSX0FOVEVOTkFfTE1JVCAgICAgICAgICAgICAgNDMKKyNkZWZpbmUgV0hBTF9FUlJPUl9QT1dFUl9SRUdETU5fVFhfTE1JVCAgICAgICAgICAgIDQ0CisjZGVmaW5lIFdIQUxfRVJST1JfUE9XRVJfTU9ERV9TQ0FMRURfUFdSICAgICAgICAgICA0NQorI2RlZmluZSBXSEFMX0VSUk9SX1BPV0VSX0VER0VfUFdSX1RQU0NBTEUgICAgICAgICAgNDYKKyNkZWZpbmUgV0hBTF9FUlJPUl9QT1dFUl9DSEFOX1JFR0FMTE9XICAgICAgICAgICAgIDQ3CisjZGVmaW5lIFdIQUxfRVJST1JfV0FJVF9SRUdfVElNRU9VVCAgICAgICAgICAgICAgICA0OAorI2RlZmluZSBXSEFMX0VSUk9SX1hUQUxfU0VUICAgICAgICAgICAgICAgICAgICAgICAgNDkKKyNkZWZpbmUgV0hBTF9EQkdJRF9ERUZJTklUSU9OX0VORCAgICAgICAgICAgICAgICAgIDUwCisKKyNkZWZpbmUgQ09FWF9ERUJVR0lEX1NUQVJUICAgICAgICAgICAgICAwCisjZGVmaW5lIEJUQ09FWF9EQkdfTUNJXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCVENPRVhfREJHX01DSV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQlRDT0VYX0RCR19NQ0lfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEJUQ09FWF9EQkdfTUNJXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBCVENPRVhfREJHX01DSV81ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQlRDT0VYX0RCR19NQ0lfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIEJUQ09FWF9EQkdfTUNJXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBCVENPRVhfREJHX01DSV84ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQlRDT0VYX0RCR19NQ0lfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEJUQ09FWF9EQkdfTUNJXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgQ09FWF9XQUxfQlRDT0VYX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBDT0VYX1dBTF9QQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIENPRVhfV0FMX1JFU1VNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ09FWF9VUERBVEVfQUZIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDT0VYX0hXUV9FTVBUWV9DQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENPRVhfTUNJX1RJTUVSX0hBTkRMRVIgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQ09FWF9NQ0lfUkVDT1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBFUlJPUl9DT0VYX01DSV9JU1IgICAgICAgICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEVSUk9SX0NPRVhfTUNJX0dQTSAgICAgICAgICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgQ09FWF9Qcm9maWxlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBDT0VYX0xpbmtJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIENPRVhfTGlua1N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgQ09FWF9MaW5rUm9sZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMworI2RlZmluZSBDT0VYX0xpbmtSYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIENPRVhfVm9pY2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgQ09FWF9USW50ZXJ2YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBDT0VYX1dSZXRyeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIENPRVhfQXR0ZW1wdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgQ09FWF9QZXJmb3JtYW5jZVN0YXRlICAgICAgICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBDT0VYX0xpbmtUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIENPRVhfUlhfTUNJX0dQTV9WRVJTSU9OX1FVRVJZICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgQ09FWF9SWF9NQ0lfR1BNX1ZFUlNJT05fUkVTUE9OU0UgICAgICAgICAgICAzMgorI2RlZmluZSBDT0VYX1JYX01DSV9HUE1fU1RBVFVTX1FVRVJZICAgICAgICAgICAgICAgIDMzCisjZGVmaW5lIENPRVhfU1RBVEVfV0xBTl9WREVWX0RPV04gICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgQ09FWF9TVEFURV9XTEFOX1ZERVZfU1RBUlQgICAgICAgICAgICAgICAgICAzNQorI2RlZmluZSBDT0VYX1NUQVRFX1dMQU5fVkRFVl9DT05ORUNURUQgICAgICAgICAgICAgIDM2CisjZGVmaW5lIENPRVhfU1RBVEVfV0xBTl9WREVWX1NDQU5fU1RBUlRFRCAgICAgICAgICAgMzcKKyNkZWZpbmUgQ09FWF9TVEFURV9XTEFOX1ZERVZfU0NBTl9FTkQgICAgICAgICAgICAgICAzOAorI2RlZmluZSBDT0VYX1NUQVRFX1dMQU5fREVGQVVMVCAgICAgICAgICAgICAgICAgICAgIDM5CisjZGVmaW5lIENPRVhfQ0hBTk5FTF9DSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgQ09FWF9QT1dFUl9DSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICA0MQorI2RlZmluZSBDT0VYX0NPTkZJR19NR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyCisjZGVmaW5lIENPRVhfVFhfTUNJX0dQTV9CVF9DQUxfUkVRICAgICAgICAgICAgICAgICAgNDMKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX0JUX0NBTF9HUkFOVCAgICAgICAgICAgICAgICA0NAorI2RlZmluZSBDT0VYX1RYX01DSV9HUE1fQlRfQ0FMX0RPTkUgICAgICAgICAgICAgICAgIDQ1CisjZGVmaW5lIENPRVhfVFhfTUNJX0dQTV9XTEFOX0NBTF9SRVEgICAgICAgICAgICAgICAgNDYKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX1dMQU5fQ0FMX0dSQU5UICAgICAgICAgICAgICA0NworI2RlZmluZSBDT0VYX1RYX01DSV9HUE1fV0xBTl9DQUxfRE9ORSAgICAgICAgICAgICAgIDQ4CisjZGVmaW5lIENPRVhfVFhfTUNJX0dQTV9CVF9ERUJVRyAgICAgICAgICAgICAgICAgICAgNDkKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX1ZFUlNJT05fUVVFUlkgICAgICAgICAgICAgICA1MAorI2RlZmluZSBDT0VYX1RYX01DSV9HUE1fVkVSU0lPTl9SRVNQT05TRSAgICAgICAgICAgIDUxCisjZGVmaW5lIENPRVhfVFhfTUNJX0dQTV9TVEFUVVNfUVVFUlkgICAgICAgICAgICAgICAgNTIKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX0hBTFRfQlRfR1BNICAgICAgICAgICAgICAgICA1MworI2RlZmluZSBDT0VYX1RYX01DSV9HUE1fV0xBTl9DSEFOTkVMUyAgICAgICAgICAgICAgIDU0CisjZGVmaW5lIENPRVhfVFhfTUNJX0dQTV9CVF9QUk9GSUxFX0lORk8gICAgICAgICAgICAgNTUKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX0JUX1NUQVRVU19VUERBVEUgICAgICAgICAgICA1NgorI2RlZmluZSBDT0VYX1RYX01DSV9HUE1fQlRfVVBEQVRFX0ZMQUdTICAgICAgICAgICAgIDU3CisjZGVmaW5lIENPRVhfVFhfTUNJX0dQTV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgNTgKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfU1lTX1dBS0lORyAgICAgICAgICAgICAgICAgICAgICA1OQorI2RlZmluZSBDT0VYX1RYX01DSV9MTkFfVEFLRSAgICAgICAgICAgICAgICAgICAgICAgIDYwCisjZGVmaW5lIENPRVhfVFhfTUNJX0xOQV9UUkFOUyAgICAgICAgICAgICAgICAgICAgICAgNjEKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfU1lTX1NMRUVQSU5HICAgICAgICAgICAgICAgICAgICA2MgorI2RlZmluZSBDT0VYX1RYX01DSV9SRVFfV0FLRSAgICAgICAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIENPRVhfVFhfTUNJX1JFTU9URV9SRVNFVCAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgICAgICA2NQorI2RlZmluZSBDT0VYX1dIQUxfTUNJX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIENPRVhfUE9MTF9CVF9DQUxfRE9ORV9USU1FT1VUICAgICAgICAgICAgICAgNjcKKyNkZWZpbmUgQ09FWF9XSEFMX1BBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OAorI2RlZmluZSBDT0VYX1JYX01DSV9HUE1fQlRfQ0FMX1JFUSAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIENPRVhfUlhfTUNJX0dQTV9CVF9DQUxfRE9ORSAgICAgICAgICAgICAgICAgNzAKKyNkZWZpbmUgQ09FWF9SWF9NQ0lfR1BNX0JUX0NBTF9HUkFOVCAgICAgICAgICAgICAgICA3MQorI2RlZmluZSBDT0VYX1dMQU5fQ0FMX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgIDcyCisjZGVmaW5lIENPRVhfV0xBTl9DQUxfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgQ09FWF9CdE1jaVN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NAorI2RlZmluZSBDT0VYX0J0Q2FsU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1CisjZGVmaW5lIENPRVhfV2xhbkNhbFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgNzYKKyNkZWZpbmUgQ09FWF9SeFJlcVdha2VDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICA3NworI2RlZmluZSBDT0VYX1J4UmVtb3RlUmVzZXRDb3VudCAgICAgICAgICAgICAgICAgICAgIDc4CisjZGVmaW5lIENPRVhfUkVTVEFSVF9DQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzkKKyNkZWZpbmUgQ09FWF9TRU5ETVNHX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICA4MAorI2RlZmluZSBDT0VYX1JFU0VUU0VRX0xOQUlORk9fVElNRU9VVCAgICAgICAgICAgICAgIDgxCisjZGVmaW5lIENPRVhfTUNJX0lTUl9JbnRSYXcgICAgICAgICAgICAgICAgICAgICAgICAgODIKKyNkZWZpbmUgQ09FWF9NQ0lfSVNSX0ludDFSYXcgICAgICAgICAgICAgICAgICAgICAgICA4MworI2RlZmluZSBDT0VYX01DSV9JU1JfUnhNc2dSYXcgICAgICAgICAgICAgICAgICAgICAgIDg0CisjZGVmaW5lIENPRVhfV0hBTF9DT0VYX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgODUKKyNkZWZpbmUgQ09FWF9XQUxfQ09FWF9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICA4NgorI2RlZmluZSBDT0VYX1RYUlhfQ05UX0xJTUlUX0lTUiAgICAgICAgICAgICAgICAgICAgIDg3CisjZGVmaW5lIENPRVhfQ0hfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgKKyNkZWZpbmUgQ09FWF9SRUFTU0VTU19XTEFOX1NUQVRFICAgICAgICAgICAgICAgICAgICA4OQorI2RlZmluZSBDT0VYX0JUQ09FWF9XTEFOX1NUQVRFX1VQREFURSAgICAgICAgICAgICAgIDkwCisjZGVmaW5lIENPRVhfQlRfTlVNX09GX1BST0ZJTEVTICAgICAgICAgICAgICAgICAgICAgOTEKKyNkZWZpbmUgQ09FWF9CVF9OVU1fT0ZfSElEX1BST0ZJTEVTICAgICAgICAgICAgICAgICA5MgorI2RlZmluZSBDT0VYX0JUX05VTV9PRl9BQ0xfUFJPRklMRVMgICAgICAgICAgICAgICAgIDkzCisjZGVmaW5lIENPRVhfQlRfTlVNX09GX0hJX0FDTF9QUk9GSUxFUyAgICAgICAgICAgICAgOTQKKyNkZWZpbmUgQ09FWF9CVF9OVU1fT0ZfVk9JQ0VfUFJPRklMRVMgICAgICAgICAgICAgICA5NQorI2RlZmluZSBDT0VYX1dMQU5fQUdHUl9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgIDk2CisjZGVmaW5lIENPRVhfQlRfTE9XX1BSSU9fQlVER0VUICAgICAgICAgICAgICAgICAgICAgOTcKKyNkZWZpbmUgQ09FWF9CVF9ISV9QUklPX0JVREdFVCAgICAgICAgICAgICAgICAgICAgICA5OAorI2RlZmluZSBDT0VYX0JUX0lETEVfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5CisjZGVmaW5lIENPRVhfU0VUX0NPRVhfV0VJR0hUICAgICAgICAgICAgICAgICAgICAgICAgMTAwCisjZGVmaW5lIENPRVhfV0xBTl9XRUlHSFRfR1JPVVAgICAgICAgICAgICAgICAgICAgICAgMTAxCisjZGVmaW5lIENPRVhfQlRfV0VJR0hUX0dST1VQICAgICAgICAgICAgICAgICAgICAgICAgMTAyCisjZGVmaW5lIENPRVhfQlRfSU5URVJWQUxfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgMTAzCisjZGVmaW5lIENPRVhfQlRfU0NIRU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0CisjZGVmaW5lIENPRVhfQlRfTUdSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA1CisjZGVmaW5lIENPRVhfQlRfU01fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA2CisjZGVmaW5lIENPRVhfU1lTVEVNX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMTA3CisjZGVmaW5lIENPRVhfTE9XX1BSSU9fTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgMTA4CisjZGVmaW5lIENPRVhfSElfUFJJT19MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTA5CisjZGVmaW5lIENPRVhfQlRfSU5URVJWQUxfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgMTEwCisjZGVmaW5lIENPRVhfV0xBTl9JTlRFUlZBTF9TVEFSVCAgICAgICAgICAgICAgICAgICAgMTExCisjZGVmaW5lIENPRVhfTk9OX0xJTktfQlVER0VUICAgICAgICAgICAgICAgICAgICAgICAgMTEyCisjZGVmaW5lIENPRVhfQ09OVEVOVElPTl9NU0cgICAgICAgICAgICAgICAgICAgICAgICAgMTEzCisjZGVmaW5lIENPRVhfU0VUX05TUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE0CisjZGVmaW5lIENPRVhfU0VMRl9HRU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1CisjZGVmaW5lIENPRVhfUFJPRklMRV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgMTE2CisjZGVmaW5lIENPRVhfV0xBTl9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE3CisjZGVmaW5lIENPRVhfQkVBQ09OX01JU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE4CisjZGVmaW5lIENPRVhfQkVBQ09OX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE5CisjZGVmaW5lIENPRVhfQlRDT0VYX1NDQU5fQUNUSVZJVFkgICAgICAgICAgICAgICAgICAgMTIwCisjZGVmaW5lIENPRVhfU0NBTl9BQ1RJVklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxCisjZGVmaW5lIENPRVhfRk9SQ0VfUVVJRVRUSU1FICAgICAgICAgICAgICAgICAgICAgICAgMTIyCisjZGVmaW5lIENPRVhfQlRfTUdSX1FVSUVUVElNRSAgICAgICAgICAgICAgICAgICAgICAgMTIzCisjZGVmaW5lIENPRVhfQlRfSU5BQ1RJVklUWV9UUklHR0VSICAgICAgICAgICAgICAgICAgMTI0CisjZGVmaW5lIENPRVhfQlRfSU5BQ1RJVklUWV9SRVBPUlRFRCAgICAgICAgICAgICAgICAgMTI1CisjZGVmaW5lIENPRVhfVFhfTUNJX0dQTV9XTEFOX1BSSU8gICAgICAgICAgICAgICAgICAgMTI2CisjZGVmaW5lIENPRVhfVFhfTUNJX0dQTV9CVF9QQVVTRV9QUk9GSUxFICAgICAgICAgICAgMTI3CisjZGVmaW5lIENPRVhfVFhfTUNJX0dQTV9XTEFOX1NFVF9BQ0xfSU5BQ1RJVklUWSAgICAgMTI4CisjZGVmaW5lIENPRVhfUlhfTUNJX0dQTV9CVF9BQ0xfSU5BQ1RJVklUWV9SRVBPUlQgICAgMTI5CisjZGVmaW5lIENPRVhfR0VORVJJQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwCisjZGVmaW5lIENPRVhfUlhfUkFURV9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgMTMxCisjZGVmaW5lIENPRVhfUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMyCisKKyNkZWZpbmUgQ09FWF9XTEFOX1ZERVZfTk9USUZfU1RBUlQgICAgICAgICAgICAgICAgICAxMzMKKyNkZWZpbmUgQ09FWF9XTEFOX1ZERVZfTk9USUZfVVAgICAgICAgICAgICAgICAgICAgICAxMzQKKyNkZWZpbmUgQ09FWF9XTEFOX1ZERVZfTk9USUZfRE9XTiAgICAgICAgICAgICAgICAgICAxMzUKKyNkZWZpbmUgQ09FWF9XTEFOX1ZERVZfTk9USUZfU1RPUCAgICAgICAgICAgICAgICAgICAxMzYKKyNkZWZpbmUgQ09FWF9XTEFOX1ZERVZfTk9USUZfQUREX1BFRVIgICAgICAgICAgICAgICAxMzcKKyNkZWZpbmUgQ09FWF9XTEFOX1ZERVZfTk9USUZfREVMRVRFX1BFRVIgICAgICAgICAgICAxMzgKKyNkZWZpbmUgQ09FWF9XTEFOX1ZERVZfTk9USUZfQ09OTkVDVEVEX1BFRVIgICAgICAgICAxMzkKKyNkZWZpbmUgQ09FWF9XTEFOX1ZERVZfTk9USUZfUEFVU0UgICAgICAgICAgICAgICAgICAxNDAKKyNkZWZpbmUgQ09FWF9XTEFOX1ZERVZfTk9USUZfVU5QQVVTRUQgICAgICAgICAgICAgICAxNDEKKyNkZWZpbmUgQ09FWF9TVEFURV9XTEFOX1ZERVZfUEVFUl9BREQgICAgICAgICAgICAgICAxNDIKKyNkZWZpbmUgQ09FWF9TVEFURV9XTEFOX1ZERVZfQ09OTkVDVEVEX1BFRVIgICAgICAgICAxNDMKKyNkZWZpbmUgQ09FWF9TVEFURV9XTEFOX1ZERVZfREVMRVRFX1BFRVIgICAgICAgICAgICAxNDQKKyNkZWZpbmUgQ09FWF9TVEFURV9XTEFOX1ZERVZfUEFVU0UgICAgICAgICAgICAgICAgICAxNDUKKyNkZWZpbmUgQ09FWF9TVEFURV9XTEFOX1ZERVZfVU5QQVVTRUQgICAgICAgICAgICAgICAxNDYKKyNkZWZpbmUgQ09FWF9TQ0FOX0NBTExCQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAxNDcKKyNkZWZpbmUgQ09FWF9SQ19TRVRfQ0hBSU5NQVNLICAgICAgICAgICAgICAgICAgICAgICAxNDgKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX1dMQU5fU0VUX0JUX1JYU1NfVEhSRVMgICAgICAxNDkKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX0JUX1JYU1NfVEhSRVNfUVVFUlkgICAgICAgICAxNTAKKyNkZWZpbmUgQ09FWF9CVF9SWFNTX1RIUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAxNTEKKyNkZWZpbmUgQ09FWF9CVF9QUk9GSUxFX0FERF9STVYgICAgICAgICAgICAgICAgICAgICAxNTIKKyNkZWZpbmUgQ09FWF9CVF9TQ0hFRF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAxNTMKKyNkZWZpbmUgQ09FWF9UUkZfTUdNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTQKKyNkZWZpbmUgQ09FWF9TQ0hFRF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTUKKyNkZWZpbmUgQ09FWF9TQ0hFRF9SRVNVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTYKKyNkZWZpbmUgQ09FWF9TQ0hFRF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTcKKyNkZWZpbmUgQ09FWF9TQ0hFRF9QUkVfT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTgKKyNkZWZpbmUgQ09FWF9TQ0hFRF9QT1NUX09QICAgICAgICAgICAgICAgICAgICAgICAgICAxNTkKKyNkZWZpbmUgQ09FWF9SWF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAKKyNkZWZpbmUgQ09FWF9BQ0tfUFJJT1JJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjEKKyNkZWZpbmUgQ09FWF9TVEFURV9XTEFOX1ZERVZfVVAgICAgICAgICAgICAgICAgICAgICAxNjIKKyNkZWZpbmUgQ09FWF9TVEFURV9XTEFOX1ZERVZfUEVFUl9VUERBVEUgICAgICAgICAgICAxNjMKKyNkZWZpbmUgQ09FWF9TVEFURV9XTEFOX1ZERVZfU1RPUCAgICAgICAgICAgICAgICAgICAxNjQKKyNkZWZpbmUgQ09FWF9XTEFOX1BBVVNFX1BFRVIgICAgICAgICAgICAgICAgICAgICAgICAxNjUKKyNkZWZpbmUgQ09FWF9XTEFOX1VOUEFVU0VfUEVFUiAgICAgICAgICAgICAgICAgICAgICAxNjYKKyNkZWZpbmUgQ09FWF9XTEFOX1BBVVNFX0lOVEVSVkFMX1NUQVJUICAgICAgICAgICAgICAxNjcKKyNkZWZpbmUgQ09FWF9XTEFOX1BPU1RQQVVTRV9JTlRFUlZBTF9TVEFSVCAgICAgICAgICAxNjgKKyNkZWZpbmUgQ09FWF9UUkZfRlJFRVJVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjkKKyNkZWZpbmUgQ09FWF9UUkZfU0hBUEVfUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAxNzAKKyNkZWZpbmUgQ09FWF9UUkZfU0hBUEVfUFNQICAgICAgICAgICAgICAgICAgICAgICAgICAxNzEKKyNkZWZpbmUgQ09FWF9UUkZfU0hBUEVfU19DVFMgICAgICAgICAgICAgICAgICAgICAgICAxNzIKKyNkZWZpbmUgQ09FWF9DSEFJTl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzMKKyNkZWZpbmUgQ09FWF9TWVNURU1fTU9OSVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAxNzQKKyNkZWZpbmUgQ09FWF9TSU5HTEVDSEFJTl9JTklUICAgICAgICAgICAgICAgICAgICAgICAxNzUKKyNkZWZpbmUgQ09FWF9NVUxUSUNIQUlOX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAxNzYKKyNkZWZpbmUgQ09FWF9TSU5HTEVDSEFJTl9EQkdfMSAgICAgICAgICAgICAgICAgICAgICAxNzcKKyNkZWZpbmUgQ09FWF9TSU5HTEVDSEFJTl9EQkdfMiAgICAgICAgICAgICAgICAgICAgICAxNzgKKyNkZWZpbmUgQ09FWF9TSU5HTEVDSEFJTl9EQkdfMyAgICAgICAgICAgICAgICAgICAgICAxNzkKKyNkZWZpbmUgQ09FWF9NVUxUSUNIQUlOX0RCR18xICAgICAgICAgICAgICAgICAgICAgICAxODAKKyNkZWZpbmUgQ09FWF9NVUxUSUNIQUlOX0RCR18yICAgICAgICAgICAgICAgICAgICAgICAxODEKKyNkZWZpbmUgQ09FWF9NVUxUSUNIQUlOX0RCR18zICAgICAgICAgICAgICAgICAgICAgICAxODIKKyNkZWZpbmUgQ09FWF9QU1BfVFhfQ0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODMKKyNkZWZpbmUgQ09FWF9QU1BfUlhfQ0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODQKKyNkZWZpbmUgQ09FWF9QU1BfU1RBVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODUKKyNkZWZpbmUgQ09FWF9QU1BfU1BFQ19QT0xMICAgICAgICAgICAgICAgICAgICAgICAgICAxODYKKyNkZWZpbmUgQ09FWF9QU1BfUkVBRFlfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAxODcKKyNkZWZpbmUgQ09FWF9QU1BfVFhfU1RBVFVTX1NUQVRFICAgICAgICAgICAgICAgICAgICAxODgKKyNkZWZpbmUgQ09FWF9QU1BfUlhfU1RBVFVTX1NUQVRFXzEgICAgICAgICAgICAgICAgICAxODkKKyNkZWZpbmUgQ09FWF9QU1BfTk9UX1JFQURZX1NUQVRFICAgICAgICAgICAgICAgICAgICAxOTAKKyNkZWZpbmUgQ09FWF9QU1BfRElTQUJMRURfU1RBVEUgICAgICAgICAgICAgICAgICAgICAxOTEKKyNkZWZpbmUgQ09FWF9QU1BfRU5BQkxFRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAxOTIKKyNkZWZpbmUgQ09FWF9QU1BfU0VORF9QU1BPTEwgICAgICAgICAgICAgICAgICAgICAgICAxOTMKKyNkZWZpbmUgQ09FWF9QU1BfTUdSX0VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQKKyNkZWZpbmUgQ09FWF9QU1BfTUdSX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAxOTUKKyNkZWZpbmUgQ09FWF9QU1BfTk9OV0xBTl9JTlRFUlZBTCAgICAgICAgICAgICAgICAgICAxOTYKKyNkZWZpbmUgQ09FWF9QU1BfU1RBVF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTcKKyNkZWZpbmUgQ09FWF9QU1BfUlhfU1RBVFVTX1NUQVRFXzIgICAgICAgICAgICAgICAgICAxOTgKKyNkZWZpbmUgQ09FWF9QU1BfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTkKKyNkZWZpbmUgQ09FWF9UMkJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAKKyNkZWZpbmUgQ09FWF9CVF9EVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDEKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX1dMQU5fU0NIRURfSU5GT19UUklHICAgICAgICAyMDIKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX1dMQU5fU0NIRURfSU5GT19UUklHX1JTUCAgICAyMDMKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX1NDQU5fT1AgICAgICAgICAgICAgICAgICAgICAyMDQKKyNkZWZpbmUgQ09FWF9UWF9NQ0lfR1BNX0JUX1BBVVNFX0dQTV9UWCAgICAgICAgICAgICAyMDUKKyNkZWZpbmUgQ09FWF9DVFMyU19TRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDYKKyNkZWZpbmUgQ09FWF9DVFMyU19SRVNVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDcKKyNkZWZpbmUgQ09FWF9FTlRFUl9PQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDgKKyNkZWZpbmUgQ09FWF9FWElUX09DUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDkKKyNkZWZpbmUgQ09FWF9VUERBVEVfT0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTAKKyNkZWZpbmUgQ09FWF9TVEFUVVNfT0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTEKKyNkZWZpbmUgQ09FWF9TVEFUU19CVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTIKKworI2RlZmluZSBDT0VYX01XU19XTEFOX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMworI2RlZmluZSBDT0VYX01XU19XQlRNUl9TWU5DICAgICAgICAgICAgICAgICAgICAgICAgIDIxNAorI2RlZmluZSBDT0VYX01XU19UWVBFMl9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNQorI2RlZmluZSBDT0VYX01XU19UWVBFMl9UWCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNgorI2RlZmluZSBDT0VYX01XU19XTEFOX0NIQVZEICAgICAgICAgICAgICAgICAgICAgICAgIDIxNworI2RlZmluZSBDT0VYX01XU19XTEFOX0NIQVZEX0lOU0VSVCAgICAgICAgICAgICAgICAgIDIxOAorI2RlZmluZSBDT0VYX01XU19XTEFOX0NIQVZEX01FUkdFICAgICAgICAgICAgICAgICAgIDIxOQorI2RlZmluZSBDT0VYX01XU19XTEFOX0NIQVZEX1JQVCAgICAgICAgICAgICAgICAgICAgIDIyMAorI2RlZmluZSBDT0VYX01XU19DUF9NU0dfU0VORCAgICAgICAgICAgICAgICAgICAgICAgIDIyMQorI2RlZmluZSBDT0VYX01XU19DUF9FU0NBUEUgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMgorI2RlZmluZSBDT0VYX01XU19DUF9VTkZSQU1FICAgICAgICAgICAgICAgICAgICAgICAgIDIyMworI2RlZmluZSBDT0VYX01XU19DUF9TWU5DX1VQREFURSAgICAgICAgICAgICAgICAgICAgIDIyNAorI2RlZmluZSBDT0VYX01XU19DUF9TWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNQorI2RlZmluZSBDT0VYX01XU19DUF9XTEFOX1NUQVRFX0lORCAgICAgICAgICAgICAgICAgIDIyNgorI2RlZmluZSBDT0VYX01XU19DUF9TWU5DUkVTUF9USU1FT1VUICAgICAgICAgICAgICAgIDIyNworI2RlZmluZSBDT0VYX01XU19TQ0hFTUVfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgIDIyOAorI2RlZmluZSBDT0VYX01XU19XTEFOX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgIDIyOQorI2RlZmluZSBDT0VYX01XU19VQVJUX1VORVNDQVBFICAgICAgICAgICAgICAgICAgICAgIDIzMAorI2RlZmluZSBDT0VYX01XU19VQVJUX0VOQ09ERV9TRU5EICAgICAgICAgICAgICAgICAgIDIzMQorI2RlZmluZSBDT0VYX01XU19VQVJUX1JFQ1ZfREVDT0RFICAgICAgICAgICAgICAgICAgIDIzMgorI2RlZmluZSBDT0VYX01XU19VTF9IREwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzMworI2RlZmluZSBDT0VYX01XU19SRU1PVEVfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgIDIzNAorI2RlZmluZSBDT0VYX01XU19PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNQorI2RlZmluZSBDT0VYX01XU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNgorI2RlZmluZSBDT0VYX01XU19BTlRfRElWRVJTSVRZICAgICAgICAgICAgICAgICAgICAgIDIzNworCisjZGVmaW5lIENPRVhfUDJQX0dPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM4CisjZGVmaW5lIENPRVhfUDJQX0NMSUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM5CisjZGVmaW5lIENPRVhfU0NDXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwCisjZGVmaW5lIENPRVhfU0NDXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQxCisjZGVmaW5lIENPRVhfTUNDXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQyCisjZGVmaW5lIENPRVhfTUNDXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQzCisjZGVmaW5lIENPRVhfVFJGX1NIQVBFX05PQSAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ0CisjZGVmaW5lIENPRVhfTk9BX09ORVNIT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ1CisjZGVmaW5lIENPRVhfTk9BX1BFUklPRElDICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ2CisjZGVmaW5lIENPRVhfTEVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ3CisjZGVmaW5lIENPRVhfTEVfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ4CisjZGVmaW5lIENPRVhfQU5UXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ5CisjZGVmaW5lIENPRVhfQU5UXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwCisjZGVmaW5lIENPRVhfRU5URVJfTk9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUxCisjZGVmaW5lIENPRVhfRVhJVF9OT0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUyCisjZGVmaW5lIENPRVhfQlRfU0NBTl9QUk9URUNUICAgICAgICAgICAgICAgICAgICAgICAgMjUzCisKKyNkZWZpbmUgQ09FWF9ERUJVR19JRF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTQKKworI2RlZmluZSBTQ0FOX1NUQVJUX0NPTU1BTkRfRkFJTEVEICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0NBTl9TVE9QX0NPTU1BTkRfRkFJTEVEICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNDQU5fRVZFTlRfU0VORF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTQ0FOX0VOR0lORV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0NBTl9FTkdJTkVfQ0FOQ0VMX0NPTU1BTkQgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFNDQU5fRU5HSU5FX1NUT1BfRFVFX1RPX1RJTUVPVVQgICAgICAgICAgICAgNQorI2RlZmluZSBTQ0FOX0VWRU5UX1NFTkRfVE9fSE9TVCAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU0NBTl9GV0xPR19FVkVOVF9BREQgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFNDQU5fRldMT0dfRVZFTlRfUkVNICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBTQ0FOX0ZXTE9HX0VWRU5UX1BSRUVNUFRFRCAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgU0NBTl9GV0xPR19FVkVOVF9SRVNUQVJURUQgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBTQ0FOX0ZXTE9HX0VWRU5UX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFNDQU5fU01fUkVRX05FWFRfQ0ggICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgU0NBTl9EQkdJRF9ERUZJTklUSU9OX0VORCAgICAgICAgICAgICAgICAgICAxMworCisjZGVmaW5lIEJFQUNPTl9FVkVOVF9TV0JBX1NFTkRfRkFJTEVEICAgICAgICAgICAgICAgMAorI2RlZmluZSBCRUFDT05fRVZFTlRfRUFSTFlfUlhfQk1JU1NfU1RBVFVTICAgICAgICAgIDEKKyNkZWZpbmUgQkVBQ09OX0VWRU5UX0VBUkxZX1JYX1NMRUVQX1NMT1AgICAgICAgICAgICAyCisjZGVmaW5lIEJFQUNPTl9FVkVOVF9FQVJMWV9SWF9DT05UX0JNSVNTX1RJTUVPVVQgICAgMworI2RlZmluZSBCRUFDT05fRVZFTlRfRUFSTFlfUlhfUEFVU0VfU0tJUF9CQ05fTlVNICAgIDQKKyNkZWZpbmUgQkVBQ09OX0VWRU5UX0VBUkxZX1JYX0NMS19EUklGVCAgICAgICAgICAgICA1CisjZGVmaW5lIEJFQUNPTl9FVkVOVF9FQVJMWV9SWF9BUF9EUklGVCAgICAgICAgICAgICAgNgorI2RlZmluZSBCRUFDT05fRVZFTlRfRUFSTFlfUlhfQkNOX1RZUEUgICAgICAgICAgICAgIDcKKworI2RlZmluZSBSQVRFQ1RSTF9EQkdJRF9ERUZJTklUSU9OX1NUQVJUICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkFURUNUUkxfREJHSURfQVNTT0MgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJBVEVDVFJMX0RCR0lEX05TU19DSEFOR0UgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSQVRFQ1RSTF9EQkdJRF9DSEFJTk1BU0tfRVJSICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUkFURUNUUkxfREJHSURfVU5FWFBFQ1RFRF9GUkFNRSAgICAgICAgICAgICA0CisjZGVmaW5lIFJBVEVDVFJMX0RCR0lEX1dBTF9SQ1FVRVJZICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBSQVRFQ1RSTF9EQkdJRF9XQUxfUkNVUERBVEUgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkFURUNUUkxfREJHSURfR1RYX1VQREFURSAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFJBVEVDVFJMX0RCR0lEX0RFRklOSVRJT05fRU5EICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIEFQX1BTX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9QU19EQkdJRF9VUERBVEVfVElNICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBfUFNfREJHSURfUEVFUl9TVEFURV9DSEFOR0UgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQX1BTX0RCR0lEX1BTUE9MTCAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUF9QU19EQkdJRF9QRUVSX0NSRUFURSAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBfUFNfREJHSURfUEVFUl9ERUxFVEUgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEFQX1BTX0RCR0lEX1ZERVZfQ1JFQVRFICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBBUF9QU19EQkdJRF9WREVWX0RFTEVURSAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQVBfUFNfREJHSURfU1lOQ19USU0gICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEFQX1BTX0RCR0lEX05FWFRfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBBUF9QU19EQkdJRF9TVEFSVF9TUCAgICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEFQX1BTX0RCR0lEX0NPTVBMRVRFRF9FT1NQICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgQVBfUFNfREJHSURfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBBUF9QU19EQkdJRF9EVVBMSUNBVEVfVFJJR0dFUiAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIEFQX1BTX0RCR0lEX1VBUFNEX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQVBfUFNfREJHSURfU0VORF9DT01QTEVURSAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBBUF9QU19EQkdJRF9TRU5EX05fQ09NUExFVEUgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEFQX1BTX0RCR0lEX0RFVEVDVF9PVVRfT0ZfU1lOQ19TVEEgICAgICAgICAgMTcKKyNkZWZpbmUgQVBfUFNfREJHSURfREVMSVZFUl9DQUIgICAgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBBUF9QU19EQkdJRF9OT19DTElFTlQgICAgICAgICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIEFQX1BTX0RCR0lEX0NMSUVOVF9JTl9QU19BQ1RJVkUgICAgICAgICAgICAgMjgKKyNkZWZpbmUgQVBfUFNfREJHSURfQ0xJRU5UX0lOX1BTX05PTl9BQ1RJVkUgICAgICAgICAyOQorI2RlZmluZSBBUF9QU19EQkdJRF9DTElFTlRfSU5fQVdBS0UgICAgICAgICAgICAgICAgIDMwCisKKy8qIFdMQU5fTU9EVUxFX01HTVRfVFhSWCBEZWJ1Z2lkcyovCisjZGVmaW5lIE1HTVRfVFhSWF9EQkdJRF9ERUZJTklUSU9OX1NUQVJUICAgICAgICAgICAgMAorI2RlZmluZSBNR01UX1RYUlhfRk9SV0FSRF9UT19IT1NUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUdNVF9UWFJYX01HTVRfRlJBTUVfQlVGRkVSX0ZVTEwgICAgICAgICAgICAyCisjZGVmaW5lIE1HTVRfVFhSWF9WREVWX1VTRURfVE9fU0VORF9GUkFNRV9JU19GUkVFICAgMworI2RlZmluZSBNR01UX1RYUlhfTE9DQUxfRlJBTUVfU0VORF9GQUlMRUQgICAgICAgICAgIDQKKyNkZWZpbmUgTUdNVF9UWFJYX0RCR0lEX0RFRklOSVRJT05fRU5EICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgV0FMX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdBTF9EQkdJRF9GQVNUX1dBS0VfUkVRVUVTVCAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXQUxfREJHSURfRkFTVF9XQUtFX1JFTEVBU0UgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV0FMX0RCR0lEX1NFVF9QT1dFUl9TVEFURSAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFdBTF9EQkdJRF9DSEFOTkVMX0NIQU5HRV9GT1JDRV9SRVNFVCAgICAgICAgNQorI2RlZmluZSBXQUxfREJHSURfQ0hBTk5FTF9DSEFOR0UgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV0FMX0RCR0lEX1ZERVZfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFdBTF9EQkdJRF9WREVWX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXQUxfREJHSURfVkRFVl9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV0FMX0RCR0lEX1ZERVZfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXQUxfREJHSURfU1dfV0RPR19SRVNFVCAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFdBTF9EQkdJRF9UWF9TQ0hfUkVHSVNURVJfVElEUSAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV0FMX0RCR0lEX1RYX1NDSF9VTlJFR0lTVEVSX1RJRFEgICAgICAgICAgICAxMworI2RlZmluZSBXQUxfREJHSURfVFhfU0NIX1RJQ0tMRV9USURRICAgICAgICAgICAgICAgIDE0CisKKyNkZWZpbmUgV0FMX0RCR0lEX1hDRVNTX0ZBSUxVUkVTICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBXQUxfREJHSURfQVNUX0FERF9XRFNfRU5UUlkgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFdBTF9EQkdJRF9BU1RfREVMX1dEU19FTlRSWSAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgV0FMX0RCR0lEX0FTVF9XRFNfRU5UUllfUEVFUl9DSEcgICAgICAgICAgICAxOAorI2RlZmluZSBXQUxfREJHSURfQVNUX1dEU19TUkNfTEVBUk5fRkFJTCAgICAgICAgICAgIDE5CisjZGVmaW5lIFdBTF9EQkdJRF9TVEFfS0lDS09VVCAgICAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgV0FMX0RCR0lEX0JBUl9UWF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBXQUxfREJHSURfQkFSX0FMTE9DX0ZBSUwgICAgICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIFdBTF9EQkdJRF9MT0NBTF9EQVRBX1RYX0ZBSUwgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgV0FMX0RCR0lEX1NFQ1VSSVRZX1BNNF9RVUVVRUQgICAgICAgICAgICAgICAyNAorI2RlZmluZSBXQUxfREJHSURfU0VDVVJJVFlfR00xX1FVRVVFRCAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIFdBTF9EQkdJRF9TRUNVUklUWV9QTTRfU0VOVCAgICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgV0FMX0RCR0lEX1NFQ1VSSVRZX0FMTE9XX0RBVEEgICAgICAgICAgICAgICAyNworI2RlZmluZSBXQUxfREJHSURfU0VDVVJJVFlfVUNBU1RfS0VZX1NFVCAgICAgICAgICAgIDI4CisjZGVmaW5lIFdBTF9EQkdJRF9TRUNVUklUWV9NQ0FTVF9LRVlfU0VUICAgICAgICAgICAgMjkKKyNkZWZpbmUgV0FMX0RCR0lEX1NFQ1VSSVRZX0VOQ1JfRU4gICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBXQUxfREJHSURfQkJfV0RPR19UUklHR0VSRUQgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFdBTF9EQkdJRF9SWF9MT0NBTF9CVUZTX0xXTSAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgV0FMX0RCR0lEX1JYX0xPQ0FMX0RST1BfTEFSR0VfTUdNVCAgICAgICAgICAzMworI2RlZmluZSBXQUxfREJHSURfVkhUX0lMTEVHQUxfUkFURV9QSFlfRVJSX0RFVEVDVEVEIDM0CisjZGVmaW5lIFdBTF9EQkdJRF9ERVZfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgV0FMX0RCR0lEX1RYX0JBX1NFVFVQICAgICAgICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBXQUxfREJHSURfUlhfQkFfU0VUVVAgICAgICAgICAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIFdBTF9EQkdJRF9ERVZfVFhfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgMzgKKyNkZWZpbmUgV0FMX0RCR0lEX0RFVl9SWF9USU1FT1VUICAgICAgICAgICAgICAgICAgICAzOQorI2RlZmluZSBXQUxfREJHSURfU1RBX1ZERVZfWFJFVFJZICAgICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIFdBTF9EQkdJRF9EQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgV0FMX0RCR0lEX01HTVRfVFhfRkFJTCAgICAgICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBXQUxfREJHSURfU0VUX000X1NFTlRfTUFOVUFMTFkgICAgICAgICAgICAgIDQzCisjZGVmaW5lIFdBTF9EQkdJRF9QUk9DRVNTXzRfV0FZX0hBTkRTSEFLRSAgICAgICAgICAgNDQKKyNkZWZpbmUgV0FMX0RCR0lEX1dBTF9DSEFOTkVMX0NIQU5HRV9TVEFSVCAgICAgICAgICA0NQorI2RlZmluZSBXQUxfREJHSURfV0FMX0NIQU5ORUxfQ0hBTkdFX0NPTVBMRVRFICAgICAgIDQ2CisjZGVmaW5lIFdBTF9EQkdJRF9XSEFMX0NIQU5ORUxfQ0hBTkdFX1NUQVJUICAgICAgICAgNDcKKyNkZWZpbmUgV0FMX0RCR0lEX1dIQUxfQ0hBTk5FTF9DSEFOR0VfQ09NUExFVEUgICAgICA0OAorI2RlZmluZSBXQUxfREJHSURfVFhfTUdNVF9ERVNDSURfU0VRX1RZUEVfTEVOICAgICAgIDQ5CisjZGVmaW5lIFdBTF9EQkdJRF9UWF9EQVRBX01TRFVJRF9TRVFfVFlQRV9MRU4gICAgICAgNTAKKyNkZWZpbmUgV0FMX0RCR0lEX1RYX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICA1MQorI2RlZmluZSBXQUxfREJHSURfVFhfTUdNVF9DT01QX0RFU0NJRF9TVEFUVVMgICAgICAgIDUyCisjZGVmaW5lIFdBTF9EQkdJRF9UWF9EQVRBX0NPTVBfTVNEVUlEX1NUQVRVUyAgICAgICAgNTMKKyNkZWZpbmUgV0FMX0RCR0lEX1JFU0VUX1BDVV9DWUNMRV9DTlQgICAgICAgICAgICAgICA1NAorI2RlZmluZSBXQUxfREJHSURfU0VUVVBfUlNTSV9JTlRFUlJVUFRTICAgICAgICAgICAgIDU1CisjZGVmaW5lIFdBTF9EQkdJRF9CUlNTSV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgNTYKKyNkZWZpbmUgV0FMX0RCR0lEX0NVUlJFTlRfQlJTU0lfQVZFICAgICAgICAgICAgICAgICA1NworI2RlZmluZSBXQUxfREJHSURfQkNOX1RYX0NPTVAgICAgICAgICAgICAgICAgICAgICAgIDU4CisjZGVmaW5lIFdBTF9EQkdJRF9SWF9SRUVOVFJZICAgICAgICAgICAgICAgICAgICAgICAgNTkKKyNkZWZpbmUgV0FMX0RCR0lEX1NFVF9IV19DSEFJTk1BU0sgICAgICAgICAgICAgICAgICA2MAorI2RlZmluZSBXQUxfREJHSURfU0VUX0hXX0NIQUlOTUFTS19UWFJYX1NUT1BfRkFJTCAgIDYxCisjZGVmaW5lIFdBTF9EQkdJRF9HRVRfSFdfQ0hBSU5NQVNLICAgICAgICAgICAgICAgICAgNjIKKyNkZWZpbmUgV0FMX0RCR0lEX1NNUFNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICA2MworI2RlZmluZSBXQUxfREJHSURfU01QU19FTkFCTEVfSFdfQ05UUkwgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFdBTF9EQkdJRF9TTVBTX1NXU0VMX0NIQUlOTUFTSyAgICAgICAgICAgICAgNjUKKyNkZWZpbmUgV0FMX0RCR0lEX1NVU1BFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICA2NgorI2RlZmluZSBXQUxfREJHSURfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY3CisjZGVmaW5lIFdBTF9EQkdJRF9QRUVSX1RYX0ZBSUxfQ05UX1RIUkVTX0VYQ0VFREVEICAgNjgKKyNkZWZpbmUgV0FMX0RCR0lEX1JYX0ZVTExfUkVPUkRFUl9TVVBQT1JUICAgICAgICAgICA2OQorI2RlZmluZSBXQUxfREJHSURfSENNX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwCisjZGVmaW5lIFdBTF9EQkdJRF9IQ01fQklOX1BFTkFMSVpFICAgICAgICAgICAgICAgICAgNzEKKyNkZWZpbmUgV0FMX0RCR0lEX0hDTV9CSU5fREVQRU5BTElaRSAgICAgICAgICAgICAgICA3MgorI2RlZmluZSBXQUxfREJHSURfQVNUX1VQREFURV9XRFNfRU5UUlkgICAgICAgICAgICAgIDczCisjZGVmaW5lIFdBTF9EQkdJRF9QRUVSX0VYVF9TVEFUUyAgICAgICAgICAgICAgICAgICAgNzQKKyNkZWZpbmUgV0FMX0RCR0lEX1RYX0FDX0JVRkZFUl9TRVQgICAgICAgICAgICAgICAgICA3NQorI2RlZmluZSBXQUxfREJHSURfQVNUX0VOVFJZX0VYSVNUICAgICAgICAgICAgICAgICAgIDc2CisjZGVmaW5lIFdBTF9EQkdJRF9BU1RfRU5UUllfRlVMTCAgICAgICAgICAgICAgICAgICAgNzcKKyNkZWZpbmUgV0FMX0RCR0lEX1dNTUFDX1RYUV9TVEFUVVMgICAgICAgICAgICAgICAgICA3OAorI2RlZmluZSBXQUxfREJHSURfUFJPTE9OR0VEX1RYX1BQRFVfVE9UQUxfVVMgICAgICAgIDc5CisjZGVmaW5lIFdBTF9EQkdJRF9VUERBVEVfVVNFRF9USU1FICAgICAgICAgICAgICAgICAgODAKKyNkZWZpbmUgV0FMX0RCR0lEX1BBU1RfV0JfQUNLX1RJTUVTVEFNUCAgICAgICAgICAgICA4MQorI2RlZmluZSBXQUxfREJHSURfV01NQUNfQUREX0RFTF9UU1BFQyAgICAgICAgICAgICAgIDgyCisjZGVmaW5lIFdBTF9EQkdJRF9XTU1BQ19USU1FUl9FWFBJUlkgICAgICAgICAgICAgICAgODMKKyNkZWZpbmUgV0FMX0RCR0lEX1dNTUFDX1BBUkFNUyAgICAgICAgICAgICAgICAgICAgICA4NAorI2RlZmluZSBXQUxfREJHSURfVFhfTUdNVF9XQUxfUEVFUl9ET0VTX05PVF9FWElTVCAgIDg1CisjZGVmaW5lIFdBTF9EQkdJRF9UWF9NR01UX1dBTF9QRUVSX0RFTEVURV9JTl9QUk9HUkVTUyA4NgorI2RlZmluZSBXQUxfREJHSURfVFhfTUdNVF9GUkFNRV9ERVNDX0FMTE9DX0ZBSUxFRCAgIDg3CisjZGVmaW5lIFdBTF9EQkdJRF9UWF9NR01UX1RJRF9TVFJVQ1RfTk9UX0ZPVU5EICAgICAgODgKKyNkZWZpbmUgV0FMX0RCR0lEX1RYX01HTVRfRU5RVUVVRV9GQUlMRUQgICAgICAgICAgICA4OQorI2RlZmluZSBXQUxfREJHSURfREVGSU5JVElPTl9FTkQgICAgICAgICAgICAgICAgICAgIDkwCisKKyNkZWZpbmUgQU5JX0RCR0lEX1BPTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBTklfREJHSURfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFOSV9EQkdJRF9PRkRNX1BBUkFNUyAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQU5JX0RCR0lEX0NDS19QQVJBTVMgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBTklfREJHSURfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFOSV9EQkdJRF9SRVNUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQU5JX0RCR0lEX09GRE1fTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBBTklfREJHSURfQ0NLX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIEFOSV9EQkdJRF9GSVJTVEVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQU5JX0RCR0lEX0NZQ1BXUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBBTklfREJHSURfTVJDX0NDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEFOSV9EQkdJRF9TRUxGX0NPUlJfTE9XICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgQU5JX0RCR0lEX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgorCisjZGVmaW5lIEFOSV9EQkdJRF9DVVJSRU5UX0xFVkVMICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQU5JX0RCR0lEX1BPTExfUEVSSU9EICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBBTklfREJHSURfTElTVEVOX1BFUklPRCAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFOSV9EQkdJRF9PRkRNX0xFVkVMX0NGRyAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQU5JX0RCR0lEX0NDS19MRVZFTF9DRkcgICAgICAgICAgICAgICAgICAgICAxNworCisvKiBPRkZMT0FEIE1hbmFnZXIgRGVidWdpZHMqLworI2RlZmluZSBPRkZMT0FEX01HUl9EQkdJRF9ERUZJTklUSU9OX1NUQVJUICAgICAgICAgICAgIDAKKyNkZWZpbmUgT0ZGTE9BRE1HUl9SRUdJU1RFUl9PRkZMT0FEICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE9GRkxPQURNR1JfREVSRUdJU1RFUl9PRkZMT0FEICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBPRkZMT0FETUdSX05PX1JFR19EQVRBX0hBTkRMRVJTICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgT0ZGTE9BRE1HUl9OT19SRUdfRVZFTlRfSEFORExFUlMgICAgICAgICAgICAgICA0CisjZGVmaW5lIE9GRkxPQURNR1JfUkVHX09GRkxPQURfRkFJTEVEICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBPRkZMT0FETUdSX0RFUkVHX09GRkxPQURfRkFJTEVEICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgT0ZGTE9BRE1HUl9FTlRFUl9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIE9GRkxPQURNR1JfRVhJVF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBPRkZMT0FETUdSX0RCR0lEX0RFRklOSVRJT05fRU5EICAgICAgICAgICAgICAgIDkKKworLypSZXNvdXJjZSBEZWJ1ZyBJRHMqLworI2RlZmluZSBSRVNPVVJDRV9EQkdJRF9ERUZJTklUSU9OX1NUQVJUICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVTT1VSQ0VfUEVFUl9BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJFU09VUkNFX1BFRVJfRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSRVNPVVJDRV9QRUVSX0FMTE9DX1dBTF9QRUVSICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUkVTT1VSQ0VfUEVFUl9OQlJIT09EX01HTVRfQUxMT0MgICAgICAgICAgICA0CisjZGVmaW5lIFJFU09VUkNFX1BFRVJfTkJSSE9PRF9NR01UX0lORk8gICAgICAgICAgICAgNQorI2RlZmluZSBSRVNPVVJDRV9TTUFMTF9NR01UX0JVRl9GVUxMICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkVTT1VSQ0VfTUdNVF9BVkFJTF9CVUZfQ05UX05PVF9FTk9VR0ggICAgICA3CisjZGVmaW5lIFJFU09VUkNFX01HTVRfQlVGX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBSRVNPVVJDRV9NR01UX0JVRl9JTkMgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgUkVTT1VSQ0VfTUdNVF9CVUZfREVDICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBSRVNPVVJDRV9EQkdJRF9ERUZJTklUSU9OX0VORCAgICAgICAgICAgICAgIDExCisKKy8qIERDUyBkZWJ1ZyBJRHMqLworI2RlZmluZSBXTEFOX0RDU19EQkdJRF9JTklUICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV0xBTl9EQ1NfREJHSURfV01JX0NXSU5UICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdMQU5fRENTX0RCR0lEX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXTEFOX0RDU19EQkdJRF9DTURHICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV0xBTl9EQ1NfREJHSURfQ01EUyAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdMQU5fRENTX0RCR0lEX0RJTklUICAgICAgICAgICAgICAgICAgICAgICAgNQorCisvKlAyUCBNb2R1bGUgaWRzKi8KKyNkZWZpbmUgUDJQX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUDJQX0RFVl9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUDJQX0hBTkRMRV9OT0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUDJQX1VQREFURV9TQ0hFRFVMRV9PUFBTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUDJQX1VQREFURV9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUDJQX1VQREFURV9TVEFSVF9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUDJQX1VQREFURV9TVEFSVF9USU1FX0RJRkZfVFNGMzIgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUDJQX1VQREFURV9TVEFSVF9USU1FX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgUDJQX1NFVFVQX1NDSEVEVUxFX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgUDJQX1BST0NFU1NfU0NIRURVTEVfQUZURVJfQ0FMQyAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgUDJQX1BST0NFU1NfU0NIRURVTEVfU1RBUlRFRF9USU1FUiAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFAyUF9DQUxDX1NDSEVEVUxFU19GSVJTVF9DQUxMX0FMTF9ORVhUX0VWRU5UICAgICAgICAxMQorI2RlZmluZSBQMlBfQ0FMQ19TQ0hFRFVMRVNfRklSU1RfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUDJQX0NBTENfU0NIRURVTEVTX0VBUkxJRVNUX05FWFRfRVZFTlQgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFAyUF9DQUxDX1NDSEVEVUxFU19TQU5JVFlfQ09VTlQgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBQMlBfQ0FMQ19TQ0hFRFVMRVNfQ0FMTF9BTExfTkVYVF9FVkVOVF9GUk9NX1dISUxFX0xPT1AgMTUKKyNkZWZpbmUgUDJQX0NBTENfU0NIRURVTEVTX1RJTUVPVVRfMSAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFAyUF9DQUxDX1NDSEVEVUxFU19USU1FT1VUXzIgICAgICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBQMlBfRklORF9BTExfTkVYVF9FVkVOVFNfUkVRX0VYUElSRUQgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgUDJQX0ZJTkRfQUxMX05FWFRfRVZFTlRTX1JFUV9BQ1RJVkUgICAgICAgICAgICAgICAgIDE5CisjZGVmaW5lIFAyUF9GSU5EX05FWFRfRVZFTlRfUkVRX05PVF9TVEFSVEVEICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBQMlBfRklORF9ORVhUX0VWRU5UX1JFUV9DT01QTEVURV9OT05fUEVSSU9ESUMgICAgICAgMjEKKyNkZWZpbmUgUDJQX0ZJTkRfTkVYVF9FVkVOVF9JTl9NSURfT0ZfTk9BICAgICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIFAyUF9GSU5EX05FWFRfRVZFTlRfUkVRX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAyMworI2RlZmluZSBQMlBfU0NIRURVTEVfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgUDJQX0NBTENfU0NIRURVTEVTX0VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIFAyUF9QUk9DRVNTX1NDSEVEVUxFX0VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBQMlBfRklORF9BTExfTkVYVF9FVkVOVFNfSU5ESVZJRFVBTF9SRVFfQUZURVJfQ0hBTkdFICAgIDI3CisjZGVmaW5lIFAyUF9GSU5EX0FMTF9ORVhUX0VWRU5UU19JTkRJVklEVUFMX1JFUV9CRUZPUkVfQ0hBTkdFICAgMjgKKyNkZWZpbmUgUDJQX0ZJTkRfQUxMX05FWFRfRVZFTlRTX0VOVEVSICAgICAgICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFAyUF9GSU5EX05FWFRfRVZFTlRfRU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBQMlBfTk9BX0dPX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgUDJQX05PQV9HT19BQlNFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFAyUF9HT19OT0FfTk9USUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMworI2RlZmluZSBQMlBfR09fVEJUVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgUDJQX0dPX0dFVF9OT0FfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIFAyUF9HT19BRERfT05FX1NIT1RfTk9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBQMlBfR09fR0VUX05PQV9JRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcKKyNkZWZpbmUgUDJQX0dPX0JDTl9UWF9DT01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CisjZGVmaW5lIFAyUF9EQkdJRF9ERUZJTklUSU9OX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOQorCisvKiBDU0EgbW9kdWxlcyBEQkdJRHMgKi8KKyNkZWZpbmUgQ1NBX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgMAorI2RlZmluZSBDU0FfT0ZGTE9BRF9QT09MX0lOSVQgMQorI2RlZmluZSBDU0FfT0ZGTE9BRF9SRUdJU1RFUl9WREVWIDIKKyNkZWZpbmUgQ1NBX09GRkxPQURfREVSRUdJU1RFUl9WREVWIDMKKyNkZWZpbmUgQ1NBX0RFUkVHSVNURVJfVkRFVl9FUlJPUiA0CisjZGVmaW5lIENTQV9PRkZMT0FEX0JFQUNPTl9SRUNFSVZFRCA1CisjZGVmaW5lIENTQV9PRkZMT0FEX0JFQUNPTl9DU0FfUkVDViA2CisjZGVmaW5lIENTQV9PRkZMT0FEX0NTQV9SRUNWX0VSUk9SX0lFIDcKKyNkZWZpbmUgQ1NBX09GRkxPQURfQ1NBX1RJTUVSX0VSUk9SIDgKKyNkZWZpbmUgQ1NBX09GRkxPQURfQ1NBX1RJTUVSX0VYUCA5CisjZGVmaW5lIENTQV9PRkZMT0FEX1dNSV9FVkVOVF9FUlJPUiAxMAorI2RlZmluZSBDU0FfT0ZGTE9BRF9XTUlfRVZFTlRfU0VOVCAxMQorI2RlZmluZSBDU0FfT0ZGTE9BRF9XTUlfQ0hBTlNXSVRDSF9SRUNWIDEyCisjZGVmaW5lIENTQV9EQkdJRF9ERUZJTklUSU9OX0VORCAxMworCisvKiBDaGF0dGVyIG1vZHVsZSBEQkdJRHMgKi8KKyNkZWZpbmUgV0xBTl9DSEFUVEVSX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgMAorI2RlZmluZSBXTEFOX0NIQVRURVJfRU5URVIgMQorI2RlZmluZSBXTEFOX0NIQVRURVJfRVhJVCAyCisjZGVmaW5lIFdMQU5fQ0hBVFRFUl9GSUxURVJfSElUIDMKKyNkZWZpbmUgV0xBTl9DSEFUVEVSX0ZJTFRFUl9NSVNTIDQKKyNkZWZpbmUgV0xBTl9DSEFUVEVSX0ZJTFRFUl9GVUxMIDUKKyNkZWZpbmUgV0xBTl9DSEFUVEVSX0ZJTFRFUl9UTV9BREogIDYKKyNkZWZpbmUgV0xBTl9DSEFUVEVSX0JVRkZFUl9GVUxMICAgIDcKKyNkZWZpbmUgV0xBTl9DSEFUVEVSX1RJTUVPVVQgICAgICAgIDgKKyNkZWZpbmUgV0xBTl9DSEFUVEVSX01DX0ZJTFRFUl9BREQgIDkKKyNkZWZpbmUgV0xBTl9DSEFUVEVSX01DX0ZJTFRFUl9ERUwgIDEwCisjZGVmaW5lIFdMQU5fQ0hBVFRFUl9NQ19GSUxURVJfQUxMT1cgIDExCisjZGVmaW5lIFdMQU5fQ0hBVFRFUl9NQ19GSUxURVJfRFJPUCAgMTIKKyNkZWZpbmUgV0xBTl9DSEFUVEVSX0NPQUxFU0NJTkdfRklMVEVSX0FERCAgICAgIDEzCisjZGVmaW5lIFdMQU5fQ0hBVFRFUl9DT0FMRVNDSU5HX0ZJTFRFUl9ERUwgICAgICAxNAorI2RlZmluZSBXTEFOX0NIQVRURVJfREJHSURfREVGSU5JVElPTl9FTkQgICAgICAgMTUKKworI2RlZmluZSBXT1dfREJHSURfREVGSU5JVElPTl9TVEFSVCAwCisjZGVmaW5lIFdPV19FTkFCTEVfQ01ESUQgMQorI2RlZmluZSBXT1dfUkVDVl9EQVRBX1BLVCAyCisjZGVmaW5lIFdPV19XQUtFX0hPU1RfREFUQSAzCisjZGVmaW5lIFdPV19SRUNWX01HTVQgNAorI2RlZmluZSBXT1dfV0FLRV9IT1NUX01HTVQgNQorI2RlZmluZSBXT1dfUkVDVl9FVkVOVCA2CisjZGVmaW5lIFdPV19XQUtFX0hPU1RfRVZFTlQgNworI2RlZmluZSBXT1dfSU5JVCA4CisjZGVmaW5lIFdPV19SRUNWX01BR0lDX1BLVCA5CisjZGVmaW5lIFdPV19SRUNWX0JJVE1BUF9QQVRURVJOIDEwCisjZGVmaW5lIFdPV19BUF9WREVWX0RJU0FMTE9XICAgIDExCisjZGVmaW5lIFdPV19TVEFfVkRFVl9ESVNBTExPVyAgIDEyCisjZGVmaW5lIFdPV19QMlBHT19WREVWX0RJU0FMTE9XIDEzCisjZGVmaW5lIFdPV19OU19PRkxEX0VOQUJMRSAgICAgICAxNAorI2RlZmluZSBXT1dfQVJQX09GTERfRU5BQkxFICAgICAgMTUKKyNkZWZpbmUgV09XX05TX0FSUF9PRkxEX0RJU0FCTEUgIDE2CisjZGVmaW5lIFdPV19OU19SRUNFSVZFRCAgICAgICAgICAxNworI2RlZmluZSBXT1dfTlNfUkVQTElFRCAgICAgICAgICAgMTgKKyNkZWZpbmUgV09XX0FSUF9SRUNFSVZFRCAgICAgICAgIDE5CisjZGVmaW5lIFdPV19BUlBfUkVQTElFRCAgICAgICAgICAyMAorI2RlZmluZSBXT1dfQkVBQ09OX09GRkxPQURfVFggICAgMjEKKyNkZWZpbmUgV09XX0JFQUNPTl9PRkZMT0FEX0NGRyAgIDIyCisjZGVmaW5lIFdPV19JQlNTX1ZERVZfQUxMT1cgICAgICAyMworI2RlZmluZSBXT1dfREJHSURfREVGSU5JVElPTl9FTkQgMjQKKworLyogU1dCTUlTUyBtb2R1bGUgREJHSURzICovCisjZGVmaW5lIFNXQk1JU1NfREJHSURfREVGSU5JVElPTl9TVEFSVCAgMAorI2RlZmluZSBTV0JNSVNTX0VOQUJMRUQgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1dCTUlTU19ESVNBQkxFRCAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNXQk1JU1NfVVBEQVRFX0JFQUNPTl9SU1NJICAgICAgMworI2RlZmluZSBTV0JNSVNTX0RCR0lEX0RFRklOSVRJT05fRU5EICAgIDQKKworLyogV0xBTiBtb2R1bGUgREJHSURTICovCisjZGVmaW5lIFJPQU1fREJHSURfREVGSU5JVElPTl9TVEFSVCAwCisjZGVmaW5lIFJPQU1fTU9EVUxFX0lOSVQgICAgICAgICAgIDEKKyNkZWZpbmUgUk9BTV9ERVZfU1RBUlQgICAgICAgICAgICAgMgorI2RlZmluZSBST0FNX0NPTkZJR19SU1NJX1RIUkVTSCAgICAzCisjZGVmaW5lIFJPQU1fQ09ORklHX1NDQU5fUEVSSU9EICAgIDQKKyNkZWZpbmUgUk9BTV9DT05GSUdfQVBfUFJPRklMRSAgICAgNQorI2RlZmluZSBST0FNX0NPTkZJR19DSEFOX0xJU1QgICAgICA2CisjZGVmaW5lIFJPQU1fQ09ORklHX1NDQU5fUEFSQU1TICAgIDcKKyNkZWZpbmUgUk9BTV9DT05GSUdfUlNTSV9DSEFOR0UgICAgOAorI2RlZmluZSBST0FNX1NDQU5fVElNRVJfU1RBUlQgICAgICA5CisjZGVmaW5lIFJPQU1fU0NBTl9USU1FUl9FWFBJUkUgICAgMTAKKyNkZWZpbmUgUk9BTV9TQ0FOX1RJTUVSX1NUT1AgICAgICAxMQorI2RlZmluZSBST0FNX1NDQU5fU1RBUlRFRCAgICAgICAgIDEyCisjZGVmaW5lIFJPQU1fU0NBTl9DT01QTEVURSAgICAgICAgMTMKKyNkZWZpbmUgUk9BTV9TQ0FOX0NBTkNFTExFRCAgICAgICAxNAorI2RlZmluZSBST0FNX0NBTkRJREFURV9GT1VORCAgICAgIDE1CisjZGVmaW5lIFJPQU1fUlNTSV9BQ1RJVkVfU0NBTiAgICAgMTYKKyNkZWZpbmUgUk9BTV9SU1NJX0FDVElWRV9ST0FNICAgICAxNworI2RlZmluZSBST0FNX1JTU0lfR09PRCAgICAgICAgICAgIDE4CisjZGVmaW5lIFJPQU1fQk1JU1NfRklSU1RfUkVDViAgICAgMTkKKyNkZWZpbmUgUk9BTV9ERVZfU1RPUCAgICAgICAgICAgICAyMAorI2RlZmluZSBST0FNX0ZXX09GRkxPQURfRU5BQkxFICAgIDIxCisjZGVmaW5lIFJPQU1fQ0FORElEQVRFX1NTSURfTUFUQ0ggMjIKKyNkZWZpbmUgUk9BTV9DQU5ESURBVEVfU0VDVVJJVFlfTUFUQ0ggMjMKKyNkZWZpbmUgUk9BTV9MT1dfUlNTSV9JTlRFUlJVUFQgICAyNAorI2RlZmluZSBST0FNX0hJR0hfUlNTSV9JTlRFUlJVUFQgIDI1CisjZGVmaW5lIFJPQU1fU0NBTl9SRVFVRVNURUQgICAgICAgMjYKKyNkZWZpbmUgUk9BTV9CRVRURVJfQ0FORElEQVRFX0ZPVU5EIDI3CisjZGVmaW5lIFJPQU1fQkVUVEVSX0FQX0VWRU5UIDI4CisjZGVmaW5lIFJPQU1fQ0FOQ0VMX0xPV19QUklPX1NDQU4gMjkKKyNkZWZpbmUgUk9BTV9GSU5BTF9CTUlTU19SRUNWRCAgICAzMAorI2RlZmluZSBST0FNX0NPTkZJR19TQ0FOX01PREUgICAgIDMxCisjZGVmaW5lIFJPQU1fQk1JU1NfRklOQUxfU0NBTl9FTkFCTEUgMzIKKyNkZWZpbmUgUk9BTV9TVUlUQUJMRV9BUF9FVkVOVCAgICAzMworI2RlZmluZSBST0FNX1JTTl9JRV9QQVJTRV9FUlJPUiAgIDM0CisjZGVmaW5lIFJPQU1fV1BBX0lFX1BBUlNFX0VSUk9SICAgMzUKKyNkZWZpbmUgUk9BTV9TQ0FOX0NNRF9GUk9NX0hPU1QgICAzNgorI2RlZmluZSBST0FNX0hPX1NPUlRfQ0FORElEQVRFICAgIDM3CisjZGVmaW5lIFJPQU1fSE9fU0FWRV9DQU5ESURBVEUgICAgMzgKKyNkZWZpbmUgUk9BTV9IT19HRVRfQ0FORElEQVRFICAgICAzOQorI2RlZmluZSBST0FNX0hPX09GRkxPQURfU0VUX1BBUkFNIDQwCisjZGVmaW5lIFJPQU1fSE9fU00gICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgUk9BTV9IT19IVFRfU0FWRUQgICAgICAgICA0MgorI2RlZmluZSBST0FNX0hPX1NZTkNfU1RBUlQgICAgICAgIDQzCisjZGVmaW5lIFJPQU1fSE9fU1RBUlQgICAgICAgICAgICAgNDQKKyNkZWZpbmUgUk9BTV9IT19TWU5DX0NPTVBMRVRFICAgICA0NQorI2RlZmluZSBST0FNX0hPX1NUT1AgICAgICAgICAgICAgIDQ2CisjZGVmaW5lIFJPQU1fSE9fSFRUX0ZPUldBUkQgICAgICAgNDcKKyNkZWZpbmUgUk9BTV9DT05GSUdfU0NBTl9QQVJBTVNfMSA0OAorI2RlZmluZSBST0FNX1NDQU5fQ09NUExFVEVfMSAgICAgIDQ5CisjZGVmaW5lIFJPQU1fU1dCTUlTU19CQ05fUkVDVl9WQUwgNTAKKyNkZWZpbmUgUk9BTV9TV0JNSVNTX0JDTl9SRUNWX1RIUkUyIDUxCisjZGVmaW5lIFJPQU1fU0NBTl9SRVFVRVNURURfMSAgICAgNTIKKyNkZWZpbmUgUk9BTV9IT19TT1JUX0NBTkRJREFURV9DVVIgIDUzCisjZGVmaW5lIFJPQU1fSE9fU0FWRV9DQU5ESURBVEVfRFVQICA1NAorI2RlZmluZSBST0FNX0hPX1NNX0VWRU5UICAgICAgICAgIDU1CisjZGVmaW5lIFJPQU1fSE9fRU5URVJfQ0ggICAgICAgICAgNTYKKyNkZWZpbmUgUk9BTV9IT19NR01UX1JYICAgICAgICAgICA1NworI2RlZmluZSBST0FNX0hPX0NBTkRJREFURV9JTkZPICAgIDU4CisjZGVmaW5lIFJPQU1fSE9fT0ZGTERfREFUQV9TVE9SRSAgNTkKKyNkZWZpbmUgUk9BTV9IT19IVFRfREFUQV9TVE9SRSAgICA2MAorI2RlZmluZSBST0FNX0hPX1VQREFURV9TVEFUVVMgICAgIDYxCisjZGVmaW5lIFJPQU1fSE9fT0NTX0NIX0NCICAgICAgICAgNjIKKyNkZWZpbmUgUk9BTV9SU1NJX0lOVEVSUlVQVF9TVEFURSA2MworI2RlZmluZSBST0FNX0lOVk9LRV9QQVJBTV9DSEVDSyAgIDY0CisjZGVmaW5lIFJPQU1fSU5WT0tFX1BBUkFNX0NIQU4gICAgNjUKKyNkZWZpbmUgUk9BTV9JTlZPS0VfUEFSQU1fQlNTSUQgICA2NgorI2RlZmluZSBST0FNX0lOVk9LRV9TVEFURV9DSEVDSyAgIDY3CisjZGVmaW5lIFJPQU1fSU5WT0tFX1NUQVJUX1NVQ0NFU1MgNjgKKyNkZWZpbmUgUk9BTV9JTlZPS0VfU1RBUlRfRkFJTFVSRSA2OQorI2RlZmluZSBST0FNX0lOVk9LRV9CU1NJRF9DSEVDSyAgIDcwCisjZGVmaW5lIFJPQU1fQ0FORElEQVRFX0lORk8gICAgICAgNzEKKyNkZWZpbmUgUk9BTV9DQU5ESURBVEVfRklMVEVSX01BVENIIDcyCisjZGVmaW5lIFJPQU1fQ0FORElEQVRFX1JTU0lfQURKVVNUICA3MworI2RlZmluZSBST0FNX0NPTkZJR19ST0FNX0ZJTFRFUiAgICAgNzQKKyNkZWZpbmUgUk9BTV9FWFRFTkRFRF9SU1NJX1RSRVNIT0xEXzEgNzUKKyNkZWZpbmUgUk9BTV9FWFRFTkRFRF9SU1NJX1RSRVNIT0xEXzIgNzYKKyNkZWZpbmUgUk9BTV9CTEFDS0xJU1RfQlNTSUQgICAgICAgIDc3CisjZGVmaW5lIFJPQU1fV0hJVEVMSVNUX1NTSUQgICAgICAgICA3OAorI2RlZmluZSBST0FNX1dISVRFTElTVF9TU0lEXzIgICAgICAgNzkKKyNkZWZpbmUgUk9BTV9QUkVGRVJSRURfQlNTSUQgICAgICAgIDgwCisjZGVmaW5lIFJPQU1fUFJFRkVSUkVEX0ZBQ1RPUiAgICAgICA4MQorI2RlZmluZSBST0FNX1NDQU5fSElSU1NJX1RIUkVTSE9MRCAgICAgIDgyCisjZGVmaW5lIFJPQU1fU0NBTl9ISVJTU0lfQ0hFQ0sgICAgICAgICAgODMKKyNkZWZpbmUgUk9BTV9TQ0FOX0hJUlNTSV9USU1FUl9FWFBJUkVEICA4NAorI2RlZmluZSBST0FNX1NDQU5fRVhUU0NBTl9DSEVDSyAgICAgICAgIDg1CisjZGVmaW5lIFJPQU1fREJHSURfREVGSU5JVElPTl9FTkQgICA4NgorCisvKiBEQVRBX1RYUlggbW9kdWxlIERCR0lEcyovCisjZGVmaW5lIERBVEFfVFhSWF9EQkdJRF9ERUZJTklUSU9OX1NUQVJUICAgICAgICAgMAorI2RlZmluZSBEQVRBX1RYUlhfREJHSURfUlhfREFUQV9TRVFfTEVOX0lORk8gICAgIDEKKyNkZWZpbmUgREFUQV9UWFJYX0RCR0lEX1JFUExBWV9DSEVDSyAgICAgICAgICAgICAyCisjZGVmaW5lIERBVEFfVFhSWF9EQkdJRF9EVVBfQ0hFQ0sgICAgICAgICAgICAgICAgMworI2RlZmluZSBEQVRBX1RYUlhfSU5WQUxJRF9QRUVSX0FTVF9TVEEgICAgICAgICAgIDQKKyNkZWZpbmUgREFUQV9UWFJYX0lOVkFMSURfUEVFUl9BU1RfUDJQICAgICAgICAgICA1CisjZGVmaW5lIERBVEFfVFhSWF9JTlZBTElEX0FERFIxX1NUQSAgICAgICAgICAgICAgNgorI2RlZmluZSBEQVRBX1RYUlhfSU5WQUxJRF9BRERSMV9QMlAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgREFUQV9UWFJYX01VTFRJQ0FTVF9CUk9BRENBU1RfRlJBTUUgICAgICA4CisjZGVmaW5lIERBVEFfVFhSWF9JTlZBTElEX0ZSQU1FX0NUUkxfT1JfQUREUiAgICAgOQorI2RlZmluZSBEQVRBX1RYUlhfREJHSURfREVGSU5JVElPTl9FTkQgICAgICAgICAgMTAKKworLyogSFRUIG1vZHVsZSBEQkdJRHMgKi8KKyNkZWZpbmUgSFRUX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhUVF9EQkdJRF9JTlZBTElEX1ZERVZJRF9PUl9HUk9VUCAgICAgICAgMQorI2RlZmluZSBIVFRfREJHSURfRElTQ0FSRF9JTlRFUk5BTF9QS1RTICAgICAgICAgIDIKKyNkZWZpbmUgSFRUX0RCR0lEX0RJU0NBUkRfVFhfUEtUUyAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEhUVF9EQkdJRF9HUk9VUF9DSEFOR0UgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBIVFRfREJHSURfR1JPVVBfQ1JFRElUX1NUQVRTICAgICAgICAgICAgIDUKKyNkZWZpbmUgSFRUX0RCR0lEX0RJU0NBUkRfSU5URVJOQUxfUEtUU19OVU0gICAgICA2CisjZGVmaW5lIEhUVF9EQkdJRF9ERUZJTklUSU9OX0VORCAgICAgICAgICAgICAgICAgNworCisvKiBURExTIG1vZHVsZSBEQkdJRHMqLworI2RlZmluZSBURExTX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgICAgICAgICAgICAgMAorI2RlZmluZSBURExTX0RCR0lEX1ZERVZfQ1JFQVRFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBURExTX0RCR0lEX1ZERVZfREVMRVRFICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBURExTX0RCR0lEX0VOQUJMRURfUEFTU0lWRSAgICAgICAgICAgICAgMworI2RlZmluZSBURExTX0RCR0lEX0VOQUJMRURfQUNUSVZFICAgICAgICAgICAgICAgNAorI2RlZmluZSBURExTX0RCR0lEX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBURExTX0RCR0lEX0NPTk5UUkFDS19USU1FUiAgICAgICAgICAgICAgNgorI2RlZmluZSBURExTX0RCR0lEX1dBTF9TRVQgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBURExTX0RCR0lEX1dBTF9HRVQgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBURExTX0RCR0lEX1dBTF9QRUVSX1VQREFURV9TRVQgICAgICAgICAgOQorI2RlZmluZSBURExTX0RCR0lEX1dBTF9QRUVSX1VQREFURV9FVlQgICAgICAgICAxMAorI2RlZmluZSBURExTX0RCR0lEX1dBTF9WREVWX0NSRUFURSAgICAgICAgICAgICAxMQorI2RlZmluZSBURExTX0RCR0lEX1dBTF9WREVWX0RFTEVURSAgICAgICAgICAgICAxMgorI2RlZmluZSBURExTX0RCR0lEX1dMQU5fRVZFTlQgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBURExTX0RCR0lEX1dMQU5fUEVFUl9VUERBVEVfU0VUICAgICAgICAxNAorI2RlZmluZSBURExTX0RCR0lEX1BFRVJfRVZUX0RSUF9USFJFU0ggICAgICAgICAxNQorI2RlZmluZSBURExTX0RCR0lEX1BFRVJfRVZUX0RSUF9SQVRFICAgICAgICAgICAxNgorI2RlZmluZSBURExTX0RCR0lEX1BFRVJfRVZUX0RSUF9SU1NJICAgICAgICAgICAxNworI2RlZmluZSBURExTX0RCR0lEX1BFRVJfRVZUX0RJU0NPVkVSICAgICAgICAgICAxOAorI2RlZmluZSBURExTX0RCR0lEX1BFRVJfRVZUX0RFTEVURSAgICAgICAgICAgICAxOQorI2RlZmluZSBURExTX0RCR0lEX1BFRVJfQ0FQX1VQREFURSAgICAgICAgICAgICAyMAorI2RlZmluZSBURExTX0RCR0lEX1VBUFNEX1NFTkRfUFRJX0ZSQU1FICAgICAgICAyMQorI2RlZmluZSBURExTX0RCR0lEX1VBUFNEX1NFTkRfUFRJX0ZSQU1FMlBFRVIgICAyMgorI2RlZmluZSBURExTX0RCR0lEX1VBUFNEX1NUQVJUX1BUUl9USU1FUiAgICAgICAyMworI2RlZmluZSBURExTX0RCR0lEX1VBUFNEX0NBTkNFTF9QVFJfVElNRVIgICAgICAyNAorI2RlZmluZSBURExTX0RCR0lEX1VBUFNEX1BUUl9USU1FUl9USU1FT1VUICAgICAyNQorI2RlZmluZSBURExTX0RCR0lEX1VBUFNEX1NUQV9QU19FVkVOVF9IQU5ETEVSICAyNgorI2RlZmluZSBURExTX0RCR0lEX1VBUFNEX1BFRVJfRVZFTlRfSEFORExFUiAgICAyNworI2RlZmluZSBURExTX0RCR0lEX1VBUFNEX1BTX0RFRkFVTFRfU0VUVElOR1MgICAyOAorI2RlZmluZSBURExTX0RCR0lEX1VBUFNEX0dFTkVSSUMgICAgICAgICAgICAgICAyOQorCisvKiBUWEJGIE1vZHVsZSBJRHMgKi8KKyNkZWZpbmUgVFhCRkVFX0RCR0lEX1NUQVJUICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX05EUEFfUkVDRUlWRUQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX0hPU1RfQ09ORklHX1RYQkZFRV9UWVBFICAgIDIKKyNkZWZpbmUgVFhCRkVSX0RCR0lEX1NFTkRfTkRQQSAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVFhCRkVSX0RCR0lEX0dFVF9ORFBBX0JVRl9GQUlMICAgICAgICAgIDQKKyNkZWZpbmUgVFhCRkVSX0RCR0lEX1NFTkRfTkRQQV9GQUlMICAgICAgICAgICAgIDUKKyNkZWZpbmUgVFhCRkVSX0RCR0lEX0dFVF9ORFBfQlVGX0ZBSUwgICAgICAgICAgIDYKKyNkZWZpbmUgVFhCRkVSX0RCR0lEX1NFTkRfTkRQX0ZBSUwgICAgICAgICAgICAgIDcKKyNkZWZpbmUgVFhCRkVSX0RCR0lEX0dFVF9CUlBPTExfQlVGX0ZBSUwgICAgICAgIDgKKyNkZWZpbmUgVFhCRkVSX0RCR0lEX1NFTkRfQlJQT0xMX0ZBSUwgICAgICAgICAgIDkKKyNkZWZpbmUgVFhCRkVSX0RCR0lEX0hPU1RfQ09ORklHX0NNRElEICAgICAgICAgMTAKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX0hPU1RfQ09ORklHX0NNRElEICAgICAgICAgMTEKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX0VOQUJMRV9VUExPQURfSCAgICAgICAgICAgMTIKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX1VQTE9BREhfQ1ZfVEFHICAgICAgICAgICAgMTMKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX1VQTE9BREhfSF9UQUcgICAgICAgICAgICAgMTQKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX0NBUFRVUkVIX1JFQ0VJVkVEICAgICAgICAgMTUKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX1BBQ0tFVF9JU19TVEVFUkVEICAgICAgICAgMTYKKyNkZWZpbmUgVFhCRkVFX1VQTE9BREhfRVZFTlRfQUxMT0NfTUVNX0ZBSUwgICAgMTcKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX1NXX1dBUl9BSURfWkVSTyAgICAgICAgICAgMTgKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX0JSUE9MTF9SRUNFSVZFRCAgICAgICAgICAgMTkKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX0dJRF9SRUNFSVZFRCAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgVFhCRkVFX0RCR0lEX0VORCAgICAgICAgICAgICAgICAgICAgICAgMjEKKworLyogU01QUyBtb2R1bGUgREJHSURzICovCisjZGVmaW5lIFNUQV9TTVBTX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfQ1JFQVRFX1BERVZfSU5TVEFOQ0UgICAgICAgICAgICAgMQorI2RlZmluZSBTVEFfU01QU19EQkdJRF9DUkVBVEVfVklSVFVBTF9DSEFOX0lOU1RBTkNFICAgICAyCisjZGVmaW5lIFNUQV9TTVBTX0RCR0lEX0RFTEVURV9WSVJUVUFMX0NIQU5fSU5TVEFOQ0UgICAgIDMKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfQ1JFQVRFX1NUQV9JTlNUQU5DRSAgICAgICAgICAgICAgNAorI2RlZmluZSBTVEFfU01QU19EQkdJRF9ERUxFVEVfU1RBX0lOU1RBTkNFICAgICAgICAgICAgICA1CisjZGVmaW5lIFNUQV9TTVBTX0RCR0lEX1ZJUlRVQUxfQ0hBTl9TTVBTX1NUQVJUICAgICAgICAgIDYKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfVklSVFVBTF9DSEFOX1NNUFNfU1RPUCAgICAgICAgICAgNworI2RlZmluZSBTVEFfU01QU19EQkdJRF9TRU5EX1NNUFNfQUNUSU9OX0ZSQU1FICAgICAgICAgICA4CisjZGVmaW5lIFNUQV9TTVBTX0RCR0lEX0hPU1RfRk9SQ0VEX01PREUgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfRldfRk9SQ0VEX01PREUgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfUlNTSV9USFJFU0hPTERfQ1JPU1NFRCAgICAgICAgICAgMTEKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfU01QU19BQ1RJT05fRlJBTUVfQ09NUExFVElPTiAgICAgMTIKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfRFRJTV9FQlRfRVZFTlRfQ0hNQVNLX1VQREFURSAgICAgMTMKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfRFRJTV9DSE1BU0tfVVBEQVRFICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfRFRJTV9CRUFDT05fRVZFTlRfQ0hNQVNLX1VQREFURSAgMTUKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfRFRJTV9QT1dFUl9TVEFURV9DSEFOR0UgICAgICAgICAgMTYKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfRFRJTV9DSE1BU0tfVVBEQVRFX1NMRUVQICAgICAgICAgMTcKKyNkZWZpbmUgU1RBX1NNUFNfREJHSURfRFRJTV9DSE1BU0tfVVBEQVRFX0FXQUtFICAgICAgICAgMTgKKworI2RlZmluZSBTVEFfU01QU19EQkdJRF9ERUZJTklUSU9OX0VORCAgICAgICAgICAgICAgICAgICAxOAorCisvKiBSVFQgbW9kdWxlIERCR0lEcyovCisjZGVmaW5lIFJUVF9DQUxMX0ZMT1cgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUlRUX1JFUV9TVUJfVFlQRSAgICAgICAgICAgICAgMQorI2RlZmluZSBSVFRfTUVBU19SRVFfSEVBRCAgICAgICAgICAgICAyCisjZGVmaW5lIFJUVF9NRUFTX1JFUV9CT0RZICAgICAgICAgICAgIDMKKyNkZWZpbmUgUlRUX0lOSVRfR0xPQkFMX1NUQVRFICAgICAgICAgNgorI2RlZmluZSBSVFRfUkVQT1JUICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFJUVF9FUlJPUl9SRVBPUlQgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFJUVF9USU1FUl9TVE9QICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFJUVF9TRU5EX1RNX0ZSQU1FICAgICAgICAgICAgIDEyCisjZGVmaW5lIFJUVF9WM19SRVNQX0NOVCAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFJUVF9WM19SRVNQX0ZJTklTSCAgICAgICAgICAgIDE0CisjZGVmaW5lIFJUVF9DSEFOTkVMX1NXSVRDSF9SRVEgICAgICAgIDE1CisjZGVmaW5lIFJUVF9DSEFOTkVMX1NXSVRDSF9HUkFOVCAgICAgIDE2CisjZGVmaW5lIFJUVF9DSEFOTkVMX1NXSVRDSF9DT01QTEVURSAgIDE3CisjZGVmaW5lIFJUVF9DSEFOTkVMX1NXSVRDSF9QUkVFTVBUICAgIDE4CisjZGVmaW5lIFJUVF9DSEFOTkVMX1NXSVRDSF9TVE9QICAgICAgIDE5CisjZGVmaW5lIFJUVF9USU1FUl9TVEFSVCAgICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgUlRUX0ZUTV9QQVJBTV9JTkZPICAgICAgICAgICAgMjEKKyNkZWZpbmUgUlRUX1JYX1RNX0ZSQU1FICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgUlRUX0lOSVRSX1RTVEFNUCAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgUlRUX1JTUERSX1RTVEFNUCAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgUlRUX1RYX0NPTVBfU1RBVFVTICAgICAgICAgICAgMjUKKyNkZWZpbmUgUlRUX0VSUk9SX1dNSV9FVkVOVCAgICAgICAgICAgMjYKKyNkZWZpbmUgUlRUX01FQVNVUkVNRU5UX1ZBTFVFUyAgICAgICAgMjcKKworLyogV0xBTiBIQiBtb2R1bGUgREJHSURzICovCisjZGVmaW5lIFdMQU5fSEJfREJHSURfREVGSU5JVElPTl9TVEFSVCAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV0xBTl9IQl9EQkdJRF9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTEFOX0hCX0RCR0lEX1RDUF9HRVRfVFhCVUZfRkFJTCAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdMQU5fSEJfREJHSURfVENQX1NFTkRfRkFJTCAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV0xBTl9IQl9EQkdJRF9CU1NfUEVFUl9OVUxMICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTEFOX0hCX0RCR0lEX1VEUF9HRVRfVFhCVUZfRkFJTCAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdMQU5fSEJfREJHSURfVURQX1NFTkRfRkFJTCAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV0xBTl9IQl9EQkdJRF9XTUlfQ01EX0lOVkFMSURfUEFSQU0gICAgICAgICAgICAgNworI2RlZmluZSBXTEFOX0hCX0RCR0lEX1dNSV9DTURfSU5WQUxJRF9PUCAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdMQU5fSEJfREJHSURfV09XX05PVF9FTlRFUkVEICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV0xBTl9IQl9EQkdJRF9BTExPQ19TRVNTX0ZBSUwgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV0xBTl9IQl9EQkdJRF9DVFhfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgV0xBTl9IQl9EQkdJRF9DSEtTVU1fRVJSICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV0xBTl9IQl9EQkdJRF9VRFBfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgV0xBTl9IQl9EQkdJRF9UQ1BfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgV0xBTl9IQl9EQkdJRF9ERUZJTklUSU9OX0VORCAgICAgICAgICAgICAgICAgICAgMTUKKworLyogVGhlcm1hbCBNYW5hZ2VyIERCR0lEcyovCisjZGVmaW5lIFRIRVJNQUxfTUdSX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgICAwCisjZGVmaW5lIFRIRVJNQUxfTUdSX05FV19USFJFU0ggICAgICAgICAgICAgICAxCisjZGVmaW5lIFRIRVJNQUxfTUdSX1RIUkVTSF9DUk9TU0VEICAgICAgICAgICAyCisjZGVmaW5lIFRIRVJNQUxfTUdSX0RCR0lEX0RFRklOSVRJT05fRU5EICAgICAzCisKKy8qIFdMQU4gUEhZRVJSIERGUyhwYXJzZS9maWx0ZXIpIERCR0lEcyAqLworI2RlZmluZSBXTEFOX1BIWUVSUl9ERlNfREJHSURfREVGSU5JVElPTl9TVEFSVCAgICAwCisjZGVmaW5lIFdMQU5fUEhZRVJSX0RGU19QSFlFUlJfSU5GT19DSEFOX0JVRkxFTiAgIDEKKyNkZWZpbmUgV0xBTl9QSFlFUlJfREZTX1BIWUVSUl9JTkZPX1BQRFUgICAgICAgICAgMgorI2RlZmluZSBXTEFOX1BIWUVSUl9ERlNfREJESURfUkFEQVJfU1VNTUFSWSAgICAgICAzCisjZGVmaW5lIFdMQU5fUEhZRVJSX0RGU19EQkRJRF9TRUFSQ0hfRkZUICAgICAgICAgIDQKKyNkZWZpbmUgV0xBTl9QSFRFUlJfREZTX0RCRElEX0ZJTFRFUl9TVEFUVVMgICAgICAgNQorI2RlZmluZSBXTEFOX1BIWUVSUl9ERlNfREJHSURfREVGSU5JVElPTl9FTkQgICAgICA2CisKKy8qIFJNQyBEQkdJRHMgKi8KKyNkZWZpbmUgUk1DX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgICAgICAgICAgICAgMAorI2RlZmluZSBSTUNfU01fSU5JVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJNQ19WREVWX0FMTE9DX0VSUiAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUk1DX0NSRUFURV9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBSTUNfREVMRVRFX0lOU1RBTkNFICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFJNQ19ORVdfUFJJX0xFQURFUiAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUk1DX05FV19TRUNfTEVBREVSICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBSTUNfTk9fTERSX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFJNQ19MRFJfSU5GT1JNX1NFTlQgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgUk1DX1BFRVJfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBSTUNfUEVFUl9ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBSTUNfUEVFUl9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBSTUNfUFJJX0xEUl9SU1NJX1VQREFURSAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBSTUNfU0VDX0xEUl9SU1NJX1VQREFURSAgICAgICAgICAgICAgICAxMworI2RlZmluZSBSTUNfU0VUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBSTUNfU0VUX0FDVElPTl9QRVJJT0QgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBSTUNfREJHSURfREVGSU5JVElPTl9FTkQgICAgICAgICAgICAgICAxNgorCisvKiBVTklUX1RFU1QgbW9kdWxlIERCR0lEcyAqLworI2RlZmluZSBVTklUX1RFU1RfR0VOICAgICAgICAgICAgICAgICAwCisKKy8qIE1MTUUgbW9kdWxlIERCR0lEcyAqLworI2RlZmluZSBNTE1FX0RFQlVHX0NNTiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1MTUVfREVCVUdfSUYgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUxNRV9ERUJVR19BVVRIICAgICAgICAgICAgICAgMgorI2RlZmluZSBNTE1FX0RFQlVHX1JFQVNTT0MgICAgICAgICAgICAzCisjZGVmaW5lIE1MTUVfREVCVUdfREVBVVRIICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUxNRV9ERUJVR19ESVNBU1NPQyAgICAgICAgICAgNQorI2RlZmluZSBNTE1FX0RFQlVHX1JPQU0gICAgICAgICAgICAgICA2CisjZGVmaW5lIE1MTUVfREVCVUdfUkVUUlkgICAgICAgICAgICAgIDcKKyNkZWZpbmUgTUxNRV9ERUJVR19USU1FUiAgICAgICAgICAgICAgOAorI2RlZmluZSBNTE1FX0RFQlVHX0ZSQU1FUEFSU0UgICAgICAgICA5CisKKy8qIFNVUFBMIG1vZHVsZSBEQkdJRHMgKi8KKyNkZWZpbmUgU1VQUExfREJHSURfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1VQUExfREJHSURfUkVDVl9FQVBPTCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1VQUExfREJHSURfUkVDVl9FQVBPTF9USU1FT1VUICAgICAgICAgIDIKKyNkZWZpbmUgU1VQUExfREJHSURfU0VORF9FQVBPTCAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU1VQUExfREJHSURfTUlDX01JU01BVENIICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU1VQUExfREJHSURfRklOSVNIICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgU1VQUExfREJHSURfR0VUX0ZSTV9JTkZPICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU1VQUExfREJHSURfRFVNUF9UWVBFICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgU1VQUExfREJHSURfRFVNUF9IRVggICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgU1VQUExfREJHSURfTk9ERV9OT1RfRk9VTkQgICAgICAgICAgICAgIDkKKyNkZWZpbmUgU1VQUExfREJHSURfR0VUX0VBUE9MX0JVRiAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFNVUFBMX0RCR0lEX0dFVF9CVUZfRkFJTCAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBTVVBQTF9EQkdJRF9SRUNWX0VBUE9MX0VSUk9SICAgICAgICAgICAgMTIKKworLyogU3RhdHMgTW9kdWxlIERCR0lEcyAqLworI2RlZmluZSBXTEFOX1NUQVRTX0RCR0lEX0RFRklOSVRJT05fU1RBUlQgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTEFOX1NUQVRTX0RCR0lEX0VTVF9MSU5LU1BFRURfVkRFVl9FTl9ESVMgICAgICAgMQorI2RlZmluZSBXTEFOX1NUQVRTX0RCR0lEX0VTVF9MSU5LU1BFRURfQ0hBTl9USU1FX1NUQVJUICAgMgorI2RlZmluZSBXTEFOX1NUQVRTX0RCR0lEX0VTVF9MSU5LU1BFRURfQ0hBTl9USU1FX0VORCAgICAgMworI2RlZmluZSBXTEFOX1NUQVRTX0RCR0lEX0VTVF9MSU5LU1BFRURfQ0FMQyAgICAgICAgICAgICAgNAorI2RlZmluZSBXTEFOX1NUQVRTX0RCR0lEX0VTVF9MSU5LU1BFRURfVVBEQVRFX0hPTUVfQ0hBTiAgNQorI2RlZmluZSBXTEFOX1NUQVRTX0RCR0lEX0RFRklOSVRJT05fRU5EICAgICAgICAgICAgICAgICAgNgorLyogTkFOIERCR0lEcyAqLworI2RlZmluZSBOQU5fREJHSURfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRGVidWcgSURzIGZvciBkZWJ1ZyBsb2dzLiAzIGFyZ3MgbWF4LCBub3QgZml4ZWQuICovCisjZGVmaW5lIE5BTl9EQkdJRF9EQkdfTE9HX0ZJUlNUICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBOQU5fREJHSURfRlVOQ19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgIE5BTl9EQkdJRF9EQkdfTE9HX0ZJUlNUCisjZGVmaW5lIE5BTl9EQkdJRF9GVU5DX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBOQU5fREJHSURfTUFJTl9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTkFOX0RCR0lEX01BQ19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5BTl9EQkdJRF9CTE9PTV9GSUxURVJfREVCVUcgICAgICAgICAgICAgICAgNQorI2RlZmluZSBOQU5fREJHSURfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTkFOX0RCR0lEX1BBUkFNX1VQREFURUQgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIE5BTl9EQkdJRF9OVUxMX1BUUiAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBOQU5fREJHSURfSU5WQUxJRF9GVU5DX0FSRyAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTkFOX0RCR0lEX0lOVkFMSURfTVNHX1BBUkFNICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBOQU5fREJHSURfTUlTU0lOR19NU0dfUEFSQU0gICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIE5BTl9EQkdJRF9ERVBSRUNBVEVEX01TR19QQVJBTSAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgTkFOX0RCR0lEX1VOU1VQUE9SVEVEX01TR19QQVJBTSAgICAgICAgICAgICAxMworI2RlZmluZSBOQU5fREJHSURfSU5WQUxJRF9QS1RfREFUQSAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIE5BTl9EQkdJRF9MT0dfUEtUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgTkFOX0RCR0lEX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBOQU5fREJHSURfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIE5BTl9EQkdJRF9JTlZBTElEX1NUQVRFICAgICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgTkFOX0RCR0lEX0ZVTkNUSU9OX0VOQUJMRUQgICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBOQU5fREJHSURfRlVOQ1RJT05fRElTQUJMRUQgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIE5BTl9EQkdJRF9JTlZBTElEX0ZVTkNUSU9OX1NUQVRFICAgICAgICAgICAgMjEKKyNkZWZpbmUgTkFOX0RCR0lEX1JFQURfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBOQU5fREJHSURfV1JJVEVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIE5BTl9EQkdJRF9SRUNFSVZFX0VSUk9SICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgTkFOX0RCR0lEX1RSQU5TTUlUX0VSUk9SICAgICAgICAgICAgICAgICAgICAyNQorI2RlZmluZSBOQU5fREJHSURfUEFSU0VfRVJST1IgICAgICAgICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIE5BTl9EQkdJRF9SRVNfQUxMT0NfRVJST1IgICAgICAgICAgICAgICAgICAgMjcKKy8qIFBMRUFTRSBLRUVQIFRISVMgT05FIEFUIFRIRSBFTkQgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX0RCR19MT0dfTEFTVCAgICAgICAgICAgICAgICAgICAgICAyOAorCisvKiBEZWJ1ZyBJRHMgZm9yIGV2ZW50IGxvZ3MuICovCisKKyNkZWZpbmUgTkFOX0RCR0lEX0VWVF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICBOQU5fREJHSURfREJHX0xPR19MQVNUCisvKiBhcmdzOiA8bm9uZT4gKi8KKyNkZWZpbmUgTkFOX0RCR0lEX05BTl9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMCkKKy8qIGFyZ3M6IDxub25lPiAqLworI2RlZmluZSBOQU5fREJHSURfTkFOX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyAxKQorLyogYXJnczogPG5vbmU+ICovCisjZGVmaW5lIE5BTl9EQkdJRF9DT05GSUdfUkVTVE9SRUQgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDIpCisvKiBhcmdzOiBmcmFtZXNRdWV1ZWQgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1NERl9RVUVVRUQgICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMykKKy8qIGFyZ3M6IG9sZCwgbmV3ICovCisjZGVmaW5lIE5BTl9EQkdJRF9UV19DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDQpCisvKiBhcmdzOiA8bm9uZT4gKi8KKyNkZWZpbmUgTkFOX0RCR0lEX0RXX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNSkKKy8qIGFyZ3M6IGJ1c3lEaWZmICovCisjZGVmaW5lIE5BTl9EQkdJRF9EV19FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDYpCisvKiBhcmdzOiBvbGRDbHVzdGVySWQsIG5ld0NsdXN0ZXJJZCAqLworI2RlZmluZSBOQU5fREJHSURfQ0xVU1RFUl9JRF9DSEFOR0VEICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA3KQorLyogYXJnczogY21kLCBidWZmZXIsIGxlbmd0aCAqLworI2RlZmluZSBOQU5fREJHSURfV01JX0NNRF9SRUNFSVZFRCAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA4KQorLyogYXJnczogcEV2ZW50UGt0LCBwRXZlbnRCdWYsIGV2ZW50U2l6ZSwgZGF0YVNpemUgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1dNSV9FVlRfU0VOVCAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgOSkKKy8qIGFyZ3M6IHR5cGUgbGVuZ3RoLCByZWFkTGVuICovCisjZGVmaW5lIE5BTl9EQkdJRF9UTFZfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDEwKQorLyogYXJnczogdHlwZSBsZW5ndGgsIHdyaXRlTGVuICovCisjZGVmaW5lIE5BTl9EQkdJRF9UTFZfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDExKQorLyogYXJnczogaGFuZGxlICovCisjZGVmaW5lIE5BTl9EQkdJRF9QVUJTVUJfVVBEQVRFRCAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDEyKQorLyogYXJnczogaGFuZGxlICovCisjZGVmaW5lIE5BTl9EQkdJRF9QVUJTVUJfUkVNT1ZFX0RFRkVSRUQgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDEzKQorLyogYXJnczogaGFuZGxlICovCisjZGVmaW5lIE5BTl9EQkdJRF9QVUJTVUJfUkVNT1ZFX1BFTkRJTkcgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDE0KQorLyogYXJnczogaGFuZGxlICovCisjZGVmaW5lIE5BTl9EQkdJRF9QVUJTVUJfUkVNT1ZFRCAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDE1KQorLyogYXJnczogaGFuZGxlICovCisjZGVmaW5lIE5BTl9EQkdJRF9QVUJTVUJfUFJPQ0VTU0VEICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDE2KQorLyogYXJnczogaGFuZGxlLCBzaWQxLCBzaWQyLCBzdmNDdHJsLCBsZW5ndGggKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1BVQlNVQl9NQVRDSEVEICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMTcpCisvKiBhcmdzOiBoYW5kbGUsIGZsYWdzICovCisjZGVmaW5lIE5BTl9EQkdJRF9QVUJTVUJfUFJFUEFSRUQgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDE4KQorLyogYXJnczogaGFuZGxlLCBtYWMxLCBtYWMyICovCisjZGVmaW5lIE5BTl9EQkdJRF9QVUJTVUJfRk9MTE9XVVBfVFJBTlNNSVQgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDE5KQorLyogYXJnczogaGFuZGxlLCBtYWMxLCBtYWMyICovCisjZGVmaW5lIE5BTl9EQkdJRF9QVUJTVUJfRk9MTE9XVVBfUkVDRUlWRUQgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDIwKQorLyogYXJnczogc3Vic2NyaWJlSGFuZGxlLCBtYXRjaEhhbmRsZSwgb2xkVGltZW91dCwgbmV3VGltZW91dCAqLworI2RlZmluZSBOQU5fREJHSURfU1VCU0NSSUJFX1VOTUFUQ0hfVElNRU9VVF9VUERBVEUgIChOQU5fREJHSURfRVZUX0JBU0UgKyAyMSkKKy8qIGFyZ3M6IHN1YnNjcmliZUhhbmRsZSwgbWF0Y2hIYW5kbGUsIHRpbWVzdGFtcCovCisjZGVmaW5lIE5BTl9EQkdJRF9TVUJTQ1JJQkVfTUFUQ0hfTkVXICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDIyKQorLyogYXJnczogc3Vic2NyaWJlSGFuZGxlLCBtYXRjaEhhbmRsZSwgdGltZXN0YW1wKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1NVQlNDUklCRV9NQVRDSF9SRVBFQVQgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMjMpCisvKiBhcmdzOiBzdWJzY3JpYmVIYW5kbGUsIG1hdGNoSGFuZGxlLCBtYXRjaFRpbWVzdGFtcCwgdGltZXN0YW1wKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1NVQlNDUklCRV9NQVRDSF9FWFBJUkVEICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMjQpCisvKiBhcmdzOiBzdWJzY3JpYmVIYW5kbGUsIG1hdGNoSGFuZGxlLCBtYXRjaFRpbWVzdGFtcCwgdGltZXN0YW1wICovCisjZGVmaW5lIE5BTl9EQkdJRF9TVUJTQ1JJQkVfTUFUQ0hfTE9HICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDI1KQorLyogYXJnczogc2lkMSwgc2lkMiAqLworI2RlZmluZSBOQU5fREJHSURfU0VSVklDRV9JRF9DUkVBVEVEICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyAyNikKKy8qIGFyZ3M6IHNpemUgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1NEX0FUVFJfQlVJTFQgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMjcpCisvKiBhcmdzOiBvZmZzZXQgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1NFUlZJQ0VfUlNQX09GRlNFVCAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMjgpCisvKiBhcmdzOiBvZmZzZXQgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1NFUlZJQ0VfSU5GT19PRkZTRVQgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMjkpCisvKiBhcmdzOiBjaGFuLCBpbnRlcnZhbCwgc3RhcnRfdGltZSAqLworI2RlZmluZSBOQU5fREJHSURfQ0hSRVFfQ1JFQVRFICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyAzMCkKKy8qIGFyZ3M6IHN0YXJ0X3RpbWUsIHN0YXR1cyAqLworI2RlZmluZSBOQU5fREJHSURfQ0hSRVFfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyAzMSkKKy8qIGFyZ3M6IGNoYW4sIGludGVydmFsLCBzdGF0dXMgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX0NIUkVRX1JFTU9WRSAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMzIpCisvKiBhcmdzOiB0eXBlLCB0aW1lc3RhbXAgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX0NIUkVRX0dSQU5UICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMzMpCisvKiBhcmdzOiB0eXBlLCB0aW1lc3RhbXAgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX0NIUkVRX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMzQpCisvKiBhcmdzOiB0eXBlLCB0aW1lc3RhbXAgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX0NIUkVRX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMzUpCisvKiBhcmdzOiB0eXBlLCBsZW5ndGgsIHRpbWVzdGFtcCwgcnNzaSAqLworI2RlZmluZSBOQU5fREJHSURfUlhfQ0FMTEJBQ0sgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyAzNikKKy8qIGFyZ3M6IHR5cGUsIGhhbmRsZSwgYnVmcCwgc3RhdHVzLCB0aW1lc3RhbXAgICovCisjZGVmaW5lIE5BTl9EQkdJRF9UWF9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDM3KQorLyogYXJnczogdHNmLCB0c2YgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1RTRl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgMzgpCisvKiBhcmdzOiBjbHVzdGVySWQsIGNsdXN0ZXJTdGFydCAqLworI2RlZmluZSBOQU5fREJHSURfU1lOQ19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyAzOSkKKy8qIGFyZ3M6IGNsdXN0ZXJJZCAqLworI2RlZmluZSBOQU5fREJHSURfU1lOQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA0MCkKKy8qIGFyZ3M6IGVuYWJsZSwgc2NhblR5cGUsIHJ2YWwgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX05BTl9TQ0FOICAgICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNDEpCisvKiBhcmdzOiBzY2FuVHlwZSAqLworI2RlZmluZSBOQU5fREJHSURfTkFOX1NDQU5fQ09NUExFVEUgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA0MikKKy8qIGFyZ3M6IG1hc3RlclByZWYgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX01QUkVGX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNDMpCisvKiBhcmdzOiBtYXN0ZXJQcmVmLCByYW5kRmFjdG9yICovCisjZGVmaW5lIE5BTl9EQkdJRF9XQVJNVVBfRVhQSVJFICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDQ0KQorLyogYXJnczogcmFuZEZhY3RvciAqLworI2RlZmluZSBOQU5fREJHSURfUkFORE9NX0ZBQ1RPUl9FWFBJUkUgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA0NSkKKy8qIGFyZ3M6IHRzZiwgdHNmICovCisjZGVmaW5lIE5BTl9EQkdJRF9EV19TS0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDQ2KQorLyogYXJnczogdHlwZSwgdHNmRGlmZiAqLworI2RlZmluZSBOQU5fREJHSURfREJfU0tJUCAgICAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA0NykKKy8qIGFyZ3M6IFRCRCAqLworI2RlZmluZSBOQU5fREJHSURfQkVBQ09OX1JYICAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA0OCkKKy8qIGFyZ3M6IFRCRCAqLworI2RlZmluZSBOQU5fREJHSURfQkVBQ09OX1RYICAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA0OSkKKy8qIGFyZ3M6IGNsdXN0ZXJJZCAqLworI2RlZmluZSBOQU5fREJHSURfQ0xVU1RFUl9NRVJHRSAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA1MCkKKy8qIGFyZ3M6IGNtZCwgc3RhdHVzLCB2YWx1ZSAqLworI2RlZmluZSBOQU5fREJHSURfVEVTVF9DTURfRVhFQyAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA1MSkKKy8qIGFyZ3M6IHRzZkhpLCB0c2ZMbywgYWdlICovCisjZGVmaW5lIE5BTl9EQkdJRF9BUFBMWV9CRUFDT05fVFNGICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDUyKQorLyogYXJnczogYmVoaW5kRmxhZywgZGlmZiAqLworI2RlZmluZSBOQU5fREJHSURfVFNGX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA1MykKKy8qIGFyZ3M6IGFyZ2M9PTQgKHJhd1RzZkhpLCByYXdUc2ZMbywgbmFuVHNmSGksIG5hblRzZkxvKSwgYXJnYz09MihvZmZzZXRIaSwgb2Zmc2V0TG8pICovCisjZGVmaW5lIE5BTl9EQkdJRF9TRVRfVFNGICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDU0KQorLyogYXJnczogcmFua0hpLCByYW5rTG8sIG1wLCByZiAqLworI2RlZmluZSBOQU5fREJHSURfTkVXX01BU1RFUlJBTksgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA1NSkKKy8qIGFyZ3M6IGFtUmFua0hpLCBhbVJhbmtMbywgbXAsIHJmICovCisjZGVmaW5lIE5BTl9EQkdJRF9ORVdfQU5DSE9STUFTVEVSICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDU2KQorLyogYXJnczogYW1SYW5rSGksIGFtUmFua0xvLCBIQywgQlRUICovCisjZGVmaW5lIE5BTl9EQkdJRF9BTkNIT1JNQVNURVJfUkVDT1JEX1VQREFURSAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDU3KQorLyogYXJnczogYW1SYW5rSGksIGFtUmFua0xvLCBIQywgQlRUICovCisjZGVmaW5lIE5BTl9EQkdJRF9BTkNIT1JNQVNURVJfUkVDT1JEX0VYUElSRUQgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDU4KQorLyogYXJnczogcmVhc29uLCB0cmFuc2l0aW9uc1RvQU0gKi8KKyNkZWZpbmUgTkFOX0RCR0lEX0JFQ09NSU5HX0FOQ0hPUk1BU1RFUiAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNTkpCisvKiBhcmdzOiBvbGRSb2xlLCBuZXdSb2xlICovCisjZGVmaW5lIE5BTl9EQkdJRF9ST0xFX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDYwKQorLyogYXJnczogVEJEICovCisjZGVmaW5lIE5BTl9EQkdJRF9TWU5DX0JFQUNPTl9EV19TVEFUUyAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDYxKQorLyogYXJnczogYXR0cklkICovCisjZGVmaW5lIE5BTl9EQkdJRF9SWF9VTlNVUFBPUlRFRF9TREZfQVRUUl9JRCAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDYyKQorLyogYXJnczogaGFuZGxlLCBzaWQxLCBzaWQyLCBzdmNDdHJsLCBsZW5ndGggKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1BVQlNVQl9NQVRDSEVEX1NLSVBQRURfU1NJICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNjMpCisvKiBhcmdzOiBvZmZzZXQgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX01BVENIX0ZJTFRFUl9PRkZTRVQgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNjQpCisvKiBhcmdzOiB0d1NpemUsIG4sIHR3SW5kZXggKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1RXX1BBUkFNUyAgICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNjUpCisvKiBhcmdzOiAqLworI2RlZmluZSBOQU5fREJHSURfQkVBQ09OX1NFTkRFUiAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA2NikKKy8qIGFyZ3M6IGN1cnJUc2YsIG5leHREd1RzZiAqLworI2RlZmluZSBOQU5fREJHSURfVFNGX0RVTVAgICAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA2NykKKy8qIGFyZ3M6IGNoYW4sIHN0YXJ0U2xvdCwgbnVtU2xvdHMsIHJlcGVhdCAqLworI2RlZmluZSBOQU5fREJHSURfRkFXX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA2OCkKKy8qIGFyZ3M6ICovCisjZGVmaW5lIE5BTl9EQkdJRF9GQVdfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDY5KQorLyogYXJnczogKi8KKyNkZWZpbmUgTkFOX0RCR0lEX0ZBV19FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNzApCisvKiBhcmdzOiBvZmZzZXQsIG9sZHZhbCwgbmV3dmFsICovCisjZGVmaW5lIE5BTl9EQkdJRF9DT05GSUdfUEFSQU1fQ0hBTkdFRCAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDcxKQorLyogYXJnczogPG5vbmU+ICovCisjZGVmaW5lIE5BTl9EQkdJRF9DT05OX0NBUF9BVFRSX0NMRUFSRUQgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDcyKQorLyogYXJnczogY29ublR5cGUgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1BPU1RfRElTQ19BVFRSX0NMRUFSRUQgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNzMpCisvKiBhcmdzOiA8bm9uZT4gKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1ZFTkRPUl9TUEVDSUZJQ19BVFRSX0NMRUFSRUQgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNzQpCisvKiBhcmdzOiBvZmZzZXQgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1dMQU5fSU5GUkFfTUFQX0NUUkxfT0ZGU0VUICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNzUpCisvKiBhcmdzOiBvZmZzZXQgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1dMQU5fSU5GUkFfQUlfQklUTUFQX09GRlNFVCAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNzYpCisvKiBhcmdzOiBvZmZzZXQgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1dMQU5fSU5GUkFfREVWSUNFX1JPTEVfT0ZGU0VUICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNzcpCisvKiBhcmdzOiBvZmZzZXQgKi8KKyNkZWZpbmUgTkFOX0RCR0lEX01FU0hfSURfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgNzgpCisvKiBhcmdzOiAqLworI2RlZmluZSBOQU5fREJHSURfU1BBUkVfNzkgICAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA3OSkKKy8qIGFyZ3M6ICovCisjZGVmaW5lIE5BTl9EQkdJRF9TUEFSRV84MCAgICAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDgwKQorLyogYXJnczogKi8KKyNkZWZpbmUgTkFOX0RCR0lEX1NQQVJFXzgxICAgICAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0VWVF9CQVNFICsgODEpCisvKiBhcmdzOiAqLworI2RlZmluZSBOQU5fREJHSURfU1BBUkVfODIgICAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA4MikKKy8qIGFyZ3M6ICovCisjZGVmaW5lIE5BTl9EQkdJRF9TUEFSRV84MyAgICAgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9FVlRfQkFTRSArIDgzKQorLyogUExFQVNFIEtFRVAgVEhJUyBPTkUgQVQgVEhFIEVORCAqLworI2RlZmluZSBOQU5fREJHSURfRVZUX0xPR19MQVNUICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfRVZUX0JBU0UgKyA4NCkKKworLyogRGVidWcgSURzIGZvciBtZXNzYWdlIGxvZ3MuICovCisjZGVmaW5lIE5BTl9EQkdJRF9BUElfTVNHX0JBU0UgICAgICAgICAgICAgICAgICAgICAgTkFOX0RCR0lEX0VWVF9MT0dfTEFTVAorI2RlZmluZSBOQU5fREJHSURfQVBJX01TR19IRUFERVIgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfQVBJX01TR19CQVNFICsgMCkKKyNkZWZpbmUgTkFOX0RCR0lEX0FQSV9NU0dfREFUQSAgICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX0FQSV9NU0dfQkFTRSArIDEpCisjZGVmaW5lIE5BTl9EQkdJRF9BUElfTVNHX0xBU1QgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9BUElfTVNHX0JBU0UgKyAyKQorCisvKiBEZWJ1ZyBJRHMgZm9yIHBhY2tldCBsb2dzLiAqLworI2RlZmluZSBOQU5fREJHSURfT1RBX1BLVF9CQVNFICAgICAgICAgICAgICAgICAgICAgIE5BTl9EQkdJRF9BUElfTVNHX0xBU1QKKyNkZWZpbmUgTkFOX0RCR0lEX09UQV9QS1RfSEVBREVSICAgICAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX09UQV9QS1RfQkFTRSArIDApCisjZGVmaW5lIE5BTl9EQkdJRF9PVEFfUEtUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9PVEFfUEtUX0JBU0UgKyAxKQorI2RlZmluZSBOQU5fREJHSURfT1RBX1BLVF9MQVNUICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfT1RBX1BLVF9CQVNFICsgMikgLyogIG5vdCByZWFsbHkgdGhlIGxhc3QhICovCisKKyNkZWZpbmUgTkFOX0RCR0lEX0JFQUNPTl9SWF9USU1FUyAgICAgICAgICAgICAgIChOQU5fREJHSURfT1RBX1BLVF9MQVNUICsgMCkKKyNkZWZpbmUgTkFOX0RCR0lEX0JFQUNPTl9SWF9NQU5EQVRPUllfQVRUUlMgICAgIChOQU5fREJHSURfT1RBX1BLVF9MQVNUICsgMSkKKyNkZWZpbmUgTkFOX0RCR0lEX0JFQUNPTl9SWF9TSURfQVRUUiAgICAgICAgICAgIChOQU5fREJHSURfT1RBX1BLVF9MQVNUICsgMikKKyNkZWZpbmUgTkFOX0RCR0lEX0JFQUNPTl9SWF9WU0FfQVRUUiAgICAgICAgICAgIChOQU5fREJHSURfT1RBX1BLVF9MQVNUICsgMykKKyNkZWZpbmUgTkFOX0RCR0lEX0JFQUNPTl9SWF9BVkdfUlNTSSAgICAgICAgICAgIChOQU5fREJHSURfT1RBX1BLVF9MQVNUICsgNCkKKyNkZWZpbmUgTkFOX0RCR0lEX0NBTkRJREFURV9CRUFDT05TICAgICAgICAgICAgIChOQU5fREJHSURfT1RBX1BLVF9MQVNUICsgNSkKKyNkZWZpbmUgTkFOX0RCR0lEX1RTRl9PRkZTRVQgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfT1RBX1BLVF9MQVNUICsgNikKKyNkZWZpbmUgTkFOX0RCR0lEX0FOQ0hPUk1BU1RFUl9SRUNPUkRfVVBEQVRFX0xBU1QgICAgICAgKE5BTl9EQkdJRF9PVEFfUEtUX0xBU1QgKyA3KQorI2RlZmluZSBOQU5fREJHSURfQU5DSE9STUFTVEVSX1JFQ09SRF9FWFBJUkVEMiAgKE5BTl9EQkdJRF9PVEFfUEtUX0xBU1QgKyA4KQorI2RlZmluZSBOQU5fREJHSURfQkVBQ09OX1RYX1NFTkQgICAgICAgICAgICAgICAgKE5BTl9EQkdJRF9PVEFfUEtUX0xBU1QgKyA5KQorI2RlZmluZSBOQU5fREJHSURfQkVBQ09OX1RYX0NBTkNFTCAgICAgICAgICAgICAgKE5BTl9EQkdJRF9PVEFfUEtUX0xBU1QgKyAxMCkKKyNkZWZpbmUgTkFOX0RCR0lEX05BTl9TQ0FOX0VWRU5UICAgICAgICAgICAgICAgIChOQU5fREJHSURfT1RBX1BLVF9MQVNUICsgMTEpCisjZGVmaW5lIE5BTl9EQkdJRF9OQU5fU0RGX1FVRVVFRCAgICAgICAgICAgICAgICAoTkFOX0RCR0lEX09UQV9QS1RfTEFTVCArIDEyKQorI2RlZmluZSBOQU5fREJHSURfTkFOX0JFQUNPTl9RVUVVRUQgICAgICAgICAgICAgKE5BTl9EQkdJRF9PVEFfUEtUX0xBU1QgKyAxMykKKyNkZWZpbmUgTkFOX0RCR0lEX05BTl9OT1RfQUxMT1dFRCAgICAgICAgICAgICAgIChOQU5fREJHSURfT1RBX1BLVF9MQVNUICsgMTQpCisKKyNkZWZpbmUgTkFOX0RCR0lEX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgIChOQU5fREJHSURfTkFOX05PVF9BTExPV0VEICsgMSkKKworLyogSUJTUyBQUyBtb2R1bGUgREJHSURzKi8KKyNkZWZpbmUgSUJTU19QU19EQkdJRF9ERUZJTklUSU9OX1NUQVJUICAgICAgICAgICAwCisjZGVmaW5lIElCU1NfUFNfREJHSURfUEVFUl9DUkVBVEUgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJQlNTX1BTX0RCR0lEX1BFRVJfREVMRVRFICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSUJTU19QU19EQkdJRF9WREVWX0NSRUFURSAgICAgICAgICAgICAgICAzCisjZGVmaW5lIElCU1NfUFNfREJHSURfVkRFVl9ERUxFVEUgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJQlNTX1BTX0RCR0lEX1ZERVZfRVZFTlQgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgSUJTU19QU19EQkdJRF9QRUVSX0VWRU5UICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIElCU1NfUFNfREJHSURfREVMSVZFUl9DQUIgICAgICAgICAgICAgICAgNworI2RlZmluZSBJQlNTX1BTX0RCR0lEX0RFTElWRVJfVUNfREFUQSAgICAgICAgICAgIDgKKyNkZWZpbmUgSUJTU19QU19EQkdJRF9ERUxJVkVSX1VDX0RBVEFfRVJST1IgICAgICA5CisjZGVmaW5lIElCU1NfUFNfREJHSURfVUNfSU5BQ1RJVklUWV9UTVJfUkVTVEFSVCAxMAorI2RlZmluZSBJQlNTX1BTX0RCR0lEX01DX0lOQUNUSVZJVFlfVE1SX1JFU1RBUlQgMTEKKyNkZWZpbmUgSUJTU19QU19EQkdJRF9OVUxMX1RYX0NPTVBMRVRJT04gICAgICAgIDEyCisjZGVmaW5lIElCU1NfUFNfREJHSURfQVRJTV9USU1FUl9TVEFSVCAgICAgICAgICAxMworI2RlZmluZSBJQlNTX1BTX0RCR0lEX1VDX0FUSU1fU0VORCAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgSUJTU19QU19EQkdJRF9CQ19BVElNX1NFTkQgICAgICAgICAgICAgIDE1CisjZGVmaW5lIElCU1NfUFNfREJHSURfVUNfVElNRU9VVCAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBJQlNTX1BTX0RCR0lEX1BXUl9DT0xMQVBTRV9BTExPV0VEICAgICAgMTcKKyNkZWZpbmUgSUJTU19QU19EQkdJRF9QV1JfQ09MTEFQU0VfTk9UX0FMTE9XRUQgIDE4CisjZGVmaW5lIElCU1NfUFNfREJHSURfU0VUX1BBUkFNICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBJQlNTX1BTX0RCR0lEX0hPU1RfVFhfUEFVU0UgICAgICAgICAgICAgMjAKKyNkZWZpbmUgSUJTU19QU19EQkdJRF9IT1NUX1RYX1VOUEFVU0UgICAgICAgICAgIDIxCisjZGVmaW5lIElCU1NfUFNfREJHSURfUFNfREVTQ19CSU5fSFdNICAgICAgICAgICAyMgorI2RlZmluZSBJQlNTX1BTX0RCR0lEX1BTX0RFU0NfQklOX0xXTSAgICAgICAgICAgMjMKKyNkZWZpbmUgSUJTU19QU19EQkdJRF9QU19LSUNLT1VUX1BFRVIgICAgICAgICAgIDI0CisjZGVmaW5lIElCU1NfUFNfREJHSURfU0VUX1BFRVJfUEFSQU0gICAgICAgICAgICAyNQorI2RlZmluZSBJQlNTX1BTX0RCR0lEX0JDTl9BVElNX1dJTl9NSVNNQVRDSCAgICAgMjYKKyNkZWZpbmUgSUJTU19QU19EQkdJRF9SWF9DSEFJTk1BU0tfQ0hBTkdFICAgICAgIDI3CisKKy8qIEhJRiBVQVJUIEludGVyZmFjZSBEQkdJRHMgKi8KKyNkZWZpbmUgSElGX1VBUlRfREJHSURfU1RBUlQgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhJRl9VQVJUX0RCR0lEX1BPV0VSX1NUQVRFICAgICAgICAgMQorI2RlZmluZSBISUZfVUFSVF9EQkdJRF9UWFJYX0ZMT1cgICAgICAgICAgIDIKKyNkZWZpbmUgSElGX1VBUlRfREJHSURfVFhSWF9DVFJMX0NIQVIgICAgICAzCisjZGVmaW5lIEhJRl9VQVJUX0RCR0lEX1RYUlhfQlVGX0RVTVAgICAgICAgNAorCisvKiBFWFRTQ0FOIERCR0lEcyAqLworI2RlZmluZSBFWFRTQ0FOX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBFWFRTQ0FOX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBFWFRTQ0FOX0NMRUFSX0VOVFJZX0NPTlRFTlQgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBFWFRTQ0FOX0dFVF9GUkVFX0VOVFJZX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBFWFRTQ0FOX0dFVF9GUkVFX0VOVFJZX0lOQ09OU0lTVEVOVCAgICAgICAgICAgICAgNAorI2RlZmluZSBFWFRTQ0FOX0dFVF9GUkVFX0VOVFJZX05PX01PUkVfRU5UUklFUyAgICAgICAgICAgNQorI2RlZmluZSBFWFRTQ0FOX0NSRUFURV9FTlRSWV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBFWFRTQ0FOX0NSRUFURV9FTlRSWV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBFWFRTQ0FOX1NFQVJDSF9TQ0FOX0VOVFJZX1FVRVVFICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBFWFRTQ0FOX1NFQVJDSF9TQ0FOX0VOVFJZX0tFWV9GT1VORCAgICAgICAgICAgICAgOQorI2RlZmluZSBFWFRTQ0FOX1NFQVJDSF9TQ0FOX0VOVFJZX0tFWV9OT1RfRk9VTkQgICAgICAgICAxMAorI2RlZmluZSBFWFRTQ0FOX0FERF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBFWFRTQ0FOX0JVQ0tFVF9TRU5EX09QRVJBVElPTl9FVkVOVCAgICAgICAgICAgICAxMgorI2RlZmluZSBFWFRTQ0FOX0JVQ0tFVF9TRU5EX09QRVJBVElPTl9FVkVOVF9GQUlMRUQgICAgICAxMworI2RlZmluZSBFWFRTQ0FOX0JVQ0tFVF9TVEFSVF9TQ0FOX0NZQ0xFICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBFWFRTQ0FOX0JVQ0tFVF9QRVJJT0RJQ19USU1FUiAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBFWFRTQ0FOX1NFTkRfU1RBUlRfU1RPUF9FVkVOVCAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBFWFRTQ0FOX05PVElGWV9XTEFOX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBFWFRTQ0FOX05PVElGWV9XTEFOX0hPVExJU1RfTUFUQ0ggICAgICAgICAgICAgICAxOAorI2RlZmluZSBFWFRTQ0FOX01BSU5fUkVDRUlWRURfRlJBTUUgICAgICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBFWFRTQ0FOX01BSU5fTk9fU1NJRF9JRSAgICAgICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBFWFRTQ0FOX01BSU5fTUFMRk9STUVEX0ZSQU1FICAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBFWFRTQ0FOX0ZJTkRfQlNTSURfQllfUkVGRVJFTkNFICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBFWFRTQ0FOX0ZJTkRfQlNTSURfQllfUkVGRVJFTkNFX0VSUk9SICAgICAgICAgICAyMworI2RlZmluZSBFWFRTQ0FOX05PVElGWV9UQUJMRV9VU0FHRSAgICAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBFWFRTQ0FOX0ZPVU5EX1JTU0lfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAyNQorI2RlZmluZSBFWFRTQ0FOX0JTU0lEX0ZPVU5EX1JTU0lfU0FNUExFICAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBFWFRTQ0FOX0JTU0lEX0FEREVEX1JTU0lfU0FNUExFICAgICAgICAgICAgICAgICAyNworI2RlZmluZSBFWFRTQ0FOX0JTU0lEX1JFUExBQ0VEX1JTU0lfU0FNUExFICAgICAgICAgICAgICAyOAorI2RlZmluZSBFWFRTQ0FOX0JTU0lEX1RSQU5TRkVSX0NVUlJFTlRfU0FNUExFUyAgICAgICAgICAyOQorI2RlZmluZSBFWFRTQ0FOX0JVQ0tFVF9QUk9DRVNTX1NDQU5fRVZFTlQgICAgICAgICAgICAgICAzMAorI2RlZmluZSBFWFRTQ0FOX0JVQ0tFVF9DQU5OT1RfRklORF9CVUNLRVQgICAgICAgICAgICAgICAzMQorI2RlZmluZSBFWFRTQ0FOX1NUQVJUX1NDQU5fUkVRVUVTVF9GQUlMRUQgICAgICAgICAgICAgICAzMgorI2RlZmluZSBFWFRTQ0FOX0JVQ0tFVF9TVE9QX0NVUlJFTlRfU0NBTlMgICAgICAgICAgICAgICAzMworI2RlZmluZSBFWFRTQ0FOX0JVQ0tFVF9TQ0FOX1NUT1BfUkVRVUVTVCAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBFWFRTQ0FOX0JVQ0tFVF9QRVJJT0RJQ19USU1FUl9FUlJPUiAgICAgICAgICAgICAzNQorI2RlZmluZSBFWFRTQ0FOX0JVQ0tFVF9TVEFSVF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBFWFRTQ0FOX1NUQVJUX0lOVEVSTkFMX0VSUk9SICAgICAgICAgICAgICAgICAgICAzNworI2RlZmluZSBFWFRTQ0FOX05PVElGWV9IT1RMSVNUX01BVENIICAgICAgICAgICAgICAgICAgICAzOAorI2RlZmluZSBFWFRTQ0FOX0NPTkZJR19IT1RMSVNUX1RBQkxFICAgICAgICAgICAgICAgICAgICAzOQorI2RlZmluZSBFWFRTQ0FOX0NPTkZJR19XTEFOX0NIQU5HRV9UQUJMRSAgICAgICAgICAgICAgICA0MAorCisvKiBOTE8gREJHSURzICovCisjZGVmaW5lIE5MT19EQkdJRF9TU0lEX1RPX0JFX1NDQU5ORURfTElTVCAwCisjZGVmaW5lIE5MT19EQkdJRF9TU0lEX1RPX0JFX1NLSVBQRURfTElTVCAxCisKKy8qIENoYW5uZWwgcHJlZGljdGlvbi9yZWR1Y3Rpb24gREJHSURzICovCisjZGVmaW5lIFNDQU5fQ0hfUFJFRElDVF9EQkdJRF9ERUZJTklUSU9OX1NUQVJUICAgICAgICAgIDAKKyNkZWZpbmUgU0NBTl9DSF9QUkVESUNUX0NBTENVTEFURSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTQ0FOX0NIX1BSRURJQ1RfQ0FMQ1VMQVRFX1NBTVBMRSAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNDQU5fQ0hfUFJFRElDVF9DQUxDVUxBVEVfUkVTVUxUICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0NBTl9DSF9QUkVESUNUX0ZPVU5EX0JTUyAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBTQ0FOX0NIX1BSRURJQ1RfU0NBTl9TVEFSVCAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNDQU5fQ0hfUFJFRElDVF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU0NBTl9DSF9QUkVESUNUX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBTQ0FOX0NIX1BSRURJQ1RfREJHSURfREVGSU5JVElPTl9FTkQgICAgICAgICAgICA4CisKKy8qIERTUkMgREJHSURzICovCisjZGVmaW5lICBPQ0JfREJHSURfVkRFVl9DUkVBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgIE9DQl9EQkdJRF9WREVWX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSAgT0NCX0RCR0lEX0NIQU5fUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lICBPQ0JfREJHSURfQ0hBTl9VTlBBVVNFICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgIE9DQl9EQkdJRF9QRUVSX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSAgT0NCX0RCR0lEX1BFRVJfREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lICBPQ0JfREJHSURfRENDX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgIE9DQl9EQkdJRF9EQ0NfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSAgT0NCX0RCR0lEX1NFVF9DT05GSUdfQ01EICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lICBPQ0JfREJHSURfU0VUX1VUQ19USU1FX0NNRCAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgIE9DQl9EQkdJRF9TVEFSVF9USU1JTkdfQURWRVJUX0NNRCAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgIE9DQl9EQkdJRF9TVE9QX1RJTUlOR19BRFZFUlRfQ01EICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgIE9DQl9EQkdJRF9HRVRfVFNGX1RJTUVSX0NNRCAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgIE9DQl9EQkdJRF9HRVRfRENDX1NUQVRTX0NNRCAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgIE9DQl9EQkdJRF9VUERBVEVfRENDX05ETF9DTUQgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgIE9DQl9EQkdJRF9TRVRfQ09ORklHX1JFU1BfRVZFTlQgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgIE9DQl9EQkdJRF9HRVRfVFNGX1RJTUVSX1JFU1BfRVZFTlQgICAgICAgICAgICAgMTYKKyNkZWZpbmUgIE9DQl9EQkdJRF9HRVRfRENDX1NUQVRTX1JFU1BfRVZFTlQgICAgICAgICAgICAgMTcKKyNkZWZpbmUgIE9DQl9EQkdJRF9EQ0NfU1RBVFNfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgIE9DQl9VUERBVEVfRENDX05ETF9SRVNQX0VWRU5UICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgIE9DQl9EQkdJRF9HRU5FUklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgIE9DQl9EQkdJRF9WREVWX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgIE9DQl9EQkdJRF9DSEFOTkVMX1NDSEVEX0VWRU5UICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgIE9DQl9EQkdJRF9HUFNfRVZFTlRfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgIE9DQl9EQkdJRF9HUFNfRVZFTlRfRU5EICAgICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgIE9DQl9EQkdJRF9UWF9UQV9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgIE9DQl9EQkdJRF9SWF9UQV9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgMjYKKworLyogVXAgdG8gMjU1IHJlc2VydmVkIGZvciBPQ0IgZGVidWcgSURzICovCisKKyNkZWZpbmUgIERDQ19EQkdJRF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lICBEQ0NfREJHSURfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NworI2RlZmluZSAgRENDX0RCR0lEX0RDQ19TVEFUU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAyNTgKKyNkZWZpbmUgIERDQ19EQkdJRF9TTV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU5CisjZGVmaW5lICBEQ0NfREJHSURfU01fRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2MAorI2RlZmluZSAgRENDX0RCR0lEX1NNX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjEKKyNkZWZpbmUgIERDQ19EQkdJRF9HRVRfVFhfQUxMT1dFRCAgICAgICAgICAgICAgICAgICAgICAgMjYyCisjZGVmaW5lICBEQ0NfREJHSURfTk9USUZZX1RYX0NPTVBMRVRJT04gICAgICAgICAgICAgICAgIDI2MworI2RlZmluZSAgRENDX0RCR0lEX05PVElGWV9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjQKKyNkZWZpbmUgIERDQ19EQkdJRF9HRVRfVFhfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgMjY1CisjZGVmaW5lICBEQ0NfREJHSURfR0VUX1RYX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDI2NgorI2RlZmluZSAgRENDX0RCR0lEX1RJQ0tMRV9TQ0hFRCAgICAgICAgICAgICAgICAgICAgICAgICAyNjcKKyNkZWZpbmUgIERDQ19EQkdJRF9HRU5FUklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY4CisjZGVmaW5lICBEQ0NfREJHSURfUlhfUEFUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OQorI2RlZmluZSAgRENDX0RCR0lEX1RYX1BBVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzAKKworLyogUlNTSSBUaHJlc2hvbGQgTW9uaXRvciBEQkdJRHMqLworI2RlZmluZSBSU1NJX01PTklUT1JfREJHSURfREVGSU5JVElPTl9TVEFSVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUlNTSV9NT05JVE9SX1ZERVZfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJTU0lfTU9OSVRPUl9WREVWX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSU1NJX01PTklUT1JfVkRFVl9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUlNTSV9NT05JVE9SX0hXX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFJTU0lfTU9OSVRPUl9FTkFCTEVfVEhSRVNIT0xEU19DTElFTlRfUkVRICAgICAgICAgNQorI2RlZmluZSBSU1NJX01PTklUT1JfRU5BQkxFX1RIUkVTSE9MRFNfQ0xJRU5UX1JFUV9FUlIgICAgIDYKKyNkZWZpbmUgUlNTSV9NT05JVE9SX0RJU0FCTEVfVEhSRVNIT0xEU19DTElFTlRfUkVRICAgICAgICA3CisjZGVmaW5lIFJTU0lfTU9OSVRPUl9ESVNBQkxFX1RIUkVTSE9MRFNfQ0xJRU5UX1JFUV9FUlIgICAgOAorI2RlZmluZSBSU1NJX01PTklUT1JfQVJCSVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgUlNTSV9NT05JVE9SX0FSQklURVJfQ09ORklHX0hXICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFJTU0lfTU9OSVRPUl9DSEVDS19BTkRfREVMSVZFUl9FVkVOVCAgICAgICAgICAgICAxMQorI2RlZmluZSBSU1NJX01PTklUT1JfREVMSVZFUl9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUlNTSV9NT05JVE9SX1VQREFURV9CRUFDT05fUlNTSSAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFJTU0lfTU9OSVRPUl9EQkdJRF9ERUZJTklUSU9OX0VORCAgICAgICAgICAgICAgICAxNAorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9EQkdMT0dfSURfSF8gKi8KZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvZWZ1c2VfcmVnLmggYi90YXJnZXQvaW5jL2VmdXNlX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmY5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL2VmdXNlX3JlZy5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9FRlVTRV9SRUdfUkVHX0hfCisjZGVmaW5lIF9FRlVTRV9SRUdfUkVHX0hfCisKKyNkZWZpbmUgRUZVU0VfV1JfRU5BQkxFX1JFR19BRERSRVNTICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEVGVVNFX1dSX0VOQUJMRV9SRUdfT0ZGU0VUICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBFRlVTRV9XUl9FTkFCTEVfUkVHX1ZfTVNCICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRUZVU0VfV1JfRU5BQkxFX1JFR19WX0xTQiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEVGVVNFX1dSX0VOQUJMRV9SRUdfVl9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFRlVTRV9XUl9FTkFCTEVfUkVHX1ZfR0VUKHgpICAgICAgICAgICAgICgoKHgpICYgRUZVU0VfV1JfRU5BQkxFX1JFR19WX01BU0spID4+IEVGVVNFX1dSX0VOQUJMRV9SRUdfVl9MU0IpCisjZGVmaW5lIEVGVVNFX1dSX0VOQUJMRV9SRUdfVl9TRVQoeCkgICAgICAgICAgICAgKCgoeCkgPDwgRUZVU0VfV1JfRU5BQkxFX1JFR19WX0xTQikgJiBFRlVTRV9XUl9FTkFCTEVfUkVHX1ZfTUFTSykKKworI2RlZmluZSBFRlVTRV9JTlRfRU5BQkxFX1JFR19BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRUZVU0VfSU5UX0VOQUJMRV9SRUdfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVGVVNFX0lOVF9FTkFCTEVfUkVHX1ZfTVNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBFRlVTRV9JTlRfRU5BQkxFX1JFR19WX0xTQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRUZVU0VfSU5UX0VOQUJMRV9SRUdfVl9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVGVVNFX0lOVF9FTkFCTEVfUkVHX1ZfR0VUKHgpICAgICAgICAgICAgKCgoeCkgJiBFRlVTRV9JTlRfRU5BQkxFX1JFR19WX01BU0spID4+IEVGVVNFX0lOVF9FTkFCTEVfUkVHX1ZfTFNCKQorI2RlZmluZSBFRlVTRV9JTlRfRU5BQkxFX1JFR19WX1NFVCh4KSAgICAgICAgICAgICgoKHgpIDw8IEVGVVNFX0lOVF9FTkFCTEVfUkVHX1ZfTFNCKSAmIEVGVVNFX0lOVF9FTkFCTEVfUkVHX1ZfTUFTSykKKworI2RlZmluZSBFRlVTRV9JTlRfU1RBVFVTX1JFR19BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRUZVU0VfSU5UX1NUQVRVU19SRUdfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEVGVVNFX0lOVF9TVEFUVVNfUkVHX1ZfTVNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBFRlVTRV9JTlRfU1RBVFVTX1JFR19WX0xTQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRUZVU0VfSU5UX1NUQVRVU19SRUdfVl9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVGVVNFX0lOVF9TVEFUVVNfUkVHX1ZfR0VUKHgpICAgICAgICAgICAgKCgoeCkgJiBFRlVTRV9JTlRfU1RBVFVTX1JFR19WX01BU0spID4+IEVGVVNFX0lOVF9TVEFUVVNfUkVHX1ZfTFNCKQorI2RlZmluZSBFRlVTRV9JTlRfU1RBVFVTX1JFR19WX1NFVCh4KSAgICAgICAgICAgICgoKHgpIDw8IEVGVVNFX0lOVF9TVEFUVVNfUkVHX1ZfTFNCKSAmIEVGVVNFX0lOVF9TVEFUVVNfUkVHX1ZfTUFTSykKKworI2RlZmluZSBCSVRNQVNLX1dSX1JFR19BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgQklUTUFTS19XUl9SRUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBjCisjZGVmaW5lIEJJVE1BU0tfV1JfUkVHX1ZfTVNCICAgICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgQklUTUFTS19XUl9SRUdfVl9MU0IgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJJVE1BU0tfV1JfUkVHX1ZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBCSVRNQVNLX1dSX1JFR19WX0dFVCh4KSAgICAgICAgICAgICAgICAgICgoKHgpICYgQklUTUFTS19XUl9SRUdfVl9NQVNLKSA+PiBCSVRNQVNLX1dSX1JFR19WX0xTQikKKyNkZWZpbmUgQklUTUFTS19XUl9SRUdfVl9TRVQoeCkgICAgICAgICAgICAgICAgICAoKCh4KSA8PCBCSVRNQVNLX1dSX1JFR19WX0xTQikgJiBCSVRNQVNLX1dSX1JFR19WX01BU0spCisKKyNkZWZpbmUgVkREUV9TRVRUTEVfVElNRV9SRUdfQUREUkVTUyAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFZERFFfU0VUVExFX1RJTUVfUkVHX09GRlNFVCAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBWRERRX1NFVFRMRV9USU1FX1JFR19WX01TQiAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFZERFFfU0VUVExFX1RJTUVfUkVHX1ZfTFNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBWRERRX1NFVFRMRV9USU1FX1JFR19WX01BU0sgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgVkREUV9TRVRUTEVfVElNRV9SRUdfVl9HRVQoeCkgICAgICAgICAgICAoKCh4KSAmIFZERFFfU0VUVExFX1RJTUVfUkVHX1ZfTUFTSykgPj4gVkREUV9TRVRUTEVfVElNRV9SRUdfVl9MU0IpCisjZGVmaW5lIFZERFFfU0VUVExFX1RJTUVfUkVHX1ZfU0VUKHgpICAgICAgICAgICAgKCgoeCkgPDwgVkREUV9TRVRUTEVfVElNRV9SRUdfVl9MU0IpICYgVkREUV9TRVRUTEVfVElNRV9SRUdfVl9NQVNLKQorCisjZGVmaW5lIFZERFFfSE9MRF9USU1FX1JFR19BRERSRVNTICAgICAgICAgICAgICAgMHgwMDAwMDAxNAorI2RlZmluZSBWRERRX0hPTERfVElNRV9SRUdfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAwMTQKKyNkZWZpbmUgVkREUV9IT0xEX1RJTUVfUkVHX1ZfTVNCICAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBWRERRX0hPTERfVElNRV9SRUdfVl9MU0IgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVkREUV9IT0xEX1RJTUVfUkVHX1ZfTUFTSyAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIFZERFFfSE9MRF9USU1FX1JFR19WX0dFVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiBWRERRX0hPTERfVElNRV9SRUdfVl9NQVNLKSA+PiBWRERRX0hPTERfVElNRV9SRUdfVl9MU0IpCisjZGVmaW5lIFZERFFfSE9MRF9USU1FX1JFR19WX1NFVCh4KSAgICAgICAgICAgICAgKCgoeCkgPDwgVkREUV9IT0xEX1RJTUVfUkVHX1ZfTFNCKSAmIFZERFFfSE9MRF9USU1FX1JFR19WX01BU0spCisKKyNkZWZpbmUgUkRfU1RST0JFX1BXX1JFR19BRERSRVNTICAgICAgICAgICAgICAgICAweDAwMDAwMDE4CisjZGVmaW5lIFJEX1NUUk9CRV9QV19SRUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOAorI2RlZmluZSBSRF9TVFJPQkVfUFdfUkVHX1ZfTVNCICAgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFJEX1NUUk9CRV9QV19SRUdfVl9MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSRF9TVFJPQkVfUFdfUkVHX1ZfTUFTSyAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgUkRfU1RST0JFX1BXX1JFR19WX0dFVCh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIFJEX1NUUk9CRV9QV19SRUdfVl9NQVNLKSA+PiBSRF9TVFJPQkVfUFdfUkVHX1ZfTFNCKQorI2RlZmluZSBSRF9TVFJPQkVfUFdfUkVHX1ZfU0VUKHgpICAgICAgICAgICAgICAgICgoKHgpIDw8IFJEX1NUUk9CRV9QV19SRUdfVl9MU0IpICYgUkRfU1RST0JFX1BXX1JFR19WX01BU0spCisKKyNkZWZpbmUgUEdfU1RST0JFX1BXX1JFR19BRERSRVNTICAgICAgICAgICAgICAgICAweDAwMDAwMDFjCisjZGVmaW5lIFBHX1NUUk9CRV9QV19SRUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxYworI2RlZmluZSBQR19TVFJPQkVfUFdfUkVHX1ZfTVNCICAgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFBHX1NUUk9CRV9QV19SRUdfVl9MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQR19TVFJPQkVfUFdfUkVHX1ZfTUFTSyAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgUEdfU1RST0JFX1BXX1JFR19WX0dFVCh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIFBHX1NUUk9CRV9QV19SRUdfVl9NQVNLKSA+PiBQR19TVFJPQkVfUFdfUkVHX1ZfTFNCKQorI2RlZmluZSBQR19TVFJPQkVfUFdfUkVHX1ZfU0VUKHgpICAgICAgICAgICAgICAgICgoKHgpIDw8IFBHX1NUUk9CRV9QV19SRUdfVl9MU0IpICYgUEdfU1RST0JFX1BXX1JFR19WX01BU0spCisKKyNkZWZpbmUgUEdFTkJfU0VUVVBfSE9MRF9USU1FX1JFR19BRERSRVNTICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFBHRU5CX1NFVFVQX0hPTERfVElNRV9SRUdfT0ZGU0VUICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBQR0VOQl9TRVRVUF9IT0xEX1RJTUVfUkVHX1ZfTVNCICAgICAgICAgIDMxCisjZGVmaW5lIFBHRU5CX1NFVFVQX0hPTERfVElNRV9SRUdfVl9MU0IgICAgICAgICAgMAorI2RlZmluZSBQR0VOQl9TRVRVUF9IT0xEX1RJTUVfUkVHX1ZfTUFTSyAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgUEdFTkJfU0VUVVBfSE9MRF9USU1FX1JFR19WX0dFVCh4KSAgICAgICAoKCh4KSAmIFBHRU5CX1NFVFVQX0hPTERfVElNRV9SRUdfVl9NQVNLKSA+PiBQR0VOQl9TRVRVUF9IT0xEX1RJTUVfUkVHX1ZfTFNCKQorI2RlZmluZSBQR0VOQl9TRVRVUF9IT0xEX1RJTUVfUkVHX1ZfU0VUKHgpICAgICAgICgoKHgpIDw8IFBHRU5CX1NFVFVQX0hPTERfVElNRV9SRUdfVl9MU0IpICYgUEdFTkJfU0VUVVBfSE9MRF9USU1FX1JFR19WX01BU0spCisKKyNkZWZpbmUgU1RST0JFX1BVTFNFX0lOVEVSVkFMX1JFR19BRERSRVNTICAgICAgICAweDAwMDAwMDI0CisjZGVmaW5lIFNUUk9CRV9QVUxTRV9JTlRFUlZBTF9SRUdfT0ZGU0VUICAgICAgICAgMHgwMDAwMDAyNAorI2RlZmluZSBTVFJPQkVfUFVMU0VfSU5URVJWQUxfUkVHX1ZfTVNCICAgICAgICAgIDMxCisjZGVmaW5lIFNUUk9CRV9QVUxTRV9JTlRFUlZBTF9SRUdfVl9MU0IgICAgICAgICAgMAorI2RlZmluZSBTVFJPQkVfUFVMU0VfSU5URVJWQUxfUkVHX1ZfTUFTSyAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgU1RST0JFX1BVTFNFX0lOVEVSVkFMX1JFR19WX0dFVCh4KSAgICAgICAoKCh4KSAmIFNUUk9CRV9QVUxTRV9JTlRFUlZBTF9SRUdfVl9NQVNLKSA+PiBTVFJPQkVfUFVMU0VfSU5URVJWQUxfUkVHX1ZfTFNCKQorI2RlZmluZSBTVFJPQkVfUFVMU0VfSU5URVJWQUxfUkVHX1ZfU0VUKHgpICAgICAgICgoKHgpIDw8IFNUUk9CRV9QVUxTRV9JTlRFUlZBTF9SRUdfVl9MU0IpICYgU1RST0JFX1BVTFNFX0lOVEVSVkFMX1JFR19WX01BU0spCisKKyNkZWZpbmUgQ1NCX0FERFJfTE9BRF9TRVRVUF9IT0xEX1JFR19BRERSRVNTICAgICAweDAwMDAwMDI4CisjZGVmaW5lIENTQl9BRERSX0xPQURfU0VUVVBfSE9MRF9SRUdfT0ZGU0VUICAgICAgMHgwMDAwMDAyOAorI2RlZmluZSBDU0JfQUREUl9MT0FEX1NFVFVQX0hPTERfUkVHX1ZfTVNCICAgICAgIDMxCisjZGVmaW5lIENTQl9BRERSX0xPQURfU0VUVVBfSE9MRF9SRUdfVl9MU0IgICAgICAgMAorI2RlZmluZSBDU0JfQUREUl9MT0FEX1NFVFVQX0hPTERfUkVHX1ZfTUFTSyAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQ1NCX0FERFJfTE9BRF9TRVRVUF9IT0xEX1JFR19WX0dFVCh4KSAgICAoKCh4KSAmIENTQl9BRERSX0xPQURfU0VUVVBfSE9MRF9SRUdfVl9NQVNLKSA+PiBDU0JfQUREUl9MT0FEX1NFVFVQX0hPTERfUkVHX1ZfTFNCKQorI2RlZmluZSBDU0JfQUREUl9MT0FEX1NFVFVQX0hPTERfUkVHX1ZfU0VUKHgpICAgICgoKHgpIDw8IENTQl9BRERSX0xPQURfU0VUVVBfSE9MRF9SRUdfVl9MU0IpICYgQ1NCX0FERFJfTE9BRF9TRVRVUF9IT0xEX1JFR19WX01BU0spCisKKyNkZWZpbmUgRUZVU0VfSU5URjBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEVGVVNFX0lOVEYwX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBFRlVTRV9JTlRGMF9SX01TQiAgICAgICAgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIEVGVVNFX0lOVEYwX1JfTFNCICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBFRlVTRV9JTlRGMF9SX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgRUZVU0VfSU5URjBfUl9HRVQoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIEVGVVNFX0lOVEYwX1JfTUFTSykgPj4gRUZVU0VfSU5URjBfUl9MU0IpCisjZGVmaW5lIEVGVVNFX0lOVEYwX1JfU0VUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPDwgRUZVU0VfSU5URjBfUl9MU0IpICYgRUZVU0VfSU5URjBfUl9NQVNLKQorCisjZGVmaW5lIEVGVVNFX0lOVEYxX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBFRlVTRV9JTlRGMV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRUZVU0VfSU5URjFfUl9NU0IgICAgICAgICAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBFRlVTRV9JTlRGMV9SX0xTQiAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRUZVU0VfSU5URjFfUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEVGVVNFX0lOVEYxX1JfR0VUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiBFRlVTRV9JTlRGMV9SX01BU0spID4+IEVGVVNFX0lOVEYxX1JfTFNCKQorI2RlZmluZSBFRlVTRV9JTlRGMV9SX1NFVCh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpIDw8IEVGVVNFX0lOVEYxX1JfTFNCKSAmIEVGVVNFX0lOVEYxX1JfTUFTSykKKworI2lmbmRlZiBfX0FTU0VNQkxFUl9fCit0eXBlZGVmIHN0cnVjdCBlZnVzZV9yZWdfcmVnX3MgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBlZnVzZV93cl9lbmFibGVfcmVnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBlZnVzZV9pbnRfZW5hYmxlX3JlZzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZWZ1c2VfaW50X3N0YXR1c19yZWc7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGJpdG1hc2tfd3JfcmVnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB2ZGRxX3NldHRsZV90aW1lX3JlZzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdmRkcV9ob2xkX3RpbWVfcmVnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCByZF9zdHJvYmVfcHdfcmVnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBwZ19zdHJvYmVfcHdfcmVnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBwZ2VuYl9zZXR1cF9ob2xkX3RpbWVfcmVnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzdHJvYmVfcHVsc2VfaW50ZXJ2YWxfcmVnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjc2JfYWRkcl9sb2FkX3NldHVwX2hvbGRfcmVnOworCXVuc2lnbmVkIGNoYXIgcGFkMFsyMDA0XTsgICAgICAgLyogcGFkIHRvIDB4ODAwICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGVmdXNlX2ludGYwWzUxMl07CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGVmdXNlX2ludGYxWzUxMl07Cit9IGVmdXNlX3JlZ19yZWdfdDsKKyNlbmRpZiAvKiBfX0FTU0VNQkxFUl9fICovCisKKyNlbmRpZiAvKiBfRUZVU0VfUkVHX0hfICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL2VuZXQuaCBiL3RhcmdldC9pbmMvZW5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZjBjZDYKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL2VuZXQuaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0VORVRfX0hfCisjZGVmaW5lIF9FTkVUX19IXworCisjaWYgZGVmaW5lZChBVEhfVEFSR0VUKQorI2luY2x1ZGUgPG9zYXBpLmg+ICAgICAgICAgICAgICAvKiBBX1VJTlQ4ICovCisjZWxzZQorI2luY2x1ZGUgPGFfdHlwZXMuaD4gICAgICAgICAgICAvKiBBX1VJTlQ4ICovCisjZW5kaWYKKworI2RlZmluZSBFVEhFUk5FVF9BRERSX0xFTiA2ICAgICAvKiBieXRlcyAqLworI2RlZmluZSBFVEhFUk5FVF9UWVBFX0xFTiAyICAgICAvKiBieXRlcyAtIGxlbmd0aCBvZiB0aGUgRXRoZXJuZXQgdHlwZSBmaWVsZCAqLworCitzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QgeworCUFfVUlOVDggZGVzdF9hZGRyW0VUSEVSTkVUX0FERFJfTEVOXTsKKwlBX1VJTlQ4IHNyY19hZGRyW0VUSEVSTkVUX0FERFJfTEVOXTsKKwlBX1VJTlQ4IGV0aGVydHlwZVtFVEhFUk5FVF9UWVBFX0xFTl07Cit9OworCisjZGVmaW5lIEVUSEVSTkVUX0hEUl9MRU4gKHNpemVvZihzdHJ1Y3QgZXRoZXJuZXRfaGRyX3QpKQorCisjZGVmaW5lIEVUSEVSTkVUX0NSQ19MRU4gIDQgICAgIC8qIGJ5dGVzIC0gbGVuZ3RoIG9mIHRoZSBFdGhlcm5ldCBDUkMgKi8KKyNkZWZpbmUgRVRIRVJORVRfTUFYX0xFTiAgMTUxOCAgLyogYnl0ZXMgKi8KKworI2RlZmluZSBFVEhFUk5FVF9NVFUgICAgICAgICAgKEVUSEVSTkVUX01BWF9MRU4gLSAoRVRIRVJORVRfSERSX0xFTiArIEVUSEVSX0NSQ19MRU4pKQorCitzdHJ1Y3QgbGxjX3NuYXBfaGRyX3QgeworCUFfVUlOVDggZHNhcDsKKwlBX1VJTlQ4IHNzYXA7CisJQV9VSU5UOCBjbnRsOworCUFfVUlOVDggb3JnX2NvZGVbM107CisJQV9VSU5UOCBldGhlcnR5cGVbMl07Cit9OworCisjZGVmaW5lIExMQ19TTkFQX0hEUl9MRU4gKHNpemVvZihzdHJ1Y3QgbGxjX3NuYXBfaGRyX3QpKQorI2RlZmluZSBMTENfU05BUF9IRFJfT0ZGU0VUX0VUSEVSVFlQRSBcCisJKG9mZnNldG9mKHN0cnVjdCBsbGNfc25hcF9oZHJfdCwgZXRoZXJ0eXBlWzBdKSkKKworI2RlZmluZSBFVEhFUlRZUEVfVkxBTl9MRU4gIDQKKworc3RydWN0IGV0aGVybmV0X3ZsYW5faGRyX3QgeworCUFfVUlOVDggZGVzdF9hZGRyW0VUSEVSTkVUX0FERFJfTEVOXTsKKwlBX1VJTlQ4IHNyY19hZGRyW0VUSEVSTkVUX0FERFJfTEVOXTsKKwlBX1VJTlQ4IHZsYW5fdHBpZFsyXTsKKwlBX1VJTlQ4IHZsYW5fdGNpWzJdOworCUFfVUlOVDggZXRoZXJ0eXBlWzJdOworfTsKKworI2RlZmluZSBFVEhFUlRZUEVfSVNfRUFQT0xfV0FQSSh0eXBlb3JsZW4pCSAgICAgXAorCSgodHlwZW9ybGVuKSA9PSBFVEhFUlRZUEVfUEFFIHx8ICBcCisJICh0eXBlb3JsZW4pID09IEVUSEVSVFlQRV9XQUkpCisKKyNkZWZpbmUgSVNfRVRIRVJUWVBFKF90eXBlT3JMZW4pICgoX3R5cGVPckxlbikgPj0gMHgwNjAwKQorCisjaWZuZGVmIEVUSEVSVFlQRV9JUFY0CisjZGVmaW5lIEVUSEVSVFlQRV9JUFY0ICAweDA4MDAgIC8qIEludGVybmV0IFByb3RvY29sLCBWZXJzaW9uIDQgKElQdjQpICovCisjZW5kaWYKKworI2lmbmRlZiBFVEhFUlRZUEVfQUFSUAorI2RlZmluZSBFVEhFUlRZUEVfQUFSUCAgMHg4MGYzICAvKiBJbnRlcm5hbCBRQ0EgQUFSUCBwcm90b2NvbCAqLworI2VuZGlmCisKKyNpZm5kZWYgRVRIRVJUWVBFX0lQWAorI2RlZmluZSBFVEhFUlRZUEVfSVBYICAgIDB4ODEzNyAvKiBJUFggb3ZlciBESVggcHJvdG9jb2wgKi8KKyNlbmRpZgorCisjaWZuZGVmIEVUSEVSVFlQRV9BUlAKKyNkZWZpbmUgRVRIRVJUWVBFX0FSUCAgIDB4MDgwNiAgLyogQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIChBUlApICovCisjZW5kaWYKKworI2lmbmRlZiBFVEhFUlRZUEVfUkFSUAorI2RlZmluZSBFVEhFUlRZUEVfUkFSUCAgMHg4MDM1ICAvKiBSZXZlcnNlIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbCAoUkFSUCkgKi8KKyNlbmRpZgorCisjaWZuZGVmIEVUSEVSVFlQRV9WTEFOCisjZGVmaW5lIEVUSEVSVFlQRV9WTEFOICAweDgxMDAgIC8qIFZMQU4gVEFHIHByb3RvY29sICovCisjZW5kaWYKKworI2lmbmRlZiBFVEhFUlRZUEVfU05NUAorI2RlZmluZSBFVEhFUlRZUEVfU05NUCAgMHg4MTRDICAvKiBTaW1wbGUgTmV0d29yayBNYW5hZ2VtZW50IFByb3RvY29sIChTTk1QKSAqLworI2VuZGlmCisKKyNpZm5kZWYgRVRIRVJUWVBFX0lQVjYKKyNkZWZpbmUgRVRIRVJUWVBFX0lQVjYgIDB4ODZERCAgLyogSW50ZXJuZXQgUHJvdG9jb2wsIFZlcnNpb24gNiAoSVB2NikgKi8KKyNlbmRpZgorCisjaWZuZGVmIEVUSEVSVFlQRV9QQUUKKyNkZWZpbmUgRVRIRVJUWVBFX1BBRSAgIDB4ODg4RSAgLyogRUFQIG92ZXIgTEFOIChFQVBPTCkgKi8KKyNlbmRpZgorCisjaWZuZGVmIEVUSEVSVFlQRV9XQUkKKyNkZWZpbmUgRVRIRVJUWVBFX1dBSSAgIDB4ODhCNCAgLyogV0FQSSAqLworI2VuZGlmCisKKyNpZm5kZWYgRVRIRVJUWVBFX1RETFMKKyNkZWZpbmUgRVRIRVJUWVBFX1RETFMgIDB4ODkwRCAgLyogVERMUyAqLworI2VuZGlmCisKKyNkZWZpbmUgTExDX1NOQVBfTFNBUCAweGFhCisjZGVmaW5lIExMQ19VSSAweDMKKworI2RlZmluZSBSRkMxMDQyX1NOQVBfT1JHQ09ERV8wIDB4MDAKKyNkZWZpbmUgUkZDMTA0Ml9TTkFQX09SR0NPREVfMSAweDAwCisjZGVmaW5lIFJGQzEwNDJfU05BUF9PUkdDT0RFXzIgMHgwMAorCisjZGVmaW5lIEJURVBfU05BUF9PUkdDT0RFXzAgMHgwMAorI2RlZmluZSBCVEVQX1NOQVBfT1JHQ09ERV8xIDB4MDAKKyNkZWZpbmUgQlRFUF9TTkFQX09SR0NPREVfMiAweGY4CisKKyNkZWZpbmUgSVNfU05BUChfbGxjKSAoKF9sbGMpLT5kc2FwID09IExMQ19TTkFQX0xTQVAgJiYJXAorCQkgICAgICAgKF9sbGMpLT5zc2FwID09IExMQ19TTkFQX0xTQVAgJiYJXAorCQkgICAgICAgKF9sbGMpLT5jbnRsID09IExMQ19VSSkKKworI2RlZmluZSBJU19SRkMxMDQyKF9sbGMpICgoX2xsYyktPm9yZ19jb2RlWzBdID09IFJGQzEwNDJfU05BUF9PUkdDT0RFXzAgJiYgXAorCQkJICAoX2xsYyktPm9yZ19jb2RlWzFdID09IFJGQzEwNDJfU05BUF9PUkdDT0RFXzEgJiYgXAorCQkJICAoX2xsYyktPm9yZ19jb2RlWzJdID09IFJGQzEwNDJfU05BUF9PUkdDT0RFXzIpCisKKyNkZWZpbmUgSVNfQlRFUChfbGxjKSAoKF9sbGMpLT5vcmdfY29kZVswXSA9PSBCVEVQX1NOQVBfT1JHQ09ERV8wICYmIFwKKwkJICAgICAgIChfbGxjKS0+b3JnX2NvZGVbMV0gPT0gQlRFUF9TTkFQX09SR0NPREVfMSAmJiBcCisJCSAgICAgICAoX2xsYyktPm9yZ19jb2RlWzJdID09IEJURVBfU05BUF9PUkdDT0RFXzIpCisKKyNlbmRpZiAvKiBfRU5FVF9fSF8gKi8KZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvZXBwaW5nX3Rlc3QuaCBiL3RhcmdldC9pbmMvZXBwaW5nX3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGU2ZDAxCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy9lcHBpbmdfdGVzdC5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBzaGFyZWQgZGVmaW5pdGlvbnMgZm9yIHRoZSBob3N0L3RhcmdldCBlbmRwb2ludCBwaW5nIHRlc3QgKi8KKworI2lmbmRlZiBFUFBJTkdfVEVTVF9ICisjZGVmaW5lIEVQUElOR19URVNUX0gKKworI2lmbmRlZiBBVEhfVEFSR0VUCisjaW5jbHVkZSAiYXRoc3RhcnRwYWNrLmgiCisjZW5kaWYKKworLyogYWxpZ25tZW50IHRvIDQtYnl0ZXMgKi8KKyNkZWZpbmUgRVBQSU5HX0FMSUdOTUVOVF9QQUQgICgoKHNpemVvZihIVENfRlJBTUVfSERSKSArIDMpICYgKH4weDMpKSAtIHNpemVvZihIVENfRlJBTUVfSERSKSkKKworI2lmbmRlZiBBX09GRlNFVE9GCisjZGVmaW5lIEFfT0ZGU0VUT0YodHlwZSxmaWVsZCkgKGludCkoJigoKHR5cGUgKilOVUxMKS0+ZmllbGQpKQorI2VuZGlmCisKKyNkZWZpbmUgRVBQSU5HX1JTVkRfRklMTCAgICAgICAgICAgICAgICAgIDB4Q0MKKworI2RlZmluZSBIQ0lfUlNWRF9FWFBFQ1RFRF9QS1RfVFlQRV9SRUNWX09GRlNFVCAgNworCit0eXBlZGVmIFBSRVBBQ0sgc3RydWN0IHsKKwlBX1VJTlQ4IF9IQ0lSc3ZkWzhdOyAgICAvKiByZXNlcnZlZCBmb3IgSENJIHBhY2tldCBoZWFkZXIgKEdNQk9YKSB0ZXN0aW5nICovCisJQV9VSU5UOCBTdHJlYW1FY2hvX2g7ICAgLyogc3RyZWFtIG5vLiB0byBlY2hvIHRoaXMgcGFja2V0IG9uIChmaWxsZWQgYnkgaG9zdCkgKi8KKwlBX1VJTlQ4IFN0cmVhbUVjaG9TZW50X3Q7ICAgICAgIC8qIHN0cmVhbSBuby4gcGFja2V0IHdhcyBlY2hvZWQgdG8gKGZpbGxlZCBieSB0YXJnZXQpCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGVjaG9lZDogU3RyZWFtRWNob1NlbnRfdCA9PSBTdHJlYW1FY2hvX2ggKi8KKwlBX1VJTlQ4IFN0cmVhbVJlY3ZfdDsgICAvKiBzdHJlYW0gbm8uIHRoYXQgdGFyZ2V0IHJlY2VpdmVkIHRoaXMgcGFja2V0IG9uIChmaWxsZWQgYnkgdGFyZ2V0KSAqLworCUFfVUlOVDggU3RyZWFtTm9faDsgICAgIC8qIHN0cmVhbSBudW1iZXIgdG8gc2VuZCBvbiAoZmlsbGVkIGJ5IGhvc3QpICovCisJQV9VSU5UOCBNYWdpY19oWzRdOyAgICAgLyogbWFnaWMgbnVtYmVyIHRvIGZpbHRlciBmb3IgdGhpcyBwYWNrZXQgb24gdGhlIGhvc3QgKi8KKwlBX1VJTlQ4IF9yc3ZkWzZdOyAgICAgICAvKiByZXNlcnZlZCBmaWVsZHMgdGhhdCBtdXN0IGJlIHNldCB0byBhICJyZXNlcnZlZCIgdmFsdWUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jZSB0aGlzIHBhY2tldCBtYXBzIHRvIGEgMTQtYnl0ZSBldGhlcm5ldCBmcmFtZSB3ZSB3YW50CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSBzdXJlIGV0aGVydHlwZSBmaWVsZCBpcyBzZXQgdG8gc29tZXRoaW5nIHVua25vd24gKi8KKworCUFfVUlOVDggX3BhZFsyXTsgICAgICAgIC8qIHBhZGRpbmcgZm9yIGFsaWdubWVudCAqLworCUFfVUlOVDggVGltZVN0YW1wWzhdOyAgIC8qIHRpbWVzdGFtcCBvZiBwYWNrZXQgKGhvc3Qgb3IgdGFyZ2V0KSAqLworCUFfVUlOVDMyIEhvc3RDb250ZXh0X2g7IC8qIDQgYnl0ZSBob3N0IGNvbnRleHQsIHRhcmdldCBlY2hvcyB0aGlzIGJhY2sgKi8KKwlBX1VJTlQzMiBTZXFObzsgICAgICAgICAvKiBzZXF1ZW5jZSBudW1iZXIgKHNldCBieSBob3N0IG9yIHRhcmdldCkgKi8KKwlBX1VJTlQxNiBDbWRfaDsgICAgICAgICAvKiBwaW5nIGNvbW1hbmQgKGZpbGxlZCBieSBob3N0KSAqLworCUFfVUlOVDE2IENtZEZsYWdzX2g7ICAgIC8qIG9wdGlvbmFsIGZsYWdzICovCisJQV9VSU5UOCBDbWRCdWZmZXJfaFs4XTsgLyogYnVmZmVyIGZvciBjb21tYW5kIChob3N0IC0+IHRhcmdldCkgKi8KKwlBX1VJTlQ4IENtZEJ1ZmZlcl90WzhdOyAvKiBidWZmZXIgZm9yIGNvbW1hbmQgKHRhcmdldCAtPiBob3N0KSAqLworCUFfVUlOVDE2IERhdGFMZW5ndGg7ICAgIC8qIGxlbmd0aCBvZiBkYXRhICovCisJQV9VSU5UMTYgRGF0YUNSQzsgICAgICAgLyogMTYgYml0IENSQyBvZiBkYXRhICovCisJQV9VSU5UMTYgSGVhZGVyQ1JDOyAgICAgLyogaGVhZGVyIENSQyAoZmllbGRzIDogU3RyZWFtTm9faCB0byBlbmQsIG1pbnVzIEhlYWRlckNSQykgKi8KK30gUE9TVFBBQ0sgRVBQSU5HX0hFQURFUjsKKworI2RlZmluZSBFUFBJTkdfUElOR19NQUdJQ18wICAgICAgICAgICAweEFBCisjZGVmaW5lIEVQUElOR19QSU5HX01BR0lDXzEgICAgICAgICAgIDB4NTUKKyNkZWZpbmUgRVBQSU5HX1BJTkdfTUFHSUNfMiAgICAgICAgICAgMHhDRQorI2RlZmluZSBFUFBJTkdfUElOR19NQUdJQ18zICAgICAgICAgICAweEVDCisKKyNkZWZpbmUgSVNfRVBQSU5HX1BBQ0tFVChwUGt0KSAgICgoKHBQa3QpLT5NYWdpY19oWzBdID09IEVQUElOR19QSU5HX01BR0lDXzApICYmIFwKKwkJCQkgICgocFBrdCktPk1hZ2ljX2hbMV0gPT0gRVBQSU5HX1BJTkdfTUFHSUNfMSkgJiYgXAorCQkJCSAgKChwUGt0KS0+TWFnaWNfaFsyXSA9PSBFUFBJTkdfUElOR19NQUdJQ18yKSAmJiBcCisJCQkJICAoKHBQa3QpLT5NYWdpY19oWzNdID09IEVQUElOR19QSU5HX01BR0lDXzMpKQorCisjZGVmaW5lIFNFVF9FUFBJTkdfUEFDS0VUX01BR0lDKHBQa3QpIHsgKHBQa3QpLT5NYWdpY19oWzBdID0gRVBQSU5HX1BJTkdfTUFHSUNfMDsgXAorCQkJCQkocFBrdCktPk1hZ2ljX2hbMV0gPSBFUFBJTkdfUElOR19NQUdJQ18xOyBcCisJCQkJCShwUGt0KS0+TWFnaWNfaFsyXSA9IEVQUElOR19QSU5HX01BR0lDXzI7IFwKKwkJCQkJKHBQa3QpLT5NYWdpY19oWzNdID0gRVBQSU5HX1BJTkdfTUFHSUNfMzsgfQorCisjZGVmaW5lIENNRF9GTEFHU19EQVRBX0NSQyAgICAgICAgICAgICgxIDw8IDApICAvKiBEYXRhQ1JDIGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIENNRF9GTEFHU19ERUxBWV9FQ0hPICAgICAgICAgICgxIDw8IDEpICAvKiBkZWxheSB0aGUgZWNobyBvZiB0aGUgcGFja2V0ICovCisjZGVmaW5lIENNRF9GTEFHU19OT19EUk9QICAgICAgICAgICAgICgxIDw8IDIpICAvKiBkbyBub3QgZHJvcCBhdCBIVEMgbGF5ZXIgbm8gbWF0dGVyIHdoYXQgdGhlIHN0cmVhbSBpcyAqLworCisjZGVmaW5lIElTX0VQSU5HX1BBQ0tFVF9OT19EUk9QKHBQa3QpICAoKHBQa3QpLT5DbWRGbGFnc19oICYgQ01EX0ZMQUdTX05PX0RST1ApCisKKyNkZWZpbmUgRVBQSU5HX0NNRF9FQ0hPX1BBQ0tFVCAgICAgICAgICAxICAgICAgIC8qIGVjaG8gcGFja2V0IHRlc3QgKi8KKyNkZWZpbmUgRVBQSU5HX0NNRF9SRVNFVF9SRUNWX0NOVCAgICAgICAyICAgICAgIC8qIHJlc2V0IHJlY3YgY291bnQgKi8KKyNkZWZpbmUgRVBQSU5HX0NNRF9DQVBUVVJFX1JFQ1ZfQ05UICAgICAzICAgICAgIC8qIGZldGNoIHJlY3YgY291bnQsIDQtYnl0ZSBjb3VudCByZXR1cm5lZCBpbiBDbWRCdWZmZXJfdCAqLworI2RlZmluZSBFUFBJTkdfQ01EX05PX0VDSE8gICAgICAgICAgICAgIDQgICAgICAgLyogbm9uLWVjaG8gcGFja2V0IHRlc3QgKHR4LW9ubHkpICovCisjZGVmaW5lIEVQUElOR19DTURfQ09OVF9SWF9TVEFSVCAgICAgICAgNSAgICAgICAvKiBjb250aW5vdXMgUlggcGFja2V0cywgcGFyYW1ldGVycyBhcmUgaW4gQ21kQnVmZmVyX2ggKi8KKyNkZWZpbmUgRVBQSU5HX0NNRF9DT05UX1JYX1NUT1AgICAgICAgICA2ICAgICAgIC8qIHN0b3AgY29udGludW91cyBSWCBwYWNrZXQgdHJhbnNtaXNzaW9uICovCisKKy8qIHRlc3QgY29tbWFuZCBwYXJhbWV0ZXJzIG1heSBiZSBubyBtb3JlIHRoYW4gOCBieXRlcyAqLwordHlwZWRlZiBQUkVQQUNLIHN0cnVjdCB7CisJQV9VSU5UMTYgQnVyc3RDbnQ7ICAgICAgLyogbnVtYmVyIG9mIHBhY2tldHMgdG8gYnVyc3QgdG9nZXRoZXIgKGZvciBIVEMgMi4xIHRlc3RpbmcpICovCisJQV9VSU5UMTYgUGFja2V0TGVuZ3RoOyAgLyogbGVuZ3RoIG9mIHBhY2tldCB0byBnZW5lcmF0ZSBpbmNsdWRpbmcgaGVhZGVyICovCisJQV9VSU5UMTYgRmxhZ3M7ICAgICAgICAgLyogZmxhZ3MgKi8KKworI2RlZmluZSBFUFBJTkdfQ09OVF9SWF9EQVRBX0NSQyAgICAgKDEgPDwgMCkgICAgLyogQWRkIENSQyB0byBhbGwgZGF0YSAqLworI2RlZmluZSBFUFBJTkdfQ09OVF9SWF9SQU5ET01fREFUQSAgKDEgPDwgMSkgICAgLyogcmFuZG9taXplIHRoZSBkYXRhIHBhdHRlcm4gKi8KKyNkZWZpbmUgRVBQSU5HX0NPTlRfUlhfUkFORE9NX0xFTiAgICgxIDw8IDIpICAgIC8qIHJhbmRvbWl6ZSB0aGUgcGFja2V0IGxlbmd0aHMgKi8KKyNkZWZpbmUgRVBQSU5HX0NPTlRfUlhfTk9fREFUQV9GSUxMICgxIDw8IDMpICAgIC8qIHRhcmdldCB3aWxsIG5vdCBmaWxsIGJ1ZmZlcnMgKi8KKwlBX1VJTlQxNiBDb250ZXh0OyAgICAgICAvKiBmbGFncyAqLworCit9IFBPU1RQQUNLIEVQUElOR19DT05UX1JYX1BBUkFNUzsKKworI2RlZmluZSBFUFBJTkdfSERSX0NSQ19PRkZTRVQgICAgQV9PRkZTRVRPRihFUFBJTkdfSEVBREVSLFN0cmVhbU5vX2gpCisjZGVmaW5lIEVQUElOR19IRFJfQllURVNfQ1JDICAgICAoc2l6ZW9mKEVQUElOR19IRUFERVIpIC0gRVBQSU5HX0hEUl9DUkNfT0ZGU0VUIC0gKHNpemVvZihBX1VJTlQxNikpKQorCisjZGVmaW5lIEhDSV9UUkFOU1BPUlRfU1RSRUFNX05VTSAgMTYgICAgLyogdGhpcyBudW1iZXIgaXMgaGlnaGVyIHRoYW4gdGhlIGRlZmluZSBXTU0gQUMgY2xhc3NlcyBzbyB3ZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIHVzZSB0aGlzIHRvIGRpc3Rpbmd1aXNoIHBhY2tldHMgKi8KKworI2lmbmRlZiBBVEhfVEFSR0VUCisjaW5jbHVkZSAiYXRoZW5kcGFjay5oIgorI2VuZGlmCisKKyNlbmRpZiAvKiBFUFBJTkdfVEVTVF9IICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL2h0Yy5oIGIvdGFyZ2V0L2luYy9odGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTIzOWFiCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy9odGMuaApAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0hUQ19IX18KKyNkZWZpbmUgX19IVENfSF9fCisKKyNpZm5kZWYgQVRIX1RBUkdFVAorI2luY2x1ZGUgImF0aHN0YXJ0cGFjay5oIgorI2VuZGlmCisjdW5kZWYgTVMKKyNkZWZpbmUgTVMoX3YsIF9mKSAoKChfdikgJiBfZiAjIyBfTUFTSykgPj4gX2YgIyMgX0xTQikKKyN1bmRlZiBTTQorI2RlZmluZSBTTShfdiwgX2YpICgoKF92KSA8PCBfZiAjIyBfTFNCKSAmIF9mICMjIF9NQVNLKQorI3VuZGVmIFdPCisjZGVmaW5lIFdPKF9mKSAgICAgICgoX2YgIyMgX09GRlNFVCkgPj4gMikKKworI3VuZGVmIEdFVF9GSUVMRAorI2RlZmluZSBHRVRfRklFTEQoX2FkZHIsIF9mKSBNUygqKChBX1VJTlQzMiAqKShfYWRkcikgKyBXTyhfZikpLCBfZikKKyN1bmRlZiBTRVRfRklFTEQKKyNkZWZpbmUgU0VUX0ZJRUxEKF9hZGRyLCBfZiwgX3ZhbCkgIFwKKwkoKigoQV9VSU5UMzIgKikoX2FkZHIpICsgV08oX2YpKSA9IFwKKwkJICgqKChBX1VJTlQzMiAqKShfYWRkcikgKyBXTyhfZikpICYgfl9mICMjIF9NQVNLKSB8IFNNKF92YWwsIF9mKSkKKworI2RlZmluZSBIVENfR0VUX0ZJRUxEKF9tc2dfYnVmLCBfbXNnX3R5cGUsIF9mKSBcCisJR0VUX0ZJRUxEKF9tc2dfYnVmLCBfbXNnX3R5cGUgIyMgXyAjIyBfZikKKworI2RlZmluZSBIVENfU0VUX0ZJRUxEKF9tc2dfYnVmLCBfbXNnX3R5cGUsIF9mLCBfdmFsKSBcCisJU0VUX0ZJRUxEKF9tc2dfYnVmLCBfbXNnX3R5cGUgIyMgXyAjIyBfZiwgX3ZhbCkKKworI2RlZmluZSBIVENfV1JJVEUzMihfYWRkciwgX3ZhbCkgXAorCSgqKEFfVUlOVDMyICopKF9hZGRyKSA9IChfdmFsKSkKKworI2lmbmRlZiBBX09GRlNFVE9GCisjZGVmaW5lIEFfT0ZGU0VUT0YodHlwZSxmaWVsZCkgKHVuc2lnbmVkIGxvbmcpKCYoKCh0eXBlICopTlVMTCktPmZpZWxkKSkKKyNlbmRpZgorCisjZGVmaW5lIEFTU0VNQkxFX1VOQUxJR05FRF9VSU5UMTYocCxoaWdoYnl0ZSxsb3dieXRlKSBcCisJKCgoQV9VSU5UMTYpKCgoQV9VSU5UOCAqKShwKSlbKGhpZ2hieXRlKV0pKSA8PCA4IHwgKEFfVUlOVDE2KSgoKEFfVUlOVDggKikocCkpWyhsb3dieXRlKV0pKQorCisvKioqKioqIERBTkdFUiBEQU5HRVIgKioqKioqKioqKioqKioqCisgKgorICogICBUaGUgZnJhbWUgaGVhZGVyIGxlbmd0aCBhbmQgbWVzc2FnZSBmb3JtYXRzIGRlZmluZWQgaGVyZWluIHdlcmUKKyAqICAgc2VsZWN0ZWQgdG8gYWNjb21tb2RhdGUgb3B0aW1hbCBhbGlnbm1lbnQgZm9yIHRhcmdldCBwcm9jZXNzaW5nLiAgVGhpcyByZWR1Y2VzIGNvZGUKKyAqICAgc2l6ZSBhbmQgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCisgKgorICogICBBbnkgY2hhbmdlcyB0byB0aGUgaGVhZGVyIGxlbmd0aCBtYXkgYWx0ZXIgdGhlIGFsaWdubWVudCBhbmQgY2F1c2UgZXhjZXB0aW9ucworICogICBvbiB0aGUgdGFyZ2V0LiBXaGVuIGFkZGluZyB0byB0aGUgbWVzc2FnZSBzdHJ1Y3R1cmVzIGluc3VyZSB0aGF0IGZpZWxkcyBhcmUKKyAqICAgcHJvcGVybHkgYWxpZ25lZC4KKyAqCisgKi8KKworLyogSFRDIGZyYW1lIGhlYWRlciAqLwordHlwZWRlZiBQUkVQQUNLIHN0cnVjdCBfSFRDX0ZSQU1FX0hEUiB7CisJLyogZG8gbm90IHJlbW92ZSBvciByZS1hcnJhbmdlIHRoZXNlIGZpZWxkcywgdGhlc2UgYXJlIG1pbmltYWxseSByZXF1aXJlZAorCSAqIHRvIHRha2UgYWR2YW50YWdlIG9mIDQtYnl0ZSBsb29rYWhlYWRzIGluIHNvbWUgaGFyZHdhcmUgaW1wbGVtZW50YXRpb25zICovCisJQV9VSU5UMzIgRW5kcG9pbnRJRCA6IDgsIEZsYWdzIDogOCwgUGF5bG9hZExlbiA6IDE2OyAgLyogbGVuZ3RoIG9mIGRhdGEgKGluY2x1ZGluZyB0cmFpbGVyKSB0aGF0IGZvbGxvd3MgdGhlIGhlYWRlciAqLworCisJLyoqKioqIGVuZCBvZiA0LWJ5dGUgbG9va2FoZWFkICoqKiovCisKKwlBX1VJTlQzMiBDb250cm9sQnl0ZXMwIDogOCwvKnVzZWQgZm9yIENSQyBjaGVjayBpZiBDUkNfQ0hFQ0sgZmxhZyBzZXQqLworCQkgQ29udHJvbEJ5dGVzMSA6IDgsIC8qdXNlZCBmb3Igc2VxIGNoZWNrIGlmIFNFUV9DSEVDSyBmbGFnIHNldCovCisJCSByZXNlcnZlZCA6IDE2OyAvKnVzZWQgYnkgYnVuZGxlIHByb2Nlc3NpbmcgaW4gU0RJTyBzeXN0ZW1zKi8KKworCS8qIG1lc3NhZ2UgcGF5bG9hZCBzdGFydHMgYWZ0ZXIgdGhlIGhlYWRlciAqLworCit9IFBPU1RQQUNLIEhUQ19GUkFNRV9IRFI7CisKKyNkZWZpbmUgSFRDX0ZSQU1FX0hEUl9FTkRQT0lOVElEX0xTQiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhUQ19GUkFNRV9IRFJfRU5EUE9JTlRJRF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIVENfRlJBTUVfSERSX0VORFBPSU5USURfT0ZGU0VUICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSFRDX0ZSQU1FX0hEUl9GTEFHU19MU0IgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEhUQ19GUkFNRV9IRFJfRkxBR1NfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIVENfRlJBTUVfSERSX0ZMQUdTX09GRlNFVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSFRDX0ZSQU1FX0hEUl9QQVlMT0FETEVOX0xTQiAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBIVENfRlJBTUVfSERSX1BBWUxPQURMRU5fTUFTSyAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRDX0ZSQU1FX0hEUl9QQVlMT0FETEVOX09GRlNFVCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhUQ19GUkFNRV9IRFJfQ09OVFJPTEJZVEVTMF9MU0IgICAgICAgICAgICAgMAorI2RlZmluZSBIVENfRlJBTUVfSERSX0NPTlRST0xCWVRFUzBfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSFRDX0ZSQU1FX0hEUl9DT05UUk9MQllURVMwX09GRlNFVCAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhUQ19GUkFNRV9IRFJfQ09OVFJPTEJZVEVTMV9MU0IgICAgICAgICAgICAgOAorI2RlZmluZSBIVENfRlJBTUVfSERSX0NPTlRST0xCWVRFUzFfTUFTSyAgICAgICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSFRDX0ZSQU1FX0hEUl9DT05UUk9MQllURVMxX09GRlNFVCAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhUQ19GUkFNRV9IRFJfUkVTRVJWRURfTFNCICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSFRDX0ZSQU1FX0hEUl9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUQ19GUkFNRV9IRFJfUkVTRVJWRURfT0ZGU0VUICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorCisvKiBmcmFtZSBoZWFkZXIgZmxhZ3MgKi8KKworLyogc2VuZCBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgSFRDX0ZMQUdTX05FRURfQ1JFRElUX1VQREFURSAoMSA8PCAwKQorI2RlZmluZSBIVENfRkxBR1NfU0VORF9CVU5ETEUgICAgICAgICgxIDw8IDEpICAgLyogc3RhcnQgb3IgcGFydCBvZiBidW5kbGUgKi8KKyNkZWZpbmUgSFRDX0ZMQUdTX1NFUV9DSEVDSyAgICAgICAgICAoMSA8PCAyKSAvKiBzZXEgY2hlY2sgb24gcnggc2lkZSAqLworI2RlZmluZSBIVENfRkxBR1NfQ1JDIENIRUNLICAgICAgICAgICgxIDw8IDMpIC8qIENSQyBjaGVjayBvbiByeCBzaWRlICovCisKKy8qIHJlY2VpdmUgZGlyZWN0aW9uICovCisjZGVmaW5lIEhUQ19GTEFHU19SRUNWX1VOVVNFRF8wICAgICAgKDEgPDwgMCkgICAvKiBiaXQgMCB1bnVzZWQgKi8KKyNkZWZpbmUgSFRDX0ZMQUdTX1JFQ1ZfVFJBSUxFUiAgICAgICAoMSA8PCAxKSAgIC8qIGJpdCAxIHRyYWlsZXIgZGF0YSBwcmVzZW50ICovCisjZGVmaW5lIEhUQ19GTEFHU19SRUNWX1VOVVNFRF8yICAgICAgKDEgPDwgMCkgICAvKiBiaXQgMiB1bnVzZWQgKi8KKyNkZWZpbmUgSFRDX0ZMQUdTX1JFQ1ZfVU5VU0VEXzMgICAgICAoMSA8PCAwKSAgIC8qIGJpdCAzIHVudXNlZCAqLworI2RlZmluZSBIVENfRkxBR1NfUkVDVl9CVU5ETEVfQ05UX01BU0sgKDB4RjApICAgLyogYml0cyA3Li40ICAqLworI2RlZmluZSBIVENfRkxBR1NfUkVDVl9CVU5ETEVfQ05UX1NISUZUIDQKKworI2RlZmluZSBIVENfSERSX0xFTkdUSCAgKHNpemVvZihIVENfRlJBTUVfSERSKSkKKyNkZWZpbmUgSFRDX0hEUl9BTElHTk1FTlRfUEFERElORwkgICAgXAorCSgoKHNpemVvZihIVENfRlJBTUVfSERSKSArIDMpICYgKH4weDMpKSAtIHNpemVvZihIVENfRlJBTUVfSERSKSkKKyNkZWZpbmUgSFRDX01BWF9UUkFJTEVSX0xFTkdUSCAgIDI1NQorI2RlZmluZSBIVENfTUFYX1BBWUxPQURfTEVOR1RIICAgKDQwOTYgLSBzaXplb2YoSFRDX0ZSQU1FX0hEUikpCisKKy8qIEhUQyBjb250cm9sIG1lc3NhZ2UgSURzICovCisKKyNkZWZpbmUgSFRDX01TR19SRUFEWV9JRCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBIVENfTVNHX0NPTk5FQ1RfU0VSVklDRV9JRCAgICAgICAgICAyCisjZGVmaW5lIEhUQ19NU0dfQ09OTkVDVF9TRVJWSUNFX1JFU1BPTlNFX0lEIDMKKyNkZWZpbmUgSFRDX01TR19TRVRVUF9DT01QTEVURV9JRCAgICAgICAgICAgNAorI2RlZmluZSBIVENfTVNHX1NFVFVQX0NPTVBMRVRFX0VYX0lEICAgICAgICA1CisjZGVmaW5lIEhUQ19NU0dfU0VORF9TVVNQRU5EX0NPTVBMRVRFICAgICAgIDYKKyNkZWZpbmUgSFRDX01TR19OQUNLX1NVU1BFTkQgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIEhUQ19NQVhfQ09OVFJPTF9NRVNTQUdFX0xFTkdUSCAgMjU2CisKKy8qIGJhc2UgbWVzc2FnZSBJRCBoZWFkZXIgKi8KK3R5cGVkZWYgUFJFUEFDSyBzdHJ1Y3QgeworCUFfVUlOVDMyIE1lc3NhZ2VJRCA6IDE2LCByZXNlcnZlZCA6IDE2OworfSBQT1NUUEFDSyBIVENfVU5LTk9XTl9NU0c7CisKKyNkZWZpbmUgSFRDX1VOS05PV05fTVNHX01FU1NBR0VJRF9MU0IgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRDX1VOS05PV05fTVNHX01FU1NBR0VJRF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFRDX1VOS05PV05fTVNHX01FU1NBR0VJRF9PRkZTRVQgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKworLyogSFRDIHJlYWR5IG1lc3NhZ2UKKyAqIGRpcmVjdGlvbiA6IHRhcmdldC10by1ob3N0ICAqLwordHlwZWRlZiBQUkVQQUNLIHN0cnVjdCB7CisJQV9VSU5UMzIgTWVzc2FnZUlEIDogMTYsICAvKiBJRCAqLworCQkgQ3JlZGl0Q291bnQgOiAxNjsgLyogbnVtYmVyIG9mIGNyZWRpdHMgdGhlIHRhcmdldCBjYW4gb2ZmZXIgKi8KKwlBX1VJTlQzMiBDcmVkaXRTaXplIDogMTYsIC8qIHNpemUgb2YgZWFjaCBjcmVkaXQgKi8KKwkJIE1heEVuZHBvaW50cyA6IDgsIC8qIG1heGltdW0gbnVtYmVyIG9mIGVuZHBvaW50cyB0aGUgdGFyZ2V0IGhhcyByZXNvdXJjZXMgZm9yICovCisJCSBfUGFkMSA6IDg7Cit9IFBPU1RQQUNLIEhUQ19SRUFEWV9NU0c7CisKKyNkZWZpbmUgSFRDX1JFQURZX01TR19NRVNTQUdFSURfTFNCICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRDX1JFQURZX01TR19NRVNTQUdFSURfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFRDX1JFQURZX01TR19NRVNTQUdFSURfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSFRDX1JFQURZX01TR19DUkVESVRDT1VOVF9MU0IgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEhUQ19SRUFEWV9NU0dfQ1JFRElUQ09VTlRfTUFTSyAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUQ19SRUFEWV9NU0dfQ1JFRElUQ09VTlRfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhUQ19SRUFEWV9NU0dfQ1JFRElUU0laRV9MU0IgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhUQ19SRUFEWV9NU0dfQ1JFRElUU0laRV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhUQ19SRUFEWV9NU0dfQ1JFRElUU0laRV9PRkZTRVQgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhUQ19SRUFEWV9NU0dfTUFYRU5EUE9JTlRTX0xTQiAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBIVENfUkVBRFlfTVNHX01BWEVORFBPSU5UU19NQVNLICAgICAgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIVENfUkVBRFlfTVNHX01BWEVORFBPSU5UU19PRkZTRVQgICAgICAgICAgICAgMHgwMDAwMDAwNAorCisvKiBleHRlbmRlZCBIVEMgcmVhZHkgbWVzc2FnZSAqLwordHlwZWRlZiBQUkVQQUNLIHN0cnVjdCB7CisJSFRDX1JFQURZX01TRyBWZXJzaW9uMl8wX0luZm87ICAvKiBsZWdhY3kgdmVyc2lvbiAyLjAgaW5mb3JtYXRpb24gYXQgdGhlIGZyb250Li4uICovCisJLyogZXh0ZW5kZWQgaW5mb3JtYXRpb24gKi8KKwlBX1VJTlQzMiBIVENWZXJzaW9uIDogOCwgTWF4TXNnc1BlckhUQ0J1bmRsZSA6IDgsIHJlc2VydmVkIDogMTY7Cit9IFBPU1RQQUNLIEhUQ19SRUFEWV9FWF9NU0c7CisKKyNkZWZpbmUgSFRDX1JFQURZX0VYX01TR19IVENWRVJTSU9OX0xTQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRDX1JFQURZX0VYX01TR19IVENWRVJTSU9OX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSFRDX1JFQURZX0VYX01TR19IVENWRVJTSU9OX09GRlNFVCAgICAgICAgICAgIHNpemVvZihIVENfUkVBRFlfTVNHKQorI2RlZmluZSBIVENfUkVBRFlfRVhfTVNHX01BWE1TR1NQRVJIVENCVU5ETEVfTFNCICAgICAgOAorI2RlZmluZSBIVENfUkVBRFlfRVhfTVNHX01BWE1TR1NQRVJIVENCVU5ETEVfTUFTSyAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIVENfUkVBRFlfRVhfTVNHX01BWE1TR1NQRVJIVENCVU5ETEVfT0ZGU0VUICAgc2l6ZW9mKEhUQ19SRUFEWV9NU0cpCisKKyNkZWZpbmUgSFRDX1ZFUlNJT05fMlAwICAweDAwCisjZGVmaW5lIEhUQ19WRVJTSU9OXzJQMSAgMHgwMSAgIC8qIEhUQyAyLjEgKi8KKworI2RlZmluZSBIVENfU0VSVklDRV9NRVRBX0RBVEFfTUFYX0xFTkdUSCAxMjgKKworLyogY29ubmVjdCBzZXJ2aWNlCisgKiBkaXJlY3Rpb24gOiBob3N0LXRvLXRhcmdldCAqLwordHlwZWRlZiBQUkVQQUNLIHN0cnVjdCB7CisJQV9VSU5UMzIgTWVzc2FnZUlEIDogMTYsIFNlcnZpY2VJRCA6IDE2OyAgICAvKiBzZXJ2aWNlIElEIG9mIHRoZSBzZXJ2aWNlIHRvIGNvbm5lY3QgdG8gKi8KKwlBX1VJTlQzMiBDb25uZWN0aW9uRmxhZ3MgOiAxNiwgICAgLyogY29ubmVjdGlvbiBmbGFncyAqLworI2RlZmluZSBIVENfQ09OTkVDVF9GTEFHU19SRURVQ0VfQ1JFRElUX0RSSUJCTEUgKDEgPDwgMikKKwkvKiByZWR1Y2UgY3JlZGl0IGRyaWJibGluZyB3aGVuCisJICAgdGhlIGhvc3QgbmVlZHMgY3JlZGl0cyAqLworI2RlZmluZSBIVENfQ09OTkVDVF9GTEFHU19USFJFU0hPTERfTEVWRUxfTUFTSyAgICAgICAgICAgICAoMHgzKQorI2RlZmluZSBIVENfQ09OTkVDVF9GTEFHU19USFJFU0hPTERfTEVWRUxfT05FX0ZPVVJUSCAgICAgICAgMHgwCisjZGVmaW5lIEhUQ19DT05ORUNUX0ZMQUdTX1RIUkVTSE9MRF9MRVZFTF9PTkVfSEFMRiAgICAgICAgICAweDEKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfRkxBR1NfVEhSRVNIT0xEX0xFVkVMX1RIUkVFX0ZPVVJUSFMgICAgIDB4MgorI2RlZmluZSBIVENfQ09OTkVDVF9GTEFHU19USFJFU0hPTERfTEVWRUxfVU5JVFkgICAgICAgICAgICAgMHgzCisJLyogZGlzYWJsZSBjcmVkaXQgZmxvdyBjb250cm9sIG9uIGEgc3BlY2lmaWMgc2VydmljZSAqLworI2RlZmluZSBIVENfQ09OTkVDVF9GTEFHU19ESVNBQkxFX0NSRURJVF9GTE9XX0NUUkwgICAgICAgICAgKDEgPDwgMykKKwkvKiBlbmFibGUgaHRjIHNjaGVkdWxlIG9uIGEgc3BlY2lmaWMgc2VydmljZSAqLworI2RlZmluZSBIVENfQ09OTkVDVF9GTEFHU19FTkFCTEVfSFRDX1NDSEVEVUxFICAgICAgICAgICAgICAgKDEgPDwgNCkKKwlTZXJ2aWNlTWV0YUxlbmd0aCA6IDgsICAvKiBsZW5ndGggb2YgbWV0YSBkYXRhIHRoYXQgZm9sbG93cyAqLworCV9QYWQxIDogODsKKworCS8qIHNlcnZpY2Utc3BlY2lmaWMgbWV0YSBkYXRhIHN0YXJ0cyBhZnRlciB0aGUgaGVhZGVyICovCisKK30gUE9TVFBBQ0sgSFRDX0NPTk5FQ1RfU0VSVklDRV9NU0c7CisKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfU0VSVklDRV9NU0dfTUVTU0FHRUlEX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfTVNHX01FU1NBR0VJRF9NQVNLICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBIVENfQ09OTkVDVF9TRVJWSUNFX01TR19NRVNTQUdFSURfT0ZGU0VUICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfU0VSVklDRV9NU0dfU0VSVklDRV9JRF9MU0IgICAgICAgICAgICAxNgorI2RlZmluZSBIVENfQ09OTkVDVF9TRVJWSUNFX01TR19TRVJWSUNFX0lEX01BU0sgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfU0VSVklDRV9NU0dfU0VSVklDRV9JRF9PRkZTRVQgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfTVNHX0NPTk5FQ1RJT05GTEFHU19MU0IgICAgICAgMAorI2RlZmluZSBIVENfQ09OTkVDVF9TRVJWSUNFX01TR19DT05ORUNUSU9ORkxBR1NfTUFTSyAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfU0VSVklDRV9NU0dfQ09OTkVDVElPTkZMQUdTX09GRlNFVCAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfTVNHX1NFUlZJQ0VNRVRBTEVOR1RIX0xTQiAgICAgMTYKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfU0VSVklDRV9NU0dfU0VSVklDRU1FVEFMRU5HVEhfTUFTSyAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfTVNHX1NFUlZJQ0VNRVRBTEVOR1RIX09GRlNFVCAgMHgwMDAwMDAwNAorCisjZGVmaW5lIEhUQ19TRVRfUkVDVl9BTExPQ19TSElGVCAgICA4CisjZGVmaW5lIEhUQ19TRVRfUkVDVl9BTExPQ19NQVNLICAgICAweEZGMDAKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfRkxBR1NfU0VUX1JFQ1ZfQUxMT0NBVElPTih2YWx1ZSkgKCgoQV9VSU5UOCl2YWx1ZSkgPDwgSFRDX1NFVF9SRUNWX0FMTE9DX1NISUZUKQorI2RlZmluZSBIVENfQ09OTkVDVF9GTEFHU19HRVRfUkVDVl9BTExPQ0FUSU9OKHZhbHVlKSAoQV9VSU5UOCkoKCh2YWx1ZSkgJiBIVENfU0VUX1JFQ1ZfQUxMT0NfTUFTSykgPj4gSFRDX1NFVF9SRUNWX0FMTE9DX1NISUZUKQorCisvKiBjb25uZWN0IHJlc3BvbnNlCisgKiBkaXJlY3Rpb24gOiB0YXJnZXQtdG8taG9zdCAqLwordHlwZWRlZiBQUkVQQUNLIHN0cnVjdCB7CisJQV9VSU5UMzIgTWVzc2FnZUlEIDogMTYsIFNlcnZpY2VJRCA6IDE2OyAgICAvKiBzZXJ2aWNlIElEIHRoYXQgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCB3YXMgbWFkZSAqLworCUFfVUlOVDMyIFN0YXR1cyA6IDgsICAgICAgLyogc2VydmljZSBjb25uZWN0aW9uIHN0YXR1cyAqLworCQkgRW5kcG9pbnRJRCA6IDgsIC8qIGFzc2lnbmVkIGVuZHBvaW50IElEICovCisJCSBNYXhNc2dTaXplIDogMTY7IC8qIG1heGltdW0gZXhwZWN0ZWQgbWVzc2FnZSBzaXplIG9uIHRoaXMgZW5kcG9pbnQgKi8KKwlBX1VJTlQzMiBTZXJ2aWNlTWV0YUxlbmd0aCA6IDgsICAgLyogbGVuZ3RoIG9mIG1ldGEgZGF0YSB0aGF0IGZvbGxvd3MgKi8KKwkJIF9QYWQxIDogOCwgcmVzZXJ2ZWQgOiAxNjsKKworCS8qIHNlcnZpY2Utc3BlY2lmaWMgbWV0YSBkYXRhIHN0YXJ0cyBhZnRlciB0aGUgaGVhZGVyICovCisKK30gUE9TVFBBQ0sgSFRDX0NPTk5FQ1RfU0VSVklDRV9SRVNQT05TRV9NU0c7CisKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfU0VSVklDRV9SRVNQT05TRV9NU0dfTUVTU0FHRUlEX0xTQiAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfU0VSVklDRV9SRVNQT05TRV9NU0dfTUVTU0FHRUlEX01BU0sgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfU0VSVklDRV9SRVNQT05TRV9NU0dfTUVTU0FHRUlEX09GRlNFVCAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSFRDX0NPTk5FQ1RfU0VSVklDRV9SRVNQT05TRV9NU0dfU0VSVklDRUlEX0xTQiAgICAgICAgICAgIDE2CisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHX1NFUlZJQ0VJRF9NQVNLICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHX1NFUlZJQ0VJRF9PRkZTRVQgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHX1NUQVRVU19MU0IgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHX1NUQVRVU19NQVNLICAgICAgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHX1NUQVRVU19PRkZTRVQgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHX0VORFBPSU5USURfTFNCICAgICAgICAgICA4CisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHX0VORFBPSU5USURfTUFTSyAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHX0VORFBPSU5USURfT0ZGU0VUICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhUQ19DT05ORUNUX1NFUlZJQ0VfUkVTUE9OU0VfTVNHX01BWE1TR1NJWkVfTFNCICAgICAgICAgICAxNgorI2RlZmluZSBIVENfQ09OTkVDVF9TRVJWSUNFX1JFU1BPTlNFX01TR19NQVhNU0dTSVpFX01BU0sgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIVENfQ09OTkVDVF9TRVJWSUNFX1JFU1BPTlNFX01TR19NQVhNU0dTSVpFX09GRlNFVCAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIVENfQ09OTkVDVF9TRVJWSUNFX1JFU1BPTlNFX01TR19TRVJWSUNFTUVUQUxFTkdUSF9MU0IgICAgMAorI2RlZmluZSBIVENfQ09OTkVDVF9TRVJWSUNFX1JFU1BPTlNFX01TR19TRVJWSUNFTUVUQUxFTkdUSF9NQVNLICAgMHgwMDAwMDBmZgorI2RlZmluZSBIVENfQ09OTkVDVF9TRVJWSUNFX1JFU1BPTlNFX01TR19TRVJWSUNFTUVUQUxFTkdUSF9PRkZTRVQgMHgwMDAwMDAwOAorCit0eXBlZGVmIFBSRVBBQ0sgc3RydWN0IHsKKwlBX1VJTlQzMiBNZXNzYWdlSUQgOiAxNiwgcmVzZXJ2ZWQgOiAxNjsKKwkvKiBjdXJyZW50bHksIG5vIG90aGVyIGZpZWxkcyAqLworfSBQT1NUUEFDSyBIVENfU0VUVVBfQ09NUExFVEVfTVNHOworCisjZGVmaW5lIEhUQ19TRVRVUF9DT01QTEVURV9NU0dfTUVTU0FHRUlEX0xTQiAgICAgICAgICAwCisjZGVmaW5lIEhUQ19TRVRVUF9DT01QTEVURV9NU0dfTUVTU0FHRUlEX01BU0sgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhUQ19TRVRVUF9DT01QTEVURV9NU0dfTUVTU0FHRUlEX09GRlNFVCAgICAgICAweDAwMDAwMDAwCisKKy8qIGV4dGVuZGVkIHNldHVwIGNvbXBsZXRpb24gbWVzc2FnZSAqLwordHlwZWRlZiBQUkVQQUNLIHN0cnVjdCB7CisJQV9VSU5UMzIgTWVzc2FnZUlEIDogMTYsIHJlc2VydmVkIDogMTY7CisJQV9VSU5UMzIgU2V0dXBGbGFncyA6IDMyOworCUFfVUlOVDMyIE1heE1zZ3NQZXJCdW5kbGVkUmVjdiA6IDgsIFJzdmQwIDogOCwgUnN2ZDEgOiA4LCBSc3ZkMiA6IDg7Cit9IFBPU1RQQUNLIEhUQ19TRVRVUF9DT01QTEVURV9FWF9NU0c7CisKKyNkZWZpbmUgSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TR19NRVNTQUdFSURfTFNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBIVENfU0VUVVBfQ09NUExFVEVfRVhfTVNHX01FU1NBR0VJRF9NQVNLICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhUQ19TRVRVUF9DT01QTEVURV9FWF9NU0dfTUVTU0FHRUlEX09GRlNFVCAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TR19TRVRVUEZMQUdTX0xTQiAgICAgICAgICAgICAgMAorI2RlZmluZSBIVENfU0VUVVBfQ09NUExFVEVfRVhfTVNHX1NFVFVQRkxBR1NfTUFTSyAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEhUQ19TRVRVUF9DT01QTEVURV9FWF9NU0dfU0VUVVBGTEFHU19PRkZTRVQgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TR19NQVhNU0dTUEVSQlVORExFRFJFQ1ZfTFNCICAgICAgIDAKKyNkZWZpbmUgSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TR19NQVhNU0dTUEVSQlVORExFRFJFQ1ZfTUFTSyAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TR19NQVhNU0dTUEVSQlVORExFRFJFQ1ZfT0ZGU0VUICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TR19SU1ZEMF9MU0IgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBIVENfU0VUVVBfQ09NUExFVEVfRVhfTVNHX1JTVkQwX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhUQ19TRVRVUF9DT01QTEVURV9FWF9NU0dfUlNWRDBfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TR19SU1ZEMV9MU0IgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TR19SU1ZEMV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIVENfU0VUVVBfQ09NUExFVEVfRVhfTVNHX1JTVkQxX09GRlNFVCAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhUQ19TRVRVUF9DT01QTEVURV9FWF9NU0dfUlNWRDJfTFNCICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIEhUQ19TRVRVUF9DT01QTEVURV9FWF9NU0dfUlNWRDJfTUFTSyAgICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSFRDX1NFVFVQX0NPTVBMRVRFX0VYX01TR19SU1ZEMl9PRkZTRVQgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorCisjZGVmaW5lIEhUQ19TRVRVUF9DT01QTEVURV9GTEFHU19FTkFCTEVfQlVORExFX1JFQ1YgICAgICgxIDw8IDApICAgICAgICAvKiBlbmFibGUgcmVjdiBidW5kbGluZyBmcm9tIHRhcmdldCAqLworI2RlZmluZSBIVENfU0VUVVBfQ09NUExFVEVfRkxBR1NfRElTQUJMRV9UWF9DUkVESVRfRkxPVyAoMSA8PCAxKSAgICAgICAgLyogZGlzYWJsZSBjcmVkaXQgYmFzZWQgZmxvdyBjb250cm9sLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHN1cHBvcnRlZCBvbiBzb21lIGludGVyY29ubmVjdHMgKi8KKworLyogY29ubmVjdCByZXNwb25zZSBzdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgSFRDX1NFUlZJQ0VfU1VDQ0VTUyAgICAgIDAgICAgICAvKiBzdWNjZXNzICovCisjZGVmaW5lIEhUQ19TRVJWSUNFX05PVF9GT1VORCAgICAxICAgICAgLyogc2VydmljZSBjb3VsZCBub3QgYmUgZm91bmQgKi8KKyNkZWZpbmUgSFRDX1NFUlZJQ0VfRkFJTEVEICAgICAgIDIgICAgICAvKiBzcGVjaWZpYyBzZXJ2aWNlIGZhaWxlZCB0aGUgY29ubmVjdCAqLworI2RlZmluZSBIVENfU0VSVklDRV9OT19SRVNPVVJDRVMgMyAgICAgIC8qIG5vIHJlc291cmNlcyAoaS5lLiBubyBtb3JlIGVuZHBvaW50cykgKi8KKyNkZWZpbmUgSFRDX1NFUlZJQ0VfTk9fTU9SRV9FUCAgIDQgICAgICAvKiBzcGVjaWZpYyBzZXJ2aWNlIGlzIG5vdCBhbGxvd2luZyBhbnkgbW9yZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRzICovCisKKy8qIHJlcG9ydCByZWNvcmQgSURzICovCisKKyNkZWZpbmUgSFRDX1JFQ09SRF9OVUxMICAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRDX1JFQ09SRF9DUkVESVRTICAgICAgICAgIDEKKyNkZWZpbmUgSFRDX1JFQ09SRF9MT09LQUhFQUQgICAgICAgIDIKKyNkZWZpbmUgSFRDX1JFQ09SRF9MT09LQUhFQURfQlVORExFIDMKKwordHlwZWRlZiBQUkVQQUNLIHN0cnVjdCB7CisJQV9VSU5UMzIgUmVjb3JkSUQgOiA4LCAgICAvKiBSZWNvcmQgSUQgKi8KKwkJIExlbmd0aCA6IDgsICAgIC8qIExlbmd0aCBvZiByZWNvcmQgKi8KKwkJIHJlc2VydmVkIDogMTY7Cit9IFBPU1RQQUNLIEhUQ19SRUNPUkRfSERSOworCisjZGVmaW5lIEhUQ19SRUNPUkRfSERSX1JFQ09SRElEX0xTQiAgICAgICAgICAgMAorI2RlZmluZSBIVENfUkVDT1JEX0hEUl9SRUNPUkRJRF9NQVNLICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSFRDX1JFQ09SRF9IRFJfUkVDT1JESURfT0ZGU0VUICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhUQ19SRUNPUkRfSERSX0xFTkdUSF9MU0IgICAgICAgICAgICAgOAorI2RlZmluZSBIVENfUkVDT1JEX0hEUl9MRU5HVEhfTUFTSyAgICAgICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSFRDX1JFQ09SRF9IRFJfTEVOR1RIX09GRlNFVCAgICAgICAgICAweDAwMDAwMDAwCisKK3R5cGVkZWYgUFJFUEFDSyBzdHJ1Y3QgeworCUFfVUlOVDMyIEVuZHBvaW50SUQgOiA4LCAgLyogRW5kcG9pbnQgdGhhdCBvd25zIHRoZXNlIGNyZWRpdHMgKi8KKwkJIENyZWRpdHMgOiA4LCAgIC8qIGNyZWRpdHMgdG8gcmVwb3J0IHNpbmNlIGxhc3QgcmVwb3J0ICovCisJCSByZXNlcnZlZCA6IDE2OworfSBQT1NUUEFDSyBIVENfQ1JFRElUX1JFUE9SVDsKKworI2RlZmluZSBIVENfQ1JFRElUX1JFUE9SVF9FTkRQT0lOVElEX0xTQiAgICAgIDAKKyNkZWZpbmUgSFRDX0NSRURJVF9SRVBPUlRfRU5EUE9JTlRJRF9NQVNLICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhUQ19DUkVESVRfUkVQT1JUX0VORFBPSU5USURfT0ZGU0VUICAgMHgwMDAwMDAwMAorI2RlZmluZSBIVENfQ1JFRElUX1JFUE9SVF9DUkVESVRTX0xTQiAgICAgICAgIDgKKyNkZWZpbmUgSFRDX0NSRURJVF9SRVBPUlRfQ1JFRElUU19NQVNLICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhUQ19DUkVESVRfUkVQT1JUX0NSRURJVFNfT0ZGU0VUICAgICAgMHgwMDAwMDAwMAorCit0eXBlZGVmIFBSRVBBQ0sgc3RydWN0IHsKKwlBX1VJTlQzMiBQcmVWYWxpZCA6IDgsICAgIC8qIHByZSB2YWxpZCBndWFyZCAqLworCQkgcmVzZXJ2ZWQwIDogMjQ7CisJQV9VSU5UMzIgTG9va0FoZWFkMCA6IDgsICAvKiA0IGJ5dGUgbG9va2FoZWFkICovCisJCSBMb29rQWhlYWQxIDogOCwgTG9va0FoZWFkMiA6IDgsIExvb2tBaGVhZDMgOiA4OworCUFfVUlOVDMyIFBvc3RWYWxpZCA6IDgsICAgLyogcG9zdCB2YWxpZCBndWFyZCAqLworCQkgcmVzZXJ2ZWQxIDogMjQ7CisKKwkvKiBOT1RFOiB0aGUgTG9va0FoZWFkIGFycmF5IGlzIGd1YXJkZWQgYnkgYSBQcmVWYWxpZCBhbmQgUG9zdCBWYWxpZCBndWFyZCBieXRlcy4KKwkgKiBUaGUgUHJlVmFsaWQgYnl0ZXMgbXVzdCBlcXVhbCB0aGUgaW52ZXJzZSBvZiB0aGUgUG9zdFZhbGlkIGJ5dGUgKi8KKworfSBQT1NUUEFDSyBIVENfTE9PS0FIRUFEX1JFUE9SVDsKKworI2RlZmluZSBIVENfTE9PS0FIRUFEX1JFUE9SVF9QUkVWQUxJRF9MU0IgICAgICAgICAwCisjZGVmaW5lIEhUQ19MT09LQUhFQURfUkVQT1JUX1BSRVZBTElEX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSFRDX0xPT0tBSEVBRF9SRVBPUlRfUFJFVkFMSURfT0ZGU0VUICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIVENfTE9PS0FIRUFEX1JFUE9SVF9MT09LQUhFQUQwX0xTQiAgICAgICAwCisjZGVmaW5lIEhUQ19MT09LQUhFQURfUkVQT1JUX0xPT0tBSEVBRDBfTUFTSyAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSFRDX0xPT0tBSEVBRF9SRVBPUlRfTE9PS0FIRUFEMF9PRkZTRVQgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIVENfTE9PS0FIRUFEX1JFUE9SVF9MT09LQUhFQUQxX0xTQiAgICAgICA4CisjZGVmaW5lIEhUQ19MT09LQUhFQURfUkVQT1JUX0xPT0tBSEVBRDFfTUFTSyAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSFRDX0xPT0tBSEVBRF9SRVBPUlRfTE9PS0FIRUFEMV9PRkZTRVQgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIVENfTE9PS0FIRUFEX1JFUE9SVF9MT09LQUhFQUQyX0xTQiAgICAgICAxNgorI2RlZmluZSBIVENfTE9PS0FIRUFEX1JFUE9SVF9MT09LQUhFQUQyX01BU0sgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhUQ19MT09LQUhFQURfUkVQT1JUX0xPT0tBSEVBRDJfT0ZGU0VUICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSFRDX0xPT0tBSEVBRF9SRVBPUlRfTE9PS0FIRUFEM19MU0IgICAgICAgMjQKKyNkZWZpbmUgSFRDX0xPT0tBSEVBRF9SRVBPUlRfTE9PS0FIRUFEM19NQVNLICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBIVENfTE9PS0FIRUFEX1JFUE9SVF9MT09LQUhFQUQzX09GRlNFVCAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhUQ19MT09LQUhFQURfUkVQT1JUX1BPU1RWQUxJRF9MU0IgICAgICAgIDAKKyNkZWZpbmUgSFRDX0xPT0tBSEVBRF9SRVBPUlRfUE9TVFZBTElEX01BU0sgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIVENfTE9PS0FIRUFEX1JFUE9SVF9QT1NUVkFMSURfT0ZGU0VUICAgICAweDAwMDAwMDA4CisKK3R5cGVkZWYgUFJFUEFDSyBzdHJ1Y3QgeworCUFfVUlOVDMyIExvb2tBaGVhZDAgOiA4LCAgLyogNCBieXRlIGxvb2thaGVhZCAqLworCQkgTG9va0FoZWFkMSA6IDgsIExvb2tBaGVhZDIgOiA4LCBMb29rQWhlYWQzIDogODsKK30gUE9TVFBBQ0sgSFRDX0JVTkRMRURfTE9PS0FIRUFEX1JFUE9SVDsKKworI2RlZmluZSBIVENfQlVORExFRF9MT09LQUhFQURfUkVQT1JUX0xPT0tBSEVBRDBfTFNCICAgICAgICAgICAwCisjZGVmaW5lIEhUQ19CVU5ETEVEX0xPT0tBSEVBRF9SRVBPUlRfTE9PS0FIRUFEMF9NQVNLICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSFRDX0JVTkRMRURfTE9PS0FIRUFEX1JFUE9SVF9MT09LQUhFQUQwX09GRlNFVCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIVENfQlVORExFRF9MT09LQUhFQURfUkVQT1JUX0xPT0tBSEVBRDFfTFNCICAgICAgICAgICA4CisjZGVmaW5lIEhUQ19CVU5ETEVEX0xPT0tBSEVBRF9SRVBPUlRfTE9PS0FIRUFEMV9NQVNLICAgICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSFRDX0JVTkRMRURfTE9PS0FIRUFEX1JFUE9SVF9MT09LQUhFQUQxX09GRlNFVCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIVENfQlVORExFRF9MT09LQUhFQURfUkVQT1JUX0xPT0tBSEVBRDJfTFNCICAgICAgICAgICAxNgorI2RlZmluZSBIVENfQlVORExFRF9MT09LQUhFQURfUkVQT1JUX0xPT0tBSEVBRDJfTUFTSyAgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhUQ19CVU5ETEVEX0xPT0tBSEVBRF9SRVBPUlRfTE9PS0FIRUFEMl9PRkZTRVQgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSFRDX0JVTkRMRURfTE9PS0FIRUFEX1JFUE9SVF9MT09LQUhFQUQzX0xTQiAgICAgICAgICAgMjQKKyNkZWZpbmUgSFRDX0JVTkRMRURfTE9PS0FIRUFEX1JFUE9SVF9MT09LQUhFQUQzX01BU0sgICAgICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBIVENfQlVORExFRF9MT09LQUhFQURfUkVQT1JUX0xPT0tBSEVBRDNfT0ZGU0VUICAgICAgICAweDAwMDAwMDAwCisKKyNpZm5kZWYgQVRIX1RBUkdFVAorI2luY2x1ZGUgImF0aGVuZHBhY2suaCIKKyNlbmRpZgorCisjZW5kaWYgLyogX19IVENfSF9fICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL2h0Y19zZXJ2aWNlcy5oIGIvdGFyZ2V0L2luYy9odGNfc2VydmljZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQzNzcyCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy9odGNfc2VydmljZXMuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0hUQ19TRVJWSUNFU19IX18KKyNkZWZpbmUgX19IVENfU0VSVklDRVNfSF9fCisKKy8qIEN1cnJlbnQgc2VydmljZSBJRHMgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlSU1ZEX1NFUlZJQ0VfR1JPVVAgPSAwLAorCVdNSV9TRVJWSUNFX0dST1VQID0gMSwKKwlOTUlfU0VSVklDRV9HUk9VUCA9IDIsCisJSFRUX1NFUlZJQ0VfR1JPVVAgPSAzLAorCUNGR19OVl9TRVJWSUNFX0dST1VQID0gNCwKKwlXRElfSVBBX1NFUlZJQ0VfR1JPVVAgPSA1LAorCUhUQ19URVNUX0dST1VQID0gMjU0LAorCUhUQ19TRVJWSUNFX0dST1VQX0xBU1QgPSAyNTUKK30gSFRDX1NFUlZJQ0VfR1JPVVBfSURTOworCisjZGVmaW5lIE1BS0VfU0VSVklDRV9JRChncm91cCxpbmRleCkgXAorCShpbnQpKCgoaW50KWdyb3VwIDw8IDgpIHwgKGludCkoaW5kZXgpKQorCisvKiBOT1RFOiBzZXJ2aWNlIElEIG9mIDB4MDAwMCBpcyByZXNlcnZlZCBhbmQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgKi8KKyNkZWZpbmUgSFRDX0NUUkxfUlNWRF9TVkMgTUFLRV9TRVJWSUNFX0lEKFJTVkRfU0VSVklDRV9HUk9VUCwxKQorI2RlZmluZSBXTUlfQ09OVFJPTF9TVkMgICBNQUtFX1NFUlZJQ0VfSUQoV01JX1NFUlZJQ0VfR1JPVVAsMCkKKyNkZWZpbmUgV01JX0RBVEFfQkVfU1ZDICAgTUFLRV9TRVJWSUNFX0lEKFdNSV9TRVJWSUNFX0dST1VQLDEpCisjZGVmaW5lIFdNSV9EQVRBX0JLX1NWQyAgIE1BS0VfU0VSVklDRV9JRChXTUlfU0VSVklDRV9HUk9VUCwyKQorI2RlZmluZSBXTUlfREFUQV9WSV9TVkMgICBNQUtFX1NFUlZJQ0VfSUQoV01JX1NFUlZJQ0VfR1JPVVAsMykKKyNkZWZpbmUgV01JX0RBVEFfVk9fU1ZDICAgTUFLRV9TRVJWSUNFX0lEKFdNSV9TRVJWSUNFX0dST1VQLDQpCisjZGVmaW5lIFdNSV9NQVhfU0VSVklDRVMgIDUKKworI2RlZmluZSBOTUlfQ09OVFJPTF9TVkMgICBNQUtFX1NFUlZJQ0VfSUQoTk1JX1NFUlZJQ0VfR1JPVVAsMCkKKyNkZWZpbmUgTk1JX0RBVEFfU1ZDICAgICAgTUFLRV9TRVJWSUNFX0lEKE5NSV9TRVJWSUNFX0dST1VQLDEpCisKKyNkZWZpbmUgSFRUX0RBVEFfTVNHX1NWQyAgTUFLRV9TRVJWSUNFX0lEKEhUVF9TRVJWSUNFX0dST1VQLDApCisjZGVmaW5lIEhUVF9EQVRBMl9NU0dfU1ZDIE1BS0VfU0VSVklDRV9JRChIVFRfU0VSVklDRV9HUk9VUCwxKQorCisvKiByYXcgc3RyZWFtIHNlcnZpY2UgKGkuZS4gZmxhc2gsIHRjbWQsIGNhbGlicmF0aW9uIGFwcHMpICovCisjZGVmaW5lIEhUQ19SQVdfU1RSRUFNU19TVkMgTUFLRV9TRVJWSUNFX0lEKEhUQ19URVNUX0dST1VQLDApCisKKyNkZWZpbmUgQ0ZHX05WX1NWQyAgTUFLRV9TRVJWSUNFX0lEKENGR19OVl9TRVJWSUNFX0dST1VQLDApCisjZGVmaW5lIFdESV9JUEFfVFhfU1ZDIE1BS0VfU0VSVklDRV9JRChXRElfSVBBX1NFUlZJQ0VfR1JPVVAsMCkKKworLyoKKyAqIERpcmVjdGlvbnMgZm9yIGludGVyY29ubmVjdCBwaXBlIGNvbmZpZ3VyYXRpb24uCisgKiBUaGVzZSBkZWZpbml0aW9ucyBtYXkgYmUgdXNlZCBkdXJpbmcgY29uZmlndXJhdGlvbiBhbmQgYXJlIHNoYXJlZAorICogYmV0d2VlbiBIb3N0IGFuZCBUYXJnZXQuCisgKgorICogUGlwZSBEaXJlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgSG9zdCwgc28gUElQRURJUl9JTiBtZWFucworICogImNvbWluZyBJTiBvdmVyIGFpciB0aHJvdWdoIFRhcmdldCB0byBIb3N0IiBhcyB3aXRoIGEgV2lGaSBSeCBvcGVyYXRpb24uCisgKiBDb252ZXJzZWx5LCBQSVBFRElSX09VVCBtZWFucyAiZ29pbmcgT1VUIGZyb20gSG9zdCB0aHJvdWdoIFRhcmdldCBvdmVyIGFpciIKKyAqIGFzIHdpdGggYSBXaUZpIFR4IG9wZXJhdGlvbi4gVGhpcyBpcyBzb21ld2hhdCBhd2t3YXJkIGZvciB0aGUgIm1pZGRsZS1tYW4iCisgKiBUYXJnZXQgc2luY2UgdGhpbmdzIHRoYXQgYXJlICJQSVBFRElSX09VVCIgYXJlIGNvbWluZyBJTiB0byB0aGUgVGFyZ2V0CisgKiBvdmVyIHRoZSBpbnRlcmNvbm5lY3QuCisgKi8KK3R5cGVkZWYgQV9VSU5UMzIgUElQRURJUjsKKyNkZWZpbmUgUElQRURJUl9OT05FCQkwCisjZGVmaW5lIFBJUEVESVJfSU4JCTEgICAvKiBUYXJnZXQtLT5Ib3N0LCBXaUZpIFJ4IGRpcmVjdGlvbiAqLworI2RlZmluZSBQSVBFRElSX09VVAkJMiAgIC8qIEhvc3QtPlRhcmdldCwgV2lGaSBUeCBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgUElQRURJUl9JTk9VVCAJCTMgICAvKiBiaWRpcmVjdGlvbmFsIC0gdGFyZ2V0IHRvIHRhcmdldCAqLworI2RlZmluZSBQSVBFRElSX0lOT1VUX0gySAk0ICAgLyogYmlkaXJlY3Rpb25hbCAtIGhvc3QgdG8gaG9zdCAqLworI2RlZmluZSBQSVBFRElSX01BVENIKGQxLCBkMikgKCgoUElQRURJUikoZDEpICYgKFBJUEVESVIpKGQyKSkgIT0gMCkKKworLyogRXN0YWJsaXNoIGEgbWFwcGluZyBiZXR3ZWVuIGEgc2VydmljZS9kaXJlY3Rpb24gYW5kIGEgcGlwZS4gKi8KK3N0cnVjdCBzZXJ2aWNlX3RvX3BpcGUgeworCUFfVUlOVDMyIHNlcnZpY2VfaWQ7CisJQV9VSU5UMzIgcGlwZWRpcjsKKwlBX1VJTlQzMiBwaXBlbnVtOworfTsKKworI2VuZGlmIC8qSFRDX1NFUlZJQ0VTX0hfICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL2h0dC5oIGIvdGFyZ2V0L2luYy9odHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWEwODFlCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy9odHQuaApAQCAtMCwwICsxLDcwMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGZpbGUgaHR0LmgKKyAqCisgKiBAZGV0YWlscyB0aGUgcHVibGljIGhlYWRlciBmaWxlIG9mIEhUVCBsYXllcgorICovCisKKyNpZm5kZWYgX0hUVF9IXworI2RlZmluZSBfSFRUX0hfCisKKyNpbmNsdWRlIDxhX3R5cGVzLmg+CQkvKiBBX1VJTlQzMiAqLworI2luY2x1ZGUgPGFfb3NhcGkuaD4JCS8qIFBSRVBBQ0ssIFBPU1RQQUNLICovCisjaWZkZWYgQVRIUl9XSU5fTldGCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MjE0KQkvKmJpdCBmaWVsZCB0eXBlcyBvdGhlciB0aGFuIGludCAqLworI2VuZGlmCisjaW5jbHVkZSAid2xhbl9kZWZzLmgiCisjaW5jbHVkZSA8aHR0X2NvbW1vbi5oPgorCisvKgorICogVW5sZXNzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHRvIHVzZSA2NCBiaXRzIHRvIHJlcHJlc2VudCBwaHlzaWNhbCBhZGRyZXNzZXMKKyAqIChvciBtb3JlIHByZWNpc2VseSwgYnVzIGFkZHJlc3NlcyksIGRlZmF1bHQgdG8gMzIgYml0cy4KKyAqLworI2lmbmRlZiBIVFRfUEFERFI2NAorI2RlZmluZSBIVFRfUEFERFI2NCAwCisjZW5kaWYKKworI2lmbmRlZiBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZih0eXBlLCBmaWVsZCkgICAoKHVuc2lnbmVkIGludCkoJigodHlwZSAqKTApLT5maWVsZCkpCisjZW5kaWYKKworLyoKKyAqIEhUVCB2ZXJzaW9uIGhpc3Rvcnk6CisgKiAxLjAgIGluaXRpYWwgbnVtYmVyZWQgdmVyc2lvbgorICogMS4xICBtb2RpZmljYXRpb25zIHRvIFNUQVRTIG1lc3NhZ2VzLgorICogICAgICBUaGVzZSBtb2RpZmljYXRpb25zIGFyZSBub3QgYmFja3dhcmRzIGNvbXBhdGlibGUsIGJ1dCBzaW5jZSB0aGUKKyAqICAgICAgU1RBVFMgbWVzc2FnZXMgdGhlbXNlbHZlcyBhcmUgbm9uLWVzc2VudGlhbCAodGhleSBhcmUgZm9yIGRlYnVnZ2luZyksCisgKiAgICAgIHRoZSAxLjEgdmVyc2lvbiBvZiB0aGUgSFRUIG1lc3NhZ2UgbGlicmFyeSBhcyBhIHdob2xlIGlzIGNvbXBhdGlibGUKKyAqICAgICAgd2l0aCB0aGUgMS4wIHZlcnNpb24uCisgKiAxLjIgIHJlc2V0IG1hc2sgSUUgYWRkZWQgdG8gU1RBVFNfUkVRIG1lc3NhZ2UKKyAqIDEuMyAgc3RhdCBjb25maWcgSUUgYWRkZWQgdG8gU1RBVFNfUkVRIG1lc3NhZ2UKKyAqLS0tLQorICogMi4wICBGVyByeCBQUERVIGRlc2MgYWRkZWQgdG8gUlhfSU5EIG1lc3NhZ2UKKyAqIDIuMSAgRW5hYmxlIG1zZHVfZXh0L2ZyYWdfZGVzYyBiYW5raW5nIGNoYW5nZSBmb3IgV0lGSTIuMAorICotLS0tCisgKiAzLjAgIFJlbW92ZSBIVFRfSDJUX01TR19UWVBFX01HTVRfVFggbWVzc2FnZQorICogMy4xICBBZGRlZCBIVFRfVDJIX01TR19UWVBFX1JYX0lOX09SRF9QQUREUl9JTkQgbWVzc2FnZQorICogMy4yICBBZGRlZCBIVFRfSDJUX01TR19UWVBFX1dESV9JUEFfQ0ZHLAorICogICAgICAgICAgICBIVFRfSDJUX01TR19UWVBFX1dESV9JUEFfT1BfUkVRVUVTVCBtZXNzYWdlcworICogMy4zICBBZGRlZCBIVFRfSDJUX01TR19UWVBFX0FHR1JfQ0ZHX0VYIG1lc3NhZ2UKKyAqIDMuNCAgQWRkZWQgdHhfY29tcGxfcmVxIGZsYWcgaW4gSFRUIHR4IGRlc2NyaXB0b3IKKyAqIDMuNSAgQWRkZWQgZmx1c2ggYW5kIGZhaWwgc3RhdHMgaW4gcnhfcmVvcmRlciBzdGF0cyBzdHJ1Y3R1cmUKKyAqIDMuNiAgQWRkZWQgZnJhZyBmbGFnIGluIEhUVCBSWCBJTk9SREVSIFBBRERSIElORCBoZWFkZXIKKyAqIDMuNyAgTWFkZSBjaGFuZ2VzIHRvIHN1cHBvcnQgRU9TIE1hY19jb3JlIDMuMAorICogMy44ICBBZGRlZCB0eHFfZ3JvdXAgaW5mb3JtYXRpb24gZWxlbWVudCBkZWZpbml0aW9uOworICogICAgICBhZGRlZCBvcHRpb25hbCB0eHFfZ3JvdXAgc3VmZml4IHRvIFRYX0NSRURJVF9VUERBVEVfSU5EIG1lc3NhZ2UKKyAqIDMuOSAgQWRkZWQgSFRUX1QySCBDSEFOX0NIQU5HRSBtZXNzYWdlOworICogICAgICBBbGxvdyBidWZmZXIgYWRkcmVzc2VzIGluIGJ1cy1hZGRyZXNzIGZvcm1hdCB0byBiZSBzdG9yZWQgYXMKKyAqICAgICAgZWl0aGVyIDMyIGJpdHMgb3IgNjQgYml0cy4KKyAqIDMuMTAgQWRkIG9wdGlvbmFsIFRMViBleHRlbnNpb25zIHRvIHRoZSBWRVJTSU9OX1JFUSBhbmQgVkVSU0lPTl9DT05GCisgKiAgICAgIG1lc3NhZ2VzIHRvIHNwZWNpZnkgd2hpY2ggSFRUIG9wdGlvbnMgdG8gdXNlLgorICogICAgICBJbml0aWFsIFRMViBvcHRpb25zIGNvdmVyOgorICogICAgICAgIC0gd2hldGhlciB0byB1c2UgMzIgb3IgNjQgYml0cyB0byByZXByZXNlbnQgTEwgYnVzIGFkZHJlc3NlcworICogICAgICAgIC0gd2hldGhlciB0byB1c2UgVFhfQ09NUExfSU5EIG9yIFRYX0NSRURJVF9VUERBVEVfSU5EIGluIEhMIHN5c3RlbXMKKyAqICAgICAgICAtIGhvdyBtYW55IHR4IHF1ZXVlIGdyb3VwcyB0byB1c2UKKyAqIDMuMTEgRXhwYW5kIHJ4IGRlYnVnIHN0YXRzOgorICogICAgICAgIC0gRXhwYW5kIHRoZSByeF9yZW9yZGVyX3N0YXRzIHN0cnVjdCB3aXRoIHN0YXRzIGFib3V0IHN1Y2Nlc3NmdWwgYW5kCisgKiAgICAgICAgICBmYWlsZWQgcnggYnVmZmVyIGFsbGNvYXRpb25zLgorICogICAgICAgIC0gQWRkIGEgbmV3IHJ4X3JlbW90ZV9idWZmZXJfbWdtdF9zdGF0cyBzdHJ1Y3Qgd2l0aCBzdGF0cyBhYm91dAorICogICAgICAgICAgdGhlIHN1cHBseSwgYWxsb2NhdGlvbiwgdXNlLCBhbmQgcmVjeWNsaW5nIG9mIHJ4IGJ1ZmZlcnMgZm9yIHRoZQorICogICAgICAgICAgInJlbW90ZSByaW5nIiBvZiByeCBidWZmZXJzIGluIGhvc3QgbWVtYmVyIGluIExMIHN5c3RlbXMuCisgKiAgICAgICAgICBBZGQgUlhfUkVNT1RFX1JJTkdfQlVGRkVSX0lORk8gc3RhdHMgdHlwZSBmb3IgdXBsb2FkaW5nIHRoZXNlIHN0YXRzLgorICogMy4xMiBBZGQgInJ4IG9mZmxvYWQgcGFja2V0IGVycm9yIiBtZXNzYWdlIHdpdGggaW5pdGlhbCAiTUlDIGVycm9yIiBzdWJ0eXBlCisgKiAzLjEzIEFkZCBjb25zdGFudHMgKyBtYWNyb3MgdG8gc3VwcG9ydCA2NC1iaXQgYWRkcmVzcyBmb3JtYXQgZm9yIHRoZQorICogICAgICB0eCBmcmFnbWVudHMgZGVzY3JpcHRvciwgdGhlIHJ4IHJpbmcgYnVmZmVyLCBhbmQgdGhlIHJ4IHJpbmcKKyAqICAgICAgaW5kZXggc2hhZG93IHJlZ2lzdGVyLgorICogMy4xNCBBZGQgYSBtZXRob2QgZm9yIHRoZSBob3N0IHRvIHByb3ZpZGUgZGV0YWlsZWQgcGVyLWZyYW1lIHR4IHNwZWNzOgorICogICAgICAgIC0gQWRkIGh0dF90eF9tc2R1X2Rlc2NfZXh0X3Qgc3RydWN0IGRlZi4KKyAqICAgICAgICAtIEFkZCBUTFYgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSB0YXJnZXQgc3VwcG9ydHMgdGhlIEhUVCB0eCBNU0RVCisgKiAgICAgICAgICBleHRlbnNpb24gZGVzY3JpcHRvci4KKyAqICAgICAgICAtIENoYW5nZSBhIHJlc2VydmVkIGJpdCBpbiB0aGUgSFRUIHR4IE1TRFUgZGVzY3JpcHRvciB0byBhbgorICogICAgICAgICAgImV4dGVuc2lvbiIgYml0LCB0byBzcGVjaWZ5IHdoZXRoZXIgYSBIVFQgdHggTVNEVSBleHRlbnNpb24KKyAqICAgICAgICAgIGRlc2NyaXB0b3IgaXMgcHJlc2VudC4KKyAqIDMuMTUgQWRkIEhXIHJ4IGRlc2MgaW5mbyB0byBwZXItTVNEVSBpbmZvIGVsZW1zIGluIFJYX0lOX09SRF9QQUREUl9JTkQgbXNnLgorICogICAgICAoVGhpcyBhbGxvd3MgdGhlIGhvc3QgdG8gb2J0YWluIGtleSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTVNEVQorICogICAgICBmcm9tIGEgbWVtb3J5IGxvY2F0aW9uIGFscmVhZHkgaW4gdGhlIGNhY2hlLCByYXRoZXIgdGhhbiB0YWtpbmcgYQorICogICAgICBjYWNoZSBtaXNzIGZvciBlYWNoIE1TRFUgYnkgcmVhZGluZyB0aGUgSFcgcnggZGVzY3MuKQorICogMy4xNiBBZGQgaHR0X3BrdF90eXBlX2V0aDIgYW5kIGRlZmluZSBwa3Rfc3VidHlwZSBmbGFncyB0byBpbmRpY2F0ZQorICogICAgICB3aGV0aGVyIGEgY29weS1lbmdpbmUgY2xhc3NpZmljYXRpb24gcmVzdWx0IGlzIGFwcGVuZGVkIHRvIFRYX0ZSTS4KKyAqIDMuMTcgQWRkIGEgdmVyc2lvbiBvZiB0aGUgV0RJX0lQQV9DRkcgbWVzc2FnZTsgYWRkIFJYX1JJTkcyIHRvIFdESV9JUEFfQ0ZHCisgKiAzLjE4IEFkZCBhIFBFRVJfREVMIHR4IGNvbXBsZXRpb24gaW5kaWNhdGlvbiBzdGF0dXMsIGZvciBITCBjbGVhbnVwIG9mCisgKiAgICAgIHR4IGZyYW1lcyBpbiB0aGUgdGFyZ2V0IGFmdGVyIHRoZSBwZWVyIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZC4KKyAqIDMuMTkgQWRkIEhUVF9EQkdfU1RBVFNfUlhfUkFURV9JTkZPX1YyIGFuZCBIVFRfREJHX1NUQVRTX1RYX1JBVEVfSU5GT19WMgorICogMy4yMCBFeHBhbmQgcnhfcmVvcmRlcl9zdGF0cy4KKyAqIDMuMjEgQWRkIG9wdGlvbmFsIHJ4IGNoYW5uZWwgc3BlYyB0byBITCBSWF9JTkQuCisgKiAzLjIyIEV4cGFuZCByeF9yZW9yZGVyX3N0YXRzCisgKiAgICAgIChkaXN0aW5ndWlzaCBkdXBsaWNhdGVzIHdpdGhpbiB2cy4gb3V0c2lkZSBibG9jayBhY2sgd2luZG93KQorICogMy4yMyBBZGQgSFRUX1QySF9NU0dfVFlQRV9SQVRFX1JFUE9SVCB0byByZXBvcnQgcGVlciBqdXN0aWZpZWQgcmF0ZS4KKyAqICAgICAgVGhlIGp1c3RpZmllZCByYXRlIGlzIGNhbGN1bGF0ZWQgYnkgdHdvIHN0ZXBzLiBUaGUgZmlyc3QgaXMgdG8gbXVsdGlwbHkKKyAqICAgICAgdXNlci1yYXRlIGJ5ICgxIC0gUEVSKSBhbmQgdGhlIG90aGVyIGlzIHRvIHNtb290aCB0aGUgc3RlcCAxJ3MgcmVzdWx0CisgKiAgICAgIGJ5IGEgbG93IHBhc3MgZmlsdGVyLgorICogICAgICBUaGlzIGNoYW5nZSBhbGxvd3MgSEwgZG93bmxvYWQgc2NoZWR1bGluZyB0byBjb25zaWRlciB0aGUgV0xBTiByYXRlCisgKiAgICAgIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0cmFuc21pdHRpbmcgdGhlIGRvd25sb2FkZWQgZnJhbWVzLgorICogMy4yNCBFeHBhbmQgcnhfcmVvcmRlcl9zdGF0cworICogICAgICAoYWRkIGNvdW50ZXIgZm9yIGRlY3J5cHQgLyBNSUMgZXJyb3JzKQorICogMy4yNSBFeHBhbmQgcnhfcmVvcmRlcl9zdGF0cworICogICAgICAoYWRkIGNvdW50ZXIgb2YgZnJhbWVzIHJlY2VpdmVkIGludG8gYm90aCBsb2NhbCArIHJlbW90ZSByaW5ncykKKyAqIDMuMjYgQWRkIHN0YXRzIHN0cnVjdCBmb3IgY291bnRpbmcgcnggb2YgdHggQkYsIE1VLCBTVSwgYW5kIE5EUEEgZnJhbWVzCisgKiAgICAgIChIVFRfREJHX1NUQVRTX1RYQkZfTVVTVV9ORFBBX1BLVCwgcnhfdHhiZl9tdXN1X25kcGFfcGt0c19zdGF0cykKKyAqIDMuMjcgQWRkIGEgbmV3IGludGVyZmFjZSBmb3IgZmxvdy1jb250cm9sLiBUaGUgZm9sbG93aW5nIHQyaCBtZXNzYWdlcyBoYXZlCisgKiAgICAgIGJlZW4gaW5jbHVkZWQ6IEhUVF9UMkhfTVNHX1RZUEVfRkxPV19QT09MX01BUCBhbmQKKyAqICAgICAgSFRUX1QySF9NU0dfVFlQRV9GTE9XX1BPT0xfVU5NQVAKKyAqLworI2RlZmluZSBIVFRfQ1VSUkVOVF9WRVJTSU9OX01BSk9SIDMKKyNkZWZpbmUgSFRUX0NVUlJFTlRfVkVSU0lPTl9NSU5PUiAyNworCisjZGVmaW5lIEhUVF9OVU1fVFhfRlJBR19ERVNDICAxMDI0CisKKyNkZWZpbmUgSFRUX1dJRklfSVBfVkVSU0lPTih4LCB5KSAoKHgpID09ICh5KSkKKworI2RlZmluZSBIVFRfQ0hFQ0tfU0VUX1ZBTChmaWVsZCwgdmFsKQkJCQlcCisJQV9BU1NFUlQoISgodmFsKSAmIH4oKGZpZWxkICMjIF9NKSA+PiAoZmllbGQgIyMgX1MpKSkpCisKKy8qIG1hY3JvcyB0byBhc3Npc3QgaW4gc2lnbi1leHRlbmRpbmcgZmllbGRzIGZyb20gSFRUIG1lc3NhZ2VzICovCisjZGVmaW5lIEhUVF9TSUdOX0JJVF9NQVNLKGZpZWxkKSBcCisJKChmaWVsZCAjIyBfTSArICgxIDw8IGZpZWxkICMjIF9TKSkgPj4gMSkKKwkjZGVmaW5lIEhUVF9TSUdOX0JJVChfdmFsLCBmaWVsZCkgXAorCShfdmFsICYgSFRUX1NJR05fQklUX01BU0soZmllbGQpKQorCSNkZWZpbmUgSFRUX1NJR05fQklUX1VOU0hJRlRFRChfdmFsLCBmaWVsZCkgXAorCShIVFRfU0lHTl9CSVQoX3ZhbCwgZmllbGQpID4+IGZpZWxkICMjIF9TKQorCSNkZWZpbmUgSFRUX1NJR05fQklUX1VOU0hJRlRFRF9NSU5VU19PTkUoX3ZhbCwgZmllbGQpIFwKKwkoSFRUX1NJR05fQklUX1VOU0hJRlRFRChfdmFsLCBmaWVsZCkgLSAxKQorCSNkZWZpbmUgSFRUX1NJR05fQklUX0VYVEVOU0lPTihfdmFsLCBmaWVsZCkgXAorCSh+KEhUVF9TSUdOX0JJVF9VTlNISUZURUQoX3ZhbCwgZmllbGQpIHwgXAorCUhUVF9TSUdOX0JJVF9VTlNISUZURURfTUlOVVNfT05FKF92YWwsIGZpZWxkKSkpCisJI2RlZmluZSBIVFRfU0lHTl9CSVRfRVhURU5TSU9OX01BU0soX3ZhbCwgZmllbGQpIFwKKwkoSFRUX1NJR05fQklUX0VYVEVOU0lPTihfdmFsLCBmaWVsZCkgJiB+KGZpZWxkICMjIF9NID4+IGZpZWxkICMjIF9TKSkKKworCisvKgorICogVEVNUE9SQVJZOgorICogUHJvdmlkZSBIVFRfSDJUX01TR19UWVBFX01HTVRfVFggYXMgYW4gYWxpYXMgZm9yCisgKiBERVBSRUNBVEVEX0hUVF9IMlRfTVNHX1RZUEVfTUdNVF9UWCB1bnRpbCBhbGwgY29kZQorICogdGhhdCByZWZlcnMgdG8gSFRUX0gyVF9NU0dfVFlQRV9NR01UX1RYIGhhcyBiZWVuCisgKiB1cGRhdGVkLgorICovCisjZGVmaW5lIEhUVF9IMlRfTVNHX1RZUEVfTUdNVF9UWCBERVBSRUNBVEVEX0hUVF9IMlRfTVNHX1RZUEVfTUdNVF9UWAorCisvKgorICogVEVNUE9SQVJZOgorICogUHJvdmlkZSBIVFRfVDJIX01TR19UWVBFX1JDX1VQREFURV9JTkQgYXMgYW4gYWxpYXMgZm9yCisgKiBERVBSRUNBVEVEX0hUVF9UMkhfTVNHX1RZUEVfUkNfVVBEQVRFX0lORCB1bnRpbCBhbGwgY29kZQorICogdGhhdCByZWZlcnMgdG8gSFRUX1QySF9NU0dfVFlQRV9SQ19VUERBVEVfSU5EIGhhcyBiZWVuCisgKiB1cGRhdGVkLgorICovCisjZGVmaW5lIEhUVF9UMkhfTVNHX1RZUEVfUkNfVVBEQVRFX0lORCBERVBSRUNBVEVEX0hUVF9UMkhfTVNHX1RZUEVfUkNfVVBEQVRFX0lORAorCisvKiBIVFQgQWNjZXNzIENhdGVnb3J5IHZhbHVlcyAqLworZW51bSBIVFRfQUNfV01NIHsKKwkvKiBXTU0gQWNjZXNzIENhdGVnb3JpZXMgKi8KKwlIVFRfQUNfV01NX0JFID0gMHgwLAorCUhUVF9BQ19XTU1fQksgPSAweDEsCisJSFRUX0FDX1dNTV9WSSA9IDB4MiwKKwlIVFRfQUNfV01NX1ZPID0gMHgzLAorCS8qIGV4dGVuc2lvbiBBY2Nlc3MgQ2F0ZWdvcmllcyAqLworCUhUVF9BQ19FWFRfTk9OX1FPUyA9IDB4NCwKKwlIVFRfQUNfRVhUX1VDQVNUX01HTVQgPSAweDUsCisJSFRUX0FDX0VYVF9NQ0FTVF9EQVRBID0gMHg2LAorCUhUVF9BQ19FWFRfTUNBU1RfTUdNVCA9IDB4NywKK307CitlbnVtIEhUVF9BQ19XTU1fTUFTSyB7CisJLyogV01NIEFjY2VzcyBDYXRlZ29yaWVzICovCisJSFRUX0FDX1dNTV9CRV9NQVNLID0gKDEgPDwgSFRUX0FDX1dNTV9CRSksCisJSFRUX0FDX1dNTV9CS19NQVNLID0gKDEgPDwgSFRUX0FDX1dNTV9CSyksCisJSFRUX0FDX1dNTV9WSV9NQVNLID0gKDEgPDwgSFRUX0FDX1dNTV9WSSksCisJSFRUX0FDX1dNTV9WT19NQVNLID0gKDEgPDwgSFRUX0FDX1dNTV9WTyksCisJLyogZXh0ZW5zaW9uIEFjY2VzcyBDYXRlZ29yaWVzICovCisJSFRUX0FDX0VYVF9OT05fUU9TX01BU0sgPSAoMSA8PCBIVFRfQUNfRVhUX05PTl9RT1MpLAorCUhUVF9BQ19FWFRfVUNBU1RfTUdNVF9NQVNLID0gKDEgPDwgSFRUX0FDX0VYVF9VQ0FTVF9NR01UKSwKKwlIVFRfQUNfRVhUX01DQVNUX0RBVEFfTUFTSyA9ICgxIDw8IEhUVF9BQ19FWFRfTUNBU1RfREFUQSksCisJSFRUX0FDX0VYVF9NQ0FTVF9NR01UX01BU0sgPSAoMSA8PCBIVFRfQUNfRVhUX01DQVNUX01HTVQpLAorfTsKKyNkZWZpbmUgSFRUX0FDX01BU0tfV01NCQkJCQlcCisJKEhUVF9BQ19XTU1fQkVfTUFTSyB8IEhUVF9BQ19XTU1fQktfTUFTSyB8CVwKKwkgSFRUX0FDX1dNTV9WSV9NQVNLIHwgSFRUX0FDX1dNTV9WT19NQVNLKQorI2RlZmluZSBIVFRfQUNfTUFTS19FWFQJCQkJCQkJXAorCShIVFRfQUNfRVhUX05PTl9RT1NfTUFTSyB8IEhUVF9BQ19FWFRfVUNBU1RfTUdNVF9NQVNLIHwJCVwKKwkgSFRUX0FDX0VYVF9NQ0FTVF9EQVRBX01BU0sgfCBIVFRfQUNfRVhUX01DQVNUX01HTVRfTUFTSykKKyNkZWZpbmUgSFRUX0FDX01BU0tfQUxMIChIVFRfQUNfTUFTS19XTU0gfCBIVFRfQUNfTUFTS19FWFQpCisKKy8qCisgKiBodHRfZGJnX3N0YXRzX3R5cGUgLQorICogYml0IHBvc2l0aW9ucyBmb3IgZWFjaCBzdGF0cyB0eXBlIHdpdGhpbiBhIHN0YXRzIHR5cGUgYml0bWFzaworICogVGhlIGJpdG1hc2sgY29udGFpbnMgMjQgYml0cy4KKyAqLworZW51bSBodHRfZGJnX3N0YXRzX3R5cGUgeworCUhUVF9EQkdfU1RBVFNfV0FMX1BERVZfVFhSWCAgICAgICAgICAgICAgPSAgMCwgLyogYml0IDAgIC0+ICAgIDB4MSAqLworCUhUVF9EQkdfU1RBVFNfUlhfUkVPUkRFUiAgICAgICAgICAgICAgICAgPSAgMSwgLyogYml0IDEgIC0+ICAgIDB4MiAqLworCUhUVF9EQkdfU1RBVFNfUlhfUkFURV9JTkZPICAgICAgICAgICAgICAgPSAgMiwgLyogYml0IDIgIC0+ICAgIDB4NCAqLworCUhUVF9EQkdfU1RBVFNfVFhfUFBEVV9MT0cgICAgICAgICAgICAgICAgPSAgMywgLyogYml0IDMgIC0+ICAgIDB4OCAqLworCUhUVF9EQkdfU1RBVFNfVFhfUkFURV9JTkZPICAgICAgICAgICAgICAgPSAgNCwgLyogYml0IDQgIC0+ICAgMHgxMCAqLworCUhUVF9EQkdfU1RBVFNfVElEUSAgICAgICAgICAgICAgICAgICAgICAgPSAgNSwgLyogYml0IDUgIC0+ICAgMHgyMCAqLworCUhUVF9EQkdfU1RBVFNfVFhCRl9JTkZPICAgICAgICAgICAgICAgICAgPSAgNiwgLyogYml0IDYgIC0+ICAgMHg0MCAqLworCUhUVF9EQkdfU1RBVFNfU05EX0lORk8gICAgICAgICAgICAgICAgICAgPSAgNywgLyogYml0IDcgIC0+ICAgMHg4MCAqLworCUhUVF9EQkdfU1RBVFNfRVJST1JfSU5GTyAgICAgICAgICAgICAgICAgPSAgOCwgLyogYml0IDggIC0+ICAweDEwMCAqLworCUhUVF9EQkdfU1RBVFNfVFhfU0VMRkdFTl9JTkZPICAgICAgICAgICAgPSAgOSwgLyogYml0IDkgIC0+ICAweDIwMCAqLworCUhUVF9EQkdfU1RBVFNfVFhfTVVfSU5GTyAgICAgICAgICAgICAgICAgPSAxMCwgLyogYml0IDEwIC0+ICAweDQwMCAqLworCUhUVF9EQkdfU1RBVFNfU0lGU19SRVNQX0lORk8gICAgICAgICAgICAgPSAxMSwgLyogYml0IDExIC0+ICAweDgwMCAqLworCUhUVF9EQkdfU1RBVFNfUlhfUkVNT1RFX1JJTkdfQlVGRkVSX0lORk8gPSAxMiwgLyogYml0IDEyIC0+IDB4MTAwMCAqLworCUhUVF9EQkdfU1RBVFNfUlhfUkFURV9JTkZPX1YyICAgICAgICAgICAgPSAxMywgLyogYml0IDEzIC0+IDB4MjAwMCAqLworCUhUVF9EQkdfU1RBVFNfVFhfUkFURV9JTkZPX1YyICAgICAgICAgICAgPSAxNCwgLyogYml0IDE0IC0+IDB4NDAwMCAqLworCUhUVF9EQkdfU1RBVFNfVFhCRl9NVVNVX05EUEFfUEtUICAgICAgICAgPSAxNSwgLyogYml0IDE1IC0+IDB4ODAwMCAqLworCS8qIGJpdHMgMTYtMjMgY3VycmVudGx5IHJlc2VydmVkICovCisKKwkvKiBrZWVwIHRoaXMgbGFzdCAqLworCUhUVF9EQkdfTlVNX1NUQVRTCit9OworCisvKj09PSBIVFQgb3B0aW9uIHNlbGVjdGlvbiBUTFZzID09PQorICogQ2VydGFpbiBIVFQgbWVzc2FnZXMgaGF2ZSBhbHRlcm5hdGl2ZXMgb3Igb3B0aW9ucy4KKyAqIEZvciBzdWNoIGNhc2VzLCB0aGUgaG9zdCBhbmQgdGFyZ2V0IG5lZWQgdG8gYWdyZWUgb24gd2hpY2ggb3B0aW9uIHRvIHVzZS4KKyAqIE9wdGlvbiBzcGVjaWZpY2F0aW9uIFRMVnMgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBWRVJTSU9OX1JFUSBhbmQKKyAqIFZFUlNJT05fQ09ORiBtZXNzYWdlcyB0byBzZWxlY3Qgb3B0aW9ucyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LgorICogVGhlc2UgVExWcyBhcmUgZW50aXJlbHkgb3B0aW9uYWwgLSBpZiB0aGV5IGFyZSBub3QgcHJvdmlkZWQsIHRoZXJlIGlzIGEKKyAqIHdlbGwtZGVmaW5lZCBkZWZhdWx0IGZvciBlYWNoIG9wdGlvbi4gIElmIHRoZXkgYXJlIHByb3ZpZGVkLCB0aGV5IGNhbiBiZQorICogcHJvdmlkZWQgaW4gYW55IG9yZGVyLiAgRWFjaCBUTFYgY2FuIGJlIHByZXNlbnQgb3IgYWJzZW50IGluZGVwZW5kZW50IG9mCisgKiB0aGUgcHJlc2VuY2UgLyBhYnNlbmNlIG9mIG90aGVyIFRMVnMuCisgKgorICogVGhlIEhUVCBvcHRpb24gc2VsZWN0aW9uIFRMVnMgdXNlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICogICAgIHwzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTZ8MTUgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgICAwfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgIHZhbHVlIChwYXlsb2FkKSAgICAgICAgICB8ICAgICBsZW5ndGggICAgIHwgICAgICAgdGFnICAgICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogVGhlIHZhbHVlIHBvcnRpb24gbmVlZCBub3QgYmUgb25seSAyIGJ5dGVzOyBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgYW55CisgKiBpbnRlZ2VyIG51bWJlciBvZiA0LWJ5dGUgdW5pdHMuICBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBUTFYsIGluY2x1ZGluZworICogdGhlIHRhZyBhbmQgbGVuZ3RoIGZpZWxkcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuICBUaGUgbGVuZ3RoCisgKiBmaWVsZCBzcGVjaWZpZXMgdGhlIHRvdGFsIFRMViBzaXplIGluIDQtYnl0ZSB1bml0cy4gIFRodXMsIHRoZSB0eXBpY2FsCisgKiBUTFYsIHdpdGggYSAxLWJ5dGUgdGFnIGZpZWxkLCBhIDEtYnl0ZSBsZW5ndGggZmllbGQsIGFuZCBhIDItYnl0ZSB2YWx1ZQorICogZmllbGQsIHdvdWxkIHN0b3JlIDB4MSBpbiBpdHMgbGVuZ3RoIGZpZWxkLCB0byBzaG93IHRoYXQgdGhlIFRMViBvY2N1cGllcworICogYSBzaW5nbGUgNC1ieXRlIHVuaXQuCisgKi8KKworLyotLS0gVExWIGhlYWRlciBmb3JtYXQgLSBhcHBsaWVzIHRvIGFsbCBIVFQgb3B0aW9uIFRMVnMgLS0tKi8KKworZW51bSBIVFRfT1BUSU9OX1RMVl9UQUdTIHsKKwlIVFRfT1BUSU9OX1RMVl9UQUdfUkVTRVJWRUQwID0gMHgwLAorCUhUVF9PUFRJT05fVExWX1RBR19MTF9CVVNfQUREUl9TSVpFID0gMHgxLAorCUhUVF9PUFRJT05fVExWX1RBR19ITF9TVVBQUkVTU19UWF9DT01QTF9JTkQgPSAweDIsCisJSFRUX09QVElPTl9UTFZfVEFHX01BWF9UWF9RVUVVRV9HUk9VUFMgPSAweDMsCisJSFRUX09QVElPTl9UTFZfVEFHX1NVUFBPUlRfVFhfTVNEVV9ERVNDX0VYVCA9IDB4NCwKK307CisKK1BSRVBBQ0sgc3RydWN0IGh0dF9vcHRpb25fdGx2X2hlYWRlcl90IHsKKwlBX1VJTlQ4IHRhZzsKKwlBX1VJTlQ4IGxlbmd0aDsKK30gUE9TVFBBQ0s7CisKKyNkZWZpbmUgSFRUX09QVElPTl9UTFZfVEFHX00gICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhUVF9PUFRJT05fVExWX1RBR19TICAgICAgMAorI2RlZmluZSBIVFRfT1BUSU9OX1RMVl9MRU5HVEhfTSAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSFRUX09QVElPTl9UTFZfTEVOR1RIX1MgICA4CisvKgorICogdmFsdWUwIC0gMTYgYml0IHZhbHVlIGZpZWxkIHN0b3JlZCBpbiB3b3JkMAorICogVGhlIFRMVidzIHZhbHVlIGZpZWxkIG1heSBiZSBsb25nZXIgdGhhbiAyIGJ5dGVzLCBpbiB3aGljaCBjYXNlCisgKiB0aGUgcmVtYWluZGVyIG9mIHRoZSB2YWx1ZSBpcyBzdG9yZWQgaW4gd29yZDEsIHdvcmQyLCBldGMuCisgKi8KKyNkZWZpbmUgSFRUX09QVElPTl9UTFZfVkFMVUUwX00gICAweGZmZmYwMDAwCisjZGVmaW5lIEhUVF9PUFRJT05fVExWX1ZBTFVFMF9TICAgMTYKKworI2RlZmluZSBIVFRfT1BUSU9OX1RMVl9UQUdfU0VUKHdvcmQsIHRhZykJCQlcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9PUFRJT05fVExWX1RBRywgdGFnKTsJXAorCQkod29yZCkgfD0gKCh0YWcpIDw8IEhUVF9PUFRJT05fVExWX1RBR19TKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9PUFRJT05fVExWX1RBR19HRVQod29yZCkJCQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9PUFRJT05fVExWX1RBR19NKSA+PiBIVFRfT1BUSU9OX1RMVl9UQUdfUykKKworI2RlZmluZSBIVFRfT1BUSU9OX1RMVl9MRU5HVEhfU0VUKHdvcmQsIHRhZykJCQlcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9PUFRJT05fVExWX0xFTkdUSCwgdGFnKTsJXAorCQkod29yZCkgfD0gKCh0YWcpIDw8IEhUVF9PUFRJT05fVExWX0xFTkdUSF9TKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9PUFRJT05fVExWX0xFTkdUSF9HRVQod29yZCkJCQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9PUFRJT05fVExWX0xFTkdUSF9NKSA+PiBIVFRfT1BUSU9OX1RMVl9MRU5HVEhfUykKKworI2RlZmluZSBIVFRfT1BUSU9OX1RMVl9WQUxVRTBfU0VUKHdvcmQsIHRhZykJCQlcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9PUFRJT05fVExWX1ZBTFVFMCwgdGFnKTsJXAorCQkod29yZCkgfD0gKCh0YWcpIDw8IEhUVF9PUFRJT05fVExWX1ZBTFVFMF9TKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9PUFRJT05fVExWX1ZBTFVFMF9HRVQod29yZCkJCQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9PUFRJT05fVExWX1ZBTFVFMF9NKSA+PiBIVFRfT1BUSU9OX1RMVl9WQUxVRTBfUykKKworLyotLS0gZm9ybWF0IG9mIHNwZWNpZmljIEhUVCBvcHRpb24gVExWcyAtLS0qLworCisvKgorICogSFRUIG9wdGlvbiBUTFYgZm9yIHNwZWNpZnlpbmcgTEwgYnVzIGFkZHJlc3Mgc2l6ZQorICogU29tZSBjaGlwcyByZXF1aXJlIGJ1cyBhZGRyZXNzZXMgdXNlZCBieSB0aGUgdGFyZ2V0IHRvIGFjY2VzcyBidWZmZXJzCisgKiB3aXRoaW4gdGhlIGhvc3QncyBtZW1vcnkgdG8gYmUgMzIgYml0czsgb3RoZXJzIHJlcXVpcmUgYnVzIGFkZHJlc3NlcworICogdXNlZCBieSB0aGUgdGFyZ2V0IHRvIGFjY2VzcyBidWZmZXJzIHdpdGhpbiB0aGUgaG9zdCdzIG1lbW9yeSB0byBiZQorICogNjQgYml0cy4KKyAqIFRoZSBMTF9CVVNfQUREUl9TSVpFIFRMViBjYW4gYmUgc2VudCBmcm9tIHRoZSB0YXJnZXQgdG8gdGhlIGhvc3QgYXMKKyAqIGEgc3VmZml4IHRvIHRoZSBWRVJTSU9OX0NPTkYgbWVzc2FnZSB0byBzcGVjaWZ5IHdoaWNoIGJ1cyBhZGRyZXNzIGZvcm1hdAorICogdGhlIHRhcmdldCByZXF1aXJlcy4KKyAqIElmIHRoaXMgTExfQlVTX0FERFJfU0laRSBUTFYgaXMgbm90IHNlbnQgYnkgdGhlIHRhcmdldCwgdGhlIGhvc3Qgc2hvdWxkCisgKiBkZWZhdWx0IHRvIHByb3ZpZGluZyBidXMgYWRkcmVzc2VzIHRvIHRoZSB0YXJnZXQgaW4gMzItYml0IGZvcm1hdC4KKyAqLworZW51bSBIVFRfT1BUSU9OX1RMVl9MTF9CVVNfQUREUl9TSVpFX1ZBTFVFUyB7CisJSFRUX09QVElPTl9UTFZfTExfQlVTX0FERFJfU0laRTMyID0gMHgwLAorCUhUVF9PUFRJT05fVExWX0xMX0JVU19BRERSX1NJWkU2NCA9IDB4MSwKK307CitQUkVQQUNLIHN0cnVjdCBodHRfb3B0aW9uX3Rsdl9sbF9idXNfYWRkcl9zaXplX3QgeworCXN0cnVjdCBodHRfb3B0aW9uX3Rsdl9oZWFkZXJfdCBoZHI7CisJQV9VSU5UMTYgbGxfYnVzX2FkZHJfc2l6ZTsJLyogTExfQlVTX0FERFJfU0laRV9WQUxVRVMgZW51bSAqLworfSBQT1NUUEFDSzsKKworLyoKKyAqIEhUVCBvcHRpb24gVExWIGZvciBzcGVjaWZ5aW5nIHdoZXRoZXIgSEwgc3lzdGVtcyBzaG91bGQgaW5kaWNhdGUKKyAqIG92ZXItdGhlLWFpciB0eCBjb21wbGV0aW9uIGZvciBpbmRpdmlkdWFsIGZyYW1lcywgb3Igc2hvdWxkIGluc3RlYWQKKyAqIHNlbmQgYSBidWxrIFRYX0NSRURJVF9VUERBVEVfSU5EIGV4Y2VwdCB3aGVuIHRoZSBob3N0IGV4cGxpY2l0bHkKKyAqIHJlcXVlc3RzIGFuIE9UQSB0eCBjb21wbGV0aW9uIGZvciBhIHBhcnRpY3VsYXIgdHggZnJhbWUuCisgKiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhcHBseSB0byBMTCBzeXN0ZW1zLCB3aGVyZSB0aGUgVFhfQ09NUExfSU5ECisgKiBpcyBtYW5kYXRvcnkuCisgKiBUaGlzIG9wdGlvbiBpcyBwcmltYXJpbHkgaW50ZW5kZWQgZm9yIEhMIHN5c3RlbXMgaW4gd2hpY2ggdGhlIHR4IGZyYW1lCisgKiBkb3dubG9hZHMgb3ZlciB0aGUgaG9zdCAtLT4gdGFyZ2V0IGJ1cyBhcmUgYXMgc2xvdyBhcyBvciBzbG93ZXIgdGhhbgorICogdGhlIHRyYW5zbWlzc2lvbnMgb3ZlciB0aGUgV0xBTiBQSFkuICBGb3IgY2FzZXMgd2hlcmUgdGhlIGJ1cyBpcyBmYXN0ZXIKKyAqIHRoYW4gdGhlIFdMQU4gUEhZLCB0aGUgdGFyZ2V0IHdpbGwgdHJhbnNtaXQgcmVsYXRpdmVseSBsYXJnZSBBLU1QRFVzLAorICogYW5kIGNvbnNxdWVudGx5IHdpbGwgc2VuZCBvbmUgVFhfQ09NUExfSU5EIG1lc3NhZ2UgdGhhdCBjb3ZlcnMgc2V2ZXJhbAorICogdHggZnJhbWVzLiAgRm9yIGNhc2VzIHdoZXJlIHRoZSBXTEFOIFBIWSBpcyBmYXN0ZXIgdGhhbiB0aGUgYnVzLAorICogdGhlIHRhcmdldCB3aWxsIGVuZCB1cCB0cmFuc21pdHRpbmcgdmVyeSBzaG9ydCBBLU1QRFVzLCBhbmQgY29uc2VxdWVudGx5CisgKiBzZW5kaW5nIG1hbnkgVFhfQ09NUExfSU5EIG1lc3NhZ2VzLCB3aGljaCBlYWNoIGNvdmVyIGEgdmVyeSBzbWFsbCBudW1iZXIKKyAqIG9mIHR4IGZyYW1lcy4KKyAqIFRoZSBITF9TVVBQUkVTU19UWF9DT01QTF9JTkQgVExWIGNhbiBiZSBzZW50IGJ5IHRoZSBob3N0IHRvIHRoZSB0YXJnZXQgYXMKKyAqIGEgc3VmZml4IHRvIHRoZSBWRVJTSU9OX1JFUSBtZXNzYWdlIHRvIHJlcXVlc3Qgd2hldGhlciB0aGUgaG9zdCBkZXNpcmVzIHRvCisgKiB1c2UgVFhfQ1JFRElUX1VQREFURV9JTkQgcmF0aGVyIHRoYW4gVFhfQ09NUExfSU5ELiAgVGhlIHRhcmdldCBjYW4gdGhlbgorICogc2VuZCBhIEhUVF9TVVBQUkVTU19UWF9DT01QTF9JTkQgVExWIHRvIHRoZSBob3N0IGFzIGEgc3VmZml4IHRvIHRoZQorICogVkVSU0lPTl9DT05GIG1lc3NhZ2UgdG8gY29uZmlybSB3aGV0aGVyIFRYX0NSRURJVF9VUERBVEVfSU5EIHdpbGwgYmUgdXNlZAorICogcmF0aGVyIHRoYW4gVFhfQ09NUExfSU5ELiAgVFhfQ1JFRElUX1VQREFURV9JTkQgc2hhbGwgb25seSBiZSB1c2VkIGlmIHRoZQorICogaG9zdCBzZW5kcyBhIEhMX1NVUFBSRVNTX1RYX0NPTVBMX0lORCBUTFYgcmVxdWVzdGluZyB1c2Ugb2YKKyAqIFRYX0NSRURJVF9VUERBVEVfSU5ELCBhbmQgdGhlIHRhcmdldCBzZW5kcyBhIEhMX1NVUFBSRVNTX1RYX0NPTVBMRV9JTkQgVExWCisgKiBiYWNrIHRvIHRoZSBob3N0IGNvbmZpcm1pbmcgdXNlIG9mIFRYX0NSRURJVF9VUERBVEVfSU5ELgorICogTGFjayBvZiBhIEhMX1NVUFBSRVNTX1RYX0NPTVBMX0lORCBUTFYgZnJvbSBlaXRoZXIgaG9zdCAtLT4gdGFyZ2V0IG9yCisgKiB0YXJnZXQgLS0+IGhvc3QgaXMgZXF1aXZhbGVudCB0byBhIEhMX1NVUFBSRVNTX1RYX0NPTVBMX0lORCB0aGF0CisgKiBleHBsaWNpdGx5IHNwZWNpZmllcyBITF9BTExPV19UWF9DT01QTF9JTkQgaW4gdGhlIHZhbHVlIHBheWxvYWQgb2YgdGhlCisgKiBUTFYuCisgKi8KK2VudW0gSFRUX09QVElPTl9UTFZfSExfU1VQUFJFU1NfVFhfQ09NUExfSU5EX1ZBTFVFUyB7CisJSFRUX09QVElPTl9UTFZfSExfQUxMT1dfVFhfQ09NUExfSU5EID0gMHgwLAorCUhUVF9PUFRJT05fVExWX0hMX1NVUFBSRVNTX1RYX0NPTVBMX0lORCA9IDB4MSwKK307CitQUkVQQUNLIHN0cnVjdCBodHRfb3B0aW9uX3Rsdl9obF9zdXBwcmVzc190eF9jb21wbF9pbmRfdCB7CisJc3RydWN0IGh0dF9vcHRpb25fdGx2X2hlYWRlcl90IGhkcjsKKwlBX1VJTlQxNiBobF9zdXBwcmVzc190eF9jb21wbF9pbmQ7LypITF9TVVBQUkVTU19UWF9DT01QTF9JTkQgZW51bSovCit9IFBPU1RQQUNLOworCisvKgorICogSFRUIG9wdGlvbiBUTFYgZm9yIHNwZWNpZnlpbmcgaG93IG1hbnkgdHggcXVldWUgZ3JvdXBzIHRoZSB0YXJnZXQKKyAqIG1heSBlc3RhYmxpc2guCisgKiBUaGlzIFRMViBzcGVjaWZpZXMgdGhlIG1heGltdW0gdmFsdWUgdGhlIHRhcmdldCBtYXkgc2VuZCBpbiB0aGUKKyAqIHR4cV9ncm91cF9pZCBmaWVsZCBvZiBhbnkgVFhRX0dST1VQIGluZm9ybWF0aW9uIGVsZW1lbnRzIHNlbnQgYnkKKyAqIHRoZSB0YXJnZXQgdG8gdGhlIGhvc3QuICBUaGlzIGFsbG93cyB0aGUgaG9zdCB0byBwcmUtYWxsb2NhdGUgYW4KKyAqIGFwcHJvcHJpYXRlIG51bWJlciBvZiB0eCBxdWV1ZSBncm91cCBzdHJ1Y3RzLgorICoKKyAqIFRoZSBNQVhfVFhfUVVFVUVfR1JPVVBTX1RMViBjYW4gYmUgc2VudCBmcm9tIHRoZSBob3N0IHRvIHRoZSB0YXJnZXQgYXMKKyAqIGEgc3VmZml4IHRvIHRoZSBWRVJTSU9OX1JFUSBtZXNzYWdlIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgaG9zdCBzdXBwb3J0cworICogdHggcXVldWUgZ3JvdXBzIGF0IGFsbCwgYW5kIGlmIHNvIGlmIHRoZXJlIGlzIGFueSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mCisgKiB0eCBxdWV1ZSBncm91cHMgdGhhdCB0aGUgaG9zdCBzdXBwb3J0cy4KKyAqIFRoZSBNQVhfVFhfUVVFVUVfR1JPVVBTIFRMViBjYW4gYmUgc2VudCBmcm9tIHRoZSB0YXJnZXQgdG8gdGhlIGhvc3QgYXMKKyAqIGEgc3VmZml4IHRvIHRoZSBWRVJTSU9OX0NPTkYgbWVzc2FnZS4gIElmIHRoZSBob3N0IGhhcyBzcGVjaWZpZWQgaW4gdGhlCisgKiBWRVJfUkVRIG1lc3NhZ2UgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHR4IHF1ZXVlIGdyb3VwcyB0aGUgaG9zdCBjYW4KKyAqIHN1cHBydCwgdGhlIHRhcmdldCBzaGFsbCBsaW1pdCBpdHMgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbWF4aW11bSB0eCBncm91cHMKKyAqIHRvIGJlIG5vIGxhcmdlciB0aGFuIHRoaXMgaG9zdC1zcGVjaWZpZWQgbGltaXQuCisgKgorICogSWYgdGhlIHRhcmdldCBkb2VzIG5vdCBwcm92aWRlIGEgTUFYX1RYX1FVRVVFX0dST1VQUyBUTFYsIHRoZW4gdGhlIGhvc3QKKyAqIHNoYWxsIHByZWFsbG9jYXRlIDQgdHggcXVldWUgZ3JvdXAgc3RydWN0cywgYW5kIHRoZSB0YXJnZXQgc2hhbGwgbm90CisgKiBzcGVjaWZ5IGEgdHhxX2dyb3VwX2lkIGxhcmdlciB0aGFuIDMuCisgKi8KK2VudW0gSFRUX09QVElPTl9UTFZfTUFYX1RYX1FVRVVFX0dST1VQU19WQUxVRVMgeworCUhUVF9PUFRJT05fVExWX1RYX1FVRVVFX0dST1VQU19VTlNVUFBPUlRFRCA9IDAsCisJLyoKKwkgKiB2YWx1ZXMgMSB0aHJvdWdoIE4gc3BlY2lmeSB0aGUgbWF4IG51bWJlciBvZiB0eCBxdWV1ZSBncm91cHMKKwkgKiB0aGUgc2VuZGVyIHN1cHBvcnRzCisJICovCisJSFRUX09QVElPTl9UTFZfVFhfUVVFVUVfR1JPVVBTX1VOTElNSVRFRCA9IDB4ZmZmZiwKK307CisvKiBURU1QT1JBUlkgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgYWxpYXMgZm9yIGEgdHlwbyBmaXggLQorICogVGhlIGh0dF9vcHRpb25fdGx2X21hY190eF9xdWV1ZV9ncm91cHNfdCB0eXBvIGhhcyBiZWVuIGNvcnJlY3RlZAorICogdG8gIGh0dF9vcHRpb25fdGx2X21heF90eF9xdWV1ZV9ncm91cHNfdCwgYnV0IGFuIGFsaWFzIGlzIHByb3ZpZGVkCisgKiB0byBzdXBwb3J0IHRoZSBvbGQgbmFtZSAod2l0aCB0aGUgdHlwbykgdW50aWwgYWxsIHJlZmVyZW5jZXMgdG8gdGhlCisgKiBvbGQgbmFtZSBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IG5hbWUuCisgKi8KKyNkZWZpbmUgaHR0X29wdGlvbl90bHZfbWFjX3R4X3F1ZXVlX2dyb3Vwc190CVwKKwlodHRfb3B0aW9uX3Rsdl9tYXhfdHhfcXVldWVfZ3JvdXBzX3QKK1BSRVBBQ0sgc3RydWN0IGh0dF9vcHRpb25fdGx2X21heF90eF9xdWV1ZV9ncm91cHNfdCB7CisJc3RydWN0IGh0dF9vcHRpb25fdGx2X2hlYWRlcl90IGhkcjsKKwlBX1VJTlQxNiBtYXhfdHhfcXVldWVfZ3JvdXBzOwkvKiBtYXggdHhxX2dyb3VwX2lkICsgMSAqLworfSBQT1NUUEFDSzsKKworLyoKKyAqIEhUVCBvcHRpb24gVExWIGZvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBzdXBwb3J0cyBhbiBleHRlbmRlZAorICogdmVyc2lvbiBvZiB0aGUgSFRUIHR4IGRlc2NyaXB0b3IuICBJZiB0aGUgdGFyZ2V0IHByb3ZpZGVzIHRoaXMgVExWCisgKiBhbmQgc3BlY2lmaWVzIGluIHRoZSBUTFYgdGhhdCB0aGUgdGFyZ2V0IHN1cHBvcnRzIGFuIGV4dGVuZGVkIHZlcnNpb24KKyAqIG9mIHRoZSBIVFQgdHggZGVzY3JpcHRvciwgdGhlIHRhcmdldCBtdXN0IGNoZWNrIHRoZSAiZXh0ZW5zaW9uIiBiaXQgaW4KKyAqIHRoZSBIVFQgdHggZGVzY3JpcHRvciwgYW5kIGlmIHRoZSBleHRlbnNpb24gYml0IGlzIHNldCwgdG8gZXhwZWN0IGEKKyAqIEhUVCB0eCBNU0RVIGV4dGVuc2lvbiBkZXNjcmlwdG9yIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgSFRUIHR4IE1TRFUKKyAqIGRlc2NyaXB0b3IuICBGdXJ0aGVybW9yZSwgdGhlIHRhcmdldCBtdXN0IHByb3ZpZGUgcm9vbSBmb3IgdGhlIEhUVAorICogdHggTVNEVSBleHRlbnNpb24gZGVzY3JpcHRvciBpbiB0aGUgdGFyZ2V0J3MgVFhfRlJNIGJ1ZmZlci4KKyAqIFRoaXMgb3B0aW9uIGlzIGludGVuZGVkIGZvciBzeXN0ZW1zIHdoZXJlIHRoZSBob3N0IG5lZWRzIHRvIGV4cGxpY2l0bHkKKyAqIGNvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBwYXJhbWV0ZXJzIHN1Y2ggYXMgdHggcG93ZXIgZm9yIGluZGl2aWR1YWwKKyAqIHR4IGZyYW1lcy4KKyAqIFRoZSBTVVBQT1JUX1RYX01TRFVfREVTQ19FWFQgVExCIGNhbiBiZSBzZW50IGJ5IHRoZSB0YXJnZXQgdG8gdGhlIGhvc3QKKyAqIGFzIGEgc3VmZml4IHRvIHRoZSBWRVJTSU9OX0NPTkYgbWVzc2FnZSB0byBleHBsaWNpdGx5IHNwZWNpZnkgd2hldGhlcgorICogdGhlIHRhcmdldCBzdXBwb3J0cyB0aGUgSFRUIHR4IE1TRFUgZXh0ZW5zaW9uIGRlc2NyaXB0b3IuCisgKiBMYWNrIG9mIGEgU1VQUE9SVF9UWF9NU0RVX0RFU0NfRVhUIGZyb20gdGhlIHRhcmdldCBzaGFsbCBiZSBpbnRlcnByZXRlZAorICogYnkgdGhlIGhvc3QgYXMgbGFjayBvZiB0YXJnZXQgc3VwcG9ydCBmb3IgdGhlIEhUVCB0eCBNU0RVIGV4dGVuc2lvbgorICogZGVzY3JpcHRvcjsgdGhlIGhvc3Qgc2hhbGwgcHJvdmlkZSBIVFQgdHggTVNEVSBleHRlbnNpb24gZGVzY3JpcHRvcnMgaW4KKyAqIHRoZSBIVFRfSDJUIFRYX0ZSTSBtZXNzYWdlcyBvbmx5IGlmIHRoZSB0YXJnZXQgaW5kaWNhdGVzIGl0IHN1cHBvcnRzCisgKiB0aGUgSFRUIHR4IE1TRFUgZXh0ZW5zaW9uIGRlc2NyaXB0b3IuCisgKiBUaGUgaG9zdCBpcyBub3QgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGUgSFRUIHR4IE1TRFUgZXh0ZW5zaW9uIGRlc2NyaXB0b3IKKyAqIGp1c3QgYmVjYXVzZSB0aGUgdGFyZ2V0IHN1cHBvcnRzIGl0OyB0aGUgdGFyZ2V0IG11c3QgY2hlY2sgdGhlCisgKiAiZXh0ZW5zaW9uIiBiaXQgaW4gdGhlIEhUVCB0eCBNU0RVIGRlc2NyaXB0b3IgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4KKyAqIGV4dGVuc2lvbiBkZXNjcmlwdG9yIGlzIHByZXNlbnQuCisgKi8KK2VudW0gSFRUX09QVElPTl9UTFZfU1VQUE9SVF9UWF9NU0RVX0RFU0NfRVhUX1ZBTFVFUyB7CisJSFRUX09QVElPTl9UTFZfVFhfTVNEVV9ERVNDX0VYVF9OT19TVVBQT1JUID0gMHgwLAorCUhUVF9PUFRJT05fVExWX1RYX01TRFVfREVTQ19FWFRfU1VQUE9SVCA9IDB4MSwKK307CitQUkVQQUNLIHN0cnVjdCBodHRfb3B0aW9uX3Rsdl9zdXBwb3J0X3R4X21zZHVfZGVzY19leHRfdCB7CisJc3RydWN0IGh0dF9vcHRpb25fdGx2X2hlYWRlcl90IGhkcjsKKwlBX1VJTlQxNiB0eF9tc2R1X2Rlc2NfZXh0X3N1cHBvcnQ7LypTVVBQT1JUX1RYX01TRFVfREVTQ19FWFQgZW51bSovCit9IFBPU1RQQUNLOworCisKKy8qPT09IGhvc3QgLT4gdGFyZ2V0IG1lc3NhZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworZW51bSBodHRfaDJ0X21zZ190eXBlIHsKKwlIVFRfSDJUX01TR19UWVBFX1ZFUlNJT05fUkVRID0gMHgwLAorCUhUVF9IMlRfTVNHX1RZUEVfVFhfRlJNID0gMHgxLAorCUhUVF9IMlRfTVNHX1RZUEVfUlhfUklOR19DRkcgPSAweDIsCisJSFRUX0gyVF9NU0dfVFlQRV9TVEFUU19SRVEgPSAweDMsCisJSFRUX0gyVF9NU0dfVFlQRV9TWU5DID0gMHg0LAorCUhUVF9IMlRfTVNHX1RZUEVfQUdHUl9DRkcgPSAweDUsCisJSFRUX0gyVF9NU0dfVFlQRV9GUkFHX0RFU0NfQkFOS19DRkcgPSAweDYsCisJREVQUkVDQVRFRF9IVFRfSDJUX01TR19UWVBFX01HTVRfVFggPSAweDcsCS8qIG5vIGxvbmdlciB1c2VkICovCisJSFRUX0gyVF9NU0dfVFlQRV9XRElfSVBBX0NGRyA9IDB4OCwKKwlIVFRfSDJUX01TR19UWVBFX1dESV9JUEFfT1BfUkVRID0gMHg5LAorCUhUVF9IMlRfTVNHX1RZUEVfQUdHUl9DRkdfRVggPSAweGEsCS8qcGVyIHZkZXYgYW1zZHUgc3ViZnJtIGxpbWl0Ki8KKwkvKiBrZWVwIHRoaXMgbGFzdCAqLworCUhUVF9IMlRfTlVNX01TR1MKK307CisKKy8qCisgKiBIVFQgaG9zdCB0byB0YXJnZXQgbWVzc2FnZSB0eXBlIC0KKyAqIHN0b3JlZCBpbiBiaXRzIDc6MCBvZiB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgbWVzc2FnZQorICovCisjZGVmaW5lIEhUVF9IMlRfTVNHX1RZUEVfTSAgICAgIDB4ZmYKKyNkZWZpbmUgSFRUX0gyVF9NU0dfVFlQRV9TICAgICAgMAorCisjZGVmaW5lIEhUVF9IMlRfTVNHX1RZUEVfU0VUKHdvcmQsIG1zZ190eXBlKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0gyVF9NU0dfVFlQRSwgbXNnX3R5cGUpOwlcCisJCSh3b3JkKSB8PSAoKG1zZ190eXBlKSA8PCBIVFRfSDJUX01TR19UWVBFX1MpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX0gyVF9NU0dfVFlQRV9HRVQod29yZCkJCQkJXAorCSgoKHdvcmQpICYgSFRUX0gyVF9NU0dfVFlQRV9NKSA+PiBIVFRfSDJUX01TR19UWVBFX1MpCisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IHZlcnNpb24gbnVtYmVyIHJlcXVlc3QgbWVzc2FnZSBkZWZpbml0aW9uCisgKgorICogICAgIHwzMSAgICAgICAgICAgIDI0fDIzICAgICAgICAgICAgMTZ8MTUgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgICAwfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwgICAgbXNnIHR5cGUgICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIDogICAgICAgICAgICAgICAgICAgIG9wdGlvbiByZXF1ZXN0IFRMViAob3B0aW9uYWwpICAgICAgICAgICAgICAgICAgfAorICogICAgIDouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uOgorICoKKyAqIFRoZSBWRVJfUkVRIG1lc3NhZ2UgbWF5IGNvbnNpc3Qgb2YgYSBzaW5nbGUgNC1ieXRlIHdvcmQsIG9yIG1heSBiZQorICogZXh0ZW5kZWQgd2l0aCBUTFZzIHRoYXQgc3BlY2lmeSB3aGljaCBIVFQgb3B0aW9ucyB0aGUgaG9zdCBpcyByZXF1ZXN0aW5nCisgKiBmcm9tIHRoZSB0YXJnZXQuCisgKiBUaGUgZm9sbG93aW5nIG9wdGlvbiBUTFZzIG1heSBiZSBhcHBlbmRlZCB0byB0aGUgVkVSX1JFUSBtZXNzYWdlOgorICogICAtIEhMX1NVUFBSRVNTX1RYX0NPTVBMX0lORAorICogICAtIEhMX01BWF9UWF9RVUVVRV9HUk9VUFMKKyAqIFRoZXNlIFRMVnMgbWF5IGFwcGVhciBpbiBhbiBhcmJpdHJhcnkgb3JkZXIuICBBbnkgbnVtYmVyIG9mIHRoZXNlIFRMVnMKKyAqIG1heSBiZSBhcHBlbmRlZCB0byB0aGUgVkVSX1JFUSBtZXNzYWdlIChidXQgb25seSBvbmUgVExWIG9mIGVhY2ggdHlwZSkuCisgKgorICogSGVhZGVyIGZpZWxkczoKKyAqICAgLSBNU0dfVFlQRQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogaWRlbnRpZmllcyB0aGlzIGFzIGEgdmVyc2lvbiBudW1iZXIgcmVxdWVzdCBtZXNzYWdlCisgKiAgICAgVmFsdWU6IDB4MAorICovCisKKyNkZWZpbmUgSFRUX1ZFUl9SRVFfQllURVMgNAorCisvKiBUQkRYWFg6IGZpZ3VyZSBvdXQgYSByZWFzb25hYmxlIG51bWJlciAqLworI2RlZmluZSBIVFRfSExfREFUQV9TVkNfUElQRV9ERVBUSCAgICAgICAgIDI0CisjZGVmaW5lIEhUVF9MTF9EQVRBX1NWQ19QSVBFX0RFUFRIICAgICAgICAgNjQKKworLyoqCisgKiBAYnJpZWYgSFRUIHR4IE1TRFUgZGVzY3JpcHRvcgorICoKKyAqIEBkZXRhaWxzCisgKiAgVGhlIEhUVCB0eCBNU0RVIGRlc2NyaXB0b3IgaXMgY3JlYXRlZCBieSB0aGUgaG9zdCBIVFQgU1cgZm9yIGVhY2gKKyAqICB0eCBNU0RVLiAgVGhlIEhUVCB0eCBNU0RVIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHRoYXQKKyAqICB0aGUgdGFyZ2V0IGZpcm13YXJlIG5lZWRzIGZvciB0aGUgRlcncyB0eCBwcm9jZXNzaW5nLCBwYXJ0aWN1bGFybHkKKyAqICBmb3IgY3JlYXRpbmcgdGhlIEhXIG1zZHUgZGVzY3JpcHRvci4KKyAqICBUaGUgc2FtZSBIVFQgdHggZGVzY3JpcHRvciBpcyB1c2VkIGZvciBITCBhbmQgTEwgc3lzdGVtcywgdGhvdWdoCisgKiAgYSBmZXcgZmllbGRzIHdpdGhpbiB0aGUgdHggZGVzY3JpcHRvciBhcmUgdXNlZCBvbmx5IGJ5IExMIG9yCisgKiAgb25seSBieSBITC4KKyAqICBUaGUgSFRUIHR4IGRlc2NyaXB0b3IgaXMgZGVmaW5lZCBpbiB0d28gbWFubmVyczogYnkgYSBzdHJ1Y3Qgd2l0aAorICogIGJpdGZpZWxkcywgYW5kIGJ5IGEgc2VyaWVzIG9mIFtkd29yZCBvZmZzZXQsIGJpdCBtYXNrLCBiaXQgc2hpZnRdCisgKiAgZGVmaW5pdGlvbnMuCisgKiAgVGhlIHRhcmdldCBzaG91bGQgdXNlIHRoZSBzdHJ1Y3QgZGVmLCBmb3Igc2ltcGxpY2l0bHkgYW5kIGNsYXJpdHksCisgKiAgYnV0IHRoZSBob3N0IHNoYWxsIHVzZSB0aGUgYml0LW1hc3QgKyBiaXQtc2hpZnQgZGVmcywgdG8gYmUgZW5kaWFuLQorICogIG5ldXRyYWwuICBTcGVjaWZpY2FsbHksIHRoZSBob3N0IHNoYWxsIHVzZSB0aGUgZ2V0L3NldCBtYWNyb3MgYnVpbHQKKyAqICBhcm91bmQgdGhlIG1hc2sgKyBzaGlmdCBkZWZzLgorICovCisjZGVmaW5lIEhUVF9UWF9NU0RVX0RFU0NfUkFXX1NVQlRZUEVfODAyMTFfSERSX1MgICAwCisjZGVmaW5lIEhUVF9UWF9NU0RVX0RFU0NfUkFXX1NVQlRZUEVfODAyMTFfSERSX00gICAweDEKKyNkZWZpbmUgSFRUX1RYX01TRFVfREVTQ19SQVdfU1VCVFlQRV9OT19BR0dSX1MgICAgIDEKKyNkZWZpbmUgSFRUX1RYX01TRFVfREVTQ19SQVdfU1VCVFlQRV9OT19BR0dSX00gICAgIDB4MgorI2RlZmluZSBIVFRfVFhfTVNEVV9ERVNDX1JBV19TVUJUWVBFX05PX0VOQ1JZUFRfUyAgMgorI2RlZmluZSBIVFRfVFhfTVNEVV9ERVNDX1JBV19TVUJUWVBFX05PX0VOQ1JZUFRfTSAgMHg0CisjZGVmaW5lIEhUVF9UWF9NU0RVX0RFU0NfUkFXX1NVQlRZUEVfTk9fQ0xBU1NJRllfUyAzCisjZGVmaW5lIEhUVF9UWF9NU0RVX0RFU0NfUkFXX1NVQlRZUEVfTk9fQ0xBU1NJRllfTSAweDgKKworI2RlZmluZSBIVFRfVFhfVkRFVl9JRF9XT1JEIDAKKyNkZWZpbmUgSFRUX1RYX1ZERVZfSURfTUFTSyAweDNmCisjZGVmaW5lIEhUVF9UWF9WREVWX0lEX1NISUZUIDE2CisKKyNkZWZpbmUgSFRUX1RYX0wzX0NLU1VNX09GRkxPQUQgICAgICAxCisjZGVmaW5lIEhUVF9UWF9MNF9DS1NVTV9PRkZMT0FEICAgICAgMgorCisjZGVmaW5lIEhUVF9UWF9NU0RVX0xFTl9EV09SRCAxCisjZGVmaW5lIEhUVF9UWF9NU0RVX0xFTl9NQVNLIDB4ZmZmZjsKKworLyoKKyAqIEhUVF9WQVJfUEFERFIgbWFjcm9zCisgKiBBbGxvdyBwaHlzaWNhbCAvIGJ1cyBhZGRyZXNzZXMgdG8gYmUgZWl0aGVyIGEgc2luZ2xlIDMyLWJpdCB2YWx1ZSwKKyAqIG9yIGEgNjQtYml0IHZhbHVlLCBzdG9yZWQgYXMgYSBsaXR0bGUtZW5kaWFuIGxvLGhpIHBhaXIgb2YgMzItYml0IHBhcnRzCisgKi8KKworLyoKKyAqIE5vdGUgdGhhdCBpbiB0aGlzIG1hY3JvIEFfVUlOVDMyIGhhcyBiZWVuIGNvbnZlcnRlZCB0bworICogdWludDMyX3Qgb25seSB0byBhZGRyZXNzIGNoZWNrcGF0aCBlcnJvcnMgY2F1c2VkIGJ5IGRlY2xhcmluZworICogdmFyX25hbWUgYXMgQV9VSU5UMzIuCisgKi8KKyNkZWZpbmUgSFRUX1ZBUl9QQUREUjMyKHZhcl9uYW1lKSB1aW50MzJfdCAodmFyX25hbWUpCisKKyNkZWZpbmUgSFRUX1ZBUl9QQUREUjY0X0xFKHZhcl9uYW1lKQkJCVwKKwlzdHJ1Y3QgewkJCQkJXAorCQkvKiBsaXR0bGUtZW5kaWFuOiBsbyBwcmVjZWRlcyBoaSAqLwlcCisJCUFfVUlOVDMyIGxvOwkJCQlcCisJCUFfVUlOVDMyIGhpOwkJCQlcCisJfSB2YXJfbmFtZQorCisvKgorICogVEVNUExBVEVfSFRUX1RYX01TRFVfREVTQ19UOgorICogVGhpcyBtYWNybyBkZWZpbmVzIGEgaHR0X3R4X21zZHVfZGVzY1hYWF90IGluIHdoaWNoIGFueSBwaHlzaWNhbAorICogYWRkcmVzc2VzIGFyZSBzdG9yZWQgaW4gYSBYWFgtYml0IGZpZWxkLgorICogVGhpcyBtYWNybyBpcyB1c2VkIHRvIGRlZmluZSBib3RoIGh0dF90eF9tc2R1X2Rlc2MzMl90IGFuZAorICogaHR0X3R4X21zZHVfZGVzYzY0X3Qgc3RydWN0cy4KKyAqLworI2RlZmluZSBURU1QTEFURV9IVFRfVFhfTVNEVV9ERVNDX1QoX3BhZGRyX2JpdHNfLCBfcGFkZHJfX2ZyYWdzX2Rlc2NfcHRyXykgXAorUFJFUEFDSyBzdHJ1Y3QgaHR0X3R4X21zZHVfZGVzYyAjIyBfcGFkZHJfYml0c18gIyMgX3QJCVwKK3sJCQkJCQkJCVwKKwkvKiBEV09SRCAwOiBmbGFncyBhbmQgbWV0YS1kYXRhICovCQkJXAorCUFfVUlOVDMyCQkJCQkJXAorCQltc2dfdHlwZTo4LCAvKiBIVFRfSDJUX01TR19UWVBFX1RYX0ZSTSAqLwlcCisJCQkJCQkJXAorCS8qIHBrdF9zdWJ0eXBlIC0JCQkJXAorCSAqIERldGFpbGVkIHNwZWNpZmljYXRpb24gb2YgdGhlIHR4IGZyYW1lIGNvbnRlbnRzLCBleHRlbmRpbmcgdGhlIFwKKwkgKiBnZW5lcmFsIHNwZWNpZmljYXRpb24gcHJvdmlkZWQgYnkgcGt0X3R5cGUuCVwKKwkgKiBGSVggVEhJUzogQUREIENPTVBMRVRFIFNQRUNTIEZPUiBUSElTIEZJRUxEUyBWQUxVRSwgZS5nLiBcCisJICpwa3RfdHlwZSAgICB8IHBrdF9zdWJ0eXBlCQlcCisJICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBcCisJICo4MDIuMyAgICAgICB8IGJpdCAwOjMgICAgLSBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAqICAgICAgICAgICAgfCBiaXQgNDogMHgwIC0gQ29weS1FbmdpbmUgQ2xhc3NpZmljYXRpb24gUmVzdWx0cyAgIFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgICAgICAgIG5vdCBhcHBlbmRlZCB0byB0aGUgSFRUIG1lc3NhZ2UgICAgICBcCisJICogICAgICAgICAgICB8ICAgICAgICAweDEgLSBDb3B5LUVuZ2luZSBDbGFzc2lmaWNhdGlvbiBSZXN1bHRzICAgXAorCSAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIEhUVCBtZXNzYWdlIGluIHRoZSAgIFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgICAgICAgIGZvcm1hdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICogICAgICAgICAgICB8ICAgICAgICAgICAgICBbSFRUIHR4IGRlc2MsIGZyYW1lIGhlYWRlciwgICAgICAgICAgXAorCSAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgQ0UgY2xhc3NpZmljYXRpb24gcmVzdWx0c10gICAgICAgICAgIFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgICAgICAgIFRoZSBDRSBjbGFzc2lmaWNhdGlvbiByZXN1bHRzIGJlZ2luICBcCisJICogICAgICAgICAgICB8ICAgICAgICAgICAgICBhdCB0aGUgbmV4dCA0LWJ5dGUgYm91bmRhcnkgYWZ0ZXIgICAgXAorCSAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgdGhlIGZyYW1lIGhlYWRlci4gICAgICAgICAgICAgICAgICAgIFwKKwkgKi0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBcCisJICpFdGgyICAgICAgICB8IGJpdCAwOjMgICAgLSBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAqICAgICAgICAgICAgfCBiaXQgNDogMHgwIC0gQ29weS1FbmdpbmUgQ2xhc3NpZmljYXRpb24gUmVzdWx0cyAgIFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgICAgICAgIG5vdCBhcHBlbmRlZCB0byB0aGUgSFRUIG1lc3NhZ2UgICAgICBcCisJICogICAgICAgICAgICB8ICAgICAgICAweDEgLSBDb3B5LUVuZ2luZSBDbGFzc2lmaWNhdGlvbiBSZXN1bHRzICAgXAorCSAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIEhUVCBtZXNzYWdlLiAgICAgICAgIFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgICAgICAgIFNlZSB0aGUgYWJvdmUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgICBcCisJICogICAgICAgICAgICB8ICAgICAgICAgICAgICBDRSBjbGFzc2lmaWNhdGlvbiByZXN1bHRzIGxvY2F0aW9uLiAgXAorCSAqLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFwKKwkgKm5hdGl2ZSBXaUZpIHwgYml0IDA6MyAgICAtIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICogICAgICAgICAgICB8IGJpdCA0OiAweDAgLSBDb3B5LUVuZ2luZSBDbGFzc2lmaWNhdGlvbiBSZXN1bHRzICAgXAorCSAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgbm90IGFwcGVuZGVkIHRvIHRoZSBIVFQgbWVzc2FnZSAgICAgIFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgIDB4MSAtIENvcHktRW5naW5lIENsYXNzaWZpY2F0aW9uIFJlc3VsdHMgICBcCisJICogICAgICAgICAgICB8ICAgICAgICAgICAgICBhcHBlbmRlZCB0byB0aGUgSFRUIG1lc3NhZ2UuICAgICAgICAgXAorCSAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgU2VlIHRoZSBhYm92ZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSAgIFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgICAgICAgIENFIGNsYXNzaWZpY2F0aW9uIHJlc3VsdHMgbG9jYXRpb24uICBcCisJICotLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgXAorCSAqbWdtdCAgICAgICAgfCAweDAgLSA4MDIuMTEgTUFDIGhlYWRlciBhYnNlbnQJCVwKKwkgKiAgICAgICAgICAgIHwgMHgxIC0gODAyLjExIE1BQyBoZWFkZXIgcHJlc2VudAlcCisJICotLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgXAorCSAqcmF3ICAgICAgICAgfCBiaXQgMDogMHgwIC0gODAyLjExIE1BQyBoZWFkZXIgYWJzZW50IFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgIDB4MSAtIDgwMi4xMSBNQUMgaGVhZGVyIHByZXNlbnQJCSAgIFwKKwkgKiAgICAgICAgICAgIHwgYml0IDE6IDB4MCAtIGFsbG93IGFnZ3JlZ2F0aW9uCQlcCisJICogICAgICAgICAgICB8ICAgICAgICAweDEgLSBkb24ndCBhbGxvdyBhZ2dyZWdhdGlvbiAgIFwKKwkgKiAgICAgICAgICAgIHwgYml0IDI6IDB4MCAtIHBlcmZvcm0gZW5jcnlwdGlvbgkJICAgXAorCSAqICAgICAgICAgICAgfCAgICAgICAgMHgxIC0gZG9uJ3QgcGVyZm9ybSBlbmNyeXB0aW9uCVwKKwkgKiAgICAgICAgICAgIHwgYml0IDM6IDB4MCAtIHBlcmZvcm0gdHggY2xhc3NpZmljYXRpb24gLyBxdWV1aW5nICBcCisJICogICAgICAgICAgICB8ICAgICAgICAweDEgLSBkb24ndCBwZXJmb3JtIHR4IGNsYXNzaWZpY2F0aW9uOyAgICAgXAorCSAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgaW5zZXJ0IHRoZSBmcmFtZSBpbnRvIHRoZSAibWlzYyIgICAgIFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgICAgICAgIHR4IHF1ZXVlCQlcCisJICogICAgICAgICAgICB8IGJpdCA0OiAweDAgLSBDb3B5LUVuZ2luZSBDbGFzc2lmaWNhdGlvbiBSZXN1bHRzICAgXAorCSAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgbm90IGFwcGVuZGVkIHRvIHRoZSBIVFQgbWVzc2FnZSAgICAgIFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgIDB4MSAtIENvcHktRW5naW5lIENsYXNzaWZpY2F0aW9uIFJlc3VsdHMgICBcCisJICogICAgICAgICAgICB8ICAgICAgICAgICAgICBhcHBlbmRlZCB0byB0aGUgSFRUIG1lc3NhZ2UuICAgICAgICAgXAorCSAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgU2VlIHRoZSBhYm92ZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSAgIFwKKwkgKiAgICAgICAgICAgIHwgICAgICAgICAgICAgIENFIGNsYXNzaWZpY2F0aW9uIHJlc3VsdHMgbG9jYXRpb24uICBcCisJICovCQkJCQkJCVwKKwkJcGt0X3N1YnR5cGU6NSwJCQlcCisJCQkJCQkJCVwKKwkvKiBwa3RfdHlwZSAtCQkJCQlcCisJICogR2VuZXJhbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSB0eCBmcmFtZSBjb250ZW50cy4gXAorCSAqIFRoZSBodHRfcGt0X3R5cGUgZW51bSBzaG91bGQgYmUgdXNlZCB0byBzcGVjaWZ5IFwKKwkgKiBhbmQgY2hlY2sgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCQlcCisJICovCQkJCQkJXAorCQlwa3RfdHlwZTozLAkJCQlcCisJCQkJCQkJCVwKKwkvKiB2ZGV2X2lkIC0JCQlcCisJICogSUQgZm9yIHRoZSB2ZGV2IHRoYXQgaXMgc2VuZGluZyB0aGlzIHR4IGZyYW1lLiBcCisJICogRm9yIGNlcnRhaW4gbm9uLXN0YW5kYXJkIHBhY2tldCB0eXBlcywgZS5nLiBwa3RfdHlwZSA9PSByYXcgXAorCSAqIGFuZCAocGt0X3N1YnR5cGUgPj4gMykgPT0gMSwgdGhpcyBmaWVsZCBpcyBub3QgcmVsZXZhbnQvdmFsaWQuIFwKKwkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgcHJpbWFyaWx5IGZvciBkZXRlcm1pbmluZyB3aGVyZSB0byBxdWV1ZSBcCisJICogYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgZnJhbWVzLgkJXAorCSAqLwkJCQkJCVwKKwkJdmRldl9pZDo2LAkJCQkJXAorCS8qIGV4dF90aWQgLQkJCQkJXAorCSAqIFRoZSBleHRlbmRlZCB0cmFmZmljIElELgkJCVwKKwkgKiBJZiB0aGUgVElEIGlzIHVua25vd24sIHRoZSBleHRlbmRlZCBUSUQgaXMgc2V0IHRvIFwKKwkgKiBIVFRfVFhfRVhUX1RJRF9JTlZBTElELgkJCVwKKwkgKiBJZiB0aGUgdHggZnJhbWUgaXMgUW9TIGRhdGEsIHRoZW4gdGhlIGV4dGVuZGVkIFRJRCBoYXMgdGhlIDAtMTUgXAorCSAqIHZhbHVlIG9mIHRoZSBRb1MgVElELgkJCVwKKwkgKiBJZiB0aGUgdHggZnJhbWUgaXMgbm9uLVFvUyBkYXRhLCB0aGVuIHRoZSBleHRlbmRlZCBUSUQgaXMgc2V0IHRvIFwKKwkgKiBIVFRfVFhfRVhUX1RJRF9OT05fUU9TLgkJCVwKKwkgKiBJZiB0aGUgdHggZnJhbWUgaXMgbXVsdGljYXN0IG9yIGJyb2FkY2FzdCwgdGhlbiB0aGUgZXh0ZW5kZWQgVElEIFwKKwkgKiBpcyBzZXQgdG8gSFRUX1RYX0VYVF9USURfTUNBU1RfQkNBU1QuCVwKKwkgKi8JCQkJCQlcCisJCWV4dF90aWQ6NSwJCQkJCVwKKwkJCQkJCQlcCisJLyogcG9zdHBvbmVkIC0JCQkJCVwKKwkgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHR4IGZyYW1lIGhhcyBiZWVuIGRvd25sb2FkZWQgdG8gXAorCSAqIHRoZSB0YXJnZXQgYmVmb3JlIGJ1dCBkaXNjYXJkZWQgYnkgdGhlIHRhcmdldCwgYW5kIG5vdyBpcyBiZWluZyBcCisJICogZG93bmxvYWRlZCBhZ2Fpbjsgb3IgaWYgdGhpcyBpcyBhIG5ldyBmcmFtZSB0aGF0IGlzIGJlaW5nIFwKKwkgKiBkb3dubG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZS4JCVwKKwkgKiBUaGlzIGZsYWcgYWxsb3dzIHRoZSB0YXJnZXQgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IG9yZGVyIGZvciBcCisJICogdHJhbnNtaXR0aW5nIG5ldyB2cy4gb2xkIGZyYW1lcy4JCVwKKwkgKiB2YWx1ZTogMCAtPiBuZXcgZnJhbWUsIDEgLT4gcmUtc2VuZCBvZiBhIHByZXZpb3VzbHkKKwkgKiBzZW50IGZyYW1lIFwKKwkgKiBUaGlzIGZsYWcgb25seSBhcHBsaWVzIHRvIEhMIHN5c3RlbXMsIHNpbmNlIGluIExMIHN5c3RlbXMsIFwKKwkgKiB0aGUgdHggZmxvdyBjb250cm9sIGlzIGhhbmRsZWQgZW50aXJlbHkgd2l0aGluIHRoZSB0YXJnZXQuIFwKKwkgKi8JCQkJCQlcCisJCXBvc3Rwb25lZDoxLAkJCQkJXAorCQkJCQkJCQlcCisJLyogZXh0ZW5zaW9uIC0JCQkJXAorCSAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBhIEhUVCB0eCBNU0RVIGV4dGVuc2lvbiBkZXNjcmlwdG9yXAorCSAqIChodHRfdHhfbXNkdV9kZXNjX2V4dF90KSBmb2xsb3dzIHRoaXMgSFRUIHR4IE1TRFUgZGVzY3JpcHRvci5cCisJICoJCQkJXAorCSAqIDB4MCAtIG5vIGV4dGVuc2lvbiBNU0RVIGRlc2NyaXB0b3IgaXMgcHJlc2VudAlcCisJICogMHgxIC0gYW4gZXh0ZW5zaW9uIE1TRFUgZGVzY3JpcHRvciBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZQlcCisJICogICAgICAgcmVndWxhciBNU0RVIGRlc2NyaXB0b3IJXAorCSAqLwkJCQlcCisJCWV4dGVuc2lvbjoxLAkJCVwKKwkJCQkJCQkJXAorCS8qIGNrc3VtX29mZmxvYWQgLQkJCQlcCisJICogVGhpcyBmbGFnIGluZGljYXRlcyB3aGV0aGVyIGNoZWNrc3VtIG9mZmxvYWQgaXMgZW5hYmxlZCBvciBub3QgXAorCSAqIGZvciB0aGlzIGZyYW1lLiBUYXJnZXQgRlcgdXNlIHRoaXMgZmxhZyB0byB0dXJuIG9uIEhXIGNoZWNrc3VtbWluZyBcCisJICogIDB4MCAtIE5vIGNoZWNrc3VtIG9mZmxvYWQJCQlcCisJICogIDB4MSAtIEwzIGhlYWRlciBjaGVja3N1bSBvbmx5CQlcCisJICogIDB4MiAtIEw0IGNoZWNrc3VtIG9ubHkJCQlcCisJICogIDB4MyAtIEwzIGhlYWRlciBjaGVja3N1bSArIEw0IGNoZWNrc3VtCVwKKwkgKi8JCQkJCQlcCisJCWNrc3VtX29mZmxvYWQ6MiwJCQkJXAorCQkJCQkJCVwKKwkvKiB0eF9jb21wX3JlcSAtCQkJCVwKKwkgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgVHggQ29tcGxldGlvbglcCisJICogZnJvbSBmdyBpcyByZXF1aXJlZCBvciBub3QuCQkJXAorCSAqIFRoaXMgIGZsYWcgaXMgb25seSByZWxldmFudCBpZiB0eCBjb21wbGV0aW9uIGlzIG5vdCBcCisJICogdW5pdmVyc2FsbHkgZW5hYmxlZC4JCQkJXAorCSAqIEZvciBhbGwgTEwgc3lzdGVtcywgdHggY29tcGxldGlvbiBpcyBtYW5kYXRvcnksIFwKKwkgKiBzbyB0aGlzIGZsYWcgd2lsbCBiZSBpcnJlbGV2YW50LgkJXAorCSAqIEZvciBITCBzeXN0ZW1zIHR4IGNvbXBsZXRpb24gaXMgb3B0aW9uYWwsIGJ1dCBITCBzeXN0ZW1zIGluIHdoaWNoIFwKKwkgKiB0aGUgYnVzIHRocm91Z2hwdXQgZXhjZWVkcyB0aGUgV0xBTiB0aHJvdWdocHV0IHdpbGwgXAorCSAqIHByb2JhYmx5IHdhbnQgdG8gYWx3YXlzIHVzZSB0eCBjb21wbGV0aW9uLCBhbmQgdGh1cyBcCisJICogd291bGQgbm90IGNoZWNrIHRoaXMgZmxhZy4JCQlcCisJICogVGhpcyBmbGFnIGlzIHJlcXVpcmVkIHdoZW4gdHggY29tcGxldGlvbnMgYXJlIG5vdCB1c2VkIHVuaXZlcnNhbGx5LCBcCisJICogYnV0IGFyZSBzdGlsbCByZXF1aXJlZCBmb3IgY2VydGFpbiB0eCBmcmFtZXMgZm9yIHdoaWNoIFwKKwkgKiBhbiBPVEEgZGVsaXZlcnkgYWNrbm93bGVkZ21lbnQgaXMgbmVlZGVkIGJ5IHRoZSBob3N0LiBcCisJICogSW4gcHJhY3RpY2UsIHRoaXMgd291bGQgYmUgZm9yIEhMIHN5c3RlbXMgaW4gd2hpY2ggdGhlIFwKKwkgKiBidXMgdGhyb3VnaHB1dCBpcyBsZXNzIHRoYW4gdGhlIFdMQU4gdGhyb3VnaHB1dC4gXAorCSAqCQkJCQkJXAorCSAqIDB4MCAtIFR4IENvbXBsZXRpb24gSW5kaWNhdGlvbiBmcm9tIEZ3IG5vdCByZXF1aXJlZCBcCisJICogMHgxIC0gVHggQ29tcGxldGlvbiBJbmRpY2F0aW9uIGZyb20gRncgaXMgcmVxdWlyZWQgXAorCSAqLwkJCQkJCVwKKwkJdHhfY29tcGxfcmVxOjE7CQkJCVwKKwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkvKiBEV09SRCAxOiBNU0RVIGxlbmd0aCBhbmQgSUQgKi8JCQlcCisJQV9VSU5UMzIJCQkJCQlcCisJCWxlbjoxNiwgLyogTVNEVSBsZW5ndGgsIGluIGJ5dGVzICovCQlcCisJCWlkOjE2OyAvKiBNU0RVIElEIHVzZWQgdG8gaWRlbnRpZnkgdGhlIE1TRFUgdG8gdGhlIGhvc3QsIFwKKwkJCSAgKiBhbmQgdGhpcyBpZCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBmcmFnbWVudGF0aW9uIFwKKwkJCSAgKiBkZXNjcmlwdG9yIHBvaW50ZXIgaW5zaWRlIHRoZSB0YXJnZXQgYmFzZWQgb24gXAorCQkJICAqIHRoZSBiYXNlIGFkZHJlc3MsIGNvbmZpZ3VyZWQgaW5zaWRlIHRoZSB0YXJnZXQuIFwKKwkJCSAgKi8JCQkJCVwKKwkJCQkJCQkJXAorCS8qIERXT1JEIDIgKG9yIDItMyk6IGZyYWdtZW50YXRpb24gZGVzY3JpcHRvciBidXMgYWRkcmVzcyAqLyBcCisJLyogZnJhZ3NfZGVzY19wdHIgLQkJCQkJXAorCSAqIFRoZSBmcmFnbWVudGF0aW9uIGRlc2NyaXB0b3IgcG9pbnRlciB0ZWxscyB0aGUgSFcncyBNQUMgRE1BIFwKKwkgKiB3aGVyZSB0aGUgdHggZnJhbWUncyBmcmFnbWVudHMgcmVzaWRlIGluIG1lbW9yeS4JXAorCSAqIFRoaXMgZmllbGQgb25seSBhcHBsaWVzIHRvIExMIHN5c3RlbXMsIHNpbmNlIGluIEhMIHN5c3RlbXMgdGhlIFwKKwkgKiAoZGVnZW5lcmF0ZSBzaW5nbGUtZnJhZ21lbnQpIGZyYWdtZW50YXRpb24gZGVzY3JpcHRvciBpcyBjcmVhdGVkIFwKKwkgKiB3aXRoaW4gdGhlIHRhcmdldC4JCQkJCVwKKwkgKi8JCQkJCQkJXAorCV9wYWRkcl9fZnJhZ3NfZGVzY19wdHJfOwkJCQlcCisJCQkJCQkJCVwKKwkvKiBEV09SRCAzIChvciA0KTogcGVlcmlkLCBjaGFuZnJlcSAqLwkJCVwKKwkvKgkJCQkJCQlcCisJICogUGVlciBJRCA6IFRhcmdldCBjYW4gdXNlIHRoaXMgdmFsdWUgdG8ga25vdyB3aGljaCBwZWVyLWlkIHBhY2tldCBcCisJICogICAgICAgICAgIGRlc3RpbmVkIHRvLgkJCQlcCisJICogICAgICAgICAgIEl0J3MgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWVkIGJ5IGhvc3QgaW4gY2FzZSBvZiBOQVdEUy4gXAorCSAqLwkJCQkJCQlcCisJQV9VSU5UMTYgcGVlcmlkOwkJCQkJXAorCQkJCQkJCQlcCisJLyoJCQkJCQkJXAorCSAqIENoYW5uZWwgZnJlcXVlbmN5OiBUaGlzIGlkZW50aWZpZXMgdGhlIGRlc2lyZWQgY2hhbm5lbCBcCisJICogZnJlcXVlbmN5IChpbiBtaHopIGZvciB0eCBmcmFtZXMuIFRoaXMgaXMgdXNlZCBieSBGVyB0byBoZWxwCVwKKwkgKiBkZXRlcm1pbmUgd2hlbiBpdCBpcyBzYWZlIHRvIHRyYW5zbWl0IG9yIGRyb3AgZnJhbWVzIGZvciBcCisJICogb2ZmLWNoYW5uZWwgb3BlcmF0aW9uLgkJCQlcCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdG8gRlcgdGhhdCB0aGUJXAorCSAqIGNvcnJlc3BvbmRpbmcgVkRFVidzIGhvbWUgY2hhbm5lbCAoaWYgdGhlcmUgaXMgb25lKSBpcyBcCisJICogdGhlIGRlc2lyZWQgY2hhbm5lbCBmcmVxdWVuY3kuCQkJXAorCSAqLwkJCQkJCQlcCisJQV9VSU5UMTYgY2hhbmZyZXE7CQkJCQlcCisJCQkJCQkJCVwKKwkvKiBSZWFzb24gcmVzZXJ2ZWQgaXMgY29tbWVudGVkIGlzIGluY3JlYXNpbmcgdGhlIGh0dAorCSAqIHN0cnVjdHVyZSBzaXplIGxlYWRzIHRvIHNvbWUgd2llcmQgaXNzdWVzLgorCSAqIEFfVUlOVDMyIHJlc2VydmVkX2R3b3JkM19iaXRzMF8zMTsJCQlcCisJICovCQkJCQkJCVwKK30gUE9TVFBBQ0sKKy8qIGRlZmluZSBhIGh0dF90eF9tc2R1X2Rlc2MzMl90IHR5cGUgKi8KK1RFTVBMQVRFX0hUVF9UWF9NU0RVX0RFU0NfVCgzMiwgSFRUX1ZBUl9QQUREUjMyKGZyYWdzX2Rlc2NfcHRyKSk7CisvKiBkZWZpbmUgYSBodHRfdHhfbXNkdV9kZXNjNjRfdCB0eXBlICovCitURU1QTEFURV9IVFRfVFhfTVNEVV9ERVNDX1QoNjQsIEhUVF9WQVJfUEFERFI2NF9MRShmcmFnc19kZXNjX3B0cikpOworLyoKKyAqIE1ha2UgaHR0X3R4X21zZHVfZGVzY190IGJlIGFuIGFsaWFzIGZvciBlaXRoZXIKKyAqIGh0dF90eF9tc2R1X2Rlc2MzMl90IG9yIGh0dF90eF9tc2R1X2Rlc2M2NF90CisgKi8KKyNpZiBIVFRfUEFERFI2NAorI2RlZmluZSBodHRfdHhfbXNkdV9kZXNjX3QgaHR0X3R4X21zZHVfZGVzYzY0X3QKKyNlbHNlCisjZGVmaW5lIGh0dF90eF9tc2R1X2Rlc2NfdCBodHRfdHhfbXNkdV9kZXNjMzJfdAorI2VuZGlmCisKKy8qIGRlY3JpcHRvciBpbmZvcm1hdGlvbiBmb3IgTWFuYWdlbWVudCBmcmFtZSovCisvKgorICogVEhJUyBodHRfbWdtdF90eF9kZXNjX3QgU1RSVUNUIElTIERFUFJFQ0FURUQgLSBET04nVCBVU0UgSVQuCisgKiBCT1RIIE1BTkFHRU1FTlQgQU5EIERBVEEgRlJBTUVTIFNIT1VMRCBVU0UgaHR0X3R4X21zZHVfZGVzY190LgorICovCisjZGVmaW5lIEhUVF9NR01UX0ZSTV9IRFJfRE9XTkxPQURfTEVOICAgIDMyCitleHRlcm4gQV9VSU5UMzIgbWdtdF9oZHJfbGVuOworUFJFUEFDSyBzdHJ1Y3QgaHR0X21nbXRfdHhfZGVzY190IHsKKwlBX1VJTlQzMiBtc2dfdHlwZTsKKyNpZiBIVFRfUEFERFI2NAorCUFfVUlOVDY0IGZyYWdfcGFkZHI7CS8qIERNQWJsZSBhZGRyZXNzIG9mIHRoZSBkYXRhICovCisjZWxzZQorCUFfVUlOVDMyIGZyYWdfcGFkZHI7CS8qIERNQWJsZSBhZGRyZXNzIG9mIHRoZSBkYXRhICovCisjZW5kaWYKKwlBX1VJTlQzMiBkZXNjX2lkOwkvKiByZXR1cm5lZCB0byBob3N0IGR1cmluZyBjb21wbGV0aW9uCisJCQkJCQkgKiB0byBmcmVlIHRoZSBtZW9yeSovCisJQV9VSU5UMzIgbGVuOwkJLyogRnJhZ21lbnQgbGVuZ3RoICovCisJQV9VSU5UMzIgdmRldl9pZDsJLyogdmlydHVhbCBkZXZpY2UgSUQgKi8KKwlBX1VJTlQ4IGhkcltIVFRfTUdNVF9GUk1fSERSX0RPV05MT0FEX0xFTl07CS8qIGZybSBoZWFkZXIgKi8KK30gUE9TVFBBQ0s7CisKK1BSRVBBQ0sgc3RydWN0IGh0dF9tZ210X3R4X2NvbXBsX2luZCB7CisJQV9VSU5UMzIgZGVzY19pZDsKKwlBX1VJTlQzMiBzdGF0dXM7Cit9IFBPU1RQQUNLOworCisvKgorICogVGhpcyBTRFUgaGVhZGVyIHNpemUgY29tZXMgZnJvbSB0aGUgc3VtbWF0aW9uIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgMS4gTWF4IG9mOgorICogICAgIGEuICBOYXRpdmUgV2lGaSBoZWFkZXIsIGZvciBuYXRpdmUgV2lGaSBmcmFtZXM6IDI0IGJ5dGVzCisgKiAgICAgICAgIChmcmFtZSBjb250cm9sLCBkdXJhdGlvbiAvIElELCBhZGRyMSwgYWRkcjIsIGFkZHIzLCBzZXEgY3RybCwgYWRkcjQpCisgKiAgICAgYi4gIDgwMi4xMSBoZWFkZXIsIGZvciByYXcgZnJhbWVzOiAzNiBieXRlcworICogICAgICAgICAoZnJhbWUgY29udHJvbCwgZHVyYXRpb24gLyBJRCwgYWRkcjEsIGFkZHIyLCBhZGRyMywgc2VxIGN0cmwsIGFkZHI0LAorICogICAgICAgICBRb1MgaGVhZGVyLCBIVCBoZWFkZXIpCisgKiAgICAgYy4gIDgwMi4zIGhlYWRlciwgZm9yIGV0aGVybmV0IGZyYW1lczogMTQgYnl0ZXMKKyAqICAgICAgICAgKGRlc3RpbmF0aW9uIGFkZHJlc3MsIHNvdXJjZSBhZGRyZXNzLCBldGhlcnR5cGUgLyBsZW5ndGgpCisgKiAgMi4gTWF4IG9mOgorICogICAgIGEuICBJUHY0IGhlYWRlciwgdXAgdGhyb3VnaCB0aGUgRGlmZlNlcnYgQ29kZSBQb2ludDogMiBieXRlcworICogICAgIGIuICBJUHY2IGhlYWRlciwgdXAgdGhyb3VnaCB0aGUgVHJhZmZpYyBDbGFzczogMiBieXRlcworICogIDMuIDgwMi4xUSBWTEFOIGhlYWRlcjogNCBieXRlcworICogIDQuIExMQy9TTkFQIGhlYWRlcjogOCBieXRlcworICovCisjZGVmaW5lIEhUVF9UWF9IRFJfU0laRV9OQVRJVkVfV0lGSSAzMAorI2RlZmluZSBIVFRfVFhfSERSX1NJWkVfODAyXzExX1JBVyAzNgorI2RlZmluZSBIVFRfVFhfSERSX1NJWkVfRVRIRVJORVQgMTQKKworI2RlZmluZSBIVFRfVFhfSERSX1NJWkVfT1VURVJfSERSX01BWCBIVFRfVFhfSERSX1NJWkVfODAyXzExX1JBVworQV9DT01QSUxFX1RJTUVfQVNTRVJUKGh0dF9lbmNhcF9oZHJfc2l6ZV9tYXhfY2hlY2tfbndpZmksCisJCSAgICAgIEhUVF9UWF9IRFJfU0laRV9PVVRFUl9IRFJfTUFYID49CisJCSAgICAgIEhUVF9UWF9IRFJfU0laRV9OQVRJVkVfV0lGSSk7CitBX0NPTVBJTEVfVElNRV9BU1NFUlQoaHR0X2VuY2FwX2hkcl9zaXplX21heF9jaGVja19lbmV0LAorCQkgICAgICBIVFRfVFhfSERSX1NJWkVfT1VURVJfSERSX01BWCA+PQorCQkgICAgICBIVFRfVFhfSERSX1NJWkVfRVRIRVJORVQpOworCisjZGVmaW5lIEhUVF9ITF9UWF9IRFJfU0laRV9JUCAxNjAwCS8qIGFsc28gaW5jbHVkZSBwYXlsb2FkICovCisjZGVmaW5lIEhUVF9MTF9UWF9IRFJfU0laRV9JUCAxNiAvKnVwIHRvIHRoZSBlbmQgb2YgVURQIGhkciBmb3IgdjQqLworCisjZGVmaW5lIEhUVF9UWF9IRFJfU0laRV84MDJfMVEgNAorI2RlZmluZSBIVFRfVFhfSERSX1NJWkVfTExDX1NOQVAgOAorCisKKyNkZWZpbmUgSFRUX0NPTU1PTl9UWF9GUk1fSERSX0xFTgkJXAorCShIVFRfVFhfSERSX1NJWkVfT1VURVJfSERSX01BWCArCVwKKwkgSFRUX1RYX0hEUl9TSVpFXzgwMl8xUSArCQlcCisJIEhUVF9UWF9IRFJfU0laRV9MTENfU05BUCkKKworI2RlZmluZSBIVFRfSExfVFhfRlJNX0hEUl9MRU4JCQkJCVwKKwkoSFRUX0NPTU1PTl9UWF9GUk1fSERSX0xFTiArIEhUVF9ITF9UWF9IRFJfU0laRV9JUCkKKworI2RlZmluZSBIVFRfTExfVFhfRlJNX0hEUl9MRU4JCQkJCVwKKwkoSFRUX0NPTU1PTl9UWF9GUk1fSERSX0xFTiArIEhUVF9MTF9UWF9IRFJfU0laRV9JUCkKKworI2RlZmluZSBIVFRfVFhfREVTQ19MRU4gIHNpemVvZihzdHJ1Y3QgaHR0X3R4X21zZHVfZGVzY190KQorCisvKiBkd29yZCAwICovCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BLVF9TVUJUWVBFX09GRlNFVF9CWVRFUyAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BLVF9TVUJUWVBFX09GRlNFVF9EV09SRCAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BLVF9TVUJUWVBFX00gICAgICAweDAwMDAxZjAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BLVF9TVUJUWVBFX1MgICAgICA4CisKKyNkZWZpbmUgSFRUX1RYX0RFU0NfTk9fRU5DUllQVF9PRkZTRVRfQllURVMgMAorI2RlZmluZSBIVFRfVFhfREVTQ19OT19FTkNSWVBUX09GRlNFVF9EV09SRCAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX05PX0VOQ1JZUFRfTSAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgSFRUX1RYX0RFU0NfTk9fRU5DUllQVF9TICAgICAgMTAKKworI2RlZmluZSBIVFRfVFhfREVTQ19QS1RfVFlQRV9PRkZTRVRfQllURVMgMAorI2RlZmluZSBIVFRfVFhfREVTQ19QS1RfVFlQRV9PRkZTRVRfRFdPUkQgMAorI2RlZmluZSBIVFRfVFhfREVTQ19QS1RfVFlQRV9NICAgICAgICAgMHgwMDAwZTAwMAorI2RlZmluZSBIVFRfVFhfREVTQ19QS1RfVFlQRV9TICAgICAgICAgMTMKKworI2RlZmluZSBIVFRfVFhfREVTQ19WREVWX0lEX09GRlNFVF9CWVRFUyAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX1ZERVZfSURfT0ZGU0VUX0RXT1JEIDAKKyNkZWZpbmUgSFRUX1RYX0RFU0NfVkRFVl9JRF9NICAgICAgICAgIDB4MDAzZjAwMDAKKyNkZWZpbmUgSFRUX1RYX0RFU0NfVkRFVl9JRF9TICAgICAgICAgIDE2CisKKyNkZWZpbmUgSFRUX1RYX0RFU0NfRVhUX1RJRF9PRkZTRVRfQllURVMgMAorI2RlZmluZSBIVFRfVFhfREVTQ19FWFRfVElEX09GRlNFVF9EV09SRCAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX0VYVF9USURfTSAgICAgICAgICAweDA3YzAwMDAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX0VYVF9USURfUyAgICAgICAgICAyMgorCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BPU1RQT05FRF9PRkZTRVRfQllURVMgMAorI2RlZmluZSBIVFRfVFhfREVTQ19QT1NUUE9ORURfT0ZGU0VUX0RXT1JEIDAKKyNkZWZpbmUgSFRUX1RYX0RFU0NfUE9TVFBPTkVEX00gICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgSFRUX1RYX0RFU0NfUE9TVFBPTkVEX1MgICAgICAgIDI3CisKKyNkZWZpbmUgSFRUX1RYX0RFU0NfQ0tTVU1fT0ZGTE9BRF9PRkZTRVRfQllURVMgMAorI2RlZmluZSBIVFRfVFhfREVTQ19DS1NVTV9PRkZMT0FEX09GRlNFVF9EV09SRCAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX0NLU1VNX09GRkxPQURfTSAweDYwMDAwMDAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX0NLU1VNX09GRkxPQURfUyAyOQorCisjZGVmaW5lIEhUVF9UWF9ERVNDX1RYX0NPTVBfT0ZGU0VUX0JZVEVTIDAKKyNkZWZpbmUgSFRUX1RYX0RFU0NfVFhfQ09NUF9PRkZTRVRfRFdPUkQgMAorI2RlZmluZSBIVFRfVFhfREVTQ19UWF9DT01QX00gMHg4MDAwMDAwMAorI2RlZmluZSBIVFRfVFhfREVTQ19UWF9DT01QX1MgMzEKKworLyogZHdvcmQgMSAqLworI2RlZmluZSBIVFRfVFhfREVTQ19GUk1fTEVOX09GRlNFVF9CWVRFUyA0CisjZGVmaW5lIEhUVF9UWF9ERVNDX0ZSTV9MRU5fT0ZGU0VUX0RXT1JEIDEKKyNkZWZpbmUgSFRUX1RYX0RFU0NfRlJNX0xFTl9NICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFRUX1RYX0RFU0NfRlJNX0xFTl9TICAgICAgICAgIDAKKworI2RlZmluZSBIVFRfVFhfREVTQ19GUk1fSURfT0ZGU0VUX0JZVEVTIDQKKyNkZWZpbmUgSFRUX1RYX0RFU0NfRlJNX0lEX09GRlNFVF9EV09SRCAxCisjZGVmaW5lIEhUVF9UWF9ERVNDX0ZSTV9JRF9NICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUVF9UWF9ERVNDX0ZSTV9JRF9TICAgICAgICAgICAxNgorCisvKiBkd29yZCAyICovCisjZGVmaW5lIEhUVF9UWF9ERVNDX0ZSQUdTX0RFU0NfUEFERFJfT0ZGU0VUX0JZVEVTIDgKKyNkZWZpbmUgSFRUX1RYX0RFU0NfRlJBR1NfREVTQ19QQUREUl9PRkZTRVRfRFdPUkQgMgorLyogZm9yIHN5c3RlbXMgdXNpbmcgNjQtYml0IGZvcm1hdCBmb3IgYnVzIGFkZHJlc3NlcyAqLworI2RlZmluZSBIVFRfVFhfREVTQ19GUkFHU19ERVNDX1BBRERSX0hJX00gMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfVFhfREVTQ19GUkFHU19ERVNDX1BBRERSX0hJX1MgMAorI2RlZmluZSBIVFRfVFhfREVTQ19GUkFHU19ERVNDX1BBRERSX0xPX00gMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfVFhfREVTQ19GUkFHU19ERVNDX1BBRERSX0xPX1MgMAorLyogZm9yIHN5c3RlbXMgdXNpbmcgMzItYml0IGZvcm1hdCBmb3IgYnVzIGFkZHJlc3NlcyAqLworI2RlZmluZSBIVFRfVFhfREVTQ19GUkFHU19ERVNDX1BBRERSX00gICAgMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfVFhfREVTQ19GUkFHU19ERVNDX1BBRERSX1MgICAgMAorCisvKiBkd29yZCAzICovCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BFRVJfSURfT0ZGU0VUX0JZVEVTXzY0IDE2CisjZGVmaW5lIEhUVF9UWF9ERVNDX1BFRVJfSURfT0ZGU0VUX0JZVEVTXzMyIDEyCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BFRVJfSURfT0ZGU0VUX0RXT1JEXzY0CQlcCisJKEhUVF9UWF9ERVNDX1BFRVJfSURfT0ZGU0VUX0JZVEVTXzY0ID4+IDIpCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BFRVJfSURfT0ZGU0VUX0RXT1JEXzMyCQlcCisJKEhUVF9UWF9ERVNDX1BFRVJfSURfT0ZGU0VUX0JZVEVTXzMyID4+IDIpCisKKyNpZiBIVFRfUEFERFI2NAorI2RlZmluZSBIVFRfVFhfREVTQ19QRUVSX0lEX09GRlNFVF9CWVRFUyBIVFRfVFhfREVTQ19QRUVSX0lEX09GRlNFVF9CWVRFU182NAorI2RlZmluZSBIVFRfVFhfREVTQ19QRUVSX0lEX09GRlNFVF9EV09SRCBIVFRfVFhfREVTQ19QRUVSX0lEX09GRlNFVF9EV09SRF82NAorI2Vsc2UKKyNkZWZpbmUgSFRUX1RYX0RFU0NfUEVFUl9JRF9PRkZTRVRfQllURVMgSFRUX1RYX0RFU0NfUEVFUl9JRF9PRkZTRVRfQllURVNfMzIKKyNkZWZpbmUgSFRUX1RYX0RFU0NfUEVFUl9JRF9PRkZTRVRfRFdPUkQgSFRUX1RYX0RFU0NfUEVFUl9JRF9PRkZTRVRfRFdPUkRfMzIKKyNlbmRpZgorCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BFRVJfSURfTSAweDAwMDBmZmZmCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BFRVJfSURfUyAwCisvKgorICogVEVNUE9SQVJZOgorICogVGhlIG9yaWdpbmFsIGRlZmluaXRpb25zIGZvciB0aGUgUEVFUl9JRCBmaWVsZHMgY29udGFpbmVkIHR5cG9zCisgKiAod2l0aCBfREVTQ19QQUREUiBhcHBlbmRlZCB0byB0aGlzIFBFRVJfSUQgZmllbGQgbmFtZSkuCisgKiBSZXRhaW4gZGVwcmVjYXRlZCBvcmlnaW5hbCBuYW1lcyBmb3IgUEVFUl9JRCBmaWVsZHMgdW50aWwgYWxsIGNvZGUgdGhhdAorICogcmVmZXJzIHRvIHRoZW0gaGFzIGJlZW4gdXBkYXRlZC4KKyAqLworI2RlZmluZSBIVFRfVFhfREVTQ19QRUVSSURfREVTQ19QQUREUl9PRkZTRVRfQllURVMJXAorCUhUVF9UWF9ERVNDX1BFRVJfSURfT0ZGU0VUX0JZVEVTCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BFRVJJRF9ERVNDX1BBRERSX09GRlNFVF9EV09SRAlcCisJSFRUX1RYX0RFU0NfUEVFUl9JRF9PRkZTRVRfRFdPUkQKKyNkZWZpbmUgSFRUX1RYX0RFU0NfUEVFUklEX0RFU0NfUEFERFJfTQkJXAorCUhUVF9UWF9ERVNDX1BFRVJfSURfTQorI2RlZmluZSBIVFRfVFhfREVTQ19QRUVSSURfREVTQ19QQUREUl9TCQlcCisJSFRUX1RYX0RFU0NfUEVFUl9JRF9TCisKKyNkZWZpbmUgSFRUX1RYX0RFU0NfQ0hBTl9GUkVRX09GRlNFVF9CWVRFU182NCAxNiAvKiB0byBkd29yZCB3aXRoIGNoYW4gZnJlcSAqLworI2RlZmluZSBIVFRfVFhfREVTQ19DSEFOX0ZSRVFfT0ZGU0VUX0JZVEVTXzMyIDEyIC8qIHRvIGR3b3JkIHdpdGggY2hhbiBmcmVxICovCisjZGVmaW5lIEhUVF9UWF9ERVNDX0NIQU5fRlJFUV9PRkZTRVRfRFdPUkRfNjQJCVwKKwkoSFRUX1RYX0RFU0NfQ0hBTl9GUkVRX09GRlNFVF9CWVRFU182NCA+PiAyKQorI2RlZmluZSBIVFRfVFhfREVTQ19DSEFOX0ZSRVFfT0ZGU0VUX0RXT1JEXzMyCQlcCisJKEhUVF9UWF9ERVNDX0NIQU5fRlJFUV9PRkZTRVRfQllURVNfMzIgPj4gMikKKworI2lmIEhUVF9QQUREUjY0CisjZGVmaW5lIEhUVF9UWF9ERVNDX0NIQU5fRlJFUV9PRkZTRVRfQllURVMgSFRUX1RYX0RFU0NfQ0hBTl9GUkVRX09GRlNFVF9CWVRFU182NAorI2RlZmluZSBIVFRfVFhfREVTQ19DSEFOX0ZSRVFfT0ZGU0VUX0RXT1JEIEhUVF9UWF9ERVNDX0NIQU5fRlJFUV9PRkZTRVRfRFdPUkRfNjQKKyNlbHNlCisjZGVmaW5lIEhUVF9UWF9ERVNDX0NIQU5fRlJFUV9PRkZTRVRfQllURVMgSFRUX1RYX0RFU0NfQ0hBTl9GUkVRX09GRlNFVF9CWVRFU18zMgorI2RlZmluZSBIVFRfVFhfREVTQ19DSEFOX0ZSRVFfT0ZGU0VUX0RXT1JEIEhUVF9UWF9ERVNDX0NIQU5fRlJFUV9PRkZTRVRfRFdPUkRfMzIKKyNlbmRpZgorCisjZGVmaW5lIEhUVF9UWF9ERVNDX0NIQU5fRlJFUV9NIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRUX1RYX0RFU0NfQ0hBTl9GUkVRX1MgMTYKKworI2RlZmluZSBIVFRfVFhfREVTQ19QS1RfU1VCVFlQRV9HRVQoX3ZhcikJCQkJXAorCSgoKF92YXIpICYgSFRUX1RYX0RFU0NfUEtUX1NVQlRZUEVfTSkgPj4gSFRUX1RYX0RFU0NfUEtUX1NVQlRZUEVfUykKKyNkZWZpbmUgSFRUX1RYX0RFU0NfUEtUX1NVQlRZUEVfU0VUKF92YXIsIF92YWwpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9ERVNDX1BLVF9TVUJUWVBFLCBfdmFsKTsJXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX0RFU0NfUEtUX1NVQlRZUEVfUykpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfREVTQ19OT19FTkNSWVBUX0dFVChfdmFyKQkJCQlcCisJKCgoX3ZhcikgJiBIVFRfVFhfREVTQ19OT19FTkNSWVBUX00pID4+IEhUVF9UWF9ERVNDX05PX0VOQ1JZUFRfUykKKyNkZWZpbmUgSFRUX1RYX0RFU0NfTk9fRU5DUllQVF9TRVQoX3ZhciwgX3ZhbCkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX0RFU0NfTk9fRU5DUllQVCwgX3ZhbCk7CVwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9ERVNDX05PX0VOQ1JZUFRfUykpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfREVTQ19QS1RfVFlQRV9HRVQoX3ZhcikJCQkJCVwKKwkoKChfdmFyKSAmIEhUVF9UWF9ERVNDX1BLVF9UWVBFX00pID4+IEhUVF9UWF9ERVNDX1BLVF9UWVBFX1MpCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BLVF9UWVBFX1NFVChfdmFyLCBfdmFsKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX0RFU0NfUEtUX1RZUEUsIF92YWwpOyAgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX0RFU0NfUEtUX1RZUEVfUykpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfREVTQ19WREVWX0lEX0dFVChfdmFyKQkJCQkJXAorCSgoKF92YXIpICYgSFRUX1RYX0RFU0NfVkRFVl9JRF9NKSA+PiBIVFRfVFhfREVTQ19WREVWX0lEX1MpCisjZGVmaW5lIEhUVF9UWF9ERVNDX1ZERVZfSURfU0VUKF92YXIsIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhfREVTQ19WREVWX0lELCBfdmFsKTsJXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX0RFU0NfVkRFVl9JRF9TKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9UWF9ERVNDX0VYVF9USURfR0VUKF92YXIpCQkJCQlcCisJKCgoX3ZhcikgJiBIVFRfVFhfREVTQ19FWFRfVElEX00pID4+IEhUVF9UWF9ERVNDX0VYVF9USURfUykKKyNkZWZpbmUgSFRUX1RYX0RFU0NfRVhUX1RJRF9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9ERVNDX0VYVF9USUQsIF92YWwpOwlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfVFhfREVTQ19FWFRfVElEX1MpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1RYX0RFU0NfUE9TVFBPTkVEX0dFVChfdmFyKQkJCQkJXAorCSgoKF92YXIpICYgSFRUX1RYX0RFU0NfUE9TVFBPTkVEX00pID4+IEhUVF9UWF9ERVNDX1BPU1RQT05FRF9TKQorI2RlZmluZSBIVFRfVFhfREVTQ19QT1NUUE9ORURfU0VUKF92YXIsIF92YWwpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9ERVNDX1BPU1RQT05FRCwgX3ZhbCk7CQlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfVFhfREVTQ19QT1NUUE9ORURfUykpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfREVTQ19GUk1fTEVOX0dFVChfdmFyKQkJCQkJXAorCSgoKF92YXIpICYgSFRUX1RYX0RFU0NfRlJNX0xFTl9NKSA+PiBIVFRfVFhfREVTQ19GUk1fTEVOX1MpCisjZGVmaW5lIEhUVF9UWF9ERVNDX0ZSTV9MRU5fU0VUKF92YXIsIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhfREVTQ19GUk1fTEVOLCBfdmFsKTsJXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX0RFU0NfRlJNX0xFTl9TKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9UWF9ERVNDX0ZSTV9JRF9HRVQoX3ZhcikJCQkJCVwKKwkoKChfdmFyKSAmIEhUVF9UWF9ERVNDX0ZSTV9JRF9NKSA+PiBIVFRfVFhfREVTQ19GUk1fSURfUykKKyNkZWZpbmUgSFRUX1RYX0RFU0NfRlJNX0lEX1NFVChfdmFyLCBfdmFsKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX0RFU0NfRlJNX0lELCBfdmFsKTsJXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX0RFU0NfRlJNX0lEX1MpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1RYX0RFU0NfQ0tTVU1fT0ZGTE9BRF9HRVQoX3ZhcikJCQkJXAorCSgoKF92YXIpICYgSFRUX1RYX0RFU0NfQ0tTVU1fT0ZGTE9BRF9NKSA+PiBIVFRfVFhfREVTQ19DS1NVTV9PRkZMT0FEX1MpCisjZGVmaW5lIEhUVF9UWF9ERVNDX0NLU1VNX09GRkxPQURfU0VUKF92YXIsIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX0RFU0NfQ0tTVU1fT0ZGTE9BRCwgX3ZhbCk7CVwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9ERVNDX0NLU1VNX09GRkxPQURfUykpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfREVTQ19UWF9DT01QX0dFVChfdmFyKQkJCQkJXAorCSgoKF92YXIpICYgSFRUX1RYX0RFU0NfVFhfQ09NUF9NKSA+PiBIVFRfVFhfREVTQ19UWF9DT01QX1MpCisjZGVmaW5lIEhUVF9UWF9ERVNDX1RYX0NPTVBfU0VUKF92YXIsIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhfREVTQ19UWF9DT01QLCBfdmFsKTsJXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX0RFU0NfVFhfQ09NUF9TKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9UWF9ERVNDX1BFRVJfSURfR0VUKF92YXIpCQkJCQlcCisJKCgoX3ZhcikgJiBIVFRfVFhfREVTQ19QRUVSX0lEX00pID4+IEhUVF9UWF9ERVNDX1BFRVJfSURfUykKKyNkZWZpbmUgSFRUX1RYX0RFU0NfUEVFUl9JRF9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9ERVNDX1BFRVJfSUQsIF92YWwpOwlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfVFhfREVTQ19QRUVSX0lEX1MpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1RYX0RFU0NfQ0hBTl9GUkVRX0dFVChfdmFyKQkJCQkJXAorCSgoKF92YXIpICYgSFRUX1RYX0RFU0NfQ0hBTl9GUkVRX00pID4+IEhUVF9UWF9ERVNDX0NIQU5fRlJFUV9TKQorI2RlZmluZSBIVFRfVFhfREVTQ19DSEFOX0ZSRVFfU0VUKF92YXIsIF92YWwpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9ERVNDX0NIQU5fRlJFUSwgX3ZhbCk7CQlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfVFhfREVTQ19DSEFOX0ZSRVFfUykpOwlcCisJfSB3aGlsZSAoMCkKKworCisvKiBlbnVtcyB1c2VkIGluIHRoZSBIVFQgdHggTVNEVSBleHRlbnNpb24gZGVzY3JpcHRvciAqLworZW51bSB7CisJaHR0X3R4X2d1YXJkX2ludGVydmFsX3JlZ3VsYXIgPSAwLAorCWh0dF90eF9ndWFyZF9pbnRlcnZhbF9zaG9ydCA9IDEsCit9OworCitlbnVtIHsKKwlodHRfdHhfcHJlYW1ibGVfdHlwZV9vZmRtID0gMCwKKwlodHRfdHhfcHJlYW1ibGVfdHlwZV9jY2sgPSAxLAorCWh0dF90eF9wcmVhbWJsZV90eXBlX2h0ID0gMiwKKwlodHRfdHhfcHJlYW1ibGVfdHlwZV92aHQgPSAzLAorfTsKKworZW51bSB7CisJaHR0X3R4X2JhbmR3aWR0aF81TUh6ID0gMCwKKwlodHRfdHhfYmFuZHdpZHRoXzEwTUh6ID0gMSwKKwlodHRfdHhfYmFuZHdpZHRoXzIwTUh6ID0gMiwKKwlodHRfdHhfYmFuZHdpZHRoXzQwTUh6ID0gMywKKwlodHRfdHhfYmFuZHdpZHRoXzgwTUh6ID0gNCwKKwlodHRfdHhfYmFuZHdpZHRoXzE2ME1IeiA9IDUsCS8qIGluY2x1ZGVzIDgwKzgwICovCit9OworCisvKioKKyAqIEBicmllZiBIVFQgdHggTVNEVSBleHRlbnNpb24gZGVzY3JpcHRvcgorICogQGRldGFpbHMKKyAqICBJZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIEhUVCB0eCBNU0RVIGV4dGVuc2lvbiBkZXNjcmlwdG9ycywgdGhlIGhvc3QgaGFzCisgKiAgdGhlIG9wdGlvbiBvZiBhcHBlbmRpbmcgdGhlIGZvbGxvd2luZyBzdHJ1Y3QgZm9sbG93aW5nIHRoZSByZWd1bGFyCisgKiAgSFRUIHR4IE1TRFUgZGVzY3JpcHRvciAoYW5kIHNldHRpbmcgdGhlICJleHRlbnNpb24iIGZsYWcgaW4gdGhlIHJlZ3VsYXIKKyAqICBIVFQgdHggTVNEVSBkZXNjcmlwdG9yLCB0byBzaG93IHRoYXQgdGhlIGV4dGVuc2lvbiBkZXNjcmlwdG9yIGlzIHByZXNlbnQpLgorICogIFRoZSBIVFQgdHggTVNEVSBleHRlbnNpb24gZGVzY3JpcHRvcnMgYWxsb3dzIHRoZSBob3N0IHRvIHByb3ZpZGUgZGV0YWlsZWQKKyAqICB0eCBzcGVjcyBmb3IgZWFjaCBmcmFtZS4KKyAqLworUFJFUEFDSyBzdHJ1Y3QgaHR0X3R4X21zZHVfZGVzY19leHRfdCB7CisJLyogRFdPUkQgMDogZmxhZ3MgKi8KKwlBX1VJTlQzMiB2YWxpZF9wd3I6MSwvKiBiaXQgMDppZiBzZXQsIHR4IHB3ciBzcGVjIGlzIHZhbGlkICovCisJdmFsaWRfbWNzX21hc2s6MSwvKiBiaXQgMTppZiBzZXQsIHR4IE1DUyBtYXNrIHNwZWMgaXMgdmFsaWQgKi8KKwl2YWxpZF9uc3NfbWFzazoxLC8qIGJpdCAyOmlmIHNldCwgdHggTnNzIG1hc2sgc3BlYyBpcyB2YWxpZCAqLworCXZhbGlkX2d1YXJkX2ludGVydmFsOjEsLyogYml0IDM6aWYgc2V0LCB0eCBndWFyZCBpbnR2IHNwZWMgaXMgdmFsaWQgKi8KKwl2YWxpZF9wcmVhbWJsZV90eXBlX21hc2s6MSwvKiA0OmlmIHNldCwgdHggcHJlYW1ibGUgbWFzayBpcyB2YWxpZCAqLworCXZhbGlkX2NoYWlubWFzazoxLC8qIGJpdCA1OmlmIHNldCwgdHggY2hhaW5tYXNrIHNwZWMgaXMgdmFsaWQgKi8KKwl2YWxpZF9yZXRyaWVzOjEsLyogYml0IDY6aWYgc2V0LCB0eCByZXRyaWVzIHNwZWMgaXMgdmFsaWQgKi8KKwl2YWxpZF9iYW5kd2lkdGg6MSwvKiBiaXQgNzppZiBzZXQsIHR4IGJhbmR3aWR0aCBzcGVjIGlzIHZhbGlkICovCisJdmFsaWRfZXhwaXJlX3RzZjoxLC8qIGJpdCA4OmlmIHNldCwgdHggZXhwaXJlIFRTRiBzcGVjIGlzIHZhbGlkICovCisJaXNfZHNyYzoxLAkvKiBiaXQgOTppZiBzZXQsIE1TRFUgaXMgYSBEU1JDIGZyYW1lICovCisJcmVzZXJ2ZWQwXzMxXzc6MjI7CS8qIGJpdHMgMzE6MTAgLSB1bnVzZWQsIHNldCB0byAweDAgKi8KKworCS8qIERXT1JEIDE6dHggcG93ZXIsIHR4IHJhdGUsIHR4IEJXICovCisJQV9VSU5UMzIKKwkvKiBwd3IgLQorCSAqIFNwZWNpZnkgd2hhdCBwb3dlciB0aGUgdHggZnJhbWUgbmVlZHMgdG8gYmUgdHJhbnNtaXR0ZWQgYXQuCisJICogVGhlIHBvd2VyIGEgc2lnbmVkICh0d28ncyBjb21wbGVtZW50KSB2YWx1ZSBpcyBpbiB1bml0cyBvZiAwLjUgZEJtLgorCSAqIFRoZSB2YWx1ZSBuZWVkcyB0byBiZSBhcHByb3ByaWF0ZWx5IHNpZ24tZXh0ZW5kZWQgd2hlbiBleHRyYWN0aW5nCisJICogdGhlIHZhbHVlIGZyb20gdGhlIG1lc3NhZ2UgYW5kIHN0b3JpbmcgaXQgaW4gYSB2YXJpYWJsZSB0aGF0IGlzCisJICogbGFyZ2VyIHRoYW4gQV9JTlQ4LiAgKFRoZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1BXUl9HRVQgbWFjcm8KKwkgKiBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdGhpcyBzaWduLWV4dGVuc2lvbi4pCisJICogSWYgdGhlIHRyYW5zbWlzc2lvbiB1c2VzIG11bHRpcGxlIHR4IGNoYWlucywgdGhpcyBwb3dlciBzcGVjIGlzCisJICogdGhlIHRvdGFsIHRyYW5zbWl0IHBvd2VyLCBhc3N1bWluZyBpbmNvaGVyZW50IGNvbWJpbmF0aW9uIG9mCisJICogcGVyLWNoYWluIHBvd2VyIHRvIHByb2R1Y2UgdGhlIHRvdGFsIHBvd2VyLgorCSAqLworCXB3cjo4LAorCS8qIG1jc19tYXNrIC0KKwkgKiBTcGVjaWZ5IHRoZSBhbGxvd2FibGUgdmFsdWVzIGZvciBNQ1MgaW5kZXggKG1vZHVsYXRpb24gYW5kIGNvZGluZykKKwkgKiB0byB1c2UgZm9yIHRyYW5zbWl0dGluZyB0aGUgZnJhbWUuCisJICoKKwkgKiBGb3IgSFQgLyBWSFQgcHJlYW1ibGUgdHlwZXMsIHRoaXMgbWFzayBkaXJlY3RseSBjb3JyZXNwb25kcyB0bworCSAqIHRoZSBIVCBvciBWSFQgTUNTIGluZGljZXMgdGhhdCBhcmUgYWxsb3dlZC4gIEZvciBlYWNoIGJpdCBOIHNldAorCSAqIHdpdGhpbiB0aGUgbWFzaywgTUNTIGluZGV4IE4gaXMgYWxsb3dlZCBmb3IgdHJhbnNtaXR0aW5nIHRoZSBmcmFtZS4KKwkgKiBGb3IgbGVnYWN5IENDSyBhbmQgT0ZETSByYXRlcywgc2VwYXJhdGUgYml0cyBhcmUgcHJvdmlkZWQgZm9yIENDSworCSAqIHJhdGVzIHZlcnN1cyBPRkRNIHJhdGVzLCBzbyB0aGUgaG9zdCBoYXMgdGhlIG9wdGlvbiBvZiBzcGVjaWZ5aW5nCisJICogdGhhdCB0aGUgdGFyZ2V0IG11c3QgdHJhbnNtaXQgdGhlIGZyYW1lIHdpdGggQ0NLIG9yIE9GRE0gcmF0ZXMKKwkgKiAobm90IEhUIG9yIFZIVCksIGJ1dCBsZWF2aW5nIHRoZSBkZWNpc2lvbiB0byB0aGUgdGFyZ2V0IHdoZXRoZXIKKwkgKiB0byB1c2UgQ0NLIG9yIE9GRE0uCisJICoKKwkgKiBGb3IgQ0NLIGFuZCBPRkRNLCB0aGUgYml0cyB3aXRoaW4gdGhpcyBtYXNrIGFyZSBpbnRlcnByZXRlZCBhcworCSAqIGZvbGxvd3M6CisJICogICAgIGJpdCAgMCAtPiBDQ0sgMSBNYnBzIHJhdGUgaXMgYWxsb3dlZAorCSAqICAgICBiaXQgIDEgLT4gQ0NLIDIgTWJwcyByYXRlIGlzIGFsbG93ZWQKKwkgKiAgICAgYml0ICAyIC0+IENDSyA1LjUgTWJwcyByYXRlIGlzIGFsbG93ZWQKKwkgKiAgICAgYml0ICAzIC0+IENDSyAxMSBNYnBzIHJhdGUgaXMgYWxsb3dlZAorCSAqICAgICBiaXQgIDQgLT4gT0ZETSBCUFNLIG1vZHVsYXRpb24sIDEvMiBjb2RpbmcgcmF0ZSBpcyBhbGxvd2VkCisJICogICAgIGJpdCAgNSAtPiBPRkRNIEJQU0sgbW9kdWxhdGlvbiwgMy80IGNvZGluZyByYXRlIGlzIGFsbG93ZWQKKwkgKiAgICAgYml0ICA2IC0+IE9GRE0gUVBTSyBtb2R1bGF0aW9uLCAxLzIgY29kaW5nIHJhdGUgaXMgYWxsb3dlZAorCSAqICAgICBiaXQgIDcgLT4gT0ZETSBRUFNLIG1vZHVsYXRpb24sIDMvNCBjb2RpbmcgcmF0ZSBpcyBhbGxvd2VkCisJICogICAgIGJpdCAgOCAtPiBPRkRNIDE2LVFBTSBtb2R1bGF0aW9uLCAxLzIgY29kaW5nIHJhdGUgaXMgYWxsb3dlZAorCSAqICAgICBiaXQgIDkgLT4gT0ZETSAxNi1RQU0gbW9kdWxhdGlvbiwgMy80IGNvZGluZyByYXRlIGlzIGFsbG93ZWQKKwkgKiAgICAgYml0IDEwIC0+IE9GRE0gNjQtUUFNIG1vZHVsYXRpb24sIDIvMyBjb2RpbmcgcmF0ZSBpcyBhbGxvd2VkCisJICogICAgIGJpdCAxMSAtPiBPRkRNIDY0LVFBTSBtb2R1bGF0aW9uLCAzLzQgY29kaW5nIHJhdGUgaXMgYWxsb3dlZAorCSAqCisJICogVGhlIE1DUyBpbmRleCBzcGVjaWZpY2F0aW9uIG5lZWRzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKKwkgKiBiYW5kd2lkdGggbWFzayBzcGVjaWZpY2F0aW9uLiAgRm9yIGV4YW1wbGUsIGEgTUNTIGluZGV4ID09IDkKKwkgKiBzcGVjaWZpY2F0aW9uIGlzIGluY29uc2lzdGVudCB3aXRoIGEgcHJlYW1ibGUgdHlwZSA9PSBWSFQsCisJICogTnNzID09IDEsIGFuZCBjaGFubmVsIGJhbmR3aWR0aCA9PSAyMCBNSHouCisJICoKKwkgKiBGdXJ0aGVybW9yZSwgdGhlIGhvc3QgaGFzIG9ubHkgYSBsaW1pdGVkIGFiaWxpdHkgdG8gc3BlY2lmeSB0bworCSAqIHRoZSB0YXJnZXQgdG8gc2VsZWN0IGZyb20gSFQgKyBsZWdhY3kgcmF0ZXMsIG9yIFZIVCArIGxlZ2FjeSByYXRlcywKKwkgKiBzaW5jZSB0aGlzIG1jc19tYXNrIGNhbiBzcGVjaWZ5IGVpdGhlciBIVC9WSFQgcmF0ZXMgb3IgbGVnYWN5IHJhdGVzLgorCSAqLworCW1jc19tYXNrOjEyLAorCS8qIG5zc19tYXNrIC0KKwkgKiBTcGVjaWZ5IHdoaWNoIG51bWJlcnMgb2Ygc3BhdGlhbCBzdHJlYW1zIChNSU1PIGZhY3RvcikgYXJlIHBlcm1pdHRlZC4KKwkgKiBFYWNoIGJpdCBpbiB0aGlzIG1hc2sgY29ycmVzcG9uZHMgdG8gYSBOc3MgdmFsdWU6CisJICogICAgIGJpdCAwOiBpZiBzZXQsIE5zcyA9IDEgKG5vbi1NSU1PKSBpcyBwZXJtaXR0ZWQKKwkgKiAgICAgYml0IDE6IGlmIHNldCwgTnNzID0gMiAoMngyIE1JTU8pIGlzIHBlcm1pdHRlZAorCSAqICAgICBiaXQgMjogaWYgc2V0LCBOc3MgPSAzICgzeDMgTUlNTykgaXMgcGVybWl0dGVkCisJICogICAgIGJpdCAzOiBpZiBzZXQsIE5zcyA9IDQgKDR4NCBNSU1PKSBpcyBwZXJtaXR0ZWQKKwkgKiBUaGUgdmFsdWVzIGluIHRoZSBOc3MgbWFzayBtdXN0IGJlIHN1aXRhYmxlIGZvciB0aGUgcmVjaXBpZW50LCBlLmcuCisJICogYSB2YWx1ZSBvZiAweDQgKE5zcyA9IDMpIGNhbm5vdCBiZSBzcGVjaWZpZWQgZm9yIGEgdHggZnJhbWUgdG8gYQorCSAqIHJlY2lwaWVudCB3aGljaCBvbmx5IHN1cHBvcnRzIDJ4MiBNSU1PLgorCSAqLworCW5zc19tYXNrOjQsCisJLyogZ3VhcmRfaW50ZXJ2YWwgLQorCSAqIFNwZWNpZnkgYSBodHRfdHhfZ3VhcmRfaW50ZXJ2YWwgZW51bSB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyCisJICogdGhlIHRyYW5zbWlzc2lvbiBzaG91bGQgdXNlIGEgcmVndWxhciBndWFyZCBpbnRlcnZhbCBvciBhCisJICogc2hvcnQgZ3VhcmQgaW50ZXJ2YWwuCisJICovCisJZ3VhcmRfaW50ZXJ2YWw6MSwKKwkvKiBwcmVhbWJsZV90eXBlX21hc2sgLQorCSAqIFNwZWNpZnkgd2hpY2ggcHJlYW1ibGUgdHlwZXMgKENDSywgT0ZETSwgSFQsIFZIVCkgdGhlIHRhcmdldAorCSAqIG1heSBjaG9vc2UgZnJvbSBmb3IgdHJhbnNtaXR0aW5nIHRoaXMgZnJhbWUuCisJICogVGhlIGJpdHMgaW4gdGhpcyBtYXNrIGNvcnJlc3BvbmQgdG8gdGhlIHZhbHVlcyBpbiB0aGUKKwkgKiBodHRfdHhfcHJlYW1ibGVfdHlwZSBlbnVtLiAgRm9yIGV4YW1wbGUsIHRvIGFsbG93IHRoZSB0YXJnZXQKKwkgKiB0byB0cmFuc21pdCB0aGUgZnJhbWUgYXMgZWl0aGVyIENDSyBvciBPRkRNLCB0aGlzIGZpZWxkIHdvdWxkCisJICogYmUgc2V0IHRvCisJICogICAgICgxIDw8IGh0dF90eF9wcmVhbWJsZV90eXBlX29mZG0pIHwKKwkgKiAgICAgKDEgPDwgaHR0X3R4X3ByZWFtYmxlX3R5cGVfY2NrKQorCSAqLworCXByZWFtYmxlX3R5cGVfbWFzazo0LAorCisJcmVzZXJ2ZWQxXzMxXzI5OjM7CS8qIHVudXNlZCwgc2V0IHRvIDB4MCAqLworCisJLyogRFdPUkQgMjogdHggY2hhaW4gbWFzaywgdHggcmV0cmllcyAqLworCUFfVUlOVDMyCisJLyogY2hhaW5fbWFzayAtIHNwZWNpZnkgd2hpY2ggY2hhaW5zIHRvIHRyYW5zbWl0IGZyb20gKi8KKwljaGFpbl9tYXNrOjQsCisJLyogcmV0cnlfbGltaXQgLQorCSAqIFNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zbWlzc2lvbnMsIGluY2x1ZGluZyB0aGUKKwkgKiBpbml0aWFsIHRyYW5zbWlzc2lvbiwgdG8gYXR0ZW1wdCBiZWZvcmUgZ2l2aW5nIHVwIGlmIG5vIGFjaworCSAqIGlzIHJlY2VpdmVkLgorCSAqIElmIHRoZSB0eCByYXRlIGlzIHNwZWNpZmllZCwgdGhlbiBhbGwgcmV0cmllcyBzaGFsbCB1c2UgdGhlCisJICogc2FtZSByYXRlIGFzIHRoZSBpbml0aWFsIHRyYW5zbWlzc2lvbi4KKwkgKiBJZiBubyB0eCByYXRlIGlzIHNwZWNpZmllZCwgdGhlIHRhcmdldCBjYW4gY2hvb3NlIHdoZXRoZXIgdG8KKwkgKiByZXRhaW4gdGhlIG9yaWdpbmFsIHJhdGUgZHVyaW5nIHRoZSByZXRyYW5zbWlzc2lvbnMsIG9yIHRvCisJICogZmFsbCBiYWNrIHRvIGEgbW9yZSByb2J1c3QgcmF0ZS4KKwkgKi8KKwlyZXRyeV9saW1pdDo0LAorCS8qIGJhbmR3aWR0aF9tYXNrIC0KKwkgKiBTcGVjaWZ5IHdoYXQgY2hhbm5lbCB3aWR0aHMgbWF5IGJlIHVzZWQgZm9yIHRoZSB0cmFuc21pc3Npb24uCisJICogQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyAiZG9uJ3QgY2FyZSIgLSB0aGUgdGFyZ2V0IG1heSBjaG9vc2UKKwkgKiB0aGUgdHJhbnNtaXNzaW9uIGJhbmR3aWR0aC4KKwkgKiBUaGUgYml0cyB3aXRoaW4gdGhpcyBtYXNrIGNvcnJlc3BvbmQgdG8gdGhlIGh0dF90eF9iYW5kd2lkdGgKKwkgKiBlbnVtIHZhbHVlcyAtIGJpdCAwIGlzIGZvciA1IE1IeiwgYml0IDEgaXMgZm9yIDEwIE1IeiwgZXRjLgorCSAqIFRoZSBiYW5kd2lkdGhfbWFzayBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUKKwkgKiBwcmVhbWJsZV90eXBlX21hc2sgKiBhbmQgbWNzX21hc2sgc3BlY3MsIGlmIHRoZXkgYXJlCisJICogcHJvdmlkZWQuICBGb3IgZXhhbXBsZSwKKwkgKiA4MCBNSHogYW5kIDE2MCBNSHogY2FuIG9ubHkgYmUgZW5hYmxlZCBpbiB0aGUgbWFzaworCSAqIGlmIHByZWFtYmxlX3R5cGUgPT0gVkhULgorCSAqLworCWJhbmR3aWR0aF9tYXNrOjYsCisKKwlyZXNlcnZlZDJfMzFfMTQ6MTg7CS8qIHVudXNlZCwgc2V0IHRvIDB4MCAqLworCisJLyogRFdPUkQgMzogdHggZXhwaXJ5IHRpbWUgKFRTRikgTFNCcyAqLworCUFfVUlOVDMyIGV4cGlyZV90c2ZfbG87CisKKwkvKiBEV09SRCA0OiB0eCBleHBpcnkgdGltZSAoVFNGKSBNU0JzICovCisJQV9VSU5UMzIgZXhwaXJlX3RzZl9oaTsKKworCUFfVUlOVDMyIHJlc2VydmVkX2Zvcl9mdXR1cmVfZXhwYW5zaW9uX3NldF90b196ZXJvWzNdOworfSBQT1NUUEFDSzsKKworLyogRFdPUkQgMCAqLworI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1BXUl9NICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9QV1JfUyAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfTUNTX01BU0tfTSAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX01DU19NQVNLX1MgICAgICAgICAgIDEKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9OU1NfTUFTS19NICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfTlNTX01BU0tfUyAgICAgICAgICAgMgorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0dVQVJEX0lOVEVSVkFMX00gICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9HVUFSRF9JTlRFUlZBTF9TICAgICAzCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfUFJFQU1CTEVfVFlQRV9NQVNLX00gMHgwMDAwMDAxMAorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1BSRUFNQkxFX1RZUEVfTUFTS19TIDQKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9DSEFJTl9NQVNLX00gICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfQ0hBSU5fTUFTS19TICAgICAgICAgNQorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1JFVFJJRVNfTSAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9SRVRSSUVTX1MgICAgICAgICAgICA2CisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfQkFORFdJRFRIX00gICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0JBTkRXSURUSF9TICAgICAgICAgIDcKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9FWFBJUkVfVElNRV9NICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfRVhQSVJFX1RJTUVfUyAgICAgICAgOAorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX0lTX0RTUkNfTSAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19JU19EU1JDX1MgICAgICAgICAgICAgICAgICA5CisKKy8qIERXT1JEIDEgKi8KKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfUFdSX00gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX1BXUl9TICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19NQ1NfTUFTS19NICAgICAgICAgICAgICAgICAgICAgIDB4MDAwZmZmMDAKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfTUNTX01BU0tfUyAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX05TU19NQVNLX00gICAgICAgICAgICAgICAgICAgICAgMHgwMGYwMDAwMAorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19OU1NfTUFTS19TICAgICAgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0dVQVJEX0lOVEVSVkFMX00gICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19HVUFSRF9JTlRFUlZBTF9TICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX1BSRUFNQkxFX1RZUEVfTUFTS19NICAgICAgICAgICAgMHgxYzAwMDAwMAorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19QUkVBTUJMRV9UWVBFX01BU0tfUyAgICAgICAgICAgIDI1CisKKy8qIERXT1JEIDIgKi8KKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfQ0hBSU5fTUFTS19NICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0NIQUlOX01BU0tfUyAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19SRVRSWV9MSU1JVF9NICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfUkVUUllfTElNSVRfUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0JBTkRXSURUSF9NQVNLX00gICAgICAgICAgICAgICAgMHgwMDAwM2YwMAorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19CQU5EV0lEVEhfTUFTS19TICAgICAgICAgICAgICAgIDgKKworCisvKiBEV09SRCAwICovCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfUFdSX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1BXUl9NKSA+PiBcCisJSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9QV1JfUykKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9QV1JfU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfUFdSLCBfdmFsKTsgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1BXUl9TKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9NQ1NfTUFTS19HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9NQ1NfTUFTS19NKSA+PiBcCisJSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9NQ1NfTUFTS19TKQorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX01DU19NQVNLX1NFVChfdmFyLCBfdmFsKSBcCitkbyB7IFwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX01DU19NQVNLLCBfdmFsKTsgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX01DU19NQVNLX1MpKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0dVQVJEX0lOVEVSVkFMX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0dVQVJEX0lOVEVSVkFMX00pID4+IFwKKwlIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0dVQVJEX0lOVEVSVkFMX1MpCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfR1VBUkRfSU5URVJWQUxfU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgXAorCUhUVF9DSEVDS19TRVRfVkFMKCBcCisJSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9HVUFSRF9JTlRFUlZBTCwgX3ZhbCk7IFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgXAorCTw8IEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfR1VBUkRfSU5URVJWQUxfUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfUFJFQU1CTEVfVFlQRV9NQVNLX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1BSRUFNQkxFX1RZUEVfTUFTS19NKSA+PlwKKwlIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1BSRUFNQkxFX1RZUEVfTUFTS19TKQorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1BSRUFNQkxFX1RZUEVfTUFTS19TRVQoX3ZhciwgX3ZhbCkgXAorZG8geyBcCisJSFRUX0NIRUNLX1NFVF9WQUwoIFwKKwlIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1BSRUFNQkxFX1RZUEVfTUFTSywgX3ZhbCk7IFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgXAorCTw8IEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfUFJFQU1CTEVfVFlQRV9NQVNLX1MpKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0NIQUlOX01BU0tfR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfQ0hBSU5fTUFTS19NKSA+PiBcCisJSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9DSEFJTl9NQVNLX1MpCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfQ0hBSU5fTUFTS19TRVQoX3ZhciwgX3ZhbCkgXAorZG8geyBcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9DSEFJTl9NQVNLLCBfdmFsKTsgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PAkJXAorCQlIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0NIQUlOX01BU0tfUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfUkVUUklFU19HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9SRVRSSUVTX00pID4+IFwKKwlIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1JFVFJJRVNfUykKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9SRVRSSUVTX1NFVChfdmFyLCBfdmFsKSBcCitkbyB7IFwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX1JFVFJJRVMsIF92YWwpOyBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfUkVUUklFU19TKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9CQU5EV0lEVEhfR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfQkFORFdJRFRIX00pID4+IFwKKwlIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0JBTkRXSURUSF9TKQorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0JBTkRXSURUSF9TRVQoX3ZhciwgX3ZhbCkgXAorZG8geyBcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19WQUxJRF9CQU5EV0lEVEgsIF92YWwpOyBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfQkFORFdJRFRIX1MpKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0VYUElSRV9USU1FX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0VYUElSRV9USU1FX00pID4+IFwKKwlIVFRfVFhfTVNEVV9FWFRfREVTQ19GTEFHX1ZBTElEX0VYUElSRV9USU1FX1MpCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfRVhQSVJFX1RJTUVfU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfRVhQSVJFX1RJTUUsIF92YWwpOyBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfVkFMSURfRVhQSVJFX1RJTUVfUykpO1wKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19JU19EU1JDX0dFVChfdmFyKSBcCisJCSgoKF92YXIpICYgSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19JU19EU1JDX00pID4+IFwKKwkJSFRUX1RYX01TRFVfRVhUX0RFU0NfRkxBR19JU19EU1JDX1MpCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfSVNfRFNSQ19TRVQoX3ZhciwgX3ZhbCkgXAorZG8geyBcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfSVNfRFNSQywgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9NU0RVX0VYVF9ERVNDX0ZMQUdfSVNfRFNSQ19TKSk7IFwKK30gd2hpbGUgKDApCisKKworLyogRFdPUkQgMSAqLworI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19QV1JfR0VUX0JBU0UoX3ZhcikgXAorCQkoKChfdmFyKSAmIEhUVF9UWF9NU0RVX0VYVF9ERVNDX1BXUl9NKSA+PiBcCisJCUhUVF9UWF9NU0RVX0VYVF9ERVNDX1BXUl9TKQorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19QV1JfR0VUKF92YXIpIFwKKwkJKEhUVF9UWF9NU0RVX0VYVF9ERVNDX1BXUl9HRVRfQkFTRShfdmFyKSAgfCBcCisJCUhUVF9TSUdOX0JJVF9FWFRFTlNJT05fTUFTSyhfdmFyLCBIVFRfVFhfTVNEVV9FWFRfREVTQ19QV1IpKQorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19QV1JfU0VUKF92YXIsIF92YWwpIFwKKwkJKChfdmFyKSB8PSAoKChfdmFsKSA8PCBIVFRfVFhfTVNEVV9FWFRfREVTQ19QV1JfUykpICYgXAorCQlIVFRfVFhfTVNEVV9FWFRfREVTQ19QV1JfTSkKKworI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19NQ1NfTUFTS19HRVQoX3ZhcikgXAorCQkoKChfdmFyKSAmIEhUVF9UWF9NU0RVX0VYVF9ERVNDX01DU19NQVNLX00pID4+IFwKKwkJSFRUX1RYX01TRFVfRVhUX0RFU0NfTUNTX01BU0tfUykKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfTUNTX01BU0tfU0VUKF92YXIsIF92YWwpIFwKKwlkbyB7IFwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX01TRFVfRVhUX0RFU0NfTUNTX01BU0ssIF92YWwpOyBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfVFhfTVNEVV9FWFRfREVTQ19NQ1NfTUFTS19TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX05TU19NQVNLX0dFVChfdmFyKSBcCisJCSgoKF92YXIpICYgSFRUX1RYX01TRFVfRVhUX0RFU0NfTlNTX01BU0tfTSkgPj4gXAorCQlIVFRfVFhfTVNEVV9FWFRfREVTQ19OU1NfTUFTS19TKQorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19OU1NfTUFTS19TRVQoX3ZhciwgX3ZhbCkgXAorCWRvIHsgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhfTVNEVV9FWFRfREVTQ19OU1NfTUFTSywgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9NU0RVX0VYVF9ERVNDX05TU19NQVNLX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfR1VBUkRfSU5URVJWQUxfR0VUKF92YXIpIFwKKwkJKCgoX3ZhcikgJiBIVFRfVFhfTVNEVV9FWFRfREVTQ19HVUFSRF9JTlRFUlZBTF9NKSA+PiBcCisJCUhUVF9UWF9NU0RVX0VYVF9ERVNDX0dVQVJEX0lOVEVSVkFMX1MpCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0dVQVJEX0lOVEVSVkFMX1NFVChfdmFyLCBfdmFsKSBcCisJZG8geyBcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9NU0RVX0VYVF9ERVNDX0dVQVJEX0lOVEVSVkFMLCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX01TRFVfRVhUX0RFU0NfR1VBUkRfSU5URVJWQUxfUykpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19QUkVBTUJMRV9UWVBFX01BU0tfR0VUKF92YXIpIFwKKwkJKCgoX3ZhcikgJiBIVFRfVFhfTVNEVV9FWFRfREVTQ19QUkVBTUJMRV9UWVBFX01BU0tfTSkgPj4gXAorCQlIVFRfVFhfTVNEVV9FWFRfREVTQ19QUkVBTUJMRV9UWVBFX01BU0tfUykKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfUFJFQU1CTEVfVFlQRV9NQVNLX1NFVChfdmFyLCBfdmFsKSBcCisJZG8geyBcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9NU0RVX0VYVF9ERVNDX1BSRUFNQkxFX1RZUEVfTUFTSyxcCisJCQkJX3ZhbCk7CQkJCVwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8CQlcCisJCQkJSFRUX1RYX01TRFVfRVhUX0RFU0NfUFJFQU1CTEVfVFlQRV9NQVNLX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKworLyogRFdPUkQgMiAqLworI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19DSEFJTl9NQVNLX0dFVChfdmFyKSBcCisJCSgoKF92YXIpICYgSFRUX1RYX01TRFVfRVhUX0RFU0NfQ0hBSU5fTUFTS19NKSA+PiBcCisJCUhUVF9UWF9NU0RVX0VYVF9ERVNDX0NIQUlOX01BU0tfUykKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfQ0hBSU5fTUFTS19TRVQoX3ZhciwgX3ZhbCkgXAorCWRvIHsgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhfTVNEVV9FWFRfREVTQ19DSEFJTl9NQVNLLCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX01TRFVfRVhUX0RFU0NfQ0hBSU5fTUFTS19TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX1JFVFJZX0xJTUlUX0dFVChfdmFyKSBcCisJCSgoKF92YXIpICYgSFRUX1RYX01TRFVfRVhUX0RFU0NfUkVUUllfTElNSVRfTSkgPj4gXAorCQlIVFRfVFhfTVNEVV9FWFRfREVTQ19SRVRSWV9MSU1JVF9TKQorI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfREVTQ19SRVRSWV9MSU1JVF9TRVQoX3ZhciwgX3ZhbCkgXAorCWRvIHsgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhfTVNEVV9FWFRfREVTQ19SRVRSWV9MSU1JVCwgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9NU0RVX0VYVF9ERVNDX1JFVFJZX0xJTUlUX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1RYX01TRFVfRVhUX0RFU0NfQkFORFdJRFRIX01BU0tfR0VUKF92YXIpIFwKKwkJKCgoX3ZhcikgJiBIVFRfVFhfTVNEVV9FWFRfREVTQ19CQU5EV0lEVEhfTUFTS19NKSA+PiBcCisJCUhUVF9UWF9NU0RVX0VYVF9ERVNDX0JBTkRXSURUSF9NQVNLX1MpCisjZGVmaW5lIEhUVF9UWF9NU0RVX0VYVF9ERVNDX0JBTkRXSURUSF9NQVNLX1NFVChfdmFyLCBfdmFsKSBcCisJZG8geyBcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9NU0RVX0VYVF9ERVNDX0JBTkRXSURUSF9NQVNLLCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX01TRFVfRVhUX0RFU0NfQkFORFdJRFRIX01BU0tfUykpOyBcCisJfSB3aGlsZSAoMCkKKworCisvKioKKyAqIEBicmllZiBNQUMgRE1BIHJ4IHJpbmcgc2V0dXAgc3BlY2lmaWNhdGlvbgorICogQGRldGFpbHMKKyAqICBUbyBhbGxvdyBmb3IgZHluYW1pYyByeCByaW5nIHJlY29uZmlndXJhdGlvbiBhbmQgdG8gYXZvaWQgcmFjZQorICogIGNvbmRpdGlvbnMsIHRoZSBob3N0IFNXIG5ldmVyIGRpcmVjdGx5IHByb2dyYW1zIHRoZSBNQUMgRE1BIHJ4IHJpbmcocykKKyAqICBpdCB1c2VzLiAgSW5zdGVhZCwgaXQgc2VuZHMgdGhpcyBtZXNzYWdlIHRvIHRoZSB0YXJnZXQsIGluZGljYXRpbmcgaG93CisgKiAgdGhlIHJ4IHJpbmcgdXNlZCBieSB0aGUgaG9zdCBzaG91bGQgYmUgc2V0IHVwIGFuZCBtYWludGFpbmVkLgorICogIFRoZSBtZXNzYWdlIGNvbnNpc3RzIG9mIGEgNC1vY3RldCBoZWFkZXIgZm9sbG93ZWQgYnkgMSBvciAyIHJ4IHJpbmcgc2V0dXAKKyAqICBzcGVjaWZpY2F0aW9ucy4KKyAqCisgKiAgICAgICAgICAgIHwzMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2fDE1ICAgICAgICAgICAgOHw3ICAgICAgICAgICAgIDB8CisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiBoZWFkZXI6ICAgIHwgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgfCAgIG51bSByaW5ncyAgIHwgICAgbXNnIHR5cGUgICB8CisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiBwYXlsb2FkIDE6IHwgICAgICAgRldfSURYIHNoYWRvdyByZWdpc3RlciBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDMxOjApICAgICB8CisgI2lmIEhUVF9QQUREUjY0CisgKiAgICAgICAgICAgIHwgICAgICAgRldfSURYIHNoYWRvdyByZWdpc3RlciBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDYzOjMyKSAgICB8CisgI2VuZGlmCisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHJ4IHJpbmcgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDMxOjApICAgICB8CisgI2lmIEhUVF9QQUREUjY0CisgKiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHJ4IHJpbmcgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDYzOjMyKSAgICB8CisgI2VuZGlmCisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICAgIHwgICAgICByeCByaW5nIGJ1ZmZlciBzaXplICAgICAgfCAgICAgICAgcnggcmluZyBsZW5ndGggICAgICAgICB8CisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICAgIHwgICAgICBGV19JRFggaW5pdGlhbCB2YWx1ZSAgICAgfCAgICAgICAgIGVuYWJsZWQgZmxhZ3MgICAgICAgICB8CisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICAgIHwgICAgICBNU0RVIHBheWxvYWQgb2Zmc2V0ICAgICAgfCAgICAgODAyLjExIGhlYWRlciBvZmZzZXQgICAgICB8CisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICAgIHwgICAgICAgIFBQRFUgZW5kIG9mZnNldCAgICAgICAgfCAgICAgICBQUERVIHN0YXJ0IG9mZnNldCAgICAgICB8CisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICAgIHwgICAgICAgIE1QRFUgZW5kIG9mZnNldCAgICAgICAgfCAgICAgICBNUERVIHN0YXJ0IG9mZnNldCAgICAgICB8CisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICAgIHwgICAgICAgIE1TRFUgZW5kIG9mZnNldCAgICAgICAgfCAgICAgICBNU0RVIHN0YXJ0IG9mZnNldCAgICAgICB8CisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICAgIHwgICAgICAgIGZyYWcgaW5mbyBvZmZzZXQgICAgICAgfCAgICAgIHJ4IGF0dGVudGlvbiBvZmZzZXQgICAgICB8CisgKiAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiBwYXlsb2FkIDIsIGlmIHByZXNlbnQsIGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgcGF5bG9hZCAxCisgKiBIZWFkZXIgZmllbGRzOgorICogICAtIE1TR19UWVBFCisgKiAgICAgQml0cyA3OjAKKyAqICAgICBQdXJwb3NlOiBpZGVudGlmaWVzIHRoaXMgYXMgYW4gcnggcmluZyBjb25maWd1cmF0aW9uIG1lc3NhZ2UKKyAqICAgICBWYWx1ZTogMHgyCisgKiAgIC0gTlVNX1JJTkdTCisgKiAgICAgQml0cyAxNTo4CisgKiAgICAgUHVycG9zZTogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGhvc3QgaXMgc2V0dGluZyB1cCBvbmUgcnggcmluZyBvciB0d28KKyAqICAgICBWYWx1ZTogMSBvciAyCisgKiBQYXlsb2FkOgorICogICAgIGZvciBzeXN0ZW1zIHVzaW5nIDY0LWJpdCBmb3JtYXQgZm9yIGJ1cyBhZGRyZXNzZXM6CisgKiAgICAgICAtIElEWF9TSEFET1dfUkVHX1BBRERSX0xPCisgKiAgICAgICAgIEJpdHMgMzE6MAorICogICAgICAgICBWYWx1ZTogbG93ZXIgNCBieXRlcyBvZiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBob3N0J3MKKyAqICAgICAgICAgICAgICAgIEZXX0lEWCBzaGFkb3cgcmVnaXN0ZXIKKyAqICAgICAgIC0gSURYX1NIQURPV19SRUdfUEFERFJfSEkKKyAqICAgICAgICAgQml0cyAzMTowCisgKiAgICAgICAgIFZhbHVlOiB1cHBlciA0IGJ5dGVzIG9mIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGhvc3QncworICogICAgICAgICAgICAgICAgRldfSURYIHNoYWRvdyByZWdpc3RlcgorICogICAgICAgLSBSSU5HX0JBU0VfUEFERFJfTE8KKyAqICAgICAgICAgQml0cyAzMTowCisgKiAgICAgICAgIFZhbHVlOiBsb3dlciA0IGJ5dGVzIG9mIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGhvc3QncyByeCByaW5nCisgKiAgICAgICAtIFJJTkdfQkFTRV9QQUREUl9ISQorICogICAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgICAgVmFsdWU6IHVwcHBlciA0IGJ5dGVzIG9mIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGhvc3QncyByeCByaW5nCisgKiAgICAgZm9yIHN5c3RlbXMgdXNpbmcgMzItYml0IGZvcm1hdCBmb3IgYnVzIGFkZHJlc3NlczoKKyAqICAgICAgIC0gSURYX1NIQURPV19SRUdfUEFERFIKKyAqICAgICAgICAgQml0cyAzMTowCisgKiAgICAgICAgIFZhbHVlOiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBob3N0J3MgRldfSURYIHNoYWRvdyByZWdpc3RlcgorICogICAgICAgLSBSSU5HX0JBU0VfUEFERFIKKyAqICAgICAgICAgQml0cyAzMTowCisgKiAgICAgICAgIFZhbHVlOiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBob3N0J3MgcnggcmluZworICogICAtIFJJTkdfTEVOCisgKiAgICAgQml0cyAxNTowCisgKiAgICAgVmFsdWU6IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcnggcmluZworICogICAtIFJJTkdfQlVGX1NaCisgKiAgICAgQml0cyAzMToxNgorICogICAgIFZhbHVlOiBzaXplIG9mIHRoZSBidWZmZXJzIHJlZmVyZW5jZWQgYnkgdGhlIHJ4IHJpbmcsIGluIGJ5dGUgdW5pdHMKKyAqICAgLSBFTkFCTEVEX0ZMQUdTCisgKiAgICAgQml0cyAxNTowCisgKiAgICAgVmFsdWU6IDEtYml0IGZsYWdzIHRvIHNob3cgd2hldGhlciBkaWZmZXJlbnQgcnggZmllbGRzIGFyZSBlbmFibGVkCisgKiAgICAgICAgIGJpdCAgMDogODAyLjExIGhlYWRlciBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMCkKKyAqICAgICAgICAgYml0ICAxOiBNU0RVIHBheWxvYWQgIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKQorICogICAgICAgICBiaXQgIDI6IFBQRFUgc3RhcnQgICAgZW5hYmxlZCAoMSkgb3IgZGlzYWJsZWQgKDApCisgKiAgICAgICAgIGJpdCAgMzogUFBEVSBlbmQgICAgICBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMCkKKyAqICAgICAgICAgYml0ICA0OiBNUERVIHN0YXJ0ICAgIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKQorICogICAgICAgICBiaXQgIDU6IE1QRFUgZW5kICAgICAgZW5hYmxlZCAoMSkgb3IgZGlzYWJsZWQgKDApCisgKiAgICAgICAgIGJpdCAgNjogTVNEVSBzdGFydCAgICBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMCkKKyAqICAgICAgICAgYml0ICA3OiBNU0RVIGVuZCAgICAgIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKQorICogICAgICAgICBiaXQgIDg6IHJ4IGF0dGVudGlvbiAgZW5hYmxlZCAoMSkgb3IgZGlzYWJsZWQgKDApCisgKiAgICAgICAgIGJpdCAgOTogZnJhZyBpbmZvICAgICBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMCkKKyAqICAgICAgICAgYml0IDEwOiB1bmljYXN0IHJ4ICAgIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKQorICogICAgICAgICBiaXQgMTE6IG11bHRpY2FzdCByeCAgZW5hYmxlZCAoMSkgb3IgZGlzYWJsZWQgKDApCisgKiAgICAgICAgIGJpdCAxMjogY3RybCByeCAgICAgICBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMCkKKyAqICAgICAgICAgYml0IDEzOiBtZ210IHJ4ICAgICAgIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKQorICogICAgICAgICBiaXQgMTQ6IG51bGwgcnggICAgICAgZW5hYmxlZCAoMSkgb3IgZGlzYWJsZWQgKDApCisgKiAgICAgICAgIGJpdCAxNTogcGh5IGRhdGEgcnggICBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMCkKKyAqICAgLSBJRFhfSU5JVF9WQUwKKyAqICAgICBCaXRzIDMxOjE2CisgKiAgICAgUHVycG9zZTogU3BlY2lmeSB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIEZXX0lEWC4KKyAqICAgICBWYWx1ZTogdGhlIG51bWJlciBvZiBidWZmZXJzIGluaXRpYWxseSBwcmVzZW50IGluIHRoZSBob3N0J3MgcnggcmluZworICogICAtIE9GRlNFVF84MDJfMTFfSERSCisgKiAgICAgQml0cyAxNTowCisgKiAgICAgVmFsdWU6IG9mZnNldCBpbiBRVUFELWJ5dGVzIG9mIDgwMi4xMSBoZWFkZXIgZnJvbSB0aGUgYnVmZmVyIHN0YXJ0CisgKiAgIC0gT0ZGU0VUX01TRFVfUEFZTE9BRAorICogICAgIEJpdHMgMzE6MTYKKyAqICAgICBWYWx1ZTogb2Zmc2V0IGluIFFVQUQtYnl0ZXMgb2YgTVNEVSBwYXlsb2FkIGZyb20gdGhlIGJ1ZmZlciBzdGFydAorICogICAtIE9GRlNFVF9QUERVX1NUQVJUCisgKiAgICAgQml0cyAxNTowCisgKiAgICAgVmFsdWU6IG9mZnNldCBpbiBRVUFELWJ5dGVzIG9mIFBQRFUgc3RhcnQgcnggZGVzYyBmcm9tIHRoZSBidWZmZXIgc3RhcnQKKyAqICAgLSBPRkZTRVRfUFBEVV9FTkQKKyAqICAgICBCaXRzIDMxOjE2CisgKiAgICAgVmFsdWU6IG9mZnNldCBpbiBRVUFELWJ5dGVzIG9mIFBQRFUgZW5kIHJ4IGRlc2MgZnJvbSB0aGUgYnVmZmVyIHN0YXJ0CisgKiAgIC0gT0ZGU0VUX01QRFVfU1RBUlQKKyAqICAgICBCaXRzIDE1OjAKKyAqICAgICBWYWx1ZTogb2Zmc2V0IGluIFFVQUQtYnl0ZXMgb2YgTVBEVSBzdGFydCByeCBkZXNjIGZyb20gdGhlIGJ1ZmZlciBzdGFydAorICogICAtIE9GRlNFVF9NUERVX0VORAorICogICAgIEJpdHMgMzE6MTYKKyAqICAgICBWYWx1ZTogb2Zmc2V0IGluIFFVQUQtYnl0ZXMgb2YgTVBEVSBlbmQgcnggZGVzYyBmcm9tIHRoZSBidWZmZXIgc3RhcnQKKyAqICAgLSBPRkZTRVRfTVNEVV9TVEFSVAorICogICAgIEJpdHMgMTU6MAorICogICAgIFZhbHVlOiBvZmZzZXQgaW4gUVVBRC1ieXRlcyBvZiBNU0RVIHN0YXJ0IHJ4IGRlc2MgZnJvbSB0aGUgYnVmZmVyIHN0YXJ0CisgKiAgIC0gT0ZGU0VUX01TRFVfRU5ECisgKiAgICAgQml0cyAzMToxNgorICogICAgIFZhbHVlOiBvZmZzZXQgaW4gUVVBRC1ieXRlcyBvZiBNU0RVIGVuZCByeCBkZXNjIGZyb20gdGhlIGJ1ZmZlciBzdGFydAorICogICAtIE9GRlNFVF9SWF9BVFROCisgKiAgICAgQml0cyAxNTowCisgKiAgICAgVmFsdWU6IG9mZnNldCBpbiBRVUFELWJ5dGVzIG9mIHJ4IGF0dGVudGlvbiB3b3JkIGZyb20gdGhlIGJ1ZmZlciBzdGFydAorICogICAtIE9GRlNFVF9GUkFHX0lORk8KKyAqICAgICBCaXRzIDMxOjE2CisgKiAgICAgVmFsdWU6IG9mZnNldCBpbiBRVUFELWJ5dGVzIG9mIGZyYWcgaW5mbyB0YWJsZQorICovCisvKiBoZWFkZXIgZmllbGRzICovCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19OVU1fUklOR1NfTSAgICAgIDB4ZmYwMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfTlVNX1JJTkdTX1MgICAgICA4CisKKy8qIHBheWxvYWQgZmllbGRzICovCisvKiBmb3Igc3lzdGVtcyB1c2luZyBhIDY0LWJpdCBmb3JtYXQgZm9yIGJ1cyBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0lEWF9TSEFET1dfUkVHX1BBRERSX0hJX00gMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfSURYX1NIQURPV19SRUdfUEFERFJfSElfUyAwCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19JRFhfU0hBRE9XX1JFR19QQUREUl9MT19NIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0lEWF9TSEFET1dfUkVHX1BBRERSX0xPX1MgMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfQkFTRV9QQUREUl9ISV9NICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19CQVNFX1BBRERSX0hJX1MgICAgICAgICAgIDAKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0JBU0VfUEFERFJfTE9fTSAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfQkFTRV9QQUREUl9MT19TICAgICAgICAgICAwCisKKy8qIGZvciBzeXN0ZW1zIHVzaW5nIGEgMzItYml0IGZvcm1hdCBmb3IgYnVzIGFkZHJlc3NlcyAqLworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfSURYX1NIQURPV19SRUdfUEFERFJfTSAgICAweGZmZmZmZmZmCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19JRFhfU0hBRE9XX1JFR19QQUREUl9TICAgIDAKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0JBU0VfUEFERFJfTSAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfQkFTRV9QQUREUl9TICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0xFTl9NICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfTEVOX1MgICAgICAgICAgICAgMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfQlVGX1NaX00gICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfQlVGX1NaX1MgICAgICAgICAgMTYKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfODAyXzExX0hEUl9NICAgMHgxCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEXzgwMl8xMV9IRFJfUyAgIDAKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVNEVV9QQVlMRF9NICAgMHgyCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01TRFVfUEFZTERfUyAgIDEKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfUFBEVV9TVEFSVF9NICAgMHg0CisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1BQRFVfU1RBUlRfUyAgIDIKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfUFBEVV9FTkRfTSAgICAgMHg4CisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1BQRFVfRU5EX1MgICAgIDMKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVBEVV9TVEFSVF9NICAgMHgxMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NUERVX1NUQVJUX1MgICA0CisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01QRFVfRU5EX00gICAgIDB4MjAKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVBEVV9FTkRfUyAgICAgNQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX1NUQVJUX00gICAweDQwCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01TRFVfU1RBUlRfUyAgIDYKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVNEVV9FTkRfTSAgICAgMHg4MAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX0VORF9TICAgICA3CisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1JYX0FUVE5fTSAgICAgIDB4MTAwCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1JYX0FUVE5fUyAgICAgIDgKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfRlJBR19JTkZPX00gICAgMHgyMDAKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfRlJBR19JTkZPX1MgICAgOQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9VQ0FTVF9NICAgICAgICAweDQwMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9VQ0FTVF9TICAgICAgICAxMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NQ0FTVF9NICAgICAgICAweDgwMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NQ0FTVF9TICAgICAgICAxMQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9DVFJMX00gICAgICAgICAweDEwMDAKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfQ1RSTF9TICAgICAgICAgMTIKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTUdNVF9NICAgICAgICAgMHgyMDAwCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01HTVRfUyAgICAgICAgIDEzCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX05VTExfTSAgICAgICAgIDB4NDAwMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9OVUxMX1MgICAgICAgICAxNAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QSFlfTSAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfUEhZX1MgICAgICAgICAgMTUKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0lEWF9JTklUX1ZBTF9NICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfSURYX0lOSVRfVkFMX1MgICAgICAgICAxNgorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUXzgwMl8xMV9IRFJfTSAgICAweGZmZmYKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF84MDJfMTFfSERSX1MgICAgMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01TRFVfUEFZTERfTSAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVNEVV9QQVlMRF9TICAgIDE2CisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfUFBEVV9TVEFSVF9NICAgIDB4ZmZmZgorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX1BQRFVfU1RBUlRfUyAgICAwCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfUFBEVV9FTkRfTSAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9QUERVX0VORF9TICAgICAgMTYKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NUERVX1NUQVJUX00gICAgMHhmZmZmCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVBEVV9TVEFSVF9TICAgIDAKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NUERVX0VORF9NICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01QRFVfRU5EX1MgICAgICAxNgorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01TRFVfU1RBUlRfTSAgICAweGZmZmYKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NU0RVX1NUQVJUX1MgICAgMAorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01TRFVfRU5EX00gICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVNEVV9FTkRfUyAgICAgIDE2CisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfUlhfQVRUTl9NICAgICAgIDB4ZmZmZgorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX1JYX0FUVE5fUyAgICAgICAwCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfRlJBR19JTkZPX00gICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9GUkFHX0lORk9fUyAgICAgMTYKKworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfSERSX0JZVEVTIDQKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX1BBWUxEX0JZVEVTXzY0IDQ0CisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19QQVlMRF9CWVRFU18zMiAzNgorI2lmIEhUVF9QQUREUjY0CisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19QQVlMRF9CWVRFUyBIVFRfUlhfUklOR19DRkdfUEFZTERfQllURVNfNjQKKyNlbHNlCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19QQVlMRF9CWVRFUyBIVFRfUlhfUklOR19DRkdfUEFZTERfQllURVNfMzIKKyNlbmRpZgorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfQllURVMobnVtX3JpbmdzKQkJCQlcCisJKEhUVF9SWF9SSU5HX0NGR19IRFJfQllURVMgKyAobnVtX3JpbmdzKSAqIEhUVF9SWF9SSU5HX0NGR19QQVlMRF9CWVRFUykKKworCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19OVU1fUklOR1NfR0VUKF92YXIpCQkJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19OVU1fUklOR1NfTSkgPj4gSFRUX1JYX1JJTkdfQ0ZHX05VTV9SSU5HU19TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfTlVNX1JJTkdTX1NFVChfdmFyLCBfdmFsKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9SSU5HX0NGR19OVU1fUklOR1MsIF92YWwpOwlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfUklOR19DRkdfTlVNX1JJTkdTX1MpKTsJXAorCX0gd2hpbGUgKDApCisKKy8qIGRlZ2VuZXJhdGUgY2FzZSBmb3IgMzItYml0IGZpZWxkcyAqLworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfSURYX1NIQURPV19SRUdfUEFERFJfSElfR0VUKF92YXIpIChfdmFyKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfSURYX1NIQURPV19SRUdfUEFERFJfSElfU0VUKF92YXIsIF92YWwpCQlcCisJCSgoX3ZhcikgPSAoX3ZhbCkpCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19JRFhfU0hBRE9XX1JFR19QQUREUl9MT19HRVQoX3ZhcikgKF92YXIpCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19JRFhfU0hBRE9XX1JFR19QQUREUl9MT19TRVQoX3ZhciwgX3ZhbCkJCVwKKwkJKChfdmFyKSA9IChfdmFsKSkKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0lEWF9TSEFET1dfUkVHX1BBRERSX0dFVChfdmFyKSAoX3ZhcikKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0lEWF9TSEFET1dfUkVHX1BBRERSX1NFVChfdmFyLCBfdmFsKQkJXAorCQkoKF92YXIpID0gKF92YWwpKQorCisvKiBkZWdlbmVyYXRlIGNhc2UgZm9yIDMyLWJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0JBU0VfUEFERFJfSElfR0VUKF92YXIpIChfdmFyKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfQkFTRV9QQUREUl9ISV9TRVQoX3ZhciwgX3ZhbCkgKChfdmFyKSA9IChfdmFsKSkKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0JBU0VfUEFERFJfTE9fR0VUKF92YXIpIChfdmFyKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfQkFTRV9QQUREUl9MT19TRVQoX3ZhciwgX3ZhbCkgKChfdmFyKSA9IChfdmFsKSkKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0JBU0VfUEFERFJfR0VUKF92YXIpIChfdmFyKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfQkFTRV9QQUREUl9TRVQoX3ZhciwgX3ZhbCkgKChfdmFyKSA9IChfdmFsKSkKKworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfTEVOX0dFVChfdmFyKQkJCQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX0xFTl9NKSA+PiBIVFRfUlhfUklOR19DRkdfTEVOX1MpCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19MRU5fU0VUKF92YXIsIF92YWwpCQkJXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfTEVOLCBfdmFsKTsJXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX0xFTl9TKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19CVUZfU1pfR0VUKF92YXIpCQkJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19CVUZfU1pfTSkgPj4gSFRUX1JYX1JJTkdfQ0ZHX0JVRl9TWl9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfQlVGX1NaX1NFVChfdmFyLCBfdmFsKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfQlVGX1NaLCBfdmFsKTsJXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX0JVRl9TWl9TKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19JRFhfSU5JVF9WQUxfR0VUKF92YXIpCQlcCisJKCgoX3ZhcikgJiBIVFRfUlhfUklOR19DRkdfSURYX0lOSVRfVkFMX00pID4+CVwKKwkgSFRUX1JYX1JJTkdfQ0ZHX0lEWF9JTklUX1ZBTF9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfSURYX0lOSVRfVkFMX1NFVChfdmFyLCBfdmFsKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9SSU5HX0NGR19JRFhfSU5JVF9WQUwsIF92YWwpOyAgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX0lEWF9JTklUX1ZBTF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEXzgwMl8xMV9IRFJfR0VUKF92YXIpCQlcCisJKCgoX3ZhcikgJiBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF84MDJfMTFfSERSX00pID4+CVwKKwkgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfODAyXzExX0hEUl9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF84MDJfMTFfSERSX1NFVChfdmFyLCBfdmFsKQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfODAyXzExX0hEUiwgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEXzgwMl8xMV9IRFJfUykpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX1BBWUxEX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVNEVV9QQVlMRF9NKSA+PglcCisJIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01TRFVfUEFZTERfUykKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVNEVV9QQVlMRF9TRVQoX3ZhciwgX3ZhbCkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01TRFVfUEFZTEQsIF92YWwpOyBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX1BBWUxEX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfUFBEVV9TVEFSVF9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1BQRFVfU1RBUlRfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QUERVX1NUQVJUX1MpCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1BQRFVfU1RBUlRfU0VUKF92YXIsIF92YWwpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QUERVX1NUQVJULCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfUFBEVV9TVEFSVF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1BQRFVfRU5EX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfUFBEVV9FTkRfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QUERVX0VORF9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QUERVX0VORF9TRVQoX3ZhciwgX3ZhbCkJCVwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QUERVX0VORCwgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1BQRFVfRU5EX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVBEVV9TVEFSVF9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01QRFVfU1RBUlRfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NUERVX1NUQVJUX1MpCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01QRFVfU1RBUlRfU0VUKF92YXIsIF92YWwpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NUERVX1NUQVJULCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVBEVV9TVEFSVF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01QRFVfRU5EX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVBEVV9FTkRfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NUERVX0VORF9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NUERVX0VORF9TRVQoX3ZhciwgX3ZhbCkJCVwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NUERVX0VORCwgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01QRFVfRU5EX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVNEVV9TVEFSVF9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01TRFVfU1RBUlRfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX1NUQVJUX1MpCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01TRFVfU1RBUlRfU0VUKF92YXIsIF92YWwpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX1NUQVJULCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVNEVV9TVEFSVF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01TRFVfRU5EX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTVNEVV9FTkRfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX0VORF9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX0VORF9TRVQoX3ZhciwgX3ZhbCkJCVwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NU0RVX0VORCwgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01TRFVfRU5EX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfUlhfQVRUTl9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1JYX0FUVE5fTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9SWF9BVFROX1MpCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1JYX0FUVE5fU0VUKF92YXIsIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfUlhfQVRUTiwgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1JYX0FUVE5fUykpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9GUkFHX0lORk9fR0VUKF92YXIpCQlcCisJKCgoX3ZhcikgJiBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9GUkFHX0lORk9fTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9GUkFHX0lORk9fUykKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfRlJBR19JTkZPX1NFVChfdmFyLCBfdmFsKQkJXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX0ZSQUdfSU5GTywgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX0ZSQUdfSU5GT19TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX1VDQVNUX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfVUNBU1RfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9VQ0FTVF9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9VQ0FTVF9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfVUNBU1QsIF92YWwpOwlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9VQ0FTVF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01DQVNUX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTUNBU1RfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NQ0FTVF9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NQ0FTVF9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTUNBU1QsIF92YWwpOwlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NQ0FTVF9TKSk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9DVFJMX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfQ1RSTF9NKSA+PglcCisJIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX0NUUkxfUykKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfQ1RSTF9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfQ1RSTCwgX3ZhbCk7ICBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9DVFJMX1MpKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01HTVRfR0VUKF92YXIpCQlcCisJKCgoX3ZhcikgJiBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NR01UX00pID4+CVwKKwkgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTUdNVF9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NR01UX1NFVChfdmFyLCBfdmFsKQkJCVwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9NR01ULCBfdmFsKTsgIFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX01HTVRfUykpOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTlVMTF9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX05VTExfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9OVUxMX1MpCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX05VTExfU0VUKF92YXIsIF92YWwpCQkJXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9SSU5HX0NGR19FTkFCTEVEX05VTEwsIF92YWwpOyAgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfTlVMTF9TKSk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QSFlfR0VUKF92YXIpCQlcCisJKCgoX3ZhcikgJiBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QSFlfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QSFlfUykKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX0VOQUJMRURfUEhZX1NFVChfdmFyLCBfdmFsKQkJCVwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QSFksIF92YWwpOwlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfUklOR19DRkdfRU5BQkxFRF9QSFlfUykpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUXzgwMl8xMV9IRFJfR0VUKF92YXIpCQlcCisJKCgoX3ZhcikgJiBIVFRfUlhfUklOR19DRkdfT0ZGU0VUXzgwMl8xMV9IRFJfTSkgPj4JXAorCSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUXzgwMl8xMV9IRFJfUykKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF84MDJfMTFfSERSX1NFVChfdmFyLCBfdmFsKQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF84MDJfMTFfSERSLCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF84MDJfMTFfSERSX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NU0RVX1BBWUxEX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NU0RVX1BBWUxEX00pID4+CVwKKwkgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NU0RVX1BBWUxEX1MpCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVNEVV9QQVlMRF9TRVQoX3ZhciwgX3ZhbCkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVNEVV9QQVlMRCwgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVNEVV9QQVlMRF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfUFBEVV9TVEFSVF9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfUFBEVV9TVEFSVF9NKSA+PglcCisJIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfUFBEVV9TVEFSVF9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX1BQRFVfU1RBUlRfU0VUKF92YXIsIF92YWwpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfT0ZGU0VUX1BQRFVfU1RBUlQsIF92YWwpOyBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX1BQRFVfU1RBUlRfUykpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX1BQRFVfRU5EX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9QUERVX0VORF9NKSA+PglcCisJIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfUFBEVV9FTkRfUykKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9QUERVX0VORF9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfT0ZGU0VUX1BQRFVfRU5ELCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9QUERVX0VORF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVBEVV9TVEFSVF9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVBEVV9TVEFSVF9NKSA+PglcCisJIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVBEVV9TVEFSVF9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01QRFVfU1RBUlRfU0VUKF92YXIsIF92YWwpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01QRFVfU1RBUlQsIF92YWwpOyBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01QRFVfU1RBUlRfUykpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01QRFVfRU5EX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NUERVX0VORF9NKSA+PglcCisJIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVBEVV9FTkRfUykKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NUERVX0VORF9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01QRFVfRU5ELCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NUERVX0VORF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVNEVV9TVEFSVF9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVNEVV9TVEFSVF9NKSA+PglcCisJIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVNEVV9TVEFSVF9TKQorI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01TRFVfU1RBUlRfU0VUKF92YXIsIF92YWwpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01TRFVfU1RBUlQsIF92YWwpOyBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01TRFVfU1RBUlRfUykpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01TRFVfRU5EX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NU0RVX0VORF9NKSA+PglcCisJIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfTVNEVV9FTkRfUykKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NU0RVX0VORF9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfT0ZGU0VUX01TRFVfRU5ELCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9NU0RVX0VORF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfUlhfQVRUTl9HRVQoX3ZhcikJXAorCSgoKF92YXIpICYgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9SWF9BVFROX00pID4+IFwKKwkgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9SWF9BVFROX1MpCisjZGVmaW5lIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfUlhfQVRUTl9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfT0ZGU0VUX1JYX0FUVE4sIF92YWwpOyBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX1JYX0FUVE5fUykpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfUlhfUklOR19DRkdfT0ZGU0VUX0ZSQUdfSU5GT19HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfRlJBR19JTkZPX00pID4+CVwKKwkgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9GUkFHX0lORk9fUykKKyNkZWZpbmUgSFRUX1JYX1JJTkdfQ0ZHX09GRlNFVF9GUkFHX0lORk9fU0VUKF92YXIsIF92YWwpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUklOR19DRkdfT0ZGU0VUX0ZSQUdfSU5GTywgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9SWF9SSU5HX0NGR19PRkZTRVRfRlJBR19JTkZPX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKy8qKgorICogQGJyaWVmIGhvc3QgLT4gdGFyZ2V0IEZXIHN0YXRpc3RpY3MgcmV0cmlldmUKKyAqCisgKiBAZGV0YWlscworICogVGhlIGZvbGxvd2luZyBmaWVsZCBkZWZpbml0aW9ucyBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSBIVFQgaG9zdAorICogdG8gdGFyZ2V0IEZXIHN0YXRzIHJldHJpZXZlIG1lc3NhZ2UuIFRoZSBtZXNzYWdlIHNwZWNpZmllcyB0aGUgdHlwZSBvZgorICogc3RhdHMgaG9zdCB3YW50cyB0byByZXRyaWV2ZS4KKyAqCisgKiB8MzEgICAgICAgICAgMjR8MjMgICAgICAgICAgMTZ8MTUgICAgICAgICAgIDh8NyAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICBzdGF0cyB0eXBlcyByZXF1ZXN0IGJpdG1hc2sgICAgICAgICB8ICAgbXNnIHR5cGUgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgc3RhdHMgdHlwZXMgcmVzZXQgYml0bWFzayAgICAgICAgICB8ICAgcmVzZXJ2ZWQgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICBzdGF0cyB0eXBlICB8ICAgICAgICAgICAgICAgY29uZmlnIHZhbHVlICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgY29va2llIExTQnMgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgY29va2llIE1TQnMgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiBIZWFkZXIgZmllbGRzOgorICogIC0gTVNHX1RZUEUKKyAqICAgIEJpdHMgNzowCisgKiAgICBQdXJwb3NlOiBpZGVudGlmaWVzIHRoaXMgaXMgYSBzdGF0cyB1cGxvYWQgcmVxdWVzdCBtZXNzYWdlCisgKiAgICBWYWx1ZTogMHgzCisgKiAgLSBVUExPQURfVFlQRVMKKyAqICAgIEJpdHMgMzE6OAorICogICAgUHVycG9zZTogaWRlbnRpZmllcyB3aGljaCB0eXBlcyBvZiBGVyBzdGF0aXN0aWNzIHRvIHVwbG9hZAorICogICAgVmFsdWU6IG1hc2sgd2l0aCBiaXRzIHNldCBpbiBwb3NpdGlvbnMgZGVmaW5lZCBieSBodHRfZGJnX3N0YXRzX3R5cGUKKyAqICAtIFJFU0VUX1RZUEVTCisgKiAgICBCaXRzIDMxOjgKKyAqICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgd2hpY2ggdHlwZXMgb2YgRlcgc3RhdGlzdGljcyB0byByZXNldAorICogICAgVmFsdWU6IG1hc2sgd2l0aCBiaXRzIHNldCBpbiBwb3NpdGlvbnMgZGVmaW5lZCBieSBodHRfZGJnX3N0YXRzX3R5cGUKKyAqICAtIENGR19WQUwKKyAqICAgIEJpdHMgMjM6MAorICogICAgUHVycG9zZTogZ2l2ZSBhbiBvcGFxdWUgY29uZmlndXJhdGlvbiB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHN0YXRzIHR5cGUKKyAqICAgIFZhbHVlOiBzdGF0cy10eXBlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gdmFsdWUKKyAqICAgICAgICBpZiBzdGF0cyB0eXBlID09IHR4IFBQRFUgbG9nLCB0aGVuIENPTkZJR19WQUwgaGFzIHRoZSBmb3JtYXQ6CisgKiAgICAgICAgICAgIGJpdHMgIDc6MCAgLSBob3cgbWFueSBwZXItTVBEVSBieXRlIGNvdW50cyB0byBpbmNsdWRlIGluIGEgcmVjb3JkCisgKiAgICAgICAgICAgIGJpdHMgMTU6OCAgLSBob3cgbWFueSBwZXItTVBEVSBNU0RVIGNvdW50cyB0byBpbmNsdWRlIGluIGEgcmVjb3JkCisgKiAgICAgICAgICAgIGJpdHMgMjM6MTYgLSBob3cgbWFueSBwZXItTVNEVSBieXRlIGNvdW50cyB0byBpbmNsdWRlIGluIGEgcmVjb3JkCisgKiAgLSBDRkdfU1RBVF9UWVBFCisgKiAgICBCaXRzIDMxOjI0CisgKiAgICBQdXJwb3NlOiBzcGVjaWZ5IHdoaWNoIHN0YXRzIHR5cGUgKGlmIGFueSkgdGhlIGNvbmZpZyB2YWx1ZSBhcHBsaWVzIHRvCisgKiAgICBWYWx1ZTogaHR0X2RiZ19zdGF0c190eXBlIHZhbHVlLCBvciAweGZmIGlmIHRoZSBtZXNzYWdlIGRvZXNuJ3QgaGF2ZQorICogICAgICAgIGEgdmFsaWQgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uCisgKiAgLSBDT09LSUVfTFNCUworICogICAgQml0cyAzMTowCisgKiAgICBQdXJwb3NlOiBQcm92aWRlIGEgbWVjaGFuaXNtIHRvIG1hdGNoIGEgdGFyZ2V0LT5ob3N0IHN0YXRzIGNvbmZpcm1hdGlvbgorICogICAgICAgIG1lc3NhZ2Ugd2l0aCBpdHMgcHJlY2VkaW5nIGhvc3QtPnRhcmdldCBzdGF0cyByZXF1ZXN0IG1lc3NhZ2UuCisgKiAgICBWYWx1ZTogTFNCcyBvZiB0aGUgb3BhcXVlIGNvb2tpZSBzcGVjaWZpZWQgYnkgdGhlIGhvc3Qtc2lkZSByZXF1ZXN0b3IKKyAqICAtIENPT0tJRV9NU0JTCisgKiAgICBCaXRzIDMxOjAKKyAqICAgIFB1cnBvc2U6IFByb3ZpZGUgYSBtZWNoYW5pc20gdG8gbWF0Y2ggYSB0YXJnZXQtPmhvc3Qgc3RhdHMgY29uZmlybWF0aW9uCisgKiAgICAgICAgbWVzc2FnZSB3aXRoIGl0cyBwcmVjZWRpbmcgaG9zdC0+dGFyZ2V0IHN0YXRzIHJlcXVlc3QgbWVzc2FnZS4KKyAqICAgIFZhbHVlOiBNU0JzIG9mIHRoZSBvcGFxdWUgY29va2llIHNwZWNpZmllZCBieSB0aGUgaG9zdC1zaWRlIHJlcXVlc3RvcgorICovCisKKyNkZWZpbmUgSFRUX0gyVF9TVEFUU19SRVFfTVNHX1NaICAgICAgICAgICAgICAgICAgICAyMAkvKiBieXRlcyAqLworCisjZGVmaW5lIEhUVF9IMlRfU1RBVFNfUkVRX0NGR19TVEFUX1RZUEVfSU5WQUxJRCAgICAgMHhmZgorCisjZGVmaW5lIEhUVF9IMlRfU1RBVFNfUkVRX1VQTE9BRF9UWVBFU19NICAgICAgICAgICAgMHhmZmZmZmYwMAorI2RlZmluZSBIVFRfSDJUX1NUQVRTX1JFUV9VUExPQURfVFlQRVNfUyAgICAgICAgICAgIDgKKworI2RlZmluZSBIVFRfSDJUX1NUQVRTX1JFUV9SRVNFVF9UWVBFU19NICAgICAgICAgICAgIDB4ZmZmZmZmMDAKKyNkZWZpbmUgSFRUX0gyVF9TVEFUU19SRVFfUkVTRVRfVFlQRVNfUyAgICAgICAgICAgICA4CisKKyNkZWZpbmUgSFRUX0gyVF9TVEFUU19SRVFfQ0ZHX1ZBTF9NICAgICAgICAgICAgICAgICAweDAwZmZmZmZmCisjZGVmaW5lIEhUVF9IMlRfU1RBVFNfUkVRX0NGR19WQUxfUyAgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9IMlRfU1RBVFNfUkVRX0NGR19TVEFUX1RZUEVfTSAgICAgICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBIVFRfSDJUX1NUQVRTX1JFUV9DRkdfU1RBVF9UWVBFX1MgICAgICAgICAgIDI0CisKKyNkZWZpbmUgSFRUX0gyVF9TVEFUU19SRVFfVVBMT0FEX1RZUEVTX0dFVChfdmFyKQlcCisJKCgoX3ZhcikgJiBIVFRfSDJUX1NUQVRTX1JFUV9VUExPQURfVFlQRVNfTSkgPj4JXAorCSBIVFRfSDJUX1NUQVRTX1JFUV9VUExPQURfVFlQRVNfUykKKyNkZWZpbmUgSFRUX0gyVF9TVEFUU19SRVFfVVBMT0FEX1RZUEVTX1NFVChfdmFyLCBfdmFsKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9IMlRfU1RBVFNfUkVRX1VQTE9BRF9UWVBFUywgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9IMlRfU1RBVFNfUkVRX1VQTE9BRF9UWVBFU19TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9IMlRfU1RBVFNfUkVRX1JFU0VUX1RZUEVTX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX0gyVF9TVEFUU19SRVFfUkVTRVRfVFlQRVNfTSkgPj4gIFwKKwkgSFRUX0gyVF9TVEFUU19SRVFfUkVTRVRfVFlQRVNfUykKKyNkZWZpbmUgSFRUX0gyVF9TVEFUU19SRVFfUkVTRVRfVFlQRVNfU0VUKF92YXIsIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0gyVF9TVEFUU19SRVFfUkVTRVRfVFlQRVMsIF92YWwpOwlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfSDJUX1NUQVRTX1JFUV9SRVNFVF9UWVBFU19TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9IMlRfU1RBVFNfUkVRX0NGR19WQUxfR0VUKF92YXIpCQlcCisJKCgoX3ZhcikgJiBIVFRfSDJUX1NUQVRTX1JFUV9DRkdfVkFMX00pID4+CVwKKwkgSFRUX0gyVF9TVEFUU19SRVFfQ0ZHX1ZBTF9TKQorI2RlZmluZSBIVFRfSDJUX1NUQVRTX1JFUV9DRkdfVkFMX1NFVChfdmFyLCBfdmFsKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9IMlRfU1RBVFNfUkVRX0NGR19WQUwsIF92YWwpOwlcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfSDJUX1NUQVRTX1JFUV9DRkdfVkFMX1MpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX0gyVF9TVEFUU19SRVFfQ0ZHX1NUQVRfVFlQRV9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9IMlRfU1RBVFNfUkVRX0NGR19TVEFUX1RZUEVfTSkgPj4JXAorCSBIVFRfSDJUX1NUQVRTX1JFUV9DRkdfU1RBVF9UWVBFX1MpCisjZGVmaW5lIEhUVF9IMlRfU1RBVFNfUkVRX0NGR19TVEFUX1RZUEVfU0VUKF92YXIsIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0gyVF9TVEFUU19SRVFfQ0ZHX1NUQVRfVFlQRSwgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9IMlRfU1RBVFNfUkVRX0NGR19TVEFUX1RZUEVfUykpOyBcCisJfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgaG9zdCAtPiB0YXJnZXQgSFRUIG91dC1vZi1iYW5kIHN5bmMgcmVxdWVzdAorICoKKyAqIEBkZXRhaWxzCisgKiAgVGhlIEhUVCBTWU5DIHRlbGxzIHRoZSB0YXJnZXQgdG8gc3VzcGVuZCBwcm9jZXNzaW5nIG9mIHN1YnNlcXVlbnQKKyAqICBIVFQgaG9zdC10by10YXJnZXQgbWVzc2FnZXMgdW50aWwgc29tZSBvdGhlciB0YXJnZXQgYWdlbnQgbG9jYWxseQorICogIGluZm9ybXMgdGhlIHRhcmdldCBIVFQgRlcgdGhhdCB0aGUgY3VycmVudCBzeW5jIGNvdW50ZXIgaXMgZXF1YWwgdG8KKyAqICBvciBncmVhdGVyIHRoYW4gKGluIGEgbW9kdWxvIHNlbnNlKSB0aGUgc3luYyBjb3VudGVyIHNwZWNpZmllZCBpbgorICogIHRoZSBTWU5DIG1lc3NhZ2UuCisgKiAgVGhpcyBhbGxvd3Mgb3RoZXIgaG9zdC10YXJnZXQgY29tcG9uZW50cyB0byBzeW5jaHJvbml6ZSB0aGVpciBvcGVyYXRpb24KKyAqICB3aXRoIEhUVCwgZS5nLiB0byBlbnN1cmUgdGhhdCB0eCBmcmFtZXMgZG9uJ3QgZ2V0IHRyYW5zbWl0dGVkIHVudGlsIGEKKyAqICBzZWN1cml0eSBrZXkgaGFzIGJlZW4gZG93bmxvYWRlZCB0byBhbmQgYWN0aXZhdGVkIGJ5IHRoZSB0YXJnZXQuCisgKiAgSW4gdGhlIGFic2VuY2Ugb2YgYW55IGV4cGxpY2l0IHN5bmNocm9uaXphdGlvbiBjb3VudGVyIHZhbHVlCisgKiAgc3BlY2lmaWNhdGlvbiwgdGhlIHRhcmdldCBIVFQgRlcgd2lsbCB1c2UgemVybyBhcyB0aGUgZGVmYXVsdCBjdXJyZW50CisgKiAgc3luYyB2YWx1ZS4KKyAqCisgKiB8MzEgICAgICAgICAgMjR8MjMgICAgICAgICAgMTZ8MTUgICAgICAgICAgIDh8NyAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICB8ICBzeW5jIGNvdW50ICB8ICAgbXNnIHR5cGUgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiBIZWFkZXIgZmllbGRzOgorICogIC0gTVNHX1RZUEUKKyAqICAgIEJpdHMgNzowCisgKiAgICBQdXJwb3NlOiBpZGVudGlmaWVzIHRoaXMgYXMgYSBzeW5jIG1lc3NhZ2UKKyAqICAgIFZhbHVlOiAweDQKKyAqICAtIFNZTkNfQ09VTlQKKyAqICAgIEJpdHMgMTU6OAorICogICAgUHVycG9zZTogc3BlY2lmaWVzIHdoYXQgc3luYyB2YWx1ZSB0aGUgSFRUIEZXIHdpbGwgd2FpdCBmb3IgZnJvbQorICogICAgICAgIGFuIG91dC1vZi1iYW5kIHNwZWNpZmljYXRpb24gdG8gcmVzdW1lIGl0cyBvcGVyYXRpb24KKyAqICAgIFZhbHVlOiBpbi1iYW5kIHN5bmMgY291bnRlciB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3QgdGhlIG91dC1vZi1iYW5kCisgKiAgICAgICAgY291bnRlciBzcGVjLgorICogICAgICAgIFRoZSBIVFQgdGFyZ2V0IEZXIHdpbGwgc3VzcGVuZCBpdHMgaG9zdC0+dGFyZ2V0IG1lc3NhZ2UgcHJvY2Vzc2luZworICogICAgICAgIGFzIGxvbmcgYXMKKyAqICAgICAgICAwIDwgKGluLWJhbmQgc3luYyBjb3VudGVyIC0gb3V0LW9mLWJhbmQgc3luYyBjb3VudGVyKSAmIDB4ZmYgPCAxMjgKKyAqLworCisjZGVmaW5lIEhUVF9IMlRfU1lOQ19NU0dfU1ogICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBIVFRfSDJUX1NZTkNfQ09VTlRfTSAgICAgICAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhUVF9IMlRfU1lOQ19DT1VOVF9TICAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBIVFRfSDJUX1NZTkNfQ09VTlRfR0VUKF92YXIpCQlcCisJKCgoX3ZhcikgJiBIVFRfSDJUX1NZTkNfQ09VTlRfTSkgPj4gICAgIFwKKwkgSFRUX0gyVF9TWU5DX0NPVU5UX1MpCisjZGVmaW5lIEhUVF9IMlRfU1lOQ19DT1VOVF9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9IMlRfU1lOQ19DT1VOVCwgX3ZhbCk7CVwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9IMlRfU1lOQ19DT1VOVF9TKSk7CVwKKwl9IHdoaWxlICgwKQorCisKKy8qKgorICogQGJyaWVmIEhUVCBhZ2dyZWdhdGlvbiBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgSFRUX0FHR1JfQ0ZHX01TR19TWiAgICAgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBIVFRfQUdHUl9DRkdfTUFYX05VTV9BTVBEVV9TVUJGUk1fTSAgICAgMHhmZjAwCisjZGVmaW5lIEhUVF9BR0dSX0NGR19NQVhfTlVNX0FNUERVX1NVQkZSTV9TICAgICA4CisjZGVmaW5lIEhUVF9BR0dSX0NGR19NQVhfTlVNX0FNU0RVX1NVQkZSTV9NICAgICAweDFmMDAwMAorI2RlZmluZSBIVFRfQUdHUl9DRkdfTUFYX05VTV9BTVNEVV9TVUJGUk1fUyAgICAgMTYKKworI2RlZmluZSBIVFRfQUdHUl9DRkdfTUFYX05VTV9BTVBEVV9TVUJGUk1fR0VUKF92YXIpCQlcCisJKCgoX3ZhcikgJiBIVFRfQUdHUl9DRkdfTUFYX05VTV9BTVBEVV9TVUJGUk1fTSkgPj4JXAorCSBIVFRfQUdHUl9DRkdfTUFYX05VTV9BTVBEVV9TVUJGUk1fUykKKyNkZWZpbmUgSFRUX0FHR1JfQ0ZHX01BWF9OVU1fQU1QRFVfU1VCRlJNX1NFVChfdmFyLCBfdmFsKQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0FHR1JfQ0ZHX01BWF9OVU1fQU1QRFVfU1VCRlJNLCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX0FHR1JfQ0ZHX01BWF9OVU1fQU1QRFVfU1VCRlJNX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX0FHR1JfQ0ZHX01BWF9OVU1fQU1TRFVfU1VCRlJNX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX0FHR1JfQ0ZHX01BWF9OVU1fQU1TRFVfU1VCRlJNX00pID4+CVwKKwkgSFRUX0FHR1JfQ0ZHX01BWF9OVU1fQU1TRFVfU1VCRlJNX1MpCisjZGVmaW5lIEhUVF9BR0dSX0NGR19NQVhfTlVNX0FNU0RVX1NVQkZSTV9TRVQoX3ZhciwgX3ZhbCkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9BR0dSX0NGR19NQVhfTlVNX0FNU0RVX1NVQkZSTSwgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9BR0dSX0NGR19NQVhfTlVNX0FNU0RVX1NVQkZSTV9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisKKy8qKgorICogQGJyaWVmIGhvc3QgLT4gdGFyZ2V0IEhUVCBjb25maWd1cmUgbWF4IGFtc2R1IGluZm8gcGVyIHZkZXYKKyAqCisgKiBAZGV0YWlscworICogIFRoZSBIVFQgQUdHUiBDRkcgRVggdGVsbHMgdGhlIHRhcmdldCB0byBjb25maWd1cmUgbWF4X2Ftc2R1IGluZm8gcGVyIHZkZXYKKyAqCisgKiB8MzEgICAgICAgICAgICAgMjF8MjAgICAgICAgMTZ8MTUgICAgICAgICAgIDh8NyAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgIHJlc2VydmVkICB8IHZkZXYgaWQgICB8ICAgbWF4IGFtc2R1ICB8ICAgbXNnIHR5cGUgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiBIZWFkZXIgZmllbGRzOgorICogIC0gTVNHX1RZUEUKKyAqICAgIEJpdHMgNzowCisgKiAgICBQdXJwb3NlOiBpZGVudGlmaWVzIHRoaXMgYXMgYSBhZ2dyIGNmZyBleCBtZXNzYWdlCisgKiAgICBWYWx1ZTogMHhhCisgKiAgLSBNQVhfTlVNX0FNU0RVX1NVQkZSTQorICogICAgQml0cyAxNTo4CisgKiAgICBQdXJwb3NlOiBtYXggTVNEVXMgcGVyIEEtTVNEVQorICogIC0gVkRFVl9JRAorICogICAgQml0cyAyMDoxNgorICogICAgUHVycG9zZTogSUQgb2YgdGhlIHZkZXYgdG8gd2hpY2ggdGhpcyBsaW1pdCBpcyBhcHBsaWVkCisgKi8KKyNkZWZpbmUgSFRUX0FHR1JfQ0ZHX0VYX01TR19TWiAgICAgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBIVFRfQUdHUl9DRkdfRVhfTUFYX05VTV9BTVNEVV9TVUJGUk1fTSAgICAgMHhmZjAwCisjZGVmaW5lIEhUVF9BR0dSX0NGR19FWF9NQVhfTlVNX0FNU0RVX1NVQkZSTV9TICAgICA4CisjZGVmaW5lIEhUVF9BR0dSX0NGR19FWF9WREVWX0lEX00gICAgICAgICAgICAgICAgICAweDFmMDAwMAorI2RlZmluZSBIVFRfQUdHUl9DRkdfRVhfVkRFVl9JRF9TICAgICAgICAgICAgICAgICAgMTYKKworI2RlZmluZSBIVFRfQUdHUl9DRkdfRVhfTUFYX05VTV9BTVNEVV9TVUJGUk1fR0VUKF92YXIpCQlcCisJKCgoX3ZhcikgJiBIVFRfQUdHUl9DRkdfRVhfTUFYX05VTV9BTVNEVV9TVUJGUk1fTSkgPj4JXAorCSBIVFRfQUdHUl9DRkdfRVhfTUFYX05VTV9BTVNEVV9TVUJGUk1fUykKKyNkZWZpbmUgSFRUX0FHR1JfQ0ZHX0VYX01BWF9OVU1fQU1TRFVfU1VCRlJNX1NFVChfdmFyLCBfdmFsKQkJXAorZG8gewkJCQkJCQkJXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9BR0dSX0NGR19FWF9NQVhfTlVNX0FNU0RVX1NVQkZSTSwgX3ZhbCk7IFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX0FHR1JfQ0ZHX0VYX01BWF9OVU1fQU1TRFVfU1VCRlJNX1MpKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfQUdHUl9DRkdfRVhfVkRFVl9JRF9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9BR0dSX0NGR19FWF9WREVWX0lEX00pID4+CVwKKwkgSFRUX0FHR1JfQ0ZHX0VYX1ZERVZfSURfUykKKyNkZWZpbmUgSFRUX0FHR1JfQ0ZHX0VYX1ZERVZfSURfU0VUKF92YXIsIF92YWwpCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfQUdHUl9DRkdfRVhfVkRFVl9JRCwgX3ZhbCk7CVwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX0FHR1JfQ0ZHX0VYX1ZERVZfSURfUykpOwlcCit9IHdoaWxlICgwKQorCisvKioKKyAqIEBicmllZiBIVFQgV0RJX0lQQSBDb25maWcgTWVzc2FnZQorICoKKyAqIEBkZXRhaWxzCisgKiAgVGhlIEhUVCBXRElfSVBBIGNvbmZpZyBtZXNzYWdlIGlzIGNyZWF0ZWQvc2VudCBieSBob3N0IGF0IGRyaXZlcgorICogIGluaXQgdGltZS4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgb24KKyAqICBXRElfSVBBIFRYIGFuZCBSWCBwYXRoLgorICogIFRYIENFIHJpbmcgaXMgdXNlZCBmb3IgcHVzaGluZyBwYWNrZXQgbWV0YWRhdGEgZnJvbSBJUEEgdUMKKyAqICB0byBXTEFOIEZXCisgKiAgVFggQ29tcGxldGlvbiByaW5nIGlzIHVzZWQgZm9yIGdlbmVyYXRpbmcgVFggY29tcGxldGlvbnMgZnJvbQorICogIFdMQU4gRlcgdG8gSVBBIHVDCisgKiAgUlggSW5kaWNhdGlvbiByaW5nIGlzIHVzZWQgZm9yIGluZGljYXRpbmcgUlggcGFja2V0cyBmcm9tIEZXCisgKiAgdG8gSVBBIHVDCisgKiAgUlggUmluZzIgaXMgdXNlZCBhcyBlaXRoZXIgY29tcGxldGlvbiByaW5nIG9yIGFzIHNlY29uZAorICogIGluZGljYXRpb24gcmluZy4gd2hlbiBSaW5nMiBpcyB1c2VkIGFzIGNvbXBsZXRpb24gcmluZywgSVBBIHVDCisgKiAgcHV0cyBjb21wbGV0ZWQgUlggcGFja2V0IG1ldGEgZGF0YSB0byBSaW5nMi4gd2hlbiBSaW5nMiBpcyB1c2VkCisgKiAgYXMgc2Vjb25kIGluZGljYXRpb24gcmluZywgUlggcGFja2V0cyBmb3IgTFRFLVdMQU4gYWdncmVnYXRpb24gYXJlCisgKiAgaW5kaWNhdGVkIGluIFJpbmcyLCBvdGhlciBSWCBwYWNrZXRzIChlLmcuIGhvdHNwb3QgcmVsYXRlZCkgYXJlCisgKiAgaW5kaWNhdGVkIGluIFJYIEluZGljYXRpb24gcmluZy4gUGxlYXNlIHNlZSBXRElfSVBBIHNwZWNpZmljYXRpb24KKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgIHwzMSAgICAgICAgICAgIDI0fDIzICAgICAgICAgICAgMTZ8MTUgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgICAwfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgIHR4IHBrdCBwb29sIHNpemUgICAgICAgICB8ICAgICAgUnN2ZCAgICAgIHwgICAgIG1zZ190eXBlICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgICAgIHR4IGNvbXAgcmluZyBiYXNlIChiaXRzIDMxOjApICAgICAgICAgICAgICAgICAgICAgfAorI2lmIEhUVF9QQUREUjY0CisgKiAgICAgfCAgICAgICAgICAgICAgICAgdHggY29tcCByaW5nIGJhc2UgKGJpdHMgNjM6MzIpICAgICAgICAgICAgICAgICAgICB8CisjZW5kaWYKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHR4IGNvbXAgcmluZyBzaXplICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgdHggY29tcCBXUl9JRFggcGh5c2ljYWwgYWRkcmVzcyAoYml0cyAzMTowKSAgICAgICAgICAgIHwKKyNpZiBIVFRfUEFERFI2NAorICogICAgIHwgICAgICAgICAgICB0eCBjb21wIFdSX0lEWCBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDYzOjMyKSAgICAgICAgICAgfAorI2VuZGlmCisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgfCAgICAgICAgICAgIHR4IENFIFdSX0lEWCBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDMxOjApICAgICAgICAgICAgICB8CisjaWYgSFRUX1BBRERSNjQKKyAqICAgICB8ICAgICAgICAgICAgdHggQ0UgV1JfSURYIHBoeXNpY2FsIGFkZHJlc3MgKGJpdHMgNjM6MzIpICAgICAgICAgICAgIHwKKyNlbmRpZgorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgcnggaW5kaWNhdGlvbiByaW5nIGJhc2UgKGJpdHMgMzE6MCkgICAgICAgICAgICAgICAgICAgfAorI2lmIEhUVF9QQUREUjY0CisgKiAgICAgfCAgICAgICAgICAgICByeCBpbmRpY2F0aW9uIHJpbmcgYmFzZSAoYml0cyA2MzozMikgICAgICAgICAgICAgICAgICB8CisjZW5kaWYKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHJ4IGluZGljYXRpb24gcmluZyBzaXplICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgIHJ4IGluZCBSRF9JRFggcGh5c2ljYWwgYWRkcmVzcyAoYml0cyAzMTowKSAgICAgICAgICAgIHwKKyNpZiBIVFRfUEFERFI2NAorICogICAgIHwgICAgICAgICAgICAgcnggaW5kIFJEX0lEWCBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDYzOjMyKSAgICAgICAgICAgfAorI2VuZGlmCisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgfCAgICAgICAgICAgICByeCBpbmQgV1JfSURYIHBoeXNpY2FsIGFkZHJlc3MgKGJpdHMgMzE6MCkgICAgICAgICAgICB8CisjaWYgSFRUX1BBRERSNjQKKyAqICAgICB8ICAgICAgICAgICAgIHJ4IGluZCBXUl9JRFggcGh5c2ljYWwgYWRkcmVzcyAoYml0cyA2MzozMikgICAgICAgICAgIHwKKyNlbmRpZgorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgICAgICAgIHJ4IHJpbmcyIGJhc2UgKGJpdHMgMzE6MCkgICAgICAgICAgICAgICAgICAgICAgfAorI2lmIEhUVF9QQUREUjY0CisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgcnggcmluZzIgYmFzZSAoYml0cyA2MzozMikgICAgICAgICAgICAgICAgICAgICB8CisjZW5kaWYKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgcnggcmluZzIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgIHJ4IHJpbmcyIFJEX0lEWCBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDMxOjApICAgICAgICAgIHwKKyNpZiBIVFRfUEFERFI2NAorICogICAgIHwgICAgICAgICAgICAgcnggcmluZzIgUkRfSURYIHBoeXNpY2FsIGFkZHJlc3MgKGJpdHMgNjM6MzIpICAgICAgICAgfAorI2VuZGlmCisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgfCAgICAgICAgICAgICByeCByaW5nMiBXUl9JRFggcGh5c2ljYWwgYWRkcmVzcyAoYml0cyAzMTowKSAgICAgICAgICB8CisjaWYgSFRUX1BBRERSNjQKKyAqICAgICB8ICAgICAgICAgICAgIHJ4IHJpbmcyIFdSX0lEWCBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDYzOjMyKSAgICAgICAgIHwKKyNlbmRpZgorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICoKKyAqIEhlYWRlciBmaWVsZHM6CisgKiBIZWFkZXIgZmllbGRzOgorICogICAtIE1TR19UWVBFCisgKiAgICAgQml0cyA3OjAKKyAqICAgICBQdXJwb3NlOiBJZGVudGlmaWVzIHRoaXMgYXMgV0RJX0lQQSBjb25maWcgbWVzc2FnZQorICogICAgIHZhbHVlOiA9IDB4OAorICogICAtIFRYX1BLVF9QT09MX1NJWkUKKyAqICAgICBCaXRzIDE1OjAKKyAqICAgICBQdXJwb3NlOiBUb3RhbCBudW1iZXIgb2YgVFggcGFja2V0IGJ1ZmZlciBwb29sIGFsbG9jYXRlZCBieSBIb3N0IGZvcgorICogICAgICAgICAgICAgIFdESV9JUEEgVFggcGF0aAorICogICBGb3Igc3lzdGVtcyB1c2luZyAzMi1iaXQgZm9ybWF0IGZvciBidXMgYWRkcmVzc2VzOgorICogICAtIFRYX0NPTVBfUklOR19CQVNFX0FERFIKKyAqICAgICBCaXRzIDMxOjAKKyAqICAgICBQdXJwb3NlOiBUWCBDb21wbGV0aW9uIFJpbmcgYmFzZSBhZGRyZXNzIGluIEREUgorICogICAtIFRYX0NPTVBfUklOR19TSVpFCisgKiAgICAgQml0cyAzMTowCisgKiAgICAgUHVycG9zZTogVFggQ29tcGxldGlvbiBSaW5nIHNpemUgKG11c3QgYmUgcG93ZXIgb2YgMikKKyAqICAgLSBUWF9DT01QX1dSX0lEWF9BRERSCisgKiAgICAgQml0cyAzMTowCisgKiAgICAgUHVycG9zZTogSVBBIGRvb3JiZWxsIHJlZ2lzdGVyIGFkZHJlc3MgT1IgRERSIGFkZHJlc3Mgd2hlcmUgV0lGSSBGVworICogICAgICAgICAgICAgIHVwZGF0ZXMgdGhlIFdyaXRlIEluZGV4IGZvciBXRElfSVBBIFRYIGNvbXBsZXRpb24gcmluZworICogICAtIFRYX0NFX1dSX0lEWF9BRERSCisgKiAgICAgQml0cyAzMTowCisgKiAgICAgUHVycG9zZTogRERSIGFkZHJlc3Mgd2hlcmUgSVBBIHVDCisgKiAgICAgICAgICAgICAgdXBkYXRlcyB0aGUgV1IgSW5kZXggZm9yIFRYIENFIHJpbmcKKyAqICAgICAgICAgICAgICAobmVlZGVkIGZvciBmdXNpb24gcGxhdGZvcm1zKQorICogICAtIFJYX0lORF9SSU5HX0JBU0VfQUREUgorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IFJYIEluZGljYXRpb24gUmluZyBiYXNlIGFkZHJlc3MgaW4gRERSCisgKiAgIC0gUlhfSU5EX1JJTkdfU0laRQorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IFJYIEluZGljYXRpb24gUmluZyBzaXplCisgKiAgIC0gUlhfSU5EX1JEX0lEWF9BRERSCisgKiAgICAgQml0cyAzMTowCisgKiAgICAgUHVycG9zZTogRERSIGFkZHJlc3Mgd2hlcmUgSVBBIHVDIHVwZGF0ZXMgdGhlIFJlYWQgSW5kZXggZm9yIFdESV9JUEEKKyAqICAgICAgICAgICAgICBSWCBpbmRpY2F0aW9uIHJpbmcKKyAqICAgLSBSWF9JTkRfV1JfSURYX0FERFIKKyAqICAgICBCaXRzIDMxOjAKKyAqICAgICBQdXJwb3NlOiBJUEEgZG9vcmJlbGwgcmVnaXN0ZXIgYWRkcmVzcyBPUiBERFIgYWRkcmVzcyB3aGVyZSBXSUZJIEZXCisgKiAgICAgICAgICAgICAgdXBkYXRlcyB0aGUgV3JpdGUgSW5kZXggZm9yIFdESV9JUEEgUlggaW5kaWNhdGlvbiByaW5nCisgKiAgICAgLSBSWF9SSU5HMl9CQVNFX0FERFIKKyAqICAgICAgIEJpdHMgMzE6MAorICogICAgICAgUHVycG9zZTogU2Vjb25kIFJYIFJpbmcoSW5kaWNhdGlvbiBvciBjb21wbGV0aW9uKWJhc2UgYWRkcmVzcyBpbiBERFIKKyAqICAgICAtIFJYX1JJTkcyX1NJWkUKKyAqICAgICAgIEJpdHMgMzE6MAorICogICAgICAgUHVycG9zZTogU2Vjb25kIFJYICBSaW5nIHNpemUgKG11c3QgYmUgPj0gUlhfSU5EX1JJTkdfU0laRSkKKyAqICAgICAtIFJYX1JJTkcyX1JEX0lEWF9BRERSCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IElmIFNlY29uZCBSWCByaW5nIGlzIEluZGljYXRpb24gcmluZywgRERSIGFkZHJlc3Mgd2hlcmUKKyAqICAgICAgICAgICAgICAgIElQQSB1QyB1cGRhdGVzIHRoZSBSZWFkIEluZGV4IGZvciBSaW5nMi4KKyAqICAgICAgICAgICAgICAgIElmIFNlY29uZCBSWCByaW5nIGlzIGNvbXBsZXRpb24gcmluZywgdGhpcyBpcyBOT1QgdXNlZAorICogICAgIC0gUlhfUklORzJfV1JfSURYX0FERFIKKyAqICAgICAgIEJpdHMgMzE6MAorICogICAgICAgUHVycG9zZTogSWYgU2Vjb25kIFJYIHJpbmcgaXMgSW5kaWNhdGlvbiByaW5nLCAgRERSIGFkZHJlc3Mgd2hlcmUKKyAqICAgICAgICAgICAgICAgIFdJRkkgRlcgdXBkYXRlcyB0aGUgV3JpdGUgSW5kZXggZm9yIFdESV9JUEEgUlggcmluZzIKKyAqICAgICAgICAgICAgICAgIElmIHNlY29uZCBSWCByaW5nIGlzIGNvbXBsZXRpb24gcmluZywgRERSIGFkZHJlc3Mgd2hlcmUKKyAqICAgICAgICAgICAgICAgIElQQSB1QyB1cGRhdGVzIHRoZSBXcml0ZSBJbmRleCBmb3IgUmluZyAyLgorICogICBGb3Igc3lzdGVtcyB1c2luZyA2NC1iaXQgZm9ybWF0IGZvciBidXMgYWRkcmVzc2VzOgorICogICAgIC0gVFhfQ09NUF9SSU5HX0JBU0VfQUREUl9MTworICogICAgICAgQml0cyAzMTowCisgKiAgICAgICBQdXJwb3NlOiBMb3dlciA0IGJ5dGVzIG9mIFRYIENvbXBsZXRpb24gUmluZyBiYXNlIHBoeXNpY2FsCisgKiAgICAgICBhZGRyZXNzIGluIEREUgorICogICAgIC0gVFhfQ09NUF9SSU5HX0JBU0VfQUREUl9ISQorICogICAgICAgQml0cyAzMTowCisgKiAgICAgICBQdXJwb3NlOiBIaWdoZXIgNCBieXRlcyBvZiBUWCBDb21wbGV0aW9uIFJpbmcgYmFzZSBwaHlzaWNhbAorICogICAgICAgYWRkcmVzcyBpbiBERFIKKyAqICAgICAtIFRYX0NPTVBfUklOR19TSVpFCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IFRYIENvbXBsZXRpb24gUmluZyBzaXplIChtdXN0IGJlIHBvd2VyIG9mIDIpCisgKiAgICAgLSBUWF9DT01QX1dSX0lEWF9BRERSX0xPCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IExvd2VyIDQgYnl0ZXMgb2YgSVBBIGRvb3JiZWxsIHJlZ2lzdGVyIGFkZHJlc3MgT1IKKyAqICAgICAgICAgICAgICAgIExvd2VyIDQgYnl0ZXMgb2YgRERSIGFkZHJlc3Mgd2hlcmUgV0lGSSBGVworICogICAgICAgICAgICAgICAgdXBkYXRlcyB0aGUgV3JpdGUgSW5kZXggZm9yIFdESV9JUEEgVFggY29tcGxldGlvbiByaW5nCisgKiAgICAgLSBUWF9DT01QX1dSX0lEWF9BRERSX0hJCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IEhpZ2hlciA0IGJ5dGVzIG9mIElQQSBkb29yYmVsbCByZWdpc3RlciBhZGRyZXNzIE9SCisgKiAgICAgICAgICAgICAgICBIaWdoZXIgNCBieXRlcyBvZiBERFIgYWRkcmVzcyB3aGVyZSBXSUZJIEZXCisgKiAgICAgICAgICAgICAgICB1cGRhdGVzIHRoZSBXcml0ZSBJbmRleCBmb3IgV0RJX0lQQSBUWCBjb21wbGV0aW9uIHJpbmcKKyAqICAgICAtIFRYX0NFX1dSX0lEWF9BRERSX0xPCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IExvd2VyIDQgYnl0ZXMgb2YgRERSIGFkZHJlc3Mgd2hlcmUgSVBBIHVDCisgKiAgICAgICAgICAgICAgICB1cGRhdGVzIHRoZSBXUiBJbmRleCBmb3IgVFggQ0UgcmluZworICogICAgICAgICAgICAgICAgKG5lZWRlZCBmb3IgZnVzaW9uIHBsYXRmb3JtcykKKyAqICAgICAtIFRYX0NFX1dSX0lEWF9BRERSX0hJCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IEhpZ2hlciA0IGJ5dGVzIG9mIEREUiBhZGRyZXNzIHdoZXJlIElQQSB1QworICogICAgICAgICAgICAgICAgdXBkYXRlcyB0aGUgV1IgSW5kZXggZm9yIFRYIENFIHJpbmcKKyAqICAgICAgICAgICAgICAgIChuZWVkZWQgZm9yIGZ1c2lvbiBwbGF0Zm9ybXMpCisgKiAgICAgLSBSWF9JTkRfUklOR19CQVNFX0FERFJfTE8KKyAqICAgICAgIEJpdHMgMzE6MAorICogICAgICAgUHVycG9zZTogTG93ZXIgNCBieXRlcyBvZiBSWCBJbmRpY2F0aW9uIFJpbmcgYmFzZSBhZGRyZXNzIGluIEREUgorICogICAgIC0gUlhfSU5EX1JJTkdfQkFTRV9BRERSX0hJCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IEhpZ2hlciA0IGJ5dGVzIG9mIFJYIEluZGljYXRpb24gUmluZyBiYXNlIGFkZHJlc3MgaW4gRERSCisgKiAgICAgLSBSWF9JTkRfUklOR19TSVpFCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IFJYIEluZGljYXRpb24gUmluZyBzaXplCisgKiAgICAgLSBSWF9JTkRfUkRfSURYX0FERFJfTE8KKyAqICAgICAgIEJpdHMgMzE6MAorICogICAgICAgUHVycG9zZTogTG93ZXIgNCBieXRlcyBvZiBERFIgYWRkcmVzcyB3aGVyZSBJUEEgdUMgdXBkYXRlcyB0aGUKKyAqICAgICAgIFJlYWQgSW5kZXggZm9yIFdESV9JUEEgUlggaW5kaWNhdGlvbiByaW5nCisgKiAgICAgLSBSWF9JTkRfUkRfSURYX0FERFJfSEkKKyAqICAgICAgIEJpdHMgMzE6MAorICogICAgICAgUHVycG9zZTogSGlnaGVyIDQgYnl0ZXMgb2YgRERSIGFkZHJlc3Mgd2hlcmUgSVBBIHVDIHVwZGF0ZXMgdGhlCisgKiAgICAgICBSZWFkIEluZGV4IGZvciBXRElfSVBBIFJYIGluZGljYXRpb24gcmluZworICogICAgIC0gUlhfSU5EX1dSX0lEWF9BRERSX0xPCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IExvd2VyIDQgYnl0ZXMgb2YgSVBBIGRvb3JiZWxsIHJlZ2lzdGVyIGFkZHJlc3MgT1IKKyAqICAgICAgICAgICAgICAgIExvd2VyIDQgYnl0ZXMgb2YgRERSIGFkZHJlc3Mgd2hlcmUgV0lGSSBGVworICogICAgICAgICAgICAgICAgdXBkYXRlcyB0aGUgV3JpdGUgSW5kZXggZm9yIFdESV9JUEEgUlggaW5kaWNhdGlvbiByaW5nCisgKiAgICAgLSBSWF9JTkRfV1JfSURYX0FERFJfSEkKKyAqICAgICAgIEJpdHMgMzE6MAorICogICAgICAgUHVycG9zZTogSGlnaGVyIDQgYnl0ZXMgb2YgSVBBIGRvb3JiZWxsIHJlZ2lzdGVyIGFkZHJlc3MgT1IKKyAqICAgICAgICAgICAgICAgIEhpZ2hlciA0IGJ5dGVzIG9mIEREUiBhZGRyZXNzIHdoZXJlIFdJRkkgRlcKKyAqICAgICAgICAgICAgICAgIHVwZGF0ZXMgdGhlIFdyaXRlIEluZGV4IGZvciBXRElfSVBBIFJYIGluZGljYXRpb24gcmluZworICogICAgIC0gUlhfUklORzJfQkFTRV9BRERSX0xPCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IExvd2VyIDQgYnl0ZXMgb2YgU2Vjb25kIFJYIFJpbmcoSW5kaWNhdGlvbiBPUiBjb21wbGV0aW9uKQorICogICAgICAgYmFzZSBhZGRyZXNzIGluIEREUgorICogICAgIC0gUlhfUklORzJfQkFTRV9BRERSX0hJCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IEhpZ2hlciA0IGJ5dGVzIG9mIFNlY29uZCBSWCBSaW5nKEluZGljYXRpb24gT1IgY29tcGxldGlvbikKKyAqICAgICAgIGJhc2UgYWRkcmVzcyBpbiBERFIKKyAqICAgICAtIFJYX1JJTkcyX1NJWkUKKyAqICAgICAgIEJpdHMgMzE6MAorICogICAgICAgUHVycG9zZTogU2Vjb25kIFJYICBSaW5nIHNpemUgKG11c3QgYmUgPj0gUlhfSU5EX1JJTkdfU0laRSkKKyAqICAgICAtIFJYX1JJTkcyX1JEX0lEWF9BRERSX0xPCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IElmIFNlY29uZCBSWCByaW5nIGlzIEluZGljYXRpb24gcmluZywgbG93ZXIgNCBieXRlcyBvZgorICogICAgICAgICAgICAgICAgRERSIGFkZHJlc3Mgd2hlcmUgSVBBIHVDIHVwZGF0ZXMgdGhlIFJlYWQgSW5kZXggZm9yIFJpbmcyLgorICogICAgICAgICAgICAgICAgSWYgU2Vjb25kIFJYIHJpbmcgaXMgY29tcGxldGlvbiByaW5nLCB0aGlzIGlzIE5PVCB1c2VkCisgKiAgICAgLSBSWF9SSU5HMl9SRF9JRFhfQUREUl9ISQorICogICAgICAgQml0cyAzMTowCisgKiAgICAgICBQdXJwb3NlOiBJZiBTZWNvbmQgUlggcmluZyBpcyBJbmRpY2F0aW9uIHJpbmcsIGhpZ2hlciA0IGJ5dGVzIG9mCisgKiAgICAgICAgICAgICAgICBERFIgYWRkcmVzcyB3aGVyZSBJUEEgdUMgdXBkYXRlcyB0aGUgUmVhZCBJbmRleCBmb3IgUmluZzIuCisgKiAgICAgICAgICAgICAgICBJZiBTZWNvbmQgUlggcmluZyBpcyBjb21wbGV0aW9uIHJpbmcsIHRoaXMgaXMgTk9UIHVzZWQKKyAqICAgICAtIFJYX1JJTkcyX1dSX0lEWF9BRERSX0xPCisgKiAgICAgICBCaXRzIDMxOjAKKyAqICAgICAgIFB1cnBvc2U6IElmIFNlY29uZCBSWCByaW5nIGlzIEluZGljYXRpb24gcmluZywgbG93ZXIgNCBieXRlcyBvZgorICogICAgICAgICAgICAgICAgRERSIGFkZHJlc3Mgd2hlcmUgV0lGSSBGVyB1cGRhdGVzIHRoZSBXcml0ZSBJbmRleAorICogICAgICAgICAgICAgICAgZm9yIFdESV9JUEEgUlggcmluZzIKKyAqICAgICAgICAgICAgICAgIElmIHNlY29uZCBSWCByaW5nIGlzIGNvbXBsZXRpb24gcmluZywgbG93ZXIgNCBieXRlcyBvZgorICogICAgICAgICAgICAgICAgRERSIGFkZHJlc3Mgd2hlcmUgSVBBIHVDIHVwZGF0ZXMgdGhlIFdyaXRlIEluZGV4IGZvciBSaW5nIDIuCisgKiAgICAgLSBSWF9SSU5HMl9XUl9JRFhfQUREUl9ISQorICogICAgICAgQml0cyAzMTowCisgKiAgICAgICBQdXJwb3NlOiBJZiBTZWNvbmQgUlggcmluZyBpcyBJbmRpY2F0aW9uIHJpbmcsIGhpZ2hlciA0IGJ5dGVzIG9mCisgKiAgICAgICAgICAgICAgICBERFIgYWRkcmVzcyB3aGVyZSBXSUZJIEZXIHVwZGF0ZXMgdGhlIFdyaXRlIEluZGV4CisgKiAgICAgICAgICAgICAgICBmb3IgV0RJX0lQQSBSWCByaW5nMgorICogICAgICAgICAgICAgICAgSWYgc2Vjb25kIFJYIHJpbmcgaXMgY29tcGxldGlvbiByaW5nLCBoaWdoZXIgNCBieXRlcyBvZgorICogICAgICAgICAgICAgICAgRERSIGFkZHJlc3Mgd2hlcmUgSVBBIHVDIHVwZGF0ZXMgdGhlIFdyaXRlIEluZGV4IGZvciBSaW5nIDIuCisgKi8KKworI2lmIEhUVF9QQUREUjY0CisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19TWiAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4CS8qIGJ5dGVzICovCisjZWxzZQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfU1ogICAgICAgICAgICAgICAgICAgICAgICAgICA1MgkvKiBieXRlcyAqLworI2VuZGlmCisKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX1BLVF9QT09MX1NJWkVfTSAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfVFhfUEtUX1BPT0xfU0laRV9TICAgICAgICAgICAxNgorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfQkFTRV9BRERSX00gICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfUklOR19CQVNFX0FERFJfUyAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfQkFTRV9BRERSX0xPX00gIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfUklOR19CQVNFX0FERFJfTE9fUyAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfQkFTRV9BRERSX0hJX00gIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfUklOR19CQVNFX0FERFJfSElfUyAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfU0laRV9NICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfUklOR19TSVpFX1MgICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1dSX0lEWF9BRERSX00gICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfUyAgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1dSX0lEWF9BRERSX0xPX00gICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfTE9fUyAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1dSX0lEWF9BRERSX0hJX00gICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfSElfUyAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DRV9XUl9JRFhfQUREUl9NICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX1MgICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DRV9XUl9JRFhfQUREUl9MT19NICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX0xPX1MgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DRV9XUl9JRFhfQUREUl9ISV9NICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX0hJX1MgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUklOR19CQVNFX0FERFJfTSAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUl9TICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUklOR19CQVNFX0FERFJfTE9fTSAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUl9MT19TICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUklOR19CQVNFX0FERFJfSElfTSAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUl9ISV9TICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUklOR19TSVpFX00gICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX1NJWkVfUyAgICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFJfTSAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SRF9JRFhfQUREUl9TICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFJfTE9fTSAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SRF9JRFhfQUREUl9MT19TICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFJfSElfTSAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SRF9JRFhfQUREUl9ISV9TICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfV1JfSURYX0FERFJfTSAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9XUl9JRFhfQUREUl9TICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfV1JfSURYX0FERFJfTE9fTSAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9XUl9JRFhfQUREUl9MT19TICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfV1JfSURYX0FERFJfSElfTSAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9XUl9JRFhfQUREUl9ISV9TICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9CQVNFX0FERFJfTSAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX0JBU0VfQUREUl9TICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9CQVNFX0FERFJfTE9fTSAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX0JBU0VfQUREUl9MT19TICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9CQVNFX0FERFJfSElfTSAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX0JBU0VfQUREUl9ISV9TICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9TSVpFX00gICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1NJWkVfUyAgICAgICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9SRF9JRFhfQUREUl9NICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX1MgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9SRF9JRFhfQUREUl9MT19NICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX0xPX1MgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9SRF9JRFhfQUREUl9ISV9NICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX0hJX1MgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9XUl9JRFhfQUREUl9NICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1dSX0lEWF9BRERSX1MgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9XUl9JRFhfQUREUl9MT19NICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1dSX0lEWF9BRERSX0xPX1MgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9XUl9JRFhfQUREUl9ISV9NICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1dSX0lEWF9BRERSX0hJX1MgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9QS1RfUE9PTF9TSVpFX0dFVChfdmFyKQkJCVwKKwkoKChfdmFyKSAmIEhUVF9XRElfSVBBX0NGR19UWF9QS1RfUE9PTF9TSVpFX00pID4+CQlcCisJSFRUX1dESV9JUEFfQ0ZHX1RYX1BLVF9QT09MX1NJWkVfUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX1BLVF9QT09MX1NJWkVfU0VUKF92YXIsIF92YWwpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfVFhfUEtUX1BPT0xfU0laRSwgX3ZhbCk7IFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19UWF9QS1RfUE9PTF9TSVpFX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIGZvciBzeXN0ZW1zIHVzaW5nIDMyLWJpdCBmb3JtYXQgZm9yIGJ1cyBhZGRyICovCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfQkFTRV9BRERSX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfUklOR19CQVNFX0FERFJfTSkgPj4JCVwKKwlIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX0JBU0VfQUREUl9TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX0JBU0VfQUREUl9TRVQoX3ZhciwgX3ZhbCkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKAkJCQlcCisJCQlIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX0JBU0VfQUREUiwgX3ZhbCk7XAorCQkoKF92YXIpIHw9CQkJCQkJXAorCQkJKChfdmFsKSA8PCBIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX0JBU0VfQUREUl9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisvKiBmb3Igc3lzdGVtcyB1c2luZyA2NC1iaXQgZm9ybWF0IGZvciBidXMgYWRkciAqLworI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX0JBU0VfQUREUl9ISV9HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfUklOR19CQVNFX0FERFJfSElfTSkgPj4JXAorCUhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfQkFTRV9BRERSX0hJX1MpCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfQkFTRV9BRERSX0hJX1NFVChfdmFyLCBfdmFsKSBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTCgJCQkJXAorCQlIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX0JBU0VfQUREUl9ISSwgX3ZhbCk7XAorCQkoKF92YXIpIHw9CQkJCVwKKwkJCSgoX3ZhbCkgPDwJCQlcCisJCQlIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX0JBU0VfQUREUl9ISV9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisvKiBmb3Igc3lzdGVtcyB1c2luZyA2NC1iaXQgZm9ybWF0IGZvciBidXMgYWRkciAqLworI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX0JBU0VfQUREUl9MT19HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfUklOR19CQVNFX0FERFJfTE9fTSkgPj4gXAorCUhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfQkFTRV9BRERSX0xPX1MpCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfQkFTRV9BRERSX0xPX1NFVChfdmFyLCBfdmFsKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfUklOR19CQVNFX0FERFJfTE8sIF92YWwpOyAgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX0JBU0VfQUREUl9MT19TKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfUklOR19TSVpFX0dFVChfdmFyKQkJCVwKKwkoKChfdmFyKSAmIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfU0laRV9NKSA+PgkJXAorCUhUVF9XRElfSVBBX0NGR19UWF9DT01QX1JJTkdfU0laRV9TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX1NJWkVfU0VUKF92YXIsIF92YWwpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX1NJWkUsIF92YWwpOyBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9SSU5HX1NJWkVfUykpOyBcCisJfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgMzItYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfR0VUKF92YXIpCQkJXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfTSkgPj4JCVwKKwlIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9XUl9JRFhfQUREUl9TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9XUl9JRFhfQUREUl9TRVQoX3ZhciwgX3ZhbCkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1dSX0lEWF9BRERSLCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfUykpOyBcCisJfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgNjQtYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfSElfR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1dSX0lEWF9BRERSX0hJX00pID4+CVwKKwkJSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfSElfUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfSElfU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9XUl9JRFhfQUREUl9ISSwgX3ZhbCk7ICBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1dSX0lEWF9BRERSX0hJX1MpKTsgXAorfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgNjQtYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfTE9fR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1dSX0lEWF9BRERSX0xPX00pID4+CVwKKwkJSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfTE9fUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NPTVBfV1JfSURYX0FERFJfTE9fU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfVFhfQ09NUF9XUl9JRFhfQUREUl9MTywgX3ZhbCk7ICBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19UWF9DT01QX1dSX0lEWF9BRERSX0xPX1MpKTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBmb3Igc3lzdGVtcyB1c2luZyAzMi1iaXQgZm9ybWF0IGZvciBidXMgYWRkciAqLworI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfVFhfQ0VfV1JfSURYX0FERFJfR0VUKF92YXIpCQkJXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX00pID4+CQlcCisJCUhUVF9XRElfSVBBX0NGR19UWF9DRV9XUl9JRFhfQUREUl9TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfVFhfQ0VfV1JfSURYX0FERFJfU0VUKF92YXIsIF92YWwpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfVFhfQ0VfV1JfSURYX0FERFIsIF92YWwpOyBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfV0RJX0lQQV9DRkdfVFhfQ0VfV1JfSURYX0FERFJfUykpOyBcCisJfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgNjQtYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX0hJX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfV0RJX0lQQV9DRkdfVFhfQ0VfV1JfSURYX0FERFJfSElfTSkgPj5cCisJSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX0hJX1MpCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DRV9XUl9JRFhfQUREUl9ISV9TRVQoX3ZhciwgX3ZhbCkgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9XRElfSVBBX0NGR19UWF9DRV9XUl9JRFhfQUREUl9ISSwgX3ZhbCk7ICBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19UWF9DRV9XUl9JRFhfQUREUl9ISV9TKSk7IFwKK30gd2hpbGUgKDApCisKKy8qIGZvciBzeXN0ZW1zIHVzaW5nIDY0LWJpdCBmb3JtYXQgZm9yIGJ1cyBhZGRyICovCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19UWF9DRV9XUl9JRFhfQUREUl9MT19HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX0xPX00pID4+CVwKKwlIVFRfV0RJX0lQQV9DRkdfVFhfQ0VfV1JfSURYX0FERFJfTE9fUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX0xPX1NFVChfdmFyLCBfdmFsKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX0xPLCBfdmFsKTsgIFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfQ0ZHX1RYX0NFX1dSX0lEWF9BRERSX0xPX1MpKTsgXAorfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgMzItYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUl9HRVQoX3ZhcikJCQlcCisJKCgoX3ZhcikgJiBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JJTkdfQkFTRV9BRERSX00pID4+CQlcCisJSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUl9TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JJTkdfQkFTRV9BRERSX1NFVChfdmFyLCBfdmFsKQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUiwgX3ZhbCk7ICBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUklOR19CQVNFX0FERFJfUykpOyBcCit9IHdoaWxlICgwKQorCisvKiBmb3Igc3lzdGVtcyB1c2luZyA2NC1iaXQgZm9ybWF0IGZvciBidXMgYWRkciAqLworI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JJTkdfQkFTRV9BRERSX0hJX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JJTkdfQkFTRV9BRERSX0hJX00pID4+CVwKKwlIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JJTkdfQkFTRV9BRERSX0hJX1MpCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUklOR19CQVNFX0FERFJfSElfU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUklOR19CQVNFX0FERFJfSEksIF92YWwpOyAgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JJTkdfQkFTRV9BRERSX0hJX1MpKTsgXAorfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgNjQtYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUl9MT19HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUl9MT19NKSA+PglcCisJSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUl9MT19TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JJTkdfQkFTRV9BRERSX0xPX1NFVChfdmFyLCBfdmFsKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX0JBU0VfQUREUl9MTywgX3ZhbCk7ICBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUklOR19CQVNFX0FERFJfTE9fUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUklOR19TSVpFX0dFVChfdmFyKQkJCVwKKwkoKChfdmFyKSAmIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUklOR19TSVpFX00pID4+CQlcCisJSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX1NJWkVfUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX1NJWkVfU0VUKF92YXIsIF92YWwpCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JJTkdfU0laRSwgX3ZhbCk7IFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SSU5HX1NJWkVfUykpOyBcCit9IHdoaWxlICgwKQorCisvKiBmb3Igc3lzdGVtcyB1c2luZyAzMi1iaXQgZm9ybWF0IGZvciBidXMgYWRkciAqLworI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JEX0lEWF9BRERSX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SRF9JRFhfQUREUl9NKSA+PgkJXAorCUhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFJfUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SRF9JRFhfQUREUl9TRVQoX3ZhciwgX3ZhbCkJXAorZG8gewkJCQkJCQkJXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFIsIF92YWwpOyBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFJfUykpOyBcCit9IHdoaWxlICgwKQorCisvKiBmb3Igc3lzdGVtcyB1c2luZyA2NC1iaXQgZm9ybWF0IGZvciBidXMgYWRkciAqLworI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JEX0lEWF9BRERSX0hJX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JEX0lEWF9BRERSX0hJX00pID4+CVwKKwlIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JEX0lEWF9BRERSX0hJX1MpCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFJfSElfU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JEX0lEWF9BRERSX0hJLCBfdmFsKTsgIFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SRF9JRFhfQUREUl9ISV9TKSk7IFwKK30gd2hpbGUgKDApCisKKy8qIGZvciBzeXN0ZW1zIHVzaW5nIDY0LWJpdCBmb3JtYXQgZm9yIGJ1cyBhZGRyICovCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFJfTE9fR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFJfTE9fTSkgPj4JXAorCUhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFJfTE9fUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9SRF9JRFhfQUREUl9MT19TRVQoX3ZhciwgX3ZhbCkgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9XRElfSVBBX0NGR19SWF9JTkRfUkRfSURYX0FERFJfTE8sIF92YWwpOyAgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1JEX0lEWF9BRERSX0xPX1MpKTsgXAorfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgMzItYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9XUl9JRFhfQUREUl9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfV1JfSURYX0FERFJfTSkgPj4JCVwKKwlIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1dSX0lEWF9BRERSX1MpCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfV1JfSURYX0FERFJfU0VUKF92YXIsIF92YWwpCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1dSX0lEWF9BRERSLCBfdmFsKTsgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1dSX0lEWF9BRERSX1MpKTsgXAorfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgNjQtYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9XUl9JRFhfQUREUl9ISV9HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9XUl9JRFhfQUREUl9ISV9NKSA+PglcCisJSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9XUl9JRFhfQUREUl9ISV9TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1dSX0lEWF9BRERSX0hJX1NFVChfdmFyLCBfdmFsKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9XUl9JRFhfQUREUl9ISSwgX3ZhbCk7ICBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19SWF9JTkRfV1JfSURYX0FERFJfSElfUykpOyBcCit9IHdoaWxlICgwKQorCisvKiBmb3Igc3lzdGVtcyB1c2luZyA2NC1iaXQgZm9ybWF0IGZvciBidXMgYWRkciAqLworI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1dSX0lEWF9BRERSX0xPX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1dSX0lEWF9BRERSX0xPX00pID4+CVwKKwlIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1dSX0lEWF9BRERSX0xPX1MpCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9JTkRfV1JfSURYX0FERFJfTE9fU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfUlhfSU5EX1dSX0lEWF9BRERSX0xPLCBfdmFsKTsgIFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfQ0ZHX1JYX0lORF9XUl9JRFhfQUREUl9MT19TKSk7IFwKKwl9IHdoaWxlICgwKQorCisvKiBmb3Igc3lzdGVtcyB1c2luZyAzMi1iaXQgZm9ybWF0IGZvciBidXMgYWRkciAqLworI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfQkFTRV9BRERSX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfQkFTRV9BRERSX00pID4+CVwKKwlIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfQkFTRV9BRERSX1MpCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9CQVNFX0FERFJfU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfQkFTRV9BRERSLCBfdmFsKTsgIFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX0JBU0VfQUREUl9TKSk7IFwKK30gd2hpbGUgKDApCisKKy8qIGZvciBzeXN0ZW1zIHVzaW5nIDY0LWJpdCBmb3JtYXQgZm9yIGJ1cyBhZGRyICovCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9CQVNFX0FERFJfSElfR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9CQVNFX0FERFJfSElfTSkgPj4JXAorCUhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9CQVNFX0FERFJfSElfUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX0JBU0VfQUREUl9ISV9TRVQoX3ZhciwgX3ZhbCkgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9CQVNFX0FERFJfSEksIF92YWwpOyAgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfQkFTRV9BRERSX0hJX1MpKTsgXAorfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgNjQtYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX0JBU0VfQUREUl9MT19HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX0JBU0VfQUREUl9MT19NKSA+PglcCisJSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX0JBU0VfQUREUl9MT19TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfQkFTRV9BRERSX0xPX1NFVChfdmFyLCBfdmFsKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX0JBU0VfQUREUl9MTywgX3ZhbCk7ICBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9CQVNFX0FERFJfTE9fUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9TSVpFX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfU0laRV9NKSA+PglcCisJSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1NJWkVfUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1NJWkVfU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfU0laRSwgX3ZhbCk7ICBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9TSVpFX1MpKTsgXAorfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgMzItYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfUkRfSURYX0FERFJfTSkgPj4JXAorCUhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9SRF9JRFhfQUREUl9TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfUkRfSURYX0FERFJfU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfUkRfSURYX0FERFIsIF92YWwpOyAgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfUkRfSURYX0FERFJfUykpOyBcCit9IHdoaWxlICgwKQorCisvKiBmb3Igc3lzdGVtcyB1c2luZyA2NC1iaXQgZm9ybWF0IGZvciBidXMgYWRkciAqLworI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfUkRfSURYX0FERFJfSElfR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9SRF9JRFhfQUREUl9ISV9NKSA+PglcCisJSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX0hJX1MpCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9SRF9JRFhfQUREUl9ISV9TRVQoX3ZhciwgX3ZhbCkgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9SRF9JRFhfQUREUl9ISSwgX3ZhbCk7ICBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9SRF9JRFhfQUREUl9ISV9TKSk7IFwKK30gd2hpbGUgKDApCisKKy8qIGZvciBzeXN0ZW1zIHVzaW5nIDY0LWJpdCBmb3JtYXQgZm9yIGJ1cyBhZGRyICovCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9SRF9JRFhfQUREUl9MT19HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX0xPX00pID4+CVwKKwlIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfUkRfSURYX0FERFJfTE9fUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX0xPX1NFVChfdmFyLCBfdmFsKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX0xPLCBfdmFsKTsgIFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1JEX0lEWF9BRERSX0xPX1MpKTsgXAorfSB3aGlsZSAoMCkKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgMzItYml0IGZvcm1hdCBmb3IgYnVzIGFkZHIgKi8KKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1dSX0lEWF9BRERSX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfV1JfSURYX0FERFJfTSkgPj4JXAorCUhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9XUl9JRFhfQUREUl9TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfV1JfSURYX0FERFJfU0VUKF92YXIsIF92YWwpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfV1JfSURYX0FERFIsIF92YWwpOyAgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfV1JfSURYX0FERFJfUykpOyBcCit9IHdoaWxlICgwKQorCisvKiBmb3Igc3lzdGVtcyB1c2luZyA2NC1iaXQgZm9ybWF0IGZvciBidXMgYWRkciAqLworI2RlZmluZSBIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfV1JfSURYX0FERFJfSElfR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9XUl9JRFhfQUREUl9ISV9NKSA+PglcCisJSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1dSX0lEWF9BRERSX0hJX1MpCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9XUl9JRFhfQUREUl9ISV9TRVQoX3ZhciwgX3ZhbCkgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9XUl9JRFhfQUREUl9ISSwgX3ZhbCk7ICBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9XUl9JRFhfQUREUl9ISV9TKSk7IFwKK30gd2hpbGUgKDApCisKKy8qIGZvciBzeXN0ZW1zIHVzaW5nIDY0LWJpdCBmb3JtYXQgZm9yIGJ1cyBhZGRyICovCisjZGVmaW5lIEhUVF9XRElfSVBBX0NGR19SWF9SSU5HMl9XUl9JRFhfQUREUl9MT19HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1dSX0lEWF9BRERSX0xPX00pID4+CVwKKwlIVFRfV0RJX0lQQV9DRkdfUlhfUklORzJfV1JfSURYX0FERFJfTE9fUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1dSX0lEWF9BRERSX0xPX1NFVChfdmFyLCBfdmFsKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1dSX0lEWF9BRERSX0xPLCBfdmFsKTsgIFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfQ0ZHX1JYX1JJTkcyX1dSX0lEWF9BRERSX0xPX1MpKTsgXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFRFTVBMQVRFX0hUVF9XRElfSVBBX0NPTkZJR19UOgorICogVGhpcyBtYWNybyBkZWZpbmVzIGEgaHR0X3dkaV9pcGFfY29uZmlnWFhYX3QgaW4gd2hpY2ggYW55IHBoeXNpY2FsCisgKiBhZGRyZXNzZXMgYXJlIHN0b3JlZCBpbiBhIFhYWC1iaXQgZmllbGQuCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gZGVmaW5lIGJvdGggaHR0X3dkaV9pcGFfY29uZmlnMzJfdCBhbmQKKyAqIGh0dF93ZGlfaXBhX2NvbmZpZzY0X3Qgc3RydWN0cy4KKyAqLworI2RlZmluZSBURU1QTEFURV9IVFRfV0RJX0lQQV9DT05GSUdfVChfcGFkZHJfYml0c18sIFwKKwlfcGFkZHJfX3R4X2NvbXBfcmluZ19iYXNlX2FkZHJfLCBcCisJX3BhZGRyX190eF9jb21wX3dyX2lkeF9hZGRyXywgXAorCV9wYWRkcl9fdHhfY2Vfd3JfaWR4X2FkZHJfLCBcCisJX3BhZGRyX19yeF9pbmRfcmluZ19iYXNlX2FkZHJfLCBcCisJX3BhZGRyX19yeF9pbmRfcmRfaWR4X2FkZHJfLCBcCisJX3BhZGRyX19yeF9pbmRfd3JfaWR4X2FkZHJfLCBcCisJX3BhZGRyX19yeF9yaW5nMl9iYXNlX2FkZHJfLFwKKwlfcGFkZHJfX3J4X3JpbmcyX3JkX2lkeF9hZGRyXyxcCisJX3BhZGRyX19yeF9yaW5nMl93cl9pZHhfYWRkcl8pICAgICAgXAorUFJFUEFDSyBzdHJ1Y3QgaHR0X3dkaV9pcGFfY2ZnICMjIF9wYWRkcl9iaXRzXyAjIyBfdCBcCit7IFwKKyAgLyogRFdPUkQgMDogZmxhZ3MgYW5kIG1ldGEtZGF0YSAqLyBcCisJQV9VSU5UMzIgXAorCW1zZ190eXBlOjgsIC8qIEhUVF9IMlRfTVNHX1RZUEVfV0RJX0lQQV9DRkcgKi8gXAorCXJlc2VydmVkOjgsIFwKKwl0eF9wa3RfcG9vbF9zaXplOjE2O1wKKwkvKiBEV09SRCAxICAqL1wKKwlfcGFkZHJfX3R4X2NvbXBfcmluZ19iYXNlX2FkZHJfO1wKKwkvKiBEV09SRCAyIChvciAzKSovXAorCUFfVUlOVDMyIHR4X2NvbXBfcmluZ19zaXplO1wKKwkvKiBEV09SRCAzIChvciA0KSovXAorCV9wYWRkcl9fdHhfY29tcF93cl9pZHhfYWRkcl87XAorCS8qIERXT1JEIDQgKG9yIDYpKi9cCisJX3BhZGRyX190eF9jZV93cl9pZHhfYWRkcl87XAorCS8qIERXT1JEIDUgKG9yIDgpKi9cCisJX3BhZGRyX19yeF9pbmRfcmluZ19iYXNlX2FkZHJfO1wKKwkvKiBEV09SRCA2IChvciAxMCkqL1wKKwlBX1VJTlQzMiByeF9pbmRfcmluZ19zaXplO1wKKwkvKiBEV09SRCA3IChvciAxMSkqL1wKKwlfcGFkZHJfX3J4X2luZF9yZF9pZHhfYWRkcl87XAorCS8qIERXT1JEIDggKG9yIDEzKSovXAorCV9wYWRkcl9fcnhfaW5kX3dyX2lkeF9hZGRyXztcCisJLyogRFdPUkQgOSAob3IgMTUpKi9cCisJX3BhZGRyX19yeF9yaW5nMl9iYXNlX2FkZHJfO1wKKwkvKiBEV09SRCAxMCAob3IgMTcpICovXAorCUFfVUlOVDMyIHJ4X3JpbmcyX3NpemU7XAorCS8qIERXT1JEIDExIChvciAxOCkgKi9cCisJX3BhZGRyX19yeF9yaW5nMl9yZF9pZHhfYWRkcl87XAorCS8qIERXT1JEIDEyIChvciAyMCkgKi9cCisJX3BhZGRyX19yeF9yaW5nMl93cl9pZHhfYWRkcl87XAorfSBQT1NUUEFDSworCisvKiBkZWZpbmUgYSBodHRfd2RpX2lwYV9jb25maWczMl90IHR5cGUgKi8KK1RFTVBMQVRFX0hUVF9XRElfSVBBX0NPTkZJR19UKDMyLCBIVFRfVkFSX1BBRERSMzIodHhfY29tcF9yaW5nX2Jhc2VfYWRkciksCisJCQkgICAgICBIVFRfVkFSX1BBRERSMzIodHhfY29tcF93cl9pZHhfYWRkciksCisJCQkgICAgICBIVFRfVkFSX1BBRERSMzIodHhfY2Vfd3JfaWR4X2FkZHIpLAorCQkJICAgICAgSFRUX1ZBUl9QQUREUjMyKHJ4X2luZF9yaW5nX2Jhc2VfYWRkciksCisJCQkgICAgICBIVFRfVkFSX1BBRERSMzIocnhfaW5kX3JkX2lkeF9hZGRyKSwKKwkJCSAgICAgIEhUVF9WQVJfUEFERFIzMihyeF9pbmRfd3JfaWR4X2FkZHIpLAorCQkJICAgICAgSFRUX1ZBUl9QQUREUjMyKHJ4X3JpbmcyX2Jhc2VfYWRkciksCisJCQkgICAgICBIVFRfVkFSX1BBRERSMzIocnhfcmluZzJfcmRfaWR4X2FkZHIpLAorCQkJICAgICAgSFRUX1ZBUl9QQUREUjMyKHJ4X3JpbmcyX3dyX2lkeF9hZGRyKSk7CisKKy8qIGRlZmluZSBhIGh0dF93ZGlfaXBhX2NvbmZpZzY0X3QgdHlwZSAqLworVEVNUExBVEVfSFRUX1dESV9JUEFfQ09ORklHX1QoNjQsIEhUVF9WQVJfUEFERFI2NF9MRSh0eF9jb21wX3JpbmdfYmFzZV9hZGRyKSwKKwkJCSAgICAgIEhUVF9WQVJfUEFERFI2NF9MRSh0eF9jb21wX3dyX2lkeF9hZGRyKSwKKwkJCSAgICAgIEhUVF9WQVJfUEFERFI2NF9MRSh0eF9jZV93cl9pZHhfYWRkciksCisJCQkgICAgICBIVFRfVkFSX1BBRERSNjRfTEUocnhfaW5kX3JpbmdfYmFzZV9hZGRyKSwKKwkJCSAgICAgIEhUVF9WQVJfUEFERFI2NF9MRShyeF9pbmRfcmRfaWR4X2FkZHIpLAorCQkJICAgICAgSFRUX1ZBUl9QQUREUjY0X0xFKHJ4X2luZF93cl9pZHhfYWRkciksCisJCQkgICAgICBIVFRfVkFSX1BBRERSNjRfTEUocnhfcmluZzJfYmFzZV9hZGRyKSwKKwkJCSAgICAgIEhUVF9WQVJfUEFERFI2NF9MRShyeF9yaW5nMl9yZF9pZHhfYWRkciksCisJCQkgICAgICBIVFRfVkFSX1BBRERSNjRfTEUocnhfcmluZzJfd3JfaWR4X2FkZHIpKTsKKworI2lmIEhUVF9QQUREUjY0CisjZGVmaW5lIGh0dF93ZGlfaXBhX2NmZ190IGh0dF93ZGlfaXBhX2NmZzY0X3QKKyNlbHNlCisjZGVmaW5lIGh0dF93ZGlfaXBhX2NmZ190IGh0dF93ZGlfaXBhX2NmZzMyX3QKKyNlbmRpZgorCitlbnVtIGh0dF93ZGlfaXBhX29wX2NvZGUgeworCUhUVF9XRElfSVBBX09QQ09ERV9UWF9TVVNQRU5EID0gMCwKKwlIVFRfV0RJX0lQQV9PUENPREVfVFhfUkVTVU1FID0gMSwKKwlIVFRfV0RJX0lQQV9PUENPREVfUlhfU1VTUEVORCA9IDIsCisJSFRUX1dESV9JUEFfT1BDT0RFX1JYX1JFU1VNRSA9IDMsCisJSFRUX1dESV9JUEFfT1BDT0RFX0RCR19TVEFUUyA9IDQsCisJLyoga2VlcCB0aGlzIGxhc3QgKi8KKwlIVFRfV0RJX0lQQV9PUENPREVfTUFYCit9OworCisvKioKKyAqIEBicmllZiBIVFQgV0RJX0lQQSBPcGVyYXRpb24gUmVxdWVzdCBNZXNzYWdlCisgKgorICogQGRldGFpbHMKKyAqICBIVFQgV0RJX0lQQSBPcGVyYXRpb24gUmVxdWVzdCBtZXNzYWdlIGlzIHNlbnQgYnkgaG9zdAorICogIHRvIGVpdGhlciBzdXNwZW5kIG9yIHJlc3VtZSBXRElfSVBBIFRYIG9yIFJYIHBhdGguCisgKiAgICAgfDMxICAgICAgICAgICAgMjR8MjMgICAgICAgICAgICAxNnwxNSAgICAgICAgICAgICA4fDcgICAgICAgICAgICAgIDB8CisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgfCAgICAgICAgICAgICBvcF9jb2RlICAgICAgICAgICAgIHwgICAgICBSc3ZkICAgICAgfCAgICAgbXNnX3R5cGUgICB8CisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICogSGVhZGVyIGZpZWxkczoKKyAqICAgLSBNU0dfVFlQRQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogSWRlbnRpZmllcyB0aGlzIGFzIFdESV9JUEEgT3BlcmF0aW9uIFJlcXVlc3QgbWVzc2FnZQorICogICAgIHZhbHVlOiA9IDB4OQorICogICAtIE9QX0NPREUKKyAqICAgICBCaXRzIDMxOjE2CisgKiAgICAgUHVycG9zZTogSWRlbnRpZmllcyBvcGVyYXRpb24gaG9zdCBpcyByZXF1ZXN0aW5nIChlLmcuIFRYIHN1c3BlbmQpCisgKiAgICAgdmFsdWU6ID0gZW51bSBodHRfd2RpX2lwYV9vcF9jb2RlCisgKi8KKworUFJFUEFDSyBzdHJ1Y3QgaHR0X3dkaV9pcGFfb3BfcmVxdWVzdF90IHsKKwkvKiBEV09SRCAwOiBmbGFncyBhbmQgbWV0YS1kYXRhICovCisJQV9VSU5UMzIKKwkJbXNnX3R5cGU6OCwJLyogSFRUX0gyVF9NU0dfVFlQRV9XRElfSVBBX09QX1JFUVVFU1QgKi8KKwkJcmVzZXJ2ZWQ6OCwKKwkJb3BfY29kZToxNjsKK30gUE9TVFBBQ0s7CisKKyNkZWZpbmUgSFRUX1dESV9JUEFfT1BfUkVRVUVTVF9TWiAgICAgICAgICAgICAgICAgICAgNAkvKiBieXRlcyAqLworCisjZGVmaW5lIEhUVF9XRElfSVBBX09QX1JFUVVFU1RfT1BfQ09ERV9NICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRUX1dESV9JUEFfT1BfUkVRVUVTVF9PUF9DT0RFX1MgICAgICAgICAgICAgMTYKKworI2RlZmluZSBIVFRfV0RJX0lQQV9PUF9SRVFVRVNUX09QX0NPREVfR0VUKF92YXIpCQkJXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfT1BfUkVRVUVTVF9PUF9DT0RFX00pID4+CQkJXAorCUhUVF9XRElfSVBBX09QX1JFUVVFU1RfT1BfQ09ERV9TKQorI2RlZmluZSBIVFRfV0RJX0lQQV9PUF9SRVFVRVNUX09QX0NPREVfU0VUKF92YXIsIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1dESV9JUEFfT1BfUkVRVUVTVF9PUF9DT0RFLCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfT1BfUkVRVUVTVF9PUF9DT0RFX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKworCisKKy8qPT09IHRhcmdldCAtPiBob3N0IG1lc3NhZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCitlbnVtIGh0dF90MmhfbXNnX3R5cGUgeworCUhUVF9UMkhfTVNHX1RZUEVfVkVSU0lPTl9DT05GID0gMHgwLAorCUhUVF9UMkhfTVNHX1RZUEVfUlhfSU5EID0gMHgxLAorCUhUVF9UMkhfTVNHX1RZUEVfUlhfRkxVU0ggPSAweDIsCisJSFRUX1QySF9NU0dfVFlQRV9QRUVSX01BUCA9IDB4MywKKwlIVFRfVDJIX01TR19UWVBFX1BFRVJfVU5NQVAgPSAweDQsCisJSFRUX1QySF9NU0dfVFlQRV9SWF9BRERCQSA9IDB4NSwKKwlIVFRfVDJIX01TR19UWVBFX1JYX0RFTEJBID0gMHg2LAorCUhUVF9UMkhfTVNHX1RZUEVfVFhfQ09NUExfSU5EID0gMHg3LAorCUhUVF9UMkhfTVNHX1RZUEVfUEtUTE9HID0gMHg4LAorCUhUVF9UMkhfTVNHX1RZUEVfU1RBVFNfQ09ORiA9IDB4OSwKKwlIVFRfVDJIX01TR19UWVBFX1JYX0ZSQUdfSU5EID0gMHhhLAorCUhUVF9UMkhfTVNHX1RZUEVfU0VDX0lORCA9IDB4YiwKKwlERVBSRUNBVEVEX0hUVF9UMkhfTVNHX1RZUEVfUkNfVVBEQVRFX0lORCA9IDB4YywvKiBubyBsb25nZXIgdXNlZCAqLworCUhUVF9UMkhfTVNHX1RZUEVfVFhfSU5TUEVDVF9JTkQgPSAweGQsCisJSFRUX1QySF9NU0dfVFlQRV9NR01UX1RYX0NPTVBMX0lORCA9IDB4ZSwKKwkvKiBvbmx5IHVzZWQgZm9yIEhMLCBhZGQgSFRUIE1TRyBmb3IgSFRUIENSRURJVCB1cGRhdGUgKi8KKwlIVFRfVDJIX01TR19UWVBFX1RYX0NSRURJVF9VUERBVEVfSU5EID0gMHhmLAorCUhUVF9UMkhfTVNHX1RZUEVfUlhfUE5fSU5EID0gMHgxMCwKKwlIVFRfVDJIX01TR19UWVBFX1JYX09GRkxPQURfREVMSVZFUl9JTkQgPSAweDExLAorCUhUVF9UMkhfTVNHX1RZUEVfUlhfSU5fT1JEX1BBRERSX0lORCA9IDB4MTIsCisJLyogMHgxMyBpcyByZXNlcnZlZCBmb3IgUlhfUklOR19MT1dfSU5EIChSWCBGdWxsIHJlb3JkZXJpbmcgcmVsYXRlZCkgKi8KKwlIVFRfVDJIX01TR19UWVBFX1dESV9JUEFfT1BfUkVTUE9OU0UgPSAweDE0LAorCUhUVF9UMkhfTVNHX1RZUEVfQ0hBTl9DSEFOR0UgPSAweDE1LAorCUhUVF9UMkhfTVNHX1RZUEVfUlhfT0ZMRF9QS1RfRVJSID0gMHgxNiwKKwlIVFRfVDJIX01TR19UWVBFX1JBVEVfUkVQT1JUID0gMHgxNywKKwlIVFRfVDJIX01TR19UWVBFX0ZMT1dfUE9PTF9NQVAgPSAweDE4LAorCUhUVF9UMkhfTVNHX1RZUEVfRkxPV19QT09MX1VOTUFQID0gMHgxOSwKKworCUhUVF9UMkhfTVNHX1RZUEVfVEVTVCwKKwkvKiBrZWVwIHRoaXMgbGFzdCAqLworCUhUVF9UMkhfTlVNX01TR1MKK307CisKKy8qCisgKiBIVFQgdGFyZ2V0IHRvIGhvc3QgbWVzc2FnZSB0eXBlIC0KKyAqIHN0b3JlZCBpbiBiaXRzIDc6MCBvZiB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgbWVzc2FnZQorICovCisjZGVmaW5lIEhUVF9UMkhfTVNHX1RZUEVfTSAgICAgIDB4ZmYKKyNkZWZpbmUgSFRUX1QySF9NU0dfVFlQRV9TICAgICAgMAorCisjZGVmaW5lIEhUVF9UMkhfTVNHX1RZUEVfU0VUKHdvcmQsIG1zZ190eXBlKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1QySF9NU0dfVFlQRSwgbXNnX3R5cGUpOwlcCisJCSh3b3JkKSB8PSAoKG1zZ190eXBlKSA8PCBIVFRfVDJIX01TR19UWVBFX1MpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1QySF9NU0dfVFlQRV9HRVQod29yZCkJCQkJXAorCSgoKHdvcmQpICYgSFRUX1QySF9NU0dfVFlQRV9NKSA+PiBIVFRfVDJIX01TR19UWVBFX1MpCisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IHZlcnNpb24gbnVtYmVyIGNvbmZpcm1hdGlvbiBtZXNzYWdlIGRlZmluaXRpb24KKyAqCisgKiAgICAgfDMxICAgICAgICAgICAgMjR8MjMgICAgICAgICAgICAxNnwxNSAgICAgICAgICAgICA4fDcgICAgICAgICAgICAgIDB8CisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgfCAgICByZXNlcnZlZCAgICB8ICBtYWpvciBudW1iZXIgIHwgIG1pbm9yIG51bWJlciAgfCAgICBtc2cgdHlwZSAgICB8CisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgOiAgICAgICAgICAgICAgICAgICAgb3B0aW9uIHJlcXVlc3QgVExWIChvcHRpb25hbCkgICAgICAgICAgICAgICAgICB8CisgKiAgICAgOi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi46CisgKgorICogVGhlIFZFUl9DT05GIG1lc3NhZ2UgbWF5IGNvbnNpc3Qgb2YgYSBzaW5nbGUgNC1ieXRlIHdvcmQsIG9yIG1heSBiZQorICogZXh0ZW5kZWQgd2l0aCBUTFZzIHRoYXQgc3BlY2lmeSBIVFQgb3B0aW9ucyBzZWxlY3RlZCBieSB0aGUgdGFyZ2V0LgorICogVGhlIGZvbGxvd2luZyBvcHRpb24gVExWcyBtYXkgYmUgYXBwZW5kZWQgdG8gdGhlIFZFUl9DT05GIG1lc3NhZ2U6CisgKiAgIC0gTExfQlVTX0FERFJfU0laRQorICogICAtIEhMX1NVUFBSRVNTX1RYX0NPTVBMX0lORAorICogICAtIE1BWF9UWF9RVUVVRV9HUk9VUFMKKyAqIFRoZXNlIFRMVnMgbWF5IGFwcGVhciBpbiBhbiBhcmJpdHJhcnkgb3JkZXIuICBBbnkgbnVtYmVyIG9mIHRoZXNlIFRMVnMKKyAqIG1heSBiZSBhcHBlbmRlZCB0byB0aGUgVkVSX0NPTkYgbWVzc2FnZSAoYnV0IG9ubHkgb25lIFRMViBvZiBlYWNoIHR5cGUpLgorICoKKyAqIEhlYWRlciBmaWVsZHM6CisgKiAgIC0gTVNHX1RZUEUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgdGhpcyBhcyBhIHZlcnNpb24gbnVtYmVyIGNvbmZpcm1hdGlvbiBtZXNzYWdlCisgKiAgICAgVmFsdWU6IDB4MAorICogICAtIFZFUl9NSU5PUgorICogICAgIEJpdHMgMTU6OAorICogICAgIFB1cnBvc2U6IFNwZWNpZnkgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgSFRUIG1lc3NhZ2UgbGlicmFyeSB2ZXJzaW9uCisgKiAgICAgICAgIGluIHVzZSBieSB0aGUgdGFyZ2V0IGZpcm13YXJlLgorICogICAgICAgICBUaGUgbWlub3IgbnVtYmVyIHNwZWNpZmllcyB0aGUgc3BlY2lmaWMgcmV2aXNpb24gd2l0aGluIGEgcmFuZ2UKKyAqICAgICAgICAgb2YgZnVuZGFtZW50YWxseSBjb21wYXRpYmxlIEhUVCBtZXNzYWdlIGRlZmluaXRpb24gcmV2aXNpb25zLgorICogICAgICAgICBDb21wYXRpYmxlIHJldmlzaW9ucyBpbnZvbHZlIGFkZGluZyBuZXcgbWVzc2FnZXMgb3IgcGVyaGFwcworICogICAgICAgICBhZGRpbmcgbmV3IGZpZWxkcyB0byBleGlzdGluZyBtZXNzYWdlcywgaW4gYSBiYWNrd2FyZHMtY29tcGF0aWJsZQorICogICAgICAgICBtYW5uZXIuCisgKiAgICAgICAgIEluY29tcGF0aWJsZSByZXZpc2lvbnMgaW52b2x2ZSBjaGFuZ2luZyB0aGUgbWVzc2FnZSB0eXBlIHZhbHVlcywKKyAqICAgICAgICAgb3IgcmVkZWZpbmluZyBleGlzdGluZyBtZXNzYWdlcy4KKyAqICAgICBWYWx1ZTogbWlub3IgbnVtYmVyCisgKiAgIC0gVkVSX01BSk9SCisgKiAgICAgQml0cyAxNTo4CisgKiAgICAgUHVycG9zZTogU3BlY2lmeSB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBIVFQgbWVzc2FnZSBsaWJyYXJ5IHZlcnNpb24KKyAqICAgICAgICAgaW4gdXNlIGJ5IHRoZSB0YXJnZXQgZmlybXdhcmUuCisgKiAgICAgICAgIFRoZSBtYWpvciBudW1iZXIgc3BlY2lmaWVzIHRoZSBmYW1pbHkgb2YgbWlub3IgcmV2aXNpb25zIHRoYXQgYXJlCisgKiAgICAgICAgIGZ1bmRhbWVudGFsbHkgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIsIGJ1dCBub3Qgd2l0aCBwcmlvciBvcgorICogICAgICAgICBsYXRlciBmYW1pbGllcy4KKyAqICAgICBWYWx1ZTogbWFqb3IgbnVtYmVyCisgKi8KKworI2RlZmluZSBIVFRfVkVSX0NPTkZfTUlOT1JfTSAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSFRUX1ZFUl9DT05GX01JTk9SX1MgICAgICA4CisjZGVmaW5lIEhUVF9WRVJfQ09ORl9NQUpPUl9NICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIVFRfVkVSX0NPTkZfTUFKT1JfUyAgICAgIDE2CisKKworI2RlZmluZSBIVFRfVkVSX0NPTkZfTUlOT1JfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1ZFUl9DT05GX01JTk9SLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9WRVJfQ09ORl9NSU5PUl9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1ZFUl9DT05GX01JTk9SX0dFVCh3b3JkKQkJCQkJXAorCSgoKHdvcmQpICYgSFRUX1ZFUl9DT05GX01JTk9SX00pID4+IEhUVF9WRVJfQ09ORl9NSU5PUl9TKQorCisjZGVmaW5lIEhUVF9WRVJfQ09ORl9NQUpPUl9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVkVSX0NPTkZfTUFKT1IsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1ZFUl9DT05GX01BSk9SX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfVkVSX0NPTkZfTUFKT1JfR0VUKHdvcmQpCQkJCQlcCisJKCgod29yZCkgJiBIVFRfVkVSX0NPTkZfTUFKT1JfTSkgPj4gSFRUX1ZFUl9DT05GX01BSk9SX1MpCisKKworI2RlZmluZSBIVFRfVkVSX0NPTkZfQllURVMgNAorCisKKy8qKgorICogQGJyaWVmIC0gdGFyZ2V0IC0+IGhvc3QgSFRUIFJ4IEluIG9yZGVyIGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqIEBkZXRhaWxzCisgKgorICogfDMxICAgICAgICAgICAgMjR8MjMgICAgICAgICAgICAgICAgIHwxNXwxNHwxM3wxMnwxMXwxMHw5fDh8N3w2fDV8NCAgICAgICAwfAorICogfC0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgICAgIHBlZXIgSUQgICAgICAgICAgIHwgIHwgRnwgT3wgZXh0IFRJRCAgICB8ICAgbXNnIHR5cGUgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgICAgIE1TRFUgY291bnQgICAgICAgIHwgICAgICAgIFJlc2VydmVkICAgICB8ICAgdmRldiBpZCAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgIE1TRFUgMCBidXMgYWRkcmVzcyAoYml0cyAzMTowKSAgICAgICAgICAgICAgICAgICAgfAorICNpZiBIVFRfUEFERFI2NAorICogfCAgICAgICAgICAgICAgICAgICAgICAgIE1TRFUgMCBidXMgYWRkcmVzcyAoYml0cyA2MzozMikgICAgICAgICAgICAgICAgICAgfAorICNlbmRpZgorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICBNU0RVIGluZm8gICB8IE1TRFUgMCBGVyBEZXNjICAgIHwgICAgICAgICBNU0RVIDAgTGVuZ3RoICAgICAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgIE1TRFUgMSBidXMgYWRkcmVzcyAoYml0cyAzMTowKSAgICAgICAgICAgICAgICAgICAgfAorICNpZiBIVFRfUEFERFI2NAorICogfCAgICAgICAgICAgICAgICAgICAgICAgIE1TRFUgMSBidXMgYWRkcmVzcyAoYml0cyA2MzozMikgICAgICAgICAgICAgICAgICAgfAorICNlbmRpZgorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICBNU0RVIGluZm8gICB8IE1TRFUgMSBGVyBEZXNjICAgIHwgICAgICAgICBNU0RVIDEgTGVuZ3RoICAgICAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICovCisKKworLyoqIEBicmllZiAtIE1TRFUgaW5mbyBieXRlIGZvciBUQ1BfQ0hFQ0tTVU1fT0ZGTE9BRCB1c2UKKyAqCisgKiBAZGV0YWlscworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cworICogfCAgNyAgfCA2ICB8ICAgNSAgIHwgICAgNCAgIHwgICAzICAgIHwgICAgMiAgICB8ICAgIDEgICAgfCAgICAgMCAgICAgfAorICogfC0tLS0tKy0tLS0rLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tfAorICogfCByZXNlcnZlZCB8IGlzIElQIHwgaXMgVURQIHwgaXMgVENQIHwgaXMgSVB2NiB8SVAgY2hrc3VtfCAgVENQL1VEUCAgfAorICogfCAgICAgICAgICB8IGZyYWcgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgICB8IGZhaWwgICAgfGNoa3N1bSBmYWlsfAorICogfC0tLS0tKy0tLS0rLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tfAorICogKHNlZSBmd19yeF9tc2R1X2luZm8gZGVmIGluIHdhbF9yeF9kZXNjLmgpCisgKi8KKworc3RydWN0IGh0dF9yeF9pbl9vcmRfcGFkZHJfaW5kX2hkcl90IHsKKwlBX1VJTlQzMgkJLyogd29yZCAwICovCisJCW1zZ190eXBlOjgsCisJCWV4dF90aWQ6NSwKKwkJb2ZmbG9hZDoxLAorCQlmcmFnOjEsCisJCXJlc2VydmVkXzA6MSwKKwkJcGVlcl9pZDoxNjsKKworCUFfVUlOVDMyCQkvKiB3b3JkIDEgKi8KKwkJdmFwX2lkOjgsCisJCXJlc2VydmVkXzE6OCwKKwkJbXNkdV9jbnQ6MTY7Cit9OworCitzdHJ1Y3QgaHR0X3J4X2luX29yZF9wYWRkcl9pbmRfbXNkdTMyX3QgeworCUFfVUlOVDMyIGRtYV9hZGRyOworCUFfVUlOVDMyCisJCWxlbmd0aDoxNiwKKwkJZndfZGVzYzo4LAorCQltc2R1X2luZm86ODsKK307CitzdHJ1Y3QgaHR0X3J4X2luX29yZF9wYWRkcl9pbmRfbXNkdTY0X3QgeworCUFfVUlOVDMyIGRtYV9hZGRyX2xvOworCUFfVUlOVDMyIGRtYV9hZGRyX2hpOworCUFfVUlOVDMyCisJCWxlbmd0aDoxNiwKKwkJZndfZGVzYzo4LAorCQltc2R1X2luZm86ODsKK307CisjaWYgSFRUX1BBRERSNjQKKyNkZWZpbmUgaHR0X3J4X2luX29yZF9wYWRkcl9pbmRfbXNkdV90IGh0dF9yeF9pbl9vcmRfcGFkZHJfaW5kX21zZHU2NF90CisjZWxzZQorI2RlZmluZSBodHRfcnhfaW5fb3JkX3BhZGRyX2luZF9tc2R1X3QgaHR0X3J4X2luX29yZF9wYWRkcl9pbmRfbXNkdTMyX3QKKyNlbmRpZgorCisKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfSERSX0JZVEVTCVwKKwkoc2l6ZW9mKHN0cnVjdCBodHRfcnhfaW5fb3JkX3BhZGRyX2luZF9oZHJfdCkpCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0hEUl9EV09SRFMJXAorCShIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9IRFJfQllURVMgPj4gMikKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9CWVRFX09GRlNFVAlcCisJCUhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0hEUl9CWVRFUworI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9NU0RVX0RXT1JEX09GRlNFVAlcCisJCUhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0hEUl9EV09SRFMKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9CWVRFU182NAlcCisJKHNpemVvZihzdHJ1Y3QgaHR0X3J4X2luX29yZF9wYWRkcl9pbmRfbXNkdTY0X3QpKQorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9NU0RVX0RXT1JEU182NAlcCisJKEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfQllURVNfNjQgPj4gMikKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9CWVRFU18zMglcCisJKHNpemVvZihzdHJ1Y3QgaHR0X3J4X2luX29yZF9wYWRkcl9pbmRfbXNkdTMyX3QpKQorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9NU0RVX0RXT1JEU18zMglcCisJKEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfQllURVNfMzIgPj4gMikKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9CWVRFUwlcCisJKHNpemVvZihzdHJ1Y3QgaHR0X3J4X2luX29yZF9wYWRkcl9pbmRfbXNkdV90KSkKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9EV09SRFMJCVwKKwkoSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9CWVRFUyA+PiAyKQorCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0VYVF9USURfTSAgICAgIDB4MDAwMDFmMDAKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRVhUX1RJRF9TICAgICAgOAorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9PRkZMT0FEX00gICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX09GRkxPQURfUyAgICAgIDEzCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0ZSQUdfTSAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRlJBR19TICAgICAgICAgMTQKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEVFUl9JRF9NICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QRUVSX0lEX1MgICAgICAxNgorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9WQVBfSURfTSAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1ZBUF9JRF9TICAgICAgIDAKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9DTlRfTSAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9NU0RVX0NOVF9TICAgICAxNgorLyogZm9yIHN5c3RlbXMgdXNpbmcgNjQtYml0IGZvcm1hdCBmb3IgYnVzIGFkZHJlc3NlcyAqLworI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUl9ISV9NICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BBRERSX0hJX1MgICAgIDAKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEFERFJfTE9fTSAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUl9MT19TICAgICAwCisvKiBmb3Igc3lzdGVtcyB1c2luZyAzMi1iaXQgZm9ybWF0IGZvciBidXMgYWRkcmVzc2VzICovCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BBRERSX00gICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEFERFJfUyAgICAgICAgMAorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9NU0RVX0xFTl9NICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfTEVOX1MgICAgIDAKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRldfREVTQ19NICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9GV19ERVNDX1MgICAgICAxNgorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9NU0RVX0lORk9fTSAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfSU5GT19TICAgIDI0CisKKworI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9FWFRfVElEX1NFVCh3b3JkLCB2YWx1ZSkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0VYVF9USUQsIHZhbHVlKTsgXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRVhUX1RJRF9TOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRVhUX1RJRF9HRVQod29yZCkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9FWFRfVElEX00pID4+CVwKKwlIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9FWFRfVElEX1MpCisKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEVFUl9JRF9TRVQod29yZCwgdmFsdWUpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QRUVSX0lELCB2YWx1ZSk7IFwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BFRVJfSURfUzsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BFRVJfSURfR0VUKHdvcmQpCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEVFUl9JRF9NKSA+PgkJXAorCUhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BFRVJfSURfUykKKworI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9WQVBfSURfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1ZBUF9JRCwgdmFsdWUpOyBcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9WQVBfSURfUzsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1ZBUF9JRF9HRVQod29yZCkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9WQVBfSURfTSkgPj4JCQlcCisJSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfVkFQX0lEX1MpCisKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9DTlRfU0VUKHdvcmQsIHZhbHVlKQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9DTlQsIHZhbHVlKTsgXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9DTlRfUzsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfQ05UX0dFVCh3b3JkKQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfQ05UX00pID4+CQlcCisJSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9DTlRfUykKKworLyogZm9yIHN5c3RlbXMgdXNpbmcgNjQtYml0IGZvcm1hdCBmb3IgYnVzIGFkZHJlc3NlcyAqLworI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUl9ISV9TRVQod29yZCwgdmFsdWUpCQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEFERFJfSEksIHZhbHVlKTsgXAorCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUl9ISV9TOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUl9ISV9HRVQod29yZCkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUl9ISV9NKSA+PgkJXAorCUhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BBRERSX0hJX1MpCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BBRERSX0xPX1NFVCh3b3JkLCB2YWx1ZSkJXAorZG8gewkJCQkJCQkJXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BBRERSX0xPLCB2YWx1ZSk7IFwKKwkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEFERFJfTE9fUzsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEFERFJfTE9fR0VUKHdvcmQpCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfUEFERFJfTE9fTSkgPj4JCVwKKwlIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUl9MT19TKQorCisvKiBmb3Igc3lzdGVtcyB1c2luZyAzMi1iaXQgZm9ybWF0IGZvciBidXMgYWRkcmVzc2VzICovCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BBRERSX1NFVCh3b3JkLCB2YWx1ZSkJCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUiwgdmFsdWUpOyBcCisJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BBRERSX1M7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX1BBRERSX0dFVCh3b3JkKQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUl9NKSA+PgkJCVwKKwlIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9QQUREUl9TKQorCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfTEVOX1NFVCh3b3JkLCB2YWx1ZSkJXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9MRU4sIHZhbHVlKTtcCisJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfTEVOX1M7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9NU0RVX0xFTl9HRVQod29yZCkgXAorCSgoKHdvcmQpICYgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9MRU5fTSkgPj4JXAorCUhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfTEVOX1MpCisKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRldfREVTQ19TRVQod29yZCwgdmFsdWUpCQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRldfREVTQywgdmFsdWUpOyBcCisJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0ZXX0RFU0NfUzsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRldfREVTQ19HRVQod29yZCkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9GV19ERVNDX00pID4+CQlcCisJSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRldfREVTQ19TKQorCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfSU5GT19TRVQod29yZCwgdmFsdWUpCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5fT1JEX1BBRERSX0lORF9NU0RVX0lORk8sIHZhbHVlKTtcCisJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfSU5GT19TO1wKK30gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX01TRFVfSU5GT19HRVQod29yZCkgXAorCSgoKHdvcmQpICYgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9JTkZPX00pID4+CVwKKwkgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfTVNEVV9JTkZPX1MpCisKKyNkZWZpbmUgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfT0ZGTE9BRF9TRVQod29yZCwgdmFsdWUpCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5fT1JEX0lORF9PRkZMT0FELCB2YWx1ZSk7XAorCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5fT1JEX0lORF9PRkZMT0FEX1M7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX09GRkxPQURfR0VUKHdvcmQpCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfT0ZGTE9BRF9NKSA+PglcCisJSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfT0ZGTE9BRF9TKQorCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0ZSQUdfU0VUKHdvcmQsIHZhbHVlKQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lOX09SRF9JTkRfRlJBRywgdmFsdWUpOwlcCisJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTl9PUkRfSU5EX0ZSQUdfUzsJCVwKK30gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0ZSQUdfR0VUKHdvcmQpCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lOX09SRF9QQUREUl9JTkRfRlJBR19NKSA+PgkJXAorCUhUVF9SWF9JTl9PUkRfUEFERFJfSU5EX0ZSQUdfUykKKworLyogZGVmaW5pdGlvbnMgdXNlZCB3aXRoaW4gdGFyZ2V0IC0+IGhvc3QgcnggaW5kaWNhdGlvbiBtZXNzYWdlICovCisKK1BSRVBBQ0sgc3RydWN0IGh0dF9yeF9pbmRfaGRyX3ByZWZpeF90IHsKKwlBX1VJTlQzMgkJLyogd29yZCAwICovCisJCW1zZ190eXBlOjgsCisJICAgIGV4dF90aWQ6NSwKKwkJcmVsZWFzZV92YWxpZDoxLAorCQlmbHVzaF92YWxpZDoxLAorCQlyZXNlcnZlZDA6MSwKKwkJcGVlcl9pZDoxNjsKKworCUFfVUlOVDMyCQkvKiB3b3JkIDEgKi8KKwkJZmx1c2hfc3RhcnRfc2VxX251bTo2LAorCSAgICBmbHVzaF9lbmRfc2VxX251bTo2LAorCQlyZWxlYXNlX3N0YXJ0X3NlcV9udW06NiwKKwkJcmVsZWFzZV9lbmRfc2VxX251bTo2LAorCQludW1fbXBkdV9yYW5nZXM6ODsKK30gUE9TVFBBQ0s7CisKKyNkZWZpbmUgSFRUX1JYX0lORF9IRFJfUFJFRklYX0JZVEVTIChzaXplb2Yoc3RydWN0IGh0dF9yeF9pbmRfaGRyX3ByZWZpeF90KSkKKyNkZWZpbmUgSFRUX1JYX0lORF9IRFJfUFJFRklYX1NJWkUzMiAoSFRUX1JYX0lORF9IRFJfUFJFRklYX0JZVEVTID4+IDIpCisKKyNkZWZpbmUgSFRUX1RHVF9SU1NJX0lOVkFMSUQgMHg4MAorCitQUkVQQUNLIHN0cnVjdCBodHRfcnhfcHBkdV9kZXNjX3QgeworI2RlZmluZSBIVFRfUlhfSU5EX1BQRFVfT0ZGU0VUX1dPUkRfUlNTSV9DTUIgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRUX1JYX0lORF9QUERVX09GRlNFVF9XT1JEX1RJTUVTVEFNUF9TVUJNSUNST1NFQyAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUFBEVV9PRkZTRVRfV09SRF9QSFlfRVJSX0NPREUgICAgICAgICAgMAorI2RlZmluZSBIVFRfUlhfSU5EX1BQRFVfT0ZGU0VUX1dPUkRfUEhZX0VSUiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRUX1JYX0lORF9QUERVX09GRlNFVF9XT1JEX0xFR0FDWV9SQVRFICAgICAgICAgICAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUFBEVV9PRkZTRVRfV09SRF9MRUdBQ1lfUkFURV9TRUwgICAgICAgMAorI2RlZmluZSBIVFRfUlhfSU5EX1BQRFVfT0ZGU0VUX1dPUkRfRU5EX1ZBTElEICAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRUX1JYX0lORF9QUERVX09GRlNFVF9XT1JEX1NUQVJUX1ZBTElEICAgICAgICAgICAwCisJQV9VSU5UMzIJCS8qIHdvcmQgMCAqLworCQlyc3NpX2NtYjo4LAorCQl0aW1lc3RhbXBfc3VibWljcm9zZWM6OCwKKwkgICAgcGh5X2Vycl9jb2RlOjgsCisJICAgIHBoeV9lcnI6MSwKKwkJbGVnYWN5X3JhdGU6NCwKKwkJbGVnYWN5X3JhdGVfc2VsOjEsCisJCWVuZF92YWxpZDoxLAorCQlzdGFydF92YWxpZDoxOworCisjZGVmaW5lIEhUVF9SWF9JTkRfUFBEVV9PRkZTRVRfV09SRF9SU1NJMCAxCisJdW5pb24geworCQlBX1VJTlQzMgkvKiB3b3JkIDEgKi8KKwkJCXJzc2kwX3ByaTIwOjgsCisJCQlyc3NpMF9leHQyMDo4LAorCQkJcnNzaTBfZXh0NDA6OCwKKwkJCXJzc2kwX2V4dDgwOjg7CisJCUFfVUlOVDMyIHJzc2kwOwkvKiBhY2Nlc3MgYWxsIDIwLzQwLzgwIHBlci1iL3cgUlNTSXMgdG9nZXRoZXIgKi8KKwl9IHUwOworCisjZGVmaW5lIEhUVF9SWF9JTkRfUFBEVV9PRkZTRVRfV09SRF9SU1NJMSAyCisJdW5pb24geworCQlBX1VJTlQzMgkvKiB3b3JkIDIgKi8KKwkJCXJzc2kxX3ByaTIwOjgsCisJCQlyc3NpMV9leHQyMDo4LAorCQkJcnNzaTFfZXh0NDA6OCwKKwkJCXJzc2kxX2V4dDgwOjg7CisJCUFfVUlOVDMyIHJzc2kxOwkvKiBhY2Nlc3MgYWxsIDIwLzQwLzgwIHBlci1iL3cgUlNTSXMgdG9nZXRoZXIgKi8KKwl9IHUxOworCisjZGVmaW5lIEhUVF9SWF9JTkRfUFBEVV9PRkZTRVRfV09SRF9SU1NJMiAzCisJdW5pb24geworCQlBX1VJTlQzMgkvKiB3b3JkIDMgKi8KKwkJCXJzc2kyX3ByaTIwOjgsCisJCQlyc3NpMl9leHQyMDo4LAorCQkJcnNzaTJfZXh0NDA6OCwKKwkJCXJzc2kyX2V4dDgwOjg7CisJCUFfVUlOVDMyIHJzc2kyOwkvKiBhY2Nlc3MgYWxsIDIwLzQwLzgwIHBlci1iL3cgUlNTSXMgdG9nZXRoZXIgKi8KKwl9IHUyOworCisjZGVmaW5lIEhUVF9SWF9JTkRfUFBEVV9PRkZTRVRfV09SRF9SU1NJMyA0CisJdW5pb24geworCQlBX1VJTlQzMgkvKiB3b3JkIDQgKi8KKwkJCXJzc2kzX3ByaTIwOjgsCisJCQlyc3NpM19leHQyMDo4LAorCQkJcnNzaTNfZXh0NDA6OCwKKwkJCXJzc2kzX2V4dDgwOjg7CisJCUFfVUlOVDMyIHJzc2kzOwkvKiBhY2Nlc3MgYWxsIDIwLzQwLzgwIHBlci1iL3cgUlNTSXMgdG9nZXRoZXIgKi8KKwl9IHUzOworCisjZGVmaW5lIEhUVF9SWF9JTkRfUFBEVV9PRkZTRVRfV09SRF9UU0YzMiA1CisJQV9VSU5UMzIgdHNmMzI7CQkvKiB3b3JkIDUgKi8KKworI2RlZmluZSBIVFRfUlhfSU5EX1BQRFVfT0ZGU0VUX1dPUkRfVElNRVNUQU1QX01JQ1JPU0VDIDYKKwlBX1VJTlQzMiB0aW1lc3RhbXBfbWljcm9zZWM7CS8qIHdvcmQgNiAqLworCisjZGVmaW5lIEhUVF9SWF9JTkRfUFBEVV9PRkZTRVRfV09SRF9QUkVBTUJMRV9UWVBFIDcKKyNkZWZpbmUgSFRUX1JYX0lORF9QUERVX09GRlNFVF9XT1JEX1ZIVF9TSUdfQTEgICAgNworCUFfVUlOVDMyCQkvKiB3b3JkIDcgKi8KKwkJdmh0X3NpZ19hMToyNCwKKwkJcHJlYW1ibGVfdHlwZTo4OworCisjZGVmaW5lIEhUVF9SWF9JTkRfUFBEVV9PRkZTRVRfV09SRF9WSFRfU0lHX0EyICAgIDgKKwkgQV9VSU5UMzIJCS8qIHdvcmQgOCAqLworCQl2aHRfc2lnX2EyOjI0LAorCQlyZXNlcnZlZDA6ODsKK30gUE9TVFBBQ0s7CisKKyNkZWZpbmUgSFRUX1JYX1BQRFVfREVTQ19CWVRFUyAoc2l6ZW9mKHN0cnVjdCBodHRfcnhfcHBkdV9kZXNjX3QpKQorI2RlZmluZSBIVFRfUlhfUFBEVV9ERVNDX1NJWkUzMiAoSFRUX1JYX1BQRFVfREVTQ19CWVRFUyA+PiAyKQorCitQUkVQQUNLIHN0cnVjdCBodHRfcnhfaW5kX2hkcl9zdWZmaXhfdCB7CisJQV9VSU5UMzIJCS8qIHdvcmQgMCAqLworCQlmd19yeF9kZXNjX2J5dGVzOjE2LAorCQlyZXNlcnZlZDA6MTY7Cit9IFBPU1RQQUNLOworCisjZGVmaW5lIEhUVF9SWF9JTkRfSERSX1NVRkZJWF9CWVRFUyAoc2l6ZW9mKHN0cnVjdCBodHRfcnhfaW5kX2hkcl9zdWZmaXhfdCkpCisjZGVmaW5lIEhUVF9SWF9JTkRfSERSX1NVRkZJWF9TSVpFMzIgKEhUVF9SWF9JTkRfSERSX1NVRkZJWF9CWVRFUyA+PiAyKQorCitQUkVQQUNLIHN0cnVjdCBodHRfcnhfaW5kX2hkcl90IHsKKwlzdHJ1Y3QgaHR0X3J4X2luZF9oZHJfcHJlZml4X3QgcHJlZml4OworCXN0cnVjdCBodHRfcnhfcHBkdV9kZXNjX3QgcnhfcHBkdV9kZXNjOworCXN0cnVjdCBodHRfcnhfaW5kX2hkcl9zdWZmaXhfdCBzdWZmaXg7Cit9IFBPU1RQQUNLOworCisjZGVmaW5lIEhUVF9SWF9JTkRfSERSX0JZVEVTIChzaXplb2Yoc3RydWN0IGh0dF9yeF9pbmRfaGRyX3QpKQorI2RlZmluZSBIVFRfUlhfSU5EX0hEUl9TSVpFMzIgKEhUVF9SWF9JTkRfSERSX0JZVEVTID4+IDIpCisKKy8qIGNvbmZpcm0gdGhhdCBIVFRfUlhfSU5EX0hEUl9CWVRFUyBpcyBhIG11bHRpcGxlIG9mIDQgKi8KK0FfQ09NUElMRV9USU1FX0FTU0VSVChIVFRfUlhfSU5EX2hkcl9zaXplX3F1YW50dW0sCisJCSAgICAgIChIVFRfUlhfSU5EX0hEUl9CWVRFUyAmIDB4MykgPT0gMCk7CisKKy8qCisgKiBIVFRfUlhfSU5EX0ZXX1JYX1BQRFVfREVTQ19CWVRFX09GRlNFVDoKKyAqIHRoZSBvZmZzZXQgaW50byB0aGUgSFRUIHJ4IGluZGljYXRpb24gbWVzc2FnZSBhdCB3aGljaCB0aGUKKyAqIEZXIHJ4IFBQRFUgZGVzY3JpcHRvciByZXNpZGVzCisgKi8KKyNkZWZpbmUgSFRUX1JYX0lORF9GV19SWF9QUERVX0RFU0NfQllURV9PRkZTRVQgSFRUX1JYX0lORF9IRFJfUFJFRklYX0JZVEVTCisKKy8qCisgKiBIVFRfUlhfSU5EX0hEUl9TVUZGSVhfQllURV9PRkZTRVQ6CisgKiB0aGUgb2Zmc2V0IGludG8gdGhlIEhUVCByeCBpbmRpY2F0aW9uIG1lc3NhZ2UgYXQgd2hpY2ggdGhlCisgKiBoZWFkZXIgc3VmZml4IChGVyByeCBNU0RVIGJ5dGUgY291bnQpIHJlc2lkZXMKKyAqLworI2RlZmluZSBIVFRfUlhfSU5EX0hEUl9TVUZGSVhfQllURV9PRkZTRVQJCQkJXAorCShIVFRfUlhfSU5EX0ZXX1JYX1BQRFVfREVTQ19CWVRFX09GRlNFVCArIEhUVF9SWF9QUERVX0RFU0NfQllURVMpCisKKy8qCisgKiBIVFRfUlhfSU5EX0ZXX1JYX0RFU0NfQllURV9PRkZTRVQ6CisgKiB0aGUgb2Zmc2V0IGludG8gdGhlIEhUVCByeCBpbmRpY2F0aW9uIG1lc3NhZ2UgYXQgd2hpY2ggdGhlIHBlci1NU0RVCisgKiBpbmZvcm1hdGlvbiBzdGFydHMKKyAqIEJ5dGVzIDAtNyBhcmUgdGhlIG1lc3NhZ2UgaGVhZGVyOyBieXRlcyA4LTExIGNvbnRhaW4gdGhlIGxlbmd0aCBvZiB0aGUKKyAqIHBlci1NU0RVIGluZm9ybWF0aW9uIHBvcnRpb24gb2YgdGhlIG1lc3NhZ2UuICBUaGUgcGVyLU1TRFUgaW5mbyBpdHNlbGYKKyAqIHN0YXJ0cyBhdCBieXRlIDEyLgorICovCisjZGVmaW5lIEhUVF9SWF9JTkRfRldfUlhfREVTQ19CWVRFX09GRlNFVCBIVFRfUlhfSU5EX0hEUl9CWVRFUworCisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IHJ4IGluZGljYXRpb24gbWVzc2FnZSBkZWZpbml0aW9uCisgKgorICogQGRldGFpbHMKKyAqIFRoZSBmb2xsb3dpbmcgZmllbGQgZGVmaW5pdGlvbnMgZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiB0aGUgcnggaW5kaWNhdGlvbgorICogbWVzc2FnZSBzZW50IGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4KKyAqIFRoZSBtZXNzYWdlIGNvbnNpc3RzIG9mIHRocmVlIG1ham9yIHNlY3Rpb25zOgorICogMS4gIGEgZml4ZWQtbGVuZ3RoIGhlYWRlcgorICogMi4gIGEgdmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZmlybXdhcmUgcnggTVNEVSBkZXNjcmlwdG9ycworICogMy4gIG9uZSBvciBtb3JlIDQtb2N0ZXQgTVBEVSByYW5nZSBpbmZvcm1hdGlvbiBlbGVtZW50cworICogVGhlIGZpeGVkIGxlbmd0aCBoZWFkZXIgaXRzZWxmIGhhcyB0d28gc3ViLXNlY3Rpb25zCisgKiAxLiAgdGhlIG1lc3NhZ2UgbWV0YS1pbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGlkZW50aWZpY2F0aW9uIG9mIHRoZQorICogICAgIHNlbmRlciBhbmQgdHlwZSBvZiB0aGUgcmVjZWl2ZWQgZGF0YSwgYW5kIGEgNC1vY3RldCBmbHVzaC9yZWxlYXNlIElFCisgKiAyLiAgdGhlIGZpcm13YXJlIHJ4IFBQRFUgZGVzY3JpcHRvcgorICoKKyAqIFRoZSBmb3JtYXQgb2YgdGhlIG1lc3NhZ2UgaXMgZGVwaWN0ZWQgYmVsb3cuCisgKiBpbiB0aGlzIGRlcGljdGlvbiwgdGhlIGZvbGxvd2luZyBhYmJyZXZpYXRpb25zIGFyZSB1c2VkIGZvciBpbmZvcm1hdGlvbgorICogZWxlbWVudHMgd2l0aGluIHRoZSBtZXNzYWdlOgorICogICAtIFNWIC0gc3RhcnQgdmFsaWQ6IHRoaXMgZmxhZyBpcyBzZXQgaWYgdGhlIEZXIHJ4IFBQRFUgZGVzY3JpcHRvcgorICogICAgICAgICAgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBQUERVIHN0YXJ0IGFyZSB2YWxpZC4KKyAqICAgICAgICAgIFNwZWNpZmljYWxseSwgdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkIG9ubHkgaWYgU1YgaXMgc2V0OgorICogICAgICAgICAgICAgIFJTU0kgKGFsbCB2YXJpYW50cyksIEwsIGxlZ2FjeSByYXRlLCBwcmVhbWJsZSB0eXBlLCBzZXJ2aWNlLAorICogICAgICAgICAgICAgIFZIVC1TSUctQQorICogICAtIEVWIC0gZW5kIHZhbGlkOiB0aGlzIGZsYWcgaXMgc2V0IGlmIHRoZSBGVyByeCBQUERVIGRlc2NyaXB0b3IKKyAqICAgICAgICAgIGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUFBEVSBlbmQgYXJlIHZhbGlkLgorICogICAgICAgICAgU3BlY2lmaWNhbGx5LCB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgb25seSBpZiBFViBpcyBzZXQ6CisgKiAgICAgICAgICAgICAgUCwgUEhZIGVyciBjb2RlLCBUU0YsIG1pY3Jvc2VjIC8gc3ViLW1pY3Jvc2VjIHRpbWVzdGFtcAorICogICAtIEwgIC0gTGVnYWN5IHJhdGUgc2VsZWN0b3IgLSBpZiBsZWdhY3kgcmF0ZXMgYXJlIHVzZWQsIHRoaXMgZmxhZworICogICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJhdGUgaXMgZnJvbSBhIENDSyAoTCA9PSAxKSBvciBPRkRNCisgKiAgICAgICAgICAoTCA9PSAwKSBQSFkuCisgKiAgIC0gUCAgLSBQSFkgZXJyb3IgZmxhZyAtIGJvb2xlYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSByeCBmcmFtZSBoYWQKKyAqICAgICAgICAgIGEgUEhZIGVycm9yCisgKgorICogfDMxICAgICAgICAgICAgMjR8MjMgICAgICAgICAxOHwxN3wxNnwxNXwxNHwxM3wxMnwxMXwxMHw5fDh8N3w2fDV8NCAgICAgICAwfAorICogfC0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgICAgIHBlZXIgSUQgICAgICAgICAgIHwgIHxSVnxGVnwgZXh0IFRJRCAgICB8ICAgbXNnIHR5cGUgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgIG51bSAgICAgICB8ICAgcmVsZWFzZSAgIHwgICAgIHJlbGVhc2UgICAgIHwgICAgZmx1c2ggICAgfCAgIGZsdXNoICAgfAorICogfCAgICAgIE1QRFUgICAgICB8ICAgICBlbmQgICAgIHwgICAgICBzdGFydCAgICAgIHwgICAgIGVuZCAgICAgfCAgIHN0YXJ0ICAgfAorICogfCAgICAgcmFuZ2VzICAgICB8ICAgc2VxIG51bSAgIHwgICAgIHNlcSBudW0gICAgIHwgICBzZXEgbnVtICAgfCAgc2VxIG51bSAgfAorICogfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAorICogfFN8RXxMfCBsZWdhY3kgfFB8ICAgUEhZIGVyciBjb2RlICAgIHwgICAgIHN1Yi1taWNyb3NlYyAgICB8ICAgIGNvbWJpbmVkICAgfAorICogfFZ8VnwgfCAgcmF0ZSAgfCB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgdGltZXN0YW1wICAgICB8ICAgICAgIFJTU0kgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCBSU1NJIHJ4MCBleHQ4MCB8ICBSU1NJIHJ4MCBleHQ0MCAgIHwgICAgUlNTSSByeDAgIGV4dDIwICB8IFJTU0kgcngwIHByaTIwfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCBSU1NJIHJ4MSBleHQ4MCB8ICBSU1NJIHJ4MSBleHQ0MCAgIHwgICAgUlNTSSByeDEgIGV4dDIwICB8IFJTU0kgcngxIHByaTIwfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCBSU1NJIHJ4MiBleHQ4MCB8ICBSU1NJIHJ4MiBleHQ0MCAgIHwgICAgUlNTSSByeDIgIGV4dDIwICB8IFJTU0kgcngyIHByaTIwfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCBSU1NJIHJ4MyBleHQ4MCB8ICBSU1NJIHJ4MyBleHQ0MCAgIHwgICAgUlNTSSByeDMgIGV4dDIwICB8IFJTU0kgcngzIHByaTIwfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU0YgTFNCcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9zZWMgdGltZXN0YW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCBwcmVhbWJsZSB0eXBlICB8ICAgICAgICAgICAgICAgICAgICBIVC1TSUcgLyBWSFQtU0lHLUExICAgICAgICAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICBzZXJ2aWNlICAgICB8ICAgICAgICAgICAgICAgICAgICBIVC1TSUcgLyBWSFQtU0lHLUEyICAgICAgICAgICAgICAgICAgfAorICogfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAorICogfCAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgIHwgICAgICAgICAgRlcgcnggZGVzYyBieXRlcyAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgTVNEVSBSeCAgICB8ICAgICAgTVNEVSBSeCAgICAgIHwgICAgICAgIE1TRFUgUnggICAgICB8ICAgIE1TRFUgUnggICAgfAorICogfCAgICAgZGVzYyBCMyAgICB8ICAgICAgZGVzYyBCMiAgICAgIHwgICAgICAgIGRlc2MgQjEgICAgICB8ICAgIGRlc2MgQjAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICB8ICAgIE1TRFUgUnggICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIGRlc2MgQm4gICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgIHwgIE1QRFUgcmFuZ2Ugc3RhdHVzICB8ICAgTVBEVSBjb3VudCAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogOiAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgIDogIE1QRFUgcmFuZ2Ugc3RhdHVzICA6ICAgTVBEVSBjb3VudCAgOgorICogOi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gOgorICoKKyAqIEhlYWRlciBmaWVsZHM6CisgKiAgIC0gTVNHX1RZUEUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgdGhpcyBhcyBhbiByeCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqICAgICBWYWx1ZTogMHgxCisgKiAgIC0gRVhUX1RJRAorICogICAgIEJpdHMgMTI6OAorICogICAgIFB1cnBvc2U6IGlkZW50aWZ5IHRoZSB0cmFmZmljIElEIG9mIHRoZSByeCBkYXRhLCBpbmNsdWRpbmcKKyAqICAgICAgICAgc3BlY2lhbCAiZXh0ZW5kZWQiIFRJRCB2YWx1ZXMgZm9yIG11bHRpY2FzdCwgYnJvYWRjYXN0LCBhbmQKKyAqICAgICAgICAgbm9uLVFvUyBkYXRhIGZyYW1lcworICogICAgIFZhbHVlOiAwLTE1IGZvciByZWd1bGFyIFRJRHMsIG9yID49IDE2IGZvciBiY2FzdC9tY2FzdC9ub24tUW9TCisgKiAgIC0gRkxVU0hfVkFMSUQgKEZWKQorICogICAgIEJpdCAxMworICogICAgIFB1cnBvc2U6IGluZGljYXRlIHdoZXRoZXIgdGhlIGZsdXNoIElFIChzdGFydC9lbmQgc2VxdWVuY2UgbnVtYmVycykKKyAqICAgICAgICAgaXMgdmFsaWQKKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgMSAtPiBmbHVzaCBJRSBpcyB2YWxpZCBhbmQgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkCisgKiAgICAgICAgIDAgLT4gZmx1c2ggSUUgaXMgbm90IHZhbGlkIGFuZCBzaG91bGQgYmUgaWdub3JlZAorICogICAtIFJFTF9WQUxJRCAoUlYpCisgKiAgICAgQml0IDEzCisgKiAgICAgUHVycG9zZTogaW5kaWNhdGUgd2hldGhlciB0aGUgcmVsZWFzZSBJRSAoc3RhcnQvZW5kIHNlcXVlbmNlIG51bWJlcnMpCisgKiAgICAgICAgIGlzIHZhbGlkCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIDEgLT4gcmVsZWFzZSBJRSBpcyB2YWxpZCBhbmQgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkCisgKiAgICAgICAgIDAgLT4gcmVsZWFzZSBJRSBpcyBub3QgdmFsaWQgYW5kIHNob3VsZCBiZSBpZ25vcmVkCisgKiAgIC0gUEVFUl9JRAorICogICAgIEJpdHMgMzE6MTYKKyAqICAgICBQdXJwb3NlOiBJZGVudGlmeSwgYnkgSUQsIHdoaWNoIHBlZXIgc2VudCB0aGUgcnggZGF0YQorICogICAgIFZhbHVlOiBJRCBvZiB0aGUgcGVlciB3aG8gc2VudCB0aGUgcnggZGF0YQorICogICAtIEZMVVNIX1NFUV9OVU1fU1RBUlQKKyAqICAgICBCaXRzIDU6MAorICogICAgIFB1cnBvc2U6IEluZGljYXRlIHRoZSBzdGFydCBvZiBhIHNlcmllcyBvZiBNUERVcyB0byBmbHVzaAorICogICAgICAgICBOb3QgYWxsIE1QRFVzIHdpdGhpbiB0aGlzIHNlcmllcyBhcmUgbmVjZXNzYXJpbHkgdmFsaWQgLSB0aGUgaG9zdAorICogICAgICAgICBtdXN0IGNoZWNrIGVhY2ggc2VxdWVuY2UgbnVtYmVyIHdpdGhpbiB0aGlzIHJhbmdlIHRvIHNlZSBpZiB0aGUKKyAqICAgICAgICAgY29ycmVzcG9uZGluZyBNUERVIGlzIGFjdHVhbGx5IHByZXNlbnQuCisgKiAgICAgICAgIFRoaXMgZmllbGQgaXMgb25seSB2YWxpZCBpZiB0aGUgRlYgYml0IGlzIHNldC4KKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgVGhlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIGZpcnN0IE1QRFVzIHRvIGNoZWNrIHRvIGZsdXNoLgorICogICAgICAgICBUaGUgc2VxdWVuY2UgbnVtYmVyIGlzIG1hc2tlZCBieSAweDNmLgorICogICAtIEZMVVNIX1NFUV9OVU1fRU5ECisgKiAgICAgQml0cyAxMTo2CisgKiAgICAgUHVycG9zZTogSW5kaWNhdGUgdGhlIGVuZCBvZiBhIHNlcmllcyBvZiBNUERVcyB0byBmbHVzaAorICogICAgIFZhbHVlOgorICogICAgICAgICBUaGUgc2VxdWVuY2UgbnVtYmVyIG9uZSBsYXJnZXIgdGhhbiB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZQorICogICAgICAgICBsYXN0IE1QRFUgdG8gY2hlY2sgdG8gZmx1c2guCisgKiAgICAgICAgIFRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgbWFza2VkIGJ5IDB4M2YuCisgKiAgICAgICAgIE5vdCBhbGwgTVBEVXMgd2l0aGluIHRoaXMgc2VyaWVzIGFyZSBuZWNlc3NhcmlseSB2YWxpZCAtIHRoZSBob3N0CisgKiAgICAgICAgIG11c3QgY2hlY2sgZWFjaCBzZXF1ZW5jZSBudW1iZXIgd2l0aGluIHRoaXMgcmFuZ2UgdG8gc2VlIGlmIHRoZQorICogICAgICAgICBjb3JyZXNwb25kaW5nIE1QRFUgaXMgYWN0dWFsbHkgcHJlc2VudC4KKyAqICAgICAgICAgVGhpcyBmaWVsZCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBGViBiaXQgaXMgc2V0LgorICogICAtIFJFTF9TRVFfTlVNX1NUQVJUCisgKiAgICAgQml0cyAxNzoxMgorICogICAgIFB1cnBvc2U6IEluZGljYXRlIHRoZSBzdGFydCBvZiBhIHNlcmllcyBvZiBNUERVcyB0byByZWxlYXNlLgorICogICAgICAgICBBbGwgTVBEVXMgd2l0aGluIHRoaXMgc2VyaWVzIGFyZSBwcmVzZW50IGFuZCB2YWxpZCAtIHRoZSBob3N0CisgKiAgICAgICAgIG5lZWQgbm90IGNoZWNrIGVhY2ggc2VxdWVuY2UgbnVtYmVyIHdpdGhpbiB0aGlzIHJhbmdlIHRvIHNlZSBpZgorICogICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBNUERVIGlzIGFjdHVhbGx5IHByZXNlbnQuCisgKiAgICAgICAgIFRoaXMgZmllbGQgaXMgb25seSB2YWxpZCBpZiB0aGUgUlYgYml0IGlzIHNldC4KKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgVGhlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIGZpcnN0IE1QRFVzIHRvIGNoZWNrIHRvIHJlbGVhc2UuCisgKiAgICAgICAgIFRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgbWFza2VkIGJ5IDB4M2YuCisgKiAgIC0gUkVMX1NFUV9OVU1fRU5ECisgKiAgICAgQml0cyAyMzoxOAorICogICAgIFB1cnBvc2U6IEluZGljYXRlIHRoZSBlbmQgb2YgYSBzZXJpZXMgb2YgTVBEVXMgdG8gcmVsZWFzZS4KKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgVGhlIHNlcXVlbmNlIG51bWJlciBvbmUgbGFyZ2VyIHRoYW4gdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUKKyAqICAgICAgICAgbGFzdCBNUERVIHRvIGNoZWNrIHRvIHJlbGVhc2UuCisgKiAgICAgICAgIFRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgbWFza2VkIGJ5IDB4M2YuCisgKiAgICAgICAgIEFsbCBNUERVcyB3aXRoaW4gdGhpcyBzZXJpZXMgYXJlIHByZXNlbnQgYW5kIHZhbGlkIC0gdGhlIGhvc3QKKyAqICAgICAgICAgbmVlZCBub3QgY2hlY2sgZWFjaCBzZXF1ZW5jZSBudW1iZXIgd2l0aGluIHRoaXMgcmFuZ2UgdG8gc2VlIGlmCisgKiAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIE1QRFUgaXMgYWN0dWFsbHkgcHJlc2VudC4KKyAqICAgICAgICAgVGhpcyBmaWVsZCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBSViBiaXQgaXMgc2V0LgorICogICAtIE5VTV9NUERVX1JBTkdFUworICogICAgIEJpdHMgMzE6MjQKKyAqICAgICBQdXJwb3NlOiBJbmRpY2F0ZSBob3cgbWFueSByYW5nZXMgb2YgTVBEVXMgYXJlIHByZXNlbnQuCisgKiAgICAgICAgIEVhY2ggTVBEVSByYW5nZSBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiBjb250aWd1b3VzIE1QRFVzIHdpdGhpbiB0aGUKKyAqICAgICAgICAgcnggZnJhbWUgc2VxdWVuY2Ugd2hpY2ggYWxsIGhhdmUgdGhlIHNhbWUgTVBEVSBzdGF0dXMuCisgKiAgICAgVmFsdWU6IDEtNjMgKHR5cGljYWxseSBhIHNtYWxsIG51bWJlciwgbGlrZSAxLTMpCisgKgorICogUnggUFBEVSBkZXNjcmlwdG9yIGZpZWxkczoKKyAqICAgLSBSU1NJX0NNQgorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogQ29tYmluZWQgUlNTSSBmcm9tIGFsbCBhY3RpdmUgcnggY2hhaW5zLCBhY3Jvc3MgdGhlIGFjdGl2ZQorICogICAgICAgICBiYW5kd2lkdGguCisgKiAgICAgVmFsdWU6IFJTU0kgZEIgdW5pdHMgdy5yLnQuIG5vaXNlIGZsb29yCisgKiAgIC0gVElNRVNUQU1QX1NVQk1JQ1JPU0VDCisgKiAgICAgQml0cyAxNTo4CisgKiAgICAgUHVycG9zZTogaGlnaC1yZXNvbHV0aW9uIHRpbWVzdGFtcAorICogICAgIFZhbHVlOgorICogICAgICAgICBTdWItbWljcm9zZWNvbmQgdGltZSBvZiBQUERVIHJlY2VwdGlvbi4KKyAqICAgICAgICAgVGhpcyB0aW1lc3RhbXAgcmFuZ2VzIGZyb20gWzAsTUFDIGNsb2NrIE1IeikuCisgKiAgICAgICAgIFRoaXMgdGltZXN0YW1wIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggVElNRVNUQU1QX01JQ1JPU0VDCisgKiAgICAgICAgIHRvIGZvcm0gYSBoaWdoLXJlc29sdXRpb24sIGxhcmdlIHJhbmdlIHJ4IHRpbWVzdGFtcC4KKyAqICAgLSBQSFlfRVJSX0NPREUKKyAqICAgICBCaXRzIDIzOjE2CisgKiAgICAgUHVycG9zZToKKyAqICAgICAgICAgSWYgdGhlIHJ4IGZyYW1lIHByb2Nlc3NpbmcgcmVzdWx0ZWQgaW4gYSBQSFkgZXJyb3IsIGluZGljYXRlIHdoYXQKKyAqICAgICAgICAgdHlwZSBvZiByeCBQSFkgZXJyb3Igb2NjdXJyZWQuCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIFRoaXMgZmllbGQgaXMgdmFsaWQgaWYgdGhlICJQIiAoUEhZX0VSUikgZmxhZyBpcyBzZXQuCisgKiAgICAgICAgIFRCRDogZG9jdW1lbnQvc3BlY2lmeSB0aGUgdmFsdWVzIGZvciB0aGlzIGZpZWxkCisgKiAgIC0gUEhZX0VSUgorICogICAgIEJpdCAyNAorICogICAgIFB1cnBvc2U6IGluZGljYXRlIHdoZXRoZXIgdGhlIHJ4IFBQRFUgaGFkIGEgUEhZIGVycm9yCisgKiAgICAgVmFsdWU6IDAgLT4gbm8gcnggUEhZIGVycm9yLCAxIC0+IHJ4IFBIWSBlcnJvciBlbmNvdW50ZXJlZAorICogICAtIExFR0FDWV9SQVRFCisgKiAgICAgQml0cyAyODoyNQorICogICAgIFB1cnBvc2U6CisgKiAgICAgICAgIElmIHRoZSByeCBmcmFtZSB1c2VkIGEgbGVnYWN5IHJhdGUgcmF0aGVyIHRoYW4gYSBIVCBvciBWSFQgcmF0ZSwKKyAqICAgICAgICAgc3BlY2lmeSB3aGljaCByYXRlIHdhcyB1c2VkLgorICogICAgIFZhbHVlOgorICogICAgICAgICBUaGUgTEVHQUNZX1JBVEUgZmllbGQncyB2YWx1ZSBkZXBlbmRzIG9uIHRoZSAiTCIgKExFR0FDWV9SQVRFX1NFTCkKKyAqICAgICAgICAgZmxhZy4KKyAqICAgICAgICAgSWYgTEVHQUNZX1JBVEVfU0VMIGlzIDA6CisgKiAgICAgICAgICAgICAweDg6IE9GRE0gNDggTWJwcworICogICAgICAgICAgICAgMHg5OiBPRkRNIDI0IE1icHMKKyAqICAgICAgICAgICAgIDB4QTogT0ZETSAxMiBNYnBzCisgKiAgICAgICAgICAgICAweEI6IE9GRE0gNiBNYnBzCisgKiAgICAgICAgICAgICAweEM6IE9GRE0gNTQgTWJwcworICogICAgICAgICAgICAgMHhEOiBPRkRNIDM2IE1icHMKKyAqICAgICAgICAgICAgIDB4RTogT0ZETSAxOCBNYnBzCisgKiAgICAgICAgICAgICAweEY6IE9GRE0gOSBNYnBzCisgKiAgICAgICAgIElmIExFR0FDWV9SQVRFX1NFTCBpcyAxOgorICogICAgICAgICAgICAgMHg4OiBDQ0sgMTEgTWJwcyBsb25nIHByZWFtYmxlCisgKiAgICAgICAgICAgICAweDk6IENDSyA1LjUgTWJwcyBsb25nIHByZWFtYmxlCisgKiAgICAgICAgICAgICAweEE6IENDSyAyIE1icHMgbG9uZyBwcmVhbWJsZQorICogICAgICAgICAgICAgMHhCOiBDQ0sgMSBNYnBzIGxvbmcgcHJlYW1ibGUKKyAqICAgICAgICAgICAgIDB4QzogQ0NLIDExIE1icHMgc2hvcnQgcHJlYW1ibGUKKyAqICAgICAgICAgICAgIDB4RDogQ0NLIDUuNSBNYnBzIHNob3J0IHByZWFtYmxlCisgKiAgICAgICAgICAgICAweEU6IENDSyAyIE1icHMgc2hvcnQgcHJlYW1ibGUKKyAqICAgLSBMRUdBQ1lfUkFURV9TRUwKKyAqICAgICBCaXQgMjkKKyAqICAgICBQdXJwb3NlOiBpZiByeCB1c2VkIGEgbGVnYWN5IHJhdGUsIHNwZWNpZnkgd2hldGhlciBpdCB3YXMgT0ZETSBvciBDQ0sKKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgVGhpcyBmaWVsZCBpcyB2YWxpZCBpZiB0aGUgUFJFQU1CTEVfVFlQRSBmaWVsZCBpbmRpY2F0ZXMgdGhlIHJ4CisgKiAgICAgICAgIHVzZWQgYSBsZWdhY3kgcmF0ZS4KKyAqICAgICAgICAgMCAtPiBPRkRNLCAxIC0+IENDSworICogICAtIEVORF9WQUxJRAorICogICAgIEJpdCAzMAorICogICAgIFB1cnBvc2U6IEluZGljYXRlIHdoZXRoZXIgdGhlIEZXIHJ4IFBQRFUgZGVzYyBmaWVsZHMgYXNzb2NpYXRlZCB3aXRoCisgKiAgICAgICAgIHRoZSBzdGFydCBvZiB0aGUgUFBEVSBhcmUgdmFsaWQuICBTcGVjaWZpY2FsbHksIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgZmllbGRzIGFyZSBvbmx5IHZhbGlkIGlmIEVORF9WQUxJRCBpcyBzZXQ6CisgKiAgICAgICAgIFBIWV9FUlIsIFBIWV9FUlJfQ09ERSwgVFNGMzIsIFRJTUVTVEFNUF9NSUNST1NFQywKKyAqICAgICAgICAgVElNRVNUQU1QX1NVQk1JQ1JPU0VDCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIDAgLT4gcnggUFBEVSBkZXNjIGVuZCBmaWVsZHMgYXJlIG5vdCB2YWxpZAorICogICAgICAgICAxIC0+IHJ4IFBQRFUgZGVzYyBlbmQgZmllbGRzIGFyZSB2YWxpZAorICogICAtIFNUQVJUX1ZBTElECisgKiAgICAgQml0IDMxCisgKiAgICAgUHVycG9zZTogSW5kaWNhdGUgd2hldGhlciB0aGUgRlcgcnggUFBEVSBkZXNjIGZpZWxkcyBhc3NvY2lhdGVkIHdpdGgKKyAqICAgICAgICAgdGhlIGVuZCBvZiB0aGUgUFBEVSBhcmUgdmFsaWQuICBTcGVjaWZpY2FsbHksIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgZmllbGRzIGFyZSBvbmx5IHZhbGlkIGlmIFNUQVJUX1ZBTElEIGlzIHNldDoKKyAqICAgICAgICAgUlNTSSwgTEVHQUNZX1JBVEVfU0VMLCBMRUdBQ1lfUkFURSwgUFJFQU1CTEVfVFlQRSwgU0VSVklDRSwKKyAqICAgICAgICAgVkhULVNJRy1BCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIDAgLT4gcnggUFBEVSBkZXNjIHN0YXJ0IGZpZWxkcyBhcmUgbm90IHZhbGlkCisgKiAgICAgICAgIDEgLT4gcnggUFBEVSBkZXNjIHN0YXJ0IGZpZWxkcyBhcmUgdmFsaWQKKyAqICAgLSBSU1NJMF9QUkkyMAorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogUlNTSSBmcm9tIGNoYWluIDAgb24gdGhlIHByaW1hcnkgMjAgTUh6IGNoYW5uZWwKKyAqICAgICBWYWx1ZTogUlNTSSBkQiB1bml0cyB3LnIudC4gbm9pc2UgZmxvb3IKKyAqCisgKiAgIC0gUlNTSTBfRVhUMjAKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IFJTU0kgZnJvbSBjaGFpbiAwIG9uIHRoZSBib25kZWQgZXh0ZW5zaW9uIDIwIE1IeiBjaGFubmVsCisgKiAgICAgICAgIChpZiB0aGUgcnggYmFuZHdpZHRoIHdhcyA+PSA0MCBNSHopCisgKiAgICAgVmFsdWU6IFJTU0kgZEIgdW5pdHMgdy5yLnQuIG5vaXNlIGZsb29yCisgKiAgIC0gUlNTSTBfRVhUNDAKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IFJTU0kgZnJvbSBjaGFpbiAwIG9uIHRoZSBib25kZWQgZXh0ZW5zaW9uIDQwIE1IeiBjaGFubmVsCisgKiAgICAgICAgIChpZiB0aGUgcnggYmFuZHdpZHRoIHdhcyA+PSA4MCBNSHopCisgKiAgICAgVmFsdWU6IFJTU0kgZEIgdW5pdHMgdy5yLnQuIG5vaXNlIGZsb29yCisgKiAgIC0gUlNTSTBfRVhUODAKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IFJTU0kgZnJvbSBjaGFpbiAwIG9uIHRoZSBib25kZWQgZXh0ZW5zaW9uIDgwIE1IeiBjaGFubmVsCisgKiAgICAgICAgIChpZiB0aGUgcnggYmFuZHdpZHRoIHdhcyA+PSAxNjAgTUh6KQorICogICAgIFZhbHVlOiBSU1NJIGRCIHVuaXRzIHcuci50LiBub2lzZSBmbG9vcgorICoKKyAqICAgLSBSU1NJMV9QUkkyMAorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogUlNTSSBmcm9tIGNoYWluIDEgb24gdGhlIHByaW1hcnkgMjAgTUh6IGNoYW5uZWwKKyAqICAgICBWYWx1ZTogUlNTSSBkQiB1bml0cyB3LnIudC4gbm9pc2UgZmxvb3IKKyAqICAgLSBSU1NJMV9FWFQyMAorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogUlNTSSBmcm9tIGNoYWluIDEgb24gdGhlIGJvbmRlZCBleHRlbnNpb24gMjAgTUh6IGNoYW5uZWwKKyAqICAgICAgICAgKGlmIHRoZSByeCBiYW5kd2lkdGggd2FzID49IDQwIE1IeikKKyAqICAgICBWYWx1ZTogUlNTSSBkQiB1bml0cyB3LnIudC4gbm9pc2UgZmxvb3IKKyAqICAgLSBSU1NJMV9FWFQ0MAorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogUlNTSSBmcm9tIGNoYWluIDEgb24gdGhlIGJvbmRlZCBleHRlbnNpb24gNDAgTUh6IGNoYW5uZWwKKyAqICAgICAgICAgKGlmIHRoZSByeCBiYW5kd2lkdGggd2FzID49IDgwIE1IeikKKyAqICAgICBWYWx1ZTogUlNTSSBkQiB1bml0cyB3LnIudC4gbm9pc2UgZmxvb3IKKyAqICAgLSBSU1NJMV9FWFQ4MAorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogUlNTSSBmcm9tIGNoYWluIDEgb24gdGhlIGJvbmRlZCBleHRlbnNpb24gODAgTUh6IGNoYW5uZWwKKyAqICAgICAgICAgKGlmIHRoZSByeCBiYW5kd2lkdGggd2FzID49IDE2MCBNSHopCisgKiAgICAgVmFsdWU6IFJTU0kgZEIgdW5pdHMgdy5yLnQuIG5vaXNlIGZsb29yCisgKgorICogICAtIFJTU0kyX1BSSTIwCisgKiAgICAgQml0cyA3OjAKKyAqICAgICBQdXJwb3NlOiBSU1NJIGZyb20gY2hhaW4gMiBvbiB0aGUgcHJpbWFyeSAyMCBNSHogY2hhbm5lbAorICogICAgIFZhbHVlOiBSU1NJIGRCIHVuaXRzIHcuci50LiBub2lzZSBmbG9vcgorICogICAtIFJTU0kyX0VYVDIwCisgKiAgICAgQml0cyA3OjAKKyAqICAgICBQdXJwb3NlOiBSU1NJIGZyb20gY2hhaW4gMiBvbiB0aGUgYm9uZGVkIGV4dGVuc2lvbiAyMCBNSHogY2hhbm5lbAorICogICAgICAgICAoaWYgdGhlIHJ4IGJhbmR3aWR0aCB3YXMgPj0gNDAgTUh6KQorICogICAgIFZhbHVlOiBSU1NJIGRCIHVuaXRzIHcuci50LiBub2lzZSBmbG9vcgorICogICAtIFJTU0kyX0VYVDQwCisgKiAgICAgQml0cyA3OjAKKyAqICAgICBQdXJwb3NlOiBSU1NJIGZyb20gY2hhaW4gMiBvbiB0aGUgYm9uZGVkIGV4dGVuc2lvbiA0MCBNSHogY2hhbm5lbAorICogICAgICAgICAoaWYgdGhlIHJ4IGJhbmR3aWR0aCB3YXMgPj0gODAgTUh6KQorICogICAgIFZhbHVlOiBSU1NJIGRCIHVuaXRzIHcuci50LiBub2lzZSBmbG9vcgorICogICAtIFJTU0kyX0VYVDgwCisgKiAgICAgQml0cyA3OjAKKyAqICAgICBQdXJwb3NlOiBSU1NJIGZyb20gY2hhaW4gMiBvbiB0aGUgYm9uZGVkIGV4dGVuc2lvbiA4MCBNSHogY2hhbm5lbAorICogICAgICAgICAoaWYgdGhlIHJ4IGJhbmR3aWR0aCB3YXMgPj0gMTYwIE1IeikKKyAqICAgICBWYWx1ZTogUlNTSSBkQiB1bml0cyB3LnIudC4gbm9pc2UgZmxvb3IKKyAqCisgKiAgIC0gUlNTSTNfUFJJMjAKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IFJTU0kgZnJvbSBjaGFpbiAzIG9uIHRoZSBwcmltYXJ5IDIwIE1IeiBjaGFubmVsCisgKiAgICAgVmFsdWU6IFJTU0kgZEIgdW5pdHMgdy5yLnQuIG5vaXNlIGZsb29yCisgKiAgIC0gUlNTSTNfRVhUMjAKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IFJTU0kgZnJvbSBjaGFpbiAzIG9uIHRoZSBib25kZWQgZXh0ZW5zaW9uIDIwIE1IeiBjaGFubmVsCisgKiAgICAgICAgIChpZiB0aGUgcnggYmFuZHdpZHRoIHdhcyA+PSA0MCBNSHopCisgKiAgICAgVmFsdWU6IFJTU0kgZEIgdW5pdHMgdy5yLnQuIG5vaXNlIGZsb29yCisgKiAgIC0gUlNTSTNfRVhUNDAKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IFJTU0kgZnJvbSBjaGFpbiAzIG9uIHRoZSBib25kZWQgZXh0ZW5zaW9uIDQwIE1IeiBjaGFubmVsCisgKiAgICAgICAgIChpZiB0aGUgcnggYmFuZHdpZHRoIHdhcyA+PSA4MCBNSHopCisgKiAgICAgVmFsdWU6IFJTU0kgZEIgdW5pdHMgdy5yLnQuIG5vaXNlIGZsb29yCisgKiAgIC0gUlNTSTNfRVhUODAKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IFJTU0kgZnJvbSBjaGFpbiAzIG9uIHRoZSBib25kZWQgZXh0ZW5zaW9uIDgwIE1IeiBjaGFubmVsCisgKiAgICAgICAgIChpZiB0aGUgcnggYmFuZHdpZHRoIHdhcyA+PSAxNjAgTUh6KQorICogICAgIFZhbHVlOiBSU1NJIGRCIHVuaXRzIHcuci50LiBub2lzZSBmbG9vcgorICoKKyAqICAgLSBUU0YzMgorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IHNwZWNpZnkgdGhlIHRpbWUgdGhlIHJ4IFBQRFUgd2FzIHJlY2VpdmVkLCBpbiBUU0YgdW5pdHMKKyAqICAgICBWYWx1ZTogMzIgTFNCcyBvZiB0aGUgVFNGCisgKiAgIC0gVElNRVNUQU1QX01JQ1JPU0VDCisgKiAgICAgQml0cyAzMTowCisgKiAgICAgUHVycG9zZTogc3BlY2lmeSB0aGUgdGltZSB0aGUgcnggUFBEVSB3YXMgcmVjZWl2ZWQsIGluIG1pY3Jvc2Vjb25kIHVuaXRzCisgKiAgICAgVmFsdWU6IFBQRFUgcnggdGltZSwgaW4gbWljcm9zZWNvbmRzCisgKiAgIC0gVkhUX1NJR19BMQorICogICAgIEJpdHMgMjM6MAorICogICAgIFB1cnBvc2U6IFByb3ZpZGUgdGhlIEhULVNJRyAoaW5pdGlhbCAyNCBiaXRzKSBvciBWSFQtU0lHLUExIGZpZWxkCisgKiAgICAgICAgIGZyb20gdGhlIHJ4IFBQRFUKKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgSWYgUFJFQU1CTEVfVFlQRSBzcGVjaWZpZXMgVkhULCB0aGVuIHRoaXMgZmllbGQgY29udGFpbnMgdGhlCisgKiAgICAgICAgIFZIVC1TSUctQTEgZGF0YS4KKyAqICAgICAgICAgSWYgUFJFQU1CTEVfVFlQRSBzcGVjaWZpZXMgSFQsIHRoZW4gdGhpcyBmaWVsZCBjb250YWlucyB0aGUKKyAqICAgICAgICAgZmlyc3QgMjQgYml0cyBvZiB0aGUgSFQtU0lHIGRhdGEuCisgKiAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBpcyBpbnZhbGlkLgorICogICAgICAgICBSZWZlciB0byB0aGUgdGhlIDgwMi4xMSBwcm90b2NvbCBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlCisgKiAgICAgICAgIEhULVNJRyBhbmQgVkhULVNJRy1BMSBmaWVsZHMKKyAqICAgLSBWSFRfU0lHX0EyCisgKiAgICAgQml0cyAyMzowCisgKiAgICAgUHVycG9zZTogUHJvdmlkZSB0aGUgSFQtU0lHIChmaW5hbCAyNCBiaXRzKSBvciBWSFQtU0lHLUEyIGZpZWxkCisgKiAgICAgICAgIGZyb20gdGhlIHJ4IFBQRFUKKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgSWYgUFJFQU1CTEVfVFlQRSBzcGVjaWZpZXMgVkhULCB0aGVuIHRoaXMgZmllbGQgY29udGFpbnMgdGhlCisgKiAgICAgICAgIFZIVC1TSUctQTIgZGF0YS4KKyAqICAgICAgICAgSWYgUFJFQU1CTEVfVFlQRSBzcGVjaWZpZXMgSFQsIHRoZW4gdGhpcyBmaWVsZCBjb250YWlucyB0aGUKKyAqICAgICAgICAgbGFzdCAyNCBiaXRzIG9mIHRoZSBIVC1TSUcgZGF0YS4KKyAqICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIGlzIGludmFsaWQuCisgKiAgICAgICAgIFJlZmVyIHRvIHRoZSB0aGUgODAyLjExIHByb3RvY29sIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKKyAqICAgICAgICAgSFQtU0lHIGFuZCBWSFQtU0lHLUEyIGZpZWxkcworICogICAtIFBSRUFNQkxFX1RZUEUKKyAqICAgICBCaXRzIDMxOjI0CisgKiAgICAgUHVycG9zZTogaW5kaWNhdGUgdGhlIFBIWSBmb3JtYXQgb2YgdGhlIHJlY2VpdmVkIGJ1cnN0CisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIDB4NDogTGVnYWN5IChPRkRNL0NDSykKKyAqICAgICAgICAgMHg4OiBIVAorICogICAgICAgICAweDk6IEhUIHdpdGggVHhCRgorICogICAgICAgICAweEM6IFZIVAorICogICAgICAgICAweEQ6IFZIVCB3aXRoIFR4QkYKKyAqICAgLSBTRVJWSUNFCisgKiAgICAgQml0cyAzMToyNAorICogICAgIFB1cnBvc2U6IFRCRAorICogICAgIFZhbHVlOiBUQkQKKyAqCisgKiBSeCBNU0RVIGRlc2NyaXB0b3IgZmllbGRzOgorICogICAtIEZXX1JYX0RFU0NfQllURVMKKyAqICAgICBCaXRzIDE1OjAKKyAqICAgICBQdXJwb3NlOiBJbmRpY2F0ZSBob3cgbWFueSBieXRlcyBpbiB0aGUgUnggaW5kaWNhdGlvbiBhcmUgdXNlZCBmb3IKKyAqICAgICAgICAgRlcgUnggZGVzY3JpcHRvcnMKKyAqCisgKiBQYXlsb2FkIGZpZWxkczoKKyAqICAgLSBNUERVX0NPVU5UCisgKiAgICAgQml0cyA3OjAKKyAqICAgICBQdXJwb3NlOiBJbmRpY2F0ZSBob3cgbWFueSBzZXF1ZW50aWFsIE1QRFVzIHNoYXJlIHRoZSBzYW1lIHN0YXR1cy4KKyAqICAgICAgICAgQWxsIE1QRFVzIHdpdGhpbiB0aGUgaW5kaWNhdGVkIGxpc3QgYXJlIGZyb20gdGhlIHNhbWUgUkEtVEEtVElELgorICogICAtIE1QRFVfU1RBVFVTCisgKiAgICAgQml0cyAxNTo4CisgKiAgICAgUHVycG9zZTogSW5kaWNhdGUgd2hldGhlciB0aGUgKGdyb3VwIG9mIHNlcXVlbnRpYWwpIE1QRFUocykgd2VyZQorICogICAgICAgICByZWNlaXZlZCBzdWNjZXNzZnVsbHkuCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIDB4MTogc3VjY2VzcworICogICAgICAgICAweDI6IEZDUyBlcnJvcgorICogICAgICAgICAweDM6IGR1cGxpY2F0ZSBlcnJvcgorICogICAgICAgICAweDQ6IHJlcGxheSBlcnJvcgorICogICAgICAgICAweDU6IGludmFsaWQgcGVlcgorICovCisvKiBoZWFkZXIgZmllbGRzICovCisjZGVmaW5lIEhUVF9SWF9JTkRfRVhUX1RJRF9NICAgICAgMHgxZjAwCisjZGVmaW5lIEhUVF9SWF9JTkRfRVhUX1RJRF9TICAgICAgOAorI2RlZmluZSBIVFRfUlhfSU5EX0ZMVVNIX1ZBTElEX00gIDB4MjAwMAorI2RlZmluZSBIVFRfUlhfSU5EX0ZMVVNIX1ZBTElEX1MgIDEzCisjZGVmaW5lIEhUVF9SWF9JTkRfUkVMX1ZBTElEX00gICAgMHg0MDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUkVMX1ZBTElEX1MgICAgMTQKKyNkZWZpbmUgSFRUX1JYX0lORF9QRUVSX0lEX00gICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUEVFUl9JRF9TICAgICAgMTYKKworI2RlZmluZSBIVFRfUlhfSU5EX0ZMVVNIX1NFUV9OVU1fU1RBUlRfTSAweDNmCisjZGVmaW5lIEhUVF9SWF9JTkRfRkxVU0hfU0VRX05VTV9TVEFSVF9TIDAKKyNkZWZpbmUgSFRUX1JYX0lORF9GTFVTSF9TRVFfTlVNX0VORF9NICAgMHhmYzAKKyNkZWZpbmUgSFRUX1JYX0lORF9GTFVTSF9TRVFfTlVNX0VORF9TICAgNgorI2RlZmluZSBIVFRfUlhfSU5EX1JFTF9TRVFfTlVNX1NUQVJUX00gICAweDNmMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUkVMX1NFUV9OVU1fU1RBUlRfUyAgIDEyCisjZGVmaW5lIEhUVF9SWF9JTkRfUkVMX1NFUV9OVU1fRU5EX00gICAgIDB4ZmMwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUkVMX1NFUV9OVU1fRU5EX1MgICAgIDE4CisjZGVmaW5lIEhUVF9SWF9JTkRfTlVNX01QRFVfUkFOR0VTX00gICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSFRUX1JYX0lORF9OVU1fTVBEVV9SQU5HRVNfUyAgICAgMjQKKworLyogcnggUFBEVSBkZXNjcmlwdG9yIGZpZWxkcyAqLworI2RlZmluZSBIVFRfUlhfSU5EX1JTU0lfQ01CX00gICAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSFRUX1JYX0lORF9SU1NJX0NNQl9TICAgICAgICAgICAgICAwCisjZGVmaW5lIEhUVF9SWF9JTkRfVElNRVNUQU1QX1NVQk1JQ1JPU0VDX00gMHgwMDAwZmYwMAorI2RlZmluZSBIVFRfUlhfSU5EX1RJTUVTVEFNUF9TVUJNSUNST1NFQ19TIDgKKyNkZWZpbmUgSFRUX1JYX0lORF9QSFlfRVJSX0NPREVfTSAgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUEhZX0VSUl9DT0RFX1MgICAgICAgICAgMTYKKyNkZWZpbmUgSFRUX1JYX0lORF9QSFlfRVJSX00gICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUEhZX0VSUl9TICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgSFRUX1JYX0lORF9MRUdBQ1lfUkFURV9NICAgICAgICAgICAweDFlMDAwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfTEVHQUNZX1JBVEVfUyAgICAgICAgICAgMjUKKyNkZWZpbmUgSFRUX1JYX0lORF9MRUdBQ1lfUkFURV9TRUxfTSAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfTEVHQUNZX1JBVEVfU0VMX1MgICAgICAgMjkKKyNkZWZpbmUgSFRUX1JYX0lORF9FTkRfVkFMSURfTSAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfRU5EX1ZBTElEX1MgICAgICAgICAgICAgMzAKKyNkZWZpbmUgSFRUX1JYX0lORF9TVEFSVF9WQUxJRF9NICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfU1RBUlRfVkFMSURfUyAgICAgICAgICAgMzEKKworI2RlZmluZSBIVFRfUlhfSU5EX1JTU0lfUFJJMjBfTSAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSFRUX1JYX0lORF9SU1NJX1BSSTIwX1MgICAgICAgICAgICAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUlNTSV9FWFQyMF9NICAgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIVFRfUlhfSU5EX1JTU0lfRVhUMjBfUyAgICAgICAgICAgIDgKKyNkZWZpbmUgSFRUX1JYX0lORF9SU1NJX0VYVDQwX00gICAgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUlNTSV9FWFQ0MF9TICAgICAgICAgICAgMTYKKyNkZWZpbmUgSFRUX1JYX0lORF9SU1NJX0VYVDgwX00gICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUlNTSV9FWFQ4MF9TICAgICAgICAgICAgMjQKKworI2RlZmluZSBIVFRfUlhfSU5EX1ZIVF9TSUdfQTFfTSAgICAgICAgICAgIDB4MDBmZmZmZmYKKyNkZWZpbmUgSFRUX1JYX0lORF9WSFRfU0lHX0ExX1MgICAgICAgICAgICAwCisjZGVmaW5lIEhUVF9SWF9JTkRfVkhUX1NJR19BMl9NICAgICAgICAgICAgMHgwMGZmZmZmZgorI2RlZmluZSBIVFRfUlhfSU5EX1ZIVF9TSUdfQTJfUyAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRUX1JYX0lORF9QUkVBTUJMRV9UWVBFX00gICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfUFJFQU1CTEVfVFlQRV9TICAgICAgICAgMjQKKyNkZWZpbmUgSFRUX1JYX0lORF9TRVJWSUNFX00gICAgICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhUVF9SWF9JTkRfU0VSVklDRV9TICAgICAgICAgICAgICAgMjQKKworLyogcnggTVNEVSBkZXNjcmlwdG9yIGZpZWxkcyAqLworI2RlZmluZSBIVFRfUlhfSU5EX0ZXX1JYX0RFU0NfQllURVNfTSAgIDB4ZmZmZgorI2RlZmluZSBIVFRfUlhfSU5EX0ZXX1JYX0RFU0NfQllURVNfUyAgIDAKKworLyogcGF5bG9hZCBmaWVsZHMgKi8KKyNkZWZpbmUgSFRUX1JYX0lORF9NUERVX0NPVU5UX00gICAgMHhmZgorI2RlZmluZSBIVFRfUlhfSU5EX01QRFVfQ09VTlRfUyAgICAwCisjZGVmaW5lIEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfTSAgIDB4ZmYwMAorI2RlZmluZSBIVFRfUlhfSU5EX01QRFVfU1RBVFVTX1MgICA4CisKKworI2RlZmluZSBIVFRfUlhfSU5EX0VYVF9USURfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lORF9FWFRfVElELCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTkRfRVhUX1RJRF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lORF9FWFRfVElEX0dFVCh3b3JkKQkJCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lORF9FWFRfVElEX00pID4+IEhUVF9SWF9JTkRfRVhUX1RJRF9TKQorCisjZGVmaW5lIEhUVF9SWF9JTkRfRkxVU0hfVkFMSURfU0VUKHdvcmQsIHZhbHVlKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX0ZMVVNIX1ZBTElELCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTkRfRkxVU0hfVkFMSURfUzsJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX0ZMVVNIX1ZBTElEX0dFVCh3b3JkKQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5EX0ZMVVNIX1ZBTElEX00pID4+IEhUVF9SWF9JTkRfRkxVU0hfVkFMSURfUykKKworI2RlZmluZSBIVFRfUlhfSU5EX1JFTF9WQUxJRF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX1JFTF9WQUxJRCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5EX1JFTF9WQUxJRF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lORF9SRUxfVkFMSURfR0VUKHdvcmQpCQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5EX1JFTF9WQUxJRF9NKSA+PiBIVFRfUlhfSU5EX1JFTF9WQUxJRF9TKQorCisjZGVmaW5lIEhUVF9SWF9JTkRfUEVFUl9JRF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX1BFRVJfSUQsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lORF9QRUVSX0lEX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX1BFRVJfSURfR0VUKHdvcmQpCQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5EX1BFRVJfSURfTSkgPj4gSFRUX1JYX0lORF9QRUVSX0lEX1MpCisKKworI2RlZmluZSBIVFRfUlhfSU5EX0ZXX1JYX0RFU0NfQllURVNfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTkRfRldfUlhfREVTQ19CWVRFUywgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5EX0ZXX1JYX0RFU0NfQllURVNfUzsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTkRfRldfUlhfREVTQ19CWVRFU19HRVQod29yZCkJCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lORF9GV19SWF9ERVNDX0JZVEVTX00pID4+CQkJXAorCUhUVF9SWF9JTkRfRldfUlhfREVTQ19CWVRFU19TKQorCisKKyNkZWZpbmUgSFRUX1JYX0lORF9GTFVTSF9TRVFfTlVNX1NUQVJUX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX0ZMVVNIX1NFUV9OVU1fU1RBUlQsIHZhbHVlKTsgXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lORF9GTFVTSF9TRVFfTlVNX1NUQVJUX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX0ZMVVNIX1NFUV9OVU1fU1RBUlRfR0VUKHdvcmQpCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9JTkRfRkxVU0hfU0VRX05VTV9TVEFSVF9NKSA+PglcCisJIEhUVF9SWF9JTkRfRkxVU0hfU0VRX05VTV9TVEFSVF9TKQorCisjZGVmaW5lIEhUVF9SWF9JTkRfRkxVU0hfU0VRX05VTV9FTkRfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTkRfRkxVU0hfU0VRX05VTV9FTkQsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lORF9GTFVTSF9TRVFfTlVNX0VORF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lORF9GTFVTSF9TRVFfTlVNX0VORF9HRVQod29yZCkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9JTkRfRkxVU0hfU0VRX05VTV9FTkRfTSkgPj4JXAorCSBIVFRfUlhfSU5EX0ZMVVNIX1NFUV9OVU1fRU5EX1MpCisKKyNkZWZpbmUgSFRUX1JYX0lORF9SRUxfU0VRX05VTV9TVEFSVF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lORF9SRUxfU0VRX05VTV9TVEFSVCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5EX1JFTF9TRVFfTlVNX1NUQVJUX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX1JFTF9TRVFfTlVNX1NUQVJUX0dFVCh3b3JkKQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lORF9SRUxfU0VRX05VTV9TVEFSVF9NKSA+PglcCisJIEhUVF9SWF9JTkRfUkVMX1NFUV9OVU1fU1RBUlRfUykKKworI2RlZmluZSBIVFRfUlhfSU5EX1JFTF9TRVFfTlVNX0VORF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lORF9SRUxfU0VRX05VTV9FTkQsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lORF9SRUxfU0VRX05VTV9FTkRfUzsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTkRfUkVMX1NFUV9OVU1fRU5EX0dFVCh3b3JkKQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lORF9SRUxfU0VRX05VTV9FTkRfTSkgPj4JXAorCSBIVFRfUlhfSU5EX1JFTF9TRVFfTlVNX0VORF9TKQorCisjZGVmaW5lIEhUVF9SWF9JTkRfTlVNX01QRFVfUkFOR0VTX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX05VTV9NUERVX1JBTkdFUywgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5EX05VTV9NUERVX1JBTkdFU19TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lORF9OVU1fTVBEVV9SQU5HRVNfR0VUKHdvcmQpCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5EX05VTV9NUERVX1JBTkdFU19NKSA+PglcCisJIEhUVF9SWF9JTkRfTlVNX01QRFVfUkFOR0VTX1MpCisKKy8qIEZXIHJ4IFBQRFUgZGVzY3JpcHRvciBmaWVsZHMgKi8KKyNkZWZpbmUgSFRUX1JYX0lORF9SU1NJX0NNQl9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX1JTU0lfQ01CLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTkRfUlNTSV9DTUJfUzsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTkRfUlNTSV9DTUJfR0VUKHdvcmQpCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5EX1JTU0lfQ01CX00pID4+CVwKKwkgSFRUX1JYX0lORF9SU1NJX0NNQl9TKQorCisjZGVmaW5lIEhUVF9SWF9JTkRfVElNRVNUQU1QX1NVQk1JQ1JPU0VDX1NFVCh3b3JkLCB2YWx1ZSkJCVwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX1RJTUVTVEFNUF9TVUJNSUNST1NFQywgdmFsdWUpOyBcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5EX1RJTUVTVEFNUF9TVUJNSUNST1NFQ19TOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lORF9USU1FU1RBTVBfU1VCTUlDUk9TRUNfR0VUKHdvcmQpCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5EX1RJTUVTVEFNUF9TVUJNSUNST1NFQ19NKSA+PglcCisJIEhUVF9SWF9JTkRfVElNRVNUQU1QX1NVQk1JQ1JPU0VDX1MpCisKKyNkZWZpbmUgSFRUX1JYX0lORF9QSFlfRVJSX0NPREVfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTkRfUEhZX0VSUl9DT0RFLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTkRfUEhZX0VSUl9DT0RFX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX1BIWV9FUlJfQ09ERV9HRVQod29yZCkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9JTkRfUEhZX0VSUl9DT0RFX00pID4+CVwKKwkgSFRUX1JYX0lORF9QSFlfRVJSX0NPREVfUykKKworI2RlZmluZSBIVFRfUlhfSU5EX1BIWV9FUlJfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lORF9QSFlfRVJSLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTkRfUEhZX0VSUl9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lORF9QSFlfRVJSX0dFVCh3b3JkKQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lORF9QSFlfRVJSX00pID4+CVwKKwkgSFRUX1JYX0lORF9QSFlfRVJSX1MpCisKKyNkZWZpbmUgSFRUX1JYX0lORF9MRUdBQ1lfUkFURV9TRVQod29yZCwgdmFsdWUpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTkRfTEVHQUNZX1JBVEUsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lORF9MRUdBQ1lfUkFURV9TOwkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTkRfTEVHQUNZX1JBVEVfR0VUKHdvcmQpCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9JTkRfTEVHQUNZX1JBVEVfTSkgPj4gXAorCSBIVFRfUlhfSU5EX0xFR0FDWV9SQVRFX1MpCisKKyNkZWZpbmUgSFRUX1JYX0lORF9MRUdBQ1lfUkFURV9TRUxfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTkRfTEVHQUNZX1JBVEVfU0VMLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTkRfTEVHQUNZX1JBVEVfU0VMX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX0xFR0FDWV9SQVRFX1NFTF9HRVQod29yZCkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9JTkRfTEVHQUNZX1JBVEVfU0VMX00pID4+CVwKKwkgSFRUX1JYX0lORF9MRUdBQ1lfUkFURV9TRUxfUykKKworI2RlZmluZSBIVFRfUlhfSU5EX0VORF9WQUxJRF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX0VORF9WQUxJRCwgdmFsdWUpOyBcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5EX0VORF9WQUxJRF9TOyAgIFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX0VORF9WQUxJRF9HRVQod29yZCkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9JTkRfRU5EX1ZBTElEX00pID4+CVwKKwkgSFRUX1JYX0lORF9FTkRfVkFMSURfUykKKworI2RlZmluZSBIVFRfUlhfSU5EX1NUQVJUX1ZBTElEX1NFVCh3b3JkLCB2YWx1ZSkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lORF9TVEFSVF9WQUxJRCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5EX1NUQVJUX1ZBTElEX1M7CQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lORF9TVEFSVF9WQUxJRF9HRVQod29yZCkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lORF9TVEFSVF9WQUxJRF9NKSA+PiBcCisJIEhUVF9SWF9JTkRfU1RBUlRfVkFMSURfUykKKworI2RlZmluZSBIVFRfUlhfSU5EX1JTU0lfUFJJMjBfU0VUKHdvcmQsIHZhbHVlKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX1JTU0lfUFJJMjAsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lORF9SU1NJX1BSSTIwX1M7CQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lORF9SU1NJX1BSSTIwX0dFVCh3b3JkKQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lORF9SU1NJX1BSSTIwX00pID4+CVwKKwkgSFRUX1JYX0lORF9SU1NJX1BSSTIwX1MpCisKKyNkZWZpbmUgSFRUX1JYX0lORF9SU1NJX0VYVDIwX1NFVCh3b3JkLCB2YWx1ZSkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lORF9SU1NJX0VYVDIwLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTkRfUlNTSV9FWFQyMF9TOwkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTkRfUlNTSV9FWFQyMF9HRVQod29yZCkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9JTkRfUlNTSV9FWFQyMF9NKSA+PglcCisJIEhUVF9SWF9JTkRfUlNTSV9FWFQyMF9TKQorCisjZGVmaW5lIEhUVF9SWF9JTkRfUlNTSV9FWFQ0MF9TRVQod29yZCwgdmFsdWUpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTkRfUlNTSV9FWFQ0MCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5EX1JTU0lfRVhUNDBfUzsJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX1JTU0lfRVhUNDBfR0VUKHdvcmQpCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5EX1JTU0lfRVhUNDBfTSkgPj4JXAorCSBIVFRfUlhfSU5EX1JTU0lfRVhUNDBfUykKKworI2RlZmluZSBIVFRfUlhfSU5EX1JTU0lfRVhUODBfU0VUKHdvcmQsIHZhbHVlKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX1JTU0lfRVhUODAsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lORF9SU1NJX0VYVDgwX1M7CQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lORF9SU1NJX0VYVDgwX0dFVCh3b3JkKQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lORF9SU1NJX0VYVDgwX00pID4+CVwKKwkgSFRUX1JYX0lORF9SU1NJX0VYVDgwX1MpCisKKyNkZWZpbmUgSFRUX1JYX0lORF9WSFRfU0lHX0ExX1NFVCh3b3JkLCB2YWx1ZSkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0lORF9WSFRfU0lHX0ExLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTkRfVkhUX1NJR19BMV9TOwkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTkRfVkhUX1NJR19BMV9HRVQod29yZCkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9JTkRfVkhUX1NJR19BMV9NKSA+PglcCisJIEhUVF9SWF9JTkRfVkhUX1NJR19BMV9TKQorCisjZGVmaW5lIEhUVF9SWF9JTkRfVkhUX1NJR19BMl9TRVQod29yZCwgdmFsdWUpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTkRfVkhUX1NJR19BMiwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5EX1ZIVF9TSUdfQTJfUzsJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX1ZIVF9TSUdfQTJfR0VUKHdvcmQpCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5EX1ZIVF9TSUdfQTJfTSkgPj4JXAorCSBIVFRfUlhfSU5EX1ZIVF9TSUdfQTJfUykKKworI2RlZmluZSBIVFRfUlhfSU5EX1BSRUFNQkxFX1RZUEVfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9JTkRfUFJFQU1CTEVfVFlQRSwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfSU5EX1BSRUFNQkxFX1RZUEVfUzsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9JTkRfUFJFQU1CTEVfVFlQRV9HRVQod29yZCkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9JTkRfUFJFQU1CTEVfVFlQRV9NKSA+PglcCisJIEhUVF9SWF9JTkRfUFJFQU1CTEVfVFlQRV9TKQorCisjZGVmaW5lIEhUVF9SWF9JTkRfU0VSVklDRV9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX1NFUlZJQ0UsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lORF9TRVJWSUNFX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX1NFUlZJQ0VfR0VUKHdvcmQpCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5EX1NFUlZJQ0VfTSkgPj4JXAorCSBIVFRfUlhfSU5EX1NFUlZJQ0VfUykKKworCisjZGVmaW5lIEhUVF9SWF9JTkRfTVBEVV9DT1VOVF9TRVQod29yZCwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX01QRFVfQ09VTlQsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0lORF9NUERVX0NPVU5UX1M7CQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0lORF9NUERVX0NPVU5UX0dFVCh3b3JkKQkJCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0lORF9NUERVX0NPVU5UX00pID4+IEhUVF9SWF9JTkRfTVBEVV9DT1VOVF9TKQorCisjZGVmaW5lIEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfU0VUKHdvcmQsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfSU5EX01QRFVfU1RBVFVTLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfUzsJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfSU5EX01QRFVfU1RBVFVTX0dFVCh3b3JkKQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfSU5EX01QRFVfU1RBVFVTX00pID4+IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfUykKKworCisjZGVmaW5lIEhUVF9SWF9JTkRfSExfQllURVMJCQkJCVwKKwkoSFRUX1JYX0lORF9IRFJfQllURVMgKwkJCQkJXAorCSA0IC8qIHNpbmdsZSBGVyByeCBNU0RVIGRlc2NyaXB0b3IsIHBsdXMgcGFkZGluZyAqLyArCVwKKwkgNCAvKiBzaW5nbGUgTVBEVSByYW5nZSBpbmZvcm1hdGlvbiBlbGVtZW50ICovKQorI2RlZmluZSBIVFRfUlhfSU5EX0hMX1NJWkUzMiAoSFRUX1JYX0lORF9ITF9CWVRFUyA+PiAyKQorCisvKiBDb3VsZCB3ZSB1c2Ugb25lIG1hY3JvIGVudHJ5PyAqLworI2RlZmluZSBIVFRfV09SRF9TRVQod29yZCwgZmllbGQsIHZhbHVlKQkJXAorCWRvIHsJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKGZpZWxkLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICgodmFsdWUpIDw8IGZpZWxkICMjIF9TKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9XT1JEX0dFVCh3b3JkLCBmaWVsZCkJCVwKKwkoKCh3b3JkKSAmIGZpZWxkICMjIF9NKSA+PiBmaWVsZCAjIyBfUykKKworUFJFUEFDSyBzdHJ1Y3QgaGxfaHR0X3J4X2luZF9iYXNlIHsKKwkvKgorCSAqIGFsaWduIHdpdGggTEwgY2FzZSByeCBpbmRpY2F0aW9uIG1lc3NhZ2UsYnV0CisJICogcmVkdWNlZCB0byA1IHdvcmRzCisJICovCisJQV9VSU5UMzIgcnhfaW5kX21zZ1tIVFRfUlhfSU5EX0hMX1NJWkUzMl07Cit9IFBPU1RQQUNLOworCisvKgorICogSFRUX1JYX0lORF9ITF9SWF9ERVNDX0JBU0VfT0ZGU0VUCisgKiBDdXJyZW50bHksIHdlIHVzZSBhIHJlc3YgZmllbGQgaW4gaGxfaHR0X3J4X2luZF9iYXNlIHRvIHN0b3JlIHNvbWUKKyAqIEhMIGhvc3QgbmVlZGVkIGluZm8uIFRoZSBmaWVsZCBpcyBqdXN0IGFmdGVyIHRoZSBtc2R1IGZ3IHJ4IGRlc2MuCisgKi8KKyNkZWZpbmUgSFRUX1JYX0lORF9ITF9SWF9ERVNDX0JBU0VfT0ZGU0VUCQlcCisJCShIVFRfUlhfSU5EX0ZXX1JYX0RFU0NfQllURV9PRkZTRVQgKyAxKQorc3RydWN0IGh0dF9yeF9pbmRfaGxfcnhfZGVzY190IHsKKwlBX1VJTlQ4IHZlcjsKKwlBX1VJTlQ4IGxlbjsKKwlzdHJ1Y3QgeworCQlBX1VJTlQ4CisJCSAgICBmaXJzdF9tc2R1OjEsCisJCSAgICBsYXN0X21zZHU6MSwKKwkJICAgIGMzX2ZhaWxlZDoxLAorCQkJYzRfZmFpbGVkOjEsCisJCQlpcHY2OjEsCisJCQl0Y3A6MSwKKwkJCXVkcDoxLAorCQkJcmVzZXJ2ZWQ6MTsKKwl9IGZsYWdzOworfTsKKworI2RlZmluZSBIVFRfUlhfSU5EX0hMX1JYX0RFU0NfVkVSX09GRlNFVAkJCVwKKwkoSFRUX1JYX0lORF9ITF9SWF9ERVNDX0JBU0VfT0ZGU0VUCQkJXAorCSArIG9mZnNldG9mKHN0cnVjdCBodHRfcnhfaW5kX2hsX3J4X2Rlc2NfdCwgdmVyKSkKKyNkZWZpbmUgSFRUX1JYX0lORF9ITF9SWF9ERVNDX1ZFUiAwCisKKyNkZWZpbmUgSFRUX1JYX0lORF9ITF9SWF9ERVNDX0xFTl9PRkZTRVQJCQlcCisJKEhUVF9SWF9JTkRfSExfUlhfREVTQ19CQVNFX09GRlNFVAkJCVwKKwkgKyBvZmZzZXRvZihzdHJ1Y3QgaHR0X3J4X2luZF9obF9yeF9kZXNjX3QsIGxlbikpCisKKyNkZWZpbmUgSFRUX1JYX0lORF9ITF9GTEFHX09GRlNFVAkJCQlcCisJKEhUVF9SWF9JTkRfSExfUlhfREVTQ19CQVNFX09GRlNFVAkJCVwKKwkgKyBvZmZzZXRvZihzdHJ1Y3QgaHR0X3J4X2luZF9obF9yeF9kZXNjX3QsIGZsYWdzKSkKKworI2RlZmluZSBIVFRfUlhfSU5EX0hMX0ZMQUdfRklSU1RfTVNEVSAgICgweDAxIDw8IDApCisjZGVmaW5lIEhUVF9SWF9JTkRfSExfRkxBR19MQVNUX01TRFUgICAgKDB4MDEgPDwgMSkKKyNkZWZpbmUgSFRUX1JYX0lORF9ITF9GTEFHX0MzX0ZBSUxFRCAgICAoMHgwMSA8PCAyKQkvKiBMMyBjaGVja3N1bSBmYWlsZWQgKi8KKyNkZWZpbmUgSFRUX1JYX0lORF9ITF9GTEFHX0M0X0ZBSUxFRCAgICAoMHgwMSA8PCAzKQkvKiBMNCBjaGVja3N1bSBmYWlsZWQgKi8KKyNkZWZpbmUgSFRUX1JYX0lORF9ITF9GTEFHX0lQVjYgICAgICAgICAoMHgwMSA8PCA0KQkvKiBpcyBpcHY2LCBvciBpcHY0ICovCisjZGVmaW5lIEhUVF9SWF9JTkRfSExfRkxBR19UQ1AgICAgICAgICAgKDB4MDEgPDwgNSkJLyogaXMgdGNwICovCisjZGVmaW5lIEhUVF9SWF9JTkRfSExfRkxBR19VRFAgICAgICAgICAgKDB4MDEgPDwgNikJLyogaXMgdWRwICovCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGluIEhMLCB0aGUgYmFzaWMgZGVzY3JpcHRvciBpbmZvcm1hdGlvbgorICogdXNlZCBieSBob3N0LiB0aGUgc3RydWN0dXJlIGlzIHRyYW5zbGF0ZWQgYnkgRlcgZnJvbSBIVyBkZXNjCisgKiBvciBnZW5lcmF0ZWQgYnkgRlcuIEJ1dCBpbiBITCBtb25pdG9yIG1vZGUsIHRoZSBob3N0IHdvdWxkIHVzZQorICogdGhlIHNhbWUgc3RydWN0dXJlIHdpdGggTEwuCisgKi8KK1BSRVBBQ0sgc3RydWN0IGhsX2h0dF9yeF9kZXNjX2Jhc2UgeworCUFfVUlOVDMyCisJCXNlcV9udW06MTIsCisJCWVuY3J5cHRlZDoxLAorCQljaGFuX2luZm9fcHJlc2VudDoxLAorCQlyZXN2MDoyLAorCQltY2FzdF9iY2FzdDoxLAorCQlmcmFnbWVudDoxLAorCQlrZXlfaWRfb2N0OjgsCisJCXJlc3YxOjY7CisJQV9VSU5UMzIgcG5fMzFfMDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlBX1VJTlQxNiBwbl80N18zMjsKKwkJCUFfVUlOVDE2IHBuXzYzXzQ4OworCQl9IHBuMTY7CisJCUFfVUlOVDMyIHBuXzYzXzMyOworCX0gdTA7CisJQV9VSU5UMzIgIHBuXzk1XzY0OworCUFfVUlOVDMyICBwbl8xMjdfOTY7Cit9IFBPU1RQQUNLOworCisvKgorICogQ2hhbm5lbCBpbmZvcm1hdGlvbiBjYW4gb3B0aW9uYWxseSBiZSBhcHBlbmRlZCBhZnRlciBobF9odHRfcnhfZGVzY19iYXNlLgorICogSWYgc28sIHRoZSBsZW4gZmllbGQgaW4gaHR0X3J4X2luZF9obF9yeF9kZXNjX3Qgd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LAorICogYW5kIHRoZSBjaGFuX2luZm9fcHJlc2VudCBmbGFnIGluIGhsX2h0dF9yeF9kZXNjX2Jhc2Ugd2lsbCBiZSBzZXQuCisgKiBQbGVhc2Ugc2VlIGh0dF9jaGFuX2NoYW5nZV90IGZvciBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGRzLgorICovCitQUkVQQUNLIHN0cnVjdCBodHRfY2hhbl9pbmZvX3QKK3sKKwlBX1VJTlQzMgorCQlwcmltYXJ5X2NoYW5fY2VudGVyX2ZyZXFfbWh6OjE2LAorCQljb250aWdfY2hhbjFfY2VudGVyX2ZyZXFfbWh6OjE2OworCUFfVUlOVDMyCisJCWNvbnRpZ19jaGFuMl9jZW50ZXJfZnJlcV9taHo6MTYsCisJCXBoeV9tb2RlOjgsCisJCXJlc2VydmVkOjg7Cit9IFBPU1RQQUNLOworCisjZGVmaW5lIEhUVF9DSEFOX0lORk9fU0laRSAgICAgIHNpemVvZihzdHJ1Y3QgaHR0X2NoYW5faW5mb190KQorCisjZGVmaW5lIEhMX1JYX0RFU0NfU0laRSAgICAgICAgIChzaXplb2Yoc3RydWN0IGhsX2h0dF9yeF9kZXNjX2Jhc2UpKQorI2RlZmluZSBITF9SWF9ERVNDX1NJWkVfRFdPUkQgICAoSExfUlhfU1REX0RFU0NfU0laRSA+PiAyKQorCisjZGVmaW5lIEhUVF9ITF9SWF9ERVNDX01QRFVfU0VRX05VTV9NICAgICAgIDB4ZmZmCisjZGVmaW5lIEhUVF9ITF9SWF9ERVNDX01QRFVfU0VRX05VTV9TICAgICAgIDAKKyNkZWZpbmUgSFRUX0hMX1JYX0RFU0NfTVBEVV9FTkNfTSAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEhUVF9ITF9SWF9ERVNDX01QRFVfRU5DX1MgICAgICAgICAgIDEyCisjZGVmaW5lIEhUVF9ITF9SWF9ERVNDX0NIQU5fSU5GT19QUkVTRU5UX00gIDB4MjAwMAorI2RlZmluZSBIVFRfSExfUlhfREVTQ19DSEFOX0lORk9fUFJFU0VOVF9TICAxMworI2RlZmluZSBIVFRfSExfUlhfREVTQ19NQ0FTVF9CQ0FTVF9NICAgICAgICAweDEwMDAwCisjZGVmaW5lIEhUVF9ITF9SWF9ERVNDX01DQVNUX0JDQVNUX1MgICAgICAgIDE2CisjZGVmaW5lIEhUVF9ITF9SWF9ERVNDX0ZSQUdNRU5UX00gICAgICAgICAgIDB4MjAwMDAKKyNkZWZpbmUgSFRUX0hMX1JYX0RFU0NfRlJBR01FTlRfUyAgICAgICAgICAgMTcKKyNkZWZpbmUgSFRUX0hMX1JYX0RFU0NfS0VZX0lEX09DVF9NICAgICAgICAgMHgzZmMwMDAwCisjZGVmaW5lIEhUVF9ITF9SWF9ERVNDX0tFWV9JRF9PQ1RfUyAgICAgICAgIDE4CisKKyNkZWZpbmUgSFRUX0hMX1JYX0RFU0NfUE5fT0ZGU0VUCQlcCisJb2Zmc2V0b2Yoc3RydWN0IGhsX2h0dF9yeF9kZXNjX2Jhc2UsIHBuXzMxXzApCisjZGVmaW5lIEhUVF9ITF9SWF9ERVNDX1BOX1dPUkRfT0ZGU0VUCVwKKwkoSFRUX0hMX1JYX0RFU0NfUE5fT0ZGU0VUID4+IDIpCisKKy8qIENoYW5uZWwgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgSFRUX0NIQU5fSU5GT19QUklNQVJZX0NIQU5fQ0VOVEVSX0ZSRVFfTSAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFRUX0NIQU5fSU5GT19QUklNQVJZX0NIQU5fQ0VOVEVSX0ZSRVFfUyAgIDAKKyNkZWZpbmUgSFRUX0NIQU5fSU5GT19DT05USUdfQ0hBTjFfQ0VOVEVSX0ZSRVFfTSAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRUX0NIQU5fSU5GT19DT05USUdfQ0hBTjFfQ0VOVEVSX0ZSRVFfUyAgIDE2CisjZGVmaW5lIEhUVF9DSEFOX0lORk9fQ09OVElHX0NIQU4yX0NFTlRFUl9GUkVRX00gICAweDAwMDBmZmZmCisjZGVmaW5lIEhUVF9DSEFOX0lORk9fQ09OVElHX0NIQU4yX0NFTlRFUl9GUkVRX1MgICAwCisjZGVmaW5lIEhUVF9DSEFOX0lORk9fUEhZX01PREVfTSAgICAgICAgICAgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhUVF9DSEFOX0lORk9fUEhZX01PREVfUyAgICAgICAgICAgICAgICAgICAxNgorCisKKyNkZWZpbmUgSFRUX0NIQU5fSU5GT19QUklNQVJZX0NIQU5fQ0VOVEVSX0ZSRVFfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9DSEFOX0lORk9fUFJJTUFSWV9DSEFOX0NFTlRFUl9GUkVRLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9DSEFOX0lORk9fUFJJTUFSWV9DSEFOX0NFTlRFUl9GUkVRX1M7CQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX0NIQU5fSU5GT19QUklNQVJZX0NIQU5fQ0VOVEVSX0ZSRVFfR0VUKHdvcmQpCQkJXAorCSgoKHdvcmQpICYgSFRUX0NIQU5fSU5GT19QUklNQVJZX0NIQU5fQ0VOVEVSX0ZSRVFfTSkJCQlcCisJCQkJPj4gSFRUX0NIQU5fSU5GT19QUklNQVJZX0NIQU5fQ0VOVEVSX0ZSRVFfUykKKworCisjZGVmaW5lIEhUVF9DSEFOX0lORk9fQ09OVElHX0NIQU4xX0NFTlRFUl9GUkVRX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfQ0hBTl9JTkZPX0NPTlRJR19DSEFOMV9DRU5URVJfRlJFUSwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfQ0hBTl9JTkZPX0NPTlRJR19DSEFOMV9DRU5URVJfRlJFUV9TOwkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9DSEFOX0lORk9fQ09OVElHX0NIQU4xX0NFTlRFUl9GUkVRX0dFVCh3b3JkKQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9DSEFOX0lORk9fQ09OVElHX0NIQU4xX0NFTlRFUl9GUkVRX00pCQkJXAorCQkJPj4gSFRUX0NIQU5fSU5GT19DT05USUdfQ0hBTjFfQ0VOVEVSX0ZSRVFfUykKKworCisjZGVmaW5lIEhUVF9DSEFOX0lORk9fQ09OVElHX0NIQU4yX0NFTlRFUl9GUkVRX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfQ0hBTl9JTkZPX0NPTlRJR19DSEFOMl9DRU5URVJfRlJFUSwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfQ0hBTl9JTkZPX0NPTlRJR19DSEFOMl9DRU5URVJfRlJFUV9TOwkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9DSEFOX0lORk9fQ09OVElHX0NIQU4yX0NFTlRFUl9GUkVRX0dFVCh3b3JkKQkJCVwKKwkJKCgod29yZCkgJiBIVFRfQ0hBTl9JTkZPX0NPTlRJR19DSEFOMl9DRU5URVJfRlJFUV9NKQkJXAorCQkJPj4gSFRUX0NIQU5fSU5GT19DT05USUdfQ0hBTjJfQ0VOVEVSX0ZSRVFfUykKKworCisjZGVmaW5lIEhUVF9DSEFOX0lORk9fUEhZX01PREVfU0VUKHdvcmQsIHZhbHVlKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0NIQU5fSU5GT19QSFlfTU9ERSwgdmFsdWUpOwkJCVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9DSEFOX0lORk9fUEhZX01PREVfUzsJCQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9DSEFOX0lORk9fUEhZX01PREVfR0VUKHdvcmQpCQkJCVwKKwkJKCgod29yZCkgJiBIVFRfQ0hBTl9JTkZPX1BIWV9NT0RFX00pCQkJXAorCQk+PiBIVFRfQ0hBTl9JTkZPX1BIWV9NT0RFX1MpCisKKy8qCisgKiBAYnJpZWYgdGFyZ2V0IC0+IGhvc3QgcnggcmVvcmRlciBmbHVzaCBtZXNzYWdlIGRlZmluaXRpb24KKyAqCisgKiBAZGV0YWlscworICogVGhlIGZvbGxvd2luZyBmaWVsZCBkZWZpbml0aW9ucyBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSByeCBmbHVzaAorICogbWVzc2FnZSBzZW50IGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4KKyAqIFRoZSBtZXNzYWdlIGNvbnNpc3RzIG9mIGEgNC1vY3RldCBoZWFkZXIsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlCisgKiA0LW9jdGV0IHBheWxvYWQgaW5mb3JtYXRpb24gZWxlbWVudHMuCisgKgorICogICAgIHwzMSAgICAgICAgICAgMjR8MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgMHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgfCAgICAgICBUSUQgICAgIHwgICAgICAgICAgcGVlciBJRCAgICAgICAgICAgICAgfCAgIG1zZyB0eXBlICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICBzZXEgbnVtIGVuZCAgfCBzZXEgbnVtIHN0YXJ0IHwgIE1QRFUgc3RhdHVzICB8ICAgcmVzZXJ2ZWQgICB8CisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogRmlyc3QgRFdPUkQ6CisgKiAgIC0gTVNHX1RZUEUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgdGhpcyBhcyBhbiByeCBmbHVzaCBtZXNzYWdlCisgKiAgICAgVmFsdWU6IDB4MgorICogICAtIFBFRVJfSUQKKyAqICAgICBCaXRzIDIzOjggKG9ubHkgYml0cyAxODo4IGFjdHVhbGx5IHVzZWQpCisgKiAgICAgUHVycG9zZTogaWRlbnRpZnkgd2hpY2ggcGVlcidzIHJ4IGRhdGEgaXMgYmVpbmcgZmx1c2hlZAorICogICAgIFZhbHVlOiAocngpIHBlZXIgSUQKKyAqICAgLSBUSUQKKyAqICAgICBCaXRzIDMxOjI0IChvbmx5IGJpdHMgMjc6MjQgYWN0dWFsbHkgdXNlZCkKKyAqICAgICBQdXJwb3NlOiBTcGVjaWZpZXMgd2hpY2ggdHJhZmZpYyBpZGVudGlmaWVyJ3MgcnggZGF0YSBpcyBiZWluZyBmbHVzaGVkCisgKiAgICAgVmFsdWU6IHRyYWZmaWMgaWRlbnRpZmllcgorICogU2Vjb25kIERXT1JEOgorICogICAtIE1QRFVfU1RBVFVTCisgKiAgICAgQml0cyAxNTo4CisgKiAgICAgUHVycG9zZToKKyAqICAgICAgICAgSW5kaWNhdGUgd2hldGhlciB0aGUgZmx1c2hlZCBNUERVcyBzaG91bGQgYmUgZGlzY2FyZGVkIG9yIHByb2Nlc3NlZC4KKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgMHgxOiAgIHNlbmQgdGhlIE1QRFVzIGZyb20gdGhlIHJ4IHJlb3JkZXIgYnVmZmVyIHRvIHN1YnNlcXVlbnQKKyAqICAgICAgICAgICAgICAgIHN0YWdlcyBvZiByeCBwcm9jZXNzaW5nCisgKiAgICAgICAgIG90aGVyOiBkaXNjYXJkIHRoZSBNUERVcworICogICAgICAgICBJdCBpcyBhbnRpY2lwYXRlZCB0aGF0IGZsdXNoIG1lc3NhZ2VzIHdpbGwgYWx3YXlzIGhhdmUKKyAqICAgICAgICAgTVBEVSBzdGF0dXMgPT0gMSwgYnV0IHRoZSBzdGF0dXMgZmxhZyBpcyBpbmNsdWRlZCBmb3IKKyAqICAgICAgICAgZmxleGliaWxpdHkuCisgKiAgIC0gU0VRX05VTV9TVEFSVAorICogICAgIEJpdHMgMjM6MTYKKyAqICAgICBQdXJwb3NlOgorICogICAgICAgICBJbmRpY2F0ZSB0aGUgc3RhcnQgb2YgYSBzZXJpZXMgb2YgY29uc2VjdXRpdmUgTVBEVXMgYmVpbmcgZmx1c2hlZC4KKyAqICAgICAgICAgTm90IGFsbCBNUERVcyB3aXRoaW4gdGhpcyByYW5nZSBhcmUgbmVjZXNzYXJpbHkgdmFsaWQgLSB0aGUgaG9zdAorICogICAgICAgICBtdXN0IGNoZWNrIGVhY2ggc2VxdWVuY2UgbnVtYmVyIHdpdGhpbiB0aGlzIHJhbmdlIHRvIHNlZSBpZiB0aGUKKyAqICAgICAgICAgY29ycmVzcG9uZGluZyBNUERVIGlzIGFjdHVhbGx5IHByZXNlbnQuCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIFRoZSBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSBmaXJzdCBNUERVIGluIHRoZSBzZXF1ZW5jZS4KKyAqICAgICAgICAgVGhpcyBzZXF1ZW5jZSBudW1iZXIgaXMgdGhlIDYgTFNCcyBvZiB0aGUgODAyLjExIHNlcXVlbmNlIG51bWJlci4KKyAqICAgLSBTRVFfTlVNX0VORAorICogICAgIEJpdHMgMzA6MjQKKyAqICAgICBQdXJwb3NlOgorICogICAgICAgICBJbmRpY2F0ZSB0aGUgZW5kIG9mIGEgc2VyaWVzIG9mIGNvbnNlY3V0aXZlIE1QRFVzIGJlaW5nIGZsdXNoZWQuCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIFRoZSBzZXF1ZW5jZSBudW1iZXIgb25lIGxhcmdlciB0aGFuIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlCisgKiAgICAgICAgIGxhc3QgTVBEVSBiZWluZyBmbHVzaGVkLgorICogICAgICAgICBUaGlzIHNlcXVlbmNlIG51bWJlciBpcyB0aGUgNiBMU0JzIG9mIHRoZSA4MDIuMTEgc2VxdWVuY2UgbnVtYmVyLgorICogICAgICAgICBUaGUgcmFuZ2Ugb2YgTVBEVXMgZnJvbSBbU0VRX05VTV9TVEFSVCxTRVFfTlVNX0VORC0xXSBpbmNsdXNpdmUKKyAqICAgICAgICAgYXJlIHRvIGJlIHJlbGVhc2VkIGZvciBmdXJ0aGVyIHJ4IHByb2Nlc3NpbmcuCisgKiAgICAgICAgIE5vdCBhbGwgTVBEVXMgd2l0aGluIHRoaXMgcmFuZ2UgYXJlIG5lY2Vzc2FyaWx5IHZhbGlkIC0gdGhlIGhvc3QKKyAqICAgICAgICAgbXVzdCBjaGVjayBlYWNoIHNlcXVlbmNlIG51bWJlciB3aXRoaW4gdGhpcyByYW5nZSB0byBzZWUgaWYgdGhlCisgKiAgICAgICAgIGNvcnJlc3BvbmRpbmcgTVBEVSBpcyBhY3R1YWxseSBwcmVzZW50LgorICovCisvKiBmaXJzdCBEV09SRCAqLworI2RlZmluZSBIVFRfUlhfRkxVU0hfUEVFUl9JRF9NICAweGZmZmYwMAorI2RlZmluZSBIVFRfUlhfRkxVU0hfUEVFUl9JRF9TICA4CisjZGVmaW5lIEhUVF9SWF9GTFVTSF9USURfTSAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSFRUX1JYX0ZMVVNIX1RJRF9TICAgICAgMjQKKy8qIHNlY29uZCBEV09SRCAqLworI2RlZmluZSBIVFRfUlhfRkxVU0hfTVBEVV9TVEFUVVNfTSAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSFRUX1JYX0ZMVVNIX01QRFVfU1RBVFVTX1MgICA4CisjZGVmaW5lIEhUVF9SWF9GTFVTSF9TRVFfTlVNX1NUQVJUX00gMHgwMGZmMDAwMAorI2RlZmluZSBIVFRfUlhfRkxVU0hfU0VRX05VTV9TVEFSVF9TIDE2CisjZGVmaW5lIEhUVF9SWF9GTFVTSF9TRVFfTlVNX0VORF9NICAgMHhmZjAwMDAwMAorI2RlZmluZSBIVFRfUlhfRkxVU0hfU0VRX05VTV9FTkRfUyAgIDI0CisKKyNkZWZpbmUgSFRUX1JYX0ZMVVNIX0JZVEVTIDgKKworI2RlZmluZSBIVFRfUlhfRkxVU0hfUEVFUl9JRF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfRkxVU0hfUEVFUl9JRCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfRkxVU0hfUEVFUl9JRF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0ZMVVNIX1BFRVJfSURfR0VUKHdvcmQpCQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfRkxVU0hfUEVFUl9JRF9NKSA+PiBIVFRfUlhfRkxVU0hfUEVFUl9JRF9TKQorCisjZGVmaW5lIEhUVF9SWF9GTFVTSF9USURfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0ZMVVNIX1RJRCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfRkxVU0hfVElEX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfRkxVU0hfVElEX0dFVCh3b3JkKQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfRkxVU0hfVElEX00pID4+IEhUVF9SWF9GTFVTSF9USURfUykKKworI2RlZmluZSBIVFRfUlhfRkxVU0hfTVBEVV9TVEFUVVNfU0VUKHdvcmQsIHZhbHVlKQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfRkxVU0hfTVBEVV9TVEFUVVMsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0ZMVVNIX01QRFVfU1RBVFVTX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfRkxVU0hfTVBEVV9TVEFUVVNfR0VUKHdvcmQpCQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9GTFVTSF9NUERVX1NUQVRVU19NKSA+PiBIVFRfUlhfRkxVU0hfTVBEVV9TVEFUVVNfUykKKworI2RlZmluZSBIVFRfUlhfRkxVU0hfU0VRX05VTV9TVEFSVF9TRVQod29yZCwgdmFsdWUpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfRkxVU0hfU0VRX05VTV9TVEFSVCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfRkxVU0hfU0VRX05VTV9TVEFSVF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0ZMVVNIX1NFUV9OVU1fU1RBUlRfR0VUKHdvcmQpCQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9GTFVTSF9TRVFfTlVNX1NUQVJUX00pID4+CQlcCisJSFRUX1JYX0ZMVVNIX1NFUV9OVU1fU1RBUlRfUykKKworI2RlZmluZSBIVFRfUlhfRkxVU0hfU0VRX05VTV9FTkRfU0VUKHdvcmQsIHZhbHVlKQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfRkxVU0hfU0VRX05VTV9FTkQsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0ZMVVNIX1NFUV9OVU1fRU5EX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfRkxVU0hfU0VRX05VTV9FTkRfR0VUKHdvcmQpCQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9GTFVTSF9TRVFfTlVNX0VORF9NKSA+PiBIVFRfUlhfRkxVU0hfU0VRX05VTV9FTkRfUykKKworLyoKKyAqIEBicmllZiB0YXJnZXQgLT4gaG9zdCByeCBwbiBjaGVjayBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqCisgKiBAZGV0YWlscworICogVGhlIGZvbGxvd2luZyBmaWVsZCBkZWZpbml0aW9ucyBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSBSeCBQTiBjaGVjaworICogaW5kaWNhdGlvbiBtZXNzYWdlIHNlbnQgZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0LgorICogVGhlIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSA0LW9jdGV0IGhlYWRlciwgZm9sbG93ZWQgYnkgdGhlIHN0YXJ0IGFuZAorICogZW5kIHNlcXVlbmNlIG51bWJlcnMgdG8gYmUgcmVsZWFzZWQsIGZvbGxvd2VkIGJ5IHRoZSBQTiBJRXMuIEVhY2ggUE4KKyAqIElFIGlzIG9uZSBvY3RldCBjb250YWluaW5nIHRoZSBzZXF1ZW5jZSBudW1iZXIgdGhhdCBmYWlsZWQgdGhlIFBOCisgKiBjaGVjay4KKyAqCisgKiAgICAgfDMxICAgICAgICAgICAyNHwyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA4fDcgICAgICAgICAgICAwfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgIFRJRCAgICAgfCAgICAgICAgICBwZWVyIElEICAgICAgICAgICAgICB8ICAgbXNnIHR5cGUgICB8CisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgIFJlc2VydmVkICAgICB8IFBOIElFIGNvdW50ICAgfCBzZXEgbnVtIGVuZCAgIHwgc2VxIG51bSBzdGFydHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgbCAgICAgICAgICAgICAgIDogICAgUE4gSUUgMiAgICB8ICAgIFBOIElFIDEgICAgfCAgIFBOIElFIDAgICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworICogRmlyc3QgRFdPUkQ6CisgKiAgIC0gTVNHX1RZUEUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IElkZW50aWZpZXMgdGhpcyBhcyBhbiByeCBwbiBjaGVjayBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqICAgICBWYWx1ZTogMHgyCisgKiAgIC0gUEVFUl9JRAorICogICAgIEJpdHMgMjM6OCAob25seSBiaXRzIDE4OjggYWN0dWFsbHkgdXNlZCkKKyAqICAgICBQdXJwb3NlOiBpZGVudGlmeSB3aGljaCBwZWVyCisgKiAgICAgVmFsdWU6IChyeCkgcGVlciBJRAorICogICAtIFRJRAorICogICAgIEJpdHMgMzE6MjQgKG9ubHkgYml0cyAyNzoyNCBhY3R1YWxseSB1c2VkKQorICogICAgIFB1cnBvc2U6IGlkZW50aWZ5IHRyYWZmaWMgaWRlbnRpZmllcgorICogICAgIFZhbHVlOiB0cmFmZmljIGlkZW50aWZpZXIKKyAqIFNlY29uZCBEV09SRDoKKyAqICAgLSBTRVFfTlVNX1NUQVJUCisgKiAgICAgQml0cyA3OjAKKyAqICAgICBQdXJwb3NlOgorICogICAgICAgIEluZGljYXRlcyB0aGUgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBNUERVIGluIHRoaXMKKyAqICAgICAgICBzZXJpZXMgb2YgTVBEVXMgdGhhdCB3ZW50IHRob3VnaCBQTiBjaGVjay4KKyAqICAgICBWYWx1ZToKKyAqICAgICAgICBUaGUgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgZmlyc3QgTVBEVSBpbiB0aGUgc2VxdWVuY2UuCisgKiAgICAgICAgVGhpcyBzZXF1ZW5jZSBudW1iZXIgaXMgdGhlIDYgTFNCcyBvZiB0aGUgODAyLjExIHNlcXVlbmNlIG51bWJlci4KKyAqICAgLSBTRVFfTlVNX0VORAorICogICAgIEJpdHMgMTU6OAorICogICAgIFB1cnBvc2U6CisgKiAgICAgICAgSW5kaWNhdGVzIHRoZSBlbmRpbmcgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBNUERVIGluIHRoaXMKKyAqICAgICAgICBzZXJpZXMgb2YgTVBEVXMgdGhhdCB3ZW50IHRob3VnaCBQTiBjaGVjay4KKyAqICAgICBWYWx1ZToKKyAqICAgICAgICBUaGUgc2VxdWVuY2UgbnVtYmVyIG9uZSBsYXJnZXIgdGhlbiB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0CisgKiAgICAgICAgTVBEVSBiZWluZyBmbHVzaGVkLgorICogICAgICAgIFRoaXMgc2VxdWVuY2UgbnVtYmVyIGlzIHRoZSA2IExTQnMgb2YgdGhlIDgwMi4xMSBzZXF1ZW5jZSBudW1iZXIuCisgKiAgICAgICAgVGhlIHJhbmdlIG9mIE1QRFVzIGZyb20gW1NFUV9OVU1fU1RBUlQsU0VRX05VTV9FTkQtMV0KKyAqICAgICAgICBoYXZlIGJlZW4gY2hlY2tlZCBmb3IgaW52YWxpZCBQTiBudW1iZXJzIGFuZCBhcmUgcmVhZHkKKyAqICAgICAgICB0byBiZSByZWxlYXNlZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgorICogICAgICAgIE5vdCBhbGwgTVBEVXMgd2l0aGluIHRoaXMgcmFuZ2UgYXJlIG5lY2Vzc2FyaWx5IHZhbGlkIC0gdGhlIGhvc3QKKyAqICAgICAgICBtdXN0IGNoZWNrIGVhY2ggc2VxdWVuY2UgbnVtYmVyIHdpdGhpbiB0aGlzIHJhbmdlIHRvIHNlZSBpZiB0aGUKKyAqICAgICAgICBjb3JyZXNwb25kaW5nIE1QRFUgaXMgYWN0dWFsbHkgcHJlc2VudC4KKyAqICAgLSBQTl9JRV9DT1VOVAorICogICAgIEJpdHMgMjM6MTYKKyAqICAgICBQdXJwb3NlOgorICogICAgICAgIFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB2YXJpYWJsZSBudW1iZXIgb2YgUE4gaW5mb3JtYXRpb24KKyAqICAgICAgICBlbGVtZW50cyBpbiB0aGlzIG1lc3NhZ2UKKyAqCisgKiBQTiBpbmZvcm1hdGlvbiBlbGVtZW50czoKKyAqICAtIFBOX0lFX3gtCisgKiAgICAgIFB1cnBvc2U6CisgKiAgICAgICAgICBFYWNoIFBOIGluZm9ybWF0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIHNlcXVlbmNlIG51bWJlcgorICogICAgICAgICAgb2YgdGhlIE1QRFUgdGhhdCBoYXMgZmFpbGVkIHRoZSB0YXJnZXQgUE4gY2hlY2suCisgKiAgICAgIFZhbHVlOgorICogICAgICAgICAgQ29udGFpbnMgdGhlIDYgTFNCcyBvZiB0aGUgODAyLjExIHNlcXVlbmNlIG51bWJlcgorICogICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgTVBEVSB0aGF0IGZhaWxlZCB0aGUgUE4gY2hlY2suCisgKi8KKy8qIGZpcnN0IERXT1JEICovCisjZGVmaW5lIEhUVF9SWF9QTl9JTkRfUEVFUl9JRF9NICAweGZmZmYwMAorI2RlZmluZSBIVFRfUlhfUE5fSU5EX1BFRVJfSURfUyAgOAorI2RlZmluZSBIVFRfUlhfUE5fSU5EX1RJRF9NICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBIVFRfUlhfUE5fSU5EX1RJRF9TICAgICAgMjQKKy8qIHNlY29uZCBEV09SRCAqLworI2RlZmluZSBIVFRfUlhfUE5fSU5EX1NFUV9OVU1fU1RBUlRfTSAweDAwMDAwMGZmCisjZGVmaW5lIEhUVF9SWF9QTl9JTkRfU0VRX05VTV9TVEFSVF9TIDAKKyNkZWZpbmUgSFRUX1JYX1BOX0lORF9TRVFfTlVNX0VORF9NICAgMHgwMDAwZmYwMAorI2RlZmluZSBIVFRfUlhfUE5fSU5EX1NFUV9OVU1fRU5EX1MgICA4CisjZGVmaW5lIEhUVF9SWF9QTl9JTkRfUE5fSUVfQ05UX00gICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSFRUX1JYX1BOX0lORF9QTl9JRV9DTlRfUyAgICAgMTYKKworI2RlZmluZSBIVFRfUlhfUE5fSU5EX0JZVEVTIDgKKworI2RlZmluZSBIVFRfUlhfUE5fSU5EX1BFRVJfSURfU0VUKHdvcmQsIHZhbHVlKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUE5fSU5EX1BFRVJfSUQsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX1BOX0lORF9QRUVSX0lEX1M7CQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX1BOX0lORF9QRUVSX0lEX0dFVCh3b3JkKQkJCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX1BOX0lORF9QRUVSX0lEX00pID4+IEhUVF9SWF9QTl9JTkRfUEVFUl9JRF9TKQorCisjZGVmaW5lIEhUVF9SWF9QTl9JTkRfRVhUX1RJRF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfUE5fSU5EX1RJRCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfUE5fSU5EX1RJRF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX1BOX0lORF9FWFRfVElEX0dFVCh3b3JkKQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfUE5fSU5EX1RJRF9NKSA+PiBIVFRfUlhfUE5fSU5EX1RJRF9TKQorCisjZGVmaW5lIEhUVF9SWF9QTl9JTkRfU0VRX05VTV9TVEFSVF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX1BOX0lORF9TRVFfTlVNX1NUQVJULCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9QTl9JTkRfU0VRX05VTV9TVEFSVF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX1BOX0lORF9TRVFfTlVNX1NUQVJUX0dFVCh3b3JkKQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9QTl9JTkRfU0VRX05VTV9TVEFSVF9NKSA+PgkJXAorCUhUVF9SWF9QTl9JTkRfU0VRX05VTV9TVEFSVF9TKQorCisjZGVmaW5lIEhUVF9SWF9QTl9JTkRfU0VRX05VTV9FTkRfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9QTl9JTkRfU0VRX05VTV9FTkQsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX1BOX0lORF9TRVFfTlVNX0VORF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX1BOX0lORF9TRVFfTlVNX0VORF9HRVQod29yZCkJCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX1BOX0lORF9TRVFfTlVNX0VORF9NKSA+PiBIVFRfUlhfUE5fSU5EX1NFUV9OVU1fRU5EX1MpCisKKyNkZWZpbmUgSFRUX1JYX1BOX0lORF9QTl9JRV9DTlRfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9QTl9JTkRfUE5fSUVfQ05ULCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgPDwgSFRUX1JYX1BOX0lORF9QTl9JRV9DTlRfUzsJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfUE5fSU5EX1BOX0lFX0NOVF9HRVQod29yZCkJCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX1BOX0lORF9QTl9JRV9DTlRfTSkgPj4gSFRUX1JYX1BOX0lORF9QTl9JRV9DTlRfUykKKworLyoKKyAqIEBicmllZiB0YXJnZXQgLT4gaG9zdCByeCBvZmZsb2FkIGRlbGl2ZXIgbWVzc2FnZSBmb3IgTEwgc3lzdGVtCisgKgorICogQGRldGFpbHMKKyAqIEluIGEgbG93IGxhdGVuY3kgc3lzdGVtIHRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW5ldmVyIHRoZSBvZmZsb2FkCisgKiBtYW5hZ2VyIGZsdXNoZXMgb3V0IHRoZSBwYWNrZXRzIGl0IGhhcyBjb2FsZXNjZWQgaW4gaXRzIGNvYWxlc2NpbmcgYnVmZmVyLgorICogVGhlIERNQSBvZiB0aGUgYWN0dWFsIHBhY2tldHMgaW50byBob3N0IG1lbW9yeSBpcyBkb25lIGJlZm9yZSBzZW5kaW5nIG91dAorICogdGhpcyBtZXNzYWdlLiBUaGlzIG1lc3NhZ2UgaW5kaWNhdGVzIG9ubHkgaG93IG1hbnkgTVNEVXMgdG8gcmVhcC4gVGhlCisgKiBwZWVyIElELCB2ZGV2IElELCB0aWQgYW5kIE1TRFUgbGVuZ3RoIGFyZSBjb3BpZWQgaW5saW5lIGludG8gdGhlIGhlYWRlcgorICogcG9ydGlvbiBvZiB0aGUgTVNEVSB3aGlsZSBETUEnaW5nIGludG8gdGhlIGhvc3QgbWVtb3J5LiBVbmxpa2UgdGhlIHBhY2tldHMKKyAqIERNQSdkIGJ5IHRoZSBNQUMgZGlyZWN0bHkgaW50byBob3N0IG1lbW9yeSB0aGVzZSBwYWNrZXRzIGRvIG5vdCBjb250YWluCisgKiB0aGUgTUFDIGRlc2NyaXB0b3JzIGluIHRoZSBoZWFkZXIgcG9ydGlvbiBvZiB0aGUgcGFja2V0LiBJbnN0ZWFkIHRoZXkgY29udGFpbgorICogdGhlIHBlZXIgSUQsIHZkZXYgSUQsIHRpZCBhbmQgTVNEVSBsZW5ndGguIEFsc28gd2hlbiB0aGUgaG9zdCByZWNlaXZlcyB0aGlzCisgKiBtZXNzYWdlLCB0aGUgcGFja2V0cyBhcmUgZGVsaXZlcmVkIGRpcmVjdGx5IHRvIHRoZSBOVyBzdGFjayB3aXRob3V0IGdvaW5nCisgKiB0aHJvdWdoIHRoZSByZWd1bGFyIHJlb3JkZXIgYnVmZmVyaW5nIGFuZCBQTiBjaGVja2luZyBwYXRoIHNpbmNlIGl0IGhhcworICogYWxyZWFkeSBiZWVuIGRvbmUgaW4gdGFyZ2V0LgorICoKKyAqIHwzMSAgICAgICAgICAgICAyNHwyMyAgICAgICAgICAgICAxNnwxNSAgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgICAgMHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICBUb3RhbCBNU0RVIGNvdW50ICAgICAgICAgIHwgICAgIHJlc2VydmVkICAgIHwgICAgIG1zZyB0eXBlICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKiBAYnJpZWYgdGFyZ2V0IC0+IGhvc3Qgcnggb2ZmbG9hZCBkZWxpdmVyIG1lc3NhZ2UgZm9yIEhMIHN5c3RlbQorICoKKyAqIEBkZXRhaWxzCisgKiBJbiBhIGhpZ2ggbGF0ZW5jeSBzeXN0ZW0gdGhpcyBtZXNzYWdlIGlzIHNlbnQgd2hlbmV2ZXIgdGhlIG9mZmxvYWQgbWFuYWdlcgorICogZmx1c2hlcyBvdXQgdGhlIHBhY2tldHMgaXQgaGFzIGNvYWxlc2NlZCBpbiBpdHMgY29hbGVzY2luZyBidWZmZXIuIFRoZQorICogYWN0dWFsIHBhY2tldHMgYXJlIGFsc28gY2FycmllZCBhbG9uZyB3aXRoIHRoaXMgbWVzc2FnZS4gV2hlbiB0aGUgaG9zdAorICogcmVjZWl2ZXMgdGhpcyBtZXNzYWdlLCBpdCBpcyBleHBlY3RlZCB0byBkZWxpdmVyIHRoZXNlIHBhY2tldHMgdG8gdGhlIE5XCisgKiBzdGFjayBkaXJlY3RseSBpbnN0ZWFkIG9mIHJvdXRpbmcgdGhlbSB0aHJvdWdoIHRoZSByZW9yZGVyIGJ1ZmZlcmluZyBhbmQKKyAqIFBOIGNoZWNraW5nIHBhdGggc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lIGluIHRhcmdldC4KKyAqCisgKiB8MzEgICAgICAgICAgICAgMjR8MjMgICAgICAgICAgICAgMTZ8MTUgICAgICAgICAgICAgIDh8NyAgICAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgVG90YWwgTVNEVSBjb3VudCAgICAgICAgICB8ICAgIHJlc2VydmVkICAgICB8ICAgICBtc2cgdHlwZSAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgcGVlciBJRCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICBNU0RVIGxlbmd0aCAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICBNU0RVIHBheWxvYWQgICB8ICAgICBGVyBEZXNjICAgICB8ICAgICAgIHRpZCAgICAgICB8ICAgdmRldiBJRCAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNEVSBwYXlsb2FkIGNvbnRkLiAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgcGVlciBJRCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICBNU0RVIGxlbmd0aCAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICBNU0RVIHBheWxvYWQgICB8ICAgIEZXIERlc2MgICAgICB8ICAgICAgIHRpZCAgICAgICB8ICAgdmRldiBJRCAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNEVSBwYXlsb2FkIGNvbnRkLiAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICovCisvKiBmaXJzdCBEV09SRCAqLworI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9IRFJfQllURVMgICAgICAgICAgNAorI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0hEUl9CWVRFUyAgICAgNworCisjZGVmaW5lIEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfQ05UX00gICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfQ05UX1MgICAgICAgICAxNgorI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0xFTl9NICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0xFTl9TICAgICAgICAgMAorI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX1BFRVJfSURfTSAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX1BFRVJfSURfUyAgICAgMTYKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9WREVWX0lEX00gICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9WREVWX0lEX1MgICAgIDAKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9USURfTSAgICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9USURfUyAgICAgICAgIDgKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9ERVNDX00gICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9ERVNDX1MgICAgICAgIDE2CisKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9DTlRfR0VUKHdvcmQpCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9DTlRfTSkgPj4JCVwKKwlIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0NOVF9TKQorI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0NOVF9TRVQod29yZCwgdmFsdWUpCQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9DTlQsIHZhbHVlKTsgXAorCSh3b3JkKSB8PSAodmFsdWUpIDw8IEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfQ05UX1M7IFwKK30gd2hpbGUgKDApCQkJCQkJCVwKKworI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0xFTl9HRVQod29yZCkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0xFTl9NKSA+PgkJXAorCUhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfTEVOX1MpCisjZGVmaW5lIEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfTEVOX1NFVCh3b3JkLCB2YWx1ZSkJXAorZG8gewkJCQkJCQkJXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfTEVOLCB2YWx1ZSk7IFwKKwkod29yZCkgfD0gKHZhbHVlKSA8PCBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0xFTl9TOyBcCit9IHdoaWxlICgwKQkJCQkJCQlcCisKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9QRUVSX0lEX0dFVCh3b3JkKQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9QRUVSX0lEX00pID4+CVwKKwlIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX1BFRVJfSURfUykKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9QRUVSX0lEX1NFVCh3b3JkLCB2YWx1ZSkJXAorZG8gewkJCQkJCQkJXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfUEVFUl9JRCwgdmFsdWUpOyBcCisJKHdvcmQpIHw9ICh2YWx1ZSkgPDwgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9QRUVSX0lEX1M7CVwKK30gd2hpbGUgKDApCQkJCQkJCVwKKworI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX1ZERVZfSURfR0VUKHdvcmQpCQlcCisJKCgod29yZCkgJiBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX1ZERVZfSURfTSkgPj4JXAorCUhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfVkRFVl9JRF9TKQorI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX1ZERVZfSURfU0VUKHdvcmQsIHZhbHVlKQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9WREVWX0lELCB2YWx1ZSk7IFwKKwkod29yZCkgfD0gKHZhbHVlKSA8PCBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX1ZERVZfSURfUzsJXAorfSB3aGlsZSAoMCkJCQkJCQkJXAorCisjZGVmaW5lIEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfVElEX0dFVCh3b3JkKQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfVElEX00pID4+CQlcCisJSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9USURfUykKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9USURfU0VUKHdvcmQsIHZhbHVlKQkJXAorZG8gewkJCQkJCQkJXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfVElELCB2YWx1ZSk7IFwKKwkod29yZCkgfD0gKHZhbHVlKSA8PCBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX1RJRF9TOyBcCit9IHdoaWxlICgwKQkJCQkJCQlcCisKKyNkZWZpbmUgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9ERVNDX0dFVCh3b3JkKQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfREVTQ19NKSA+PgkJXAorCUhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfREVTQ19TKQorI2RlZmluZSBIVFRfUlhfT0ZGTE9BRF9ERUxJVkVSX0lORF9NU0RVX0RFU0NfU0VUKHdvcmQsIHZhbHVlKQkJXAorZG8gewkJCQkJCQkJXAorCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9PRkZMT0FEX0RFTElWRVJfSU5EX01TRFVfREVTQywgdmFsdWUpOwlcCisJKHdvcmQpIHw9ICh2YWx1ZSkgPDwgSFRUX1JYX09GRkxPQURfREVMSVZFUl9JTkRfTVNEVV9ERVNDX1M7IFwKK30gd2hpbGUgKDApCQkJCQkJCVwKKworLyoqCisgKiBAYnJpZWYgdGFyZ2V0IC0+IGhvc3QgcnggcGVlciBtYXAvdW5tYXAgbWVzc2FnZSBkZWZpbml0aW9uCisgKgorICogQGRldGFpbHMKKyAqIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyB0aGUgZm9ybWF0IG9mIHRoZSByeCBwZWVyIG1hcCBtZXNzYWdlIHNlbnQKKyAqIGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4gIFRoaXMgbGF5b3V0IGFzc3VtZXMgdGhlIHRhcmdldCBvcGVyYXRlcworICogYXMgbGl0dGxlLWVuZGlhbi4KKyAqCisgKiB8MzEgICAgICAgICAgICAgMjR8MjMgICAgICAgICAgICAgMTZ8MTUgICAgICAgICAgICAgIDh8NyAgICAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICBwZWVyIElEICAgICAgICAgICAgICB8ICAgICBWREVWIElEICAgICB8ICAgICBtc2cgdHlwZSAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgIE1BQyBhZGRyIDMgICB8ICAgIE1BQyBhZGRyIDIgICB8ICAgIE1BQyBhZGRyIDEgICB8ICAgIE1BQyBhZGRyIDAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICB8ICAgIE1BQyBhZGRyIDUgICB8ICAgIE1BQyBhZGRyIDQgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyB0aGUgZm9ybWF0IG9mIHRoZSByeCBwZWVyIHVubWFwIG1lc3NhZ2Ugc2VudAorICogZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0LgorICoKKyAqIHwzMSAgICAgICAgICAgICAyNHwyMyAgICAgICAgICAgICAxNnwxNSAgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgICAgMHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgIHBlZXIgSUQgICAgICAgICAgICAgIHwgICAgIFZERVYgSUQgICAgIHwgICAgIG1zZyB0eXBlICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgdGhlIHJ4IHBlZXIgbWFwCisgKiBhbmQgcGVlciB1bm1hcCBtZXNzYWdlcyBzZW50IGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4KKyAqICAgLSBNU0dfVFlQRQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogaWRlbnRpZmllcyB0aGlzIGFzIGFuIHJ4IHBlZXIgbWFwIG9yIHBlZXIgdW5tYXAgbWVzc2FnZQorICogICAgIFZhbHVlOiBwZWVyIG1hcCAtPiAweDMsIHBlZXIgdW5tYXAgLT4gMHg0CisgKiAgIC0gVkRFVl9JRAorICogICAgIEJpdHMgMTU6OAorICogICAgIFB1cnBvc2U6IEluZGljYXRlcyB3aGljaCB2aXJ0dWFsIGRldmljZSB0aGUgcGVlciBpcyBhc3NvY2lhdGVkCisgKiAgICAgICAgIHdpdGguCisgKiAgICAgVmFsdWU6IHZkZXYgSUQgKHVzZWQgaW4gdGhlIGhvc3QgdG8gbG9vayB1cCB0aGUgdmRldiBvYmplY3QpCisgKiAgIC0gUEVFUl9JRAorICogICAgIEJpdHMgMzE6MTYKKyAqICAgICBQdXJwb3NlOiBUaGUgcGVlciBJRCAoaW5kZXgpIHRoYXQgV0FMIGlzIGFsbG9jYXRpbmcgKG1hcCkgb3IKKyAqICAgICAgICAgZnJlZWluZyAodW5tYXApCisgKiAgICAgVmFsdWU6IChyeCkgcGVlciBJRAorICogICAtIE1BQ19BRERSX0wzMiAocGVlciBtYXAgb25seSkKKyAqICAgICBCaXRzIDMxOjAKKyAqICAgICBQdXJwb3NlOiBJZGVudGlmaWVzIHdoaWNoIHBlZXIgbm9kZSB0aGUgcGVlciBJRCBpcyBmb3IuCisgKiAgICAgVmFsdWU6IGxvd2VyIDQgYnl0ZXMgb2YgcGVlciBub2RlJ3MgTUFDIGFkZHJlc3MKKyAqICAgLSBNQUNfQUREUl9VMTYgKHBlZXIgbWFwIG9ubHkpCisgKiAgICAgQml0cyAxNTowCisgKiAgICAgUHVycG9zZTogSWRlbnRpZmllcyB3aGljaCBwZWVyIG5vZGUgdGhlIHBlZXIgSUQgaXMgZm9yLgorICogICAgIFZhbHVlOiB1cHBlciAyIGJ5dGVzIG9mIHBlZXIgbm9kZSdzIE1BQyBhZGRyZXNzCisgKi8KKyNkZWZpbmUgSFRUX1JYX1BFRVJfTUFQX1ZERVZfSURfTSAgICAgICAweGZmMDAKKyNkZWZpbmUgSFRUX1JYX1BFRVJfTUFQX1ZERVZfSURfUyAgICAgICA4CisjZGVmaW5lIEhUVF9SWF9QRUVSX01BUF9QRUVSX0lEX00gICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUVF9SWF9QRUVSX01BUF9QRUVSX0lEX1MgICAgICAxNgorI2RlZmluZSBIVFRfUlhfUEVFUl9NQVBfTUFDX0FERFJfTDMyX00gMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfUlhfUEVFUl9NQVBfTUFDX0FERFJfTDMyX1MgMAorI2RlZmluZSBIVFRfUlhfUEVFUl9NQVBfTUFDX0FERFJfVTE2X00gMHhmZmZmCisjZGVmaW5lIEhUVF9SWF9QRUVSX01BUF9NQUNfQUREUl9VMTZfUyAwCisKKyNkZWZpbmUgSFRUX1JYX1BFRVJfTUFQX1ZBUF9JRF9TRVQgSFRUX1JYX1BFRVJfTUFQX1ZERVZfSURfU0VUCS8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgSFRUX1JYX1BFRVJfTUFQX1ZERVZfSURfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9QRUVSX01BUF9WREVWX0lELCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9QRUVSX01BUF9WREVWX0lEX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfUEVFUl9NQVBfVkFQX0lEX0dFVCBIVFRfUlhfUEVFUl9NQVBfVkRFVl9JRF9HRVQJLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBIVFRfUlhfUEVFUl9NQVBfVkRFVl9JRF9HRVQod29yZCkJCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX1BFRVJfTUFQX1ZERVZfSURfTSkgPj4gSFRUX1JYX1BFRVJfTUFQX1ZERVZfSURfUykKKworI2RlZmluZSBIVFRfUlhfUEVFUl9NQVBfUEVFUl9JRF9TRVQod29yZCwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX1BFRVJfTUFQX1BFRVJfSUQsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX1BFRVJfTUFQX1BFRVJfSURfUzsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9SWF9QRUVSX01BUF9QRUVSX0lEX0dFVCh3b3JkKQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfUEVFUl9NQVBfUEVFUl9JRF9NKSA+PiBIVFRfUlhfUEVFUl9NQVBfUEVFUl9JRF9TKQorCisjZGVmaW5lIEhUVF9SWF9QRUVSX01BUF9NQUNfQUREUl9PRkZTRVQgNAkvKiBieXRlcyAqLworCisjZGVmaW5lIEhUVF9SWF9QRUVSX01BUF9CWVRFUyAxMgorCisKKyNkZWZpbmUgSFRUX1JYX1BFRVJfVU5NQVBfUEVFUl9JRF9NICAgSFRUX1JYX1BFRVJfTUFQX1BFRVJfSURfTQorI2RlZmluZSBIVFRfUlhfUEVFUl9VTk1BUF9QRUVSX0lEX1MgICBIVFRfUlhfUEVFUl9NQVBfUEVFUl9JRF9TCisKKyNkZWZpbmUgSFRUX1JYX1BFRVJfVU5NQVBfUEVFUl9JRF9TRVQgSFRUX1JYX1BFRVJfTUFQX1BFRVJfSURfU0VUCisjZGVmaW5lIEhUVF9SWF9QRUVSX1VOTUFQX1BFRVJfSURfR0VUIEhUVF9SWF9QRUVSX01BUF9QRUVSX0lEX0dFVAorCisjZGVmaW5lIEhUVF9SWF9QRUVSX1VOTUFQX1ZERVZfSURfU0VUIEhUVF9SWF9QRUVSX01BUF9WREVWX0lEX1NFVAorI2RlZmluZSBIVFRfUlhfUEVFUl9VTk1BUF9WREVWX0lEX0dFVCBIVFRfUlhfUEVFUl9NQVBfVkRFVl9JRF9HRVQKKworI2RlZmluZSBIVFRfUlhfUEVFUl9VTk1BUF9CWVRFUyA0CisKKworLyoqCisgKiBAYnJpZWYgdGFyZ2V0IC0+IGhvc3QgbWVzc2FnZSBzcGVjaWZ5aW5nIHNlY3VyaXR5IHBhcmFtZXRlcnMKKyAqCisgKiBAZGV0YWlscworICogIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyB0aGUgZm9ybWF0IG9mIHRoZSBzZWN1cml0eSBzcGVjaWZpY2F0aW9uCisgKiAgbWVzc2FnZSBzZW50IGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4KKyAqICBUaGlzIHNlY3VyaXR5IHNwZWNpZmljYXRpb24gbWVzc2FnZSB0ZWxscyB0aGUgaG9zdCB3aGV0aGVyIGEgUE4gY2hlY2sgaXMKKyAqICBuZWNlc3Nhcnkgb24gcnggZGF0YSBmcmFtZXMsIGFuZCBpZiBzbywgaG93IGxhcmdlIHRoZSBQTiBjb3VudGVyIGlzLgorICogIFRoaXMgbWVzc2FnZSBhbHNvIHRlbGxzIHRoZSBob3N0IGFib3V0IHRoZSBzZWN1cml0eSBwcm9jZXNzaW5nIHRvIGFwcGx5CisgKiAgdG8gZGVmcmFnbWVudGVkIHJ4IGZyYW1lcyAtIHNwZWNpZmljYWxseSwgd2hldGhlciBhIE1lc3NhZ2UgSW50ZWdyaXR5CisgKiAgQ2hlY2sgaXMgcmVxdWlyZWQsIGFuZCB0aGUgTWljaGFlbCBrZXkgdG8gdXNlLgorICoKKyAqIHwzMSAgICAgICAgICAgICAyNHwyMyAgICAgICAgICAxNnwxNXwxNCAgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgICAgMHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgIHBlZXIgSUQgICAgICAgICAgIHwgVXwgIHNlY3VyaXR5IHR5cGUgIHwgICAgIG1zZyB0eXBlICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIEtleSBLMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIEtleSBLMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVBJIFJTQyBMb3cwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVBJIFJTQyBMb3cxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVBJIFJTQyBIaTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVBJIFJTQyBIaTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgdGhlIHNlY3VyaXR5CisgKiBpbmRpY2F0aW9uIG1lc3NhZ2Ugc2VudCBmcm9tIHRoZSB0YXJnZXQgdG8gdGhlIGhvc3QuCisgKiAgIC0gTVNHX1RZUEUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgdGhpcyBhcyBhIHNlY3VyaXR5IHNwZWNpZmljYXRpb24gbWVzc2FnZQorICogICAgIFZhbHVlOiAweGIKKyAqICAgLSBTRUNfVFlQRQorICogICAgIEJpdHMgMTQ6OAorICogICAgIFB1cnBvc2U6IHNwZWNpZmllcyB3aGljaCB0eXBlIG9mIHNlY3VyaXR5IGFwcGxpZXMgdG8gdGhlIHBlZXIKKyAqICAgICBWYWx1ZTogaHR0X3NlY190eXBlIGVudW0gdmFsdWUKKyAqICAgLSBVTklDQVNUCisgKiAgICAgQml0IDE1CisgKiAgICAgUHVycG9zZTogd2hldGhlciB0aGlzIHNlY3VyaXR5IGlzIGFwcGxpZWQgdG8gdW5pY2FzdCBvciBtdWx0aWNhc3QgZGF0YQorICogICAgIFZhbHVlOiAxIC0+IHVuaWNhc3QsIDAgLT4gbXVsdGljYXN0CisgKiAgIC0gUEVFUl9JRAorICogICAgIEJpdHMgMzE6MTYKKyAqICAgICBQdXJwb3NlOiBUaGUgSUQgbnVtYmVyIGZvciB0aGUgcGVlciB0aGUgc2VjdXJpdHkgc3BlY2lmaWNhdGlvbiBpcyBmb3IKKyAqICAgICBWYWx1ZTogcGVlciBJRAorICogICAtIE1JQ0hBRUxfS0VZX0swCisgKiAgICAgQml0cyAzMTowCisgKiAgICAgUHVycG9zZTogNC1ieXRlIHdvcmQgdGhhdCBmb3JtcyB0aGUgMXN0IGhhbGYgb2YgdGhlIFRLSVAgTWljaGFlbCBrZXkKKyAqICAgICBWYWx1ZTogTWljaGFlbCBLZXkgSzAgKGlmIHNlY3VyaXR5IHR5cGUgaXMgVEtJUCkKKyAqICAgLSBNSUNIQUVMX0tFWV9LMQorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IDQtYnl0ZSB3b3JkIHRoYXQgZm9ybXMgdGhlIDJuZCBoYWxmIG9mIHRoZSBUS0lQIE1pY2hhZWwga2V5CisgKiAgICAgVmFsdWU6IE1pY2hhZWwgS2V5IEsxIChpZiBzZWN1cml0eSB0eXBlIGlzIFRLSVApCisgKiAgIC0gV0FQSV9SU0NfTE9XMAorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IDQtYnl0ZSB3b3JkIHRoYXQgZm9ybXMgdGhlIDFzdCBxdWFydGVyIG9mIHRoZSAxNiBieXRlIFdBUEkgUlNDCisgKiAgICAgVmFsdWU6IFdBUEkgUlNDIExvdzAgKGlmIHNlY3VyaXR5IHR5cGUgaXMgV0FQSSkKKyAqICAgLSBXQVBJX1JTQ19MT1cxCisgKiAgICAgQml0cyAzMTowCisgKiAgICAgUHVycG9zZTogNC1ieXRlIHdvcmQgdGhhdCBmb3JtcyB0aGUgMm5kIHF1YXJ0ZXIgb2YgdGhlIDE2IGJ5dGUgV0FQSSBSU0MKKyAqICAgICBWYWx1ZTogV0FQSSBSU0MgTG93MSAoaWYgc2VjdXJpdHkgdHlwZSBpcyBXQVBJKQorICogICAtIFdBUElfUlNDX0hJMAorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IDQtYnl0ZSB3b3JkIHRoYXQgZm9ybXMgdGhlIDNyZCBxdWFydGVyIG9mIHRoZSAxNiBieXRlIFdBUEkgUlNDCisgKiAgICAgVmFsdWU6IFdBUEkgUlNDIEhpMCAoaWYgc2VjdXJpdHkgdHlwZSBpcyBXQVBJKQorICogICAtIFdBUElfUlNDX0hJMQorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IDQtYnl0ZSB3b3JkIHRoYXQgZm9ybXMgdGhlIDR0aCBxdWFydGVyIG9mIHRoZSAxNiBieXRlIFdBUEkgUlNDCisgKiAgICAgVmFsdWU6IFdBUEkgUlNDIEhpMSAoaWYgc2VjdXJpdHkgdHlwZSBpcyBXQVBJKQorICovCisKKyNkZWZpbmUgSFRUX1NFQ19JTkRfU0VDX1RZUEVfTSAgICAgMHgwMDAwN2YwMAorI2RlZmluZSBIVFRfU0VDX0lORF9TRUNfVFlQRV9TICAgICA4CisjZGVmaW5lIEhUVF9TRUNfSU5EX1VOSUNBU1RfTSAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgSFRUX1NFQ19JTkRfVU5JQ0FTVF9TICAgICAgMTUKKyNkZWZpbmUgSFRUX1NFQ19JTkRfUEVFUl9JRF9NICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIVFRfU0VDX0lORF9QRUVSX0lEX1MgICAgICAxNgorCisjZGVmaW5lIEhUVF9TRUNfSU5EX1NFQ19UWVBFX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9TRUNfSU5EX1NFQ19UWVBFLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9TRUNfSU5EX1NFQ19UWVBFX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfU0VDX0lORF9TRUNfVFlQRV9HRVQod29yZCkJCQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9TRUNfSU5EX1NFQ19UWVBFX00pID4+IEhUVF9TRUNfSU5EX1NFQ19UWVBFX1MpCisKKyNkZWZpbmUgSFRUX1NFQ19JTkRfVU5JQ0FTVF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfU0VDX0lORF9VTklDQVNULCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9TRUNfSU5EX1VOSUNBU1RfUzsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9TRUNfSU5EX1VOSUNBU1RfR0VUKHdvcmQpCQkJCQlcCisJKCgod29yZCkgJiBIVFRfU0VDX0lORF9VTklDQVNUX00pID4+IEhUVF9TRUNfSU5EX1VOSUNBU1RfUykKKworI2RlZmluZSBIVFRfU0VDX0lORF9QRUVSX0lEX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9TRUNfSU5EX1BFRVJfSUQsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1NFQ19JTkRfUEVFUl9JRF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1NFQ19JTkRfUEVFUl9JRF9HRVQod29yZCkJCQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9TRUNfSU5EX1BFRVJfSURfTSkgPj4gSFRUX1NFQ19JTkRfUEVFUl9JRF9TKQorCisKKyNkZWZpbmUgSFRUX1NFQ19JTkRfQllURVMgMjgKKworCisvKioKKyAqIEBicmllZiB0YXJnZXQgLT4gaG9zdCByeCBBRERCQSAvIERFTEJBIG1lc3NhZ2UgZGVmaW5pdGlvbnMKKyAqCisgKiBAZGV0YWlscworICogVGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBmb3JtYXQgb2YgdGhlIHJ4IEFEREJBIG1lc3NhZ2Ugc2VudAorICogZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0OgorICoKKyAqIHwzMSAgICAgICAgICAgICAgICAgICAgICAyMHwxOSAgMTZ8MTUgICAgICAgICAgICAgIDh8NyAgICAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICBwZWVyIElEICAgICAgICAgfCAgVElEIHwgICB3aW5kb3cgc2l6ZSAgIHwgICAgIG1zZyB0eXBlICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICogVGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBmb3JtYXQgb2YgdGhlIHJ4IERFTEJBIG1lc3NhZ2Ugc2VudAorICogZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0OgorICoKKyAqIHwzMSAgICAgICAgICAgICAgICAgICAgICAyMHwxOSAgMTZ8MTUgICAgICAgICAgICAgIDh8NyAgICAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICBwZWVyIElEICAgICAgICAgfCAgVElEIHwgICAgIHJlc2VydmVkICAgIHwgICAgIG1zZyB0eXBlICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICogVGhlIGZvbGxvd2luZyBmaWVsZCBkZWZpbml0aW9ucyBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSByeCBBRERCQQorICogYW5kIERFTEJBIG1lc3NhZ2VzIHNlbnQgZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0LgorICogICAtIE1TR19UWVBFCisgKiAgICAgQml0cyA3OjAKKyAqICAgICBQdXJwb3NlOiBpZGVudGlmaWVzIHRoaXMgYXMgYW4gcnggQUREQkEgb3IgREVMQkEgbWVzc2FnZQorICogICAgIFZhbHVlOiBBRERCQSAtPiAweDUsIERFTEJBIC0+IDB4NgorICogICAtIFdJTl9TSVpFCisgKiAgICAgQml0cyAxNTo4IChBRERCQSBvbmx5KQorICogICAgIFB1cnBvc2U6IFNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIHRoZSBibG9jayBhY2sgd2luZG93IChtYXggPSA2NCkuCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIGJsb2NrIGFjayB3aW5kb3cgbGVuZ3RoIHNwZWNpZmllZCBieSB0aGUgcmVjZWl2ZWQgQUREQkEKKyAqICAgICAgICAgbWFuYWdlbWVudCBtZXNzYWdlLgorICogICAtIFRJRAorICogICAgIEJpdHMgMTk6MTYKKyAqICAgICBQdXJwb3NlOiBTcGVjaWZpZXMgd2hpY2ggdHJhZmZpYyBpZGVudGlmaWVyIHRoZSBBRERCQSAvIERFTEJBIGlzIGZvci4KKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgVElEIHNwZWNpZmllZCBieSB0aGUgcmVjZWl2ZWQgQUREQkEgb3IgREVMQkEgbWFuYWdlbWVudCBtZXNzYWdlLgorICogICAtIFBFRVJfSUQKKyAqICAgICBCaXRzIDMxOjIwCisgKiAgICAgUHVycG9zZTogSWRlbnRpZmllcyB3aGljaCBwZWVyIHNlbnQgdGhlIEFEREJBIC8gREVMQkEuCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIElEIChoYXNoIHZhbHVlKSB1c2VkIGJ5IHRoZSBob3N0IGZvciBmYXN0LCAgZGlyZWN0IGxvb2t1cCBvZgorICogICAgICAgICBob3N0IFNXIHBlZXIgaW5mbywgaW5jbHVkaW5nIHJ4IHJlb3JkZXIgc3RhdGVzLgorICovCisjZGVmaW5lIEhUVF9SWF9BRERCQV9XSU5fU0laRV9NICAweGZmMDAKKyNkZWZpbmUgSFRUX1JYX0FEREJBX1dJTl9TSVpFX1MgIDgKKyNkZWZpbmUgSFRUX1JYX0FEREJBX1RJRF9NICAgICAgIDB4ZjAwMDAKKyNkZWZpbmUgSFRUX1JYX0FEREJBX1RJRF9TICAgICAgIDE2CisjZGVmaW5lIEhUVF9SWF9BRERCQV9QRUVSX0lEX00gICAweGZmZjAwMDAwCisjZGVmaW5lIEhUVF9SWF9BRERCQV9QRUVSX0lEX1MgICAyMAorCisjZGVmaW5lIEhUVF9SWF9BRERCQV9XSU5fU0laRV9TRVQod29yZCwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfQUREQkFfV0lOX1NJWkUsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1JYX0FEREJBX1dJTl9TSVpFX1M7CQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0FEREJBX1dJTl9TSVpFX0dFVCh3b3JkKQkJCQkJXAorCSgoKHdvcmQpICYgSFRUX1JYX0FEREJBX1dJTl9TSVpFX00pID4+IEhUVF9SWF9BRERCQV9XSU5fU0laRV9TKQorCisjZGVmaW5lIEhUVF9SWF9BRERCQV9USURfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX0FEREJBX1RJRCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfQUREQkFfVElEX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfQUREQkFfVElEX0dFVCh3b3JkKQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfQUREQkFfVElEX00pID4+IEhUVF9SWF9BRERCQV9USURfUykKKworI2RlZmluZSBIVFRfUlhfQUREQkFfUEVFUl9JRF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfQUREQkFfUEVFUl9JRCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfQUREQkFfUEVFUl9JRF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1JYX0FEREJBX1BFRVJfSURfR0VUKHdvcmQpCQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfQUREQkFfUEVFUl9JRF9NKSA+PiBIVFRfUlhfQUREQkFfUEVFUl9JRF9TKQorCisjZGVmaW5lIEhUVF9SWF9BRERCQV9CWVRFUyA0CisKKworI2RlZmluZSBIVFRfUlhfREVMQkFfVElEX00gICAgICAgICBIVFRfUlhfQUREQkFfVElEX00KKyNkZWZpbmUgSFRUX1JYX0RFTEJBX1RJRF9TICAgICAgICAgSFRUX1JYX0FEREJBX1RJRF9TCisjZGVmaW5lIEhUVF9SWF9ERUxCQV9QRUVSX0lEX00gICAgIEhUVF9SWF9BRERCQV9QRUVSX0lEX00KKyNkZWZpbmUgSFRUX1JYX0RFTEJBX1BFRVJfSURfUyAgICAgSFRUX1JYX0FEREJBX1BFRVJfSURfUworCisjZGVmaW5lIEhUVF9SWF9ERUxCQV9USURfU0VUICAgICAgIEhUVF9SWF9BRERCQV9USURfU0VUCisjZGVmaW5lIEhUVF9SWF9ERUxCQV9USURfR0VUICAgICAgIEhUVF9SWF9BRERCQV9USURfR0VUCisjZGVmaW5lIEhUVF9SWF9ERUxCQV9QRUVSX0lEX1NFVCAgIEhUVF9SWF9BRERCQV9QRUVSX0lEX1NFVAorI2RlZmluZSBIVFRfUlhfREVMQkFfUEVFUl9JRF9HRVQgICBIVFRfUlhfQUREQkFfUEVFUl9JRF9HRVQKKworI2RlZmluZSBIVFRfUlhfREVMQkFfQllURVMgNAorCisvKioKKyAqIEBicmllZiB0eCBxdWV1ZSBncm91cCBpbmZvcm1hdGlvbiBlbGVtZW50IGRlZmluaXRpb24KKyAqCisgKiBAZGV0YWlscworICogVGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBmb3JtYXQgb2YgdGhlIHR4IHF1ZXVlIGdyb3VwCisgKiBpbmZvcm1hdGlvbiBlbGVtZW50LCB3aGljaCBjYW4gYmUgaW5jbHVkZWQgaW4gdGFyZ2V0IC0tPiBob3N0CisgKiBtZXNzYWdlcyB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgdHggImNyZWRpdHMiICh0eCBkZXNjcmlwdG9ycworICogZm9yIExMLCBvciB0eCBidWZmZXJzIGZvciBITCkgYXZhaWxhYmxlIHRvIGEgcGFydGljdWxhciBncm91cAorICogb2YgaG9zdC1zaWRlIHR4IHF1ZXVlcywgYW5kIHdoaWNoIGhvc3Qtc2lkZSB0eCBxdWV1ZXMgYmVsb25nIHRvCisgKiB0aGUgZ3JvdXAuCisgKgorICogfDMxfDMwICAgICAgICAgIDI0fDIzICAgICAgICAgICAgIDE2fDE1fDE0fDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8IFh8ICAgcmVzZXJ2ZWQgICB8IHR4IHF1ZXVlIGdycCBJRCB8IEF8IFN8ICAgICBjcmVkaXQgY291bnQgICAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICB2ZGV2IElEIG1hc2sgICAgICAgICAgIHwgICAgICAgICAgICAgICBBQyBtYXNrICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZGVzY3JpYmUgdGhlIGZpZWxkcyB3aXRoaW4gdGhlIHR4IHF1ZXVlIGdyb3VwCisgKiBpbmZvcm1hdGlvbiBlbGVtZW50OgorICogLSBjcmVkaXRfY291bnQKKyAqICAgQml0cyAxMzoxCisgKiAgIFB1cnBvc2U6IHNwZWNpZnkgaG93IG1hbnkgdHggY3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIHRoZSB0eCBxdWV1ZSBncm91cAorICogICBWYWx1ZTogQW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGNyZWRpdCB2YWx1ZQorICogICAgICAgVGhlICdBJyBiaXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHZhbHVlIGlzIGFic29sdXRlIG9yIHJlbGF0aXZlLgorICogICAgICAgVGhlICdTJyBiaXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHZhbHVlIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgorICogICAgICAgQSBuZWdhdGl2ZSB2YWx1ZSBjYW4gb25seSBiZSByZWxhdGl2ZSwgbm90IGFic29sdXRlLgorICogICAgICAgQW4gYWJzb2x1dGUgdmFsdWUgcmVwbGFjZXMgYW55IHByaW9yIGNyZWRpdCB2YWx1ZSB0aGUgaG9zdCBoYXMgZm9yCisgKiAgICAgICB0aGUgdHggcXVldWUgZ3JvdXAgaW4gcXVlc3Rpb24uCisgKiAgICAgICBBIHJlbGF0aXZlIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBwcmlvciBjcmVkaXQgdmFsdWUgdGhlIGhvc3QgaGFzIGZvcgorICogICAgICAgdGhlIHR4IHF1ZXVlIGdyb3VwIGluIHF1ZXN0aW9uLgorICogLSBzaWduCisgKiAgIEJpdCAxNAorICogICBQdXJwb3NlOiBzcGVjaWZ5IHdoZXRoZXIgdGhlIGNyZWRpdCBjb3VudCBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZQorICogICBWYWx1ZTogMCAtPiBwb3NpdGl2ZSwgMSAtPiBuZWdhdGl2ZQorICogLSBhYnNvbHV0ZQorICogICBCaXQgMTUKKyAqICAgUHVycG9zZTogc3BlY2lmeSB3aGV0aGVyIHRoZSBjcmVkaXQgY291bnQgaXMgYWJzb2x1dGUgb3IgcmVsYXRpdmUKKyAqICAgVmFsdWU6IDAgLT4gcmVsYXRpdmUsIDEgLT4gYWJzb2x1dGUKKyAqIC0gdHhxX2dyb3VwX2lkCisgKiAgIEJpdHMgMjM6MTYKKyAqICAgUHVycG9zZTogaW5kaWNhdGUgd2hpY2ggdHggcXVldWUgZ3JvdXAncyBjcmVkaXQgYW5kL29yIG1lbWJlcnNoaXAgYXJlCisgKiAgICAgICBiZWluZyBzcGVjaWZpZWQKKyAqICAgVmFsdWU6IDAgdG8gbWF4X3R4X3F1ZXVlX2dyb3Vwcy0xCisgKiAtIHJlc2VydmVkCisgKiAgIEJpdHMgMzA6MTYKKyAqICAgVmFsdWU6IDB4MAorICogLSBlWHRlbnNpb24KKyAqICAgQml0IDMxCisgKiAgIFB1cnBvc2U6IHNwZWNpZnkgd2hldGhlciBhbm90aGVyIHR4IHF1ZXVlIGdyb3VwIGluZm8gZWxlbWVudCBmb2xsb3dzCisgKiAgIFZhbHVlOiAwIC0+IG5vIG1vcmUgdHggcXVldWUgZ3JvdXAgaW5mb3JtYXRpb24gZWxlbWVudHMKKyAqICAgICAgICAgIDEgLT4gYW5vdGhlciB0eCBxdWV1ZSBncm91cCBpbmZvcm1hdGlvbiBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd3MKKyAqIC0gYWNfbWFzaworICogICBCaXRzIDE1OjAKKyAqICAgUHVycG9zZTogc3BlY2lmeSB3aGljaCBBY2Nlc3MgQ2F0ZWdvcmllcyBiZWxvbmcgdG8gdGhlIHR4IHF1ZXVlIGdyb3VwCisgKiAgIFZhbHVlOiBiaXQtT1Igb2YgbWFza3MgZm9yIHRoZSBBQ3MgKFdNTSBhbmQgZXh0ZW5zaW9uKSB0aGF0IGJlbG9uZyB0bworICogICAgICAgdGhlIHR4IHF1ZXVlIGdyb3VwLgorICogICAgICAgVGhlIEFDIGJpdC1tYXNrIHZhbHVlcyBhcmUgb2J0YWluZWQgYnkgbGVmdC1zaGlmdGluZyBieSB0aGUKKyAqICAgICAgIGNvcnJlc3BvbmRpbmcgSFRUX0FDX1dNTSBlbnVtIHZhbHVlcywgZS5nLiAoMSA8PCBIVFRfQUNfV01NX0JFKSA9PSAweDEKKyAqIC0gdmRldl9pZF9tYXNrCisgKiAgIEJpdHMgMzE6MTYKKyAqICAgUHVycG9zZTogc3BlY2lmeSB3aGljaCB2ZGV2J3MgdHggcXVldWVzIGJlbG9uZyB0byB0aGUgdHggcXVldWUgZ3JvdXAKKyAqICAgVmFsdWU6IGJpdC1PUiBvZiBtYXNrcyBiYXNlZCBvbiB0aGUgSURzIG9mIHRoZSB2ZGV2cyB3aG9zZSB0eCBxdWV1ZXMKKyAqICAgICAgIGJlbG9uZyB0byB0aGUgdHggcXVldWUgZ3JvdXAuCisgKiAgICAgICBGb3IgZXhhbXBsZSwgaWYgdmRldiBJRHMgMSBhbmQgNCBiZWxvbmcgdG8gYSB0eCBxdWV1ZSBncm91cCwgdGhlCisgKiAgICAgICB2ZGV2X2lkX21hc2sgd291bGQgYmUgKDEgPDwgMSkgfCAoMSA8PCA0KSA9IDB4MTIKKyAqLworUFJFUEFDSyBzdHJ1Y3QgaHR0X3R4cV9ncm91cCB7CisJQV9VSU5UMzIKKwkgICAgY3JlZGl0X2NvdW50OjE0LAorCSAgICBzaWduOjEsCisJCWFic29sdXRlOjEsCisJCXR4X3F1ZXVlX2dyb3VwX2lkOjgsCisJCXJlc2VydmVkMDo3LAorCQlleHRlbnNpb246MTsKKwlBX1VJTlQzMgorCQlhY19tYXNrOjE2LAorCQl2ZGV2X2lkX21hc2s6MTY7Cit9IFBPU1RQQUNLOworCisvKiBmaXJzdCB3b3JkICovCisjZGVmaW5lIEhUVF9UWFFfR1JPVVBfQ1JFRElUX0NPVU5UX1MgMAorI2RlZmluZSBIVFRfVFhRX0dST1VQX0NSRURJVF9DT1VOVF9NIDB4MDAwMDNmZmYKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9TSUdOX1MgICAgICAgICAxNAorI2RlZmluZSBIVFRfVFhRX0dST1VQX1NJR05fTSAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9BQlNfUyAgICAgICAgICAxNQorI2RlZmluZSBIVFRfVFhRX0dST1VQX0FCU19NICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9JRF9TICAgICAgICAgICAxNgorI2RlZmluZSBIVFRfVFhRX0dST1VQX0lEX00gICAgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9FWFRfUyAgICAgICAgICAzMQorI2RlZmluZSBIVFRfVFhRX0dST1VQX0VYVF9NICAgICAgICAgIDB4ODAwMDAwMDAKKy8qIHNlY29uZCB3b3JkICovCisjZGVmaW5lIEhUVF9UWFFfR1JPVVBfQUNfTUFTS19TICAgICAgMAorI2RlZmluZSBIVFRfVFhRX0dST1VQX0FDX01BU0tfTSAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9WREVWX0lEX01BU0tfUyAxNgorI2RlZmluZSBIVFRfVFhRX0dST1VQX1ZERVZfSURfTUFTS19NIDB4ZmZmZjAwMDAKKworI2RlZmluZSBIVFRfVFhRX0dST1VQX0NSRURJVF9DT1VOVF9TRVQoX2luZm8sIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYUV9HUk9VUF9DUkVESVRfQ09VTlQsIF92YWwpOwlcCisJCSgoX2luZm8pIHw9ICgoX3ZhbCkgPDwgSFRUX1RYUV9HUk9VUF9DUkVESVRfQ09VTlRfUykpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9DUkVESVRfQ09VTlRfR0VUKF9pbmZvKQkJCQlcCisJKCgoX2luZm8pICYgSFRUX1RYUV9HUk9VUF9DUkVESVRfQ09VTlRfTSkgPj4JXAorCUhUVF9UWFFfR1JPVVBfQ1JFRElUX0NPVU5UX1MpCisKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9TSUdOX1NFVChfaW5mbywgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWFFfR1JPVVBfU0lHTiwgX3ZhbCk7CVwKKwkJKChfaW5mbykgfD0gKChfdmFsKSA8PCBIVFRfVFhRX0dST1VQX1NJR05fUykpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9TSUdOX0dFVChfaW5mbykJCQkJCVwKKwkoKChfaW5mbykgJiBIVFRfVFhRX0dST1VQX1NJR05fTSkgPj4gSFRUX1RYUV9HUk9VUF9TSUdOX1MpCisKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9BQlNfU0VUKF9pbmZvLCBfdmFsKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYUV9HUk9VUF9BQlMsIF92YWwpOwlcCisJCSgoX2luZm8pIHw9ICgoX3ZhbCkgPDwgSFRUX1RYUV9HUk9VUF9BQlNfUykpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9BQlNfR0VUKF9pbmZvKQkJCQkJXAorCSgoKF9pbmZvKSAmIEhUVF9UWFFfR1JPVVBfQUJTX00pID4+IEhUVF9UWFFfR1JPVVBfQUJTX1MpCisKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9JRF9TRVQoX2luZm8sIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhRX0dST1VQX0lELCBfdmFsKTsJXAorCQkoKF9pbmZvKSB8PSAoKF92YWwpIDw8IEhUVF9UWFFfR1JPVVBfSURfUykpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1RYUV9HUk9VUF9JRF9HRVQoX2luZm8pCQkJCVwKKwkoKChfaW5mbykgJiBIVFRfVFhRX0dST1VQX0lEX00pID4+IEhUVF9UWFFfR1JPVVBfSURfUykKKworI2RlZmluZSBIVFRfVFhRX0dST1VQX0VYVF9TRVQoX2luZm8sIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhRX0dST1VQX0VYVCwgX3ZhbCk7CVwKKwkJKChfaW5mbykgfD0gKChfdmFsKSA8PCBIVFRfVFhRX0dST1VQX0VYVF9TKSk7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfVFhRX0dST1VQX0VYVF9HRVQoX2luZm8pCQkJCQlcCisJKCgoX2luZm8pICYgSFRUX1RYUV9HUk9VUF9FWFRfTSkgPj4gSFRUX1RYUV9HUk9VUF9FWFRfUykKKworI2RlZmluZSBIVFRfVFhRX0dST1VQX0FDX01BU0tfU0VUKF9pbmZvLCBfdmFsKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhRX0dST1VQX0FDX01BU0ssIF92YWwpOwkJXAorCQkoKF9pbmZvKSB8PSAoKF92YWwpIDw8IEhUVF9UWFFfR1JPVVBfQUNfTUFTS19TKSk7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfVFhRX0dST1VQX0FDX01BU0tfR0VUKF9pbmZvKQkJCQlcCisJKCgoX2luZm8pICYgSFRUX1RYUV9HUk9VUF9BQ19NQVNLX00pID4+IEhUVF9UWFFfR1JPVVBfQUNfTUFTS19TKQorCisjZGVmaW5lIEhUVF9UWFFfR1JPVVBfVkRFVl9JRF9NQVNLX1NFVChfaW5mbywgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhRX0dST1VQX1ZERVZfSURfTUFTSywgX3ZhbCk7CVwKKwkJKChfaW5mbykgfD0gKChfdmFsKSA8PCBIVFRfVFhRX0dST1VQX1ZERVZfSURfTUFTS19TKSk7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfVFhRX0dST1VQX1ZERVZfSURfTUFTS19HRVQoX2luZm8pCQkJCVwKKwkoKChfaW5mbykgJiBIVFRfVFhRX0dST1VQX1ZERVZfSURfTUFTS19NKSA+PgkJCVwKKwlIVFRfVFhRX0dST1VQX1ZERVZfSURfTUFTS19TKQorCisvKioKKyAqIEBicmllZiB0YXJnZXQgLT4gaG9zdCBUWCBjb21wbGV0aW9uIGluZGljYXRpb24gbWVzc2FnZSBkZWZpbml0aW9uCisgKgorICogQGRldGFpbHMKKyAqIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyB0aGUgZm9ybWF0IG9mIHRoZSBUWCBjb21wbGV0aW9uIGluZGljYXRpb24gc2VudAorICogZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0CisgKgorICogICAgICAgICAgfDMxICAgICAgMjV8ICAgIDI0fDIzICAgICAgICAxNnwgMTUgfDE0IDExfDEwICAgOHw3ICAgICAgICAgIDB8CisgKiAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIGhlYWRlcjogIHwgcmVzZXJ2ZWQgfGFwcGVuZHwgICAgIG51bSAgICB8IHRfaXwgdGlkIHxzdGF0dXN8ICBtc2dfdHlwZSAgfAorICogICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiBwYXlsb2FkOiB8ICAgICAgICAgICAgTVNEVTEgSUQgICAgICAgICAgfCAgICAgICAgIE1TRFUwIElEICAgICAgICAgICAgIHwKKyAqICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgICAgICAgOiAgICAgICAgICAgIE1TRFUzIElEICAgICAgICAgIDogICAgICAgICBNU0RVMiBJRCAgICAgICAgICAgICA6CisgKiAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAgICAgIHwgICAgICAgICAgc3RydWN0IGh0dF90eF9jb21wbF9pbmRfYXBwZW5kX3JldHJpZXMgICAgICAgICAgICAgfAorICogICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisgKgorICogVGhlIGZvbGxvd2luZyBmaWVsZCBkZWZpbml0aW9ucyBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSBUWCBjb21wbGV0aW9uCisgKiBpbmRpY2F0aW9uIHNlbnQgZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0CisgKiBIZWFkZXIgZmllbGRzOgorICogLSBtc2dfdHlwZQorICogICBCaXRzIDc6MAorICogICBQdXJwb3NlOiBpZGVudGlmaWVzIHRoaXMgYXMgSFRUIFRYIGNvbXBsZXRpb24gaW5kaWNhdGlvbgorICogICBWYWx1ZTogMHg3CisgKiAtIHN0YXR1cworICogICBCaXRzIDEwOjgKKyAqICAgUHVycG9zZTogdGhlIFRYIGNvbXBsZXRpb24gc3RhdHVzIG9mIHBheWxvYWQgZnJhZ21lbnRhdGlvbnMgZGVzY3JpcHRvcnMKKyAqICAgVmFsdWU6IGNvdWxkIGJlIEhUVF9UWF9DT01QTF9JTkRfU1RBVF9PSyBvciBIVFRfVFhfQ09NUExfSU5EX1NUQVRfRElTQ0FSRAorICogLSB0aWQKKyAqICAgQml0cyAxNDoxMQorICogICBQdXJwb3NlOiB0aGUgdGlkIGFzc29jaWF0ZWQgd2l0aCB0aG9zZSBmcmFnbWVudGF0aW9uIGRlc2NyaXB0b3JzLiBJdCBpcworICogICAgICAgICAgICB2YWxpZCBvciBub3QsIGRlcGVuZGluZyBvbiB0aGUgdGlkX2ludmFsaWQgYml0LgorICogICBWYWx1ZTogMCB0byAxNQorICogLSB0aWRfaW52YWxpZAorICogICBCaXRzIDE1OjE1CisgKiAgIFB1cnBvc2U6IHRoaXMgYml0IGluZGljYXRlcyB3aGV0aGVyIHRoZSB0aWQgZmllbGQgaXMgdmFsaWQgb3Igbm90CisgKiAgIFZhbHVlOiAwIGluZGljYXRlcyB2YWxpZDsgMSBpbmRpY2F0ZXMgaW52YWxpZAorICogLSBudW0KKyAqICAgQml0cyAyMzoxNgorICogICBQdXJwb3NlOiB0aGUgbnVtYmVyIG9mIHBheWxvYWQgaW4gdGhpcyBpbmRpY2F0aW9uCisgKiAgIFZhbHVlOiAxIHRvIDI1NQorICogLSBhcHBlbmQKKyAqICAgQml0cyAyNDoyNAorICogICBQdXJwb3NlOiBhcHBlbmQgdGhlIHN0cnVjdCBodHRfdHhfY29tcGxfaW5kX2FwcGVuZF9yZXRyaWVzIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdHggcmV0cmllcyBmb3Igb25lIE1TRFUgYXQgdGhlIGVuZCBvZiB0aGlzIG1lc3NhZ2UKKyAqICAgVmFsdWU6IDAgaW5kaWNhdGVzIG5vIGFwcGVuZGluZzsgMSBpbmRpY2F0ZXMgYXBwZW5kaW5nCisgKiBQYXlsb2FkIGZpZWxkczoKKyAqIC0gaG1zZHVfaWQKKyAqICAgQml0cyAxNTowCisgKiAgIFB1cnBvc2U6IHRoaXMgSUQgaXMgdXNlZCB0byB0cmFjayB0aGUgVHggYnVmZmVyIGluIGhvc3QKKyAqICAgVmFsdWU6IDAgdG8gInNpemUgb2YgaG9zdCBNU0RVIGRlc2NyaXB0b3IgcG9vbCAtIDEiCisgKi8KKworI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX1NUQVRVU19TICAgICAgOAorI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX1NUQVRVU19NICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX1RJRF9TICAgICAgICAgMTEKKyNkZWZpbmUgSFRUX1RYX0NPTVBMX0lORF9USURfTSAgICAgICAgIDB4MDAwMDc4MDAKKyNkZWZpbmUgSFRUX1RYX0NPTVBMX0lORF9USURfSU5WX1MgICAgIDE1CisjZGVmaW5lIEhUVF9UWF9DT01QTF9JTkRfVElEX0lOVl9NICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhUVF9UWF9DT01QTF9JTkRfTlVNX1MgICAgICAgICAxNgorI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX05VTV9NICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX0FQUEVORF9TICAgICAgMjQKKyNkZWZpbmUgSFRUX1RYX0NPTVBMX0lORF9BUFBFTkRfTSAgICAgIDB4MDEwMDAwMDAKKworI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX1NUQVRVU19TRVQoX2luZm8sIF92YWwpICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX0NPTVBMX0lORF9TVEFUVVMsIF92YWwpOwlcCisJCSgoX2luZm8pIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX0NPTVBMX0lORF9TVEFUVVNfUykpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1RYX0NPTVBMX0lORF9TVEFUVVNfR0VUKF9pbmZvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKChfaW5mbykgJiBIVFRfVFhfQ09NUExfSU5EX1NUQVRVU19NKSA+PiBIVFRfVFhfQ09NUExfSU5EX1NUQVRVU19TKQorI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX05VTV9TRVQoX2luZm8sIF92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX0NPTVBMX0lORF9OVU0sIF92YWwpOwkJXAorCQkoKF9pbmZvKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9DT01QTF9JTkRfTlVNX1MpKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9UWF9DT01QTF9JTkRfTlVNX0dFVChfaW5mbykJCQkJCVwKKwkoKChfaW5mbykgJiBIVFRfVFhfQ09NUExfSU5EX05VTV9NKSA+PiBIVFRfVFhfQ09NUExfSU5EX05VTV9TKQorI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX1RJRF9TRVQoX2luZm8sIF92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX0NPTVBMX0lORF9USUQsIF92YWwpOwkJXAorCQkoKF9pbmZvKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9DT01QTF9JTkRfVElEX1MpKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9UWF9DT01QTF9JTkRfVElEX0dFVChfaW5mbykJCQkJCVwKKwkoKChfaW5mbykgJiBIVFRfVFhfQ09NUExfSU5EX1RJRF9NKSA+PiBIVFRfVFhfQ09NUExfSU5EX1RJRF9TKQorI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX1RJRF9JTlZfU0VUKF9pbmZvLCBfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX0NPTVBMX0lORF9USURfSU5WLCBfdmFsKTsJXAorCQkoKF9pbmZvKSB8PSAoKF92YWwpIDw8IEhUVF9UWF9DT01QTF9JTkRfVElEX0lOVl9TKSk7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX1RJRF9JTlZfR0VUKF9pbmZvKQkJXAorCSgoKF9pbmZvKSAmIEhUVF9UWF9DT01QTF9JTkRfVElEX0lOVl9NKSA+PglcCisJIEhUVF9UWF9DT01QTF9JTkRfVElEX0lOVl9TKQorI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX0FQUEVORF9TRVQoX2luZm8sIF92YWwpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX0NPTVBMX0lORF9BUFBFTkQsIF92YWwpOwlcCisJCSgoX2luZm8pIHw9ICgoX3ZhbCkgPDwgSFRUX1RYX0NPTVBMX0lORF9BUFBFTkRfUykpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1RYX0NPTVBMX0lORF9BUFBFTkRfR0VUKF9pbmZvKQkJCQlcCisJKCgoX2luZm8pICYgSFRUX1RYX0NPTVBMX0lORF9BUFBFTkRfTSkgPj4gSFRUX1RYX0NPTVBMX0lORF9BUFBFTkRfUykKKworI2RlZmluZSBIVFRfVFhfQ09NUExfQ1RYVF9TWiAgICAgICAgICAgICAgICBzaXplb2YoQV9VSU5UMTYpCisjZGVmaW5lIEhUVF9UWF9DT01QTF9DVFhUX05VTShfYnl0ZXMpICAgICAgICgoX2J5dGVzKSA+PiAxKQorCisjZGVmaW5lIEhUVF9UWF9DT01QTF9JTlZfTVNEVV9JRCAgICAgICAgICAgIDB4ZmZmZgorCisjZGVmaW5lIEhUVF9UWF9DT01QTF9JTkRfU1RBVF9PSyAgICAgICAgICAwCisjZGVmaW5lIEhUVF9UWF9DT01QTF9JTkRfU1RBVF9ESVNDQVJEICAgICAxCisjZGVmaW5lIEhUVF9UWF9DT01QTF9JTkRfU1RBVF9OT19BQ0sgICAgICAyCisjZGVmaW5lIEhUVF9UWF9DT01QTF9JTkRfU1RBVF9QT1NUUE9ORSAgICAzCisvKgorICogVGhlIFBFRVJfREVMIHR4IGNvbXBsZXRpb24gc3RhdHVzIGlzIHVzZWQgZm9yIEhMIGNhc2VzCisgKiB3aGVyZSB0aGUgcGVlciB0aGUgZnJhbWUgaXMgZm9yIGhhcyBiZWVuIGRlbGV0ZWQuCisgKiBUaGUgaG9zdCBoYXMgYWxyZWFkeSBkaXNjYXJkZWQgaXRzIGNvcHkgb2YgdGhlIGZyYW1lLCBidXQKKyAqIGl0IHN0aWxsIG5lZWRzIHRoZSB0eCBjb21wbGV0aW9uIHRvIHJlc3RvcmUgaXRzIGNyZWRpdC4KKyAqLworI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX1NUQVRfUEVFUl9ERUwgICAgNAorCisKKyNkZWZpbmUgSFRUX1RYX0NPTVBMX0lORF9BUFBFTkRfU0VUX01PUkVfUkVUUlkoZikgICgoZikgfD0gMHgxKQorI2RlZmluZSBIVFRfVFhfQ09NUExfSU5EX0FQUEVORF9DTFJfTU9SRV9SRVRSWShmKSAgKChmKSAmPSAofjB4MSkpCisKK1BSRVBBQ0sgc3RydWN0IGh0dF90eF9jb21wbF9pbmRfYmFzZSB7CisJQV9VSU5UMzIgaGRyOworCUFfVUlOVDE2IHBheWxvYWRbMSAvKm9yIG1vcmUgKi9dOworfSBQT1NUUEFDSzsKKworUFJFUEFDSyBzdHJ1Y3QgaHR0X3R4X2NvbXBsX2luZF9hcHBlbmRfcmV0cmllcyB7CisJQV9VSU5UMTYgbXNkdV9pZDsKKwlBX1VJTlQ4IHR4X3JldHJpZXM7CisJQV9VSU5UOCBmbGFnOy8qIEJpdCAwLCAxOiBhbm90aGVyIGFwcGVuZF9yZXRyaWVzIHN0cnVjdCBpcyBhcHBlbmRlZAorCQkJCSAgMDogdGhpcyBpcyB0aGUgbGFzdCBhcHBlbmRfcmV0cmllcyBzdHJ1Y3QgKi8KK30gUE9TVFBBQ0s7CisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IHJhdGUtY29udHJvbCB1cGRhdGUgaW5kaWNhdGlvbiBtZXNzYWdlCisgKgorICogQGRldGFpbHMKKyAqIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyB0aGUgZm9ybWF0IG9mIHRoZSBSQyBVcGRhdGUgbWVzc2FnZQorICogc2VudCBmcm9tIHRoZSB0YXJnZXQgdG8gdGhlIGhvc3QsIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHR4LWNvbXBsZXRpb24KKyAqIG9mIGEgdHJhbnNtaXR0ZWQgUFBEVS4KKyAqCisgKiAgICAgICAgICB8MzEgICAgICAgICAgMjR8MjMgICAgICAgICAgIDE2fDE1ICAgICAgICAgICAgOHw3ICAgICAgICAgICAgMHwKKyAqICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgICAgICAgfCAgICAgICAgICAgIHBlZXIgSUQgICAgICAgICAgIHwgICAgdmRldiBJRCAgICB8ICAgIG1zZ190eXBlICB8CisgKiAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAgICAgIHwgIE1BQyBhZGRyIDMgIHwgIE1BQyBhZGRyIDIgICB8ICAgTUFDIGFkZHIgMSAgfCAgTUFDIGFkZHIgMCAgfAorICogICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICB8ICAgcmVzZXJ2ZWQgICB8ICAgbnVtIGVsZW1zICAgfCAgIE1BQyBhZGRyIDUgIHwgIE1BQyBhZGRyIDQgIHwKKyAqICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICA6ICAgICAgICAgSFRUX1JDX1RYX0RPTkVfUEFSQU1TIChEV09SRC1hbGlnbmVkKSAgICAgICAgICAgICAgIDoKKyAqICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgIDogICAgICAgICBIVFRfUkNfVFhfRE9ORV9QQVJBTVMgKERXT1JELWFsaWduZWQpICAgICAgICAgICAgICAgOgorICogICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICogICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiByYXRlX2NvZGU7CS8qIHJhdGUgY29kZSwgYncsIGNoYWluIG1hc2sgc2dpICovCisJQV9VSU5UMzIgcmF0ZV9jb2RlX2ZsYWdzOworCUFfVUlOVDMyIGZsYWdzOwkJLyogRW5jb2RlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIGV4Y2Vzc2l2ZQorCQkJCSAgIHJldHJhbnNtaXNzaW9uLCBhZ2dyZWdhdGUsIHNvbWUgaW5mbworCQkJCSAgIGZyb20gLjExIGZyYW1lIGNvbnRyb2wsCisJCQkJICAgU1RCQywgTERQQywgKFNHSSBhbmQgVHggQ2hhaW4gTWFzaworCQkJCSAgIGFyZSBlbmNvZGVkIGluIHB0eF9yYy0+ZmxhZ3MgZmllbGQpLAorCQkJCSAgIEFNUERVIHRydW5jYXRpb24gKEJUL3RpbWUgYmFzZWQgZXRjLiksCisJCQkJICAgUlRTL0NUUyBhdHRlbXB0ICAqLworCisJQV9VSU5UMzIgbnVtX2VucXVlZDsvKiAjIG9mIE1QRFVzIChmb3Igbm9uLUFNUERVIDEpIGZvciB0aGlzIHJhdGUgKi8KKwlBX1VJTlQzMiBudW1fcmV0cmllczsvKiBUb3RhbCAjIG9mIHRyYW5zbWlzc2lvbiBhdHRlbXB0IGZvciB0aGlzIHJhdGUgKi8KKwlBX1VJTlQzMiBudW1fZmFpbGVkOy8qICMgb2YgZmFpbGVkIE1QRFVzIGluIEEtTVBEVSwgMCBvdGhlcndpc2UgKi8KKwlBX1VJTlQzMiBhY2tfcnNzaTsvKiBBQ0sgUlNTSTogYic3Li5iJzAgYXZnIFJTU0kgYWNyb3NzIGFsbCBjaGFpbiAqLworCUFfVUlOVDMyIHRpbWVfc3RhbXA7CS8qIEFDSyB0aW1lc3RhbXAgKGhlbHBzIGRldGVybWluZSBhZ2UpICovCisJQV9VSU5UMzIgaXNfcHJvYmU7CS8qIFZhbGlkIGlmIHByb2JpbmcuIEVsc2UsIDAgKi8KK30gSFRUX1JDX1RYX0RPTkVfUEFSQU1TOworCisjZGVmaW5lIEhUVF9SQ19VUERBVEVfQ1RYVF9TWiAoc2l6ZW9mKEhUVF9SQ19UWF9ET05FX1BBUkFNUykpLyogYnl0ZXMgKi8KKyNkZWZpbmUgSFRUX1JDX1VQREFURV9IRFJfU1ogICAgICAoMTIpCS8qIGJ5dGVzICovCisKKyNkZWZpbmUgSFRUX1JDX1VQREFURV9NQUNfQUREUl9PRkZTRVQgICAoNCkJLyogYnl0ZXMgKi8KKyNkZWZpbmUgSFRUX1JDX1VQREFURV9NQUNfQUREUl9MRU5HVEggICBJRUVFODAyMTFfQUREUl9MRU4JLyogYnl0ZXMgKi8KKworI2RlZmluZSBIVFRfUkNfVVBEQVRFX1ZERVZJRF9TICAgIDgKKyNkZWZpbmUgSFRUX1JDX1VQREFURV9WREVWSURfTSAgICAweGZmMDAKKyNkZWZpbmUgSFRUX1JDX1VQREFURV9QRUVSSURfUyAgICAxNgorI2RlZmluZSBIVFRfUkNfVVBEQVRFX1BFRVJJRF9NICAgIDB4ZmZmZjAwMDAKKworI2RlZmluZSBIVFRfUkNfVVBEQVRFX05VTV9FTEVNU19TICAgMTYKKyNkZWZpbmUgSFRUX1JDX1VQREFURV9OVU1fRUxFTVNfTSAgIDB4MDBmZjAwMDAKKworI2RlZmluZSBIVFRfUkNfVVBEQVRFX1ZERVZJRF9TRVQoX2luZm8sIF92YWwpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SQ19VUERBVEVfVkRFVklELCBfdmFsKTsJCVwKKwkJKChfaW5mbykgfD0gKChfdmFsKSA8PCBIVFRfUkNfVVBEQVRFX1ZERVZJRF9TKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SQ19VUERBVEVfVkRFVklEX0dFVChfaW5mbykJCQkJCVwKKwkoKChfaW5mbykgJiBIVFRfUkNfVVBEQVRFX1ZERVZJRF9NKSA+PiBIVFRfUkNfVVBEQVRFX1ZERVZJRF9TKQorCisjZGVmaW5lIEhUVF9SQ19VUERBVEVfUEVFUklEX1NFVChfaW5mbywgX3ZhbCkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JDX1VQREFURV9QRUVSSUQsIF92YWwpOwkJXAorCQkoKF9pbmZvKSB8PSAoKF92YWwpIDw8IEhUVF9SQ19VUERBVEVfUEVFUklEX1MpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1JDX1VQREFURV9QRUVSSURfR0VUKF9pbmZvKQkJCQkJXAorCSgoKF9pbmZvKSAmIEhUVF9SQ19VUERBVEVfUEVFUklEX00pID4+IEhUVF9SQ19VUERBVEVfUEVFUklEX1MpCisKKyNkZWZpbmUgSFRUX1JDX1VQREFURV9OVU1fRUxFTVNfU0VUKF9pbmZvLCBfdmFsKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SQ19VUERBVEVfTlVNX0VMRU1TLCBfdmFsKTsJXAorCQkoKF9pbmZvKSB8PSAoKF92YWwpIDw8IEhUVF9SQ19VUERBVEVfTlVNX0VMRU1TX1MpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1JDX1VQREFURV9OVU1fRUxFTVNfR0VUKF9pbmZvKQkJCQlcCisJKCgoX2luZm8pICYgSFRUX1JDX1VQREFURV9OVU1fRUxFTVNfTSkgPj4gSFRUX1JDX1VQREFURV9OVU1fRUxFTVNfUykKKworLyoqCisgKiBAYnJpZWYgdGFyZ2V0IC0+IGhvc3QgcnggZnJhZ21lbnQgaW5kaWNhdGlvbiBtZXNzYWdlIGRlZmluaXRpb24KKyAqCisgKiBAZGV0YWlscworICogVGhlIGZvbGxvd2luZyBmaWVsZCBkZWZpbml0aW9ucyBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSByeCBmcmFnbWVudAorICogaW5kaWNhdGlvbiBtZXNzYWdlIHNlbnQgZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0LgorICogVGhlIHJ4IGZyYWdtZW50IGluZGljYXRpb24gbWVzc2FnZSBzaGFyZXMgdGhlIGZvcm1hdCBvZiB0aGUKKyAqIHJ4IGluZGljYXRpb24gbWVzc2FnZSwgYnV0IG5vdCBhbGwgZmllbGRzIGZyb20gdGhlIHJ4IGluZGljYXRpb24gbWVzc2FnZQorICogYXJlIHJlbGV2YW50IHRvIHRoZSByeCBmcmFnbWVudCBpbmRpY2F0aW9uIG1lc3NhZ2UuCisgKgorICoKKyAqICAgICB8MzEgICAgICAgMjR8MjMgICAgICAgICAxOHwxN3wxNnwxNXwxNHwxM3wxMnwxMXwxMHw5fDh8N3w2fDV8NCAgICAgMHwKKyAqICAgICB8LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgIHBlZXIgSUQgICAgICAgICAgIHwgICAgIHxGVnwgZXh0IFRJRCAgICB8ICBtc2cgdHlwZSAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgZmx1c2ggICAgfCAgZmx1c2ggIHwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIGVuZCAgICAgfCAgc3RhcnQgIHwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBzZXEgbnVtICAgfCBzZXEgbnVtIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgIHwgICAgICAgICBGVyByeCBkZXNjIGJ5dGVzICAgICAgICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZXIE1TRFUgUnggIHwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgZGVzYyBCMCAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIEhlYWRlciBmaWVsZHM6CisgKiAgIC0gTVNHX1RZUEUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgdGhpcyBhcyBhbiByeCBmcmFnbWVudCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqICAgICBWYWx1ZTogMHhhCisgKiAgIC0gRVhUX1RJRAorICogICAgIEJpdHMgMTI6OAorICogICAgIFB1cnBvc2U6IGlkZW50aWZ5IHRoZSB0cmFmZmljIElEIG9mIHRoZSByeCBkYXRhLCBpbmNsdWRpbmcKKyAqICAgICAgICAgc3BlY2lhbCAiZXh0ZW5kZWQiIFRJRCB2YWx1ZXMgZm9yIG11bHRpY2FzdCwgYnJvYWRjYXN0LCBhbmQKKyAqICAgICAgICAgbm9uLVFvUyBkYXRhIGZyYW1lcworICogICAgIFZhbHVlOiAwLTE1IGZvciByZWd1bGFyIFRJRHMsIG9yID49IDE2IGZvciBiY2FzdC9tY2FzdC9ub24tUW9TCisgKiAgIC0gRkxVU0hfVkFMSUQgKEZWKQorICogICAgIEJpdCAxMworICogICAgIFB1cnBvc2U6IGluZGljYXRlIHdoZXRoZXIgdGhlIGZsdXNoIElFIChzdGFydC9lbmQgc2VxdWVuY2UgbnVtYmVycykKKyAqICAgICAgICAgaXMgdmFsaWQKKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgMSAtPiBmbHVzaCBJRSBpcyB2YWxpZCBhbmQgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkCisgKiAgICAgICAgIDAgLT4gZmx1c2ggSUUgaXMgbm90IHZhbGlkIGFuZCBzaG91bGQgYmUgaWdub3JlZAorICogICAtIFBFRVJfSUQKKyAqICAgICBCaXRzIDMxOjE2CisgKiAgICAgUHVycG9zZTogSWRlbnRpZnksIGJ5IElELCB3aGljaCBwZWVyIHNlbnQgdGhlIHJ4IGRhdGEKKyAqICAgICBWYWx1ZTogSUQgb2YgdGhlIHBlZXIgd2hvIHNlbnQgdGhlIHJ4IGRhdGEKKyAqICAgLSBGTFVTSF9TRVFfTlVNX1NUQVJUCisgKiAgICAgQml0cyA1OjAKKyAqICAgICBQdXJwb3NlOiBJbmRpY2F0ZSB0aGUgc3RhcnQgb2YgYSBzZXJpZXMgb2YgTVBEVXMgdG8gZmx1c2gKKyAqICAgICAgICAgTm90IGFsbCBNUERVcyB3aXRoaW4gdGhpcyBzZXJpZXMgYXJlIG5lY2Vzc2FyaWx5IHZhbGlkIC0gdGhlIGhvc3QKKyAqICAgICAgICAgbXVzdCBjaGVjayBlYWNoIHNlcXVlbmNlIG51bWJlciB3aXRoaW4gdGhpcyByYW5nZSB0byBzZWUgaWYgdGhlCisgKiAgICAgICAgIGNvcnJlc3BvbmRpbmcgTVBEVSBpcyBhY3R1YWxseSBwcmVzZW50LgorICogICAgICAgICBUaGlzIGZpZWxkIGlzIG9ubHkgdmFsaWQgaWYgdGhlIEZWIGJpdCBpcyBzZXQuCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIFRoZSBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSBmaXJzdCBNUERVcyB0byBjaGVjayB0byBmbHVzaC4KKyAqICAgICAgICAgVGhlIHNlcXVlbmNlIG51bWJlciBpcyBtYXNrZWQgYnkgMHgzZi4KKyAqICAgLSBGTFVTSF9TRVFfTlVNX0VORAorICogICAgIEJpdHMgMTE6NgorICogICAgIFB1cnBvc2U6IEluZGljYXRlIHRoZSBlbmQgb2YgYSBzZXJpZXMgb2YgTVBEVXMgdG8gZmx1c2gKKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgVGhlIHNlcXVlbmNlIG51bWJlciBvbmUgbGFyZ2VyIHRoYW4gdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUKKyAqICAgICAgICAgbGFzdCBNUERVIHRvIGNoZWNrIHRvIGZsdXNoLgorICogICAgICAgICBUaGUgc2VxdWVuY2UgbnVtYmVyIGlzIG1hc2tlZCBieSAweDNmLgorICogICAgICAgICBOb3QgYWxsIE1QRFVzIHdpdGhpbiB0aGlzIHNlcmllcyBhcmUgbmVjZXNzYXJpbHkgdmFsaWQgLSB0aGUgaG9zdAorICogICAgICAgICBtdXN0IGNoZWNrIGVhY2ggc2VxdWVuY2UgbnVtYmVyIHdpdGhpbiB0aGlzIHJhbmdlIHRvIHNlZSBpZiB0aGUKKyAqICAgICAgICAgY29ycmVzcG9uZGluZyBNUERVIGlzIGFjdHVhbGx5IHByZXNlbnQuCisgKiAgICAgICAgIFRoaXMgZmllbGQgaXMgb25seSB2YWxpZCBpZiB0aGUgRlYgYml0IGlzIHNldC4KKyAqIFJ4IGRlc2NyaXB0b3IgZmllbGRzOgorICogICAtIEZXX1JYX0RFU0NfQllURVMKKyAqICAgICBCaXRzIDE1OjAKKyAqICAgICBQdXJwb3NlOiBJbmRpY2F0ZSBob3cgbWFueSBieXRlcyBpbiB0aGUgUnggaW5kaWNhdGlvbiBhcmUgdXNlZCBmb3IKKyAqICAgICAgICAgRlcgUnggZGVzY3JpcHRvcnMKKyAqICAgICBWYWx1ZTogMQorICovCisjZGVmaW5lIEhUVF9SWF9GUkFHX0lORF9IRFJfUFJFRklYX1NJWkUzMiAgICAgICAgIDIKKworI2RlZmluZSBIVFRfUlhfRlJBR19JTkRfRldfREVTQ19CWVRFX09GRlNFVCAgICAgICAxMgorCisjZGVmaW5lIEhUVF9SWF9GUkFHX0lORF9FWFRfVElEX1NFVCAgICAgSFRUX1JYX0lORF9FWFRfVElEX1NFVAorI2RlZmluZSBIVFRfUlhfRlJBR19JTkRfRVhUX1RJRF9HRVQgICAgIEhUVF9SWF9JTkRfRVhUX1RJRF9HRVQKKworI2RlZmluZSBIVFRfUlhfRlJBR19JTkRfUEVFUl9JRF9TRVQgICAgIEhUVF9SWF9JTkRfUEVFUl9JRF9TRVQKKyNkZWZpbmUgSFRUX1JYX0ZSQUdfSU5EX1BFRVJfSURfR0VUICAgICBIVFRfUlhfSU5EX1BFRVJfSURfR0VUCisKKyNkZWZpbmUgSFRUX1JYX0ZSQUdfSU5EX0ZMVVNIX1ZBTElEX1NFVCBIVFRfUlhfSU5EX0ZMVVNIX1ZBTElEX1NFVAorI2RlZmluZSBIVFRfUlhfRlJBR19JTkRfRkxVU0hfVkFMSURfR0VUIEhUVF9SWF9JTkRfRkxVU0hfVkFMSURfR0VUCisKKyNkZWZpbmUgSFRUX1JYX0ZSQUdfSU5EX0ZMVVNIX1NFUV9OVU1fU1RBUlRfU0VUIFwKKwlIVFRfUlhfSU5EX0ZMVVNIX1NFUV9OVU1fU1RBUlRfU0VUCisjZGVmaW5lIEhUVF9SWF9GUkFHX0lORF9GTFVTSF9TRVFfTlVNX1NUQVJUX0dFVCBcCisJSFRUX1JYX0lORF9GTFVTSF9TRVFfTlVNX1NUQVJUX0dFVAorCisjZGVmaW5lIEhUVF9SWF9GUkFHX0lORF9GTFVTSF9TRVFfTlVNX0VORF9TRVQJXAorCUhUVF9SWF9JTkRfRkxVU0hfU0VRX05VTV9FTkRfU0VUCisjZGVmaW5lIEhUVF9SWF9GUkFHX0lORF9GTFVTSF9TRVFfTlVNX0VORF9HRVQJXAorCUhUVF9SWF9JTkRfRkxVU0hfU0VRX05VTV9FTkRfR0VUCisKKyNkZWZpbmUgSFRUX1JYX0ZSQUdfSU5EX0ZXX1JYX0RFU0NfQllURVNfR0VUICBIVFRfUlhfSU5EX0ZXX1JYX0RFU0NfQllURVNfR0VUCisKKyNkZWZpbmUgSFRUX1JYX0ZSQUdfSU5EX0JZVEVTCQkJCVwKKwkoNCAvKiBtc2cgaGRyICovICsJCQkJXAorCSA0IC8qIGZsdXNoIHNwZWMgKi8gKwkJCQlcCisJIDQgLyogKHVudXNlZCkgRlcgcnggZGVzYyBieXRlcyBzcGVjICovICsJXAorCSA0IC8qIEZXIHJ4IGRlc2MgKi8pCisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IHRlc3QgbWVzc2FnZSBkZWZpbml0aW9uCisgKgorICogQGRldGFpbHMKKyAqIFRoZSBmb2xsb3dpbmcgZmllbGQgZGVmaW5pdGlvbnMgZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiB0aGUgdGVzdAorICogbWVzc2FnZSBzZW50IGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4KKyAqIFRoZSBtZXNzYWdlIGNvbnNpc3RzIG9mIGEgNC1vY3RldCBoZWFkZXIsIGZvbGxvd2VkIGJ5IGEgdmFyaWFibGUKKyAqIG51bWJlciBvZiAzMi1iaXQgaW50ZWdlciB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGEgdmFyaWFibGUgbnVtYmVyCisgKiBvZiA4LWJpdCBjaGFyYWN0ZXIgdmFsdWVzLgorICoKKyAqIHwzMSAgICAgICAgICAgICAgICAgICAgICAgICAxNnwxNSAgICAgICAgICAgOHw3ICAgICAgICAgICAgMHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgbnVtIGNoYXJzICAgICAgICAgIHwgICBudW0gaW50cyAgIHwgICBtc2cgdHlwZSAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgY2hhciAzICAgIHwgICAgY2hhciAyICAgIHwgICAgY2hhciAxICAgIHwgICAgY2hhciAwICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAuLi4gICAgIHwgICAgY2hhciA0ICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgLSBNU0dfVFlQRQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogaWRlbnRpZmllcyB0aGlzIGFzIGEgdGVzdCBtZXNzYWdlCisgKiAgICAgVmFsdWU6IEhUVF9NU0dfVFlQRV9URVNUCisgKiAgIC0gTlVNX0lOVFMKKyAqICAgICBCaXRzIDE1OjgKKyAqICAgICBQdXJwb3NlOiBpbmRpY2F0ZSBob3cgbWFueSAzMi1iaXQgaW50ZWdlcnMgZm9sbG93IHRoZSBtZXNzYWdlIGhlYWRlcgorICogICAtIE5VTV9DSEFSUworICogICAgIEJpdHMgMzE6MTYKKyAqICAgICBQdXJwb3NlOiBpbmRpY2F0ZSBob3cgbWFueSA4LWJpdCBjaGFyYXRlcnMgZm9sbG93IHRoZSBzZXJpZXMgb2YgaW50ZWdlcnMKKyAqLworI2RlZmluZSBIVFRfUlhfVEVTVF9OVU1fSU5UU19NICAgMHhmZjAwCisjZGVmaW5lIEhUVF9SWF9URVNUX05VTV9JTlRTX1MgICA4CisjZGVmaW5lIEhUVF9SWF9URVNUX05VTV9DSEFSU19NICAweGZmZmYwMDAwCisjZGVmaW5lIEhUVF9SWF9URVNUX05VTV9DSEFSU19TICAxNgorCisjZGVmaW5lIEhUVF9SWF9URVNUX05VTV9JTlRTX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9URVNUX05VTV9JTlRTLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9SWF9URVNUX05VTV9JTlRTX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfVEVTVF9OVU1fSU5UU19HRVQod29yZCkJCQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9SWF9URVNUX05VTV9JTlRTX00pID4+IEhUVF9SWF9URVNUX05VTV9JTlRTX1MpCisKKyNkZWZpbmUgSFRUX1JYX1RFU1RfTlVNX0NIQVJTX1NFVCh3b3JkLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9SWF9URVNUX05VTV9DSEFSUywgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfUlhfVEVTVF9OVU1fQ0hBUlNfUzsJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfUlhfVEVTVF9OVU1fQ0hBUlNfR0VUKHdvcmQpCQkJCQlcCisJKCgod29yZCkgJiBIVFRfUlhfVEVTVF9OVU1fQ0hBUlNfTSkgPj4gSFRUX1JYX1RFU1RfTlVNX0NIQVJTX1MpCisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IHBhY2tldCBsb2cgbWVzc2FnZQorICoKKyAqIEBkZXRhaWxzCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgdGhlIHBhY2tldCBsb2cKKyAqIG1lc3NhZ2Ugc2VudCBmcm9tIHRoZSB0YXJnZXQgdG8gdGhlIGhvc3QuCisgKiBUaGUgbWVzc2FnZSBjb25zaXN0cyBvZiBhIDQtb2N0ZXQgaGVhZGVyLGZvbGxvd2VkIGJ5IGEgdmFyaWFibGUgbnVtYmVyCisgKiBvZiAzMi1iaXQgY2hhcmFjdGVyIHZhbHVlcy4KKyAqCisgKiB8MzEgICAgICAgICAgMjR8MjMgICAgICAgICAgMTZ8MTUgICAgICAgICAgIDh8NyAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgbXNnIHR5cGUgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgIC0gTVNHX1RZUEUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgdGhpcyBhcyBhIHRlc3QgbWVzc2FnZQorICogICAgIFZhbHVlOiBIVFRfTVNHX1RZUEVfUEFDS0VUTE9HCisgKi8KK1BSRVBBQ0sgc3RydWN0IGh0dF9wa3Rsb2dfbXNnIHsKKwlBX1VJTlQzMiBoZWFkZXI7CisJQV9VSU5UMzIgcGF5bG9hZFsxIC8qIG9yIG1vcmUgKi9dOworfSBQT1NUUEFDSzsKKworCisvKgorICogUnggcmVvcmRlciBzdGF0aXN0aWNzCisgKiBOQjogYWxsIHRoZSBmaWVsZHMgbXVzdCBiZSBkZWZpbmVkIGluIDQgb2N0ZXRzIHNpemUuCisgKi8KK3N0cnVjdCByeF9yZW9yZGVyX3N0YXRzIHsKKwkvKiBOb24gUW9TIE1QRFVzIHJlY2VpdmVkICovCisJQV9VSU5UMzIgZGVsaXZlcl9ub25fcW9zOworCS8qIE1QRFVzIHJlY2VpdmVkIGluLW9yZGVyICovCisJQV9VSU5UMzIgZGVsaXZlcl9pbl9vcmRlcjsKKwkvKiBGbHVzaCBkdWUgdG8gcmVvcmRlciB0aW1lciBleHBpcmVkICovCisJQV9VSU5UMzIgZGVsaXZlcl9mbHVzaF90aW1lb3V0OworCS8qIEZsdXNoIGR1ZSB0byBtb3ZlIG91dCBvZiB3aW5kb3cgKi8KKwlBX1VJTlQzMiBkZWxpdmVyX2ZsdXNoX29vdzsKKwkvKiBGbHVzaCBkdWUgdG8gREVMQkEgKi8KKwlBX1VJTlQzMiBkZWxpdmVyX2ZsdXNoX2RlbGJhOworCS8qIE1QRFVzIGRyb3BwZWQgZHVlIHRvIEZDUyBlcnJvciAqLworCUFfVUlOVDMyIGZjc19lcnJvcjsKKwkvKiBNUERVcyBkcm9wcGVkIGR1ZSB0byBtb25pdG9yIG1vZGUgbm9uLWRhdGEgcGFja2V0ICovCisJQV9VSU5UMzIgbWdtdF9jdHJsOworCS8qIFVuaWNhc3QtZGF0YSBNUERVcyBkcm9wcGVkIGR1ZSB0byBpbnZhbGlkIHBlZXIgKi8KKwlBX1VJTlQzMiBpbnZhbGlkX3BlZXI7CisJLyogTVBEVXMgZHJvcHBlZCBkdWUgdG8gZHVwbGljYXRpb24gKG5vbiBhZ2dyZWdhdGlvbikgKi8KKwlBX1VJTlQzMiBkdXBfbm9uX2FnZ3I7CisJLyogTVBEVXMgZHJvcHBlZCBkdWUgdG8gcHJvY2Vzc2VkIGJlZm9yZSAqLworCUFfVUlOVDMyIGR1cF9wYXN0OworCS8qIE1QRFVzIGRyb3BwZWQgZHVlIHRvIGR1cGxpY2F0ZSBpbiByZW9yZGVyIHF1ZXVlICovCisJQV9VSU5UMzIgZHVwX2luX3Jlb3JkZXI7CisJLyogUmVvcmRlciB0aW1lb3V0IGhhcHBlbmVkICovCisJQV9VSU5UMzIgcmVvcmRlcl90aW1lb3V0OworCS8qIGludmFsaWQgYmFyIHNzbiAqLworCUFfVUlOVDMyIGludmFsaWRfYmFyX3NzbjsKKwkvKiByZW9yZGVyIHJlc2V0IGR1ZSB0byBiYXIgc3NuICovCisJQV9VSU5UMzIgc3NuX3Jlc2V0OworCS8qIEZsdXNoIGR1ZSB0byBkZWxldGUgcGVlciAqLworCUFfVUlOVDMyIGRlbGl2ZXJfZmx1c2hfZGVscGVlcjsKKwkvKiBGbHVzaCBkdWUgdG8gb2ZmbG9hZCAqLworCUFfVUlOVDMyIGRlbGl2ZXJfZmx1c2hfb2ZmbG9hZDsKKwkvKiBGbHVzaCBkdWUgdG8gb3V0IG9mIGJ1ZmZlciAqLworCUFfVUlOVDMyIGRlbGl2ZXJfZmx1c2hfb29iOworCS8qIE1QRFVzIGRyb3BwZWQgZHVlIHRvIFBOIGNoZWNrIGZhaWwgKi8KKwlBX1VJTlQzMiBwbl9mYWlsOworCS8qIE1QRFVzIGRyb3BwZWQgZHVlIHRvIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgICovCisJQV9VSU5UMzIgc3RvcmVfZmFpbDsKKwkvKiBOdW1iZXIgb2YgdGltZXMgdGhlIHRpZCBwb29sIGFsbG9jIHN1Y2NlZWRlZCAqLworCUFfVUlOVDMyIHRpZF9wb29sX2FsbG9jX3N1Y2M7CisJLyogTnVtYmVyIG9mIHRpbWVzIHRoZSBNUERVIHBvb2wgYWxsb2Mgc3VjY2VlZGVkICovCisJQV9VSU5UMzIgbXBkdV9wb29sX2FsbG9jX3N1Y2M7CisJLyogTnVtYmVyIG9mIHRpbWVzIHRoZSBNU0RVIHBvb2wgYWxsb2Mgc3VjY2VlZGVkICovCisJQV9VSU5UMzIgbXNkdV9wb29sX2FsbG9jX3N1Y2M7CisJLyogTnVtYmVyIG9mIHRpbWVzIHRoZSB0aWQgcG9vbCBhbGxvYyBmYWlsZWQgKi8KKwlBX1VJTlQzMiB0aWRfcG9vbF9hbGxvY19mYWlsOworCS8qIE51bWJlciBvZiB0aW1lcyB0aGUgTVBEVSBwb29sIGFsbG9jIGZhaWxlZCAqLworCUFfVUlOVDMyIG1wZHVfcG9vbF9hbGxvY19mYWlsOworCS8qIE51bWJlciBvZiB0aW1lcyB0aGUgTVNEVSBwb29sIGFsbG9jIGZhaWxlZCAqLworCUFfVUlOVDMyIG1zZHVfcG9vbF9hbGxvY19mYWlsOworCS8qIE51bWJlciBvZiB0aW1lcyB0aGUgdGlkIHBvb2wgZnJlZWQgKi8KKwlBX1VJTlQzMiB0aWRfcG9vbF9mcmVlOworCS8qIE51bWJlciBvZiB0aW1lcyB0aGUgTVBEVSBwb29sIGZyZWVkICovCisJQV9VSU5UMzIgbXBkdV9wb29sX2ZyZWU7CisJLyogTnVtYmVyIG9mIHRpbWVzIHRoZSBNU0RVIHBvb2wgZnJlZWQgKi8KKwlBX1VJTlQzMiBtc2R1X3Bvb2xfZnJlZTsKKwkvKiBudW1iZXIgb2YgTVNEVXMgdW5kZWxpdmVyZWQgdG8gSFRUIGFuZCBxdWV1ZWQKKwkgKiB0byBEYXRhIFJ4IE1TRFUgZnJlZSBsaXN0ICovCisJQV9VSU5UMzIgbXNkdV9xdWV1ZWQ7CisJLyogTnVtYmVyIG9mIE1TRFVzIHJlbGVhc2VkIGZyb20gRGF0YSBSeCBNU0RVIGxpc3QgdG8gTUFDIHJpbmcgKi8KKwlBX1VJTlQzMiBtc2R1X3JlY3ljbGVkOworCS8qIE51bWJlciBvZiBNUERVcyB3aXRoIGludmFsaWQgcGVlciBidXQgQTIgZm91bmQgaW4gQVNUICovCisJQV9VSU5UMzIgaW52YWxpZF9wZWVyX2EyX2luX2FzdDsKKwkvKiBOdW1iZXIgb2YgTVBEVXMgd2l0aCBpbnZhbGlkIHBlZXIgYnV0IEEzIGZvdW5kIGluIEFTVCAqLworCUFfVUlOVDMyIGludmFsaWRfcGVlcl9hM19pbl9hc3Q7CisJLyogTnVtYmVyIG9mIE1QRFVzIHdpdGggaW52YWxpZCBwZWVyLCBCcm9hZGNhc3Qgb3IgTXVsdGljYXN0IGZyYW1lICovCisJQV9VSU5UMzIgaW52YWxpZF9wZWVyX2JtY19tcGR1czsKKwkvKiBOdW1iZXIgb2YgTVNEVXMgd2l0aCBlcnIgYXR0ZW50aW9uIHdvcmQgKi8KKwlBX1VJTlQzMiByeGRlc2NfZXJyX2F0dDsKKwkvKiBOdW1iZXIgb2YgTVNEVXMgd2l0aCBmbGFnIG9mIHBlZXJfaWR4X2ludmFsaWQgKi8KKwlBX1VJTlQzMiByeGRlc2NfZXJyX3BlZXJfaWR4X2ludjsKKwkvKiBOdW1iZXIgb2YgTVNEVXMgd2l0aCBmbGFnIG9mIHBlZXJfaWR4X3RpbWVvdXQgKi8KKwlBX1VJTlQzMiByeGRlc2NfZXJyX3BlZXJfaWR4X3RvOworCS8qIE51bWJlciBvZiBNU0RVcyB3aXRoIGZsYWcgb2Ygb3ZlcmZsb3cgKi8KKwlBX1VJTlQzMiByeGRlc2NfZXJyX292OworCS8qIE51bWJlciBvZiBNU0RVcyB3aXRoIGZsYWcgb2YgbXNkdV9sZW5ndGhfZXJyICovCisJQV9VSU5UMzIgcnhkZXNjX2Vycl9tc2R1X2xlbjsKKwkvKiBOdW1iZXIgb2YgTVNEVXMgd2l0aCBmbGFnIG9mIG1wZHVfbGVuZ3RoX2VyciAqLworCUFfVUlOVDMyIHJ4ZGVzY19lcnJfbXBkdV9sZW47CisJLyogTnVtYmVyIG9mIE1TRFVzIHdpdGggZmxhZyBvZiB0a2lwX21pY19lcnIgKi8KKwlBX1VJTlQzMiByeGRlc2NfZXJyX3RraXBfbWljOworCS8qIE51bWJlciBvZiBNU0RVcyB3aXRoIGZsYWcgb2YgZGVjcnlwdF9lcnIgKi8KKwlBX1VJTlQzMiByeGRlc2NfZXJyX2RlY3J5cHQ7CisJLyogTnVtYmVyIG9mIE1TRFVzIHdpdGggZmxhZyBvZiBmY3NfZXJyICovCisJQV9VSU5UMzIgcnhkZXNjX2Vycl9mY3M7CisJLyogTnVtYmVyIG9mIFVuaWNhc3QgKGJjX21jIGJpdCBpcyBub3Qgc2V0IGluIGF0dGVudGlvbiB3b3JkKQorCSogZnJhbWVzIHdpdGggaW52YWxpZCBwZWVyIGhhbmRsZXIKKwkqLworCUFfVUlOVDMyIHJ4ZGVzY191Y19tc2R1c19pbnZfcGVlcjsKKwkvKiBOdW1iZXIgb2YgdW5pY2FzdCBmcmFtZSBkaXJlY3RseSAoZGlyZWN0IGJpdCBpcyBzZXQgaW4gYXR0ZW50aW9uIHdvcmQpCisJKiB0byBEVVQgd2l0aCBpbnZhbGlkIHBlZXIgaGFuZGxlcgorCSovCisJQV9VSU5UMzIgcnhkZXNjX2RpcmVjdF9tc2R1c19pbnZfcGVlcjsKKwkvKiBOdW1iZXIgb2YgQnJvYWRjYXN0L011bHRpY2FzdCAoYmNfbWMgYml0IHNldCBpbiBhdHRlbnRpb24gd29yZCkKKwkqIGZyYW1lcyB3aXRoIGludmFsaWQgcGVlciBoYW5kbGVyCisJKi8KKwlBX1VJTlQzMiByeGRlc2NfYm1jX21zZHVzX2ludl9wZWVyOworCS8qIE51bWJlciBvZiBNU0RVcyBkcm9wcGVkIGR1ZSB0byBubyBmaXJzdCBNU0RVIGZsYWcgKi8KKwlBX1VJTlQzMiByeGRlc2Nfbm9fMXN0X21zZHU7CisJLyogTnVtYmVyIG9mIE1TRFVzIGRyb3BlZCBkdWUgdG8gcmluZyBvdmVyZmxvdyAqLworCUFfVUlOVDMyIG1zZHVfZHJvcF9yaW5nX292OworCS8qIE51bWJlciBvZiBNU0RVcyBkcm9wcGVkIGR1ZSB0byBGQyBtaXNtYXRjaCAqLworCUFfVUlOVDMyIG1zZHVfZHJvcF9mY19taXNtYXRjaDsKKwkvKiBOdW1iZXIgb2YgTVNEVXMgZHJvcHBlZCBkdWUgdG8gbWd0IGZyYW1lIGluIFJlbW90ZSByaW5nICovCisJQV9VSU5UMzIgbXNkdV9kcm9wX21nbXRfcmVtb3RlX3Jpbmc7CisJLyogTnVtYmVyIG9mIE1TRFVzIGRyb3BwZWQgZHVlIHRvIGVycm9ycyBub3QgcmVwb3J0ZWQgaW4gYXR0ZW50aW9uIHdvcmQgKi8KKwlBX1VJTlQzMiBtc2R1X2Ryb3BfbWlzYzsKKwkvKiBOdW1iZXIgb2YgTVNEVXMgZ28gdG8gb2ZmbG9hZCBiZWZvcmUgcmVvcmRlciAqLworCUFfVUlOVDMyIG9mZmxvYWRfbXNkdV93YWw7CisJLyogTnVtYmVyIG9mIGRhdGEgZnJhbWUgZHJvcHBlZCBieSBvZmZsb2FkIGFmdGVyIHJlb3JkZXIgKi8KKwlBX1VJTlQzMiBvZmZsb2FkX21zZHVfcmVvcmRlcjsKKwkvKiBOdW1iZXIgb2YgTVBEVXMgd2l0aCBzZXF1ZW5jZSBudW1iZXIgaW4gdGhlIHBhc3QgYW5kIHdpdGhpbgorCXRoZSBCQSB3aW5kb3cgKi8KKwlBX1VJTlQzMiBkdXBfcGFzdF93aXRoaW5fd2luZG93OworCS8qIE51bWJlciBvZiBNUERVcyB3aXRoIHNlcXVlbmNlIG51bWJlciBpbiB0aGUgcGFzdCBhbmQKKwkqIG91dHNpZGUgdGhlIEJBIHdpbmRvdyAqLworCUFfVUlOVDMyIGR1cF9wYXN0X291dHNpZGVfd2luZG93OworCS8qIE51bWJlciBvZiBNU0RVcyB3aXRoIGRlY3J5cHQvTUlDIGVycm9yICovCisJQV9VSU5UMzIgcnhkZXNjX2Vycl9kZWNyeXB0X21pYzsKKwkvKiBOdW1iZXIgb2YgZGF0YSBNU0RVcyByZWNlaXZlZCBvbiBib3RoIGxvY2FsIGFuZCByZW1vdGUgcmluZ3MgKi8KKwlBX1VJTlQzMiBkYXRhX21zZHVzX29uX2JvdGhfcmluZ3M7Cit9OworCisKKy8qCisgKiBSeCBSZW1vdGUgYnVmZmVyIHN0YXRpc3RpY3MKKyAqIE5COiBhbGwgdGhlIGZpZWxkcyBtdXN0IGJlIGRlZmluZWQgaW4gNCBvY3RldHMgc2l6ZS4KKyAqLworc3RydWN0IHJ4X3JlbW90ZV9idWZmZXJfbWdtdF9zdGF0cyB7CisJLyogVG90YWwgbnVtYmVyIG9mIE1TRFVzIHJlYXBlZCBmb3IgUnggcHJvY2Vzc2luZyAqLworCUFfVUlOVDMyIHJlbW90ZV9yZWFwZWQ7CisJLyogTVNEVXMgcmVjeWNsZWQgd2l0aGluIGZpcm13YXJlICovCisJQV9VSU5UMzIgcmVtb3RlX3JlY3ljbGVkOworCS8qIE1TRFVzIHN0b3JlZCBieSBEYXRhIFJ4ICovCisJQV9VSU5UMzIgZGF0YV9yeF9tc2R1c19zdG9yZWQ7CisJLyogTnVtYmVyIG9mIEhUVCBpbmRpY2F0aW9ucyBmcm9tIFdBTCBSeCBNU0RVICovCisJQV9VSU5UMzIgd2FsX3J4X2luZDsKKwkvKiBOdW1iZXIgb2YgdW5jb25zdW1lZCBIVFQgaW5kaWNhdGlvbnMgZnJvbSBXQUwgUnggTVNEVSAqLworCUFfVUlOVDMyIHdhbF9yeF9pbmRfdW5jb25zdW1lZDsKKwkvKiBOdW1iZXIgb2YgSFRUIGluZGljYXRpb25zIGZyb20gRGF0YSBSeCBNU0RVICovCisJQV9VSU5UMzIgZGF0YV9yeF9pbmQ7CisJLyogTnVtYmVyIG9mIHVuY29uc3VtZWQgSFRUIGluZGljYXRpb25zIGZyb20gRGF0YSBSeCBNU0RVICovCisJQV9VSU5UMzIgZGF0YV9yeF9pbmRfdW5jb25zdW1lZDsKKwkvKiBOdW1iZXIgb2YgSFRUIGluZGljYXRpb25zIGZyb20gQVRIQlVGICovCisJQV9VSU5UMzIgYXRoYnVmX3J4X2luZDsKKwkvKiBOdW1iZXIgb2YgcmVtb3RlIGJ1ZmZlcnMgcmVxdWVzdGVkIGZvciByZWZpbGwgKi8KKwlBX1VJTlQzMiByZWZpbGxfYnVmX3JlcTsKKwkvKiBOdW1iZXIgb2YgcmVtb3RlIGJ1ZmZlcnMgZmlsbGVkIGJ5IHRoZSBob3N0ICovCisJQV9VSU5UMzIgcmVmaWxsX2J1Zl9yc3A7CisJLyogTnVtYmVyIG9mIHRpbWVzIE1BQyBod19pbmRleCA9IGYvdyB3cml0ZV9pbmRleCAqLworCUFfSU5UMzIgbWFjX25vX2J1ZnM7CisJLyogTnVtYmVyIG9mIHRpbWVzIGYvdyB3cml0ZV9pbmRleCA9IGYvdyByZWFkX2luZGV4IGZvciBNQUMgUnggcmluZyAqLworCUFfSU5UMzIgZndfaW5kaWNlc19lcXVhbDsKKwkvKiBOdW1iZXIgb2YgdGltZXMgZi93IGZpbmRzIG5vIGJ1ZmZlcnMgdG8gcG9zdCAqLworCUFfSU5UMzIgaG9zdF9ub19idWZzOworfTsKKworLyoKKyAqIFRYQkYgTVUvU1UgcGFja2V0cyBhbmQgTkRQQSBzdGF0aXN0aWNzCisgKiBOQjogYWxsIHRoZSBmaWVsZHMgbXVzdCBiZSBkZWZpbmVkIGluIDQgb2N0ZXRzIHNpemUuCisgKi8KK3N0cnVjdCByeF90eGJmX211c3VfbmRwYV9wa3RzX3N0YXRzIHsKKwkvKiBudW1iZXIgb2YgVFhCRiBNVSBwYWNrZXRzIHJlY2VpdmVkICovCisJQV9VSU5UMzIgbnVtYmVyX211X3BrdHM7CisJLyogbnVtYmVyIG9mIFRYQkYgU1UgcGFja2V0cyByZWNlaXZlZCAqLworCUFfVUlOVDMyIG51bWJlcl9zdV9wa3RzOworCS8qIG51bWJlciBvZiBUWEJGIGRpcmVjdGVkIE5EUEEgKi8KKwlBX1VJTlQzMiB0eGJmX2RpcmVjdGVkX25kcGFfY291bnQ7CisJLyogbnVtYmVyIG9mIFRYQkYgcmV0cmllZCBORFBBICovCisJQV9VSU5UMzIgdHhiZl9uZHBhX3JldHJ5X2NvdW50OworCS8qIHRvdGFsIG51bWJlciBvZiBUWEJGIE5EUEEgKi8KKwlBX1VJTlQzMiB0eGJmX3RvdGFsX25kcGFfY291bnQ7CisJLyogbXVzdCBiZSBzZXQgdG8gMHgwICovCisJQV9VSU5UMzIgcmVzZXJ2ZWRbM107Cit9OworCisvKgorICogaHR0X2RiZ19zdGF0c19zdGF0dXMgLQorICogcHJlc2VudCAtICAgICBUaGUgcmVxdWVzdGVkIHN0YXRzIGhhdmUgYmVlbiBkZWxpdmVyZWQgaW4gZnVsbC4KKyAqICAgICAgICAgICAgICAgVGhpcyBpbmRpY2F0ZXMgdGhhdCBlaXRoZXIgdGhlIHN0YXRzIGluZm9ybWF0aW9uIHdhcyBjb250YWluZWQKKyAqICAgICAgICAgICAgICAgaW4gaXRzIGVudGlyZXR5IHdpdGhpbiB0aGlzIG1lc3NhZ2UsIG9yIGVsc2UgdGhpcyBtZXNzYWdlCisgKiAgICAgICAgICAgICAgIGNvbXBsZXRlcyB0aGUgZGVsaXZlcnkgb2YgdGhlIHJlcXVlc3RlZCBzdGF0cyBpbmZvIHRoYXQgd2FzCisgKiAgICAgICAgICAgICAgIHBhcnRpYWxseSBkZWxpdmVyZWQgdGhyb3VnaCBlYXJsaWVyIFNUQVRTX0NPTkYgbWVzc2FnZXMuCisgKiBwYXJ0aWFsIC0gICAgIFRoZSByZXF1ZXN0ZWQgc3RhdHMgaGF2ZSBiZWVuIGRlbGl2ZXJlZCBpbiBwYXJ0LgorICogICAgICAgICAgICAgICBPbmUgb3IgbW9yZSBzdWJzZXF1ZW50IFNUQVRTX0NPTkYgbWVzc2FnZXMgd2l0aCB0aGUgc2FtZQorICogICAgICAgICAgICAgICBjb29raWUgdmFsdWUgd2lsbCBiZSBzZW50IHRvIGRlbGl2ZXIgdGhlIHJlbWFpbmRlciBvZiB0aGUKKyAqICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uCisgKiBlcnJvciAtICAgICAgIFRoZSByZXF1ZXN0ZWQgc3RhdHMgY291bGQgbm90IGJlIGRlbGl2ZXJlZCwgZm9yIGV4YW1wbGUgZHVlCisgKiAgICAgICAgICAgICAgIHRvIGEgc2hvcnRhZ2Ugb2YgbWVtb3J5IHRvIGNvbnN0cnVjdCBhIG1lc3NhZ2UgaG9sZGluZyB0aGUKKyAqICAgICAgICAgICAgICAgcmVxdWVzdGVkIHN0YXRzLgorICogaW52YWxpZCAtICAgICBUaGUgcmVxdWVzdGVkIHN0YXQgdHlwZSBpcyBlaXRoZXIgbm90IHJlY29nbml6ZWQsIG9yIHRoZQorICogICAgICAgICAgICAgICB0YXJnZXQgaXMgY29uZmlndXJlZCB0byBub3QgZ2F0aGVyIHRoZSBzdGF0cyB0eXBlIGluIHF1ZXN0aW9uLgorICogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisgKiBzZXJpZXNfZG9uZSAtIFRoaXMgc3BlY2lhbCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBubyBmdXJ0aGVyIHN0YXRzIGluZm8KKyAqICAgICAgICAgICAgICAgZWxlbWVudHMgYXJlIHByZXNlbnQgd2l0aGluIGEgc2VyaWVzIG9mIHN0YXRzIGluZm8gZWxlbXMKKyAqICAgICAgICAgICAgICAgKHdpdGhpbiBhIHN0YXRzIHVwbG9hZCBjb25maXJtYXRpb24gbWVzc2FnZSkuCisgKi8KK2VudW0gaHR0X2RiZ19zdGF0c19zdGF0dXMgeworCUhUVF9EQkdfU1RBVFNfU1RBVFVTX1BSRVNFTlQgPSAwLAorCUhUVF9EQkdfU1RBVFNfU1RBVFVTX1BBUlRJQUwgPSAxLAorCUhUVF9EQkdfU1RBVFNfU1RBVFVTX0VSUk9SID0gMiwKKwlIVFRfREJHX1NUQVRTX1NUQVRVU19JTlZBTElEID0gMywKKworCisJSFRUX0RCR19TVEFUU19TVEFUVVNfU0VSSUVTX0RPTkUgPSA3Cit9OworCisvKioKKyAqIEBicmllZiB0YXJnZXQgLT4gaG9zdCBzdGF0aXN0aWNzIHVwbG9hZAorICoKKyAqIEBkZXRhaWxzCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgdGhlIEhUVCB0YXJnZXQKKyAqIHRvIGhvc3Qgc3RhdHMgdXBsb2FkIGNvbmZpcm1hdGlvbiBtZXNzYWdlLgorICogVGhlIG1lc3NhZ2UgY29udGFpbnMgYSBjb29raWUgZWNob2VkIGZyb20gdGhlIEhUVCBob3N0LT50YXJnZXQgc3RhdHMKKyAqIHVwbG9hZCByZXF1ZXN0LCB3aGljaCBpZGVudGlmaWVzIHdoaWNoIHJlcXVlc3QgdGhlIGNvbmZpcm1hdGlvbiBpcworICogZm9yLCBhbmQgYSBzZXJpZXMgb2YgdGFnLWxlbmd0aC12YWx1ZSBzdGF0cyBpbmZvcm1hdGlvbiBlbGVtZW50cy4KKyAqIFRoZSB0YWctbGVuZ3RoIGhlYWRlciBmb3IgZWFjaCBzdGF0cyBpbmZvIGVsZW1lbnQgYWxzbyBpbmNsdWRlcyBhCisgKiBzdGF0dXMgZmllbGQsIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHJlcXVlc3QgZm9yIHRoZSBzdGF0IHR5cGUgaW4KKyAqIHF1ZXN0aW9uIHdhcyBmdWxseSBtZXQsIHBhcnRpYWxseSBtZXQsIHVuYWJsZSB0byBiZSBtZXQsIG9yIGludmFsaWQKKyAqIChpZiB0aGUgc3RhdCB0eXBlIGluIHF1ZXN0aW9uIGlzIGRpc2FibGVkIGluIHRoZSB0YXJnZXQpLgorICogQSBzcGVjaWFsIHZhbHVlIG9mIGFsbCAxJ3MgaW4gdGhpcyBzdGF0dXMgZmllbGQgaXMgdXNlZCB0byBpbmRpY2F0ZQorICogdGhlIGVuZCBvZiB0aGUgc2VyaWVzIG9mIHN0YXRzIGluZm8gZWxlbWVudHMuCisgKgorICoKKyAqIHwzMSAgICAgICAgICAgICAgICAgICAgICAgICAxNnwxNSAgICAgICAgICAgOHw3ICAgNXw0ICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgfCAgICBtc2cgdHlwZSAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgY29va2llIExTQnMgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICBjb29raWUgTVNCcyAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgIHN0YXRzIGVudHJ5IGxlbmd0aCAgICAgfCAgIHJlc2VydmVkICAgfCAgUyAgfHN0YXQgdHlwZXwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgIHR5cGUtc3BlY2lmaWMgc3RhdHMgaW5mbyAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgIHN0YXRzIGVudHJ5IGxlbmd0aCAgICAgfCAgIHJlc2VydmVkICAgfCAgUyAgfHN0YXQgdHlwZXwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgIHR5cGUtc3BlY2lmaWMgc3RhdHMgaW5mbyAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgbi9hICAgICAgICAgICAgfCAgIHJlc2VydmVkICAgfCAxMTEgfCAgIG4vYSAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiBIZWFkZXIgZmllbGRzOgorICogIC0gTVNHX1RZUEUKKyAqICAgIEJpdHMgNzowCisgKiAgICBQdXJwb3NlOiBpZGVudGlmaWVzIHRoaXMgaXMgYSBzdGF0aXN0aWNzIHVwbG9hZCBjb25maXJtYXRpb24gbWVzc2FnZQorICogICAgVmFsdWU6IDB4OQorICogIC0gQ09PS0lFX0xTQlMKKyAqICAgIEJpdHMgMzE6MAorICogICAgUHVycG9zZTogUHJvdmlkZSBhIG1lY2hhbmlzbSB0byBtYXRjaCBhIHRhcmdldC0+aG9zdCBzdGF0cyBjb25maXJtYXRpb24KKyAqICAgICAgICBtZXNzYWdlIHdpdGggaXRzIHByZWNlZGluZyBob3N0LT50YXJnZXQgc3RhdHMgcmVxdWVzdCBtZXNzYWdlLgorICogICAgVmFsdWU6IExTQnMgb2YgdGhlIG9wYXF1ZSBjb29raWUgc3BlY2lmaWVkIGJ5IHRoZSBob3N0LXNpZGUgcmVxdWVzdG9yCisgKiAgLSBDT09LSUVfTVNCUworICogICAgQml0cyAzMTowCisgKiAgICBQdXJwb3NlOiBQcm92aWRlIGEgbWVjaGFuaXNtIHRvIG1hdGNoIGEgdGFyZ2V0LT5ob3N0IHN0YXRzIGNvbmZpcm1hdGlvbgorICogICAgICAgIG1lc3NhZ2Ugd2l0aCBpdHMgcHJlY2VkaW5nIGhvc3QtPnRhcmdldCBzdGF0cyByZXF1ZXN0IG1lc3NhZ2UuCisgKiAgICBWYWx1ZTogTVNCcyBvZiB0aGUgb3BhcXVlIGNvb2tpZSBzcGVjaWZpZWQgYnkgdGhlIGhvc3Qtc2lkZSByZXF1ZXN0b3IKKyAqCisgKiBTdGF0cyBJbmZvcm1hdGlvbiBFbGVtZW50IHRhZy1sZW5ndGggaGVhZGVyIGZpZWxkczoKKyAqICAtIFNUQVRfVFlQRQorICogICAgQml0cyA0OjAKKyAqICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgdGhlIHR5cGUgb2Ygc3RhdGlzdGljcyBpbmZvIGhlbGQgaW4gdGhlCisgKiAgICAgICAgZm9sbG93aW5nIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqICAgIFZhbHVlOiBodHRfZGJnX3N0YXRzX3R5cGUKKyAqICAtIFNUQVRVUworICogICAgQml0cyA3OjUKKyAqICAgIFB1cnBvc2U6IGluZGljYXRlIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCBzdGF0cyBhcmUgcHJlc2VudAorICogICAgVmFsdWU6IGh0dF9kYmdfc3RhdHNfc3RhdHVzLCBpbmNsdWRpbmcgYSBzcGVjaWFsIHZhbHVlICgweDcpIHRvIG1hcmsKKyAqICAgICAgICB0aGUgY29tcGxldGlvbiBvZiB0aGUgc3RhdHMgZW50cnkgc2VyaWVzCisgKiAgLSBMRU5HVEgKKyAqICAgIEJpdHMgMzE6MTYKKyAqICAgIFB1cnBvc2U6IGluZGljYXRlIHRoZSBzdGF0cyBpbmZvcm1hdGlvbiBzaXplCisgKiAgICBWYWx1ZTogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBzdGF0cyBpbmZvcm1hdGlvbgorICogICAgICAgdGhhdCBmb2xsb3dzIHRoZSBlbGVtZW50IHRhZy1sZW5ndGggaGVhZGVyLgorICogICAgICAgSXQgaXMgZXhwZWN0ZWQgYnV0IG5vdCByZXF1aXJlZCB0aGF0IHRoaXMgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YKKyAqICAgICAgIDQgYnl0ZXMuICBFdmVuIGlmIHRoZSBsZW5ndGggaXMgbm90IGFuIGludGVnZXIgbXVsdGlwbGUgb2YgNCwgdGhlCisgKiAgICAgICBzdWJzZXF1ZW50IHN0YXRzIGVudHJ5IGhlYWRlciB3aWxsIGJlZ2luIG9uIGEgNC1ieXRlIGFsaWduZWQKKyAqICAgICAgIGJvdW5kYXJ5LgorICovCisjZGVmaW5lIEhUVF9UMkhfU1RBVFNfQ09PS0lFX1NJWkUgICAgICAgICA4CisKKyNkZWZpbmUgSFRUX1QySF9TVEFUU19DT05GX1RBSUxfU0laRSAgICAgIDQKKworI2RlZmluZSBIVFRfVDJIX1NUQVRTX0NPTkZfSERSX1NJWkUgICAgICAgNAorCisjZGVmaW5lIEhUVF9UMkhfU1RBVFNfQ09ORl9UTFZfSERSX1NJWkUgICA0CisKKyNkZWZpbmUgSFRUX1QySF9TVEFUU19DT05GX1RMVl9UWVBFX00gICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgSFRUX1QySF9TVEFUU19DT05GX1RMVl9UWVBFX1MgICAgIDAKKyNkZWZpbmUgSFRUX1QySF9TVEFUU19DT05GX1RMVl9TVEFUVVNfTSAgIDB4MDAwMDAwZTAKKyNkZWZpbmUgSFRUX1QySF9TVEFUU19DT05GX1RMVl9TVEFUVVNfUyAgIDUKKyNkZWZpbmUgSFRUX1QySF9TVEFUU19DT05GX1RMVl9MRU5HVEhfTSAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRUX1QySF9TVEFUU19DT05GX1RMVl9MRU5HVEhfUyAgIDE2CisKKyNkZWZpbmUgSFRUX1QySF9TVEFUU19DT05GX1RMVl9UWVBFX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVDJIX1NUQVRTX0NPTkZfVExWX1RZUEUsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1QySF9TVEFUU19DT05GX1RMVl9UWVBFX1M7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfVDJIX1NUQVRTX0NPTkZfVExWX1RZUEVfR0VUKHdvcmQpCQlcCisJKCgod29yZCkgJiBIVFRfVDJIX1NUQVRTX0NPTkZfVExWX1RZUEVfTSkgPj4JXAorCSBIVFRfVDJIX1NUQVRTX0NPTkZfVExWX1RZUEVfUykKKworI2RlZmluZSBIVFRfVDJIX1NUQVRTX0NPTkZfVExWX1NUQVRVU19TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1QySF9TVEFUU19DT05GX1RMVl9TVEFUVVMsIHZhbHVlKTsgXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1QySF9TVEFUU19DT05GX1RMVl9TVEFUVVNfUzsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9UMkhfU1RBVFNfQ09ORl9UTFZfU1RBVFVTX0dFVCh3b3JkKQkJXAorCSgoKHdvcmQpICYgSFRUX1QySF9TVEFUU19DT05GX1RMVl9TVEFUVVNfTSkgPj4JXAorCSBIVFRfVDJIX1NUQVRTX0NPTkZfVExWX1NUQVRVU19TKQorCisjZGVmaW5lIEhUVF9UMkhfU1RBVFNfQ09ORl9UTFZfTEVOR1RIX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVDJIX1NUQVRTX0NPTkZfVExWX0xFTkdUSCwgdmFsdWUpOyBcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfVDJIX1NUQVRTX0NPTkZfVExWX0xFTkdUSF9TOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX1QySF9TVEFUU19DT05GX1RMVl9MRU5HVEhfR0VUKHdvcmQpCQlcCisJKCgod29yZCkgJiBIVFRfVDJIX1NUQVRTX0NPTkZfVExWX0xFTkdUSF9NKSA+PglcCisJIEhUVF9UMkhfU1RBVFNfQ09ORl9UTFZfTEVOR1RIX1MpCisKKyNkZWZpbmUgSExfSFRUX0ZXX1JYX0RFU0NfUlNWRF9TSVpFIDE4CisjZGVmaW5lIEhUVF9NQVhfQUdHUiA2NAorI2RlZmluZSBIVFRfSExfTUFYX0FHR1IgMTgKKworLyoqCisgKiBAYnJpZWYgaG9zdCAtPiB0YXJnZXQgRlJBRyBERVNDUklQVE9SL01TRFVfRVhUIERFU0MgYmFuaworICoKKyAqIEBkZXRhaWxzCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgdGhlIEhUVCBob3N0CisgKiB0byB0YXJnZXQgZnJhZ19kZXNjL21zZHVfZXh0IGJhbmsgY29uZmlndXJhdGlvbiBtZXNzYWdlLgorICogVGhlIG1lc3NhZ2UgY29udGFpbnMgdGhlIGJhc2VkIGFkZHJlc3MgYW5kIHRoZSBtaW4gYW5kIG1heCBpZCBvZiB0aGUKKyAqIE1TRFVfRVhUL0ZSQUdfREVTQyB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgSFRUIHRvIG1hcCBNU0RVIERFU0MgYW5kCisgKiBNU0RVX0VYVC9GUkFHX0RFU0MuCisgKiBIVFQgd2lsbCB1c2UgaWQgaW4gSFRUIGRlc2NyaXB0b3IgaW5zdGVhZCBzZW5kaW5nIHRoZSBmcmFnX2Rlc2NfcHRyLgorICogSW4gcGVyZWdyaW5lIHRoZSBmaXJtd2FyZSB3aWxsIHVzZSBmcmFnbWVudF9kZXNjX3B0ciBidXQgaW4gV0lGSTIuMAorICogdGhlIGhhcmR3YXJlIGRvZXMgdGhlIG1hcHBpbmcvdHJhbnNsYXRpb24uCisgKgorICogVG90YWwgYmFua3MgdGhhdCBjYW4gYmUgY29uZmlndXJlZCBpcyBjb25maWd1cmVkIHRvIDE2LgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IFRYIGhhcyBiZSBpbml0aWF0ZWQgYnkgdGhlIEhUVAorICoKKyAqIHwzMSAgICAgICAgICAgICAgICAgICAgICAgICAxNnwxNSAgICAgICAgICAgOHw3ICAgNXw0ICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCBERVNDX1NJWkUgICAgfCAgTlVNX0JBTktTICAgfCBSRVMgfFNXUHxwZGV2fCAgICBtc2cgdHlwZSAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICBCQU5LMF9CQVNFX0FERFJFU1MgKGJpdHMgMzE6MCkgICAgICAgICAgICAgfAorICNpZiBIVFRfUEFERFI2NAorICogfCAgICAgICAgICAgICAgICAgQkFOSzBfQkFTRV9BRERSRVNTIChiaXRzIDYzOjMyKSAgICAgICAgICAgIHwKKyAjZW5kaWYKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICAgIEJBTksxNV9CQVNFX0FERFJFU1MgKGJpdHMgMzE6MCkgICAgICAgICAgICB8CisgI2lmIEhUVF9QQUREUjY0CisgKiB8ICAgICAgICAgICAgICAgICBCQU5LMTVfQkFTRV9BRERSRVNTIChiaXRzIDYzOjMyKSAgICAgICAgICAgfAorICNlbmRpZgorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgQkFOSzBfTUFYX0lEICAgICAgICAgIHwgICAgICAgQkFOSzBfTUlOX0lEICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgIEJBTksxNV9NQVhfSUQgICAgICAgICB8ICAgICAgIEJBTksxNV9NSU5fSUQgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIEhlYWRlciBmaWVsZHM6CisgKiAgLSBNU0dfVFlQRQorICogICAgQml0cyA3OjAKKyAqICAgIFZhbHVlOiAweDYKKyAqICBmb3Igc3lzdGVtcyB3aXRoIDY0LWJpdCBmb3JtYXQgZm9yIGJ1cyBhZGRyZXNzZXM6CisgKiAgICAgIC0gQkFOS3hfQkFTRV9BRERSRVNTX0xPCisgKiAgICAgICAgQml0cyAzMTowCisgKiAgICAgICAgUHVycG9zZTogUHJvdmlkZSBhIG1lY2hhbmlzbSB0byBzcGVjaWZ5IHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlCisgKiAgICAgICAgICAgICBNU0RVX0VYVCBiYW5rIHBoeXNpY2FsL2J1cyBhZGRyZXNzLgorICogICAgICAgIFZhbHVlOiBsb3dlciA0IGJ5dGVzIG9mIE1TRFVfRVhUIGJhbmsgcGh5c2ljYWwgLyBidXMgYWRkcmVzcworICogICAgICAtIEJBTkt4X0JBU0VfQUREUkVTU19ISQorICogICAgICAgIEJpdHMgMzE6MAorICogICAgICAgIFB1cnBvc2U6IFByb3ZpZGUgYSBtZWNoYW5pc20gdG8gc3BlY2lmeSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZQorICogICAgICAgICAgICAgTVNEVV9FWFQgYmFuayBwaHlzaWNhbC9idXMgYWRkcmVzcy4KKyAqICAgICAgICBWYWx1ZTogaGlnaGVyIDQgYnl0ZXMgb2YgTVNEVV9FWFQgYmFuayBwaHlzaWNhbCAvIGJ1cyBhZGRyZXNzCisgKiAgZm9yIHN5c3RlbXMgd2l0aCAzMi1iaXQgZm9ybWF0IGZvciBidXMgYWRkcmVzc2VzOgorICogICAgICAtIEJBTkt4X0JBU0VfQUREUkVTUworICogICAgICAgIEJpdHMgMzE6MAorICogICAgICAgIFB1cnBvc2U6IFByb3ZpZGUgYSBtZWNoYW5pc20gdG8gc3BlY2lmeSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZQorICogICAgICAgICAgICAgTVNEVV9FWFQgYmFuayBwaHlzaWNhbC9idXMgYWRkcmVzcy4KKyAqICAgICAgICBWYWx1ZTogTVNEVV9FWFQgYmFuayBwaHlzaWNhbCAvIGJ1cyBhZGRyZXNzCisgKiAgLSBCQU5LeF9NSU5fSUQKKyAqICAgIEJpdHMgMTU6MAorICogICAgUHVycG9zZTogUHJvdmlkZSBhIG1lY2hhbmlzbSB0byBzcGVjaWZ5IHRoZSBtaW4gaW5kZXggdGhhdCBuZWVkcyB0bworICogICAgICAgICAgbWFwcGVkLgorICogIC0gQkFOS3hfTUFYX0lECisgKiAgICBCaXRzIDMxOjE2CisgKiAgICBQdXJwb3NlOiBQcm92aWRlIGEgbWVjaGFuaXNtIHRvIHNwZWNpZnkgdGhlIG1heCBpbmRleCB0aGF0IG5lZWRzIHRvCisgKiAgICAgICAgICBtYXBwZWQuCisgKgorICovCisKKy8qKiBAdG9kbyBDb21wcmVzcyB0aGUgZmllbGRzIHRvIGZpdCBNQVggSFRUIE1lc3NhZ2Ugc2l6ZSwgdW50aWwgdGhlbgorICogICAgICAgIGNvbmZpZ3VyZSB0byBhIHNhZmUgdmFsdWUuCisgKiAgQG5vdGUgTUFYIHN1cHBvcnRlZCBiYW5rcyBpcyAxNi4KKyAqLworI2RlZmluZSBIVFRfVFhfTVNEVV9FWFRfQkFOS19NQVggNAorCisjZGVmaW5lIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfUERFVklEX00gICAgICAgMHgzMDAKKyNkZWZpbmUgSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19QREVWSURfUyAgICAgICA4CisKKyNkZWZpbmUgSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19TV0FQX00gICAgICAgICAweDQwMAorI2RlZmluZSBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX1NXQVBfUyAgICAgICAgIDEwCisKKyNkZWZpbmUgSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19OVU1fQkFOS1NfTSAgICAweGZmMDAwMAorI2RlZmluZSBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX05VTV9CQU5LU19TICAgIDE2CisKKyNkZWZpbmUgSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19ERVNDX1NJWkVfTSAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfREVTQ19TSVpFX1MgICAgMjQKKworI2RlZmluZSBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX01JTl9JRFhfTSAgICAgIDB4ZmZmZgorI2RlZmluZSBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX01JTl9JRFhfUyAgICAgIDAKKworI2RlZmluZSBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX01BWF9JRFhfTSAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19NQVhfSURYX1MgICAgICAxNgorCisjZGVmaW5lIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfUERFVklEX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX1BERVZJRCwgdmFsdWUpOyBcCisJCSh3b3JkKSB8PSAoKHZhbHVlKSA8PCBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX1BERVZJRF9TKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfUERFVklEX0dFVCh3b3JkKQkJCQlcCisJKCgod29yZCkgJiBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX1BERVZJRF9NKSA+PgkJCVwKKwlIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX1BERVZJRF9TKQorCisjZGVmaW5lIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfU1dBUF9TRVQod29yZCwgdmFsdWUpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX1NXQVAsIHZhbHVlKTtcCisJCSh3b3JkKSB8PSAoKHZhbHVlKSA8PCBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX1NXQVBfUyk7XAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfU1dBUF9HRVQod29yZCkJCQlcCisJKCgod29yZCkgJiBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX1NXQVBfTSkgPj4JCVwKKwlIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX1NXQVBfUykKKworI2RlZmluZSBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX05VTV9CQU5LU19TRVQod29yZCwgdmFsdWUpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX05VTV9CQU5LUywgdmFsdWUpOyBcCisJCSh3b3JkKSB8PSAoKHZhbHVlKSA8PCBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX05VTV9CQU5LU19TKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfTlVNX0JBTktTX0dFVCh3b3JkKQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfTlVNX0JBTktTX00pID4+CQlcCisJSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19OVU1fQkFOS1NfUykKKworI2RlZmluZSBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX0RFU0NfU0laRV9TRVQod29yZCwgdmFsdWUpCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX0RFU0NfU0laRSwgdmFsdWUpOyBcCisJCSh3b3JkKSB8PSAoKHZhbHVlKSA8PCBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX0RFU0NfU0laRV9TKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfREVTQ19TSVpFX0dFVCh3b3JkKQkJCVwKKwkoKCh3b3JkKSAmIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfREVTQ19TSVpFX00pID4+CQlcCisJSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19ERVNDX1NJWkVfUykKKworI2RlZmluZSBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX01JTl9JRFhfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9IMlRfRlJBR19ERVNDX0JBTktfTUlOX0lEWCwgdmFsdWUpOyBcCisJCSh3b3JkKSB8PSAoKHZhbHVlKSA8PCBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX01JTl9JRFhfUyk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX01JTl9JRFhfR0VUKHdvcmQpCQkJXAorCSgoKHdvcmQpICYgSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19NSU5fSURYX00pID4+CQkJXAorCUhUVF9IMlRfRlJBR19ERVNDX0JBTktfTUlOX0lEWF9TKQorCisjZGVmaW5lIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfTUFYX0lEWF9TRVQod29yZCwgdmFsdWUpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19NQVhfSURYLCB2YWx1ZSk7IFwKKwkJKHdvcmQpIHw9ICgodmFsdWUpIDw8IEhUVF9IMlRfRlJBR19ERVNDX0JBTktfTUFYX0lEWF9TKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9IMlRfRlJBR19ERVNDX0JBTktfTUFYX0lEWF9HRVQod29yZCkJCQlcCisJKCgod29yZCkgJiBIVFRfSDJUX0ZSQUdfREVTQ19CQU5LX01BWF9JRFhfTSkgPj4JCQlcCisJSFRUX0gyVF9GUkFHX0RFU0NfQkFOS19NQVhfSURYX1MpCisKKworLyoKKyAqIFRFTVBMQVRFX0hUVF9UWF9GUkFHX0RFU0NfQkFOS19DRkdfVDoKKyAqIFRoaXMgbWFjcm8gZGVmaW5lcyBhIGh0dF90eF9mcmFnX2Rlc2NYWFhfYmFua19jZmdfdCBpbiB3aGljaCBhbnkgcGh5c2ljYWwKKyAqIGFkZHJlc3NlcyBhcmUgc3RvcmVkIGluIGEgWFhYLWJpdCBmaWVsZC4KKyAqIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBkZWZpbmUgYm90aCBodHRfdHhfZnJhZ19kZXNjMzJfYmFua19jZmdfdCBhbmQKKyAqIGh0dF90eF9mcmFnX2Rlc2M2NF9iYW5rX2NmZ190IHN0cnVjdHMuCisgKi8KKyNkZWZpbmUgVEVNUExBVEVfSFRUX1RYX0ZSQUdfREVTQ19CQU5LX0NGR19UKAkJCQlcCisJX3BhZGRyX2JpdHNfLAkJCQkJCQlcCisJX3BhZGRyX19iYW5rX2Jhc2VfYWRkcmVzc18pCQkJCQlcCisJUFJFUEFDSyBzdHJ1Y3QgaHR0X3R4X2ZyYWdfZGVzYyAjIyBfcGFkZHJfYml0c18gIyMgX2JhbmtfY2ZnX3QgeyBcCisJCS8qKiB3b3JkIDAJCQkJCQlcCisJCSAqIG1zZ190eXBlOiAgICA4LAkJCQkJXAorCQkgKiBwZGV2X2lkOiAgICAgMiwJCQkJCVwKKwkJICogc3dhcDogICAgICAgIDEsCQkJCQlcCisJCSAqIHJlc2VydmVkMDogICA1LAkJCQkJXAorCQkgKiBudW1fYmFua3M6ICAgOCwJCQkJCVwKKwkJICogZGVzY19zaXplOiAgICA4OwkJCQkJXAorCQkgKi8JCQkJCQkJXAorCQlBX1VJTlQzMiB3b3JkMDsJCQkJCQlcCisJCS8qCQkJCQkJCVwKKwkJICogSWYgYmFua19iYXNlX2FkZHJlc3MgaXMgNjQgYml0cywgdGhlIHVwcGVyIC8gbG93ZXIKKwkJICogaGFsdmVzIGFyZSBzdG9yZWQJXAorCQkgKiBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIChieXRlcyAwLTMgaW4gdGhlIGZpcnN0IEFfVUlOVDMyLAorCQkgKiBieXRlcyA0LTcgaW4gdGhlIHNlY29uZCBBX1VJTlQzMikuCQlcCisJCSAqLwkJCQkJCQlcCisJCV9wYWRkcl9fYmFua19iYXNlX2FkZHJlc3NfW0hUVF9UWF9NU0RVX0VYVF9CQU5LX01BWF07CVwKKwkJQV9VSU5UMzIgYmFua19pbmZvW0hUVF9UWF9NU0RVX0VYVF9CQU5LX01BWF07CQlcCisJfSBQT1NUUEFDSworLyogZGVmaW5lIGh0dF90eF9mcmFnX2Rlc2MzMl9iYW5rX2NmZ190ICovCitURU1QTEFURV9IVFRfVFhfRlJBR19ERVNDX0JBTktfQ0ZHX1QoMzIsIEhUVF9WQVJfUEFERFIzMihiYW5rX2Jhc2VfYWRkcmVzcykpOworLyogZGVmaW5lIGh0dF90eF9mcmFnX2Rlc2M2NF9iYW5rX2NmZ190ICovCitURU1QTEFURV9IVFRfVFhfRlJBR19ERVNDX0JBTktfQ0ZHX1QoNjQsIEhUVF9WQVJfUEFERFI2NF9MRShiYW5rX2Jhc2VfYWRkcmVzcykpOworLyoKKyAqIE1ha2UgaHR0X3R4X2ZyYWdfZGVzY19iYW5rX2NmZ190IGJlIGFuIGFsaWFzIGZvciBlaXRoZXIKKyAqIGh0dF90eF9mcmFnX2Rlc2MzMl9iYW5rX2NmZ190IG9yIGh0dF90eF9mcmFnX2Rlc2M2NF9iYW5rX2NmZ190CisgKi8KKyNpZiBIVFRfUEFERFI2NAorI2RlZmluZSBodHRfdHhfZnJhZ19kZXNjX2JhbmtfY2ZnX3QgaHR0X3R4X2ZyYWdfZGVzYzY0X2JhbmtfY2ZnX3QKKyNlbHNlCisjZGVmaW5lIGh0dF90eF9mcmFnX2Rlc2NfYmFua19jZmdfdCBodHRfdHhfZnJhZ19kZXNjMzJfYmFua19jZmdfdAorI2VuZGlmCisKKworLyoqCisgKiBAYnJpZWYgdGFyZ2V0IC0+IGhvc3QgSFRUIFRYIENyZWRpdCB0b3RhbCBjb3VudCB1cGRhdGUgbWVzc2FnZSBkZWZpbml0aW9uCisgKgorICp8MzEgICAgICAgICAgICAgICAgIDE2fDE1fDE0ICAgICAgIDl8ICA4ICAgIHw3ICAgICAgIDAgfAorICp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tKy0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tfAorICp8Y3VyIGh0dCBjcmVkaXQgZGVsdGEgfCBRfCByZXNlcnZlZCB8IHNpZ24gIHwgbXNnIHR5cGUgfAorICp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICoKKyAqIEhlYWRlciBmaWVsZHM6CisgKiAgIC0gTVNHX1RZUEUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgdGhpcyBhcyBhIGh0dCB0eCBjcmVkaXQgZGVsdGEgdXBkYXRlIG1lc3NhZ2UKKyAqICAgICBWYWx1ZTogMHhlCisgKiAgIC0gU0lHTgorICogICAgIEJpdHMgOAorICogICAgICBpZGVudGlmaWVzIHdoZXRoZXIgY3JlZGl0IGRlbHRhIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAtIDB4MDogY3JlZGl0IGRlbHRhIGlzIHBvc2l0aXZlLCByZWJhbGFuY2UgaW4gc29tZSBidWZmZXJzCisgKiAgICAgICAtIDB4MTogY3JlZGl0IGRlbHRhIGlzIG5lZ2F0aXZlLCByZWJhbGFuY2Ugb3V0IHNvbWUgYnVmZmVycworICogICAtIHJlc2VydmVkCisgKiAgICAgQml0cyAxNDo5CisgKiAgICAgVmFsdWU6IDB4MAorICogICAtIFRYUV9HUlAKKyAqICAgICBCaXQgMTUKKyAqICAgICBQdXJwb3NlOiBpbmRpY2F0ZXMgd2hldGhlciBhbnkgdHggcXVldWUgZ3JvdXAgaW5mb3JtYXRpb24gZWxlbWVudHMKKyAqICAgICAgICAgYXJlIGFwcGVuZGVkIHRvIHRoZSB0eCBjcmVkaXQgdXBkYXRlIG1lc3NhZ2UKKyAqICAgICBWYWx1ZTogMCAtPiBubyB0eCBxdWV1ZSBncm91cCBpbmZvcm1hdGlvbiBlbGVtZW50IGlzIHByZXNlbnQKKyAqICAgICAgICAgICAgMSAtPiBhIHR4IHF1ZXVlIGdyb3VwIGluZm9ybWF0aW9uIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93cworICogICAtIERFTFRBX0NPVU5UCisgKiAgICAgQml0cyAzMToxNgorICogICAgIFB1cnBvc2U6IFNwZWNpZnkgY3VycmVudCBodHQgY3JlZGl0IGRlbHRhIGFic29sdXRlIGNvdW50CisgKi8KKworI2RlZmluZSBIVFRfVFhfQ1JFRElUX1NJR05fQklUX00gICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIVFRfVFhfQ1JFRElUX1NJR05fQklUX1MgICAgICAgOAorI2RlZmluZSBIVFRfVFhfQ1JFRElUX1RYUV9HUlBfTSAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBIVFRfVFhfQ1JFRElUX1RYUV9HUlBfUyAgICAgICAgMTUKKyNkZWZpbmUgSFRUX1RYX0NSRURJVF9ERUxUQV9BQlNfTSAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRUX1RYX0NSRURJVF9ERUxUQV9BQlNfUyAgICAgIDE2CisKKworI2RlZmluZSBIVFRfVFhfQ1JFRElUX1NJR05fQklUX1NFVCh3b3JkLCB2YWx1ZSkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1RYX0NSRURJVF9TSUdOX0JJVCwgdmFsdWUpOwlcCisJCSh3b3JkKSB8PSAodmFsdWUpICA8PCBIVFRfVFhfQ1JFRElUX1NJR05fQklUX1M7CQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfQ1JFRElUX1NJR05fQklUX0dFVCh3b3JkKQkJCQlcCisJKCgod29yZCkgJiBIVFRfVFhfQ1JFRElUX1NJR05fQklUX00pID4+IEhUVF9UWF9DUkVESVRfU0lHTl9CSVRfUykKKworI2RlZmluZSBIVFRfVFhfQ1JFRElUX1RYUV9HUlBfU0VUKHdvcmQsIHZhbHVlKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfVFhfQ1JFRElUX1RYUV9HUlAsIHZhbHVlKTsJXAorCQkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX1RYX0NSRURJVF9UWFFfR1JQX1M7CQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfVFhfQ1JFRElUX1RYUV9HUlBfR0VUKHdvcmQpCQkJCQlcCisJKCgod29yZCkgJiBIVFRfVFhfQ1JFRElUX1RYUV9HUlBfTSkgPj4gSFRUX1RYX0NSRURJVF9UWFFfR1JQX1MpCisKKyNkZWZpbmUgSFRUX1RYX0NSRURJVF9ERUxUQV9BQlNfU0VUKHdvcmQsIHZhbHVlKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9UWF9DUkVESVRfREVMVEFfQUJTLCB2YWx1ZSk7CVwKKwkJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8IEhUVF9UWF9DUkVESVRfREVMVEFfQUJTX1M7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9UWF9DUkVESVRfREVMVEFfQUJTX0dFVCh3b3JkKQkJCQlcCisJKCgod29yZCkgJiBIVFRfVFhfQ1JFRElUX0RFTFRBX0FCU19NKSA+PiBIVFRfVFhfQ1JFRElUX0RFTFRBX0FCU19TKQorCisKKyNkZWZpbmUgSFRUX1RYX0NSRURJVF9NU0dfQllURVMgNAorCisjZGVmaW5lIEhUVF9UWF9DUkVESVRfU0lHTl9CSVRfUE9TSVRJVkUgIDB4MAorI2RlZmluZSBIVFRfVFhfQ1JFRElUX1NJR05fQklUX05FR0FUSVZFICAweDEKKworCisvKioKKyAqIEBicmllZiBIVFQgV0RJX0lQQSBPcGVyYXRpb24gUmVzcG9uc2UgTWVzc2FnZQorICoKKyAqIEBkZXRhaWxzCisgKiAgSFRUIFdESV9JUEEgT3BlcmF0aW9uIFJlc3BvbnNlIG1lc3NhZ2UgaXMgc2VudCBieSB0YXJnZXQKKyAqICB0byBob3N0IGNvbmZpcm1pbmcgc3VzcGVuZCBvciByZXN1bWUgb3BlcmF0aW9uLgorICogICAgIHwzMSAgICAgICAgICAgIDI0fDIzICAgICAgICAgICAgMTZ8MTUgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgICAwfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgb3BfY29kZSAgICAgICAgICAgICB8ICAgICAgUnN2ZCAgICAgIHwgICAgIG1zZ190eXBlICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgUnN2ZCAgICAgICAgICAgICAgICB8ICAgICAgICAgIFJlc3BvbnNlIGxlbiAgICAgICAgICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgIHwgICAgICAgICAgICAgICAgICBSZXNwb25zZS10eXBlIHNwZWNpZmljIGluZm8gICAgICAgICAgICAgICAgICAgICAgfAorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogSGVhZGVyIGZpZWxkczoKKyAqICAgLSBNU0dfVFlQRQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogSWRlbnRpZmllcyB0aGlzIGFzIFdESV9JUEEgT3BlcmF0aW9uIFJlc3BvbnNlIG1lc3NhZ2UKKyAqICAgICB2YWx1ZTogPSAweDEzCisgKiAgIC0gT1BfQ09ERQorICogICAgIEJpdHMgMzE6MTYKKyAqICAgICBQdXJwb3NlOiBJZGVudGlmaWVzIHRoZSBvcGVyYXRpb24gdGFyZ2V0IGlzIHJlc3BvbmRpbmcgdG8KKyAqICAgICAoZS5nLiBUWCBzdXNwZW5kKQorICogICAgIHZhbHVlOiA9IGVudW0gaHR0X3dkaV9pcGFfb3BfY29kZQorICogICAtIFJTUF9MRU4KKyAqICAgICBCaXRzIDE2OjAKKyAqICAgICBQdXJwb3NlOiBsZW5ndGggZm9yIHRoZSByZXNwb25zZS10eXBlIHNwZWNpZmljIGluZm8KKyAqICAgICB2YWx1ZTogPSBsZW5ndGggaW4gYnl0ZXMgZm9yIHJlc3BvbnNlLXR5cGUgc3BlY2lmaWMgaW5mbworICogICAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiBPUF9DT0RFID09IEhUVF9XRElfSVBBX09QQ09ERV9EQkdfU1RBVFMsIHRoZQorICogICAgICAgICAgICAgIGxlbmd0aCB2YWx1ZSB3aWxsIGJlIHNpemVvZihzdHJ1Y3Qgd2xhbl93ZGlfaXBhX2RiZ19zdGF0c190KS4KKyAqLworCitQUkVQQUNLIHN0cnVjdCBodHRfd2RpX2lwYV9vcF9yZXNwb25zZV90IHsKKwkvKiBEV09SRCAwOiBmbGFncyBhbmQgbWV0YS1kYXRhICovCisJQV9VSU5UMzIKKwkJbXNnX3R5cGU6OCwJLyogSFRUX1QySF9NU0dfVFlQRV9XRElfSVBBX09QX1JFU1BPTlNFICovCisJCXJlc2VydmVkMTo4LAorCQlvcF9jb2RlOjE2OworCUFfVUlOVDMyCisJCXJzcF9sZW46MTYsCisJCXJlc2VydmVkMjoxNjsKK30gUE9TVFBBQ0s7CisKKyNkZWZpbmUgSFRUX1dESV9JUEFfT1BfUkVTUE9OU0VfU1ogICAgICAgICAgICAgICAgICAgIDgJLyogYnl0ZXMgKi8KKworI2RlZmluZSBIVFRfV0RJX0lQQV9PUF9SRVNQT05TRV9PUF9DT0RFX00gICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIVFRfV0RJX0lQQV9PUF9SRVNQT05TRV9PUF9DT0RFX1MgICAgICAgICAgICAgMTYKKworI2RlZmluZSBIVFRfV0RJX0lQQV9PUF9SRVNQT05TRV9SU1BfTEVOX00gICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBIVFRfV0RJX0lQQV9PUF9SRVNQT05TRV9SU1BfTEVOX1MgICAgICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9XRElfSVBBX09QX1JFU1BPTlNFX09QX0NPREVfR0VUKF92YXIpCQkJXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfT1BfUkVTUE9OU0VfT1BfQ09ERV9NKSA+PgkJXAorCUhUVF9XRElfSVBBX09QX1JFU1BPTlNFX09QX0NPREVfUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfT1BfUkVTUE9OU0VfT1BfQ09ERV9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9PUF9SRVNQT05TRV9PUF9DT0RFLCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfT1BfUkVTUE9OU0VfT1BfQ09ERV9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9XRElfSVBBX09QX1JFU1BPTlNFX1JTUF9MRU5fR0VUKF92YXIpCQkJXAorCSgoKF92YXIpICYgSFRUX1dESV9JUEFfT1BfUkVTUE9OU0VfUlNQX0xFTl9NKSA+PgkJXAorCUhUVF9XRElfSVBBX09QX1JFU1BPTlNFX1JTUF9MRU5fUykKKyNkZWZpbmUgSFRUX1dESV9JUEFfT1BfUkVTUE9OU0VfUlNQX0xFTl9TRVQoX3ZhciwgX3ZhbCkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfV0RJX0lQQV9PUF9SRVNQT05TRV9SU1BfTEVOLCBfdmFsKTsgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1dESV9JUEFfT1BfUkVTUE9OU0VfUlNQX0xFTl9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisKK2VudW0gaHR0X3BoeV9tb2RlIHsKKwlodHRfcGh5X21vZGVfMTFhID0gMCwKKwlodHRfcGh5X21vZGVfMTFnID0gMSwKKwlodHRfcGh5X21vZGVfMTFiID0gMiwKKwlodHRfcGh5X21vZGVfMTFnX29ubHkgPSAzLAorCWh0dF9waHlfbW9kZV8xMW5hX2h0MjAgPSA0LAorCWh0dF9waHlfbW9kZV8xMW5nX2h0MjAgPSA1LAorCWh0dF9waHlfbW9kZV8xMW5hX2h0NDAgPSA2LAorCWh0dF9waHlfbW9kZV8xMW5nX2h0NDAgPSA3LAorCWh0dF9waHlfbW9kZV8xMWFjX3ZodDIwID0gOCwKKwlodHRfcGh5X21vZGVfMTFhY192aHQ0MCA9IDksCisJaHR0X3BoeV9tb2RlXzExYWNfdmh0ODAgPSAxMCwKKwlodHRfcGh5X21vZGVfMTFhY192aHQyMF8yZyA9IDExLAorCWh0dF9waHlfbW9kZV8xMWFjX3ZodDQwXzJnID0gMTIsCisJaHR0X3BoeV9tb2RlXzExYWNfdmh0ODBfMmcgPSAxMywKKwlodHRfcGh5X21vZGVfMTFhY192aHQ4MF84MCA9IDE0LAkvKiA4MCs4MCAqLworCWh0dF9waHlfbW9kZV8xMWFjX3ZodDE2MCA9IDE1LAorCisJaHR0X3BoeV9tb2RlX21heCwKK307CisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IEhUVCBjaGFubmVsIGNoYW5nZSBpbmRpY2F0aW9uCisgKiBAZGV0YWlscworICogIFNwZWNpZnkgd2hlbiBhIGNoYW5uZWwgY2hhbmdlIG9jY3Vycy4KKyAqICBUaGlzIGFsbG93cyB0aGUgaG9zdCB0byBwcmVjaXNlbHkgZGV0ZXJtaW5lIHdoaWNoIHJ4IGZyYW1lcyBhcnJpdmVkCisgKiAgb24gdGhlIG9sZCBjaGFubmVsIGFuZCB3aGljaCByeCBmcmFtZXMgYXJyaXZlZCBvbiB0aGUgbmV3IGNoYW5uZWwuCisgKgorICp8MzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHw3ICAgICAgIDAgfAorICp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tfAorICp8ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgIHwgbXNnIHR5cGUgfAorICp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICp8ICAgICAgICAgICAgICBwcmltYXJ5X2NoYW5fY2VudGVyX2ZyZXFfbWh6ICAgICAgICAgICAgfAorICp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICp8ICAgICAgICAgICAgY29udGlndW91c19jaGFuMV9jZW50ZXJfZnJlcV9taHogICAgICAgICAgfAorICp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICp8ICAgICAgICAgICAgY29udGlndW91c19jaGFuMl9jZW50ZXJfZnJlcV9taHogICAgICAgICAgfAorICp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICp8ICAgICAgICAgICAgICAgICAgICAgICAgcGh5X21vZGUgICAgICAgICAgICAgICAgICAgICAgfAorICp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICoKKyAqIEhlYWRlciBmaWVsZHM6CisgKiAgIC0gTVNHX1RZUEUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgdGhpcyBhcyBhIGh0dCBjaGFubmVsIGNoYW5nZSBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqICAgICBWYWx1ZTogMHgxNQorICogICAtIFBSSU1BUllfQ0hBTl9DRU5URVJfRlJFUV9NSFoKKyAqICAgICBCaXRzIDMxOjAKKyAqICAgICBQdXJwb3NlOiBpZGVudGlmeSB0aGUgKGNlbnRlciBvZiB0aGUpIG5ldyAyMCBNSHogcHJpbWFyeSBjaGFubmVsCisgKiAgICAgVmFsdWU6IGNlbnRlciBmcmVxdWVuY3kgb2YgdGhlIDIwIE1IeiBwcmltYXJ5IGNoYW5uZWwsIGluIE1IeiB1bml0cworICogICAtIENPTlRJR19DSEFOMV9DRU5URVJfRlJFUV9NSFoKKyAqICAgICBCaXRzIDMxOjAKKyAqICAgICBQdXJwb3NlOiBpZGVudGlmeSB0aGUgKGNlbnRlciBvZiB0aGUpIGNvbnRpZ3VvdXMgZnJlcXVlbmN5IHJhbmdlCisgKiAgICAgICAgIGNvbXByaXNpbmcgdGhlIG5ldyBjaGFubmVsLgorICogICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIG5ldyBjaGFubmVsIGlzIGEgODAgTUh6IGNoYW5uZWwgZXh0ZW5kaW5nCisgKiAgICAgICAgIDYwIE1IeiBiZXlvbmQgdGhlIHByaW1hcnkgY2hhbm5lbCwgdGhpcyBmaWVsZCB3b3VsZCBiZSAzMCBsYXJnZXIKKyAqICAgICAgICAgdGhhbiB0aGUgcHJpbWFyeSBjaGFubmVsIGNlbnRlciBmcmVxdWVuY3kgZmllbGQuCisgKiAgICAgVmFsdWU6IGNlbnRlciBmcmVxdWVuY3kgb2YgdGhlIGNvbnRpZ3VvdXMgZnJlcXVlbmN5IHJhbmdlIGNvbXByaXNpbmcKKyAqICAgICAgICAgdGhlIGZ1bGwgY2hhbm5lbCBpbiBNSHogdW5pdHMKKyAqICAgICAgICAgKDgwKzgwIGNoYW5uZWxzIGFsc28gdXNlIHRoZSBDT05USUdfQ0hBTjIgZmllbGQpCisgKiAgIC0gQ09OVElHX0NIQU4yX0NFTlRFUl9GUkVRX01IWgorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IElkZW50aWZ5IHRoZSAoY2VudGVyIG9mIHRoZSkgODAgTUh6IGV4dGVuc2lvbiBmcmVxdWVuY3kgcmFuZ2UKKyAqICAgICAgICAgd2l0aGluIGEgVkhUIDgwKzgwIGNoYW5uZWwuCisgKiAgICAgICAgIFRoaXMgZmllbGQgaXMgb25seSByZWxldmFudCBmb3IgVkhUIDgwKzgwIGNoYW5uZWxzLgorICogICAgIFZhbHVlOiBjZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSA4MCBNSHogZXh0ZW5zaW9uIGNoYW5uZWwgaW4gYSBWSFQgODArODAKKyAqICAgICAgICAgY2hhbm5lbCAoYXJiaXRyYXJ5IHZhbHVlIGZvciBjYXNlcyBiZXNpZGVzIFZIVCA4MCs4MCkKKyAqICAgLSBQSFlfTU9ERQorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IHNwZWNpZnkgdGhlIFBIWSBjaGFubmVsJ3MgdHlwZSAobGVnYWN5IHZzLiBIVCB2cy4gVkhUKSwgd2lkdGgsCisgKiAgICAgICAgIGFuZCBiYW5kCisgKiAgICAgVmFsdWU6IGh0dF9waHlfbW9kZSBlbnVtIHZhbHVlCisgKi8KKworUFJFUEFDSyBzdHJ1Y3QgaHR0X2NoYW5fY2hhbmdlX3QgeworCS8qIERXT1JEIDA6IGZsYWdzIGFuZCBtZXRhLWRhdGEgKi8KKwlBX1VJTlQzMiBtc2dfdHlwZTo4LAkvKiBIVFRfVDJIX01TR19UWVBFX1dESV9JUEFfT1BfUkVTUE9OU0UgKi8KKwlyZXNlcnZlZDE6MjQ7CisJQV9VSU5UMzIgcHJpbWFyeV9jaGFuX2NlbnRlcl9mcmVxX21oejsKKwlBX1VJTlQzMiBjb250aWdfY2hhbjFfY2VudGVyX2ZyZXFfbWh6OworCUFfVUlOVDMyIGNvbnRpZ19jaGFuMl9jZW50ZXJfZnJlcV9taHo7CisJQV9VSU5UMzIgcGh5X21vZGU7Cit9IFBPU1RQQUNLOworCisjZGVmaW5lIEhUVF9DSEFOX0NIQU5HRV9QUklNQVJZX0NIQU5fQ0VOVEVSX0ZSRVFfTUhaX00gIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX0NIQU5fQ0hBTkdFX1BSSU1BUllfQ0hBTl9DRU5URVJfRlJFUV9NSFpfUyAgMAorI2RlZmluZSBIVFRfQ0hBTl9DSEFOR0VfQ09OVElHX0NIQU4xX0NFTlRFUl9GUkVRX01IWl9NICAweGZmZmZmZmZmCisjZGVmaW5lIEhUVF9DSEFOX0NIQU5HRV9DT05USUdfQ0hBTjFfQ0VOVEVSX0ZSRVFfTUhaX1MgIDAKKyNkZWZpbmUgSFRUX0NIQU5fQ0hBTkdFX0NPTlRJR19DSEFOMl9DRU5URVJfRlJFUV9NSFpfTSAgMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfQ0hBTl9DSEFOR0VfQ09OVElHX0NIQU4yX0NFTlRFUl9GUkVRX01IWl9TICAwCisjZGVmaW5lIEhUVF9DSEFOX0NIQU5HRV9QSFlfTU9ERV9NICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX0NIQU5fQ0hBTkdFX1BIWV9NT0RFX1MgICAgICAgICAgICAgICAgICAgICAgMAorCisKKyNkZWZpbmUgSFRUX0NIQU5fQ0hBTkdFX1BSSU1BUllfQ0hBTl9DRU5URVJfRlJFUV9NSFpfU0VUKHdvcmQsIHZhbHVlKQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoCQkJCVwKKwlIVFRfQ0hBTl9DSEFOR0VfUFJJTUFSWV9DSEFOX0NFTlRFUl9GUkVRX01IWiwgdmFsdWUpOwlcCisJKHdvcmQpIHw9ICh2YWx1ZSkgIDw8CQkJXAorCUhUVF9DSEFOX0NIQU5HRV9QUklNQVJZX0NIQU5fQ0VOVEVSX0ZSRVFfTUhaX1M7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9DSEFOX0NIQU5HRV9QUklNQVJZX0NIQU5fQ0VOVEVSX0ZSRVFfTUhaX0dFVCh3b3JkKQkJXAorCSgoKHdvcmQpICYgSFRUX0NIQU5fQ0hBTkdFX1BSSU1BUllfQ0hBTl9DRU5URVJfRlJFUV9NSFpfTSkJXAorCSA+PiBIVFRfQ0hBTl9DSEFOR0VfUFJJTUFSWV9DSEFOX0NFTlRFUl9GUkVRX01IWl9TKQorCisjZGVmaW5lIEhUVF9DSEFOX0NIQU5HRV9DT05USUdfQ0hBTjFfQ0VOVEVSX0ZSRVFfTUhaX1NFVCh3b3JkLCB2YWx1ZSkJXAorZG8gewkJCQkJCQkJXAorCUhUVF9DSEVDS19TRVRfVkFMKAkJCQlcCisJSFRUX0NIQU5fQ0hBTkdFX0NPTlRJR19DSEFOMV9DRU5URVJfRlJFUV9NSFosIHZhbHVlKTsJXAorCSh3b3JkKSB8PSAodmFsdWUpICA8PAkJCVwKKwlIVFRfQ0hBTl9DSEFOR0VfQ09OVElHX0NIQU4xX0NFTlRFUl9GUkVRX01IWl9TOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBIVFRfQ0hBTl9DSEFOR0VfQ09OVElHX0NIQU4xX0NFTlRFUl9GUkVRX01IWl9HRVQod29yZCkJCVwKKwkoKCh3b3JkKSAmIEhUVF9DSEFOX0NIQU5HRV9DT05USUdfQ0hBTjFfQ0VOVEVSX0ZSRVFfTUhaX00pCVwKKwkgPj4gSFRUX0NIQU5fQ0hBTkdFX0NPTlRJR19DSEFOMV9DRU5URVJfRlJFUV9NSFpfUykKKworI2RlZmluZSBIVFRfQ0hBTl9DSEFOR0VfQ09OVElHX0NIQU4yX0NFTlRFUl9GUkVRX01IWl9TRVQod29yZCwgdmFsdWUpCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTCgJCQkJXAorCUhUVF9DSEFOX0NIQU5HRV9DT05USUdfQ0hBTjJfQ0VOVEVSX0ZSRVFfTUhaLCB2YWx1ZSk7CVwKKwkod29yZCkgfD0gKHZhbHVlKSAgPDwJCQlcCisJSFRUX0NIQU5fQ0hBTkdFX0NPTlRJR19DSEFOMl9DRU5URVJfRlJFUV9NSFpfUzsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFRUX0NIQU5fQ0hBTkdFX0NPTlRJR19DSEFOMl9DRU5URVJfRlJFUV9NSFpfR0VUKHdvcmQpCQlcCisJKCgod29yZCkgJiBIVFRfQ0hBTl9DSEFOR0VfQ09OVElHX0NIQU4yX0NFTlRFUl9GUkVRX01IWl9NKQlcCisJID4+IEhUVF9DSEFOX0NIQU5HRV9DT05USUdfQ0hBTjJfQ0VOVEVSX0ZSRVFfTUhaX1MpCisKKyNkZWZpbmUgSFRUX0NIQU5fQ0hBTkdFX1BIWV9NT0RFX1NFVCh3b3JkLCB2YWx1ZSkJCQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0NIQU5fQ0hBTkdFX1BIWV9NT0RFLCB2YWx1ZSk7CVwKKwkod29yZCkgfD0gKHZhbHVlKSAgPDwgSFRUX0NIQU5fQ0hBTkdFX1BIWV9NT0RFX1M7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lIEhUVF9DSEFOX0NIQU5HRV9QSFlfTU9ERV9HRVQod29yZCkJXAorCSgoKHdvcmQpICYgSFRUX0NIQU5fQ0hBTkdFX1BIWV9NT0RFX00pCVwKKwkgPj4gSFRUX0NIQU5fQ0hBTkdFX1BIWV9NT0RFX1MpCisKKyNkZWZpbmUgSFRUX0NIQU5fQ0hBTkdFX0JZVEVTIHNpemVvZihzdHJ1Y3QgaHR0X2NoYW5fY2hhbmdlX3QpCisKKworLyoqCisgKiBAYnJpZWYgcnggb2ZmbG9hZCBwYWNrZXQgZXJyb3IgbWVzc2FnZQorICoKKyAqIEBkZXRhaWxzCisgKiAgSFRUX1JYX09GTERfUEtUX0VSUiBtZXNzYWdlIGlzIHNlbnQgYnkgdGFyZ2V0IHRvIGhvc3QgdG8gaW5kaWNhdGUgZXJyCisgKiAgb2YgdGFyZ2V0IHBheWxvYWQgbGlrZSBtaWMgZXJyLgorICoKKyAqICAgICB8MzEgICAgICAgICAgICAyNHwyMyAgICAgICAgICAgIDE2fDE1ICAgICAgICAgICAgIDh8NyAgICAgICAgICAgICAgMHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgdGlkICAgICAgIHwgICAgIHZkZXZfaWQgICAgfCAgbXNnX3N1Yl90eXBlICB8ICAgIG1zZ190eXBlICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICA6ICAgICAgICAgICAgICAgICAgICAoc3ViLXR5cGUgZGVwZW5kZW50IGNvbnRlbnQpICAgICAgICAgICAgICAgICAgIDoKKyAqICAgICA6LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLToKKyAqIEhlYWRlciBmaWVsZHM6CisgKiAgIC0gbXNnX3R5cGUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IElkZW50aWZpZXMgdGhpcyBhcyBIVFRfUlhfT0ZMRF9QS1RfRVJSIG1lc3NhZ2UKKyAqICAgICB2YWx1ZTogMHgxNiAoSFRUX1QySF9NU0dfVFlQRV9SWF9PRkxEX1BLVF9FUlIpCisgKiAgIC0gbXNnX3N1Yl90eXBlCisgKiAgICAgQml0cyAxNTo4CisgKiAgICAgUHVycG9zZTogSWRlbnRpZmllcyB3aGljaCB0eXBlIG9mIHJ4IGVycm9yIGlzIHJlcG9ydGVkIGJ5IHRoaXMgbWVzc2FnZQorICogICAgIHZhbHVlOiBodHRfcnhfb2ZsZF9wa3RfZXJyX3R5cGUKKyAqICAgLSB2ZGV2X2lkCisgKiAgICAgQml0cyAyMzoxNgorICogICAgIFB1cnBvc2U6IElkZW50aWZpZXMgd2hpY2ggdmRldiByZWNlaXZlZCB0aGUgZXJyb25lb3VzIHJ4IGZyYW1lCisgKiAgICAgdmFsdWU6CisgKiAgIC0gdGlkCisgKiAgICAgQml0cyAzMToyNAorICogICAgIFB1cnBvc2U6IElkZW50aWZpZXMgdGhlIHRyYWZmaWMgdHlwZSBvZiB0aGUgcnggZnJhbWUKKyAqICAgICB2YWx1ZToKKyAqCisgKiAgIC0gVGhlIHBheWxvYWQgZmllbGRzIHVzZWQgaWYgdGhlIHN1Yi10eXBlID09IE1JQyBlcnJvciBhcmUgc2hvd24gYmVsb3cuCisgKiAgICAgTm90ZSAtIE1JQyBlcnIgaXMgcGVyIE1TRFUsIHdoaWxlIFBOIGlzIHBlciBNUERVLgorICogICAgIFRoZSBGVyB3aWxsIGRpc2NhcmQgdGhlIHdob2xlIE1QRFUgaWYgYW55IE1TRFUgd2l0aGluIHRoZSBNUERVIGlzIG1hcmtlZAorICogICAgIHdpdGggTUlDIGVyciBpbiBBLU1TRFUgY2FzZSwgc28gRlcgd2lsbCBzZW5kIG9ubHkgb25lIEhUVCBtZXNzYWdlCisgKiAgICAgd2l0aCB0aGUgUE4gb2YgdGhpcyBNUERVIGF0dGFjaGVkIHRvIGluZGljYXRlIE1JQyBlcnIgZm9yIG9uZSBNUERVCisgKiAgICAgaW5zdGVhZCBvZiBzZW5kaW5nIHNlcGFyYXRlIEhUVCBtZXNzYWdlcyBmb3IgZWFjaCB3cm9uZyBNU0RVIHdpdGhpbgorICogICAgIHRoZSBNUERVLgorICoKKyAqICAgICB8MzEgICAgICAgICAgICAyNHwyMyAgICAgICAgICAgIDE2fDE1ICAgICAgICAgICAgIDh8NyAgICAgICAgICAgICAgMHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICBSc3ZkICAgICAgIHwgICAgIGtleV9pZCAgICAgfCAgICAgICAgICAgICBwZWVyX2lkICAgICAgICAgICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIgTUFDIGFkZHIgMzE6MCAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICBSc3ZkICAgICAgICAgICAgICAgfCAgICByZWNlaXZlciBNQUMgYWRkciA0NzozMiAgICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZXIgTUFDIGFkZHIgMzE6MCAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICBSc3ZkICAgICAgICAgICAgICAgfCAgICB0cmFuc21pdHRlciBNQUMgYWRkciA0NzozMiAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE4gMzE6MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICB8ICAgICAgICAgICAgICBSc3ZkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgUE4gNDc6MzIgICAgICAgICAgIHwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgLSBwZWVyX2lkCisgKiAgICAgQml0cyAxNTowCisgKiAgICAgUHVycG9zZTogaWRlbnRpZmllcyB3aGljaCBwZWVyIGlzIGZyYW1lIGlzIGZyb20KKyAqICAgICB2YWx1ZToKKyAqICAgLSBrZXlfaWQKKyAqICAgICBCaXRzIDIzOjE2CisgKiAgICAgUHVycG9zZTogaWRlbnRpZmllcyBrZXlfaWQgb2YgcnggZnJhbWUKKyAqICAgICB2YWx1ZToKKyAqICAgLSBSQV8zMV8wIChyZWNlaXZlciBNQUMgYWRkciAzMTowKQorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgYnkgTUFDIGFkZHJlc3Mgd2hpY2ggdmRldiByZWNlaXZlZCB0aGUgZnJhbWUKKyAqICAgICB2YWx1ZTogTUFDIGFkZHJlc3MgbG93ZXIgNCBieXRlcworICogICAtIFJBXzQ3XzMyIChyZWNlaXZlciBNQUMgYWRkciA0NzozMikKKyAqICAgICBCaXRzIDE1OjAKKyAqICAgICBQdXJwb3NlOiBpZGVudGlmaWVzIGJ5IE1BQyBhZGRyZXNzIHdoaWNoIHZkZXYgcmVjZWl2ZWQgdGhlIGZyYW1lCisgKiAgICAgdmFsdWU6IE1BQyBhZGRyZXNzIHVwcGVyIDIgYnl0ZXMKKyAqICAgLSBUQV8zMV8wICh0cmFuc21pdHRlciBNQUMgYWRkciAzMTowKQorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgYnkgTUFDIGFkZHJlc3Mgd2hpY2ggcGVlciB0cmFuc21pdHRlZCB0aGUgZnJhbWUKKyAqICAgICB2YWx1ZTogTUFDIGFkZHJlc3MgbG93ZXIgNCBieXRlcworICogICAtIFRBXzQ3XzMyICh0cmFuc21pdHRlciBNQUMgYWRkciA0NzozMikKKyAqICAgICBCaXRzIDE1OjAKKyAqICAgICBQdXJwb3NlOiBpZGVudGlmaWVzIGJ5IE1BQyBhZGRyZXNzIHdoaWNoIHBlZXIgdHJhbnNtaXR0ZWQgdGhlIGZyYW1lCisgKiAgICAgdmFsdWU6IE1BQyBhZGRyZXNzIHVwcGVyIDIgYnl0ZXMKKyAqICAgLSBQTl8zMV8wCisgKiAgICAgQml0cyAzMTowCisgKiAgICAgUHVycG9zZTogSWRlbnRpZmllcyBwbiBvZiByeCBmcmFtZQorICogICAgIHZhbHVlOiBQTiBsb3dlciA0IGJ5dGVzCisgKiAgIC0gUE5fNDdfMzIKKyAqICAgICBCaXRzIDE1OjAKKyAqICAgICBQdXJwb3NlOiBJZGVudGlmaWVzIHBuIG9mIHJ4IGZyYW1lCisgKiAgICAgdmFsdWU6CisgKiAgICAgICAgIFRLSVAgb3IgQ0NNUDogUE4gdXBwZXIgMiBieXRlcworICogICAgICAgICBXQVBJOiBQTiBieXRlcyA2OjUgKGJ5dGVzIDE1Ojcgbm90IGluY2x1ZGVkIGluIHRoaXMgbWVzc2FnZSkKKyAqLworCitlbnVtIGh0dF9yeF9vZmxkX3BrdF9lcnJfdHlwZSB7CisJSFRUX1JYX09GTERfUEtUX0VSUl9UWVBFX05PTkUgPSAwLAorCUhUVF9SWF9PRkxEX1BLVF9FUlJfVFlQRV9NSUNfRVJSLAorfTsKKworLyogZGVmaW5pdGlvbiBmb3IgSFRUX1JYX09GTERfUEtUX0VSUiBtc2cgaGRyICovCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfSERSX0JZVEVTIDQKKworI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01TR19TVUJfVFlQRV9NICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTVNHX1NVQl9UWVBFX1MgICAgIDgKKworI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX1ZERVZfSURfTSAgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfVkRFVl9JRF9TICAgICAgICAgIDE2CisKKyNkZWZpbmUgSFRUX1JYX09GTERfUEtUX0VSUl9USURfTSAgICAgICAgICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX1RJRF9TICAgICAgICAgICAgICAyNAorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTVNHX1NVQl9UWVBFX0dFVChfdmFyKQlcCisJKCgoX3ZhcikgJiBIVFRfUlhfT0ZMRF9QS1RfRVJSX01TR19TVUJfVFlQRV9NKQlcCisJID4+IEhUVF9SWF9PRkxEX1BLVF9FUlJfTVNHX1NVQl9UWVBFX1MpCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTVNHX1NVQl9UWVBFX1NFVChfdmFyLCBfdmFsKQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX09GTERfUEtUX0VSUl9NU0dfU1VCX1RZUEUsIF92YWwpOyBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfT0ZMRF9QS1RfRVJSX01TR19TVUJfVFlQRV9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfVkRFVl9JRF9HRVQoX3ZhcikJCQlcCisJKCgoX3ZhcikgJiBIVFRfUlhfT0ZMRF9QS1RfRVJSX1ZERVZfSURfTSkgPj4JCVwKKwlIVFRfUlhfT0ZMRF9QS1RfRVJSX1ZERVZfSURfUykKKyNkZWZpbmUgSFRUX1JYX09GTERfUEtUX0VSUl9WREVWX0lEX1NFVChfdmFyLCBfdmFsKQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX09GTERfUEtUX0VSUl9WREVWX0lELCBfdmFsKTsJXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX09GTERfUEtUX0VSUl9WREVWX0lEX1MpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1JYX09GTERfUEtUX0VSUl9USURfR0VUKF92YXIpCQkJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9PRkxEX1BLVF9FUlJfVElEX00pID4+IEhUVF9SWF9PRkxEX1BLVF9FUlJfVElEX1MpCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfVElEX1NFVChfdmFyLCBfdmFsKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfT0ZMRF9QS1RfRVJSX1RJRCwgX3ZhbCk7CVwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9SWF9PRkxEX1BLVF9FUlJfVElEX1MpKTsJXAorCX0gd2hpbGUgKDApCisKKy8qIGRlZmluaXRpb24gZm9yIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUiBtc2cgc3ViLXR5cGUgcGF5bG9hZCAqLworI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfQllURVMgICAyOAorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9QRUVSX0lEX00gICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUEVFUl9JRF9TICAgICAgICAgIDAKKworI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfS0VZSURfTSAgICAgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX0tFWUlEX1MgICAgICAgICAgICAxNgorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9SQV8zMV8wX00gICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUkFfMzFfMF9TICAgICAgICAgIDAKKworI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUkFfNDdfMzJfTSAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1JBXzQ3XzMyX1MgICAgICAgICAwCisKKyNkZWZpbmUgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1RBXzMxXzBfTSAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9UQV8zMV8wX1MgICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9UQV80N18zMl9NICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfVEFfNDdfMzJfUyAgICAgICAgIDAKKworI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUE5fMzFfMF9NICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1BOXzMxXzBfUyAgICAgICAgICAwCisKKyNkZWZpbmUgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1BOXzQ3XzMyX00gICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9QTl80N18zMl9TICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9QRUVSX0lEX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1BFRVJfSURfTSkgPj4JXAorCSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUEVFUl9JRF9TKQorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUEVFUl9JRF9TRVQoX3ZhciwgX3ZhbCkJCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUEVFUl9JRCwgX3ZhbCk7IFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1BFRVJfSURfUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9LRVlJRF9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9LRVlJRF9NKSA+PglcCisJIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9LRVlJRF9TKQorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfS0VZSURfU0VUKF92YXIsIF92YWwpCQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX0tFWUlELCBfdmFsKTsgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfS0VZSURfUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9SQV8zMV8wX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1JBXzMxXzBfTSkgPj4JXAorCSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUkFfMzFfMF9TKQorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUkFfMzFfMF9TRVQoX3ZhciwgX3ZhbCkJCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUkFfMzFfMCwgX3ZhbCk7IFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1JBXzMxXzBfUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9SQV80N18zMl9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9SQV80N18zMl9NKSA+PglcCisJIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9SQV80N18zMl9TKQorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUkFfNDdfMzJfU0VUKF92YXIsIF92YWwpCQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1JBXzQ3XzMyLCBfdmFsKTsgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUkFfNDdfMzJfUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9UQV8zMV8wX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1RBXzMxXzBfTSkgPj4JXAorCSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfVEFfMzFfMF9TKQorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfVEFfMzFfMF9TRVQoX3ZhciwgX3ZhbCkJCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfVEFfMzFfMCwgX3ZhbCk7IFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1RBXzMxXzBfUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9UQV80N18zMl9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9UQV80N18zMl9NKSA+PglcCisJIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9UQV80N18zMl9TKQorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfVEFfNDdfMzJfU0VUKF92YXIsIF92YWwpCQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1RBXzQ3XzMyLCBfdmFsKTsgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfVEFfNDdfMzJfUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9QTl8zMV8wX0dFVChfdmFyKQkJXAorCSgoKF92YXIpICYgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1BOXzMxXzBfTSkgPj4JXAorCSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUE5fMzFfMF9TKQorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUE5fMzFfMF9TRVQoX3ZhciwgX3ZhbCkJCVwKK2RvIHsJCQkJCQkJCVwKKwlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUE5fMzFfMCwgX3ZhbCk7IFwKKwkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1BOXzMxXzBfUykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9QTl80N18zMl9HRVQoX3ZhcikJCVwKKwkoKChfdmFyKSAmIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9QTl80N18zMl9NKSA+PglcCisJIEhUVF9SWF9PRkxEX1BLVF9FUlJfTUlDX0VSUl9QTl80N18zMl9TKQorI2RlZmluZSBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUE5fNDdfMzJfU0VUKF92YXIsIF92YWwpCQlcCitkbyB7CQkJCQkJCQlcCisJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1JYX09GTERfUEtUX0VSUl9NSUNfRVJSX1BOXzQ3XzMyLCBfdmFsKTsgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUlhfT0ZMRF9QS1RfRVJSX01JQ19FUlJfUE5fNDdfMzJfUykpOyBcCit9IHdoaWxlICgwKQorCisvKioKKyAqIEBicmllZiBwZWVyIHJhdGUgcmVwb3J0IG1lc3NhZ2UKKyAqCisgKiBAZGV0YWlscworICogIEhUVF9UMkhfTVNHX1RZUEVfUkFURV9SRVBPUlQgbWVzc2FnZSBpcyBzZW50IGJ5IHRhcmdldCB0byBob3N0IHRvIGluZGljYXRlIHRoZQorICogIGp1c3RpZmllZCByYXRlIG9mIGFsbCB0aGUgcGVlcnMuCisgKgorICogICAgIHwzMSAgICAgICAgICAgIDI0fDIzICAgICAgICAgICAgMTZ8MTUgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgICAwfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgIHBlZXJfY291bnQgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgbXNnX3R5cGUgICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIDogICAgICAgICAgICBQYXlsb2FkICh2YXJpYW50IG51bWJlciBvZiBwZWVyIHJhdGUgcmVwb3J0KSAgICAgICAgICAgOgorICogICAgIDotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtOgorICogSGVhZGVyIGZpZWxkczoKKyAqICAgLSBtc2dfdHlwZQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogSWRlbnRpZmllcyB0aGlzIGFzIEhUVF9UMkhfTVNHX1RZUEVfUkFURV9SRVBPUlQgbWVzc2FnZS4KKyAqICAgICB2YWx1ZTogMHgxNyAoSFRUX1QySF9NU0dfVFlQRV9SQVRFX1JFUE9SVCkKKyAqICAgLSByZXNlcnZlZAorICogICAgIEJpdHMgMTU6OAorICogICAgIFB1cnBvc2U6CisgKiAgICAgdmFsdWU6CisgKiAgIC0gcGVlcl9jb3VudAorICogICAgIEJpdHMgMzE6MTYKKyAqICAgICBQdXJwb3NlOiBTcGVjaWZ5IGhvdyBtYW55IHBlZXIgcmF0ZSByZXBvcnQgZWxlbWVudHMgYXJlIHByZXNlbnQgaW4gdGhlIHBheWxvYWQuCisgKiAgICAgdmFsdWU6CisgKgorICAqIFBheWxvYWQ6CisgKiAgICAgVGhlcmUgYXJlIHZhcmlhbnQgbnVtYmVyIG9mIHBlZXIgcmF0ZSByZXBvcnQgZm9sbG93IHRoZSBmaXJzdCAzMiBiaXRzLgorICogICAgIFRoZSBwZWVyIHJhdGUgcmVwb3J0IGlzIGRlZmluZWQgYXMgZm9sbG93cy4KKyAqCisgKiAgICAgfDMxICAgICAgICAgICAgICAgICAgIDIwfDE5ICAgICAxNnwxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB8CisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LQorICogICAgIHwgICAgICAgIHJlc2VydmVkICAgICAgIHwgICBwaHkgICB8ICAgICAgICAgICAgIHBlZXJfaWQgICAgICAgICAgICAgfCBcCisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAtPiByZXBvcnQgIzAKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLworICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0KKyAqICAgICB8ICAgICAgICByZXNlcnZlZCAgICAgICB8ICAgcGh5ICAgfCAgICAgICAgICAgICBwZWVyX2lkICAgICAgICAgICAgIHwgXAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgLT4gcmVwb3J0ICMxCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC8KKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtCisgKiAgICAgfCAgICAgICAgcmVzZXJ2ZWQgICAgICAgfCAgIHBoeSAgIHwgICAgICAgICAgICAgcGVlcl9pZCAgICAgICAgICAgICB8IFwKKyAqICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgIC0+IHJlcG9ydCAjMgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAvCisgKiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LQorICogICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICogICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICogICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICogICAgIDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOgorICoKKyAqICAgLSBwZWVyX2lkCisgKiAgICAgQml0cyAxNTowCisgKiAgICAgUHVycG9zZTogaWRlbnRpZnkgdGhlIHBlZXIKKyAqICAgICB2YWx1ZToKKyAqICAgLSBwaHkKKyAqICAgICBCaXRzIDE5OjE2CisgKiAgICAgUHVycG9zZTogaWRlbnRpZnkgd2hpY2ggcGh5IGlzIGluIHVzZQorICogICAgIHZhbHVlOiAwPTExYiwgMT0xMWEvZywgMj0xMW4sIDM9MTFhYy4KKyAqICAgICAgICAgUGxlYXNlIHNlZSBlbnVtIGh0dF9wZWVyX3JlcG9ydF9waHlfdHlwZSBmb3IgZGV0YWlsLgorICogICAtIHJlc2VydmVkCisgKiAgICAgQml0cyAzMToyMAorICogICAgIFB1cnBvc2U6CisgKiAgICAgdmFsdWU6CisgKiAgIC0gcmF0ZQorICogICAgIEJpdHMgMzE6MAorICogICAgIFB1cnBvc2U6IHJlcHJlc2VudCB0aGUganVzdGlmaWVkIHJhdGUgb2YgdGhlIHBlZXIgc3BlY2lmaWVkIGJ5IHBlZXJfaWQKKyAqICAgICB2YWx1ZToKKyAqLworCitlbnVtIGh0dF9wZWVyX3JhdGVfcmVwb3J0X3BoeV90eXBlIHsKKwlIVFRfUEVFUl9SQVRFX1JFUE9SVF8xMUIgPSAwLAorCUhUVF9QRUVSX1JBVEVfUkVQT1JUXzExQV9HLAorCUhUVF9QRUVSX1JBVEVfUkVQT1JUXzExTiwKKwlIVFRfUEVFUl9SQVRFX1JFUE9SVF8xMUFDLAorfTsKKworI2RlZmluZSBIVFRfUEVFUl9SQVRFX1JFUE9SVF9TSVpFICAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBIVFRfUEVFUl9SQVRFX1JFUE9SVF9NU0dfUEVFUl9DT1VOVF9NICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BFRVJfQ09VTlRfUyAgICAxNgorCisjZGVmaW5lIEhUVF9QRUVSX1JBVEVfUkVQT1JUX01TR19QRUVSX0lEX00gICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBIVFRfUEVFUl9SQVRFX1JFUE9SVF9NU0dfUEVFUl9JRF9TICAgICAgIDAKKworI2RlZmluZSBIVFRfUEVFUl9SQVRFX1JFUE9SVF9NU0dfUEhZX00gICAgICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BIWV9TICAgICAgICAgICAxNgorCisjZGVmaW5lIEhUVF9QRUVSX1JBVEVfUkVQT1JUX01TR19QRUVSX0NPVU5UX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfUEVFUl9SQVRFX1JFUE9SVF9NU0dfUEVFUl9DT1VOVF9NKSBcCisJPj4gSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BFRVJfQ09VTlRfUykKKyNkZWZpbmUgSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BFRVJfQ09VTlRfU0VUKF92YXIsIF92YWwpIFwKKwlkbyB7CQkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BFRVJfQ09VTlQsIF92YWwpOyAgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BFRVJfQ09VTlRfUykpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfUEVFUl9SQVRFX1JFUE9SVF9NU0dfUEVFUl9JRF9HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BFRVJfSURfTSkgXAorCT4+IEhUVF9QRUVSX1JBVEVfUkVQT1JUX01TR19QRUVSX0lEX1MpCisjZGVmaW5lIEhUVF9QRUVSX1JBVEVfUkVQT1JUX01TR19QRUVSX0lEX1NFVChfdmFyLCBfdmFsKSBcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9QRUVSX1JBVEVfUkVQT1JUX01TR19QRUVSX0lELCBfdmFsKTsgIFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9QRUVSX1JBVEVfUkVQT1JUX01TR19QRUVSX0lEX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BIWV9HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BIWV9NKSBcCisJPj4gSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BIWV9TKQorI2RlZmluZSBIVFRfUEVFUl9SQVRFX1JFUE9SVF9NU0dfUEhZX1NFVChfdmFyLCBfdmFsKSBcCisJZG8gewkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX1BFRVJfUkFURV9SRVBPUlRfTVNHX1BIWSwgX3ZhbCk7ICBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfUEVFUl9SQVRFX1JFUE9SVF9NU0dfUEhZX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKy8qKgorICogQGJyaWVmIEhUVF9UMkhfTVNHX1RZUEVfRkxPV19QT09MX01BUCBNZXNzYWdlCisgKgorICogQGRldGFpbHMKKyAqICBIVFRfVDJIX01TR19UWVBFX0ZMT1dfUE9PTF9NQVAgbWVzc2FnZSBpcyBzZW50IGJ5IHRoZSB0YXJnZXQgd2hlbiBzZXR0aW5nIHVwCisgKiAgYSBmbG93IG9mIGRlc2NyaXB0b3JzLgorICoKKyAqICBUaGlzIG1lc3NhZ2UgaXMgaW4gVExWIGZvcm1hdCBhbmQgaW5kaWNhdGVzIHRoZSBwYXJhbWV0ZXJzIHRvIGJlIHNldHVwIGEKKyAqICBmbG93IGluIHRoZSBob3N0LiBFYWNoIGVudHJ5IGluZGljYXRlcyB0aGF0IGEgcGFydGljdWxhciBmbG93IElEIGlzIHJlYWR5IHRvCisgKiAgcmVjZWl2ZSBkZXNjcmlwdG9ycyBmcm9tIGEgc3BlY2lmaWVkIHBvb2wuCisgKgorICogIFRoZSBtZXNzYWdlIHdvdWxkIGFwcGVhciBhcyBmb2xsb3dzOgorICoKKyAqICAgICAgICAgfDMxICAgICAgICAgICAgMjR8MjMgICAgICAgICAgICAxNnwxNSAgICAgICAgICAgICA4fDcgICAgICAgICAgICAgIDB8CisgKiAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tfAorICogaGVhZGVyICB8ICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgfCAgIG51bV9mbG93cyAgICB8ICAgICBtc2dfdHlwZSAgIHwKKyAqICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICoKKyAqIFRoZSBoZWFkZXIgZmllbGQgaXMgb25lIERXT1JEIGxvbmcgYW5kIGlzIGludGVycHJldGVkIGFzIGZvbGxvd3M6CisgKiBiJzA6NyAgIC0gbXNnX3R5cGU6ICBUaGlzIHdpbGwgYmUgc2V0IHRvIEhUVF9UMkhfTVNHX1RZUEVfRkxPV19QT09MX01BUAorICogYic4LTE1ICAtIG51bV9mbG93czogVGhpcyB3aWxsIGluZGljYXRlIHRoZSBudW1iZXIgb2YgZmxvd3MgYmVpbmcgc2V0dXAgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWVzc2FnZQorICogYicxNi0zMSAtIHJlc2VydmVkOiAgVGhlc2UgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAqCisgKiBQYXlsb2FkOgorICogVGhlIHBheWxvYWQgd291bGQgY29udGFpbiBtdWx0aXBsZSBvYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLiBFYWNoCisgKiBvYmplY3QgcmVwcmVzZW50cyBhIGZsb3cuCisgKgorICogICAgICAgICB8MzEgICAgICAgICAgICAyNHwyMyAgICAgICAgICAgIDE2fDE1ICAgICAgICAgICAgIDh8NyAgICAgICAgICAgICAgMHwKKyAqICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS18CisgKiBoZWFkZXIgIHwgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICB8ICAgbnVtX2Zsb3dzICAgIHwgICAgIG1zZ190eXBlICAgfAorICogICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHBheWxvYWQwfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd190eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgIHwgICAgICAgICAgICByZXNlcnZlZDAgICAgICAgICAgICB8ICAgICAgICAgIGZsb3dfcG9vbF9pZCAgICAgICAgICAgfAorICogICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAgICAgfCAgICAgICAgICAgIHJlc2VydmVkMSAgICAgICAgICAgIHwgICAgICAgICBmbG93X3Bvb2xfc2l6ZSAgICAgICAgICB8CisgKiAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiBwYXlsb2FkMXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgICAgICB8ICAgICAgICAgICAgcmVzZXJ2ZWQwICAgICAgICAgICAgfCAgICAgICAgICBmbG93X3Bvb2xfaWQgICAgICAgICAgIHwKKyAqICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgIHwgICAgICAgICAgICByZXNlcnZlZDEgICAgICAgICAgICB8ICAgICAgICAgZmxvd19wb29sX3NpemUgICAgICAgICAgfAorICogICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKiBFYWNoIHBheWxvYWQgaXMgNSBEV09SRFMgbG9uZyBhbmQgaXMgaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKKyAqIGR3b3JkMCAtIGInMDozMSAgLSBmbG93X3R5cGU6IFRoaXMgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgdG8gd2hpY2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmxvdyBpcyBhc3NvY2lhdGVkLiBJdCBjYW4gYmUgVkRFViwgcGVlciwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRpZCAoQUMpLiBCYXNlZCBvbiBlbnVtIGh0dF9mbG93X3R5cGUuCisgKgorICogZHdvcmQxIC0gYicwOjMxICAtIGZsb3dfaWQ6IElkZW50aWZpZXIgZm9yIHRoZSBmbG93IGNvcnJlc3BvbmRpbmcgdG8gdGhpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC4gRm9yIGZsb3dfdHlwZSB2ZGV2IGl0IGlzIHNldCB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGV2aWQsIGZvciBwZWVyIGl0IGlzIHBlZXJpZCBhbmQgZm9yIHRpZCwgaXQgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWRfbnVtLgorICoKKyAqIGR3b3JkMiAtIGInMDoxNSAgLSBmbG93X3Bvb2xfaWQ6IElkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3ItcG9vbCBiZWluZyB1c2VkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgaG9zdCBmb3IgdGhpcyBmbG93CisgKiAgICAgICAgICBiJzE2OjMxIC0gcmVzZXJ2ZWQwOiBUaGlzIGZpZWxkIGluIHJlc2VydmVkIGZvciB0aGUgZnV0dXJlLiBJbiBjYXNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSBoYXZlIGEgaGllcmFyY2hpY2FsIGltcGxlbWVudGF0aW9uIChIQ00pIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29scywgaXQgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIElEIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LXBvb2wuCisgKgorICogZHdvcmQzIC0gYicwOjE1ICAtIGZsb3dfcG9vbF9zaXplOiBTaXplIG9mIHRoZSBwb29sIGluIG51bWJlciBvZiBkZXNjcmlwdG9ycy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcnMgZm9yIHRoaXMgZmxvdyB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBmcm9tIHRoaXMgcG9vbCBpbiB0aGUgaG9zdC4KKyAqICAgICAgICAgIGInMTY6MzEgLSByZXNlcnZlZDE6IFRoaXMgZmllbGQgaW4gcmVzZXJ2ZWQgZm9yIHRoZSBmdXR1cmUuIEluIGNhc2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIGhhdmUgYSBoaWVyYXJjaGljYWwgaW1wbGVtZW50YXRpb24gb2YgcG9vbHMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgbWF4IG51bWJlciBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgaW4gdGhlIHBvb2wuIFRoZSBiJzA6MTUgY2FuIGJlIHVzZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluZGljYXRlIG1pbiBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ00gc2NoZW1lLgorICoKKyAqIGR3b3JkNCAtIGInMDozMSAgLSByZXNlcnZlZDI6IFRoaXMgZmllbGQgaW4gcmVzZXJ2ZWQgZm9yIHRoZSBmdXR1cmUuIEluIGNhc2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIGhhdmUgYSBoaWVyYXJjaGljYWwgaW1wbGVtZW50YXRpb24gb2YgcG9vbHMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiJzA6MTUgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eS1iYXNlZCBib3Jyb3dpbmcgKFBCQikgdGhyZXNob2xkIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmxvdydzIHBvb2wuIFRoZSBiJzE2OjMxIGFyZSBzdGlsbCBsZWZ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZC4KKyAqLworCitlbnVtIGh0dF9mbG93X3R5cGUgeworCUZMT1dfVFlQRV9WREVWID0gMCwKKwkvKiBJbnNlcnQgbmV3IGZsb3cgdHlwZXMgYWJvdmUgdGhpcyBsaW5lICovCit9OworCitQUkVQQUNLIHN0cnVjdCBodHRfZmxvd19wb29sX21hcF9wYXlsb2FkX3QgeworCUFfVUlOVDMyIGZsb3dfdHlwZTsKKwlBX1VJTlQzMiBmbG93X2lkOworCUFfVUlOVDMyIGZsb3dfcG9vbF9pZDoxNiwKKwkJIHJlc2VydmVkMDoxNjsKKwlBX1VJTlQzMiBmbG93X3Bvb2xfc2l6ZToxNiwKKwkJIHJlc2VydmVkMToxNjsKKwlBX1VJTlQzMiByZXNlcnZlZDI7Cit9IFBPU1RQQUNLOworCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfTUFQX0hFQURFUl9TWiAgICAoc2l6ZW9mKEFfVUlOVDMyKSkKKworI2RlZmluZSBIVFRfRkxPV19QT09MX01BUF9QQVlMT0FEX1NaICAgIFwKKwkoc2l6ZW9mKHN0cnVjdCBodHRfZmxvd19wb29sX21hcF9wYXlsb2FkX3QpKQorCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfTUFQX05VTV9GTE9XU19NICAgICAgICAgICAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfTUFQX05VTV9GTE9XU19TICAgICAgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgSFRUX0ZMT1dfUE9PTF9NQVBfRkxPV19UWVBFX00gICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX0ZMT1dfUE9PTF9NQVBfRkxPV19UWVBFX1MgICAgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBIVFRfRkxPV19QT09MX01BUF9GTE9XX0lEX00gICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfRkxPV19QT09MX01BUF9GTE9XX0lEX1MgICAgICAgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfUE9PTF9JRF9NICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfUE9PTF9JRF9TICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgSFRUX0ZMT1dfUE9PTF9NQVBfRkxPV19QT09MX1NJWkVfTSAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFRUX0ZMT1dfUE9PTF9NQVBfRkxPV19QT09MX1NJWkVfUyAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBIVFRfRkxPV19QT09MX01BUF9OVU1fRkxPV1NfR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9GTE9XX1BPT0xfTUFQX05VTV9GTE9XU19NKSA+PiBIVFRfRkxPV19QT09MX01BUF9OVU1fRkxPV1NfUykKKworI2RlZmluZSBIVFRfRkxPV19QT09MX01BUF9GTE9XX1RZUEVfR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfVFlQRV9NKSA+PiBIVFRfRkxPV19QT09MX01BUF9GTE9XX1RZUEVfUykKKworI2RlZmluZSBIVFRfRkxPV19QT09MX01BUF9GTE9XX0lEX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfRkxPV19QT09MX01BUF9GTE9XX0lEX00pID4+IEhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfSURfUykKKworI2RlZmluZSBIVFRfRkxPV19QT09MX01BUF9GTE9XX1BPT0xfSURfR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfUE9PTF9JRF9NKSA+PiBcCisJCUhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfUE9PTF9JRF9TKQorCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfUE9PTF9TSVpFX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfRkxPV19QT09MX01BUF9GTE9XX1BPT0xfU0laRV9NKSA+PiBcCisJCUhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfUE9PTF9TSVpFX1MpCisKKyNkZWZpbmUgSFRUX0ZMT1dfUE9PTF9NQVBfTlVNX0ZMT1dTX1NFVChfdmFyLCBfdmFsKSBcCisJZG8gewkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0ZMT1dfUE9PTF9NQVBfTlVNX0ZMT1dTLCBfdmFsKTsgIFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9GTE9XX1BPT0xfTUFQX05VTV9GTE9XU19TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfVFlQRV9TRVQoX3ZhciwgX3ZhbCkgXAorCWRvIHsJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfVFlQRSwgX3ZhbCk7ICBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfRkxPV19QT09MX01BUF9GTE9XX1RZUEVfUykpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIVFRfRkxPV19QT09MX01BUF9GTE9XX0lEX1NFVChfdmFyLCBfdmFsKSBcCisJZG8gewkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0ZMT1dfUE9PTF9NQVBfRkxPV19JRCwgX3ZhbCk7ICBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfRkxPV19QT09MX01BUF9GTE9XX0lEX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSFRUX0ZMT1dfUE9PTF9NQVBfRkxPV19QT09MX0lEX1NFVChfdmFyLCBfdmFsKSBcCisJZG8gewkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0ZMT1dfUE9PTF9NQVBfRkxPV19QT09MX0lELCBfdmFsKTsgIFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfUE9PTF9JRF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfTUFQX0ZMT1dfUE9PTF9TSVpFX1NFVChfdmFyLCBfdmFsKSBcCisJZG8gewkJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0ZMT1dfUE9PTF9NQVBfRkxPV19QT09MX1NJWkUsIF92YWwpOyAgXAorCQkoKF92YXIpIHw9ICgoX3ZhbCkgPDwgSFRUX0ZMT1dfUE9PTF9NQVBfRkxPV19QT09MX1NJWkVfUykpOyBcCisJfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgSFRUX1QySF9NU0dfVFlQRV9GTE9XX1BPT0xfVU5NQVAgTWVzc2FnZQorICoKKyAqIEBkZXRhaWxzCisgKiAgSFRUX1QySF9NU0dfVFlQRV9GTE9XX1BPT0xfVU5NQVAgbWVzc2FnZSBpcyBzZW50IGJ5IHRoZSB0YXJnZXQgd2hlbiB0ZWFyaW5nCisgKiAgZG93biBhIGZsb3cgb2YgZGVzY3JpcHRvcnMuCisgKiAgVGhpcyBtZXNzYWdlIGluZGljYXRlcyB0aGF0IGZvciB0aGUgZmxvdyAod2hvc2UgSUQgaXMgcHJvdmlkZWQpIGlzIHdhbnRpbmcKKyAqICB0byBzdG9wIHJlY2VpdmluZyBkZXNjcmlwdG9ycy4gVGhpcyBmbG93IElEIGNvcnJlc3BvbmRzIHRvIHRoZSBJRCBvZiB0aGUKKyAqICBwb29sIG9mIGRlc2NyaXB0b3JzIGZyb20gd2hlcmUgZGVzY3JpcHRvcnMgYXJlIGJlaW5nIGFsbG9jYXRlZCBmb3IgdGhpcworICogIGZsb3cuIFdoZW4gYSBmbG93IChhbmQgaXRzIHBvb2wpIGFyZSB1bm1hcHBlZCwgYWxsIHRoZSBjaGlsZC1wb29scyB3aWxsIGFsc28KKyAqICBiZSB1bm1hcHBlZCBieSB0aGUgaG9zdC4KKyAqCisgKiAgVGhlIG1lc3NhZ2Ugd291bGQgYXBwZWFyIGFzIGZvbGxvd3M6CisgKgorICogICAgIHwzMSAgICAgICAgICAgIDI0fDIzICAgICAgICAgICAgMTZ8MTUgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgICAwfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDAgICAgICAgICAgICAgICAgICAgIHwgICAgIG1zZ190eXBlICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICAgIHwgICAgICAgICAgICAgcmVzZXJ2ZWQxICAgICAgICAgICB8ICAgICAgICAgZmxvd19wb29sX2lkICAgICAgICAgICAgfAorICogICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICoKKyAqICBUaGUgbWVzc2FnZSBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorICogIGR3b3JkMCAtIGInMDo3ICAgLSBtc2dfdHlwZTogVGhpcyB3aWxsIGJlIHNldCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUX1QySF9NU0dfVFlQRV9GTE9XX1BPT0xfVU5NQVAKKyAqICAgICAgICAgICBiJzg6MzEgIC0gcmVzZXJ2ZWQwOiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorICoKKyAqICBkd29yZDEgLSBiJzA6MzEgIC0gZmxvd190eXBlOiBUaGlzIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgZW50aXR5IHRvIHdoaWNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmbG93IGlzIGFzc29jaWF0ZWQuIEl0IGNhbiBiZSBWREVWLCBwZWVyLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRpZCAoQUMpLiBCYXNlZCBvbiBlbnVtIGh0dF9mbG93X3R5cGUuCisgKgorICogIGR3b3JkMiAtIGInMDozMSAgLSBmbG93X2lkOiBJZGVudGlmaWVyIGZvciB0aGUgZmxvdyBjb3JyZXNwb25kaW5nIHRvIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LiBGb3IgZmxvd190eXBlIHZkZXYgaXQgaXMgc2V0IHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGV2aWQsIGZvciBwZWVyIGl0IGlzIHBlZXJpZCBhbmQgZm9yIHRpZCwgaXQgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkX251bS4KKyAqCisgKiAgZHdvcmQzIC0gYicwOjE1ICAtIGZsb3dfcG9vbF9pZDogSWRlbnRpZmllciBvZiB0aGUgZGVzY3JpcHRvci1wb29sIGJlaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgaG9zdCBmb3IgdGhpcyBmbG93CisgKiAgICAgICAgICAgYicxNjozMSAtIHJlc2VydmVkMDogVGhpcyBmaWVsZCBpbiByZXNlcnZlZCBmb3IgdGhlIGZ1dHVyZS4KKyAqCisgKi8KKworUFJFUEFDSyBzdHJ1Y3QgaHR0X2Zsb3dfcG9vbF91bm1hcF90IHsKKwlBX1VJTlQzMiBtc2dfdHlwZTo4LAorCQkgcmVzZXJ2ZWQwOjI0OworCUFfVUlOVDMyIGZsb3dfdHlwZTsKKwlBX1VJTlQzMiBmbG93X2lkOworCUFfVUlOVDMyIGZsb3dfcG9vbF9pZDoxNiwKKwkJIHJlc2VydmVkMToxNjsKK30gUE9TVFBBQ0s7CisKKyNkZWZpbmUgSFRUX0ZMT1dfUE9PTF9VTk1BUF9TWiAgKHNpemVvZihzdHJ1Y3QgaHR0X2Zsb3dfcG9vbF91bm1hcF90KSkKKworI2RlZmluZSBIVFRfRkxPV19QT09MX1VOTUFQX0ZMT1dfVFlQRV9NICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBIVFRfRkxPV19QT09MX1VOTUFQX0ZMT1dfVFlQRV9TICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19JRF9NICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19JRF9TICAgICAgICAgICAwCisKKyNkZWZpbmUgSFRUX0ZMT1dfUE9PTF9VTk1BUF9GTE9XX1BPT0xfSURfTSAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFRUX0ZMT1dfUE9PTF9VTk1BUF9GTE9XX1BPT0xfSURfUyAgICAgIDAKKworI2RlZmluZSBIVFRfRkxPV19QT09MX1VOTUFQX0ZMT1dfVFlQRV9HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX0ZMT1dfUE9PTF9VTk1BUF9GTE9XX1RZUEVfTSkgPj4gXAorCQlIVFRfRkxPV19QT09MX1VOTUFQX0ZMT1dfVFlQRV9TKQorCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19JRF9HRVQoX3ZhcikgXAorCSgoKF92YXIpICYgSFRUX0ZMT1dfUE9PTF9VTk1BUF9GTE9XX0lEX00pID4+IEhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19JRF9TKQorCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19QT09MX0lEX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBIVFRfRkxPV19QT09MX1VOTUFQX0ZMT1dfUE9PTF9JRF9NKSA+PiBcCisJCUhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19QT09MX0lEX1MpCisKKyNkZWZpbmUgSFRUX0ZMT1dfUE9PTF9VTk1BUF9GTE9XX1RZUEVfU0VUKF92YXIsIF92YWwpIFwKKwlkbyB7CQkJCQkJXAorCQlIVFRfQ0hFQ0tfU0VUX1ZBTChIVFRfRkxPV19QT09MX1VOTUFQX0ZMT1dfVFlQRSwgX3ZhbCk7ICBcCisJCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBIVFRfRkxPV19QT09MX1VOTUFQX0ZMT1dfVFlQRV9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19JRF9TRVQoX3ZhciwgX3ZhbCkgXAorCWRvIHsJCQkJCVwKKwkJSFRUX0NIRUNLX1NFVF9WQUwoSFRUX0ZMT1dfUE9PTF9VTk1BUF9GTE9XX0lELCBfdmFsKTsgIFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19JRF9TKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19QT09MX0lEX1NFVChfdmFyLCBfdmFsKSBcCisJZG8gewkJCQkJCQlcCisJCUhUVF9DSEVDS19TRVRfVkFMKEhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19QT09MX0lELCBfdmFsKTsgIFwKKwkJKChfdmFyKSB8PSAoKF92YWwpIDw8IEhUVF9GTE9XX1BPT0xfVU5NQVBfRkxPV19QT09MX0lEX1MpKTsgXAorCX0gd2hpbGUgKDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy9odHRfY29tbW9uLmggYi90YXJnZXQvaW5jL2h0dF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTlkN2MzCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy9odHRfY29tbW9uLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGZpbGUgaHR0X2NvbW1vbi5oCisgKgorICogQGRldGFpbHMgdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSBvZiBIVFQgbGF5ZXIgc2hhcmVkIGJldHdlZW4gaG9zdCBhbmQgZmlybXdhcmUKKyAqLworCisjaWZuZGVmIF9IVFRfQ09NTU9OX0hfCisjZGVmaW5lIF9IVFRfQ09NTU9OX0hfCisKK2VudW0gaHR0X3NlY190eXBlIHsKKwlodHRfc2VjX3R5cGVfbm9uZSwKKwlodHRfc2VjX3R5cGVfd2VwMTI4LAorCWh0dF9zZWNfdHlwZV93ZXAxMDQsCisJaHR0X3NlY190eXBlX3dlcDQwLAorCWh0dF9zZWNfdHlwZV90a2lwLAorCWh0dF9zZWNfdHlwZV90a2lwX25vbWljLAorCWh0dF9zZWNfdHlwZV9hZXNfY2NtcCwKKwlodHRfc2VjX3R5cGVfd2FwaSwKKwlodHRfc2VjX3R5cGVfYWVzX2NjbXBfMjU2LAorCWh0dF9zZWNfdHlwZV9hZXNfZ2NtcCwKKwlodHRfc2VjX3R5cGVfYWVzX2djbXBfMjU2LAorCisJLyoga2VlcCB0aGlzIGxhc3QhICovCisJaHR0X251bV9zZWNfdHlwZXMKK307CisKK2VudW0gaHR0X3J4X2luZF9tcGR1X3N0YXR1cyB7CisJSFRUX1JYX0lORF9NUERVX1NUQVRVU19VTktOT1dOID0gMHgwLAorCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfT0ssCisJSFRUX1JYX0lORF9NUERVX1NUQVRVU19FUlJfRkNTLAorCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfRVJSX0RVUCwKKwlIVFRfUlhfSU5EX01QRFVfU1RBVFVTX0VSUl9SRVBMQVksCisJSFRUX1JYX0lORF9NUERVX1NUQVRVU19FUlJfSU5WX1BFRVIsCisJSFRUX1JYX0lORF9NUERVX1NUQVRVU19VTkFVVEhfUEVFUiwgIC8qIG9ubHkgYWNjZXB0IEVBUE9MIGZyYW1lcyAqLworCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfT1VUX09GX1NZTkMsCisJSFRUX1JYX0lORF9NUERVX1NUQVRVU19NR01UX0NUUkwsICAgIC8qIE5vbi1kYXRhIGluIHByb21pc2NvdXMgbW9kZSAqLworCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfVEtJUF9NSUNfRVJSLAorCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfREVDUllQVF9FUlIsCisJSFRUX1JYX0lORF9NUERVX1NUQVRVU19NUERVX0xFTkdUSF9FUlIsCisJSFRUX1JYX0lORF9NUERVX1NUQVRVU19FTkNSWVBUX1JFUVVJUkVEX0VSUiwKKwlIVFRfUlhfSU5EX01QRFVfU1RBVFVTX1BSSVZBQ1lfRVJSLAorCisJLyoKKwkgKiBNSVNDOiBkaXNjYXJkIGZvciB1bnNwZWNpZmllZCByZWFzb25zLgorCSAqIExlYXZlIHRoaXMgZW51bSB2YWx1ZSBsYXN0LgorCSAqLworCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfRVJSX01JU0MgPSAweEZGCit9OworCisjZGVmaW5lIEhUVF9JTlZBTElEX1BFRVIgICAgMHhmZmZmCisjZGVmaW5lIEhUVF9JTlZBTElEX1ZERVYgICAgMHhmZgorCisjZGVmaW5lIEhUVF9OT05fUU9TX1RJRCAgICAgMTYKKyNkZWZpbmUgSFRUX0lOVkFMSURfVElEICAgICAzMQorCisjZGVmaW5lIEhUVF9UWF9FWFRfVElEX0RFRkFVTFQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRUX1RYX0VYVF9USURfTk9OX1FPU19NQ0FTVF9CQ0FTVCBIVFRfTk9OX1FPU19USUQKKyNkZWZpbmUgSFRUX1RYX0VYVF9USURfTUdNVCAgICAgICAgICAgICAgICAxNworI2RlZmluZSBIVFRfVFhfRVhUX1RJRF9JTlZBTElEICAgICAgICAgICAgIEhUVF9JTlZBTElEX1RJRAorI2RlZmluZSBIVFRfVFhfRVhUX1RJRF9OT05QQVVTRSAgICAgICAgICAgIDE5CisKKworCisjZGVmaW5lIEhUVF9UWF9MM19DS1NVTV9PRkZMT0FEICAgICAgMQorI2RlZmluZSBIVFRfVFhfTDRfQ0tTVU1fT0ZGTE9BRCAgICAgIDIKKworCisvKioKKyAqIEBicmllZiBHZW5lcmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHR4IGZyYW1lIGNvbnRlbnRzCisgKgorICogQGRldGFpbHMKKyAqIEZvciBlZmZpY2llbmN5LCB0aGUgSFRUIHBhY2tldCB0eXBlIHZhbHVlcyBjb3JyZXNwb25kCisgKiB0byB0aGUgYml0IHBvc2l0aW9ucyBvZiB0aGUgV0FMIHBhY2tldCB0eXBlIHZhbHVlcywgc28gdGhlCisgKiB0cmFuc2xhdGlvbiBpcyBhIHNpbXBsZSBzaGlmdCBvcGVyYXRpb24uCisgKiBUaGUgZXhjZXB0aW9uIGlzIHRoZSAibWdtdCIgdHlwZSwgd2hpY2ggc3BlY2lmaWVzIGZyYW1lIHBheWxvYWQKKyAqIHR5cGUgcmF0aGVyIHRoYW4gTDIgaGVhZGVyIHR5cGUuCisgKi8KK2VudW0gaHR0X3BrdF90eXBlIHsKKwlodHRfcGt0X3R5cGVfcmF3ID0gMCwKKwlodHRfcGt0X3R5cGVfbmF0aXZlX3dpZmkgPSAxLAorCWh0dF9wa3RfdHlwZV9ldGhlcm5ldCA9IDIsCisJaHR0X3BrdF90eXBlX21nbXQgPSAzLAorCWh0dF9wa3RfdHlwZV9ldGgyID0gNCwKKworCS8qIGtlZXAgdGhpcyBsYXN0ICovCisJaHR0X3BrdF9udW1fdHlwZXMKK307CisKKyNkZWZpbmUgSFRUX1RYX0hPU1RfTVNEVV9JRF9TUEFDRV9CRUdJTiAwCisjZGVmaW5lIEhUVF9UWF9JUEFfTVNEVV9JRF9TUEFDRV9CRUdJTiAgMzAwMAorI2RlZmluZSBUR1RfUlgyVFhfTVNEVV9JRF9TUEFDRV9CRUdJTiA2MDAwCisKKyNlbmRpZiAvKiBfSFRUX0NPTU1PTl9IXyAqLwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy9odHRfaXNvYy5oIGIvdGFyZ2V0L2luYy9odHRfaXNvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDkxOTIKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL2h0dF9pc29jLmgKQEAgLTAsMCArMSwxMDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIGh0dF9pc29jLmgKKyAqCisgKiBAZGV0YWlscworICogIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0YXJnZXQgLS0+IGhvc3QgbWVzc2FnZXMgdGhhdCBjb25maWd1cmUgdGhlCisgKiAgaG9zdCBkYXRhLXBhdGggU1cgd2l0aCB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIGRhdGEgdHJhbnNmZXJzCisgKiAgdG8gYW5kIGZyb20gdGhlIHRhcmdldC4KKyAqLworCisjaWZuZGVmIF9IVFRfSVNPQ19IXworI2RlZmluZSBfSFRUX0lTT0NfSF8KKworI2luY2x1ZGUgPGFfdHlwZXMuaD4gICAgICAgICAgICAvKiBBX1VJTlQzMiwgQV9VSU5UOCAqLworCisjaWZkZWYgQVRIUl9XSU5fTldGCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6NDIxNCApIC8qIGJpdCBmaWVsZCB0eXBlcyBvdGhlciB0aGFuIGludCAqLworI2VuZGlmCisKKyNpbmNsdWRlICJodHRfY29tbW9uLmgiCisKKy8qPT09IGRlZmluaXRpb25zIHRoYXQgYXBwbHkgdG8gYWxsIG1lc3NhZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBlbnVtIGh0dF9pc29jX3QyaF9tc2dfdHlwZSB7CisJLyogMHgwIHJlc2VydmVkIGZvciBWRVJTSU9OIG1lc3NhZ2UgKHByb2JhYmx5IG5vdCBuZWVkZWQpICovCisKKwkvKiBQRUVSX0lORk8gLSBzcGVjaWZ5IElEIGFuZCBwYXJhbWV0ZXJzIG9mIGEgbmV3IHBlZXIgKi8KKwlIVFRfSVNPQ19UMkhfTVNHX1RZUEVfUEVFUl9JTkZPID0gMHgxLAorCisJLyogUEVFUl9VTk1BUCAtIGRlYWxsb2NhdGUgdGhlIElEIHRoYXQgcmVmZXJzIHRvIGEgcGVlciAqLworCUhUVF9JU09DX1QySF9NU0dfVFlQRV9QRUVSX1VOTUFQID0gMHgyLAorCisJLyogQUREQkEgLSBzdGFydCByeCBhZ2dyZWdhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwZWVyLVRJRCAqLworCUhUVF9JU09DX1QySF9NU0dfVFlQRV9SWF9BRERCQSA9IDB4MywKKworCS8qIERFTEJBIC0gc3RvcCByeCBhZ2dyZWdhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwZWVyLVRJRCAqLworCUhUVF9JU09DX1QySF9NU0dfVFlQRV9SWF9ERUxCQSA9IDB4NCwKKworCS8qIFRYX0NPTVBMX0lORCAtIG92ZXItdGhlLWFpciB0eCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBmb3IgYSB0eCBmcmFtZSAqLworCUhUVF9JU09DX1QySF9NU0dfVFlQRV9UWF9DT01QTF9JTkQgPSAweDUsCisKKwkvKiBTRUNfSU5EIC0gbm90aWZpY2F0aW9uIG9mIHRoZSB0eXBlIG9mIHNlY3VyaXR5IHVzZWQgZm9yIGEgbmV3IHBlZXIgKi8KKwlIVFRfSVNPQ19UMkhfTVNHX1RZUEVfU0VDX0lORCA9IDB4NiwKKworCS8qIFBFRVJfVFhfUkVBRFkgLSB0aGUgdGFyZ2V0IGlzIHJlYWR5IHRvIHRyYW5zbWl0IHRvIGEgbmV3IHBlZXIgKi8KKwlIVFRfSVNPQ19UMkhfTVNHX1RZUEVfUEVFUl9UWF9SRUFEWSA9IDB4NywKKworCS8qIFJYX0VSUiAtIG5vdGlmaWNhdGlvbiB0aGF0IGFuIHJ4IGZyYW1lIHdhcyBkaXNjYXJkZWQgZHVlIHRvIGVycm9ycyAqLworCUhUVF9JU09DX1QySF9NU0dfVFlQRV9SWF9FUlIgPSAweDgsCisKKwkvKiBrZWVwIHRoaXMgbGFzdCAqLworCUhUVF9JU09DX1QySF9OVU1fTVNHUworfSBodHRfaXNvY190MmhfbXNnX3R5cGU7CisKKy8qCisgKiBIVFQgSVNPQyB0YXJnZXQgdG8gaG9zdCBtZXNzYWdlIHR5cGUgLQorICogc3RvcmVkIGluIGJpdHMgNzowIG9mIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBtZXNzYWdlCisgKi8KKyNkZWZpbmUgSFRUX0lTT0NfVDJIX01TR19UWVBFX00gICAgICAweGZmCisjZGVmaW5lIEhUVF9JU09DX1QySF9NU0dfVFlQRV9TICAgICAgMAorCisjZGVmaW5lIEhUVF9JU09DX1QySF9NU0dfVFlQRV9TRVQobXNnX2FkZHIsIG1zZ190eXBlKSBcCisJKCooKEFfVUlOVDggKikgbXNnX2FkZHIpID0gKG1zZ190eXBlKSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX01TR19UWVBFX0dFVChtc2dfYWRkcikgXAorCSgqKChBX1VJTlQ4ICopIG1zZ19hZGRyKSkKKworI2lmbmRlZiBJTkxJTkUKKy8qIHRhcmdldCBGVyAqLworI2RlZmluZSBJTkxJTkUgX19pbmxpbmUKKyNkZWZpbmUgSFRUX0lTT0NfSU5MSU5FX0RFRgorI2VuZGlmIC8qIElOTElORSAqLworCitzdGF0aWMgSU5MSU5FIHZvaWQKK2h0dF9pc29jX3QyaF9maWVsZF9zZXQoQV9VSU5UMzIgKm1zZ19hZGRyMzIsCisJCSAgICAgICB1bnNpZ25lZCBvZmZzZXQzMiwKKwkJICAgICAgIHVuc2lnbmVkIG1hc2ssIHVuc2lnbmVkIHNoaWZ0LCB1bnNpZ25lZCB2YWx1ZSkKK3sKKwkvKiBzYW5pdHkgY2hlY2s6IG1ha2Ugc3VyZSB0aGUgdmFsdWUgZml0cyB3aXRoaW4gdGhlIGZpZWxkICovCisJLyogY2RmX2Fzc2VydCh2YWx1ZSA8PCBzaGlmdCA9PSAodmFsdWUgPDwgc2hpZnQpIHwgbWFzayk7ICovCisKKwltc2dfYWRkcjMyICs9IG9mZnNldDMyOworCS8qIGNsZWFyIHRoZSBmaWVsZCAqLworCSptc2dfYWRkcjMyICY9IH5tYXNrOworCS8qIHdyaXRlIHRoZSBuZXcgdmFsdWUgKi8KKwkqbXNnX2FkZHIzMiB8PSAodmFsdWUgPDwgc2hpZnQpOworfQorCisjaWZkZWYgSFRUX0lTT0NfSU5MSU5FX0RFRgorI3VuZGVmIEhUVF9JU09DX0lOTElORV9ERUYKKyN1bmRlZiBJTkxJTkUKKyNlbmRpZgorCisjZGVmaW5lIEhUVF9JU09DX1QySF9GSUVMRF9HRVQobXNnX2FkZHIzMiwgb2Zmc2V0MzIsIG1hc2ssIHNoaWZ0KSBcCisJKCgoKihtc2dfYWRkcjMyICsgb2Zmc2V0MzIpKSAmIG1hc2spID4+IHNoaWZ0KQorCit0eXBlZGVmIGVudW0geworCS8qIEFTU09DIC0gInJlYWwiIHBlZXIgZnJvbSBTVEEtQVAgYXNzb2NpYXRpb24gKi8KKwlIVFRfSVNPQ19UMkhfUEVFUl9UWVBFX0FTU09DID0gMHgwLAorCisJLyogU0VMRiAtIHNlbGYtcGVlciBmb3IgdW5pY2FzdCB0eCB0byB1bmFzc29jaWF0ZWQgcGVlciAqLworCUhUVF9JU09DX1QySF9QRUVSX1RZUEVfU0VMRiA9IDB4MSwKKworCS8qIEJTU0lEIC0gcmVzZXJ2ZWQgZm9yIEZXIHVzZSBmb3IgQlQtQU1QK0lCU1MgKi8KKwlIVFRfSVNPQ19UMkhfUEVFUl9UWVBFX0JTU0lEID0gMHgyLAorCisJLyogQkNBU1QgLSBzZWxmLXBlZXIgZm9yIG11bHRpY2FzdCAvIGJyb2FkY2FzdCB0eCAqLworCUhUVF9JU09DX1QySF9QRUVSX1RZUEVfQkNBU1QgPSAweDMKK30gSFRUX0lTT0NfVDJIX1BFRVJfVFlQRV9FTlVNOworCitlbnVtIHsKKwlIVFRfSVNPQ19OT05fUU9TID0gMCwKKwlIVFRfSVNPQ19RT1MgPSAxCit9OworCitlbnVtIHsKKwlIVFRfSVNPQ19STUZfRElTQUJMRUQgPSAwLAorCUhUVF9JU09DX1JNRl9FTkFCTEVEID0gMQorfTsKKworZW51bSB7CisJSFRUX0lTT0NfVElEX01HTVQgPSA3Cit9OworCisvKj09PSBkZWZpbml0aW9ucyBmb3Igc3BlY2lmaWMgbWVzc2FnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09IFBFRVJfSU5GTyBtZXNzYWdlID09PSovCisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IHBlZXIgaW5mbyBtZXNzYWdlIGRlZmluaXRpb24KKyAqCisgKiBAZGV0YWlscworICogVGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBmb3JtYXQgb2YgdGhlIHBlZXIgaW5mbyBtZXNzYWdlIHNlbnQKKyAqIGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4gIFRoaXMgbGF5b3V0IGFzc3VtZXMgdGhlIHRhcmdldCBvcGVyYXRlcworICogYXMgbGl0dGxlLWVuZGlhbi4KKyAqCisgKiB8MzEgICAgICAgICAgMjV8MjR8MjMgICAgICAgMTh8MTd8MTZ8MTUgICAgICAxMXwxMHw5fDh8N3w2fCAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgbWdtdCBEUFUgaWR4ICB8ICBiY2FzdCBEUFUgaWR4ICB8ICAgICBEUFUgaWR4ICAgICB8ICAgICBtc2cgdHlwZSAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8IG1nbXQgRFBVIHNpZyB8YmNhc3QgRFBVIHNpZyB8ICAgICBEUFUgc2lnICAgIHwgICAgICAgcGVlciBJRCAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgIE1BQyBhZGRyIDEgICB8ICAgIE1BQyBhZGRyIDAgICB8ICAgICB2ZGV2IElEICAgICB8IHxSfCAgcGVlciB0eXBlICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgIE1BQyBhZGRyIDUgICB8ICAgIE1BQyBhZGRyIDQgICB8ICAgIE1BQyBhZGRyIDMgICB8ICAgIE1BQyBhZGRyIDIgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZmllbGQgZGVmaW5pdGlvbnMgZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiB0aGUgcGVlciBpbmZvCisgKiBtZXNzYWdlIHNlbnQgZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0LgorICoKKyAqIFdPUkQgMDoKKyAqICAgLSBNU0dfVFlQRQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogaWRlbnRpZmllcyB0aGlzIGFzIHBlZXIgaW5mbyBtZXNzYWdlCisgKiAgICAgVmFsdWU6IDB4MQorICogICAtIERQVV9JRFgKKyAqICAgICBCaXRzIDE1OjgKKyAqICAgICBQdXJwb3NlOiBzcGVjaWZ5IHRoZSBEUFUgaW5kZXggKGEuay5hLiBzZWN1cml0eSBrZXkgSUQpIHRvIHVzZSBmb3IKKyAqICAgICAgICAgdW5pY2FzdCBkYXRhIGZyYW1lcyBzZW50IHRvIHRoaXMgcGVlcgorICogICAgIFZhbHVlOiBrZXkgSUQKKyAqICAgLSBCQ0FTVF9EUFVfSURYCisgKiAgICAgQml0cyAyMzoxNgorICogICAgIFB1cnBvc2U6IHNwZWNpZnkgdGhlIERQVSBpbmRleCAoYS5rLmEuIHNlY3VyaXR5IGtleSBJRCkgdG8gdXNlIGZvcgorICogICAgICAgICBicm9hZGNhc3QgZGF0YSBmcmFtZXMgc2VudCBieSB0aGlzIChzZWxmKSBwZWVyCisgKiAgICAgVmFsdWU6IGtleSBJRAorICogICAtIE1HTVRfRFBVX0lEWAorICogICAgIEJpdHMgMzE6MjQKKyAqICAgICBQdXJwb3NlOiBzcGVjaWZ5IHRoZSBEUFUgaW5kZXggKGEuay5hLiBzZWN1cml0eSBrZXkgSUQpIHRvIHVzZSBmb3IKKyAqICAgICAgICAgdW5pY2FzdCBtYW5hZ2VtZW50IGZyYW1lcyBzZW50IGJ5IHRoaXMgKHNlbGYpIHBlZXIKKyAqICAgICBWYWx1ZToga2V5IElECisgKiBXT1JEIDE6CisgKiAgIC0gUEVFUl9JRAorICogICAgIEJpdHMgMTA6MAorICogICAgIFB1cnBvc2U6IFRoZSBJRCB0aGF0IHRoZSB0YXJnZXQgaGFzIGFsbG9jYXRlZCB0byByZWZlciB0byB0aGUgcGVlcgorICogICAtIERQVV9TSUcKKyAqICAgICBCaXRzIDE3OjExCisgKiAgICAgUHVycG9zZTogc3BlY2lmeSB0aGUgRFBVIHNpZ25hdHVyZSAoYS5rLmEuIHNlY3VyaXR5IGtleSB2YWxpZGl0eQorICogICAgICAgICBtYWdpYyBudW1iZXIpIHRvIHNwZWNpZnkgZm9yIHVuaWNhc3QgZGF0YSBmcmFtZXMgc2VudCB0byB0aGlzIHBlZXIKKyAqICAgLSBCQ0FTVF9EUFVfU0lHCisgKiAgICAgQml0cyAyNDoxOAorICogICAgIFB1cnBvc2U6IHNwZWNpZnkgdGhlIERQVSBzaWduYXR1cmUgKGEuay5hLiBzZWN1cml0eSBrZXkgdmFsaWRpdHkKKyAqICAgICAgICAgbWFnaWMgbnVtYmVyKSB0byBzcGVjaWZ5IGZvciBicm9hZGNhc3QgZGF0YSBmcmFtZXMgc2VudCBieSB0aGlzCisgKiAgICAgICAgIChzZWxmKSBwZWVyCisgKiAgIC0gTUdNVF9EUFVfU0lHCisgKiAgICAgQml0cyAzMToyNQorICogICAgIFB1cnBvc2U6IHNwZWNpZnkgdGhlIERQVSBzaWduYXR1cmUgKGEuay5hLiBzZWN1cml0eSBrZXkgdmFsaWRpdHkKKyAqICAgICAgICAgbWFnaWMgbnVtYmVyKSB0byBzcGVjaWZ5IGZvciB1bmljYXN0IG1hbmFnZW1lbnQgZnJhbWVzIHNlbnQgYnkgdGhpcworICogICAgICAgICAoc2VsZikgcGVlcgorICogV09SRCAyOgorICogICAtIFBFRVJfVFlQRQorICogICAgIEJpdHMgNTowCisgKiAgICAgUHVycG9zZTogc3BlY2lmeSB3aGV0aGVyIHRoZSBwZWVyIGluIHF1ZXN0aW9uIGlzIGEgcmVhbCBwZWVyIG9yCisgKiAgICAgICAgIG9uZSBvZiB0aGUgdHlwZXMgb2YgInNlbGYtcGVlciIgY3JlYXRlZCBmb3IgdGhlIHZkZXYKKyAqICAgICBWYWx1ZTogSFRUX0lTT0NfVDJIX1BFRVJfVFlQRSBlbnVtCisgKiAgIC0gUk1GX0VOQUJMRUQgKFIpCisgKiAgICAgQml0IDYKKyAqICAgICBQdXJwb3NlOiBzcGVjaWZ5IHdoZXRoZXIgdGhlIHBlZXIgaW4gcXVlc3Rpb24gaGFzIGVuYWJsZSByb2J1c3QKKyAqICAgICAgICAgbWFuYWdlbWVudCBmcmFtZXMsIHRvIGVuY3J5cHQgY2VydGFpbiBtYW5hZ21lbnQgZnJhbWVzCisgKiAgICAgVmFsdWU6IEhUVF9JU09DX1JNRiBlbnVtCisgKiAgICAgVmFsdWU6IEhUVF9JU09DX05PTl9RT1Mgb3IgSFRUX0lTT0NfUU9TCisgKiAgIC0gVkRFVl9JRAorICogICAgIEJpdHMgMTU6OAorICogICAgIFB1cnBvc2U6IEZvciBhIHJlYWwgcGVlciwgdGhlIHZkZXYgSUQgaW5kaWNhdGVzIHdoaWNoIHZpcnR1YWwgZGV2aWNlCisgKiAgICAgICAgIHRoZSBwZWVyIGlzIGFzc29jaWF0ZWQgd2l0aC4gIEZvciBhIHNlbGYtcGVlciwgdGhlIHZkZXYgSUQgc2hvd3MKKyAqICAgICAgICAgd2hpY2ggdmlydHVhbCBkZXZpY2UgdGhlIHNlbGYtcGVlciByZXByZXNlbnRzLgorICogICAtIE1BQ19BRERSX0wxNgorICogICAgIEJpdHMgMzE6MTYKKyAqICAgICBQdXJwb3NlOiBJZGVudGlmaWVzIHdoaWNoIHBlZXIgdGhlIHBlZXIgSUQgaXMgZm9yLgorICogICAgIFZhbHVlOiBsb3dlciAyIGJ5dGVzIG9mIHRoZSBwZWVyJ3MgTUFDIGFkZHJlc3MKKyAqICAgICAgICAgRm9yIGEgc2VsZi1wZWVyLCB0aGUgcGVlcidzIE1BQyBhZGRyZXNzIGlzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUKKyAqICAgICAgICAgdmRldiB0aGUgc2VsZi1wZWVyIHJlcHJlc2VudHMuCisgKiBXT1JEIDM6CisgKiAgIC0gTUFDX0FERFJfVTMyCisgKiAgICAgQml0cyAzMTowCisgKiAgICAgUHVycG9zZTogSWRlbnRpZmllcyB3aGljaCBwZWVyIHRoZSBwZWVyIElEIGlzIGZvci4KKyAqICAgICBWYWx1ZTogdXBwZXIgNCBieXRlcyBvZiB0aGUgcGVlcidzIE1BQyBhZGRyZXNzCisgKiAgICAgICAgIEZvciBhIHNlbGYtcGVlciwgdGhlIHBlZXIncyBNQUMgYWRkcmVzcyBpcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlCisgKiAgICAgICAgIHZkZXYgdGhlIHNlbGYtcGVlciByZXByZXNlbnRzLgorICovCit0eXBlZGVmIHN0cnVjdCBodHRfaXNvY190MmhfcGVlcl9pbmZvX3MgeworCS8qIHdvcmQgMCAqLworCUFfVUlOVDMyIG1zZ190eXBlIDogOCwgICAgLyogSFRUX0lTT0NfVDJIX01TR19UWVBFX1BFRVJfSU5GTyAqLworCQkgZHB1X2lkeCA6IDgsIGJjYXN0X2RwdV9pZHggOiA4LCBtZ210X2RwdV9pZHggOiA4OworCS8qIHdvcmQgMSAqLworCUFfVUlOVDMyIHBlZXJfaWQgOiAxMSwgZHB1X3NpZyA6IDcsIGJjYXN0X2RwdV9zaWcgOiA3LCBtZ210X2RwdV9zaWcgOiA3OworCS8qIHdvcmQgMiAqLworCUFfVUlOVDMyCisJCXBlZXJfdHlwZSA6IDYsIHJtZl9lbmFibGVkIDogMSwgcmVzZXJ2ZWQwIDogMSwgdmRldl9pZCA6IDgsIG1hY19hZGRyX2wxNiA6IDE2OworCS8qIHdvcmQgMyAqLworCUFfVUlOVDMyIG1hY19hZGRyX3UzMjsKK30gaHR0X2lzb2NfdDJoX3BlZXJfaW5mb190OworCisvKiB3b3JkIDAgKi8KKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19EUFVfSURYX09GRlNFVDMyICAgICAgICAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fRFBVX0lEWF9NICAgICAgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0RQVV9JRFhfUyAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0JDQVNUX0RQVV9JRFhfT0ZGU0VUMzIgIDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19CQ0FTVF9EUFVfSURYX00gICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fQkNBU1RfRFBVX0lEWF9TICAgICAgICAgMTYKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX01HTVRfRFBVX0lEWF9PRkZTRVQzMiAgIDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19NR01UX0RQVV9JRFhfTSAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fTUdNVF9EUFVfSURYX1MgICAgICAgICAgMjQKKworLyogd29yZCAxICovCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fUEVFUl9JRF9PRkZTRVQzMiAgICAgICAgMQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX1BFRVJfSURfTSAgICAgICAgICAgICAgIDB4MDAwMDA3ZmYKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19QRUVSX0lEX1MgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19EUFVfU0lHX09GRlNFVDMyICAgICAgICAxCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fRFBVX1NJR19NICAgICAgICAgICAgICAgMHgwMDAzZjgwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0RQVV9TSUdfUyAgICAgICAgICAgICAgIDExCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19CQ0FTVF9EUFVfU0lHX09GRlNFVDMyICAxCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fQkNBU1RfRFBVX1NJR19NICAgICAgICAgMHgwMWZjMDAwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0JDQVNUX0RQVV9TSUdfUyAgICAgICAgIDE4CisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19NR01UX0RQVV9TSUdfT0ZGU0VUMzIgICAxCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fTUdNVF9EUFVfU0lHX00gICAgICAgICAgMHhmZTAwMDAwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX01HTVRfRFBVX1NJR19TICAgICAgICAgIDI1CisKKy8qIHdvcmQgMiAqLworI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX1BFRVJfVFlQRV9PRkZTRVQzMiAgICAgIDIKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19QRUVSX1RZUEVfTSAgICAgICAgICAgICAweDAwMDAwMDNmCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fUEVFUl9UWVBFX1MgICAgICAgICAgICAgMAorCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fUk1GX0VOQUJMRURfT0ZGU0VUMzIgICAgMgorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX1JNRl9FTkFCTEVEX00gICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19STUZfRU5BQkxFRF9TICAgICAgICAgICA2CisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19WREVWX0lEX09GRlNFVDMyICAgICAgICAyCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fVkRFVl9JRF9NICAgICAgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX1ZERVZfSURfUyAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX01BQ19BRERSX0wxNl9PRkZTRVQzMiAgIDIKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19NQUNfQUREUl9MMTZfTSAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fTUFDX0FERFJfTDE2X1MgICAgICAgICAgMTYKKworLyogd29yZCAzICovCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fTUFDX0FERFJfVTMyX09GRlNFVDMyICAgMworI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX01BQ19BRERSX1UzMl9NICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19NQUNfQUREUl9VMzJfUyAgICAgICAgICAwCisKKy8qIGdlbmVyYWwgZmllbGQgYWNjZXNzIG1hY3JvcyAqLworCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fRklFTERfU0VUKGZpZWxkLCBtc2dfYWRkciwgdmFsdWUpIFwKKwlodHRfaXNvY190MmhfZmllbGRfc2V0KAkJCQkJICAgICBcCisJCSgoQV9VSU5UMzIgKikgbXNnX2FkZHIpLAkJCQkgXAorCQlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPXyAjIyBmaWVsZCAjIyBfT0ZGU0VUMzIsCQkgXAorCQlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPXyAjIyBmaWVsZCAjIyBfTSwJCQkgXAorCQlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPXyAjIyBmaWVsZCAjIyBfUywJCQkgXAorCQl2YWx1ZSkKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0ZJRUxEX0dFVChmaWVsZCwgbXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfRklFTERfR0VUKAkJCQkgICAgICBcCisJCSgoQV9VSU5UMzIgKikgbXNnX2FkZHIpLAkJCSAgXAorCQlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPXyAjIyBmaWVsZCAjIyBfT0ZGU0VUMzIsCSAgXAorCQlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPXyAjIyBmaWVsZCAjIyBfTSwJCSAgXAorCQlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPXyAjIyBmaWVsZCAjIyBfUykKKworLyogYWNjZXNzIG1hY3JvcyBmb3Igc3BlY2lmaWMgZmllbGRzICovCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19EUFVfSURYX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0ZJRUxEX1NFVChEUFVfSURYLCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fRFBVX0lEWF9HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0ZJRUxEX0dFVChEUFVfSURYLCBtc2dfYWRkcikKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0JDQVNUX0RQVV9JRFhfU0VUKG1zZ19hZGRyLCB2YWx1ZSkgXAorCUhUVF9JU09DX1QySF9QRUVSX0lORk9fRklFTERfU0VUKEJDQVNUX0RQVV9JRFgsIG1zZ19hZGRyLCB2YWx1ZSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19CQ0FTVF9EUFVfSURYX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9QRUVSX0lORk9fRklFTERfR0VUKEJDQVNUX0RQVV9JRFgsIG1zZ19hZGRyKQorCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fTUdNVF9EUFVfSURYX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0ZJRUxEX1NFVChNR01UX0RQVV9JRFgsIG1zZ19hZGRyLCB2YWx1ZSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19NR01UX0RQVV9JRFhfR0VUKG1zZ19hZGRyKSBcCisJSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19GSUVMRF9HRVQoTUdNVF9EUFVfSURYLCBtc2dfYWRkcikKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX1BFRVJfSURfU0VUKG1zZ19hZGRyLCB2YWx1ZSkgXAorCUhUVF9JU09DX1QySF9QRUVSX0lORk9fRklFTERfU0VUKFBFRVJfSUQsIG1zZ19hZGRyLCB2YWx1ZSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19QRUVSX0lEX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9QRUVSX0lORk9fRklFTERfR0VUKFBFRVJfSUQsIG1zZ19hZGRyKQorCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fRFBVX1NJR19TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19GSUVMRF9TRVQoRFBVX1NJRywgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0RQVV9TSUdfR0VUKG1zZ19hZGRyKSBcCisJSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19GSUVMRF9HRVQoRFBVX1NJRywgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19CQ0FTVF9EUFVfU0lHX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0ZJRUxEX1NFVChCQ0FTVF9EUFVfU0lHLCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fQkNBU1RfRFBVX1NJR19HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0ZJRUxEX0dFVChCQ0FTVF9EUFVfU0lHLCBtc2dfYWRkcikKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX01HTVRfRFBVX1NJR19TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19GSUVMRF9TRVQoTUdNVF9EUFVfU0lHLCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fTUdNVF9EUFVfU0lHX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9QRUVSX0lORk9fRklFTERfR0VUKE1HTVRfRFBVX1NJRywgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19QRUVSX1RZUEVfU0VUKG1zZ19hZGRyLCB2YWx1ZSkgXAorCUhUVF9JU09DX1QySF9QRUVSX0lORk9fRklFTERfU0VUKFBFRVJfVFlQRSwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX1BFRVJfVFlQRV9HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0ZJRUxEX0dFVChQRUVSX1RZUEUsIG1zZ19hZGRyKQorCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fUU9TX0NBUEFCTEVfU0VUKG1zZ19hZGRyLCB2YWx1ZSkJXAorCUhUVF9JU09DX1QySF9QRUVSX0lORk9fRklFTERfU0VUKFFPU19DQVBBQkxFLCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fUU9TX0NBUEFCTEVfR0VUKG1zZ19hZGRyKSBcCisJSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19GSUVMRF9HRVQoUU9TX0NBUEFCTEUsIG1zZ19hZGRyKQorCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fUk1GX0VOQUJMRURfU0VUKG1zZ19hZGRyLCB2YWx1ZSkJXAorCUhUVF9JU09DX1QySF9QRUVSX0lORk9fRklFTERfU0VUKFJNRl9FTkFCTEVELCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fUk1GX0VOQUJMRURfR0VUKG1zZ19hZGRyKSBcCisJSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19GSUVMRF9HRVQoUk1GX0VOQUJMRUQsIG1zZ19hZGRyKQorCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fVkRFVl9JRF9TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19GSUVMRF9TRVQoVkRFVl9JRCwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX1ZERVZfSURfR0VUKG1zZ19hZGRyKSBcCisJSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19GSUVMRF9HRVQoVkRFVl9JRCwgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19NQUNfQUREUl9MMTZfU0VUKG1zZ19hZGRyLCB2YWx1ZSkgXAorCUhUVF9JU09DX1QySF9QRUVSX0lORk9fRklFTERfU0VUKE1BQ19BRERSX0wxNiwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX01BQ19BRERSX0wxNl9HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0ZJRUxEX0dFVChNQUNfQUREUl9MMTYsIG1zZ19hZGRyKQorCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX0lORk9fTUFDX0FERFJfVTMyX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfUEVFUl9JTkZPX0ZJRUxEX1NFVChNQUNfQUREUl9VMzIsIG1zZ19hZGRyLCB2YWx1ZSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19NQUNfQUREUl9VMzJfR0VUKG1zZ19hZGRyKSBcCisJSFRUX0lTT0NfVDJIX1BFRVJfSU5GT19GSUVMRF9HRVQoTUFDX0FERFJfVTMyLCBtc2dfYWRkcikKKworLyo9PT0gUEVFUl9VTk1BUCBtZXNzYWdlID09PSovCisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IHBlZXIgdW5tYXAgbWVzc2FnZSBkZWZpbml0aW9uCisgKgorICogQGRldGFpbHMKKyAqIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyB0aGUgZm9ybWF0IG9mIHRoZSBwZWVyIHVubWFwIG1lc3NhZ2Ugc2VudAorICogZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0LiAgVGhpcyBsYXlvdXQgYXNzdW1lcyB0aGUgdGFyZ2V0IG9wZXJhdGVzCisgKiBhcyBsaXR0bGUtZW5kaWFuLgorICoKKyAqIHwzMSAgICAgICAgICAgICAgICAgICAgICAxOXwxOCAgICAgICAgICAgICAgICAgICAgICAgOHw3ICAgICAgICAgICAgICAgMHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICByZXNlcnZlZCAgICAgICAgIHwgICAgICAgICAgcGVlciBJRCAgICAgICAgIHwgICAgIG1zZyB0eXBlICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKgorICogVGhlIGZvbGxvd2luZyBmaWVsZCBkZWZpbml0aW9ucyBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSBwZWVyIGluZm8KKyAqIG1lc3NhZ2Ugc2VudCBmcm9tIHRoZSB0YXJnZXQgdG8gdGhlIGhvc3QuCisgKgorICogV09SRCAwOgorICogICAtIE1TR19UWVBFCisgKiAgICAgQml0cyA3OjAKKyAqICAgICBQdXJwb3NlOiBpZGVudGlmaWVzIHRoaXMgYXMgcGVlciB1bm1hcCBtZXNzYWdlCisgKiAgICAgVmFsdWU6IDB4MgorICogICAtIFBFRVJfSUQKKyAqICAgICBCaXRzIDE4OjgKKyAqICAgICBQdXJwb3NlOiBUaGUgSUQgdGhhdCB0aGUgdGFyZ2V0IGhhcyBhbGxvY2F0ZWQgdG8gcmVmZXIgdG8gdGhlIHBlZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaHR0X2lzb2NfdDJoX3BlZXJfdW5tYXBfcyB7CisJLyogd29yZCAwICovCisJQV9VSU5UMzIgbXNnX3R5cGUgOiA4LCAgICAvKiBIVFRfSVNPQ19UMkhfTVNHX1RZUEVfUEVFUl9VTk1BUCAqLworCQkgcGVlcl9pZCA6IDExLCByZXNlcnZlZDAgOiAxMzsKK30gaHR0X2lzb2NfdDJoX3BlZXJfdW5tYXBfdDsKKworLyogd29yZCAwICovCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX1VOTUFQX1BFRVJfSURfT0ZGU0VUMzIgICAgICAgIDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfVU5NQVBfUEVFUl9JRF9NICAgICAgICAgICAgICAgMHgwMDA3ZmYwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9VTk1BUF9QRUVSX0lEX1MgICAgICAgICAgICAgICA4CisKKy8qIGdlbmVyYWwgZmllbGQgYWNjZXNzIG1hY3JvcyAqLworCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX1VOTUFQX0ZJRUxEX1NFVChmaWVsZCwgbXNnX2FkZHIsIHZhbHVlKSBcCisJaHR0X2lzb2NfdDJoX2ZpZWxkX3NldCgJCQkJCSAgICAgIFwKKwkJKChBX1VJTlQzMiAqKSBtc2dfYWRkciksCQkJCSAgXAorCQlIVFRfSVNPQ19UMkhfUEVFUl9VTk1BUF8gIyMgZmllbGQgIyMgX09GRlNFVDMyLAkJICBcCisJCUhUVF9JU09DX1QySF9QRUVSX1VOTUFQXyAjIyBmaWVsZCAjIyBfTSwJCSAgXAorCQlIVFRfSVNPQ19UMkhfUEVFUl9VTk1BUF8gIyMgZmllbGQgIyMgX1MsCQkgIFwKKwkJdmFsdWUpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfVU5NQVBfRklFTERfR0VUKGZpZWxkLCBtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9GSUVMRF9HRVQoCQkJCSAgICAgICBcCisJCSgoQV9VSU5UMzIgKikgbXNnX2FkZHIpLAkJCSAgIFwKKwkJSFRUX0lTT0NfVDJIX1BFRVJfVU5NQVBfICMjIGZpZWxkICMjIF9PRkZTRVQzMiwJICAgXAorCQlIVFRfSVNPQ19UMkhfUEVFUl9VTk1BUF8gIyMgZmllbGQgIyMgX00sCSAgIFwKKwkJSFRUX0lTT0NfVDJIX1BFRVJfVU5NQVBfICMjIGZpZWxkICMjIF9TKQorCisvKiBhY2Nlc3MgbWFjcm9zIGZvciBzcGVjaWZpYyBmaWVsZHMgKi8KKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9VTk1BUF9QRUVSX0lEX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfUEVFUl9VTk1BUF9GSUVMRF9TRVQoUEVFUl9JRCwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9VTk1BUF9QRUVSX0lEX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9QRUVSX1VOTUFQX0ZJRUxEX0dFVChQRUVSX0lELCBtc2dfYWRkcikKKworLyo9PT0gQUREQkEgbWVzc2FnZSA9PT0qLworZW51bSB7CisJaHR0X2lzb2NfYWRkYmFfc3VjY2VzcyA9IDAsCisJLyogVEJEOiB1c2UgZGlmZmVyZW50IGZhaWx1cmUgdmFsdWVzIHRvIHNwZWNpZnkgZmFpbHVyZSBjYXVzZXM/ICovCisJaHR0X2lzb2NfYWRkYmFfZmFpbCA9IDEsCit9OworCisvKioKKyAqIEBicmllZiB0YXJnZXQgLT4gaG9zdCBBRERCQSBtZXNzYWdlIGRlZmluaXRpb24KKyAqCisgKiBAZGV0YWlscworICogVGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBmb3JtYXQgb2YgdGhlIHJ4IEFEREJBIG1lc3NhZ2Ugc2VudAorICogZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0OgorICoKKyAqIHwzMSAgICAgICAgICAgICAgICAgICAgICAyMHwxOSAgMTZ8MTUgICAgIDEyfDExICAgIDh8NyAgICAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICBwZWVyIElEICAgICAgICAgfCAgVElEIHwgICB3aW5kb3cgc2l6ZSAgIHwgICAgIG1zZyB0eXBlICAgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgfFN8ICAgICAgc3RhcnQgc2VxIG51bSAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgdGhlIEFEREJBCisgKiBtZXNzYWdlIHNlbnQgZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0LgorICoKKyAqIFdPUkQgMDoKKyAqICAgLSBNU0dfVFlQRQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogaWRlbnRpZmllcyB0aGlzIGFzIGFuIEFEREJBIG1lc3NhZ2UKKyAqICAgICBWYWx1ZTogMHgzCisgKiAgIC0gV0lOX1NJWkUKKyAqICAgICBCaXRzIDE1OjgKKyAqICAgICBQdXJwb3NlOiBTcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgYmxvY2sgYWNrIHdpbmRvdyAobWF4ID0gNjQpLgorICogICAgIFZhbHVlOgorICogICAgICAgICBibG9jayBhY2sgd2luZG93IGxlbmd0aCBzcGVjaWZpZWQgYnkgdGhlIHJlY2VpdmVkIEFEREJBCisgKiAgICAgICAgIG1hbmFnZW1lbnQgbWVzc2FnZS4KKyAqICAgLSBUSUQKKyAqICAgICBCaXRzIDE5OjE2CisgKiAgICAgUHVycG9zZTogU3BlY2lmaWVzIHdoaWNoIHRyYWZmaWMgaWRlbnRpZmllciB0aGUgQUREQkEgaXMgZm9yLgorICogICAgIFZhbHVlOgorICogICAgICAgICBUSUQgc3BlY2lmaWVkIGJ5IHRoZSByZWNlaXZlZCBBRERCQSBtYW5hZ2VtZW50IG1lc3NhZ2UuCisgKiAgIC0gUEVFUl9JRAorICogICAgIEJpdHMgMzE6MjAKKyAqICAgICBQdXJwb3NlOiBJZGVudGlmaWVzIHdoaWNoIHBlZXIgc2VudCB0aGUgQUREQkEuCisgKiAgICAgVmFsdWU6CisgKiAgICAgICAgIElEIChoYXNoIHZhbHVlKSB1c2VkIGJ5IHRoZSBob3N0IGZvciBmYXN0LCBkaXJlY3QgbG9va3VwIG9mCisgKiAgICAgICAgIGhvc3QgU1cgcGVlciBpbmZvLCBpbmNsdWRpbmcgcnggcmVvcmRlciBzdGF0ZXMuCisgKiAgIC0gU1RBUlRfU0VRX05VTQorICogICAgIEJpdHMgMTE6MAorICogICAgIFB1cnBvc2U6IFNwZWNpZmllcyB0aGUgaW5pdGlhbCBsb2NhdGlvbiBvZiB0aGUgYmxvY2sgYWNrIHdpbmRvdworICogICAgIFZhbHVlOiBzdGFydCBzZXF1ZW5jZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIEFEREJBLXJlcXVlc3QgbWVzc2FnZQorICogICAtIFNUQVRVUworICogICAgIEJpdCAxMgorICogICAgIFB1cnBvc2U6IHN0YXR1cyBvZiB0aGUgV01JIEFEREJBIHJlcXVlc3QKKyAqICAgICBWYWx1ZTogMCAtIFNVQ0NFU1MsIDEgLSBGQUlMVVJFCisgKi8KK3R5cGVkZWYgc3RydWN0IGh0dF9pc29jX3QyaF9hZGRiYV9zIHsKKwkvKiB3b3JkIDAgKi8KKwlBX1VJTlQzMiBtc2dfdHlwZSA6IDgsICAgIC8qIEhUVF9JU09DX1QySF9NU0dfVFlQRV9BRERCQSAqLworCQkgd2luX3NpemUgOiA4LCB0aWQgOiA0LCBwZWVyX2lkIDogMTI7CisJLyogd29yZCAxICovCisJQV9VSU5UMzIgc3RhcnRfc2VxX251bSA6IDEyLCBzdGF0dXMgOiAxLCByZXNlcnZlZDAgOiAxOTsKK30gaHR0X2lzb2NfdDJoX2FkZGJhX3Q7CisKKy8qIHdvcmQgMCAqLworI2RlZmluZSBIVFRfSVNPQ19UMkhfQUREQkFfV0lOX1NJWkVfT0ZGU0VUMzIgICAgICAgMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfQUREQkFfV0lOX1NJWkVfTSAgICAgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfQUREQkFfV0lOX1NJWkVfUyAgICAgICAgICAgICAgOAorCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9USURfT0ZGU0VUMzIgICAgICAgICAgICAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9USURfTSAgICAgICAgICAgICAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9USURfUyAgICAgICAgICAgICAgICAgICAxNgorCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9QRUVSX0lEX09GRlNFVDMyICAgICAgICAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9QRUVSX0lEX00gICAgICAgICAgICAgICAweGZmZjAwMDAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9QRUVSX0lEX1MgICAgICAgICAgICAgICAyMAorCisvKiB3b3JkIDEgKi8KKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0FEREJBX1NUQVJUX1NFUV9OVU1fT0ZGU0VUMzIgIDEKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0FEREJBX1NUQVJUX1NFUV9OVU1fTSAgICAgICAgIDB4MDAwMDBmZmYKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0FEREJBX1NUQVJUX1NFUV9OVU1fUyAgICAgICAgIDAKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfQUREQkFfU1RBVFVTX09GRlNFVDMyICAgICAgICAgMQorI2RlZmluZSBIVFRfSVNPQ19UMkhfQUREQkFfU1RBVFVTX00gICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfQUREQkFfU1RBVFVTX1MgICAgICAgICAgICAgICAgMTIKKworLyogZ2VuZXJhbCBmaWVsZCBhY2Nlc3MgbWFjcm9zICovCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9GSUVMRF9TRVQoZmllbGQsIG1zZ19hZGRyLCB2YWx1ZSkgXAorCWh0dF9pc29jX3QyaF9maWVsZF9zZXQoCQkJCQkgICAgICBcCisJCSgoQV9VSU5UMzIgKikgbXNnX2FkZHIpLAkJCQkgIFwKKwkJSFRUX0lTT0NfVDJIX0FEREJBXyAjIyBmaWVsZCAjIyBfT0ZGU0VUMzIsCSAgICAgXAorCQlIVFRfSVNPQ19UMkhfQUREQkFfICMjIGZpZWxkICMjIF9NLAkJICAgICBcCisJCUhUVF9JU09DX1QySF9BRERCQV8gIyMgZmllbGQgIyMgX1MsCQkgICAgIFwKKwkJdmFsdWUpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0FEREJBX0ZJRUxEX0dFVChmaWVsZCwgbXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfRklFTERfR0VUKAkJCQkgICAgICAgXAorCQkoKEFfVUlOVDMyICopIG1zZ19hZGRyKSwJCQkgICBcCisJCUhUVF9JU09DX1QySF9BRERCQV8gIyMgZmllbGQgIyMgX09GRlNFVDMyLCAgICBcCisJCUhUVF9JU09DX1QySF9BRERCQV8gIyMgZmllbGQgIyMgX00sCSAgICAgIFwKKwkJSFRUX0lTT0NfVDJIX0FEREJBXyAjIyBmaWVsZCAjIyBfUykKKworLyogYWNjZXNzIG1hY3JvcyBmb3Igc3BlY2lmaWMgZmllbGRzICovCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0FEREJBX1dJTl9TSVpFX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfQUREQkFfRklFTERfU0VUKFdJTl9TSVpFLCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9XSU5fU0laRV9HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfQUREQkFfRklFTERfR0VUKFdJTl9TSVpFLCBtc2dfYWRkcikKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfQUREQkFfVElEX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfQUREQkFfRklFTERfU0VUKFRJRCwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfQUREQkFfVElEX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9BRERCQV9GSUVMRF9HRVQoVElELCBtc2dfYWRkcikKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfQUREQkFfUEVFUl9JRF9TRVQobXNnX2FkZHIsIHZhbHVlKQlcCisJSFRUX0lTT0NfVDJIX0FEREJBX0ZJRUxEX1NFVChQRUVSX0lELCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9QRUVSX0lEX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9BRERCQV9GSUVMRF9HRVQoUEVFUl9JRCwgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0FEREJBX1NUQVJUX1NFUV9OVU1fU0VUKG1zZ19hZGRyLCB2YWx1ZSkgXAorCUhUVF9JU09DX1QySF9BRERCQV9GSUVMRF9TRVQoU1RBUlRfU0VRX05VTSwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfQUREQkFfU1RBUlRfU0VRX05VTV9HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfQUREQkFfRklFTERfR0VUKFNUQVJUX1NFUV9OVU0sIG1zZ19hZGRyKQorCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9TVEFUVVNfU0VUKG1zZ19hZGRyLCB2YWx1ZSkgXAorCUhUVF9JU09DX1QySF9BRERCQV9GSUVMRF9TRVQoU1RBVFVTLCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9BRERCQV9TVEFUVVNfR0VUKG1zZ19hZGRyKQlcCisJSFRUX0lTT0NfVDJIX0FEREJBX0ZJRUxEX0dFVChTVEFUVVMsIG1zZ19hZGRyKQorCisvKj09PSBERUxCQSBtZXNzYWdlID09PSovCisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IERFTEJBIG1lc3NhZ2UgZGVmaW5pdGlvbgorICoKKyAqIEBkZXRhaWxzCisgKiBUaGUgZm9sbG93aW5nIGRpYWdyYW0gc2hvd3MgdGhlIGZvcm1hdCBvZiB0aGUgcnggREVMQkEgbWVzc2FnZSBzZW50CisgKiBmcm9tIHRoZSB0YXJnZXQgdG8gdGhlIGhvc3Q6CisgKgorICogfDMxICAgICAgICAgICAgICAgICAgICAgIDIwfDE5ICAxNnwxNSAgICAgMTJ8MTEgICAgOHw3ICAgICAgICAgICAgICAgMHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgIHBlZXIgSUQgICAgICAgICB8ICBUSUQgfCAgICByZXNlcnZlZCAgIHxTfCAgICAgbXNnIHR5cGUgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgdGhlIEFEREJBCisgKiBtZXNzYWdlIHNlbnQgZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0LgorICoKKyAqIFdPUkQgMDoKKyAqICAgLSBNU0dfVFlQRQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogaWRlbnRpZmllcyB0aGlzIGFzIGFuIERFTEJBIG1lc3NhZ2UKKyAqICAgICBWYWx1ZTogMHg0CisgKiAgIC0gVElECisgKiAgICAgQml0cyAxOToxNgorICogICAgIFB1cnBvc2U6IFNwZWNpZmllcyB3aGljaCB0cmFmZmljIGlkZW50aWZpZXIgdGhlIERFTEJBIGlzIGZvci4KKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgVElEIHNwZWNpZmllZCBieSB0aGUgcmVjZWl2ZWQgREVMQkEgbWFuYWdlbWVudCBtZXNzYWdlLgorICogICAtIFBFRVJfSUQKKyAqICAgICBCaXRzIDMxOjIwCisgKiAgICAgUHVycG9zZTogSWRlbnRpZmllcyB3aGljaCBwZWVyIHNlbnQgdGhlIERFTEJBLgorICogICAgIFZhbHVlOgorICogICAgICAgICBJRCAoaGFzaCB2YWx1ZSkgdXNlZCBieSB0aGUgaG9zdCBmb3IgZmFzdCwgZGlyZWN0IGxvb2t1cCBvZgorICogICAgICAgICBob3N0IFNXIHBlZXIgaW5mbywgaW5jbHVkaW5nIHJ4IHJlb3JkZXIgc3RhdGVzLgorICogICAtIFNUQVRVUworICogICAgIEJpdCA4CisgKiAgICAgUHVycG9zZTogc3RhdHVzIG9mIHRoZSBXTUkgREVMQkEgcmVxdWVzdAorICogICAgIFZhbHVlOiAwIC0gU1VDQ0VTUywgMSAtIEZBSUxVUkUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaHR0X2lzb2NfdDJoX2RlbGJhX3MgeworCS8qIHdvcmQgMCAqLworCUFfVUlOVDMyIG1zZ190eXBlIDogOCwgICAgLyogSFRUX0lTT0NfVDJIX01TR19UWVBFX0RFTEJBICovCisJCSBzdGF0dXMgOiAxLCByZXNlcnZlZDAgOiA3LCB0aWQgOiA0LCBwZWVyX2lkIDogMTI7Cit9IGh0dF9pc29jX3QyaF9kZWxiYV90OworCisvKiB3b3JkIDAgKi8KKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1RJRF9PRkZTRVQzMiAgICAgICAgICAgIDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1RJRF9NICAgICAgICAgICAgICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1RJRF9TICAgICAgICAgICAgICAgICAgIDE2CisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1BFRVJfSURfT0ZGU0VUMzIgICAgICAgIDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1BFRVJfSURfTSAgICAgICAgICAgICAgIDB4ZmZmMDAwMDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1BFRVJfSURfUyAgICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1NUQVRVU19PRkZTRVQzMiAgICAgICAgIDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1NUQVRVU19NICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1NUQVRVU19TICAgICAgICAgICAgICAgIDgKKworLyogZ2VuZXJhbCBmaWVsZCBhY2Nlc3MgbWFjcm9zICovCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX0ZJRUxEX1NFVChmaWVsZCwgbXNnX2FkZHIsIHZhbHVlKSBcCisJaHR0X2lzb2NfdDJoX2ZpZWxkX3NldCgJCQkJCSAgICAgIFwKKwkJKChBX1VJTlQzMiAqKSBtc2dfYWRkciksCQkJCSAgXAorCQlIVFRfSVNPQ19UMkhfREVMQkFfICMjIGZpZWxkICMjIF9PRkZTRVQzMiwJICAgICBcCisJCUhUVF9JU09DX1QySF9ERUxCQV8gIyMgZmllbGQgIyMgX00sCQkgICAgIFwKKwkJSFRUX0lTT0NfVDJIX0RFTEJBXyAjIyBmaWVsZCAjIyBfUywJCSAgICAgXAorCQl2YWx1ZSkKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfREVMQkFfRklFTERfR0VUKGZpZWxkLCBtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9GSUVMRF9HRVQoCQkJCSAgICAgICBcCisJCSgoQV9VSU5UMzIgKikgbXNnX2FkZHIpLAkJCSAgIFwKKwkJSFRUX0lTT0NfVDJIX0RFTEJBXyAjIyBmaWVsZCAjIyBfT0ZGU0VUMzIsICAgIFwKKwkJSFRUX0lTT0NfVDJIX0RFTEJBXyAjIyBmaWVsZCAjIyBfTSwJICAgICAgXAorCQlIVFRfSVNPQ19UMkhfREVMQkFfICMjIGZpZWxkICMjIF9TKQorCisvKiBhY2Nlc3MgbWFjcm9zIGZvciBzcGVjaWZpYyBmaWVsZHMgKi8KKworI2RlZmluZSBIVFRfSVNPQ19UMkhfREVMQkFfVElEX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfREVMQkFfRklFTERfU0VUKFRJRCwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfREVMQkFfVElEX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9ERUxCQV9GSUVMRF9HRVQoVElELCBtc2dfYWRkcikKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfREVMQkFfUEVFUl9JRF9TRVQobXNnX2FkZHIsIHZhbHVlKQlcCisJSFRUX0lTT0NfVDJIX0RFTEJBX0ZJRUxEX1NFVChQRUVSX0lELCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9ERUxCQV9QRUVSX0lEX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9ERUxCQV9GSUVMRF9HRVQoUEVFUl9JRCwgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1NUQVRVU19TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX0RFTEJBX0ZJRUxEX1NFVChTVEFUVVMsIG1zZ19hZGRyLCB2YWx1ZSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX0RFTEJBX1NUQVRVU19HRVQobXNnX2FkZHIpCVwKKwlIVFRfSVNPQ19UMkhfREVMQkFfRklFTERfR0VUKFNUQVRVUywgbXNnX2FkZHIpCisKKy8qPT09IFNFQ19JTkQgbWVzc2FnZSA9PT0qLworCisvKioKKyAqIEBicmllZiB0YXJnZXQgLT4gaG9zdCBTZWN1cml0eSBpbmRpY2F0aW9uIG1lc3NhZ2UgZGVmaW5pdGlvbgorICoKKyAqIEBkZXRhaWxzCisgKiBUaGUgZm9sbG93aW5nIGRpYWdyYW0gc2hvd3MgdGhlIGZvcm1hdCBvZiB0aGUgU0VDX0lORCBtZXNzYWdlIHNlbnQKKyAqIGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4gIFRoaXMgbGF5b3V0IGFzc3VtZXMgdGhlIHRhcmdldCBvcGVyYXRlcworICogYXMgbGl0dGxlLWVuZGlhbi4KKyAqCisgKiB8MzEgICAgICAgICAgMjV8MjR8MjMgICAgICAgMTh8MTd8MTZ8MTUgICAgICAxMXwxMHw5fDh8N3w2fCAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgaXMgdW5pY2FzdCAgICB8ICBzZWMgdHlwZSAgICAgICB8ICAgICBQZWVyIGlkICAgICB8ICAgICBtc2cgdHlwZSAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICBtaWMga2V5MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgICAgICAgICAgICBtaWMga2V5MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZmllbGQgZGVmaW5pdGlvbnMgZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiB0aGUgcGVlciBpbmZvCisgKiBtZXNzYWdlIHNlbnQgZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0LgorICoKKyAqIFdPUkQgMDoKKyAqICAgLSBNU0dfVFlQRQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogaWRlbnRpZmllcyB0aGlzIGFzIFNFQ19JTkQgbWVzc2FnZQorICogICAgIFZhbHVlOiAweDYKKyAqICAgLSBQRUVSX0lECisgKiAgICAgQml0cyAxNTo4CisgKiAgICAgUHVycG9zZTogVGhlIElEIHRoYXQgdGhlIHRhcmdldCBoYXMgYWxsb2NhdGVkIHRvIHJlZmVyIHRvIHRoZSBwZWVyCisgKiAgICAgVmFsdWU6IFBlZXIgSUQKKyAqICAgLSBTRUNfVFlQRQorICogICAgIEJpdHMgMjM6MTYKKyAqICAgICBQdXJwb3NlOiBzcGVjaWZ5IHRoZSBzZWN1cml0eSBlbmNyeXB0aW9uIHR5cGUKKyAqICAgICBWYWx1ZTogaHR0X3NlY190eXBlCisgKiAgIC0gaXMgdW5pY2FzdAorICogICAgIEJpdHMgMzE6MjQKKyAqICAgICBQdXJwb3NlOiBzcGVjaWZ5IHVuaWNhc3QvYmNhc3QKKyAqICAgICBWYWx1ZTogMS11bmljYXN0LzAtYmNhc3QKKyAqIFdPUkQgMToKKyAqICAgLSBNSUMxCisgKiAgICAgQml0cyAzMTowCisgKiAgICAgUHVycG9zZTogTWlja2V5MQorICogV09SRCAyOgorICogICAtIE1JQzIKKyAqICAgICBCaXRzIDMxOjAKKyAqICAgICBQdXJwb3NlOiBNaWNrZXkyCisgKi8KK3R5cGVkZWYgc3RydWN0IGh0dF9pc29jX3QyaF9zZWNfaW5kX3MgeworCS8qIHdvcmQgMCAqLworCUFfVUlOVDMyIG1zZ190eXBlIDogOCwgICAgLyogSFRUX0lTT0NfVDJIX01TR19UWVBFX1NFQ19JTkQgKi8KKwkJIHBlZXJfaWQgOiA4LCBzZWNfdHlwZSA6IDgsIGlzX3VuaWNhc3QgOiA4OworCS8qIHdvcmQgMSAqLworCUFfVUlOVDMyIG1pY19rZXkxOworCS8qIHdvcmQgMiAqLworCUFfVUlOVDMyIG1pY19rZXkyOworCS8qIHdvcmQgMyAqLworCUFfVUlOVDMyIHN0YXR1czsKK30gaHR0X2lzb2NfdDJoX3NlY19pbmRfdDsKKworLyogd29yZCAwICovCisjZGVmaW5lIEhUVF9JU09DX1QySF9TRUNfSU5EX1BFRVJfSURfT0ZGU0VUMzIgICAgICAgIDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfUEVFUl9JRF9NICAgICAgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfU0VDX0lORF9QRUVSX0lEX1MgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfU0VDX1RZUEVfT0ZGU0VUMzIgICAgICAgMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfU0VDX0lORF9TRUNfVFlQRV9NICAgICAgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9TRUNfSU5EX1NFQ19UWVBFX1MgICAgICAgICAgICAgIDE2CisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfSVNfVU5JQ0FTVF9PRkZTRVQzMiAgICAgMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfU0VDX0lORF9JU19VTklDQVNUX00gICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9TRUNfSU5EX0lTX1VOSUNBU1RfUyAgICAgICAgICAgIDI0CisKKy8qIHdvcmQgMSAqLworI2RlZmluZSBIVFRfSVNPQ19UMkhfU0VDX0lORF9NSUMxX09GRlNFVDMyICAgICAgICAgICAxCisjZGVmaW5lIEhUVF9JU09DX1QySF9TRUNfSU5EX01JQzFfTSAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfTUlDMV9TICAgICAgICAgICAgICAgICAgMAorCisvKiB3b3JkIDIgKi8KKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfTUlDMl9PRkZTRVQzMiAgICAgICAgICAgMgorI2RlZmluZSBIVFRfSVNPQ19UMkhfU0VDX0lORF9NSUMyX00gICAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEhUVF9JU09DX1QySF9TRUNfSU5EX01JQzJfUyAgICAgICAgICAgICAgICAgIDAKKworLyogZ2VuZXJhbCBmaWVsZCBhY2Nlc3MgbWFjcm9zICovCisjZGVmaW5lIEhUVF9JU09DX1QySF9TRUNfSU5EX0ZJRUxEX1NFVChmaWVsZCwgbXNnX2FkZHIsIHZhbHVlKSBcCisJaHR0X2lzb2NfdDJoX2ZpZWxkX3NldCgJCQkJCSAgICAgXAorCQkoKEFfVUlOVDMyICopIG1zZ19hZGRyKSwJCQkJIFwKKwkJSFRUX0lTT0NfVDJIX1NFQ19JTkRfICMjIGZpZWxkICMjIF9PRkZTRVQzMiwJICAgICAgIFwKKwkJSFRUX0lTT0NfVDJIX1NFQ19JTkRfICMjIGZpZWxkICMjIF9NLAkJICAgICAgIFwKKwkJSFRUX0lTT0NfVDJIX1NFQ19JTkRfICMjIGZpZWxkICMjIF9TLAkJICAgICAgIFwKKwkJdmFsdWUpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfRklFTERfR0VUKGZpZWxkLCBtc2dfYWRkcikJXAorCUhUVF9JU09DX1QySF9GSUVMRF9HRVQoCQkJCSAgICAgIFwKKwkJKChBX1VJTlQzMiAqKSBtc2dfYWRkciksCQkJICBcCisJCUhUVF9JU09DX1QySF9TRUNfSU5EXyAjIyBmaWVsZCAjIyBfT0ZGU0VUMzIsCVwKKwkJSFRUX0lTT0NfVDJIX1NFQ19JTkRfICMjIGZpZWxkICMjIF9NLAkJXAorCQlIVFRfSVNPQ19UMkhfU0VDX0lORF8gIyMgZmllbGQgIyMgX1MpCisKKy8qIGFjY2VzcyBtYWNyb3MgZm9yIHNwZWNpZmljIGZpZWxkcyAqLworI2RlZmluZSBIVFRfSVNPQ19UMkhfU0VDX0lORF9QRUVSX0lEX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfU0VDX0lORF9GSUVMRF9TRVQoUEVFUl9JRCwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfU0VDX0lORF9QRUVSX0lEX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9TRUNfSU5EX0ZJRUxEX0dFVChQRUVSX0lELCBtc2dfYWRkcikKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfU0VDX0lORF9TRUNfVFlQRV9TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX1NFQ19JTkRfRklFTERfU0VUKFNFQ19UWVBFLCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9TRUNfSU5EX1NFQ19UWVBFX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9TRUNfSU5EX0ZJRUxEX0dFVChTRUNfVFlQRSwgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfSVNfVU5JQ0FTVF9TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX1NFQ19JTkRfRklFTERfU0VUKElTX1VOSUNBU1QsIG1zZ19hZGRyLCB2YWx1ZSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfSVNfVU5JQ0FTVF9HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfU0VDX0lORF9GSUVMRF9HRVQoSVNfVU5JQ0FTVCwgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfTUlDMV9TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX1NFQ19JTkRfRklFTERfU0VUKE1JQzEsIG1zZ19hZGRyLCB2YWx1ZSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfTUlDMV9HRVQobXNnX2FkZHIpCVwKKwlIVFRfSVNPQ19UMkhfU0VDX0lORF9GSUVMRF9HRVQoTUlDMSwgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfTUlDMl9TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX1NFQ19JTkRfRklFTERfU0VUKE1JQzIsIG1zZ19hZGRyLCB2YWx1ZSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1NFQ19JTkRfTUlDMl9HRVQobXNnX2FkZHIpCVwKKwlIVFRfSVNPQ19UMkhfU0VDX0lORF9GSUVMRF9HRVQoTUlDMiwgbXNnX2FkZHIpCisKKy8qPT09IFBFRVJfVFhfUkVBRFkgbWVzc2FnZSA9PT0qLworCisvKioKKyAqIEBicmllZiB0YXJnZXQgLT4gaG9zdCBwZWVyIHR4IHJlYWR5IG1lc3NhZ2UgZGVmaW5pdGlvbgorICoKKyAqIEBkZXRhaWxzCisgKiBUaGUgZm9sbG93aW5nIGRpYWdyYW0gc2hvd3MgdGhlIGZvcm1hdCBvZiB0aGUgcGVlciB0eCByZWFkeSBtZXNzYWdlIHNlbnQKKyAqIGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4gIFRoaXMgbGF5b3V0IGFzc3VtZXMgdGhlIHRhcmdldCBvcGVyYXRlcworICogYXMgbGl0dGxlLWVuZGlhbi4KKyAqCisgKiB8MzEgICAgICAgICAgICAgICAgICAgICAgMTl8MTggICAgICAgICAgICAgICAgICAgICAgIDh8NyAgICAgICAgICAgICAgIDB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICB8ICAgICAgICAgIHBlZXIgSUQgICAgICAgICB8ICAgICBtc2cgdHlwZSAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZmllbGQgZGVmaW5pdGlvbnMgZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiB0aGUgcGVlciBpbmZvCisgKiBtZXNzYWdlIHNlbnQgZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBob3N0LgorICoKKyAqIFdPUkQgMDoKKyAqICAgLSBNU0dfVFlQRQorICogICAgIEJpdHMgNzowCisgKiAgICAgUHVycG9zZTogaWRlbnRpZmllcyB0aGlzIGFzIHBlZXIgdHggcmVhZHkgbWVzc2FnZQorICogICAgIFZhbHVlOiAweDcKKyAqICAgLSBQRUVSX0lECisgKiAgICAgQml0cyAxODo4CisgKiAgICAgUHVycG9zZTogVGhlIElEIGFzc2lnbmVkIHRvIHRoZSBwZWVyIGJ5IHRoZSBQRUVSX0lORk8gbWVzc2FnZQorICovCit0eXBlZGVmIHN0cnVjdCBodHRfaXNvY190MmhfcGVlcl90eF9yZWFkeV9zIHsKKwkvKiB3b3JkIDAgKi8KKwlBX1VJTlQzMiBtc2dfdHlwZSA6IDgsICAgIC8qIEhUVF9JU09DX1QySF9NU0dfVFlQRV9QRUVSX1RYX1JFQURZICovCisJCSBwZWVyX2lkIDogMTEsIHJlc2VydmVkMCA6IDEzOworfSBodHRfaXNvY190MmhfcGVlcl90eF9yZWFkeV90OworCisvKiB3b3JkIDAgKi8KKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfVFhfUkVBRFlfUEVFUl9JRF9PRkZTRVQzMiAgICAgICAgMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUEVFUl9UWF9SRUFEWV9QRUVSX0lEX00gICAgICAgICAgICAgICAweDAwMDdmZjAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX1RYX1JFQURZX1BFRVJfSURfUyAgICAgICAgICAgICAgIDgKKworLyogZ2VuZXJhbCBmaWVsZCBhY2Nlc3MgbWFjcm9zICovCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfVFhfUkVBRFlfRklFTERfU0VUKGZpZWxkLCBtc2dfYWRkciwgdmFsdWUpIFwKKwlodHRfaXNvY190MmhfZmllbGRfc2V0KAkJCQkJICAgICAgXAorCQkoKEFfVUlOVDMyICopIG1zZ19hZGRyKSwJCQkJICBcCisJCUhUVF9JU09DX1QySF9QRUVSX1RYX1JFQURZXyAjIyBmaWVsZCAjIyBfT0ZGU0VUMzIsCSAgICAgXAorCQlIVFRfSVNPQ19UMkhfUEVFUl9UWF9SRUFEWV8gIyMgZmllbGQgIyMgX00sCQkgICAgIFwKKwkJSFRUX0lTT0NfVDJIX1BFRVJfVFhfUkVBRFlfICMjIGZpZWxkICMjIF9TLAkJICAgICBcCisJCXZhbHVlKQorCisjZGVmaW5lIEhUVF9JU09DX1QySF9QRUVSX1RYX1JFQURZX0ZJRUxEX0dFVChmaWVsZCwgbXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfRklFTERfR0VUKAkJCQkgICAgICAgXAorCQkoKEFfVUlOVDMyICopIG1zZ19hZGRyKSwJCQkgICBcCisJCUhUVF9JU09DX1QySF9QRUVSX1RYX1JFQURZXyAjIyBmaWVsZCAjIyBfT0ZGU0VUMzIsICAgIFwKKwkJSFRUX0lTT0NfVDJIX1BFRVJfVFhfUkVBRFlfICMjIGZpZWxkICMjIF9NLAkgICAgICBcCisJCUhUVF9JU09DX1QySF9QRUVSX1RYX1JFQURZXyAjIyBmaWVsZCAjIyBfUykKKworLyogYWNjZXNzIG1hY3JvcyBmb3Igc3BlY2lmaWMgZmllbGRzICovCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfVFhfUkVBRFlfUEVFUl9JRF9TRVQobXNnX2FkZHIsIHZhbHVlKQlcCisJSFRUX0lTT0NfVDJIX1BFRVJfVFhfUkVBRFlfRklFTERfU0VUKFBFRVJfSUQsIG1zZ19hZGRyLCB2YWx1ZSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1BFRVJfVFhfUkVBRFlfUEVFUl9JRF9HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfUEVFUl9UWF9SRUFEWV9GSUVMRF9HRVQoUEVFUl9JRCwgbXNnX2FkZHIpCisKKy8qPT09IFJYX0VSUiBtZXNzYWdlID09PSovCisKKy8qKgorICogQGJyaWVmIHRhcmdldCAtPiBob3N0IHJ4IGVycm9yIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGRlZmluaXRpb24KKyAqCisgKiBAZGV0YWlscworICogVGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBmb3JtYXQgb2YgdGhlIHJ4IGVyciBtZXNzYWdlIHNlbnQKKyAqIGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4gIFRoaXMgbGF5b3V0IGFzc3VtZXMgdGhlIHRhcmdldCBvcGVyYXRlcworICogYXMgbGl0dGxlLWVuZGlhbi4KKyAqCisgKiB8MzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTZ8MTUgICAgICAgICAgICAgIDh8N3w2fDV8NCAgICAgICAwfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAgICAgICAgICAgICBwZWVyIElEICAgICAgICAgICAgIHwgICByeCBlcnIgdHlwZSAgIHwgICAgbXNnIHR5cGUgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgfCAgIHJ4IGVyciBjb3VudCAgfE18IHIgfCBleHQgVElEIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiBNID0gbXVsdGljYXN0CisgKiByID0gcmVzZXJ2ZWQKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgdGhlIHBlZXIgaW5mbworICogbWVzc2FnZSBzZW50IGZyb20gdGhlIHRhcmdldCB0byB0aGUgaG9zdC4KKyAqCisgKiBXT1JEIDA6CisgKiAgIC0gTVNHX1RZUEUKKyAqICAgICBCaXRzIDc6MAorICogICAgIFB1cnBvc2U6IGlkZW50aWZpZXMgdGhpcyBhcyBhbiByeCBlcnIgbWVzc2FnZQorICogICAgIFZhbHVlOiAweDgKKyAqICAgLSBSWF9FUlJfVFlQRQorICogICAgIEJpdHMgMTU6OAorICogICAgIFB1cnBvc2U6IHNwZWNpZmllcyB3aGljaCB0eXBlIG9mIHJ4IGVycm9yIGlzIGJlaW5nIHJlcG9ydGVkCisgKiAgICAgVmFsdWU6IGh0dF9yeF9pbmRfbXBkdV9zdGF0dXMgZW51bQorICogICAtIFBFRVJfSUQKKyAqICAgICBCaXRzIDMxOjE2CisgKiAgICAgUHVycG9zZTogc3BlY2lmeSB3aGljaCBwZWVyIHNlbnQgdGhlIGZyYW1lIHRoYXQgcmVzdWx0ZWQgaW4gYW4gZXJyb3IKKyAqIFdPUkQgMToKKyAqICAgLSBFWFRfVElECisgKiAgICAgQml0cyA0OjAKKyAqICAgICBQdXJwb3NlOiBzcGVjaWZpZXMgd2hpY2ggdHJhZmZpYyB0eXBlIGhhZCB0aGUgcnggZXJyb3IKKyAqICAgICBWYWx1ZTogMC0xNSBmb3IgYSByZWFsIFRJRCB2YWx1ZSwgMTYgZm9yIG5vbi1Rb1MgZGF0YSwgMzEgZm9yIHVua25vd24KKyAqICAgLSBNQ0FTVAorICogICAgIEJpdCA2CisgKiAgICAgUHVycG9zZTogc3BlY2lmeSB3aGV0aGVyIHRoZSByeCBlcnJvciBmcmFtZSB3YXMgdW5pY2FzdCBvciBtdWx0aWNhc3QKKyAqICAgICBWYWx1ZTogMCAtPiB1bmljYXN0LCAxIC0+IG11bHRpY2FzdAorICogICAtIEwyX0hEUl9JU184MDIxMQorICogICAgIEJpdCA3CisgKiAgICAgUHVycG9zZTogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGluY2x1ZGVkIEwyIGhlYWRlciAoaWYgcHJlc2VudCkgaXMgaW4KKyAqICAgICAgICAgODAyLjMgb3IgODAyLjExIGZvcm1hdAorICogICAgIFZhbHVlOiAwIC0+IDgwMi4zLCAxIC0+IDgwMi4xMQorICogICAtIEwyX0hEUl9CWVRFUworICogICAgIEJpdHMgMTU6OAorICogICAgIFB1cnBvc2U6IFNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIEwyIGhlYWRlciBpbiB0aGlzIHJ4IGVycm9yIHJlcG9ydC4KKyAqICAgICBWYWx1ZToKKyAqICAgICAgICAgSWYgbm8gTDIgaGVhZGVyIGlzIGluY2x1ZGVkLCB0aGlzIGZpZWxkIHNoYWxsIGJlIDAuCisgKiAgICAgICAgIElmIGEgODAyLjMgKyBMTEMvU05BUCBoZWFkZXIgaXMgaW5jbHVkZWQsIHRoaXMgZmllbGQgc2hhbGwgYmUKKyAqICAgICAgICAgMTQgKGV0aGVybmV0IGhlYWRlcikgKyA4IChMTEMvU05BUCkuCisgKiAgICAgICAgIElmIGEgODAyLjExIGhlYWRlciBpcyBpbmNsdWRlZCwgdGhpcyBmaWVsZCBzaGFsbCBiZSAyNCBieXRlcyBmb3IKKyAqICAgICAgICAgYSBiYXNpYyBoZWFkZXIsIG9yIDI2IGJ5dGVzIGlmIGEgUW9TIGNvbnRyb2wgZmllbGQgaXMgaW5jbHVkZWQsCisgKiAgICAgICAgIG9yIDMwIGJ5dGVzIGlmIGEgNHRoIGFkZHJlc3MgaXMgaW5jbHVkZWQsIG9yIDMyIGJ5dGVzIGlmIGEgNHRoCisgKiAgICAgICAgIGFkZHJlc3MgYW5kIGEgUW9TIGNvbnRyb2wgZmllbGQgYXJlIGluY2x1ZGVkLCBldGMuCisgKiAgICAgICAgIFRob3VnaCB0aGUgTDIgaGVhZGVyIGluY2x1ZGVkIGluIHRoZSBtZXNzYWdlIG5lZWRzIHRvIGluY2x1ZGUKKyAqICAgICAgICAgcGFkZGluZyB1cCB0byBhIDQtYnl0ZSBib3VuZGFyeSwgdGhpcyBMMiBoZWFkZXIgc2l6ZSBmaWVsZCBuZWVkCisgKiAgICAgICAgIG5vdCBhY2NvdW50IGZvciB0aGUgcGFkZGluZyBmb2xsb3dpbmcgdGhlIEwyIGhlYWRlci4KKyAqICAgLSBTRUNfSERSX0JZVEVTCisgKiAgICAgQml0cyAyMzoxNgorICogICAgIFB1cnBvc2U6IFNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIHNlY3VyaXR5IGVuY2Fwc3VsYXRpb24gaGVhZGVyIGluCisgKiAgICAgICAgIHRoaXMgcnggZXJyb3IgcmVwb3J0LgorICogICAgIFZhbHVlOgorICogICAgICAgICBJZiBubyBzZWN1cml0eSBoZWFkZXIgaXMgaW5jbHVkZWQsIHRoaXMgZmllbGQgc2hhbGwgYmUgMC4KKyAqICAgICAgICAgSWYgYSBzZWN1cml0eSBoZWFkZXIgaXMgaW5jbHVkZWQsIHRoaXMgZmllbGQgZGVwZW5kcyBvbiB0aGUKKyAqICAgICAgICAgc2VjdXJpdHkgdHlwZSwgd2hpY2ggY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHJ4IGVycm9yIHR5cGUuCisgKiAgICAgICAgIEZvciBUS0lQIE1JQyBlcnJvcnMsIHRoZSBzZWN1cml0eSBoZWFkZXIgY291bGQgYmUgYW55IG9mOgorICogICAgICAgICAgICAgOCAgLSBpZiBJViAvIEtleUlEIGFuZCBFeHRlbmRlZCBJViBhcmUgaW5jbHVkZWQKKyAqICAgICAgICAgICAgIDE2IC0gaWYgTUlDIGlzIGFsc28gaW5jbHVkZWQKKyAqICAgICAgICAgICAgIDIwIC0gaWYgSUNWIGlzIGFsc28gaW5jbHVkZWQKKyAqICAgLSBSWF9FUlJfQ05UCisgKiAgICAgQml0cyAzMToyNAorICogICAgIFB1cnBvc2U6IHNwZWNpZmllcyBob3cgbWFueSByeCBlcnJvcnMgYXJlIHJlcG9ydGVkIGluIHRoaXMgbWVzc2FnZQorICogICAgIFZhbHVlOgorICogICAgICAgICBSeCBlcnJvciByZXBvcnRzIHRoYXQgaW5jbHVkZSBhIEwyIGhlYWRlciBhbmQvb3Igc2VjdXJpdHkgaGVhZGVyCisgKiAgICAgICAgIHdpbGwgc2V0IHRoaXMgZmllbGQgdG8gMSwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3Igbm90aWZpY2F0aW9uCisgKiAgICAgICAgIGlzIGZvciBhIHNpbmdsZSBmcmFtZS4KKyAqICAgICAgICAgUnggZXJyb3IgcmVwb3J0cyB0aGF0IGRvbid0IGluY2x1ZGUgYSBMMiBoZWFkZXIgb3Igc2VjdXJpdHkgaGVhZGVyCisgKiAgICAgICAgIGNhbiB1c2UgdGhpcyBmaWVsZCB0byBzZW5kIGEgc2luZ2xlIG1lc3NhZ2UgdG8gcmVwb3J0IG11bHRpcGxlCisgKiAgICAgICAgIGVycm9uZW91cyByeCBmcmFtZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGh0dF9pc29jX3QyaF9yeF9lcnJfcyB7CisJLyogd29yZCAwICovCisJQV9VSU5UMzIgbXNnX3R5cGUgOiA4LCAgICAvKiBIVFRfSVNPQ19UMkhfTVNHX1RZUEVfUlhfRVJSICovCisJCSByeF9lcnJfdHlwZSA6IDgsIHBlZXJfaWQgOiAxNjsKKwkvKiB3b3JkIDEgKi8KKwlBX1VJTlQzMgorCQlleHRfdGlkIDogNSwKKwkJcmVzZXJ2ZWQxIDogMSwKKwkJbWNhc3QgOiAxLAorCQlsMl9oZHJfaXNfODAyMTEgOiAxLCBsMl9oZHJfYnl0ZXMgOiA4LCBzZWNfaGRyX2J5dGVzIDogOCwgcnhfZXJyX2NudCA6IDg7CisJLyogd29yZHMgMiAtIE0tMTogTDIgaGVhZGVyICovCisJLyogd29yZHMgTSAtIE46IHNlY3VyaXR5IGhlYWRlciAqLworfSBodHRfaXNvY190MmhfcnhfZXJyX3Q7CisKKy8qIHdvcmQgMCAqLworI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX1RZUEVfT0ZGU0VUMzIgICAgICAgICAgICAgMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX1RZUEVfTSAgICAgICAgICAgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX1RZUEVfSURfUyAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIEhUVF9JU09DX1QySF9SWF9FUlJfUEVFUl9JRF9PRkZTRVQzMiAgICAgICAgICAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9SWF9FUlJfUEVFUl9JRF9NICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEhUVF9JU09DX1QySF9SWF9FUlJfUEVFUl9JRF9TICAgICAgICAgICAgICAgICAxNgorCisvKiB3b3JkIDEgKi8KKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0VSUl9FWFRfVElEX09GRlNFVDMyICAgICAgICAgIDEKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0VSUl9FWFRfVElEX00gICAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0VSUl9FWFRfVElEX0lEX1MgICAgICAgICAgICAgIDAKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX01DQVNUX09GRlNFVDMyICAgICAgICAgICAgMQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX01DQVNUX00gICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX01DQVNUX0lEX1MgICAgICAgICAgICAgICAgNgorCisjZGVmaW5lIEhUVF9JU09DX1QySF9SWF9FUlJfTDJfSERSX0lTXzgwMjExX09GRlNFVDMyICAxCisjZGVmaW5lIEhUVF9JU09DX1QySF9SWF9FUlJfTDJfSERSX0lTXzgwMjExX00gICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhUVF9JU09DX1QySF9SWF9FUlJfTDJfSERSX0lTXzgwMjExX0lEX1MgICAgICA3CisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0wyX0hEUl9CWVRFU19PRkZTRVQzMiAgICAgICAgIDEKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0wyX0hEUl9CWVRFU19NICAgICAgICAgICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0wyX0hEUl9CWVRFU19JRF9TICAgICAgICAgICAgIDgKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfU0VDX0hEUl9CWVRFU19PRkZTRVQzMiAgICAgICAgMQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfU0VDX0hEUl9CWVRFU19NICAgICAgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfU0VDX0hEUl9CWVRFU19JRF9TICAgICAgICAgICAgMTYKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX0NOVF9PRkZTRVQzMiAgICAgICAgICAgICAgMQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX0NOVF9NICAgICAgICAgICAgICAgICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX0NOVF9JRF9TICAgICAgICAgICAgICAgICAgMjQKKworLyogZ2VuZXJhbCBmaWVsZCBhY2Nlc3MgbWFjcm9zICovCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0VSUl9GSUVMRF9TRVQoZmllbGQsIG1zZ19hZGRyLCB2YWx1ZSkgXAorCWh0dF9pc29jX3QyaF9maWVsZF9zZXQoCQkJCQkgICAgICBcCisJCSgoQV9VSU5UMzIgKikgbXNnX2FkZHIpLAkJCQkgIFwKKwkJSFRUX0lTT0NfVDJIX1JYX0VSUl8gIyMgZmllbGQgIyMgX09GRlNFVDMyLAkgICAgICBcCisJCUhUVF9JU09DX1QySF9SWF9FUlJfICMjIGZpZWxkICMjIF9NLAkJICAgICAgXAorCQlIVFRfSVNPQ19UMkhfUlhfRVJSXyAjIyBmaWVsZCAjIyBfUywJCSAgICAgIFwKKwkJdmFsdWUpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0VSUl9GSUVMRF9HRVQoZmllbGQsIG1zZ19hZGRyKSBcCisJSFRUX0lTT0NfVDJIX0ZJRUxEX0dFVCgJCQkJICAgICAgIFwKKwkJKChBX1VJTlQzMiAqKSBtc2dfYWRkciksCQkJICAgXAorCQlIVFRfSVNPQ19UMkhfUlhfRVJSXyAjIyBmaWVsZCAjIyBfT0ZGU0VUMzIsICAgIFwKKwkJSFRUX0lTT0NfVDJIX1JYX0VSUl8gIyMgZmllbGQgIyMgX00sCSAgICAgICBcCisJCUhUVF9JU09DX1QySF9SWF9FUlJfICMjIGZpZWxkICMjIF9TKQorCisvKiBhY2Nlc3MgbWFjcm9zIGZvciBzcGVjaWZpYyBmaWVsZHMgKi8KKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX1RZUEVfU0VUKG1zZ19hZGRyLCB2YWx1ZSkgXAorCUhUVF9JU09DX1QySF9SWF9FUlJfRklFTERfU0VUKFRZUEUsIG1zZ19hZGRyLCB2YWx1ZSkKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0VSUl9UWVBFX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9SWF9FUlJfRklFTERfR0VUKFRZUEUsIG1zZ19hZGRyKQorCisjZGVmaW5lIEhUVF9JU09DX1QySF9SWF9FUlJfUEVFUl9JRF9TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX1JYX0VSUl9GSUVMRF9TRVQoUEVFUl9JRCwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX1BFRVJfSURfR0VUKG1zZ19hZGRyKSBcCisJSFRUX0lTT0NfVDJIX1JYX0VSUl9GSUVMRF9HRVQoUEVFUl9JRCwgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0VSUl9FWFRfVElEX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfUlhfRVJSX0ZJRUxEX1NFVChFWFRfVElELCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9SWF9FUlJfRVhUX1RJRF9HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfUlhfRVJSX0ZJRUxEX0dFVChFWFRfVElELCBtc2dfYWRkcikKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX01DQVNUX1NFVChtc2dfYWRkciwgdmFsdWUpIFwKKwlIVFRfSVNPQ19UMkhfUlhfRVJSX0ZJRUxEX1NFVChNQ0FTVCwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX01DQVNUX0dFVChtc2dfYWRkcikJXAorCUhUVF9JU09DX1QySF9SWF9FUlJfRklFTERfR0VUKE1DQVNULCBtc2dfYWRkcikKKworI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX0wyX0hEUl9JU184MDIxMV9TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX1JYX0VSUl9GSUVMRF9TRVQoTDJfSERSX0lTXzgwMjExLCBtc2dfYWRkciwgdmFsdWUpCisjZGVmaW5lIEhUVF9JU09DX1QySF9SWF9FUlJfTDJfSERSX0lTXzgwMjExX0dFVChtc2dfYWRkcikgXAorCUhUVF9JU09DX1QySF9SWF9FUlJfRklFTERfR0VUKEwyX0hEUl9JU184MDIxMSwgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0VSUl9MMl9IRFJfQllURVNfU0VUKG1zZ19hZGRyLCB2YWx1ZSkgXAorCUhUVF9JU09DX1QySF9SWF9FUlJfRklFTERfU0VUKEwyX0hEUl9CWVRFUywgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX0wyX0hEUl9CWVRFU19HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfUlhfRVJSX0ZJRUxEX0dFVChMMl9IRFJfQllURVMsIG1zZ19hZGRyKQorCisjZGVmaW5lIEhUVF9JU09DX1QySF9SWF9FUlJfU0VDX0hEUl9CWVRFU19TRVQobXNnX2FkZHIsIHZhbHVlKSBcCisJSFRUX0lTT0NfVDJIX1JYX0VSUl9GSUVMRF9TRVQoU0VDX0hEUl9CWVRFUywgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX1NFQ19IRFJfQllURVNfR0VUKG1zZ19hZGRyKQlcCisJSFRUX0lTT0NfVDJIX1JYX0VSUl9GSUVMRF9HRVQoU0VDX0hEUl9CWVRFUywgbXNnX2FkZHIpCisKKyNkZWZpbmUgSFRUX0lTT0NfVDJIX1JYX0VSUl9DTlRfU0VUKG1zZ19hZGRyLCB2YWx1ZSkgXAorCUhUVF9JU09DX1QySF9SWF9FUlJfRklFTERfU0VUKENOVCwgbXNnX2FkZHIsIHZhbHVlKQorI2RlZmluZSBIVFRfSVNPQ19UMkhfUlhfRVJSX0NOVF9HRVQobXNnX2FkZHIpIFwKKwlIVFRfSVNPQ19UMkhfUlhfRVJSX0ZJRUxEX0dFVChDTlQsIG1zZ19hZGRyKQorCisjZW5kaWYgLyogX0hUVF9JU09DX0hfICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL2lwX3Byb3QuaCBiL3RhcmdldC9pbmMvaXBfcHJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzIyZmUKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL2lwX3Byb3QuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfSVBfUFJPVF9fSF8KKyNkZWZpbmUgX0lQX1BST1RfX0hfCisKKyNkZWZpbmUgSVBfUFJPVE9DT0xfSUNNUCAgICAgICAgMHgwMSAgICAvKiBJbnRlcm5ldCBDb250cm9sIE1lc3NhZ2UgUHJvdG9jb2wgKi8KKyNkZWZpbmUgSVBfUFJPVE9DT0xfSUdNUCAgICAgICAgMHgwMiAgICAvKiBJbnRlcm5ldCBHcm91cCBNYW5hZ2VtZW50IFByb3RvY29sICovCisjZGVmaW5lIElQX1BST1RPQ09MX0lQVjQgICAgICAgIDB4MDQgICAgLyogSVB2NCAoZW5jYXBzdWxhdGlvbikgKi8KKyNkZWZpbmUgSVBfUFJPVE9DT0xfVENQICAgICAgICAgMHgwNiAgICAvKiBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBJUF9QUk9UT0NPTF9VRFAgICAgICAgICAweDExICAgIC8qIFVzZXIgRGF0YWdyYW0gUHJvdG9jb2wgKi8KKyNkZWZpbmUgSVBfUFJPVE9DT0xfUkRQICAgICAgICAgMHgxQiAgICAvKiBSZWxpYWJsZSBEYXRhZ3JhbSBQcm90b2NvbCAqLworI2RlZmluZSBJUF9QUk9UT0NPTF9JUFY2ICAgICAgICAweDI5ICAgIC8qIElQdjYgKGVuY2Fwc3VsYXRpb24pICovCisjZGVmaW5lIElQX1BST1RPQ09MX0lQVjZfUk9VVEUgIDB4MkIgICAgLyogUm91dGluZyBIZWFkZXIgZm9yIElQdjYgKi8KKyNkZWZpbmUgSVBfUFJPVE9DT0xfSVBWNl9GUkFHICAgMHgyQyAgICAvKiBGcmFnbWVudCBIZWFkZXIgZm9yIElQdjYgKi8KKyNkZWZpbmUgSVBfUFJPVE9DT0xfUlNWUCAgICAgICAgMHgyRSAgICAvKiBSZXNvdXJjZSBSZXNlcnZhdGlvbiBQcm90b2NvbCAqLworI2RlZmluZSBJUF9QUk9UT0NPTF9HUkUgICAgICAgICAweDJGICAgIC8qIEdlbmVyaWMgUm91dGluZyBFbmNhcHN1bGF0aW9uICovCisjZGVmaW5lIElQX1BST1RPQ09MX01IUlAgICAgICAgIDB4MzAgICAgLyogTW9iaWxlIEhvc3QgUm91dGluZyBQcm90b2NvbCAqLworI2RlZmluZSBJUF9QUk9UT0NPTF9CTkEgICAgICAgICAweDMxICAgIC8qIEJOQSAqLworI2RlZmluZSBJUF9QUk9UT0NPTF9FU1AgICAgICAgICAweDMyICAgIC8qIEVuY2Fwc3VsYXRpbmcgU2VjdXJpdHkgUGF5bG9hZCAqLworI2RlZmluZSBJUF9QUk9UT0NPTF9NT0JJTEUgICAgICAweDM3ICAgIC8qIElQIE1vYmlsaXR5IChNaW4gRW5jYXApICovCisjZGVmaW5lIElQX1BST1RPQ09MX0lQVjZfSUNNUCAgIDB4M0EgICAgLyogSUNNUCBmb3IgSVB2NiAqLworI2RlZmluZSBJUF9QUk9UT0NPTF9JUFY2X05PTlhUICAweDNCICAgIC8qIE5vIE5leHQgSGVhZGVyIGZvciBJUHY2ICovCisjZGVmaW5lIElQX1BST1RPQ09MX0lQVjZfT1BUUyAgIDB4M0MgICAgLyogRGVzdGluYXRpb24gT3B0aW9ucyBmb3IgSVB2NiAqLworI2RlZmluZSBJUF9QUk9UT0NPTF9JUENPTVAgICAgICAweDZDICAgIC8qIElQIFBheWxvYWQgQ29tcHJlc3Npb24gUHJvdG9jb2wgKi8KKyNkZWZpbmUgSVBfUFJPVE9DT0xfTDJUUCAgICAgICAgMHg3MyAgICAvKiBMYXllciBUd28gVHVubmVsaW5nIFByb3RvY29sIFZlcnNpb24gMyAqLworI2RlZmluZSBJUF9QUk9UT0NPTF9TTVAgICAgICAgICAweDc5ICAgIC8qIFNpbXBsZSBNZXNzYWdlIFByb3RvY29sICovCisjZGVmaW5lIElQX1BST1RPQ09MX1NDVFAgICAgICAgIDB4ODQgICAgLyogU3RyZWFtIENvbnRyb2wgVHJhbnNtaXNzaW9uIFByb3RvY29sICovCisjZGVmaW5lIElQX1BST1RPQ09MX1NISU02ICAgICAgIDB4OEMgICAgLyogU2l0ZSBNdWx0aWhvbWluZyBieSBJUHY2IEludGVybWVkaWF0aW9uICovCisKKy8qIElQdjYgSUNNUCB0eXBlcyAqLworI2RlZmluZSBJUFY2X0lDTVBfVFlQRV9NTEQgMHg4RgorCisjZW5kaWYgLyogX0lQX1BST1RfX0hfICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL2lwdjQuaCBiL3RhcmdldC9pbmMvaXB2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZWIzMzcKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL2lwdjQuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfSVBWNF9fSF8KKyNkZWZpbmUgX0lQVjRfX0hfCisKKyNpZiBkZWZpbmVkKEFUSF9UQVJHRVQpCisjaW5jbHVkZSA8b3NhcGkuaD4gICAgICAgICAgICAgIC8qIEFfVUlOVDggKi8KKyNlbHNlCisjaW5jbHVkZSA8YV90eXBlcy5oPiAgICAgICAgICAgIC8qIEFfVUlOVDggKi8KKyNlbmRpZgorCisjZGVmaW5lIElQVjRfQUREUl9MRU4gNCAgICAgICAgIC8qIGJ5dGVzICovCitzdHJ1Y3QgaXB2NF9oZHJfdCB7CisJQV9VSU5UOCB2ZXJfaGRybGVuOyAgICAgLyogdmVyc2lvbiBhbmQgaGRyIGxlbmd0aCAqLworCUFfVUlOVDggdG9zOyAgICAgICAgICAgIC8qIHR5cGUgb2Ygc2VydmljZSAqLworCUFfVUlOVDggbGVuWzJdOyAgICAgICAgIC8qIHRvdGFsIGxlbmd0aCAqLworCUFfVUlOVDggaWRbMl07CisJQV9VSU5UOCBmbGFnc19mcmFnb2ZmWzJdOyAgICAgICAvKiBmbGFncyBhbmQgZnJhZ21lbnQgb2Zmc2V0IGZpZWxkICovCisJQV9VSU5UOCB0dGw7ICAgICAgICAgICAgLyogdGltZSB0byBsaXZlICovCisJQV9VSU5UOCBwcm90b2NvbDsKKwlBX1VJTlQ4IGhkcl9jaGVja3N1bVsyXTsKKwlBX1VJTlQ4IHNyY19hZGRyW0lQVjRfQUREUl9MRU5dOworCUFfVUlOVDggZHN0X2FkZHJbSVBWNF9BRERSX0xFTl07Cit9OworCisjZGVmaW5lIElQVjRfSERSX0xFTiAoc2l6ZW9mKHN0cnVjdCBpcHY0X2hkcl90KSkKKyNkZWZpbmUgSVBWNF9IRFJfT0ZGU0VUX1BST1RPQ09MIChvZmZzZXRvZihzdHJ1Y3QgaXB2NF9oZHJfdCwgcHJvdG9jb2wpKQorI2RlZmluZSBJUFY0X0hEUl9PRkZTRVRfRFNUX0FERFIgKG9mZnNldG9mKHN0cnVjdCBpcHY0X2hkcl90LCBkc3RfYWRkclswXSkpCisKKyNlbmRpZiAvKiBfSVBWNF9fSF8gKi8KZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvb2xfZndfdHhfZGJnLmggYi90YXJnZXQvaW5jL29sX2Z3X3R4X2RiZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzAzYjcKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL29sX2Z3X3R4X2RiZy5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIEBmaWxlIG9sX2Z3X3R4X2RiZy5oCisgKgorICogQGRldGFpbHMgZGF0YSBzdHJ1Y3RzIHVzZWQgZm9yIHVwbG9hZGluZyBzdW1tYXJ5IGluZm8gYWJvdXQgdGhlIEZXJ3MgdHgKKyAqLworCisjaWZuZGVmIF9PTF9GV19UWF9EQkdfX0hfCisjZGVmaW5lIF9PTF9GV19UWF9EQkdfX0hfCisKKy8qCisgKiBVbmRlZiBBVEhfU1VQUE9SVF9GV19UWF9EQkcgdG8gcmVtb3ZlIHRoZSBGVyB0eCBkZWJ1ZyBmZWF0dXJlLgorICogUmVtb3ZpbmcgdGhlIEZXIHR4IGRlYnVnIGZlYXR1cmUgc2F2ZXMgYSBtb2Rlc3QgYW1vdW50IG9mIHByb2dyYW0gbWVtb3J5LgorICogVGhlIGRhdGEgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBGVyB0eCBkZWJ1ZyBmZWF0dXJlIGlzIGNvbnRyb2xsZWQKKyAqIGJ5IHRoZSBob3N0IC0tPiB0YXJnZXQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOyBldmVuIGlmCisgKiBBVEhfU1VQUE9SVF9GV19UWF9EQkcgaXMgZGVmaW5lZCwgbm8gZGF0YSBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yCisgKiB0aGUgRlcgdHggZGVidWcgbG9nIHVubGVzcyB0aGUgaG9zdCAtLT4gdGFyZ2V0IHJlc291cmNlIGNvbmZpZ3VyYXRpb24KKyAqIHNwZWNpZmllcyBpdC4KKyAqLworI2RlZmluZSBBVEhfU1VQUE9SVF9GV19UWF9EQkcgMSAvKiBlbmFibGVkICovCisvKiAjdW5kZWYgQVRIX1NVUFBPUlRfRldfVFhfREJHIC8gKiBkaXNhYmxlZCAqIC8gKi8KKworI2lmIGRlZmluZWQoQVRIX1RBUkdFVCkKKyNpbmNsdWRlIDxvc2FwaS5oPiAgICAgICAgICAgICAgLyogQV9VSU5UMzIgKi8KKyNlbHNlCisjaW5jbHVkZSA8YV90eXBlcy5oPiAgICAgICAgICAgIC8qIEFfVUlOVDMyICovCisjaW5jbHVkZSA8b3NkZXAuaD4gICAgICAgICAgICAgIC8qIFBSRVBBQ0ssIFBPU1RQQUNLICovCisjZW5kaWYKKworZW51bSBvbF9md190eF9kYmdfbG9nX21vZGUgeworCW9sX2Z3X3R4X2RiZ19sb2dfbW9kZV93cmFwYXJvdW5kLCAgICAgICAvKiBvdmVyd3JpdGUgb2xkIGRhdGEgd2l0aCBuZXcgKi8KKwlvbF9md190eF9kYmdfbG9nX21vZGVfc2luZ2xlLCAgIC8qIGZpbGwgbG9nIG9uY2UsIHRoZW4gc3RvcCAqLworfTsKKworLyoKKyAqIHR4IFBQRFUgc3RhdHMgdXBsb2FkIG1lc3NhZ2UgaGVhZGVyCisgKi8KK3N0cnVjdCBvbF9md190eF9kYmdfcHBkdV9tc2dfaGRyIHsKKwkvKiB3b3JkIDAgKi8KKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfSERSX05VTV9NUERVX0JZVEVTX1dPUkQgIDAKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfSERSX05VTV9NUERVX0JZVEVTX1MgICAgIDAKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfSERSX05VTV9NUERVX0JZVEVTX00gICAgIDB4MDAwMDAwZmYKKwlBX1VJTlQ4IG1wZHVfYnl0ZXNfYXJyYXlfbGVuOyAgIC8qIGxlbmd0aCBvZiBhcnJheSBvZiBwZXItTVBEVSBieXRlIGNvdW50cyAqLworCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX0hEUl9OVU1fTVNEVV9CWVRFU19XT1JEICAwCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX0hEUl9OVU1fTVNEVV9CWVRFU19TICAgICA4CisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX0hEUl9OVU1fTVNEVV9CWVRFU19NICAgICAweDAwMDBmZjAwCisJQV9VSU5UOCBtc2R1X2J5dGVzX2FycmF5X2xlbjsgICAvKiBsZW5ndGggb2YgYXJyYXkgb2YgcGVyLU1TRFUgYnl0ZSBjb3VudHMgKi8KKworI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9IRFJfTlVNX01QRFVfTVNEVVNfV09SRCAgMAorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9IRFJfTlVNX01QRFVfTVNEVVNfUyAgICAgMTYKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfSERSX05VTV9NUERVX01TRFVTX00gICAgIDB4MDBmZjAwMDAKKwlBX1VJTlQ4IG1wZHVfbXNkdXNfYXJyYXlfbGVuOyAgIC8qIGxlbmd0aCBvZiBhcnJheSBvZiBwZXItTVBEVSBNU0RVIGNvdW50cyAqLworCisJQV9VSU5UOCByZXNlcnZlZDsKKworCS8qIHdvcmQgMSAqLworI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9IRFJfTUlDUk9TRUNfUEVSX1RJQ0tfV09SRCAgMQorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9IRFJfTUlDUk9TRUNfUEVSX1RJQ0tfUyAgICAgMAorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9IRFJfTUlDUk9TRUNfUEVSX1RJQ0tfTSAgICAgMHhmZmZmZmZmZgorCUFfVUlOVDMyIG1pY3Jvc2VjX3Blcl90aWNrOyAgICAgLyogY29udmVyc2lvbiBmb3IgdGltZXN0YW1wIGVudHJpZXMgKi8KK307CisKKy8qCisgKiB0eCBQUERVIGxvZyBlbGVtZW50IC8gc3RhdHMgdXBsb2FkIG1lc3NhZ2UgZWxlbWVudAorICovCitzdHJ1Y3Qgb2xfZndfdHhfZGJnX3BwZHVfYmFzZSB7CisJLyogd29yZCAwIC0gZmlsbGVkIGluIGR1cmluZyB0eCBlbnF1ZXVlICovCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX1NUQVJUX1NFUV9OVU1fMTYgICAgMAorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9TVEFSVF9TRVFfTlVNX1MgICAgIDAKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfU1RBUlRfU0VRX05VTV9NICAgICAweDAwMDBmZmZmCisJQV9VSU5UMTYgc3RhcnRfc2VxX251bTsKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfU1RBUlRfUE5fTFNCU18xNiAgICAwCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX1NUQVJUX1BOX0xTQlNfUyAgICAgMTYKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfU1RBUlRfUE5fTFNCU19NICAgICAweGZmZmYwMDAwCisJQV9VSU5UMTYgc3RhcnRfcG5fbHNiczsKKworCS8qIHdvcmQgMSAtIGZpbGxlZCBpbiBkdXJpbmcgdHggZW5xdWV1ZSAqLworI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9OVU1fQllURVNfMTYgICAgICAgIDEKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfTlVNX0JZVEVTX1MgICAgICAgICAwCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX05VTV9CWVRFU19NICAgICAgICAgMHhmZmZmZmZmZgorCUFfVUlOVDMyIG51bV9ieXRlczsKKworCS8qIHdvcmQgMiAtIGZpbGxlZCBpbiBkdXJpbmcgdHggZW5xdWV1ZSAqLworI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9OVU1fTVNEVVNfMTYgICAgICAgIDIKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfTlVNX01TRFVTX1MgICAgICAgICAwCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX05VTV9NU0RVU19NICAgICAgICAgMHgwMDAwMDBmZgorCUFfVUlOVDggbnVtX21zZHVzOworI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9OVU1fTVBEVVNfMTYgICAgICAgIDIKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfTlVNX01QRFVTX1MgICAgICAgICA4CisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX05VTV9NUERVU19NICAgICAgICAgMHgwMDAwZmYwMAorCUFfVUlOVDggbnVtX21wZHVzOworCUFfVUlOVDE2CisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX0VYVF9USURfMTYgICAgICAgICAgMgorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9FWFRfVElEX1MgICAgICAgICAgIDE2CisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX0VYVF9USURfTSAgICAgICAgICAgMHgwMDFmMDAwMAorCWV4dF90aWQgOiA1LAorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9QRUVSX0lEXzE2ICAgICAgICAgIDIKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfUEVFUl9JRF9TICAgICAgICAgICAyMQorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9QRUVSX0lEX00gICAgICAgICAgIDB4ZmZlMDAwMDAKKwlwZWVyX2lkIDogMTE7CisKKwkvKiB3b3JkIDMgLSBmaWxsZWQgaW4gZHVyaW5nIHR4IGVucXVldWUgKi8KKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfVElNRV9FTlFVRVVFXzE2ICAgICAzCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX1RJTUVfRU5RVUVVRV9TICAgICAgMAorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9USU1FX0VOUVVFVUVfTSAgICAgIDB4ZmZmZmZmZmYKKwlBX1VJTlQzMiB0aW1lc3RhbXBfZW5xdWV1ZTsKKworCS8qIHdvcmQgNCAtIGZpbGxlZCBpbiBkdXJpbmcgdHggY29tcGxldGlvbiAqLworI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9USU1FX0NPTVBMXzE2ICAgICAgIDQKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfVElNRV9DT01QTF9TICAgICAgICAwCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX1RJTUVfQ09NUExfTSAgICAgICAgMHhmZmZmZmZmZgorCUFfVUlOVDMyIHRpbWVzdGFtcF9jb21wbGV0aW9uOworCisJLyogd29yZCA1IC0gZmlsbGVkIGluIGR1cmluZyB0eCBjb21wbGV0aW9uICovCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX0JMT0NLX0FDS19MU0JTXzE2ICAgNQorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9CTE9DS19BQ0tfTFNCU19TICAgIDAKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfQkxPQ0tfQUNLX0xTQlNfTSAgICAweGZmZmZmZmZmCisJQV9VSU5UMzIgYmxvY2tfYWNrX2JpdG1hcF9sc2JzOworCisJLyogd29yZCA2IC0gZmlsbGVkIGluIGR1cmluZyB0eCBjb21wbGV0aW9uICovCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX0JMT0NLX0FDS19NU0JTXzE2ICAgNgorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9CTE9DS19BQ0tfTVNCU19TICAgIDAKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfQkxPQ0tfQUNLX01TQlNfTSAgICAweGZmZmZmZmZmCisJQV9VSU5UMzIgYmxvY2tfYWNrX2JpdG1hcF9tc2JzOworCisJLyogd29yZCA3IC0gZmlsbGVkIGluIGR1cmluZyB0eCBjb21wbGV0aW9uIChlbnF1ZXVlIHdvdWxkIHdvcmsgdG9vKSAqLworI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9FTlFVRVVFRF9MU0JTXzE2ICAgIDcKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfRU5RVUVVRURfTFNCU19TICAgICAwCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX0VOUVVFVUVEX0xTQlNfTSAgICAgMHhmZmZmZmZmZgorCUFfVUlOVDMyIGVucXVldWVkX2JpdG1hcF9sc2JzOworCisJLyogd29yZCA4IC0gZmlsbGVkIGluIGR1cmluZyB0eCBjb21wbGV0aW9uIChlbnF1ZXVlIHdvdWxkIHdvcmsgdG9vKSAqLworI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9FTlFVRVVFRF9NU0JTXzE2ICAgIDgKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfRU5RVUVVRURfTVNCU19TICAgICAwCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX0VOUVVFVUVEX01TQlNfTSAgICAgMHhmZmZmZmZmZgorCUFfVUlOVDMyIGVucXVldWVkX2JpdG1hcF9tc2JzOworCisJLyogd29yZCA5IC0gZmlsbGVkIGluIGR1cmluZyB0eCBjb21wbGV0aW9uICovCisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX1JBVEVfQ09ERV8xNiAgICAgICAgOQorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9SQVRFX0NPREVfUyAgICAgICAgIDAKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfUkFURV9DT0RFX00gICAgICAgICAweDAwMDAwMGZmCisJQV9VSU5UOCByYXRlX2NvZGU7CisjZGVmaW5lIE9MX0ZXX1RYX0RCR19QUERVX1JBVEVGTEFHU18xNiAgICAgICAgOQorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9SQVRFX0ZMQUdTX1MgICAgICAgIDgKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfUkFURV9GTEFHU19NICAgICAgICAweDAwMDBmZjAwCisJQV9VSU5UOCByYXRlX2ZsYWdzOyAgICAgLyogaW5jbHVkZXMgZHluYW1pYyBiYW5kd2lkdGggaW5mbyAqLworI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9UUklFU18xNiAgICAgICAgICAgIDkKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfVFJJRVNfUyAgICAgICAgICAgICAxNgorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9UUklFU19NICAgICAgICAgICAgIDB4MDBmZjAwMDAKKwlBX1VJTlQ4IHRyaWVzOworI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9DT01QTEVURV8xNiAgICAgICAgIDkKKyNkZWZpbmUgT0xfRldfVFhfREJHX1BQRFVfQ09NUExFVEVfUyAgICAgICAgICAyNAorI2RlZmluZSBPTF9GV19UWF9EQkdfUFBEVV9DT01QTEVURV9NICAgICAgICAgIDB4ZmYwMDAwMDAKKwlBX1VJTlQ4IGNvbXBsZXRlOworfTsKKworI2VuZGlmIC8qIF9PTF9GV19UWF9EQkdfX0hfICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL3J0Y19zb2NfcmVnLmggYi90YXJnZXQvaW5jL3J0Y19zb2NfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlODBiMQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9pbmMvcnRjX3NvY19yZWcuaApAQCAtMCwwICsxLDE5NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1JUQ19TT0NfUkVHX1JFR19IXworI2RlZmluZSBfUlRDX1NPQ19SRUdfUkVHX0hfCisKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUyAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX09GRlNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9TUEkyX1JTVF9NU0IgICAgICAgICAgIDMwCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1NQSTJfUlNUX0xTQiAgICAgICAgICAgMzAKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfU1BJMl9SU1RfTUFTSyAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1NQSTJfUlNUX0dFVCh4KSAgICAgICAgKCgoeCkgJiBTT0NfUkVTRVRfQ09OVFJPTF9TUEkyX1JTVF9NQVNLKSA+PiBTT0NfUkVTRVRfQ09OVFJPTF9TUEkyX1JTVF9MU0IpCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1NQSTJfUlNUX1NFVCh4KSAgICAgICAgKCgoeCkgPDwgU09DX1JFU0VUX0NPTlRST0xfU1BJMl9SU1RfTFNCKSAmIFNPQ19SRVNFVF9DT05UUk9MX1NQSTJfUlNUX01BU0spCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0kyU18xX1JTVF9NU0IgICAgICAgICAgMjkKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJTXzFfUlNUX0xTQiAgICAgICAgICAyOQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfMV9SU1RfTUFTSyAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJTXzFfUlNUX0dFVCh4KSAgICAgICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX0kyU18xX1JTVF9NQVNLKSA+PiBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfMV9SU1RfTFNCKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfMV9SU1RfU0VUKHgpICAgICAgICgoKHgpIDw8IFNPQ19SRVNFVF9DT05UUk9MX0kyU18xX1JTVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfSTJTXzFfUlNUX01BU0spCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0kyU18xX01CT1hfUlNUX01TQiAgICAgMjgKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJTXzFfTUJPWF9SU1RfTFNCICAgICAyOAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfMV9NQk9YX1JTVF9NQVNLICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJTXzFfTUJPWF9SU1RfR0VUKHgpICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX0kyU18xX01CT1hfUlNUX01BU0spID4+IFNPQ19SRVNFVF9DT05UUk9MX0kyU18xX01CT1hfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJTXzFfTUJPWF9SU1RfU0VUKHgpICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfMV9NQk9YX1JTVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfSTJTXzFfTUJPWF9SU1RfTUFTSykKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJDX1NMQVZFX1JTVF9NU0IgICAgICAyNworI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9JMkNfU0xBVkVfUlNUX0xTQiAgICAgIDI3CisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0kyQ19TTEFWRV9SU1RfTUFTSyAgICAgMHgwODAwMDAwMAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9JMkNfU0xBVkVfUlNUX0dFVCh4KSAgICgoKHgpICYgU09DX1JFU0VUX0NPTlRST0xfSTJDX1NMQVZFX1JTVF9NQVNLKSA+PiBTT0NfUkVTRVRfQ09OVFJPTF9JMkNfU0xBVkVfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJDX1NMQVZFX1JTVF9TRVQoeCkgICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9JMkNfU0xBVkVfUlNUX0xTQikgJiBTT0NfUkVTRVRfQ09OVFJPTF9JMkNfU0xBVkVfUlNUX01BU0spCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1VTQl9QSFlfQVJTVF9NU0IgICAgICAgMjYKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVVNCX1BIWV9BUlNUX0xTQiAgICAgICAyNgorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9VU0JfUEhZX0FSU1RfTUFTSyAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVVNCX1BIWV9BUlNUX0dFVCh4KSAgICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX1VTQl9QSFlfQVJTVF9NQVNLKSA+PiBTT0NfUkVTRVRfQ09OVFJPTF9VU0JfUEhZX0FSU1RfTFNCKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9VU0JfUEhZX0FSU1RfU0VUKHgpICAgICgoKHgpIDw8IFNPQ19SRVNFVF9DT05UUk9MX1VTQl9QSFlfQVJTVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfVVNCX1BIWV9BUlNUX01BU0spCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1VTQl9QSFlfUlNUX01TQiAgICAgICAgMjUKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVVNCX1BIWV9SU1RfTFNCICAgICAgICAyNQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9VU0JfUEhZX1JTVF9NQVNLICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVVNCX1BIWV9SU1RfR0VUKHgpICAgICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX1VTQl9QSFlfUlNUX01BU0spID4+IFNPQ19SRVNFVF9DT05UUk9MX1VTQl9QSFlfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVVNCX1BIWV9SU1RfU0VUKHgpICAgICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9VU0JfUEhZX1JTVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfVVNCX1BIWV9SU1RfTUFTSykKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVVNCX1JTVF9NU0IgICAgICAgICAgICAyNAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9VU0JfUlNUX0xTQiAgICAgICAgICAgIDI0CisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1VTQl9SU1RfTUFTSyAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9VU0JfUlNUX0dFVCh4KSAgICAgICAgICgoKHgpICYgU09DX1JFU0VUX0NPTlRST0xfVVNCX1JTVF9NQVNLKSA+PiBTT0NfUkVTRVRfQ09OVFJPTF9VU0JfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVVNCX1JTVF9TRVQoeCkgICAgICAgICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9VU0JfUlNUX0xTQikgJiBTT0NfUkVTRVRfQ09OVFJPTF9VU0JfUlNUX01BU0spCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX01NQUNfUlNUX01TQiAgICAgICAgICAgMjMKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfTU1BQ19SU1RfTFNCICAgICAgICAgICAyMworI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9NTUFDX1JTVF9NQVNLICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfTU1BQ19SU1RfR0VUKHgpICAgICAgICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX01NQUNfUlNUX01BU0spID4+IFNPQ19SRVNFVF9DT05UUk9MX01NQUNfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfTU1BQ19SU1RfU0VUKHgpICAgICAgICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9NTUFDX1JTVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfTU1BQ19SU1RfTUFTSykKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfTURJT19SU1RfTVNCICAgICAgICAgICAyMgorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9NRElPX1JTVF9MU0IgICAgICAgICAgIDIyCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX01ESU9fUlNUX01BU0sgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9NRElPX1JTVF9HRVQoeCkgICAgICAgICgoKHgpICYgU09DX1JFU0VUX0NPTlRST0xfTURJT19SU1RfTUFTSykgPj4gU09DX1JFU0VUX0NPTlRST0xfTURJT19SU1RfTFNCKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9NRElPX1JTVF9TRVQoeCkgICAgICAgICgoKHgpIDw8IFNPQ19SRVNFVF9DT05UUk9MX01ESU9fUlNUX0xTQikgJiBTT0NfUkVTRVRfQ09OVFJPTF9NRElPX1JTVF9NQVNLKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9HRTBfUlNUX01TQiAgICAgICAgICAgIDIxCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0dFMF9SU1RfTFNCICAgICAgICAgICAgMjEKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfR0UwX1JTVF9NQVNLICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0dFMF9SU1RfR0VUKHgpICAgICAgICAgKCgoeCkgJiBTT0NfUkVTRVRfQ09OVFJPTF9HRTBfUlNUX01BU0spID4+IFNPQ19SRVNFVF9DT05UUk9MX0dFMF9SU1RfTFNCKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9HRTBfUlNUX1NFVCh4KSAgICAgICAgICgoKHgpIDw8IFNPQ19SRVNFVF9DT05UUk9MX0dFMF9SU1RfTFNCKSAmIFNPQ19SRVNFVF9DT05UUk9MX0dFMF9SU1RfTUFTSykKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJTX1JTVF9NU0IgICAgICAgICAgICAyMAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfUlNUX0xTQiAgICAgICAgICAgIDIwCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0kyU19SU1RfTUFTSyAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfUlNUX0dFVCh4KSAgICAgICAgICgoKHgpICYgU09DX1JFU0VUX0NPTlRST0xfSTJTX1JTVF9NQVNLKSA+PiBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJTX1JTVF9TRVQoeCkgICAgICAgICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfUlNUX0xTQikgJiBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfUlNUX01BU0spCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0kyU19NQk9YX1JTVF9NU0IgICAgICAgMTkKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJTX01CT1hfUlNUX0xTQiAgICAgICAxOQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfTUJPWF9SU1RfTUFTSyAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfSTJTX01CT1hfUlNUX0dFVCh4KSAgICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX0kyU19NQk9YX1JTVF9NQVNLKSA+PiBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfTUJPWF9SU1RfTFNCKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9JMlNfTUJPWF9SU1RfU0VUKHgpICAgICgoKHgpIDw8IFNPQ19SRVNFVF9DT05UUk9MX0kyU19NQk9YX1JTVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfSTJTX01CT1hfUlNUX01BU0spCisvKiBUT0RPOiAqLworI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9DSEVDS1NVTV9BQ0NfUlNUX01TQiAgIDE4CisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0NIRUNLU1VNX0FDQ19SU1RfTFNCICAgMTgKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQ0hFQ0tTVU1fQUNDX1JTVF9NQVNLICAweDAwMDQwMDAwCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0NIRUNLU1VNX0FDQ19SU1RfR0VUKHgpICgoKHgpICYgU09DX1JFU0VUX0NPTlRST0xfQ0hFQ0tTVU1fQUNDX1JTVF9NQVNLKSA+PiBTT0NfUkVTRVRfQ09OVFJPTF9DSEVDS1NVTV9BQ0NfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQ0hFQ0tTVU1fQUNDX1JTVF9TRVQoeCkgKCgoeCkgPDwgU09DX1JFU0VUX0NPTlRST0xfQ0hFQ0tTVU1fQUNDX1JTVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfQ0hFQ0tTVU1fQUNDX1JTVF9NQVNLKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9DRV9SU1RfTVNCICAgICAgICAgICAgIDE4CisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0NFX1JTVF9MU0IgICAgICAgICAgICAgMTgKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQ0VfUlNUX01BU0sgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0NFX1JTVF9HRVQoeCkgICAgICAgICAgKCgoeCkgJiBTT0NfUkVTRVRfQ09OVFJPTF9DRV9SU1RfTUFTSykgPj4gU09DX1JFU0VUX0NPTlRST0xfQ0VfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQ0VfUlNUX1NFVCh4KSAgICAgICAgICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9DRV9SU1RfTFNCKSAmIFNPQ19SRVNFVF9DT05UUk9MX0NFX1JTVF9NQVNLKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9VQVJUMl9SU1RfTVNCICAgICAgICAgIDE3CisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1VBUlQyX1JTVF9MU0IgICAgICAgICAgMTcKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVUFSVDJfUlNUX01BU0sgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1VBUlQyX1JTVF9HRVQoeCkgICAgICAgKCgoeCkgJiBTT0NfUkVTRVRfQ09OVFJPTF9VQVJUMl9SU1RfTUFTSykgPj4gU09DX1JFU0VUX0NPTlRST0xfVUFSVDJfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVUFSVDJfUlNUX1NFVCh4KSAgICAgICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9VQVJUMl9SU1RfTFNCKSAmIFNPQ19SRVNFVF9DT05UUk9MX1VBUlQyX1JTVF9NQVNLKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9ERUJVR19VQVJUX1JTVF9NU0IgICAgIDE2CisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0RFQlVHX1VBUlRfUlNUX0xTQiAgICAgMTYKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfREVCVUdfVUFSVF9SU1RfTUFTSyAgICAweDAwMDEwMDAwCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0RFQlVHX1VBUlRfUlNUX0dFVCh4KSAgKCgoeCkgJiBTT0NfUkVTRVRfQ09OVFJPTF9ERUJVR19VQVJUX1JTVF9NQVNLKSA+PiBTT0NfUkVTRVRfQ09OVFJPTF9ERUJVR19VQVJUX1JTVF9MU0IpCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0RFQlVHX1VBUlRfUlNUX1NFVCh4KSAgKCgoeCkgPDwgU09DX1JFU0VUX0NPTlRST0xfREVCVUdfVUFSVF9SU1RfTFNCKSAmIFNPQ19SRVNFVF9DT05UUk9MX0RFQlVHX1VBUlRfUlNUX01BU0spCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0NQVV9JTklUX1JFU0VUX01TQiAgICAgMTEKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQ1BVX0lOSVRfUkVTRVRfTFNCICAgICAxMQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9DUFVfSU5JVF9SRVNFVF9NQVNLICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQ1BVX0lOSVRfUkVTRVRfR0VUKHgpICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX0NQVV9JTklUX1JFU0VUX01BU0spID4+IFNPQ19SRVNFVF9DT05UUk9MX0NQVV9JTklUX1JFU0VUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQ1BVX0lOSVRfUkVTRVRfU0VUKHgpICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9DUFVfSU5JVF9SRVNFVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfQ1BVX0lOSVRfUkVTRVRfTUFTSykKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfUlNUX09VVF9NU0IgICAgICAgICAgICA5CisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1JTVF9PVVRfTFNCICAgICAgICAgICAgOQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9SU1RfT1VUX01BU0sgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfUlNUX09VVF9HRVQoeCkgICAgICAgICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX1JTVF9PVVRfTUFTSykgPj4gU09DX1JFU0VUX0NPTlRST0xfUlNUX09VVF9MU0IpCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1JTVF9PVVRfU0VUKHgpICAgICAgICAgKCgoeCkgPDwgU09DX1JFU0VUX0NPTlRST0xfUlNUX09VVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfUlNUX09VVF9NQVNLKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9NU0IgICAgICAgICAgIDgKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQ09MRF9SU1RfTFNCICAgICAgICAgICA4CisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0NPTERfUlNUX01BU0sgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9HRVQoeCkgICAgICAgICgoKHgpICYgU09DX1JFU0VUX0NPTlRST0xfQ09MRF9SU1RfTUFTSykgPj4gU09DX1JFU0VUX0NPTlRST0xfQ09MRF9SU1RfTFNCKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9TRVQoeCkgICAgICAgICgoKHgpIDw8IFNPQ19SRVNFVF9DT05UUk9MX0NPTERfUlNUX0xTQikgJiBTT0NfUkVTRVRfQ09OVFJPTF9DT0xEX1JTVF9NQVNLKQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9DUFVfV0FSTV9SU1RfTVNCICAgICAgIDYKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfQ1BVX1dBUk1fUlNUX0xTQiAgICAgICA2CisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9NQVNLICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9DUFVfV0FSTV9SU1RfR0VUKHgpICAgICgoKHgpICYgU09DX1JFU0VUX0NPTlRST0xfQ1BVX1dBUk1fUlNUX01BU0spID4+IFNPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9MU0IpCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX0NQVV9XQVJNX1JTVF9TRVQoeCkgICAgKCgoeCkgPDwgU09DX1JFU0VUX0NPTlRST0xfQ1BVX1dBUk1fUlNUX0xTQikgJiBTT0NfUkVTRVRfQ09OVFJPTF9DUFVfV0FSTV9SU1RfTUFTSykKKy8qIFRPRE86ICovCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTVNCIDIKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9MU0IgMgorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX01BU0sgMHgwMDAwMDAwNAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9QQ0lFX1JTVF9TSE9SVF9PVlJEX0dFVCh4KSAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTUFTSykgPj4gU09DX1JFU0VUX0NPTlRST0xfUENJRV9SU1RfU0hPUlRfT1ZSRF9MU0IpCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfU0VUKHgpICgoKHgpIDw8IFNPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTFNCKSAmIFNPQ19SRVNFVF9DT05UUk9MX1BDSUVfUlNUX1NIT1JUX09WUkRfTUFTSykKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfTVNCICAgICAgICAgICAyCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX01CT1hfUlNUX0xTQiAgICAgICAgICAgMgorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfR0VUKHgpICAgICAgICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX01CT1hfUlNUX01BU0spID4+IFNPQ19SRVNFVF9DT05UUk9MX01CT1hfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfU0VUKHgpICAgICAgICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9NQk9YX1JTVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfTUJPWF9SU1RfTUFTSykKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVUFSVF9SU1RfTVNCICAgICAgICAgICAxCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1VBUlRfUlNUX0xTQiAgICAgICAgICAgMQorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9VQVJUX1JTVF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVUFSVF9SU1RfR0VUKHgpICAgICAgICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX1VBUlRfUlNUX01BU0spID4+IFNPQ19SRVNFVF9DT05UUk9MX1VBUlRfUlNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfVUFSVF9SU1RfU0VUKHgpICAgICAgICAoKCh4KSA8PCBTT0NfUkVTRVRfQ09OVFJPTF9VQVJUX1JTVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfVUFSVF9SU1RfTUFTSykKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NU0IgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1NJMF9SU1RfTFNCICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9HRVQoeCkgICAgICAgICAoKCh4KSAmIFNPQ19SRVNFVF9DT05UUk9MX1NJMF9SU1RfTUFTSykgPj4gU09DX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9MU0IpCisjZGVmaW5lIFNPQ19SRVNFVF9DT05UUk9MX1NJMF9SU1RfU0VUKHgpICAgICAgICAgKCgoeCkgPDwgU09DX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9MU0IpICYgU09DX1JFU0VUX0NPTlRST0xfU0kwX1JTVF9NQVNLKQorCisjZGVmaW5lIFNPQ19UQ1hPX0RFVEVDVF9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTT0NfVENYT19ERVRFQ1RfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU09DX1RDWE9fREVURUNUX1BSRVNFTlRfTVNCICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19UQ1hPX0RFVEVDVF9QUkVTRU5UX0xTQiAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfVENYT19ERVRFQ1RfUFJFU0VOVF9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX1RDWE9fREVURUNUX1BSRVNFTlRfR0VUKHgpICAgICAgICAgICAoKCh4KSAmIFNPQ19UQ1hPX0RFVEVDVF9QUkVTRU5UX01BU0spID4+IFNPQ19UQ1hPX0RFVEVDVF9QUkVTRU5UX0xTQikKKyNkZWZpbmUgU09DX1RDWE9fREVURUNUX1BSRVNFTlRfU0VUKHgpICAgICAgICAgICAoKCh4KSA8PCBTT0NfVENYT19ERVRFQ1RfUFJFU0VOVF9MU0IpICYgU09DX1RDWE9fREVURUNUX1BSRVNFTlRfTUFTSykKKworI2RlZmluZSBTT0NfWFRBTF9URVNUX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgU09DX1hUQUxfVEVTVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFNPQ19YVEFMX1RFU1RfTk9UQ1hPREVUX01TQiAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfWFRBTF9URVNUX05PVENYT0RFVF9MU0IgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX1hUQUxfVEVTVF9OT1RDWE9ERVRfTUFTSyAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNPQ19YVEFMX1RFU1RfTk9UQ1hPREVUX0dFVCh4KSAgICAgICAgICAgKCgoeCkgJiBTT0NfWFRBTF9URVNUX05PVENYT0RFVF9NQVNLKSA+PiBTT0NfWFRBTF9URVNUX05PVENYT0RFVF9MU0IpCisjZGVmaW5lIFNPQ19YVEFMX1RFU1RfTk9UQ1hPREVUX1NFVCh4KSAgICAgICAgICAgKCgoeCkgPDwgU09DX1hUQUxfVEVTVF9OT1RDWE9ERVRfTFNCKSAmIFNPQ19YVEFMX1RFU1RfTk9UQ1hPREVUX01BU0spCisKKyNkZWZpbmUgU09DX0NQVV9DTE9DS19BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNPQ19DUFVfQ0xPQ0tfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01TQiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU09DX0NQVV9DTE9DS19TVEFOREFSRF9MU0IgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19DUFVfQ0xPQ0tfU1RBTkRBUkRfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0dFVCh4KSAgICAgICAgICAgICgoKHgpICYgU09DX0NQVV9DTE9DS19TVEFOREFSRF9NQVNLKSA+PiBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQikKKyNkZWZpbmUgU09DX0NQVV9DTE9DS19TVEFOREFSRF9TRVQoeCkgICAgICAgICAgICAoKCh4KSA8PCBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX0xTQikgJiBTT0NfQ1BVX0NMT0NLX1NUQU5EQVJEX01BU0spCisKKyNkZWZpbmUgU09DX0NMT0NLX0NPTlRST0xfQUREUkVTUyAgICAgICAgICAgICAgICAweDAwMDAwMDI4CisjZGVmaW5lIFNPQ19DTE9DS19DT05UUk9MX09GRlNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAyOAorI2RlZmluZSBTT0NfQ0xPQ0tfQ09OVFJPTF9VU0JfQ0xPQ0tfTVNCICAgICAgICAgIDMKKyNkZWZpbmUgU09DX0NMT0NLX0NPTlRST0xfVVNCX0NMT0NLX0xTQiAgICAgICAgICAzCisjZGVmaW5lIFNPQ19DTE9DS19DT05UUk9MX1VTQl9DTE9DS19NQVNLICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTT0NfQ0xPQ0tfQ09OVFJPTF9VU0JfQ0xPQ0tfR0VUKHgpICAgICAgICgoKHgpICYgU09DX0NMT0NLX0NPTlRST0xfVVNCX0NMT0NLX01BU0spID4+IFNPQ19DTE9DS19DT05UUk9MX1VTQl9DTE9DS19MU0IpCisjZGVmaW5lIFNPQ19DTE9DS19DT05UUk9MX1VTQl9DTE9DS19TRVQoeCkgICAgICAgKCgoeCkgPDwgU09DX0NMT0NLX0NPTlRST0xfVVNCX0NMT0NLX0xTQikgJiBTT0NfQ0xPQ0tfQ09OVFJPTF9VU0JfQ0xPQ0tfTUFTSykKKyNkZWZpbmUgU09DX0NMT0NLX0NPTlRST0xfTEZfQ0xLMzJfTVNCICAgICAgICAgICAyCisjZGVmaW5lIFNPQ19DTE9DS19DT05UUk9MX0xGX0NMSzMyX0xTQiAgICAgICAgICAgMgorI2RlZmluZSBTT0NfQ0xPQ0tfQ09OVFJPTF9MRl9DTEszMl9NQVNLICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU09DX0NMT0NLX0NPTlRST0xfTEZfQ0xLMzJfR0VUKHgpICAgICAgICAoKCh4KSAmIFNPQ19DTE9DS19DT05UUk9MX0xGX0NMSzMyX01BU0spID4+IFNPQ19DTE9DS19DT05UUk9MX0xGX0NMSzMyX0xTQikKKyNkZWZpbmUgU09DX0NMT0NLX0NPTlRST0xfTEZfQ0xLMzJfU0VUKHgpICAgICAgICAoKCh4KSA8PCBTT0NfQ0xPQ0tfQ09OVFJPTF9MRl9DTEszMl9MU0IpICYgU09DX0NMT0NLX0NPTlRST0xfTEZfQ0xLMzJfTUFTSykKKyNkZWZpbmUgU09DX0NMT0NLX0NPTlRST0xfU0kwX0NMS19NU0IgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19DTE9DS19DT05UUk9MX1NJMF9DTEtfTFNCICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfQ0xPQ0tfQ09OVFJPTF9TSTBfQ0xLX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX0NMT0NLX0NPTlRST0xfU0kwX0NMS19HRVQoeCkgICAgICAgICAoKCh4KSAmIFNPQ19DTE9DS19DT05UUk9MX1NJMF9DTEtfTUFTSykgPj4gU09DX0NMT0NLX0NPTlRST0xfU0kwX0NMS19MU0IpCisjZGVmaW5lIFNPQ19DTE9DS19DT05UUk9MX1NJMF9DTEtfU0VUKHgpICAgICAgICAgKCgoeCkgPDwgU09DX0NMT0NLX0NPTlRST0xfU0kwX0NMS19MU0IpICYgU09DX0NMT0NLX0NPTlRST0xfU0kwX0NMS19NQVNLKQorCisjZGVmaW5lIFNPQ19XRFRfQ09OVFJPTF9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzMAorI2RlZmluZSBTT0NfV0RUX0NPTlRST0xfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzAKKyNkZWZpbmUgU09DX1dEVF9DT05UUk9MX0FDVElPTl9NU0IgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNPQ19XRFRfQ09OVFJPTF9BQ1RJT05fTFNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfV0RUX0NPTlRST0xfQUNUSU9OX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgU09DX1dEVF9DT05UUk9MX0FDVElPTl9HRVQoeCkgICAgICAgICAgICAoKCh4KSAmIFNPQ19XRFRfQ09OVFJPTF9BQ1RJT05fTUFTSykgPj4gU09DX1dEVF9DT05UUk9MX0FDVElPTl9MU0IpCisjZGVmaW5lIFNPQ19XRFRfQ09OVFJPTF9BQ1RJT05fU0VUKHgpICAgICAgICAgICAgKCgoeCkgPDwgU09DX1dEVF9DT05UUk9MX0FDVElPTl9MU0IpICYgU09DX1dEVF9DT05UUk9MX0FDVElPTl9NQVNLKQorCisjZGVmaW5lIFNPQ19XRFRfU1RBVFVTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzNAorI2RlZmluZSBTT0NfV0RUX1NUQVRVU19PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzQKKyNkZWZpbmUgU09DX1dEVF9TVEFUVVNfSU5URVJSVVBUX01TQiAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19XRFRfU1RBVFVTX0lOVEVSUlVQVF9MU0IgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfV0RUX1NUQVRVU19JTlRFUlJVUFRfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX1dEVF9TVEFUVVNfSU5URVJSVVBUX0dFVCh4KSAgICAgICAgICAoKCh4KSAmIFNPQ19XRFRfU1RBVFVTX0lOVEVSUlVQVF9NQVNLKSA+PiBTT0NfV0RUX1NUQVRVU19JTlRFUlJVUFRfTFNCKQorI2RlZmluZSBTT0NfV0RUX1NUQVRVU19JTlRFUlJVUFRfU0VUKHgpICAgICAgICAgICgoKHgpIDw8IFNPQ19XRFRfU1RBVFVTX0lOVEVSUlVQVF9MU0IpICYgU09DX1dEVF9TVEFUVVNfSU5URVJSVVBUX01BU0spCisKKyNkZWZpbmUgU09DX1dEVF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDM4CisjZGVmaW5lIFNPQ19XRFRfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzOAorI2RlZmluZSBTT0NfV0RUX1RBUkdFVF9NU0IgICAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIFNPQ19XRFRfVEFSR0VUX0xTQiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfV0RUX1RBUkdFVF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAzZmZmZmYKKyNkZWZpbmUgU09DX1dEVF9UQVJHRVRfR0VUKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19XRFRfVEFSR0VUX01BU0spID4+IFNPQ19XRFRfVEFSR0VUX0xTQikKKyNkZWZpbmUgU09DX1dEVF9UQVJHRVRfU0VUKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfV0RUX1RBUkdFVF9MU0IpICYgU09DX1dEVF9UQVJHRVRfTUFTSykKKworI2RlZmluZSBTT0NfV0RUX0NPVU5UX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwM2MKKyNkZWZpbmUgU09DX1dEVF9DT1VOVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDNjCisjZGVmaW5lIFNPQ19XRFRfQ09VTlRfVkFMVUVfTVNCICAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgU09DX1dEVF9DT1VOVF9WQUxVRV9MU0IgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19XRFRfQ09VTlRfVkFMVUVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDNmZmZmZgorI2RlZmluZSBTT0NfV0RUX0NPVU5UX1ZBTFVFX0dFVCh4KSAgICAgICAgICAgICAgICgoKHgpICYgU09DX1dEVF9DT1VOVF9WQUxVRV9NQVNLKSA+PiBTT0NfV0RUX0NPVU5UX1ZBTFVFX0xTQikKKyNkZWZpbmUgU09DX1dEVF9DT1VOVF9WQUxVRV9TRVQoeCkgICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfV0RUX0NPVU5UX1ZBTFVFX0xTQikgJiBTT0NfV0RUX0NPVU5UX1ZBTFVFX01BU0spCisKKyNkZWZpbmUgU09DX1dEVF9SRVNFVF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFNPQ19XRFRfUkVTRVRfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTT0NfV0RUX1JFU0VUX1ZBTFVFX01TQiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX1dEVF9SRVNFVF9WQUxVRV9MU0IgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19XRFRfUkVTRVRfVkFMVUVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTT0NfV0RUX1JFU0VUX1ZBTFVFX0dFVCh4KSAgICAgICAgICAgICAgICgoKHgpICYgU09DX1dEVF9SRVNFVF9WQUxVRV9NQVNLKSA+PiBTT0NfV0RUX1JFU0VUX1ZBTFVFX0xTQikKKyNkZWZpbmUgU09DX1dEVF9SRVNFVF9WQUxVRV9TRVQoeCkgICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfV0RUX1JFU0VUX1ZBTFVFX0xTQikgJiBTT0NfV0RUX1JFU0VUX1ZBTFVFX01BU0spCisKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQ0CisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0NAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19NQUNfNF9NU0IgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BQ180X0xTQiAgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTUFDXzRfTUFTSyAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BQ180X0dFVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiBTT0NfSU5UX1NUQVRVU19NQUNfNF9NQVNLKSA+PiBTT0NfSU5UX1NUQVRVU19NQUNfNF9MU0IpCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BQ180X1NFVCh4KSAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX0lOVF9TVEFUVVNfTUFDXzRfTFNCKSAmIFNPQ19JTlRfU1RBVFVTX01BQ180X01BU0spCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BQ18zX01TQiAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTUFDXzNfTFNCICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19NQUNfM19NQVNLICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTUFDXzNfR0VUKHgpICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19JTlRfU1RBVFVTX01BQ18zX01BU0spID4+IFNPQ19JTlRfU1RBVFVTX01BQ18zX0xTQikKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTUFDXzNfU0VUKHgpICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfSU5UX1NUQVRVU19NQUNfM19MU0IpICYgU09DX0lOVF9TVEFUVVNfTUFDXzNfTUFTSykKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTUFDXzJfTVNCICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19NQUNfMl9MU0IgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BQ18yX01BU0sgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19NQUNfMl9HRVQoeCkgICAgICAgICAgICAgICgoKHgpICYgU09DX0lOVF9TVEFUVVNfTUFDXzJfTUFTSykgPj4gU09DX0lOVF9TVEFUVVNfTUFDXzJfTFNCKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19NQUNfMl9TRVQoeCkgICAgICAgICAgICAgICgoKHgpIDw8IFNPQ19JTlRfU1RBVFVTX01BQ18yX0xTQikgJiBTT0NfSU5UX1NUQVRVU19NQUNfMl9NQVNLKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19NQUNfMV9NU0IgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BQ18xX0xTQiAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTUFDXzFfTUFTSyAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BQ18xX0dFVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiBTT0NfSU5UX1NUQVRVU19NQUNfMV9NQVNLKSA+PiBTT0NfSU5UX1NUQVRVU19NQUNfMV9MU0IpCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BQ18xX1NFVCh4KSAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX0lOVF9TVEFUVVNfTUFDXzFfTFNCKSAmIFNPQ19JTlRfU1RBVFVTX01BQ18xX01BU0spCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1VTQkRNQV9NU0IgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfVVNCRE1BX0xTQiAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19VU0JETUFfTUFTSyAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfVVNCRE1BX0dFVCh4KSAgICAgICAgICAgICAoKCh4KSAmIFNPQ19JTlRfU1RBVFVTX1VTQkRNQV9NQVNLKSA+PiBTT0NfSU5UX1NUQVRVU19VU0JETUFfTFNCKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19VU0JETUFfU0VUKHgpICAgICAgICAgICAgICgoKHgpIDw8IFNPQ19JTlRfU1RBVFVTX1VTQkRNQV9MU0IpICYgU09DX0lOVF9TVEFUVVNfVVNCRE1BX01BU0spCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1VTQklQX01TQiAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfVVNCSVBfTFNCICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19VU0JJUF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfVVNCSVBfR0VUKHgpICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19JTlRfU1RBVFVTX1VTQklQX01BU0spID4+IFNPQ19JTlRfU1RBVFVTX1VTQklQX0xTQikKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfVVNCSVBfU0VUKHgpICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfSU5UX1NUQVRVU19VU0JJUF9MU0IpICYgU09DX0lOVF9TVEFUVVNfVVNCSVBfTUFTSykKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfVEhFUk1fTVNCICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBTT0NfSU5UX1NUQVRVU19USEVSTV9MU0IgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1RIRVJNX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19USEVSTV9HRVQoeCkgICAgICAgICAgICAgICgoKHgpICYgU09DX0lOVF9TVEFUVVNfVEhFUk1fTUFTSykgPj4gU09DX0lOVF9TVEFUVVNfVEhFUk1fTFNCKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19USEVSTV9TRVQoeCkgICAgICAgICAgICAgICgoKHgpIDw8IFNPQ19JTlRfU1RBVFVTX1RIRVJNX0xTQikgJiBTT0NfSU5UX1NUQVRVU19USEVSTV9NQVNLKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19FRlVTRV9PVkVSV1JJVEVfTVNCICAgICAgIDE2CisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0VGVVNFX09WRVJXUklURV9MU0IgICAgICAgMTYKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfRUZVU0VfT1ZFUldSSVRFX01BU0sgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0VGVVNFX09WRVJXUklURV9HRVQoeCkgICAgKCgoeCkgJiBTT0NfSU5UX1NUQVRVU19FRlVTRV9PVkVSV1JJVEVfTUFTSykgPj4gU09DX0lOVF9TVEFUVVNfRUZVU0VfT1ZFUldSSVRFX0xTQikKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfRUZVU0VfT1ZFUldSSVRFX1NFVCh4KSAgICAoKCh4KSA8PCBTT0NfSU5UX1NUQVRVU19FRlVTRV9PVkVSV1JJVEVfTFNCKSAmIFNPQ19JTlRfU1RBVFVTX0VGVVNFX09WRVJXUklURV9NQVNLKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19SRE1BX01TQiAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1JETUFfTFNCICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfUkRNQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1JETUFfR0VUKHgpICAgICAgICAgICAgICAgKCgoeCkgJiBTT0NfSU5UX1NUQVRVU19SRE1BX01BU0spID4+IFNPQ19JTlRfU1RBVFVTX1JETUFfTFNCKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19SRE1BX1NFVCh4KSAgICAgICAgICAgICAgICgoKHgpIDw8IFNPQ19JTlRfU1RBVFVTX1JETUFfTFNCKSAmIFNPQ19JTlRfU1RBVFVTX1JETUFfTUFTSykKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfQlRDT0VYX01TQiAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19CVENPRVhfTFNCICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0JUQ09FWF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19CVENPRVhfR0VUKHgpICAgICAgICAgICAgICgoKHgpICYgU09DX0lOVF9TVEFUVVNfQlRDT0VYX01BU0spID4+IFNPQ19JTlRfU1RBVFVTX0JUQ09FWF9MU0IpCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0JUQ09FWF9TRVQoeCkgICAgICAgICAgICAgKCgoeCkgPDwgU09DX0lOVF9TVEFUVVNfQlRDT0VYX0xTQikgJiBTT0NfSU5UX1NUQVRVU19CVENPRVhfTUFTSykKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfUlRDX1BPV0VSX01TQiAgICAgICAgICAgICAxMworI2RlZmluZSBTT0NfSU5UX1NUQVRVU19SVENfUE9XRVJfTFNCICAgICAgICAgICAgIDEzCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1JUQ19QT1dFUl9NQVNLICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19SVENfUE9XRVJfR0VUKHgpICAgICAgICAgICgoKHgpICYgU09DX0lOVF9TVEFUVVNfUlRDX1BPV0VSX01BU0spID4+IFNPQ19JTlRfU1RBVFVTX1JUQ19QT1dFUl9MU0IpCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1JUQ19QT1dFUl9TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgU09DX0lOVF9TVEFUVVNfUlRDX1BPV0VSX0xTQikgJiBTT0NfSU5UX1NUQVRVU19SVENfUE9XRVJfTUFTSykKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTUFDX01TQiAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19NQUNfTFNCICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BQ19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19NQUNfR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgU09DX0lOVF9TVEFUVVNfTUFDX01BU0spID4+IFNPQ19JTlRfU1RBVFVTX01BQ19MU0IpCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BQ19TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX0lOVF9TVEFUVVNfTUFDX0xTQikgJiBTT0NfSU5UX1NUQVRVU19NQUNfTUFTSykKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTUFJTEJPWF9NU0IgICAgICAgICAgICAgICAxMQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19NQUlMQk9YX0xTQiAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX01BSUxCT1hfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19NQUlMQk9YX0dFVCh4KSAgICAgICAgICAgICgoKHgpICYgU09DX0lOVF9TVEFUVVNfTUFJTEJPWF9NQVNLKSA+PiBTT0NfSU5UX1NUQVRVU19NQUlMQk9YX0xTQikKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTUFJTEJPWF9TRVQoeCkgICAgICAgICAgICAoKCh4KSA8PCBTT0NfSU5UX1NUQVRVU19NQUlMQk9YX0xTQikgJiBTT0NfSU5UX1NUQVRVU19NQUlMQk9YX01BU0spCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1JUQ19BTEFSTV9NU0IgICAgICAgICAgICAgMTAKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfUlRDX0FMQVJNX0xTQiAgICAgICAgICAgICAxMAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19SVENfQUxBUk1fTUFTSyAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfUlRDX0FMQVJNX0dFVCh4KSAgICAgICAgICAoKCh4KSAmIFNPQ19JTlRfU1RBVFVTX1JUQ19BTEFSTV9NQVNLKSA+PiBTT0NfSU5UX1NUQVRVU19SVENfQUxBUk1fTFNCKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19SVENfQUxBUk1fU0VUKHgpICAgICAgICAgICgoKHgpIDw8IFNPQ19JTlRfU1RBVFVTX1JUQ19BTEFSTV9MU0IpICYgU09DX0lOVF9TVEFUVVNfUlRDX0FMQVJNX01BU0spCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0hGX1RJTUVSX01TQiAgICAgICAgICAgICAgOQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19IRl9USU1FUl9MU0IgICAgICAgICAgICAgIDkKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfSEZfVElNRVJfTUFTSyAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0hGX1RJTUVSX0dFVCh4KSAgICAgICAgICAgKCgoeCkgJiBTT0NfSU5UX1NUQVRVU19IRl9USU1FUl9NQVNLKSA+PiBTT0NfSU5UX1NUQVRVU19IRl9USU1FUl9MU0IpCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0hGX1RJTUVSX1NFVCh4KSAgICAgICAgICAgKCgoeCkgPDwgU09DX0lOVF9TVEFUVVNfSEZfVElNRVJfTFNCKSAmIFNPQ19JTlRfU1RBVFVTX0hGX1RJTUVSX01BU0spCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSM19NU0IgICAgICAgICAgICAgOAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjNfTFNCICAgICAgICAgICAgIDgKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTEZfVElNRVIzX01BU0sgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSM19HRVQoeCkgICAgICAgICAgKCgoeCkgJiBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjNfTUFTSykgPj4gU09DX0lOVF9TVEFUVVNfTEZfVElNRVIzX0xTQikKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTEZfVElNRVIzX1NFVCh4KSAgICAgICAgICAoKCh4KSA8PCBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjNfTFNCKSAmIFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSM19NQVNLKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjJfTVNCICAgICAgICAgICAgIDcKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTEZfVElNRVIyX0xTQiAgICAgICAgICAgICA3CisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSMl9NQVNLICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjJfR0VUKHgpICAgICAgICAgICgoKHgpICYgU09DX0lOVF9TVEFUVVNfTEZfVElNRVIyX01BU0spID4+IFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSMl9MU0IpCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSMl9TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgU09DX0lOVF9TVEFUVVNfTEZfVElNRVIyX0xTQikgJiBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjJfTUFTSykKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTEZfVElNRVIxX01TQiAgICAgICAgICAgICA2CisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSMV9MU0IgICAgICAgICAgICAgNgorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjFfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTEZfVElNRVIxX0dFVCh4KSAgICAgICAgICAoKCh4KSAmIFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSMV9NQVNLKSA+PiBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjFfTFNCKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjFfU0VUKHgpICAgICAgICAgICgoKHgpIDw8IFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSMV9MU0IpICYgU09DX0lOVF9TVEFUVVNfTEZfVElNRVIxX01BU0spCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSMF9NU0IgICAgICAgICAgICAgNQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjBfTFNCICAgICAgICAgICAgIDUKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTEZfVElNRVIwX01BU0sgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSMF9HRVQoeCkgICAgICAgICAgKCgoeCkgJiBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjBfTUFTSykgPj4gU09DX0lOVF9TVEFUVVNfTEZfVElNRVIwX0xTQikKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfTEZfVElNRVIwX1NFVCh4KSAgICAgICAgICAoKCh4KSA8PCBTT0NfSU5UX1NUQVRVU19MRl9USU1FUjBfTFNCKSAmIFNPQ19JTlRfU1RBVFVTX0xGX1RJTUVSMF9NQVNLKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19TSV9NU0IgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfU0lfTFNCICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1NJX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19TSV9HRVQoeCkgICAgICAgICAgICAgICAgICgoKHgpICYgU09DX0lOVF9TVEFUVVNfU0lfTUFTSykgPj4gU09DX0lOVF9TVEFUVVNfU0lfTFNCKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19TSV9TRVQoeCkgICAgICAgICAgICAgICAgICgoKHgpIDw8IFNPQ19JTlRfU1RBVFVTX1NJX0xTQikgJiBTT0NfSU5UX1NUQVRVU19TSV9NQVNLKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19HUElPX01TQiAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfR1BJT19MU0IgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0dQSU9fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19HUElPX0dFVCh4KSAgICAgICAgICAgICAgICgoKHgpICYgU09DX0lOVF9TVEFUVVNfR1BJT19NQVNLKSA+PiBTT0NfSU5UX1NUQVRVU19HUElPX0xTQikKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfR1BJT19TRVQoeCkgICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfSU5UX1NUQVRVU19HUElPX0xTQikgJiBTT0NfSU5UX1NUQVRVU19HUElPX01BU0spCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0RFQlVHX1VBUlRfTVNCICAgICAgICAgICAgMgorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19ERUJVR19VQVJUX0xTQiAgICAgICAgICAgIDIKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfREVCVUdfVUFSVF9NQVNLICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0RFQlVHX1VBUlRfR0VUKHgpICAgICAgICAgKCgoeCkgJiBTT0NfSU5UX1NUQVRVU19ERUJVR19VQVJUX01BU0spID4+IFNPQ19JTlRfU1RBVFVTX0RFQlVHX1VBUlRfTFNCKQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19ERUJVR19VQVJUX1NFVCh4KSAgICAgICAgICgoKHgpIDw8IFNPQ19JTlRfU1RBVFVTX0RFQlVHX1VBUlRfTFNCKSAmIFNPQ19JTlRfU1RBVFVTX0RFQlVHX1VBUlRfTUFTSykKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfRVJST1JfTVNCICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX0VSUk9SX0xTQiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19FUlJPUl9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfRVJST1JfR0VUKHgpICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19JTlRfU1RBVFVTX0VSUk9SX01BU0spID4+IFNPQ19JTlRfU1RBVFVTX0VSUk9SX0xTQikKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfRVJST1JfU0VUKHgpICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfSU5UX1NUQVRVU19FUlJPUl9MU0IpICYgU09DX0lOVF9TVEFUVVNfRVJST1JfTUFTSykKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfV0RUX0lOVF9NU0IgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1dEVF9JTlRfTFNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfSU5UX1NUQVRVU19XRFRfSU5UX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX0lOVF9TVEFUVVNfV0RUX0lOVF9HRVQoeCkgICAgICAgICAgICAoKCh4KSAmIFNPQ19JTlRfU1RBVFVTX1dEVF9JTlRfTUFTSykgPj4gU09DX0lOVF9TVEFUVVNfV0RUX0lOVF9MU0IpCisjZGVmaW5lIFNPQ19JTlRfU1RBVFVTX1dEVF9JTlRfU0VUKHgpICAgICAgICAgICAgKCgoeCkgPDwgU09DX0lOVF9TVEFUVVNfV0RUX0lOVF9MU0IpICYgU09DX0lOVF9TVEFUVVNfV0RUX0lOVF9NQVNLKQorCisjZGVmaW5lIFNPQ19MRl9USU1FUjBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0OAorI2RlZmluZSBTT0NfTEZfVElNRVIwX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDgKKyNkZWZpbmUgU09DX0xGX1RJTUVSMF9UQVJHRVRfTVNCICAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBTT0NfTEZfVElNRVIwX1RBUkdFVF9MU0IgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX0xGX1RJTUVSMF9UQVJHRVRfTUFTSyAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIFNPQ19MRl9USU1FUjBfVEFSR0VUX0dFVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiBTT0NfTEZfVElNRVIwX1RBUkdFVF9NQVNLKSA+PiBTT0NfTEZfVElNRVIwX1RBUkdFVF9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUjBfVEFSR0VUX1NFVCh4KSAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX0xGX1RJTUVSMF9UQVJHRVRfTFNCKSAmIFNPQ19MRl9USU1FUjBfVEFSR0VUX01BU0spCisKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPVU5UMF9BRERSRVNTICAgICAgICAgICAgICAweDAwMDAwMDRjCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT1VOVDBfT0ZGU0VUICAgICAgICAgICAgICAgMHgwMDAwMDA0YworI2RlZmluZSBTT0NfTEZfVElNRVJfQ09VTlQwX1ZBTFVFX01TQiAgICAgICAgICAgIDMxCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT1VOVDBfVkFMVUVfTFNCICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09VTlQwX1ZBTFVFX01BU0sgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPVU5UMF9WQUxVRV9HRVQoeCkgICAgICAgICAoKCh4KSAmIFNPQ19MRl9USU1FUl9DT1VOVDBfVkFMVUVfTUFTSykgPj4gU09DX0xGX1RJTUVSX0NPVU5UMF9WQUxVRV9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT1VOVDBfVkFMVUVfU0VUKHgpICAgICAgICAgKCgoeCkgPDwgU09DX0xGX1RJTUVSX0NPVU5UMF9WQUxVRV9MU0IpICYgU09DX0xGX1RJTUVSX0NPVU5UMF9WQUxVRV9NQVNLKQorCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMF9BRERSRVNTICAgICAgICAgICAgMHgwMDAwMDA1MAorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDBfT0ZGU0VUICAgICAgICAgICAgIDB4MDAwMDAwNTAKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wwX0VOQUJMRV9NU0IgICAgICAgICAyCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMF9FTkFCTEVfTFNCICAgICAgICAgMgorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDBfRU5BQkxFX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wwX0VOQUJMRV9HRVQoeCkgICAgICAoKCh4KSAmIFNPQ19MRl9USU1FUl9DT05UUk9MMF9FTkFCTEVfTUFTSykgPj4gU09DX0xGX1RJTUVSX0NPTlRST0wwX0VOQUJMRV9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMF9FTkFCTEVfU0VUKHgpICAgICAgKCgoeCkgPDwgU09DX0xGX1RJTUVSX0NPTlRST0wwX0VOQUJMRV9MU0IpICYgU09DX0xGX1RJTUVSX0NPTlRST0wwX0VOQUJMRV9NQVNLKQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDBfQVVUT19SRVNUQVJUX01TQiAgIDEKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wwX0FVVE9fUkVTVEFSVF9MU0IgICAxCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMF9BVVRPX1JFU1RBUlRfTUFTSyAgMHgwMDAwMDAwMgorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDBfQVVUT19SRVNUQVJUX0dFVCh4KSAoKCh4KSAmIFNPQ19MRl9USU1FUl9DT05UUk9MMF9BVVRPX1JFU1RBUlRfTUFTSykgPj4gU09DX0xGX1RJTUVSX0NPTlRST0wwX0FVVE9fUkVTVEFSVF9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMF9BVVRPX1JFU1RBUlRfU0VUKHgpICgoKHgpIDw8IFNPQ19MRl9USU1FUl9DT05UUk9MMF9BVVRPX1JFU1RBUlRfTFNCKSAmIFNPQ19MRl9USU1FUl9DT05UUk9MMF9BVVRPX1JFU1RBUlRfTUFTSykKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wwX1JFU0VUX01TQiAgICAgICAgICAwCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMF9SRVNFVF9MU0IgICAgICAgICAgMAorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDBfUkVTRVRfTUFTSyAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wwX1JFU0VUX0dFVCh4KSAgICAgICAoKCh4KSAmIFNPQ19MRl9USU1FUl9DT05UUk9MMF9SRVNFVF9NQVNLKSA+PiBTT0NfTEZfVElNRVJfQ09OVFJPTDBfUkVTRVRfTFNCKQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDBfUkVTRVRfU0VUKHgpICAgICAgICgoKHgpIDw8IFNPQ19MRl9USU1FUl9DT05UUk9MMF9SRVNFVF9MU0IpICYgU09DX0xGX1RJTUVSX0NPTlRST0wwX1JFU0VUX01BU0spCisKKyNkZWZpbmUgU09DX0xGX1RJTUVSX1NUQVRVUzBfQUREUkVTUyAgICAgICAgICAgICAweDAwMDAwMDU0CisjZGVmaW5lIFNPQ19MRl9USU1FUl9TVEFUVVMwX09GRlNFVCAgICAgICAgICAgICAgMHgwMDAwMDA1NAorI2RlZmluZSBTT0NfTEZfVElNRVJfU1RBVFVTMF9JTlRFUlJVUFRfTVNCICAgICAgIDAKKyNkZWZpbmUgU09DX0xGX1RJTUVSX1NUQVRVUzBfSU5URVJSVVBUX0xTQiAgICAgICAwCisjZGVmaW5lIFNPQ19MRl9USU1FUl9TVEFUVVMwX0lOVEVSUlVQVF9NQVNLICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTT0NfTEZfVElNRVJfU1RBVFVTMF9JTlRFUlJVUFRfR0VUKHgpICAgICgoKHgpICYgU09DX0xGX1RJTUVSX1NUQVRVUzBfSU5URVJSVVBUX01BU0spID4+IFNPQ19MRl9USU1FUl9TVEFUVVMwX0lOVEVSUlVQVF9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUl9TVEFUVVMwX0lOVEVSUlVQVF9TRVQoeCkgICAgKCgoeCkgPDwgU09DX0xGX1RJTUVSX1NUQVRVUzBfSU5URVJSVVBUX0xTQikgJiBTT0NfTEZfVElNRVJfU1RBVFVTMF9JTlRFUlJVUFRfTUFTSykKKworI2RlZmluZSBTT0NfTEZfVElNRVIxX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTgKKyNkZWZpbmUgU09DX0xGX1RJTUVSMV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDU4CisjZGVmaW5lIFNPQ19MRl9USU1FUjFfVEFSR0VUX01TQiAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgU09DX0xGX1RJTUVSMV9UQVJHRVRfTFNCICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19MRl9USU1FUjFfVEFSR0VUX01BU0sgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBTT0NfTEZfVElNRVIxX1RBUkdFVF9HRVQoeCkgICAgICAgICAgICAgICgoKHgpICYgU09DX0xGX1RJTUVSMV9UQVJHRVRfTUFTSykgPj4gU09DX0xGX1RJTUVSMV9UQVJHRVRfTFNCKQorI2RlZmluZSBTT0NfTEZfVElNRVIxX1RBUkdFVF9TRVQoeCkgICAgICAgICAgICAgICgoKHgpIDw8IFNPQ19MRl9USU1FUjFfVEFSR0VUX0xTQikgJiBTT0NfTEZfVElNRVIxX1RBUkdFVF9NQVNLKQorCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT1VOVDFfQUREUkVTUyAgICAgICAgICAgICAgMHgwMDAwMDA1YworI2RlZmluZSBTT0NfTEZfVElNRVJfQ09VTlQxX09GRlNFVCAgICAgICAgICAgICAgIDB4MDAwMDAwNWMKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPVU5UMV9WQUxVRV9NU0IgICAgICAgICAgICAzMQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09VTlQxX1ZBTFVFX0xTQiAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPVU5UMV9WQUxVRV9NQVNLICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT1VOVDFfVkFMVUVfR0VUKHgpICAgICAgICAgKCgoeCkgJiBTT0NfTEZfVElNRVJfQ09VTlQxX1ZBTFVFX01BU0spID4+IFNPQ19MRl9USU1FUl9DT1VOVDFfVkFMVUVfTFNCKQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09VTlQxX1ZBTFVFX1NFVCh4KSAgICAgICAgICgoKHgpIDw8IFNPQ19MRl9USU1FUl9DT1VOVDFfVkFMVUVfTFNCKSAmIFNPQ19MRl9USU1FUl9DT1VOVDFfVkFMVUVfTUFTSykKKworI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDFfQUREUkVTUyAgICAgICAgICAgIDB4MDAwMDAwNjAKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wxX09GRlNFVCAgICAgICAgICAgICAweDAwMDAwMDYwCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMV9FTkFCTEVfTVNCICAgICAgICAgMgorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDFfRU5BQkxFX0xTQiAgICAgICAgIDIKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wxX0VOQUJMRV9NQVNLICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMV9FTkFCTEVfR0VUKHgpICAgICAgKCgoeCkgJiBTT0NfTEZfVElNRVJfQ09OVFJPTDFfRU5BQkxFX01BU0spID4+IFNPQ19MRl9USU1FUl9DT05UUk9MMV9FTkFCTEVfTFNCKQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDFfRU5BQkxFX1NFVCh4KSAgICAgICgoKHgpIDw8IFNPQ19MRl9USU1FUl9DT05UUk9MMV9FTkFCTEVfTFNCKSAmIFNPQ19MRl9USU1FUl9DT05UUk9MMV9FTkFCTEVfTUFTSykKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wxX0FVVE9fUkVTVEFSVF9NU0IgICAxCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMV9BVVRPX1JFU1RBUlRfTFNCICAgMQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDFfQVVUT19SRVNUQVJUX01BU0sgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wxX0FVVE9fUkVTVEFSVF9HRVQoeCkgKCgoeCkgJiBTT0NfTEZfVElNRVJfQ09OVFJPTDFfQVVUT19SRVNUQVJUX01BU0spID4+IFNPQ19MRl9USU1FUl9DT05UUk9MMV9BVVRPX1JFU1RBUlRfTFNCKQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDFfQVVUT19SRVNUQVJUX1NFVCh4KSAoKCh4KSA8PCBTT0NfTEZfVElNRVJfQ09OVFJPTDFfQVVUT19SRVNUQVJUX0xTQikgJiBTT0NfTEZfVElNRVJfQ09OVFJPTDFfQVVUT19SRVNUQVJUX01BU0spCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMV9SRVNFVF9NU0IgICAgICAgICAgMAorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDFfUkVTRVRfTFNCICAgICAgICAgIDAKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wxX1JFU0VUX01BU0sgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMV9SRVNFVF9HRVQoeCkgICAgICAgKCgoeCkgJiBTT0NfTEZfVElNRVJfQ09OVFJPTDFfUkVTRVRfTUFTSykgPj4gU09DX0xGX1RJTUVSX0NPTlRST0wxX1JFU0VUX0xTQikKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wxX1JFU0VUX1NFVCh4KSAgICAgICAoKCh4KSA8PCBTT0NfTEZfVElNRVJfQ09OVFJPTDFfUkVTRVRfTFNCKSAmIFNPQ19MRl9USU1FUl9DT05UUk9MMV9SRVNFVF9NQVNLKQorCisjZGVmaW5lIFNPQ19MRl9USU1FUl9TVEFUVVMxX0FERFJFU1MgICAgICAgICAgICAgMHgwMDAwMDA2NAorI2RlZmluZSBTT0NfTEZfVElNRVJfU1RBVFVTMV9PRkZTRVQgICAgICAgICAgICAgIDB4MDAwMDAwNjQKKyNkZWZpbmUgU09DX0xGX1RJTUVSX1NUQVRVUzFfSU5URVJSVVBUX01TQiAgICAgICAwCisjZGVmaW5lIFNPQ19MRl9USU1FUl9TVEFUVVMxX0lOVEVSUlVQVF9MU0IgICAgICAgMAorI2RlZmluZSBTT0NfTEZfVElNRVJfU1RBVFVTMV9JTlRFUlJVUFRfTUFTSyAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX0xGX1RJTUVSX1NUQVRVUzFfSU5URVJSVVBUX0dFVCh4KSAgICAoKCh4KSAmIFNPQ19MRl9USU1FUl9TVEFUVVMxX0lOVEVSUlVQVF9NQVNLKSA+PiBTT0NfTEZfVElNRVJfU1RBVFVTMV9JTlRFUlJVUFRfTFNCKQorI2RlZmluZSBTT0NfTEZfVElNRVJfU1RBVFVTMV9JTlRFUlJVUFRfU0VUKHgpICAgICgoKHgpIDw8IFNPQ19MRl9USU1FUl9TVEFUVVMxX0lOVEVSUlVQVF9MU0IpICYgU09DX0xGX1RJTUVSX1NUQVRVUzFfSU5URVJSVVBUX01BU0spCisKKyNkZWZpbmUgU09DX0xGX1RJTUVSMl9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDY4CisjZGVmaW5lIFNPQ19MRl9USU1FUjJfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA2OAorI2RlZmluZSBTT0NfTEZfVElNRVIyX1RBUkdFVF9NU0IgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFNPQ19MRl9USU1FUjJfVEFSR0VUX0xTQiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfTEZfVElNRVIyX1RBUkdFVF9NQVNLICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgU09DX0xGX1RJTUVSMl9UQVJHRVRfR0VUKHgpICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19MRl9USU1FUjJfVEFSR0VUX01BU0spID4+IFNPQ19MRl9USU1FUjJfVEFSR0VUX0xTQikKKyNkZWZpbmUgU09DX0xGX1RJTUVSMl9UQVJHRVRfU0VUKHgpICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfTEZfVElNRVIyX1RBUkdFVF9MU0IpICYgU09DX0xGX1RJTUVSMl9UQVJHRVRfTUFTSykKKworI2RlZmluZSBTT0NfTEZfVElNRVJfQ09VTlQyX0FERFJFU1MgICAgICAgICAgICAgIDB4MDAwMDAwNmMKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPVU5UMl9PRkZTRVQgICAgICAgICAgICAgICAweDAwMDAwMDZjCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT1VOVDJfVkFMVUVfTVNCICAgICAgICAgICAgMzEKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPVU5UMl9WQUxVRV9MU0IgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT1VOVDJfVkFMVUVfTUFTSyAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09VTlQyX1ZBTFVFX0dFVCh4KSAgICAgICAgICgoKHgpICYgU09DX0xGX1RJTUVSX0NPVU5UMl9WQUxVRV9NQVNLKSA+PiBTT0NfTEZfVElNRVJfQ09VTlQyX1ZBTFVFX0xTQikKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPVU5UMl9WQUxVRV9TRVQoeCkgICAgICAgICAoKCh4KSA8PCBTT0NfTEZfVElNRVJfQ09VTlQyX1ZBTFVFX0xTQikgJiBTT0NfTEZfVElNRVJfQ09VTlQyX1ZBTFVFX01BU0spCisKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wyX0FERFJFU1MgICAgICAgICAgICAweDAwMDAwMDcwCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMl9PRkZTRVQgICAgICAgICAgICAgMHgwMDAwMDA3MAorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDJfRU5BQkxFX01TQiAgICAgICAgIDIKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wyX0VOQUJMRV9MU0IgICAgICAgICAyCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMl9FTkFCTEVfTUFTSyAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDJfRU5BQkxFX0dFVCh4KSAgICAgICgoKHgpICYgU09DX0xGX1RJTUVSX0NPTlRST0wyX0VOQUJMRV9NQVNLKSA+PiBTT0NfTEZfVElNRVJfQ09OVFJPTDJfRU5BQkxFX0xTQikKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wyX0VOQUJMRV9TRVQoeCkgICAgICAoKCh4KSA8PCBTT0NfTEZfVElNRVJfQ09OVFJPTDJfRU5BQkxFX0xTQikgJiBTT0NfTEZfVElNRVJfQ09OVFJPTDJfRU5BQkxFX01BU0spCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMl9BVVRPX1JFU1RBUlRfTVNCICAgMQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDJfQVVUT19SRVNUQVJUX0xTQiAgIDEKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wyX0FVVE9fUkVTVEFSVF9NQVNLICAweDAwMDAwMDAyCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMl9BVVRPX1JFU1RBUlRfR0VUKHgpICgoKHgpICYgU09DX0xGX1RJTUVSX0NPTlRST0wyX0FVVE9fUkVTVEFSVF9NQVNLKSA+PiBTT0NfTEZfVElNRVJfQ09OVFJPTDJfQVVUT19SRVNUQVJUX0xTQikKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wyX0FVVE9fUkVTVEFSVF9TRVQoeCkgKCgoeCkgPDwgU09DX0xGX1RJTUVSX0NPTlRST0wyX0FVVE9fUkVTVEFSVF9MU0IpICYgU09DX0xGX1RJTUVSX0NPTlRST0wyX0FVVE9fUkVTVEFSVF9NQVNLKQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDJfUkVTRVRfTVNCICAgICAgICAgIDAKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wyX1JFU0VUX0xTQiAgICAgICAgICAwCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMl9SRVNFVF9NQVNLICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDJfUkVTRVRfR0VUKHgpICAgICAgICgoKHgpICYgU09DX0xGX1RJTUVSX0NPTlRST0wyX1JFU0VUX01BU0spID4+IFNPQ19MRl9USU1FUl9DT05UUk9MMl9SRVNFVF9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MMl9SRVNFVF9TRVQoeCkgICAgICAgKCgoeCkgPDwgU09DX0xGX1RJTUVSX0NPTlRST0wyX1JFU0VUX0xTQikgJiBTT0NfTEZfVElNRVJfQ09OVFJPTDJfUkVTRVRfTUFTSykKKworI2RlZmluZSBTT0NfTEZfVElNRVJfU1RBVFVTMl9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDAwNzQKKyNkZWZpbmUgU09DX0xGX1RJTUVSX1NUQVRVUzJfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwMDc0CisjZGVmaW5lIFNPQ19MRl9USU1FUl9TVEFUVVMyX0lOVEVSUlVQVF9NU0IgICAgICAgMAorI2RlZmluZSBTT0NfTEZfVElNRVJfU1RBVFVTMl9JTlRFUlJVUFRfTFNCICAgICAgIDAKKyNkZWZpbmUgU09DX0xGX1RJTUVSX1NUQVRVUzJfSU5URVJSVVBUX01BU0sgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNPQ19MRl9USU1FUl9TVEFUVVMyX0lOVEVSUlVQVF9HRVQoeCkgICAgKCgoeCkgJiBTT0NfTEZfVElNRVJfU1RBVFVTMl9JTlRFUlJVUFRfTUFTSykgPj4gU09DX0xGX1RJTUVSX1NUQVRVUzJfSU5URVJSVVBUX0xTQikKKyNkZWZpbmUgU09DX0xGX1RJTUVSX1NUQVRVUzJfSU5URVJSVVBUX1NFVCh4KSAgICAoKCh4KSA8PCBTT0NfTEZfVElNRVJfU1RBVFVTMl9JTlRFUlJVUFRfTFNCKSAmIFNPQ19MRl9USU1FUl9TVEFUVVMyX0lOVEVSUlVQVF9NQVNLKQorCisjZGVmaW5lIFNPQ19MRl9USU1FUjNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3OAorI2RlZmluZSBTT0NfTEZfVElNRVIzX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNzgKKyNkZWZpbmUgU09DX0xGX1RJTUVSM19UQVJHRVRfTVNCICAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBTT0NfTEZfVElNRVIzX1RBUkdFVF9MU0IgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX0xGX1RJTUVSM19UQVJHRVRfTUFTSyAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIFNPQ19MRl9USU1FUjNfVEFSR0VUX0dFVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiBTT0NfTEZfVElNRVIzX1RBUkdFVF9NQVNLKSA+PiBTT0NfTEZfVElNRVIzX1RBUkdFVF9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUjNfVEFSR0VUX1NFVCh4KSAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX0xGX1RJTUVSM19UQVJHRVRfTFNCKSAmIFNPQ19MRl9USU1FUjNfVEFSR0VUX01BU0spCisKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPVU5UM19BRERSRVNTICAgICAgICAgICAgICAweDAwMDAwMDdjCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT1VOVDNfT0ZGU0VUICAgICAgICAgICAgICAgMHgwMDAwMDA3YworI2RlZmluZSBTT0NfTEZfVElNRVJfQ09VTlQzX1ZBTFVFX01TQiAgICAgICAgICAgIDMxCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT1VOVDNfVkFMVUVfTFNCICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09VTlQzX1ZBTFVFX01BU0sgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPVU5UM19WQUxVRV9HRVQoeCkgICAgICAgICAoKCh4KSAmIFNPQ19MRl9USU1FUl9DT1VOVDNfVkFMVUVfTUFTSykgPj4gU09DX0xGX1RJTUVSX0NPVU5UM19WQUxVRV9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT1VOVDNfVkFMVUVfU0VUKHgpICAgICAgICAgKCgoeCkgPDwgU09DX0xGX1RJTUVSX0NPVU5UM19WQUxVRV9MU0IpICYgU09DX0xGX1RJTUVSX0NPVU5UM19WQUxVRV9NQVNLKQorCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MM19BRERSRVNTICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDNfT0ZGU0VUICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wzX0VOQUJMRV9NU0IgICAgICAgICAyCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MM19FTkFCTEVfTFNCICAgICAgICAgMgorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDNfRU5BQkxFX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wzX0VOQUJMRV9HRVQoeCkgICAgICAoKCh4KSAmIFNPQ19MRl9USU1FUl9DT05UUk9MM19FTkFCTEVfTUFTSykgPj4gU09DX0xGX1RJTUVSX0NPTlRST0wzX0VOQUJMRV9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MM19FTkFCTEVfU0VUKHgpICAgICAgKCgoeCkgPDwgU09DX0xGX1RJTUVSX0NPTlRST0wzX0VOQUJMRV9MU0IpICYgU09DX0xGX1RJTUVSX0NPTlRST0wzX0VOQUJMRV9NQVNLKQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDNfQVVUT19SRVNUQVJUX01TQiAgIDEKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wzX0FVVE9fUkVTVEFSVF9MU0IgICAxCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MM19BVVRPX1JFU1RBUlRfTUFTSyAgMHgwMDAwMDAwMgorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDNfQVVUT19SRVNUQVJUX0dFVCh4KSAoKCh4KSAmIFNPQ19MRl9USU1FUl9DT05UUk9MM19BVVRPX1JFU1RBUlRfTUFTSykgPj4gU09DX0xGX1RJTUVSX0NPTlRST0wzX0FVVE9fUkVTVEFSVF9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MM19BVVRPX1JFU1RBUlRfU0VUKHgpICgoKHgpIDw8IFNPQ19MRl9USU1FUl9DT05UUk9MM19BVVRPX1JFU1RBUlRfTFNCKSAmIFNPQ19MRl9USU1FUl9DT05UUk9MM19BVVRPX1JFU1RBUlRfTUFTSykKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wzX1JFU0VUX01TQiAgICAgICAgICAwCisjZGVmaW5lIFNPQ19MRl9USU1FUl9DT05UUk9MM19SRVNFVF9MU0IgICAgICAgICAgMAorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDNfUkVTRVRfTUFTSyAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX0xGX1RJTUVSX0NPTlRST0wzX1JFU0VUX0dFVCh4KSAgICAgICAoKCh4KSAmIFNPQ19MRl9USU1FUl9DT05UUk9MM19SRVNFVF9NQVNLKSA+PiBTT0NfTEZfVElNRVJfQ09OVFJPTDNfUkVTRVRfTFNCKQorI2RlZmluZSBTT0NfTEZfVElNRVJfQ09OVFJPTDNfUkVTRVRfU0VUKHgpICAgICAgICgoKHgpIDw8IFNPQ19MRl9USU1FUl9DT05UUk9MM19SRVNFVF9MU0IpICYgU09DX0xGX1RJTUVSX0NPTlRST0wzX1JFU0VUX01BU0spCisKKyNkZWZpbmUgU09DX0xGX1RJTUVSX1NUQVRVUzNfQUREUkVTUyAgICAgICAgICAgICAweDAwMDAwMDg0CisjZGVmaW5lIFNPQ19MRl9USU1FUl9TVEFUVVMzX09GRlNFVCAgICAgICAgICAgICAgMHgwMDAwMDA4NAorI2RlZmluZSBTT0NfTEZfVElNRVJfU1RBVFVTM19JTlRFUlJVUFRfTVNCICAgICAgIDAKKyNkZWZpbmUgU09DX0xGX1RJTUVSX1NUQVRVUzNfSU5URVJSVVBUX0xTQiAgICAgICAwCisjZGVmaW5lIFNPQ19MRl9USU1FUl9TVEFUVVMzX0lOVEVSUlVQVF9NQVNLICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTT0NfTEZfVElNRVJfU1RBVFVTM19JTlRFUlJVUFRfR0VUKHgpICAgICgoKHgpICYgU09DX0xGX1RJTUVSX1NUQVRVUzNfSU5URVJSVVBUX01BU0spID4+IFNPQ19MRl9USU1FUl9TVEFUVVMzX0lOVEVSUlVQVF9MU0IpCisjZGVmaW5lIFNPQ19MRl9USU1FUl9TVEFUVVMzX0lOVEVSUlVQVF9TRVQoeCkgICAgKCgoeCkgPDwgU09DX0xGX1RJTUVSX1NUQVRVUzNfSU5URVJSVVBUX0xTQikgJiBTT0NfTEZfVElNRVJfU1RBVFVTM19JTlRFUlJVUFRfTUFTSykKKworI2RlZmluZSBTT0NfSEZfVElNRVJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODgKKyNkZWZpbmUgU09DX0hGX1RJTUVSX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDg4CisjZGVmaW5lIFNPQ19IRl9USU1FUl9UQVJHRVRfTVNCICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgU09DX0hGX1RJTUVSX1RBUkdFVF9MU0IgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBTT0NfSEZfVElNRVJfVEFSR0VUX01BU0sgICAgICAgICAgICAgICAgIDB4ZmZmZmYwMDAKKyNkZWZpbmUgU09DX0hGX1RJTUVSX1RBUkdFVF9HRVQoeCkgICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19IRl9USU1FUl9UQVJHRVRfTUFTSykgPj4gU09DX0hGX1RJTUVSX1RBUkdFVF9MU0IpCisjZGVmaW5lIFNPQ19IRl9USU1FUl9UQVJHRVRfU0VUKHgpICAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX0hGX1RJTUVSX1RBUkdFVF9MU0IpICYgU09DX0hGX1RJTUVSX1RBUkdFVF9NQVNLKQorCisjZGVmaW5lIFNPQ19IRl9USU1FUl9DT1VOVF9BRERSRVNTICAgICAgICAgICAgICAgMHgwMDAwMDA4YworI2RlZmluZSBTT0NfSEZfVElNRVJfQ09VTlRfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAwOGMKKyNkZWZpbmUgU09DX0hGX1RJTUVSX0NPVU5UX1ZBTFVFX01TQiAgICAgICAgICAgICAzMQorI2RlZmluZSBTT0NfSEZfVElNRVJfQ09VTlRfVkFMVUVfTFNCICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNPQ19IRl9USU1FUl9DT1VOVF9WQUxVRV9NQVNLICAgICAgICAgICAgMHhmZmZmZjAwMAorI2RlZmluZSBTT0NfSEZfVElNRVJfQ09VTlRfVkFMVUVfR0VUKHgpICAgICAgICAgICgoKHgpICYgU09DX0hGX1RJTUVSX0NPVU5UX1ZBTFVFX01BU0spID4+IFNPQ19IRl9USU1FUl9DT1VOVF9WQUxVRV9MU0IpCisjZGVmaW5lIFNPQ19IRl9USU1FUl9DT1VOVF9WQUxVRV9TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgU09DX0hGX1RJTUVSX0NPVU5UX1ZBTFVFX0xTQikgJiBTT0NfSEZfVElNRVJfQ09VTlRfVkFMVUVfTUFTSykKKworI2RlZmluZSBTT0NfSEZfTEZfQ09VTlRfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwOTAKKyNkZWZpbmUgU09DX0hGX0xGX0NPVU5UX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDkwCisjZGVmaW5lIFNPQ19IRl9MRl9DT1VOVF9WQUxVRV9NU0IgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgU09DX0hGX0xGX0NPVU5UX1ZBTFVFX0xTQiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19IRl9MRl9DT1VOVF9WQUxVRV9NQVNLICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBTT0NfSEZfTEZfQ09VTlRfVkFMVUVfR0VUKHgpICAgICAgICAgICAgICgoKHgpICYgU09DX0hGX0xGX0NPVU5UX1ZBTFVFX01BU0spID4+IFNPQ19IRl9MRl9DT1VOVF9WQUxVRV9MU0IpCisjZGVmaW5lIFNPQ19IRl9MRl9DT1VOVF9WQUxVRV9TRVQoeCkgICAgICAgICAgICAgKCgoeCkgPDwgU09DX0hGX0xGX0NPVU5UX1ZBTFVFX0xTQikgJiBTT0NfSEZfTEZfQ09VTlRfVkFMVUVfTUFTSykKKworI2RlZmluZSBTT0NfSEZfVElNRVJfQ09OVFJPTF9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDAwOTQKKyNkZWZpbmUgU09DX0hGX1RJTUVSX0NPTlRST0xfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwMDk0CisjZGVmaW5lIFNPQ19IRl9USU1FUl9DT05UUk9MX0VOQUJMRV9NU0IgICAgICAgICAgMworI2RlZmluZSBTT0NfSEZfVElNRVJfQ09OVFJPTF9FTkFCTEVfTFNCICAgICAgICAgIDMKKyNkZWZpbmUgU09DX0hGX1RJTUVSX0NPTlRST0xfRU5BQkxFX01BU0sgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFNPQ19IRl9USU1FUl9DT05UUk9MX0VOQUJMRV9HRVQoeCkgICAgICAgKCgoeCkgJiBTT0NfSEZfVElNRVJfQ09OVFJPTF9FTkFCTEVfTUFTSykgPj4gU09DX0hGX1RJTUVSX0NPTlRST0xfRU5BQkxFX0xTQikKKyNkZWZpbmUgU09DX0hGX1RJTUVSX0NPTlRST0xfRU5BQkxFX1NFVCh4KSAgICAgICAoKCh4KSA8PCBTT0NfSEZfVElNRVJfQ09OVFJPTF9FTkFCTEVfTFNCKSAmIFNPQ19IRl9USU1FUl9DT05UUk9MX0VOQUJMRV9NQVNLKQorI2RlZmluZSBTT0NfSEZfVElNRVJfQ09OVFJPTF9PTl9NU0IgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU09DX0hGX1RJTUVSX0NPTlRST0xfT05fTFNCICAgICAgICAgICAgICAyCisjZGVmaW5lIFNPQ19IRl9USU1FUl9DT05UUk9MX09OX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTT0NfSEZfVElNRVJfQ09OVFJPTF9PTl9HRVQoeCkgICAgICAgICAgICgoKHgpICYgU09DX0hGX1RJTUVSX0NPTlRST0xfT05fTUFTSykgPj4gU09DX0hGX1RJTUVSX0NPTlRST0xfT05fTFNCKQorI2RlZmluZSBTT0NfSEZfVElNRVJfQ09OVFJPTF9PTl9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IFNPQ19IRl9USU1FUl9DT05UUk9MX09OX0xTQikgJiBTT0NfSEZfVElNRVJfQ09OVFJPTF9PTl9NQVNLKQorI2RlZmluZSBTT0NfSEZfVElNRVJfQ09OVFJPTF9BVVRPX1JFU1RBUlRfTVNCICAgIDEKKyNkZWZpbmUgU09DX0hGX1RJTUVSX0NPTlRST0xfQVVUT19SRVNUQVJUX0xTQiAgICAxCisjZGVmaW5lIFNPQ19IRl9USU1FUl9DT05UUk9MX0FVVE9fUkVTVEFSVF9NQVNLICAgMHgwMDAwMDAwMgorI2RlZmluZSBTT0NfSEZfVElNRVJfQ09OVFJPTF9BVVRPX1JFU1RBUlRfR0VUKHgpICgoKHgpICYgU09DX0hGX1RJTUVSX0NPTlRST0xfQVVUT19SRVNUQVJUX01BU0spID4+IFNPQ19IRl9USU1FUl9DT05UUk9MX0FVVE9fUkVTVEFSVF9MU0IpCisjZGVmaW5lIFNPQ19IRl9USU1FUl9DT05UUk9MX0FVVE9fUkVTVEFSVF9TRVQoeCkgKCgoeCkgPDwgU09DX0hGX1RJTUVSX0NPTlRST0xfQVVUT19SRVNUQVJUX0xTQikgJiBTT0NfSEZfVElNRVJfQ09OVFJPTF9BVVRPX1JFU1RBUlRfTUFTSykKKyNkZWZpbmUgU09DX0hGX1RJTUVSX0NPTlRST0xfUkVTRVRfTVNCICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19IRl9USU1FUl9DT05UUk9MX1JFU0VUX0xTQiAgICAgICAgICAgMAorI2RlZmluZSBTT0NfSEZfVElNRVJfQ09OVFJPTF9SRVNFVF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX0hGX1RJTUVSX0NPTlRST0xfUkVTRVRfR0VUKHgpICAgICAgICAoKCh4KSAmIFNPQ19IRl9USU1FUl9DT05UUk9MX1JFU0VUX01BU0spID4+IFNPQ19IRl9USU1FUl9DT05UUk9MX1JFU0VUX0xTQikKKyNkZWZpbmUgU09DX0hGX1RJTUVSX0NPTlRST0xfUkVTRVRfU0VUKHgpICAgICAgICAoKCh4KSA8PCBTT0NfSEZfVElNRVJfQ09OVFJPTF9SRVNFVF9MU0IpICYgU09DX0hGX1RJTUVSX0NPTlRST0xfUkVTRVRfTUFTSykKKworI2RlZmluZSBTT0NfSEZfVElNRVJfU1RBVFVTX0FERFJFU1MgICAgICAgICAgICAgIDB4MDAwMDAwOTgKKyNkZWZpbmUgU09DX0hGX1RJTUVSX1NUQVRVU19PRkZTRVQgICAgICAgICAgICAgICAweDAwMDAwMDk4CisjZGVmaW5lIFNPQ19IRl9USU1FUl9TVEFUVVNfSU5URVJSVVBUX01TQiAgICAgICAgMAorI2RlZmluZSBTT0NfSEZfVElNRVJfU1RBVFVTX0lOVEVSUlVQVF9MU0IgICAgICAgIDAKKyNkZWZpbmUgU09DX0hGX1RJTUVSX1NUQVRVU19JTlRFUlJVUFRfTUFTSyAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNPQ19IRl9USU1FUl9TVEFUVVNfSU5URVJSVVBUX0dFVCh4KSAgICAgKCgoeCkgJiBTT0NfSEZfVElNRVJfU1RBVFVTX0lOVEVSUlVQVF9NQVNLKSA+PiBTT0NfSEZfVElNRVJfU1RBVFVTX0lOVEVSUlVQVF9MU0IpCisjZGVmaW5lIFNPQ19IRl9USU1FUl9TVEFUVVNfSU5URVJSVVBUX1NFVCh4KSAgICAgKCgoeCkgPDwgU09DX0hGX1RJTUVSX1NUQVRVU19JTlRFUlJVUFRfTFNCKSAmIFNPQ19IRl9USU1FUl9TVEFUVVNfSU5URVJSVVBUX01BU0spCisKKyNkZWZpbmUgU09DX1JUQ19DT05UUk9MX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDAwMDljCisjZGVmaW5lIFNPQ19SVENfQ09OVFJPTF9PRkZTRVQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA5YworI2RlZmluZSBTT0NfUlRDX0NPTlRST0xfRU5BQkxFX01TQiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU09DX1JUQ19DT05UUk9MX0VOQUJMRV9MU0IgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNPQ19SVENfQ09OVFJPTF9FTkFCTEVfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTT0NfUlRDX0NPTlRST0xfRU5BQkxFX0dFVCh4KSAgICAgICAgICAgICgoKHgpICYgU09DX1JUQ19DT05UUk9MX0VOQUJMRV9NQVNLKSA+PiBTT0NfUlRDX0NPTlRST0xfRU5BQkxFX0xTQikKKyNkZWZpbmUgU09DX1JUQ19DT05UUk9MX0VOQUJMRV9TRVQoeCkgICAgICAgICAgICAoKCh4KSA8PCBTT0NfUlRDX0NPTlRST0xfRU5BQkxFX0xTQikgJiBTT0NfUlRDX0NPTlRST0xfRU5BQkxFX01BU0spCisjZGVmaW5lIFNPQ19SVENfQ09OVFJPTF9MT0FEX1JUQ19NU0IgICAgICAgICAgICAgMQorI2RlZmluZSBTT0NfUlRDX0NPTlRST0xfTE9BRF9SVENfTFNCICAgICAgICAgICAgIDEKKyNkZWZpbmUgU09DX1JUQ19DT05UUk9MX0xPQURfUlRDX01BU0sgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNPQ19SVENfQ09OVFJPTF9MT0FEX1JUQ19HRVQoeCkgICAgICAgICAgKCgoeCkgJiBTT0NfUlRDX0NPTlRST0xfTE9BRF9SVENfTUFTSykgPj4gU09DX1JUQ19DT05UUk9MX0xPQURfUlRDX0xTQikKKyNkZWZpbmUgU09DX1JUQ19DT05UUk9MX0xPQURfUlRDX1NFVCh4KSAgICAgICAgICAoKCh4KSA8PCBTT0NfUlRDX0NPTlRST0xfTE9BRF9SVENfTFNCKSAmIFNPQ19SVENfQ09OVFJPTF9MT0FEX1JUQ19NQVNLKQorI2RlZmluZSBTT0NfUlRDX0NPTlRST0xfTE9BRF9BTEFSTV9NU0IgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX1JUQ19DT05UUk9MX0xPQURfQUxBUk1fTFNCICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19SVENfQ09OVFJPTF9MT0FEX0FMQVJNX01BU0sgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTT0NfUlRDX0NPTlRST0xfTE9BRF9BTEFSTV9HRVQoeCkgICAgICAgICgoKHgpICYgU09DX1JUQ19DT05UUk9MX0xPQURfQUxBUk1fTUFTSykgPj4gU09DX1JUQ19DT05UUk9MX0xPQURfQUxBUk1fTFNCKQorI2RlZmluZSBTT0NfUlRDX0NPTlRST0xfTE9BRF9BTEFSTV9TRVQoeCkgICAgICAgICgoKHgpIDw8IFNPQ19SVENfQ09OVFJPTF9MT0FEX0FMQVJNX0xTQikgJiBTT0NfUlRDX0NPTlRST0xfTE9BRF9BTEFSTV9NQVNLKQorCisjZGVmaW5lIFNPQ19SVENfVElNRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBhMAorI2RlZmluZSBTT0NfUlRDX1RJTUVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwYTAKKyNkZWZpbmUgU09DX1JUQ19USU1FX1dFRUtfREFZX01TQiAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBTT0NfUlRDX1RJTUVfV0VFS19EQVlfTFNCICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIFNPQ19SVENfVElNRV9XRUVLX0RBWV9NQVNLICAgICAgICAgICAgICAgMHgwNzAwMDAwMAorI2RlZmluZSBTT0NfUlRDX1RJTUVfV0VFS19EQVlfR0VUKHgpICAgICAgICAgICAgICgoKHgpICYgU09DX1JUQ19USU1FX1dFRUtfREFZX01BU0spID4+IFNPQ19SVENfVElNRV9XRUVLX0RBWV9MU0IpCisjZGVmaW5lIFNPQ19SVENfVElNRV9XRUVLX0RBWV9TRVQoeCkgICAgICAgICAgICAgKCgoeCkgPDwgU09DX1JUQ19USU1FX1dFRUtfREFZX0xTQikgJiBTT0NfUlRDX1RJTUVfV0VFS19EQVlfTUFTSykKKyNkZWZpbmUgU09DX1JUQ19USU1FX0hPVVJfTVNCICAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBTT0NfUlRDX1RJTUVfSE9VUl9MU0IgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFNPQ19SVENfVElNRV9IT1VSX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDNmMDAwMAorI2RlZmluZSBTT0NfUlRDX1RJTUVfSE9VUl9HRVQoeCkgICAgICAgICAgICAgICAgICgoKHgpICYgU09DX1JUQ19USU1FX0hPVVJfTUFTSykgPj4gU09DX1JUQ19USU1FX0hPVVJfTFNCKQorI2RlZmluZSBTT0NfUlRDX1RJTUVfSE9VUl9TRVQoeCkgICAgICAgICAgICAgICAgICgoKHgpIDw8IFNPQ19SVENfVElNRV9IT1VSX0xTQikgJiBTT0NfUlRDX1RJTUVfSE9VUl9NQVNLKQorI2RlZmluZSBTT0NfUlRDX1RJTUVfTUlOVVRFX01TQiAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNPQ19SVENfVElNRV9NSU5VVEVfTFNCICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBTT0NfUlRDX1RJTUVfTUlOVVRFX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDdmMDAKKyNkZWZpbmUgU09DX1JUQ19USU1FX01JTlVURV9HRVQoeCkgICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19SVENfVElNRV9NSU5VVEVfTUFTSykgPj4gU09DX1JUQ19USU1FX01JTlVURV9MU0IpCisjZGVmaW5lIFNPQ19SVENfVElNRV9NSU5VVEVfU0VUKHgpICAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX1JUQ19USU1FX01JTlVURV9MU0IpICYgU09DX1JUQ19USU1FX01JTlVURV9NQVNLKQorI2RlZmluZSBTT0NfUlRDX1RJTUVfU0VDT05EX01TQiAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU09DX1JUQ19USU1FX1NFQ09ORF9MU0IgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19SVENfVElNRV9TRUNPTkRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDA3ZgorI2RlZmluZSBTT0NfUlRDX1RJTUVfU0VDT05EX0dFVCh4KSAgICAgICAgICAgICAgICgoKHgpICYgU09DX1JUQ19USU1FX1NFQ09ORF9NQVNLKSA+PiBTT0NfUlRDX1RJTUVfU0VDT05EX0xTQikKKyNkZWZpbmUgU09DX1JUQ19USU1FX1NFQ09ORF9TRVQoeCkgICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfUlRDX1RJTUVfU0VDT05EX0xTQikgJiBTT0NfUlRDX1RJTUVfU0VDT05EX01BU0spCisKKyNkZWZpbmUgU09DX1JUQ19EQVRFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMGE0CisjZGVmaW5lIFNPQ19SVENfREFURV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBhNAorI2RlZmluZSBTT0NfUlRDX0RBVEVfWUVBUl9NU0IgICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFNPQ19SVENfREFURV9ZRUFSX0xTQiAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgU09DX1JUQ19EQVRFX1lFQVJfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIFNPQ19SVENfREFURV9ZRUFSX0dFVCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiBTT0NfUlRDX0RBVEVfWUVBUl9NQVNLKSA+PiBTT0NfUlRDX0RBVEVfWUVBUl9MU0IpCisjZGVmaW5lIFNPQ19SVENfREFURV9ZRUFSX1NFVCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX1JUQ19EQVRFX1lFQVJfTFNCKSAmIFNPQ19SVENfREFURV9ZRUFSX01BU0spCisjZGVmaW5lIFNPQ19SVENfREFURV9NT05USF9NU0IgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgU09DX1JUQ19EQVRFX01PTlRIX0xTQiAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFNPQ19SVENfREFURV9NT05USF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMWYwMAorI2RlZmluZSBTT0NfUlRDX0RBVEVfTU9OVEhfR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgU09DX1JUQ19EQVRFX01PTlRIX01BU0spID4+IFNPQ19SVENfREFURV9NT05USF9MU0IpCisjZGVmaW5lIFNPQ19SVENfREFURV9NT05USF9TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX1JUQ19EQVRFX01PTlRIX0xTQikgJiBTT0NfUlRDX0RBVEVfTU9OVEhfTUFTSykKKyNkZWZpbmUgU09DX1JUQ19EQVRFX01PTlRIX0RBWV9NU0IgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNPQ19SVENfREFURV9NT05USF9EQVlfTFNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfUlRDX0RBVEVfTU9OVEhfREFZX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwM2YKKyNkZWZpbmUgU09DX1JUQ19EQVRFX01PTlRIX0RBWV9HRVQoeCkgICAgICAgICAgICAoKCh4KSAmIFNPQ19SVENfREFURV9NT05USF9EQVlfTUFTSykgPj4gU09DX1JUQ19EQVRFX01PTlRIX0RBWV9MU0IpCisjZGVmaW5lIFNPQ19SVENfREFURV9NT05USF9EQVlfU0VUKHgpICAgICAgICAgICAgKCgoeCkgPDwgU09DX1JUQ19EQVRFX01PTlRIX0RBWV9MU0IpICYgU09DX1JUQ19EQVRFX01PTlRIX0RBWV9NQVNLKQorCisjZGVmaW5lIFNPQ19SVENfU0VUX1RJTUVfQUREUkVTUyAgICAgICAgICAgICAgICAgMHgwMDAwMDBhOAorI2RlZmluZSBTT0NfUlRDX1NFVF9USU1FX09GRlNFVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwYTgKKyNkZWZpbmUgU09DX1JUQ19TRVRfVElNRV9XRUVLX0RBWV9NU0IgICAgICAgICAgICAyNgorI2RlZmluZSBTT0NfUlRDX1NFVF9USU1FX1dFRUtfREFZX0xTQiAgICAgICAgICAgIDI0CisjZGVmaW5lIFNPQ19SVENfU0VUX1RJTUVfV0VFS19EQVlfTUFTSyAgICAgICAgICAgMHgwNzAwMDAwMAorI2RlZmluZSBTT0NfUlRDX1NFVF9USU1FX1dFRUtfREFZX0dFVCh4KSAgICAgICAgICgoKHgpICYgU09DX1JUQ19TRVRfVElNRV9XRUVLX0RBWV9NQVNLKSA+PiBTT0NfUlRDX1NFVF9USU1FX1dFRUtfREFZX0xTQikKKyNkZWZpbmUgU09DX1JUQ19TRVRfVElNRV9XRUVLX0RBWV9TRVQoeCkgICAgICAgICAoKCh4KSA8PCBTT0NfUlRDX1NFVF9USU1FX1dFRUtfREFZX0xTQikgJiBTT0NfUlRDX1NFVF9USU1FX1dFRUtfREFZX01BU0spCisjZGVmaW5lIFNPQ19SVENfU0VUX1RJTUVfSE9VUl9NU0IgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgU09DX1JUQ19TRVRfVElNRV9IT1VSX0xTQiAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBTT0NfUlRDX1NFVF9USU1FX0hPVVJfTUFTSyAgICAgICAgICAgICAgIDB4MDAzZjAwMDAKKyNkZWZpbmUgU09DX1JUQ19TRVRfVElNRV9IT1VSX0dFVCh4KSAgICAgICAgICAgICAoKCh4KSAmIFNPQ19SVENfU0VUX1RJTUVfSE9VUl9NQVNLKSA+PiBTT0NfUlRDX1NFVF9USU1FX0hPVVJfTFNCKQorI2RlZmluZSBTT0NfUlRDX1NFVF9USU1FX0hPVVJfU0VUKHgpICAgICAgICAgICAgICgoKHgpIDw8IFNPQ19SVENfU0VUX1RJTUVfSE9VUl9MU0IpICYgU09DX1JUQ19TRVRfVElNRV9IT1VSX01BU0spCisjZGVmaW5lIFNPQ19SVENfU0VUX1RJTUVfTUlOVVRFX01TQiAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgU09DX1JUQ19TRVRfVElNRV9NSU5VVEVfTFNCICAgICAgICAgICAgICA4CisjZGVmaW5lIFNPQ19SVENfU0VUX1RJTUVfTUlOVVRFX01BU0sgICAgICAgICAgICAgMHgwMDAwN2YwMAorI2RlZmluZSBTT0NfUlRDX1NFVF9USU1FX01JTlVURV9HRVQoeCkgICAgICAgICAgICgoKHgpICYgU09DX1JUQ19TRVRfVElNRV9NSU5VVEVfTUFTSykgPj4gU09DX1JUQ19TRVRfVElNRV9NSU5VVEVfTFNCKQorI2RlZmluZSBTT0NfUlRDX1NFVF9USU1FX01JTlVURV9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IFNPQ19SVENfU0VUX1RJTUVfTUlOVVRFX0xTQikgJiBTT0NfUlRDX1NFVF9USU1FX01JTlVURV9NQVNLKQorI2RlZmluZSBTT0NfUlRDX1NFVF9USU1FX1NFQ09ORF9NU0IgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU09DX1JUQ19TRVRfVElNRV9TRUNPTkRfTFNCICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19SVENfU0VUX1RJTUVfU0VDT05EX01BU0sgICAgICAgICAgICAgMHgwMDAwMDA3ZgorI2RlZmluZSBTT0NfUlRDX1NFVF9USU1FX1NFQ09ORF9HRVQoeCkgICAgICAgICAgICgoKHgpICYgU09DX1JUQ19TRVRfVElNRV9TRUNPTkRfTUFTSykgPj4gU09DX1JUQ19TRVRfVElNRV9TRUNPTkRfTFNCKQorI2RlZmluZSBTT0NfUlRDX1NFVF9USU1FX1NFQ09ORF9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IFNPQ19SVENfU0VUX1RJTUVfU0VDT05EX0xTQikgJiBTT0NfUlRDX1NFVF9USU1FX1NFQ09ORF9NQVNLKQorCisjZGVmaW5lIFNPQ19SVENfU0VUX0RBVEVfQUREUkVTUyAgICAgICAgICAgICAgICAgMHgwMDAwMDBhYworI2RlZmluZSBTT0NfUlRDX1NFVF9EQVRFX09GRlNFVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwYWMKKyNkZWZpbmUgU09DX1JUQ19TRVRfREFURV9ZRUFSX01TQiAgICAgICAgICAgICAgICAyMworI2RlZmluZSBTT0NfUlRDX1NFVF9EQVRFX1lFQVJfTFNCICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFNPQ19SVENfU0VUX0RBVEVfWUVBUl9NQVNLICAgICAgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBTT0NfUlRDX1NFVF9EQVRFX1lFQVJfR0VUKHgpICAgICAgICAgICAgICgoKHgpICYgU09DX1JUQ19TRVRfREFURV9ZRUFSX01BU0spID4+IFNPQ19SVENfU0VUX0RBVEVfWUVBUl9MU0IpCisjZGVmaW5lIFNPQ19SVENfU0VUX0RBVEVfWUVBUl9TRVQoeCkgICAgICAgICAgICAgKCgoeCkgPDwgU09DX1JUQ19TRVRfREFURV9ZRUFSX0xTQikgJiBTT0NfUlRDX1NFVF9EQVRFX1lFQVJfTUFTSykKKyNkZWZpbmUgU09DX1JUQ19TRVRfREFURV9NT05USF9NU0IgICAgICAgICAgICAgICAxMgorI2RlZmluZSBTT0NfUlRDX1NFVF9EQVRFX01PTlRIX0xTQiAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgU09DX1JUQ19TRVRfREFURV9NT05USF9NQVNLICAgICAgICAgICAgICAweDAwMDAxZjAwCisjZGVmaW5lIFNPQ19SVENfU0VUX0RBVEVfTU9OVEhfR0VUKHgpICAgICAgICAgICAgKCgoeCkgJiBTT0NfUlRDX1NFVF9EQVRFX01PTlRIX01BU0spID4+IFNPQ19SVENfU0VUX0RBVEVfTU9OVEhfTFNCKQorI2RlZmluZSBTT0NfUlRDX1NFVF9EQVRFX01PTlRIX1NFVCh4KSAgICAgICAgICAgICgoKHgpIDw8IFNPQ19SVENfU0VUX0RBVEVfTU9OVEhfTFNCKSAmIFNPQ19SVENfU0VUX0RBVEVfTU9OVEhfTUFTSykKKyNkZWZpbmUgU09DX1JUQ19TRVRfREFURV9NT05USF9EQVlfTVNCICAgICAgICAgICA1CisjZGVmaW5lIFNPQ19SVENfU0VUX0RBVEVfTU9OVEhfREFZX0xTQiAgICAgICAgICAgMAorI2RlZmluZSBTT0NfUlRDX1NFVF9EQVRFX01PTlRIX0RBWV9NQVNLICAgICAgICAgIDB4MDAwMDAwM2YKKyNkZWZpbmUgU09DX1JUQ19TRVRfREFURV9NT05USF9EQVlfR0VUKHgpICAgICAgICAoKCh4KSAmIFNPQ19SVENfU0VUX0RBVEVfTU9OVEhfREFZX01BU0spID4+IFNPQ19SVENfU0VUX0RBVEVfTU9OVEhfREFZX0xTQikKKyNkZWZpbmUgU09DX1JUQ19TRVRfREFURV9NT05USF9EQVlfU0VUKHgpICAgICAgICAoKCh4KSA8PCBTT0NfUlRDX1NFVF9EQVRFX01PTlRIX0RBWV9MU0IpICYgU09DX1JUQ19TRVRfREFURV9NT05USF9EQVlfTUFTSykKKworI2RlZmluZSBTT0NfUlRDX1NFVF9BTEFSTV9BRERSRVNTICAgICAgICAgICAgICAgIDB4MDAwMDAwYjAKKyNkZWZpbmUgU09DX1JUQ19TRVRfQUxBUk1fT0ZGU0VUICAgICAgICAgICAgICAgICAweDAwMDAwMGIwCisjZGVmaW5lIFNPQ19SVENfU0VUX0FMQVJNX0hPVVJfTVNCICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgU09DX1JUQ19TRVRfQUxBUk1fSE9VUl9MU0IgICAgICAgICAgICAgICAxNgorI2RlZmluZSBTT0NfUlRDX1NFVF9BTEFSTV9IT1VSX01BU0sgICAgICAgICAgICAgIDB4MDAzZjAwMDAKKyNkZWZpbmUgU09DX1JUQ19TRVRfQUxBUk1fSE9VUl9HRVQoeCkgICAgICAgICAgICAoKCh4KSAmIFNPQ19SVENfU0VUX0FMQVJNX0hPVVJfTUFTSykgPj4gU09DX1JUQ19TRVRfQUxBUk1fSE9VUl9MU0IpCisjZGVmaW5lIFNPQ19SVENfU0VUX0FMQVJNX0hPVVJfU0VUKHgpICAgICAgICAgICAgKCgoeCkgPDwgU09DX1JUQ19TRVRfQUxBUk1fSE9VUl9MU0IpICYgU09DX1JUQ19TRVRfQUxBUk1fSE9VUl9NQVNLKQorI2RlZmluZSBTT0NfUlRDX1NFVF9BTEFSTV9NSU5VVEVfTVNCICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNPQ19SVENfU0VUX0FMQVJNX01JTlVURV9MU0IgICAgICAgICAgICAgOAorI2RlZmluZSBTT0NfUlRDX1NFVF9BTEFSTV9NSU5VVEVfTUFTSyAgICAgICAgICAgIDB4MDAwMDdmMDAKKyNkZWZpbmUgU09DX1JUQ19TRVRfQUxBUk1fTUlOVVRFX0dFVCh4KSAgICAgICAgICAoKCh4KSAmIFNPQ19SVENfU0VUX0FMQVJNX01JTlVURV9NQVNLKSA+PiBTT0NfUlRDX1NFVF9BTEFSTV9NSU5VVEVfTFNCKQorI2RlZmluZSBTT0NfUlRDX1NFVF9BTEFSTV9NSU5VVEVfU0VUKHgpICAgICAgICAgICgoKHgpIDw8IFNPQ19SVENfU0VUX0FMQVJNX01JTlVURV9MU0IpICYgU09DX1JUQ19TRVRfQUxBUk1fTUlOVVRFX01BU0spCisjZGVmaW5lIFNPQ19SVENfU0VUX0FMQVJNX1NFQ09ORF9NU0IgICAgICAgICAgICAgNgorI2RlZmluZSBTT0NfUlRDX1NFVF9BTEFSTV9TRUNPTkRfTFNCICAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX1JUQ19TRVRfQUxBUk1fU0VDT05EX01BU0sgICAgICAgICAgICAweDAwMDAwMDdmCisjZGVmaW5lIFNPQ19SVENfU0VUX0FMQVJNX1NFQ09ORF9HRVQoeCkgICAgICAgICAgKCgoeCkgJiBTT0NfUlRDX1NFVF9BTEFSTV9TRUNPTkRfTUFTSykgPj4gU09DX1JUQ19TRVRfQUxBUk1fU0VDT05EX0xTQikKKyNkZWZpbmUgU09DX1JUQ19TRVRfQUxBUk1fU0VDT05EX1NFVCh4KSAgICAgICAgICAoKCh4KSA8PCBTT0NfUlRDX1NFVF9BTEFSTV9TRUNPTkRfTFNCKSAmIFNPQ19SVENfU0VUX0FMQVJNX1NFQ09ORF9NQVNLKQorCisjZGVmaW5lIFNPQ19SVENfQ09ORklHX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBiNAorI2RlZmluZSBTT0NfUlRDX0NPTkZJR19PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwYjQKKyNkZWZpbmUgU09DX1JUQ19DT05GSUdfQkNEX01TQiAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNPQ19SVENfQ09ORklHX0JDRF9MU0IgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTT0NfUlRDX0NPTkZJR19CQ0RfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU09DX1JUQ19DT05GSUdfQkNEX0dFVCh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19SVENfQ09ORklHX0JDRF9NQVNLKSA+PiBTT0NfUlRDX0NPTkZJR19CQ0RfTFNCKQorI2RlZmluZSBTT0NfUlRDX0NPTkZJR19CQ0RfU0VUKHgpICAgICAgICAgICAgICAgICgoKHgpIDw8IFNPQ19SVENfQ09ORklHX0JDRF9MU0IpICYgU09DX1JUQ19DT05GSUdfQkNEX01BU0spCisjZGVmaW5lIFNPQ19SVENfQ09ORklHX1RXRUxWRV9IT1VSX01TQiAgICAgICAgICAgMQorI2RlZmluZSBTT0NfUlRDX0NPTkZJR19UV0VMVkVfSE9VUl9MU0IgICAgICAgICAgIDEKKyNkZWZpbmUgU09DX1JUQ19DT05GSUdfVFdFTFZFX0hPVVJfTUFTSyAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNPQ19SVENfQ09ORklHX1RXRUxWRV9IT1VSX0dFVCh4KSAgICAgICAgKCgoeCkgJiBTT0NfUlRDX0NPTkZJR19UV0VMVkVfSE9VUl9NQVNLKSA+PiBTT0NfUlRDX0NPTkZJR19UV0VMVkVfSE9VUl9MU0IpCisjZGVmaW5lIFNPQ19SVENfQ09ORklHX1RXRUxWRV9IT1VSX1NFVCh4KSAgICAgICAgKCgoeCkgPDwgU09DX1JUQ19DT05GSUdfVFdFTFZFX0hPVVJfTFNCKSAmIFNPQ19SVENfQ09ORklHX1RXRUxWRV9IT1VSX01BU0spCisjZGVmaW5lIFNPQ19SVENfQ09ORklHX0RTRV9NU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfUlRDX0NPTkZJR19EU0VfTFNCICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX1JUQ19DT05GSUdfRFNFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNPQ19SVENfQ09ORklHX0RTRV9HRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiBTT0NfUlRDX0NPTkZJR19EU0VfTUFTSykgPj4gU09DX1JUQ19DT05GSUdfRFNFX0xTQikKKyNkZWZpbmUgU09DX1JUQ19DT05GSUdfRFNFX1NFVCh4KSAgICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfUlRDX0NPTkZJR19EU0VfTFNCKSAmIFNPQ19SVENfQ09ORklHX0RTRV9NQVNLKQorCisjZGVmaW5lIFNPQ19SVENfQUxBUk1fU1RBVFVTX0FERFJFU1MgICAgICAgICAgICAgMHgwMDAwMDBiOAorI2RlZmluZSBTT0NfUlRDX0FMQVJNX1NUQVRVU19PRkZTRVQgICAgICAgICAgICAgIDB4MDAwMDAwYjgKKyNkZWZpbmUgU09DX1JUQ19BTEFSTV9TVEFUVVNfRU5BQkxFX01TQiAgICAgICAgICAxCisjZGVmaW5lIFNPQ19SVENfQUxBUk1fU1RBVFVTX0VOQUJMRV9MU0IgICAgICAgICAgMQorI2RlZmluZSBTT0NfUlRDX0FMQVJNX1NUQVRVU19FTkFCTEVfTUFTSyAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU09DX1JUQ19BTEFSTV9TVEFUVVNfRU5BQkxFX0dFVCh4KSAgICAgICAoKCh4KSAmIFNPQ19SVENfQUxBUk1fU1RBVFVTX0VOQUJMRV9NQVNLKSA+PiBTT0NfUlRDX0FMQVJNX1NUQVRVU19FTkFCTEVfTFNCKQorI2RlZmluZSBTT0NfUlRDX0FMQVJNX1NUQVRVU19FTkFCTEVfU0VUKHgpICAgICAgICgoKHgpIDw8IFNPQ19SVENfQUxBUk1fU1RBVFVTX0VOQUJMRV9MU0IpICYgU09DX1JUQ19BTEFSTV9TVEFUVVNfRU5BQkxFX01BU0spCisjZGVmaW5lIFNPQ19SVENfQUxBUk1fU1RBVFVTX0lOVEVSUlVQVF9NU0IgICAgICAgMAorI2RlZmluZSBTT0NfUlRDX0FMQVJNX1NUQVRVU19JTlRFUlJVUFRfTFNCICAgICAgIDAKKyNkZWZpbmUgU09DX1JUQ19BTEFSTV9TVEFUVVNfSU5URVJSVVBUX01BU0sgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNPQ19SVENfQUxBUk1fU1RBVFVTX0lOVEVSUlVQVF9HRVQoeCkgICAgKCgoeCkgJiBTT0NfUlRDX0FMQVJNX1NUQVRVU19JTlRFUlJVUFRfTUFTSykgPj4gU09DX1JUQ19BTEFSTV9TVEFUVVNfSU5URVJSVVBUX0xTQikKKyNkZWZpbmUgU09DX1JUQ19BTEFSTV9TVEFUVVNfSU5URVJSVVBUX1NFVCh4KSAgICAoKCh4KSA8PCBTT0NfUlRDX0FMQVJNX1NUQVRVU19JTlRFUlJVUFRfTFNCKSAmIFNPQ19SVENfQUxBUk1fU1RBVFVTX0lOVEVSUlVQVF9NQVNLKQorCisjZGVmaW5lIFNPQ19VQVJUX1dBS0VVUF9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDBiYworI2RlZmluZSBTT0NfVUFSVF9XQUtFVVBfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwYmMKKyNkZWZpbmUgU09DX1VBUlRfV0FLRVVQX0VOQUJMRV9NU0IgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19VQVJUX1dBS0VVUF9FTkFCTEVfTFNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfVUFSVF9XQUtFVVBfRU5BQkxFX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX1VBUlRfV0FLRVVQX0VOQUJMRV9HRVQoeCkgICAgICAgICAgICAoKCh4KSAmIFNPQ19VQVJUX1dBS0VVUF9FTkFCTEVfTUFTSykgPj4gU09DX1VBUlRfV0FLRVVQX0VOQUJMRV9MU0IpCisjZGVmaW5lIFNPQ19VQVJUX1dBS0VVUF9FTkFCTEVfU0VUKHgpICAgICAgICAgICAgKCgoeCkgPDwgU09DX1VBUlRfV0FLRVVQX0VOQUJMRV9MU0IpICYgU09DX1VBUlRfV0FLRVVQX0VOQUJMRV9NQVNLKQorCisjZGVmaW5lIFNPQ19SRVNFVF9DQVVTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDBjMAorI2RlZmluZSBTT0NfUkVTRVRfQ0FVU0VfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgU09DX1JFU0VUX0NBVVNFX0xBU1RfTVNCICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNPQ19SRVNFVF9DQVVTRV9MQVNUX0xTQiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfUkVTRVRfQ0FVU0VfTEFTVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgU09DX1JFU0VUX0NBVVNFX0xBU1RfR0VUKHgpICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19SRVNFVF9DQVVTRV9MQVNUX01BU0spID4+IFNPQ19SRVNFVF9DQVVTRV9MQVNUX0xTQikKKyNkZWZpbmUgU09DX1JFU0VUX0NBVVNFX0xBU1RfU0VUKHgpICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfUkVTRVRfQ0FVU0VfTEFTVF9MU0IpICYgU09DX1JFU0VUX0NBVVNFX0xBU1RfTUFTSykKKworI2RlZmluZSBTT0NfU1lTVEVNX1NMRUVQX0FERFJFU1MgICAgICAgICAgICAgICAgIDB4MDAwMDAwYzQKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9PRkZTRVQgICAgICAgICAgICAgICAgICAweDAwMDAwMGM0CisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfTUNJX01TQiAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBTT0NfU1lTVEVNX1NMRUVQX01DSV9MU0IgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9NQ0lfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfTUNJX0dFVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiBTT0NfU1lTVEVNX1NMRUVQX01DSV9NQVNLKSA+PiBTT0NfU1lTVEVNX1NMRUVQX01DSV9MU0IpCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfTUNJX1NFVCh4KSAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX1NZU1RFTV9TTEVFUF9NQ0lfTFNCKSAmIFNPQ19TWVNURU1fU0xFRVBfTUNJX01BU0spCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfSE9TVF9JRl9NU0IgICAgICAgICAgICAgNAorI2RlZmluZSBTT0NfU1lTVEVNX1NMRUVQX0hPU1RfSUZfTFNCICAgICAgICAgICAgIDQKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9IT1NUX0lGX01BU0sgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfSE9TVF9JRl9HRVQoeCkgICAgICAgICAgKCgoeCkgJiBTT0NfU1lTVEVNX1NMRUVQX0hPU1RfSUZfTUFTSykgPj4gU09DX1NZU1RFTV9TTEVFUF9IT1NUX0lGX0xTQikKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9IT1NUX0lGX1NFVCh4KSAgICAgICAgICAoKCh4KSA8PCBTT0NfU1lTVEVNX1NMRUVQX0hPU1RfSUZfTFNCKSAmIFNPQ19TWVNURU1fU0xFRVBfSE9TVF9JRl9NQVNLKQorI2RlZmluZSBTT0NfU1lTVEVNX1NMRUVQX01CT1hfTVNCICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9NQk9YX0xTQiAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfTUJPWF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTT0NfU1lTVEVNX1NMRUVQX01CT1hfR0VUKHgpICAgICAgICAgICAgICgoKHgpICYgU09DX1NZU1RFTV9TTEVFUF9NQk9YX01BU0spID4+IFNPQ19TWVNURU1fU0xFRVBfTUJPWF9MU0IpCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfTUJPWF9TRVQoeCkgICAgICAgICAgICAgKCgoeCkgPDwgU09DX1NZU1RFTV9TTEVFUF9NQk9YX0xTQikgJiBTT0NfU1lTVEVNX1NMRUVQX01CT1hfTUFTSykKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9NQUNfSUZfTVNCICAgICAgICAgICAgICAyCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfTUFDX0lGX0xTQiAgICAgICAgICAgICAgMgorI2RlZmluZSBTT0NfU1lTVEVNX1NMRUVQX01BQ19JRl9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9NQUNfSUZfR0VUKHgpICAgICAgICAgICAoKCh4KSAmIFNPQ19TWVNURU1fU0xFRVBfTUFDX0lGX01BU0spID4+IFNPQ19TWVNURU1fU0xFRVBfTUFDX0lGX0xTQikKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9NQUNfSUZfU0VUKHgpICAgICAgICAgICAoKCh4KSA8PCBTT0NfU1lTVEVNX1NMRUVQX01BQ19JRl9MU0IpICYgU09DX1NZU1RFTV9TTEVFUF9NQUNfSUZfTUFTSykKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9MSUdIVF9NU0IgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfTElHSFRfTFNCICAgICAgICAgICAgICAgMQorI2RlZmluZSBTT0NfU1lTVEVNX1NMRUVQX0xJR0hUX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9MSUdIVF9HRVQoeCkgICAgICAgICAgICAoKCh4KSAmIFNPQ19TWVNURU1fU0xFRVBfTElHSFRfTUFTSykgPj4gU09DX1NZU1RFTV9TTEVFUF9MSUdIVF9MU0IpCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfTElHSFRfU0VUKHgpICAgICAgICAgICAgKCgoeCkgPDwgU09DX1NZU1RFTV9TTEVFUF9MSUdIVF9MU0IpICYgU09DX1NZU1RFTV9TTEVFUF9MSUdIVF9NQVNLKQorI2RlZmluZSBTT0NfU1lTVEVNX1NMRUVQX0RJU0FCTEVfTVNCICAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX1NZU1RFTV9TTEVFUF9ESVNBQkxFX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfRElTQUJMRV9NQVNLICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTT0NfU1lTVEVNX1NMRUVQX0RJU0FCTEVfR0VUKHgpICAgICAgICAgICgoKHgpICYgU09DX1NZU1RFTV9TTEVFUF9ESVNBQkxFX01BU0spID4+IFNPQ19TWVNURU1fU0xFRVBfRElTQUJMRV9MU0IpCisjZGVmaW5lIFNPQ19TWVNURU1fU0xFRVBfRElTQUJMRV9TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgU09DX1NZU1RFTV9TTEVFUF9ESVNBQkxFX0xTQikgJiBTT0NfU1lTVEVNX1NMRUVQX0RJU0FCTEVfTUFTSykKKworI2RlZmluZSBTT0NfU0RJT19XUkFQUEVSX0FERFJFU1MgICAgICAgICAgICAgICAgIDB4MDAwMDAwYzgKKyNkZWZpbmUgU09DX1NESU9fV1JBUFBFUl9PRkZTRVQgICAgICAgICAgICAgICAgICAweDAwMDAwMGM4CisjZGVmaW5lIFNPQ19TRElPX1dSQVBQRVJfU0xFRVBfTVNCICAgICAgICAgICAgICAgMworI2RlZmluZSBTT0NfU0RJT19XUkFQUEVSX1NMRUVQX0xTQiAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU09DX1NESU9fV1JBUFBFUl9TTEVFUF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFNPQ19TRElPX1dSQVBQRVJfU0xFRVBfR0VUKHgpICAgICAgICAgICAgKCgoeCkgJiBTT0NfU0RJT19XUkFQUEVSX1NMRUVQX01BU0spID4+IFNPQ19TRElPX1dSQVBQRVJfU0xFRVBfTFNCKQorI2RlZmluZSBTT0NfU0RJT19XUkFQUEVSX1NMRUVQX1NFVCh4KSAgICAgICAgICAgICgoKHgpIDw8IFNPQ19TRElPX1dSQVBQRVJfU0xFRVBfTFNCKSAmIFNPQ19TRElPX1dSQVBQRVJfU0xFRVBfTUFTSykKKyNkZWZpbmUgU09DX1NESU9fV1JBUFBFUl9XQUtFVVBfTVNCICAgICAgICAgICAgICAyCisjZGVmaW5lIFNPQ19TRElPX1dSQVBQRVJfV0FLRVVQX0xTQiAgICAgICAgICAgICAgMgorI2RlZmluZSBTT0NfU0RJT19XUkFQUEVSX1dBS0VVUF9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU09DX1NESU9fV1JBUFBFUl9XQUtFVVBfR0VUKHgpICAgICAgICAgICAoKCh4KSAmIFNPQ19TRElPX1dSQVBQRVJfV0FLRVVQX01BU0spID4+IFNPQ19TRElPX1dSQVBQRVJfV0FLRVVQX0xTQikKKyNkZWZpbmUgU09DX1NESU9fV1JBUFBFUl9XQUtFVVBfU0VUKHgpICAgICAgICAgICAoKCh4KSA8PCBTT0NfU0RJT19XUkFQUEVSX1dBS0VVUF9MU0IpICYgU09DX1NESU9fV1JBUFBFUl9XQUtFVVBfTUFTSykKKyNkZWZpbmUgU09DX1NESU9fV1JBUFBFUl9TT0NfT05fTVNCICAgICAgICAgICAgICAxCisjZGVmaW5lIFNPQ19TRElPX1dSQVBQRVJfU09DX09OX0xTQiAgICAgICAgICAgICAgMQorI2RlZmluZSBTT0NfU0RJT19XUkFQUEVSX1NPQ19PTl9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU09DX1NESU9fV1JBUFBFUl9TT0NfT05fR0VUKHgpICAgICAgICAgICAoKCh4KSAmIFNPQ19TRElPX1dSQVBQRVJfU09DX09OX01BU0spID4+IFNPQ19TRElPX1dSQVBQRVJfU09DX09OX0xTQikKKyNkZWZpbmUgU09DX1NESU9fV1JBUFBFUl9TT0NfT05fU0VUKHgpICAgICAgICAgICAoKCh4KSA8PCBTT0NfU0RJT19XUkFQUEVSX1NPQ19PTl9MU0IpICYgU09DX1NESU9fV1JBUFBFUl9TT0NfT05fTUFTSykKKyNkZWZpbmUgU09DX1NESU9fV1JBUFBFUl9PTl9NU0IgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19TRElPX1dSQVBQRVJfT05fTFNCICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfU0RJT19XUkFQUEVSX09OX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU09DX1NESU9fV1JBUFBFUl9PTl9HRVQoeCkgICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19TRElPX1dSQVBQRVJfT05fTUFTSykgPj4gU09DX1NESU9fV1JBUFBFUl9PTl9MU0IpCisjZGVmaW5lIFNPQ19TRElPX1dSQVBQRVJfT05fU0VUKHgpICAgICAgICAgICAgICAgKCgoeCkgPDwgU09DX1NESU9fV1JBUFBFUl9PTl9MU0IpICYgU09DX1NESU9fV1JBUFBFUl9PTl9NQVNLKQorCisjZGVmaW5lIFNPQ19JTlRfU0xFRVBfTUFTS19BRERSRVNTICAgICAgICAgICAgICAgMHgwMDAwMDBjYworI2RlZmluZSBTT0NfSU5UX1NMRUVQX01BU0tfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAwY2MKKyNkZWZpbmUgU09DX0lOVF9TTEVFUF9NQVNLX0JJVE1BUF9NU0IgICAgICAgICAgICAzMQorI2RlZmluZSBTT0NfSU5UX1NMRUVQX01BU0tfQklUTUFQX0xTQiAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX0lOVF9TTEVFUF9NQVNLX0JJVE1BUF9NQVNLICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIFNPQ19JTlRfU0xFRVBfTUFTS19CSVRNQVBfR0VUKHgpICAgICAgICAgKCgoeCkgJiBTT0NfSU5UX1NMRUVQX01BU0tfQklUTUFQX01BU0spID4+IFNPQ19JTlRfU0xFRVBfTUFTS19CSVRNQVBfTFNCKQorI2RlZmluZSBTT0NfSU5UX1NMRUVQX01BU0tfQklUTUFQX1NFVCh4KSAgICAgICAgICgoKHgpIDw8IFNPQ19JTlRfU0xFRVBfTUFTS19CSVRNQVBfTFNCKSAmIFNPQ19JTlRfU0xFRVBfTUFTS19CSVRNQVBfTUFTSykKKworI2RlZmluZSBTT0NfTFBPX0NBTF9USU1FX0FERFJFU1MgICAgICAgICAgICAgICAgIDB4MDAwMDAwZDQKKyNkZWZpbmUgU09DX0xQT19DQUxfVElNRV9PRkZTRVQgICAgICAgICAgICAgICAgICAweDAwMDAwMGQ0CisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RJTUVfTEVOR1RIX01TQiAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgU09DX0xQT19DQUxfVElNRV9MRU5HVEhfTFNCICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RJTUVfTEVOR1RIX01BU0sgICAgICAgICAgICAgMHgwMDAwM2ZmZgorI2RlZmluZSBTT0NfTFBPX0NBTF9USU1FX0xFTkdUSF9HRVQoeCkgICAgICAgICAgICgoKHgpICYgU09DX0xQT19DQUxfVElNRV9MRU5HVEhfTUFTSykgPj4gU09DX0xQT19DQUxfVElNRV9MRU5HVEhfTFNCKQorI2RlZmluZSBTT0NfTFBPX0NBTF9USU1FX0xFTkdUSF9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IFNPQ19MUE9fQ0FMX1RJTUVfTEVOR1RIX0xTQikgJiBTT0NfTFBPX0NBTF9USU1FX0xFTkdUSF9NQVNLKQorCisjZGVmaW5lIFNPQ19MUE9fSU5JVF9ESVZJREVORF9JTlRfQUREUkVTUyAgICAgICAgMHgwMDAwMDBkOAorI2RlZmluZSBTT0NfTFBPX0lOSVRfRElWSURFTkRfSU5UX09GRlNFVCAgICAgICAgIDB4MDAwMDAwZDgKKyNkZWZpbmUgU09DX0xQT19JTklUX0RJVklERU5EX0lOVF9WQUxVRV9NU0IgICAgICAyMworI2RlZmluZSBTT0NfTFBPX0lOSVRfRElWSURFTkRfSU5UX1ZBTFVFX0xTQiAgICAgIDAKKyNkZWZpbmUgU09DX0xQT19JTklUX0RJVklERU5EX0lOVF9WQUxVRV9NQVNLICAgICAweDAwZmZmZmZmCisjZGVmaW5lIFNPQ19MUE9fSU5JVF9ESVZJREVORF9JTlRfVkFMVUVfR0VUKHgpICAgKCgoeCkgJiBTT0NfTFBPX0lOSVRfRElWSURFTkRfSU5UX1ZBTFVFX01BU0spID4+IFNPQ19MUE9fSU5JVF9ESVZJREVORF9JTlRfVkFMVUVfTFNCKQorI2RlZmluZSBTT0NfTFBPX0lOSVRfRElWSURFTkRfSU5UX1ZBTFVFX1NFVCh4KSAgICgoKHgpIDw8IFNPQ19MUE9fSU5JVF9ESVZJREVORF9JTlRfVkFMVUVfTFNCKSAmIFNPQ19MUE9fSU5JVF9ESVZJREVORF9JTlRfVkFMVUVfTUFTSykKKworI2RlZmluZSBTT0NfTFBPX0lOSVRfRElWSURFTkRfRlJBQ1RJT05fQUREUkVTUyAgIDB4MDAwMDAwZGMKKyNkZWZpbmUgU09DX0xQT19JTklUX0RJVklERU5EX0ZSQUNUSU9OX09GRlNFVCAgICAweDAwMDAwMGRjCisjZGVmaW5lIFNPQ19MUE9fSU5JVF9ESVZJREVORF9GUkFDVElPTl9WQUxVRV9NU0IgMTAKKyNkZWZpbmUgU09DX0xQT19JTklUX0RJVklERU5EX0ZSQUNUSU9OX1ZBTFVFX0xTQiAwCisjZGVmaW5lIFNPQ19MUE9fSU5JVF9ESVZJREVORF9GUkFDVElPTl9WQUxVRV9NQVNLIDB4MDAwMDA3ZmYKKyNkZWZpbmUgU09DX0xQT19JTklUX0RJVklERU5EX0ZSQUNUSU9OX1ZBTFVFX0dFVCh4KSAoKCh4KSAmIFNPQ19MUE9fSU5JVF9ESVZJREVORF9GUkFDVElPTl9WQUxVRV9NQVNLKSA+PiBTT0NfTFBPX0lOSVRfRElWSURFTkRfRlJBQ1RJT05fVkFMVUVfTFNCKQorI2RlZmluZSBTT0NfTFBPX0lOSVRfRElWSURFTkRfRlJBQ1RJT05fVkFMVUVfU0VUKHgpICgoKHgpIDw8IFNPQ19MUE9fSU5JVF9ESVZJREVORF9GUkFDVElPTl9WQUxVRV9MU0IpICYgU09DX0xQT19JTklUX0RJVklERU5EX0ZSQUNUSU9OX1ZBTFVFX01BU0spCisKKyNkZWZpbmUgU09DX0xQT19DQUxfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMGUwCisjZGVmaW5lIFNPQ19MUE9fQ0FMX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBlMAorI2RlZmluZSBTT0NfTFBPX0NBTF9FTkFCTEVfTVNCICAgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFNPQ19MUE9fQ0FMX0VOQUJMRV9MU0IgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgU09DX0xQT19DQUxfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFNPQ19MUE9fQ0FMX0VOQUJMRV9HRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiBTT0NfTFBPX0NBTF9FTkFCTEVfTUFTSykgPj4gU09DX0xQT19DQUxfRU5BQkxFX0xTQikKKyNkZWZpbmUgU09DX0xQT19DQUxfRU5BQkxFX1NFVCh4KSAgICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfTFBPX0NBTF9FTkFCTEVfTFNCKSAmIFNPQ19MUE9fQ0FMX0VOQUJMRV9NQVNLKQorI2RlZmluZSBTT0NfTFBPX0NBTF9DT1VOVF9NU0IgICAgICAgICAgICAgICAgICAgIDE5CisjZGVmaW5lIFNPQ19MUE9fQ0FMX0NPVU5UX0xTQiAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTT0NfTFBPX0NBTF9DT1VOVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwZmZmZmYKKyNkZWZpbmUgU09DX0xQT19DQUxfQ09VTlRfR0VUKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIFNPQ19MUE9fQ0FMX0NPVU5UX01BU0spID4+IFNPQ19MUE9fQ0FMX0NPVU5UX0xTQikKKyNkZWZpbmUgU09DX0xQT19DQUxfQ09VTlRfU0VUKHgpICAgICAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfTFBPX0NBTF9DT1VOVF9MU0IpICYgU09DX0xQT19DQUxfQ09VTlRfTUFTSykKKworI2RlZmluZSBTT0NfTFBPX0NBTF9URVNUX0NPTlRST0xfQUREUkVTUyAgICAgICAgIDB4MDAwMDAwZTQKKyNkZWZpbmUgU09DX0xQT19DQUxfVEVTVF9DT05UUk9MX09GRlNFVCAgICAgICAgICAweDAwMDAwMGU0CisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RFU1RfQ09OVFJPTF9FTkFCTEVfTVNCICAgICAgMTYKKyNkZWZpbmUgU09DX0xQT19DQUxfVEVTVF9DT05UUk9MX0VOQUJMRV9MU0IgICAgICAxNgorI2RlZmluZSBTT0NfTFBPX0NBTF9URVNUX0NPTlRST0xfRU5BQkxFX01BU0sgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgU09DX0xQT19DQUxfVEVTVF9DT05UUk9MX0VOQUJMRV9HRVQoeCkgICAoKCh4KSAmIFNPQ19MUE9fQ0FMX1RFU1RfQ09OVFJPTF9FTkFCTEVfTUFTSykgPj4gU09DX0xQT19DQUxfVEVTVF9DT05UUk9MX0VOQUJMRV9MU0IpCisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RFU1RfQ09OVFJPTF9FTkFCTEVfU0VUKHgpICAgKCgoeCkgPDwgU09DX0xQT19DQUxfVEVTVF9DT05UUk9MX0VOQUJMRV9MU0IpICYgU09DX0xQT19DQUxfVEVTVF9DT05UUk9MX0VOQUJMRV9NQVNLKQorI2RlZmluZSBTT0NfTFBPX0NBTF9URVNUX0NPTlRST0xfUlRDX0NZQ0xFU19NU0IgIDE1CisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RFU1RfQ09OVFJPTF9SVENfQ1lDTEVTX0xTQiAgMAorI2RlZmluZSBTT0NfTFBPX0NBTF9URVNUX0NPTlRST0xfUlRDX0NZQ0xFU19NQVNLIDB4MDAwMGZmZmYKKyNkZWZpbmUgU09DX0xQT19DQUxfVEVTVF9DT05UUk9MX1JUQ19DWUNMRVNfR0VUKHgpICgoKHgpICYgU09DX0xQT19DQUxfVEVTVF9DT05UUk9MX1JUQ19DWUNMRVNfTUFTSykgPj4gU09DX0xQT19DQUxfVEVTVF9DT05UUk9MX1JUQ19DWUNMRVNfTFNCKQorI2RlZmluZSBTT0NfTFBPX0NBTF9URVNUX0NPTlRST0xfUlRDX0NZQ0xFU19TRVQoeCkgKCgoeCkgPDwgU09DX0xQT19DQUxfVEVTVF9DT05UUk9MX1JUQ19DWUNMRVNfTFNCKSAmIFNPQ19MUE9fQ0FMX1RFU1RfQ09OVFJPTF9SVENfQ1lDTEVTX01BU0spCisKKyNkZWZpbmUgU09DX0xQT19DQUxfVEVTVF9TVEFUVVNfQUREUkVTUyAgICAgICAgICAweDAwMDAwMGU4CisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RFU1RfU1RBVFVTX09GRlNFVCAgICAgICAgICAgMHgwMDAwMDBlOAorI2RlZmluZSBTT0NfTFBPX0NBTF9URVNUX1NUQVRVU19SRUFEWV9NU0IgICAgICAgIDE2CisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RFU1RfU1RBVFVTX1JFQURZX0xTQiAgICAgICAgMTYKKyNkZWZpbmUgU09DX0xQT19DQUxfVEVTVF9TVEFUVVNfUkVBRFlfTUFTSyAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RFU1RfU1RBVFVTX1JFQURZX0dFVCh4KSAgICAgKCgoeCkgJiBTT0NfTFBPX0NBTF9URVNUX1NUQVRVU19SRUFEWV9NQVNLKSA+PiBTT0NfTFBPX0NBTF9URVNUX1NUQVRVU19SRUFEWV9MU0IpCisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RFU1RfU1RBVFVTX1JFQURZX1NFVCh4KSAgICAgKCgoeCkgPDwgU09DX0xQT19DQUxfVEVTVF9TVEFUVVNfUkVBRFlfTFNCKSAmIFNPQ19MUE9fQ0FMX1RFU1RfU1RBVFVTX1JFQURZX01BU0spCisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RFU1RfU1RBVFVTX0NPVU5UX01TQiAgICAgICAgMTUKKyNkZWZpbmUgU09DX0xQT19DQUxfVEVTVF9TVEFUVVNfQ09VTlRfTFNCICAgICAgICAwCisjZGVmaW5lIFNPQ19MUE9fQ0FMX1RFU1RfU1RBVFVTX0NPVU5UX01BU0sgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBTT0NfTFBPX0NBTF9URVNUX1NUQVRVU19DT1VOVF9HRVQoeCkgICAgICgoKHgpICYgU09DX0xQT19DQUxfVEVTVF9TVEFUVVNfQ09VTlRfTUFTSykgPj4gU09DX0xQT19DQUxfVEVTVF9TVEFUVVNfQ09VTlRfTFNCKQorI2RlZmluZSBTT0NfTFBPX0NBTF9URVNUX1NUQVRVU19DT1VOVF9TRVQoeCkgICAgICgoKHgpIDw8IFNPQ19MUE9fQ0FMX1RFU1RfU1RBVFVTX0NPVU5UX0xTQikgJiBTT0NfTFBPX0NBTF9URVNUX1NUQVRVU19DT1VOVF9NQVNLKQorCisjZGVmaW5lIExFR0FDWV9TT0NfQ0hJUF9JRF9BRERSRVNTICAgICAgICAgICAgICAgMHgwMDAwMDBlYworI2RlZmluZSBMRUdBQ1lfU09DX0NISVBfSURfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAwZWMKKyNkZWZpbmUgTEVHQUNZX1NPQ19DSElQX0lEX0RFVklDRV9JRF9NU0IgICAgICAgICAzMQorI2RlZmluZSBMRUdBQ1lfU09DX0NISVBfSURfREVWSUNFX0lEX0xTQiAgICAgICAgIDE2CisjZGVmaW5lIExFR0FDWV9TT0NfQ0hJUF9JRF9ERVZJQ0VfSURfTUFTSyAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBMRUdBQ1lfU09DX0NISVBfSURfREVWSUNFX0lEX0dFVCh4KSAgICAgICgoKHgpICYgTEVHQUNZX1NPQ19DSElQX0lEX0RFVklDRV9JRF9NQVNLKSA+PiBMRUdBQ1lfU09DX0NISVBfSURfREVWSUNFX0lEX0xTQikKKyNkZWZpbmUgTEVHQUNZX1NPQ19DSElQX0lEX0RFVklDRV9JRF9TRVQoeCkgICAgICAoKCh4KSA8PCBMRUdBQ1lfU09DX0NISVBfSURfREVWSUNFX0lEX0xTQikgJiBMRUdBQ1lfU09DX0NISVBfSURfREVWSUNFX0lEX01BU0spCisjZGVmaW5lIExFR0FDWV9TT0NfQ0hJUF9JRF9DT05GSUdfSURfTVNCICAgICAgICAgMTUKKyNkZWZpbmUgTEVHQUNZX1NPQ19DSElQX0lEX0NPTkZJR19JRF9MU0IgICAgICAgICA0CisjZGVmaW5lIExFR0FDWV9TT0NfQ0hJUF9JRF9DT05GSUdfSURfTUFTSyAgICAgICAgMHgwMDAwZmZmMAorI2RlZmluZSBMRUdBQ1lfU09DX0NISVBfSURfQ09ORklHX0lEX0dFVCh4KSAgICAgICgoKHgpICYgTEVHQUNZX1NPQ19DSElQX0lEX0NPTkZJR19JRF9NQVNLKSA+PiBMRUdBQ1lfU09DX0NISVBfSURfQ09ORklHX0lEX0xTQikKKyNkZWZpbmUgTEVHQUNZX1NPQ19DSElQX0lEX0NPTkZJR19JRF9TRVQoeCkgICAgICAoKCh4KSA8PCBMRUdBQ1lfU09DX0NISVBfSURfQ09ORklHX0lEX0xTQikgJiBMRUdBQ1lfU09DX0NISVBfSURfQ09ORklHX0lEX01BU0spCisjZGVmaW5lIExFR0FDWV9TT0NfQ0hJUF9JRF9WRVJTSU9OX0lEX01TQiAgICAgICAgMworI2RlZmluZSBMRUdBQ1lfU09DX0NISVBfSURfVkVSU0lPTl9JRF9MU0IgICAgICAgIDAKKyNkZWZpbmUgTEVHQUNZX1NPQ19DSElQX0lEX1ZFUlNJT05fSURfTUFTSyAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIExFR0FDWV9TT0NfQ0hJUF9JRF9WRVJTSU9OX0lEX0dFVCh4KSAgICAgKCgoeCkgJiBMRUdBQ1lfU09DX0NISVBfSURfVkVSU0lPTl9JRF9NQVNLKSA+PiBMRUdBQ1lfU09DX0NISVBfSURfVkVSU0lPTl9JRF9MU0IpCisjZGVmaW5lIExFR0FDWV9TT0NfQ0hJUF9JRF9WRVJTSU9OX0lEX1NFVCh4KSAgICAgKCgoeCkgPDwgTEVHQUNZX1NPQ19DSElQX0lEX1ZFUlNJT05fSURfTFNCKSAmIExFR0FDWV9TT0NfQ0hJUF9JRF9WRVJTSU9OX0lEX01BU0spCisKKyNkZWZpbmUgU09DX0NISVBfSURfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMGYwCisjZGVmaW5lIFNPQ19DSElQX0lEX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBmMAorI2RlZmluZSBTT0NfQ0hJUF9JRF9ERVZJQ0VfSURfTVNCICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFNPQ19DSElQX0lEX0RFVklDRV9JRF9MU0IgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgU09DX0NISVBfSURfREVWSUNFX0lEX01BU0sgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIFNPQ19DSElQX0lEX0RFVklDRV9JRF9HRVQoeCkgICAgICAgICAgICAgKCgoeCkgJiBTT0NfQ0hJUF9JRF9ERVZJQ0VfSURfTUFTSykgPj4gU09DX0NISVBfSURfREVWSUNFX0lEX0xTQikKKyNkZWZpbmUgU09DX0NISVBfSURfREVWSUNFX0lEX1NFVCh4KSAgICAgICAgICAgICAoKCh4KSA8PCBTT0NfQ0hJUF9JRF9ERVZJQ0VfSURfTFNCKSAmIFNPQ19DSElQX0lEX0RFVklDRV9JRF9NQVNLKQorI2RlZmluZSBTT0NfQ0hJUF9JRF9DT05GSUdfSURfTVNCICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFNPQ19DSElQX0lEX0NPTkZJR19JRF9MU0IgICAgICAgICAgICAgICAgNAorI2RlZmluZSBTT0NfQ0hJUF9JRF9DT05GSUdfSURfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMGZmZjAKKyNkZWZpbmUgU09DX0NISVBfSURfQ09ORklHX0lEX0dFVCh4KSAgICAgICAgICAgICAoKCh4KSAmIFNPQ19DSElQX0lEX0NPTkZJR19JRF9NQVNLKSA+PiBTT0NfQ0hJUF9JRF9DT05GSUdfSURfTFNCKQorI2RlZmluZSBTT0NfQ0hJUF9JRF9DT05GSUdfSURfU0VUKHgpICAgICAgICAgICAgICgoKHgpIDw8IFNPQ19DSElQX0lEX0NPTkZJR19JRF9MU0IpICYgU09DX0NISVBfSURfQ09ORklHX0lEX01BU0spCisjZGVmaW5lIFNPQ19DSElQX0lEX1ZFUlNJT05fSURfTVNCICAgICAgICAgICAgICAgMworI2RlZmluZSBTT0NfQ0hJUF9JRF9WRVJTSU9OX0lEX0xTQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX0NISVBfSURfVkVSU0lPTl9JRF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIFNPQ19DSElQX0lEX1ZFUlNJT05fSURfR0VUKHgpICAgICAgICAgICAgKCgoeCkgJiBTT0NfQ0hJUF9JRF9WRVJTSU9OX0lEX01BU0spID4+IFNPQ19DSElQX0lEX1ZFUlNJT05fSURfTFNCKQorI2RlZmluZSBTT0NfQ0hJUF9JRF9WRVJTSU9OX0lEX1NFVCh4KSAgICAgICAgICAgICgoKHgpIDw8IFNPQ19DSElQX0lEX1ZFUlNJT05fSURfTFNCKSAmIFNPQ19DSElQX0lEX1ZFUlNJT05fSURfTUFTSykKKworI2RlZmluZSBTT0NfUE9XRVJfUkVHX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMGMKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTBjCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfRElTQ09OX01PREVfRU5fTVNCICAgICAgICAgMTYKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19ESVNDT05fTU9ERV9FTl9MU0IgICAgICAgICAxNgorI2RlZmluZSBTT0NfUE9XRVJfUkVHX0RJU0NPTl9NT0RFX0VOX01BU0sgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19ESVNDT05fTU9ERV9FTl9HRVQoeCkgICAgICAoKCh4KSAmIFNPQ19QT1dFUl9SRUdfRElTQ09OX01PREVfRU5fTUFTSykgPj4gU09DX1BPV0VSX1JFR19ESVNDT05fTU9ERV9FTl9MU0IpCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfRElTQ09OX01PREVfRU5fU0VUKHgpICAgICAgKCgoeCkgPDwgU09DX1BPV0VSX1JFR19ESVNDT05fTU9ERV9FTl9MU0IpICYgU09DX1BPV0VSX1JFR19ESVNDT05fTU9ERV9FTl9NQVNLKQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX0RFRVBfU0xFRVBfRU5fTVNCICAgICAgICAgIDE1CisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfREVFUF9TTEVFUF9FTl9MU0IgICAgICAgICAgMTUKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19ERUVQX1NMRUVQX0VOX01BU0sgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfREVFUF9TTEVFUF9FTl9HRVQoeCkgICAgICAgKCgoeCkgJiBTT0NfUE9XRVJfUkVHX0RFRVBfU0xFRVBfRU5fTUFTSykgPj4gU09DX1BPV0VSX1JFR19ERUVQX1NMRUVQX0VOX0xTQikKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19ERUVQX1NMRUVQX0VOX1NFVCh4KSAgICAgICAoKCh4KSA8PCBTT0NfUE9XRVJfUkVHX0RFRVBfU0xFRVBfRU5fTFNCKSAmIFNPQ19QT1dFUl9SRUdfREVFUF9TTEVFUF9FTl9NQVNLKQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX0RFQlVHX0VOX01TQiAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfREVCVUdfRU5fTFNCICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19ERUJVR19FTl9NQVNLICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfREVCVUdfRU5fR0VUKHgpICAgICAgICAgICAgKCgoeCkgJiBTT0NfUE9XRVJfUkVHX0RFQlVHX0VOX01BU0spID4+IFNPQ19QT1dFUl9SRUdfREVCVUdfRU5fTFNCKQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX0RFQlVHX0VOX1NFVCh4KSAgICAgICAgICAgICgoKHgpIDw8IFNPQ19QT1dFUl9SRUdfREVCVUdfRU5fTFNCKSAmIFNPQ19QT1dFUl9SRUdfREVCVUdfRU5fTUFTSykKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19XTEFOX0JCX1BXRF9FTl9NU0IgICAgICAgICAxMworI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fQkJfUFdEX0VOX0xTQiAgICAgICAgIDEzCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfV0xBTl9CQl9QV0RfRU5fTUFTSyAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fQkJfUFdEX0VOX0dFVCh4KSAgICAgICgoKHgpICYgU09DX1BPV0VSX1JFR19XTEFOX0JCX1BXRF9FTl9NQVNLKSA+PiBTT0NfUE9XRVJfUkVHX1dMQU5fQkJfUFdEX0VOX0xTQikKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19XTEFOX0JCX1BXRF9FTl9TRVQoeCkgICAgICAoKCh4KSA8PCBTT0NfUE9XRVJfUkVHX1dMQU5fQkJfUFdEX0VOX0xTQikgJiBTT0NfUE9XRVJfUkVHX1dMQU5fQkJfUFdEX0VOX01BU0spCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfV0xBTl9NQUNfUFdEX0VOX01TQiAgICAgICAgMTIKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19XTEFOX01BQ19QV0RfRU5fTFNCICAgICAgICAxMgorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fTUFDX1BXRF9FTl9NQVNLICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19XTEFOX01BQ19QV0RfRU5fR0VUKHgpICAgICAoKCh4KSAmIFNPQ19QT1dFUl9SRUdfV0xBTl9NQUNfUFdEX0VOX01BU0spID4+IFNPQ19QT1dFUl9SRUdfV0xBTl9NQUNfUFdEX0VOX0xTQikKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19XTEFOX01BQ19QV0RfRU5fU0VUKHgpICAgICAoKCh4KSA8PCBTT0NfUE9XRVJfUkVHX1dMQU5fTUFDX1BXRF9FTl9MU0IpICYgU09DX1BPV0VSX1JFR19XTEFOX01BQ19QV0RfRU5fTUFTSykKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19DUFVfSU5UX0VOQUJMRV9NU0IgICAgICAgICA3CisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfQ1BVX0lOVF9FTkFCTEVfTFNCICAgICAgICAgNworI2RlZmluZSBTT0NfUE9XRVJfUkVHX0NQVV9JTlRfRU5BQkxFX01BU0sgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19DUFVfSU5UX0VOQUJMRV9HRVQoeCkgICAgICAoKCh4KSAmIFNPQ19QT1dFUl9SRUdfQ1BVX0lOVF9FTkFCTEVfTUFTSykgPj4gU09DX1BPV0VSX1JFR19DUFVfSU5UX0VOQUJMRV9MU0IpCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfQ1BVX0lOVF9FTkFCTEVfU0VUKHgpICAgICAgKCgoeCkgPDwgU09DX1BPV0VSX1JFR19DUFVfSU5UX0VOQUJMRV9MU0IpICYgU09DX1BPV0VSX1JFR19DUFVfSU5UX0VOQUJMRV9NQVNLKQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fSVNPX0RJU19NU0IgICAgICAgICAgIDYKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19XTEFOX0lTT19ESVNfTFNCICAgICAgICAgICA2CisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfV0xBTl9JU09fRElTX01BU0sgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fSVNPX0RJU19HRVQoeCkgICAgICAgICgoKHgpICYgU09DX1BPV0VSX1JFR19XTEFOX0lTT19ESVNfTUFTSykgPj4gU09DX1BPV0VSX1JFR19XTEFOX0lTT19ESVNfTFNCKQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fSVNPX0RJU19TRVQoeCkgICAgICAgICgoKHgpIDw8IFNPQ19QT1dFUl9SRUdfV0xBTl9JU09fRElTX0xTQikgJiBTT0NfUE9XRVJfUkVHX1dMQU5fSVNPX0RJU19NQVNLKQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fSVNPX0NOVExfTVNCICAgICAgICAgIDUKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19XTEFOX0lTT19DTlRMX0xTQiAgICAgICAgICA1CisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfV0xBTl9JU09fQ05UTF9NQVNLICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fSVNPX0NOVExfR0VUKHgpICAgICAgICgoKHgpICYgU09DX1BPV0VSX1JFR19XTEFOX0lTT19DTlRMX01BU0spID4+IFNPQ19QT1dFUl9SRUdfV0xBTl9JU09fQ05UTF9MU0IpCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfV0xBTl9JU09fQ05UTF9TRVQoeCkgICAgICAgKCgoeCkgPDwgU09DX1BPV0VSX1JFR19XTEFOX0lTT19DTlRMX0xTQikgJiBTT0NfUE9XRVJfUkVHX1dMQU5fSVNPX0NOVExfTUFTSykKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19SQURJT19QV0RfRU5fTVNCICAgICAgICAgICA0CisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfUkFESU9fUFdEX0VOX0xTQiAgICAgICAgICAgNAorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1JBRElPX1BXRF9FTl9NQVNLICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19SQURJT19QV0RfRU5fR0VUKHgpICAgICAgICAoKCh4KSAmIFNPQ19QT1dFUl9SRUdfUkFESU9fUFdEX0VOX01BU0spID4+IFNPQ19QT1dFUl9SRUdfUkFESU9fUFdEX0VOX0xTQikKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19SQURJT19QV0RfRU5fU0VUKHgpICAgICAgICAoKCh4KSA8PCBTT0NfUE9XRVJfUkVHX1JBRElPX1BXRF9FTl9MU0IpICYgU09DX1BPV0VSX1JFR19SQURJT19QV0RfRU5fTUFTSykKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19TT0NfSVNPX0VOX01TQiAgICAgICAgICAgICAzCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfU09DX0lTT19FTl9MU0IgICAgICAgICAgICAgMworI2RlZmluZSBTT0NfUE9XRVJfUkVHX1NPQ19JU09fRU5fTUFTSyAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19TT0NfSVNPX0VOX0dFVCh4KSAgICAgICAgICAoKCh4KSAmIFNPQ19QT1dFUl9SRUdfU09DX0lTT19FTl9NQVNLKSA+PiBTT0NfUE9XRVJfUkVHX1NPQ19JU09fRU5fTFNCKQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1NPQ19JU09fRU5fU0VUKHgpICAgICAgICAgICgoKHgpIDw8IFNPQ19QT1dFUl9SRUdfU09DX0lTT19FTl9MU0IpICYgU09DX1BPV0VSX1JFR19TT0NfSVNPX0VOX01BU0spCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfV0xBTl9JU09fRU5fTVNCICAgICAgICAgICAgMgorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fSVNPX0VOX0xTQiAgICAgICAgICAgIDIKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19XTEFOX0lTT19FTl9NQVNLICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfV0xBTl9JU09fRU5fR0VUKHgpICAgICAgICAgKCgoeCkgJiBTT0NfUE9XRVJfUkVHX1dMQU5fSVNPX0VOX01BU0spID4+IFNPQ19QT1dFUl9SRUdfV0xBTl9JU09fRU5fTFNCKQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fSVNPX0VOX1NFVCh4KSAgICAgICAgICgoKHgpIDw8IFNPQ19QT1dFUl9SRUdfV0xBTl9JU09fRU5fTFNCKSAmIFNPQ19QT1dFUl9SRUdfV0xBTl9JU09fRU5fTUFTSykKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19XTEFOX1BXRF9FTl9NU0IgICAgICAgICAgICAxCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfV0xBTl9QV0RfRU5fTFNCICAgICAgICAgICAgMQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1dMQU5fUFdEX0VOX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19XTEFOX1BXRF9FTl9HRVQoeCkgICAgICAgICAoKCh4KSAmIFNPQ19QT1dFUl9SRUdfV0xBTl9QV0RfRU5fTUFTSykgPj4gU09DX1BPV0VSX1JFR19XTEFOX1BXRF9FTl9MU0IpCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfV0xBTl9QV0RfRU5fU0VUKHgpICAgICAgICAgKCgoeCkgPDwgU09DX1BPV0VSX1JFR19XTEFOX1BXRF9FTl9MU0IpICYgU09DX1BPV0VSX1JFR19XTEFOX1BXRF9FTl9NQVNLKQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1BPV0VSX0VOX01TQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19QT1dFUl9FTl9MU0IgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19QT1dFUl9SRUdfUE9XRVJfRU5fTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTT0NfUE9XRVJfUkVHX1BPV0VSX0VOX0dFVCh4KSAgICAgICAgICAgICgoKHgpICYgU09DX1BPV0VSX1JFR19QT1dFUl9FTl9NQVNLKSA+PiBTT0NfUE9XRVJfUkVHX1BPV0VSX0VOX0xTQikKKyNkZWZpbmUgU09DX1BPV0VSX1JFR19QT1dFUl9FTl9TRVQoeCkgICAgICAgICAgICAoKCh4KSA8PCBTT0NfUE9XRVJfUkVHX1BPV0VSX0VOX0xTQikgJiBTT0NfUE9XRVJfUkVHX1BPV0VSX0VOX01BU0spCisKKyNkZWZpbmUgU09DX0NPUkVfQ0xLX0NUUkxfQUREUkVTUyAgICAgICAgICAgICAgICAweDAwMDAwMTEwCisjZGVmaW5lIFNPQ19DT1JFX0NMS19DVFJMX09GRlNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAorI2RlZmluZSBTT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTVNCICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU09DX0NPUkVfQ0xLX0NUUkxfRElWX0xTQiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNPQ19DT1JFX0NMS19DVFJMX0RJVl9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBTT0NfQ09SRV9DTEtfQ1RSTF9ESVZfR0VUKHgpICAgICAgICAgICAgICgoKHgpICYgU09DX0NPUkVfQ0xLX0NUUkxfRElWX01BU0spID4+IFNPQ19DT1JFX0NMS19DVFJMX0RJVl9MU0IpCisjZGVmaW5lIFNPQ19DT1JFX0NMS19DVFJMX0RJVl9TRVQoeCkgICAgICAgICAgICAgKCgoeCkgPDwgU09DX0NPUkVfQ0xLX0NUUkxfRElWX0xTQikgJiBTT0NfQ09SRV9DTEtfQ1RSTF9ESVZfTUFTSykKKworI2RlZmluZSBTT0NfR1BJT19XQUtFVVBfQ09OVFJPTF9BRERSRVNTICAgICAgICAgIDB4MDAwMDAxMTQKKyNkZWZpbmUgU09DX0dQSU9fV0FLRVVQX0NPTlRST0xfT0ZGU0VUICAgICAgICAgICAweDAwMDAwMTE0CisjZGVmaW5lIFNPQ19HUElPX1dBS0VVUF9DT05UUk9MX0VOQUJMRV9NU0IgICAgICAgMAorI2RlZmluZSBTT0NfR1BJT19XQUtFVVBfQ09OVFJPTF9FTkFCTEVfTFNCICAgICAgIDAKKyNkZWZpbmUgU09DX0dQSU9fV0FLRVVQX0NPTlRST0xfRU5BQkxFX01BU0sgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNPQ19HUElPX1dBS0VVUF9DT05UUk9MX0VOQUJMRV9HRVQoeCkgICAgKCgoeCkgJiBTT0NfR1BJT19XQUtFVVBfQ09OVFJPTF9FTkFCTEVfTUFTSykgPj4gU09DX0dQSU9fV0FLRVVQX0NPTlRST0xfRU5BQkxFX0xTQikKKyNkZWZpbmUgU09DX0dQSU9fV0FLRVVQX0NPTlRST0xfRU5BQkxFX1NFVCh4KSAgICAoKCh4KSA8PCBTT0NfR1BJT19XQUtFVVBfQ09OVFJPTF9FTkFCTEVfTFNCKSAmIFNPQ19HUElPX1dBS0VVUF9DT05UUk9MX0VOQUJMRV9NQVNLKQorCisjZGVmaW5lIFNMRUVQX1JFVEVOVElPTl9BRERSRVNTICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNAorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTQKKyNkZWZpbmUgU0xFRVBfUkVURU5USU9OX0dSRUVOX1NBVkVfTVNCICAgICAgICAgICAxMAorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fR1JFRU5fU0FWRV9MU0IgICAgICAgICAgIDEwCisjZGVmaW5lIFNMRUVQX1JFVEVOVElPTl9HUkVFTl9TQVZFX01BU0sgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fR1JFRU5fU0FWRV9HRVQoeCkgICAgICAgICgoKHgpICYgU0xFRVBfUkVURU5USU9OX0dSRUVOX1NBVkVfTUFTSykgPj4gU0xFRVBfUkVURU5USU9OX0dSRUVOX1NBVkVfTFNCKQorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fR1JFRU5fU0FWRV9TRVQoeCkgICAgICAgICgoKHgpIDw8IFNMRUVQX1JFVEVOVElPTl9HUkVFTl9TQVZFX0xTQikgJiBTTEVFUF9SRVRFTlRJT05fR1JFRU5fU0FWRV9NQVNLKQorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fVElNRV9NU0IgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgU0xFRVBfUkVURU5USU9OX1RJTUVfTFNCICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNMRUVQX1JFVEVOVElPTl9USU1FX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDNmYworI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fVElNRV9HRVQoeCkgICAgICAgICAgICAgICgoKHgpICYgU0xFRVBfUkVURU5USU9OX1RJTUVfTUFTSykgPj4gU0xFRVBfUkVURU5USU9OX1RJTUVfTFNCKQorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fVElNRV9TRVQoeCkgICAgICAgICAgICAgICgoKHgpIDw8IFNMRUVQX1JFVEVOVElPTl9USU1FX0xTQikgJiBTTEVFUF9SRVRFTlRJT05fVElNRV9NQVNLKQorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fTU9ERV9NU0IgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0xFRVBfUkVURU5USU9OX01PREVfTFNCICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNMRUVQX1JFVEVOVElPTl9NT0RFX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fTU9ERV9HRVQoeCkgICAgICAgICAgICAgICgoKHgpICYgU0xFRVBfUkVURU5USU9OX01PREVfTUFTSykgPj4gU0xFRVBfUkVURU5USU9OX01PREVfTFNCKQorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fTU9ERV9TRVQoeCkgICAgICAgICAgICAgICgoKHgpIDw8IFNMRUVQX1JFVEVOVElPTl9NT0RFX0xTQikgJiBTTEVFUF9SRVRFTlRJT05fTU9ERV9NQVNLKQorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fRU5BQkxFX01TQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0xFRVBfUkVURU5USU9OX0VOQUJMRV9MU0IgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNMRUVQX1JFVEVOVElPTl9FTkFCTEVfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTTEVFUF9SRVRFTlRJT05fRU5BQkxFX0dFVCh4KSAgICAgICAgICAgICgoKHgpICYgU0xFRVBfUkVURU5USU9OX0VOQUJMRV9NQVNLKSA+PiBTTEVFUF9SRVRFTlRJT05fRU5BQkxFX0xTQikKKyNkZWZpbmUgU0xFRVBfUkVURU5USU9OX0VOQUJMRV9TRVQoeCkgICAgICAgICAgICAoKCh4KSA8PCBTTEVFUF9SRVRFTlRJT05fRU5BQkxFX0xTQikgJiBTTEVFUF9SRVRFTlRJT05fRU5BQkxFX01BU0spCisKKyNkZWZpbmUgTFBfUEVSRl9DT1VOVEVSX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDAwMjg0CisjZGVmaW5lIExQX1BFUkZfQ09VTlRFUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDI4NAorI2RlZmluZSBMUF9QRVJGX0NPVU5URVJfRU5fTVNCICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTFBfUEVSRl9DT1VOVEVSX0VOX0xTQiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExQX1BFUkZfQ09VTlRFUl9FTl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBMUF9QRVJGX0NPVU5URVJfRU5fR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgTFBfUEVSRl9DT1VOVEVSX0VOX01BU0spID4+IExQX1BFUkZfQ09VTlRFUl9FTl9MU0IpCisjZGVmaW5lIExQX1BFUkZfQ09VTlRFUl9FTl9TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgTFBfUEVSRl9DT1VOVEVSX0VOX0xTQikgJiBMUF9QRVJGX0NPVU5URVJfRU5fTUFTSykKKworI2RlZmluZSBMUF9QRVJGX0xJR0hUX1NMRUVQX0FERFJFU1MgICAgICAgICAgICAgIDB4MDAwMDAyODgKKyNkZWZpbmUgTFBfUEVSRl9MSUdIVF9TTEVFUF9PRkZTRVQgICAgICAgICAgICAgICAweDAwMDAwMjg4CisjZGVmaW5lIExQX1BFUkZfTElHSFRfU0xFRVBfQ05UX01TQiAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgTFBfUEVSRl9MSUdIVF9TTEVFUF9DTlRfTFNCICAgICAgICAgICAgICAwCisjZGVmaW5lIExQX1BFUkZfTElHSFRfU0xFRVBfQ05UX01BU0sgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBMUF9QRVJGX0xJR0hUX1NMRUVQX0NOVF9HRVQoeCkgICAgICAgICAgICgoKHgpICYgTFBfUEVSRl9MSUdIVF9TTEVFUF9DTlRfTUFTSykgPj4gTFBfUEVSRl9MSUdIVF9TTEVFUF9DTlRfTFNCKQorI2RlZmluZSBMUF9QRVJGX0xJR0hUX1NMRUVQX0NOVF9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IExQX1BFUkZfTElHSFRfU0xFRVBfQ05UX0xTQikgJiBMUF9QRVJGX0xJR0hUX1NMRUVQX0NOVF9NQVNLKQorCisjZGVmaW5lIExQX1BFUkZfREVFUF9TTEVFUF9BRERSRVNTICAgICAgICAgICAgICAgMHgwMDAwMDI4YworI2RlZmluZSBMUF9QRVJGX0RFRVBfU0xFRVBfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAyOGMKKyNkZWZpbmUgTFBfUEVSRl9ERUVQX1NMRUVQX0NOVF9NU0IgICAgICAgICAgICAgICAzMQorI2RlZmluZSBMUF9QRVJGX0RFRVBfU0xFRVBfQ05UX0xTQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTFBfUEVSRl9ERUVQX1NMRUVQX0NOVF9NQVNLICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIExQX1BFUkZfREVFUF9TTEVFUF9DTlRfR0VUKHgpICAgICAgICAgICAgKCgoeCkgJiBMUF9QRVJGX0RFRVBfU0xFRVBfQ05UX01BU0spID4+IExQX1BFUkZfREVFUF9TTEVFUF9DTlRfTFNCKQorI2RlZmluZSBMUF9QRVJGX0RFRVBfU0xFRVBfQ05UX1NFVCh4KSAgICAgICAgICAgICgoKHgpIDw8IExQX1BFUkZfREVFUF9TTEVFUF9DTlRfTFNCKSAmIExQX1BFUkZfREVFUF9TTEVFUF9DTlRfTUFTSykKKworI2RlZmluZSBMUF9QRVJGX09OX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyOTAKKyNkZWZpbmUgTFBfUEVSRl9PTl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjkwCisjZGVmaW5lIExQX1BFUkZfT05fQ05UX01TQiAgICAgICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgTFBfUEVSRl9PTl9DTlRfTFNCICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExQX1BFUkZfT05fQ05UX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBMUF9QRVJGX09OX0NOVF9HRVQoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgTFBfUEVSRl9PTl9DTlRfTUFTSykgPj4gTFBfUEVSRl9PTl9DTlRfTFNCKQorI2RlZmluZSBMUF9QRVJGX09OX0NOVF9TRVQoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpIDw8IExQX1BFUkZfT05fQ05UX0xTQikgJiBMUF9QRVJGX09OX0NOVF9NQVNLKQorCisjZGVmaW5lIENISVBfTU9ERV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJhOAorI2RlZmluZSBDSElQX01PREVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyYTgKKyNkZWZpbmUgQ0hJUF9NT0RFX0JJVF9NU0IgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENISVBfTU9ERV9CSVRfTFNCICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDSElQX01PREVfQklUX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgQ0hJUF9NT0RFX0JJVF9HRVQoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIENISVBfTU9ERV9CSVRfTUFTSykgPj4gQ0hJUF9NT0RFX0JJVF9MU0IpCisjZGVmaW5lIENISVBfTU9ERV9CSVRfU0VUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPDwgQ0hJUF9NT0RFX0JJVF9MU0IpICYgQ0hJUF9NT0RFX0JJVF9NQVNLKQorCisjZGVmaW5lIENMS19SRVFfRkFMTF9FREdFX0FERFJFU1MgICAgICAgICAgICAgICAgMHgwMDAwMDJhYworI2RlZmluZSBDTEtfUkVRX0ZBTExfRURHRV9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MDAwMDAyYWMKKyNkZWZpbmUgQ0xLX1JFUV9GQUxMX0VER0VfRU5fTVNCICAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBDTEtfUkVRX0ZBTExfRURHRV9FTl9MU0IgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIENMS19SRVFfRkFMTF9FREdFX0VOX01BU0sgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBDTEtfUkVRX0ZBTExfRURHRV9FTl9HRVQoeCkgICAgICAgICAgICAgICgoKHgpICYgQ0xLX1JFUV9GQUxMX0VER0VfRU5fTUFTSykgPj4gQ0xLX1JFUV9GQUxMX0VER0VfRU5fTFNCKQorI2RlZmluZSBDTEtfUkVRX0ZBTExfRURHRV9FTl9TRVQoeCkgICAgICAgICAgICAgICgoKHgpIDw8IENMS19SRVFfRkFMTF9FREdFX0VOX0xTQikgJiBDTEtfUkVRX0ZBTExfRURHRV9FTl9NQVNLKQorI2RlZmluZSBDTEtfUkVRX0ZBTExfRURHRV9ERUxBWV9NU0IgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQ0xLX1JFUV9GQUxMX0VER0VfREVMQVlfTFNCICAgICAgICAgICAgICAwCisjZGVmaW5lIENMS19SRVFfRkFMTF9FREdFX0RFTEFZX01BU0sgICAgICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBDTEtfUkVRX0ZBTExfRURHRV9ERUxBWV9HRVQoeCkgICAgICAgICAgICgoKHgpICYgQ0xLX1JFUV9GQUxMX0VER0VfREVMQVlfTUFTSykgPj4gQ0xLX1JFUV9GQUxMX0VER0VfREVMQVlfTFNCKQorI2RlZmluZSBDTEtfUkVRX0ZBTExfRURHRV9ERUxBWV9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IENMS19SRVFfRkFMTF9FREdFX0RFTEFZX0xTQikgJiBDTEtfUkVRX0ZBTExfRURHRV9ERUxBWV9NQVNLKQorCisjZGVmaW5lIE9UUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJiMAorI2RlZmluZSBPVFBfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyYjAKKyNkZWZpbmUgT1RQX0xETzI1X0VOX01TQiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE9UUF9MRE8yNV9FTl9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBPVFBfTERPMjVfRU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgT1RQX0xETzI1X0VOX0dFVCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIE9UUF9MRE8yNV9FTl9NQVNLKSA+PiBPVFBfTERPMjVfRU5fTFNCKQorI2RlZmluZSBPVFBfTERPMjVfRU5fU0VUKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpIDw8IE9UUF9MRE8yNV9FTl9MU0IpICYgT1RQX0xETzI1X0VOX01BU0spCisjZGVmaW5lIE9UUF9WREQxMl9FTl9NU0IgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBPVFBfVkREMTJfRU5fTFNCICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgT1RQX1ZERDEyX0VOX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE9UUF9WREQxMl9FTl9HRVQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiBPVFBfVkREMTJfRU5fTUFTSykgPj4gT1RQX1ZERDEyX0VOX0xTQikKKyNkZWZpbmUgT1RQX1ZERDEyX0VOX1NFVCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA8PCBPVFBfVkREMTJfRU5fTFNCKSAmIE9UUF9WREQxMl9FTl9NQVNLKQorCisjZGVmaW5lIE9UUF9TVEFUVVNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJiNAorI2RlZmluZSBPVFBfU1RBVFVTX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyYjQKKyNkZWZpbmUgT1RQX1NUQVRVU19MRE8yNV9FTl9SRUFEWV9NU0IgICAgICAgICAgICAxCisjZGVmaW5lIE9UUF9TVEFUVVNfTERPMjVfRU5fUkVBRFlfTFNCICAgICAgICAgICAgMQorI2RlZmluZSBPVFBfU1RBVFVTX0xETzI1X0VOX1JFQURZX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgT1RQX1NUQVRVU19MRE8yNV9FTl9SRUFEWV9HRVQoeCkgICAgICAgICAoKCh4KSAmIE9UUF9TVEFUVVNfTERPMjVfRU5fUkVBRFlfTUFTSykgPj4gT1RQX1NUQVRVU19MRE8yNV9FTl9SRUFEWV9MU0IpCisjZGVmaW5lIE9UUF9TVEFUVVNfTERPMjVfRU5fUkVBRFlfU0VUKHgpICAgICAgICAgKCgoeCkgPDwgT1RQX1NUQVRVU19MRE8yNV9FTl9SRUFEWV9MU0IpICYgT1RQX1NUQVRVU19MRE8yNV9FTl9SRUFEWV9NQVNLKQorI2RlZmluZSBPVFBfU1RBVFVTX1ZERDEyX0VOX1JFQURZX01TQiAgICAgICAgICAgIDAKKyNkZWZpbmUgT1RQX1NUQVRVU19WREQxMl9FTl9SRUFEWV9MU0IgICAgICAgICAgICAwCisjZGVmaW5lIE9UUF9TVEFUVVNfVkREMTJfRU5fUkVBRFlfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBPVFBfU1RBVFVTX1ZERDEyX0VOX1JFQURZX0dFVCh4KSAgICAgICAgICgoKHgpICYgT1RQX1NUQVRVU19WREQxMl9FTl9SRUFEWV9NQVNLKSA+PiBPVFBfU1RBVFVTX1ZERDEyX0VOX1JFQURZX0xTQikKKyNkZWZpbmUgT1RQX1NUQVRVU19WREQxMl9FTl9SRUFEWV9TRVQoeCkgICAgICAgICAoKCh4KSA8PCBPVFBfU1RBVFVTX1ZERDEyX0VOX1JFQURZX0xTQikgJiBPVFBfU1RBVFVTX1ZERDEyX0VOX1JFQURZX01BU0spCisKKyNkZWZpbmUgUE1VX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMmI4CisjZGVmaW5lIFBNVV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJiOAorI2RlZmluZSBQTVVfUkVHX1dBS0VVUF9USU1FX1NFTF9NU0IgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUE1VX1JFR19XQUtFVVBfVElNRV9TRUxfTFNCICAgICAgICAgICAgICAwCisjZGVmaW5lIFBNVV9SRUdfV0FLRVVQX1RJTUVfU0VMX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBQTVVfUkVHX1dBS0VVUF9USU1FX1NFTF9HRVQoeCkgICAgICAgICAgICgoKHgpICYgUE1VX1JFR19XQUtFVVBfVElNRV9TRUxfTUFTSykgPj4gUE1VX1JFR19XQUtFVVBfVElNRV9TRUxfTFNCKQorI2RlZmluZSBQTVVfUkVHX1dBS0VVUF9USU1FX1NFTF9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IFBNVV9SRUdfV0FLRVVQX1RJTUVfU0VMX0xTQikgJiBQTVVfUkVHX1dBS0VVUF9USU1FX1NFTF9NQVNLKQorCisjZGVmaW5lIFBNVV9DT05GSUdfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJiYworI2RlZmluZSBQTVVfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyYmMKKyNkZWZpbmUgUE1VX0NPTkZJR19WQUxVRV9NU0IgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBNVV9DT05GSUdfVkFMVUVfTFNCICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQTVVfQ09ORklHX1ZBTFVFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgUE1VX0NPTkZJR19WQUxVRV9HRVQoeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIFBNVV9DT05GSUdfVkFMVUVfTUFTSykgPj4gUE1VX0NPTkZJR19WQUxVRV9MU0IpCisjZGVmaW5lIFBNVV9DT05GSUdfVkFMVUVfU0VUKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgPDwgUE1VX0NPTkZJR19WQUxVRV9MU0IpICYgUE1VX0NPTkZJR19WQUxVRV9NQVNLKQorCisjZGVmaW5lIFBNVV9QQVJFR19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJjMAorI2RlZmluZSBQTVVfUEFSRUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyYzAKKyNkZWZpbmUgUE1VX1BBUkVHX0xWTF9DVFJfTVNCICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBNVV9QQVJFR19MVkxfQ1RSX0xTQiAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQTVVfUEFSRUdfTFZMX0NUUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgUE1VX1BBUkVHX0xWTF9DVFJfR0VUKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIFBNVV9QQVJFR19MVkxfQ1RSX01BU0spID4+IFBNVV9QQVJFR19MVkxfQ1RSX0xTQikKKyNkZWZpbmUgUE1VX1BBUkVHX0xWTF9DVFJfU0VUKHgpICAgICAgICAgICAgICAgICAoKCh4KSA8PCBQTVVfUEFSRUdfTFZMX0NUUl9MU0IpICYgUE1VX1BBUkVHX0xWTF9DVFJfTUFTSykKKworI2RlZmluZSBQTVVfQllQQVNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyYzQKKyNkZWZpbmUgUE1VX0JZUEFTU19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMmM0CisjZGVmaW5lIFBNVV9CWVBBU1NfU1dSRUdfTVNCICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQTVVfQllQQVNTX1NXUkVHX0xTQiAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUE1VX0JZUEFTU19TV1JFR19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBNVV9CWVBBU1NfU1dSRUdfR0VUKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgJiBQTVVfQllQQVNTX1NXUkVHX01BU0spID4+IFBNVV9CWVBBU1NfU1dSRUdfTFNCKQorI2RlZmluZSBQTVVfQllQQVNTX1NXUkVHX1NFVCh4KSAgICAgICAgICAgICAgICAgICgoKHgpIDw8IFBNVV9CWVBBU1NfU1dSRUdfTFNCKSAmIFBNVV9CWVBBU1NfU1dSRUdfTUFTSykKKyNkZWZpbmUgUE1VX0JZUEFTU19EUkVHX01TQiAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBNVV9CWVBBU1NfRFJFR19MU0IgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQTVVfQllQQVNTX0RSRUdfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUE1VX0JZUEFTU19EUkVHX0dFVCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIFBNVV9CWVBBU1NfRFJFR19NQVNLKSA+PiBQTVVfQllQQVNTX0RSRUdfTFNCKQorI2RlZmluZSBQTVVfQllQQVNTX0RSRUdfU0VUKHgpICAgICAgICAgICAgICAgICAgICgoKHgpIDw8IFBNVV9CWVBBU1NfRFJFR19MU0IpICYgUE1VX0JZUEFTU19EUkVHX01BU0spCisjZGVmaW5lIFBNVV9CWVBBU1NfUEFSRUdfTVNCICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQTVVfQllQQVNTX1BBUkVHX0xTQiAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUE1VX0JZUEFTU19QQVJFR19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFBNVV9CWVBBU1NfUEFSRUdfR0VUKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgJiBQTVVfQllQQVNTX1BBUkVHX01BU0spID4+IFBNVV9CWVBBU1NfUEFSRUdfTFNCKQorI2RlZmluZSBQTVVfQllQQVNTX1BBUkVHX1NFVCh4KSAgICAgICAgICAgICAgICAgICgoKHgpIDw8IFBNVV9CWVBBU1NfUEFSRUdfTFNCKSAmIFBNVV9CWVBBU1NfUEFSRUdfTUFTSykKKworI2RlZmluZSBUSEVSTV9DVFJMMV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyZGMKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMmRjCisjZGVmaW5lIFRIRVJNX0NUUkwxX0JZUEFTU19NU0IgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfQllQQVNTX0xTQiAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBUSEVSTV9DVFJMMV9CWVBBU1NfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfQllQQVNTX0dFVCh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIFRIRVJNX0NUUkwxX0JZUEFTU19NQVNLKSA+PiBUSEVSTV9DVFJMMV9CWVBBU1NfTFNCKQorI2RlZmluZSBUSEVSTV9DVFJMMV9CWVBBU1NfU0VUKHgpICAgICAgICAgICAgICAgICgoKHgpIDw8IFRIRVJNX0NUUkwxX0JZUEFTU19MU0IpICYgVEhFUk1fQ1RSTDFfQllQQVNTX01BU0spCisjZGVmaW5lIFRIRVJNX0NUUkwxX1dJRFRIX0FSQklUT1JfTVNCICAgICAgICAgICAgMTUKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfV0lEVEhfQVJCSVRPUl9MU0IgICAgICAgICAgICAxMgorI2RlZmluZSBUSEVSTV9DVFJMMV9XSURUSF9BUkJJVE9SX01BU0sgICAgICAgICAgIDB4MDAwMGYwMDAKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfV0lEVEhfQVJCSVRPUl9HRVQoeCkgICAgICAgICAoKCh4KSAmIFRIRVJNX0NUUkwxX1dJRFRIX0FSQklUT1JfTUFTSykgPj4gVEhFUk1fQ1RSTDFfV0lEVEhfQVJCSVRPUl9MU0IpCisjZGVmaW5lIFRIRVJNX0NUUkwxX1dJRFRIX0FSQklUT1JfU0VUKHgpICAgICAgICAgKCgoeCkgPDwgVEhFUk1fQ1RSTDFfV0lEVEhfQVJCSVRPUl9MU0IpICYgVEhFUk1fQ1RSTDFfV0lEVEhfQVJCSVRPUl9NQVNLKQorI2RlZmluZSBUSEVSTV9DVFJMMV9XSURUSF9NU0IgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFRIRVJNX0NUUkwxX1dJRFRIX0xTQiAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBUSEVSTV9DVFJMMV9XSURUSF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMDBmZTAKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfV0lEVEhfR0VUKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIFRIRVJNX0NUUkwxX1dJRFRIX01BU0spID4+IFRIRVJNX0NUUkwxX1dJRFRIX0xTQikKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfV0lEVEhfU0VUKHgpICAgICAgICAgICAgICAgICAoKCh4KSA8PCBUSEVSTV9DVFJMMV9XSURUSF9MU0IpICYgVEhFUk1fQ1RSTDFfV0lEVEhfTUFTSykKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfVFlQRV9NU0IgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRIRVJNX0NUUkwxX1RZUEVfTFNCICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBUSEVSTV9DVFJMMV9UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfVFlQRV9HRVQoeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIFRIRVJNX0NUUkwxX1RZUEVfTUFTSykgPj4gVEhFUk1fQ1RSTDFfVFlQRV9MU0IpCisjZGVmaW5lIFRIRVJNX0NUUkwxX1RZUEVfU0VUKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgPDwgVEhFUk1fQ1RSTDFfVFlQRV9MU0IpICYgVEhFUk1fQ1RSTDFfVFlQRV9NQVNLKQorI2RlZmluZSBUSEVSTV9DVFJMMV9NRUFTVVJFX01TQiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfTUVBU1VSRV9MU0IgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRIRVJNX0NUUkwxX01FQVNVUkVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBUSEVSTV9DVFJMMV9NRUFTVVJFX0dFVCh4KSAgICAgICAgICAgICAgICgoKHgpICYgVEhFUk1fQ1RSTDFfTUVBU1VSRV9NQVNLKSA+PiBUSEVSTV9DVFJMMV9NRUFTVVJFX0xTQikKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfTUVBU1VSRV9TRVQoeCkgICAgICAgICAgICAgICAoKCh4KSA8PCBUSEVSTV9DVFJMMV9NRUFTVVJFX0xTQikgJiBUSEVSTV9DVFJMMV9NRUFTVVJFX01BU0spCisjZGVmaW5lIFRIRVJNX0NUUkwxX0lOVF9FTl9NU0IgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUSEVSTV9DVFJMMV9JTlRfRU5fTFNCICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfSU5UX0VOX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFRIRVJNX0NUUkwxX0lOVF9FTl9HRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiBUSEVSTV9DVFJMMV9JTlRfRU5fTUFTSykgPj4gVEhFUk1fQ1RSTDFfSU5UX0VOX0xTQikKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfSU5UX0VOX1NFVCh4KSAgICAgICAgICAgICAgICAoKCh4KSA8PCBUSEVSTV9DVFJMMV9JTlRfRU5fTFNCKSAmIFRIRVJNX0NUUkwxX0lOVF9FTl9NQVNLKQorI2RlZmluZSBUSEVSTV9DVFJMMV9JTlRfU1RBVFVTX01TQiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfSU5UX1NUQVRVU19MU0IgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRIRVJNX0NUUkwxX0lOVF9TVEFUVVNfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBUSEVSTV9DVFJMMV9JTlRfU1RBVFVTX0dFVCh4KSAgICAgICAgICAgICgoKHgpICYgVEhFUk1fQ1RSTDFfSU5UX1NUQVRVU19NQVNLKSA+PiBUSEVSTV9DVFJMMV9JTlRfU1RBVFVTX0xTQikKKyNkZWZpbmUgVEhFUk1fQ1RSTDFfSU5UX1NUQVRVU19TRVQoeCkgICAgICAgICAgICAoKCh4KSA8PCBUSEVSTV9DVFJMMV9JTlRfU1RBVFVTX0xTQikgJiBUSEVSTV9DVFJMMV9JTlRfU1RBVFVTX01BU0spCisKKyNkZWZpbmUgVEhFUk1fQ1RSTDJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMmUwCisjZGVmaW5lIFRIRVJNX0NUUkwyX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJlMAorI2RlZmluZSBUSEVSTV9DVFJMMl9BRENfT0ZGX01TQiAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIFRIRVJNX0NUUkwyX0FEQ19PRkZfTFNCICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgVEhFUk1fQ1RSTDJfQURDX09GRl9NQVNLICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIFRIRVJNX0NUUkwyX0FEQ19PRkZfR0VUKHgpICAgICAgICAgICAgICAgKCgoeCkgJiBUSEVSTV9DVFJMMl9BRENfT0ZGX01BU0spID4+IFRIRVJNX0NUUkwyX0FEQ19PRkZfTFNCKQorI2RlZmluZSBUSEVSTV9DVFJMMl9BRENfT0ZGX1NFVCh4KSAgICAgICAgICAgICAgICgoKHgpIDw8IFRIRVJNX0NUUkwyX0FEQ19PRkZfTFNCKSAmIFRIRVJNX0NUUkwyX0FEQ19PRkZfTUFTSykKKyNkZWZpbmUgVEhFUk1fQ1RSTDJfQURDX09OX01TQiAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBUSEVSTV9DVFJMMl9BRENfT05fTFNCICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIFRIRVJNX0NUUkwyX0FEQ19PTl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBUSEVSTV9DVFJMMl9BRENfT05fR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgVEhFUk1fQ1RSTDJfQURDX09OX01BU0spID4+IFRIRVJNX0NUUkwyX0FEQ19PTl9MU0IpCisjZGVmaW5lIFRIRVJNX0NUUkwyX0FEQ19PTl9TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgVEhFUk1fQ1RSTDJfQURDX09OX0xTQikgJiBUSEVSTV9DVFJMMl9BRENfT05fTUFTSykKKyNkZWZpbmUgVEhFUk1fQ1RSTDJfU0FNUExFX01TQiAgICAgICAgICAgICAgICAgICAyMworI2RlZmluZSBUSEVSTV9DVFJMMl9TQU1QTEVfTFNCICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFRIRVJNX0NUUkwyX1NBTVBMRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBUSEVSTV9DVFJMMl9TQU1QTEVfR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgVEhFUk1fQ1RSTDJfU0FNUExFX01BU0spID4+IFRIRVJNX0NUUkwyX1NBTVBMRV9MU0IpCisjZGVmaW5lIFRIRVJNX0NUUkwyX1NBTVBMRV9TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgVEhFUk1fQ1RSTDJfU0FNUExFX0xTQikgJiBUSEVSTV9DVFJMMl9TQU1QTEVfTUFTSykKKyNkZWZpbmUgVEhFUk1fQ1RSTDJfSElHSF9NU0IgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBUSEVSTV9DVFJMMl9ISUdIX0xTQiAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgVEhFUk1fQ1RSTDJfSElHSF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIFRIRVJNX0NUUkwyX0hJR0hfR0VUKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgJiBUSEVSTV9DVFJMMl9ISUdIX01BU0spID4+IFRIRVJNX0NUUkwyX0hJR0hfTFNCKQorI2RlZmluZSBUSEVSTV9DVFJMMl9ISUdIX1NFVCh4KSAgICAgICAgICAgICAgICAgICgoKHgpIDw8IFRIRVJNX0NUUkwyX0hJR0hfTFNCKSAmIFRIRVJNX0NUUkwyX0hJR0hfTUFTSykKKyNkZWZpbmUgVEhFUk1fQ1RSTDJfTE9XX01TQiAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFRIRVJNX0NUUkwyX0xPV19MU0IgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUSEVSTV9DVFJMMl9MT1dfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgVEhFUk1fQ1RSTDJfTE9XX0dFVCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIFRIRVJNX0NUUkwyX0xPV19NQVNLKSA+PiBUSEVSTV9DVFJMMl9MT1dfTFNCKQorI2RlZmluZSBUSEVSTV9DVFJMMl9MT1dfU0VUKHgpICAgICAgICAgICAgICAgICAgICgoKHgpIDw8IFRIRVJNX0NUUkwyX0xPV19MU0IpICYgVEhFUk1fQ1RSTDJfTE9XX01BU0spCisKKyNkZWZpbmUgVEhFUk1fQ1RSTDNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMmU0CisjZGVmaW5lIFRIRVJNX0NUUkwzX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJlNAorI2RlZmluZSBUSEVSTV9DVFJMM19BRENfR0FJTl9NU0IgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFRIRVJNX0NUUkwzX0FEQ19HQUlOX0xTQiAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBUSEVSTV9DVFJMM19BRENfR0FJTl9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMWZmMDAKKyNkZWZpbmUgVEhFUk1fQ1RSTDNfQURDX0dBSU5fR0VUKHgpICAgICAgICAgICAgICAoKCh4KSAmIFRIRVJNX0NUUkwzX0FEQ19HQUlOX01BU0spID4+IFRIRVJNX0NUUkwzX0FEQ19HQUlOX0xTQikKKyNkZWZpbmUgVEhFUk1fQ1RSTDNfQURDX0dBSU5fU0VUKHgpICAgICAgICAgICAgICAoKCh4KSA8PCBUSEVSTV9DVFJMM19BRENfR0FJTl9MU0IpICYgVEhFUk1fQ1RSTDNfQURDX0dBSU5fTUFTSykKKyNkZWZpbmUgVEhFUk1fQ1RSTDNfQURDX09GRlNFVF9NU0IgICAgICAgICAgICAgICA3CisjZGVmaW5lIFRIRVJNX0NUUkwzX0FEQ19PRkZTRVRfTFNCICAgICAgICAgICAgICAgMAorI2RlZmluZSBUSEVSTV9DVFJMM19BRENfT0ZGU0VUX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgVEhFUk1fQ1RSTDNfQURDX09GRlNFVF9HRVQoeCkgICAgICAgICAgICAoKCh4KSAmIFRIRVJNX0NUUkwzX0FEQ19PRkZTRVRfTUFTSykgPj4gVEhFUk1fQ1RSTDNfQURDX09GRlNFVF9MU0IpCisjZGVmaW5lIFRIRVJNX0NUUkwzX0FEQ19PRkZTRVRfU0VUKHgpICAgICAgICAgICAgKCgoeCkgPDwgVEhFUk1fQ1RSTDNfQURDX09GRlNFVF9MU0IpICYgVEhFUk1fQ1RSTDNfQURDX09GRlNFVF9NQVNLKQorCisjZGVmaW5lIExJU1RFTl9NT0RFMV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJlOAorI2RlZmluZSBMSVNURU5fTU9ERTFfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyZTgKKyNkZWZpbmUgTElTVEVOX01PREUxX1RJTUVSX0NMRUFSX01TQiAgICAgICAgICAgICAxOQorI2RlZmluZSBMSVNURU5fTU9ERTFfVElNRVJfQ0xFQVJfTFNCICAgICAgICAgICAgIDE5CisjZGVmaW5lIExJU1RFTl9NT0RFMV9USU1FUl9DTEVBUl9NQVNLICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBMSVNURU5fTU9ERTFfVElNRVJfQ0xFQVJfR0VUKHgpICAgICAgICAgICgoKHgpICYgTElTVEVOX01PREUxX1RJTUVSX0NMRUFSX01BU0spID4+IExJU1RFTl9NT0RFMV9USU1FUl9DTEVBUl9MU0IpCisjZGVmaW5lIExJU1RFTl9NT0RFMV9USU1FUl9DTEVBUl9TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgTElTVEVOX01PREUxX1RJTUVSX0NMRUFSX0xTQikgJiBMSVNURU5fTU9ERTFfVElNRVJfQ0xFQVJfTUFTSykKKyNkZWZpbmUgTElTVEVOX01PREUxX1RJTUVSX1RIUkVTSF9XQUtFX01TQiAgICAgICAxOAorI2RlZmluZSBMSVNURU5fTU9ERTFfVElNRVJfVEhSRVNIX1dBS0VfTFNCICAgICAgIDMKKyNkZWZpbmUgTElTVEVOX01PREUxX1RJTUVSX1RIUkVTSF9XQUtFX01BU0sgICAgICAweDAwMDdmZmY4CisjZGVmaW5lIExJU1RFTl9NT0RFMV9USU1FUl9USFJFU0hfV0FLRV9HRVQoeCkgICAgKCgoeCkgJiBMSVNURU5fTU9ERTFfVElNRVJfVEhSRVNIX1dBS0VfTUFTSykgPj4gTElTVEVOX01PREUxX1RJTUVSX1RIUkVTSF9XQUtFX0xTQikKKyNkZWZpbmUgTElTVEVOX01PREUxX1RJTUVSX1RIUkVTSF9XQUtFX1NFVCh4KSAgICAoKCh4KSA8PCBMSVNURU5fTU9ERTFfVElNRVJfVEhSRVNIX1dBS0VfTFNCKSAmIExJU1RFTl9NT0RFMV9USU1FUl9USFJFU0hfV0FLRV9NQVNLKQorI2RlZmluZSBMSVNURU5fTU9ERTFfVElNRVJfT1ZFUkZMT1dfV0FLRV9NU0IgICAgIDIKKyNkZWZpbmUgTElTVEVOX01PREUxX1RJTUVSX09WRVJGTE9XX1dBS0VfTFNCICAgICAyCisjZGVmaW5lIExJU1RFTl9NT0RFMV9USU1FUl9PVkVSRkxPV19XQUtFX01BU0sgICAgMHgwMDAwMDAwNAorI2RlZmluZSBMSVNURU5fTU9ERTFfVElNRVJfT1ZFUkZMT1dfV0FLRV9HRVQoeCkgICgoKHgpICYgTElTVEVOX01PREUxX1RJTUVSX09WRVJGTE9XX1dBS0VfTUFTSykgPj4gTElTVEVOX01PREUxX1RJTUVSX09WRVJGTE9XX1dBS0VfTFNCKQorI2RlZmluZSBMSVNURU5fTU9ERTFfVElNRVJfT1ZFUkZMT1dfV0FLRV9TRVQoeCkgICgoKHgpIDw8IExJU1RFTl9NT0RFMV9USU1FUl9PVkVSRkxPV19XQUtFX0xTQikgJiBMSVNURU5fTU9ERTFfVElNRVJfT1ZFUkZMT1dfV0FLRV9NQVNLKQorI2RlZmluZSBMSVNURU5fTU9ERTFfQ0xPQ0tfR0FURV9NU0IgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTElTVEVOX01PREUxX0NMT0NLX0dBVEVfTFNCICAgICAgICAgICAgICAxCisjZGVmaW5lIExJU1RFTl9NT0RFMV9DTE9DS19HQVRFX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBMSVNURU5fTU9ERTFfQ0xPQ0tfR0FURV9HRVQoeCkgICAgICAgICAgICgoKHgpICYgTElTVEVOX01PREUxX0NMT0NLX0dBVEVfTUFTSykgPj4gTElTVEVOX01PREUxX0NMT0NLX0dBVEVfTFNCKQorI2RlZmluZSBMSVNURU5fTU9ERTFfQ0xPQ0tfR0FURV9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IExJU1RFTl9NT0RFMV9DTE9DS19HQVRFX0xTQikgJiBMSVNURU5fTU9ERTFfQ0xPQ0tfR0FURV9NQVNLKQorI2RlZmluZSBMSVNURU5fTU9ERTFfRU5BQkxFX01TQiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTElTVEVOX01PREUxX0VOQUJMRV9MU0IgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExJU1RFTl9NT0RFMV9FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBMSVNURU5fTU9ERTFfRU5BQkxFX0dFVCh4KSAgICAgICAgICAgICAgICgoKHgpICYgTElTVEVOX01PREUxX0VOQUJMRV9NQVNLKSA+PiBMSVNURU5fTU9ERTFfRU5BQkxFX0xTQikKKyNkZWZpbmUgTElTVEVOX01PREUxX0VOQUJMRV9TRVQoeCkgICAgICAgICAgICAgICAoKCh4KSA8PCBMSVNURU5fTU9ERTFfRU5BQkxFX0xTQikgJiBMSVNURU5fTU9ERTFfRU5BQkxFX01BU0spCisKKyNkZWZpbmUgTElTVEVOX01PREUyX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMmVjCisjZGVmaW5lIExJU1RFTl9NT0RFMl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJlYworI2RlZmluZSBMSVNURU5fTU9ERTJfVElNRVJfVFJJR0dFUl9XQUtFX01TQiAgICAgIDE1CisjZGVmaW5lIExJU1RFTl9NT0RFMl9USU1FUl9UUklHR0VSX1dBS0VfTFNCICAgICAgMAorI2RlZmluZSBMSVNURU5fTU9ERTJfVElNRVJfVFJJR0dFUl9XQUtFX01BU0sgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgTElTVEVOX01PREUyX1RJTUVSX1RSSUdHRVJfV0FLRV9HRVQoeCkgICAoKCh4KSAmIExJU1RFTl9NT0RFMl9USU1FUl9UUklHR0VSX1dBS0VfTUFTSykgPj4gTElTVEVOX01PREUyX1RJTUVSX1RSSUdHRVJfV0FLRV9MU0IpCisjZGVmaW5lIExJU1RFTl9NT0RFMl9USU1FUl9UUklHR0VSX1dBS0VfU0VUKHgpICAgKCgoeCkgPDwgTElTVEVOX01PREUyX1RJTUVSX1RSSUdHRVJfV0FLRV9MU0IpICYgTElTVEVOX01PREUyX1RJTUVSX1RSSUdHRVJfV0FLRV9NQVNLKQorCisjZGVmaW5lIEFVRElPX1BMTF9DT05GSUdfQUREUkVTUyAgICAgICAgICAgICAgICAgMHgwMDAwMDJmMAorI2RlZmluZSBBVURJT19QTExfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAyZjAKKyNkZWZpbmUgQVVESU9fUExMX0NPTkZJR19VUERBVElOR19NU0IgICAgICAgICAgICAzMQorI2RlZmluZSBBVURJT19QTExfQ09ORklHX1VQREFUSU5HX0xTQiAgICAgICAgICAgIDMxCisjZGVmaW5lIEFVRElPX1BMTF9DT05GSUdfVVBEQVRJTkdfTUFTSyAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBBVURJT19QTExfQ09ORklHX1VQREFUSU5HX0dFVCh4KSAgICAgICAgICgoKHgpICYgQVVESU9fUExMX0NPTkZJR19VUERBVElOR19NQVNLKSA+PiBBVURJT19QTExfQ09ORklHX1VQREFUSU5HX0xTQikKKyNkZWZpbmUgQVVESU9fUExMX0NPTkZJR19VUERBVElOR19TRVQoeCkgICAgICAgICAoKCh4KSA8PCBBVURJT19QTExfQ09ORklHX1VQREFUSU5HX0xTQikgJiBBVURJT19QTExfQ09ORklHX1VQREFUSU5HX01BU0spCisjZGVmaW5lIEFVRElPX1BMTF9DT05GSUdfRVhUX0RJVl9NU0IgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQVVESU9fUExMX0NPTkZJR19FWFRfRElWX0xTQiAgICAgICAgICAgICAxMgorI2RlZmluZSBBVURJT19QTExfQ09ORklHX0VYVF9ESVZfTUFTSyAgICAgICAgICAgIDB4MDAwMDcwMDAKKyNkZWZpbmUgQVVESU9fUExMX0NPTkZJR19FWFRfRElWX0dFVCh4KSAgICAgICAgICAoKCh4KSAmIEFVRElPX1BMTF9DT05GSUdfRVhUX0RJVl9NQVNLKSA+PiBBVURJT19QTExfQ09ORklHX0VYVF9ESVZfTFNCKQorI2RlZmluZSBBVURJT19QTExfQ09ORklHX0VYVF9ESVZfU0VUKHgpICAgICAgICAgICgoKHgpIDw8IEFVRElPX1BMTF9DT05GSUdfRVhUX0RJVl9MU0IpICYgQVVESU9fUExMX0NPTkZJR19FWFRfRElWX01BU0spCisjZGVmaW5lIEFVRElPX1BMTF9DT05GSUdfUE9TVFBMTERJVl9NU0IgICAgICAgICAgOQorI2RlZmluZSBBVURJT19QTExfQ09ORklHX1BPU1RQTExESVZfTFNCICAgICAgICAgIDcKKyNkZWZpbmUgQVVESU9fUExMX0NPTkZJR19QT1NUUExMRElWX01BU0sgICAgICAgICAweDAwMDAwMzgwCisjZGVmaW5lIEFVRElPX1BMTF9DT05GSUdfUE9TVFBMTERJVl9HRVQoeCkgICAgICAgKCgoeCkgJiBBVURJT19QTExfQ09ORklHX1BPU1RQTExESVZfTUFTSykgPj4gQVVESU9fUExMX0NPTkZJR19QT1NUUExMRElWX0xTQikKKyNkZWZpbmUgQVVESU9fUExMX0NPTkZJR19QT1NUUExMRElWX1NFVCh4KSAgICAgICAoKCh4KSA8PCBBVURJT19QTExfQ09ORklHX1BPU1RQTExESVZfTFNCKSAmIEFVRElPX1BMTF9DT05GSUdfUE9TVFBMTERJVl9NQVNLKQorI2RlZmluZSBBVURJT19QTExfQ09ORklHX1BMTFBXRF9NU0IgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVVESU9fUExMX0NPTkZJR19QTExQV0RfTFNCICAgICAgICAgICAgICA1CisjZGVmaW5lIEFVRElPX1BMTF9DT05GSUdfUExMUFdEX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBVURJT19QTExfQ09ORklHX1BMTFBXRF9HRVQoeCkgICAgICAgICAgICgoKHgpICYgQVVESU9fUExMX0NPTkZJR19QTExQV0RfTUFTSykgPj4gQVVESU9fUExMX0NPTkZJR19QTExQV0RfTFNCKQorI2RlZmluZSBBVURJT19QTExfQ09ORklHX1BMTFBXRF9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IEFVRElPX1BMTF9DT05GSUdfUExMUFdEX0xTQikgJiBBVURJT19QTExfQ09ORklHX1BMTFBXRF9NQVNLKQorI2RlZmluZSBBVURJT19QTExfQ09ORklHX0JZUEFTU19NU0IgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVVESU9fUExMX0NPTkZJR19CWVBBU1NfTFNCICAgICAgICAgICAgICA0CisjZGVmaW5lIEFVRElPX1BMTF9DT05GSUdfQllQQVNTX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBVURJT19QTExfQ09ORklHX0JZUEFTU19HRVQoeCkgICAgICAgICAgICgoKHgpICYgQVVESU9fUExMX0NPTkZJR19CWVBBU1NfTUFTSykgPj4gQVVESU9fUExMX0NPTkZJR19CWVBBU1NfTFNCKQorI2RlZmluZSBBVURJT19QTExfQ09ORklHX0JZUEFTU19TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IEFVRElPX1BMTF9DT05GSUdfQllQQVNTX0xTQikgJiBBVURJT19QTExfQ09ORklHX0JZUEFTU19NQVNLKQorI2RlZmluZSBBVURJT19QTExfQ09ORklHX1JFRkRJVl9NU0IgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVVESU9fUExMX0NPTkZJR19SRUZESVZfTFNCICAgICAgICAgICAgICAwCisjZGVmaW5lIEFVRElPX1BMTF9DT05GSUdfUkVGRElWX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBBVURJT19QTExfQ09ORklHX1JFRkRJVl9HRVQoeCkgICAgICAgICAgICgoKHgpICYgQVVESU9fUExMX0NPTkZJR19SRUZESVZfTUFTSykgPj4gQVVESU9fUExMX0NPTkZJR19SRUZESVZfTFNCKQorI2RlZmluZSBBVURJT19QTExfQ09ORklHX1JFRkRJVl9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IEFVRElPX1BMTF9DT05GSUdfUkVGRElWX0xTQikgJiBBVURJT19QTExfQ09ORklHX1JFRkRJVl9NQVNLKQorCisjZGVmaW5lIEFVRElPX1BMTF9NT0RVTEFUSU9OX0FERFJFU1MgICAgICAgICAgICAgMHgwMDAwMDJmNAorI2RlZmluZSBBVURJT19QTExfTU9EVUxBVElPTl9PRkZTRVQgICAgICAgICAgICAgIDB4MDAwMDAyZjQKKyNkZWZpbmUgQVVESU9fUExMX01PRFVMQVRJT05fVEdUX0RJVl9GUkFDX01TQiAgICAyOAorI2RlZmluZSBBVURJT19QTExfTU9EVUxBVElPTl9UR1RfRElWX0ZSQUNfTFNCICAgIDExCisjZGVmaW5lIEFVRElPX1BMTF9NT0RVTEFUSU9OX1RHVF9ESVZfRlJBQ19NQVNLICAgMHgxZmZmZjgwMAorI2RlZmluZSBBVURJT19QTExfTU9EVUxBVElPTl9UR1RfRElWX0ZSQUNfR0VUKHgpICgoKHgpICYgQVVESU9fUExMX01PRFVMQVRJT05fVEdUX0RJVl9GUkFDX01BU0spID4+IEFVRElPX1BMTF9NT0RVTEFUSU9OX1RHVF9ESVZfRlJBQ19MU0IpCisjZGVmaW5lIEFVRElPX1BMTF9NT0RVTEFUSU9OX1RHVF9ESVZfRlJBQ19TRVQoeCkgKCgoeCkgPDwgQVVESU9fUExMX01PRFVMQVRJT05fVEdUX0RJVl9GUkFDX0xTQikgJiBBVURJT19QTExfTU9EVUxBVElPTl9UR1RfRElWX0ZSQUNfTUFTSykKKyNkZWZpbmUgQVVESU9fUExMX01PRFVMQVRJT05fVEdUX0RJVl9JTlRfTVNCICAgICA2CisjZGVmaW5lIEFVRElPX1BMTF9NT0RVTEFUSU9OX1RHVF9ESVZfSU5UX0xTQiAgICAgMQorI2RlZmluZSBBVURJT19QTExfTU9EVUxBVElPTl9UR1RfRElWX0lOVF9NQVNLICAgIDB4MDAwMDAwN2UKKyNkZWZpbmUgQVVESU9fUExMX01PRFVMQVRJT05fVEdUX0RJVl9JTlRfR0VUKHgpICAoKCh4KSAmIEFVRElPX1BMTF9NT0RVTEFUSU9OX1RHVF9ESVZfSU5UX01BU0spID4+IEFVRElPX1BMTF9NT0RVTEFUSU9OX1RHVF9ESVZfSU5UX0xTQikKKyNkZWZpbmUgQVVESU9fUExMX01PRFVMQVRJT05fVEdUX0RJVl9JTlRfU0VUKHgpICAoKCh4KSA8PCBBVURJT19QTExfTU9EVUxBVElPTl9UR1RfRElWX0lOVF9MU0IpICYgQVVESU9fUExMX01PRFVMQVRJT05fVEdUX0RJVl9JTlRfTUFTSykKKyNkZWZpbmUgQVVESU9fUExMX01PRFVMQVRJT05fU1RBUlRfTVNCICAgICAgICAgICAwCisjZGVmaW5lIEFVRElPX1BMTF9NT0RVTEFUSU9OX1NUQVJUX0xTQiAgICAgICAgICAgMAorI2RlZmluZSBBVURJT19QTExfTU9EVUxBVElPTl9TVEFSVF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVVESU9fUExMX01PRFVMQVRJT05fU1RBUlRfR0VUKHgpICAgICAgICAoKCh4KSAmIEFVRElPX1BMTF9NT0RVTEFUSU9OX1NUQVJUX01BU0spID4+IEFVRElPX1BMTF9NT0RVTEFUSU9OX1NUQVJUX0xTQikKKyNkZWZpbmUgQVVESU9fUExMX01PRFVMQVRJT05fU1RBUlRfU0VUKHgpICAgICAgICAoKCh4KSA8PCBBVURJT19QTExfTU9EVUxBVElPTl9TVEFSVF9MU0IpICYgQVVESU9fUExMX01PRFVMQVRJT05fU1RBUlRfTUFTSykKKworI2RlZmluZSBBVURJT19QTExfTU9EX1NURVBfQUREUkVTUyAgICAgICAgICAgICAgIDB4MDAwMDAyZjgKKyNkZWZpbmUgQVVESU9fUExMX01PRF9TVEVQX09GRlNFVCAgICAgICAgICAgICAgICAweDAwMDAwMmY4CisjZGVmaW5lIEFVRElPX1BMTF9NT0RfU1RFUF9GUkFDX01TQiAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgQVVESU9fUExMX01PRF9TVEVQX0ZSQUNfTFNCICAgICAgICAgICAgICAxNAorI2RlZmluZSBBVURJT19QTExfTU9EX1NURVBfRlJBQ19NQVNLICAgICAgICAgICAgIDB4ZmZmZmMwMDAKKyNkZWZpbmUgQVVESU9fUExMX01PRF9TVEVQX0ZSQUNfR0VUKHgpICAgICAgICAgICAoKCh4KSAmIEFVRElPX1BMTF9NT0RfU1RFUF9GUkFDX01BU0spID4+IEFVRElPX1BMTF9NT0RfU1RFUF9GUkFDX0xTQikKKyNkZWZpbmUgQVVESU9fUExMX01PRF9TVEVQX0ZSQUNfU0VUKHgpICAgICAgICAgICAoKCh4KSA8PCBBVURJT19QTExfTU9EX1NURVBfRlJBQ19MU0IpICYgQVVESU9fUExMX01PRF9TVEVQX0ZSQUNfTUFTSykKKyNkZWZpbmUgQVVESU9fUExMX01PRF9TVEVQX0lOVF9NU0IgICAgICAgICAgICAgICAxMworI2RlZmluZSBBVURJT19QTExfTU9EX1NURVBfSU5UX0xTQiAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVVESU9fUExMX01PRF9TVEVQX0lOVF9NQVNLICAgICAgICAgICAgICAweDAwMDAzZmYwCisjZGVmaW5lIEFVRElPX1BMTF9NT0RfU1RFUF9JTlRfR0VUKHgpICAgICAgICAgICAgKCgoeCkgJiBBVURJT19QTExfTU9EX1NURVBfSU5UX01BU0spID4+IEFVRElPX1BMTF9NT0RfU1RFUF9JTlRfTFNCKQorI2RlZmluZSBBVURJT19QTExfTU9EX1NURVBfSU5UX1NFVCh4KSAgICAgICAgICAgICgoKHgpIDw8IEFVRElPX1BMTF9NT0RfU1RFUF9JTlRfTFNCKSAmIEFVRElPX1BMTF9NT0RfU1RFUF9JTlRfTUFTSykKKyNkZWZpbmUgQVVESU9fUExMX01PRF9TVEVQX1VQREFURV9DTlRfTVNCICAgICAgICAzCisjZGVmaW5lIEFVRElPX1BMTF9NT0RfU1RFUF9VUERBVEVfQ05UX0xTQiAgICAgICAgMAorI2RlZmluZSBBVURJT19QTExfTU9EX1NURVBfVVBEQVRFX0NOVF9NQVNLICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgQVVESU9fUExMX01PRF9TVEVQX1VQREFURV9DTlRfR0VUKHgpICAgICAoKCh4KSAmIEFVRElPX1BMTF9NT0RfU1RFUF9VUERBVEVfQ05UX01BU0spID4+IEFVRElPX1BMTF9NT0RfU1RFUF9VUERBVEVfQ05UX0xTQikKKyNkZWZpbmUgQVVESU9fUExMX01PRF9TVEVQX1VQREFURV9DTlRfU0VUKHgpICAgICAoKCh4KSA8PCBBVURJT19QTExfTU9EX1NURVBfVVBEQVRFX0NOVF9MU0IpICYgQVVESU9fUExMX01PRF9TVEVQX1VQREFURV9DTlRfTUFTSykKKworI2RlZmluZSBDVVJSRU5UX0FVRElPX1BMTF9NT0RVTEFUSU9OX0FERFJFU1MgICAgIDB4MDAwMDAyZmMKKyNkZWZpbmUgQ1VSUkVOVF9BVURJT19QTExfTU9EVUxBVElPTl9PRkZTRVQgICAgICAweDAwMDAwMmZjCisjZGVmaW5lIENVUlJFTlRfQVVESU9fUExMX01PRFVMQVRJT05fRlJBQ19NU0IgICAgMjcKKyNkZWZpbmUgQ1VSUkVOVF9BVURJT19QTExfTU9EVUxBVElPTl9GUkFDX0xTQiAgICAxMAorI2RlZmluZSBDVVJSRU5UX0FVRElPX1BMTF9NT0RVTEFUSU9OX0ZSQUNfTUFTSyAgIDB4MGZmZmZjMDAKKyNkZWZpbmUgQ1VSUkVOVF9BVURJT19QTExfTU9EVUxBVElPTl9GUkFDX0dFVCh4KSAoKCh4KSAmIENVUlJFTlRfQVVESU9fUExMX01PRFVMQVRJT05fRlJBQ19NQVNLKSA+PiBDVVJSRU5UX0FVRElPX1BMTF9NT0RVTEFUSU9OX0ZSQUNfTFNCKQorI2RlZmluZSBDVVJSRU5UX0FVRElPX1BMTF9NT0RVTEFUSU9OX0ZSQUNfU0VUKHgpICgoKHgpIDw8IENVUlJFTlRfQVVESU9fUExMX01PRFVMQVRJT05fRlJBQ19MU0IpICYgQ1VSUkVOVF9BVURJT19QTExfTU9EVUxBVElPTl9GUkFDX01BU0spCisjZGVmaW5lIENVUlJFTlRfQVVESU9fUExMX01PRFVMQVRJT05fSU5UX01TQiAgICAgNgorI2RlZmluZSBDVVJSRU5UX0FVRElPX1BMTF9NT0RVTEFUSU9OX0lOVF9MU0IgICAgIDEKKyNkZWZpbmUgQ1VSUkVOVF9BVURJT19QTExfTU9EVUxBVElPTl9JTlRfTUFTSyAgICAweDAwMDAwMDdlCisjZGVmaW5lIENVUlJFTlRfQVVESU9fUExMX01PRFVMQVRJT05fSU5UX0dFVCh4KSAgKCgoeCkgJiBDVVJSRU5UX0FVRElPX1BMTF9NT0RVTEFUSU9OX0lOVF9NQVNLKSA+PiBDVVJSRU5UX0FVRElPX1BMTF9NT0RVTEFUSU9OX0lOVF9MU0IpCisjZGVmaW5lIENVUlJFTlRfQVVESU9fUExMX01PRFVMQVRJT05fSU5UX1NFVCh4KSAgKCgoeCkgPDwgQ1VSUkVOVF9BVURJT19QTExfTU9EVUxBVElPTl9JTlRfTFNCKSAmIENVUlJFTlRfQVVESU9fUExMX01PRFVMQVRJT05fSU5UX01BU0spCisKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIEVUSF9QTExfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBFVEhfUExMX0NPTkZJR19HRTBfTUFTVEVSX01TQiAgICAgICAgICAgIDMwCisjZGVmaW5lIEVUSF9QTExfQ09ORklHX0dFMF9NQVNURVJfTFNCICAgICAgICAgICAgMzAKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfR0UwX01BU1RFUl9NQVNLICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEVUSF9QTExfQ09ORklHX0dFMF9NQVNURVJfR0VUKHgpICAgICAgICAgKCgoeCkgJiBFVEhfUExMX0NPTkZJR19HRTBfTUFTVEVSX01BU0spID4+IEVUSF9QTExfQ09ORklHX0dFMF9NQVNURVJfTFNCKQorI2RlZmluZSBFVEhfUExMX0NPTkZJR19HRTBfTUFTVEVSX1NFVCh4KSAgICAgICAgICgoKHgpIDw8IEVUSF9QTExfQ09ORklHX0dFMF9NQVNURVJfTFNCKSAmIEVUSF9QTExfQ09ORklHX0dFMF9NQVNURVJfTUFTSykKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfR0UwX01TQiAgICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBFVEhfUExMX0NPTkZJR19HRTBfTFNCICAgICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIEVUSF9QTExfQ09ORklHX0dFMF9NQVNLICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBFVEhfUExMX0NPTkZJR19HRTBfR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgRVRIX1BMTF9DT05GSUdfR0UwX01BU0spID4+IEVUSF9QTExfQ09ORklHX0dFMF9MU0IpCisjZGVmaW5lIEVUSF9QTExfQ09ORklHX0dFMF9TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgRVRIX1BMTF9DT05GSUdfR0UwX0xTQikgJiBFVEhfUExMX0NPTkZJR19HRTBfTUFTSykKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfUkFOR0VfTVNCICAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBFVEhfUExMX0NPTkZJR19SQU5HRV9MU0IgICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIEVUSF9QTExfQ09ORklHX1JBTkdFX01BU0sgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBFVEhfUExMX0NPTkZJR19SQU5HRV9HRVQoeCkgICAgICAgICAgICAgICgoKHgpICYgRVRIX1BMTF9DT05GSUdfUkFOR0VfTUFTSykgPj4gRVRIX1BMTF9DT05GSUdfUkFOR0VfTFNCKQorI2RlZmluZSBFVEhfUExMX0NPTkZJR19SQU5HRV9TRVQoeCkgICAgICAgICAgICAgICgoKHgpIDw8IEVUSF9QTExfQ09ORklHX1JBTkdFX0xTQikgJiBFVEhfUExMX0NPTkZJR19SQU5HRV9NQVNLKQorI2RlZmluZSBFVEhfUExMX0NPTkZJR19GUkFDX01TQiAgICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIEVUSF9QTExfQ09ORklHX0ZSQUNfTFNCICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfRlJBQ19NQVNLICAgICAgICAgICAgICAgICAweDBmZmMwMDAwCisjZGVmaW5lIEVUSF9QTExfQ09ORklHX0ZSQUNfR0VUKHgpICAgICAgICAgICAgICAgKCgoeCkgJiBFVEhfUExMX0NPTkZJR19GUkFDX01BU0spID4+IEVUSF9QTExfQ09ORklHX0ZSQUNfTFNCKQorI2RlZmluZSBFVEhfUExMX0NPTkZJR19GUkFDX1NFVCh4KSAgICAgICAgICAgICAgICgoKHgpIDw8IEVUSF9QTExfQ09ORklHX0ZSQUNfTFNCKSAmIEVUSF9QTExfQ09ORklHX0ZSQUNfTUFTSykKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfSU5UX01TQiAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBFVEhfUExMX0NPTkZJR19JTlRfTFNCICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEVUSF9QTExfQ09ORklHX0lOVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAzZjAwMAorI2RlZmluZSBFVEhfUExMX0NPTkZJR19JTlRfR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgRVRIX1BMTF9DT05GSUdfSU5UX01BU0spID4+IEVUSF9QTExfQ09ORklHX0lOVF9MU0IpCisjZGVmaW5lIEVUSF9QTExfQ09ORklHX0lOVF9TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgRVRIX1BMTF9DT05GSUdfSU5UX0xTQikgJiBFVEhfUExMX0NPTkZJR19JTlRfTUFTSykKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfT1VURElWX01TQiAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEVUSF9QTExfQ09ORklHX09VVERJVl9MU0IgICAgICAgICAgICAgICAgNworI2RlZmluZSBFVEhfUExMX0NPTkZJR19PVVRESVZfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAzODAKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfT1VURElWX0dFVCh4KSAgICAgICAgICAgICAoKCh4KSAmIEVUSF9QTExfQ09ORklHX09VVERJVl9NQVNLKSA+PiBFVEhfUExMX0NPTkZJR19PVVRESVZfTFNCKQorI2RlZmluZSBFVEhfUExMX0NPTkZJR19PVVRESVZfU0VUKHgpICAgICAgICAgICAgICgoKHgpIDw8IEVUSF9QTExfQ09ORklHX09VVERJVl9MU0IpICYgRVRIX1BMTF9DT05GSUdfT1VURElWX01BU0spCisjZGVmaW5lIEVUSF9QTExfQ09ORklHX1BMTFBXRF9NU0IgICAgICAgICAgICAgICAgNgorI2RlZmluZSBFVEhfUExMX0NPTkZJR19QTExQV0RfTFNCICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfUExMUFdEX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEVUSF9QTExfQ09ORklHX1BMTFBXRF9HRVQoeCkgICAgICAgICAgICAgKCgoeCkgJiBFVEhfUExMX0NPTkZJR19QTExQV0RfTUFTSykgPj4gRVRIX1BMTF9DT05GSUdfUExMUFdEX0xTQikKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfUExMUFdEX1NFVCh4KSAgICAgICAgICAgICAoKCh4KSA8PCBFVEhfUExMX0NPTkZJR19QTExQV0RfTFNCKSAmIEVUSF9QTExfQ09ORklHX1BMTFBXRF9NQVNLKQorI2RlZmluZSBFVEhfUExMX0NPTkZJR19CWVBBU1NfTVNCICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfQllQQVNTX0xTQiAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEVUSF9QTExfQ09ORklHX0JZUEFTU19NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBFVEhfUExMX0NPTkZJR19CWVBBU1NfR0VUKHgpICAgICAgICAgICAgICgoKHgpICYgRVRIX1BMTF9DT05GSUdfQllQQVNTX01BU0spID4+IEVUSF9QTExfQ09ORklHX0JZUEFTU19MU0IpCisjZGVmaW5lIEVUSF9QTExfQ09ORklHX0JZUEFTU19TRVQoeCkgICAgICAgICAgICAgKCgoeCkgPDwgRVRIX1BMTF9DT05GSUdfQllQQVNTX0xTQikgJiBFVEhfUExMX0NPTkZJR19CWVBBU1NfTUFTSykKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfUkVGRElWX01TQiAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEVUSF9QTExfQ09ORklHX1JFRkRJVl9MU0IgICAgICAgICAgICAgICAgMAorI2RlZmluZSBFVEhfUExMX0NPTkZJR19SRUZESVZfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgRVRIX1BMTF9DT05GSUdfUkVGRElWX0dFVCh4KSAgICAgICAgICAgICAoKCh4KSAmIEVUSF9QTExfQ09ORklHX1JFRkRJVl9NQVNLKSA+PiBFVEhfUExMX0NPTkZJR19SRUZESVZfTFNCKQorI2RlZmluZSBFVEhfUExMX0NPTkZJR19SRUZESVZfU0VUKHgpICAgICAgICAgICAgICgoKHgpIDw8IEVUSF9QTExfQ09ORklHX1JFRkRJVl9MU0IpICYgRVRIX1BMTF9DT05GSUdfUkVGRElWX01BU0spCisKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMzA0CisjZGVmaW5lIENQVV9QTExfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNAorI2RlZmluZSBDUFVfUExMX0NPTkZJR19SQU5HRV9NU0IgICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIENQVV9QTExfQ09ORklHX1JBTkdFX0xTQiAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfUkFOR0VfTUFTSyAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIENQVV9QTExfQ09ORklHX1JBTkdFX0dFVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiBDUFVfUExMX0NPTkZJR19SQU5HRV9NQVNLKSA+PiBDUFVfUExMX0NPTkZJR19SQU5HRV9MU0IpCisjZGVmaW5lIENQVV9QTExfQ09ORklHX1JBTkdFX1NFVCh4KSAgICAgICAgICAgICAgKCgoeCkgPDwgQ1BVX1BMTF9DT05GSUdfUkFOR0VfTFNCKSAmIENQVV9QTExfQ09ORklHX1JBTkdFX01BU0spCisjZGVmaW5lIENQVV9QTExfQ09ORklHX0ZSQUNfTVNCICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfRlJBQ19MU0IgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBDUFVfUExMX0NPTkZJR19GUkFDX01BU0sgICAgICAgICAgICAgICAgIDB4MDNmMDAwMDAKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfRlJBQ19HRVQoeCkgICAgICAgICAgICAgICAoKCh4KSAmIENQVV9QTExfQ09ORklHX0ZSQUNfTUFTSykgPj4gQ1BVX1BMTF9DT05GSUdfRlJBQ19MU0IpCisjZGVmaW5lIENQVV9QTExfQ09ORklHX0ZSQUNfU0VUKHgpICAgICAgICAgICAgICAgKCgoeCkgPDwgQ1BVX1BMTF9DT05GSUdfRlJBQ19MU0IpICYgQ1BVX1BMTF9DT05GSUdfRlJBQ19NQVNLKQorI2RlZmluZSBDUFVfUExMX0NPTkZJR19JTlRfTVNCICAgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIENQVV9QTExfQ09ORklHX0lOVF9MU0IgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfSU5UX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDNmMDAwCisjZGVmaW5lIENQVV9QTExfQ09ORklHX0lOVF9HRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiBDUFVfUExMX0NPTkZJR19JTlRfTUFTSykgPj4gQ1BVX1BMTF9DT05GSUdfSU5UX0xTQikKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfSU5UX1NFVCh4KSAgICAgICAgICAgICAgICAoKCh4KSA8PCBDUFVfUExMX0NPTkZJR19JTlRfTFNCKSAmIENQVV9QTExfQ09ORklHX0lOVF9NQVNLKQorI2RlZmluZSBDUFVfUExMX0NPTkZJR19PVVRESVZfTVNCICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfT1VURElWX0xTQiAgICAgICAgICAgICAgICA3CisjZGVmaW5lIENQVV9QTExfQ09ORklHX09VVERJVl9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDM4MAorI2RlZmluZSBDUFVfUExMX0NPTkZJR19PVVRESVZfR0VUKHgpICAgICAgICAgICAgICgoKHgpICYgQ1BVX1BMTF9DT05GSUdfT1VURElWX01BU0spID4+IENQVV9QTExfQ09ORklHX09VVERJVl9MU0IpCisjZGVmaW5lIENQVV9QTExfQ09ORklHX09VVERJVl9TRVQoeCkgICAgICAgICAgICAgKCgoeCkgPDwgQ1BVX1BMTF9DT05GSUdfT1VURElWX0xTQikgJiBDUFVfUExMX0NPTkZJR19PVVRESVZfTUFTSykKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfUExMUFdEX01TQiAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENQVV9QTExfQ09ORklHX1BMTFBXRF9MU0IgICAgICAgICAgICAgICAgNgorI2RlZmluZSBDUFVfUExMX0NPTkZJR19QTExQV0RfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfUExMUFdEX0dFVCh4KSAgICAgICAgICAgICAoKCh4KSAmIENQVV9QTExfQ09ORklHX1BMTFBXRF9NQVNLKSA+PiBDUFVfUExMX0NPTkZJR19QTExQV0RfTFNCKQorI2RlZmluZSBDUFVfUExMX0NPTkZJR19QTExQV0RfU0VUKHgpICAgICAgICAgICAgICgoKHgpIDw8IENQVV9QTExfQ09ORklHX1BMTFBXRF9MU0IpICYgQ1BVX1BMTF9DT05GSUdfUExMUFdEX01BU0spCisjZGVmaW5lIENQVV9QTExfQ09ORklHX1JFRkRJVl9NU0IgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDUFVfUExMX0NPTkZJR19SRUZESVZfTFNCICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfUkVGRElWX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMDFmCisjZGVmaW5lIENQVV9QTExfQ09ORklHX1JFRkRJVl9HRVQoeCkgICAgICAgICAgICAgKCgoeCkgJiBDUFVfUExMX0NPTkZJR19SRUZESVZfTUFTSykgPj4gQ1BVX1BMTF9DT05GSUdfUkVGRElWX0xTQikKKyNkZWZpbmUgQ1BVX1BMTF9DT05GSUdfUkVGRElWX1NFVCh4KSAgICAgICAgICAgICAoKCh4KSA8PCBDUFVfUExMX0NPTkZJR19SRUZESVZfTFNCKSAmIENQVV9QTExfQ09ORklHX1JFRkRJVl9NQVNLKQorCisjZGVmaW5lIEJCX1BMTF9DT05GSUdfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwOAorI2RlZmluZSBCQl9QTExfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDgKKyNkZWZpbmUgQkJfUExMX0NPTkZJR19GUkFDX01TQiAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBCQl9QTExfQ09ORklHX0ZSQUNfTFNCICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkJfUExMX0NPTkZJR19GUkFDX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDNmZmZmCisjZGVmaW5lIEJCX1BMTF9DT05GSUdfRlJBQ19HRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiBCQl9QTExfQ09ORklHX0ZSQUNfTUFTSykgPj4gQkJfUExMX0NPTkZJR19GUkFDX0xTQikKKyNkZWZpbmUgQkJfUExMX0NPTkZJR19GUkFDX1NFVCh4KSAgICAgICAgICAgICAgICAoKCh4KSA8PCBCQl9QTExfQ09ORklHX0ZSQUNfTFNCKSAmIEJCX1BMTF9DT05GSUdfRlJBQ19NQVNLKQorCisjZGVmaW5lIEVUSF9YTUlJX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwYworI2RlZmluZSBFVEhfWE1JSV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMGMKKyNkZWZpbmUgRVRIX1hNSUlfVFhfSU5WRVJUX01TQiAgICAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBFVEhfWE1JSV9UWF9JTlZFUlRfTFNCICAgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIEVUSF9YTUlJX1RYX0lOVkVSVF9NQVNLICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBFVEhfWE1JSV9UWF9JTlZFUlRfR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgRVRIX1hNSUlfVFhfSU5WRVJUX01BU0spID4+IEVUSF9YTUlJX1RYX0lOVkVSVF9MU0IpCisjZGVmaW5lIEVUSF9YTUlJX1RYX0lOVkVSVF9TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgRVRIX1hNSUlfVFhfSU5WRVJUX0xTQikgJiBFVEhfWE1JSV9UWF9JTlZFUlRfTUFTSykKKyNkZWZpbmUgRVRIX1hNSUlfR0lHRV9RVUFEX01TQiAgICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBFVEhfWE1JSV9HSUdFX1FVQURfTFNCICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIEVUSF9YTUlJX0dJR0VfUVVBRF9NQVNLICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBFVEhfWE1JSV9HSUdFX1FVQURfR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgRVRIX1hNSUlfR0lHRV9RVUFEX01BU0spID4+IEVUSF9YTUlJX0dJR0VfUVVBRF9MU0IpCisjZGVmaW5lIEVUSF9YTUlJX0dJR0VfUVVBRF9TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgRVRIX1hNSUlfR0lHRV9RVUFEX0xTQikgJiBFVEhfWE1JSV9HSUdFX1FVQURfTUFTSykKKyNkZWZpbmUgRVRIX1hNSUlfUlhfREVMQVlfTVNCICAgICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBFVEhfWE1JSV9SWF9ERUxBWV9MU0IgICAgICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIEVUSF9YTUlJX1JYX0RFTEFZX01BU0sgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAorI2RlZmluZSBFVEhfWE1JSV9SWF9ERUxBWV9HRVQoeCkgICAgICAgICAgICAgICAgICgoKHgpICYgRVRIX1hNSUlfUlhfREVMQVlfTUFTSykgPj4gRVRIX1hNSUlfUlhfREVMQVlfTFNCKQorI2RlZmluZSBFVEhfWE1JSV9SWF9ERUxBWV9TRVQoeCkgICAgICAgICAgICAgICAgICgoKHgpIDw8IEVUSF9YTUlJX1JYX0RFTEFZX0xTQikgJiBFVEhfWE1JSV9SWF9ERUxBWV9NQVNLKQorI2RlZmluZSBFVEhfWE1JSV9UWF9ERUxBWV9NU0IgICAgICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIEVUSF9YTUlJX1RYX0RFTEFZX0xTQiAgICAgICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgRVRIX1hNSUlfVFhfREVMQVlfTUFTSyAgICAgICAgICAgICAgICAgICAweDBjMDAwMDAwCisjZGVmaW5lIEVUSF9YTUlJX1RYX0RFTEFZX0dFVCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiBFVEhfWE1JSV9UWF9ERUxBWV9NQVNLKSA+PiBFVEhfWE1JSV9UWF9ERUxBWV9MU0IpCisjZGVmaW5lIEVUSF9YTUlJX1RYX0RFTEFZX1NFVCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgPDwgRVRIX1hNSUlfVFhfREVMQVlfTFNCKSAmIEVUSF9YTUlJX1RYX0RFTEFZX01BU0spCisjZGVmaW5lIEVUSF9YTUlJX0dJR0VfTVNCICAgICAgICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgRVRIX1hNSUlfR0lHRV9MU0IgICAgICAgICAgICAgICAgICAgICAgICAyNQorI2RlZmluZSBFVEhfWE1JSV9HSUdFX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgRVRIX1hNSUlfR0lHRV9HRVQoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIEVUSF9YTUlJX0dJR0VfTUFTSykgPj4gRVRIX1hNSUlfR0lHRV9MU0IpCisjZGVmaW5lIEVUSF9YTUlJX0dJR0VfU0VUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPDwgRVRIX1hNSUlfR0lHRV9MU0IpICYgRVRIX1hNSUlfR0lHRV9NQVNLKQorI2RlZmluZSBFVEhfWE1JSV9PRkZTRVRfUEhBU0VfTVNCICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIEVUSF9YTUlJX09GRlNFVF9QSEFTRV9MU0IgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgRVRIX1hNSUlfT0ZGU0VUX1BIQVNFX01BU0sgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEVUSF9YTUlJX09GRlNFVF9QSEFTRV9HRVQoeCkgICAgICAgICAgICAgKCgoeCkgJiBFVEhfWE1JSV9PRkZTRVRfUEhBU0VfTUFTSykgPj4gRVRIX1hNSUlfT0ZGU0VUX1BIQVNFX0xTQikKKyNkZWZpbmUgRVRIX1hNSUlfT0ZGU0VUX1BIQVNFX1NFVCh4KSAgICAgICAgICAgICAoKCh4KSA8PCBFVEhfWE1JSV9PRkZTRVRfUEhBU0VfTFNCKSAmIEVUSF9YTUlJX09GRlNFVF9QSEFTRV9NQVNLKQorI2RlZmluZSBFVEhfWE1JSV9PRkZTRVRfQ09VTlRfTVNCICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIEVUSF9YTUlJX09GRlNFVF9DT1VOVF9MU0IgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgRVRIX1hNSUlfT0ZGU0VUX0NPVU5UX01BU0sgICAgICAgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEVUSF9YTUlJX09GRlNFVF9DT1VOVF9HRVQoeCkgICAgICAgICAgICAgKCgoeCkgJiBFVEhfWE1JSV9PRkZTRVRfQ09VTlRfTUFTSykgPj4gRVRIX1hNSUlfT0ZGU0VUX0NPVU5UX0xTQikKKyNkZWZpbmUgRVRIX1hNSUlfT0ZGU0VUX0NPVU5UX1NFVCh4KSAgICAgICAgICAgICAoKCh4KSA8PCBFVEhfWE1JSV9PRkZTRVRfQ09VTlRfTFNCKSAmIEVUSF9YTUlJX09GRlNFVF9DT1VOVF9NQVNLKQorI2RlZmluZSBFVEhfWE1JSV9QSEFTRTFfQ09VTlRfTVNCICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEVUSF9YTUlJX1BIQVNFMV9DT1VOVF9MU0IgICAgICAgICAgICAgICAgOAorI2RlZmluZSBFVEhfWE1JSV9QSEFTRTFfQ09VTlRfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgRVRIX1hNSUlfUEhBU0UxX0NPVU5UX0dFVCh4KSAgICAgICAgICAgICAoKCh4KSAmIEVUSF9YTUlJX1BIQVNFMV9DT1VOVF9NQVNLKSA+PiBFVEhfWE1JSV9QSEFTRTFfQ09VTlRfTFNCKQorI2RlZmluZSBFVEhfWE1JSV9QSEFTRTFfQ09VTlRfU0VUKHgpICAgICAgICAgICAgICgoKHgpIDw8IEVUSF9YTUlJX1BIQVNFMV9DT1VOVF9MU0IpICYgRVRIX1hNSUlfUEhBU0UxX0NPVU5UX01BU0spCisjZGVmaW5lIEVUSF9YTUlJX1BIQVNFMF9DT1VOVF9NU0IgICAgICAgICAgICAgICAgNworI2RlZmluZSBFVEhfWE1JSV9QSEFTRTBfQ09VTlRfTFNCICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRVRIX1hNSUlfUEhBU0UwX0NPVU5UX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEVUSF9YTUlJX1BIQVNFMF9DT1VOVF9HRVQoeCkgICAgICAgICAgICAgKCgoeCkgJiBFVEhfWE1JSV9QSEFTRTBfQ09VTlRfTUFTSykgPj4gRVRIX1hNSUlfUEhBU0UwX0NPVU5UX0xTQikKKyNkZWZpbmUgRVRIX1hNSUlfUEhBU0UwX0NPVU5UX1NFVCh4KSAgICAgICAgICAgICAoKCh4KSA8PCBFVEhfWE1JSV9QSEFTRTBfQ09VTlRfTFNCKSAmIEVUSF9YTUlJX1BIQVNFMF9DT1VOVF9NQVNLKQorCisjZGVmaW5lIFVTQl9QSFlfQ09ORklHX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxMAorI2RlZmluZSBVU0JfUEhZX0NPTkZJR19PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMTAKKyNkZWZpbmUgVVNCX1BIWV9DT05GSUdfUkVGQ0xLX1NFTF9NU0IgICAgICAgICAgICA3CisjZGVmaW5lIFVTQl9QSFlfQ09ORklHX1JFRkNMS19TRUxfTFNCICAgICAgICAgICAgNAorI2RlZmluZSBVU0JfUEhZX0NPTkZJR19SRUZDTEtfU0VMX01BU0sgICAgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgVVNCX1BIWV9DT05GSUdfUkVGQ0xLX1NFTF9HRVQoeCkgICAgICAgICAoKCh4KSAmIFVTQl9QSFlfQ09ORklHX1JFRkNMS19TRUxfTUFTSykgPj4gVVNCX1BIWV9DT05GSUdfUkVGQ0xLX1NFTF9MU0IpCisjZGVmaW5lIFVTQl9QSFlfQ09ORklHX1JFRkNMS19TRUxfU0VUKHgpICAgICAgICAgKCgoeCkgPDwgVVNCX1BIWV9DT05GSUdfUkVGQ0xLX1NFTF9MU0IpICYgVVNCX1BIWV9DT05GSUdfUkVGQ0xLX1NFTF9NQVNLKQorI2RlZmluZSBVU0JfUEhZX0NPTkZJR19SRUZESVZfTVNCICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVVNCX1BIWV9DT05GSUdfUkVGRElWX0xTQiAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFVTQl9QSFlfQ09ORklHX1JFRkRJVl9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBVU0JfUEhZX0NPTkZJR19SRUZESVZfR0VUKHgpICAgICAgICAgICAgICgoKHgpICYgVVNCX1BIWV9DT05GSUdfUkVGRElWX01BU0spID4+IFVTQl9QSFlfQ09ORklHX1JFRkRJVl9MU0IpCisjZGVmaW5lIFVTQl9QSFlfQ09ORklHX1JFRkRJVl9TRVQoeCkgICAgICAgICAgICAgKCgoeCkgPDwgVVNCX1BIWV9DT05GSUdfUkVGRElWX0xTQikgJiBVU0JfUEhZX0NPTkZJR19SRUZESVZfTUFTSykKKyNkZWZpbmUgVVNCX1BIWV9DT05GSUdfVEVTVE1PREVfTVNCICAgICAgICAgICAgICAyCisjZGVmaW5lIFVTQl9QSFlfQ09ORklHX1RFU1RNT0RFX0xTQiAgICAgICAgICAgICAgMgorI2RlZmluZSBVU0JfUEhZX0NPTkZJR19URVNUTU9ERV9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgVVNCX1BIWV9DT05GSUdfVEVTVE1PREVfR0VUKHgpICAgICAgICAgICAoKCh4KSAmIFVTQl9QSFlfQ09ORklHX1RFU1RNT0RFX01BU0spID4+IFVTQl9QSFlfQ09ORklHX1RFU1RNT0RFX0xTQikKKyNkZWZpbmUgVVNCX1BIWV9DT05GSUdfVEVTVE1PREVfU0VUKHgpICAgICAgICAgICAoKCh4KSA8PCBVU0JfUEhZX0NPTkZJR19URVNUTU9ERV9MU0IpICYgVVNCX1BIWV9DT05GSUdfVEVTVE1PREVfTUFTSykKKyNkZWZpbmUgVVNCX1BIWV9DT05GSUdfUExMX1BXRF9NU0IgICAgICAgICAgICAgICAxCisjZGVmaW5lIFVTQl9QSFlfQ09ORklHX1BMTF9QV0RfTFNCICAgICAgICAgICAgICAgMQorI2RlZmluZSBVU0JfUEhZX0NPTkZJR19QTExfUFdEX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgVVNCX1BIWV9DT05GSUdfUExMX1BXRF9HRVQoeCkgICAgICAgICAgICAoKCh4KSAmIFVTQl9QSFlfQ09ORklHX1BMTF9QV0RfTUFTSykgPj4gVVNCX1BIWV9DT05GSUdfUExMX1BXRF9MU0IpCisjZGVmaW5lIFVTQl9QSFlfQ09ORklHX1BMTF9QV0RfU0VUKHgpICAgICAgICAgICAgKCgoeCkgPDwgVVNCX1BIWV9DT05GSUdfUExMX1BXRF9MU0IpICYgVVNCX1BIWV9DT05GSUdfUExMX1BXRF9NQVNLKQorI2RlZmluZSBVU0JfUEhZX0NPTkZJR19IT1NUTU9ERV9NU0IgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVVNCX1BIWV9DT05GSUdfSE9TVE1PREVfTFNCICAgICAgICAgICAgICAwCisjZGVmaW5lIFVTQl9QSFlfQ09ORklHX0hPU1RNT0RFX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBVU0JfUEhZX0NPTkZJR19IT1NUTU9ERV9HRVQoeCkgICAgICAgICAgICgoKHgpICYgVVNCX1BIWV9DT05GSUdfSE9TVE1PREVfTUFTSykgPj4gVVNCX1BIWV9DT05GSUdfSE9TVE1PREVfTFNCKQorI2RlZmluZSBVU0JfUEhZX0NPTkZJR19IT1NUTU9ERV9TRVQoeCkgICAgICAgICAgICgoKHgpIDw8IFVTQl9QSFlfQ09ORklHX0hPU1RNT0RFX0xTQikgJiBVU0JfUEhZX0NPTkZJR19IT1NUTU9ERV9NQVNLKQorCisjZGVmaW5lIFVTQkNPUkVfQ0xLNjBNX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxNAorI2RlZmluZSBVU0JDT1JFX0NMSzYwTV9PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMTQKKyNkZWZpbmUgVVNCQ09SRV9DTEs2ME1fU0VMX01TQiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFVTQkNPUkVfQ0xLNjBNX1NFTF9MU0IgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBVU0JDT1JFX0NMSzYwTV9TRUxfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgVVNCQ09SRV9DTEs2ME1fU0VMX0dFVCh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIFVTQkNPUkVfQ0xLNjBNX1NFTF9NQVNLKSA+PiBVU0JDT1JFX0NMSzYwTV9TRUxfTFNCKQorI2RlZmluZSBVU0JDT1JFX0NMSzYwTV9TRUxfU0VUKHgpICAgICAgICAgICAgICAgICgoKHgpIDw8IFVTQkNPUkVfQ0xLNjBNX1NFTF9MU0IpICYgVVNCQ09SRV9DTEs2ME1fU0VMX01BU0spCisKKyNkZWZpbmUgVVNCUEhZX1VUTUlfQ0xLX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDAwMzE4CisjZGVmaW5lIFVTQlBIWV9VVE1JX0NMS19PRkZTRVQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxOAorI2RlZmluZSBVU0JQSFlfVVRNSV9DTEtfRU5fTVNCICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVVNCUEhZX1VUTUlfQ0xLX0VOX0xTQiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFVTQlBIWV9VVE1JX0NMS19FTl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBVU0JQSFlfVVRNSV9DTEtfRU5fR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgVVNCUEhZX1VUTUlfQ0xLX0VOX01BU0spID4+IFVTQlBIWV9VVE1JX0NMS19FTl9MU0IpCisjZGVmaW5lIFVTQlBIWV9VVE1JX0NMS19FTl9TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgVVNCUEhZX1VUTUlfQ0xLX0VOX0xTQikgJiBVU0JQSFlfVVRNSV9DTEtfRU5fTUFTSykKKworI2RlZmluZSBVU0JfVFhWQUxJRF9ETFlfQ09ORklHX0FERFJFU1MgICAgICAgICAgIDB4MDAwMDAzMWMKKyNkZWZpbmUgVVNCX1RYVkFMSURfRExZX0NPTkZJR19PRkZTRVQgICAgICAgICAgICAweDAwMDAwMzFjCisjZGVmaW5lIFVTQl9UWFZBTElEX0RMWV9DT05GSUdfVVRNSTE2X01TQiAgICAgICAgNworI2RlZmluZSBVU0JfVFhWQUxJRF9ETFlfQ09ORklHX1VUTUkxNl9MU0IgICAgICAgIDQKKyNkZWZpbmUgVVNCX1RYVkFMSURfRExZX0NPTkZJR19VVE1JMTZfTUFTSyAgICAgICAweDAwMDAwMGYwCisjZGVmaW5lIFVTQl9UWFZBTElEX0RMWV9DT05GSUdfVVRNSTE2X0dFVCh4KSAgICAgKCgoeCkgJiBVU0JfVFhWQUxJRF9ETFlfQ09ORklHX1VUTUkxNl9NQVNLKSA+PiBVU0JfVFhWQUxJRF9ETFlfQ09ORklHX1VUTUkxNl9MU0IpCisjZGVmaW5lIFVTQl9UWFZBTElEX0RMWV9DT05GSUdfVVRNSTE2X1NFVCh4KSAgICAgKCgoeCkgPDwgVVNCX1RYVkFMSURfRExZX0NPTkZJR19VVE1JMTZfTFNCKSAmIFVTQl9UWFZBTElEX0RMWV9DT05GSUdfVVRNSTE2X01BU0spCisjZGVmaW5lIFVTQl9UWFZBTElEX0RMWV9DT05GSUdfVVRNSThfTVNCICAgICAgICAgMworI2RlZmluZSBVU0JfVFhWQUxJRF9ETFlfQ09ORklHX1VUTUk4X0xTQiAgICAgICAgIDAKKyNkZWZpbmUgVVNCX1RYVkFMSURfRExZX0NPTkZJR19VVE1JOF9NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIFVTQl9UWFZBTElEX0RMWV9DT05GSUdfVVRNSThfR0VUKHgpICAgICAgKCgoeCkgJiBVU0JfVFhWQUxJRF9ETFlfQ09ORklHX1VUTUk4X01BU0spID4+IFVTQl9UWFZBTElEX0RMWV9DT05GSUdfVVRNSThfTFNCKQorI2RlZmluZSBVU0JfVFhWQUxJRF9ETFlfQ09ORklHX1VUTUk4X1NFVCh4KSAgICAgICgoKHgpIDw8IFVTQl9UWFZBTElEX0RMWV9DT05GSUdfVVRNSThfTFNCKSAmIFVTQl9UWFZBTElEX0RMWV9DT05GSUdfVVRNSThfTUFTSykKKworI2RlZmluZSBTRUNPTkRfSE9TVF9JTkZUX0FERFJFU1MgICAgICAgICAgICAgICAgIDB4MDAwMDAzMjAKKyNkZWZpbmUgU0VDT05EX0hPU1RfSU5GVF9PRkZTRVQgICAgICAgICAgICAgICAgICAweDAwMDAwMzIwCisjZGVmaW5lIFNFQ09ORF9IT1NUX0lORlRfU0RJT19NT0RFX01TQiAgICAgICAgICAgMAorI2RlZmluZSBTRUNPTkRfSE9TVF9JTkZUX1NESU9fTU9ERV9MU0IgICAgICAgICAgIDAKKyNkZWZpbmUgU0VDT05EX0hPU1RfSU5GVF9TRElPX01PREVfTUFTSyAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNFQ09ORF9IT1NUX0lORlRfU0RJT19NT0RFX0dFVCh4KSAgICAgICAgKCgoeCkgJiBTRUNPTkRfSE9TVF9JTkZUX1NESU9fTU9ERV9NQVNLKSA+PiBTRUNPTkRfSE9TVF9JTkZUX1NESU9fTU9ERV9MU0IpCisjZGVmaW5lIFNFQ09ORF9IT1NUX0lORlRfU0RJT19NT0RFX1NFVCh4KSAgICAgICAgKCgoeCkgPDwgU0VDT05EX0hPU1RfSU5GVF9TRElPX01PREVfTFNCKSAmIFNFQ09ORF9IT1NUX0lORlRfU0RJT19NT0RFX01BU0spCisKKyNkZWZpbmUgU0RJT19IT1NUX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzI0CisjZGVmaW5lIFNESU9fSE9TVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyNAorI2RlZmluZSBTRElPX0hPU1RfUkVTRVRfTVNCICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0RJT19IT1NUX1JFU0VUX0xTQiAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNESU9fSE9TVF9SRVNFVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTRElPX0hPU1RfUkVTRVRfR0VUKHgpICAgICAgICAgICAgICAgICAgICgoKHgpICYgU0RJT19IT1NUX1JFU0VUX01BU0spID4+IFNESU9fSE9TVF9SRVNFVF9MU0IpCisjZGVmaW5lIFNESU9fSE9TVF9SRVNFVF9TRVQoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgPDwgU0RJT19IT1NUX1JFU0VUX0xTQikgJiBTRElPX0hPU1RfUkVTRVRfTUFTSykKKworI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19BRERSRVNTICAgICAgICAgICAgICAgIDB4MDAwMDAzMjgKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfT0ZGU0VUICAgICAgICAgICAgICAgICAweDAwMDAwMzI4CisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX1RQQ19MT1dFUl9QRVJGT1JNQU5DRV9NU0IgMTIKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfVFBDX0xPV0VSX1BFUkZPUk1BTkNFX0xTQiAxMgorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19UUENfTE9XRVJfUEVSRk9STUFOQ0VfTUFTSyAweDAwMDAxMDAwCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX1RQQ19MT1dFUl9QRVJGT1JNQU5DRV9HRVQoeCkgKCgoeCkgJiBFTlRFUlBSSVNFX0NPTkZJR19UUENfTE9XRVJfUEVSRk9STUFOQ0VfTUFTSykgPj4gRU5URVJQUklTRV9DT05GSUdfVFBDX0xPV0VSX1BFUkZPUk1BTkNFX0xTQikKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfVFBDX0xPV0VSX1BFUkZPUk1BTkNFX1NFVCh4KSAoKCh4KSA8PCBFTlRFUlBSSVNFX0NPTkZJR19UUENfTE9XRVJfUEVSRk9STUFOQ0VfTFNCKSAmIEVOVEVSUFJJU0VfQ09ORklHX1RQQ19MT1dFUl9QRVJGT1JNQU5DRV9NQVNLKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19TV0NPTV9JRExFX01PREVfTVNCICAgIDExCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX1NXQ09NX0lETEVfTU9ERV9MU0IgICAgMTEKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfU1dDT01fSURMRV9NT0RFX01BU0sgICAweDAwMDAwODAwCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX1NXQ09NX0lETEVfTU9ERV9HRVQoeCkgKCgoeCkgJiBFTlRFUlBSSVNFX0NPTkZJR19TV0NPTV9JRExFX01PREVfTUFTSykgPj4gRU5URVJQUklTRV9DT05GSUdfU1dDT01fSURMRV9NT0RFX0xTQikKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfU1dDT01fSURMRV9NT0RFX1NFVCh4KSAoKCh4KSA8PCBFTlRFUlBSSVNFX0NPTkZJR19TV0NPTV9JRExFX01PREVfTFNCKSAmIEVOVEVSUFJJU0VfQ09ORklHX1NXQ09NX0lETEVfTU9ERV9NQVNLKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19TVEJDX0RJU0FCTEVfTVNCICAgICAgIDEwCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX1NUQkNfRElTQUJMRV9MU0IgICAgICAgMTAKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfU1RCQ19ESVNBQkxFX01BU0sgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX1NUQkNfRElTQUJMRV9HRVQoeCkgICAgKCgoeCkgJiBFTlRFUlBSSVNFX0NPTkZJR19TVEJDX0RJU0FCTEVfTUFTSykgPj4gRU5URVJQUklTRV9DT05GSUdfU1RCQ19ESVNBQkxFX0xTQikKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfU1RCQ19ESVNBQkxFX1NFVCh4KSAgICAoKCh4KSA8PCBFTlRFUlBSSVNFX0NPTkZJR19TVEJDX0RJU0FCTEVfTFNCKSAmIEVOVEVSUFJJU0VfQ09ORklHX1NUQkNfRElTQUJMRV9NQVNLKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19MRFBDX0RJU0FCTEVfTVNCICAgICAgIDkKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfTERQQ19ESVNBQkxFX0xTQiAgICAgICA5CisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0xEUENfRElTQUJMRV9NQVNLICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19MRFBDX0RJU0FCTEVfR0VUKHgpICAgICgoKHgpICYgRU5URVJQUklTRV9DT05GSUdfTERQQ19ESVNBQkxFX01BU0spID4+IEVOVEVSUFJJU0VfQ09ORklHX0xEUENfRElTQUJMRV9MU0IpCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0xEUENfRElTQUJMRV9TRVQoeCkgICAgKCgoeCkgPDwgRU5URVJQUklTRV9DT05GSUdfTERQQ19ESVNBQkxFX0xTQikgJiBFTlRFUlBSSVNFX0NPTkZJR19MRFBDX0RJU0FCTEVfTUFTSykKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfR1JFRU5fVFhfRElTQUJMRV9NU0IgICA4CisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0dSRUVOX1RYX0RJU0FCTEVfTFNCICAgOAorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19HUkVFTl9UWF9ESVNBQkxFX01BU0sgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfR1JFRU5fVFhfRElTQUJMRV9HRVQoeCkgKCgoeCkgJiBFTlRFUlBSSVNFX0NPTkZJR19HUkVFTl9UWF9ESVNBQkxFX01BU0spID4+IEVOVEVSUFJJU0VfQ09ORklHX0dSRUVOX1RYX0RJU0FCTEVfTFNCKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19HUkVFTl9UWF9ESVNBQkxFX1NFVCh4KSAoKCh4KSA8PCBFTlRFUlBSSVNFX0NPTkZJR19HUkVFTl9UWF9ESVNBQkxFX0xTQikgJiBFTlRFUlBSSVNFX0NPTkZJR19HUkVFTl9UWF9ESVNBQkxFX01BU0spCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0RVQUxfQkFORF9ESVNBQkxFX01TQiAgNworI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19EVUFMX0JBTkRfRElTQUJMRV9MU0IgIDcKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfRFVBTF9CQU5EX0RJU0FCTEVfTUFTSyAweDAwMDAwMDgwCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0RVQUxfQkFORF9ESVNBQkxFX0dFVCh4KSAoKCh4KSAmIEVOVEVSUFJJU0VfQ09ORklHX0RVQUxfQkFORF9ESVNBQkxFX01BU0spID4+IEVOVEVSUFJJU0VfQ09ORklHX0RVQUxfQkFORF9ESVNBQkxFX0xTQikKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfRFVBTF9CQU5EX0RJU0FCTEVfU0VUKHgpICgoKHgpIDw8IEVOVEVSUFJJU0VfQ09ORklHX0RVQUxfQkFORF9ESVNBQkxFX0xTQikgJiBFTlRFUlBSSVNFX0NPTkZJR19EVUFMX0JBTkRfRElTQUJMRV9NQVNLKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19DSEFJTjFfRElTQUJMRV9NU0IgICAgIDYKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfQ0hBSU4xX0RJU0FCTEVfTFNCICAgICA2CisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0NIQUlOMV9ESVNBQkxFX01BU0sgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19DSEFJTjFfRElTQUJMRV9HRVQoeCkgICgoKHgpICYgRU5URVJQUklTRV9DT05GSUdfQ0hBSU4xX0RJU0FCTEVfTUFTSykgPj4gRU5URVJQUklTRV9DT05GSUdfQ0hBSU4xX0RJU0FCTEVfTFNCKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19DSEFJTjFfRElTQUJMRV9TRVQoeCkgICgoKHgpIDw8IEVOVEVSUFJJU0VfQ09ORklHX0NIQUlOMV9ESVNBQkxFX0xTQikgJiBFTlRFUlBSSVNFX0NPTkZJR19DSEFJTjFfRElTQUJMRV9NQVNLKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19DSF81TUhaX0RJU0FCTEVfTVNCICAgIDUKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfQ0hfNU1IWl9ESVNBQkxFX0xTQiAgICA1CisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0NIXzVNSFpfRElTQUJMRV9NQVNLICAgMHgwMDAwMDAyMAorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19DSF81TUhaX0RJU0FCTEVfR0VUKHgpICgoKHgpICYgRU5URVJQUklTRV9DT05GSUdfQ0hfNU1IWl9ESVNBQkxFX01BU0spID4+IEVOVEVSUFJJU0VfQ09ORklHX0NIXzVNSFpfRElTQUJMRV9MU0IpCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0NIXzVNSFpfRElTQUJMRV9TRVQoeCkgKCgoeCkgPDwgRU5URVJQUklTRV9DT05GSUdfQ0hfNU1IWl9ESVNBQkxFX0xTQikgJiBFTlRFUlBSSVNFX0NPTkZJR19DSF81TUhaX0RJU0FCTEVfTUFTSykKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfQ0hfMTBNSFpfRElTQUJMRV9NU0IgICA0CisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0NIXzEwTUhaX0RJU0FCTEVfTFNCICAgNAorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19DSF8xME1IWl9ESVNBQkxFX01BU0sgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfQ0hfMTBNSFpfRElTQUJMRV9HRVQoeCkgKCgoeCkgJiBFTlRFUlBSSVNFX0NPTkZJR19DSF8xME1IWl9ESVNBQkxFX01BU0spID4+IEVOVEVSUFJJU0VfQ09ORklHX0NIXzEwTUhaX0RJU0FCTEVfTFNCKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19DSF8xME1IWl9ESVNBQkxFX1NFVCh4KSAoKCh4KSA8PCBFTlRFUlBSSVNFX0NPTkZJR19DSF8xME1IWl9ESVNBQkxFX0xTQikgJiBFTlRFUlBSSVNFX0NPTkZJR19DSF8xME1IWl9ESVNBQkxFX01BU0spCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX1RYQkZfRElTQUJMRV9NU0IgICAgICAgMworI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19UWEJGX0RJU0FCTEVfTFNCICAgICAgIDMKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfVFhCRl9ESVNBQkxFX01BU0sgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX1RYQkZfRElTQUJMRV9HRVQoeCkgICAgKCgoeCkgJiBFTlRFUlBSSVNFX0NPTkZJR19UWEJGX0RJU0FCTEVfTUFTSykgPj4gRU5URVJQUklTRV9DT05GSUdfVFhCRl9ESVNBQkxFX0xTQikKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfVFhCRl9ESVNBQkxFX1NFVCh4KSAgICAoKCh4KSA8PCBFTlRFUlBSSVNFX0NPTkZJR19UWEJGX0RJU0FCTEVfTFNCKSAmIEVOVEVSUFJJU0VfQ09ORklHX1RYQkZfRElTQUJMRV9NQVNLKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19NSU5fUEtUX1NJWkVfRElTQUJMRV9NU0IgMgorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19NSU5fUEtUX1NJWkVfRElTQUJMRV9MU0IgMgorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19NSU5fUEtUX1NJWkVfRElTQUJMRV9NQVNLIDB4MDAwMDAwMDQKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfTUlOX1BLVF9TSVpFX0RJU0FCTEVfR0VUKHgpICgoKHgpICYgRU5URVJQUklTRV9DT05GSUdfTUlOX1BLVF9TSVpFX0RJU0FCTEVfTUFTSykgPj4gRU5URVJQUklTRV9DT05GSUdfTUlOX1BLVF9TSVpFX0RJU0FCTEVfTFNCKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19NSU5fUEtUX1NJWkVfRElTQUJMRV9TRVQoeCkgKCgoeCkgPDwgRU5URVJQUklTRV9DT05GSUdfTUlOX1BLVF9TSVpFX0RJU0FCTEVfTFNCKSAmIEVOVEVSUFJJU0VfQ09ORklHX01JTl9QS1RfU0laRV9ESVNBQkxFX01BU0spCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0xPT1BCQUNLX0RJU0FCTEVfTVNCICAgMQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19MT09QQkFDS19ESVNBQkxFX0xTQiAgIDEKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfTE9PUEJBQ0tfRElTQUJMRV9NQVNLICAweDAwMDAwMDAyCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0xPT1BCQUNLX0RJU0FCTEVfR0VUKHgpICgoKHgpICYgRU5URVJQUklTRV9DT05GSUdfTE9PUEJBQ0tfRElTQUJMRV9NQVNLKSA+PiBFTlRFUlBSSVNFX0NPTkZJR19MT09QQkFDS19ESVNBQkxFX0xTQikKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfTE9PUEJBQ0tfRElTQUJMRV9TRVQoeCkgKCgoeCkgPDwgRU5URVJQUklTRV9DT05GSUdfTE9PUEJBQ0tfRElTQUJMRV9MU0IpICYgRU5URVJQUklTRV9DT05GSUdfTE9PUEJBQ0tfRElTQUJMRV9NQVNLKQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19MT0NBVElPTl9ESVNBQkxFX01TQiAgIDAKKyNkZWZpbmUgRU5URVJQUklTRV9DT05GSUdfTE9DQVRJT05fRElTQUJMRV9MU0IgICAwCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0xPQ0FUSU9OX0RJU0FCTEVfTUFTSyAgMHgwMDAwMDAwMQorI2RlZmluZSBFTlRFUlBSSVNFX0NPTkZJR19MT0NBVElPTl9ESVNBQkxFX0dFVCh4KSAoKCh4KSAmIEVOVEVSUFJJU0VfQ09ORklHX0xPQ0FUSU9OX0RJU0FCTEVfTUFTSykgPj4gRU5URVJQUklTRV9DT05GSUdfTE9DQVRJT05fRElTQUJMRV9MU0IpCisjZGVmaW5lIEVOVEVSUFJJU0VfQ09ORklHX0xPQ0FUSU9OX0RJU0FCTEVfU0VUKHgpICgoKHgpIDw8IEVOVEVSUFJJU0VfQ09ORklHX0xPQ0FUSU9OX0RJU0FCTEVfTFNCKSAmIEVOVEVSUFJJU0VfQ09ORklHX0xPQ0FUSU9OX0RJU0FCTEVfTUFTSykKKworI2RlZmluZSBSVENfREVCVUdfQlVTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMmMKKyNkZWZpbmUgUlRDX0RFQlVHX0JVU19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzJjCisjZGVmaW5lIFJUQ19ERUJVR19CVVNfU0VMX01TQiAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSVENfREVCVUdfQlVTX1NFTF9MU0IgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUlRDX0RFQlVHX0JVU19TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFJUQ19ERUJVR19CVVNfU0VMX0dFVCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiBSVENfREVCVUdfQlVTX1NFTF9NQVNLKSA+PiBSVENfREVCVUdfQlVTX1NFTF9MU0IpCisjZGVmaW5lIFJUQ19ERUJVR19CVVNfU0VMX1NFVCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgPDwgUlRDX0RFQlVHX0JVU19TRUxfTFNCKSAmIFJUQ19ERUJVR19CVVNfU0VMX01BU0spCisKKyNkZWZpbmUgUlRDX0VYVF9DTEtfQlVGX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAwMDAwMzMwCisjZGVmaW5lIFJUQ19FWFRfQ0xLX0JVRl9PRkZTRVQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzMAorI2RlZmluZSBSVENfRVhUX0NMS19CVUZfRU5fTVNCICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUlRDX0VYVF9DTEtfQlVGX0VOX0xTQiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJUQ19FWFRfQ0xLX0JVRl9FTl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBSVENfRVhUX0NMS19CVUZfRU5fR0VUKHgpICAgICAgICAgICAgICAgICgoKHgpICYgUlRDX0VYVF9DTEtfQlVGX0VOX01BU0spID4+IFJUQ19FWFRfQ0xLX0JVRl9FTl9MU0IpCisjZGVmaW5lIFJUQ19FWFRfQ0xLX0JVRl9FTl9TRVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPDwgUlRDX0VYVF9DTEtfQlVGX0VOX0xTQikgJiBSVENfRVhUX0NMS19CVUZfRU5fTUFTSykKKworI2RlZmluZSBXTEFOX0FIQl9CUklER0VfVElNRU9VVF9BRERSRVNTICAgICAgICAgIDB4MDAwMDAzMzQKKyNkZWZpbmUgV0xBTl9BSEJfQlJJREdFX1RJTUVPVVRfT0ZGU0VUICAgICAgICAgICAweDAwMDAwMzM0CisjZGVmaW5lIFdMQU5fQUhCX0JSSURHRV9USU1FT1VUX0NPTkZJR19NU0IgICAgICAgMTMKKyNkZWZpbmUgV0xBTl9BSEJfQlJJREdFX1RJTUVPVVRfQ09ORklHX0xTQiAgICAgICAwCisjZGVmaW5lIFdMQU5fQUhCX0JSSURHRV9USU1FT1VUX0NPTkZJR19NQVNLICAgICAgMHgwMDAwM2ZmZgorI2RlZmluZSBXTEFOX0FIQl9CUklER0VfVElNRU9VVF9DT05GSUdfR0VUKHgpICAgICgoKHgpICYgV0xBTl9BSEJfQlJJREdFX1RJTUVPVVRfQ09ORklHX01BU0spID4+IFdMQU5fQUhCX0JSSURHRV9USU1FT1VUX0NPTkZJR19MU0IpCisjZGVmaW5lIFdMQU5fQUhCX0JSSURHRV9USU1FT1VUX0NPTkZJR19TRVQoeCkgICAgKCgoeCkgPDwgV0xBTl9BSEJfQlJJREdFX1RJTUVPVVRfQ09ORklHX0xTQikgJiBXTEFOX0FIQl9CUklER0VfVElNRU9VVF9DT05GSUdfTUFTSykKKworI2RlZmluZSBXTEFOX0FIQl9DT05GSUdfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMzgKKyNkZWZpbmUgV0xBTl9BSEJfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMzM4CisjZGVmaW5lIFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfMTZfTVNCICAgICAgICAgMgorI2RlZmluZSBXTEFOX0FIQl9DT05GSUdfTUFYX0JVUlNUXzE2X0xTQiAgICAgICAgIDIKKyNkZWZpbmUgV0xBTl9BSEJfQ09ORklHX01BWF9CVVJTVF8xNl9NQVNLICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfMTZfR0VUKHgpICAgICAgKCgoeCkgJiBXTEFOX0FIQl9DT05GSUdfTUFYX0JVUlNUXzE2X01BU0spID4+IFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfMTZfTFNCKQorI2RlZmluZSBXTEFOX0FIQl9DT05GSUdfTUFYX0JVUlNUXzE2X1NFVCh4KSAgICAgICgoKHgpIDw8IFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfMTZfTFNCKSAmIFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfMTZfTUFTSykKKyNkZWZpbmUgV0xBTl9BSEJfQ09ORklHX01BWF9CVVJTVF84X01TQiAgICAgICAgICAxCisjZGVmaW5lIFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfOF9MU0IgICAgICAgICAgMQorI2RlZmluZSBXTEFOX0FIQl9DT05GSUdfTUFYX0JVUlNUXzhfTUFTSyAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgV0xBTl9BSEJfQ09ORklHX01BWF9CVVJTVF84X0dFVCh4KSAgICAgICAoKCh4KSAmIFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfOF9NQVNLKSA+PiBXTEFOX0FIQl9DT05GSUdfTUFYX0JVUlNUXzhfTFNCKQorI2RlZmluZSBXTEFOX0FIQl9DT05GSUdfTUFYX0JVUlNUXzhfU0VUKHgpICAgICAgICgoKHgpIDw8IFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfOF9MU0IpICYgV0xBTl9BSEJfQ09ORklHX01BWF9CVVJTVF84X01BU0spCisjZGVmaW5lIFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfNF9NU0IgICAgICAgICAgMAorI2RlZmluZSBXTEFOX0FIQl9DT05GSUdfTUFYX0JVUlNUXzRfTFNCICAgICAgICAgIDAKKyNkZWZpbmUgV0xBTl9BSEJfQ09ORklHX01BWF9CVVJTVF80X01BU0sgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfNF9HRVQoeCkgICAgICAgKCgoeCkgJiBXTEFOX0FIQl9DT05GSUdfTUFYX0JVUlNUXzRfTUFTSykgPj4gV0xBTl9BSEJfQ09ORklHX01BWF9CVVJTVF80X0xTQikKKyNkZWZpbmUgV0xBTl9BSEJfQ09ORklHX01BWF9CVVJTVF80X1NFVCh4KSAgICAgICAoKCh4KSA8PCBXTEFOX0FIQl9DT05GSUdfTUFYX0JVUlNUXzRfTFNCKSAmIFdMQU5fQUhCX0NPTkZJR19NQVhfQlVSU1RfNF9NQVNLKQorCisjZGVmaW5lIFJUQ19BWElfQUhCX0JSSURHRV9BRERSRVNTICAgICAgICAgICAgICAgMHgwMDAwMDMzYworI2RlZmluZSBSVENfQVhJX0FIQl9CUklER0VfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAzM2MKKyNkZWZpbmUgUlRDX0FYSV9BSEJfQlJJREdFX0JVUlNUX1dSX0FMSUdOX0VOX01TQiAzCisjZGVmaW5lIFJUQ19BWElfQUhCX0JSSURHRV9CVVJTVF9XUl9BTElHTl9FTl9MU0IgMworI2RlZmluZSBSVENfQVhJX0FIQl9CUklER0VfQlVSU1RfV1JfQUxJR05fRU5fTUFTSyAweDAwMDAwMDA4CisjZGVmaW5lIFJUQ19BWElfQUhCX0JSSURHRV9CVVJTVF9XUl9BTElHTl9FTl9HRVQoeCkgKCgoeCkgJiBSVENfQVhJX0FIQl9CUklER0VfQlVSU1RfV1JfQUxJR05fRU5fTUFTSykgPj4gUlRDX0FYSV9BSEJfQlJJREdFX0JVUlNUX1dSX0FMSUdOX0VOX0xTQikKKyNkZWZpbmUgUlRDX0FYSV9BSEJfQlJJREdFX0JVUlNUX1dSX0FMSUdOX0VOX1NFVCh4KSAoKCh4KSA8PCBSVENfQVhJX0FIQl9CUklER0VfQlVSU1RfV1JfQUxJR05fRU5fTFNCKSAmIFJUQ19BWElfQUhCX0JSSURHRV9CVVJTVF9XUl9BTElHTl9FTl9NQVNLKQorI2RlZmluZSBSVENfQVhJX0FIQl9CUklER0VfQlVSU1RfUkRfQUxJR05fRU5fTVNCIDIKKyNkZWZpbmUgUlRDX0FYSV9BSEJfQlJJREdFX0JVUlNUX1JEX0FMSUdOX0VOX0xTQiAyCisjZGVmaW5lIFJUQ19BWElfQUhCX0JSSURHRV9CVVJTVF9SRF9BTElHTl9FTl9NQVNLIDB4MDAwMDAwMDQKKyNkZWZpbmUgUlRDX0FYSV9BSEJfQlJJREdFX0JVUlNUX1JEX0FMSUdOX0VOX0dFVCh4KSAoKCh4KSAmIFJUQ19BWElfQUhCX0JSSURHRV9CVVJTVF9SRF9BTElHTl9FTl9NQVNLKSA+PiBSVENfQVhJX0FIQl9CUklER0VfQlVSU1RfUkRfQUxJR05fRU5fTFNCKQorI2RlZmluZSBSVENfQVhJX0FIQl9CUklER0VfQlVSU1RfUkRfQUxJR05fRU5fU0VUKHgpICgoKHgpIDw8IFJUQ19BWElfQUhCX0JSSURHRV9CVVJTVF9SRF9BTElHTl9FTl9MU0IpICYgUlRDX0FYSV9BSEJfQlJJREdFX0JVUlNUX1JEX0FMSUdOX0VOX01BU0spCisjZGVmaW5lIFJUQ19BWElfQUhCX0JSSURHRV9NQVhfQkVBVFNfTVNCICAgICAgICAgMQorI2RlZmluZSBSVENfQVhJX0FIQl9CUklER0VfTUFYX0JFQVRTX0xTQiAgICAgICAgIDAKKyNkZWZpbmUgUlRDX0FYSV9BSEJfQlJJREdFX01BWF9CRUFUU19NQVNLICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIFJUQ19BWElfQUhCX0JSSURHRV9NQVhfQkVBVFNfR0VUKHgpICAgICAgKCgoeCkgJiBSVENfQVhJX0FIQl9CUklER0VfTUFYX0JFQVRTX01BU0spID4+IFJUQ19BWElfQUhCX0JSSURHRV9NQVhfQkVBVFNfTFNCKQorI2RlZmluZSBSVENfQVhJX0FIQl9CUklER0VfTUFYX0JFQVRTX1NFVCh4KSAgICAgICgoKHgpIDw8IFJUQ19BWElfQUhCX0JSSURHRV9NQVhfQkVBVFNfTFNCKSAmIFJUQ19BWElfQUhCX0JSSURHRV9NQVhfQkVBVFNfTUFTSykKKworI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfU1RTX0FERFJFU1MgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX1NUU19PRkZTRVQgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9TVFNfUkVHX01TQiAgICAgICAgICAgMzEKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX1NUU19SRUdfTFNCICAgICAgICAgICAwCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9TVFNfUkVHX01BU0sgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfU1RTX1JFR19HRVQoeCkgICAgICAgICgoKHgpICYgV0xBTjJCVF9DUFVDT01fSU5UX1NUU19SRUdfTUFTSykgPj4gV0xBTjJCVF9DUFVDT01fSU5UX1NUU19SRUdfTFNCKQorI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfU1RTX1JFR19TRVQoeCkgICAgICAgICgoKHgpIDw8IFdMQU4yQlRfQ1BVQ09NX0lOVF9TVFNfUkVHX0xTQikgJiBXTEFOMkJUX0NQVUNPTV9JTlRfU1RTX1JFR19NQVNLKQorCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9NQVNLX05fQUREUkVTUyAgICAgICAgMHgwMDAwMDQwNAorI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfTUFTS19OX09GRlNFVCAgICAgICAgIDB4MDAwMDA0MDQKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX01BU0tfTl9SRUdfTVNCICAgICAgICAzMQorI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfTUFTS19OX1JFR19MU0IgICAgICAgIDAKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX01BU0tfTl9SRUdfTUFTSyAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9NQVNLX05fUkVHX0dFVCh4KSAgICAgKCgoeCkgJiBXTEFOMkJUX0NQVUNPTV9JTlRfTUFTS19OX1JFR19NQVNLKSA+PiBXTEFOMkJUX0NQVUNPTV9JTlRfTUFTS19OX1JFR19MU0IpCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9NQVNLX05fUkVHX1NFVCh4KSAgICAgKCgoeCkgPDwgV0xBTjJCVF9DUFVDT01fSU5UX01BU0tfTl9SRUdfTFNCKSAmIFdMQU4yQlRfQ1BVQ09NX0lOVF9NQVNLX05fUkVHX01BU0spCisKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX0VPSV9BRERSRVNTICAgICAgICAgICAweDAwMDAwNDA4CisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9FT0lfT0ZGU0VUICAgICAgICAgICAgMHgwMDAwMDQwOAorI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfRU9JX1JFR19NU0IgICAgICAgICAgIDMxCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9FT0lfUkVHX0xTQiAgICAgICAgICAgMAorI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfRU9JX1JFR19NQVNLICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX0VPSV9SRUdfR0VUKHgpICAgICAgICAoKCh4KSAmIFdMQU4yQlRfQ1BVQ09NX0lOVF9FT0lfUkVHX01BU0spID4+IFdMQU4yQlRfQ1BVQ09NX0lOVF9FT0lfUkVHX0xTQikKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX0VPSV9SRUdfU0VUKHgpICAgICAgICAoKCh4KSA8PCBXTEFOMkJUX0NQVUNPTV9JTlRfRU9JX1JFR19MU0IpICYgV0xBTjJCVF9DUFVDT01fSU5UX0VPSV9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfQUNLX1NUU19BRERSRVNTICAgICAgIDB4MDAwMDA0MGMKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19TVFNfT0ZGU0VUICAgICAgICAweDAwMDAwNDBjCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfU1RTX1JFR19NU0IgICAgICAgMzEKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19TVFNfUkVHX0xTQiAgICAgICAwCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfU1RTX1JFR19NQVNLICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfQUNLX1NUU19SRUdfR0VUKHgpICAgICgoKHgpICYgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19TVFNfUkVHX01BU0spID4+IFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfU1RTX1JFR19MU0IpCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfU1RTX1JFR19TRVQoeCkgICAgKCgoeCkgPDwgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19TVFNfUkVHX0xTQikgJiBXTEFOMkJUX0NQVUNPTV9JTlRfQUNLX1NUU19SRUdfTUFTSykKKworI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfQUNLX01BU0tfTl9BRERSRVNTICAgIDB4MDAwMDA0MTAKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19NQVNLX05fT0ZGU0VUICAgICAweDAwMDAwNDEwCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfTUFTS19OX1JFR19NU0IgICAgMzEKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19NQVNLX05fUkVHX0xTQiAgICAwCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfTUFTS19OX1JFR19NQVNLICAgMHhmZmZmZmZmZgorI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfQUNLX01BU0tfTl9SRUdfR0VUKHgpICgoKHgpICYgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19NQVNLX05fUkVHX01BU0spID4+IFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfTUFTS19OX1JFR19MU0IpCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfTUFTS19OX1JFR19TRVQoeCkgKCgoeCkgPDwgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19NQVNLX05fUkVHX0xTQikgJiBXTEFOMkJUX0NQVUNPTV9JTlRfQUNLX01BU0tfTl9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfQ05UMF9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDA0MTQKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0NOVDBfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwNDE0CisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9DTlQwX1JFR19NU0IgICAgICAgICAgICAgMTUKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0NOVDBfUkVHX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9DTlQwX1JFR19NQVNLICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfQ05UMF9SRUdfR0VUKHgpICAgICAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fQ1JEX0NOVDBfUkVHX01BU0spID4+IFdMQU5fQ1BVQ09NX0NSRF9DTlQwX1JFR19MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9DTlQwX1JFR19TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fQ1JEX0NOVDBfUkVHX0xTQikgJiBXTEFOX0NQVUNPTV9DUkRfQ05UMF9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfSU5DMF9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDA0MTgKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0lOQzBfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwNDE4CisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9JTkMwX1JFR19NU0IgICAgICAgICAgICAgMTUKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0lOQzBfUkVHX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9JTkMwX1JFR19NQVNLICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfSU5DMF9SRUdfR0VUKHgpICAgICAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fQ1JEX0lOQzBfUkVHX01BU0spID4+IFdMQU5fQ1BVQ09NX0NSRF9JTkMwX1JFR19MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9JTkMwX1JFR19TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fQ1JEX0lOQzBfUkVHX0xTQikgJiBXTEFOX0NQVUNPTV9DUkRfSU5DMF9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfREVDMF9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDA0MWMKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0RFQzBfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwNDFjCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9ERUMwX1JFR19NU0IgICAgICAgICAgICAgMTUKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0RFQzBfUkVHX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9ERUMwX1JFR19NQVNLICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfREVDMF9SRUdfR0VUKHgpICAgICAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fQ1JEX0RFQzBfUkVHX01BU0spID4+IFdMQU5fQ1BVQ09NX0NSRF9ERUMwX1JFR19MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9ERUMwX1JFR19TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fQ1JEX0RFQzBfUkVHX0xTQikgJiBXTEFOX0NQVUNPTV9DUkRfREVDMF9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfQ05UMV9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDA0MjAKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0NOVDFfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwNDIwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9DTlQxX1JFR19NU0IgICAgICAgICAgICAgMTUKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0NOVDFfUkVHX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9DTlQxX1JFR19NQVNLICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfQ05UMV9SRUdfR0VUKHgpICAgICAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fQ1JEX0NOVDFfUkVHX01BU0spID4+IFdMQU5fQ1BVQ09NX0NSRF9DTlQxX1JFR19MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9DTlQxX1JFR19TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fQ1JEX0NOVDFfUkVHX0xTQikgJiBXTEFOX0NQVUNPTV9DUkRfQ05UMV9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfSU5DMV9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDA0MjQKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0lOQzFfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwNDI0CisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9JTkMxX1JFR19NU0IgICAgICAgICAgICAgMTUKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0lOQzFfUkVHX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9JTkMxX1JFR19NQVNLICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfSU5DMV9SRUdfR0VUKHgpICAgICAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fQ1JEX0lOQzFfUkVHX01BU0spID4+IFdMQU5fQ1BVQ09NX0NSRF9JTkMxX1JFR19MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9JTkMxX1JFR19TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fQ1JEX0lOQzFfUkVHX0xTQikgJiBXTEFOX0NQVUNPTV9DUkRfSU5DMV9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfREVDMV9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDA0MjgKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0RFQzFfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwNDI4CisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9ERUMxX1JFR19NU0IgICAgICAgICAgICAgMTUKKyNkZWZpbmUgV0xBTl9DUFVDT01fQ1JEX0RFQzFfUkVHX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9ERUMxX1JFR19NQVNLICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBXTEFOX0NQVUNPTV9DUkRfREVDMV9SRUdfR0VUKHgpICAgICAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fQ1JEX0RFQzFfUkVHX01BU0spID4+IFdMQU5fQ1BVQ09NX0NSRF9ERUMxX1JFR19MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0NSRF9ERUMxX1JFR19TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fQ1JEX0RFQzFfUkVHX0xTQikgJiBXTEFOX0NQVUNPTV9DUkRfREVDMV9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9TQ1JBVENIMF9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDA0MmMKKyNkZWZpbmUgV0xBTl9DUFVDT01fU0NSQVRDSDBfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwNDJjCisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gwX1JFR19NU0IgICAgICAgICAgICAgMzEKKyNkZWZpbmUgV0xBTl9DUFVDT01fU0NSQVRDSDBfUkVHX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gwX1JFR19NQVNLICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBXTEFOX0NQVUNPTV9TQ1JBVENIMF9SRUdfR0VUKHgpICAgICAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fU0NSQVRDSDBfUkVHX01BU0spID4+IFdMQU5fQ1BVQ09NX1NDUkFUQ0gwX1JFR19MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gwX1JFR19TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fU0NSQVRDSDBfUkVHX0xTQikgJiBXTEFOX0NQVUNPTV9TQ1JBVENIMF9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9TQ1JBVENIMV9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDA0MzAKKyNkZWZpbmUgV0xBTl9DUFVDT01fU0NSQVRDSDFfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwNDMwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gxX1JFR19NU0IgICAgICAgICAgICAgMzEKKyNkZWZpbmUgV0xBTl9DUFVDT01fU0NSQVRDSDFfUkVHX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gxX1JFR19NQVNLICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBXTEFOX0NQVUNPTV9TQ1JBVENIMV9SRUdfR0VUKHgpICAgICAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fU0NSQVRDSDFfUkVHX01BU0spID4+IFdMQU5fQ1BVQ09NX1NDUkFUQ0gxX1JFR19MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gxX1JFR19TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fU0NSQVRDSDFfUkVHX0xTQikgJiBXTEFOX0NQVUNPTV9TQ1JBVENIMV9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9TQ1JBVENIMl9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDA0MzQKKyNkZWZpbmUgV0xBTl9DUFVDT01fU0NSQVRDSDJfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwNDM0CisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gyX1JFR19NU0IgICAgICAgICAgICAgMzEKKyNkZWZpbmUgV0xBTl9DUFVDT01fU0NSQVRDSDJfUkVHX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gyX1JFR19NQVNLICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBXTEFOX0NQVUNPTV9TQ1JBVENIMl9SRUdfR0VUKHgpICAgICAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fU0NSQVRDSDJfUkVHX01BU0spID4+IFdMQU5fQ1BVQ09NX1NDUkFUQ0gyX1JFR19MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gyX1JFR19TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fU0NSQVRDSDJfUkVHX0xTQikgJiBXTEFOX0NQVUNPTV9TQ1JBVENIMl9SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9TQ1JBVENIM19BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDA0MzgKKyNkZWZpbmUgV0xBTl9DUFVDT01fU0NSQVRDSDNfT0ZGU0VUICAgICAgICAgICAgICAweDAwMDAwNDM4CisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gzX1JFR19NU0IgICAgICAgICAgICAgMzEKKyNkZWZpbmUgV0xBTl9DUFVDT01fU0NSQVRDSDNfUkVHX0xTQiAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gzX1JFR19NQVNLICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBXTEFOX0NQVUNPTV9TQ1JBVENIM19SRUdfR0VUKHgpICAgICAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fU0NSQVRDSDNfUkVHX01BU0spID4+IFdMQU5fQ1BVQ09NX1NDUkFUQ0gzX1JFR19MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX1NDUkFUQ0gzX1JFR19TRVQoeCkgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fU0NSQVRDSDNfUkVHX0xTQikgJiBXTEFOX0NQVUNPTV9TQ1JBVENIM19SRUdfTUFTSykKKworI2RlZmluZSBXTEFOX0NQVUNPTV9EQkdfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4MDAwMDA0M2MKKyNkZWZpbmUgV0xBTl9DUFVDT01fREJHX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDAwMDAwNDNjCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0RCR19SRVNFUlZFX01TQiAgICAgICAgICAgICAgNworI2RlZmluZSBXTEFOX0NQVUNPTV9EQkdfUkVTRVJWRV9MU0IgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV0xBTl9DUFVDT01fREJHX1JFU0VSVkVfTUFTSyAgICAgICAgICAgICAweDAwMDAwMGYwCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0RCR19SRVNFUlZFX0dFVCh4KSAgICAgICAgICAgKCgoeCkgJiBXTEFOX0NQVUNPTV9EQkdfUkVTRVJWRV9NQVNLKSA+PiBXTEFOX0NQVUNPTV9EQkdfUkVTRVJWRV9MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0RCR19SRVNFUlZFX1NFVCh4KSAgICAgICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fREJHX1JFU0VSVkVfTFNCKSAmIFdMQU5fQ1BVQ09NX0RCR19SRVNFUlZFX01BU0spCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0RCR19DUkQxX0RFQ19FUlJfTVNCICAgICAgICAgMworI2RlZmluZSBXTEFOX0NQVUNPTV9EQkdfQ1JEMV9ERUNfRVJSX0xTQiAgICAgICAgIDMKKyNkZWZpbmUgV0xBTl9DUFVDT01fREJHX0NSRDFfREVDX0VSUl9NQVNLICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFdMQU5fQ1BVQ09NX0RCR19DUkQxX0RFQ19FUlJfR0VUKHgpICAgICAgKCgoeCkgJiBXTEFOX0NQVUNPTV9EQkdfQ1JEMV9ERUNfRVJSX01BU0spID4+IFdMQU5fQ1BVQ09NX0RCR19DUkQxX0RFQ19FUlJfTFNCKQorI2RlZmluZSBXTEFOX0NQVUNPTV9EQkdfQ1JEMV9ERUNfRVJSX1NFVCh4KSAgICAgICgoKHgpIDw8IFdMQU5fQ1BVQ09NX0RCR19DUkQxX0RFQ19FUlJfTFNCKSAmIFdMQU5fQ1BVQ09NX0RCR19DUkQxX0RFQ19FUlJfTUFTSykKKyNkZWZpbmUgV0xBTl9DUFVDT01fREJHX0NSRDFfSU5DX0VSUl9NU0IgICAgICAgICAyCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0RCR19DUkQxX0lOQ19FUlJfTFNCICAgICAgICAgMgorI2RlZmluZSBXTEFOX0NQVUNPTV9EQkdfQ1JEMV9JTkNfRVJSX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgV0xBTl9DUFVDT01fREJHX0NSRDFfSU5DX0VSUl9HRVQoeCkgICAgICAoKCh4KSAmIFdMQU5fQ1BVQ09NX0RCR19DUkQxX0lOQ19FUlJfTUFTSykgPj4gV0xBTl9DUFVDT01fREJHX0NSRDFfSU5DX0VSUl9MU0IpCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0RCR19DUkQxX0lOQ19FUlJfU0VUKHgpICAgICAgKCgoeCkgPDwgV0xBTl9DUFVDT01fREJHX0NSRDFfSU5DX0VSUl9MU0IpICYgV0xBTl9DUFVDT01fREJHX0NSRDFfSU5DX0VSUl9NQVNLKQorI2RlZmluZSBXTEFOX0NQVUNPTV9EQkdfQ1JEMF9ERUNfRVJSX01TQiAgICAgICAgIDEKKyNkZWZpbmUgV0xBTl9DUFVDT01fREJHX0NSRDBfREVDX0VSUl9MU0IgICAgICAgICAxCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0RCR19DUkQwX0RFQ19FUlJfTUFTSyAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBXTEFOX0NQVUNPTV9EQkdfQ1JEMF9ERUNfRVJSX0dFVCh4KSAgICAgICgoKHgpICYgV0xBTl9DUFVDT01fREJHX0NSRDBfREVDX0VSUl9NQVNLKSA+PiBXTEFOX0NQVUNPTV9EQkdfQ1JEMF9ERUNfRVJSX0xTQikKKyNkZWZpbmUgV0xBTl9DUFVDT01fREJHX0NSRDBfREVDX0VSUl9TRVQoeCkgICAgICAoKCh4KSA8PCBXTEFOX0NQVUNPTV9EQkdfQ1JEMF9ERUNfRVJSX0xTQikgJiBXTEFOX0NQVUNPTV9EQkdfQ1JEMF9ERUNfRVJSX01BU0spCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0RCR19DUkQwX0lOQ19FUlJfTVNCICAgICAgICAgMAorI2RlZmluZSBXTEFOX0NQVUNPTV9EQkdfQ1JEMF9JTkNfRVJSX0xTQiAgICAgICAgIDAKKyNkZWZpbmUgV0xBTl9DUFVDT01fREJHX0NSRDBfSU5DX0VSUl9NQVNLICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFdMQU5fQ1BVQ09NX0RCR19DUkQwX0lOQ19FUlJfR0VUKHgpICAgICAgKCgoeCkgJiBXTEFOX0NQVUNPTV9EQkdfQ1JEMF9JTkNfRVJSX01BU0spID4+IFdMQU5fQ1BVQ09NX0RCR19DUkQwX0lOQ19FUlJfTFNCKQorI2RlZmluZSBXTEFOX0NQVUNPTV9EQkdfQ1JEMF9JTkNfRVJSX1NFVCh4KSAgICAgICgoKHgpIDw8IFdMQU5fQ1BVQ09NX0RCR19DUkQwX0lOQ19FUlJfTFNCKSAmIFdMQU5fQ1BVQ09NX0RCR19DUkQwX0lOQ19FUlJfTUFTSykKKworI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfQUNLX0VOX0FERFJFU1MgICAgICAgIDB4MDAwMDA0NDAKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19FTl9PRkZTRVQgICAgICAgICAweDAwMDAwNDQwCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfRU5fUkVHX01TQiAgICAgICAgMAorI2RlZmluZSBXTEFOMkJUX0NQVUNPTV9JTlRfQUNLX0VOX1JFR19MU0IgICAgICAgIDAKKyNkZWZpbmUgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19FTl9SRUdfTUFTSyAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfRU5fUkVHX0dFVCh4KSAgICAgKCgoeCkgJiBXTEFOMkJUX0NQVUNPTV9JTlRfQUNLX0VOX1JFR19NQVNLKSA+PiBXTEFOMkJUX0NQVUNPTV9JTlRfQUNLX0VOX1JFR19MU0IpCisjZGVmaW5lIFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfRU5fUkVHX1NFVCh4KSAgICAgKCgoeCkgPDwgV0xBTjJCVF9DUFVDT01fSU5UX0FDS19FTl9SRUdfTFNCKSAmIFdMQU4yQlRfQ1BVQ09NX0lOVF9BQ0tfRU5fUkVHX01BU0spCisKKyNkZWZpbmUgQlQyV0xBTl9DUFVDT01fSU5UX0VOX0FERFJFU1MgICAgICAgICAgICAweDAwMDAwNDQ0CisjZGVmaW5lIEJUMldMQU5fQ1BVQ09NX0lOVF9FTl9PRkZTRVQgICAgICAgICAgICAgMHgwMDAwMDQ0NAorI2RlZmluZSBCVDJXTEFOX0NQVUNPTV9JTlRfRU5fUkVHX01TQiAgICAgICAgICAgIDAKKyNkZWZpbmUgQlQyV0xBTl9DUFVDT01fSU5UX0VOX1JFR19MU0IgICAgICAgICAgICAwCisjZGVmaW5lIEJUMldMQU5fQ1BVQ09NX0lOVF9FTl9SRUdfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBCVDJXTEFOX0NQVUNPTV9JTlRfRU5fUkVHX0dFVCh4KSAgICAgICAgICgoKHgpICYgQlQyV0xBTl9DUFVDT01fSU5UX0VOX1JFR19NQVNLKSA+PiBCVDJXTEFOX0NQVUNPTV9JTlRfRU5fUkVHX0xTQikKKyNkZWZpbmUgQlQyV0xBTl9DUFVDT01fSU5UX0VOX1JFR19TRVQoeCkgICAgICAgICAoKCh4KSA8PCBCVDJXTEFOX0NQVUNPTV9JTlRfRU5fUkVHX0xTQikgJiBCVDJXTEFOX0NQVUNPTV9JTlRfRU5fUkVHX01BU0spCisKKyNpZm5kZWYgX19BU1NFTUJMRVJfXwordHlwZWRlZiBzdHJ1Y3QgcnRjX3NvY19yZWdfcmVnX3MgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2NfcmVzZXRfY29udHJvbDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX3RjeG9fZGV0ZWN0OworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2NfeHRhbF90ZXN0OworCXVuc2lnbmVkIGNoYXIgcGFkMFsyMF07IC8qIHBhZCB0byAweDIwICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19jcHVfY2xvY2s7CisJdW5zaWduZWQgY2hhciBwYWQxWzRdOyAgLyogcGFkIHRvIDB4MjggKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2Nsb2NrX2NvbnRyb2w7CisJdW5zaWduZWQgY2hhciBwYWQyWzRdOyAgLyogcGFkIHRvIDB4MzAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX3dkdF9jb250cm9sOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2Nfd2R0X3N0YXR1czsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX3dkdDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX3dkdF9jb3VudDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX3dkdF9yZXNldDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2ludF9zdGF0dXM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcjA7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcl9jb3VudDA7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcl9jb250cm9sMDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2xmX3RpbWVyX3N0YXR1czA7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcjE7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcl9jb3VudDE7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcl9jb250cm9sMTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2xmX3RpbWVyX3N0YXR1czE7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcjI7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcl9jb3VudDI7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcl9jb250cm9sMjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2xmX3RpbWVyX3N0YXR1czI7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcjM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcl9jb3VudDM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19sZl90aW1lcl9jb250cm9sMzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2xmX3RpbWVyX3N0YXR1czM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19oZl90aW1lcjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2hmX3RpbWVyX2NvdW50OworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2NfaGZfbGZfY291bnQ7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19oZl90aW1lcl9jb250cm9sOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2NfaGZfdGltZXJfc3RhdHVzOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2NfcnRjX2NvbnRyb2w7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19ydGNfdGltZTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX3J0Y19kYXRlOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2NfcnRjX3NldF90aW1lOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2NfcnRjX3NldF9kYXRlOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2NfcnRjX3NldF9hbGFybTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX3J0Y19jb25maWc7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19ydGNfYWxhcm1fc3RhdHVzOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2NfdWFydF93YWtldXA7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19yZXNldF9jYXVzZTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX3N5c3RlbV9zbGVlcDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX3NkaW9fd3JhcHBlcjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2ludF9zbGVlcF9tYXNrOworCXVuc2lnbmVkIGNoYXIgcGFkM1s0XTsgIC8qIHBhZCB0byAweGQ0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19scG9fY2FsX3RpbWU7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19scG9faW5pdF9kaXZpZGVuZF9pbnQ7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19scG9faW5pdF9kaXZpZGVuZF9mcmFjdGlvbjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2xwb19jYWw7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19scG9fY2FsX3Rlc3RfY29udHJvbDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2xwb19jYWxfdGVzdF9zdGF0dXM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxlZ2FjeV9zb2NfY2hpcF9pZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc29jX2NoaXBfaWQ7CisJdW5zaWduZWQgY2hhciBwYWQ0WzI0XTsgLyogcGFkIHRvIDB4MTBjICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19wb3dlcl9yZWc7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNvY19jb3JlX2Nsa19jdHJsOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb2NfZ3Bpb193YWtldXBfY29udHJvbDsKKwl1bnNpZ25lZCBjaGFyIHBhZDVbMjUyXTsgICAgICAgIC8qIHBhZCB0byAweDIxNCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzbGVlcF9yZXRlbnRpb247CisJdW5zaWduZWQgY2hhciBwYWQ2WzEwOF07ICAgICAgICAvKiBwYWQgdG8gMHgyODQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbHBfcGVyZl9jb3VudGVyOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBscF9wZXJmX2xpZ2h0X3NsZWVwOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBscF9wZXJmX2RlZXBfc2xlZXA7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxwX3BlcmZfb247CisJdW5zaWduZWQgY2hhciBwYWQ3WzIwXTsgLyogcGFkIHRvIDB4MmE4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGNoaXBfbW9kZTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY2xrX3JlcV9mYWxsX2VkZ2U7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IG90cDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgb3RwX3N0YXR1czsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcG11OworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBwbXVfY29uZmlnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBwbXVfcGFyZWc7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHBtdV9ieXBhc3M7CisJdW5zaWduZWQgY2hhciBwYWQ4WzIwXTsgLyogcGFkIHRvIDB4MmRjICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHRoZXJtX2N0cmwxOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB0aGVybV9jdHJsMjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdGhlcm1fY3RybDM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxpc3Rlbl9tb2RlMTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbGlzdGVuX21vZGUyOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBhdWRpb19wbGxfY29uZmlnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBhdWRpb19wbGxfbW9kdWxhdGlvbjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgYXVkaW9fcGxsX21vZF9zdGVwOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjdXJyZW50X2F1ZGlvX3BsbF9tb2R1bGF0aW9uOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBldGhfcGxsX2NvbmZpZzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY3B1X3BsbF9jb25maWc7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGJiX3BsbF9jb25maWc7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGV0aF94bWlpOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB1c2JfcGh5X2NvbmZpZzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdXNiY29yZV9jbGs2MG07CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHVzYnBoeV91dG1pX2NsazsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdXNiX3R4dmFsaWRfZGx5X2NvbmZpZzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2Vjb25kX2hvc3RfaW5mdDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2Rpb19ob3N0OworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBlbnRlcnByaXNlX2NvbmZpZzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcnRjX2RlYnVnX2J1czsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcnRjX2V4dF9jbGtfYnVmOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB3bGFuX2FoYl9icmlkZ2VfdGltZW91dDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgd2xhbl9haGJfY29uZmlnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBydGNfYXhpX2FoYl9icmlkZ2U7CisJdW5zaWduZWQgY2hhciBwYWQ5WzE5Ml07ICAgICAgICAvKiBwYWQgdG8gMHg0MDAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgd2xhbjJidF9jcHVjb21faW50X3N0czsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgd2xhbjJidF9jcHVjb21faW50X21hc2tfbjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgd2xhbjJidF9jcHVjb21faW50X2VvaTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgd2xhbjJidF9jcHVjb21faW50X2Fja19zdHM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHdsYW4yYnRfY3B1Y29tX2ludF9hY2tfbWFza19uOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB3bGFuX2NwdWNvbV9jcmRfY250MDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgd2xhbl9jcHVjb21fY3JkX2luYzBbMV07CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHdsYW5fY3B1Y29tX2NyZF9kZWMwWzFdOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB3bGFuX2NwdWNvbV9jcmRfY250MTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgd2xhbl9jcHVjb21fY3JkX2luYzFbMV07CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHdsYW5fY3B1Y29tX2NyZF9kZWMxWzFdOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB3bGFuX2NwdWNvbV9zY3JhdGNoMDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgd2xhbl9jcHVjb21fc2NyYXRjaDE7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHdsYW5fY3B1Y29tX3NjcmF0Y2gyOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB3bGFuX2NwdWNvbV9zY3JhdGNoMzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgd2xhbl9jcHVjb21fZGJnOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB3bGFuMmJ0X2NwdWNvbV9pbnRfYWNrX2VuOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBidDJ3bGFuX2NwdWNvbV9pbnRfZW47Cit9IHJ0Y19zb2NfcmVnX3JlZ190OworI2VuZGlmIC8qIF9fQVNTRU1CTEVSX18gKi8KKworI2VuZGlmIC8qIF9SVENfU09DX1JFR19IXyAqLwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy90YXJnYWRkcnMuaCBiL3RhcmdldC9pbmMvdGFyZ2FkZHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmNjRkMwotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9pbmMvdGFyZ2FkZHJzLmgKQEAgLTAsMCArMSw2NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19UQVJHQUREUlNfSF9fCisjZGVmaW5lIF9fVEFSR0FERFJTX0hfXworCisjaWYgZGVmaW5lZChBVEhfVEFSR0VUKQorI2luY2x1ZGUgInNvY19hZGRycy5oIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChBVEhfVEFSR0VUKQorI2luY2x1ZGUgImF0aHN0YXJ0cGFjay5oIgorI2VuZGlmCisKKy8qCisgKiBTT0Mgb3B0aW9uIGJpdHMsIHRvIGVuYWJsZS9kaXNhYmxlIHZhcmlvdXMgZmVhdHVyZXMuCisgKiBCeSBkZWZhdWx0LCBhbGwgb3B0aW9uIGJpdHMgYXJlIDAuCisgKiBBUjYwMDQ6IFRoZXNlIGJpdHMgY2FuIGJlIHNldCBpbiBMT0NBTF9TQ1JBVENIIHJlZ2lzdGVyIDAuCisgKiBBUjk4ODg6IFRoZXNlIGJpdHMgY2FuIGJlIHNldCBpbiBzb2NfY29yZSByZWdpc3RlciBTQ1JBVENIXzAuCisgKi8KKyNkZWZpbmUgU09DX09QVElPTl9CTUlfRElTQUJMRSAgICAgIDB4MDEgICAgICAgIC8qIERpc2FibGUgQk1JIGNvbW0gd2l0aCBIb3N0ICovCisjZGVmaW5lIFNPQ19PUFRJT05fU0VSSUFMX0VOQUJMRSAgICAweDAyICAgICAgICAvKiBFbmFibGUgc2VyaWFsIHBvcnQgbXNncyAqLworI2RlZmluZSBTT0NfT1BUSU9OX1dEVF9ESVNBQkxFICAgICAgMHgwNCAgICAgICAgLyogV2F0Y2hEb2cgVGltZXIgb3ZlcnJpZGUgKi8KKyNkZWZpbmUgU09DX09QVElPTl9TTEVFUF9ESVNBQkxFICAgIDB4MDggICAgICAgIC8qIERpc2FibGUgc3lzdGVtIHNsZWVwICovCisjZGVmaW5lIFNPQ19PUFRJT05fU1RPUF9CT09UICAgICAgICAweDEwICAgICAgICAvKiBTdG9wIGJvb3QgcHJvY2Vzc2VzIChmb3IgQVRFKSAqLworI2RlZmluZSBTT0NfT1BUSU9OX0VOQUJMRV9OT0FOSSAgICAgMHgyMCAgICAgICAgLyogT3BlcmF0ZSB3aXRob3V0IEFOSSAqLworI2RlZmluZSBTT0NfT1BUSU9OX0RTRVRfRElTQUJMRSAgICAgMHg0MCAgICAgICAgLyogSWdub3JlIERhdGFTZXRzICovCisjZGVmaW5lIFNPQ19PUFRJT05fSUdOT1JFX0ZMQVNIICAgICAweDgwICAgICAgICAvKiBJZ25vcmUgZmxhc2ggZHVyaW5nIGJvb3R1cCAqLworCisvKgorICogeHh4X0hPU1RfSU5URVJFU1RfQUREUkVTUyBpcyB0aGUgYWRkcmVzcyBpbiBUYXJnZXQgUkFNIG9mIHRoZQorICogaG9zdF9pbnRlcmVzdCBzdHJ1Y3R1cmUuICBJdCBtdXN0IG1hdGNoIHRoZSBhZGRyZXNzIG9mIHRoZSBfaG9zdF9pbnRlcmVzdAorICogc3ltYm9sIChzZWUgbGlua2VyIHNjcmlwdCkuCisgKgorICogSG9zdCBJbnRlcmVzdCBpcyBzaGFyZWQgYmV0d2VlbiBIb3N0IGFuZCBUYXJnZXQgaW4gb3JkZXIgdG8gY29vcmRpbmF0ZQorICogYmV0d2VlbiB0aGUgdHdvLCBhbmQgaXMgaW50ZW5kZWQgdG8gcmVtYWluIGNvbnN0YW50ICh3aXRoIGFkZGl0aW9ucyBvbmx5CisgKiBhdCB0aGUgZW5kKSBhY3Jvc3Mgc29mdHdhcmUgcmVsZWFzZXMuCisgKgorICogQWxsIGFkZHJlc3NlcyBhcmUgYXZhaWxhYmxlIGhlcmUgc28gdGhhdCBpdCdzIHBvc3NpYmxlIHRvCisgKiB3cml0ZSBhIHNpbmdsZSBiaW5hcnkgdGhhdCB3b3JrcyB3aXRoIGFsbCBUYXJnZXQgVHlwZXMuCisgKiBNYXkgYmUgdXNlZCBpbiBhc3NlbWJsZXIgY29kZSBhcyB3ZWxsIGFzIEMuCisgKi8KKyNkZWZpbmUgQVI2MDAyX0hPU1RfSU5URVJFU1RfQUREUkVTUyAgICAweDAwNTAwNDAwCisjZGVmaW5lIEFSNjAwM19IT1NUX0lOVEVSRVNUX0FERFJFU1MgICAgMHgwMDU0MDYwMAorI2RlZmluZSBBUjYwMDRfSE9TVF9JTlRFUkVTVF9BRERSRVNTICAgIDB4MDA0MDA4MDAKKyNkZWZpbmUgQVI5ODg4X0hPU1RfSU5URVJFU1RfQUREUkVTUyAgICAweDAwNDAwODAwCisjZGVmaW5lIEFSOTAwQl9IT1NUX0lOVEVSRVNUX0FERFJFU1MgICAgMHgwMDQwMDgwMAorI2RlZmluZSBBUjYzMjBfSE9TVF9JTlRFUkVTVF9BRERSRVNTICAgIDB4MDA0MDA4MDAKKyNkZWZpbmUgUUNBNjE4MF9IT1NUX0lOVEVSRVNUX0FERFJFU1MgICAweDAwNWQ5NmEwCisjZGVmaW5lIEFSNjAwNF9TT0NfUkVTRVRfQUREUkVTUyAgICAgICAgMFgwMDAwNDAwMAorI2RlZmluZSBBUjYwMDRfU09DX1JFU0VUX0NQVV9JTklUX1JFU0VUX01BU0sgICAgICAgIDBYMDAwMDA4MDAKKyNpZiBkZWZpbmVkKEFSNjAwNl9NRU1PUllfTkVXX0FSQ0gpCisjZGVmaW5lIEFSNjAwNl9IT1NUX0lOVEVSRVNUX0FERFJFU1MgICAgICAgICAgICAgICAgMHgwMDQyODgwMAorI2Vsc2UKKyNkZWZpbmUgQVI2MDA2X0hPU1RfSU5URVJFU1RfQUREUkVTUyAgICAgICAgICAgICAgICAweDAwNDAwODAwCisjZW5kaWYKKyNkZWZpbmUgQVI2MDA2X1NPQ19SRVNFVF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAwWDAwMDA0MDAwCisjZGVmaW5lIEFSNjAwNl9TT0NfUkVTRVRfQ1BVX0lOSVRfUkVTRVRfTUFTSyAgICAgICAgMFgwMDAwMDgwMAorCisjZGVmaW5lIEhPU1RfSU5URVJFU1RfTUFYX1NJWkUgICAgICAgICAgMHgyMDAKKworI2lmICFkZWZpbmVkKF9fQVNTRU1CTEVSX18pCitzdHJ1Y3QgcmVnaXN0ZXJfZHVtcF9zOworc3RydWN0IGRiZ2xvZ19oZHJfczsKKworLyoKKyAqIFRoZXNlIGFyZSBpdGVtcyB0aGF0IHRoZSBIb3N0IG1heSBuZWVkIHRvIGFjY2VzcworICogdmlhIEJNSSBvciB2aWEgdGhlIERpYWdub3N0aWMgV2luZG93LiBUaGUgcG9zaXRpb24KKyAqIG9mIGl0ZW1zIGluIHRoaXMgc3RydWN0dXJlIG11c3QgcmVtYWluIGNvbnN0YW50CisgKiBhY3Jvc3MgZmlybXdhcmUgcmV2aXNpb25zIQorICoKKyAqIFR5cGVzIGZvciBlYWNoIGl0ZW0gbXVzdCBiZSBmaXhlZCBzaXplIGFjcm9zcworICogdGFyZ2V0IGFuZCBob3N0IHBsYXRmb3Jtcy4KKyAqCisgKiBNb3JlIGl0ZW1zIG1heSBiZSBhZGRlZCBhdCB0aGUgZW5kLgorICovCitQUkVQQUNLNjQgc3RydWN0IGhvc3RfaW50ZXJlc3RfcyB7CisJLyoKKwkgKiBQb2ludGVyIHRvIGFwcGxpY2F0aW9uLWRlZmluZWQgYXJlYSwgaWYgYW55LgorCSAqIFNldCBieSBUYXJnZXQgYXBwbGljYXRpb24gZHVyaW5nIHN0YXJ0dXAuCisJICovCisJQV9VSU5UMzIgaGlfYXBwX2hvc3RfaW50ZXJlc3Q7ICAvKiAweDAwICovCisKKwkvKiBQb2ludGVyIHRvIHJlZ2lzdGVyIGR1bXAgYXJlYSwgdmFsaWQgYWZ0ZXIgVGFyZ2V0IGNyYXNoLiAqLworCUFfVUlOVDMyIGhpX2ZhaWx1cmVfc3RhdGU7ICAgICAgLyogMHgwNCAqLworCisJLyogUG9pbnRlciB0byBkZWJ1ZyBsb2dnaW5nIGhlYWRlciAqLworCUFfVUlOVDMyIGhpX2RiZ2xvZ19oZHI7IC8qIDB4MDggKi8KKworCS8qIFNhdmUgU1cgUk9NIHZlcnNpb24gKi8KKwlBX1VJTlQzMiBoaV9zd19yb21fdmVyc2lvbjsgICAgIC8qIDB4MGMgKi8KKworCS8qCisJICogR2VuZXJhbC1wdXJwb3NlIGZsYWcgYml0cywgc2ltaWxhciB0byBTT0NfT1BUSU9OXyogZmxhZ3MuCisJICogQ2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb24gcmF0aGVyIHRoYW4gYnkgT1MuCisJICovCisJQV9VSU5UMzIgaGlfb3B0aW9uX2ZsYWc7ICAgICAgICAvKiAweDEwICovCisKKwkvKgorCSAqIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvCisJICogZGlzcGxheSBtZXNzYWdlcyBvbiB0aGUgc2VyaWFsIHBvcnQuCisJICovCisJQV9VSU5UMzIgaGlfc2VyaWFsX2VuYWJsZTsgICAgICAvKiAweDE0ICovCisKKwkvKiBTdGFydCBhZGRyZXNzIG9mIERhdGFTZXQgaW5kZXgsIGlmIGFueSAqLworCUFfVUlOVDMyIGhpX2RzZXRfbGlzdF9oZWFkOyAgICAgLyogMHgxOCAqLworCisJLyogT3ZlcnJpZGUgVGFyZ2V0IGFwcGxpY2F0aW9uIHN0YXJ0IGFkZHJlc3MgKi8KKwlBX1VJTlQzMiBoaV9hcHBfc3RhcnQ7ICAvKiAweDFjICovCisKKwkvKiBDbG9jayBhbmQgdm9sdGFnZSB0dW5pbmcgKi8KKwlBX1VJTlQzMiBoaV9za2lwX2Nsb2NrX2luaXQ7ICAgIC8qIDB4MjAgKi8KKwlBX1VJTlQzMiBoaV9jb3JlX2Nsb2NrX3NldHRpbmc7IC8qIDB4MjQgKi8KKwlBX1VJTlQzMiBoaV9jcHVfY2xvY2tfc2V0dGluZzsgIC8qIDB4MjggKi8KKwlBX1VJTlQzMiBoaV9zeXN0ZW1fc2xlZXBfc2V0dGluZzsgICAgICAgLyogMHgyYyAqLworCUFfVUlOVDMyIGhpX3h0YWxfY29udHJvbF9zZXR0aW5nOyAgICAgICAvKiAweDMwICovCisJQV9VSU5UMzIgaGlfcGxsX2N0cmxfc2V0dGluZ18yNGdoejsgICAgIC8qIDB4MzQgKi8KKwlBX1VJTlQzMiBoaV9wbGxfY3RybF9zZXR0aW5nXzVnaHo7ICAgICAgLyogMHgzOCAqLworCUFfVUlOVDMyIGhpX3JlZl92b2x0YWdlX3RyaW1fc2V0dGluZzsgICAvKiAweDNjICovCisJQV9VSU5UMzIgaGlfY2xvY2tfaW5mbzsgLyogMHg0MCAqLworCisJLyogSG9zdCB1c2VzIEJFIENQVSBvciBub3QgKi8KKwlBX1VJTlQzMiBoaV9iZTsgICAgICAgICAvKiAweDQ0ICovCisKKwlBX1VJTlQzMiBoaV9zdGFjazsgICAgICAvKiBub3JtYWwgc3RhY2sgKi8vKiAweDQ4ICovCisJQV9VSU5UMzIgaGlfZXJyX3N0YWNrOyAgLyogZXJyb3Igc3RhY2sgKi8vKiAweDRjICovCisJQV9VSU5UMzIgaGlfZGVzaXJlZF9jcHVfc3BlZWRfaHo7ICAgICAgIC8qIDB4NTAgKi8KKworCS8qIFBvaW50ZXIgdG8gQm9hcmQgRGF0YSAgKi8KKwlBX1VJTlQzMiBoaV9ib2FyZF9kYXRhOyAvKiAweDU0ICovCisKKwkvKgorCSAqIEluZGljYXRpb24gb2YgQm9hcmQgRGF0YSBzdGF0ZToKKwkgKiAgICAwOiBib2FyZCBkYXRhIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQuCisJICogICAgMTogYm9hcmQgZGF0YSBpcyBpbml0aWFsaXplZDsgdW5rbm93biBzaXplCisJICogICA+MTogbnVtYmVyIG9mIGJ5dGVzIG9mIGluaXRpYWxpemVkIGJvYXJkIGRhdGEgKHZhcmllcyB3aXRoIGJvYXJkIHR5cGUpCisJICovCisJQV9VSU5UMzIgaGlfYm9hcmRfZGF0YV9pbml0aWFsaXplZDsgICAgIC8qIDB4NTggKi8KKworCUFfVUlOVDMyIGhpX2RzZXRfUkFNX2luZGV4X3RhYmxlOyAgICAgICAvKiAweDVjICovCisKKwlBX1VJTlQzMiBoaV9kZXNpcmVkX2JhdWRfcmF0ZTsgIC8qIDB4NjAgKi8KKwlBX1VJTlQzMiBoaV9kYmdsb2dfY29uZmlnOyAgICAgIC8qIDB4NjQgKi8KKwlBX1VJTlQzMiBoaV9lbmRfUkFNX3Jlc2VydmVfc3o7IC8qIDB4NjggKi8KKwlBX1VJTlQzMiBoaV9tYm94X2lvX2Jsb2NrX3N6OyAgIC8qIDB4NmMgKi8KKworCUFfVUlOVDMyIGhpX251bV9icGF0Y2hfc3RyZWFtczsgLyogMHg3MCAtLSB1bnVzZWQgKi8KKwlBX1VJTlQzMiBoaV9tYm94X2lzcl95aWVsZF9saW1pdDsgICAgICAgLyogMHg3NCAqLworCisJQV9VSU5UMzIgaGlfcmVmY2xrX2h6OyAgLyogMHg3OCAqLworCUFfVUlOVDMyIGhpX2V4dF9jbGtfZGV0ZWN0ZWQ7ICAgLyogMHg3YyAqLworCUFfVUlOVDMyIGhpX2RiZ191YXJ0X3R4cGluOyAgICAgLyogMHg4MCAqLworCUFfVUlOVDMyIGhpX2RiZ191YXJ0X3J4cGluOyAgICAgLyogMHg4NCAqLworCUFfVUlOVDMyIGhpX2hjaV91YXJ0X2JhdWQ7ICAgICAgLyogMHg4OCAqLworCUFfVUlOVDMyIGhpX2hjaV91YXJ0X3Bpbl9hc3NpZ25tZW50czsgICAvKiAweDhDICovCisJLyogTk9URTogYnl0ZSBbMF0gPSB0eCBwaW4sIFsxXSA9IHJ4IHBpbiwgWzJdID0gcnRzIHBpbiwgWzNdID0gY3RzIHBpbiAqLworCUFfVUlOVDMyIGhpX2hjaV91YXJ0X2JhdWRfc2NhbGVfdmFsOyAgICAvKiAweDkwICovCisJQV9VSU5UMzIgaGlfaGNpX3VhcnRfYmF1ZF9zdGVwX3ZhbDsgICAgIC8qIDB4OTQgKi8KKworCUFfVUlOVDMyIGhpX2FsbG9jcmFtX3N0YXJ0OyAgICAgLyogMHg5OCAqLworCUFfVUlOVDMyIGhpX2FsbG9jcmFtX3N6OyAgICAgICAgLyogMHg5YyAqLworCUFfVUlOVDMyIGhpX2hjaV9icmlkZ2VfZmxhZ3M7ICAgLyogMHhhMCAqLworCUFfVUlOVDMyIGhpX2hjaV91YXJ0X3N1cHBvcnRfcGluczsgICAgICAvKiAweGE0ICovCisJLyogTk9URTogYnl0ZSBbMF0gPSBSRVNFVCBwaW4gKGJpdCA3IGlzIHBvbGFyaXR5KSwgYnl0ZXNbMV0uLmJ5dGVzWzNdIGFyZSBmb3IgZnV0dXJlIHVzZSAqLworCUFfVUlOVDMyIGhpX2hjaV91YXJ0X3B3cl9tZ210X3BhcmFtczsgICAvKiAweGE4ICovCisJLyogMHhhOCAtIFsxXTogMCA9IFVBUlQgRkMgYWN0aXZlIGxvdywgMSA9IFVBUlQgRkMgYWN0aXZlIGhpZ2gKKwkgKiAgICAgICAgWzMxOjE2XTogd2FrZXVwIHRpbWVvdXQgaW4gbXMKKwkgKi8KKwkvKiBQb2ludGVyIHRvIGV4dGVuZGVkIGJvYXJkIERhdGEgICovCisJQV9VSU5UMzIgaGlfYm9hcmRfZXh0X2RhdGE7ICAgICAvKiAweGFjICovCisJQV9VSU5UMzIgaGlfYm9hcmRfZXh0X2RhdGFfY29uZmlnOyAgICAgIC8qIDB4YjAgKi8KKwkvKgorCSAqIEJpdCBbMF0gIDogICB2YWxpZAorCSAqIEJpdFszMToxNjogICBzaXplCisJICovCisJLyoKKwkgKiBoaV9yZXNldF9mbGFnIGlzIHVzZWQgdG8gZG8gc29tZSBzdHVmZiB3aGVuIHRhcmdldCByZXNldC4KKwkgKiBzdWNoIGFzIHJlc3RvcmUgYXBwX3N0YXJ0IGFmdGVyIHdhcm0gcmVzZXQgb3IKKwkgKiBwcmVzZXJ2ZSBob3N0IEludGVyZXN0IGFyZWEsIG9yIHByZXNlcnZlIFJPTSBkYXRhLCBsaXRlcmFscyBldGMuCisJICovCisJQV9VSU5UMzIgaGlfcmVzZXRfZmxhZzsgLyogMHhiNCAqLworCS8qIGluZGljYXRlIGhpX3Jlc2V0X2ZsYWcgaXMgdmFsaWQgKi8KKwlBX1VJTlQzMiBoaV9yZXNldF9mbGFnX3ZhbGlkOyAgIC8qIDB4YjggKi8KKwlBX1VJTlQzMiBoaV9oY2lfdWFydF9wd3JfbWdtdF9wYXJhbXNfZXh0OyAgICAgICAvKiAweGJjICovCisJLyogMHhiYyAtIFszMTowXTogaWRsZSB0aW1lb3V0IGluIG1zCisJICovCisJLyogQUNTIGZsYWdzICovCisJQV9VSU5UMzIgaGlfYWNzX2ZsYWdzOyAgLyogMHhjMCAqLworCUFfVUlOVDMyIGhpX2NvbnNvbGVfZmxhZ3M7ICAgICAgLyogMHhjNCAqLworCUFfVUlOVDMyIGhpX252cmFtX3N0YXRlOyAgICAgICAgLyogMHhjOCAqLworCUFfVUlOVDMyIGhpX29wdGlvbl9mbGFnMjsgICAgICAgLyogMHhjYyAqLworCisJLyogSWYgbm9uLXplcm8sIG92ZXJyaWRlIHZhbHVlcyBzZW50IHRvIEhvc3QgaW4gV01JX1JFQURZIGV2ZW50LiAqLworCUFfVUlOVDMyIGhpX3N3X3ZlcnNpb25fb3ZlcnJpZGU7ICAgICAgICAvKiAweGQwICovCisJQV9VSU5UMzIgaGlfYWJpX3ZlcnNpb25fb3ZlcnJpZGU7ICAgICAgIC8qIDB4ZDQgKi8KKworCS8qIFBlcmNlbnRhZ2Ugb2YgaGlnaCBwcmlvcml0eSBSWCB0cmFmZmljIHRvIHRvdGFsIGV4cGVjdGVkIFJYIHRyYWZmaWMgLQorCSAqIGFwcGxpY2FibGUgb25seSB0byBhcjYwMDQgKi8KKwlBX1VJTlQzMiBoaV9ocF9yeF90cmFmZmljX3JhdGlvOyAgICAgICAgLyogMHhkOCAqLworCisJLyogdGVzdCBhcHBsaWNhdGlvbnMgZmxhZ3MgKi8KKwlBX1VJTlQzMiBoaV90ZXN0X2FwcHNfcmVsYXRlZDsgIC8qIDB4ZGMgKi8KKwkvKiBsb2NhdGlvbiBvZiB0ZXN0IHNjcmlwdCAqLworCUFfVUlOVDMyIGhpX290YV90ZXN0c2NyaXB0OyAgICAgLyogMHhlMCAqLworCS8qIGxvY2F0aW9uIG9mIENBTCBkYXRhICovCisJQV9VSU5UMzIgaGlfY2FsX2RhdGE7ICAgLyogMHhlNCAqLworCisJLyogTnVtYmVyIG9mIHBhY2tldCBsb2cgYnVmZmVycyAqLworCUFfVUlOVDMyIGhpX3BrdGxvZ19udW1fYnVmZmVyczsgLyogMHhlOCAqLworCisJLyogd293IGV4dGVuc2lvbiBjb25maWd1cmF0aW9uICovCisJQV9VSU5UMzIgaGlfd293X2V4dF9jb25maWc7ICAgICAvKiAweGVjICovCisJQV9VSU5UMzIgaGlfcHdyX3NhdmVfZmxhZ3M7ICAgICAvKiAweGYwICovCisKKwkvKiBTcGF0aWFsIE11bHRpcGxleGluZyBQb3dlciBTYXZlIChTTVBTKSBvcHRpb25zICovCisJQV9VSU5UMzIgaGlfc21wc19vcHRpb25zOyAgICAgICAvKiAweGY0ICovCisKKwkvKiBJbnRlcmNvbm5lY3Qtc3BlY2lmaWMgc3RhdGUgKi8KKwlBX1VJTlQzMiBoaV9pbnRlcmNvbm5lY3Rfc3RhdGU7IC8qIDB4ZjggKi8KKworCS8qIENvZXggY29uZmlndXJhdGlvbiBmbGFncyAqLworCUFfVUlOVDMyIGhpX2NvZXhfY29uZmlnOyAgICAgICAgLyogMHhmYyAqLworCisJLyogRWFybHkgYWxsb2NhdGlvbiBzdXBwb3J0ICovCisJQV9VSU5UMzIgaGlfZWFybHlfYWxsb2M7ICAgICAgICAvKiAweDEwMCAqLworCisJLyogRlcgc3dhcCBmaWVsZCAqLworCS8qIEJpdHMgb2YgdGhpcyAzMmJpdCB3b3JkIHdpbGwgYmUgdXNlZCB0byBwYXNzIHNwZWNpZmljIHN3YXAKKwkgICBpbnN0cnVjdGlvbiB0byBGVyAqLworCS8qIEJpdCAwIC0tIEFQIE5hcnQgZGVzY3JpcHRvciBubyBzd2FwLiBXaGVuIHRoaXMgYml0IGlzIHNldAorCSAgIEZXIHdpbGwgbm90IHN3YXAgVFggZGVzY3JpcHRvci4gTWVhbmluZyBwYWNrZXRzIGFyZSBmb3JtZWQKKwkgICBvbiB0aGUgdGFyZ2V0IHByb2Nlc3Nvci4gKi8KKwkvKiBCaXQgMSAtLSBUQkQgKi8KKworCUFfVUlOVDMyIGhpX2Z3X3N3YXA7ICAgIC8qIDB4MTA0ICovCisKKwkvKiBnbG9iYWwgYXJlbmFzIHBvaW50ZXIgYWRkcmVzcywgdXNlZCBieSBob3N0IGRyaXZlciBkZWJ1ZyAqLworCUFfVUlOVDMyIGhpX2R5bmFtaWNfbWVtX2FyZW5hc19hZGRyOyAgICAvKiAweDEwOCAqLworCisJLyogYWxsb2NhdGVkIGJ5dGVzIG9mIERSQU0gdXNlIGJ5IGFsbG9jYXRlZCAqLworCUFfVUlOVDMyIGhpX2R5bmFtaWNfbWVtX2FsbG9jYXRlZDsgICAgICAvKiAweDEwQyAqLworCisJLyogcmVtYWluaW5nIGJ5dGVzIG9mIERSQU0gKi8KKwlBX1VJTlQzMiBoaV9keW5hbWljX21lbV9yZW1haW5pbmc7ICAgICAgLyogMHgxMTAgKi8KKworCS8qIG1lbW9yeSB0cmFjayBjb3VudCwgY29uZmlndXJlZCBieSBob3N0ICovCisJQV9VSU5UMzIgaGlfZHluYW1pY19tZW1fdHJhY2tfbWF4OyAgICAgIC8qIDB4MTE0ICovCisKKwkvKiBtaW5pZHVtcCBidWZmZXIgKi8KKwlBX1VJTlQzMiBoaV9taW5pZHVtcDsgICAvKiAweDExOCAqLworCisJLyogYmRhdGEncyBzaWcgYW5kIGtleSBhZGRyICovCisJQV9VSU5UMzIgaGlfYmRfc2lnX2tleTsgLyogMHgxMWMgKi8KKworfSBQT1NUUEFDSzY0OworCisvKiBiaXRtYXAgZm9yIGhpX3Rlc3RfYXBwc19yZWxhdGVkICovCisjZGVmaW5lIEhJX1RFU1RfQVBQU19URVNUU0NSSVBUX0xPQURFRCAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSElfVEVTVF9BUFBTX0NBTF9EQVRBX0FWQUlMICAgICAgMHgwMDAwMDAwMgorCisvKiBCaXRzIGRlZmluZWQgaW4gaGlfb3B0aW9uX2ZsYWcgKi8KKyNkZWZpbmUgSElfT1BUSU9OX1RJTUVSX1dBUiAgICAgICAgIDB4MDEgICAgICAgIC8qIEVuYWJsZSB0aW1lciB3b3JrYXJvdW5kICovCisjZGVmaW5lIEhJX09QVElPTl9CTUlfQ1JFRF9MSU1JVCAgICAweDAyICAgICAgICAvKiBMaW1pdCBCTUkgY29tbWFuZCBjcmVkaXRzICovCisjZGVmaW5lIEhJX09QVElPTl9SRUxBWV9ET1QxMV9IRFIgICAweDA0ICAgICAgICAvKiBSZWxheSBEb3QxMSBoZHIgdG8vZnJvbSBob3N0ICovCisjZGVmaW5lIEhJX09QVElPTl9NQUNfQUREUl9NRVRIT0QgICAweDA4ICAgICAgICAvKiBNQUMgYWRkciBtZXRob2QgMC1sb2NhbGx5IGFkbWluaXN0cmVkIDEtZ2xvYmFsbHkgdW5pcXVlIGFkZHJzICovCisjZGVmaW5lIEhJX09QVElPTl9GV19CUklER0UgICAgICAgICAweDEwICAgICAgICAvKiBGaXJtd2FyZSBCcmlkZ2luZyAqLworI2RlZmluZSBISV9PUFRJT05fRU5BQkxFX1BST0ZJTEUgICAgMHgyMCAgICAgICAgLyogRW5hYmxlIENQVSBwcm9maWxpbmcgKi8KKyNkZWZpbmUgSElfT1BUSU9OX0RJU0FCTEVfREJHTE9HICAgIDB4NDAgICAgICAgIC8qIERpc2FibGUgZGVidWcgbG9nZ2luZyAqLworI2RlZmluZSBISV9PUFRJT05fU0tJUF9FUkFfVFJBQ0tJTkcgMHg4MCAgICAgICAgLyogU2tpcCBFcmEgVHJhY2tpbmcgKi8KKyNkZWZpbmUgSElfT1BUSU9OX1BBUFJEX0RJU0FCTEUgICAgIDB4MTAwICAgICAgIC8qIERpc2FibGUgUEFQUkQgKGRlYnVnKSAqLworI2RlZmluZSBISV9PUFRJT05fTlVNX0RFVl9MU0IgICAgICAgMHgyMDAKKyNkZWZpbmUgSElfT1BUSU9OX05VTV9ERVZfTVNCICAgICAgIDB4ODAwCisjZGVmaW5lIEhJX09QVElPTl9ERVZfTU9ERV9MU0IgICAgICAweDEwMDAKKyNkZWZpbmUgSElfT1BUSU9OX0RFVl9NT0RFX01TQiAgICAgIDB4ODAwMDAwMAorI2RlZmluZSBISV9PUFRJT05fTk9fTEZUX1NUQkwgICAgICAgMHgxMDAwMDAwMCAgLyogRGlzYWJsZSBMb3dGcmVxIFRpbWVyIFN0YWJpbGl6YXRpb24gKi8KKyNkZWZpbmUgSElfT1BUSU9OX1NLSVBfUkVHX1NDQU4gICAgIDB4MjAwMDAwMDAgIC8qIFNraXAgcmVndWxhdG9yeSBzY2FuICovCisjZGVmaW5lIEhJX09QVElPTl9JTklUX1JFR19TQ0FOICAgICAweDQwMDAwMDAwICAvKiBEbyByZWd1bGF0b3J5IHNjYW4gZHVyaW5nIGluaXQgYmVmb3JlCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlbmRpbmcgV01JIHJlYWR5IGV2ZW50IHRvIGhvc3QgKi8KKyNkZWZpbmUgSElfT1BUSU9OX1NLSVBfTUVNTUFQICAgICAgIDB4ODAwMDAwMDAgIC8qIFJFVjY6IERvIG5vdCBhZGp1c3QgbWVtb3J5IG1hcCAqLworCisjZGVmaW5lIEhJX09QVElPTl9NQUNfQUREUl9NRVRIT0RfU0hJRlQgMworCisvKiAyIGJpdHMgb2YgaGlfb3B0aW9uX2ZsYWcgYXJlIHVzZWQgdG8gcmVwcmVzZW50IDMgbW9kZXMgKi8KKyNkZWZpbmUgSElfT1BUSU9OX0ZXX01PREVfSUJTUyAgICAweDAgICAvKiBJQlNTIE1vZGUgKi8KKyNkZWZpbmUgSElfT1BUSU9OX0ZXX01PREVfQlNTX1NUQSAweDEgICAvKiBTVEEgTW9kZSAqLworI2RlZmluZSBISV9PUFRJT05fRldfTU9ERV9BUCAgICAgIDB4MiAgIC8qIEFQIE1vZGUgKi8KKyNkZWZpbmUgSElfT1BUSU9OX0ZXX01PREVfQlQzMEFNUCAweDMgICAvKiBCVDMwIEFNUCBNb2RlICovCisKKy8qIDIgYml0cyBvZiBoaV9vcHRpb24gZmxhZyBhcmUgdXNlZHRvIHJlcHJlc2VudCA0IHN1Ym1vZGVzICovCisjZGVmaW5lIEhJX09QVElPTl9GV19TVUJNT0RFX05PTkUgICAgMHgwICAgICAgICAvKiBOb3JtYWwgbW9kZSAqLworI2RlZmluZSBISV9PUFRJT05fRldfU1VCTU9ERV9QMlBERVYgIDB4MSAgICAgICAgLyogcDJwIGRldmljZSBtb2RlICovCisjZGVmaW5lIEhJX09QVElPTl9GV19TVUJNT0RFX1AyUENMSUVOVCAweDIgICAgICAvKiBwMnAgY2xpZW50IG1vZGUgKi8KKyNkZWZpbmUgSElfT1BUSU9OX0ZXX1NVQk1PREVfUDJQR08gICAweDMgICAgICAgIC8qIHAycCBnbyBtb2RlICovCisKKy8qIE51bSBkZXYgTWFzayAqLworI2RlZmluZSBISV9PUFRJT05fTlVNX0RFVl9NQVNLICAgIDB4NworI2RlZmluZSBISV9PUFRJT05fTlVNX0RFVl9TSElGVCAgIDB4OQorCisvKiBmaXJtd2FyZSBicmlkZ2luZyAqLworI2RlZmluZSBISV9PUFRJT05fRldfQlJJREdFX1NISUZUIDB4MDQKKworLyogRncgTW9kZS9TdWJNb2RlIE1hc2sKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorIHwgICBTVUIgICB8ICAgU1VCICAgfCAgIFNVQiAgIHwgIFNVQiAgICB8ICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgfAorIHwgTU9ERVszXSB8IE1PREVbMl0gfCBNT0RFWzFdIHwgTU9ERVswXSB8IE1PREVbM10gfCBNT0RFWzJdIHwgTU9ERVsxXSB8IE1PREVbMF0gfAorIHwgICAoMikgICB8ICAgKDIpICAgfCAgICgyKSAgIHwgICAoMikgICB8ICAgKDIpICAgfCAgICgyKSAgIHwgICAoMikgICB8ICAgKDIpICAgfAorIHx8fC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKi8KKyNkZWZpbmUgSElfT1BUSU9OX0ZXX01PREVfQklUUyAgICAgICAgIDB4MgorI2RlZmluZSBISV9PUFRJT05fRldfTU9ERV9NQVNLICAgICAgICAgMHgzCisjZGVmaW5lIEhJX09QVElPTl9GV19NT0RFX1NISUZUICAgICAgICAweEMKKyNkZWZpbmUgSElfT1BUSU9OX0FMTF9GV19NT0RFX01BU0sgICAgIDB4RkYKKworI2RlZmluZSBISV9PUFRJT05fRldfU1VCTU9ERV9CSVRTICAgICAgMHgyCisjZGVmaW5lIEhJX09QVElPTl9GV19TVUJNT0RFX01BU0sgICAgICAweDMKKyNkZWZpbmUgSElfT1BUSU9OX0ZXX1NVQk1PREVfU0hJRlQgICAgIDB4MTQKKyNkZWZpbmUgSElfT1BUSU9OX0FMTF9GV19TVUJNT0RFX01BU0sgIDB4RkYwMAorI2RlZmluZSBISV9PUFRJT05fQUxMX0ZXX1NVQk1PREVfU0hJRlQgMHg4CisKKy8qIGhpX29wdGlvbl9mbGFnMiBvcHRpb25zICovCisjZGVmaW5lIEhJX09QVElPTl9PRkZMT0FEX0FNU0RVICAgICAweDAxCisjZGVmaW5lIEhJX09QVElPTl9ERlNfU1VQUE9SVCAgICAgICAweDAyICAgICAgICAvKiBFbmFibGUgREZTIHN1cHBvcnQgKi8KKyNkZWZpbmUgSElfT1BUSU9OX0VOQUJMRV9SRktJTEwgICAgIDB4MDQgICAgICAgIC8qIFJGS2lsbCBFbmFibGUgRmVhdHVyZSAqLworI2RlZmluZSBISV9PUFRJT05fUkFESU9fUkVURU5USU9OX0RJU0FCTEUgICAgIDB4MDggICAgICAvKiBEaXNhYmxlIHJhZGlvIHJldGVudGlvbiAqLworI2RlZmluZSBISV9PUFRJT05fRUFSTFlfQ0ZHX0RPTkUgICAgMHgxMCAgICAgICAgLyogRWFybHkgY29uZmlndXJhdGlvbiBpcyBjb21wbGV0ZSAqLworCisjZGVmaW5lIEhJX09QVElPTl9SRl9LSUxMX1NISUZUICAgICAweDIKKyNkZWZpbmUgSElfT1BUSU9OX1JGX0tJTExfTUFTSyAgICAgIDB4MQorCisvKiBBUjk4ODggMS4wIG9ubHkuIEVuYWJsZS9kaXNhYmxlIENEQyBtYXggcGVyZiBzdXBwb3J0IGZyb20gaG9zdCAqLworI2RlZmluZSBISV9PUFRJT05fRElTQUJMRV9DRENfTUFYX1BFUkZfV0FSICAweDIwCisjZGVmaW5lIENEQ19NQVhfUEVSRl9XQVJfRU5BQkxFRCgpICAgIFwKKwkoIShIT1NUX0lOVEVSRVNULT5oaV9vcHRpb25fZmxhZzIgJiBISV9PUFRJT05fRElTQUJMRV9DRENfTUFYX1BFUkZfV0FSKSkKKworI2RlZmluZSBISV9PUFRJT05fVVNFX0VYVF9MRE8gICAgICAgMHg0MCAgICAgICAgLyogdXNlIExETzI3IGZvciAxLjFWIGluc3RlYWQgb2YgUE1VICovCisjZGVmaW5lIEhJX09QVElPTl9EQlVBUlRfU1VQUE9SVCAgICAweDgwICAgICAgICAvKiBFbmFibGUgdWFydCBkZWJ1ZyBzdXBwb3J0ICovCisjZGVmaW5lIEhUX09QVElPTl9HUElPX1dBS0VVUF9TVVBQT1JUICAgIDB4MjAwIC8qIEdQSU8gd2FrZSB1cCBzdXBwb3J0ICovCisjZGVmaW5lIEdQSU9fV0FLRVVQX0VOQUJMRUQoKSBcCisJCQkgKEhPU1RfSU5URVJFU1QtPmhpX29wdGlvbl9mbGFnMiAmIEhUX09QVElPTl9HUElPX1dBS0VVUF9TVVBQT1JUKQorCisvKiBoaV9yZXNldF9mbGFnICovCisjZGVmaW5lIEhJX1JFU0VUX0ZMQUdfUFJFU0VSVkVfQVBQX1NUQVJUICAgICAgICAgMHgwMSAgIC8qIHByZXNlcnZlIEFwcCBTdGFydCBhZGRyZXNzICovCisjZGVmaW5lIEhJX1JFU0VUX0ZMQUdfUFJFU0VSVkVfSE9TVF9JTlRFUkVTVCAgICAgMHgwMiAgIC8qIHByZXNlcnZlIGhvc3QgaW50ZXJlc3QgKi8KKyNkZWZpbmUgSElfUkVTRVRfRkxBR19QUkVTRVJWRV9ST01EQVRBICAgICAgICAgICAweDA0ICAgLyogcHJlc2VydmUgUk9NIGRhdGEgKi8KKyNkZWZpbmUgSElfUkVTRVRfRkxBR19QUkVTRVJWRV9OVlJBTV9TVEFURSAgICAgICAweDA4CisjZGVmaW5lIEhJX1JFU0VUX0ZMQUdfUFJFU0VSVkVfQk9PVF9JTkZPICAgICAgICAgMHgxMAorI2RlZmluZSBISV9SRVNFVF9GTEFHX1dBUk1fUkVTRVQgICAgICAgIDB4MjAKKworLyogZGVmaW5lIGhpX2Z3X3N3YXAgYml0cyAqLworI2RlZmluZSBISV9ERVNDX0lOX0ZXX0JJVCAgICAgICAweDAxCisKKyNkZWZpbmUgSElfUkVTRVRfRkxBR19JU19WQUxJRCAgMHgxMjM0NTY3OCAgICAgIC8qIGluZGljYXRlIHRoZSByZXNldCBmbGFnIGlzIHZhbGlkICovCisKKyNkZWZpbmUgT05fUkVTRVRfRkxBR1NfVkFMSUQoKSBcCisJKEhPU1RfSU5URVJFU1QtPmhpX3Jlc2V0X2ZsYWdfdmFsaWQgPT0gSElfUkVTRVRfRkxBR19JU19WQUxJRCkKKworI2RlZmluZSBSRVNFVF9GTEFHU19WQUxJREFURSgpCVwKKwkoSE9TVF9JTlRFUkVTVC0+aGlfcmVzZXRfZmxhZ192YWxpZCA9IEhJX1JFU0VUX0ZMQUdfSVNfVkFMSUQpCisKKyNkZWZpbmUgUkVTRVRfRkxBR1NfSU5WQUxJREFURSgpIFwKKwkoSE9TVF9JTlRFUkVTVC0+aGlfcmVzZXRfZmxhZ192YWxpZCA9IDApCisKKyNkZWZpbmUgT05fUkVTRVRfUFJFU0VSVkVfQVBQX1NUQVJUKCkgXAorCShIT1NUX0lOVEVSRVNULT5oaV9yZXNldF9mbGFnICYgSElfUkVTRVRfRkxBR19QUkVTRVJWRV9BUFBfU1RBUlQpCisKKyNkZWZpbmUgT05fUkVTRVRfUFJFU0VSVkVfTlZSQU1fU1RBVEUoKQlcCisJKEhPU1RfSU5URVJFU1QtPmhpX3Jlc2V0X2ZsYWcgJiBISV9SRVNFVF9GTEFHX1BSRVNFUlZFX05WUkFNX1NUQVRFKQorCisjZGVmaW5lIE9OX1JFU0VUX1BSRVNFUlZFX0hPU1RfSU5URVJFU1QoKSBcCisJKEhPU1RfSU5URVJFU1QtPmhpX3Jlc2V0X2ZsYWcgJiBISV9SRVNFVF9GTEFHX1BSRVNFUlZFX0hPU1RfSU5URVJFU1QpCisKKyNkZWZpbmUgT05fUkVTRVRfUFJFU0VSVkVfUk9NREFUQSgpIFwKKwkoSE9TVF9JTlRFUkVTVC0+aGlfcmVzZXRfZmxhZyAmIEhJX1JFU0VUX0ZMQUdfUFJFU0VSVkVfUk9NREFUQSkKKworI2RlZmluZSBPTl9SRVNFVF9QUkVTRVJWRV9CT09UX0lORk8oKSBcCisJKEhPU1RfSU5URVJFU1QtPmhpX3Jlc2V0X2ZsYWcgJiBISV9SRVNFVF9GTEFHX1BSRVNFUlZFX0JPT1RfSU5GTykKKworI2RlZmluZSBPTl9SRVNFVF9XQVJNX1JFU0VUKCkgXAorCShIT1NUX0lOVEVSRVNULT5oaV9yZXNldF9mbGFnICYgSElfUkVTRVRfRkxBR19XQVJNX1JFU0VUKQorCisvKiBob3N0IENQVSBlbmRpYW5uZXNzICovCisjZGVmaW5lIEhPU1RfT05fQkVfQ1BVKCkgXAorCShIT1NUX0lOVEVSRVNULT5oaV9iZSkKKworLyogQVAgbmFydCBubyBzd2FwIGRlc2NyaXB0b3IgZmxhZy4gRGVjc3JpcHRvcnMgYXJlIGNyZWF0ZWQgb24gdGhlIHRhcmdldCBwcm9jZXNzb3IuICovCisjZGVmaW5lIERFU0NfSU5fRlcoKSBcCisJKEhPU1RfSU5URVJFU1QtPmhpX2Z3X3N3YXAgJiBISV9ERVNDX0lOX0ZXX0JJVCkKKworI2RlZmluZSBISV9BQ1NfRkxBR1NfRU5BQkxFRCAgICAgICAgKDEgPDwgMCkgICAgLyogQUNTIGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgSElfQUNTX0ZMQUdTX1VTRV9XV0FOICAgICAgICgxIDw8IDEpICAgIC8qIFVzZSBwaHlzaWNhbCBXV0FOIGRldmljZSAqLworI2RlZmluZSBISV9BQ1NfRkxBR1NfVEVTVF9WQVAgICAgICAgKDEgPDwgMikgICAgLyogVXNlIHRlc3QgVkFQICovCisKKy8qIENPTlNPTEUgRkxBR1MKKyAqCisgKiBCaXQgUmFuZ2UgIE1lYW5pbmcKKyAqIC0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgMi4uMCAgICAgVUFSVCBJRCAoMCA9IERlZmF1bHQpCisgKiAgICAzICAgICAgIEJhdWQgU2VsZWN0ICgwID0gOTYwMCwgMSA9IDExNTIwMCkKKyAqICAgMzAuLjQgICAgUmVzZXJ2ZWQKKyAqICAgIDMxICAgICAgRW5hYmxlIENvbnNvbGUKKyAqCisgKiAqLworCisjZGVmaW5lIEhJX0NPTlNPTEVfRkxBR1NfRU5BQkxFICAgICAgICgxIDw8IDMxKQorI2RlZmluZSBISV9DT05TT0xFX0ZMQUdTX1VBUlRfTUFTSyAgICAoMHg3KQorI2RlZmluZSBISV9DT05TT0xFX0ZMQUdTX1VBUlRfU0hJRlQgICAwCisjZGVmaW5lIEhJX0NPTlNPTEVfRkxBR1NfQkFVRF9TRUxFQ1QgICgxIDw8IDMpCisKKy8qIFNNIHBvd2VyIHNhdmUgb3B0aW9ucyAqLworI2RlZmluZSBISV9TTVBTX0FMTE9XX01BU0sgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgSElfU01QU19NT0RFX01BU0sgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIEhJX1NNUFNfTU9ERV9TVEFUSUMgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBISV9TTVBTX01PREVfRFlOQU1JQyAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgSElfU01QU19ESVNBQkxFX0FVVE9fTU9ERSAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIEhJX1NNUFNfREFUQV9USFJFU0hfTUFTSyAgICAgICgweDAwMDAwN2Y4KQorI2RlZmluZSBISV9TTVBTX0RBVEFfVEhSRVNIX1NISUZUICAgICAoMykKKyNkZWZpbmUgSElfU01QU19SU1NJX1RIUkVTSF9NQVNLICAgICAgKDB4MDAwN2Y4MDApCisjZGVmaW5lIEhJX1NNUFNfUlNTSV9USFJFU0hfU0hJRlQgICAgICgxMSkKKyNkZWZpbmUgSElfU01QU19MT1dQV1JfQ01fTUFTSyAgICAgICAgKDB4MDAzODAwMDApCisjZGVmaW5lIEhJX1NNUFNfTE9XUFdSX0NNX1NISUZUICAgICAgICgxNSkKKyNkZWZpbmUgSElfU01QU19ISVBXUl9DTV9NQVNLICAgICAgICAgKDB4MDNjMDAwMDApCisjZGVmaW5lIEhJX1NNUFNfSElQV1JfQ01fU0hJRlQgICAgICAgICgxOSkKKworI2RlZmluZSBIT1NUX0lOVEVSRVNUX1NNUFNfR0VUX01PREUoKSAgICAgKEhPU1RfSU5URVJFU1QtPmhpX3NtcHNfb3B0aW9ucyAmIEhJX1NNUFNfTU9ERV9NQVNLKQorI2RlZmluZSBIT1NUX0lOVEVSRVNUX1NNUFNfR0VUX0RBVEFfVEhSRVNIKCkgKChIT1NUX0lOVEVSRVNULT5oaV9zbXBzX29wdGlvbnMgJiBISV9TTVBTX0RBVEFfVEhSRVNIX01BU0spID4+IEhJX1NNUFNfREFUQV9USFJFU0hfU0hJRlQpCisjZGVmaW5lIEhPU1RfSU5URVJFU1RfU01QU19TRVRfREFUQV9USFJFU0goeCkgKCgoeCkgPDwgSElfU01QU19EQVRBX1RIUkVTSF9TSElGVCkgJiBISV9TTVBTX0RBVEFfVEhSRVNIX01BU0spCisjZGVmaW5lIEhPU1RfSU5URVJFU1RfU01QU19HRVRfUlNTSV9USFJFU0goKSAoKEhPU1RfSU5URVJFU1QtPmhpX3NtcHNfb3B0aW9ucyAmIEhJX1NNUFNfUlNTSV9USFJFU0hfTUFTSykgPj4gSElfU01QU19SU1NJX1RIUkVTSF9TSElGVCkKKyNkZWZpbmUgSE9TVF9JTlRFUkVTVF9TTVBTX1NFVF9SU1NJX1RIUkVTSCh4KSAoKCh4KSA8PCBISV9TTVBTX1JTU0lfVEhSRVNIX1NISUZUKSAmIEhJX1NNUFNfUlNTSV9USFJFU0hfTUFTSykKKyNkZWZpbmUgSE9TVF9JTlRFUkVTVF9TTVBTX1NFVF9MT1dQV1JfQ00oKSAgICgoSE9TVF9JTlRFUkVTVC0+aGlfc21wc19vcHRpb25zICYgSElfU01QU19MT1dQV1JfQ01fTUFTSykgPj4gSElfU01QU19MT1dQV1JfQ01fU0hJRlQpCisjZGVmaW5lIEhPU1RfSU5URVJFU1RfU01QU19TRVRfSElQV1JfQ00oKSAoKEhPU1RfSU5URVJFU1QtPmhpX3NtcHNfb3B0aW9ucyA8PCBISV9TTVBTX0hJUFdSX0NNX01BU0spICYgSElfU01QU19ISVBXUl9DTV9TSElGVCkKKyNkZWZpbmUgSE9TVF9JTlRFUkVTVF9TTVBTX0lTX0FVVE9fTU9ERV9ESVNBQkxFRCgpIChIT1NUX0lOVEVSRVNULT5oaV9zbXBzX29wdGlvbnMgJiBISV9TTVBTX0RJU0FCTEVfQVVUT19NT0RFKQorCisvKiBXT1cgRXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBCaXQgUmFuZ2UgIE1lYW5pbmcKKyAqIC0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgOC4uMCAgICAgU2l6ZSBvZiBlYWNoIFdPVyBwYXR0ZXJuIChtYXggNTExKQorICogICAxNS4uOSAgICBOdW1iZXIgb2YgcGF0dGVybnMgcGVyIGxpc3QgKG1heCAxMjcpCisgKiAgIDE3Li4xNiAgIE51bWJlciBvZiBsaXN0cyAobWF4IDQpCisgKiAgIDMwLi4xOCAgIFJlc2VydmVkCisgKiAgIDMxICAgICAgIEVuYWJsZWQKKyAqCisgKiAgc2V0IHZhbHVlcyAoZXhjZXB0IGVuYWJsZSkgdG8gemVyb3MgZm9yIGRlZmF1bHQgc2V0dGluZ3MKKyAqCisgKiAqLworCisjZGVmaW5lIEhJX1dPV19FWFRfRU5BQkxFRF9NQVNLICAgICAgICAoMSA8PCAzMSkKKyNkZWZpbmUgSElfV09XX0VYVF9OVU1fTElTVF9TSElGVCAgICAgIDE2CisjZGVmaW5lIEhJX1dPV19FWFRfTlVNX0xJU1RfTUFTSyAgICAgICAoMHgzIDw8IEhJX1dPV19FWFRfTlVNX0xJU1RfU0hJRlQpCisjZGVmaW5lIEhJX1dPV19FWFRfTlVNX1BBVFRFUk5TX1NISUZUICA5CisjZGVmaW5lIEhJX1dPV19FWFRfTlVNX1BBVFRFUk5TX01BU0sgICAoMHg3RiA8PCBISV9XT1dfRVhUX05VTV9QQVRURVJOU19TSElGVCkKKyNkZWZpbmUgSElfV09XX0VYVF9QQVRURVJOX1NJWkVfU0hJRlQgIDAKKyNkZWZpbmUgSElfV09XX0VYVF9QQVRURVJOX1NJWkVfTUFTSyAgICgweDFGRiA8PCBISV9XT1dfRVhUX1BBVFRFUk5fU0laRV9TSElGVCkKKworI2RlZmluZSBISV9XT1dfRVhUX01BS0VfQ09ORklHKG51bV9saXN0cyxjb3VudCxzaXplKSBcCisJKCgoKG51bV9saXN0cykgPDwgSElfV09XX0VYVF9OVU1fTElTVF9TSElGVCkgJiBISV9XT1dfRVhUX05VTV9MSVNUX01BU0spICAgICB8IFwKKwkgKCgoY291bnQpIDw8IEhJX1dPV19FWFRfTlVNX1BBVFRFUk5TX1NISUZUKSAmIEhJX1dPV19FWFRfTlVNX1BBVFRFUk5TX01BU0spICB8CVwKKwkgKCgoc2l6ZSkgPDwgSElfV09XX0VYVF9QQVRURVJOX1NJWkVfU0hJRlQpICYgSElfV09XX0VYVF9QQVRURVJOX1NJWkVfTUFTSykpCisKKyNkZWZpbmUgSElfV09XX0VYVF9HRVRfTlVNX0xJU1RTKGNvbmZpZykgICAgIFwKKwkoKChjb25maWcpICYgSElfV09XX0VYVF9OVU1fTElTVF9NQVNLKSA+PiBISV9XT1dfRVhUX05VTV9MSVNUX1NISUZUKQorI2RlZmluZSBISV9XT1dfRVhUX0dFVF9OVU1fUEFUVEVSTlMoY29uZmlnKSAgXAorCSgoKGNvbmZpZykgJiBISV9XT1dfRVhUX05VTV9QQVRURVJOU19NQVNLKSA+PiBISV9XT1dfRVhUX05VTV9QQVRURVJOU19TSElGVCkKKyNkZWZpbmUgSElfV09XX0VYVF9HRVRfUEFUVEVSTl9TSVpFKGNvbmZpZykgIFwKKwkoKChjb25maWcpICYgSElfV09XX0VYVF9QQVRURVJOX1NJWkVfTUFTSykgPj4gSElfV09XX0VYVF9QQVRURVJOX1NJWkVfU0hJRlQpCisKKy8qCisgKiBFYXJseSBhbGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24KKyAqIFN1cHBvcnQgUkFNIGJhbmsgY29uZmlndXJhdGlvbiBiZWZvcmUgQk1JIGRvbmUgYW5kIHRoaXMgZWFzZXMgdGhlIG1lbW9yeQorICogYWxsb2NhdGlvbiBhdCB2ZXJ5IGVhcmx5IHN0YWdlCisgKiBCaXQgUmFuZ2UgIE1lYW5pbmcKKyAqIC0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogWzA6M10gICAgICBudW1iZXIgb2YgYmFuayBhc3NpZ25lZCB0byBiZSBJUkFNCisgKiBbNDoxNV0gICAgIHJlc2VydmVkCisgKiBbMTY6MzFdICAgIG1hZ2ljIG51bWJlcgorICoKKyAqIE5vdGU6CisgKiAxLiB0YXJnZXQgZmlybXdhcmUgd291bGQgY2hlY2sgbWFnaWMgbnVtYmVyIGFuZCBpZiBpdCdzIGEgbWF0Y2gsIGZpcm13YXJlCisgKiAgICB3b3VsZCBjb25zaWRlciB0aGUgYml0c1swOjE1XSBhcmUgdmFsaWQgYW5kIGJhc2Ugb24gdGhhdCB0byBjYWxjdWxhdGUKKyAqICAgIHRoZSBlbmQgb2YgRFJBTS4gRWFybHkgYWxsb2NhdGlvbiB3b3VsZCBiZSBsb2NhdGVkIGF0IHRoYXQgYXJlYSBhbmQKKyAqICAgIG1heSBiZSByZWNsYWltZWQgd2hlbiBuZWNlc2FyeQorICogMi4gaWYgbm8gbWFnaWMgbnVtYmVyIGlzIGZvdW5kLCBlYXJseSBhbGxvY2F0aW9uIHdvdWxkIGhhcHBlbiBhdCAiX2VuZCIKKyAqICAgIHN5bWJvbCBvZiBST00gd2hpY2ggaXMgbG9jYXRlZCBiZWZvcmUgdGhlIGFwcC1kYXRhIGFuZCBtaWdodCBOT1QgYmUKKyAqICAgIHJlLWNsYWltYWJsZS4gSWYgdGhpcyBpcyBhZG9wdGVkLCBsaW5rIHNjcmlwdCBzaG91bGQga2VlcCB0aGlzIGluCisgKiAgICBtaW5kIHRvIGF2b2lkIGRhdGEgY29ycnVwdGlvbi4KKyAqLworI2RlZmluZSBISV9FQVJMWV9BTExPQ19NQUdJQyAgICAgICAgICAgICAgICAgICAweDZkOGEKKyNkZWZpbmUgSElfRUFSTFlfQUxMT0NfTUFHSUNfTUFTSyAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBISV9FQVJMWV9BTExPQ19NQUdJQ19TSElGVCAgICAgICAgICAgICAxNgorI2RlZmluZSBISV9FQVJMWV9BTExPQ19JUkFNX0JBTktTX01BU0sgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhJX0VBUkxZX0FMTE9DX0lSQU1fQkFOS1NfU0hJRlQgICAgICAgIDAKKworI2RlZmluZSBISV9FQVJMWV9BTExPQ19WQUxJRCgpIFwKKwkoKCgoSE9TVF9JTlRFUkVTVC0+aGlfZWFybHlfYWxsb2MpICYgSElfRUFSTFlfQUxMT0NfTUFHSUNfTUFTSykgPj4gSElfRUFSTFlfQUxMT0NfTUFHSUNfU0hJRlQpIFwKKwkgPT0gKEhJX0VBUkxZX0FMTE9DX01BR0lDKSkKKyNkZWZpbmUgSElfRUFSTFlfQUxMT0NfR0VUX0lSQU1fQkFOS1MoKQlcCisJKCgoSE9TVF9JTlRFUkVTVC0+aGlfZWFybHlfYWxsb2MpICYgSElfRUFSTFlfQUxMT0NfSVJBTV9CQU5LU19NQVNLKSA+PiBISV9FQVJMWV9BTExPQ19JUkFNX0JBTktTX1NISUZUKQorCisvKgorICogSW50ZW5kZWQgZm9yIHVzZSBieSBIb3N0IHNvZnR3YXJlLCB0aGlzIG1hY3JvIHJldHVybnMgdGhlIFRhcmdldCBSQU0KKyAqIGFkZHJlc3Mgb2YgYW55IGl0ZW0gaW4gdGhlIGhvc3RfaW50ZXJlc3Qgc3RydWN0dXJlLgorICogRXhhbXBsZTogdGFyZ2V0X2FkZHIgPSBBUjYwMDJfSE9TVF9JTlRFUkVTVF9JVEVNX0FERFJFU1MoaGlfYm9hcmRfZGF0YSk7CisgKi8KKyNkZWZpbmUgQVI2MDAyX0hPU1RfSU5URVJFU1RfSVRFTV9BRERSRVNTKGl0ZW0pCVwKKwkoQV9VSU5UMzIpKChzaXplX3QpJigoKChzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zICopKEFSNjAwMl9IT1NUX0lOVEVSRVNUX0FERFJFU1MpKS0+aXRlbSkpKQorCisjZGVmaW5lIEFSNjAwM19IT1NUX0lOVEVSRVNUX0lURU1fQUREUkVTUyhpdGVtKQlcCisJKEFfVUlOVDMyKSgoc2l6ZV90KSYoKCgoc3RydWN0IGhvc3RfaW50ZXJlc3RfcyAqKShBUjYwMDNfSE9TVF9JTlRFUkVTVF9BRERSRVNTKSktPml0ZW0pKSkKKworI2RlZmluZSBBUjYwMDRfSE9TVF9JTlRFUkVTVF9JVEVNX0FERFJFU1MoaXRlbSkJXAorCShBX1VJTlQzMikoKHNpemVfdCkmKCgoKHN0cnVjdCBob3N0X2ludGVyZXN0X3MgKikoQVI2MDA0X0hPU1RfSU5URVJFU1RfQUREUkVTUykpLT5pdGVtKSkpCisKKyNkZWZpbmUgQVI2MDA2X0hPU1RfSU5URVJFU1RfSVRFTV9BRERSRVNTKGl0ZW0pCVwKKwkoQV9VSU5UMzIpKChzaXplX3QpJigoKChzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zICopKEFSNjAwNl9IT1NUX0lOVEVSRVNUX0FERFJFU1MpKS0+aXRlbSkpKQorCisjZGVmaW5lIEFSOTg4OF9IT1NUX0lOVEVSRVNUX0lURU1fQUREUkVTUyhpdGVtKQlcCisJKEFfVUlOVDMyKSgoc2l6ZV90KSYoKCgoc3RydWN0IGhvc3RfaW50ZXJlc3RfcyAqKShBUjk4ODhfSE9TVF9JTlRFUkVTVF9BRERSRVNTKSktPml0ZW0pKSkKKworI2RlZmluZSBBUjYzMjBfSE9TVF9JTlRFUkVTVF9JVEVNX0FERFJFU1MoaXRlbSkJXAorCShBX1VJTlQzMikoKHNpemVfdCkmKCgoKHN0cnVjdCBob3N0X2ludGVyZXN0X3MgKikoQVI2MzIwX0hPU1RfSU5URVJFU1RfQUREUkVTUykpLT5pdGVtKSkpCisKKyNkZWZpbmUgQVI5MDBCX0hPU1RfSU5URVJFU1RfSVRFTV9BRERSRVNTKGl0ZW0pCVwKKwkoQV9VSU5UMzIpKChzaXplX3QpJigoKChzdHJ1Y3QgaG9zdF9pbnRlcmVzdF9zICopKEFSOTAwQl9IT1NUX0lOVEVSRVNUX0FERFJFU1MpKS0+aXRlbSkpKQorCisjZGVmaW5lIEhPU1RfSU5URVJFU1RfREJHTE9HX0lTX0VOQUJMRUQoKSBcCisJKCEoKHZvbGF0aWxlIEFfVUlOVDMyKUhPU1RfSU5URVJFU1QtPmhpX29wdGlvbl9mbGFnICYgSElfT1BUSU9OX0RJU0FCTEVfREJHTE9HKSkKKworI2RlZmluZSBIT1NUX0lOVEVSRVNUX1BLVExPR19JU19FTkFCTEVEKCkgXAorCSgoKHZvbGF0aWxlIEFfVUlOVDMyKUhPU1RfSU5URVJFU1QtPmhpX3BrdGxvZ19udW1fYnVmZmVycykpCisKKyNkZWZpbmUgSE9TVF9JTlRFUkVTVF9QUk9GSUxFX0lTX0VOQUJMRUQoKSBcCisJKCh2b2xhdGlsZSBBX1VJTlQzMilIT1NUX0lOVEVSRVNULT5oaV9vcHRpb25fZmxhZyAmIEhJX09QVElPTl9FTkFCTEVfUFJPRklMRSkKKworI2RlZmluZSBMRl9USU1FUl9TVEFCSUxJWkFUSU9OX0lTX0VOQUJMRUQoKSBcCisJKCEoKHZvbGF0aWxlIEFfVUlOVDMyKUhPU1RfSU5URVJFU1QtPmhpX29wdGlvbl9mbGFnICYgSElfT1BUSU9OX05PX0xGVF9TVEJMKSkKKworI2RlZmluZSBJU19BTVNEVV9PRkZMQU9EX0VOQUJMRUQoKSBcCisJKCgodm9sYXRpbGUgQV9VSU5UMzIpSE9TVF9JTlRFUkVTVC0+aGlfb3B0aW9uX2ZsYWcyICYgSElfT1BUSU9OX09GRkxPQURfQU1TRFUpKQorCisjZGVmaW5lIEhPU1RfSU5URVJFU1RfREZTX0lTX0VOQUJMRUQoKSBcCisJKCgodm9sYXRpbGUgQV9VSU5UMzIpSE9TVF9JTlRFUkVTVC0+aGlfb3B0aW9uX2ZsYWcyICYgSElfT1BUSU9OX0RGU19TVVBQT1JUKSkKKworI2RlZmluZSBIT1NUX0lOVEVSRVNUX0VBUkxZX0NGR19ET05FKCkgXAorCSgoKHZvbGF0aWxlIEFfVUlOVDMyKUhPU1RfSU5URVJFU1QtPmhpX29wdGlvbl9mbGFnMiAmIEhJX09QVElPTl9FQVJMWV9DRkdfRE9ORSkpCisKKy8qcG93ZXIgc2F2ZSBmbGFnIGJpdCBkZWZpbml0aW9ucyovCisjZGVmaW5lIEhJX1BXUl9TQVZFX0xQTF9FTkFCTEVEICAgMHgxCisvKmIxLWIzIHJlc2VydmVkKi8KKy8qYjQtYjUgOiBkZXYwIExQTCB0eXBlIDogMCAtIG5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMS0gUmVkdWNlIFB3ciBTZWFyY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMi0gUmVkdWNlIFB3ciBMaXN0ZW4qLworLypiNi1iNyA6IGRldjEgTFBMIHR5cGUgYW5kIHNvIG9uIGZvciBNYXggOCBkZXZpY2VzKi8KKyNkZWZpbmUgSElfUFdSX1NBVkVfTFBMX0RFVjBfTFNCICAgNAorI2RlZmluZSBISV9QV1JfU0FWRV9MUExfREVWX01BU0sgICAweDMKKy8qcG93ZXIgc2F2ZSByZWxhdGVkIHV0aWxpdHkgbWFjcm9zKi8KKyNkZWZpbmUgSElfTFBMX0VOQUJMRUQoKSBcCisJKChIT1NUX0lOVEVSRVNULT5oaV9wd3Jfc2F2ZV9mbGFncyAmIEhJX1BXUl9TQVZFX0xQTF9FTkFCTEVEKSkKKyNkZWZpbmUgSElfREVWX0xQTF9UWVBFX0dFVChfZGV2aXgpICAgXAorCShIT1NUX0lOVEVSRVNULT5oaV9wd3Jfc2F2ZV9mbGFncyAmIFwKKwkgKChISV9QV1JfU0FWRV9MUExfREVWX01BU0spIDw8CVwKKwkgIChISV9QV1JfU0FWRV9MUExfREVWMF9MU0IgKyBcCisJICAgKF9kZXZpeCkqMikpKQorCisjZGVmaW5lIEhPU1RfSU5URVJFU1RfU01QU19JU19BTExPV0VEKCkJXAorCSgoSE9TVF9JTlRFUkVTVC0+aGlfc21wc19vcHRpb25zICYgSElfU01QU19BTExPV19NQVNLKSkKKworLyogQ29udmVydCBhIFRhcmdldCB2aXJ0dWFsIGFkZHJlc3MgaW50byBhIFRhcmdldCBwaHlzaWNhbCBhZGRyZXNzICovCisjZGVmaW5lIEFSNjAwMl9WVE9QKHZhZGRyKSAoKHZhZGRyKSAmIDB4MDAxZmZmZmYpCisjZGVmaW5lIEFSNjAwM19WVE9QKHZhZGRyKSAoKHZhZGRyKSAmIDB4MDAxZmZmZmYpCisjZGVmaW5lIEFSNjAwNF9WVE9QKHZhZGRyKSAodmFkZHIpCisjZGVmaW5lIEFSNjAwNl9WVE9QKHZhZGRyKSAodmFkZHIpCisjZGVmaW5lIEFSOTg4OF9WVE9QKHZhZGRyKSAodmFkZHIpCisjZGVmaW5lIEFSNjMyMF9WVE9QKHZhZGRyKSAodmFkZHIpCisjZGVmaW5lIEFSOTAwQl9WVE9QKHZhZGRyKSAodmFkZHIpCisjZGVmaW5lIFRBUkdfVlRPUChUYXJnZXRUeXBlLCB2YWRkcikgXAorCSgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSNjAwMikgPyBBUjYwMDJfVlRPUCh2YWRkcikgOiBcCisJICgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSNjAwMykgPyBBUjYwMDNfVlRPUCh2YWRkcikgOiBcCisJICAoKChUYXJnZXRUeXBlKSA9PSBUQVJHRVRfVFlQRV9BUjYwMDQpID8gQVI2MDA0X1ZUT1AodmFkZHIpIDogXAorCSAgICgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSNjAwNikgPyBBUjYwMDZfVlRPUCh2YWRkcikgOglcCisJICAgICgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSOTg4OCkgPyBBUjk4ODhfVlRPUCh2YWRkcikgOiBcCisJICAgICgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSNjMyMCkgPyBBUjYzMjBfVlRPUCh2YWRkcikgOiBcCisJICAgICgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSOTAwQikgPyBBUjkwMEJfVlRPUCh2YWRkcikgOiBcCisJICAgIDApKSkpKSkpCisKKyNkZWZpbmUgSE9TVF9JTlRFUkVTVF9JVEVNX0FERFJFU1MoVGFyZ2V0VHlwZSwgaXRlbSkgXAorCSgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSNjAwMikgPyBBUjYwMDJfSE9TVF9JTlRFUkVTVF9JVEVNX0FERFJFU1MoaXRlbSkgOiBcCisJICgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSNjAwMykgPyBBUjYwMDNfSE9TVF9JTlRFUkVTVF9JVEVNX0FERFJFU1MoaXRlbSkgOiBcCisJICAoKChUYXJnZXRUeXBlKSA9PSBUQVJHRVRfVFlQRV9BUjYwMDQpID8gQVI2MDA0X0hPU1RfSU5URVJFU1RfSVRFTV9BRERSRVNTKGl0ZW0pIDogXAorCSAgICgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSNjAwNikgPyBBUjYwMDZfSE9TVF9JTlRFUkVTVF9JVEVNX0FERFJFU1MoaXRlbSkgOiBcCisJICAgICgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSOTg4OCkgPyBBUjk4ODhfSE9TVF9JTlRFUkVTVF9JVEVNX0FERFJFU1MoaXRlbSkgOiBcCisJICAgICgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSNjMyMCkgPyBBUjYzMjBfSE9TVF9JTlRFUkVTVF9JVEVNX0FERFJFU1MoaXRlbSkgOiBcCisJICAgICgoKFRhcmdldFR5cGUpID09IFRBUkdFVF9UWVBFX0FSNjMyMFYyKSA/IEFSNjMyMF9IT1NUX0lOVEVSRVNUX0lURU1fQUREUkVTUyhpdGVtKSA6CVwKKwkgICAgKCgoVGFyZ2V0VHlwZSkgPT0gVEFSR0VUX1RZUEVfQVI5MDBCKSA/IEFSOTAwQl9IT1NUX0lOVEVSRVNUX0lURU1fQUREUkVTUyhpdGVtKSA6IFwKKwkgICAgMCkpKSkpKSkpCisKKyNkZWZpbmUgQVI2MDAyX0JPQVJEX0RBVEFfU1ogNzY4CisjZGVmaW5lIEFSNjAwMl9CT0FSRF9FWFRfREFUQV9TWiAwCisjZGVmaW5lIEFSNjAwM19CT0FSRF9EQVRBX1NaIDEwMjQKKy8qIFJlc2VydmUgMTAyNCBieXRlcyBmb3IgZXh0ZW5kZWQgYm9hcmQgZGF0YSAqLworI2lmIGRlZmluZWQoQVI2MDAyX1JFVjQzKQorI2RlZmluZSBBUjYwMDNfQk9BUkRfRVhUX0RBVEFfU1ogMTAyNAorI2Vsc2UKKyNkZWZpbmUgQVI2MDAzX0JPQVJEX0VYVF9EQVRBX1NaIDc2OAorI2VuZGlmCisjZGVmaW5lIEFSNjAwNF9CT0FSRF9EQVRBX1NaICAgICA3MTY4CisjZGVmaW5lIEFSNjAwNF9CT0FSRF9FWFRfREFUQV9TWiAwCisjZGVmaW5lIEFSOTg4OF9CT0FSRF9EQVRBX1NaICAgICA3MTY4CisjZGVmaW5lIEFSOTg4OF9CT0FSRF9FWFRfREFUQV9TWiAwCisjZGVmaW5lIEFSNjMyMF9CT0FSRF9EQVRBX1NaICAgICA4MTkyCisjZGVmaW5lIEFSNjMyMF9CT0FSRF9FWFRfREFUQV9TWiAwCisjZGVmaW5lIEFSOTAwQl9CT0FSRF9EQVRBX1NaICAgICA3MTY4CisjZGVmaW5lIEFSOTAwQl9CT0FSRF9FWFRfREFUQV9TWiAwCisKKyNkZWZpbmUgQVI2MDAzX1JFVjNfQVBQX1NUQVJUX09WRVJSSURFICAgICAgICAgIDB4OTQ2MTAwCisjZGVmaW5lIEFSNjAwM19SRVYzX0FQUF9MT0FEX0FERFJFU1MgICAgICAgICAgICAweDU0NTAwMAorI2RlZmluZSBBUjYwMDNfUkVWM19CT0FSRF9FWFRfREFUQV9BRERSRVNTICAgICAgMHg1NDIzMzAKKyNkZWZpbmUgQVI2MDAzX1JFVjNfREFUQVNFVF9QQVRDSF9BRERSRVNTICAgICAgIDB4NTdGRjc0CisjZGVmaW5lIEFSNjAwM19SRVYzX1JBTV9SRVNFUlZFX1NJWkUgICAgICAgICAgICA0MDk2CisKKyNkZWZpbmUgQVI2MDA0X1JFVjFfQk9BUkRfREFUQV9BRERSRVNTICAgICAgICAgIDB4NDIzOTAwCisjZGVmaW5lIEFSNjAwNF9SRVYxX1JBTV9SRVNFUlZFX1NJWkUgICAgICAgICAgICAxOTQ1NgorI2RlZmluZSBBUjYwMDRfUkVWMV9EQVRBU0VUX1BBVENIX0FERFJFU1MgICAgICAgMHg0MjUyOTQKKworI2RlZmluZSBBUjYwMDRfUkVWMl9CT0FSRF9EQVRBX0FERFJFU1MgICAgICAgICAgMHg0MjY0MDAKKyNkZWZpbmUgQVI2MDA0X1JFVjJfUkFNX1JFU0VSVkVfU0laRSAgICAgICAgICAgIDcxNjgKKyNkZWZpbmUgQVI2MDA0X1JFVjJfREFUQVNFVF9QQVRDSF9BRERSRVNTICAgICAgIDB4NDM1Mjk0CisKKyNkZWZpbmUgQVI2MDA0X1JFVjVfQk9BUkRfREFUQV9BRERSRVNTICAgICAgICAgIDB4NDM2NDAwCisjZGVmaW5lIEFSNjAwNF9SRVY1X1JBTV9SRVNFUlZFX1NJWkUgICAgICAgICAgICA3MTY4CisjZGVmaW5lIEFSNjAwNF9SRVY1X0RBVEFTRVRfUEFUQ0hfQUREUkVTUyAgICAgICAweDQzNzg2MAorCisvKiBSZXNlcnZlIDRLIGZvciBPVEEgdGVzdCBzY3JpcHQgKi8KKyNkZWZpbmUgQVI2MDA0X1JFVjFfUkFNX1JFU0VSVkVfU0laRV9GT1JfVEVTVF9TQ1JJUFQgICAgNDA5NgorI2RlZmluZSBBUjYwMDRfUkVWMV9URVNUX1NDUklQVF9BRERSRVNTICAgICAgIDB4NDIyOTAwCisKKy8qICMgb2YgQV9VSU5UMzIgZW50cmllcyBpbiB0YXJncmVncywgdXNlZCBieSBESUFHX0ZFVENIX1RBUkdfUkVHUyAqLworI2RlZmluZSBBUjYwMDNfRkVUQ0hfVEFSR19SRUdTX0NPVU5UIDY0CisjZGVmaW5lIEFSNjAwNF9GRVRDSF9UQVJHX1JFR1NfQ09VTlQgNjQKKyNkZWZpbmUgQVI5ODg4X0ZFVENIX1RBUkdfUkVHU19DT1VOVCA2NAorI2RlZmluZSBBUjYzMjBfRkVUQ0hfVEFSR19SRUdTX0NPVU5UIDY0CisjZGVmaW5lIEFSOTAwQl9GRVRDSF9UQVJHX1JFR1NfQ09VTlQgNjQKKworI2VuZGlmIC8qICFfX0FTU0VNQkxFUl9fICovCisKKyNpZm5kZWYgQVRIX1RBUkdFVAorI2luY2x1ZGUgImF0aGVuZHBhY2suaCIKKyNlbmRpZgorCisjZW5kaWYgLyogX19UQVJHQUREUlNfSF9fICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL3RhcmdjZmcuaCBiL3RhcmdldC9pbmMvdGFyZ2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYThkNDEKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL3RhcmdjZmcuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fVEFSR0NGR19IX18KKyNkZWZpbmUgX19UQVJHQ0ZHX0hfXworCisjaWYgZGVmaW5lZChBVEhfVEFSR0VUKQorI2luY2x1ZGUgPG9zYXBpLmg+ICAgICAgICAgICAgICAvKiBBX1VJTlQzMiAqLworI2Vsc2UKKyNpbmNsdWRlIDxhX3R5cGVzLmg+ICAgICAgICAgICAgLyogQV9VSU5UMzIgKi8KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfdGFyZ2NmZ190IHsKKwlBX1VJTlQzMiBudW1fdmRldjsKKwlBX1VJTlQzMiBudW1fcGVlcnM7CisJQV9VSU5UMzIgbnVtX3BlZXJfYXN0OworCUFfVUlOVDMyIG51bV9wZWVyX2tleXM7CisJQV9VSU5UMzIgbnVtX3BlZXJfdGlkOworCUFfVUlOVDMyIG51bV9tY2FzdF9rZXlzOworCUFfVUlOVDMyIG51bV90eDsKKwlBX1VJTlQzMiBudW1fcng7CisJQV9VSU5UMzIgbnVtX21nbXRfdHg7CisJQV9VSU5UMzIgbnVtX21nbXRfcng7CisJQV9VSU5UMzIgdHhfY2hhaW5fbWFzazsKKwlBX1VJTlQzMiByeF9jaGFpbl9tYXNrOworCUFfVUlOVDMyIG92ZXJyaWRlOyAgICAgIC8qIE92ZXJyaWRlIHRhcmdldCB3aXRoIHRoZSB2YWx1ZXMgc3VwcGxpZWQgYWJvdmUgKi8KK30gdGFyZ2NmZ190OworCisjZW5kaWYgLyogX19UQVJHQ0ZHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy93YWxfcnhfZGVzYy5oIGIvdGFyZ2V0L2luYy93YWxfcnhfZGVzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Y2Q1MGQKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL3dhbF9yeF9kZXNjLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1dBTF9SWF9ERVNDX19IXworI2RlZmluZSBfV0FMX1JYX0RFU0NfX0hfCisKKyNpZiBkZWZpbmVkKEFUSF9UQVJHRVQpCisjaW5jbHVkZSA8YXRoZGVmcy5oPiAgICAgICAgICAgIC8qIEFfVUlOVDggKi8KKyNlbHNlCisjaW5jbHVkZSA8YV90eXBlcy5oPiAgICAgICAgICAgIC8qIEFfVUlOVDggKi8KKyNlbmRpZgorCisvKgorICogQXMgdGhpcyBoZWFkZXIgaXMgdXNlZCBieSBob3N0IGFsc28sCisgKiBhbmQgaG9zdCB3aWxsIGFjY2VzcyB0YXJnZXQgcmVnaXN0ZXJzIGJ5IHRhcmdldCByZWcgdGJsLAorICogc28gZGlzYWJsZSBkaXJlY3QtcmVmZXJlbmNlIGhlcmUgZm9yIGhvc3QuCisgKgorICovCisjaWYgIWRlZmluZWQoQVRIX1BFUkZfUFdSX09GRkxPQUQpCisvKiBIVyByeCBkZXNjcmlwdG9yIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8aHcvbWFjX2Rlc2NyaXB0b3JzL3J4X2F0dGVudGlvbi5oPgorI2luY2x1ZGUgPGh3L21hY19kZXNjcmlwdG9ycy9yeF9mcmFnX2luZm8uaD4KKyNpbmNsdWRlIDxody9tYWNfZGVzY3JpcHRvcnMvcnhfbXNkdV9zdGFydC5oPgorI2luY2x1ZGUgPGh3L21hY19kZXNjcmlwdG9ycy9yeF9tc2R1X2VuZC5oPgorI2luY2x1ZGUgPGh3L21hY19kZXNjcmlwdG9ycy9yeF9tcGR1X3N0YXJ0Lmg+CisjaW5jbHVkZSA8aHcvbWFjX2Rlc2NyaXB0b3JzL3J4X21wZHVfZW5kLmg+CisjaW5jbHVkZSA8aHcvbWFjX2Rlc2NyaXB0b3JzL3J4X3BwZHVfc3RhcnQuaD4KKyNpbmNsdWRlIDxody9tYWNfZGVzY3JpcHRvcnMvcnhfcHBkdV9lbmQuaD4KKy8qCisgKiBUaGlzIHN0cnVjdCBkZWZpbmVzIHRoZSBiYXNpYyBkZXNjcmlwdG9yIGluZm9ybWF0aW9uLCB3aGljaCBpcworICogd3JpdHRlbiBieSB0aGUgMTFhYyBIVyBNQUMgaW50byB0aGUgV0FMJ3Mgcnggc3RhdHVzIGRlc2NyaXB0b3IKKyAqIHJpbmcuCisgKi8KK3N0cnVjdCBod19yeF9kZXNjX2Jhc2UgeworCXN0cnVjdCByeF9hdHRlbnRpb24gYXR0ZW50aW9uOworCXN0cnVjdCByeF9mcmFnX2luZm8gZnJhZ19pbmZvOworCXN0cnVjdCByeF9tcGR1X3N0YXJ0IG1wZHVfc3RhcnQ7CisJc3RydWN0IHJ4X21zZHVfc3RhcnQgbXNkdV9zdGFydDsKKwlzdHJ1Y3QgcnhfbXNkdV9lbmQgbXNkdV9lbmQ7CisJc3RydWN0IHJ4X21wZHVfZW5kIG1wZHVfZW5kOworCXN0cnVjdCByeF9wcGR1X3N0YXJ0IHBwZHVfc3RhcnQ7CisJc3RydWN0IHJ4X3BwZHVfZW5kIHBwZHVfZW5kOworfTsKKyNlbmRpZgorCisvKgorICogVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgYmFzaWMgTVNEVSByeCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgRlcuCisgKi8KK3N0cnVjdCBmd19yeF9kZXNjX2Jhc2UgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUFfVUlOVDggZGlzY2FyZCA6IDEsCisJCQkJZm9yd2FyZCA6IDEsCisJCQkJYW55X2VyciA6IDEsCisJCQkJZHVwX2VyciA6IDEsIHJlc2VydmVkIDogMSwgaW5zcGVjdCA6IDEsIGV4dGVuc2lvbiA6IDI7CisJCX0gYml0czsKKwkJQV9VSU5UOCB2YWw7CisJfSB1OworfTsKKworI2RlZmluZSBGV19SWF9ERVNDX0RJU0NBUkRfTSAweDEKKyNkZWZpbmUgRldfUlhfREVTQ19ESVNDQVJEX1MgMAorI2RlZmluZSBGV19SWF9ERVNDX0ZPUldBUkRfTSAweDIKKyNkZWZpbmUgRldfUlhfREVTQ19GT1JXQVJEX1MgMQorI2RlZmluZSBGV19SWF9ERVNDX01JQ19FUlJfTSAweDQKKyNkZWZpbmUgRldfUlhfREVTQ19NSUNfRVJSX1MgMgorI2RlZmluZSBGV19SWF9ERVNDX0RVUF9FUlJfTSAweDgKKyNkZWZpbmUgRldfUlhfREVTQ19EVVBfRVJSX1MgMworI2RlZmluZSBGV19SWF9ERVNDX0lOU1BFQ1RfTSAweDIwCisjZGVmaW5lIEZXX1JYX0RFU0NfSU5TUEVDVF9TIDUKKyNkZWZpbmUgRldfUlhfREVTQ19FWFRfTSAgICAgMHhjMAorI2RlZmluZSBGV19SWF9ERVNDX0VYVF9TICAgICA2CisKKyNkZWZpbmUgRldfUlhfREVTQ19DTlRfMl9CWVRFUyhfZndfZGVzY19jbnQpICAgIChfZndfZGVzY19jbnQpCisKK2VudW0geworCUZXX1JYX0RFU0NfRVhUX05PTkUgPSAwLAorCUZXX1JYX0RFU0NfRVhUX0xST19PTkxZLAorCUZXX1JYX0RFU0NfRVhUX0xST19BTkRfT1RIRVIsCisJRldfUlhfREVTQ19FWFRfT1RIRVIKK307CisKKyNkZWZpbmUgRldfUlhfREVTQ19ESVNDQVJEX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBGV19SWF9ERVNDX0RJU0NBUkRfTSkgPj4gRldfUlhfREVTQ19ESVNDQVJEX1MpCisjZGVmaW5lIEZXX1JYX0RFU0NfRElTQ0FSRF9TRVQoX3ZhciwgX3ZhbCkgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBGV19SWF9ERVNDX0RJU0NBUkRfUykpCisKKyNkZWZpbmUgRldfUlhfREVTQ19GT1JXQVJEX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBGV19SWF9ERVNDX0ZPUldBUkRfTSkgPj4gRldfUlhfREVTQ19GT1JXQVJEX1MpCisjZGVmaW5lIEZXX1JYX0RFU0NfRk9SV0FSRF9TRVQoX3ZhciwgX3ZhbCkgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBGV19SWF9ERVNDX0ZPUldBUkRfUykpCisKKyNkZWZpbmUgRldfUlhfREVTQ19JTlNQRUNUX0dFVChfdmFyKSBcCisJKCgoX3ZhcikgJiBGV19SWF9ERVNDX0lOU1BFQ1RfTSkgPj4gRldfUlhfREVTQ19JTlNQRUNUX1MpCisjZGVmaW5lIEZXX1JYX0RFU0NfSU5TUEVDVF9TRVQoX3ZhciwgX3ZhbCkgXAorCSgoX3ZhcikgfD0gKChfdmFsKSA8PCBGV19SWF9ERVNDX0lOU1BFQ1RfUykpCisKKyNkZWZpbmUgRldfUlhfREVTQ19FWFRfR0VUKF92YXIpIFwKKwkoKChfdmFyKSAmIEZXX1JYX0RFU0NfRVhUX00pID4+IEZXX1JYX0RFU0NfRVhUX1MpCisjZGVmaW5lIEZXX1JYX0RFU0NfRVhUX1NFVChfdmFyLCBfdmFsKSBcCisJKChfdmFyKSB8PSAoKF92YWwpIDw8IEZXX1JYX0RFU0NfRVhUX1MpKQorCisjZW5kaWYgLyogX1dBTF9SWF9ERVNDX19IXyAqLwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy93bGFuX2RlZnMuaCBiL3RhcmdldC9pbmMvd2xhbl9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4OGEzMAotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9pbmMvd2xhbl9kZWZzLmgKQEAgLTAsMCArMSw4MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMCwgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX1dMQU5ERUZTX0hfXworI2RlZmluZSBfX1dMQU5ERUZTX0hfXworCisvKiBBX0NPTVBJTEVfVElNRV9BU1NFUlQgKi8KKyNpbmNsdWRlIDxhX29zYXBpLmg+CisjaW5jbHVkZSA8b3NkZXAuaD4KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBXTEFOIGRlZmluaXRpb25zIHRoYXQgbWF5IGJlIHVzZWQgYWNyb3NzIGJvdGgKKyAqIEhvc3QgYW5kIFRhcmdldCBzb2Z0d2FyZS4KKyAqLworLyoKKyAqIE1BWF9TUEFUSUFMX1NUUkVBTSBzaG91bGQgYmUgZGVmaW5lZCBpbiBhIGZ3Y29uZmlnX3h4eC5oIGZpbGUsCisgKiBidXQgZm9yIG5vdyBwcm92aWRlIGEgZGVmYXVsdCB2YWx1ZSBoZXJlIGluIGNhc2UgaXQncyBub3QgZGVmaW5lZAorICogaW4gdGhlIGZ3Y29uZmlnX3h4eC5oIGZpbGUuCisgKi8KKyNpZm5kZWYgTUFYX1NQQVRJQUxfU1RSRUFNCisjZGVmaW5lIE1BWF9TUEFUSUFMX1NUUkVBTSAzCisjZW5kaWYKKworLyoKKyAqIE1BWF9TUEFUSUFMX1NUUkVBTV9BTlkgLQorICogd2hhdCBpcyB0aGUgbGFyZ2VzdCBudW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zIHRoYXQgYW55IHRhcmdldCBzdXBwb3J0cworICovCisjZGVmaW5lIE1BWF9TUEFUSUFMX1NUUkVBTV9BTlkgNAorCisjaWZuZGVmIENPTkZJR18xNjBNSFpfU1VQUE9SVAorI2RlZmluZSBDT05GSUdfMTYwTUhaX1NVUFBPUlQgMAorI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisJTU9ERV8xMUEgPSAwLCAgICAgICAgICAgLyogMTFhIE1vZGUgKi8KKwlNT0RFXzExRyA9IDEsICAgICAgICAgICAvKiAxMWIvZyBNb2RlICovCisJTU9ERV8xMUIgPSAyLCAgICAgICAgICAgLyogMTFiIE1vZGUgKi8KKwlNT0RFXzExR09OTFkgPSAzLCAgICAgICAvKiAxMWcgb25seSBNb2RlICovCisJTU9ERV8xMU5BX0hUMjAgPSA0LCAgICAgLyogMTFhIEhUMjAgbW9kZSAqLworCU1PREVfMTFOR19IVDIwID0gNSwgICAgIC8qIDExZyBIVDIwIG1vZGUgKi8KKwlNT0RFXzExTkFfSFQ0MCA9IDYsICAgICAvKiAxMWEgSFQ0MCBtb2RlICovCisJTU9ERV8xMU5HX0hUNDAgPSA3LCAgICAgLyogMTFnIEhUNDAgbW9kZSAqLworCU1PREVfMTFBQ19WSFQyMCA9IDgsCisJTU9ERV8xMUFDX1ZIVDQwID0gOSwKKwlNT0RFXzExQUNfVkhUODAgPSAxMCwKKwlNT0RFXzExQUNfVkhUMjBfMkcgPSAxMSwKKwlNT0RFXzExQUNfVkhUNDBfMkcgPSAxMiwKKwlNT0RFXzExQUNfVkhUODBfMkcgPSAxMywKKyNpZiBDT05GSUdfMTYwTUhaX1NVUFBPUlQgIT0gMAorCU1PREVfMTFBQ19WSFQ4MF84MCA9IDE0LAorCU1PREVfMTFBQ19WSFQxNjAgICA9IDE1LAorI2VuZGlmCisKKwlNT0RFX1VOS05PV04sCisJTU9ERV9VTktOT1dOX05PXzE2ME1IWl9TVVBQT1JUID0gMTQsCisJTU9ERV9VTktOT1dOXzE2ME1IWl9TVVBQT1JUID0gMTYsCisJTU9ERV9NQVggICAgICAgID0gTU9ERV9VTktOT1dOLAorCU1PREVfTUFYX05PXzE2MF9NSFpfU1VQUE9SVCA9IE1PREVfVU5LTk9XTl9OT18xNjBNSFpfU1VQUE9SVCwKKwlNT0RFX01BWF8xNjBfTUhaX1NVUFBPUlQgICAgPSBNT0RFX1VOS05PV05fMTYwTUhaX1NVUFBPUlQsCit9IFdMQU5fUEhZX01PREU7CisKKyNpZiBDT05GSUdfMTYwTUhaX1NVUFBPUlQgPT0gMAorQV9DT01QSUxFX1RJTUVfQVNTRVJUKAorCW1vZGVfdW5rbm93bl92YWx1ZV9jb25zaXN0ZW5jeV9DaGVjaywKKwlNT0RFX1VOS05PV04gPT0gTU9ERV9VTktOT1dOX05PXzE2ME1IWl9TVVBQT1JUKTsKKyNlbHNlCitBX0NPTVBJTEVfVElNRV9BU1NFUlQoCisJbW9kZV91bmtub3duX3ZhbHVlX2NvbnNpc3RlbmN5X0NoZWNrLAorCU1PREVfVU5LTk9XTiA9PSBNT0RFX1VOS05PV05fMTYwTUhaX1NVUFBPUlQpOworI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisJVkhUX01PREVfTk9ORSA9IDAsICAgICAgLyogTk9OIFZIVCBNb2RlLCBlLmcuLCBIVCwgRFNTUywgQ0NLICovCisJVkhUX01PREVfMjBNID0gMSwKKwlWSFRfTU9ERV80ME0gPSAyLAorCVZIVF9NT0RFXzgwTSA9IDMsCisJVkhUX01PREVfMTYwTSA9IDQKK30gVkhUX09QRVJfTU9ERTsKKwordHlwZWRlZiBlbnVtIHsKKwlXTEFOXzExQV9DQVBBQklMSVRZID0gMSwKKwlXTEFOXzExR19DQVBBQklMSVRZID0gMiwKKwlXTEFOXzExQUdfQ0FQQUJJTElUWSA9IDMsCit9IFdMQU5fQ0FQQUJJTElUWTsKKworI2lmIGRlZmluZWQoQ09ORklHX0FSOTAwQl9TVVBQT1JUKSB8fCBkZWZpbmVkKEFSOTAwQikKKyNkZWZpbmUgQV9SQVRFTUFTSyBBX1VJTlQ2NAorI2Vsc2UKKyNkZWZpbmUgQV9SQVRFTUFTSyBBX1VJTlQzMgorI2VuZGlmCisKKyNkZWZpbmUgQV9SQVRFTUFTS19OVU1fT0NURVQgKHNpemVvZiAoQV9SQVRFTUFTSykpCisjZGVmaW5lIEFfUkFURU1BU0tfTlVNX0JJVFMgKChzaXplb2YgKEFfUkFURU1BU0spKSA8PCAzKQorCisjaWYgQ09ORklHXzE2ME1IWl9TVVBQT1JUICE9IDAKKyNkZWZpbmUgSVNfTU9ERV9WSFQobW9kZSkgKCgobW9kZSkgPT0gTU9ERV8xMUFDX1ZIVDIwKSB8fCBcCisJKChtb2RlKSA9PSBNT0RFXzExQUNfVkhUNDApICAgICB8fCBcCisJKChtb2RlKSA9PSBNT0RFXzExQUNfVkhUODApICAgICB8fCBcCisJKChtb2RlKSA9PSBNT0RFXzExQUNfVkhUODBfODApIHx8IFwKKwkoKG1vZGUpID09IE1PREVfMTFBQ19WSFQxNjApKQorI2Vsc2UKKyNkZWZpbmUgSVNfTU9ERV9WSFQobW9kZSkgKCgobW9kZSkgPT0gTU9ERV8xMUFDX1ZIVDIwKSB8fCBcCisJCQkgICAoKG1vZGUpID09IE1PREVfMTFBQ19WSFQ0MCkgfHwgXAorCQkJICAgKChtb2RlKSA9PSBNT0RFXzExQUNfVkhUODApKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfTU9ERV9WSFRfMkcobW9kZSkgKCgobW9kZSkgPT0gTU9ERV8xMUFDX1ZIVDIwXzJHKSB8fAlcCisJCQkgICAgICAoKG1vZGUpID09IE1PREVfMTFBQ19WSFQ0MF8yRykgfHwJXAorCQkJICAgICAgKChtb2RlKSA9PSBNT0RFXzExQUNfVkhUODBfMkcpKQorCisjZGVmaW5lIElTX01PREVfMTFBKG1vZGUpICAgICAgICgoKG1vZGUpID09IE1PREVfMTFBKSB8fCBcCisJCQkJICgobW9kZSkgPT0gTU9ERV8xMU5BX0hUMjApIHx8IFwKKwkJCQkgKChtb2RlKSA9PSBNT0RFXzExTkFfSFQ0MCkgfHwgXAorCQkJCSAoSVNfTU9ERV9WSFQobW9kZSkpKQorCisjZGVmaW5lIElTX01PREVfMTFCKG1vZGUpICAgICAgICgobW9kZSkgPT0gTU9ERV8xMUIpCisjZGVmaW5lIElTX01PREVfMTFHKG1vZGUpICAgICAgICgoKG1vZGUpID09IE1PREVfMTFHKSB8fCBcCisJCQkJICgobW9kZSkgPT0gTU9ERV8xMUdPTkxZKSB8fCBcCisJCQkJICgobW9kZSkgPT0gTU9ERV8xMU5HX0hUMjApIHx8IFwKKwkJCQkgKChtb2RlKSA9PSBNT0RFXzExTkdfSFQ0MCkgfHwgXAorCQkJCSAoSVNfTU9ERV9WSFRfMkcobW9kZSkpKQorI2RlZmluZSBJU19NT0RFXzExR04obW9kZSkgICAgICAoKChtb2RlKSA9PSBNT0RFXzExTkdfSFQyMCkgfHwgXAorCQkJCSAoKG1vZGUpID09IE1PREVfMTFOR19IVDQwKSkKKyNkZWZpbmUgSVNfTU9ERV8xMUdPTkxZKG1vZGUpICAgKChtb2RlKSA9PSBNT0RFXzExR09OTFkpCisKK2VudW0geworCS8qIDExYSBjaGFubmVscyAqLworCVJFR0RNTl9NT0RFXzExQSAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorCS8qIDExYSB0dXJiby1vbmx5IGNoYW5uZWxzICovCisJUkVHRE1OX01PREVfVFVSQk8gICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisJLyogMTFiIGNoYW5uZWxzICovCisJUkVHRE1OX01PREVfMTFCICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisJLyogMTFnIGNoYW5uZWxzIChPRkRNIG9ubHkpICovCisJUkVHRE1OX01PREVfUFVSRUcgICAgICAgICAgICA9IDB4MDAwMDAwMDgsCisJLyogWFhYIGhpc3RvcmljYWwgKi8KKwlSRUdETU5fTU9ERV8xMUcgICAgICAgICAgICAgID0gMHgwMDAwMDAwOCwKKwkvKiAxMWcrVHVyYm8gY2hhbm5lbHMgKi8KKwlSRUdETU5fTU9ERV8xMDhHICAgICAgICAgICAgID0gMHgwMDAwMDAyMCwKKwkvKiAxMWErVHVyYm8gY2hhbm5lbHMgKi8KKwlSRUdETU5fTU9ERV8xMDhBICAgICAgICAgICAgID0gMHgwMDAwMDA0MCwKKwkvKiBYUiBjaGFubmVscyAqLworCVJFR0RNTl9NT0RFX1hSICAgICAgICAgICAgICAgPSAweDAwMDAwMTAwLAorCS8qIDExQSBoYWxmIHJhdGUgY2hhbm5lbHMgKi8KKwlSRUdETU5fTU9ERV8xMUFfSEFMRl9SQVRFICAgID0gMHgwMDAwMDIwMCwKKwkvKiAxMUEgcXVhcnRlciByYXRlIGNoYW5uZWxzICovCisJUkVHRE1OX01PREVfMTFBX1FVQVJURVJfUkFURSA9IDB4MDAwMDA0MDAsCisJLyogMTFOLUcgSFQyMCBjaGFubmVscyAqLworCVJFR0RNTl9NT0RFXzExTkdfSFQyMCAgICAgICAgPSAweDAwMDAwODAwLAorCS8qIDExTi1BIEhUMjAgY2hhbm5lbHMgKi8KKwlSRUdETU5fTU9ERV8xMU5BX0hUMjAgICAgICAgID0gMHgwMDAwMTAwMCwKKwkvKiAxMU4tRyBIVDQwICsgY2hhbm5lbHMgKi8KKwlSRUdETU5fTU9ERV8xMU5HX0hUNDBQTFVTICAgID0gMHgwMDAwMjAwMCwKKwkvKiAxMU4tRyBIVDQwIC0gY2hhbm5lbHMgKi8KKwlSRUdETU5fTU9ERV8xMU5HX0hUNDBNSU5VUyAgID0gMHgwMDAwNDAwMCwKKwkvKiAxMU4tQSBIVDQwICsgY2hhbm5lbHMgKi8KKwlSRUdETU5fTU9ERV8xMU5BX0hUNDBQTFVTICAgID0gMHgwMDAwODAwMCwKKwkvKiAxMU4tQSBIVDQwIC0gY2hhbm5lbHMgKi8KKwlSRUdETU5fTU9ERV8xMU5BX0hUNDBNSU5VUyAgID0gMHgwMDAxMDAwMCwKKwkvKiA1R2h6LCBWSFQyMCAqLworCVJFR0RNTl9NT0RFXzExQUNfVkhUMjAgICAgICAgPSAweDAwMDIwMDAwLAorCS8qIDVHaHosIFZIVDQwICsgY2hhbm5lbHMgKi8KKwlSRUdETU5fTU9ERV8xMUFDX1ZIVDQwUExVUyAgID0gMHgwMDA0MDAwMCwKKwkvKiA1R2h6ICBWSFQ0MCAtIGNoYW5uZWxzICovCisJUkVHRE1OX01PREVfMTFBQ19WSFQ0ME1JTlVTICA9IDB4MDAwODAwMDAsCisJLyogNUdoeiwgVkhUODAgY2hhbm5lbHMgKi8KKwlSRUdETU5fTU9ERV8xMUFDX1ZIVDgwICAgICAgID0gMHgwMDAxMDAwMDAsCisJUkVHRE1OX01PREVfMTFBQ19WSFQyMF8yRyAgICA9IDB4MDAwMjAwMDAwLCAvKiAyR2h6LCBWSFQyMCAqLworCVJFR0RNTl9NT0RFXzExQUNfVkhUNDBfMkcgICAgPSAweDAwMDQwMDAwMCwgLyogMkdoeiwgVkhUNDAgKi8KKwlSRUdETU5fTU9ERV8xMUFDX1ZIVDgwXzJHICAgID0gMHgwMDA4MDAwMDAsIC8qIDJHaHosIFZIVDgwICovCisJUkVHRE1OX01PREVfMTFBQ19WSFQxNjAgICAgICA9IDB4MDAxMDAwMDAwLCAvKiA1R2h6LCBWSFQxNjAgKi8KK307CisKKyNkZWZpbmUgUkVHRE1OX01PREVfQUxMICgweEZGRkZGRkZGKQkvKiBSRUdETU5fTU9ERV9BTEwgaXMgZGVmaW5lZCBvdXQgb2YgdGhlIGVudW0KKwkJCQkJCQkJCQkgKiB0byBwcmV2ZW50IHRoZSBBUk0gY29tcGlsZSAid2FybmluZyAjNjY6CisJCQkJCQkJCQkJICogZW51bWVyYXRpb24gdmFsdWUgaXMgb3V0IG9mIGludCByYW5nZSIKKwkJCQkJCQkJCQkgKiBBbnl3YXksIHRoaXMgaXMgYSBCSVQtT1Igb2YgYWxsIHBvc3NpYmxlIHZhbHVlcy4KKwkJCQkJCQkJCQkgKi8KKworI2RlZmluZSBSRUdETU5fQ0FQMV9DSEFOX0hBTEZfUkFURSAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBSRUdETU5fQ0FQMV9DSEFOX1FVQVJURVJfUkFURSAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBSRUdETU5fQ0FQMV9DSEFOX0hBTDQ5R0haICAgICAgICAgMHgwMDAwMDAwNAorCisvKiByZWd1bGF0b3J5IGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBSRUdETU5fRUVQUk9NX0VFUkVHQ0FQX0VOX0ZDQ19NSURCQU5EICAgMHgwMDQwCisjZGVmaW5lIFJFR0RNTl9FRVBST01fRUVSRUdDQVBfRU5fS0tfVTFfRVZFTiAgICAweDAwODAKKyNkZWZpbmUgUkVHRE1OX0VFUFJPTV9FRVJFR0NBUF9FTl9LS19VMiAgICAgICAgIDB4MDEwMAorI2RlZmluZSBSRUdETU5fRUVQUk9NX0VFUkVHQ0FQX0VOX0tLX01JREJBTkQgICAgMHgwMjAwCisjZGVmaW5lIFJFR0RNTl9FRVBST01fRUVSRUdDQVBfRU5fS0tfVTFfT0REICAgICAweDA0MDAKKyNkZWZpbmUgUkVHRE1OX0VFUFJPTV9FRVJFR0NBUF9FTl9LS19ORVdfMTFBICAgIDB4MDgwMAorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSV9UTFZUQUdfU1RSVUNfSEFMX1JFR19DQVBBQklMSVRJRVMgKi8KKwlBX1VJTlQzMiBlZXByb21fcmQ7ICAgICAvKiByZWdkb21haW4gdmFsdWUgc3BlY2lmaWVkIGluIEVFUFJPTSAqLworCUFfVUlOVDMyIGVlcHJvbV9yZF9leHQ7IC8qIHJlZ2RvbWFpbiAqLworCUFfVUlOVDMyIHJlZ2NhcDE7ICAgICAgIC8qIENBUDEgY2FwYWJpbGl0aWVzIGJpdCBtYXAuICovCisJQV9VSU5UMzIgcmVnY2FwMjsgICAgICAgLyogUkVHRE1OIEVFUFJPTSBDQVAuICovCisJQV9VSU5UMzIgd2lyZWxlc3NfbW9kZXM7ICAgICAgICAvKiBSRUdETU4gTU9ERSAqLworCUFfVUlOVDMyIGxvd18yZ2h6X2NoYW47CisJQV9VSU5UMzIgaGlnaF8yZ2h6X2NoYW47CisJQV9VSU5UMzIgbG93XzVnaHpfY2hhbjsKKwlBX1VJTlQzMiBoaWdoXzVnaHpfY2hhbjsKK30gSEFMX1JFR19DQVBBQklMSVRJRVM7CisKK3R5cGVkZWYgZW51bSB7CisJV0hBTF9SRUdfRVhUX0ZDQ19NSURCQU5EID0gMCwKKwlXSEFMX1JFR19FWFRfSkFQQU5fTUlEQkFORCA9IDEsCisJV0hBTF9SRUdfRVhUX0ZDQ19ERlNfSFQ0MCA9IDIsCisJV0hBTF9SRUdfRVhUX0pBUEFOX05PTkRGU19IVDQwID0gMywKKwlXSEFMX1JFR19FWFRfSkFQQU5fREZTX0hUNDAgPSA0LAorCVdIQUxfUkVHX0VYVF9GQ0NfQ0hfMTQ0ID0gNSwKK30gV0hBTF9SRUdfRVhUX0JJVE1BUDsKKworLyoKKyAqIFVzZWQgdG8gdXBkYXRlIHJhdGUtY29udHJvbCBsb2dpYyB3aXRoIHRoZSBzdGF0dXMgb2YgdGhlIHR4LWNvbXBsZXRpb24uCisgKiBJbiBob3N0LWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSByYXRlLWNvbnRyb2wgZmVhdHVyZSwgdGhpcyBzdHJ1dHVyZSBpcyB1c2VkIHRvCisgKiBjcmVhdGUgdGhlIHBheWxvYWQgZm9yIEhUVCBtZXNzYWdlL3MgZnJvbSB0YXJnZXQgdG8gaG9zdC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UOCByYXRlQ29kZTsKKwlBX1VJTlQ4IGZsYWdzOworfSBSQVRFX0NPREU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlSQVRFX0NPREUgcHR4X3JjOyAgICAgICAvKiByYXRlIGNvZGUsIGJ3LCBjaGFpbiBtYXNrIHNnaSAqLworCUFfVUlOVDggcmVzZXJ2ZWRbMl07CisJQV9VSU5UMzIgZmxhZ3M7ICAgICAgICAgLyogRW5jb2RlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIGV4Y2Vzc2l2ZQorCQkJCQkJCSAgIHJldHJhbnNtaXNzaW9uLCBhZ2dyZWdhdGUsIHNvbWUgaW5mbworCQkJCQkJCSAgIGZyb20gLjExIGZyYW1lIGNvbnRyb2wsCisJCQkJCQkJICAgU1RCQywgTERQQywgKFNHSSBhbmQgVHggQ2hhaW4gTWFzaworCQkJCQkJCSAgIGFyZSBlbmNvZGVkIGluIHB0eF9yYy0+ZmxhZ3MgZmllbGQpLAorCQkJCQkJCSAgIEFNUERVIHRydW5jYXRpb24gKEJUL3RpbWUgYmFzZWQgZXRjLiksCisJCQkJCQkJICAgUlRTL0NUUyBhdHRlbXB0ICAqLworCUFfVUlOVDMyIG51bV9lbnF1ZWQ7ICAgIC8qICMgb2YgTVBEVXMgKGZvciBub24tQU1QRFUgMSkgZm9yIHRoaXMgcmF0ZSAqLworCUFfVUlOVDMyIG51bV9yZXRyaWVzOyAgIC8qIFRvdGFsICMgb2YgdHJhbnNtaXNzaW9uIGF0dGVtcHQgZm9yIHRoaXMgcmF0ZSAqLworCUFfVUlOVDMyIG51bV9mYWlsZWQ7ICAgIC8qICMgb2YgZmFpbGVkIE1QRFVzIGluIEEtTVBEVSwgMCBvdGhlcndpc2UgKi8KKwlBX1VJTlQzMiBhY2tfcnNzaTsgICAgICAvKiBBQ0sgUlNTSTogYic3Li5iJzAgYXZnIFJTU0kgYWNyb3NzIGFsbCBjaGFpbiAqLworCUFfVUlOVDMyIHRpbWVfc3RhbXA7ICAgIC8qIEFDSyB0aW1lc3RhbXAgKGhlbHBzIGRldGVybWluZSBhZ2UpICovCisJQV9VSU5UMzIgaXNfcHJvYmU7ICAgICAgLyogVmFsaWQgaWYgcHJvYmluZy4gRWxzZSwgMCAqLworCUFfVUlOVDMyIGJhX3dpbl9zaXplOyAgIC8qIGInNy4uYjAsIGJsb2NrIEFjayBXaW5kb3cgc2l6ZSwgYiczMS4uYjggUmVzdmQgKi8KKwlBX1VJTlQzMiBmYWlsZWRfYmFfYm1hcF8wXzMxOyAgIC8qIGZhaWxlZCBCQSBiaXRtYXAgMC4uMzEgKi8KKwlBX1VJTlQzMiBmYWlsZWRfYmFfYm1hcF8zMl82MzsgIC8qIGZhaWxlZCBCQSBiaXRtYXAgMzIuLjYzICovCisJQV9VSU5UMzIgYm1hcF90cmllZF8wXzMxOyAgICAgICAvKiBlbnF1ZWQgYml0bWFwIDAuLjMxICovCisJQV9VSU5UMzIgYm1hcF90cmllZF8zMl82MzsgICAgICAvKiBlbnF1ZWQgYml0bWFwIDMyLi42MyAqLworfSBSQ19UWF9ET05FX1BBUkFNUzsKKworI2RlZmluZSBSQ19TRVRfVFhfRE9ORV9JTkZPKF9kc3QsIF9yYywgX2YsIF9ucSwgX25yLCBfbmYsIF9yc3NpLCBfdHMpIFwKKwlkbyB7CQkJCQkJCQkgIFwKKwkJKF9kc3QpLnB0eF9yYy5yYXRlQ29kZSA9IChfcmMpLnJhdGVDb2RlOwkJICAgICAgXAorCQkoX2RzdCkucHR4X3JjLmZsYWdzICAgID0gKF9yYykuZmxhZ3M7CQkJICAgICAgXAorCQkoX2RzdCkuZmxhZ3MgICAgICAgICAgID0gKF9mKTsJCQkJICAgICAgXAorCQkoX2RzdCkubnVtX2VucXVlZCAgICAgID0gKF9ucSk7CQkJCSAgICAgIFwKKwkJKF9kc3QpLm51bV9yZXRyaWVzICAgICA9IChfbnIpOwkJCQkgICAgICBcCisJCShfZHN0KS5udW1fZmFpbGVkICAgICAgPSAoX25mKTsJCQkJICAgICAgXAorCQkoX2RzdCkuYWNrX3Jzc2kgICAgICAgID0gKF9yc3NpKTsJCQkgICAgICBcCisJCShfZHN0KS50aW1lX3N0YW1wICAgICAgPSAoX3RzKTsJCQkJICAgICAgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUkNfU0VUX1RYQkZfRE9ORV9JTkZPKF9kc3QsIF9mKQkJCQkJXAorCWRvIHsJCQkJCQkJCSAgICBcCisJCShfZHN0KS5mbGFncyAgICAgICAgICAgfD0gKF9mKTsJCQkJCVwKKwl9IHdoaWxlICgwKQorCisvKiBOT1RFOiBOVU1fRFlOX0JXIGFuZCBOVU1fU0NIRURfRU5UUklFUyBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0IGJyZWFraW5nIFdNSSBDb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIE5VTV9TQ0hFRF9FTlRSSUVTICAgICAgICAgICAyCisjZGVmaW5lIE5VTV9EWU5fQldfTUFYICAgICAgICAgICAgICA0CisKKy8qIFNvbWUgcHJvZHVjdHMgb25seSB1c2UgMjAvNDAvODA7IHNvbWUgdXNlIDIwLzQwLzgwLzE2MCAqLworI2lmbmRlZiBOVU1fRFlOX0JXCisvKiBkZWZhdWx0OiBzdXBwb3J0IHVwIHRocm91Z2ggODAgTUh6ICovCisjZGVmaW5lIE5VTV9EWU5fQlcgICAgICAgICAgICAgICAgICAzCisjZW5kaWYKKworI2RlZmluZSBOVU1fRFlOX0JXX01BU0sgICAgICAgICAgICAgMHgzCisKKyNkZWZpbmUgUFJPRF9TQ0hFRF9CV19FTlRSSUVTICAgICAgIChOVU1fU0NIRURfRU5UUklFUyAqIE5VTV9EWU5fQlcpCit0eXBlZGVmIEFfVUlOVDggQV9SQVRFOworCisjaWYgTlVNX0RZTl9CVyAgPiA0CisvKiBFeHRlbmQgcmF0ZSB0YWJsZSBtb2R1bGUgZmlyc3QqLworI2Vycm9yICJFeHRlbmQgcmF0ZSB0YWJsZSBtb2R1bGUgZmlyc3QiCisjZW5kaWYKKworI2RlZmluZSBNQVhfSUJTU19QRUVSUyAzMgorCisjaWYgZGVmaW5lZChDT05GSUdfQVI5MDBCX1NVUFBPUlQpIHx8IGRlZmluZWQoQVI5MDBCKQordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHBzZHVfbGVuW05VTV9EWU5fQlcgKiBOVU1fU0NIRURfRU5UUklFU107CisJQV9VSU5UMTYgZmxhZ3NbTlVNX1NDSEVEX0VOVFJJRVNdW05VTV9EWU5fQlddOworCUFfUkFURSByaXhbTlVNX1NDSEVEX0VOVFJJRVNdW05VTV9EWU5fQlddOworCUFfVUlOVDggdHBjW05VTV9TQ0hFRF9FTlRSSUVTXVtOVU1fRFlOX0JXXTsKKwlBX1VJTlQzMiBhbnRtYXNrW05VTV9TQ0hFRF9FTlRSSUVTXTsKKwlBX1VJTlQ4IG51bV9tcGR1c1tOVU1fRFlOX0JXICogTlVNX1NDSEVEX0VOVFJJRVNdOworCUFfVUlOVDE2IHR4YmZfY3ZfbGVuOworCUFfVUlOVDMyIHR4YmZfY3ZfcHRyOworCUFfVUlOVDE2IHR4YmZfZmxhZ3M7CisJQV9VSU5UMTYgdHhiZl9jdl9zaXplOworCUFfVUlOVDggdHhiZl9uY19pZHg7CisJQV9VSU5UOCB0cmllc1tOVU1fU0NIRURfRU5UUklFU107CisJQV9VSU5UOCBid19tYXNrW05VTV9TQ0hFRF9FTlRSSUVTXTsKKwlBX1VJTlQ4IG1heF9id1tOVU1fU0NIRURfRU5UUklFU107CisJQV9VSU5UOCBudW1fc2NoZWRfZW50cmllczsKKwlBX1VJTlQ4IHBhcHJkX21hc2s7CisJQV9VSU5UOCBydHNfcml4OworCUFfVUlOVDggc2hfcHJlYW07CisJQV9VSU5UOCBtaW5fc3BhY2luZ18xXzRfdXM7CisJQV9VSU5UOCBmaXhlZF9kZWxpbXM7CisJQV9VSU5UOCBid19pbl9zZXJ2aWNlOworCUFfUkFURSBwcm9iZV9yaXg7CisJQV9VSU5UOCBudW1fdmFsaWRfcmF0ZXM7CisJQV9VSU5UOCBydHNjdHNfdHBjOworfSBSQ19UWF9SQVRFX1NDSEVEVUxFOworCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHBzZHVfbGVuW05VTV9EWU5fQlcgKiBOVU1fU0NIRURfRU5UUklFU107CisJQV9VSU5UMTYgZmxhZ3NbTlVNX0RZTl9CVyAqIE5VTV9TQ0hFRF9FTlRSSUVTXTsKKwlBX1JBVEUgcml4W05VTV9EWU5fQlcgKiBOVU1fU0NIRURfRU5UUklFU107CisJQV9VSU5UOCB0cGNbTlVNX0RZTl9CVyAqIE5VTV9TQ0hFRF9FTlRSSUVTXTsKKwlBX1VJTlQ4IG51bV9tcGR1c1tOVU1fRFlOX0JXICogTlVNX1NDSEVEX0VOVFJJRVNdOworCUFfVUlOVDMyIGFudG1hc2tbTlVNX1NDSEVEX0VOVFJJRVNdOworCUFfVUlOVDMyIHR4YmZfY3ZfcHRyOworCUFfVUlOVDE2IHR4YmZfY3ZfbGVuOworCUFfVUlOVDggdHJpZXNbTlVNX1NDSEVEX0VOVFJJRVNdOworCUFfVUlOVDggbnVtX3ZhbGlkX3JhdGVzOworCUFfVUlOVDggcGFwcmRfbWFzazsKKwlBX1VJTlQ4IHJ0c19yaXg7CisJQV9VSU5UOCBzaF9wcmVhbTsKKwlBX1VJTlQ4IG1pbl9zcGFjaW5nXzFfNF91czsKKwlBX1VJTlQ4IGZpeGVkX2RlbGltczsKKwlBX1VJTlQ4IGJ3X2luX3NlcnZpY2U7CisJQV9SQVRFIHByb2JlX3JpeDsKK30gUkNfVFhfUkFURV9TQ0hFRFVMRTsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMTYgZmxhZ3NbTlVNX0RZTl9CVyAqIE5VTV9TQ0hFRF9FTlRSSUVTXTsKKwlBX1JBVEUgcml4W05VTV9EWU5fQlcgKiBOVU1fU0NIRURfRU5UUklFU107CisjaWZkZWYgRFlOX1RQQ19FTkFCTEUKKwlBX1VJTlQ4IHRwY1tOVU1fRFlOX0JXICogTlVNX1NDSEVEX0VOVFJJRVNdOworI2VuZGlmCisjaWZkZWYgU0VDVE9SRURfQU5URU5OQQorCUFfVUlOVDMyIGFudG1hc2tbTlVNX1NDSEVEX0VOVFJJRVNdOworI2VuZGlmCisJQV9VSU5UOCB0cmllc1tOVU1fU0NIRURfRU5UUklFU107CisJQV9VSU5UOCBudW1fdmFsaWRfcmF0ZXM7CisJQV9VSU5UOCBydHNfcml4OworCUFfVUlOVDggc2hfcHJlYW07CisJQV9VSU5UOCBid19pbl9zZXJ2aWNlOworCUFfUkFURSBwcm9iZV9yaXg7CisJQV9VSU5UOCBkZF9wcm9maWxlOworfSBSQ19UWF9SQVRFX0lORk87CisKKy8qCisgKiBUZW1wb3JhcmlseSBjb250aW51ZSB0byBwcm92aWRlIHRoZSBXSEFMX1JDX0lOSVRfUkNfTUFTS1MgZGVmIGluIHdsYW5fZGVmc2gKKyAqIGZvciBvbGRlciB0YXJnZXRzLgorICogVGhlIFdIQUxfUlhfSU5JVF9SQ19NQVNLUyBtYWNybyBkZWYgbmVlZHMgdG8gYmUgbW92ZWQgaW50byByYXRlY3RybF8xMWFjLmgKKyAqIGZvciBhbGwgdGFyZ2V0cywgYnV0IHVudGlsIHRoaXMgaXMgY29tcGxldGUsIHRoZSBXSEFMX1JDX0lOSVRfUkNfTUFTS1MgZGVmCisgKiB3aWxsIGJlIG1haW50YWluZWQgaGVyZSBpbiBpdHMgb2xkIGxvY2F0aW9uLgorICovCisjaWYgQ09ORklHXzE2ME1IWl9TVVBQT1JUID09IDAKKworI2RlZmluZSBXSEFMX1JDX0lOSVRfUkNfTUFTS1MoX3JtKSBkbyB7CQkJCVwKKwlfcm1bV0hBTF9SQ19NQVNLX0lEWF9OT05fSFRdID0gQV9SQVRFTUFTS19PRkRNX0NDSzsJXAorCV9ybVtXSEFMX1JDX01BU0tfSURYX0hUXzIwXSA9IEFfUkFURU1BU0tfSFRfMjA7CQlcCisJX3JtW1dIQUxfUkNfTUFTS19JRFhfSFRfNDBdID0gQV9SQVRFTUFTS19IVF80MDsJCVwKKwlfcm1bV0hBTF9SQ19NQVNLX0lEWF9WSFRfMjBdID0gQV9SQVRFTUFTS19WSFRfMjA7CVwKKwlfcm1bV0hBTF9SQ19NQVNLX0lEWF9WSFRfNDBdID0gQV9SQVRFTUFTS19WSFRfNDA7CVwKKwlfcm1bV0hBTF9SQ19NQVNLX0lEWF9WSFRfODBdID0gQV9SQVRFTUFTS19WSFRfODA7CVwKK30gd2hpbGUgKDApCisjZW5kaWYKKworLyoqCisgKiBzdHJ1Y3V0cmUgZGVzY3JpYmluZyBob3N0IG1lbW9yeSBjaHVuay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dsYW5faG9zdF9tZW1vcnlfY2h1bmsgKi8KKwkvKiogaWQgb2YgdGhlIHJlcXVlc3QgdGhhdCBpcyBwYXNzZWQgdXAgaW4gc2VydmljZSByZWFkeSAqLworCUFfVUlOVDMyIHJlcV9pZDsKKwkvKiogdGhlIHBoeXNpY2FsIGFkZHJlc3MgdGhlIG1lbW9yeSBjaHVuayAqLworCUFfVUlOVDMyIHB0cjsKKwkvKiogc2l6ZSBvZiB0aGUgY2h1bmsgKi8KKwlBX1VJTlQzMiBzaXplOworfSB3bGFuX2hvc3RfbWVtb3J5X2NodW5rOworCisjZGVmaW5lIE5VTV9VTklUU19JU19OVU1fVkRFVlMgICAweDEKKyNkZWZpbmUgTlVNX1VOSVRTX0lTX05VTV9QRUVSUyAgIDB4MgorCisvKioKKyAqIHN0cnVjdHVyZSB1c2VkIGJ5IEZXIGZvciByZXF1ZXN0aW5nIGhvc3QgbWVtb3J5CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JX1RMVlRBR19TVFJVQ193bGFuX2hvc3RfbWVtX3JlcSAqLworCisJLyoqIElEIG9mIHRoZSByZXF1ZXN0ICovCisJQV9VSU5UMzIgcmVxX2lkOworCS8qKiBzaXplIG9mIHRoZSAgb2YgZWFjaCB1bml0ICovCisJQV9VSU5UMzIgdW5pdF9zaXplOworCS8qKgorCSAqIGZsYWdzIHRvICBpbmRpY2F0ZSB0aGF0CisJICogdGhlIG51bWJlciB1bml0cyBpcyBkZXBlbmRlbnQKKwkgKiBvbiBudW1iZXIgb2YgcmVzb3VyY2VzKG51bSB2ZGV2cyBudW0gcGVlcnMgLi4gZXRjKQorCSAqLworCUFfVUlOVDMyIG51bV91bml0X2luZm87CisJLyoKKwkgKiBhY3R1YWwgbnVtYmVyIG9mIHVuaXRzIHRvIGFsbG9jYXRlIC4gaWYgZmxhZ3MgaW4gdGhlIG51bV91bml0X2luZm8KKwkgKiBpbmRpY2F0ZSB0aGF0IG51bWJlciBvZiB1bml0cyBpcyB0aWVkIHRvIG51bWJlciBvZiBhIHBhcnRpY3VsYXIKKwkgKiByZXNvdXJjZSB0byBhbGxvY2F0ZSB0aGVuICBudW1fdW5pdHMgZmlsZWQgaXMgc2V0IHRvIDAgYW5kIGhvc3QKKwkgKiB3aWxsIGRlcml2ZSB0aGUgbnVtYmVyIHVuaXRzIGZyb20gbnVtYmVyIG9mIHRoZSByZXNvdXJjZXMgaXQgaXMKKwkgKiByZXF1ZXN0aW5nLgorCSAqLworCUFfVUlOVDMyIG51bV91bml0czsKK30gd2xhbl9ob3N0X21lbV9yZXE7CisKK3R5cGVkZWYgZW51bSB7CisJSUdOT1JFX0RUSU0gPSAweDAxLAorCU5PUk1BTF9EVElNID0gMHgwMiwKKwlTVElDS19EVElNID0gMHgwMywKKwlBVVRPX0RUSU0gPSAweDA0LAorfSBCRUFDT05fRFRJTV9QT0xJQ1k7CisKKy8qIER1cmluZyB0ZXN0IGl0IGlzIG9ic2VydmVkIHRoYXQgNiAqIDQwMCA9IDI0MDAgY2FuCisgKiBiZSBhbGxvY2VkIGluIGFkZGl0aW9uIHRvIENGR19UR1RfTlVNX01TRFVfREVTQy4KKyAqIElmIHRoZXJlIGlzIGFueSBjaGFuZ2UgbWVtb3J5IHJlcXVpcmVtZW50LCB0aGlzIG51bWJlcgorICogbmVlZHMgdG8gYmUgcmV2aXNpdGVkLiAqLworI2RlZmluZSBUT1RBTF9WT1dfQUxMT0NBQkxFIDI0MDAKKyNkZWZpbmUgVk9XX0RFU0NfR1JBQl9NQVggODAwCisKKyNkZWZpbmUgVk9XX0dFVF9OVU1fVklfU1RBKHZvd19jb25maWcpICgoKHZvd19jb25maWcpICYgMHhmZmZmMDAwMCkgPj4gMTYpCisjZGVmaW5lIFZPV19HRVRfREVTQ19QRVJfVklfU1RBKHZvd19jb25maWcpICgodm93X2NvbmZpZykgJiAweDAwMDBmZmZmKQorCisvKioqVE9ETyEhISBHZXQgdGhlc2UgdmFsdWVzIGR5bmFtaWNhbGx5IGluIFdNSV9SRUFEWSBldmVudCBhbmQgdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgbWVtIHJlcSovCisvKiBzaXplIGluIGJ5dGVzIHJlcXVpcmVkIGZvciBtc2R1IGRlc2NyaXB0b3IuIElmIGl0IGNoYW5nZXMsIHRoaXMgc2hvdWxkIGJlIHVwZGF0ZWQuIExBUkdFX0FQCisgKiBjYXNlIGlzIG5vdCBjb25zaWRlcmVkLiBMQVJHRV9BUCBpcyBkaXNhYmxlZCB3aGVuIFZvVyBpcyBlbmFibGVkLiovCisjZGVmaW5lIE1TRFVfREVTQ19TSVpFIDIwCisKKy8qIHNpemUgaW4gYnl0ZXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBhIHBlZXIgaW4gdGFyZ2V0LgorICogVGhpcyBvYnRhaW5lZCBieSBjb25zaWRlcmluZyBUd28gdGlkcyBwZXIgcGVlci4KKyAqIHBlZXIgc3RydWN0dXJlID0gMTY4IGJ5dGVzCisgKiB0aWQgPSA5NiBieXRlcyAocGVyIHN0YSAyIG1lYW5zIHdlIG5lZWQgMTkyIGJ5dGVzKQorICogcGVlcl9jYiA9IDE2ICogMgorICoga2V5ID0gNTIgKiAyCisgKiBBU1QgPSAxMiAqIDIKKyAqIHJhdGUsIHJlb3JkZXIuLiA9IDM4NAorICogc21hcnQgYW50ZW5uYSA9IDUwCisgKi8KKyNkZWZpbmUgTUVNT1JZX1JFUV9GT1JfUEVFUiA4MDAKKworLyoKKyAqIE5COiBpdCBpcyBpbXBvcnRhbnQgdG8ga2VlcCBhbGwgdGhlIGZpZWxkcyBpbiB0aGUgc3RydWN0dXJlIGR3b3JkIGxvbmcKKyAqIHNvIHRoYXQgaXQgaXMgZWFzeSB0byBoYW5kbGUgdGhlIHN0YXRpc3RpY3MgaW4gQkUgaG9zdC4KKyAqLworCitzdHJ1Y3Qgd2xhbl9kYmdfdHhfc3RhdHMgeworCS8qIE51bSBIVFQgY29va2llcyBxdWV1ZWQgdG8gZGlzcGF0Y2ggbGlzdCAqLworCUFfSU5UMzIgY29tcF9xdWV1ZWQ7CisJLyogTnVtIEhUVCBjb29raWVzIGRpc3BhdGNoZWQgKi8KKwlBX0lOVDMyIGNvbXBfZGVsaXZlcmVkOworCS8qIE51bSBNU0RVIHF1ZXVlZCB0byBXQUwgKi8KKwlBX0lOVDMyIG1zZHVfZW5xdWVkOworCS8qIE51bSBNUERVIHF1ZXVlIHRvIFdBTCAqLworCUFfSU5UMzIgbXBkdV9lbnF1ZWQ7CisJLyogTnVtIE1TRFVzIGRyb3BwZWQgYnkgV01NIGxpbWl0ICovCisJQV9JTlQzMiB3bW1fZHJvcDsKKwkvKiBOdW0gTG9jYWwgZnJhbWVzIHF1ZXVlZCAqLworCUFfSU5UMzIgbG9jYWxfZW5xdWVkOworCS8qIE51bSBMb2NhbCBmcmFtZXMgZG9uZSAqLworCUFfSU5UMzIgbG9jYWxfZnJlZWQ7CisJLyogTnVtIHF1ZXVlZCB0byBIVyAqLworCUFfSU5UMzIgaHdfcXVldWVkOworCS8qIE51bSBQUERVIHJlYXBlZCBmcm9tIEhXICovCisJQV9JTlQzMiBod19yZWFwZWQ7CisJLyogTnVtIHVuZGVycnVucyAqLworCUFfSU5UMzIgdW5kZXJydW47CisjaWYgZGVmaW5lZChBUjkwMEIpCisJLyogSFcgUGF1c2VkLiAqLworCUFfVUlOVDMyIGh3X3BhdXNlZDsKKyNlbmRpZgorCS8qIE51bSBQUERVcyBjbGVhbmVkIHVwIGluIFRYIGFib3J0ICovCisJQV9JTlQzMiB0eF9hYm9ydDsKKwkvKiBOdW0gTVBEVXMgcmVxdWVkIGJ5IFNXICovCisJQV9JTlQzMiBtcGR1c19yZXF1ZWQ7CisJLyogZXhjZXNzaXZlIHJldHJpZXMgKi8KKwlBX1VJTlQzMiB0eF9rbzsKKyNpZiBkZWZpbmVkKEFSOTAwQikKKwlBX1VJTlQzMiB0eF94cmV0cnk7CisjZW5kaWYKKwkvKiBkYXRhIGh3IHJhdGUgY29kZSAqLworCUFfVUlOVDMyIGRhdGFfcmM7CisJLyogU2NoZWR1bGVyIHNlbGYgdHJpZ2dlcnMgKi8KKwlBX1VJTlQzMiBzZWxmX3RyaWdnZXJzOworCS8qIGZyYW1lcyBkcm9wcGVkIGR1ZSB0byBleGNlc3NpdmUgc3cgcmV0cmllcyAqLworCUFfVUlOVDMyIHN3X3JldHJ5X2ZhaWx1cmU7CisJLyogaWxsZWdhbCByYXRlIHBoeSBlcnJvcnMgICovCisJQV9VSU5UMzIgaWxsZ2xfcmF0ZV9waHlfZXJyOworCS8qIHdhbCBwZGV2IGNvbnRpbm91cyB4cmV0cnkgKi8KKwlBX1VJTlQzMiBwZGV2X2NvbnRfeHJldHJ5OworCS8qIHdhbCBwZGV2IGNvbnRpbm91cyB4cmV0cnkgKi8KKwlBX1VJTlQzMiBwZGV2X3R4X3RpbWVvdXQ7CisJLyogd2FsIHBkZXYgcmVzZXRzICAqLworCUFfVUlOVDMyIHBkZXZfcmVzZXRzOworCS8qIGZyYW1lcyBkcm9wcGVkIGR1ZSB0byBub24tYXZhaWxhYmlsaXR5IG9mIHN0YXRlbGVzcyBUSURzICovCisJQV9VSU5UMzIgc3RhdGVsZXNzX3RpZF9hbGxvY19mYWlsdXJlOworCS8qIFBoWS9CQiB1bmRlcnJ1biAqLworCUFfVUlOVDMyIHBoeV91bmRlcnJ1bjsKKwkvKiBNUERVIGlzIG1vcmUgdGhhbiB0eG9wIGxpbWl0ICovCisJQV9VSU5UMzIgdHhvcF9vdmY7CisjaWYgZGVmaW5lZChBUjkwMEIpCisJLyogTnVtYmVyIG9mIFNlcXVlbmNlcyBwb3N0ZWQgKi8KKwlBX1VJTlQzMiBzZXFfcG9zdGVkOworCS8qIE51bWJlciBvZiBTZXF1ZW5jZXMgZmFpbGVkIHF1ZXVlaW5nICovCisJQV9VSU5UMzIgc2VxX2ZhaWxlZF9xdWV1ZWluZzsKKwkvKiBOdW1iZXIgb2YgU2VxdWVuY2VzIGNvbXBsZXRlZCAqLworCUFfVUlOVDMyIHNlcV9jb21wbGV0ZWQ7CisJLyogTnVtYmVyIG9mIFNlcXVlbmNlcyByZXN0YXJ0ZWQgKi8KKwlBX1VJTlQzMiBzZXFfcmVzdGFydGVkOworCS8qIE51bWJlciBvZiBNVSBTZXF1ZW5jZXMgcG9zdGVkICovCisJQV9VSU5UMzIgbXVfc2VxX3Bvc3RlZDsKKwkvKiBOdW0gTVBEVXMgZmx1c2hlZCBieSBTVywgSFdQQVVTRUQsIFNXIFRYQUJPUlQgKFJlc2V0LGNoYW5uZWwgY2hhbmdlKSAqLworCUFfSU5UMzIgbXBkdXNfc3dfZmx1c2g7CisJLyogTnVtIE1QRFVzIGZpbHRlcmVkIGJ5IEhXLCBhbGwgZmlsdGVyIGNvbmRpdGlvbiAoVFRMIGV4cGlyZWQpICovCisJQV9JTlQzMiBtcGR1c19od19maWx0ZXI7CisJLyogTnVtIE1QRFVzIHRydW5jYXRlZCBieSBQREcgKFRYT1AsIFRCVFQsIFBQRFVfZHVyYXRpb24gYmFzZWQgb24gcmF0ZSwgZHluX2J3KSAqLworCUFfSU5UMzIgbXBkdXNfdHJ1bmNhdGVkOworCS8qIE51bSBNUERVcyB0aGF0IHdhcyB0cmllZCBidXQgZGlkbid0IHJlY2VpdmUgQUNLIG9yIEJBICovCisJQV9JTlQzMiBtcGR1c19hY2tfZmFpbGVkOworCS8qIE51bSBNUERVcyB0aGF0IHdhcyBkcm9wcGVkIGR1IHRvIGV4cGlyeS4gKi8KKwlBX0lOVDMyIG1wZHVzX2V4cGlyZWQ7CisJLyogTnVtIG1jIGRyb3BzICovCisJLyogQV9VSU5UMzIgbWNfZHJvcDsgKi8KKyNlbmRpZgorfTsKKworc3RydWN0IHdsYW5fZGJnX3J4X3N0YXRzIHsKKwkvKiBDbnRzIGFueSBjaGFuZ2UgaW4gcmluZyByb3V0aW5nIG1pZC1wcGR1ICovCisJQV9JTlQzMiBtaWRfcHBkdV9yb3V0ZV9jaGFuZ2U7CisJLyogVG90YWwgbnVtYmVyIG9mIHN0YXR1c2VzIHByb2Nlc3NlZCAqLworCUFfSU5UMzIgc3RhdHVzX3JjdmQ7CisJLyogRXh0cmEgZnJhZ3Mgb24gcmluZ3MgMC0zICovCisJQV9JTlQzMiByMF9mcmFnczsKKwlBX0lOVDMyIHIxX2ZyYWdzOworCUFfSU5UMzIgcjJfZnJhZ3M7CisJQV9JTlQzMiByM19mcmFnczsKKwkvKiBNU0RVcyAvIE1QRFVzIGRlbGl2ZXJlZCB0byBIVFQgKi8KKwlBX0lOVDMyIGh0dF9tc2R1czsKKwlBX0lOVDMyIGh0dF9tcGR1czsKKwkvKiBNU0RVcyAvIE1QRFVzIGRlbGl2ZXJlZCB0byBsb2NhbCBzdGFjayAqLworCUFfSU5UMzIgbG9jX21zZHVzOworCUFfSU5UMzIgbG9jX21wZHVzOworCS8qIEFNU0RVcyB0aGF0IGhhdmUgbW9yZSBNU0RVcyB0aGFuIHRoZSBzdGF0dXMgcmluZyBzaXplICovCisJQV9JTlQzMiBvdmVyc2l6ZV9hbXNkdTsKKwkvKiBOdW1iZXIgb2YgUEhZIGVycm9ycyAqLworCUFfSU5UMzIgcGh5X2VycnM7CisJLyogTnVtYmVyIG9mIFBIWSBlcnJvcnMgZHJvcHMgKi8KKwlBX0lOVDMyIHBoeV9lcnJfZHJvcDsKKwkvKiBOdW1iZXIgb2YgbXBkdSBlcnJvcnMgLSBGQ1MsIE1JQywgRU5DIGV0Yy4gKi8KKwlBX0lOVDMyIG1wZHVfZXJyczsKKyNpZiBkZWZpbmVkKEFSOTAwQikKKwkvKiBOdW1iZXIgb2Ygcnggb3ZlcmZsb3cgZXJyb3JzLiAqLworCUFfSU5UMzIgcnhfb3ZmbF9lcnJzOworI2VuZGlmCit9OworCitzdHJ1Y3Qgd2xhbl9kYmdfbWVtX3N0YXRzIHsKKwlBX1VJTlQzMiBpcmFtX2ZyZWVfc2l6ZTsKKwlBX1VJTlQzMiBkcmFtX2ZyZWVfc2l6ZTsKK307CisKK3N0cnVjdCB3bGFuX2RiZ19wZWVyX3N0YXRzIHsKKworCUFfSU5UMzIgZHVtbXk7ICAgICAgICAgIC8qIFJFTU9WRSBUSElTIE9OQ0UgUkVBTCBQRUVSIFNUQVQgQ09VTlRFUlMgQVJFIEFEREVEICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgbWNzWzEwXTsKKwlBX1VJTlQzMiBzZ2lbMTBdOworCUFfVUlOVDMyIG5zc1s0XTsKKwlBX1VJTlQzMiBuc3RzOworCUFfVUlOVDMyIHN0YmNbMTBdOworCUFfVUlOVDMyIGJ3WzNdOworCUFfVUlOVDMyIHByZWFtWzZdOworCUFfVUlOVDMyIGxkcGM7CisJQV9VSU5UMzIgdHhiZjsKKwlBX1VJTlQzMiBtZ210X3Jzc2k7CisJQV9VSU5UMzIgZGF0YV9yc3NpOworCUFfVUlOVDMyIHJzc2lfY2hhaW4wOworCUFfVUlOVDMyIHJzc2lfY2hhaW4xOworCUFfVUlOVDMyIHJzc2lfY2hhaW4yOworI2lmIGRlZmluZWQoQVI5MDBCKQorCUFfVUlOVDMyIHJzc2lfY2hhaW4zOworI2VuZGlmCit9IHdsYW5fZGJnX3J4X3JhdGVfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgbWNzWzEwXTsKKwlBX1VJTlQzMiBzZ2lbMTBdOworI2lmIGRlZmluZWQoQ09ORklHX0FSOTAwQl9TVVBQT1JUKSB8fCBkZWZpbmVkKEFSOTAwQikKKwlBX1VJTlQzMiBuc3NbNF07CisjZWxzZQorCUFfVUlOVDMyIG5zc1szXTsKKyNlbmRpZgorCUFfVUlOVDMyIHN0YmNbMTBdOworCUFfVUlOVDMyIGJ3WzNdOworCUFfVUlOVDMyIHByZWFtWzRdOworCUFfVUlOVDMyIGxkcGM7CisJQV9VSU5UMzIgcnRzX2NudDsKKwlBX1VJTlQzMiBhY2tfcnNzaTsKK30gd2xhbl9kYmdfdHhfcmF0ZV9pbmZvX3QgOworCisjZGVmaW5lIFdMQU5fTUFYX01DUyAxMAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQV9VSU5UMzIgbWNzW1dMQU5fTUFYX01DU107CisgICAgQV9VSU5UMzIgc2dpW1dMQU5fTUFYX01DU107CisgICAgQV9VSU5UMzIgbnNzW01BWF9TUEFUSUFMX1NUUkVBTV9BTlldOworICAgIEFfVUlOVDMyIG5zdHM7CisgICAgQV9VSU5UMzIgc3RiY1tXTEFOX01BWF9NQ1NdOworICAgIEFfVUlOVDMyIGJ3W05VTV9EWU5fQldfTUFYXTsKKyAgICBBX1VJTlQzMiBwcmVhbVs2XTsKKyAgICBBX1VJTlQzMiBsZHBjOworICAgIEFfVUlOVDMyIHR4YmY7CisgICAgQV9VSU5UMzIgbWdtdF9yc3NpOworICAgIEFfVUlOVDMyIGRhdGFfcnNzaTsKKyAgICBBX1VJTlQzMiByc3NpX2NoYWluMDsKKyAgICBBX1VJTlQzMiByc3NpX2NoYWluMTsKKyAgICBBX1VJTlQzMiByc3NpX2NoYWluMjsKKyAgICBBX1VJTlQzMiByc3NpX2NoYWluMzsKKyAgICBBX1VJTlQzMiByZXNlcnZlZFs4XTsKK30gd2xhbl9kYmdfcnhfcmF0ZV9pbmZvX3YyX3QgOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQV9VSU5UMzIgbWNzW1dMQU5fTUFYX01DU107CisgICAgQV9VSU5UMzIgc2dpW1dMQU5fTUFYX01DU107CisgICAgQV9VSU5UMzIgbnNzW01BWF9TUEFUSUFMX1NUUkVBTV9BTlldOworICAgIEFfVUlOVDMyIHN0YmNbV0xBTl9NQVhfTUNTXTsKKyAgICBBX1VJTlQzMiBid1tOVU1fRFlOX0JXX01BWF07CisgICAgQV9VSU5UMzIgcHJlYW1bNF07CisgICAgQV9VSU5UMzIgbGRwYzsKKyAgICBBX1VJTlQzMiBydHNfY250OworICAgIEFfVUlOVDMyIGFja19yc3NpOworICAgIEFfVUlOVDMyIHJlc2VydmVkWzhdOworfSB3bGFuX2RiZ190eF9yYXRlX2luZm9fdjJfdCA7CisKKyNkZWZpbmUgV0hBTF9EQkdfUEhZX0VSUl9NQVhDTlQgMTgKKyNkZWZpbmUgV0hBTF9EQkdfU0lGU19TVEFUVVNfTUFYQ05UIDgKKyNkZWZpbmUgV0hBTF9EQkdfU0lGU19FUlJfTUFYQ05UIDgKKyNkZWZpbmUgV0hBTF9EQkdfQ01EX1JFU1VMVF9NQVhDTlQgMTAKKyNkZWZpbmUgV0hBTF9EQkdfQ01EX1NUQUxMX0VSUl9NQVhDTlQgNAorI2RlZmluZSBXSEFMX0RCR19GTFVTSF9SRUFTT05fTUFYQ05UIDQwCisKK3R5cGVkZWYgZW51bSB7CisJV0lGSV9VUlJOX1NUQVRTX0ZJUlNUX1BLVCwKKwlXSUZJX1VSUk5fU1RBVFNfQkVUV0VFTl9NUERVLAorCVdJRklfVVJSTl9TVEFUU19XSVRISU5fTVBEVSwKKwlXSEFMX01BWF9VUlJOX1NUQVRTCit9IHdpZmlfdXJybl90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHdsYW5fZGJnX3R4YmZfc25kX3N0YXRzIHsKKwlBX1VJTlQzMiBjYmZfMjBbNF07CisJQV9VSU5UMzIgY2JmXzQwWzRdOworCUFfVUlOVDMyIGNiZl84MFs0XTsKKwlBX1VJTlQzMiBzb3VuZGluZ1s5XTsKK30gd2xhbl9kYmdfdHhiZl9zbmRfc3RhdHNfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgd2xhbl9kYmdfd2lmaTJfZXJyb3Jfc3RhdHMgeworCUFfVUlOVDMyIHVycm5fc3RhdHNbV0hBTF9NQVhfVVJSTl9TVEFUU107CisJQV9VSU5UMzIgZmx1c2hfZXJyc1tXSEFMX0RCR19GTFVTSF9SRUFTT05fTUFYQ05UXTsKKwlBX1VJTlQzMiBzY2hkX3N0YWxsX2VycnNbV0hBTF9EQkdfQ01EX1NUQUxMX0VSUl9NQVhDTlRdOworCUFfVUlOVDMyIHNjaGRfY21kX3Jlc3VsdFtXSEFMX0RCR19DTURfUkVTVUxUX01BWENOVF07CisJQV9VSU5UMzIgc2lmc19zdGF0dXNbV0hBTF9EQkdfU0lGU19TVEFUVVNfTUFYQ05UXTsKKwlBX1VJTlQ4IHBoeV9lcnJzW1dIQUxfREJHX1BIWV9FUlJfTUFYQ05UXTsKKwlBX1VJTlQzMiByeF9yYXRlX2ludmFsOworfSB3bGFuX2RiZ193aWZpMl9lcnJvcl9zdGF0c190OworCit0eXBlZGVmIHN0cnVjdCB3bGFuX2RiZ193aWZpMl9lcnJvcjJfc3RhdHMgeworCUFfVUlOVDMyIHNjaGRfZXJyc1tXSEFMX0RCR19DTURfU1RBTExfRVJSX01BWENOVF07CisJQV9VSU5UMzIgc2lmc19lcnJzW1dIQUxfREJHX1NJRlNfRVJSX01BWENOVF07Cit9IHdsYW5fZGJnX3dpZmkyX2Vycm9yMl9zdGF0c190OworCisjZGVmaW5lIFdMQU5fREJHX1NUQVRTX1NJWkVfVFhCRl9WSFQgMTAKKyNkZWZpbmUgV0xBTl9EQkdfU1RBVFNfU0laRV9UWEJGX0hUIDgKKyNkZWZpbmUgV0xBTl9EQkdfU1RBVFNfU0laRV9UWEJGX09GRE0gOAorI2RlZmluZSBXTEFOX0RCR19TVEFUU19TSVpFX1RYQkZfQ0NLIDcKKwordHlwZWRlZiBzdHJ1Y3Qgd2xhbl9kYmdfdHhiZl9kYXRhX3N0YXRzIHsKKwlBX1VJTlQzMiB0eF90eGJmX3ZodFtXTEFOX0RCR19TVEFUU19TSVpFX1RYQkZfVkhUXTsKKwlBX1VJTlQzMiByeF90eGJmX3ZodFtXTEFOX0RCR19TVEFUU19TSVpFX1RYQkZfVkhUXTsKKwlBX1VJTlQzMiB0eF90eGJmX2h0W1dMQU5fREJHX1NUQVRTX1NJWkVfVFhCRl9IVF07CisJQV9VSU5UMzIgdHhfdHhiZl9vZmRtW1dMQU5fREJHX1NUQVRTX1NJWkVfVFhCRl9PRkRNXTsKKwlBX1VJTlQzMiB0eF90eGJmX2Nja1tXTEFOX0RCR19TVEFUU19TSVpFX1RYQkZfQ0NLXTsKK30gd2xhbl9kYmdfdHhiZl9kYXRhX3N0YXRzX3Q7CisKK3N0cnVjdCB3bGFuX2RiZ190eF9tdV9zdGF0cyB7CisJQV9VSU5UMzIgbXVfc2NoX251c2Vyc18yOworCUFfVUlOVDMyIG11X3NjaF9udXNlcnNfMzsKKwlBX1VJTlQzMiBtdV9tcGR1c19xdWV1ZWRfdXNyWzRdOworCUFfVUlOVDMyIG11X21wZHVzX3RyaWVkX3Vzcls0XTsKKwlBX1VJTlQzMiBtdV9tcGR1c19mYWlsZWRfdXNyWzRdOworCUFfVUlOVDMyIG11X21wZHVzX3JlcXVldWVkX3Vzcls0XTsKKwlBX1VJTlQzMiBtdV9lcnJfbm9fYmFfdXNyWzRdOworCUFfVUlOVDMyIG11X21wZHVfdW5kZXJydW5fdXNyWzRdOworCUFfVUlOVDMyIG11X2FtcGR1X3VuZGVycnVuX3Vzcls0XTsKK307CisKK3N0cnVjdCB3bGFuX2RiZ190eF9zZWxmZ2VuX3N0YXRzIHsKKwlBX1VJTlQzMiBzdV9uZHBhOworCUFfVUlOVDMyIHN1X25kcDsKKwlBX1VJTlQzMiBtdV9uZHBhOworCUFfVUlOVDMyIG11X25kcDsKKwlBX1VJTlQzMiBtdV9icnBvbGxfMTsKKwlBX1VJTlQzMiBtdV9icnBvbGxfMjsKKwlBX1VJTlQzMiBtdV9iYXJfMTsKKwlBX1VJTlQzMiBtdV9iYXJfMjsKKwlBX1VJTlQzMiBjdHNfYnVyc3Q7CisJQV9VSU5UMzIgc3VfbmRwX2VycjsKKwlBX1VJTlQzMiBzdV9uZHBhX2VycjsKKwlBX1VJTlQzMiBtdV9uZHBfZXJyOworCUFfVUlOVDMyIG11X2JycDFfZXJyOworCUFfVUlOVDMyIG11X2JycDJfZXJyOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgd2xhbl9kYmdfc2lmc19yZXNwX3N0YXRzIHsKKwlBX1VJTlQzMiBwc19wb2xsX3RyaWdnZXI7ICAgICAgIC8qIG51bSBwcy1wb2xsIHRyaWdnZXIgZnJhbWVzICovCisJQV9VSU5UMzIgdWFwc2RfdHJpZ2dlcjsgLyogbnVtIHVhcHNkIHRyaWdnZXIgZnJhbWVzICovCisJQV9VSU5UMzIgcWJfZGF0YV90cmlnZ2VyWzJdOyAgICAvKiBudW0gZGF0YSB0cmlnZ2VyIGZyYW1lczsgaWR4IDA6IGV4cGxpY2l0IGFuZCBpZHggMTogaW1wbGljaXQgKi8KKwlBX1VJTlQzMiBxYl9iYXJfdHJpZ2dlclsyXTsgICAgIC8qIG51bSBiYXIgdHJpZ2dlciBmcmFtZXM7ICBpZHggMDogZXhwbGljaXQgYW5kIGlkeCAxOiBpbXBsaWNpdCAqLworCUFfVUlOVDMyIHNpZnNfcmVzcF9kYXRhOyAgICAgICAgLyogbnVtIHBwZHVzIHRyYW5zbWl0dGVkIGF0IFNJRlMgaW50ZXJ2YWwgKi8KKwlBX1VJTlQzMiBzaWZzX3Jlc3BfZXJyOyAvKiBudW0gcHBkdXMgZmFpbGVkIHRvIG1lZXQgU0lGUyByZXNwIHRpbWluZyAqLworfSB3bGFuX2RnYl9zaWZzX3Jlc3Bfc3RhdHNfdDsKKworLyoqIHdsYW5fZGJnX3dpZmkyX2Vycm9yX3N0YXRzX3QgaXMgbm90IGdyb3VwZWQgd2l0aCB0aGUKKyAqICBmb2xsb3dpbmcgc3RydWN0dXJlIGFzIGl0IGlzIGFsbG9jYXRlZCBkaWZmZXJlbnRseSBhbmQgb25seQorICogIGJlbG9uZ3MgdG8gd2hhbAorICovCit0eXBlZGVmIHN0cnVjdCB3bGFuX2RiZ19zdGF0c193aWZpMiB7CisJd2xhbl9kYmdfdHhiZl9zbmRfc3RhdHNfdCB0eGJmX3NuZF9pbmZvOworCXdsYW5fZGJnX3R4YmZfZGF0YV9zdGF0c190IHR4YmZfZGF0YV9pbmZvOworCXN0cnVjdCB3bGFuX2RiZ190eF9zZWxmZ2VuX3N0YXRzIHR4X3NlbGZnZW47CisJc3RydWN0IHdsYW5fZGJnX3R4X211X3N0YXRzIHR4X211OworCXdsYW5fZGdiX3NpZnNfcmVzcF9zdGF0c190IHNpZnNfcmVzcF9pbmZvOworfSB3bGFuX2RiZ193aWZpMl9zdGF0c190OworCit0eXBlZGVmIHN0cnVjdCB7CisJd2xhbl9kYmdfcnhfcmF0ZV9pbmZvX3QgcnhfcGh5X2luZm87CisJd2xhbl9kYmdfdHhfcmF0ZV9pbmZvX3QgdHhfcmF0ZV9pbmZvOworfSB3bGFuX2RiZ19yYXRlX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHdsYW5fZGJnX3J4X3JhdGVfaW5mb192Ml90IHJ4X3BoeV9pbmZvOworICAgIHdsYW5fZGJnX3R4X3JhdGVfaW5mb192Ml90IHR4X3JhdGVfaW5mbzsKK30gd2xhbl9kYmdfcmF0ZV9pbmZvX3YyX3Q7CisKK3N0cnVjdCB3bGFuX2RiZ19zdGF0cyB7CisJc3RydWN0IHdsYW5fZGJnX3R4X3N0YXRzIHR4OworCXN0cnVjdCB3bGFuX2RiZ19yeF9zdGF0cyByeDsKKyNpZiBkZWZpbmVkKEFSOTAwQikKKwlzdHJ1Y3Qgd2xhbl9kYmdfbWVtX3N0YXRzIG1lbTsKKyNlbmRpZgorCXN0cnVjdCB3bGFuX2RiZ19wZWVyX3N0YXRzIHBlZXI7Cit9OworCisjZGVmaW5lIERCR19TVEFUU19NQVhfSFdRX05VTSAxMAorI2RlZmluZSBEQkdfU1RBVFNfTUFYX1RJRF9OVU0gMjAKKyNkZWZpbmUgREJHX1NUQVRTX01BWF9DT05HX05VTSAxNgorc3RydWN0IHdsYW5fZGJnX3R4cV9zdGF0cyB7CisJQV9VSU5UMTYgbnVtX3BrdHNfcXVldWVkW0RCR19TVEFUU19NQVhfSFdRX05VTV07CisJQV9VSU5UMTYgdGlkX2h3X3FkZXB0aFtEQkdfU1RBVFNfTUFYX1RJRF9OVU1dOyAgLyogV0FMX01BWF9USUQgaXMgMjAgKi8KKwlBX1VJTlQxNiB0aWRfc3dfcWRlcHRoW0RCR19TVEFUU19NQVhfVElEX05VTV07ICAvKiBXQUxfTUFYX1RJRCBpcyAyMCAqLworfTsKKworc3RydWN0IHdsYW5fZGJnX3RpZHFfc3RhdHMgeworCUFfVUlOVDMyIHdsYW5fZGJnX3RpZF90eHFfc3RhdHVzOworCXN0cnVjdCB3bGFuX2RiZ190eHFfc3RhdHMgdHhxX3N0OworfTsKKworI2VuZGlmIC8qIF9fV0xBTkRFRlNfSF9fICovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL3dsYW5fbW9kdWxlX2lkcy5oIGIvdGFyZ2V0L2luYy93bGFuX21vZHVsZV9pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjUwZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy93bGFuX21vZHVsZV9pZHMuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfV0xBTl9NT0RVTEVfSURTX0hfCisjZGVmaW5lIF9XTEFOX01PRFVMRV9JRFNfSF8KKworLyogV2xhbiBtb2R1bGUgaWRzICwgZ2xvYmFsIGFjcm9zcyBhbGwgdGhlIG1vZHVsZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJV0xBTl9NT0RVTEVfSURfTUlOID0gMCwKKwlXTEFOX01PRFVMRV9JTkYgPSBXTEFOX01PRFVMRV9JRF9NSU4sIC8qIDB4MDAgKi8KKwlXTEFOX01PRFVMRV9XTUksCisJV0xBTl9NT0RVTEVfU1RBX1BXUlNBVkUsCisJV0xBTl9NT0RVTEVfV0hBTCwKKwlXTEFOX01PRFVMRV9DT0VYLAorCVdMQU5fTU9EVUxFX1JPQU0sCisJV0xBTl9NT0RVTEVfUkVTTUdSX0NIQU5fTUFOQUdFUiwKKwlXTEFOX01PRFVMRV9SRVNNR1IsCisJV0xBTl9NT0RVTEVfVkRFVl9NR1IsCisJV0xBTl9NT0RVTEVfU0NBTiwKKwlXTEFOX01PRFVMRV9SQVRFQ1RSTCwKKwlXTEFOX01PRFVMRV9BUF9QV1JTQVZFLAorCVdMQU5fTU9EVUxFX0JMT0NLQUNLLAorCVdMQU5fTU9EVUxFX01HTVRfVFhSWCwKKwlXTEFOX01PRFVMRV9EQVRBX1RYUlgsCisJV0xBTl9NT0RVTEVfSFRULAorCVdMQU5fTU9EVUxFX0hPU1QsIC8qIDB4MTAgKi8KKwlXTEFOX01PRFVMRV9CRUFDT04sCisJV0xBTl9NT0RVTEVfT0ZGTE9BRCwKKwlXTEFOX01PRFVMRV9XQUwsCisJV0FMX01PRFVMRV9ERSwKKwlXTEFOX01PRFVMRV9QQ0lFTFAsCisJV0xBTl9NT0RVTEVfUlRULAorCVdMQU5fTU9EVUxFX1JFU09VUkNFLAorCVdMQU5fTU9EVUxFX0RDUywKKwlXTEFOX01PRFVMRV9DQUNIRU1HUiwKKwlXTEFOX01PRFVMRV9BTkksCisJV0xBTl9NT0RVTEVfUDJQLAorCVdMQU5fTU9EVUxFX0NTQSwKKwlXTEFOX01PRFVMRV9OTE8sCisJV0xBTl9NT0RVTEVfQ0hBVFRFUiwKKwlXTEFOX01PRFVMRV9XT1csCisJV0xBTl9NT0RVTEVfV0FMX1ZERVYsIC8qIDB4MjAgKi8KKwlXTEFOX01PRFVMRV9XQUxfUERFViwKKwlXTEFOX01PRFVMRV9URVNULAorCVdMQU5fTU9EVUxFX1NUQV9TTVBTLAorCVdMQU5fTU9EVUxFX1NXQk1JU1MsCisJV0xBTl9NT0RVTEVfV01NQUMsCisJV0xBTl9NT0RVTEVfVERMUywKKwlXTEFOX01PRFVMRV9IQiwKKwlXTEFOX01PRFVMRV9UWEJGLAorCVdMQU5fTU9EVUxFX0JBVENIX1NDQU4sCisJV0xBTl9NT0RVTEVfVEhFUk1BTF9NR1IsCisJV0xBTl9NT0RVTEVfUEhZRVJSX0RGUywKKwlXTEFOX01PRFVMRV9STUMsCisJV0xBTl9NT0RVTEVfU1RBVFMsCisJV0xBTl9NT0RVTEVfTkFOLAorCVdMQU5fTU9EVUxFX0lCU1NfUFdSU0FWRSwKKwlXTEFOX01PRFVMRV9ISUZfVUFSVCwgLyogMHgzMCAqLworCVdMQU5fTU9EVUxFX0xQSSwKKwlXTEFOX01PRFVMRV9FWFRTQ0FOLAorCVdMQU5fTU9EVUxFX1VOSVRfVEVTVCwKKwlXTEFOX01PRFVMRV9NTE1FLAorCVdMQU5fTU9EVUxFX1NVUFBMLAorCVdMQU5fTU9EVUxFX0VSRSwKKwlXTEFOX01PRFVMRV9PQ0IsCisJV0xBTl9NT0RVTEVfUlNTSV9NT05JVE9SLAorCVdMQU5fTU9EVUxFX1dQTSwKKwlXTEFOX01PRFVMRV9DU1MsIC8qIDB4M2EgKi8KKwlXTEFOX01PRFVMRV9QUFMsIC8qIDB4M2IgKi8KKwlXTEFOX01PRFVMRV9TQ0FOX0NIX1BSRURJQ1QsIC8qIDB4M2MgKi8KKwlXTEFOX01PRFVMRV9NQVdDLAorCVdMQU5fTU9EVUxFX0NNQ19RTUlDLCAvKiAweDNlICovCisJV0xBTl9NT0RVTEVfRUdBUCwgLyogMHgzZiAqLworCisJV0xBTl9NT0RVTEVfSURfTUFYLAorCVdMQU5fTU9EVUxFX0lEX0lOVkFMSUQgPSBXTEFOX01PRFVMRV9JRF9NQVgsCit9IFdMQU5fTU9EVUxFX0lEOworCisjZW5kaWYgLyogX1dMQU5fTU9EVUxFX0lEU19IXyAqLwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy93bGFuX3RndF9kZWZfY29uZmlnLmggYi90YXJnZXQvaW5jL3dsYW5fdGd0X2RlZl9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmNmNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy93bGFuX3RndF9kZWZfY29uZmlnLmgKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fV0xBTl9UR1RfREVGX0NPTkZJR19IX18KKyNkZWZpbmUgX19XTEFOX1RHVF9ERUZfQ09ORklHX0hfXworCisvKgorICogc2V0IG9mIGRlZmF1bHQgdGFyZ2V0IGNvbmZpZyAsIHRoYXQgY2FuIGJlIG92ZXIgd3JpdHRlbiBieSBwbGF0Zm9ybQorICovCisKKy8qCisgKiBkZWZhdWx0IGxpbWl0IG9mIDggVkFQcyBwZXIgZGV2aWNlLgorICovCisvKiBSb21lIFBSRCBzdXBwb3J0IDMgdmRldnMgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9OVU1fVkRFViAgICAgICAgICAgICAgICAzCisKKy8qCisgKiBXZSB3b3VsZCBuZWVkIDEgQVNUIGVudHJ5IHBlciBwZWVyLiBTY2FsZSBpdCBieSBhIGZhY3RvciBvZiAyIHRvIG1pbmltaXplIGhhc2ggY29sbGlzaW9ucy4KKyAqIFRPRE86IFRoaXMgc2NhbGluZyBmYWN0b3Igd291bGQgYmUgdGFrZW4gY2FyZSBpbnNpZGUgdGhlIFdBTCBpbiB0aGUgZnV0dXJlLgorICovCisjZGVmaW5lIENGR19UR1RfTlVNX1BFRVJfQVNUICAgICAgICAgICAgMgorCisvKiAjIG9mIFdEUyBlbnRyaWVzIHRvIHN1cHBvcnQuCisgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9XRFNfRU5UUklFUyAgICAgICAgICAgICAwCisKKy8qIE1BQyBETUEgYnVyc3Qgc2l6ZS4gMDogMTI4QiAtIGRlZmF1bHQsIDE6IDI1NkIsIDI6IDY0QgorICovCisjZGVmaW5lIENGR19UR1RfREVGQVVMVF9ETUFfQlVSU1RfU0laRSAgIDAKKworLyogRml4ZWQgZGVsaW1pdGVycyB0byBiZSBpbnNlcnRlZCBhZnRlciBldmVyeSBNUERVCisgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9ERUZBVUxUX01BQ19BR0dSX0RFTElNICAgMAorCisvKgorICogVGhpcyB2YWx1ZSBtYXkgbmVlZCB0byBiZSBmaW5lIHR1bmVkLCBidXQgYSBjb25zdGFudCB2YWx1ZSB3aWxsCisgKiBwcm9iYWJseSBhbHdheXMgYmUgYXBwcm9wcmlhdGU7IGl0IGlzIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkgdG8KKyAqIGRldGVybWluZSB0aGlzIHZhbHVlIGR5bmFtaWNhbGx5LgorICovCisjZGVmaW5lIENGR19UR1RfQVNUX1NLSURfTElNSVQgICAgICAgICAgMTYKKworLyoKKyAqIHRvdGFsIG51bWJlciBvZiBwZWVycyBwZXIgZGV2aWNlLgorICovCisjZGVmaW5lIENGR19UR1RfTlVNX1BFRVJTICAgICAgICAgICAgICAgMTQKKworLyoKKyAqIEluIG9mZmxvYWQgbW9kZSB0YXJnZXQgc3VwcG9ydHMgZmVhdHVyZXMgbGlrZSBXT1csIGNoYXR0ZXIgYW5kIG90aGVyCisgKiBwcm90b2NvbCBvZmZsb2Fkcy4gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGVtIHNvbWUgZnVuY3Rpb25hbGl0aWVzIGxpa2UKKyAqIHJlb3JkZXIgYnVmZmVyaW5nLCBQTiBjaGVja2luZyBuZWVkIHRvIGJlIGRvbmUgaW4gdGFyZ2V0LiBUaGlzIGRldGVybWluZXMKKyAqIG1heGltdW0gbnVtYmVyIG9mIHBlZXJzIHN1cG9ydGVkIGJ5IHRhcmdldCBpbiBvZmZsb2FkIG1vZGUKKyAqLworCisvKgorICogVGhlIGN1cnJlbnQgZmlybXdhcmUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlIG51bWJlciBvZiBvZmZsb2FkIHBlZXJzCisgKiBzaG91bGQgYmUgKG51bWJlciBvZiB2ZGV2cyArIDEpLgorCisgKiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoZSBmaXJtd2FyZSBjbHViYmVkIHRoZSBzZWxmIHBlZXIgYW5kIG9mZmxvYWQgcGVlcgorICogaW4gdGhlIHNhbWUgcG9vbC4gU28gaWYgdGhlIGZpcm13YXJlIHdhbnRlZCB0byBzdXBwb3J0IG4gdmRldnMgdGhlbiB0aGUKKyAqIG51bWJlciBvZiBvZmZsb2FkIHBlZXIgbXVzdCBiZSBuKzEgb2Ygd2hpY2ggbiBidWZmZXJzIHdpbGwgYmUgdXNlZCBmb3IKKyAqIHNlbGYgcGVlciBhbmQgdGhlIHJlbWFpbmluZyAxIGlzIHVzZWQgZm9yIG9mZmxvYWQgcGVlciB0byBzdXBwb3J0IGNoYXR0ZXIKKyAqIG1vZGUgZm9yIHNpbmdsZSBTVEEuCisKKyAqIFRlY2huaWNhbGx5IHRoZSBtYWNybyBzaG91bGQgYmUgMSBob3dldmVyIHRoZSBjdXJyZW50IGZpcm13YXJlIHJlcXVpcmVzIG4rMS4KKworICogVE9ETzogVGhpcyBNQUNSTyBuZWVkIHRvIGJlIG1vZGlmaWVkIGluIHRoZSBmdXR1cmUsIGlmIHRoZSBmaXJtd2FyZSBtb2RpZmllZAorICogdG8gYWxsb2NhdGUgYnVmZmVycyBmb3Igc2VsZiBwZWVyIGFuZCBvZmZsb2FkIHBlZXIgaW5kZXBlbmRlbnRseS4KKyAqLworCisjZGVmaW5lIENGR19UR1RfTlVNX09GRkxPQURfUEVFUlMgICAgICAgKENGR19UR1RfTlVNX1ZERVYrMSkKKworLyoKKyAqIE51bWJlciBvZiByZW9yZGVyIGJ1ZmZlcnMgdXNlZCBpbiBvZmZsb2FkIG1vZGUKKyAqLworI2RlZmluZSBDRkdfVEdUX05VTV9PRkZMT0FEX1JFT1JERVJfQlVGRlMgICA0CisKKy8qCisgKiBrZXlzIHBlciBwZWVyIG5vZGUKKyAqLworI2RlZmluZSBDRkdfVEdUX05VTV9QRUVSX0tFWVMgICAgICAgICAgIDIKKy8qCisgKiB0b3RhbCBudW1iZXIgb2YgZGF0YSBUWCBhbmQgUlggVElEcworICovCisjZGVmaW5lIENGR19UR1RfTlVNX1RJRFMgICAgICAgKDIgKiAoQ0ZHX1RHVF9OVU1fUEVFUlMgKyBDRkdfVEdUX05VTV9WREVWICsgMikpCisvKgorICogc2V0IHRoaXMgdG8gMHg3IChQZXJlZ3JpbmUgPSAzIGNoYWlucykuCisgKiBuZWVkIHRvIGJlIHNldCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgSFcgY2FwYWJpbGl0eS4KKyAqLworI2RlZmluZSBDRkdfVEdUX0RFRkFVTFRfVFhfQ0hBSU5fTUFTSyAgIDB4NworLyoKKyAqIHNldCB0aGlzIHRvIDB4NyAoUGVyZWdyaW5lID0gMyBjaGFpbnMpLgorICogbmVlZCB0byBiZSBzZXQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIEhXIGNhcGFiaWxpdHkuCisgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9ERUZBVUxUX1JYX0NIQUlOX01BU0sgICAweDcKKy8qIDEwMCBtcyBmb3IgdmlkZW8sIGJlc3QtZWZmb3J0LCBhbmQgYmFja2dyb3VuZCAqLworI2RlZmluZSBDRkdfVEdUX1JYX1RJTUVPVVRfTE9fUFJJICAgICAgIDEwMAorLyogNDAgbXMgZm9yIHZvaWNlKi8KKyNkZWZpbmUgQ0ZHX1RHVF9SWF9USU1FT1VUX0hJX1BSSSAgICAgICA0MAorCisvKiBBUjk4ODggdW5pZmllZCBpcyBkZWZhdWx0IGluIGV0aGVybmV0IG1vZGUgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9SWF9ERUNBUF9NT0RFICgweDIpCisvKiBEZWNhcCB0byBuYXRpdmUgV2lmaSBoZWFkZXIgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9SWF9ERUNBUF9NT0RFX05XSUZJICgweDEpCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIHBlbmRpbmcgc2NhbiByZXF1ZXN0cyAqLworI2RlZmluZSBDRkdfVEdUX0RFRkFVTFRfU0NBTl9NQVhfUkVRUyAgIDB4NAorCisvKiBtYXhpbXVtIG51bWJlciBvZiBWREVWIHRoYXQgY291bGQgdXNlIEJNSVNTIG9mZmxvYWQgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9ERUZBVUxUX0JNSVNTX09GRkxPQURfTUFYX1ZERVYgICAweDIKKworLyogbWF4aW11bSBudW1iZXIgb2YgVkRFViBvZmZsb2FkIFJvYW1pbmcgdG8gc3VwcG9ydCAqLworI2RlZmluZSBDRkdfVEdUX0RFRkFVTFRfUk9BTV9PRkZMT0FEX01BWF9WREVWICAgMHgyCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIEFQIHByb2ZpbGVzIHB1c2hlZCB0byBvZmZsb2FkIFJvYW1pbmcgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9ERUZBVUxUX1JPQU1fT0ZGTE9BRF9NQVhfUFJPRklMRVMgICAweDgKKworLyogbWF4aW11bSBudW1iZXIgb2YgVkRFViBvZmZsb2FkIEdUSyB0byBzdXBwb3J0ICovCisjZGVmaW5lIENGR19UR1RfREVGQVVMVF9HVEtfT0ZGTE9BRF9NQVhfVkRFViAgIDB4MgorCisvKiBkZWZhdWx0OiBtY2FzdC0+dWNhc3QgZGlzYWJsZWQgaWYgQVRIX1NVUFBPUlRfTUNBU1QyVUNBU1Qgbm90IGRlZmluZWQgKi8KKyNpZm5kZWYgQVRIX1NVUFBPUlRfTUNBU1QyVUNBU1QKKyNkZWZpbmUgQ0ZHX1RHVF9ERUZBVUxUX05VTV9NQ0FTVF9HUk9VUFMgMAorI2RlZmluZSBDRkdfVEdUX0RFRkFVTFRfTlVNX01DQVNUX1RBQkxFX0VMRU1TIDAKKyNkZWZpbmUgQ0ZHX1RHVF9ERUZBVUxUX01DQVNUMlVDQVNUX01PREUgMCAgICAgIC8qIGRpc2FibGVkICovCisjZWxzZQorLyogKGZvciB0ZXN0aW5nKSBzbWFsbCBtdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcCB0YWJsZSBlbmFibGVkICovCisjZGVmaW5lIENGR19UR1RfREVGQVVMVF9OVU1fTUNBU1RfR1JPVVBTIDQKKyNkZWZpbmUgQ0ZHX1RHVF9ERUZBVUxUX05VTV9NQ0FTVF9UQUJMRV9FTEVNUyAxNgorI2RlZmluZSBDRkdfVEdUX0RFRkFVTFRfTUNBU1QyVUNBU1RfTU9ERSAyCisjZW5kaWYKKworI2RlZmluZSBDRkdfVEdUX01BWF9NVUxUSUNBU1RfRklMVEVSX0VOVFJJRVMgNQorLyoKKyAqIFNwZWNpZnkgaG93IG11Y2ggbWVtb3J5IHRoZSB0YXJnZXQgc2hvdWxkIGFsbG9jYXRlIGZvciBhIGRlYnVnIGxvZyBvZgorICogdHggUFBEVSBtZXRhLWluZm9ybWF0aW9uIChob3cgbGFyZ2UgdGhlIFBQRFUgd2FzLCB3aGVuIGl0IHdhcyBzZW50LAorICogd2hldGhlciBpdCB3YXMgc3VjY2Vzc2Z1bCwgZXRjLikKKyAqIFRoZSBzaXplIG9mIHRoZSBsb2cgcmVjb3JkcyBpcyBjb25maWd1cmFibGUsIGZyb20gYSBtaW5pbXVtIG9mIDI4IGJ5dGVzCisgKiB0byBhIG1heGltdW0gb2YgYWJvdXQgMzAwIGJ5dGVzLiAgQSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gd291bGQgcmVzdWx0CisgKiBpbiBlYWNoIGxvZyByZWNvcmQgYmVpbmcgYWJvdXQgMTI0IGJ5dGVzLgorICogVGh1cywgMUtCIG9mIGxvZyBzcGFjZSBjYW4gaG9sZCBhYm91dCAzMCBzbWFsbCByZWNvcmRzLCAzIGxhcmdlIHJlY29yZHMsCisgKiBvciBhYm91dCA4IHR5cGljYWwtc2l6ZWQgcmVjb3Jkcy4KKyAqLworI2RlZmluZSBDRkdfVEdUX0RFRkFVTFRfVFhfREJHX0xPR19TSVpFIDEwMjQgICAgLyogYnl0ZXMgKi8KKworLyogdGFyZ2V0IGJhc2VkIGZyYWdtZW50IHRpbWVvdXQgYW5kIE1QRFUgZHVwbGljYXRlIGRldGVjdGlvbiAqLworI2RlZmluZSBDRkdfVEdUX0RFRkFVTFRfUlhfU0tJUF9ERUZSQUdfVElNRU9VVF9EVVBfREVURUNUSU9OX0NIRUNLIDAKKworLyogIERlZmF1bHQgVm9XIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfVEdUX0RFRkFVTFRfVk9XX0NPTkZJRyAgIDAKKworLyoKKyAqIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyB0byB1c2UgaW4gdGhlIHRhcmdldAorICovCisjZGVmaW5lIENGR19UR1RfTlVNX01TRFVfREVTQyAgICAoMTAyNCArIDMyKQorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgZnJhZyB0YWJsZSBlbnRyaWVzCisgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9NQVhfRlJBR19UQUJMRV9FTlRSSUVTIDEwCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBWREVWIHRoYXQgYmVhY29uIHR4IG9mZmxvYWQgd2lsbCBzdXBwb3J0CisgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9ERUZBVUxUX0JFQUNPTl9UWF9PRkZMT0FEX01BWF9WREVWIDIKKworLyoKKyAqIG51bWJlciBvZiB2ZGV2cyB0aGF0IGNhbiBzdXBwb3J0IHRkbHMKKyAqLworI2RlZmluZSBDRkdfVEdUX05VTV9URExTX1ZERVZTICAgIDEKKworLyoKKyAqIG51bWJlciBvZiBwZWVycyB0aGF0IGVhY2ggVGRscyB2ZGV2IGNhbiB0cmFjaworICovCisjZGVmaW5lIENGR19UR1RfTlVNX1RETFNfQ09OTl9UQUJMRV9FTlRSSUVTICAgIDMyCisKKy8qCisgKiBudW1iZXIgb2YgVERMUyBjb25jdXJyZW50IHNsZWVwIFNUQXMKKyAqLworI2RlZmluZSBDRkdfVEdUX05VTV9URExTX0NPTkNfU0xFRVBfU1RBUyAgICAxCisKKy8qCisgKiBudW1iZXIgb2YgVERMUyBjb25jdXJyZW50IGJ1ZmZlciBTVEFzCisgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9OVU1fVERMU19DT05DX0JVRkZFUl9TVEFTICAgIDEKKworLyoKKyAqIGh0IGVuYWJsZSBoaWdoZXN0IE1DUyBieSBkZWZhdWx0CisgKi8KKyNkZWZpbmUgQ0ZHX1RHVF9ERUZBVUxUX0dUWF9IVF9NQVNLICAgICAgICAgICAgIDB4ODA4MAorLyoKKyAqIHZodCBlbmFibGUgaGlnaGVzdCBNQ1MgYnkgZGVmYXVsdAorICovCisjZGVmaW5lIENGR19UR1RfREVGQVVMVF9HVFhfVkhUX01BU0sgICAgICAgICAgICAweDgwMjAwCisvKgorICogcmVzdiBmb3IgZnVydHVyZSB1c2UsIGJpdCAzMCBpcyB1c2VkIGZvciBmaXggdHBjLCBiaXQwLTMgZm9yIFBvd2VyIHNhdmUgYmFsYW5jZQorICovCisjZGVmaW5lIENGR19UR1RfREVGQVVMVF9HVFhfVVNSX0NGRyAgICAgICAgICAgICAweGEKKy8qCisgKiB0aHJlc2hvbGQgdG8gZW5hYmxlIEdUWAorICovCisjZGVmaW5lIENGR19UR1RfREVGQVVMVF9HVFhfUEVSX1RIUkVTSE9MRCAgICAgICAzCisvKgorICogbWFyZ2luIHRvIG1vdmUgYmFjayB3aGVuIHBlciA+IG1hcmdpbiArIHRocmVzaG9sZAorICovCisjZGVmaW5lIENGR19UR1RfREVGQVVMVF9HVFhfUEVSX01BUkdJTiAgICAgICAgICAyCisvKgorICogc3RlcCBmb3IgZXZlcnkgbW92ZQorICovCisjZGVmaW5lIENGR19UR1RfREVGQVVMVF9HVFhfVFBDX1NURVAgICAgICAgICAgICAxCisvKgorICogbG93ZXN0IFRQQworICovCisjZGVmaW5lIENGR19UR1RfREVGQVVMVF9HVFhfVFBDX01JTiAgICAgICAgICAgICAwCisvKgorICogZW5hYmxlIGFsbCBCVyAyMC80MC84MC8xNjAKKyAqLworI2RlZmluZSBDRkdfVEdUX0RFRkFVTFRfR1RYX0JXX01BU0sgICAgICAgICAgICAgMHhmCisKKy8qCisgKiBudW1iZXIgb2YgdmRldnMgdGhhdCBjYW4gc3VwcG9ydCBPQ0IKKyAqLworI2RlZmluZSBDRkdfVEdUX05VTV9PQ0JfVkRFVlMJCQkxCisKKy8qCisgKiBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0aGF0IGNhbiBkbyBPQ0IKKyAqLworI2RlZmluZSBDRkdfVEdUX05VTV9PQ0JfQ0hBTk5FTFMJCTIKKworLyoKKyAqIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIGluIGFuIE9DQiBzY2hlZHVsZQorICovCisjZGVmaW5lIENGR19UR1RfTlVNX09DQl9TQ0hFRFVMRVMJCTIKKworI2VuZGlmIC8qX19XTEFOX1RHVF9ERUZfQ09ORklHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2luYy93bWkuaCBiL3RhcmdldC9pbmMvd21pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0NWViYQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9pbmMvd21pLmgKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMCwgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIFdNSSBwcm90b2NvbCBzcGVjaWZpZWQgaW4gdGhlCisgKiBXaXJlbGVzcyBNb2R1bGUgSW50ZXJmYWNlIChXTUkpLiAgSXQgaW5jbHVkZXMgZGVmaW5pdGlvbnMgb2YgYWxsIHRoZQorICogY29tbWFuZHMgYW5kIGV2ZW50cy4gQ29tbWFuZHMgYXJlIG1lc3NhZ2VzIGZyb20gdGhlIGhvc3QgdG8gdGhlIFdNLgorICogRXZlbnRzIGFuZCBSZXBsaWVzIGFyZSBtZXNzYWdlcyBmcm9tIHRoZSBXTSB0byB0aGUgaG9zdC4KKyAqCisgKiBPd25lcnNoaXAgb2YgY29ycmVjdG5lc3MgaW4gcmVnYXJkcyB0byBjb21tYW5kcworICogYmVsb25ncyB0byB0aGUgaG9zdCBkcml2ZXIgYW5kIHRoZSBXTUkgaXMgbm90IHJlcXVpcmVkIHRvIHZhbGlkYXRlCisgKiBwYXJhbWV0ZXJzIGZvciB2YWx1ZSwgcHJvcGVyIHJhbmdlLCBvciBhbnkgb3RoZXIgY2hlY2tpbmcuCisgKgorICovCisKKyNpZm5kZWYgX1dNSV9IXworI2RlZmluZSBfV01JX0hfCisKKyNpbmNsdWRlICJ3bGFuX2RlZnMuaCIKKyNpbmNsdWRlICJ3bWl4LmgiCisjaW5jbHVkZSAid21pX3VuaWZpZWQuaCIKKyNpbmNsdWRlICJ3bWlfdGx2X2hlbHBlci5oIgorI2luY2x1ZGUgIndtaV90bHZfZGVmcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgSFRDX1BST1RPQ09MX1ZFUlNJT04gICAgMHgwMDAyCisKKyNkZWZpbmUgV01JX1BST1RPQ09MX1ZFUlNJT04gICAgMHgwMDAyCisKKyNkZWZpbmUgV01JX01PREVfTUFYICAgICAgICAgICAgICA4CisjZGVmaW5lIFdNSV9NQVhfUkFURV9NQVNLICAgICAgICAgNgorCitQUkVQQUNLIHN0cnVjdCBob3N0X2FwcF9hcmVhX3MgeworCUFfVUlOVDMyIHdtaV9wcm90b2NvbF92ZXI7Cit9IFBPU1RQQUNLOworCisjdW5kZWYgTVMKKyNkZWZpbmUgTVMoX3YsIF9mKSAoKChfdikgJiBfZiAjIyBfTUFTSykgPj4gX2YgIyMgX0xTQikKKyN1bmRlZiBTTQorI2RlZmluZSBTTShfdiwgX2YpICgoKF92KSA8PCBfZiAjIyBfTFNCKSAmIF9mICMjIF9NQVNLKQorI3VuZGVmIFdPCisjZGVmaW5lIFdPKF9mKSAgICAgICgoX2YgIyMgX09GRlNFVCkgPj4gMikKKworI3VuZGVmIEdFVF9GSUVMRAorI2RlZmluZSBHRVRfRklFTEQoX2FkZHIsIF9mKSBNUygqKChBX1VJTlQzMiAqKShfYWRkcikgKyBXTyhfZikpLCBfZikKKyN1bmRlZiBTRVRfRklFTEQKKyNkZWZpbmUgU0VUX0ZJRUxEKF9hZGRyLCBfZiwgX3ZhbCkgIFwKKwkoKigoQV9VSU5UMzIgKikoX2FkZHIpICsgV08oX2YpKSA9IFwKKwkJICgqKChBX1VJTlQzMiAqKShfYWRkcikgKyBXTyhfZikpICYgfl9mICMjIF9NQVNLKSB8IFNNKF92YWwsIF9mKSkKKworI2RlZmluZSBXTUlfR0VUX0ZJRUxEKF9tc2dfYnVmLCBfbXNnX3R5cGUsIF9mKSBcCisJR0VUX0ZJRUxEKF9tc2dfYnVmLCBfbXNnX3R5cGUgIyMgXyAjIyBfZikKKworI2RlZmluZSBXTUlfU0VUX0ZJRUxEKF9tc2dfYnVmLCBfbXNnX3R5cGUsIF9mLCBfdmFsKSBcCisJU0VUX0ZJRUxEKF9tc2dfYnVmLCBfbXNnX3R5cGUgIyMgXyAjIyBfZiwgX3ZhbCkKKworI2RlZmluZSBXTUlfRVBfQVBBU1MgICAgICAgICAgIDB4MAorI2RlZmluZSBXTUlfRVBfTFBBU1MgICAgICAgICAgIDB4MQorI2RlZmluZSBXTUlfRVBfU0VOU09SICAgICAgICAgIDB4MgorCisvKgorICogQ29udHJvbCBQYXRoCisgKi8KK3R5cGVkZWYgUFJFUEFDSyBzdHJ1Y3QgeworCUFfVUlOVDMyIGNvbW1hbmRJZCA6IDI0LCByZXNlcnZlZCA6IDIsICAgICAgICAgIC8qIHVzZWQgZm9yIFdNSSBlbmRwb2ludCBJRCAqLworCQkgcGx0X3ByaXYgOiA2OyAgICAvKiBwbGF0Zm9ybSBwcml2YXRlICovCit9IFBPU1RQQUNLIFdNSV9DTURfSERSOyAgICAgICAgIC8qIHVzZWQgZm9yIGNvbW1hbmRzIGFuZCBldmVudHMgKi8KKworI2RlZmluZSBXTUlfQ01EX0hEUl9DT01NQU5ESURfTFNCICAgICAgICAgICAwCisjZGVmaW5lIFdNSV9DTURfSERSX0NPTU1BTkRJRF9NQVNLICAgICAgICAgIDB4MDBmZmZmZmYKKyNkZWZpbmUgV01JX0NNRF9IRFJfQ09NTUFORElEX09GRlNFVCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBXTUlfQ01EX0hEUl9XTUlfRU5EUE9JTlRJRF9NQVNLICAgICAweDAzMDAwMDAwCisjZGVmaW5lIFdNSV9DTURfSERSX1dNSV9FTkRQT0lOVElEX09GRlNFVCAgIDI0CisjZGVmaW5lIFdNSV9DTURfSERSX1BMVF9QUklWX0xTQiAgICAgICAgICAgIDI0CisjZGVmaW5lIFdNSV9DTURfSERSX1BMVF9QUklWX01BU0sgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgV01JX0NNRF9IRFJfUExUX1BSSVZfT0ZGU0VUICAgICAgICAgMHgwMDAwMDAwMAorCisvKgorICogTGlzdCBvZiBDb21tbmFuZHMKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlXTUlfRVhURU5TSU9OX0NNRElELCAgICAgICAgICAgIC8qIHVzZWQgaW4gd21pX3N2Yy5jICAgLyAqIE5vbi13aXJlbGVzcyBleHRlbnNpb25zICogLyAqLworCVdNSV9JR05PUkVfQ01ESUQsICAgICAgICAgICAgICAgLyogdXNlZCBpbiB3bGFuX3dtaS5jICovCit9IFdNSV9DT01NQU5EX0lEOworCit0eXBlZGVmIGVudW0geworCU5PTkVfQ1JZUFQgPSAweDAxLAorCVdFUF9DUllQVCA9IDB4MDIsCisJVEtJUF9DUllQVCA9IDB4MDQsCisJQUVTX0NSWVBUID0gMHgwOCwKKyNpZmRlZiBXQVBJX0VOQUJMRQorCVdBUElfQ1JZUFQgPSAweDEwLAorI2VuZGlmIC8qV0FQSV9FTkFCTEUgKi8KK30gQ1JZUFRPX1RZUEU7CisKKyNkZWZpbmUgV01JX01BWF9TU0lEX0xFTiAgICAzMgorCisvKgorICogV01JX1NFVF9QTUtfQ01ESUQKKyAqLworI2RlZmluZSBXTUlfUE1LX0xFTiAgICAgMzIKKworLyoKKyAqIFdNSV9BRERfQ0lQSEVSX0tFWV9DTURJRAorICovCit0eXBlZGVmIGVudW0geworCVBBSVJXSVNFX1VTQUdFID0gMHgwMCwKKwlHUk9VUF9VU0FHRSA9IDB4MDEsCisJVFhfVVNBR0UgPSAweDAyLCAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IFR4IEtleSAtIFN0YXRpYyBXRVAgb25seSAqLworfSBLRVlfVVNBR0U7CisKKy8qCisgKiBMaXN0IG9mIEV2ZW50cyAodGFyZ2V0IHRvIGhvc3QpCisgKi8KK3R5cGVkZWYgZW51bSB7CisJV01JX0VYVEVOU0lPTl9FVkVOVElELCAgICAgICAgICAvKiB3bWlfcHJvZmhvb2suYyBhbmQgdW1hY193bWlfZXZlbnRzLmMgKi8KK30gV01JX0VWRU5UX0lEOworCit0eXBlZGVmIGVudW0geworCVdNSV8xMUFfQ0FQQUJJTElUWSA9IDEsCisJV01JXzExR19DQVBBQklMSVRZID0gMiwKKwlXTUlfMTFBR19DQVBBQklMSVRZID0gMywKKwlXTUlfMTFOQV9DQVBBQklMSVRZID0gNCwKKwlXTUlfMTFOR19DQVBBQklMSVRZID0gNSwKKwlXTUlfMTFOQUdfQ0FQQUJJTElUWSA9IDYsCisJV01JXzExQUNfQ0FQQUJJTElUWSA9IDcsCisJLyogRU5EIENBUEFCSUxJVFkgKi8KKwlXTUlfMTFOX0NBUEFCSUxJVFlfT0ZGU0VUID0KKwkJKFdNSV8xMU5BX0NBUEFCSUxJVFkgLSBXTUlfMTFBX0NBUEFCSUxJVFkpLAorfSBXTUlfUEhZX0NBUEFCSUxJVFk7CisKKy8qIERlcHJlY3RhdGVkLCBuZWVkIGNsZWFuIHVwICovCisjZGVmaW5lIFdNSV9NQVhfUlhfTUVUQV9TWiAgKDEyKQorCit0eXBlZGVmIFBSRVBBQ0sgc3RydWN0IHsKKwlBX0lOVDggcnNzaTsKKwlBX1VJTlQ4IGluZm87ICAgICAgICAgICAvKiB1c2FnZSBvZiAnaW5mbycgZmllbGQoOC1iaXQpOgorCSAgICAgICAgICAgICAgICAgICAgICAgICAqICBiMTpiMCAgICAgICAtIFdNSV9NU0dfVFlQRQorCSAgICAgICAgICAgICAgICAgICAgICAgICAqICBiNDpiMzpiMiAgICAtIFVQKHRpZCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKiAgYjUgICAgICAgICAgLSBVc2VkIGluIEFQIG1vZGUuIE1vcmUtZGF0YSBpbiB0eCBkaXIsIFBTIGluIHJ4LgorCSAgICAgICAgICAgICAgICAgICAgICAgICAqICBiNzpiNiAgICAgICAtICBEb3QzIGhlYWRlcigwKSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgRG90MTEgSGVhZGVyKDEpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICBBQ0wgZGF0YSgyKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJQV9VSU5UMTYgaW5mbzI7ICAgICAgICAgLyogdXNhZ2Ugb2YgJ2luZm8yJyBmaWVsZCgxNi1iaXQpOgorCSAgICAgICAgICAgICAgICAgICAgICAgICAqIGIxMTpiMCAgICAgICAtIHNlcV9ubworCSAgICAgICAgICAgICAgICAgICAgICAgICAqIGIxMiAgICAgICAgICAtIEEtTVNEVT8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgKiBiMTU6YjEzICAgICAgLSBNRVRBX0RBVEFfVkVSU0lPTiAwIC0gNworCSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCUFfVUlOVDE2IGluZm8zOyAgICAgICAgIC8qIGIzOmIyOmIxOmIwICAtIGRldmljZSBpZAorCSAgICAgICAgICAgICAgICAgICAgICAgICAqIGI0ICAgICAgICAgICAtIFVzZWQgaW4gQVAgbW9kZS4gdUFQU0QgdHJpZ2dlciBpbiByeCwgRU9TUCBpbiB0eAorCSAgICAgICAgICAgICAgICAgICAgICAgICAqIGI3OmI1ICAgICAgICAtIHVudXNlZD8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgKiBiMTU6YjggICAgICAgLSBwYWQgYmVmb3JlIGRhdGEgc3RhcnQoaXJyZXNwZWN0aXZlIG9mIG1ldGEgdmVyc2lvbikKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gUE9TVFBBQ0sgV01JX0RBVEFfSERSOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9XTUlfSF8gKi8KZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvd21pX3NlcnZpY2VzLmggYi90YXJnZXQvaW5jL3dtaV9zZXJ2aWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjFkZmEKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaW5jL3dtaV9zZXJ2aWNlcy5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKioKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIFdNSSBzZXJ2aWNlcyBiaXRtYXAgYW5kIHRoZSBzZXQgb2YgV01JIHNlcnZpY2VzIC4KKyAqIGRlZmluZXMgbWFjcnNvIHRvIHNldC9jbGVhci9nZXQgZGlmZmVyZW50IHNlcnZpY2UgYml0cyBmcm9tIHRoZSBiaXRtYXAuCisgKiB0aGUgc2VydmljZSBiaXRtYXAgaXMgc2VudCB1cCB0byB0aGUgaG9zdCB2aWEgV01JX1JFQURZIGNvbW1hbmQuCisgKgorICovCisKKyNpZm5kZWYgX1dNSV9TRVJWSUNFU19IXworI2RlZmluZSBfV01JX1NFUlZJQ0VTX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKwlXTUlfU0VSVklDRV9CRUFDT05fT0ZGTE9BRCA9IDAsICAgICAgICAgLyogYmVhY29uIG9mZmxvYWQgKi8KKwlXTUlfU0VSVklDRV9TQ0FOX09GRkxPQUQsICAgICAgICAgICAgICAgLyogc2NhbiBvZmZsb2FkICovCisJV01JX1NFUlZJQ0VfUk9BTV9TQ0FOX09GRkxPQUQsICAgICAgICAgIC8qIHJvYW0gc2NhbiBvZmZsb2FkICovCisJV01JX1NFUlZJQ0VfQkNOX01JU1NfT0ZGTE9BRCwgICAgICAgICAgIC8qIGJlYWNvbiBtaXNzIG9mZmxvYWQgKi8KKwlXTUlfU0VSVklDRV9TVEFfUFdSU0FWRSwgICAgICAgICAgICAgICAgLyogZmFrZSBzbGVlcCArIGJhc2ljIHBvd2VyIHNhdmUgKi8KKwlXTUlfU0VSVklDRV9TVEFfQURWQU5DRURfUFdSU0FWRSwgICAgICAgICAgICAgICAvKiB1YXBzZCwgcHNwb2xsLCBmb3JjZSBzbGVlcCAqLworCVdNSV9TRVJWSUNFX0FQX1VBUFNELCAgICAgICAgICAgLyogdWFwc2Qgb24gQVAgKi8KKwlXTUlfU0VSVklDRV9BUF9ERlMsICAgICAgICAgICAgIC8qIERGUyBvbiBBUCAqLworCVdNSV9TRVJWSUNFXzExQUMsICAgICAgICAgICAgICAgLyogc3VwcG9ydHMgMTFhYyAqLworCVdNSV9TRVJWSUNFX0JMT0NLQUNLLCAgICAgICAgICAgLyogU3VwcG9ydHMgdHJpZ2dlcmluZyBBRERCQS9ERUxCQSBmcm9tIGhvc3QgKi8KKwlXTUlfU0VSVklDRV9QSFlFUlIsICAgICAgICAgICAgIC8qIFBIWSBlcnJvciAqLworCVdNSV9TRVJWSUNFX0JDTl9GSUxURVIsICAgICAgICAgLyogQmVhY29uIGZpbHRlciBzdXBwb3J0ICovCisJV01JX1NFUlZJQ0VfUlRULCAgICAgICAgICAgICAgICAvKiBSVFQgKHJvdW5kIHRyaXAgdGltZSkgc3VwcG9ydCAqLworCVdNSV9TRVJWSUNFX1dPVywgICAgICAgICAgICAgICAgLyogV09XIFN1cHBvcnQgKi8KKwlXTUlfU0VSVklDRV9SQVRFQ1RSTF9DQUNIRSwgICAgICAgICAgICAgLyogUmF0ZS1jb250cm9sIGNhY2hpbmcgKi8KKwlXTUlfU0VSVklDRV9JUkFNX1RJRFMsICAgICAgICAgIC8qIFRJRHMgaW4gSVJBTSAqLworCVdNSV9TRVJWSUNFX0FSUE5TX09GRkxPQUQsICAgICAgLyogQVJQIE5TIE9mZmxvYWQgc3VwcG9ydCBmb3IgU1RBIHZkZXYqLworCVdNSV9TRVJWSUNFX05MTywgICAgICAgICAgICAgICAgLyogTmV0d29yayBsaXN0IG9mZmxvYWQgc2VydmljZSAqLworCVdNSV9TRVJWSUNFX0dUS19PRkZMT0FELCAgICAgICAgICAgICAgICAvKiBHVEsgb2ZmbG9hZCAqLworCVdNSV9TRVJWSUNFX1NDQU5fU0NILCAgICAgICAgICAgLyogU2NhbiBTY2hlZHVsZXIgU2VydmljZSAqLworCVdNSV9TRVJWSUNFX0NTQV9PRkZMT0FELCAgICAgICAgICAgICAgICAvKiBDU0Egb2ZmbG9hZCBzZXJ2aWNlICovCisJV01JX1NFUlZJQ0VfQ0hBVFRFUiwgICAgICAgICAgICAvKiBDaGF0dGVyIHNlcnZpY2UgKi8KKwlXTUlfU0VSVklDRV9DT0VYX0ZSRVFBVk9JRCwgICAgICAgICAgICAgLyogRlcgcmVwb3J0IGZyZXEgcmFuZ2UgdG8gYXZvaWQgKi8KKwlXTUlfU0VSVklDRV9QQUNLRVRfUE9XRVJfU0FWRSwgICAgICAgICAgLyogcGFja2V0IHBvd2VyIHNhdmUgc2VydmljZSAqLworCVdNSV9TRVJWSUNFX0ZPUkNFX0ZXX0hBTkcsICAgICAgICAgICAgICAvKiBTZXJ2aWNlIHRvIHRlc3QgdGhlIGZpcm13YXJlIHJlY292ZXJ5IG1lY2hhbmlzbSAqLworCVdNSV9TRVJWSUNFX0dQSU8sICAgICAgICAgICAgICAgLyogR1BJTyBzZXJ2aWNlICovCisJV01JX1NFUlZJQ0VfU1RBX0RUSU1fUFNfTU9EVUxBVEVEX0RUSU0sICAgICAgICAgLyogTW9kdWxhdGVkIERUSU0gc3VwcG9ydCAqLworCVdNSV9TVEFfVUFQU0RfQkFTSUNfQVVUT19UUklHLCAgICAgICAgICAvKiBCYXNpYyB2ZXJzaW9uIG9mIHN0YXRpb24gVUFQU0QgQUMgVHJpZ2dlciBHZW5lcmF0aW9uIE1ldGhvZCB3aXRoCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHZhcmlhYmxlIHRpZ2dlciBwZXJpb2RzIChzZXJ2aWNlLCBkZWxheSwgYW5kIHN1c3BlbmQgaW50ZXJ2YWxzKSAqLworCVdNSV9TVEFfVUFQU0RfVkFSX0FVVE9fVFJJRywgICAgICAgICAgICAvKiBTdGF0aW9uIFVBUFNEIEFDIFRyaWdnZXIgR2VuZXJhdGlvbiBNZXRob2Qgd2l0aCB2YXJpYWJsZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0cmlnZ2VyIHBlcmlvZHMgKHNlcnZpY2UsIGRlbGF5LCBhbmQgc3VzcGVuZCBpbnRlcnZhbHMpICovCisJV01JX1NFUlZJQ0VfU1RBX0tFRVBfQUxJVkUsICAgICAgICAgICAgIC8qIFNlcml2Y2UgdG8gc3VwcG9ydCB0aGUgU1RBIEtFRVAgQUxJVkUgbWVjaGFuaXNtICovCisJV01JX1NFUlZJQ0VfVFhfRU5DQVAsICAgICAgICAgICAvKiBQYWNrZXQgdHlwZSBmb3IgVFggZW5jYXBzdWxhdGlvbiAqLworCVdNSV9TRVJWSUNFX0FQX1BTX0RFVEVDVF9PVVRfT0ZfU1lOQywgICAgICAgICAgIC8qIGRldGVjdCBvdXQtb2Ytc3luYyBzbGVlcGluZyBzdGF0aW9ucyAqLworCVdNSV9TRVJWSUNFX0VBUkxZX1JYLCAgICAgICAgICAgLyogYWRhcHRpdmUgZWFybHktcnggZmVhdHVyZSAqLworCVdNSV9TRVJWSUNFX1NUQV9TTVBTLCAgICAgICAgICAgLyogU1RBIE1JTU8tUFMgKi8KKwlXTUlfU0VSVklDRV9GV1RFU1QsICAgICAgICAgICAgIC8qIEZpcm13YXJlIHRlc3Qgc2VydmljZSAqLworCVdNSV9TRVJWSUNFX1NUQV9XTU1BQywgICAgICAgICAgLyogU1RBIFdNTUFDICovCisJV01JX1NFUlZJQ0VfVERMUywgICAgICAgICAgICAgICAvKiBURExTIHN1cHBvcnQgKi8KKwlXTUlfU0VSVklDRV9CVVJTVCwgICAgICAgICAgICAgIC8qIFNJRlMgc3BhY2VkIGJ1cnN0IHN1cHBvcnQgKi8KKwlXTUlfU0VSVklDRV9NQ0NfQkNOX0lOVEVSVkFMX0NIQU5HRSwgICAgICAgICAgICAvKiBEeW5hbWljIGJlYW9jbiBpbnRlcnZhbCBjaGFuZ2UgZm9yIFNBUC9QMnAgR08gaW4gTUNDIHNjZW5hcmlvICovCisJV01JX1NFUlZJQ0VfQURBUFRJVkVfT0NTLCAgICAgICAgICAgICAgIC8qIFNlcnZpY2UgdG8gc3VwcG9ydCBhZGFwdGl2ZSBvZmYtY2hhbm5lbCBzY2hlZHVsZXIgKi8KKwlXTUlfU0VSVklDRV9CQV9TU05fU1VQUE9SVCwgICAgICAgICAgICAgLyogdGFyZ2V0IHdpbGwgcHJvdmlkZSBTZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSBwZWVyL3RpZCBjb21ibyAqLworCVdNSV9TRVJWSUNFX0ZJTFRFUl9JUFNFQ19OQVRLRUVQQUxJVkUsCisJV01JX1NFUlZJQ0VfV0xBTl9IQiwgICAgICAgICAgICAvKiB3bGFuIEhCIHNlcnZpY2UgKi8KKwlXTUlfU0VSVklDRV9MVEVfQU5UX1NIQVJFX1NVUFBPUlQsICAgICAgICAgICAgICAvKiBzdXBwb3J0IExURS9XTEFOIGFudGVubmEgc2hhcmluZyAqLworCVdNSV9TRVJWSUNFX0JBVENIX1NDQU4sICAgICAgICAgLypTZXJ2aWNlIHRvIHN1cHBvcnQgYmF0Y2ggc2NhbiAqLworCVdNSV9TRVJWSUNFX1FQT1dFUiwgICAgICAgICAgICAgLyogUVBvd2VyIHNlcnZpY2UgKi8KKwlXTUlfU0VSVklDRV9QTE1SRVEsCisJV01JX1NFUlZJQ0VfVEhFUk1BTF9NR01ULAorCVdNSV9TRVJWSUNFX1JNQywgICAgICAgICAgICAgICAgLyogUk1DIHN1cHBvcnQgKi8KKwlXTUlfU0VSVklDRV9NSEZfT0ZGTE9BRCwgICAgICAgICAgICAgICAgLyogbXVsdGktaG9wIGZvcndhcmRpbmcgb2ZmbG9hZCAqLworCVdNSV9TRVJWSUNFX0NPRVhfU0FSLCAgICAgICAgICAgLyogdGFyZ2V0IHN1cHBvcnQgU0FSIHR4IGxpbWl0IGZyb20gV01JX1BERVZfUEFSQU1fVFhQT1dFUl9MSU1JVHhHICovCisJV01JX1NFUlZJQ0VfQkNOX1RYUkFURV9PVkVSUklERSwgICAgICAgICAgICAgICAgLyogV2lsbCBzdXBwb3J0IHRoZSBiY24vcHJiIHJzcCByYXRlIG92ZXJyaWRlICovCisJV01JX1NFUlZJQ0VfTkFOLCAgICAgICAgICAgICAgICAvKiBOZWlnaGJvciBBd2FyZW5lc3MgTmV0d29yayAqLworCVdNSV9TRVJWSUNFX0wxU1NfU1RBVCwgICAgICAgICAgLyogTDFTUyBzdGF0aXN0aWNzIGNvdW50ZXIgcmVwb3J0ICovCisJV01JX1NFUlZJQ0VfRVNUSU1BVEVfTElOS1NQRUVELCAgICAgICAgIC8qIExpbmtzcGVlZCBFc3RpbWF0aW9uIHBlciBwZWVyICovCisJV01JX1NFUlZJQ0VfT0JTU19TQ0FOLCAgICAgICAgICAvKiBTZXJ2aWNlIHRvIHN1cHBvcnQgT0JTUyBzY2FuICovCisJV01JX1NFUlZJQ0VfVERMU19PRkZDSEFOLCAgICAgICAgICAgICAgIC8qIFRETFMgb2ZmIGNoYW5uZWwgc3VwcG9ydCAqLworCVdNSV9TRVJWSUNFX1RETFNfVUFQU0RfQlVGRkVSX1NUQSwgICAgICAgICAgICAgIC8qIFRETFMgVUFQU0QgQnVmZmVyIFNUQSBzdXBwb3J0ICovCisJV01JX1NFUlZJQ0VfVERMU19VQVBTRF9TTEVFUF9TVEEsICAgICAgICAgICAgICAgLyogVERMUyBVQVBTRCBTbGVlcCBTVEEgc3VwcG9ydCAqLworCVdNSV9TRVJWSUNFX0lCU1NfUFdSU0FWRSwgICAgICAgICAgICAgICAvKiBJQlNTIHBvd2VyIHNhdmUgc3VwcG9ydCAqLworCVdNSV9TRVJWSUNFX0xQQVNTLCAgICAgICAgICAgICAgLypTZXJ2aWNlIHRvIHN1cHBvcnQgTFBBU1MgKi8KKwlXTUlfU0VSVklDRV9FWFRTQ0FOLCAgICAgICAgICAgIC8qIEV4dGVuZGVkIFNjYW5zICovCisJV01JX1NFUlZJQ0VfRDBXT1csICAgICAgICAgICAgICAvKiBEMC1XT1cgU3VwcG9ydCAqLworCVdNSV9TRVJWSUNFX0hTT0ZGTE9BRCwgICAgICAgICAgLyogSG90c3BvdCBvZmZsb2FkIGZlYXR1cmUgU3VwcG9ydCAqLworCVdNSV9TRVJWSUNFX1JPQU1fSE9fT0ZGTE9BRCwgICAgICAgICAgICAvKiByb2FtIGhhbmRvdmVyIG9mZmxvYWQgKi8KKwlXTUlfU0VSVklDRV9SWF9GVUxMX1JFT1JERVIsICAgICAgICAgICAgLyogdGFyZ2V0LWJhc2VkIFJ4IGZ1bGwgcmVvcmRlciAqLworCVdNSV9TRVJWSUNFX0RIQ1BfT0ZGTE9BRCwgICAgICAgICAgICAgICAvKiBESENQIG9mZmxvYWQgc3VwcG9ydCAqLworCVdNSV9TRVJWSUNFX1NUQV9SWF9JUEFfT0ZGTE9BRF9TVVBQT1JULCAgICAgICAgIC8qIFNUQSBSWCBEQVRBIG9mZmxvYWQgdG8gSVBBIHN1cHBvcnQgKi8KKwlXTUlfU0VSVklDRV9NRE5TX09GRkxPQUQsICAgICAgICAgLyogbUROUyByZXNwb25kZXIgb2ZmbG9hZCBzdXBwb3J0ICovCisJV01JX1NFUlZJQ0VfU0FQX0FVVEhfT0ZGTE9BRCwgICAgIC8qIHNvZnRhcCBhdXRoIG9mZmxvYWQgKi8KKwlXTUlfU0VSVklDRV9EVUFMX0JBTkRfU0lNVUxUQU5FT1VTX1NVUFBPUlQsIC8qIER1YWwgQmFuZCBTaW11bHRhbmVvdXMgc3VwcG9ydCAqLworCVdNSV9TRVJWSUNFX09DQiwgICAgICAgICAgICAgICAgICAvKiBPQ0IgbW9kZSBzdXBwb3J0ICovCisJV01JX1NFUlZJQ0VfQVBfQVJQTlNfT0ZGTE9BRCwgICAgIC8qIGFycCBvZmZsb2FkIHN1cHBvcnQgZm9yIGFwIG1vZGUgdmRldiAqLworCVdNSV9TRVJWSUNFX1BFUl9CQU5EX0NIQUlOTUFTS19TVVBQT1JULCAvKiBQZXIgYmFuZCBjaGFpbm1hc2sgc3VwcG9ydCAqLworCVdNSV9TRVJWSUNFX1BBQ0tFVF9GSUxURVJfT0ZGTE9BRCwgLyogUGVyIHZkZXYgcGFja2V0IGZpbHRlcnMgKi8KKwlXTUlfU0VSVklDRV9NR01UX1RYX0hUVCwgICAgICAgICAgLyogTWdtdCBUeCB2aWEgSFRUIGludGVyZmFjZSAqLworCVdNSV9TRVJWSUNFX01HTVRfVFhfV01JLCAgICAgICAgICAvKiBNZ210IFR4IHZpYSBXTUkgaW50ZXJmYWNlICovCisJV01JX1NFUlZJQ0VfRVhUX01TRywgICAgICAgICAgICAgLyogV01JX1NFUlZJQ0VfUkVBRFlfRVhUIG1zZyBmb2xsb3dzICovCisJV01JX1NFUlZJQ0VfTUFXQywgICAgICAgICAgICAgICAvKiBNb3Rpb24gQWlkZWQgV2lGaSBDb25uZWN0aXZpdHkgKE1BV0MpKi8KKworCS8qIHRhcmdldCB3aWxsIHNlbmQgQVNTT0NfQ09ORiBhZnRlciBBU1NPQ19DTUQgaXMgcHJvY2Vzc2VkICovCisJV01JX1NFUlZJQ0VfUEVFUl9BU1NPQ19DT05GLAorCisJLyogZW5oYW5jZWQgZ3JlZW4gYXAgc3VwcG9ydCAqLworCVdNSV9TRVJWSUNFX0VHQVAsCisJLyogRlcgc3VwcG9ydHMgMTFXIFBNRiBPZmZsb2FkIGZvciBTVEEgKi8KKwlXTUlfU0VSVklDRV9TVEFfUE1GX09GRkxPQUQsCisKKwlXTUlfTUFYX1NFUlZJQ0UgPSAxMjggICAgICAgICAgICAgLyogbWF4IHNlcnZpY2UgKi8KK30gV01JX1NFUlZJQ0U7CisKKyNkZWZpbmUgV01JX1NFUlZJQ0VfQk1fU0laRSAgICgoV01JX01BWF9TRVJWSUNFICsgc2l6ZW9mKEFfVUlOVDMyKS0gMSkvc2l6ZW9mKEFfVUlOVDMyKSkKKworLyoKKyAqIGRlcHJlY2lhdGVkIHRoZSBuYW1lIFdNSV9TRVJWSUNFX1JPQU1fT0ZGTE9BRCwgYnV0IGhlcmUgdG8gaGVscCBjb21waWxpbmcKKyAqIHdpdGggb2xkIGhvc3QgZHJpdmVyCisgKi8KKyNkZWZpbmUgV01JX1NFUlZJQ0VfUk9BTV9PRkZMT0FEIFdNSV9TRVJWSUNFX1JPQU1fU0NBTl9PRkZMT0FECisKKy8qCisgKiB0dXJuIG9uIHRoZSBXTUkgc2VydmljZSBiaXQgY29ycmVzcG9uZGluZyB0byAgdGhlIFdNSSBzZXJ2aWNlLgorICovCisjZGVmaW5lIFdNSV9TRVJWSUNFX0VOQUJMRShwd21pX3N2Y19ibWFwLHN2Y19pZCkgXAorCSggKHB3bWlfc3ZjX2JtYXApWyhzdmNfaWQpLyhzaXplb2YoQV9VSU5UMzIpKV0gfD0gXAorCQkgICgxIDw8ICgoc3ZjX2lkKSUoc2l6ZW9mKEFfVUlOVDMyKSkpKSApCisKKyNkZWZpbmUgV01JX1NFUlZJQ0VfRElTQUJMRShwd21pX3N2Y19ibWFwLHN2Y19pZCkgXAorCSggKHB3bWlfc3ZjX2JtYXApWyhzdmNfaWQpLyhzaXplb2YoQV9VSU5UMzIpKV0gJj0gIFwKKwkJICAoIH4oMSA8PCAoKHN2Y19pZCklKHNpemVvZihBX1VJTlQzMikpKSkgKSApCisKKyNkZWZpbmUgV01JX1NFUlZJQ0VfSVNfRU5BQkxFRChwd21pX3N2Y19ibWFwLHN2Y19pZCkgXAorCSggKChwd21pX3N2Y19ibWFwKVsoc3ZjX2lkKS8oc2l6ZW9mKEFfVUlOVDMyKSldICYgIFwKKwkgICAoMSA8PCAoKHN2Y19pZCklKHNpemVvZihBX1VJTlQzMikpKSkgKSAhPSAwKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qX1dNSV9TRVJWSUNFU19IXyovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL3dtaV90bHZfZGVmcy5oIGIvdGFyZ2V0L2luYy93bWlfdGx2X2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODFkZTczCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy93bWlfdGx2X2RlZnMuaApAQCAtMCwwICsxLDI5OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1dNSV9UTFZfREVGU19IXworI2RlZmluZSBfV01JX1RMVl9ERUZTX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBXTUlUTFZfRklFTERfQlVGX0lTX0FMTE9DQVRFRChlbGVtX25hbWUpIFwKKwlpc19hbGxvY2F0ZWRfICMjIGVsZW1fbmFtZQorCisjZGVmaW5lIFdNSVRMVl9GSUVMRF9OVU1fT0YoZWxlbV9uYW1lKSBcCisJbnVtXyAjIyBlbGVtX25hbWUKKworLyogRGVmaW5lIHRoZSBzdHJ1Y3R1cmUgdHlwZWRlZiBmb3IgdGhlIFRMViBwYXJhbWV0ZXJzIG9mIGVhY2ggY21kL2V2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UWVBFREVGX1NUUlVDVF9QQVJBTVNfVExWUyh3bWlfY21kX2V2ZW50X2lkKSBcCisJd21pX2NtZF9ldmVudF9pZCAjIyBfcGFyYW1fdGx2cworCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNybyBXTUlUTFZfT1BfKiBhcmUgY3JlYXRlZCBieSB0aGUgbWFjcm8gV01JVExWX0VMRU0oKS4KKyAqLworLyogbWFjcm8gdG8gZGVmaW5lIHRoZSBUTFYgbmFtZSBpbiB0aGUgY29ycmVjdCBvcmRlci4gV2hlbiAob3A9PVRBR19PUkRFUikgKi8KKyNkZWZpbmUgV01JVExWX09QX1RBR19PUkRFUl9tYWNybyhwYXJhbV9wdHIsIHBhcmFtX2xlbiwgd21pX2NtZF9ldmVudF9pZCwgZWxlbV90bHZfdGFnLCBlbGVtX3N0cnVjX3R5cGUsIGVsZW1fbmFtZSwgdmFyX2xlbiwgYXJyX3NpemUpCVwKKwl3bWlfY21kX2V2ZW50X2lkICMjIF90bHZfb3JkZXJfICMjIGVsZW1fbmFtZSwKKworLyogbWFjcm8gdG8gZGVmaW5lIHRoZSBUTFYgbmFtZSB3aXRoIHRoZSBUTFYgVGFnIHZhbHVlLiBXaGVuIChvcD09VEFHX0lEKSAqLworI2RlZmluZSBXTUlUTFZfT1BfVEFHX0lEX21hY3JvKHBhcmFtX3B0ciwgcGFyYW1fbGVuLCB3bWlfY21kX2V2ZW50X2lkLCBlbGVtX3Rsdl90YWcsIGVsZW1fc3RydWNfdHlwZSwgZWxlbV9uYW1lLCB2YXJfbGVuLCBhcnJfc2l6ZSkgIFwKKwl3bWlfY21kX2V2ZW50X2lkICMjIF90bHZfdGFnXyAjIyBlbGVtX25hbWUgPSBlbGVtX3Rsdl90YWcsCisKKy8qIG1hY3JvIHRvIGRlZmluZSB0aGUgVExWIG5hbWUgd2l0aCB0aGUgVExWIHN0cnVjdHVyZSBzaXplLiBNYXkgbm90IGJlIGFjY3VyYXRlIHdoZW4gdmFyaWFibGUgbGVuZ3RoLiBXaGVuIChvcD09VEFHX1NJWkVPRikgKi8KKyNkZWZpbmUgV01JVExWX09QX1RBR19TSVpFT0ZfbWFjcm8ocGFyYW1fcHRyLCBwYXJhbV9sZW4sIHdtaV9jbWRfZXZlbnRfaWQsIGVsZW1fdGx2X3RhZywgZWxlbV9zdHJ1Y190eXBlLCBlbGVtX25hbWUsIHZhcl9sZW4sIGFycl9zaXplKQkgXAorCXdtaV9jbWRfZXZlbnRfaWQgIyMgX3NpemVvZl8gIyMgZWxlbV9uYW1lID0gc2l6ZW9mKGVsZW1fc3RydWNfdHlwZSksCisKKy8qIG1hY3JvIHRvIGRlZmluZSB0aGUgVExWIG5hbWUgd2l0aCB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFRMViBpcyB2YXJpYWJsZSBsZW5ndGguIFdoZW4gKG9wPT1UQUdfVkFSX1NJWkVEKSAqLworI2RlZmluZSBXTUlUTFZfT1BfVEFHX1ZBUl9TSVpFRF9tYWNybyhwYXJhbV9wdHIsIHBhcmFtX2xlbiwgd21pX2NtZF9ldmVudF9pZCwgZWxlbV90bHZfdGFnLCBlbGVtX3N0cnVjX3R5cGUsIGVsZW1fbmFtZSwgdmFyX2xlbiwgYXJyX3NpemUpICBcCisJd21pX2NtZF9ldmVudF9pZCAjIyBfdmFyX3NpemVkXyAjIyBlbGVtX25hbWUgPSB2YXJfbGVuLAorCisvKiBtYWNybyB0byBkZWZpbmUgdGhlIFRMViBuYW1lIHdpdGggdmFsdWUgaW5kaWNhdGluZyB0aGUgZml4ZWQgYXJyYXkgc2l6ZS4gV2hlbiAob3A9PVRBR19BUlJfU0laRSkgKi8KKyNkZWZpbmUgV01JVExWX09QX1RBR19BUlJfU0laRV9tYWNybyhwYXJhbV9wdHIsIHBhcmFtX2xlbiwgd21pX2NtZF9ldmVudF9pZCwgZWxlbV90bHZfdGFnLCBlbGVtX3N0cnVjX3R5cGUsIGVsZW1fbmFtZSwgdmFyX2xlbiwgYXJyX3NpemUpICBcCisJd21pX2NtZF9ldmVudF9pZCAjIyBfYXJyX3NpemVfICMjIGVsZW1fbmFtZSA9IGFycl9zaXplLAorCisvKgorICogbWFjcm8gdG8gZGVmaW5lIGFmZXcgZmllbGRzIGFzc29jaWF0ZWQgdG8gYSBUTFYuIEZvciBleGFtcGxlLCBhIHN0cnVjdHVyZSBwb2ludGVyIHdpdGggdGhlIFRMViBuYW1lLgorICogVGhpcyBtYWNybyBpcyBleHBhbmQgZnJvbSBXTUlUTFZfRUxFTShvcCkgd2hlbiAob3A9PVNUUlVDVF9GSUVMRCkuCisgKiBOT1RFOiBJZiB0aGlzIG1hY3JvIGlzIGNoYW5nZWQsIHRoZW4gIm1pcnJvciIgc3RydWN0dXJlIHdtaXRsdl9jbWRfcGFyYW1faW5mbworICogc2hvdWxkIGJlIHVwZGF0ZWQgdG9vLgorICovCisjZGVmaW5lIFdNSVRMVl9PUF9TVFJVQ1RfRklFTERfbWFjcm8ocGFyYW1fcHRyLCBwYXJhbV9sZW4sIHdtaV9jbWRfZXZlbnRfaWQsIGVsZW1fdGx2X3RhZywgZWxlbV9zdHJ1Y190eXBlLCBlbGVtX25hbWUsIHZhcl9sZW4sIGFycl9zaXplKSAgXAorCWVsZW1fc3RydWNfdHlwZSAqZWxlbV9uYW1lOyBcCisJQV9VSU5UMzIgV01JVExWX0ZJRUxEX05VTV9PRihlbGVtX25hbWUpOyBcCisJQV9VSU5UMzIgV01JVExWX0ZJRUxEX0JVRl9JU19BTExPQ0FURUQoZWxlbV9uYW1lKTsKKworLyoKKyAqIEEgIm1pcnJvciIgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGZpZWxkcyB0aGF0IGlzIGNyZWF0ZWQgYnkgdGhlCisgKiBtYWNybyBXTUlUTFZfT1BfU1RSVUNUX0ZJRUxEX21hY3JvLgorICogTk9URTogeW91IHNob3VsZCBtb2RpZnkgdGhpcyBzdHJ1Y3R1cmUgYW5kIFdNSVRMVl9PUF9TVFJVQ1RfRklFTERfbWFjcm8KKyAqIHNvIHRoYXQgdGhleSBib3RoIGhhcyB0aGUgc2FtZSBraW5kIG9mIGZpZWxkcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKnRsdl9wdHI7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIFRMViBCdWZmZXIuIEJ1dCB0aGUgInJlYWwiIG9uZSB3aWxsIGhhdmUgdGhlIHJpZ2h0IHR5cGUgaW5zdGVhZCBvZiB2b2lkLiAqLworCUFfVUlOVDMyIG51bV9lbGVtZW50czsgICAgICAgICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzLiBGb3Igbm9uLWFycmF5LCB0aGlzIGlzIG9uZS4gRm9yIGFycmF5LCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuICovCisJQV9VSU5UMzIgYnVmX2lzX2FsbG9jYXRlZDsgICAgICAgICAgICAgIC8qIEJvb2xlYW4gZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgZm9yIHRoaXMgVExWLiAqLworfSB3bWl0bHZfY21kX3BhcmFtX2luZm87CisKKy8qCisgKiBOT1RFIFRSSUNLWSBNQUNSTzoKKyAqICBXTUlUTFZfRUxFTSBpcyByZS1kZWZpbmVkIHRvIGEgIm9wIiBzcGVjaWZpYyBtYWNyby4KKyAqICBFZy4gV01JVExWX09QX1RBR19PUkRFUl9tYWNybyBpcyBjcmVhdGVkIGZvciB0aGUgb3BfdHlwZT1UQUdfT1JERVIuCisgKi8KKyNkZWZpbmUgV01JVExWX0VMRU0od21pX2NtZF9ldmVudF9pZCwgb3BfdHlwZSwgcGFyYW1fcHRyLCBwYXJhbV9sZW4sIGVsZW1fdGx2X3RhZywgZWxlbV9zdHJ1Y190eXBlLCBlbGVtX25hbWUsIHZhcl9sZW4pCVwKKwlXTUlUTFZfT1BfICMjIG9wX3R5cGUgIyMgX21hY3JvKHBhcmFtX3B0ciwgcGFyYW1fbGVuLCB3bWlfY21kX2V2ZW50X2lkLCBlbGVtX3Rsdl90YWcsIGVsZW1fc3RydWNfdHlwZSwgZWxlbV9uYW1lLCB2YXJfbGVuLCBXTUlUTFZfQVJSX1NJWkVfSU5WQUxJRCkKKy8qCisgKiAgV01JVExWX0ZYQVIgKEZpWCBBUnJheSkgaXMgc2ltaWxhciB0byBXTUlUTFZfRUxFTSBleGNlcHQgaXQgaGFzIGFuIGV4dHJhIHBhcmFtZXRlciBmb3IgdGhlIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAqICBJdCBpcyByZS1kZWZpbmVkIHRvIGEgIm9wIiBzcGVjaWZpYyBtYWNyby4KKyAqICBFZy4gV01JVExWX09QX1RBR19PUkRFUl9tYWNybyBpcyBjcmVhdGVkIGZvciB0aGUgb3BfdHlwZT1UQUdfT1JERVIuCisgKi8KKyNkZWZpbmUgV01JVExWX0ZYQVIod21pX2NtZF9ldmVudF9pZCwgb3BfdHlwZSwgcGFyYW1fcHRyLCBwYXJhbV9sZW4sIGVsZW1fdGx2X3RhZywgZWxlbV9zdHJ1Y190eXBlLCBlbGVtX25hbWUsIHZhcl9sZW4sIGFycl9zaXplKSBcCisJV01JVExWX09QXyAjIyBvcF90eXBlICMjIF9tYWNybyhwYXJhbV9wdHIsIHBhcmFtX2xlbiwgd21pX2NtZF9ldmVudF9pZCwgZWxlbV90bHZfdGFnLCBlbGVtX3N0cnVjX3R5cGUsIGVsZW1fbmFtZSwgdmFyX2xlbiwgYXJyX3NpemUpCisKKyNkZWZpbmUgV01JVExWX1RBQkxFKGlkLG9wLGJ1ZixsZW4pIFdNSVRMVl9UQUJMRV8gIyMgaWQoaWQsb3AsYnVmLGxlbikKKworLyoKKyAqIFRoaXMgbWFjcm8gd2lsbCBjcmVhdGUgdmFyaW91cyBlbnVtZXJhdGlvbnMgYW5kIHN0cnVjdHVyZXMgdG8gZGVzY3JpYmUgdGhlIFRMVnMgZm9yCisgKiB0aGUgZ2l2ZW4gQ29tbWFuZC9FdmVudCBJRC4KKyAqCisgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpcyBmb3IgV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRDoKKyAqICAgICNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9TRVJWSUNFX1JFQURZX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICogICAgICAgV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfc2VydmljZV9yZWFkeV9ldmVudF9maXhlZF9wYXJhbSwgd21pX3NlcnZpY2VfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpICAgICBcCisgKiAgICAgICBXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX0hBTF9SRUdfQ0FQQUJJTElUSUVTLCBIQUxfUkVHX0NBUEFCSUxJVElFUywgaGFsX3JlZ19jYXBhYmlsaXRpZXMsIFdNSVRMVl9TSVpFX0ZJWCkgIFwKKyAqICAgICAgIFdNSVRMVl9GWEFSKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgd21pX3NlcnZpY2VfYml0bWFwLCBXTUlUTFZfU0laRV9GSVgsIFdNSV9TRVJWSUNFX0JNX1NJWkUpIFwKKyAqICAgICAgIFdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdsYW5faG9zdF9tZW1fcmVxLCBtZW1fcmVxcywgV01JVExWX1NJWkVfVkFSKQorICogICAgV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEKTsKKyAqIFRoaXMgbWFjcm8gd2lsbCBjcmVhdGUgdGhlIGZvbGxvd2luZyB0ZXh0OgorICoKKyAqIHR5cGVkZWYgZW51bSB7CisgKiAgICBXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEX3Rsdl9vcmRlcl93bWlfc2VydmljZV9yZWFkeV9ldmVudF9maXhlZF9wYXJhbSwKKyAqICAgIFdNSV9TRVJWSUNFX1JFQURZX0VWRU5USURfdGx2X29yZGVyX2hhbF9yZWdfY2FwYWJpbGl0aWVzLAorICogICAgV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF90bHZfb3JkZXJfd21pX3NlcnZpY2VfYml0bWFwLAorICogICAgV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF90bHZfb3JkZXJfbWVtX3JlcXMsCisgKiAgICBXTUlfVExWX0hMUFJfTlVNX1RMVlNfRk9SX1dNSV9TRVJWSUNFX1JFQURZX0VWRU5USUQKKyAqIH0gV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF9UQUdfSURfZW51bV90eXBlOworICogLy9OT1RFOiBXTUlfVExWX0hMUFJfTlVNX1RMVlNfRk9SX1dNSV9TRVJWSUNFX1JFQURZX0VWRU5USUQgaXMgdGhlIG51bWJlciBvZiBUTFZzLgorICoKKyAqIHR5cGVkZWYgZW51bSB7CisgKiAgICBXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEX3Rsdl90YWdfd21pX3NlcnZpY2VfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW0gPSBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zZXJ2aWNlX3JlYWR5X2V2ZW50X2ZpeGVkX3BhcmFtLAorICogICAgV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF90bHZfdGFnX2hhbF9yZWdfY2FwYWJpbGl0aWVzID0gV01JVExWX1RBR19TVFJVQ19IQUxfUkVHX0NBUEFCSUxJVElFUywKKyAqICAgIFdNSV9TRVJWSUNFX1JFQURZX0VWRU5USURfdGx2X3RhZ193bWlfc2VydmljZV9iaXRtYXAgPSBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwKKyAqICAgIFdNSV9TRVJWSUNFX1JFQURZX0VWRU5USURfdGx2X3RhZ19tZW1fcmVxcyA9IFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisgKiB9IFdNSV9TRVJWSUNFX1JFQURZX0VWRU5USURfVEFHX09SREVSX2VudW1fdHlwZTsKKyAqCisgKiB0eXBlZGVmIGVudW0geworICogICAgV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF9zaXplb2Zfd21pX3NlcnZpY2VfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW0gPSBzaXplb2Yod21pX3NlcnZpY2VfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW0pLAorICogICAgV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF9zaXplb2ZfaGFsX3JlZ19jYXBhYmlsaXRpZXMgPSBzaXplb2YoSEFMX1JFR19DQVBBQklMSVRJRVMpLAorICogICAgV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF9zaXplb2Zfd21pX3NlcnZpY2VfYml0bWFwID0gc2l6ZW9mKEFfVUlOVDMyKSwKKyAqICAgIFdNSV9TRVJWSUNFX1JFQURZX0VWRU5USURfc2l6ZW9mX21lbV9yZXFzID0gc2l6ZW9mKHdsYW5faG9zdF9tZW1fcmVxKSwKKyAqIH0gV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF9UQUdfU0laRU9GX2VudW1fdHlwZTsKKyAqCisgKiB0eXBlZGVmIGVudW0geworICogICAgV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRF92YXJfc2l6ZWRfd21pX3NlcnZpY2VfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW0gPSBXTUlUTFZfU0laRV9GSVgsCisgKiAgICBXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEX3Zhcl9zaXplZF9oYWxfcmVnX2NhcGFiaWxpdGllcyA9IFdNSVRMVl9TSVpFX0ZJWCwKKyAqICAgIFdNSV9TRVJWSUNFX1JFQURZX0VWRU5USURfdmFyX3NpemVkX3dtaV9zZXJ2aWNlX2JpdG1hcCA9IFdNSVRMVl9TSVpFX1ZBUiwKKyAqICAgIFdNSV9TRVJWSUNFX1JFQURZX0VWRU5USURfdmFyX3NpemVkX21lbV9yZXFzID0gV01JVExWX1NJWkVfVkFSLAorICogfSBXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEX1RBR19WQVJfU0laRURfZW51bV90eXBlOworICoKKyAqIHR5cGVkZWYgZW51bSB7CisgKiAgICBXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEX2Fycl9zaXplX3dtaV9zZXJ2aWNlX3JlYWR5X2V2ZW50X2ZpeGVkX3BhcmFtID0gV01JVExWX0FSUl9TSVpFX0lOVkFMSUQsCisgKiAgICBXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEX2Fycl9zaXplX2hhbF9yZWdfY2FwYWJpbGl0aWVzID0gV01JVExWX0FSUl9TSVpFX0lOVkFMSUQsCisgKiAgICBXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEX2Fycl9zaXplX3dtaV9zZXJ2aWNlX2JpdG1hcCA9IFdNSV9TRVJWSUNFX0JNX1NJWkUsCisgKiAgICBXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEX2Fycl9zaXplX21lbV9yZXFzID0gV01JVExWX0FSUl9TSVpFX0lOVkFMSUQsCisgKiB9IFdNSV9TRVJWSUNFX1JFQURZX0VWRU5USURfVEFHX0FSUl9TSVpFX2VudW1fdHlwZTsKKyAqCisgKiB0eXBlZGVmIHN0cnVjdCB7CisgKiAgICB3bWlfc2VydmljZV9yZWFkeV9ldmVudF9maXhlZF9wYXJhbSAqZml4ZWRfcGFyYW07CisgKiAgICBBX1VJTlQzMiBudW1fZml4ZWRfcGFyYW07CisgKiAgICBBX1VJTlQzMiBpc19hbGxvY2F0ZWRfZml4ZWRfcGFyYW07CisgKiAgICBIQUxfUkVHX0NBUEFCSUxJVElFUyAqaGFsX3JlZ19jYXBhYmlsaXRpZXM7CisgKiAgICBBX1VJTlQzMiBudW1faGFsX3JlZ19jYXBhYmlsaXRpZXM7CisgKiAgICBBX1VJTlQzMiBpc19hbGxvY2F0ZWRfaGFsX3JlZ19jYXBhYmlsaXRpZXM7CisgKiAgICBBX1VJTlQzMiAqd21pX3NlcnZpY2VfYml0bWFwOworICogICAgQV9VSU5UMzIgbnVtX3dtaV9zZXJ2aWNlX2JpdG1hcDsKKyAqICAgIEFfVUlOVDMyIGlzX2FsbG9jYXRlZF93bWlfc2VydmljZV9iaXRtYXA7CisgKiAgICB3bGFuX2hvc3RfbWVtX3JlcSAqbWVtX3JlcXM7CisgKiAgICBBX1VJTlQzMiBudW1fbWVtX3JlcXM7CisgKiAgICBBX1VJTlQzMiBpc19hbGxvY2F0ZWRfbWVtX3JlcXM7CisgKgorICogfSBXTUlfU0VSVklDRV9SRUFEWV9FVkVOVElEX3BhcmFtX3RsdnM7CisgKgorICovCisKKyNkZWZpbmUgV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyh3bWlfY21kX2V2ZW50X2lkKQkgICAgICAgXAorCXR5cGVkZWYgZW51bSB7CQkJCQkJICAgXAorCQlXTUlUTFZfVEFCTEUod21pX2NtZF9ldmVudF9pZCwgVEFHX09SREVSLCBOVUxMLCAwKSAgICAgXAorCQlXTUlfVExWX0hMUFJfTlVNX1RMVlNfRk9SXyAjIyB3bWlfY21kX2V2ZW50X2lkCQkgXAorCX0gd21pX2NtZF9ldmVudF9pZCAjIyBfVEFHX09SREVSX2VudW1fdHlwZTsJCSAgICAgXAorCQkJCQkJCSAgICAgICBcCisJdHlwZWRlZiBzdHJ1Y3QgewkJCQkJICAgXAorCQlXTUlUTFZfVEFCTEUod21pX2NtZF9ldmVudF9pZCwgU1RSVUNUX0ZJRUxELCBOVUxMLCAwKSAgXAorCX0gV01JVExWX1RZUEVERUZfU1RSVUNUX1BBUkFNU19UTFZTICh3bWlfY21kX2V2ZW50X2lkKTsJICAgIFwKKworLyoqIEVudW0gbGlzdCBvZiBUTFYgVGFncyBmb3IgZWFjaCBwYXJhbWV0ZXIgc3RydWN0dXJlIHR5cGUuICovCit0eXBlZGVmIGVudW0geworCS8qIDAgdG8gMTUgaXMgcmVzZXJ2ZWQgKi8KKwlXTUlUTFZfVEFHX0xBU1RfUkVTRVJWRUQgPSAxNSwKKwlXTUlUTFZfVEFHX0ZJUlNUX0FSUkFZX0VOVU0sICAgICAgICAgICAgLyogRmlyc3QgZW50cnkgb2YgQVJSQVkgdHlwZSB0YWdzICovCisJV01JVExWX1RBR19BUlJBWV9VSU5UMzIgPSBXTUlUTFZfVEFHX0ZJUlNUX0FSUkFZX0VOVU0sCisJV01JVExWX1RBR19BUlJBWV9CWVRFLAorCVdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsCisJV01JVExWX1RBR19BUlJBWV9GSVhFRF9TVFJVQywKKwlXTUlUTFZfVEFHX0xBU1RfQVJSQVlfRU5VTSA9IDMxLCAgICAgICAgICAgICAgICAvKiBMYXN0IGVudHJ5IG9mIEFSUkFZIHR5cGUgdGFncyAqLworCVdNSVRMVl9UQUdfU1RSVUNfd21pX3NlcnZpY2VfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19IQUxfUkVHX0NBUEFCSUxJVElFUywKKwlXTUlUTFZfVEFHX1NUUlVDX3dsYW5faG9zdF9tZW1fcmVxLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JlYWR5X2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3NjYW5fZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGRldl90cGNfY29uZmlnX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYW5faW5mb19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9jb21iX3BoeWVycl9yeF9oZHIsCisJV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9zdGFydF9yZXNwb25zZV9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3N0b3BwZWRfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9pbnN0YWxsX2tleV9jb21wbGV0ZV9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX3N0YV9raWNrb3V0X2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX21nbXRfcnhfaGRyLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3RidHRfb2Zmc2V0X2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3R4X2RlbGJhX2NvbXBsZXRlX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3R4X2FkZGJhX2NvbXBsZXRlX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19XT1dfRVZFTlRfSU5GT19maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX1dPV19FVkVOVF9JTkZPX1NFQ1RJT05fQklUTUFQLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3J0dF9ldmVudF9oZWFkZXIsCisJV01JVExWX1RBR19TVFJVQ193bWlfcnR0X2Vycm9yX3JlcG9ydF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9ydHRfbWVhc19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9lY2hvX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2Z0bV9pbnRnX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfZ2V0X2tlZXBhbGl2ZV9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9ncGlvX2lucHV0X2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2NzYV9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX1dNSV9HVEtfT0ZGTE9BRF9TVEFUVVNfRVZFTlRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfaWd0a19pbmZvLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2Rjc19pbnRlcmZlcmVuY2VfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19hdGhfZGNzX2N3X2ludCwKKwlXTUlUTFZfVEFHX1NUUlVDX2F0aF9kY3Nfd2xhbl9pbnRfc3RhdCwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV93bGFuX3Byb2ZpbGVfY3R4X3QsCisJV01JVExWX1RBR19TVFJVQ193bWlfd2xhbl9wcm9maWxlX3QsCisJV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9xdml0X2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2hvc3Rfc3diYV9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV90aW1faW5mbywKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wMnBfbm9hX2luZm8sCisJV01JVExWX1RBR19TVFJVQ193bWlfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfYXZvaWRfZnJlcV9yYW5nZXNfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfYXZvaWRfZnJlcV9yYW5nZV9kZXNjLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2d0a19yZWtleV9mYWlsX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2luaXRfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3Jlc291cmNlX2NvbmZpZywKKwlXTUlUTFZfVEFHX1NUUlVDX3dsYW5faG9zdF9tZW1vcnlfY2h1bmssCisJV01JVExWX1RBR19TVFJVQ193bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfc3RvcF9zY2FuX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zY2FuX2NoYW5fbGlzdF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfY2hhbm5lbCwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF9yZWdkb21haW5fY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc2V0X3BhcmFtX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF93bW1fcGFyYW1zX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV93bW1fcGFyYW1zLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc2V0X3F1aWV0X2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X2NyZWF0ZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9kZWxldGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc3RhcnRfcmVxdWVzdF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcDJwX25vYV9kZXNjcmlwdG9yLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3AycF9nb19zZXRfYmVhY29uX2llX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfV01JX0dUS19PRkZMT0FEX0NNRF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3VwX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3N0b3BfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfZG93bl9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfaW5zdGFsbF9rZXlfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfY3JlYXRlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2RlbGV0ZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9mbHVzaF90aWRzX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9hc3NvY19jb21wbGV0ZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdmh0X3JhdGVfc2V0LAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2Jjbl90bXBsX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wcmJfdG1wbF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfYmNuX3ByYl9pbmZvLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfdGlkX2FkZGJhX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX3RpZF9kZWxiYV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfc3RhX3Bvd2Vyc2F2ZV9tb2RlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfcG93ZXJzYXZlX3BhcmFtX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfZHRpbV9wc19tZXRob2RfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fc2Nhbl9tb2RlX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fc2Nhbl9yc3NpX3RocmVzaG9sZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX3NjYW5fcGVyaW9kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fc2Nhbl9yc3NpX2NoYW5nZV90aHJlc2hvbGRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zdXNwZW5kX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3Jlc3VtZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfYWRkX2Jjbl9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3Jtdl9iY25fZmlsdGVyX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV93b3dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV93b3dfaG9zdHdha2V1cF9mcm9tX3NsZWVwX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfdWFwc2RfYXV0b190cmlnX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfdWFwc2RfYXV0b190cmlnX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfV01JX1NFVF9BUlBfTlNfT0ZGTE9BRF9DTURfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19XTUlfQVJQX09GRkxPQURfVFVQTEUsCisJV01JVExWX1RBR19TVFJVQ19XTUlfTlNfT0ZGTE9BRF9UVVBMRSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9mdG1faW50Z19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19XTUlfU1RBX0tFRVBBTElWRV9DTURfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19XTUlfU1RBX0tFRVBBTFZFX0FSUF9SRVNQT05TRSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wMnBfc2V0X3ZlbmRvcl9pZV9kYXRhX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9hcF9wc19wZWVyX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX3JhdGVfcmV0cnlfc2NoZWRfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3dsYW5fcHJvZmlsZV90cmlnZ2VyX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV93bGFuX3Byb2ZpbGVfc2V0X2hpc3RfaW50dmxfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3dsYW5fcHJvZmlsZV9nZXRfcHJvZl9kYXRhX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV93bGFuX3Byb2ZpbGVfZW5hYmxlX3Byb2ZpbGVfaWRfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfV01JX1dPV19ERUxfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19XTUlfV09XX0FERF9ERUxfRVZUX0NNRF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9ydHRfbWVhc3JlcV9oZWFkLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3J0dF9tZWFzcmVxX2JvZHksCisJV01JVExWX1RBR19TVFJVQ193bWlfcnR0X3RzZl9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9zcGVjdHJhbF9jb25maWd1cmVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc3BlY3RyYWxfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZXF1ZXN0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9ubG9fY29uZmlnX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX25sb19jb25maWd1cmVkX3BhcmFtZXRlcnMsCisJV01JVExWX1RBR19TVFJVQ193bWlfY3NhX29mZmxvYWRfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9jc2Ffb2ZmbG9hZF9jaGFuc3dpdGNoX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGF0dGVyX3NldF9tb2RlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9lY2hvX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF9rZWVwYWxpdmVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfZ2V0X2tlZXBhbGl2ZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19XTUlfRk9SQ0VfRldfSEFOR19DTURfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZ3Bpb19jb25maWdfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2dwaW9fb3V0cHV0X2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2FkZF93ZHNfZW50cnlfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfcmVtb3ZlX3dkc19lbnRyeV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfYmNuX3R4X2hkciwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9iY25fc2VuZF9mcm9tX2hvc3RfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX21nbXRfdHhfaGRyLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2FkZGJhX2NsZWFyX3Jlc3BfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2FkZGJhX3NlbmRfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2RlbGJhX3NlbmRfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2FkZGJhX3NldHJlc3BvbnNlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zZW5kX3NpbmdsZWFtc2R1X2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3BrdGxvZ19lbmFibGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfcGt0bG9nX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc2V0X2h0X2llX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF92aHRfaWVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc2V0X2RzY3BfdGlkX21hcF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9ncmVlbl9hcF9wc19lbmFibGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfZ2V0X3RwY19jb25maWdfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc2V0X2Jhc2VfbWFjYWRkcl9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9tY2FzdF9ncm91cF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9hcF9wcm9maWxlX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2FwX3Byb2ZpbGUsCisJV01JVExWX1RBR19TVFJVQ193bWlfc2Nhbl9zY2hfcHJpb3JpdHlfdGFibGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfZGZzX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9kZnNfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19XTUlfV09XX0FERF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX1dPV19CSVRNQVBfUEFUVEVSTl9ULAorCVdNSVRMVl9UQUdfU1RSVUNfV09XX0lQVjRfU1lOQ19QQVRURVJOX1QsCisJV01JVExWX1RBR19TVFJVQ19XT1dfSVBWNl9TWU5DX1BBVFRFUk5fVCwKKwlXTUlUTFZfVEFHX1NUUlVDX1dPV19NQUdJQ19QQVRURVJOX0NNRCwKKwlXTUlUTFZfVEFHX1NUUlVDX1dNSV9zY2FuX3VwZGF0ZV9yZXF1ZXN0X2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGF0dGVyX3BrdF9jb2FsZXNjaW5nX2ZpbHRlciwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGF0dGVyX2NvYWxlc2NpbmdfYWRkX2ZpbHRlcl9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfY2hhdHRlcl9jb2FsZXNjaW5nX2RlbGV0ZV9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYXR0ZXJfY29hbGVzY2luZ19xdWVyeV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdHhiZl9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZGVidWdfbG9nX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfbmxvX2V2ZW50LAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYXR0ZXJfcXVlcnlfcmVwbHlfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdXBsb2FkX2hfaGRyLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2NhcHR1cmVfaF9ldmVudF9oZHIsCisJV01JVExWX1RBR19TVFJVQ19XTUlfVkRFVl9XTk1fU0xFRVBNT0RFX0NNRF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX1dNSV9WREVWX0lQU0VDX05BVEtFRVBBTElWRV9GSUxURVJfQ01EX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfd21tX2FkZHRzX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3dtbV9kZWx0c19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9zZXRfd21tX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdGRsc19zZXRfc3RhdGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3RkbHNfcGVlcl91cGRhdGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3RkbHNfcGVlcl9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV90ZGxzX3BlZXJfY2FwYWJpbGl0aWVzLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfbWNjX3NldF90YnR0X21vZGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fY2hhbl9saXN0X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfbWNjX2Jjbl9pbnR2bF9jaGFuZ2VfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcmVzbWdyX2FkYXB0aXZlX29jc19lbmFibGVfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcmVzbWdyX3NldF9jaGFuX3RpbWVfcXVvdGFfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3Jlc21ncl9zZXRfY2hhbl9sYXRlbmN5X2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9iYV9yZXFfc3NuX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9iYV9yc3Bfc3NuX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YV9zbXBzX2ZvcmNlX21vZGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfV01JX1NFVF9NQ0FTVEJDQVNUX0ZJTFRFUl9DTURfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcDJwX3NldF9vcHBwc19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcDJwX3NldF9ub2FfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2JhX3JlcV9zc25fY21kX3N1Yl9zdHJ1Y3RfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfYmFfcmVxX3Nzbl9ldmVudF9zdWJfc3RydWN0X3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YV9zbXBzX3BhcmFtX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF9ndHhfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9tY2Nfc2NoZWRfdHJhZmZpY19zdGF0c19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfbWNjX3NjaGVkX3N0YV90cmFmZmljX3N0YXRzLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX29mZmxvYWRfYmNuX3R4X3N0YXR1c19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wMnBfbm9hX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2hiX3NldF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2hiX3NldF90Y3BfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9oYl9zZXRfdGNwX3BrdF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2hiX3NldF91ZHBfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9oYl9zZXRfdWRwX3BrdF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2hiX2luZF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV90eF9wYXVzZV9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZmtpbGxfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZGZzX3JhZGFyX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2Rmc19waHllcnJfZmlsdGVyX2VuYV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZGZzX3BoeWVycl9maWx0ZXJfZGlzX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9iYXRjaF9zY2FuX3Jlc3VsdF9zY2FuX2xpc3QsCisJV01JVExWX1RBR19TVFJVQ193bWlfYmF0Y2hfc2Nhbl9yZXN1bHRfbmV0d29ya19pbmZvLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2JhdGNoX3NjYW5fZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9iYXRjaF9zY2FuX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2JhdGNoX3NjYW5fdHJpZ2dlcl9yZXN1bHRfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2JhdGNoX3NjYW5fZW5hYmxlZF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9iYXRjaF9zY2FuX3Jlc3VsdF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3BsbXJlcV9zdGFydF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9wbG1yZXFfc3RvcF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdGhlcm1hbF9tZ210X2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV90aGVybWFsX21nbXRfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9pbmZvX3JlcV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9pbmZvX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfaW5mbywKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX3R4X2ZhaWxfY250X3Rocl9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9ybWNfc2V0X21vZGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JtY19zZXRfYWN0aW9uX3BlcmlvZF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcm1jX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfbWhmX29mZmxvYWRfc2V0X21vZGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX21oZl9vZmZsb2FkX3BsdW1iX3JvdXRpbmdfdGFibGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfV01JX0FERF9QUk9BQ1RJVkVfQVJQX1JTUF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX1dNSV9ERUxfUFJPQUNUSVZFX0FSUF9SU1BfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfbmFuX2NtZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9uYW5fZXZlbnRfaGRyLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfbDFzc190cmFja19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kaWFnX2RhdGFfY29udGFpbmVyX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX21vZGVtX3Bvd2VyX3N0YXRlX2NtZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2dldF9lc3RpbWF0ZWRfbGlua3NwZWVkX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2VzdGltYXRlZF9saW5rc3BlZWRfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfYWdncl9zdGF0ZV90cmlnX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX21oZl9vZmZsb2FkX3JvdXRpbmdfdGFibGVfZW50cnksCisJV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZXFfc3RhdHNfZXh0X2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGF0c19leHRfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfb2Jzc19zY2FuX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfb2Jzc19zY2FuX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX29mZmxvYWRfcHJiX3JzcF90eF9zdGF0dXNfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zZXRfbGVkX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfaG9zdF9hdXRvX3NodXRkb3duX2NmZ19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfaG9zdF9hdXRvX3NodXRkb3duX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3VwZGF0ZV93aGFsX21pYl9zdGF0c19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGFuX2F2b2lkX3VwZGF0ZV9jbWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19XT1dfSU9BQ19QS1RfUEFUVEVSTl9ULAorCVdNSVRMVl9UQUdfU1RSVUNfV09XX0lPQUNfVE1SX1BBVFRFUk5fVCwKKwlXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfSU9BQ19BRERfS0VFUEFMSVZFX0NNRF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfSU9BQ19ERUxfS0VFUEFMSVZFX0NNRF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfSU9BQ19LRUVQQUxJVkVfVCwKKwlXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfSU9BQ19BRERfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ19XTUlfV09XX0lPQUNfREVMX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YXJ0X2xpbmtfc3RhdHNfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2NsZWFyX2xpbmtfc3RhdHNfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JlcXVlc3RfbGlua19zdGF0c19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfaWZhY2VfbGlua19zdGF0c19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yYWRpb19saW5rX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfY2hhbm5lbF9zdGF0cywKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yYWRpb19saW5rX3N0YXRzLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JhdGVfc3RhdHMsCisJV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9saW5rX3N0YXRzLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3dtbV9hY19zdGF0cywKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9pZmFjZV9saW5rX3N0YXRzLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2xwaV9tZ210X3Nub29waW5nX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfbHBpX3N0YXJ0X3NjYW5fY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2xwaV9zdG9wX3NjYW5fY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2xwaV9yZXN1bHRfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9zdGF0ZV9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2J1Y2tldF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9idWNrZXRfY2hhbm5lbF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3N0YXJ0X2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3N0b3BfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY29uZmlndXJlX3dsYW5fY2hhbmdlX21vbml0b3JfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfYnNzaWRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY29uZmlndXJlX2hvdGxpc3RfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHNfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fZ2V0X3dsYW5fY2hhbmdlX3Jlc3VsdHNfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fc2V0X2NhcGFiaWxpdGllc19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9nZXRfY2FwYWJpbGl0aWVzX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX29wZXJhdGlvbl9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3N0YXJ0X3N0b3BfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl90YWJsZV91c2FnZV9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3dsYW5fZGVzY3JpcHRvcl9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3Jzc2lfaW5mb19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfcmVzdWx0c19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3dsYW5fY2hhbmdlX3Jlc3VsdF9ic3NpZF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2hvdGxpc3RfbWF0Y2hfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9jYXBhYmlsaXRpZXNfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9jYWNoZV9jYXBhYmlsaXRpZXNfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9tb25pdG9yX2NhcGFiaWxpdGllc19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2hvdGxpc3RfbW9uaXRvcl9jYXBhYmlsaXRpZXNfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZDBfd293X2VuYWJsZV9kaXNhYmxlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kMF93b3dfZGlzYWJsZV9hY2tfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdW5pdF90ZXN0X2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX29mZmxvYWRfdGx2X3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fMTFpX29mZmxvYWRfdGx2X3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fMTFyX29mZmxvYWRfdGx2X3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fZXNlX29mZmxvYWRfdGx2X3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fc3luY2hfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zeW5jaF9jb21wbGV0ZV9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHR3b3dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHR3b3dfc2V0X2FwcF90eXBlMV9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHdvd19zZXRfYXBwX3R5cGUyX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfbHBpX3N0YXR1c19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9scGlfaGFuZG9mZl9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3JhdGVfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9yYXRlX2h0X2luZm8sCisJV01JVExWX1RBR19TVFJVQ193bWlfcmljX3JlcXVlc3RfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9nZXRfdGVtcGVyYXR1cmVfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfdGVtcGVyYXR1cmVfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfc2V0X2RoY3Bfc2VydmVyX29mZmxvYWRfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3RwY19jaGFpbm1hc2tfY29uZmlnX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yaWNfdHNwZWMsCisJV01JVExWX1RBR19TVFJVQ193bWlfdHBjX2NoYWlubWFza19jb25maWcsCisJV01JVExWX1RBR19TVFJVQ1Rfd21pX2lwYV9vZmZsb2FkX2VuYWJsZV9kaXNhYmxlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zY2FuX3Byb2JfcmVxX291aV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfa2V5X21hdGVyaWFsLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3RkbHNfc2V0X29mZmNoYW5fbW9kZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfc2V0X2xlZF9mbGFzaGluZ19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfbWRuc19vZmZsb2FkX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZG5zX3NldF9mcWRuX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZG5zX3NldF9yZXNwX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZG5zX2dldF9zdGF0c19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfbWRuc19zdGF0c19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX2ludm9rZV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9yZXN1bWVfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zZXRfYW50ZW5uYV9kaXZlcnNpdHlfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3NhcF9vZmxfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zYXBfb2ZsX2FkZF9zdGFfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfc2FwX29mbF9kZWxfc3RhX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2FwZmluZF9jbWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfYXBmaW5kX2V2ZW50X2hkciwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc2V0X3NjaGVkX2NtZF9maXhlZF9wYXJhbSwgLyogREVQUkVDQVRFRCAqLworCVdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9zZXRfc2NoZWRfZXZlbnRfZml4ZWRfcGFyYW0sIC8qIERFUFJFQ0FURUQgKi8KKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc2V0X2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfb2NiX3NldF9jb25maWdfcmVzcF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc2V0X3V0Y190aW1lX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfb2NiX3N0b3BfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfb2NiX2dldF90c2ZfdGltZXJfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9nZXRfdHNmX3RpbWVyX3Jlc3BfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZGNjX2dldF9zdGF0c19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZGNjX2NoYW5uZWxfc3RhdHNfcmVxdWVzdCwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfZ2V0X3N0YXRzX3Jlc3BfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZGNjX2NsZWFyX3N0YXRzX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfdXBkYXRlX25kbF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZGNjX3VwZGF0ZV9uZGxfcmVzcF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2Nfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfb2NiX2NoYW5uZWwsCisJV01JVExWX1RBR19TVFJVQ193bWlfb2NiX3NjaGVkdWxlX2VsZW1lbnQsCisJV01JVExWX1RBR19TVFJVQ193bWlfZGNjX25kbF9zdGF0c19wZXJfY2hhbm5lbCwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfbmRsX2NoYW4sCisJV01JVExWX1RBR19TVFJVQ193bWlfcW9zX3BhcmFtZXRlciwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9jb25maWcsCisJV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX2V4dGVuZGVkX3RocmVzaG9sZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX2ZpbHRlcl9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wYXNzcG9pbnRfY29uZmlnX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wYXNzcG9pbnRfZXZlbnRfaGRyLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY29uZmlndXJlX2hvdGxpc3Rfc3NpZF9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2hvdGxpc3Rfc3NpZF9tYXRjaF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3RzZl90c3RhbXBfYWN0aW9uX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3RzZl9yZXBvcnRfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZ2V0X2Z3X21lbV9kdW1wX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3VwZGF0ZV9md19tZW1fZHVtcF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9md19tZW1fZHVtcF9wYXJhbXMsCisJV01JVExWX1RBR19TVFJVQ193bWlfZGVidWdfbWVzZ19mbHVzaF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kZWJ1Z19tZXNnX2ZsdXNoX2NvbXBsZXRlX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfc2V0X3JhdGVfcmVwb3J0X2NvbmRpdGlvbl9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX3N1Ym5ldF9jaGFuZ2VfY29uZmlnX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc2V0X2llX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yc3NpX2JyZWFjaF9tb25pdG9yX2NvbmZpZ19maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9yc3NpX2JyZWFjaF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX1dPV19FVkVOVF9JTklUSUFMX1dBS0VVUF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zb2Nfc2V0X3BjbF9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfc29jX3NldF9od19tb2RlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zb2Nfc2V0X2h3X21vZGVfcmVzcG9uc2VfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfc29jX2h3X21vZGVfdHJhbnNpdGlvbl9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3R4cnhfc3RyZWFtcywKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zb2Nfc2V0X2h3X21vZGVfcmVzcG9uc2VfdmRldl9tYWNfZW50cnksCisJV01JVExWX1RBR19TVFJVQ193bWlfc29jX3NldF9kdWFsX21hY19jb25maWdfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnX3Jlc3BvbnNlX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfV09XX0lPQUNfU09DS19QQVRURVJOX1QsCisJV01JVExWX1RBR19TVFJVQ193bWlfd293X2VuYWJsZV9pY21wdjZfbmFfZmx0X2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9kaWFnX2V2ZW50X2xvZ19jb25maWdfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfZGlhZ19ldmVudF9sb2dfc3VwcG9ydGVkX2V2ZW50X2ZpeGVkX3BhcmFtcywKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wYWNrZXRfZmlsdGVyX2NvbmZpZ19maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wYWNrZXRfZmlsdGVyX2VuYWJsZV9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zYXBfc2V0X2JsYWNrbGlzdF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfbWdtdF90eF9zZW5kX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZ210X3R4X2NvbXBsX2V2ZW50X2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfYW50ZW5uYV9tb2RlX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfVURQX1NWQ19PRkxEX0NNRF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9scm9faW5mb19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9lYXJseXN0b3BfcnNzaV90aHJlc19wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9zZXJ2aWNlX3JlYWR5X2V4dF9ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9tYXdjX3NlbnNvcl9yZXBvcnRfaW5kX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9tYXdjX2VuYWJsZV9zZW5zb3JfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9jb25maWd1cmVfbWF3Y19jbWRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfbmxvX2NvbmZpZ3VyZV9tYXdjX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2NvbmZpZ3VyZV9tYXdjX2NtZF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2Fzc29jX2NvbmZfZXZlbnRfZml4ZWRfcGFyYW0sCisJV01JVExWX1RBR19TVFJVQ193bWlfd293X2hvc3R3YWtldXBfZ3Bpb19waW5fcGF0dGVybl9jb25maWdfY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2FwX3BzX2VnYXBfcGFyYW1fY21kX2ZpeGVkX3BhcmFtLAorCVdNSVRMVl9UQUdfU1RSVUNfd21pX2FwX3BzX2VnYXBfaW5mb19ldmVudF9maXhlZF9wYXJhbSwKKwlXTUlUTFZfVEFHX1NUUlVDX1dNSV9QTUZfT0ZGTE9BRF9TRVRfU0FfUVVFUllfQ01EX2ZpeGVkX3BhcmFtLAorfSBXTUlUTFZfVEFHX0lEOworCisvKgorICogSU1QT1JUQU5UOiBQbGVhc2UgYWRkIF9BTExfIFdNSSBDb21tYW5kcyBIZXJlLgorICogT3RoZXJ3aXNlLCB0aGVzZSBXTUkgVExWIEZ1bmN0aW9ucyB3aWxsIGJlIHByb2Nlc3MgdGhlbS4KKyAqLworI2RlZmluZSBXTUlUTFZfQUxMX0NNRF9MSVNUKE9QKQlcCisJT1AoV01JX0lOSVRfQ01ESUQpIFwKKwlPUChXTUlfUEVFUl9DUkVBVEVfQ01ESUQpIFwKKwlPUChXTUlfUEVFUl9ERUxFVEVfQ01ESUQpIFwKKwlPUChXTUlfUEVFUl9GTFVTSF9USURTX0NNRElEKSBcCisJT1AoV01JX1BFRVJfU0VUX1BBUkFNX0NNRElEKSBcCisJT1AoV01JX1NUQV9QT1dFUlNBVkVfTU9ERV9DTURJRCkgXAorCU9QKFdNSV9TVEFfUE9XRVJTQVZFX1BBUkFNX0NNRElEKSBcCisJT1AoV01JX1NUQV9EVElNX1BTX01FVEhPRF9DTURJRCkgXAorCU9QKFdNSV9QREVWX1NFVF9SRUdET01BSU5fQ01ESUQpIFwKKwlPUChXTUlfUEVFUl9USURfQUREQkFfQ01ESUQpIFwKKwlPUChXTUlfUEVFUl9USURfREVMQkFfQ01ESUQpIFwKKwlPUChXTUlfUERFVl9GVE1fSU5UR19DTURJRCkgXAorCU9QKFdNSV9XT1dfSE9TVFdBS0VVUF9GUk9NX1NMRUVQX0NNRElEKQlcCisJT1AoV01JX1dPV19FTkFCTEVfQ01ESUQpIFwKKwlPUChXTUlfUk1WX0JDTl9GSUxURVJfQ01ESUQpIFwKKwlPUChXTUlfUk9BTV9TQ0FOX01PREUpIFwKKwlPUChXTUlfUk9BTV9TQ0FOX1JTU0lfVEhSRVNIT0xEKSBcCisJT1AoV01JX1JPQU1fU0NBTl9QRVJJT0QpIFwKKwlPUChXTUlfUk9BTV9TQ0FOX1JTU0lfQ0hBTkdFX1RIUkVTSE9MRCkJXAorCU9QKFdNSV9TVEFSVF9TQ0FOX0NNRElEKSBcCisJT1AoV01JX1ZERVZfUExNUkVRX1NUQVJUX0NNRElEKQlcCisJT1AoV01JX1ZERVZfUExNUkVRX1NUT1BfQ01ESUQpIFwKKwlPUChXTUlfUERFVl9TRVRfQ0hBTk5FTF9DTURJRCkgXAorCU9QKFdNSV9QREVWX1NFVF9XTU1fUEFSQU1TX0NNRElEKSBcCisJT1AoV01JX1ZERVZfU1RBUlRfUkVRVUVTVF9DTURJRCkgXAorCU9QKFdNSV9WREVWX1JFU1RBUlRfUkVRVUVTVF9DTURJRCkgXAorCU9QKFdNSV9QMlBfR09fU0VUX0JFQUNPTl9JRSkgXAorCU9QKFdNSV9HVEtfT0ZGTE9BRF9DTURJRCkgXAorCU9QKFdNSV9TQ0FOX0NIQU5fTElTVF9DTURJRCkgXAorCU9QKFdNSV9TVEFfVUFQU0RfQVVUT19UUklHX0NNRElEKSBcCisJT1AoV01JX1BSQl9UTVBMX0NNRElEKSBcCisJT1AoV01JX0JDTl9UTVBMX0NNRElEKSBcCisJT1AoV01JX1ZERVZfSU5TVEFMTF9LRVlfQ01ESUQpIFwKKwlPUChXTUlfUEVFUl9BU1NPQ19DTURJRCkgXAorCU9QKFdNSV9BRERfQkNOX0ZJTFRFUl9DTURJRCkgXAorCU9QKFdNSV9TVEFfS0VFUEFMSVZFX0NNRElEKSBcCisJT1AoV01JX1NFVF9BUlBfTlNfT0ZGTE9BRF9DTURJRCkgXAorCU9QKFdNSV9QMlBfU0VUX1ZFTkRPUl9JRV9EQVRBX0NNRElEKSBcCisJT1AoV01JX0FQX1BTX1BFRVJfUEFSQU1fQ01ESUQpIFwKKwlPUChXTUlfV0xBTl9QUk9GSUxFX1RSSUdHRVJfQ01ESUQpIFwKKwlPUChXTUlfV0xBTl9QUk9GSUxFX1NFVF9ISVNUX0lOVFZMX0NNRElEKSBcCisJT1AoV01JX1dMQU5fUFJPRklMRV9HRVRfUFJPRklMRV9EQVRBX0NNRElEKSBcCisJT1AoV01JX1dMQU5fUFJPRklMRV9FTkFCTEVfUFJPRklMRV9JRF9DTURJRCkgXAorCU9QKFdNSV9XT1dfREVMX1dBS0VfUEFUVEVSTl9DTURJRCkgXAorCU9QKFdNSV9XT1dfRU5BQkxFX0RJU0FCTEVfV0FLRV9FVkVOVF9DTURJRCkgXAorCU9QKFdNSV9SVFRfTUVBU1JFUV9DTURJRCkgXAorCU9QKFdNSV9SVFRfVFNGX0NNRElEKSBcCisJT1AoV01JX09FTV9SRVFfQ01ESUQpIFwKKwlPUChXTUlfVkRFVl9TUEVDVFJBTF9TQ0FOX0NPTkZJR1VSRV9DTURJRCkgXAorCU9QKFdNSV9WREVWX1NQRUNUUkFMX1NDQU5fRU5BQkxFX0NNRElEKQlcCisJT1AoV01JX1JFUVVFU1RfU1RBVFNfQ01ESUQpIFwKKwlPUChXTUlfTkVUV09SS19MSVNUX09GRkxPQURfQ09ORklHX0NNRElEKSBcCisJT1AoV01JX0NTQV9PRkZMT0FEX0VOQUJMRV9DTURJRCkgXAorCU9QKFdNSV9DU0FfT0ZGTE9BRF9DSEFOU1dJVENIX0NNRElEKSBcCisJT1AoV01JX0NIQVRURVJfU0VUX01PREVfQ01ESUQpIFwKKwlPUChXTUlfRUNIT19DTURJRCkgXAorCU9QKFdNSV9QREVWX1VURl9DTURJRCkgXAorCU9QKFdNSV9QREVWX1FWSVRfQ01ESUQpCVwKKwlPUChXTUlfVkRFVl9TRVRfS0VFUEFMSVZFX0NNRElEKSBcCisJT1AoV01JX1ZERVZfR0VUX0tFRVBBTElWRV9DTURJRCkgXAorCU9QKFdNSV9GT1JDRV9GV19IQU5HX0NNRElEKSBcCisJT1AoV01JX0dQSU9fQ09ORklHX0NNRElEKSBcCisJT1AoV01JX0dQSU9fT1VUUFVUX0NNRElEKSBcCisJT1AoV01JX1BFRVJfQUREX1dEU19FTlRSWV9DTURJRCkgXAorCU9QKFdNSV9QRUVSX1JFTU9WRV9XRFNfRU5UUllfQ01ESUQpIFwKKwlPUChXTUlfQkNOX1RYX0NNRElEKSBcCisJT1AoV01JX1BERVZfU0VORF9CQ05fQ01ESUQpIFwKKwlPUChXTUlfTUdNVF9UWF9DTURJRCkgXAorCU9QKFdNSV9BRERCQV9DTEVBUl9SRVNQX0NNRElEKSBcCisJT1AoV01JX0FEREJBX1NFTkRfQ01ESUQpIFwKKwlPUChXTUlfREVMQkFfU0VORF9DTURJRCkgXAorCU9QKFdNSV9BRERCQV9TRVRfUkVTUF9DTURJRCkgXAorCU9QKFdNSV9TRU5EX1NJTkdMRUFNU0RVX0NNRElEKSBcCisJT1AoV01JX1BERVZfUEtUTE9HX0VOQUJMRV9DTURJRCkgXAorCU9QKFdNSV9QREVWX1BLVExPR19ESVNBQkxFX0NNRElEKSBcCisJT1AoV01JX1BERVZfU0VUX0hUX0NBUF9JRV9DTURJRCkgXAorCU9QKFdNSV9QREVWX1NFVF9WSFRfQ0FQX0lFX0NNRElEKSBcCisJT1AoV01JX1BERVZfU0VUX0RTQ1BfVElEX01BUF9DTURJRCkgXAorCU9QKFdNSV9QREVWX0dSRUVOX0FQX1BTX0VOQUJMRV9DTURJRCkgXAorCU9QKFdNSV9QREVWX0dFVF9UUENfQ09ORklHX0NNRElEKSBcCisJT1AoV01JX1BERVZfU0VUX0JBU0VfTUFDQUREUl9DTURJRCkgXAorCU9QKFdNSV9QRUVSX01DQVNUX0dST1VQX0NNRElEKSBcCisJT1AoV01JX1JPQU1fQVBfUFJPRklMRSkJXAorCU9QKFdNSV9TQ0FOX1NDSF9QUklPX1RCTF9DTURJRCkJXAorCU9QKFdNSV9QREVWX0RGU19FTkFCTEVfQ01ESUQpIFwKKwlPUChXTUlfUERFVl9ERlNfRElTQUJMRV9DTURJRCkgXAorCU9QKFdNSV9XT1dfQUREX1dBS0VfUEFUVEVSTl9DTURJRCkgXAorCU9QKFdNSV9QREVWX1NVU1BFTkRfQ01ESUQpIFwKKwlPUChXTUlfUERFVl9SRVNVTUVfQ01ESUQpIFwKKwlPUChXTUlfU1RPUF9TQ0FOX0NNRElEKQlcCisJT1AoV01JX1BERVZfU0VUX1BBUkFNX0NNRElEKSBcCisJT1AoV01JX1BERVZfU0VUX1FVSUVUX01PREVfQ01ESUQpIFwKKwlPUChXTUlfVkRFVl9DUkVBVEVfQ01ESUQpIFwKKwlPUChXTUlfVkRFVl9ERUxFVEVfQ01ESUQpIFwKKwlPUChXTUlfVkRFVl9VUF9DTURJRCkgXAorCU9QKFdNSV9WREVWX1NUT1BfQ01ESUQpCVwKKwlPUChXTUlfVkRFVl9ET1dOX0NNRElEKQlcCisJT1AoV01JX1ZERVZfU0VUX1BBUkFNX0NNRElEKSBcCisJT1AoV01JX1NDQU5fVVBEQVRFX1JFUVVFU1RfQ01ESUQpIFwKKwlPUChXTUlfQ0hBVFRFUl9BRERfQ09BTEVTQ0lOR19GSUxURVJfQ01ESUQpIFwKKwlPUChXTUlfQ0hBVFRFUl9ERUxFVEVfQ09BTEVTQ0lOR19GSUxURVJfQ01ESUQpIFwKKwlPUChXTUlfQ0hBVFRFUl9DT0FMRVNDSU5HX1FVRVJZX0NNRElEKSBcCisJT1AoV01JX1RYQkZfQ01ESUQpIFwKKwlPUChXTUlfREJHTE9HX0NGR19DTURJRCkgXAorCU9QKFdNSV9WREVWX1dOTV9TTEVFUE1PREVfQ01ESUQpIFwKKwlPUChXTUlfVkRFVl9JUFNFQ19OQVRLRUVQQUxJVkVfRklMVEVSX0NNRElEKSBcCisJT1AoV01JX1ZERVZfV01NX0FERFRTX0NNRElEKSBcCisJT1AoV01JX1ZERVZfV01NX0RFTFRTX0NNRElEKSBcCisJT1AoV01JX1ZERVZfU0VUX1dNTV9QQVJBTVNfQ01ESUQpIFwKKwlPUChXTUlfVkRFVl9TRVRfR1RYX1BBUkFNU19DTURJRCkgXAorCU9QKFdNSV9URExTX1NFVF9TVEFURV9DTURJRCkgXAorCU9QKFdNSV9URExTX1BFRVJfVVBEQVRFX0NNRElEKSBcCisJT1AoV01JX0ZXVEVTVF9WREVWX01DQ19TRVRfVEJUVF9NT0RFX0NNRElEKSBcCisJT1AoV01JX1JPQU1fQ0hBTl9MSVNUKQlcCisJT1AoV01JX1JFU01HUl9BREFQVElWRV9PQ1NfRU5BQkxFX0RJU0FCTEVfQ01ESUQpIFwKKwlPUChXTUlfUkVTTUdSX1NFVF9DSEFOX1RJTUVfUVVPVEFfQ01ESUQpICAgIFwKKwlPUChXTUlfUkVTTUdSX1NFVF9DSEFOX0xBVEVOQ1lfQ01ESUQpIFwKKwlPUChXTUlfQkFfUkVRX1NTTl9DTURJRCkgXAorCU9QKFdNSV9TVEFfU01QU19GT1JDRV9NT0RFX0NNRElEKSBcCisJT1AoV01JX1NFVF9NQ0FTVEJDQVNUX0ZJTFRFUl9DTURJRCkgXAorCU9QKFdNSV9QMlBfU0VUX09QUFBTX1BBUkFNX0NNRElEKSBcCisJT1AoV01JX0ZXVEVTVF9QMlBfU0VUX05PQV9QQVJBTV9DTURJRCkgXAorCU9QKFdNSV9TVEFfU01QU19QQVJBTV9DTURJRCkgXAorCU9QKFdNSV9NQ0NfU0NIRURfVFJBRkZJQ19TVEFUU19DTURJRCkgXAorCU9QKFdNSV9IQl9TRVRfRU5BQkxFX0NNRElEKSBcCisJT1AoV01JX0hCX1NFVF9UQ1BfUEFSQU1TX0NNRElEKQlcCisJT1AoV01JX0hCX1NFVF9UQ1BfUEtUX0ZJTFRFUl9DTURJRCkgXAorCU9QKFdNSV9IQl9TRVRfVURQX1BBUkFNU19DTURJRCkJXAorCU9QKFdNSV9IQl9TRVRfVURQX1BLVF9GSUxURVJfQ01ESUQpIFwKKwlPUChXTUlfUEVFUl9JTkZPX1JFUV9DTURJRCkgXAorCU9QKFdNSV9STUNfU0VUX01PREVfQ01ESUQpIFwKKwlPUChXTUlfUk1DX1NFVF9BQ1RJT05fUEVSSU9EX0NNRElEKSBcCisJT1AoV01JX1JNQ19DT05GSUdfQ01ESUQpIFwKKwlPUChXTUlfTUhGX09GRkxPQURfU0VUX01PREVfQ01ESUQpIFwKKwlPUChXTUlfTUhGX09GRkxPQURfUExVTUJfUk9VVElOR19UQkxfQ01ESUQpIFwKKwlPUChXTUlfREZTX1BIWUVSUl9GSUxURVJfRU5BX0NNRElEKSBcCisJT1AoV01JX0RGU19QSFlFUlJfRklMVEVSX0RJU19DTURJRCkgXAorCU9QKFdNSV9CQVRDSF9TQ0FOX0VOQUJMRV9DTURJRCkJXAorCU9QKFdNSV9CQVRDSF9TQ0FOX0RJU0FCTEVfQ01ESUQpIFwKKwlPUChXTUlfQkFUQ0hfU0NBTl9UUklHR0VSX1JFU1VMVF9DTURJRCkJXAorCU9QKFdNSV9USEVSTUFMX01HTVRfQ01ESUQpIFwKKwlPUChXTUlfQUREX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01ESUQpIFwKKwlPUChXTUlfREVMX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01ESUQpIFwKKwlPUChXTUlfTkFOX0NNRElEKSBcCisJT1AoV01JX01PREVNX1BPV0VSX1NUQVRFX0NNRElEKQlcCisJT1AoV01JX1BFRVJfR0VUX0VTVElNQVRFRF9MSU5LU1BFRURfQ01ESUQpIFwKKwlPUChXTUlfUk9BTV9TQ0FOX0NNRCkgXAorCU9QKFdNSV9SRVFVRVNUX1NUQVRTX0VYVF9DTURJRCkJXAorCU9QKFdNSV9PQlNTX1NDQU5fRU5BQkxFX0NNRElEKSBcCisJT1AoV01JX09CU1NfU0NBTl9ESVNBQkxFX0NNRElEKQlcCisJT1AoV01JX1BERVZfU0VUX0xFRF9DT05GSUdfQ01ESUQpIFwKKwlPUChXTUlfSE9TVF9BVVRPX1NIVVRET1dOX0NGR19DTURJRCkgXAorCU9QKFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19DTURJRCkgXAorCU9QKFdNSV9DSEFOX0FWT0lEX1VQREFURV9DTURJRCkJXAorCU9QKFdNSV9XT1dfSU9BQ19BRERfS0VFUEFMSVZFX0NNRElEKSBcCisJT1AoV01JX1dPV19JT0FDX0RFTF9LRUVQQUxJVkVfQ01ESUQpIFwKKwlPUChXTUlfV09XX0lPQUNfQUREX1dBS0VfUEFUVEVSTl9DTURJRCkJXAorCU9QKFdNSV9XT1dfSU9BQ19ERUxfV0FLRV9QQVRURVJOX0NNRElEKQlcCisJT1AoV01JX1JFUVVFU1RfTElOS19TVEFUU19DTURJRCkgXAorCU9QKFdNSV9TVEFSVF9MSU5LX1NUQVRTX0NNRElEKSBcCisJT1AoV01JX0NMRUFSX0xJTktfU1RBVFNfQ01ESUQpIFwKKwlPUChXTUlfTFBJX01HTVRfU05PT1BJTkdfQ09ORklHX0NNRElEKSBcCisJT1AoV01JX0xQSV9TVEFSVF9TQ0FOX0NNRElEKSBcCisJT1AoV01JX0xQSV9TVE9QX1NDQU5fQ01ESUQpIFwKKwlPUChXTUlfRVhUU0NBTl9TVEFSVF9DTURJRCkgXAorCU9QKFdNSV9FWFRTQ0FOX1NUT1BfQ01ESUQpIFwKKwlPUChXTUlfRVhUU0NBTl9DT05GSUdVUkVfV0xBTl9DSEFOR0VfTU9OSVRPUl9DTURJRCkgXAorCU9QKFdNSV9FWFRTQ0FOX0NPTkZJR1VSRV9IT1RMSVNUX01PTklUT1JfQ01ESUQpCVwKKwlPUChXTUlfRVhUU0NBTl9HRVRfQ0FDSEVEX1JFU1VMVFNfQ01ESUQpIFwKKwlPUChXTUlfRVhUU0NBTl9HRVRfV0xBTl9DSEFOR0VfUkVTVUxUU19DTURJRCkgXAorCU9QKFdNSV9FWFRTQ0FOX1NFVF9DQVBBQklMSVRJRVNfQ01ESUQpIFwKKwlPUChXTUlfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX0NNRElEKSBcCisJT1AoV01JX0VYVFNDQU5fQ09ORklHVVJFX0hPVExJU1RfU1NJRF9NT05JVE9SX0NNRElEKSBcCisJT1AoV01JX0QwX1dPV19FTkFCTEVfRElTQUJMRV9DTURJRCkgXAorCU9QKFdNSV9VTklUX1RFU1RfQ01ESUQpCVwKKwlPUChXTUlfUk9BTV9TWU5DSF9DT01QTEVURSkgXAorCU9QKFdNSV9FWFRXT1dfRU5BQkxFX0NNRElEKSBcCisJT1AoV01JX0VYVFdPV19TRVRfQVBQX1RZUEUxX1BBUkFNU19DTURJRCkgXAorCU9QKFdNSV9FWFRXT1dfU0VUX0FQUF9UWVBFMl9QQVJBTVNfQ01ESUQpIFwKKwlPUChXTUlfUk9BTV9TRVRfUklDX1JFUVVFU1RfQ01ESUQpIFwKKwlPUChXTUlfUERFVl9HRVRfVEVNUEVSQVRVUkVfQ01ESUQpIFwKKwlPUChXTUlfU0VUX0RIQ1BfU0VSVkVSX09GRkxPQURfQ01ESUQpIFwKKwlPUChXTUlfSVBBX09GRkxPQURfRU5BQkxFX0RJU0FCTEVfQ01ESUQpIFwKKwlPUChXTUlfU0NBTl9QUk9CX1JFUV9PVUlfQ01ESUQpCVwKKwlPUChXTUlfVERMU19TRVRfT0ZGQ0hBTl9NT0RFX0NNRElEKSBcCisJT1AoV01JX1BERVZfU0VUX0xFRF9GTEFTSElOR19DTURJRCkgXAorCU9QKFdNSV9ST0FNX0lOVk9LRV9DTURJRCkgXAorCU9QKFdNSV9NRE5TX09GRkxPQURfRU5BQkxFX0NNRElEKSBcCisJT1AoV01JX01ETlNfU0VUX0ZRRE5fQ01ESUQpIFwKKwlPUChXTUlfTUROU19TRVRfUkVTUE9OU0VfQ01ESUQpIFwKKwlPUChXTUlfTUROU19HRVRfU1RBVFNfQ01ESUQpIFwKKwlPUChXTUlfU0VUX0FOVEVOTkFfRElWRVJTSVRZX0NNRElEKSBcCisJT1AoV01JX1NBUF9PRkxfRU5BQkxFX0NNRElEKSBcCisJT1AoV01JX0FQRklORF9DTURJRCkgXAorCU9QKFdNSV9PQ0JfU0VUX1NDSEVEX0NNRElEKSBcCisJT1AoV01JX09DQl9TRVRfQ09ORklHX0NNRElEKSBcCisJT1AoV01JX09DQl9TRVRfVVRDX1RJTUVfQ01ESUQpIFwKKwlPUChXTUlfT0NCX1NUQVJUX1RJTUlOR19BRFZFUlRfQ01ESUQpIFwKKwlPUChXTUlfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9DTURJRCkgXAorCU9QKFdNSV9PQ0JfR0VUX1RTRl9USU1FUl9DTURJRCkgXAorCU9QKFdNSV9EQ0NfR0VUX1NUQVRTX0NNRElEKSBcCisJT1AoV01JX0RDQ19DTEVBUl9TVEFUU19DTURJRCkgXAorCU9QKFdNSV9EQ0NfVVBEQVRFX05ETF9DTURJRCkgXAorCU9QKFdNSV9ST0FNX0ZJTFRFUl9DTURJRCkgXAorCU9QKFdNSV9QQVNTUE9JTlRfTElTVF9DT05GSUdfQ01ESUQpIFwKKwlPUChXTUlfVkRFVl9UU0ZfVFNUQU1QX0FDVElPTl9DTURJRCkgXAorCU9QKFdNSV9HRVRfRldfTUVNX0RVTVBfQ01ESUQpIFwKKwlPUChXTUlfREVCVUdfTUVTR19GTFVTSF9DTURJRCkgXAorCU9QKFdNSV9QRUVSX1NFVF9SQVRFX1JFUE9SVF9DT05ESVRJT05fQ01ESUQpIFwKKwlPUChXTUlfUk9BTV9TVUJORVRfQ0hBTkdFX0NPTkZJR19DTURJRCkgXAorCU9QKFdNSV9WREVWX1NFVF9JRV9DTURJRCkgXAorCU9QKFdNSV9SU1NJX0JSRUFDSF9NT05JVE9SX0NPTkZJR19DTURJRCkgXAorCU9QKFdNSV9TT0NfU0VUX1BDTF9DTURJRCkgXAorCU9QKFdNSV9TT0NfU0VUX0hXX01PREVfQ01ESUQpIFwKKwlPUChXTUlfU09DX1NFVF9EVUFMX01BQ19DT05GSUdfQ01ESUQpIFwKKwlPUChXTUlfV09XX0VOQUJMRV9JQ01QVjZfTkFfRkxUX0NNRElEKSBcCisJT1AoV01JX0RJQUdfRVZFTlRfTE9HX0NPTkZJR19DTURJRCkgXAorCU9QKFdNSV9QQUNLRVRfRklMVEVSX0NPTkZJR19DTURJRCkgXAorCU9QKFdNSV9QQUNLRVRfRklMVEVSX0VOQUJMRV9DTURJRCkgXAorCU9QKFdNSV9TQVBfU0VUX0JMQUNLTElTVF9QQVJBTV9DTURJRCkgXAorCU9QKFdNSV9NR01UX1RYX1NFTkRfQ01ESUQpIFwKKwlPUChXTUlfU09DX1NFVF9BTlRFTk5BX01PREVfQ01ESUQpIFwKKwlPUChXTUlfV09XX1VEUF9TVkNfT0ZMRF9DTURJRCkgXAorCU9QKFdNSV9MUk9fQ09ORklHX0NNRElEKSBcCisJT1AoV01JX01BV0NfU0VOU09SX1JFUE9SVF9JTkRfQ01ESUQpIFwKKwlPUChXTUlfUk9BTV9DT05GSUdVUkVfTUFXQ19DTURJRCkgXAorCU9QKFdNSV9OTE9fQ09ORklHVVJFX01BV0NfQ01ESUQpIFwKKwlPUChXTUlfRVhUU0NBTl9DT05GSUdVUkVfTUFXQ19DTURJRCkgXAorCU9QKFdNSV9XT1dfSE9TVFdBS0VVUF9HUElPX1BJTl9QQVRURVJOX0NPTkZJR19DTURJRCkgXAorCU9QKFdNSV9BUF9QU19FR0FQX1BBUkFNX0NNRElEKSBcCisJT1AoV01JX1BNRl9PRkZMT0FEX1NFVF9TQV9RVUVSWV9DTURJRCkKKy8qCisgKiBJTVBPUlRBTlQ6IFBsZWFzZSBhZGQgX0FMTF8gV01JIEV2ZW50cyBIZXJlLgorICogT3RoZXJ3aXNlLCB0aGVzZSBXTUkgVExWIEZ1bmN0aW9ucyB3aWxsIGJlIHByb2Nlc3MgdGhlbS4KKyAqLworI2RlZmluZSBXTUlUTFZfQUxMX0VWVF9MSVNUKE9QKQlcCisJT1AoV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRCkgXAorCU9QKFdNSV9TRVJWSUNFX1JFQURZX0VYVF9FVkVOVElEKSBcCisJT1AoV01JX1JFQURZX0VWRU5USUQpIFwKKwlPUChXTUlfU0NBTl9FVkVOVElEKSBcCisJT1AoV01JX1BERVZfVFBDX0NPTkZJR19FVkVOVElEKQlcCisJT1AoV01JX0NIQU5fSU5GT19FVkVOVElEKSBcCisJT1AoV01JX1BIWUVSUl9FVkVOVElEKSBcCisJT1AoV01JX1ZERVZfU1RBUlRfUkVTUF9FVkVOVElEKQlcCisJT1AoV01JX1ZERVZfU1RPUFBFRF9FVkVOVElEKSBcCisJT1AoV01JX1ZERVZfSU5TVEFMTF9LRVlfQ09NUExFVEVfRVZFTlRJRCkgXAorCU9QKFdNSV9QRUVSX1NUQV9LSUNLT1VUX0VWRU5USUQpIFwKKwlPUChXTUlfTUdNVF9SWF9FVkVOVElEKQlcCisJT1AoV01JX1RCVFRPRkZTRVRfVVBEQVRFX0VWRU5USUQpIFwKKwlPUChXTUlfVFhfREVMQkFfQ09NUExFVEVfRVZFTlRJRCkgXAorCU9QKFdNSV9UWF9BRERCQV9DT01QTEVURV9FVkVOVElEKSBcCisJT1AoV01JX1JPQU1fRVZFTlRJRCkgXAorCU9QKFdNSV9XT1dfV0FLRVVQX0hPU1RfRVZFTlRJRCkJXAorCU9QKFdNSV9SVFRfRVJST1JfUkVQT1JUX0VWRU5USUQpIFwKKwlPUChXTUlfT0VNX01FQVNVUkVNRU5UX1JFUE9SVF9FVkVOVElEKSBcCisJT1AoV01JX09FTV9FUlJPUl9SRVBPUlRfRVZFTlRJRCkgXAorCU9QKFdNSV9PRU1fQ0FQQUJJTElUWV9FVkVOVElEKSBcCisJT1AoV01JX0VDSE9fRVZFTlRJRCkgXAorCU9QKFdNSV9QREVWX0ZUTV9JTlRHX0VWRU5USUQpIFwKKwlPUChXTUlfVkRFVl9HRVRfS0VFUEFMSVZFX0VWRU5USUQpIFwKKwlPUChXTUlfR1BJT19JTlBVVF9FVkVOVElEKSBcCisJT1AoV01JX0NTQV9IQU5ETElOR19FVkVOVElEKSBcCisJT1AoV01JX0RFQlVHX01FU0dfRVZFTlRJRCkgXAorCU9QKFdNSV9HVEtfT0ZGTE9BRF9TVEFUVVNfRVZFTlRJRCkgXAorCU9QKFdNSV9EQ1NfSU5URVJGRVJFTkNFX0VWRU5USUQpIFwKKwlPUChXTUlfV0xBTl9QUk9GSUxFX0RBVEFfRVZFTlRJRCkgXAorCU9QKFdNSV9QREVWX1VURl9FVkVOVElEKSBcCisJT1AoV01JX0RFQlVHX1BSSU5UX0VWRU5USUQpIFwKKwlPUChXTUlfUlRUX01FQVNVUkVNRU5UX1JFUE9SVF9FVkVOVElEKSBcCisJT1AoV01JX0hPU1RfU1dCQV9FVkVOVElEKSBcCisJT1AoV01JX1VQREFURV9TVEFUU19FVkVOVElEKSBcCisJT1AoV01JX1BERVZfUVZJVF9FVkVOVElEKSBcCisJT1AoV01JX1dMQU5fRlJFUV9BVk9JRF9FVkVOVElEKQlcCisJT1AoV01JX0dUS19SRUtFWV9GQUlMX0VWRU5USUQpIFwKKwlPUChXTUlfTkxPX01BVENIX0VWRU5USUQpIFwKKwlPUChXTUlfTkxPX1NDQU5fQ09NUExFVEVfRVZFTlRJRCkgXAorCU9QKFdNSV9BUEZJTkRfRVZFTlRJRCkgXAorCU9QKFdNSV9DSEFUVEVSX1BDX1FVRVJZX0VWRU5USUQpIFwKKwlPUChXTUlfVVBMT0FESF9FVkVOVElEKQlcCisJT1AoV01JX0NBUFRVUkVIX0VWRU5USUQpIFwKKwlPUChXTUlfVERMU19QRUVSX0VWRU5USUQpIFwKKwlPUChXTUlfVkRFVl9NQ0NfQkNOX0lOVEVSVkFMX0NIQU5HRV9SRVFfRVZFTlRJRCkgXAorCU9QKFdNSV9CQV9SU1BfU1NOX0VWRU5USUQpIFwKKwlPUChXTUlfT0ZGTE9BRF9CQ05fVFhfU1RBVFVTX0VWRU5USUQpIFwKKwlPUChXTUlfUDJQX05PQV9FVkVOVElEKQlcCisJT1AoV01JX1RYX1BBVVNFX0VWRU5USUQpIFwKKwlPUChXTUlfUkZLSUxMX1NUQVRFX0NIQU5HRV9FVkVOVElEKSBcCisJT1AoV01JX1BFRVJfSU5GT19FVkVOVElEKSBcCisJT1AoV01JX1BFRVJfVFhfRkFJTF9DTlRfVEhSX0VWRU5USUQpIFwKKwlPUChXTUlfREZTX1JBREFSX0VWRU5USUQpIFwKKwlPUChXTUlfQkFUQ0hfU0NBTl9FTkFCTEVEX0VWRU5USUQpIFwKKwlPUChXTUlfQkFUQ0hfU0NBTl9SRVNVTFRfRVZFTlRJRCkgXAorCU9QKFdNSV9USEVSTUFMX01HTVRfRVZFTlRJRCkgXAorCU9QKFdNSV9OQU5fRVZFTlRJRCkgXAorCU9QKFdNSV9QREVWX0wxU1NfVFJBQ0tfRVZFTlRJRCkJXAorCU9QKFdNSV9ESUFHX0RBVEFfQ09OVEFJTkVSX0VWRU5USUQpIFwKKwlPUChXTUlfUEVFUl9FU1RJTUFURURfTElOS1NQRUVEX0VWRU5USUQpIFwKKwlPUChXTUlfQUdHUl9TVEFURV9UUklHX0VWRU5USUQpCVwKKwlPUChXTUlfU1RBVFNfRVhUX0VWRU5USUQpIFwKKwlPUChXTUlfT0ZGTE9BRF9QUk9CX1JFU1BfVFhfU1RBVFVTX0VWRU5USUQpIFwKKwlPUChXTUlfSE9TVF9BVVRPX1NIVVRET1dOX0VWRU5USUQpIFwKKwlPUChXTUlfVVBEQVRFX1dIQUxfTUlCX1NUQVRTX0VWRU5USUQpIFwKKwlPUChXTUlfSUZBQ0VfTElOS19TVEFUU19FVkVOVElEKSBcCisJT1AoV01JX1BFRVJfTElOS19TVEFUU19FVkVOVElEKQlcCisJT1AoV01JX1JBRElPX0xJTktfU1RBVFNfRVZFTlRJRCkgXAorCU9QKFdNSV9MUElfUkVTVUxUX0VWRU5USUQpIFwKKwlPUChXTUlfUEVFUl9TVEFURV9FVkVOVElEKSBcCisJT1AoV01JX0VYVFNDQU5fU1RBUlRfU1RPUF9FVkVOVElEKSBcCisJT1AoV01JX0VYVFNDQU5fT1BFUkFUSU9OX0VWRU5USUQpIFwKKwlPUChXTUlfRVhUU0NBTl9UQUJMRV9VU0FHRV9FVkVOVElEKSBcCisJT1AoV01JX0VYVFNDQU5fQ0FDSEVEX1JFU1VMVFNfRVZFTlRJRCkgXAorCU9QKFdNSV9FWFRTQ0FOX1dMQU5fQ0hBTkdFX1JFU1VMVFNfRVZFTlRJRCkgXAorCU9QKFdNSV9FWFRTQ0FOX0hPVExJU1RfTUFUQ0hfRVZFTlRJRCkgXAorCU9QKFdNSV9FWFRTQ0FOX0NBUEFCSUxJVElFU19FVkVOVElEKSBcCisJT1AoV01JX0VYVFNDQU5fSE9UTElTVF9TU0lEX01BVENIX0VWRU5USUQpIFwKKwlPUChXTUlfRDBfV09XX0RJU0FCTEVfQUNLX0VWRU5USUQpIFwKKwlPUChXTUlfUk9BTV9TWU5DSF9FVkVOVElEKSBcCisJT1AoV01JX0xQSV9TVEFUVVNfRVZFTlRJRCkgXAorCU9QKFdNSV9MUElfSEFORE9GRl9FVkVOVElEKSBcCisJT1AoV01JX1VQREFURV9WREVWX1JBVEVfU1RBVFNfRVZFTlRJRCkgXAorCU9QKFdNSV9QREVWX1RFTVBFUkFUVVJFX0VWRU5USUQpIFwKKwlPUChXTUlfRElBR19FVkVOVElEKSBcCisJT1AoV01JX01ETlNfU1RBVFNfRVZFTlRJRCkgXAorCU9QKFdNSV9QREVWX1JFU1VNRV9FVkVOVElEKSBcCisJT1AoV01JX1NBUF9PRkxfQUREX1NUQV9FVkVOVElEKSBcCisJT1AoV01JX1NBUF9PRkxfREVMX1NUQV9FVkVOVElEKSBcCisJT1AoV01JX09DQl9TRVRfU0NIRURfRVZFTlRJRCkgXAorCU9QKFdNSV9PQ0JfU0VUX0NPTkZJR19SRVNQX0VWRU5USUQpIFwKKwlPUChXTUlfT0NCX0dFVF9UU0ZfVElNRVJfUkVTUF9FVkVOVElEKSBcCisJT1AoV01JX0RDQ19HRVRfU1RBVFNfUkVTUF9FVkVOVElEKSBcCisJT1AoV01JX0RDQ19VUERBVEVfTkRMX1JFU1BfRVZFTlRJRCkgXAorCU9QKFdNSV9EQ0NfU1RBVFNfRVZFTlRJRCkgXAorCU9QKFdNSV9QQVNTUE9JTlRfTUFUQ0hfRVZFTlRJRClcCisJT1AoV01JX1ZERVZfVFNGX1JFUE9SVF9FVkVOVElEKSBcCisJT1AoV01JX1VQREFURV9GV19NRU1fRFVNUF9FVkVOVElEKSBcCisJT1AoV01JX0RFQlVHX01FU0dfRkxVU0hfQ09NUExFVEVfRVZFTlRJRCkgXAorCU9QKFdNSV9SU1NJX0JSRUFDSF9FVkVOVElEKSBcCisJT1AoV01JX1dPV19JTklUSUFMX1dBS0VVUF9FVkVOVElEKSBcCisJT1AoV01JX1NPQ19TRVRfSFdfTU9ERV9SRVNQX0VWRU5USUQpIFwKKwlPUChXTUlfU09DX0hXX01PREVfVFJBTlNJVElPTl9FVkVOVElEKSBcCisJT1AoV01JX1NPQ19TRVRfRFVBTF9NQUNfQ09ORklHX1JFU1BfRVZFTlRJRCkgXAorCU9QKFdNSV9ESUFHX0VWRU5UX0xPR19TVVBQT1JURURfRVZFTlRJRCkgXAorCU9QKFdNSV9NR01UX1RYX0NPTVBMRVRJT05fRVZFTlRJRCkgXAorCU9QKFdNSV9NQVdDX0VOQUJMRV9TRU5TT1JfRVZFTlRJRCkgXAorCU9QKFdNSV9QRUVSX0FTU09DX0NPTkZfRVZFTlRJRCkgXAorCU9QKFdNSV9BUF9QU19FR0FQX0lORk9fRVZFTlRJRCkKKworLyogVExWIGRlZmluaXRpb25zIG9mIFdNSSBjb21tYW5kcyAqLworCisvKiBJbml0IENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0lOSVRfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2luaXRfY21kX2ZpeGVkX3BhcmFtLCB3bWlfaW5pdF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZXNvdXJjZV9jb25maWcsIHdtaV9yZXNvdXJjZV9jb25maWcsIHJlc291cmNlX2NvbmZpZywgV01JVExWX1NJWkVfRklYKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd2xhbl9ob3N0X21lbW9yeV9jaHVuaywgaG9zdF9tZW1fY2h1bmtzLCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0lOSVRfQ01ESUQpOworCisvKiBQZWVyIGNyZWF0ZSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QRUVSX0NSRUFURV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9jcmVhdGVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcGVlcl9jcmVhdGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX0NSRUFURV9DTURJRCk7CisKKy8qIFBlZXIgZGVsZXRlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BFRVJfREVMRVRFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2RlbGV0ZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZWVyX2RlbGV0ZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BFRVJfREVMRVRFX0NNRElEKTsKKworLyogUGVlciBmbHVzaCBDbWQqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BFRVJfRkxVU0hfVElEU19DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9mbHVzaF90aWRzX2NtZF9maXhlZF9wYXJhbSwgd21pX3BlZXJfZmx1c2hfdGlkc19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BFRVJfRkxVU0hfVElEU19DTURJRCk7CisKKy8qIFBlZXIgU2V0IFBhcmFtIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BFRVJfU0VUX1BBUkFNX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZWVyX3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BFRVJfU0VUX1BBUkFNX0NNRElEKTsKKworLyogU1RBIFBvd2Vyc2F2ZSBNb2RlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NUQV9QT1dFUlNBVkVfTU9ERV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfc3RhX3Bvd2Vyc2F2ZV9tb2RlX2NtZF9maXhlZF9wYXJhbSwgd21pX3N0YV9wb3dlcnNhdmVfbW9kZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NUQV9QT1dFUlNBVkVfTU9ERV9DTURJRCk7CisKKy8qIFNUQSBQb3dlcnNhdmUgUGFyYW0gQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU1RBX1BPV0VSU0FWRV9QQVJBTV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfc3RhX3Bvd2Vyc2F2ZV9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9zdGFfcG93ZXJzYXZlX3BhcmFtX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU1RBX1BPV0VSU0FWRV9QQVJBTV9DTURJRCk7CisKKy8qIFNUQSBEVElNIFBTIE1FVEhPRCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9TVEFfRFRJTV9QU19NRVRIT0RfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YV9kdGltX3BzX21ldGhvZF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9zdGFfZHRpbV9wc19tZXRob2RfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TVEFfRFRJTV9QU19NRVRIT0RfQ01ESUQpOworCisvKiBQZGV2IFNldCBSZWcgRG9tYWluIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BERVZfU0VUX1JFR0RPTUFJTl9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zZXRfcmVnZG9tYWluX2NtZF9maXhlZF9wYXJhbSwgd21pX3BkZXZfc2V0X3JlZ2RvbWFpbl9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfU0VUX1JFR0RPTUFJTl9DTURJRCk7CisKKy8qIFBlZXIgVElEIEFERCBCQSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QRUVSX1RJRF9BRERCQV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl90aWRfYWRkYmFfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcGVlcl90aWRfYWRkYmFfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX1RJRF9BRERCQV9DTURJRCk7CisKKy8qIFBlZXIgVElEIERFTCBCQSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QRUVSX1RJRF9ERUxCQV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl90aWRfZGVsYmFfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcGVlcl90aWRfZGVsYmFfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX1RJRF9ERUxCQV9DTURJRCk7CisvKiBQZWVyIFJlcSBBZGQgQkEgU3NuIGZvciBzdGFJZC90aWQgcGFpciBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9CQV9SRVFfU1NOX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9iYV9yZXFfc3NuX2NtZF9maXhlZF9wYXJhbSwgd21pX2JhX3JlcV9zc25fY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbixXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfYmFfcmVxX3NzbiwgYmFfcmVxX3Nzbl9saXN0LCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0JBX1JFUV9TU05fQ01ESUQpOworCisvKiBQREVWIEZUTSBpbnRlZ3JhdGlvbiBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX0ZUTV9JTlRHX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9mdG1faW50Z19jbWRfZml4ZWRfcGFyYW0sIHdtaV9mdG1faW50Z19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGRhdGEsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUERFVl9GVE1fSU5UR19DTURJRCk7CisKKy8qIFdPVyBXYWtldXAgZnJvbSBzbGVlcCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9XT1dfSE9TVFdBS0VVUF9GUk9NX1NMRUVQX0NNRElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkJCQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfd293X2hvc3R3YWtldXBfZnJvbV9zbGVlcF9jbWRfZml4ZWRfcGFyYW0sIHdtaV93b3dfaG9zdHdha2V1cF9mcm9tX3NsZWVwX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfV09XX0hPU1RXQUtFVVBfRlJPTV9TTEVFUF9DTURJRCk7CisKKy8qIFdPVyBFbmFibGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfV09XX0VOQUJMRV9DTURJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3dvd19lbmFibGVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfd293X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1dPV19FTkFCTEVfQ01ESUQpOworCisvKiBXT1cgSUNNUHY2IE5BIGZpbHRlcmluZyBjb21tYW5kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfV09XX0VOQUJMRV9JQ01QVjZfTkFfRkxUX0NNRElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV93b3dfZW5hYmxlX2ljbXB2Nl9uYV9mbHRfY21kX2ZpeGVkX3BhcmFtLCB3bWlfd293X2VuYWJsZV9pY21wdjZfbmFfZmx0X2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfV09XX0VOQUJMRV9JQ01QVjZfTkFfRkxUX0NNRElEKTsKKworLyogUmVtb3ZlIEJjbiBGaWx0ZXIgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUk1WX0JDTl9GSUxURVJfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3Jtdl9iY25fZmlsdGVyX2NtZF9maXhlZF9wYXJhbSwgd21pX3Jtdl9iY25fZmlsdGVyX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUk1WX0JDTl9GSUxURVJfQ01ESUQpOworCisvKiogU2VydmljZSBiaXQgV01JX1NFUlZJQ0VfUk9BTV9PRkZMT0FEIGZvciBSb2FtaW5nIGZlYXR1cmUgKi8KKy8qIFJvYW0gc2NhbiBtb2RlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JPQU1fU0NBTl9NT0RFKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX3NjYW5fbW9kZV9maXhlZF9wYXJhbSwgd21pX3JvYW1fc2Nhbl9tb2RlX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0sIHdtaV9zdGFydF9zY2FuX2NtZF9maXhlZF9wYXJhbSwgc2Nhbl9wYXJhbXMsIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9yb2FtX29mZmxvYWRfdGx2X3BhcmFtLCBvZmZsb2FkX3BhcmFtLCBXTUlUTFZfU0laRV9WQVIpCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfcm9hbV8xMWlfb2ZmbG9hZF90bHZfcGFyYW0sIG9mZmxvYWRfMTFpX3BhcmFtLCBXTUlUTFZfU0laRV9WQVIpCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfcm9hbV8xMXJfb2ZmbG9hZF90bHZfcGFyYW0sIG9mZmxvYWRfMTFyX3BhcmFtLCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfcm9hbV9lc2Vfb2ZmbG9hZF90bHZfcGFyYW0sIG9mZmxvYWRfZXNlX3BhcmFtLCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JPQU1fU0NBTl9NT0RFKTsKKworLyogUm9hbSBzY2FuIFJzc2kgVGhyZXNob2xkIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JPQU1fU0NBTl9SU1NJX1RIUkVTSE9MRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX3Jzc2lfdGhyZXNob2xkX2ZpeGVkX3BhcmFtLCB3bWlfcm9hbV9zY2FuX3Jzc2lfdGhyZXNob2xkX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKVwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfcm9hbV9zY2FuX2V4dGVuZGVkX3RocmVzaG9sZF9wYXJhbSwgZXh0ZW5kZWRfcGFyYW0sIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9yb2FtX2Vhcmx5c3RvcF9yc3NpX3RocmVzX3BhcmFtLCBlYXJseXN0b3BfcGFyYW0sIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUk9BTV9TQ0FOX1JTU0lfVEhSRVNIT0xEKTsKKworLyogUm9hbSBTY2FuIFBlcmlvZCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9ST0FNX1NDQU5fUEVSSU9EKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX3NjYW5fcGVyaW9kX2ZpeGVkX3BhcmFtLCB3bWlfcm9hbV9zY2FuX3BlcmlvZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUk9BTV9TQ0FOX1BFUklPRCk7CisKKy8qIFJvYW0gc2NhbiBjaGFuZ2UgUnNzaSBUaHJlc2hvbGQgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUk9BTV9TQ0FOX1JTU0lfQ0hBTkdFX1RIUkVTSE9MRChpZCxvcCxidWYsbGVuKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX3Jzc2lfY2hhbmdlX3RocmVzaG9sZF9maXhlZF9wYXJhbSwgd21pX3JvYW1fc2Nhbl9yc3NpX2NoYW5nZV90aHJlc2hvbGRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JPQU1fU0NBTl9SU1NJX0NIQU5HRV9USFJFU0hPTEQpOworLyogUm9hbSBTY2FuIENoYW5uZWwgbGlzdCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9ST0FNX0NIQU5fTElTVChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9jaGFuX2xpc3RfZml4ZWRfcGFyYW0sIHdtaV9yb2FtX2NoYW5fbGlzdF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgY2hhbm5lbF9saXN0LCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JPQU1fQ0hBTl9MSVNUKTsKKworLyogUm9hbSBzY2FuIG1vZGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUk9BTV9TQ0FOX0NNRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX2NtZF9maXhlZF9wYXJhbSwgd21pX3JvYW1fc2Nhbl9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JPQU1fU0NBTl9DTUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVkRFVl9QTE1SRVFfU1RBUlRfQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfcGxtcmVxX3N0YXJ0X2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfcGxtcmVxX3N0YXJ0X2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgY2hhbm5lbF9saXN0LCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1ZERVZfUExNUkVRX1NUQVJUX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfUExNUkVRX1NUT1BfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfcGxtcmVxX3N0b3BfY21kX2ZpeGVkX3BhcmFtLCB3bWlfdmRldl9wbG1yZXFfc3RvcF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1ZERVZfUExNUkVRX1NUT1BfQ01ESUQpOworCisvKiBTdGFydCBzY2FuIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NUQVJUX1NDQU5fQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YXJ0X3NjYW5fY21kX2ZpeGVkX3BhcmFtLCB3bWlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwgQV9VSU5UMzIsIGNoYW5uZWxfbGlzdCwgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9GSVhFRF9TVFJVQywgd21pX3NzaWQsIHNzaWRfbGlzdCwgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9GSVhFRF9TVFJVQywgd21pX21hY19hZGRyLCBic3NpZF9saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGllX2RhdGEsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU1RBUlRfU0NBTl9DTURJRCk7CisKKy8qIFN0YXJ0IEV4dFNjYW4gQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRVhUU0NBTl9TVEFSVF9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9zdGFydF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9leHRzY2FuX3N0YXJ0X2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfRklYRURfU1RSVUMsIHdtaV9zc2lkLCBzc2lkX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfRklYRURfU1RSVUMsIHdtaV9tYWNfYWRkciwgYnNzaWRfbGlzdCwgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBpZV9kYXRhLCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl9idWNrZXQsIGJ1Y2tldF9saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl9idWNrZXRfY2hhbm5lbCwgY2hhbm5lbF9saXN0LCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0VYVFNDQU5fU1RBUlRfQ01ESUQpOworCisvKiBTdG9wIEV4dFNjYW4gQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRVhUU0NBTl9TVE9QX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3N0b3BfY21kX2ZpeGVkX3BhcmFtLCB3bWlfZXh0c2Nhbl9zdG9wX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRVhUU0NBTl9TVE9QX0NNRElEKTsKKworLyogU3RhcnQgRXh0U2NhbiBCU1NJRCBNb25pdG9yaW5nIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0VYVFNDQU5fQ09ORklHVVJFX1dMQU5fQ0hBTkdFX01PTklUT1JfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY29uZmlndXJlX3dsYW5fY2hhbmdlX21vbml0b3JfY21kX2ZpeGVkX3BhcmFtLCB3bWlfZXh0c2Nhbl9jb25maWd1cmVfd2xhbl9jaGFuZ2VfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9ic3NpZF9wYXJhbSwgd2xhbl9jaGFuZ2VfZGVzY3JpcHRvcl9saXN0LCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMKKwkoV01JX0VYVFNDQU5fQ09ORklHVVJFX1dMQU5fQ0hBTkdFX01PTklUT1JfQ01ESUQpOworCisvKiBTdGFydCBIb3QgTGlzdCBNb25pdG9yaW5nIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0VYVFNDQU5fQ09ORklHVVJFX0hPVExJU1RfTU9OSVRPUl9DTURJRChpZCxvcCxidWYsbGVuKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9jb25maWd1cmVfaG90bGlzdF9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSwgd21pX2V4dHNjYW5fY29uZmlndXJlX2hvdGxpc3RfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl9ob3RsaXN0X2VudHJ5LCBob3RsaXN0LCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0VYVFNDQU5fQ09ORklHVVJFX0hPVExJU1RfTU9OSVRPUl9DTURJRCk7CisKKy8qIEdldCBFeHRTY2FuIEJTU0lEL1JTU0kgbGlzdCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9FWFRTQ0FOX0dFVF9DQUNIRURfUkVTVUxUU19DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHNfY21kX2ZpeGVkX3BhcmFtLCB3bWlfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9FWFRTQ0FOX0dFVF9DQUNIRURfUkVTVUxUU19DTURJRCk7CisKKy8qIEdldCBFeHRTY2FuIEJTU0lEIG1vbml0b3IgcmVzdWx0cyBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9FWFRTQ0FOX0dFVF9XTEFOX0NIQU5HRV9SRVNVTFRTX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2dldF93bGFuX2NoYW5nZV9yZXN1bHRzX2NtZF9maXhlZF9wYXJhbSwgd21pX2V4dHNjYW5fZ2V0X3dsYW5fY2hhbmdlX3Jlc3VsdHNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9FWFRTQ0FOX0dFVF9XTEFOX0NIQU5HRV9SRVNVTFRTX0NNRElEKTsKKworLyogU2V0IEV4dFNjYW4gQ2FwYWJpbGl0aWVzIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0VYVFNDQU5fU0VUX0NBUEFCSUxJVElFU19DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9zZXRfY2FwYWJpbGl0aWVzX2NtZF9maXhlZF9wYXJhbSwgd21pX2V4dHNjYW5fc2V0X2NhcGFiaWxpdGllc19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl9jYWNoZV9jYXBhYmlsaXRpZXMsIGV4dHNjYW5fY2FjaGVfY2FwYWJpbGl0aWVzLCBXTUlUTFZfU0laRV9WQVIpCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9tb25pdG9yX2NhcGFiaWxpdGllcywgd2xhbl9jaGFuZ2VfY2FwYWJpbGl0aWVzLCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl9ob3RsaXN0X21vbml0b3JfY2FwYWJpbGl0aWVzLCBob3RsaXN0X2NhcGFiaWxpdGllcywgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9FWFRTQ0FOX1NFVF9DQVBBQklMSVRJRVNfQ01ESUQpOworCisvKiBHZXQgRXh0U2NhbiBDYXBhYmlsaXRpZXMgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2dldF9jYXBhYmlsaXRpZXNfY21kX2ZpeGVkX3BhcmFtLCB3bWlfZXh0c2Nhbl9nZXRfY2FwYWJpbGl0aWVzX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX0NNRElEKTsKKworLyogU3RhcnQgU1NJRCBIb3QgTGlzdCBNb25pdG9yaW5nIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0VYVFNDQU5fQ09ORklHVVJFX0hPVExJU1RfU1NJRF9NT05JVE9SX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2NvbmZpZ3VyZV9ob3RsaXN0X3NzaWRfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0sIHdtaV9leHRzY2FuX2NvbmZpZ3VyZV9ob3RsaXN0X3NzaWRfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl9ob3RsaXN0X3NzaWRfZW50cnksIGhvdGxpc3Rfc3NpZCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRVhUU0NBTl9DT05GSUdVUkVfSE9UTElTVF9TU0lEX01PTklUT1JfQ01ESUQpOworCisvKiBQMlAgc2V0IHZlbmRvciBJRCBkYXRhIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1AyUF9TRVRfVkVORE9SX0lFX0RBVEFfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3AycF9zZXRfdmVuZG9yX2llX2RhdGFfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcDJwX3NldF92ZW5kb3JfaWVfZGF0YV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QMlBfU0VUX1ZFTkRPUl9JRV9EQVRBX0NNRElEKTsKKy8qIFAyUCBzZXQgT3BwUFMgcGFyYW1ldGVycyBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QMlBfU0VUX09QUFBTX1BBUkFNX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wMnBfc2V0X29wcHBzX2NtZF9maXhlZF9wYXJhbSwgd21pX3AycF9zZXRfb3BwcHNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUDJQX1NFVF9PUFBQU19QQVJBTV9DTURJRCk7CisKKy8qIFBkZXYgc2V0IGNoYW5uZWwgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUERFVl9TRVRfQ0hBTk5FTF9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfY2hhbm5lbCwgd21pX2NoYW5uZWwsIGNoYW4sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfU0VUX0NIQU5ORUxfQ01ESUQpOworCisvKiBFY2hvIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0VDSE9fQ01ESUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2VjaG9fY21kX2ZpeGVkX3BhcmFtLCB3bWlfZWNob19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9FQ0hPX0NNRElEKTsKKworLyogUGRldiBzZXQgd21tIHBhcmFtcyAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BERVZfU0VUX1dNTV9QQVJBTVNfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc2V0X3dtbV9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcGRldl9zZXRfd21tX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV93bW1fcGFyYW1zLCB3bWlfd21tX3BhcmFtcywgd21tX3BhcmFtc19hY19iZSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfd21tX3BhcmFtcywgd21pX3dtbV9wYXJhbXMsIHdtbV9wYXJhbXNfYWNfYmssIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3dtbV9wYXJhbXMsIHdtaV93bW1fcGFyYW1zLCB3bW1fcGFyYW1zX2FjX3ZpLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV93bW1fcGFyYW1zLCB3bWlfd21tX3BhcmFtcywgd21tX3BhcmFtc19hY192bywgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QREVWX1NFVF9XTU1fUEFSQU1TX0NNRElEKTsKKworLyogVmRldiBzdGFydCByZXF1ZXN0IENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfU1RBUlRfUkVRVUVTVF9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9zdGFydF9yZXF1ZXN0X2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfc3RhcnRfcmVxdWVzdF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGFubmVsLCB3bWlfY2hhbm5lbCwgY2hhbiwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX3AycF9ub2FfZGVzY3JpcHRvciwgbm9hX2Rlc2NyaXB0b3JzLCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1ZERVZfU1RBUlRfUkVRVUVTVF9DTURJRCk7CisKKy8qIFZkZXYgcmVzdGFydCByZXF1ZXN0IGNtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfUkVTVEFSVF9SRVFVRVNUX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3N0YXJ0X3JlcXVlc3RfY21kX2ZpeGVkX3BhcmFtLCB3bWlfdmRldl9zdGFydF9yZXF1ZXN0X2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYW5uZWwsIHdtaV9jaGFubmVsLCBjaGFuLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfcDJwX25vYV9kZXNjcmlwdG9yLCBub2FfZGVzY3JpcHRvcnMsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfVkRFVl9SRVNUQVJUX1JFUVVFU1RfQ01ESUQpOworCisvKiBQMlAgR28gc2V0IGJlYWNvbiBJRSBjbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QMlBfR09fU0VUX0JFQUNPTl9JRShpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcDJwX2dvX3NldF9iZWFjb25faWVfZml4ZWRfcGFyYW0sIHdtaV9wMnBfZ29fc2V0X2JlYWNvbl9pZV9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgaWVfZGF0YSwgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QMlBfR09fU0VUX0JFQUNPTl9JRSk7CisKKy8qIEdUSyBvZmZsb2FkIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0dUS19PRkZMT0FEX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX1dNSV9HVEtfT0ZGTE9BRF9DTURfZml4ZWRfcGFyYW0sIFdNSV9HVEtfT0ZGTE9BRF9DTURfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0dUS19PRkZMT0FEX0NNRElEKTsKKworLyogUE1GIDExdyBvZmZsb2FkIFNldCBTQSBxdWVyeSBjbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QTUZfT0ZGTE9BRF9TRVRfU0FfUVVFUllfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFwKKwkgICAgV01JVExWX1RBR19TVFJVQ19XTUlfUE1GX09GRkxPQURfU0VUX1NBX1FVRVJZX0NNRF9maXhlZF9wYXJhbSwgXAorCSAgICBXTUlfUE1GX09GRkxPQURfU0VUX1NBX1FVRVJZX0NNRF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFwKKwkgICAgIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUE1GX09GRkxPQURfU0VUX1NBX1FVRVJZX0NNRElEKTsKKworLyogU2NhbiBjaGFubmVsIGxpc3QgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU0NBTl9DSEFOX0xJU1RfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NjYW5fY2hhbl9saXN0X2NtZF9maXhlZF9wYXJhbSwgd21pX3NjYW5fY2hhbl9saXN0X2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9jaGFubmVsLCBjaGFuX2luZm8sIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU0NBTl9DSEFOX0xJU1RfQ01ESUQpOworCisvKiBTVEEgVUFQU0QgQXV0byB0cmlnZ2VyIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NUQV9VQVBTRF9BVVRPX1RSSUdfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YV91YXBzZF9hdXRvX3RyaWdfY21kX2ZpeGVkX3BhcmFtLCB3bWlfc3RhX3VhcHNkX2F1dG9fdHJpZ19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfc3RhX3VhcHNkX2F1dG9fdHJpZ19wYXJhbSwgYWNfcGFyYW0sIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU1RBX1VBUFNEX0FVVE9fVFJJR19DTURJRCk7CisKKy8qIFByb2JlIHRlbXBsYXRlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BSQl9UTVBMX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wcmJfdG1wbF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wcmJfdG1wbF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9iY25fcHJiX2luZm8sIHdtaV9iY25fcHJiX2luZm8sIGJjbl9wcmJfaW5mbywgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBidWZwLCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BSQl9UTVBMX0NNRElEKTsKKworLyogQmVhY29uIHRlbXBsYXRlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0JDTl9UTVBMX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9iY25fdG1wbF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9iY25fdG1wbF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9iY25fcHJiX2luZm8sIHdtaV9iY25fcHJiX2luZm8sIGJjbl9wcmJfaW5mbywgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBidWZwLCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0JDTl9UTVBMX0NNRElEKTsKKworLyogVkRFViBpbnN0YWxsIGtleSBjb21wbGV0ZSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9WREVWX0lOU1RBTExfS0VZX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X2luc3RhbGxfa2V5X2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfaW5zdGFsbF9rZXlfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBrZXlfZGF0YSwgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX0lOU1RBTExfS0VZX0NNRElEKTsKKy8qIFZERVYgV05NIFNMRUVQIE1PREUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVkRFVl9XTk1fU0xFRVBNT0RFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX1dNSV9WREVWX1dOTV9TTEVFUE1PREVfQ01EX2ZpeGVkX3BhcmFtLCBXTUlfVkRFVl9XTk1fU0xFRVBNT0RFX0NNRF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfVkRFVl9XTk1fU0xFRVBNT0RFX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfSVBTRUNfTkFUS0VFUEFMSVZFX0ZJTFRFUl9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ19XTUlfVkRFVl9JUFNFQ19OQVRLRUVQQUxJVkVfRklMVEVSX0NNRF9maXhlZF9wYXJhbSwgV01JX1ZERVZfSVBTRUNfTkFUS0VFUEFMSVZFX0ZJTFRFUl9DTURfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1ZERVZfSVBTRUNfTkFUS0VFUEFMSVZFX0ZJTFRFUl9DTURJRCk7CisKKy8qIFBlZXIgQXNzb2MgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUEVFUl9BU1NPQ19DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9hc3NvY19jb21wbGV0ZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZWVyX2Fzc29jX2NvbXBsZXRlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgcGVlcl9sZWdhY3lfcmF0ZXMsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgcGVlcl9odF9yYXRlcywgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdmh0X3JhdGVfc2V0LCB3bWlfdmh0X3JhdGVfc2V0LCBwZWVyX3ZodF9yYXRlcywgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX0FTU09DX0NNRElEKTsKKworLyogUGVlciBTZXQgUmF0ZSBSZXBvcnQgQ29uZGl0aW9uIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BFRVJfU0VUX1JBVEVfUkVQT1JUX0NPTkRJVElPTl9DTURJRChpZCwgb3AsIGJ1ZiwgbGVuKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9zZXRfcmF0ZV9yZXBvcnRfY29uZGl0aW9uX2ZpeGVkX3BhcmFtLCB3bWlfcGVlcl9zZXRfcmF0ZV9yZXBvcnRfY29uZGl0aW9uX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX1NFVF9SQVRFX1JFUE9SVF9DT05ESVRJT05fQ01ESUQpOworCisvKiBBZGQgQmVhY29uIGZpbHRlciBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9BRERfQkNOX0ZJTFRFUl9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfYWRkX2Jjbl9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLCB3bWlfYWRkX2Jjbl9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0ZYQVIoaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9VSU5UMzIsIEFfVUlOVDMyLCBpZV9tYXAsIFdNSVRMVl9TSVpFX0ZJWCwgQkNOX0ZMVF9NQVhfRUxFTVNfSUVfTElTVCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQUREX0JDTl9GSUxURVJfQ01ESUQpOworCisvKiBTdGEga2VlcGFsaXZlIGNtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NUQV9LRUVQQUxJVkVfQ01ESUQoaWQsb3AsYnVmLGxlbikJCQkJCSAgICAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX1dNSV9TVEFfS0VFUEFMSVZFX0NNRF9maXhlZF9wYXJhbSwgV01JX1NUQV9LRUVQQUxJVkVfQ01EX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ19XTUlfU1RBX0tFRVBBTFZFX0FSUF9SRVNQT05TRSwgV01JX1NUQV9LRUVQQUxWRV9BUlBfUkVTUE9OU0UsIGFycF9yZXNwLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NUQV9LRUVQQUxJVkVfQ01ESUQpOworCisvKiBBUlAgTlMgb2ZmbG9hZCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9TRVRfQVJQX05TX09GRkxPQURfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfV01JX1NFVF9BUlBfTlNfT0ZGTE9BRF9DTURfZml4ZWRfcGFyYW0sIFdNSV9TRVRfQVJQX05TX09GRkxPQURfQ01EX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0ZYQVIoaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgV01JX05TX09GRkxPQURfVFVQTEUsIG5zX3R1cGxlcywgV01JVExWX1NJWkVfRklYLCBXTUlfTUFYX05TX09GRkxPQURTKSBcCisJV01JVExWX0ZYQVIoaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgV01JX0FSUF9PRkZMT0FEX1RVUExFLCBhcnBfdHVwbGVzLCBXTUlUTFZfU0laRV9GSVgsIFdNSV9NQVhfQVJQX09GRkxPQURTKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgV01JX05TX09GRkxPQURfVFVQTEUsIG5zX2V4dF90dXBsZXMsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU0VUX0FSUF9OU19PRkZMT0FEX0NNRElEKTsKKworLyogQVAgUFMgcGVlciBwYXJhbSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9BUF9QU19QRUVSX1BBUkFNX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hcF9wc19wZWVyX2NtZF9maXhlZF9wYXJhbSwgd21pX2FwX3BzX3BlZXJfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQVBfUFNfUEVFUl9QQVJBTV9DTURJRCk7CisKKy8qIEFQIFBTIGVuaGFuY2VkIGdyZWVuIGFwIHBhcmFtIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0FQX1BTX0VHQVBfUEFSQU1fQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sXAorCSAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2FwX3BzX2VnYXBfcGFyYW1fY21kX2ZpeGVkX3BhcmFtLFwKKwkgICB3bWlfYXBfcHNfZWdhcF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9BUF9QU19FR0FQX1BBUkFNX0NNRElEKTsKKworLyogUHJvZmlsZSBUcmlnZ2VyIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1dMQU5fUFJPRklMRV9UUklHR0VSX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV93bGFuX3Byb2ZpbGVfdHJpZ2dlcl9jbWRfZml4ZWRfcGFyYW0sIHdtaV93bGFuX3Byb2ZpbGVfdHJpZ2dlcl9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9XTEFOX1BST0ZJTEVfVFJJR0dFUl9DTURJRCk7CisKKy8qIFdMQU4gUHJvZmlsZSBzZXQgaGlzdCBpbnRlcnZhbCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9XTEFOX1BST0ZJTEVfU0VUX0hJU1RfSU5UVkxfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3dsYW5fcHJvZmlsZV9zZXRfaGlzdF9pbnR2bF9jbWRfZml4ZWRfcGFyYW0sIHdtaV93bGFuX3Byb2ZpbGVfc2V0X2hpc3RfaW50dmxfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfV0xBTl9QUk9GSUxFX1NFVF9ISVNUX0lOVFZMX0NNRElEKTsKKworLyogV0xBTiBQcm9maWxlIGdldCBwcm9maWxlIGRhdGEgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfV0xBTl9QUk9GSUxFX0dFVF9QUk9GSUxFX0RBVEFfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3dsYW5fcHJvZmlsZV9nZXRfcHJvZl9kYXRhX2NtZF9maXhlZF9wYXJhbSwgd21pX3dsYW5fcHJvZmlsZV9nZXRfcHJvZl9kYXRhX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1dMQU5fUFJPRklMRV9HRVRfUFJPRklMRV9EQVRBX0NNRElEKTsKKworLyogV0xBTiBQcm9maWxlIGVuYWJsZSBwcm9maWxlIElEIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1dMQU5fUFJPRklMRV9FTkFCTEVfUFJPRklMRV9JRF9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfd2xhbl9wcm9maWxlX2VuYWJsZV9wcm9maWxlX2lkX2NtZF9maXhlZF9wYXJhbSwgd21pX3dsYW5fcHJvZmlsZV9lbmFibGVfcHJvZmlsZV9pZF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9XTEFOX1BST0ZJTEVfRU5BQkxFX1BST0ZJTEVfSURfQ01ESUQpOworCisvKiBXT1cgRGVsZXRlIFdha2UgUGF0dGVybiBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9XT1dfREVMX1dBS0VfUEFUVEVSTl9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ19XTUlfV09XX0RFTF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwgV01JX1dPV19ERUxfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9XT1dfREVMX1dBS0VfUEFUVEVSTl9DTURJRCk7CisKKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9XT1dfVURQX1NWQ19PRkxEX0NNRElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfVURQX1NWQ19PRkxEX0NNRF9maXhlZF9wYXJhbSwgV01JX1dPV19VRFBfU1ZDX09GTERfQ01EX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBwYXR0ZXJuLCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIHJlc3BvbnNlLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9XT1dfVURQX1NWQ19PRkxEX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1dPV19IT1NUV0FLRVVQX0dQSU9fUElOX1BBVFRFUk5fQ09ORklHX0NNRElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLFwKKwkgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV93b3dfaG9zdHdha2V1cF9ncGlvX3Bpbl9wYXR0ZXJuX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sXAorCSAgIFdNSV9XT1dfSE9TVFdBS0VVUF9HUElPX1BJTl9QQVRURVJOX0NPTkZJR19DTURfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLFwKKwkgICBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9XT1dfSE9TVFdBS0VVUF9HUElPX1BJTl9QQVRURVJOX0NPTkZJR19DTURJRCk7CisKKy8qIFdvdyBlbmFibGUvZGlzYWJsZSB3YWtlIHVwIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1dPV19FTkFCTEVfRElTQUJMRV9XQUtFX0VWRU5UX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfQUREX0RFTF9FVlRfQ01EX2ZpeGVkX3BhcmFtLCBXTUlfV09XX0FERF9ERUxfRVZUX0NNRF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfV09XX0VOQUJMRV9ESVNBQkxFX1dBS0VfRVZFTlRfQ01ESUQpOworCisvKiBSVFQgbWVhc3VyZW1lbnQgcmVxdWVzdCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9SVFRfTUVBU1JFUV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBkYXRhLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9SVFRfTUVBU1JFUV9DTURJRCk7CisKKy8qIFJUVCBUU0YgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUlRUX1RTRl9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBkYXRhLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9SVFRfVFNGX0NNRElEKTsKKworLypSVFQgT0VNIHJlcSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PRU1fUkVRX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGRhdGEsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0VNX1JFUV9DTURJRCk7CisKKy8qIFNwZWN0cmFsIHNjYW4gY29uZmlndXJlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfU1BFQ1RSQUxfU0NBTl9DT05GSUdVUkVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc3BlY3RyYWxfY29uZmlndXJlX2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfc3BlY3RyYWxfY29uZmlndXJlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfVkRFVl9TUEVDVFJBTF9TQ0FOX0NPTkZJR1VSRV9DTURJRCk7CisKKy8qIFNwZWN0cmFsIHNjYW4gZW5hYmxlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfU1BFQ1RSQUxfU0NBTl9FTkFCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc3BlY3RyYWxfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfc3BlY3RyYWxfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfVkRFVl9TUEVDVFJBTF9TQ0FOX0VOQUJMRV9DTURJRCk7CisKKy8qIFJlcXVlc3Qgc3RhdHMgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUkVRVUVTVF9TVEFUU19DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcmVxdWVzdF9zdGF0c19jbWRfZml4ZWRfcGFyYW0sIHdtaV9yZXF1ZXN0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUkVRVUVTVF9TVEFUU19DTURJRCk7CisKKy8qIGZsdXNoIGRlYnVnIG1lc3NhZ2VzICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfR0VUX0ZXX01FTV9EVU1QX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9nZXRfZndfbWVtX2R1bXBfZml4ZWRfcGFyYW0sIHdtaV9nZXRfZndfbWVtX2R1bXBfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZndfbWVtX2R1bXAsZndfbWVtX2R1bXBfcGFyYW1zLCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0dFVF9GV19NRU1fRFVNUF9DTURJRCk7CisKKy8qIFJlcXVlc3QgZm9yIG1lbW9yeSBkdW1wIHN0YXRzIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0RFQlVHX01FU0dfRkxVU0hfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RlYnVnX21lc2dfZmx1c2hfZml4ZWRfcGFyYW0sIHdtaV9kZWJ1Z19tZXNnX2ZsdXNoX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9ERUJVR19NRVNHX0ZMVVNIX0NNRElEKTsKKworLyogUmVxdWVzdCB0byBjb25maWcgdGhlIERJQUcgRXZlbnRzIGFuZCBMT0dzICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRElBR19FVkVOVF9MT0dfQ09ORklHX0NNRElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kaWFnX2V2ZW50X2xvZ19jb25maWdfZml4ZWRfcGFyYW0sIHdtaV9kaWFnX2V2ZW50X2xvZ19jb25maWdfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwgQV9VSU5UMzIsIGRpYWdfZXZlbnRzX2xvZ3NfbGlzdCwgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9ESUFHX0VWRU5UX0xPR19DT05GSUdfQ01ESUQpOworCisvKiBTZXQgY29uZmlnIHBhcmFtcyAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NUQVJUX0xJTktfU1RBVFNfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YXJ0X2xpbmtfc3RhdHNfY21kX2ZpeGVkX3BhcmFtLCB3bWlfc3RhcnRfbGlua19zdGF0c19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NUQVJUX0xJTktfU1RBVFNfQ01ESUQpOworCisvKiBSZXF1ZXN0IHRvIGNsZWFyIGxpbmsgc3RhdHMgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9DTEVBUl9MSU5LX1NUQVRTX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jbGVhcl9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbSwgd21pX2NsZWFyX2xpbmtfc3RhdHNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9DTEVBUl9MSU5LX1NUQVRTX0NNRElEKTsKKworLyogUmVxdWVzdCBMaW5rIHN0YXRzIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JFUVVFU1RfTElOS19TVEFUU19DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcmVxdWVzdF9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbSwgd21pX3JlcXVlc3RfbGlua19zdGF0c19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JFUVVFU1RfTElOS19TVEFUU19DTURJRCk7CisKKy8qIE5ldHdvcmsgbGlzdCBvZmZsb2FkIGNvbmZpZyBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9ORVRXT1JLX0xJU1RfT0ZGTE9BRF9DT05GSUdfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX25sb19jb25maWdfY21kX2ZpeGVkX3BhcmFtLCB3bWlfbmxvX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCBubG9fY29uZmlndXJlZF9wYXJhbWV0ZXJzLCBubG9fbGlzdCwgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19BUlJBWV9VSU5UMzIsIEFfVUlOVDMyLCBjaGFubmVsX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIG5sb19jaGFubmVsX3ByZWRpY3Rpb25fY2ZnLCBjaGFubmVsX3ByZWRpY3Rpb25fcGFyYW0sIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTkVUV09SS19MSVNUX09GRkxPQURfQ09ORklHX0NNRElEKTsKKworLyogUGFzc3BvaW50IGxpc3Qgb2ZmbG9hZCBjb25maWcgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUEFTU1BPSU5UX0xJU1RfQ09ORklHX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLFdNSVRMVl9UQUdfU1RSVUNfd21pX3Bhc3Nwb2ludF9jb25maWdfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcGFzc3BvaW50X2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QQVNTUE9JTlRfTElTVF9DT05GSUdfQ01ESUQpOworCisvKiBDU0Egb2ZmbG9hZCBlbmFibGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQ1NBX09GRkxPQURfRU5BQkxFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jc2Ffb2ZmbG9hZF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfY3NhX29mZmxvYWRfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQ1NBX09GRkxPQURfRU5BQkxFX0NNRElEKTsKKworLyogQ1NBIG9mZmxvYWQgY2hhbm5lbCBzd2l0Y2ggQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQ1NBX09GRkxPQURfQ0hBTlNXSVRDSF9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfY3NhX29mZmxvYWRfY2hhbnN3aXRjaF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9jc2Ffb2ZmbG9hZF9jaGFuc3dpdGNoX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYW5uZWwsIHdtaV9jaGFubmVsLCBjaGFuLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0NTQV9PRkZMT0FEX0NIQU5TV0lUQ0hfQ01ESUQpOworCisvKiBDaGF0dGVyIHNldCBtb2RlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0NIQVRURVJfU0VUX01PREVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYXR0ZXJfc2V0X21vZGVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfY2hhdHRlcl9zZXRfbW9kZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0NIQVRURVJfU0VUX01PREVfQ01ESUQpOworCisvKiBQREVWIFVURiBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1VURl9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBkYXRhLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QREVWX1VURl9DTURJRCk7CisKKy8qIFBERVYgUVZJVCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1FWSVRfQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUERFVl9RVklUX0NNRElEKTsKKworLyogVmRldiBTZXQga2VlcCBhbGl2ZSBDbWQgICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVkRFVl9TRVRfS0VFUEFMSVZFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF9rZWVwYWxpdmVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfdmRldl9zZXRfa2VlcGFsaXZlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1ZERVZfU0VUX0tFRVBBTElWRV9DTURJRCk7CisKKy8qIFZkZXYgR2V0IGtlZXAgYWxpdmUgQ21kICAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfR0VUX0tFRVBBTElWRV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9nZXRfa2VlcGFsaXZlX2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfZ2V0X2tlZXBhbGl2ZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX0dFVF9LRUVQQUxJVkVfQ01ESUQpOworLypGV1RFU1QgU2V0IFRCVFQgbW9kZSBDbWQqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0ZXVEVTVF9WREVWX01DQ19TRVRfVEJUVF9NT0RFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X21jY19zZXRfdGJ0dF9tb2RlX2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfbWNjX3NldF90YnR0X21vZGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRldURVNUX1ZERVZfTUNDX1NFVF9UQlRUX01PREVfQ01ESUQpOworCisvKiBGV1RFU1Qgc2V0IE5vQSBwYXJhbWV0ZXJzIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0ZXVEVTVF9QMlBfU0VUX05PQV9QQVJBTV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcDJwX3NldF9ub2FfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcDJwX3NldF9ub2FfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX3AycF9ub2FfZGVzY3JpcHRvciwgbm9hX2Rlc2NyaXB0b3IsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0ZXVEVTVF9QMlBfU0VUX05PQV9QQVJBTV9DTURJRCk7CisKKy8qIFVuaXQgdGVzdCBGVyAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1VOSVRfVEVTVF9DTURJRChpZCxvcCxidWYsbGVuKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdW5pdF90ZXN0X2NtZF9maXhlZF9wYXJhbSwgd21pX3VuaXRfdGVzdF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwgQV9VSU5UMzIsIGFyZ3MsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1VOSVRfVEVTVF9DTURJRCk7CisKKy8qIEZvcmNlIEZ3IEhhbmcgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRk9SQ0VfRldfSEFOR19DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ19XTUlfRk9SQ0VfRldfSEFOR19DTURfZml4ZWRfcGFyYW0sIFdNSV9GT1JDRV9GV19IQU5HX0NNRF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0ZPUkNFX0ZXX0hBTkdfQ01ESUQpOworLyogU2V0IE1jYXN0IGFkZHJlc3MgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU0VUX01DQVNUQkNBU1RfRklMVEVSX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX1dNSV9TRVRfTUNBU1RCQ0FTVF9GSUxURVJfQ01EX2ZpeGVkX3BhcmFtLCBXTUlfU0VUX01DQVNUQkNBU1RfRklMVEVSX0NNRF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NFVF9NQ0FTVEJDQVNUX0ZJTFRFUl9DTURJRCk7CisKKy8qIEdQSU8gY29uZmlnIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0dQSU9fQ09ORklHX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ncGlvX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sIHdtaV9ncGlvX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9HUElPX0NPTkZJR19DTURJRCk7CisKKy8qIEdQSU8gb3V0cHV0IENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0dQSU9fT1VUUFVUX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ncGlvX291dHB1dF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9ncGlvX291dHB1dF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9HUElPX09VVFBVVF9DTURJRCk7CisKKy8qIFBlZXIgYWRkIFdEQSBlbnRyeSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QRUVSX0FERF9XRFNfRU5UUllfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfYWRkX3dkc19lbnRyeV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZWVyX2FkZF93ZHNfZW50cnlfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX0FERF9XRFNfRU5UUllfQ01ESUQpOworCisvKlBlZXIgcmVtb3ZlIFdEUyBlbnRyeSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QRUVSX1JFTU9WRV9XRFNfRU5UUllfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfcmVtb3ZlX3dkc19lbnRyeV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZWVyX3JlbW92ZV93ZHNfZW50cnlfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX1JFTU9WRV9XRFNfRU5UUllfQ01ESUQpOworCisvKiBCZWFjb24gdHggQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQkNOX1RYX0NNRElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkJCQkJCQkJICAgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfYmNuX3R4X2hkciwgd21pX2Jjbl90eF9oZHIsIGhkciwgV01JVExWX1NJWkVfRklYKSAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGJ1ZnAsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0JDTl9UWF9DTURJRCk7CisKKy8qIFBERVYgc2VuZCBCZWFjb24gQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUERFVl9TRU5EX0JDTl9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfYmNuX3NlbmRfZnJvbV9ob3N0X2NtZF9maXhlZF9wYXJhbSwgd21pX2Jjbl9zZW5kX2Zyb21faG9zdF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfU0VORF9CQ05fQ01ESUQpOworCisvKiBNYW5hZ2VtZW50IHR4IENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX01HTVRfVFhfQ01ESUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJCQkJCQkgICAgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfbWdtdF90eF9oZHIsIHdtaV9tZ210X3R4X2hkciwgaGRyLCBXTUlUTFZfU0laRV9GSVgpICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgYnVmcCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTUdNVF9UWF9DTURJRCk7CisKKy8qIE1hbmFnZW1lbnQgdHggc2VuZCBjbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9NR01UX1RYX1NFTkRfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZ210X3R4X3NlbmRfY21kX2ZpeGVkX3BhcmFtLCB3bWlfbWdtdF90eF9zZW5kX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgYnVmcCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTUdNVF9UWF9TRU5EX0NNRElEKTsKKworLyogQUREIGNsZWFyIHJlc3BvbnNlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0FEREJBX0NMRUFSX1JFU1BfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2FkZGJhX2NsZWFyX3Jlc3BfY21kX2ZpeGVkX3BhcmFtLCB3bWlfYWRkYmFfY2xlYXJfcmVzcF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0FEREJBX0NMRUFSX1JFU1BfQ01ESUQpOworCisvKiBBREQgQkEgc2VuZCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9BRERCQV9TRU5EX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hZGRiYV9zZW5kX2NtZF9maXhlZF9wYXJhbSwgd21pX2FkZGJhX3NlbmRfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9BRERCQV9TRU5EX0NNRElEKTsKKworLyogREVMIEJBIHNlbmQgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfREVMQkFfU0VORF9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZGVsYmFfc2VuZF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9kZWxiYV9zZW5kX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfREVMQkFfU0VORF9DTURJRCk7CisKKy8qIEFERCBCQSBzZXQgcmVzcG9uc2UgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQUREQkFfU0VUX1JFU1BfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2FkZGJhX3NldHJlc3BvbnNlX2NtZF9maXhlZF9wYXJhbSwgd21pX2FkZGJhX3NldHJlc3BvbnNlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQUREQkFfU0VUX1JFU1BfQ01ESUQpOworCisvKiBTZW5kIHNpbmdsZSBBTVNEVSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9TRU5EX1NJTkdMRUFNU0RVX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zZW5kX3NpbmdsZWFtc2R1X2NtZF9maXhlZF9wYXJhbSwgd21pX3NlbmRfc2luZ2xlYW1zZHVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TRU5EX1NJTkdMRUFNU0RVX0NNRElEKTsKKworLyogUERldiBQYWNrZXQgTG9nIGVuYWJsZSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1BLVExPR19FTkFCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfcGt0bG9nX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X3BrdGxvZ19lbmFibGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUERFVl9QS1RMT0dfRU5BQkxFX0NNRElEKTsKKworLyogUERldiBQYWNrZXQgTG9nIGRpc2FibGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUERFVl9QS1RMT0dfRElTQUJMRV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9wa3Rsb2dfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X3BrdGxvZ19kaXNhYmxlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfUEtUTE9HX0RJU0FCTEVfQ01ESUQpOworCisvKiBQRGV2IHNldCBIVCBDYXAgSUUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUERFVl9TRVRfSFRfQ0FQX0lFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF9odF9pZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X3NldF9odF9pZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGllX2RhdGEsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUERFVl9TRVRfSFRfQ0FQX0lFX0NNRElEKTsKKworLyogUERldiBzZXQgVkhUIENhcCBJRSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1NFVF9WSFRfQ0FQX0lFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF92aHRfaWVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcGRldl9zZXRfdmh0X2llX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgaWVfZGF0YSwgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QREVWX1NFVF9WSFRfQ0FQX0lFX0NNRElEKTsKKworLyogUERldiBTZXQgRFNDUCB0byBUSUQgbWFwIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BERVZfU0VUX0RTQ1BfVElEX01BUF9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zZXRfZHNjcF90aWRfbWFwX2NtZF9maXhlZF9wYXJhbSwgd21pX3BkZXZfc2V0X2RzY3BfdGlkX21hcF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfU0VUX0RTQ1BfVElEX01BUF9DTURJRCk7CisKKy8qIFBEZXYgR3JlZW4gQVAgUFMgZW5hYmxlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BERVZfR1JFRU5fQVBfUFNfRU5BQkxFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X2dyZWVuX2FwX3BzX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X2dyZWVuX2FwX3BzX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfR1JFRU5fQVBfUFNfRU5BQkxFX0NNRElEKTsKKworLyogUERFViBHZXQgVFBDIENvbmZpZyBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX0dFVF9UUENfQ09ORklHX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X2dldF90cGNfY29uZmlnX2NtZF9maXhlZF9wYXJhbSwgd21pX3BkZXZfZ2V0X3RwY19jb25maWdfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QREVWX0dFVF9UUENfQ09ORklHX0NNRElEKTsKKworLyogUERFViBTZXQgQmFzZSBNYWMgQWRkcmVzcyBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1NFVF9CQVNFX01BQ0FERFJfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc2V0X2Jhc2VfbWFjYWRkcl9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X3NldF9iYXNlX21hY2FkZHJfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QREVWX1NFVF9CQVNFX01BQ0FERFJfQ01ESUQpOworCisvKiBQZWVyIG11bHRpY2FzdCBncm91cCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QRUVSX01DQVNUX0dST1VQX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX21jYXN0X2dyb3VwX2NtZF9maXhlZF9wYXJhbSwgd21pX3BlZXJfbWNhc3RfZ3JvdXBfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX01DQVNUX0dST1VQX0NNRElEKTsKKworLyogUm9hbSBBUCBwcm9maWxlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JPQU1fQVBfUFJPRklMRShpZCxvcCxidWYsbGVuKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9hcF9wcm9maWxlX2ZpeGVkX3BhcmFtLCB3bWlfcm9hbV9hcF9wcm9maWxlX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfYXBfcHJvZmlsZSwgd21pX2FwX3Byb2ZpbGUsIGFwX3Byb2ZpbGUsIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUk9BTV9BUF9QUk9GSUxFKTsKKworLyogUm9hbSBzeW5jIGNvbXBsZXRlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JPQU1fU1lOQ0hfQ09NUExFVEUoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fc3luY2hfY29tcGxldGVfZml4ZWRfcGFyYW0sIHdtaV9yb2FtX3N5bmNoX2NvbXBsZXRlX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9ST0FNX1NZTkNIX0NPTVBMRVRFKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JPQU1fU0VUX1JJQ19SRVFVRVNUX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yaWNfcmVxdWVzdF9maXhlZF9wYXJhbSwgd21pX3JpY19yZXF1ZXN0X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX3JpY190c3BlYywgcmljX3RzcGVjX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JPQU1fU0VUX1JJQ19SRVFVRVNUX0NNRElEKTsKKworLyogU2NhbiBzY2hlZHVsZXIgcHJpb3JpdHkgVGFibGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU0NBTl9TQ0hfUFJJT19UQkxfQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NjYW5fc2NoX3ByaW9yaXR5X3RhYmxlX2NtZF9maXhlZF9wYXJhbSwgd21pX3NjYW5fc2NoX3ByaW9yaXR5X3RhYmxlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgbWFwcGluZ190YWJsZSwgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TQ0FOX1NDSF9QUklPX1RCTF9DTURJRCk7CisKKy8qIFBERVYgREZTIGVuYWJsZSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX0RGU19FTkFCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfZGZzX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X2Rmc19lbmFibGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QREVWX0RGU19FTkFCTEVfQ01ESUQpOworCisvKiBQREVWIERGUyBkaXNhYmxlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BERVZfREZTX0RJU0FCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfZGZzX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcGRldl9kZnNfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfREZTX0RJU0FCTEVfQ01ESUQpOworCisvKiBERlMgcGh5ZXJyIHBhcnNlL2ZpbHRlciBvZmZsb2FkIGVuYWJsZSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9ERlNfUEhZRVJSX0ZJTFRFUl9FTkFfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2Rmc19waHllcnJfZmlsdGVyX2VuYV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9kZnNfcGh5ZXJyX2ZpbHRlcl9lbmFfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9ERlNfUEhZRVJSX0ZJTFRFUl9FTkFfQ01ESUQpOworCisvKiBERlMgcGh5ZXJyIHBhcnNlL2ZpbHRlciBvZmZsb2FkIGRpc2FibGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfREZTX1BIWUVSUl9GSUxURVJfRElTX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kZnNfcGh5ZXJyX2ZpbHRlcl9kaXNfY21kX2ZpeGVkX3BhcmFtLCB3bWlfZGZzX3BoeWVycl9maWx0ZXJfZGlzX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfREZTX1BIWUVSUl9GSUxURVJfRElTX0NNRElEKTsKKworLyogV09XIEFkZCBXYWtlIFBhdHRlcm4gQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfV09XX0FERF9XQUtFX1BBVFRFUk5fQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfV01JX1dPV19BRERfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0sIFdNSV9XT1dfQUREX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgV09XX0JJVE1BUF9QQVRURVJOX1QsIHBhdHRlcm5faW5mb19iaXRtYXAsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIFdPV19JUFY0X1NZTkNfUEFUVEVSTl9ULCBwYXR0ZXJuX2luZm9faXB2NCwgV01JVExWX1NJWkVfVkFSKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgV09XX0lQVjZfU1lOQ19QQVRURVJOX1QsIHBhdHRlcm5faW5mb19pcHY2LCBXTUlUTFZfU0laRV9WQVIpCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCBXT1dfTUFHSUNfUEFUVEVSTl9DTUQsIHBhdHRlcm5faW5mb19tYWdpY19wYXR0ZXJuLCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwgQV9VSU5UMzIsIHBhdHRlcm5faW5mb190aW1lb3V0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRlhBUihpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwgQV9VSU5UMzIsIHJhX3JhdGVsaW1pdF9pbnRlcnZhbCwgV01JVExWX1NJWkVfRklYLCAxKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9XT1dfQUREX1dBS0VfUEFUVEVSTl9DTURJRCk7CisKKy8qIElPQUMgYWRkIGtlZXAgYWxpdmUgY21kLiAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1dPV19JT0FDX0FERF9LRUVQQUxJVkVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfV01JX1dPV19JT0FDX0FERF9LRUVQQUxJVkVfQ01EX2ZpeGVkX3BhcmFtLCBXTUlfV09XX0lPQUNfQUREX0tFRVBBTElWRV9DTURfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCBXTUlfV09XX0lPQUNfS0VFUEFMSVZFX1QsIGtlZXBhbGl2ZV9zZXQsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfV09XX0lPQUNfQUREX0tFRVBBTElWRV9DTURJRCk7CisKKy8qIElPQUMgZGVsIGtlZXAgYWxpdmUgY21kLiAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1dPV19JT0FDX0RFTF9LRUVQQUxJVkVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfV01JX1dPV19JT0FDX0RFTF9LRUVQQUxJVkVfQ01EX2ZpeGVkX3BhcmFtLCBXTUlfV09XX0lPQUNfREVMX0tFRVBBTElWRV9DTURfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1dPV19JT0FDX0RFTF9LRUVQQUxJVkVfQ01ESUQpOworCisvKiBXT1cgSU9BQyBBZGQgV2FrZSBQYXR0ZXJuIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1dPV19JT0FDX0FERF9XQUtFX1BBVFRFUk5fQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfV01JX1dPV19JT0FDX0FERF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwgV01JX1dPV19JT0FDX0FERF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIFdPV19JT0FDX1BLVF9QQVRURVJOX1QsIHBhdHRlcm5faW5mb19wa3QsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIFdPV19JT0FDX1RNUl9QQVRURVJOX1QsIHBhdHRlcm5faW5mb190bXIsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIFdPV19JT0FDX1NPQ0tfUEFUVEVSTl9ULCBwYXR0ZXJuX2luZm9fc29jaywgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9XT1dfSU9BQ19BRERfV0FLRV9QQVRURVJOX0NNRElEKTsKKworLyogV09XIElPQUMgRGVsZXRlIFdha2UgUGF0dGVybiBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9XT1dfSU9BQ19ERUxfV0FLRV9QQVRURVJOX0NNRElEKGlkLG9wLGJ1ZixsZW4pCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfSU9BQ19ERUxfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0sIFdNSV9XT1dfSU9BQ19ERUxfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1dPV19JT0FDX0RFTF9XQUtFX1BBVFRFUk5fQ01ESUQpOworCisvKiBleHR3b3cgZW5hYmxlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0VYVFdPV19FTkFCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHdvd19lbmFibGVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfZXh0d293X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0VYVFdPV19FTkFCTEVfQ01ESUQpOworCisvKiBleHR3b3cgc2V0IHdha2V1cCBwYXJhbXMgY21kIGZvciBhcHAgdHlwZTEgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9FWFRXT1dfU0VUX0FQUF9UWVBFMV9QQVJBTVNfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHdvd19zZXRfYXBwX3R5cGUxX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0sIHdtaV9leHR3b3dfc2V0X2FwcF90eXBlMV9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9FWFRXT1dfU0VUX0FQUF9UWVBFMV9QQVJBTVNfQ01ESUQpOworCisvKiBleHR3b3cgc2V0IHdha2V1cCBwYXJhbXMgY21kIGZvciBhcHAgdHlwZTIgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9FWFRXT1dfU0VUX0FQUF9UWVBFMl9QQVJBTVNfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHdvd19zZXRfYXBwX3R5cGUyX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0sIHdtaV9leHR3b3dfc2V0X2FwcF90eXBlMl9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9FWFRXT1dfU0VUX0FQUF9UWVBFMl9QQVJBTVNfQ01ESUQpOworCisvKiBTdG9wIHNjYW4gQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU1RPUF9TQ0FOX0NNRElEKGlkLG9wLGJ1ZixsZW4pCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdG9wX3NjYW5fY21kX2ZpeGVkX3BhcmFtLCB3bWlfc3RvcF9zY2FuX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU1RPUF9TQ0FOX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BERVZfU0VUX1BBUkFNX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfU0VUX1BBUkFNX0NNRElEKTsKKworLyogUERldiBzZXQgcXVpZXQgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUERFVl9TRVRfUVVJRVRfTU9ERV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zZXRfcXVpZXRfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcGRldl9zZXRfcXVpZXRfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QREVWX1NFVF9RVUlFVF9NT0RFX0NNRElEKTsKKworLyogVmRldiBjcmVhdGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVkRFVl9DUkVBVEVfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfY3JlYXRlX2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfY3JlYXRlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV92ZGV2X3R4cnhfc3RyZWFtcywgY2ZnX3R4cnhfc3RyZWFtcywgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX0NSRUFURV9DTURJRCk7CisKKy8qIFZkZXYgZGVsZXRlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfREVMRVRFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X2RlbGV0ZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV92ZGV2X2RlbGV0ZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1ZERVZfREVMRVRFX0NNRElEKTsKKworLyogVmRldiB1cCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9WREVWX1VQX0NNRElEKGlkLG9wLGJ1ZixsZW4pCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3VwX2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfdXBfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX1VQX0NNRElEKTsKKworLyogVmRldiBzdG9wIGNtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfU1RPUF9DTURJRChpZCxvcCxidWYsbGVuKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9zdG9wX2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfc3RvcF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1ZERVZfU1RPUF9DTURJRCk7CisKKy8qIFZkZXYgZG93biBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9WREVWX0RPV05fQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfZG93bl9jbWRfZml4ZWRfcGFyYW0sIHdtaV92ZGV2X2Rvd25fY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX0RPV05fQ01ESUQpOworCisvKiBWZGV2IHNldCBwYXJhbSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9WREVWX1NFVF9QQVJBTV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtLCB3bWlfdmRldl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX1NFVF9QQVJBTV9DTURJRCk7CisKKy8qIFBkZXYgc3VzcGVuZCBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1NVU1BFTkRfQ01ESUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc3VzcGVuZF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X3N1c3BlbmRfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QREVWX1NVU1BFTkRfQ01ESUQpOworCisvKiBQZGV2IFJlc3VtZSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1JFU1VNRV9DTURJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3Jlc3VtZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X3Jlc3VtZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfUkVTVU1FX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NDQU5fVVBEQVRFX1JFUVVFU1RfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfV01JX3NjYW5fdXBkYXRlX3JlcXVlc3RfY21kX2ZpeGVkX3BhcmFtLCB3bWlfc2Nhbl91cGRhdGVfcmVxdWVzdF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NDQU5fVVBEQVRFX1JFUVVFU1RfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU0NBTl9QUk9CX1JFUV9PVUlfQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NjYW5fcHJvYl9yZXFfb3VpX2NtZF9maXhlZF9wYXJhbSwgd21pX3NjYW5fcHJvYl9yZXFfb3VpX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU0NBTl9QUk9CX1JFUV9PVUlfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQ0hBVFRFUl9BRERfQ09BTEVTQ0lOR19GSUxURVJfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sV01JVExWX1RBR19TVFJVQ193bWlfY2hhdHRlcl9jb2FsZXNjaW5nX2FkZF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLCB3bWlfY2hhdHRlcl9jb2FsZXNjaW5nX2FkZF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSxXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCBjaGF0dGVyX3BrdF9jb2FsZXNjaW5nX2ZpbHRlciwgY29hbGVzY2luZ19maWx0ZXIsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQ0hBVFRFUl9BRERfQ09BTEVTQ0lOR19GSUxURVJfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQ0hBVFRFUl9ERUxFVEVfQ09BTEVTQ0lOR19GSUxURVJfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYXR0ZXJfY29hbGVzY2luZ19kZWxldGVfZmlsdGVyX2NtZF9maXhlZF9wYXJhbSx3bWlfY2hhdHRlcl9jb2FsZXNjaW5nX2RlbGV0ZV9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0NIQVRURVJfREVMRVRFX0NPQUxFU0NJTkdfRklMVEVSX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0NIQVRURVJfQ09BTEVTQ0lOR19RVUVSWV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfY2hhdHRlcl9jb2FsZXNjaW5nX3F1ZXJ5X2NtZF9maXhlZF9wYXJhbSwgd21pX2NoYXR0ZXJfY29hbGVzY2luZ19xdWVyeV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQ0hBVFRFUl9DT0FMRVNDSU5HX1FVRVJZX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1RYQkZfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sV01JVExWX1RBR19TVFJVQ193bWlfdHhiZl9jbWRfZml4ZWRfcGFyYW0sIHdtaV90eGJmX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9UWEJGX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0RCR0xPR19DRkdfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RlYnVnX2xvZ19jb25maWdfY21kX2ZpeGVkX3BhcmFtLCB3bWlfZGVidWdfbG9nX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRlhBUihpZCxvcCxidWYsbGVuLFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgbW9kdWxlX2lkX2JpdG1hcCwgV01JVExWX1NJWkVfRklYLCBNQVhfTU9EVUxFX0lEX0JJVE1BUF9XT1JEUykgXAorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9EQkdMT0dfQ0ZHX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfV01NX0FERFRTX0NNRElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkgICAgICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfd21tX2FkZHRzX2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfd21tX2FkZHRzX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfVkRFVl9XTU1fQUREVFNfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVkRFVl9XTU1fREVMVFNfQ01ESUQoaWQsb3AsYnVmLGxlbikJCQkJCSAgICAgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl93bW1fZGVsdHNfY21kX2ZpeGVkX3BhcmFtLCB3bWlfdmRldl93bW1fZGVsdHNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX1dNTV9ERUxUU19DTURJRCk7CisKKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9WREVWX1NFVF9XTU1fUEFSQU1TX0NNRElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkgICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc2V0X3dtbV9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLCB3bWlfdmRldl9zZXRfd21tX3BhcmFtc19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1ZERVZfU0VUX1dNTV9QQVJBTVNfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVkRFVl9TRVRfR1RYX1BBUkFNU19DTURJRChpZCxvcCxidWYsbGVuKQkJCQkJICAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF9ndHhfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfc2V0X2d0eF9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX1NFVF9HVFhfUEFSQU1TX0NNRElEKTsKKworLyogVERMUyBFbmFibGUvRGlzYWJsZSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9URExTX1NFVF9TVEFURV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdGRsc19zZXRfc3RhdGVfY21kX2ZpeGVkX3BhcmFtLAlcCisJCSAgICB3bWlfdGRsc19zZXRfc3RhdGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9URExTX1NFVF9TVEFURV9DTURJRCk7CisKKy8qIFRETFMgUGVlciBVcGRhdGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVERMU19QRUVSX1VQREFURV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdGRsc19wZWVyX3VwZGF0ZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV90ZGxzX3BlZXJfdXBkYXRlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3RkbHNfcGVlcl9jYXBhYmlsaXRpZXMsIHdtaV90ZGxzX3BlZXJfY2FwYWJpbGl0aWVzLCBwZWVyX2NhcHMsIFdNSVRMVl9TSVpFX0ZJWCkJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9jaGFubmVsLCBwZWVyX2NoYW5fbGlzdCwgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9URExTX1BFRVJfVVBEQVRFX0NNRElEKTsKKworLyogRW5hYmxlL0Rpc2FibGUgVERMUyBPZmZjaGFubmVsIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1RETFNfU0VUX09GRkNIQU5fTU9ERV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdGRsc19zZXRfb2ZmY2hhbl9tb2RlX2NtZF9maXhlZF9wYXJhbSwgXAorCQkgICAgd21pX3RkbHNfc2V0X29mZmNoYW5fbW9kZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9URExTX1NFVF9PRkZDSEFOX01PREVfQ01ESUQpOworCisvKiBSZXNtZ3IgRW5hYmxlL0Rpc2FibGUgQWRhcHRpdmUgT0NTIENNRCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JFU01HUl9BREFQVElWRV9PQ1NfRU5BQkxFX0RJU0FCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3Jlc21ncl9hZGFwdGl2ZV9vY3NfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtLCBcCisJCSAgICB3bWlfcmVzbWdyX2FkYXB0aXZlX29jc19lbmFibGVfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMKKwkoV01JX1JFU01HUl9BREFQVElWRV9PQ1NfRU5BQkxFX0RJU0FCTEVfQ01ESUQpOworCisvKiBSZXNtZ3IgU2V0IENoYW5uZWwgVGltZSBRdW90YSBDTUQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9SRVNNR1JfU0VUX0NIQU5fVElNRV9RVU9UQV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcmVzbWdyX3NldF9jaGFuX3RpbWVfcXVvdGFfY21kX2ZpeGVkX3BhcmFtLCBcCisJCSAgICB3bWlfcmVzbWdyX3NldF9jaGFuX3RpbWVfcXVvdGFfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGRhdGEsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUkVTTUdSX1NFVF9DSEFOX1RJTUVfUVVPVEFfQ01ESUQpOworCisvKiBSZXNtZ3IgU2V0IENoYW5uZWwgTGF0ZW5jeSBDTUQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9SRVNNR1JfU0VUX0NIQU5fTEFURU5DWV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcmVzbWdyX3NldF9jaGFuX2xhdGVuY3lfY21kX2ZpeGVkX3BhcmFtLCBcCisJCSAgICB3bWlfcmVzbWdyX3NldF9jaGFuX2xhdGVuY3lfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBkYXRhLCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JFU01HUl9TRVRfQ0hBTl9MQVRFTkNZX0NNRElEKTsKKworLyogU1RBIFNNUFMgRm9yY2UgTW9kZSBDTUQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9TVEFfU01QU19GT1JDRV9NT0RFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfc21wc19mb3JjZV9tb2RlX2NtZF9maXhlZF9wYXJhbSwgXAorCQkgICAgd21pX3N0YV9zbXBzX2ZvcmNlX21vZGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TVEFfU01QU19GT1JDRV9NT0RFX0NNRElEKTsKKworLyogd2xhbiBoYiBlbmFibGUvZGlzYWJsZSBDTUQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9IQl9TRVRfRU5BQkxFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9oYl9zZXRfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwgXAorCQkgICAgd21pX2hiX3NldF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9IQl9TRVRfRU5BQkxFX0NNRElEKTsKKworLyogd2xhbiBoYiBzZXQgdGNwIHBhcmFtcyBDTUQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9IQl9TRVRfVENQX1BBUkFNU19DTURJRChpZCxvcCxidWYsbGVuKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfaGJfc2V0X3RjcF9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLCBcCisJCSAgICB3bWlfaGJfc2V0X3RjcF9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9IQl9TRVRfVENQX1BBUkFNU19DTURJRCk7CisKKy8qIHdsYW4gaGIgc2V0IHRjcCBwa3QgZmlsdGVyIENNRCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0hCX1NFVF9UQ1BfUEtUX0ZJTFRFUl9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfaGJfc2V0X3RjcF9wa3RfZmlsdGVyX2NtZF9maXhlZF9wYXJhbSwgXAorCQkgICAgd21pX2hiX3NldF90Y3BfcGt0X2ZpbHRlcl9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0hCX1NFVF9UQ1BfUEtUX0ZJTFRFUl9DTURJRCk7CisKKy8qIHdsYW4gc2V0IHVkcCBwYXJhbXMgQ01EICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfSEJfU0VUX1VEUF9QQVJBTVNfQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2hiX3NldF91ZHBfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSwgXAorCQkgICAgd21pX2hiX3NldF91ZHBfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfSEJfU0VUX1VEUF9QQVJBTVNfQ01ESUQpOworCisvKiB3bGFuIGhiIHNldCB1ZHAgcGt0IGZpbHRlciBDTUQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9IQl9TRVRfVURQX1BLVF9GSUxURVJfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2hiX3NldF91ZHBfcGt0X2ZpbHRlcl9jbWRfZml4ZWRfcGFyYW0sIFwKKwkJICAgIHdtaV9oYl9zZXRfdWRwX3BrdF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9IQl9TRVRfVURQX1BLVF9GSUxURVJfQ01ESUQpOworCisvKiBTVEEgU01QUyBQYXJhbSBDTUQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9TVEFfU01QU19QQVJBTV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfc3RhX3NtcHNfcGFyYW1fY21kX2ZpeGVkX3BhcmFtLAlcCisJCSAgICB3bWlfc3RhX3NtcHNfcGFyYW1fY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TVEFfU01QU19QQVJBTV9DTURJRCk7CisKKy8qIE1DQyBBZGFwdGl2ZSBTY2hlZHVsZXIgVHJhZmZpYyBTdGF0cyAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX01DQ19TQ0hFRF9UUkFGRklDX1NUQVRTX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tY2Nfc2NoZWRfdHJhZmZpY19zdGF0c19jbWRfZml4ZWRfcGFyYW0sIHdtaV9tY2Nfc2NoZWRfdHJhZmZpY19zdGF0c19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfbWNjX3NjaGVkX3N0YV90cmFmZmljX3N0YXRzLCBtY2Nfc2NoZWRfc3RhX3RyYWZmaWNfc3RhdHNfbGlzdCwgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9NQ0NfU0NIRURfVFJBRkZJQ19TVEFUU19DTURJRCk7CisKKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9CQVRDSF9TQ0FOX0VOQUJMRV9DTURJRChpZCxvcCxidWYsbGVuKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfYmF0Y2hfc2Nhbl9lbmFibGVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfYmF0Y2hfc2Nhbl9lbmFibGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9CQVRDSF9TQ0FOX0VOQUJMRV9DTURJRCk7CisKKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QRUVSX0lORk9fUkVRX0NNRElEKGlkLG9wLGJ1ZixsZW4pICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfaW5mb19yZXFfY21kX2ZpeGVkX3BhcmFtLCBcCisJCSAgICB3bWlfcGVlcl9pbmZvX3JlcV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BFRVJfSU5GT19SRVFfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUk1DX1NFVF9NT0RFX0NNRElEKGlkLG9wLGJ1ZixsZW4pICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JtY19zZXRfbW9kZV9jbWRfZml4ZWRfcGFyYW0sIFwKKwkJICAgIHdtaV9ybWNfc2V0X21vZGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9STUNfU0VUX01PREVfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUk1DX1NFVF9BQ1RJT05fUEVSSU9EX0NNRElEKGlkLG9wLGJ1ZixsZW4pICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JtY19zZXRfYWN0aW9uX3BlcmlvZF9jbWRfZml4ZWRfcGFyYW0sIFwKKwkJICAgIHdtaV9ybWNfc2V0X2FjdGlvbl9wZXJpb2RfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9STUNfU0VUX0FDVElPTl9QRVJJT0RfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUk1DX0NPTkZJR19DTURJRChpZCxvcCxidWYsbGVuKSAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ybWNfY29uZmlnX2NtZF9maXhlZF9wYXJhbSwgXAorCQkgICAgd21pX3JtY19jb25maWdfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9STUNfQ09ORklHX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX01IRl9PRkZMT0FEX1NFVF9NT0RFX0NNRElEKGlkLG9wLGJ1ZixsZW4pICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX21oZl9vZmZsb2FkX3NldF9tb2RlX2NtZF9maXhlZF9wYXJhbSwgXAorCQkgICAgd21pX21oZl9vZmZsb2FkX3NldF9tb2RlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTUhGX09GRkxPQURfU0VUX01PREVfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTUhGX09GRkxPQURfUExVTUJfUk9VVElOR19UQkxfQ01ESUQoaWQsb3AsYnVmLGxlbikgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfbWhmX29mZmxvYWRfcGx1bWJfcm91dGluZ190YWJsZV9jbWRfZml4ZWRfcGFyYW0sIFwKKwkJICAgIHdtaV9taGZfb2ZmbG9hZF9wbHVtYl9yb3V0aW5nX3RhYmxlX2NtZCwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9taGZfb2ZmbG9hZF9yb3V0aW5nX3RhYmxlX2VudHJ5LAlcCisJCSAgICByb3V0aW5nX3RibF9lbnRyaWVzLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9NSEZfT0ZGTE9BRF9QTFVNQl9ST1VUSU5HX1RCTF9DTURJRCkKKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9CQVRDSF9TQ0FOX0RJU0FCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2JhdGNoX3NjYW5fZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9iYXRjaF9zY2FuX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQkFUQ0hfU0NBTl9ESVNBQkxFX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0JBVENIX1NDQU5fVFJJR0dFUl9SRVNVTFRfQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2JhdGNoX3NjYW5fdHJpZ2dlcl9yZXN1bHRfY21kX2ZpeGVkX3BhcmFtLCB3bWlfYmF0Y2hfc2Nhbl90cmlnZ2VyX3Jlc3VsdF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0JBVENIX1NDQU5fVFJJR0dFUl9SRVNVTFRfQ01ESUQpOworCisvKiBMUEkgbWdtdCBzbm9vcGluZyBjb25maWcgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTFBJX01HTVRfU05PT1BJTkdfQ09ORklHX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9scGlfbWdtdF9zbm9vcGluZ19jb25maWdfY21kX2ZpeGVkX3BhcmFtLCB3bWlfbHBpX21nbXRfc25vb3BpbmdfY29uZmlnX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTFBJX01HTVRfU05PT1BJTkdfQ09ORklHX0NNRElEKTsKKworLyogTFBJIHN0YXJ0IHNjYW4gQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTFBJX1NUQVJUX1NDQU5fQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2xwaV9zdGFydF9zY2FuX2NtZF9maXhlZF9wYXJhbSwgd21pX2xwaV9zdGFydF9zY2FuX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgY2hhbm5lbF9saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0ZJWEVEX1NUUlVDLCB3bWlfc3NpZCwgc3NpZF9saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0ZJWEVEX1NUUlVDLCB3bWlfbWFjX2FkZHIsIGJzc2lkX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgaWVfZGF0YSwgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9MUElfU1RBUlRfU0NBTl9DTURJRCk7CisKKy8qIExQSSBzdG9wIHNjYW4gQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTFBJX1NUT1BfU0NBTl9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfbHBpX3N0b3Bfc2Nhbl9jbWRfZml4ZWRfcGFyYW0sIHdtaV9scGlfc3RvcF9zY2FuX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTFBJX1NUT1BfU0NBTl9DTURJRCk7CisKKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9MUElfUkVTVUxUX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2xwaV9yZXN1bHRfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9scGlfcmVzdWx0X2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBkYXRhLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9MUElfUkVTVUxUX0VWRU5USUQpOworCisvKiBMUEkgU3RhdHVzIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTFBJX1NUQVRVU19FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9scGlfc3RhdHVzX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfbHBpX3N0YXR1c19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0xQSV9TVEFUVVNfRVZFTlRJRCk7CisKKy8qIExQSSBIYW5kb2ZmIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTFBJX0hBTkRPRkZfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfbHBpX2hhbmRvZmZfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9scGlfaGFuZG9mZl9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0xQSV9IQU5ET0ZGX0VWRU5USUQpOworCisvKiBUaGVybWFsIE1hbmFnZXIgUGFyYW1zKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9USEVSTUFMX01HTVRfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3RoZXJtYWxfbWdtdF9jbWRfZml4ZWRfcGFyYW0sIHdtaV90aGVybWFsX21nbXRfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9USEVSTUFMX01HTVRfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQUREX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfV01JX0FERF9QUk9BQ1RJVkVfQVJQX1JTUF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwgV01JX0FERF9QUk9BQ1RJVkVfQVJQX1JTUF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgcGF0dGVybiwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQUREX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfREVMX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfV01JX0RFTF9QUk9BQ1RJVkVfQVJQX1JTUF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwgV01JX0RFTF9QUk9BQ1RJVkVfQVJQX1JTUF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0RFTF9QUk9BQ1RJVkVfQVJQX1JTUF9QQVRURVJOX0NNRElEKTsKKworLyogTmFOIFJlcXVlc3QgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9OQU5fQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX25hbl9jbWRfcGFyYW0sIHdtaV9uYW5fY21kX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBkYXRhLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9OQU5fQ01ESUQpOworCisvKiBNb2RlbSBwb3dlciBzdGF0ZSBjbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9NT0RFTV9QT1dFUl9TVEFURV9DTURJRChpZCxvcCxidWYsbGVuKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfbW9kZW1fcG93ZXJfc3RhdGVfY21kX3BhcmFtLCB3bWlfbW9kZW1fcG93ZXJfc3RhdGVfY21kX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTU9ERU1fUE9XRVJfU1RBVEVfQ01ESUQpOworCisvKiBnZXQgZXN0aW1hdGVkIGxpbmsgc3BlZWQgY21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUEVFUl9HRVRfRVNUSU1BVEVEX0xJTktTUEVFRF9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9nZXRfZXN0aW1hdGVkX2xpbmtzcGVlZF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZWVyX2dldF9lc3RpbWF0ZWRfbGlua3NwZWVkX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BFRVJfR0VUX0VTVElNQVRFRF9MSU5LU1BFRURfQ01ESUQpOworCisvKiBleHQgc3RhdHMgUmVxdWVzdCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JFUVVFU1RfU1RBVFNfRVhUX0NNRElEKGlkLG9wLGJ1ZixsZW4pCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZXFfc3RhdHNfZXh0X2NtZF9maXhlZF9wYXJhbSwgd21pX3JlcV9zdGF0c19leHRfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBkYXRhLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9SRVFVRVNUX1NUQVRTX0VYVF9DTURJRCk7CisKKy8qIDIuNEdoeiBIVDQwIE9CU1Mgc2NhbiBlbmFibGUgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PQlNTX1NDQU5fRU5BQkxFX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vYnNzX3NjYW5fZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwgd21pX29ic3Nfc2Nhbl9lbmFibGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBjaGFubmVscywgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBpZV9maWVsZCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0JTU19TQ0FOX0VOQUJMRV9DTURJRCk7CisKKy8qIDIuNEdoeiBIVDQwIE9CU1Mgc2NhbiBkaXNhYmxlICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfT0JTU19TQ0FOX0RJU0FCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX29ic3Nfc2Nhbl9kaXNhYmxlX2NtZF9maXhlZF9wYXJhbSwgd21pX29ic3Nfc2Nhbl9kaXNhYmxlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX09CU1NfU0NBTl9ESVNBQkxFX0NNRElEKTsKKworLyogUGRldiBTZXQgTEVEIENvbmZpZyBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1NFVF9MRURfQ09ORklHX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF9sZWRfY29uZmlnX2NtZF9maXhlZF9wYXJhbSwgd21pX3BkZXZfc2V0X2xlZF9jb25maWdfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUERFVl9TRVRfTEVEX0NPTkZJR19DTURJRCk7CisKKy8qIGhvc3QgYXV0byBzaHV0IGRvd24gY29uZmlnIGNtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0hPU1RfQVVUT19TSFVURE9XTl9DRkdfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2hvc3RfYXV0b19zaHV0ZG93bl9jZmdfY21kX2ZpeGVkX3BhcmFtLCB3bWlfaG9zdF9hdXRvX3NodXRkb3duX2NmZ19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9IT1NUX0FVVE9fU0hVVERPV05fQ0ZHX0NNRElEKTsKKworLyogdHBjIGNoYWlubWFzayBjb25maWcgY21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3RwY19jaGFpbm1hc2tfY29uZmlnX2NtZF9maXhlZF9wYXJhbSwgd21pX3RwY19jaGFpbm1hc2tfY29uZmlnX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfdHBjX2NoYWlubWFza19jb25maWcsIGNvbmZpZ19saXN0LCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19DTURJRCk7CisKKy8qIENoIGF2b2lkYW5jZSB1cGRhdGUgY21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQ0hBTl9BVk9JRF9VUERBVEVfQ01ESUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYW5fYXZvaWRfdXBkYXRlX2NtZF9wYXJhbSwgd21pX2NoYW5fYXZvaWRfdXBkYXRlX2NtZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0NIQU5fQVZPSURfVVBEQVRFX0NNRElEKTsKKworLyogRDAtV09XIEVuYWJsZSBEaXNhYmxlIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0QwX1dPV19FTkFCTEVfRElTQUJMRV9DTURJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkgICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2QwX3dvd19lbmFibGVfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9kMF93b3dfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRDBfV09XX0VOQUJMRV9ESVNBQkxFX0NNRElEKTsKKworLyogUGRldiBnZXQgY2hpcCB0ZW1wZXJhdHVyZSBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX0dFVF9URU1QRVJBVFVSRV9DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9nZXRfdGVtcGVyYXR1cmVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcGRldl9nZXRfdGVtcGVyYXR1cmVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUERFVl9HRVRfVEVNUEVSQVRVUkVfQ01ESUQpOworCisvKiBTZXQgYW50ZW5uYSBkaXZlcnNpdHkgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU0VUX0FOVEVOTkFfRElWRVJTSVRZX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF9hbnRlbm5hX2RpdmVyc2l0eV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X3NldF9hbnRlbm5hX2RpdmVyc2l0eV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TRVRfQU5URU5OQV9ESVZFUlNJVFlfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTFJPX0NPTkZJR19DTURJRChpZCwgb3AsIGJ1ZiwgbGVuKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfbHJvX2luZm9fY21kX2ZpeGVkX3BhcmFtLCB3bWlfbHJvX2luZm9fY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTFJPX0NPTkZJR19DTURJRCk7CisKKworLyogTUFXQyBzZW5zb3IgcmVwb3J0IGluZGljYXRpb24gY21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTUFXQ19TRU5TT1JfUkVQT1JUX0lORF9DTURJRChpZCwgb3AsIGJ1ZiwgbGVuKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfbWF3Y19zZW5zb3JfcmVwb3J0X2luZF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9tYXdjX3NlbnNvcl9yZXBvcnRfaW5kX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX01BV0NfU0VOU09SX1JFUE9SVF9JTkRfQ01ESUQpOworCisvKiBSb2FtIGNvbmZpZ3VyZSBNQVdDIGNtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JPQU1fQ09ORklHVVJFX01BV0NfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fY29uZmlndXJlX21hd2NfY21kX2ZpeGVkX3BhcmFtLCB3bWlfcm9hbV9jb25maWd1cmVfbWF3Y19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9ST0FNX0NPTkZJR1VSRV9NQVdDX0NNRElEKTsKKworLyogTkxPIGNvbmZpZ3VyZSBNQVdDIGNtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX05MT19DT05GSUdVUkVfTUFXQ19DTURJRChpZCwgb3AsIGJ1ZiwgbGVuKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfbmxvX2NvbmZpZ3VyZV9tYXdjX2NtZF9maXhlZF9wYXJhbSwgd21pX25sb19jb25maWd1cmVfbWF3Y19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9OTE9fQ09ORklHVVJFX01BV0NfQ01ESUQpOworCisvKiBFeHRzY2FuIGNvbmZpZ3VyZSBNQVdDIGNtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0VYVFNDQU5fQ09ORklHVVJFX01BV0NfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY29uZmlndXJlX21hd2NfY21kX2ZpeGVkX3BhcmFtLCB3bWlfZXh0c2Nhbl9jb25maWd1cmVfbWF3Y19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9FWFRTQ0FOX0NPTkZJR1VSRV9NQVdDX0NNRElEKTsKKworLyogU2V0IHJzc2kgbW9uaXRvcmluZyBjb25maWcgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUlNTSV9CUkVBQ0hfTU9OSVRPUl9DT05GSUdfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3Jzc2lfYnJlYWNoX21vbml0b3JfY29uZmlnX2ZpeGVkX3BhcmFtLCB3bWlfcnNzaV9icmVhY2hfbW9uaXRvcl9jb25maWdfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9SU1NJX0JSRUFDSF9NT05JVE9SX0NPTkZJR19DTURJRCk7CisKKy8qIERIQ1Agc2VydmVyIG9mZmxvYWQgcGFyYW0gQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU0VUX0RIQ1BfU0VSVkVSX09GRkxPQURfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NldF9kaGNwX3NlcnZlcl9vZmZsb2FkX2NtZF9maXhlZF9wYXJhbSwgd21pX3NldF9kaGNwX3NlcnZlcl9vZmZsb2FkX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NFVF9ESENQX1NFUlZFUl9PRkZMT0FEX0NNRElEKTsKKworLyogSVBBIE9mZmxvYWQgRW5hYmxlIERpc2FibGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfSVBBX09GRkxPQURfRU5BQkxFX0RJU0FCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDVF93bWlfaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfSVBBX09GRkxPQURfRU5BQkxFX0RJU0FCTEVfQ01ESUQpOworCisvKiBTZXQgTEVEIGZsYXNoaW5nIHBhcmFtZXRlciBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1NFVF9MRURfRkxBU0hJTkdfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NldF9sZWRfZmxhc2hpbmdfY21kX2ZpeGVkX3BhcmFtLCB3bWlfc2V0X2xlZF9mbGFzaGluZ19jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QREVWX1NFVF9MRURfRkxBU0hJTkdfQ01ESUQpOworCisvKiBtRE5TIHJlc3BvbmRlciBvZmZsb2FkIHBhcmFtIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX01ETlNfT0ZGTE9BRF9FTkFCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX21kbnNfb2ZmbG9hZF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9tZG5zX29mZmxvYWRfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTUROU19PRkZMT0FEX0VOQUJMRV9DTURJRCk7CisKKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9NRE5TX1NFVF9GUUROX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZG5zX3NldF9mcWRuX2NtZF9maXhlZF9wYXJhbSwgd21pX21kbnNfc2V0X2ZxZG5fY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBmcWRuX2RhdGEsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX01ETlNfU0VUX0ZRRE5fQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTUROU19TRVRfUkVTUE9OU0VfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX21kbnNfc2V0X3Jlc3BfY21kX2ZpeGVkX3BhcmFtLCB3bWlfbWRuc19zZXRfcmVzcF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIHJlc3BfZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTUROU19TRVRfUkVTUE9OU0VfQ01ESUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTUROU19HRVRfU1RBVFNfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX21kbnNfZ2V0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSwgd21pX21kbnNfZ2V0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX01ETlNfR0VUX1NUQVRTX0NNRElEKTsKKworLyogcm9hbSBpbnZva2UgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUk9BTV9JTlZPS0VfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1faW52b2tlX2NtZF9maXhlZF9wYXJhbSwgd21pX3JvYW1faW52b2tlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgY2hhbm5lbF9saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0ZJWEVEX1NUUlVDLCB3bWlfbWFjX2FkZHIsIGJzc2lkX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JPQU1fSU5WT0tFX0NNRElEKTsKKworLyogU0FQIEF1dGhlbnRpY2F0aW9uIG9mZmxvYWQgcGFyYW0gQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU0FQX09GTF9FTkFCTEVfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NhcF9vZmxfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwgd21pX3NhcF9vZmxfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgcHNrLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TQVBfT0ZMX0VOQUJMRV9DTURJRCk7CisKKy8qIFNBUCBzZXQgYmxhY2tsaXN0IHBhcmFtIGNtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NBUF9TRVRfQkxBQ0tMSVNUX1BBUkFNX0NNRElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKKyAgICBXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zYXBfc2V0X2JsYWNrbGlzdF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sIHdtaV9zYXBfc2V0X2JsYWNrbGlzdF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TQVBfU0VUX0JMQUNLTElTVF9QQVJBTV9DTURJRCk7CisKKy8qIEFQRklORCBSZXF1ZXN0ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQVBGSU5EX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hcGZpbmRfY21kX3BhcmFtLCB3bWlfYXBmaW5kX2NtZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQVBGSU5EX0NNRElEKTsKKworLyogU2V0IE9DQiBzY2hlZHVsZSBjbWQsIERFUFJFQ0FURUQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PQ0JfU0VUX1NDSEVEX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc2V0X3NjaGVkX2NtZF9maXhlZF9wYXJhbSwgd21pX29jYl9zZXRfc2NoZWRfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0NCX1NFVF9TQ0hFRF9DTURJRCk7CisKKy8qIFNldCBPQ0IgY29uZmlndXJhdGlvbiBjbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PQ0JfU0VUX0NPTkZJR19DTURJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfb2NiX3NldF9jb25maWdfY21kX2ZpeGVkX3BhcmFtLCB3bWlfb2NiX3NldF9jb25maWdfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX2NoYW5uZWwsIGNoYW5fbGlzdCwgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX29jYl9jaGFubmVsLCBvY2JfY2hhbl9saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfcW9zX3BhcmFtZXRlciwgcW9zX3BhcmFtZXRlcl9saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZGNjX25kbF9jaGFuLCBjaGFuX2NmZywgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX2RjY19uZGxfYWN0aXZlX3N0YXRlX2NvbmZpZywgbmRsX2FjdGl2ZV9zdGF0ZV9jb25maWdfbGlzdCwgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX29jYl9zY2hlZHVsZV9lbGVtZW50LCBzY2hlZHVsZV9saXN0LCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9PQ0JfU0VUX0NPTkZJR19DTURJRCk7CisKKy8qIFNldCBVVEMgdGltZSBjbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PQ0JfU0VUX1VUQ19USU1FX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc2V0X3V0Y190aW1lX2NtZF9maXhlZF9wYXJhbSwgd21pX29jYl9zZXRfdXRjX3RpbWVfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0NCX1NFVF9VVENfVElNRV9DTURJRCk7CisKKy8qIFN0YXJ0IHRpbWluZyBhZHZlcnRpc2VtZW50IGNtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX09DQl9TVEFSVF9USU1JTkdfQURWRVJUX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW0sIHdtaV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGJ1ZnAsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX09DQl9TVEFSVF9USU1JTkdfQURWRVJUX0NNRElEKTsKKworLyogU3RvcCB0aW1pbmcgYWR2ZXJ0aXNlbWVudCBjbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PQ0JfU1RPUF9USU1JTkdfQURWRVJUX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc3RvcF90aW1pbmdfYWR2ZXJ0X2NtZF9maXhlZF9wYXJhbSwgd21pX29jYl9zdG9wX3RpbWluZ19hZHZlcnRfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9DTURJRCk7CisKKy8qIEdldCBUU0YgdGltZXIgY21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfT0NCX0dFVF9UU0ZfVElNRVJfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9nZXRfdHNmX3RpbWVyX2NtZF9maXhlZF9wYXJhbSwgd21pX29jYl9nZXRfdHNmX3RpbWVyX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX09DQl9HRVRfVFNGX1RJTUVSX0NNRElEKTsKKworLyogR2V0IERDQyBzdGF0cyBjbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9EQ0NfR0VUX1NUQVRTX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfZ2V0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSwgd21pX2RjY19nZXRfc3RhdHNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX2RjY19jaGFubmVsX3N0YXRzX3JlcXVlc3QsIGNoYW5uZWxfc3RhdHNfcmVxdWVzdCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRENDX0dFVF9TVEFUU19DTURJRCk7CisKKy8qIENsZWFyIERDQyBzdGF0cyBjbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9EQ0NfQ0xFQVJfU1RBVFNfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RjY19jbGVhcl9zdGF0c19jbWRfZml4ZWRfcGFyYW0sIHdtaV9kY2NfY2xlYXJfc3RhdHNfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRENDX0NMRUFSX1NUQVRTX0NNRElEKTsKKworLyogVXBkYXRlIERDQyBOREwgY21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRENDX1VQREFURV9ORExfQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RjY191cGRhdGVfbmRsX2NtZF9maXhlZF9wYXJhbSwgd21pX2RjY191cGRhdGVfbmRsX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9kY2NfbmRsX2NoYW4sIGNoYW5fbmRsX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9jb25maWcsIG5kbF9hY3RpdmVfc3RhdGVfY29uZmlnX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0RDQ19VUERBVEVfTkRMX0NNRElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JPQU1fRklMVEVSX0NNRElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX2ZpbHRlcl9maXhlZF9wYXJhbSwgd21pX3JvYW1fZmlsdGVyX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9GSVhFRF9TVFJVQywgd21pX21hY19hZGRyLCBic3NpZF9ibGFja19saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0ZJWEVEX1NUUlVDLCB3bWlfc3NpZCwgc3NpZF93aGl0ZV9saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0ZJWEVEX1NUUlVDLCB3bWlfbWFjX2FkZHIsIGJzc2lkX3ByZWZlcnJlZF9saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1VJTlQzMiwgQV9VSU5UMzIsIGJzc2lkX3ByZWZlcnJlZF9mYWN0b3IsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JPQU1fRklMVEVSX0NNRElEKTsKKy8qIFRTRiB0aW1lc3RhbXAgYWN0aW9uIGNtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfVFNGX1RTVEFNUF9BQ1RJT05fQ01ESUQoaWQsb3AsYnVmLGxlbikgXAorICAgIFdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfdHNmX3RzdGFtcF9hY3Rpb25fY21kX2ZpeGVkX3BhcmFtLCB3bWlfdmRldl90c2ZfdHN0YW1wX2FjdGlvbl9jbWRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX1RTRl9UU1RBTVBfQUNUSU9OX0NNRElEKTsKKworLyogTEZSIHN1Ym5ldCBjaGFuZ2UgY29uZmlnIENtZCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JPQU1fU1VCTkVUX0NIQU5HRV9DT05GSUdfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorICAgIFdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fc3VibmV0X2NoYW5nZV9jb25maWdfZml4ZWRfcGFyYW0sIHdtaV9yb2FtX3N1Ym5ldF9jaGFuZ2VfY29uZmlnX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisgICAgV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19BUlJBWV9GSVhFRF9TVFJVQywgd21pX21hY19hZGRyLCBza2lwX3N1Ym5ldF9jaGFuZ2VfZGV0ZWN0aW9uX2Jzc2lkX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUk9BTV9TVUJORVRfQ0hBTkdFX0NPTkZJR19DTURJRCk7CisKKy8qIFNldCB0aGUgU09DIFByZWZlcnJlZCBDaGFubmVsIExpc3QgKFBDTCkgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU09DX1NFVF9QQ0xfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorICAgIFdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfcGNsX2NtZF9maXhlZF9wYXJhbSwgd21pX3NvY19zZXRfcGNsX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorICAgIFdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgY2hhbm5lbF9saXN0LCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TT0NfU0VUX1BDTF9DTURJRCk7CisKKy8qIFNldCB0aGUgU09DIEhhcmR3YXJlIE1vZGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU09DX1NFVF9IV19NT0RFX0NNRElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKKyAgICBXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zb2Nfc2V0X2h3X21vZGVfY21kX2ZpeGVkX3BhcmFtLCB3bWlfc29jX3NldF9od19tb2RlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NPQ19TRVRfSFdfTU9ERV9DTURJRCk7CisKKy8qIFNldCB0aGUgU09DIER1YWwgTUFDIENvbmZpZyBDbWQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9TT0NfU0VUX0RVQUxfTUFDX0NPTkZJR19DTURJRChpZCwgb3AsIGJ1ZiwgbGVuKSBcCisgICAgV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfc29jX3NldF9kdWFsX21hY19jb25maWdfY21kX2ZpeGVkX3BhcmFtLCB3bWlfc29jX3NldF9kdWFsX21hY19jb25maWdfY21kX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU09DX1NFVF9EVUFMX01BQ19DT05GSUdfQ01ESUQpOworCisvKiBTZXQgdGhlIFNPQyBBbnRlbm5hIE1vZGUgQ21kICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU09DX1NFVF9BTlRFTk5BX01PREVfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorICAgIFdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfYW50ZW5uYV9tb2RlX2NtZF9maXhlZF9wYXJhbSwgd21pX3NvY19zZXRfYW50ZW5uYV9tb2RlX2NtZF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NPQ19TRVRfQU5URU5OQV9NT0RFX0NNRElEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFRMViBkZWZpbml0aW9ucyBvZiBXTUkgZXZlbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNlcnZpY2UgUmVhZHkgZXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9TRVJWSUNFX1JFQURZX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJCQkJCQkgICAgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfc2VydmljZV9yZWFkeV9ldmVudF9maXhlZF9wYXJhbSwgd21pX3NlcnZpY2VfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX0hBTF9SRUdfQ0FQQUJJTElUSUVTLCBIQUxfUkVHX0NBUEFCSUxJVElFUywgaGFsX3JlZ19jYXBhYmlsaXRpZXMsIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9GWEFSKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgd21pX3NlcnZpY2VfYml0bWFwLCBXTUlUTFZfU0laRV9GSVgsIFdNSV9TRVJWSUNFX0JNX1NJWkUpCVwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bGFuX2hvc3RfbWVtX3JlcSwgbWVtX3JlcXMsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgd2xhbl9kYnNfaHdfbW9kZV9saXN0LCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TRVJWSUNFX1JFQURZX0VWRU5USUQpOworCisvKiBTZXJ2aWNlIFJlYWR5IEV4dGVuc2lvbiBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NFUlZJQ0VfUkVBRFlfRVhUX0VWRU5USUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NlcnZpY2VfcmVhZHlfZXh0X2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfc2VydmljZV9yZWFkeV9leHRfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9TRVJWSUNFX1JFQURZX0VYVF9FVkVOVElEKTsKKworLyogUmVhZHkgZXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9SRUFEWV9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkJCQkJCQkJICAgICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JlYWR5X2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9SRUFEWV9FVkVOVElEKTsKKworLyogU2NhbiBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NDQU5fRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkJCQkJCSAgICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NjYW5fZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9zY2FuX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU0NBTl9FVkVOVElEKTsKKworLyogRXh0U2NhbiBTdGFydC9TdG9wIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRVhUU0NBTl9TVEFSVF9TVE9QX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJCQkJCQkgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9zdGFydF9zdG9wX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfZXh0c2Nhbl9zdGFydF9zdG9wX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9FWFRTQ0FOX1NUQVJUX1NUT1BfRVZFTlRJRCk7CisKKy8qIEV4dFNjYW4gRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9FWFRTQ0FOX09QRVJBVElPTl9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkJCQkJCQkJICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9vcGVyYXRpb25fZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9leHRzY2FuX29wZXJhdGlvbl9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgYnVja2V0X2lkLCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0VYVFNDQU5fT1BFUkFUSU9OX0VWRU5USUQpOworCisvKiBFeHRTY2FuIFRhYmxlIFVzYWdlIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRVhUU0NBTl9UQUJMRV9VU0FHRV9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkJCQkJCQkJICAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3RhYmxlX3VzYWdlX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfZXh0c2Nhbl90YWJsZV91c2FnZV9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRVhUU0NBTl9UQUJMRV9VU0FHRV9FVkVOVElEKTsKKworLyogRXh0U2NhbiBSZXN1bHQgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9FWFRTQ0FOX0NBQ0hFRF9SRVNVTFRTX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJCQkJCQkgICAgICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY2FjaGVkX3Jlc3VsdHNfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX2V4dHNjYW5fd2xhbl9kZXNjcmlwdG9yLCBic3NpZF9saXN0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl9yc3NpX2luZm8sIHJzc2lfbGlzdCwgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBpZV9saXN0LCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0VYVFNDQU5fQ0FDSEVEX1JFU1VMVFNfRVZFTlRJRCk7CisKKy8qIEV4dFNjYW4gTW9uaXRvciBSU1NJIExpc3QgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9FWFRTQ0FOX1dMQU5fQ0hBTkdFX1JFU1VMVFNfRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkJCQkJCSAgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9yZXN1bHRzX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9yZXN1bHRzX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfcmVzdWx0X2Jzc2lkLCBic3NpZF9zaWduYWxfZGVzY3JpcHRvcl9saXN0LCBXTUlUTFZfU0laRV9WQVIpCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIHJzc2lfbGlzdCwgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9FWFRTQ0FOX1dMQU5fQ0hBTkdFX1JFU1VMVFNfRVZFTlRJRCk7CisKKy8qIEV4dFNjYW4gSG90IExpc3QgTWF0Y2ggRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9FWFRTQ0FOX0hPVExJU1RfTUFUQ0hfRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkJCQkJCSAgICAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2hvdGxpc3RfbWF0Y2hfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9leHRzY2FuX2hvdGxpc3RfbWF0Y2hfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl93bGFuX2Rlc2NyaXB0b3IsIGhvdGxpc3RfbWF0Y2gsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRVhUU0NBTl9IT1RMSVNUX01BVENIX0VWRU5USUQpOworCisvKiBFeHRTY2FuIEhvdCBMaXN0IE1hdGNoIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRVhUU0NBTl9DQVBBQklMSVRJRVNfRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkJCQkJCSAgICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY2FwYWJpbGl0aWVzX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfZXh0c2Nhbl9jYXBhYmlsaXRpZXNfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl9jYWNoZV9jYXBhYmlsaXRpZXMsIGV4dHNjYW5fY2FjaGVfY2FwYWJpbGl0aWVzLCBXTUlUTFZfU0laRV9WQVIpCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9tb25pdG9yX2NhcGFiaWxpdGllcywgd2xhbl9jaGFuZ2VfY2FwYWJpbGl0aWVzLCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl9ob3RsaXN0X21vbml0b3JfY2FwYWJpbGl0aWVzLCBob3RsaXN0X2NhcGFiaWxpdGllcywgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9FWFRTQ0FOX0NBUEFCSUxJVElFU19FVkVOVElEKTsKKworLyogRXh0U2NhbiBIb3QgTGlzdCBNYXRjaCBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0VYVFNDQU5fSE9UTElTVF9TU0lEX01BVENIX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5faG90bGlzdF9zc2lkX21hdGNoX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfZXh0c2Nhbl9ob3RsaXN0X3NzaWRfbWF0Y2hfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZXh0c2Nhbl93bGFuX2Rlc2NyaXB0b3IsIGhvdGxpc3Rfc3NpZF9tYXRjaCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRVhUU0NBTl9IT1RMSVNUX1NTSURfTUFUQ0hfRVZFTlRJRCk7CisKKy8qIFVwZGF0ZV93aGFsX21pYl9zdGF0cyBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1VQREFURV9XSEFMX01JQl9TVEFUU19FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkJCQkJCQkJICAgICAgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3VwZGF0ZV93aGFsX21pYl9zdGF0c19ldmVudF9maXhlZF9wYXJhbSwgd21pX3VwZGF0ZV93aGFsX21pYl9zdGF0c19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1VQREFURV9XSEFMX01JQl9TVEFUU19FVkVOVElEKTsKKworLyogUERFViBUUEMgQ29uZmlnIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUERFVl9UUENfQ09ORklHX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJCQkJCQkJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfdHBjX2NvbmZpZ19ldmVudF9maXhlZF9wYXJhbSwgd21pX3BkZXZfdHBjX2NvbmZpZ19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgcmF0ZXNBcnJheSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUERFVl9UUENfQ09ORklHX0VWRU5USUQpOworCisvKiBDaGFubmVsIEluZm8gRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9DSEFOX0lORk9fRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkJCQkJCSAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYW5faW5mb19ldmVudF9maXhlZF9wYXJhbSwgd21pX2NoYW5faW5mb19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0NIQU5fSU5GT19FVkVOVElEKTsKKworLyogUGh5IEVycm9yIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUEhZRVJSX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJCQkJCQkgICAgICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NvbWJfcGh5ZXJyX3J4X2hkciwgd21pX2NvbWJfcGh5ZXJyX3J4X2hkciwgaGRyLCBXTUlUTFZfU0laRV9GSVgpICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgYnVmcCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUEhZRVJSX0VWRU5USUQpOworCisvKiBUWCBQYXVzZS9VbnBhdXNlIGV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVFhfUEFVU0VfRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkJCQkJCSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdHhfcGF1c2VfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV90eF9wYXVzZV9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1RYX1BBVVNFX0VWRU5USUQpOworCisvKiBNZ210IFRYIGNvbXBsZXRpb24gZXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9NR01UX1RYX0NPTVBMRVRJT05fRVZFTlRJRChpZCwgb3AsIGJ1ZiwgbGVuKQlcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfbWdtdF90eF9jb21wbF9ldmVudF9maXhlZF9wYXJhbSwgd21pX21nbXRfdHhfY29tcGxfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9NR01UX1RYX0NPTVBMRVRJT05fRVZFTlRJRCk7CisKKy8qIFZERVYgU3RhcnQgcmVzcG9uc2UgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9WREVWX1NUQVJUX1JFU1BfRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc3RhcnRfcmVzcG9uc2VfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV92ZGV2X3N0YXJ0X3Jlc3BvbnNlX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfVkRFVl9TVEFSVF9SRVNQX0VWRU5USUQpOworCisvKiBWREVWIFN0b3BwZWQgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9WREVWX1NUT1BQRURfRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkgICAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3N0b3BwZWRfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV92ZGV2X3N0b3BwZWRfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX1NUT1BQRURfRVZFTlRJRCk7CisKKy8qIFZERVYgSW5zdGFsbCBLZXkgQ29tcGxldGUgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9WREVWX0lOU1RBTExfS0VZX0NPTVBMRVRFX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCSAgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9pbnN0YWxsX2tleV9jb21wbGV0ZV9ldmVudF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfaW5zdGFsbF9rZXlfY29tcGxldGVfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX0lOU1RBTExfS0VZX0NPTVBMRVRFX0VWRU5USUQpOworCisvKiBQZWVyIFNUQSBLaWNrb3V0IEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUEVFUl9TVEFfS0lDS09VVF9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkJCSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9zdGFfa2lja291dF9ldmVudF9maXhlZF9wYXJhbSwgd21pX3BlZXJfc3RhX2tpY2tvdXRfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX1NUQV9LSUNLT1VUX0VWRU5USUQpOworCisvKiBNYW5hZ2VtZW50IFJ4IEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTUdNVF9SWF9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkJCQkJCQkJCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZ210X3J4X2hkciwgd21pX21nbXRfcnhfaGRyLCBoZHIsIFdNSVRMVl9TSVpFX0ZJWCkgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBidWZwLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9NR01UX1JYX0VWRU5USUQpOworCisvKiBUQlRUIG9mZnNldCBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1RCVFRPRkZTRVRfVVBEQVRFX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdGJ0dF9vZmZzZXRfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV90YnR0X29mZnNldF9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkJXAorCVdNSVRMVl9GWEFSKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgdGJ0dG9mZnNldF9saXN0LCBXTUlUTFZfU0laRV9GSVgsIFdNSV9NQVhfQVBfVkRFVikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1RCVFRPRkZTRVRfVVBEQVRFX0VWRU5USUQpOworCisvKiBUWCBERUxCQSBDb21wbGV0ZSBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1RYX0RFTEJBX0NPTVBMRVRFX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCSAgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdHhfZGVsYmFfY29tcGxldGVfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV90eF9kZWxiYV9jb21wbGV0ZV9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1RYX0RFTEJBX0NPTVBMRVRFX0VWRU5USUQpOworCisvKiBUeCBBRERCQSBDb21wbGV0ZSBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1RYX0FEREJBX0NPTVBMRVRFX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV90eF9hZGRiYV9jb21wbGV0ZV9ldmVudF9maXhlZF9wYXJhbSwgd21pX3R4X2FkZGJhX2NvbXBsZXRlX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfVFhfQUREQkFfQ09NUExFVEVfRVZFTlRJRCk7CisKKy8qIEFERCBCQSBSZXEgc3NuIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQkFfUlNQX1NTTl9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2JhX3JzcF9zc25fZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9iYV9yc3Bfc3NuX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX2JhX2V2ZW50X3NzbiwgYmFfZXZlbnRfc3NuX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQkFfUlNQX1NTTl9FVkVOVElEKTsKKworLyogQWdncmVnYXRpb24gUmVxdWVzdCBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0FHR1JfU1RBVEVfVFJJR19FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkgICAgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfYWdncl9zdGF0ZV90cmlnX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfYWdncl9zdGF0ZV90cmlnX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQUdHUl9TVEFURV9UUklHX0VWRU5USUQpOworCisvKiBSb2FtIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUk9BTV9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkJCSAgICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9yb2FtX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUk9BTV9FVkVOVElEKTsKKworLyogUm9hbSBTeW5jaCBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JPQU1fU1lOQ0hfRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zeW5jaF9ldmVudF9maXhlZF9wYXJhbSwgd21pX3JvYW1fc3luY2hfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGJjbl9wcm9iZV9yc3BfZnJhbWUsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgcmVhc3NvY19yc3BfZnJhbWUsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYW5uZWwsIHdtaV9jaGFubmVsLCBjaGFuLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfa2V5X21hdGVyaWFsLCBrZXksIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfQVJSQVlfVUlOVDMyLCBBX1VJTlQzMiwgc3RhdHVzLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9ST0FNX1NZTkNIX0VWRU5USUQpOworCisvKiBXT1cgV2FrZXVwIEhvc3QgRXZlbnQgKi8KKy8qIE5PVEU6IE1ha2Ugc3VyZSB3b3dfYml0bWFwX2luZm8gY2FuIGJlIHplcm8gb3Igb25lIGVsZW1lbnRzIG9ubHkgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9XT1dfV0FLRVVQX0hPU1RfRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfV09XX0VWRU5UX0lORk9fZml4ZWRfcGFyYW0sIFdPV19FVkVOVF9JTkZPX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgV09XX0VWRU5UX0lORk9fU0VDVElPTl9CSVRNQVAsIHdvd19iaXRtYXBfaW5mbywgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCB3b3dfcGFja2V0X2J1ZmZlciwgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX2hiX2luZF9ldmVudF9maXhlZF9wYXJhbSwgaGJfaW5kZXZ0LCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCBXTUlfR1RLX09GRkxPQURfU1RBVFVTX0VWRU5UX2ZpeGVkX3BhcmFtLCB3b3dfZ3RraWd0aywgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9XT1dfV0FLRVVQX0hPU1RfRVZFTlRJRCk7CisKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1dPV19JTklUSUFMX1dBS0VVUF9FVkVOVElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX1dPV19FVkVOVF9JTklUSUFMX1dBS0VVUF9maXhlZF9wYXJhbSwgV09XX0lOSVRJQUxfV0FLRVVQX0VWRU5UX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfV09XX0lOSVRJQUxfV0FLRVVQX0VWRU5USUQpOworCisKKy8qIFJUVCBlcnJvciByZXBvcnQgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9SVFRfRVJST1JfUkVQT1JUX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUlRUX0VSUk9SX1JFUE9SVF9FVkVOVElEKTsKKworLyogRWNobyBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0VDSE9fRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkgICAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9lY2hvX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfZWNob19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0VDSE9fRVZFTlRJRCk7CisKKy8qIEZUTSBJbnRlZ3JhdGlvbiBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BERVZfRlRNX0lOVEdfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZnRtX2ludGdfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9mdG1faW50Z19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUERFVl9GVE1fSU5UR19FVkVOVElEKTsKKworLyogVkRFViBnZXQgS2VlcGFsaXZlIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVkRFVl9HRVRfS0VFUEFMSVZFX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfZ2V0X2tlZXBhbGl2ZV9ldmVudF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfZ2V0X2tlZXBhbGl2ZV9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1ZERVZfR0VUX0tFRVBBTElWRV9FVkVOVElEKTsKKworLyogR1BJTyBJbnB1dCBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0dQSU9fSU5QVVRfRVZFTlRJRChpZCxvcCxidWYsbGVuKSAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2dwaW9faW5wdXRfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9ncGlvX2lucHV0X2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfR1BJT19JTlBVVF9FVkVOVElEKTsKKworLyogQ1NBIEhhbmRsaW5nIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfQ1NBX0hBTkRMSU5HX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NzYV9ldmVudF9maXhlZF9wYXJhbSwgd21pX2NzYV9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0NTQV9IQU5ETElOR19FVkVOVElEKTsKKworLyogUmZraWxsIHN0YXRlIGNoYW5nZSBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JGS0lMTF9TVEFURV9DSEFOR0VfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcmZraWxsX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfcmZraWxsX21vZGVfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9SRktJTExfU1RBVEVfQ0hBTkdFX0VWRU5USUQpOworCisvKiBEZWJ1ZyBNZXNzYWdlIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfREVCVUdfTUVTR19FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGJ1ZnAsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0RFQlVHX01FU0dfRVZFTlRJRCk7CisKKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9ERUJVR19NRVNHX0ZMVVNIX0NPTVBMRVRFX0VWRU5USUQoaWQsIG9wLCBidWYsIGxlbikgXAorICAgIFdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RlYnVnX21lc2dfZmx1c2hfY29tcGxldGVfZml4ZWRfcGFyYW0sIHdtaV9kZWJ1Z19tZXNnX2ZsdXNoX2NvbXBsZXRlX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfREVCVUdfTUVTR19GTFVTSF9DT01QTEVURV9FVkVOVElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JTU0lfQlJFQUNIX0VWRU5USUQoaWQsIG9wLCBidWYsIGxlbilcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcnNzaV9icmVhY2hfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9yc3NpX2JyZWFjaF9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JTU0lfQlJFQUNIX0VWRU5USUQpOworCisvKiBEaWFnbm9zdGljcyBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0RJQUdfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBidWZwLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9ESUFHX0VWRU5USUQpOworCisvKiBJR1RLIE9mZmxvYWQgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9HVEtfT0ZGTE9BRF9TVEFUVVNfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ19XTUlfR1RLX09GRkxPQURfU1RBVFVTX0VWRU5UX2ZpeGVkX3BhcmFtLCBXTUlfR1RLX09GRkxPQURfU1RBVFVTX0VWRU5UX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfR1RLX09GRkxPQURfU1RBVFVTX0VWRU5USUQpOworCisvKiBEQ0EgaW50ZXJmZXJhbmNlIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRENTX0lOVEVSRkVSRU5DRV9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY3NfaW50ZXJmZXJlbmNlX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfZGNzX2ludGVyZmVyZW5jZV9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIGF0aF9kY3NfY3dfaW50LCBjd19pbnQsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdsYW5fZGNzX2ltX3RndF9zdGF0c190LCB3bGFuX3N0YXQsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0RDU19JTlRFUkZFUkVOQ0VfRVZFTlRJRCk7CisKKy8qIFByb2ZpbGUgZGF0YSBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1dMQU5fUFJPRklMRV9EQVRBX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3dsYW5fcHJvZmlsZV9jdHhfdCwgd21pX3dsYW5fcHJvZmlsZV9jdHhfdCwgcHJvZmlsZV9jdHgsIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV93bGFuX3Byb2ZpbGVfdCwgcHJvZmlsZV9kYXRhLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9XTEFOX1BST0ZJTEVfREFUQV9FVkVOVElEKTsKKworLyogUERFViBVVEYgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1VURl9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGRhdGEsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfVVRGX0VWRU5USUQpOworCisvKiBEZWJ1ZyBwcmludCBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0RFQlVHX1BSSU5UX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfREVCVUdfUFJJTlRfRVZFTlRJRCk7CisKKy8qIFJUVCBtZWFzdXJlbWVudCByZXBvcnQgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9SVFRfTUVBU1VSRU1FTlRfUkVQT1JUX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUlRUX01FQVNVUkVNRU5UX1JFUE9SVF9FVkVOVElEKTsKKworLypvZW0gbWVhc3VyZW1lbnQgcmVwb3J0IEV2ZW50Ki8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PRU1fTUVBU1VSRU1FTlRfUkVQT1JUX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0VNX01FQVNVUkVNRU5UX1JFUE9SVF9FVkVOVElEKTsKKworLypvZW0gZXJyb3IgcmVwb3J0IGV2ZW50Ki8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PRU1fRVJST1JfUkVQT1JUX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0VNX0VSUk9SX1JFUE9SVF9FVkVOVElEKTsKKworLypvZW0gY2FwYWJpbGl0eSByZXBvcnQgZXZlbnQqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX09FTV9DQVBBQklMSVRZX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0VNX0NBUEFCSUxJVFlfRVZFTlRJRCk7CisKKy8qIEhPU1QgU1dCQSBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0hPU1RfU1dCQV9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ob3N0X3N3YmFfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9ob3N0X3N3YmFfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfdGltX2luZm8sIHRpbV9pbmZvLCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfcDJwX25vYV9pbmZvLCBwMnBfbm9hX2luZm8sIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfSE9TVF9TV0JBX0VWRU5USUQpOworCisvKiBVcGRhdGUgc3RhdHMgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9VUERBVEVfU1RBVFNfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9zdGF0c19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfVVBEQVRFX1NUQVRTX0VWRU5USUQpOworCisvKiBGb3IgdmRldiBiYXNlZCBodC92aHQgaW5mbyB1cGxvYWQqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1VQREFURV9WREVWX1JBVEVfU1RBVFNfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9yYXRlX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfdmRldl9yYXRlX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX3ZkZXZfcmF0ZV9odF9pbmZvLCBodF9pbmZvLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9VUERBVEVfVkRFVl9SQVRFX1NUQVRTX0VWRU5USUQpOworCisvKiBVcGRhdGUgbWVtb3J5IGR1bXAgY29tcGxldGUgRXZlbnQgKi8KKyNkZWZpbmUgIFdNSVRMVl9UQUJMRV9XTUlfVVBEQVRFX0ZXX01FTV9EVU1QX0VWRU5USUQoaWQsb3AsYnVmLGxlbilcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfdXBkYXRlX2Z3X21lbV9kdW1wX2ZpeGVkX3BhcmFtLCB3bWlfdXBkYXRlX2Z3X21lbV9kdW1wX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9VUERBVEVfRldfTUVNX0RVTVBfRVZFTlRJRCk7CisKKy8qIEV2ZW50IGluZGljYXRpbmcgdGhlIERJQUcgTE9Hcy9FdmVudHMgc3VwcG9ydGVkIGJ5IEZXICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfRElBR19FVkVOVF9MT0dfU1VQUE9SVEVEX0VWRU5USUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RpYWdfZXZlbnRfbG9nX3N1cHBvcnRlZF9ldmVudF9maXhlZF9wYXJhbXMsIHdtaV9kaWFnX2V2ZW50X2xvZ19zdXBwb3J0ZWRfZXZlbnRfZml4ZWRfcGFyYW1zLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19BUlJBWV9VSU5UMzIsIEFfVUlOVDMyLCBkaWFnX2V2ZW50c19sb2dzX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikKKworV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRElBR19FVkVOVF9MT0dfU1VQUE9SVEVEX0VWRU5USUQpOworCisKKy8qIFVwZGF0ZSBpZmFjZSBsaW5rIHN0YXRzIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfSUZBQ0VfTElOS19TVEFUU19FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9pZmFjZV9saW5rX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfaWZhY2VfbGlua19zdGF0c19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9pZmFjZV9saW5rX3N0YXRzLCBpZmFjZV9saW5rX3N0YXRzLCBXTUlUTFZfU0laRV9WQVIpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfd21tX2FjX3N0YXRzLCBhYywgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9JRkFDRV9MSU5LX1NUQVRTX0VWRU5USUQpOworCisvKiBVcGRhdGUgUGVlciBsaW5rIHN0YXRzIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUEVFUl9MSU5LX1NUQVRTX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9wZWVyX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX3BlZXJfbGlua19zdGF0cywgcGVlcl9zdGF0cywgV01JVExWX1NJWkVfVkFSKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX3JhdGVfc3RhdHMsIHBlZXJfcmF0ZV9zdGF0cywgV01JVExWX1NJWkVfVkFSKQorCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX0xJTktfU1RBVFNfRVZFTlRJRCk7CisKKy8qIFVwZGF0ZSByYWRpbyBzdGF0cyBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1JBRElPX0xJTktfU1RBVFNfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcmFkaW9fbGlua19zdGF0c19ldmVudF9maXhlZF9wYXJhbSwgd21pX3JhZGlvX2xpbmtfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfcmFkaW9fbGlua19zdGF0cywgcmFkaW9fc3RhdHMsIFdNSVRMVl9TSVpFX1ZBUikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9jaGFubmVsX3N0YXRzLCBjaGFubmVsX3N0YXRzLCBXTUlUTFZfU0laRV9WQVIpCisKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1JBRElPX0xJTktfU1RBVFNfRVZFTlRJRCk7CisKKy8qIFBERVYgUVZJVCBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BERVZfUVZJVF9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGRhdGEsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfUVZJVF9FVkVOVElEKTsKKworLyogV0xBTiBGcmVxdWVuY3kgYXZvaWQgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9XTEFOX0ZSRVFfQVZPSURfRVZFTlRJRChpZCxvcCxidWYsbGVuKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfYXZvaWRfZnJlcV9yYW5nZXNfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9hdm9pZF9mcmVxX3Jhbmdlc19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9hdm9pZF9mcmVxX3JhbmdlX2Rlc2MsIGF2ZF9mcmVxX3JhbmdlLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9XTEFOX0ZSRVFfQVZPSURfRVZFTlRJRCk7CisKKy8qIEdUSyByZWtleSBmYWlsIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfR1RLX1JFS0VZX0ZBSUxfRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkJCQkJCSAgICAgICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZ3RrX3Jla2V5X2ZhaWxfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9ndGtfcmVrZXlfZmFpbF9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0dUS19SRUtFWV9GQUlMX0VWRU5USUQpOworCisvKiBOTE8gbWF0Y2ggZXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9OTE9fTUFUQ0hfRVZFTlRJRChpZCxvcCxidWYsbGVuKQkJCQkJCQkJCQkJCSAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX25sb19ldmVudCwgd21pX25sb19ldmVudCwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX05MT19NQVRDSF9FVkVOVElEKTsKKworLyogTkxPIHNjYW4gY29tcGxldGUgZXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9OTE9fU0NBTl9DT01QTEVURV9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCQkJCQkJCQkJICBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfbmxvX2V2ZW50LCB3bWlfbmxvX2V2ZW50LCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTkxPX1NDQU5fQ09NUExFVEVfRVZFTlRJRCk7CisKKy8qIEFQRklORCBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0FQRklORF9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hcGZpbmRfZXZlbnRfaGRyLCB3bWlfYXBmaW5kX2V2ZW50X2hkciwgaGRyLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGRhdGEsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0FQRklORF9FVkVOVElEKTsKKworLyogV01JX1BBU1NQT0lOVF9NQVRDSF9FVkVOVElEICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUEFTU1BPSU5UX01BVENIX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3Bhc3Nwb2ludF9ldmVudF9oZHIsIHdtaV9wYXNzcG9pbnRfZXZlbnRfaGRyLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGJ1ZnAsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BBU1NQT0lOVF9NQVRDSF9FVkVOVElEKTsKKworLyogQ2hhdHRlciBxdWVyeSByZXBseSBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0NIQVRURVJfUENfUVVFUllfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfY2hhdHRlcl9xdWVyeV9yZXBseV9ldmVudF9maXhlZF9wYXJhbSwgd21pX2NoYXR0ZXJfcXVlcnlfcmVwbHlfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9DSEFUVEVSX1BDX1FVRVJZX0VWRU5USUQpOworCisvKiBVcGxvYWQgSF9DViBpbmZvIGV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVVBMT0FESF9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV91cGxvYWRfaF9oZHIsIHdtaV91cGxvYWRfaF9oZHIsIGhkciwgV01JVExWX1NJWkVfRklYKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBidWZwLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9VUExPQURIX0VWRU5USUQpOworCisvKiBDYXB0dXJlIEggaW5mbyBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0NBUFRVUkVIX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NhcHR1cmVfaF9ldmVudF9oZHIsIHdtaV9jYXB0dXJlX2hfZXZlbnRfaGRyLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQ0FQVFVSRUhfRVZFTlRJRCk7CisvKiBURExTIFBlZXIgVXBkYXRlIGV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVERMU19QRUVSX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV90ZGxzX3BlZXJfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV90ZGxzX3BlZXJfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9URExTX1BFRVJfRVZFTlRJRCk7CisKKy8qIFZERVYgTUNDIEJlYWNvbiBJbnRlcnZhbCBDaGFuZ2UgUmVxdWVzdCBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1ZERVZfTUNDX0JDTl9JTlRFUlZBTF9DSEFOR0VfUkVRX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfbWNjX2Jjbl9pbnR2bF9jaGFuZ2VfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV92ZGV2X21jY19iY25faW50dmxfY2hhbmdlX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQworCShXTUlfVkRFVl9NQ0NfQkNOX0lOVEVSVkFMX0NIQU5HRV9SRVFfRVZFTlRJRCk7CisKKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9CQVRDSF9TQ0FOX0VOQUJMRURfRVZFTlRJRChpZCxvcCxidWYsbGVuKSAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2JhdGNoX3NjYW5fZW5hYmxlZF9ldmVudF9maXhlZF9wYXJhbSwgd21pX2JhdGNoX3NjYW5fZW5hYmxlZF9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0JBVENIX1NDQU5fRU5BQkxFRF9FVkVOVElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0JBVENIX1NDQU5fUkVTVUxUX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2JhdGNoX3NjYW5fcmVzdWx0X2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfYmF0Y2hfc2Nhbl9yZXN1bHRfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9iYXRjaF9zY2FuX3Jlc3VsdF9zY2FuX2xpc3QsIHNjYW5fbGlzdCwgV01JVExWX1NJWkVfVkFSKQkgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMsIHdtaV9iYXRjaF9zY2FuX3Jlc3VsdF9uZXR3b3JrX2luZm8sIG5ldHdvcmtfbGlzdCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQkFUQ0hfU0NBTl9SRVNVTFRfRVZFTlRJRCk7CisKKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PRkZMT0FEX0JDTl9UWF9TVEFUVVNfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfb2ZmbG9hZF9iY25fdHhfc3RhdHVzX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfb2ZmbG9hZF9iY25fdHhfc3RhdHVzX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0ZGTE9BRF9CQ05fVFhfU1RBVFVTX0VWRU5USUQpOworCisvKiBOT0EgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QMlBfTk9BX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3AycF9ub2FfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9wMnBfbm9hX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQlcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcDJwX25vYV9pbmZvLCB3bWlfcDJwX25vYV9pbmZvLCBwMnBfbm9hX2luZm8sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1AyUF9OT0FfRVZFTlRJRCk7CisKKyAgICAvKiBBUCBQUyBlbmhhbmNlZCBncmVlbiBhcCBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0FQX1BTX0VHQVBfSU5GT19FVkVOVElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLFwKKwkgICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hcF9wc19lZ2FwX2luZm9fZXZlbnRfZml4ZWRfcGFyYW0sXAorCSAgIHdtaV9hcF9wc19lZ2FwX2luZm9fZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLFwKKwkgICB3bWlfYXBfcHNfZWdhcF9pbmZvX2NoYWlubWFza19saXN0LCBjaGFpbm1hc2tfbGlzdCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfQVBfUFNfRUdBUF9JTkZPX0VWRU5USUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUEVFUl9JTkZPX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJCQkJCQkgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2luZm9fZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9wZWVyX2luZm9fZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCQkgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfcGVlcl9pbmZvLCBwZWVyX2luZm8sIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BFRVJfSU5GT19FVkVOVElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BFRVJfVFhfRkFJTF9DTlRfVEhSX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCQkJCQkJCSAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfdHhfZmFpbF9jbnRfdGhyX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfcGVlcl90eF9mYWlsX2NudF90aHJfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX1RYX0ZBSUxfQ05UX1RIUl9FVkVOVElEKTsKKworLyogREZTIHJhZGFyIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfREZTX1JBREFSX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX2Rmc19yYWRhcl9ldmVudF9maXhlZF9wYXJhbSwgd21pX2Rmc19yYWRhcl9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0RGU19SQURBUl9FVkVOVElEKTsKKworLyogVGhlcm1hbCBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1RIRVJNQUxfTUdNVF9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV90aGVybWFsX21nbXRfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV90aGVybWFsX21nbXRfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9USEVSTUFMX01HTVRfRVZFTlRJRCk7CisKKy8qIE5BTiBSZXNwb25zZS9JbmRpY2F0aW9uIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTkFOX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJCVwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9uYW5fZXZlbnRfaGRyLCB3bWlfbmFuX2V2ZW50X2hkciwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgZGF0YSwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfTkFOX0VWRU5USUQpOworCisvKiBMMVNTIHRyYWNrIEV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUERFVl9MMVNTX1RSQUNLX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfbDFzc190cmFja19ldmVudF9maXhlZF9wYXJhbSwgd21pX3BkZXZfbDFzc190cmFja19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfTDFTU19UUkFDS19FVkVOVElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0RJQUdfREFUQV9DT05UQUlORVJfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZGlhZ19kYXRhX2NvbnRhaW5lcl9ldmVudF9maXhlZF9wYXJhbSwgd21pX2RpYWdfZGF0YV9jb250YWluZXJfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCSAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgYnVmcCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRElBR19EQVRBX0NPTlRBSU5FUl9FVkVOVElEKTsKKworLyogRXN0aW1hdGVkIExpbmsgU3BlZWQgSW5kaWNhdGlvbiovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUEVFUl9FU1RJTUFURURfTElOS1NQRUVEX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfZXN0aW1hdGVkX2xpbmtzcGVlZF9ldmVudF9maXhlZF9wYXJhbSwgd21pX3BlZXJfZXN0aW1hdGVkX2xpbmtzcGVlZF9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BFRVJfRVNUSU1BVEVEX0xJTktTUEVFRF9FVkVOVElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NUQVRTX0VYVF9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pCQkJCSAgICAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGF0c19leHRfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9zdGF0c19leHRfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX0JZVEUsIEFfVUlOVDgsIGRhdGEsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NUQVRTX0VYVF9FVkVOVElEKTsKKworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX09GRkxPQURfUFJPQl9SRVNQX1RYX1NUQVRVU19FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vZmZsb2FkX3ByYl9yc3BfdHhfc3RhdHVzX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfb2ZmbG9hZF9wcmJfcnNwX3R4X3N0YXR1c19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX09GRkxPQURfUFJPQl9SRVNQX1RYX1NUQVRVU19FVkVOVElEKTsKKworLyogaG9zdCBhdXRvIHNodXQgZG93biBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0hPU1RfQVVUT19TSFVURE9XTl9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ob3N0X2F1dG9fc2h1dGRvd25fZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9ob3N0X2F1dG9fc2h1dGRvd25fZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9IT1NUX0FVVE9fU0hVVERPV05fRVZFTlRJRCk7CisKKy8qIHBlZXIgc3RhdGUgRXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QRUVSX1NUQVRFX0VWRU5USUQoaWQsb3AsYnVmLGxlbikJCQkJICAgICAgIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX3N0YXRlX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfcGVlcl9zdGF0ZV9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BFRVJfU1RBVEVfRVZFTlRJRCk7CisKKy8qIHBlZXIgYXNzb2MgY29uZiBFdmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1BFRVJfQVNTT0NfQ09ORl9FVkVOVElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2Fzc29jX2NvbmZfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9wZWVyX2Fzc29jX2NvbmZfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QRUVSX0FTU09DX0NPTkZfRVZFTlRJRCk7CisKKy8qIEQwLVdPVyBEaXNhYmxlIEFjayBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0QwX1dPV19ESVNBQkxFX0FDS19FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kMF93b3dfZGlzYWJsZV9hY2tfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9kMF93b3dfZGlzYWJsZV9hY2tfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9EMF9XT1dfRElTQUJMRV9BQ0tfRVZFTlRJRCk7CisKKy8qIFBkZXYgZ2V0IGNoaXAgdGVtcGVyYXR1cmUgZXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QREVWX1RFTVBFUkFUVVJFX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfdGVtcGVyYXR1cmVfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X3RlbXBlcmF0dXJlX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUERFVl9URU1QRVJBVFVSRV9FVkVOVElEKTsKKworLyogbUROUyBvZmZsb2FkIHN0YXRzIGV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTUROU19TVEFUU19FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZG5zX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfbWRuc19zdGF0c19ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX01ETlNfU1RBVFNfRVZFTlRJRCk7CisKKy8qIHBkZXYgcmVzdW1lIGV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUERFVl9SRVNVTUVfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9yZXN1bWVfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9wZGV2X3Jlc3VtZV9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1BERVZfUkVTVU1FX0VWRU5USUQpOworCisvKiBTQVAgQXV0aGVudGljYXRpb24gb2ZmbG9hZCBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NBUF9PRkxfQUREX1NUQV9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zYXBfb2ZsX2FkZF9zdGFfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9zYXBfb2ZsX2FkZF9zdGFfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpICAgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfQVJSQVlfQllURSwgQV9VSU5UOCwgYnVmcCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU0FQX09GTF9BRERfU1RBX0VWRU5USUQpOworCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU0FQX09GTF9ERUxfU1RBX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NhcF9vZmxfZGVsX3N0YV9ldmVudF9maXhlZF9wYXJhbSwgd21pX3NhcF9vZmxfZGVsX3N0YV9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NBUF9PRkxfREVMX1NUQV9FVkVOVElEKTsKKworLyogU2V0IE9DQiBzY2hlZHVsZSBjbWQsIERFUFJFQ0FURUQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PQ0JfU0VUX1NDSEVEX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9zZXRfc2NoZWRfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9vY2Jfc2V0X3NjaGVkX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0NCX1NFVF9TQ0hFRF9FVkVOVElEKTsKKworLyogU2V0IE9DQiBjb25maWd1cmF0aW9uIHJlc3BvbnNlIGV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfT0NCX1NFVF9DT05GSUdfUkVTUF9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc2V0X2NvbmZpZ19yZXNwX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfb2NiX3NldF9jb25maWdfcmVzcF9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX09DQl9TRVRfQ09ORklHX1JFU1BfRVZFTlRJRCk7CisKKy8qIEdldCBUU0YgdGltZXIgcmVzcG9uc2UgZXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9PQ0JfR0VUX1RTRl9USU1FUl9SRVNQX0VWRU5USUQoaWQsb3AsYnVmLGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLG9wLGJ1ZixsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9nZXRfdHNmX3RpbWVyX3Jlc3BfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9vY2JfZ2V0X3RzZl90aW1lcl9yZXNwX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfT0NCX0dFVF9UU0ZfVElNRVJfUkVTUF9FVkVOVElEKTsKKworLyogR2V0IERDQyBzdGF0cyByZXNwb25zZSBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0RDQ19HRVRfU1RBVFNfUkVTUF9FVkVOVElEKGlkLG9wLGJ1ZixsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfZ2V0X3N0YXRzX3Jlc3BfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9kY2NfZ2V0X3N0YXRzX3Jlc3BfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpIFwKKwlXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfZGNjX25kbF9zdGF0c19wZXJfY2hhbm5lbCwgc3RhdHNfcGVyX2NoYW5uZWxfbGlzdCwgV01JVExWX1NJWkVfVkFSKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfRENDX0dFVF9TVEFUU19SRVNQX0VWRU5USUQpOworCisvKiBVcGRhdGUgRENDIE5ETCByZXNwb25zZSBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX0RDQ19VUERBVEVfTkRMX1JFU1BfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZGNjX3VwZGF0ZV9uZGxfcmVzcF9ldmVudF9maXhlZF9wYXJhbSwgd21pX2RjY191cGRhdGVfbmRsX3Jlc3BfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9EQ0NfVVBEQVRFX05ETF9SRVNQX0VWRU5USUQpOworCisvKiBEQ0Mgc3RhdHMgZXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9EQ0NfU1RBVFNfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfZGNjX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfZGNjX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsb3AsYnVmLGxlbiwgV01JVExWX1RBR19BUlJBWV9TVFJVQywgd21pX2RjY19uZGxfc3RhdHNfcGVyX2NoYW5uZWwsIHN0YXRzX3Blcl9jaGFubmVsX2xpc3QsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX0RDQ19TVEFUU19FVkVOVElEKTsKKworLyogUmVhZCBUU0YgdGltZXIgcmVzcG9uc2UgZXZlbnQgKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9WREVWX1RTRl9SRVBPUlRfRVZFTlRJRChpZCxvcCxidWYsbGVuKSBcCitXTUlUTFZfRUxFTShpZCxvcCxidWYsbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3RzZl9yZXBvcnRfZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV92ZGV2X3RzZl9yZXBvcnRfZXZlbnRfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX1RTRl9SRVBPUlRfRVZFTlRJRCk7CisKKy8qIFZkZXYgY2FwYWJpbGl0aWVzIElFIHRvIGJlIHRyYW5zbWl0dGVkIGluIG1nbXQgZnJhbWVzICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfVkRFVl9TRVRfSUVfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc2V0X2llX2NtZF9maXhlZF9wYXJhbSwgd21pX3ZkZXZfc2V0X2llX2NtZF9maXhlZF9wYXJhbSwgdmRldl9pZSwgV01JVExWX1NJWkVfRklYKSBcCisJV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19BUlJBWV9CWVRFLCBBX1VJTlQ4LCBidWZwLCBXTUlUTFZfU0laRV9WQVIpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9WREVWX1NFVF9JRV9DTURJRCk7CisKKy8qIFNPQyBTZXQgSGFyZHdhcmUgTW9kZSBSZXNwb25zZSBldmVudCAqLworI2RlZmluZSBXTUlUTFZfVEFCTEVfV01JX1NPQ19TRVRfSFdfTU9ERV9SRVNQX0VWRU5USUQoaWQsIG9wLCBidWYsIGxlbikgXAorV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfc29jX3NldF9od19tb2RlX3Jlc3BvbnNlX2V2ZW50X2ZpeGVkX3BhcmFtLCB3bWlfc29jX3NldF9od19tb2RlX3Jlc3BvbnNlX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCitXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfc29jX3NldF9od19tb2RlX3Jlc3BvbnNlX3ZkZXZfbWFjX2VudHJ5LCB3bWlfc29jX3NldF9od19tb2RlX3Jlc3BvbnNlX3ZkZXZfbWFjX21hcHBpbmcsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NPQ19TRVRfSFdfTU9ERV9SRVNQX0VWRU5USUQpOworCisvKiBTT0MgSGFyZHdhcmUgTW9kZSBUcmFuc2l0aW9uIGV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU09DX0hXX01PREVfVFJBTlNJVElPTl9FVkVOVElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKK1dNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19od19tb2RlX3RyYW5zaXRpb25fZXZlbnRfZml4ZWRfcGFyYW0sIHdtaV9zb2NfaHdfbW9kZV90cmFuc2l0aW9uX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKSBcCitXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDLCB3bWlfc29jX3NldF9od19tb2RlX3Jlc3BvbnNlX3ZkZXZfbWFjX2VudHJ5LCB3bWlfc29jX3NldF9od19tb2RlX3Jlc3BvbnNlX3ZkZXZfbWFjX21hcHBpbmcsIFdNSVRMVl9TSVpFX1ZBUikKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX1NPQ19IV19NT0RFX1RSQU5TSVRJT05fRVZFTlRJRCk7CisKKy8qIFNPQyBTZXQgRHVhbCBNQUMgQ29uZmlnIFJlc3BvbnNlIGV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfU09DX1NFVF9EVUFMX01BQ19DT05GSUdfUkVTUF9FVkVOVElEKGlkLCBvcCwgYnVmLCBsZW4pIFwKKwlXTUlUTFZfRUxFTShpZCwgb3AsIGJ1ZiwgbGVuLCBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zb2Nfc2V0X2R1YWxfbWFjX2NvbmZpZ19yZXNwb25zZV9ldmVudF9maXhlZF9wYXJhbSwgd21pX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnX3Jlc3BvbnNlX2V2ZW50X2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfU09DX1NFVF9EVUFMX01BQ19DT05GSUdfUkVTUF9FVkVOVElEKTsKKworLyogUGFja2V0IEZpbHRlciBjb25maWd1cmUgY29tbWFuZCovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfUEFDS0VUX0ZJTFRFUl9DT05GSUdfQ01ESUQoaWQsIG9wLCBidWYsIGxlbikgXAorICAgIFdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BhY2tldF9maWx0ZXJfY29uZmlnX2ZpeGVkX3BhcmFtLCBXTUlfUEFDS0VUX0ZJTFRFUl9DT05GSUdfQ01EX2ZpeGVkX3BhcmFtLCBmaXhlZF9wYXJhbSwgV01JVExWX1NJWkVfRklYKQorV01JVExWX0NSRUFURV9QQVJBTV9TVFJVQyhXTUlfUEFDS0VUX0ZJTFRFUl9DT05GSUdfQ01ESUQpOworCisvKiBQYWNrZXQgRmlsdGVyIGVuYWJsZSBjb21tYW5kKi8KKyNkZWZpbmUgV01JVExWX1RBQkxFX1dNSV9QQUNLRVRfRklMVEVSX0VOQUJMRV9DTURJRChpZCwgb3AsIGJ1ZiwgbGVuKSBcCisgICAgV01JVExWX0VMRU0oaWQsIG9wLCBidWYsIGxlbiwgV01JVExWX1RBR19TVFJVQ193bWlfcGFja2V0X2ZpbHRlcl9lbmFibGVfZml4ZWRfcGFyYW0sIFdNSV9QQUNLRVRfRklMVEVSX0VOQUJMRV9DTURfZml4ZWRfcGFyYW0sIGZpeGVkX3BhcmFtLCBXTUlUTFZfU0laRV9GSVgpCitXTUlUTFZfQ1JFQVRFX1BBUkFNX1NUUlVDKFdNSV9QQUNLRVRfRklMVEVSX0VOQUJMRV9DTURJRCk7CisKKy8qIE1BV0MgZW5hYmxlL2Rpc2FibGUgc2Vuc29yIGV2ZW50ICovCisjZGVmaW5lIFdNSVRMVl9UQUJMRV9XTUlfTUFXQ19FTkFCTEVfU0VOU09SX0VWRU5USUQoaWQsIG9wLCBidWYsIGxlbikgXAorCVdNSVRMVl9FTEVNKGlkLCBvcCwgYnVmLCBsZW4sIFdNSVRMVl9UQUdfU1RSVUNfd21pX21hd2NfZW5hYmxlX3NlbnNvcl9ldmVudF9maXhlZF9wYXJhbSwgd21pX21hd2NfZW5hYmxlX3NlbnNvcl9ldmVudF9maXhlZF9wYXJhbSwgZml4ZWRfcGFyYW0sIFdNSVRMVl9TSVpFX0ZJWCkKK1dNSVRMVl9DUkVBVEVfUEFSQU1fU1RSVUMoV01JX01BV0NfRU5BQkxFX1NFTlNPUl9FVkVOVElEKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qX1dNSV9UTFZfREVGU19IXyovCmRpZmYgLS1naXQgYS90YXJnZXQvaW5jL3dtaV90bHZfaGVscGVyLmggYi90YXJnZXQvaW5jL3dtaV90bHZfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzMWU1ZAotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9pbmMvd21pX3Rsdl9oZWxwZXIuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfV01JX1RMVl9IRUxQRVJfSF8KKyNkZWZpbmUgX1dNSV9UTFZfSEVMUEVSX0hfCisKKy8qCisgKiBFdmVyeSBjb21tYW5kIG9yIGV2ZW50IHBhcmFtZXRlciBzdHJ1Y3R1cmUgd2lsbCBuZWVkIGEgVExWIGRlZmluaXRpb24uCisgKiBUaGUgbWFjcm8gV01JVExWX1RBQkxFIGlzIHVzZWQgdG8gaGVscCBidWlsZCB0aGlzIFRMViBkZWZpbml0aW9uLiBJbnNpZGUgdGhpcyBtYWNybyBkZWZpbmUsIHRoZQorICogaW5kaXZpZHVhbCBUTFYncyBhcmUgc3BlY2lmaWVkLiBUaGUgcGFyYW1ldGVycyBmb3IgV01JVExWX0VMRU0gYXJlOgorICogKDEpIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIHVuY2hhbmdlZCBmcm9tIHRoZSBXTUlUTFZfVEFCTEUuIEN1cnJlbnRseSwgdGhleSBhcmUgaWQsb3AsYnVmLGxlbgorICogKDIpIFRoZSBUTFYgVGFnLiBZb3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyB0YWcgZm9yIGVhY2ggY21kL2V2ZW50IGluIFdNSVRMVl9UQUdfSUQuIFRoZSBuYW1lIG9mIHRoZQorICogICAgIHRhZyBpcyA8V01JX1RMVlRBR19TVFJVQ18+PENNRCBvciBFdmVudCBJRCBuYW1lPi4gVGhlcmUgYXJlIHNwZWNpYWwgdGFncywKKyAqICAgICBlLmcuIFdNSV9UTFZUQUdfQVJSQVlfVUlOVDMyIGFuZCBXTUlfVExWVEFHX0FSUkFZX1NUUlVDLiBXTUlfVExWVEFHX0FSUkFZX1VJTlQzMiBpcyBmb3IgYQorICogICAgIHZhcmlhYmxlIHNpemUgYXJyYXkgb2YgVUlOVDMyIGVsZW1lbnRzLiBXTUlfVExWVEFHX0FSUkFZX1NUUlVDIGlzIGZvciBhIHZhcmlhbGJlIHNpemUgYXJyYXkKKyAqICAgICBvZiBzdHJ1Y3R1cmVzLgorICogKDMpIHR5cGUgb2YgdGhlIFRMVi4gRm9yIFdNSV9UTFZUQUdfQVJSQVlfKiB0YWcsIHRoZW4gaXQgaXMgdGhlIHR5cGUgb2YgZWFjaCBlbGVtZW50LgorICogKDQpIE5hbWUgb2YgdGhpcyBUTFYuIEl0IG11c3QgYmUgdW5pcXVlIGluIHRoaXMgVExWIFRBQkxFLgorICogKDUpIEVpdGhlciBXTUlUTFZfU0laRV9GSVggb3IgV01JVExWX1NJWkVfVkFSIHRvIGluZGljYXRlIGlmIHRoaXMgVExWIGlzIHZhcmlhYmxlIHNpemUuCisgKgorICogTm90ZTogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIGxhc3QgVExWX0VMRU0gZG9lcyBub3QgaGF2ZSB0aGUgIlwiIGNoYXJhY3Rlci4KKyAqLworCisvKiBTaXplIG9mIHRoZSBUTFYgSGVhZGVyIHdoaWNoIGlzIHRoZSBUYWcgYW5kIExlbmd0aCBmaWVsZHMgKi8KKyNkZWZpbmUgV01JX1RMVl9IRFJfU0laRSAgICgxICogc2l6ZW9mKEFfVUlOVDMyKSkKKworLyoqIFRMViBIZWxwZXIgbWFjcm8gdG8gZ2V0IHRoZSBUTFYgSGVhZGVyIGdpdmVuIHRoZSBwb2ludGVyCisgKiAgdG8gdGhlIFRMViBidWZmZXIuICovCisjZGVmaW5lIFdNSVRMVl9HRVRfSERSKHRsdl9idWYpICAgICAgICAoKChBX1VJTlQzMiAqKSh0bHZfYnVmKSlbMF0pCisKKy8qKiBUTFYgSGVscGVyIG1hY3JvIHRvIHNldCB0aGUgVExWIEhlYWRlciBnaXZlbiB0aGUgcG9pbnRlcgorICogIHRvIHRoZSBUTFYgYnVmZmVyLiAqLworI2RlZmluZSBXTUlUTFZfU0VUX0hEUih0bHZfYnVmLCB0YWcsIGxlbikgKCgoQV9VSU5UMzIgKikodGx2X2J1ZikpWzBdKSA9ICgodGFnIDw8IDE2KSB8IChsZW4gJiAweDAwMDBGRkZGKSkKKworLyoqIFRMViBIZWxwZXIgbWFjcm8gdG8gZ2V0IHRoZSBUTFYgVGFnIGdpdmVuIHRoZSBUTFYgaGVhZGVyLiAqLworI2RlZmluZSBXTUlUTFZfR0VUX1RMVlRBRyh0bHZfaGVhZGVyKSAgKChBX1VJTlQzMikoKHRsdl9oZWFkZXIpPj4xNikpCisKKy8qKiBUTFYgSGVscGVyIG1hY3JvIHRvIGdldCB0aGUgVExWIEJ1ZmZlciBMZW5ndGggKG1pbnVzIFRMVgorICogIGhlYWRlciBzaXplKSBnaXZlbiB0aGUgVExWIGhlYWRlci4gKi8KKyNkZWZpbmUgV01JVExWX0dFVF9UTFZMRU4odGx2X2hlYWRlcikgICgoQV9VSU5UMzIpKCh0bHZfaGVhZGVyKSAmIDB4MDAwMEZGRkYpKQorCisvKiogVExWIEhlbHBlciBtYWNybyB0byBnZXQgdGhlIFRMViBsZW5ndGggZnJvbSBUTFYgc3RydWN0dXJlIHNpemUgYnkgcmVtb3ZpbmcgVExWIGhlYWRlciBzaXplICovCisjZGVmaW5lIFdNSVRMVl9HRVRfU1RSVUNUX1RMVkxFTih0bHZfc3RydWN0KSAgICAoKEFfVUlOVDMyKShzaXplb2YodGx2X3N0cnVjdCktV01JX1RMVl9IRFJfU0laRSkpCisKKy8qIEluZGljYXRlcyB3aGV0aGVyIHRoZSBUTFYgaXMgZml4ZWQgc2l6ZSBvciB2YXJpYWJsZSBsZW5ndGggKi8KKyNkZWZpbmUgV01JVExWX1NJWkVfRklYICAgICAwCisjZGVmaW5lIFdNSVRMVl9TSVpFX1ZBUiAgICAgMQorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGFnX29yZGVyOworCUFfVUlOVDMyIHRhZ19pZDsKKwlBX1VJTlQzMiB0YWdfc3RydWN0X3NpemU7CisJQV9VSU5UMzIgdGFnX3ZhcmllZF9zaXplOworCUFfVUlOVDMyIHRhZ19hcnJheV9zaXplOworCUFfVUlOVDMyIGNtZF9udW1fdGx2OworfSB3bWl0bHZfYXR0cmlidXRlc19zdHJ1YzsKKworLyogVGVtcGxhdGUgc3RydWN0dXJlIGRlZmluaXRpb24gZm9yIGEgdmFyaWFibGUgc2l6ZSBhcnJheSBvZiBVSU5UMzIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JX1RMVlRBR19BUlJBWV9VSU5UMzIgKi8KKwlBX1VJTlQzMiB1aW50MzJfYXJyYXlbMV07ICAgICAgIC8qIHZhcmlhYmxlIGxlbmd0aCBBcnJheSBvZiBVSU5UMzIgKi8KK30gd21pdGx2X2FycmF5X3VpbnQzMjsKKworLyogVGVtcGxhdGUgc3RydWN0dXJlIGRlZmluaXRpb24gZm9yIGEgdmFyaWFibGUgc2l6ZSBhcnJheSBvZiB1bmtub3duIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlfVExWVEFHX0FSUkFZX1NUUlVDICovCisJQV9VSU5UMzIgc3RydWNfYXJyYXlbMV07ICAgICAgICAvKiB2YXJpYWJsZSBsZW5ndGggQXJyYXkgb2Ygc3RydWN0dXJlcyAqLworfSB3bWl0bHZfYXJyYXlfc3RydWM7CisKKy8qCisgKiBVc2VkIHRvIGZpbGwgaW4gdGhlICJhcnJfc2l6ZSIgcGFyYW1ldGVyIHdoZW4gaXQgaXMgbm90IHNwZWNpZmllZCBhbmQgaGVuY2UsIGludmFsaWQuIENhbiBiZSB1c2VkIHRvCisgKiBpbmRpY2F0ZSBpZiB0aGUgb3JpZ2luYWwgVExWIGRlZmluaXRpb24gc3BlY2lmeSB0aGlzIGZpeGVkIGFycmF5IHNpemUuCisgKi8KKyNkZWZpbmUgV01JVExWX0FSUl9TSVpFX0lOVkFMSUQgIDB4MUZFCisKKyNkZWZpbmUgV01JVExWX0dFVF9UQUdfTlVNX1RMVl9BVFRSSUIod21pX2NtZF9ldmVudF9pZCkJICAgICBcCisJV01JX1RMVl9ITFBSX05VTV9UTFZTX0ZPUl8gIyMgd21pX2NtZF9ldmVudF9pZAorCit2b2lkCit3bWl0bHZfc2V0X3N0YXRpY19wYXJhbV90bHZfYnVmKHZvaWQgKnBhcmFtX3Rsdl9idWYsCisJCQkJQV9VSU5UMzIgbWF4X3RsdnNfYWNjb21vZGF0ZWQpOworCit2b2lkCit3bWl0bHZfZnJlZV9hbGxvY2F0ZWRfY29tbWFuZF90bHZzKEFfVUlOVDMyIGNtZF9pZCwgdm9pZCAqKndtaV9jbWRfc3RydWN0X3B0cik7CisKK3ZvaWQKK3dtaXRsdl9mcmVlX2FsbG9jYXRlZF9ldmVudF90bHZzKEFfVUlOVDMyIGV2ZW50X2lkLCB2b2lkICoqd21pX2NtZF9zdHJ1Y3RfcHRyKTsKKworaW50Cit3bWl0bHZfY2hlY2tfY29tbWFuZF90bHZfcGFyYW1zKHZvaWQgKm9zX2N0eCwgdm9pZCAqcGFyYW1fc3RydWNfcHRyLAorCQkJCUFfVUlOVDMyIHBhcmFtX2J1Zl9sZW4sCisJCQkJQV9VSU5UMzIgd21pX2NtZF9ldmVudF9pZCk7CisKK2ludAord21pdGx2X2NoZWNrX2V2ZW50X3Rsdl9wYXJhbXModm9pZCAqb3NfY3R4LCB2b2lkICpwYXJhbV9zdHJ1Y19wdHIsCisJCQkgICAgICBBX1VJTlQzMiBwYXJhbV9idWZfbGVuLAorCQkJICAgICAgQV9VSU5UMzIgd21pX2NtZF9ldmVudF9pZCk7CisKK2ludAord21pdGx2X2NoZWNrX2FuZF9wYWRfY29tbWFuZF90bHZzKHZvaWQgKm9zX2N0eCwgdm9pZCAqcGFyYW1fc3RydWNfcHRyLAorCQkJCSAgQV9VSU5UMzIgcGFyYW1fYnVmX2xlbiwKKwkJCQkgIEFfVUlOVDMyIHdtaV9jbWRfZXZlbnRfaWQsCisJCQkJICB2b2lkICoqd21pX2NtZF9zdHJ1Y3RfcHRyKTsKKworaW50Cit3bWl0bHZfY2hlY2tfYW5kX3BhZF9ldmVudF90bHZzKHZvaWQgKm9zX2N0eCwgdm9pZCAqcGFyYW1fc3RydWNfcHRyLAorCQkJCUFfVUlOVDMyIHBhcmFtX2J1Zl9sZW4sCisJCQkJQV9VSU5UMzIgd21pX2NtZF9ldmVudF9pZCwKKwkJCQl2b2lkICoqd21pX2NtZF9zdHJ1Y3RfcHRyKTsKKworLyoqIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBlbGVtZW50IGZvciB0aGUgVmVyc2lvbiBXaGl0ZUxpc3QKKyAqICB0YWJsZS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiBtYWpvcjsKKwlBX1VJTlQzMiBtaW5vcjsKKwlBX1VJTlQzMiBuYW1lc3BhY2VfMDsKKwlBX1VJTlQzMiBuYW1lc3BhY2VfMTsKKwlBX1VJTlQzMiBuYW1lc3BhY2VfMjsKKwlBX1VJTlQzMiBuYW1lc3BhY2VfMzsKK30gd21pX3doaXRlbGlzdF92ZXJzaW9uX2luZm87CisKK3N0cnVjdCBfd21pX2FiaV92ZXJzaW9uOyAgICAgICAgLyogRm9yd2FyZCBkZWNsYXJhdGlvbiB0byBtYWtlIHRoZSBBUk0gY29tcGlsZXIgaGFwcHkgKi8KKworaW50Cit3bWlfY21wX2FuZF9zZXRfYWJpX3ZlcnNpb24oaW50IG51bV93aGl0ZWxpc3QsCisJCQkgICAgd21pX3doaXRlbGlzdF92ZXJzaW9uX2luZm8gKgorCQkJICAgIHZlcnNpb25fd2hpdGVsaXN0X3RhYmxlLAorCQkJICAgIHN0cnVjdCBfd21pX2FiaV92ZXJzaW9uICpteV92ZXJzLAorCQkJICAgIHN0cnVjdCBfd21pX2FiaV92ZXJzaW9uICpvcHBfdmVycywKKwkJCSAgICBzdHJ1Y3QgX3dtaV9hYmlfdmVyc2lvbiAqb3V0X3ZlcnMpOworCitpbnQKK3dtaV92ZXJzaW9uc19hcmVfY29tcGF0aWJsZShzdHJ1Y3QgX3dtaV9hYmlfdmVyc2lvbiAqdmVyczEsCisJCQkgICAgc3RydWN0IF93bWlfYWJpX3ZlcnNpb24gKnZlcnMyKTsKKworI2VuZGlmIC8qX1dNSV9UTFZfSEVMUEVSX0hfKi8KZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvd21pX3VuaWZpZWQuaCBiL3RhcmdldC9pbmMvd21pX3VuaWZpZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njg0ZDMzCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy93bWlfdW5pZmllZC5oCkBAIC0wLDAgKzEsMTIyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgV01JQVBJCisgKioqQHsKKyAqLworCisvKiogQGZpbGUKKyAqIFRoaXMgZmlsZSBzcGVjaWZpZXMgdGhlIFdNSSBpbnRlcmZhY2UgZm9yIHRoZSAgU29mdHdhcmUgQXJjaGl0ZWN0dXJlLgorICoKKyAqIEl0IGluY2x1ZGVzIGRlZmluaXRpb25zIG9mIGFsbCB0aGUgY29tbWFuZHMgYW5kIGV2ZW50cy4gQ29tbWFuZHMgYXJlIG1lc3NhZ2VzCisgKiBmcm9tIHRoZSBob3N0IHRvIHRoZSB0YXJnZXQuIEV2ZW50cyBhbmQgUmVwbGllcyBhcmUgbWVzc2FnZXMgZnJvbSB0aGUgdGFyZ2V0CisgKiB0byB0aGUgaG9zdC4KKyAqCisgKiBPd25lcnNoaXAgb2YgY29ycmVjdG5lc3MgaW4gcmVnYXJkcyB0byBXTUkgY29tbWFuZHMKKyAqIGJlbG9uZ3MgdG8gdGhlIGhvc3QgZHJpdmVyIGFuZCB0aGUgdGFyZ2V0IGlzIG5vdCByZXF1aXJlZCB0byB2YWxpZGF0ZQorICogcGFyYW1ldGVycyBmb3IgdmFsdWUsIHByb3BlciByYW5nZSwgb3IgYW55IG90aGVyIGNoZWNraW5nLgorICoKKyAqIEd1aWRlbGluZXMgZm9yIGV4dGVuZGluZyB0aGlzIGludGVyZmFjZSBhcmUgYmVsb3cuCisgKgorICogMS4gQWRkIG5ldyBXTUkgY29tbWFuZHMgT05MWSB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZSAtIDB4OTAwMCAtIDB4OWZmZgorICogMi4gVXNlIE9OTFkgQV9VSU5UMzIgdHlwZSBmb3IgZGVmaW5pbmcgbWVtYmVyIHZhcmlhYmxlcyB3aXRoaW4gV01JIGNvbW1hbmQvZXZlbnQKKyAqICAgIHN0cnVjdHVyZXMuIERvIG5vdCB1c2UgQV9VSU5UOCwgQV9VSU5UMTYsIEFfQk9PTCBvciBlbnVtIHR5cGVzIHdpdGhpbiB0aGVzZSBzdHJ1Y3R1cmVzLgorICogMy4gRE8gTk9UIGRlZmluZSBiaXQgZmllbGRzIHdpdGhpbiBzdHJ1Y3R1cmVzLiBJbXBsZW1lbnQgYml0IGZpZWxkcyB1c2luZyBtYXNrcworICogICAgaWYgbmVjZXNzYXJ5LiBEbyBub3QgdXNlIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSdzIGJpdCBmaWVsZCBkZWZpbml0aW9uLgorICogNC4gRGVmaW5lIG1hY3JvcyBmb3IgZW5jb2RlL2RlY29kZSBvZiBBX1VJTlQ4LCBBX1VJTlQxNiBmaWVsZHMgd2l0aGluIHRoZSBBX1VJTlQzMgorICogICAgdmFyaWFibGVzLiBVc2UgdGhlc2UgbWFjcm9zIGZvciBzZXQvZ2V0IG9mIHRoZXNlIGZpZWxkcy4gVHJ5IHRvIHVzZSB0aGlzIHRvCisgKiAgICBvcHRpbWl6ZSB0aGUgc3RydWN0dXJlIHdpdGhvdXQgYmxvYXRpbmcgaXQgd2l0aCBBX1VJTlQzMiB2YXJpYWJsZXMgZm9yIGV2ZXJ5IGxvd2VyCisgKiAgICBzaXplZCBmaWVsZC4KKyAqIDUuIERvIG5vdCB1c2UgUEFDSy9VTlBBQ0sgYXR0cmlidXRlcyBmb3IgdGhlIHN0cnVjdHVyZXMgYXMgZWFjaCBtZW1iZXIgdmFyaWFibGUgaXMKKyAqICAgIGFscmVhZHkgNC1ieXRlIGFsaWduZWQgYnkgdmlydHVlIG9mIGJlaW5nIGEgQV9VSU5UMzIgdHlwZS4KKyAqIDYuIENvbW1lbnQgZWFjaCBwYXJhbWV0ZXIgcGFydCBvZiB0aGUgV01JIGNvbW1hbmQvZXZlbnQgc3RydWN0dXJlIGJ5IHVzaW5nIHRoZQorICogICAgMiBzdGFycyBhdCB0aGUgYmVnaW5pbmcgb2YgQyBjb21tZW50IGluc3RlYWQgb2Ygb25lIHN0YXIgdG8gZW5hYmxlIEhUTUwgZG9jdW1lbnQKKyAqICAgIGdlbmVyYXRpb24gdXNpbmcgRG94eWdlbi4KKyAqCisgKi8KKworI2lmbmRlZiBfV01JX1VOSUZJRURfSF8KKyNkZWZpbmUgX1dNSV9VTklGSUVEX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHdsYW5fZGVmcy5oPgorI2luY2x1ZGUgPHdtaV9zZXJ2aWNlcy5oPgorI2luY2x1ZGUgPGRiZ2xvZy5oPgorCisjZGVmaW5lIEFUSF9NQUNfTEVOICAgICAgICAgICAgIDYgICAgICAgICAgICAgICAvKio8IGxlbmd0aCBvZiBNQUMgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgV01JX0VWRU5UX1NUQVRVU19TVUNDRVNTIDAgICAgICAvKiBTdWNjZXNzIHJldHVybiBzdGF0dXMgdG8gaG9zdCAqLworI2RlZmluZSBXTUlfRVZFTlRfU1RBVFVTX0ZBSUxVUkUgMSAgICAgIC8qIEZhaWx1cmUgcmV0dXJuIHN0YXR1cyB0byBob3N0ICovCisKKyNkZWZpbmUgTUFYX1RYX1JBVEVfVkFMVUVTICAgICAgMTAgICAgICAvKk1heCBUeCBSYXRlcyAqLworI2RlZmluZSBNQVhfUlNTSV9WQUxVRVMgICAgICAgICAxMCAgICAgIC8qTWF4IFJzc2kgdmFsdWVzICovCisKKy8qIFRoZSBXTEFOX01BWF9BQyBtYWNybyBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0IGJyZWFraW5nCisgKiBXTUkgY29tcGF0aWJpbGl0eS4KKyAqIFRoZSBtYXhpbXVtIHZhbHVlIG9mIGFjY2VzcyBjYXRlZ29yeQorICovCisjZGVmaW5lIFdMQU5fTUFYX0FDICA0CisKKy8qCisgKiBUaGVzZSBkb24ndCBuZWNlc3NhcmlseSBiZWxvbmcgaGVyZTsgYnV0IGFzIHRoZSBNUy9TTSBtYWNyb3MgcmVxdWlyZQorICogYXI2MDAwX2ludGVybmFsLmggdG8gYmUgaW5jbHVkZWQsIGl0IG1heSBub3QgYmUgZGVmaW5lZCBhcyB5ZXQuCisgKi8KKyNkZWZpbmUgV01JX0ZfTVMoX3YsIF9mKQkJCQkJICAgIFwKKwkoICgoX3YpICYgKF9mKSkgPj4gKF9mICMjIF9TKSApCisKKy8qCisgKiBUaGlzIGJyZWFrcyB0aGUgImdvb2QgbWFjcm8gcHJhY3RpY2UiIG9mIG9ubHkgcmVmZXJlbmNpbmcgZWFjaAorICogbWFjcm8gZmllbGQgb25jZSAodG8gYXZvaWQgdGhpbmdzIGxpa2UgZmllbGQrKyBmcm9tIGNhdXNpbmcgaXNzdWVzLikKKyAqLworI2RlZmluZSBXTUlfRl9STVcoX3ZhciwgX3YsIF9mKQkJCQkJICAgIFwKKwlkbyB7CQkJCQkJCVwKKwkJKF92YXIpICY9IH4oX2YpOwkJCQkgICAgXAorCQkoX3ZhcikgfD0gKCAoKF92KSA8PCAoX2YgIyMgX1MpKSAmIChfZikpOwkgICAgICBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBXTUlfR0VUX0JJVFMoX3ZhbCwgX2luZGV4LCBfbnVtX2JpdHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKChfdmFsKSA+PiAoX2luZGV4KSkgJiAoKDEgPDwgKF9udW1fYml0cykpIC0gMSkpCisKKyNkZWZpbmUgV01JX1NFVF9CSVRTKF92YXIsIF9pbmRleCwgX251bV9iaXRzLCBfdmFsKSBkbyB7ICAgICAgICAgICAgICAgXAorCQkoX3ZhcikgJj0gfigoKDEgPDwgKF9udW1fYml0cykpIC0gMSkgPDwgKF9pbmRleCkpOyAgICAgICAgICAgXAorCQkoX3ZhcikgfD0gKCgoX3ZhbCkgJiAoKDEgPDwgKF9udW1fYml0cykpIC0gMSkpIDw8IChfaW5kZXgpKTsgXAorCX0gd2hpbGUgKDApCisKKy8qKgorICogQSBwYWNrZWQgYXJyYXkgaXMgYW4gYXJyYXkgd2hlcmUgZWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgbGVzcyB0aGFuCisgKiBvciBlcXVhbCB0byAxNiBiaXRzLCBhbmQgdGhlIGVudHJpZXMgYXJlIHN0dWZmZWQgaW50byBhbiBBX1VJTlQzMiBhcnJheS4KKyAqIEZvciBleGFtcGxlLCBpZiBlYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyAxMSBiaXRzLCB0aGVuIHlvdSBjYW4gc3R1ZmYKKyAqIGFuIGFycmF5IG9mIDQgMTEtYml0IHZhbHVlcyBpbnRvIGFuIGFycmF5IG9mIDIgQV9VSU5UMzIgdmFsdWVzLgorICogVGhlIGZpcnN0IDIgMTEtYml0IHZhbHVlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZmlyc3QgQV9VSU5UMzIsCisgKiBhbmQgdGhlIGxhc3QgMiAxMS1iaXQgdmFsdWVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBzZWNvbmQgQV9VSU5UMzIuCisgKi8KKyNkZWZpbmUgV01JX1BBQ0tFRF9BUlJfU0laRShudW1fZW50cmllcywgYml0c19wZXJfZW50cnkpIFwKKwkoKChudW1fZW50cmllcykgLyAoMzIgLyAoYml0c19wZXJfZW50cnkpKSkgKyAgICAgICAgICAgIFwKKwkoKChudW1fZW50cmllcykgJSAoMzIgLyAoYml0c19wZXJfZW50cnkpKSkgPyAxIDogMCkpCisKK3N0YXRpYyBJTkxJTkUgQV9VSU5UMzIgd21pX3BhY2tlZF9hcnJfZ2V0X2JpdHMoQV9VSU5UMzIgKiBhcnIsCisJCQlBX1VJTlQzMiBlbnRyeV9pbmRleCwgQV9VSU5UMzIgYml0c19wZXJfZW50cnkpCit7CisJQV9VSU5UMzIgZW50cmllc19wZXJfdWludCA9ICgzMiAvIGJpdHNfcGVyX2VudHJ5KTsKKwlBX1VJTlQzMiB1aW50X2luZGV4ID0gKGVudHJ5X2luZGV4IC8gZW50cmllc19wZXJfdWludCk7CisJQV9VSU5UMzIgbnVtX2VudHJpZXNfaW5fcHJldl91aW50cyA9ICh1aW50X2luZGV4ICogZW50cmllc19wZXJfdWludCk7CisJQV9VSU5UMzIgaW5kZXhfaW5fdWludCA9IChlbnRyeV9pbmRleCAtIG51bV9lbnRyaWVzX2luX3ByZXZfdWludHMpOworCUFfVUlOVDMyIHN0YXJ0X2JpdF9pbl91aW50ID0gKGluZGV4X2luX3VpbnQgKiBiaXRzX3Blcl9lbnRyeSk7CisJcmV0dXJuICgoYXJyW3VpbnRfaW5kZXhdID4+IHN0YXJ0X2JpdF9pbl91aW50KSAmCisJCSgoMSA8PCBiaXRzX3Blcl9lbnRyeSkgLSAxKSk7Cit9CisKK3N0YXRpYyBJTkxJTkUgdm9pZCB3bWlfcGFja2VkX2Fycl9zZXRfYml0cyhBX1VJTlQzMiAqYXJyLCBBX1VJTlQzMiBlbnRyeV9pbmRleCwKKwkJCUFfVUlOVDMyIGJpdHNfcGVyX2VudHJ5LCBBX1VJTlQzMiB2YWwpCit7CisJQV9VSU5UMzIgZW50cmllc19wZXJfdWludCA9ICgzMiAvIGJpdHNfcGVyX2VudHJ5KTsKKwlBX1VJTlQzMiB1aW50X2luZGV4ID0gKGVudHJ5X2luZGV4IC8gZW50cmllc19wZXJfdWludCk7CisJQV9VSU5UMzIgbnVtX2VudHJpZXNfaW5fcHJldl91aW50cyA9ICh1aW50X2luZGV4ICogZW50cmllc19wZXJfdWludCk7CisJQV9VSU5UMzIgaW5kZXhfaW5fdWludCA9IChlbnRyeV9pbmRleCAtIG51bV9lbnRyaWVzX2luX3ByZXZfdWludHMpOworCUFfVUlOVDMyIHN0YXJ0X2JpdF9pbl91aW50ID0gKGluZGV4X2luX3VpbnQgKiBiaXRzX3Blcl9lbnRyeSk7CisKKwlhcnJbdWludF9pbmRleF0gJj0gfigoKDEgPDwgYml0c19wZXJfZW50cnkpIC0gMSkgPDwgc3RhcnRfYml0X2luX3VpbnQpOworCWFyclt1aW50X2luZGV4XSB8PQorCQkoKHZhbCAmICgoMSA8PCBiaXRzX3Blcl9lbnRyeSkgLSAxKSkgPDwgc3RhcnRfYml0X2luX3VpbnQpOworfQorCisvKiogMiB3b3JkIHJlcHJlc2VudGF0aW9uIG9mIE1BQyBhZGRyICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIHVwcGVyIDQgYnl0ZXMgb2YgIE1BQyBhZGRyZXNzICovCisJQV9VSU5UMzIgbWFjX2FkZHIzMXRvMDsKKwkvKiogbG93ZXIgMiBieXRlcyBvZiAgTUFDIGFkZHJlc3MgKi8KKwlBX1VJTlQzMiBtYWNfYWRkcjQ3dG8zMjsKK30gd21pX21hY19hZGRyOworCisvKiogbWFjcm8gdG8gY29udmVydCBNQUMgYWRkcmVzcyBmcm9tIFdNSSB3b3JkIGZvcm1hdCB0byBjaGFyIGFycmF5ICovCisjZGVmaW5lIFdNSV9NQUNfQUREUl9UT19DSEFSX0FSUkFZKHB3bWlfbWFjX2FkZHIsY19tYWNhZGRyKSBkbyB7CSAgICAgICBcCisJCShjX21hY2FkZHIpWzBdID0gICAgKChwd21pX21hY19hZGRyKS0+bWFjX2FkZHIzMXRvMCkgJiAweGZmOwkgXAorCQkoY19tYWNhZGRyKVsxXSA9ICAoICgocHdtaV9tYWNfYWRkciktPm1hY19hZGRyMzF0bzApID4+IDgpICYgMHhmZjsgXAorCQkoY19tYWNhZGRyKVsyXSA9ICAoICgocHdtaV9tYWNfYWRkciktPm1hY19hZGRyMzF0bzApID4+IDE2KSAmIDB4ZmY7IFwKKwkJKGNfbWFjYWRkcilbM10gPSAgKCAoKHB3bWlfbWFjX2FkZHIpLT5tYWNfYWRkcjMxdG8wKSA+PiAyNCkgJiAweGZmOyAgXAorCQkoY19tYWNhZGRyKVs0XSA9ICAgICgocHdtaV9tYWNfYWRkciktPm1hY19hZGRyNDd0bzMyKSAmIDB4ZmY7CSAgICAgXAorCQkoY19tYWNhZGRyKVs1XSA9ICAoICgocHdtaV9tYWNfYWRkciktPm1hY19hZGRyNDd0bzMyKSA+PiA4KSAmIDB4ZmY7IFwKK30gd2hpbGUoMCkKKworLyoqIG1hY3JvIHRvIGNvbnZlcnQgTUFDIGFkZHJlc3MgZnJvbSBjaGFyIGFycmF5IHRvIFdNSSB3b3JkIGZvcm1hdCAqLworI2RlZmluZSBXTUlfQ0hBUl9BUlJBWV9UT19NQUNfQUREUihjX21hY2FkZHIscHdtaV9tYWNfYWRkcikgIGRvIHsgXAorCQkocHdtaV9tYWNfYWRkciktPm1hY19hZGRyMzF0bzAgID0JCQkJICAgIFwKKwkJCSggKGNfbWFjYWRkcilbMF0gfCAoKGNfbWFjYWRkcilbMV0gPDwgOCkJCQkgICBcCisJCQkgIHwgKChjX21hY2FkZHIpWzJdIDw8IDE2KSB8ICgoY19tYWNhZGRyKVszXSA8PCAyNCkgKTsJICAgICAgIFwKKwkJKHB3bWlfbWFjX2FkZHIpLT5tYWNfYWRkcjQ3dG8zMiAgPQkJCQkgICAgXAorCQkJKCAoY19tYWNhZGRyKVs0XSB8ICgoY19tYWNhZGRyKVs1XSA8PCA4KSk7CSAgICAgICBcCit9IHdoaWxlKDApCisKKy8qCisgKiB3bWkgY29tbWFuZCBncm91cHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJLyogMCB0byAyIGFyZSByZXNlcnZlZCAqLworCVdNSV9HUlBfU1RBUlQgPSAweDMsCisJV01JX0dSUF9TQ0FOID0gV01JX0dSUF9TVEFSVCwKKwlXTUlfR1JQX1BERVYsCisJV01JX0dSUF9WREVWLAorCVdNSV9HUlBfUEVFUiwKKwlXTUlfR1JQX01HTVQsCisJV01JX0dSUF9CQV9ORUcsCisJV01JX0dSUF9TVEFfUFMsCisJV01JX0dSUF9ERlMsCisJV01JX0dSUF9ST0FNLAorCVdNSV9HUlBfT0ZMX1NDQU4sCisJV01JX0dSUF9QMlAsCisJV01JX0dSUF9BUF9QUywKKwlXTUlfR1JQX1JBVEVfQ1RSTCwKKwlXTUlfR1JQX1BST0ZJTEUsCisJV01JX0dSUF9TVVNQRU5ELAorCVdNSV9HUlBfQkNOX0ZJTFRFUiwKKwlXTUlfR1JQX1dPVywKKwlXTUlfR1JQX1JUVCwKKwlXTUlfR1JQX1NQRUNUUkFMLAorCVdNSV9HUlBfU1RBVFMsCisJV01JX0dSUF9BUlBfTlNfT0ZMLAorCVdNSV9HUlBfTkxPX09GTCwKKwlXTUlfR1JQX0dUS19PRkwsCisJV01JX0dSUF9DU0FfT0ZMLAorCVdNSV9HUlBfQ0hBVFRFUiwKKwlXTUlfR1JQX1RJRF9BRERCQSwKKwlXTUlfR1JQX01JU0MsCisJV01JX0dSUF9HUElPLAorCVdNSV9HUlBfRldURVNULAorCVdNSV9HUlBfVERMUywKKwlXTUlfR1JQX1JFU01HUiwKKwlXTUlfR1JQX1NUQV9TTVBTLAorCVdNSV9HUlBfV0xBTl9IQiwKKwlXTUlfR1JQX1JNQywKKwlXTUlfR1JQX01IRl9PRkwsCisJV01JX0dSUF9MT0NBVElPTl9TQ0FOLAorCVdNSV9HUlBfT0VNLAorCVdNSV9HUlBfTkFOLAorCVdNSV9HUlBfQ09FWCwKKwlXTUlfR1JQX09CU1NfT0ZMLAorCVdNSV9HUlBfTFBJLAorCVdNSV9HUlBfRVhUU0NBTiwKKwlXTUlfR1JQX0RIQ1BfT0ZMLAorCVdNSV9HUlBfSVBBLAorCVdNSV9HUlBfTUROU19PRkwsCisJV01JX0dSUF9TQVBfT0ZMLAorCVdNSV9HUlBfT0NCLAorCVdNSV9HUlBfU09DLAorCVdNSV9HUlBfUEtUX0ZJTFRFUiwKKwlXTUlfR1JQX01BV0MsCisJV01JX0dSUF9QTUZfT0ZGTE9BRCwKK30gV01JX0dSUF9JRDsKKworI2RlZmluZSBXTUlfQ01EX0dSUF9TVEFSVF9JRChncnBfaWQpICgoKGdycF9pZCkgPDwgMTIpIHwgMHgxKQorI2RlZmluZSBXTUlfRVZUX0dSUF9TVEFSVF9JRChncnBfaWQpICgoKGdycF9pZCkgPDwgMTIpIHwgMHgxKQorCisvKioKKyAqIENvbW1hbmQgSURzIGFuZCBjb21tYW5nZSBldmVudHMKKyAqLwordHlwZWRlZiBlbnVtIHsKKwkvKiogaW5pdGlhbGl6ZSB0aGUgd2xhbiBzdWIgc3lzdGVtICovCisJV01JX0lOSVRfQ01ESUQgPSAweDEsCisKKwkvKiBTY2FuIHNwZWNpZmljIGNvbW1hbmRzICovCisKKwkvKiogc3RhcnQgc2NhbiByZXF1ZXN0IHRvIEZXICAqLworCVdNSV9TVEFSVF9TQ0FOX0NNRElEID0gV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9TQ0FOKSwKKwkvKiogc3RvcCBzY2FuIHJlcXVlc3QgdG8gRlcgICovCisJV01JX1NUT1BfU0NBTl9DTURJRCwKKwkvKiogZnVsbCBsaXN0IG9mIGNoYW5uZWxzIGFzIGRlZmluZWQgYnkgdGhlIHJlZ3VsYXRvcnkgdGhhdCB3aWxsIGJlIHVzZWQgYnkgc2Nhbm5lciAgICovCisJV01JX1NDQU5fQ0hBTl9MSVNUX0NNRElELAorCS8qKiBvdmVyd3JpdGUgZGVmYXVsdCBwcmlvcml0eSB0YWJsZSBpbiBzY2FuIHNjaGVkdWxlciAgICovCisJV01JX1NDQU5fU0NIX1BSSU9fVEJMX0NNRElELAorCS8qKiBUaGlzIGNvbW1hbmQgdG8gYWRqdXN0IHRoZSBwcmlvcml0eSBhbmQgbWluLm1heF9yZXN0X3RpbWUKKwkgKiBvZiBhbiBvbiBvbmdvaW5nIHNjYW4gcmVxdWVzdC4KKwkgKi8KKwlXTUlfU0NBTl9VUERBVEVfUkVRVUVTVF9DTURJRCwKKworCS8qKiBzZXQgT1VJIHRvIGJlIHVzZWQgaW4gcHJvYmUgcmVxdWVzdCBpZiBlbmFibGVkICovCisJV01JX1NDQU5fUFJPQl9SRVFfT1VJX0NNRElELAorCisJLyogUERFVihwaHlzaWNhbCBkZXZpY2UpIHNwZWNpZmljIGNvbW1hbmRzICovCisJLyoqIHNldCByZWd1bGF0b3J0eSBjdGwgaWQgdXNlZCBieSBGVyB0byBkZXRlcm1pbmUgdGhlIGV4YWN0IGN0bCBwb3dlciBsaW1pdHMgKi8KKwlXTUlfUERFVl9TRVRfUkVHRE9NQUlOX0NNRElEID0KKwkJV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9QREVWKSwKKwkvKiogc2V0IGNoYW5uZWwuIG1haW5seSB1c2VkIGZvciBzdXBwb3J0aW5nIG1vbml0b3IgbW9kZSAqLworCVdNSV9QREVWX1NFVF9DSEFOTkVMX0NNRElELAorCS8qKiBzZXQgcGRldiBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJV01JX1BERVZfU0VUX1BBUkFNX0NNRElELAorCS8qKiBlbmFibGUgcGFja2V0IGxvZyAqLworCVdNSV9QREVWX1BLVExPR19FTkFCTEVfQ01ESUQsCisJLyoqIGRpc2FibGUgcGFja2V0IGxvZyovCisJV01JX1BERVZfUEtUTE9HX0RJU0FCTEVfQ01ESUQsCisJLyoqIHNldCB3bW0gcGFyYW1ldGVycyAqLworCVdNSV9QREVWX1NFVF9XTU1fUEFSQU1TX0NNRElELAorCS8qKiBzZXQgSFQgY2FwIGllIHRoYXQgbmVlZHMgdG8gYmUgY2FycmllZCBwcm9iZSByZXF1ZXN0cyBIVC9WSFQgY2hhbm5lbHMgKi8KKwlXTUlfUERFVl9TRVRfSFRfQ0FQX0lFX0NNRElELAorCS8qKiBzZXQgVkhUIGNhcCBpZSB0aGF0IG5lZWRzIHRvIGJlIGNhcnJpZWQgb24gcHJvYmUgcmVxdWVzdHMgb24gVkhUIGNoYW5uZWxzICovCisJV01JX1BERVZfU0VUX1ZIVF9DQVBfSUVfQ01ESUQsCisKKwkvKiogQ29tbWFuZCB0byBzZW5kIHRoZSBEU0NQLXRvLVRJRCBtYXAgdG8gdGhlIHRhcmdldCAqLworCVdNSV9QREVWX1NFVF9EU0NQX1RJRF9NQVBfQ01ESUQsCisJLyoqIHNldCBxdWlldCBpZSBwYXJhbWV0ZXJzLiBwcmltYXJpbHkgdXNlZCBpbiBBUCBtb2RlICovCisJV01JX1BERVZfU0VUX1FVSUVUX01PREVfQ01ESUQsCisJLyoqIEVuYWJsZS9EaXNhYmxlIEdyZWVuIEFQIFBvd2VyIFNhdmUgICovCisJV01JX1BERVZfR1JFRU5fQVBfUFNfRU5BQkxFX0NNRElELAorCS8qKiBnZXQgVFBDIGNvbmZpZyBmb3IgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwgKi8KKwlXTUlfUERFVl9HRVRfVFBDX0NPTkZJR19DTURJRCwKKworCS8qKiBzZXQgdGhlIGJhc2UgTUFDIGFkZHJlc3MgZm9yIHRoZSBwaHlzaWNhbCBkZXZpY2UgYmVmb3JlIGEgVkRFViBpcyBjcmVhdGVkLgorCSAqICBGb3IgZmlybXdhcmUgdGhhdCBkb2Vzbid0IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGFuZCB0aGlzIGNvbW1hbmQsIHRoZSBwZGV2CisJICogIE1BQyBhZGRyZXNzIHdpbGwgbm90IGJlIGNoYW5nZWQuICovCisJV01JX1BERVZfU0VUX0JBU0VfTUFDQUREUl9DTURJRCwKKworCS8qIGVlcHJvbSBjb250ZW50IGR1bXAgLCB0aGUgc2FtZSB0byBiZGJvYXJkIGRhdGEgKi8KKwlXTUlfUERFVl9EVU1QX0NNRElELAorCS8qIHNldCBMRUQgY29uZmlndXJhdGlvbiAgKi8KKwlXTUlfUERFVl9TRVRfTEVEX0NPTkZJR19DTURJRCwKKwkvKiBHZXQgQ3VycmVudCB0ZW1wcmF0dXJlIG9mIGNoaXAgaW4gQ2VsY2l1cyBkZWdyZWUgKi8KKwlXTUlfUERFVl9HRVRfVEVNUEVSQVRVUkVfQ01ESUQsCisJLyogU2V0IExFRCBmbGFzaGluZyBiZWhhdmlvciAgKi8KKwlXTUlfUERFVl9TRVRfTEVEX0ZMQVNISU5HX0NNRElELAorCisJLyogVkRFVih2aXJ0dWFsIGRldmljZSkgc3BlY2lmaWMgY29tbWFuZHMgKi8KKwkvKiogdmRldiBjcmVhdGUgKi8KKwlXTUlfVkRFVl9DUkVBVEVfQ01ESUQgPSBXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX1ZERVYpLAorCS8qKiB2ZGV2IGRlbGV0ZSAqLworCVdNSV9WREVWX0RFTEVURV9DTURJRCwKKwkvKiogdmRldiBzdGFydCByZXF1ZXN0ICovCisJV01JX1ZERVZfU1RBUlRfUkVRVUVTVF9DTURJRCwKKwkvKiogdmRldiByZXN0YXJ0IHJlcXVlc3QgKFJYIG9ubHksIE5PIFRYLCB1c2VkIGZvciBDQUMgcGVyaW9kKSovCisJV01JX1ZERVZfUkVTVEFSVF9SRVFVRVNUX0NNRElELAorCS8qKiB2ZGV2IHVwIHJlcXVlc3QgKi8KKwlXTUlfVkRFVl9VUF9DTURJRCwKKwkvKiogdmRldiBzdG9wIHJlcXVlc3QgKi8KKwlXTUlfVkRFVl9TVE9QX0NNRElELAorCS8qKiB2ZGV2IGRvd24gcmVxdWVzdCAqLworCVdNSV9WREVWX0RPV05fQ01ESUQsCisJLyogc2V0IGEgdmRldiBwYXJhbSAqLworCVdNSV9WREVWX1NFVF9QQVJBTV9DTURJRCwKKwkvKiBzZXQgYSBrZXkgKHVzZWQgZm9yIHNldHRpbmcgcGVyIHBlZXIgdW5pY2FzdCBhbmQgcGVyIHZkZXYgbXVsdGljYXN0KSAqLworCVdNSV9WREVWX0lOU1RBTExfS0VZX0NNRElELAorCisJLyogd25tIHNsZWVwIG1vZGUgY29tbWFuZCAqLworCVdNSV9WREVWX1dOTV9TTEVFUE1PREVfQ01ESUQsCisJV01JX1ZERVZfV01NX0FERFRTX0NNRElELAorCVdNSV9WREVWX1dNTV9ERUxUU19DTURJRCwKKwlXTUlfVkRFVl9TRVRfV01NX1BBUkFNU19DTURJRCwKKwlXTUlfVkRFVl9TRVRfR1RYX1BBUkFNU19DTURJRCwKKwlXTUlfVkRFVl9JUFNFQ19OQVRLRUVQQUxJVkVfRklMVEVSX0NNRElELAorCisJV01JX1ZERVZfUExNUkVRX1NUQVJUX0NNRElELAorCVdNSV9WREVWX1BMTVJFUV9TVE9QX0NNRElELAorCS8qIFRTRiB0aW1lc3RhbXAgYWN0aW9uIGZvciBzcGVjaWZpZWQgdmRldiAqLworCVdNSV9WREVWX1RTRl9UU1RBTVBfQUNUSU9OX0NNRElELAorCS8qCisJICogc2V0IHRoZSBjYXBhYmlsdGllcyBJRSwgZS5nLiBmb3IgZXh0ZW5kZWQgY2FwcyBpbiBwcm9iZQorCSAqIHJlcXVlc3RzLCBhc3NvYyByZXEgZXRjIGZvciBmcmFtZXMgRlcgbG9jYWxseSBnZW5lcmF0ZXMKKwkgKi8KKwlXTUlfVkRFVl9TRVRfSUVfQ01ESUQsCisKKwkvKiBwZWVyIHNwZWNpZmljIGNvbW1hbmRzICovCisKKwkvKiogY3JlYXRlIGEgcGVlciAqLworCVdNSV9QRUVSX0NSRUFURV9DTURJRCA9IFdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfUEVFUiksCisJLyoqIGRlbGV0ZSBhIHBlZXIgKi8KKwlXTUlfUEVFUl9ERUxFVEVfQ01ESUQsCisJLyoqIGZsdXNoIHNwZWNpZmljICB0aWQgcXVldWVzIG9mIGEgcGVlciAqLworCVdNSV9QRUVSX0ZMVVNIX1RJRFNfQ01ESUQsCisJLyoqIHNldCBhIHBhcmFtZXRlciBvZiBhIHBlZXIgKi8KKwlXTUlfUEVFUl9TRVRfUEFSQU1fQ01ESUQsCisJLyoqIHNldCBwZWVyIHRvIGFzc29jaWF0ZWQgc3RhdGUuIHdpbGwgY2FyeSBhbGwgcGFyYW1ldGVycyBkZXRlcm1pbmVkIGR1cmluZyBhc3NvY2ljYXRpb24gdGltZSAqLworCVdNSV9QRUVSX0FTU09DX0NNRElELAorCS8qKmFkZCBhIHdkcyAgKDQgYWRkcmVzcyApIGVudHJ5LiB1c2VkIG9ubHkgZm9yIHRlc3RpbmcgV0RTIGZlYXR1cmUgb24gQVAgcHJvZHVjdHMgKi8KKwlXTUlfUEVFUl9BRERfV0RTX0VOVFJZX0NNRElELAorCS8qKnJlbW92ZSB3ZHMgICg0IGFkZHJlc3MgKSBlbnRyeS4gdXNlZCBvbmx5IGZvciB0ZXN0aW5nIFdEUyBmZWF0dXJlIG9uIEFQIHByb2R1Y3RzICovCisJV01JX1BFRVJfUkVNT1ZFX1dEU19FTlRSWV9DTURJRCwKKwkvKiogc2V0IHVwIG1jYXN0IGdyb3VwIGluZm9yIGZvciBtdWx0aWNhc3QgdG8gdW5pY2FzdCBjb252ZXJzaW9uICovCisJV01JX1BFRVJfTUNBU1RfR1JPVVBfQ01ESUQsCisJLyoqIHJlcXVlc3QgcGVlciBpbmZvIGZyb20gRlcuIEZXIHNoYWxsIHJlc3BvbmQgd2l0aCBQRUVSX0lORk9fRVZFTlRJRCAqLworCVdNSV9QRUVSX0lORk9fUkVRX0NNRElELAorCisJLyoqIHJlcXVlc3QgdGhlIGVzdGltYXRlZCBsaW5rIHNwZWVkIGZvciB0aGUgcGVlci4gRlcgc2hhbGwgcmVzcG9uZCB3aXRoCisJICogIFdNSV9QRUVSX0VTVElNQVRFRF9MSU5LU1BFRURfRVZFTlRJRC4KKwkgKi8KKwlXTUlfUEVFUl9HRVRfRVNUSU1BVEVEX0xJTktTUEVFRF9DTURJRCwKKwkvKgorCSAqIFNldCB0aGUgY29uZGl0aW9ucyB0byByZXBvcnQgcGVlciBqdXN0aWZpZWQgcmF0ZSB0byBkcml2ZXIKKwkgKiBUaGUganVzdGlmaWVkIHJhdGUgbWVhbnMgdGhlIHRoZSB1c2VyLXJhdGUgaXMganVzdGlmaWVkIGJ5IFBFUi4KKwkqLworCVdNSV9QRUVSX1NFVF9SQVRFX1JFUE9SVF9DT05ESVRJT05fQ01ESUQsCisJLyogYmVhY29uL21hbmFnZW1lbnQgc3BlY2lmaWMgY29tbWFuZHMgKi8KKworCS8qKiB0cmFuc21pdCBiZWFjb24gYnkgcmVmZXJlbmNlIC4gdXNlZCBmb3IgdHJhbnNtaXR0aW5nIGJlYWNvbiBvbiBsb3cgbGF0ZW5jeSBpbnRlcmZhY2UgbGlrZSBwY2llICovCisJV01JX0JDTl9UWF9DTURJRCA9IFdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfTUdNVCksCisJLyoqIHRyYW5zbWl0IGJlYWNvbiBieSB2YWx1ZSAqLworCVdNSV9QREVWX1NFTkRfQkNOX0NNRElELAorCS8qKiBzZXQgdGhlIGJlYWNvbiB0ZW1wbGF0ZS4gdXNlZCBpbiBiZWFjb24gb2ZmbG9hZCBtb2RlIHRvIHNldHVwIHRoZQorCSAqICB0aGUgY29tbW9uIGJlYWNvbiB0ZW1wbGF0ZSB3aXRoIHRoZSBGVyB0byBiZSB1c2VkIGJ5IEZXIHRvIGdlbmVyYXRlIGJlYWNvbnMgKi8KKwlXTUlfQkNOX1RNUExfQ01ESUQsCisJLyoqIHNldCBiZWFjb24gZmlsdGVyIHdpdGggRlcgKi8KKwlXTUlfQkNOX0ZJTFRFUl9SWF9DTURJRCwKKwkvKiBlbmFibGUvZGlzYWJsZSBmaWx0ZXJpbmcgb2YgcHJvYmUgcmVxdWVzdHMgaW4gdGhlIGZpcm13YXJlICovCisJV01JX1BSQl9SRVFfRklMVEVSX1JYX0NNRElELAorCS8qKiB0cmFuc21pdCBtYW5hZ2VtZW50IGZyYW1lIGJ5IHZhbHVlLiB3aWxsIGJlIGRlcHJlY2F0ZWQgKi8KKwlXTUlfTUdNVF9UWF9DTURJRCwKKwkvKiogc2V0IHRoZSBwcm9iZSByZXNwb25zZSB0ZW1wbGF0ZS4gdXNlZCBpbiBiZWFjb24gb2ZmbG9hZCBtb2RlIHRvIHNldHVwIHRoZQorCSAqICB0aGUgY29tbW9uIHByb2JlIHJlc3BvbnNlIHRlbXBsYXRlIHdpdGggdGhlIEZXIHRvIGJlIHVzZWQgYnkgRlcgdG8gZ2VuZXJhdGUKKwkgKiAgcHJvYmUgcmVzcG9uc2VzICovCisJV01JX1BSQl9UTVBMX0NNRElELAorCS8qKiBUcmFuc21pdCBNZ210IGZyYW1lIGJ5IHJlZmVyZW5jZSAqLworCVdNSV9NR01UX1RYX1NFTkRfQ01ESUQsCisKKwkvKiogY29tbWFuZHMgdG8gZGlyZWN0bHkgY29udHJvbCBiYSBuZWdvdGlhdGlvbiBkaXJlY3RseSBmcm9tIGhvc3QuIG9ubHkgdXNlZCBpbiB0ZXN0IG1vZGUgKi8KKworCS8qKiB0dXJuIG9mZiBGVyBBdXRvIGFkZGJhIG1vZGUgYW5kIGxldCBob3N0IGNvbnRyb2wgYWRkYmEgKi8KKwlXTUlfQUREQkFfQ0xFQVJfUkVTUF9DTURJRCA9CisJCVdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfQkFfTkVHKSwKKwkvKiogc2VuZCBhZGQgYmEgcmVxdWVzdCAqLworCVdNSV9BRERCQV9TRU5EX0NNRElELAorCVdNSV9BRERCQV9TVEFUVVNfQ01ESUQsCisJLyoqIHNlbmQgZGVsIGJhICovCisJV01JX0RFTEJBX1NFTkRfQ01ESUQsCisJLyoqIHNldCBhZGQgYmEgcmVzcG9uc2Ugd2lsbCBiZSB1c2VkIGJ5IEZXIHRvIGdlbmVyYXRlIGFkZGJhIHJlc3BvbnNlKi8KKwlXTUlfQUREQkFfU0VUX1JFU1BfQ01ESUQsCisJLyoqIHNlbmQgc2luZ2xlIFZIVCBNUERVIHdpdGggQU1TRFUgKi8KKwlXTUlfU0VORF9TSU5HTEVBTVNEVV9DTURJRCwKKworCS8qKiBTdGF0aW9uIHBvd2VyIHNhdmUgc3BlY2lmaWMgY29uZmlnICovCisJLyoqIGVuYWJsZS9kaXNhYmxlIHN0YXRpb24gcG93ZXJzYXZlICovCisJV01JX1NUQV9QT1dFUlNBVkVfTU9ERV9DTURJRCA9CisJCVdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfU1RBX1BTKSwKKwkvKiogc2V0IHN0YXRpb24gcG93ZXIgc2F2ZSBzcGVjaWZpYyBwYXJhbWV0ZXIgKi8KKwlXTUlfU1RBX1BPV0VSU0FWRV9QQVJBTV9DTURJRCwKKwkvKiogc2V0IHN0YXRpb24gbWltbyBwb3dlcnNhdmUgbW9kZSAqLworCVdNSV9TVEFfTUlNT19QU19NT0RFX0NNRElELAorCisJLyoqIERGUy1zcGVjaWZpYyBjb21tYW5kcyAqLworCS8qKiBlbmFibGUgREZTIChyYWRhciBkZXRlY3Rpb24pKi8KKwlXTUlfUERFVl9ERlNfRU5BQkxFX0NNRElEID0gV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9ERlMpLAorCS8qKiBkaXNhYmxlIERGUyAocmFkYXIgZGV0ZWN0aW9uKSovCisJV01JX1BERVZfREZTX0RJU0FCTEVfQ01ESUQsCisJLyoqIGVuYWJsZSBERlMgcGh5ZXJyL3BhcnNlIGZpbHRlciBvZmZsb2FkICovCisJV01JX0RGU19QSFlFUlJfRklMVEVSX0VOQV9DTURJRCwKKwkvKiogZW5hYmxlIERGUyBwaHllcnIvcGFyc2UgZmlsdGVyIG9mZmxvYWQgKi8KKwlXTUlfREZTX1BIWUVSUl9GSUxURVJfRElTX0NNRElELAorCisJLyogUm9hbWluZyBzcGVjaWZpYyAgY29tbWFuZHMgKi8KKwkvKiogc2V0IHJvYW0gc2NhbiBtb2RlICovCisJV01JX1JPQU1fU0NBTl9NT0RFID0gV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9ST0FNKSwKKwkvKiogc2V0IHJvYW0gc2NhbiByc3NpIHRocmVzaG9sZCBiZWxvdyB3aGljaCByb2FtIHNjYW4gaXMgZW5hYmxlZCAgKi8KKwlXTUlfUk9BTV9TQ0FOX1JTU0lfVEhSRVNIT0xELAorCS8qKiBzZXQgcm9hbSBzY2FuIHBlcmlvZCBmb3IgcGVyaW9kaWMgcm9hbSBzY2FuIG1vZGUgICovCisJV01JX1JPQU1fU0NBTl9QRVJJT0QsCisJLyoqIHNldCByb2FtIHNjYW4gdHJpZ2dlciByc3NpIGNoYW5nZSB0aHJlc2hvbGQgICAqLworCVdNSV9ST0FNX1NDQU5fUlNTSV9DSEFOR0VfVEhSRVNIT0xELAorCS8qKiBzZXQgcm9hbSBBUCBwcm9maWxlICAgKi8KKwlXTUlfUk9BTV9BUF9QUk9GSUxFLAorCS8qKiBzZXQgY2hhbm5lbCBsaXN0IGZvciByb2FtIHNjYW5zICovCisJV01JX1JPQU1fQ0hBTl9MSVNULAorCS8qKiBTdG9wIHNjYW4gY29tbWFuZCAqLworCVdNSV9ST0FNX1NDQU5fQ01ELAorCS8qKiByb2FtaW5nIHNtZSBvZmZsb2FkIHN5bmMgY29tcGxldGUgKi8KKwlXTUlfUk9BTV9TWU5DSF9DT01QTEVURSwKKwkvKiogc2V0IHJpYyByZXF1ZXN0IGVsZW1lbnQgZm9yIDExciByb2FtaW5nICovCisJV01JX1JPQU1fU0VUX1JJQ19SRVFVRVNUX0NNRElELAorCS8qKiBJbnZva2Ugcm9hbWluZyBmb3JjZWZ1bGx5ICovCisJV01JX1JPQU1fSU5WT0tFX0NNRElELAorCS8qKiByb2FtaW5nIGZpbHRlciBjbWQgdG8gYWxsb3cgZnVydGhlciBmaWx0ZXJpbmcgb2Ygcm9hbWluZyBjYW5kaWRhdGUgKi8KKwlXTUlfUk9BTV9GSUxURVJfQ01ESUQsCisJLyoqIHNldCBnYXRld2F5IGlwLCBtYWMgYW5kIHJldHJpZXMgZm9yIHN1Ym5ldCBjaGFuZ2UgZGV0ZWN0aW9uICovCisJV01JX1JPQU1fU1VCTkVUX0NIQU5HRV9DT05GSUdfQ01ESUQsCisJLyoqIGNvbmZpZ3VyZSB0aHJlc2hvbGRzIGZvciBNQVdDICovCisJV01JX1JPQU1fQ09ORklHVVJFX01BV0NfQ01ESUQsCisKKwkvKiogb2ZmbG9hZCBzY2FuIHNwZWNpZmljIGNvbW1hbmRzICovCisJLyoqIHNldCBvZmZsb2FkIHNjYW4gQVAgcHJvZmlsZSAgICovCisJV01JX09GTF9TQ0FOX0FERF9BUF9QUk9GSUxFID0KKwkJV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9PRkxfU0NBTiksCisJLyoqIHJlbW92ZSBvZmZsb2FkIHNjYW4gQVAgcHJvZmlsZSAgICovCisJV01JX09GTF9TQ0FOX1JFTU9WRV9BUF9QUk9GSUxFLAorCS8qKiBzZXQgb2ZmbG9hZCBzY2FuIHBlcmlvZCAgICovCisJV01JX09GTF9TQ0FOX1BFUklPRCwKKworCS8qIFAyUCBzcGVjaWZpYyBjb21tYW5kcyAqLworCS8qKnNldCBQMlAgZGV2aWNlIGluZm8uIEZXIHdpbGwgdXNlZCBieSBGVyB0byBjcmVhdGUgUDJQIElFIHRvIGJlIGNhcnJpZWQgaW4gcHJvYmUgcmVzcG9uc2UKKwkgKiBnZW5lcmF0ZWQgZHVyaW5nIHAycCBsaXN0ZW4gYW5kIGZvciBwMnAgZGlzY292ZXJhYmlsaXR5ICAqLworCVdNSV9QMlBfREVWX1NFVF9ERVZJQ0VfSU5GTyA9IFdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfUDJQKSwKKwkvKiogZW5hYmxlL2Rpc2FibGUgcDJwIGRpc2NvdmVyYWJpbGl0eSBvbiBTVEEvQVAgVkRFVnMgICovCisJV01JX1AyUF9ERVZfU0VUX0RJU0NPVkVSQUJJTElUWSwKKwkvKiogc2V0IHAycCBpZSB0byBiZSBjYXJyaWVkIGluIGJlYWNvbnMgZ2VuZXJhdGVkIGJ5IEZXIGZvciBHTyAgKi8KKwlXTUlfUDJQX0dPX1NFVF9CRUFDT05fSUUsCisJLyoqIHNldCBwMnAgaWUgdG8gYmUgY2FycmllZCBpbiBwcm9iZSByZXNwb25zZSBmcmFtZXMgZ2VuZXJhdGVkIGJ5IEZXIGZvciBHTyAgKi8KKwlXTUlfUDJQX0dPX1NFVF9QUk9CRV9SRVNQX0lFLAorCS8qKiBzZXQgdGhlIHZlbmRvciBzcGVjaWZpYyBwMnAgaWUgZGF0YS4gRlcgd2lsbCB1c2UgdGhpcyB0byBwYXJzZSB0aGUgUDJQIE5vQQorCSAqICBhdHRyaWJ1dGUgaW4gdGhlIGJlYWNvbnMvcHJvYmUgcmVzcG9uc2VzIHJlY2VpdmVkLgorCSAqLworCVdNSV9QMlBfU0VUX1ZFTkRPUl9JRV9EQVRBX0NNRElELAorCS8qKiBzZXQgdGhlIGNvbmZpZ3VyZSBvZiBwMnAgZmluZCBvZmZsb2FkICovCisJV01JX1AyUF9ESVNDX09GRkxPQURfQ09ORklHX0NNRElELAorCS8qKiBzZXQgdGhlIHZlbmRvciBzcGVjaWZpYyBwMnAgaWUgZGF0YSBmb3IgcDJwIGZpbmQgb2ZmbG9hZCB1c2luZyAqLworCVdNSV9QMlBfRElTQ19PRkZMT0FEX0FQUElFX0NNRElELAorCS8qKiBzZXQgdGhlIEJTU0lEL2RldmljZSBuYW1lIHBhdHRlcm4gb2YgcDJwIGZpbmQgb2ZmbG9hZCAqLworCVdNSV9QMlBfRElTQ19PRkZMT0FEX1BBVFRFUk5fQ01ESUQsCisJLyoqIHNldCBPcHBQUyByZWxhdGVkIHBhcmFtZXRlcnMgKiovCisJV01JX1AyUF9TRVRfT1BQUFNfUEFSQU1fQ01ESUQsCisKKwkvKiogQVAgcG93ZXIgc2F2ZSBzcGVjaWZpYyBjb25maWcgKi8KKwkvKiogc2V0IEFQIHBvd2VyIHNhdmUgc3BlY2lmaWMgcGFyYW0gKi8KKwlXTUlfQVBfUFNfUEVFUl9QQVJBTV9DTURJRCA9CisJCVdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfQVBfUFMpLAorCS8qKiBzZXQgQVAgVUFQU0QgY29leCBwZWNpZmljIHBhcmFtICovCisJV01JX0FQX1BTX1BFRVJfVUFQU0RfQ09FWF9DTURJRCwKKworCS8qKiBzZXQgRW5oYW5jZWQgR3JlZW4gQVAgcGFyYW0gKi8KKwlXTUlfQVBfUFNfRUdBUF9QQVJBTV9DTURJRCwKKworCS8qKiBSYXRlLWNvbnRyb2wgc3BlY2lmaWMgY29tbWFuZHMgKi8KKwlXTUlfUEVFUl9SQVRFX1JFVFJZX1NDSEVEX0NNRElEID0KKwkJV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9SQVRFX0NUUkwpLAorCisJLyoqIFdMQU4gUHJvZmlsaW5nIGNvbW1hbmRzLiAqLworCVdNSV9XTEFOX1BST0ZJTEVfVFJJR0dFUl9DTURJRCA9CisJCVdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfUFJPRklMRSksCisJV01JX1dMQU5fUFJPRklMRV9TRVRfSElTVF9JTlRWTF9DTURJRCwKKwlXTUlfV0xBTl9QUk9GSUxFX0dFVF9QUk9GSUxFX0RBVEFfQ01ESUQsCisJV01JX1dMQU5fUFJPRklMRV9FTkFCTEVfUFJPRklMRV9JRF9DTURJRCwKKwlXTUlfV0xBTl9QUk9GSUxFX0xJU1RfUFJPRklMRV9JRF9DTURJRCwKKworCS8qKiBTdXNwZW5kIHJlc3VtZSBjb21tYW5kIElkcyAqLworCVdNSV9QREVWX1NVU1BFTkRfQ01ESUQgPSBXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX1NVU1BFTkQpLAorCVdNSV9QREVWX1JFU1VNRV9DTURJRCwKKworCS8qIEJlYWNvbiBmaWx0ZXIgY29tbWFuZHMgKi8KKwkvKiogYWRkIGEgYmVhY29uIGZpbHRlciAqLworCVdNSV9BRERfQkNOX0ZJTFRFUl9DTURJRCA9CisJCVdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfQkNOX0ZJTFRFUiksCisJLyoqIHJlbW92ZSBhICBiZWFjb24gZmlsdGVyICovCisJV01JX1JNVl9CQ05fRklMVEVSX0NNRElELAorCisJLyogV09XIFNwZWNpZmljIFdNSSBjb21tYW5kcyAqLworCS8qKiBhZGQgcGF0dGVybiBmb3IgYXdha2UgKi8KKwlXTUlfV09XX0FERF9XQUtFX1BBVFRFUk5fQ01ESUQgPQorCQlXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX1dPVyksCisJLyoqIGRlbGV0YSBhIHdha2UgcGF0dGVybiAqLworCVdNSV9XT1dfREVMX1dBS0VfUEFUVEVSTl9DTURJRCwKKwkvKiogZW5hYmxlL2RlaXNhYmxlIHdha2UgZXZlbnQgICovCisJV01JX1dPV19FTkFCTEVfRElTQUJMRV9XQUtFX0VWRU5UX0NNRElELAorCS8qKiBlbmFibGUgV09XICAqLworCVdNSV9XT1dfRU5BQkxFX0NNRElELAorCS8qKiBob3N0IHdva2UgdXAgZnJvbSBzbGVlcCBldmVudCB0byBGVy4gR2VuZXJhdGVkIGluIHJlc3BvbnNlIHRvIFdPVyBIYXJkd2FyZSBldmVudCAqLworCVdNSV9XT1dfSE9TVFdBS0VVUF9GUk9NX1NMRUVQX0NNRElELAorCS8qIElPQUMgYWRkIGtlZXAgYWxpdmUgY21kLiAqLworCVdNSV9XT1dfSU9BQ19BRERfS0VFUEFMSVZFX0NNRElELAorCS8qIElPQUMgZGVsIGtlZXAgYWxpdmUgY21kLiAqLworCVdNSV9XT1dfSU9BQ19ERUxfS0VFUEFMSVZFX0NNRElELAorCS8qIElPQUMgYWRkIHBhdHRlcm4gZm9yIGF3YWtlICovCisJV01JX1dPV19JT0FDX0FERF9XQUtFX1BBVFRFUk5fQ01ESUQsCisJLyogSU9BQyBkZWxldGEgYSB3YWtlIHBhdHRlcm4gKi8KKwlXTUlfV09XX0lPQUNfREVMX1dBS0VfUEFUVEVSTl9DTURJRCwKKwkvKiBEMC1XT1cgZW5hYmxlIG9yIGRpc2FibGUgY21kICovCisJV01JX0QwX1dPV19FTkFCTEVfRElTQUJMRV9DTURJRCwKKwkvKiBlbmFibGUgZXh0ZW5kIFdvVyAqLworCVdNSV9FWFRXT1dfRU5BQkxFX0NNRElELAorCS8qIEV4dGVuZCBXb1cgY29tbWFuZCB0byBjb25maWd1cmUgYXBwIHR5cGUxIHBhcmFtZXRlciAqLworCVdNSV9FWFRXT1dfU0VUX0FQUF9UWVBFMV9QQVJBTVNfQ01ESUQsCisJLyogRXh0ZW5kIFdvVyBjb21tYW5kIHRvIGNvbmZpZ3VyZSBhcHAgdHlwZTIgcGFyYW1ldGVyICovCisJV01JX0VYVFdPV19TRVRfQVBQX1RZUEUyX1BBUkFNU19DTURJRCwKKwkvKiBlbmFibGUgSUNNUHY2IE5ldHdvcmsgYWR2ZXJ0aXNlbWVudCBmaWx0ZXJpbmcgKi8KKwlXTUlfV09XX0VOQUJMRV9JQ01QVjZfTkFfRkxUX0NNRElELAorCS8qCisJICogU2V0IGEgcGF0dGVybiB0byBtYXRjaCBVRFAgcGFja2V0IGluIFdPVyBtb2RlLgorCSAqIElmIG1hdGNoLCBjb25zdHJ1Y3QgYSB0eCBmcmFtZSBpbiBhIGxvY2FsIGJ1ZmZlcgorCSAqIHRvIHNlbmQgdGhyb3VnaCB0aGUgcGVlciBBUCB0byB0aGUgZW50aXR5IGluIHRoZQorCSAqIElQIG5ldHdvcmsgdGhhdCBzZW50IHRoZSBVRFAgcGFja2V0IHRvIHRoaXMgU1RBLgorCSAqLworCVdNSV9XT1dfVURQX1NWQ19PRkxEX0NNRElELAorCisJLyogY29uZmlndXJlIFdPVyBob3N0IHdha2V1cCBQSU4gcGF0dGVybiAqLworCVdNSV9XT1dfSE9TVFdBS0VVUF9HUElPX1BJTl9QQVRURVJOX0NPTkZJR19DTURJRCwKKworCS8qIFJUVCBtZWFzdXJlbWVudCByZWxhdGVkIGNtZCAqLworCS8qKiByZXF1ZXN0IHRvIG1ha2UgYW4gUlRUIG1lYXN1cmVtZW50ICovCisJV01JX1JUVF9NRUFTUkVRX0NNRElEID0gV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9SVFQpLAorCS8qKiByZXF1ZXN0IHRvIHJlcG9ydCBhIHRzZiBtZWFzdXJlbWVudCAqLworCVdNSV9SVFRfVFNGX0NNRElELAorCisJLyoqIHNwZWN0cmFsIHNjYW4gY29tbWFuZCAqLworCS8qKiBjb25maWd1cmUgc3BlY3RyYWwgc2NhbiAqLworCVdNSV9WREVWX1NQRUNUUkFMX1NDQU5fQ09ORklHVVJFX0NNRElEID0KKwkJV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9TUEVDVFJBTCksCisJLyoqIGVuYWJsZS9kaXNhYmxlIHNwZWN0cmFsIHNjYW4gYW5kIHRyaWdnZXIgKi8KKwlXTUlfVkRFVl9TUEVDVFJBTF9TQ0FOX0VOQUJMRV9DTURJRCwKKworCS8qIEYvVyBzdGF0cyAqLworCS8qKiBvbmUgdGltZSByZXF1ZXN0IGZvciBzdGF0cyAqLworCVdNSV9SRVFVRVNUX1NUQVRTX0NNRElEID0gV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9TVEFUUyksCisJLyoqIFB1c2ggTUNDIEFkYXB0aXZlIFNjaGVkdWxlciBTdGF0cyB0byBGaXJtd2FyZSAqLworCVdNSV9NQ0NfU0NIRURfVFJBRkZJQ19TVEFUU19DTURJRCwKKwkvKiogb25lIHRpbWUgcmVxdWVzdCBmb3IgdHhyeCBzdGF0cyAqLworCVdNSV9SRVFVRVNUX1NUQVRTX0VYVF9DTURJRCwKKworCS8qIExpbmsgTGF5ZXIgc3RhdHMgKi8KKwkvKiogUmVxdWVzdCBmb3IgbGluayBsYXllciBzdGF0cyAqLworCVdNSV9SRVFVRVNUX0xJTktfU1RBVFNfQ01ESUQsCisJLyoqIFJlcXVlc3QgZm9yIHNldHRpbmcgcGFyYW1zIHRvIGxpbmsgbGF5ZXIgc3RhdHMgKi8KKwlXTUlfU1RBUlRfTElOS19TVEFUU19DTURJRCwKKwkvKiogUmVxdWVzdCB0byBjbGVhciBzdGF0cyovCisJV01JX0NMRUFSX0xJTktfU1RBVFNfQ01ESUQsCisKKwkvKiogUmVxdWVzdCBmb3IgZ2V0dGluZyB0aGUgRmlybXdhcmUgTWVtb3J5IER1bXAgKi8KKwlXTUlfR0VUX0ZXX01FTV9EVU1QX0NNRElELAorCisJLyoqIFJlcXVlc3QgdG8gZmx1c2ggb2YgdGhlIGJ1ZmZlcmVkIGRlYnVnIG1lc3NhZ2VzICovCisJV01JX0RFQlVHX01FU0dfRkxVU0hfQ01ESUQsCisKKwkvKiogQ21kIHRvIGNvbmZpZ3VyZSB0aGUgdmVyYm9zZSBsZXZlbCAqLworCVdNSV9ESUFHX0VWRU5UX0xPR19DT05GSUdfQ01ESUQsCisKKwkvKiogQVJQIE9GRkxPQUQgUkVRVUVTVCovCisJV01JX1NFVF9BUlBfTlNfT0ZGTE9BRF9DTURJRCA9CisJCVdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfQVJQX05TX09GTCksCisKKwkvKiogUHJvYWN0aXZlIEFSUCBSZXNwb25zZSBBZGQgUGF0dGVybiBDb21tYW5kKi8KKwlXTUlfQUREX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01ESUQsCisKKwkvKiogUHJvYWN0aXZlIEFSUCBSZXNwb25zZSBEZWwgUGF0dGVybiBDb21tYW5kKi8KKwlXTUlfREVMX1BST0FDVElWRV9BUlBfUlNQX1BBVFRFUk5fQ01ESUQsCisKKwkvKiogTlMgb2ZmbG9hZCBjb25maWcqLworCVdNSV9ORVRXT1JLX0xJU1RfT0ZGTE9BRF9DT05GSUdfQ01ESUQgPQorCQlXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX05MT19PRkwpLAorCisJLyoqIEFQRklORCBDb25maWcgKi8KKwlXTUlfQVBGSU5EX0NNRElELAorCisJLyoqIFBhc3Nwb2ludCBsaXN0IGNvbmZpZyAqLworCVdNSV9QQVNTUE9JTlRfTElTVF9DT05GSUdfQ01ESUQsCisKKwkvKiogY29uZmlndXJlIHN1cHByc3NpbmcgcGFyYW1ldGVycyBmb3IgTUFXQyAqLworCVdNSV9OTE9fQ09ORklHVVJFX01BV0NfQ01ESUQsCisKKwkvKiBHVEsgb2ZmbG9hZCBTcGVjaWZpYyBXTUkgY29tbWFuZHMgKi8KKwlXTUlfR1RLX09GRkxPQURfQ01ESUQgPSBXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX0dUS19PRkwpLAorCisJLyogQ1NBIG9mZmxvYWQgU3BlY2lmaWMgV01JIGNvbW1hbmRzICovCisJLyoqIGNzYSBvZmZsb2FkIGVuYWJsZSAqLworCVdNSV9DU0FfT0ZGTE9BRF9FTkFCTEVfQ01ESUQgPQorCQlXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX0NTQV9PRkwpLAorCS8qKiBjaGFuIHN3aXRjaCBjb21tYW5kICovCisJV01JX0NTQV9PRkZMT0FEX0NIQU5TV0lUQ0hfQ01ESUQsCisKKwkvKiBDaGF0dGVyIGNvbW1hbmRzICovCisJLyogQ2hhbmdlIGNoYXR0ZXIgbW9kZSBvZiBvcGVyYXRpb24gKi8KKwlXTUlfQ0hBVFRFUl9TRVRfTU9ERV9DTURJRCA9CisJCVdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfQ0hBVFRFUiksCisJLyoqIGNoYXR0ZXIgYWRkIGNvYWxlc2NpbmcgZmlsdGVyIGNvbW1hbmQgKi8KKwlXTUlfQ0hBVFRFUl9BRERfQ09BTEVTQ0lOR19GSUxURVJfQ01ESUQsCisJLyoqIGNoYXR0ZXIgZGVsZXRlIGNvYWxlc2NpbmcgZmlsdGVyIGNvbW1hbmQgKi8KKwlXTUlfQ0hBVFRFUl9ERUxFVEVfQ09BTEVTQ0lOR19GSUxURVJfQ01ESUQsCisJLyoqIGNoYXR0ZXIgY29hbGVjaW5nIHF1ZXJ5IGNvbW1hbmQgKi8KKwlXTUlfQ0hBVFRFUl9DT0FMRVNDSU5HX1FVRVJZX0NNRElELAorCisJLyoqYWRkYmEgc3BlY2lmaWMgY29tbWFuZHMgKi8KKwkvKiogc3RhcnQgdGhlIGFnZ3JlZ2F0aW9uIG9uIHRoaXMgVElEICovCisJV01JX1BFRVJfVElEX0FEREJBX0NNRElEID0KKwkJV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9USURfQUREQkEpLAorCS8qKiBzdG9wIHRoZSBhZ2dyZWdhdGlvbiBvbiB0aGlzIFRJRCAqLworCVdNSV9QRUVSX1RJRF9ERUxCQV9DTURJRCwKKworCS8qKiBzZXQgc3RhdGlvbiBtaW1vIHBvd2Vyc2F2ZSBtZXRob2QgKi8KKwlXTUlfU1RBX0RUSU1fUFNfTUVUSE9EX0NNRElELAorCS8qKiBDb25maWd1cmUgdGhlIFN0YXRpb24gVUFQU0QgQUMgQXV0byBUcmlnZ2VyIFBhcmFtZXRlcnMgKi8KKwlXTUlfU1RBX1VBUFNEX0FVVE9fVFJJR19DTURJRCwKKwkvKiogQ29uZmlndXJlIHRoZSBLZWVwIEFsaXZlIFBhcmFtZXRlcnMgKi8KKwlXTUlfU1RBX0tFRVBBTElWRV9DTURJRCwKKworCS8qIFJlcXVlc3Qgc3NuIGZyb20gdGFyZ2V0IGZvciBhIHN0YS90aWQgcGFpciAqLworCVdNSV9CQV9SRVFfU1NOX0NNRElELAorCS8qIG1pc2MgY29tbWFuZCBncm91cCAqLworCS8qKiBlY2hvIGNvbW1hbmQgbWFpbmx5IHVzZWQgZm9yIHRlc3RpbmcgKi8KKwlXTUlfRUNIT19DTURJRCA9IFdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfTUlTQyksCisKKwkvKiAhIUlNUE9SVEFOVCEhCisJICogSWYgeW91IG5lZWQgdG8gYWRkIGEgbmV3IFdNSSBjb21tYW5kIHRvIHRoZSBXTUlfR1JQX01JU0Mgc3ViLWdyb3VwLAorCSAqIHBsZWFzZSBtYWtlIHN1cmUgeW91IGFkZCBpdCBCRUhJTkQgV01JX1BERVZfVVRGX0NNRElELAorCSAqIGFzIHdlIE1VU1QgaGF2ZSBhIGZpeGVkIHZhbHVlIGhlcmUgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSBiZXR3ZWVuCisJICogVVRGIGFuZCB0aGUgQVJUMiBkcml2ZXIKKwkgKi8KKwkvKiogVVRGIFdNSSBjb21tYW5kcyAqLworCVdNSV9QREVWX1VURl9DTURJRCwKKworCS8qKiBzZXQgZGVidWcgbG9nIGNvbmZpZyAqLworCVdNSV9EQkdMT0dfQ0ZHX0NNRElELAorCS8qIFFWSVQgc3BlY2lmaWMgY29tbWFuZCBpZCAqLworCVdNSV9QREVWX1FWSVRfQ01ESUQsCisJLyogRmFjdG9yeSBUZXN0aW5nIE1vZGUgcmVxdWVzdCBjb21tYW5kCisJICogdXNlZCBmb3IgaW50ZWdyYXRlZCBjaGlwc2V0cyAqLworCVdNSV9QREVWX0ZUTV9JTlRHX0NNRElELAorCS8qIHNldCBhbmQgZ2V0IGtlZXBhbGl2ZSBwYXJhbWV0ZXJzIGNvbW1hbmQgKi8KKwlXTUlfVkRFVl9TRVRfS0VFUEFMSVZFX0NNRElELAorCVdNSV9WREVWX0dFVF9LRUVQQUxJVkVfQ01ESUQsCisJLyogRm9yIGZ3IHJlY292ZXJ5IHRlc3QgY29tbWFuZCAqLworCVdNSV9GT1JDRV9GV19IQU5HX0NNRElELAorCS8qIFNldCBNY2FzdC9CZGNhc3QgZmlsdGVyICovCisJV01JX1NFVF9NQ0FTVEJDQVNUX0ZJTFRFUl9DTURJRCwKKwkvKiogc2V0IHRoZXJtYWwgbWFuYWdlbWVudCBwYXJhbXMgKiovCisJV01JX1RIRVJNQUxfTUdNVF9DTURJRCwKKwkvKiogc2V0IGhvc3QgYXV0byBzaHV0ZG93biBwYXJhbXMgKiovCisJV01JX0hPU1RfQVVUT19TSFVURE9XTl9DRkdfQ01ESUQsCisJLyoqIHNldCB0cGMgY2hhaW5tYXNrIGNvbmZpZyBjb21tYW5kICovCisJV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0NNRElELAorCS8qKiBzZXQgQW50ZW5uYSBkaXZlcnNpdHkgY29tbWFuZCAqLworCVdNSV9TRVRfQU5URU5OQV9ESVZFUlNJVFlfQ01ESUQsCisJLyoqIFNldCBPQ0IgU2NoZWQgUmVxdWVzdCwgZGVwcmVjYXRlZCAqLworCVdNSV9PQ0JfU0VUX1NDSEVEX0NNRElELAorCS8qIFNldCByc3NpIG1vbml0b3JpbmcgY29uZmlnIGNvbW1hbmQgKi8KKwlXTUlfUlNTSV9CUkVBQ0hfTU9OSVRPUl9DT05GSUdfQ01ESUQsCisJLyogRW5hYmxlL2Rpc2FibGUgTGFyZ2UgUmVjZWl2ZSBPZmZsb2FkIHByb2Nlc3Npbmc7CisJICogcHJvdmlkZSBjZmcgcGFyYW1zICovCisJV01JX0xST19DT05GSUdfQ01ESUQsCisJLyogR1BJTyBDb25maWd1cmF0aW9uICovCisJV01JX0dQSU9fQ09ORklHX0NNRElEID0gV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9HUElPKSwKKwlXTUlfR1BJT19PVVRQVVRfQ01ESUQsCisKKwkvKiBUeGJmIGNvbmZpZ3VyYXRpb24gY29tbWFuZCAqLworCVdNSV9UWEJGX0NNRElELAorCisJLyogRldURVNUIENvbW1hbmRzICovCisJV01JX0ZXVEVTVF9WREVWX01DQ19TRVRfVEJUVF9NT0RFX0NNRElEID0KKwkJV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9GV1RFU1QpLAorCS8qKiBzZXQgTm9BIGRlc2NzICoqLworCVdNSV9GV1RFU1RfUDJQX1NFVF9OT0FfUEFSQU1fQ01ESUQsCisJLyogVU5JVCBUZXN0cyAgKi8KKwlXTUlfVU5JVF9URVNUX0NNRElELAorCisJLyoqIFRETFMgQ29uZmlndXJhdGlvbiAqLworCS8qKiBlbmFibGUvZGlzYWJsZSBURExTICovCisJV01JX1RETFNfU0VUX1NUQVRFX0NNRElEID0gV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9URExTKSwKKwkvKiogc2V0IHRkbHMgcGVlciBzdGF0ZSAqLworCVdNSV9URExTX1BFRVJfVVBEQVRFX0NNRElELAorCS8qKiBURExTIE9mZmNoYW5uZWwgY29udHJvbCAqLworCVdNSV9URExTX1NFVF9PRkZDSEFOX01PREVfQ01ESUQsCisKKwkvKiogUmVzbWdyIENvbmZpZ3VyYXRpb24gKi8KKwkvKiogQWRhcHRpdmUgT0NTIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBpbiB0aGUgRlcuIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvCisJICogZGlzYWJsZSBGVyBiYXNlZCBhZGFwdGl2ZSBPQ1MuCisJICovCisJV01JX1JFU01HUl9BREFQVElWRV9PQ1NfRU5BQkxFX0RJU0FCTEVfQ01ESUQgPQorCQlXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX1JFU01HUiksCisJLyoqIHNldCB0aGUgcmVxdWVzdGVkIGNoYW5uZWwgdGltZSBxdW90YSBmb3IgdGhlIGhvbWUgY2hhbm5lbHMgKi8KKwlXTUlfUkVTTUdSX1NFVF9DSEFOX1RJTUVfUVVPVEFfQ01ESUQsCisJLyoqIHNldCB0aGUgcmVxdWVzdGVkIGxhdGVuY3kgZm9yIHRoZSBob21lIGNoYW5uZWxzICovCisJV01JX1JFU01HUl9TRVRfQ0hBTl9MQVRFTkNZX0NNRElELAorCisJLyoqIFNUQSBTTVBTIENvbmZpZ3VyYXRpb24gKi8KKwkvKiogZm9yY2UgU01QUyBtb2RlICovCisJV01JX1NUQV9TTVBTX0ZPUkNFX01PREVfQ01ESUQgPQorCQlXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX1NUQV9TTVBTKSwKKwkvKiogc2V0IFNNUFMgcGFyYW1ldGVycyAqLworCVdNSV9TVEFfU01QU19QQVJBTV9DTURJRCwKKworCS8qIFdsYW4gSEIgY29tbWFuZHMgKi8KKwkvKiBlbmFsYmUvZGlzYWJsZSB3bGFuIEhCICovCisJV01JX0hCX1NFVF9FTkFCTEVfQ01ESUQgPSBXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX1dMQU5fSEIpLAorCS8qIHNldCB0Y3AgcGFyYW1ldGVycyBmb3Igd2xhbiBIQiAqLworCVdNSV9IQl9TRVRfVENQX1BBUkFNU19DTURJRCwKKwkvKiBzZXQgdGNwIHBrdCBmaWx0ZXIgZm9yIHdsYW4gSEIgKi8KKwlXTUlfSEJfU0VUX1RDUF9QS1RfRklMVEVSX0NNRElELAorCS8qIHNldCB1ZHAgcGFyYW1ldGVycyBmb3Igd2xhbiBIQiAqLworCVdNSV9IQl9TRVRfVURQX1BBUkFNU19DTURJRCwKKwkvKiBzZXQgdWRwIHBrdCBmaWx0ZXIgZm9yIHdsYW4gSEIgKi8KKwlXTUlfSEJfU0VUX1VEUF9QS1RfRklMVEVSX0NNRElELAorCisJLyoqIFdsYW4gUk1DIGNvbW1hbmRzKi8KKwkvKiogZW5hYmxlL2Rpc2FibGUgUk1DICovCisJV01JX1JNQ19TRVRfTU9ERV9DTURJRCA9IFdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfUk1DKSwKKwkvKiogY29uZmlndXJlIGFjdGlvbiBmcmFtZSBwZXJpb2QgKi8KKwlXTUlfUk1DX1NFVF9BQ1RJT05fUEVSSU9EX0NNRElELAorCS8qKiBGb3IgZGVidWcvZnV0dXJlIGVuaGFuY2VtZW50IHB1cnBvc2VzIG9ubHksCisJICogIGNvbmZpZ3VyZXMvZmluZXR1bmVzIFJNQyBhbGdvcml0aG1zICovCisJV01JX1JNQ19DT05GSUdfQ01ESUQsCisKKwkvKiogV0xBTiBNSEYgb2ZmbG9hZCBjb21tYW5kcyAqLworCS8qKiBlbmFibGUvZGlzYWJsZSBNSEYgb2ZmbG9hZCAqLworCVdNSV9NSEZfT0ZGTE9BRF9TRVRfTU9ERV9DTURJRCA9CisJCVdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfTUhGX09GTCksCisJLyoqIFBsdW1iIHJvdXRpbmcgdGFibGUgZm9yIE1IRiBvZmZsb2FkICovCisJV01JX01IRl9PRkZMT0FEX1BMVU1CX1JPVVRJTkdfVEJMX0NNRElELAorCisJLypsb2NhdGlvbiBzY2FuIGNvbW1hbmRzICovCisJLypzdGFydCBiYXRjaCBzY2FuICovCisJV01JX0JBVENIX1NDQU5fRU5BQkxFX0NNRElEID0KKwkJV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9MT0NBVElPTl9TQ0FOKSwKKwkvKnN0b3AgYmF0Y2ggc2NhbiAqLworCVdNSV9CQVRDSF9TQ0FOX0RJU0FCTEVfQ01ESUQsCisJLypnZXQgYmF0Y2ggc2NhbiByZXN1bHQgKi8KKwlXTUlfQkFUQ0hfU0NBTl9UUklHR0VSX1JFU1VMVF9DTURJRCwKKwkvKiBPRU0gcmVsYXRlZCBjbWQgKi8KKwlXTUlfT0VNX1JFUV9DTURJRCA9IFdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfT0VNKSwKKworCS8qKiBOYW4gUmVxdWVzdCAqLworCVdNSV9OQU5fQ01ESUQgPSBXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX05BTiksCisKKwkvKiogTW9kZW0gcG93ZXIgc3RhdGUgY29tbWFuZCAqLworCVdNSV9NT0RFTV9QT1dFUl9TVEFURV9DTURJRCA9CisJCVdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfQ09FWCksCisJV01JX0NIQU5fQVZPSURfVVBEQVRFX0NNRElELAorCisJLyoqCisJICogIE9CU1Mgc2NhbiBvZmZsb2FkIGVuYWJsZS9kaXNhYmxlIGNvbW1hbmRzCisJICogIE9CU1Mgc2NhbiBlbmFibGUgQ01EIHdpbGwgc2VuZCB0byBGVyBhZnRlciBWREVWIFVQLCBpZiB0aGVzZSBjb25kaXRpb25zIGFyZSB0cnVlOgorCSAqICAxLiAgV01JX1NFUlZJQ0VfT0JTU19TQ0FOIGlzIHJlcG9ydGVkIGJ5IEZXIGluIHNlcnZpY2UgcmVhZHksCisJICogIDIuICBTVEEgY29ubmVjdCB0byBhIDIuNEdoeiBodDIwL2h0NDAgQVAsCisJICogIDMuICBBUCBlbmFibGUgMjAvNDAgY29leGlzdGVuY2UgKE9CU1NfSUUtNzQgY2FuIGJlIGZvdW5kIGluIGJlYWNvbiBvciBhc3NvY2lhdGlvbiByZXNwb25zZSkKKwkgKiAgSWYgT0JTUyBwYXJhbWV0ZXJzIGZyb20gYmVhY29uIGNoYW5nZWQsIGFsc28gdXNlIGVuYWJsZSBDTUQgdG8gdXBkYXRlIHBhcmFtZXRlcnMuCisJICogIE9CU1Mgc2NhbiBkaXNhYmxlIENNRCB3aWxsIHNlbmQgdG8gRlcgaWYgaGF2ZSBlbmFibGVkIHdoZW4gdGVhcmluZyBkb3duIGNvbm5lY3Rpb24uCisJICovCisJV01JX09CU1NfU0NBTl9FTkFCTEVfQ01ESUQgPQorCQlXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX09CU1NfT0ZMKSwKKwlXTUlfT0JTU19TQ0FOX0RJU0FCTEVfQ01ESUQsCisKKwkvKipMUEkgY29tbWFuZHMqLworCS8qKkxQSSBtZ210IHNub29waW5nIGNvbmZpZyBjb21tYW5kKi8KKwlXTUlfTFBJX01HTVRfU05PT1BJTkdfQ09ORklHX0NNRElEID0KKwkJV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9MUEkpLAorCS8qKkxQSSBzY2FuIHN0YXJ0IGNvbW1hbmQqLworCVdNSV9MUElfU1RBUlRfU0NBTl9DTURJRCwKKwkvKipMUEkgc2NhbiBzdG9wIGNvbW1hbmQqLworCVdNSV9MUElfU1RPUF9TQ0FOX0NNRElELAorCisJLyoqIEV4dFNjYW4gY29tbWFuZHMgKi8KKwlXTUlfRVhUU0NBTl9TVEFSVF9DTURJRCA9IFdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfRVhUU0NBTiksCisJV01JX0VYVFNDQU5fU1RPUF9DTURJRCwKKwlXTUlfRVhUU0NBTl9DT05GSUdVUkVfV0xBTl9DSEFOR0VfTU9OSVRPUl9DTURJRCwKKwlXTUlfRVhUU0NBTl9DT05GSUdVUkVfSE9UTElTVF9NT05JVE9SX0NNRElELAorCVdNSV9FWFRTQ0FOX0dFVF9DQUNIRURfUkVTVUxUU19DTURJRCwKKwlXTUlfRVhUU0NBTl9HRVRfV0xBTl9DSEFOR0VfUkVTVUxUU19DTURJRCwKKwlXTUlfRVhUU0NBTl9TRVRfQ0FQQUJJTElUSUVTX0NNRElELAorCVdNSV9FWFRTQ0FOX0dFVF9DQVBBQklMSVRJRVNfQ01ESUQsCisJV01JX0VYVFNDQU5fQ09ORklHVVJFX0hPVExJU1RfU1NJRF9NT05JVE9SX0NNRElELAorCVdNSV9FWFRTQ0FOX0NPTkZJR1VSRV9NQVdDX0NNRElELAorCisJLyoqIERIQ1Agc2VydmVyIG9mZmxvYWQgY29tbWFuZHMgKi8KKwlXTUlfU0VUX0RIQ1BfU0VSVkVSX09GRkxPQURfQ01ESUQgPQorCQlXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX0RIQ1BfT0ZMKSwKKworCS8qKiBJUEEgT2ZmbG9hZCBmZWF0dXJlcyByZWxhdGVkIGNvbW1hbmRzICovCisJV01JX0lQQV9PRkZMT0FEX0VOQUJMRV9ESVNBQkxFX0NNRElEID0KKwkJV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9JUEEpLAorCisJLyoqIG1ETlMgcmVzcG9uZGVyIG9mZmxvYWQgY29tbWFuZHMgKi8KKwlXTUlfTUROU19PRkZMT0FEX0VOQUJMRV9DTURJRCA9IFdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfTUROU19PRkwpLAorCVdNSV9NRE5TX1NFVF9GUUROX0NNRElELAorCVdNSV9NRE5TX1NFVF9SRVNQT05TRV9DTURJRCwKKwlXTUlfTUROU19HRVRfU1RBVFNfQ01ESUQsCisKKwkvKiBlbmFibGUvZGlzYWJsZSBBUCBBdXRoZW50aWNhdGlvbiBvZmZsb2FkICovCisJV01JX1NBUF9PRkxfRU5BQkxFX0NNRElEID0gV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9TQVBfT0ZMKSwKKwlXTUlfU0FQX1NFVF9CTEFDS0xJU1RfUEFSQU1fQ01ESUQsCisKKwkvKiogT3V0LW9mLWNvbnRleHQtb2YtQlNTIChPQ0IpIGNvbW1hbmRzICovCisJV01JX09DQl9TRVRfQ09ORklHX0NNRElEID0gV01JX0NNRF9HUlBfU1RBUlRfSUQoV01JX0dSUF9PQ0IpLAorCVdNSV9PQ0JfU0VUX1VUQ19USU1FX0NNRElELAorCVdNSV9PQ0JfU1RBUlRfVElNSU5HX0FEVkVSVF9DTURJRCwKKwlXTUlfT0NCX1NUT1BfVElNSU5HX0FEVkVSVF9DTURJRCwKKwlXTUlfT0NCX0dFVF9UU0ZfVElNRVJfQ01ESUQsCisJV01JX0RDQ19HRVRfU1RBVFNfQ01ESUQsCisJV01JX0RDQ19DTEVBUl9TVEFUU19DTURJRCwKKwlXTUlfRENDX1VQREFURV9ORExfQ01ESUQsCisJLyogU3lzdGVtLU9uLUNoaXAgY29tbWFuZHMgKi8KKwlXTUlfU09DX1NFVF9QQ0xfQ01ESUQgPSBXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX1NPQyksCisJV01JX1NPQ19TRVRfSFdfTU9ERV9DTURJRCwKKwlXTUlfU09DX1NFVF9EVUFMX01BQ19DT05GSUdfQ01ESUQsCisJV01JX1NPQ19TRVRfQU5URU5OQV9NT0RFX0NNRElELAorCisJLyogcGFja2V0IGZpbHRlciBjb21tYW5kcyAqLworCVdNSV9QQUNLRVRfRklMVEVSX0NPTkZJR19DTURJRCA9IFdNSV9DTURfR1JQX1NUQVJUX0lEKFdNSV9HUlBfUEtUX0ZJTFRFUiksCisJV01JX1BBQ0tFVF9GSUxURVJfRU5BQkxFX0NNRElELAorCS8qKiBNb3Rpb24gQWlkZWQgV2lGaSBDb25uZWN0aXZpdHkgKE1BV0MpIGNvbW1hbmRzICovCisJV01JX01BV0NfU0VOU09SX1JFUE9SVF9JTkRfQ01ESUQgPSBXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX01BV0MpLAorCisJLyoqIFdNSSBjb21tYW5kcyByZWxhdGVkIHRvIFBNRiAxMXcgT2ZmbG9hZCAqLworCVdNSV9QTUZfT0ZGTE9BRF9TRVRfU0FfUVVFUllfQ01ESUQgPQorCQlXTUlfQ01EX0dSUF9TVEFSVF9JRChXTUlfR1JQX1BNRl9PRkZMT0FEKSwKKworfSBXTUlfQ01EX0lEOworCit0eXBlZGVmIGVudW0geworCS8qKiBXTUkgc2VydmljZSBpcyByZWFkeTsgYWZ0ZXIgdGhpcyBldmVudCBXTUkgbWVzc2FnZXMgY2FuIGJlIHNlbnQvcmVjZWl2ZWQgICovCisJV01JX1NFUlZJQ0VfUkVBRFlfRVZFTlRJRCA9IDB4MSwKKwkvKiogV01JIGlzIHJlYWR5OyBhZnRlciB0aGlzIGV2ZW50IHRoZSB3bGFuIHN1YnN5c3RlbSBpcyBpbml0aWFsaXplZCBhbmQgY2FuIHByb2Nlc3MgY29tbWFuZHMuICovCisJV01JX1JFQURZX0VWRU5USUQsCisKKwkvKiogU2NhbiBzcGVjaWZpYyBldmVudHMgKi8KKwlXTUlfU0NBTl9FVkVOVElEID0gV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9TQ0FOKSwKKworCS8qIFBERVYgc3BlY2lmaWMgZXZlbnRzICovCisJLyoqIFRQQyBjb25maWcgZm9yIHRoZSBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsICovCisJV01JX1BERVZfVFBDX0NPTkZJR19FVkVOVElEID0KKwkJV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9QREVWKSwKKwkvKiogQ2hhbm5lbCBzdGF0cyBldmVudCAgICAqLworCVdNSV9DSEFOX0lORk9fRVZFTlRJRCwKKworCS8qKiBQSFkgRXJyb3Igc3BlY2lmaWMgV01JIGV2ZW50ICovCisJV01JX1BIWUVSUl9FVkVOVElELAorCisJLyoqIGVlcHJvbSBkdW1wIGV2ZW50ICAqLworCVdNSV9QREVWX0RVTVBfRVZFTlRJRCwKKworCS8qKiB0cmFmZmljIHBhdXNlIGV2ZW50ICovCisJV01JX1RYX1BBVVNFX0VWRU5USUQsCisKKwkvKiogREZTIHJhZGFyIGV2ZW50ICAqLworCVdNSV9ERlNfUkFEQVJfRVZFTlRJRCwKKworCS8qKiB0cmFjayBMMVNTIGVudHJ5IGFuZCByZXNpZGVuY3kgZXZlbnQgKi8KKwlXTUlfUERFVl9MMVNTX1RSQUNLX0VWRU5USUQsCisKKwkvKiogUmVwb3J0IGN1cnJlbnQgdGVtcHJhdHVyZSBvZiB0aGUgY2hpcCBpbiBDZWxjaXVzIGRlZ3JlZSAqLworCVdNSV9QREVWX1RFTVBFUkFUVVJFX0VWRU5USUQsCisKKwkvKiBFeHRlbnNpb24gb2YgV01JX1NFUlZJQ0VfUkVBRFkgbXNnIHdpdGgKKwkgKiBleHRyYSB0YXJnZXQgY2FwYWJpbGl0eSBpbmZvCisJICovCisJV01JX1NFUlZJQ0VfUkVBRFlfRVhUX0VWRU5USUQsCisKKwkvKiBWREVWIHNwZWNpZmljIGV2ZW50cyAqLworCS8qKiBWREVWIHN0YXJ0ZWQgZXZlbnQgaW4gcmVzcG9uc2UgdG8gVkRFVl9TVEFSVCByZXF1ZXN0ICovCisJV01JX1ZERVZfU1RBUlRfUkVTUF9FVkVOVElEID0KKwkJV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9WREVWKSwKKwkvKiogdmRldiBzdG9wcGVkIGV2ZW50ICwgZ2VuZXJhdGVkIGluIHJlc3BvbnNlIHRvIFZERVZfU1RPUCByZXF1ZXN0ICovCisJV01JX1ZERVZfU1RPUFBFRF9FVkVOVElELAorCS8qIEluZGljYXRlIHRoZSBzZXQga2V5ICh1c2VkIGZvciBzZXR0aW5nIHBlcgorCSAqIHBlZXIgdW5pY2FzdCBhbmQgcGVyIHZkZXYgbXVsdGljYXN0KQorCSAqIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkICovCisJV01JX1ZERVZfSU5TVEFMTF9LRVlfQ09NUExFVEVfRVZFTlRJRCwKKwkvKiBOT1RFOiBXTUlfVkRFVl9NQ0NfQkNOX0lOVEVSVkFMX0NIQU5HRV9SRVFfRVZFTlRJRCB3b3VsZCBiZSBkZXByZWNhdGVkLiBQbGVhc2UKKwkgICBkb24ndCB1c2UgdGhpcyBmb3IgYW55IG5ldyBpbXBsZW1lbnRhdGlvbnMgKi8KKwkvKiBGaXJtd2FyZSByZXF1ZXN0cyBkeW5hbWljIGNoYW5nZSB0byBhIHNwZWNpZmljIGJlYWNvbiBpbnRlcnZhbCBmb3IgYSBzcGVjaWZpYyB2ZGV2IElEIGluIE1DQyBzY2VuYXJpby4KKwkgICBUaGlzIHJlcXVlc3QgaXMgdmFsaWQgb25seSBmb3IgdmRldnMgb3BlcmF0aW5nIGluIHNvZnQgQVAgb3IgUDJQIEdPIG1vZGUgKi8KKwlXTUlfVkRFVl9NQ0NfQkNOX0lOVEVSVkFMX0NIQU5HRV9SRVFfRVZFTlRJRCwKKworCS8qIFJldHVybiB0aGUgVFNGIHRpbWVzdGFtcCBvZiBzcGVjaWZpZWQgdmRldiAqLworCVdNSV9WREVWX1RTRl9SRVBPUlRfRVZFTlRJRCwKKwkvKiBwZWVyICBzcGVjaWZpYyBldmVudHMgKi8KKwkvKiogRlcgcmVhdWV0IHRvIGtpY2sgb3V0IHRoZSBzdGF0aW9uIGZvciByZWFzb25zIGxpa2UgaW5hY3Rpdml0eSxsYWNrIG9mIHJlc3BvbnNlIC4uZXRjICovCisJV01JX1BFRVJfU1RBX0tJQ0tPVVRfRVZFTlRJRCA9CisJCVdNSV9FVlRfR1JQX1NUQVJUX0lEKFdNSV9HUlBfUEVFUiksCisKKwkvKiogUGVlciBJbmZvIEV2ZW50IHdpdGggZGF0YV9yYXRlLCByc3NpLCB0eF9mYWlsX2NudCBldGMgKi8KKwlXTUlfUEVFUl9JTkZPX0VWRU5USUQsCisKKwkvKiogRXZlbnQgaW5kaWNhdGluZyB0aGF0IFRYIGZhaWwgY291bnQgcmVhY2hpbmcgdGhyZXNob2xkICovCisJV01JX1BFRVJfVFhfRkFJTF9DTlRfVEhSX0VWRU5USUQsCisJLyoqIFJldHVybiB0aGUgZXN0aW1hdGUgbGluayBzcGVlZCBmb3IgdGhlIFBlZXIgc3BlY2lmaWVkIGluIHRoZQorCSAqIFdNSV9QRUVSX0dFVF9FU1RJTUFURURfTElOS1NQRUVEX0NNRElEIGNvbW1hbmQuCisJICovCisJV01JX1BFRVJfRVNUSU1BVEVEX0xJTktTUEVFRF9FVkVOVElELAorCS8qIFJldHVybiB0aGUgcGVlciBzdGF0ZQorCSAqIFdNSV9QRUVSX1NFVF9QQVJBTV9DTURJRCwgV01JX1BFRVJfQVVUSE9SSVpFCisJICovCisJV01JX1BFRVJfU1RBVEVfRVZFTlRJRCwKKworCS8qIFBlZXIgQXNzb2MgQ29uZiBldmVudCB0byBjb25maXJtIGZ3IGhhZCByZWNlaXZlZCBQRUVSX0FTU09DX0NNRC4KKwkgKiBBZnRlciB0aGF0LCBob3N0IHdpbGwgc2VuZCBNeCBtZXNzYWdlLgorCSAqIE90aGVyd2lzZSwgaG9zdCB3aWxsIHBhdXNlIGFueSBNeChTVEE6TTIvTTQpIG1lc3NhZ2UKKwkgKi8KKwlXTUlfUEVFUl9BU1NPQ19DT05GX0VWRU5USUQsCisKKwkvKiBiZWFjb24vbWdtdCBzcGVjaWZpYyBldmVudHMgKi8KKwkvKiogUlggbWFuYWdlbWVudCBmcmFtZS4gdGhlIGVudGlyZSBmcmFtZSBpcyBjYXJyaWVkIGFsb25nIHdpdGggdGhlIGV2ZW50LiAgKi8KKwlXTUlfTUdNVF9SWF9FVkVOVElEID0gV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9NR01UKSwKKwkvKiogc29mdHdhcmUgYmVhY29uIGFsZXJ0IGV2ZW50IHRvIEhvc3QgcmVxdWVzdGluZyBob3N0IHRvIFF1ZXVlIGEgYmVhY29uIGZvciB0cmFuc21pc3Npb24KKwkgICAgdXNlIG9ubHkgaW4gaG9zdCBiZWFjb24gbW9kZSAqLworCVdNSV9IT1NUX1NXQkFfRVZFTlRJRCwKKwkvKiogYmVhY29uIHRidHQgb2Zmc2V0IGV2ZW50IGluZGljYXRpbmcgdGhlIHRzZiBvZmZzZXQgb2YgdGhlIHRidHQgZnJvbSB0aGUgdGhlcml0aWNhbCB2YWx1ZS4KKwkgICAgdGJ0dCBvZmZzZXQgaXMgbm9ybWFsbHkgMCBhbmQgd2lsbCBiZSBub24gemVybyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgVkRFVnMgb3BlcmF0aW5nIGluCisJICAgIHN0YWdnZXJlZCBiZWFjb24gdHJhbnNtaXNzaW9uIG1vZGUgKi8KKwlXTUlfVEJUVE9GRlNFVF9VUERBVEVfRVZFTlRJRCwKKworCS8qKiBldmVudCBhZnRlciB0aGUgZmlyc3QgYmVhY29uIGlzIHRyYW5zbWl0dGVkIGZvbGxvd2luZworCSAgICAgICAgIGEgY2hhbmdlIGluIHRoZSB0ZW1wbGF0ZS4qLworCVdNSV9PRkZMT0FEX0JDTl9UWF9TVEFUVVNfRVZFTlRJRCwKKwkvKiogZXZlbnQgYWZ0ZXIgdGhlIGZpcnN0IHByb2JlIHJlc3BvbnNlIGlzIHRyYW5zbWl0dGVkIGZvbGxvd2luZworCSAgICAgICAgIGEgY2hhbmdlIGluIHRoZSB0ZW1wbGF0ZS4qLworCVdNSV9PRkZMT0FEX1BST0JfUkVTUF9UWF9TVEFUVVNfRVZFTlRJRCwKKwkvKiogRXZlbnQgZm9yIE1nbXQgVFggY29tcGxldGlvbiBldmVudCAqLworCVdNSV9NR01UX1RYX0NPTVBMRVRJT05fRVZFTlRJRCwKKworCS8qQUREQkEgUmVsYXRlZCBXTUkgRXZlbnRzICovCisJLyoqIEluZGljYXRpb24gdGhlIGNvbXBsZXRpb24gb2YgdGhlIHByaW9yCisJICAgV01JX1BFRVJfVElEX0RFTEJBX0NNRElEKGluaXRpYXRvcikgKi8KKwlXTUlfVFhfREVMQkFfQ09NUExFVEVfRVZFTlRJRCA9CisJCVdNSV9FVlRfR1JQX1NUQVJUX0lEKFdNSV9HUlBfQkFfTkVHKSwKKwkvKiogSW5kaWNhdGlvbiB0aGUgY29tcGxldGlvbiBvZiB0aGUgcHJpb3IKKwkgKldNSV9QRUVSX1RJRF9BRERCQV9DTURJRChpbml0aWF0b3IpICovCisJV01JX1RYX0FEREJBX0NPTVBMRVRFX0VWRU5USUQsCisKKwkvKiBTZXEgbnVtIHJldHVybmVkIGZyb20gaHcgZm9yIGEgc3RhL3RpZCBwYWlyICovCisJV01JX0JBX1JTUF9TU05fRVZFTlRJRCwKKworCS8qIEFnZ3JlZ2F0aW9uIHN0YXRlIHJlcXVlc3RlZCBieSBCVEMgKi8KKwlXTUlfQUdHUl9TVEFURV9UUklHX0VWRU5USUQsCisKKwkvKiogUm9hbSBldmVudCB0byB0cmlnZ2VyIHJvYW1pbmcgb24gaG9zdCAqLworCVdNSV9ST0FNX0VWRU5USUQgPSBXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX1JPQU0pLAorCisJLyoqIG1hdGNoaW5nIEFQIGZvdW5kIGZyb20gbGlzdCBvZiBwcm9maWxlcyAqLworCVdNSV9QUk9GSUxFX01BVENILAorCS8qKiByb2FtIHN5bmNoIGV2ZW50ICovCisJV01JX1JPQU1fU1lOQ0hfRVZFTlRJRCwKKworCS8qKiBQMlAgZGlzYyBmb3VuZCAqLworCVdNSV9QMlBfRElTQ19FVkVOVElEID0gV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9QMlApLAorCisJLypzZW5kIG5vYSBpbmZvIHRvIGhvc3Qgd2hlbiBub2EgaXMgY2hhbmdlZCBmb3IgYmVhY29uIHR4IG9mZmxvYWQgZW5hYmxlICovCisJV01JX1AyUF9OT0FfRVZFTlRJRCwKKworCS8qKiBTZW5kIEVHQVAgSW5mbyB0byBob3N0ICovCisJV01JX0FQX1BTX0VHQVBfSU5GT19FVkVOVElEID0gV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9BUF9QUyksCisKKwkvKiBzZW5kIHBkZXYgcmVzdW1lIGV2ZW50IHRvIGhvc3QgYWZ0ZXIgcGRldiByZXN1bWUuICovCisJV01JX1BERVZfUkVTVU1FX0VWRU5USUQgPSBXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX1NVU1BFTkQpLAorCisJLyoqIFdPVyB3YWtlIHVwIGhvc3QgZXZlbnQuZ2VuZXJhdGVkIGluIHJlc3BvbnNlIHRvIFdNSV9XT1dfSE9TVFdBS0VVUF9GUk9NX1NMRUVQX0NNRElELgorCSAgICB3aWxsIGNhcnkgd2FrZSByZWFzb24gKi8KKwlXTUlfV09XX1dBS0VVUF9IT1NUX0VWRU5USUQgPSBXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX1dPVyksCisJV01JX0QwX1dPV19ESVNBQkxFX0FDS19FVkVOVElELAorCVdNSV9XT1dfSU5JVElBTF9XQUtFVVBfRVZFTlRJRCwKKworCS8qUlRUIHJlbGF0ZWQgZXZlbnQgSUQgKi8KKwkvKiogUlRUIG1lYXN1cmVtZW50IHJlcG9ydCAqLworCVdNSV9SVFRfTUVBU1VSRU1FTlRfUkVQT1JUX0VWRU5USUQgPQorCQlXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX1JUVCksCisJLyoqIFRTRiBtZWFzdXJlbWVudCByZXBvcnQgKi8KKwlXTUlfVFNGX01FQVNVUkVNRU5UX1JFUE9SVF9FVkVOVElELAorCS8qKiBSVFQgZXJyb3IgcmVwb3J0ICovCisJV01JX1JUVF9FUlJPUl9SRVBPUlRfRVZFTlRJRCwKKwkvKlNUQVRTIHNwZWNpZmljIGV2ZW50cyAqLworCS8qKiB0eHJ4IHN0YXRzIGV2ZW50IHJlcXVlc3RlZCBieSBob3N0ICovCisJV01JX1NUQVRTX0VYVF9FVkVOVElEID0gV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9TVEFUUyksCisJLyoqIEZXIGlmYWNlIGxpbmsgc3RhdHMgRXZlbnQgICovCisJV01JX0lGQUNFX0xJTktfU1RBVFNfRVZFTlRJRCwKKwkvKiogRlcgaWZhY2UgcGVlciBsaW5rIHN0YXRzIEV2ZW50ICAqLworCVdNSV9QRUVSX0xJTktfU1RBVFNfRVZFTlRJRCwKKwkvKiogRlcgVXBkYXRlIHJhZGlvIHN0YXRzIEV2ZW50ICAqLworCVdNSV9SQURJT19MSU5LX1NUQVRTX0VWRU5USUQsCisJLyoqICBGaXJtd2FyZSBtZW1vcnkgZHVtcCBDb21wbGV0ZSBldmVudCovCisJV01JX1VQREFURV9GV19NRU1fRFVNUF9FVkVOVElELAorCisJLyoqIEV2ZW50IGluZGljYXRpbmcgdGhlIERJQUcgbG9ncy9ldmVudHMgc3VwcG9ydGVkIGJ5IEZXICovCisJV01JX0RJQUdfRVZFTlRfTE9HX1NVUFBPUlRFRF9FVkVOVElELAorCisJLyoqIE5MTyBzcGVjaWZpYyBldmVudHMgKi8KKwkvKiogTkxPIG1hdGNoIGV2ZW50IGFmdGVyIHRoZSBmaXJzdCBtYXRjaCAqLworCVdNSV9OTE9fTUFUQ0hfRVZFTlRJRCA9IFdNSV9FVlRfR1JQX1NUQVJUX0lEKFdNSV9HUlBfTkxPX09GTCksCisKKwkvKiogTkxPIHNjYW4gY29tcGxldGUgZXZlbnQgKi8KKwlXTUlfTkxPX1NDQU5fQ09NUExFVEVfRVZFTlRJRCwKKworCS8qKiBBUEZJTkQgc3BlY2lmaWMgZXZlbnRzICovCisJV01JX0FQRklORF9FVkVOVElELAorCisJLyoqIHBhc3Nwb2ludCBuZXR3b3JrIG1hdGNoIGV2ZW50ICovCisJV01JX1BBU1NQT0lOVF9NQVRDSF9FVkVOVElELAorCisJLyoqIEdUSyBvZmZsb2FkIHN0YXV0dXMgZXZlbnQgcmVxdWVzdGVkIGJ5IGhvc3QgKi8KKwlXTUlfR1RLX09GRkxPQURfU1RBVFVTX0VWRU5USUQgPQorCQlXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX0dUS19PRkwpLAorCisJLyoqIEdUSyBvZmZsb2FkIGZhaWxlZCB0byByZWtleSBldmVudCAqLworCVdNSV9HVEtfUkVLRVlfRkFJTF9FVkVOVElELAorCS8qIENTQSBJRSByZWNlaXZlZCBldmVudCAqLworCVdNSV9DU0FfSEFORExJTkdfRVZFTlRJRCA9CisJCVdNSV9FVlRfR1JQX1NUQVJUX0lEKFdNSV9HUlBfQ1NBX09GTCksCisKKwkvKmNoYXR0ZXIgcXVlcnkgcmVwbHkgZXZlbnQgKi8KKwlXTUlfQ0hBVFRFUl9QQ19RVUVSWV9FVkVOVElEID0KKwkJV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9DSEFUVEVSKSwKKworCS8qKiBlY2hvIGV2ZW50IGluIHJlc3BvbnNlIHRvIGVjaG8gY29tbWFuZCAqLworCVdNSV9FQ0hPX0VWRU5USUQgPSBXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX01JU0MpLAorCisJLyogISFJTVBPUlRBTlQhIQorCSAqIElmIHlvdSBuZWVkIHRvIGFkZCBhIG5ldyBXTUkgZXZlbnQgSUQgdG8gdGhlIFdNSV9HUlBfTUlTQyBzdWItZ3JvdXAsCisJICogcGxlYXNlIG1ha2Ugc3VyZSB5b3UgYWRkIGl0IEJFSElORCBXTUlfUERFVl9VVEZfRVZFTlRJRCwKKwkgKiBhcyB3ZSBNVVNUIGhhdmUgYSBmaXhlZCB2YWx1ZSBoZXJlIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgYmV0d2VlbgorCSAqIFVURiBhbmQgdGhlIEFSVDIgZHJpdmVyCisJICovCisJLyoqIFVURiBzcGVjaWZpYyBXTUkgZXZlbnQgKi8KKwlXTUlfUERFVl9VVEZfRVZFTlRJRCwKKworCS8qKiBldmVudCBjYXJyaWVzIGJ1ZmZlcmVkIGRlYnVnIG1lc3NhZ2VzICAqLworCVdNSV9ERUJVR19NRVNHX0VWRU5USUQsCisJLyoqIEZXIHN0YXRzKHBlcmlvZGljIG9yIG9uIHNob3QpICAqLworCVdNSV9VUERBVEVfU1RBVFNfRVZFTlRJRCwKKwkvKiogZGVidWcgcHJpbnQgbWVzc2FnZSB1c2VkIGZvciB0cmFjaW5nIEZXIGNvZGUgd2hpbGUgZGVidWdnaW5nICAqLworCVdNSV9ERUJVR19QUklOVF9FVkVOVElELAorCS8qKiBEQ1Mgd2xhbiBvciBub24td2xhbiBpbnRlcmZlcmVuY2UgZXZlbnQKKwkgKi8KKwlXTUlfRENTX0lOVEVSRkVSRU5DRV9FVkVOVElELAorCS8qKiBWSSBzcG9lY2lmaWMgZXZlbnQgICovCisJV01JX1BERVZfUVZJVF9FVkVOVElELAorCS8qKiBGVyBjb2RlIHByb2ZpbGUgZGF0YSBpbiByZXNwb25zZSB0byBwcm9maWxlIHJlcXVlc3QgICovCisJV01JX1dMQU5fUFJPRklMRV9EQVRBX0VWRU5USUQsCisJLyogRmFjdG9yeSBUZXN0aW5nIE1vZGUgcmVxdWVzdCBldmVudAorCSAqIHVzZWQgZm9yIGludGVncmF0ZWQgY2hpcHNldHMgKi8KKwlXTUlfUERFVl9GVE1fSU5UR19FVkVOVElELAorCS8qIGF2b2lkIGxpc3Qgb2YgZnJlcXVlbmNpZXMgLgorCSAqLworCVdNSV9XTEFOX0ZSRVFfQVZPSURfRVZFTlRJRCwKKwkvKiBJbmRpY2F0ZSB0aGUga2VlcGFsaXZlIHBhcmFtZXRlcnMgKi8KKwlXTUlfVkRFVl9HRVRfS0VFUEFMSVZFX0VWRU5USUQsCisJLyogVGhlcm1hbCBNYW5hZ2VtZW50IGV2ZW50ICovCisJV01JX1RIRVJNQUxfTUdNVF9FVkVOVElELAorCisJLyogQ29udGFpbmVyIGZvciBRWERNL0RJQUcgZXZlbnRzICovCisJV01JX0RJQUdfREFUQV9DT05UQUlORVJfRVZFTlRJRCwKKworCS8qIGhvc3QgYXV0byBzaHV0ZG93biBldmVudCAqLworCVdNSV9IT1NUX0FVVE9fU0hVVERPV05fRVZFTlRJRCwKKworCS8qdXBkYXRlIG1pYiBjb3VudGVycyB0b2dldGhlciB3aXRoIFdNSV9VUERBVEVfU1RBVFNfRVZFTlRJRCAqLworCVdNSV9VUERBVEVfV0hBTF9NSUJfU1RBVFNfRVZFTlRJRCwKKworCS8qdXBkYXRlIGh0L3ZodCBpbmZvIGJhc2VkIG9uIHZkZXYgKHJ4IGFuZCB0eCBOU1MgYW5kIHByZWFtYmxlKSAqLworCVdNSV9VUERBVEVfVkRFVl9SQVRFX1NUQVRTX0VWRU5USUQsCisKKwlXTUlfRElBR19FVkVOVElELAorCisJLyoqIFNldCBPQ0IgU2NoZWQgUmVzcG9uc2UsIGRlcHJlY2F0ZWQgKi8KKwlXTUlfT0NCX1NFVF9TQ0hFRF9FVkVOVElELAorCisJLyogZXZlbnQgdG8gaW5kaWNhdGUgdGhlIGZsdXNoIG9mIHRoZSBidWZmZXJlZCBkZWJ1ZyBtZXNzYWdlcyBpcyBjb21wbGV0ZSovCisJV01JX0RFQlVHX01FU0dfRkxVU0hfQ09NUExFVEVfRVZFTlRJRCwKKwkvKiBldmVudCB0byByZXBvcnQgbWl4L21heCBSU1NJIGJyZWFjaCBldmVudHMgKi8KKwlXTUlfUlNTSV9CUkVBQ0hfRVZFTlRJRCwKKworCS8qIEdQSU8gRXZlbnQgKi8KKwlXTUlfR1BJT19JTlBVVF9FVkVOVElEID0gV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9HUElPKSwKKwkvKiogdXBsb2FkIEhfQ1YgaW5mbyBXTUkgZXZlbnQKKwkgKiB0byBpbmRpY2F0ZSB1cGxvYWRlZCBIX0NWIGluZm8gdG8gaG9zdAorCSAqLworCVdNSV9VUExPQURIX0VWRU5USUQsCisKKwkvKiogY2FwdHVyZSBIIGluZm8gV01JIGV2ZW50CisJICogdG8gaW5kaWNhdGUgY2FwdHVyZWQgSCBpbmZvIHRvIGhvc3QKKwkgKi8KKwlXTUlfQ0FQVFVSRUhfRVZFTlRJRCwKKwkvKiBodyBSRmtpbGwgKi8KKwlXTUlfUkZLSUxMX1NUQVRFX0NIQU5HRV9FVkVOVElELAorCisJLyogVERMUyBFdmVudCAqLworCVdNSV9URExTX1BFRVJfRVZFTlRJRCA9IFdNSV9FVlRfR1JQX1NUQVJUX0lEKFdNSV9HUlBfVERMUyksCisKKwkvKmxvY2F0aW9uIHNjYW4gZXZlbnQgKi8KKwkvKnJlcG9ydCB0aGUgZmlybXdhcmUncyBjYXBhYmlsaXR5IG9mIGJhdGNoIHNjYW4gKi8KKwlXTUlfQkFUQ0hfU0NBTl9FTkFCTEVEX0VWRU5USUQgPQorCQlXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX0xPQ0FUSU9OX1NDQU4pLAorCS8qYmF0Y2ggc2NhbiByZXN1bHQgKi8KKwlXTUlfQkFUQ0hfU0NBTl9SRVNVTFRfRVZFTlRJRCwKKwkvKiBPRU0gRXZlbnQgKi8KKwlXTUlfT0VNX0NBUEFCSUxJVFlfRVZFTlRJRCA9IFdNSV9FVlRfR1JQX1NUQVJUX0lEKFdNSV9HUlBfT0VNKSwKKwlXTUlfT0VNX01FQVNVUkVNRU5UX1JFUE9SVF9FVkVOVElELAorCVdNSV9PRU1fRVJST1JfUkVQT1JUX0VWRU5USUQsCisKKwkvKiBOQU4gRXZlbnQgKi8KKwlXTUlfTkFOX0VWRU5USUQgPSBXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX05BTiksCisKKwkvKiBMUEkgRXZlbnQgKi8KKwlXTUlfTFBJX1JFU1VMVF9FVkVOVElEID0gV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9MUEkpLAorCVdNSV9MUElfU1RBVFVTX0VWRU5USUQsCisJV01JX0xQSV9IQU5ET0ZGX0VWRU5USUQsCisKKwkvKiBFeHRTY2FuIGV2ZW50cyAqLworCVdNSV9FWFRTQ0FOX1NUQVJUX1NUT1BfRVZFTlRJRCA9CisJCVdNSV9FVlRfR1JQX1NUQVJUX0lEKFdNSV9HUlBfRVhUU0NBTiksCisJV01JX0VYVFNDQU5fT1BFUkFUSU9OX0VWRU5USUQsCisJV01JX0VYVFNDQU5fVEFCTEVfVVNBR0VfRVZFTlRJRCwKKwlXTUlfRVhUU0NBTl9DQUNIRURfUkVTVUxUU19FVkVOVElELAorCVdNSV9FWFRTQ0FOX1dMQU5fQ0hBTkdFX1JFU1VMVFNfRVZFTlRJRCwKKwlXTUlfRVhUU0NBTl9IT1RMSVNUX01BVENIX0VWRU5USUQsCisJV01JX0VYVFNDQU5fQ0FQQUJJTElUSUVTX0VWRU5USUQsCisJV01JX0VYVFNDQU5fSE9UTElTVF9TU0lEX01BVENIX0VWRU5USUQsCisKKwkvKiBtRE5TIG9mZmxvYWQgZXZlbnRzICovCisJV01JX01ETlNfU1RBVFNfRVZFTlRJRCA9IFdNSV9FVlRfR1JQX1NUQVJUX0lEKFdNSV9HUlBfTUROU19PRkwpLAorCisJLyogU0FQIEF1dGhlbnRpY2F0aW9uIG9mZmxvYWQgZXZlbnRzICovCisJV01JX1NBUF9PRkxfQUREX1NUQV9FVkVOVElEID0gV01JX0VWVF9HUlBfU1RBUlRfSUQoV01JX0dSUF9TQVBfT0ZMKSwKKwlXTUlfU0FQX09GTF9ERUxfU1RBX0VWRU5USUQsCisKKwkvKiogT3V0LW9mLWNvbnRleHQtb2YtYnNzIChPQ0IpIGV2ZW50cyAqLworCVdNSV9PQ0JfU0VUX0NPTkZJR19SRVNQX0VWRU5USUQgPSBXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX09DQiksCisJV01JX09DQl9HRVRfVFNGX1RJTUVSX1JFU1BfRVZFTlRJRCwKKwlXTUlfRENDX0dFVF9TVEFUU19SRVNQX0VWRU5USUQsCisJV01JX0RDQ19VUERBVEVfTkRMX1JFU1BfRVZFTlRJRCwKKwlXTUlfRENDX1NUQVRTX0VWRU5USUQsCisJLyogU3lzdGVtLU9uLUNoaXAgZXZlbnRzICovCisJV01JX1NPQ19TRVRfSFdfTU9ERV9SRVNQX0VWRU5USUQgPSBXTUlfRVZUX0dSUF9TVEFSVF9JRChXTUlfR1JQX1NPQyksCisJV01JX1NPQ19IV19NT0RFX1RSQU5TSVRJT05fRVZFTlRJRCwKKwlXTUlfU09DX1NFVF9EVUFMX01BQ19DT05GSUdfUkVTUF9FVkVOVElELAorCS8qKiBNb3Rpb24gQWlkZWQgV2lGaSBDb25uZWN0aXZpdHkgKE1BV0MpIGV2ZW50cyAqLworCVdNSV9NQVdDX0VOQUJMRV9TRU5TT1JfRVZFTlRJRCA9IFdNSV9FVlRfR1JQX1NUQVJUX0lEKFdNSV9HUlBfTUFXQyksCisKK30gV01JX0VWVF9JRDsKKworLyogZGVmaW5lcyBmb3IgT0VNIG1lc3NhZ2Ugc3ViLXR5cGVzICovCisjZGVmaW5lIFdNSV9PRU1fQ0FQQUJJTElUWV9SRVEgICAgIDB4MDEKKyNkZWZpbmUgV01JX09FTV9DQVBBQklMSVRZX1JTUCAgICAgMHgwMgorI2RlZmluZSBXTUlfT0VNX01FQVNVUkVNRU5UX1JFUSAgICAweDAzCisjZGVmaW5lIFdNSV9PRU1fTUVBU1VSRU1FTlRfUlNQICAgIDB4MDQKKyNkZWZpbmUgV01JX09FTV9FUlJPUl9SRVBPUlRfUlNQICAgMHgwNQorI2RlZmluZSBXTUlfT0VNX05BTl9NRUFTX1JFUSAgICAgICAweDA2CisjZGVmaW5lIFdNSV9PRU1fTkFOX01FQVNfUlNQICAgICAgIDB4MDcKKyNkZWZpbmUgV01JX09FTV9OQU5fUEVFUl9JTkZPICAgICAgMHgwOAorI2RlZmluZSBXTUlfT0VNX0NPTkZJR1VSRV9MQ1IgICAgICAweDA5CisjZGVmaW5lIFdNSV9PRU1fQ09ORklHVVJFX0xDSSAgICAgIDB4MEEKKworLyogYmVsb3cgbWVzc2FnZSBzdWJ0eXBlIGlzIGludGVybmFsIHRvIENMRC4gVGFyZ2V0IHNob3VsZAorICogbmV2ZXIgdXNlIGludGVybmFsIHJlc3BvbnNlIHR5cGUKKyAqLworI2RlZmluZSBXTUlfT0VNX0lOVEVSTkFMX1JTUCAgICAgICAweGRlYWRiZWVmCisKKyNkZWZpbmUgV01JX0NIQU5fTElTVF9UQUcgMHgxCisjZGVmaW5lIFdNSV9TU0lEX0xJU1RfVEFHIDB4MgorI2RlZmluZSBXTUlfQlNTSURfTElTVF9UQUcgMHgzCisjZGVmaW5lIFdNSV9JRV9UQUcgMHg0CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGFubmVsICovCisJLyoqIHByaW1hcnkgMjAgTUh6IGNoYW5uZWwgZnJlcXVlbmN5IGluIG1oeiAqLworCUFfVUlOVDMyIG1oejsKKwkvKiogQ2VudGVyIGZyZXF1ZW5jeSAxIGluIE1IeiovCisJQV9VSU5UMzIgYmFuZF9jZW50ZXJfZnJlcTE7CisJLyoqIENlbnRlciBmcmVxdWVuY3kgMiBpbiBNSHogLSB2YWxpZCBvbmx5IGZvciAxMWFjdmh0IDgwcGx1czgwIG1vZGUqLworCUFfVUlOVDMyIGJhbmRfY2VudGVyX2ZyZXEyOworCS8qKiBjaGFubmVsIGluZm8gZGVzY3JpYmVkIGJlbG93ICovCisJQV9VSU5UMzIgaW5mbzsKKwkvKiogY29udGFpbnMgbWluIHBvd2VyLCBtYXggcG93ZXIsIHJlZyBwb3dlciBhbmQgcmVnIGNsYXNzIGlkLiAgKi8KKwlBX1VJTlQzMiByZWdfaW5mb18xOworCS8qKiBjb250YWlucyBhbnRlbm5hbWF4ICovCisJQV9VSU5UMzIgcmVnX2luZm9fMjsKK30gd21pX2NoYW5uZWw7CisKK3R5cGVkZWYgZW51bSB7CisJV01JX0NIQU5ORUxfQ0hBTkdFX0NBVVNFX05PTkUgPSAwLAorCVdNSV9DSEFOTkVMX0NIQU5HRV9DQVVTRV9DU0EsCit9IHdtaV9jaGFubmVsX2NoYW5nZV9jYXVzZTsKKworLyoqIGNoYW5uZWwgaW5mbyBjb25zaXN0cyBvZiA2IGJpdHMgb2YgY2hhbm5lbCBtb2RlICovCisKKyNkZWZpbmUgV01JX1NFVF9DSEFOTkVMX01PREUocHdtaV9jaGFubmVsLHZhbCkgZG8geyBcCisJCShwd21pX2NoYW5uZWwpLT5pbmZvICY9IDB4ZmZmZmZmYzA7CSAgICAgICBcCisJCShwd21pX2NoYW5uZWwpLT5pbmZvIHw9ICh2YWwpOwkJICAgICAgIFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBXTUlfR0VUX0NIQU5ORUxfTU9ERShwd21pX2NoYW5uZWwpICgocHdtaV9jaGFubmVsKS0+aW5mbyAmIDB4MDAwMDAwM2YgKQorCisjZGVmaW5lIFdNSV9DSEFOX0ZMQUdfSFQ0MF9QTFVTICAgNgorI2RlZmluZSBXTUlfQ0hBTl9GTEFHX1BBU1NJVkUgICAgIDcKKyNkZWZpbmUgV01JX0NIQU5fQURIT0NfQUxMT1dFRCAgICA4CisjZGVmaW5lIFdNSV9DSEFOX0FQX0RJU0FCTEVEICAgICAgOQorI2RlZmluZSBXTUlfQ0hBTl9GTEFHX0RGUyAgICAgICAgIDEwCisjZGVmaW5lIFdNSV9DSEFOX0ZMQUdfQUxMT1dfSFQgICAgMTEgICAgLyogSFQgaXMgYWxsb3dlZCBvbiB0aGlzIGNoYW5uZWwgKi8KKyNkZWZpbmUgV01JX0NIQU5fRkxBR19BTExPV19WSFQgICAxMiAgICAvKiBWSFQgaXMgYWxsb3dlZCBvbiB0aGlzIGNoYW5uZWwgKi8KKyNkZWZpbmUgV01JX0NIQU5ORUxfQ0hBTkdFX0NBVVNFX0NTQSAxMyAvKkluZGljYXRlIHJlYXNvbiBmb3IgY2hhbm5lbCBzd2l0Y2ggKi8KKyNkZWZpbmUgV01JX0NIQU5fRkxBR19IQUxGX1JBVEUgICAgIDE0ICAvKiBJbmRpY2F0ZXMgaGFsZiByYXRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgV01JX0NIQU5fRkxBR19RVUFSVEVSX1JBVEUgIDE1ICAvKiBJbmRpY2F0ZXMgcXVhcnRlciByYXRlIGNoYW5uZWwgKi8KKworI2RlZmluZSBXTUlfU0VUX0NIQU5ORUxfRkxBRyhwd21pX2NoYW5uZWwsZmxhZykgZG8geyBcCisJCShwd21pX2NoYW5uZWwpLT5pbmZvIHw9ICAoMSA8PCBmbGFnKTsJICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIFdNSV9HRVRfQ0hBTk5FTF9GTEFHKHB3bWlfY2hhbm5lbCxmbGFnKQkgIFwKKwkoKChwd21pX2NoYW5uZWwpLT5pbmZvICYgKDEgPDwgZmxhZykpID4+IGZsYWcpCisKKyNkZWZpbmUgV01JX1NFVF9DSEFOTkVMX01JTl9QT1dFUihwd21pX2NoYW5uZWwsdmFsKSBkbyB7IFwKKwkJKHB3bWlfY2hhbm5lbCktPnJlZ19pbmZvXzEgJj0gMHhmZmZmZmYwMDsJICAgIFwKKwkJKHB3bWlfY2hhbm5lbCktPnJlZ19pbmZvXzEgfD0gKHZhbCYweGZmKTsJICAgIFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgV01JX0dFVF9DSEFOTkVMX01JTl9QT1dFUihwd21pX2NoYW5uZWwpICgocHdtaV9jaGFubmVsKS0+cmVnX2luZm9fMSAmIDB4ZmYgKQorCisjZGVmaW5lIFdNSV9TRVRfQ0hBTk5FTF9NQVhfUE9XRVIocHdtaV9jaGFubmVsLHZhbCkgZG8geyBcCisJCShwd21pX2NoYW5uZWwpLT5yZWdfaW5mb18xICY9IDB4ZmZmZjAwZmY7CSAgICBcCisJCShwd21pX2NoYW5uZWwpLT5yZWdfaW5mb18xIHw9ICgodmFsJjB4ZmYpIDw8IDgpOyAgICBcCit9IHdoaWxlKDApCisjZGVmaW5lIFdNSV9HRVRfQ0hBTk5FTF9NQVhfUE9XRVIocHdtaV9jaGFubmVsKSAoICgoKHB3bWlfY2hhbm5lbCktPnJlZ19pbmZvXzEpID4+IDgpICYgMHhmZiApCisKKyNkZWZpbmUgV01JX1NFVF9DSEFOTkVMX1JFR19QT1dFUihwd21pX2NoYW5uZWwsdmFsKSBkbyB7IFwKKwkJKHB3bWlfY2hhbm5lbCktPnJlZ19pbmZvXzEgJj0gMHhmZjAwZmZmZjsJICAgIFwKKwkJKHB3bWlfY2hhbm5lbCktPnJlZ19pbmZvXzEgfD0gKCh2YWwmMHhmZikgPDwgMTYpOyAgIFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgV01JX0dFVF9DSEFOTkVMX1JFR19QT1dFUihwd21pX2NoYW5uZWwpICggKCgocHdtaV9jaGFubmVsKS0+cmVnX2luZm9fMSkgPj4gMTYpICYgMHhmZiApCisjZGVmaW5lIFdNSV9TRVRfQ0hBTk5FTF9SRUdfQ0xBU1NJRChwd21pX2NoYW5uZWwsdmFsKSBkbyB7IFwKKwkJKHB3bWlfY2hhbm5lbCktPnJlZ19pbmZvXzEgJj0gMHgwMGZmZmZmZjsJICAgICAgXAorCQkocHdtaV9jaGFubmVsKS0+cmVnX2luZm9fMSB8PSAoKHZhbCYweGZmKSA8PCAyNCk7ICAgICBcCit9IHdoaWxlKDApCisjZGVmaW5lIFdNSV9HRVRfQ0hBTk5FTF9SRUdfQ0xBU1NJRChwd21pX2NoYW5uZWwpICggKCgocHdtaV9jaGFubmVsKS0+cmVnX2luZm9fMSkgPj4gMjQpICYgMHhmZiApCisKKyNkZWZpbmUgV01JX1NFVF9DSEFOTkVMX0FOVEVOTkFfTUFYKHB3bWlfY2hhbm5lbCx2YWwpIGRvIHsgXAorCQkocHdtaV9jaGFubmVsKS0+cmVnX2luZm9fMiAmPSAweGZmZmZmZjAwOwkgICAgICBcCisJCShwd21pX2NoYW5uZWwpLT5yZWdfaW5mb18yIHw9ICh2YWwmMHhmZik7CSAgICAgIFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgV01JX0dFVF9DSEFOTkVMX0FOVEVOTkFfTUFYKHB3bWlfY2hhbm5lbCkgKChwd21pX2NoYW5uZWwpLT5yZWdfaW5mb18yICYgMHhmZiApCisKKy8qIG1heCB0eCBwb3dlciBpcyBpbiAxIGRCbSB1bml0cyAqLworI2RlZmluZSBXTUlfU0VUX0NIQU5ORUxfTUFYX1RYX1BPV0VSKHB3bWlfY2hhbm5lbCx2YWwpIGRvIHsgXAorCQkocHdtaV9jaGFubmVsKS0+cmVnX2luZm9fMiAmPSAweGZmZmYwMGZmOwkgICAgICAgXAorCQkocHdtaV9jaGFubmVsKS0+cmVnX2luZm9fMiB8PSAoKHZhbCYweGZmKTw8OCk7CSAgICAgICBcCit9IHdoaWxlKDApCisjZGVmaW5lIFdNSV9HRVRfQ0hBTk5FTF9NQVhfVFhfUE9XRVIocHdtaV9jaGFubmVsKSAoICgoKHB3bWlfY2hhbm5lbCktPnJlZ19pbmZvXzIpPj44KSAmIDB4ZmYgKQorCisKKy8qKiBIVCBDYXBhYmlsaXRpZXMqLworI2RlZmluZSBXTUlfSFRfQ0FQX0VOQUJMRUQgICAgICAgICAgICAgICAgMHgwMDAxICAgICAgICAvKiBIVCBFbmFibGVkLyBkaXNhYmxlZCAqLworI2RlZmluZSBXTUlfSFRfQ0FQX0hUMjBfU0dJICAgICAgICAgICAgICAgMHgwMDAyICAgICAgICAvKiBTaG9ydCBHdWFyZCBJbnRlcnZhbCB3aXRoIEhUMjAgKi8KKyNkZWZpbmUgV01JX0hUX0NBUF9EWU5BTUlDX1NNUFMgICAgICAgICAgIDB4MDAwNCAgICAgICAgLyogRHluYW1pYyBNSU1PIHBvd2Vyc2F2ZSAqLworI2RlZmluZSBXTUlfSFRfQ0FQX1RYX1NUQkMgICAgICAgICAgICAgICAgMHgwMDA4ICAgICAgICAvKiBCMyBUWCBTVEJDICovCisjZGVmaW5lIFdNSV9IVF9DQVBfVFhfU1RCQ19NQVNLX1NISUZUICAgICAzCisjZGVmaW5lIFdNSV9IVF9DQVBfUlhfU1RCQyAgICAgICAgICAgICAgICAweDAwMzAgICAgICAgIC8qIEI0LUI1IFJYIFNUQkMgKi8KKyNkZWZpbmUgV01JX0hUX0NBUF9SWF9TVEJDX01BU0tfU0hJRlQgICAgIDQKKyNkZWZpbmUgV01JX0hUX0NBUF9MRFBDICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgICAgICAgLyogTERQQyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgV01JX0hUX0NBUF9MX1NJR19UWE9QX1BST1QgICAgICAgIDB4MDA4MCAgICAgICAgLyogTC1TSUcgVFhPUCBQcm90ZWN0aW9uICovCisjZGVmaW5lIFdNSV9IVF9DQVBfTVBEVV9ERU5TSVRZICAgICAgICAgICAweDA3MDAgICAgICAgIC8qIE1QRFUgRGVuc2l0eSAqLworI2RlZmluZSBXTUlfSFRfQ0FQX01QRFVfREVOU0lUWV9NQVNLX1NISUZUIDgKKyNkZWZpbmUgV01JX0hUX0NBUF9IVDQwX1NHSSAgICAgICAgICAgICAgIDB4MDgwMAorCisvKiBUaGVzZSBtYWNyb3Mgc2hvdWxkIGJlIHVzZWQgd2hlbiB3ZSB3aXNoIHRvIGFkdmVydGlzZSBTVEJDIHN1cHBvcnQgZm9yCisgKiBvbmx5IDFTUyBvciAyU1Mgb3IgM1NTLiAqLworI2RlZmluZSBXTUlfSFRfQ0FQX1JYX1NUQkNfMVNTICAgICAgICAgICAgMHgwMDEwICAgICAgICAvKiBCNC1CNSBSWCBTVEJDICovCisjZGVmaW5lIFdNSV9IVF9DQVBfUlhfU1RCQ18yU1MgICAgICAgICAgICAweDAwMjAgICAgICAgIC8qIEI0LUI1IFJYIFNUQkMgKi8KKyNkZWZpbmUgV01JX0hUX0NBUF9SWF9TVEJDXzNTUyAgICAgICAgICAgIDB4MDAzMCAgICAgICAgLyogQjQtQjUgUlggU1RCQyAqLworCisjZGVmaW5lIFdNSV9IVF9DQVBfREVGQVVMVF9BTEwgKFdNSV9IVF9DQVBfRU5BQkxFRCAgICAgICB8IFwKKwkJCQlXTUlfSFRfQ0FQX0hUMjBfU0dJICAgICAgfCBcCisJCQkJV01JX0hUX0NBUF9IVDQwX1NHSSAgICAgIHwgXAorCQkJCVdNSV9IVF9DQVBfVFhfU1RCQyAgICAgICB8IFwKKwkJCQlXTUlfSFRfQ0FQX1JYX1NUQkMgICAgICAgfCBcCisJCQkJV01JX0hUX0NBUF9MRFBDKQorCisvKiBXTUlfVkhUX0NBUF8qIHRoZXNlIG1hcHMgdG8gaWVlZSA4MDIuMTFhYyB2aHQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbgorICAgZmllbGQuIFRoZSBmaWVsZHMgbm90IGRlZmluZWQgaGVyZSBhcmUgbm90IHN1cHBvcnRlZCwgb3IgcmVzZXJ2ZWQuCisgICBEbyBub3QgY2hhbmdlIHRoZXNlIG1hc2tzIGFuZCBpZiB5b3UgaGF2ZSB0byBhZGQgbmV3IG9uZSBmb2xsb3cgdGhlCisgICBiaXRtYXNrIGFzIHNwZWNpZmllZCBieSA4MDIuMTFhYyBkcmFmdC4KKyAqLworCisjZGVmaW5lIFdNSV9WSFRfQ0FQX01BWF9NUERVX0xFTl83OTM1ICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBXTUlfVkhUX0NBUF9NQVhfTVBEVV9MRU5fMTE0NTQgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgV01JX1ZIVF9DQVBfTUFYX01QRFVfTEVOX01BU0sgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIFdNSV9WSFRfQ0FQX0NIX1dJRFRIXzE2ME1IWiAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBXTUlfVkhUX0NBUF9DSF9XSURUSF84MFA4MF8xNjBNSFogICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgV01JX1ZIVF9DQVBfUlhfTERQQyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFdNSV9WSFRfQ0FQX1NHSV84ME1IWiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBXTUlfVkhUX0NBUF9TR0lfMTYwTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgV01JX1ZIVF9DQVBfVFhfU1RCQyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFdNSV9WSFRfQ0FQX1JYX1NUQkNfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBXTUlfVkhUX0NBUF9SWF9TVEJDX01BU0tfU0hJRlQgICAgICAgICAgIDgKKyNkZWZpbmUgV01JX1ZIVF9DQVBfU1VfQkZPUk1FUiAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFdNSV9WSFRfQ0FQX1NVX0JGT1JNRUUgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBXTUlfVkhUX0NBUF9NQVhfQ1NfQU5UX01BU0sgICAgICAgICAgICAgIDB4MDAwMEUwMDAKKyNkZWZpbmUgV01JX1ZIVF9DQVBfTUFYX0NTX0FOVF9NQVNLX1NISUZUICAgICAgICAxMworI2RlZmluZSBXTUlfVkhUX0NBUF9NQVhfU05EX0RJTV9NQVNLICAgICAgICAgICAgIDB4MDAwNzAwMDAKKyNkZWZpbmUgV01JX1ZIVF9DQVBfTUFYX1NORF9ESU1fTUFTS19TSElGVCAgICAgICAxNgorI2RlZmluZSBXTUlfVkhUX0NBUF9NVV9CRk9STUVSICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgV01JX1ZIVF9DQVBfTVVfQkZPUk1FRSAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFdNSV9WSFRfQ0FQX1RYT1BfUFMgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBXTUlfVkhUX0NBUF9NQVhfQU1QRFVfTEVOX0VYUCAgICAgICAgICAgIDB4MDM4MDAwMDAKKyNkZWZpbmUgV01JX1ZIVF9DQVBfTUFYX0FNUERVX0xFTl9FWFBfU0hJRlQgICAgICAyMworI2RlZmluZSBXTUlfVkhUX0NBUF9SWF9GSVhFRF9BTlQgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgV01JX1ZIVF9DQVBfVFhfRklYRURfQU5UICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisKKy8qIFRFTVBPUkFSWToKKyAqIFByZXNlcnZlIHRoZSBpbmNvcnJlY3Qgb2xkIG5hbWUgYXMgYW4gYWxpYXMgZm9yIHRoZSBjb3JyZWN0IG5ldyBuYW1lCisgKiB1bnRpbCBhbGwgcmVmZXJlbmNlcyB0byB0aGUgb2xkIG5hbWUgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSBhbGwgaG9zdHMKKyAqIGFuZCB0YXJnZXRzLgorICovCisjZGVmaW5lIFdNSV9WSFRfQ0FQX01BWF9BTVBEVV9MRU5fRVhQX1NISVQgV01JX1ZIVF9DQVBfTUFYX0FNUERVX0xFTl9FWFBfU0hJRlQKKworLyogVGhlc2UgbWFjcm9zIHNob3VsZCBiZSB1c2VkIHdoZW4gd2Ugd2lzaCB0byBhZHZlcnRpc2UgU1RCQyBzdXBwb3J0IGZvcgorICogb25seSAxU1Mgb3IgMlNTIG9yIDNTUy4gKi8KKyNkZWZpbmUgV01JX1ZIVF9DQVBfUlhfU1RCQ18xU1MgMHgwMDAwMDEwMAorI2RlZmluZSBXTUlfVkhUX0NBUF9SWF9TVEJDXzJTUyAweDAwMDAwMjAwCisjZGVmaW5lIFdNSV9WSFRfQ0FQX1JYX1NUQkNfM1NTIDB4MDAwMDAzMDAKKworLyogVEVNUE9SQVJZOgorICogUHJlc2VydmUgdGhlIGluY29ycmVjdCBvbGQgbmFtZSBhcyBhbiBhbGlhcyBmb3IgdGhlIGNvcnJlY3QgbmV3IG5hbWUKKyAqIHVudGlsIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBvbGQgbmFtZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIGFsbCBob3N0cworICogYW5kIHRhcmdldHMuCisgKi8KKyNkZWZpbmUgV01JX3ZIVF9DQVBfUlhfU1RCQ18zU1MgV01JX1ZIVF9DQVBfUlhfU1RCQ18zU1MKKworI2RlZmluZSBXTUlfVkhUX0NBUF9ERUZBVUxUX0FMTCAoV01JX1ZIVF9DQVBfTUFYX01QRFVfTEVOXzExNDU0ICB8CVwKKwkJCQkgV01JX1ZIVF9DQVBfU0dJXzgwTUhaICAgICAgICAgICB8CVwKKwkJCQkgV01JX1ZIVF9DQVBfVFhfU1RCQyAgICAgICAgICAgICB8CVwKKwkJCQkgV01JX1ZIVF9DQVBfUlhfU1RCQ19NQVNLICAgICAgICB8CVwKKwkJCQkgV01JX1ZIVF9DQVBfUlhfTERQQyAgICAgICAgICAgICB8CVwKKwkJCQkgV01JX1ZIVF9DQVBfTUFYX0FNUERVX0xFTl9FWFAgICB8CVwKKwkJCQkgV01JX1ZIVF9DQVBfUlhfRklYRURfQU5UICAgICAgICB8CVwKKwkJCQkgV01JX1ZIVF9DQVBfVFhfRklYRURfQU5UKQorCisvKiBJbnRlcmVzdGVkIHJlYWRlcnMgcmVmZXIgdG8gUngvVHggTUNTIE1hcCBkZWZpbml0aW9uIGFzIGRlZmluZWQgaW4KKyAgIDgwMi4xMWFjCisgKi8KKyNkZWZpbmUgV01JX1ZIVF9NQVhfTUNTXzRfU1NfTUFTSyhyLHNzKSAgICAgICgoMyAmIChyKSkgPDwgKCgoc3MpIC0gMSkgPDwgMSkpCisjZGVmaW5lIFdNSV9WSFRfTUFYX1NVUFBfUkFURV9NQVNLICAgICAgICAgICAweDFmZmYwMDAwCisjZGVmaW5lIFdNSV9WSFRfTUFYX1NVUFBfUkFURV9NQVNLX1NISUZUICAgICAxNgorCisvKiBXTUlfU1lTX0NBUFNfKiByZWZlciB0byB0aGUgY2FwYWJpbGl0aWVzIHRoYXQgc3lzdGVtIHN1cHBvcnQKKyAqLworI2RlZmluZSBXTUlfU1lTX0NBUF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgV01JX1NZU19DQVBfVFhQT1dFUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisKKy8qCisgKiBXTUkgRHVhbCBCYW5kIFNpbXVsdGFuZW91cyAoREJTKSBoYXJkd2FyZSBtb2RlIGxpc3QgYml0LW1hc2sgZGVmaW5pdGlvbnMuCisgKiBCaXRzIDU6MCBhcmUgcmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMF9UWF9TVFJFQU1TX0JJVFBPUyAgKDI4KQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMF9SWF9TVFJFQU1TX0JJVFBPUyAgKDI0KQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMV9UWF9TVFJFQU1TX0JJVFBPUyAgKDIwKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMV9SWF9TVFJFQU1TX0JJVFBPUyAgKDE2KQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMF9CQU5EV0lEVEhfQklUUE9TICAgKDEyKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMV9CQU5EV0lEVEhfQklUUE9TICAgKDgpCisjZGVmaW5lIFdNSV9EQlNfSFdfTU9ERV9EQlNfTU9ERV9CSVRQT1MgICAgICAgICAoNykKKyNkZWZpbmUgV01JX0RCU19IV19NT0RFX0FHSUxFX0RGU19NT0RFX0JJVFBPUyAgICg2KQorCisjZGVmaW5lIFdNSV9EQlNfSFdfTU9ERV9NQUMwX1RYX1NUUkVBTVNfTUFTSyAgICAoMHhmIDw8IFdNSV9EQlNfSFdfTU9ERV9NQUMwX1RYX1NUUkVBTVNfQklUUE9TKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMF9SWF9TVFJFQU1TX01BU0sgICAgKDB4ZiA8PCBXTUlfREJTX0hXX01PREVfTUFDMF9SWF9TVFJFQU1TX0JJVFBPUykKKyNkZWZpbmUgV01JX0RCU19IV19NT0RFX01BQzFfVFhfU1RSRUFNU19NQVNLICAgICgweGYgPDwgV01JX0RCU19IV19NT0RFX01BQzFfVFhfU1RSRUFNU19CSVRQT1MpCisjZGVmaW5lIFdNSV9EQlNfSFdfTU9ERV9NQUMxX1JYX1NUUkVBTVNfTUFTSyAgICAoMHhmIDw8IFdNSV9EQlNfSFdfTU9ERV9NQUMxX1JYX1NUUkVBTVNfQklUUE9TKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMF9CQU5EV0lEVEhfTUFTSyAgICAgKDB4ZiA8PCBXTUlfREJTX0hXX01PREVfTUFDMF9CQU5EV0lEVEhfQklUUE9TKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMV9CQU5EV0lEVEhfTUFTSyAgICAgKDB4ZiA8PCBXTUlfREJTX0hXX01PREVfTUFDMV9CQU5EV0lEVEhfQklUUE9TKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfREJTX01PREVfTUFTSyAgICAgICAgICAgKDB4MSA8PCBXTUlfREJTX0hXX01PREVfREJTX01PREVfQklUUE9TKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfQUdJTEVfREZTX01PREVfTUFTSyAgICAgKDB4MSA8PCBXTUlfREJTX0hXX01PREVfQUdJTEVfREZTX01PREVfQklUUE9TKQorCisjZGVmaW5lIFdNSV9EQlNfSFdfTU9ERV9NQUMwX1RYX1NUUkVBTVNfU0VUKGh3X21vZGUsIHZhbHVlKSBcCisgICAgV01JX1NFVF9CSVRTKGh3X21vZGUsIFdNSV9EQlNfSFdfTU9ERV9NQUMwX1RYX1NUUkVBTVNfQklUUE9TLCA0LCB2YWx1ZSkKKyNkZWZpbmUgV01JX0RCU19IV19NT0RFX01BQzBfUlhfU1RSRUFNU19TRVQoaHdfbW9kZSwgdmFsdWUpIFwKKyAgICBXTUlfU0VUX0JJVFMoaHdfbW9kZSwgV01JX0RCU19IV19NT0RFX01BQzBfUlhfU1RSRUFNU19CSVRQT1MsIDQsIHZhbHVlKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMV9UWF9TVFJFQU1TX1NFVChod19tb2RlLCB2YWx1ZSkgXAorICAgIFdNSV9TRVRfQklUUyhod19tb2RlLCBXTUlfREJTX0hXX01PREVfTUFDMV9UWF9TVFJFQU1TX0JJVFBPUywgNCwgdmFsdWUpCisjZGVmaW5lIFdNSV9EQlNfSFdfTU9ERV9NQUMxX1JYX1NUUkVBTVNfU0VUKGh3X21vZGUsIHZhbHVlKSBcCisgICAgV01JX1NFVF9CSVRTKGh3X21vZGUsIFdNSV9EQlNfSFdfTU9ERV9NQUMxX1JYX1NUUkVBTVNfQklUUE9TLCA0LCB2YWx1ZSkKKyNkZWZpbmUgV01JX0RCU19IV19NT0RFX01BQzBfQkFORFdJRFRIX1NFVChod19tb2RlLCB2YWx1ZSkgIFwKKyAgICBXTUlfU0VUX0JJVFMoaHdfbW9kZSwgV01JX0RCU19IV19NT0RFX01BQzBfQkFORFdJRFRIX0JJVFBPUywgNCwgdmFsdWUpCisjZGVmaW5lIFdNSV9EQlNfSFdfTU9ERV9NQUMxX0JBTkRXSURUSF9TRVQoaHdfbW9kZSwgdmFsdWUpICBcCisgICAgV01JX1NFVF9CSVRTKGh3X21vZGUsIFdNSV9EQlNfSFdfTU9ERV9NQUMxX0JBTkRXSURUSF9CSVRQT1MsIDQsIHZhbHVlKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfREJTX01PREVfU0VUKGh3X21vZGUsIHZhbHVlKSAgICAgICAgXAorICAgIFdNSV9TRVRfQklUUyhod19tb2RlLCBXTUlfREJTX0hXX01PREVfREJTX01PREVfQklUUE9TLCAxLCB2YWx1ZSkKKyNkZWZpbmUgV01JX0RCU19IV19NT0RFX0FHSUxFX0RGU19TRVQoaHdfbW9kZSwgdmFsdWUpICAgICAgIFwKKyAgICBXTUlfU0VUX0JJVFMoaHdfbW9kZSwgV01JX0RCU19IV19NT0RFX0FHSUxFX0RGU19NT0RFX0JJVFBPUywgMSwgdmFsdWUpCisKKyNkZWZpbmUgV01JX0RCU19IV19NT0RFX01BQzBfVFhfU1RSRUFNU19HRVQoaHdfbW9kZSkgICAgXAorICAgICgoaHdfbW9kZSAmIFdNSV9EQlNfSFdfTU9ERV9NQUMwX1RYX1NUUkVBTVNfTUFTSykgPj4gV01JX0RCU19IV19NT0RFX01BQzBfVFhfU1RSRUFNU19CSVRQT1MpCisjZGVmaW5lIFdNSV9EQlNfSFdfTU9ERV9NQUMwX1JYX1NUUkVBTVNfR0VUKGh3X21vZGUpICAgIFwKKyAgICAoKGh3X21vZGUgJiBXTUlfREJTX0hXX01PREVfTUFDMF9SWF9TVFJFQU1TX01BU0spID4+IFdNSV9EQlNfSFdfTU9ERV9NQUMwX1JYX1NUUkVBTVNfQklUUE9TKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfTUFDMV9UWF9TVFJFQU1TX0dFVChod19tb2RlKSAgICBcCisgICAgKChod19tb2RlICYgV01JX0RCU19IV19NT0RFX01BQzFfVFhfU1RSRUFNU19NQVNLKSA+PiBXTUlfREJTX0hXX01PREVfTUFDMV9UWF9TVFJFQU1TX0JJVFBPUykKKyNkZWZpbmUgV01JX0RCU19IV19NT0RFX01BQzFfUlhfU1RSRUFNU19HRVQoaHdfbW9kZSkgICAgXAorICAgICgoaHdfbW9kZSAmIFdNSV9EQlNfSFdfTU9ERV9NQUMxX1JYX1NUUkVBTVNfTUFTSykgPj4gV01JX0RCU19IV19NT0RFX01BQzFfUlhfU1RSRUFNU19CSVRQT1MpCisjZGVmaW5lIFdNSV9EQlNfSFdfTU9ERV9NQUMwX0JBTkRXSURUSF9HRVQoaHdfbW9kZSkgICAgIFwKKyAgICAoKGh3X21vZGUgJiBXTUlfREJTX0hXX01PREVfTUFDMF9CQU5EV0lEVEhfTUFTSykgPj4gV01JX0RCU19IV19NT0RFX01BQzBfQkFORFdJRFRIX0JJVFBPUykKKyNkZWZpbmUgV01JX0RCU19IV19NT0RFX01BQzFfQkFORFdJRFRIX0dFVChod19tb2RlKSAgICAgXAorICAgICgoaHdfbW9kZSAmIFdNSV9EQlNfSFdfTU9ERV9NQUMxX0JBTkRXSURUSF9NQVNLKSA+PiBXTUlfREJTX0hXX01PREVfTUFDMV9CQU5EV0lEVEhfQklUUE9TKQorI2RlZmluZSBXTUlfREJTX0hXX01PREVfREJTX01PREVfR0VUKGh3X21vZGUpICAgICAgICAgICBcCisgICAgKChod19tb2RlICYgV01JX0RCU19IV19NT0RFX0RCU19NT0RFX01BU0spID4+IFdNSV9EQlNfSFdfTU9ERV9EQlNfTU9ERV9CSVRQT1MpCisjZGVmaW5lIFdNSV9EQlNfSFdfTU9ERV9BR0lMRV9ERlNfR0VUKGh3X21vZGUpICAgICAgICAgIFwKKyAgICAoKGh3X21vZGUgJiBXTUlfREJTX0hXX01PREVfQUdJTEVfREZTX01PREVfTUFTSykgPj4gV01JX0RCU19IV19NT0RFX0FHSUxFX0RGU19NT0RFX0JJVFBPUykKKworI2RlZmluZSBXTUlfREJTX0NPTkNfU0NBTl9DRkdfREJTX1NDQU5fQklUUE9TICAgICgzMSkKKyNkZWZpbmUgV01JX0RCU19DT05DX1NDQU5fQ0ZHX0FHSUxFX1NDQU5fQklUUE9TICAgKDMwKQorI2RlZmluZSBXTUlfREJTX0NPTkNfU0NBTl9DRkdfQUdJTEVfREZTX1NDQU5fQklUUE9TICAoMjkpCisKKyNkZWZpbmUgV01JX0RCU19DT05DX1NDQU5fQ0ZHX0RCU19TQ0FOX01BU0sgICAgKDB4MSA8PCBXTUlfREJTX0NPTkNfU0NBTl9DRkdfREJTX1NDQU5fQklUUE9TKQorI2RlZmluZSBXTUlfREJTX0NPTkNfU0NBTl9DRkdfQUdJTEVfU0NBTl9NQVNLICAgKDB4MSA8PCBXTUlfREJTX0NPTkNfU0NBTl9DRkdfQUdJTEVfU0NBTl9CSVRQT1MpCisjZGVmaW5lIFdNSV9EQlNfQ09OQ19TQ0FOX0NGR19BR0lMRV9ERlNfU0NBTl9NQVNLICAoMHgxIDw8IFdNSV9EQlNfQ09OQ19TQ0FOX0NGR19BR0lMRV9ERlNfU0NBTl9CSVRQT1MpCisKKyNkZWZpbmUgV01JX0RCU19DT05DX1NDQU5fQ0ZHX0RCU19TQ0FOX1NFVChzY2FuX2NmZywgdmFsdWUpIFwKKyAgICBXTUlfU0VUX0JJVFMoc2Nhbl9jZmcsIFdNSV9EQlNfQ09OQ19TQ0FOX0NGR19EQlNfU0NBTl9CSVRQT1MsIDEsIHZhbHVlKQorI2RlZmluZSBXTUlfREJTX0NPTkNfU0NBTl9DRkdfQUdJTEVfU0NBTl9TRVQoc2Nhbl9jZmcsIHZhbHVlKSBcCisgICAgV01JX1NFVF9CSVRTKHNjYW5fY2ZnLCBXTUlfREJTX0NPTkNfU0NBTl9DRkdfQUdJTEVfU0NBTl9CSVRQT1MsIDEsIHZhbHVlKQorI2RlZmluZSBXTUlfREJTX0NPTkNfU0NBTl9DRkdfQUdJTEVfREZTX1NDQU5fU0VUKHNjYW5fY2ZnLCB2YWx1ZSkgXAorICAgIFdNSV9TRVRfQklUUyhzY2FuX2NmZywgV01JX0RCU19DT05DX1NDQU5fQ0ZHX0FHSUxFX0RGU19TQ0FOX0JJVFBPUywgMSwgdmFsdWUpCisKKyNkZWZpbmUgV01JX0RCU19DT05DX1NDQU5fQ0ZHX0RCU19TQ0FOX0dFVChzY2FuX2NmZykgICAgXAorICAgICgoc2Nhbl9jZmcgJiBXTUlfREJTX0NPTkNfU0NBTl9DRkdfREJTX1NDQU5fTUFTSykgPj4gV01JX0RCU19DT05DX1NDQU5fQ0ZHX0RCU19TQ0FOX0JJVFBPUykKKyNkZWZpbmUgV01JX0RCU19DT05DX1NDQU5fQ0ZHX0FHSUxFX1NDQU5fR0VUKHNjYW5fY2ZnKSAgICBcCisgICAgKChzY2FuX2NmZyAmIFdNSV9EQlNfQ09OQ19TQ0FOX0NGR19BR0lMRV9TQ0FOX01BU0spID4+IFdNSV9EQlNfQ09OQ19TQ0FOX0NGR19BR0lMRV9TQ0FOX0JJVFBPUykKKyNkZWZpbmUgV01JX0RCU19DT05DX1NDQU5fQ0ZHX0FHSUxFX0RGU19TQ0FOX0dFVChzY2FuX2NmZykgICAgXAorICAgICgoc2Nhbl9jZmcgJiBXTUlfREJTX0NPTkNfU0NBTl9DRkdfQUdJTEVfREZTX1NDQU5fTUFTSykgPj4gV01JX0RCU19DT05DX1NDQU5fQ0ZHX0FHSUxFX0RGU19TQ0FOX0JJVFBPUykKKworI2RlZmluZSBXTUlfREJTX0ZXX01PREVfQ0ZHX0RCU19CSVRQT1MgICAgICAgICAgKDMxKQorI2RlZmluZSBXTUlfREJTX0ZXX01PREVfQ0ZHX0FHSUxFX0RGU19CSVRQT1MgICAgKDMwKQorCisjZGVmaW5lIFdNSV9EQlNfRldfTU9ERV9DRkdfREJTX01BU0sgICAgICAgICAgKDB4MSA8PCBXTUlfREJTX0ZXX01PREVfQ0ZHX0RCU19CSVRQT1MpCisjZGVmaW5lIFdNSV9EQlNfRldfTU9ERV9DRkdfQUdJTEVfREZTX01BU0sgICAgKDB4MSA8PCBXTUlfREJTX0ZXX01PREVfQ0ZHX0FHSUxFX0RGU19CSVRQT1MpCisKKyNkZWZpbmUgV01JX0RCU19GV19NT0RFX0NGR19EQlNfU0VUKGZ3X21vZGUsIHZhbHVlKSBcCisJV01JX1NFVF9CSVRTKGZ3X21vZGUsIFdNSV9EQlNfRldfTU9ERV9DRkdfREJTX0JJVFBPUywgMSwgdmFsdWUpCisjZGVmaW5lIFdNSV9EQlNfRldfTU9ERV9DRkdfQUdJTEVfREZTX1NFVChmd19tb2RlLCB2YWx1ZSkgXAorCVdNSV9TRVRfQklUUyhmd19tb2RlLCBXTUlfREJTX0ZXX01PREVfQ0ZHX0FHSUxFX0RGU19CSVRQT1MsIDEsIHZhbHVlKQorCisjZGVmaW5lIFdNSV9EQlNfRldfTU9ERV9DRkdfREJTX0dFVChmd19tb2RlKSAgICBcCisJKChmd19tb2RlICYgV01JX0RCU19GV19NT0RFX0NGR19EQlNfTUFTSykgPj4gV01JX0RCU19GV19NT0RFX0NGR19EQlNfQklUUE9TKQorI2RlZmluZSBXTUlfREJTX0ZXX01PREVfQ0ZHX0FHSUxFX0RGU19HRVQoZndfbW9kZSkgICAgXAorCSgoZndfbW9kZSAmIFdNSV9EQlNfRldfTU9ERV9DRkdfQUdJTEVfREZTX01BU0spID4+IFdNSV9EQlNfRldfTU9ERV9DRkdfQUdJTEVfREZTX0JJVFBPUykKKworLyoqIE5PVEU6IFRoaXMgc3RydWN0dXJlIGNhbm5vdCBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlIHdpdGhvdXQgYnJlYWtpbmcgV01JIGNvbXBhdGliaWxpdHkgKi8KK3R5cGVkZWYgc3RydWN0IF93bWlfYWJpX3ZlcnNpb24geworCUFfVUlOVDMyIGFiaV92ZXJzaW9uXzA7CisJLyoqIFdNSSBNYWpvciBhbmQgTWlub3IgdmVyc2lvbnMgKi8KKwlBX1VJTlQzMiBhYmlfdmVyc2lvbl8xOworCS8qKiBXTUkgY2hhbmdlIHJldmlzaW9uICovCisJQV9VSU5UMzIgYWJpX3ZlcnNpb25fbnNfMDsKKwkvKiogQUJJIHZlcnNpb24gbmFtZXNwYWNlIGZpcnN0IGZvdXIgZHdvcmRzICovCisJQV9VSU5UMzIgYWJpX3ZlcnNpb25fbnNfMTsKKwkvKiogQUJJIHZlcnNpb24gbmFtZXNwYWNlIHNlY29uZCBmb3VyIGR3b3JkcyAqLworCUFfVUlOVDMyIGFiaV92ZXJzaW9uX25zXzI7CisJLyoqIEFCSSB2ZXJzaW9uIG5hbWVzcGFjZSB0aGlyZCBmb3VyIGR3b3JkcyAqLworCUFfVUlOVDMyIGFiaV92ZXJzaW9uX25zXzM7CisJLyoqIEFCSSB2ZXJzaW9uIG5hbWVzcGFjZSBmb3VydGggZm91ciBkd29yZHMgKi8KK30gd21pX2FiaV92ZXJzaW9uOworCisvKgorICogbWF4aW11bSBudW1iZXIgb2YgbWVtcm95IHJlcXVlc3RzIGFsbG93ZWQgZnJvbSBGVy4KKyAqLworI2RlZmluZSBXTUlfTUFYX01FTV9SRVFTIDE2CisKKy8qICEhTk9URSEhOgorICogVGhpcyBIV19CRF9JTkZPX1NJWkUgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dCBicmVha2luZyBjb21wYXRpYmlsaXR5LgorICogUGxlYXNlIGRvbid0IGNoYW5nZSBpdC4KKyAqLworI2RlZmluZSBIV19CRF9JTkZPX1NJWkUgICAgICAgNQorCisvKioKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0IGhvbGRzIG9wdGlvbmFsIHBheWxvYWQgZm9yCisgKiB3bWlfc2VydmljZV9yZWFkeV9ldmVudF9maXhlZF9wYXJhbSxlLmcuLCAxMWFjIHBhc3Mgc29tZSBvZiB0aGUKKyAqIGRldmljZSBjYXBhYmlsaXR5IHRvIHRoZSBob3N0LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ19XTUlfU0VSVklDRV9SRUFEWV9FVkVOVCAqLworCUFfVUlOVDMyIGZ3X2J1aWxkX3ZlcnM7ICAgICAgICAgLyogZmlybXdhcmUgYnVpbGQgbnVtYmVyICovCisJd21pX2FiaV92ZXJzaW9uIGZ3X2FiaV92ZXJzOworCUFfVUlOVDMyIHBoeV9jYXBhYmlsaXR5OyAgICAgICAgICAgICAgICAvKiBXTUlfUEhZX0NBUEFCSUxJVFkgKi8KKwlBX1VJTlQzMiBtYXhfZnJhZ19lbnRyeTsgICAgICAgICAgICAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgZnJhZyB0YWJsZSBlbnRyaWVzIHRoYXQgU1cgd2lsbCBwb3B1bGF0ZSBsZXNzIDEgKi8KKwlBX1VJTlQzMiBudW1fcmZfY2hhaW5zOworCS8qIFRoZSBmb2xsb3dpbmcgZmllbGQgaXMgb25seSB2YWxpZCBmb3Igc2VydmljZSB0eXBlIFdNSV9TRVJWSUNFXzExQUMgKi8KKwlBX1VJTlQzMiBodF9jYXBfaW5mbzsgICAgICAgICAgIC8qIFdNSSBIVCBDYXBhYmlsaXR5ICovCisJQV9VSU5UMzIgdmh0X2NhcF9pbmZvOyAgICAgICAgICAvKiBWSFQgY2FwYWJpbGl0eSBpbmZvIGZpZWxkIG9mIDgwMi4xMWFjICovCisJQV9VSU5UMzIgdmh0X3N1cHBfbWNzOyAgICAgICAgICAvKiBWSFQgU3VwcG9ydGVkIE1DUyBTZXQgZmllbGQgUngvVHggc2FtZSAqLworCUFfVUlOVDMyIGh3X21pbl90eF9wb3dlcjsKKwlBX1VJTlQzMiBod19tYXhfdHhfcG93ZXI7CisJQV9VSU5UMzIgc3lzX2NhcF9pbmZvOworCUFfVUlOVDMyIG1pbl9wa3Rfc2l6ZV9lbmFibGU7ICAgICAgICAgICAvKiBFbnRlcnByaXNlIG1vZGUgc2hvcnQgcGt0IGVuYWJsZSAqLworCS8qKiBNYXggYmVhY29uIGFuZCBQcm9iZSBSZXNwb25zZSBJRSBvZmZsb2FkIHNpemUgKGluY2x1ZGVzCisJICogIG9wdGlvbmFsIFAyUCBJRXMpICovCisJQV9VSU5UMzIgbWF4X2Jjbl9pZV9zaXplOworCS8qCisJICogcmVxdWVzdCB0byBob3N0IHRvIGFsbG9jYXRlIGEgY2h1Y2sgb2YgbWVtb3J5IGFuZCBwc3MgaXQgZG93biB0byBGVyB2aWEgV01fSU5JVC4KKwkgKiBGVyB1c2VzIHRoaXMgYXMgRlcgZXh0ZXNuc2lvbiBtZW1vcnkgZm9yIHNhdmluZyBpdHMgZGF0YSBzdHJ1Y3R1cmVzLiBPbmx5IHZhbGlkCisJICogZm9yIGxvdyBsYXRlbmN5IGludGVyZmFjZXMgbGlrZSBQQ0lFIHdoZXJlIEZXIGNhbiBhY2Nlc3MgdGhpcyBtZW1vcnkgZGlyZWN0bHkgKG9yKQorCSAqIGJ5IERNQS4KKwkgKi8KKwlBX1VJTlQzMiBudW1fbWVtX3JlcXM7CisJLyogTWF4IE5vLiBzY2FuIGNoYW5uZWxzIHRhcmdldCBjYW4gc3VwcG9ydAorCSAqIElmIEZXIGlzIHRvbyBvbGQgYW5kIGRvZXNuJ3QgaW5kaWNhdGUgdGhpcyBudW1iZXIsIGhvc3Qgc2lkZSB2YWx1ZSB3aWxsIGRlZmF1bHQgdG8KKwkgKiAwLCBhbmQgaG9zdCB3aWxsIHRha2UgdGhlIG9yaWdpbmFsIGNvbXBhdGlibGUgdmFsdWUgKDYyKSBmb3IgZnV0dXJlIHNjYW4gY2hhbm5lbAorCSAqIHNldHVwLgorCSAqLworCUFfVUlOVDMyIG1heF9udW1fc2Nhbl9jaGFubmVsczsKKworCS8qIEhhcmR3YXJlIGJvYXJkIHNwZWNpZmljIElELiBWYWx1ZXMgZGVmaW5lZCBpbiBlbnVtIFdNSV9IV0JPQVJEX0lELgorCSAqIERlZmF1bHQgMCBtZWFucyB0aGEgaHdfYmRfaW5mb1tdIGlzIGludmFsaWQobGVnYWN5IGJvYXJkKS4KKwkgKi8KKwlBX1VJTlQzMiBod19iZF9pZDsKKwlBX1VJTlQzMiBod19iZF9pbmZvW0hXX0JEX0lORk9fU0laRV07ICAgICAgICAgICAvKiBCb2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gSW52YWxpZCBpZiBod19oZF9pZCBpcyB6ZXJvLiAqLworCisJLyoKKwkgKiBOdW1iZXIgb2YgTUFDcyBzdXBwb3J0ZWQsIGkuZS4gYSBEQlMtY2FwYWJsZSBkZXZpY2Ugd2lsbCByZXR1cm4gMgorCSAqLworCUFfVUlOVDMyIG1heF9zdXBwb3J0ZWRfbWFjczsKKworCS8qCisJICogRlcgc3ViLWZlYXR1cmUgY2FwYWJpbGl0aWVzIHRvIGJlIHVzZWQgaW4gY29uY3VycmVuY2Ugd2l0aAorCSAqIHdtaV9zZXJ2aWNlX2JpdG1hcAorCSAqIHZhbHVlcyBmcm9tIGVudW0gV01JX0ZXX1NVQl9GRUFUX0NBUFMKKwkgKi8KKwlBX1VJTlQzMiB3bWlfZndfc3ViX2ZlYXRfY2FwczsKKwkvKgorCSAqIE51bWJlciBvZiBEdWFsIEJhbmQgU2ltdWx0YW5lb3VzIChEQlMpIGhhcmR3YXJlIG1vZGVzCisJICovCisJQV9VSU5UMzIgbnVtX2Ric19od19tb2RlczsKKwkvKgorCSAqIHR4cnhfY2hhaW5tYXNrCisJICogICAgWzc6MF0gICAtIDJHIGJhbmQgdHggY2hhaW4gbWFzaworCSAqICAgIFsxNTo4XSAgLSAyRyBiYW5kIHJ4IGNoYWluIG1hc2sKKwkgKiAgICBbMjM6MTZdIC0gNUcgYmFuZCB0eCBjaGFpbiBtYXNrCisJICogICAgWzMxOjI0XSAtIDVHIGJhbmQgcnggY2hhaW4gbWFzaworCSAqCisJICovCisJQV9VSU5UMzIgdHhyeF9jaGFpbm1hc2s7CisKKwkvKgorCSAqIGRlZmF1bHQgRHVhbCBCYW5kIFNpbXVsdGFuZW91cyAoREJTKSBoYXJkd2FyZSBtb2RlCisJICovCisJQV9VSU5UMzIgZGVmYXVsdF9kYnNfaHdfbW9kZV9pbmRleDsKKworCS8qCisJICogTnVtYmVyIG9mIG1zZHUgZGVzY3JpcHRvcnMgdGFyZ2V0IHdvdWxkIHVzZQorCSAqLworCUFfVUlOVDMyIG51bV9tc2R1X2Rlc2M7CisKKwkvKiBUaGUgVExWcyBmb3IgaGFsX3JlZ19jYXBhYmlsaXRpZXMsIHdtaV9zZXJ2aWNlX2JpdG1hcCBhbmQgbWVtX3JlcXNbXSB3aWxsIGZvbGxvdyB0aGlzIFRMVi4KKwkgKiAgICAgSEFMX1JFR19DQVBBQklMSVRJRVMgICBoYWxfcmVnX2NhcGFiaWxpdGllczsKKwkgKiAgICAgQV9VSU5UMzIgd21pX3NlcnZpY2VfYml0bWFwW1dNSV9TRVJWSUNFX0JNX1NJWkVdOworCSAqICAgICB3bGFuX2hvc3RfbWVtX3JlcSBtZW1fcmVxc1tdOworCSAqICAgICB3bGFuX2Ric19od19tb2RlX2xpc3RbXTsKKwkgKi8KK30gd21pX3NlcnZpY2VfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKldNSVRMVl9UQUdfU1RSVUNfV01JX1NFUlZJQ0VfRVhUX1JFQURZX0VWRU5UCisJICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiB3aGljaCBXTUlfREJTX0NPTkNfU0NBTl9DRkcgc2V0dGluZyB0aGUgRlcgaXMgaW5pdGlhbGl6ZWQgd2l0aCAqLworCUFfVUlOVDMyIGRlZmF1bHRfY29uY19zY2FuX2NvbmZpZ19iaXRzOworCS8qIHdoaWNoIFdNSV9EQlNfRldfTU9ERV9DRkcgc2V0dGluZyB0aGUgRlcgaXMgaW5pdGlhbGl6ZWQgd2l0aCAqLworCUFfVUlOVDMyIGRlZmF1bHRfZndfY29uZmlnX2JpdHM7Cit9IHdtaV9zZXJ2aWNlX3JlYWR5X2V4dF9ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBlbnVtIHsKKwlXTUlfSFdCRF9OT05FID0gMCwgICAgICAgICAgICAgIC8qIE5vIGh3IGJvYXJkIGluZm9ybWF0aW9uIGlzIGdpdmVuICovCisJV01JX0hXQkRfUUNBNjE3NCA9IDEsICAgICAgICAgICAvKiBSb21lKEFSNjMyMCkgKi8KKwlXTUlfSFdCRF9RQ0EyNTgyID0gMiwgICAgICAgICAgIC8qIEtpbGxlciAxNTI1ICovCit9IFdNSV9IV0JEX0lEOworCit0eXBlZGVmIGVudW0geworCVdNSV9GV19TVEFfUlRUX0lOSVRSID0gICAgIDB4MDAwMDAwMDEsCisJV01JX0ZXX1NUQV9SVFRfUkVTUFIgPSAgICAgMHgwMDAwMDAwMiwKKwlXTUlfRldfUDJQX0NMSV9SVFRfSU5JVFIgPSAweDAwMDAwMDA0LAorCVdNSV9GV19QMlBfQ0xJX1JUVF9SRVNQUiA9IDB4MDAwMDAwMDgsCisJV01JX0ZXX1AyUF9HT19SVFRfSU5JVFIgPSAgMHgwMDAwMDAxMCwKKwlXTUlfRldfUDJQX0dPX1JUVF9SRVNQUiA9ICAweDAwMDAwMDIwLAorCVdNSV9GV19BUF9SVFRfSU5JVFIgPSAgICAgIDB4MDAwMDAwNDAsCisJV01JX0ZXX0FQX1JUVF9SRVNQUiA9ICAgICAgMHgwMDAwMDA4MCwKKwlXTUlfRldfTkFOX1JUVF9JTklUUiA9ICAgICAweDAwMDAwMTAwLAorCVdNSV9GV19OQU5fUlRUX1JFU1BSID0gICAgIDB4MDAwMDAyMDAsCisJLyoKKwkgKiBOZXcgZncgc3ViIGZlYXR1cmUgY2FwYWJpbGl0ZXMgYmVmb3JlCisJICogV01JX0ZXX01BWF9TVUJfRkVBVF9DQVAKKwkgKi8KKwlXTUlfRldfTUFYX1NVQl9GRUFUX0NBUCA9ICAweDgwMDAwMDAwLAorfSBXTUlfRldfU1VCX0ZFQVRfQ0FQUzsKKworI2RlZmluZSBBVEhfQkRfREFUQV9SRVZfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgQVRIX0JEX0RBVEFfUkVWX1NISUZUICAgICAgICAgICAwCisKKyNkZWZpbmUgQVRIX0JEX0RBVEFfUFJPSl9JRF9NQVNLICAgICAgICAweDAwMDBGRjAwCisjZGVmaW5lIEFUSF9CRF9EQVRBX1BST0pfSURfU0hJRlQgICAgICAgOAorCisjZGVmaW5lIEFUSF9CRF9EQVRBX0NVU1RfSURfTUFTSyAgICAgICAgMHgwMEZGMDAwMAorI2RlZmluZSBBVEhfQkRfREFUQV9DVVNUX0lEX1NISUZUICAgICAgIDE2CisKKyNkZWZpbmUgQVRIX0JEX0RBVEFfUkVGX0RFU0lHTl9JRF9NQVNLICAweEZGMDAwMDAwCisjZGVmaW5lIEFUSF9CRF9EQVRBX1JFRl9ERVNJR05fSURfU0hJRlQgMjQKKworI2RlZmluZSBTRVRfQkRfREFUQV9SRVYoYmRfZGF0YV92ZXIsIHZhbHVlKQlcCisJKChiZF9kYXRhX3ZlcikgJj0gfkFUSF9CRF9EQVRBX1JFVl9NQVNLLCAoYmRfZGF0YV92ZXIpIHw9ICgodmFsdWUpIDw8IEFUSF9CRF9EQVRBX1JFVl9TSElGVCkpCisKKyNkZWZpbmUgR0VUX0JEX0RBVEFfUkVWKGJkX2RhdGFfdmVyKQkJXAorCSgoKGJkX2RhdGFfdmVyKSAmIEFUSF9CRF9EQVRBX1JFVl9NQVNLKSA+PiBBVEhfQkRfREFUQV9SRVZfU0hJRlQpCisKKyNkZWZpbmUgU0VUX0JEX0RBVEFfUFJPSl9JRChiZF9kYXRhX3ZlciwgdmFsdWUpCVwKKwkoKGJkX2RhdGFfdmVyKSAmPSB+QVRIX0JEX0RBVEFfUFJPSl9JRF9NQVNLLCAoYmRfZGF0YV92ZXIpIHw9ICgodmFsdWUpIDw8IEFUSF9CRF9EQVRBX1BST0pfSURfU0hJRlQpKQorCisjZGVmaW5lIEdFVF9CRF9EQVRBX1BST0pfSUQoYmRfZGF0YV92ZXIpCVwKKwkoKChiZF9kYXRhX3ZlcikgJiBBVEhfQkRfREFUQV9QUk9KX0lEX01BU0spID4+IEFUSF9CRF9EQVRBX1BST0pfSURfU0hJRlQpCisKKyNkZWZpbmUgU0VUX0JEX0RBVEFfQ1VTVF9JRChiZF9kYXRhX3ZlciwgdmFsdWUpCVwKKwkoKGJkX2RhdGFfdmVyKSAmPSB+QVRIX0JEX0RBVEFfQ1VTVF9JRF9NQVNLLCAoYmRfZGF0YV92ZXIpIHw9ICgodmFsdWUpIDw8IEFUSF9CRF9EQVRBX0NVU1RfSURfU0hJRlQpKQorCisjZGVmaW5lIEdFVF9CRF9EQVRBX0NVU1RfSUQoYmRfZGF0YV92ZXIpCVwKKwkoKChiZF9kYXRhX3ZlcikgJiBBVEhfQkRfREFUQV9DVVNUX0lEX01BU0spID4+IEFUSF9CRF9EQVRBX0NVU1RfSURfU0hJRlQpCisKKyNkZWZpbmUgU0VUX0JEX0RBVEFfUkVGX0RFU0lHTl9JRChiZF9kYXRhX3ZlciwgdmFsdWUpCVwKKwkoKGJkX2RhdGFfdmVyKSAmPSB+QVRIX0JEX0RBVEFfUkVGX0RFU0lHTl9JRF9NQVNLLCAoYmRfZGF0YV92ZXIpIHw9ICgodmFsdWUpIDw8IEFUSF9CRF9EQVRBX1JFRl9ERVNJR05fSURfU0hJRlQpKQorCisjZGVmaW5lIEdFVF9CRF9EQVRBX1JFRl9ERVNJR05fSUQoYmRfZGF0YV92ZXIpCQlcCisJKCgoYmRfZGF0YV92ZXIpICYgQVRIX0JEX0RBVEFfUkVGX0RFU0lHTl9JRF9NQVNLKSA+PiBBVEhfQkRfREFUQV9SRUZfREVTSUdOX0lEX1NISUZUKQorCisjaWZkZWYgUk9NRV9MVEVfQ09FWF9GUkVRX0FWT0lECit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgc3RhcnRfZnJlcTsgICAgICAgICAgICAvKiBzdGFydCBmcmVxdWVuY3ksIG5vdCBjaGFubmVsIGNlbnRlciBmcmVxICovCisJQV9VSU5UMzIgZW5kX2ZyZXE7ICAgICAgICAgICAgICAvKiBlbmQgZnJlcXVlbmN5ICovCit9IGF2b2lkX2ZyZXFfcmFuZ2VfZGVzYzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIGJhZCBjaGFubmVsIHJhbmdlIGNvdW50LCBtdWx0aSByYW5nZSBpcyBhbGxvd2VkLCAwIG1lYW5zIGFsbCBjaGFubmVsIGNsZWFyICovCisJQV9VSU5UMzIgbnVtX2ZyZXFfcmFuZ2VzOworCS8qIG11bHRpIHJhbmdlIHdpdGggbnVtX2ZyZXFfcmFuZ2VzLCBMVEUgYWR2YW5jZSBtdWx0aSBjYXJyaWVyLCBDRE1BLGV0YyAqLworCWF2b2lkX2ZyZXFfcmFuZ2VfZGVzYyBhdmRfZnJlcV9yYW5nZVswXTsKK30gd21pX3dsYW5fYXZvaWRfZnJlcV9yYW5nZXNfZXZlbnQ7CisjZW5kaWYKKworLyoqIHN0YXR1cyBjb25zaXN0cyBvZiAgdXBwZXIgMTYgYml0cyBmbyBBX1NUQVRVUyBzdGF0dXMgYW5kIGxvd2VyIDE2IGJpdHMgb2YgbW9kdWxlIElEIHRoYXQgcmV0dW5lZCBzdGF0dXMgKi8KKyNkZWZpbmUgV0xBTl9JTklUX1NUQVRVU19TVUNDRVNTICAgMHgwCisjZGVmaW5lIFdMQU5fSU5JVF9TVEFUVVNfR0VOX0ZBSUxFRCAgIDB4MQorI2RlZmluZSBXTEFOX0dFVF9JTklUX1NUQVRVU19SRUFTT04oc3RhdHVzKSAgICAoKHN0YXR1cykgJiAweGZmZmYpCisjZGVmaW5lIFdMQU5fR0VUX0lOSVRfU1RBVFVTX01PRFVMRV9JRChzdGF0dXMpICgoKHN0YXR1cykgPj4gMTYpICYgMHhmZmZmKQorCit0eXBlZGVmIEFfVUlOVDMyIFdMQU5fSU5JVF9TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZWFkeV9ldmVudF9maXhlZF9wYXJhbSAqLworCXdtaV9hYmlfdmVyc2lvbiBmd19hYmlfdmVyczsKKwl3bWlfbWFjX2FkZHIgbWFjX2FkZHI7CisJQV9VSU5UMzIgc3RhdHVzOworfSB3bWlfcmVhZHlfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZXNvdXJjZV9jb25maWcgKi8KKy8qKgorICogQGJyaWVmIG51bV92ZGV2IC0gbnVtYmVyIG9mIHZpcnR1YWwgZGV2aWNlcyAoVkFQcykgdG8gc3VwcG9ydAorICovCisJQV9VSU5UMzIgbnVtX3ZkZXZzOworLyoqCisgKiBAYnJpZWYgbnVtX3BlZXJzIC0gbnVtYmVyIG9mIHBlZXIgbm9kZXMgdG8gc3VwcG9ydAorICovCisJQV9VSU5UMzIgbnVtX3BlZXJzOworLyoKKyAqIEBicmllZiBJbiBvZmZsb2FkIG1vZGUgdGFyZ2V0IHN1cHBvcnRzIGZlYXR1cmVzIGxpa2UgV09XLCBjaGF0dGVyIGFuZCBvdGhlcgorICogcHJvdG9jb2wgb2ZmbG9hZHMuIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhlbSBzb21lIGZ1bmN0aW9uYWxpdGllcyBsaWtlCisgKiByZW9yZGVyIGJ1ZmZlcmluZywgUE4gY2hlY2tpbmcgbmVlZCB0byBiZSBkb25lIGluIHRhcmdldC4gVGhpcyBkZXRlcm1pbmVzCisgKiBtYXhpbXVtIG51bWJlciBvZiBwZWVycyBzdXBvcnRlZCBieSB0YXJnZXQgaW4gb2ZmbG9hZCBtb2RlCisgKi8KKwlBX1VJTlQzMiBudW1fb2ZmbG9hZF9wZWVyczsKKy8qIEBicmllZiBOdW1iZXIgb2YgcmVvcmRlciBidWZmZXJzIGF2YWlsYWJsZSBmb3IgZG9pbmcgdGFyZ2V0IGJhc2VkIHJlb3JkZXIKKyAqIFJ4IHJlb3JkZXIgYnVmZmVyaW5nCisgKi8KKwlBX1VJTlQzMiBudW1fb2ZmbG9hZF9yZW9yZGVyX2J1ZmZzOworLyoqCisgKiBAYnJpZWYgbnVtX3BlZXJfa2V5cyAtIG51bWJlciBvZiBrZXlzIHBlciBwZWVyCisgKi8KKwlBX1VJTlQzMiBudW1fcGVlcl9rZXlzOworLyoqCisgKiBAYnJpZWYgbnVtX3BlZXJfdGlkcyAtIG51bWJlciBvZiBUSURzIHRvIHByb3ZpZGUgc3RvcmFnZSBmb3IgcGVyIHBlZXIuCisgKi8KKwlBX1VJTlQzMiBudW1fdGlkczsKKy8qKgorICogQGJyaWVmIGFzdF9za2lkX2xpbWl0IC0gbWF4IHNraWQgZm9yIHJlc29sdmluZyBoYXNoIGNvbGxpc2lvbnMKKyAqIEBkZXRhaWxzCisgKiAgICAgVGhlIGFkZHJlc3Mgc2VhcmNoIHRhYmxlIGlzIHNwYXJzZSwgc28gdGhhdCBpZiB0d28gTUFDIGFkZHJlc3NlcworICogICAgIHJlc3VsdCBpbiB0aGUgc2FtZSBoYXNoIHZhbHVlLCB0aGUgc2Vjb25kIG9mIHRoZXNlIGNvbmZsaWN0aW5nCisgKiAgICAgZW50cmllcyBjYW4gc2xpZGUgdG8gdGhlIG5leHQgaW5kZXggaW4gdGhlIGFkZHJlc3Mgc2VhcmNoIHRhYmxlLAorICogICAgIGFuZCB1c2UgaXQsIGlmIGl0IGlzIHVub2NjdXBpZWQuICBUaGlzIGFzdF9za2lkX2xpbWl0IHBhcmFtZXRlcgorICogICAgIHNwZWNpZmllcyB0aGUgdXBwZXIgYm91bmQgb24gaG93IG1hbnkgc3Vic2VxdWVudCBpbmRpY2VzIHRvIHNlYXJjaAorICogICAgIG92ZXIgdG8gZmluZCBhbiB1bm9jY3VwaWVkIHNwYWNlLgorICovCisJQV9VSU5UMzIgYXN0X3NraWRfbGltaXQ7CisvKioKKyAqIEBicmllZiB0eF9jaGFpbl9tYXNrIC0gdGhlIG5vbWluYWwgY2hhaW4gbWFzayBmb3IgdHJhbnNtaXQKKyAqIEBkZXRhaWxzCisgKiAgICAgVGhlIGNoYWluIG1hc2sgbWF5IGJlIG1vZGlmaWVkIGR5bmFtaWNhbGx5LCBlLmcuIHRvIG9wZXJhdGUgQVAgdHggd2l0aAorICogICAgIGEgcmVkdWNlZCBudW1iZXIgb2YgY2hhaW5zIGlmIG5vIGNsaWVudHMgYXJlIGFzc29jaWF0ZWQuCisgKiAgICAgVGhpcyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG5vbWluYWwgY2hhaW4tbWFzayB0aGF0CisgKiAgICAgc2hvdWxkIGJlIHVzZWQgd2hlbiBub3Qgb3BlcmF0aW5nIHdpdGggYSByZWR1Y2VkIHNldCBvZiB0eCBjaGFpbnMuCisgKi8KKwlBX1VJTlQzMiB0eF9jaGFpbl9tYXNrOworLyoqCisgKiBAYnJpZWYgcnhfY2hhaW5fbWFzayAtIHRoZSBub21pbmFsIGNoYWluIG1hc2sgZm9yIHJlY2VpdmUKKyAqIEBkZXRhaWxzCisgKiAgICAgVGhlIGNoYWluIG1hc2sgbWF5IGJlIG1vZGlmaWVkIGR5bmFtaWNhbGx5LCBlLmcuIGZvciBhIGNsaWVudCB0byB1c2UKKyAqICAgICBhIHJlZHVjZWQgbnVtYmVyIG9mIGNoYWlucyBmb3IgcmVjZWl2ZSBpZiB0aGUgdHJhZmZpYyB0byB0aGUgY2xpZW50CisgKiAgICAgaXMgbG93IGVub3VnaCB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSBkb3dubGluayBNSU1PIG9yIGFudGVubmEKKyAqICAgICBkaXZlcnNpdHkuCisgKiAgICAgVGhpcyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG5vbWluYWwgY2hhaW4tbWFzayB0aGF0CisgKiAgICAgc2hvdWxkIGJlIHVzZWQgd2hlbiBub3Qgb3BlcmF0aW5nIHdpdGggYSByZWR1Y2VkIHNldCBvZiByeCBjaGFpbnMuCisgKi8KKwlBX1VJTlQzMiByeF9jaGFpbl9tYXNrOworLyoqCisgKiBAYnJpZWYgcnhfdGltZW91dF9wcmkgLSB3aGF0IHJ4IHJlb3JkZXIgdGltZW91dCAobXMpIHRvIHVzZSBmb3IgdGhlIEFDCisgKiBAZGV0YWlscworICogICAgIEVhY2ggV01NIGFjY2VzcyBjbGFzcyAodm9pY2UsIHZpZGVvLCBiZXN0LWVmZm9ydCwgYmFja2dyb3VuZCkgd2lsbAorICogICAgIGhhdmUgaXRzIG93biB0aW1lb3V0IHZhbHVlIHRvIGRpY3RhdGUgaG93IGxvbmcgdG8gd2FpdCBmb3IgbWlzc2luZworICogICAgIHJ4IE1QRFVzIHRvIGFycml2ZSBiZWZvcmUgZmx1c2hpbmcgc3Vic2VxdWVudCBNUERVcyB0aGF0IGhhdmUgYWxyZWFkeQorICogICAgIGJlZW4gcmVjZWl2ZWQuCisgKiAgICAgVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZWFjaCBjbGFzcyAuCisgKiAgICAgTk9URTogdGhlIG51bWJlciBvZiBjbGFzcyAoZGVmaW5lZCBhcyA0KSBjYW5ub3QgYmUKKyAqICAgICBjaGFuZ2VkIGluIHRoZSBmdXR1cmUgd2l0aG91dCBicmVha2luZyBXTUkgY29tcGF0aWJpbGl0eS4KKyAqLworCUFfVUlOVDMyIHJ4X3RpbWVvdXRfcHJpWzRdOworLyoqCisgKiBAYnJpZWYgcnhfZGVjYXAgbW9kZSAtIHdoYXQgbW9kZSB0aGUgcnggc2hvdWxkIGRlY2FwIHBhY2tldHMgdG8KKyAqIEBkZXRhaWxzCisgKiAgICAgTUFDIGNhbiBkZWNhcCB0byBSQVcgKG5vIGRlY2FwKSwgbmF0aXZlIHdpZmkgb3IgRXRoZXJuZXQgdHlwZXMKKyAqICAgICBUSGlzIHNldHRpbmcgYWxzbyBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0IFRYIGJlaGF2aW9yLCBob3dldmVyIFRYCisgKiAgICAgYmVoYXZpb3IgY2FuIGJlIG1vZGlmaWVkIG9uIGEgcGVyIFZBUCBiYXNpcyBkdXJpbmcgVkFQIGluaXQKKyAqLworCUFfVUlOVDMyIHJ4X2RlY2FwX21vZGU7CisJLyoqCisJICogQGJyaWVmICBzY2FuX21heF9wZW5kaW5nX3JlcSAtIHdoYXQgaXMgdGhlIG1heGltdW0gc2NhbiByZXF1ZXN0cyB0aGFuIGNhbiBiZSBxdWV1ZWQKKwkgKi8KKwlBX1VJTlQzMiBzY2FuX21heF9wZW5kaW5nX3JlcTsKKworCS8qKgorCSAqIEBicmllZiBtYXhpbXVtIFZERVYgdGhhdCBjb3VsZCB1c2UgQk1JU1Mgb2ZmbG9hZAorCSAqLworCUFfVUlOVDMyIGJtaXNzX29mZmxvYWRfbWF4X3ZkZXY7CisKKwkvKioKKwkgKiBAYnJpZWYgbWF4aW11bSBWREVWIHRoYXQgY291bGQgdXNlIG9mZmxvYWQgcm9hbWluZworCSAqLworCUFfVUlOVDMyIHJvYW1fb2ZmbG9hZF9tYXhfdmRldjsKKworCS8qKgorCSAqIEBicmllZiBtYXhpbXVtIEFQIHByb2ZpbGVzIHRoYXQgd291bGQgcHVzaCB0byBvZmZsb2FkIHJvYW1pbmcKKwkgKi8KKwlBX1VJTlQzMiByb2FtX29mZmxvYWRfbWF4X2FwX3Byb2ZpbGVzOworCisvKioKKyAqIEBicmllZiBudW1fbWNhc3RfZ3JvdXBzIC0gaG93IG1hbnkgZ3JvdXBzIHRvIHVzZSBmb3IgbWNhc3QtPnVjYXN0IGNvbnZlcnNpb24KKyAqIEBkZXRhaWxzCisgKiAgICAgVGhlIHRhcmdldCdzIFdBTCBtYWludGFpbnMgYSB0YWJsZSB0byBob2xkIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB3aGljaAorICogICAgIHBlZXJzIGJlbG9uZyB0byBhIGdpdmVuIG11bHRpY2FzdCBncm91cCwgc28gdGhhdCBpZiBtdWx0aWNhc3QtPnVuaWNhc3QKKyAqICAgICBjb252ZXJzaW9uIGlzIGVuYWJsZWQsIHRoZSB0YXJnZXQgY2FuIGNvbnZlcnQgbXVsdGljYXN0IHR4IGZyYW1lcyB0byBhCisgKiAgICAgc2VyaWVzIG9mIHVuaWNhc3QgdHggZnJhbWVzLCB0byBlYWNoIHBlZXIgd2l0aGluIHRoZSBtdWx0aWNhc3QgZ3JvdXAuCisgKiAgICAgVGhpcyBudW1fbWNhc3RfZ3JvdXBzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHRlbGxzIHRoZSB0YXJnZXQgaG93CisgKiAgICAgbWFueSBtdWx0aWNhc3QgZ3JvdXBzIHRvIHByb3ZpZGUgc3RvcmFnZSBmb3Igd2l0aGluIGl0cyBtdWx0aWNhc3QKKyAqICAgICBncm91cCBtZW1iZXJzaGlwIHRhYmxlLgorICovCisJQV9VSU5UMzIgbnVtX21jYXN0X2dyb3VwczsKKworLyoqCisgKiBAYnJpZWYgbnVtX21jYXN0X3RhYmxlX2VsZW1zIC0gc2l6ZSB0byBhbGxvYyBmb3IgdGhlIG1jYXN0IG1lbWJlcnNoaXAgdGFibGUKKyAqIEBkZXRhaWxzCisgKiAgICAgVGhpcyBudW1fbWNhc3RfdGFibGVfZWxlbXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgdGVsbHMgdGhlIHRhcmdldAorICogICAgIGhvdyBtYW55IHBlZXIgZWxlbWVudHMgaXQgbmVlZHMgdG8gcHJvdmlkZSBzdG9yYWdlIGZvciBpbiBpdHMKKyAqICAgICBtdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcCB0YWJsZS4KKyAqICAgICBUaGVzZSBtdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcCB0YWJsZSBlbGVtZW50cyBhcmUgc2hhcmVkIGJ5IHRoZQorICogICAgIG11bHRpY2FzdCBncm91cHMgc3RvcmVkIHdpdGhpbiB0aGUgdGFibGUuCisgKi8KKwlBX1VJTlQzMiBudW1fbWNhc3RfdGFibGVfZWxlbXM7CisKKy8qKgorICogQGJyaWVmIG1jYXN0MnVjYXN0X21vZGUgLSB3aGV0aGVyL2hvdyB0byBkbyBtdWx0aWNhc3QtPnVuaWNhc3QgY29udmVyc2lvbgorICogQGRldGFpbHMKKyAqICAgICBUaGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB0YXJnZXQgc2hvdWxkCisgKiAgICAgcGVyZm9ybSBtdWx0aWNhc3QgLS0+IHVuaWNhc3QgY29udmVyc2lvbiBvbiB0cmFuc21pdCwgYW5kIGlmIHNvLAorICogICAgIHdoYXQgdG8gZG8gaWYgaXQgZmluZHMgbm8gZW50cmllcyBpbiBpdHMgbXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAKKyAqICAgICB0YWJsZSBmb3IgdGhlIG11bHRpY2FzdCBJUCBhZGRyZXNzIGluIHRoZSB0eCBmcmFtZS4KKyAqICAgICBDb25maWd1cmF0aW9uIHZhbHVlOgorICogICAgIDAgLT4gRG8gbm90IHBlcmZvcm0gbXVsdGljYXN0IHRvIHVuaWNhc3QgY29udmVyc2lvbi4KKyAqICAgICAxIC0+IENvbnZlcnQgbXVsdGljYXN0IGZyYW1lcyB0byB1bmljYXN0LCBpZiB0aGUgSVAgbXVsdGljYXN0IGFkZHJlc3MKKyAqICAgICAgICAgIGZyb20gdGhlIHR4IGZyYW1lIGlzIGZvdW5kIGluIHRoZSBtdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcAorICogICAgICAgICAgdGFibGUuICBJZiB0aGUgSVAgbXVsdGljYXN0IGFkZHJlc3MgaXMgbm90IGZvdW5kLCBkcm9wIHRoZSBmcmFtZS4KKyAqICAgICAyIC0+IENvbnZlcnQgbXVsdGljYXN0IGZyYW1lcyB0byB1bmljYXN0LCBpZiB0aGUgSVAgbXVsdGljYXN0IGFkZHJlc3MKKyAqICAgICAgICAgIGZyb20gdGhlIHR4IGZyYW1lIGlzIGZvdW5kIGluIHRoZSBtdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcAorICogICAgICAgICAgdGFibGUuICBJZiB0aGUgSVAgbXVsdGljYXN0IGFkZHJlc3MgaXMgbm90IGZvdW5kLCB0cmFuc21pdCB0aGUKKyAqICAgICAgICAgIGZyYW1lIGFzIG11bHRpY2FzdC4KKyAqLworCUFfVUlOVDMyIG1jYXN0MnVjYXN0X21vZGU7CisKKwkvKioKKwkgKiBAYnJpZWYgdHhfZGJnX2xvZ19zaXplIC0gaG93IG11Y2ggbWVtb3J5IHRvIGFsbG9jYXRlIGZvciBhIHR4IFBQRFUgZGJnIGxvZworCSAqIEBkZXRhaWxzCisJICogICAgIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIGhvdyBtdWNoIG1lbW9yeSB0aGUgdGFyZ2V0IHdpbGwgYWxsb2NhdGUgdG8KKwkgKiAgICAgc3RvcmUgYSBsb2cgb2YgdHggUFBEVSBtZXRhLWluZm9ybWF0aW9uIChob3cgbGFyZ2UgdGhlIFBQRFUgd2FzLAorCSAqICAgICB3aGVuIGl0IHdhcyBzZW50LCB3aGV0aGVyIGl0IHdhcyBzdWNjZXNzZnVsLCBldGMuKQorCSAqLworCUFfVUlOVDMyIHR4X2RiZ19sb2dfc2l6ZTsKKworCS8qKgorCSAqIEBicmllZiBudW1fd2RzX2VudHJpZXMgLSBob3cgbWFueSBBU1QgZW50cmllcyB0byBiZSBhbGxvY2F0ZWQgZm9yIFdEUworCSAqLworCUFfVUlOVDMyIG51bV93ZHNfZW50cmllczsKKworCS8qKgorCSAqIEBicmllZiBkbWFfYnVyc3Rfc2l6ZSAtIE1BQyBETUEgYnVyc3Qgc2l6ZSwgZS5nLiwgb24gUGVyZWdyaW5lIG9uIFBDSQorCSAqIHRoaXMgbGltaXQgY2FuIGJlIDAgLWRlZmF1bHQsIDEgMjU2QgorCSAqLworCUFfVUlOVDMyIGRtYV9idXJzdF9zaXplOworCisJLyoqCisJICogQGJyaWVmIG1hY19hZ2dyX2RlbGltIC0gRml4ZWQgZGVsaW1pdGVycyB0byBiZSBpbnNlcnRlZCBhZnRlciBldmVyeSBNUERVCisJICogdG8gYWNjb3VudCBmb3IgaW50ZXJmYWNlIGxhdGVuY3kgdG8gYXZvaWQgdW5kZXJydW4uCisJICovCisJQV9VSU5UMzIgbWFjX2FnZ3JfZGVsaW07CisJLyoqCisJICogQGJyaWVmIHJ4X3NraXBfZGVmcmFnX3RpbWVvdXRfZHVwX2RldGVjdGlvbl9jaGVjaworCSAqIEBkZXRhaWxzCisJICogIGRldGVybWluZSB3aGV0aGVyIHRhcmdldCBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZWN0aW5nIGR1cGxpY2F0ZQorCSAqICBub24tYWdncmVnYXRlIE1QRFUgYW5kIHRpbWluZyBvdXQgc3RhbGUgZnJhZ21lbnRzLgorCSAqCisJICogIEEtTVBEVSByZW9yZGVyaW5nIGlzIGFsd2F5cyBwZXJmb3JtZWQgb24gdGhlIHRhcmdldC4KKwkgKgorCSAqICAwOiB0YXJnZXQgcmVzcG9uc2libGUgZm9yIGZyYWcgdGltZW91dCBhbmQgZHVwIGNoZWNraW5nCisJICogIDE6IGhvc3QgcmVzcG9uc2libGUgZm9yIGZyYWcgdGltZW91dCBhbmQgZHVwIGNoZWNraW5nCisJICovCisJQV9VSU5UMzIgcnhfc2tpcF9kZWZyYWdfdGltZW91dF9kdXBfZGV0ZWN0aW9uX2NoZWNrOworCisJLyoqCisJICogQGJyaWVmIHZvd19jb25maWcgLSBDb25maWd1cmF0aW9uIGZvciBWb1cgOiBObyBvZiBWaWRlbyBOb2RlcyB0byBiZSBzdXBwb3J0ZWQKKwkgKiBhbmQgTWF4IG5vIG9mIGRlc2NyaXB0b3JzIGZvciBlYWNoIFZpZGVvIGxpbmsgKG5vZGUpLgorCSAqLworCUFfVUlOVDMyIHZvd19jb25maWc7CisKKwkvKioKKwkgKiBAYnJpZWYgbWF4aW11bSBWREVWIHRoYXQgY291bGQgdXNlIEdUSyBvZmZsb2FkCisJICovCisJQV9VSU5UMzIgZ3RrX29mZmxvYWRfbWF4X3ZkZXY7CisKKwkvKioKKwkgKiBAYnJpZWYgbnVtX21zZHVfZGVzYyAtIE51bWJlciBvZiBtc2R1IGRlc2NyaXB0b3JzIHRhcmdldCBzaG91bGQgdXNlCisJICovCisJQV9VSU5UMzIgbnVtX21zZHVfZGVzYzsgICAgICAgICAvKiBOdW1iZXIgb2YgbXNkdSBkZXNjICovCisJLyoqCisJICogQGJyaWVmIG1heF9mcmFnX2VudHJ5IC0gTWF4LiBudW1iZXIgb2YgVHggZnJhZ21lbnRzIHBlciBNU0RVCisJICogQGRldGFpbHMKKwkgKiAgICAgVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIG1heCBudW1iZXIgb2YgVHggZnJhZ21lbnRzIHBlciBNU0RVLgorCSAqICAgICBUaGlzIGlzIHNlbnQgYnkgdGhlIHRhcmdldCBhcyBwYXJ0IG9mIHRoZSBXTUlfU0VSVklDRV9SRUFEWSBldmVudAorCSAqICAgICBhbmQgaXMgb3ZlcnJpZGVuIGJ5IHRoZSBPUyBzaGltIGFzIHJlcXVpcmVkLgorCSAqLworCUFfVUlOVDMyIG1heF9mcmFnX2VudHJpZXM7CisKKwkvKioKKwkgKiBAYnJpZWYgbnVtX3RkbHNfdmRldnMgLSBNYXguIG51bWJlciBvZiB2ZGV2cyB0aGF0IGNhbiBzdXBwb3J0IFRETFMKKwkgKiBAYnJpZWYgbnVtX21zZHVfZGVzYyAtIE51bWJlciBvZiB2ZGV2IHRoYXQgY2FuIHN1cHBvcnQgYmVhY29uIG9mZmxvYWQKKwkgKi8KKworCUFfVUlOVDMyIG51bV90ZGxzX3ZkZXZzOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdmRldnMgYWxsb3dlZCB0byBkbyB0ZGxzICovCisKKwkvKioKKwkgKiBAYnJpZWYgbnVtX3RkbHNfY29ubl90YWJsZV9lbnRyaWVzIC0gTnVtYmVyIG9mIHBlZXJzIHRyYWNrZWQgYnkgdGRscyB2ZGV2CisJICogQGRldGFpbHMKKwkgKiAgICAgIEVhY2ggVERMUyBlbmFibGVkIHZkZXYgY2FuIHRyYWNrIG91dGdvaW5nIHRyYW5zbWl0cy9yc3NpL3JhdGVzIHRvL29mCisJICogICAgICBwZWVycyBpbiBhIGNvbm5lY3Rpb24gdHJhY2tpbmcgdGFibGUgZm9yIHBvc3NpYmxlIFRETFMgbGluayBjcmVhdGlvbgorCSAqICAgICAgb3IgZGVsZXRpb24uIFRoaXMgY29udHJvbHMgdGhlIG51bWJlciBvZiB0cmFja2VkIHBlZXJzIHBlciB2ZGV2LgorCSAqLworCUFfVUlOVDMyIG51bV90ZGxzX2Nvbm5fdGFibGVfZW50cmllczsgICAgICAgICAgIC8qIG51bWJlciBvZiBwZWVycyB0byB0cmFjayBwZXIgVERMUyB2ZGV2ICovCisJQV9VSU5UMzIgYmVhY29uX3R4X29mZmxvYWRfbWF4X3ZkZXY7CisJQV9VSU5UMzIgbnVtX211bHRpY2FzdF9maWx0ZXJfZW50cmllczsKKwlBX1VJTlQzMiBudW1fd293X2ZpbHRlcnM7ICAgICAgICAgICAgICAgLypob3N0IGNhbiBjb25maWd1cmUgdGhlIG51bWJlciBvZiB3b3cgZmlsdGVycyAqLworCisJLyoqCisJICogQGJyaWVmIG51bV9rZWVwX2FsaXZlX3BhdHRlcm4gLSBOdW0gb2Yga2VlcCBhbGl2ZSBwYXR0ZXJucyBjb25maWd1cmVkCisJICogZnJvbSBob3N0LgorCSAqLworCUFfVUlOVDMyIG51bV9rZWVwX2FsaXZlX3BhdHRlcm47CisJLyoqCisJICogQGJyaWVmIGtlZXBfYWxpdmVfcGF0dGVybl9zaXplIC0ga2VlcCBhbGl2ZSBwYXR0ZXJuIHNpemUuCisJICovCisJQV9VSU5UMzIga2VlcF9hbGl2ZV9wYXR0ZXJuX3NpemU7CisKKwkvKioKKwkgKiBAYnJpZWYgbWF4X3RkbHNfY29uY3VycmVudF9zbGVlcF9zdGEgLSBOdW1iZXIgb2YgdGRscyBzbGVlcCBzdGEgc3VwcG9ydGVkCisJICogQGRldGFpbHMKKwkgKiAgICAgIEVhY2ggVERMUyBTVEEgY2FuIGJlY29tZSBhIHNsZWVwIFNUQSBpbmRlcGVuZGVudGx5LiBUaGlzIHBhcmFtZXRlcgorCSAqICAgICAgbWVudGlvbnMgaG93IG1hbnkgc3VjaCBzbGVlcCBTVEFzIGNhbiBiZSBzdXBwb3J0ZWQgY29uY3VycmVudGx5LgorCSAqLworCUFfVUlOVDMyIG1heF90ZGxzX2NvbmN1cnJlbnRfc2xlZXBfc3RhOworCisJLyoqCisJICogQGJyaWVmIG1heF90ZGxzX2NvbmN1cnJlbnRfYnVmZmVyX3N0YSAtIE51bWJlciBvZiB0ZGxzIGJ1ZmZlciBzdGEgc3VwcG9ydGVkCisJICogQGRldGFpbHMKKwkgKiAgICAgIEVhY2ggVERMUyBTVEEgY2FuIGJlY29tZSBhIGJ1ZmZlciBTVEEgaW5kZXBlbmRlbnRseS4gVGhpcyBwYXJhbWV0ZXIKKwkgKiAgICAgIG1lbnRpb25zIGhvdyBtYW55IHN1Y2ggYnVmZmVyIFNUQXMgY2FuIGJlIHN1cHBvcnRlZCBjb25jdXJyZW50bHkuCisJICovCisJQV9VSU5UMzIgbWF4X3RkbHNfY29uY3VycmVudF9idWZmZXJfc3RhOworCisJLyoqCisJICogQGJyaWVmIHdtaV9zZW5kX3NlcGFyYXRlIC0gaG9zdCBjb25maWd1cmVzIGZ3IHRvIHNlbmQgdGhlIHdtaSBzZXBhcmF0ZWx5CisJICovCisJQV9VSU5UMzIgd21pX3NlbmRfc2VwYXJhdGU7CisKKwkvKioKKwkgKiBAYnJpZWYgbnVtX29jYl92ZGV2cyAtIE51bWJlciBvZiB2ZGV2cyB1c2VkIGZvciBPQ0Igc3VwcG9ydAorCSAqLworCUFfVUlOVDMyIG51bV9vY2JfdmRldnM7CisKKwkvKioKKwkgKiBAYnJpZWYgbnVtX29jYl9jaGFubmVscyAtIFRoZSBzdXBwb3J0ZWQgbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBPQ0IgY2hhbm5lbHMKKwkgKi8KKwlBX1VJTlQzMiBudW1fb2NiX2NoYW5uZWxzOworCisJLyoqCisJICogQGJyaWVmIG51bV9vY2Jfc2NoZWR1bGVzIC0gVGhlIHN1cHBvcnRlZCBudW1iZXIgb2YgT0NCIHNjaGVkdWxlIHNlZ21lbnRzCisJICovCisJQV9VSU5UMzIgbnVtX29jYl9zY2hlZHVsZXM7Cit9IHdtaV9yZXNvdXJjZV9jb25maWc7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9pbml0X2NtZF9maXhlZF9wYXJhbSAqLworCisJLyoqIFRoZSBmb2xsb3dpbmcgaW5kaWNhdGUgdGhlIFdNSSB2ZXJzaW9ucyB0byBiZSBzdXBwb3J0ZWQgYnkKKwkgKiAgdGhlIGhvc3QgZHJpdmVyLiBOb3RlIHRoYXQgdGhlIGhvc3QgZHJpdmVyIGRlY2lkZSB0bworCSAqICAiZG93bmdyYWRlIiBpdHMgV01JIHZlcnNpb24gc3VwcG9ydCBhbmQgdGhpcyBtYXkgbm90IGJlIHRoZQorCSAqICBuYXRpdmUgdmVyc2lvbiBvZiB0aGUgaG9zdCBkcml2ZXIuICovCisJd21pX2FiaV92ZXJzaW9uIGhvc3RfYWJpX3ZlcnM7CisKKwlBX1VJTlQzMiBudW1faG9zdF9tZW1fY2h1bmtzOworCS8qKiBzaXplIG9mIGFycmF5IGhvc3RfbWVtX2NodW5rc1tdICovCisJLyogVGhlIFRMVnMgZm9yIHJlc291cmNlX2NvbmZpZyBhbmQgaG9zdF9tZW1fY2h1bmtzW10gd2lsbCBmb2xsb3cuCisJICogICAgIHdtaV9yZXNvdXJjZV9jb25maWcgICByZXNvdXJjZV9jb25maWc7CisJICogICAgIHdsYW5faG9zdF9tZW1vcnlfY2h1bmsgaG9zdF9tZW1fY2h1bmtzW107CisJICovCisKK30gd21pX2luaXRfY21kX2ZpeGVkX3BhcmFtOworCisvKioKKyAqIFRMViBmb3IgY2hhbm5lbCBsaXN0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogV01JX0NIQU5fTElTVF9UQUcgKi8KKwlBX1VJTlQzMiB0YWc7CisJLyoqICMgb2YgY2hhbm5lbHMgdG8gc2NhbiAqLworCUFfVUlOVDMyIG51bV9jaGFuOworCS8qKiBjaGFubmVscyBpbiBNaHogKi8KKwlBX1VJTlQzMiBjaGFubmVsX2xpc3RbMV07Cit9IHdtaV9jaGFuX2xpc3Q7CisKKy8qKgorICogVExWIGZvciBic3NpZCBsaXN0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogV01JX0JTU0lEX0xJU1RfVEFHICovCisJQV9VSU5UMzIgdGFnOworCS8qKiBudW1iZXIgb2YgYnNzaWRzICAgKi8KKwlBX1VJTlQzMiBudW1fYnNzaWQ7CisJLyoqIGJzc2lkIGxpc3QgICAgICAgICAqLworCXdtaV9tYWNfYWRkciBic3NpZF9saXN0WzFdOworfSB3bWlfYnNzaWRfbGlzdDsKKworLyoqCisgKiBUTFYgZm9yICBpZSBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFdNSV9JRV9UQUcgKi8KKwlBX1VJTlQzMiB0YWc7CisJLyoqIG51bWJlciBvZiBieXRlcyBpbiBpZSBkYXRhICAgKi8KKwlBX1VJTlQzMiBpZV9sZW47CisJLyoqIGllIGRhdGEgYXJyYXkgIChpZV9sZW4gYWRqdXN0ZWQgdG8gIG51bWJlciBvZiB3b3JkcyAgKGllX2xlbiArIDQpLzQgKSAgKi8KKwlBX1VJTlQzMiBpZV9kYXRhWzFdOworfSB3bWlfaWVfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBMZW4gb2YgdGhlIFNTSUQgKi8KKwlBX1VJTlQzMiBzc2lkX2xlbjsKKwkvKiogU1NJRCAqLworCUFfVUlOVDMyIHNzaWRbOF07Cit9IHdtaV9zc2lkOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFdNSV9TU0lEX0xJU1RfVEFHICovCisJQV9VSU5UMzIgdGFnOworCUFfVUlOVDMyIG51bV9zc2lkczsKKwl3bWlfc3NpZCBzc2lkc1sxXTsKK30gd21pX3NzaWRfbGlzdDsKKworLyogcHJlZml4IHVzZWQgYnkgc2NhbiByZXF1ZXN0b3IgaWRzIG9uIHRoZSBob3N0ICovCisjZGVmaW5lIFdNSV9IT1NUX1NDQU5fUkVRVUVTVE9SX0lEX1BSRUZJWCAweEEwMDAKKy8qIHByZWZpeCB1c2VkIGJ5IHNjYW4gcmVxdWVzdCBpZHMgZ2VuZXJhdGVkIG9uIHRoZSBob3N0ICovCisvKiBob3N0IGN5Y2xlcyB0aHJvdWdoIHRoZSBsb3dlciAxMiBiaXRzIHRvIGdlbmVyYXRlIGlkcyAqLworI2RlZmluZSBXTUlfSE9TVF9TQ0FOX1JFUV9JRF9QUkVGSVggMHhBMDAwCisKKyNkZWZpbmUgV0xBTl9TQ0FOX1BBUkFNU19NQVhfU1NJRCAgICAxNgorI2RlZmluZSBXTEFOX1NDQU5fUEFSQU1TX01BWF9CU1NJRCAgIDQKKyNkZWZpbmUgV0xBTl9TQ0FOX1BBUkFNU19NQVhfSUVfTEVOICA1MTIKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YXJ0X3NjYW5fY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIFNjYW4gSUQgKi8KKwlBX1VJTlQzMiBzY2FuX2lkOworCS8qKiBTY2FuIHJlcXVlc3RvciBJRCAqLworCUFfVUlOVDMyIHNjYW5fcmVxX2lkOworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgdGhhdCBpcyByZXF1ZXN0aW5nIHNjYW4gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBTY2FuIFByaW9yaXR5LCBpbnB1dCB0byBzY2FuIHNjaGVkdWxlciAqLworCUFfVUlOVDMyIHNjYW5fcHJpb3JpdHk7CisJLyoqIFNjYW4gZXZlbnRzIHN1YnNjcmlwdGlvbiAqLworCUFfVUlOVDMyIG5vdGlmeV9zY2FuX2V2ZW50czsKKwkvKiogZHdlbGwgdGltZSBpbiBtc2VjIG9uIGFjdGl2ZSBjaGFubmVscyAqLworCUFfVUlOVDMyIGR3ZWxsX3RpbWVfYWN0aXZlOworCS8qKiBkd2VsbCB0aW1lIGluIG1zZWMgb24gcGFzc2l2ZSBjaGFubmVscyAqLworCUFfVUlOVDMyIGR3ZWxsX3RpbWVfcGFzc2l2ZTsKKwkvKiogbWluIHRpbWUgaW4gbXNlYyBvbiB0aGUgQlNTIGNoYW5uZWwsb25seSB2YWxpZCBpZiBhdGxlYXN0IG9uZSBWREVWIGlzIGFjdGl2ZSovCisJQV9VSU5UMzIgbWluX3Jlc3RfdGltZTsKKwkvKiogbWF4IHJlc3QgdGltZSBpbiBtc2VjIG9uIHRoZSBCU1MgY2hhbm5lbCxvbmx5IHZhbGlkIGlmIGF0IGxlYXN0IG9uZSBWREVWIGlzIGFjdGl2ZSovCisJLyoqIHRoZSBzY2FubmVyIHdpbGwgcmVzdCBvbiB0aGUgYnNzIGNoYW5uZWwgYXQgbGVhc3QgbWluX3Jlc3RfdGltZS4gYWZ0ZXIgbWluX3Jlc3RfdGltZSB0aGUgc2Nhbm5lcgorCSAqICB3aWxsIHN0YXJ0IGNoZWNraW5nIGZvciB0eC9yeCBhY3Rpdml0eSBvbiBhbGwgVkRFVnMuIGlmIHRoZXJlIGlzIG5vIGFjdGl2aXR5IHRoZSBzY2FubmVyIHdpbGwKKwkgKiAgc3dpdGNoIHRvIG9mZiBjaGFubmVsLiBpZiB0aGVyZSBpcyBhY3Rpdml0eSB0aGUgc2Nhbm5lciB3aWxsIGxldCB0aGUgcmFkaW8gb24gdGhlIGJzcyBjaGFubmVsCisJICogIHVudGlsIG1heF9yZXN0X3RpbWUgZXhwaXJlcy5hdCBtYXhfcmVzdF90aW1lIHNjYW5uZXIgd2lsbCBzd2l0Y2ggdG8gb2ZmIGNoYW5uZWwKKwkgKiAgaXJyZXNwZWN0aXZlIG9mIGFjdGl2aXR5LiBhY3Rpdml0eSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBpZGxlX3RpbWUgcGFyYW1ldGVyLgorCSAqLworCUFfVUlOVDMyIG1heF9yZXN0X3RpbWU7CisJLyoqIHRpbWUgYmVmb3JlIHNlbmRpbmcgbmV4dCBzZXQgb2YgcHJvYmUgcmVxdWVzdHMuCisJICogICBUaGUgc2Nhbm5lciBrZWVwcyByZXBlYXRpbmcgcHJvYmUgcmVxdWVzdHMgdHJhbnNtaXNzaW9uIHdpdGggcGVyaW9kIHNwZWNpZmllZCBieSByZXBlYXRfcHJvYmVfdGltZS4KKwkgKiAgIFRoZSBudW1iZXIgb2YgcHJvYmUgcmVxdWVzdHMgc3BlY2lmaWVkIGRlcGVuZHMgb24gdGhlIHNzaWRfbGlzdCBhbmQgYnNzaWRfbGlzdAorCSAqLworCUFfVUlOVDMyIHJlcGVhdF9wcm9iZV90aW1lOworCS8qKiB0aW1lIGluIG1zZWMgYmV0d2VlbiAyIGNvbnNlcXVldGl2ZSBwcm9iZSByZXF1ZXN0cyB3aXRoIGluIGEgc2V0LiAqLworCUFfVUlOVDMyIHByb2JlX3NwYWNpbmdfdGltZTsKKwkvKiogZGF0YSBpbmFjdGl2aXR5IHRpbWUgaW4gbXNlYyBvbiBic3MgY2hhbm5lbCB0aGF0IHdpbGwgYmUgdXNlZCBieSBzY2FubmVyIGZvciBtZWFzdXJpbmcgdGhlIGluYWN0aXZpdHkgICovCisJQV9VSU5UMzIgaWRsZV90aW1lOworCS8qKiBtYXhpbXVtIHRpbWUgaW4gbXNlYyBhbGxvd2VkIGZvciBzY2FuICAqLworCUFfVUlOVDMyIG1heF9zY2FuX3RpbWU7CisJLyoqIGRlbGF5IGluIG1zZWMgYmVmb3JlIHNlbmRpbmcgZmlyc3QgcHJvYmUgcmVxdWVzdCBhZnRlciBzd2l0Y2hpbmcgdG8gYSBjaGFubmVsICovCisJQV9VSU5UMzIgcHJvYmVfZGVsYXk7CisJLyoqIFNjYW4gY29udHJvbCBmbGFncyAqLworCUFfVUlOVDMyIHNjYW5fY3RybF9mbGFnczsKKwkvKiogQnVyc3QgZHVyYXRpb24gdGltZSBpbiBtc2VjKi8KKwlBX1VJTlQzMiBidXJzdF9kdXJhdGlvbjsKKworCS8qKiAjIGlmIGNoYW5uZWxzIHRvIHNjYW4uIEluIHRoZSBUTFYgY2hhbm5lbF9saXN0W10gKi8KKwlBX1VJTlQzMiBudW1fY2hhbjsKKwkvKiogbnVtYmVyIG9mIGJzc2lkcy4gSW4gdGhlIFRMViBic3NpZF9saXN0W10gKi8KKwlBX1VJTlQzMiBudW1fYnNzaWQ7CisJLyoqIG51bWJlciBvZiBzc2lkLiBJbiB0aGUgVExWIHNzaWRfbGlzdFtdICovCisJQV9VSU5UMzIgbnVtX3NzaWRzOworCS8qKiBudW1iZXIgb2YgYnl0ZXMgaW4gaWUgZGF0YS4gSW4gdGhlIFRMViBpZV9kYXRhW10uICBNYXggbGVuIGlzIGRlZmluZWQgYnkgV0xBTl9TQ0FOX1BBUkFNU19NQVhfSUVfTEVOICovCisJQV9VSU5UMzIgaWVfbGVuOworCS8qKiBNYXggbnVtYmVyIG9mIHByb2JlcyB0byBiZSBzZW50ICovCisJQV9VSU5UMzIgbl9wcm9iZXM7CisKKwkvKioKKwkgKiBUTFYgKHRhZyBsZW5ndGggdmFsdWUgKSBwYXJhbWV0ZXJzIGZvbGxvdyB0aGUgc2Nhbl9jbWQKKwkgKiBzdHJ1Y3R1cmUuIFRoZSBUTFYncyBhcmU6CisJICogICAgIEFfVUlOVDMyIGNoYW5uZWxfbGlzdFtdOworCSAqICAgICB3bWlfc3NpZCBzc2lkX2xpc3RbXTsKKwkgKiAgICAgd21pX21hY19hZGRyIGJzc2lkX2xpc3RbXTsKKwkgKiAgICAgQV9VSU5UOCBpZV9kYXRhW107CisJICovCit9IHdtaV9zdGFydF9zY2FuX2NtZF9maXhlZF9wYXJhbTsKKworLyoqCisgKiBzY2FuIGNvbnRyb2wgZmxhZ3MuCisgKi8KKworLyoqIHBhc3NpdmVseSBzY2FuIGFsbCBjaGFubmVscyBpbmNsdWRpbmcgYWN0aXZlIGNoYW5uZWxzICovCisjZGVmaW5lIFdNSV9TQ0FOX0ZMQUdfUEFTU0lWRSAgICAgICAgMHgxCisvKiogYWRkIHdpbGQgY2FyZCBzc2lkIHByb2JlIHJlcXVlc3QgZXZlbiB0aG91Z2ggc3NpZF9saXN0IGlzIHNwZWNpZmllZC4gKi8KKyNkZWZpbmUgV01JX1NDQU5fQUREX0JDQVNUX1BST0JFX1JFUSAweDIKKy8qKiBhZGQgY2NrIHJhdGVzIHRvIHJhdGVzL3hyYXRlIGllIGZvciB0aGUgZ2VuZXJhdGVkIHByb2JlIHJlcXVlc3QgKi8KKyNkZWZpbmUgV01JX1NDQU5fQUREX0NDS19SQVRFUyAgICAgICAweDQKKy8qKiBhZGQgb2ZkbSByYXRlcyB0byByYXRlcy94cmF0ZSBpZSBmb3IgdGhlIGdlbmVyYXRlZCBwcm9iZSByZXF1ZXN0ICovCisjZGVmaW5lIFdNSV9TQ0FOX0FERF9PRkRNX1JBVEVTICAgICAgMHg4CisvKiogVG8gZW5hYmxlIGluZGljYXRpb24gb2YgQ2hhbiBsb2FkIGFuZCBOb2lzZSBmbG9vciB0byBob3N0ICovCisjZGVmaW5lIFdNSV9TQ0FOX0NIQU5fU1RBVF9FVkVOVCAgICAgMHgxMAorLyoqIEZpbHRlciBQcm9iZSByZXF1ZXN0IGZyYW1lcyAgKi8KKyNkZWZpbmUgV01JX1NDQU5fRklMVEVSX1BST0JFX1JFUSAgICAweDIwCisvKipXaGVuIHNldCwgbm90IHRvIHNjYW4gREZTIGNoYW5uZWxzKi8KKyNkZWZpbmUgV01JX1NDQU5fQllQQVNTX0RGU19DSE4gICAgICAweDQwCisvKipXaGVuIHNldCwgY2VydGFpbiBlcnJvcnMgYXJlIGlnbm9yZWQgYW5kIHNjYW4gY29udGludWVzLgorICogRGlmZmVyZW50IEZXIHNjYW4gZW5naW5lIG1heSB1c2UgaXRzIG93biBsb2dpYyB0byBkZWNpZGUgd2hhdCBlcnJvcnMgdG8gaWdub3JlKi8KKyNkZWZpbmUgV01JX1NDQU5fQ09OVElOVUVfT05fRVJST1IgICAweDgwCisvKiogRW5hYmxlIHByb21pc2NvdXMgbW9kZSBmb3IgZXNlICovCisjZGVmaW5lIFdNSV9TQ0FOX0ZJTFRFUl9QUk9NSVNDT1VTICAgMHgxMDAKKy8qKiBhbGxvdyB0byBzZW5kIHByb2JlIHJlcSBvbiBERlMgY2hhbm5lbCAqLworI2RlZmluZSBXTUlfU0NBTl9GTEFHX0ZPUkNFX0FDVElWRV9PTl9ERlMgMHgyMDAKKy8qKiBhZGQgVFBDIGNvbnRlbnQgaW4gcHJvYmUgcmVxIGZyYW1lICovCisjZGVmaW5lIFdNSV9TQ0FOX0FERF9UUENfSUVfSU5fUFJPQkVfUkVRICAweDQwMAorLyoqIGFkZCBEUyBjb250ZW50IGluIHByb2JlIHJlcSBmcmFtZSAqLworI2RlZmluZSBXTUlfU0NBTl9BRERfRFNfSUVfSU5fUFJPQkVfUkVRICAgMHg4MDAKKy8qKiB1c2UgcmFuZG9tIG1hYyBhZGRyZXNzIGZvciBUQSBmb3IgcHJvYmUgcmVxdWVzdCBmcmFtZSBhbmQgYWRkCisgKiBvdWkgc3BlY2lmaWVkIGJ5IFdNSV9TQ0FOX1BST0JfUkVRX09VSV9DTURJRCB0byB0aGUgcHJvYmUgcmVxIGZyYW1lLgorICogaWYgb3VpIGlzIG5vdCBzZXQgYnkgV01JX1NDQU5fUFJPQl9SRVFfT1VJX0NNRElEICB0aGVuIHRoZSBmbGFnIGlzIGlnbm9yZWQqLworI2RlZmluZSBXTUlfU0NBTl9BRERfU1BPT0ZFRF9NQUNfSU5fUFJPQkVfUkVRICAgMHgxMDAwCisKKy8qKiBXTUlfU0NBTl9DTEFTU19NQVNLIG11c3QgYmUgdGhlIHNhbWUgdmFsdWUgYXMgSUVFRTgwMjExX1NDQU5fQ0xBU1NfTUFTSyAqLworI2RlZmluZSBXTUlfU0NBTl9DTEFTU19NQVNLIDB4RkYwMDAwMDAKKworLyoKKyAqIE1hc2tzIGlkZW50aWZ5aW5nIHR5cGVzL0lEIG9mIHNjYW5zCisgKiBTY2FuX1N0b3AgbWFjcm9zIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSBhcyBiZWxvdyBkZWZpbmVkIGluIFVNQUMKKyAqICNkZWZpbmUgSUVFRTgwMjExX1NQRUNJRklDX1NDQU4gICAgICAgMHgwMDAwMDAwMAorICogI2RlZmluZSBJRUVFODAyMTFfVkFQX1NDQU4gICAgICAgICAgICAweDAxMDAwMDAwCisgKiAjZGVmaW5lIElFRUU4MDIxMV9BTExfU0NBTlMgICAgICAgICAgIDB4MDQwMDAwMDAKKyAqLworI2RlZmluZSBXTUlfU0NBTl9TVE9QX09ORSAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFdNSV9TQ05fU1RPUF9WQVBfQUxMICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgV01JX1NDQU5fU1RPUF9BTEwgICAgICAgMHgwNDAwMDAwMAorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfc3RvcF9zY2FuX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiByZXF1ZXN0b3IgcmVxdWVzdGluZyBjYW5jZWwgICovCisJQV9VSU5UMzIgcmVxdWVzdG9yOworCS8qKiBTY2FuIElEICovCisJQV9VSU5UMzIgc2Nhbl9pZDsKKwkvKioKKwkgKiBSZXEgVHlwZQorCSAqIHJlcV90eXBlIHNob3VsZCBiZSBXTUlfU0NBTl9TVE9QX09ORSwgV01JX1NDTl9TVE9QX1ZBUF9BTEwgb3IgV01JX1NDQU5fU1RPUF9BTEwKKwkgKiBXTUlfU0NBTl9TVE9QX09ORSBpbmRpY2F0ZXMgdG8gc3RvcCBhIHNwZWNpZmljIHNjYW4gd2l0aCBzY2FuX2lkCisJICogV01JX1NDTl9TVE9QX1ZBUF9BTEwgaW5kaWNhdGVzIHRvIHN0b3AgYWxsIHNjYW4gcmVxdWVzdHMgb24gYSBzcGVjaWZpYyB2RGV2IHdpdGggdmRldl9pZAorCSAqIFdNSV9TQ0FOX1NUT1BfQUxMIGluZGljYXRlcyB0byBzdG9wIGFsbCBzY2FuIHJlcXVlc3RzIGluIGJvdGggU2NoZWR1bGVyJ3MgcXVldWUgYW5kIFNjYW4gRW5naW5lCisJICovCisJQV9VSU5UMzIgcmVxX3R5cGU7CisJLyoqCisJICogdkRldiBJRAorCSAqIHVzZWQgd2hlbiByZXFfdHlwZSBlcXVhbHMgdG8gV01JX1NDTl9TVE9QX1ZBUF9BTEwsIGl0IGluZGV4ZWQgdGhlIHZEZXYgb24gd2hpY2ggdG8gc3RvcCB0aGUgc2NhbgorCSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7Cit9IHdtaV9zdG9wX3NjYW5fY21kX2ZpeGVkX3BhcmFtOworCisjZGVmaW5lIE1BWF9OVU1fQ0hBTl9QRVJfV01JX0NNRCAgICAgNTggLyogZWFjaCBXTUkgY21kIGNhbiBob2xkIDU4IGNoYW5uZWwgZW50cmllcyBhdCBtb3N0ICovCisjZGVmaW5lIEFQUEVORF9UT19FWElTVElOR19DSEFOX0xJU1QgMQorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfc2Nhbl9jaGFuX2xpc3RfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgbnVtX3NjYW5fY2hhbnM7CisJLyoqIG5vIG9mIGVsZW1lbnRzIGluIGNoYW5faW5mb1tdICovCisJQV9VSU5UMzIgZmxhZ3M7ICAgICAgICAgLyogRmxhZ3MgdXNlZCB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiBjaGFubmVsIGxpc3QgdXBkYXRlIG9uIHRhcmdldCBzaWRlICovCisJLyoqIEZvbGxvd2VkIGJ5IHRoZSB2YXJpYWJsZSBsZW5ndGggVExWIGNoYW5faW5mbzoKKwkgKiAgd21pX2NoYW5uZWwgY2hhbl9pbmZvW10gKi8KK30gd21pX3NjYW5fY2hhbl9saXN0X2NtZF9maXhlZF9wYXJhbTsKKworLyoKKyAqIFByaW9yaXR5IG51bWJlcnMgbXVzdCBiZSBzZXF1ZW50aWFsLCBzdGFydGluZyB3aXRoIDAuCisgKi8KKy8qIE5PVEU6IFdMQU4gU0NBTl9QUklPUklUWV9DT1VOVCBjYW4ndCBiZSBjaGFuZ2VkIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGNvbXBhdGliaWxpdHkgKi8KK3R5cGVkZWYgZW51bSB7CisJV01JX1NDQU5fUFJJT1JJVFlfVkVSWV9MT1cgPSAwLAorCVdNSV9TQ0FOX1BSSU9SSVRZX0xPVywKKwlXTUlfU0NBTl9QUklPUklUWV9NRURJVU0sCisJV01JX1NDQU5fUFJJT1JJVFlfSElHSCwKKwlXTUlfU0NBTl9QUklPUklUWV9WRVJZX0hJR0gsCisKKwlXTUlfU0NBTl9QUklPUklUWV9DT1VOVCAgICAgICAgIC8qIG51bWJlciBvZiBwcmlvcml0aWVzIHN1cHBvcnRlZCAqLworfSB3bWlfc2Nhbl9wcmlvcml0eTsKKworLyogRml2ZSBMZXZlbHMgZm9yIFJlcXVlc3RlZCBQcmlvcml0eSAqLworLyogVkVSWV9MT1cgTE9XICBNRURJVU0gICBISUdIICBWRVJZX0hJR0ggKi8KK3R5cGVkZWYgQV9VSU5UMzIgV0xBTl9QUklPUklUWV9NQVBQSU5HW1dNSV9TQ0FOX1BSSU9SSVRZX0NPVU5UXTsKKworLyoqCisgKiB0byBrZWVwIGFsaWduIHdpdGggVU1BQyBpbXBsZW1lbnRhdGlvbiwgd2UgcGFzcyBvbmx5IHZkZXZfdHlwZSBidXQgbm90IHZkZXZfc3VidHlwZSB3aGVuIHdlIG92ZXJ3cml0ZSBhbiBlbnRyeSBmb3IgYSBzcGVjaWZpYyB2ZGV2X3N1YnR5cGUKKyAqIGV4LiBpZiB3ZSBuZWVkIG92ZXJ3cml0ZSBQMlAgQ2xpZW50IHByb3JpdHkgZW50cnksIHdlIHdpbGwgb3ZlcndyaXRlIHRoZSB3aG9sZSB0YWJsZSBmb3IgV0xBTl9NX1NUQQorICogd2Ugd2lsbCBnZW5lcmF0ZSB0aGUgbmV3IFdMQU5fTV9TVEEgdGFibGUgd2l0aCBtb2RpZmllZCBQMlAgQ2xpZW50IEVudHJ5IGJ1dCBrZWVwIFNUQSBlbnRyeSBpbnRhY3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NjYW5fc2NoX3ByaW9yaXR5X3RhYmxlX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKgorCSAqIHVzZWQgYXMgYW4gaW5kZXggdG8gZmluZCB0aGUgcHJvcGVyIHRhYmxlIGZvciBhIHNwZWNpZmljIHZkZXYgdHlwZSBpbiBkZWZhdWx0X3NjYW5fcHJpb3JpdHlfbWFwcGluZ190YWJsZQorCSAqIHZkZXZfdHlwZSBzaG91bGQgYmUgb25lIG9mIGVudW0gaW4gV0xBTl9PUE1PREUgd2hpY2ggaW5jdWxkZXMgV0xBTl9NX0lCU1MsIFdMQU5fTV9TVEEsIFdMQU5fTV9BUCBhbmQgV0xBTl9NX01PTklUT1IgY3VycmVudGx5CisJICovCisJQV9VSU5UMzIgdmRldl90eXBlOworCS8qKgorCSAqIG51bWJlciBvZiByb3dzIGluIG1hcHBpbmdfdGFibGUgZm9yIGEgc3BlY2lmaWMgdmRldgorCSAqIGZvciBXTEFOX01fU1RBIHR5cGUsIHRoZXJlIGFyZSAzIGVudHJpZXMgaW4gdGhlIHRhYmxlIChyZWZlciB0byBkZWZhdWx0X3NjYW5fcHJpb3JpdHlfbWFwcGluZ190YWJsZSBkZWZpbml0aW9uKQorCSAqLworCUFfVUlOVDMyIG51bWJlcl9yb3dzOworCS8qKiAgbWFwcGluZ190YWJsZSBmb3IgYSBzcGVjaWZpYyB2ZGV2IGZvbGxvd3MgdGhpcyBUTFYKKwkgKiAgIFdMQU5fUFJJT1JJVFlfTUFQUElORyBtYXBwaW5nX3RhYmxlW107ICovCit9IHdtaV9zY2FuX3NjaF9wcmlvcml0eV90YWJsZV9jbWRfZml4ZWRfcGFyYW07CisKKy8qKiB1cGRhdGUgZmxhZ3MgKi8KKyNkZWZpbmUgV01JX1NDQU5fVVBEQVRFX1NDQU5fUFJJT1JJVFkgICAgICAgICAgIDB4MQorI2RlZmluZSBXTUlfU0NBTl9VUERBVEVfU0NBTl9NSU5fUkVTVF9USU1FICAgICAgMHgyCisjZGVmaW5lIFdNSV9TQ0FOX1VQREFURV9TQ0FOX01BWF9SRVNUX1RJTUUgICAgICAweDQKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIHJlcXVlc3RvciByZXF1ZXN0aW5nIHVwZGF0ZSBzY2FuIHJlcXVlc3QgICovCisJQV9VSU5UMzIgcmVxdWVzdG9yOworCS8qKiBTY2FuIElEIG9mIHRoZSBzY2FuIHJlcXVlc3QgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZSAqLworCUFfVUlOVDMyIHNjYW5faWQ7CisJLyoqIHVwZGF0ZSBmbGFncywgaW5kaWNhdGluZyB3aGljaCBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgYW5kIG5lZWQgdG8gYmUgdXBkYXRlZCovCisJQV9VSU5UMzIgc2Nhbl91cGRhdGVfZmxhZ3M7CisJLyoqIHNjYW4gcHJpb3JpdHkuIE9ubHkgdmFsaWQgaWYgV01JX1NDQU5fVVBEQVRFX1NDQU5fUFJJT1JJVFkgZmxhZyBpcyBzZXQgaW4gc2Nhbl91cGRhdGVfZmxhZyAqLworCUFfVUlOVDMyIHNjYW5fcHJpb3JpdHk7CisJLyoqIG1pbiByZXN0IHRpbWUuIE9ubHkgdmFsaWQgaWYgV01JX1NDQU5fVVBEQVRFX01JTl9SRVNUX1RJTUUgZmxhZyBpcyBzZXQgaW4gc2Nhbl91cGRhdGVfZmxhZyAqLworCUFfVUlOVDMyIG1pbl9yZXN0X3RpbWU7CisJLyoqIG1pbiByZXN0IHRpbWUuIE9ubHkgdmFsaWQgaWYgV01JX1NDQU5fVVBEQVRFX01BWF9SRVNUX1RJTUUgZmxhZyBpcyBzZXQgaW4gc2Nhbl91cGRhdGVfZmxhZyAqLworCUFfVUlOVDMyIG1heF9yZXN0X3RpbWU7Cit9IHdtaV9zY2FuX3VwZGF0ZV9yZXF1ZXN0X2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIG91aSB0byBiZSB1c2VkIGluIHByb2JlIHJlcXVlc3QgZnJhbWUgd2hlbiAgcmFuZG9tIG1hYyBhZGRyZXNzcyBpcworCSAqIHJlcXVlc3RlZCBwYXJ0IG9mIHNjYW4gcGFyYW1ldGVycy4gdGhpcyBpcyBhcHBsaWVkIHRvIGJvdGggRlcgaW50ZXJuYWwgc2NhbnMgYW5kCisJICogaG9zdCBpbml0YXRlZCBzY2Fucy4gaG9zdCBjYW4gcmVxdWVzdCBmb3IgcmFuZG9tIG1hYyBhZGRyZXNzIHdpdGgKKwkgKiBXTUlfU0NBTl9BRERfU1BPT0ZFRF9NQUNfSU5fUFJPQkVfUkVRIGZsYWcuICAgICAqLworCUFfVUlOVDMyIHByb2JfcmVxX291aTsKK30gd21pX3NjYW5fcHJvYl9yZXFfb3VpX2NtZF9maXhlZF9wYXJhbTsKKworZW51bSB3bWlfc2Nhbl9ldmVudF90eXBlIHsKKwlXTUlfU0NBTl9FVkVOVF9TVEFSVEVEID0gMHgxLAorCVdNSV9TQ0FOX0VWRU5UX0NPTVBMRVRFRCA9IDB4MiwKKwlXTUlfU0NBTl9FVkVOVF9CU1NfQ0hBTk5FTCA9IDB4NCwKKwlXTUlfU0NBTl9FVkVOVF9GT1JFSUdOX0NIQU5ORUwgPSAweDgsCisJV01JX1NDQU5fRVZFTlRfREVRVUVVRUQgPSAweDEwLCAgICAgICAgIC8qIHNjYW4gcmVxdWVzdCBnb3QgZGVxdWV1ZWQgKi8KKwlXTUlfU0NBTl9FVkVOVF9QUkVFTVBURUQgPSAweDIwLCAgICAgICAgICAgICAgICAvKiBwcmVlbXB0ZWQgYnkgb3RoZXIgaGlnaCBwcmlvcml0eSBzY2FuICovCisJV01JX1NDQU5fRVZFTlRfU1RBUlRfRkFJTEVEID0gMHg0MCwgICAgICAgICAgICAgLyogc2NhbiBzdGFydCBmYWlsZWQgKi8KKwlXTUlfU0NBTl9FVkVOVF9SRVNUQVJURUQgPSAweDgwLCAgICAgICAgICAgICAgICAvKnNjYW4gcmVzdGFydGVkICovCisJV01JX1NDQU5fRVZFTlRfTUFYID0gMHg4MDAwCit9OworCitlbnVtIHdtaV9zY2FuX2NvbXBsZXRpb25fcmVhc29uIHsKKwkvKiogc2NhbiByZWxhdGVkIGV2ZW50cyAqLworCVdNSV9TQ0FOX1JFQVNPTl9OT05FID0gMHhGRiwKKwlXTUlfU0NBTl9SRUFTT05fQ09NUExFVEVEID0gMCwKKwlXTUlfU0NBTl9SRUFTT05fQ0FOQ0VMTEVEID0gMSwKKwlXTUlfU0NBTl9SRUFTT05fUFJFRU1QVEVEID0gMiwKKwlXTUlfU0NBTl9SRUFTT05fVElNRURPVVQgPSAzLAorCVdNSV9TQ0FOX1JFQVNPTl9JTlRFUk5BTF9GQUlMVVJFID0gNCwgICAgICAgICAgIC8qIFRoaXMgcmVhc29uIGluZGljYXRpb24gZmFpbHVyZXMgd2hlbiBwZXJmb3JtYWluZyBzY2FuICovCisJV01JX1NDQU5fUkVBU09OX01BWCwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zY2FuX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJLyoqIHNjYW4gZXZlbnQgKHdtaV9zY2FuX2V2ZW50X3R5cGUpICovCisJQV9VSU5UMzIgZXZlbnQ7CisJLyoqIHN0YXR1cyBvZiB0aGUgc2NhbiBjb21wbGV0aW9uIGV2ZW50ICovCisJQV9VSU5UMzIgcmVhc29uOworCS8qKiBjaGFubmVsIGZyZXEgLCBvbmx5IHZhbGlkIGZvciBGT1JFSUdOIGNoYW5uZWwgZXZlbnQqLworCUFfVUlOVDMyIGNoYW5uZWxfZnJlcTsKKwkvKippZCBvZiB0aGUgcmVxdWVzdG9yIHdob3NlIHNjYW4gaXMgaW4gcHJvZ3Jlc3MgKi8KKwlBX1VJTlQzMiByZXF1ZXN0b3I7CisJLyoqaWQgb2YgdGhlIHNjYW4gdGhhdCBpcyBpbiBwcm9ncmVzcyAqLworCUFfVUlOVDMyIHNjYW5faWQ7CisJLyoqaWQgb2YgVkRFViB0aGF0IHJlcXVlc3RlZCB0aGUgc2NhbiAqLworCUFfVUlOVDMyIHZkZXZfaWQ7Cit9IHdtaV9zY2FuX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiBXTUkgRGlhZyBldmVudCAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgaXMgV01JVExWX1RBR19TVFJVQ193bWlfZGlhZ19ldmVudF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRpbWVfc3RhbXA7ICAgICAgICAgICAgLyogUmVmZXJlbmNlIHRpbWVzdGFtcC4gZGlhZyBmcmFtZSBjb250YWlucyBkaWZmIHZhbHVlICovCisJQV9VSU5UMzIgY291bnQ7ICAgICAgICAgLyogTnVtYmVyIG9mIGRpYWcgZnJhbWVzIGFkZGVkIHRvIGN1cnJlbnQgZXZlbnQgKi8KKwlBX1VJTlQzMiBkcm9wcGVkOworCS8qIGZvbGxvd2VkIGJ5IFdNSVRMVl9UQUdfQVJSQVlfQllURSAqLworfSB3bWlfZGlhZ19ldmVudF9maXhlZF9wYXJhbTsKKworLyoKKyAqIElmIEZXIGhhcyBtdWx0aXBsZSBhY3RpdmUgY2hhbm5lbHMgZHVlIHRvIE1DQyhtdWx0aSBjaGFubmVsIGNvbmN1cnJlbmN5KSwKKyAqIHRoZW4gdGhlc2Ugc3RhdHMgYXJlIGNvbWJpbmVkIHN0YXRzIGZvciBhbGwgdGhlIGFjdGl2ZSBjaGFubmVscy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3VwZGF0ZV93aGFsX21pYl9zdGF0c19ldmVudF9maXhlZF9wYXJhbSAqLworCS8qKiBhY2sgY291bnQsIGl0IGlzIGFuIGluY3JlbWVudGFsIG51bWJlciwgbm90IGFjY3VtdWxhdGVkIG51bWJlciAqLworCUFfVUlOVDMyIGFja1JjdkJhZDsKKwkvKiogYmFkIHJ0cyBjb3VudCwgaXQgaXMgYW4gaW5jcmVtZW50YWwgbnVtYmVyLCBub3QgYWNjdW11bGF0ZWQgbnVtYmVyICovCisJQV9VSU5UMzIgcnRzQmFkOworCS8qKiBnb29kIHJ0cywgaXQgaXMgYW4gaW5jcmVtZW50YWwgbnVtYmVyLCBub3QgYWNjdW11bGF0ZWQgbnVtYmVyICovCisJQV9VSU5UMzIgcnRzR29vZDsKKwkvKiogZmNzIGNvdW50LCBpdCBpcyBhbiBpbmNyZW1lbnRhbCBudW1iZXIsIG5vdCBhY2N1bXVsYXRlZCBudW1iZXIgKi8KKwlBX1VJTlQzMiBmY3NCYWQ7CisJLyoqIGJlYWNvbiBjb3VudCwgaXQgaXMgYW4gaW5jcmVtZW50YWwgbnVtYmVyLCBub3QgYWNjdW11bGF0ZWQgbnVtYmVyICovCisJQV9VSU5UMzIgbm9CZWFjb25zOworfSB3bWlfdXBkYXRlX3doYWxfbWliX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKgorICogVGhpcyBkZWZpbmVzIGhvdyBtdWNoIGhlYWRyb29tIGlzIGtlcHQgaW4gdGhlCisgKiByZWNlaXZlIGZyYW1lIGJldHdlZW4gdGhlIGRlc2NyaXB0b3IgYW5kIHRoZQorICogcGF5bG9hZCwgaW4gb3JkZXIgZm9yIHRoZSBXTUkgUEhZIGVycm9yIGFuZAorICogbWFuYWdlbWVudCBoYW5kbGVyIHRvIGluc2VydCBoZWFkZXIgY29udGVudHMuCisgKgorICogVGhpcyBpcyBpbiBieXRlcy4KKyAqLworI2RlZmluZSBXTUlfTUdNVF9SWF9IRFJfSEVBRFJPT00gICAgc2l6ZW9mKHdtaV9jb21iX3BoeWVycl9yeF9oZHIpICsgV01JX1RMVl9IRFJfU0laRSArIHNpemVvZih3bWlfc2luZ2xlX3BoeWVycl9yeF9oZHIpCisKKy8qKiBUaGlzIGV2ZW50IHdpbGwgYmUgdXNlZCBmb3Igc2VuZGluZyBzY2FuIHJlc3VsdHMKKyAqIGFzIHdlbGwgYXMgcnggbWdtdCBmcmFtZXMgdG8gdGhlIGhvc3QuIFRoZSByeCBidWZmZXIKKyAqIHdpbGwgYmUgc2VudCBhcyBwYXJ0IG9mIHRoaXMgV01JIGV2ZW50LiBJdCB3b3VsZCBiZSBhCisgKiBnb29kIGlkZWEgdG8gcGFzcyBhbGwgdGhlIGZpZWxkcyBpbiB0aGUgUlggc3RhdHVzCisgKiBkZXNjcmlwdG9yIHVwIHRvIHRoZSBob3N0LgorICovCisvKiBBVEhfTUFYX0FOVEVOTkEgdmFsdWUgKDQpIGNhbid0IGJlIGNoYW5nZWQgd2l0aG91dCBicmVha2luZyB0aGUgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBBVEhfTUFYX0FOVEVOTkEgNCAgICAgICAvKiBUbyBzdXBwb3J0IGJlZWxpbmVhciwgd2hpY2ggaXMgdXAgdG8gNCBjaGFpbnMgKi8KKworLyoqIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSB0aGUgIG1nbXQgZnJhbWUgKHByb2JlIHJlcS9iZWFjb24pIGlzIHJlY2VpdmVkIGluIHRoZSBjb250ZXh0IG9mIGV4dHNjYW4gcGVyZm9ybWVkIGJ5IEZXICovCisjZGVmaW5lIFdNSV9NR01UX1JYX0hEUl9FWFRTQ0FOICAgICAweDAxCisKKy8qKgorICogZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHRoZSBtZ210IGZyYW1lIChwcm9iZSByZXEvYmVhY29uKSBpcyByZWNlaXZlZCBpbgorICogdGhlIGNvbnRleHQgb2YgbWF0Y2hlZCBuZXR3b3JrIGJ5IEZXIEVOTE8KKyAqLworI2RlZmluZSBXTUlfTUdNVF9SWF9IRFJfRU5MTyAweDAyCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZ210X3J4X2hkciAqLworCS8qKiBjaGFubmVsIG9uIHdoaWNoIHRoaXMgZnJhbWUgaXMgcmVjZWl2ZWQuICovCisJQV9VSU5UMzIgY2hhbm5lbDsKKwkvKiogc25yIGluZm9ybWF0aW9uIHVzZWQgdG8gY2FsIHJzc2kgKi8KKwlBX1VJTlQzMiBzbnI7CisJLyoqIFJhdGUga2JwcyAqLworCUFfVUlOVDMyIHJhdGU7CisJLyoqIHJ4IHBoeSBtb2RlIFdMQU5fUEhZX01PREUgKi8KKwlBX1VJTlQzMiBwaHlfbW9kZTsKKwkvKiogbGVuZ3RoIG9mIHRoZSBmcmFtZSAqLworCUFfVUlOVDMyIGJ1Zl9sZW47CisJLyoqIHJ4IHN0YXR1cyAqLworCUFfVUlOVDMyIHN0YXR1czsKKwkvKiogUlNTSSBvZiBQUkkgMjBNSHogZm9yIGVhY2ggY2hhaW4uICovCisJQV9VSU5UMzIgcnNzaV9jdGxbQVRIX01BWF9BTlRFTk5BXTsKKwkvKiogaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hbmFnZW1lbnQgZnJhbWUgZS5nLiBjYW4gZ2l2ZSBhIHNjYW4gc291cmNlIGZvciBhIHNjYW4gcmVzdWx0IG1nbXQgZnJhbWUgKi8KKwlBX1VJTlQzMiBmbGFnczsKKwkvKiogY29tYmluZWQgUlNTSSwgaS5lLiB0aGUgc3VtIG9mIHRoZSBzbnIgKyBub2lzZSBmbG9vciAoZEJtIHVuaXRzKSAqLworCUFfSU5UMzIgcnNzaTsKKworCS8qKiBkZWx0YSBiZXR3ZWVuIGxvY2FsIFRTRihUU0YgdGltZXN0YW1wIHdoZW4gZnJhbWUgd2FzIFJYZCkKKwkqIGFuZCByZW1vdGUgVFNGKFRTRiB0aW1lc3RhbXAgaW4gdGhlIElFIGZvciBtZ210IGZyYW1lCisJKiBiZWFjb24scHJvYmVyZXNwIGZvciBlLmcpLiBJZiByZW1vdGUgVFNGIGlzIG5vdCBhdmFpbGFibGUsCisJKiBkZWx0YSBzZXQgdG8gMC4KKwkqIEFsdGhvdWdoIHRzZl9kZWx0YSBpcyBzdG9yZWQgYXMgQV9VSU5UMzIsIGl0IGNhbiBiZSBuZWdhdGl2ZSwKKwkqIGFuZCB0aHVzIHdvdWxkIG5lZWQgdG8gYmUgc2lnbi1leHRlbmRlZCBpZiBhZGRlZCB0byBhIHZhbHVlCisJKiBsYXJnZXIgdGhhbiAzMiBiaXRzLgorCSovCisJQV9VSU5UMzIgdHNmX2RlbHRhOworCS8qIFRoaXMgVExWIGlzIGZvbGxvd2VkIGJ5IGFycmF5IG9mIGJ5dGVzOgorCSAqIC8vIG1hbmFnZW1lbnQgZnJhbWUgYnVmZmVyCisJICogICBBX1VJTlQ4IGJ1ZnBbXTsKKwkgKi8KK30gd21pX21nbXRfcnhfaGRyOworCisvKiBXTUkgUEhZIEVycm9yIFJYICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVFNGIHRpbWVzdGFtcCAqLworCUFfVUlOVDMyIHRzZl90aW1lc3RhbXA7CisKKwkvKioKKwkgKiBDdXJyZW50IGZyZXExLCBmcmVxMgorCSAqCisJICogWzc6MF06ICAgIGZyZXExW2xvXQorCSAqIFsxNTo4XSA6ICAgZnJlcTFbaGldCisJICogWzIzOjE2XTogICBmcmVxMltsb10KKwkgKiBbMzE6MjRdOiAgIGZyZXEyW2hpXQorCSAqLworCUFfVUlOVDMyIGZyZXFfaW5mb18xOworCisJLyoqCisJICogQ29tYmluZWQgUlNTSSBvdmVyIGFsbCBjaGFpbnMgYW5kIGNoYW5uZWwgd2lkdGggZm9yIHRoaXMgUEhZIGVycm9yCisJICoKKwkgKiBbNzowXTogUlNTSSBjb21iaW5lZAorCSAqIFsxNTo4XTogQ2hhbm5lbCB3aWR0aCAoTUh6KQorCSAqIFsyMzoxNl06IFBIWSBlcnJvciBjb2RlCisJICogWzI0OjE2XTogcmVzZXJ2ZWQgKGZ1dHVyZSB1c2UpCisJICovCisJQV9VSU5UMzIgZnJlcV9pbmZvXzI7CisKKwkvKioKKwkgKiBSU1NJIG9uIGNoYWluIDAgdGhyb3VnaCAzCisJICoKKwkgKiBUaGlzIGlzIGZvcm1hdHRlZCB0aGUgc2FtZSBhcyB0aGUgUFBEVV9TVEFSVCBSWCBkZXNjcmlwdG9yCisJICogZmllbGQ6CisJICoKKwkgKiBbNzowXTogICBwcmkyMAorCSAqIFsxNTo4XTogIHNlYzIwCisJICogWzIzOjE2XTogc2VjNDAKKwkgKiBbMzE6MjRdOiBzZWM4MAorCSAqLworCUFfVUlOVDMyIHJzc2lfY2hhaW4wOworCUFfVUlOVDMyIHJzc2lfY2hhaW4xOworCUFfVUlOVDMyIHJzc2lfY2hhaW4yOworCUFfVUlOVDMyIHJzc2lfY2hhaW4zOworCisJLyoqCisJICogTGFzdCBjYWxpYnJhdGVkIE5GIHZhbHVlIGZvciBjaGFpbiAwIHRocm91Z2ggMworCSAqCisJICogbmZfbGlzdF8xOgorCSAqCisJICogKyBbMTU6MF0gLSBjaGFpbiAwCisJICogKyBbMzE6MTZdIC0gY2hhaW4gMQorCSAqCisJICogbmZfbGlzdF8yOgorCSAqCisJICogKyBbMTU6MF0gLSBjaGFpbiAyCisJICogKyBbMzE6MTZdIC0gY2hhaW4gMworCSAqLworCUFfVUlOVDMyIG5mX2xpc3RfMTsKKwlBX1VJTlQzMiBuZl9saXN0XzI7CisKKwkvKiogTGVuZ3RoIG9mIHRoZSBmcmFtZSAqLworCUFfVUlOVDMyIGJ1Zl9sZW47Cit9IHdtaV9zaW5nbGVfcGh5ZXJyX3J4X2hkcjsKKworI2RlZmluZSBXTUlfVU5JRklFRF9GUkVRSU5GT18xX0xPICAgMHgwMDAwMDBmZgorI2RlZmluZSBXTUlfVU5JRklFRF9GUkVRSU5GT18xX0xPX1MgMAorI2RlZmluZSBXTUlfVU5JRklFRF9GUkVRSU5GT18xX0hJICAgMHgwMDAwZmYwMAorI2RlZmluZSBXTUlfVU5JRklFRF9GUkVRSU5GT18xX0hJX1MgOAorI2RlZmluZSBXTUlfVU5JRklFRF9GUkVRSU5GT18yX0xPICAgMHgwMGZmMDAwMAorI2RlZmluZSBXTUlfVU5JRklFRF9GUkVRSU5GT18yX0xPX1MgMTYKKyNkZWZpbmUgV01JX1VOSUZJRURfRlJFUUlORk9fMl9ISSAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgV01JX1VOSUZJRURfRlJFUUlORk9fMl9ISV9TIDI0CisKKy8qCisgKiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlc2UgX1NFVCBtYWNyb3MgYnJlYWsgbWFjcm8gc2lkZSBlZmZlY3QKKyAqIGFzc3VtcHRpb25zOyBkb24ndCBiZSBjbGV2ZXIgd2l0aCB0aGVtLgorICovCisjZGVmaW5lIFdNSV9VTklGSUVEX0ZSRVFfSU5GT19HRVQoaGRyLCBmKQkJCQkgICAgXAorCSggV01JX0ZfTVMoIChoZHIpLT5mcmVxX2luZm9fMSwJCQkJCVwKKwkJICAgIFdNSV9VTklGSUVEX0ZSRVFJTkZPXyAjIyBmICMjIF9MTyApCQkJCSAgICAgIFwKKwkgIHwgKFdNSV9GX01TKCAoaGRyKS0+ZnJlcV9pbmZvXzEsCQkJCVwKKwkJICAgICAgIFdNSV9VTklGSUVEX0ZSRVFJTkZPXyAjIyBmICMjIF9ISSApIDw8IDgpICkKKworI2RlZmluZSBXTUlfVU5JRklFRF9GUkVRX0lORk9fU0VUKGhkciwgZiwgdikJCQkJICAgIFwKKwlkbyB7CQkJCQkJCQkgICAgXAorCQlXTUlfRl9STVcoKGhkciktPmZyZXFfaW5mb18xLCAodikgJiAweGZmLAkJCVwKKwkJCSAgV01JX1VOSUZJRURfRlJFUUlORk9fICMjIGYgIyMgX0xPKTsJCQkJICAgIFwKKwkJV01JX0ZfUk1XKChoZHIpLT5mcmVxX2luZm9fMSwgKCh2KSA+PiA4KSAmIDB4ZmYsCQlcCisJCQkgIFdNSV9VTklGSUVEX0ZSRVFJTkZPXyAjIyBmICMjIF9ISSk7CQkJCSAgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgV01JX1VOSUZJRURfRlJFUUlORk9fMl9SU1NJX0NPTUIgICAgMHgwMDAwMDBmZgorI2RlZmluZSBXTUlfVU5JRklFRF9GUkVRSU5GT18yX1JTU0lfQ09NQl9TICAwCisjZGVmaW5lIFdNSV9VTklGSUVEX0ZSRVFJTkZPXzJfQ0hXSURUSCAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgV01JX1VOSUZJRURfRlJFUUlORk9fMl9DSFdJRFRIX1MgICAgOAorI2RlZmluZSBXTUlfVU5JRklFRF9GUkVRSU5GT18yX1BIWUVSUkNPREUgICAweDAwZmYwMDAwCisjZGVmaW5lIFdNSV9VTklGSUVEX0ZSRVFJTkZPXzJfUEhZRVJSQ09ERV9TIDE2CisKKyNkZWZpbmUgV01JX1VOSUZJRURfUlNTSV9DT01CX0dFVChoZHIpCQkJCQkgICAgXAorCSggKGludDhfdCkgKFdNSV9GX01TKChoZHIpLT5mcmVxX2luZm9fMiwJCQlcCisJCQkgICAgIFdNSV9VTklGSUVEX0ZSRVFJTkZPXzJfUlNTSV9DT01CKSkpCisKKyNkZWZpbmUgV01JX1VOSUZJRURfUlNTSV9DT01CX1NFVChoZHIsIHYpCQkJCSAgICBcCisJV01JX0ZfUk1XKChoZHIpLT5mcmVxX2luZm9fMiwgKHYpICYgMHhmZiwJCQlcCisJCSAgV01JX1VOSUZJRURfRlJFUUlORk9fMl9SU1NJX0NPTUIpOworCisjZGVmaW5lIFdNSV9VTklGSUVEX0NIV0lEVEhfR0VUKGhkcikJCQkJCSAgICBcCisJV01JX0ZfTVMoKGhkciktPmZyZXFfaW5mb18yLCBXTUlfVU5JRklFRF9GUkVRSU5GT18yX0NIV0lEVEgpCisKKyNkZWZpbmUgV01JX1VOSUZJRURfQ0hXSURUSF9TRVQoaGRyLCB2KQkJCQkJICAgIFwKKwlXTUlfRl9STVcoKGhkciktPmZyZXFfaW5mb18yLCAodikgJiAweGZmLAkJCVwKKwkJICBXTUlfVU5JRklFRF9GUkVRSU5GT18yX0NIV0lEVEgpOworCisjZGVmaW5lIFdNSV9VTklGSUVEX1BIWUVSUkNPREVfR0VUKGhkcikJCQkJCSAgICBcCisJV01JX0ZfTVMoKGhkciktPmZyZXFfaW5mb18yLCBXTUlfVU5JRklFRF9GUkVRSU5GT18yX1BIWUVSUkNPREUpCisKKyNkZWZpbmUgV01JX1VOSUZJRURfUEhZRVJSQ09ERV9TRVQoaGRyLCB2KQkJCQkgICAgXAorCVdNSV9GX1JNVygoaGRyKS0+ZnJlcV9pbmZvXzIsICh2KSAmIDB4ZmYsCQkJXAorCQkgIFdNSV9VTklGSUVEX0ZSRVFJTkZPXzJfUEhZRVJSQ09ERSk7CisKKyNkZWZpbmUgV01JX1VOSUZJRURfQ0hBSU5fMCAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBXTUlfVU5JRklFRF9DSEFJTl8wX1MgICAwCisjZGVmaW5lIFdNSV9VTklGSUVEX0NIQUlOXzEgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgV01JX1VOSUZJRURfQ0hBSU5fMV9TICAgMTYKKyNkZWZpbmUgV01JX1VOSUZJRURfQ0hBSU5fMiAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBXTUlfVU5JRklFRF9DSEFJTl8yX1MgICAwCisjZGVmaW5lIFdNSV9VTklGSUVEX0NIQUlOXzMgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgV01JX1VOSUZJRURfQ0hBSU5fM19TICAgMTYKKworI2RlZmluZSBXTUlfVU5JRklFRF9DSEFJTl8wX0ZJRUxEICAgbmZfbGlzdF8xCisjZGVmaW5lIFdNSV9VTklGSUVEX0NIQUlOXzFfRklFTEQgICBuZl9saXN0XzEKKyNkZWZpbmUgV01JX1VOSUZJRURfQ0hBSU5fMl9GSUVMRCAgIG5mX2xpc3RfMgorI2RlZmluZSBXTUlfVU5JRklFRF9DSEFJTl8zX0ZJRUxEICAgbmZfbGlzdF8yCisKKyNkZWZpbmUgV01JX1VOSUZJRURfTkZfQ0hBSU5fR0VUKGhkciwgYykJCQkJICAgIFwKKwkoKGludDE2X3QpIChXTUlfRl9NUygoaGRyKS0+V01JX1VOSUZJRURfQ0hBSU5fICMjIGMgIyMgX0ZJRUxELAkgICAgXAorCQkJICAgICBXTUlfVU5JRklFRF9DSEFJTl8gIyMgYykpKQorCisjZGVmaW5lIFdNSV9VTklGSUVEX05GX0NIQUlOX1NFVChoZHIsIGMsIG5mKQkJCQkgICAgXAorCVdNSV9GX1JNVygoaGRyKS0+V01JX1VOSUZJRURfQ0hBSU5fICMjIGMgIyMgX0ZJRUxELCAobmYpICYgMHhmZmZmLCAgXAorCQkgIFdNSV9VTklGSUVEX0NIQUlOXyAjIyBjKTsKKworLyoKKyAqIEZvciBub3csIHRoaXMgbWF0Y2hlcyB3aGF0IHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIGlzIGRvaW5nLgorICogVXBkYXRlIGFyNjAwMFByb2NSeERlc2MoKSB0byB1c2UgdGhlc2UgbWFjcm9zIHdoZW4gcG9wdWxhdGluZworICogdGhlIHJ4IGRlc2NyaXB0b3IgYW5kIHRoZW4gd2UgY2FuIGp1c3QgY29weSB0aGUgZmllbGQgb3ZlcgorICogdG8gdGhlIFdNSSBQSFkgbm90aWZpY2F0aW9uIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgYnJlYWtpbmcKKyAqIHRoaW5ncy4KKyAqLworI2RlZmluZSBXTUlfVU5JRklFRF9SU1NJX0NIQU5fUFJJMjAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgV01JX1VOSUZJRURfUlNTSV9DSEFOX1BSSTIwX1MgICAwCisjZGVmaW5lIFdNSV9VTklGSUVEX1JTU0lfQ0hBTl9TRUMyMCAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBXTUlfVU5JRklFRF9SU1NJX0NIQU5fU0VDMjBfUyAgIDgKKyNkZWZpbmUgV01JX1VOSUZJRURfUlNTSV9DSEFOX1NFQzQwICAgICAweDAwZmYwMDAwCisjZGVmaW5lIFdNSV9VTklGSUVEX1JTU0lfQ0hBTl9TRUM0MF9TICAgMTYKKyNkZWZpbmUgV01JX1VOSUZJRURfUlNTSV9DSEFOX1NFQzgwICAgICAweGZmMDAwMDAwCisjZGVmaW5lIFdNSV9VTklGSUVEX1JTU0lfQ0hBTl9TRUM4MF9TICAgMjQKKworI2RlZmluZSBXTUlfVU5JRklFRF9SU1NJX0NIQU5fU0VUKGhkciwgYywgY2gsIHJzc2kpCQkJICAgIFwKKwlXTUlfRl9STVcoKGhkciktPnJzc2lfY2hhaW4gIyMgYywgKHJzc2kpICYgMHhmZiwJCSAgXAorCQkgIFdNSV9VTklGSUVEX1JTU0lfQ0hBTl8gIyMgY2gpOworCisjZGVmaW5lIFdNSV9VTklGSUVEX1JTU0lfQ0hBTl9HRVQoaGRyLCBjLCBjaCkJCQkJICAgIFwKKwkoKGludDhfdCkgKFdNSV9GX01TKChoZHIpLT5yc3NpX2NoYWluICMjIGMsCQkJICBcCisJCQkgICAgV01JX1VOSUZJRURfUlNTSV9DSEFOXyAjIyBjaCkpKQorCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFBoeSBlcnJvciBldmVudCBoZWFkZXIgKi8KKwl3bWlfc2luZ2xlX3BoeWVycl9yeF9oZHIgaGRyOworCS8qKiBmcmFtZSBidWZmZXIgKi8KKwlBX1VJTlQ4IGJ1ZnBbMV07Cit9IHdtaV9zaW5nbGVfcGh5ZXJyX3J4X2V2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfY29tYl9waHllcnJfcnhfaGRyICovCisJLyoqIFBoeSBlcnJvciBwaHkgZXJyb3IgY291bnQgKi8KKwlBX1VJTlQzMiBudW1fcGh5ZXJyX2V2ZW50czsKKwlBX1VJTlQzMiB0c2ZfbDMyOworCUFfVUlOVDMyIHRzZl91MzI7CisJQV9VSU5UMzIgYnVmX2xlbjsKKwlBX1VJTlQzMiBwbWFjX2lkOworCS8qIFRoaXMgVExWIGlzIGZvbGxvd2VkIGJ5IGFycmF5IG9mIGJ5dGVzOgorCSAqIC8vIGZyYW1lIGJ1ZmZlciAtIGNvbnRhaW5zIG11bHRpcGxlIHBheWxvYWRzIGluIHRoZSBvcmRlcjoKKwkgKiAvLyBoZWFkZXIgLSBwYXlsb2FkLCBoZWFkZXIgLSBwYXlsb2FkLi4uCisJICogIChUaGUgaGVhZGVyIGlzIG9mIHR5cGU6IHdtaV9zaW5nbGVfcGh5ZXJyX3J4X2hkcikKKwkgKiAgIEFfVUlOVDggYnVmcFtdOworCSAqLworfSB3bWlfY29tYl9waHllcnJfcnhfaGRyOworCisvKiBXTUkgTUdNVCBUWCAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZ210X3R4X2hkciAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogcGVlciBNQUMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIHhtaXQgcmF0ZSAqLworCUFfVUlOVDMyIHR4X3JhdGU7CisJLyoqIHhtaXQgcG93ZXIgKi8KKwlBX1VJTlQzMiB0eF9wb3dlcjsKKwkvKiogQnVmZmVyIGxlbmd0aCBpbiBieXRlcyAqLworCUFfVUlOVDMyIGJ1Zl9sZW47CisJLyogVGhpcyBUTFYgaXMgZm9sbG93ZWQgYnkgYXJyYXkgb2YgYnl0ZXM6CisJICogLy8gbWFuYWdlbWVudCBmcmFtZSBidWZmZXIKKwkgKiAgIEFfVUlOVDggYnVmcFtdOworCSAqLworfSB3bWlfbWdtdF90eF9oZHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIFRMViB0YWcgYW5kIGxlbjsKKwkgKiAgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZ210X3R4X3NlbmRfY21kX2ZpeGVkX3BhcmFtCisJICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qIGVjaG9lZCBpbiB0eF9jb21wbF9ldmVudCAqLworCUFfVUlOVDMyIGRlc2NfaWQ7CisJLyogTUh6IHVuaXRzICovCisJQV9VSU5UMzIgY2hhbmZyZXE7CisJQV9VSU5UMzIgcGFkZHJfbG87CisJQV9VSU5UMzIgcGFkZHJfaGk7CisJQV9VSU5UMzIgZnJhbWVfbGVuOworCS8qIEJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMgKi8KKwlBX1VJTlQzMiBidWZfbGVuOworCS8qCisJICogVGhpcyBUTFYgaXMgZm9sbG93ZWQgYnkgYXJyYXkgb2YgYnl0ZXM6CisJICogIEZpcnN0IDY0IGJ5dGVzIG9mIG1hbmFnZW1lbnQgZnJhbWUKKwkgKiAgIEFfVUlOVDggYnVmcFtdOworCSAqLworfSB3bWlfbWdtdF90eF9zZW5kX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2VjaG9fZXZlbnRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB2YWx1ZTsKK30gd21pX2VjaG9fZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9lY2hvX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZhbHVlOworfSB3bWlfZWNob19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF9yZWdkb21haW5fY21kX2ZpeGVkX3BhcmFtICovCisKKwlBX1VJTlQzMiByZXNlcnZlZDA7CisJLyoqIHBsYWNlaG9sZGVyIGZvciBwZGV2X2lkIG9mIGZ1dHVyZSBtdWx0aXBsZSBNQUMgcHJvZHVjdHMuIEluaXQuIHRvIDAuICovCisJLyoqIHJlZyBkb21haW4gY29kZSAqLworCUFfVUlOVDMyIHJlZ19kb21haW47CisJQV9VSU5UMzIgcmVnX2RvbWFpbl8yRzsKKwlBX1VJTlQzMiByZWdfZG9tYWluXzVHOworCUFfVUlOVDMyIGNvbmZvcm1hbmNlX3Rlc3RfbGltaXRfMkc7CisJQV9VSU5UMzIgY29uZm9ybWFuY2VfdGVzdF9saW1pdF81RzsKK30gd21pX3BkZXZfc2V0X3JlZ2RvbWFpbl9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogdHJ1ZSBmb3Igc2NhbiBzdGFydCBhbmQgZmxhc2UgZm9yIHNjYW4gZW5kICovCisJQV9VSU5UMzIgc2Nhbl9zdGFydDsKK30gd21pX3BkZXZfc2Nhbl9jbWQ7CisKKy8qQ29tbWFuZCB0byBzZXQvdW5zZXQgY2hpcCBpbiBxdWlldCBtb2RlKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF9xdWlldF9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiByZXNlcnZlZDA7CisJLyoqIHBsYWNlaG9sZGVyIGZvciBwZGV2X2lkIG9mIGZ1dHVyZSBtdWx0aXBsZSBNQUMgcHJvZHVjdHMuIEluaXQuIHRvIDAuICovCisJQV9VSU5UMzIgcGVyaW9kOyAgICAgICAgICAgICAgICAvKnBlcmlvZCBpbiBUVXMgKi8KKwlBX1VJTlQzMiBkdXJhdGlvbjsgICAgICAgICAgICAgIC8qZHVyYXRpb24gaW4gVFVzICovCisJQV9VSU5UMzIgbmV4dF9zdGFydDsgICAgICAgICAgICAvKm9mZnNldCBpbiBUVXMgKi8KKwlBX1VJTlQzMiBlbmFibGVkOyAgICAgICAgICAgICAgIC8qZW5hYmxlL2Rpc2FibGUgKi8KK30gd21pX3BkZXZfc2V0X3F1aWV0X2NtZF9maXhlZF9wYXJhbTsKKworLyoKKyAqIENvbW1hbmQgdG8gZW5hYmxlL2Rpc2FibGUgR3JlZW4gQVAgUG93ZXIgU2F2ZS4KKyAqIFRoaXMgaGVscHMgY29uc2VydmUgcG93ZXIgZHVyaW5nIEFQIG9wZXJhdGlvbi4gV2hlbiB0aGUgQVAgaGFzIG5vCisgKiBzdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZSBob3N0IGNhbiBlbmFibGUgR3JlZW4gQVAgUG93ZXIgU2F2ZQorICogdG8gcmVxdWVzdCB0aGUgZmlybXdhcmUgdG8gc2h1dCBkb3duIGFsbCBidXQgb25lIHRyYW5zbWl0IGFuZCByZWNlaXZlCisgKiBjaGFpbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9ncmVlbl9hcF9wc19lbmFibGVfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgcmVzZXJ2ZWQwOworCS8qKiBwbGFjZWhvbGRlciBmb3IgcGRldl9pZCBvZiBmdXR1cmUgbXVsdGlwbGUgTUFDIHByb2R1Y3RzLiBJbml0LiB0byAwLiAqLworCUFfVUlOVDMyIGVuYWJsZTsgICAgICAgICAgICAgICAgLyoxOmVuYWJsZSwgMDpkaXNhYmxlICovCit9IHdtaV9wZGV2X2dyZWVuX2FwX3BzX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgTUFYX0hUX0lFX0xFTiAzMgordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF9odF9pZV9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiByZXNlcnZlZDA7CisJLyoqIHBsYWNlaG9sZGVyIGZvciBwZGV2X2lkIG9mIGZ1dHVyZSBtdWx0aXBsZSBNQUMgcHJvZHVjdHMuIEluaXQuIHRvIDAuICovCisJQV9VSU5UMzIgaWVfbGVuOyAgICAgICAgICAgICAgICAvKmxlbmd0aCBvZiB0aGUgaHQgaWUgaW4gdGhlIFRMViBpZV9kYXRhW10gKi8KKwlBX1VJTlQzMiB0eF9zdHJlYW1zOyAvKiBUeCBzdHJlYW1zIHN1cHBvcnRlZCBmb3IgdGhpcyBIVCBJRSAqLworCUFfVUlOVDMyIHJ4X3N0cmVhbXM7IC8qIFJ4IHN0cmVhbXMgc3VwcG9ydGVkIGZvciB0aGlzIEhUIElFICovCisJLyoqIFRoZSBUTFYgZm9yIHRoZSBIVCBJRSBmb2xsb3dzOgorCSAqICAgICAgIEFfVUlOVDMyIGllX2RhdGFbXTsKKwkgKi8KK30gd21pX3BkZXZfc2V0X2h0X2llX2NtZF9maXhlZF9wYXJhbTsKKworI2RlZmluZSBNQVhfVkhUX0lFX0xFTiAzMgordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF92aHRfaWVfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgcmVzZXJ2ZWQwOworCS8qKiBwbGFjZWhvbGRlciBmb3IgcGRldl9pZCBvZiBmdXR1cmUgbXVsdGlwbGUgTUFDIHByb2R1Y3RzLiBJbml0LiB0byAwLiAqLworCUFfVUlOVDMyIGllX2xlbjsgICAgICAgICAgICAgICAgLypsZW5ndGggb2YgdGhlIHZodCBpZSBpbiB0aGUgVExWIGllX2RhdGFbXSAqLworCUFfVUlOVDMyIHR4X3N0cmVhbXM7IC8qIFR4IHN0cmVhbXMgc3VwcG9ydGVkIGZvciB0aGlzIEhUIElFICovCisJQV9VSU5UMzIgcnhfc3RyZWFtczsgLyogUnggc3RyZWFtcyBzdXBwb3J0ZWQgZm9yIHRoaXMgSFQgSUUgKi8KKwkvKiogVGhlIFRMViBmb3IgdGhlIFZIVCBJRSBmb2xsb3dzOgorCSAqICAgICAgIEFfVUlOVDMyIGllX2RhdGFbXTsKKwkgKi8KK30gd21pX3BkZXZfc2V0X3ZodF9pZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zZXRfYmFzZV9tYWNhZGRyX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHJlc2VydmVkMDsKKwkvKiogcGxhY2Vob2xkZXIgZm9yIHBkZXZfaWQgb2YgZnV0dXJlIG11bHRpcGxlIE1BQyBwcm9kdWN0cy4gSW5pdC4gdG8gMC4gKi8KKwl3bWlfbWFjX2FkZHIgYmFzZV9tYWNhZGRyOworfSB3bWlfcGRldl9zZXRfYmFzZV9tYWNhZGRyX2NtZF9maXhlZF9wYXJhbTsKKworLyoKKyAqIEZvciBub3csIHRoZSBzcGVjdHJhbCBjb25maWd1cmF0aW9uIGlzIGdsb2JhbCByYXRoZXIgdGhhbgorICogcGVyLXZkZXYuICBUaGUgdmRldiBpcyBhIHBsYWNlaG9sZGVyIGFuZCB3aWxsIGJlIGlnbm9yZWQKKyAqIGJ5IHRoZSBmaXJtd2FyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc3BlY3RyYWxfY29uZmlndXJlX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgc3BlY3RyYWxfc2Nhbl9jb3VudDsKKwlBX1VJTlQzMiBzcGVjdHJhbF9zY2FuX3BlcmlvZDsKKwlBX1VJTlQzMiBzcGVjdHJhbF9zY2FuX3ByaW9yaXR5OworCUFfVUlOVDMyIHNwZWN0cmFsX3NjYW5fZmZ0X3NpemU7CisJQV9VSU5UMzIgc3BlY3RyYWxfc2Nhbl9nY19lbmE7CisJQV9VSU5UMzIgc3BlY3RyYWxfc2Nhbl9yZXN0YXJ0X2VuYTsKKwlBX1VJTlQzMiBzcGVjdHJhbF9zY2FuX25vaXNlX2Zsb29yX3JlZjsKKwlBX1VJTlQzMiBzcGVjdHJhbF9zY2FuX2luaXRfZGVsYXk7CisJQV9VSU5UMzIgc3BlY3RyYWxfc2Nhbl9uYl90b25lX3RocjsKKwlBX1VJTlQzMiBzcGVjdHJhbF9zY2FuX3N0cl9iaW5fdGhyOworCUFfVUlOVDMyIHNwZWN0cmFsX3NjYW5fd2JfcnB0X21vZGU7CisJQV9VSU5UMzIgc3BlY3RyYWxfc2Nhbl9yc3NpX3JwdF9tb2RlOworCUFfVUlOVDMyIHNwZWN0cmFsX3NjYW5fcnNzaV90aHI7CisJQV9VSU5UMzIgc3BlY3RyYWxfc2Nhbl9wd3JfZm9ybWF0OworCUFfVUlOVDMyIHNwZWN0cmFsX3NjYW5fcnB0X21vZGU7CisJQV9VSU5UMzIgc3BlY3RyYWxfc2Nhbl9iaW5fc2NhbGU7CisJQV9VSU5UMzIgc3BlY3RyYWxfc2Nhbl9kQm1fYWRqOworCUFfVUlOVDMyIHNwZWN0cmFsX3NjYW5fY2huX21hc2s7Cit9IHdtaV92ZGV2X3NwZWN0cmFsX2NvbmZpZ3VyZV9jbWRfZml4ZWRfcGFyYW07CisKKy8qCisgKiBFbmFibGluZywgZGlzYWJsaW5nIGFuZCB0cmlnZ2VyaW5nIHRoZSBzcGVjdHJhbCBzY2FuCisgKiBpcyBhIHBlci12ZGV2IG9wZXJhdGlvbi4gIFRoYXQgaXMsIGl0IHdpbGwgc2V0IGNoYW5uZWwKKyAqIGZsYWdzIHBlciB2ZGV2IHJhdGhlciB0aGFuIGdsb2JhbGx5OyBzbyBjb25jdXJyZW50IHNjYW4vcnVuCisgKiBhbmQgbXVsdGlwbGUgU1RBIChlZyBwMnAsIHRkbHMsIG11bHRpLWJhbmQgU1RBKSBpcyBwb3NzaWJsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc3BlY3RyYWxfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyogMCAtIGlnbm9yZTsgMSAtIHRyaWdnZXIsIDIgLSBjbGVhciB0cmlnZ2VyICovCisJQV9VSU5UMzIgdHJpZ2dlcl9jbWQ7CisJLyogMCAtIGlnbm9yZTsgMSAtIGVuYWJsZSwgMiAtIGRpc2FibGUgKi8KKwlBX1VJTlQzMiBlbmFibGVfY21kOworfSB3bWlfdmRldl9zcGVjdHJhbF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCVdNSV9DU0FfSUVfUFJFU0VOVCA9IDB4MDAwMDAwMDEsCisJV01JX1hDU0FfSUVfUFJFU0VOVCA9IDB4MDAwMDAwMDIsCisJV01JX1dCV19JRV9QUkVTRU5UID0gMHgwMDAwMDAwNCwKKwlXTUlfQ1NXQVJQX0lFX1BSRVNFTlQgPSAweDAwMDAwMDA4LAorfSBXTUlfQ1NBX0VWRU5UX0lFU19QUkVTRU5UX0ZMQUc7CisKKy8qIHdtaSBDU0EgcmVjZWl2ZSBldmVudCBmcm9tIGJlYWNvbiBmcmFtZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NzYV9ldmVudF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIGlfZmNfZHVyOworLyogIEJpdCAwLTE1OiBGQyAqLworLyogIEJpdCAxNi0zMTogRFVSICovCisJd21pX21hY19hZGRyIGlfYWRkcjE7CisJd21pX21hY19hZGRyIGlfYWRkcjI7CisJLyogTk9URTogc2l6ZSBvZiBhcnJheSBvZiBjc2FfaWVbXSwgeGNzYV9pZVtdLCBhbmQgd2JfaWVbXSBjYW5ub3QgYmUKKwkgKiBjaGFuZ2VkIGluIHRoZSBmdXR1cmUgd2l0aG91dCBicmVha2luZyBXTUkgY29tcGF0aWJpbGl0eSAqLworCUFfVUlOVDMyIGNzYV9pZVsyXTsKKwlBX1VJTlQzMiB4Y3NhX2llWzJdOworCUFfVUlOVDMyIHdiX2llWzJdOworCUFfVUlOVDMyIGNzd2FycF9pZTsKKwlBX1VJTlQzMiBpZXNfcHJlc2VudF9mbGFnOyAgICAgICAgICAgICAgLyogV01JX0NTQV9FVkVOVF9JRVNfUFJFU0VOVF9GTEFHICovCit9IHdtaV9jc2FfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgZW51bSB7CisJLyoqIFRYIGNoYWluIG1hc2sgKi8KKwlXTUlfUERFVl9QQVJBTV9UWF9DSEFJTl9NQVNLID0gMHgxLAorCS8qKiBSWCBjaGFpbiBtYXNrICovCisJV01JX1BERVZfUEFSQU1fUlhfQ0hBSU5fTUFTSywKKwkvKiogVFggcG93ZXIgbGltaXQgZm9yIDJHIFJhZGlvICovCisJV01JX1BERVZfUEFSQU1fVFhQT1dFUl9MSU1JVDJHLAorCS8qKiBUWCBwb3dlciBsaW1pdCBmb3IgNUcgUmFkaW8gKi8KKwlXTUlfUERFVl9QQVJBTV9UWFBPV0VSX0xJTUlUNUcsCisJLyoqIFRYIHBvd2VyIHNjYWxlICovCisJV01JX1BERVZfUEFSQU1fVFhQT1dFUl9TQ0FMRSwKKwkvKiogQmVhY29uIGdlbmVyYXRpb24gbW9kZSAuIDA6IGhvc3QsIDE6IHRhcmdldCAgICovCisJV01JX1BERVZfUEFSQU1fQkVBQ09OX0dFTl9NT0RFLAorCS8qKiBCZWFjb24gZ2VuZXJhdGlvbiBtb2RlIC4gMDogc3RhZ2dlcmVkIDE6IGJ1cnN0ZWQgICAqLworCVdNSV9QREVWX1BBUkFNX0JFQUNPTl9UWF9NT0RFLAorCS8qKiBSZXNvdXJjZSBtYW5hZ2VyIG9mZiBjaGFuIG1vZGUgLgorCSAqIDA6IHR1cm4gb2ZmIG9mZiBjaGFuIG1vZGUuIDE6IHR1cm4gb24gb2ZmY2hhbiBtb2RlCisJICovCisJV01JX1BERVZfUEFSQU1fUkVTTUdSX09GRkNIQU5fTU9ERSwKKwkvKiogUHJvdGVjdGlvbiBtb2RlICAwOiBubyBwcm90ZWN0aW9uIDE6dXNlIENUUy10by1zZWxmIDI6IHVzZSBSVFMvQ1RTICovCisJV01JX1BERVZfUEFSQU1fUFJPVEVDVElPTl9NT0RFLAorCS8qKiBEeW5hbWljIGJhbmR3aWR0aCAwOiBkaXNhYmxlIDE6IGVuYWJsZSAqLworCVdNSV9QREVWX1BBUkFNX0RZTkFNSUNfQlcsCisJLyoqIE5vbiBhZ2dyZWdyYXRlLyAxMWcgc3cgcmV0cnkgdGhyZXNob2xkLjAtZGlzYWJsZSAqLworCVdNSV9QREVWX1BBUkFNX05PTl9BR0dfU1dfUkVUUllfVEgsCisJLyoqIGFnZ3JlZ3JhdGUgc3cgcmV0cnkgdGhyZXNob2xkLiAwLWRpc2FibGUqLworCVdNSV9QREVWX1BBUkFNX0FHR19TV19SRVRSWV9USCwKKwkvKiogU3RhdGlvbiBraWNrb3V0IHRocmVzaG9sZCAobm9uIG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzKS4wLWRpc2FibGUgKi8KKwlXTUlfUERFVl9QQVJBTV9TVEFfS0lDS09VVF9USCwKKwkvKiogQWdnZXJhdGUgc2l6ZSBzY2FsaW5nIGNvbmZpZ3VyYXRpb24gcGVyIEFDICovCisJV01JX1BERVZfUEFSQU1fQUNfQUdHUlNJWkVfU0NBTElORywKKwkvKiogTFRSIGVuYWJsZSAqLworCVdNSV9QREVWX1BBUkFNX0xUUl9FTkFCTEUsCisJLyoqIExUUiBsYXRlbmN5IGZvciBCRSwgaW4gdXMgKi8KKwlXTUlfUERFVl9QQVJBTV9MVFJfQUNfTEFURU5DWV9CRSwKKwkvKiogTFRSIGxhdGVuY3kgZm9yIEJLLCBpbiB1cyAqLworCVdNSV9QREVWX1BBUkFNX0xUUl9BQ19MQVRFTkNZX0JLLAorCS8qKiBMVFIgbGF0ZW5jeSBmb3IgVkksIGluIHVzICovCisJV01JX1BERVZfUEFSQU1fTFRSX0FDX0xBVEVOQ1lfVkksCisJLyoqIExUUiBsYXRlbmN5IGZvciBWTywgaW4gdXMgICovCisJV01JX1BERVZfUEFSQU1fTFRSX0FDX0xBVEVOQ1lfVk8sCisJLyoqIExUUiBBQyBsYXRlbmN5IHRpbWVvdXQsIGluIG1zICovCisJV01JX1BERVZfUEFSQU1fTFRSX0FDX0xBVEVOQ1lfVElNRU9VVCwKKwkvKiogTFRSIHBsYXRmb3JtIGxhdGVuY3kgb3ZlcnJpZGUsIGluIHVzICovCisJV01JX1BERVZfUEFSQU1fTFRSX1NMRUVQX09WRVJSSURFLAorCS8qKiBMVFItTSBvdmVycmlkZSwgaW4gdXMgKi8KKwlXTUlfUERFVl9QQVJBTV9MVFJfUlhfT1ZFUlJJREUsCisJLyoqIFR4IGFjdGl2aXR5IHRpbWVvdXQgZm9yIExUUiwgaW4gdXMgKi8KKwlXTUlfUERFVl9QQVJBTV9MVFJfVFhfQUNUSVZJVFlfVElNRU9VVCwKKwkvKiogTDFTUyBzdGF0ZSBtYWNoaW5lIGVuYWJsZSAqLworCVdNSV9QREVWX1BBUkFNX0wxU1NfRU5BQkxFLAorCS8qKiBEZWVwIHNsZWVwIHN0YXRlIG1hY2hpbmUgZW5hYmxlICovCisJV01JX1BERVZfUEFSQU1fRFNMRUVQX0VOQUJMRSwKKwkvKiogUlggYnVmZmVyaW5nIGZsdXNoIGVuYWJsZSAqLworCVdNSV9QREVWX1BBUkFNX1BDSUVMUF9UWEJVRl9GTFVTSCwKKwkvKiogUlggYnVmZmVyaW5nIG1hdGVybWFyayAqLworCVdNSV9QREVWX1BBUkFNX1BDSUVMUF9UWEJVRl9XQVRFUk1BUkssCisJLyoqIFJYIGJ1ZmZlcmluZyB0aW1lb3V0IGVuYWJsZSAqLworCVdNSV9QREVWX1BBUkFNX1BDSUVMUF9UWEJVRl9UTU9fRU4sCisJLyoqIFJYIGJ1ZmZlcmluZyB0aW1lb3V0IHZhbHVlICovCisJV01JX1BERVZfUEFSQU1fUENJRUxQX1RYQlVGX1RNT19WQUxVRSwKKwkvKiogcGRldiBsZXZlbCBzdGF0cyB1cGRhdGUgcGVyaW9kIGluIG1zICovCisJV01JX1BERVZfUEFSQU1fUERFVl9TVEFUU19VUERBVEVfUEVSSU9ELAorCS8qKiB2ZGV2IGxldmVsIHN0YXRzIHVwZGF0ZSBwZXJpb2QgaW4gbXMgKi8KKwlXTUlfUERFVl9QQVJBTV9WREVWX1NUQVRTX1VQREFURV9QRVJJT0QsCisJLyoqIHBlZXIgbGV2ZWwgc3RhdHMgdXBkYXRlIHBlcmlvZCBpbiBtcyAqLworCVdNSV9QREVWX1BBUkFNX1BFRVJfU1RBVFNfVVBEQVRFX1BFUklPRCwKKwkvKiogYmVhY29uIGZpbHRlciBzdGF0dXMgdXBkYXRlIHBlcmlvZCAqLworCVdNSV9QREVWX1BBUkFNX0JDTkZMVF9TVEFUU19VUERBVEVfUEVSSU9ELAorCS8qKiBRT1MgTWdtdCBmcmFtZSBwcm90ZWN0aW9uIE1GUC9QTUYgMDogZGlzYWJsZSwgMTogZW5hYmxlICovCisJV01JX1BERVZfUEFSQU1fUE1GX1FPUywKKwkvKiogQWNjZXNzIGNhdGVnb3J5IG9uIHdoaWNoIEFSUCBmcmFtZXMgYXJlIHNlbnQgKi8KKwlXTUlfUERFVl9QQVJBTV9BUlBfQUNfT1ZFUlJJREUsCisJLyoqIERDUyBjb25maWd1cmF0aW9uICovCisJV01JX1BERVZfUEFSQU1fRENTLAorCS8qKiBFbmFibGUvRGlzYWJsZSBBTkkgb24gdGFyZ2V0ICovCisJV01JX1BERVZfUEFSQU1fQU5JX0VOQUJMRSwKKwkvKiogY29uZmlndXJlIHRoZSBBTkkgcG9sbGluZyBwZXJpb2QgKi8KKwlXTUlfUERFVl9QQVJBTV9BTklfUE9MTF9QRVJJT0QsCisJLyoqIGNvbmZpZ3VyZSB0aGUgQU5JIGxpc3RlbmluZyBwZXJpb2QgKi8KKwlXTUlfUERFVl9QQVJBTV9BTklfTElTVEVOX1BFUklPRCwKKwkvKiogY29uZmlndXJlIE9GRE0gaW1tdW5pdHkgbGV2ZWwgKi8KKwlXTUlfUERFVl9QQVJBTV9BTklfT0ZETV9MRVZFTCwKKwkvKiogY29uZmlndXJlIENDSyBpbW11bml0eSBsZXZlbCAqLworCVdNSV9QREVWX1BBUkFNX0FOSV9DQ0tfTEVWRUwsCisJLyoqIEVuYWJsZS9EaXNhYmxlIENERCBmb3IgMXgxIFNUQXMgaW4gcmF0ZSBjb250cm9sIG1vZHVsZSAqLworCVdNSV9QREVWX1BBUkFNX0RZTlRYQ0hBSU4sCisJLyoqIEVuYWJsZS9EaXNhYmxlIHByb3h5IFNUQSAqLworCVdNSV9QREVWX1BBUkFNX1BST1hZX1NUQSwKKwkvKiogRW5hYmxlL0Rpc2FibGUgbG93IHBvd2VyIHN0YXRlIHdoZW4gYWxsIFZERVZzIGFyZSBpbmFjdGl2ZS9pZGxlLiAqLworCVdNSV9QREVWX1BBUkFNX0lETEVfUFNfQ09ORklHLAorCS8qKiBFbmFibGUvRGlzYWJsZSBwb3dlciBnYXRpbmcgc2xlZXAgKi8KKwlXTUlfUERFVl9QQVJBTV9QT1dFUl9HQVRJTkdfU0xFRVAsCisJLyoqIEVuYWJsZS9EaXNhYmxlIFJma2lsbCAqLworCVdNSV9QREVWX1BBUkFNX1JGS0lMTF9FTkFCTEUsCisJLyoqIFNldCBCdXJzdGluZyBEVVIgKi8KKwlXTUlfUERFVl9QQVJBTV9CVVJTVF9EVVIsCisJLyoqIFNldCBCdXJzdGluZyBFTkFCTEUgKi8KKwlXTUlfUERFVl9QQVJBTV9CVVJTVF9FTkFCTEUsCisJLyoqIEhXIHJma2lsbCBjb25maWcgKi8KKwlXTUlfUERFVl9QQVJBTV9IV19SRktJTExfQ09ORklHLAorCS8qKiBFbmFibGUgcmFkaW8gbG93IHBvd2VyIGZlYXR1cmVzICovCisJV01JX1BERVZfUEFSQU1fTE9XX1BPV0VSX1JGX0VOQUJMRSwKKwkvKiogTDFTUyBlbnRyeSBhbmQgcmVzaWRlbmN5IHRpbWUgdHJhY2sgKi8KKwlXTUlfUERFVl9QQVJBTV9MMVNTX1RSQUNLLAorCS8qKiBzZXQgaHlzdCBhdCBydW50aW1lLCByZXF1aXJlbWVudCBmcm9tIFNTICovCisJV01JX1BERVZfUEFSQU1fSFlTVF9FTiwKKwkvKiogRW5hYmxlLyBEaXNhYmxlIFBPV0VSIENPTExBUFNFICovCisJV01JX1BERVZfUEFSQU1fUE9XRVJfQ09MTEFQU0VfRU5BQkxFLAorCS8qKiBjb25maWd1cmUgTEVEIHN5c3RlbSBzdGF0ZSAqLworCVdNSV9QREVWX1BBUkFNX0xFRF9TWVNfU1RBVEUsCisJLyoqIEVuYWJsZS9EaXNhYmxlIExFRCAqLworCVdNSV9QREVWX1BBUkFNX0xFRF9FTkFCTEUsCisJLyoqIHNldCBESVJFQ1QgQVVESU8gdGltZSBsYXRlbmN5ICovCisJV01JX1BERVZfUEFSQU1fQVVESU9fT1ZFUl9XTEFOX0xBVEVOQ1ksCisJLyoqIHNldCBESVJFQ1QgQVVESU8gRmVhdHVyZSBFTkFCTEUgKi8KKwlXTUlfUERFVl9QQVJBTV9BVURJT19PVkVSX1dMQU5fRU5BQkxFLAorCS8qKiBwZGV2IGxldmVsIHdoYWwgbWliIHN0YXRzIHVwZGF0ZSBlbmFibGUgKi8KKwlXTUlfUERFVl9QQVJBTV9XSEFMX01JQl9TVEFUU19VUERBVEVfRU5BQkxFLAorCS8qKiBodC92aHQgaW5mbyBiYXNlZCBvbiB2ZGV2ICovCisJV01JX1BERVZfUEFSQU1fVkRFVl9SQVRFX1NUQVRTX1VQREFURV9QRVJJT0QsCisJLyoqIFNldCBDVFMgY2hhbm5lbCBCVyBmb3IgZHluYW1pYyBCVyBhZGp1c3RtZW50IGZlYXR1cmUgKi8KKwlXTUlfUERFVl9QQVJBTV9DVFNfQ0JXLAorCS8qKiBTZXQgR1BJTyBwaW4gaW5mbyB1c2VkIGJ5IFdOVFMgKi8KKwlXTUlfUERFVl9QQVJBTV9XTlRTX0NPTkZJRywKKwkvKiogRW5hYmxlL0Rpc2FibGUgaGFyZHdhcmUgYWRhcHRpdmUgZWFybHkgcnggZmVhdHVyZSAqLworCVdNSV9QREVWX1BBUkFNX0FEQVBUSVZFX0VBUkxZX1JYX0VOQUJMRSwKKwkvKiogVGhlIG1pbmltdW0gZWFybHkgcnggZHVyYXRpb24sIHRvIGVuc3VyZSBlYXJseSByeCBkdXJhdGlvbiBpcyBub24temVybyAqLworCVdNSV9QREVWX1BBUkFNX0FEQVBUSVZFX0VBUkxZX1JYX01JTl9TTEVFUF9TTE9QLAorCS8qKiBJbmNyZWFzaW5nL2RlY3JlYXNpbmcgc3RlcCB1c2VkIGJ5IGhhcmR3YXJlICovCisJV01JX1BERVZfUEFSQU1fQURBUFRJVkVfRUFSTFlfUlhfSU5DX0RFQ19TVEVQLAorCS8qKiBUaGUgZml4ZWQgZWFybHkgcnggZHVyYXRpb24gd2hlbiBhZGFwdGl2ZSBlYXJseSByeCBpcyBkaXNhYmxlZCAqLworCVdNSV9QREVWX1BBUkFNX0VBUkxZX1JYX0ZJWF9TTEVFUF9TTE9QLAorCS8qKiBFbmFibGUvRGlzYWJsZSBibWlzcyBiYXNlZCBhZGFwdGl2ZSBiZWFjb24gdGltZW91dCBmZWF0dXJlICovCisJV01JX1BERVZfUEFSQU1fQk1JU1NfQkFTRURfQURBUFRJVkVfQlRPX0VOQUJMRSwKKwkvKgorCSAqIFRoZSBtaW5pbXVtIGJlYWNvbiB0aW1lb3V0IGR1cmF0aW9uLCB0byBlbnN1cmUgYmVhY29uIHRpbWVvdXQKKwkgKiBkdXJhdGlvbiBpcyBub24temVybworCSAqLworCVdNSV9QREVWX1BBUkFNX0JNSVNTX0JUT19NSU5fQkNOX1RJTUVPVVQsCisJLyoqIEluY3JlYXNpbmcvZGVjcmVhc2luZyBzdGVwIHVzZWQgYnkgaGFyZHdhcmUgKi8KKwlXTUlfUERFVl9QQVJBTV9CTUlTU19CVE9fSU5DX0RFQ19TVEVQLAorCS8qCisJICogVGhlIGZpeGVkIGJlYWNvbiB0aW1lb3V0IGR1cmF0aW9uIHdoZW4gYm1pc3MgYmFzZWQgYWRhcHRpdmUgYmVhY29uCisJICogdGltZW91dCBpcyBkaXNhYmxlZAorCSAqLworCVdNSV9QREVWX1BBUkFNX0JUT19GSVhfQkNOX1RJTUVPVVQsCisJLyoKKwkgKiBFbmFibGUvRGlzYWJsZSBDb25nZXN0aW9uIEVzdGltYXRvciBiYXNlZCBhZGFwdGl2ZSBiZWFjb24KKwkgKiB0aW1lb3V0IGZlYXR1cmUgKi8KKwlXTUlfUERFVl9QQVJBTV9DRV9CQVNFRF9BREFQVElWRV9CVE9fRU5BQkxFLAorCS8qCisJICogY29tYm8gdmFsdWUgb2YgY2VfaWQsIGNlX3RocmVzaG9sZCwgY2VfdGltZSwgcmVmZXIKKwkgKiB0byBXTUlfQ0VfQlRPX0NFX0lEX01BU0sKKwkgKi8KKwlXTUlfUERFVl9QQVJBTV9DRV9CVE9fQ09NQk9fQ0VfVkFMVUUsCisJLyoqIDJHIFRYIGNoYWluIG1hc2sgKi8KKwlXTUlfUERFVl9QQVJBTV9UWF9DSEFJTl9NQVNLXzJHLAorCS8qKiAyRyBSWCBjaGFpbiBtYXNrICovCisJV01JX1BERVZfUEFSQU1fUlhfQ0hBSU5fTUFTS18yRywKKwkvKiogNUcgVFggY2hhaW4gbWFzayAqLworCVdNSV9QREVWX1BBUkFNX1RYX0NIQUlOX01BU0tfNUcsCisJLyoqIDVHIFJYIGNoYWluIG1hc2sgKi8KKwlXTUlfUERFVl9QQVJBTV9SWF9DSEFJTl9NQVNLXzVHLAorCS8qIFNldCB0eCBjaGFpbiBtYXNrIGZvciBDQ0sgcmF0ZXMgKi8KKwlXTUlfUERFVl9QQVJBTV9UWF9DSEFJTl9NQVNLX0NDSywKKwkvKiBTZXQgdHggY2hhaW4gbWFzayBmb3IgMVNTIHN0cmVhbSAqLworCVdNSV9QREVWX1BBUkFNX1RYX0NIQUlOX01BU0tfMVNTLAorfSBXTUlfUERFVl9QQVJBTTsKKwordHlwZWRlZiBlbnVtIHsKKwkvKiogU2V0IHRoZSBsb2dsZXZlbCAqLworCVdNSV9EQkdMT0dfTE9HX0xFVkVMID0gMHgxLAorCS8qKiBFbmFibGUgVkFQIGxldmVsIGRlYnVnICovCisJV01JX0RCR0xPR19WQVBfRU5BQkxFLAorCS8qKiBEaXNhYmxlIFZBUCBsZXZlbCBkZWJ1ZyAqLworCVdNSV9EQkdMT0dfVkFQX0RJU0FCTEUsCisJLyoqIEVuYWJsZSBNT0RVTEUgbGV2ZWwgZGVidWcgKi8KKwlXTUlfREJHTE9HX01PRFVMRV9FTkFCTEUsCisJLyoqIERpc2FibGUgTU9EVUxFIGxldmVsIGRlYnVnICovCisJV01JX0RCR0xPR19NT0RVTEVfRElTQUJMRSwKKwkvKiogRW5hYmxlIE1PRFVMRSBsZXZlbCBkZWJ1ZyAqLworCVdNSV9EQkdMT0dfTU9EX0xPR19MRVZFTCwKKwkvKiogc2V0IHR5cGUgb2YgdGhlIGRlYnVnIG91dHB1dCAqLworCVdNSV9EQkdMT0dfVFlQRSwKKwkvKiogRW5hYmxlIERpc2FibGUgZGVidWcgKi8KKwlXTUlfREJHTE9HX1JFUE9SVF9FTkFCTEUKK30gV01JX0RCR19QQVJBTTsKKworLyogcGFyYW1fdmFsdWUgZm9yIHBhcmFtX2lkIFdNSV9QREVWX1BBUkFNX0NUU19DQlcgKi8KK3R5cGVkZWYgZW51bSB7CisJV01JX0NUU19DQldfSU5WQUxJRCA9IDAsCisJV01JX0NUU19DQldfMjAsCisJV01JX0NUU19DQldfNDAsCisJV01JX0NUU19DQldfODAsCisJV01JX0NUU19DQldfODBfODAsCisJV01JX0NUU19DQldfMTYwLAorfSBXTUlfQ1RTX0NCVzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiByZXNlcnZlZDA7CisJLyoqIHBsYWNlaG9sZGVyIGZvciBwZGV2X2lkIG9mIGZ1dHVyZSBtdWx0aXBsZSBNQUMgcHJvZHVjdHMuIEluaXQuIHRvIDAuICovCisJLyoqIHBhcmFtZXRlciBpZCAgICovCisJQV9VSU5UMzIgcGFyYW1faWQ7CisJLyoqIHBhcmFtZXRyIHZhbHVlICovCisJQV9VSU5UMzIgcGFyYW1fdmFsdWU7Cit9IHdtaV9wZGV2X3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9nZXRfdHBjX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiByZXNlcnZlZDA7CisJLyoqIHBsYWNlaG9sZGVyIGZvciBwZGV2X2lkIG9mIGZ1dHVyZSBtdWx0aXBsZSBNQUMgcHJvZHVjdHMuIEluaXQuIHRvIDAuICovCisJLyoqIHBhcmFtZXRlciAgICovCisJQV9VSU5UMzIgcGFyYW07Cit9IHdtaV9wZGV2X2dldF90cGNfY29uZmlnX2NtZF9maXhlZF9wYXJhbTsKKworI2RlZmluZSBXTUlfRkFTVF9ESVZFUlNJVFlfQklUX09GRlNFVCAwCisjZGVmaW5lIFdNSV9TTE9XX0RJVkVSU0lUWV9CSVRfT0ZGU0VUIDEKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7IC8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zZXRfYW50ZW5uYV9kaXZlcnNpdHlfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgbWFjX2lkOyAvKiogcGxhY2Vob2xkZXIgZm9yIHBkZXZfaWQgb2YgZnV0dXJlIG11bHRpcGxlIE1BQyBwcm9kdWN0cy4gSW5pdC4gdG8gMC4gKi8KKwkvKiogcGFyYW1ldGVyICAgKi8KKwlBX1VJTlQzMiB2YWx1ZTsgICAgICAvKiogYml0MCBpcyBmb3IgZW5hYmxlL2Rpc2FibGUgRkFTVCBkaXZlcnNpdHksIGFuZCBiaXQxIGlzIGZvciBlbmFibGUvZGlzYWJsZSBTTE9XIGRpdmVyc2l0eSwgMC0+ZGlzYWJsZSwgMS0+ZW5hYmxlICovCit9IHdtaV9wZGV2X3NldF9hbnRlbm5hX2RpdmVyc2l0eV9jbWRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX01BWF9SU1NJX1RIUkVTSE9MRF9TVVBQT1JURUQgMworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoKKwkgKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yc3NpX2JyZWFjaF9tb25pdG9yX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0KKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qIHZkZXZfaWQsIHdoZXJlIFJTU0kgbW9uaXRvcmluZyB3aWxsIHRha2UgcGxhY2UgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qCisJICogaG9zdCB3aWxsIGNvbmZpZ3VyZSByZXF1ZXN0X2lkIGFuZCBmaXJtd2FyZSBlY2hvCisJICogdGhpcyBpZCBpbiBSU1NJX0JSRUFDSF9FVkVOVAorCSAqLworCUFfVUlOVDMyIHJlcXVlc3RfaWQ7CisJLyoKKwkgKiBiaXQgWzAtMl0gPSBsb3dfcnNzaV9icmVhY2hfZW5hYmxlZFswLTJdCisJICogZW5hYmxlZCwgYml0IFszLTVdID0gaGlfcnNzaV9icmVhY2hfZW5hYmxlZFswLTJdCisJICovCisJQV9VSU5UMzIgZW5hYmxlZF9iaXRtYXA7CisJLyogdW5pdCBkQm0uIGhvc3QgZHJpdmVyIHRvIG1ha2Ugc3VyZSBbMF0gPiBbMV0gPiBbMl0gKi8KKwlBX1VJTlQzMiBsb3dfcnNzaV9icmVhY2hfdGhyZXNob2xkW1dNSV9NQVhfUlNTSV9USFJFU0hPTERfU1VQUE9SVEVEXTsKKwkvKiB1bml0IGRCbS4gaG9zdCBkcml2ZXIgdG8gbWFrZSBzdXJlIFswXSA8IFsxXSA8IFsyXSAqLworCUFfVUlOVDMyIGhpX3Jzc2lfYnJlYWNoX3RocmVzaG9sZFtXTUlfTUFYX1JTU0lfVEhSRVNIT0xEX1NVUFBPUlRFRF07CisJLyoKKwkgKiB1bml0IGRCbS4gb25jZSBsb3cgcnNzaVtdIGJyZWFjaGVkLCBzYW1lIGV2ZW50CisJICogYml0bWFwIHdpbGwgYmUgZ2VuZXJhdGVkIG9ubHkgYWZ0ZXIgc2lnbmFsIGdldHMgYmV0dGVyCisJICogdGhhbiB0aGlzIGxldmVsLiBUaGlzIHZhbHVlIGlzIGFkb3B0ZWQgZm9yIGFsbCBsb3dfcnNzaV9icmVhY2hfdGhyZXNob2xkWzNdCisJICovCisJQV9VSU5UMzIgbG9fcnNzaV9yZWVuYWJsZV9oeXN0ZXJlc2lzOworCS8qCisJICogdW5pdCBkQm0uIG9uY2UgaGkgcnNzaVtdIGJyZWFjaGVkLCBzYW1lIGV2ZW50IGJpdG1hcAorCSAqIHdpbGwgYmUgZ2VuZXJhdGVkIG9ubHkgYWZ0ZXIgc2lnbmFsIGdldHMgd29yc2UgdGhhbiB0aGlzCisJICogbGV2ZWwuIFRoaXMgdmFsdWUgaXMgYWRvcHRlZCBmb3IgYWxsIGhpX3Jzc2lfYnJlYWNoX3RocmVzaG9sZFszXQorCSAqLworCUFfVUlOVDMyIGhpX3Jzc2lfcmVlbmFibGVfaGlzdGVyZXNpczsKKwkvKgorCSAqIEFmdGVyIGxhc3QgZXZlbnQgaXMgZ2VuZXJhdGVkLCB3ZSB3YWl0CisJICogdW50aWwgdGhpcyBpbnRlcnZhbCB0byBnZW5lcmF0ZSBuZXh0IGV2ZW50CisJICovCisJQV9VSU5UMzIgbWluX3JlcG9ydF9pbnRlcnZhbDsKKwkvKiB0aGlzIGlzIHRvIHN1cHByZXNzIG51bWJlciBvZiBldmVudCB0byBiZSBnZW5lcmF0ZWQgKi8KKwlBX1VJTlQzMiBtYXhfbnVtX3JlcG9ydDsKK30gd21pX3Jzc2lfYnJlYWNoX21vbml0b3JfY29uZmlnX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIHBhcmFtZXRlciAgICovCisJQV9VSU5UMzIgcGFyYW07Cit9IHdtaV9wZGV2X2R1bXBfY21kOworCit0eXBlZGVmIGVudW0geworCVBBVVNFX1RZUEVfQ0hPUCA9IDB4MSwKKwkvKiogZm9yIE1DQyAoc3dpdGNoIGNoYW5uZWwpLCBvbmx5IHZkZXZfbWFwIGlzIHZhbGlkICovCisJUEFVU0VfVFlQRV9QUyA9IDB4MiwgICAgICAgICAvKiogZm9yIHBlZXIgc3RhdGlvbiBzbGVlcCBpbiBzYXAgbW9kZSwgb25seSBwZWVyX2lkIGlzIHZhbGlkICovCisJUEFVU0VfVFlQRV9VQVBTRCA9IDB4MywKKwkvKiogZm9yIHVhcHNkLCBvbmx5IHBlZXJfaWQgYW5kIHRpZF9tYXAgYXJlIHZhbGlkLiAqLworCVBBVVNFX1RZUEVfUDJQX0NMSUVOVF9OT0EgPSAweDQsCisJLyoqIG9ubHkgdmRldl9tYXAgaXMgdmFsaWQsIGFjdHVhbGx5IG9ubHkgb25lIHZkZXYgaWQgaXMgc2V0IGF0IG9uZSB0aW1lICovCisJUEFVU0VfVFlQRV9QMlBfR09fUFMgPSAweDUsCisJLyoqIG9ubHkgdmRldl9tYXAgaXMgdmFsaWQsIGFjdHVhbGx5IG9ubHkgb25lIHZkZXYgaWQgaXMgc2V0IGF0IG9uZSB0aW1lICovCisJUEFVU0VfVFlQRV9TVEFfQUREX0JBID0gMHg2LAorCS8qKiBvbmx5IHBlZXJfaWQgYW5kIHRpZF9tYXAgYXJlIHZhbGlkLCBhY3R1YWxseSBvbmx5IG9uZSB0aWQgaXMgc2V0IGF0IG9uZSB0aW1lICovCisJUEFVU0VfVFlQRV9BUF9QUyA9IDB4NywKKwkvKiogZm9yIHBhdXNpbmcgQVAgdmRldiB3aGVuIGFsbCB0aGUgY29ubmVjdGVkIGNsaWVudHMgYXJlIGluIFBTLiBvbmx5IHZkZXZfbWFwIGlzIHZhbGlkICovCisJUEFVU0VfVFlQRV9JQlNTX1BTID0gMHg4LAorCS8qKiBmb3IgcGF1c2luZyBJQlNTIHZkZXYgd2hlbiBhbGwgdGhlIHBlZXJzIGFyZSBpbiBQUy4gb25seSB2ZGV2X21hcCBpcyB2YWxpZCAqLworCVBBVVNFX1RZUEVfSE9TVCA9IDB4MTUsCisJLyoqIGhvc3QgaXMgcmVxdWVzdGluZyB2ZGV2IHBhdXNlICovCit9IHdtaV90eF9wYXVzZV90eXBlOworCit0eXBlZGVmIGVudW0geworCUFDVElPTl9QQVVTRSA9IDB4MCwKKwlBQ1RJT05fVU5QQVVTRSA9IDB4MSwKK30gd21pX3R4X3BhdXNlX2FjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgcGF1c2VfdHlwZTsKKwlBX1VJTlQzMiBhY3Rpb247CisJQV9VSU5UMzIgdmRldl9tYXA7CisJQV9VSU5UMzIgcGVlcl9pZDsKKwlBX1VJTlQzMiB0aWRfbWFwOworfSB3bWlfdHhfcGF1c2VfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgZW51bSB7CisJV01JX01HTVRfVFhfQ09NUF9UWVBFX0NPTVBMRVRFX09LID0gMCwKKwlXTUlfTUdNVF9UWF9DT01QX1RZUEVfRElTQ0FSRCwKKwlXTUlfTUdNVF9UWF9DT01QX1RZUEVfSU5TUEVDVCwKKwlXTUlfTUdNVF9UWF9DT01QX1RZUEVfQ09NUExFVEVfTk9fQUNLLAorCVdNSV9NR01UX1RYX0NPTVBfVFlQRV9NQVgsCit9IFdNSV9NR01UX1RYX0NPTVBfU1RBVFVTX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiAgICB0bHZfaGVhZGVyOworCUFfVUlOVDMyICAgIGRlc2NfaWQ7IC8qIGZyb20gdHhfc2VuZF9jbWQgKi8KKwlBX1VJTlQzMiAgICBzdGF0dXM7ICAvKiBXTUlfTUdNVF9UWF9DT01QX1NUQVRVU19UWVBFICovCit9IHdtaV9tZ210X3R4X2NvbXBsX2V2ZW50X2ZpeGVkX3BhcmFtOworCisjZGVmaW5lIFdNSV9UUENfUkFURV9NQVggICAgICAgICAgICAxNjAKKy8qIFdNSV9UUENfVFhfTlVNX0NIQUlOIG1hY3JvIGNhbid0IGJlIGNoYW5nZWQgd2l0aG91dCBicmVha2luZyB0aGUgV01JIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgV01JX1RQQ19UWF9OVU1fQ0hBSU4gICAgICAgIDQKKwordHlwZWRlZiBlbnVtIHsKKwlXTUlfVFBDX0NPTkZJR19FVkVOVF9GTEFHX1RBQkxFX0NERCA9IDB4MSwKKwlXTUlfVFBDX0NPTkZJR19FVkVOVF9GTEFHX1RBQkxFX1NUQkMgPSAweDIsCisJV01JX1RQQ19DT05GSUdfRVZFTlRfRkxBR19UQUJMRV9UWEJGID0gMHg0LAorfSBXTUlfVFBDX0NPTkZJR19FVkVOVF9GTEFHOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl90cGNfY29uZmlnX2V2ZW50X2ZpeGVkX3BhcmFtICAqLworCUFfVUlOVDMyIHJlZ0RvbWFpbjsKKwlBX1VJTlQzMiBjaGFuRnJlcTsKKwlBX1VJTlQzMiBwaHlNb2RlOworCUFfVUlOVDMyIHR3aWNlQW50ZW5uYVJlZHVjdGlvbjsKKwlBX1VJTlQzMiB0d2ljZU1heFJEUG93ZXI7CisJQV9JTlQzMiB0d2ljZUFudGVubmFHYWluOworCUFfVUlOVDMyIHBvd2VyTGltaXQ7CisJQV9VSU5UMzIgcmF0ZU1heDsKKwlBX1VJTlQzMiBudW1UeENoYWluOworCUFfVUlOVDMyIGN0bDsKKwlBX1VJTlQzMiBmbGFnczsKKwkvKiBXTUlfVFBDX1RYX05VTV9DSEFJTiBtYWNybyBjYW4ndCBiZSBjaGFuZ2VkIHdpdGhvdXQgYnJlYWtpbmcgdGhlIFdNSSBjb21wYXRpYmlsaXR5ICovCisJQV9JTlQ4IG1heFJlZ0FsbG93ZWRQb3dlcltXTUlfVFBDX1RYX05VTV9DSEFJTl07CisJQV9JTlQ4CisJCW1heFJlZ0FsbG93ZWRQb3dlckFHQ0REW1dNSV9UUENfVFhfTlVNX0NIQUlOXQorCVtXTUlfVFBDX1RYX05VTV9DSEFJTl07CisJQV9JTlQ4CisJCW1heFJlZ0FsbG93ZWRQb3dlckFHU1RCQ1tXTUlfVFBDX1RYX05VTV9DSEFJTl0KKwlbV01JX1RQQ19UWF9OVU1fQ0hBSU5dOworCUFfSU5UOAorCQltYXhSZWdBbGxvd2VkUG93ZXJBR1RYQkZbV01JX1RQQ19UWF9OVU1fQ0hBSU5dCisJW1dNSV9UUENfVFhfTlVNX0NIQUlOXTsKKwkvKiBUaGlzIFRMViBpcyBmb2xsb3dlZCBieSBhIGJ5dGUgYXJyYXk6CisJICogICAgICBBX1VJTlQ4IHJhdGVzQXJyYXlbXTsKKwkgKi8KK30gd21pX3BkZXZfdHBjX2NvbmZpZ19ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfbDFzc190cmFja19ldmVudF9maXhlZF9wYXJhbSAgKi8KKwlBX1VJTlQzMiBwZXJpb2RDbnQ7CisJQV9VSU5UMzIgTDFDbnQ7CisJQV9VSU5UMzIgTDExQ250OworCUFfVUlOVDMyIEwxMkNudDsKKwlBX1VJTlQzMiBMMUVudHJ5OworCUFfVUlOVDMyIEwxMUVudHJ5OworCUFfVUlOVDMyIEwxMkVudHJ5OworfSB3bWlfcGRldl9sMXNzX3RyYWNrX2V2ZW50X2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgbGVuOworCUFfVUlOVDMyIG1zZ3JlZjsKKwlBX1VJTlQzMiBzZWdtZW50SW5mbzsKK30gd21pX3BkZXZfc2VnX2hkcl9pbmZvOworCisvKgorICogVHJhbnNtaXQgcG93ZXIgc2NhbGUgZmFjdG9yLgorICoKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlXTUlfVFBfU0NBTEVfTUFYID0gMCwgICAgICAgICAgIC8qIG5vIHNjYWxpbmcgKGRlZmF1bHQpICovCisJV01JX1RQX1NDQUxFXzUwID0gMSwgICAgICAgICAgICAvKiA1MCUgb2YgbWF4ICgtMyBkQm0pICovCisJV01JX1RQX1NDQUxFXzI1ID0gMiwgICAgICAgICAgICAvKiAyNSUgb2YgbWF4ICgtNiBkQm0pICovCisJV01JX1RQX1NDQUxFXzEyID0gMywgICAgICAgICAgICAvKiAxMiUgb2YgbWF4ICgtOSBkQm0pICovCisJV01JX1RQX1NDQUxFX01JTiA9IDQsICAgICAgICAgICAvKiBtaW4sIGJ1dCBzdGlsbCBvbiAgICovCisJV01JX1RQX1NDQUxFX1NJWkUgPSA1LCAgICAgICAgICAvKiBtYXggbnVtIG9mIGVudW0gICAgICovCit9IFdNSV9UUF9TQ0FMRTsKKworI2RlZmluZSBXTUlfTUFYX0RFQlVHX01FU0cgKHNpemVvZihBX1VJTlQzMikgKiAzMikKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBtZXNzYWdlIGJ1ZmZlciwgTlVMTCB0ZXJtaW5hdGVkICovCisJY2hhciBidWZwW1dNSV9NQVhfREVCVUdfTUVTR107Cit9IHdtaV9kZWJ1Z19tZXNnX2V2ZW50OworCitlbnVtIHsKKwkvKiogSUJTUyBzdGF0aW9uICovCisJVkRFVl9UWVBFX0lCU1MgPSAwLAorCS8qKiBpbmZyYSBTVEEgKi8KKwlWREVWX1RZUEVfU1RBID0gMSwKKwkvKiogaW5mcmEgQVAgKi8KKwlWREVWX1RZUEVfQVAgPSAyLAorCS8qKiBNb25pdG9yICovCisJVkRFVl9UWVBFX01PTklUT1IgPSAzLAorCS8qKiBPQ0IgKi8KKwlWREVWX1RZUEVfT0NCID0gNiwKK307CisKK2VudW0geworCS8qKiBQMlAgZGV2aWNlICovCisJVkRFVl9TVUJUWVBFX1AyUERFViA9IDAsCisJLyoqIFAyUCBjbGllbnQgKi8KKwlWREVWX1NVQlRZUEVfUDJQQ0xJLAorCS8qKiBQMlAgR08gKi8KKwlWREVWX1NVQlRZUEVfUDJQR08sCisJLyoqIEJUMy4wIEhTICovCisJVkRFVl9TVUJUWVBFX0JULAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBpZG5vcmUgcG93ZXIgLCBvbmx5IHVzZSBmbGFncyAsIG1vZGUgYW5kIGZyZXEgKi8KKwl3bWlfY2hhbm5lbCBjaGFuOworfSB3bWlfcGRldl9zZXRfY2hhbm5lbF9jbWQ7CisKK3R5cGVkZWYgZW51bSB7CisJV01JX1BLVExPR19FVkVOVF9SWCA9IDB4MSwKKwlXTUlfUEtUTE9HX0VWRU5UX1RYID0gMHgyLAorCVdNSV9QS1RMT0dfRVZFTlRfUkNGID0gMHg0LCAgICAgICAgICAgICAvKiBSYXRlIENvbnRyb2wgRmluZCAqLworCVdNSV9QS1RMT0dfRVZFTlRfUkNVID0gMHg4LCAgICAgICAgICAgICAvKiBSYXRlIENvbnRyb2wgVXBkYXRlICovCisJLyogMHgxMCB1c2VkIGJ5IGRlcHJlY2F0ZWQgREJHX1BSSU5UICovCisJV01JX1BLVExPR19FVkVOVF9TTUFSVF9BTlRFTk5BID0gMHgyMCwgLyogVG8gc3VwcG9ydCBTbWFydCBBbnRlbm5hICovCit9IFdNSV9QS1RMT0dfRVZFTlQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9wa3Rsb2dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHJlc2VydmVkMDsKKwkvKiogcGxhY2Vob2xkZXIgZm9yIHBkZXZfaWQgb2YgZnV0dXJlIG11bHRpcGxlIE1BQyBwcm9kdWN0cy4gSW5pdC4gdG8gMC4gKi8KKwlXTUlfUEtUTE9HX0VWRU5UIGV2bGlzdDsKK30gd21pX3BkZXZfcGt0bG9nX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9wa3Rsb2dfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiByZXNlcnZlZDA7Cit9IHdtaV9wZGV2X3BrdGxvZ19kaXNhYmxlX2NtZF9maXhlZF9wYXJhbTsKKworLyoqIEN1c3RvbWl6ZSB0aGUgRFNDUCAoYml0KSB0byBUSUQgKDAtNykgbWFwcGluZyBmb3IgUU9TLgorICogIE5PVEU6IFRoaXMgY29uc3RhbnQgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dCBicmVha2luZworICogIFdNSSBDb21wYXRpYmlsaXR5LiAqLworCisjZGVmaW5lIFdNSV9EU0NQX01BUF9NQVggICAgKDY0KQorLyoKKyAqIEBicmllZiBkc2NwX3RpZF9tYXBfY21kaWQgLSBjb21tYW5kIHRvIHNlbmQgdGhlIGRzY3AgdG8gdGlkIG1hcCB0byB0aGUgdGFyZ2V0CisgKiBAZGV0YWlscworICogQ3JlYXRlIGFuIEFQSSBmb3Igc2VuZGluZyB0aGUgY3VzdG9tIERTQ1AtdG8tVElEIG1hcCB0byB0aGUgdGFyZ2V0CisgKiBJZiB0aGlzIGlzIGEgcmVxdWVzdCBmcm9tIHRoZSB1c2VyIHNwYWNlIG9yIGZyb20gYWJvdmUgdGhlIFVNQUMKKyAqIHRoZW4gdGhlIGJlc3QgcGxhY2UgdG8gaW1wbGVtZW50IHRoaXMgaXMgaW4gdGhlIHVtYWNfaWZfb2ZmbG9hZCBvZiB0aGUgT0wgcGF0aC4KKyAqIFByb3ZpZGUgYSBwbGFjZSBob2xkZXIgZm9yIHRoaXMgQVBJIGluIHRoZSBpZWVlODAyMTFjb20gKGljKS4KKyAqCisgKiBUaGlzIEFQSSB3aWxsIGJlIGEgZnVuY3Rpb24gcG9pbnRlciBpbiB0aGUgaWVlZTgwMjExY29tIChpYykuIEFueSB1c2VyIHNwYWNlIGNhbGxzIGZvciBtYW51YWxseSBzZXR0aW5nIHRoZSBEU0NQLXRvLVRJRCBtYXBwaW5nCisgKiBpbiB0aGUgdGFyZ2V0IHNob3VsZCBiZSBkaXJlY3RlZCB0byB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbiB0aGUgaWMuCisgKgorICogSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiB0aGUgQVBJIHRvIHNlbmQgdGhlIG1hcCB0byB0aGUgdGFyZ2V0IGFyZSBhcyBkZXNjcmliZWQtCisgKgorICogMS4gVGhlIGZ1bmN0aW9uIHdpbGwgaGF2ZSAyIGFyZ3VtZW50cy0gc3RydWN0IGllZWU4MDIxMWNvbSwgRFNDUC10by1USUQgbWFwLgorICogICAgRFNDUC10by1USUQgbWFwIGlzIGEgb25lIGRpbWVuc2lvbmFsIHVpbnQzMl90IGFycmF5IG9mIGxlbmd0aCA2NCB0byBhY2NvbW9kYXRlCisgKiAgICA2NCBUSUQgdmFsdWVzIGZvciAyXjYgKDY0KSBEU0NQIGlkcy4KKyAqICAgIEV4YW1wbGU6CisgKiAgICAgIEFfVUlOVDMyIGRzY3BfdGlkX21hcFtXTUlfRFNDUF9NQVBfTUFYXSA9IHsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMywgMywgMywgMywgMywgMywgMywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgNywgNywgNywgNywgNywgNywgNywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAqCisgKiAyLiBSZXF1ZXN0IGZvciB0aGUgV01JIGJ1ZmZlciBvZiBzaXplIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBEU0NQLXRvLVRJRCBtYXAuCisgKgorICogMy4gQ29weSB0aGUgRFNDUC10by1USUQgbWFwIGludG8gdGhlIFdNSSBidWZmZXIuCisgKgorICogNC4gSW52b2tlIHRoZSB3bWlfdW5pZmllZF9jbWRfc2VuZCB0byBzZW5kIHRoZSBjbWQgYnVmZmVyIHRvIHRoZSB0YXJnZXQgd2l0aCB0aGUKKyAqICAgIFdNSV9QREVWX1NFVF9EU0NQX1RJRF9NQVBfQ01ESUQuIEFyZ3VtZW50cyB0byB0aGUgd21pIHNlbmQgY21kIEFQSQorICogICAgKHdtaV91bmlmaWVkX3NlbmRfY21kKSBhcmUgd21pIGhhbmRsZSwgY21kIGJ1ZmZlciwgbGVuZ3RoIG9mIHRoZSBjbWQgYnVmZmVyIGFuZAorICogICAgdGhlIFdNSV9QREVWX1NFVF9EU0NQX1RJRF9NQVBfQ01ESUQgaWQuCisgKgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfc2V0X2RzY3BfdGlkX21hcF9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiByZXNlcnZlZDA7CisJLyoqIHBsYWNlaG9sZGVyIGZvciBwZGV2X2lkIG9mIGZ1dHVyZSBtdWx0aXBsZSBNQUMgcHJvZHVjdHMuIEluaXQuIHRvIDAuICovCisJLyogbWFwIGluZGljYXRpbmcgRFNDUCB0byBUSUQgY29udmVyc2lvbiAqLworCUFfVUlOVDMyIGRzY3BfdG9fdGlkX21hcFtXTUlfRFNDUF9NQVBfTUFYXTsKK30gd21pX3BkZXZfc2V0X2RzY3BfdGlkX21hcF9jbWRfZml4ZWRfcGFyYW07CisKKy8qKiBGaXhlZCByYXRlIChyYXRlLWNvZGUpIGZvciBicm9hZGNhc3QvIG11bHRpY2FzdCBkYXRhIGZyYW1lcyAqLworLyogQGJyaWVmIGJjYXN0X21jYXN0X2RhdGFfcmF0ZSAtIHNldCB0aGUgcmF0ZXMgZm9yIHRoZSBiY2FzdC8gbWNhc3QgZnJhbWVzCisgKiBAZGV0YWlscworICogQ3JlYXRlIGFuIEFQSSBmb3Igc2V0dGluZyB0aGUgY3VzdG9tIHJhdGUgZm9yIHRoZSBNQ0FTVCBhbmQgQkNBU1QgZnJhbWVzCisgKiBpbiB0aGUgdGFyZ2V0LiBJZiB0aGlzIGlzIGEgcmVxdWVzdCBmcm9tIHRoZSB1c2VyIHNwYWNlIG9yIGZyb20gYWJvdmUgdGhlIFVNQUMKKyAqIHRoZW4gdGhlIGJlc3QgcGxhY2UgdG8gaW1wbGVtZW50IHRoaXMgaXMgaW4gdGhlIHVtYWNfaWZfb2ZmbG9hZCBvZiB0aGUgT0wgcGF0aC4KKyAqIFByb3ZpZGUgYSBwbGFjZSBob2xkZXIgZm9yIHRoaXMgQVBJIGluIHRoZSBpZWVlODAyMTFjb20gKGljKS4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHRoZSBBUEkgdG8gc2V0IGN1c3RvbSByYXRlcyBmb3IgTUNBU1QgYW5kIEJDQVNUIGluCisgKiB0aGUgdGFyZ2V0IGFyZSBhcyBkZXNjcmliZWQtCisgKgorICogMS4gVGhlIGZ1bmN0aW9uIHdpbGwgaGF2ZSAzIGFyZ3VtZW50cy0KKyAqICAgIHZhcCBzdHJ1Y3R1cmUsCisgKiAgICBNQ0FTVC8gQkNBU1QgaWRlbnRpZmllciBjb2RlLAorICogICAgOCBiaXQgcmF0ZSBjb2RlCisgKgorICogVGhlIHJhdGUtY29kZSBpcyBhIDEtYnl0ZSBmaWVsZCBpbiB3aGljaDpmb3IgZ2l2ZW4gcmF0ZSwgbnNzIGFuZCBwcmVhbWJsZQorICogYic3LWItNiBpbmRpY2F0ZSB0aGUgcHJlYW1ibGUgKDAgT0ZETSwgMSBDQ0ssIDIsIEhULCAzIFZIVCkKKyAqIGInNS1iJzQgaW5kaWNhdGUgdGhlIE5TUyAoMCAtIDF4MSwgMSAtIDJ4MiwgMiAtIDN4MykKKyAqIGInMy1iJzAgaW5kaWNhdGUgdGhlIHJhdGUsIHdoaWNoIGlzIGluZGljYXRlZCBhcyBmb2xsb3dzOgorICogICAgICAgICAgT0ZETSA6ICAgICAwOiBPRkRNIDQ4IE1icHMKKyAqICAgICAgICAgICAgICAgICAgICAgMTogT0ZETSAyNCBNYnBzCisgKiAgICAgICAgICAgICAgICAgICAgIDI6IE9GRE0gMTIgTWJwcworICogICAgICAgICAgICAgICAgICAgICAzOiBPRkRNIDYgTWJwcworICogICAgICAgICAgICAgICAgICAgICA0OiBPRkRNIDU0IE1icHMKKyAqICAgICAgICAgICAgICAgICAgICAgNTogT0ZETSAzNiBNYnBzCisgKiAgICAgICAgICAgICAgICAgICAgIDY6IE9GRE0gMTggTWJwcworICogICAgICAgICAgICAgICAgICAgICA3OiBPRkRNIDkgTWJwcworICogICAgICAgICBDQ0sgKHByZWFtID09IDEpCisgKiAgICAgICAgICAgICAgICAgICAgIDA6IENDSyAxMSBNYnBzIExvbmcKKyAqICAgICAgICAgICAgICAgICAgICAgMTogQ0NLIDUuNSBNYnBzIExvbmcKKyAqICAgICAgICAgICAgICAgICAgICAgMjogQ0NLIDIgTWJwcyBMb25nCisgKiAgICAgICAgICAgICAgICAgICAgIDM6IENDSyAxIE1icHMgTG9uZworICogICAgICAgICAgICAgICAgICAgICA0OiBDQ0sgMTEgTWJwcyBTaG9ydAorICogICAgICAgICAgICAgICAgICAgICA1OiBDQ0sgNS41IE1icHMgU2hvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgNjogQ0NLIDIgTWJwcyBTaG9ydAorICogICAgICAgICBIVC9WSFQgKHByZWFtID09IDIvMykKKyAqICAgICAgICAgICAgICAgICAgICAgMC4uNzogTUNTMC4uTUNTNyAoSFQpCisgKiAgICAgICAgICAgICAgICAgICAgIDAuLjk6IE1DUzAuLk1DUzkgKFZIVCkKKyAqCisgKiAyLiBJbnZva2UgdGhlIHdtaV91bmlmaWVkX3ZkZXZfc2V0X3BhcmFtX3NlbmQgdG8gc2VuZCB0aGUgcmF0ZSB2YWx1ZQorICogICAgdG8gdGhlIHRhcmdldC4KKyAqICAgIEFyZ3VtZW50cyB0byB0aGUgQVBJIGFyZS0KKyAqICAgIHdtaSBoYW5kbGUsCisgKiAgICBWQVAgaW50ZXJmYWNlIGlkIChhdl9pZl9pZCkgZGVmaW5lZCBpbiBvbF9hdGhfdmFwX25ldDgwMjExLAorICogICAgV01JX1ZERVZfUEFSQU1fQkNBU1RfREFUQV9SQVRFLyBXTUlfVkRFVl9QQVJBTV9NQ0FTVF9EQVRBX1JBVEUsCisgKiAgICByYXRlIHZhbHVlLgorICovCit0eXBlZGVmIGVudW0geworCVdNSV9TRVRfTUNBU1RfUkFURSwKKwlXTUlfU0VUX0JDQVNUX1JBVEUKK30gTUNBU1RfQkNBU1RfUkFURV9JRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCU1DQVNUX0JDQVNUX1JBVEVfSUQgcmF0ZV9pZDsKKwlBX1VJTlQzMiByYXRlOworfSBtY2FzdF9iY2FzdF9yYXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3dtbV9wYXJhbXMgKi8KKwlBX1VJTlQzMiBjd21pbjsKKwlBX1VJTlQzMiBjd21heDsKKwlBX1VJTlQzMiBhaWZzOworCUFfVUlOVDMyIHR4b3BsaW1pdDsKKwlBX1VJTlQzMiBhY207CisJQV9VSU5UMzIgbm9fYWNrOworfSB3bWlfd21tX3BhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3NldF93bW1fcGFyYW1zX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHJlc2VydmVkMDsKKwkvKiogcGxhY2Vob2xkZXIgZm9yIHBkZXZfaWQgb2YgZnV0dXJlIG11bHRpcGxlIE1BQyBwcm9kdWN0cy4gSW5pdC4gdG8gMC4gKi8KKwlBX1VJTlQzMiBkZ190eXBlOworCisJLyogVGhlIFRMVnMgZm9yIHRoZSA0IEFDIGZvbGxvd3M6CisJICogICAgIHdtaV93bW1fcGFyYW1zIHdtbV9wYXJhbXNfYWNfYmU7CisJICogICAgIHdtaV93bW1fcGFyYW1zIHdtbV9wYXJhbXNfYWNfYms7CisJICogICAgIHdtaV93bW1fcGFyYW1zIHdtbV9wYXJhbXNfYWNfdmk7CisJICogICAgIHdtaV93bW1fcGFyYW1zIHdtbV9wYXJhbXNfYWNfdm87CisJICovCit9IHdtaV9wZGV2X3NldF93bW1fcGFyYW1zX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBlbnVtIHsKKwlXTUlfUkVRVUVTVF9QRUVSX1NUQVQgPSAweDAxLAorCVdNSV9SRVFVRVNUX0FQX1NUQVQgPSAweDAyLAorCVdNSV9SRVFVRVNUX1BERVZfU1RBVCA9IDB4MDQsCisJV01JX1JFUVVFU1RfVkRFVl9TVEFUID0gMHgwOCwKKwlXTUlfUkVRVUVTVF9CQ05GTFRfU1RBVCA9IDB4MTAsCisJV01JX1JFUVVFU1RfVkRFVl9SQVRFX1NUQVQgPSAweDIwLAorfSB3bWlfc3RhdHNfaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yZXF1ZXN0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqLworCXdtaV9zdGF0c19pZCBzdGF0c19pZDsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHBlZXIgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworfSB3bWlfcmVxdWVzdF9zdGF0c19jbWRfZml4ZWRfcGFyYW07CisKKy8qIHN0YXRzIHR5cGUgYml0bWFwICAqLworI2RlZmluZSBXTUlfTElOS19TVEFUU19SQURJTyAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgV01JX0xJTktfU1RBVFNfSUZBQ0UgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFdNSV9MSU5LX1NUQVRTX0FMTF9QRUVSICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBXTUlfTElOS19TVEFUU19QRVJfUEVFUiAgICAgIDB4MDAwMDAwMDgKKworLyogd2lmaSBjbGVhciBzdGF0aXN0aWNzIGJpdG1hcCAgKi8KKyNkZWZpbmUgV0lGSV9TVEFUU19SQURJTyAgICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiogYWxsIHJhZGlvIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgV0lGSV9TVEFUU19SQURJT19DQ0EgICAgICAgICAgMHgwMDAwMDAwMiAvKiogY2NhX2J1c3lfdGltZSAod2l0aGluIHJhZGlvIHN0YXRpc3RpY3MpICovCisjZGVmaW5lIFdJRklfU1RBVFNfUkFESU9fQ0hBTk5FTFMgICAgIDB4MDAwMDAwMDQgLyoqIGFsbCBjaGFubmVsIHN0YXRpc3RpY3MgKHdpdGhpbiByYWRpbyBzdGF0aXN0aWNzKSAqLworI2RlZmluZSBXSUZJX1NUQVRTX1JBRElPX1NDQU4gICAgICAgICAweDAwMDAwMDA4IC8qKiBhbGwgc2NhbiBzdGF0aXN0aWNzICh3aXRoaW4gcmFkaW8gc3RhdGlzdGljcykgKi8KKyNkZWZpbmUgV0lGSV9TVEFUU19JRkFDRSAgICAgICAgICAgICAgMHgwMDAwMDAxMCAvKiogYWxsIGludGVyZmFjZSBzdGF0aXN0aWNzICovCisjZGVmaW5lIFdJRklfU1RBVFNfSUZBQ0VfVFhSQVRFICAgICAgIDB4MDAwMDAwMjAgLyoqIGFsbCB0eCByYXRlIHN0YXRpc3RpY3MgKHdpdGhpbiBpbnRlcmZhY2Ugc3RhdGlzdGljcykgKi8KKyNkZWZpbmUgV0lGSV9TVEFUU19JRkFDRV9BQyAgICAgICAgICAgMHgwMDAwMDA0MCAvKiogYWxsIGFjIHN0YXRpc3RpY3MgKHdpdGhpbiBpbnRlcmZhY2Ugc3RhdGlzdGljcykgKi8KKyNkZWZpbmUgV0lGSV9TVEFUU19JRkFDRV9DT05URU5USU9OICAgMHgwMDAwMDA4MCAvKiogYWxsIGNvbnRlbnRpb24gKG1pbiwgbWF4LCBhdmcpIHN0YXRpc3RpY3MgKHdpdGhpbiBhYyBzdGF0aXNjdGljcykgKi8KKyNkZWZpbmUgV01JX1NUQVRTX0lGQUNFX0FMTF9QRUVSICAgICAgMHgwMDAwMDEwMCAvKiogQWxsIHBlZXIgc3RhdHMgb24gdGhpcyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgV01JX1NUQVRTX0lGQUNFX1BFUl9QRUVSICAgICAgMHgwMDAwMDIwMCAvKiogQ2xlYXIgcGFydGljdWxhciBwZWVyIHN0YXRzIGRlcGVuZGluZyBvbiB0aGUgcGVlcl9tYWMgKi8KKworLyoqIERlZmF1bHQgdmFsdWUgZm9yIHN0YXRzIGlmIHRoZSBzdGF0cyBjb2xsZWN0aW9uIGhhcyBub3Qgc3RhcnRlZCAqLworI2RlZmluZSBXTUlfU1RBVFNfVkFMVUVfSU5WQUxJRCAgICAgICAweGZmZmZmZmZmCisKKyNkZWZpbmUgV01JX0RJQUdfSURfR0VUKGRpYWdfZXZlbnRzX2xvZ3MpICAgICAgICAgICAgICAgICAgICAgICAgIFdNSV9HRVRfQklUUyhkaWFnX2V2ZW50c19sb2dzLCAwLCAxNikKKyNkZWZpbmUgV01JX0RJQUdfSURfU0VUKGRpYWdfZXZlbnRzX2xvZ3MsIHZhbHVlKSAgICAgICAgICAgICAgICAgIFdNSV9TRVRfQklUUyhkaWFnX2V2ZW50c19sb2dzLCAwLCAxNiwgdmFsdWUpCisjZGVmaW5lIFdNSV9ESUFHX1RZUEVfR0VUKGRpYWdfZXZlbnRzX2xvZ3MpICAgICAgICAgICAgICAgICAgICAgICBXTUlfR0VUX0JJVFMoZGlhZ19ldmVudHNfbG9ncywgMTYsIDEpCisjZGVmaW5lIFdNSV9ESUFHX1RZUEVfU0VUKGRpYWdfZXZlbnRzX2xvZ3MsIHZhbHVlKSAgICAgICAgICAgICAgICBXTUlfU0VUX0JJVFMoZGlhZ19ldmVudHNfbG9ncywgMTYsIDEsIHZhbHVlKQorI2RlZmluZSBXTUlfRElBR19JRF9FTkFCTEVEX0RJU0FCTEVEX0dFVChkaWFnX2V2ZW50c19sb2dzKSAgICAgICAgV01JX0dFVF9CSVRTKGRpYWdfZXZlbnRzX2xvZ3MsIDE3LCAxKQorI2RlZmluZSBXTUlfRElBR19JRF9FTkFCTEVEX0RJU0FCTEVEX1NFVChkaWFnX2V2ZW50c19sb2dzLCB2YWx1ZSkgV01JX1NFVF9CSVRTKGRpYWdfZXZlbnRzX2xvZ3MsIDE3LCAxLCB2YWx1ZSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7IC8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfZGlhZ19ldmVudF9sb2dfY29uZmlnX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgbnVtX29mX2RpYWdfZXZlbnRzX2xvZ3M7CisvKiBUaGUgVExWcyB3aWxsIGZvbGxvdy4KKyAqICAgIEFfVUlOVDMyIGRpYWdfZXZlbnRzX2xvZ3NfbGlzdFtdOyAwLTE1IEJpdHMgRGlhZyBFVkVOVC9MT0cgSUQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDE2IC0gRElBRyB0eXBlIEVWRU5UL0xPRywgMCAtIEV2ZW50LCAxIC0gTE9HCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDE3IEluZGljYXRlIGlmIHRoZSBESUFHIHR5cGUgaXMgRW5hYmxlZC9EaXNhYmxlZC4KKyAqLworfSB3bWlfZGlhZ19ldmVudF9sb2dfY29uZmlnX2ZpeGVkX3BhcmFtOworCisjZGVmaW5lIFdNSV9ESUFHX0ZSRVFVRU5DWV9HRVQoZGlhZ19ldmVudHNfbG9ncykgICAgICAgICAgV01JX0dFVF9CSVRTKGRpYWdfZXZlbnRzX2xvZ3MsIDE3LCAxKQorI2RlZmluZSBXTUlfRElBR19GUkVRVUVOQ1lfU0VUKGRpYWdfZXZlbnRzX2xvZ3MsIHZhbHVlKSAgIFdNSV9TRVRfQklUUyhkaWFnX2V2ZW50c19sb2dzLCAxNywgMSwgdmFsdWUpCisjZGVmaW5lIFdNSV9ESUFHX0VYVF9GRUFUVVJFX0dFVChkaWFnX2V2ZW50c19sb2dzKSAgICAgICAgV01JX0dFVF9CSVRTKGRpYWdfZXZlbnRzX2xvZ3MsIDE4LCAxKQorI2RlZmluZSBXTUlfRElBR19FWFRfRkVBVFVSRV9TRVQoZGlhZ19ldmVudHNfbG9ncywgdmFsdWUpIFdNSV9TRVRfQklUUyhkaWFnX2V2ZW50c19sb2dzLCAxOCwgMSwgdmFsdWUpCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIG51bV9vZl9kaWFnX2V2ZW50c19sb2dzOworLyogVGhlIFRMVnMgd2lsbCBmb2xsb3cuCisgKiAgICBBX1VJTlQzMiBkaWFnX2V2ZW50c19sb2dzX2xpc3RbXTsgMC0xNSBCaXRzIERpYWcgRVZFTlQvTE9HIElELAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAxNiAtIERJQUcgdHlwZSBFVkVOVC9MT0csIDAgLSBFdmVudCwgMSAtIExPRworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAxNyAtIEZyZXF1bmN5IG9mIHRoZSBESUFHIEVWRU5UL0xPRyBIaWdoIEZyZXF1ZW5jeSAtMSwgTG93IEZyZXF1ZW5jeSAtIDAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMTggLSBTZXQgaWYgdGhlIEVWRU5UUy9MT0dzIGFyZSB1c2VkIGZvciBFWFQgREVCVUcgRnJhbWV3b3JrCisgKi8KK30gd21pX2RpYWdfZXZlbnRfbG9nX3N1cHBvcnRlZF9ldmVudF9maXhlZF9wYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKioKKwkgKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kZWJ1Z19tZXNnX2ZsdXNoX2ZpeGVkX3BhcmFtCisJICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSAqLworCUFfVUlOVDMyIHJlc2VydmVkMDsKK30gd21pX2RlYnVnX21lc2dfZmx1c2hfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKioKKwkgKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kZWJ1Z19tZXNnX2ZsdXNoX2NvbXBsZXRlX2ZpeGVkX3BhcmFtCisJICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSAqLworCUFfVUlOVDMyIHJlc2VydmVkMDsKK30gd21pX2RlYnVnX21lc2dfZmx1c2hfY29tcGxldGVfZml4ZWRfcGFyYW07CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qCisJICogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogV01JVExWX1RBR19TVFJVQ193bWlfcnNzaV9icmVhY2hfZml4ZWRfcGFyYW0KKwkgKiB2ZGV2X2lkLCB3aGVyZSBSU1NJIGJyZWFjaCBldmVudCBvY2N1cnJlZAorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiByZXF1ZXN0IGlkICovCisJQV9VSU5UMzIgcmVxdWVzdF9pZDsKKwkvKgorCSAqIGJpdG1hcFswLTJdIGlzIGNvcnJlc3BvbmRpbmcgdG8gbG93X3Jzc2lbMC0yXS4gYml0bWFwWzMtNV0gaXMKKwkgKiBjb3JyZXNwb25kaW5nIHRvIGhpX3Jzc2lbMC0yXQorCSAqLworCUFfVUlOVDMyIGV2ZW50X2JpdG1hcDsKKwkvKiByc3NpIGF0IHRoZSB0aW1lIG9mIFJTU0kgYnJlYWNoLiBVbml0IGRCbSAqLworCUFfVUlOVDMyIHJzc2k7CisJLyogYnNzaWQgb2YgdGhlIG1vbml0b3JlZCBBUCdzICovCisJd21pX21hY19hZGRyIGJzc2lkOworfSB3bWlfcnNzaV9icmVhY2hfZXZlbnRfZml4ZWRfcGFyYW07CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9md19tZW1fZHVtcCAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgc2VnbWVudCAqLworCUFfVUlOVDMyIHNlZ19pZDsKKwkvKiogU3RhcnQgYWRkcmVzcyBvZiB0aGUgc2VnbWVudCB0byBiZSByZWFkICovCisJQV9VSU5UMzIgc2VnX3N0YXJ0X2FkZHJfbG87CisJQV9VSU5UMzIgc2VnX3N0YXJ0X2FkZHJfaGk7CisJLyoqIExlbmd0aCBvZiB0aGUgc2VnbWVudCB0byBiZSByZWFkICovCisJQV9VSU5UMzIgc2VnX2xlbmd0aDsKKwkvKiogSG9zdCBidWZlZXIgYWRkcmVzcyB0byB3aGljaCB0aGUgc2VnbWVudCB3aWxsIGJlIHJlYWQgYW5kIGR1bXBlZCAqLworCUFfVUlOVDMyIGRlc3RfYWRkcl9sbzsKKwlBX1VJTlQzMiBkZXN0X2FkZHJfaGk7Cit9IHdtaV9md19tZW1fZHVtcDsKKworLyogQ29tbWFuZCB0byBnZXQgZmlybXdhcmUgbWVtb3J5IGR1bXAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9nZXRfZndfbWVtX2R1bXBfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIHJlcXVlc3QgKi8KKwlBX1VJTlQzMiByZXF1ZXN0X2lkOworCS8qKiBudW1iZXIgb2YgbWVtb3J5IGR1bXAgc2VnbWVudHMgKi8KKwlBX1VJTlQzMiBudW1fZndfbWVtX2R1bXBfc2VnczsKKwkvKioKKwkgKiBUaGlzIFRMViBpcyBmb2xsb3dlZCBieSBhbm90aGVyIFRMVgorCSAqICAgICB3bWlfZndfbWVtX2R1bXAgZndfbWVtX2R1bXBbXTsKKwkgKi8KK30gd21pX2dldF9md19tZW1fZHVtcF9maXhlZF9wYXJhbTsKKworLyoqIEV2ZW50IHRvIGluZGljYXRlIHRoZSBjb21wbGV0aW9uIG9mIGZ3IG1lbSBkdW1wICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogV01JVExWX1RBR19TVFJVQ193bWlfdXBkYXRlX2Z3X21lbV9kdW1wX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCBnaXZlbgorCSAqIGluIHRoZSByZXF1ZXN0IHN0YXRzIGNvbW1hbmQgKi8KKwlBX1VJTlQzMiByZXF1ZXN0X2lkOworCS8qSW4gY2FzZSBvZiBGaXJtd2FyZSBtZW1vcnkgZHVtcCAqLworCUFfVUlOVDMyIGZ3X21lbV9kdW1wX2NvbXBsZXRlOworfSB3bWlfdXBkYXRlX2Z3X21lbV9kdW1wX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCVdNSV9ST0FNSU5HX0lETEUgPSAwLAorCVdNSV9ST0FNSU5HX0FDVElWRSA9IDEsCit9IHdtaV9yb2FtX3N0YXRlOworCisvKiBhY2Nlc3MgY2F0ZWdvcmllcyAqLwordHlwZWRlZiBlbnVtIHsKKwlXTUlfQUNfVk8gPSAwLAorCVdNSV9BQ19WSSA9IDEsCisJV01JX0FDX0JFID0gMiwKKwlXTUlfQUNfQksgPSAzLAorCVdNSV9BQ19NQVggPSA0LAorfSB3bWlfdHJhZmZpY19hYzsKKwordHlwZWRlZiBlbnVtIHsKKwlXTUlfU1RBX1NUQVRTID0gMCwKKwlXTUlfU09GVEFQX1NUQVRTID0gMSwKKwlXTUlfSUJTU19TVEFUUyA9IDIsCisJV01JX1AyUF9DTElFTlRfU1RBVFMgPSAzLAorCVdNSV9QMlBfR09fU1RBVFMgPSA0LAorCVdNSV9OQU5fU1RBVFMgPSA1LAorCVdNSV9NRVNIX1NUQVRTID0gNiwKK30gd21pX2xpbmtfaWZhY2VfdHlwZTsKKworLyogY2hhbm5lbCBvcGVyYXRpbmcgd2lkdGggKi8KK3R5cGVkZWYgZW51bSB7CisJV01JX0NIQU5fV0lEVEhfMjAgPSAwLAorCVdNSV9DSEFOX1dJRFRIXzQwID0gMSwKKwlXTUlfQ0hBTl9XSURUSF84MCA9IDIsCisJV01JX0NIQU5fV0lEVEhfMTYwID0gMywKKwlXTUlfQ0hBTl9XSURUSF84MFA4MCA9IDQsCisJV01JX0NIQU5fV0lEVEhfNSA9IDUsCisJV01JX0NIQU5fV0lEVEhfMTAgPSA2LAorfSB3bWlfY2hhbm5lbF93aWR0aDsKKworLypDbGVhciBzdGF0cyovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NsZWFyX2xpbmtfc3RhdHNfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBzdG9wX3N0YXRzX2NvbGxlY3Rpb25fcmVxID0gMSB3aWxsIGltcGx5IHN0b3AgdGhlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiAqLworCUFfVUlOVDMyIHN0b3Bfc3RhdHNfY29sbGVjdGlvbl9yZXE7CisJLyoqIGlkZW50aWZpZXMgd2hhdCBzdGF0cyB0byBiZSBjbGVhcmVkICovCisJQV9VSU5UMzIgc3RhdHNfY2xlYXJfcmVxX21hc2s7CisJLyoqIGlkZW50aWZpZXMgd2hpY2ggcGVlciBzdGF0cyB0byBiZSBjbGVhcmVkLiBWYWxpZCBvbmx5IHdoaWxlIGNsZWFyaW5nIFBFUl9SRUVSICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKK30gd21pX2NsZWFyX2xpbmtfc3RhdHNfY21kX2ZpeGVkX3BhcmFtOworCisvKiBMaW5rIFN0YXRzIGNvbmZpZ3VyYXRpb24gcGFyYW1zLiBUcmlnZ2VyIHRoZSBsaW5rIGxheWVyIHN0YXRpc3RpY3MgY29sbGVjdGlvbiovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3N0YXJ0X2xpbmtfc3RhdHNfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHRocmVzaG9sZCB0byBjbGFzc2lmeSB0aGUgcGt0cyBhcyBzaG9ydCBvciBsb25nICovCisJQV9VSU5UMzIgbXBkdV9zaXplX3RocmVzaG9sZDsKKwkvKiogc2V0IGZvciBmaWVsZCBkZWJ1ZyBtb2RlLiBEcml2ZXIgc2hvdWxkIGNvbGxlY3QgYWxsIHN0YXRpc3RpY3MgcmVnYXJkbGVzcyBvZiBwZXJmb3JtYW5jZSBpbXBhY3QuKi8KKwlBX1VJTlQzMiBhZ2dyZXNzaXZlX3N0YXRpc3RpY3NfZ2F0aGVyaW5nOworfSB3bWlfc3RhcnRfbGlua19zdGF0c19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcmVxdWVzdF9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiBUeXBlIG9mIHN0YXRzIHJlcXVpcmVkLiBUaGlzIGlzIGEgYml0bWFzayBXTUlfTElOS19TVEFUU19SQURJTywgV01JX0xJTktfU1RBVFNfSUZBQ0UgKi8KKwlBX1VJTlQzMiBzdGF0c190eXBlOworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHJlcXVlc3RfaWQ7CisJLyoqIHBlZXIgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworfSB3bWlfcmVxdWVzdF9saW5rX3N0YXRzX2NtZF9maXhlZF9wYXJhbTsKKworLyogY2hhbm5lbCBzdGF0aXN0aWNzICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYW5uZWxfc3RhdHMgKi8KKwkvKiogQ2hhbm5lbCB3aWR0aCAoMjAsIDQwLCA4MCwgODArODAsIDE2MCkgZW51bSB3bWlfY2hhbm5lbF93aWR0aCovCisJQV9VSU5UMzIgY2hhbm5lbF93aWR0aDsKKwkvKiogUHJpbWFyeSAyMCBNSHogY2hhbm5lbCAqLworCUFfVUlOVDMyIGNlbnRlcl9mcmVxOworCS8qKiBjZW50ZXIgZnJlcXVlbmN5IChNSHopIGZpcnN0IHNlZ21lbnQgKi8KKwlBX1VJTlQzMiBjZW50ZXJfZnJlcTA7CisJLyoqIGNlbnRlciBmcmVxdWVuY3kgKE1Ieikgc2Vjb25kIHNlZ21lbnQgKi8KKwlBX1VJTlQzMiBjZW50ZXJfZnJlcTE7CisJLyoqIG1zZWNzIHRoZSByYWRpbyBpcyBhd2FrZSAoMzIgYml0cyBudW1iZXIgYWNjcnVpbmcgb3ZlciB0aW1lKSAqLworCUFfVUlOVDMyIHJhZGlvX2F3YWtlX3RpbWU7CisJLyoqIG1zZWNzIHRoZSBDQ0EgcmVnaXN0ZXIgaXMgYnVzeSAoMzIgYml0cyBudW1iZXIgYWNjcnVpbmcgb3ZlciB0aW1lKSAqLworCUFfVUlOVDMyIGNjYV9idXN5X3RpbWU7Cit9IHdtaV9jaGFubmVsX3N0YXRzOworCisvKiByYWRpbyBzdGF0aXN0aWNzICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JhZGlvX2xpbmtfc3RhdHMgKi8KKwkvKiogV2lmaSByYWRpbyAoaWYgbXVsdGlwbGUgcmFkaW8gc3VwcG9ydGVkKSAqLworCUFfVUlOVDMyIHJhZGlvX2lkOworCS8qKiBtc2VjcyB0aGUgcmFkaW8gaXMgYXdha2UgKDMyIGJpdHMgbnVtYmVyIGFjY3J1aW5nIG92ZXIgdGltZSkgKi8KKwlBX1VJTlQzMiBvbl90aW1lOworCS8qKiBtc2VjcyB0aGUgcmFkaW8gaXMgdHJhbnNtaXR0aW5nICgzMiBiaXRzIG51bWJlciBhY2NydWluZyBvdmVyIHRpbWUpICovCisJQV9VSU5UMzIgdHhfdGltZTsKKwkvKiogbXNlY3MgdGhlIHJhZGlvIGlzIGluIGFjdGl2ZSByZWNlaXZlICgzMiBiaXRzIG51bWJlciBhY2NydWluZyBvdmVyIHRpbWUpICovCisJQV9VSU5UMzIgcnhfdGltZTsKKwkvKiogbXNlY3MgdGhlIHJhZGlvIGlzIGF3YWtlIGR1ZSB0byBhbGwgc2NhbiAoMzIgYml0cyBudW1iZXIgYWNjcnVpbmcgb3ZlciB0aW1lKSAqLworCUFfVUlOVDMyIG9uX3RpbWVfc2NhbjsKKwkvKiogbXNlY3MgdGhlIHJhZGlvIGlzIGF3YWtlIGR1ZSB0byBOQU4gKDMyIGJpdHMgbnVtYmVyIGFjY3J1aW5nIG92ZXIgdGltZSkgKi8KKwlBX1VJTlQzMiBvbl90aW1lX25iZDsKKwkvKiogbXNlY3MgdGhlIHJhZGlvIGlzIGF3YWtlIGR1ZSB0byBHP3NjYW4gKDMyIGJpdHMgbnVtYmVyIGFjY3J1aW5nIG92ZXIgdGltZSkgKi8KKwlBX1VJTlQzMiBvbl90aW1lX2dzY2FuOworCS8qKiBtc2VjcyB0aGUgcmFkaW8gaXMgYXdha2UgZHVlIHRvIHJvYW0/c2NhbiAoMzIgYml0cyBudW1iZXIgYWNjcnVpbmcgb3ZlciB0aW1lKSAqLworCUFfVUlOVDMyIG9uX3RpbWVfcm9hbV9zY2FuOworCS8qKiBtc2VjcyB0aGUgcmFkaW8gaXMgYXdha2UgZHVlIHRvIFBOTyBzY2FuICgzMiBiaXRzIG51bWJlciBhY2NydWluZyBvdmVyIHRpbWUpICovCisJQV9VSU5UMzIgb25fdGltZV9wbm9fc2NhbjsKKwkvKiogbXNlY3MgdGhlIHJhZGlvIGlzIGF3YWtlIGR1ZSB0byBIUzIuMCBzY2FucyBhbmQgR0FTIGV4Y2hhbmdlICgzMiBiaXRzIG51bWJlciBhY2NydWluZyBvdmVyIHRpbWUpICovCisJQV9VSU5UMzIgb25fdGltZV9oczIwOworCS8qKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwlBX1VJTlQzMiBudW1fY2hhbm5lbHM7Cit9IHdtaV9yYWRpb19saW5rX3N0YXRzOworCisvKiogUmFkaW8gc3RhdGlzdGljcyAob25jZSBzdGFydGVkKSBkbyBub3Qgc3RvcCBvciBnZXQgcmVzZXQgdW5sZXNzIHdpZmlfY2xlYXJfbGlua19zdGF0cyBpcyBpbnZva2VkICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCBnaXZlbiBpbiB0aGUgcmVxdWVzdCBzdGF0cyBjb21tYW5kICovCisJQV9VSU5UMzIgcmVxdWVzdF9pZDsKKwkvKiogTnVtYmVyIG9mIHJhZGlvcyovCisJQV9VSU5UMzIgbnVtX3JhZGlvOworCS8qKiBtb3JlX2RhdGEgd2lsbCBiZSBzZXQgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgcmFkaW9zICovCisJQV9VSU5UMzIgbW9yZV9yYWRpb19ldmVudHM7CisvKgorICogVGhpcyBUTFYgaXMgZm9sbG93ZWQgYnkgYW5vdGhlciBUTFYgb2YgYXJyYXkgb2YgYnl0ZXMKKyAqICAgc2l6ZSBvZihzdHJ1Y3Qgd21pX3JhZGlvX2xpbmtfc3RhdHMpOworICoKKyAqIFRoaXMgVExWIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgVExWIG9mIGFycmF5IG9mIGJ5dGVzCisgKiAgIG51bV9jaGFubmVscyAqIHNpemUgb2Yoc3RydWN0IHdtaV9jaGFubmVsX3N0YXRzKQorICovCisKK30gd21pX3JhZGlvX2xpbmtfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW07CisKKy8qIHBlciByYXRlIHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yYXRlX3N0YXRzICovCisJLyoqIHJhdGUgaW5mb3JtYXRpb24KKwkgKiBUaGUgcmF0ZS1jb2RlIGlzIGEgMS1ieXRlIGZpZWxkIGluIHdoaWNoOmZvciBnaXZlbiByYXRlLCBuc3MgYW5kIHByZWFtYmxlCisJICogYic3LWItNiBpbmRpY2F0ZSB0aGUgcHJlYW1ibGUgKDAgT0ZETSwgMSBDQ0ssIDIsIEhULCAzIFZIVCkKKwkgKiBiJzUtYic0IGluZGljYXRlIHRoZSBOU1MgKDAgLSAxeDEsIDEgLSAyeDIsIDIgLSAzeDMpCisJICogYiczLWInMCBpbmRpY2F0ZSB0aGUgcmF0ZSwgd2hpY2ggaXMgaW5kaWNhdGVkIGFzIGZvbGxvd3M6CisJICogICAgICAgICAgT0ZETSA6ICAgICAwOiBPRkRNIDQ4IE1icHMKKwkgKiAgICAgICAgICAgICAgICAgICAgIDE6IE9GRE0gMjQgTWJwcworCSAqICAgICAgICAgICAgICAgICAgICAgMjogT0ZETSAxMiBNYnBzCisJICogICAgICAgICAgICAgICAgICAgICAzOiBPRkRNIDYgTWJwcworCSAqICAgICAgICAgICAgICAgICAgICAgNDogT0ZETSA1NCBNYnBzCisJICogICAgICAgICAgICAgICAgICAgICA1OiBPRkRNIDM2IE1icHMKKwkgKiAgICAgICAgICAgICAgICAgICAgIDY6IE9GRE0gMTggTWJwcworCSAqICAgICAgICAgICAgICAgICAgICAgNzogT0ZETSA5IE1icHMKKwkgKiAgICAgICAgIENDSyAocHJlYW0gPT0gMSkKKwkgKiAgICAgICAgICAgICAgICAgICAgIDA6IENDSyAxMSBNYnBzIExvbmcKKwkgKiAgICAgICAgICAgICAgICAgICAgIDE6IENDSyA1LjUgTWJwcyBMb25nCisJICogICAgICAgICAgICAgICAgICAgICAyOiBDQ0sgMiBNYnBzIExvbmcKKwkgKiAgICAgICAgICAgICAgICAgICAgIDM6IENDSyAxIE1icHMgTG9uZworCSAqICAgICAgICAgICAgICAgICAgICAgNDogQ0NLIDExIE1icHMgU2hvcnQKKwkgKiAgICAgICAgICAgICAgICAgICAgIDU6IENDSyA1LjUgTWJwcyBTaG9ydAorCSAqICAgICAgICAgICAgICAgICAgICAgNjogQ0NLIDIgTWJwcyBTaG9ydAorCSAqICAgICAgICAgSFQvVkhUIChwcmVhbSA9PSAyLzMpCisJICogICAgICAgICAgICAgICAgICAgICAwLi43OiBNQ1MwLi5NQ1M3IChIVCkKKwkgKiAgICAgICAgICAgICAgICAgICAgIDAuLjk6IE1DUzAuLk1DUzkgKFZIVCkKKwkgKi8KKwlBX1VJTlQzMiByYXRlOworCS8qKiB1bml0cyBvZiAxMDAgS2JwcyAqLworCUFfVUlOVDMyIGJpdHJhdGU7CisJLyoqIG51bWJlciBvZiBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgZGF0YSBwa3RzIChBQ0sgcmN2ZCkgKi8KKwlBX1VJTlQzMiB0eF9tcGR1OworCS8qKiBudW1iZXIgb2YgcmVjZWl2ZWQgZGF0YSBwa3RzICovCisJQV9VSU5UMzIgcnhfbXBkdTsKKwkvKiogbnVtYmVyIG9mIGRhdGEgcGFja2V0IGxvc3NlcyAobm8gQUNLKSAqLworCUFfVUlOVDMyIG1wZHVfbG9zdDsKKwkvKiogdG90YWwgbnVtYmVyIG9mIGRhdGEgcGt0IHJldHJpZXMgKi8KKwlBX1VJTlQzMiByZXRyaWVzOworCS8qKiBudW1iZXIgb2Ygc2hvcnQgZGF0YSBwa3QgcmV0cmllcyAqLworCUFfVUlOVDMyIHJldHJpZXNfc2hvcnQ7CisJLyoqIG51bWJlciBvZiBsb25nIGRhdGEgcGt0IHJldHJpZXMgKi8KKwlBX1VJTlQzMiByZXRyaWVzX2xvbmc7Cit9IHdtaV9yYXRlX3N0YXRzOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9saW5rX3N0YXRzICovCisJLyoqIHBlZXIgdHlwZSAoQVAsIFRETFMsIEdPIGV0Yy4pIGVudW0gd21pX3BlZXJfdHlwZSovCisJQV9VSU5UMzIgcGVlcl90eXBlOworCS8qKiBtYWMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY19hZGRyZXNzOworCS8qKiBwZWVyIHdtaV9DQVBBQklMSVRZX1hYWCAqLworCUFfVUlOVDMyIGNhcGFiaWxpdGllczsKKwkvKiogbnVtYmVyIG9mIHJhdGVzICovCisJQV9VSU5UMzIgbnVtX3JhdGVzOworfSB3bWlfcGVlcl9saW5rX3N0YXRzOworCisvKiogUEVFUiBzdGF0aXN0aWNzIChvbmNlIHN0YXJ0ZWQpIHJlc2V0IGFuZCBzdGFydCBhZnJlc2ggYWZ0ZXIgZWFjaCBjb25uZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9zdGF0c19ldmVudF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIHJlcXVlc3QsIGdpdmVuIGluIHRoZSByZXF1ZXN0IHN0YXRzIGNvbW1hbmQgKi8KKwlBX1VJTlQzMiByZXF1ZXN0X2lkOworCS8qKiBudW1iZXIgb2YgcGVlcnMgYWNjb21pZGF0ZWQgaW4gdGhpcyBwYXJ0aWN1bGFyIGV2ZW50ICAqLworCUFfVUlOVDMyIG51bV9wZWVyczsKKwkvKiogSW5kaWNhdGVzIHRoZSBmcmFnbWVudCBudW1iZXIgICovCisJQV9VSU5UMzIgcGVlcl9ldmVudF9udW1iZXI7CisJLyoqIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgbW9yZSBwZWVycyB3aGljaCB3aWxsIGJlIHNlbnQgYXMgc2VwZXJhdGUgcGVlcl9zdGF0cyBldmVudCAqLworCUFfVUlOVDMyIG1vcmVfZGF0YTsKKworLyoqCisgKiBUaGlzIFRMViBpcyBmb2xsb3dlZCBieSBhbm90aGVyIFRMVgorICogbnVtX3BlZXJzICogc2l6ZSBvZihzdHJ1Y3Qgd21pX3BlZXJfc3RhdHMpCisgKiBudW1fcmF0ZXMgKiBzaXplIG9mKHN0cnVjdCB3bWlfcmF0ZV9zdGF0cykuIG51bV9yYXRlcyBpcyB0aGUgc3VtIG9mIHRoZSByYXRlcyBvZiBhbGwgdGhlIHBlZXJzLgorICovCit9IHdtaV9wZWVyX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiBwZXIgYWNjZXNzIGNhdGVnb3J5IHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV93bW1fYWNfc3RhdHMgKi8KKwkvKiogYWNjZXNzIGNhdGVnb3J5IChWSSwgVk8sIEJFLCBCSykgZW51bSB3bWlfdHJhZmZpY19hYyovCisJQV9VSU5UMzIgYWNfdHlwZTsKKwkvKiogbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCB1bmljYXN0IGRhdGEgcGt0cyAoQUNLIHJjdmQpICovCisJQV9VSU5UMzIgdHhfbXBkdTsKKwkvKiogbnVtYmVyIG9mIHJlY2VpdmVkIHVuaWNhc3QgbXBkdXMgKi8KKwlBX1VJTlQzMiByeF9tcGR1OworCS8qKiBudW1iZXIgb2Ygc3VjY2VzZnVsbHkgdHJhbnNtaXR0ZWQgbXVsdGljYXN0IGRhdGEgcGFja2V0cyAqLworCS8qKiBTVEEgY2FzZTogaW1wbGllcyBBQ0sgcmVjZWl2ZWQgZnJvbSBBUCBmb3IgdGhlIHVuaWNhc3QgcGFja2V0IGluIHdoaWNoIG1jYXN0IHBrdCB3YXMgc2VudCAqLworCUFfVUlOVDMyIHR4X21jYXN0OworCS8qKiBudW1iZXIgb2YgcmVjZWl2ZWQgbXVsdGljYXN0IGRhdGEgcGFja2V0cyAqLworCUFfVUlOVDMyIHJ4X21jYXN0OworCS8qKiBudW1iZXIgb2YgcmVjZWl2ZWQgdW5pY2FzdCBhLW1wZHVzICovCisJQV9VSU5UMzIgcnhfYW1wZHU7CisJLyoqIG51bWJlciBvZiB0cmFuc21pdHRlZCB1bmljYXN0IGEtbXBkdXMgKi8KKwlBX1VJTlQzMiB0eF9hbXBkdTsKKwkvKiogbnVtYmVyIG9mIGRhdGEgcGt0IGxvc3NlcyAobm8gQUNLKSAqLworCUFfVUlOVDMyIG1wZHVfbG9zdDsKKwkvKiogdG90YWwgbnVtYmVyIG9mIGRhdGEgcGt0IHJldHJpZXMgKi8KKwlBX1VJTlQzMiByZXRyaWVzOworCS8qKiBudW1iZXIgb2Ygc2hvcnQgZGF0YSBwa3QgcmV0cmllcyAqLworCUFfVUlOVDMyIHJldHJpZXNfc2hvcnQ7CisJLyoqIG51bWJlciBvZiBsb25nIGRhdGEgcGt0IHJldHJpZXMgKi8KKwlBX1VJTlQzMiByZXRyaWVzX2xvbmc7CisJLyoqIGRhdGEgcGt0IG1pbiBjb250ZW50aW9uIHRpbWUgKHVzZWNzKSAqLworCUFfVUlOVDMyIGNvbnRlbnRpb25fdGltZV9taW47CisJLyoqIGRhdGEgcGt0IG1heCBjb250ZW50aW9uIHRpbWUgKHVzZWNzKSAqLworCUFfVUlOVDMyIGNvbnRlbnRpb25fdGltZV9tYXg7CisJLyoqIGRhdGEgcGt0IGF2ZyBjb250ZW50aW9uIHRpbWUgKHVzZWNzKSAqLworCUFfVUlOVDMyIGNvbnRlbnRpb25fdGltZV9hdmc7CisJLyoqIG51bSBvZiBkYXRhIHBrdHMgdXNlZCBmb3IgY29udGVudGlvbiBzdGF0aXN0aWNzICovCisJQV9VSU5UMzIgY29udGVudGlvbl9udW1fc2FtcGxlczsKK30gd21pX3dtbV9hY19zdGF0czsKKworLyogaW50ZXJmYWNlIHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9pZmFjZV9saW5rX3N0YXRzICovCisJLyoqIGFjY2VzcyBwb2ludCBiZWFjb24gcmVjZWl2ZWQgY291bnQgZnJvbSBjb25uZWN0ZWQgQVAgKi8KKwlBX1VJTlQzMiBiZWFjb25fcng7CisJLyoqIGFjY2VzcyBwb2ludCBtZ210IGZyYW1lcyByZWNlaXZlZCBjb3VudCBmcm9tIGNvbm5lY3RlZCBBUCAoaW5jbHVkaW5nIEJlYWNvbikgKi8KKwlBX1VJTlQzMiBtZ210X3J4OworCS8qKiBhY3Rpb24gZnJhbWVzIHJlY2VpdmVkIGNvdW50ICovCisJQV9VSU5UMzIgbWdtdF9hY3Rpb25fcng7CisJLyoqIGFjdGlvbiBmcmFtZXMgdHJhbnNtaXQgY291bnQgKi8KKwlBX1VJTlQzMiBtZ210X2FjdGlvbl90eDsKKwkvKiogYWNjZXNzIFBvaW50IEJlYWNvbiBhbmQgTWFuYWdlbWVudCBmcmFtZXMgUlNTSSAoYXZlcmFnZWQpICovCisJQV9VSU5UMzIgcnNzaV9tZ210OworCS8qKiBhY2Nlc3MgUG9pbnQgRGF0YSBGcmFtZXMgUlNTSSAoYXZlcmFnZWQpIGZyb20gY29ubmVjdGVkIEFQICovCisJQV9VSU5UMzIgcnNzaV9kYXRhOworCS8qKiBhY2Nlc3MgUG9pbnQgQUNLIFJTU0kgKGF2ZXJhZ2VkKSBmcm9tIGNvbm5lY3RlZCBBUCAqLworCUFfVUlOVDMyIHJzc2lfYWNrOworCS8qKiBudW1iZXIgb2YgcGVlcnMgKi8KKwlBX1VJTlQzMiBudW1fcGVlcnM7CisJLyoqIEluZGljYXRlcyBob3cgbWFueSBwZWVyX3N0YXRzIGV2ZW50cyB3aWxsIGJlIHNlbnQgZGVwZW5kaW5nIG9uIHRoZSBudW1fcGVlcnMuICovCisJQV9VSU5UMzIgbnVtX3BlZXJfZXZlbnRzOworCS8qKiBudW1iZXIgb2YgYWMgKi8KKwlBX1VJTlQzMiBudW1fYWM7CisJLyoqIFJvYW1pbmcgU3RhdCAqLworCUFfVUlOVDMyIHJvYW1fc3RhdGU7CisJLyoqCisJICogQXZlcmFnZSBCZWFjb24gc3ByZWFkIG9mZnNldCBpcyB0aGUgYXZlcmFnZWQgdGltZSBkZWxheSBiZXR3ZWVuIFRCVFQKKwkgKiBhbmQgYmVhY29uIFRTRiAqLworCS8qKiBVcHBlciAzMiBiaXRzIG9mIGF2ZXJhZ2VkIDY0IGJpdCBiZWFjb24gc3ByZWFkIG9mZnNldCAqLworCUFfVUlOVDMyIGF2Z19iY25fc3ByZWFkX29mZnNldF9oaWdoOworCS8qKiBMb3dlciAzMiBiaXRzIG9mIGF2ZXJhZ2VkIDY0IGJpdCBiZWFjb24gc3ByZWFkIG9mZnNldCAqLworCUFfVUlOVDMyIGF2Z19iY25fc3ByZWFkX29mZnNldF9sb3c7CisJLyoqIFRha2VzIHZhbHVlIG9mIDEgaWYgQVAgbGVha3MgcGFja2V0cyBhZnRlciBzZW5kaW5nIGFuIEFDSyBmb3IgUE09MSBvdGhlcndpc2UgMCAqLworCUFfVUlOVDMyIGlzX2xlYWt5X2FwOworCS8qKiBBdmVyYWdlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgZnJvbSBBUCBhZnRlciByZWNlaXZpbmcgdGhlIEFDSyBmb3IgYSBmcmFtZSB3aXRoIFBNPTEgKi8KKwlBX1VJTlQzMiBhdmdfcnhfZnJtc19sZWFrZWQ7CisJLyoqIFJ4IGxlYWsgd2F0Y2ggd2luZG93IGN1cnJlbnRseSBpbiBmb3JjZSB0byBtaW5pbWl6ZSBkYXRhIGxvc3MKKwkgKiBiZWNhdXNlIG9mIGxlYWt5IEFQLiBSeCBsZWFrIHdpbmRvdyBpcyB0aGUKKwkgKiB0aW1lIGRyaXZlciB3YWl0cyBiZWZvcmUgc2h1dHRpbmcgZG93biB0aGUgcmFkaW8gb3Igc3dpdGNoaW5nIHRoZQorCSAqIGNoYW5uZWwgYW5kIGFmdGVyIHJlY2VpdmluZyBhbiBBQ0sgZm9yCisJICogYSBkYXRhIGZyYW1lIHdpdGggUE0gYml0IHNldCkgKi8KKwlBX1VJTlQzMiByeF9sZWFrX3dpbmRvdzsKK30gd21pX2lmYWNlX2xpbmtfc3RhdHM7CisKKy8qKiBJbnRlcmZhY2Ugc3RhdGlzdGljcyAob25jZSBzdGFydGVkKSByZXNldCBhbmQgc3RhcnQgYWZyZXNoIGFmdGVyIGVhY2ggY29ubmVjdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2lmYWNlX2xpbmtfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCBnaXZlbiBpbiB0aGUgcmVxdWVzdCBzdGF0cyBjb21tYW5kICovCisJQV9VSU5UMzIgcmVxdWVzdF9pZDsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisvKgorICogVGhpcyBUTFYgaXMgZm9sbG93ZWQgYnkgYW5vdGhlciBUTFYKKyAqICAgd21pX2lmYWNlX2xpbmtfc3RhdHMgaWZhY2VfbGlua19zdGF0czsKKyAqICAgbnVtX2FjICogc2l6ZSBvZihzdHJ1Y3Qgd21pX3dtbV9hY19zdGF0cykKKyAqLworfSB3bWlfaWZhY2VfbGlua19zdGF0c19ldmVudF9maXhlZF9wYXJhbTsKKworLyoqIFN1c3BlbmQgb3B0aW9uICovCitlbnVtIHsKKwlXTUlfUERFVl9TVVNQRU5ELCAgICAgICAgICAgICAgIC8qIHN1c3BlbmQgKi8KKwlXTUlfUERFVl9TVVNQRU5EX0FORF9ESVNBQkxFX0lOVFIsICAgICAgICAgICAgICAvKiBzdXNwZW5kIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9zdXNwZW5kX2NtZF9maXhlZF9wYXJhbSAgKi8KKwkvKiBzdXNwZW5kIG9wdGlvbiBzZW50IHRvIHRhcmdldCAqLworCUFfVUlOVDMyIHJlc2VydmVkMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBwbGFjZWhvbGRlciBmb3IgcGRldl9pZCBvZiBmdXR1cmUgbXVsdGlwbGUgTUFDIHByb2R1Y3RzLiBJbml0LiB0byAwLiAqLworCUFfVUlOVDMyIHN1c3BlbmRfb3B0OworfSB3bWlfcGRldl9zdXNwZW5kX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BkZXZfcmVzdW1lX2NtZF9maXhlZF9wYXJhbSAgKi8KKwkvKiogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwlBX1VJTlQzMiByZXNlcnZlZDA7Cit9IHdtaV9wZGV2X3Jlc3VtZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3JhdGVfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW0sICAqLworCUFfVUlOVDMyIG51bV92ZGV2X3N0YXRzOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdmRldnMgKi8KK30gd21pX3ZkZXZfcmF0ZV9zdGF0c19ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuLCB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfcmF0ZV9odF9pbmZvICovCisJQV9VSU5UMzIgdmRldmlkOyAgICAgICAgICAgICAgICAvKiBJZCBvZiB0aGUgd2xhbiB2ZGV2ICovCisJQV9VSU5UMzIgdHhfbnNzOyAgICAgICAgICAgICAgICAvKiBCaXQgMjggb2YgdHhfcmF0ZV9rYnBzIGhhcyB0aGlzIGluZm8gLSBiYXNlZCBvbiBsYXN0IGRhdGEgcGFja2V0IHRyYW5zbWl0dGVkICovCisJQV9VSU5UMzIgcnhfbnNzOyAgICAgICAgICAgICAgICAvKiBCaXQgMjQgb2YgcnhfcmF0ZV9rYnBzIC0gc2FtZSBhcyBhYm92ZSAqLworCUFfVUlOVDMyIHR4X3ByZWFtYmxlOyAgICAgICAgICAgLyogQml0cyAzMC0yOSBmcm9tIHR4X3JhdGVfa2JwcyAqLworCUFfVUlOVDMyIHJ4X3ByZWFtYmxlOyAgICAgICAgICAgLyogQml0cyAyNi0yNSBmcm9tIHJ4X3JhdGVfa2JwcyAqLworfSB3bWlfdmRldl9yYXRlX2h0X2luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGF0c19ldmVudF9maXhlZF9wYXJhbSAqLworCXdtaV9zdGF0c19pZCBzdGF0c19pZDsKKwkvKiogbnVtYmVyIG9mIHBkZXYgc3RhdHMgZXZlbnQgc3RydWN0dXJlcyAod21pX3BkZXZfc3RhdHMpIDAgb3IgMSAqLworCUFfVUlOVDMyIG51bV9wZGV2X3N0YXRzOworCS8qKiBudW1iZXIgb2YgdmRldiBzdGF0cyBldmVudCBzdHJ1Y3R1cmVzICAod21pX3ZkZXZfc3RhdHMpIDAgb3IgbWF4IHZkZXZzICovCisJQV9VSU5UMzIgbnVtX3ZkZXZfc3RhdHM7CisJLyoqIG51bWJlciBvZiBwZWVyIHN0YXRzIGV2ZW50IHN0cnVjdHVyZXMgICh3bWlfcGVlcl9zdGF0cykgMCBvciBtYXggcGVlcnMgKi8KKwlBX1VJTlQzMiBudW1fcGVlcl9zdGF0czsKKwlBX1VJTlQzMiBudW1fYmNuZmx0X3N0YXRzOworCS8qKiBudW1iZXIgb2YgY2hhbiBzdGF0cyBldmVudCBzdHJ1Y3R1cmVzICAod21pX2NoYW5fc3RhdHMpIDAgdG8gTUFYIE1DQyBDSEFOUyAqLworCUFfVUlOVDMyIG51bV9jaGFuX3N0YXRzOworCS8qIFRoaXMgVExWIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgVExWIG9mIGFycmF5IG9mIGJ5dGVzCisJICogICBBX1VJTlQ4IGRhdGFbXTsKKwkgKiAgVGhpcyBkYXRhIGFycmF5IGNvbnRhaW5zCisJICogICBudW1fcGRldl9zdGF0cyAqIHNpemUgb2Yoc3RydWN0IHdtaV9wZGV2X3N0YXRzKQorCSAqICAgbnVtX3ZkZXZfc3RhdHMgKiBzaXplIG9mKHN0cnVjdCB3bWlfdmRldl9zdGF0cykKKwkgKiAgIG51bV9wZWVyX3N0YXRzICogc2l6ZSBvZihzdHJ1Y3Qgd21pX3BlZXJfc3RhdHMpCisJICogICBudW1fYmNuZmx0X3N0YXRzICogc2l6ZV9vZigpCisJICogICBudW1fY2hhbl9zdGF0cyAqIHNpemUgb2Yoc3RydWN0IHdtaV9jaGFuX3N0YXRzKQorCSAqCisJICovCit9IHdtaV9zdGF0c19ldmVudF9maXhlZF9wYXJhbTsKKworLyoqCisgKiAgUERFViBzdGF0aXN0aWNzCisgKiAgQHRvZG8KKyAqICBhZGQgYWxsIFBERVYgc3RhdHMgaGVyZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIENoYW5uZWwgbm9pc2UgZmxvb3IgKi8KKwlBX0lOVDMyIGNoYW5fbmY7CisJLyoqIFRYIGZyYW1lIGNvdW50ICovCisJQV9VSU5UMzIgdHhfZnJhbWVfY291bnQ7CisJLyoqIFJYIGZyYW1lIGNvdW50ICovCisJQV9VSU5UMzIgcnhfZnJhbWVfY291bnQ7CisJLyoqIHJ4IGNsZWFyIGNvdW50ICovCisJQV9VSU5UMzIgcnhfY2xlYXJfY291bnQ7CisJLyoqIGN5Y2xlIGNvdW50ICovCisJQV9VSU5UMzIgY3ljbGVfY291bnQ7CisJLyoqIFBoeSBlcnJvciBjb3VudCAqLworCUFfVUlOVDMyIHBoeV9lcnJfY291bnQ7CisJLyoqIENoYW5uZWwgVHggUG93ZXIgKi8KKwlBX1VJTlQzMiBjaGFuX3R4X3B3cjsKKwkvKiogV0FMIGRiZyBzdGF0cyAqLworCXN0cnVjdCB3bGFuX2RiZ19zdGF0cyBwZGV2X3N0YXRzOworCit9IHdtaV9wZGV2X3N0YXRzOworCisvKioKKyAqICBWREVWIHN0YXRpc3RpY3MKKyAqICBAdG9kbworICogIGFkZCBhbGwgVkRFViBzdGF0cyBoZXJlCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfSU5UMzIgYmNuX3NucjsKKwlBX0lOVDMyIGRhdF9zbnI7Cit9IHdtaV9zbnJfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwl3bWlfc25yX2luZm8gdmRldl9zbnI7CisJQV9VSU5UMzIgdHhfZnJtX2NudFtXTEFOX01BWF9BQ107ICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHBhY2tldHMocGVyIEFDKSB0aGF0IHdlcmUgc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkKHdpdGggYW5kIHdpdGhvdXQgcmV0cmllcywgaW5jbHVkaW5nIG11bHRpLWNhc3QsIGJyb2FkY2FzdCkgKi8KKwlBX1VJTlQzMiByeF9mcm1fY250OyAgICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgKGFmdGVyIGFwcHJvcHJpYXRlIGZpbHRlciBydWxlcyBpbmNsdWRpbmcgbXVsdGktY2FzdCwgYnJvYWRjYXN0KSAqLworCUFfVUlOVDMyIG11bHRpcGxlX3JldHJ5X2NudFtXTEFOX01BWF9BQ107ICAgICAgICAgICAgICAgLypUaGUgbnVtYmVyIG9mIE1TRFUgcGFja2V0cyBhbmQgTU1QRFUgZnJhbWVzIHBlciBBQworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgODAyLjExIHN0YXRpb24gc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkIGFmdGVyIG1vcmUgdGhhbiBvbmUgcmV0cmFuc21pc3Npb24gYXR0ZW1wdCAqLworCUFfVUlOVDMyIGZhaWxfY250W1dMQU5fTUFYX0FDXTsgICAgICAgICAvKlRvdGFsIG51bWJlciBwYWNrZXRzKHBlciBBQykgZmFpbGVkIHRvIHRyYW5zbWl0ICovCisJQV9VSU5UMzIgcnRzX2ZhaWxfY250OyAgICAgICAgICAvKlRvdGFsIG51bWJlciBvZiBSVFMvQ1RTIHNlcXVlbmNlIGZhaWx1cmVzIGZvciB0cmFuc21pc3Npb24gb2YgYSBwYWNrZXQgKi8KKwlBX1VJTlQzMiBydHNfc3VjY19jbnQ7ICAgICAgICAgIC8qVG90YWwgbnVtYmVyIG9mIFJUUy9DVFMgc2VxdWVuY2Ugc3VjY2VzcyBmb3IgdHJhbnNtaXNzaW9uIG9mIGEgcGFja2V0ICovCisJQV9VSU5UMzIgcnhfZXJyX2NudDsgICAgICAgICAgICAvKlRoZSByZWNlaXZlIGVycm9yIGNvdW50LiBIQUwgd2lsbCBwcm92aWRlIHRoZSBSeFAgRkNTIGVycm9yIGdsb2JhbCAqLworCUFfVUlOVDMyIHJ4X2Rpc2NhcmRfY250OyAgICAgICAgICAgICAgICAvKiBUaGUgc3VtIG9mIHRoZSByZWNlaXZlIGVycm9yIGNvdW50IGFuZCBkcm9wcGVkLXJlY2VpdmUtYnVmZmVyIGVycm9yIGNvdW50LiAoRkNTIGVycm9yKSAqLworCUFfVUlOVDMyIGFja19mYWlsX2NudDsgICAgICAgICAgLypUb3RhbCBudW1iZXIgcGFja2V0cyBmYWlsZWQgdHJhbnNtaXQgYmVjYXVzZSBvZiBubyBBQ0sgZnJvbSB0aGUgcmVtb3RlIGVudGl0eSAqLworCUFfVUlOVDMyIHR4X3JhdGVfaGlzdG9yeVtNQVhfVFhfUkFURV9WQUxVRVNdOyAgICAgICAgICAgLypIaXN0b3J5IG9mIGxhc3QgdGVuIHRyYW5zbWl0IHJhdGUsIGluIHVuaXRzIG9mIDUwMCBrYml0L3NlYyAqLworCUFfVUlOVDMyIGJjbl9yc3NpX2hpc3RvcnlbTUFYX1JTU0lfVkFMVUVTXTsgICAgICAgICAgICAgLypIaXN0b3J5IG9mIGxhc3QgdGVuIEJlYWNvbiByc3NpIG9mIHRoZSBjb25uZWN0ZWQgQnNzICovCit9IHdtaV92ZGV2X3N0YXRzOworCisvKioKKyAqICBwZWVyIHN0YXRpc3RpY3MuCisgKgorICogQHRvZG8KKyAqIGFkZCBtb3JlIHN0YXRzCisgKgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIHBlZXIgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCS8qKiByc3NpICovCisJQV9VSU5UMzIgcGVlcl9yc3NpOworCS8qKiBsYXN0IHR4IGRhdGEgcmF0ZSB1c2VkIGZvciBwZWVyICovCisJQV9VSU5UMzIgcGVlcl90eF9yYXRlOworCS8qKiBsYXN0IHJ4IGRhdGEgcmF0ZSB1c2VkIGZvciBwZWVyICovCisJQV9VSU5UMzIgcGVlcl9yeF9yYXRlOworfSB3bWlfcGVlcl9zdGF0czsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBQcmltYXJ5IGNoYW5uZWwgZnJlcSBvZiB0aGUgY2hhbm5lbCBmb3Igd2hpY2ggc3RhdHMgYXJlIHNlbnQgKi8KKwlBX1VJTlQzMiBjaGFuX21oejsKKwkvKiogVGltZSBzcGVudCBvbiB0aGUgY2hhbm5lbCAqLworCUFfVUlOVDMyIHNhbXBsaW5nX3BlcmlvZF91czsKKwkvKiogQWdncmVnYXRlIGR1cmF0aW9uIG92ZXIgYSBzYW1wbGluZyBwZXJpb2QgZm9yIHdoaWNoIGNoYW5uZWwgYWN0aXZpdHkgd2FzIG9ic2VydmVkICovCisJQV9VSU5UMzIgcnhfY2xlYXJfY291bnQ7CisJLyoqIEFjY3VtYWxhdGlvbiBvZiB0aGUgVFggUFBEVSBkdXJhdGlvbiBvdmVyIGEgc2FtcGxpbmcgcGVyaW9kICovCisJQV9VSU5UMzIgdHhfZHVyYXRpb25fdXM7CisJLyoqIEFjY3VtYWxhdGlvbiBvZiB0aGUgUlggUFBEVSBkdXJhdGlvbiBvdmVyIGEgc2FtcGxpbmcgcGVyaW9kICovCisJQV9VSU5UMzIgcnhfZHVyYXRpb25fdXM7Cit9IHdtaV9jaGFuX3N0YXRzOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfY3JlYXRlX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogVkRFViB0eXBlIChBUCxTVEEsSUJTUyxNT05JVE9SKSAqLworCUFfVUlOVDMyIHZkZXZfdHlwZTsKKwkvKiogVkRFViBzdWJ0eXBlIChQMlBERVYsIFAyUENMSSwgUDJQR08sIEJUMy4wKSovCisJQV9VSU5UMzIgdmRldl9zdWJ0eXBlOworCS8qKiBWREVWIE1BQyBhZGRyZXNzICovCisJd21pX21hY19hZGRyIHZkZXZfbWFjYWRkcjsKKwkvKiBOdW1iZXIgb2YgY29uZmlndXJlZCB0eHJ4IHN0cmVhbXMgKi8KKwlBX1VJTlQzMiBudW1fY2ZnX3R4cnhfc3RyZWFtczsKKwkvKgorCSAqIFRoaXMgVExWIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgVExWIG9mIGFycmF5IG9mIHN0cnVjdHVyZXMKKwkgKiB3bWlfdmRldl90eHJ4X3N0cmVhbXMgY2ZnX3R4cnhfc3RyZWFtc1tdOworCSovCit9IHdtaV92ZGV2X2NyZWF0ZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfdHhyeF9zdHJlYW1zCisJICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiBiYW5kIC0gU2hvdWxkIHRha2UgdmFsdWVzIGZyb20gd21pX2NoYW5uZWxfYmFuZF9tYXNrICovCisJQV9VSU5UMzIgYmFuZDsKKwkvKiBtYXggc3VwcG9ydGVkIHR4IHN0cmVhbXMgcGVyIGdpdmVuIGJhbmQgZm9yIHRoaXMgdmRldiAqLworCUFfVUlOVDMyIHN1cHBvcnRlZF90eF9zdHJlYW1zOworCS8qIG1heCBzdXBwb3J0ZWQgcnggc3RyZWFtcyBwZXIgZ2l2ZW4gYmFuZCBmb3IgdGhpcyB2ZGV2ICovCisJQV9VSU5UMzIgc3VwcG9ydGVkX3J4X3N0cmVhbXM7Cit9IHdtaV92ZGV2X3R4cnhfc3RyZWFtczsKKworLyogd21pX3AycF9ub2FfZGVzY3JpcHRvciBzdHJ1Y3R1cmUgY2FuJ3QgYmUgbW9kaWZpZWQgd2l0aG91dCBicmVha2luZyB0aGUgY29tcGF0aWJpbGl0eSBmb3IgV01JX0hPU1RfU1dCQV9FVkVOVElEICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3AycF9ub2FfZGVzY3JpcHRvciAqLworCUFfVUlOVDMyIHR5cGVfY291bnQ7CisJLyoqIDI1NTogY29udGludW91cyBzY2hlZHVsZSwgMDogcmVzZXJ2ZWQgKi8KKwlBX1VJTlQzMiBkdXJhdGlvbjsKKwkvKiogQWJzZW50IHBlcmlvZCBkdXJhdGlvbiBpbiBtaWNybyBzZWNvbmRzICovCisJQV9VSU5UMzIgaW50ZXJ2YWw7CisJLyoqIEFic2VudCBwZXJpb2QgaW50ZXJ2YWwgaW4gbWljcm8gc2Vjb25kcyAqLworCUFfVUlOVDMyIHN0YXJ0X3RpbWU7CisJLyoqIDMyIGJpdCB0c2YgdGltZSB3aGVuIGluIHN0YXJ0cyAqLworfSB3bWlfcDJwX25vYV9kZXNjcmlwdG9yOworCisvKiogdmFsdWVzIGZvciB2ZGV2X3R5cGUgKi8KKyNkZWZpbmUgV01JX1ZERVZfVFlQRV9BUCAgICAgICAgIDB4MQorI2RlZmluZSBXTUlfVkRFVl9UWVBFX1NUQSAgICAgICAgMHgyCisjZGVmaW5lIFdNSV9WREVWX1RZUEVfSUJTUyAgICAgICAweDMKKyNkZWZpbmUgV01JX1ZERVZfVFlQRV9NT05JVE9SICAgIDB4NAorCisvKiogVkRFViB0eXBlIGlzIGZvciBzb2NpYWwgd2lmaSBpbnRlcmZhY2UuVGhpcyBWREVWIGlzIEN1cnJlbnRseSBtYWlubHkgbmVlZGVkCisgKiBieSBGVyB0byBleGVjdXRlIHRoZSBOQU4gc3BlY2lmaWMgV01JIGNvbW1hbmRzIGFuZCBhbHNvIGltcGxlbWVudCBOQU4gc3BlY2lmaWMKKyAqIG9wZXJhdGlvbnMgbGlrZSBOZXR3b3JrIGRpc2NvdmVyeSwgc2VydmljZSBwcm92aXNpb25pbmcgYW5kIHNlcnZpY2UKKyAqIHN1YnNjcmlwdGlvbiAgLi5ldGMuIElmIEZXIG5lZWRzIE5BTiBWREVWIHRoZW4gSG9zdCBzaG91bGQgaXNzdWUgVkRFViBjcmVhdGUKKyAqIFdNSSBjb21tYW5kIHRvIGNyZWF0ZSB0aGlzIFZERVYgb25jZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGhvc3QgaXMgbm90CisgKiBleHBlY3RlZCB0byB1c2UgYW55IFZERVYgc3BlY2lmaWMgV01JIGNvbW1hbmRzIG9uIHRoaXMgVkRFVi4KKyAqKi8KKyNkZWZpbmUgV01JX1ZERVZfVFlQRV9OQU4gICAgICAgIDB4NQorCisjZGVmaW5lIFdNSV9WREVWX1RZUEVfT0NCICAgICAgICAweDYKKworLyoqIHZhbHVlcyBmb3IgdmRldl9zdWJ0eXBlICovCisjZGVmaW5lIFdNSV9VTklGSUVEX1ZERVZfU1VCVFlQRV9QMlBfREVWSUNFIDB4MQorI2RlZmluZSBXTUlfVU5JRklFRF9WREVWX1NVQlRZUEVfUDJQX0NMSUVOVCAweDIKKyNkZWZpbmUgV01JX1VOSUZJRURfVkRFVl9TVUJUWVBFX1AyUF9HTyAgICAgMHgzCisKKy8qKiB2YWx1ZXMgZm9yIHZkZXZfc3RhcnRfcmVxdWVzdCBmbGFncyAqLworLyoqIEluZGljYXRlcyB0aGF0IEFQIFZERVYgdXNlcyBoaWRkZW4gc3NpZC4gb25seSB2YWxpZCBmb3IKKyAqICBBUC9HTyAqLworI2RlZmluZSBXTUlfVU5JRklFRF9WREVWX1NUQVJUX0hJRERFTl9TU0lEICAoMTw8MCkKKy8qKiBJbmRpY2F0ZXMgaWYgcm9idXN0IG1hbmFnZW1lbnQgZnJhbWUvbWFuYWdlbWVudCBmcmFtZQorICogIHByb3RlY3Rpb24gaXMgZW5hYmxlZC4gRm9yIEdPL0FQIHZkZXZzLCBpdCBpbmRpY2F0ZXMgdGhhdAorICogIGl0IG1heSBzdXBwb3J0IHN0YXRpb24vY2xpZW50IGFzc29jaWF0aW9ucyB3aXRoIFJNRiBlbmFibGVkLgorICogIEZvciBTVEEvY2xpZW50IHZkZXZzLCBpdCBpbmRpY2F0ZXMgdGhhdCBzdGEgd2lsbAorICogIGFzc29jaWF0ZSB3aXRoIEFQIHdpdGggUk1GIGVuYWJsZWQuICovCisjZGVmaW5lIFdNSV9VTklGSUVEX1ZERVZfU1RBUlRfUE1GX0VOQUJMRUQgICgxPDwxKQorCisvKgorICogSG9zdCBpcyBzZW5kaW5nIGJjbl90eF9yYXRlIHRvIG92ZXJyaWRlIHRoZSBiZWFjb24gdHggcmF0ZXMuCisgKi8KKyNkZWZpbmUgV01JX1VOSUZJRURfVkRFVl9TVEFSVF9CQ05fVFhfUkFURV9QUkVTRU5UICgxPDwyKQorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc3RhcnRfcmVxdWVzdF9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHJlcXVlc3RvciBpZCBpZGVudGlmeWluZyB0aGUgY2FsbGVyIG1vZHVsZSAqLworCUFfVUlOVDMyIHJlcXVlc3Rvcl9pZDsKKwkvKiogYmVhY29uIGludGVydmFsIGZyb20gcmVjZWl2ZWQgYmVhY29uICovCisJQV9VSU5UMzIgYmVhY29uX2ludGVydmFsOworCS8qKiBEVElNIFBlcmlvZCBmcm9tIHRoZSByZWNlaXZlZCBiZWFjb24gKi8KKwlBX1VJTlQzMiBkdGltX3BlcmlvZDsKKwkvKiogRmxhZ3MgKi8KKwlBX1VJTlQzMiBmbGFnczsKKwkvKiogc3NpZCBmaWVsZC4gT25seSB2YWxpZCBmb3IgQVAvR08vSUJTUy9CVEFtcCBWREVWIHR5cGUuICovCisJd21pX3NzaWQgc3NpZDsKKwkvKiogYmVhY29uL3Byb2JlIHJlcG9uc2UgeG1pdCByYXRlLiBBcHBsaWNhYmxlIGZvciBTb2Z0QVAuICovCisJLyoqIFRoaXMgZmllbGQgd2lsbCBiZSBpbnZhbGlkIGFuZCBpZ25vcmVkIHVubGVzcyB0aGUgKi8KKwkvKiogZmxhZ3MgZmllbGQgaGFzIHRoZSBXTUlfVU5JRklFRF9WREVWX1NUQVJUX0JDTl9UWF9SQVRFX1BSRVNFTlQgYml0LiAqLworCS8qKiBXaGVuIHZhbGlkLCB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBmaXhlZCB0eCByYXRlIGZvciB0aGUgYmVhY29uICovCisJLyoqIGFuZCBwcm9iZSByZXNwb25zZSBmcmFtZXMgc2VuZCBieSB0aGUgR08gb3IgU29mdEFQICovCisJQV9VSU5UMzIgYmNuX3R4X3JhdGU7CisJLyoqIGJlYWNvbi9wcm9iZSByZXBvbnNlIHhtaXQgcG93ZXIuIEFwcGxpY2FibGUgZm9yIFNvZnRBUC4gKi8KKwlBX1VJTlQzMiBiY25fdHhQb3dlcjsKKwkvKiogbnVtYmVyIG9mIHAycCBOT0EgZGVzY3JpcHRvcihzKSBmcm9tIHNjYW4gZW50cnkgKi8KKwlBX1VJTlQzMiBudW1fbm9hX2Rlc2NyaXB0b3JzOworCS8qKiBEaXNhYmxlIEgvVyBhY2suIFRoaXMgdXNlZCBieSBXTUlfVkRFVl9SRVNUQVJUX1JFUVVFU1RfQ01ESUQuCisJICAgICAgRHVyaW5nIENBQywgT3VyIEhXIHNob3VsZG4ndCBhY2sgZGl0ZWN0ZWQgZnJhbWVzICovCisJQV9VSU5UMzIgZGlzYWJsZV9od19hY2s7CisJLyoqIFRoaXMgZmllbGQgd2lsbCBiZSBpbnZhbGlkIHVubGVzcyB0aGUgRHVhbCBCYW5kIFNpbXVsdGFuZW91cyAoREJTKSBmZWF0dXJlIGlzIGVuYWJsZWQuICovCisJLyoqIFRoZSBEQlMgcG9saWN5IG1hbmFnZXIgaW5kaWNhdGVzIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mIHRyYW5zbWl0IHN0cmVhbXMuICovCisJQV9VSU5UMzIgcHJlZmVycmVkX3R4X3N0cmVhbXM7CisJLyoqIFRoaXMgZmllbGQgd2lsbCBiZSBpbnZhbGlkIHVubGVzcyB0aGUgRHVhbCBCYW5kIFNpbXVsdGFuZW91cyAoREJTKSBmZWF0dXJlIGlzIGVuYWJsZWQuICovCisJLyoqIHRoZSBEQlMgcG9saWN5IG1hbmFnZXIgaW5kaWNhdGVzIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mIHJlY2VpdmUgc3RyZWFtcy4gKi8KKwlBX1VJTlQzMiBwcmVmZXJyZWRfcnhfc3RyZWFtczsKKwkvKiBUaGUgVExWcyBmb2xsb3dzIHRoaXMgc3RydWN0dXJlOgorCSAqICAgICB3bWlfY2hhbm5lbCBjaGFuOyAgIC8vV01JIGNoYW5uZWwKKwkgKiAgICAgd21pX3AycF9ub2FfZGVzY3JpcHRvciAgbm9hX2Rlc2NyaXB0b3JzW107IC8vYWN0dWFsIHAycCBOT0EgZGVzY3JpcHRvciBmcm9tIHNjYW4gZW50cnkKKwkgKi8KK30gd21pX3ZkZXZfc3RhcnRfcmVxdWVzdF9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9kZWxldGVfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworfSB3bWlfdmRldl9kZWxldGVfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl91cF9jbWRpZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogYWlkIChhc3NvYyBpZCkgcmVjZWl2ZWQgaW4gYXNzb2NpYXRpb24gcmVzcG9uc2UgZm9yIFNUQSBWREVWICAqLworCUFfVUlOVDMyIHZkZXZfYXNzb2NfaWQ7CisJLyoqIGJzc2lkIG9mIHRoZSBCU1MgdGhlIFZERVYgaXMgam9pbmluZyAgKi8KKwl3bWlfbWFjX2FkZHIgdmRldl9ic3NpZDsKK30gd21pX3ZkZXZfdXBfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfc3RvcF9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7Cit9IHdtaV92ZGV2X3N0b3BfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfZG93bl9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7Cit9IHdtaV92ZGV2X2Rvd25fY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworfSB3bWlfdmRldl9zdGFuZGJ5X3Jlc3BvbnNlX2NtZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKK30gd21pX3ZkZXZfcmVzdW1lX3Jlc3BvbnNlX2NtZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHBhcmFtZXRlciBpZCAgICovCisJQV9VSU5UMzIgcGFyYW1faWQ7CisJLyoqIHBhcmFtZXRlciB2YWx1ZSAqLworCUFfVUlOVDMyIHBhcmFtX3ZhbHVlOworfSB3bWlfdmRldl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIga2V5X3NlcV9jb3VudGVyX2w7CisJQV9VSU5UMzIga2V5X3NlcV9jb3VudGVyX2g7Cit9IHdtaV9rZXlfc2VxX2NvdW50ZXI7CisKKyNkZWZpbmUgIFdNSV9DSVBIRVJfTk9ORSAgICAgMHgwICAgICAgICAvKiBjbGVhciBrZXkgKi8KKyNkZWZpbmUgIFdNSV9DSVBIRVJfV0VQICAgICAgMHgxCisjZGVmaW5lICBXTUlfQ0lQSEVSX1RLSVAgICAgIDB4MgorI2RlZmluZSAgV01JX0NJUEhFUl9BRVNfT0NCICAweDMKKyNkZWZpbmUgIFdNSV9DSVBIRVJfQUVTX0NDTSAgMHg0CisjZGVmaW5lICBXTUlfQ0lQSEVSX1dBUEkgICAgIDB4NQorI2RlZmluZSAgV01JX0NJUEhFUl9DS0lQICAgICAweDYKKyNkZWZpbmUgIFdNSV9DSVBIRVJfQUVTX0NNQUMgMHg3CisjZGVmaW5lICBXTUlfQ0lQSEVSX0FOWSAgICAgIDB4OAorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfaW5zdGFsbF9rZXlfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBNQUMgYWRkcmVzcyB1c2VkIGZvciBpbnN0YWxsaW5nICAgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCS8qKiBrZXkgaW5kZXggKi8KKwlBX1VJTlQzMiBrZXlfaXg7CisJLyoqIGtleSBmbGFncyAqLworCUFfVUlOVDMyIGtleV9mbGFnczsKKwkvKioga2V5IGNpcGhlciwgZGVmaW5lZCBhYm92ZSAqLworCUFfVUlOVDMyIGtleV9jaXBoZXI7CisJLyoqIGtleSByc2MgY291bnRlciAqLworCXdtaV9rZXlfc2VxX2NvdW50ZXIga2V5X3JzY19jb3VudGVyOworCS8qKiBnbG9iYWwga2V5IHJzYyBjb3VudGVyICovCisJd21pX2tleV9zZXFfY291bnRlciBrZXlfZ2xvYmFsX3JzY19jb3VudGVyOworCS8qKiBnbG9iYWwga2V5IHRzYyBjb3VudGVyICovCisJd21pX2tleV9zZXFfY291bnRlciBrZXlfdHNjX2NvdW50ZXI7CisJLyoqIFdBUEkga2V5IHJzYyBjb3VudGVyICovCisJQV9VSU5UOCB3cGlfa2V5X3JzY19jb3VudGVyWzE2XTsKKwkvKiogV0FQSSBrZXkgdHNjIGNvdW50ZXIgKi8KKwlBX1VJTlQ4IHdwaV9rZXlfdHNjX2NvdW50ZXJbMTZdOworCS8qKiBrZXkgbGVuZ3RoICovCisJQV9VSU5UMzIga2V5X2xlbjsKKwkvKioga2V5IHR4IG1pYyBsZW5ndGggKi8KKwlBX1VJTlQzMiBrZXlfdHhtaWNfbGVuOworCS8qKiBrZXkgcnggbWljIGxlbmd0aCAqLworCUFfVUlOVDMyIGtleV9yeG1pY19sZW47CisJLyoKKwkgKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3QgYXJlIHRoaXMgVExWLgorCSAqICAgICAvLyBhY3R1YWwga2V5IGRhdGEKKwkgKiAgICAgQV9VSU5UOCAga2V5X2RhdGFbXTsgLy8gY29udGFpbnMga2V5IGZvbGxvd2VkIGJ5IHR4IG1pYyBmb2xsb3dlZCBieSByeCBtaWMKKwkgKi8KK30gd21pX3ZkZXZfaW5zdGFsbF9rZXlfY21kX2ZpeGVkX3BhcmFtOworCisvKiogUHJlYW1ibGUgdHlwZXMgdG8gYmUgdXNlZCB3aXRoIFZERVYgZml4ZWQgcmF0ZSBjb25maWd1cmF0aW9uICovCit0eXBlZGVmIGVudW0geworCVdNSV9SQVRFX1BSRUFNQkxFX09GRE0sCisJV01JX1JBVEVfUFJFQU1CTEVfQ0NLLAorCVdNSV9SQVRFX1BSRUFNQkxFX0hULAorCVdNSV9SQVRFX1BSRUFNQkxFX1ZIVCwKK30gV01JX1JBVEVfUFJFQU1CTEU7CisKKy8qKiBWYWx1ZSB0byBkaXNhYmxlIGZpeGVkIHJhdGUgc2V0dGluZyAqLworI2RlZmluZSBXTUlfRklYRURfUkFURV9OT05FICAgICgweGZmKQorCisvKiogdGhlIGRlZmluaXRpb24gb2YgZGlmZmVyZW50IFZERVYgcGFyYW1ldGVycyAqLwordHlwZWRlZiBlbnVtIHsKKwkvKiogUlRTIFRocmVzaG9sZCAqLworCVdNSV9WREVWX1BBUkFNX1JUU19USFJFU0hPTEQgPSAweDEsCisJLyoqIEZyYWdtZW50YXRpb24gdGhyZXNob2xkICovCisJV01JX1ZERVZfUEFSQU1fRlJBR01FTlRBVElPTl9USFJFU0hPTEQsCisJLyoqIGJlYWNvbiBpbnRlcnZhbCBpbiBUVXMgKi8KKwlXTUlfVkRFVl9QQVJBTV9CRUFDT05fSU5URVJWQUwsCisJLyoqIExpc3RlbiBpbnRlcnZhbCBpbiBUVXMgKi8KKwlXTUlfVkRFVl9QQVJBTV9MSVNURU5fSU5URVJWQUwsCisJLyoqIG11dGljYXN0IHJhdGUgaW4gTWJwcyAqLworCVdNSV9WREVWX1BBUkFNX01VTFRJQ0FTVF9SQVRFLAorCS8qKiBtYW5hZ2VtZW50IGZyYW1lIHJhdGUgaW4gTWJwcyAqLworCVdNSV9WREVWX1BBUkFNX01HTVRfVFhfUkFURSwKKwkvKiogc2xvdCB0aW1lIChsb25nIHZzIHNob3J0KSAqLworCVdNSV9WREVWX1BBUkFNX1NMT1RfVElNRSwKKwkvKiogcHJlYW1ibGUgKGxvbmcgdnMgc2hvcnQpICovCisJV01JX1ZERVZfUEFSQU1fUFJFQU1CTEUsCisJLyoqIFNXQkEgdGltZSAodGltZSBiZWZvcmUgdGJ0dCBpbiBtc2VjKSAqLworCVdNSV9WREVWX1BBUkFNX1NXQkFfVElNRSwKKwkvKiogdGltZSBwZXJpb2QgZm9yIHVwZGF0aW5nIFZERVYgc3RhdHMgKi8KKwlXTUlfVkRFVl9TVEFUU19VUERBVEVfUEVSSU9ELAorCS8qKiBhZ2Ugb3V0IHRpbWUgaW4gbXNlYyBmb3IgZnJhbWVzIHF1ZXVlZCBmb3Igc3RhdGlvbiBpbiBwb3dlciBzYXZlKi8KKwlXTUlfVkRFVl9QV1JTQVZFX0FHRU9VVF9USU1FLAorCS8qKiBIb3N0IFNXQkEgaW50ZXJ2YWwgKHRpbWUgaW4gbXNlYyBiZWZvcmUgdGJ0dCBmb3IgU1dCQSBldmVudCBnZW5lcmF0aW9uKSAqLworCVdNSV9WREVWX0hPU1RfU1dCQV9JTlRFUlZBTCwKKwkvKiogRFRJTSBwZXJpb2QgKHNwZWNpZmllZCBpbiB1bml0cyBvZiBudW0gYmVhY29uIGludGVydmFscykgKi8KKwlXTUlfVkRFVl9QQVJBTV9EVElNX1BFUklPRCwKKwkvKiogc2NoZWR1bGVyIGFpciB0aW1lIGxpbWl0IGZvciB0aGlzIFZERVYuIHVzZWQgYnkgb2ZmIGNoYW4gc2NoZWR1bGVyICAqLworCVdNSV9WREVWX09DX1NDSEVEVUxFUl9BSVJfVElNRV9MSU1JVCwKKwkvKiogZW5hYmxlL2RzaWFibGUgV0RTIGZvciB0aGlzIFZERVYgICovCisJV01JX1ZERVZfUEFSQU1fV0RTLAorCS8qKiBBVElNIFdpbmRvdyAqLworCVdNSV9WREVWX1BBUkFNX0FUSU1fV0lORE9XLAorCS8qKiBCTUlTUyBtYXggKi8KKwlXTUlfVkRFVl9QQVJBTV9CTUlTU19DT1VOVF9NQVgsCisJLyoqIEJNSVNTIGZpcnN0IHRpbWUgKi8KKwlXTUlfVkRFVl9QQVJBTV9CTUlTU19GSVJTVF9CQ05ULAorCS8qKiBCTUlTUyBmaW5hbCB0aW1lICovCisJV01JX1ZERVZfUEFSQU1fQk1JU1NfRklOQUxfQkNOVCwKKwkvKiogV01NIGVuYWJsZXMvZGlzYWJsZWQgKi8KKwlXTUlfVkRFVl9QQVJBTV9GRUFUVVJFX1dNTSwKKwkvKiogQ2hhbm5lbCB3aWR0aCAqLworCVdNSV9WREVWX1BBUkFNX0NIV0lEVEgsCisJLyoqIENoYW5uZWwgT2Zmc2V0ICovCisJV01JX1ZERVZfUEFSQU1fQ0hFWFRPRkZTRVQsCisJLyoqIERpc2FibGUgSFQgUHJvdGVjdGlvbiAqLworCVdNSV9WREVWX1BBUkFNX0RJU0FCTEVfSFRQUk9URUNUSU9OLAorCS8qKiBRdWljayBTVEEgS2lja291dCAqLworCVdNSV9WREVWX1BBUkFNX1NUQV9RVUlDS0tJQ0tPVVQsCisJLyoqIFJhdGUgdG8gYmUgdXNlZCB3aXRoIE1hbmFnZW1lbnQgZnJhbWVzICovCisJV01JX1ZERVZfUEFSQU1fTUdNVF9SQVRFLAorCS8qKiBQcm90ZWN0aW9uIE1vZGUgKi8KKwlXTUlfVkRFVl9QQVJBTV9QUk9URUNUSU9OX01PREUsCisJLyoqIEZpeGVkIHJhdGUgc2V0dGluZyAqLworCVdNSV9WREVWX1BBUkFNX0ZJWEVEX1JBVEUsCisJLyoqIFNob3J0IEdJIEVuYWJsZS9EaXNhYmxlICovCisJV01JX1ZERVZfUEFSQU1fU0dJLAorCS8qKiBFbmFibGUgTERQQyAqLworCVdNSV9WREVWX1BBUkFNX0xEUEMsCisJLyoqIEVuYWJsZSBUeCBTVEJDICovCisJV01JX1ZERVZfUEFSQU1fVFhfU1RCQywKKwkvKiogRW5hYmxlIFJ4IFNUQkMgKi8KKwlXTUlfVkRFVl9QQVJBTV9SWF9TVEJDLAorCS8qKiBJbnRyYSBCU1MgZm9yd2FyZGluZyAgKi8KKwlXTUlfVkRFVl9QQVJBTV9JTlRSQV9CU1NfRldELAorCS8qKiBTZXR0aW5nIERlZmF1bHQgeG1pdCBrZXkgZm9yIFZkZXYgKi8KKwlXTUlfVkRFVl9QQVJBTV9ERUZfS0VZSUQsCisJLyoqIE5TUyB3aWR0aCAqLworCVdNSV9WREVWX1BBUkFNX05TUywKKwkvKiogU2V0IHRoZSBjdXN0b20gcmF0ZSBmb3IgdGhlIGJyb2FkY2FzdCBkYXRhIGZyYW1lcyAqLworCVdNSV9WREVWX1BBUkFNX0JDQVNUX0RBVEFfUkFURSwKKwkvKiogU2V0IHRoZSBjdXN0b20gcmF0ZSAocmF0ZS1jb2RlKSBmb3IgbXVsdGljYXN0IGRhdGEgZnJhbWVzICovCisJV01JX1ZERVZfUEFSQU1fTUNBU1RfREFUQV9SQVRFLAorCS8qKiBUeCBtdWx0aWNhc3QgcGFja2V0IGluZGljYXRlIEVuYWJsZS9EaXNhYmxlICovCisJV01JX1ZERVZfUEFSQU1fTUNBU1RfSU5ESUNBVEUsCisJLyoqIFR4IERIQ1AgcGFja2V0IGluZGljYXRlIEVuYWJsZS9EaXNhYmxlICovCisJV01JX1ZERVZfUEFSQU1fREhDUF9JTkRJQ0FURSwKKwkvKiogRW5hYmxlIGhvc3QgaW5zcGVjdGlvbiBvZiBUeCB1bmljYXN0IHBhY2tldCB0byB1bmtub3duIGRlc3RpbmF0aW9uICovCisJV01JX1ZERVZfUEFSQU1fVU5LTk9XTl9ERVNUX0lORElDQVRFLAorCisJLyogVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgQVAgYmVnaW5zIHRvIGNvbnNpZGVyIFNUQSBpbmFjdGl2ZSAqLworCVdNSV9WREVWX1BBUkFNX0FQX0tFRVBBTElWRV9NSU5fSURMRV9JTkFDVElWRV9USU1FX1NFQ1MsCisKKwkvKiBBbiBhc3NvY2lhdGVkIFNUQSBpcyBjb25zaWRlcmVkIGluYWN0aXZlIHdoZW4gdGhlcmUgaXMgbm8gcmVjZW50IFRYL1JYCisJICogYWN0aXZpdHkgYW5kIG5vIGRvd25saW5rIGZyYW1lcyBhcmUgYnVmZmVyZWQgZm9yIGl0LiBPbmNlIGEgU1RBIGV4Y2VlZHMKKwkgKiB0aGUgbWF4aW11bSBpZGxlIGluYWN0aXZlIHRpbWUsIHRoZSBBUCB3aWxsIHNlbmQgYW4gODAyLjExIGRhdGEtbnVsbCBhcworCSAqIGEga2VlcCBhbGl2ZSB0byB2ZXJpZnkgdGhlIFNUQSBpcyBzdGlsbCBhc3NvY2lhdGVkLiBJZiB0aGUgU1RBIGRvZXMgQUNLCisJICogdGhlIGRhdGEtbnVsbCwgb3IgaWYgdGhlIGRhdGEtbnVsbCBpcyBidWZmZXJlZCBhbmQgdGhlIFNUQSBkb2VzIG5vdAorCSAqIHJldHJpZXZlIGl0LCB0aGUgU1RBIHdpbGwgYmUgY29uc2lkZXJlZCB1bnJlc3BvbnNpdmUgKHNlZQorCSAqIFdNSV9WREVWX0FQX0tFRVBBTElWRV9NQVhfVU5SRVNQT05TSVZFX1RJTUVfU0VDUykuICovCisJV01JX1ZERVZfUEFSQU1fQVBfS0VFUEFMSVZFX01BWF9JRExFX0lOQUNUSVZFX1RJTUVfU0VDUywKKworCS8qIEFuIGFzc29jaWF0ZWQgU1RBIGlzIGNvbnNpZGVyZWQgdW5yZXNwb25zaXZlIGlmIHRoZXJlIGlzIG5vIHJlY2VudAorCSAqIFRYL1JYIGFjdGl2aXR5IGFuZCBkb3dubGluayBmcmFtZXMgYXJlIGJ1ZmZlcmVkIGZvciBpdC4gT25jZSBhIFNUQQorCSAqIGV4Y2VlZHMgdGhlIG1heGltdW0gdW5yZXNwb25zaXZlIHRpbWUsIHRoZSBBUCB3aWxsIHNlbmQgYQorCSAqIFdNSV9TVEFfS0lDS09VVCBldmVudCB0byB0aGUgaG9zdCBzbyB0aGUgU1RBIGNhbiBiZSBkZWxldGVkLiAqLworCVdNSV9WREVWX1BBUkFNX0FQX0tFRVBBTElWRV9NQVhfVU5SRVNQT05TSVZFX1RJTUVfU0VDUywKKworCS8qIEVuYWJsZSBOQVdEUyA6IE1DQVNUIElOU1BFQ1QgRW5hYmxlLCBOQVdEUyBGbGFnIHNldCAqLworCVdNSV9WREVWX1BBUkFNX0FQX0VOQUJMRV9OQVdEUywKKwkvKiogRW5hYmxlL0Rpc2FibGUgUlRTLUNUUyAqLworCVdNSV9WREVWX1BBUkFNX0VOQUJMRV9SVFNDVFMsCisJLyogRW5hYmxlIFRYQkZlZS9lciAqLworCVdNSV9WREVWX1BBUkFNX1RYQkYsCisKKwkvKipTZXQgcGFja2V0IHBvd2VyIHNhdmUgKi8KKwlXTUlfVkRFVl9QQVJBTV9QQUNLRVRfUE9XRVJTQVZFLAorCisJLyoqRHJvcHMgdW4tZW5jcnlwdGVkIHBhY2tldHMgaWYgYW55IHJlY2VpdmVkIGluIGFuIGVuY3J5dGVkIGNvbm5lY3Rpb24KKwkgKiBvdGhlcndpc2UgZm9yd2FyZHMgdG8gaG9zdAorCSAqLworCVdNSV9WREVWX1BBUkFNX0RST1BfVU5FTkNSWSwKKworCS8qCisJICogU2V0IFRYIGVuY2FwIHR5cGUuCisJICoKKwkgKiBlbnVtIHdtaV9wa3RfdHlwZSBpcyB0byBiZSB1c2VkIGFzIHRoZSBwYXJhbWV0ZXIKKwkgKiBzcGVjaWZ5aW5nIHRoZSBlbmNhcCB0eXBlLgorCSAqLworCVdNSV9WREVWX1BBUkFNX1RYX0VOQ0FQX1RZUEUsCisKKwkvKgorCSAqIFRyeSB0byBkZXRlY3Qgc3RhdGlvbnMgdGhhdCB3b2tlLXVwIGFuZCBleGl0ZWQgcG93ZXIgc2F2ZSBidXQgZGlkIG5vdAorCSAqIHN1Y2Nlc3NmdWxseSB0cmFuc21pdCBkYXRhLW51bGwgd2l0aCBQTT0wIHRvIEFQLiBXaGVuIHRoaXMgaGFwcGVucywKKwkgKiBTVEEgYW5kIEFQIHBvd2VyIHNhdmUgc3RhdGUgYXJlIG91dC1vZi1zeW5jLiBVc2UgYnVmZmVyZWQgYnV0CisJICogdW5kZWxpdmVyZWQgTVNEVSB0byB0aGUgU1RBIGFzIGEgaGludCB0aGF0IHRoZSBTVEEgaXMgcmVhbGx5IGF3YWtlCisJICogYW5kIGV4cGVjdGluZyBub3JtYWwgQVNBUCBkZWxpdmVyeSwgcmF0aGVyIHRoYW4gcmV0cmlldmluZyBCVSB3aXRoCisJICogUFMtUG9sbCwgVS1BUFNEIHRyaWdnZXIsIGV0Yy4KKwkgKgorCSAqIDAgZGlzYWJsZXMgb3V0LW9mLXN5bmMgZGV0ZWN0aW9uLiBNYXhpbXVtIHRpbWUgaXMgMjU1IHNlY29uZHMuCisJICovCisJV01JX1ZERVZfUEFSQU1fQVBfREVURUNUX09VVF9PRl9TWU5DX1NMRUVQSU5HX1NUQV9USU1FX1NFQ1MsCisKKwkvKiBFbmFibGUvRGlzYWJsZSBlYXJseSByeCBkeW5hbWljIGFkanVzdCBmZWF0dXJlLgorCSAqIEVhcmx5LXJ4IGR5bmFtaWMgYWRqdXN0IGlzIGEgYWR2YW5jZSBwb3dlciBzYXZlIGZlYXR1cmUuCisJICogRWFybHktcnggaXMgYSB3YWtldXAgZHVyYXRpb24gYmVmb3JlIGV4YWN0IFRCVFQsd2hpY2ggaXMgZGVlbWVkIG5lY2Vzc2FyeSB0byBwcm92aWRlIGEgY3VzaGlvbiBmb3IgdmFyaW91cworCSAqIHRpbWluZyBkaXNjcmVwYW5jaWVzIGluIHRoZSBzeXN0ZW0uCisJICogSW4gY3VycmVudCBjb2RlIGJyYW5jaCwgdGhlIGR1cmF0aW9uIGlzIHNldCB0byBhIHZlcnkgY29uc2VydmF0aXZlIGZpeCB2YWx1ZSB0byBtYWtlIHN1cmUgdGhlIGRyaWZ0IGltcGFjdCBpcyBtaW5pbXVtLgorCSAqIFRoZSBmaXggZWFybHktdHggd2lsbCByZXN1bHQgaW4gdGhlIHVubmVzc2FyeSBwb3dlciBjb25zdW1lLCBzbyBhIGR5bmFtaWMgZWFybHktcnggYWRqdXN0IGFsZ29yaXRobSBjYW4gYmUgZGVzaWduZWQKKwkgKiBwcm9wZXJseSB0byBtaW5pbXVtIHRoZSBwb3dlciBjb25zdW1lLiovCisJV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfQURKVVNUX0VOQUJMRSwKKworCS8qIHNldCB0YXJnZXQgYm1pc3MgbnVtYmVyIHBlciBzYW1wbGUgY3ljbGUgaWYgYm1pc3MgYWRqdXN0IHdhcyBjaG9zZW4uCisJICogSW4gdGhpcyBhZGp1c3QgcG9saWN5LGVhcmx5LXJ4IGlzIGFkanVzdGVkIGJ5IGNvbXBhcmluZyB0aGUgY3VycmVudCBibWlzcyByYXRlIHRvIHRhcmdldCBibWlzcyByYXRlCisJICogd2hpY2ggY2FuIGJlIHNldCBieSB1c2VyIHRocm91Z2ggV01JIGNvbW1hbmQuCisJICovCisJV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfVEdUX0JNSVNTX05VTSwKKworCS8qIHNldCBzYW1wbGUgY3ljbGUoaW4gdGhlIHVuaXQgb2YgYmVhY29uIGludGVydmFsKSBpZiBibWlzcyBhZGp1c3Qgd2FzIGNob3NlbiAqLworCVdNSV9WREVWX1BBUkFNX0VBUkxZX1JYX0JNSVNTX1NBTVBMRV9DWUNMRSwKKworCS8qIHNldCBzbG9wX3N0ZXAgKi8KKwlXTUlfVkRFVl9QQVJBTV9FQVJMWV9SWF9TTE9QX1NURVAsCisKKwkvKiBzZXQgaW5pdCBzbG9wICovCisJV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfSU5JVF9TTE9QLAorCisJLyogcGF1c2UgYWRqdXN0IGVuYWJsZS9kaXNhYmxlICovCisJV01JX1ZERVZfUEFSQU1fRUFSTFlfUlhfQURKVVNUX1BBVVNFLAorCisJLyogU2V0IGNoYW5uZWwgcHdyIGxpbWl0IHZhbHVlIG9mIHRoZSB2ZGV2IHRoZSBtaW5pbWFsIHZhbHVlIG9mIGFsbAorCSAqIHZkZXZzIG9wZXJhdGluZyBvbiB0aGlzIGNoYW5uZWwgd2lsbCBiZSBzZXQgYXMgY2hhbm5lbCB0eCBwb3dlcgorCSAqIGxpbWl0LCB3aGljaCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSByYXRlYXJyYXkKKwkgKi8KKwlXTUlfVkRFVl9QQVJBTV9UWF9QV1JMSU1JVCwKKworCS8qIHNldCB0aGUgY291bnQgb2Ygc25yIHZhbHVlIGZvciBjYWxjdWxhdGlvbiBpbiBzbnIgbW9uaXRvciAqLworCVdNSV9WREVWX1BBUkFNX1NOUl9OVU1fRk9SX0NBTCwKKworCS8qKiBSb2FtaW5nIG9mZmxvYWQgKi8KKwlXTUlfVkRFVl9QQVJBTV9ST0FNX0ZXX09GRkxPQUQsCisKKwkvKiogRW5hYmxlIExlYWRlciByZXF1ZXN0IFJYIGZ1bmN0aW9uYWxpdHkgZm9yIFJNQyAqLworCVdNSV9WREVWX1BBUkFNX0VOQUJMRV9STUMsCisKKwkvKiBJQlNTIGRvZXMgbm90IGhhdmUgZGVhdXRoL2Rpc2Fzc29jLCB2ZGV2IGhhcyB0byBkZXRlY3QgcGVlciBnb25lIGV2ZW50CisJICogYnkgaGltc2VsZi4gSWYgdGhlIGJlYWNvbiBsb3N0IHRpbWUgZXhjZWVkIHRoaXMgdGhyZXNob2xkLCB0aGUgcGVlciBpcworCSAqIHRob3VnaHQgdG8gYmUgZ29uZS4gKi8KKwlXTUlfVkRFVl9QQVJBTV9JQlNTX01BWF9CQ05fTE9TVF9NUywKKworCS8qKiBtYXggcmF0ZSBpbiBrcGJzLCB0cmFuc21pdCByYXRlIGNhbid0IGdvIGJleW9uZCBpdCAqLworCVdNSV9WREVWX1BBUkFNX01BWF9SQVRFLAorCisJLyogZW5hYmxlL2Rpc2FibGUgZHJpZnQgc2FtcGxlLiAwOiBkaXNhYmxlOyAxOiBjbGtfZHJpZnQ7IDI6IGFwX2RyaWZ0OyAzIGJvdGggY2xrIGFuZCBhcCBkcmlmdCAqLworCVdNSV9WREVWX1BBUkFNX0VBUkxZX1JYX0RSSUZUX1NBTVBMRSwKKwkvKiBzZXQgVHggZmFpbHVyZSBjb3VudCB0aHJlc2hvbGQgZm9yIHRoZSB2ZGV2ICovCisJV01JX1ZERVZfUEFSQU1fU0VUX0lCU1NfVFhfRkFJTF9DTlRfVEhSLAorCisJLyogc2V0IGVidCByZXN5bmMgdGltZW91dCB2YWx1ZSwgaW4gdGhlIHVuaXQgb2YgVFUgKi8KKwlXTUlfVkRFVl9QQVJBTV9FQlRfUkVTWU5DX1RJTUVPVVQsCisKKwkvKiBFbmFibGUgQWdncmVnYXRpb24gU3RhdGUgVHJpZ2dlciBFdmVudCAqLworCVdNSV9WREVWX1BBUkFNX0FHR1JfVFJJR19FVkVOVF9FTkFCTEUsCisKKwkvKiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciBJQlNTIHN0YXRpb24gY2FuIGVudGVyIGludG8gcG93ZXIgc2F2ZQorCSAqIG1vZGUgYnkgc2VuZGluZyBOdWxsIGZyYW1lICh3aXRoIFBNPTEpLiBXaGVuIG5vdCBhbGxvd2VkLCBJQlNTIHN0YXRpb24gaGFzIHRvIHN0YXkKKwkgKiBhd2FrZSBhbGwgdGhlIHRpbWUgYW5kIHNob3VsZCBuZXZlciBzZXQgUE09MSBpbiBpdHMgdHJhbnNtaXR0ZWQgZnJhbWVzLgorCSAqIFRoaXMgcGFyYW1ldGVyIGlzIG1lYW5pbmdmdWwvdmFsaWQgb25seSB3aGVuIFdNSV9WREVWX1BBUkFNX0FUSU1fV0lORE9XX0xFTkdUSAorCSAqIGlzIG5vbi16ZXJvLiAqLworCVdNSV9WREVWX1BBUkFNX0lTX0lCU1NfUE9XRVJfU0FWRV9BTExPV0VELAorCisJLyogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHRoaXMgc3RhdGlvbiBjYW4gZW50ZXIgaW50byBwb3dlciBjb2xsYXBzZQorCSAqIGZvciB0aGUgcmVtYWluaW5nIGJlYWNvbiBpbnRlcnZhbCBhZnRlciB0aGUgQVRJTSB3aW5kb3cuCisJICogVGhpcyBwYXJhbWV0ZXIgaXMgbWVhbmluZ2Z1bC92YWxpZCBvbmx5IHdoZW4gV01JX1ZERVZfUEFSQU1fSVNfSUJTU19QT1dFUl9TQVZFX0FMTE9XRUQKKwkgKiBpcyBzZXQgdG8gdHJ1ZS4gKi8KKwlXTUlfVkRFVl9QQVJBTV9JU19QT1dFUl9DT0xMQVBTRV9BTExPV0VELAorCisJLyogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgSUJTUyBzdGF0aW9uIGV4aXQgcG93ZXIgc2F2ZSBtb2RlIGFuZAorCSAqIGVudGVyIHBvd2VyIGFjdGl2ZSBzdGF0ZSAoYnkgc2VuZGluZyBOdWxsIGZyYW1lIHdpdGggUE09MCBpbiB0aGUgaW1tZWRpYXRlIEFUSU0gV2luZG93KQorCSAqIHdoZW5ldmVyIHRoZXJlIGlzIGEgVFgvUlggYWN0aXZpdHkuICovCisJV01JX1ZERVZfUEFSQU1fSVNfQVdBS0VfT05fVFhSWF9FTkFCTEVELAorCisJLyogSWYgQXdha2Ugb24gVFgvUlggYWN0aXZpdHkgaXMgZW5hYmxlZCwgdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzCisJICogdGhlIGRhdGEgaW5hY3Rpdml0eSB0aW1lIGluIG51bWJlciBvZiBiZWFjb24gaW50ZXJ2YWxzIGFmdGVyIHdoaWNoCisJICogSUJTUyBzdGF0aW9uIHJlZW50ZXJzIHBvd2VyIHNhdmUgYnkgc2VuZGluZyBOdWxsIGZyYW1lIHdpdGggUE09MS4gKi8KKwlXTUlfVkRFVl9QQVJBTV9JTkFDVElWSVRZX0NOVCwKKworCS8qIEluYWN0aXZpdHkgdGltZSBpbiBtc2VjIGFmdGVyIHdoaWNoIFRYIFNlcnZpY2UgUGVyaW9kIChTUCkgaXMKKwkgKiB0ZXJtaW5hdGVkIGJ5IHNlbmRpbmcgYSBRb3MgTnVsbCBmcmFtZSB3aXRoIEVPU1AuCisJICogSWYgdmFsdWUgaXMgMCwgVFggU1AgaXMgdGVybWluYXRlZCB3aXRoIHRoZSBsYXN0IGJ1ZmZlcmVkIHBhY2tldCBpdHNlbGYKKwkgKiBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBpbmFjdGl2aXR5IHRpbWVvdXQuICovCisJV01JX1ZERVZfUEFSQU1fVFhTUF9FTkRfSU5BQ1RJVklUWV9USU1FX01TLAorCisJLyoqIERUSU0gcG9saWN5ICovCisJV01JX1ZERVZfUEFSQU1fRFRJTV9QT0xJQ1ksCisKKwkvKiBXaGVuIElCU1MgbmV0d29yayBpcyBpbml0aWFsaXplZCwgUFMtc3VwcG9ydGluZyBkZXZpY2UKKwkgKiBkb2VzIG5vdCBlbnRlciBwcm90b2NvbCBzbGVlcCBzdGF0ZSBkdXJpbmcgZmlyc3QKKwkgKiBXTUlfVkRFVl9QQVJBTV9JQlNTX1BTX1dBUk1VUF9USU1FX1NFQ1Mgc2Vjb25kcy4gKi8KKwlXTUlfVkRFVl9QQVJBTV9JQlNTX1BTX1dBUk1VUF9USU1FX1NFQ1MsCisKKwkvKiBFbmFibGUvRGlzYWJsZSAxIFJYIGNoYWluIHVzYWdlIGR1cmluZyB0aGUgQVRJTSB3aW5kb3cgKi8KKwlXTUlfVkRFVl9QQVJBTV9JQlNTX1BTXzFSWF9DSEFJTl9JTl9BVElNX1dJTkRPV19FTkFCTEUsCisJLyoqCisJICogUlggTGVhayB3aW5kb3cgaXMgdGhlIHRpbWUgZHJpdmVyIHdhaXRzIGJlZm9yZSBzaHV0dGluZyBkb3duCisJICogdGhlIHJhZGlvIG9yIHN3aXRjaGluZyB0aGUgY2hhbm5lbCBhbmQgYWZ0ZXIgcmVjZWl2aW5nIGFuIEFDSworCSAqIGZvciBhIGRhdGEgZnJhbWUgd2l0aCBQTSBiaXQgc2V0KQorCSAqLworCVdNSV9WREVWX1BBUkFNX1JYX0xFQUtfV0lORE9XLAorCisJLyoqCisJICogQXZlcmFnaW5nIGZhY3RvcigxNiBiaXQgdmFsdWUpIGlzIHVzZWQgaW4gdGhlIGNhbGN1bGF0aW9ucyB0bworCSAqIHBlcmZvcm0gYXZlcmFnaW5nIG9mIGRpZmZlcmVudCBsaW5rIGxldmVsIHN0YXRpc3RpY3MgbGlrZSBhdmVyYWdlCisJICogYmVhY29uIHNwcmVhZCBvciBhdmVyYWdlIG51bWJlciBvZiBmcmFtZXMgbGVha2VkCisJICovCisJV01JX1ZERVZfUEFSQU1fU1RBVFNfQVZHX0ZBQ1RPUiwKKwkvKgorCSAqIGRpc2Nvbm5lY3QgdGhyZXNob2xkLCBvbmNlIHRoZSBjb25zZWN1dGl2ZSBlcnJvciBmb3Igc3BlY2lmaWMgcGVlcgorCSAqIGV4Y2VlZCB0aGlzIHRocmVob2xkLCBGVyB3aWxsIHNlbmQga2lja291dCBldmVudCB0byBob3N0CisJICovCisJV01JX1ZERVZfUEFSQU1fRElTQ09OTkVDVF9USCwKKwkvKgorCSAqIFRoZSByYXRlX2NvZGUgb2YgUlRTX0NUUyBjaGFuZ2VkIGJ5IGhvc3QuIE5vdyBGVyBjYW4gc3VwcG9ydAorCSAqIG1vcmUgbm9uLUhUIHJhdGVzIHJhdGhlciB0aGFuIDFNYnBzIG9yIDZNYnBzICovCisJV01JX1ZERVZfUEFSQU1fUlRTQ1RTX1JBVEUsCisKKwkvKiogVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdXNpbmcgYSBsb25nIGR1cmF0aW9uIFJUUy1DVFMKKwkgKiBwcm90ZWN0aW9uIHdoZW4gYSBTQVAgZ29lcyBvZmYgY2hhbm5lbCBpbiBNQ0MgbW9kZSAqLworCVdNSV9WREVWX1BBUkFNX01DQ19SVFNDVFNfUFJPVEVDVElPTl9FTkFCTEUsCisKKwkvKgorCSAqIFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHVzaW5nIGEgYnJvYWRjYXN0IHByb2JlIHJlc3BvbnNlCisJICogdG8gaW5jcmVhc2UgdGhlIGRldGVjdGFiaWxpdHkgb2YgU0FQIGluIE1DQyBtb2RlCisJICovCisJV01JX1ZERVZfUEFSQU1fTUNDX0JST0FEQ0FTVF9QUk9CRV9FTkFCTEUsCit9IFdNSV9WREVWX1BBUkFNOworCisvKiBMZW5ndGggb2YgQVRJTSBXaW5kb3cgaW4gVFUgKi8KKyNkZWZpbmUgV01JX1ZERVZfUEFSQU1fQVRJTV9XSU5ET1dfTEVOR1RIIFdNSV9WREVWX1BBUkFNX0FUSU1fV0lORE9XCisKK2VudW0gd21pX3BrdF90eXBlIHsKKwlXTUlfUEtUX1RZUEVfUkFXID0gMCwKKwlXTUlfUEtUX1RZUEVfTkFUSVZFX1dJRkkgPSAxLAorCVdNSV9QS1RfVFlQRV9FVEhFUk5FVCA9IDIsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UOCBzdXR4YmZlZSA6IDEsIG11dHhiZmVlIDogMSwgc3V0eGJmZXIgOiAxLCBtdXR4YmZlciA6IDEsCisjaWYgZGVmaW5lZChBUjkwMEIpCisJdHhiX3N0c19jYXAgOiAzLCBpbXBsaWNpdF9iZiA6IDE7CisjZWxzZQorCXJlc2VydmVkIDogNDsKKyNlbmRpZgorfSB3bWlfdmRldl90eGJmX2VuOworCisvKiogVXB0byA4IGJpdHMgYXJlIGF2YWlsYWJsZSBmb3IgUm9hbWluZyBtb2R1bGUgdG8gYmUgc2VudCBhbG9uZyB3aXRoCisgICBXTUlfVkRFVl9QQVJBTV9ST0FNX0ZXX09GRkxPQUQgV01JX1ZERVZfUEFSQU0gKiovCisvKiBFbmFibGUgUm9hbWluZyBGVyBvZmZsb2FkIExGUjEuNS9MRlIyLjAgaW1wbGVtZW50YXRpb24gKi8KKyNkZWZpbmUgV01JX1JPQU1fRldfT0ZGTE9BRF9FTkFCTEVfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisvKiBFbmFibGUgUm9hbWluZyBtb2R1bGUgaW4gRlcgdG8gZG8gc2NhbiBiYXNlZCBvbiBGaW5hbCBCTUlTUyAqLworI2RlZmluZSBXTUlfUk9BTV9CTUlTU19GSU5BTF9TQ0FOX0VOQUJMRV9GTEFHICAgICAgICAgICAgICAgICAgICAweDIKKworLyoqIHNsb3QgdGltZSBsb25nICovCisjZGVmaW5lIFdNSV9WREVWX1NMT1RfVElNRV9MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorLyoqIHNsb3QgdGltZSBzaG9ydCAqLworI2RlZmluZSBXTUlfVkRFVl9TTE9UX1RJTUVfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKy8qKiBwcmVhYmxiZSBsb25nICovCisjZGVmaW5lIFdNSV9WREVWX1BSRUFNQkxFX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorLyoqIHByZWFibGJlIHNob3J0ICovCisjZGVmaW5lIFdNSV9WREVWX1BSRUFNQkxFX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorCisvKiogdGhlIGRlZmluaXRpb24gb2YgZGlmZmVyZW50IFNUQVJUL1JFU1RBUlQgRXZlbnQgcmVzcG9uc2UgICovCit0eXBlZGVmIGVudW0geworCS8qIEV2ZW50IHJlc3Bvc2Ugb2YgU1RBUlQgQ01EICovCisJV01JX1ZERVZfU1RBUlRfUkVTUF9FVkVOVCA9IDAsCisJLyogRXZlbnQgcmVzcG9zZSBvZiBSRVNUQVJUIENNRCAqLworCVdNSV9WREVWX1JFU1RBUlRfUkVTUF9FVkVOVCwKK30gV01JX1NUQVJUX0VWRU5UX1BBUkFNOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9zdGFydF9yZXNwb25zZV9ldmVudF9maXhlZF9wYXJhbSAgKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHJlcXVlc3RvciBpZCB0aGF0IHJlcXVlc3RlZCB0aGUgVkRFViBzdGFydCByZXF1ZXN0ICovCisJQV9VSU5UMzIgcmVxdWVzdG9yX2lkOworCS8qIFJlc3Bvc2Ugb2YgRXZlbnQgdHlwZSBTVEFSVC9SRVNUQVJUICovCisJV01JX1NUQVJUX0VWRU5UX1BBUkFNIHJlc3BfdHlwZTsKKwkvKiogc3RhdHVzIG9mIHRoZSByZXNwb25zZSAqLworCUFfVUlOVDMyIHN0YXR1czsKKwkvKiogVmRldiBjaGFpbiBtYXNrICovCisJQV9VSU5UMzIgY2hhaW5fbWFzazsKKwkvKiogVmRldiBtaW1vIHBvd2VyIHNhdmUgbW9kZSAqLworCUFfVUlOVDMyIHNtcHNfbW9kZTsKKwkvKiogbWFjX2lkIGZpZWxkIGNvbnRhaW5zIHRoZSBNQUMgaWRlbnRpZmllciB0aGF0IHRoZSBWREVWIGlzIGJvdW5kIHRvLiBUaGUgdmFsaWQgcmFuZ2UgaXMgMCB0byAobnVtX21hY3MtMSkuICovCisJQV9VSU5UMzIgbWFjX2lkOworCS8qKiBDb25maWd1cmVkIFRyYW5zbWl0IFN0cmVhbXMgKiovCisJQV9VSU5UMzIgY2ZnZF90eF9zdHJlYW1zOworCS8qKiBDb25maWd1cmVkIFJlY2VpdmUgU3RyZWFtcyAqKi8KKwlBX1VJTlQzMiBjZmdkX3J4X3N0cmVhbXM7Cit9IHdtaV92ZGV2X3N0YXJ0X3Jlc3BvbnNlX2V2ZW50X2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfdmRldl9zdG9wcGVkX2V2ZW50X2ZpeGVkX3BhcmFtICAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKK30gd21pX3ZkZXZfc3RvcHBlZF9ldmVudF9maXhlZF9wYXJhbTsKKworLyoqIGNvbW1vbiBzdHJ1Y3R1cmUgdXNlZCBmb3Igc2ltcGxlIGV2ZW50cyAoc3RvcHBlZCwgcmVzdW1lX3JlcSwgc3RhbmRieSByZXNwb25zZSkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIHdvdWxkIGJlIGVxdWl2YWxlbnQgdG8gYWN0dWFsIGV2ZW50ICAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKK30gd21pX3ZkZXZfc2ltcGxlX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiogVkRFViBzdGFydCByZXNwb25zZSBzdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgV01JX1ZERVZfU1RBUlRfUkVTUE9OU0VfU1RBVFVTX1NVQ0NFU1MgMHgwICAgICAgICAgIC8qKiBWREVWIHN1Y2Nlc2Z1bGx5IHN0YXJ0ZWQgKi8KKyNkZWZpbmUgV01JX1ZERVZfU1RBUlRfUkVTUE9OU0VfSU5WQUxJRF9WREVWSUQgIDB4MSAgICAgICAgICAvKiogcmVxdWVzdGVkIFZERVYgbm90IGZvdW5kICovCisjZGVmaW5lIFdNSV9WREVWX1NUQVJUX1JFU1BPTlNFX05PVF9TVVBQT1JURUQgIDB4MiAgICAgICAgICAvKiogdW5zdXBwb3J0ZWQgVkRFViBjb21iaW5hdGlvbiAqLworCisvKiogQmVhY29uIHByb2Nlc3NpbmcgcmVsYXRlZCBjb21tYW5kIGFuZCBldmVudCBzdHJ1Y3R1cmVzICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2Jjbl90eF9oZHIgKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHhtaXQgcmF0ZSAqLworCUFfVUlOVDMyIHR4X3JhdGU7CisJLyoqIHhtaXQgcG93ZXIgKi8KKwlBX1VJTlQzMiB0eFBvd2VyOworCS8qKiBiZWFjb24gYnVmZmVyIGxlbmd0aCBpbiBieXRlcyAqLworCUFfVUlOVDMyIGJ1Zl9sZW47CisJLyogVGhpcyBUTFYgaXMgZm9sbG93ZWQgYnkgYXJyYXkgb2YgYnl0ZXM6CisJICogLy8gYmVhY29uIGZyYW1lIGJ1ZmZlcgorCSAqICAgQV9VSU5UOCBidWZwW107CisJICovCit9IHdtaV9iY25fdHhfaGRyOworCisvKiBCZWFjb24gZmlsdGVyICovCisjZGVmaW5lIFdNSV9CQ05fRklMVEVSX0FMTCAgIDAgIC8qIEZpbHRlciBhbGwgYmVhY29ucyAqLworI2RlZmluZSBXTUlfQkNOX0ZJTFRFUl9OT05FICAxICAvKiBQYXNzIGFsbCBiZWFjb25zICovCisjZGVmaW5lIFdNSV9CQ05fRklMVEVSX1JTU0kgIDIgIC8qIFBhc3MgQmVhY29ucyBSU1NJID49IFJTU0kgdGhyZXNob2xkICovCisjZGVmaW5lIFdNSV9CQ05fRklMVEVSX0JTU0lEIDMgIC8qIFBhc3MgQmVhY29ucyB3aXRoIG1hdGNoaW5nIEJTU0lEICovCisjZGVmaW5lIFdNSV9CQ05fRklMVEVSX1NTSUQgIDQgIC8qIFBhc3MgQmVhY29ucyB3aXRoIG1hdGNoaW5nIFNTSUQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBGaWx0ZXIgSUQgKi8KKwlBX1VJTlQzMiBiY25fZmlsdGVyX2lkOworCS8qKiBGaWx0ZXIgdHlwZSAtIHdtaV9iY25fZmlsdGVyICovCisJQV9VSU5UMzIgYmNuX2ZpbHRlcjsKKwkvKiogQnVmZmVyIGxlbiAqLworCUFfVUlOVDMyIGJjbl9maWx0ZXJfbGVuOworCS8qKiBGaWx0ZXIgaW5mbyAodGhyZXNob2xkLCBCU1NJRCwgUlNTSSkgKi8KKwlBX1VJTlQ4ICpiY25fZmlsdGVyX2J1ZjsKK30gd21pX2Jjbl9maWx0ZXJfcnhfY21kOworCisvKiogQ2FwYWJpbGl0aWVzIGFuZCBJRXMgdG8gYmUgcGFzc2VkIHRvIGZpcm13YXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2Jjbl9wcmJfaW5mbyAqLworCS8qKiBDYXBhYmlsaXRpZXMgKi8KKwlBX1VJTlQzMiBjYXBzOworCS8qKiBFUlAgaW5mbyAqLworCUFfVUlOVDMyIGVycDsKKwkvKiogQWR2YW5jZWQgY2FwYWJpbGl0aWVzICovCisJLyoqIEhUIGNhcGFiaWxpdGllcyAqLworCS8qKiBIVCBJbmZvICovCisJLyoqIGlic3NfZGZzICovCisJLyoqIHdwYSBJbmZvICovCisJLyoqIHJzbiBJbmZvICovCisJLyoqIHJybSBpbmZvICovCisJLyoqIGF0aF9leHQgKi8KKwkvKiogYXBwIElFICovCit9IHdtaV9iY25fcHJiX2luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2Jjbl90bXBsX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogVElNIElFIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlbXBsYXRlLiAqLworCUFfVUlOVDMyIHRpbV9pZV9vZmZzZXQ7CisJLyoqIGJlYWNvbiBidWZmZXIgbGVuZ3RoLiBkYXRhIGlzIGluIFRMViBkYXRhW10gKi8KKwlBX1VJTlQzMiBidWZfbGVuOworCS8qCisJICogVGhlIFRMVnMgZm9sbG93czoKKwkgKiAgICB3bWlfYmNuX3ByYl9pbmZvIGJjbl9wcmJfaW5mbzsgLy9iZWFjb24gcHJvYmUgY2FwYWJpbGl0aWVzIGFuZCBJRXMKKwkgKiAgICBBX1VJTlQ4ICBkYXRhW107IC8vVmFyaWFibGUgbGVuZ3RoIGRhdGEKKwkgKi8KK30gd21pX2Jjbl90bXBsX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgIC8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcHJiX3RtcGxfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBiZWFjb24gYnVmZmVyIGxlbmd0aC4gZGF0YSBpcyBpbiBUTFYgZGF0YVtdICovCisJQV9VSU5UMzIgYnVmX2xlbjsKKwkvKgorCSAqIFRoZSBUTFZzIGZvbGxvd3M6CisJICogICAgd21pX2Jjbl9wcmJfaW5mbyBiY25fcHJiX2luZm87IC8vYmVhY29uIHByb2JlIGNhcGFiaWxpdGllcyBhbmQgSUVzCisJICogICAgQV9VSU5UOCAgZGF0YVtdOyAvL1ZhcmlhYmxlIGxlbmd0aCBkYXRhCisJICovCit9IHdtaV9wcmJfdG1wbF9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX29mZmxvYWRfYmNuX3R4X3N0YXR1c19ldmVudF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIGJjbiB0eCBzdGF0dXMsIHZhbHVlcyBkZWZpbmVkIGluIGVudW0gV01JX0ZSQU1FX1RYX1NUQVRVUyAqLworCUFfVUlOVDMyIHR4X3N0YXR1czsKK30gd21pX29mZmxvYWRfYmNuX3R4X3N0YXR1c19ldmVudF9maXhlZF9wYXJhbTsKKworZW51bSB3bWlfc3RhX3BzX21vZGUgeworCS8qKiBlbmFibGUgcG93ZXIgc2F2ZSBmb3IgdGhlIGdpdmVuIFNUQSBWREVWICovCisJV01JX1NUQV9QU19NT0RFX0RJU0FCTEVEID0gMCwKKwkvKiogZGlzYWJsZSBwb3dlciBzYXZlICBmb3IgYSBnaXZlbiBTVEEgVkRFViAqLworCVdNSV9TVEFfUFNfTU9ERV9FTkFCTEVEID0gMSwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgIC8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfc3RhX3Bvd2Vyc2F2ZV9tb2RlX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKworCS8qKiBQb3dlciBzYXZlIG1vZGUKKwkgKgorCSAqIChzZWUgZW51bSB3bWlfc3RhX3BzX21vZGUpCisJICovCisJQV9VSU5UMzIgc3RhX3BzX21vZGU7Cit9IHdtaV9zdGFfcG93ZXJzYXZlX21vZGVfY21kX2ZpeGVkX3BhcmFtOworCitlbnVtIHdtaV9jc2Ffb2ZmbG9hZF9lbiB7CisJV01JX0NTQV9PRkZMT0FEX0RJU0FCTEUgPSAwLAorCVdNSV9DU0FfT0ZGTE9BRF9FTkFCTEUgPSAxLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NzYV9vZmZsb2FkX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0gICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBjc2Ffb2ZmbG9hZF9lbmFibGU7Cit9IHdtaV9jc2Ffb2ZmbG9hZF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfY3NhX29mZmxvYWRfY2hhbnN3aXRjaF9jbWRfZml4ZWRfcGFyYW0gICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKgorCSAqIFRoZSBUTFZzIGZvbGxvd3M6CisJICogICAgd21pX2NoYW5uZWwgY2hhbjsKKwkgKi8KK30gd21pX2NzYV9vZmZsb2FkX2NoYW5zd2l0Y2hfY21kX2ZpeGVkX3BhcmFtOworLyoqCisgKiBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUgcG9saWN5IGZvciByZXRyaWV2aW5nIGZyYW1lcyBmcm9tIEFQIHdoaWxlIHRoZQorICogU1RBIGlzIGluIHNsZWVwIHN0YXRlLgorICoKKyAqIE9ubHkgdGFrZXMgYWZmZWN0IGlmIHRoZSBzdGFfcHNfbW9kZSBpcyBlbmFibGVkCisgKi8KK2VudW0gd21pX3N0YV9wc19wYXJhbV9yeF93YWtlX3BvbGljeSB7CisJLyogV2FrZSB1cCB3aGVuIGV2ZXIgdGhlcmUgaXMgYW4gIFJYIGFjdGl2aXR5IG9uIHRoZSBWREVWLiBJbiB0aGlzIG1vZGUKKwkgKiB0aGUgUG93ZXIgc2F2ZSBTTShzdGF0ZSBtYWNoaW5lKSB3aWxsIGNvbWUgb3V0IG9mIHNsZWVwIGJ5IGVpdGhlcgorCSAqIHNlbmRpbmcgbnVsbCBmcmFtZSAob3IpIGEgZGF0YSBmcmFtZSAod2l0aCBQUz09MCkgaW4gcmVzcG9uc2UgdG8gVElNCisJICogYml0IHNldCBpbiB0aGUgcmVjZWl2ZWQgYmVhY29uIGZyYW1lIGZyb20gQVAuCisJICovCisJV01JX1NUQV9QU19SWF9XQUtFX1BPTElDWV9XQUtFID0gMCwKKworCS8qIEhlcmUgdGhlIHBvd2VyIHNhdmUgc3RhdGUgbWFjaGluZSB3aWxsIG5vdCB3YWtldXAgaW4gcmVzcG9uc2UgdG8gVElNCisJICogYml0LCBpbnN0ZWFkIGl0IHdpbGwgc2VuZCBhIFBTUE9MTCAob3IpIFVBU1BEIHRyaWdnZXIgYmFzZWQgb24gVUFQU0QKKwkgKiBjb25maWd1cmF0aW9uIHNldHVwIGJ5IFdNSVNFVF9QU19TRVRfVUFQU0QgIFdNSSBjb21tYW5kLiAgV2hlbiBhbGwKKwkgKiBhY2Nlc3MgY2F0ZWdvcmllcyBhcmUgZGVsaXZlcnktZW5hYmxlZCwgdGhlIHN0YXRpb24gd2lsbCBzZW5kIGEgVUFQU0QKKwkgKiB0cmlnZ2VyIGZyYW1lLCBvdGhlcndpc2UgaXQgd2lsbCBzZW5kIGEgUFMtUG9sbC4KKwkgKi8KKwlXTUlfU1RBX1BTX1JYX1dBS0VfUE9MSUNZX1BPTExfVUFQU0QgPSAxLAorfTsKKworLyoqIE51bWJlciBvZiB0eCBmcmFtZXMvYmVhY29uICB0aGF0IGNhdXNlIHRoZSBwb3dlciBzYXZlIFNNIHRvIHdha2UgdXAuCisgKgorICogVmFsdWUgMSBjYXVzZXMgdGhlIFNNIHRvIHdha2UgdXAgZm9yIGV2ZXJ5IFRYLiBWYWx1ZSAwIGhhcyBhIHNwZWNpYWwKKyAqIG1lYW5pbmcsIEl0IHdpbGwgY2F1c2UgdGhlIFNNIHRvIG5ldmVyIHdha2UgdXAuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50CisgKiB0byBrZWVwIHRoZSBzeXN0ZW0gdG8gc2xlZXAgYWxsIHRoZSB0aW1lIGZvciBzb21lIGtpbmQgb2YgdGVzdCBtb2RlIC4gaG9zdAorICogY2FuIGNoYW5nZSB0aGlzIHBhcmFtZXRlciBhbnkgdGltZS4gIEl0IHdpbGwgYWZmZWN0IGF0IHRoZSBuZXh0IHR4IGZyYW1lLgorICovCitlbnVtIHdtaV9zdGFfcHNfcGFyYW1fdHhfd2FrZV90aHJlc2hvbGQgeworCVdNSV9TVEFfUFNfVFhfV0FLRV9USFJFU0hPTERfTkVWRVIgPSAwLAorCVdNSV9TVEFfUFNfVFhfV0FLRV9USFJFU0hPTERfQUxXQVlTID0gMSwKKworCS8qIFZhbHVlcyBncmVhdGVyIHRoYW4gb25lIGluZGljYXRlIHRoYXQgbWFueSBUWCBhdHRlbXB0cyBwZXIgYmVhY29uCisJICogaW50ZXJ2YWwgYmVmb3JlIHRoZSBTVEEgd2lsbCB3YWtlIHVwCisJICovCit9OworCisvKioKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBQUy1Qb2xsIGZyYW1lcyB0aGUgRlcgd2lsbCBzZW5kIGluIHJlc3BvbnNlIHRvCisgKiB0cmFmZmljIGFkdmVydGlzZWQgaW4gVElNIGJlZm9yZSB3YWtpbmcgdXAgKGJ5IHNlbmRpbmcgYSBudWxsIGZyYW1lIHdpdGggUFMKKyAqID0gMCkuIFZhbHVlIDAgaGFzIGEgc3BlY2lhbCBtZWFuaW5nOiB0aGVyZSBpcyBubyBtYXhpbXVtIGNvdW50IGFuZCB0aGUgRlcKKyAqIHdpbGwgc2VuZCBhcyBtYW55IFBTLVBvbGwgYXMgYXJlIG5lY2Vzc2FyeSB0byByZXRyaWV2ZSBidWZmZXJlZCBCVS4gVGhpcworICogcGFyYW1ldGVyIGlzIHVzZWQgd2hlbiB0aGUgUlggd2FrZSBwb2xpY3kgaXMKKyAqIFdNSV9TVEFfUFNfUlhfV0FLRV9QT0xJQ1lfUE9MTF9VQVBTRCBhbmQgaWdub3JlZCB3aGVuIHRoZSBSWCB3YWtlCisgKiBwb2xpY3kgaXMgV01JX1NUQV9QU19SWF9XQUtFX1BPTElDWV9XQUtFLgorICovCitlbnVtIHdtaV9zdGFfcHNfcGFyYW1fcHNwb2xsX2NvdW50IHsKKwlXTUlfU1RBX1BTX1BTUE9MTF9DT1VOVF9OT19NQVggPSAwLAorCS8qIFZhbHVlcyBncmVhdGVyIHRoYW4gMCBpbmRpY2F0ZSB0aGUgbWF4aW11bSBudW1lciBvZiBQUy1Qb2xsIGZyYW1lcyBGVworCSAqIHdpbGwgc2VuZCBiZWZvcmUgd2FraW5nIHVwLgorCSAqLworfTsKKworLyoKKyAqIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBkZWxpdmVyeSBhbmQgdHJpZ2dlciBlbmFibGVkIHN0YXRlIGZvciBldmVyeSBBQy4KKyAqIFRoaXMgaXMgdGhlIG5lZ290aWF0ZWQgc3RhdGUgd2l0aCBBUC4gVGhlIGhvc3QgTUxNRSBuZWVkcyB0byBzZXQgdGhpcyBiYXNlZAorICogb24gQVAgY2FwYWJpbGl0eSBhbmQgdGhlIHN0YXRlIFNldCBpbiB0aGUgYXNzb2NpYXRpb24gcmVxdWVzdCBieSB0aGUKKyAqIHN0YXRpb24gTUxNRS5Mb3dlciA4IGJpdHMgb2YgdGhlIHZhbHVlIHNwZWNpZnkgdGhlIFVBUFNEIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgV01JX1VBUFNEX0FDX1RZUEVfREVMSSAwCisjZGVmaW5lIFdNSV9VQVBTRF9BQ19UWVBFX1RSSUcgMQorCisjZGVmaW5lIFdNSV9VQVBTRF9BQ19CSVRfTUFTSyhhYyx0eXBlKSAodHlwZSA9PSAgV01JX1VBUFNEX0FDX1RZUEVfREVMSSkgPyAoMTw8KGFjPDwxKSkgOiAoMTw8KChhYzw8MSkrMSkpCisKK2VudW0gd21pX3N0YV9wc19wYXJhbV91YXBzZCB7CisJV01JX1NUQV9QU19VQVBTRF9BQzBfREVMSVZFUllfRU4gPSAoMSA8PCAwKSwKKwlXTUlfU1RBX1BTX1VBUFNEX0FDMF9UUklHR0VSX0VOID0gKDEgPDwgMSksCisJV01JX1NUQV9QU19VQVBTRF9BQzFfREVMSVZFUllfRU4gPSAoMSA8PCAyKSwKKwlXTUlfU1RBX1BTX1VBUFNEX0FDMV9UUklHR0VSX0VOID0gKDEgPDwgMyksCisJV01JX1NUQV9QU19VQVBTRF9BQzJfREVMSVZFUllfRU4gPSAoMSA8PCA0KSwKKwlXTUlfU1RBX1BTX1VBUFNEX0FDMl9UUklHR0VSX0VOID0gKDEgPDwgNSksCisJV01JX1NUQV9QU19VQVBTRF9BQzNfREVMSVZFUllfRU4gPSAoMSA8PCA2KSwKKwlXTUlfU1RBX1BTX1VBUFNEX0FDM19UUklHR0VSX0VOID0gKDEgPDwgNyksCit9OworCitlbnVtIHdtaV9zdGFfcG93ZXJzYXZlX3BhcmFtIHsKKwkvKioKKwkgKiBDb250cm9scyBob3cgZnJhbWVzIGFyZSByZXRyaWV2ZCBmcm9tIEFQIHdoaWxlIFNUQSBpcyBzbGVlcGluZworCSAqCisJICogKHNlZSBlbnVtIHdtaV9zdGFfcHNfcGFyYW1fcnhfd2FrZV9wb2xpY3kpCisJICovCisJV01JX1NUQV9QU19QQVJBTV9SWF9XQUtFX1BPTElDWSA9IDAsCisKKwkvKioKKwkgKiBUaGUgU1RBIHdpbGwgZ28gYWN0aXZlIGFmdGVyIHRoaXMgbWFueSBUWAorCSAqCisJICogKHNlZSBlbnVtIHdtaV9zdGFfcHNfcGFyYW1fdHhfd2FrZV90aHJlc2hvbGQpCisJICovCisJV01JX1NUQV9QU19QQVJBTV9UWF9XQUtFX1RIUkVTSE9MRCA9IDEsCisKKwkvKioKKwkgKiBOdW1iZXIgb2YgUFMtUG9sbCB0byBzZW5kIGJlZm9yZSBTVEEgd2FrZXMgdXAKKwkgKgorCSAqIChzZWUgZW51bSB3bWlfc3RhX3BzX3BhcmFtX3BzcG9sbF9jb3VudCkKKwkgKgorCSAqLworCVdNSV9TVEFfUFNfUEFSQU1fUFNQT0xMX0NPVU5UID0gMiwKKworCS8qKgorCSAqIFRYL1JYIGluYWN0aXZpdHkgdGltZSBpbiBtc2VjIGJlZm9yZSBnb2luZyB0byBzbGVlcC4KKwkgKgorCSAqIFRoZSBwb3dlciBzYXZlIFNNIHdpbGwgbW9uaXRvciB0eC9yeCBhY3Rpdml0eSBvbiB0aGUgVkRFViwgaWYgbm8KKwkgKiBhY3Rpdml0eSBmb3IgdGhlIHNwZWNpZmllZCBtc2VjIG9mIHRoZSBwYXJhbWV0ZXIgdGhlIFBvd2VyIHNhdmUgU00gd2lsbAorCSAqIGdvIHRvIHNsZWVwLgorCSAqLworCVdNSV9TVEFfUFNfUEFSQU1fSU5BQ1RJVklUWV9USU1FID0gMywKKworCS8qKgorCSAqIFNldCB1YXBzZCBjb25maWd1cmF0aW9uLgorCSAqCisJICogKHNlZSBlbnVtIHdtaV9zdGFfcHNfcGFyYW1fdWFwc2QpCisJICovCisJV01JX1NUQV9QU19QQVJBTV9VQVBTRCA9IDQsCisJLyoqCisJICogTnVtYmVyIG9mIFBTLVBvbGwgdG8gc2VuZCBiZWZvcmUgU1RBIHdha2VzIHVwIGluIFFQb3dlciBNb2RlCisJICovCisJV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfUFNQT0xMX0NPVU5UID0gNSwKKworCS8qKgorCSAqIEVuYWJsZSBRUG93ZXIKKwkgKi8KKwlXTUlfU1RBX1BTX0VOQUJMRV9RUE9XRVIgPSA2LAorCisJLyoqCisJICogTnVtYmVyIG9mIFRYIGZyYW1lcyBiZWZvcmUgdGhlIGVudGVyaW5nIHRoZSBBY3RpdmUgc3RhdGUKKwkgKi8KKwlXTUlfU1RBX1BTX1BBUkFNX1FQT1dFUl9NQVhfVFhfQkVGT1JFX1dBS0UgPSA3LAorCisJLyoqCisJICogUVBvd2VyIFNQRUMgUFNQT0xMIGludGVydmFsCisJICovCisJV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfU1BFQ19QU1BPTExfV0FLRV9JTlRFUlZBTCA9IDgsCisKKwkvKioKKwkgKiBNYXggU1BFQyBQU1BPTEwgdG8gYmUgc2VudCB3aGVuIHRoZSBQU1BPTEwgcmVzcG9uc2UgaGFzCisJICogbm8tZGF0YSBiaXQgc2V0CisJICovCisJV01JX1NUQV9QU19QQVJBTV9RUE9XRVJfU1BFQ19NQVhfU1BFQ19OT0RBVEFfUFNQT0xMID0gOSwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgIC8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfc3RhX3Bvd2Vyc2F2ZV9wYXJhbV9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHN0YXRpb24gcG93ZXIgc2F2ZSBwYXJhbWV0ZXIgKHNlZSBlbnVtIHdtaV9zdGFfcG93ZXJzYXZlX3BhcmFtKSAqLworCUFfVUlOVDMyIHBhcmFtOworCUFfVUlOVDMyIHZhbHVlOworfSB3bWlfc3RhX3Bvd2Vyc2F2ZV9wYXJhbV9jbWRfZml4ZWRfcGFyYW07CisKKy8qKiBObyBNSU1PIHBvd2VyIHNhdmUgKi8KKyNkZWZpbmUgV01JX1NUQV9NSU1PX1BTX01PREVfRElTQUJMRQorLyoqIG1pbW8gcG93ZXJzYXZlIG1vZGUgc3RhdGljKi8KKyNkZWZpbmUgV01JX1NUQV9NSU1PX1BTX01PREVfU1RBVElDCisvKiogbWltbyBwb3dlcnNhdmUgbW9kZSBkeW5hbWljICovCisjZGVmaW5lIFdNSV9TVEFfTUlNT19QU19NT0RFX0RZTkFNSQorCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBtaW1vIHBvd2Vyc2F2ZSBtb2RlIGFzIGRlZmluZWQgYWJvdmUgKi8KKwlBX1VJTlQzMiBtaW1vX3B3cnNhdmVfbW9kZTsKK30gd21pX3N0YV9taW1vX3BzX21vZGVfY21kOworCisvKiogVS1BUFNEIGNvbmZpZ3VyYXRpb24gb2YgcGVlciBzdGF0aW9uIGZyb20gKHJlKWFzc29jIHJlcXVlc3QgYW5kIFRTUEVDcyAqLworZW51bSB3bWlfYXBfcHNfcGFyYW1fdWFwc2QgeworCVdNSV9BUF9QU19VQVBTRF9BQzBfREVMSVZFUllfRU4gPSAoMSA8PCAwKSwKKwlXTUlfQVBfUFNfVUFQU0RfQUMwX1RSSUdHRVJfRU4gPSAoMSA8PCAxKSwKKwlXTUlfQVBfUFNfVUFQU0RfQUMxX0RFTElWRVJZX0VOID0gKDEgPDwgMiksCisJV01JX0FQX1BTX1VBUFNEX0FDMV9UUklHR0VSX0VOID0gKDEgPDwgMyksCisJV01JX0FQX1BTX1VBUFNEX0FDMl9ERUxJVkVSWV9FTiA9ICgxIDw8IDQpLAorCVdNSV9BUF9QU19VQVBTRF9BQzJfVFJJR0dFUl9FTiA9ICgxIDw8IDUpLAorCVdNSV9BUF9QU19VQVBTRF9BQzNfREVMSVZFUllfRU4gPSAoMSA8PCA2KSwKKwlXTUlfQVBfUFNfVUFQU0RfQUMzX1RSSUdHRVJfRU4gPSAoMSA8PCA3KSwKK307CisKKy8qKiBVLUFQU0QgbWF4aW11bSBzZXJ2aWNlIHBlcmlvZCBvZiBwZWVyIHN0YXRpb24gKi8KK2VudW0gd21pX2FwX3BzX3BlZXJfcGFyYW1fbWF4X3NwIHsKKwlXTUlfQVBfUFNfUEVFUl9QQVJBTV9NQVhfU1BfVU5MSU1JVEVEID0gMCwKKwlXTUlfQVBfUFNfUEVFUl9QQVJBTV9NQVhfU1BfMiA9IDEsCisJV01JX0FQX1BTX1BFRVJfUEFSQU1fTUFYX1NQXzQgPSAyLAorCVdNSV9BUF9QU19QRUVSX1BBUkFNX01BWF9TUF82ID0gMywKKworCS8qIGtlZXAgbGFzdCEgKi8KKwlNQVhfV01JX0FQX1BTX1BFRVJfUEFSQU1fTUFYX1NQLAorfTsKKworLyoqCisgKiBBUCBwb3dlciBzYXZlIHBhcmFtZXRlcgorICogU2V0IGEgcG93ZXIgc2F2ZSBzcGVjaWZpYyBwYXJhbWV0ZXIgZm9yIGEgcGVlciBzdGF0aW9uCisgKi8KK2VudW0gd21pX2FwX3BzX3BlZXJfcGFyYW0geworCS8qKiBTZXQgdWFwc2QgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBwZWVyLgorCSAqCisJICogVGhpcyB3aWxsIGluY2x1ZGUgdGhlIGRlbGl2ZXJ5IGFuZCB0cmlnZ2VyIGVuYWJsZWQgc3RhdGUgZm9yIGV2ZXJ5IEFDLgorCSAqIFRoZSBob3N0ICBNTE1FIG5lZWRzIHRvIHNldCB0aGlzIGJhc2VkIG9uIEFQIGNhcGFiaWxpdHkgYW5kIHN0YXRpb25zCisJICogcmVxdWVzdCBTZXQgaW4gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgIHJlY2VpdmVkIGZyb20gdGhlIHN0YXRpb24uCisJICoKKwkgKiBMb3dlciA4IGJpdHMgb2YgdGhlIHZhbHVlIHNwZWNpZnkgdGhlIFVBUFNEIGNvbmZpZ3VyYXRpb24uCisJICoKKwkgKiAoc2VlIGVudW0gd21pX2FwX3BzX3BhcmFtX3VhcHNkKQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuCisJICovCisJV01JX0FQX1BTX1BFRVJfUEFSQU1fVUFQU0QgPSAwLAorCisJLyoqCisJICogU2V0IHRoZSBzZXJ2aWNlIHBlcmlvZCBmb3IgYSBVQVBTRCBjYXBhYmxlIHN0YXRpb24KKwkgKgorCSAqIFRoZSBzZXJ2aWNlIHBlcmlvZCBmcm9tIHdtZSBpZSBpbiB0aGUgKHJlKWFzc29jIHJlcXVlc3QgZnJhbWUuCisJICoKKwkgKiAoc2VlIGVudW0gd21pX2FwX3BzX3BlZXJfcGFyYW1fbWF4X3NwKQorCSAqLworCVdNSV9BUF9QU19QRUVSX1BBUkFNX01BWF9TUCA9IDEsCisKKwkvKiogVGltZSBpbiBzZWNvbmRzIGZvciBhZ2luZyBvdXQgYnVmZmVyZWQgZnJhbWVzIGZvciBTVEEgaW4gcG93ZXIgc2F2ZSAqLworCVdNSV9BUF9QU19QRUVSX1BBUkFNX0FHRU9VVF9USU1FID0gMiwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hcF9wc19wZWVyX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogcGVlciBNQUMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIEFQIHBvd2Vyc2F2ZSBwYXJhbSAoc2VlIGVudW0gd21pX2FwX3BzX3BlZXJfcGFyYW0pICovCisJQV9VSU5UMzIgcGFyYW07CisJLyoqIEFQIHBvd2Vyc2F2ZSBwYXJhbSB2YWx1ZSAqLworCUFfVUlOVDMyIHZhbHVlOworfSB3bWlfYXBfcHNfcGVlcl9jbWRfZml4ZWRfcGFyYW07CisKKy8qKiBDb25maWd1cmUgcGVlciBzdGF0aW9uIDExdiBVLUFQU0QgY29leGlzdGFuY2UKKyAqCisgKiBUd28gcGFyYW1ldGVycyBmcm9tIHVhc3BkIGNvZXhpc3RlbmNlIGllIGluZm8gKGFzIHNwZWNpZmllZCBpbiAxMXYpIGFyZQorICogc2VudCBkb3duIHRvIEZXIGFsb25nIHdpdGggdGhpcyBjb21tYW5kLgorICoKKyAqIFRoZSBzZW1hbnRpY3Mgb2YgdGhlc2UgZmllbGRzIGFyZSBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyB0ZXh0IGV4dHJhY3RlZAorICogZnJvbSA4MDIuMTF2LgorICoKKyAqIC0tLSAgSWYgdGhlIG5vbi1BUCBTVEEgc3BlY2lmaWVkIGEgbm9uLXplcm8gVFNGIDAgT2Zmc2V0IHZhbHVlIGluIHRoZQorICogICAgICBVLUFQU0QgQ29leGlzdGVuY2UgZWxlbWVudCwgdGhlIEFQIHNob3VsZCBub3QgdHJhbnNtaXQgZnJhbWVzIHRvIHRoZQorICogICAgICBub24tQVAgU1RBIG91dHNpZGUgb2YgdGhlIFUtQVBTRCBDb2V4aXN0ZW5jZSBTZXJ2aWNlIFBlcmlvZCwgd2hpY2gKKyAqICAgICAgYmVnaW5zIHdoZW4gdGhlIEFQIHJlY2VpdmVzIHRoZSBVLUFQU0QgdHJpZ2dlciBmcmFtZSBhbmQgZW5kcyBhZnRlcgorICogICAgICB0aGUgdHJhbnNtaXNzaW9uIHBlcmlvZCBzcGVjaWZpZWQgYnkgdGhlIHJlc3VsdCBvZiB0aGUgZm9sbG93aW5nCisgKiAgICAgIGNhbGN1bGF0aW9uOgorICoKKyAqICAgICAgICAgIEVuZCBvZiB0cmFuc21pc3Npb24gcGVyaW9kID0gVCArIChJbnRlcnZhbCAuICgoVCAuIFRTRiAwIE9mZnNldCkgbW9kIEludGVydmFsKSkKKyAqCisgKiAgICAgIFdoZXJlIFQgaXMgdGhlIHRpbWUgdGhlIFUtQVBTRCB0cmlnZ2VyIGZyYW1lIHdhcyByZWNlaXZlZCBhdCB0aGUgQVAKKyAqICAgICAgSW50ZXJ2YWwgaXMgdGhlIFVBUFNEIENvZXhpc3RlbmNlIGVsZW1lbnQgRHVyYXRpb24vSW50ZXJ2YWwgZmllbGQKKyAqICAgICAgdmFsdWUgKHNlZSA3LjMuMi45MSkgb3IgdXBvbiB0aGUgc3VjY2Vzc2Z1bCB0cmFuc21pc3Npb24gb2YgYSBmcmFtZQorICogICAgICB3aXRoIEVPU1AgYml0IHNldCB0byAxLCB3aGljaGV2ZXIgaXMgZWFybGllci4KKyAqCisgKgorICogLS0tICBJZiB0aGUgbm9uLUFQIFNUQSBzcGVjaWZpZWQgYSB6ZXJvIFRTRiAwIE9mZnNldCB2YWx1ZSBpbiB0aGUgVS1BUFNECisgKiAgICAgIENvZXhpc3RlbmNlIGVsZW1lbnQsIHRoZSBBUCBzaG91bGQgbm90IHRyYW5zbWl0IGZyYW1lcyB0byB0aGUgbm9uLUFQCisgKiAgICAgIFNUQSBvdXRzaWRlIG9mIHRoZSBVLUFQU0QgQ29leGlzdGVuY2UgU2VydmljZSBQZXJpb2QsIHdoaWNoIGJlZ2lucworICogICAgICB3aGVuIHRoZSBBUCByZWNlaXZlcyBhIFUtQVBTRCB0cmlnZ2VyIGZyYW1lIGFuZCBlbmRzIGFmdGVyIHRoZQorICogICAgICB0cmFuc21pc3Npb24gcGVyaW9kIHNwZWNpZmllZCBieSB0aGUgcmVzdWx0IG9mIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgY2FsY3VsYXRpb246IEVuZCBvZiB0cmFuc21pc3Npb24gcGVyaW9kID0gVCArIER1cmF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHBlZXIgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCS8qKiBFbmFibGUgVS1BUFNEIGNvZXhpc3RlbmNlIHN1cHBvcnQgZm9yIHRoaXMgcGVlcgorCSAqCisJICogMCAtPiBkaXNhYmxlZCAoZGVmYXVsdCkKKwkgKiAxIC0+IGVuYWJsZWQKKwkgKi8KKwlBX1VJTlQzMiBlbmFibGVkOworCS8qKiBEdXJhdGlvbi9JbnRlcnZhbCBhcyBkZWZpbmVkIGJ5IDExdiBVLUFTUEQgY29leGlzdGFuY2UgKi8KKwlBX1VJTlQzMiBkdXJhdGlvbl9pbnRlcnZhbDsKKwkvKiogVXBwZXIgMzIgYml0cyBvZiA2NC1iaXQgVFNGIG9mZnNldCAqLworCUFfVUlOVDMyIHRzZl9vZmZzZXRfaGlnaDsKKwkvKiogTG93ZXIgMzIgYml0cyBvZiA2NC1iaXQgVFNGIG9mZnNldCAqLworCUFfVUlOVDMyIHRzZl9vZmZzZXRfbG93OworfSB3bWlfYXBfcG93ZXJzYXZlX3BlZXJfdWFwc2RfY29leF9jbWQ7CisKK3R5cGVkZWYgZW51bSB7CisJV01JX0FQX1BTX0VHQVBfRl9FTkFCTEVfUEhZRVJSX0RFVEVDVElPTiAgICAgID0gMHgwMDAxLAorCVdNSV9BUF9QU19FR0FQX0ZfRU5BQkxFX1BXUlNBVkVfQllfUFNfU1RBVEUgICA9IDB4MDAwMiwKKwlXTUlfQVBfUFNfRUdBUF9GX0VOQUJMRV9QV1JTQVZFX0JZX0lOQUNUSVZJVFkgPSAweDAwMDQsCisKKwlXTUlfQVBfUFNfRUdBUF9GTEFHX01BWCA9IDB4ODAwMAorfSB3bWlfYXBfcHNfZWdhcF9mbGFnX3R5cGU7CisKKy8qKgorICogY29uZmlndXJlIGVoYW5jZWQgZ3JlZW4gYXAgcGFyYW1ldGVycworICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoKKwkqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSogd21pX2FwX3Bvd2Vyc2F2ZV9lZ2FwX3BhcmFtX2NtZF9maXhlZF9wYXJhbQorCSovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogRW5hYmxlIGVuaGFuY2VkIGdyZWVuIGFwCisJKiAwIC0+IGRpc2FibGVkCisJKiAxIC0+IGVuYWJsZWQKKwkqLworCUFfVUlOVDMyIGVuYWJsZTsKKwkvKiogVGhlIHBhcmFtIGluZGljYXRlcyBhIGR1cmF0aW9uIHRoYXQgYWxsIFNUQXMgY29ubmVjdGVkCisJKiB0byBTLUFQIGhhdmUgbm8gdHJhZmZpYy4KKwkqLworCUFfVUlOVDMyIGluYWN0aXZpdHlfdGltZTsgLyogaW4gdW5pdCBvZiBtaWxsaXNlY29uZHMgKi8KKwkvKiogVGhlIHBhcmFtIGluZGljYXRlcyBhIGR1cmF0aW9uIHRoYXQgYWxsIFNUQXMgY29ubmVjdGVkCisJKiB0byBTLUFQIGhhdmUgbm8gdHJhZmZpYywgYWZ0ZXIgYWxsIFNUQXMgaGF2ZSBlbnRlcmVkIHBvd2Vyc2F2ZS4KKwkqLworCUFfVUlOVDMyIHdhaXRfdGltZTsgLyogaW4gdW5pdCBvZiBtaWxsaXNlY29uZHMgKi8KKwkvKiogVGhlIHBhcmFtIGlzIHVzZWQgdG8gdHVybiBvbi9vZmYgc29tZSBmdW5jdGlvbnMgd2l0aGluIEUtR0FQLgorCSovCisJQV9VSU5UMzIgZmxhZ3M7IC8qIHdtaV9hcF9wc19lZ2FwX2ZsYWdfdHlwZSBiaXRtYXAgKi8KK30gd21pX2FwX3BzX2VnYXBfcGFyYW1fY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCVdNSV9BUF9QU19FR0FQX1NUQVRVU19JRExFICAgICAgICA9IDEsCisJV01JX0FQX1BTX0VHQVBfU1RBVFVTX1BXUlNBVkVfT0ZGID0gMiwKKwlXTUlfQVBfUFNfRUdBUF9TVEFUVVNfUFdSU0FWRV9PTiAgPSAzLAorCisJV01JX0FQX1BTX0VHQVBfU1RBVFVTX01BWCA9IDE1Cit9IHdtaV9hcF9wc19lZ2FwX3N0YXR1c190eXBlOworCisvKioKKyAqIHNlbmQgZWhhbmNlZCBncmVlbiBhcCBzdGF0dXMgdG8gaG9zdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVGhlIHBhcmFtIGluZGljYXRlcyBhIG1hYyB1bmRlciBkdWFsLW1hYyAqLworCUFfVUlOVDMyIG1hY19pZDsKKwkvKiogVGhlIHBhcmFtIGluZGljYXRlcyB0aGUgY3VycmVudCB0eCBjaGFpbm1hc2sgd2l0aCB0aGUgbWFjIGlkLiAqLworCUFfVUlOVDMyIHR4X2NoYWlubWFzazsKKwkvKiogVGhlIHBhcmFtIGluZGljYXRlcyB0aGUgY3VycmVudCByeCBjaGFpbm1hc2sgd2l0aCB0aGUgbWFjIGlkLiAqLworCUFfVUlOVDMyIHJ4X2NoYWlubWFzazsKK30gd21pX2FwX3BzX2VnYXBfaW5mb19jaGFpbm1hc2tfbGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qCisJKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkqIHdtaV9hcF9wb3dlcnNhdmVfZWdhcF9wYXJhbV9jbWRfZml4ZWRfcGFyYW0KKwkqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIEVuaGFuY2VkIGdyZWVuIGFwIHN0YXR1cyAoV01JX0FQX1BTX0VHQVBfU1RBVFVTKS4gKi8KKwlBX1VJTlQzMiBzdGF0dXM7CisJLyogVGhpcyBUTFYgaXMgZm9sbG93ZWQgYnkKKwkgKiAgICAgd21pX2FwX3BzX2VnYXBfaW5mb19jaGFpbm1hc2tfbGlzdCBjaGFpbm1hc2tfbGlzdFtdOworCSAqLworfSB3bWlfYXBfcHNfZWdhcF9pbmZvX2V2ZW50X2ZpeGVkX3BhcmFtOworCisKKy8qIDEyOCBjbGllbnRzID0gNCB3b3JkcyAqLworLyogV01JX1RJTV9CSVRNQVBfQVJSQVlfU0laRSBjYW4ndCBiZSBtb2RpZmllZCB3aXRob3V0IGJyZWFraW5nIHRoZSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFdNSV9USU1fQklUTUFQX0FSUkFZX1NJWkUgNAorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfdGltX2luZm8gICovCisJLyoqIFRJTSBiaXRtYXAgbGVuIChpbiBieXRlcykqLworCUFfVUlOVDMyIHRpbV9sZW47CisJLyoqIFRJTSBQYXJ0aWFsIFZpcnR1YWwgQml0bWFwICovCisJQV9VSU5UMzIgdGltX21jYXN0OworCUFfVUlOVDMyIHRpbV9iaXRtYXBbV01JX1RJTV9CSVRNQVBfQVJSQVlfU0laRV07CisJQV9VSU5UMzIgdGltX2NoYW5nZWQ7CisJQV9VSU5UMzIgdGltX251bV9wc19wZW5kaW5nOworfSB3bWlfdGltX2luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogRmxhZyB0byBlbmFibGUgcXVpZXQgcGVyaW9kIElFIHN1cHBvcnQgKi8KKwlBX1VJTlQzMiBpc19lbmFibGVkOworCS8qKiBRdWlldCBzdGFydCAqLworCUFfVUlOVDMyIHRidHRjb3VudDsKKwkvKiogQmVhY29uIGludGVydmFscyBiZXR3ZWVuIHF1aWV0cyovCisJQV9VSU5UMzIgcGVyaW9kOworCS8qKiBUVXMgb2YgZWFjaCBxdWlldCovCisJQV9VSU5UMzIgZHVyYXRpb247CisJLyoqIFRVcyBvZiBmcm9tIFRCVFQgb2YgcXVpZXQgc3RhcnQqLworCUFfVUlOVDMyIG9mZnNldDsKK30gd21pX3F1aWV0X2luZm87CisKKy8qIFdNSV9QMlBfTUFYX05PQV9ERVNDUklQVE9SUyBjYW4ndCBiZSBtb2RpZmllZCB3aXRob3V0IGJyZWFraW5nIHRoZSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFdNSV9QMlBfTUFYX05PQV9ERVNDUklQVE9SUyA0ICAgLyogTWF4aW11bSBudW1iZXIgb2YgTk9BIERlc2NyaXB0b3JzIHN1cHBvcnRlZCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcDJwX25vYV9pbmZvICAqLworCS8qKiBCaXQgIDA6ICAgICAgICBGbGFnIHRvIGluZGljYXRlIGFuIHVwZGF0ZSBpbiBOT0Egc2NoZWR1bGUKKwkgKiAgQml0cyA3LTE6ICAgIFJlc2VydmVkCisJICogIEJpdHMgMTUtODogICAgSW5kZXggKGlkZW50aWZpZXMgdGhlIGluc3RhbmNlIG9mIE5PQSBzdWIgZWxlbWVudCkKKwkgKiAgQml0ICAxNjogICAgIE9wcCBQUyBzdGF0ZSBvZiB0aGUgQVAKKwkgKiAgICAgQml0cyAyMy0xNzogICAgQ3R3aW5kb3cgaW4gVFVzCisJICogICAgIEJpdHMgMzEtMjQ6ICAgIE51bWJlciBvZiBOT0EgZGVzY3JpcHRvcnMKKwkgKi8KKwlBX1VJTlQzMiBub2FfYXR0cmlidXRlczsKKwl3bWlfcDJwX25vYV9kZXNjcmlwdG9yCisJCW5vYV9kZXNjcmlwdG9yc1tXTUlfUDJQX01BWF9OT0FfREVTQ1JJUFRPUlNdOworfSB3bWlfcDJwX25vYV9pbmZvOworCisjZGVmaW5lIFdNSV9VTklGSUVEX05PQV9BVFRSX01PRElGSUVEICAgICAgICAgICAweDEKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfTU9ESUZJRURfUyAgICAgICAgIDAKKworI2RlZmluZSBXTUlfVU5JRklFRF9OT0FfQVRUUl9JU19NT0RJRklFRChoZHIpCQkJICAgIFwKKwlXTUlfRl9NUygoaGRyKS0+bm9hX2F0dHJpYnV0ZXMsIFdNSV9VTklGSUVEX05PQV9BVFRSX01PRElGSUVEKQorCisjZGVmaW5lIFdNSV9VTklGSUVEX05PQV9BVFRSX01PRElGSUVEX1NFVChoZHIpCQkJICAgIFwKKwlXTUlfRl9STVcoKGhkciktPm5vYV9hdHRyaWJ1dGVzLCAweDEsCQkJIFwKKwkJICBXTUlfVU5JRklFRF9OT0FfQVRUUl9NT0RJRklFRCk7CisKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfSU5ERVggICAgICAgICAgICAgICAgICAgICAgMHhmZjAwCisjZGVmaW5lIFdNSV9VTklGSUVEX05PQV9BVFRSX0lOREVYX1MgICAgICAgICAgICA4CisKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfSU5ERVhfR0VUKGhkcikJCQkgICAgICAgXAorCVdNSV9GX01TKChoZHIpLT5ub2FfYXR0cmlidXRlcywgV01JX1VOSUZJRURfTk9BX0FUVFJfSU5ERVgpCisKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfSU5ERVhfU0VUKGhkciwgdikJCQkgICAgXAorCVdNSV9GX1JNVygoaGRyKS0+bm9hX2F0dHJpYnV0ZXMsICh2KSAmIDB4ZmYsCQlcCisJCSAgV01JX1VOSUZJRURfTk9BX0FUVFJfSU5ERVgpOworCisjZGVmaW5lIFdNSV9VTklGSUVEX05PQV9BVFRSX09QUF9QUyAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfT1BQX1BTX1MgICAgICAgICAgIDE2CisKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfT1BQX1BTX0dFVChoZHIpCQkJICAgICBcCisJV01JX0ZfTVMoKGhkciktPm5vYV9hdHRyaWJ1dGVzLCBXTUlfVU5JRklFRF9OT0FfQVRUUl9PUFBfUFMpCisKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfT1BQX1BTX1NFVChoZHIpCQkJICAgICBcCisJV01JX0ZfUk1XKChoZHIpLT5ub2FfYXR0cmlidXRlcywgMHgxLAkJCSBcCisJCSAgV01JX1VOSUZJRURfTk9BX0FUVFJfT1BQX1BTKTsKKworI2RlZmluZSBXTUlfVU5JRklFRF9OT0FfQVRUUl9DVFdJTiAgICAgICAgICAgICAgICAgICAgICAweGZlMDAwMAorI2RlZmluZSBXTUlfVU5JRklFRF9OT0FfQVRUUl9DVFdJTl9TICAgICAgICAgICAgMTcKKworI2RlZmluZSBXTUlfVU5JRklFRF9OT0FfQVRUUl9DVFdJTl9HRVQoaGRyKQkJCSAgICAgXAorCVdNSV9GX01TKChoZHIpLT5ub2FfYXR0cmlidXRlcywgV01JX1VOSUZJRURfTk9BX0FUVFJfQ1RXSU4pCisKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfQ1RXSU5fU0VUKGhkciwgdikJCQkgICAgIFwKKwlXTUlfRl9STVcoKGhkciktPm5vYV9hdHRyaWJ1dGVzLCAodikgJiAweDdmLAkJIFwKKwkJICBXTUlfVU5JRklFRF9OT0FfQVRUUl9DVFdJTik7CisKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfTlVNX0RFU0MgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfTlVNX0RFU0NfUyAgICAgICAgIDI0CisKKyNkZWZpbmUgV01JX1VOSUZJRURfTk9BX0FUVFJfTlVNX0RFU0NfR0VUKGhkcikJCQkgICAgIFwKKwlXTUlfRl9NUygoaGRyKS0+bm9hX2F0dHJpYnV0ZXMsIFdNSV9VTklGSUVEX05PQV9BVFRSX05VTV9ERVNDKQorCisjZGVmaW5lIFdNSV9VTklGSUVEX05PQV9BVFRSX05VTV9ERVNDX1NFVChoZHIsIHYpCQkgICAgIFwKKwlXTUlfRl9STVcoKGhkciktPm5vYV9hdHRyaWJ1dGVzLCAodikgJiAweGZmLAkJIFwKKwkJICBXTUlfVU5JRklFRF9OT0FfQVRUUl9OVU1fREVTQyk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVElNIGluZm8gKi8KKwl3bWlfdGltX2luZm8gdGltX2luZm87CisJLyoqIFAyUCBOT0EgaW5mbyAqLworCXdtaV9wMnBfbm9hX2luZm8gcDJwX25vYV9pbmZvOworCS8qIFRCRDogTW9yZSBpbmZvIGVsZW1lbnRzIHRvIGJlIGFkZGVkIGxhdGVyICovCit9IHdtaV9iY25faW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2hvc3Rfc3diYV9ldmVudF9maXhlZF9wYXJhbSAgKi8KKwkvKiogYml0bWFwIGlkZW50aWZ5aW5nIHRoZSBWREVWcywgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X21hcDsKKwkvKiBUaGlzIFRMViBpcyBmb2xsb3dlZCBieSB0aW1faW5mbyBhbmQgcDJwX25vYV9pbmZvIGZvciBlYWNoIHZkZXYgaW4gdmRldm1hcCA6CisJICogICAgIHdtaV90aW1faW5mbyB0aW1faW5mb1tdOworCSAqICAgICB3bWlfcDJwX25vYV9pbmZvIHAycF9ub2FfaW5mb1tdOworCSAqCisJICovCit9IHdtaV9ob3N0X3N3YmFfZXZlbnRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX01BWF9BUF9WREVWIDE2CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV90YnR0X29mZnNldF9ldmVudF9maXhlZF9wYXJhbSAgKi8KKwkvKiogYmltdGFwIG9mIFZERVZzIHRoYXQgaGFzIHRidHQgb2Zmc2V0IHVwZGF0ZWQgKi8KKwlBX1VJTlQzMiB2ZGV2X21hcDsKKwkvKiBUaGUgVExWcyBmb3IgdGJ0dG9mZnNldF9saXN0IHdpbGwgZm9sbG93IHRoaXMgVExWLgorCSAqICAgICB0YnR0IG9mZnNldCBsaXN0IGluIHRoZSBvcmRlciBvZiB0aGUgTFNCIHRvIE1TQiBpbiB0aGUgdmRldl9tYXAgYml0bWFwCisJICogICAgIEFfVUlOVDMyIHRidHRvZmZzZXRfbGlzdFtXTUlfTUFYX0FQX1ZERVZdOworCSAqLworfSB3bWlfdGJ0dF9vZmZzZXRfZXZlbnRfZml4ZWRfcGFyYW07CisKKy8qIFBlZXIgU3BlY2lmaWMgY29tbWFuZHMgYW5kIGV2ZW50cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgcGVyY2VudGFnZTsgLyogaW4gdW5pdCBvZiAxMi41JSAqLworCUFfVUlOVDMyIG1pbl9kZWx0YTsgIC8qIGluIHVuaXQgb2YgTWJwcyAqLworfSByYXRlX2RlbHRhX3Q7CisKKyNkZWZpbmUgUEVFUl9SQVRFX1JFUE9SVF9DT05EX0ZMQUdfREVMVEEgICAgICAgIDB4MDEKKyNkZWZpbmUgUEVFUl9SQVRFX1JFUE9SVF9DT05EX0ZMQUdfVEhSRVNIT0xEICAgIDB4MDIKKyNkZWZpbmUgTUFYX05VTV9PRl9SQVRFX1RIUkVTSCAgICAgICAgICAgICAgICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qCisJICogUEVFUl9SQVRFX1JFUE9SVF9DT05EX0ZMQUdfREVMVEEsCisJICogUEVFUl9SQVRFX1JFUE9SVF9DT05EX0ZMQUdfVEhSRVNIT0xECisJICogQW55IG9mIHRoZXNlIHR3byBjb25kaXRpb25zIG9yIGJvdGggb2YKKwkgKiB0aGVtIGNhbiBiZSBzZXQuCisJICovCisJQV9VSU5UMzIgdmFsX2NvbmRfZmxhZ3M7CisJcmF0ZV9kZWx0YV90IHJhdGVfZGVsdGE7CisJLyoKKwkgKiBJbiB1bml0IG9mIE1icHMuIFRoZXJlIGFyZSBhdCBtb3N0IDQgdGhyZXNob2xkcworCSAqIElmIHRoZSB0aHJlc2hvbGQgY291bnQgaXMgbGVzcyB0aGFuIDQsIHNldCB6ZXJvIHRvCisJICogdGhlIG9uZSBmb2xsb3dpbmcgdGhlIGxhc3QgdGhyZXNob2xkCisJICovCisJQV9VSU5UMzIgcmF0ZV90aHJlc2hvbGRbTUFYX05VTV9PRl9SQVRFX1RIUkVTSF07Cit9IHJlcG9ydF9jb25kX3Blcl9waHlfdDsKKworCitlbnVtIHBlZXJfcmF0ZV9yZXBvcnRfY29uZF9waHlfdHlwZSB7CisJUEVFUl9SQVRFX1JFUE9SVF9DT05EXzExQiA9IDAsCisJUEVFUl9SQVRFX1JFUE9SVF9DT05EXzExQV9HLAorCVBFRVJfUkFURV9SRVBPUlRfQ09ORF8xMU4sCisJUEVFUl9SQVRFX1JFUE9SVF9DT05EXzExQUMsCisJUEVFUl9SQVRFX1JFUE9SVF9DT05EX01BWF9OVU0KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfcmF0ZV9yZXBvcnRfY29uZHRpb25fZml4ZWRfcGFyYW0KKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qIDE9IGVuYWJsZSwgMD1kaXNhYmxlICovCisJQV9VSU5UMzIgZW5hYmxlX3JhdGVfcmVwb3J0OworCUFfVUlOVDMyIHJlcG9ydF9iYWNrb2ZmX3RpbWU7ICAgICAgICAgICAgLyogaW4gdW5pdCBvZiBtc2Vjb25kICovCisJQV9VSU5UMzIgcmVwb3J0X3RpbWVyX3BlcmlvZDsgICAgICAgICAgICAvKiBpbiB1bml0IG9mIG1zZWNvbmQgKi8KKwkvKgorCSAqSW4gdGhlIGZvbGxvd2luZyBmaWVsZCwgdGhlIGFycmF5IGluZGV4IG1lYW5zIHRoZSBwaHkgdHlwZSwKKwkgKiBwbGVhc2Ugc2VlIGVudW0gcGVlcl9yYXRlX3JlcG9ydF9jb25kX3BoeV90eXBlIGZvciBkZXRhaWwKKwkgKi8KKwlyZXBvcnRfY29uZF9wZXJfcGh5X3QgY29uZF9wZXJfcGh5W1BFRVJfUkFURV9SRVBPUlRfQ09ORF9NQVhfTlVNXTsKK30gd21pX3BlZXJfc2V0X3JhdGVfcmVwb3J0X2NvbmRpdGlvbl9maXhlZF9wYXJhbTsKKworLyogUGVlciBUeXBlOgorICogTkI6IFRoaXMgY2FuIGJlIGxlZnQgREVGQVVMVCBmb3IgdGhlIG5vcm1hbCBjYXNlLCBhbmQgZi93IHdpbGwgZGV0ZXJtaW5lIEJTUyB0eXBlIGJhc2VkCisgKiBvbiBhZGRyZXNzIGFuZCB2ZGV2IG9wbW9kZS4gVGhpcyBpcyBsYXJnZWx5IGhlcmUgdG8gYWxsb3cgaG9zdCB0byBpbmRpY2F0ZSB0aGF0CisgKiBwZWVyIGlzIGV4cGxpY2l0bHkgYSBURExTIHBlZXIKKyAqLworZW51bSB3bWlfcGVlcl90eXBlIHsKKwlXTUlfUEVFUl9UWVBFX0RFRkFVTFQgPSAwLCAgICAgICAgICAgICAgLyogR2VuZXJpYy9Ob24tQlNTL1NlbGYgUGVlciAqLworCVdNSV9QRUVSX1RZUEVfQlNTID0gMSwgICAgICAgICAgLyogUGVlciBpcyBCU1MgUGVlciBlbnRyeSAqLworCVdNSV9QRUVSX1RZUEVfVERMUyA9IDIsICAgICAgICAgLyogUGVlciBpcyBhIFRETFMgUGVlciAqLworCVdNSV9QRUVSX1RZUEVfT0NCID0gMywgLyogUGVlciBpcyBhIE9DQiBQZWVyICovCisJV01JX1BFRVJfVFlQRV9IT1NUX01BWCA9IDEyNywgICAgICAgICAgIC8qIEhvc3QgPC0+IFRhcmdldCBQZWVyIHR5cGUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgYXNzaWduZWQgdXAgdG8gMTI3ICovCisJLyogUmVzZXJ2ZWQgZnJvbSAxMjggLSAyNTUgZm9yCisJICogdGFyZ2V0IGludGVybmFsIHVzZS4qLworCVdNSV9QRUVSX1RZUEVfUk9BTU9GRkxPQURfVEVNUCA9IDEyOCwgLyogVGVtcG9yYXJpbHkgY3JlYXRlZCBkdXJpbmcgb2ZmbG9hZCByb2FtICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfY3JlYXRlX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogcGVlciBNQUMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIHBlZXIgdHlwZTogc2VlIGVudW0gdmFsdWVzIGFib3ZlICovCisJQV9VSU5UMzIgcGVlcl90eXBlOworfSB3bWlfcGVlcl9jcmVhdGVfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfZGVsZXRlX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogcGVlciBNQUMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7Cit9IHdtaV9wZWVyX2RlbGV0ZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgIC8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9mbHVzaF90aWRzX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogcGVlciBNQUMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIHRpZCBiaXRtYXAgaWRlbnRpZnlpbmcgdGhlIHRpZHMgdG8gZmx1c2ggKi8KKwlBX1VJTlQzMiBwZWVyX3RpZF9iaXRtYXA7Cit9IHdtaV9wZWVyX2ZsdXNoX3RpZHNfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIHJhdGUgbW9kZSAuIDA6IGRpc2FibGUgZml4ZWQgcmF0ZSAoYXV0byByYXRlKQorCSAqICAgMTogbGVnYWN5IChub24gMTFuKSByYXRlICBzcGVjaWZpZWQgYXMgaWVlZSByYXRlIDIqTWJwcworCSAqICAgMjogaHQyMCAxMW4gcmF0ZSAgc3BlY2lmaWVkIGFzIG1jcyBpbmRleAorCSAqICAgMzogaHQ0MCAxMW4gcmF0ZSAgc3BlY2lmaWVkIGFzIG1jcyBpbmRleAorCSAqLworCUFfVUlOVDMyIHJhdGVfbW9kZTsKKwkvKiogNCByYXRlIHZhbHVlcyBmb3IgNCByYXRlIHNlcmllcy4gc2VyaWVzIDAgaXMgc3RvcmVkIGluIGJ5dGUgMCAoTFNCKQorCSAqICBhbmQgc2VyaWVzIDMgaXMgc3RvcmVkIGF0IGJ5dGUgMyAoTVNCKSAqLworCUFfVUlOVDMyIHJhdGVfc2VyaWVzOworCS8qKiA0IHJldHJ5IGNvdW50cyBmb3IgNCByYXRlIHNlcmllcy4gcmV0cnkgY291bnQgZm9yIHJhdGUgMCBpcyBzdG9yZWQgaW4gYnl0ZSAwIChMU0IpCisJICogIGFuZCByZXRyeSBjb3VudCBmb3IgcmF0ZSAzIGlzIHN0b3JlZCBhdCBieXRlIDMgKE1TQikgKi8KKwlBX1VJTlQzMiByYXRlX3JldHJpZXM7Cit9IHdtaV9maXhlZF9yYXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBwZWVyIE1BQyBhZGRyZXNzICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKKwkvKiogZml4ZWQgcmF0ZSAqLworCXdtaV9maXhlZF9yYXRlIHBlZXJfZml4ZWRfcmF0ZTsKK30gd21pX3BlZXJfZml4ZWRfcmF0ZV9jbWQ7CisKKyNkZWZpbmUgV01JX01HTVRfVElEICAgIDE3CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfYWRkYmFfY2xlYXJfcmVzcF9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHBlZXIgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworfSB3bWlfYWRkYmFfY2xlYXJfcmVzcF9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfYWRkYmFfc2VuZF9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHBlZXIgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCS8qKiBUaWQgbnVtYmVyICovCisJQV9VSU5UMzIgdGlkOworCS8qKiBCdWZmZXIvV2luZG93IHNpemUqLworCUFfVUlOVDMyIGJ1ZmZlcnNpemU7Cit9IHdtaV9hZGRiYV9zZW5kX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kZWxiYV9zZW5kX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogcGVlciBNQUMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIFRpZCBudW1iZXIgKi8KKwlBX1VJTlQzMiB0aWQ7CisJLyoqIElzIEluaXRpYXRvciAqLworCUFfVUlOVDMyIGluaXRpYXRvcjsKKwkvKiogUmVhc29uIGNvZGUgKi8KKwlBX1VJTlQzMiByZWFzb25jb2RlOworfSB3bWlfZGVsYmFfc2VuZF9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfYWRkYmFfc2V0cmVzcG9uc2VfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgdmRldiwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBwZWVyIG1hYyBhZGRyZXNzICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKKwkvKiogVGlkIG51bWJlciAqLworCUFfVUlOVDMyIHRpZDsKKwkvKiogc3RhdHVzIGNvZGUgKi8KKwlBX1VJTlQzMiBzdGF0dXNjb2RlOworfSB3bWlfYWRkYmFfc2V0cmVzcG9uc2VfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NlbmRfc2luZ2xlYW1zZHVfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgdmRldiwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBwZWVyIG1hYyBhZGRyZXNzICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKKwkvKiogVGlkIG51bWJlciAqLworCUFfVUlOVDMyIHRpZDsKK30gd21pX3NlbmRfc2luZ2xlYW1zZHVfY21kX2ZpeGVkX3BhcmFtOworCisvKiBUeXBlIG9mIFN0YXRpb24gRFRJTSBQb3dlciBTYXZlIG1ldGhvZCAqLworZW51bSB7CisJLyogRm9yIE5PUk1BTCBEVElNLCB0aGUgcGFyYW1ldGVyIGlzIHRoZSBudW1iZXIgb2YgYmVhY29uIGludGVydmFscyBhbmQKKwkgKiBhbHNvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBsaXN0ZW4gaW50ZXJ2YWwuIEZvciB0aGlzIG1ldGhvZCwgdGhlCisJICogc3RhdGlvbiB3aWxsIHdha2UgdXAgYmFzZWQgb24gdGhlIGxpc3RlbiBpbnRlcnZhbC4gSWYgdGhpcworCSAqIGxpc3RlbiBpbnRlcnZhbCBpcyBub3QgZXF1YWwgdG8gRFRJTSwgdGhlbiB0aGUgc3RhdGlvbiBtYXkKKwkgKiBtaXNzIGNlcnRhaW4gRFRJTSBiZWFjb25zLiBJZiB0aGlzIHZhbHVlIGlzIDEsIHRoZW4gdGhlCisJICogc3RhdGlvbiB3aWxsIHdha2UgdXAgZm9yIGV2ZXJ5IGJlYWNvbi4KKwkgKi8KKwlXTUlfU1RBX0RUSU1fUFNfTk9STUFMX0RUSU0gPSAweDAxLAorCS8qIEZvciBNT0RVTEFURURfRFRJTSwgcGFyYW1ldGVyIGlzIGEgbXVsdGlwbGUgb2YgRFRJTSBiZWFjb25zIHRvIHNraXAuCisJICogV2hlbiB0aGlzIHZhbHVlIGlzIDEsIHRoZW4gdGhlIHN0YXRpb24gd2lsbCB3YWtlIGF0IGV2ZXJ5IERUSU0gYmVhY29uLgorCSAqIElmIHRoaXMgdmFsdWUgaXMgPjEsIHRoZW4gdGhlIHN0YXRpb24gd2lsbCBza2lwIGNlcnRhaW4gRFRJTSBiZWFjb25zLgorCSAqIFRoaXMgdmFsdWUgaXMgdGhlIG11bHRpcGxlIG9mIERUSU0gaW50ZXJ2YWxzIHRoYXQgdGhlIHN0YXRpb24gd2lsbAorCSAqIHdha2UgdXAgdG8gcmVjZWl2ZSB0aGUgRFRJTSBiZWFjb25zLgorCSAqLworCVdNSV9TVEFfRFRJTV9QU19NT0RVTEFURURfRFRJTSA9IDB4MDIsCit9OworCisvKiBQYXJhbWV0ZXIgc3RydWN0dXJlIGZvciB0aGUgV01JX1NUQV9EVElNX1BTX01FVEhPRF9DTURJRCAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfZHRpbV9wc19tZXRob2RfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qIFN0YXRpb24gRFRJTSBQb3dlciBTYXZlIG1ldGhvZCBhcyBkZWZpbmVkIGFib3ZlICovCisJQV9VSU5UMzIgZHRpbV9wd3JzYXZlX21ldGhvZDsKKwkvKiBEVElNIFBTIHZhbHVlLiBDb250ZW50cyBkZXBlbmRzIG9uIHRoZSBtZXRob2QgKi8KKwlBX1VJTlQzMiB2YWx1ZTsKKwkvKiBNb2R1bGF0ZWQgRFRJTSB2YWx1ZSAqLworCUFfVUlOVDMyIE1heExJTW9kdWxhdGVkRFRJTTsKK30gd21pX3N0YV9kdGltX3BzX21ldGhvZF9jbWRfZml4ZWRfcGFyYW07CisKKy8qCisgKiBGb3IgU3RhdGlvbiBVQVBTRCBBdXRvIFRyaWdnZXIgZmVhdHVyZSwgdGhlIEZpcm13YXJlIG1vbml0b3JzIHRoZQorICogdUFQU0QgdXBsaW5rIGFuZCBkb3dubGluayB0cmFmZmljIGZvciBlYWNoIHVBUFNEIGVuYWJsZWQgV01NIEFDcy4KKyAqIElmIHRoZXJlIGlzIG5vIHVwbGluay9kb3dubG9hZCBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIGludGVydmFsIChmaWVsZCBzZXJ2aWNlX2ludGVydmFsKSwKKyAqIGZpcm13YXJlIHdpbGwgYXV0byBnZW5lcmF0ZSBhIFFPUy1OVUxMIHRyaWdnZXIgZm9yIHRoYXQgV01NLUFQIHdpdGggdGhlIFRJRCB2YWx1ZQorICogc3BlY2lmaWVkIGluIHRoZSBVUCAoZmllbGQgdXNlcl9wcmlvcml0eSkuCisgKiBGaXJtd2FyZSBhbHNvIG1vbml0b3JzIHRoZSByZXNwb25zZXMgZm9yIHRoZXNlIFFPUy1OVUxMIHRyaWdnZXJzLgorICogSWYgdGhlIHBlZXIgZG9lcyBub3QgaGF2ZSBhbnkgZGVsaXZlcnkgZnJhbWVzLCBpdCB3aWxsIHJlc3BvbmQgd2l0aAorICogUU9TLU5VTEwgKEVPU1A9MSkuIFRoaXMgZmVhdHVyZSBvZiBvbmx5IHVzaW5nIHNlcnZpY2UgaW50ZXJ2YWwgaXMgYXNzdW1lZCB0byBiZSBtYW5kYXRvcnkgZm9yIGFsbAorICogZmlybXdhcmUgaW1wbGVtZW50YXRpb24uIEZvciB0aGlzIGJhc2ljIGltcGxlbWVudGF0aW9uLCB0aGUgc3VzcGVuZF9pbnRlcnZhbCBhbmQgZGVsYXlfaW50ZXJ2YWwKKyAqIGFyZSB1bnVzZWQgYW5kIHNob3VsZCBiZSBzZXQgdG8gMC4KKyAqIFdoZW4gc2VydmljZV9pbnRlcnZhbCBpcyAwLCB0aGVuIHRoZSBmaXJtd2FyZSB3aWxsIG5vdCBzZW5kIGFueSB0cmlnZ2VyIGZyYW1lcy4gVGhpcyBpcyBmb3IKKyAqIGNlcnRhaW4gaG9zdC1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkb24ndCB3YW50IHRoaXMgZmlybXdhcmUgb2ZmbG9hZC4KKyAqIE5vdGUgdGhhdCB0aGUgcGVyLUFDIGludGVydmFscyBhcmUgcmVxdWlyZWQgZm9yIHNvbWUgdXNhZ2Ugc2NlbmFyaW9zLiBUaGlzIGlzIHdoeSB0aGUgaW50ZXJ2YWxzCisgKiBhcmUgZ2l2ZW4gaW4gdGhlIGFycmF5IG9mIGFjX3BhcmFtW10uIEZvciBleGFtcGxlLCBWb2ljZSBzZXJ2aWNlIGludGVydmFsIG1heSBkZWZhdWx0cyB0byAyMCBtcworICogYW5kIHJlc3Qgb2YgdGhlIEFDIGRlZmF1bHQgdG8gMzAwIG1zLgorICoKKyAqIFRoZSBzZXJ2aWNlIGJpdCwgV01JX1NUQV9VQVBTRF9WQVJfQVVUT19UUklHLCB3aWxsIGluZGljYXRlIHRoYXQgdGhlIG1vcmUgYWR2YW5jZWQgZmVhdHVyZQorICogb2YgdmFyaWFibGUgYXV0byB0cmlnZ2VyIGlzIHN1cHBvcnRlZC4gVGhlIHN1c3BlbmRfaW50ZXJ2YWwgYW5kIGRlbGF5X2ludGVydmFsIGlzIHVzZWQgaW4KKyAqIHRoZSBtb3JlIGFkdmFuY2VkIG1vbml0b3JpbmcgbWV0aG9kLgorICogSWYgdGhlIFBFRVIgZG9lcyBub3QgaGF2ZSBhbnkgZGVsaXZlcnkgZW5hYmxlZCBkYXRhIGZyYW1lcyAobm9uIFFPUy1OVUxMKSBmb3IgdGhlCisgKiBzdXNwZW5kIGludGVydmFsIChmaWVsZCBzdXNwZW5kX2ludGVydmFsKSwgZmlybXdhcmUgd2lsbCBjaGFuZ2UgaXRzIGF1dG8gdHJpZ2dlciBpbnRlcnZhbAorICogdG8gZGVsYXkgaW50ZXJ2YWwgKGZpZWxkIGRlbGF5X2ludGVydmFsKS4gVGhpcyB3YXksIHdoZW4gdGhlcmUgaXMgbm8gdHJhZmZpYywgdGhlIHN0YXRpb24KKyAqIHdpbGwgc2F2ZSBtb3JlIHBvd2VyIGJ5IHdha2luZyB1cCBsZXNzIGFuZCBzZW5kaW5nIGxlc3MgdHJpZ2dlciBmcmFtZXMuCisgKiBUaGUgKHNlcnZpY2VfaW50ZXJ2YWwgPCBzdXNwZW5kX2ludGVydmFsKSBhbmQgKHNlcnZpY2VfaW50ZXJ2YWwgPCBkZWxheV9pbnRlcnZhbCkuCisgKiBJZiB0aGlzIHZhcmlhYmxlIGF1dG8gdHJpZ2dlciBpcyBub3QgcmVxdWlyZWQsIHRoZW4gdGhlIHN1c3BlbmRfaW50ZXJ2YWwgYW5kIGRlbGF5X2ludGVydmFsCisgKiBzaG91bGQgYmUgMC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfdWFwc2RfYXV0b190cmlnX3BhcmFtICovCisJLyoqIFdNTSBBY2Nlc3MgY2F0ZWdvcnkgZnJvbSAwIHRvIDMgKi8KKwlBX1VJTlQzMiB3bW1fYWM7CisJLyoqIFVzZXIgcHJpb3JpdHkgdG8gdXNlIGluIHRyaWdnZXIgZnJhbWVzLiBJdCBpcyB0aGUgVElECisJICogIHZhbHVlLiBUaGlzIGZpZWxkIG5lZWRzIHRvIGJlIHNwZWNpZmllZCBhbmQgbWF5IG5vdCBiZQorCSAqICBlcXVpdmFsZW50IHRvIEFDIHNpbmNlIHNvbWUgaW1wbGVtZW50YXRpb24gbWF5IHVzZSB0aGUgVFNQRUMKKwkgKiAgdG8gZW5hYmxlIFVBUFNEIGFuZCBuZWdvdGlhdGUgYSBwYXJ0aWN1bGFyIHVzZXIgcHJpb3JpdHkuICovCisJQV9VSU5UMzIgdXNlcl9wcmlvcml0eTsKKwkvKiogc2VydmljZSBpbnRlcnZhbCBpbiBtcyAqLworCUFfVUlOVDMyIHNlcnZpY2VfaW50ZXJ2YWw7CisJLyoqIFN1c3BlbmQgaW50ZXJ2YWwgaW4gbXMgKi8KKwlBX1VJTlQzMiBzdXNwZW5kX2ludGVydmFsOworCS8qKiBkZWxheSBpbnRlcnZhbCBpbiBtcyAqLworCUFfVUlOVDMyIGRlbGF5X2ludGVydmFsOworfSB3bWlfc3RhX3VhcHNkX2F1dG9fdHJpZ19wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfdWFwc2RfYXV0b190cmlnX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogcGVlciBtYWMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIE51bWJlciBvZiBBQyB0byBzcGVjaWZ5ICovCisJQV9VSU5UMzIgbnVtX2FjOworCS8qCisJICogRm9sbG93aW5nIHRoaXMgc3RydWMgaXMgdGhlIFRMVjoKKwkgKiAgICAgd21pX3N0YV91YXBzZF9hdXRvX3RyaWdfcGFyYW0gYWNfcGFyYW1bXTsgLy9WYXJpYWJsZSBudW1iZXIgb2YgQUMgcGFyYW1ldGVycyAoZGVmaW5lZCBieSBmaWVsZCBudW1fYWMpCisJICovCisKK30gd21pX3N0YV91YXBzZF9hdXRvX3RyaWdfY21kX2ZpeGVkX3BhcmFtOworCisvKiogbWltbyBwb3dlcnNhdmUgc3RhdGUgKi8KKyNkZWZpbmUgV01JX1BFRVJfTUlNT19QU19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisvKiogZW5hYmxlL2Rpc2FibGUgQU1QRFUgLiBpbml0aWFsIHZhbHVlIChlbmFibGVkKSAqLworI2RlZmluZSBXTUlfUEVFUl9BTVBEVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKy8qKiBhdXRob3JpemUvdW5hdXRob3JpemUgcGVlci4gaW5pdGlhbCB2YWx1ZSBpcyB1bmF1dGhvcml6ZWQgKDApICAqLworI2RlZmluZSBXTUlfUEVFUl9BVVRIT1JJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKy8qKiBwZWVyIGNoYW5uZWwgYmFuZHdpZHRoICovCisjZGVmaW5lIFdNSV9QRUVSX0NIV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorLyoqIHBlZXIgTlNTICovCisjZGVmaW5lIFdNSV9QRUVSX05TUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQorLyoqIFVTRSA0IEFERFIgKi8KKyNkZWZpbmUgV01JX1BFRVJfVVNFXzRBRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2CisvKiBzZXQgZ3JvdXAgbWVtYmVyc2hpcCBzdGF0dXMgKi8KKyNkZWZpbmUgV01JX1BFRVJfTUVNQkVSU0hJUCAgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgV01JX1BFRVJfVVNFUlBPUyAgICAgICAgICAgICAgICAweDgKKy8qCisgKiBBIGNyaXRpY2FsIGhpZ2gtbGV2ZWwgcHJvdG9jb2wgaXMgYmVpbmcgdXNlZCB3aXRoIHRoaXMgcGVlci4gVGFyZ2V0CisgKiBzaG91bGQgdGFrZSBhcHByb3ByaWF0ZSBtZWFzdXJlcyAoaWYgcG9zc2libGUpIHRvIGVuc3VyZSBtb3JlCisgKiByZWxpYWJsZSBsaW5rIHdpdGggbWluaW1hbCBsYXRlbmN5LiBUaGlzICptYXkqIGluY2x1ZGUgbW9kaWZ5aW5nIHRoZQorICogc3RhdGlvbiBwb3dlciBzYXZlIHBvbGljeSwgZW5hYmxpbmcgbW9yZSBSWCBjaGFpbnMsIGluY3JlYXNlZAorICogcHJpb3JpdHkgb2YgY2hhbm5lbCBzY2hlZHVsaW5nLCBldGMuCisgKgorICogTk9URTogVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBhIGhpbnQgYXMgc3BlY2lmaWMKKyAqIGJlaGF2aW9yIHdpbGwgZGVwZW5kIG9uIG1hbnkgZmFjdG9ycyBpbmNsdWRpbmcgY3VycmVudCBuZXR3b3JrIGxvYWQKKyAqIGFuZCB2ZGV2L3BlZXIgY29uZmlndXJhdGlvbi4KKyAqCisgKiBGb3IgU1RBIFZERVYgdGhpcyBwZWVyIGNvcnJlc3BvbmRzIHRvIHRoZSBBUCdzIEJTUyBwZWVyLgorICogRm9yIEFQIFZERVYgdGhpcyBwZWVyIGNvcnJlc3BvbmRzIHRvIHRoZSByZW1vdGUgcGVlciBTVEEuCisgKi8KKyNkZWZpbmUgV01JX1BFRVJfQ1JJVF9QUk9UT19ISU5UX0VOQUJMRUQgICAgICAgICAgICAgICAgMHg5CisvKiBzZXQgVHggZmFpbHVyZSBjb3VudCB0aHJlc2hvbGQgZm9yIHRoZSBwZWVyIC0gQ3VycmVudGx5IHVudXNlZCAqLworI2RlZmluZSBXTUlfUEVFUl9UWF9GQUlMX0NOVF9USFIgICAgICAgICAgICAgICAgICAgICAgICAweEEKKy8qIEVuYWJsZSBIL1cgcmV0cnkgYW5kIEVuYWJsZSBIL1cgU2VuZCBDVFMyUyBiZWZvcmUgRGF0YSAqLworI2RlZmluZSBXTUlfUEVFUl9TRVRfSFdfUkVUUllfQ1RTMlMgICAgICAgICAgICAgICAgICAgICAweEIKKworLyogU2V0IHBlZXIgYWR2ZXJ0aXNlZCBJQlNTIGF0aW0gd2luZG93IGxlbmd0aCAqLworI2RlZmluZSBXTUlfUEVFUl9JQlNTX0FUSU1fV0lORE9XX0xFTkdUSCAgICAgICAgICAgICAgICAweEMKKworLyoqIHBlZXIgcGh5IG1vZGUgKi8KKyNkZWZpbmUgV01JX1BFRVJfUEhZTU9ERSAweEQKKworLyoqIG1pbW8gcHMgdmFsdWVzIGZvciB0aGUgcGFyYW1ldGVyIFdNSV9QRUVSX01JTU9fUFNfU1RBVEUgICovCisjZGVmaW5lIFdNSV9QRUVSX01JTU9fUFNfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFdNSV9QRUVSX01JTU9fUFNfU1RBVElDICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFdNSV9QRUVSX01JTU9fUFNfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICAgMHgyCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9zZXRfcGFyYW1fY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBwZWVyIE1BQyBhZGRyZXNzICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKKwkvKiogcGFyYW1ldGVyIGlkICAgKi8KKwlBX1VJTlQzMiBwYXJhbV9pZDsKKwkvKiogcGFyYW1ldHIgdmFsdWUgKi8KKwlBX1VJTlQzMiBwYXJhbV92YWx1ZTsKK30gd21pX3BlZXJfc2V0X3BhcmFtX2NtZF9maXhlZF9wYXJhbTsKKworI2RlZmluZSBNQVhfU1VQUE9SVEVEX1JBVEVTIDEyOAorCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIHRvdGFsIG51bWJlciBvZiByYXRlcyAqLworCUFfVUlOVDMyIG51bV9yYXRlczsKKwkvKioKKwkgKiByYXRlcyAoZWFjaCA4Yml0IHZhbHVlKSBwYWNrZWQgaW50byBhIDMyIGJpdCB3b3JkLgorCSAqIHRoZSByYXRlcyBhcmUgZmlsbGVkIGZyb20gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSB0byBtb3N0CisJICogc2lnbmlmaWNhbnQgYnl0ZS4KKwkgKi8KKwlBX1VJTlQzMiByYXRlc1soTUFYX1NVUFBPUlRFRF9SQVRFUyAvIDQpICsgMV07Cit9IHdtaV9yYXRlX3NldDsKKworLyogTk9URTogSXQgd291bGQgYmVhIGdvb2QgaWRlYSB0byByZXByZXNlbnQgdGhlIFR4IE1DUworICogaW5mbyBpbiBvbmUgd29yZCBhbmQgUnggaW4gYW5vdGhlciB3b3JkLiBUaGlzIGlzIHNwbGl0CisgKiBpbnRvIG11bHRpcGxlIHdvcmRzIGZvciBjb252ZW5pZW5jZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZodF9yYXRlX3NldCAqLworCUFfVUlOVDMyIHJ4X21heF9yYXRlOyAgICAgICAgICAgLyogTWF4IFJ4IGRhdGEgcmF0ZSAqLworCUFfVUlOVDMyIHJ4X21jc19zZXQ7ICAgICAgICAgICAgLyogTmVnb3RpYXRlZCBSWCBWSFQgcmF0ZXMgKi8KKwlBX1VJTlQzMiB0eF9tYXhfcmF0ZTsgICAgICAgICAgIC8qIE1heCBUeCBkYXRhIHJhdGUgKi8KKwlBX1VJTlQzMiB0eF9tY3Nfc2V0OyAgICAgICAgICAgIC8qIE5lZ290aWF0ZWQgVFggVkhUIHJhdGVzICovCit9IHdtaV92aHRfcmF0ZV9zZXQ7CisKKy8qCisgKiBJTVBPUlRBTlQ6IE1ha2Ugc3VyZSB0aGUgYml0IGRlZmluaXRpb25zIGhlcmUgYXJlIGNvbnNpc3RlbnQKKyAqIHdpdGggdGhlIG5pX2ZsYWdzIGRlZmluaXRpb25zIGluIHdsYW5fcGVlci5oCisgKi8KKyNkZWZpbmUgV01JX1BFRVJfQVVUSCAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIEF1dGhvcml6ZWQgZm9yIGRhdGEgKi8KKyNkZWZpbmUgV01JX1BFRVJfUU9TICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIFFvUyBlbmFibGVkICovCisjZGVmaW5lIFdNSV9QRUVSX05FRURfUFRLXzRfV0FZIDB4MDAwMDAwMDQgICAgICAvKiBOZWVkcyBQVEsgNCB3YXkgaGFuZHNoYWtlIGZvciBhdXRob3JpemF0aW9uICovCisjZGVmaW5lIFdNSV9QRUVSX05FRURfR1RLXzJfV0FZIDB4MDAwMDAwMTAgICAgICAvKiBOZWVkcyBHVEsgMiB3YXkgaGFuZHNoYWtlIGFmdGVyIDQtd2F5IGhhbmRzaGFrZSAqLworI2RlZmluZSBXTUlfUEVFUl9BUFNEICAgICAgICAgICAweDAwMDAwODAwICAgICAgLyogVS1BUFNEIHBvd2VyIHNhdmUgZW5hYmxlZCAqLworI2RlZmluZSBXTUlfUEVFUl9IVCAgICAgICAgICAgICAweDAwMDAxMDAwICAgICAgLyogSFQgZW5hYmxlZCAqLworI2RlZmluZSBXTUlfUEVFUl80ME1IWiAgICAgICAgICAweDAwMDAyMDAwICAgICAgLyogNDBNSHogZW5hYmxkICovCisjZGVmaW5lIFdNSV9QRUVSX1NUQkMgICAgICAgICAgIDB4MDAwMDgwMDAgICAgICAvKiBTVEJDIEVuYWJsZWQgKi8KKyNkZWZpbmUgV01JX1BFRVJfTERQQyAgICAgICAgICAgMHgwMDAxMDAwMCAgICAgIC8qIExEUEMgRU5hYmxlZCAqLworI2RlZmluZSBXTUlfUEVFUl9EWU5fTUlNT1BTICAgICAweDAwMDIwMDAwICAgICAgLyogRHluYW1pYyBNSU1PIFBTIEVuYWJsZWQgKi8KKyNkZWZpbmUgV01JX1BFRVJfU1RBVElDX01JTU9QUyAgMHgwMDA0MDAwMCAgICAgIC8qIFN0YXRpYyBNSU1PIFBTIGVuYWJsZWQgKi8KKyNkZWZpbmUgV01JX1BFRVJfU1BBVElBTF9NVVggICAgMHgwMDIwMDAwMCAgICAgIC8qIFNNIEVuYWJsZWQgKi8KKyNkZWZpbmUgV01JX1BFRVJfVkhUICAgICAgICAgICAgMHgwMjAwMDAwMCAgICAgIC8qIFZIVCBFbmFibGVkICovCisjZGVmaW5lIFdNSV9QRUVSXzgwTUhaICAgICAgICAgIDB4MDQwMDAwMDAgICAgICAvKiA4ME1IeiBlbmFibGQgKi8KKyNkZWZpbmUgV01JX1BFRVJfUE1GICAgICAgICAgICAgMHgwODAwMDAwMCAgICAgIC8qIFJvYnVzdCBNYW5hZ2VtZW50IEZyYW1lIFByb3RlY3Rpb24gZW5hYmxlZCAqLworLyoqIENBVVRJT04gVE9ETzogUGxhY2UgaG9sZGVyIGZvciBXTEFOX1BFRVJfRl9QU19QUkVTRU5EX1JFUVVJUkVEID0gMHgxMDAwMDAwMC4gTmVlZCB0byBiZSBjbGVhbiB1cCAqLworI2RlZmluZSBXTUlfUEVFUl9JU19QMlBfQ0FQQUJMRSAweDIwMDAwMDAwICAgICAgLyogUDJQIGNhcGFibGUgcGVlciAqLworI2RlZmluZSBXTUlfUEVFUl8xNjBNSFogICAgICAgICAweDQwMDAwMDAwICAgICAgLyogMTYwIE1IeiBlbmFibGVkICovCisjZGVmaW5lIFdNSV9QRUVSX1NBRkVNT0RFX0VOICAgIDB4ODAwMDAwMDAgICAgICAvKiBGaXBzIE1vZGUgRW5hYmxlZCAqLworCisvKioKKyAqIFBlZXIgcmF0ZSBjYXBhYmlsaXRpZXMuCisgKgorICogVGhpcyBpcyBvZiBpbnRlcmVzdCB0byB0aGUgcmF0ZWNvbnRyb2wKKyAqIG1vZHVsZSB3aGljaCByZXNpZGVzIGluIHRoZSBmaXJtd2FyZS4gVGhlIGJpdCBkZWZpbml0aW9ucyBhcmUKKyAqIGNvbnNpc3RlbnQgd2l0aCB0aGF0IGRlZmluZWQgaW4gaWZfYXRocmF0ZS5jLgorICoKKyAqIEB0b2RvCisgKiBNb3ZlIHRoaXMgdG8gYSBjb21tb24gaGVhZGVyIGZpbGUgbGF0ZXIgc28gdGhlcmUgaXMgbm8gbmVlZCB0bworICogZHVwbGljYXRlIHRoZSBkZWZpbml0aW9ucyBvciBtYWludGFpbiBjb25zaXN0ZW5jeS4KKyAqLworI2RlZmluZSBXTUlfUkNfRFNfRkxBRyAgICAgICAgICAweDAxICAgIC8qIER1YWwgc3RyZWFtIGZsYWcgKi8KKyNkZWZpbmUgV01JX1JDX0NXNDBfRkxBRyAgICAgICAgMHgwMiAgICAvKiBDVyA0MCAqLworI2RlZmluZSBXTUlfUkNfU0dJX0ZMQUcgICAgICAgICAweDA0ICAgIC8qIFNob3J0IEd1YXJkIEludGVydmFsICovCisjZGVmaW5lIFdNSV9SQ19IVF9GTEFHICAgICAgICAgIDB4MDggICAgLyogSFQgKi8KKyNkZWZpbmUgV01JX1JDX1JUU0NUU19GTEFHICAgICAgMHgxMCAgICAvKiBSVFMtQ1RTICovCisjZGVmaW5lIFdNSV9SQ19UWF9TVEJDX0ZMQUcgICAgIDB4MjAgICAgLyogVFggU1RCQyAqLworI2RlZmluZSBXTUlfUkNfVFhfU1RCQ19GTEFHX1MgICA1ICAgICAgIC8qIFRYIFNUQkMgKi8KKyNkZWZpbmUgV01JX1JDX1JYX1NUQkNfRkxBRyAgICAgMHhDMCAgICAvKiBSWCBTVEJDICwyIGJpdHMgKi8KKyNkZWZpbmUgV01JX1JDX1JYX1NUQkNfRkxBR19TICAgNiAgICAgICAvKiBSWCBTVEJDICwyIGJpdHMgKi8KKyNkZWZpbmUgV01JX1JDX1dFUF9US0lQX0ZMQUcgICAgMHgxMDAgICAvKiBXRVAvVEtJUCBlbmNyeXB0aW9uICovCisjZGVmaW5lIFdNSV9SQ19UU19GTEFHICAgICAgICAgIDB4MjAwICAgLyogVGhyZWUgc3RyZWFtIGZsYWcgKi8KKyNkZWZpbmUgV01JX1JDX1VBUFNEX0ZMQUcgICAgICAgMHg0MDAgICAvKiBVQVBTRCBSYXRlIENvbnRyb2wgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2Fzc29jX2NvbXBsZXRlX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiBwZWVyIE1BQyBhZGRyZXNzICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKKwkvKiogVkRFViBpZCAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIGFzc29jID0gMSByZWFzc29jID0gMCAqLworCUFfVUlOVDMyIHBlZXJfbmV3X2Fzc29jOworCS8qKiBwZWVyIGFzc29jaWQgKDE2IGJpdHMpICovCisJQV9VSU5UMzIgcGVlcl9hc3NvY2lkOworCS8qKiBwZWVyIHN0YXRpb24gZmxhZ3M6IHNlZSBkZWZpbml0aW9uIGFib3ZlICovCisJQV9VSU5UMzIgcGVlcl9mbGFnczsKKwkvKiogbmVnb3RpYXRlZCBjYXBhYmlsaXRpZXMgKGxvd2VyIDE2IGJpdHMpKi8KKwlBX1VJTlQzMiBwZWVyX2NhcHM7CisJLyoqIExpc3RlbiBpbnRlcnZhbCAqLworCUFfVUlOVDMyIHBlZXJfbGlzdGVuX2ludHZhbDsKKwkvKiogSFQgY2FwYWJpbHRpZXMgb2YgdGhlIHBlZXIgKi8KKwlBX1VJTlQzMiBwZWVyX2h0X2NhcHM7CisJLyoqIG1heGltdW0gcnggQS1NUERVIGxlbmd0aCAqLworCUFfVUlOVDMyIHBlZXJfbWF4X21wZHU7CisJLyoqIG1wZHUgZGVuc2l0eSBvZiB0aGUgcGVlciBpbiB1c2VjKDAgdG8gMTYpICovCisJQV9VSU5UMzIgcGVlcl9tcGR1X2RlbnNpdHk7CisJLyoqIHBlZXIgcmF0ZSBjYXBhYmlsdGllcyBzZWUgZmxhZ3MgYWJvdmUgKi8KKwlBX1VJTlQzMiBwZWVyX3JhdGVfY2FwczsKKwkvKiogbnVtIHNwYXRpYWwgc3RyZWFtcyAqLworCUFfVUlOVDMyIHBlZXJfbnNzOworCS8qKiBWSFQgY2FwYWJpbHRpZXMgb2YgdGhlIHBlZXIgKi8KKwlBX1VJTlQzMiBwZWVyX3ZodF9jYXBzOworCS8qKiBwaHkgbW9kZSAqLworCUFfVUlOVDMyIHBlZXJfcGh5bW9kZTsKKwkvKiogSFQgT3BlcmF0aW9uIEVsZW1lbnQgb2YgdGhlIHBlZXIuIEZpdmUgYnl0ZXMgcGFja2VkIGluIDIKKwkgKiAgSU5UMzIgYXJyYXkgYW5kIGZpbGxlZCBmcm9tIGxzYiB0byBtc2IuCisJICogIE5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhcnJheSBwZWVyX2h0X2luZm9bXSBjYW5ub3RiZSBjaGFuZ2VkCisJICogIHdpdGhvdXQgYnJlYWtpbmcgV01JIENvbXBhdGliaWxpdHkuICovCisJQV9VSU5UMzIgcGVlcl9odF9pbmZvWzJdOworCS8qKiB0b3RhbCBudW1iZXIgb2YgbmVnb3RpYXRlZCBsZWdhY3kgcmF0ZSBzZXQuIEFsc28gdGhlIHNpemVvZgorCSAqICBwZWVyX2xlZ2FjeV9yYXRlc1tdICovCisJQV9VSU5UMzIgbnVtX3BlZXJfbGVnYWN5X3JhdGVzOworCS8qKiB0b3RhbCBudW1iZXIgb2YgbmVnb3RpYXRlZCBodCByYXRlIHNldC4gQWxzbyB0aGUgc2l6ZW9mCisJICogIHBlZXJfaHRfcmF0ZXNbXSAqLworCUFfVUlOVDMyIG51bV9wZWVyX2h0X3JhdGVzOworCS8qIEZvbGxvd2luZyB0aGlzIHN0cnVjIGFyZSB0aGUgVExWJ3M6CisJICogICAgIEFfVUlOVDggcGVlcl9sZWdhY3lfcmF0ZXNbXTsKKwkgKiAgICAgQV9VSU5UOCBwZWVyX2h0X3JhdGVzW107CisJICogICAgIHdtaV92aHRfcmF0ZV9zZXQgcGVlcl92aHRfcmF0ZXM7IC8vVkhUIGNhcGFiaWx0aWVzIG9mIHRoZSBwZWVyCisJICovCit9IHdtaV9wZWVyX2Fzc29jX2NvbXBsZXRlX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfYWRkX3dkc19lbnRyeV9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogcGVlciBNQUMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIHdkcyBNQUMgYWRkciAqLworCXdtaV9tYWNfYWRkciB3ZHNfbWFjYWRkcjsKK30gd21pX3BlZXJfYWRkX3dkc19lbnRyeV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX3JlbW92ZV93ZHNfZW50cnlfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHdkcyBNQUMgYWRkciAqLworCXdtaV9tYWNfYWRkciB3ZHNfbWFjYWRkcjsKK30gd21pX3BlZXJfcmVtb3ZlX3dkc19lbnRyeV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogcGVlciBNQUMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7Cit9IHdtaV9wZWVyX3FfZW1wdHlfY2FsbGJhY2tfZXZlbnQ7CisKKy8qKgorICogQ2hhbm5lbCBpbmZvIFdNSSBldmVudAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfY2hhbl9pbmZvX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJLyoqIEVycm9yIGNvZGUgKi8KKwlBX1VJTlQzMiBlcnJfY29kZTsKKwkvKiogQ2hhbm5lbCBmcmVxICovCisJQV9VSU5UMzIgZnJlcTsKKwkvKiogUmVhZCBmbGFncyAqLworCUFfVUlOVDMyIGNtZF9mbGFnczsKKwkvKiogTm9pc2UgRmxvb3IgdmFsdWUgKi8KKwlBX1VJTlQzMiBub2lzZV9mbG9vcjsKKwkvKiogcnggY2xlYXIgY291bnQgKi8KKwlBX1VJTlQzMiByeF9jbGVhcl9jb3VudDsKKwkvKiogY3ljbGUgY291bnQgKi8KKwlBX1VJTlQzMiBjeWNsZV9jb3VudDsKK30gd21pX2NoYW5faW5mb19ldmVudF9maXhlZF9wYXJhbTsKKworLyoqCisgKiBOb24gd2xhbiBpbnRlcmZlcmVuY2UgZXZlbnQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX2F0aF9kY3NfY3dfaW50ICovCisJQV9VSU5UMzIgY2hhbm5lbDsgICAgICAgICAgICAgICAvKiBlaXRoZXIgbnVtYmVyIG9yIGZyZXEgaW4gbWh6ICovCit9IGF0aF9kY3NfY3dfaW50OworCisvKioKKyAqICB3bGFuX2Rjc19pbV90Z3Rfc3RhdHMKKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IF93bGFuX2Rjc19pbV90Z3Rfc3RhdHMgeworCS8qKiBjdXJyZW50IHJ1bm5pbmcgVFNGIGZyb20gdGhlIFRTRi0xICovCisJQV9VSU5UMzIgcmVnX3RzZjMyOworCisJLyoqIEtub3duIGxhc3QgZnJhbWUgcnNzaSwgaW4gY2FzZSBvZiBtdWx0aXBsZSBzdGF0aW9ucywgaWYKKwkgKiAgYW5kIGF0IGRpZmZlcmVudCByYW5nZXMsIHRoaXMgd291bGQgbm90IGdhdXJhbnRlZSB0aGF0CisJICogIHRoaXMgaXMgdGhlIGxlYXN0IHJzc2kuCisJICovCisJQV9VSU5UMzIgbGFzdF9hY2tfcnNzaTsKKworCS8qKiAgU3VtIG9mIGFsbCB0aGUgZmFpbGVkIGR1cmF0aW9ucyBpbiB0aGUgbGFzdCBvbmUgc2Vjb25kIGludGVydmFsLgorCSAqLworCUFfVUlOVDMyIHR4X3dhc3RlX3RpbWU7CisJLyoqIGNvdW50IGhvdyBtYW55IHRpbWVzIHRoZSBoYWxfcnhlcnJfcGh5IGlzIG1hcmtlZCwgaW4gdGhpcworCSAqICB0aW1lIHBlcmlvZAorCSAqLworCUFfVUlOVDMyIHJ4X3RpbWU7CisJQV9VSU5UMzIgcGh5ZXJyX2NudDsKKworCS8qKgorCSAqICBXTEFOIElNIHN0YXRzIGZyb20gdGFyZ2V0IHRvIGhvc3QKKwkgKgorCSAqICBCZWxvdyBzdGF0aXN0aWNzIGFyZSBzZW50IGZyb20gdGFyZ2V0IHRvIGhvc3QgcGVyaW9kaWNhbGx5LgorCSAqICBUaGVzZSBhcmUgY29sbGVjdGVkIGF0IHRhcmdldCBhcyBsb25nIGFzIHRhcmdldCBpcyBydW5uaW5nCisJICogIGFuZCB0YXJnZXQgY2hpcCBpcyBub3QgaW4gc2xlZXAuCisJICoKKwkgKi8KKworCS8qKiBsaXN0ZW4gdGltZSBmcm9tIEFOSSAqLworCUFfSU5UMzIgbGlzdGVuX3RpbWU7CisKKwkvKiogdHggZnJhbWUgY291bnQsIE1BQ19QQ1VfVFhfRlJBTUVfQ05UX0FERFJFU1MgKi8KKwlBX1VJTlQzMiByZWdfdHhfZnJhbWVfY250OworCisJLyoqIHJ4IGZyYW1lIGNvdW50LCBNQUNfUENVX1JYX0ZSQU1FX0NOVF9BRERSRVNTICovCisJQV9VSU5UMzIgcmVnX3J4X2ZyYW1lX2NudDsKKworCS8qKiByeCBjbGVhciBjb3VudCwgTUFDX1BDVV9SWF9DTEVBUl9DTlRfQUREUkVTUyAqLworCUFfVUlOVDMyIHJlZ19yeGNscl9jbnQ7CisKKwkvKiogdG90YWwgY3ljbGUgY291bnRzIE1BQ19QQ1VfQ1lDTEVfQ05UX0FERFJFU1MgKi8KKwlBX1VJTlQzMiByZWdfY3ljbGVfY250OyAgICAgICAgIC8qIGRlbHRhIGN5Y2xlIGNvdW50ICovCisKKwkvKiogZXh0ZW5zdGlvbiBjaGFubmVsIHJ4IGNsZWFyIGNvdW50ICAqLworCUFfVUlOVDMyIHJlZ19yeGNscl9leHRfY250OworCisJLyoqIE9GRE0gcGh5IGVycm9yIGNvdW50cywgTUFDX1BDVV9QSFlfRVJSX0NOVF8xX0FERFJFU1MgKi8KKwlBX1VJTlQzMiByZWdfb2ZkbV9waHllcnJfY250OworCisJLyoqIENDSyBwaHkgZXJyb3IgY291bnQsIE1BQ19QQ1VfUEhZX0VSUl9DTlRfMl9BRERSRVNTICovCisJQV9VSU5UMzIgcmVnX2Nja19waHllcnJfY250OyAgICAgICAgICAgIC8qIENDSyBlcnIgY291bnQgc2luY2UgbGFzdCByZXNldCwgcmVhZCBmcm9tIHJlZ2lzdGVyICovCisKK30gd2xhbl9kY3NfaW1fdGd0X3N0YXRzX3Q7CisKKy8qKgorICogIHdtaV9kY3NfaW50ZXJmZXJlbmNlX2V2ZW50X3QKKyAqCisgKiAgUmlnaHQgbm93IHRoaXMgaXMgZXZlbnQgYW5kIHN0YXRzIHRvZ2V0aGVyLiBQYXJ0bHkgdGhpcyBpcworICogIGJlY2F1c2UgY3cgaW50ZXJmZXJlbmNlIGlzIGhhbmRsZWQgaW4gdGFyZ2V0IG5vdy4gVGhpcworICogIGNhbiBiZSBkb25lIGF0IGhvc3QgaXRzZWxmLCBpZiB3ZSBjYW4gY2FycnkgdGhlIE5GIGFsb25lCisgKiAgYXMgYSBzdGF0cyBldmVudC4gSW4gZnV0dXJlIHRoaXMgd291bGQgYmUgZG9uZSBhbmQgdGhpcworICogIGV2ZW50IHdvdWxkIGNhcnJ5IG9ubHkgc3RhdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfZGNzX2ludGVyZmVyZW5jZV9ldmVudF9maXhlZF9wYXJhbSAqLworCS8qKgorCSAqIFR5cGUgb2YgdGhlIGV2ZW50IHByZXNlbnQsIGVpdGhlciB0aGUgY3cgaW50ZXJmZXJlbmNlIGV2ZW50LCBvciB0aGUgd2xhbl9pbSBzdGF0cworCSAqLworCUFfVUlOVDMyIGludGVyZmVyZW5jZV90eXBlOyAgICAgICAgICAgICAvKiB0eXBlIG9mIGludGVyZmVyZW5jZSwgd2xhbiBvciBjdyAqLworCS8qCisJICogRm9sbG93aW5nIHRoaXMgc3RydWN0IGFyZSB0aGVzZSBUTFZzLiBOb3RlIHRoYXQgdGhleSBhcmUgYm90aCBhcnJheSBvZiBzdHJ1Y3R1cmVzCisJICogYnV0IGNhbiBoYXZlIGF0IG1vc3Qgb25lIGVsZW1lbnQuIFdoaWNoIFRMViBpcyBlbXB0eSBvciBoYXMgb25lIGVsZW1lbnQgZGVwZW5kcworCSAqIG9uIHRoZSBmaWVsZCBpbnRlcmZlcmVuY2VfdHlwZS4gVGhpcyBpcyB0byBlbXVsYXRlIGFuIHVuaW9uIHdpdGggY3dfaW50IGFuZCB3bGFuX3N0YXQKKwkgKiBlbGVtZW50cyAobm90IGFycmF5cykuICAgICB1bmlvbiB7IGF0aF9kY3NfY3dfaW50IGN3X2ludDsgd2xhbl9kY3NfaW1fdGd0X3N0YXRzX3QgICB3bGFuX3N0YXQ7IH0gaW50X2V2ZW50OworCSAqCisJICogICAgICAgIC8vY3dfaW50ZXJmZXJlbmNlIGV2ZW50CisJICogICAgICAgYXRoX2Rjc19jd19pbnQgICAgICAgICAgICBjd19pbnRbXTsgIHRoaXMgZWxlbWVudAorCSAqICAgICAgIC8vIHdsYW4gaW0gaW50ZXJmZXJuY2Ugc3RhdHMKKwkgKiAgICAgICB3bGFuX2Rjc19pbV90Z3Rfc3RhdHNfdCAgIHdsYW5fc3RhdFtdOworCSAqLworfSB3bWlfZGNzX2ludGVyZmVyZW5jZV9ldmVudF9maXhlZF9wYXJhbTsKKworZW51bSB3bWlfcGVlcl9tY2FzdF9ncm91cF9hY3Rpb24geworCXdtaV9wZWVyX21jYXN0X2dyb3VwX2FjdGlvbl9hZGQgPSAwLAorCXdtaV9wZWVyX21jYXN0X2dyb3VwX2FjdGlvbl9kZWwgPSAxCit9OworI2RlZmluZSBXTUlfUEVFUl9NQ0FTVF9HUk9VUF9GTEFHX0FDVElPTl9NICAgMHgxCisjZGVmaW5lIFdNSV9QRUVSX01DQVNUX0dST1VQX0ZMQUdfQUNUSU9OX1MgICAwCisjZGVmaW5lIFdNSV9QRUVSX01DQVNUX0dST1VQX0ZMQUdfV0lMRENBUkRfTSAweDIKKyNkZWZpbmUgV01JX1BFRVJfTUNBU1RfR1JPVVBfRkxBR19XSUxEQ0FSRF9TIDEKKy8qIG11bHRpY2FzdCBncm91cCBtZW1iZXJzaGlwIGNvbW1hbmRzICovCisvKiBUT0RPOiBDb252ZXJ0aW5nIHRoaXMgd2lsbCBiZSB0cmlja3kgc2luY2UgaXQgdXNlcyBhbiB1bmlvbi4KKyAgIEFsc28sIHRoZSBtYWNfYWRkciBpcyBub3QgYWxpZ25lZC4gV2Ugd2lsbCBjb252ZXJ0IHRvIHRoZSB3bWlfbWFjX2FkZHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9tY2FzdF9ncm91cF9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiBmbGFnczsKKwl3bWlfbWFjX2FkZHIgdWNhc3RfbWFjX2FkZHI7CisJQV9VSU5UOCBtY2FzdF9pcF9hZGRyWzE2XTsgICAgICAgICAgICAgIC8qIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworfSB3bWlfcGVlcl9tY2FzdF9ncm91cF9jbWRfZml4ZWRfcGFyYW07CisKKy8qKiBPZmZsb2FkIFNjYW4gYW5kIFJvYW1pbmcgcmVsYXRlZCAgY29tbWFuZHMgKi8KKy8qKiBUaGUgRlcgcGVyZm9ybXMgMiBkaWZmZXJlbnQga2luZHMgb2Ygb2ZmbG9hZCBzY2FucyBpbmRlcGVuZGVudAorICogIG9mIGhvc3QuIE9uZSBpcyBSb2FtIHNjYW4gd2hpY2ggaXMgcHJpbWFyaWx5IHBlcmZvcm1lZCAgb24gYQorICogIHN0YXRpb24gVkRFViBhZnRlciBhc3NvY2lhdGlvbiB0byBsb29rIGZvciBhIGJldHRlciBBUCB0aGF0CisgKiAgdGhlIHN0YXRpb24gVkRFViBjYW4gcm9hbSB0by4gVGhlIHNlY29uZCBzY2FuIGlzIGNvbm5lY3Qgc2NhbgorICogIHdoaWNoIGlzIG1haW5seSBwZXJmb3JtZWQgd2hlbiB0aGUgc3RhdGlvbiBpcyBub3QgYXNzb2NpYXRlZAorICogIGFuZCB0byBsb29rIGZvciBhIG1hdGNoaW5nIEFQIHByb2ZpbGUgZnJvbSBhIGxpc3Qgb2YKKyAqICBjb25maWd1cmVkIHByb2ZpbGVzLiAqLworCisvKioKKyAqIFdNSV9ST0FNX1NDQU5fTU9ERTogU2V0IFJvYW0gU2NhbiBtb2RlCisgKiAgIHRoZSByb2FtIHNjYW4gbW9kZSBpcyBvbmUgb2YgdGhlIHBlcmlvZGljLCByc3NpIGNoYW5nZSwgYm90aCwgbm9uZS4KKyAqICAgTm9uZSAgICAgICAgOiBEaXNhYmxlIFJvYW0gc2Nhbi4gTm8gUm9hbSBzY2FuIGF0IGFsbC4KKyAqICAgUGVyaW9kaWMgICAgOiBTY2FuIHBlcmlvZGljYWxseSB3aXRoIGEgY29uZmlndXJhYmxlIHBlcmlvZC4KKyAqICAgUnNzaSBjaGFuZ2UgOiBTY2FuIHdoZW4gZXZlciByc3NpIHRvIGN1cnJlbnQgQVAgY2hhbmdlcyBieSB0aGUgdGhyZXNob2xkIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgc2V0IGJ5IFdNSV9ST0FNX1NDQU5fUlNTSV9DSEFOR0VfVEhSRVNIT0xEIGNvbW1hbmQuCisgKiAgIEJvdGggICAgICAgIDogQm90aCBvZiB0aGUgYWJvdmUgKHNjYW4gd2hlbiBlaXRoZXIgcGVyaW9kIGV4cGlyZXMgb3IgcnNzIHRvIGN1cnJlbnQgQVAgY2hhbmdlcyBieSBYIGFtb3VudCkKKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX21vZGVfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiByb2FtX3NjYW5fbW9kZTsKKwlBX1VJTlQzMiB2ZGV2X2lkOworfSB3bWlfcm9hbV9zY2FuX21vZGVfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX1JPQU1fU0NBTl9NT0RFX05PTkUgICAgICAgIDB4MAorI2RlZmluZSBXTUlfUk9BTV9TQ0FOX01PREVfUEVSSU9ESUMgICAgMHgxCisjZGVmaW5lIFdNSV9ST0FNX1NDQU5fTU9ERV9SU1NJX0NIQU5HRSAweDIKKyNkZWZpbmUgV01JX1JPQU1fU0NBTl9NT0RFX0JPVEggICAgICAgIDB4MworLyogTm90ZTogV01JX1JPQU1fU0NBTl9NT0RFX1JPQU1PRkZMT0FEIGlzIG9uZSBiaXQgbm90IGNvbmZsaWN0IHdpdGggTEZSMi4wIFNDQU5fTU9ERS4gKi8KKyNkZWZpbmUgV01JX1JPQU1fU0NBTl9NT0RFX1JPQU1PRkZMT0FEIDB4NAorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fc2Nhbl9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGNvbW1hbmRfYXJnOworfSB3bWlfcm9hbV9zY2FuX2NtZF9maXhlZF9wYXJhbTsKKworI2RlZmluZSBXTUlfUk9BTV9TQ0FOX1NUT1BfQ01EIDB4MQorCisvKioKKyAqIFdNSV9ST0FNX1NDQU5fUlNTSV9USFJFU0hPTEQgOiBzZXQgc2NhbiByc3NpIHRocmVzb2xkCisgKiAgc2NhbiByc3NpIHRocmVzaG9sZCBpcyB0aGUgcnNzaSB0aHJlc2hvbGQgYmVsb3cgd2hpY2ggdGhlIEZXIHdpbGwgc3RhcnQgcnVubmluZyBSb2FtIHNjYW5zLgorICogQXBwbGljYWJsZSB3aGVuIFdNSV9ST0FNX1NDQU5fTU9ERSBpcyBub3Qgc2V0IHRvIG5vbmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX3Jzc2lfdGhyZXNob2xkX2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiByb2FtIHNjYW4gcnNzaSB0aHJlc2hvbGQgKi8KKwlBX1VJTlQzMiByb2FtX3NjYW5fcnNzaV90aHJlc2g7CisJLyoqIFdoZW4gdXNpbmcgSHcgZ2VuZXJhdGVkIGJlYWNvbiBSU1NJIGludGVycnVwdHMgKi8KKwlBX1VJTlQzMiByb2FtX3Jzc2lfdGhyZXNoX2RpZmY7CisJLyoqIDVHIHNjYW4gbWF4IGNvdW50ICovCisJQV9VSU5UMzIgaGlyc3NpX3NjYW5fbWF4X2NvdW50OworCS8qKiA1RyBzY2FuIHJzc2kgY2hhbmdlIHRocmVzaG9sZCB2YWx1ZSAqLworCUFfVUlOVDMyIGhpcnNzaV9zY2FuX2RlbHRhOworCS8qKiA1RyBzY2FuIHVwcGVyIGJvdW5kICovCisJQV9VSU5UMzIgaGlyc3NpX3VwcGVyX2JvdW5kOworCS8qIFRoZSBUTFZzIHdpbGwgZm9sbG93LgorCSAqIHdtaV9yb2FtX3NjYW5fZXh0ZW5kZWRfdGhyZXNob2xkX3BhcmFtIGV4dGVuZGVkX3BhcmFtOworCSAqIHdtaV9yb2FtX2Vhcmx5c3RvcF9yc3NpX3RocmVzX3BhcmFtIGVhcmx5c3RvcF9wYXJhbTsKKwkgKi8KK30gd21pX3JvYW1fc2Nhbl9yc3NpX3RocmVzaG9sZF9maXhlZF9wYXJhbTsKKworI2RlZmluZSBXTUlfUk9BTV81R19CT09TVF9QRU5BTElaRV9BTEdPX0ZJWEVEICAweDAKKyNkZWZpbmUgV01JX1JPQU1fNUdfQk9PU1RfUEVOQUxJWkVfQUxHT19MSU5FQVIgMHgxCisjZGVmaW5lIFdNSV9ST0FNXzVHX0JPT1NUX1BFTkFMSVpFX0FMR09fTE9HICAgIDB4MgorI2RlZmluZSBXTUlfUk9BTV81R19CT09TVF9QRU5BTElaRV9BTEdPX0VYUCAgICAweDMKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKldNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fc2Nhbl9leHRlbmRlZF90aHJlc2hvbGRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIGJvb3N0X3RocmVzaG9sZF81ZzsgLyoqIFJTU0kgdGhyZXNob2xkIGFib3ZlIHdoaWNoIDVHSHogUlNTSSBpcyBmYXZvcmVkICovCisJQV9VSU5UMzIgcGVuYWx0eV90aHJlc2hvbGRfNWc7IC8qKiBSU1NJIHRocmVzaG9sZCBiZWxvdyB3aGljaCA1R0h6IFJTU0kgaXMgcGVuYWxpemVkICovCisJQV9VSU5UMzIgYm9vc3RfYWxnb3JpdGhtXzVnOyAvKiogMCA9PSBmaXhlZCwgMSA9PSBsaW5lYXIsIDIgPT0gbG9nYXJpdGhtIC4uZXRjICovCisJQV9VSU5UMzIgYm9vc3RfZmFjdG9yXzVnOyAvKiogZmFjdG9yIGJ5IHdoaWNoIDVHSHogUlNTSSBpcyBib29zdGVkICovCisJQV9VSU5UMzIgcGVuYWx0eV9hbGdvcml0aG1fNWc7IC8qKiAwID09IGZpeGVkLCAxID09IGxpbmVhciwgMiA9PSBsb2dhcml0aG0gLi5ldGMgKi8KKwlBX1VJTlQzMiBwZW5hbHR5X2ZhY3Rvcl81ZzsgLyoqIGZhY3RvciBieSB3aGljaCA1R0h6IFJTU0kgaXMgcGVuYWxpemVkICovCisJQV9VSU5UMzIgbWF4X2Jvb3N0XzVnOyAvKiogbWF4aW11bSBib29zdCB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgNUdIeiBSU1NJICovCisJQV9VSU5UMzIgbWF4X3BlbmFsdHlfNWc7IC8qKiBtYXhpbXVtIHBlbmFsaXR5IHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSA1R0h6IFJTU0kgKi8KKwkvKioKKwkgICogUlNTSSBiZWxvdyB3aGljaCByb2FtIGlzIGtpY2tlZCBpbiBieSBiYWNrZ3JvdW5kIHNjYW4KKwkgICogYWx0aG91Z2ggcnNzaSBpcyBzdGlsbCBnb29kCisJICAqLworCUFfVUlOVDMyIGdvb2RfcnNzaV90aHJlc2hvbGQ7Cit9IHdtaV9yb2FtX3NjYW5fZXh0ZW5kZWRfdGhyZXNob2xkX3BhcmFtOworCisKKy8qKgorICogV01JX1JPQU1fU0NBTl9QRVJJT0Q6IHBlcmlvZCBmb3Igcm9hbSBzY2FuLgorICogIEFwcGxpY2FibGUgd2hlbiB0aGUgc2NhbiBtb2RlIGlzIFBlcmlvZGljIG9yIGJvdGguCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zY2FuX3BlcmlvZF9maXhlZF9wYXJhbSAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogcm9hbSBzY2FuIHBlcmlvZCB2YWx1ZSAqLworCUFfVUlOVDMyIHJvYW1fc2Nhbl9wZXJpb2Q7CisJLyoqIEFnaW5nIGZvciBSb2FtIHNjYW5zICovCisJQV9VSU5UMzIgcm9hbV9zY2FuX2FnZTsKK30gd21pX3JvYW1fc2Nhbl9wZXJpb2RfZml4ZWRfcGFyYW07CisKKy8qKgorICogV01JX1JPQU1fU0NBTl9SU1NJX0NIQU5HRV9USFJFU0hPTEQgOiByc3NpIGRlbHRhIHRvIHRyaWdnZXIgdGhlIHJvYW0gc2Nhbi4KKyAqICAgUnNzaSBjaGFuZ2UgdGhyZXNob2xkIHVzZWQgd2hlbiBtb2RlIGlzIFJzc2kgY2hhbmdlIChvcikgQm90aC4KKyAqICAgVGhlIEZXIHdpbGwgcnVuIHRoZSByb2FtIHNjYW4gd2hlbiBldmVyIHRoZSByc3NpIGNoYW5nZXMgKHVwIG9yIGRvd24pIGJ5IHRoZSB2YWx1ZSBzZXQgYnkgdGhpcyBwYXJhbWV0ZXIuCisgKiAgIE5vdGUgc2NhbiBpcyB0cmlnZ2VyZWQgYmFzZWQgb24gdGhlIHJzc2kgdGhyZXNob2xkIGNvbmRpdGlvbiBzZXQgYnkgV01JX1JPQU1fU0NBTl9SU1NJX1RIUkVTSE9MRAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fc2Nhbl9yc3NpX2NoYW5nZV90aHJlc2hvbGRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHJvYW0gc2NhbiByc3NpIGNoYW5nZSB0aHJlc2hvbGQgdmFsdWUgKi8KKwlBX1VJTlQzMiByb2FtX3NjYW5fcnNzaV9jaGFuZ2VfdGhyZXNoOworCS8qKiBXaGVuIHVzaW5nIEh3IGdlbmVyYXRlZCBiZWFjb24gUlNTSSBpbnRlcnJ1cHRzICovCisJQV9VSU5UMzIgYmNuX3Jzc2lfd2VpZ2h0OworCS8qKiBNaW5pbXVtIGRlbGF5IGJldHdlZW4gdHdvIDVHIHNjYW5zICovCisJQV9VSU5UMzIgaGlyc3NpX2RlbGF5X2J0d19zY2FuczsKK30gd21pX3JvYW1fc2Nhbl9yc3NpX2NoYW5nZV90aHJlc2hvbGRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX1JPQU1fU0NBTl9DSEFOX0xJU1RfVFlQRV9OT05FIDB4MQorI2RlZmluZSBXTUlfUk9BTV9TQ0FOX0NIQU5fTElTVF9UWVBFX1NUQVRJQyAweDIKKyNkZWZpbmUgV01JX1JPQU1fU0NBTl9DSEFOX0xJU1RfVFlQRV9EWU5BTUlDIDB4MworLyoqCisgKiBUTFYgZm9yIHJvYW1pbmcgY2hhbm5lbCBsaXN0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9jaGFuX2xpc3RfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIFdNSV9DSEFOX0xJU1RfVEFHICovCisJQV9VSU5UMzIgY2hhbl9saXN0X3R5cGU7CisJLyoqICMgaWYgY2hhbm5lbHMgdG8gc2NhbiAqLworCUFfVUlOVDMyIG51bV9jaGFuOworLyoqCisgKiBUTFYgKHRhZyBsZW5ndGggdmFsdWUgKSBwYXJhbWV0ZXJzIGZvbGxvdyB0aGUgd21pX3JvYW1fY2hhbl9saXN0CisgKiBzdHJ1Y3R1cmUuIFRoZSBUTFYncyBhcmU6CisgKiAgICAgQV9VSU5UMzIgY2hhbm5lbF9saXN0W107CisgKiovCit9IHdtaV9yb2FtX2NoYW5fbGlzdF9maXhlZF9wYXJhbTsKKworLyoqIEF1dGhlbnRpY2F0aW9uIG1vZGVzICovCitlbnVtIHsKKwlXTUlfQVVUSF9OT05FLCAgICAgICAgICAvKiBubyB1cHBlciBsZXZlbCBhdXRoICovCisJV01JX0FVVEhfT1BFTiwgICAgICAgICAgLyogb3BlbiAqLworCVdNSV9BVVRIX1NIQVJFRCwgICAgICAgICAgICAgICAgLyogc2hhcmVkLWtleSAqLworCVdNSV9BVVRIXzgwMjFYLCAgICAgICAgIC8qIDgwMi4xeCAqLworCVdNSV9BVVRIX0FVVE8sICAgICAgICAgIC8qIEF1dG8gKi8KKwlXTUlfQVVUSF9XUEEsICAgICAgICAgICAvKiBXUEEgKi8KKwlXTUlfQVVUSF9SU05BLCAgICAgICAgICAvKiBXUEEyL1JTTkEgKi8KKwlXTUlfQVVUSF9DQ0tNLCAgICAgICAgICAvKiBDQ0sgKi8KKwlXTUlfQVVUSF9XQVBJLCAgICAgICAgICAvKiBXQVBJICovCisJV01JX0FVVEhfQVVUT19QU0ssCisJV01JX0FVVEhfV1BBX1BTSywKKwlXTUlfQVVUSF9SU05BX1BTSywKKwlXTUlfQVVUSF9XQVBJX1BTSywKKwlXTUlfQVVUSF9GVF9SU05BLCAgICAgICAgICAgICAgIC8qIDExciBGVCAqLworCVdNSV9BVVRIX0ZUX1JTTkFfUFNLLAorCVdNSV9BVVRIX1JTTkFfUFNLX1NIQTI1NiwKKwlXTUlfQVVUSF9SU05BXzgwMjFYX1NIQTI1NiwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogYXV0aGVudGljYXRpb24gbW9kZSAoZGVmaW5lZCBhYm92ZSkgICovCisJQV9VSU5UMzIgcnNuX2F1dGhtb2RlOworCS8qKiB1bmljYXN0IGNpcGhlciBzZXQgKi8KKwlBX1VJTlQzMiByc25fdWNhc3RjaXBoZXJzZXQ7CisJLyoqIG1jYXN0L2dyb3VwIGNpcGhlciBzZXQgKi8KKwlBX1VJTlQzMiByc25fbWNhc3RjaXBoZXJzZXQ7CisJLyoqIG1jYXN0L2dyb3VwIG1hbmFnZW1lbnQgZnJhbWVzIGNpcGhlciBzZXQgKi8KKwlBX1VJTlQzMiByc25fbWNhc3RtZ210Y2lwaGVyc2V0OworfSB3bWlfcnNuX3BhcmFtczsKKworLyoqIGxvb2tpbmcgZm9yIGEgd3BzIGVuYWJsZWQgQVAgKi8KKyNkZWZpbmUgV01JX0FQX1BST0ZJTEVfRkxBR19XUFMgICAgMHgxCisvKiogbG9va2luZyBmb3IgYSBzZWN1cmUgQVAgICovCisjZGVmaW5lIFdNSV9BUF9QUk9GSUxFX0ZMQUdfQ1JZUFRPIDB4MgorLyoqIGxvb2tpbmcgZm9yIGEgUE1GIGVuYWJsZWQgQVAgKi8KKyNkZWZpbmUgV01JX0FQX1BST0ZJTEVfRkxBR19QTUYgICAgMHg0CisKKy8qKiBUbyBtYXRjaCBhbiBvcGVuIEFQLCB0aGUgcnNfYXV0aG1vZGUgc2hvdWxkIGJlIHNldCB0byBXTUlfQVVUSF9OT05FCisgKiAgYW5kIFdNSV9BUF9QUk9GSUxFX0ZMQUdfQ1JZUFRPIHNob3VsZCBiZSBjbGVhci4KKyAqICBUbyBtYXRjaCBhIFdFUCBlbmFibGVkIEFQLCB0aGUgcnNfYXV0aG1vZGUgc2hvdWxkIGJlIHNldCB0byBXTUlfQVVUSF9OT05FCisgKiAgYW5kIFdNSV9BUF9QUk9GSUxFX0ZMQUdfQ1JZUFRPIHNob3VsZCBiZSBzZXQgLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfYXBfcHJvZmlsZSAqLworCS8qKiBmbGFncyBhcyBkZWZpbmVkIGFib3ZlICovCisJQV9VSU5UMzIgZmxhZ3M7CisJLyoqCisJICogcnNzaSB0aHJlc29sZCB2YWx1ZTogdGhlIHZhbHVlIG9mIHRoZSB0aGUgY2FuZGlkYXRlIEFQIHNob3VsZAorCSAqIGhpZ2hlciBieSB0aGlzIHRocmVzaG9sZCB0aGFuIHRoZSByc3NpIG9mIHRoZSBjdXJycmVudGx5IGFzc29jaWF0ZWQgQVAuCisJICovCisJQV9VSU5UMzIgcnNzaV90aHJlc2hvbGQ7CisJLyoqCisJICogc3NpZCB2bGF1ZSB0byBiZSBtYXRjaGVkLgorCSAqLworCXdtaV9zc2lkIHNzaWQ7CisKKwkvKioKKwkgKiBzZWN1cml0eSBwYXJhbXMgdG8gYmUgbWF0Y2hlZC4KKwkgKi8KKwkvKiogYXV0aGVudGljYXRpb24gbW9kZSAoZGVmaW5lZCBhYm92ZSkgICovCisJQV9VSU5UMzIgcnNuX2F1dGhtb2RlOworCS8qKiB1bmljYXN0IGNpcGhlciBzZXQgKi8KKwlBX1VJTlQzMiByc25fdWNhc3RjaXBoZXJzZXQ7CisJLyoqIG1jYXN0L2dyb3VwIGNpcGhlciBzZXQgKi8KKwlBX1VJTlQzMiByc25fbWNhc3RjaXBoZXJzZXQ7CisJLyoqIG1jYXN0L2dyb3VwIG1hbmFnZW1lbnQgZnJhbWVzIGNpcGhlciBzZXQgKi8KKwlBX1VJTlQzMiByc25fbWNhc3RtZ210Y2lwaGVyc2V0OworfSB3bWlfYXBfcHJvZmlsZTsKKworLyoqIFN1cHBvcnQgZWFybHkgc3RvcCByb2FtaW5nIHNjYW5uaW5nIHdoZW4gZmluZGluZyBhIHN0cm9uZyBjYW5kaWRhdGUgQVAKKyAqIEEgJ3N0cm9uZycgY2FuZGlkYXRlIGlzCisgKiAxKSBJcyBlbGlnaWJsZSBjYW5kaWRhdGUKKyAqICAgIChhbGwgY29uZGl0aW9ucyBhcmUgbWV0IGluIGV4aXN0aW5nIGNhbmRpZGF0ZSBzZWxlY3Rpb24pLgorICogMikgSXRzIHJzc2kgaXMgYmV0dGVyIHRoYW4gZWFybHlzdG9wIHRocmVzaG9sZC4KKyAqICAgIEVhcmx5c3RvcCB0aHJlc2hvbGQgd2lsbCBiZSByZWxheGVkIGFzIGVhY2ggY2hhbm5lbCBpcyBzY2FubmVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiBNaW5pbXVtIFJTU0kgdGhyZXNob2xkIHZhbHVlIGZvciBlYXJseSBzdG9wLCB1bml0IGlzIGRCIGFib3ZlIE5GLiAqLworCUFfVUlOVDMyIHJvYW1fZWFybHlzdG9wX3RocmVzX21pbjsKKwkvKiBNYW1pbnVtIFJTU0kgdGhyZXNob2xkIHZhbHVlIGZvciBlYXJseSBzdG9wLCB1bml0IGlzIGRCIGFib3ZlIE5GLiAqLworCUFfVUlOVDMyIHJvYW1fZWFybHlzdG9wX3RocmVzX21heDsKK30gd21pX3JvYW1fZWFybHlzdG9wX3Jzc2lfdGhyZXNfcGFyYW07CisKKy8qKiBCZWFjb24gZmlsdGVyIHdtaSBjb21tYW5kIGluZm8gKi8KKworI2RlZmluZSBCQ05fRkxUX01BWF9TVVBQT1JURURfSUVTICAgIDI1NgorI2RlZmluZSBCQ05fRkxUX01BWF9FTEVNU19JRV9MSVNUICAgIEJDTl9GTFRfTUFYX1NVUFBPUlRFRF9JRVMvMzIKKwordHlwZWRlZiBzdHJ1Y3QgYnNzX2Jjbl9zdGF0cyB7CisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBic3NfYmNuc2Ryb3BwZWQ7CisJQV9VSU5UMzIgYnNzX2JjbnNkZWxpdmVyZWQ7Cit9IHdtaV9ic3NfYmNuX3N0YXRzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGJjbl9maWx0ZXJfc3RhdHMgeworCUFfVUlOVDMyIGJjbnNfZHJvcHBlZDsKKwlBX1VJTlQzMiBiY25zX2RlbGl2ZXJlZDsKKwlBX1VJTlQzMiBhY3RpdmVmaWx0ZXJzOworCXdtaV9ic3NfYmNuX3N0YXRzX3QgYnNzX3N0YXRzOworfSB3bWlfYmNuZmlsdGVyX3N0YXRzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHdtaV9hZGRfYmNuX2ZpbHRlcl9jbWQgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hZGRfYmNuX2ZpbHRlcl9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qCisJICogRm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGlzIHRoZSBUTFY6CisJICogICAgQV9VSU5UMzIgICBpZV9tYXBbQkNOX0ZMVF9NQVhfRUxFTVNfSUVfTElTVF07CisJICovCit9IHdtaV9hZGRfYmNuX2ZpbHRlcl9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHdtaV9ybXZfYmNuX2ZpbHRlcl9jbWQgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ybXZfYmNuX2ZpbHRlcl9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworfSB3bWlfcm12X2Jjbl9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtOworCisjZGVmaW5lIFdNSV9CQ05fU0VORF9EVElNX1pFUk8gICAgICAgICAxCisjZGVmaW5lIFdNSV9CQ05fU0VORF9EVElNX0JJVENUTF9TRVQgICAyCit0eXBlZGVmIHN0cnVjdCB3bWlfYmNuX3NlbmRfZnJvbV9ob3N0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9iY25fc2VuZF9mcm9tX2hvc3RfY21kX2ZpeGVkX3BhcmFtICAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgZGF0YV9sZW47CisJQV9VSU5UMzIgZnJhZ19wdHI7ICAgICAgICAgICAgICAvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBmcmFtZSAqLworCUFfVUlOVDMyIGZyYW1lX2N0cmw7ICAgICAgICAgICAgLyogZmFybWUgY3RybCB0byBzZXR1cCBQUERVIGRlc2MgKi8KKwlBX1VJTlQzMiBkdGltX2ZsYWc7ICAgICAgICAgICAgIC8qIHRvIGNvbnRyb2wgQ0FCUSB0cmFmZmljICovCit9IHdtaV9iY25fc2VuZF9mcm9tX2hvc3RfY21kX2ZpeGVkX3BhcmFtOworCisvKiBjbWQgdG8gc3VwcG9ydCBiY24gc25kIGZvciBhbGwgdmFwcyBhdCBvbmNlICovCit0eXBlZGVmIHN0cnVjdCB3bWlfcGRldl9zZW5kX2JjbiB7CisJQV9VSU5UMzIgbnVtX3ZkZXZzOworCXdtaV9iY25fc2VuZF9mcm9tX2hvc3RfY21kX2ZpeGVkX3BhcmFtIGJjbl9jbWRbMV07Cit9IHdtaV9wZGV2X3NlbmRfYmNuX2NtZF90OworCisvKgorICogV01JX1JPQU1fQVBfUFJPRklMRTogIEFQIHByb2ZpbGUgb2YgY29ubmVjdGVkIEFQIGZvciByb2FtaW5nLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fYXBfcHJvZmlsZV9maXhlZF9wYXJhbSAqLworCS8qKiBpZCBvZiBBUCBjcml0ZXJpYSAqLworCUFfVUlOVDMyIGlkOworCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCisJLyoKKwkgKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMVjoKKwkgKiAgICAgd21pX2FwX3Byb2ZpbGUgYXBfcHJvZmlsZTsgLy9BUCBwcm9maWxlIGluZm8KKwkgKi8KK30gd21pX3JvYW1fYXBfcHJvZmlsZV9maXhlZF9wYXJhbTsKKworLyoqCisgKiBXTUlfT0ZMX1NDQU5fQUREX0FQX1BST0ZJTEU6IGFkZCBhbiBBUCBwcm9maWxlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIGlkIG9mIEFQIGNyaXRlcmlhICovCisJQV9VSU5UMzIgaWQ7CisKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisKKwkvKiogQVAgcHJvZmlsZSBpbmZvICovCisJd21pX2FwX3Byb2ZpbGUgYXBfcHJvZmlsZTsKKworfSB3bWlfb2ZsX3NjYW5fYWRkX2FwX3Byb2ZpbGU7CisKKy8qKgorICogV01JX09GTF9TQ0FOX1JFTU9WRV9BUF9DUklURVJJQTogcmVtb3ZlIGFuIGFwIHByb2ZpbGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogaWQgb2YgQVAgY3JpdGVyaWEgKi8KKwlBX1VJTlQzMiBpZDsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7Cit9IHdtaV9vZmxfc2Nhbl9yZW1vdmVfYXBfcHJvZmlsZTsKKworLyoqCisgKiBXTUlfT0ZMX1NDQU5fUEVSSU9EOiBwZXJpb2QgaW4gbXNlYyBmb3Igb2ZmbG9hZCBzY2FuLgorICogIDAgd2lsbCBkaXNhYmxlIG9mbG9hZCBzY2FuIGFuZCBhIHZlcnkgbG93IHZhbHVlIHdpbGwgcGVyZm9ybSBhIGNvbnRpbm91cworICogIHNjYW4uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogb2ZmbG9hZCBzY2FuIHBlcmlvZCB2YWx1ZSwgdXNlZCBmb3Igc2NhbnMgdXNlZCB3aGVuIG5vdCBjb25uZWN0ZWQgKi8KKwlBX1VJTlQzMiBvZmxfc2Nhbl9wZXJpb2Q7Cit9IHdtaV9vZmxfc2Nhbl9wZXJpb2Q7CisKKy8qIERvIG5vdCBtb2RpZnkgWFhYX0JZVEVTIG9yIFhYWF9MRU4gYmVsb3cgYXMgaXQgaXMgZml4ZWQgYnkgc3RhbmRhcmQgKi8KKyNkZWZpbmUgUk9BTV9PRkZMT0FEX1BNS19CWVRFUyAgICAgICAoMzIpCisjZGVmaW5lIFJPQU1fT0ZGTE9BRF9QU0tfTVNLX0JZVEVTICAgKDMyKQorI2RlZmluZSBST0FNX09GRkxPQURfS1JLX0JZVEVTICAgICAgICgxNikKKyNkZWZpbmUgUk9BTV9PRkZMT0FEX0JUS19CWVRFUyAgICAgICAoMzIpCisjZGVmaW5lIFJPQU1fT0ZGTE9BRF9SMEtIX0lEX01BWF9MRU4gKDQ4KQorI2RlZmluZSBST0FNX09GRkxPQURfTlVNX01DU19TRVQgICAgICgxNikKKworLyogVGhpcyBUTFYgd2lsbCBiZSBmaWxsZWQgb25seSBpbiBjYXNlIHJvYW0gb2ZmbG9hZAorICogZm9yIHdwYTItcHNrL29rYy9lc2UvMTFyIGlzIGVuYWJsZWQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9vZmZsb2FkX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgcnNzaV9jYXRfZ2FwOyAgICAgICAgICAvKiBnYXAgZm9yIGV2ZXJ5IGNhdGVnb3J5IGJ1Y2tldCAqLworCUFfVUlOVDMyIHByZWZlcl81ZzsgICAgICAgICAgICAgLyogcHJlZmVyIHNlbGVjdCA1RyBjYW5kaWRhdGUgKi8KKwlBX1VJTlQzMiBzZWxlY3RfNWdfbWFyZ2luOworCUFfVUlOVDMyIHJlYXNzb2NfZmFpbHVyZV90aW1lb3V0OyAgICAgICAgICAgICAgIC8qIHJlYXNzb2MgZmFpbHVyZSB0aW1lb3V0ICovCisJQV9VSU5UMzIgY2FwYWJpbGl0eTsKKwlBX1VJTlQzMiBodF9jYXBzX2luZm87CisJQV9VSU5UMzIgYW1wZHVfcGFyYW07CisJQV9VSU5UMzIgaHRfZXh0X2NhcDsKKwlBX1VJTlQzMiBodF90eGJmOworCUFfVUlOVDMyIGFzZWxfY2FwOworCUFfVUlOVDMyIHFvc19lbmFibGVkOworCUFfVUlOVDMyIHFvc19jYXBzOworCUFfVUlOVDMyIHdtbV9jYXBzOworCUFfVUlOVDMyIG1jc3NldFtST0FNX09GRkxPQURfTlVNX01DU19TRVQgPj4gMl07ICAgICAgICAgLyogc2luY2UgdGhpcyA0IGJ5dGUgYWxpZ25lZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdlIGRvbid0IGRlY2xhcmUgaXQgYXMKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRsdiBhcnJheSAqLworfSB3bWlfcm9hbV9vZmZsb2FkX3Rsdl9wYXJhbTsKKworLyogZmxhZ3MgZm9yIDExaSBvZmZsb2FkICovCisjZGVmaW5lIFdNSV9ST0FNX09GRkxPQURfRkxBR19PS0NfRU5BQkxFRCAgICAgICAwICAgICAgIC8qIG9rYyBpcyBlbmFibGVkICovCisvKiBmcm9tIGJpdCAxIHRvIGJpdCAzMSBhcmUgcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBXTUlfU0VUX1JPQU1fT0ZGTE9BRF9PS0NfRU5BQkxFRChmbGFnKSBkbyB7IFwKKwkJKGZsYWcpIHw9ICAoMSA8PCBXTUlfUk9BTV9PRkZMT0FEX0ZMQUdfT0tDX0VOQUJMRUQpOwkgIFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBXTUlfU0VUX1JPQU1fT0ZGTE9BRF9PS0NfRElTQUJMRUQoZmxhZykgZG8geyBcCisJCShmbGFnKSAmPSAgfigxIDw8IFdNSV9ST0FNX09GRkxPQURfRkxBR19PS0NfRU5BQkxFRCk7CSAgIFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBXTUlfR0VUX1JPQU1fT0ZGTE9BRF9PS0NfRU5BQkxFRChmbGFnKQkgXAorCSgoZmxhZykgJiAoMSA8PCBXTUlfUk9BTV9PRkZMT0FEX0ZMQUdfT0tDX0VOQUJMRUQpKQorCisvKiBUaGlzIFRMViB3aWxsIGJlICBmaWxsZWQgb25seSBpbiBjYXNlIG9mIHdwYS1wc2svd3BhMi1wc2sgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV8xMWlfb2ZmbG9hZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIGZsYWdzOworCS8qKiBmbGFncy4gc2VlIFdNSV9ST0FNX09GRkxPQURfRkxBR18gYWJvdmUgKi8KKwlBX1VJTlQzMiBwbWtbUk9BTV9PRkZMT0FEX1BNS19CWVRFUyA+PiAyXTsgICAgICAgICAgICAgIC8qIHBtayBvZmZsb2FkLiBBcyB0aGlzIDQgYnl0ZSBhbGlnbmVkLCB3ZSBkb24ndCBkZWNsYXJlIGl0IGFzIHRsdiBhcnJheSAqLworCUFfVUlOVDMyIHBta19sZW47CisJLyoqdGhlIGxlbmd0aCBvZiBwbWsuIGluIG5vcm1hbCBjYXNlIGl0IHNob3VsZCBiZSAzMiwgYnV0IGZvciBMRUFQLCBpcyBzaG91bGQgYmUgMTYqLworfSB3bWlfcm9hbV8xMWlfb2ZmbG9hZF90bHZfcGFyYW07CisKKy8qIFRoaXMgVExWIHdpbGwgYmUgIGZpbGxlZCBvbmx5IGluIGNhc2Ugb2YgMTFSKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV8xMXJfb2ZmbG9hZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIG1kaWVfcHJlc2VudDsKKwlBX1VJTlQzMiBtZGlkOworCUFfVUlOVDMyIHIwa2hfaWRbUk9BTV9PRkZMT0FEX1IwS0hfSURfTUFYX0xFTiA+PiAyXTsKKwlBX1VJTlQzMiByMGtoX2lkX2xlbjsKKwlBX1VJTlQzMiBwc2tfbXNrW1JPQU1fT0ZGTE9BRF9QU0tfTVNLX0JZVEVTID4+IDJdOyAgICAgICAgICAgICAgLyogcHNrL21zayBvZmZsb2FkLiBBcyB0aGlzIDQgYnl0ZSBhbGlnbmVkLCB3ZSBkb24ndCBkZWNsYXJlIGl0IGFzIHRsdiBhcnJheSAqLworCUFfVUlOVDMyIHBza19tc2tfbGVuOworCS8qKmxlbmd0aCBvZiBwc2tfbXNrKi8KK30gd21pX3JvYW1fMTFyX29mZmxvYWRfdGx2X3BhcmFtOworCisvKiBUaGlzIFRMViB3aWxsIGJlIGZpbGxlZCBvbmx5IGluIGNhc2Ugb2YgRVNFICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fZXNlX29mZmxvYWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiBrcmtbUk9BTV9PRkZMT0FEX0tSS19CWVRFUyA+PiAyXTsgICAgICAgICAgICAgIC8qIEtSSyBvZmZsb2FkLiBBcyB0aGlzIDQgYnl0ZSBhbGlnbmVkLCB3ZSBkb24ndCBkZWNsYXJlIGl0IGFzIHRsdiBhcnJheSAqLworCUFfVUlOVDMyIGJ0a1tST0FNX09GRkxPQURfQlRLX0JZVEVTID4+IDJdOyAgICAgICAgICAgICAgLyogQlRLIG9mZmxvYWQuIEFzIHRoaXMgNCBieXRlIGFsaWduZWQsIHdlIGRvbid0IGRlY2xhcmUgaXQgYXMgdGx2IGFycmF5ICovCit9IHdtaV9yb2FtX2VzZV9vZmZsb2FkX3Rsdl9wYXJhbTsKKworLyoqIFdNSV9ST0FNX0VWRU5UOiByb2FtIGV2ZW50IHRyaWdnZXJpbmcgdGhlIGhvc3Qgcm9hbSBsb2dpYy4KKyAqIGdlbmVyYXRlZCB3aGVuIGV2ZXIgYSBiZXR0ZXIgQVAgaXMgZm91bmQgaW4gdGhlIHJlY2VudCByb2FtIHNjYW4gKG9yKQorICogd2hlbiBiZWFjb24gbWlzcyBpcyBkZXRlY3RlZCAob3IpIHdoZW4gYSBERUFVVEgvRElTQVNTT0MgaXMgcmVjZWl2ZWQKKyAqIGZyb20gdGhlIGN1cnJlbnQgQVAuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX2V2ZW50X2ZpeGVkX3BhcmFtICAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogcmVhc29uIGZvciByb2FtIGV2ZW50ICovCisJQV9VSU5UMzIgcmVhc29uOworCS8qKiBhc3NvY2lhdGVkIEFQJ3MgcnNzaSBjYWxjdWxhdGVkIGJ5IEZXIHdoZW4gcmVhc29uIGNvZGUgaXMgV01JX1JPQU1fUkVBU09OX0xPV19SU1NJKi8KKwlBX1VJTlQzMiByc3NpOworCit9IHdtaV9yb2FtX2V2ZW50X2ZpeGVkX3BhcmFtOworCisjZGVmaW5lIFdNSV9ST0FNX1JFQVNPTl9CRVRURVJfQVAgMHgxIC8qKiBmb3VuZCBhIGJldHRlciBBUCAqLworI2RlZmluZSBXTUlfUk9BTV9SRUFTT05fQk1JU1MgICAgIDB4MiAvKiogYmVhY29uIG1pc3MgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgV01JX1JPQU1fUkVBU09OX0RFQVVUSCAgICAweDIgLyoqIGRlYXV0aC9kaXNhc3NvYyByZWNlaXZlZCAqLworI2RlZmluZSBXTUlfUk9BTV9SRUFTT05fTE9XX1JTU0kgIDB4MyAvKiogY29ubmVjdGVkIEFQJ3MgbG93IHJzc2kgY29uZGl0aW9uIGRldGVjdGVkICovCisjZGVmaW5lIFdNSV9ST0FNX1JFQVNPTl9TVUlUQUJMRV9BUCAweDQgLyoqIGZvdW5kIGFub3RoZXIgQVAgdGhhdCBtYXRjaGVzCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0lEIGFuZCBTZWN1cml0eSBwcm9maWxlIGluCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTUlfUk9BTV9BUF9QUk9GSUxFLCBmb3VuZCBkdXJpbmcgc2NhbgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkIHVwb24gRklOQUxfQk1JU1MgKiovCisjZGVmaW5lIFdNSV9ST0FNX1JFQVNPTl9IT19GQUlMRUQgIDB4NSAgLyoqIExGUjMuMCByb2FtaW5nIGZhaWxlZCwgaW5kaWNhdGUgdGhlIGRpc2Nvbm5lY3Rpb24gdG8gaG9zdCAqLworCisvKgorICogVGhlc2Ugd2lsbCBiZSB1c2VkIGluIFdNSV9ST0FNX1NZTkNIX0VWRU5USUQgZm9yIHBhc3NpbmcgdGhlIHN1Ym5ldCBjaGFuZ2UKKyAqIGluZm8uIE9uY2Ugcm9hbWluZyBoYXBwZW5zLCBmaXJtd2FyZSBjaGVja3MgaWYgc3VibmV0IGhhcyBjaGFuZ2VkIGFuZAorICogcG9wdWxhdGVzIHJvYW1fcmVhc29uIGZpZWxkIGluIFdNSV9ST0FNX1NZTkNIX0VWRU5USUQgdXNpbmcgdGhlIGRlZmluaXRpb25zCisgKiBiZWxvdy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlXTUlfUk9BTV9TVUJORVRfQ0hBTkdFX1NUQVRVU19VTktOT1dOID0gMCwKKwlXTUlfUk9BTV9TVUJORVRfQ0hBTkdFX1NUQVRVU19VTkNIQU5HRUQsCisJV01JX1JPQU1fU1VCTkVUX0NIQU5HRV9TVEFUVVNfQ0hBTkdFRCwKK30gd21pX3JvYW1fc3VibmV0X2NoYW5nZV9zdGF0dXM7CisKKy8qKndoZW5ldmVyIFJJQyByZXF1ZXN0IGluZm9ybWF0aW9uIGNoYW5nZSwgaG9zdCBkcml2ZXIgc2hvdWxkIHBhc3MgYWxsIHJpYyByZWxhdGVkIGluZm9ybWF0aW9uIHRvIGZpcm13YXJlIChub3cgb25seSBzdXBwb3J0IHRzZXBjKQorICogT25jZSwgMTFyIHJvYW1pbmcgaGFwcGVucywgZmlybXdhcmUgY2FuIGdlbmVyYXRlIFJJQyByZXF1ZXN0IGluIHJlYXNzb2MgcmVxdWVzdCBiYXNlZCBvbiB0aGVzZSBpbmZvcm1hdGlvbnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yaWNfcmVxdWVzdF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciovCisJQV9VSU5UMzIgbnVtX3JpY19yZXF1ZXN0OworCS8qKm51bWJlciBvZiByaWMgcmVxdWVzdCBpZSBzZW5kIHRvIGZpcm13YXJlLihtYXggdmFsdWUgaXMgMiBub3cpKi8KKwlBX1VJTlQzMiBpc19hZGRfcmljOworCS8qKnN1cHBvcnQgYWRkIHJpYyBvciBkZWxldGUgcmljKi8KK30gd21pX3JpY19yZXF1ZXN0X2ZpeGVkX3BhcmFtOworCisvKip0c3BlYyBlbGVtZW50OiByZWZlciB0byA4LjQuMi4zMiBvZiA4MDIuMTEgMjAxMiBzcGVjCisgKiB0aGVzZSBlbGVtZW50cyBhcmUgdXNlZCB0byBjb25zdHJ1Y3QgdHNwZWMgZmllbGQgaW4gUklDIHJlcXVlc3QsIHdoaWNoIGFsbG93IHN0YXRpb24gdG8gcmVxdWlyZSBzcGVjaWZpYyBUUyB3aGVuIDExciByb2FtaW5nCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIHRzX2luZm87ICAgICAgICAgICAgICAgICAgICAgLyoqIGJpdHMgdmFsdWUgb2YgVFMgSW5mbyBmaWVsZC4qLworCUFfVUlOVDMyIG5vbWluYWxfbXNkdV9zaXplOyAgICAgICAgICAgICAgICAgICAgIC8qKk5vbWluYWwgTVNEVSBTaXplIGZpZWxkKi8KKwlBX1VJTlQzMiBtYXhpbXVtX21zZHVfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKipUaGUgTWF4aW11bSBNU0RVIFNpemUgZmllbGQqLworCUFfVUlOVDMyIG1pbl9zZXJ2aWNlX2ludGVydmFsOyAgICAgICAgICAgICAgICAgICAgIC8qKlRoZSBNaW5pbXVtIFNlcnZpY2UgSW50ZXJ2YWwgZmllbGQqLworCUFfVUlOVDMyIG1heF9zZXJ2aWNlX2ludGVydmFsOyAgICAgICAgICAgICAgICAgICAgIC8qKlRoZSBNYXhpbXVtIFNlcnZpY2UgSW50ZXJ2YWwgZmllbGQqLworCUFfVUlOVDMyIGluYWN0aXZpdHlfaW50ZXJ2YWw7ICAgICAgICAgICAgICAgICAgICAgLyoqVGhlIEluYWN0aXZpdHkgSW50ZXJ2YWwgZmllbGQqLworCUFfVUlOVDMyIHN1c3BlbnNpb25faW50ZXJ2YWw7ICAgICAgICAgICAgICAgICAgICAgLyoqVGhlIFN1c3BlbnNpb24gSW50ZXJ2YWwgZmllbGQqLworCUFfVUlOVDMyIHN2Y19zdGFydF90aW1lOyAgICAgICAgICAgICAgICAgICAgIC8qKlRoZSBTZXJ2aWNlIFN0YXJ0IFRpbWUgZmllbGQqLworCUFfVUlOVDMyIG1pbl9kYXRhX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgLyoqVGhlIE1pbmltdW0gRGF0YSBSYXRlIGZpZWxkKi8KKwlBX1VJTlQzMiBtZWFuX2RhdGFfcmF0ZTsgICAgICAgICAgICAgICAgICAgICAvKipUaGUgTWVhbiBEYXRhIFJhdGUgZmllbGQqLworCUFfVUlOVDMyIHBlYWtfZGF0YV9yYXRlOyAgICAgICAgICAgICAgICAgICAgIC8qKlRoZSBQZWFrIERhdGEgUmF0ZSBmaWVsZCovCisJQV9VSU5UMzIgbWF4X2J1cnN0X3NpemU7ICAgICAgICAgICAgICAgICAgICAgLyoqVGhlIEJ1cnN0IFNpemUgZmllbGQqLworCUFfVUlOVDMyIGRlbGF5X2JvdW5kOyAgICAgICAgICAgICAgICAgICAgIC8qKlRoZSBEZWxheSBCb3VuZCBmaWVsZCovCisJQV9VSU5UMzIgbWluX3BoeV9yYXRlOyAgICAgICAgICAgICAgICAgICAgIC8qKlRoZSBNaW5pbXVtIFBIWSBSYXRlIGZpZWxkKi8KKwlBX1VJTlQzMiBzdXJwbHVzX2J3X2FsbG93YW5jZTsgICAgICAgICAgICAgICAgICAgICAvKipUaGUgU3VycGx1cyBCYW5kd2lkdGggQWxsb3dhbmNlIGZpZWxkKi8KKwlBX1VJTlQzMiBtZWRpdW1fdGltZTsgICAgICAgICAgICAgICAgICAgICAvKipUaGUgTWVkaXVtIFRpbWUgZmllbGQsaW4gdW5pdHMgb2YgMzIgdXMvcy4qLworfSB3bWlfcmljX3RzcGVjOworCisvKiBmbGFncyBmb3Igcm9hbV9pbnZva2VfY21kICovCisvKiBhZGQgdGhpcyBjaGFubmVsIGludG8gcm9hbSBjYWNoZSBjaGFubmVsIGxpc3QgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIGZpbmlzaGVkICovCisjZGVmaW5lIFdNSV9ST0FNX0lOVk9LRV9GTEFHX0FERF9DSF9UT19DQUNIRSAgICAgICAwCisvKiBmcm9tIGJpdCAxIHRvIGJpdCAzMSBhcmUgcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBXTUlfU0VUX1JPQU1fSU5WT0tFX0FERF9DSF9UT19DQUNIRShmbGFnKSBkbyB7IFwKKwkoZmxhZykgfD0gICgxIDw8IFdNSV9TRVRfUk9BTV9JTlZPS0VfQUREX0NIX1RPX0NBQ0hFKTsgICAgICBcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIFdNSV9DTEVBUl9ST0FNX0lOVk9LRV9BRERfQ0hfVE9fQ0FDSEUoZmxhZykgZG8geyBcCisJKGZsYWcpICY9ICB+KDEgPDwgV01JX1NFVF9ST0FNX0lOVk9LRV9BRERfQ0hfVE9fQ0FDSEUpOyAgICAgIFwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgV01JX0dFVF9ST0FNX0lOVk9LRV9BRERfQ0hfVE9fQ0FDSEUoZmxhZykgICBcCisgICAgICAgICgoZmxhZykgJiAoMSA8PCBXTUlfU0VUX1JPQU1fSU5WT0tFX0FERF9DSF9UT19DQUNIRSkpCisKKworI2RlZmluZSBXTUlfUk9BTV9JTlZPS0VfU0NBTl9NT0RFX0ZJWEVEX0NIICAgICAgMCAgIC8qIHNjYW4gZ2l2ZW4gY2hhbm5lbCBvbmx5ICovCisjZGVmaW5lIFdNSV9ST0FNX0lOVk9LRV9TQ0FOX01PREVfQ0FDSEVfTElTVCAgICAxICAgLyogc2NhbiBjYWNoZWQgY2hhbm5lbCBsaXN0ICovCisjZGVmaW5lIFdNSV9ST0FNX0lOVk9LRV9TQ0FOX01PREVfRlVMTF9DSCAgICAgICAyICAgLyogc2NhbiBmdWxsIGNoYW5uZWwgKi8KKworI2RlZmluZSBXTUlfUk9BTV9JTlZPS0VfQVBfU0VMX0ZJWEVEX0JTU0lEICAgICAgMCAgIC8qIHJvYW0gdG8gZ2l2ZW4gQlNTSUQgb25seSAqLworI2RlZmluZSBXTUlfUk9BTV9JTlZPS0VfQVBfU0VMX0FOWV9CU1NJRCAgICAgICAgMSAgIC8qIHJvYW0gdG8gYW55IEJTU0lEICovCisKKy8qKiBXTUlfUk9BTV9JTlZPS0VfQ01EOiBjb21tYW5kIHRvIGludm9rZSByb2FtaW5nIGZvcmNlZnVsbHkKKyAqCisgKiBpZiA8cm9hbV9zY2FuX2NoX21vZGU+IGlzIHplcm8gYW5kIDxjaGFubmVsX25vPiBpcyBub3QgZ2l2ZW4sIHJvYW1pbmcgaXMgbm90IGV4ZWN1dGVkLgorICogaWYgPHJvYW1fYXBfc2VsX21vZGU+IGlzIHplcm8gYW5kIDxCU1NJRCkgaXMgbm90IGdpdmVuLCByb2FtaW5nIGlzIG5vdCBleGVjdXRlZAorICoKKyAqIFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBhZGQgc3BlY2lmaWMgY2hhbm5lbCBpbnRvIHJvYW0gY2FjaGVkIGNoYW5uZWwgbGlzdCBieSBmb2xsb3dpbmcKKyAqIDxyb2FtX3NjYW5fY2hfbW9kZT4gPSAwCisgKiA8cm9hbV9hcF9zZWxfbW9kZT4gPSAwCisgKiA8cm9hbV9kZWxheT4gPSAwCisgKiA8ZmxhZz4gfD0gV01JX1JPQU1fSU5WT0tFX0ZMQUdfQUREX0NIX1RPX0NBQ0hFCisgKiA8QlNTSUQ+ID0gZG8gbm90IGZpbGwgKHRoZXJlIHdpbGwgYmUgbm8gYWN0dWFsIHJvYW1pbmcgYmVjYXVzZSBvZiBhcF9zZWxfbW9kZSBpcyB6ZXJvLCBidXQgbm8gQlNTSUQgaXMgZ2l2ZW4pCisgKiA8Y2hhbm5lbF9ubz4gPSBjaGFubmVsIGxpc3QgdG8gYmUgYWRkZWQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1faW52b2tlX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdmRldl9pZDsgLyoqIFVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViBvbiB3aGljaCByb2FtaW5nIGlzIGludm9rZWQgKi8KKwlBX1VJTlQzMiBmbGFnczsgICAvKiogZmxhZ3MuIHNlZSBXTUlfUk9BTV9JTlZPS0VfRkxBR18gYWJvdmUgKi8KKwlBX1VJTlQzMiByb2FtX3NjYW5fbW9kZTsgLyoqIHNlZSBXTUlfUk9BTV9JTlZPS0VfU0NBTl8gYWJvdmUgKi8KKwlBX1VJTlQzMiByb2FtX2FwX3NlbF9tb2RlOyAvKiogc2VlIFdNSV9ST0FNX0lOVk9LRV9BUF9TRUxfIGFib3ZlICovCisJQV9VSU5UMzIgcm9hbV9kZWxheTsgLyoqIDAgPSBpbW1lZGlhdGUgcm9hbSwgMS0yXjMyID0gcm9hbSBhZnRlciB0aGlzIGRlbGF5IChtc2VjKSAqLworCUFfVUlOVDMyIG51bV9jaGFuOyAvKiogIyBpZiBjaGFubmVscyB0byBzY2FuLiBJbiB0aGUgVExWIGNoYW5uZWxfbGlzdFtdICovCisJQV9VSU5UMzIgbnVtX2Jzc2lkOyAgLyoqIG51bWJlciBvZiBic3NpZHMuIEluIHRoZSBUTFYgYnNzaWRfbGlzdFtdICovCisJLyoqCisJICogVExWICh0YWcgbGVuZ3RoIHZhbHVlICkgcGFyYW1ldGVycyBmb2xsb3dzIHJvYW1faW52b2tlX3JlcQorCSAqIFRoZSBUTFYncyBhcmU6CisJICogICAgIEFfVUlOVDMyIGNoYW5uZWxfbGlzdFtdOworCSAqICAgICB3bWlfbWFjX2FkZHIgYnNzaWRfbGlzdFtdOworCSAqLworfSB3bWlfcm9hbV9pbnZva2VfY21kX2ZpeGVkX3BhcmFtOworCisvKiBEZWZpbml0aW9uIGZvciBvcF9iaXRtYXAgKi8KK2VudW0geworCVJPQU1fRklMVEVSX09QX0JJVE1BUF9CTEFDS19MSVNUID0gICAweDEsCisJUk9BTV9GSUxURVJfT1BfQklUTUFQX1dISVRFX0xJU1QgPSAgIDB4MiwKKwlST0FNX0ZJTFRFUl9PUF9CSVRNQVBfUFJFRkVSX0JTU0lEID0gMHg0LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9maWx0ZXJfbGlzdF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViBvbiB3aGljaCByb2FtaW5nIGZpbHRlciBpcyBhZG9wdGVkICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBmbGFnczsgLyoqIGZsYWdzIGZvciBmaWx0ZXIgKi8KKwkvKiogMzIgYml0IGJpdG1hcCB0byBiZSBzZXQgb24uCisJICogYml0MCA9IGZpcnN0IHBhcmFtLAorCSAqIGJpdCAxID0gc2Vjb25kIHBhcmFtLi4uZXRjLiBDYW4gYmUgb3InZWQKKwkgKi8KKwlBX1VJTlQzMiBvcF9iaXRtYXA7CisJLyogbnVtYmVyIG9mIGJsYWNrbGlzdCBpbiB0aGUgVExWIHZhcmlhYmxlIGJzc2lkX2JsYWNrX2xpc3QgKi8KKwlBX1VJTlQzMiBudW1fYnNzaWRfYmxhY2tfbGlzdDsKKwkvKiBudW1iZXIgb2Ygd2hpdGVsaXN0IGluIHRoZSBUTFYgdmFyaWFibGUgc3NpZF93aGl0ZV9saXN0ICovCisJQV9VSU5UMzIgbnVtX3NzaWRfd2hpdGVfbGlzdDsKKwkvKiBvbmx5IGZvciBsZnIgMy4wLiBudW1iZXIgb2YgcHJlZmVycmVkIGxpc3QgJiBmYWN0b3IgaW4gdGhlIFRMViAqLworCUFfVUlOVDMyIG51bV9ic3NpZF9wcmVmZXJyZWRfbGlzdDsKKwkvKioKKwkgKiBUTFYgKHRhZyBsZW5ndGggdmFsdWUgKSBwYXJhbWV0ZXJzIGZvbGxvd3Mgcm9hbV9maWx0ZXJfbGlzdF9jbWQKKwkgKiBUaGUgVExWJ3MgYXJlOgorCSAqICAgICB3bWlfbWFjX2FkZHIgYnNzaWRfYmxhY2tfbGlzdFtdOworCSAqICAgICB3bWlfc3NpZCBzc2lkX3doaXRlX2xpc3RbXTsKKwkgKiAgICAgd21pX21hY19hZGRyIGJzc2lkX3ByZWZlcnJlZF9saXN0W107CisJICogICAgIEFfVUlOVDMyIGJzc2lkX3ByZWZlcnJlZF9mYWN0b3JbXTsKKwkgKi8KK30gd21pX3JvYW1fZmlsdGVyX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UOCBhZGRyZXNzWzRdOyAvKiBJUFY0IGFkZHJlc3MgaW4gTmV0d29yayBCeXRlIE9yZGVyICovCit9IFdNSV9JUFY0X0FERFI7CisKK3R5cGVkZWYgc3RydWN0IF9XTUlfSVBWNl9BRERSIHsKKwlBX1VJTlQ4IGFkZHJlc3NbMTZdOyAvKiBJUFY2IGluIE5ldHdvcmsgQnl0ZSBPcmRlciAqLworfSBXTUlfSVBWNl9BRERSOworCisvKiBmbGFncyBmb3Igc3VibmV0IGNoYW5nZSBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgV01JX1JPQU1fU1VCTkVUX0NIQU5HRV9GTEFHX0lQNF9FTkFCTEVEIDAKKyNkZWZpbmUgV01JX1JPQU1fU1VCTkVUX0NIQU5HRV9GTEFHX0lQNl9FTkFCTEVEIDEKKy8qIGJpdCAyIHRvIGJpdCAzMSBhcmUgcmVzZXJ2ZWQgKi8KKworLyogc2V0IElQdjQgZW5hYmxlZC9kaXNhYmxlZCBmbGFnIGFuZCBnZXQgdGhlIGZsYWcgKi8KKyNkZWZpbmUgV01JX1NFVF9ST0FNX1NVQk5FVF9DSEFOR0VfRkxBR19JUDRfRU5BQkxFRChmbGFnKSBkbyB7IFwKKwkoZmxhZykgfD0gKDEgPDwgV01JX1JPQU1fU1VCTkVUX0NIQU5HRV9GTEFHX0lQNF9FTkFCTEVEKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBXTUlfU0VUX1JPQU1fU1VCTkVUX0NIQU5HRV9GTEFHX0lQNF9ESVNBQkxFRChmbGFnKSBkbyB7IFwKKwkoZmxhZykgJj0gfigxIDw8IFdNSV9ST0FNX1NVQk5FVF9DSEFOR0VfRkxBR19JUDRfRU5BQkxFRCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgV01JX0dFVF9ST0FNX1NVQk5FVF9DSEFOR0VfRkxBR19JUDRfRU5BQkxFRChmbGFnKSBcCisJKChmbGFnKSAmICgxIDw8IFdNSV9ST0FNX1NVQk5FVF9DSEFOR0VfRkxBR19JUDRfRU5BQkxFRCkpCisKKy8qIHNldCBJUHY2IGVuYWJsZWQgZmxhZywgZGlzYWJsZWQgYW5kIGdldCB0aGUgZmxhZyAqLworI2RlZmluZSBXTUlfU0VUX1JPQU1fU1VCTkVUX0NIQU5HRV9GTEFHX0lQNl9FTkFCTEVEKGZsYWcpIGRvIHsgXAorCShmbGFnKSB8PSAoMSA8PCBXTUlfUk9BTV9TVUJORVRfQ0hBTkdFX0ZMQUdfSVA2X0VOQUJMRUQpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFdNSV9TRVRfUk9BTV9TVUJORVRfQ0hBTkdFX0ZMQUdfSVA2X0RJU0FCTEVEKGZsYWcpIGRvIHsgXAorCShmbGFnKSAmPSB+KDEgPDwgV01JX1JPQU1fU1VCTkVUX0NIQU5HRV9GTEFHX0lQNl9FTkFCTEVEKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBXTUlfR0VUX1JPQU1fU1VCTkVUX0NIQU5HRV9GTEFHX0lQNl9FTkFCTEVEKGZsYWcpIFwKKwkoKGZsYWcpICYgKDEgPDwgV01JX1JPQU1fU1VCTkVUX0NIQU5HRV9GTEFHX0lQNl9FTkFCTEVEKSkKKworLyoqCisgKiBXTUlfUk9BTV9TVUJORVRfQ0hBTkdFX0NPTkZJRyA6IFBhc3MgdGhlIGdhdGV3YXkgSVAgYW5kIE1BQyBhZGRyZXNzZXMKKyAqICB0byBGVy4gRlcgdXNlcyB0aGVzZSBwYXJhbWV0ZXJzIGZvciBzdWJuZXQgY2hhbmdlIGRldGVjdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qCisJICogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogV01JVExWX1RBR19TVFJVQ193bWlfcm9hbV9zdWJuZXRfY2hhbmdlX2NvbmZpZ19maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyICAgICAgdGx2X2hlYWRlcjsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyICAgICAgdmRldl9pZDsKKwkvKiogSVB2NC9JUHY2IGVuYWJsZWQvZGlzYWJsZWQgKi8KKwkvKiogVGhpcyBmbGFnIHNldHMgdGhlIFdNSV9TRVRfUk9BTV9TVUJORVRfQ0hBTkdFX0ZMQUdfeHh4X0VOQUJMRUQvCisJRElTQUJMRUQgKi8KKwlBX1VJTlQzMiAgICAgIGZsYWc7CisJLyoqIEdhdGV3YXkgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgIGluZXRfZ3dfbWFjX2FkZHI7CisJLyoqIElQIGFkZHJlc3NlcyAqLworCVdNSV9JUFY0X0FERFIgaW5ldF9nd19pcF92NF9hZGRyOworCVdNSV9JUFY2X0FERFIgaW5ldF9nd19pcF92Nl9hZGRyOworCS8qKiBOdW1iZXIgb2Ygc29mdHdhcmUgcmV0cmllcyBmb3IgQVJQL05laWdoYm9yIHNvbGljaXRhdGlvbiByZXF1ZXN0ICovCisJQV9VSU5UMzIgICAgICBtYXhfcmV0cmllczsKKwkvKiogdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGVhY2ggQVJQIHJlcXVlc3QqLworCUFfVUlOVDMyICAgICAgdGltZW91dDsKKwkvKiogbnVtYmVyIG9mIHNraXBwZWQgYXBzICoqLworCUFfVUlOVDMyICAgICAgbnVtX3NraXBfc3VibmV0X2NoYW5nZV9kZXRlY3Rpb25fYnNzaWRfbGlzdDsKKy8qKgorICogVExWICh0YWcgbGVuZ3RoIHZhbHVlICkgcGFyYW1ldGVycyBmb2xsb3dzIHJvYW1fc3VibmV0X2NoYW5nZV9jb25maWdfY21kCisgKiBzdHJ1Y3R1cmUuIFRoZSBUTFYncyBhcmU6CisgKiAgICAgd21pX21hY19hZGRyIHNraXBfc3VibmV0X2NoYW5nZV9kZXRlY3Rpb25fYnNzaWRfbGlzdCBbXTsKKyAqKi8KK30gd21pX3JvYW1fc3VibmV0X2NoYW5nZV9jb25maWdfZml4ZWRfcGFyYW07CisKKy8qKiBXTUlfUFJPRklMRV9NQVRDSF9FVkVOVDogb2ZmbG9hZCBzY2FuCisgKiBnZW5lcmF0ZWQgd2hlbiBldmVyIGF0bGVhc3Qgb25lIG9mIHRoZSBtYXRjaGluZyBwcm9maWxlcyBpcyBmb3VuZAorICogaW4gcmVjZW50IE5MTyBzY2FuLiBubyBkYXRhIGlzIGNhcnJpZWQgd2l0aCB0aGUgZXZlbnQuCisgKi8KKworLyoqIFAyUCBzcGVjaWZpYyBjb21tYW5kcyAqLworCisvKioKKyAqIFdNSV9QMlBfREVWX1NFVF9ERVZJQ0VfSU5GTyA6IHAycCBkZXZpY2UgaW5mbywgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5CisgKiBGVyB0byBnZW5lcmF0ZSBQMlAgSUUgdG9iZSBjYXJyaWVkIGluIHByb2JlIHJlc3BvbnNlIGZyYW1lcy4KKyAqIEZXIHdpbGwgcmVzcG9uZCB0byBwcm9iZSByZXF1ZXN0cyB3aGlsZSBpbiBsaXN0ZW4gc3RhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBudW1iZXIgb2Ygc2Vjb25kYXJ5IGRldmljZSB0eXBlcyxzdXBwb3J0ZWQgKi8KKwlBX1VJTlQzMiBudW1fc2Vjb25kYXJ5X2Rldl90eXBlczsKKwkvKioKKwkgKiBmb2xsb3dlZCBieSA4IGJ5dGVzIG9mIHByaW1hcnkgZGV2aWNlIGlkIGFuZAorCSAqIG51bV9zZWNvbmRhcnlfZGV2X3R5cGVzICogOCBieXRlcyBvZiBzZWNvbmRhcnkgZGV2aWNlCisJICogaWQuCisJICovCit9IHdtaV9wMnBfZGV2X3NldF9kZXZpY2VfaW5mbzsKKworLyoqIFdNSV9QMlBfREVWX1NFVF9ESVNDT1ZFUkFCSUxJVFk6IGVuYWJsZS9kaXNhYmxlIGRpc2NvdmVyYWJpbGl0eQorICogIHN0YXRlLiBpZiBlbmFibGVkLCBhbiBhY3RpdmUgU1RBL0FQIHdpbGwgcmVzcG9uZCB0byBQMlAgcHJvYmUgcmVxdWVzdHMgb24KKyAqICB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgb2YgdGhlIFZERVYuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIDE6ZW5hYmxlIGRpc292ZXJhYmlsaXR5LCAwOmRpc2FibGUgZGlzY292ZXJhYmlsaXR5ICovCisJQV9VSU5UMzIgZW5hYmxlX2Rpc2NvdmVyYWJpbGl0eTsKK30gd21pX3AycF9zZXRfZGlzY292ZXJhYmlsaXR5OworCisvKiogV01JX1AyUF9HT19TRVRfQkVBQ09OX0lFOiBQMlAgSUUgdG8gYmUgYWRkZWQgdG8KKyAqICBiZWFjb25zIGdlbmVyYXRlZCBieSBGVy4gdXNlZCBpbiBGVyBiZWFjb24gbW9kZS4KKyAqICB0aGUgRlcgd2lsbCBhZGQgdGhpcyBJRSB0byBiZWFjb24gaW4gYWRkaXRpb24gdG8gdGhlIGJlYWNvbgorICogIHRlbXBsYXRlIHNldCBieSBXTUlfQkNOX1RNUExfQ01ESUQgY29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3AycF9nb19zZXRfYmVhY29uX2llX2ZpeGVkX3BhcmFtICAqLworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiBpZSBsZW5ndGggKi8KKwlBX1VJTlQzMiBpZV9idWZfbGVuOworCS8qIEZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgVExWIGJ5dGUgc3RyZWFtIG9mIGllIGRhdGEgb2YgbGVuZ3RoIGllX2J1Zl9sZW46CisJICogICAgIEFfVUlOVDggaWVfZGF0YVtdOyAgICAvLyBsZW5ndGggaW4gYnl0ZSBnaXZlbiBieSBmaWVsZCBudW1fZGF0YS4KKwkgKi8KKworfSB3bWlfcDJwX2dvX3NldF9iZWFjb25faWVfZml4ZWRfcGFyYW07CisKKy8qKiBXTUlfUDJQX0dPX1BST0JFX1JFU1BfSUU6IFAyUCBJRSB0byBiZSBhZGRlZCB0bworICogIHByb2JlIHJlc3BvbnNlIGdlbmVyYXRlZCBieSBGVy4gdXNlZCBpbiBGVyBiZWFjb24gbW9kZS4KKyAqICB0aGUgRlcgd2lsbCBhZGQgdGhpcyBJRSB0byBwcm9iZSByZXNwb25zZSBpbiBhZGRpdGlvbiB0byB0aGUgcHJvYmUgcmVzcG9uc2UKKyAqICB0ZW1wbGF0ZSBzZXQgYnkgV01JX1BSQl9UTVBMX0NNRElEIGNvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyogaWUgbGVuZ3RoICovCisJQV9VSU5UMzIgaWVfYnVmX2xlbjsKKwkvKmZvbGxvd2VkIGJ5ICBieXRlIHN0cmVhbSBvZiBpZSBkYXRhIG9mIGxlbmd0aCBpZV9idWZfbGVuICovCit9IHdtaV9wMnBfZ29fc2V0X3Byb2JlX3Jlc3BfaWU7CisKKy8qKiBXTUlfUDJQX1NFVF9WRU5ET1JfSUVfREFUQV9DTURJRDogVmVuZG9yIHNwZWNpZmljIFAyUCBJRSBkYXRhLCB3aGljaCB3aWxsCisgKiAgYmUgdXNlZCBieSB0aGUgRlcgdG8gcGFyc2UgdGhlIFAyUCBOb0EgYXR0cmlidXRlIGluIGJlYWNvbnMsIHByb2JlIHJlc3Bvc2VzCisgKiAgYW5kIGFjdGlvbiBmcmFtZXMgcmVjZWl2ZWQgYnkgdGhlIFAyUCBDbGllbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wMnBfc2V0X3ZlbmRvcl9pZV9kYXRhX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiBPUyBzcGVjaWZpYyBQMlAgSUUgT1VJICgzIGJ5dGVzKSArIE9VSSB0eXBlICgxIGJ5dGUpICAqLworCUFfVUlOVDMyIHAycF9pZV9vdWlfdHlwZTsKKwkvKiogT1Mgc3BlY2lmaWMgTm9BIEF0dHJpYnV0ZSBJRCAqLworCUFfVUlOVDMyIHAycF9ub2FfYXR0cmlidXRlOworfSB3bWlfcDJwX3NldF92ZW5kb3JfaWVfZGF0YV9jbWRfZml4ZWRfcGFyYW07CisKKy8qLS0tLVAyUCBkaXNjIG9mZmxvYWQgZGVmaW5pdGlvbiAgLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiBwYXR0ZXJuX3R5cGU7CisJLyoqCisJICogVExWICh0YWcgbGVuZ3RoIHZhbHVlICkgIHBhcmFtZXJ0ZXJzIGZvbGxvdyB0aGUgcGF0dGVybiBzdHJ1Y3R1cmUuCisJICogVExWIGNhbiBjb250YWluIGJzc2lkIGxpc3QsIHNzaWQgbGlzdCBhbmQKKwkgKiBpZS4gdGhlIFRMViB0YWdzIGFyZSBkZWZpbmVkIGFib3ZlOworCSAqLworfSB3bWlfcDJwX2Rpc2Nfb2ZmbG9hZF9wYXR0ZXJuX2NtZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qIG1nbXQgdHlwZSBvZiB0aGUgaWUgKi8KKwlBX1VJTlQzMiBtZ210X3R5cGU7CisJLyogaWUgbGVuZ3RoICovCisJQV9VSU5UMzIgaWVfYnVmX2xlbjsKKwkvKmZvbGxvd2VkIGJ5ICBieXRlIHN0cmVhbSBvZiBpZSBkYXRhIG9mIGxlbmd0aCBpZV9idWZfbGVuICovCit9IHdtaV9wMnBfZGlzY19vZmZsb2FkX2FwcGllX2NtZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIGVuYWJsZS9kaXNhYmxlIHAycCBmaW5kIG9mZmxvYWQgKi8KKwlBX1VJTlQzMiBlbmFibGU7CisJLyogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyogcDJwIGZpbmQgdHlwZSAqLworCUFfVUlOVDMyIGRpc2NfdHlwZTsKKwkvKiBwMnAgZmluZCBwZXJvZGljICovCisJQV9VSU5UMzIgcGVyb2RpYzsKKwkvKiBwMnAgZmluZCBsaXN0ZW4gY2hhbm5lbCAqLworCUFfVUlOVDMyIGxpc3Rlbl9jaGFubmVsOworCS8qIHAycCBmaW5kIGZ1bGwgY2hhbm5lbCBudW1iZXIgKi8KKwlBX1VJTlQzMiBudW1fc2Nhbl9jaGFuczsKKwkvKioKKwkgKiBUTFYgKHRhZyBsZW5ndGggdmFsdWUgKSAgcGFyYW1lcnRlcnMgZm9sbG93IHRoZSBwYXR0ZXJuIHN0cnVjdHVyZS4KKwkgKiBUTFYgIGNvbnRhaW4gY2hhbm5lbCBsaXN0CisJICovCit9IHdtaV9wMnBfZGlzY19vZmZsb2FkX2NvbmZpZ19jbWQ7CisKKy8qLS0tLVAyUCBPcHBQUyBkZWZpbml0aW9uICAtLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcDJwX3NldF9vcHBwc19jbWRfZml4ZWRfcGFyYW0gICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiBPcHBQUyBhdHRyaWJ1dGVzICovCisJLyoqIEJpdCAgMDogSW5kaWNhdGUgZW5hYmxlL2Rpc2FibGUgb2YgT3BwUFMKKwkgKglCaXRzIDctMToJQ3R3aW5kb3cgaW4gVFVzCisJICoJQml0cyAzMS04OiAgUmVzZXJ2ZWQKKwkgKi8KKwlBX1VJTlQzMiBvcHBwc19hdHRyOworfSB3bWlfcDJwX3NldF9vcHBwc19jbWRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX1VOSUZJRURfT1BQUFNfQVRUUl9FTkFMQkVEICAgICAgICAgIDB4MQorI2RlZmluZSBXTUlfVU5JRklFRF9PUFBQU19BVFRSX0VOQUxCRURfUyAgICAgICAgMAorCisjZGVmaW5lIFdNSV9VTklGSUVEX09QUFBTX0FUVFJfSVNfRU5BQkxFRChoZHIpCQkJIFwKKwlXTUlfRl9NUygoaGRyKS0+b3BwcHNfYXR0ciwgV01JX1VOSUZJRURfT1BQUFNfQVRUUl9FTkFMQkVEKQorCisjZGVmaW5lIFdNSV9VTklGSUVEX09QUFBTX0FUVFJfRU5BQkxFRF9TRVQoaGRyKQkJCVwKKwlXTUlfRl9STVcoKGhkciktPm9wcHBzX2F0dHIsIDB4MSwJCSBcCisJCSAgV01JX1VOSUZJRURfT1BQUFNfQVRUUl9FTkFMQkVEKTsKKworI2RlZmluZSBXTUlfVU5JRklFRF9PUFBQU19BVFRSX0NUV0lOICAgICAgICAgICAgMHhmZQorI2RlZmluZSBXTUlfVU5JRklFRF9PUFBQU19BVFRSX0NUV0lOX1MgICAgICAgICAgMQorCisjZGVmaW5lIFdNSV9VTklGSUVEX09QUFBTX0FUVFJfQ1RXSU5fR0VUKGhkcikJCQkgICAgIFwKKwlXTUlfRl9NUygoaGRyKS0+b3BwcHNfYXR0ciwgV01JX1VOSUZJRURfT1BQUFNfQVRUUl9DVFdJTikKKworI2RlZmluZSBXTUlfVU5JRklFRF9PUFBQU19BVFRSX0NUV0lOX1NFVChoZHIsIHYpCQlcCisJV01JX0ZfUk1XKChoZHIpLT5vcHBwc19hdHRyLCAodikgJiAweDdmLAkgICAgXAorCQkgIFdNSV9VTklGSUVEX09QUFBTX0FUVFJfQ1RXSU4pOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGltZTMyOyAgICAgICAgICAgICAgICAvKiB1cHBlciAzMiBiaXRzIG9mIHRpbWUgc3RhbXAgKi8KKwlBX1VJTlQzMiB0aW1lMDsgICAgICAgICAvKiBsb3dlciAzMiBiaXRzIG9mIHRpbWUgc3RhbXAgKi8KK30gQV9USU1FNjQ7CisKK3R5cGVkZWYgZW51bSB3bWlfcGVlcl9zdGFfa2lja291dF9yZWFzb24geworCVdNSV9QRUVSX1NUQV9LSUNLT1VUX1JFQVNPTl9VTlNQRUNJRklFRCA9IDAsICAgICAgICAgICAgLyogZGVmYXVsdCB2YWx1ZSB0byBwcmVzZXJ2ZSBsZWdhY3kgYmVoYXZpb3IgKi8KKwlXTUlfUEVFUl9TVEFfS0lDS09VVF9SRUFTT05fWFJFVFJZID0gMSwKKwlXTUlfUEVFUl9TVEFfS0lDS09VVF9SRUFTT05fSU5BQ1RJVklUWSA9IDIsCisJV01JX1BFRVJfU1RBX0tJQ0tPVVRfUkVBU09OX0lCU1NfRElTQ09OTkVDVCA9IDMsCisJV01JX1BFRVJfU1RBX0tJQ0tPVVRfUkVBU09OX1RETFNfRElTQ09OTkVDVCA9IDQsICAgICAgICAgICAgICAgIC8qIFRETFMgcGVlciBoYXMgZGlzYXBwZWFyZWQuIEFsbCB0eCBpcyBmYWlsaW5nICovCisJV01JX1BFRVJfU1RBX0tJQ0tPVVRfUkVBU09OX1NBX1FVRVJZX1RJTUVPVVQgPSA1LAorfSBQRUVSX0tJQ0tPVVRfUkVBU09OOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9zdGFfa2lja291dF9ldmVudF9maXhlZF9wYXJhbSAgKi8KKwkvKiogcGVlciBtYWMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIFJlYXNvbiBjb2RlLCBkZWZpbmVkIGFzIGFib3ZlICovCisJQV9VSU5UMzIgcmVhc29uOworCS8qKiBSU1NJIG9mIHRoZSBsYXN0IGJjbiAoYXZlcmFnZWQpIGluIGRCLiAwIG1lYW5zIE5vaXNlIEZsb29yIHZhbHVlICovCisJQV9VSU5UMzIgcnNzaTsKK30gd21pX3BlZXJfc3RhX2tpY2tvdXRfZXZlbnRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX1dMQU5fUFJPRklMRV9NQVhfSElTVCAgICAgMworI2RlZmluZSBXTUlfV0xBTl9QUk9GSUxFX01BWF9CSU5fQ05UIDMyCisKK3R5cGVkZWYgc3RydWN0IF93bWlfd2xhbl9wcm9maWxlX3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV93bGFuX3Byb2ZpbGVfdCAqLworCUFfVUlOVDMyIGlkOworCUFfVUlOVDMyIGNudDsKKwlBX1VJTlQzMiB0b3Q7CisJQV9VSU5UMzIgbWluOworCUFfVUlOVDMyIG1heDsKKwlBX1VJTlQzMiBoaXN0X2ludHZsOworCUFfVUlOVDMyIGhpc3RbV01JX1dMQU5fUFJPRklMRV9NQVhfSElTVF07Cit9IHdtaV93bGFuX3Byb2ZpbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX3dtaV93bGFuX3Byb2ZpbGVfY3R4X3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV93bGFuX3Byb2ZpbGVfY3R4X3QgKi8KKwlBX1VJTlQzMiB0b3Q7ICAgICAgICAgICAvKiB0aW1lIGluIHVzICovCisJQV9VSU5UMzIgdHhfbXNkdV9jbnQ7CisJQV9VSU5UMzIgdHhfbXBkdV9jbnQ7CisJQV9VSU5UMzIgdHhfcHBkdV9jbnQ7CisJQV9VSU5UMzIgcnhfbXNkdV9jbnQ7CisJQV9VSU5UMzIgcnhfbXBkdV9jbnQ7CisJQV9VSU5UMzIgYmluX2NvdW50OworfSB3bWlfd2xhbl9wcm9maWxlX2N0eF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3dsYW5fcHJvZmlsZV90cmlnZ2VyX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIGVuYWJsZTsKK30gd21pX3dsYW5fcHJvZmlsZV90cmlnZ2VyX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV93bGFuX3Byb2ZpbGVfZ2V0X3Byb2ZfZGF0YV9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB2YWx1ZTsKK30gd21pX3dsYW5fcHJvZmlsZV9nZXRfcHJvZl9kYXRhX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV93bGFuX3Byb2ZpbGVfc2V0X2hpc3RfaW50dmxfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgcHJvZmlsZV9pZDsKKwlBX1VJTlQzMiB2YWx1ZTsKK30gd21pX3dsYW5fcHJvZmlsZV9zZXRfaGlzdF9pbnR2bF9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfd2xhbl9wcm9maWxlX2VuYWJsZV9wcm9maWxlX2lkX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHByb2ZpbGVfaWQ7CisJQV9VSU5UMzIgZW5hYmxlOworfSB3bWlfd2xhbl9wcm9maWxlX2VuYWJsZV9wcm9maWxlX2lkX2NtZF9maXhlZF9wYXJhbTsKKworLypXaWZpIGhlYWRlciBpcyB1cHRvIDI2LCBMTEMgaXMgOCwgd2l0aCAxNCBieXRlIGR1cGxpY2F0ZSBpbiA4MDIuMyBoZWFkZXIsIHRoYXQncyAyNis4LTE0PTIwLgorICAgMTQ2LTEyOD0xOC4gU28gdGhpcyBtZWFucyBpdCBpcyBjb252ZXJ0ZWQgdG8gbm9uLVFvUyBoZWFkZXIuIFJpdmEgRlcgdGFrZSBjYXJlIG9mIHRoZSBRT1Mvbm9uLVFPUworICAgd2hlbiBjb21wYXJpbmcgd2lmaSBoZWFkZXIuKi8KKy8qIE5PVEU6IFdPV19ERUZBVUxUX0JJVE1BUF9QQVRURVJOX1NJWkUoX0RXT1JEKSBhbmQgV09XX0RFRkFVTFRfQklUTUFTS19TSVpFKF9EV09SRCkgY2FuJ3QgYmUgY2hhbmdlZCB3aXRob3V0IGJyZWFraW5nIHRoZSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFdPV19ERUZBVUxUX0JJVE1BUF9QQVRURVJOX1NJWkUgICAgICAxNDYKKyNkZWZpbmUgV09XX0RFRkFVTFRfQklUTUFQX1BBVFRFUk5fU0laRV9EV09SRCAzNyAgICAgICAgLyogQ29udmVydCBXT1dfREVGQVVMVF9FVlRfQlVGX1NJWkUgaW50byBJbnQzMiBzaXplICovCisjZGVmaW5lIFdPV19ERUZBVUxUX0JJVE1BU0tfU0laRSAgICAgICAgICAgICAxNDYKKyNkZWZpbmUgV09XX0RFRkFVTFRfQklUTUFTS19TSVpFX0RXT1JEICAgICAgICAzNworI2RlZmluZSBXT1dfTUFYX0JJVE1BUF9GSUxURVJTICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgV09XX0RFRkFVTFRfTUFHSUdfUEFUVEVSTl9NQVRDSF9DTlQgIDE2CisjZGVmaW5lIFdPV19FWFRFTkRfUEFUVEVSTl9NQVRDSF9DTlQgICAgICAgICAxNgorI2RlZmluZSBXT1dfU0hPUlRfUEFUVEVSTl9NQVRDSF9DTlQgICAgICAgICAgIDgKKyNkZWZpbmUgV09XX0RFRkFVTFRfRVZUX0JVRl9TSVpFICAgICAgICAgICAgIDE0OCAgICAgICAgLyogTWF4aW11bSAxNDggYnl0ZXMgb2YgdGhlIGRhdGEgaXMgY29waWVkIHN0YXJ0aW5nIGZyb20gaGVhZGVyIGluY2FzZSBpZiB0aGUgbWF0Y2ggaXMgZm91bmQuCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIDE0OCBjb21lcyBmcm9tICgxMjggLSAxNCApICBwYXlsb2FkIHNpemUgICsgOGJ5dGVzIExMQyArIDI2Ynl0ZXMgTUFDIGhlYWRlciAqLworI2RlZmluZSBXT1dfREVGQVVMVF9JT0FDX1BBVFRFUk5fU0laRSAgNgorI2RlZmluZSBXT1dfREVGQVVMVF9JT0FDX1BBVFRFUk5fU0laRV9EV09SRCAyCisjZGVmaW5lIFdPV19ERUZBVUxUX0lPQUNfUkFORE9NX1NJWkUgIDYKKyNkZWZpbmUgV09XX0RFRkFVTFRfSU9BQ19SQU5ET01fU0laRV9EV09SRCAyCisjZGVmaW5lIFdPV19ERUZBVUxUX0lPQUNfS0VFUF9BTElWRV9QS1RfU0laRSAgIDEyMAorI2RlZmluZSBXT1dfREVGQVVMVF9JT0FDX0tFRVBfQUxJVkVfUEtUX1NJWkVfRFdPUkQgMzAKKyNkZWZpbmUgV09XX0RFRkFVTFRfSU9BQ19TT0NLRVRfUEFUVEVSTl9TSVpFIDMyCisjZGVmaW5lIFdPV19ERUZBVUxUX0lPQUNfU09DS0VUX1BBVFRFUk5fU0laRV9EV09SRCA4CisjZGVmaW5lIFdPV19ERUZBVUxUX0lPQUNfS0VFUF9BTElWRV9QS1RfUkVWX1NJWkUgMzIKKyNkZWZpbmUgV09XX0RFRkFVTFRfSU9BQ19LRUVQX0FMSVZFX1BLVF9SRVZfU0laRV9EV09SRCA4CisKK3R5cGVkZWYgZW51bSBwYXR0ZXJuX3R5cGVfZSB7CisJV09XX1BBVFRFUk5fTUlOID0gMCwKKwlXT1dfQklUTUFQX1BBVFRFUk4gPSBXT1dfUEFUVEVSTl9NSU4sCisJV09XX0lQVjRfU1lOQ19QQVRURVJOLAorCVdPV19JUFY2X1NZTkNfUEFUVEVSTiwKKwlXT1dfV0lMRF9DQVJEX1BBVFRFUk4sCisJV09XX1RJTUVSX1BBVFRFUk4sCisJV09XX01BR0lDX1BBVFRFUk4sCisJV09XX0lQVjZfUkFfUEFUVEVSTiwKKwlXT1dfSU9BQ19QS1RfUEFUVEVSTiwKKwlXT1dfSU9BQ19UTVJfUEFUVEVSTiwKKwlXT1dfSU9BQ19TT0NLX1BBVFRFUk4sCisJV09XX1BBVFRFUk5fTUFYCit9IFdPV19QQVRURVJOX1RZUEU7CisKK3R5cGVkZWYgZW51bSBldmVudF90eXBlX2UgeworCVdPV19CTUlTU19FVkVOVCA9IDAsCisJV09XX0JFVFRFUl9BUF9FVkVOVCwKKwlXT1dfREVBVVRIX1JFQ1ZEX0VWRU5ULAorCVdPV19NQUdJQ19QS1RfUkVDVkRfRVZFTlQsCisJV09XX0dUS19FUlJfRVZFTlQsCisJV09XX0ZPVVJXQVlfSFNIQUtFX0VWRU5ULAorCVdPV19FQVBPTF9SRUNWRF9FVkVOVCwKKwlXT1dfTkxPX0RFVEVDVEVEX0VWRU5ULAorCVdPV19ESVNBU1NPQ19SRUNWRF9FVkVOVCwKKwlXT1dfUEFUVEVSTl9NQVRDSF9FVkVOVCwKKwlXT1dfQ1NBX0lFX0VWRU5ULAorCVdPV19QUk9CRV9SRVFfV1BTX0lFX0VWRU5ULAorCVdPV19BVVRIX1JFUV9FVkVOVCwKKwlXT1dfQVNTT0NfUkVRX0VWRU5ULAorCVdPV19IVFRfRVZFTlQsCisJV09XX1JBX01BVENIX0VWRU5ULAorCVdPV19IT1NUX0FVVE9fU0hVVERPV05fRVZFTlQsCisJV09XX0lPQUNfTUFHSUNfRVZFTlQsCisJV09XX0lPQUNfU0hPUlRfRVZFTlQsCisJV09XX0lPQUNfRVhURU5EX0VWRU5ULAorCVdPV19JT0FDX1RJTUVSX0VWRU5ULAorCVdPV19ERlNfUEhZRVJSX1JBREFSX0VWRU5ULAorCVdPV19CRUFDT05fRVZFTlQsCisJV09XX0NMSUVOVF9LSUNLT1VUX0VWRU5ULAorCVdPV19OQU5fRVZFTlQsCisJV09XX0VYVFNDQU5fRVZFTlQsCisJV09XX0lPQUNfUkVWX0tBX0ZBSUxfRVZFTlQsCisJV09XX0lPQUNfU09DS19FVkVOVCwKKwlXT1dfTkxPX1NDQU5fQ09NUExFVEVfRVZFTlQsCit9IFdPV19XQUtFX0VWRU5UX1RZUEU7CisKK3R5cGVkZWYgZW51bSB3YWtlX3JlYXNvbl9lIHsKKwlXT1dfUkVBU09OX1VOU1BFQ0lGSUVEID0gLTEsCisJV09XX1JFQVNPTl9OTE9EID0gMCwKKwlXT1dfUkVBU09OX0FQX0FTU09DX0xPU1QsCisJV09XX1JFQVNPTl9MT1dfUlNTSSwKKwlXT1dfUkVBU09OX0RFQVVUSF9SRUNWRCwKKwlXT1dfUkVBU09OX0RJU0FTU09DX1JFQ1ZELAorCVdPV19SRUFTT05fR1RLX0hTX0VSUiwKKwlXT1dfUkVBU09OX0VBUF9SRVEsCisJV09XX1JFQVNPTl9GT1VSV0FZX0hTX1JFQ1YsCisJV09XX1JFQVNPTl9USU1FUl9JTlRSX1JFQ1YsCisJV09XX1JFQVNPTl9QQVRURVJOX01BVENIX0ZPVU5ELAorCVdPV19SRUFTT05fUkVDVl9NQUdJQ19QQVRURVJOLAorCVdPV19SRUFTT05fUDJQX0RJU0MsCisJV09XX1JFQVNPTl9XTEFOX0hCLAorCVdPV19SRUFTT05fQ1NBX0VWRU5ULAorCVdPV19SRUFTT05fUFJPQkVfUkVRX1dQU19JRV9SRUNWLAorCVdPV19SRUFTT05fQVVUSF9SRVFfUkVDViwKKwlXT1dfUkVBU09OX0FTU09DX1JFUV9SRUNWLAorCVdPV19SRUFTT05fSFRUX0VWRU5ULAorCVdPV19SRUFTT05fUkFfTUFUQ0gsCisJV09XX1JFQVNPTl9IT1NUX0FVVE9fU0hVVERPV04sCisJV09XX1JFQVNPTl9JT0FDX01BR0lDX0VWRU5ULAorCVdPV19SRUFTT05fSU9BQ19TSE9SVF9FVkVOVCwKKwlXT1dfUkVBU09OX0lPQUNfRVhURU5EX0VWRU5ULAorCVdPV19SRUFTT05fSU9BQ19USU1FUl9FVkVOVCwKKwlXT1dfUkVBU09OX1JPQU1fSE8sCisJV09XX1JFQVNPTl9ERlNfUEhZRVJSX1JBREFEUl9FVkVOVCwKKwlXT1dfUkVBU09OX0JFQUNPTl9SRUNWLAorCVdPV19SRUFTT05fQ0xJRU5UX0tJQ0tPVVRfRVZFTlQsCisJV09XX1JFQVNPTl9OQU5fRVZFTlQsCisJV09XX1JFQVNPTl9FWFRTQ0FOLAorCVdPV19SRUFTT05fUlNTSV9CUkVBQ0hfRVZFTlQsCisJV09XX1JFQVNPTl9JT0FDX1JFVl9LQV9GQUlMX0VWRU5ULAorCVdPV19SRUFTT05fSU9BQ19TT0NLX0VWRU5ULAorCVdPV19SRUFTT05fTkxPX1NDQU5fQ09NUExFVEUsCisJV09XX1JFQVNPTl9QQUNLRVRfRklMVEVSX01BVENILAorCVdPV19SRUFTT05fQVNTT0NfUkVTX1JFQ1YsCisJV09XX1JFQVNPTl9SRUFTU09DX1JFUV9SRUNWLAorCVdPV19SRUFTT05fUkVBU1NPQ19SRVNfUkVDViwKKwlXT1dfUkVBU09OX0FDVElPTl9GUkFNRV9SRUNWLAorCVdPV19SRUFTT05fREVCVUdfVEVTVCA9IDB4RkYsCit9IFdPV19XQUtFX1JFQVNPTl9UWVBFOworCit0eXBlZGVmIGVudW0geworCVdPV19JRkFDRV9QQVVTRV9FTkFCTEVELAorCVdPV19JRkFDRV9QQVVTRV9ESVNBQkxFRAorfSBXT1dfSUZBQ0VfU1RBVFVTOworCitlbnVtIHsKKwkvKiBzb21lIHdpbjEwIHBsYXRmcm9tIHdpbGwgbm90IGFzc2VydCBwY2llX3Jlc2V0IGZvciB3b3cuKi8KKwlXTUlfV09XX0ZMQUdfSUdOT1JFX1BDSUVfUkVTRVQgPSAweDAwMDAwMDAxLAorfTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfd293X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW0gICovCisJQV9VSU5UMzIgZW5hYmxlOworCUFfVUlOVDMyIHBhdXNlX2lmYWNlX2NvbmZpZzsKKwlBX1VJTlQzMiBmbGFnczsgIC8qIFdNSV9XT1dfRkxBRyBlbnVtcyAqLworfSB3bWlfd293X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV93b3dfaG9zdHdha2V1cF9mcm9tX3NsZWVwX2NtZF9maXhlZF9wYXJhbSAgKi8KKwkvKiogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwlBX1VJTlQzMiByZXNlcnZlZDA7Cit9IHdtaV93b3dfaG9zdHdha2V1cF9mcm9tX3NsZWVwX2NtZF9maXhlZF9wYXJhbTsKKworI2RlZmluZSBXT1dfSUNNUFY2X05BX0ZJTFRFUl9ESVNBQkxFIDAKKyNkZWZpbmUgV09XX0lDTVBWNl9OQV9GSUxURVJfRU5BQkxFIDEKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFRMViB0YWcgYW5kIGxlbjsKKwkgKiB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3dvd19lbmFibGVfaWNtcHY2X25hX2ZsdF9jbWRfZml4ZWRfcGFyYW0KKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgZW5hYmxlOyAvKiBXT1dfSUNNUFY2X05BX0ZJTFRFUl9FTkFCTEUvRElTQUJMRSAqLworfSB3bWlfd293X2VuYWJsZV9pY21wdjZfbmFfZmx0X2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgYml0bWFwX3BhdHRlcm5fcyB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfV09XX0JJVE1BUF9QQVRURVJOX1QgKi8KKwlBX1VJTlQzMiBwYXR0ZXJuYnVmW1dPV19ERUZBVUxUX0JJVE1BUF9QQVRURVJOX1NJWkVfRFdPUkRdOworCUFfVUlOVDMyIGJpdG1hc2tidWZbV09XX0RFRkFVTFRfQklUTUFTS19TSVpFX0RXT1JEXTsKKwlBX1VJTlQzMiBwYXR0ZXJuX29mZnNldDsKKwlBX1VJTlQzMiBwYXR0ZXJuX2xlbjsKKwlBX1VJTlQzMiBiaXRtYXNrX2xlbjsKKwlBX1VJTlQzMiBwYXR0ZXJuX2lkOyAgICAgICAgICAgIC8qIG11c3QgYmUgbGVzcyB0aGFuIG1heF9iaXRtYXBfZmlsdGVycyAqLworfSBXT1dfQklUTUFQX1BBVFRFUk5fVDsKKwordHlwZWRlZiBzdHJ1Y3QgaXB2NF9zeW5jX3MgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dPV19JUFY0X1NZTkNfUEFUVEVSTl9UICovCisJQV9VSU5UMzIgaXB2NF9zcmNfYWRkcjsKKwlBX1VJTlQzMiBpcHY0X2RzdF9hZGRyOworCUFfVUlOVDMyIHRjcF9zcmNfcHJ0OworCUFfVUlOVDMyIHRjcF9kc3RfcHJ0OworfSBXT1dfSVBWNF9TWU5DX1BBVFRFUk5fVDsKKwordHlwZWRlZiBzdHJ1Y3QgaXB2Nl9zeW5jX3MgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dPV19JUFY2X1NZTkNfUEFUVEVSTl9UICovCisJQV9VSU5UMzIgaXB2Nl9zcmNfYWRkcls0XTsKKwlBX1VJTlQzMiBpcHY2X2RzdF9hZGRyWzRdOworCUFfVUlOVDMyIHRjcF9zcmNfcHJ0OworCUFfVUlOVDMyIHRjcF9kc3RfcHJ0OworfSBXT1dfSVBWNl9TWU5DX1BBVFRFUk5fVDsKKwordHlwZWRlZiBzdHJ1Y3QgV09XX01BR0lDX1BBVFRFUk5fQ01EIHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ19XT1dfTUFHSUNfUEFUVEVSTl9DTUQgKi8KKwl3bWlfbWFjX2FkZHIgbWFjYWRkcjsKK30gV09XX01BR0lDX1BBVFRFUk5fQ01EOworCit0eXBlZGVmIGVudW0gd293X2lvYWNfcGF0dGVybl90eXBlIHsKKwlXT1dfSU9BQ19NQUdJQ19QQVRURVJOID0gMSwKKwlXT1dfSU9BQ19TSE9SVF9QQVRURVJOLAorCVdPV19JT0FDX0VYVEVORF9QQVRURVJOLAorfSBXT1dfSU9BQ19QQVRURVJOX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IGlvYWNfc29ja19wYXR0ZXJuX3MgeworCS8qKgorCSAqIFRMViB0YWcgYW5kIGxlbjsKKwkgKiB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfV09XX0lPQUNfU09DS19QQVRURVJOX1QKKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIGlkOworCUFfVUlOVDMyIGxvY2FsX2lwdjQ7CisJQV9VSU5UMzIgcmVtb3RlX2lwdjQ7CisJQV9VSU5UMzIgbG9jYWxfcG9ydDsKKwlBX1VJTlQzMiByZW1vdGVfcG9ydDsKKwlBX1VJTlQzMiBwYXR0ZXJuX2xlbjsgLyogdW5pdHMgPSBieXRlcyAqLworCUFfVUlOVDMyIHBhdHRlcm5bV09XX0RFRkFVTFRfSU9BQ19TT0NLRVRfUEFUVEVSTl9TSVpFX0RXT1JEXTsKK30gV09XX0lPQUNfU09DS19QQVRURVJOX1Q7CisKK3R5cGVkZWYgc3RydWN0IGlvYWNfcGt0X3BhdHRlcm5fcyB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfV09XX0lPQUNfUEtUX1BBVFRFUk5fVCAqLworCUFfVUlOVDMyIHBhdHRlcm5fdHlwZTsKKwlBX1VJTlQzMiBwYXR0ZXJuW1dPV19ERUZBVUxUX0lPQUNfUEFUVEVSTl9TSVpFX0RXT1JEXTsKKwlBX1VJTlQzMiByYW5kb21bV09XX0RFRkFVTFRfSU9BQ19SQU5ET01fU0laRV9EV09SRF07CisJQV9VSU5UMzIgcGF0dGVybl9sZW47CisJQV9VSU5UMzIgcmFuZG9tX2xlbjsKK30gV09XX0lPQUNfUEtUX1BBVFRFUk5fVDsKKwordHlwZWRlZiBzdHJ1Y3QgaW9hY190bXJfcGF0dGVybl9zIHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ19XT1dfSU9BQ19UTVJfUEFUVEVSTl9UICovCisJQV9VSU5UMzIgd2FrZV9pbl9zOworCUFfVUlOVDMyIHZkZXZfaWQ7Cit9IFdPV19JT0FDX1RNUl9QQVRURVJOX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ19XTUlfV09XX0lPQUNfQUREX0tFRVBBTElWRV9DTURfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiBuSUQ7Cit9IFdNSV9XT1dfSU9BQ19BRERfS0VFUEFMSVZFX0NNRF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfSU9BQ19ERUxfS0VFUEFMSVZFX0NNRF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIG5JRDsKK30gV01JX1dPV19JT0FDX0RFTF9LRUVQQUxJVkVfQ01EX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCBpb2FjX2tlZXBhbGl2ZV9zIHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ19XTUlfV09XX0lPQUNfS0VFUEFMSVZFX1QgKi8KKwlBX1VJTlQzMgorCQlrZWVwYWxpdmVfcGt0X2J1ZgorCVtXT1dfREVGQVVMVF9JT0FDX0tFRVBfQUxJVkVfUEtUX1NJWkVfRFdPUkRdOworCUFfVUlOVDMyIGtlZXBhbGl2ZV9wa3RfbGVuOworCUFfVUlOVDMyIHBlcmlvZF9pbl9tczsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIG1heF9sb3NzX2NudDsKKwlBX1VJTlQzMiBsb2NhbF9pcHY0OworCUFfVUlOVDMyIHJlbW90ZV9pcHY0OworCUFfVUlOVDMyIGxvY2FsX3BvcnQ7CisJQV9VSU5UMzIgcmVtb3RlX3BvcnQ7CisJQV9VSU5UMzIgcmVjdl9wZXJpb2RfaW5fbXM7CisJQV9VSU5UMzIgcmV2X2thX3NpemU7CisJQV9VSU5UMzIgcmV2X2thX2RhdGFbV09XX0RFRkFVTFRfSU9BQ19LRUVQX0FMSVZFX1BLVF9SRVZfU0laRV9EV09SRF07Cit9IFdNSV9XT1dfSU9BQ19LRUVQQUxJVkVfVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfSU9BQ19BRERfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIHBhdHRlcm5fdHlwZTsKKy8qCisgKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3QgYXJlIHRoZXNlIFRMVnMuIE5vdGUgdGhhdCB0aGV5IGFyZSBhbGwgYXJyYXkgb2Ygc3RydWN0dXJlcworICogYnV0IGNhbiBoYXZlIGF0IG1vc3Qgb25lIGVsZW1lbnQuIFdoaWNoIFRMViBpcyBlbXB0eSBvciBoYXMgb25lIGVsZW1lbnQgZGVwZW5kcworICogb24gdGhlIGZpZWxkIHBhdHRlcm5fdHlwZS4gVGhpcyBpcyB0byBlbXVsYXRlIGFuIHVuaW9uLgorICogICAgIFdPV19JT0FDX1BLVF9QQVRURVJOX1QgcGF0dGVybl9pbmZvX3BrdFtdOworICogICAgIFdPV19JT0FDX1RNUl9QQVRURVJOX1QgcGF0dGVybl9pbmZvX3RtcltdOworICovCit9IFdNSV9XT1dfSU9BQ19BRERfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ19XTUlfV09XX0lPQUNfREVMX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBwYXR0ZXJuX3R5cGU7CisJQV9VSU5UMzIgcGF0dGVybl9pZDsKK30gV01JX1dPV19JT0FDX0RFTF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfV01JX1dPV19BRERfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIHBhdHRlcm5faWQ7CisJQV9VSU5UMzIgcGF0dGVybl90eXBlOworCS8qCisJICogRm9sbG93aW5nIHRoaXMgc3RydWN0IGFyZSB0aGVzZSBUTFZzLiBOb3RlIHRoYXQgdGhleSBhcmUgYWxsIGFycmF5IG9mIHN0cnVjdHVyZXMKKwkgKiBidXQgY2FuIGhhdmUgYXQgbW9zdCBvbmUgZWxlbWVudC4gV2hpY2ggVExWIGlzIGVtcHR5IG9yIGhhcyBvbmUgZWxlbWVudCBkZXBlbmRzCisJICogb24gdGhlIGZpZWxkIHBhdHRlcm5fdHlwZS4gVGhpcyBpcyB0byBlbXVsYXRlIGFuIHVuaW9uLgorCSAqICAgICBXT1dfQklUTUFQX1BBVFRFUk5fVCAgICAgICBwYXR0ZXJuX2luZm9fYml0bWFwW107CisJICogICAgIFdPV19JUFY0X1NZTkNfUEFUVEVSTl9UICAgIHBhdHRlcm5faW5mb19pcHY0W107CisJICogICAgIFdPV19JUFY2X1NZTkNfUEFUVEVSTl9UICAgIHBhdHRlcm5faW5mb19pcHY2W107CisJICogICAgIFdPV19NQUdJQ19QQVRURVJOX0NNRCAgICAgIHBhdHRlcm5faW5mb19tYWdpY19wYXR0ZXJuW107CisJICogICAgIEFfVUlOVDMyICAgICAgICAgICAgICAgICAgIHBhdHRlcm5faW5mb190aW1lb3V0W107CisJICogICAgIEFfVUlOVDMyICAgICAgICAgICAgICAgICAgIHJhX3JhdGVsaW1pdF9pbnRlcnZhbDsKKwkgKi8KK30gV01JX1dPV19BRERfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfREVMX1BBVFRFUk5fQ01EX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBwYXR0ZXJuX2lkOworCUFfVUlOVDMyIHBhdHRlcm5fdHlwZTsKK30gV01JX1dPV19ERUxfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfQUREX0RFTF9FVlRfQ01EX2ZpeGVkX3BhcmFtICAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgaXNfYWRkOworCUFfVUlOVDMyIGV2ZW50X2JpdG1hcDsKK30gV01JX1dPV19BRERfREVMX0VWVF9DTURfZml4ZWRfcGFyYW07CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNldCB0aGUgcGF0dGVybiB0byBjaGVjayBVRFAgcGFja2V0IGluIFdPVyBtb2RlLgorICogSWYgbWF0Y2gsIGNvbnN0cnVjdCBhIHR4IGZyYW1lIGluIGEgbG9jYWwgYnVmZmVyIHRvIHNlbmQgdGhyb3VnaCB0aGUgcGVlcgorICogQVAgdG8gdGhlIGVudGl0eSBpbiB0aGUgSVAgbmV0d29yayB0aGF0IHNlbnQgdGhlIFVEUCBwYWNrZXQgdG8gdGhpcyBTVEEuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIFRMViB0YWcgYW5kIGxlbjsKKwkgKiAgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dNSV9XT1dfVURQX1NWQ19PRkxEX0NNRF9maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBlbmFibGU7IC8qIDE6IGVuYWJsZSwgMDogZGlzYWJsZSAqLworCS8qCisJICogZGVzdF9wb3J0IC0KKwkgKiAgYml0cyA3OjAgIGNvbnRhaW4gdGhlIExTQiBvZiB0aGUgVURQIGRlc3QgcG9ydCwKKwkgKiAgYml0cyAxNTo4IGNvbnRhaW4gdGhlIE1TQiBvZiB0aGUgVURQIGRlc3QgcG9ydAorCSAqLworCUFfVUlOVDMyIGRlc3RfcG9ydDsKKwlBX1VJTlQzMiBwYXR0ZXJuX2xlbjsgLyogbGVuZ3RoIGluIGJ5dGUgb2YgcGF0dGVybltdICovCisJQV9VSU5UMzIgcmVzcG9uc2VfbGVuOyAvKiBsZW5ndGggaW4gYnl0ZSBvZiByZXNwb25zZVtdICovCisJLyoKKwkgKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3QgYXJlIHRoZSBUTFYnczoKKwkgKiAgcGF5bG9hZCBvZiBVRFAgcGFja2V0IHRvIGJlIGNoZWNrZWQsIG5ldHdvcmsgYnl0ZSBvcmRlcgorCSAqICAgQV9VSU5UOCBwYXR0ZXJuW107CisJICogIHBheWxvYWQgb2YgVURQIHBhY2tldCB0byBiZSByZXNwb25zZSwgbmV0d29yayBieXRlIG9yZGVyCisJICogICBBX1VJTlQ4IHJlc3BvbnNlW107CisJICovCit9IFdNSV9XT1dfVURQX1NWQ19PRkxEX0NNRF9maXhlZF9wYXJhbTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc2V0IHRoZSBwYXR0ZXJuIGZvciBXT1cgaG9zdCB3YWtldXAgcGluIHB1bHNlCisgKiBwYXR0ZXJuIGNvbmZpcmd1cmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoKKwkqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSogV01JVExWX1RBR19TVFJVQ19XTUlfV09XX0hPU1RXQUtFVVBfUElOX1BBVFRFUk5fQ09ORklHX0NNRF9maXhlZF9wYXJhbQorCSovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKworCS8qIDE6IGVuYWJsZSwgMDogZGlzYWJsZSAqLworCUFfVUlOVDMyIGVuYWJsZTsKKworCS8qIHBpbiBmb3IgaG9zdCB3YWtldXAgKi8KKwlBX1VJTlQzMiBwaW47CisKKwkvKiBpbnRlcnZhbCBmb3Iga2VlcGluZyBsb3cgdm9sdGFnZSwgdW5pdDogbXMgKi8KKwlBX1VJTlQzMiBpbnRlcnZhbF9sb3c7CisKKwkvKiBpbnRlcnZhbCBmb3Iga2VlcGluZyBoaWdoIHZvbHRhZ2UsIHVuaXQ6IG1zICovCisJQV9VSU5UMzIgaW50ZXJ2YWxfaGlnaDsKKworCS8qIHJlcGVhdCB0aW1lcyBmb3IgcHVsc2UgKDB4ZmZmZmZmZmYgbWVhbnMgZm9yZXZlcikgKi8KKwlBX1VJTlQzMiByZXBlYXRfY250OworfSBXTUlfV09XX0hPU1RXQUtFVVBfR1BJT19QSU5fUEFUVEVSTl9DT05GSUdfQ01EX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB3b3dfZXZlbnRfaW5mb19zIHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dPV19FVkVOVF9JTkZPX2ZpeGVkX3BhcmFtICAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgZmxhZzsgICAgICAgICAgLypUaGlzIGlzIGN1cnJlbnQgcmVzZXJ2ZWQuICovCisJQV9JTlQzMiB3YWtlX3JlYXNvbjsKKwlBX1VJTlQzMiBkYXRhX2xlbjsKK30gV09XX0VWRU5UX0lORk9fZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHdvd19pbml0aWFsX3dha2V1cF9ldmVudF9zIHsKKwkvKgorCSAqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdPV19JTklUSUFMX1dBS0VVUF9FVkVOVF9maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKK30gV09XX0lOSVRJQUxfV0FLRVVQX0VWRU5UX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCVdPV19FVkVOVF9JTkZPX1RZUEVfUEFDS0VUID0gMHgwMDAxLAorCVdPV19FVkVOVF9JTkZPX1RZUEVfQklUTUFQLAorCVdPV19FVkVOVF9JTkZPX1RZUEVfR1RLSUdUSywKK30gV09XX0VWRU5UX0lORk9fVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3Qgd293X2V2ZW50X2luZm9fc2VjdGlvbl9zIHsKKwlBX1VJTlQzMiBkYXRhX3R5cGU7CisJQV9VSU5UMzIgZGF0YV9sZW47Cit9IFdPV19FVkVOVF9JTkZPX1NFQ1RJT047CisKK3R5cGVkZWYgc3RydWN0IHdvd19ldmVudF9pbmZvX3NlY3Rpb25fcGFja2V0X3MgeworCUFfVUlOVDggcGFja2V0W1dPV19ERUZBVUxUX0VWVF9CVUZfU0laRV07Cit9IFdPV19FVkVOVF9JTkZPX1NFQ1RJT05fUEFDS0VUOworCit0eXBlZGVmIHN0cnVjdCB3b3dfZXZlbnRfaW5mb19zZWN0aW9uX2JpdG1hcF9zIHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dPV19FVkVOVF9JTkZPX1NFQ1RJT05fQklUTUFQICAqLworCUFfVUlOVDMyIGZsYWc7ICAgICAgICAgIC8qVGhpcyBpcyBjdXJyZW50IHJlc2VydmVkLiAqLworCUFfVUlOVDMyIHZhbHVlOyAgICAgICAgIC8qVGhpcyBjb3VsZCBiZSB0aGUgcGF0dGVybiBpZCBmb3IgYml0bWFwIHBhdHRlcm4uICovCisJQV9VSU5UMzIgb3JnX2xlbjsgICAgICAgICAgICAgICAvKlRoZSBsZW5ndGggb2YgdGhlIG9yZ2luYWwgcGFja2V0LiAqLworfSBXT1dfRVZFTlRfSU5GT19TRUNUSU9OX0JJVE1BUDsKKworLyoqCisgKiBUaGlzIGNvbW1hbmQgaXMgc2VudCBmcm9tIFdMQU4gaG9zdCBkcml2ZXIgdG8gZmlybXdhcmUgdG8KKyAqIGVuYWJsZSBvciBkaXNhYmxlIEQwLVdPVy4gRDAtV09XIG1lYW5zIEFQU1Mgc3VzcGVuZCB3aXRoCisgKiBQQ0llIGxpbmsgYW5kIEREUiBiZWluZyBhY3RpdmUuCisgKgorICoKKyAqIEVudGVyaW5nIEQwLVdPVyBNb2RlIChiYXNlZCBvbiBrZXJuZWwgc3VzcGVuZCByZXF1ZXN0KToKKyAqICAgIGhvc3QtPnRhcmdldDogV01JX0RPX1dPV19FTkFCTEVfRElTQUJMRV9DTURJRCAoZW5hYmxlID0gMSkKKyAqICAgIHRhcmdldDogVGFrZSBhY3Rpb24gKGUuZy4gZGJnbG9nIHN1c3BlbmQpCisgKiAgICB0YXJnZXQtPmhvc3Q6IEhUQ19BQ0sgKEhUQ19NU0dfU0VORF9TVVNQRU5EX0NPTVBMRVRFIG1lc3NhZ2UpCisgKgorICogRXhpdGluZyBEMC1XT1cgbW9kZSAoYmFzZWQgb24ga2VybmVsIHJlc3VtZSBPUiB0YXJnZXQtPmhvc3QgbWVzc2FnZSByZWNlaXZlZCkKKyAqICAgIGhvc3QtPnRhcmdldDogV01JX0RPX1dPV19FTkFCTEVfRElTQUJMRV9DTURJRCAoZW5hYmxlID0gMCkKKyAqICAgIHRhcmdldDogVGFrZSBhY3Rpb24gKGUuZy4gZGJnbG9nIHJlc3VtZSkKKyAqICAgIHRhcmdldC0+aG9zdDogV01JX0QwX1dPV19ESVNBQkxFX0FDS19FVkVOVElECisgKgorICogVGhpcyBjb21tYW5kIGlzIGFwcGxpY2FibGUgb25seSBvbiB0aGUgUENJRSBMTCBzeXN0ZW1zCisgKiBIb3N0IGNhbiBlbnRlciBlaXRoZXIgRDAtV09XIG9yIFdPVyBtb2RlLCBidXQgTk9UIGJvdGggYXQgc2FtZSB0aW1lCisgKiBEZWNpc2lvbiB0byBlbnRlciBEMC1XT1cgb3IgV09XIGlzIGJhc2VkIG9uIGFjdGl2ZSBpbnRlcmZhY2VzCisgKgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfZDBfd293X2VuYWJsZV9kaXNhYmxlX2NtZF9maXhlZF9wYXJhbSAgKi8KKwlBX1VJTlQzMiBlbmFibGU7ICAgICAgICAgICAgICAgIC8qIDEgPSBlbmFibGUsIDAgPSBkaXNhYmxlICovCit9IHdtaV9kMF93b3dfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0gZXh0ZW5kX3dvd190eXBlX2UgeworCUVYVFdPV19UWVBFX0FQUF9UWVBFMSwgICAgICAgICAgLyogZXh0ZW5kIHdvdyB0eXBlOiBvbmx5IGVuYWJsZSB3YWtldXAgZm9yIGFwcCB0eXBlMSAqLworCUVYVFdPV19UWVBFX0FQUF9UWVBFMiwgICAgICAgICAgLyogZXh0ZW5kIHdvdyB0eXBlOiBvbmx5IGVuYWJsZSB3YWtldXAgZm9yIGFwcCB0eXBlMiAqLworCUVYVFdPV19UWVBFX0FQUF9UWVBFMV8yLCAgICAgICAgICAgICAgICAvKiBleHRlbmQgd293IHR5cGU6IGVuYWJsZSB3YWtldXAgZm9yIGFwcCB0eXBlMSYyICovCisJRVhUV09XX0RJU0FCTEVEID0gMjU1LAorfSBFWFRXT1dfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIHdtaV9leHR3b3dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIHR5cGU7CisJQV9VSU5UMzIgd2FrZXVwX3Bpbl9udW07Cit9IHdtaV9leHR3b3dfZW5hYmxlX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIHdtaV9leHR3b3dfc2V0X2FwcF90eXBlMV9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtICAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJd21pX21hY19hZGRyIHdha2VlX21hYzsKKwlBX1VJTlQ4IGlkZW50WzhdOworCUFfVUlOVDggcGFzc3dkWzE2XTsKKwlBX1VJTlQzMiBpZGVudF9sZW47CisJQV9VSU5UMzIgcGFzc3dkX2xlbjsKK30gd21pX2V4dHdvd19zZXRfYXBwX3R5cGUxX3BhcmFtc19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyB3bWlfZXh0d293X3NldF9hcHBfdHlwZTJfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSAgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCisJQV9VSU5UOCByYzRfa2V5WzE2XTsKKwlBX1VJTlQzMiByYzRfa2V5X2xlbjsKKworCS8qKiBpcCBoZWFkZXIgcGFyYW1ldGVyICovCisJQV9VSU5UMzIgaXBfaWQ7ICAgICAgICAgLyogTkMgaWQgKi8KKwlBX1VJTlQzMiBpcF9kZXZpY2VfaXA7ICAgICAgICAgIC8qIE5DIElQIGFkZHJlc3MgKi8KKwlBX1VJTlQzMiBpcF9zZXJ2ZXJfaXA7ICAgICAgICAgIC8qIFB1c2ggc2VydmVyIElQIGFkZHJlc3MgKi8KKworCS8qKiB0Y3AgaGVhZGVyIHBhcmFtZXRlciAqLworCUFfVUlOVDE2IHRjcF9zcmNfcG9ydDsgICAgICAgICAgLyogTkMgVENQIHBvcnQgKi8KKwlBX1VJTlQxNiB0Y3BfZHN0X3BvcnQ7ICAgICAgICAgIC8qIFB1c2ggc2VydmVyIFRDUCBwb3J0ICovCisJQV9VSU5UMzIgdGNwX3NlcTsKKwlBX1VJTlQzMiB0Y3BfYWNrX3NlcTsKKworCUFfVUlOVDMyIGtlZXBhbGl2ZV9pbml0OyAgICAgICAgICAgICAgICAvKiBJbml0aWFsIHBpbmcgaW50ZXJ2YWwgKi8KKwlBX1VJTlQzMiBrZWVwYWxpdmVfbWluOyAgICAgICAgIC8qIE1pbmltdW0gcGluZyBpbnRlcnZhbCAqLworCUFfVUlOVDMyIGtlZXBhbGl2ZV9tYXg7ICAgICAgICAgLyogTWF4aW11bSBwaW5nIGludGVydmFsICovCisJQV9VSU5UMzIga2VlcGFsaXZlX2luYzsgICAgICAgICAvKiBJbmNyZW1lbnQgb2YgcGluZyBpbnRlcnZhbCAqLworCisJd21pX21hY19hZGRyIGdhdGV3YXlfbWFjOworCUFfVUlOVDMyIHRjcF90eF90aW1lb3V0X3ZhbDsKKwlBX1VJTlQzMiB0Y3BfcnhfdGltZW91dF92YWw7CisKKwkvKiogYWRkIGV4dHJhIHBhcmFtZXRlciBmb3IgYmFja3dhcmQtY29tcGF0aWJsZSAqLworCS8qCisJICogRm9yIGFsbCBieXRlIGFycmF5cywgbmF0dXJhbCBvcmRlciBpcyB1c2VkLiAgRS5nLgorCSAqIHJjNF93cml0ZV9zYW5kYm94WzBdIGhvbGRzIHRoZSAxc3QgUkM0IFMtYm94IGJ5dGUsCisJICogcmM0X3dyaXRlX3NhbmRib3hbMV0gaG9sZHMgdGhlIDJuZCBSQzQgUy1ib3ggYnl0ZSwgZXRjLgorCSAqLworCisJLyogdXNlZCB0byBlbmNyeXB0IHRyYW5zbWl0IHBhY2tldCBzdWNoIGFzIGtlZXAtYWxpdmUgKi8KKwlBX1VJTlQ4ICByYzRfd3JpdGVfc2FuZGJveFsyNTZdOworCUFfVUlOVDMyIHJjNF93cml0ZV94OworCUFfVUlOVDMyIHJjNF93cml0ZV95OworCisJLyogdXNlZCB0byBkZWNyeXB0IHJlY2VpdmVkIHBhY2tldCBzdWNoIGFzIHdvdyBkYXRhICovCisJQV9VSU5UOCAgcmM0X3JlYWRfc2FuZGJveFsyNTZdOworCUFfVUlOVDMyIHJjNF9yZWFkX3g7CisJQV9VSU5UMzIgcmM0X3JlYWRfeTsKKworCS8qIHVzZWQgdG8gY2FjdWxhdGUgSE1BQyBoYXNoIGZvciB0cmFuc21pdCBwYWNrZXQgc3VjaCBhcyBrZWVwLWFsaXZlICovCisJQV9VSU5UOCAgc3NsX3dyaXRlX3NlcVs4XTsKKwlBX1VJTlQ4ICBzc2xfc2hhMV93cml0ZV9rZXlbNjRdOworCUFfVUlOVDMyIHNzbF9zaGExX3dyaXRlX2tleV9sZW47CisKKwkvKiB1c2VkIHRvIGNhbGN1bGF0ZSBIQU1DIGhhc2ggZm9yIHJlY2VpdmUgcGFja2V0IHN1Y2ggYXMgd293IGRhdGEgKi8KKwlBX1VJTlQ4ICBzc2xfcmVhZF9zZXFbOF07CisJQV9VSU5UOCAgc3NsX3NoYTFfcmVhZF9rZXlbNjRdOworCUFfVUlOVDMyIHNzbF9zaGExX3JlYWRfa2V5X2xlbjsKKworCS8qIG9wdGlvbmFsIGVsZW1lbnQgZm9yIHNwZWNpZnlpbmcgVENQIG9wdGlvbnMgZGF0YSB0byBpbmNsdWRlIGluCisJICogdHJhbnNtaXQgcGFja2V0cyBzdWNoIGFzIGtlZXAtYWxpdmUKKwkgKi8KKwlBX1VJTlQzMiB0Y3Bfb3B0aW9uc19sZW47CisJQV9VSU5UOCAgdGNwX29wdGlvbnNbNDBdOworCisJQV9VSU5UMzIgYXN5bmNfaWQ7IC8qIGtlZXAtYWxpdmUgcmVxdWVzdCBpZCAqLworfSB3bWlfZXh0d293X3NldF9hcHBfdHlwZTJfcGFyYW1zX2NtZF9maXhlZF9wYXJhbTsKKworI2RlZmluZSBXTUlfUlhFUlJfQ1JDICAgICAgICAgICAgICAgMHgwMSAgICAgICAgLyogQ1JDIGVycm9yIG9uIGZyYW1lICovCisjZGVmaW5lIFdNSV9SWEVSUl9ERUNSWVBUICAgICAgICAgICAweDA4ICAgICAgICAvKiBub24tTWljaGFlbCBkZWNyeXB0IGVycm9yICovCisjZGVmaW5lIFdNSV9SWEVSUl9NSUMgICAgICAgICAgICAgICAweDEwICAgICAgICAvKiBNaWNoYWVsIE1JQyBkZWNyeXB0IGVycm9yICovCisjZGVmaW5lIFdNSV9SWEVSUl9LRVlfQ0FDSEVfTUlTUyAgICAweDIwICAgICAgICAvKiBOby9pbmNvcnJlY3Qga2V5IG1hdHRlciBpbiBoL3cgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlQS1RfUFdSX1NBVkVfUEFJRF9NQVRDSCA9IDB4MDAwMSwKKwlQS1RfUFdSX1NBVkVfR0lEX01BVENIID0gMHgwMDAyLAorCVBLVF9QV1JfU0FWRV9FQVJMWV9USU1fQ0xFQVIgPSAweDAwMDQsCisJUEtUX1BXUl9TQVZFX0VBUkxZX0RUSU1fQ0xFQVIgPSAweDAwMDgsCisJUEtUX1BXUl9TQVZFX0VPRl9QQURfREVMSU0gPSAweDAwMTAsCisJUEtUX1BXUl9TQVZFX01BQ0FERFJfTUlTTUFUQ0ggPSAweDAwMjAsCisJUEtUX1BXUl9TQVZFX0RFTElNX0NSQ19GQUlMID0gMHgwMDQwLAorCVBLVF9QV1JfU0FWRV9HSURfTlNUU19aRVJPID0gMHgwMDgwLAorCVBLVF9QV1JfU0FWRV9SU1NJX0NIRUNLID0gMHgwMTAwLAorCVBLVF9QV1JfU0FWRV81R19FQlQgPSAweDAyMDAsCisJUEtUX1BXUl9TQVZFXzJHX0VCVCA9IDB4MDQwMCwKKwlXTUlfUEtUX1BXUl9TQVZFX01BWCA9IDB4MDgwMCwKK30gV01JX1BLVF9QV1JfU0FWRV9UWVBFOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2Z0bV9pbnRnX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIG51bV9kYXRhOworCS8qKiBsZW5ndGggaW4gYnl0ZSBvZiBkYXRhW10uICovCisJLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzZW5kIEZhY3RvcnkgVGVzdCBNb2RlIFtGVE1dIGNvbW1hbmQKKwkgKiBmcm9tIGhvc3QgdG8gZmlybXdhcmUgZm9yIGludGVncmF0ZWQgY2hpcHMgd2hpY2ggYXJlIGJpbmFyeSBibG9icy4KKwkgKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMVjoKKwkgKiAgICAgQV9VSU5UOCBkYXRhW107ICAgIC8vIGxlbmd0aCBpbiBieXRlIGdpdmVuIGJ5IGZpZWxkIG51bV9kYXRhLgorCSAqLworfSB3bWlfZnRtX2ludGdfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2Z0bV9pbnRnX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgbnVtX2RhdGE7CisJLyoqIGxlbmd0aCBpbiBieXRlIG9mIGRhdGFbXS4gKi8KKwkvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJlY2VpdmUgRmFjdG9yeSBUZXN0IE1vZGUgW0ZUTV0gZXZlbnQKKwkgKiBmcm9tIGZpcm13YXJlIHRvIGhvc3QgZm9yIGludGVncmF0ZWQgY2hpcHMgd2hpY2ggYXJlIGJpbmFyeSBibG9icy4KKwkgKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMVjoKKwkgKiAgICAgQV9VSU5UOCBkYXRhW107ICAgIC8vIGxlbmd0aCBpbiBieXRlIGdpdmVuIGJ5IGZpZWxkIG51bV9kYXRhLgorCSAqLworfSB3bWlfZnRtX2ludGdfZXZlbnRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX01BWF9OU19PRkZMT0FEUyAgICAgICAgICAgMgorI2RlZmluZSBXTUlfTUFYX0FSUF9PRkZMT0FEUyAgICAgICAgICAyCisKKyNkZWZpbmUgV01JX0FSUE9GRl9GTEFHU19WQUxJRCAgICAgICAgICAgICAgKDEgPDwgMCkgICAgLyogdGhlIHR1cGxlIGVudHJ5IGlzIHZhbGlkICovCisjZGVmaW5lIFdNSV9BUlBPRkZfRkxBR1NfTUFDX1ZBTElEICAgICAgICAgICgxIDw8IDEpICAgIC8qIHRoZSB0YXJnZXQgbWFjIGFkZHJlc3MgaXMgdmFsaWQgKi8KKyNkZWZpbmUgV01JX0FSUE9GRl9GTEFHU19SRU1PVEVfSVBfVkFMSUQgICAgKDEgPDwgMikgICAgLyogcmVtb3RlIElQIGZpZWxkIGlzIHZhbGlkICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgICAgICAgICAvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfV01JX0FSUF9PRkZMT0FEX1RVUExFICovCisJQV9VSU5UMzIgZmxhZ3M7ICAgICAgICAgLyogZmxhZ3MgKi8KKwlBX1VJTlQ4IHRhcmdldF9pcGFkZHJbNF07ICAgICAgICAgICAgICAgLyogSVBWNCBhZGRyZXNzZXMgb2YgdGhlIGxvY2FsIG5vZGUgKi8KKwlBX1VJTlQ4IHJlbW90ZV9pcGFkZHJbNF07ICAgICAgICAgICAgICAgLyogc291cmNlIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBub2RlIHJlcXVlc3RpbmcgdGhlIEFSUCAocXVhbGlmaWVyKSAqLworCXdtaV9tYWNfYWRkciB0YXJnZXRfbWFjOyAgICAgICAgICAgICAgICAvKiBtYWMgYWRkcmVzcyBmb3IgdGhpcyB0dXBsZSwgaWYgbm90IHZhbGlkLCB0aGUgbG9jYWwgTUFDIGlzIHVzZWQgKi8KK30gV01JX0FSUF9PRkZMT0FEX1RVUExFOworCisjZGVmaW5lIFdNSV9OU09GRl9GTEFHU19WQUxJRCAgICAgICAgICAgKDEgPDwgMCkgICAgICAgIC8qIHRoZSB0dXBsZSBlbnRyeSBpcyB2YWxpZCAqLworI2RlZmluZSBXTUlfTlNPRkZfRkxBR1NfTUFDX1ZBTElEICAgICAgICgxIDw8IDEpICAgICAgICAvKiB0aGUgdGFyZ2V0IG1hYyBhZGRyZXNzIGlzIHZhbGlkICovCisjZGVmaW5lIFdNSV9OU09GRl9GTEFHU19SRU1PVEVfSVBfVkFMSUQgKDEgPDwgMikgICAgICAgIC8qIHJlbW90ZSBJUCBmaWVsZCBpcyB2YWxpZCAqLworCisjZGVmaW5lIFdNSV9OU09GRl9NQVhfVEFSR0VUX0lQUyAgICAyCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ19XTUlfTlNfT0ZGTE9BRF9UVVBMRSAqLworCUFfVUlOVDMyIGZsYWdzOyAgICAgICAgIC8qIGZsYWdzICovCisJLyogTk9URTogVGhpcyBzaXplIG9mIGFycmF5IHRhcmdldF9pcGFkZHJbXSBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0IGJyZWFraW5nIFdNSSBjb21wYXRpYmlsaXR5LiAqLworCVdNSV9JUFY2X0FERFIgdGFyZ2V0X2lwYWRkcltXTUlfTlNPRkZfTUFYX1RBUkdFVF9JUFNdOyAgICAgICAgICAvKiBJUFY2IHRhcmdldCBhZGRyZXNzZXMgb2YgdGhlIGxvY2FsIG5vZGUgICovCisJV01JX0lQVjZfQUREUiBzb2xpY2l0YXRpb25faXBhZGRyOyAgICAgICAgICAgICAgLyogbXVsdGktY2FzdCBzb3VyY2UgSVAgYWRkcmVzc2VzIGZvciByZWNlaXZpbmcgc29saWNpdGF0aW9ucyAqLworCVdNSV9JUFY2X0FERFIgcmVtb3RlX2lwYWRkcjsgICAgICAgICAgICAvKiBhZGRyZXNzIG9mIHJlbW90ZSBub2RlIHJlcXVlc3RpbmcgdGhlIHNvbGljaXRhdGlvbiAocXVhbGlmaWVyKSAqLworCXdtaV9tYWNfYWRkciB0YXJnZXRfbWFjOyAgICAgICAgICAgICAgICAvKiBtYWMgYWRkcmVzcyBmb3IgdGhpcyB0dXBsZSwgaWYgbm90IHZhbGlkLCB0aGUgbG9jYWwgTUFDIGlzIHVzZWQgKi8KK30gV01JX05TX09GRkxPQURfVFVQTEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgICAgICAgLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dNSV9TRVRfQVJQX05TX09GRkxPQURfQ01EX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgZmxhZ3M7CisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBudW1fbnNfZXh0X3R1cGxlczsKKwkvKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgYXJlIHRoZSBUTFZzOgorCSAqICAgICBXTUlfTlNfT0ZGTE9BRF9UVVBMRSAgICBuc190dXBsZXNbV01JX01BWF9OU19PRkZMT0FEU107CisJICogICAgIFdNSV9BUlBfT0ZGTE9BRF9UVVBMRSAgIGFycF90dXBsZXNbV01JX01BWF9BUlBfT0ZGTE9BRFNdOworCSAqIHNpemUgb2YgbnNfZXh0X3R1cGxlcyBpcyBiYXNlZCBvbiBudW1fbnNfZXh0X3R1cGxlcworCSAqICAgICBXTUlfTlNfT0ZGTE9BRF9UVVBMRSAgbnNfZXh0X3R1cGxlc1tdOworCSAqLworfSBXTUlfU0VUX0FSUF9OU19PRkZMT0FEX0NNRF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBwYXR0ZXJuX2lkOworCUFfVUlOVDMyIHRpbWVvdXQ7CisJQV9VSU5UMzIgbGVuZ3RoOworCS8qIEZvbGxvd2luZyB0aGlzIHdvdWxkIGJlIHRoZSBwYXR0ZXJuCisJICAgQV9VSU5UOCBwYXR0ZXJuW10gb2YgbGVuZ3RoIHNwZWNpZmVkIGJ5IGxlbmd0aAorCSAgIGZpZWxkIGluIHRoZSBzdHJ1Y3R1cmUuICovCit9IFdNSV9BRERfUFJPQUNUSVZFX0FSUF9SU1BfUEFUVEVSTl9DTURfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgcGF0dGVybl9pZDsKK30gV01JX0RFTF9QUk9BQ1RJVkVfQVJQX1JTUF9QQVRURVJOX0NNRF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX3RpZF9hZGRiYV9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHBlZXIgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCS8qKiBUaWQgbnVtYmVyICovCisJQV9VSU5UMzIgdGlkOworCS8qKiBJbml0aWF0b3IgKDEpIG9yIFJlc3BvbmRlciAoMCkgZm9yIHRoaXMgYWdncmVnYXRpb24gKi8KKwlBX1VJTlQzMiBpbml0aWF0b3I7CisJLyoqIHNpemUgb2YgdGhlIG5lZ290aWF0ZWQgd2luZG93ICovCisJQV9VSU5UMzIgd2luZG93X3NpemU7CisJLyoqIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciAob25seSB2YWxpZCBmb3IgaW5pdGlhdG9yKSAqLworCUFfVUlOVDMyIHNzbjsKKwkvKiogdGltZW91dCBmaWVsZCByZXByZXNlbnRzIHRoZSB0aW1lIHRvIHdhaXQgZm9yIEJsb2NrIEFjayBpbgorCSAqICAgaW5pdGlhdG9yIGNhc2UgYW5kIHRoZSB0aW1lIHRvIHdhaXQgZm9yIEJBUiBpbiByZXNwb25kZXIKKwkgKiAgIGNhc2UuIDAgcmVwcmVzZW50cyBubyB0aW1lb3V0LiAqLworCUFfVUlOVDMyIHRpbWVvdXQ7CisJLyogQkEgcG9saWN5OiBpbW1lZGlhdGUgQUNLICgwKSBvciBkZWxheWVkIEFDSyAoMSkgKi8KKwlBX1VJTlQzMiBwb2xpY3k7Cit9IHdtaV9wZWVyX3RpZF9hZGRiYV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl90aWRfZGVsYmFfY21kICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBwZWVyIE1BQyBhZGRyZXNzICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKKwkvKiogVGlkIG51bWJlciAqLworCUFfVUlOVDMyIHRpZDsKKwkvKiogSW5pdGlhdG9yICgxKSBvciBSZXNwb25kZXIgKDApIGZvciB0aGlzIGFnZ3JlZ2F0aW9uICovCisJQV9VSU5UMzIgaW5pdGlhdG9yOworfSB3bWlfcGVlcl90aWRfZGVsYmFfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfdHhfYWRkYmFfY29tcGxldGVfZXZlbnRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHBlZXIgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCS8qKiBUaWQgbnVtYmVyICovCisJQV9VSU5UMzIgdGlkOworCS8qKiBFdmVudCBzdGF0dXMgKi8KKwlBX1VJTlQzMiBzdGF0dXM7Cit9IHdtaV90eF9hZGRiYV9jb21wbGV0ZV9ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3R4X2RlbGJhX2NvbXBsZXRlX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBwZWVyIE1BQyBhZGRyZXNzICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKKwkvKiogVGlkIG51bWJlciAqLworCUFfVUlOVDMyIHRpZDsKKwkvKiogRXZlbnQgc3RhdHVzICovCisJQV9VSU5UMzIgc3RhdHVzOworfSB3bWlfdHhfZGVsYmFfY29tcGxldGVfZXZlbnRfZml4ZWRfcGFyYW07CisvKgorICogU3RydWN0dXJlIHRvIHJlcXVlc3Qgc2VxdWVuY2UgbnVtYmVycyBmb3IgYSBnaXZlbgorICogcGVlciBzdGF0aW9uIG9uIGRpZmZlcmVudCBUSURzLiBUaGUgVElEcyBhcmUKKyAqIGluZGljYXRlZCBpbiB0aGUgdGlkQml0TWFwLCB0aWQgMCB3b3VsZAorICogYmUgcmVwcmVzZW50ZWQgYnkgTFNCIGJpdCAwLiB0aWQgMSB3b3VsZCBiZQorICogcmVwcmVzZW50ZWQgYnkgTFNCIGJpdCAxIGV0Yy4KKyAqIFRoZSB0YXJnZXQgd2lsbCByZXRyaWV2ZSB0aGUgY3VycmVudCBzZXF1ZW5jZQorICogbnVtYmVycyBmb3IgdGhlIHBlZXIgb24gYWxsIHRoZSBUSURzIHJlcXVlc3RlZAorICogYW5kIHNlbmQgYmFjayBhIHJlc3BvbnNlIGluIGEgV01JIGV2ZW50LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2JhX3JlcV9zc25fY21kX3N1Yl9zdHJ1Y3RfcGFyYW0gKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCUFfVUlOVDMyIHRpZEJpdG1hcDsKK30gd21pX2JhX3JlcV9zc247CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV01JVExWX1RBR19TVFJVQ193bWlfYmFfcmVxX3Nzbl9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIE51bWJlciBvZiByZXF1ZXN0ZWQgU1NOIEluIHRoZSBUTFYgd21pX2JhX3JlcV9zc25bXSAqLworCUFfVUlOVDMyIG51bV9iYV9yZXFfc3NuOworLyogRm9sbG93aW5nIHRoaXMgc3RydWMgYXJlIHRoZSBUTFYnczoKKyAqICAgICB3bWlfYmFfcmVxX3NzbiBiYV9yZXFfc3NuX2xpc3Q7IEFsbCBwZWVyIGFuZCB0aWRCaXRNYXAgZm9yIHdoaWNoIHRoZSBzc24gaXMgcmVxdWVzdGVkCisgKi8KK30gd21pX2JhX3JlcV9zc25fY21kX2ZpeGVkX3BhcmFtOworCisvKgorICogTWF4IHRyYW5zbWl0IGNhdGVnb3JpZXMKKyAqCisgKiBOb3RlOiBJbiBmdXR1cmUgaWYgd2UgbmVlZCB0byBpbmNyZWFzZSBXTUlfTUFYX1RDIGRlZmluaXRpb24KKyAqIEl0IHdvdWxkIGJyZWFrIHRoZSBjb21wYXRpYmlsaXR5IGZvciBXTUlfQkFfUlNQX1NTTl9FVkVOVElELgorICovCisjZGVmaW5lIFdNSV9NQVhfVEMgIDgKKworLyoKKyAqIFN0cnVjdHVyZSB0byBzZW5kIHJlc3BvbnNlIHNlcXVlbmNlIG51bWJlcnMKKyAqIGZvciBhIGdpdmUgcGVlciBhbmQgdGlkbWFwLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2JhX3JlcV9zc25fZXZlbnRfc3ViX3N0cnVjdF9wYXJhbSAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyogQSBib29sIHRvIGluZGljYXRlIGlmIHNzbiBpcyBwcmVzZW50ICovCisJQV9VSU5UMzIgc3NuX3ByZXNlbnRfZm9yX3RpZFtXTUlfTUFYX1RDXTsKKwkvKiBUaGUgc3NuIGZyb20gdGFyZ2V0LCB2YWxpZCBvbmx5IGlmCisJICogc3NuX3ByZXNlbnRfZm9yX3RpZFt0aWRuXSBlcXVhbHMgMQorCSAqLworCUFfVUlOVDMyIHNzbl9mb3JfdGlkW1dNSV9NQVhfVENdOworfSB3bWlfYmFfZXZlbnRfc3NuOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNSVRMVl9UQUdfU1RSVUNfd21pX2JhX3JzcF9zc25fZXZlbnRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIEV2ZW50IHN0YXR1cywgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBvdmVyYWxsIG9wZXJhdGlvbiAqLworCUFfVUlOVDMyIHN0YXR1czsKKwkvKiogTnVtYmVyIG9mIHJlcXVlc3RlZCBTU04gSW4gdGhlIFRMViB3bWlfYmFfcmVxX3NzbltdICovCisJQV9VSU5UMzIgbnVtX2JhX2V2ZW50X3NzbjsKKy8qIEZvbGxvd2luZyB0aGlzIHN0cnVjIGFyZSB0aGUgVExWJ3M6CisgKiAgICAgd21pX2JhX2V2ZW50X3NzbiBiYV9ldmVudF9zc25fbGlzdDsgQWxsIHBlZXIgYW5kIHRpZEJpdE1hcCBmb3Igd2hpY2ggdGhlIHNzbiBpcyByZXF1ZXN0ZWQKKyAqLworfSB3bWlfYmFfcnNwX3Nzbl9ldmVudF9maXhlZF9wYXJhbTsKKworZW51bSB3bWlfYWdncl9zdGF0ZV9yZXFfdHlwZSB7CisJV01JX0RJU0FCTEVfQUdHUkVHQVRJT04sCisJV01JX0VOQUJMRV9BR0dSRUdBVElPTgorfTsKKworLyoKKyAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBDT0VYIG1vZHVsZQorICogd2hlbiBlc2NvIGNhbGwgaXMgYmVnaW5zIHRoZSBjb2V4IG1vZHVsZSBpbiBmdyBnZW5yYXRlZCB0aGlzIGV2ZW50IHRvIGhvc3QgdG8KKyAqIGRpc2FibGUgdGhlIFJYIGFnZ3JlZ2F0aW9uIGFuZCBhZnRlciBjb21wbGV0aW9uIG9mIHRoZSBlc2NvIGNhbGwgZncgd2lsbCBpbmRpY2F0ZSB0bworICogZW5hYmxlIGJhY2sgdGhlIFJ4IGFnZ3JlZ2F0aW9uIC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfYWdncl9zdGF0ZV90cmlnX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiByZXFfdHlwZSAgY29udGFpbnMgdmFsdWVzIGZyb20gZW51bQorCSAqICB3bWlfYWdncl9zdGF0ZV9yZXFfdHlwZTsgMCAoZGlzYWJsZSkgMShlbmFibGUpICovCisJQV9VSU5UMzIgcmVxX3R5cGU7Cit9IHdtaV9hZ2dyX3N0YXRlX3RyaWdfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X2luc3RhbGxfa2V5X2NvbXBsZXRlX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBNQUMgYWRkcmVzcyB1c2VkIGZvciBpbnN0YWxsaW5nICAgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCS8qKiBrZXkgaW5kZXggKi8KKwlBX1VJTlQzMiBrZXlfaXg7CisJLyoqIGtleSBmbGFncyAqLworCUFfVUlOVDMyIGtleV9mbGFnczsKKwkvKiogRXZlbnQgc3RhdHVzICovCisJQV9VSU5UMzIgc3RhdHVzOworfSB3bWlfdmRldl9pbnN0YWxsX2tleV9jb21wbGV0ZV9ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBlbnVtIF9XTUlfTkxPX0FVVEhfQUxHT1JJVEhNIHsKKwlXTUlfTkxPX0FVVEhfQUxHT184MDIxMV9PUEVOID0gMSwKKwlXTUlfTkxPX0FVVEhfQUxHT184MDIxMV9TSEFSRURfS0VZID0gMiwKKwlXTUlfTkxPX0FVVEhfQUxHT19XUEEgPSAzLAorCVdNSV9OTE9fQVVUSF9BTEdPX1dQQV9QU0sgPSA0LAorCVdNSV9OTE9fQVVUSF9BTEdPX1dQQV9OT05FID0gNSwKKwlXTUlfTkxPX0FVVEhfQUxHT19SU05BID0gNiwKKwlXTUlfTkxPX0FVVEhfQUxHT19SU05BX1BTSyA9IDcsCit9IFdNSV9OTE9fQVVUSF9BTEdPUklUSE07CisKK3R5cGVkZWYgZW51bSBfV01JX05MT19DSVBIRVJfQUxHT1JJVEhNIHsKKwlXTUlfTkxPX0NJUEhFUl9BTEdPX05PTkUgPSAweDAwLAorCVdNSV9OTE9fQ0lQSEVSX0FMR09fV0VQNDAgPSAweDAxLAorCVdNSV9OTE9fQ0lQSEVSX0FMR09fVEtJUCA9IDB4MDIsCisJV01JX05MT19DSVBIRVJfQUxHT19DQ01QID0gMHgwNCwKKwlXTUlfTkxPX0NJUEhFUl9BTEdPX1dFUDEwNCA9IDB4MDUsCisJV01JX05MT19DSVBIRVJfQUxHT19CSVAgPSAweDA2LAorCVdNSV9OTE9fQ0lQSEVSX0FMR09fV1BBX1VTRV9HUk9VUCA9IDB4MTAwLAorCVdNSV9OTE9fQ0lQSEVSX0FMR09fUlNOX1VTRV9HUk9VUCA9IDB4MTAwLAorCVdNSV9OTE9fQ0lQSEVSX0FMR09fV0VQID0gMHgxMDEsCit9IFdNSV9OTE9fQ0lQSEVSX0FMR09SSVRITTsKKworLyogU1NJRCBicm9hZGNhc3QgIHR5cGUgcGFzc2VkIGluIE5MTyBwYXJhbXMgKi8KK3R5cGVkZWYgZW51bSBfV01JX05MT19TU0lEX0JjYXN0TndUeXBlIHsKKwlXTUlfTkxPX0JDQVNUX1VOS05PV04gPSAwLAorCVdNSV9OTE9fQkNBU1RfTk9STUFMID0gMSwKKwlXTUlfTkxPX0JDQVNUX0hJRERFTiA9IDIsCit9IFdNSV9OTE9fU1NJRF9CY2FzdE53VHlwZTsKKworI2RlZmluZSBXTUlfTkxPX01BWF9TU0lEUyAgICAxNgorI2RlZmluZSBXTUlfTkxPX01BWF9DSEFOICAgICA0OAorCisjZGVmaW5lIFdNSV9OTE9fQ09ORklHX1NUT1AgICAgICAgICAgICAgKDB4MSA8PCAwKQorI2RlZmluZSBXTUlfTkxPX0NPTkZJR19TVEFSVCAgICAgICAgICAgICgweDEgPDwgMSkKKyNkZWZpbmUgV01JX05MT19DT05GSUdfUkVTRVQgICAgICAgICAgICAoMHgxIDw8IDIpCisjZGVmaW5lIFdNSV9OTE9fQ09ORklHX1NMT1dfU0NBTiAgICAgICAgKDB4MSA8PCA0KQorI2RlZmluZSBXTUlfTkxPX0NPTkZJR19GQVNUX1NDQU4gICAgICAgICgweDEgPDwgNSkKKyNkZWZpbmUgV01JX05MT19DT05GSUdfU1NJRF9ISURFX0VOICAgICAoMHgxIDw8IDYpCisvKiBUaGlzIGJpdCBpcyB1c2VkIHRvIGluZGljYXRlIGlmIEVQTk8gb3Igc3VwcGxpY2FudCBQTk8gaXMgZW5hYmxlZC4gT25seQorICAqIG9uZSBvZiB0aGVtIGNhbiBiZSBlbmFibGVkIGF0IGEgZ2l2ZW4gdGltZSAqLworI2RlZmluZSBXTUlfTkxPX0NPTkZJR19FTkxPICAgICAgICAgICAgICgweDEgPDwgNykKKyNkZWZpbmUgV01JX05MT19DT05GSUdfU0NBTl9QQVNTSVZFICAgICAoMHgxIDw8IDgpCisKKy8qIFdoZXRoZXIgZGlyZWN0ZWQgc2NhbiBuZWVkcyB0byBiZSBwZXJmb3JtZWQgKGZvciBoaWRkZW4gU1NJRHMpICovCisjZGVmaW5lIFdNSV9FTkxPX0ZMQUdfRElSRUNURURfU0NBTiAgICAgIDEKKy8qIFdoZXRoZXIgUE5PIGV2ZW50IHNoYWxsIGJlIHRyaWdnZXJlZCBpZiB0aGUgbmV0d29yayBpcyBmb3VuZCBvbiBBIGJhbmQgKi8KKyNkZWZpbmUgV01JX0VOTE9fRkxBR19BX0JBTkQgICAgICAgICAgICAgMgorLyogV2hldGhlciBQTk8gZXZlbnQgc2hhbGwgYmUgdHJpZ2dlcmVkIGlmIHRoZSBuZXR3b3JrIGlzIGZvdW5kIG9uIEcgYmFuZCAqLworI2RlZmluZSBXTUlfRU5MT19GTEFHX0dfQkFORCAgICAgICAgICAgICA0CisvKiBXaGV0aGVyIHN0cmljdCBtYXRjaGluZyBpcyByZXF1aXJlZCAoaS5lLiBmaXJtd2FyZSBzaGFsbCBub3QgbWF0Y2ggb24gdGhlIGVudGlyZSBTU0lEKSAqLworI2RlZmluZSBXTUlfRU5MT19GTEFHX1NUUklDVF9NQVRDSCAgICAgICA4CisvKiBDb2RlIGZvciBtYXRjaGluZyB0aGUgYmVhY29uIEFVVEggSUUgLSBhZGRpdGlvbmFsIGNvZGVzIFRCRCBvcGVuICovCisjZGVmaW5lIFdNSV9FTkxPX0FVVEhfQ09ERV9PUEVOICAxCisvKiBXUEFfUFNLIG9yIFdQQTJQU0sgKi8KKyNkZWZpbmUgV01JX0VOTE9fQVVUSF9DT0RFX1BTSyAgIDIKKy8qIGFueSBFQVBPTCAqLworI2RlZmluZSBXTUlfRU5MT19BVVRIX0NPREVfRUFQT0wgNAorCisvKiBOT1RFOiB3bWlfbmxvX3NzaWRfcGFyYW0gc3RydWN0dXJlIGNhbid0IGJlIGNoYW5nZWQgd2l0aG91dCBicmVha2luZyB0aGUgY29tcGF0aWJpbGl0eSAqLwordHlwZWRlZiBzdHJ1Y3Qgd21pX25sb19zc2lkX3BhcmFtIHsKKwlBX1VJTlQzMiB2YWxpZDsKKwl3bWlfc3NpZCBzc2lkOworfSB3bWlfbmxvX3NzaWRfcGFyYW07CisKKy8qIE5PVEU6IHdtaV9ubG9fZW5jX3BhcmFtIHN0cnVjdHVyZSBjYW4ndCBiZSBjaGFuZ2VkIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGNvbXBhdGliaWxpdHkgKi8KK3R5cGVkZWYgc3RydWN0IHdtaV9ubG9fZW5jX3BhcmFtIHsKKwlBX1VJTlQzMiB2YWxpZDsKKwlBX1VJTlQzMiBlbmNfdHlwZTsKK30gd21pX25sb19lbmNfcGFyYW07CisKKy8qIE5PVEU6IHdtaV9ubG9fYXV0aF9wYXJhbSBzdHJ1Y3R1cmUgY2FuJ3QgYmUgY2hhbmdlZCB3aXRob3V0IGJyZWFraW5nIHRoZSBjb21wYXRpYmlsaXR5ICovCit0eXBlZGVmIHN0cnVjdCB3bWlfbmxvX2F1dGhfcGFyYW0geworCUFfVUlOVDMyIHZhbGlkOworCUFfVUlOVDMyIGF1dGhfdHlwZTsKK30gd21pX25sb19hdXRoX3BhcmFtOworCisvKiBOT1RFOiB3bWlfbmxvX2JjYXN0X253X3BhcmFtIHN0cnVjdHVyZSBjYW4ndCBiZSBjaGFuZ2VkIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGNvbXBhdGliaWxpdHkgKi8KK3R5cGVkZWYgc3RydWN0IHdtaV9ubG9fYmNhc3RfbndfcGFyYW0geworCUFfVUlOVDMyIHZhbGlkOworCS8qKgorCSAqIElmIFdNSV9OTE9fQ09ORklHX0VQTk8gaXMgbm90IHNldC4gU3VwcGxpY2FudCBQTk8gaXMgZW5hYmxlZC4gVGhlIHZhbHVlCisJICogc2hvdWxkIGJlIHRydWUvZmFsc2UuT3RoZXJ3aXNlIEVQTk8gaXMgZW5hYmxlZC4gYmNhc3RfbndfdHlwZSB3b3VsZCBiZSB1c2VkCisJICogYXMgYSBiaXQgZmxhZyBjb250YWlucyBXTUlfRU5MT19GTEFHX1hYWAorCSAqLworCUFfVUlOVDMyIGJjYXN0X253X3R5cGU7Cit9IHdtaV9ubG9fYmNhc3RfbndfcGFyYW07CisKKy8qIE5PVEU6IHdtaV9ubG9fcnNzaV9wYXJhbSBzdHJ1Y3R1cmUgY2FuJ3QgYmUgY2hhbmdlZCB3aXRob3V0IGJyZWFraW5nIHRoZSBjb21wYXRpYmlsaXR5ICovCit0eXBlZGVmIHN0cnVjdCB3bWlfbmxvX3Jzc2lfcGFyYW0geworCUFfVUlOVDMyIHZhbGlkOworCUFfSU5UMzIgcnNzaTsKK30gd21pX25sb19yc3NpX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCBubG9fY29uZmlndXJlZF9wYXJhbWV0ZXJzIHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX25sb19jb25maWd1cmVkX3BhcmFtZXRlcnMgKi8KKwl3bWlfbmxvX3NzaWRfcGFyYW0gc3NpZDsKKwl3bWlfbmxvX2VuY19wYXJhbSBlbmNfdHlwZTsKKwl3bWlfbmxvX2F1dGhfcGFyYW0gYXV0aF90eXBlOworCXdtaV9ubG9fcnNzaV9wYXJhbSByc3NpX2NvbmQ7CisJd21pX25sb19iY2FzdF9ud19wYXJhbSBiY2FzdF9ud190eXBlOyAgICAgICAgICAgLyogaW5kaWNhdGVzIGlmIHRoZSBTU0lEIGlzIGhpZGRlbiBvciBub3QgKi8KK30gbmxvX2NvbmZpZ3VyZWRfcGFyYW1ldGVyczsKKworLyogU3VwcG9ydCBjaGFubmVsIHByZWRpY3Rpb24gZm9yIFBOTyBzY2FuIGFmdGVyIHNjYW5uaW5nIHRvcF9rX251bSBjaGFubmVscworICogaWYgc3RhdGlvbmFyeV90aHJlc2hvbGQgaXMgbWV0LgorICovCit0eXBlZGVmIHN0cnVjdCBubG9fY2hhbm5lbF9wcmVkaWN0aW9uX2NmZyB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiBFbmFibGUgb3IgZGlzYWJsZSB0aGlzIGZlYXR1cmUuICovCisJQV9VSU5UMzIgZW5hYmxlOworCS8qIFRvcCBLIGNoYW5uZWxzIHdpbGwgYmUgc2Nhbm5lZCBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciB0byBmdXJ0aGVyCisJICogc2NhbiBvciBzdG9wLiBNaW5pbXVtIHZhbHVlIGlzIDMgYW5kIG1heGltdW0gaXMgNS4gKi8KKwlBX1VJTlQzMiB0b3Bfa19udW07CisJLyogUHJlY29uZmlndXJlZCBzdGF0aW9uYXJ5IHRocmVzaG9sZC4gTGVzc2VyIHZhbHVlIG1lYW5zIG1vcmUKKwkgKiBjb25zZXJ2YXRpdmUuIEJpZ2dlciB2YWx1ZSBtZWFucyBtb3JlIGFnZ3Jlc3NpdmUuCisJICogTWF4aW11bSBpcyAxMDAgYW5kIG1pbmludW0gaXMgMC4gKi8KKwlBX1VJTlQzMiBzdGF0aW9uYXJ5X3RocmVzaG9sZDsKKwkvKiBQZXJpb2RpYyBmdWxsIGNoYW5uZWwgc2NhbiBpbiBtaWxsaXNlY29uZHMgdW5pdC4KKwkgKiBBZnRlciBmdWxsX3NjYW5fcGVyaW9kX21zIHNpbmNlIGxhc3QgZnVsbCBzY2FuLCBjaGFubmVsIHByZWRpY3Rpb24KKwkgKiBzY2FuIGlzIHN1cHByZXNzZWQgYW5kIHdpbGwgZG8gZnVsbCBzY2FuLgorCSAqIFRoaXMgaXMgdG8gaGVscCBkZXRlY3Rpbmcgc3VkZGVuIEFQIHBvd2VyLW9uIG9yIC1vZmYuCisJICogVmFsdWUgMCBtZWFucyBubyBmdWxsIHNjYW4gYXQgYWxsIChub3QgcmVjb21tZW5kZWQpLgorCSAqLworCUFfVUlOVDMyIGZ1bGxfc2Nhbl9wZXJpb2RfbXM7Cit9IG5sb19jaGFubmVsX3ByZWRpY3Rpb25fY2ZnOworCit0eXBlZGVmIHN0cnVjdCB3bWlfbmxvX2NvbmZpZyB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfbmxvX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiBmbGFnczsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGZhc3Rfc2Nhbl9tYXhfY3ljbGVzOworCUFfVUlOVDMyIGFjdGl2ZV9kd2VsbF90aW1lOworCUFfVUlOVDMyIHBhc3NpdmVfZHdlbGxfdGltZTsgICAgICAgICAgICAvKiBQRFQgaW4gbXNlY3MgKi8KKwlBX1VJTlQzMiBwcm9iZV9idW5kbGVfc2l6ZTsKKwlBX1VJTlQzMiByZXN0X3RpbWU7ICAgICAgICAgICAgIC8qIEFSVCA9IElSVCAqLworCUFfVUlOVDMyIG1heF9yZXN0X3RpbWU7ICAgICAgICAgLyogTWF4IHZhbHVlIHRoYXQgY2FuIGJlIHJlYWNoZWQgYWZ0ZXIgU0JNICovCisJQV9VSU5UMzIgc2Nhbl9iYWNrb2ZmX211bHRpcGxpZXI7ICAgICAgICAgICAgICAgLyogU0JNICovCisJQV9VSU5UMzIgZmFzdF9zY2FuX3BlcmlvZDsgICAgICAgICAgICAgIC8qIFNDQk0gKi8KKwlBX1VJTlQzMiBzbG93X3NjYW5fcGVyaW9kOyAgICAgICAgICAgICAgLyogc3BlY2lmaWMgdG8gd2luZG93cyAqLworCUFfVUlOVDMyIG5vX29mX3NzaWRzOworCUFfVUlOVDMyIG51bV9vZl9jaGFubmVsczsKKwlBX1VJTlQzMiBkZWxheV9zdGFydF90aW1lOyAgICAgICAgICAgICAgLyogTkxPIHNjYW4gc3RhcnQgZGVsYXkgdGltZSBpbiBtaWxsaXNlY29uZHMgKi8KKwkvKiBUaGUgVExWcyB3aWxsIGZvbGxvdy4KKwkgKiBubG9fY29uZmlndXJlZF9wYXJhbWV0ZXJzIG5sb19saXN0W107CisJICogQV9VSU5UMzIgY2hhbm5lbF9saXN0W107CisJICogbmxvX2NoYW5uZWxfcHJlZGljdGlvbl9jZmcgY2hfcHJlZGljdGlvbl9jZmc7CisJICovCisKK30gd21pX25sb19jb25maWdfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB3bWlfbmxvX2V2ZW50IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ubG9fZXZlbnQgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworfSB3bWlfbmxvX2V2ZW50OworCisvKiBXTUlfUEFTU1BPSU5UX0NPTkZJR19TRVQKKyAqIFNldHMgYSBsaXN0IGZvciBwYXNzcG9pbnQgbmV0d29ya3MgZm9yIFBOTyBwdXJwb3NlczsKKyAqIGl0IHNob3VsZCBiZSBtYXRjaGVkIGFnYWluc3QgYW55IHBhc3Nwb2ludCBuZXR3b3JrcyBmb3VuZAorICogZHVyaW5nIHJlZ3VsYXIgUE5PIHNjYW4uCisgKi8KKyNkZWZpbmUgV01JX1BBU1NQT0lOVF9DT05GSUdfU0VUICAgKDB4MSA8PCAwKQorLyogV01JX1BBU1NQT0lOVF9DT05GSUdfUkVTRVQKKyAqIFJlc2V0IHBhc3Nwb2ludCBuZXR3b3JrIGxpc3QgLQorICogbm8gUGFzc3BvaW50IG5ldHdvcmtzIHNob3VsZCBiZSBtYXRjaGVkIGFmdGVyIHRoaXMuCisgKi8KKyNkZWZpbmUgV01JX1BBU1NQT0lOVF9DT05GSUdfUkVTRVQgICAgICgweDEgPDwgMSkKKyNkZWZpbmUgUEFTU1BPSU5UX1JFQUxNX0xFTiAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBQQVNTUE9JTlRfUk9BTUlOR19DT05TT1JUSVVNX0lEX0xFTiAgNQorI2RlZmluZSBQQVNTUE9JTlRfUk9BTUlOR19DT05TT1JUSVVNX0lEX05VTSAgMTYKKyNkZWZpbmUgUEFTU1BPSU5UX1BMTU5fSURfTEVOICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUEFTU1BPSU5UX1BMTU5fSURfQUxMT0NfTEVOIC8qIHJvdW5kIHVwIHRvIEFfVUlOVDMyIGJvdW5kYXJ5ICovIFwKKwkoKChQQVNTUE9JTlRfUExNTl9JRF9MRU4gKyAzKSA+PiAyKSA8PCAyKQorCisvKgorICogQ29uZmlybSBQQVNTUE9JTlRfUkVBTE1fTEVOIGlzIGEgbXVsdGlwbGUgb2YgNCwgc28gdGhlCisgKiAgQV9VSU5UOCByZWFsbVtQQVNTUE9JTlRfUkVBTE1fTEVOXQorICogYXJyYXkgd2lsbCBlbmQgb24gYSA0LWJ5dGUgYm91bmRhcnkuCisgKiAoVGhpcyA0LWJ5dGUgYWxpZ25tZW50IHNpbXBsaWZpZXMgZW5kaWFubmVzcy1jb3JyZWN0aW9uIGJ5dGUgc3dhcHBpbmcuKQorICovCitBX0NPTVBJTEVfVElNRV9BU1NFUlQoY2hlY2tfcGFzc3BvaW50X3JlYWxtX3NpemUsKFBBU1NQT0lOVF9SRUFMTV9MRU4gJSBzaXplb2YoQV9VSU5UMzIpKSA9PSAwKTsKKworLyoKKyAqIENvbmZpcm0gdGhlIHByb2R1Y3Qgb2YgUEFTU1BPSU5UX1JPQU1JTkdfQ09OU09SVElVTV9JRF9OVU0gYW5kCisgKiBQQVNTUE9JTlRfUk9BTUlOR19DT05TT1JUSVVNX0lEX0xFTiBpcyBhIG11bHRpcGxlIG9mIDQsIHNvIHRoZQorICogcm9hbWluZ19jb25zb3J0aXVtX2lkcyBhcnJheSBiZWxvdyB3aWxsIGVuZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KKyAqIChUaGlzIDQtYnl0ZSBhbGlnbm1lbnQgc2ltcGxpZmllcyBlbmRpYW5uZXNzLWNvcnJlY3Rpb24gYnl0ZSBzd2FwcGluZy4pCisgKi8KK0FfQ09NUElMRV9USU1FX0FTU0VSVChjaGVja19wYXNzcG9pbnRfcm9hbWluZ19jb25zb3J0aXVtX2lkc19zaXplLAorKChQQVNTUE9JTlRfUk9BTUlOR19DT05TT1JUSVVNX0lEX05VTSpQQVNTUE9JTlRfUk9BTUlOR19DT05TT1JUSVVNX0lEX0xFTikgJSBzaXplb2YoQV9VSU5UMzIpKSA9PSAwKTsKKworLyogd2lsZGNhcmQgSUQgdG8gYWxsb3cgYW4gYWN0aW9uIChyZXNldCkgdG8gYXBwbHkgdG8gYWxsIG5ldHdvcmtzICovCisjZGVmaW5lIFdNSV9QQVNTUE9JTlRfTkVUV09SS19JRF9XSUxEQ0FSRCAweEZGRkZGRkZGCit0eXBlZGVmIHN0cnVjdCB3bWlfcGFzc3BvaW50X2NvbmZpZyB7CisJLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIHdtaV9wYXNzcG9pbnRfY29uZmlnX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyogKG5ldHdvcmspIGlkCisJICogaWRlbnRpZmllciBvZiB0aGUgbWF0Y2hlZCBuZXR3b3JrLCByZXBvcnQgdGhpcyBpbiBldmVudAorCSAqIFRoaXMgaWQgY2FuIGJlIGEgd2lsZGNhcmQgKFdNSV9QQVNTUE9JTlRfTkVUV09SS19JRF9XSUxEQ0FSRCkKKwkgKiB0aGF0IGluZGljYXRlcyB0aGUgYWN0aW9uIHNob3VsZCBiZSBhcHBsaWVkIHRvIGFsbCBuZXR3b3Jrcy4KKwkgKiBDdXJyZW50bHksIHRoZSBvbmx5IGFjdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gYWxsIG5ldHdvcmtzIGlzICJyZXNldCIuCisJICogSWYgYSBub24td2lsZGNhcmQgSUQgaXMgc3BlY2lmaWVkLCB0aGF0IHBhcnRpY3VsYXIgbmV0d29yayBpcyBjb25maWd1cmVkLgorCSAqIElmIGEgd2lsZGNhcmQgSUQgaXMgc3BlY2lmaWVkLCBhbGwgbmV0d29ya3MgYXJlIHJlc2V0LgorCSAqLworCUFfVUlOVDMyIGlkOworCUFfVUlOVDMyIHJlcV9pZDsKKwkgLypudWxsIHRlcm1pbmF0ZWQgVVRGOCBlbmNvZGVkIHJlYWxtLCAwIGlmIHVuc3BlY2lmaWVkKi8KKwlBX1VJTlQ4ICByZWFsbVtQQVNTUE9JTlRfUkVBTE1fTEVOXTsKKwkvKnJvYW1pbmcgY29uc29ydGl1bSBpZHMgdG8gbWF0Y2gsIDBzIGlmIHVuc3BlY2lmaWVkKi8KKwlBX1VJTlQ4ICByb2FtaW5nX2NvbnNvcnRpdW1faWRzW1BBU1NQT0lOVF9ST0FNSU5HX0NPTlNPUlRJVU1fSURfTlVNXVtQQVNTUE9JTlRfUk9BTUlOR19DT05TT1JUSVVNX0lEX0xFTl07CisJLypUaGlzIHdvdWxkIGJlIGJ5dGVzLXN0cmVhbSBhcyBzYW1lIGFzIGRlZml0aW9uIG9mIHJlYWxtIGlkIGluIDgwMi4xMSBzdGFuZGFyZCovCisJLypQTE1OIGlkIG1jYy9tbmMgY29tYmluYXRpb24gYXMgcGVyIHJ1bGVzLCAwcyBpZiB1bnNwZWNpZmllZCAqLworCUFfVUlOVDggIHBsbW5bUEFTU1BPSU5UX1BMTU5fSURfQUxMT0NfTEVOXTsKK30gd21pX3Bhc3Nwb2ludF9jb25maWdfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCit3bWlfcGFzc3BvaW50X2V2ZW50X2hkciAqLworCUFfVUlOVDMyIGlkOyAgICAgICAgICAgIC8qIGlkZW50aWZpZXIgb2YgdGhlIG1hdGNoZWQgbmV0d29yayAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgdGltZXN0YW1wOyAgICAgLyogdGltZSBzaW5jZSBib290IChpbiBtaWNyb3NlY29uZCkgd2hlbiB0aGUKK3Jlc3VsdCB3YXMgcmV0cmlldmVkKi8KKwl3bWlfc3NpZCBzc2lkOworCXdtaV9tYWNfYWRkciAgICBic3NpZDsgIC8qIGJzc2lkIG9mIHRoZSBuZXR3b3JrICovCisJQV9VSU5UMzIgY2hhbm5lbF9taHo7ICAgLyogY2hhbm5lbCBmcmVxdWVuY3kgaW4gTUh6ICovCisJQV9VSU5UMzIgcnNzaTsgICAgICAgICAgLyogcnNzaSB2YWx1ZSAqLworCUFfVUlOVDMyIHJ0dDsgICAgICAgICAgIC8qIHRpbWVzdGFtcCBpbiBuYW5vc2Vjb25kcyovCisJQV9VSU5UMzIgcnR0X3NkOyAgICAgICAgLyogc3RhbmRhcmQgZGV2aWF0aW9uIGluIHJ0dCAqLworCUFfVUlOVDMyIGJlYWNvbl9wZXJpb2Q7IC8qIGJlYWNvbiBhZHZlcnRpc2VkIGluIHRoZSBiZWFjb24gKi8KKwlBX1VJTlQzMiBjYXBhYmlsaXR5OyAgICAvKiBjYXBhYmlsaXRpZXMgYWR2ZXJ0aXNlZCBpbiB0aGUgYmVhY29uICovCisJQV9VSU5UMzIgaWVfbGVuZ3RoOyAgICAgLyogc2l6ZSBvZiB0aGUgaWVfZGF0YSBibG9iICovCisJQV9VSU5UMzIgYW5xcF9sZW5ndGg7ICAgLyogbGVuZ3RoIG9mIEFOUVAgYmxvYiAqLworCS8qKgorCSAqIEZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgYnl0ZSBzdHJlYW0gb2YgaWUgZGF0YSBvZiBsZW5ndGggaWVfYnVmX2xlbjoKKwkgKiBBX1VJTlQ4IGllX2RhdGFbXTsgICAgICAvLyBsZW5ndGggaW4gYnl0ZSBnaXZlbiBieSBmaWVsZCBpZV9sZW5ndGgsIGJsb2Igb2YgaWUgZGF0YSBpbiBiZWFjb24KKwkgKiBBX1VJTlQ4IGFucXBfaWVbXTsgICAgICAvLyBsZW5ndGggaW4gYnl0ZSBnaXZlbiBieSBmaWVsZCBhbnFwX2xlbiwgYmxvYiBvZiBhbnFwIGRhdGEgb2YgSUUKKwkgKiBJbXBsaWNpdGx5LCBjb21iaW5nIGllX2RhdGEgYW5kIGFucXBfaWUgaW50byBhIHNpbmdsZSBidWZwLCBhbmQgdGhlIGJ5dGVzCisJICogc3RyZWFtIG9mIGVhY2ggaWUgc2hvdWxkIGJlIHNhbWUgYXMgQkVBQ09OL0FjdGlvbi1mcm0gIGJ5IDgwMi4xMSBzcGVjCisJICovCit9IHdtaV9wYXNzcG9pbnRfZXZlbnRfaGRyOworCisjZGVmaW5lIEdUS19PRkZMT0FEX09QQ09ERV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYwMDAwMDAKKy8qKiBFbmFibGUgR1RLIG9mZmxvYWQsIGFuZCBwcm92aWRlZCBwYXJhbWV0ZXJzIEtFSyxLQ0sgYW5kIHJlcGxheSBjb3VudGVyIHZhbHVlcyAqLworI2RlZmluZSBHVEtfT0ZGTE9BRF9FTkFCTEVfT1BDT0RFICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisvKiogRGlzYWJsZSBHVEsgb2ZmbG9hZCAqLworI2RlZmluZSBHVEtfT0ZGTE9BRF9ESVNBQkxFX09QQ09ERSAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisvKiogUmVhZCBHVEsgb2ZmbG9hZCBwYXJhbWV0ZXJzLCBnZW5lcmF0ZXMgV01JX0dUS19PRkZMT0FEX1NUQVRVU19FVkVOVCAqLworI2RlZmluZSBHVEtfT0ZGTE9BRF9SRVFVRVNUX1NUQVRVU19PUENPREUgICAgICAgMHgwNDAwMDAwMAorZW51bSB3bWlfY2hhdHRlcl9tb2RlIHsKKwkvKiBDaGF0dGVyIGVudGVyL2V4aXQgaGFwcGVucworCSAqIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gcHJlc2V0CisJICogcGFyYW1zCisJICovCisJV01JX0NIQVRURVJfTU9ERV9BVVRPLAorCS8qIENoYXR0ZXIgZW50ZXIgaXMgdHJpZ2dlcmVkCisJICogbWFudWFsbHkgYnkgdGhlIHVzZXIKKwkgKi8KKwlXTUlfQ0hBVFRFUl9NT0RFX01BTlVBTF9FTlRFUiwKKwkvKiBDaGF0dGVyIGV4aXQgaXMgdHJpZ2dlcmVkCisJICogbWFudWFsbHkgYnkgdGhlIHVzZXIKKwkgKi8KKwlXTUlfQ0hBVFRFUl9NT0RFX01BTlVBTF9FWElULAorCS8qIFBsYWNlaG9sZGVyIG1heCB2YWx1ZSwgYWx3YXlzIGxhc3QgKi8KKwlXTUlfQ0hBVFRFUl9NT0RFX01BWAorfTsKKworZW51bSB3bWlfY2hhdHRlcl9xdWVyeV90eXBlIHsKKwkvKnF1ZXJ5IGNvYWxlc2NpbmcgZmlsdGVyIG1hdGNoIGNvdW50ZXIgKi8KKwlXTUlfQ0hBVFRFUl9RVUVSWV9GSUxURVJfTUFUQ0hfQ05ULAorCVdNSV9DSEFUVEVSX1FVRVJZX01BWAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYXR0ZXJfc2V0X21vZGVfY21kX2ZpeGVkX3BhcmFtICAqLworCUFfVUlOVDMyIGNoYXR0ZXJfbW9kZTsKK30gd21pX2NoYXR0ZXJfc2V0X21vZGVfY21kX2ZpeGVkX3BhcmFtOworCisvKiogbWF4aW11bSBudW1iZXIgb2YgZmlsdGVyIHN1cHBvcnRlZCovCisjZGVmaW5lIENIQVRURVJfTUFYX0NPQUxFU0NJTkdfUlVMRVMgICAgIDExCisvKiogbWF4aW11bSBudW1iZXIgb2YgZmllbGQgdGVzdHMgcGVyIGZpbHRlciovCisjZGVmaW5lIENIQVRURVJfTUFYX0ZJRUxEX1RFU1QgICAgICAgICAgIDUKKy8qKiBtYXhpbXVtIGZpZWxkIGxlbmd0aCBpbiBudW1iZXIgb2YgRFdPUkRTKi8KKyNkZWZpbmUgQ0hBVFRFUl9NQVhfVEVTVF9GSUVMRF9MRU4zMiAgICAgMgorCisvKiogZmllbGQgdGVzdCBraW5kcyovCisjZGVmaW5lIENIQVRURVJfQ09BTEVTQ0lOR19URVNUX0VRVUFMICAgICAgICAgICAgMQorI2RlZmluZSBDSEFUVEVSX0NPQUxFU0NJTkdfVEVTVF9NQVNLRURfRVFVQUwgICAgIDIKKyNkZWZpbmUgQ0hBVFRFUl9DT0FMRVNDSU5HX1RFU1RfTk9UX0VRVUFMICAgICAgICAzCisKKy8qKiBwYWNrZXQgdHlwZSovCisjZGVmaW5lIENIQVRURVJfQ09BTEVTQ0lOR19QS1RfVFlQRV9VTklDQVNUICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQ0hBVFRFUl9DT0FMRVNDSU5HX1BLVF9UWVBFX01VTFRJQ0FTVCAgICAoMSA8PCAxKQorI2RlZmluZSBDSEFUVEVSX0NPQUxFU0NJTkdfUEtUX1RZUEVfQlJPQURDQVNUICAgICgxIDw8IDIpCisKKy8qKiBjb2FsZXNjaW5nIGZpZWxkIHRlc3QqLwordHlwZWRlZiBzdHJ1Y3QgX2NoYXR0ZXJfcGt0X2NvYWxlc2NpbmdfaGRyX3Rlc3QgeworCS8qKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBtYWMgaGVhZGVyLCBmb3Igd2luZG93cyBuYXRpdmUgd2lmaSBob3N0IGRyaXZlcgorCSAqIHNob3VsZCBhc3N1bWUgc3RhbmRhcmQgODAyLjExIGZyYW1lIGZvcm1hdCB3aXRob3V0IFFvUyBpbmZvIGFuZCBhZGRyZXNzNAorCSAqIEZXIHdvdWxkIGFjY291bnQgZm9yIGFueSBub24tc3RhbmQgZmllbGRzIGZvciBmaW5hbCBvZmZzZXQgdmFsdWUuCisJICovCisJQV9VSU5UMzIgb2Zmc2V0OworCUFfVUlOVDMyIGxlbmd0aDsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIHRlc3QgZmllbGQgKi8KKwlBX1VJTlQzMiB0ZXN0OyAgICAgICAgICAvKmVxdWFsLCBub3QgZXF1YWwgb3IgbWFza2VkIGVxdWFsICovCisJQV9VSU5UMzIgbWFza1tDSEFUVEVSX01BWF9URVNUX0ZJRUxEX0xFTjMyXTsgICAgICAgICAgICAvKm1hc2sgYnl0ZSBzdHJlYW0gKi8KKwlBX1VJTlQzMiB2YWx1ZVtDSEFUVEVSX01BWF9URVNUX0ZJRUxEX0xFTjMyXTsgICAgICAgICAgIC8qdmFsdWUgYnl0ZSBzdHJlYW0gKi8KK30gY2hhdHRlcl9wa3RfY29hbGVzY2luZ19oZHJfdGVzdDsKKworLyoqIHBhY2tldCBjb2FsZXNjaW5nIGZpbHRlciovCit0eXBlZGVmIHN0cnVjdCBfY2hhdHRlcl9wa3RfY29hbGVzY2luZ19maWx0ZXIgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYXR0ZXJfcGt0X2NvYWxlc2NpbmdfZmlsdGVyICovCisJQV9VSU5UMzIgZmlsdGVyX2lkOyAgICAgICAgICAgICAvKnVuaXF1ZSBpZCBhc3NpZ25lZCBieSBPUyAqLworCUFfVUlOVDMyIG1heF9jb2FsZXNjaW5nX2RlbGF5OyAgICAgICAgICAvKm1heCBtaWxpc2Vjb25kcyAxc3QgcGt0IGNhbiBiZSBob2xkICovCisJQV9VSU5UMzIgcGt0X3R5cGU7ICAgICAgICAgICAgICAvKnVuaWNhc3QvbXVsdGljYXN0L2Jyb2FkY2FzdCAqLworCUFfVUlOVDMyIG51bV9vZl90ZXN0X2ZpZWxkOyAgICAgICAgICAgICAvKm51bWJlciBvZiBmaWVsZCB0ZXN0IGluIHRhYmxlICovCisJY2hhdHRlcl9wa3RfY29hbGVzY2luZ19oZHJfdGVzdCB0ZXN0X2ZpZWxkc1tDSEFUVEVSX01BWF9GSUVMRF9URVNUXTsgICAgICAgICAgICAvKmZpZWxkIHRlc3QgdGJsICovCit9IGNoYXR0ZXJfcGt0X2NvYWxlc2NpbmdfZmlsdGVyOworCisvKiogcGFja2V0IGNvYWxlc2NpbmcgZmlsdGVyIGFkZCBjb21tYW5kKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGF0dGVyX2NvYWxlc2NpbmdfYWRkX2ZpbHRlcl9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiBudW1fb2ZfZmlsdGVyczsKKwkvKiBGb2xsb3dpbmcgdGhpcyB0bHYsIHRoZXJlIGNvbWVzIGFuIGFycmF5IG9mIHN0cnVjdHVyZSBvZiB0eXBlIGNoYXR0ZXJfcGt0X2NvYWxlc2NpbmdfZmlsdGVyCisJICAgY2hhdHRlcl9wa3RfY29hbGVzY2luZ19maWx0ZXIgcnhfZmlsdGVyWzFdOyAqLworfSB3bWlfY2hhdHRlcl9jb2FsZXNjaW5nX2FkZF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtOworLyoqIHBhY2tldCBjb2FsZXNjaW5nIGZpbHRlciBkZWxldGUgY29tbWFuZCovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfY2hhdHRlcl9jb2FsZXNjaW5nX2RlbGV0ZV9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgZmlsdGVyX2lkOyAgICAgICAgICAgICAvKmZpbHRlciBpZCB3aGljaCB3aWxsIGJlIGRlbGV0ZWQgKi8KK30gd21pX2NoYXR0ZXJfY29hbGVzY2luZ19kZWxldGVfZmlsdGVyX2NtZF9maXhlZF9wYXJhbTsKKy8qKiBwYWNrZXQgY29hbGVzY2luZyBxdWVyeSBjb21tYW5kKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGF0dGVyX2NvYWxlc2NpbmdfcXVlcnlfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdHlwZTsgICAgICAgICAgLyp0eXBlIG9mIHF1ZXJ5ICovCit9IHdtaV9jaGF0dGVyX2NvYWxlc2NpbmdfcXVlcnlfY21kX2ZpeGVkX3BhcmFtOworLyoqIGNoYXR0ZXIgcXVlcnkgcmVwbHkgZXZlbnQqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2NoYXR0ZXJfcXVlcnlfcmVwbHlfZXZlbnRfZml4ZWRfcGFyYW0gICovCisJQV9VSU5UMzIgdHlwZTsgICAgICAgICAgLypxdWVyeSB0eXBlICovCisJQV9VSU5UMzIgZmlsdGVyX21hdGNoX2NudDsgICAgICAgICAgICAgIC8qY29hbGVzY2luZyBmaWx0ZXIgbWF0Y2ggY291bnRlciAqLworfSB3bWlfY2hhdHRlcl9xdWVyeV9yZXBseV9ldmVudF9maXhlZF9wYXJhbTsKKworLyogTk9URTogVGhpcyBjb25zdGFudHMgR1RLX09GRkxPQURfS0VLX0JZVEVTLCBHVEtfT0ZGTE9BRF9LQ0tfQllURVMsIGFuZCBHVEtfUkVQTEFZX0NPVU5URVJfQllURVMKKyAqIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgYnJlYWtpbmcgV01JIGNvbXBhdGliaWxpdHkuICovCisjZGVmaW5lIEdUS19PRkZMT0FEX0tFS19CWVRFUyAgICAgICAxNgorI2RlZmluZSBHVEtfT0ZGTE9BRF9LQ0tfQllURVMgICAgICAgMTYKKy8qIE5PVEU6IEdUS19SRVBMQVlfQ09VTlRFUl9CWVRFUywgV01JX01BWF9LRVlfTEVOLCBJR1RLX1BOX1NJWkUgY2Fubm90IGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZSB3aXRob3V0IGJyZWFraW5nIFdNSSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIEdUS19SRVBMQVlfQ09VTlRFUl9CWVRFUyAgICA4CisjZGVmaW5lIFdNSV9NQVhfS0VZX0xFTiAgICAgICAgICAgICAzMgorI2RlZmluZSBJR1RLX1BOX1NJWkUgICAgICAgICAgICAgICAgNgorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ19XTUlfR1RLX09GRkxPQURfU1RBVFVTX0VWRU5UX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWICovCisJQV9VSU5UMzIgZmxhZ3M7ICAgICAgICAgLyogc3RhdHVzIGZsYWdzICovCisJQV9VSU5UMzIgcmVmcmVzaF9jbnQ7ICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBHVEsgcmVmcmVzaCBleGNoYW5nZXMgc2luY2UgbGFzdCBTRVQgb3BlcmF0aW9uICovCisJQV9VSU5UOCByZXBsYXlfY291bnRlcltHVEtfUkVQTEFZX0NPVU5URVJfQllURVNdOyAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgcmVwbGF5IGNvdW50ZXIgKi8KKwlBX1VJTlQ4IGlndGtfa2V5SW5kZXg7ICAgICAgICAgIC8qIFVzZSBpZiBJR1RLX09GRkxPQUQgaXMgZGVmaW5lZCAqLworCUFfVUlOVDggaWd0a19rZXlMZW5ndGg7ICAgICAgICAgLyogVXNlIGlmIElHVEtfT0ZGTE9BRCBpcyBkZWZpbmVkICovCisJQV9VSU5UOCBpZ3RrX2tleVJTQ1tJR1RLX1BOX1NJWkVdOyAgICAgICAgICAgICAgLyoga2V5IHJlcGxheSBzZXF1ZW5jZSBjb3VudGVyICovLyogVXNlIGlmIElHVEtfT0ZGTE9BRCBpcyBkZWZpbmVkICovCisJQV9VSU5UOCBpZ3RrX2tleVtXTUlfTUFYX0tFWV9MRU5dOyAgICAgICAgICAgICAgLyogVXNlIGlmIElHVEtfT0ZGTE9BRCBpcyBkZWZpbmVkICovCit9IFdNSV9HVEtfT0ZGTE9BRF9TVEFUVVNfRVZFTlRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgICAgICAgICAgLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dNSV9HVEtfT0ZGTE9BRF9DTURfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYgKi8KKwlBX1VJTlQzMiBmbGFnczsgICAgICAgICAvKiBjb250cm9sIGZsYWdzLCBHVEsgb2ZmbG9hZCBjb21tYW5kIHVzZSBoaWdoIGJ5dGUgICovCisJLyogVGhlIHNpemUgb2YgZm9sbG93aW5nIDMgYXJyYXlzIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgYnJlYWtpbmcgV01JIGNvbXBhdGliaWxpdHkuICovCisJQV9VSU5UOCBLRUtbR1RLX09GRkxPQURfS0VLX0JZVEVTXTsgICAgICAgICAgICAgLyoga2V5IGVuY3J5cHRpb24ga2V5ICovCisJQV9VSU5UOCBLQ0tbR1RLX09GRkxPQURfS0NLX0JZVEVTXTsgICAgICAgICAgICAgLyoga2V5IGNvbmZpcm1hdGlvbiBrZXkgKi8KKwlBX1VJTlQ4IHJlcGxheV9jb3VudGVyW0dUS19SRVBMQVlfQ09VTlRFUl9CWVRFU107ICAgICAgICAgICAgICAgLyogcmVwbGF5IGNvdW50ZXIgZm9yIHJlLWtleSAqLworfSBXTUlfR1RLX09GRkxPQURfQ01EX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogV01JVExWX1RBR19TVFJVQ19XTUlfUE1GX09GRkxPQURfU0VUX1NBX1FVRVJZX0NNRF9maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBzYV9xdWVyeV9yZXRyeV9pbnRlcnZhbDsgIC8qIGluIG1zZWMgKi8KKwlBX1VJTlQzMiBzYV9xdWVyeV9tYXhfcmV0cnlfY291bnQ7Cit9IFdNSV9QTUZfT0ZGTE9BRF9TRVRfU0FfUVVFUllfQ01EX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCVdNSV9TVEFfS0VFUEFMSVZFX01FVEhPRF9OVUxMX0ZSQU1FID0gMSwgICAgICAgICAgICAgICAgLyogODAyLjExIE5VTEwgZnJhbWUgKi8KKwlXTUlfU1RBX0tFRVBBTElWRV9NRVRIT0RfVU5TT0xJQ0lURURfQVJQX1JFU1BPTlNFID0gMiwgICAgICAgICAgLyogQVJQIHJlc3BvbnNlICovCisJV01JX1NUQV9LRUVQQUxJVkVfTUVUSE9EX0VUSEVSTkVUX0xPT1BCQUNLID0gMywgICAgICAgICAvKkVUSEVSTkVUIExPT1BCQUNLICovCisJLyogZ3JhdHVpdG91cyBBUlAgcmVxKi8KKwlXTUlfU1RBX0tFRVBBTElWRV9NRVRIT0RfR1JBVFVJVE9VU19BUlBfUkVRVUVTVCA9IDQsCit9IFdNSV9TVEFfS0VFUEFMSVZFX01FVEhPRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfV01JX1NUQV9LRUVQQUxWRV9BUlBfUkVTUE9OU0UgKi8KKwlXTUlfSVBWNF9BRERSIHNlbmRlcl9wcm90X2FkZHI7ICAgICAgICAgLyogU2VuZGVyIHByb3RvY29sIGFkZHJlc3MgKi8KKwlXTUlfSVBWNF9BRERSIHRhcmdldF9wcm90X2FkZHI7ICAgICAgICAgLyogVGFyZ2V0IHByb3RvY29sIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgZGVzdF9tYWNfYWRkcjsgICAgICAgICAgICAgLyogZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KK30gV01JX1NUQV9LRUVQQUxWRV9BUlBfUkVTUE9OU0U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dNSV9TVEFfS0VFUEFMSVZFX0NNRF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgZW5hYmxlOyAgICAgICAgICAgICAgICAvKiAxIC0gRW5hYmxlLCAwIC0gZGlzYWJsZSAqLworCUFfVUlOVDMyIG1ldGhvZDsgICAgICAgICAgICAgICAgLyoga2VlcCBhbGl2ZSBtZXRob2QgKi8KKwlBX1VJTlQzMiBpbnRlcnZhbDsgICAgICAgICAgICAgIC8qIHRpbWUgaW50ZXJ2YWwgaW4gc2Vjb25kcyAgKi8KKwkvKgorCSAqIE5PVEU6IGZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgVExWIGZvciBBUlAgUmVzb25zZToKKwkgKiAgICAgV01JX1NUQV9LRUVQQUxWRV9BUlBfUkVTUE9OU0UgYXJwX3Jlc3A7IC8vIEFSUCByZXNwb25zZQorCSAqLworfSBXTUlfU1RBX0tFRVBBTElWRV9DTURfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgYWN0aW9uOworfSBXTUlfVkRFVl9XTk1fU0xFRVBNT0RFX0NNRF9maXhlZF9wYXJhbTsKK3R5cGVkZWYgV01JX1ZERVZfV05NX1NMRUVQTU9ERV9DTURfZml4ZWRfcGFyYW0gV01JX1NUQV9XTk1TTEVFUF9DTUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF9rZWVwYWxpdmVfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBrZWVwYWxpdmVJbnRlcnZhbDsgICAgICAgICAgICAgLyogc2Vjb25kcyAqLworCUFfVUlOVDMyIGtlZXBhbGl2ZU1ldGhvZDsKK30gd21pX3ZkZXZfc2V0X2tlZXBhbGl2ZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X2dldF9rZWVwYWxpdmVfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdmRldl9pZDsKK30gd21pX3ZkZXZfZ2V0X2tlZXBhbGl2ZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X2dldF9rZWVwYWxpdmVfZXZlbnRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGtlZXBhbGl2ZUludGVydmFsOyAgICAgICAgICAgICAvKiBzZWNvbmRzICovCisJQV9VSU5UMzIga2VlcGFsaXZlTWV0aG9kOyAgICAgICAgICAgICAgIC8qIHNlY29uZHMgKi8KK30gd21pX3ZkZXZfZ2V0X2tlZXBhbGl2ZV9ldmVudF9maXhlZF9wYXJhbTsKKworI2RlZmluZSBJUFNFQ19OQVRLRUVQQUxJVkVfRklMVEVSX0RJU0FCTEUgMAorI2RlZmluZSBJUFNFQ19OQVRLRUVQQUxJVkVfRklMVEVSX0VOQUJMRSAgMQorCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGFjdGlvbjsKK30gV01JX1ZERVZfSVBTRUNfTkFUS0VFUEFMSVZFX0ZJTFRFUl9DTURfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgV01JX1ZERVZfSVBTRUNfTkFUS0VFUEFMSVZFX0ZJTFRFUl9DTURfZml4ZWRfcGFyYW0KK1dNSV9WREVWX0lQU0VDX05BVEtFRVBBTElWRV9GSUxURVJfQ01EOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIG1jY190YnR0bW9kZTsKKwl3bWlfbWFjX2FkZHIgbWNjX2Jzc2lkOworfSB3bWlfdmRldl9tY2Nfc2V0X3RidHRfbW9kZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIHZkZXZfaWQ7ICAgICAgICAgICAgICAgLyogaG9tZSB2ZGV2IGlkICovCisJQV9VSU5UMzIgbWVhc190b2tlbjsgICAgICAgICAgICAvKiBmcm9tIG1lYXN1cmUgcmVxdWVzdCBmcmFtZSAqLworCUFfVUlOVDMyIGRpYWxvZ190b2tlbjsKKwlBX1VJTlQzMiBudW1iZXJfYnVyc3RzOyAgICAgICAgIC8qIHplcm8ga2VlcCBzZW5kaW5nIHVudGlsIGNhbmNlbCwgYmlnZ2VyIHRoYW4gMCBtZWFucyB0aW1lcyBlLmcuIDEsMiAqLworCUFfVUlOVDMyIGJ1cnN0X2ludGVydmFsOyAgICAgICAgICAgICAgICAvKiB1bml0IGluIG1pbGwgc2Vjb25kcywgaW50ZXJ2YWwgYmV0d2VlbiBjb25zZWN1dGl2ZSBidXJzdCAqLworCUFfVUlOVDMyIGJ1cnN0X2N5Y2xlOyAgICAgICAgICAgLyogdGltZXMgY3ljbGUgdGhyb3VnaCB3aXRoaW4gb25lIGJ1cnN0ICovCisJQV9VSU5UMzIgdHhfcG93ZXI7ICAgICAgICAgICAgICAvKiBmb3IgcGF0aCBmcmFtZSAqLworCUFfVUlOVDMyIG9mZl9kdXJhdGlvbjsgICAgICAgICAgLyogdWludCBpbiBtaWxsIHNlY29uZHMsIGNoYW5uZWwgb2ZmIGR1cmFpdG9uIGZvciBwYXRoIGxvc3MgZnJhbWUgc2VuZGluZyAqLworCXdtaV9tYWNfYWRkciBkZXN0X21hYzsgICAgICAgICAgLyogbXVsdGljYXN0IERBLCBmb3IgcGF0aCBsb3NzIGZyYW1lICovCisJQV9VSU5UMzIgbnVtX2NoYW5zOworfSB3bWlfdmRldl9wbG1yZXFfc3RhcnRfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIG1lYXNfdG9rZW47ICAgICAgICAgICAgLyogc2FtZSB2YWx1ZSBmcm9tIHJlcSAqLworfSB3bWlfdmRldl9wbG1yZXFfc3RvcF9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcDJwX3NldF9ub2FfY21kX2ZpeGVkX3BhcmFtICAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyogZW5hYmxlL2Rpc2FibGUgTm9BICovCisJQV9VSU5UMzIgZW5hYmxlOworCS8qKiBudW1iZXIgb2YgTm9BIGRlc2MuIEluIHRoZSBUTFYgbm9hX2Rlc2NyaXB0b3JbXSAqLworCUFfVUlOVDMyIG51bV9ub2E7CisJLyoqCisJICogVExWICh0YWcgbGVuZ3RoIHZhbHVlICkgIHBhcmFtZXJ0ZXJzIGZvbGxvdyB0aGUgcGF0dGVybiBzdHJ1Y3R1cmUuCisJICogVExWICBjb250YWluIE5vQSBkZXNjIHdpdGggbnVtIG9mIG51bV9ub2EKKwkgKi8KK30gd21pX3AycF9zZXRfbm9hX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV91bml0X3Rlc3RfY21kX2ZpeGVkX3BhcmFtICAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyogSWRlbnRpZnkgdGhlIHdsYW4gbW9kdWxlICovCisJQV9VSU5UMzIgbW9kdWxlX2lkOworCS8qIE51bSBvZiB0ZXN0IGFyZ3VtZW50cyBwYXNzZWQgKi8KKwlBX1VJTlQzMiBudW1fYXJnczsKKy8qKgorICogVExWICh0YWcgbGVuZ3RoIHZhbHVlICkgcGFyYW1ldGVycyBmb2xsb3cgdGhlIHdtaV9yb2FtX2NoYW5fbGlzdAorICogc3RydWN0dXJlLiBUaGUgVExWJ3MgYXJlOgorICogICBBX1VJTlQzMiBhcmdzW107CisgKiovCit9IHdtaV91bml0X3Rlc3RfY21kX2ZpeGVkX3BhcmFtOworCisvKiogUm9hbWluZyBvZmZsb2FkIFNZTkNIX0NPTVBMRVRFIGZyb20gaG9zdCB3aGVuIGhvc3QgZmluaXNoZWQgc3luYyBsb2dpYworICogYWZ0ZXIgaXQgcmVjZWl2ZWQgV01JX1JPQU1fU1lOQ0hfRVZFTlRJRC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9yb2FtX3N5bmNoX2NvbXBsZXRlX2ZpeGVkX3BhcmFtICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworfSB3bWlfcm9hbV9zeW5jaF9jb21wbGV0ZV9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBlbnVtIHsKKwlSRUNPVkVSWV9TSU1fQVNTRVJUID0gMHgwMSwKKwlSRUNPVkVSWV9TSU1fTk9fREVURUNUID0gMHgwMiwKKwlSRUNPVkVSWV9TSU1fQ1RSX0VQX0ZVTEwgPSAweDAzLAorCVJFQ09WRVJZX1NJTV9FTVBUWV9QT0lOVCA9IDB4MDQsCisJUkVDT1ZFUllfU0lNX1NUQUNLX09WID0gMHgwNSwKKwlSRUNPVkVSWV9TSU1fSU5GSU5JVEVfTE9PUCA9IDB4MDYsCisJUkVDT1ZFUllfU0lNX1BDSUVfTElOS0RPV04gPSAweDA3LAorCVJFQ09WRVJZX1NJTV9TRUxGX1JFQ09WRVJZICAgPSAweDA4LAorfSBSRUNPVkVSWV9TSU1fVFlQRTsKKworLyogV01JX0ZPUkNFX0ZXX0hBTkdfQ01ESUQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX1dNSV9GT1JDRV9GV19IQU5HX0NNRF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHR5cGU7ICAgICAgICAgIC8qMDp1bnVzZWQgMTogQVNTRVJULCAyOiBub3QgcmVzcG9uZCBkZXRlY3QgY29tbWFuZCwzOiAgc2ltdWxhdGUgZXAtZnVsbCgpLDQ6Li4uICovCisJQV9VSU5UMzIgZGVsYXlfdGltZV9tczsgICAgICAgICAvKjB4ZmZmZmZmZmYgbWVhbnMgdGhlIHNpbXVsYXRlIHdpbGwgZGVsYXkgZm9yIHJhbmRvbSB0aW1lICgwIH4weGZmZmZmZmZmIG1zKSAqLworfSBXTUlfRk9SQ0VfRldfSEFOR19DTURfZml4ZWRfcGFyYW07CisjZGVmaW5lIFdNSV9NQ0FTVF9GSUxURVJfU0VUIDEKKyNkZWZpbmUgV01JX01DQVNUX0ZJTFRFUl9ERUxFVEUgMgordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBpbmRleDsKKwlBX1VJTlQzMiBhY3Rpb247CisJd21pX21hY19hZGRyIG1jYXN0YmRjYXN0YWRkcjsKK30gV01JX1NFVF9NQ0FTVEJDQVNUX0ZJTFRFUl9DTURfZml4ZWRfcGFyYW07CisKKy8qIEdQSU8gQ29tbWFuZCBhbmQgRXZlbnQgZGF0YSBzdHJ1Y3R1cmVzICovCisKKy8qIFdNSV9HUElPX0NPTkZJR19DTURJRCAqLworZW51bSB7CisJV01JX0dQSU9fUFVMTF9OT05FLAorCVdNSV9HUElPX1BVTExfVVAsCisJV01JX0dQSU9fUFVMTF9ET1dOLAorfTsKKworZW51bSB7CisJV01JX0dQSU9fSU5UVFlQRV9ESVNBQkxFLAorCVdNSV9HUElPX0lOVFRZUEVfUklTSU5HX0VER0UsCisJV01JX0dQSU9fSU5UVFlQRV9GQUxMSU5HX0VER0UsCisJV01JX0dQSU9fSU5UVFlQRV9CT1RIX0VER0UsCisJV01JX0dQSU9fSU5UVFlQRV9MRVZFTF9MT1csCisJV01JX0dQSU9fSU5UVFlQRV9MRVZFTF9ISUdICit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfZ3Bpb19jb25maWdfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgZ3Bpb19udW07ICAgICAgICAgICAgICAvKiBHUElPIG51bWJlciB0byBiZSBzZXR1cCAqLworCUFfVUlOVDMyIGlucHV0OyAgICAgICAgIC8qIDAgLSBPdXRwdXQvIDEgLSBJbnB1dCAqLworCUFfVUlOVDMyIHB1bGxfdHlwZTsgICAgICAgICAgICAgLyogUHVsbCB0eXBlIGRlZmluZWQgYWJvdmUgKi8KKwlBX1VJTlQzMiBpbnRyX21vZGU7ICAgICAgICAgICAgIC8qIEludGVycnVwdCBtb2RlIGRlZmluZWQgYWJvdmUgKElucHV0KSAqLworfSB3bWlfZ3Bpb19jb25maWdfY21kX2ZpeGVkX3BhcmFtOworCisvKiBXTUlfR1BJT19PVVRQVVRfQ01ESUQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ncGlvX291dHB1dF9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiBncGlvX251bTsgICAgICAgICAgICAgIC8qIEdQSU8gbnVtYmVyIHRvIGJlIHNldHVwICovCisJQV9VSU5UMzIgc2V0OyAgICAgICAgICAgLyogU2V0IHRoZSBHUElPIHBpbiAqLworfSB3bWlfZ3Bpb19vdXRwdXRfY21kX2ZpeGVkX3BhcmFtOworCisvKiBXTUlfR1BJT19JTlBVVF9FVkVOVElEICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfZ3Bpb19pbnB1dF9ldmVudF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIGdwaW9fbnVtOyAgICAgICAgICAgICAgLyogR1BJTyBudW1iZXIgd2hpY2ggY2hhbmdlZCBzdGF0ZSAqLworfSB3bWlfZ3Bpb19pbnB1dF9ldmVudF9maXhlZF9wYXJhbTsKKworLyogV01JX1AyUF9ESVNDX0VWRU5USUQgKi8KK2VudW0geworCVAyUF9ESVNDX1NFQVJDSF9QUk9CX1JFUV9ISVQgPSAwLCAgICAgICAgICAgICAgIC8qIHByb2IgcmVxIGhpdCB0aGUgcDJwIGZpbmQgcGF0dGVybiAqLworCVAyUF9ESVNDX1NFQVJDSF9QUk9CX1JFU1BfSElULCAgICAgICAgICAvKiBwcm9iIHJlc3AgaGl0IHRoZSBwMnAgZmluZCBwYXR0ZXJuICovCit9OworCitlbnVtIHsKKwlQMlBfRElTQ19NT0RFX1NFQVJDSCA9IDAsICAgICAgICAgICAgICAgLyogZG8gc2VhcmNoIHdoZW4gcDJwIGZpbmQgb2ZmbG9hZCAqLworCVAyUF9ESVNDX01PREVfTElTVEVOLCAgICAgICAgICAgLyogZG8gbGlzdGVuIHdoZW4gcDJwIGZpbmQgb2ZmbG9hZCAqLworCVAyUF9ESVNDX01PREVfQVVUTywgICAgICAgICAgICAgLyogZG8gbGlzdGVuIGFuZCBzZWFyY2ggd2hlbiBwMnAgZmluZCBvZmZsb2FkICovCit9OworCitlbnVtIHsKKwlQMlBfRElTQ19QQVRURVJOX1RZUEVfQlNTSUQgPSAwLCAgICAgICAgICAgICAgICAvKiBCU1NJRCBwYXR0ZXJuICovCisJUDJQX0RJU0NfUEFUVEVSTl9UWVBFX0RFVl9OQU1FLCAgICAgICAgIC8qIGRldmljZSBuYW1lIHBhdHRlcm4gKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIHJlYXNvbjsgICAgICAgICAgICAgICAgLyogUDJQIERJU0Mgd2FrZSB1cCByZWFzb24gKi8KK30gd21pX3AycF9kaXNjX2V2ZW50OworCit0eXBlZGVmIFdNSV9HVEtfT0ZGTE9BRF9TVEFUVVNfRVZFTlRfZml4ZWRfcGFyYW0KK1dPV19FVkVOVF9JTkZPX1NFQ1RJT05fR1RLSUdUSzsKKwordHlwZWRlZiBlbnVtIHsKKwlXTUlfRkFLRV9UWEJGRVJfU0VORF9ORFBBLAorCVdNSV9GQUtFX1RYQkZFUl9TRU5EX01VLAorCVdNSV9GQUtFX1RYQkZFUl9ORFBBX0ZCVFlQRSwKKwlXTUlfRkFLRV9UWEJGRVJfTkRQQV9OQ0lEWCwKKwlXTUlfRkFLRV9UWEJGRVJfTkRQQV9QT0xMLAorCVdNSV9GQUtFX1RYQkZFUl9ORFBBX0JXLAorCVdNSV9GQUtFX1RYQkZFUl9ORFBBX1BSRUFNQkxFLAorCVdNSV9GQUtFX1RYQkZFUl9ORFBBX1JBVEUsCisJV01JX0ZBS0VfVFhCRkVSX05EUF9CVywKKwlXTUlfRkFLRV9UWEJGRVJfTkRQX05TUywKKwlXTUlfVFhCRkVFX0VOQUJMRV9VUExPQURfSCwKKwlXTUlfVFhCRkVFX0VOQUJMRV9DQVBUVVJFX0gsCisJV01JX1RYQkZFRV9TRVRfQ0JGX1RCTCwKKwlXTUlfVFhCRkVFX0NCRl9UQkxfTFNJRywKKwlXTUlfVFhCRkVFX0NCRl9UQkxfU0lHQTEsCisJV01JX1RYQkZFRV9DQkZfVEJMX1NJR0EyLAorCVdNSV9UWEJGRUVfQ0JGX1RCTF9TSUdCLAorCVdNSV9UWEJGRUVfQ0JGX1RCTF9QQUQsCisJV01JX1RYQkZFRV9DQkZfVEJMX0RVUiwKKwlXTUlfVFhCRkVFX1NVX05DSURYLAorCVdNSV9UWEJGRUVfQ0JJRFgsCisJV01JX1RYQkZFRV9OR0lEWCwKK30gV01JX1RYQkZfUEFSQU1fSUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV90eGJmX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiBwYXJhbWV0ZXIgaWQgICAqLworCUFfVUlOVDMyIHBhcmFtX2lkOworCS8qKiBwYXJhbWV0ZXIgdmFsdWUgKi8KKwlBX1VJTlQzMiBwYXJhbV92YWx1ZTsKK30gd21pX3R4YmZfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfdXBsb2FkX2hfaGRyICovCisJQV9VSU5UMzIgaF9sZW5ndGg7CisJQV9VSU5UMzIgY3ZfbGVuZ3RoOworCS8qIFRoaXMgVExWIGlzIGZvbGxvd2VkIGJ5IGFycmF5IG9mIGJ5dGVzOgorCSAqIC8vIGhfY3YgaW5mbyBidWZmZXIKKwkgKiAgIEFfVUlOVDggYnVmcFtdOworCSAqLworfSB3bWlfdXBsb2FkX2hfaGRyOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfY2FwdHVyZV9oX2V2ZW50X2hkciAqLworCUFfVUlOVDMyIHN2ZF9udW07CisJQV9VSU5UMzIgdG9uZV9udW07CisJQV9VSU5UMzIgcmVzZXJ2ZWQ7Cit9IHdtaV9jYXB0dXJlX2hfZXZlbnRfaGRyOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfYXZvaWRfZnJlcV9yYW5nZV9kZXNjICovCisJQV9VSU5UMzIgc3RhcnRfZnJlcTsgICAgICAgICAgICAvKiBzdGFydCBmcmVxdWVuY3ksIG5vdCBjaGFubmVsIGNlbnRlciBmcmVxICovCisJQV9VSU5UMzIgZW5kX2ZyZXE7ICAgICAgICAgICAgICAvKiBlbmQgZnJlcXVlbmN5ICovCit9IHdtaV9hdm9pZF9mcmVxX3JhbmdlX2Rlc2M7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hdm9pZF9mcmVxX3Jhbmdlc19ldmVudF9maXhlZF9wYXJhbSAqLworCS8qIGJhZCBjaGFubmVsIHJhbmdlIGNvdW50LCBtdWx0aSByYW5nZSBpcyBhbGxvd2VkLCAwIG1lYW5zIGFsbCBjaGFubmVsIGNsZWFyICovCisJQV9VSU5UMzIgbnVtX2ZyZXFfcmFuZ2VzOworCisJLyogVGhlIFRMVnMgd2lsbCBmb2xsb3cuCisJICogbXVsdGkgcmFuZ2Ugd2l0aCBudW1fZnJlcV9yYW5nZXMsIExURSBhZHZhbmNlIG11bHRpIGNhcnJpZXIsIENETUEsZXRjCisJICogICAgIHdtaV9hdm9pZF9mcmVxX3JhbmdlX2Rlc2MgYXZkX2ZyZXFfcmFuZ2VbXTsgICAgIC8vIG1lc3NhZ2UgYnVmZmVyLCBOVUxMIHRlcm1pbmF0ZWQKKwkgKi8KK30gd21pX2F2b2lkX2ZyZXFfcmFuZ2VzX2V2ZW50X2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfZ3RrX3Jla2V5X2ZhaWxfZXZlbnRfZml4ZWRfcGFyYW0gICovCisJLyoqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJQV9VSU5UMzIgcmVzZXJ2ZWQwOworCUFfVUlOVDMyIHZkZXZfaWQ7Cit9IHdtaV9ndGtfcmVrZXlfZmFpbF9ldmVudF9maXhlZF9wYXJhbTsKKworZW51bSB3bW1fYWNfZG93bmdyYWRlX3BvbGljeSB7CisJV01NX0FDX0RPV05HUkFERV9ERVBSSU8sCisJV01NX0FDX0RPV05HUkFERV9EUk9QLAorCVdNTV9BQ19ET1dOR1JBREVfSU5WQUxJRCwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIGN3bWluOworCUFfVUlOVDMyIGN3bWF4OworCUFfVUlOVDMyIGFpZnM7CisJQV9VSU5UMzIgdHhvcGxpbWl0OworCUFfVUlOVDMyIGFjbTsKKwlBX1VJTlQzMiBub19hY2s7Cit9IHdtaV93bW1fdnBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKKwl3bWlfd21tX3ZwYXJhbXMgd21tX3BhcmFtc1s0XTsgICAgICAgICAgLyogMCBiZSwgMSBiaywgMiB2aSwgMyB2byAqLworfSB3bWlfdmRldl9zZXRfd21tX3BhcmFtc19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgZ3R4UlRNYXNrWzJdOyAgICAgICAgICAvKiBmb3IgSFQgYW5kIFZIVCByYXRlIG1hc2tzICovCisJQV9VSU5UMzIgdXNlckd0eE1hc2s7ICAgICAgICAgICAvKiBob3N0IHJlcXVlc3QgZm9yIEdUWCBtYXNrICovCisJQV9VSU5UMzIgZ3R4UEVSVGhyZXNob2xkOyAgICAgICAgICAgICAgIC8qIGRlZmF1bHQ6IDEwJSAqLworCUFfVUlOVDMyIGd0eFBFUk1hcmdpbjsgICAgICAgICAgLyogZGVmYXVsdDogMiUgKi8KKwlBX1VJTlQzMiBndHhUUENzdGVwOyAgICAgICAgICAgIC8qIGRlZmF1bHQ6IDEgKi8KKwlBX1VJTlQzMiBndHhUUENNaW47ICAgICAgICAgICAgIC8qIGRlZmF1bHQ6IDUgKi8KKwlBX1VJTlQzMiBndHhCV01hc2s7ICAgICAgICAgICAgIC8qIDIwLzQwLzgwLzE2MCBNaHogKi8KK30gd21pX3ZkZXZfc2V0X2d0eF9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGFjOworCUFfVUlOVDMyIG1lZGl1bV90aW1lX3VzOyAgICAgICAgICAgICAgICAvKiBwZXIgc2Vjb25kIHVuaXQsIHRoZSBBZG1pdHRlZCB0aW1lIGdyYW50ZWQsIHVuaXQgaW4gbWljcm8gc2Vjb25kcyAqLworCUFfVUlOVDMyIGRvd25ncmFkZV90eXBlOworfSB3bWlfdmRldl93bW1fYWRkdHNfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGFjOworfSB3bWlfdmRldl93bW1fZGVsdHNfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9kZnNfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAgKi8KKwkvKiogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwlBX1VJTlQzMiByZXNlcnZlZDA7Cit9IHdtaV9wZGV2X2Rmc19lbmFibGVfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9kZnNfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0gICovCisJLyoqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJQV9VSU5UMzIgcmVzZXJ2ZWQwOworfSB3bWlfcGRldl9kZnNfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogIFdNSVRMVl9UQUdfU1RSVUNfd21pX2Rmc19waHllcnJfZmlsdGVyX2VuYV9jbWRfZml4ZWRfcGFyYW0KKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCisJLyoqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJQV9VSU5UMzIgcmVzZXJ2ZWQwOworfSB3bWlfZGZzX3BoeWVycl9maWx0ZXJfZW5hX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiAgV01JVExWX1RBR19TVFJVQ193bWlfZGZzX3BoeWVycl9maWx0ZXJfZGlzX2NtZF9maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJQV9VSU5UMzIgcmVzZXJ2ZWQwOworfSB3bWlfZGZzX3BoeWVycl9maWx0ZXJfZGlzX2NtZF9maXhlZF9wYXJhbTsKKworLyoqIFRETFMgQ09NTUFORFMgKi8KKworLyogV01JX1RETFNfU0VUX1NUQVRFX0NNRElEICovCisvKiBURExTIFN0YXRlICovCitlbnVtIHdtaV90ZGxzX3N0YXRlIHsKKwkvKiogVERMUyBkaXNhYmxlICovCisJV01JX1RETFNfRElTQUJMRSwKKwkvKiogVERMUyBlbmFibGVkIC0gbm8gZmlybXdhcmUgY29ubmVjdGlvbiB0cmFja2luZy9ub3RpZmljYXRpb25zICovCisJV01JX1RETFNfRU5BQkxFX1BBU1NJVkUsCisJLyoqIFRETFMgZW5hYmxlZCAtIHdpdGggZmlybXdhcmUgY29ubmVjdGlvbiB0cmFja2luZy9ub3RpZmljYXRpb25zICovCisJV01JX1RETFNfRU5BQkxFX0FDVElWRSwKKwkvKiBURExTIGVuYWJsZWQgLSBmaXJtd2FyZSB3YWl0cyBmb3IgcGVlciBtYWMgZm9yIGNvbm5lY3Rpb24gdHJhY2tpbmcgKi8KKwlXTUlfVERMU19FTkFCTEVfQUNUSVZFX0VYVEVSTkFMX0NPTlRST0wsCit9OworCisvKiBURExTIE9wdGlvbnMgKi8KKyNkZWZpbmUgV01JX1RETFNfT0ZGQ0hBTl9FTiAgICAgICAgICAgICAoMSA8PCAwKSAvKiogVERMUyBPZmYgQ2hhbm5lbCBzdXBwb3J0ICovCisjZGVmaW5lIFdNSV9URExTX0JVRkZFUl9TVEFfRU4gICAgICAgICAgKDEgPDwgMSkgLyoqIFRETFMgQnVmZmVyIFNUQSBzdXBwb3J0ICovCisjZGVmaW5lIFdNSV9URExTX1NMRUVQX1NUQV9FTiAgICAgICAgICAgKDEgPDwgMikgLyoqIFRETFMgU2xlZXAgU1RBIHN1cHBvcnQgKG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkKSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV90ZGxzX3NldF9zdGF0ZV9jbWRfZml4ZWRfcGFyYW0gICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogRW5hYmxlL0Rpc2FibGUgVERMUyAod21pX3RkbHNfc3RhdGUpICovCisJQV9VSU5UMzIgc3RhdGU7CisJLyogRHVyYXRpb24gKGluIG1zKSBvdmVyIHdoaWNoIHRvIGNhbGN1bGF0ZSB0eC9yeCB0aHJlc2hvbGQKKwkgKiB0byB0cmlnZ2VyIFRETFMgRGlzY292ZXJ5CisJICovCisJQV9VSU5UMzIgbm90aWZpY2F0aW9uX2ludGVydmFsX21zOworCS8qKiBudW1iZXIgb2YgcGFja2V0cyBPVkVSIHdoaWNoIG5vdGlmeS9zdWdnZXN0IFRETFMgRGlzY292ZXJ5OgorCSAqICBpZiBjdXJyZW50IHR4IHBwcyBjb3VudGVyIC8gbm90aWZpY2F0aW9uIGludGVydmFsID49IHRocmVzaG9sZAorCSAqICB0aGVuIGEgbm90aWZpY2F0aW9uIHdpbGwgYmUgc2VudCB0byBob3N0IHRvIGFkdmlzZSBURExTIERpc2NvdmVyeSAqLworCUFfVUlOVDMyIHR4X2Rpc2NvdmVyeV90aHJlc2hvbGQ7CisJLyoqIG51bWJlciBvZiBwYWNrZXRzIFVOREVSIHdoaWNoIG5vdGlmeS9zdWdnZXN0IFRETFMgVGVhcmRvd246CisJICogIGlmIGN1cnJlbnQgdHggcHBzIGNvdW50ZXIgLyBub3RpZmljYXRpb24gaW50ZXJ2YWwgPCB0aHJlc2hvbGQKKwkgKiAgdGhlbiBhIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHNlbnQgdG8gaG9zdCB0byBhZHZpc2UgVERMUyBUZWFyIGRvd24gKi8KKwlBX1VJTlQzMiB0eF90ZWFyZG93bl90aHJlc2hvbGQ7CisJLyoqIEFic29sdXRlIFJTU0kgdmFsdWUgdW5kZXIgd2hpY2ggbm90aWZ5L3N1Z2dlc3QgVERMUyBUZWFyZG93biAqLworCUFfSU5UMzIgcnNzaV90ZWFyZG93bl90aHJlc2hvbGQ7CisJLyoqIFBlZXIgUlNTSSA8IChBUCBSU1NJICsgZGVsdGEpIHdpbGwgdHJpZ2dlciBhIHRlYXJkb3duICovCisJQV9JTlQzMiByc3NpX2RlbHRhOworCS8qKiBURExTIE9wdGlvbiBDb250cm9sCisJICogT2ZmLUNoYW5uZWwsIEJ1ZmZlciBTVEEsIChsYXRlcilTbGVlcCBTVEEgc3VwcG9ydCAqLworCUFfVUlOVDMyIHRkbHNfb3B0aW9uczsKKwkvKiBCdWZmZXJpbmcgdGltZSBpbiBudW1iZXIgb2YgYmVhY29uIGludGVydmFscyAqLworCUFfVUlOVDMyIHRkbHNfcGVlcl90cmFmZmljX2luZF93aW5kb3c7CisJLyogV2FpdCB0aW1lIGZvciBQVFIgZnJhbWUgKi8KKwlBX1VJTlQzMiB0ZGxzX3BlZXJfdHJhZmZpY19yZXNwb25zZV90aW1lb3V0X21zOworCS8qIFNlbGYgUFVBUFNEIG1hc2sgKi8KKwlBX1VJTlQzMiB0ZGxzX3B1YXBzZF9tYXNrOworCS8qIEluYWN0aXZpdHkgdGltZW91dCAqLworCUFfVUlOVDMyIHRkbHNfcHVhcHNkX2luYWN0aXZpdHlfdGltZV9tczsKKwkvKiBNYXggb2YgcnggZnJhbWUgZHVyaW5nIFNQICovCisJQV9VSU5UMzIgdGRsc19wdWFwc2RfcnhfZnJhbWVfdGhyZXNob2xkOworCS8qIER1cmF0aW9uIChpbiBtcykgb3ZlciB3aGljaCB0byBjaGVjayB3aGV0aGVyIFRETFMgbGluaworCSAqIG5lZWRzIHRvIGJlIHRvcm4gZG93bgorCSAqLworCUFfVUlOVDMyIHRlYXJkb3duX25vdGlmaWNhdGlvbl9tczsKKwkvKiBTVEEga2lja291dCB0aHJlc2hvbGQgZm9yIFRETFMgcGVlciAqLworCUFfVUlOVDMyIHRkbHNfcGVlcl9raWNrb3V0X3RocmVzaG9sZDsKK30gd21pX3RkbHNfc2V0X3N0YXRlX2NtZF9maXhlZF9wYXJhbTsKKworLyogV01JX1RETFNfUEVFUl9VUERBVEVfQ01ESUQgKi8KKworZW51bSB3bWlfdGRsc19wZWVyX3N0YXRlIHsKKwkvKiogdHggcGVlciBURExTIGxpbmsgc2V0dXAgbm93IHN0YXJ0aW5nLCB0cmFmZmljIHRvIERBIHNob3VsZCBiZQorCSAqIHBhdXNlZCAoZXhjZXB0IFRETFMgZnJhbWVzKSB1bnRpbCBzdGF0ZSBpcyBtb3ZlZCB0byBDT05ORUNURUQgKG9yCisJICogVEVBUkRPV04gb24gc2V0dXAgZmFpbHVyZSkgKi8KKwlXTUlfVERMU19QRUVSX1NUQVRFX1BFRVJJTkcsCisJLyoqIHR4IHBlZXIgVERMUyBsaW5rIGVzdGFibGlzaGVkLCBydW5uaW5nIChhbGwgdHJhZmZpYyB0byBEQSB1bnBhdXNlZCkgKi8KKwlXTUlfVERMU19QRUVSX1NUQVRFX0NPTk5FQ1RFRCwKKwkvKiogdHggcGVlciBURExTIGxpbmsgdGVhciBkb3duIHN0YXJ0ZWQgKGxpbmsgcGF1c2VkLCBhbnkgZnJhbWVzCisJICogcXVldWVkIGZvciBEQSB3aWxsIGJlIHJlcXVldWVkIGJhY2sgdGhyb3VnaCB0aGUgQVApKi8KKwlXTUlfVERMU19QRUVSX1NUQVRFX1RFQVJET1dOLAorCS8qIEFkZCBwZWVyIG1hYyBpbnRvIGNvbm5lY3Rpb24gdGFibGUgKi8KKwlXTUlfVERMU19QRUVSX0FERF9NQUNfQUREUiwKKwkvKiBSZW1vdmUgcGVlciBtYWMgZnJvbSBjb25uZWN0aW9uIHRhYmxlICovCisJV01JX1RETFNfUEVFUl9SRU1PVkVfTUFDX0FERFIsCit9OworCisvKiBOQjogVGhlc2UgZGVmaW5lcyBhcmUgZml4ZWQsIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0IGJyZWFraW5nIFdNSSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFdNSV9URExTX01BWF9TVVBQX09QRVJfQ0xBU1NFUyAzMgordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfdGRsc19wZWVyX2NhcGFiaWxpdGllcyAgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qIFBlZXIncyBRb1MgSW5mbyAtIGZvciBVLUFQU0QgKi8KKwkvKiBBQyBGTEFHUyAgLSBhY2Nlc3NlZCB0aHJvdWdoIG1hY3JvcyBiZWxvdyAqLworCS8qIEFjaywgU1AsIE1vcmUgRGF0YSBBY2sgLSBhY2Nlc3NlZCB0aHJvdWdoIG1hY3JvcyBiZWxvdyAqLworCUFfVUlOVDMyIHBlZXJfcW9zOworCS8qVERMUyBQZWVyJ3MgVS1BUFNEIEJ1ZmZlciBTVEEgU3VwcG9ydCAqLworCUFfVUlOVDMyIGJ1ZmZfc3RhX3N1cHBvcnQ7CisJLypURExTIG9mZiBjaGFubmVsIHJlbGF0ZWQgcGFyYW1zICovCisJQV9VSU5UMzIgb2ZmX2NoYW5fc3VwcG9ydDsKKwlBX1VJTlQzMiBwZWVyX2N1cnJfb3BlcmNsYXNzOworCUFfVUlOVDMyIHNlbGZfY3Vycl9vcGVyY2xhc3M7CisJLyogTnVtYmVyIG9mIGNoYW5uZWxzIGF2YWlsYWJsZSBmb3Igb2ZmIGNoYW5uZWwgb3BlcmF0aW9uICovCisJQV9VSU5UMzIgcGVlcl9jaGFuX2xlbjsKKwlBX1VJTlQzMiBwZWVyX29wZXJjbGFzc19sZW47CisJQV9VSU5UOCBwZWVyX29wZXJjbGFzc1tXTUlfVERMU19NQVhfU1VQUF9PUEVSX0NMQVNTRVNdOworCS8qIElzIHBlZXIgaW5pdGlhdG9yIG9yIHJlc3BvbmRlciBvZiBURExTIHNldHVwIHJlcXVlc3QgKi8KKwlBX1VJTlQzMiBpc19wZWVyX3Jlc3BvbmRlcjsKKwkvKiBQcmVmZXJyZWQgb2ZmIGNoYW5uZWwgbnVtYmVyIGFzIGNvbmZpZ3VyZWQgYnkgdXNlciAqLworCUFfVUlOVDMyIHByZWZfb2ZmY2hhbl9udW07CisJLyogUHJlZmVycmVkIG9mZiBjaGFubmVsIGJhbmR3aWR0aCBhcyBjb25maWd1cmVkIGJ5IHVzZXIgKi8KKwlBX1VJTlQzMiBwcmVmX29mZmNoYW5fYnc7CisKKwkvKiogRm9sbG93ZWQgYnkgdGhlIHZhcmlhYmxlIGxlbmd0aCBUTFYgcGVlcl9jaGFuX2xpc3Q6CisJICogIHdtaV9jaGFubmVsIHBlZXJfY2hhbl9saXN0W10uCisJICogIEFycmF5IHNpemUgd291bGQgYmUgcGVlcl9jaGFuX2xlbi4KKwkgKiAgVGhpcyBhcnJheSBpcyBpbnRlcnNlY3RlZCBjaGFubmVscyB3aGljaCBpcyBzdXBwb3J0ZWQgYnkgYm90aCBwZWVyCisJICogIGFuZCBEVVQuIGZyZXExIGluIGNoYW5faW5mbyBzaGFsbCBiZSBzYW1lIGFzIG1oeiwgZnJlcTIgc2hhbGwgYmUgMC4KKwkgKiAgRlcgc2hhbGwgY29tcHV0ZSBCVyBmb3IgYW4gb2ZmY2hhbiBiYXNlZCBvbiBwZWVyJ3MgaHQvdmh0IGNhcAorCSAqICByZWNlaXZlZCBpbiBwZWVyX2Fzc29jIGNtZCBkdXJpbmcgY2hhbmdlIFNUQSBvcGVyYXRpb24KKwkgKi8KK30gd21pX3RkbHNfcGVlcl9jYXBhYmlsaXRpZXM7CisKKyNkZWZpbmUgV01JX1RETFNfUU9TX1ZPX0ZMQUcgICAgICAgICAgIDAKKyNkZWZpbmUgV01JX1RETFNfUU9TX1ZJX0ZMQUcgICAgICAgICAgIDEKKyNkZWZpbmUgV01JX1RETFNfUU9TX0JLX0ZMQUcgICAgICAgICAgIDIKKyNkZWZpbmUgV01JX1RETFNfUU9TX0JFX0ZMQUcgICAgICAgICAgIDMKKyNkZWZpbmUgV01JX1RETFNfUU9TX0FDS19GTEFHICAgICAgICAgIDQKKyNkZWZpbmUgV01JX1RETFNfUU9TX1NQX0ZMQUcgICAgICAgICAgIDUKKyNkZWZpbmUgV01JX1RETFNfUU9TX01PUkVEQVRBX0ZMQUcgICAgIDcKKworI2RlZmluZSBXTUlfVERMU19QRUVSX1NFVF9RT1NfRkxBRyhwcGVlcl9jYXBzLGZsYWcpIGRvIHsgXAorCQkocHBlZXJfY2FwcyktPnBlZXJfcW9zIHw9ICAoMSA8PCBmbGFnKTsJICAgICBcCit9IHdoaWxlKDApCisjZGVmaW5lIFdNSV9URExTX1BFRVJfR0VUX1FPU19GTEFHKHBwZWVyX2NhcHMsZmxhZykgICBcCisJKCgocHBlZXJfY2FwcyktPnBlZXJfcW9zICYgKDEgPDwgZmxhZykpID4+IGZsYWcpCisKKyNkZWZpbmUgV01JX1NFVF9URExTX1BFRVJfVk9fVUFQU0QocHBlZXJfY2FwcykgXAorCVdNSV9URExTX1BFRVJfU0VUX1FPU19GTEFHKHBwZWVyX2NhcHMsIFdNSV9URExTX1FPU19WT19GTEFHKQorI2RlZmluZSBXTUlfR0VUX1RETFNfUEVFUl9WT19VQVBTRChwcGVlcl9jYXBzKSBcCisJV01JX1RETFNfUEVFUl9HRVRfUU9TX0ZMQUcocHBlZXJfY2FwcywgV01JX1RETFNfUU9TX1ZPX0ZMQUcpCisjZGVmaW5lIFdNSV9TRVRfVERMU19QRUVSX1ZJX1VBUFNEKHBwZWVyX2NhcHMpIFwKKwlXTUlfVERMU19QRUVSX1NFVF9RT1NfRkxBRyhwcGVlcl9jYXBzLCBXTUlfVERMU19RT1NfVklfRkxBRykKKyNkZWZpbmUgV01JX0dFVF9URExTX1BFRVJfVklfVUFQU0QocHBlZXJfY2FwcykgXAorCVdNSV9URExTX1BFRVJfR0VUX1FPU19GTEFHKHBwZWVyX2NhcHMsIFdNSV9URExTX1FPU19WSV9GTEFHKQorI2RlZmluZSBXTUlfU0VUX1RETFNfUEVFUl9CS19VQVBTRChwcGVlcl9jYXBzKSBcCisJV01JX1RETFNfUEVFUl9TRVRfUU9TX0ZMQUcocHBlZXJfY2FwcywgV01JX1RETFNfUU9TX0JLX0ZMQUcpCisjZGVmaW5lIFdNSV9HRVRfVERMU19QRUVSX0JLX1VBUFNEKHBwZWVyX2NhcHMpIFwKKwlXTUlfVERMU19QRUVSX0dFVF9RT1NfRkxBRyhwcGVlcl9jYXBzLCBXTUlfVERMU19RT1NfQktfRkxBRykKKyNkZWZpbmUgV01JX1NFVF9URExTX1BFRVJfQkVfVUFQU0QocHBlZXJfY2FwcykgXAorCVdNSV9URExTX1BFRVJfU0VUX1FPU19GTEFHKHBwZWVyX2NhcHMsIFdNSV9URExTX1FPU19CRV9GTEFHKQorI2RlZmluZSBXTUlfR0VUX1RETFNfUEVFUl9CRV9VQVBTRChwcGVlcl9jYXBzKSBcCisJV01JX1RETFNfUEVFUl9HRVRfUU9TX0ZMQUcocHBlZXJfY2FwcywgV01JX1RETFNfUU9TX0JFX0ZMQUcpCisjZGVmaW5lIFdNSV9TRVRfVERMU19QRUVSX0FDS19VQVBTRChwcGVlcl9jYXBzKQlcCisJV01JX1RETFNfUEVFUl9TRVRfUU9TX0ZMQUcocHBlZXJfY2FwcywgV01JX1RETFNfUU9TX0FDS19GTEFHKQorI2RlZmluZSBXTUlfR0VUX1RETFNfUEVFUl9BQ0tfVUFQU0QocHBlZXJfY2FwcykJXAorCVdNSV9URExTX1BFRVJfR0VUX1FPU19GTEFHKHBwZWVyX2NhcHMsIFdNSV9URExTX1FPU19BQ0tfRkxBRykKKy8qIFNQIGhhcyAyIGJpdHMgKi8KKyNkZWZpbmUgV01JX1NFVF9URExTX1BFRVJfU1BfVUFQU0QocHBlZXJfY2Fwcyx2YWwpIGRvIHsJXAorCQkocHBlZXJfY2FwcyktPnBlZXJfcW9zIHw9ICAoKCh2YWwpJjB4MykgPDwgV01JX1RETFNfUU9TX1NQX0ZMQUcpOyBcCit9IHdoaWxlKDApCisjZGVmaW5lIFdNSV9HRVRfVERMU19QRUVSX1NQX1VBUFNEKHBwZWVyX2NhcHMpIFwKKwkoKChwcGVlcl9jYXBzKS0+cGVlcl9xb3MgJiAoMHgzIDw8IFdNSV9URExTX1FPU19TUF9GTEFHKSkgPj4gV01JX1RETFNfUU9TX1NQX0ZMQUcpCisKKyNkZWZpbmUgV01JX1NFVF9URExTX1BFRVJfTU9SRV9EQVRBX0FDS19VQVBTRChwcGVlcl9jYXBzKSBcCisJV01JX1RETFNfUEVFUl9TRVRfUU9TX0ZMQUcocHBlZXJfY2FwcywgV01JX1RETFNfUU9TX01PUkVEQVRBX0ZMQUcpCisjZGVmaW5lIFdNSV9HRVRfVERMU19QRUVSX01PUkVfREFUQV9BQ0tfVUFQU0QocHBlZXJfY2FwcykgXAorCVdNSV9URExTX1BFRVJfR0VUX1FPU19GTEFHKHBwZWVyX2NhcHMsIFdNSV9URExTX1FPU19NT1JFREFUQV9GTEFHKQorCisjZGVmaW5lIFdNSV9URExTX1NFTEZfU0VUX1FPU19GTEFHKHBzZXRfY21kLGZsYWcpIGRvIHsgXAorCQkocHNldF9jbWQpLT50ZGxzX3B1YXBzZF9tYXNrIHw9ICAoMSA8PCBmbGFnKTsJICAgXAorfSB3aGlsZSgwKQorI2RlZmluZSBXTUlfVERMU19TRUxGX0dFVF9RT1NfRkxBRyhwc2V0X2NtZCxmbGFnKSAgIFwKKwkoKChwc2V0X2NtZCktPnRkbHNfcHVhcHNkX21hc2sgJiAoMSA8PCBmbGFnKSkgPj4gZmxhZykKKworI2RlZmluZSBXTUlfU0VUX1RETFNfU0VMRl9WT19VQVBTRChwc2V0X2NtZCkgXAorCVdNSV9URExTX1NFTEZfU0VUX1FPU19GTEFHKHBzZXRfY21kLCBXTUlfVERMU19RT1NfVk9fRkxBRykKKyNkZWZpbmUgV01JX0dFVF9URExTX1NFTEZfVk9fVUFQU0QocHNldF9jbWQpIFwKKwlXTUlfVERMU19TRUxGX0dFVF9RT1NfRkxBRyhwc2V0X2NtZCwgV01JX1RETFNfUU9TX1ZPX0ZMQUcpCisjZGVmaW5lIFdNSV9TRVRfVERMU19TRUxGX1ZJX1VBUFNEKHBzZXRfY21kKSBcCisJV01JX1RETFNfU0VMRl9TRVRfUU9TX0ZMQUcocHNldF9jbWQsIFdNSV9URExTX1FPU19WSV9GTEFHKQorI2RlZmluZSBXTUlfR0VUX1RETFNfU0VMRl9WSV9VQVBTRChwc2V0X2NtZCkgXAorCVdNSV9URExTX1NFTEZfR0VUX1FPU19GTEFHKHBzZXRfY21kLCBXTUlfVERMU19RT1NfVklfRkxBRykKKyNkZWZpbmUgV01JX1NFVF9URExTX1NFTEZfQktfVUFQU0QocHNldF9jbWQpIFwKKwlXTUlfVERMU19TRUxGX1NFVF9RT1NfRkxBRyhwc2V0X2NtZCwgV01JX1RETFNfUU9TX0JLX0ZMQUcpCisjZGVmaW5lIFdNSV9HRVRfVERMU19TRUxGX19CS19VQVBTRChwc2V0X2NtZCkgXAorCVdNSV9URExTX1NFTEZfR0VUX1FPU19GTEFHKHBzZXRfY21kLCBXTUlfVERMU19RT1NfQktfRkxBRykKKyNkZWZpbmUgV01JX1NFVF9URExTX1NFTEZfQkVfVUFQU0QocHNldF9jbWQpIFwKKwlXTUlfVERMU19TRUxGX1NFVF9RT1NfRkxBRyhwc2V0X2NtZCwgV01JX1RETFNfUU9TX0JFX0ZMQUcpCisjZGVmaW5lIFdNSV9HRVRfVERMU19TRUxGX0JFX1VBUFNEKHBzZXRfY21kKSBcCisJV01JX1RETFNfU0VMRl9HRVRfUU9TX0ZMQUcocHNldF9jbWQsIFdNSV9URExTX1FPU19CRV9GTEFHKQorI2RlZmluZSBXTUlfU0VUX1RETFNfU0VMRl9BQ0tfVUFQU0QocHNldF9jbWQpIFwKKwlXTUlfVERMU19TRUxGX1NFVF9RT1NfRkxBRyhwc2V0X2NtZCwgV01JX1RETFNfUU9TX0FDS19GTEFHKQorI2RlZmluZSBXTUlfR0VUX1RETFNfU0VMRl9BQ0tfVUFQU0QocHNldF9jbWQpIFwKKwlXTUlfVERMU19TRUxGX0dFVF9RT1NfRkxBRyhwc2V0X2NtZCwgV01JX1RETFNfUU9TX0FDS19GTEFHKQorLyogU1AgaGFzIDIgYml0cyAqLworI2RlZmluZSBXTUlfU0VUX1RETFNfU0VMRl9TUF9VQVBTRChwc2V0X2NtZCx2YWwpIGRvIHsgXAorCQkocHNldF9jbWQpLT50ZGxzX3B1YXBzZF9tYXNrIHw9ICAoKCh2YWwpJjB4MykgPDwgV01JX1RETFNfUU9TX1NQX0ZMQUcpOwlcCit9IHdoaWxlKDApCisjZGVmaW5lIFdNSV9HRVRfVERMU19TRUxGX1NQX1VBUFNEKHBzZXRfY21kKSBcCisJKCgocHNldF9jbWQpLT50ZGxzX3B1YXBzZF9tYXNrICYgKDB4MyA8PCBXTUlfVERMU19RT1NfU1BfRkxBRykpID4+IFdNSV9URExTX1FPU19TUF9GTEFHKQorCisjZGVmaW5lIFdNSV9TRVRfVERMU19TRUxGX01PUkVfREFUQV9BQ0tfVUFQU0QocHNldF9jbWQpCVwKKwlXTUlfVERMU19TRUxGX1NFVF9RT1NfRkxBRyhwc2V0X2NtZCwgV01JX1RETFNfUU9TX01PUkVEQVRBX0ZMQUcpCisjZGVmaW5lIFdNSV9HRVRfVERMU19TRUxGX01PUkVfREFUQV9BQ0tfVUFQU0QocHNldF9jbWQpCVwKKwlXTUlfVERMU19TRUxGX0dFVF9RT1NfRkxBRyhwc2V0X2NtZCwgV01JX1RETFNfUU9TX01PUkVEQVRBX0ZMQUcpCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3RkbHNfcGVlcl91cGRhdGVfY21kX2ZpeGVkX3BhcmFtICAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHBlZXIgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCS8qKiBuZXcgVERMUyBzdGF0ZSBmb3IgcGVlciAod21pX3RkbHNfcGVlcl9zdGF0ZSkgKi8KKwlBX1VJTlQzMiBwZWVyX3N0YXRlOworCS8qIFRoZSBUTFYgZm9yIHdtaV90ZGxzX3BlZXJfY2FwYWJpbGl0aWVzIHdpbGwgZm9sbG93LgorCSAqICAgICB3bWlfdGRsc19wZWVyX2NhcGFiaWxpdGllcyAgcGVlcl9jYXBzOworCSAqLworCS8qKiBGb2xsb3dlZCBieSB0aGUgdmFyaWFibGUgbGVuZ3RoIFRMViBjaGFuX2luZm86CisJICogIHdtaV9jaGFubmVsIGNoYW5faW5mb1tdICovCit9IHdtaV90ZGxzX3BlZXJfdXBkYXRlX2NtZF9maXhlZF9wYXJhbTsKKworLyogV01JX1RETFNfU0VUX09GRkNIQU5fTU9ERV9DTURJRCAqLworCisvKiBiaXRtYXAgIDIwLCA0MCwgODAgb3IgMTYwIE1IeiB3aWRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgV01JX1RETFNfT0ZGQ0hBTl8yME1IWiAgICAgICAgICAgICAgICAgIDB4MSAgICAgLyogIDIwIE1IeiB3aWRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgV01JX1RETFNfT0ZGQ0hBTl80ME1IWiAgICAgICAgICAgICAgICAgIDB4MiAgICAgLyogIDQwIE1IeiB3aWRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgV01JX1RETFNfT0ZGQ0hBTl84ME1IWiAgICAgICAgICAgICAgICAgIDB4NCAgICAgLyogIDgwIE1IeiB3aWRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgV01JX1RETFNfT0ZGQ0hBTl8xNjBNSFogICAgICAgICAgICAgICAgIDB4OCAgICAgLyogIDE2MCBNSHogd2lkZSBjaGFubmVsICovCisKK2VudW0gd21pX3RkbHNfb2ZmY2hhbl9tb2RlIHsKKwlXTUlfVERMU19FTkFCTEVfT0ZGQ0hBTk5FTCwKKwlXTUlfVERMU19ESVNBQkxFX09GRkNIQU5ORUwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3RkbHNfc2V0X29mZmNoYW5fbW9kZV9jbWRfZml4ZWRfcGFyYW0gICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogRW5hYmxlL0Rpc2FibGUgVERMUyBvZmZjaGFubmVsICovCisJQV9VSU5UMzIgb2ZmY2hhbl9tb2RlOworCS8qKiBwZWVyIE1BQyBhZGRyZXNzICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKKwkvKiBJcyBwZWVyIGluaXRpYXRvciBvciByZXNwb25kZXIgb2YgVERMUyBzZXR1cCByZXF1ZXN0ICovCisJQV9VSU5UMzIgaXNfcGVlcl9yZXNwb25kZXI7CisJLyogb2ZmIGNoYW5uZWwgbnVtYmVyICovCisJQV9VSU5UMzIgb2ZmY2hhbl9udW07CisJLyogb2ZmIGNoYW5uZWwgYmFuZHdpZHRoIGJpdG1hcCwgZS5nLiBXTUlfT0ZGQ0hBTl8yME1IWiAqLworCUFfVUlOVDMyIG9mZmNoYW5fYndfYml0bWFwOworCS8qIG9wZXJhdGluZyBjbGFzcyBmb3Igb2ZmY2hhbiAqLworCUFfVUlOVDMyIG9mZmNoYW5fb3Blcl9jbGFzczsKK30gd21pX3RkbHNfc2V0X29mZmNoYW5fbW9kZV9jbWRfZml4ZWRfcGFyYW07CisKKy8qKiBURExTIEVWRU5UUyAqLworZW51bSB3bWlfdGRsc19wZWVyX25vdGlmaWNhdGlvbiB7CisJLyoqIHRkbHMgZGlzY292ZXJ5IHJlY29tbWVuZGVkIGZvciBwZWVyIChiYXNlZAorCSAqIG9uIHR4IGJ5dGVzIHBlciBzZWNvbmQgPiB0eF9kaXNjb3ZlciB0aHJlc2hvbGQpICovCisJV01JX1RETFNfU0hPVUxEX0RJU0NPVkVSLAorCS8qKiB0ZGxzIGxpbmsgdGVhciBkb3duIHJlY29tbWVuZGVkIGZvciBwZWVyCisJICogZHVlIHRvIHR4IGJ5dGVzIHBlciBzZWNvbmQgYmVsb3cgdHhfdGVhcmRvd25fdGhyZXNob2xkCisJICogTkI6IHRoaXMgbm90aWZpY2F0aW9uIHNlbnQgb25jZSAqLworCVdNSV9URExTX1NIT1VMRF9URUFSRE9XTiwKKwkvKiogdHggcGVlciBURExTIGxpbmsgdGVhciBkb3duIGNvbXBsZXRlICovCisJV01JX1RETFNfUEVFUl9ESVNDT05ORUNURUQsCit9OworCitlbnVtIHdtaV90ZGxzX3BlZXJfcmVhc29uIHsKKwkvKiogdGRscyB0ZWFyZG93biByZWNvbW1lbmRlZCBkdWUgdG8gbG93IHRyYW5zbWl0cyAqLworCVdNSV9URExTX1RFQVJET1dOX1JFQVNPTl9UWCwKKwkvKiogdGRscyBsaW5rIHRlYXIgZG93biByZWNvbW1lbmRlZCBkdWUgdG8gcG9vciBSU1NJICovCisJV01JX1RETFNfVEVBUkRPV05fUkVBU09OX1JTU0ksCisJLyoqIHRkbHMgbGluayB0ZWFyIGRvd24gcmVjb21tZW5kZWQgZHVlIHRvIG9mZmNoYW5uZWwgc2NhbiAqLworCVdNSV9URExTX1RFQVJET1dOX1JFQVNPTl9TQ0FOLAorCS8qKiB0ZGxzIHBlZXIgZGlzY29ubmVjdGVkIGR1ZSB0byBwZWVyIGRlbGV0aW9uICovCisJV01JX1RETFNfRElTQ09OTkVDVEVEX1JFQVNPTl9QRUVSX0RFTEVURSwKKwkvKiogdGRscyBwZWVyIGRpc2Nvbm5lY3RlZCBkdWUgdG8gUFRSIHRpbWVvdXQgKi8KKwlXTUlfVERMU19URUFSRE9XTl9SRUFTT05fUFRSX1RJTUVPVVQsCisJLyoqIHRkbHMgcGVlciBkaXNjb25uZWN0ZWQgZHVlIHdyb25nIFBUUiBmb3JtYXQgKi8KKwlXTUlfVERMU19URUFSRE9XTl9SRUFTT05fQkFEX1BUUiwKKwkvKiogdGRscyBwZWVyIG5vdCByZXNwb25kaW5nICovCisJV01JX1RETFNfVEVBUkRPV05fUkVBU09OX05PX1JFU1BPTlNFLAorfTsKKworLyogV01JX1RETFNfUEVFUl9FVkVOVElEICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV90ZGxzX3BlZXJfZXZlbnRfZml4ZWRfcGFyYW0gICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogcGVlciBNQUMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIFRETFMgcGVlciBzdGF0dXMgKHdtaV90ZGxzX3BlZXJfbm90aWZpY2F0aW9uKSovCisJQV9VSU5UMzIgcGVlcl9zdGF0dXM7CisJLyoqIFRETFMgcGVlciByZWFzb24gKHdtaV90ZGxzX3BlZXJfcmVhc29uKSAqLworCUFfVUlOVDMyIHBlZXJfcmVhc29uOworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworfSB3bWlfdGRsc19wZWVyX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiBOT1RFOiB3bWlfdmRldl9tY2NfYmNuX2ludHZsX2NoYW5nZV9ldmVudF9maXhlZF9wYXJhbSB3b3VsZCBiZSBkZXByZWNhdGVkLiBQbGVhc2UKKyAgIGRvbid0IHVzZSB0aGlzIGZvciBhbnkgbmV3IGltcGxlbWVudGF0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfbWNjX2Jjbl9pbnR2bF9jaGFuZ2VfZXZlbnRfZml4ZWRfcGFyYW0gICovCisJLyoqIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qIE5ldyBiZWFjb24gaW50ZXJ2YWwgdG8gYmUgdXNlZCBmb3IgdGhlIHNwZWNpZmllZCBWREVWIHN1Z2dlc3RlZCBieSBmaXJtd2FyZSAqLworCUFfVUlOVDMyIG5ld19iY25faW50dmw7Cit9IHdtaV92ZGV2X21jY19iY25faW50dmxfY2hhbmdlX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiBXTUlfUkVTTUdSX0FEQVBUSVZFX09DU19FTkFCTEVfRElTQUJMRV9DTURJRCAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcmVzbWdyX2FkYXB0aXZlX29jc19lbmFibGVfZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiAxOiBlbmFibGUgZncgYmFzZWQgYWRhcHRpdmUgb2NzLAorCSAqICAwOiBkaXNhYmxlIGZ3IGJhc2VkIGFkYXB0aXZlIG9jcworCSAqLworCUFfVUlOVDMyIGVuYWJsZTsKKwkvKiogVGhpcyBmaWVsZCBjb250YWlucyB0aGUgTUFDIGlkZW50aWZpZXIgaW4gb3JkZXIgdG8gbG9va3VwIHRoZSBhcHByb3ByaWF0ZSBPQ1MgaW5zdGFuY2UuICovCisJLyoqIFRoZSB2YWxpZCByYW5nZSBpcyAwIHRvIChudW1fbWFjcy0xKS4gKi8KKwlBX1VJTlQzMiBtYWNfaWQ7Cit9IHdtaV9yZXNtZ3JfYWRhcHRpdmVfb2NzX2VuYWJsZV9kaXNhYmxlX2NtZF9maXhlZF9wYXJhbTsKKworLyogV01JX1JFU01HUl9TRVRfQ0hBTl9USU1FX1FVT1RBX0NNRElEICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyogRnJlcXVlbmN5IG9mIHRoZSBjaGFubmVsIGZvciB3aGljaCB0aGUgcXVvdGEgaXMgc2V0ICovCisJQV9VSU5UMzIgY2hhbl9taHo7CisJLyogUmVxdWVzdGVkIGNoYW5uZWwgdGltZSBxdW90YSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSAqLworCUFfVUlOVDMyIGNoYW5uZWxfdGltZV9xdW90YTsKK30gd21pX3Jlc21ncl9jaGFuX3RpbWVfcXVvdGE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3Jlc21ncl9zZXRfY2hhbl90aW1lX3F1b3RhX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIG51bWJlciBvZiBjaGFubmVsIHRpbWUgcXVvdGEgY29tbWFuZCBzdHJ1Y3R1cmVzCisJICogKHdtaV9yZXNtZ3JfY2hhbl90aW1lX3F1b3RhKSAxIG9yIDIKKwkgKi8KKwlBX1VJTlQzMiBudW1fY2hhbnM7CisvKiBUaGlzIFRMViBpcyBmb2xsb3dlZCBieSBhbm90aGVyIFRMViBvZiBhcnJheSBvZiBieXRlcworICogQV9VSU5UOCBkYXRhW107CisgKiBUaGlzIGRhdGEgYXJyYXkgY29udGFpbnMKKyAqIG51bV9jaGFucyAqIHNpemUgb2Yoc3RydWN0IHdtaV9yZXNtZ3JfY2hhbl90aW1lX3F1b3RhKQorICovCit9IHdtaV9yZXNtZ3Jfc2V0X2NoYW5fdGltZV9xdW90YV9jbWRfZml4ZWRfcGFyYW07CisKKy8qIFdNSV9SRVNNR1JfU0VUX0NIQU5fTEFURU5DWV9DTURJRCAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIEZyZXF1ZW5jeSBvZiB0aGUgY2hhbm5lbCBmb3Igd2hpY2ggdGhlIGxhdGVuY3kgaXMgc2V0ICovCisJQV9VSU5UMzIgY2hhbl9taHo7CisJLyogUmVxdWVzdGVkIGNoYW5uZWwgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgKi8KKwlBX1VJTlQzMiBsYXRlbmN5OworfSB3bWlfcmVzbWdyX2NoYW5fbGF0ZW5jeTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcmVzbWdyX3NldF9jaGFuX2xhdGVuY3lfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogbnVtYmVyIG9mIGNoYW5uZWwgbGF0ZW5jeSBjb21tYW5kIHN0cnVjdHVyZXMKKwkgKiAod21pX3Jlc21ncl9jaGFuX2xhdGVuY3kpIDEgb3IgMgorCSAqLworCUFfVUlOVDMyIG51bV9jaGFuczsKKy8qIFRoaXMgVExWIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgVExWIG9mIGFycmF5IG9mIGJ5dGVzCisgKiBBX1VJTlQ4IGRhdGFbXTsKKyAqIFRoaXMgZGF0YSBhcnJheSBjb250YWlucworICogbnVtX2NoYW5zICogc2l6ZSBvZihzdHJ1Y3Qgd21pX3Jlc21ncl9jaGFuX2xhdGVuY3kpCisgKi8KK30gd21pX3Jlc21ncl9zZXRfY2hhbl9sYXRlbmN5X2NtZF9maXhlZF9wYXJhbTsKKworLyogV01JX1NUQV9TTVBTX0ZPUkNFX01PREVfQ01ESUQgKi8KKworLyoqIFNUQSBTTVBTIEZvcmNlZCBNb2RlICovCit0eXBlZGVmIGVudW0geworCVdNSV9TTVBTX0ZPUkNFRF9NT0RFX05PTkUgPSAwLAorCVdNSV9TTVBTX0ZPUkNFRF9NT0RFX0RJU0FCTEVELAorCVdNSV9TTVBTX0ZPUkNFRF9NT0RFX1NUQVRJQywKKwlXTUlfU01QU19GT1JDRURfTU9ERV9EWU5BTUlDCit9IHdtaV9zdGFfc21wc19mb3JjZWRfbW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiAgV01JVExWX1RBR19TVFJVQ193bWlfc3RhX3NtcHNfZm9yY2VfbW9kZV9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBVbmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBUaGUgbW9kZSBvZiBTTVBTIHRoYXQgaXMgdG8gYmUgZm9yY2VkIGluIHRoZSBGVy4gKi8KKwlBX1VJTlQzMiBmb3JjZWRfbW9kZTsKK30gd21pX3N0YV9zbXBzX2ZvcmNlX21vZGVfY21kX2ZpeGVkX3BhcmFtOworCisvKiogd2xhbiBIQiBjb21tYW5kcyAqLworI2RlZmluZSBXTUlfV0xBTl9IQl9JVEVNX1VEUCAgICAgICAgICAgIDB4MQorI2RlZmluZSBXTUlfV0xBTl9IQl9JVEVNX1RDUCAgICAgICAgICAgIDB4MgorI2RlZmluZSBXTUlfV0xBTl9IQl9NQVhfRklMVEVSX1NJWkUgICAgIDMyICAgICAgLyogc2hvdWxkIGJlIGVxdWFsIHRvIFdMQU5fSEJfTUFYX0ZJTFRFUl9TSVpFLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBieXRlcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9oYl9zZXRfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBlbmFibGU7CisJQV9VSU5UMzIgaXRlbTsKKwlBX1VJTlQzMiBzZXNzaW9uOworfSB3bWlfaGJfc2V0X2VuYWJsZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogIFdNSVRMVl9UQUdfU1RSVUNfd21pX2hiX3NldF90Y3BfcGFyYW1zX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBzcnZfaXA7CisJQV9VSU5UMzIgZGV2X2lwOworCUFfVUlOVDMyIHNlcTsKKwlBX1VJTlQzMiBzcmNfcG9ydDsKKwlBX1VJTlQzMiBkc3RfcG9ydDsKKwlBX1VJTlQzMiBpbnRlcnZhbDsKKwlBX1VJTlQzMiB0aW1lb3V0OworCUFfVUlOVDMyIHNlc3Npb247CisJd21pX21hY19hZGRyIGdhdGV3YXlfbWFjOworfSB3bWlfaGJfc2V0X3RjcF9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9oYl9zZXRfdGNwX3BrdF9maWx0ZXJfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGxlbmd0aDsKKwlBX1VJTlQzMiBvZmZzZXQ7CisJQV9VSU5UMzIgc2Vzc2lvbjsKKwlBX1VJTlQ4IGZpbHRlcltXTUlfV0xBTl9IQl9NQVhfRklMVEVSX1NJWkVdOworfSB3bWlfaGJfc2V0X3RjcF9wa3RfZmlsdGVyX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiAgV01JVExWX1RBR19TVFJVQ193bWlfaGJfc2V0X3VkcF9wYXJhbXNfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIHNydl9pcDsKKwlBX1VJTlQzMiBkZXZfaXA7CisJQV9VSU5UMzIgc3JjX3BvcnQ7CisJQV9VSU5UMzIgZHN0X3BvcnQ7CisJQV9VSU5UMzIgaW50ZXJ2YWw7CisJQV9VSU5UMzIgdGltZW91dDsKKwlBX1VJTlQzMiBzZXNzaW9uOworCXdtaV9tYWNfYWRkciBnYXRld2F5X21hYzsKK30gd21pX2hiX3NldF91ZHBfcGFyYW1zX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiAgV01JVExWX1RBR19TVFJVQ193bWlfaGJfc2V0X3VkcF9wa3RfZmlsdGVyX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBsZW5ndGg7CisJQV9VSU5UMzIgb2Zmc2V0OworCUFfVUlOVDMyIHNlc3Npb247CisJQV9VSU5UOCBmaWx0ZXJbV01JX1dMQU5fSEJfTUFYX0ZJTFRFUl9TSVpFXTsKK30gd21pX2hiX3NldF91ZHBfcGt0X2ZpbHRlcl9jbWRfZml4ZWRfcGFyYW07CisKKy8qKiB3bGFuIEhCIGV2ZW50cyAqLwordHlwZWRlZiBlbnVtIHsKKwlXTUlfV0xBTl9IQl9SRUFTT05fVU5LTk9XTiA9IDAsCisJV01JX1dMQU5fSEJfUkVBU09OX1RDUF9USU1FT1VUID0gMSwKKwlXTUlfV0xBTl9IQl9SRUFTT05fVURQX1RJTUVPVVQgPSAyLAorfSBXTUlfSEJfV0FLRVVQX1JFQVNPTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2hiX2luZF9ldmVudF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7ICAgICAgICAgICAgICAgLyogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWICovCisJQV9VSU5UMzIgc2Vzc2lvbjsgICAgICAgICAgICAgICAvKiBTZXNzaW9uIElEIGZyb20gZHJpdmVyICovCisJQV9VSU5UMzIgcmVhc29uOyAgICAgICAgICAgICAgICAvKiB3YWtldXAgcmVhc29uICovCit9IHdtaV9oYl9pbmRfZXZlbnRfZml4ZWRfcGFyYW07CisKKy8qKiBXTUlfU1RBX1NNUFNfUEFSQU1fQ01ESUQgKi8KK3R5cGVkZWYgZW51bSB7CisJLyoqIFJTU0kgdGhyZXNob2xkIHRvIGVudGVyIER5bmFtaWMgU01QUyBtb2RlIGZyb20gaW5hY3RpdmUgbW9kZSAqLworCVdNSV9TVEFfU01QU19QQVJBTV9VUFBFUl9SU1NJX1RIUkVTSCA9IDAsCisJLyoqIFJTU0kgdGhyZXNob2xkIHRvIGVudGVyIFN0YWxsZWQtRC1TTVBTIG1vZGUgZnJvbSBELVNNUFMgbW9kZSBvcgorCSAqIHRvIGVudGVyIEQtU01QUyBtb2RlIGZyb20gU3RhbGxlZC1ELVNNUFMgbW9kZSAqLworCVdNSV9TVEFfU01QU19QQVJBTV9TVEFMTF9SU1NJX1RIUkVTSCA9IDEsCisJLyoqIFJTU0kgdGhyZXNob2xkIHRvIGRpc2FibGUgU01QUyBtb2RlcyAqLworCVdNSV9TVEFfU01QU19QQVJBTV9MT1dFUl9SU1NJX1RIUkVTSCA9IDIsCisJLyoqIFVwcGVyIHRocmVzaG9sZCBmb3IgYmVhY29uLVJTU0kuIFVzZWQgdG8gcmVkdWNlIFJYIGNoYWlubWFzay4gKi8KKwlXTUlfU1RBX1NNUFNfUEFSQU1fVVBQRVJfQlJTU0lfVEhSRVNIID0gMywKKwkvKiogTG93ZXIgdGhyZXNob2xkIGZvciBiZWFjb24tUlNTSS4gVXNlZCB0byBpbmNyZWFzZSBSWCBjaGFpbm1hc2suICovCisJV01JX1NUQV9TTVBTX1BBUkFNX0xPV0VSX0JSU1NJX1RIUkVTSCA9IDQsCisJLyoqIEVuYWJsZS9EaXNhYmxlIERUSU0gMWNoUnggZmVhdHVyZSAqLworCVdNSV9TVEFfU01QU19QQVJBTV9EVElNXzFDSFJYX0VOQUJMRSA9IDUKK30gd21pX3N0YV9zbXBzX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFfc21wc19wYXJhbV9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBVbmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBTTVBTIHBhcmFtZXRlciAoc2VlIHdtaV9zdGFfc21wc19wYXJhbSkgKi8KKwlBX1VJTlQzMiBwYXJhbTsKKwkvKiogVmFsdWUgb2YgU01QUyBwYXJhbWV0ZXIgKi8KKwlBX1VJTlQzMiB2YWx1ZTsKK30gd21pX3N0YV9zbXBzX3BhcmFtX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tY2Nfc2NoZWRfc3RhX3RyYWZmaWNfc3RhdHMgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qIFRYIHN0YXRzICovCisJQV9VSU5UMzIgdHhCeXRlc1B1c2hlZDsKKwlBX1VJTlQzMiB0eFBhY2tldHNQdXNoZWQ7CisJLyogUlggc3RhdHMgKi8KKwlBX1VJTlQzMiByeEJ5dGVzUmN2ZDsKKwlBX1VJTlQzMiByeFBhY2tldHNSY3ZkOworCUFfVUlOVDMyIHJ4VGltZVRvdGFsOworCS8qKiBwZWVyIE1BQyBhZGRyZXNzICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKK30gd21pX21jY19zY2hlZF9zdGFfdHJhZmZpY19zdGF0czsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tY2Nfc2NoZWRfdHJhZmZpY19zdGF0c19jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBEdXJhdGlvbiBvdmVyIHdoaWNoIHRoZSBob3N0IHN0YXRzIHdlcmUgY29sbGVjdGVkICovCisJQV9VSU5UMzIgZHVyYXRpb247CisJLyoqIE51bWJlciBvZiBzdGF0aW9ucyBmaWxsZWQgaW4gZm9sbG93aW5nIHN0YXRzIGFycmF5ICovCisJQV9VSU5UMzIgbnVtX3N0YTsKKwkvKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3QgYXJlIHRoZSBUTFZzOgorCSAqIHdtaV9tY2Nfc2NoZWRfc3RhX3RyYWZmaWNfc3RhdHMgbWNjX3NjaGVkX3N0YV90cmFmZmljX3N0YXRzX2xpc3Q7CisJICovCit9IHdtaV9tY2Nfc2NoZWRfdHJhZmZpY19zdGF0c19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyAgV01JVExWX1RBR19TVFJVQ193bWlfYmF0Y2hfc2Nhbl9lbmFibGVfY21kX2ZpeGVkX3BhcmFtICovCisJLyogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLypCYXRjaCBzY2FuIGVuYWJsZSBjb21tYW5kIHBhcmFtZXRlcnMgKi8KKwlBX1VJTlQzMiBzY2FuSW50ZXJ2YWw7CisJQV9VSU5UMzIgbnVtU2NhbjJCYXRjaDsKKwlBX1VJTlQzMiBiZXN0TmV0d29ya3M7CisJQV9VSU5UMzIgcmZCYW5kOworCUFfVUlOVDMyIHJ0dDsKK30gd21pX2JhdGNoX3NjYW5fZW5hYmxlX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2JhdGNoX3NjYW5fZW5hYmxlZF9ldmVudF9maXhlZF9wYXJhbSAgKi8KKwlBX1VJTlQzMiBzdXBwb3J0ZWRNc2NhbjsKK30gd21pX2JhdGNoX3NjYW5fZW5hYmxlZF9ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9iYXRjaF9zY2FuX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtICovCisvKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYsIGdlbmVyYXRlZCBieSB0aGUgY2FsbGVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBwYXJhbTsKK30gd21pX2JhdGNoX3NjYW5fZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyAgV01JVExWX1RBR19TVFJVQ193bWlfYmF0Y2hfc2Nhbl90cmlnZ2VyX3Jlc3VsdF9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgcGFyYW07Cit9IHdtaV9iYXRjaF9zY2FuX3RyaWdnZXJfcmVzdWx0X2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJd21pX21hY19hZGRyIGJzc2lkOyAgICAgICAgICAgICAvKiBCU1NJRCAqLworCXdtaV9zc2lkIHNzaWQ7ICAgICAgICAgIC8qIFNTSUQgKi8KKwlBX1VJTlQzMiBjaDsgICAgICAgICAgICAvKiBDaGFubmVsICovCisJQV9VSU5UMzIgcnNzaTsgICAgICAgICAgLyogUlNTSSBvciBMZXZlbCAqLworCS8qIFRpbWVzdGFtcCB3aGVuIE5ldHdvcmsgd2FzIGZvdW5kLiBVc2VkIHRvIGNhbGN1bGF0ZSBhZ2UgYmFzZWQgb24gdGltZXN0YW1wIGluIEdFVF9SU1AgbXNnIGhlYWRlciAqLworCUFfVUlOVDMyIHRpbWVzdGFtcDsKK30gd21pX2JhdGNoX3NjYW5fcmVzdWx0X25ldHdvcmtfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgc2NhbklkOyAgICAgICAgICAgICAgICAvKiBTY2FuIExpc3QgSUQuICovCisJLyogTm8gb2YgQVAgaW4gYSBTY2FuIFJlc3VsdC4gU2hvdWxkIGJlIHNhbWUgYXMgYmVzdE5ldHdvcmsgaW4gU0VUX1JFUSBtc2cgKi8KKwlBX1VJTlQzMiBudW1OZXR3b3Jrc0luU2Nhbkxpc3Q7CisJQV9VSU5UMzIgbmV0V29ya1N0YXJ0SW5kZXg7ICAgICAgICAgICAgIC8qIGluZGljYXRlIHRoZSBzdGFydCBpbmRleCBvZiBuZXR3b3JrIGluZm8gKi8KK30gd21pX2JhdGNoX3NjYW5fcmVzdWx0X3NjYW5fbGlzdDsKKworI2RlZmluZSBMUElfSUVfQklUTUFQX0JTU0lEICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgLyogaWYgdGhpcyBiaXQgaXMgc2V0LCBic3NpZCBvZiB0aGUgc2NhbiByZXNwb25zZSBmcmFtZSBpcyBzZW50IGFzIHRoZSBmaXJzdCBJRSBpbiB0aGUgZGF0YSBidWZmZXIgc2VudCB0byBMT1dJIExQLiovCisjZGVmaW5lIExQSV9JRV9CSVRNQVBfSVNfUFJPQkUgICAgICAgICAgICAgICAweDAwMDAwMDAyICAgICAvKnNlbmQgdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBzY2FuIHJlc3BvbnNlIGZyYW1lIGJlaW5nIGEgUHJvYmUgUnNwIG9yIG5vdCovCisjZGVmaW5lIExQSV9JRV9CSVRNQVBfU1NJRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAgICAvKnNlbmQgc3NpZCBmcm9tIHJlY2VpdmVkIHNjYW4gcmVzcG9uc2UgZnJhbWUqLworI2RlZmluZSBMUElfSUVfQklUTUFQX1JTU0kgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAgLyogZW5kIFJTU0kgdmFsdWUgcmVwb3J0ZWQgYnkgSFcgZm9yIHRoZSByZWNlaXZlZCBzY2FuIHJlc3BvbnNlIGFmdGVyIGFkanVzdGluZyB3aXRoIG5vaXNlIGZsb29yKi8KKyNkZWZpbmUgTFBJX0lFX0JJVE1BUF9DSEFOICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgICAgIC8qc2VuZCBjaGFubmVsIG51bWJlciBmcm9tIHRoZSByZWNlaXZlZCBzY2FuIHJlc3BvbnNlKi8KKyNkZWZpbmUgTFBJX0lFX0JJVE1BUF9BUF9UWF9QV1IgICAgICAgICAgICAgIDB4MDAwMDAwMjAgICAgIC8qIHNlbiBUeCBwb3dlciBmcm9tIFRQQyBJRSBvZiBzY2FuIHJzcCovCisjZGVmaW5lIExQSV9JRV9CSVRNQVBfVFhfUkFURSAgICAgICAgICAgICAgICAweDAwMDAwMDQwICAgICAvKnNlbmQgcmF0ZSBvZiB0aGUgcmVjZWl2ZWQgZnJhbWUgYXMgcmVwb3J0ZWQgYnkgSFcuKi8KKyNkZWZpbmUgTFBJX0lFX0JJVE1BUF84MDIxMV9NQ19TVVBQT1JUICAgICAgIDB4MDAwMDAwODAgICAgIC8qc2VuZCB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBzY2FuIHJzcCB3YXMgZnJvbSBhIDExbWMgc3VwcG9ydGVkIEFQIG9yIG5vdC4qLworI2RlZmluZSBMUElfSUVfQklUTUFQX1RTRl9USU1FUl9WQUxVRSAgICAgICAgMHgwMDAwMDEwMCAgICAgLypzZW5kIHRpbWVzdGFtcCByZXBvcnRlZCBpbiB0aGUgcmVjZWl2ZWQgc2NhbiByc3AgZnJhbWUuKi8KKyNkZWZpbmUgTFBJX0lFX0JJVE1BUF9BR0VfT0ZfTUVBU1VSRU1FTlQgICAgIDB4MDAwMDAyMDAgICAgIC8qIGN1cnJlbnQgc3lzdGVtIHRpbWUgLSByZWNlaXZlZCB0aW1lKSA9IGR1cmF0aW9uIG9mIHRpbWUgc2NhbiByc3AgZnJhbWUgZGF0YSBpcyBrZXB0IGluIHRoZSBidWZmZXIgYmVmb3JlIHNlbmRpbmcgdG8gTE9XSSBMUC4qLworLyoKKyAqIFRFTVBPUkFSWSBhbGlhcyBvZiBpbmNvcnJlY3Qgb2xkIG5hbWUgdGhlIGNvcnJlY3QgbmFtZS4KKyAqIFRoaXMgYWxpYXMgd2lsbCBiZSByZW1vdmVkIG9uY2UgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIG9sZCBuYW1lIGhhdmUgYmVlbiBmaXhlZC4KKyAqLworI2RlZmluZSBMUElfSUVfQklUTUFQX0FHRV9PRl9NRVNBVVJFTUVOVCBMUElfSUVfQklUTUFQX0FHRV9PRl9NRUFTVVJFTUVOVAorI2RlZmluZSBMUElfSUVfQklUTUFQX0NPTk5fU1RBVFVTICAgICAgICAgICAgMHgwMDAwMDQwMCAgICAgLyogSWYgYW4gaW5mcmEgU1RBIGlzIGFjdGl2ZSBhbmQgY29ubmVjdGVkIHRvIGFuIEFQLCB0cnVlIHZhbHVlIGlzIHNlbnQgZWxzZSBmYWxzZS4qLworI2RlZmluZSBMUElfSUVfQklUTUFQX01TQVBfSUUgICAgICAgICAgICAgICAgMHgwMDAwMDgwMCAgICAgLyogaW5mbyBvbiB0aGUgdmVuZG9yIHNwZWNpZmljIHByb3ByaWV0YXJ5IElFIE1TQVAqLworI2RlZmluZSBMUElfSUVfQklUTUFQX1NFQ19TVEFUVVMgICAgICAgICAgICAgMHgwMDAwMTAwMCAgICAgLyogd2UgaW5kaWNhdGUgdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgQVAgaGFzIFdQQSBvciBSU04gc2VjdXJpdHkgZW5hYmxlZCovCisjZGVmaW5lIExQSV9JRV9CSVRNQVBfREVWSUNFX1RZUEUgICAgICAgICAgICAweDAwMDAyMDAwICAgICAvKiBpbmZvIGFib3V0IHRoZSBiZWFjb25zIGNvbWluZyBmcm9tIGFuIEFQIG9yIFAyUCBvciBOQU4gZGV2aWNlLiovCisjZGVmaW5lIExQSV9JRV9CSVRNQVBfQ0hBTl9JU19QQVNTSVZFICAgICAgICAweDAwMDA0MDAwICAgICAvKiBpbmZvIG9uIHdoZXRoZXIgdGhlIHNjYW4gcnNwIHdhcyByZWNlaXZlZCBmcm9tIGEgcGFzc2l2ZSBjaGFubmVsKi8KKyNkZWZpbmUgTFBJX0lFX0JJVE1BUF9EV0VMTF9USU1FICAgICAgICAgICAgIDB4MDAwMDgwMDAgICAgIC8qIHNlbmQgdGhlIHNjYW4gZHdlbGwgdGltZSBvZiB0aGUgY2hhbm5lbCBvbiB3aGljaCB0aGUgY3VycmVudCBzY2FuIHJzcCBmcmFtZSB3YXMgcmVjZWl2ZWQuKi8KKyNkZWZpbmUgTFBJX0lFX0JJVE1BUF9CQU5EX0NFTlRFUl9GUkVRMSAgICAgIDB4MDAwMTAwMDAgICAgIC8qIHRoZSBjZW50ZXIgZnJlcXVlbmNpZXMgaW4gY2FzZSBBUCBpcyBzdXBwb3J0aW5nIHdpZGVyIGNoYW5uZWxzIHRoYW4gMjAgTUh6Ki8KKyNkZWZpbmUgTFBJX0lFX0JJVE1BUF9CQU5EX0NFTlRFUl9GUkVRMiAgICAgIDB4MDAwMjAwMDAgICAgIC8qIHNhbWUgYXMgYWJvdmUqLworI2RlZmluZSBMUElfSUVfQklUTUFQX1BIWV9NT0RFICAgICAgICAgICAgICAgMHgwMDA0MDAwMCAgICAgLyogUEhZIG1vZGUgaW5kaWNhdGVzIGEsIGIsICxnLCBhYyBhbmQgb3RoZXIgY29tYmluYXRpb25zKi8KKyNkZWZpbmUgTFBJX0lFX0JJVE1BUF9TQ0FOX01PRFVMRV9JRCAgICAgICAgIDB4MDAwODAwMDAgICAgIC8qIHNjYW4gbW9kdWxlIGlkIGluZGljYXRlcyB0aGUgc2NhbiBjbGllbnQgd2hvIG9yaWdpbmF0ZWQgdGhlIHNjYW4qLworI2RlZmluZSBMUElfSUVfQklUTUFQX1NDQU5fSUQgICAgICAgICAgICAgICAgMHgwMDEwMDAwMCAgICAgLypleHRzY2FuIGluc2VydHMgdGhlIHNjYW4gY3ljbGUgY291bnQgZm9yIHRoaXMgdmFsdWU7IG90aGVyIHNjYW4gY2xpZW50cyBjYW4gaW5zZXJ0IHRoZSBzY2FuIGlkIG9mIHRoZSBzY2FuLCBpZiBuZWVkZWQuKi8KKyNkZWZpbmUgTFBJX0lFX0JJVE1BUF9GTEFHUyAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAgICAgIC8qIHJlc2VydmVkIGFzIGEgYml0bWFwIHRvIGluZGljYXRlIG1vcmUgc2NhbiBpbmZvcm1hdGlvbjsgb25lIHN1Y2ggdXNlIGJlaW5nIHRvIGluZGljYXRlIGlmIHRoZSBvbi1nb2luZyBzY2FuIGlzIGludGVycnVwdGVkIG9yIG5vdCovCisjZGVmaW5lIExQSV9JRV9CSVRNQVBfQ0FDSElOR19SRVFEICAgICAgICAgICAweDAwNDAwMDAwICAgICAvKmV4dHNjYW4gd2lsbCB1c2UgdGhpcyBmaWVsZCB0byBpbmRpY2F0ZSBpZiB0aGlzIGZyYW1lIGluZm8gbmVlZHMgdG8gYmUgY2FjaGVkIGluIExPV0kgTFAgb3Igbm90Ki8KKyNkZWZpbmUgTFBJX0lFX0JJVE1BUF9BTEwgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqQV9CT09MIGluZGljYXRlcyBMUEkgbWdtdCBzbm9vcGluZyBlbmFibGUvZGlzYWJsZSovCisJQV9VSU5UMzIgZW5hYmxlOworCS8qKkxQSSBzbm9vcGluZyBtb2RlKi8KKwlBX1VJTlQzMiBzbm9vcGluZ19tb2RlOworCS8qKiBMUEkgaW50ZXJlc3RlZCBJRXMgaW4gc25vb3BpbmcgY29udGV4dCAqLworCUFfVUlOVDMyIGllX2JpdG1hcDsKK30gd21pX2xwaV9tZ210X3Nub29waW5nX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdGFydF9zY2FuX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiBTY2FuIElEICovCisJQV9VSU5UMzIgc2Nhbl9pZDsKKwkvKiogU2NhbiByZXF1ZXN0b3IgSUQgKi8KKwlBX1VJTlQzMiBzY2FuX3JlcV9pZDsKKwkvKiogVkRFViBpZChpbnRlcmZhY2UpIHRoYXQgaXMgcmVxdWVzdGluZyBzY2FuICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogTFBJIGludGVyZXN0ZWQgSUVzIGluIHNjYW4gY29udGV4dCAqLworCUFfVUlOVDMyIGllX2JpdG1hcDsKKwkvKiogU2NhbiBQcmlvcml0eSwgaW5wdXQgdG8gc2NhbiBzY2hlZHVsZXIgKi8KKwlBX1VJTlQzMiBzY2FuX3ByaW9yaXR5OworCS8qKiBkd2VsbCB0aW1lIGluIG1zZWMgb24gYWN0aXZlIGNoYW5uZWxzICovCisJQV9VSU5UMzIgZHdlbGxfdGltZV9hY3RpdmU7CisJLyoqIGR3ZWxsIHRpbWUgaW4gbXNlYyBvbiBwYXNzaXZlIGNoYW5uZWxzICovCisJQV9VSU5UMzIgZHdlbGxfdGltZV9wYXNzaXZlOworCS8qKiBtaW4gdGltZSBpbiBtc2VjIG9uIHRoZSBCU1MgY2hhbm5lbCxvbmx5IHZhbGlkIGlmIGF0bGVhc3Qgb25lIFZERVYgaXMgYWN0aXZlKi8KKwlBX1VJTlQzMiBtaW5fcmVzdF90aW1lOworCS8qKiBtYXggcmVzdCB0aW1lIGluIG1zZWMgb24gdGhlIEJTUyBjaGFubmVsLG9ubHkgdmFsaWQgaWYgYXQgbGVhc3Qgb25lIFZERVYgaXMgYWN0aXZlKi8KKwkvKiogdGhlIHNjYW5uZXIgd2lsbCByZXN0IG9uIHRoZSBic3MgY2hhbm5lbCBhdCBsZWFzdCBtaW5fcmVzdF90aW1lLiBhZnRlciBtaW5fcmVzdF90aW1lIHRoZSBzY2FubmVyCisJICogIHdpbGwgc3RhcnQgY2hlY2tpbmcgZm9yIHR4L3J4IGFjdGl2aXR5IG9uIGFsbCBWREVWcy4gaWYgdGhlcmUgaXMgbm8gYWN0aXZpdHkgdGhlIHNjYW5uZXIgd2lsbAorCSAqICBzd2l0Y2ggdG8gb2ZmIGNoYW5uZWwuIGlmIHRoZXJlIGlzIGFjdGl2aXR5IHRoZSBzY2FubmVyIHdpbGwgbGV0IHRoZSByYWRpbyBvbiB0aGUgYnNzIGNoYW5uZWwKKwkgKiAgdW50aWwgbWF4X3Jlc3RfdGltZSBleHBpcmVzLmF0IG1heF9yZXN0X3RpbWUgc2Nhbm5lciB3aWxsIHN3aXRjaCB0byBvZmYgY2hhbm5lbAorCSAqICBpcnJlc3BlY3RpdmUgb2YgYWN0aXZpdHkuIGFjdGl2aXR5IGlzIGRldGVybWluZWQgYnkgdGhlIGlkbGVfdGltZSBwYXJhbWV0ZXIuCisJICovCisJQV9VSU5UMzIgbWF4X3Jlc3RfdGltZTsKKwkvKiogdGltZSBiZWZvcmUgc2VuZGluZyBuZXh0IHNldCBvZiBwcm9iZSByZXF1ZXN0cy4KKwkgKiAgIFRoZSBzY2FubmVyIGtlZXBzIHJlcGVhdGluZyBwcm9iZSByZXF1ZXN0cyB0cmFuc21pc3Npb24gd2l0aCBwZXJpb2Qgc3BlY2lmaWVkIGJ5IHJlcGVhdF9wcm9iZV90aW1lLgorCSAqICAgVGhlIG51bWJlciBvZiBwcm9iZSByZXF1ZXN0cyBzcGVjaWZpZWQgZGVwZW5kcyBvbiB0aGUgc3NpZF9saXN0IGFuZCBic3NpZF9saXN0CisJICovCisJQV9VSU5UMzIgcmVwZWF0X3Byb2JlX3RpbWU7CisJLyoqIHRpbWUgaW4gbXNlYyBiZXR3ZWVuIDIgY29uc2VxdWV0aXZlIHByb2JlIHJlcXVlc3RzIHdpdGggaW4gYSBzZXQuICovCisJQV9VSU5UMzIgcHJvYmVfc3BhY2luZ190aW1lOworCS8qKiBkYXRhIGluYWN0aXZpdHkgdGltZSBpbiBtc2VjIG9uIGJzcyBjaGFubmVsIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHNjYW5uZXIgZm9yIG1lYXN1cmluZyB0aGUgaW5hY3Rpdml0eSAgKi8KKwlBX1VJTlQzMiBpZGxlX3RpbWU7CisJLyoqIG1heGltdW0gdGltZSBpbiBtc2VjIGFsbG93ZWQgZm9yIHNjYW4gICovCisJQV9VSU5UMzIgbWF4X3NjYW5fdGltZTsKKwkvKiogZGVsYXkgaW4gbXNlYyBiZWZvcmUgc2VuZGluZyBmaXJzdCBwcm9iZSByZXF1ZXN0IGFmdGVyIHN3aXRjaGluZyB0byBhIGNoYW5uZWwgKi8KKwlBX1VJTlQzMiBwcm9iZV9kZWxheTsKKwkvKiogU2NhbiBjb250cm9sIGZsYWdzICovCisJQV9VSU5UMzIgc2Nhbl9jdHJsX2ZsYWdzOworCS8qKiBCdXJzdCBkdXJhdGlvbiB0aW1lIGluIG1zZWMqLworCUFfVUlOVDMyIGJ1cnN0X2R1cmF0aW9uOworCisJLyoqICMgaWYgY2hhbm5lbHMgdG8gc2Nhbi4gSW4gdGhlIFRMViBjaGFubmVsX2xpc3RbXSAqLworCUFfVUlOVDMyIG51bV9jaGFuOworCS8qKiBudW1iZXIgb2YgYnNzaWRzLiBJbiB0aGUgVExWIGJzc2lkX2xpc3RbXSAqLworCUFfVUlOVDMyIG51bV9ic3NpZDsKKwkvKiogbnVtYmVyIG9mIHNzaWQuIEluIHRoZSBUTFYgc3NpZF9saXN0W10gKi8KKwlBX1VJTlQzMiBudW1fc3NpZHM7CisJLyoqIG51bWJlciBvZiBieXRlcyBpbiBpZSBkYXRhLiBJbiB0aGUgVExWIGllX2RhdGFbXSAqLworCUFfVUlOVDMyIGllX2xlbjsKKworLyoqCisgKiBUTFYgKHRhZyBsZW5ndGggdmFsdWUgKSBwYXJhbWV0ZXJzIGZvbGxvdyB0aGUgc2Nhbl9jbWQKKyAqIHN0cnVjdHVyZS4gVGhlIFRMVidzIGFyZToKKyAqICAgICBBX1VJTlQzMiBjaGFubmVsX2xpc3RbXTsKKyAqICAgICB3bWlfc3NpZCBzc2lkX2xpc3RbXTsKKyAqICAgICB3bWlfbWFjX2FkZHIgYnNzaWRfbGlzdFtdOworICogICAgIEFfVUlOVDggaWVfZGF0YVtdOworICovCit9IHdtaV9scGlfc3RhcnRfc2Nhbl9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zdG9wX3NjYW5fY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIFNjYW4gcmVxdWVzdG9yIElEICovCisJQV9VSU5UMzIgc2Nhbl9yZXFfaWQ7CisJLyoqIFNjYW4gSUQgKi8KKwlBX1VJTlQzMiBzY2FuX2lkOworCS8qKgorCSAqIFJlcSBUeXBlCisJICogcmVxX3R5cGUgc2hvdWxkIGJlIFdNSV9TQ0FOX1NUT1BfT05FLCBXTUlfU0NOX1NUT1BfVkFQX0FMTCBvciBXTUlfU0NBTl9TVE9QX0FMTAorCSAqIFdNSV9TQ0FOX1NUT1BfT05FIGluZGljYXRlcyB0byBzdG9wIGEgc3BlY2lmaWMgc2NhbiB3aXRoIHNjYW5faWQKKwkgKiBXTUlfU0NOX1NUT1BfVkFQX0FMTCBpbmRpY2F0ZXMgdG8gc3RvcCBhbGwgc2NhbiByZXF1ZXN0cyBvbiBhIHNwZWNpZmljIHZEZXYgd2l0aCB2ZGV2X2lkCisJICogV01JX1NDQU5fU1RPUF9BTEwgaW5kaWNhdGVzIHRvIHN0b3AgYWxsIHNjYW4gcmVxdWVzdHMgaW4gYm90aCBTY2hlZHVsZXIncyBxdWV1ZSBhbmQgU2NhbiBFbmdpbmUKKwkgKi8KKwlBX1VJTlQzMiByZXFfdHlwZTsKKwkvKioKKwkgKiB2RGV2IElECisJICogdXNlZCB3aGVuIHJlcV90eXBlIGVxdWFscyB0byBXTUlfU0NOX1NUT1BfVkFQX0FMTCwgaXQgaW5kZXhlZCB0aGUgdkRldiBvbiB3aGljaCB0byBzdG9wIHRoZSBzY2FuCisJICovCisJQV9VSU5UMzIgdmRldl9pZDsKK30gd21pX2xwaV9zdG9wX3NjYW5fY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCVdNSV9MUElfREVWSUNFX1RZUEVfQVAgPSAxLAorCVdNSV9MUElfREVWSUNFX1RZUEVfUDJQID0gMiwKKwlXTUlfTFBJX0RFVklDRV9UWVBFX05BTiA9IDMsCit9IHdtaV9scGlfZGV2aWNlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBTY2FuIHJlcXVlc3RvciBJRCAqLworCUFfVUlOVDMyIHNjYW5fcmVxX2lkOworCUFfVUlOVDMyIGllX2JpdG1hcDsKKwlBX1VJTlQzMiBkYXRhX2xlbjsKK30gd21pX2xwaV9yZXN1bHRfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgZW51bSB7CisJLyoqIFVzZXIgc2NhbiBSZXF1ZXN0IGNvbXBsZXRlZCAqLworCVdNSV9MUElfU1RBVFVTX1NDQU5fUkVRX0NPTVBMRUQgPSAwLAorCS8qKiBVc2VyIFJlcXVlc3Qgd2FzIG5ldmVyIHNlcnZpY2VkICovCisJV01JX0xQSV9TVEFUVVNfRFJPUFBFRF9SRVEgPSAxLAorCS8qKiBJbGxlZ2FsIGNoYW5uZWwgUmVxICovCisJV01JX0xQSV9TVEFUVVNfSUxMRUdBTF9DSEFOX1JFUSA9IDIsCisJLyoqIElsbGVnYWwgT3BlcmF0aW9uIFJlcSAqLworCVdNSV9MUElfU1RBVFVTX0lMTEVHQUxfT1BFUl9SRVEgPSAzLAorCS8qKiBSZXF1ZXN0IEFib3J0ZWQgKi8KKwlXTUlfTFBJX1NUQVRVU19SRVFfQUJPUlRFRCA9IDQsCisJLyoqIFJlcXVlc3QgVGltZWQgT3V0ICovCisJV01JX0xQSV9TVEFUVVNfUkVRX1RJTUVfT1VUID0gNSwKKwkvKiogTWVkaXVtIEJ1c3ksIGFscmVhZHkgdGhlcmUKKwkgKiBpcyBhIHNjYW4gaXMgZ29pbmcgb24gKi8KKwlXTUlfTFBJX1NUQVRVU19NRURJVU1fQlVTWSA9IDYsCisJLyogRXh0c2NhbiBpcyB0aGUgc2NhbiBjbGllbnQgd2hvc2Ugc2NhbiBjb21wbGV0ZSBldmVudCBpcyB0cmlnZ2VyZWQgKi8KKwlXTUlfTFBJX1NUQVRVU19FWFRTQ0FOX0NZQ0xFX0FORF9TQ0FOX1JFUV9DT01QTEVURUQgPSA3LAorfSB3bWlfbHBpX3N0YXVzOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwl3bWlfbHBpX3N0YXVzIHN0YXR1czsKKwkvKiogU2NhbiByZXF1ZXN0b3IgSUQgKi8KKwlBX1VJTlQzMiBzY2FuX3JlcV9pZDsKK30gd21pX2xwaV9zdGF0dXNfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCXdtaV9tYWNfYWRkciBic3NpZDsKKwl3bWlfc3NpZCBzc2lkOworCUFfVUlOVDMyIGZyZXE7CisJQV9VSU5UMzIgcnNzaTsKKwlBX1VJTlQzMiB2ZGV2X2lkOworfSB3bWlfbHBpX2hhbmRvZmZfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIHRpbWVzdGFtcDsgICAgICAgICAgICAgLyp0aW1lc3RhbXAgb2YgYmF0Y2ggc2NhbiBldmVudCAqLworCUFfVUlOVDMyIG51bVNjYW5MaXN0czsgICAgICAgICAgLypudW1iZXIgb2Ygc2NhbiBpbiB0aGlzIGV2ZW50ICovCisJQV9VSU5UMzIgaXNMYXN0UmVzdWx0OyAgICAgICAgICAvKmlzIHRoaXMgZXZlbnQgYSBsYXN0IGV2ZW50IG9mIHRoZSB3aG9sZSBiYXRjaCBzY2FuICovCit9IHdtaV9iYXRjaF9zY2FuX3Jlc3VsdF9ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3AycF9ub2FfZXZlbnRfZml4ZWRfcGFyYW0gICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiBUaGlzIFRMViBpcyBmb2xsb3dlZCBieSBwMnBfbm9hX2luZm8gZm9yIHZkZXYgOgorCSAqICAgICB3bWlfcDJwX25vYV9pbmZvIHAycF9ub2FfaW5mbzsKKwkgKi8KK30gd21pX3AycF9ub2FfZXZlbnRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX1JGS0lMTF9DRkdfUkFESU9fTEVWRUxfT0ZGU0VUICAgICAgNgorI2RlZmluZSBXTUlfUkZLSUxMX0NGR19SQURJT19MRVZFTF9NQVNLICAgICAgMHgxCisKKyNkZWZpbmUgV01JX1JGS0lMTF9DRkdfR1BJT19QSU5fTlVNX09GRlNFVCAgICAgIDAKKyNkZWZpbmUgV01JX1JGS0lMTF9DRkdfR1BJT19QSU5fTlVNX01BU0sgICAgICAweDNmCisKKyNkZWZpbmUgV01JX1JGS0lMTF9DRkdfUElOX0FTX0dQSU9fT0ZGU0VUICAgICAgNworI2RlZmluZSBXTUlfUkZLSUxMX0NGR19QSU5fQVNfR1BJT19NQVNLICAgICAgMHhmCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBncGlwIHBpbiBudW1iZXIgKi8KKwlBX1VJTlQzMiBncGlvX3Bpbl9udW07CisJLyoqIGdwaW8gaW50ZXJ1cHQgdHlwZSAqLworCUFfVUlOVDMyIGludF90eXBlOworCS8qKiBSRiByYWRpbyBzdGF0dXMgKi8KKwlBX1VJTlQzMiByYWRpb19zdGF0ZTsKK30gd21pX3Jma2lsbF9tb2RlX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCVdNSV9TRVRfTEVEX1NZU19QT1dFUk9GRiwKKwlXTUlfU0VUX0xFRF9TWVNfUzNfU1VTUEVORCwKKwlXTUlfU0VUX0xFRF9TWVNfUzRfUzUsCisJV01JX1NFVF9MRURfU1lTX0RSSVZFUl9ESVNBQkxFLAorCVdNSV9TRVRfTEVEX1NZU19XQUtFVVAsCisJV01JX1NFVF9MRURfU1lTX0FMV0FZU19PTiwgICAgICAgICAgICAgIC8qIGp1c3QgZm9yIHRlc3QhICovCisJV01JX1NFVF9MRURfU1lTX1BPV0VST04sCit9IHdtaV9sZWRfc3lzX3N0YXRlX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCVdNSV9DT05GSUdfTEVEX1RPX1ZERCA9IDAsCisJV01JX0NPTkZJR19MRURfVE9fR05EID0gMSwKK30gd21pX2NvbmZpZ19sZWRfY29ubmVjdF90eXBlOworCit0eXBlZGVmIGVudW0geworCVdNSV9DT05GSUdfTEVEX05PVF9XSVRIX0JUID0gMCwKKwlXTUlfQ09ORklHX0xFRF9XSVRIX0JUID0gMSwKK30gd21pX2NvbmZpZ19sZWRfd2l0aF9idF9mbGFnOworCit0eXBlZGVmIGVudW0geworCVdNSV9DT05GSUdfTEVEX0RJU0FCTEUgPSAwLAorCVdNSV9DT05GSUdfTEVEX0VOQUJMRSA9IDEsCit9IHdtaV9jb25maWdfbGVkX2VuYWJsZV9mbGFnOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZWVyX2luZm9fcmVxX2NtZF9maXhlZF9wYXJhbSAgICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiBTZXQgR1BJTyBwaW4gKi8KKwlBX1VJTlQzMiBsZWRfZ3Bpb19waW47CisJLyogU2V0IGNvbm5lY3QgdHlwZSBkZWZpbmVkIGluIHdtaV9jb25maWdfbGVkX2Nvbm5lY3RfdHlwZSAqLworCUFfVUlOVDMyIGNvbm5lY3RfdHlwZTsKKwkvKiBTZXQgZmxhZyBkZWZpbmVkIGluIHdtaV9jb25maWdfbGVkX3dpdGhfYnRfZmxhZyAqLworCUFfVUlOVDMyIHdpdGhfYnQ7CisJLyogU2V0IExFRCBlbmFibGVtZW50IGRlZmluZWQgaW4gd21pX2NvbmZpZ19sZWRfZW5hYmxlX2ZsYWcgKi8KKwlBX1VJTlQzMiBsZWRfZW5hYmxlOworfSB3bWlfcGRldl9zZXRfbGVkX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX1dOVFNfQ0ZHX0dQSU9fUElOX05VTV9PRkZTRVQgMAorI2RlZmluZSBXTUlfV05UU19DRkdfR1BJT19QSU5fTlVNX01BU0sgMHhmZgorCisvKiogV01JX1BFRVJfSU5GT19SRVFfQ01ESUQKKyAqICAgUmVxdWVzdCBGVyB0byBwcm92aWRlIHBlZXIgaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiAgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9pbmZvX3JlcV9jbWRfZml4ZWRfcGFyYW0gICAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIEluIG9yZGVyIHRvIGdldCB0aGUgcGVlciBpbmZvIGZvciBhIHNpbmdsZSBwZWVyLCBob3N0IHNoYWxsCisJICogIGlzc3VlIHRoZSBwZWVyX21hY19hZGRyZXNzIG9mIHRoYXQgcGVlci4gRm9yIGdldHRpbmcgdGhlCisJICogIGluZm8gYWxsIHBlZXJzLCB0aGUgaG9zdCBzaGFsbCBpc3N1ZSAweEZGRkZGRkZGIGFzIHRoZSBtYWMKKwkgKiAgYWRkcmVzcy4gVGhlIGZpcm13YXJlIHdpbGwgcmV0dXJuIHRoZSBwZWVyIGluZm8gZm9yIGFsbCB0aGUKKwkgKiAgcGVlcnMgb24gdGhlIHNwZWNpZmllZCB2ZGV2X2lkICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjX2FkZHJlc3M7CisJLyoqIHZkZXYgaWQgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworfSB3bWlfcGVlcl9pbmZvX3JlcV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfaW5mbyAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIG1hYyBhZGRyIG9mIHRoZSBwZWVyICovCisJd21pX21hY19hZGRyIHBlZXJfbWFjX2FkZHJlc3M7CisJLyoqIGRhdGFfcmF0ZSBvZiB0aGUgcGVlciAqLworCUFfVUlOVDMyIGRhdGFfcmF0ZTsKKwkvKiogcnNzaSBvZiB0aGUgcGVlciAqLworCUFfVUlOVDMyIHJzc2k7CisJLyoqIHR4IGZhaWwgY291bnQgKi8KKwlBX1VJTlQzMiB0eF9mYWlsX2NudDsKK30gd21pX3BlZXJfaW5mbzsKKworLyoqIEZXIHJlc3BvbnNlIHdpdGggdGhlIHBlZXIgaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiAgV01JVExWX1RBR19TVFJVQ193bWlfcGVlcl9pbmZvX2V2ZW50X2ZpeGVkX3BhcmFtICAgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBudW1iZXIgb2YgcGVlcnMgaW4gcGVlcl9pbmZvICovCisJQV9VSU5UMzIgbnVtX3BlZXJzOworCS8qIFRoaXMgVExWIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgVExWIG9mIGFycmF5IG9mIHN0cnVjdHMKKwkgKiB3bWlfcGVlcl9pbmZvIHBlZXJfaW5mb1tdOworCSAqLworfSB3bWlfcGVlcl9pbmZvX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiogRlcgcmVzcG9uc2Ugd2hlbiB0eCBmYWlsdXJlIGNvdW50IGhhcyByZWFjaGVkIHRocmVzaG9sZAorICogIGZvciBhIHBlZXIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfdHhfZmFpbF9jbnRfdGhyX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogdmRldiBpZCovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogbWFjIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNfYWRkcmVzczsKKwkvKiogdHggZmFpbHVyZSBjb3VudC0gd2lsbCBldmVudHVhbGx5IGJlIHJlbW92ZWQgYW5kIG5vdCB1c2VkICogKi8KKwlBX1VJTlQzMiB0eF9mYWlsX2NudDsKKwkvKiogc2VxIG51bWJlciBvZiB0aGUgbnRoIHR4X2ZhaWxfZXZlbnQgKi8KKwlBX1VJTlQzMiBzZXFfbm87Cit9IHdtaV9wZWVyX3R4X2ZhaWxfY250X3Rocl9ldmVudF9maXhlZF9wYXJhbTsKKworZW51bSB3bWlfcm1jX21vZGUgeworCS8qKiBEaXNhYmxlIFJNQyAqLworCVdNSV9STUNfTU9ERV9ESVNBQkxFRCA9IDAsCisJLyoqIEVuYWJsZSBSTUMgKi8KKwlXTUlfUk1DX01PREVfRU5BQkxFRCA9IDEsCit9OworCisvKiogRW5hYmxlIFJNQyB0cmFuc21pdHRlciBmdW5jdGlvbmFsaXR5LiBVcG9uCisgKiAgcmVjZWl2aW5nIHRoaXMsIHRoZSBGVyBzaGFsbCBtdXRsaWNhc3QgZnJhbWVzIHdpdGgKKyAqICByZWxpYWJsaXR5LiBUaGlzIGlzIGEgdmVuZG9yCisgKiAgcHJvcHJpZXRhcnkgZmVhdHVyZS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JtY19zZXRfbW9kZV9jbWRfZml4ZWRfcGFyYW0gICAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIHZkZXYgaWQqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIGVuYWJsZV9ybWMgY29udGFpbnMgdmFsdWVzIGZyb20gZW51bSB3bWlfcm1jX21vZGU7CisJICogIERlZmF1bHQgdmFsdWU6IDAgKGRpc2FibGVkKSAqLworCUFfVUlOVDMyIGVuYWJsZV9ybWM7Cit9IHdtaV9ybWNfc2V0X21vZGVfY21kX2ZpeGVkX3BhcmFtOworCisvKiogQ29uZmlndXJlIHRyYW5zbWlzc2lvbiBwZXJpb2RpY2l0eSBvZiBhY3Rpb24gZnJhbWVzIGluIGEKKyAqICBSTUMgbmV0d29yayBmb3IgdGhlIG11bHRpY2FzdCB0cmFuc21pdHRlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiAgV01JVExWX1RBR19TVFJVQ193bWlfcm1jX3NldF9hY3Rpb25fcGVyaW9kX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIHZkZXYgaWQgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiB0aW1lIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHQ6IDMwMCBtcy4KKwkgICBBbiBhY3Rpb24gZnJhbWUgaW5kaWNhdGluZyB0aGUgY3VycmVudCBsZWFkZXIgaXMgdHJhbnNtaXR0ZWQgYnkgdGhlCisJICAgUk1DIHRyYW5zbWl0dGVyIG9uY2UgZXZlcnkgJ3BlcmlvZGl0eV9tc2VjJyAqLworCUFfVUlOVDMyIHBlcmlvZGljaXR5X21zZWM7Cit9IHdtaV9ybWNfc2V0X2FjdGlvbl9wZXJpb2RfY21kX2ZpeGVkX3BhcmFtOworCisvKiogT3B0aW1pc2UgTGVhZGVyIHNlbGVjdGlvbiBwcm9jZXNzIGluIFJNQyBmdW5jdGlvbmFsaXR5LiBGb3IKKyAqICBFbmhhbmNlbWVudC9EZWJ1ZyBwdXJwb3NlcyBvbmx5ICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ybWNfY29uZmlnX2NtZF9maXhlZF9wYXJhbSAgICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogdmRldiBpZCAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIGZsYWdzIDo6CisJICogIDB4MDAwMSAtIEVuYWJsZSBiZWFjb24gYXZlcmFnaW5nCisJICogIDB4MDAwMiAtIEZvcmNlIGxlYWRlciBzZWxlY3Rpb24KKwkgKiAgMHgwMDA0IC0gRW5hYmxlIFRpbWVyIGJhc2VkIGxlYWRlciBzd2l0Y2gKKwkgKiAgMHgwMDA4IC0gVXNlIHFvcy9OVUxMIGJhc2VkIGZvciBtdWx0aWNhc3QgcmVsaWFiaWxpdHkgKi8KKwlBX1VJTlQzMiBmbGFnczsKKwkvKiogIGNvbnRyb2wgbGVhZGVyIGNoYW5nZSB0aW1lcGVyaW9kIChpbiBzZWNvbmRzKSAqLworCUFfVUlOVDMyIHBlcmlkb2NpdHlfbGVhZGVyX3N3aXRjaDsKKwkvKiogY29udHJvbCBhY3Rpdml0eSB0aW1lb3V0IHZhbHVlIGZvciBkYXRhIHJ4IChpbiBzZWNvbmRzKSAqLworCUFfVUlOVDMyIGRhdGFfYWN0aXZpdHlfdGltZW91dDsKKwkvKiogbWFjIGFkZHJlc3Mgb2YgbGVhZGVyICovCisJd21pX21hY19hZGRyIGZvcmNlZF9sZWFkZXJfbWFjX2FkZHI7Cit9IHdtaV9ybWNfY29uZmlnX2NtZF9maXhlZF9wYXJhbTsKKworLyoqIE1IRiBpcyBnZW5lcmFsbHkgaW1wbGVtZW50ZWQgaW4KKyAqICB0aGUga2VybmVsLiBUbyBkZWNyZWFzZSBzeXN0ZW0gcG93ZXIgY29uc3VtcHRpb24sIHRoZQorICogIGRyaXZlciBjYW4gZW5hYmxlIG9mZmxvYWRpbmcgdGhpcyB0byB0aGUgY2hpcHNldC4gSW4KKyAqICBvcmRlciBmb3IgdGhlIG9mZmxvYWQsIHRoZSBmaXJtd2FyZSBuZWVkcyB0aGUgcm91dGluZyB0YWJsZS4KKyAqICBUaGUgaG9zdCBzaGFsbCBwbHVtYiB0aGUgcm91dGluZyB0YWJsZSBpbnRvIEZXLiBUaGUgZmlybXdhcmUKKyAqICBzaGFsbCBwZXJmb3JtIGFuIElQIGFkZHJlc3MgbG9va3VwIGFuZCBmb3J3YXJkIHRoZSBwYWNrZXQgdG8KKyAqICB0aGUgbmV4dCBob3AgdXNpbmcgbmV4dCBob3AncyBtYWMgYWRkcmVzcy4gVGhpcyBpcyBhIHZlbmRvcgorICogIHByb3ByaWV0YXJ5IGZlYXR1cmUuICovCitlbnVtIHdtaV9taGZfb2ZsX21vZGUgeworCS8qKiBEaXNhYmxlIE1IRiBvZmZsb2FkICovCisJV01JX01IRl9PRkxfTU9ERV9ESVNBQkxFRCA9IDAsCisJLyoqIEVuYWJsZSBNSEYgb2ZmbG9hZCAqLworCVdNSV9NSEZfT0ZMX01PREVfRU5BQkxFRCA9IDEsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9taGZfb2ZmbG9hZF9zZXRfbW9kZV9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiB2ZGV2IGlkKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBlbmFibGVfbWhmX29mbCBjb250YWlucyB2YWx1ZXMgZnJvbSBlbnVtCisJICogIHdtaV9taGZfb2ZsX21vZGU7IERlZmF1bHQgdmFsdWU6IDAgKGRpc2FibGVkKSAqLworCUFfVUlOVDMyIGVuYWJsZV9taGZfb2ZsOworfSB3bWlfbWhmX29mZmxvYWRfc2V0X21vZGVfY21kX2ZpeGVkX3BhcmFtOworCitlbnVtIHdtaV9taGZfb2ZsX3RhYmxlX2FjdGlvbiB7CisJLyoqIENyZWF0ZSBmb3J3YXJkaW5nIG9mZmxvYWQgdGFibGUgaW4gRlcgKi8KKwlXTUlfTUhGX09GTF9UQkxfQ1JFQVRFID0gMCwKKwkvKiogQXBwZW5kIHRvIGV4aXN0aW5nIE1IRiBvZmZsb2FkIHRhYmxlICovCisJV01JX01IRl9PRkxfVEJMX0FQUEVORCA9IDEsCisJLyoqIEZsdXNoIGVudGlyZSBNSEYgb2ZmbG9hZCB0YWJsZSBpbiBGVyAqLworCVdNSV9NSEZfT0ZMX1RCTF9GTFVTSCA9IDIsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9taGZfb2ZmbG9hZF9wbHVtYl9yb3V0aW5nX3RhYmxlX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIHZkZXYgaWQqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIGFjdGlvbiBjb3JyZXNwb25kcyB0byB2YWx1ZXMgZnJvbSBlbnVtCisJICogIHdtaV9taGZfb2ZsX3RhYmxlX2FjdGlvbiAqLworCUFfVUlOVDMyIGFjdGlvbjsKKwkvKiogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlICovCisJQV9VSU5UMzIgbnVtX2VudHJpZXM7CisvKiogRm9sbG93ZWQgYnkgdGhlIHZhcmlhYmxlIGxlbmd0aCBUTFYKKyAqICB3bWlfbWhmX29mZmxvYWRfcm91dGluZ190YWJsZV9lbnRyeSBlbnRyaWVzW10gKi8KK30gd21pX21oZl9vZmZsb2FkX3BsdW1iX3JvdXRpbmdfdGFibGVfY21kOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9taGZfb2ZmbG9hZF9yb3V0aW5nX3RhYmxlX2VudHJ5ICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogRGVzdGluYXRpb24gbm9kZSdzIElQIGFkZHJlc3MgKi8KKwlXTUlfSVBWNF9BRERSIGRlc3RfaXB2NF9hZGRyOworCS8qKiBOZXh0IGhvcCBub2RlJ3MgTUFDIGFkZHJlc3MgKi8KKwl3bWlfbWFjX2FkZHIgbmV4dF9ob3BfbWFjX2FkZHI7Cit9IHdtaV9taGZfb2ZmbG9hZF9yb3V0aW5nX3RhYmxlX2VudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIHRsdiB0YWcgYW5kIGxlbiwgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX2Rmc19yYWRhcl9ldmVudCAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisKKwkvKiogZnVsbCA2NCB0c2YgdGltZXN0YW1wIGdldCBmcm9tIE1BQyB0c2YgdGltZXIgaW5kaWNhdGVzCisJICogdGhlIHRpbWUgdGhhdCB0aGUgcmFkYXIgZXZlbnQgdXBsb2FkaW5nIHRvIGhvc3QsIHNwbGl0CisJICogaXQgdG8gaGlnaCAzMiBiaXQgYW5kIGxvd2VyIDMyIGJpdCBpbiBmdWxsdHNmX2hpZ2ggYW5kCisJICogZnVsbF90c2ZfbG93CisJICovCisJQV9VSU5UMzIgdXBsb2FkX2Z1bGx0c19sb3c7CisJQV9VSU5UMzIgdXBsb2FkX2Z1bGx0c19oaWdoOworCisJLyoqIHRpbWVzdGFtcCBpbmRpY2F0ZXMgdGhlIHRpbWUgd2hlbiBERlMgcHVsc2UgaXMgZGV0ZWN0ZWQKKwkgKiBlcXVhbCB0byBwcGR1X2VuZF90cyAtIHJhZGFyX3B1c2xlX3N1bW1hcnlfdHNfb2Zmc2V0CisJICovCisJQV9VSU5UMzIgcHVsc2VfZGV0ZWN0X3RzOworCisJLyoqIHRoZSBkdWFyYXRpb24gb2YgdGhlIHB1bHNlIGluIHVzICovCisJQV9VSU5UMzIgcHVsc2VfZHVyYXRpb247CisKKwkvKiogdGhlIGNlbnRlciBmcmVxdWVuY3kgb2YgdGhlIHJhZGFyIHB1bHNlIGRldGVjdGVkLCBLSHogKi8KKwlBX1VJTlQzMiBwdWxzZV9jZW50ZXJfZnJlcTsKKworCS8qKiBiYW5kd2lkdGggb2YgY3VycmVudCBERlMgY2hhbm5lbCwgTUh6ICovCisJQV9VSU5UMzIgY2hfYmFuZHdpZHRoOworCisJLyoqIGNlbnRlciBjaGFubmVsIGZyZXF1ZW5jeTEgb2YgY3VycmVudCBERlMgY2hhbm5lbCwgTUh6ICovCisJQV9VSU5UMTYgY2hfY2VudGVyX2ZyZXExOworCisJLyoqIGNlbnRlciBjaGFubmVsIGZyZXF1ZW5jeTIgb2YgY3VycmVudCBERlMgY2hhbm5lbCwgTUh6LAorCSAqIHJlc2VydmVkIGZvciAxNjAgQlcgbW9kZQorCSAqLworCUFfVUlOVDE2IGNoX2NlbnRlcl9mcmVxMjsKKworCS8qKiBmbGFnIHRvIGluZGljYXRlIGlmIHRoaXMgcHVsc2UgaXMgY2hpcnAgKi8KKwlBX1VJTlQ4IHB1bHNlX2lzX2NoaXJwOworCisJLyoqIFJTU0kgcmVjb3JkZWQgaW4gdGhlIHBwZHUgKi8KKwlBX1VJTlQ4IHJzc2k7CisKKwkvKiogZXh0ZW5lZCBSU1NJIGluZm8gKi8KKwlBX1VJTlQ4IHJzc2lfZXh0OworCisJLyoqIEZvciA0LWJ5dGUgYWxpZ21lbnQgcGFkZGluZyAqLworCUFfVUlOVDggcmVzZXJ2ZWQ7CisKKwkvKiogcG1hY19pZCBmb3IgdGhlIHJhZGFyIGV2ZW50ICovCisJQV9VSU5UOCBwbWFjX2lkOworCisJLyoqIGluZGV4IG9mIHBlYWsgbWFnbml0dWRlIGJpbiAoc2lnbmVkKSAqLworCUFfSU5UMzIgcGVha19zaWR4OworCit9IHdtaV9kZnNfcmFkYXJfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV90aGVybWFsX21nbXRfY21kX2ZpeGVkX3BhcmFtICAqLworCisJLypUaGVybWFsIHRocmVzaG9sZHMgKi8KKwlBX1VJTlQzMiBsb3dlcl90aHJlc2hfZGVncmVlQzsgICAgICAgICAgLyogaW4gZGVncmVlIEMgKi8KKwlBX1VJTlQzMiB1cHBlcl90aHJlc2hfZGVncmVlQzsgICAgICAgICAgLyogaW4gZGVncmVlIEMgKi8KKworCS8qRW5hYmxlL0Rpc2FibGUgVGhlcm1hbCBNb25pdG9yaW5nIGZvciBNaXRpZ2F0aW9uICovCisJQV9VSU5UMzIgZW5hYmxlOworfSB3bWlfdGhlcm1hbF9tZ210X2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3RoZXJtYWxfbWdtdF9ldmVudF9maXhlZF9wYXJhbSAgKi8KKworCUFfVUlOVDMyIHRlbXBlcmF0dXJlX2RlZ3JlZUM7ICAgICAgICAgICAvKiB0ZW1wZXJhdHVyZSBpbiBkZWdyZWUgQyAqLworfSB3bWlfdGhlcm1hbF9tZ210X2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKioKKyAqIFRoaXMgY29tbWFuZCBpcyBzZW50IGZyb20gV0xBTiBob3N0IGRyaXZlciB0byBmaXJtd2FyZSB0bworICogcmVxdWVzdCBmaXJtd2FyZSB0byBjb25maWd1cmUgYXV0byBzaHV0ZG93biB0aW1lciBpbiBmdworICogMCAtIERpc2FibGUgPDEtMTk2MDA+LUVuYWJsZWQgYW5kIHRpbWVyIHZhbHVlIGlzIHNlY29uZHMgKDg2NDAwIHNlY29uZHMgPSAxIGRheSBtYXhpbXVtPgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2hvc3RfYXV0b19zaHV0ZG93bl9jZmdfY21kX3BhcmFtICAqLworCUFfVUlOVDMyIHRpbWVyX3ZhbHVlOworCS8qKiB0aW1lciB2YWx1ZTsgMD1kaXNhYmxlICovCit9IHdtaV9ob3N0X2F1dG9fc2h1dGRvd25fY2ZnX2NtZF9maXhlZF9wYXJhbTsKKworZW51bSB3bWlfaG9zdF9hdXRvX3NodXRkb3duX3JlYXNvbiB7CisJV01JX0hPU1RfQVVUT19TSFVURE9XTl9SRUFTT05fVU5LTk9XTiA9IDAsCisJV01JX0hPU1RfQVVUT19TSFVURE9XTl9SRUFTT05fVElNRVJfRVhQSVJZID0gMSwKKwlXTUlfSE9TVF9BVVRPX1NIVVRET1dOX1JFQVNPTl9NQVgsCit9OworCisvKiBXTUlfSE9TVF9BVVRPX1NIVVRET1dOX0VWRU5USUQgICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2hvc3RfYXV0b19zaHV0ZG93bl9ldmVudF9maXhlZF9wYXJhbSAgKi8KKwlBX1VJTlQzMiBzaHV0ZG93bl9yZWFzb247ICAgICAgICAgICAgICAgLyogdmFsdWU6IHdtaV9ob3N0X2F1dG9fc2h1dGRvd25fcmVhc29uICovCit9IHdtaV9ob3N0X2F1dG9fc2h1dGRvd25fZXZlbnRfZml4ZWRfcGFyYW07CisKKy8qKiBOZXcgV01JIGNvbW1hbmQgdG8gc3VwcG9ydCBUUEMgQ0hBSU5NQVNLIEFESlVTVE1FTlQgQUNDT1JESU5HIFRPIGEgc2V0IG9mIGNvbmRpdGlvbnMgc3BlY2lmaWVkIGluIHRoZSBjb21tYW5kLgorICogIGZ3IHdpbGwgc2F2ZSBjIHRwYyBvZmZzZXQvY2hhaW5tYXNrIGFsb25nIHdpdGggY29uZGl0aW9ucyBhbmQgYWRqdXN0IHRwYy9jaGFpbm1hc2sgd2hlbiBjb25kaXRpb24gbWVldC4KKyAqICBUaGlzIGNvbW1hbmQgaXMgb25seSB1c2VkIGJ5IHNvbWUgY3VzdG9tZXIgZm9yICB2ZXJpZmljYXRpb24gdGVzdC4gIEl0IGlzIG5vdCBmb3IgZW5kLXVzZXIuCisgKgorICogIGFycmF5IG9mIHdtaV90cGNfY2hhaW5tYXNrX2NvbmZpZyBzdHJ1Y3R1cmVzIGFyZSBwYXNzZWQgd2l0aCB0aGUgY29tbWFuZCB0byBzcGVjaWZ5IG11bHRpcGxlIGNvbmRpdGlvbnMuCisgKgorICogIFRoZSBzZXQgb2YgY29uZGl0aW9ucyBpbmNsdWRlIGJ0IHN0YXR1cywgc3RiYyBzdGF0dXMsIGJhbmQsIHBoeV9tb2RlLCAxc3RyZWFtLzJzdHJlYW1zLCBjaGFubmVsLCByYXRlLiB3aGVuIGFsbCB0aGVzZSBjb25kaXRpb25zIG1lZXQsCisgKiAgdGhlIG91dHB1dCh0cGNfb2Zmc2V0LGNoYWlubWFzaykgd2lsbCBiZSBhcHBsaWVkIG9uIHBlciBwYWNrZXQgYmFzaXMuIGFja19vZmZzZXQgaXMgYXBwbGllZCBiYXNlZCBvbiBjaGFubmVsIGNvbmR0aW9uIG9ubHkuIFdoZW4gbXVsdGlwbGUKKyAqICBjb25kaXRpb25zIGhhcyB0aGUgc2FtZSBjaGFubmVsICx0aGVuIHRoZSBmaXJzdCBhY2tfb2Zmc2V0IHdpbGwgYmUgYXBwbGllZC4gSXQgaXMgYmV0dGVyIGZvciBob3N0IGRyaXZlciB0byBtYWtlIHN1cmUgdGhlCisgKiAgPGNoYW5uZWwsIGFja19vZmZzZXQ+IHBhaXIgaXMgdW5pcXVlLgorICoKKyAqICB0aGUgY29uZGl0aW9ucyAoYnQgc3RhdHVzLCBzdGJjIHN0YXR1cywgYmFuZCwgcGh5X21vZGUsIDFzdGVhbS8yc3RyZWFtcywgdHBjX29mZnNldCwgYWNrX29mZnNldCwgY2hhaW5tYXNrKSBhcmUgY29tYmluZWRpIGludG8gYSBzaW5nbGUgd29yZAorICogIGNhbGxlZCBiYXNpY19jb25maWdfaW5mbyBieSBiaXRtYXAKKyAqICB0byBzYXZlIG1lbW9yeS4gQW5kIGNoYW5uZWwgJiByYXRlIGluZm8gd2lsbCBiZSB0cmFja2VkIGJ5ICdjaGFubmVsJyBmaWVsZCBhbmQgJ3JhdGUwJywgJ3JhdGUxJyBmaWVsZCBiZWNhdXNlIG9mIGl0cyBsYXJnZSBjb21iaW5hdGlvbi4KKyAqCisgKiAgJ3JhdGUgYml0JyBvciAnY2hhbm5lbCBiaXQnIGZpZWxkIG9mIGJhc2ljX2NvbmZpZ19pbmZvIGluZGljYXRlIHZhbGlkaXR5IG9mIHRoZSBjaGFubmVsIGFuZCByYXRlIGZpZWxkcy5pZiByYXRlIGJpdCBpcyAwIHRoZW4gdGhlIHJhdGUgZmllbGQKKyAqICAgaXMgaWdub3JlZC4KKyAqICBkaXNhYmxlIHdpbGwgcmVtb3ZlIHByZWlvdXMgY29uZGl0aW9ucyBmcm9tIEZXLgorICogIGNvbmRpdGlvbnMgZnJvbSB0aGUgbGF0ZXIgY29tbWFuZCB3aWxsIG92ZXIgd3JpdGUgY29uZGl0aW9ucyBzdG9yZWQgZnJvbSBhIHByZXZpb3VzIGNvbW1hbmQuCisgKgorICovCisKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0JUX09OX09GRiAgICAwICAgLyoqIGRvbnQnIGNhcmUgdGhlIGJ0IHN0YXR1cyAqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQlRfT04gICAgICAgIDEgICAvKiogYXBwbHkgb25seSB3aGVuIGJ0IG9uICovCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19CVF9PRkYgICAgICAgMiAgIC8qKiBhcHBseSBvbmx5IHdoZW4gYnQgb2ZmICAqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQlRfUkVTVjEgICAgIDMgICAvKiogcmVzZXJ2ZWQgICovCisKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0NIQUlOTUFTS19ET05UX0NBUkUgICAwICAgLyoqICBkb24ndCBjYXJlIHRoZSBjaGFpbm1hc2sgKi8KKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0NIQUlOTUFTS19DSEFJTjAgICAgICAxICAgLyoqICBmb3JjZSB0byB1c2UgQ2hhaW4wIHRvIHNlbmQgKi8KKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0NIQUlOTUFTS19DSEFJTjEgICAgICAyICAgLyoqICBmb3JjZSB0byB1c2UgQ2hhaW4xIHRvIHNlbmQgKi8KKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0NIQUlOTUFTS19DSEFJTjBfQ0hBSU4xICAzICAgLyoqIGZvcmNlIHRvIHVzZSBDaGFpbjAgJiBDaGFpbjEgdG8gc2VuZCAqLworCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19TVEJDX09OX09GRiAgMCAgIC8qKiAgZG9uJ3QgY2FyZSBhYm91dCBzdGJjICAqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfU1RCQ19PTiAgICAgIDEgICAvKiogIGFwcGx5IG9ubHkgd2hlbiBzdGJjIG9uICovCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19TVEJDX09GRiAgICAgMiAgIC8qKiAgYXBwbHkgb25seSB3aGVuIHN0YmMgb2ZmICovCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19TVEJDX1JFU1YxICAgMyAgIC8qKiAgcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQkFORF8yRyAgICAgIDAgICAvKiogIDJHICovCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19CQU5EXzVHICAgICAgMSAgIC8qKiAgNUcgKi8KKworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUEhZX01PREVfMTFCXzJHICAgIDAgICAgICAgIC8qKiAxMWIgMkcgKi8KKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1BIWV9NT0RFXzExR18yRyAgICAxICAgICAgICAvKiogMTFnIDJHICovCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19QSFlfTU9ERV8xMU5fMkcgICAgMiAgICAgICAgLyoqIDExbiAyRyAqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUEhZX01PREVfMTFOXzExQUNfMkcgICAzICAgIC8qKiAxMW4gKyAxMWFjIDJHICovCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19QSFlfTU9ERV8xMUFfNUcgICAgNCAgICAgICAgLyoqIDExYSA1RyAqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUEhZX01PREVfMTFOXzVHICAgIDUgICAgICAgIC8qKiAxMW4gNUcgKi8KKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1BIWV9NT0RFXzExQUNfNUcgICA2ICAgICAgICAvKiogMTFhYyA1RyAqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUEhZX01PREVfMTFOXzExQUNfNUcgIDcgICAgIC8qKiAxMW4gKyAxMWFjIDVHICovCisKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1NUUkVBTV8xICAgICAgICAgICAwICAgIC8qKiAxIHN0cmVhbSAgKi8KKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1NUUkVBTV8yICAgICAgICAgICAxICAgIC8qKiAyIHN0cmVhbXMgKi8KKworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBTk5FTF9PRkYgICAgICAgIDAgICAgLyoqIGNoYW5uZWwgZmllbGQgaXMgaWdub3JlZCAqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBTk5FTF9PTiAgICAgICAgIDEgICAgLyoqIGNoYW5uZWwgZmllbGQgbmVlZHMgdG8gYmUgY2hlY2tlZCAqLworCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19SQVRFX09GRiAgICAgICAgICAgMCAgICAvKiogcmF0ZSBmaWVsZCBpcyBpZ25vcmVkICovCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19SQVRFX09OICAgICAgICAgICAgMSAgICAvKiogcmF0ZSBmaWVsZCBuZWVkcyB0byBiZSBjaGVja2VkICovCisKKy8qKiAgQml0IG1hcCBkZWZpbml0aW9uIGZvciBiYXNpY19jb25maWdfaW5mbyBzdGFydHMgICAqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfVFBDX09GRlNFVF9TICAgMAorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfVFBDX09GRlNFVCAgICAgKDB4MWYgPDwgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1RQQ19PRkZTRVRfUykKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1RQQ19PRkZTRVRfR0VUKHgpICAgICBXTUlfRl9NUyh4LFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19UUENfT0ZGU0VUKQorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfVFBDX09GRlNFVF9TRVQoeCx6KSAgIFdNSV9GX1JNVyh4LCh6KSAmIDB4MWYsV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1RQQ19PRkZTRVQpCisKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0FDS19PRkZTRVRfUyAgICAgIDUKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0FDS19PRkZTRVQgICAgICAgICgweDFmIDw8IFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19BQ0tfT0ZGU0VUX1MpCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19BQ0tfT0ZGU0VUX0dFVCh4KSAgICAgV01JX0ZfTVMoeCxXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQUNLX09GRlNFVCkKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0FDS19PRkZTRVRfU0VUKHgseikgICBXTUlfRl9STVcoeCwgKHopICYgMHgxZiwgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0FDS19PRkZTRVQpCisKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0NIQUlOTUFTS19TICAxMAorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBSU5NQVNLICAgKDB4MyA8PCBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBSU5NQVNLX1MpCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19DSEFJTk1BU0tfR0VUKHgpICAgV01JX0ZfTVMoeCxXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBSU5NQVNLKQorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBSU5NQVNLX1NFVCh4LHopICBXTUlfRl9STVcoeCwgKHopJjB4MywgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0NIQUlOTUFTSykKKworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQlRfUyAgICAgICAxMgorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQlQgICAgICAgICAoMHgzIDw8IFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19CVF9TKQorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQlRfR0VUKHgpICAgICBXTUlfRl9NUyh4LFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19CVCkKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0JUX1NFVCh4LHopICAgV01JX0ZfUk1XKHgsICh6KSYweDMsIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19CVCkKKworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfU1RCQ19TICAgICAxNAorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfU1RCQyAgICAgICAoMHgzIDw8IFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19TVEJDX1MpCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19TVEJDX0dFVCh4KSAgICAgV01JX0ZfTVMoeCxXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfU1RCQykKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1NUQkNfU0VUKHgseikgICBXTUlfRl9STVcoeCwgKHopJiAweDMsIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19TVEJDKQorCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19CQU5EX1MgICAgIDE2CisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19CQU5EICAgICAgICgweDEgPDwgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0JBTkRfUykKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0JBTkRfR0VUKHgpICBXTUlfRl9NUyh4LFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19CQU5EKQorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQkFORF9TRVQoeCx6KSBXTUlfRl9STVcoeCwgKHopICYweDEsIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19CQU5EKQorCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19TVFJFQU1fUyAgIDE3CisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19TVFJFQU0gICAgICgweDEgPDwgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1NUUkVBTV9TKQorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfU1RSRUFNX0dFVCh4KSAgV01JX0ZfTVMoeCxXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfU1RSRUFNKQorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfU1RSRUFNX1NFVCh4LHopICBXTUlfRl9STVcoeCwgKHopJjB4MSwgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1NUUkVBTSkKKworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUEhZX01PREVfUyAgICAgMTgKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1BIWV9NT0RFICAgICAgICgweDcgPDwgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX1BIWV9NT0RFX1MpCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19QSFlfTU9ERV9HRVQoeCkgV01JX0ZfTVMoeCxXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUEhZX01PREUpCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5BTVNLX0NPTkZJR19QSFlfTU9ERV9TRVQoeCx6KSAgV01JX0ZfUk1XKHgsICh6KSYweDcsIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19QSFlfTU9ERSkKKworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBTk5FTF9TICAgICAyMQorLyoKKyAqIFRoZSBkZXByZWNhdGVkIG9sZCBuYW1lIChXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBTk5FTF9FWElTVCkKKyAqIGlzIHRlbXBvcmFyaWx5IG1haW50YWluZWQgYXMgYW4gYWxpYXMgZm9yIHRoZSBjb3JyZWN0IG5hbWUKKyAqIChXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBTk5FTCkKKyAqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBTk5FTF9FWElTVCBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBTk5FTAorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBTk5FTCAgICAgICAoMHgxIDw8IFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19DSEFOTkVMX1MpCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19DSEFOTkVMX0dFVCh4KSAgV01JX0ZfTVMoeCxXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBTk5FTCkKKyNkZWZpbmUgV01JX1RQQ19DSEFJTk1BU0tfQ09ORklHX0NIQU5ORUxfU0VUKHgseikgIFdNSV9GX1JNVyh4LCAoeikmMHgxLCBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfQ0hBTk5FTCkKKworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUkFURV9TICAyMgorLyoKKyAqIFRoZSBkZXByZWNhdGVkIG9sZCBuYW1lIChXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUkFURV9FWElTVCkKKyAqIGlzIHRlbXBvcmFyaWx5IG1haW50YWluZWQgYXMgYW4gYWxpYXMgZm9yIHRoZSBjb3JyZWN0IG5hbWUKKyAqIChXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUkFURSkKKyAqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUkFURV9FWElTVCBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUkFURQorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUkFURSAgICAoMHgxIDw8IFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19SQVRFX1MpCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19SQVRFX0dFVCh4KSAgIFdNSV9GX01TKHgsIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19SQVRFKQorI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUkFURV9TRVQoeCx6KSAgV01JX0ZfUk1XKHgsICh6KSYweDEsIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19SQVRFKQorCisvKiogIEJpdCBtYXAgZGVmaW5pdGlvbiBmb3IgYmFzaWNfY29uZmlnX2luZm8gZW5kcyAgICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBCYXNpYyBjb25kaXRpb24gZGVmaW5lZCBhcyBiaXQgbWFwIGFib3ZlLCBiaXRtYXAgaXMgY2hvc2VuIHRvIHNhdmUgbWVtb3J5LgorCSAqIEJpdDAgIH4gQml0NDogdHBjIG9mZnNldCB3aGljaCB3aWxsIGJlIGFkanVzdGVkIGlmIGNvbmR0aW9uIG1hdGNoZXMsIHRoZSB1bml0IGlzIDAuNWRCLiAgYml0NCBpbmRpY2F0ZXMgc2lnbmVkCisJICogQml0NSAgfiBCaXQ5OiBhY2sgb2Zmc2V0IHdoaWNoIHdpbGwgYmUgYWRqdXN0ZWQgaWYgY29uZHRpb24gbWF0Y2hlcywgdGhlIHVuaXQgaXMgMC41ZEIuICBiaXQ5IGluZGljYXRlcyBzaWduZWQKKwkgKiBCaXQxMCB+IEJpdDExOiBjaGFpbm1hc2sgIGInMDA6IGRvbid0IGNhcmUsIGInMDE6IGZvcmNlIHRvIHVzZSBjaGFpbjAsIGInMTA6IGZvcmNlIHRvIHVzZSBjaGFpbjEsIGInMTE6IGZvcmNlIHRvIHVzZSBjaGFpbjAmY2hhaW4xCisJICogQml0MTIgfiBCaXQxMzogYnQgY29uZGl0aW9uICBiJzAwOiBkb24ndCBjYXJlLCBiJzAxOiBhcHBseSBvbmx5IHdoZW4gYnQgb24sIGInMTA6IGFwcGx5IG9ubHkgd2hlbiBidCBvZmYsICBiJzExOiByZXNlcnZlZAorCSAqIEJpdDE0IH4gQml0MTU6IHN0YmMgY29uZGl0aW9uICBiJzAwOiBkb24ndCBjYXJlLCBiJzAxOiBhcHBseSBvbmx5IHdoZW4gc3RiYyBvbiwgYicxMDogYXBwbHkgb25seSB3aGVuIHN0YmMgb2ZmLCBiJzExOiByZXNlcnZlZAorCSAqIEJpdDE2IDogYmFuZCBjb25kaXRpb24gIGInMDogMkcsICBiJzE6IDVHCisJICogQml0MTcgOiBzdHJlYW0gY29uZGl0aW9uOiAgYicwOiAxIHN0cmVhbSwgYicxOiAyIHN0cmVhbXMKKwkgKiBCaXQxOCB+IEJpdDIwOiBwaHkgbW9kZSBjb25kaXRpb246IGInMDAwOiAxMWIgMmcsIGInMDAxOiAxMWcgMmcsIGInMDEwOiAxMW4gMmcsIGInMDExOiAxMW4rMTFhYyAyZywgYicxMDA6IDExYSwgYicxMDE6IDExbiA1ZywgYicxMTA6IDExYWMgNWcsIGInMTExOiAxMW4rMTFhYyA1ZworCSAqIEJpdDIxIDogY2hhbm5lbCBiaXQsIGlmIHRoaXMgYml0IGlzIDAsIHRoZW4gdGhlIGZvbGxvd2luZyBjaGFubmVsIGZpZWxkIGlzIGlnbm9yZWQKKwkgKiBCaXQyMiA6IHJhdGUgYml0LCBpZiB0aGlzIGJpdCBpcyAwLCB0aGVuIHRoZSBmb2xsb3dpbmcgcmF0ZTAmcmF0ZTEgaXMgaWdub3JlZC4KKwkgKiBCaXQyMyB+IEJpdDMxOiAgcmVzZXJ2ZWQKKwkgKi8KKwlBX1VJTlQzMiBiYXNpY19jb25maWdfaW5mbzsKKworCS8qKiBjaGFubmVsIG1hcHBpbmcgYml0IHJ1bGU6IFRoZSBsb3dlciBiaXQgY29ycmVzcG9uZHMgd2l0aCBzbWFsbGVyIGNoYW5uZWwuCisJICogIGl0IGRlcGVuZHMgb24gQml0MTQgb2YgYmFzaWNfY29uZmlnX2luZm8KKwkgKiAgVG90YWwgMjQgY2hhbm5lbHMgZm9yIDVHCisJICogIDM2ICAgIDQwICAgIDQ0ICAgIDQ4ICAgIDUyICAgIDU2ICAgIDYwICAgIDY0ICAgMTAwICAgMTA0ICAgMTA4ICAgMTEyICAgMTE2ICAgMTIwICAgMTI0ICAgMTI4ICAgMTMyICAgMTM2ICAgMTQwICAgMTQ5ICAgMTUzICAgMTU3ICAgMTYxICAgMTY1CisJICogIFRvdGFsIDE0IGNoYW5uZWxzIGZvciAyRworCSAqICAxIH4gMTQKKwkgKi8KKwlBX1VJTlQzMiBjaGFubmVsOworCisJLyoqIHJhdGUgbWFwcGluZyBiaXQgcnVsZTogIFRoZSBsb3dlciBiaXQgY29ycmVzcG9uZHMgd2l0aCBsb3dlciByYXRlLgorCSAqICBpdCBkZXBlbmRzIG9uIEJpdDE2IH4gQml0MTggb2YgYmFzaWNfY29uZmlnX2luZm8sICJwaHkgbW9kZSBjb25kaXRpb24iCisJICogIExlZ2FjeSByYXRlcyAsIDExYiwgMTFnLCAxMUEKKwkgKiAgMTFuIG9uZSBzdHJlYW0gKCBodDIwLCBodDQwICkgOCs4CisJICogIDExbiB0d28gc3RyZWFtcyAoIGh0MjAsIGh0NDAgKSA4KzgKKwkgKiAgMTFhYyBvbmUgc3RyZWFtICggdmh0MjAsIHZodDQwLCB2aHQ4MCApIDEwKzEwKzEwCisJICogIDExYWMgdHdvIHN0cmVhbXMgKHZodDIwLCB2aHQ0MCwgdmh0ODAgKSAxMCsxMCsxMAorCSAqLworCUFfVUlOVDMyIHJhdGUwOworCS8qKiBGb3IgZXhhbXBsZSwgZm9yIDExYiwgd2hlbiByYXRlMCBlcXVhbHMgMHgzLCBpdCBtZWFucyBpZiBhY3R1YWxfcmF0ZSBpbiBbICIxTWJwcyIsICIyTWJwcyJdIGNvbm5lY3Rpb24sIHRoZSByYXRlIGNvbmRpdGlvbiBpcyB0cnVlLgorCSAqICBGb3IgZXhhbXBsZSwgZm9yIDExZy8xMWEsIHdoZW4gcmF0ZTAgZXF1YWxzIDB4ZjAsaXQgbWVhbnMgIjU0TWJwcyIsICI0OE1icHMiLCAiMzZNYnBzIiwgIjI0TWIncyIgaXMgc2VsZWN0ZWQsIHdoaWxlICIxOE1icHMiLCAiMTJNYnBzIiwgIjlNYnBzIiwgIjZNYnBzIiBpcyBub3Qgc2VsZWN0ZWQKKwkgKi8KKworCS8qKiBvbmx5IHVzZWQgZm9yICIxMW4rMTFhYyIgY29tYmluZWQgcGh5X21vZGUsIChXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUEhZX01PREVfMTFOXzExQUNfMkcgLCBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfUEhZX01PREVfMTFOXzExQUNfNUcpIGluIHRoaXMgY2FzZSwgMTFuIHJhdGVzIGJlZ2lucyBvbiByYXRlMCwgd2hpbGUgMTFhYyByYXRlcyBiZWdpbnMgb24gcmF0ZTEKKwkgKi8KKwlBX1VJTlQzMiByYXRlMTsKK30gd21pX3RwY19jaGFpbm1hc2tfY29uZmlnOworCisjZGVmaW5lIFdNSV9UUENfQ0hBSU5NQVNLX0NPTkZJR19ESVNBQkxFICAgMCAgIC8qKiBjb250cm9sIHRoZSBvZmYgZm9yIHRoZSB0cGMgJiBjaGFpbm1hc2sqLworI2RlZmluZSBXTUlfVFBDX0NIQUlOTUFTS19DT05GSUdfRU5BQkxFICAgIDEgICAvKiogY29udHJvbCB0aGUgb24gZm9yIHRoZSB0cGMgJiBjaGFpbm1hc2sqLworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiBlbmFibGU7CisJLyoqIGVuYWJsZSB0byBzZXQgdHBjICYgY2hhaW5tYXNrIHdoZW4gY29uZHRpb25zIG1lZXQsIDA6IGRpc2FibGVkLCAgIDE6IGVuYWJsZWQuICAqLworCUFfVUlOVDMyIG51bV90cGNfY2hhaW5tYXNrX2NvbmZpZ3M7CisJLyoqIGZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyBudW1fdHBjX2NoYWlubWFza19jb25maWdzIG51bWJlciBvZiB3bWlfdHBjX2NoYWlubWFza19jb25maWcgICovCit9IHdtaV90cGNfY2hhaW5tYXNrX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfbmFuX2NtZF9wYXJhbSAqLworCUFfVUlOVDMyIGRhdGFfbGVuOworCS8qKiBsZW5ndGggaW4gYnl0ZSBvZiBkYXRhW10uICovCisJLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzZW5kIFJFUSBiaW5hcnkgYmxvYnMKKwkgKiBmcm9tIGFwcGxpY2F0aW9uL3NlcnZpY2UgdG8gZmlybXdhcmUgd2hlcmUgSG9zdCBkcnYgaXMgcGFzcyB0aHJvdWdoIC4KKwkgKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMVjoKKwkgKiAgICAgQV9VSU5UOCBkYXRhW107ICAgIC8vIGxlbmd0aCBpbiBieXRlIGdpdmVuIGJ5IGZpZWxkIGRhdGFfbGVuLgorCSAqLworfSB3bWlfbmFuX2NtZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9uYW5fZXZlbnRfaGRyICovCisJQV9VSU5UMzIgZGF0YV9sZW47CisJLyoqIGxlbmd0aCBpbiBieXRlIG9mIGRhdGFbXS4gKi8KKwkvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNlbmQgUkVRIGJpbmFyeSBibG9icworCSAqIGZyb20gZmlybXdhcmUgdG8gYXBwbGljYXRpb24vc2VydmljZSB3aGVyZSBIb3N0IGRydiBpcyBwYXNzIHRocm91Z2ggLgorCSAqIEZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgVExWOgorCSAqICAgICBBX1VJTlQ4IGRhdGFbXTsgICAgLy8gbGVuZ3RoIGluIGJ5dGUgZ2l2ZW4gYnkgZmllbGQgZGF0YV9sZW4uCisJICovCit9IHdtaV9uYW5fZXZlbnRfaGRyOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiBudW1fZGF0YTsKKwkvKiBmb2xsb3dlZCBieSBXTUlUTFZfVEFHX0FSUkFZX0JZVEUgKi8KK30gd21pX2RpYWdfZGF0YV9jb250YWluZXJfZXZlbnRfZml4ZWRfcGFyYW07CisKK2VudW0geworCVdNSV9QREVWX1BBUkFNX1RYUE9XRVJfUkVBU09OX05PTkUgPSAwLAorCVdNSV9QREVWX1BBUkFNX1RYUE9XRVJfUkVBU09OX1NBUiwKKwlXTUlfUERFVl9QQVJBTV9UWFBPV0VSX1JFQVNPTl9NQVgKK307CisKKyNkZWZpbmUgUERFVl9QQVJBTV9UWFBPV0VSX1ZBTFVFX01BU0sgIDB4MDAwMDAwRkYKKyNkZWZpbmUgUERFVl9QQVJBTV9UWFBPV0VSX1ZBTFVFX1NISUZUIDAKKworI2RlZmluZSBQREVWX1BBUkFNX1RYUE9XRVJfUkVBU09OX01BU0sgIDB4MDAwMEZGMDAKKyNkZWZpbmUgUERFVl9QQVJBTV9UWFBPV0VSX1JFQVNPTl9TSElGVCA4CisKKyNkZWZpbmUgU0VUX1BERVZfUEFSQU1fVFhQT1dFUl9WQUxVRSh0eHBvd2VyX3BhcmFtLCB2YWx1ZSkgICAgIFwKKwkoKHR4cG93ZXJfcGFyYW0pICY9IH5QREVWX1BBUkFNX1RYUE9XRVJfVkFMVUVfTUFTSywgKHR4cG93ZXJfcGFyYW0pIHw9ICgodmFsdWUpIDw8IFBERVZfUEFSQU1fVFhQT1dFUl9WQUxVRV9TSElGVCkpCisKKyNkZWZpbmUgU0VUX1BERVZfUEFSQU1fVFhQT1dFUl9SRUFTT04odHhwb3dlcl9wYXJhbSwgdmFsdWUpCVwKKwkoKHR4cG93ZXJfcGFyYW0pICY9IH5QREVWX1BBUkFNX1RYUE9XRVJfUkVBU09OX01BU0ssICh0eHBvd2VyX3BhcmFtKSB8PSAoKHZhbHVlKSA8PCBQREVWX1BBUkFNX1RYUE9XRVJfUkVBU09OX1NISUZUKSkKKworI2RlZmluZSBHRVRfUERFVl9QQVJBTV9UWFBPV0VSX1ZBTFVFKHR4cG93ZXJfcGFyYW0pCVwKKwkoKCh0eHBvd2VyX3BhcmFtKSAmIFBERVZfUEFSQU1fVFhQT1dFUl9WQUxVRV9NQVNLKSA+PiBQREVWX1BBUkFNX1RYUE9XRVJfVkFMVUVfU0hJRlQpCisKKyNkZWZpbmUgR0VUX1BERVZfUEFSQU1fVFhQT1dFUl9SRUFTT04odHhwb3dlcl9wYXJhbSkJIFwKKwkoKCh0eHBvd2VyX3BhcmFtKSAmIFBERVZfUEFSQU1fVFhQT1dFUl9SRUFTT05fTUFTSykgPj4gUERFVl9QQVJBTV9UWFBPV0VSX1JFQVNPTl9TSElGVCkKKworLyoqCisgKiBUaGlzIGNvbW1hbmQgaXMgc2VudCBmcm9tIFdMQU4gaG9zdCBkcml2ZXIgdG8gZmlybXdhcmUgdG8KKyAqIG5vdGlmeSB0aGUgY3VycmVudCBtb2RlbSBwb3dlciBzdGF0ZS4gSG9zdCB3b3VsZCByZWNlaXZlIGEKKyAqIG1lc3NhZ2UgZnJvbSBtb2RlbSB3aGVuIG1vZGVtIGlzIHBvd2VyZWQgb24uIEhvc3QgZHJpdmVyCisgKiB3b3VsZCB0aGVuIHNlbmQgdGhpcyBjb21tYW5kIHRvIGZpcm13YXJlLiBGaXJtd2FyZSB3b3VsZCB0aGVuCisgKiBwb3dlciBvbiBXQ0ktMiAoVUFSVCkgaW50ZXJmYWNlIGZvciBMVEUvTVdTIENvZXguCisgKgorICogVGhpcyBjb21tYW5kIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgQVBRIHBsYXRmb3JtIHdoaWNoIGhhcworICogbW9kZW0gb24gdGhlIHBsYXRmb3JtLiBJZiBmaXJtd2FyZSBkb2Vzbid0IHN1cHBvcnQgTVdTIENvZXgsCisgKiB0aGlzIGNvbW1hbmQgY2FuIGJlIGRyb3BwZWQgYnkgZmlybXdhcmUuCisgKgorICogVGhpcyBpcyBhIHJlcXVpcmVtZW50IGZyb20gbW9kZW0gdGVhbSB0aGF0IFdDTiBjYW4ndCB0b2dnbGUKKyAqIFVBUlQgYmVmb3JlIG1vZGVtIGlzIHBvd2VyZWQgb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogIFdNSVRMVl9UQUdfU1RSVUNfd21pX21vZGVtX3Bvd2VyX3N0YXRlX2NtZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisKKwkvKiogTW9kZW0gcG93ZXIgc3RhdGUgcGFyYW1ldGVyICovCisJQV9VSU5UMzIgbW9kZW1fcG93ZXJfc3RhdGU7Cit9IHdtaV9tb2RlbV9wb3dlcl9zdGF0ZV9jbWRfcGFyYW07CisKK2VudW0geworCVdNSV9NT0RFTV9TVEFURV9PRkYgPSAwLAorCVdNSV9NT0RFTV9TVEFURV9PTgorfTsKKworI2RlZmluZSBXTUlfUk9BTV9BVVRIX1NUQVRVU19DT05ORUNURUQgICAgICAgMHgxIC8qKiBjb25uZWN0ZWQsIGJ1dCBub3QgYXV0aGVudGljYXRlZCAqLworI2RlZmluZSBXTUlfUk9BTV9BVVRIX1NUQVRVU19BVVRIRU5USUNBVEVEICAgMHgyIC8qKiBjb25uZWN0ZWQgYW5kIGF1dGhlbnRpY2F0ZWQgKi8KKworLyoqIFdNSV9ST0FNX1NZTkNIX0VWRU5UOiByb2FtIHN5bmNoIGV2ZW50IHRyaWdnZXJpbmcgdGhlIGhvc3QgcHJvcGFnYXRpb24gbG9naWMKKyAgICBnZW5lcmF0ZWQgd2hlbmV2ZXIgZmlybXdhcmUgcm9hbWVkIHRvIG5ldyBBUCBzaWxlbnRseSBhbmQKKyAgICAoYSkgSWYgdGhlIGhvc3QgaXMgYXdha2UsIEZXIHNlbmRzIHRoZSBldmVudCB0byB0aGUgaG9zdCBpbW1lZGlhdGVseSAuCisgICAgKGIpIElmIGhvc3QgaXMgaW4gc2xlZXAgdGhlbiBlaXRoZXIKKyAgICAgICAgKDEpIEZXIHdhaXRzIHVudGlsICBob3N0IHNlbmRzIFdNSV9QREVWX1JFU1VNRV9DTURJRCBvciBXTUlfV09XX0hPU1RXQUtFVVBfRlJPTV9TTEVFUF9DTURJRAorICAgIGNvbW1hbmQgdG8gRlcgKHBhcnQgb2YgaG9zdCB3YWtlIHVwIHNlcXVlbmNlICBmcm9tIGxvdyBwb3dlciBtb2RlKSBiZWZvcmUgc2VuZGluZyB0aGUgZXZlbnQgaG9zdC4KKyAgICAgICAgKDIpIGRhdGEvbWdtdCBmcmFtZSBpcyByZWNlaXZlZCBmcm9tIHJvYW1lZCBBUCwgd2hpY2ggbmVlZHMgdG8gcmV0dXJuIHRvIGhvc3QKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9rZXlfbWF0ZXJpYWwgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCisJQV9VSU5UOCBrY2tbR1RLX09GRkxPQURfS0NLX0JZVEVTXTsgICAgICAgICAgICAgLyogRUFQT0wtS2V5IEtleSBDb25maXJtYXRpb24gS2V5IChLQ0spICovCisJQV9VSU5UOCBrZWtbR1RLX09GRkxPQURfS0VLX0JZVEVTXTsgICAgICAgICAgICAgLyogRUFQT0wtS2V5IEtleSBFbmNyeXB0aW9uIEtleSAoS0VLKSAqLworCUFfVUlOVDggcmVwbGF5X2NvdW50ZXJbR1RLX1JFUExBWV9DT1VOVEVSX0JZVEVTXTsKK30gd21pX2tleV9tYXRlcmlhbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fc3luY2hfZXZlbnRfZml4ZWRfcGFyYW0gICovCisJLyoqIFVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViBvbiB3aGljaCByb2FtaW5nIGlzIGRvbmUgYnkgZmlybXdhcmUgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBhdXRoX3N0YXR1czogY29ubmVjdGVkIG9yIGF1dGhvcml6ZWQgKi8KKwlBX1VJTlQzMiBhdXRoX3N0YXR1czsKKwkvKgorCSAqICByb2FtX3JlYXNvbjogd2hldGhlciByb2FtaW5nIHdlbnQgdG8gYSBuZXcgc3VibmV0OworCSAqICBzZWUgV01JX1JPQU1fU1VCTkVUX0NIQU5HRV9TVEFUVVNfWFhYCisJICovCisJQV9VSU5UMzIgcm9hbV9yZWFzb247CisJLyoqIGFzc29jaWF0ZWQgQVAncyByc3NpIGNhbGN1bGF0ZWQgYnkgRlcgd2hlbiByZWFzb24gY29kZSBpcyBXTUlfUk9BTV9SRUFTT05fTE9XX1JTU0kuIG5vdCB2YWxpZCBpZiByb2FtX3JlYXNvbiBpcyBCTUlTUyAqLworCUFfVUlOVDMyIHJzc2k7CisJLyoqIE1BQyBhZGRyZXNzIG9mIHJvYW1lZCBBUCAqLworCXdtaV9tYWNfYWRkciBic3NpZDsgICAgICAgICAgICAgLyogQlNTSUQgKi8KKwkvKiogd2hldGhlciB0aGUgZnJhbWUgaXMgYmVhY29uIG9yIHByb2JlIHJzcCAqLworCUFfVUlOVDMyIGlzX2JlYWNvbjsKKwkvKiogdGhlIGxlbmd0aCBvZiBiZWFjb24vcHJvYmUgcnNwICovCisJQV9VSU5UMzIgYmNuX3Byb2JlX3JzcF9sZW47CisJLyoqIHRoZSBsZW5ndGggb2YgcmVhc3NvYyByc3AgKi8KKwlBX1VJTlQzMiByZWFzc29jX3JzcF9sZW47CisJLyoqCisJICogVExWICh0YWcgbGVuZ3RoIHZhbHVlICkgcGFyYW1ldGVycyBmb2xsb3dzIHJvYW1fc3luY2hfZXZlbnQKKwkgKiBUaGUgVExWJ3MgYXJlOgorCSAqICAgICBBX1VJTlQ4IGJjbl9wcm9iZV9yc3BfZnJhbWVbXTsgIGxlbmd0aCBpZGVudGlmaWVkIGJ5IGJjbl9wcm9iZV9yc3BfbGVuCisJICogICAgIEFfVUlOVDggcmVhc3NvY19yc3BfZnJhbWVbXTsgIGxlbmd0aCBpZGVudGlmaWVkIGJ5IHJlYXNzb2NfcnNwX2xlbgorCSAqICAgICB3bWlfY2hhbm5lbCBjaGFuOworCSAqICAgICB3bWlfa2V5X21hdGVyaWFsIGtleTsKKwkgKiAgICAgQV9VSU5UMzIgc3RhdHVzOyBzdWJuZXQgY2hhbmdlZCBzdGF0dXMgbm90IGJlaW5nIHVzZWQKKwkgKiAgICAgY3VycmVudGx5LiB3aWxsIHBhc3MgdGhlIGluZm9ybWF0aW9uIHVzaW5nIHJvYW1fc3RhdHVzLgorCSAqKi8KK30gd21pX3JvYW1fc3luY2hfZXZlbnRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX1BFRVJfRVNUSU1BVEVEX0xJTktTUEVFRF9JTlZBTElEICAgIDB4RkZGRkZGRkYKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDXyB3bWlfcGVlcl9nZXRfZXN0aW1hdGVkX2xpbmtzcGVlZF9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBNQUMgYWRkcmVzcyBvZiB0aGUgcGVlciBmb3Igd2hpY2ggdGhlIGVzdGltYXRlZCBsaW5rIHNwZWVkIGlzIHJlcXVpcmVkLiAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7Cit9IHdtaV9wZWVyX2dldF9lc3RpbWF0ZWRfbGlua3NwZWVkX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDXyB3bWlfcGVlcl9lc3RpbWF0ZWRfbGlua3NwZWVkX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogTUFDIGFkZHJlc3Mgb2YgdGhlIHBlZXIgZm9yIHdoaWNoIHRoZSBlc3RpbWF0ZWQgbGluayBzcGVlZCBpcyByZXF1aXJlZC4KKwkgKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCS8qIEVzdGltYXRlZCBsaW5rIHNwZWVkIGluIGticHMuCisJICogV2hlbiBlc3RfbGlua3NwZWVkX2ticHMgaXMgbm90IHZhbGlkLCB0aGUgdmFsdWUgaXMgc2V0IHRvIFdNSV9QRUVSX0VTVElNQVRFRF9MSU5LU1BFRURfSU5WQUxJRC4KKwkgKi8KKwlBX1VJTlQzMiBlc3RfbGlua3NwZWVkX2ticHM7Cit9IHdtaV9wZWVyX2VzdGltYXRlZF9saW5rc3BlZWRfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyAqLworCS8qIHZkZXYgSUQgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGRhdGFfbGVuOworCS8qKiBsZW5ndGggaW4gYnl0ZSBvZiBkYXRhW10uICovCisJLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzZW5kIFJFUSBiaW5hcnkgYmxvYnMKKwkgKiBmcm9tIGFwcGxpY2F0aW9uL3NlcnZpY2UgdG8gZmlybXdhcmUgd2hlcmUgSG9zdCBkcnYgaXMgcGFzcyB0aHJvdWdoIC4KKwkgKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMVjoKKwkgKiAgICAgQV9VSU5UOCBkYXRhW107ICAgIC8vIGxlbmd0aCBpbiBieXRlIGdpdmVuIGJ5IGZpZWxkIGRhdGFfbGVuLgorCSAqLworfSB3bWlfcmVxX3N0YXRzX2V4dF9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfc3RhdHMxX2V2ZW50X2ZpeF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHZkZXYgSUQgKi8KKwlBX1VJTlQzMiBkYXRhX2xlbjsKKwkvKiogbGVuZ3RoIGluIGJ5dGUgb2YgZGF0YVtdLiAqLworCS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc2VuZCBSRVEgYmluYXJ5IGJsb2JzCisJICogZnJvbSBmaXJtd2FyZSB0byBhcHBsaWNhdGlvbi9zZXJ2aWNlIHdoZXJlIEhvc3QgZHJ2IGlzIHBhc3MgdGhyb3VnaCAuCisJICogRm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGlzIHRoZSBUTFY6CisJICogICAgIEFfVUlOVDggZGF0YVtdOyAgICAvLyBsZW5ndGggaW4gYnl0ZSBnaXZlbiBieSBmaWVsZCBkYXRhX2xlbi4KKwkgKi8KK30gd21pX3N0YXRzX2V4dF9ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDXyB3bWlfcGVlcl9zdGF0ZV9ldmVudF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsgICAgICAgICAgICAgICAvKiB2ZGV2IElEICovCisJLyogTUFDIGFkZHJlc3Mgb2YgdGhlIHBlZXIgZm9yIHdoaWNoIHRoZSBlc3RpbWF0ZWQgbGluayBzcGVlZCBpcyByZXF1aXJlZC4gKi8KKwl3bWlfbWFjX2FkZHIgcGVlcl9tYWNhZGRyOworCUFfVUlOVDMyIHN0YXRlOyAgICAgICAgIC8qIHBlZXIgc3RhdGUgKi8KK30gd21pX3BlZXJfc3RhdGVfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX3BlZXJfYXNzb2NfY29uZl9ldmVudF9maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyogcGVlciBNQUMgYWRkcmVzcyAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7Cit9IHdtaV9wZWVyX2Fzc29jX2NvbmZfZXZlbnRfZml4ZWRfcGFyYW07CisKK2VudW0geworCVdNSV8yRzRfSFQ0MF9PQlNTX1NDQU5fUEFTU0lWRSA9IDAsCisJLyoqIHNjYW5fdHlwZTogcGFzc2l2ZSAqLworCVdNSV8yRzRfSFQ0MF9PQlNTX1NDQU5fQUNUSVZFLAorCS8qKiBzY2FuX3R5cGU6IGFjdGl2ZSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKgorCSAqIFRMViB0YWcgYW5kIGxlbjsKKwkgKiB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX29ic3Nfc2Nhbl9lbmFsYmVfY21kX2ZpeGVkX3BhcmFtCisJICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKgorCSAqIGFjdGl2ZSBvciBwYXNzaXZlLiBpZiBhY3RpdmUgYWxsIHRoZSBjaGFubmVscyBhcmUgYWN0aXZlbHkgc2Nhbm5lZC4KKwkgKiAgaWYgcGFzc2l2ZSB0aGVuIGFsbCB0aGUgY2hhbm5lbHMgYXJlIHBhc3NpdmVseSBzY2FubmVkCisJICovCisJQV9VSU5UMzIgc2Nhbl90eXBlOworCS8qKgorCSAqIEZXIGNhbiBwZXJmb3JtIG11bHRpcGxlIHNjYW5zIHdpdGggaW4gYSAgT0JTUyBzY2FuIGludGVydmFsLgorCSAqIEZvciBlYWNoIHNjYW4sCisJICogIGlmIHRoZSBzY2FuIGlzIHBhc3NpdmUgdGhlbiBvYnNzX3NjYW5fcGFzc2l2ZV9kd2VsbCBpcyBtaW5pbXVtIGR3ZWxsIHRvIGJlIHVzZWQgZm9yIGVhY2ggY2hhbm5lbCAgLAorCSAqICBpZiB0aGUgc2NhbiBpcyBhY3RpdmUgdGhlbiBvYnNzX3NjYW5fYWN0aXZlX2R3ZWxsIGlzIG1pbmltdW0gZHdlbGwgdG8gYmUgdXNlZCBmb3IgZWFjaCBjaGFubmVsIC4KKwkgKiAgIFRoZSB1bml0IGZvciB0aGVzZSAyIHBhcmFtZXRlcnMgaXMgVFVzLgorCSAqLworCUFfVUlOVDMyIG9ic3Nfc2Nhbl9wYXNzaXZlX2R3ZWxsOworCUFfVUlOVDMyIG9ic3Nfc2Nhbl9hY3RpdmVfZHdlbGw7CisJLyoqCisJICogT0JTUyBzY2FuIGludGVydmFsIC4gRlcgbmVlZHMgdG8gcGVyZm9ybSBvbmUgb3IgbW9yZSBPQlNTIHNjYW5zIHdpdGhpbiB0aGlzIGludGVydmFsIGFuZCBmdWxmaWxsIHRoZQorCSAqICBib3RoIG1pbiBhbmQgdG90YWwgcGVyIGNoYW5uZWwgZHdlbGwgdGltZSByZXF1aXJlbWVudAorCSAqLworCUFfVUlOVDMyIGJzc19jaGFubmVsX3dpZHRoX3RyaWdnZXJfc2Nhbl9pbnRlcnZhbDsKKwkvKioKKwkgKiBGVyBjYW4gcGVyZm9ybSBtdWx0aXBsZSBzY2FucyB3aXRoIGluIGEgIE9CU1Mgc2NhbiBpbnRlcnZhbC4KKwkgKiBGb3IgZWFjaCBzY2FuLAorCSAqIHRoZSB0b3RhbCBwZXIgY2hhbm5lbCBkd2VsbCB0aW1lIGFjcm9zcyBhbGwgc2NhbnMgd2l0aCBpbiBPQlNTIHNjYW4gaW50ZXJ2YWwgc2hvdWxkIGJlCisJICogYXRsZWFzdCBvYnNzX3NjYW5fcGFzc2l2ZV90b3RhbF9wZXIgY2hhbm5lbCBmb3IgcGFzc2l2ZSBzY2FzIGFuZCBvYnNzX3NjYW5fYWN0aXZlX3RvdGFsX3BlciBjaGFubmVsCisJICogZm9yIGFjdGl2ZSBzY2FucyBhbmQgLAorCSAqICAgVGhlIHVuaXQgZm9yIHRoZXNlIDIgcGFyYW1ldGVycyBpcyBUVXMuCisJICovCisJQV9VSU5UMzIgb2Jzc19zY2FuX3Bhc3NpdmVfdG90YWxfcGVyX2NoYW5uZWw7CisJQV9VSU5UMzIgb2Jzc19zY2FuX2FjdGl2ZV90b3RhbF9wZXJfY2hhbm5lbDsKKwlBX1VJTlQzMiBic3Nfd2lkdGhfY2hhbm5lbF90cmFuc2l0aW9uX2RlbGF5X2ZhY3RvcjsKKwkvKiogcGFyYW1ldGVyIHRvIGNoZWNrIGV4ZW1wdGlvbiBmcm9tIHNjYW4gKi8KKwlBX1VJTlQzMiBvYnNzX3NjYW5fYWN0aXZpdHlfdGhyZXNob2xkOworCS8qKiBwYXJhbWV0ZXIgdG8gY2hlY2sgZXhlbXB0aW9uIGZyb20gc2NhbiAqLworCS8qKiBmb2xsb3dpbmcgdHdvIHBhcmFtZXRlcnMgdXNlZCBieSBGVyB0byBmaWxsIElFcyB3aGVuIHNlbmRpbmcgMjAvNDAgY29leGlzdGVuY2UgYWN0aW9uIGZyYW1lIHRvIEFQICovCisJQV9VSU5UMzIgZm9ydHlfbWh6X2ludG9sZXJhbnQ7CisJLyoqIFNUQSA0ME0gYmFuZHdpZHRoIGludG9sZXJhbnQgY2FwYWJpbGl0eSAqLworCUFfVUlOVDMyIGN1cnJlbnRfb3BlcmF0aW5nX2NsYXNzOworCS8qKiBTVEEgY3VycmVudCBvcGVyYXRpbmcgY2xhc3MgKi8KKwkvKiogbGVuZ3RoIG9mIDIuNEdIeiBjaGFubmVsIGxpc3QgdG8gc2NhbiBhdCwgY2hhbm5lbCBsaXN0IGluIHRsdi0+Y2hhbm5lbHNbXSAqLworCUFfVUlOVDMyIGNoYW5uZWxfbGVuOworCS8qKiBsZW5ndGggb2Ygb3B0aW9uYWwgaWUgZGF0YSB0byBhcHBlbmQgdG8gcHJvYmUgcmVxZXN0IHdoZW4gYWN0aXZlIHNjYW4sIGllIGRhdGEgaW4gdGx2LT5pZV9maWVsZFtdICovCisJQV9VSU5UMzIgaWVfbGVuOworfSB3bWlfb2Jzc19zY2FuX2VuYWJsZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKioKKwkgKiBUTFYgdGFnIGFuZCBsZW47CisJICogdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vYnNzX3NjYW5fZGlzYWxiZV9jbWRfZml4ZWRfcGFyYW0KKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCUFfVUlOVDMyIHZkZXZfaWQ7Cit9IHdtaV9vYnNzX3NjYW5fZGlzYWJsZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX29mZmxvYWRfcHJiX3JzcF90eF9zdGF0dXNfZXZlbnRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBwcmIgcnNwIHR4IHN0YXR1cywgdmFsdWVzIGRlZmluZWQgaW4gZW51bSBXTUlfRlJBTUVfVFhfU1RBVFVTICovCisJQV9VSU5UMzIgdHhfc3RhdHVzOworfSB3bWlfb2ZmbG9hZF9wcmJfcnNwX3R4X3N0YXR1c19ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBlbnVtIHsKKwlXTUlfRlJBTUVfVFhfT0ssICAgICAgICAgICAgICAgIC8qIGZyYW1lIHR4IG9rICovCisJV01JX0ZSQU1FX1RYX1hSRVRSWSwgICAgICAgICAgICAvKiBleGNlc3NpdmxleSByZXRyaWVkICovCisJV01JX0ZSQU1FX1RYX0RST1AsICAgICAgICAgICAgICAvKiBmcmFtZSBkcm9wcGVkIGJ5IEZXIGR1ZSB0byByZXNvdXJjZXMgKi8KKwlXTUlfRlJBTUVfVFhfRklMVEVSRUQsICAgICAgICAgIC8qIGZyYW1lIGZpbHRlcmVkIGJ5IGhhcmR3YXJlICovCit9IFdNSV9GUkFNRV9UWF9TVEFUVVM7CisKKy8qKgorICogVGhpcyBjb21tYW5kIGlzIHNlbnQgZnJvbSBXTEFOIGhvc3QgZHJpdmVyIHRvIGZpcm13YXJlIHRvCisgKiByZXF1ZXN0IGZpcm13YXJlIHRvIHNlbmQgdGhlIGxhdGVzdCBjaGFubmVsIGF2b2lkYW5jZSByYW5nZQorICogdG8gaG9zdC4KKyAqCisgKiBUaGlzIGNvbW1hbmQgaXMgb25seSBhcHBsaWNhYmxlIGZvciBBUFEgcGxhdGZvcm0gd2hpY2ggaGFzCisgKiBtb2RlbSBvbiB0aGUgcGxhdGZvcm0uIElmIGZpcm13YXJlIGRvZXNuJ3Qgc3VwcG9ydCBNV1MgQ29leCwKKyAqIHRoaXMgY29tbWFuZCBjYW4gYmUgZHJvcHBlZCBieSBmaXJtd2FyZS4KKyAqCisgKiBIb3N0IHdvdWxkIHNlbmQgdGhpcyBjb21tYW5kIHRvIGZpcm13YXJlIHRvIHJlcXVlc3QgYSBjaGFubmVsCisgKiBhdm9pZGFuY2UgaW5mb3JtYXRpb24gdXBkYXRlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9jaGFuX2F2b2lkX3VwZGF0ZV9jbWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworfSB3bWlfY2hhbl9hdm9pZF91cGRhdGVfY21kX3BhcmFtOworCisvKiBFeHRTY2FuIG9wZXJhdGlvbiBtb2RlICovCit0eXBlZGVmIGVudW0geworCVdNSV9FWFRTQ0FOX01PREVfTk9ORSA9IDB4MDAwMCwKKwlXTUlfRVhUU0NBTl9NT0RFX1NUQVJUID0gMHgwMDAxLCAgICAgICAgICAgICAgICAvKiBFeHRTY2FuL1RhYmxlTW9uaXRvcmluZyBvcGVyYXRpb24gc3RhcnRlZCAqLworCVdNSV9FWFRTQ0FOX01PREVfU1RPUCA9IDB4MDAwMiwgICAgICAgICAvKiBFeHRTY2FuL1RhYmxlTW9uaXRvcmluZyBvcGVyYXRpb24gc3RvcHBlZCAqLworCVdNSV9FWFRTQ0FOX01PREVfSUdOT1JFRCA9IDB4MDAwMywgICAgICAgICAgICAgIC8qIEV4dFNjYW4gY29tbWFuZCBpZ25vcmVkIGR1ZSB0byBlcnJvciAqLworfSB3bWlfZXh0c2Nhbl9vcGVyYXRpb25fbW9kZTsKKworLyogQ2hhbm5lbCBNYXNrICovCit0eXBlZGVmIGVudW0geworCVdNSV9DSEFOTkVMX0JBTkRfVU5TUEVDSUZJRUQgPSAweDAwMDAsCisJV01JX0NIQU5ORUxfQkFORF8yNCA9IDB4MDAwMSwgICAgICAgICAgIC8qIDIuNCBjaGFubmVsICovCisJV01JX0NIQU5ORUxfQkFORF81X05PTl9ERlMgPSAweDAwMDIsICAgICAgICAgICAgLyogNUcgQ2hhbm5lbHMgKE5vIERGUyBjaGFubmVscykgKi8KKwlXTUlfQ0hBTk5FTF9CQU5EX0RGUyA9IDB4MDAwNCwgICAgICAgICAgLyogREZTIGNoYW5uZWxzICovCit9IHdtaV9jaGFubmVsX2JhbmRfbWFzazsKKwordHlwZWRlZiBlbnVtIHsKKwlXTUlfRVhUU0NBTl9DWUNMRV9TVEFSVEVEX0VWRU5UID0gMHgwMDAxLAorCVdNSV9FWFRTQ0FOX0NZQ0xFX0NPTVBMRVRFRF9FVkVOVCA9IDB4MDAwMiwKKwlXTUlfRVhUU0NBTl9CVUNLRVRfU1RBUlRFRF9FVkVOVCA9IDB4MDAwNCwKKwlXTUlfRVhUU0NBTl9CVUNLRVRfQ09NUExFVEVEX0VWRU5UID0gMHgwMDA4LAorCVdNSV9FWFRTQ0FOX0JVQ0tFVF9GQUlMRURfRVZFTlQgPSAweDAwMTAsCisJV01JX0VYVFNDQU5fQlVDS0VUX09WRVJSVU5fRVZFTlQgPSAweDAwMjAsCisKKwlXTUlfRVhUU0NBTl9FVkVOVF9NQVggPSAweDgwMDAKK30gd21pX2V4dHNjYW5fZXZlbnRfdHlwZTsKKworI2RlZmluZSBXTUlfRVhUU0NBTl9DWUNMRV9FVkVOVFNfTUFTSyAgICAoV01JX0VYVFNDQU5fQ1lDTEVfU1RBUlRFRF9FVkVOVCAgIHwgXAorCQkJCQkgIFdNSV9FWFRTQ0FOX0NZQ0xFX0NPTVBMRVRFRF9FVkVOVCkKKworI2RlZmluZSBXTUlfRVhUU0NBTl9CVUNLRVRfRVZFTlRTX01BU0sgICAoV01JX0VYVFNDQU5fQlVDS0VUX1NUQVJURURfRVZFTlQgICB8IFwKKwkJCQkJICBXTUlfRVhUU0NBTl9CVUNLRVRfQ09NUExFVEVEX0VWRU5UIHwgXAorCQkJCQkgIFdNSV9FWFRTQ0FOX0JVQ0tFVF9GQUlMRURfRVZFTlQgICAgfCBcCisJCQkJCSAgV01JX0VYVFNDQU5fQlVDS0VUX09WRVJSVU5fRVZFTlQpCisKK3R5cGVkZWYgZW51bSB7CisJV01JX0VYVFNDQU5fTk9fRk9SV0FSRElORyA9IDB4MDAwMCwKKwlXTUlfRVhUU0NBTl9GT1JXQVJEX0ZSQU1FX1RPX0hPU1QgPSAweDAwMDEKK30gd21pX2V4dHNjYW5fZm9yd2FyZGluZ19mbGFnczsKKwordHlwZWRlZiBlbnVtIHsKKwkvKiBVc2UgTW90aW9uIFNlbnNvciBEZXRlY3Rpb24gKi8KKwlXTUlfRVhUU0NBTl9VU0VfTVNEID0gMHgwMDAxLAorCS8qIEV4dHNjYW4gTFBBU1MgZXh0ZW5kZWQgYmF0Y2hpbmcgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYW5kIGVuYWJsZWQgKi8KKwlXTUlfRVhUU0NBTl9FWFRFTkRFRF9CQVRDSElOR19FTiA9IDB4MDAwMiwKK30gd21pX2V4dHNjYW5fY29uZmlndXJhdGlvbl9mbGFnczsKK3R5cGVkZWYgZW51bSB7CisJLyoKKwkgKiBDYWNoZSB0aGUgcmVzdWx0cyBvZiBidWNrZXQgd2hvc2UKKwkgKiBjb25maWd1cmF0aW9uIGZsYWdzIGhhcyB0aGlzIGJpdCAgc2V0CisJICovCisJV01JX0VYVFNDQU5fQlVDS0VUX0NBQ0hFX1JFU1VMVFMgPSAweDAwMDEsCit9IHdtaV9leHRzY2FuX2J1Y2tldF9jb25maWd1cmF0aW9uX2ZsYWdzOworCit0eXBlZGVmIGVudW0geworCVdNSV9FWFRTQ0FOX1NUQVRVU19PSyA9IDAsCisJV01JX0VYVFNDQU5fU1RBVFVTX0VSUk9SID0gMHg4MDAwMDAwMCwKKwlXTUlfRVhUU0NBTl9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJTLAorCVdNSV9FWFRTQ0FOX1NUQVRVU19JTlRFUk5BTF9FUlJPUgorfSB3bWlfZXh0c2Nhbl9zdGFydF9zdG9wX3N0YXR1czsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBSZXF1ZXN0IElEIC0gdG8gaWRlbnRpZnkgY29tbWFuZC4gQ2Fubm90IGJlIDAgKi8KKwlBX1VJTlQzMiByZXF1ZXN0X2lkOworCS8qKiBSZXF1ZXN0b3IgSUQgLSBjbGllbnQgcmVxdWVzdGluZyBFeHRTY2FuICovCisJQV9VSU5UMzIgcmVxdWVzdG9yX2lkOworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgdGhhdCBpcyByZXF1ZXN0aW5nIHNjYW4gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworfSB3bWlfZXh0c2Nhbl9jb21tYW5kX2lkOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19BUlJBWV9TVFJVQyAqLworCS8qKiBjaGFubmVsIG51bWJlciAqLworCUFfVUlOVDMyIGNoYW5uZWw7CisKKwkvKiogZHdlbGwgdGltZSBpbiBtc2VjIC0gdXNlIGRlZmF1bHRzIGlmIDAgKi8KKwlBX1VJTlQzMiBtaW5fZHdlbGxfdGltZTsKKwlBX1VJTlQzMiBtYXhfZHdlbGxfdGltZTsKKwkvKiogcGFzc2l2ZS9hY3RpdmUgY2hhbm5lbCBhbmQgb3RoZXIgZmxhZ3MgKi8KKwlBX1VJTlQzMiBjb250cm9sX2ZsYWdzOyAgICAgICAgIC8qIDAgPT4gYWN0aXZlLCAxID0+IHBhc3NpdmUgc2NhbjsgaWdub3JlZCBmb3IgREZTICovCit9IHdtaV9leHRzY2FuX2J1Y2tldF9jaGFubmVsOworCisvKiBTY2FuIEJ1Y2tldCBzcGVjaWZpY2F0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19BUlJBWV9TVFJVQyAqLworCS8qKiBCdWNrZXQgSUQgIC0gMC1iYXNlZCAqLworCUFfVUlOVDMyIGJ1Y2tldF9pZDsKKwkvKiogRXh0U2NhbiBldmVudHMgc3Vic2NyaXB0aW9uIC0gZXZlbnRzIHRvIGJlIHJlcG9ydGVkIHRvIGNsaWVudCAoc2VlIHdtaV9leHRzY2FuX2V2ZW50X3R5cGUpICovCisJQV9VSU5UMzIgbm90aWZ5X2V4dHNjYW5fZXZlbnRzOworCS8qKiBPcHRpb25zIHRvIGZvcndhcmQgc2NhbiByZXN1bHRzIC0gc2VlIHdtaV9leHRzY2FuX2ZvcndhcmRpbmdfZmxhZ3MgKi8KKwlBX1VJTlQzMiBmb3J3YXJkaW5nX2ZsYWdzOworCS8qCisJICogRXh0U2NhbiBjb25maWd1cmF0aW9uIGZsYWdzIC0KKwkgKiB3bWlfZXh0c2Nhbl9fYnVja2V0X2NvbmZpZ3VyYXRpb25fZmxhZ3MKKwkgKi8KKwlBX1VJTlQzMiBjb25maWd1cmF0aW9uX2ZsYWdzOworCS8qKiBERVBSRUNBVEVEIG1lbWJlcjptdWx0aXBsaWVyIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHBlcmlvZGljIHNjYW4ncyBiYXNlIHBlcmlvZCAqLworCUFfVUlOVDMyIGJhc2VfcGVyaW9kX211bHRpcGxpZXI7CisJLyoqIGR3ZWxsIHRpbWUgaW4gbXNlYyBvbiBhY3RpdmUgY2hhbm5lbHMgLSB1c2UgZGVmYXVsdHMgaWYgMCAqLworCUFfVUlOVDMyIG1pbl9kd2VsbF90aW1lX2FjdGl2ZTsKKwlBX1VJTlQzMiBtYXhfZHdlbGxfdGltZV9hY3RpdmU7CisJLyoqIGR3ZWxsIHRpbWUgaW4gbXNlYyBvbiBwYXNzaXZlIGNoYW5uZWxzIC0gdXNlIGRlZmF1bHRzIGlmIDAgKi8KKwlBX1VJTlQzMiBtaW5fZHdlbGxfdGltZV9wYXNzaXZlOworCUFfVUlOVDMyIG1heF9kd2VsbF90aW1lX3Bhc3NpdmU7CisJLyoqIHNlZSB3bWlfY2hhbm5lbF9iYW5kX21hc2s7IHdoZW4gZXF1YWwgdG8gV01JX0NIQU5ORUxfVU5TUEVDSUZJRUQsIHVzZSBjaGFubmVsIGxpc3QgKi8KKwlBX1VJTlQzMiBjaGFubmVsX2JhbmQ7CisJLyoqIG51bWJlciBvZiBjaGFubmVscyAoaWYgY2hhbm5lbF9iYW5kIGlzIFdNSV9DSEFOTkVMX1VOU1BFQ0lGSUVEKSAqLworCUFfVUlOVDMyIG51bV9jaGFubmVsczsKKwkvKiogc2NhbiBwZXJpb2QgdXBvbiBzdGFydCBvciByZXN0YXJ0IG9mIHRoZSBidWNrZXQgLSBwZXJpb2RpY2l0eSBvZiB0aGUgYnVja2V0IHRvIGJlZ2luIHdpdGggKi8KKwlBX1VJTlQzMiBtaW5fcGVyaW9kOworCS8qKiBwZXJpb2QgYWJvdmUgd2hpY2ggZXhwb25lbnQgaXMgbm90IGFwcGxpZWQgYW55bW9yZSAqLworCUFfVUlOVDMyICAgICAgICBtYXhfcGVyaW9kOworCS8qKgorCSAqIGJhY2sgb2ZmIHZhbHVlIHRvIGJlIGFwcGxpZWQgdG8gYnVja2V0J3MgcGVyaW9kaWNpdHkgYWZ0ZXIgZXhwX21heF9zdGVwX2NvdW50IHNjYW4gY3ljbGVzCisJICogbmV3X2J1Y2tldF9wZXJpb2QgPSBsYXN0X2J1Y2tldF9wZXJpb2QgKyBsYXN0X2V4cG9uZW50X3BlcmlvZCBleHBfYmFja29mZgorCSAqLworCUFfVUlOVDMyICAgICAgICBleHBfYmFja29mZjsKKwkvKiogbnVtYmVyIG9mIHNjYW5zIHBlcmZvcm1lZCBhdCBhIGdpdmVuIHBlcmlvZGljaXR5IGFmdGVyIHdoaWNoIGV4cG9uZW50aWFsIGJhY2sgb2ZmIHZhbHVlIGlzCisJICogYXBwbGllZCB0byBjdXJyZW50IHBlcmlvZGljaXR5IHRvIG9idGFpbiBhIG5ld2VyIG9uZQorCSAqLworCUFfVUlOVDMyICAgICAgICBleHBfbWF4X3N0ZXBfY291bnQ7CisvKiogRm9sbG93ZWQgYnkgdGhlIHZhcmlhYmxlIGxlbmd0aCBUTFYgY2hhbl9saXN0OgorICogIHdtaV9leHRzY2FuX2J1Y2tldF9jaGFubmVsIGNoYW5fbGlzdFtdICovCit9IHdtaV9leHRzY2FuX2J1Y2tldDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fc3RhcnRfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIFJlcXVlc3QgSUQgLSB0byBpZGVudGlmeSBjb21tYW5kLiBDYW5ub3QgYmUgMCAqLworCUFfVUlOVDMyIHJlcXVlc3RfaWQ7CisJLyoqIFJlcXVlc3RvciBJRCAtIGNsaWVudCByZXF1ZXN0aW5nIEV4dFNjYW4gKi8KKwlBX1VJTlQzMiByZXF1ZXN0b3JfaWQ7CisJLyoqIFZERVYgaWQoaW50ZXJmYWNlKSB0aGF0IGlzIHJlcXVlc3Rpbmcgc2NhbiAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHRhYmxlIElEIC0gdG8gYWxsb3cgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlcXVlc3RzICovCisJQV9VSU5UMzIgdGFibGVfaWQ7CisJLyoqIEJhc2UgcGVyaW9kIChtaWxsaXNlY29uZHMpIHVzZWQgYnkgc2NhbiBidWNrZXRzIHRvIGRlZmluZSBwZXJpb2RpY2l0eSBvZiB0aGUgc2NhbnMgKi8KKwlBX1VJTlQzMiBiYXNlX3BlcmlvZDsKKwkvKiogTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBydW4gLSBvbmUgaXRlcmF0aW9uIGlzIHRoZSBzY2FubmluZyBvZiB0aGUgbGVhc3QgZnJlcXVlbnQgYnVja2V0ICovCisJQV9VSU5UMzIgbWF4X2l0ZXJhdGlvbnM7CisJLyoqIE9wdGlvbnMgdG8gZm9yd2FyZCBzY2FuIHJlc3VsdHMgLSBzZWUgd21pX2V4dHNjYW5fZm9yd2FyZGluZ19mbGFncyAqLworCUFfVUlOVDMyIGZvcndhcmRpbmdfZmxhZ3M7CisJLyoqIEV4dFNjYW4gY29uZmlndXJhdGlvbiBmbGFncyAtIHdtaV9leHRzY2FuX2NvbmZpZ3VyYXRpb25fZmxhZ3MgKi8KKwlBX1VJTlQzMiBjb25maWd1cmF0aW9uX2ZsYWdzOworCS8qKiBFeHRTY2FuIGV2ZW50cyBzdWJzY3JpcHRpb24gLSBiaXRtYXNrIGluZGljYXRpbmcgd2hpY2ggZXZlbnRzIHNob3VsZCBiZSBzZW5kIHRvIGNsaWVudCAoc2VlIHdtaV9leHRzY2FuX2V2ZW50X3R5cGUpICovCisJQV9VSU5UMzIgbm90aWZ5X2V4dHNjYW5fZXZlbnRzOworCS8qKiBTY2FuIFByaW9yaXR5LCBpbnB1dCB0byBzY2FuIHNjaGVkdWxlciAqLworCUFfVUlOVDMyIHNjYW5fcHJpb3JpdHk7CisJLyoqIE1heGltdW0gbnVtYmVyIG9mIEJTU0lEcyB0byBjYWNoZSBvbiBlYWNoIHNjYW4gY3ljbGUgKi8KKwlBX1VJTlQzMiBtYXhfYnNzaWRzX3Blcl9zY2FuX2N5Y2xlOworCS8qKiBNaW5pbXVtIFJTU0kgdmFsdWUgdG8gcmVwb3J0ICovCisJQV9VSU5UMzIgbWluX3Jzc2k7CisJLyoqIE1heGltdW0gdGFibGUgdXNhZ2UgaW4gcGVyY2VudGFnZSAqLworCUFfVUlOVDMyIG1heF90YWJsZV91c2FnZTsKKwkvKiogZGVmYXVsdCBkd2VsbCB0aW1lIGluIG1zZWMgb24gYWN0aXZlIGNoYW5uZWxzICovCisJQV9VSU5UMzIgbWluX2R3ZWxsX3RpbWVfYWN0aXZlOworCUFfVUlOVDMyIG1heF9kd2VsbF90aW1lX2FjdGl2ZTsKKwkvKiogZGVmYXVsdCBkd2VsbCB0aW1lIGluIG1zZWMgb24gcGFzc2l2ZSBjaGFubmVscyAqLworCUFfVUlOVDMyIG1pbl9kd2VsbF90aW1lX3Bhc3NpdmU7CisJQV9VSU5UMzIgbWF4X2R3ZWxsX3RpbWVfcGFzc2l2ZTsKKwkvKiogbWluIHRpbWUgaW4gbXNlYyBvbiB0aGUgQlNTIGNoYW5uZWwsb25seSB2YWxpZCBpZiBhdGxlYXN0IG9uZSBWREVWIGlzIGFjdGl2ZSovCisJQV9VSU5UMzIgbWluX3Jlc3RfdGltZTsKKwkvKiogbWF4IHJlc3QgdGltZSBpbiBtc2VjIG9uIHRoZSBCU1MgY2hhbm5lbCxvbmx5IHZhbGlkIGlmIGF0IGxlYXN0IG9uZSBWREVWIGlzIGFjdGl2ZSovCisJLyoqIHRoZSBzY2FubmVyIHdpbGwgcmVzdCBvbiB0aGUgYnNzIGNoYW5uZWwgYXQgbGVhc3QgbWluX3Jlc3RfdGltZS4gYWZ0ZXIgbWluX3Jlc3RfdGltZSB0aGUgc2Nhbm5lcgorCSAqICB3aWxsIHN0YXJ0IGNoZWNraW5nIGZvciB0eC9yeCBhY3Rpdml0eSBvbiBhbGwgVkRFVnMuIGlmIHRoZXJlIGlzIG5vIGFjdGl2aXR5IHRoZSBzY2FubmVyIHdpbGwKKwkgKiAgc3dpdGNoIHRvIG9mZiBjaGFubmVsLiBpZiB0aGVyZSBpcyBhY3Rpdml0eSB0aGUgc2Nhbm5lciB3aWxsIGxldCB0aGUgcmFkaW8gb24gdGhlIGJzcyBjaGFubmVsCisJICogIHVudGlsIG1heF9yZXN0X3RpbWUgZXhwaXJlcy5hdCBtYXhfcmVzdF90aW1lIHNjYW5uZXIgd2lsbCBzd2l0Y2ggdG8gb2ZmIGNoYW5uZWwKKwkgKiAgaXJyZXNwZWN0aXZlIG9mIGFjdGl2aXR5LiBhY3Rpdml0eSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBpZGxlX3RpbWUgcGFyYW1ldGVyLgorCSAqLworCUFfVUlOVDMyIG1heF9yZXN0X3RpbWU7CisJLyoqIHRpbWUgYmVmb3JlIHNlbmRpbmcgbmV4dCBzZXQgb2YgcHJvYmUgcmVxdWVzdHMuCisJICogICBUaGUgc2Nhbm5lciBrZWVwcyByZXBlYXRpbmcgcHJvYmUgcmVxdWVzdHMgdHJhbnNtaXNzaW9uIHdpdGggcGVyaW9kIHNwZWNpZmllZCBieSByZXBlYXRfcHJvYmVfdGltZS4KKwkgKiAgIFRoZSBudW1iZXIgb2YgcHJvYmUgcmVxdWVzdHMgc3BlY2lmaWVkIGRlcGVuZHMgb24gdGhlIHNzaWRfbGlzdCBhbmQgYnNzaWRfbGlzdAorCSAqLworCS8qKiBNYXggbnVtYmVyIG9mIHByb2JlcyB0byBiZSBzZW50ICovCisJQV9VSU5UMzIgbl9wcm9iZXM7CisJLyoqIHRpbWUgaW4gbXNlYyBiZXR3ZWVuIDIgc2V0cyBvZiBwcm9iZSByZXF1ZXN0cy4gKi8KKwlBX1VJTlQzMiByZXBlYXRfcHJvYmVfdGltZTsKKwkvKiogdGltZSBpbiBtc2VjIGJldHdlZW4gMiBjb25zZXF1ZXRpdmUgcHJvYmUgcmVxdWVzdHMgd2l0aCBpbiBhIHNldC4gKi8KKwlBX1VJTlQzMiBwcm9iZV9zcGFjaW5nX3RpbWU7CisJLyoqIGRhdGEgaW5hY3Rpdml0eSB0aW1lIGluIG1zZWMgb24gYnNzIGNoYW5uZWwgdGhhdCB3aWxsIGJlIHVzZWQgYnkgc2Nhbm5lciBmb3IgbWVhc3VyaW5nIHRoZSBpbmFjdGl2aXR5ICAqLworCUFfVUlOVDMyIGlkbGVfdGltZTsKKwkvKiogbWF4aW11bSB0aW1lIGluIG1zZWMgYWxsb3dlZCBmb3Igc2NhbiAgKi8KKwlBX1VJTlQzMiBtYXhfc2Nhbl90aW1lOworCS8qKiBkZWxheSBpbiBtc2VjIGJlZm9yZSBzZW5kaW5nIGZpcnN0IHByb2JlIHJlcXVlc3QgYWZ0ZXIgc3dpdGNoaW5nIHRvIGEgY2hhbm5lbCAqLworCUFfVUlOVDMyIHByb2JlX2RlbGF5OworCS8qKiBTY2FuIGNvbnRyb2wgZmxhZ3MgKi8KKwlBX1VJTlQzMiBzY2FuX2N0cmxfZmxhZ3M7CisJLyoqIEJ1cnN0IGR1cmF0aW9uIHRpbWUgaW4gbXNlYyovCisJQV9VSU5UMzIgYnVyc3RfZHVyYXRpb247CisKKwkvKiogbnVtYmVyIG9mIGJzc2lkcyBpbiB0aGUgVExWIGJzc2lkX2xpc3RbXSAqLworCUFfVUlOVDMyIG51bV9ic3NpZDsKKwkvKiogbnVtYmVyIG9mIHNzaWQgaW4gdGhlIFRMViBzc2lkX2xpc3RbXSAqLworCUFfVUlOVDMyIG51bV9zc2lkczsKKwkvKiogbnVtYmVyIG9mIGJ5dGVzIGluIFRMViBpZV9kYXRhW10gKi8KKwlBX1VJTlQzMiBpZV9sZW47CisJLyoqIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBUTFYgYnVja2V0X2xpc3RbXSAqLworCUFfVUlOVDMyIG51bV9idWNrZXRzOworCS8qKiBpbiBudW1iZXIgb2Ygc2NhbnMsIHNlbmQgbm90aWZpY2F0aW9ucyB0byBob3N0IGFmdGVyIHRoZXNlIG1hbnkgc2NhbnMgKi8KKwlBX1VJTlQzMiAgICByZXBvcnRfdGhyZXNob2xkX251bV9zY2FuczsKKworCS8qKiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gY2hhbm5lbF9saXN0W10gZGV0ZXJtaW5lZCBieSB0aGUKKwkgICAgc3VtIG9mIHdtaV9leHRzY2FuX2J1Y2tldC5udW1fY2hhbm5lbHMgaW4gYXJyYXkgICovCisKKy8qKgorICogVExWICh0YWcgbGVuZ3RoIHZhbHVlICkgcGFyYW1ldGVycyBmb2xsb3cgdGhlIGV4dHNjYW5fY21kCisgKiBzdHJ1Y3R1cmUuIFRoZSBUTFYncyBhcmU6CisgKiAgICAgd21pX3NzaWQgICAgICAgICAgICAgICAgICAgc3NpZF9saXN0W107CisgKiAgICAgd21pX21hY19hZGRyICAgICAgICAgICAgICAgYnNzaWRfbGlzdFtdOworICogICAgIEFfVUlOVDggICAgICAgICAgICAgICAgICAgIGllX2RhdGFbXTsKKyAqICAgICB3bWlfZXh0c2Nhbl9idWNrZXQgICAgICAgICBidWNrZXRfbGlzdFtdOworICogICAgIHdtaV9leHRzY2FuX2J1Y2tldF9jaGFubmVsIGNoYW5uZWxfbGlzdFtdOworICovCit9IHdtaV9leHRzY2FuX3N0YXJ0X2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fc3RvcF9jbWRfZml4ZWRfcGFyYW0gKi8KKwkvKiogUmVxdWVzdCBJRCAtIHRvIG1hdGNoIHJ1bm5pbmcgY29tbWFuZC4gMCBtYXRjaGVzIGFueSByZXF1ZXN0ICovCisJQV9VSU5UMzIgcmVxdWVzdF9pZDsKKwkvKiogUmVxdWVzdG9yIElEIC0gY2xpZW50IHJlcXVlc3Rpbmcgc3RvcCAqLworCUFfVUlOVDMyIHJlcXVlc3Rvcl9pZDsKKwkvKiogVkRFViBpZChpbnRlcmZhY2UpIHRoYXQgaXMgcmVxdWVzdGluZyBzY2FuICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogdGFibGUgSUQgLSB0byBhbGxvdyBzdXBwb3J0IGZvciBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcmVxdWVzdHMgKi8KKwlBX1VJTlQzMiB0YWJsZV9pZDsKK30gd21pX2V4dHNjYW5fc3RvcF9jbWRfZml4ZWRfcGFyYW07CisKK2VudW0gd21pX2V4dHNjYW5fZ2V0X2NhY2hlZF9yZXN1bHRzX2ZsYWdzIHsKKwlXTUlfRVhUU0NBTl9HRVRfQ0FDSEVEX1JFU1VMVFNfRkxBR19OT05FID0gMHgwMDAwLAorCVdNSV9FWFRTQ0FOX0dFVF9DQUNIRURfUkVTVUxUU19GTEFHX0ZMVVNIX1RBQkxFID0gMHgwMDAxCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHNfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIHJlcXVlc3QgSUQgLSB1c2VkIHRvIGNvcnJlbGF0ZSBjb21tYW5kIHdpdGggZXZlbnRzICovCisJQV9VSU5UMzIgcmVxdWVzdF9pZDsKKwkvKiogUmVxdWVzdG9yIElEIC0gY2xpZW50IHRoYXQgcmVxdWVzdGVkIHJlc3VsdHMgKi8KKwlBX1VJTlQzMiByZXF1ZXN0b3JfaWQ7CisJLyoqIFZERVYgaWQoaW50ZXJmYWNlKSB0aGF0IGlzIHJlcXVlc3Rpbmcgc2NhbiAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHRhYmxlIElEIC0gdG8gYWxsb3cgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlcXVlc3RzICovCisJQV9VSU5UMzIgdGFibGVfaWQ7CisJLyoqIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gYmUgcmV0dXJuZWQgICovCisJQV9VSU5UMzIgbWF4X3Jlc3VsdHM7CisJLyoqIGZsdXNoIEJTU0lEIGxpc3QgLSB3bWlfZXh0c2Nhbl9nZXRfY2FjaGVkX3Jlc3VsdHNfZmxhZ3MgKi8KKwlBX1VJTlQzMiBjb250cm9sX2ZsYWdzOyAgICAgICAgIC8qIGVudW0gd21pX2V4dHNjYW5fZ2V0X2NhY2hlZF9yZXN1bHRzX2ZsYWdzICovCit9IHdtaV9leHRzY2FuX2dldF9jYWNoZWRfcmVzdWx0c19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2dldF93bGFuX2NoYW5nZV9yZXN1bHRzX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiByZXF1ZXN0IElEIC0gdXNlZCB0byBjb3JyZWxhdGUgY29tbWFuZCB3aXRoIGV2ZW50cyAqLworCUFfVUlOVDMyIHJlcXVlc3RfaWQ7CisJLyoqIFJlcXVlc3RvciBJRCAtIGNsaWVudCB0aGF0IHJlcXVlc3RlZCByZXN1bHRzICovCisJQV9VSU5UMzIgcmVxdWVzdG9yX2lkOworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgdGhhdCBpcyByZXF1ZXN0aW5nIHNjYW4gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiB0YWJsZSBJRCAtIHRvIGFsbG93IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNpbXVsdGFuZW91cyByZXF1ZXN0cyAqLworCUFfVUlOVDMyIHRhYmxlX2lkOworfSB3bWlfZXh0c2Nhbl9nZXRfd2xhbl9jaGFuZ2VfcmVzdWx0c19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDICovCisJLyoqYnNzaWQgKi8KKwl3bWlfbWFjX2FkZHIgYnNzaWQ7CisJLyoqY2hhbm5lbCBudW1iZXIgKi8KKwlBX1VJTlQzMiBjaGFubmVsOworCS8qKnVwcGVyIFJTU0kgbGltaXQgKi8KKwlBX1VJTlQzMiB1cHBlcl9yc3NpX2xpbWl0OworCS8qKmxvd2VyIFJTU0kgbGltaXQgKi8KKwlBX1VJTlQzMiBsb3dlcl9yc3NpX2xpbWl0OworfSB3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9ic3NpZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fY29uZmlndXJlX3dsYW5fY2hhbmdlX21vbml0b3JfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIFJlcXVlc3QgSUQgLSB0byBpZGVudGlmeSBjb21tYW5kLiBDYW5ub3QgYmUgMCAqLworCUFfVUlOVDMyIHJlcXVlc3RfaWQ7CisJLyoqIFJlcXVlc3RvciBJRCAtIGNsaWVudCByZXF1ZXN0aW5nIHdsYW4gY2hhbmdlIG1vbml0b3JpbmcgKi8KKwlBX1VJTlQzMiByZXF1ZXN0b3JfaWQ7CisJLyoqIFZERVYgaWQoaW50ZXJmYWNlKSB0aGF0IGlzIHJlcXVlc3Rpbmcgc2NhbiAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHRhYmxlIElEIC0gdG8gYWxsb3cgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHRhYmxlcyAqLworCUFfVUlOVDMyIHRhYmxlX2lkOworCS8qKiBvcGVyYXRpb24gbW9kZTogc3RhcnQvc3RvcCAqLworCUFfVUlOVDMyIG1vZGU7ICAgICAgICAgIC8qIHdtaV9leHRzY2FuX29wZXJhdGlvbl9tb2RlICovCisJLyoqIG51bWJlciBvZiByc3NpIHNhbXBsZXMgdG8gc3RvcmUgKi8KKwlBX1VJTlQzMiBtYXhfcnNzaV9zYW1wbGVzOworCS8qKiBudW1iZXIgb2Ygc2FtcGxlcyB0byB1c2UgdG8gY2FsY3VsYXRlIFJTU0kgYXZlcmFnZSAqLworCUFfVUlOVDMyIHJzc2lfYXZlcmFnaW5nX3NhbXBsZXM7CisJLyoqIG51bWJlciBvZiBzY2FucyB0byBjb25maXJtIGxvc3Mgb2YgY29udGFjdCB3aXRoIFJTU0kgKi8KKwlBX1VJTlQzMiBsb3N0X2FwX3NjYW5fY291bnQ7CisJLyoqIG51bWJlciBvZiBvdXQtb2YtcmFuZ2UgQlNTSURzIG5lY2Vzc2FyeSB0byBzZW5kIGV2ZW50ICovCisJQV9VSU5UMzIgbWF4X291dF9vZl9yYW5nZV9jb3VudDsKKwkvKiogdG90YWwgbnVtYmVyIG9mIGJzc2lkIHNpZ25hbCBkZXNjcmlwdG9ycyAoaW4gYWxsIHBhZ2VzKSAqLworCUFfVUlOVDMyIHRvdGFsX2VudHJpZXM7CisJLyoqIGluZGV4IG9mIHRoZSBmaXJzdCBic3NpZCBlbnRyeSBmb3VuZCBpbiB0aGUgVExWIHdsYW5fY2hhbmdlX2Rlc2NyaXB0b3JfbGlzdCovCisJQV9VSU5UMzIgZmlyc3RfZW50cnlfaW5kZXg7CisJLyoqIG51bWJlciBvZiBic3NpZCBzaWduYWwgZGVzY3JpcHRvcnMgaW4gdGhpcyBwYWdlICovCisJQV9VSU5UMzIgbnVtX2VudHJpZXNfaW5fcGFnZTsKKwkvKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMVjoKKwkgKiAgICAgd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfYnNzaWRfcGFyYW0gd2xhbl9jaGFuZ2VfZGVzY3JpcHRvcl9saXN0W107ICAgIC8vIG51bWJlciBvZiBlbGVtZW50cyBnaXZlbiBieSBmaWVsZCBudW1fcGFnZV9lbnRyaWVzLgorCSAqLworfSB3bWlfZXh0c2Nhbl9jb25maWd1cmVfd2xhbl9jaGFuZ2VfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19BUlJBWV9TVFJVQyAqLworCUFfVUlOVDMyICAgICAgICB0bHZfaGVhZGVyOworCS8qKnNzaWQgKi8KKwl3bWlfc3NpZCAgICAgICAgc3NpZDsKKwkvKipiYW5kICovCisJQV9VSU5UMzIgICAgICAgIGJhbmQ7CisJLyoqUlNTSSB0aHJlc2hvbGQgZm9yIHJlcG9ydGluZyAqLworCUFfVUlOVDMyICAgICAgICBtaW5fcnNzaTsKKwlBX1VJTlQzMiAgICAgICAgbWF4X3Jzc2k7Cit9IHdtaV9leHRzY2FuX2hvdGxpc3Rfc3NpZF9lbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKgorCSAqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIE1JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9jb25maWd1cmVfaG90bGlzdF9zc2lkX21vbml0b3JfY21kX2ZpeGVkX3BhcmFtCisJICovCisJQV9VSU5UMzIgICAgdGx2X2hlYWRlcjsKKwkvKiogUmVxdWVzdCBJRCAtIHRvIGlkZW50aWZ5IGNvbW1hbmQuIENhbm5vdCBiZSAwICovCisJQV9VSU5UMzIgICAgcmVxdWVzdF9pZDsKKwkvKiogUmVxdWVzdG9yIElEIC0gY2xpZW50IHJlcXVlc3RpbmcgaG90bGlzdCBzc2lkIG1vbml0b3JpbmcgKi8KKwlBX1VJTlQzMiAgICByZXF1ZXN0b3JfaWQ7CisJLyoqIFZERVYgaWQoaW50ZXJmYWNlKSB0aGF0IGlzIHJlcXVlc3Rpbmcgc2NhbiAqLworCUFfVUlOVDMyICAgIHZkZXZfaWQ7CisJLyoqIHRhYmxlIElEIC0gdG8gYWxsb3cgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHRhYmxlcyAqLworCUFfVUlOVDMyICAgIHRhYmxlX2lkOworCS8qKiBvcGVyYXRpb24gbW9kZTogc3RhcnQvc3RvcCAqLworCUFfVUlOVDMyICAgIG1vZGU7ICAgIC8vIHdtaV9leHRzY2FuX29wZXJhdGlvbl9tb2RlCisJLyoqdG90YWwgbnVtYmVyIG9mIHNzaWRzIChpbiBhbGwgcGFnZXMpICovCisJQV9VSU5UMzIgICAgdG90YWxfZW50cmllczsKKwkvKippbmRleCBvZiB0aGUgZmlyc3Qgc3NpZCBlbnRyeSBmb3VuZCBpbiB0aGUgVExWIGV4dHNjYW5faG90bGlzdF9zc2lkX2VudHJ5Ki8KKwlBX1VJTlQzMiAgICBmaXJzdF9lbnRyeV9pbmRleDsKKwkvKipudW1iZXIgb2Ygc3NpZHMgaW4gdGhpcyBwYWdlICovCisJQV9VSU5UMzIgICAgbnVtX2VudHJpZXNfaW5fcGFnZTsKKwkvKiogbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHNjYW5zIHRvIGNvbmZpcm0gbG9zcyBvZiBhbiBzc2lkICoqLworCUFfVUlOVDMyICAgIGxvc3RfYXBfc2Nhbl9jb3VudDsKKwkvKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMVjoKKwkgKiAgd21pX2V4dHNjYW5faG90bGlzdF9zc2lkX2VudHJ5IGhvdGxpc3Rfc3NpZFtdOworCSAqIG51bWJlciBvZiBlbGVtZW50IGdpdmVuIGJ5IGZpZWxkIG51bV9wYWdlX2VudHJpZXMuCisJICovCit9IHdtaV9leHRzY2FuX2NvbmZpZ3VyZV9ob3RsaXN0X3NzaWRfbW9uaXRvcl9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDICovCisJLyoqYnNzaWQgKi8KKwl3bWlfbWFjX2FkZHIgYnNzaWQ7CisJLyoqUlNTSSAgbWluIHRocmVzaG9sZCBmb3IgcmVwb3J0aW5nICovCisJQV9VSU5UMzIgbWluX3Jzc2k7CisJLyoqRGVwcmVjYXRlZCBlbnRyeSAgY2hhbm5lbCBudW1iZXIgKi8KKwlBX1VJTlQzMiBjaGFubmVsOworCS8qKiBSU1NJIG1heCB0aHJlc2hvbGQgZm9yIHJlcG9ydGluZyAqLworCUFfVUlOVDMyIG1heF9yc3NpOworfSB3bWlfZXh0c2Nhbl9ob3RsaXN0X2VudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9jb25maWd1cmVfaG90bGlzdF9tb25pdG9yX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiBSZXF1ZXN0IElEIC0gdG8gaWRlbnRpZnkgY29tbWFuZC4gQ2Fubm90IGJlIDAgKi8KKwlBX1VJTlQzMiByZXF1ZXN0X2lkOworCS8qKiBSZXF1ZXN0b3IgSUQgLSBjbGllbnQgcmVxdWVzdGluZyBob3RsaXN0IG1vbml0b3JpbmcgKi8KKwlBX1VJTlQzMiByZXF1ZXN0b3JfaWQ7CisJLyoqIFZERVYgaWQoaW50ZXJmYWNlKSB0aGF0IGlzIHJlcXVlc3Rpbmcgc2NhbiAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHRhYmxlIElEIC0gdG8gYWxsb3cgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHRhYmxlcyAqLworCUFfVUlOVDMyIHRhYmxlX2lkOworCS8qKiBvcGVyYXRpb24gbW9kZTogc3RhcnQvc3RvcCAqLworCUFfVUlOVDMyIG1vZGU7ICAgICAgICAgIC8qIHdtaV9leHRzY2FuX29wZXJhdGlvbl9tb2RlICovCisJLyoqdG90YWwgbnVtYmVyIG9mIGJzc2lkcyAoaW4gYWxsIHBhZ2VzKSAqLworCUFfVUlOVDMyIHRvdGFsX2VudHJpZXM7CisJLyoqaW5kZXggb2YgdGhlIGZpcnN0IGJzc2lkIGVudHJ5IGZvdW5kIGluIHRoZSBUTFYgd21pX2V4dHNjYW5faG90bGlzdF9lbnRyeSovCisJQV9VSU5UMzIgZmlyc3RfZW50cnlfaW5kZXg7CisJLyoqbnVtYmVyIG9mIGJzc2lkcyBpbiB0aGlzIHBhZ2UgKi8KKwlBX1VJTlQzMiBudW1fZW50cmllc19pbl9wYWdlOworCS8qKiBudW1iZXIgb2YgY29uc2VjdXRpdmUgc2NhbnMgdG8gY29uZmlybSBsb3NzIG9mIGNvbnRhY3Qgd2l0aCBBUCAqLworCUFfVUlOVDMyIGxvc3RfYXBfc2Nhbl9jb3VudDsKKwkvKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMVjoKKwkgKiAgICAgd21pX2V4dHNjYW5faG90bGlzdF9lbnRyeSBob3RsaXN0W107ICAgIC8vIG51bWJlciBvZiBlbGVtZW50cyBnaXZlbiBieSBmaWVsZCBudW1fcGFnZV9lbnRyaWVzLgorCSAqLworfSB3bWlfZXh0c2Nhbl9jb25maWd1cmVfaG90bGlzdF9tb25pdG9yX2NtZF9maXhlZF9wYXJhbTsKKworIHR5cGVkZWYgc3RydWN0IHsKKwkvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKldNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5faG90bGlzdF9tYXRjaF9ldmVudF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyICAgICB0bHZfaGVhZGVyOworCS8qKiBSZXF1ZXN0IElEIG9mIHRoZSBXTUlfRVhUU0NBTl9DT05GSUdVUkVfSE9UTElTVF9TU0lEX01PTklUT1JfQ01ESUQgdGhhdCBjb25maWd1cmVkIHRoZSB0YWJsZSAqLworCUFfVUlOVDMyICAgICBjb25maWdfcmVxdWVzdF9pZDsKKwkvKiogUmVxdWVzdG9yIElEIG9mIHRoZSBXTUlfRVhUU0NBTl9DT05GSUdVUkVfSE9UTElTVF9TU0lEX01PTklUT1JfQ01ESUQKKwl0aGF0IGNvbmZpZ3VyZWQgdGhlIHRhYmxlICovCisJQV9VSU5UMzIgICAgIGNvbmZpZ19yZXF1ZXN0b3JfaWQ7CisJLyoqCisJICogVkRFViBpZChpbnRlcmZhY2UpIG9mIHRoZQorCSAqIFdNSV9FWFRTQ0FOX0NPTkZJR1VSRV9IT1RMSVNUX1NTSURfTU9OSVRPUl9DTURJRCB0aGF0IGNvbmZpZ3VyZWQgdGhlIHRhYmxlCisJICovCisJQV9VSU5UMzIgICAgIGNvbmZpZ192ZGV2X2lkOworCS8qKiB0YWJsZSBJRCAtIHRvIGFsbG93IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNpbXVsdGFuZW91cyB0YWJsZXMgKi8KKwlBX1VJTlQzMiAgICAgdGFibGVfaWQ7CisJLyoqdG90YWwgbnVtYmVyIG9mIHNzaWRzIChpbiBhbGwgcGFnZXMpICovCisJQV9VSU5UMzIgICAgIHRvdGFsX2VudHJpZXM7CisJLyoqaW5kZXggb2YgdGhlIGZpcnN0IHNzaWQgZW50cnkgZm91bmQgaW4gdGhlIFRMViB3bWlfZXh0c2Nhbl93bGFuX2Rlc2NyaXB0b3IqLworCUFfVUlOVDMyICAgICBmaXJzdF9lbnRyeV9pbmRleDsKKwkvKipudW1iZXIgb2Ygc3NpZHMgaW4gdGhpcyBwYWdlICovCisJQV9VSU5UMzIgICAgIG51bV9lbnRyaWVzX2luX3BhZ2U7CisJLyogIEZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgVExWOgorCSAqICB3bWlfZXh0c2Nhbl93bGFuX2Rlc2NyaXB0b3IgaG90bGlzdF9tYXRjaFtdOworCSAqICBudW1iZXIgb2YgZGVzY3JpcHRvcnMgZ2l2ZW4gYnkgZmllbGQgbnVtX2VudHJpZXNfaW5fcGFnZQorCSAqLworfSB3bWlfZXh0c2Nhbl9ob3RsaXN0X3NzaWRfbWF0Y2hfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDICovCisJLyoqIHRhYmxlIElEIC0gdG8gYWxsb3cgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHRhYmxlcyAqLworCUFfVUlOVDMyIHRhYmxlX2lkOworCS8qKiBzaXplIGluIGJ5dGVzIG9mIHNjYW4gY2FjaGUgZW50cnkgKi8KKwlBX1VJTlQzMiBzY2FuX2NhY2hlX2VudHJ5X3NpemU7CisJLyoqIG1heGltdW0gbnVtYmVyIG9mIHNjYW4gY2FjaGUgZW50cmllcyAqLworCUFfVUlOVDMyIG1heF9zY2FuX2NhY2hlX2VudHJpZXM7CisJLyoqIG1heGltdW0gbnVtYmVyIG9mIGJ1Y2tldHMgcGVyIGV4dHNjYW4gcmVxdWVzdCAqLworCUFfVUlOVDMyIG1heF9idWNrZXRzOworCS8qKiBtYXhpbXVtIG51bWJlciBvZiBCU1NJRHMgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiBlYWNoIHNjYW4gKGJlc3Qgbi93IGFzIHBlciBSU1NJKSAqLworCUFfVUlOVDMyIG1heF9ic3NpZF9wZXJfc2NhbjsKKwkvKiogdGFibGUgdXNhZ2UgbGV2ZWwgYXQgd2hpY2ggaW5kaWNhdGlvbiBtdXN0IGJlIHNlbnQgdG8gaG9zdCAqLworCUFfVUlOVDMyIG1heF90YWJsZV91c2FnZV90aHJlc2hvbGQ7Cit9IHdtaV9leHRzY2FuX2NhY2hlX2NhcGFiaWxpdGllczsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMgKi8KKwkvKiogdGFibGUgSUQgLSB0byBhbGxvdyBzdXBwb3J0IGZvciBtdWx0aXBsZSBzaW11bHRhbmVvdXMgdGFibGVzICovCisJQV9VSU5UMzIgdGFibGVfaWQ7CisJLyoqIHNpemUgaW4gYnl0ZXMgb2Ygd2xhbiBjaGFuZ2UgZW50cnkgKi8KKwlBX1VJTlQzMiB3bGFuX2NoYW5nZV9lbnRyeV9zaXplOworCS8qKiBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGluIHdsYW4gY2hhbmdlIHRhYmxlICovCisJQV9VSU5UMzIgbWF4X3dsYW5fY2hhbmdlX2VudHJpZXM7CisJLyoqIG51bWJlciBvZiBSU1NJIHNhbXBsZXMgdXNlZCBmb3IgYXZlcmFnaW5nIFJTU0kgKi8KKwlBX1VJTlQzMiBtYXhfcnNzaV9hdmVyYWdpbmdfc2FtcGxlczsKKwkvKiogbnVtYmVyIG9mIEJTU0lEL1JTU0kgZW50cmllcyAoQlNTSUQgcG9pbnRlciwgUlNTSSwgdGltZXN0YW1wKSB0aGF0IGRldmljZSBjYW4gaG9sZCAqLworCUFfVUlOVDMyIG1heF9yc3NpX2hpc3RvcnlfZW50cmllczsKK30gd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfbW9uaXRvcl9jYXBhYmlsaXRpZXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDICovCisJLyoqIHRhYmxlIElEIC0gdG8gYWxsb3cgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHRhYmxlcyAqLworCUFfVUlOVDMyIHRhYmxlX2lkOworCS8qKiBzaXplIGluIGJ5dGVzIG9mIGhvdGxpc3QgZW50cnkgKi8KKwlBX1VJTlQzMiB3bGFuX2hvdGxpc3RfZW50cnlfc2l6ZTsKKwkvKiogbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBpbiB3bGFuIGNoYW5nZSB0YWJsZSAqLworCUFfVUlOVDMyIG1heF9ob3RsaXN0X2VudHJpZXM7Cit9IHdtaV9leHRzY2FuX2hvdGxpc3RfbW9uaXRvcl9jYXBhYmlsaXRpZXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3NldF9jYXBhYmlsaXRpZXNfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIFJlcXVlc3QgSUQgLSBtYXRjaGVzIHJlcXVlc3QgSUQgdXNlZCB0byBzdGFydCBob3QgbGlzdCBtb25pdG9yaW5nICovCisJQV9VSU5UMzIgcmVxdWVzdF9pZDsKKwkvKiogUmVxdWVzdG9yIElEIC0gY2xpZW50IHJlcXVlc3Rpbmcgc3RvcCAqLworCUFfVUlOVDMyIHJlcXVlc3Rvcl9pZDsKKwkvKiogbnVtYmVyIG9mIGV4dHNjYW4gY2FjaGVzICovCisJQV9VSU5UMzIgbnVtX2V4dHNjYW5fY2FjaGVfdGFibGVzOworCS8qKiBudW1iZXIgb2Ygd2xhbiBjaGFuZ2UgbGlzdHMgKi8KKwlBX1VJTlQzMiBudW1fd2xhbl9jaGFuZ2VfbW9uaXRvcl90YWJsZXM7CisJLyoqIG51bWJlciBvZiBob3RsaXN0cyAqLworCUFfVUlOVDMyIG51bV9ob3RsaXN0X21vbml0b3JfdGFibGVzOworCS8qKiBpZiBvbmUgc2lkZWQgcnR0IGRhdGEgY29sbGVjdGlvbiBpcyBzdXBwb3J0ZWQgKi8KKwlBX1VJTlQzMiBydHRfb25lX3NpZGVkX3N1cHBvcnRlZDsKKwkvKiogaWYgMTF2IGRhdGEgY29sbGVjdGlvbiBpcyBzdXBwb3J0ZWQgKi8KKwlBX1VJTlQzMiBydHRfMTF2X3N1cHBvcnRlZDsKKwkvKiogaWYgMTFtYyBkYXRhIGNvbGxlY3Rpb24gaXMgc3VwcG9ydGVkICovCisJQV9VSU5UMzIgcnR0X2Z0bV9zdXBwb3J0ZWQ7CisJLyoqIG51bWJlciBvZiBleHRzY2FuIGNhY2hlIGNhcGFiaWxpdGllcyAob25lIHBlciB0YWJsZSkgICovCisJQV9VSU5UMzIgbnVtX2V4dHNjYW5fY2FjaGVfY2FwYWJpbGl0aWVzOworCS8qKiBudW1iZXIgb2Ygd2xhbiBjaGFuZ2UgIGNhcGFiaWxpdGllcyAob25lIHBlciB0YWJsZSkgICovCisJQV9VSU5UMzIgbnVtX2V4dHNjYW5fd2xhbl9jaGFuZ2VfY2FwYWJpbGl0aWVzOworCS8qKiBudW1iZXIgb2YgZXh0c2NhbiBob3RsaXN0IGNhcGFiaWxpdGllcyAob25lIHBlciB0YWJsZSkgICovCisJQV9VSU5UMzIgbnVtX2V4dHNjYW5faG90bGlzdF9jYXBhYmlsaXRpZXM7CisJLyogRm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGlzIHRoZSBUTFY6CisJICogICAgIHdtaV9leHRzY2FuX2NhY2hlX2NhcGFiaWxpdGllcyAgICAgICAgICAgICAgIGV4dHNjYW5fY2FjaGVfY2FwYWJpbGl0aWVzOyAvLyBudW1iZXIgb2YgY2FwYWJpbGl0aWVzIGdpdmVuIGJ5IG51bV9leHRzY2FuX2NhY2hlcworCSAqICAgICB3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9tb25pdG9yX2NhcGFiaWxpdGllcyB3bGFuX2NoYW5nZV9jYXBhYmlsaXRpZXM7ICAgLy8gbnVtYmVyIG9mIGNhcGFiaWxpdGllcyBnaXZlbiBieSBudW1fd2xhbl9jaGFuZ2VfbW9uaXRvcl90YWJsZXMKKwkgKiAgICAgd21pX2V4dHNjYW5faG90bGlzdF9tb25pdG9yX2NhcGFiaWxpdGllcyAgICAgaG90bGlzdF9jYXBhYmlsaXRpZXM7ICAgICAgIC8vIG51bWJlciBvZiBjYXBhYmlsaXRpZXMgZ2l2ZW4gYnkgbnVtX2hvdGxpc3RfbW9uaXRvcl90YWJsZXMKKwkgKi8KK30gd21pX2V4dHNjYW5fc2V0X2NhcGFiaWxpdGllc19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2dldF9jYXBhYmlsaXRpZXNfY21kX2ZpeGVkX3BhcmFtICovCisJLyoqIFJlcXVlc3QgSUQgLSBtYXRjaGVzIHJlcXVlc3QgSUQgdXNlZCB0byBzdGFydCBob3QgbGlzdCBtb25pdG9yaW5nICovCisJQV9VSU5UMzIgcmVxdWVzdF9pZDsKKwkvKiogUmVxdWVzdG9yIElEIC0gY2xpZW50IHJlcXVlc3RpbmcgY2FwYWJpbGl0aWVzICovCisJQV9VSU5UMzIgcmVxdWVzdG9yX2lkOworfSB3bWlfZXh0c2Nhbl9nZXRfY2FwYWJpbGl0aWVzX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5fc3RhcnRfc3RvcF9ldmVudF9maXhlZF9wYXJhbSAqLworCS8qKiBSZXF1ZXN0IElEIG9mIHRoZSBvcGVyYXRpb24gdGhhdCB3YXMgc3RhcnRlZC9zdG9wcGVkICovCisJQV9VSU5UMzIgcmVxdWVzdF9pZDsKKwkvKiogUmVxdWVzdG9yIElEIG9mIHRoZSBvcGVyYXRpb24gdGhhdCB3YXMgc3RhcnRlZC9zdG9wcGVkICovCisJQV9VSU5UMzIgcmVxdWVzdG9yX2lkOworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgb2YgdGhlIG9wZXJhdGlvbiB0aGF0IHdhcyBzdGFydGVkL3N0b3BwZWQgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBleHRzY2FuIFdNSSBjb21tYW5kICovCisJQV9VSU5UMzIgY29tbWFuZDsKKwkvKiogb3BlcmF0aW9uIG1vZGU6IHN0YXJ0L3N0b3AgKi8KKwlBX1VJTlQzMiBtb2RlOyAgICAgICAgICAvKiB3bWlfZXh0c2Nhbl9vcGVyYXRpb25fbW9kZSAqLworCS8qKnN1Y2Nlc3MvZmFpbHVyZSAqLworCUFfVUlOVDMyIHN0YXR1czsgICAgICAgICAgICAgICAgLyogZW51bSB3bWlfZXh0c2Nhbl9zdGFydF9zdG9wX3N0YXR1cyAqLworCS8qKiB0YWJsZSBJRCAtIHRvIGFsbG93IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNpbXVsdGFuZW91cyByZXF1ZXN0cyAqLworCUFfVUlOVDMyIHRhYmxlX2lkOworfSB3bWlfZXh0c2Nhbl9zdGFydF9zdG9wX2V2ZW50X2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9vcGVyYXRpb25fZXZlbnRfZml4ZWRfcGFyYW0gKi8KKwkvKiogUmVxdWVzdCBJRCBvZiB0aGUgZXh0c2NhbiBvcGVyYXRpb24gdGhhdCBpcyBjdXJyZW50bHkgcnVubmluZyAqLworCUFfVUlOVDMyIHJlcXVlc3RfaWQ7CisJLyoqIFJlcXVlc3RvciBJRCBvZiB0aGUgZXh0c2NhbiBvcGVyYXRpb24gdGhhdCBpcyBjdXJyZW50bHkgcnVubmluZyAqLworCUFfVUlOVDMyIHJlcXVlc3Rvcl9pZDsKKwkvKiogVkRFViBpZChpbnRlcmZhY2UpIG9mIHRoZSBleHRzY2FuIG9wZXJhdGlvbiB0aGF0IGlzIGN1cnJlbnRseSBydW5uaW5nICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogc2NhbiBldmVudCAod21pX3NjYW5fZXZlbnRfdHlwZSkgKi8KKwlBX1VJTlQzMiBldmVudDsgICAgICAgICAvKiB3bWlfZXh0c2Nhbl9ldmVudF90eXBlICovCisJLyoqIHRhYmxlIElEIC0gdG8gYWxsb3cgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlcXVlc3RzICovCisJQV9VSU5UMzIgdGFibGVfaWQ7CisJLyoqbnVtYmVyIG9mIGJ1Y2tldHMgKi8KKwlBX1VJTlQzMiBudW1fYnVja2V0czsKKwkvKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMVjoKKwkgKiAgICAgQV9VSU5UMzIgICAgYnVja2V0X2lkW107ICAgIC8vIG51bWJlciBvZiBlbGVtZW50cyBnaXZlbiBieSBmaWVsZCBudW1fYnVja2V0cy4KKwkgKi8KK30gd21pX2V4dHNjYW5fb3BlcmF0aW9uX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiBUeXBlcyBvZiBleHRzY2FuIHRhYmxlcyAqLwordHlwZWRlZiBlbnVtIHsKKwlFWFRTQ0FOX1RBQkxFX05PTkUgPSAwLAorCUVYVFNDQU5fVEFCTEVfQlNTSUQgPSAxLAorCUVYVFNDQU5fVEFCTEVfUlNTSSA9IDIsCit9IHdtaV9leHRzY2FuX3RhYmxlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3RhYmxlX3VzYWdlX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJLyoqIFJlcXVlc3QgSUQgb2YgdGhlIGV4dHNjYW4gb3BlcmF0aW9uIHRoYXQgaXMgY3VycmVudGx5IHJ1bm5pbmcgKi8KKwlBX1VJTlQzMiByZXF1ZXN0X2lkOworCS8qKiBSZXF1ZXN0b3IgSUQgb2YgdGhlIGV4dHNjYW4gb3BlcmF0aW9uIHRoYXQgaXMgY3VycmVudGx5IHJ1bm5pbmcgKi8KKwlBX1VJTlQzMiByZXF1ZXN0b3JfaWQ7CisJLyoqIFZERVYgaWQoaW50ZXJmYWNlKSBvZiB0aGUgZXh0c2NhbiBvcGVyYXRpb24gdGhhdCBpcyBjdXJyZW50bHkgcnVubmluZyAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIHRhYmxlIElEIC0gdG8gYWxsb3cgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHRhYmxlcyAqLworCUFfVUlOVDMyIHRhYmxlX2lkOworCS8qKnNlZSB3bWlfZXh0c2Nhbl90YWJsZV90eXBlIGZvciB0YWJsZSByZXBvcnRpbmcgdXNhZ2UgKi8KKwlBX1VJTlQzMiB0YWJsZV90eXBlOworCS8qKm51bWJlciBvZiBlbnRyaWVzIGluIHVzZSAqLworCUFfVUlOVDMyIGVudHJpZXNfaW5fdXNlOworCS8qKm1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGFibGUgKi8KKwlBX1VJTlQzMiBtYXhpbXVtX2VudHJpZXM7Cit9IHdtaV9leHRzY2FuX3RhYmxlX3VzYWdlX2V2ZW50X2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCS8qKgorCSAqIEluZGljYXRlcyBzY2FuIGdvdCBpbnRlcnJ1cHRlZCBpLmUuIGFib3J0ZWQgb3IgcHJlLWVtcHRlZCBmb3IgYSBsb25nIHRpbWUgKD4gMXNlYykKKwkgKiB0aGlzIGNhbiBiZSB1c2VkIHRvIGRpc2NhcmQgc2NhbiByZXN1bHRzCisJICovCisJV01JX1NDQU5fU1RBVFVTX0lOVEVSUlVQVEVEID0gMQorfSB3bWlfc2Nhbl9zdGF0dXNfZmxhZ3M7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMgKi8KKwkvKipSU1NJICovCisJQV9VSU5UMzIgcnNzaTsKKwkvKip0aW1lIHN0YW1wIGluIG1pbGxpc2Vjb25kcyAqLworCUFfVUlOVDMyIHRzdGFtcDsKKwkvKiogRXh0c2NhbiBjeWNsZSBkdXJpbmcgd2hpY2ggdGhpcyBlbnRyeSB3YXMgc2Nhbm5lZCAqLworCUFfVUlOVDMyICAgIHNjYW5fY3ljbGVfaWQ7CisJLyoqCisJICogZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgZ2l2ZW4gcmVzdWx0IHdhcyBvYnRhaW5lZCBhcyBwYXJ0IG9mCisJICogaW50ZXJydXB0ZWQgKGFib3J0ZWQvbGFyZ2UgdGltZSBnYXAgcHJlZW1wdGVkKSBzY2FuCisJICovCisJQV9VSU5UMzIgICAgZmxhZ3M7Cit9IHdtaV9leHRzY2FuX3Jzc2lfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfQVJSQVlfU1RSVUMgKi8KKwkvKipic3NpZCAqLworCXdtaV9tYWNfYWRkciBic3NpZDsKKwkvKipzc2lkICovCisJd21pX3NzaWQgc3NpZDsKKwkvKipjaGFubmVsIG51bWJlciAqLworCUFfVUlOVDMyIGNoYW5uZWw7CisJLyogY2FwYWJpbGl0aWVzICovCisJQV9VSU5UMzIgY2FwYWJpbGl0aWVzOworCS8qIGJlYWNvbiBpbnRlcnZhbCBpbiBUVXMgKi8KKwlBX1VJTlQzMiBiZWFjb25faW50ZXJ2YWw7CisJLyoqdGltZSBzdGFtcCBpbiBtaWxsaXNlY29uZHMgLSB0aW1lIGxhc3Qgc2VlbiAqLworCUFfVUlOVDMyIHRzdGFtcDsKKwkvKipmbGFncyAtIF90RXh0U2NhbkVudHJ5RmxhZ3MgKi8KKwlBX1VJTlQzMiBmbGFnczsKKwkvKipSVFQgaW4gbnMgKi8KKwlBX1VJTlQzMiBydHQ7CisJLyoqcnR0IHN0YW5kYXJkIGRldmlhdGlvbiAqLworCUFfVUlOVDMyIHJ0dF9zZDsKKwkvKiByc3NpIGluZm9ybWF0aW9uICovCisJQV9VSU5UMzIgbnVtYmVyX3Jzc2lfc2FtcGxlczsKKwkvKiogSUUgbGVuZ3RoICovCisJQV9VSU5UMzIgaWVfbGVuZ3RoOyAgICAgICAgICAgICAvKiBsZW5ndGggb2YgSUUgZGF0YSAqLworfSB3bWlfZXh0c2Nhbl93bGFuX2Rlc2NyaXB0b3I7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2NhY2hlZF9yZXN1bHRzX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJLyoqIFJlcXVlc3QgSUQgb2YgdGhlIFdNSV9FWFRTQ0FOX0dFVF9DQUNIRURfUkVTVUxUU19DTURJRCAqLworCUFfVUlOVDMyIHJlcXVlc3RfaWQ7CisJLyoqIFJlcXVlc3RvciBJRCBvZiB0aGUgV01JX0VYVFNDQU5fR0VUX0NBQ0hFRF9SRVNVTFRTX0NNRElEICovCisJQV9VSU5UMzIgcmVxdWVzdG9yX2lkOworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgb2YgdGhlIFdNSV9FWFRTQ0FOX0dFVF9DQUNIRURfUkVTVUxUU19DTURJRCAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIFJlcXVlc3QgSUQgb2YgdGhlIGV4dHNjYW4gb3BlcmF0aW9uIHRoYXQgaXMgY3VycmVudGx5IHJ1bm5pbmcgKi8KKwlBX1VJTlQzMiBleHRzY2FuX3JlcXVlc3RfaWQ7CisJLyoqIFJlcXVlc3RvciBJRCBvZiB0aGUgZXh0c2NhbiBvcGVyYXRpb24gdGhhdCBpcyBjdXJyZW50bHkgcnVubmluZyAqLworCUFfVUlOVDMyIGV4dHNjYW5fcmVxdWVzdG9yX2lkOworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgb2YgdGhlIGV4dHNjYW4gb3BlcmF0aW9uIHRoYXQgaXMgY3VycmVudGx5IHJ1bm5pbmcgKi8KKwlBX1VJTlQzMiBleHRzY2FuX3ZkZXZfaWQ7CisJLyoqIHRhYmxlIElEIC0gdG8gYWxsb3cgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHRhYmxlcyAqLworCUFfVUlOVDMyIHRhYmxlX2lkOworCS8qKmN1cnJlbnQgdGltZSBzdGFtcCBpbiBzZWNvbmRzLiBVc2VkIHRvIHByb3ZpZGUgYSBiYXNlbGluZSBmb3IgdGhlIHJlbGF0aXZlIHRpbWVzdGFtcHMgcmV0dXJuZWQgZm9yIGVhY2ggYmxvY2sgYW5kIGVudHJ5ICovCisJQV9VSU5UMzIgY3VycmVudF90c3RhbXA7CisJLyoqdG90YWwgbnVtYmVyIG9mIGJzc2lkcyAoaW4gYWxsIHBhZ2VzKSAqLworCUFfVUlOVDMyIHRvdGFsX2VudHJpZXM7CisJLyoqaW5kZXggb2YgdGhlIGZpcnN0IGJzc2lkIGVudHJ5IGZvdW5kIGluIHRoZSBUTFYgd21pX2V4dHNjYW5fd2xhbl9kZXNjcmlwdG9yKi8KKwlBX1VJTlQzMiBmaXJzdF9lbnRyeV9pbmRleDsKKwkvKipudW1iZXIgb2YgYnNzaWRzIGluIHRoaXMgcGFnZSAqLworCUFfVUlOVDMyIG51bV9lbnRyaWVzX2luX3BhZ2U7CisJLyogRm9sbG93ZWQgYnkgdGhlIHZhcmlhYmxlIGxlbmd0aCBUTFZzCisJICogICAgIHdtaV9leHRzY2FuX3dsYW5fZGVzY3JpcHRvciAgICBic3NpZF9saXN0W10KKwkgKiAgICAgd21pX2V4dHNjYW5fcnNzaV9pbmZvICAgICAgICAgIHJzc2lfbGlzdFtdCisJICogICAgIEFfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBpZV9saXN0W10KKwkgKi8KK30gd21pX2V4dHNjYW5fY2FjaGVkX3Jlc3VsdHNfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgZW51bSB7CisJRVhUU0NBTl9XTEFOX0NIQU5HRV9GTEFHX05PTkUgPSAweDAwLAorCUVYVFNDQU5fV0xBTl9DSEFOR0VfRkxBR19PVVRfT0ZfUkFOR0UgPSAweDAxLAorCUVYVFNDQU5fV0xBTl9DSEFOR0VfRkxBR19BUF9MT1NUID0gMHgwMiwKK30gd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfZmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX0FSUkFZX1NUUlVDICovCisJLyoqYnNzaWQgKi8KKwl3bWlfbWFjX2FkZHIgYnNzaWQ7CisJLyoqdGltZSBzdGFtcCBpbiBtaWxsaXNlY29uZHMgKi8KKwlBX1VJTlQzMiB0c3RhbXA7CisJLyoqdXBwZXIgUlNTSSBsaW1pdCAqLworCUFfVUlOVDMyIHVwcGVyX3Jzc2lfbGltaXQ7CisJLyoqbG93ZXIgUlNTSSBsaW1pdCAqLworCUFfVUlOVDMyIGxvd2VyX3Jzc2lfbGltaXQ7CisJLyoqIGNoYW5uZWwgKi8KKwlBX1VJTlQzMiBjaGFubmVsOyAgICAgICAgICAgICAgIC8qIGluIE1IeiAqLworCS8qKmN1cnJlbnQgUlNTSSBhdmVyYWdlICovCisJQV9VSU5UMzIgcnNzaV9hdmVyYWdlOworCS8qKmZsYWdzIC0gd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfZmxhZ3MgKi8KKwlBX1VJTlQzMiBmbGFnczsKKwkvKipsZWdudGggb2YgUlNTSSBoaXN0b3J5IHRvIGZvbGxvdyAobnVtYmVyIG9mIHZhbHVlcykgKi8KKwlBX1VJTlQzMiBudW1fcnNzaV9zYW1wbGVzOworfSB3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9yZXN1bHRfYnNzaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX3dsYW5fY2hhbmdlX3Jlc3VsdHNfZXZlbnRfZml4ZWRfcGFyYW0gKi8KKwkvKiogUmVxdWVzdCBJRCBvZiB0aGUgV01JX0VYVFNDQU5fR0VUX1dMQU5fQ0hBTkdFX1JFU1VMVFNfQ01ESUQgY29tbWFuZCB0aGF0IHJlcXVlc3RlZCB0aGUgcmVzdWx0cyAqLworCUFfVUlOVDMyIHJlcXVlc3RfaWQ7CisJLyoqIFJlcXVlc3RvciBJRCBvZiB0aGUgV01JX0VYVFNDQU5fR0VUX1dMQU5fQ0hBTkdFX1JFU1VMVFNfQ01ESUQgY29tbWFuZCB0aGF0IHJlcXVlc3RlZCB0aGUgcmVzdWx0cyAqLworCUFfVUlOVDMyIHJlcXVlc3Rvcl9pZDsKKwkvKiogVkRFViBpZChpbnRlcmZhY2UpIG9mIHRoZSBXTUlfRVhUU0NBTl9HRVRfV0xBTl9DSEFOR0VfUkVTVUxUU19DTURJRCBjb21tYW5kIHRoYXQgcmVxdWVzdGVkIHRoZSByZXN1bHRzICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogUmVxdWVzdCBJRCBvZiB0aGUgV01JX0VYVFNDQU5fQ09ORklHVVJFX1dMQU5fQ0hBTkdFX01PTklUT1JfQ01ESUQgY29tbWFuZCB0aGF0IGNvbmZpZ3VyZWQgdGhlIHRhYmxlICovCisJQV9VSU5UMzIgY29uZmlnX3JlcXVlc3RfaWQ7CisJLyoqIFJlcXVlc3RvciBJRCBvZiB0aGUgV01JX0VYVFNDQU5fQ09ORklHVVJFX1dMQU5fQ0hBTkdFX01PTklUT1JfQ01ESUQgY29tbWFuZCB0aGF0IGNvbmZpZ3VyZWQgdGhlIHRhYmxlICovCisJQV9VSU5UMzIgY29uZmlnX3JlcXVlc3Rvcl9pZDsKKwkvKiogVkRFViBpZChpbnRlcmZhY2UpIG9mIHRoZSBXTUlfRVhUU0NBTl9DT05GSUdVUkVfV0xBTl9DSEFOR0VfTU9OSVRPUl9DTURJRCBjb21tYW5kIHRoYXQgY29uZmlndXJlZCB0aGUgdGFibGUgKi8KKwlBX1VJTlQzMiBjb25maWdfdmRldl9pZDsKKwkvKiogdGFibGUgSUQgLSB0byBhbGxvdyBzdXBwb3J0IGZvciBtdWx0aXBsZSBzaW11bHRhbmVvdXMgdGFibGVzICovCisJQV9VSU5UMzIgdGFibGVfaWQ7CisJLyoqbnVtYmVyIG9mIGVudHJpZXMgd2l0aCBSU1NJIG91dCBvZiByYW5nZSBvciBCU1NJRCBub3QgZGV0ZWN0ZWQgKi8KKwlBX1VJTlQzMiBjaGFuZ2VfY291bnQ7CisJLyoqdG90YWwgbnVtYmVyIG9mIGJzc2lkIHNpZ25hbCBkZXNjcmlwdG9ycyAoaW4gYWxsIHBhZ2VzKSAqLworCUFfVUlOVDMyIHRvdGFsX2VudHJpZXM7CisJLyoqaW5kZXggb2YgdGhlIGZpcnN0IGJzc2lkIHNpZ25hbCBkZXNjcmlwdG9yIGVudHJ5IGZvdW5kIGluIHRoZSBUTFYgd21pX2V4dHNjYW5fd2xhbl9kZXNjcmlwdG9yKi8KKwlBX1VJTlQzMiBmaXJzdF9lbnRyeV9pbmRleDsKKwkvKipudW1iZXIgb2YgYnNzaWRzIHNpZ25hbCBkZXNjcmlwdG9ycyBpbiB0aGlzIHBhZ2UgKi8KKwlBX1VJTlQzMiBudW1fZW50cmllc19pbl9wYWdlOworCS8qIEZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgVExWOgorCSAqICAgICB3bWlfZXh0c2Nhbl93bGFuX2NoYW5nZV9yZXN1bHRfYnNzaWQgYnNzaWRfc2lnbmFsX2Rlc2NyaXB0b3JfbGlzdFtdOyAgICAvLyBudW1iZXIgb2YgZGVzY3JpcHRvcnMgZ2l2ZW4gYnkgZmllbGQgbnVtX2VudHJpZXNfaW5fcGFnZS4KKwkgKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGxpc3Qgb2YgUlNTSSB2YWx1ZXMgKGVhY2ggaXMgYW4gQV9VSU5UOCk6CisJICogICAgIEFfVUlOVDggcnNzaV9saXN0W107ICAgIC8vIGxhc3QgTiBSU1NJIHZhbHVlcy4KKwkgKi8KK30gd21pX2V4dHNjYW5fd2xhbl9jaGFuZ2VfcmVzdWx0c19ldmVudF9maXhlZF9wYXJhbTsKKworZW51bSBfdEV4dFNjYW5FbnRyeUZsYWdzIHsKKwlXTUlfSE9UTElTVF9GTEFHX05PTkUgPSAweDAwLAorCVdNSV9IT1RMSVNUX0ZMQUdfUFJFU0VOQ0UgPSAweDAxLAorCVdNSV9IT1RMSVNUX0ZMQUdfRFVQTElDQVRFX1NTSUQgPSAweDgwLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2V4dHNjYW5faG90bGlzdF9tYXRjaF9ldmVudF9maXhlZF9wYXJhbSAqLworCS8qKiBSZXF1ZXN0IElEIG9mIHRoZSBXTUlfRVhUU0NBTl9DT05GSUdVUkVfSE9UTElTVF9NT05JVE9SX0NNRElEIHRoYXQgY29uZmlndXJlZCB0aGUgdGFibGUgKi8KKwlBX1VJTlQzMiBjb25maWdfcmVxdWVzdF9pZDsKKwkvKiogUmVxdWVzdG9yIElEIG9mIHRoZSBXTUlfRVhUU0NBTl9DT05GSUdVUkVfSE9UTElTVF9NT05JVE9SX0NNRElEIHRoYXQgY29uZmlndXJlZCB0aGUgdGFibGUgKi8KKwlBX1VJTlQzMiBjb25maWdfcmVxdWVzdG9yX2lkOworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgb2YgdGhlIFdNSV9FWFRTQ0FOX0NPTkZJR1VSRV9IT1RMSVNUX01PTklUT1JfQ01ESUQgdGhhdCBjb25maWd1cmVkIHRoZSB0YWJsZSAqLworCUFfVUlOVDMyIGNvbmZpZ192ZGV2X2lkOworCS8qKiB0YWJsZSBJRCAtIHRvIGFsbG93IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNpbXVsdGFuZW91cyB0YWJsZXMgKi8KKwlBX1VJTlQzMiB0YWJsZV9pZDsKKwkvKip0b3RhbCBudW1iZXIgb2YgYnNzaWRzIChpbiBhbGwgcGFnZXMpICovCisJQV9VSU5UMzIgdG90YWxfZW50cmllczsKKwkvKippbmRleCBvZiB0aGUgZmlyc3QgYnNzaWQgZW50cnkgZm91bmQgaW4gdGhlIFRMViB3bWlfZXh0c2Nhbl93bGFuX2Rlc2NyaXB0b3IqLworCUFfVUlOVDMyIGZpcnN0X2VudHJ5X2luZGV4OworCS8qKm51bWJlciBvZiBic3NpZHMgaW4gdGhpcyBwYWdlICovCisJQV9VSU5UMzIgbnVtX2VudHJpZXNfaW5fcGFnZTsKKwkvKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMVjoKKwkgKiAgICAgd21pX2V4dHNjYW5fd2xhbl9kZXNjcmlwdG9yIGhvdGxpc3RfbWF0Y2hbXTsgICAgLy8gbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGdpdmVuIGJ5IGZpZWxkIG51bV9lbnRyaWVzX2luX3BhZ2UuCisJICovCit9IHdtaV9leHRzY2FuX2hvdGxpc3RfbWF0Y2hfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9leHRzY2FuX2NhcGFiaWxpdGllc19ldmVudF9maXhlZF9wYXJhbSAqLworCS8qKiBSZXF1ZXN0IElEIG9mIHRoZSBXTUlfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX0NNRElEICovCisJQV9VSU5UMzIgcmVxdWVzdF9pZDsKKwkvKiogUmVxdWVzdG9yIElEIG9mIHRoZSBXTUlfRVhUU0NBTl9HRVRfQ0FQQUJJTElUSUVTX0NNRElEICovCisJQV9VSU5UMzIgcmVxdWVzdG9yX2lkOworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgb2YgdGhlIFdNSV9FWFRTQ0FOX0dFVF9DQVBBQklMSVRJRVNfQ01ESUQgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBudW1iZXIgb2YgZXh0c2NhbiBjYWNoZXMgKi8KKwlBX1VJTlQzMiBudW1fZXh0c2Nhbl9jYWNoZV90YWJsZXM7CisJLyoqIG51bWJlciBvZiB3bGFuIGNoYW5nZSBsaXN0cyAqLworCUFfVUlOVDMyIG51bV93bGFuX2NoYW5nZV9tb25pdG9yX3RhYmxlczsKKwkvKiogbnVtYmVyIG9mIGhvdGxpc3RzICovCisJQV9VSU5UMzIgbnVtX2hvdGxpc3RfbW9uaXRvcl90YWJsZXM7CisJLyoqIGlmIG9uZSBzaWRlZCBydHQgZGF0YSBjb2xsZWN0aW9uIGlzIHN1cHBvcnRlZCAqLworCUFfVUlOVDMyIHJ0dF9vbmVfc2lkZWRfc3VwcG9ydGVkOworCS8qKiBpZiAxMXYgZGF0YSBjb2xsZWN0aW9uIGlzIHN1cHBvcnRlZCAqLworCUFfVUlOVDMyIHJ0dF8xMXZfc3VwcG9ydGVkOworCS8qKiBpZiAxMW1jIGRhdGEgY29sbGVjdGlvbiBpcyBzdXBwb3J0ZWQgKi8KKwlBX1VJTlQzMiBydHRfZnRtX3N1cHBvcnRlZDsKKwkvKiogbnVtYmVyIG9mIGV4dHNjYW4gY2FjaGUgY2FwYWJpbGl0aWVzIChvbmUgcGVyIHRhYmxlKSAgKi8KKwlBX1VJTlQzMiBudW1fZXh0c2Nhbl9jYWNoZV9jYXBhYmlsaXRpZXM7CisJLyoqIG51bWJlciBvZiB3bGFuIGNoYW5nZSAgY2FwYWJpbGl0aWVzIChvbmUgcGVyIHRhYmxlKSAgKi8KKwlBX1VJTlQzMiBudW1fZXh0c2Nhbl93bGFuX2NoYW5nZV9jYXBhYmlsaXRpZXM7CisJLyoqIG51bWJlciBvZiBleHRzY2FuIGhvdGxpc3QgY2FwYWJpbGl0aWVzIChvbmUgcGVyIHRhYmxlKSAgKi8KKwlBX1VJTlQzMiBudW1fZXh0c2Nhbl9ob3RsaXN0X2NhcGFiaWxpdGllczsKKwkvKiBtYXggbnVtYmVyIG9mIHJvYW1pbmcgc3NpZCB3aGl0ZWxpc3QgZmlybXdhcmUgY2FuIHN1cHBvcnQgKi8KKwlBX1VJTlQzMiBudW1fcm9hbV9zc2lkX3doaXRlbGlzdDsKKwkvKiBtYXggbnVtYmVyIG9mIGJsYWNrbGlzdCBic3NpZCBmaXJtd2FyZSBjYW4gc3VwcG9ydCAqLworCUFfVUlOVDMyIG51bV9yb2FtX2Jzc2lkX2JsYWNrbGlzdDsKKwkvKiBtYXggbnVtYmVyIG9mIHByZWZlcnJlZCBsaXN0IGZpcm13YXJlIGNhbiBzdXBwb3J0ICovCisJQV9VSU5UMzIgbnVtX3JvYW1fYnNzaWRfcHJlZmVycmVkX2xpc3Q7CisJLyogbWF4IG51bWJlciBvZiBob3RsaXN0IHNzaWRzIGZpcm13YXJlIGNhbiBzdXBwb3J0ICovCisJQV9VSU5UMzIgbnVtX2V4dHNjYW5faG90bGlzdF9zc2lkOworCS8qIG1heCBudW1iZXIgb2YgZXBubyBuZXR3b3JrcyBmaXJtd2FyZSBjYW4gc3VwcG9ydCAqLworCUFfVUlOVDMyIG51bV9lcG5vX25ldHdvcmtzOworCisJLyogRm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGFyZSB0aGUgVExWcyBkZXNjcmliaW5nIHRoZSBjYXBhYmlsaXRpZXMgb2Ygb2YgdGhlIHZhcmlvdXMgdHlwZXMgb2YgbGlzdHMuIFRoZSBGVyB0aGVvcmV0aWNhbGx5CisJICogc3VwcG9ydHMgbXVsdGlwbGUgbGlzdHMgb2YgZWFjaCB0eXBlLgorCSAqCisJICogICAgIHdtaV9leHRzY2FuX2NhY2hlX2NhcGFiaWxpdGllcyAgICAgICAgICAgICAgIGV4dHNjYW5fY2FjaGVfY2FwYWJpbGl0aWVzW10gLy8gY2FwYWJpbGl0aWVzIG9mIGV4dHNjYW4gY2FjaGUgKEJTU0lEL1JTU0kgbGlzdHMpCisJICogICAgIHdtaV9leHRzY2FuX3dsYW5fY2hhbmdlX21vbml0b3JfY2FwYWJpbGl0aWVzIHdsYW5fY2hhbmdlX2NhcGFiaWxpdGllc1tdICAgLy8gY2FwYWJpbGl0aWVzIG9mIHdsYW5fY2hhbmdlX21vbml0b3JfdGFibGVzCisJICogICAgIHdtaV9leHRzY2FuX2hvdGxpc3RfbW9uaXRvcl9jYXBhYmlsaXRpZXMgICAgIGhvdGxpc3RfY2FwYWJpbGl0aWVzW10gICAgICAgLy8gY2FwYWJpbGl0aWVzIG9mIGhvdGxpc3RfbW9uaXRvcl90YWJsZXMKKwkgKi8KK30gd21pX2V4dHNjYW5fY2FwYWJpbGl0aWVzX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiBXTUlfRDBfV09XX0RJU0FCTEVfQUNLX0VWRU5USUQgICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX2QwX3dvd19kaXNhYmxlX2Fja19ldmVudF9maXhlZF9wYXJhbSAgKi8KKwlBX1VJTlQzMiByZXNlcnZlZDA7ICAgICAgICAgICAgIC8qIGZvciBmdXR1cmUgbmVlZCAqLworfSB3bWlfZDBfd293X2Rpc2FibGVfYWNrX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiogV01JX1BERVZfUkVTVU1FX0VWRU5USUQgOiBnZW5lcmF0ZWQgaW4gcmVzcG9uc2UgdG8gV01JX1BERVZfUkVTVU1FX0NNRElEICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3Jlc3VtZV9ldmVudF9maXhlZF9wYXJhbSAgKi8KKwlBX1VJTlQzMiByc3ZkOyAgLyogZm9yIGZ1dHVyZSBuZWVkICovCit9IHdtaV9wZGV2X3Jlc3VtZV9ldmVudF9maXhlZF9wYXJhbTsKKworLyoqIHZhbHVlIHJlcHJlc2VudGluZyBhbGwgbW9kdWxlcyAqLworI2RlZmluZSBXTUlfREVCVUdfTE9HX01PRFVMRV9BTEwgMHhmZmZmCisKKy8qIHBhcmFtIGRlZmluaXRpb25zICovCisKKy8qKgorICogTG9nIGxldmVsIGZvciBhIGdpdmVuIG1vZHVsZS4gVmFsdWUgY29udGFpbnMgYm90aCBtb2R1bGUgaWQgYW5kIGxvZyBsZXZlbC4KKyAqIGhlcmUgaXMgdGhlIGJpdG1hcCBkZWZpbml0aW9uIGZvciB2YWx1ZS4KKyAqIG1vZHVsZSBJZCAgIDogMTYKKyAqICAgICBGbGFncyAgIDogIHJlc2VydmVkCisgKiAgICAgTGV2ZWwgICA6ICA4CisgKiBpZiBvZHVsZSBJZCAgaXMgV01JX0RFQlVHX0xPR19NT0RVTEVfQUxMIHRoZW4gIGxvZyBsZXZlbCBpcyAgYXBwbGllZCB0byBhbGwgbW9kdWxlcyAoZ2xvYmFsKS4KKyAqIFdNSV9ERUJVR19MT0dfTUlEVUxFX0FMTCB3aWxsIG92ZXJ3cml0ZXMgcGVyIG1vZHVsZSBsZXZlbCBzZXR0aW5nLgorICovCisjZGVmaW5lIFdNSV9ERUJVR19MT0dfUEFSQU1fTE9HX0xFVkVMICAgICAgMHgxCisKKyNkZWZpbmUgV01JX0RCR0xPR19TRVRfTE9HX0xFVkVMKHZhbCxsdmwpIGRvIHsgXAorCQkodmFsKSB8PSAgKGx2bCAmIDB4ZmYpOwkJICAgICAgIFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBXTUlfREJHTE9HX0dFVF9MT0dfTEVWRUwodmFsKSAoKHZhbCkgJiAweGZmKQorCisjZGVmaW5lIFdNSV9EQkdMT0dfU0VUX01PRFVMRV9JRCh2YWwsbWlkKSBkbyB7IFwKKwkJKHZhbCkgfD0gICgobWlkICYgMHhmZmZmKSA8PCAxNik7CSBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgV01JX0RCR0xPR19HRVRfTU9EVUxFX0lEKHZhbCkgKCggKHZhbCkgPj4gMTYpICYgMHhmZmZmKQorCisvKioKKyAqIEVuYWJsZSB0aGUgZGVidWcgbG9nIGZvciBhIGdpdmVuIHZkZXYuIFZhbHVlIGlzIHZkZXYgaWQKKyAqLworI2RlZmluZSBXTUlfREVCVUdfTE9HX1BBUkFNX1ZERVZfRU5BQkxFICAgIDB4MgorCisvKioKKyAqIERpc2FibGUgdGhlIGRlYnVnIGxvZyBmb3IgYSBnaXZlbiB2ZGV2LiBWYWx1ZSBpcyB2ZGV2IGlkCisgKiBBbGwgdGhlIGxvZyBsZXZlbCAgZm9yIGEgZ2l2ZW4gVkRFViBpcyBkaXNhYmxlZCBleGNlcHQgdGhlIEVSUk9SIGxvZyBtZXNzYWdlcworICovCisKKyNkZWZpbmUgV01JX0RFQlVHX0xPR19QQVJBTV9WREVWX0RJU0FCTEUgICAweDMKKworLyoqCisgKiBzZXQgdmRldiBlbmFibGUgYml0bWFwLiB2YWx1ZSBpcyB0aGUgdmRlbiBlbmFibGUgYml0bWFwCisgKi8KKyNkZWZpbmUgV01JX0RFQlVHX0xPR19QQVJBTV9WREVWX0VOQUJMRV9CSVRNQVAgICAgMHg0CisKKy8qKgorICogc2V0IGEgZ2l2ZW4gbG9nIGxldmVsIHRvIGFsbCB0aGUgbW9kdWxlcyBzcGVjaWZpZWQgaW4gdGhlIG1vZHVsZSBiaXRtYXAuCisgKiBhbmQgc2V0IHRoZSBsb2cgbGV2bGUgZm9yIGFsbCBvdGhlciBtb2R1bGVzIHRvIERCR0xPR19FUlIuCisgKiAgdmFsdWU6IGxvZyBsZXZlbHQgdG8gYmUgc2V0LgorICogIG1vZHVsZV9pZF9iaXRtYXAgOiBpZGVudGlmaWVzIHRoZSBtb2R1bGVzIGZvciB3aGljaCB0aGUgbG9nIGxldmVsIHNob3VsZCBiZSBzZXQgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzIGZvciB3aGljaCB0aGUgbG9nIGxldmVsIHNob3VsZCBiZSByZXNldCB0byBEQkdMT0dfRVJSLgorICovCisjZGVmaW5lIFdNSV9ERUJVR19MT0dfUEFSQU1fTU9EX0VOQUJMRV9CSVRNQVAgICAgMHg1CisKKyNkZWZpbmUgTlVNX01PRFVMRVNfUEVSX0VOVFJZICgoc2l6ZW9mKEFfVUlOVDMyKSkgPDwgMykKKworI2RlZmluZSBXTUlfTU9EVUxFX0VOQUJMRShwbWlkX2JpdG1hcCxtb2RfaWQpIFwKKwkoIChwbWlkX2JpdG1hcClbKG1vZF9pZCkvTlVNX01PRFVMRVNfUEVSX0VOVFJZXSB8PSBcCisJCSAgKDEgPDwgKChtb2RfaWQpJU5VTV9NT0RVTEVTX1BFUl9FTlRSWSkpICkKKworI2RlZmluZSBXTUlfTU9EVUxFX0RJU0FCTEUocG1pZF9iaXRtYXAsbW9kX2lkKQkgICBcCisJKCAocG1pZF9iaXRtYXApWyhtb2RfaWQpL05VTV9NT0RVTEVTX1BFUl9FTlRSWV0gJj0gIFwKKwkJICAoIH4oMSA8PCAoKG1vZF9pZCklTlVNX01PRFVMRVNfUEVSX0VOVFJZKSkgKSApCisKKyNkZWZpbmUgV01JX01PRFVMRV9JU19FTkFCTEVEKHBtaWRfYml0bWFwLG1vZF9pZCkgXAorCSggKChwbWlkX2JpdG1hcClbKG1vZF9pZCkvTlVNX01PRFVMRVNfUEVSX0VOVFJZIF0gJiAgXAorCSAgICgxIDw8ICgobW9kX2lkKSVOVU1fTU9EVUxFU19QRVJfRU5UUlkpKSApICE9IDApCisKKyNkZWZpbmUgTUFYX01PRFVMRV9JRF9CSVRNQVBfV09SRFMgMTYgICAvKiAxNiozMj01MTIgbW9kdWxlIGlkcy4gc2hvdWxkIGJlIG1vcmUgdGhhbiBzdWZmaWNpZW50ICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfZGVidWdfbG9nX2NvbmZpZ19jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiBkYmdfbG9nX3BhcmFtOworCS8qKiBwYXJhbSB0eXBlcyBhcmUgZGVmaW5lZCBhYm92ZSAqLworCUFfVUlOVDMyIHZhbHVlOworCS8qIFRoZSBiZWxvdyBhcnJheSB3aWxsIGZvbGxvdyB0aGlzIHRsdiAtPmZpeGVkIGxlbmd0aCBtb2R1bGVfaWRfYml0bWFwW10KKwkgICBBX1VJTlQzMiBtb2R1bGVfaWRfYml0bWFwW01BWF9NT0RVTEVfSURfQklUTUFQX1dPUkRTXTsKKwkgKi8KK30gd21pX2RlYnVnX2xvZ19jb25maWdfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfcGRldl9nZXRfdGVtcGVyYXR1cmVfY21kX2ZpeGVkX3BhcmFtICAqLworCUFfVUlOVDMyIHBhcmFtOyAgICAgICAgIC8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9IHdtaV9wZGV2X2dldF90ZW1wZXJhdHVyZV9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9wZGV2X3RlbXBlcmF0dXJlX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJQV9JTlQzMiB2YWx1ZTsgICAgICAgICAgLyogdGVtcHJhdHVyZSB2YWx1ZSBpbiBDZWxjaXVzIGRlZ3JlZSAqLworfSB3bWlfcGRldl90ZW1wZXJhdHVyZV9ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7ICAgICAgICAgICAgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NldF9kaGNwX3NlcnZlcl9vZmZsb2FkX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgZW5hYmxlOworCUFfVUlOVDMyIHNydl9pcHY0OyAgICAgICAgICAgICAgLyogc2VydmVyIElQICovCisJQV9VSU5UMzIgc3RhcnRfbHNiOyAgICAgICAgICAgICAvKiBzdGFydGluZyBhZGRyZXNzIGFzc2lnbmVkIHRvIGNsaWVudCAqLworCUFfVUlOVDMyIG51bV9jbGllbnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNsaWVudHMgd2Ugc3VwcG9ydCAqLworfSB3bWlfc2V0X2RoY3Bfc2VydmVyX29mZmxvYWRfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCUFQX1JYX0RBVEFfT0ZGTE9BRCA9IDB4MDAsCisJU1RBX1JYX0RBVEFfT0ZGTE9BRCA9IDB4MDEsCit9IHdtaV9pcGFfb2ZmbG9hZF90eXBlczsKKworLyoqCisgKiBUaGlzIGNvbW1hbmQgaXMgc2VudCBmcm9tIFdMQU4gaG9zdCBkcml2ZXIgdG8gZmlybXdhcmUgZm9yCisgKiBlbmFibGluZy9kaXNhYmxpbmcgSVBBIGRhdGEtcGF0aCBvZmZsb2FkIGZlYXR1cmVzLgorICoKKyAqCisgKiBFbmFibGluZyBkYXRhIHBhdGggb2ZmbG9hZCB0byBJUEEoYmFzZWQgb24gaG9zdCBJTkkgY29uZmlndXJhdGlvbiksIGV4YW1wbGU6CisgKiAgICB3aGVuIFNUQSBpbnRlcmZhY2UgY29tZXMgdXAsCisgKiAgICBob3N0LT50YXJnZXQ6IFdNSV9JUEFfT0ZGTE9BRF9FTkFCTEVfRElTQUJMRV9DTUQsCisgKiAgICAgICAgICAgICAgICAgIChlbmFibGUgPSAxLCB2ZGV2X2lkID0gU1RBIHZkZXYgaWQsIG9mZmxvYWRfdHlwZSA9IFNUQV9SWF9EQVRBX09GRkxPQUQpCisgKgorICogRGlzYWJsaW5nIGRhdGEgcGF0aCBvZmZsb2FkIHRvIElQQSwgZXhhbXBsZToKKyAqICAgIGhvc3QtPnRhcmdldDogV01JX0lQQV9PRkZMT0FEX0VOQUJMRV9ESVNBQkxFX0NNRCwKKyAqICAgICAgICAgICAgICAgICAgKGVuYWJsZSA9IDAsIHZkZXZfaWQgPSBTVEEgdmRldiBpZCwgb2ZmbG9hZF90eXBlID0gU1RBX1JYX0RBVEFfT0ZGTE9BRCkKKyAqCisgKgorICogVGhpcyBjb21tYW5kIGlzIGFwcGxpY2FibGUgb25seSBvbiB0aGUgUENJRSBMTCBzeXN0ZW1zCisgKgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgICAgICAgICAgICAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgb2ZmbG9hZF90eXBlOyAgICAgICAgICAvKiB3bWlfaXBhX29mZmxvYWRfdHlwZXMgZW51bSB2YWx1ZXMgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGVuYWJsZTsgICAgICAgICAgICAgICAgLyogMSA9PSBlbmFibGUsIDAgPT0gZGlzYWJsZSAqLworfSB3bWlfaXBhX29mZmxvYWRfZW5hYmxlX2Rpc2FibGVfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCVdNSV9MRURfRkxBU0hJTkdfUEFUVEVSTl9OT1RfQ09OTkVDVEVEID0gMCwKKwlXTUlfTEVEX0ZMQVNISU5HX1BBVFRFUk5fQ09OTkVDVEVEID0gMSwKKwlXTUlfTEVEX0ZMQVNISU5HX1BBVFRFUk5fUkVTRVJWRUQgPSAyLAorfSB3bWlfc2V0X2xlZF9mbGFzaGluZ190eXBlOworCisvKioKKyAgIFRoZSBzdGF0ZSBvZiB0aGUgTEVEIEdQSU8gY29udHJvbCBpcyBkZXRlcm1pbmVkIGJ5IHR3byAzMiBiaXQgdmFsdWVzKFhfMCBhbmQgWF8xKSB0byBwcm9kdWNlIGEgNjQgYml0IHZhbHVlLgorICAgRWFjaCAzMiBiaXQgdmFsdWUgY29uc2lzdHMgb2YgNCBieXRlcywgd2hlcmUgZWFjaCBieXRlIGRlZmluZXMgdGhlIG51bWJlciBvZiA1MG1zIGludGVydmFscyB0aGF0IHRoZSBHUElPIHdpbGwKKyAgIHJlbWFpbiBhdCBhIHByZWRldGVybWluZWQgc3RhdGUuIFRoZSA2NCBiaXQgdmFsdWUgcHJvdmlkZXMgOCB1bmlxdWUgR1BJTyB0aW1pbmcgaW50ZXJ2YWxzLiBUaGUgcGF0dGVybiBzdGFydHMKKyAgIHdpdGggdGhlIE1TQiBvZiBYXzAgYW5kIGNvbnRpbnVlcyB0byB0aGUgTFNCIG9mIFhfMS4gQWZ0ZXIgZXhlY3V0aW5nIHRoZSB0aW1lciBpbnRlcnZhbCBvZiB0aGUgTFNCIG9mIFhfMSwgdGhlCisgICBwYXR0ZXJuIHJldHVybnMgdG8gdGhlIE1TQiBvZiBYXzAgYW5kIHJlcGVhdHMuIFRoZSBHUElPIHN0YXRlIGZvciBlYWNoIHRpbWluZyBpbnRlcnZhbCAgYWx0ZXJuYXRlcyBmcm9tIExvdyB0bworICAgSGlnaCBhbmQgdGhlIGZpcnN0IGludGVydmFsIG9mIHRoZSBwYXR0ZXJuIHJlcHJlc2VudHMgdGhlIHRpbWUgd2hlbiB0aGUgR1BJTyBpcyBMb3cuIFdoZW4gYSB0aW1pbmcgaW50ZXJ2YWwgb2YKKyAgIFplcm8gaXMgcmVhY2hlZCwgaXQgaXMgc2tpcHBlZCBhbmQgbW92ZXMgb24gdG8gdGhlIG5leHQgaW50ZXJ2YWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAgICAgICAgICAgIC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zZXRfbGVkX2ZsYXNoaW5nX2NtZF9maXhlZF9wYXJhbSAgKi8KKwlBX1VJTlQzMiBwYXR0ZXJuX2lkOyAgICAgICAgICAgIC8qIHBhdHRlcm4gaWRlbnRpZmllciAqLworCUFfVUlOVDMyIGxlZF94MDsgICAgICAgICAgICAgICAgLyogbGVkIGZsYXNoaW5nIHBhcmFtZXRlcjAgKi8KKwlBX1VJTlQzMiBsZWRfeDE7ICAgICAgICAgICAgICAgIC8qIGxlZCBmbGFzaGluZyBwYXJhbWV0ZXIxICovCisJQV9VSU5UMzIgZ3Bpb19udW07IC8qIEdQSU8gbnVtYmVyICovCit9IHdtaV9zZXRfbGVkX2ZsYXNoaW5nX2NtZF9maXhlZF9wYXJhbTsKKworLyoqCisgKiBUaGUgcHVycG9zZSBvZiB0aGUgbXVsdGljYXN0IERvbWFpbiBOYW1lIFN5c3RlbSAobUROUykgaXMgdG8gcmVzb2x2ZSBob3N0IG5hbWVzIHRvIElQIGFkZHJlc3NlcworICogd2l0aGluIHNtYWxsIG5ldHdvcmtzIHRoYXQgZG8gbm90IGluY2x1ZGUgYSBsb2NhbCBuYW1lIHNlcnZlci4KKyAqIEl0IHV0aWxpemVzIGVzc2VudGlhbGx5IHRoZSBzYW1lIHByb2dyYW1taW5nIGludGVyZmFjZXMsIHBhY2tldCBmb3JtYXRzIGFuZCBvcGVyYXRpbmcgc2VtYW50aWNzCisgKiBhcyB0aGUgdW5pY2FzdCBETlMsIGFuZCB0aGUgYWR2YW50YWdlIGlzIHplcm8gY29uZmlndXJhdGlvbiBzZXJ2aWNlIHdoaWxlIG5vIG5lZWQgZm9yIGNlbnRyYWwgb3IKKyAqIGdsb2JhbCBzZXJ2ZXIuCisgKiBCYXNlZCBvbiBtRE5TLCB0aGUgRE5TLVNEIChTZXJ2aWNlIERpc2NvdmVyeSkgYWxsb3dzIGNsaWVudHMgdG8gZGlzY292ZXIgYSBuYW1lZCBsaXN0IG9mIHNlcnZpY2VzCisgKiBieSB0eXBlIGluIGEgc3BlY2lmaWVkIGRvbWFpbiB1c2luZyBzdGFuZGFyZCBETlMgcXVlcmllcy4KKyAqIEhlcmUsIHdlIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gYWR2ZXJ0aXNlIHRoZSBhdmFpbGFibGUgc2VydmljZXMgYnkgcmVzcG9uZGluZyB0byBtRE5TIHF1ZXJpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfbWRuc19vZmZsb2FkX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJQV9VSU5UMzIgZW5hYmxlOworfSB3bWlfbWRuc19vZmZsb2FkX2NtZF9maXhlZF9wYXJhbTsKKworI2RlZmluZSBXTUlfTUFYX01ETlNfRlFETl9MRU4gICAgICAgICA2NAorI2RlZmluZSBXTUlfTUFYX01ETlNfUkVTUF9MRU4gICAgICAgICA1MTIKKyNkZWZpbmUgV01JX01ETlNfRlFETl9UWVBFX0dFTkVSQUwgICAgMAorI2RlZmluZSBXTUlfTUROU19GUUROX1RZUEVfVU5JUVVFICAgICAxCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfbWRuc19zZXRfZnFkbl9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiB0eXBlIG9mIGZxZG4sIGdlbmVyYWwgb3IgdW5pcXVlICovCisJQV9VSU5UMzIgdHlwZTsKKwkvKiogbGVuZ3RoIG9mIGZxZG4gKi8KKwlBX1VJTlQzMiBmcWRuX2xlbjsKKwkvKiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFRMViBieXRlIHN0cmVhbSBvZiBmcWRuIGRhdGEgb2YgbGVuZ3RoIGZxZG5fbGVuCisJICogQV9VSU5UOCAgZnFkbl9kYXRhW107IC8vIGZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZSB0byBjaGVjayBpZiBtYXRjaCB3aXRoIHRoZSByZWNlaXZlZCBxdWVyaWVzCisJICovCit9IHdtaV9tZG5zX3NldF9mcWRuX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7IC8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tZG5zX3NldF9yZXNwX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIEFuc3dlciBSZXNvdXJjZSBSZWNvcmQgY291bnQgKi8KKwlBX1VJTlQzMiBBUl9jb3VudDsKKwkvKiogbGVuZ3RoIG9mIHJlc3BvbnNlICovCisJQV9VSU5UMzIgcmVzcF9sZW47CisJLyogRm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGlzIHRoZSBUTFYgYnl0ZSBzdHJlYW0gb2YgcmVzcCBkYXRhIG9mIGxlbmd0aCByZXNwX2xlbgorCSAqIEFfVUlOVDggIHJlc3BfZGF0YVtdOyAvLyByZXNwb25zZXMgY29uc2lzaXRzIG9mIFJlc291cmNlIFJlY29yZHMKKwkgKi8KK30gd21pX21kbnNfc2V0X3Jlc3BfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX21kbnNfZ2V0X3N0YXRzX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7Cit9IHdtaV9tZG5zX2dldF9zdGF0c19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiB0bHZfaGVhZGVyOyAvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMgV01JVExWX1RBR19TVFJVQ193bWlfbWRuc19zdGF0c19ldmVudF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIGN1clRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgKi8KKwlBX1VJTlQzMiBjdXJUaW1lc3RhbXA7CisJLyoqIGxhc3QgcmVjZWl2ZWQgUXVlcnkgaW4gbWlsbGlzZWNvbmRzICovCisJQV9VSU5UMzIgbGFzdFF1ZXJ5VGltZXN0YW1wOworCS8qKiBsYXN0IHNlbnQgUmVzcG9uc2UgaW4gbWlsbGlzZWNvbmRzICovCisJQV9VSU5UMzIgbGFzdFJlc3BvbnNlVGltZXN0YW1wOworCS8qKiBzdGF0cyBvZiByZWNlaXZlZCBxdWVyaWVzICovCisJQV9VSU5UMzIgdG90YWxRdWVyaWVzOworCS8qKiBzdGF0cyBvZiBtYWN0aCBxdWVyaWVzICovCisJQV9VSU5UMzIgdG90YWxNYXRjaGVzOworCS8qKiBzdGF0cyBvZiByZXNwb25zZXMgKi8KKwlBX1VJTlQzMiB0b3RhbFJlc3BvbnNlczsKKwkvKiogaW5kaWNhdGUgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIG1ETlMgb2ZmbG9hZCAqLworCUFfVUlOVDMyIHN0YXR1czsKK30gd21pX21kbnNfc3RhdHNfZXZlbnRfZml4ZWRfcGFyYW07CisKKy8qKgorICogVGhlIHB1cnBvc2Ugb2YgdGhlIFNvZnRBUCBhdXRoZW50aWNhdG9yIG9mZmxvYWQgaXMgdG8gb2ZmbG9hZCB0aGUgYXNzb2NpYXRpb24gYW5kIDQtd2F5IGhhbmRzaGFrZSBwcm9jZXNzCisgKiBkb3duIHRvIHRoZSBmaXJtd2FyZS4gV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgZmlybXdhcmUgY2FuIHByb2Nlc3MgdGhlIGFzc29jaWF0aW9uL2Rpc2Fzc29jaWF0aW9uCisgKiByZXF1ZXN0IGFuZCBjcmVhdGUvcmVtb3ZlIGNvbm5lY3Rpb24gZXZlbiBob3N0IGlzIHN1c3BlbmRlZC4KKyAqIDMgbWFqb3IgY29tcG9uZW50cyBhcmUgb2ZmbG9hZGVkOgorICogICAgIDEuIGFwLW1sbWUuIEZpcm13YXJlIHdpbGwgcHJvY2VzcyBhdXRoL2RlYXV0aCwgYXNzb2NpYXRpb24vZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBhbmQgc2VuZCBvdXQgcmVzcG9uc2UuCisgKiAgICAgMi4gNC13YXkgaGFuZHNoYWtlLiBGaXJtd2FyZSB3aWxsIHNlbmQgb3V0IG0xL20zIGFuZCByZWNlaXZlIG0yL200LgorICogICAgIDMuIGtleSBpbnN0YWxsYXRpb24uIEZpcm13YXJlIHdpbGwgZ2VuZXJhdGUgUE1LIGZyb20gdGhlIHBzayBpbmZvIHdoaWNoIGlzIHNlbnQgZnJvbSB0aGUgaG9zdCBhbmQgaW5zdGFsbCBQTUsvR1RLLgorICogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIFdQQTIgQ0NNUC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NhcF9vZmxfZW5hYmxlX2NtZF9maXhlZF9wYXJhbSAqLworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgb2YgdGhlIFdNSV9TQVBfT0ZMX0VOQUJMRV9DTURJRCAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIGVuYWJsZS9kaXNhYmxlIHNhcCBhdXRoIG9mZmxvYWQgKi8KKwlBX1VJTlQzMiBlbmFibGU7CisJLyoqIHNhcCBzc2lkICovCisJd21pX3NzaWQgYXBfc3NpZDsKKwkvKiogYXV0aGVudGljYXRpb24gbW9kZSAoZGVmaW5lZCBhYm92ZSkgKi8KKwlBX1VJTlQzMiByc25fYXV0aG1vZGU7CisJLyoqIHVuaWNhc3QgY2lwaGVyIHNldCAqLworCUFfVUlOVDMyIHJzbl91Y2FzdGNpcGhlcnNldDsKKwkvKiogbWNhc3QvZ3JvdXAgY2lwaGVyIHNldCAqLworCUFfVUlOVDMyIHJzbl9tY2FzdGNpcGhlcnNldDsKKwkvKiogbWNhc3QvZ3JvdXAgbWFuYWdlbWVudCBmcmFtZXMgY2lwaGVyIHNldCAqLworCUFfVUlOVDMyIHJzbl9tY2FzdG1nbXRjaXBoZXJzZXQ7CisJLyoqIHNhcCBjaGFubmVsICovCisJQV9VSU5UMzIgY2hhbm5lbDsKKwkvKiogbGVuZ3RoIG9mIHBzayAqLworCUFfVUlOVDMyIHBza19sZW47CisJLyogRm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGlzIHRoZSBUTFYgYnl0ZSBzdHJlYW0gb2Ygd3BhIHBhc3NwaHJhc2UgZGF0YSBvZiBsZW5ndGggcHNrX2xlbgorCSAqIEFfVUlOVDggIHBza1tdOworCSAqLworfSB3bWlfc2FwX29mbF9lbmFibGVfY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NhcF9vZmxfYWRkX3N0YV9ldmVudF9maXhlZF9wYXJhbSAqLworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgb2YgdGhlIFdNSV9TQVBfT0ZMX0FERF9TVEFfRVZFTlRJRCAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIGFpZCAoYXNzb2NpYXRpb24gaWQpIG9mIHRoaXMgc3RhdGlvbiAqLworCUFfVUlOVDMyIGFzc29jX2lkOworCS8qKiBwZWVyIHN0YXRpb24ncyBtYWMgYWRkciAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIGxlbmd0aCBvZiBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lICovCisJQV9VSU5UMzIgZGF0YV9sZW47CisJLyogRm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGlzIHRoZSBUTFYgYnl0ZSBzdHJlYW0gb2YgYSB3aG9sZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lIG9mIGxlbmd0aCBkYXRhX2xlbgorCSAqIEFfVUlOVDggYnVmcFtdOworCSAqLworfSB3bWlfc2FwX29mbF9hZGRfc3RhX2V2ZW50X2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIGVudW0geworCVNBUF9PRkxfREVMX1NUQV9GTEFHX05PTkUgICAgICAgPSAweDAwLAorCVNBUF9PRkxfREVMX1NUQV9GTEFHX1JFQ09OTkVDVCAgPSAweDAxLAorfSB3bWlfc2FwX29mbF9kZWxfc3RhX2ZsYWdzOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NhcF9vZmxfZGVsX3N0YV9ldmVudF9maXhlZF9wYXJhbSAqLworCS8qKiBWREVWIGlkKGludGVyZmFjZSkgb2YgdGhlIFdNSV9TQVBfT0ZMX0RFTF9TVEFfRVZFTlRJRCAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqIGFpZCAoYXNzb2NpYXRpb24gaWQpIG9mIHRoaXMgc3RhdGlvbiAqLworCUFfVUlOVDMyIGFzc29jX2lkOworCS8qKiBwZWVyIHN0YXRpb24ncyBtYWMgYWRkciAqLworCXdtaV9tYWNfYWRkciBwZWVyX21hY2FkZHI7CisJLyoqIGRpc2Fzc29jaWF0aW9uIHJlYXNvbiAqLworCUFfVUlOVDMyIHJlYXNvbjsKKwkvKiogZmxhZ3MgLSB3bWlfc2FwX29mbF9kZWxfc3RhX2ZsYWdzICovCisJQV9VSU5UMzIgZmxhZ3M7Cit9IHdtaV9zYXBfb2ZsX2RlbF9zdGFfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NhcF9zZXRfYmxhY2tsaXN0X3BhcmFtX2NtZF9maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiBOdW1iZXIgb2YgY2xpZW50IGZhaWx1cmUgY29ubmVjdGlvbiBhdHRlbXB0ICovCisJQV9VSU5UMzIgbnVtX3JldHJ5OworCS8qVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gcmVjb3JkIHRoZSBjbGllbnQncyBmYWlsdXJlIGNvbm5lY3Rpb24gYXR0ZW1wdHMqLworCUFfVUlOVDMyIHJldHJ5X2FsbG93X3RpbWVfbXM7CisJLyoKKwkgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBkcm9wIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QgaWYKKwkgKiBjbGllbnQgaXMgYmxhY2tsaXN0ZWQKKwkgKi8KKwlBX1VJTlQzMiBibGFja291dF90aW1lX21zOworfSB3bWlfc2FwX3NldF9ibGFja2xpc3RfcGFyYW1fY21kX2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hcGZpbmRfY21kX3BhcmFtICovCisJQV9VSU5UMzIgZGF0YV9sZW47IC8qKiBsZW5ndGggaW4gYnl0ZSBvZiBkYXRhW10uICovCisJLyoqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc2VuZCBSRVEgYmluYXJ5IGJsb2JzCisJICogZnJvbSBhcHBsaWNhdGlvbi9zZXJ2aWNlIHRvIGZpcm13YXJlIHdoZXJlIEhvc3QgZHJ2IGlzIHBhc3MgdGhyb3VnaCAuCisJICogRm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGlzIHRoZSBUTFY6CisJICogICAgIEFfVUlOVDggZGF0YVtdOyAgICAvLyBsZW5ndGggaW4gYnl0ZSBnaXZlbiBieSBmaWVsZCBkYXRhX2xlbi4KKwkgKi8KK30gd21pX2FwZmluZF9jbWRfcGFyYW07CisKK3R5cGVkZWYgZW51bSBhcGZpbmRfZXZlbnRfdHlwZV9lIHsKKwlBUEZJTkRfTUFUQ0hfRVZFTlQgPSAwLAorCUFQRklORF9XQUtFVVBfRVZFTlQsCit9IEFQRklORF9FVkVOVF9UWVBFOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgdGx2X2hlYWRlcjsgLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscyBXTUlUTFZfVEFHX1NUUlVDX3dtaV9hcGZpbmRfZXZlbnRfaGRyICovCisJQV9VSU5UMzIgZXZlbnRfdHlwZTsgLyoqIEFQRklORF9FVkVOVF9UWVBFICovCisJQV9VSU5UMzIgZGF0YV9sZW47IC8qKiBsZW5ndGggaW4gYnl0ZSBvZiBkYXRhW10uICovCisJLyoqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc2VuZCBldmVudCBiaW5hcnkgYmxvYnMKKwkgKiBmcm9tIGZpcm13YXJlIHRvIGFwcGxpY2F0aW9uL3NlcnZpY2UgYW5kIEhvc3QgZHJ2LgorCSAqIEZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgVExWOgorCSAqICAgICBBX1VJTlQ4IGRhdGFbXTsgICAgLy8gbGVuZ3RoIGluIGJ5dGUgZ2l2ZW4gYnkgZmllbGQgZGF0YV9sZW4uCisJICovCit9IHdtaV9hcGZpbmRfZXZlbnRfaGRyOworCisvKioKKyAqIE9DQiBEQ0MgdHlwZXMgYW5kIHN0cnVjdHVyZXMuCisgKi8KKworLyoqCisgKiBEQ0MgdHlwZXMgYXMgZGVzY3JpYmVkIGluIEVUU0kgVFMgMTAyIDY4NworICogVHlwZSAgICAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICBzdGVwU2l6ZSAgICByZWZlcmVuY2VWYWx1ZSAgbnVtQml0cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbmRsVHlwZV9hY1ByaW8gICAgICAgICBJTlRFR0VSICgwLi4uNykgICAxICAgICAgICAgICBudW1iZXIgICAgICAgICAgMworICogbmRsVHlwZV9jb250cm9sTG9vcCAgICBJTlRFR0VSICgwLi4uNykgICAxICAgICAgICAgICAwICAgICAgICAgICAgICAgMworICogbmRsVHlwZV9hcnJpdmFsUmF0ZSAgICBJTlRFR0VSICgwLi44MTkxKSAwLjAxIC9zICAgICAwICAgICAgICAgICAgICAgMTMKKyAqIG5kbFR5cGVfY2hhbm5lbExvYWQgICAgSU5URUdFUiAoMC4uMTAwMCkgMC4xICUgICAgICAgMCAlICAgICAgICAgICAgIDEwCisgKiBuZGxUeXBlX2NoYW5uZWxVc2UgICAgIElOVEVHRVIgKDAuLjgwMDApIDAuMDEyNSAlICAgIDAgJSAgICAgICAgICAgICAxMworICogbmRsVHlwZV9kYXRhcmF0ZSAgICAgICBJTlRFR0VSICgwLi43KSAgICAgICAgICAgICAgICBUYWJsZSA4ICAgICAgICAgMworICogbmRsVHlwZV9kaXN0YW5jZSAgICAgICBJTlRFR0VSICgwLi40MDk1KSAxIG0gICAgICAgICAwICAgICAgICAgICAgICAgMTIKKyAqIG5kbFR5cGVfbnVtYmVyRWxlbWVudHMgSU5URUdFUiAoMC4uNjMpICAgICAgICAgICAgICAgbnVtYmVyICAgICAgICAgIDYKKyAqIG5kbFR5cGVfcGFja2V0RHVyYXRpb24gSU5URUdFUiAoMC4uMjA0NykgVFNZTSAgICAgICAgMCAgICAgICAgICAgICAgIDExCisgKiBuZGxUeXBlX3BhY2tldEludGVydmFsIElOVEVHRVIgKDAuLjEwMjMpIDEwIG1zICAgICAgIDAgICAgICAgICAgICAgICAxMAorICogbmRsVHlwZV9wYXRobG9zcyAgICAgICBJTlRFR0VSICgwLi4zMSkgICAwLjEgICAgICAgICAxLjAgICAgICAgICAgICAgNQorICogbmRsVHlwZV9yeFBvd2VyICAgICAgICBJTlRFR0VSICgwLi4xMjcpICAtMC41IGRCICAgICAtNDAgZEJtICAgICAgICAgNworICogbmRsVHlwZV9zbnIgICAgICAgICAgICBJTlRFR0VSICgwLi4xMjcpICAwLjUgZEIgICAgICAtMTAgZEIgICAgICAgICAgNworICogbmRsVHlwZV90aW1pbmcgICAgICAgICBJTlRFR0VSICgwLi40MDk1KSAxMCBtcyAgICAgICAwICAgICAgICAgICAgICAgMTIKKyAqIG5kbFR5cGVfdHhQb3dlciAgICAgICAgSU5URUdFUiAoMC4uMTI3KSAgMC41IGRCICAgICAgLTIwIGRCbSAgICAgICAgIDcKKyAqIG5kbFR5cGVfcmF0aW8gICAgICAgICAgSU5URUdFUiAoMC4uMTAwKSAgMSAlICAgICAgICAgMCAlICAgICAgICAgICAgIDcKKyAqIG5kbFR5cGVfZXhwb25lbnQgICAgICAgSU5URUdFUiAoMC4uMTAwKSAgMC4xICAgICAgICAgMCAgICAgICAgICAgICAgIDcKKyAqIG5kbFR5cGVfcXVldWVTdGF0dXMgICAgRW51bWVyYXRpb24gICAgICAgICAgICAgICAgICAgVGFibGUgQS4yICAgICAgIDEKKyAqIG5kbFR5cGVfZGNjTWVjaGFuaXNtICAgQml0c2V0ICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgQS4yICAgICAgIDYKKyAqCisgKiBOT1RFOiBBbGwgb2YgZm9sbG93aW5nIHNpemUgbWFjcm9zIChTSVpFX05ETFRZUEVfQUNQUklPIHRocm91Z2ggU0laRV9CWVRFKQorICogY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dCBicmVha2luZyBXTUkgY29tcGF0aWJpbGl0eS4KKyAqCisgKiBOT1RFOiBGb3IgZWFjaCBvZiB0aGUgdHlwZXMsIG9uZSBhZGRpdGlvbmFsIGJpdCBpcyBhbGxvY2F0ZWQuIFRoaXMKKyAqICBsZWZ0bW9zdCBiaXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YWx1ZSBpcyBpbnZhbGlkLgorICovCisjZGVmaW5lIFNJWkVfTkRMVFlQRV9BQ1BSSU8gICAgICAgICAoMSArIDMpCisjZGVmaW5lIFNJWkVfTkRMVFlQRV9DT05UUk9MTE9PUCAgICAoMSArIDMpCisjZGVmaW5lIFNJWkVfTkRMVFlQRV9BUlJJVkFMUkFURSAgICAoMSArIDEzKQorI2RlZmluZSBTSVpFX05ETFRZUEVfQ0hBTk5FTExPQUQgICAgKDEgKyAxMCkKKyNkZWZpbmUgU0laRV9ORExUWVBFX0NIQU5ORUxVU0UgICAgICgxICsgMTMpCisjZGVmaW5lIFNJWkVfTkRMVFlQRV9EQVRBUkFURSAgICAgICAoMSArIDMpCisjZGVmaW5lIFNJWkVfTkRMVFlQRV9ESVNUQU5DRSAgICAgICAoMSArIDEyKQorI2RlZmluZSBTSVpFX05ETFRZUEVfTlVNQkVSRUxFTUVOVFMgKDEgKyA2KQorI2RlZmluZSBTSVpFX05ETFRZUEVfUEFDS0VURFVSQVRJT04gKDEgKyAxMSkKKyNkZWZpbmUgU0laRV9ORExUWVBFX1BBQ0tFVElOVEVSVkFMICgxICsgMTApCisjZGVmaW5lIFNJWkVfTkRMVFlQRV9QQVRITE9TUyAgICAgICAoMSArIDUpCisjZGVmaW5lIFNJWkVfTkRMVFlQRV9SWFBPV0VSICAgICAgICAoMSArIDcpCisjZGVmaW5lIFNJWkVfTkRMVFlQRV9TTlIgICAgICAgICAgICAoMSArIDcpCisjZGVmaW5lIFNJWkVfTkRMVFlQRV9USU1JTkcgICAgICAgICAoMSArIDEyKQorI2RlZmluZSBTSVpFX05ETFRZUEVfVFhQT1dFUiAgICAgICAgKDEgKyA3KQorI2RlZmluZSBTSVpFX05ETFRZUEVfUkFUSU8gICAgICAgICAgKDEgKyA3KQorI2RlZmluZSBTSVpFX05ETFRZUEVfRVhQT05FTlQgICAgICAgKDEgKyA3KQorI2RlZmluZSBTSVpFX05ETFRZUEVfUVVFVUVTVEFUVVMgICAgKDEgKyAxKQorI2RlZmluZSBTSVpFX05ETFRZUEVfRENDTUVDSEFOSVNNICAgKDEgKyA2KQorI2RlZmluZSBTSVpFX0JZVEUgICAgICAgICAgICAgICAgICAgKDgpCisKKyNkZWZpbmUgSU5WQUxJRF9BQ1BSSU8gICAgICAgICAgKCgxIDw8IFNJWkVfTkRMVFlQRV9BQ1BSSU8pIC0gMSkKKyNkZWZpbmUgSU5WQUxJRF9DT05UUk9MTE9PUCAgICAgKCgxIDw8IFNJWkVfTkRMVFlQRV9DT05UUk9MTE9PUCkgLSAxKQorI2RlZmluZSBJTlZBTElEX0FSUklWQUxSQVRFICAgICAoKDEgPDwgU0laRV9ORExUWVBFX0FSUklWQUxSQVRFKSAtIDEpCisjZGVmaW5lIElOVkFMSURfQ0hBTk5FTExPQUQgICAgICgoMSA8PCBTSVpFX05ETFRZUEVfQ0hBTk5FTExPQUQpIC0gMSkKKyNkZWZpbmUgSU5WQUxJRF9DSEFOTkVMVVNFICAgICAgKCgxIDw8IFNJWkVfTkRMVFlQRV9DSEFOTkVMVVNFKSAtIDEpCisjZGVmaW5lIElOVkFMSURfREFUQVJBVEUgICAgICAgICgoMSA8PCBTSVpFX05ETFRZUEVfREFUQVJBVEUpIC0gMSkKKyNkZWZpbmUgSU5WQUxJRF9ESVNUQU5DRSAgICAgICAgKCgxIDw8IFNJWkVfTkRMVFlQRV9ESVNUQU5DRSkgLSAxKQorI2RlZmluZSBJTlZBTElEX05VTUJFUkVMRU1FTlRTICAoKDEgPDwgU0laRV9ORExUWVBFX05VTUJFUkVMRU1FTlRTKSAtIDEpCisjZGVmaW5lIElOVkFMSURfUEFDS0VURFVSQVRJT04gICgoMSA8PCBTSVpFX05ETFRZUEVfUEFDS0VURFVSQVRJT04pIC0gMSkKKyNkZWZpbmUgSU5WQUxJRF9QQUNLRVRJTlRFUlZBTCAgKCgxIDw8IFNJWkVfTkRMVFlQRV9QQUNLRVRJTlRFUlZBTCkgLSAxKQorI2RlZmluZSBJTlZBTElEX1BBVEhMT1NTICAgICAgICAoKDEgPDwgU0laRV9ORExUWVBFX1BBVEhMT1NTKSAtIDEpCisjZGVmaW5lIElOVkFMSURfUlhQT1dFUiAgICAgICAgICgoMSA8PCBTSVpFX05ETFRZUEVfUlhQT1dFUikgLSAxKQorI2RlZmluZSBJTlZBTElEX1NOUiAgICAgICAgICAgICAoKDEgPDwgU0laRV9ORExUWVBFX1NOUikgLSAxKQorI2RlZmluZSBJTlZBTElEX1RJTUlORyAgICAgICAgICAoKDEgPDwgU0laRV9ORExUWVBFX1RJTUlORykgLSAxKQorI2RlZmluZSBJTlZBTElEX1RYUE9XRVIgICAgICAgICAoKDEgPDwgU0laRV9ORExUWVBFX1RYUE9XRVIpIC0gMSkKKyNkZWZpbmUgSU5WQUxJRF9SQVRJTyAgICAgICAgICAgKCgxIDw8IFNJWkVfTkRMVFlQRV9SQVRJTykgLSAxKQorI2RlZmluZSBJTlZBTElEX0VYUE9ORU5UICAgICAgICAoKDEgPDwgU0laRV9ORExUWVBFX0VYUE9ORU5UKSAtIDEpCisjZGVmaW5lIElOVkFMSURfUVVFVUVTVEFUUyAgICAgICgoMSA8PCBTSVpFX05ETFRZUEVfUVVFVUVTVEFUVVMpIC0gMSkKKyNkZWZpbmUgSU5WQUxJRF9EQ0NNRUNIQU5JU00gICAgKCgxIDw8IFNJWkVfTkRMVFlQRV9EQ0NNRUNIQU5JU00pIC0gMSkKKworLyoqCisgKiAgVGhlIE1DU19DT1VOVCBtYWNybyBjYW5ub3QgYmUgbW9kaWZpZWQgd2l0aG91dCBicmVha2luZworICogIFdNSSBjb21wYXRpYmlsaXR5LgorICovCisjZGVmaW5lIE1DU19DT1VOVCAgICAgICAgICAgICAgICg4KQorCisvKioKKyAqIEZsYWdzIGZvciBuZGxUeXBlX2RjY01lY2hhbmlzbS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlEQ0NfTUVDSEFOSVNNX1RQQyA9IDEsCisJRENDX01FQ0hBTklTTV9UUkMgPSAyLAorCURDQ19NRUNIQU5JU01fVERDID0gNCwKKwlEQ0NfTUVDSEFOSVNNX0RTQyA9IDgsCisJRENDX01FQ0hBTklTTV9UQUMgPSAxNiwKKwlEQ0NfTUVDSEFOSVNNX1JFU0VSVkVEID0gMzIsCisJRENDX01FQ0hBTklTTV9BTEwgPSAweDNmLAorfSB3bWlfZGNjX25kbF90eXBlX2RjY19tZWNoYW5pc207CisKKy8qKiBWYWx1ZXMgZm9yIG5kbFR5cGVfcXVldWVTdGF0dXMuICovCit0eXBlZGVmIGVudW0geworCURDQ19RVUVVRV9DTE9TRUQgPSAwLAorCURDQ19RVUVVRV9PUEVOID0gMSwKK30gd21pX2RjY19uZGxfdHlwZV9xdWV1ZV9zdGF0dXM7CisKKy8qKgorICAqIEZvciBuZGxUeXBlX2FjUHJpbywgdXNlIHRoZSB2YWx1ZXMgaW4gd21pX3RyYWZmaWNfYWMuCisgICogVmFsdWVzIGZvciBuZGxUeXBlX2RhdGFyYXRlLgorICAqLwordHlwZWRlZiBlbnVtIHsKKwlEQ0NfREFUQVJBVEVfM19NQlBTID0gMCwKKwlEQ0NfREFUQVJBVEVfNF81X01CUFMgPSAxLAorCURDQ19EQVRBUkFURV82X01CUFMgPSAyLAorCURDQ19EQVRBUkFURV85X01CUFMgPSAzLAorCURDQ19EQVRBUkFURV8xMl9NQlBTID0gNCwKKwlEQ0NfREFUQVJBVEVfMThfTUJQUyA9IDUsCisJRENDX0RBVEFSQVRFXzI0X01CUFMgPSA2LAorCURDQ19EQVRBUkFURV8yN19NQlBTID0gNywKK30gd21pX2RjY19uZGxfdHlwZV9kYXRhcmF0ZTsKKworLyoqIERhdGEgc3RydWN0dXJlIGZvciBhY3RpdmUgc3RhdGUgY29uZmlndXJhdGlvbi4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9jb25maWcKKwkqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqCisJKiBORExfYXNTdGF0ZUlkLCBuZGxUeXBlX251bWJlckVsZW1lbnRzLCAxKzYgYml0cy4KKwkqIE5ETF9hc0NoYW5Mb2FkLCBuZGxUeXBlX2NoYW5uZWxMb2FkLCAxKzEwIGJpdHMuCisJKi8KKwlBX1VJTlQzMiBzdGF0ZV9pbmZvOworCS8qKgorCSogTkRMX2FzRGNjKEFDX0JLKSwgbmRsVHlwZV9kY2NNZWNoYW5pc20sIDErNiBiaXRzLgorCSogTkRMX2FzRGNjKEFDX0JFKSwgbmRsVHlwZV9kY2NNZWNoYW5pc20sIDErNiBiaXRzLgorCSogTkRMX2FzRGNjKEFDX1ZJKSwgbmRsVHlwZV9kY2NNZWNoYW5pc20sIDErNiBiaXRzLgorCSogTkRMX2FzRGNjKEFDX1ZPKSwgbmRsVHlwZV9kY2NNZWNoYW5pc20sIDErNiBiaXRzLgorCSovCisJQV9VSU5UMzIgYXNfZGNjW1dNSV9QQUNLRURfQVJSX1NJWkUoV0xBTl9NQVhfQUMsIFNJWkVfTkRMVFlQRV9EQ0NNRUNIQU5JU00pXTsKKwkvKioKKwkqIE5ETF9hc1R4UG93ZXIoQUNfQkspLCBuZGxUeXBlX3R4UG93ZXIsIDErNyBiaXRzLgorCSogTkRMX2FzVHhQb3dlcihBQ19CRSksIG5kbFR5cGVfdHhQb3dlciwgMSs3IGJpdHMuCisJKiBORExfYXNUeFBvd2VyKEFDX1ZJKSwgbmRsVHlwZV90eFBvd2VyLCAxKzcgYml0cy4KKwkqIE5ETF9hc1R4UG93ZXIoQUNfVk8pLCBuZGxUeXBlX3R4UG93ZXIsIDErNyBiaXRzLgorCSovCisJQV9VSU5UMzIgYXNfdHhfcG93ZXJfYWNbV01JX1BBQ0tFRF9BUlJfU0laRShXTEFOX01BWF9BQywgU0laRV9ORExUWVBFX1RYUE9XRVIpXTsKKwkvKioKKwkqIE5ETF9hc1BhY2tldEludGVydmFsKEFDX0JLKSwgbmRsVHlwZV9wYWNrZXRJbnRlcnZhbCwgMSsxMCBiaXRzLgorCSogTkRMX2FzUGFja2V0SW50ZXJ2YWwoQUNfQkUpLCBuZGxUeXBlX3BhY2tldEludGVydmFsLCAxKzEwIGJpdHMuCisJKiBORExfYXNQYWNrZXRJbnRlcnZhbChBQ19WSSksIG5kbFR5cGVfcGFja2V0SW50ZXJ2YWwsIDErMTAgYml0cy4KKwkqIE5ETF9hc1BhY2tldEludGVydmFsKEFDX1ZPKSwgbmRsVHlwZV9wYWNrZXRJbnRlcnZhbCwgMSsxMCBiaXRzLgorCSovCisJQV9VSU5UMzIgYXNfcGFja2V0X2ludGVydmFsX2FjW1dNSV9QQUNLRURfQVJSX1NJWkUoV0xBTl9NQVhfQUMsIFNJWkVfTkRMVFlQRV9QQUNLRVRJTlRFUlZBTCldOworCS8qKgorCSogTkRMX2FzRGF0YXJhdGUoQUNfQkspLCBuZGxUeXBlX2RhdGFyYXRlLCAxKzMgYml0cy4KKwkqIE5ETF9hc0RhdGFyYXRlKEFDX0JFKSwgbmRsVHlwZV9kYXRhcmF0ZSwgMSszIGJpdHMuCisJKiBORExfYXNEYXRhcmF0ZShBQ19WSSksIG5kbFR5cGVfZGF0YXJhdGUsIDErMyBiaXRzLgorCSogTkRMX2FzRGF0YXJhdGUoQUNfVk8pLCBuZGxUeXBlX2RhdGFyYXRlLCAxKzMgYml0cy4KKwkqLworCUFfVUlOVDMyIGFzX2RhdGFyYXRlX2FjW1dNSV9QQUNLRURfQVJSX1NJWkUoV0xBTl9NQVhfQUMsIFNJWkVfTkRMVFlQRV9EQVRBUkFURSldOworCS8qKgorCSogTkRMX2FzQ2FycmllclNlbnNlKEFDX0JLKSwgbmRsVHlwZV9yeFBvd2VyLCAxKzcgYml0cy4KKwkqIE5ETF9hc0NhcnJpZXJTZW5zZShBQ19CRSksIG5kbFR5cGVfcnhQb3dlciwgMSs3IGJpdHMuCisJKiBORExfYXNDYXJyaWVyU2Vuc2UoQUNfVkkpLCBuZGxUeXBlX3J4UG93ZXIsIDErNyBiaXRzLgorCSogTkRMX2FzQ2FycmllclNlbnNlKEFDX1ZPKSwgbmRsVHlwZV9yeFBvd2VyLCAxKzcgYml0cy4KKwkqLworCUFfVUlOVDMyIGFzX2NhcnJpZXJfc2Vuc2VfYWNbV01JX1BBQ0tFRF9BUlJfU0laRShXTEFOX01BWF9BQywgU0laRV9ORExUWVBFX1JYUE9XRVIpXTsKK30gd21pX2RjY19uZGxfYWN0aXZlX3N0YXRlX2NvbmZpZzsKKworI2RlZmluZSBXTUlfTkRMX0FTX1NUQVRFX0lEX0dFVChwdHIpICAgICAgICAgICAgICAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPnN0YXRlX2luZm8sIDAsIDcpCisjZGVmaW5lIFdNSV9ORExfQVNfU1RBVEVfSURfU0VUKHB0ciwgdmFsKSAgICAgICAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPnN0YXRlX2luZm8sIDAsIDcsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9BU19DSEFOX0xPQURfR0VUKHB0cikgICAgICAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5zdGF0ZV9pbmZvLCA3LCAxMSkKKyNkZWZpbmUgV01JX05ETF9BU19DSEFOX0xPQURfU0VUKHB0ciwgdmFsKSAgICAgICAgICAgICAgIFdNSV9TRVRfQklUUygocHRyKS0+c3RhdGVfaW5mbywgNywgMTEsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9BU19EQ0NfR0VUKHB0ciwgYWNwcmlvKSAgICAgICAgICAgICAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT5hc19kY2MsIGFjcHJpbywgU0laRV9ORExUWVBFX0RDQ01FQ0hBTklTTSkKKyNkZWZpbmUgV01JX05ETF9BU19EQ0NfU0VUKHB0ciwgYWNwcmlvLCB2YWwpICAgICAgICAgICAgICB3bWlfcGFja2VkX2Fycl9zZXRfYml0cygocHRyKS0+YXNfZGNjLCBhY3ByaW8sIFNJWkVfTkRMVFlQRV9EQ0NNRUNIQU5JU00sIHZhbCkKKyNkZWZpbmUgV01JX05ETF9BU19UWF9QT1dFUl9HRVQocHRyLCBhY3ByaW8pICAgICAgICAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT5hc190eF9wb3dlcl9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfVFhQT1dFUikKKyNkZWZpbmUgV01JX05ETF9BU19UWF9QT1dFUl9TRVQocHRyLCBhY3ByaW8sIHZhbCkgICAgICAgICB3bWlfcGFja2VkX2Fycl9zZXRfYml0cygocHRyKS0+YXNfdHhfcG93ZXJfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX1RYUE9XRVIsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9BU19QQUNLRVRfSU5URVJWQUxfR0VUKHB0ciwgYWNwcmlvKSAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT5hc19wYWNrZXRfaW50ZXJ2YWxfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX1BBQ0tFVElOVEVSVkFMKQorI2RlZmluZSBXTUlfTkRMX0FTX1BBQ0tFVF9JTlRFUlZBTF9TRVQocHRyLCBhY3ByaW8sIHZhbCkgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT5hc19wYWNrZXRfaW50ZXJ2YWxfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX1BBQ0tFVElOVEVSVkFMLCB2YWwpCisjZGVmaW5lIFdNSV9ORExfQVNfREFUQVJBVEVfR0VUKHB0ciwgYWNwcmlvKSAgICAgICAgICAgICB3bWlfcGFja2VkX2Fycl9nZXRfYml0cygocHRyKS0+YXNfZGF0YXJhdGVfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX0RBVEFSQVRFKQorI2RlZmluZSBXTUlfTkRMX0FTX0RBVEFSQVRFX1NFVChwdHIsIGFjcHJpbywgdmFsKSAgICAgICAgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT5hc19kYXRhcmF0ZV9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfREFUQVJBVEUsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9BU19DQVJSSUVSX1NFTlNFX0dFVChwdHIsIGFjcHJpbykgICAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT5hc19jYXJyaWVyX3NlbnNlX2FjLCBhY3ByaW8sIFNJWkVfTkRMVFlQRV9SWFBPV0VSKQorI2RlZmluZSBXTUlfTkRMX0FTX0NBUlJJRVJfU0VOU0VfU0VUKHB0ciwgYWNwcmlvLCB2YWwpICAgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT5hc19jYXJyaWVyX3NlbnNlX2FjLCBhY3ByaW8sIFNJWkVfTkRMVFlQRV9SWFBPV0VSLCB2YWwpCisKKy8qKiBEYXRhIHN0cnVjdHVyZSBmb3IgRURDQS9RT1MgcGFyYW1ldGVycy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9xb3NfcGFyYW1ldGVyICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogQXJiaXRyYXRpb24gSW50ZXItRnJhbWUgU3BhY2luZy4gUmFuZ2U6IDItMTUgKi8KKwlBX1VJTlQzMiBhaWZzbjsKKwkvKiogQ29udGVudGlvbiBXaW5kb3cgbWluaW11bS4gUmFuZ2U6IDEgLSAxMCAqLworCUFfVUlOVDMyIGN3bWluOworCS8qKiBDb250ZW50aW9uIFdpbmRvdyBtYXhpbXVtLiBSYW5nZTogMSAtIDEwICovCisJQV9VSU5UMzIgY3dtYXg7Cit9IHdtaV9xb3NfcGFyYW1ldGVyOworCisvKiogRGF0YSBzdHJ1Y3R1cmUgZm9yIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgY2hhbm5lbC4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2JfY2hhbm5lbCAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgYmFuZHdpZHRoOyAvKiBNSHogdW5pdHMgKi8KKwl3bWlfbWFjX2FkZHIgbWFjX2FkZHJlc3M7Cit9IHdtaV9vY2JfY2hhbm5lbDsKKworLyoqIERhdGEgc3RydWN0dXJlIGZvciBhbiBlbGVtZW50IG9mIHRoZSBzY2hlZHVsZSBhcnJheS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc2NoZWR1bGVfZWxlbWVudCAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgY2hhbm5lbF9mcmVxOyAvKiBNSHogdW5pdHMgKi8KKwlBX1VJTlQzMiB0b3RhbF9kdXJhdGlvbjsgLyogbXMgdW5pdHMgKi8KKwlBX1VJTlQzMiBndWFyZF9pbnRlcnZhbDsgLyogbXMgdW5pdHMgKi8KK30gd21pX29jYl9zY2hlZHVsZV9lbGVtZW50OworCisvKiogRGF0YSBzdHJ1Y3R1cmUgZm9yIE9DQiBjb25maWd1cmF0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkqIFdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9zZXRfY29uZmlnX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqIFZERVYgaWQoaW50ZXJmYWNlKSB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGNoYW5uZWxfY291bnQ7CisJQV9VSU5UMzIgc2NoZWR1bGVfc2l6ZTsKKwlBX1VJTlQzMiBmbGFnczsKKworCS8qKiBUaGlzIGlzIGZvbGxvd2VkIGJ5IGEgVExWIGFycmF5IG9mIHdtaV9jaGFubmVsLgorCSogVGhpcyBpcyBmb2xsb3dlZCBieSBhIFRMViBhcnJheSBvZiB3bWlfb2NiX2NoYW5uZWwuCisJKiBUaGlzIGlzIGZvbGxvd2VkIGJ5IGEgVExWIGFycmF5IG9mIHdtaV9xb3NfcGFyYW1ldGVyLgorCSogVGhpcyBpcyBmb2xsb3dlZCBieSBhIFRMViBhcnJheSBvZiB3bWlfZGNjX25kbF9jaGFuLgorCSogVGhpcyBpcyBmb2xsb3dlZCBieSBhIFRMViBhcnJheSBvZiB3bWlfZGNjX25kbF9hY3RpdmVfc3RhdGVfY29uZmlnLgorCSogVGhpcyBpcyBmb2xsb3dlZCBieSBhIFRMViBhcnJheSBvZiB3bWlfb2NiX3NjaGVkdWxlX2VsZW1lbnQuCisJKi8KK30gd21pX29jYl9zZXRfY29uZmlnX2NtZF9maXhlZF9wYXJhbTsKKworCisjZGVmaW5lIEVYUElSWV9USU1FX0lOX1RTRl9USU1FU1RBTVBfT0ZGU0VUIDAKKyNkZWZpbmUgRVhQSVJZX1RJTUVfSU5fVFNGX1RJTUVTVEFNUF9NQVNLIDEKKworI2RlZmluZSBXTUlfT0NCX0VYUElSWV9USU1FX0lOX1RTRihwdHIpIFwKKwkoKChwdHIpLT5mbGFncyAmIEVYUElSWV9USU1FX0lOX1RTRl9USU1FU1RBTVBfTUFTSykgPj4gRVhQSVJZX1RJTUVfSU5fVFNGX1RJTUVTVEFNUF9PRkZTRVQpCisKKworLyoqIERhdGEgc3RydWN0dXJlIGZvciB0aGUgcmVzcG9uc2UgdG8gdGhlIFdNSV9PQ0JfU0VUX0NPTkZJR19DTURJRCBjb21tYW5kLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc2V0X2NvbmZpZ19yZXNwX2V2ZW50X2ZpeGVkX3BhcmFtCisJKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qIFZERVYgaWQoaW50ZXJmYWNlKSovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBzdGF0dXM7Cit9IHdtaV9vY2Jfc2V0X2NvbmZpZ19yZXNwX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiBTSVpFX1VUQ19USU1FIGFuZCBTSVpFX1VUQ19USU1FX0VSUk9SIGNhbm5vdCBiZSBtb2RpZmllZCB3aXRob3V0IGJyZWFraW5nCisgKiBXTUkgY29tcGF0aWJpbGl0eS4KKyAqLworLyogVGhlIHNpemUgb2YgdGhlIHV0YyB0aW1lIGluIGJ5dGVzLiAqLworI2RlZmluZSBTSVpFX1VUQ19USU1FICgxMCkKKy8qIFRoZSBzaXplIG9mIHRoZSB1dGMgdGltZSBlcnJvciBpbiBieXRlcy4gKi8KKyNkZWZpbmUgU0laRV9VVENfVElNRV9FUlJPUiAoNSkKKworLyoqIERhdGEgc3RydWN0dXJlIHRvIHNldCB0aGUgVVRDIHRpbWUuICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSogIFdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9zZXRfdXRjX3RpbWVfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKlZERVYgSWRlbnRpZmllciovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogMTAgYnl0ZXMgb2YgdGhlIHV0YyB0aW1lLiAqLworCUFfVUlOVDMyIHV0Y190aW1lW1dNSV9QQUNLRURfQVJSX1NJWkUoU0laRV9VVENfVElNRSwgU0laRV9CWVRFKV07CisJLyoqIDUgYnl0ZXMgb2YgdGhlIHRpbWUgZXJyb3IuICovCisJQV9VSU5UMzIgdGltZV9lcnJvcltXTUlfUEFDS0VEX0FSUl9TSVpFKFNJWkVfVVRDX1RJTUVfRVJST1IsIFNJWkVfQllURSldOworfSB3bWlfb2NiX3NldF91dGNfdGltZV9jbWRfZml4ZWRfcGFyYW07CisKKyNkZWZpbmUgV01JX1VUQ19USU1FX0dFVChwdHIsIGJ5dGVfaW5kZXgpICAgICAgICAgd21pX3BhY2tlZF9hcnJfZ2V0X2JpdHMoKHB0ciktPnV0Y190aW1lLCBieXRlX2luZGV4LCBTSVpFX0JZVEUpCisjZGVmaW5lIFdNSV9VVENfVElNRV9TRVQocHRyLCBieXRlX2luZGV4LCB2YWwpICAgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT51dGNfdGltZSwgYnl0ZV9pbmRleCwgU0laRV9CWVRFLCB2YWwpCisjZGVmaW5lIFdNSV9USU1FX0VSUk9SX0dFVChwdHIsIGJ5dGVfaW5kZXgpICAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT50aW1lX2Vycm9yLCBieXRlX2luZGV4LCBTSVpFX0JZVEUpCisjZGVmaW5lIFdNSV9USU1FX0VSUk9SX1NFVChwdHIsIGJ5dGVfaW5kZXgsIHZhbCkgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT50aW1lX2Vycm9yLCBieXRlX2luZGV4LCBTSVpFX0JZVEUsIHZhbCkKKworLyoqIERhdGEgc3RydWN0dXJlIHN0YXJ0IHRoZSB0aW1pbmcgYWR2ZXJ0aXNlbWVudC4gVGhlIHRlbXBsYXRlIGZvciB0aGUKKyAqICB0aW1pbmcgYWR2ZXJ0aXNlbWVudCBmcmFtZSBmb2xsb3dzIHRoaXMgc3RydWN0dXJlIGluIHRoZSBXTUkgY29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2Jfc3RhcnRfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qVkRFViBJZGVudGlmaWVyKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBOdW1iZXIgb2YgdGltZXMgdGhlIFRBIGlzIHNlbnQgZXZlcnkgNSBzZWNvbmRzLiAqLworCUFfVUlOVDMyIHJlcGVhdF9yYXRlOworCS8qKiBUaGUgZnJlcXVlbmN5IG9uIHdoaWNoIHRvIHRyYW5zbWl0LiAqLworCUFfVUlOVDMyIGNoYW5uZWxfZnJlcTsgLyogTUh6IHVuaXRzICovCisJLyoqIFRoZSBvZmZzZXQgaW50byB0aGUgdGVtcGxhdGUgb2YgdGhlIHRpbWVzdGFtcC4gKi8KKwlBX1VJTlQzMiB0aW1lc3RhbXBfb2Zmc2V0OworCS8qKiBUaGUgb2Zmc2V0IGludG8gdGhlIHRlbXBsYXRlIG9mIHRoZSB0aW1lIHZhbHVlLiAqLworCUFfVUlOVDMyIHRpbWVfdmFsdWVfb2Zmc2V0OworCS8qKiBUaGUgbGVuZ3RoIG9mIHRoZSB0aW1pbmcgYWR2ZXJ0aXNlbWVudCB0ZW1wbGF0ZS4gVGhlCisJKiAgdGVtcGxhdGUgaXMgaW4gdGhlIFRMViBkYXRhLiAqLworCUFfVUlOVDMyIHRpbWluZ19hZHZlcnRfdGVtcGxhdGVfbGVuZ3RoOworCS8qKiBUaGlzIGlzIGZvbGxvd2VkIGJ5IGEgYmluYXJ5IGFycmF5IGNvbnRhaW5pbmcgdGhlIFRBIHRlbXBsYXRlLiAqLworfSB3bWlfb2NiX3N0YXJ0X3RpbWluZ19hZHZlcnRfY21kX2ZpeGVkX3BhcmFtOworCisvKiogRGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcCB0aGUgdGltaW5nIGFkdmVydGlzZW1lbnQuICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSogIFdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9zdG9wX3RpbWluZ19hZHZlcnRfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKlZERVYgSWRlbnRpZmllciovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBjaGFubmVsX2ZyZXE7IC8qIE1IeiB1bml0cyAqLworfSB3bWlfb2NiX3N0b3BfdGltaW5nX2FkdmVydF9jbWRfZml4ZWRfcGFyYW07CisKKy8qKiBEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHJlcXVlc3QgZm9yIFdNSV9PQ0JfR0VUX1RTRl9USU1FUl9DTURJRC4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJKiAgV01JVExWX1RBR19TVFJVQ193bWlfb2NiX2dldF90c2ZfdGltZXJfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKlZERVYgSWRlbnRpZmllciovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiByZXNlcnZlZDsKK30gd21pX29jYl9nZXRfdHNmX3RpbWVyX2NtZF9maXhlZF9wYXJhbTsKKworLyoqIERhdGEgc3RydWN0dXJlIGZvciB0aGUgcmVzcG9uc2UgdG8gV01JX09DQl9HRVRfVFNGX1RJTUVSX0NNRElELiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkqICBXTUlUTFZfVEFHX1NUUlVDX3dtaV9vY2JfZ2V0X3RzZl90aW1lcl9yZXNwX2V2ZW50X2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKlZERVYgSWRlbnRpZmllciovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiB0c2ZfdGltZXJfaGlnaDsKKwlBX1VJTlQzMiB0c2ZfdGltZXJfbG93OworfSB3bWlfb2NiX2dldF90c2ZfdGltZXJfcmVzcF9ldmVudF9maXhlZF9wYXJhbTsKKworLyoqIERhdGEgc3RydWN0dXJlIGZvciBEQ0Mgc3RhdHMgY29uZmlndXJhdGlvbiBwZXIgY2hhbm5lbC4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJKiAgV01JVExWX1RBR19TVFJVQ193bWlfZGNjX25kbF9zdGF0c19wZXJfY2hhbm5lbCAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisKKwkvKlZERVYgSWRlbnRpZmllciovCisJQV9VSU5UMzIgdmRldl9pZDsKKworCS8qKiBUaGUgY2hhbm5lbCBmb3Igd2hpY2ggdGhpcyBhcHBsaWVzLCAxNiBiaXRzLgorCSAqICBUaGUgZGNjX3N0YXRzX2JpdG1hcCwgOCBiaXRzLiAqLworCUFfVUlOVDMyIGNoYW5faW5mbzsKKworCS8qKiBEZW1vZHVsYXRpb24gbW9kZWwgcGFyYW1ldGVycy4KKwkqCisJKiBORExfc25yQmFja29mZihNQ1MwKSwgbmRsVHlwZV9zbnIsIDErNyBiaXRzLgorCSogTkRMX3NuckJhY2tvZmYoTUNTMSksIG5kbFR5cGVfc25yLCAxKzcgYml0cy4KKwkqIE5ETF9zbnJCYWNrb2ZmKE1DUzIpLCBuZGxUeXBlX3NuciwgMSs3IGJpdHMuCisJKiBORExfc25yQmFja29mZihNQ1MzKSwgbmRsVHlwZV9zbnIsIDErNyBiaXRzLgorCSogTkRMX3NuckJhY2tvZmYoTUNTNCksIG5kbFR5cGVfc25yLCAxKzcgYml0cy4KKwkqIE5ETF9zbnJCYWNrb2ZmKE1DUzUpLCBuZGxUeXBlX3NuciwgMSs3IGJpdHMuCisJKiBORExfc25yQmFja29mZihNQ1M2KSwgbmRsVHlwZV9zbnIsIDErNyBiaXRzLgorCSogTkRMX3NuckJhY2tvZmYoTUNTNyksIG5kbFR5cGVfc25yLCAxKzcgYml0cy4KKwkqLworCUFfVUlOVDMyIHNucl9iYWNrb2ZmX21jc1tXTUlfUEFDS0VEX0FSUl9TSVpFKE1DU19DT1VOVCwgU0laRV9ORExUWVBFX1NOUildOworCisJLyoqIENvbW11bmljYXRpb24gcmFuZ2VzLgorCSAqCisJICogdHhfcG93ZXIsIG5kbFR5cGVfdHhQb3dlciwgMSs3IGJpdHMuCisJICogZGF0YXJhdGUsIG5kbFR5cGVfZGF0YXJhdGUsIDErMyBiaXRzLgorCSAqLworCUFfVUlOVDMyIHR4X3Bvd2VyX2RhdGFyYXRlOworCS8qKgorCSogTkRMX2NhcnJpZXJTZW5zZVJhbmdlLCBuZGxUeXBlX2Rpc3RhbmNlLCAxKzEyIGJpdHMuCisJKiBORExfZXN0Q29tbVJhbmdlLCBuZGxUeXBlX2Rpc3RhbmNlLCAxKzEyIGJpdHMuCisJKi8KKwlBX1VJTlQzMiBjYXJyaWVyX3NlbnNlX2VzdF9jb21tX3JhbmdlOworCisJLyoqIENoYW5uZWwgbG9hZCBtZWFzdXJlcy4gKi8KKwkvKioKKwkgKiBkY2NTZW5zaXRpdml0eSwgbmRsVHlwZV9yeFBvd2VyLCAxKzcgYml0cy4KKwkgKiBjYXJyaWVyU2Vuc2UsIG5kbFR5cGVfcnhQb3dlciwgMSs3IGJpdHMuCisJICogTkRMX2NoYW5uZWxMb2FkLCBuZGxUeXBlX2NoYW5uZWxMb2FkLCAxKzEwIGJpdHMuCisJICovCisJQV9VSU5UMzIgZGNjX3N0YXRzOworCS8qKgorCSogTkRMX3BhY2tldEFycml2YWxSYXRlLCBuZGxUeXBlX2Fycml2YWxSYXRlLCAxKzEzIGJpdHMuCisJKiBORExfcGFja2V0QXZnRHVyYXRpb24sIG5kbFR5cGVfcGFja2V0RHVyYXRpb24sIDErMTEgYml0cy4KKwkqLworCUFfVUlOVDMyIHBhY2tldF9zdGF0czsKKwkvKioKKwkgKiBORExfY2hhbm5lbEJ1c3lUaW1lLCBuZGxUeXBlX2NoYW5uZWxMb2FkLCAxKzEwIGJpdHMuCisJICovCisJQV9VSU5UMzIgY2hhbm5lbF9idXN5X3RpbWU7CisJLyoqCisJICpUcmFuc21pdCBwYWNrZXQgc3RhdGlzdGljcy4KKwkgKiBORExfdHhQYWNrZXRBcnJpdmFsUmF0ZShBQ19CSyksIG5kbFR5cGVfYXJyaXZhbFJhdGUsIDErMTMgYml0cy4KKwkgKiBORExfdHhQYWNrZXRBcnJpdmFsUmF0ZShBQ19CRSksIG5kbFR5cGVfYXJyaXZhbFJhdGUsIDErMTMgYml0cy4KKwkgKiBORExfdHhQYWNrZXRBcnJpdmFsUmF0ZShBQ19WSSksIG5kbFR5cGVfYXJyaXZhbFJhdGUsIDErMTMgYml0cy4KKwkgKiBORExfdHhQYWNrZXRBcnJpdmFsUmF0ZShBQ19WTyksIG5kbFR5cGVfYXJyaXZhbFJhdGUsIDErMTMgYml0cy4KKwkgKi8KKwlBX1VJTlQzMiB0eF9wYWNrZXRfYXJyaXZhbF9yYXRlX2FjW1dNSV9QQUNLRURfQVJSX1NJWkUoV0xBTl9NQVhfQUMsIFNJWkVfTkRMVFlQRV9BUlJJVkFMUkFURSldOworCS8qKgorCSAqIE5ETF90eFBhY2tldEF2Z0R1cmF0aW9uKEFDX0JLKSwgbmRsVHlwZV9wYWNrZXREdXJhdGlvbiwgMSsxMSBiaXRzLgorCSAqIE5ETF90eFBhY2tldEF2Z0R1cmF0aW9uKEFDX0JFKSwgbmRsVHlwZV9wYWNrZXREdXJhdGlvbiwgMSsxMSBiaXRzLgorCSAqIE5ETF90eFBhY2tldEF2Z0R1cmF0aW9uKEFDX1ZJKSwgbmRsVHlwZV9wYWNrZXREdXJhdGlvbiwgMSsxMSBiaXRzLgorCSAqIE5ETF90eFBhY2tldEF2Z0R1cmF0aW9uKEFDX1ZPKSwgbmRsVHlwZV9wYWNrZXREdXJhdGlvbiwgMSsxMSBiaXRzLgorCSAqLworCUFfVUlOVDMyIHR4X3BhY2tldF9hdmdfZHVyYXRpb25fYWNbV01JX1BBQ0tFRF9BUlJfU0laRShXTEFOX01BWF9BQywgU0laRV9ORExUWVBFX1BBQ0tFVERVUkFUSU9OKV07CisJLyoqCisJICogTkRMX3R4Q2hhbm5lbFVzZShBQ19CSyksIG5kbFR5cGVfY2hhbm5lbFVzZSwgMSsxMyBiaXRzLgorCSAqIE5ETF90eENoYW5uZWxVc2UoQUNfQkUpLCBuZGxUeXBlX2NoYW5uZWxVc2UsIDErMTMgYml0cy4KKwkgKiBORExfdHhDaGFubmVsVXNlKEFDX1ZJKSwgbmRsVHlwZV9jaGFubmVsVXNlLCAxKzEzIGJpdHMuCisJICogTkRMX3R4Q2hhbm5lbFVzZShBQ19WTyksIG5kbFR5cGVfY2hhbm5lbFVzZSwgMSsxMyBiaXRzLgorCSAqLworCUFfVUlOVDMyIHR4X2NoYW5uZWxfdXNlX2FjW1dNSV9QQUNLRURfQVJSX1NJWkUoV0xBTl9NQVhfQUMsIFNJWkVfTkRMVFlQRV9DSEFOTkVMVVNFKV07CisJLyoqCisJICogTkRMX3R4U2lnbmFsQXZnUG93ZXIoQUNfQkspLCBuZGxUeXBlX3R4UG93ZXIsIDErNyBiaXRzLgorCSAqIE5ETF90eFNpZ25hbEF2Z1Bvd2VyKEFDX0JFKSwgbmRsVHlwZV90eFBvd2VyLCAxKzcgYml0cy4KKwkgKiBORExfdHhTaWduYWxBdmdQb3dlcihBQ19WSSksIG5kbFR5cGVfdHhQb3dlciwgMSs3IGJpdHMuCisJICogTkRMX3R4U2lnbmFsQXZnUG93ZXIoQUNfVk8pLCBuZGxUeXBlX3R4UG93ZXIsIDErNyBiaXRzLgorCSAqLworCUFfVUlOVDMyIHR4X3NpZ25hbF9hdmdfcG93ZXJfYWNbV01JX1BBQ0tFRF9BUlJfU0laRShXTEFOX01BWF9BQywgU0laRV9ORExUWVBFX1RYUE9XRVIpXTsKK30gd21pX2RjY19uZGxfc3RhdHNfcGVyX2NoYW5uZWw7CisKKyNkZWZpbmUgV01JX05ETF9TVEFUU19TTlJfQkFDS09GRl9HRVQocHRyLCBtY3MpICAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT5zbnJfYmFja29mZl9tY3MsIG1jcywgU0laRV9ORExUWVBFX1NOUikKKyNkZWZpbmUgV01JX05ETF9TVEFUU19TTlJfQkFDS09GRl9TRVQocHRyLCBtY3MsIHZhbCkgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT5zbnJfYmFja29mZl9tY3MsIG1jcywgU0laRV9ORExUWVBFX1NOUiwgdmFsKQorI2RlZmluZSBXTUlfTkRMX1NUQVRTX0NIQU5fRlJFUV9HRVQocHRyKSAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5jaGFuX2luZm8sIDAsIDE2KQorI2RlZmluZSBXTUlfTkRMX1NUQVRTX0NIQU5fRlJFUV9TRVQocHRyLCB2YWwpICAgICAgICAgV01JX1NFVF9CSVRTKChwdHIpLT5jaGFuX2luZm8sIDAsIDE2LCB2YWwpCisjZGVmaW5lIFdNSV9ORExfU1RBVFNfRENDX1NUQVRTX0JJVE1BUF9HRVQocHRyKSAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPmNoYW5faW5mbywgMTYsIDgpCisjZGVmaW5lIFdNSV9ORExfU1RBVFNfRENDX1NUQVRTX0JJVE1BUF9TRVQocHRyLCB2YWwpICBXTUlfU0VUX0JJVFMoKHB0ciktPmNoYW5faW5mbywgMTYsIDgsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9TVEFUU19TTlJfQkFDS09GRl9HRVQocHRyLCBtY3MpICAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT5zbnJfYmFja29mZl9tY3MsIG1jcywgU0laRV9ORExUWVBFX1NOUikKKyNkZWZpbmUgV01JX05ETF9TVEFUU19TTlJfQkFDS09GRl9TRVQocHRyLCBtY3MsIHZhbCkgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT5zbnJfYmFja29mZl9tY3MsIG1jcywgU0laRV9ORExUWVBFX1NOUiwgdmFsKQorI2RlZmluZSBXTUlfVFhfUE9XRVJfR0VUKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT50eF9wb3dlcl9kYXRhcmF0ZSwgMCwgOCkKKyNkZWZpbmUgV01JX1RYX1BPV0VSX1NFVChwdHIsIHZhbCkgICAgICAgICAgICAgICAgICAgIFdNSV9TRVRfQklUUygocHRyKS0+dHhfcG93ZXJfZGF0YXJhdGUsIDAsIDgsIHZhbCkKKyNkZWZpbmUgV01JX1RYX0RBVEFSQVRFX0dFVChwdHIpICAgICAgICAgICAgICAgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+dHhfcG93ZXJfZGF0YXJhdGUsIDAsIDQpCisjZGVmaW5lIFdNSV9UWF9EQVRBUkFURV9TRVQocHRyLCB2YWwpICAgICAgICAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPnR4X3Bvd2VyX2RhdGFyYXRlLCAwLCA0LCB2YWwpCisjZGVmaW5lIFdNSV9ORExfQ0FSUklFUl9TRU5TRV9SQU5HRV9HRVQocHRyKSAgICAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPmNhcnJpZXJfc2Vuc2VfZXN0X2NvbW1fcmFuZ2UsIDAsIDEzKQorI2RlZmluZSBXTUlfTkRMX0NBUlJJRVJfU0VOU0VfUkFOR0VfU0VUKHB0ciwgdmFsKSAgICAgV01JX1NFVF9CSVRTKChwdHIpLT5jYXJyaWVyX3NlbnNlX2VzdF9jb21tX3JhbmdlLCAwLCAxMywgdmFsKQorI2RlZmluZSBXTUlfTkRMX0VTVF9DT01NX1JBTkdFX0dFVChwdHIpICAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5jYXJyaWVyX3NlbnNlX2VzdF9jb21tX3JhbmdlLCAxMywgMTMpCisjZGVmaW5lIFdNSV9ORExfRVNUX0NPTU1fUkFOR0VfU0VUKHB0ciwgdmFsKSAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPmNhcnJpZXJfc2Vuc2VfZXN0X2NvbW1fcmFuZ2UsIDEzLCAxMywgdmFsKQorI2RlZmluZSBXTUlfRENDX1NFTlNJVElWSVRZX0dFVChwdHIpICAgICAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5kY2Nfc3RhdHMsIDAsIDgpCisjZGVmaW5lIFdNSV9EQ0NfU0VOU0lUSVZJVFlfU0VUKHB0ciwgdmFsKSAgICAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPmRjY19zdGF0cywgMCwgOCwgdmFsKQorI2RlZmluZSBXTUlfQ0FSUklFUl9TRU5TRV9HRVQocHRyKSAgICAgICAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5kY2Nfc3RhdHMsIDgsIDgpCisjZGVmaW5lIFdNSV9DQVJSSUVSX1NFTlNFX1NFVChwdHIsIHZhbCkgICAgICAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPmRjY19zdGF0cywgOCwgOCwgdmFsKQorI2RlZmluZSBXTUlfTkRMX0NIQU5ORUxfTE9BRF9HRVQocHRyKSAgICAgICAgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+ZGNjX3N0YXRzLCAxNiwgMTEpCisjZGVmaW5lIFdNSV9ORExfQ0hBTk5FTF9MT0FEX1NFVChwdHIsIHZhbCkgICAgICAgICAgIFdNSV9TRVRfQklUUygocHRyKS0+ZGNjX3N0YXRzLCAxNiwgMTEsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9QQUNLRVRfQVJSSVZBTF9SQVRFX0dFVChwdHIpICAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPnBhY2tldF9zdGF0cywgMCwgMTQpCisjZGVmaW5lIFdNSV9ORExfUEFDS0VUX0FSUklWQUxfUkFURV9TRVQocHRyLCB2YWwpICAgIFdNSV9TRVRfQklUUygocHRyKS0+cGFja2V0X3N0YXRzLCAwLCAxNCwgdmFsKQorI2RlZmluZSBXTUlfTkRMX1BBQ0tFVF9BVkdfRFVSQVRJT05fR0VUKHB0cikgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+cGFja2V0X3N0YXRzLCAxNCwgMTIpCisjZGVmaW5lIFdNSV9ORExfUEFDS0VUX0FWR19EVVJBVElPTl9TRVQocHRyLCB2YWwpICAgIFdNSV9TRVRfQklUUygocHRyKS0+cGFja2V0X3N0YXRzLCAxNCwgMTIsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9DSEFOTkVMX0JVU1lfVElNRV9HRVQocHRyKSAgICAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPmNoYW5uZWxfYnVzeV90aW1lLCAwLCAxMSkKKyNkZWZpbmUgV01JX05ETF9DSEFOTkVMX0JVU1lfVElNRV9TRVQocHRyLCB2YWwpICAgICAgV01JX1NFVF9CSVRTKChwdHIpLT5jaGFubmVsX2J1c3lfdGltZSwgMCwgMTEsIHZhbCkKKworI2RlZmluZSBXTUlfTkRMX1RYX1BBQ0tFVF9BUlJJVkFMX1JBVEVfR0VUKHB0ciwgYWNwcmlvKSAgICAgICAgICAgd21pX3BhY2tlZF9hcnJfZ2V0X2JpdHMoKHB0ciktPnR4X3BhY2tldF9hcnJpdmFsX3JhdGVfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX0FSUklWQUxSQVRFKQorI2RlZmluZSBXTUlfTkRMX1RYX1BBQ0tFVF9BUlJJVkFMX1JBVEVfU0VUKHB0ciwgYWNwcmlvLCB2YWwpICAgICAgd21pX3BhY2tlZF9hcnJfc2V0X2JpdHMoKHB0ciktPnR4X3BhY2tldF9hcnJpdmFsX3JhdGVfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX0FSUklWQUxSQVRFLCB2YWwpCisjZGVmaW5lIFdNSV9ORExfVFhfUEFDS0VUX0FWR19EVVJBVElPTl9HRVQocHRyLCBhY3ByaW8pICAgICAgICAgICB3bWlfcGFja2VkX2Fycl9nZXRfYml0cygocHRyKS0+dHhfcGFja2V0X2F2Z19kdXJhdGlvbl9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfUEFDS0VURFVSQVRJT04pCisjZGVmaW5lIFdNSV9ORExfVFhfUEFDS0VUX0FWR19EVVJBVElPTl9TRVQocHRyLCBhY3ByaW8sIHZhbCkgICAgICB3bWlfcGFja2VkX2Fycl9zZXRfYml0cygocHRyKS0+dHhfcGFja2V0X2F2Z19kdXJhdGlvbl9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfUEFDS0VURFVSQVRJT04sIHZhbCkKKyNkZWZpbmUgV01JX05ETF9UWF9DSEFOTkVMX1VTRV9HRVQocHRyLCBhY3ByaW8pICAgICAgICAgICAgICAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT50eF9jaGFubmVsX3VzZV9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfQ0hBTk5FTFVTRSkKKyNkZWZpbmUgV01JX05ETF9UWF9DSEFOTkVMX1VTRV9TRVQocHRyLCBhY3ByaW8sIHZhbCkgICAgICAgICAgICAgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT50eF9jaGFubmVsX3VzZV9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfQ0hBTk5FTFVTRSwgdmFsKQorI2RlZmluZSBXTUlfTkRMX1RYX1NJR05BTF9BVkdfUE9XRVJfR0VUKHB0ciwgYWNwcmlvKSAgICAgICAgICAgICAgd21pX3BhY2tlZF9hcnJfZ2V0X2JpdHMoKHB0ciktPnR4X3NpZ25hbF9hdmdfcG93ZXJfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX1RYUE9XRVIpCisjZGVmaW5lIFdNSV9ORExfVFhfU0lHTkFMX0FWR19QT1dFUl9TRVQocHRyLCBhY3ByaW8sIHZhbCkgICAgICAgICB3bWlfcGFja2VkX2Fycl9zZXRfYml0cygocHRyKS0+dHhfc2lnbmFsX2F2Z19wb3dlcl9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfVFhQT1dFUiwgdmFsKQorCisvKiogQml0bWFwIGZvciBEQ0Mgc3RhdHMuICovCit0eXBlZGVmIGVudW0geworCURDQ19TVEFUU19ERU1PRFVMQVRJT05fTU9ERUwgPSAxLAorCURDQ19TVEFUU19DT01NVU5JQ0FUSU9OX1JBTkdFUyA9IDIsCisJRENDX1NUQVRTX0NIQU5ORUxfTE9BRF9NRUFTVVJFUyA9IDQsCisJRENDX1NUQVRTX1RSQU5TTUlUX1BBQ0tFVF9TVEFUUyA9IDgsCisJRENDX1NUQVRTX1RSQU5TTUlUX01PREVMX1BBUkFNRVRFUiA9IDE2LAorCURDQ19TVEFUU19BTEwgPSAweGZmLAorfSB3bWlfZGNjX3N0YXRzX2JpdG1hcDsKKworLyoqIERhdGEgc3RydWN0dXJlIGZvciBnZXR0aW5nIHRoZSBEQ0Mgc3RhdHMuICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqCisJICogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogV01JVExWX1RBR19TVFJVQ193bWlfZGNjX2dldF9zdGF0c19jbWRfZml4ZWRfcGFyYW0KKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qIFZERVYgaWRlbnRpZmllciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyoqVGhlIG51bWJlciBvZiBjaGFubmVscyBmb3Igd2hpY2ggc3RhdHMgYXJlIGJlaW5nIHJlcXVlc3RlZC4gKi8KKwlBX1VJTlQzMiBudW1fY2hhbm5lbHM7CisJLyoqIFRoaXMgaXMgZm9sbG93ZWQgYnkgYSBUTFYgYXJyYXkgb2Ygd21pX2RjY19jaGFubmVsX3N0YXRzX3JlcXVlc3QuICovCit9IHdtaV9kY2NfZ2V0X3N0YXRzX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKgorCSAqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RjY19jaGFubmVsX3N0YXRzX3JlcXVlc3QuCisJICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogVGhlIGNoYW5uZWwgZm9yIHdoaWNoIHRoaXMgYXBwbGllcy4gKi8KKwlBX1VJTlQzMiBjaGFuX2ZyZXE7IC8qIE1IeiB1bml0cyAqLworCS8qKiBUaGUgRENDIHN0YXRzIGJlaW5nIHJlcXVlc3RlZC4gKi8KKwlBX1VJTlQzMiBkY2Nfc3RhdHNfYml0bWFwOworfSB3bWlfZGNjX2NoYW5uZWxfc3RhdHNfcmVxdWVzdDsKKworLyoqIERhdGEgc3RydWN0dXJlIGZvciB0aGUgcmVzcG9uc2Ugd2l0aCB0aGUgRENDIHN0YXRzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKgorCSAqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RjY19nZXRfc3RhdHNfcmVzcF9ldmVudF9maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyogVkRFViBpZGVudGlmaWVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSByZXNwb25zZS4gKi8KKwlBX1VJTlQzMiBudW1fY2hhbm5lbHM7CisJLyoqIFRoaXMgaXMgZm9sbG93ZWQgYnkgYSBUTFYgYXJyYXkgb2Ygd21pX2RjY19uZGxfc3RhdHNfcGVyX2NoYW5uZWwuICovCit9IHdtaV9kY2NfZ2V0X3N0YXRzX3Jlc3BfZXZlbnRfZml4ZWRfcGFyYW07CisKKy8qKiBEYXRhIHN0cnVjdHVyZSBmb3IgY2xlYXJpbmcgdGhlIERDQyBzdGF0cy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKioKKwkgKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfY2xlYXJfc3RhdHNfY21kX2ZpeGVkX3BhcmFtCisJICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiBWREVWIGlkZW50aWZpZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCUFfVUlOVDMyIGRjY19zdGF0c19iaXRtYXA7Cit9IHdtaV9kY2NfY2xlYXJfc3RhdHNfY21kX2ZpeGVkX3BhcmFtOworCisvKiogRGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBwdXNoZWQgRENDIHN0YXRzICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqCisJICogIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RjY19zdGF0c19ldmVudF9maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyogVkRFViBpZGVudGlmaWVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogVGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgcmVzcG9uc2UuICovCisJQV9VSU5UMzIgbnVtX2NoYW5uZWxzOworCS8qKiBUaGlzIGlzIGZvbGxvd2VkIGJ5IGEgVExWIGFycmF5IG9mIHdtaV9kY2NfbmRsX3N0YXRzX3Blcl9jaGFubmVsLiAqLworfSB3bWlfZGNjX3N0YXRzX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiogRGF0YSBzdHJ1Y3R1cmUgZm9yIHVwZGF0aW5nIE5ETCBwZXIgY2hhbm5lbC4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKioKKwkgKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9kY2NfbmRsX2NoYW4KKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKgorCSAqIENoYW5uZWwgZnJlcXVlbmN5LCAxNiBiaXRzCisJICogTkRMX251bUFjdGl2ZVN0YXRlLCBuZGxUeXBlX251bWJlckVsZW1lbnRzLCAxKzYgYml0cworCSAqLworCUFfVUlOVDMyIGNoYW5faW5mbzsKKwkvKioKKwkgKiAgTkRMX21pbkRjY1NhbXBsaW5nLCAxMCBiaXRzLgorCSAqICAgICAgTWF4aW11bSB0aW1lIGludGVydmFsIGJldHdlZW4gc3Vic2VxdWVudCBjaGVja3Mgb2YgdGhlIERDQyBydWxlcy4KKwkgKi8KKwlBX1VJTlQzMiBuZGxfbWluX2RjY19zYW1wbGluZzsKKwkvKioKKwkgKiBkY2NfZW5hYmxlLCAxIGJpdC4KKwkgKiBkY2Nfc3RhdHNfZW5hYmxlLCAxIGJpdC4KKwkgKiBkY2Nfc3RhdHNfaW50ZXJ2YWwsIDE2IGJpdHMuCisJICovCisJQV9VSU5UMzIgZGNjX2ZsYWdzOworCS8qKiBHZW5lcmFsIERDQyBjb25maWd1cmF0aW9uLgorCSAqIE5ETF90aW1lVXAsIG5kbFR5cGVfdGltaW5nLCAxKzEyIGJpdHMuCisJICogTkRMX3RpbWVEb3duLCBuZGxUeXBlX3RpbWluZywgMSsxMiBiaXRzLgorCSAqLworCUFfVUlOVDMyIGdlbmVyYWxfY29uZmlnOworCS8qKiBUcmFuc21pdCBwb3dlciB0aHJlc2hvbGRzLgorCSAqIE5ETF9taW5UeFBvd2VyLCBuZGxUeXBlX3R4UG93ZXIsIDErNyBiaXRzLgorCSAqIE5ETF9tYXhUeFBvd2VyLCBuZGxUeXBlX3R4UG93ZXIsIDErNyBiaXRzLgorCSAqLworCS8qIHNlZSAiRVRTSSBUUyAxMDIgNjg3IiB0YWJsZSBhYm92ZSBmb3IgdW5pdHMgKi8KKwlBX1VJTlQzMiBtaW5fbWF4X3R4X3Bvd2VyOworCS8qKgorCSAqIE5ETF9kZWZUeFBvd2VyKEFDX0JLKSwgbmRsVHlwZV90eFBvd2VyLCAxKzcgYml0cy4KKwkgKiBORExfZGVmVHhQb3dlcihBQ19CRSksIG5kbFR5cGVfdHhQb3dlciwgMSs3IGJpdHMuCisJICogTkRMX2RlZlR4UG93ZXIoQUNfVkkpLCBuZGxUeXBlX3R4UG93ZXIsIDErNyBiaXRzLgorCSAqIE5ETF9kZWZUeFBvd2VyKEFDX1ZPKSwgbmRsVHlwZV90eFBvd2VyLCAxKzcgYml0cy4KKwkgKi8KKyAgICAvKiBzZWUgIkVUU0kgVFMgMTAyIDY4NyIgdGFibGUgYWJvdmUgZm9yIHVuaXRzICovCisgICAgQV9VSU5UMzIgZGVmX3R4X3Bvd2VyX2FjW1dNSV9QQUNLRURfQVJSX1NJWkUoV0xBTl9NQVhfQUMsIFNJWkVfTkRMVFlQRV9UWFBPV0VSKV07CisJLyoqIFBhY2tldCB0aW1pbmcgdGhyZXNob2xkcy4KKwkgKiBORExfbWF4UGFja2V0RHVyYXRpb24oQUNfQkspLCBuZGxUeXBlX3BhY2tldER1cmF0aW9uLCAxKzExIGJpdHMuCisJICogTkRMX21heFBhY2tldER1cmF0aW9uKEFDX0JFKSwgbmRsVHlwZV9wYWNrZXREdXJhdGlvbiwgMSsxMSBiaXRzLgorCSAqIE5ETF9tYXhQYWNrZXREdXJhdGlvbihBQ19WSSksIG5kbFR5cGVfcGFja2V0RHVyYXRpb24sIDErMTEgYml0cy4KKwkgKiBORExfbWF4UGFja2V0RHVyYXRpb24oQUNfVk8pLCBuZGxUeXBlX3BhY2tldER1cmF0aW9uLCAxKzExIGJpdHMuCisJICovCisJQV9VSU5UMzIgbWF4X3BhY2tldF9kdXJhdGlvbl9hY1tXTUlfUEFDS0VEX0FSUl9TSVpFKFdMQU5fTUFYX0FDLCBTSVpFX05ETFRZUEVfUEFDS0VURFVSQVRJT04pXTsKKwkvKioKKwkqIE5ETF9taW5QYWNrZXRJbnRlcnZhbCwgbmRsVHlwZV9wYWNrZXRJbnRlcnZhbCwgMSsxMCBiaXRzLgorCSogTkRMX21heFBhY2tldEludGVydmFsLCBuZGxUeXBlX3BhY2tldEludGVydmFsLCAxKzEwIGJpdHMuCisJKi8KKwlBX1VJTlQzMiBtaW5fbWF4X3BhY2tldF9pbnRlcnZhbDsKKwkvKioKKwkgKiBORExfZGVmUGFja2V0SW50ZXJ2YWwoQUNfQkspLCBuZGxUeXBlX3BhY2tldEludGVydmFsLCAxKzEwIGJpdHMuCisJICogTkRMX2RlZlBhY2tldEludGVydmFsKEFDX0JFKSwgbmRsVHlwZV9wYWNrZXRJbnRlcnZhbCwgMSsxMCBiaXRzLgorCSAqIE5ETF9kZWZQYWNrZXRJbnRlcnZhbChBQ19WSSksIG5kbFR5cGVfcGFja2V0SW50ZXJ2YWwsIDErMTAgYml0cy4KKwkgKiBORExfZGVmUGFja2V0SW50ZXJ2YWwoQUNfVk8pLCBuZGxUeXBlX3BhY2tldEludGVydmFsLCAxKzEwIGJpdHMKKwkgKi8KKwlBX1VJTlQzMiBkZWZfcGFja2V0X2ludGVydmFsX2FjW1dNSV9QQUNLRURfQVJSX1NJWkUoV0xBTl9NQVhfQUMsIFNJWkVfTkRMVFlQRV9QQUNLRVRJTlRFUlZBTCldOworCS8qKiBQYWNrZXQgZGF0YXJhdGUgdGhyZXNob2xkcy4KKwkqIE5ETF9taW5EYXRhcmF0ZSwgbmRsVHlwZV9kYXRhcmF0ZSwgMSszIGJpdHMuCisJKiBORExfbWF4RGF0YXJhdGUsIG5kbFR5cGVfZGF0YXJhdGUsIDErMyBiaXRzLgorCSovCisJQV9VSU5UMzIgbWluX21heF9kYXRhcmF0ZTsKKwkvKioKKwkgKiBORExfZGVmRGF0YXJhdGUoQUNfQkspLCBuZGxUeXBlX2RhdGFyYXRlLCAxKzMgYml0cy4KKwkgKiBORExfZGVmRGF0YXJhdGUoQUNfQkUpLCBuZGxUeXBlX2RhdGFyYXRlLCAxKzMgYml0cy4KKwkgKiBORExfZGVmRGF0YXJhdGUoQUNfVkkpLCBuZGxUeXBlX2RhdGFyYXRlLCAxKzMgYml0cy4KKwkgKiBORExfZGVmRGF0YXJhdGUoQUNfVk8pLCBuZGxUeXBlX2RhdGFyYXRlLCAxKzMgYml0cy4KKwkgKi8KKwlBX1VJTlQzMiBkZWZfZGF0YXJhdGVfYWNbV01JX1BBQ0tFRF9BUlJfU0laRShXTEFOX01BWF9BQywgU0laRV9ORExUWVBFX0RBVEFSQVRFKV07CisJLyoqIFJlY2VpdmUgc2lnbmFsIHRocmVzaG9sZHMuCisJICogTkRMX21pbkNhcnJpZXJTZW5zZSwgbmRsVHlwZV9yeFBvd2VyLCAxKzcgYml0cy4KKwkgKiBORExfbWF4Q2FycmllclNlbnNlLCBuZGxUeXBlX3J4UG93ZXIsIDErNyBiaXRzLgorCSAqIE5ETF9kZWZDYXJyaWVyU2Vuc2UsIG5kbFR5cGVfcnhQb3dlciwgMSs3IGJpdHMuCisJICovCisJQV9VSU5UMzIgbWluX21heF9kZWZfY2Fycmllcl9zZW5zZTsKKworCS8qKiBSZWNlaXZlIG1vZGVsIHBhcmFtZXRlci4KKwkgKiBORExfZGVmRGNjU2Vuc2l0aXZpdHksIG5kbFR5cGVfcnhQb3dlciwgMSs3IGJpdHMuCisJICogTkRMX21heENzUmFuZ2UsIG5kbFR5cGVfZGlzdGFuY2UsIDErMTIgYml0cy4KKwkgKiBORExfcmVmUGF0aExvc3MsIG5kbFR5cGVfcGF0aGxvc3MsIDErNSBiaXRzLgorCSAqLworCUFfVUlOVDMyIHJlY2VpdmVfbW9kZWxfcGFyYW1ldGVyOworCisJLyoqCisJICogTkRMX21pblNOUiwgbmRsVHlwZV9zbnIsIDErNyBiaXRzLgorCSAqLworCUFfVUlOVDMyIHJlY2VpdmVfbW9kZWxfcGFyYW1ldGVyXzI7CisKKwkvKiogRGVtb2R1bGF0aW9uIG1vZGVsIHBhcmFtZXRlcnMuCisJICogTkRMX3NuckJhY2tvZmYoTUNTMCksIG5kbFR5cGVfc25yLCAxKzcgYml0cy4KKwkgKiBORExfc25yQmFja29mZihNQ1MxKSwgbmRsVHlwZV9zbnIsIDErNyBiaXRzLgorCSAqIE5ETF9zbnJCYWNrb2ZmKE1DUzIpLCBuZGxUeXBlX3NuciwgMSs3IGJpdHMuCisJICogTkRMX3NuckJhY2tvZmYoTUNTMyksIG5kbFR5cGVfc25yLCAxKzcgYml0cy4KKwkgKiBORExfc25yQmFja29mZihNQ1M0KSwgbmRsVHlwZV9zbnIsIDErNyBiaXRzLgorCSAqIE5ETF9zbnJCYWNrb2ZmKE1DUzUpLCBuZGxUeXBlX3NuciwgMSs3IGJpdHMuCisJICogTkRMX3NuckJhY2tvZmYoTUNTNiksIG5kbFR5cGVfc25yLCAxKzcgYml0cy4KKwkgKiBORExfc25yQmFja29mZihNQ1M3KSwgbmRsVHlwZV9zbnIsIDErNyBiaXRzLgorCSAqLworCUFfVUlOVDMyIHNucl9iYWNrb2ZmX21jc1tXTUlfUEFDS0VEX0FSUl9TSVpFKE1DU19DT1VOVCwgU0laRV9ORExUWVBFX1NOUildOworCS8qKiBUcmFuc21pdCBtb2RlbCBwYXJhbWV0ZXJzLgorCSAqIE5ETF90bVBhY2tldEFycml2YWxSYXRlKEFDX0JLKSwgbmRsVHlwZV9hcnJpdmFsUmF0ZSwgMSsxMyBiaXRzLgorCSAqIE5ETF90bVBhY2tldEFycml2YWxSYXRlKEFDX0JFKSwgbmRsVHlwZV9hcnJpdmFsUmF0ZSwgMSsxMyBiaXRzLgorCSAqIE5ETF90bVBhY2tldEFycml2YWxSYXRlKEFDX1ZJKSwgbmRsVHlwZV9hcnJpdmFsUmF0ZSwgMSsxMyBiaXRzLgorCSAqIE5ETF90bVBhY2tldEFycml2YWxSYXRlKEFDX1ZPKSwgbmRsVHlwZV9hcnJpdmFsUmF0ZSwgMSsxMyBiaXRzLgorCSAqLworCUFfVUlOVDMyIHRtX3BhY2tldF9hcnJpdmFsX3JhdGVfYWNbV01JX1BBQ0tFRF9BUlJfU0laRShXTEFOX01BWF9BQywgU0laRV9ORExUWVBFX0FSUklWQUxSQVRFKV07CisJLyoqCisJICogTkRMX3RtUGFja2V0QXZnRHVyYXRpb24oQUNfQkspLCBuZGxUeXBlX3BhY2tldER1cmF0aW9uLCAxKzExIGJpdHMuCisJICogTkRMX3RtUGFja2V0QXZnRHVyYXRpb24oQUNfQkUpLCBuZGxUeXBlX3BhY2tldER1cmF0aW9uLCAxKzExIGJpdHMuCisJICogTkRMX3RtUGFja2V0QXZnRHVyYXRpb24oQUNfVkkpLCBuZGxUeXBlX3BhY2tldER1cmF0aW9uLCAxKzExIGJpdHMuCisJICogTkRMX3RtUGFja2V0QXZnRHVyYXRpb24oQUNfVk8pLCBuZGxUeXBlX3BhY2tldER1cmF0aW9uLCAxKzExIGJpdHMuCisJICovCisJQV9VSU5UMzIgdG1fcGFja2V0X2F2Z19kdXJhdGlvbl9hY1tXTUlfUEFDS0VEX0FSUl9TSVpFKFdMQU5fTUFYX0FDLCBTSVpFX05ETFRZUEVfUEFDS0VURFVSQVRJT04pXTsKKwkvKioKKwkgKiBORExfdG1TaWduYWxBdmdQb3dlcihBQ19CSyksIG5kbFR5cGVfdHhQb3dlciwgMSs3IGJpdHMuCisJICogTkRMX3RtU2lnbmFsQXZnUG93ZXIoQUNfQkUpLCBuZGxUeXBlX3R4UG93ZXIsIDErNyBiaXRzLgorCSAqIE5ETF90bVNpZ25hbEF2Z1Bvd2VyKEFDX1ZJKSwgbmRsVHlwZV90eFBvd2VyLCAxKzcgYml0cy4KKwkgKiBORExfdG1TaWduYWxBdmdQb3dlcihBQ19WTyksIG5kbFR5cGVfdHhQb3dlciwgMSs3IGJpdHMuCisJICovCisJQV9VSU5UMzIgdG1fc2lnbmFsX2F2Z19wb3dlcl9hY1tXTUlfUEFDS0VEX0FSUl9TSVpFKFdMQU5fTUFYX0FDLCBTSVpFX05ETFRZUEVfVFhQT1dFUildOworCS8qIE5ETF90bU1heENoYW5uZWxVc2UsIG5kbFR5cGVfY2hhbm5lbFVzZSwgMSsxMyBiaXRzLiAqLworCUFfVUlOVDMyIHRtX21heF9jaGFubmVsX3VzZTsKKyAgICAvKioKKyAgICAgKiBORExfdG1DaGFubmVsVXNlKEFDX0JLKSwgbmRsVHlwZV9jaGFubmVsVXNlLCAxKzEzIGJpdHMuCisgICAgICogTkRMX3RtQ2hhbm5lbFVzZShBQ19CRSksIG5kbFR5cGVfY2hhbm5lbFVzZSwgMSsxMyBiaXRzLgorICAgICAqIE5ETF90bUNoYW5uZWxVc2UoQUNfVkkpLCBuZGxUeXBlX2NoYW5uZWxVc2UsIDErMTMgYml0cy4KKyAgICAgKiBORExfdG1DaGFubmVsVXNlKEFDX1ZPKSwgbmRsVHlwZV9jaGFubmVsVXNlLCAxKzEzIGJpdHMuCisgICAgICovCisJQV9VSU5UMzIgdG1fY2hhbm5lbF91c2VfYWNbV01JX1BBQ0tFRF9BUlJfU0laRShXTEFOX01BWF9BQywgU0laRV9ORExUWVBFX0NIQU5ORUxVU0UpXTsKKyAgICAvKiogQ2hhbm5lbCBsb2FkIHRocmVzaG9sZHMuCisJICogTkRMX21pbkNoYW5uZWxMb2FkLCBuZGxUeXBlX2NoYW5uZWxMb2FkLCAxKzEwIGJpdHMuCisJICogTkRMX21heENoYW5uZWxMb2FkLCBuZGxUeXBlX2NoYW5uZWxMb2FkLCAxKzEwIGJpdHMuCisJICovCisJQV9VSU5UMzIgbWluX21heF9jaGFubmVsX2xvYWQ7CisgICAgLyoqIFRyYW5zbWl0IHF1ZXVlIHBhcmFtZXRlcnMuCisJICogTkRMX251bVF1ZXVlLCBuZGxUeXBlX2FjUHJpbywgMSszIGJpdHMuCisJICogTkRMX3JlZlF1ZXVlU3RhdHVzKEFDX0JLKSwgbmRsVHlwZV9xdWV1ZVN0YXR1cywgMSsxIGJpdC4KKwkgKiBORExfcmVmUXVldWVTdGF0dXMoQUNfQkUpLCBuZGxUeXBlX3F1ZXVlU3RhdHVzLCAxKzEgYml0LgorCSAqIE5ETF9yZWZRdWV1ZVN0YXR1cyhBQ19WSSksIG5kbFR5cGVfcXVldWVTdGF0dXMsIDErMSBiaXQuCisJICogTkRMX3JlZlF1ZXVlU3RhdHVzKEFDX1ZPKSwgbmRsVHlwZV9xdWV1ZVN0YXR1cywgMSsxIGJpdC4KKwkgKi8KKwlBX1VJTlQzMiB0cmFuc21pdF9xdWV1ZV9wYXJhbWV0ZXJzOworCS8qKgorCSAqIE5ETF9yZWZRdWV1ZUxlbihBQ19CSyksIG5kbFR5cGVfbnVtYmVyRWxlbWVudHMsIDErNiBiaXRzLgorCSAqIE5ETF9yZWZRdWV1ZUxlbihBQ19CRSksIG5kbFR5cGVfbnVtYmVyRWxlbWVudHMsIDErNiBiaXRzLgorCSAqIE5ETF9yZWZRdWV1ZUxlbihBQ19WSSksIG5kbFR5cGVfbnVtYmVyRWxlbWVudHMsIDErNiBiaXRzLgorCSAqIE5ETF9yZWZRdWV1ZUxlbihBQ19WTyksIG5kbFR5cGVfbnVtYmVyRWxlbWVudHMsIDErNiBiaXRzLgorCSAqLworCUFfVUlOVDMyIG51bWJlckVsZW1lbnRzW1dNSV9QQUNLRURfQVJSX1NJWkUoV0xBTl9NQVhfQUMsIFNJWkVfTkRMVFlQRV9OVU1CRVJFTEVNRU5UUyldOworfSB3bWlfZGNjX25kbF9jaGFuOworCisjZGVmaW5lIFdNSV9DSEFOX0ZSRVFfR0VUKHB0cikgICAgICAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5jaGFuX2luZm8sIDAsIDE2KQorI2RlZmluZSBXTUlfQ0hBTl9GUkVRX1NFVChwdHIsIHZhbCkgICAgICAgICAgICAgIFdNSV9TRVRfQklUUygocHRyKS0+Y2hhbl9pbmZvLCAwLCAxNiwgdmFsKQorI2RlZmluZSBXTUlfTkRMX05VTV9BQ1RJVkVfU1RBVEVfR0VUKHB0cikgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+Y2hhbl9pbmZvLCAxNiwgNykKKyNkZWZpbmUgV01JX05ETF9OVU1fQUNUSVZFX1NUQVRFX1NFVChwdHIsIHZhbCkgICBXTUlfU0VUX0JJVFMoKHB0ciktPmNoYW5faW5mbywgMTYsIDcsIHZhbCkKKworI2RlZmluZSBXTUlfTkRMX01JTl9EQ0NfU0FNUExJTkdfR0VUKHB0cikgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+bmRsX21pbl9kY2Nfc2FtcGxpbmcsIDAsIDEwKQorI2RlZmluZSBXTUlfTkRMX01JTl9EQ0NfU0FNUExJTkdfU0VUKHB0ciwgdmFsKSAgIFdNSV9TRVRfQklUUygocHRyKS0+bmRsX21pbl9kY2Nfc2FtcGxpbmcsIDAsIDEwLCB2YWwpCisKKyNkZWZpbmUgV01JX05ETF9NRUFTVVJFX0lOVEVSVkFMX0dFVChwdHIpIFdNSV9HRVRfQklUUygocHRyKS0+bmRsX21pbl9kY2Nfc2FtcGxpbmcsIDEwLCAxNikKKyNkZWZpbmUgV01JX05ETF9NRUFTVVJFX0lOVEVSVkFMX1NFVChwdHIsIHZhbCkgV01JX1NFVF9CSVRTKChwdHIpLT5uZGxfbWluX2RjY19zYW1wbGluZywgMTAsIDE2LCB2YWwpCisKKworI2RlZmluZSBXTUlfTkRMX0RDQ19FTkFCTEVfR0VUKHB0cikgICAgICAgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+ZGNjX2ZsYWdzLCAwLCAxKQorI2RlZmluZSBXTUlfTkRMX0RDQ19FTkFCTEVfU0VUKHB0ciwgdmFsKSAgICAgICAgIFdNSV9TRVRfQklUUygocHRyKS0+ZGNjX2ZsYWdzLCAwLCAxLCB2YWwpCisjZGVmaW5lIFdNSV9ORExfRENDX1NUQVRTX0VOQUJMRV9HRVQocHRyKSAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5kY2NfZmxhZ3MsIDEsIDEpCisjZGVmaW5lIFdNSV9ORExfRENDX1NUQVRTX0VOQUJMRV9TRVQocHRyLCB2YWwpICAgV01JX1NFVF9CSVRTKChwdHIpLT5kY2NfZmxhZ3MsIDEsIDEsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9EQ0NfU1RBVFNfSU5URVJWQUxfR0VUKHB0cikgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPmRjY19mbGFncywgMiwgMTYpCisjZGVmaW5lIFdNSV9ORExfRENDX1NUQVRTX0lOVEVSVkFMX1NFVChwdHIsIHZhbCkgV01JX1NFVF9CSVRTKChwdHIpLT5kY2NfZmxhZ3MsIDIsIDE2LCB2YWwpCisKKyNkZWZpbmUgV01JX05ETF9USU1FX1VQX0dFVChwdHIpICAgICAgICAgICAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPmdlbmVyYWxfY29uZmlnLCAwLCAxMykKKyNkZWZpbmUgV01JX05ETF9USU1FX1VQX1NFVChwdHIsIHZhbCkgICAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPmdlbmVyYWxfY29uZmlnLCAwLCAxMywgdmFsKQorI2RlZmluZSBXTUlfTkRMX1RJTUVfRE9XTl9HRVQocHRyKSAgICAgICAgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+Z2VuZXJhbF9jb25maWcsIDEzLCAxMykKKyNkZWZpbmUgV01JX05ETF9USU1FX0RPV05fU0VUKHB0ciwgdmFsKSAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPmdlbmVyYWxfY29uZmlnLCAxMywgMTMsIHZhbCkKKworI2RlZmluZSBXTUlfTkRMX01JTl9UWF9QT1dFUl9HRVQocHRyKSAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5taW5fbWF4X3R4X3Bvd2VyLCAwLCA4KQorI2RlZmluZSBXTUlfTkRMX01JTl9UWF9QT1dFUl9TRVQocHRyLCB2YWwpICAgV01JX1NFVF9CSVRTKChwdHIpLT5taW5fbWF4X3R4X3Bvd2VyLCAwLCA4LCB2YWwpCisjZGVmaW5lIFdNSV9ORExfTUFYX1RYX1BPV0VSX0dFVChwdHIpICAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfdHhfcG93ZXIsIDgsIDgpCisjZGVmaW5lIFdNSV9ORExfTUFYX1RYX1BPV0VSX1NFVChwdHIsIHZhbCkgICBXTUlfU0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfdHhfcG93ZXIsIDgsIDgsIHZhbCkKKworI2RlZmluZSBXTUlfTkRMX0RFRl9UWF9QT1dFUl9HRVQocHRyLCBhY3ByaW8pICAgICAgICAgd21pX3BhY2tlZF9hcnJfZ2V0X2JpdHMoKHB0ciktPmRlZl90eF9wb3dlcl9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfVFhQT1dFUikKKyNkZWZpbmUgV01JX05ETF9ERUZfVFhfUE9XRVJfU0VUKHB0ciwgYWNwcmlvLCB2YWwpICAgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT5kZWZfdHhfcG93ZXJfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX1RYUE9XRVIsIHZhbCkKKworI2RlZmluZSBXTUlfTkRMX01BWF9QQUNLRVRfRFVSQVRJT05fR0VUKHB0ciwgYWNwcmlvKSAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT5tYXhfcGFja2V0X2R1cmF0aW9uX2FjLCBhY3ByaW8sIFNJWkVfTkRMVFlQRV9QQUNLRVREVVJBVElPTikKKyNkZWZpbmUgV01JX05ETF9NQVhfUEFDS0VUX0RVUkFUSU9OX1NFVChwdHIsIGFjcHJpbywgdmFsKSB3bWlfcGFja2VkX2Fycl9zZXRfYml0cygocHRyKS0+bWF4X3BhY2tldF9kdXJhdGlvbl9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfUEFDS0VURFVSQVRJT04sIHZhbCkKKyNkZWZpbmUgV01JX05ETF9NSU5fUEFDS0VUX0lOVEVSVkFMX0dFVChwdHIpICAgICAgICAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfcGFja2V0X2ludGVydmFsLCAwLCAxMSkKKyNkZWZpbmUgV01JX05ETF9NSU5fUEFDS0VUX0lOVEVSVkFMX1NFVChwdHIsIHZhbCkgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfcGFja2V0X2ludGVydmFsLCAwLCAxMSwgdmFsKQorI2RlZmluZSBXTUlfTkRMX01BWF9QQUNLRVRfSU5URVJWQUxfR0VUKHB0cikgICAgICAgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+bWluX21heF9wYWNrZXRfaW50ZXJ2YWwsIDExLCAxMSkKKyNkZWZpbmUgV01JX05ETF9NQVhfUEFDS0VUX0lOVEVSVkFMX1NFVChwdHIsIHZhbCkgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfcGFja2V0X2ludGVydmFsLCAxMSwgMTEsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9ERUZfUEFDS0VUX0lOVEVSVkFMX0dFVChwdHIsIGFjcHJpbykgICAgICB3bWlfcGFja2VkX2Fycl9nZXRfYml0cygocHRyKS0+ZGVmX3BhY2tldF9pbnRlcnZhbF9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfUEFDS0VUSU5URVJWQUwpCisjZGVmaW5lIFdNSV9ORExfREVGX1BBQ0tFVF9JTlRFUlZBTF9TRVQocHRyLCBhY3ByaW8sIHZhbCkgd21pX3BhY2tlZF9hcnJfc2V0X2JpdHMoKHB0ciktPmRlZl9wYWNrZXRfaW50ZXJ2YWxfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX1BBQ0tFVElOVEVSVkFMLCB2YWwpCisKKyNkZWZpbmUgV01JX05ETF9NSU5fREFUQVJBVEVfR0VUKHB0cikgICAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5taW5fbWF4X2RhdGFyYXRlLCAwLCA0KQorI2RlZmluZSBXTUlfTkRMX01JTl9EQVRBUkFURV9TRVQocHRyLCB2YWwpICAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfZGF0YXJhdGUsIDAsIDQsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9NQVhfREFUQVJBVEVfR0VUKHB0cikgICAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5taW5fbWF4X2RhdGFyYXRlLCA0LCA0KQorI2RlZmluZSBXTUlfTkRMX01BWF9EQVRBUkFURV9TRVQocHRyLCB2YWwpICAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfZGF0YXJhdGUsIDQsIDQsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9ERUZfREFUQVJBVEVfR0VUKHB0ciwgYWNwcmlvKSAgICAgICAgd21pX3BhY2tlZF9hcnJfZ2V0X2JpdHMoKHB0ciktPmRlZl9kYXRhcmF0ZV9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfREFUQVJBVEUpCisjZGVmaW5lIFdNSV9ORExfREVGX0RBVEFSQVRFX1NFVChwdHIsIGFjcHJpbywgdmFsKSAgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT5kZWZfZGF0YXJhdGVfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX0RBVEFSQVRFLCB2YWwpCisKKyNkZWZpbmUgV01JX05ETF9NSU5fQ0FSUklFUl9TRU5TRV9HRVQocHRyKSAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfZGVmX2NhcnJpZXJfc2Vuc2UsIDAsIDgpCisjZGVmaW5lIFdNSV9ORExfTUlOX0NBUlJJRVJfU0VOU0VfU0VUKHB0ciwgdmFsKSAgV01JX1NFVF9CSVRTKChwdHIpLT5taW5fbWF4X2RlZl9jYXJyaWVyX3NlbnNlLCAwLCA4LCB2YWwpCisjZGVmaW5lIFdNSV9ORExfTUFYX0NBUlJJRVJfU0VOU0VfR0VUKHB0cikgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5taW5fbWF4X2RlZl9jYXJyaWVyX3NlbnNlLCA4LCA4KQorI2RlZmluZSBXTUlfTkRMX01BWF9DQVJSSUVSX1NFTlNFX1NFVChwdHIsIHZhbCkgIFdNSV9TRVRfQklUUygocHRyKS0+bWluX21heF9kZWZfY2Fycmllcl9zZW5zZSwgOCwgOCwgdmFsKQorI2RlZmluZSBXTUlfTkRMX0RFRl9DQVJSSUVSX1NFTlNFX0dFVChwdHIpICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+bWluX21heF9kZWZfY2Fycmllcl9zZW5zZSwgMTYsIDgpCisjZGVmaW5lIFdNSV9ORExfREVGX0NBUlJJRVJfU0VOU0VfU0VUKHB0ciwgdmFsKSAgV01JX1NFVF9CSVRTKChwdHIpLT5taW5fbWF4X2RlZl9jYXJyaWVyX3NlbnNlLCAxNiwgOCwgdmFsKQorCisjZGVmaW5lIFdNSV9ORExfREVGX0RDQ19TRU5TSVRJVklUWV9HRVQocHRyKSAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5yZWNlaXZlX21vZGVsX3BhcmFtZXRlciwgMCwgOCkKKyNkZWZpbmUgV01JX05ETF9ERUZfRENDX1NFTlNJVElWSVRZX1NFVChwdHIsIHZhbCkgICBXTUlfU0VUX0JJVFMoKHB0ciktPnJlY2VpdmVfbW9kZWxfcGFyYW1ldGVyLCAwLCA4LCB2YWwpCisjZGVmaW5lIFdNSV9ORExfTUFYX0NTX1JBTkdFX0dFVChwdHIpICAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5yZWNlaXZlX21vZGVsX3BhcmFtZXRlciwgOCwgMTMpCisjZGVmaW5lIFdNSV9ORExfTUFYX0NTX1JBTkdFX1NFVChwdHIsIHZhbCkgICAgICAgICAgV01JX1NFVF9CSVRTKChwdHIpLT5yZWNlaXZlX21vZGVsX3BhcmFtZXRlciwgOCwgMTMsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9SRUZfUEFUSF9MT1NTX0dFVChwdHIpICAgICAgICAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPnJlY2VpdmVfbW9kZWxfcGFyYW1ldGVyLCAyMSwgNikKKyNkZWZpbmUgV01JX05ETF9SRUZfUEFUSF9MT1NTX1NFVChwdHIsIHZhbCkgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPnJlY2VpdmVfbW9kZWxfcGFyYW1ldGVyLCAyMSwgNiwgdmFsKQorCisjZGVmaW5lIFdNSV9ORExfTUlOX1NOUl9HRVQocHRyKSAgICAgICAgICAgICAgICAgICAgV01JX0dFVF9CSVRTKChwdHIpLT5yZWNlaXZlX21vZGVsX3BhcmFtZXRlcl8yLCAwLCA4KQorI2RlZmluZSBXTUlfTkRMX01JTl9TTlJfU0VUKHB0ciwgdmFsKSAgICAgICAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPnJlY2VpdmVfbW9kZWxfcGFyYW1ldGVyXzIsIDAsIDgsIHZhbCkKKworI2RlZmluZSBXTUlfTkRMX1NOUl9CQUNLT0ZGX0dFVChwdHIsIG1jcykgICAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT5zbnJfYmFja29mZl9tY3MsIG1jcywgU0laRV9ORExUWVBFX1NOUikKKyNkZWZpbmUgV01JX05ETF9TTlJfQkFDS09GRl9TRVQocHRyLCBtY3MsIHZhbCkgICAgd21pX3BhY2tlZF9hcnJfc2V0X2JpdHMoKHB0ciktPnNucl9iYWNrb2ZmX21jcywgbWNzLCBTSVpFX05ETFRZUEVfU05SLCB2YWwpCisKKyNkZWZpbmUgV01JX05ETF9UTV9QQUNLRVRfQVJSSVZBTF9SQVRFX0dFVChwdHIsIGFjcHJpbykgICAgICAgd21pX3BhY2tlZF9hcnJfZ2V0X2JpdHMoKHB0ciktPnRtX3BhY2tldF9hcnJpdmFsX3JhdGVfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX0FSUklWQUxSQVRFKQorI2RlZmluZSBXTUlfTkRMX1RNX1BBQ0tFVF9BUlJJVkFMX1JBVEVfU0VUKHB0ciwgYWNwcmlvLCB2YWwpICB3bWlfcGFja2VkX2Fycl9zZXRfYml0cygocHRyKS0+dG1fcGFja2V0X2Fycml2YWxfcmF0ZV9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfQVJSSVZBTFJBVEUsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9UTV9QQUNLRVRfQVZHX0RVUkFUSU9OX0dFVChwdHIsIGFjcHJpbykgICAgICAgd21pX3BhY2tlZF9hcnJfZ2V0X2JpdHMoKHB0ciktPnRtX3BhY2tldF9hdmdfZHVyYXRpb25fYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX1BBQ0tFVERVUkFUSU9OKQorI2RlZmluZSBXTUlfTkRMX1RNX1BBQ0tFVF9BVkdfRFVSQVRJT05fU0VUKHB0ciwgYWNwcmlvLCB2YWwpICB3bWlfcGFja2VkX2Fycl9zZXRfYml0cygocHRyKS0+dG1fcGFja2V0X2F2Z19kdXJhdGlvbl9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfUEFDS0VURFVSQVRJT04sIHZhbCkKKyNkZWZpbmUgV01JX05ETF9UTV9TSUdOQUxfQVZHX1BPV0VSX0dFVChwdHIsIGFjcHJpbykgICAgICAgICAgd21pX3BhY2tlZF9hcnJfZ2V0X2JpdHMoKHB0ciktPnRtX3NpZ25hbF9hdmdfcG93ZXJfYWMsIGFjcHJpbywgU0laRV9ORExUWVBFX1RYUE9XRVIpCisjZGVmaW5lIFdNSV9ORExfVE1fU0lHTkFMX0FWR19QT1dFUl9TRVQocHRyLCBhY3ByaW8sIHZhbCkgICAgIHdtaV9wYWNrZWRfYXJyX3NldF9iaXRzKChwdHIpLT50bV9zaWduYWxfYXZnX3Bvd2VyX2FjLCBhY3ByaW8sIFNJWkVfTkRMVFlQRV9UWFBPV0VSLCB2YWwpCisjZGVmaW5lIFdNSV9ORExfVE1fTUFYX0NIQU5ORUxfVVNFX0dFVChwdHIpICAgICAgICAgICAgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+dG1fbWF4X2NoYW5uZWxfdXNlLCAwLCAxNCkKKyNkZWZpbmUgV01JX05ETF9UTV9NQVhfQ0hBTk5FTF9VU0VfU0VUKHB0ciwgdmFsKSAgICAgICAgICAgICAgV01JX1NFVF9CSVRTKChwdHIpLT50bV9tYXhfY2hhbm5lbF91c2UsIDAsIDE0LCB2YWwpCisjZGVmaW5lIFdNSV9ORExfVE1fQ0hBTk5FTF9VU0VfR0VUKHB0ciwgYWNwcmlvKSAgICAgICAgICAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT50bV9jaGFubmVsX3VzZV9hYywgYWNwcmlvLCBTSVpFX05ETFRZUEVfQ0hBTk5FTFVTRSkKKyNkZWZpbmUgV01JX05ETF9UTV9DSEFOTkVMX1VTRV9TRVQocHRyLCBhY3ByaW8sIHZhbCkgICAgICAgICAgd21pX3BhY2tlZF9hcnJfc2V0X2JpdHMoKHB0ciktPnRtX2NoYW5uZWxfdXNlX2FjLCBhY3ByaW8sIFNJWkVfTkRMVFlQRV9DSEFOTkVMVVNFLCB2YWwpCisKKyNkZWZpbmUgV01JX05ETF9NSU5fQ0hBTk5FTF9MT0FEX0dFVChwdHIpICAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfY2hhbm5lbF9sb2FkLCAwLCAxMSkKKyNkZWZpbmUgV01JX05ETF9NSU5fQ0hBTk5FTF9MT0FEX1NFVChwdHIsIHZhbCkgICBXTUlfU0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfY2hhbm5lbF9sb2FkLCAwLCAxMSwgdmFsKQorI2RlZmluZSBXTUlfTkRMX01BWF9DSEFOTkVMX0xPQURfR0VUKHB0cikgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+bWluX21heF9jaGFubmVsX2xvYWQsIDExLCAxMSkKKyNkZWZpbmUgV01JX05ETF9NQVhfQ0hBTk5FTF9MT0FEX1NFVChwdHIsIHZhbCkgICBXTUlfU0VUX0JJVFMoKHB0ciktPm1pbl9tYXhfY2hhbm5lbF9sb2FkLCAxMSwgMTEsIHZhbCkKKworI2RlZmluZSBXTUlfTkRMX05VTV9RVUVVRV9HRVQocHRyKSAgICAgICAgICAgICAgICAgICAgICAgIFdNSV9HRVRfQklUUygocHRyKS0+dHJhbnNtaXRfcXVldWVfcGFyYW1ldGVycywgMCwgNCkKKyNkZWZpbmUgV01JX05ETF9OVU1fUVVFVUVfU0VUKHB0ciwgdmFsKSAgICAgICAgICAgICAgICAgICBXTUlfU0VUX0JJVFMoKHB0ciktPnRyYW5zbWl0X3F1ZXVlX3BhcmFtZXRlcnMsIDAsIDQsIHZhbCkKKyNkZWZpbmUgV01JX05ETF9SRUZfUVVFVUVfU1RBVFVTX0dFVChwdHIsIGFjcHJpbykgICAgICAgICBXTUlfR0VUX0JJVFMoKHB0ciktPnRyYW5zbWl0X3F1ZXVlX3BhcmFtZXRlcnMsICg0ICsgKGFjcHJpbyAqIDIpKSwgMikKKyNkZWZpbmUgV01JX05ETF9SRUZfUVVFVUVfU1RBVFVTX1NFVChwdHIsIGFjcHJpbywgdmFsKSAgICBXTUlfU0VUX0JJVFMoKHB0ciktPnRyYW5zbWl0X3F1ZXVlX3BhcmFtZXRlcnMsICg0ICsgKGFjcHJpbyAqIDIpKSwgMiwgdmFsKQorI2RlZmluZSBXTUlfTkRMX1JFRl9RVUVVRV9MRU5fR0VUKHB0ciwgYWNwcmlvKSAgICAgICAgICAgIHdtaV9wYWNrZWRfYXJyX2dldF9iaXRzKChwdHIpLT5udW1iZXJFbGVtZW50cywgYWNwcmlvLCBTSVpFX05ETFRZUEVfTlVNQkVSRUxFTUVOVFMpCisjZGVmaW5lIFdNSV9ORExfUkVGX1FVRVVFX0xFTl9TRVQocHRyLCBhY3ByaW8sIHZhbCkgICAgICAgd21pX3BhY2tlZF9hcnJfc2V0X2JpdHMoKHB0ciktPm51bWJlckVsZW1lbnRzLCBhY3ByaW8sIFNJWkVfTkRMVFlQRV9OVU1CRVJFTEVNRU5UUywgdmFsKQorCisvKiogRGF0YSBzdHJ1Y3R1cmUgZm9yIHVwZGF0aW5nIHRoZSBOREwuICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSogIFdNSVRMVl9UQUdfU1RSVUNfd21pX2RjY191cGRhdGVfbmRsX2NtZF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyogVkRFViBpZGVudGlmaWVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiogVGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgcmVxdWVzdC4gKi8KKwlBX1VJTlQzMiBudW1fY2hhbm5lbDsKKwkvKiogVGhpcyBpcyBmb2xsb3dlZCBieSBhIFRMViBhcnJheSBvZiB3bWlfZGNjX25kbF9jaGFuLiAqLworCS8qKiBUaGlzIGlzIGZvbGxvd2VkIGJ5IGEgVExWIGFycmF5IG9mIHdtaV9kY2NfbmRsX2FjdGl2ZV9zdGF0ZV9jb25maWcuICovCit9IHdtaV9kY2NfdXBkYXRlX25kbF9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKioKKwkgKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiAgV01JVExWX1RBR19TVFJVQ193bWlfZGNjX3VwZGF0ZV9uZGxfcmVzcF9ldmVudF9maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyogVkRFViBpZGVudGlmaWVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwlBX1VJTlQzMiBzdGF0dXM7Cit9IHdtaV9kY2NfdXBkYXRlX25kbF9yZXNwX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKiBBY3Rpb25zIGZvciBUU0YgdGltZXN0YW1wICovCit0eXBlZGVmIGVudW0geworCVRTRl9UU1RBTVBfQ0FQVFVSRV9SRVEgPSAxLAorCVRTRl9UU1RBTVBfQ0FQVFVSRV9SRVNFVCA9IDIsCisJVFNGX1RTVEFNUF9SRUFEX1ZBTFVFID0gMywKK30gd21pX3RzZl90c3RhbXBfYWN0aW9uOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyoqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfdHNmX3RzdGFtcF9hY3Rpb25fY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiogdW5pcXVlIGlkIGlkZW50aWZ5aW5nIHRoZSBWREVWLCBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlciAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyogYWN0aW9uIHR5cGUsIHJlZmVyIHRvIHdtaV90c2ZfdHN0YW1wX2FjdGlvbiAqLworCUFfVUlOVDMyIHRzZl9hY3Rpb247Cit9IHdtaV92ZGV2X3RzZl90c3RhbXBfYWN0aW9uX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX3ZkZXZfdHNmX3JlcG9ydF9ldmVudF9maXhlZF9wYXJhbSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyogVkRFViBpZGVudGlmaWVyICovCisJQV9VSU5UMzIgdmRldl9pZDsKKwkvKiBsb3cgMzJiaXQgb2YgdHNmICovCisJQV9VSU5UMzIgdHNmX2xvdzsKKwkvKiBoaWdoIDMyIGJpdCBvZiB0c2YgKi8KKwlBX1VJTlQzMiB0c2ZfaGlnaDsKK30gd21pX3ZkZXZfdHNmX3JlcG9ydF9ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV92ZGV2X3NldF9pZV9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViwgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qIHVuaXF1ZSBpZCB0byBpZGVudGlmeSB0aGUgaWVfZGF0YSBhcyBkZWZpbmVkIGJ5IGllZWUgODAyLjExIHNwZWMgKi8KKwlBX1VJTlQzMiBpZV9pZDsKKwkvKiBpZV9sZW4gY29ycmVzcG9uZHMgdG8gbnVtIG9mIGJ5dGVzIGluIGllX2RhdGFbXSAqLworCUFfVUlOVDMyIGllX2xlbjsKKwkvKgorCSAqIEZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgVExWIGJ5dGUgc3RyZWFtIG9mIGllIGRhdGEgb2YgbGVuZ3RoCisJICogYnVmX2xlbjoKKwkgKiBBX1VJTlQ4IGllX2RhdGFbXTsKKwkgKi8KK30gd21pX3ZkZXZfc2V0X2llX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qCisJICogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogV01JVExWX1RBR19TVFJVQ193bWlfc29jX3NldF9wY2xfY21kX2ZpeGVkX3BhcmFtCisJICogU2V0IFByZWZlcnJlZCBDaGFubmVsIExpc3QKKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCisJLyogIyBvZiBjaGFubmVscyB0byBzY2FuICovCisJQV9VSU5UMzIgbnVtX2NoYW47CisJLyoKKwkgKiBUTFYgKHRhZyBsZW5ndGggdmFsdWUgKSBwYXJhbWV0ZXJzIGZvbGxvdyB0aGUgd21pX3NvY19zZXRfcGNsX2NtZAorCSAqIHN0cnVjdHVyZS4gVGhlIFRMVidzIGFyZToKKwkgKiAgICAgQV9VSU5UMzIgY2hhbm5lbF9saXN0W107CisJICovCit9IHdtaV9zb2Nfc2V0X3BjbF9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zb2Nfc2V0X2h3X21vZGVfY21kX2ZpeGVkX3BhcmFtCisJICogU2V0IEhhcmR3YXJlIE1vZGUgICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKworCS8qIEhhcmR3YXJlIE1vZGUgSW5kZXggKi8KKwlBX1VJTlQzMiBod19tb2RlX2luZGV4OworfSB3bWlfc29jX3NldF9od19tb2RlX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qCisJICogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnX2NtZF9maXhlZF9wYXJhbQorCSAqICBTZXQgRHVhbCBNQUMgRmlybXdhcmUgQ29uZmlndXJhdGlvbgorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisKKwkvKiBDb25jdXJyZW50IHNjYW4gY29uZmlndXJhdGlvbiBiaXRzICovCisJQV9VSU5UMzIgY29uY3VycmVudF9zY2FuX2NvbmZpZ19iaXRzOworCS8qIEZpcm13YXJlIG1vZGUgY29uZmlndXJhdGlvbiBiaXRzICovCisJQV9VSU5UMzIgZndfbW9kZV9jb25maWdfYml0czsKK30gd21pX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIG51bV90eF9jaGFpbnM7CisJQV9VSU5UMzIgbnVtX3J4X2NoYWluczsKKwlBX1VJTlQzMiByZXNlcnZlZFsyXTsKK30gc29jX251bV90eF9yeF9jaGFpbnM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiBudW1fdHhfY2hhaW5zXzJnOworCUFfVUlOVDMyIG51bV9yeF9jaGFpbnNfMmc7CisJQV9VSU5UMzIgbnVtX3R4X2NoYWluc181ZzsKKwlBX1VJTlQzMiBudW1fcnhfY2hhaW5zXzVnOworfSBiYW5kX251bV90eF9yeF9jaGFpbnM7CisKK3R5cGVkZWYgdW5pb24geworCXNvY19udW1fdHhfcnhfY2hhaW5zIHNvY190eHJ4X2NoYWluX3NldHRpbmc7CisJYmFuZF9udW1fdHhfcnhfY2hhaW5zIGJhbmRfdHhyeF9jaGFpbl9zZXR0aW5nOworfSBhbnRlbm5hX251bV90eF9yeF9jaGFpbnM7CisKK3R5cGVkZWYgZW51bSB7CisJQU5URU5OQV9NT0RFX0RJU0FCTEVEID0gMHgwLAorCUFOVEVOTkFfTU9ERV9MT1dfUE9XRVJfTE9DQVRJT05fU0NBTiA9IDB4MDEsCisJLyogcmVzZXJ2ZWQgKi8KK30gYW50ZW5uYV9tb2RlX3JlYXNvbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qCisJICogVExWIHRhZyBhbmQgbGVuOworCSAqICB0YWcgZXF1YWxzIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfYW50ZW5uYV9tb2RlX2NtZF9maXhlZF9wYXJhbQorCSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisKKwkvKiB0aGUgcmVhc29uIGZvciBzZXR0aW5nIGFudGVubmEgbW9kZSwgcmVmZXIgYW50ZW5uYV9tb2RlX3JlYXNvbiAqLworCUFfVUlOVDMyIHJlYXNvbjsKKworCS8qCisJICogVGhlIGFib3ZlIHJlYXNvbiBwYXJhbWV0ZXIgd2lsbCBzZWxlY3Qgd2hldGhlciB0aGUgZm9sbG93aW5nIHVuaW9uCisJICogaXMgc29jX251bV90eF9yeF9jaGFpbnMgb3IgYmFuZF9udW1fdHhfcnhfY2hhaW5zLgorCSAqLworCWFudGVubmFfbnVtX3R4X3J4X2NoYWlucyBudW1fdHhyeF9jaGFpbnNfc2V0dGluZzsKK30gd21pX3NvY19zZXRfYW50ZW5uYV9tb2RlX2NtZF9maXhlZF9wYXJhbTsKKworCisvKiogRGF0YSBzdHJ1Y3R1cmUgZm9yIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgVkRFViB0byBNQUMgbWFwcGluZy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfaHdfbW9kZV9yZXNwb25zZV92ZGV2X21hY19lbnRyeSAqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJQV9VSU5UMzIgdmRldl9pZDsgLyogVkRFViBJRCAqLworCUFfVUlOVDMyIG1hY19pZDsgLyogTUFDIElEICovCit9IHdtaV9zb2Nfc2V0X2h3X21vZGVfcmVzcG9uc2VfdmRldl9tYWNfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9zb2Nfc2V0X2h3X21vZGVfcmVzcG9uc2VfZXZlbnRfZml4ZWRfcGFyYW0KKwkgKiAgU2V0IEhhcmR3YXJlIE1vZGUgUmVzcG9uc2UgRXZlbnQgICoqLworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisKKwkvKiBTdGF0dXMgb2Ygc2V0X2h3X21vZGUgY29tbWFuZAorCSAqIFZhbHVlcyBmb3IgU3RhdHVzOgorCSAqICAwIC0gT0s7IGNvbW1hbmQgc3VjY2Vzc2Z1bAorCSogIDEgLSBFSU5WQUw7IFJlcXVlc3RlZCBpbnZhbGlkIGh3X21vZGUKKwkqICAyIC0gRUNBTkNFTEVEOyBIVyBtb2RlIGNoYW5nZSBjYW5jZWxlZAorCSogIDMgLSBFTk9UU1VQOyBIVyBtb2RlIG5vdCBzdXBwb3J0ZWQKKwkqICA0IC0gRUhBUkRXQVJFOyBIVyBtb2RlIGNoYW5nZSBwcmV2ZW50ZWQgYnkgaGFyZHdhcmUKKwkqICA1IC0gRVBFTkRJTkc7IEhXIG1vZGUgY2hhbmdlIGlzIHBlbmRpbmcKKwkqICA2IC0gRUNPRVg7IEhXIG1vZGUgY2hhbmdlIGNvbmZsaWN0IHdpdGggQ29leAorCSovCisJQV9VSU5UMzIgc3RhdHVzOworCS8qIENvbmZpZ3VyZWQgSGFyZHdhcmUgTW9kZSAqLworCUFfVUlOVDMyIGNmZ2RfaHdfbW9kZV9pbmRleDsKKwkvKiBOdW1iZXIgb2YgVmRldiB0byBNYWMgZW50cmllcyAqLworCUFfVUlOVDMyIG51bV92ZGV2X21hY19lbnRyaWVzOworCS8qCisJICogVExWICh0YWcgbGVuZ3RoIHZhbHVlICkgcGFyYW1ldGVycyBmb2xsb3cgdGhlIHNvY19zZXRfaHdfbW9kZV9yZXNwb25zZV9ldmVudAorCSAqIHN0cnVjdHVyZS4gVGhlIFRMVidzIGFyZToKKwkgKiAgICAgIEFfVUlOVDMyIHdtaV9zb2Nfc2V0X2h3X21vZGVfcmVzcG9uc2VfdmRldl9tYWNfZW50cnlbXTsKKwkgKi8KK30gd21pX3NvY19zZXRfaHdfbW9kZV9yZXNwb25zZV9ldmVudF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qCisJICogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogV01JVExWX1RBR19TVFJVQ193bWlfc29jX2h3X21vZGVfdHJhbnNpdGlvbl9ldmVudF9maXhlZF9wYXJhbQorCSAqICBIYXJkd2FyZSBNb2RlIFRyYW5zaXRpb24gRXZlbnQKKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCSAvKiBPcmlnaW5hbCBvciBvbGQgSGFyZHdhcmUgbW9kZSAqLworCUFfVUlOVDMyIG9sZF9od19tb2RlX2luZGV4OworCS8qIE5ldyBIYXJkd2FyZSBNb2RlICovCisJQV9VSU5UMzIgbmV3X2h3X21vZGVfaW5kZXg7CisJLyogTnVtYmVyIG9mIFZkZXYgdG8gTWFjIGVudHJpZXMgKi8KKwlBX1VJTlQzMiBudW1fdmRldl9tYWNfZW50cmllczsKKworCS8qKgorCSAqIFRMViAodGFnIGxlbmd0aCB2YWx1ZSApIHBhcmFtZXRlcnMgZm9sbG93IHRoZSBzb2Nfc2V0X2h3X21vZGVfcmVzcG9uc2VfZXZlbnQKKwkgKiBzdHJ1Y3R1cmUuIFRoZSBUTFYncyBhcmU6CisJICogICAgICBBX1VJTlQzMiB3bWlfc29jX3NldF9od19tb2RlX3Jlc3BvbnNlX3ZkZXZfbWFjX2VudHJ5W107CisJICovCit9IHdtaV9zb2NfaHdfbW9kZV90cmFuc2l0aW9uX2V2ZW50X2ZpeGVkX3BhcmFtOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX3NvY19zZXRfZHVhbF9tYWNfY29uZmlnX3Jlc3BvbnNlX2V2ZW50X2ZpeGVkX3BhcmFtCisJICogIFNldCBEdWFsIE1BQyBDb25maWcgUmVzcG9uc2UgRXZlbnQKKwkgKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCisJLyogU3RhdHVzIGZvciBzZXRfZHVhbF9tYWNfY29uZmlnIGNvbW1hbmQgKi8KKwkvKgorCSAqIFZhbHVlcyBmb3IgU3RhdHVzOgorCSAqICAwIC0gT0s7IGNvbW1hbmQgc3VjY2Vzc2Z1bAorCSAqICAxIC0gRUlOVkFMOyBSZXF1ZXN0ZWQgaW52YWxpZCBod19tb2RlCisJICogIDMgLSBFTk9UU1VQOyBIVyBtb2RlIG5vdCBzdXBwb3J0ZWQKKwkgKiAgNCAtIEVIQVJEV0FSRTsgSFcgbW9kZSBjaGFuZ2UgcHJldmVudGVkIGJ5IGhhcmR3YXJlCisJICogIDYgLSBFQ09FWDsgSFcgbW9kZSBjaGFuZ2UgY29uZmxpY3Qgd2l0aCBDb2V4CisJICovCisJQV9VSU5UMzIgc3RhdHVzOworfSB3bWlfc29jX3NldF9kdWFsX21hY19jb25maWdfcmVzcG9uc2VfZXZlbnRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgZW51bSB7CisJTUFXQ19NT1RJT05fU1RBVEVfVU5LTk9XTiwKKwlNQVdDX01PVElPTl9TVEFURV9TVEFUSU9OQVJZLAorCU1BV0NfTU9USU9OX1NUQVRFX1dBTEssCisJTUFXQ19NT1RJT05fU1RBVEVfVFJBTlNJVCwKK30gTUFXQ19NT1RJT05fU1RBVEU7CisKK3R5cGVkZWYgZW51bSB7CisJTUFXQ19TRU5TT1JfU1RBVFVTX09LLAorCU1BV0NfU0VOU09SX1NUQVRVU19GQUlMRURfVE9fRU5BQkxFLAorCU1BV0NfU0VOU09SX1NUQVRVU19TSFVURE9XTiwKK30gTUFXQ19TRU5TT1JfU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogV01JVExWX1RBR19TVFJVQ193bWlfbWF3Y19zZW5zb3JfcmVwb3J0X2luZF9jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qKiBuZXcgbW90aW9uIHN0YXRlLCBNQVdDX01PVElPTl9TVEFURSAqLworCUFfVUlOVDMyIG1vdGlvbl9zdGF0ZTsKKwkvKiogc3RhdHVzIGNvZGUgb2Ygc2Vuc29yLCBNQVdDX1NFTlNPUl9TVEFUVVMgKi8KKwlBX1VJTlQzMiBzZW5zb3Jfc3RhdHVzOworfSB3bWlfbWF3Y19zZW5zb3JfcmVwb3J0X2luZF9jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9tYXdjX2VuYWJsZV9zZW5zb3JfZXZlbnRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qIGVuYWJsZSgxKSBvciBkaXNhYmxlKDApICovCisJQV9VSU5UMzIgZW5hYmxlOworfSB3bWlfbWF3Y19lbmFibGVfc2Vuc29yX2V2ZW50X2ZpeGVkX3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogVExWIHRhZyBhbmQgbGVuOyB0YWcgZXF1YWxzCisJICogV01JVExWX1RBR19TVFJVQ193bWlfZXh0c2Nhbl9jb25maWd1cmVfbWF3Y19jbWRfZml4ZWRfcGFyYW0gKi8KKwlBX1VJTlQzMiB0bHZfaGVhZGVyOworCS8qIFVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGUgVkRFViAqLworCUFfVUlOVDMyIHZkZXZfaWQ7CisJLyogZW5hYmxlKDEpIG9yIGRpc2FibGUoMCkgTUFXQyAqLworCUFfVUlOVDMyIGVuYWJsZTsKKwkvKiByYXRpbyBvZiBza2lwcGluZyBzdXBwcmVzc2luZyBzY2FuLCBza2lwIG9uZSBvdXQgb2YgeCAqLworCUFfVUlOVDMyIHN1cHByZXNzX3JhdGlvOworfSB3bWlfZXh0c2Nhbl9jb25maWd1cmVfbWF3Y19jbWRfZml4ZWRfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkgKiBXTUlUTFZfVEFHX1NUUlVDX3dtaV9ubG9fY29uZmlndXJlX21hd2NfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiBVbmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qIGVuYWJsZSgxKSBvciBkaXNhYmxlKDApIE1BV0MgKi8KKwlBX1VJTlQzMiBlbmFibGU7CisJLyogcmF0aW8gb2YgZXhwb25lbnRpYWwgYmFja29mZiwgbmV4dCA9IGN1cnJlbnQgKyBjdXJyZW50KnJhdGlvLzEwMCAqLworCUFfVUlOVDMyIGV4cF9iYWNrb2ZmX3JhdGlvOworCS8qIGluaXRpYWwgc2NhbiBpbnRlcnZhbChtc2VjKSAqLworCUFfVUlOVDMyIGluaXRfc2Nhbl9pbnRlcnZhbDsKKwkvKiBtYXggc2NhbiBpbnRlcnZhbChtc2VjKSAqLworCUFfVUlOVDMyIG1heF9zY2FuX2ludGVydmFsOworfSB3bWlfbmxvX2NvbmZpZ3VyZV9tYXdjX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFRMViB0YWcgYW5kIGxlbjsgdGFnIGVxdWFscworCSAqIFdNSVRMVl9UQUdfU1RSVUNfd21pX3JvYW1fY29uZmlndXJlX21hd2NfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiBVbmlxdWUgaWQgaWRlbnRpZnlpbmcgdGhlIFZERVYgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qIGVuYWJsZSgxKSBvciBkaXNhYmxlKDApIE1BV0MgKi8KKwlBX1VJTlQzMiBlbmFibGU7CisJLyogZGF0YSB0cmFmZmljIGxvYWQgKGtCcHMpIHRvIHJlZ2lzdGVyIENNQyAqLworCUFfVUlOVDMyIHRyYWZmaWNfbG9hZF90aHJlc2hvbGQ7CisJLyogUlNTSSB0aHJlc2hvbGQgKGRCbSkgdG8gc2NhbiBmb3IgQmVzdCBBUCAqLworCUFfVUlOVDMyIGJlc3RfYXBfcnNzaV90aHJlc2hvbGQ7CisJLyogaGlnaCBSU1NJIHRocmVzaG9sZCBhZGp1c3RtZW50IGluIFN0YXRpb25hcnkgdG8gc3VwcHJlc3Mgc2NhbiAqLworCUFfVUlOVDMyIHJzc2lfc3RhdGlvbmFyeV9oaWdoX2FkanVzdDsKKwkvKiBsb3cgUlNTSSB0aHJlc2hvbGQgYWRqdXN0bWVudCBpbiBTdGF0aW9uYXJ5IHRvIHN1cHByZXNzIHNjYW4gKi8KKwlBX1VJTlQzMiByc3NpX3N0YXRpb25hcnlfbG93X2FkanVzdDsKK30gd21pX3JvYW1fY29uZmlndXJlX21hd2NfY21kX2ZpeGVkX3BhcmFtOworCisjZGVmaW5lIFdNSV9QQUNLRVRfRklMVEVSX0NPTVBBUkVfREFUQV9MRU5fRFdPUkQgICAgIDIKKyNkZWZpbmUgV01JX1BBQ0tFVF9GSUxURVJfTUFYX0NNUF9QRVJfUEFDS0VUX0ZJTFRFUiAgMTAKKwordHlwZWRlZiBlbnVtIHsKKwlQQUNLRVRfRklMVEVSX1RZUEVfSU5WQUxJRCA9IDAsCisJUEFDS0VUX0ZJTFRFUl9UWVBFX0ZJTFRFUl9QS1QsCisJUEFDS0VUX0ZJTFRFUl9UWVBFX1JFU0VSVkVfUEtULCAvKiBub3QgdXNlZCAqLworCVBBQ0tFVF9GSUxURVJfVFlQRV9NQVhfRU5VTV9TSVpFCit9IFdNSV9QQUNLRVRfRklMVEVSX0ZJTFRFUl9UWVBFOworCit0eXBlZGVmIGVudW0geworCVBBQ0tFVF9GSUxURVJfUFJPVE9fVFlQRV9JTlZBTElEID0gMCwKKworCS8qIEwyIGhlYWRlciAqLworCVBBQ0tFVF9GSUxURVJfUFJPVE9fVFlQRV9NQUMsCisJUEFDS0VUX0ZJTFRFUl9QUk9UT19UWVBFX1NOQVAsCisKKwkvKiBMMyBoZWFkZXIgKEV0aGVyVHlwZSkgKi8KKwlQQUNLRVRfRklMVEVSX1BST1RPX1RZUEVfSVBWNCwKKwlQQUNLRVRfRklMVEVSX1BST1RPX1RZUEVfSVBWNiwKKworCS8qIEw0IGhlYWRlciAoSVAgcHJvdG9jb2wpICovCisJUEFDS0VUX0ZJTFRFUl9QUk9UT19UWVBFX1VEUCwKKwlQQUNLRVRfRklMVEVSX1BST1RPX1RZUEVfVENQLAorCVBBQ0tFVF9GSUxURVJfUFJPVE9fVFlQRV9JQ01QVjYsCisKKwlQQUNLRVRfRklMVEVSX1BST1RPX1RZUEVfTUFYCit9IFdNSV9QQUNLRVRfRklMVEVSX1BST1RPX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisJUEFDS0VUX0ZJTFRFUl9DTVBfVFlQRV9JTlZBTElEID0gMCwKKwlQQUNLRVRfRklMVEVSX0NNUF9UWVBFX0VRVUFMLAorCVBBQ0tFVF9GSUxURVJfQ01QX1RZUEVfTUFTS19FUVVBTCwKKwlQQUNLRVRfRklMVEVSX0NNUF9UWVBFX05PVF9FUVVBTCwKKwlQQUNLRVRfRklMVEVSX0NNUF9UWVBFX01BU0tfTk9UX0VRVUFMLAorCVBBQ0tFVF9GSUxURVJfQ01QX1RZUEVfQUREUlRZUEUsCisJUEFDS0VUX0ZJTFRFUl9DTVBfVFlQRV9NQVgKK30gV01JX1BBQ0tFVF9GSUxURVJfQ01QX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisJUEFDS0VUX0ZJTFRFUl9TRVRfSU5BQ1RJVkUgPSAwLAorCVBBQ0tFVF9GSUxURVJfU0VUX0FDVElWRQorfSBXTUlfUEFDS0VUX0ZJTFRFUl9BQ1RJT047CisKK3R5cGVkZWYgZW51bSB7CisJUEFDS0VUX0ZJTFRFUl9TRVRfRElTQUJMRSA9IDAsCisJUEFDS0VUX0ZJTFRFUl9TRVRfRU5BQkxFCit9IFdNSV9QQUNLRVRfRklMVEVSX1JVTlRJTUVfRU5BQkxFOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgIHByb3RvX3R5cGU7CisJQV9VSU5UMzIgIGNtcF90eXBlOworCUFfVUlOVDMyICBkYXRhX2xlbmd0aDsgLyogTGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGNvbXBhcmUgKHVuaXRzID0gYnl0ZXMpICovCisJLyoKKwkgKiBmcm9tIHN0YXJ0IG9mIHRoZSByZXNwZWN0aXZlIGZyYW1lIGhlYWRlciAoCisJICogdW5pdHMgPSBieXRlcykKKwkgKi8KKwlBX1VJTlQzMiAgZGF0YV9vZmZzZXQ7CisJLyogRGF0YSB0byBjb21wYXJlLCBsaXR0bGUtZW5kaWFuIG9yZGVyICovCisJQV9VSU5UMzIgIGNvbXBhcmVEYXRhW1dNSV9QQUNLRVRfRklMVEVSX0NPTVBBUkVfREFUQV9MRU5fRFdPUkRdOworCS8qIE1hc2sgdG8gYmUgYXBwbGllZCBvbiByY3ZkIHBhY2tldCBkYXRhIGJlZm9yZSBjb21wYXJlLCBsaXR0bGUtZW5kaWFuIG9yZGVyICovCisJQV9VSU5UMzIgIGRhdGFNYXNrW1dNSV9QQUNLRVRfRklMVEVSX0NPTVBBUkVfREFUQV9MRU5fRFdPUkRdOworfSBXTUlfUEFDS0VUX0ZJTFRFUl9QQVJBTVNfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyICB0bHZfaGVhZGVyOworCUFfVUlOVDMyICB2ZGV2X2lkOworCUFfVUlOVDMyICBmaWx0ZXJfaWQ7CisJQV9VSU5UMzIgIGZpbHRlcl9hY3Rpb247IC8qIFdNSV9QQUNLRVRfRklMVEVSX0FDVElPTiAqLworCUFfVUlOVDMyICBmaWx0ZXJfdHlwZTsKKwlBX1VJTlQzMiAgbnVtX3BhcmFtczsgLyogaG93IG1hbnkgZW50cmllcyBpbiBwYXJhbXNEYXRhIGFyZSB2YWxpZCAqLworCUFfVUlOVDMyICBjb2FsZXNjZV90aW1lOyAvKiBub3QgY3VycmVudGx5IHVzZWQgLSBmaWxsIHdpdGggMHgwICovCisJV01JX1BBQ0tFVF9GSUxURVJfUEFSQU1TX1RZUEUgIHBhcmFtc0RhdGFbV01JX1BBQ0tFVF9GSUxURVJfTUFYX0NNUF9QRVJfUEFDS0VUX0ZJTFRFUl07Cit9IFdNSV9QQUNLRVRfRklMVEVSX0NPTkZJR19DTURfZml4ZWRfcGFyYW07CisKKy8qIGVuYWJsZSAvIGRpc2FibGUgYWxsIGZpbHRlcnMgd2l0aGluIHRoZSBzcGVjaWZpZWQgdmRldiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyICB0bHZfaGVhZGVyOworCUFfVUlOVDMyICB2ZGV2X2lkOworCUFfVUlOVDMyICBlbmFibGU7IC8qIFdNSV9QQUNLRVRfRklMVEVSX1JVTlRJTUVfRU5BQkxFICovCit9IFdNSV9QQUNLRVRfRklMVEVSX0VOQUJMRV9DTURfZml4ZWRfcGFyYW07CisKKworI2RlZmluZSBXTUlfTFJPX0lORk9fVENQX0ZMQUdfVkFMU19CSVRQT1MgIDAKKyNkZWZpbmUgV01JX0xST19JTkZPX1RDUF9GTEFHX1ZBTFNfTlVNQklUUyA5CisKKyNkZWZpbmUgV01JX0xST19JTkZPX1RDUF9GTEFHX1ZBTFNfU0VUKHRjcF9mbGFnX3UzMiwgdGNwX2ZsYWdfdmFsdWVzKSBcCisJV01JX1NFVF9CSVRTKHRjcF9mbGFnX3UzMiwgXAorCVdNSV9MUk9fSU5GT19UQ1BfRkxBR19WQUxTX0JJVFBPUywgXAorCVdNSV9MUk9fSU5GT19UQ1BfRkxBR19WQUxTX05VTUJJVFMsIFwKKwl0Y3BfZmxhZ192YWx1ZXMpCisjZGVmaW5lIFdNSV9MUk9fSU5GT19UQ1BfRkxBR19WQUxTX0dFVCh0Y3BfZmxhZ191MzIpIFwKKwlXTUlfR0VUX0JJVFModGNwX2ZsYWdfdTMyLCBcCisJV01JX0xST19JTkZPX1RDUF9GTEFHX1ZBTFNfQklUUE9TLCBcCisJV01JX0xST19JTkZPX1RDUF9GTEFHX1ZBTFNfTlVNQklUUykKKworI2RlZmluZSBXTUlfTFJPX0lORk9fVENQX0ZMQUdTX01BU0tfQklUUE9TICA5CisjZGVmaW5lIFdNSV9MUk9fSU5GT19UQ1BfRkxBR1NfTUFTS19OVU1CSVRTIDkKKworI2RlZmluZSBXTUlfTFJPX0lORk9fVENQX0ZMQUdTX01BU0tfU0VUKHRjcF9mbGFnX3UzMiwgdGNwX2ZsYWdzX21hc2spIFwKKwlXTUlfU0VUX0JJVFModGNwX2ZsYWdfdTMyLCBcCisJV01JX0xST19JTkZPX1RDUF9GTEFHU19NQVNLX0JJVFBPUywgXAorCVdNSV9MUk9fSU5GT19UQ1BfRkxBR1NfTUFTS19OVU1CSVRTLCBcCisJdGNwX2ZsYWdzX21hc2spCisjZGVmaW5lIFdNSV9MUk9fSU5GT19UQ1BfRkxBR1NfTUFTS19HRVQodGNwX2ZsYWdfdTMyKSBcCisJV01JX0dFVF9CSVRTKHRjcF9mbGFnX3UzMiwgXAorCVdNSV9MUk9fSU5GT19UQ1BfRkxBR1NfTUFTS19CSVRQT1MsIFwKKwlXTUlfTFJPX0lORk9fVENQX0ZMQUdTX01BU0tfTlVNQklUUykKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHRsdl9oZWFkZXI7CisJLyoqCisJICogQGJyaWVmIGxyb19lbmFibGUgLSBpbmRpY2F0ZXMgd2hldGhlciBscm8gaXMgZW5hYmxlZAorCSAqIFswXSBMUk8gRW5hYmxlCisJICovCisJQV9VSU5UMzIgbHJvX2VuYWJsZTsKKwkvKioKKwkgKiBAYnJpZWYgdGNwX2ZsYWdfdTMyIC0gbWFzayBvZiB3aGljaCBUQ1AgZmxhZ3MgdG8gY2hlY2sgYW5kCisJICogICAgICB2YWx1ZXMgdG8gY2hlY2sgZm9yCisJICogWzg6MF0gVENQIGZsYWcgdmFsdWVzIC0gSWYgdGhlIFRDUCBmbGFncyBmcm9tIHRoZSBwYWNrZXQgZG8gbm90IG1hdGNoCisJICogICAgICAgdGhlIHZhbHVlcyBpbiB0aGlzIGZpZWxkIGFmdGVyIG1hc2tpbmcgd2l0aCBUQ1AgZmxhZ3MgbWFzaworCSAqICAgICAgIGJlbG93LExSTyBlbGlnaWJsZSB3aWxsIG5vdCBiZSBzZXQKKwkgKiBbMTc6OV0gVENQIGZsYWdzIG1hc2sgLSBNYXNrIGZpZWxkIGZvciBjb21wYXJpbmcgdGhlIFRDUCB2YWx1ZXMKKwkgKiAgICAgICBwcm92aWRlZCBhYm92ZSB3aXRoIHRoZSBUQ1AgZmxhZ3MgZmllbGQgaW4gdGhlIHJlY2VpdmVkIHBhY2tldAorCSAqIFVzZSBXTUlfTFJPX0lORk9fVENQX0ZMQUdfVkFMUyBhbmQgV01JX0xST19JTkZPX1RDUF9GTEFHU19NQVNLCisJICogbWFjcm9zIHRvIGlzb2xhdGUgdGhlIG1hc2sgZmllbGQgYW5kIHZhbHVlcyBmaWVsZCB0aGF0IGFyZSBwYWNrZWQKKwkgKiBpbnRvIHRoaXMgdTMyICJ3b3JkIi4KKwkgKi8KKwlBX1VJTlQzMiB0Y3BfZmxhZ191MzI7CisJLyoqCisJICogQGJyaWVmIHRvZXBsaXR6X2hhc2hfaXB2NCAtIGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUKKwkgKiB0aGUgZmxvdyBpZCA1LXR1cGxlIHRvZXBsaXR6IGhhc2ggZm9yIElQdjQgcGFja2V0cy4gQ29udGFpbnMKKwkgKiBieXRlcyAwIHRvIDMKKwkgKgorCSAqIEluIHRoaXMgYW5kIGFsbCB0aGUgYmVsb3cgdG9lcGxpdHpfaGFzaCBmaWVsZHMsIHRoZSBieXRlcyBhcmUKKwkgKiBzcGVjaWZpZWQgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4gIEZvciBleGFtcGxlOgorCSAqICAgICB0b2VwbGl0el9oYXNoX2lwdjRfMF8zIGJpdHMgNzowICAgaG9sZHMgc2VlZCBieXRlIDAKKwkgKiAgICAgdG9lcGxpdHpfaGFzaF9pcHY0XzBfMyBiaXRzIDE1OjggIGhvbGRzIHNlZWQgYnl0ZSAxCisJICogICAgIHRvZXBsaXR6X2hhc2hfaXB2NF8wXzMgYml0cyAyMzoxNiBob2xkcyBzZWVkIGJ5dGUgMgorCSAqICAgICB0b2VwbGl0el9oYXNoX2lwdjRfMF8zIGJpdHMgMzE6MjQgaG9sZHMgc2VlZCBieXRlIDMKKwkgKi8KKwlBX1VJTlQzMiB0b2VwbGl0el9oYXNoX2lwdjRfMF8zOworCisJLyoqCisJICogQGJyaWVmIHRvZXBsaXR6X2hhc2hfaXB2NCAtIGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUKKwkgKiB0aGUgZmxvdyBpZCA1LXR1cGxlIHRvZXBsaXR6IGhhc2ggZm9yIElQdjQgcGFja2V0cy4gQ29udGFpbnMKKwkgKiBieXRlcyA0IHRvIDcKKwkgKi8KKwlBX1VJTlQzMiB0b2VwbGl0el9oYXNoX2lwdjRfNF83OworCisJLyoqCisJICogQGJyaWVmIHRvZXBsaXR6X2hhc2hfaXB2NCAtIGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUKKwkgKiB0aGUgZmxvdyBpZCA1LXR1cGxlIHRvZXBsaXR6IGhhc2ggZm9yIElQdjQgcGFja2V0cy4gQ29udGFpbnMKKwkgKiBieXRlcyA4IHRvIDExCisJICovCisJQV9VSU5UMzIgdG9lcGxpdHpfaGFzaF9pcHY0XzhfMTE7CisKKwkvKioKKwkgKiBAYnJpZWYgdG9lcGxpdHpfaGFzaF9pcHY0IC0gY29udGFpbnMgc2VlZCBuZWVkZWQgdG8gY29tcHV0ZQorCSAqIHRoZSBmbG93IGlkIDUtdHVwbGUgdG9lcGxpdHogaGFzaCBmb3IgSVB2NCBwYWNrZXRzLiBDb250YWlucworCSAqIGJ5dGVzIDEyIHRvIDE1CisJICovCisJQV9VSU5UMzIgdG9lcGxpdHpfaGFzaF9pcHY0XzEyXzE1OworCisJLyoqCisJICogQGJyaWVmIHRvZXBsaXR6X2hhc2hfaXB2NCAtIGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUKKwkgKiB0aGUgZmxvdyBpZCA1LXR1cGxlIHRvZXBsaXR6IGhhc2ggZm9yIElQdjQgcGFja2V0cy4gQ29udGFpbnMKKwkgKiBieXRlIDE2CisJICovCisJQV9VSU5UMzIgdG9lcGxpdHpfaGFzaF9pcHY0XzE2OworCisJLyoqCisJICogQGJyaWVmIHRvZXBsaXR6X2hhc2hfaXB2NiAtIGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUKKwkgKiB0aGUgZmxvdyBpZCA1LXR1cGxlIHRvZXBsaXR6IGhhc2ggZm9yIElQdjYgcGFja2V0cy4gQ29udGFpbnMKKwkgKiBieXRlcyAwIHRvIDMKKwkgKi8KKwlBX1VJTlQzMiB0b2VwbGl0el9oYXNoX2lwdjZfMF8zOworCisJLyoqCisJICogQGJyaWVmIHRvZXBsaXR6X2hhc2hfaXB2NiAtIGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUKKwkgKiB0aGUgZmxvdyBpZCA1LXR1cGxlIHRvZXBsaXR6IGhhc2ggZm9yIElQdjYgcGFja2V0cy4gQ29udGFpbnMKKwkgKiBieXRlcyA0IHRvIDcKKwkgKi8KKwlBX1VJTlQzMiB0b2VwbGl0el9oYXNoX2lwdjZfNF83OworCisJLyoqCisJICogQGJyaWVmIHRvZXBsaXR6X2hhc2hfaXB2NiAtIGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUKKwkgKiB0aGUgZmxvdyBpZCA1LXR1cGxlIHRvZXBsaXR6IGhhc2ggZm9yIElQdjYgcGFja2V0cy4gQ29udGFpbnMKKwkgKiBieXRlcyA4IHRvIDExCisJICovCisJQV9VSU5UMzIgdG9lcGxpdHpfaGFzaF9pcHY2XzhfMTE7CisKKwkvKioKKwkgKiBAYnJpZWYgdG9lcGxpdHpfaGFzaF9pcHY2IC0gY29udGFpbnMgc2VlZCBuZWVkZWQgdG8gY29tcHV0ZQorCSAqIHRoZSBmbG93IGlkIDUtdHVwbGUgdG9lcGxpdHogaGFzaCBmb3IgSVB2NiBwYWNrZXRzLiBDb250YWlucworCSAqIGJ5dGVzIDEyIHRvIDE1CisJICovCisJQV9VSU5UMzIgdG9lcGxpdHpfaGFzaF9pcHY2XzEyXzE1OworCisJLyoqCisJICogQGJyaWVmIHRvZXBsaXR6X2hhc2hfaXB2NiAtIGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUKKwkgKiB0aGUgZmxvdyBpZCA1LXR1cGxlIHRvZXBsaXR6IGhhc2ggZm9yIElQdjYgcGFja2V0cy4gQ29udGFpbnMKKwkgKiBieXRlcyAxNiB0byAxOQorCSAqLworCUFfVUlOVDMyIHRvZXBsaXR6X2hhc2hfaXB2Nl8xNl8xOTsKKworCS8qKgorCSAqIEBicmllZiB0b2VwbGl0el9oYXNoX2lwdjYgLSBjb250YWlucyBzZWVkIG5lZWRlZCB0byBjb21wdXRlCisJICogdGhlIGZsb3cgaWQgNS10dXBsZSB0b2VwbGl0eiBoYXNoIGZvciBJUHY2IHBhY2tldHMuIENvbnRhaW5zCisJICogYnl0ZXMgMjAgdG8gMjIKKwkgKi8KKwlBX1VJTlQzMiB0b2VwbGl0el9oYXNoX2lwdjZfMjBfMjM7CisKKwkvKioKKwkgKiBAYnJpZWYgdG9lcGxpdHpfaGFzaF9pcHY2IC0gY29udGFpbnMgc2VlZCBuZWVkZWQgdG8gY29tcHV0ZQorCSAqIHRoZSBmbG93IGlkIDUtdHVwbGUgdG9lcGxpdHogaGFzaCBmb3IgSVB2NiBwYWNrZXRzLiBDb250YWlucworCSAqIGJ5dGVzIDI0IHRvIDI3CisJICovCisJQV9VSU5UMzIgdG9lcGxpdHpfaGFzaF9pcHY2XzI0XzI3OworCisJLyoqCisJICogQGJyaWVmIHRvZXBsaXR6X2hhc2hfaXB2NiAtIGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUKKwkgKiB0aGUgZmxvdyBpZCA1LXR1cGxlIHRvZXBsaXR6IGhhc2ggZm9yIElQdjYgcGFja2V0cy4gQ29udGFpbnMKKwkgKiBieXRlcyAyOCB0byAzMQorCSAqLworCUFfVUlOVDMyIHRvZXBsaXR6X2hhc2hfaXB2Nl8yOF8zMTsKKworCS8qKgorCSAqIEBicmllZiB0b2VwbGl0el9oYXNoX2lwdjYgLSBjb250YWlucyBzZWVkIG5lZWRlZCB0byBjb21wdXRlCisJICogdGhlIGZsb3cgaWQgNS10dXBsZSB0b2VwbGl0eiBoYXNoIGZvciBJUHY2IHBhY2tldHMuIENvbnRhaW5zCisJICogYnl0ZXMgMzIgdG8gMzUKKwkgKi8KKwlBX1VJTlQzMiB0b2VwbGl0el9oYXNoX2lwdjZfMzJfMzU7CisKKwkvKioKKwkgKiBAYnJpZWYgdG9lcGxpdHpfaGFzaF9pcHY2IC0gY29udGFpbnMgc2VlZCBuZWVkZWQgdG8gY29tcHV0ZQorCSAqIHRoZSBmbG93IGlkIDUtdHVwbGUgdG9lcGxpdHogaGFzaCBmb3IgSVB2NiBwYWNrZXRzLiBDb250YWlucworCSAqIGJ5dGVzIDM2IHRvIDM5CisJICovCisJQV9VSU5UMzIgdG9lcGxpdHpfaGFzaF9pcHY2XzM2XzM5OworCisJLyoqCisJICogQGJyaWVmIHRvZXBsaXR6X2hhc2hfaXB2NiAtIGNvbnRhaW5zIHNlZWQgbmVlZGVkIHRvIGNvbXB1dGUKKwkgKiB0aGUgZmxvdyBpZCA1LXR1cGxlIHRvZXBsaXR6IGhhc2ggZm9yIElQdjYgcGFja2V0cy4gQ29udGFpbnMKKwkgKiBieXRlIDQwCisJICovCisJQV9VSU5UMzIgdG9lcGxpdHpfaGFzaF9pcHY2XzQwOworfSB3bWlfbHJvX2luZm9fY21kX2ZpeGVkX3BhcmFtOworCisvKiBBREQgTkVXIERFRlMgSEVSRSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyBhcmUgZGVwcmVjYXRlZC4gRE8gTk9UIFVTRSBUSEVNIQorICovCisKKy8qKiBNYXggbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBzY2hlZHVsZS4gKi8KKyNkZWZpbmUgT0NCX0NIQU5ORUxfTUFYICg1KQorCisvKiBOT1RFOiBNYWtlIHN1cmUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpZGVudGljYWwgdG8gdGhvc2UJOTIzNQorKiBkZWZpbmVkIGluIHNpckFwaS5oICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisJLyoqIEFyYml0cmF0aW9uIEludGVyLUZyYW1lIFNwYWNpbmcuIFJhbmdlOiAyLTE1ICovCisJQV9VSU5UMzIgYWlmc247CisJLyoqIENvbnRlbnRpb24gV2luZG93IG1pbmltdW0uIFJhbmdlOiAxIC0gMTAgKi8KKwlBX1VJTlQzMiBjd21pbjsKKwkvKiogQ29udGVudGlvbiBXaW5kb3cgbWF4aW11bS4gUmFuZ2U6IDEgLSAxMCAqLworCUFfVUlOVDMyIGN3bWF4OworfSB3bWlfcW9zX3BhcmFtc190OworCit0eXBlZGVmIHN0cnVjdAoreworCS8qKiBDaGFubmVsIGZyZXF1ZW5jeSBpbiBNSHogKi8KKwlBX1VJTlQzMiBjaGFuX2ZyZXE7CisJLyoqIENoYW5uZWwgZHVyYXRpb24gaW4gbXMgKi8KKwlBX1VJTlQzMiBkdXJhdGlvbjsKKwkvKiogU3RhcnQgZ3VhcmQgaW50ZXJ2YWwgaW4gbXMgKi8KKwlBX1VJTlQzMiBzdGFydF9ndWFyZF9pbnRlcnZhbDsKKwkvKiogRW5kIGd1YXJkIGludGVydmFsIGluIG1zICovCisJQV9VSU5UMzIgZW5kX2d1YXJkX2ludGVydmFsOworCS8qKiBUcmFuc21pdCBwb3dlciBpbiBkQm0sIHJhbmdlIDAgLSAyMyAqLworCUFfVUlOVDMyIHR4X3Bvd2VyOworCS8qKiBUcmFuc21pdCBkYXRhcmF0ZSBpbiBNYnBzICovCisJQV9VSU5UMzIgdHhfcmF0ZTsKKwkvKiogUW9TIHBhcmFtZXRlcnMgZm9yIGVhY2ggQUMgKi8KKwl3bWlfcW9zX3BhcmFtc190IHFvc19wYXJhbXNbV0xBTl9NQVhfQUNdOworCS8qKiAxIHRvIGVuYWJsZSBSWCBzdGF0cyBmb3IgdGhpcyBjaGFubmVsLCAwIG90aGVyd2lzZSAqLworCUFfVUlOVDMyIHJ4X3N0YXRzOworfSB3bWlfb2NiX2NoYW5uZWxfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBUTFYgdGFnIGFuZCBsZW47IHRhZyBlcXVhbHMKKwkqIFdNSVRMVl9UQUdfU1RSVUNfd21pX29jYl9zZXRfc2NoZWRfY21kX2ZpeGVkX3BhcmFtICovCisJQV9VSU5UMzIgdGx2X2hlYWRlcjsKKwkvKiBWREVWIGlkZW50aWZpZXIgKi8KKwlBX1VJTlQzMiB2ZGV2X2lkOworCS8qKiBOdW1iZXIgb2YgdmFsaWQgY2hhbm5lbHMgaW4gdGhlIGNoYW5uZWxzIGFycmF5ICovCisJQV9VSU5UMzIgbnVtX2NoYW5uZWxzOworCS8qKiBUaGUgYXJyYXkgb2YgY2hhbm5lbHMgKi8KKwl3bWlfb2NiX2NoYW5uZWxfdCBjaGFubmVsc1tPQ0JfQ0hBTk5FTF9NQVhdOworCS8qKiAxIHRvIGFsbG93IG9mZi1jaGFubmVsIHR4LCAwIG90aGVyd2lzZSAqLworCUFfVUlOVDMyIG9mZl9jaGFubmVsX3R4OyAvLyBOb3Qgc3VwcG9ydGVkCit9IHdtaV9vY2Jfc2V0X3NjaGVkX2NtZF9maXhlZF9wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qKiBSZXR1cm4gc3RhdHVzLiAwIGZvciBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UgKi8KKwlBX1VJTlQzMiBzdGF0dXM7Cit9IHdtaV9vY2Jfc2V0X3NjaGVkX2V2ZW50X2ZpeGVkX3BhcmFtOworCisvKioKKyogRU5EIERFUFJFQ0FURUQKKyovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qX1dNSV9VTklGSUVEX0hfKi8KKy8qKkB9Ki8KZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvd21pX3ZlcnNpb24uaCBiL3RhcmdldC9pbmMvd21pX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzFiNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2luYy93bWlfdmVyc2lvbi5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKKyAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBJTVBPUlRBTlQgTk9URTogRm9yIGFsbCBjaGFuZ2UgdG8gV01JIEludGVyZmFjZSwgdGhlIEFCSSB2ZXJzaW9uIG51bWJlciBfbXVzdF8gYmUgdXBkYXRlZC4KKyAqLworLyoqIE1ham9yIHZlcnNpb24gbnVtYmVyIGlzIGluY3JlbWVudGVkIHdoZW4gdGhlcmUgYXJlIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gV01JIEludGVyZmFjZSB0aGF0IGJyZWFrIGNvbXBhdGliaWxpdHkuICovCisjZGVmaW5lIF9fV01JX1ZFUl9NQUpPUl8gICAgMQorLyoqIE1pbm9yIHZlcnNpb24gbnVtYmVyIGlzIGluY3JlbWVudGVkIHdoZW4gdGhlcmUgYXJlIGNoYW5nZXMKKyAqICAoaG93ZXZlciBtaW5vcikgdG8gV01JIEludGVyZmFjZSB0aGF0IGJyZWFrCisgKiAgY29tcGF0aWJpbGl0eS4gKi8KKyNkZWZpbmUgX19XTUlfVkVSX01JTk9SXyAgICAwCisvKiogV01JIHJldmlzaW9uIG51bWJlciBoYXMgdG8gYmUgaW5jcmVtZW50ZWQgd2hlbiB0aGVyZSBpcyBhCisgKiAgY2hhbmdlIHRoYXQgbWF5IG9yIG1heSBub3QgYnJlYWsgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBfX1dNSV9SRVZJU0lPTl8gMTczCisKKy8qKiBUaGUgVmVyc2lvbiBOYW1lc3BhY2Ugc2hvdWxkIG5vdCBiZSBub3JtYWxseSBjaGFuZ2VkLiBPbmx5CisgKiAgaG9zdCBhbmQgZmlybXdhcmUgb2YgdGhlIHNhbWUgV01JIG5hbWVzcGFjZSB3aWxsIHdvcmsKKyAqICB0b2dldGhlci4KKyAqICBGb3IgZXhhbXBsZSwgIlFDQV9NTCIgY29udmVydHMgdG8gMHg0QywgMHg0RDVGNDE0MzUxLgorICogIHdoZXJlICdRJz0weDUxLCAnQyc9MHg0MywgJ0EnPTB4NDEsICdfJz0weDVGLiAnTSc9NEQsICdMJz00QworICovCisjZGVmaW5lIF9fTkFNRVNQQUNFXzBfICAgIDB4NUY0MTQzNTEKKyNkZWZpbmUgX19OQU1FU1BBQ0VfMV8gICAgMHgwMDAwNEM0RAorI2RlZmluZSBfX05BTUVTUEFDRV8yXyAgICAweDAwMDAwMDAwCisjZGVmaW5lIF9fTkFNRVNQQUNFXzNfICAgIDB4MDAwMDAwMDAKKworLyogRm9ybWF0IG9mIHRoZSB2ZXJzaW9uIG51bWJlci4gKi8KKyNkZWZpbmUgV01JX1ZFUl9NQUpPUl9CSVRfT0ZGU0VUICAgICAgICAyNAorI2RlZmluZSBXTUlfVkVSX01JTk9SX0JJVF9PRkZTRVQgICAgICAgIDAKKworI2RlZmluZSBXTUlfVkVSX01BSk9SX0JJVF9NQVNLICAgICAgICAgIDB4RkYwMDAwMDAKKyNkZWZpbmUgV01JX1ZFUl9NSU5PUl9CSVRfTUFTSyAgICAgICAgICAweDAwRkZGRkZGCisKKy8qIE1hY3JvcyB0byBleHRyYWN0IHRoZSBzd192ZXJzaW9uIGNvbXBvbmVudHMuCisgKi8KKyNkZWZpbmUgV01JX1ZFUl9HRVRfTUFKT1IoeCkgKCgoeCkgJiBXTUlfVkVSX01BSk9SX0JJVF9NQVNLKT4+V01JX1ZFUl9NQUpPUl9CSVRfT0ZGU0VUKQorI2RlZmluZSBXTUlfVkVSX0dFVF9NSU5PUih4KSAoKCh4KSAmIFdNSV9WRVJfTUlOT1JfQklUX01BU0spPj5XTUlfVkVSX01JTk9SX0JJVF9PRkZTRVQpCisKKyNkZWZpbmUgV01JX1ZFUl9HRVRfVkVSU0lPTl8wKG1ham9yLCBtaW5vcikgKCAoKCBtYWpvciA8PCBXTUlfVkVSX01BSk9SX0JJVF9PRkZTRVQgKSAmIFdNSV9WRVJfTUFKT1JfQklUX01BU0spICsgKCggbWlub3IgPDwgV01JX1ZFUl9NSU5PUl9CSVRfT0ZGU0VUICkgJiBXTUlfVkVSX01JTk9SX0JJVF9NQVNLKSApCisvKgorICogVGhlIHZlcnNpb24gaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICogQml0cyAyNC0zMTogTWFqb3IgdmVyc2lvbgorICogQml0cyAwLTIzOiBNaW5vciB2ZXJzaW9uCisgKiBCaXRzIDAtMzE6ICBCdWlsZCBudW1iZXIKKyAqIEUuZy4gQnVpbGQgMS4xLjcgd291bGQgYmUgcmVwcmVzZW50ZWQgYXMgMHgwMTAwMDAwMSBmb3IgTWFqb3IvTWlub3IgJiAweDAwMDAwMDA3IGZvciBidWlsZG51bS4KKyAqCisgKiBETyBOT1Qgc3BsaXQgdGhlIGZvbGxvd2luZyBtYWNybyBpbnRvIG11bHRpcGxlIGxpbmVzIGFzIHRoaXMgbWF5IGNvbmZ1c2UgdGhlIGJ1aWxkIHNjcmlwdHMuCisgKi8KKy8qIEFCSSBWZXJzaW9uLiBSZWZsZWN0cyB0aGUgdmVyc2lvbiBvZiBiaW5hcnkgaW50ZXJmYWNlIGV4cG9zZWQgYnkgVGFyZ2V0IGZpcm13YXJlLiAqLworI2RlZmluZSBXTUlfQUJJX1ZFUlNJT05fMCAgV01JX1ZFUl9HRVRfVkVSU0lPTl8wKF9fV01JX1ZFUl9NQUpPUl8sIF9fV01JX1ZFUl9NSU5PUl8pCisjZGVmaW5lIFdNSV9BQklfVkVSU0lPTl8xICBfX1dNSV9SRVZJU0lPTl8KKyNkZWZpbmUgV01JX0FCSV9WRVJTSU9OX05TXzAgX19OQU1FU1BBQ0VfMF8KKyNkZWZpbmUgV01JX0FCSV9WRVJTSU9OX05TXzEgX19OQU1FU1BBQ0VfMV8KKyNkZWZpbmUgV01JX0FCSV9WRVJTSU9OX05TXzIgX19OQU1FU1BBQ0VfMl8KKyNkZWZpbmUgV01JX0FCSV9WRVJTSU9OX05TXzMgX19OQU1FU1BBQ0VfM18KZGlmZiAtLWdpdCBhL3RhcmdldC9pbmMvd21peC5oIGIvdGFyZ2V0L2luYy93bWl4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjNzkzNAotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9pbmMvd21peC5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBleHRlbnNpb25zIG9mIHRoZSBXTUkgcHJvdG9jb2wgc3BlY2lmaWVkIGluIHRoZQorICogV2lyZWxlc3MgTW9kdWxlIEludGVyZmFjZSAoV01JKS4gIEl0IGluY2x1ZGVzIGRlZmluaXRpb25zIG9mIGFsbAorICogZXh0ZW5kZWQgY29tbWFuZHMgYW5kIGV2ZW50cy4gIEV4dGVuc2lvbnMgaW5jbHVkZSB1c2VmdWwgY29tbWFuZHMKKyAqIHRoYXQgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIHdpcmVsZXNzIGFjdGl2aXRpZXMuICBUaGV5IG1heQorICogYmUgaGFyZHdhcmUtc3BlY2lmaWMsIGFuZCB0aGV5IG1pZ2h0IG5vdCBiZSBzdXBwb3J0ZWQgb24gYWxsCisgKiBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogRXh0ZW5kZWQgV01JWCBjb21tYW5kcyBhcmUgZW5jYXBzdWxhdGVkIGluIGEgV01JIG1lc3NhZ2Ugd2l0aAorICogY21kPVdNSV9FWFRFTlNJT05fQ01ELgorICovCisKKyNpZm5kZWYgX1dNSVhfSF8KKyNkZWZpbmUgX1dNSVhfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogRXh0ZW5kZWQgV01JIGNvbW1hbmRzIGFyZSB0aG9zZSB0aGF0IGFyZSBuZWVkZWQgZHVyaW5nIHdpcmVsZXNzCisgKiBvcGVyYXRpb24sIGJ1dCB3aGljaCBhcmUgbm90IHJlYWxseSB3aXJlbGVzcyBjb21tYW5kcy4gIFRoaXMgYWxsb3dzLAorICogZm9yIGluc3RhbmNlLCBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kcy4gIEV4dGVuZGVkIFdNSSBjb21tYW5kcyBhcmUKKyAqIGVtYmVkZGVkIGluIGEgV01JIGNvbW1hbmQgbWVzc2FnZSB3aXRoIFdNSV9DT01NQU5EX0lEPVdNSV9FWFRFTlNJT05fQ01ESUQuCisgKiBFeHRlbmRlZCBXTUkgZXZlbnRzIGFyZSBzaW1pbGFybHkgZW1iZWRkZWQgaW4gYSBXTUkgZXZlbnQgbWVzc2FnZSB3aXRoCisgKiBXTUlfRVZFTlRfSUQ9V01JX0VYVEVOU0lPTl9FVkVOVElELgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgY29tbWFuZElkOworfSBQT1NUUEFDSyBXTUlYX0NNRF9IRFI7CisKK3R5cGVkZWYgZW51bSB7CisJV01JWF9EU0VUT1BFTl9SRVBMWV9DTURJRCA9IDB4MjAwMSwKKwlXTUlYX0RTRVREQVRBX1JFUExZX0NNRElELAorCVdNSVhfSEJfQ0hBTExFTkdFX1JFU1BfQ01ESUQsCisJV01JWF9EQkdMT0dfQ0ZHX01PRFVMRV9DTURJRCwKKwlXTUlYX1BST0ZfQ0ZHX0NNRElELCAgICAgICAgICAgIC8qIDB4MjAwYSAqLworCVdNSVhfUFJPRl9BRERSX1NFVF9DTURJRCwKKwlXTUlYX1BST0ZfU1RBUlRfQ01ESUQsCisJV01JWF9QUk9GX1NUT1BfQ01ESUQsCisJV01JWF9QUk9GX0NPVU5UX0dFVF9DTURJRCwKK30gV01JWF9DT01NQU5EX0lEOworCit0eXBlZGVmIGVudW0geworCVdNSVhfRFNFVE9QRU5SRVFfRVZFTlRJRCA9IDB4MzAwMSwKKwlXTUlYX0RTRVRDTE9TRV9FVkVOVElELAorCVdNSVhfRFNFVERBVEFSRVFfRVZFTlRJRCwKKwlXTUlYX0hCX0NIQUxMRU5HRV9SRVNQX0VWRU5USUQsCisJV01JWF9EQkdMT0dfRVZFTlRJRCwKKwlXTUlYX1BST0ZfQ09VTlRfRVZFTlRJRCwKKwlXTUlYX1BLVExPR19FVkVOVElELAorfSBXTUlYX0VWRU5UX0lEOworCisvKgorICogPT09PT09PT09PT09PURhdGFTZXQgc3VwcG9ydD09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqIFdNSVhfRFNFVE9QRU5SRVFfRVZFTlRJRAorICogRGF0YVNldCBPcGVuIFJlcXVlc3QgRXZlbnQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIGRzZXRfaWQ7CisJQV9VSU5UMzIgdGFyZ19kc2V0X2hhbmRsZTsgICAgICAgICAgICAgIC8qIGVjaG8nZWQsIG5vdCB1c2VkIGJ5IEhvc3QsICovCisJQV9VSU5UMzIgdGFyZ19yZXBseV9mbjsgICAgICAgICAvKiBlY2hvJ2VkLCBub3QgdXNlZCBieSBIb3N0LCAqLworCUFfVUlOVDMyIHRhcmdfcmVwbHlfYXJnOyAgICAgICAgICAgICAgICAvKiBlY2hvJ2VkLCBub3QgdXNlZCBieSBIb3N0LCAqLworfSBQT1NUUEFDSyBXTUlYX0RTRVRPUEVOUkVRX0VWRU5UOworCisvKgorICogV01JWF9EU0VUQ0xPU0VfRVZFTlRJRAorICogRGF0YVNldCBDbG9zZSBFdmVudAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgYWNjZXNzX2Nvb2tpZTsKK30gUE9TVFBBQ0sgV01JWF9EU0VUQ0xPU0VfRVZFTlQ7CisKKy8qCisgKiBXTUlYX0RTRVREQVRBUkVRX0VWRU5USUQKKyAqIERhdGFTZXQgRGF0YSBSZXF1ZXN0IEV2ZW50CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBX1VJTlQzMiBhY2Nlc3NfY29va2llOworCUFfVUlOVDMyIG9mZnNldDsKKwlBX1VJTlQzMiBsZW5ndGg7CisJQV9VSU5UMzIgdGFyZ19idWY7ICAgICAgICAgICAgICAvKiBlY2hvJ2VkLCBub3QgdXNlZCBieSBIb3N0LCAqLworCUFfVUlOVDMyIHRhcmdfcmVwbHlfZm47ICAgICAgICAgLyogZWNobydlZCwgbm90IHVzZWQgYnkgSG9zdCwgKi8KKwlBX1VJTlQzMiB0YXJnX3JlcGx5X2FyZzsgICAgICAgICAgICAgICAgLyogZWNobydlZCwgbm90IHVzZWQgYnkgSG9zdCwgKi8KK30gV01JWF9EU0VUREFUQVJFUV9FVkVOVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIHN0YXR1czsKKwlBX1VJTlQzMiB0YXJnX2RzZXRfaGFuZGxlOworCUFfVUlOVDMyIHRhcmdfcmVwbHlfZm47CisJQV9VSU5UMzIgdGFyZ19yZXBseV9hcmc7CisJQV9VSU5UMzIgYWNjZXNzX2Nvb2tpZTsKKwlBX1VJTlQzMiBzaXplOworCUFfVUlOVDMyIHZlcnNpb247Cit9IFdNSVhfRFNFVE9QRU5fUkVQTFlfQ01EOworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgc3RhdHVzOworCUFfVUlOVDMyIHRhcmdfYnVmOworCUFfVUlOVDMyIHRhcmdfcmVwbHlfZm47CisJQV9VSU5UMzIgdGFyZ19yZXBseV9hcmc7CisJQV9VSU5UMzIgbGVuZ3RoOworCUFfVUlOVDggYnVmWzFdOworfSBXTUlYX0RTRVREQVRBX1JFUExZX0NNRDsKKworLyoKKyAqID09PT09PT09PT09PT1FcnJvciBEZXRlY3Rpb24gc3VwcG9ydD09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqIFdNSVhfSEJfQ0hBTExFTkdFX1JFU1BfQ01ESUQKKyAqIEhlYXJ0YmVhdCBDaGFsbGVuZ2UgUmVzcG9uc2UgY29tbWFuZAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgY29va2llOworCUFfVUlOVDMyIHNvdXJjZTsKK30gV01JWF9IQl9DSEFMTEVOR0VfUkVTUF9DTUQ7CisKKy8qCisgKiBXTUlYX0hCX0NIQUxMRU5HRV9SRVNQX0VWRU5USUQKKyAqIEhlYXJ0YmVhdCBDaGFsbGVuZ2UgUmVzcG9uc2UgRXZlbnQKKyAqLworI2RlZmluZSBXTUlYX0hCX0NIQUxMRU5HRV9SRVNQX0VWRU5UIFdNSVhfSEJfQ0hBTExFTkdFX1JFU1BfQ01ECisKKy8qCisgKiA9PT09PT09PT09PT09VGFyZ2V0IFByb2ZpbGluZyBzdXBwb3J0PT09PT09PT09PT09PT09PT0KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgcGVyaW9kOyAgICAgICAgICAgICAgICAvKiBUaW1lIChpbiAzMC41dXMgdGlja3MpIGJldHdlZW4gc2FtcGxlcyAqLworCUFfVUlOVDMyIG5iaW5zOworfSBXTUlYX1BST0ZfQ0ZHX0NNRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIGFkZHI7Cit9IFdNSVhfUFJPRl9BRERSX1NFVF9DTUQ7CisKKy8qCisgKiBUYXJnZXQgcmVzcG9uZHMgdG8gSG9zdHMncyBlYXJsaWVyIFdNSVhfUFJPRl9DT1VOVF9HRVRfQ01ESUQgcmVxdWVzdAorICogdXNpbmcgYSBXTUlYX1BST0ZfQ09VTlRfRVZFTlQgd2l0aAorICogICBhZGRyIHNldCB0byB0aGUgbmV4dCBhZGRyZXNzCisgKiAgIGNvdW50IHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb3VudAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQV9VSU5UMzIgYWRkcjsKKwlBX1VJTlQzMiBjb3VudDsKK30gV01JWF9QUk9GX0NPVU5UX0VWRU5UOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9XTUlYX0hfICovCmRpZmYgLS1naXQgYS91YXBpL2xpbnV4L2FfZGVidWcuaCBiL3VhcGkvbGludXgvYV9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTMxMDYKLS0tIC9kZXYvbnVsbAorKysgYi91YXBpL2xpbnV4L2FfZGVidWcuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQV9ERUJVR19IXworI2RlZmluZSBfQV9ERUJVR19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlIDxhX3R5cGVzLmg+CisjaW5jbHVkZSAib3NhcGlfbGludXguaCIKKworLyogc3RhbmRhcmQgZGVidWcgcHJpbnQgbWFza3MgYml0cyAwLi43ICovCisjZGVmaW5lIEFUSF9ERUJVR19FUlIgICAoMSA8PCAwKSAgICAgICAgLyogZXJyb3JzICovCisjZGVmaW5lIEFUSF9ERUJVR19XQVJOICAoMSA8PCAxKSAgICAgICAgLyogd2FybmluZ3MgKi8KKyNkZWZpbmUgQVRIX0RFQlVHX0lORk8gICgxIDw8IDIpICAgICAgICAvKiBpbmZvcm1hdGlvbmFsIChtb2R1bGUgc3RhcnR1cCBpbmZvKSAqLworI2RlZmluZSBBVEhfREVCVUdfVFJDICAgKDEgPDwgMykgICAgICAgIC8qIGdlbmVyaWMgZnVuY3Rpb24gY2FsbCB0cmFjaW5nICovCisjZGVmaW5lIEFUSF9ERUJVR19SU1ZEMSAoMSA8PCA0KQorI2RlZmluZSBBVEhfREVCVUdfUlNWRDIgKDEgPDwgNSkKKyNkZWZpbmUgQVRIX0RFQlVHX1JTVkQzICgxIDw8IDYpCisjZGVmaW5lIEFUSF9ERUJVR19SU1ZENCAoMSA8PCA3KQorCisjZGVmaW5lIEFUSF9ERUJVR19NQVNLX0RFRkFVTFRTICAoQVRIX0RFQlVHX0VSUiB8IEFUSF9ERUJVR19XQVJOKQorI2RlZmluZSBBVEhfREVCVUdfQU5ZICAweEZGRkYKKworLyogb3RoZXIgYWxpYXNlcyB1c2VkIHRocm91Z2hvdXQgKi8KKyNkZWZpbmUgQVRIX0RFQlVHX0VSUk9SICAgQVRIX0RFQlVHX0VSUgorI2RlZmluZSBBVEhfTE9HX0VSUiAgICAgICBBVEhfREVCVUdfRVJSCisjZGVmaW5lIEFUSF9MT0dfSU5GICAgICAgIEFUSF9ERUJVR19JTkZPCisjZGVmaW5lIEFUSF9MT0dfVFJDICAgICAgIEFUSF9ERUJVR19UUkMKKyNkZWZpbmUgQVRIX0RFQlVHX1RSQUNFICAgQVRIX0RFQlVHX1RSQworI2RlZmluZSBBVEhfREVCVUdfSU5JVCAgICBBVEhfREVCVUdfSU5GTworCisvKiBiaXRzIDguLjMxIGFyZSBtb2R1bGUtc3BlY2lmaWMgbWFza3MgKi8KKyNkZWZpbmUgQVRIX0RFQlVHX01PRFVMRV9NQVNLX1NISUZUICAgOAorCisvKiBtYWNybyB0byBtYWtlIGEgbW9kdWxlLXNwZWNpZmljIG1hc2tzICovCisjZGVmaW5lIEFUSF9ERUJVR19NQUtFX01PRFVMRV9NQVNLKGluZGV4KSAgKDEgPDwgKEFUSF9ERUJVR19NT0RVTEVfTUFTS19TSElGVCArIChpbmRleCkpKQorCit2b2lkIGRlYnVnX2R1bXBfYnl0ZXMoQV9VQ0hBUiAqYnVmZmVyLCBBX1VJTlQxNiBsZW5ndGgsCisJCSAgICAgIGNoYXIgKnBEZXNjcmlwdGlvbik7CisKKy8qIERlYnVnIHN1cHBvcnQgb24gYSBwZXItbW9kdWxlIGJhc2lzCisgKgorICogVXNhZ2U6CisgKgorICogICBFYWNoIG1vZHVsZSBjYW4gdXRpbGl6ZSBpdCdzIG93biBkZWJ1ZyBtYXNrIHZhcmlhYmxlLiAgQSBzZXQgb2YgY29tbW9ubHkgdXNlZAorICogICBtYXNrcyBhcmUgcHJvdmlkZWQgKEVSUk9SUywgV0FSTklOR1MsIFRSQUNFIGV0Yy4uKS4gIEl0IGlzIHVwIHRvIGVhY2ggbW9kdWxlCisgKiAgIHRvIGRlZmluZSBtb2R1bGUtc3BlY2lmaWMgbWFza3MgdXNpbmcgdGhlIG1hY3JvcyBhYm92ZS4KKyAqCisgKiAgIEVhY2ggbW9kdWxlIGRlZmluZXMgYSBzaW5nbGUgZGVidWcgbWFzayB2YXJpYWJsZSBkZWJ1Z19YWFggd2hlcmUgdGhlICJuYW1lIiBvZiB0aGUgbW9kdWxlIGlzCisgKiAgIGNvbW1vbiB0byBhbGwgQy1maWxlcyB3aXRoaW4gdGhhdCBtb2R1bGUuICBUaGlzIHJlcXVpcmVzIGV2ZXJ5IEMtZmlsZSB0aGF0IGluY2x1ZGVzIGFfZGVidWcuaAorICogICB0byBkZWZpbmUgdGhlIG1vZHVsZSBuYW1lIGluIHRoYXQgZmlsZS4KKyAqCisgKiAgIEV4YW1wbGU6CisgKgorICogICAjZGVmaW5lIEFUSF9NT0RVTEVfTkFNRSBodGMKKyAqICAgI2luY2x1ZGUgImFfZGVidWcuaCIKKyAqCisgKiAgIFRoaXMgd2lsbCBkZWZpbmUgYSBkZWJ1ZyBtYXNrIHN0cnVjdHVyZSBjYWxsZWQgZGVidWdfaHRjIGFuZCBhbGwgZGVidWcgbWFjcm9zIHdpbGwgcmVmZXJlbmNlIHRoaXMKKyAqICAgdmFyaWFibGUuCisgKgorICogICBBIG1vZHVsZSBjYW4gZGVmaW5lIG1vZHVsZS1zcGVjaWZpYyBiaXQgbWFza3MgdXNpbmcgdGhlIEFUSF9ERUJVR19NQUtFX01PRFVMRV9NQVNLKCkgbWFjcm86CisgKgorICogICAgICAjZGVmaW5lIEFUSF9ERUJVR19NWV9NQVNLMSAgQVRIX0RFQlVHX01BS0VfTU9EVUxFX01BU0soMCkKKyAqICAgICAgI2RlZmluZSBBVEhfREVCVUdfTVlfTUFTSzIgIEFUSF9ERUJVR19NQUtFX01PRFVMRV9NQVNLKDEpCisgKgorICogICBUaGUgaW5zdGFudGlhdGlvbiBvZiB0aGUgZGVidWcgc3RydWN0dXJlIHNob3VsZCBiZSBtYWRlIGJ5IHRoZSBtb2R1bGUuICBXaGVuIGEgbW9kdWxlIGlzCisgKiAgIGluc3RhbnRpYXRlZCwgdGhlIG1vZHVsZSBjYW4gc2V0IGEgZGVzY3JpcHRpb24gc3RyaW5nLCBhIGRlZmF1bHQgbWFzayBhbmQgYW4gYXJyYXkgb2YgZGVzY3JpcHRpb24KKyAqICAgZW50cmllcyBjb250YWluaW5nIGluZm9ybWF0aW9uIG9uIGVhY2ggbW9kdWxlLWRlZmluZWQgZGVidWcgbWFzay4KKyAqICAgTk9URTogVGhlIGluc3RhbnRpYXRpb24gaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQsIG9ubHkgb25lIGluc3RhbmNlIGNhbiBleGlzdCBwZXIgbW9kdWxlLgorICoKKyAqICAgRXhhbXBsZToKKyAqCisgKgorICogICAjZGVmaW5lIEFUSF9ERUJVR19CTUkgIEFUSF9ERUJVR19NQUtFX01PRFVMRV9NQVNLKDApCisgKgorICogICAjaWZkZWYgREVCVUcKKyAqICAgc3RhdGljIEFUSF9ERUJVR19NQVNLX0RFU0NSSVBUSU9OIGJtaV9kZWJ1Z19kZXNjW10gPSB7CisgKiAgICAgICB7IEFUSF9ERUJVR19CTUkgLCAiQk1JIFRyYWNpbmcifSwgICA8PT0gZGVzY3JpcHRpb24gb2YgdGhlIG1vZHVsZSBzcGVjaWZpYyBtYXNrCisgKiAgIH07CisgKgorICogICBBVEhfREVCVUdfSU5TVEFOVElBVEVfTU9EVUxFX1ZBUihibWksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibWkiICA8PT0gbW9kdWxlIG5hbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvb3QgTWFuYWdlciBJbnRlcmZhY2UiLCAgPD09IGRlc2NyaXB0aW9uIG9mIG1vZHVsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVEhfREVCVUdfTUFTS19ERUZBVUxUUywgICAgICAgICAgPD09IGRlZmF1bHRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUSF9ERUJVR19ERVNDUklQVElPTl9DT1VOVChibWlfZGVidWdfZGVzYyksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtaV9kZWJ1Z19kZXNjKTsKKyAqCisgKiAgICNlbmRpZgorICoKKyAqICBBIG1vZHVsZSBjYW4gb3B0aW9uYWxseSByZWdpc3RlciBpdCdzIGRlYnVnIG1vZHVsZSBpbmZvcm1hdGlvbiBpbiBvcmRlciBmb3Igb3RoZXIgdG9vbHMgdG8gY2hhbmdlIHRoZQorICogIGJpdCBtYXNrIGF0IHJ1bnRpbWUuICBBIG1vZHVsZSBjYW4gY2FsbCAgQV9SRUdJU1RFUl9NT0RVTEVfREVCVUdfSU5GTygpIGluIGl0J3MgbW9kdWxlCisgKiAgaW5pdCBjb2RlLiAgVGhpcyBtYWNybyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgY29uc2VxdWVuY2UuICBUaGUgZGVidWcgaW5mbyBtYWludGFpbnMKKyAqICBzdGF0ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpbmZvcm1hdGlvbiB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkLgorICoKKyAqICovCisKKyNkZWZpbmUgQVRIX0RFQlVHX01BWF9NQVNLX0RFU0NfTEVOR1RIICAgMzIKKyNkZWZpbmUgQVRIX0RFQlVHX01BWF9NT0RfREVTQ19MRU5HVEggICAgNjQKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFfVUlOVDMyIE1hc2s7CisJQV9DSEFSIERlc2NyaXB0aW9uW0FUSF9ERUJVR19NQVhfTUFTS19ERVNDX0xFTkdUSF07Cit9IEFUSF9ERUJVR19NQVNLX0RFU0NSSVBUSU9OOworCisjZGVmaW5lIEFUSF9ERUJVR19JTkZPX0ZMQUdTX1JFR0lTVEVSRUQgKDEgPDwgMCkKKwordHlwZWRlZiBzdHJ1Y3QgX0FUSF9ERUJVR19NT0RVTEVfREJHX0lORk8geworCXN0cnVjdCBfQVRIX0RFQlVHX01PRFVMRV9EQkdfSU5GTyAqcE5leHQ7CisJQV9DSEFSIE1vZHVsZU5hbWVbMTZdOworCUFfQ0hBUiBNb2R1bGVEZXNjcmlwdGlvbltBVEhfREVCVUdfTUFYX01PRF9ERVNDX0xFTkdUSF07CisJQV9VSU5UMzIgRmxhZ3M7CisJQV9VSU5UMzIgQ3VycmVudE1hc2s7CisJaW50IE1heERlc2NyaXB0aW9uczsKKwlBVEhfREVCVUdfTUFTS19ERVNDUklQVElPTiAqcE1hc2tEZXNjcmlwdGlvbnM7ICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYXJyYXkgb2YgZGVzY3JpcHRpb25zICovCit9IEFUSF9ERUJVR19NT0RVTEVfREJHX0lORk87CisKKyNkZWZpbmUgQVRIX0RFQlVHX0RFU0NSSVBUSU9OX0NPVU5UKGQpICAoaW50KSgoc2l6ZW9mKChkKSkpIC8gKHNpemVvZihBVEhfREVCVUdfTUFTS19ERVNDUklQVElPTikpKQorCisjZGVmaW5lIEdFVF9BVEhfTU9EVUxFX0RFQlVHX1ZBUl9OQU1FKHMpIF9YR0VUX0FUSF9NT0RVTEVfTkFNRV9ERUJVR18ocykKKyNkZWZpbmUgR0VUX0FUSF9NT0RVTEVfREVCVUdfVkFSX01BU0socykgX1hHRVRfQVRIX01PRFVMRV9OQU1FX0RFQlVHXyhzKS5DdXJyZW50TWFzaworI2RlZmluZSBfWEdFVF9BVEhfTU9EVUxFX05BTUVfREVCVUdfKHMpIGRlYnVnXyAjIyBzCisKKyNpZmRlZiBERUJVRworCisvKiBmb3Igc291cmNlIGZpbGVzIHRoYXQgd2lsbCBpbnN0YW50aWF0ZSB0aGUgZGVidWcgdmFyaWFibGVzICovCisjZGVmaW5lIEFUSF9ERUJVR19JTlNUQU5USUFURV9NT0RVTEVfVkFSKHMsbmFtZSxtb2RkZXNjLGluaXRtYXNrLGNvdW50LGRlc2NyaXB0aW9ucykgXAorCUFUSF9ERUJVR19NT0RVTEVfREJHX0lORk8gR0VUX0FUSF9NT0RVTEVfREVCVUdfVkFSX05BTUUocykgPSBcCisJe05VTEwsKG5hbWUpLChtb2RkZXNjKSwwLChpbml0bWFzayksY291bnQsKGRlc2NyaXB0aW9ucyl9CisKKyNpZmRlZiBBVEhfTU9EVUxFX05BTUUKK2V4dGVybiBBVEhfREVCVUdfTU9EVUxFX0RCR19JTkZPCitHRVRfQVRIX01PRFVMRV9ERUJVR19WQVJfTkFNRShBVEhfTU9EVUxFX05BTUUpOworI2RlZmluZSBBUl9ERUJVR19MVkxfQ0hFQ0sobHZsKSAoR0VUX0FUSF9NT0RVTEVfREVCVUdfVkFSX01BU0soQVRIX01PRFVMRV9OQU1FKSAmIChsdmwpKQorI2VuZGlmIC8qIEFUSF9NT0RVTEVfTkFNRSAqLworCisjZGVmaW5lIEFUSF9ERUJVR19TRVRfREVCVUdfTUFTSyhzLGx2bCkgR0VUX0FUSF9NT0RVTEVfREVCVUdfVkFSX01BU0socykgPSAobHZsKQorCisjZGVmaW5lIEFUSF9ERUJVR19ERUNMQVJFX0VYVEVSTihzKSBcCisJZXh0ZXJuIEFUSF9ERUJVR19NT0RVTEVfREJHX0lORk8gR0VUX0FUSF9NT0RVTEVfREVCVUdfVkFSX05BTUUocykKKworI2RlZmluZSBBUl9ERUJVR19QUklOVEJVRihidWZmZXIsIGxlbmd0aCwgZGVzYykgZGVidWdfZHVtcF9ieXRlcyhidWZmZXIsbGVuZ3RoLGRlc2MpCisKKyNkZWZpbmUgQVJfREVCVUdfQVNTRVJUIEFfQVNTRVJUCisKK3ZvaWQgYV9kdW1wX21vZHVsZV9kZWJ1Z19pbmZvKEFUSF9ERUJVR19NT0RVTEVfREJHX0lORk8gKnBJbmZvKTsKK3ZvaWQgYV9yZWdpc3Rlcl9tb2R1bGVfZGVidWdfaW5mbyhBVEhfREVCVUdfTU9EVUxFX0RCR19JTkZPICpwSW5mbyk7CisjaWZkZWYgQV9TSU1PU19ERVZIT1NUCisjZGVmaW5lIEFfRFVNUF9NT0RVTEVfREVCVUdfSU5GTyhzKSBhX2R1bXBfbW9kdWxlX2RlYnVnX2luZm8oJihHRVRfQVRIX01PRFVMRV9ERUJVR19WQVJfTkFNRShzKSkpCisjZGVmaW5lIEFfUkVHSVNURVJfTU9EVUxFX0RFQlVHX0lORk8ocykgYV9yZWdpc3Rlcl9tb2R1bGVfZGVidWdfaW5mbygmKEdFVF9BVEhfTU9EVUxFX0RFQlVHX1ZBUl9OQU1FKHMpKSkKKyNlbHNlCisjZGVmaW5lIEFfRFVNUF9NT0RVTEVfREVCVUdfSU5GTyhzKQorI2RlZmluZSBBX1JFR0lTVEVSX01PRFVMRV9ERUJVR19JTkZPKHMpCisjZW5kaWYKKworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhREVCVUcgKi8KKy8qIE5PTiBERUJVRyAqLworI2RlZmluZSBBVEhfREVCVUdfSU5TVEFOVElBVEVfTU9EVUxFX1ZBUihzLG5hbWUsbW9kZGVzYyxpbml0bWFzayxjb3VudCxkZXNjcmlwdGlvbnMpCisjZGVmaW5lIEFSX0RFQlVHX0xWTF9DSEVDSyhsdmwpIDAKKyNkZWZpbmUgQVJfREVCVUdfUFJJTlRCVUYoYnVmZmVyLCBsZW5ndGgsIGRlc2MpCisjZGVmaW5lIEFSX0RFQlVHX0FTU0VSVCh0ZXN0KQorI2RlZmluZSBBVEhfREVCVUdfREVDTEFSRV9FWFRFUk4ocykKKyNkZWZpbmUgQVRIX0RFQlVHX1NFVF9ERUJVR19NQVNLKHMsbHZsKQorI2RlZmluZSBBX0RVTVBfTU9EVUxFX0RFQlVHX0lORk8ocykKKyNkZWZpbmUgQV9SRUdJU1RFUl9NT0RVTEVfREVCVUdfSU5GTyhzKQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiAhZGVmaW5lZChMSU5VWF9FTVVMQVRJT04pCisjaW5jbHVkZSAiZGVidWdfbGludXguaCIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS91YXBpL2xpbnV4L2FfdHlwZXMuaCBiL3VhcGkvbGludXgvYV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0N2Y0YTgKLS0tIC9kZXYvbnVsbAorKysgYi91YXBpL2xpbnV4L2FfdHlwZXMuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKiBkZXBvdC9zdy9xY2FfbWFpbi9wZXJmX3B3cl9vZmZsb2FkL2RyaXZlcnMvaG9zdC9pbmNsdWRlL2FfdHlwZXMuaCM3IC0gaW50ZWdyYXRlIGNoYW5nZSAxMzI3NjM3IChrdGV4dCkgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYmFzaWMgYXRoZXJvcyBkYXRhIHR5cGVzLiAqLworLyogSXQgaXMgdXNlZCB0byBtYXAgdGhlIGRhdGEgdHlwZXMgaW4gYXRoZXJvcyBmaWxlcyB0byBhIHBsYXRmb3JtIHNwZWNpZmljICovCisvKiB0eXBlLiAqLworLyogKi8KKy8qIEF1dGhvcihzKTogPSJBdGhlcm9zIiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgX0FfVFlQRVNfSF8KKyNkZWZpbmUgX0FfVFlQRVNfSF8KKyNpbmNsdWRlIDxhdGhkZWZzLmg+CisKK3R5cGVkZWYgdW5zaWduZWQgaW50IEFfVUlOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQV9VSU5UNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEFfVUlOVDE2OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEFfVUlOVDg7Cit0eXBlZGVmIGludCBBX0lOVDMyOwordHlwZWRlZiBzaG9ydCBBX0lOVDE2OwordHlwZWRlZiBjaGFyIEFfSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBBX1VDSEFSOwordHlwZWRlZiBjaGFyIEFfQ0hBUjsKK3R5cGVkZWYgX0Jvb2wgQV9CT09MOworCisjZW5kaWYgLyogX0FUSFRZUEVTX0hfICovCmRpZmYgLS1naXQgYS91YXBpL2xpbnV4L2F0aHN0YXJ0cGFjay5oIGIvdWFwaS9saW51eC9hdGhzdGFydHBhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmMwNTFlCi0tLSAvZGV2L251bGwKKysrIGIvdWFwaS9saW51eC9hdGhzdGFydHBhY2suaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9BVEhTVEFSVFBBQ0tfSAorI2RlZmluZSBfQVRIU1RBUlRQQUNLX0gKKworI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoX19saW51eF9fKQorI2luY2x1ZGUgIm9zYXBpX2xpbnV4LmgiCisjZW5kaWYgLyogTElOVVggKi8KKworI2lmZGVmIFFOWAorI2VuZGlmIC8qIFFOWCAqLworCisjaWYgX19MT05HX01BWF9fID09IF9fSU5UX01BWF9fCisvKiAzMi1iaXQgY29tcGlsYXRpb24gKi8KKyNkZWZpbmUgUFJFUEFDSzY0CisjZGVmaW5lIFBPU1RQQUNLNjQKKyNlbHNlCisvKiA2NC1iaXQgY29tcGlsYXRpb24gKi8KKyNkZWZpbmUgUFJFUEFDSzY0IFBSRVBBQ0sKKyNkZWZpbmUgUE9TVFBBQ0s2NCBQT1NUUEFDSworI2VuZGlmCisKKyNlbmRpZiAvKiBfQVRIU1RBUlRQQUNLX0ggKi8KZGlmZiAtLWdpdCBhL3VhcGkvbGludXgvZGJnbG9nX2NvbW1vbi5oIGIvdWFwaS9saW51eC9kYmdsb2dfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUyODYyZgotLS0gL2Rldi9udWxsCisrKyBiL3VhcGkvbGludXgvZGJnbG9nX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0LTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9EQkdMT0dfQ09NTU9OX0hfCisjZGVmaW5lIF9EQkdMT0dfQ09NTU9OX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgImRiZ2xvZ19pZC5oIgorI2luY2x1ZGUgImRiZ2xvZy5oIgorCisjZGVmaW5lIE1BWF9EQkdfTVNHUyAyNTYKKworI2RlZmluZSBBVEg2S0xfRldMT0dfUEFZTE9BRF9TSVpFICAgICAgICAgICAgICAxNTAwCisKKyNkZWZpbmUgREJHTE9HX1BSSU5UX1BSRUZJWCAiRldMT0c6ICIKKworLyogSGFuZHkgTWFjcm9zIHRvIHJlYWQgZGF0YSBsZW5ndGggYW5kIHR5cGUgZnJvbSBGVyAqLworI2RlZmluZSBXTEFOX0RJQUdfMF9UWVBFX1MgICAgICAgICAgMAorI2RlZmluZSBXTEFOX0RJQUdfMF9UWVBFICAgICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBXTEFOX0RJQUdfMF9UWVBFX0dFVCh4KSAgICAgV01JX0ZfTVMoeCwgV0xBTl9ESUFHXzBfVFlQRSkKKyNkZWZpbmUgV0xBTl9ESUFHXzBfVFlQRV9TRVQoeCwgeSkgIFdNSV9GX1JNVyh4LCB5LCBXTEFOX0RJQUdfMF9UWVBFKQorLyogYml0cyA4LTE1IHJlc2VydmVkICovCisKKy8qIGxlbmd0aCBpbmNsdWRlcyB0aGUgc2l6ZSBvZiB3bGFuX2RpYWdfZGF0YSAqLworI2RlZmluZSBXTEFOX0RJQUdfMF9MRU5fUyAgICAgICAgICAgMTYKKyNkZWZpbmUgV0xBTl9ESUFHXzBfTEVOICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgV0xBTl9ESUFHXzBfTEVOX0dFVCh4KSAgICAgIFdNSV9GX01TKHgsIFdMQU5fRElBR18wX0xFTikKKyNkZWZpbmUgV0xBTl9ESUFHXzBfTEVOX1NFVCh4LCB5KSAgIFdNSV9GX1JNVyh4LCB5LCBXTEFOX0RJQUdfMF9MRU4pCisKKyNkZWZpbmUgQ05TU19ESUFHX1NMRUVQX0lOVEVSVkFMICAgIDUgICAvKiBJbiBzZWNzICovCisKKyNkZWZpbmUgQVRINktMX0ZXTE9HX01BWF9FTlRSSUVTICAgMjAKKyNkZWZpbmUgQVRINktMX0ZXTE9HX1BBWUxPQURfU0laRSAgMTUwMAorCisjZGVmaW5lIERJQUdfV0xBTl9EUklWRVJfVU5MT0FERUQgNgorI2RlZmluZSBESUFHX1dMQU5fRFJJVkVSX0xPQURFRCAgIDcKKyNkZWZpbmUgRElBR19UWVBFX0xPR1MgICAxCisjZGVmaW5lIERJQUdfVFlQRV9FVkVOVFMgMgorCit0eXBlZGVmIGVudW0geworCURCR0xPR19QUk9DRVNTX0RFRkFVTFQgPSAwLAorCURCR0xPR19QUk9DRVNTX1BSSU5UX1JBVywgICAgICAgLyogcHJpbnQgdGhlbSBpbiBkZWJ1ZyB2aWV3ICovCisJREJHTE9HX1BST0NFU1NfUE9PTF9SQVcsICAgICAgICAvKiB1c2VyIGJ1ZmZlciBwb29sIHRvIHNhdmUgdGhlbSAqLworCURCR0xPR19QUk9DRVNTX05FVF9SQVcsICAgICAgICAgLyogdXNlciBidWZmZXIgcG9vbCB0byBzYXZlIHRoZW0gKi8KKwlEQkdMT0dfUFJPQ0VTU19NQVgsCit9IGRiZ2xvZ19wcm9jZXNzX3Q7CisKK2VudW0gY25zc19kaWFnX3R5cGUgeworCURJQUdfVFlQRV9GV19FVkVOVCwgICAgICAgICAgIC8qIHNlbmQgZncgZXZlbnQtIHRvIGRpYWcgKi8KKwlESUFHX1RZUEVfRldfTE9HLCAgICAgICAgICAgICAvKiBzZW5kIGxvZyBldmVudC0gdG8gZGlhZyAqLworCURJQUdfVFlQRV9GV19ERUJVR19NU0csICAgICAgIC8qIHNlbmQgZGJnIG1lc3NhZ2UtIHRvIGRpYWcgKi8KKwlESUFHX1RZUEVfSU5JVF9SRVEsICAgICAgICAgICAvKiBjbnNzX2RpYWcgaW5pdGlhbGl6YXRpb24tIGZyb20gZGlhZyAqLworCURJQUdfVFlQRV9GV19NU0csICAgICAgICAgICAgIC8qIGZ3IG1zZyBjb21tYW5kLXRvIGRpYWcgKi8KKwlESUFHX1RZUEVfSE9TVF9NU0csICAgICAgICAgICAvKiBob3N0IGNvbW1hbmQtdG8gZGlhZyAqLworCURJQUdfVFlQRV9DUkFTSF9JTkpFQ1QsICAgICAgIC8qY3Jhc2ggaW5qZWN0LWZyb20gZGlhZyAqLworCURJQUdfVFlQRV9EQkdfTEVWRUwsICAgICAgICAgIC8qIERCRyBMRVZFTC1mcm9tIGRpYWcgKi8KK307CisKK2VudW0gd2xhbl9kaWFnX2NvbmZpZ190eXBlIHsKKwlESUFHX1ZFUlNJT05fSU5GTywKK307CisKK2VudW0gd2xhbl9kaWFnX2ZyYW1lX3R5cGUgeworCVdMQU5fRElBR19UWVBFX0NPTkZJRywKKwlXTEFOX0RJQUdfVFlQRV9FVkVOVCwKKwlXTEFOX0RJQUdfVFlQRV9MT0csCisJV0xBTl9ESUFHX1RZUEVfTVNHLAorCVdMQU5fRElBR19UWVBFX0xFR0FDWV9NU0csCit9OworCisvKiBsb2cvZXZlbnQgYXJlIGFsd2F5cyAzMi1iaXQgYWxpZ25lZC4gUGFkZGluZyBpcyBpbnNlcnRlZCBhZnRlcgorICogb3B0aW9uYWwgcGF5bG9hZCB0byBzYXRpc2lmeSB0aGlzIHJlcXVpcmVtZW50ICovCitzdHJ1Y3Qgd2xhbl9kaWFnX2RhdGEgeworCXVuc2lnbmVkIGludCB3b3JkMDsgICAgICAgICAgICAgLyogdHlwZSwgbGVuZ3RoICovCisJdW5zaWduZWQgaW50IHRhcmdldF90aW1lOworCXVuc2lnbmVkIGludCBjb2RlOyAgICAgICAgICAgICAgLyogRGlhZyBsb2cgb3IgZXZlbnQgQ29kZSAqLworCXVpbnQ4X3QgcGF5bG9hZFswXTsKK307CisKK3N0cnVjdCBkYmdsb2dfc2xvdCB7CisJdW5zaWduZWQgaW50IGRpYWdfdHlwZTsKKwl1bnNpZ25lZCBpbnQgdGltZXN0YW1wOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJdW5zaWduZWQgaW50IGRyb3BwZWQ7CisJLyogbWF4IEFUSDZLTF9GV0xPR19QQVlMT0FEX1NJWkUgYnl0ZXMgKi8KKwl1aW50OF90IHBheWxvYWRbMF07Cit9IF9fcGFja2VkOworCit0eXBlZGVmIHN0cnVjdCBldmVudF9yZXBvcnRfcyB7CisJdW5zaWduZWQgaW50IGRpYWdfdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBldmVudF9pZDsKKwl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7Cit9IGV2ZW50X3JlcG9ydF90OworCisvKgorICogQ3VzdG9tIGRlYnVnX3ByaW50IGhhbmRsZXJzCisgKiBBcmdzOgorICogbW9kdWxlIElkCisgKiB2YXAgaWQKKyAqIGRlYnVnIG1zZyBpZAorICogVGltZSBzdGFtcAorICogbm8gb2YgYXJndW1lbnRzCisgKiBwb2ludGVyIHRvIHRoZSBidWZmZXIgaG9sZGluZyB0aGUgYXJncworICovCit0eXBlZGVmIEFfQk9PTCAoKm1vZHVsZV9kYmdfcHJpbnQpKEFfVUlOVDMyLCBBX1VJTlQxNiwgQV9VSU5UMzIsCisJCQkJICAgQV9VSU5UMzIsIEFfVUlOVDE2LCBBX1VJTlQzMiAqKTsKKworLyoqIFJlZ2lzdGVyIG1vZHVsZSBzcGVjaWZpYyBkYmcgcHJpbnQqLwordm9pZCBkYmdsb2dfcmVnX21vZHByaW50KEFfVUlOVDMyIG1vZF9pZCwgbW9kdWxlX2RiZ19wcmludCBwcmludGZuKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9EQkdMT0dfQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS91YXBpL2xpbnV4L2RlYnVnX2xpbnV4LmggYi91YXBpL2xpbnV4L2RlYnVnX2xpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjMzU5MAotLS0gL2Rldi9udWxsCisrKyBiL3VhcGkvbGludXgvZGVidWdfbGludXguaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9ERUJVR19MSU5VWF9IXworI2RlZmluZSBfREVCVUdfTElOVVhfSF8KKworLyogbWFjcm8gdG8gcmVtb3ZlIHBhcmVucyAqLworI2RlZmluZSBBVEhfUFJJTlRYX0FSRyhhcmcgLi4uKSBhcmcKKworI2lmZGVmIERFQlVHCisvKiBOT1RFOiB0aGUgQVJfREVCVUdfUFJJTlRGIG1hY3JvIGlzIGRlZmluZWQgaGVyZSB0byBoYW5kbGUgc3BlY2lhbCBoYW5kbGluZyBvZiB2YXJpYWJsZSBhcmcgbWFjcm9zCisgKiB3aGljaCBtYXkgYmUgY29tcGlsZXIgZGVwZW5kZW50LiAqLworI2RlZmluZSBBUl9ERUJVR19QUklOVEYobWFzaywgYXJncykgZG8gewlcCisJCWlmIChHRVRfQVRIX01PRFVMRV9ERUJVR19WQVJfTUFTSyhBVEhfTU9EVUxFX05BTUUpICYgKG1hc2spKSB7CQkJICBcCisJCQlBX0xPR0dFUihtYXNrLCBBVEhfTU9EVUxFX05BTUUsIEFUSF9QUklOVFhfQVJHIGFyZ3MpOwkgXAorCQl9CQkJCQkgICAgIFwKK30gd2hpbGUgKDApCisjZWxzZQorLyogb24gbm9uLWRlYnVnIGJ1aWxkcywga2VlcCBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBpbiB0aGUgZHJpdmVyLCBhbGwgb3RoZXIKKyAqIG1lc3NhZ2UgdHJhY2luZyB3aWxsIGdldCBjb21waWxlZCBvdXQgKi8KKyNkZWZpbmUgQVJfREVCVUdfUFJJTlRGKG1hc2ssIGFyZ3MpIFwKKwlpZiAoKG1hc2spICYgKEFUSF9ERUJVR19FUlIgfCBBVEhfREVCVUdfV0FSTikpIHsgQV9QUklOVEYoQVRIX1BSSU5UWF9BUkcgYXJncyk7IH0KKworI2VuZGlmCisKKyNlbmRpZiAvKiBfREVCVUdfTElOVVhfSF8gKi8KZGlmZiAtLWdpdCBhL3VhcGkvbGludXgvb3NhcGlfbGludXguaCBiL3VhcGkvbGludXgvb3NhcGlfbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQyMGJjCi0tLSAvZGV2L251bGwKKysrIGIvdWFwaS9saW51eC9vc2FwaV9saW51eC5oCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCisgKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGJhc2ljIGF0aGVyb3MgZGF0YSB0eXBlcy4gKi8KKy8qIEl0IGlzIHVzZWQgdG8gbWFwIHRoZSBkYXRhIHR5cGVzIGluIGF0aGVyb3MgZmlsZXMgdG8gYSBwbGF0Zm9ybSBzcGVjaWZpYyAqLworLyogdHlwZS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9PU0FQSV9MSU5VWF9IXworI2RlZmluZSBfT1NBUElfTElOVVhfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxnZW5lcmF0ZWQvYXV0b2NvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKy8qICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+ICovCisjaW5jbHVkZSAiYV90eXBlcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgX19BVFRSSUJfUEFDSyAgICAgICAgICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisjZGVmaW5lIF9fQVRUUklCX1BSSU5URiAgICAgICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKQorI2RlZmluZSBfX0FUVFJJQl9OT1JFVFVSTiAgICAgICBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKQorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgR0NDICovCisjZGVmaW5lIF9fQVRUUklCX1BBQ0sKKyNkZWZpbmUgX19BVFRSSUJfUFJJTlRGCisjZGVmaW5lIF9fQVRUUklCX05PUkVUVVJOCisjZW5kaWYgLyogRW5kIF9fR05VQ19fICovCisKKyNkZWZpbmUgUFJFUEFDSworI2RlZmluZSBQT1NUUEFDSyAgICAgICAgICAgICAgICBfX0FUVFJJQl9QQUNLCisKKyNkZWZpbmUgQV9NRU1DUFkoZHN0LCBzcmMsIGxlbikgICAgICAgICBtZW1jcHkoKEFfVUlOVDggKikoZHN0KSwgKHNyYyksIChsZW4pKQorI2RlZmluZSBBX01FTVpFUk8oYWRkciwgbGVuKSAgICAgICAgICAgIG1lbXNldChhZGRyLCAwLCBsZW4pCisjZGVmaW5lIEFfTUVNU0VUKGFkZHIsIHZhbHVlLCBzaXplKSAgICAgbWVtc2V0KChhZGRyKSwgKHZhbHVlKSwgKHNpemUpKQorI2RlZmluZSBBX01FTUNNUChhZGRyMSwgYWRkcjIsIGxlbikgICAgIG1lbWNtcCgoYWRkcjEpLCAoYWRkcjIpLCAobGVuKSkKKworI2lmIGRlZmluZWQoQU5EUk9JRF9FTlYpICYmIGRlZmluZWQoQ09ORklHX0FORFJPSURfTE9HR0VSKQorZXh0ZXJuIHVuc2lnbmVkIGludCBlbmFibGVsb2djYXQ7CitleHRlcm4gaW50IGFuZHJvaWRfbG9nZ2VyX2x2KHZvaWQgKm1vZHVsZSwgaW50IG1hc2spOworZW51bSBsb2dpZHggeyBMT0dfTUFJTl9JRFggPSAwIH07CitleHRlcm4gaW50IGxvZ2dlcl93cml0ZShjb25zdCBlbnVtIGxvZ2lkeCBpZHgsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyIHByaW8sCisJCQljb25zdCBjaGFyIF9fa2VybmVsICpjb25zdCB0YWcsCisJCQljb25zdCBjaGFyIF9fa2VybmVsICpjb25zdCBmbXQsIC4uLik7CisjZGVmaW5lIEFfQU5EUk9JRF9QUklOVEYobWFzaywgbW9kdWxlLCB0YWdzLCBhcmdzIC4uLikgZG8geyAgXAorCQlpZiAoZW5hYmxlbG9nY2F0KSBcCisJCQlsb2dnZXJfd3JpdGUoTE9HX01BSU5fSURYLCBhbmRyb2lkX2xvZ2dlcl9sdihtb2R1bGUsIG1hc2spLCB0YWdzLCBhcmdzKTsgXAorCQllbHNlIFwKKwkJCXByaW50ayhLRVJOX0FMRVJUIGFyZ3MpOyBcCit9IHdoaWxlICgwKQorI2lmZGVmIERFQlVHCisjZGVmaW5lIEFfTE9HR0VSX01PRFVMRV9OQU1FKHgpICMgeAorI2RlZmluZSBBX0xPR0dFUihtYXNrLCBtb2QsIGFyZ3MgLi4uKSBcCisJQV9BTkRST0lEX1BSSU5URihtYXNrLCAmR0VUX0FUSF9NT0RVTEVfREVCVUdfVkFSX05BTUUobW9kKSwgImFyNmtfIiBBX0xPR0dFUl9NT0RVTEVfTkFNRShtb2QpLCBhcmdzKTsKKyNlbmRpZgorI2RlZmluZSBBX1BSSU5URihhcmdzIC4uLikgQV9BTkRST0lEX1BSSU5URihBVEhfREVCVUdfSU5GTywgTlVMTCwgImFyNmtfZHJpdmVyIiwgYXJncykKKyNlbHNlCisjZGVmaW5lIEFfTE9HR0VSKG1hc2ssIG1vZCwgYXJncyAuLi4pICAgIHByaW50ayhhcmdzKQorI2RlZmluZSBBX1BSSU5URihhcmdzIC4uLikgICAgICAgICAgICAgICBwcmludGsoYXJncykKKyNlbmRpZiAvKiBBTkRST0lEICovCisjZGVmaW5lIEFfUFJJTlRGX0xPRyhhcmdzIC4uLikgICAgICAgICAgIHByaW50ayhhcmdzKQorI2RlZmluZSBBX1NOUFJJTlRGKGJ1ZiwgbGVuLCBhcmdzIC4uLikgICBzbnByaW50ZiAoYnVmLCBsZW4sIGFyZ3MpCisKKy8qCisgKiBUaW1lciBGdW5jdGlvbnMKKyAqLworI2RlZmluZSBBX01TTEVFUChtc2VjcykJCQkJCQkJICAgXAorCXsJCQkJCQkJCQkgICBcCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CQkJCSAgICAgICBcCisJCXNjaGVkdWxlX3RpbWVvdXQoKEhaICogKG1zZWNzKSkgLyAxMDAwKTsJCQkgICAgICAgXAorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwkJCQkgICAgICAgXAorCX0KKwordHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdCBBX1RJTUVSOworCisvKgorICogV2FpdCBRdWV1ZSByZWxhdGVkIGZ1bmN0aW9ucworICovCisjaWZuZGVmIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0CisjZGVmaW5lIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgcmV0KQkJXAorCWRvIHsJCQkJCQkJCQlcCisJCXdhaXRfcXVldWVfdCBfX3dhaXQ7CQkJCQkJXAorCQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsJCQkJXAorCQkJCQkJCQkJXAorCQlhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOwkJCQkJXAorCQlmb3IgKDs7ICkgewkJCQkJCQkgXAorCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsJCQlcCisJCQlpZiAoY29uZGl0aW9uKQkJCQkJCVwKKwkJCQlicmVhazsJCQkJCQlcCisJCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CQkJCVwKKwkJCQlyZXQgPSBzY2hlZHVsZV90aW1lb3V0KHJldCk7CQkJXAorCQkJCWlmICghcmV0KQkJCQkJXAorCQkJCQlicmVhazsJCQkJCVwKKwkJCQljb250aW51ZTsJCQkJCVwKKwkJCX0JCQkJCQkJXAorCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwkJCQkJXAorCQkJYnJlYWs7CQkJCQkJCVwKKwkJfQkJCQkJCQkJXAorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsJCQkJCVwKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgdGltZW91dCkJXAorCSh7CQkJCQkJCQkJXAorCQkgbG9uZyBfX3JldCA9IHRpbWVvdXQ7CQkJCQkJIFwKKwkJIGlmICghKGNvbmRpdGlvbikpCQkJCQkJIFwKKwkJCSBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIF9fcmV0KTsgXAorCQkgX19yZXQ7CQkJCQkJCQkgXAorCSB9KQorI2VuZGlmIC8qIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0ICovCisKKyNpZmRlZiBERUJVRworI2lmZGVmIEFfU0lNT1NfREVWSE9TVAorZXh0ZXJuIHVuc2lnbmVkIGludCBwYW5pY19vbl9hc3NlcnQ7CisjZGVmaW5lIEFfQVNTRVJUKGV4cHIpCVwKKwlpZiAoIShleHByKSkgewkgXAorCQlwcmludGsoS0VSTl9BTEVSVCAiRGVidWcgQXNzZXJ0IENhdWdodCwgRmlsZSAlcywgTGluZTogJWQsIFRlc3Q6JXMgXG4iLF9fRklMRV9fLCBfX0xJTkVfXywjIGV4cHIpOyBcCisJCWlmIChwYW5pY19vbl9hc3NlcnQpIHBhbmljKCMgZXhwcik7CQkJCQkJCQkgIFwKKwl9CisjZWxzZQorI2RlZmluZSBBX0FTU0VSVChleHByKQlcCisJaWYgKCEoZXhwcikpIHsJIFwKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIkRlYnVnIEFzc2VydCBDYXVnaHQsIEZpbGUgJXMsIExpbmU6ICVkLCBUZXN0OiVzIFxuIixfX0ZJTEVfXywgX19MSU5FX18sIyBleHByKTsgXAorCX0KKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgQV9BU1NFUlQoZXhwcikKKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgQU5EUk9JRF9FTlYKK3N0cnVjdCBmaXJtd2FyZTsKK2ludCBhbmRyb2lkX3JlcXVlc3RfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZmlybXdhcmVfcCwKKwkJCSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSk7Cit2b2lkIGFuZHJvaWRfcmVsZWFzZV9maXJtd2FyZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlKTsKKyNkZWZpbmUgQV9SRVFVRVNUX0ZJUk1XQVJFKF9wcGYsIF9wZmlsZSwgX2RldikgYW5kcm9pZF9yZXF1ZXN0X2Zpcm13YXJlKF9wcGYsIF9wZmlsZSwgX2RldikKKyNkZWZpbmUgQV9SRUxFQVNFX0ZJUk1XQVJFKF9wZikgYW5kcm9pZF9yZWxlYXNlX2Zpcm13YXJlKF9wZikKKyNlbHNlCisjZGVmaW5lIEFfUkVRVUVTVF9GSVJNV0FSRShfcHBmLCBfcGZpbGUsIF9kZXYpIHJlcXVlc3RfZmlybXdhcmUoX3BwZiwgX3BmaWxlLCBfZGV2KQorI2RlZmluZSBBX1JFTEVBU0VfRklSTVdBUkUoX3BmKSByZWxlYXNlX2Zpcm13YXJlKF9wZikKKyNlbmRpZgorCisvKgorICogTmV0d29yayBidWZmZXIgcXVldWUgc3VwcG9ydAorICovCit0eXBlZGVmIHN0cnVjdCBza19idWZmX2hlYWQgQV9ORVRCVUZfUVVFVUVfVDsKKworI2RlZmluZSBBX05FVEJVRl9GUkVFKGJ1ZlB0cikgXAorCWFfbmV0YnVmX2ZyZWUoYnVmUHRyKQorI2RlZmluZSBBX05FVEJVRl9MRU4oYnVmUHRyKSBcCisJYV9uZXRidWZfdG9fbGVuKGJ1ZlB0cikKKyNkZWZpbmUgQV9ORVRCVUZfUFVTSChidWZQdHIsIGxlbikgXAorCWFfbmV0YnVmX3B1c2goYnVmUHRyLCBsZW4pCisjZGVmaW5lIEFfTkVUQlVGX1BVVChidWZQdHIsIGxlbikgXAorCWFfbmV0YnVmX3B1dChidWZQdHIsIGxlbikKKyNkZWZpbmUgQV9ORVRCVUZfVFJJTShidWZQdHIsbGVuKSBcCisJYV9uZXRidWZfdHJpbShidWZQdHIsIGxlbikKKyNkZWZpbmUgQV9ORVRCVUZfUFVMTChidWZQdHIsIGxlbikgXAorCWFfbmV0YnVmX3B1bGwoYnVmUHRyLCBsZW4pCisjZGVmaW5lIEFfTkVUQlVGX0hFQURST09NKGJ1ZlB0cikgXAorCWFfbmV0YnVmX2hlYWRyb29tKGJ1ZlB0cikKKyNkZWZpbmUgQV9ORVRCVUZfU0VUTEVOKGJ1ZlB0cixsZW4pIFwKKwlhX25ldGJ1Zl9zZXRsZW4oYnVmUHRyLCBsZW4pCisKKy8qIEFkZCBkYXRhIHRvIGVuZCBvZiBhIGJ1ZmZlciAgKi8KKyNkZWZpbmUgQV9ORVRCVUZfUFVUX0RBVEEoYnVmUHRyLCBzcmNQdHIsICBsZW4pCVwKKwlhX25ldGJ1Zl9wdXRfZGF0YShidWZQdHIsIHNyY1B0ciwgbGVuKQorCisvKiBBZGQgZGF0YSB0byBzdGFydCBvZiB0aGUgIGJ1ZmZlciAqLworI2RlZmluZSBBX05FVEJVRl9QVVNIX0RBVEEoYnVmUHRyLCBzcmNQdHIsICBsZW4pIFwKKwlhX25ldGJ1Zl9wdXNoX2RhdGEoYnVmUHRyLCBzcmNQdHIsIGxlbikKKworLyogUmVtb3ZlIGRhdGEgYXQgc3RhcnQgb2YgdGhlIGJ1ZmZlciAqLworI2RlZmluZSBBX05FVEJVRl9QVUxMX0RBVEEoYnVmUHRyLCBkc3RQdHIsIGxlbikJXAorCWFfbmV0YnVmX3B1bGxfZGF0YShidWZQdHIsIGRzdFB0ciwgbGVuKQorCisvKiBSZW1vdmUgZGF0YSBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworI2RlZmluZSBBX05FVEJVRl9UUklNX0RBVEEoYnVmUHRyLCBkc3RQdHIsIGxlbikJXAorCWFfbmV0YnVmX3RyaW1fZGF0YShidWZQdHIsIGRzdFB0ciwgbGVuKQorCisvKiBWaWV3IGRhdGEgYXMgInNpemUiIGNvbnRpZ3VvdXMgYnl0ZXMgb2YgdHlwZSAidCIgKi8KKyNkZWZpbmUgQV9ORVRCVUZfVklFV19EQVRBKGJ1ZlB0ciwgdCwgc2l6ZSkgXAorCSh0ICkoICgoc3RydWN0IHNrYnVmICopKGJ1ZlB0cikpLT5kYXRhKQorCisvKiByZXR1cm4gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZHJvb20gZm9yIHRoZSBidWZmZXIgKi8KKyNkZWZpbmUgQV9ORVRCVUZfSEVBRChidWZQdHIpIFwKKwkoKCgoc3RydWN0IHNrX2J1ZmYgKikoYnVmUHRyKSktPmhlYWQpKQorCisvKgorICogT1Mgc3BlY2lmaWMgbmV0d29yayBidWZmZXIgYWNjZXNzIHJvdXRpbmVzCisgKi8KK3ZvaWQgYV9uZXRidWZfZnJlZSh2b2lkICpidWZQdHIpOwordm9pZCAqYV9uZXRidWZfdG9fZGF0YSh2b2lkICpidWZQdHIpOworQV9VSU5UMzIgYV9uZXRidWZfdG9fbGVuKHZvaWQgKmJ1ZlB0cik7CitBX1NUQVRVUyBhX25ldGJ1Zl9wdXNoKHZvaWQgKmJ1ZlB0ciwgQV9JTlQzMiBsZW4pOworQV9TVEFUVVMgYV9uZXRidWZfcHVzaF9kYXRhKHZvaWQgKmJ1ZlB0ciwgY2hhciAqc3JjUHRyLCBBX0lOVDMyIGxlbik7CitBX1NUQVRVUyBhX25ldGJ1Zl9wdXQodm9pZCAqYnVmUHRyLCBBX0lOVDMyIGxlbik7CitBX1NUQVRVUyBhX25ldGJ1Zl9wdXRfZGF0YSh2b2lkICpidWZQdHIsIGNoYXIgKnNyY1B0ciwgQV9JTlQzMiBsZW4pOworQV9TVEFUVVMgYV9uZXRidWZfcHVsbCh2b2lkICpidWZQdHIsIEFfSU5UMzIgbGVuKTsKK0FfU1RBVFVTIGFfbmV0YnVmX3B1bGxfZGF0YSh2b2lkICpidWZQdHIsIGNoYXIgKmRzdFB0ciwgQV9JTlQzMiBsZW4pOworQV9TVEFUVVMgYV9uZXRidWZfdHJpbSh2b2lkICpidWZQdHIsIEFfSU5UMzIgbGVuKTsKK0FfU1RBVFVTIGFfbmV0YnVmX3RyaW1fZGF0YSh2b2lkICpidWZQdHIsIGNoYXIgKmRzdFB0ciwgQV9JTlQzMiBsZW4pOworQV9TVEFUVVMgYV9uZXRidWZfc2V0bGVuKHZvaWQgKmJ1ZlB0ciwgQV9JTlQzMiBsZW4pOworQV9JTlQzMiBhX25ldGJ1Zl9oZWFkcm9vbSh2b2lkICpidWZQdHIpOwordm9pZCBhX25ldGJ1Zl9lbnF1ZXVlKEFfTkVUQlVGX1FVRVVFX1QgKnEsIHZvaWQgKnBrdCk7Cit2b2lkIGFfbmV0YnVmX3ByZXF1ZXVlKEFfTkVUQlVGX1FVRVVFX1QgKnEsIHZvaWQgKnBrdCk7Cit2b2lkICphX25ldGJ1Zl9kZXF1ZXVlKEFfTkVUQlVGX1FVRVVFX1QgKnEpOworaW50IGFfbmV0YnVmX3F1ZXVlX3NpemUoQV9ORVRCVUZfUVVFVUVfVCAqcSk7CitpbnQgYV9uZXRidWZfcXVldWVfZW1wdHkoQV9ORVRCVUZfUVVFVUVfVCAqcSk7CitpbnQgYV9uZXRidWZfcXVldWVfZW1wdHkoQV9ORVRCVUZfUVVFVUVfVCAqcSk7Cit2b2lkIGFfbmV0YnVmX3F1ZXVlX2luaXQoQV9ORVRCVUZfUVVFVUVfVCAqcSk7CisKKyNpZmRlZiBRQ0FfUEFSVE5FUl9QTEFURk9STQorI2luY2x1ZGUgImF0aF9jYXJyX3BsdGZybS5oIgorI2VuZGlmIC8qIFFDQV9QQVJUTkVSX1BMQVRGT1JNICovCisKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogX19LRVJORUxfXyAqLworCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgX19BVFRSSUJfUEFDSyAgICAgICAgICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisjZGVmaW5lIF9fQVRUUklCX1BSSU5URiAgICAgICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKQorI2RlZmluZSBfX0FUVFJJQl9OT1JFVFVSTiAgICAgICBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKQorI2lmbmRlZiBJTkxJTkUKKyNkZWZpbmUgSU5MSU5FICAgICAgICAgICAgICAgICAgX19pbmxpbmVfXworI2VuZGlmCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBHQ0MgKi8KKyNkZWZpbmUgX19BVFRSSUJfUEFDSworI2RlZmluZSBfX0FUVFJJQl9QUklOVEYKKyNkZWZpbmUgX19BVFRSSUJfTk9SRVRVUk4KKyNpZm5kZWYgSU5MSU5FCisjZGVmaW5lIElOTElORSAgICAgICAgICAgICAgICAgIF9faW5saW5lCisjZW5kaWYKKyNlbmRpZiAvKiBFbmQgX19HTlVDX18gKi8KKworI2RlZmluZSBQUkVQQUNLCisjZGVmaW5lIFBPU1RQQUNLICAgICAgICAgICAgICAgIF9fQVRUUklCX1BBQ0sKKworI2RlZmluZSBBX01FTUNQWShkc3QsIHNyYywgbGVuKSAgICAgICAgIG1lbWNweSgoZHN0KSwgKHNyYyksIChsZW4pKQorI2RlZmluZSBBX01FTVNFVChhZGRyLCB2YWx1ZSwgc2l6ZSkgICAgIG1lbXNldCgoYWRkciksICh2YWx1ZSksIChzaXplKSkKKyNkZWZpbmUgQV9NRU1aRVJPKGFkZHIsIGxlbikgICAgICAgICAgICBtZW1zZXQoKGFkZHIpLCAwLCAobGVuKSkKKyNkZWZpbmUgQV9NRU1DTVAoYWRkcjEsIGFkZHIyLCBsZW4pICAgICBtZW1jbXAoKGFkZHIxKSwgKGFkZHIyKSwgKGxlbikpCisKKyNpZmRlZiBBTkRST0lECisjaWZuZGVmIGVycgorI2luY2x1ZGUgPGVycm5vLmg+CisjZGVmaW5lIGVycihfcywgYXJncyAuLi4pIGRvIHsgXAorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBsaW5lICVkICIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwkJZnByaW50ZihzdGRlcnIsIGFyZ3MpOyBmcHJpbnRmKHN0ZGVyciwgIjogJWRcbiIsIGVycm5vKTsgXAorCQlleGl0KF9zKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2Vsc2UKKyNpbmNsdWRlIDxlcnIuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX09TQVBJX0xJTlVYX0hfICovCmRpZmYgLS1naXQgYS91YXBpL2xpbnV4L3BrdGxvZ19hY19mbXQuaCBiL3VhcGkvbGludXgvcGt0bG9nX2FjX2ZtdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZTBkM2UKLS0tIC9kZXYvbnVsbAorKysgYi91YXBpL2xpbnV4L3BrdGxvZ19hY19mbXQuaApAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAorICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBSRU1PVkVfUEtUX0xPRworI2lmbmRlZiBfUEtUTE9HX0ZNVF9IXworI2RlZmluZSBfUEtUTE9HX0ZNVF9IXworCisjZGVmaW5lIENVUl9QS1RMT0dfVkVSICAgICAgICAgIDEwMDEwICAgLyogUGFja2V0IGxvZyB2ZXJzaW9uICovCisjZGVmaW5lIFBLVExPR19NQUdJQ19OVU0gICAgICAgIDc3MzUyMjUKKworI2lmZGVmIF9fbGludXhfXworI2RlZmluZSBQS1RMT0dfUFJPQ19ESVIgImF0aF9wa3Rsb2ciCisjZGVmaW5lIFBLVExPR19QUk9DX1NZU1RFTSAic3lzdGVtIgorI2RlZmluZSBXTEFOREVWX0JBU0VOQU1FICJjbGQiCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjcHJhZ21hIHBhY2socHVzaCwgcGt0bG9nX2ZtdCwgMSkKKyNkZWZpbmUgX19BVFRSSUJfUEFDSworI2VsaWYgZGVmaW5lZChfX0VGSV9fKQorI2RlZmluZSBfX0FUVFJJQl9QQUNLCisjZWxzZQorI2lmbmRlZiBfX0FUVFJJQl9QQUNLCisjZGVmaW5lIF9fQVRUUklCX1BBQ0sgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisjZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPGFfdHlwZXMuaD4KKy8qCisgKiBFYWNoIHBhY2tldCBsb2cgZW50cnkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmaXhlZCBsZW5ndGggaGVhZGVyCisgKiBmb2xsb3dlZCBieSB2YXJpYWJsZSBsZW5ndGggbG9nIGluZm9ybWF0aW9uIGRldGVybWluZWQgYnkgbG9nX3R5cGUKKyAqLworCitzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIgeworCXVpbnQxNl90IGZsYWdzOworCXVpbnQxNl90IG1pc3NlZF9jbnQ7CisJdWludDE2X3QgbG9nX3R5cGU7CisJdWludDE2X3Qgc2l6ZTsKKwl1aW50MzJfdCB0aW1lc3RhbXA7CisjaWZkZWYgSEVMSVVNUExVUworCXVpbnQzMl90IHR5cGVfc3BlY2lmaWNfZGF0YTsKKyNlbmRpZgorfSBfX0FUVFJJQl9QQUNLOworCisjZGVmaW5lIEFUSF9QS1RMT0dfSERSX0ZMQUdTX01BU0sgMHhmZmZmCisjZGVmaW5lIEFUSF9QS1RMT0dfSERSX0ZMQUdTX1NISUZUIDAKKyNkZWZpbmUgQVRIX1BLVExPR19IRFJfRkxBR1NfT0ZGU0VUIDAKKyNkZWZpbmUgQVRIX1BLVExPR19IRFJfTUlTU0VEX0NOVF9NQVNLIDB4ZmZmZjAwMDAKKyNkZWZpbmUgQVRIX1BLVExPR19IRFJfTUlTU0VEX0NOVF9TSElGVCAxNgorI2RlZmluZSBBVEhfUEtUTE9HX0hEUl9NSVNTRURfQ05UX09GRlNFVCAwCisjZGVmaW5lIEFUSF9QS1RMT0dfSERSX0xPR19UWVBFX01BU0sgMHhmZmZmCisjZGVmaW5lIEFUSF9QS1RMT0dfSERSX0xPR19UWVBFX1NISUZUIDAKKyNkZWZpbmUgQVRIX1BLVExPR19IRFJfTE9HX1RZUEVfT0ZGU0VUIDEKKyNkZWZpbmUgQVRIX1BLVExPR19IRFJfU0laRV9NQVNLIDB4ZmZmZjAwMDAKKyNkZWZpbmUgQVRIX1BLVExPR19IRFJfU0laRV9TSElGVCAxNgorI2RlZmluZSBBVEhfUEtUTE9HX0hEUl9TSVpFX09GRlNFVCAxCisjZGVmaW5lIEFUSF9QS1RMT0dfSERSX1RJTUVTVEFNUF9PRkZTRVQgMgorI2RlZmluZSBBVEhfUEtUTE9HX0hEUl9UWVBFX1NQRUNJRklDX0RBVEFfT0ZGU0VUIDMKKworLyoqCisgKiBlbnVtIC0gUGt0bG9nIGZsYWcgZmllbGQgZGV0YWlscworICogcGFja2V0IG9yaWdpbiBbMTowXQorICogMDAgLSBMb2NhbAorICogMDEgLSBSZW1vdGUKKyAqIDEwIC0gVW5rbm93bi9Ob3QgYXBwbGljYWJsZQorICogMTEgLSBSZXNlcnZlZAorICogcmVzZXJ2ZWQgWzE1OjJdCisgKi8KK2VudW0geworCVBLVExPR19GTEdfRlJNX1RZUEVfTE9DQUxfUyA9IDAsCisJUEtUTE9HX0ZMR19GUk1fVFlQRV9SRU1PVEVfUywKKwlQS1RMT0dfRkxHX0ZSTV9UWVBFX0NMT05FX1MsCisJUEtUTE9HX0ZMR19GUk1fVFlQRV9DQkZfUywKKwlQS1RMT0dfRkxHX0ZSTV9UWVBFX1VOS05PV05fUworfTsKKworI2RlZmluZSBQSEZMQUdTX0lOVEVSUlVQVF9DT05URVhUIDB4ODAwMDAwMDAKKworLyogTWFza3MgZm9yIHNldHRpbmcgcGt0bG9nIGV2ZW50cyBmaWx0ZXJzICovCisjZGVmaW5lIEFUSF9QS1RMT0dfVFggICAgICAgMHgwMDAwMDAwMDEKKyNkZWZpbmUgQVRIX1BLVExPR19SWCAgICAgICAweDAwMDAwMDAwMgorI2RlZmluZSBBVEhfUEtUTE9HX1JDRklORCAgIDB4MDAwMDAwMDA0CisjZGVmaW5lIEFUSF9QS1RMT0dfUkNVUERBVEUgMHgwMDAwMDAwMDgKKyNkZWZpbmUgQVRIX1BLVExPR19BTkkgICAgICAweDAwMDAwMDAxMAorI2RlZmluZSBBVEhfUEtUTE9HX1RFWFQgICAgIDB4MDAwMDAwMDIwCisjZGVmaW5lIEFUSF9QS1RMT0dfUEhZRVJSICAgMHgwMDAwMDAwNDAKKyNkZWZpbmUgQVRIX1BLVExPR19QUk9NSVNDICAweDAwMDAwMDA4MAorCisvKiBUeXBlcyBvZiBwYWNrZXQgbG9nIGV2ZW50cyAqLworI2RlZmluZSBQS1RMT0dfVFlQRV9UWF9DVFJMICAgICAxCisjZGVmaW5lIFBLVExPR19UWVBFX1RYX1NUQVQgICAgIDIKKyNkZWZpbmUgUEtUTE9HX1RZUEVfVFhfTVNEVV9JRCAgMworI2RlZmluZSBQS1RMT0dfVFlQRV9UWF9GUk1fSERSICA0CisjZGVmaW5lIFBLVExPR19UWVBFX1JYX1NUQVQgICAgIDUKKyNkZWZpbmUgUEtUTE9HX1RZUEVfUkNfRklORCAgICAgNgorI2RlZmluZSBQS1RMT0dfVFlQRV9SQ19VUERBVEUgICA3CisjZGVmaW5lIFBLVExPR19UWVBFX1RYX1ZJUlRfQUREUiA4CisjZGVmaW5lIFBLVExPR19UWVBFX01BWCAgICAgICAgICA5CisKKyNkZWZpbmUgUEtUTE9HX01BWF9UWENUTF9XT1JEUyA1NyAgICAgICAvKiArMiB3b3JkcyBmb3IgYml0bWFwICovCisjZGVmaW5lIFBLVExPR19NQVhfVFhTVEFUVVNfV09SRFMgMzIKKyNkZWZpbmUgUEtUTE9HX01BWF9QUk9UT19XT1JEUyAgMTYKKyNkZWZpbmUgUEtUTE9HX01BWF9SWERFU0NfV09SRFMgNjIKKworc3RydWN0IHR4Y3RsX2ZybV9oZHIgeworCXVpbnQxNl90IGZyYW1lY3RybDsgICAgIC8qIGZyYW1lIGNvbnRyb2wgZmllbGQgZnJvbSBoZWFkZXIgKi8KKwl1aW50MTZfdCBzZXFjdHJsOyAgICAgICAvKiBmcmFtZSBjb250cm9sIGZpZWxkIGZyb20gaGVhZGVyICovCisJdWludDE2X3QgYnNzaWRfdGFpbDsgICAgLyogbGFzdCB0d28gb2N0ZXRzIG9mIGJzc2lkICovCisJdWludDE2X3Qgc2FfdGFpbDsgICAgICAgLyogbGFzdCB0d28gb2N0ZXRzIG9mIFNBICovCisJdWludDE2X3QgZGFfdGFpbDsgICAgICAgLyogbGFzdCB0d28gb2N0ZXRzIG9mIERBICovCisJdWludDE2X3QgcmVzdmQ7Cit9OworCisjaWYgZGVmaW5lZChIRUxJVU1QTFVTKQorLyogUGVyZWdyaW5lIDExYWMgYmFzZWQgKi8KKyNkZWZpbmUgTUFYX1BLVF9JTkZPX01TRFVfSUQgMQorI2Vsc2UKKy8qIFBlcmVncmluZSAxMWFjIGJhc2VkICovCisjZGVmaW5lIE1BWF9QS1RfSU5GT19NU0RVX0lEIDE5MgorI2VuZGlmIC8qIGRlZmluZWQoSEVMSVVNUExVUykgKi8KKworLyoKKyAqIG1zZHVfaWRfaW5mb190IGlzIGRlZmluZWQgZm9yIHJlZmVyZW5jZSBvbmx5CisgKi8KK3N0cnVjdCBtc2R1X2lkX2luZm8geworCXVpbnQzMl90IG51bV9tc2R1OworCXVpbnQ4X3QgYm91bmRfYm1hcFsoTUFYX1BLVF9JTkZPX01TRFVfSUQgKyA3KT4+M107CisJLyogVE9ETzoKKwkqICBDb252ZXJ0IHRoZSBpZCdzIHRvIHVpbnQzMl90CisJKiAgUmVkdWNlcyBjb21wdXRhdGlvbiBpbiB0aGUgZHJpdmVyIGNvZGUKKwkqLworCXVpbnQxNl90IGlkW01BWF9QS1RfSU5GT19NU0RVX0lEXTsKK30gX19BVFRSSUJfUEFDSzsKKyNkZWZpbmUgTVNEVV9JRF9JTkZPX05VTV9NU0RVX09GRlNFVCAwIC8qIGNoYXIgb2Zmc2V0ICovCisjZGVmaW5lIE1TRFVfSURfSU5GT19CT1VORF9CTV9PRkZTRVQgb2Zmc2V0b2Yoc3RydWN0IG1zZHVfaWRfaW5mbywgYm91bmRfYm1hcCkKKyNkZWZpbmUgTVNEVV9JRF9JTkZPX0lEX09GRlNFVCAgb2Zmc2V0b2Yoc3RydWN0IG1zZHVfaWRfaW5mbywgaWQpCisKKworc3RydWN0IGF0aF9wa3Rsb2dfdHhjdGwgeworCXN0cnVjdCBhdGhfcGt0bG9nX2hkciBwbF9oZHI7CisJLyogc3RydWN0IHR4Y3RsX2ZybV9oZHIgZnJtX2hkcjsgKi8KKwl2b2lkICp0eGRlc2NfaGRyX2N0bDsgICAvKiBmcm1faGRyICsgVHggZGVzY3JpcHRvciB3b3JkcyAqLworCXN0cnVjdCB7CisJCXN0cnVjdCB0eGN0bF9mcm1faGRyIGZybV9oZHI7CisJCXVpbnQzMl90IHR4ZGVzY19jdGxbUEtUTE9HX01BWF9UWENUTF9XT1JEU107CisJCS8qIHVpbnQzMl90ICpwcm90b19oZHI7ICAgLyAqIHByb3RvY29sIGhlYWRlciAodmFyaWFibGUgbGVuZ3RoISkgKiAvICovCisJCS8qIHVpbnQzMl90ICptaXNjOyAvICogQ2FuIGJlIHVzZWQgZm9yIEhUIHNwZWNpZmljIG9yIG90aGVyIG1pc2MgaW5mbyAqIC8gKi8KKwl9IHByaXY7Cit9IF9fQVRUUklCX1BBQ0s7CisKK3N0cnVjdCBhdGhfcGt0bG9nX3R4X3N0YXR1cyB7CisJc3RydWN0IGF0aF9wa3Rsb2dfaGRyIHBsX2hkcjsKKwl2b2lkICpkc19zdGF0dXM7CisJaW50MzJfdCBtaXNjWzBdOyAgICAgICAgLyogQ2FuIGJlIHVzZWQgZm9yIEhUIHNwZWNpZmljIG9yIG90aGVyIG1pc2MgaW5mbyAqLworfSBfX0FUVFJJQl9QQUNLOworCitzdHJ1Y3QgYXRoX3BrdGxvZ19tc2R1X2luZm8geworCXN0cnVjdCBhdGhfcGt0bG9nX2hkciBwbF9oZHI7CisJdm9pZCAqYXRoX21zZHVfaW5mbzsKKwlBX1VJTlQzMiBudW1fbXNkdTsKKwlzdHJ1Y3QgeworCQkvKgorCQkgKiBQcm92aXNpb24gdG8gYWRkIG1vcmUgaW5mb3JtYXRpb24gZmllbGRzCisJCSAqLworCQlzdHJ1Y3QgbXNkdV9pbmZvX3QgeworCQkJQV9VSU5UMzIgbnVtX21zZHU7CisJCQlBX1VJTlQ4IGJvdW5kX2JtYXBbTUFYX1BLVF9JTkZPX01TRFVfSUQgPj4gM107CisJCX0gbXNkdV9pZF9pbmZvOworCQkvKgorCQkgKiBhcnJheSBvZiBudW1fbXNkdQorCQkgKiBTdGF0aWMgaW1wbGVtZW50YXRpb24gd2lsbCBjb25zdW1lIHVud2FudGVkIG1lbW9yeQorCQkgKiBOZWVkIHRvIHNwbGl0IHRoZSBwa3Rsb2dfZ2V0X2J1ZiB0byBnZXQgdGhlIGJ1ZmZlciBwb2ludGVyIG9ubHkKKwkJICovCisJCXVpbnQxNl90IG1zZHVfbGVuW01BWF9QS1RfSU5GT19NU0RVX0lEXTsKKwl9IHByaXY7CisJc2l6ZV90IHByaXZfc2l6ZTsKKworfSBfX0FUVFJJQl9QQUNLOworCitzdHJ1Y3QgYXRoX3BrdGxvZ19yeF9pbmZvIHsKKwlzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIgcGxfaGRyOworCXZvaWQgKnJ4X2Rlc2M7Cit9IF9fQVRUUklCX1BBQ0s7CisKK3N0cnVjdCBhdGhfcGt0bG9nX3JjX2ZpbmQgeworCXN0cnVjdCBhdGhfcGt0bG9nX2hkciBwbF9oZHI7CisJdm9pZCAqcmNGaW5kOworfSBfX0FUVFJJQl9QQUNLOworCitzdHJ1Y3QgYXRoX3BrdGxvZ19yY191cGRhdGUgeworCXN0cnVjdCBhdGhfcGt0bG9nX2hkciBwbF9oZHI7CisJdm9pZCAqdHhSYXRlQ3RybDsgICAgICAgLyogcmF0ZSBjb250cm9sIHN0YXRlIHByb3BlciAqLworfSBfX0FUVFJJQl9QQUNLOworCisjaWZkZWYgV0lOMzIKKyNwcmFnbWEgcGFjayhwb3AsIHBrdGxvZ19mbXQpCisjZW5kaWYKKyNpZmRlZiBfX0FUVFJJQl9QQUNLCisjdW5kZWYgX19BVFRSSUJfUEFDSworI2VuZGlmIC8qIF9fQVRUUklCX1BBQ0sgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgaGVhZGVyIGlzIGluY2x1ZGVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUsCisgKiBmb2xsb3dlZCBieSBsb2cgZW50cmllcyB3aGVuIHRoZSBsb2cgYnVmZmVyIGlzIHJlYWQgdGhyb3VnaCBwcm9jZnMKKyAqLworCitzdHJ1Y3QgYXRoX3BrdGxvZ19idWZoZHIgeworCXVpbnQzMl90IG1hZ2ljX251bTsgICAgIC8qIFVzZWQgYnkgcG9zdCBwcm9jZXNzaW5nIHNjcmlwdHMgKi8KKwl1aW50MzJfdCB2ZXJzaW9uOyAgICAgICAvKiBTZXQgdG8gQ1VSX1BLVExPR19WRVIgKi8KK307CisKK3N0cnVjdCBhdGhfcGt0bG9nX2J1ZiB7CisJc3RydWN0IGF0aF9wa3Rsb2dfYnVmaGRyIGJ1ZmhkcjsKKwlpbnQzMl90IHJkX29mZnNldDsKKwl2b2xhdGlsZSBpbnQzMl90IHdyX29mZnNldDsKKwkvKiBXaGVuZXZlciB0aGlzIGJ5dGVzIHdyaXR0ZW4gdmFsdWUgY3Jvc2VzIDRLIGJ5dGVzLAorCSAqIGxvZ2dpbmcgd2lsbCBiZSB0cmlnZ2VyZWQKKwkgKi8KKwlpbnQzMl90IGJ5dGVzX3dyaXR0ZW47CisJLyogSW5kZXggb2YgdGhlIG1lc3NhZ2VzIHNlbnQgdG8gdXNlcnNwYWNlICovCisJdWludDMyX3QgbXNnX2luZGV4OworCS8qIE9mZnNldCBmb3IgcmVhZCAqLworCWxvZmZfdCBvZmZzZXQ7CisJY2hhciBsb2dfZGF0YVswXTsKK307CisKKyNkZWZpbmUgUEtUTE9HX01PVl9SRF9JRFgoX3JkX29mZnNldCwgX2xvZ19idWYsIF9sb2dfc2l6ZSkgIFwKKwlkbyB7IFwKKwkJaWYoKF9yZF9vZmZzZXQgKyBzaXplb2Yoc3RydWN0IGF0aF9wa3Rsb2dfaGRyKSArIFwKKwkJICAgICgoc3RydWN0IGF0aF9wa3Rsb2dfaGRyICopKChfbG9nX2J1ZiktPmxvZ19kYXRhICsgXAorCQkJCQkgICAgICAgKF9yZF9vZmZzZXQpKSktPnNpemUpIDw9IF9sb2dfc2l6ZSkgeyBcCisJCQlfcmRfb2Zmc2V0ID0gKChfcmRfb2Zmc2V0KSArIHNpemVvZihzdHJ1Y3QgYXRoX3BrdGxvZ19oZHIpICsgXAorCQkJCSAgICAgICgoc3RydWN0IGF0aF9wa3Rsb2dfaGRyICopKChfbG9nX2J1ZiktPmxvZ19kYXRhICsJXAorCQkJCQkJCQkgKF9yZF9vZmZzZXQpKSktPnNpemUpOwlcCisJCX0gZWxzZSB7IFwKKwkJCV9yZF9vZmZzZXQgPSAoKHN0cnVjdCBhdGhfcGt0bG9nX2hkciAqKSgoX2xvZ19idWYpLT5sb2dfZGF0YSArCVwKKwkJCQkJCQkJKF9yZF9vZmZzZXQpKSktPnNpemU7ICBcCisJCX0gXAorCQkoX3JkX29mZnNldCkgPSAoKChfbG9nX3NpemUpIC0gKF9yZF9vZmZzZXQpKSA+PQlcCisJCQkJc2l6ZW9mKHN0cnVjdCBhdGhfcGt0bG9nX2hkcikpID8gX3JkX29mZnNldCA6IDA7IFwKKwl9IHdoaWxlKDApCisKKyNlbmRpZiAvKiBfUEtUTE9HX0ZNVF9IXyAqLworI2VuZGlmIC8qIFJFTU9WRV9QS1RfTE9HICovCg==